From e1496b2f0fc4439b3d0494b1ce52ee98a52ea402 Mon Sep 17 00:00:00 2001 From: huangdesheng Date: Wed, 24 Aug 2011 11:00:20 +0800 Subject: [PATCH 001/150] modify UI error in camena DC and DV change --- drivers/video/rk29_fb.c | 22 ++++++++++++++++++++++ include/linux/fb.h | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index d01c6df1991f..f5d8be3261eb 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -270,6 +270,8 @@ static struct wake_lock idlelock; /* only for fb */ static bool has_set_rotate; static u32 last_yuv_phy[2] = {0,0}; #endif +int fb0_first_buff_bits = 32; +int fb0_second_buff_bits = 32; static BLOCKING_NOTIFIER_HEAD(rk29fb_notifier_list); int rk29fb_register_notifier(struct notifier_block *nb) @@ -1439,6 +1441,11 @@ static int fb0_set_par(struct fb_info *info) { case 16: // rgb565 par->format = 1; + if( ypos_virtual == 0) + fb0_first_buff_bits = 16; + else + fb0_second_buff_bits = 16; + //fix->line_length = 2 * xres_virtual; fix->line_length = (inf->fb0_color_deepth ? 4:2) * xres_virtual; //32bit and 16bit change @@ -1452,6 +1459,10 @@ static int fb0_set_par(struct fb_info *info) case 32: // rgb888 default: par->format = 0; + if( ypos_virtual == 0) + fb0_first_buff_bits = 32; + else + fb0_second_buff_bits = 32; fix->line_length = 4 * xres_virtual; #ifdef CONFIG_FB_SCALING_OSD dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*4; @@ -1648,6 +1659,17 @@ static int fb0_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) inf->fb0_color_deepth = arg; break; + case FBIOGET_16OR32: + return inf->fb0_color_deepth; + case FBIOGET_IDLEFBUff_16OR32: + if(info->var.yoffset == 0) + { + return fb0_second_buff_bits; + } + else + { + return fb0_first_buff_bits; + } case FBIOPUT_FBPHYADD: return info->fix.smem_start; case FBIOGET_OVERLAY_STATE: diff --git a/include/linux/fb.h b/include/linux/fb.h index 6181f1baafa7..4463d75862ea 100755 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -47,7 +47,8 @@ struct dentry; #define FBIOGET_DISPINFO 0x4618 #define FBIOGET_OVERLAY_STATE 0X4619 #define FBIOGET_SCREEN_STATE 0X4620 - +#define FBIOGET_16OR32 0X4621 +#define FBIOGET_IDLEFBUff_16OR32 0X4622 #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ #define FB_TYPE_PLANES 1 /* Non interleaved planes */ From 2ba2167c600a4561251f3a6afc9e414e0501e75f Mon Sep 17 00:00:00 2001 From: xbw Date: Wed, 24 Aug 2011 11:17:06 +0800 Subject: [PATCH 002/150] Modify some abnormal when sdmmc-driver happen to meet suddenness --- drivers/mmc/host/rk29_sdmmc.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 678096f6f1df..c8c42ffde1e6 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.01 The last modify date is 2011-08-19,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.04 The last modify date is 2011-08-24,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -269,7 +269,7 @@ ssize_t rk29_sdmmc_progress_store(struct kobject *kobj, struct kobj_attribute *a if( !strncmp(buf,"version" , strlen("version"))) { - printk("The driver SDMMC named 'rk29_sdmmc.c' is %s. ====xbw====\n", RK29_SDMMC_VERSION); + printk("\n The driver SDMMC named 'rk29_sdmmc.c' is %s. ==xbw==\n", RK29_SDMMC_VERSION); return count; } @@ -741,6 +741,10 @@ static void send_stop_cmd(struct rk29_sdmmc *host) host->stopcmd.mrq = NULL; host->stopcmd.retries = 0; host->stopcmd.error = 0; + if(host->mrq && host->mrq->stop) + { + host->mrq->stop->error = 0; + } host->cmdr = rk29_sdmmc_prepare_command(&host->stopcmd); rk29_sdmmc_start_command(host, &host->stopcmd, host->cmdr); @@ -1132,6 +1136,7 @@ static void rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *dat { host->data = data; data->error = 0; + host->cmd->data = data; data->bytes_xfered = 0; host->pbuf = (u32*)sg_virt(data->sg); @@ -1719,6 +1724,7 @@ static int rk29_sdmmc_start_request(struct mmc_host *mmc ) mrq = host->mrq; cmd = mrq->cmd; cmd->error = 0; + cmd->data = NULL; host->cmdr = cmdr; host->cmd = cmd; @@ -1813,6 +1819,7 @@ static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq) printk("%s..%d.. ==== The %s had been closed by myself for the experiment. ====xbw[%s]===\n",\ __FUNCTION__, __LINE__, host->dma_name, host->dma_name); + host->state = STATE_IDLE; spin_unlock_irqrestore(&host->lock, iflags); mmc_request_done(mmc, mrq); goto request_ext;//return; @@ -1857,9 +1864,10 @@ static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq) printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 3==xbw[%s]==\n", \ __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name); } + host->old_cmd = mrq->cmd->opcode; } } - + host->state = STATE_IDLE; spin_unlock_irqrestore(&host->lock, iflags); mmc_request_done(mmc, mrq); goto request_ext;//return; @@ -2204,6 +2212,7 @@ static void rk29_sdmmc_request_end(struct rk29_sdmmc *host, struct mmc_command * printk("%s..%d......CMD=%d error!!!, arg=%x, errorTimes=%d, errorStep=0x%x ! ====xbw[%s]====\n",\ __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->error_times,host->errorstep, host->dma_name); } + cmd->error = -ENODATA; } exit: @@ -2499,8 +2508,11 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) host->state = STATE_IDLE; spin_unlock(&host->lock); - - mmc_request_done(host->mmc, host->mrq); + + if(host->mrq) + { + mmc_request_done(host->mmc, host->mrq); + } } @@ -2798,6 +2810,8 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) host->error_times = 0; host->state = STATE_IDLE; host->complete_done = 0; + host->mrq = NULL; + host->new_mrq = NULL; #ifdef CONFIG_PM host->gpio_det = pdata->detect_irq; From 90325a734f85c0742b256e63fc7316af85975573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B1=E5=BB=BA=E6=96=8C?= Date: Wed, 24 Aug 2011 01:44:32 +0800 Subject: [PATCH 003/150] rk29_phone: 1.fix headset drive timecallback a bug 2.wm8994 add single and differential Choose --- arch/arm/mach-rk29/board-rk29-a22.c | 3 ++- arch/arm/mach-rk29/board-rk29-phonesdk.c | 2 ++ drivers/headset_observe/rk_headset.c | 1 - sound/soc/codecs/wm8994.c | 22 ++++++++++++---------- sound/soc/codecs/wm8994.h | 4 ++++ 5 files changed, 20 insertions(+), 12 deletions(-) mode change 100644 => 100755 sound/soc/codecs/wm8994.c diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c index 6c656d0d9dad..0bf00da5fdff 100755 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -1435,7 +1435,8 @@ struct platform_device rk29_device_gps = { * author: qjb@rock-chips.com *****************************************************************************************/ struct wm8994_pdata wm8994_platdata = { - + .BB_input_diff = 0, + .phone_pad = 0, .PA_control_pin = RK29_PIN6_PD3, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 9ef1e20c7985..c3a27e27b792 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -1513,6 +1513,8 @@ struct platform_device rk29_device_gps = { * author: qjb@rock-chips.com *****************************************************************************************/ struct wm8994_pdata wm8994_platdata = { + .BB_input_diff = 0, + .phone_pad = 0, .PA_control_pin = 0, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/drivers/headset_observe/rk_headset.c b/drivers/headset_observe/rk_headset.c index f71aac53ff44..22f2222a451b 100755 --- a/drivers/headset_observe/rk_headset.c +++ b/drivers/headset_observe/rk_headset.c @@ -229,7 +229,6 @@ static void headsetobserve_work(struct work_struct *work) } headset_info->cur_headset_status = ~(BIT_HEADSET|BIT_HEADSET_NO_MIC); headset_change_irqtype(HEADSET,IRQF_TRIGGER_FALLING);// - disable_irq(headset_info->irq[HOOK]); } break; default: diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c old mode 100644 new mode 100755 index afa63c857142..b74e22408b0c --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -129,6 +129,7 @@ unsigned short BT_vol_table[16] ={0x01DB,0x01DC,0x01DD,0x01DE,0x01DF,0x01E0, struct wm8994_priv { struct mutex io_lock; struct mutex route_lock; + int route_status;//Because the time callback cannot use mutex int sysclk; int mclk; int fmt;//master or salve @@ -199,12 +200,10 @@ int wm8994_set_status(void) { struct wm8994_priv *wm8994 = wm8994_codec->private_data; int ret = 1; - mutex_lock(&wm8994->route_lock); - if(wm8994->work_type == SNDRV_PCM_TRIGGER_SUSPEND) - ret = -2; - - mutex_unlock(&wm8994->route_lock); + if(wm8994->route_status != IDLE) + ret = -BUSY; + return ret; } EXPORT_SYMBOL_GPL(wm8994_set_status); @@ -1687,7 +1686,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, wake_lock(&wm8994->wm8994_on_wake); mutex_lock(&wm8994->route_lock); wm8994->kcontrol.private_value = route;//save rount - + wm8994->route_status = BUSY; //before set the route -- disable PA switch(route) { @@ -1697,7 +1696,6 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, PA_ctrl(GPIO_LOW); break; } - printk("%s,route=%d\n",__FUNCTION__,route); //set rount switch(route) { @@ -1776,7 +1774,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, } if(wm8994->RW_status == ERROR) - {//Failure to read or write, will re-power on wm8994 + {//Failure to read or write, will reset wm8994 cancel_delayed_work_sync(&wm8994->wm8994_delayed_work); wm8994->work_type = SNDRV_PCM_TRIGGER_PAUSE_PUSH; schedule_delayed_work(&wm8994->wm8994_delayed_work, msecs_to_jiffies(10)); @@ -1793,7 +1791,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, case SPEAKER_RINGTONE: case SPEAKER_INCALL: case EARPIECE_RINGTONE: - case HEADSET_RINGTONE: + case HEADSET_RINGTONE: msleep(50); PA_ctrl(GPIO_HIGH); break; @@ -1808,6 +1806,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, break; } out: + wm8994->route_status = IDLE; mutex_unlock(&wm8994->route_lock); wake_unlock(&wm8994->wm8994_on_wake); return 0; @@ -2044,12 +2043,14 @@ static void wm8994_work_fun(struct work_struct *work) return; // DBG("wm8994 shutdown\n"); mutex_lock(&wm8994->route_lock); + wm8994->route_status = BUSY; PA_ctrl(GPIO_LOW); msleep(50); wm8994_write(0,0); msleep(50); wm8994_write(0x01, 0x0033); wm8994_current_mode = null;//Automatically re-set the wake-up time + wm8994->route_status = IDLE; mutex_unlock(&wm8994->route_lock); break; case SNDRV_PCM_TRIGGER_START: @@ -2135,7 +2136,7 @@ static int wm8994_suspend(struct platform_device *pdev, pm_message_t state) return 0; DBG("%s----%d\n",__FUNCTION__,__LINE__); - wm8994->work_type = SNDRV_PCM_TRIGGER_SUSPEND; + wm8994->route_status = SUSPEND; PA_ctrl(GPIO_LOW); wm8994_write(0x00, 0x00); @@ -2553,6 +2554,7 @@ static int wm8994_i2c_probe(struct i2c_client *i2c, wm8994->playback_active = 0; wm8994->call_vol = call_maxvol; wm8994->BT_call_vol = BT_call_maxvol; + wm8994->route_status = POWER_ON; INIT_DELAYED_WORK(&wm8994->wm8994_delayed_work, wm8994_work_fun); mutex_init(&wm8994->io_lock); mutex_init(&wm8994->route_lock); diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h index ebf3a6115b5d..f0f3922d3bb4 100755 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h @@ -43,4 +43,8 @@ extern int Headset_isMic(void); #define ERROR 1 #define TRUE 0 +#define SUSPEND 3 +#define POWER_ON 2 +#define BUSY 1 +#define IDLE 0 #endif From 0503172f07e017a559ce0b1334653b84474aba5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 24 Aug 2011 11:28:40 +0800 Subject: [PATCH 004/150] pack-kernel.sh: fix for new release --- pack-kernel.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pack-kernel.sh b/pack-kernel.sh index 83462cecc1f3..b6cc914406e5 100755 --- a/pack-kernel.sh +++ b/pack-kernel.sh @@ -5,8 +5,7 @@ FILES=( # arch arch/arm/mach-rk29/clock.c arch/arm/mach-rk29/ddr.c -arch/arm/mach-rk29/vpu.c -arch/arm/mach-rk29/vpu_mem.c +arch/arm/mach-rk29/vpu*.c drivers/staging/rk29/ipp/rk29-ipp.c sound/soc/codecs/rt5625.c @@ -46,12 +45,15 @@ arch/arm/configs/rk29_FIH_defconfig arch/arm/mach-rk29/board-rk29-newton* arch/arm/configs/rk29_newton_defconfig + +arch/arm/mach-rk29/board-rk29-p91* +arch/arm/configs/rk29_p91_defconfig ) # --------------------------------------------------------------------------- usage() { echo usage: $0 kerneldir defconfig - echo example: $0 . rk29_sdk_defconfig + echo example: $0 . rk29_ddr3sdk_defconfig exit } @@ -67,7 +69,7 @@ kerndir=${1-.} kerndir=$(cd $kerndir; pwd) # get absolute path [ -d $kerndir ] || usage -defconfig=${2-rk29_sdk_defconfig} +defconfig=${2-rk29_ddr3sdk_defconfig} if [ "$defconfig" = ".config" ]; then [ -f $kerndir/.config ] || usage else From 5356536863351b4f915b7c5611e3824ae38c18e3 Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 23 Aug 2011 19:57:16 -0700 Subject: [PATCH 005/150] newton: improve irda FIR driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.修改FIR帧长度上报机制,如果收到多个帧,上报方式由原来的frame1+frame2+...修改为每次只报一个帧的长度 --- drivers/net/irda/ir_serial.c | 92 +++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 18 deletions(-) diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index 2ab7e5add672..09d9965eee5a 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -27,16 +27,30 @@ #include "bu92725guw.h" #include "ir_serial.h" + +#define MAX_FRAME_NUM 20 +struct rev_frame_length { + unsigned long frame_length[MAX_FRAME_NUM]; + int iRead; + int iWrite; + int iCount; +}; + +#define frame_read_empty(f) ((f)->iCount == 0) +#define frame_write_full(f) ((f)->iCount == MAX_FRAME_NUM) +#define frame_length_buf_clear(f) ((f)->iCount = (f)->iWrite = (f)->iRead = 0) + struct bu92747_port { struct device *dev; struct irda_info *pdata; struct uart_port port; /*for FIR fream read*/ - unsigned long last_frame_length; + struct rev_frame_length rev_frames; + //unsigned long last_frame_length; unsigned long cur_frame_length; - wait_queue_head_t data_ready_wq; - atomic_t data_ready; + //wait_queue_head_t data_ready_wq; + //atomic_t data_ready; spinlock_t data_lock; int tx_empty; /* last TX empty bit */ @@ -75,6 +89,37 @@ static u8 g_receive_buf[BU92725GUW_FIFO_SIZE]; #define BU92747_IRDA_DBG(x...) #endif +static int add_frame_length(struct rev_frame_length *f, unsigned long length) +{ + if (frame_write_full(f)) + return -1; + + f->frame_length[f->iWrite] = length; + printk("add one frame, length=%d\n", f->frame_length[f->iWrite]); + f->iCount++; + printk("now frame iCount=%d\n", f->iCount); + f->iWrite = (f->iWrite+1) % MAX_FRAME_NUM; + printk("now frame iWrite=%d\n", f->iWrite); + + + return 0; +} + +static int get_frame_length(struct rev_frame_length *f, unsigned long *length) +{ + if (frame_read_empty(f)) + return -1; + + *length = f->frame_length[f->iRead]; + printk("read one frame, length=%d\n", *length); + f->iCount--; + printk("now frame iCount=%d\n", f->iCount); + f->iRead = (f->iRead+1) % MAX_FRAME_NUM; + printk("now frame iRead=%d\n", f->iRead); + + return 0; +} + static int bu92747_irda_do_rx(struct bu92747_port *s) { int i; @@ -171,6 +216,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) struct bu92747_port *s = dev_id; u32 irq_src = 0; unsigned long len; + struct rev_frame_length *f = &(s->rev_frames); dev_dbg(s->dev, "%s\n", __func__); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); @@ -193,20 +239,25 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) len = bu92747_irda_do_rx(s); if (!IS_FIR(s)) tty_flip_buffer_push(s->port.state->port.tty); - else + else { spin_lock(&s->data_lock); s->cur_frame_length += len; spin_unlock(&s->data_lock); + } } if ((irq_src & REG_INT_EOF) && (s->port.state->port.tty != NULL)) { tty_flip_buffer_push(s->port.state->port.tty); if (IS_FIR(s)) { spin_lock(&s->data_lock); - s->last_frame_length += s->cur_frame_length; - s->cur_frame_length = 0; - atomic_set(&(s->data_ready), 1); - wake_up(&(s->data_ready_wq) ); + if (add_frame_length(f, s->cur_frame_length) == 0) { + s->cur_frame_length = 0; + //atomic_set(&(s->data_ready), 1); + //wake_up(&(s->data_ready_wq) ); + } + else { + printk("line %d: FIR frame length buf full......\n", __LINE__); + } spin_unlock(&s->data_lock); } } @@ -337,6 +388,7 @@ static void bu92747_irda_shutdown(struct uart_port *port) BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); dev_dbg(s->dev, "%s\n", __func__); + struct rev_frame_length *f = &(s->rev_frames); if (s->suspending) return; @@ -350,8 +402,8 @@ static void bu92747_irda_shutdown(struct uart_port *port) } spin_lock(&s->data_lock); - atomic_set(&(s->data_ready), 0); - s->last_frame_length = 0; + //atomic_set(&(s->data_ready), 0); + frame_length_buf_clear(f); s->cur_frame_length = 0; spin_unlock(&s->data_lock); @@ -370,6 +422,7 @@ static int bu92747_irda_startup(struct uart_port *port) struct bu92747_port, port); char b[32]; + struct rev_frame_length *f = &(s->rev_frames); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); dev_dbg(s->dev, "%s\n", __func__); @@ -378,7 +431,7 @@ static int bu92747_irda_startup(struct uart_port *port) s->rx_enabled = 1; spin_lock(&s->data_lock); - s->last_frame_length = 0; + frame_length_buf_clear(f); s->cur_frame_length = 0; spin_unlock(&s->data_lock); @@ -396,7 +449,7 @@ static int bu92747_irda_startup(struct uart_port *port) } INIT_WORK(&s->work, bu92747_irda_work); - atomic_set(&(s->data_ready), 0); + //atomic_set(&(s->data_ready), 0); if (request_irq(s->irq, bu92747_irda_irq, IRQ_TYPE_LEVEL_LOW, "bu92747_irda", s) < 0) { @@ -504,7 +557,9 @@ bu92747_irda_set_termios(struct uart_port *port, struct ktermios *termios, static int bu92747_get_frame_length(struct bu92747_port *s) { - unsigned long len; + struct rev_frame_length *f = &(s->rev_frames); + unsigned long len = 0; +#if 0 wait_event_interruptible_timeout(s->data_ready_wq, atomic_read(&(s->data_ready) ), msecs_to_jiffies(1000) ); @@ -512,11 +567,12 @@ static int bu92747_get_frame_length(struct bu92747_port *s) printk("waiting 'data_ready_wq' timed out."); return -1; } - +#endif spin_lock(&s->data_lock); - len = s->last_frame_length; - s->last_frame_length = 0; - atomic_set(&(s->data_ready), 0); + if (get_frame_length(f, &len) != 0) { + printk("line %d: FIR data not ready......\n", __LINE__); + //atomic_set(&(s->data_ready), 0); + } spin_unlock(&s->data_lock); return len; @@ -649,7 +705,7 @@ static int __devinit bu92747_irda_probe(struct platform_device *pdev) if (bu92747s[i]->pdata->irda_pwr_ctl) bu92747s[i]->pdata->irda_pwr_ctl(0); - init_waitqueue_head(&(bu92747s[i]->data_ready_wq)); + //init_waitqueue_head(&(bu92747s[i]->data_ready_wq)); spin_lock_init(&(bu92747s[i]->data_lock)); From 604812762e96468a85e2df38e37fa1ea0f09f77a Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 23 Aug 2011 23:26:42 -0700 Subject: [PATCH 006/150] rk29 vmac: add timeout for waiting for mdio complete --- drivers/net/rk29_vmac.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/net/rk29_vmac.c b/drivers/net/rk29_vmac.c index 0f04f92fc076..561b7928179f 100755 --- a/drivers/net/rk29_vmac.c +++ b/drivers/net/rk29_vmac.c @@ -95,7 +95,8 @@ static void vmac_mdio_xmit(struct vmac_priv *ap, unsigned val) { init_completion(&ap->mdio_complete); vmac_writel(ap, val, MDIO_DATA); - wait_for_completion(&ap->mdio_complete); + if(!wait_for_completion_timeout(&ap->mdio_complete, msecs_to_jiffies(1000))) + printk("Time out for waiting mdio completion\n"); } static int vmac_mdio_read(struct mii_bus *bus, int phy_id, int phy_reg) @@ -1219,6 +1220,7 @@ static void rk29_init_vmac(struct net_device *dev) /* enable, after all other bits are set */ vmac_writel(ap, temp | EN_MASK, CONTROL); + } static void rk29_vmac_shutdown(struct net_device *dev) @@ -1614,6 +1616,9 @@ rk29_vmac_suspend(struct device *dev) if (ndev) { if (netif_running(ndev)) { + if (ndev->irq) + disable_irq(ndev->irq); + netif_stop_queue(ndev); netif_device_detach(ndev); rk29_vmac_shutdown(ndev); } @@ -1631,6 +1636,9 @@ rk29_vmac_resume(struct device *dev) if (netif_running(ndev)) { rk29_init_vmac(ndev); netif_device_attach(ndev); + netif_start_queue(ndev); + if (ndev->irq) + enable_irq(ndev->irq); } } return 0; From 32973882220c7453ea676644bc44469c32de88a8 Mon Sep 17 00:00:00 2001 From: eddie Date: Wed, 24 Aug 2011 15:57:27 +0800 Subject: [PATCH 007/150] newton:add ft5406 and gt819 early suspend --- drivers/input/touchscreen/ft5406_ts.c | 31 +++++++++++++++------------ drivers/input/touchscreen/gt819.c | 26 +++++++++++++++++----- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/drivers/input/touchscreen/ft5406_ts.c b/drivers/input/touchscreen/ft5406_ts.c index 51317a5c769c..d36cfbceb55e 100755 --- a/drivers/input/touchscreen/ft5406_ts.c +++ b/drivers/input/touchscreen/ft5406_ts.c @@ -59,10 +59,8 @@ #include /* ddl@rock-chips.com : camera support */ #include #include -#ifdef CONFIG_HAS_EARLYSUSPEND #include -static struct early_suspend ft5406_early_suspend; -#endif +static struct early_suspend ft5406_power; @@ -676,6 +674,17 @@ static int ft5406_resume(struct i2c_client *client) return 0; } +static void ft5406_suspend_early(struct early_suspend *h) +{ + dev_info(&this_client->dev, "ft5406_suspend_early!\n"); + ft5406_suspend(this_client,PMSG_SUSPEND); +} + +static void ft5406_resume_early(struct early_suspend *h) +{ + dev_info(&this_client->dev, "ft5406_resume_early!\n"); + ft5406_resume(this_client); +} static int __devexit ft5406_remove(struct i2c_client *client) { struct ft5x0x_ts_data *ft5x0x_ts = i2c_get_clientdata(client); @@ -686,9 +695,7 @@ static int __devexit ft5406_remove(struct i2c_client *client) cancel_work_sync(&ft5x0x_ts->pen_event_work); destroy_workqueue(ft5x0x_ts->ts_workqueue); i2c_set_clientdata(client, NULL); -#ifdef CONFIG_HAS_EARLYSUSPEND - unregister_early_suspend(&ft5406_early_suspend); -#endif + unregister_early_suspend(&ft5406_power); this_client = NULL; return 0; } @@ -836,12 +843,10 @@ static int ft5406_probe(struct i2c_client *client ,const struct i2c_device_id * } i2c_set_clientdata(client, ft5x0x_ts); -#if 0//def CONFIG_HAS_EARLYSUSPEND - ft5406_early_suspend.suspend =ft5406_ts_suspend; - ft5406_early_suspend.resume =ft5406_ts_resume; - ft5406_early_suspend.level = 0x2; - register_early_suspend(&ft5406_early_suspend); -#endif + ft5406_power.suspend =ft5406_suspend_early; + ft5406_power.resume =ft5406_resume_early; + ft5406_power.level = 0x2; + register_early_suspend(&ft5406_power); buf_w[0] = 6; err = ft5406_set_regs(client,0x88,buf_w,1); @@ -884,8 +889,6 @@ static struct i2c_driver ft5406_driver = { }, .id_table = ft5406_idtable, .probe = ft5406_probe, - .suspend = ft5406_suspend, - .resume = ft5406_resume, .remove = __devexit_p(ft5406_remove), }; diff --git a/drivers/input/touchscreen/gt819.c b/drivers/input/touchscreen/gt819.c index e8d40f7b4f7d..0705c6c333a6 100755 --- a/drivers/input/touchscreen/gt819.c +++ b/drivers/input/touchscreen/gt819.c @@ -98,6 +98,7 @@ unsigned int crc32_table[256]; unsigned int oldcrc32 = 0xFFFFFFFF; unsigned int ulPolynomial = 0x04c11db7; struct i2c_client * i2c_connect_client = NULL; +static struct early_suspend gt819_power; static u8 gt819_fw[]= { #include "gt819_fw.i" @@ -555,6 +556,17 @@ static int gt819_resume(struct i2c_client *client) return 0; } +static void gt819_early_suspend(struct early_suspend *h) +{ + dev_info(&i2c_connect_client->dev, "gt819_early_suspend!\n"); + gt819_suspend(i2c_connect_client,PMSG_SUSPEND); +} + +static void gt819_early_resume(struct early_suspend *h) +{ + dev_info(&i2c_connect_client->dev, "gt819_resume_early!\n"); + gt819_resume(i2c_connect_client); +} /******************************************************* Description: @@ -573,14 +585,16 @@ static int gt819_remove(struct i2c_client *client) remove_proc_entry("goodix-update", NULL); #endif //goodix_debug_sysfs_deinit(); - gpio_direction_input(ts->irq_gpio); - gpio_free(ts->irq_gpio); - free_irq(client->irq, ts); + gpio_direction_input(ts->irq_gpio); + gpio_free(ts->irq_gpio); + free_irq(client->irq, ts); if(ts->goodix_wq) destroy_workqueue(ts->goodix_wq); dev_notice(&client->dev,"The driver is removing...\n"); i2c_set_clientdata(client, NULL); input_unregister_device(ts->input_dev); + unregister_early_suspend(>819_power); + i2c_connect_client = 0; kfree(ts); return 0; } @@ -726,6 +740,10 @@ static int gt819_probe(struct i2c_client *client, const struct i2c_device_id *id } i2c_set_clientdata(client, ts); + gt819_power.suspend = gt819_early_suspend; + gt819_power.resume = gt819_early_resume; + gt819_power.level = 0x2; + register_early_suspend(>819_power); return 0; i2c_set_clientdata(client, NULL); input_unregister_device(ts->input_dev); @@ -754,8 +772,6 @@ static const struct i2c_device_id gt819_id[] = { static struct i2c_driver gt819_driver = { .probe = gt819_probe, .remove = gt819_remove, - .suspend = gt819_suspend, - .resume = gt819_resume, .id_table = gt819_id, .driver = { .name = GOODIX_I2C_NAME, From a1e816a6472c580bf18a178164361c0ba7b78b1c Mon Sep 17 00:00:00 2001 From: eddie Date: Wed, 24 Aug 2011 15:57:51 +0800 Subject: [PATCH 008/150] newton:add newton keys --- drivers/input/keyboard/Kconfig | 7 + drivers/input/keyboard/Makefile | 5 +- drivers/input/keyboard/rk29_newton_keys.c | 401 ++++++++++++++++++++++ 3 files changed, 411 insertions(+), 2 deletions(-) mode change 100755 => 100644 drivers/input/keyboard/Kconfig mode change 100755 => 100644 drivers/input/keyboard/Makefile create mode 100644 drivers/input/keyboard/rk29_newton_keys.c diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig old mode 100755 new mode 100644 index 85a3493615aa..3dee66eebc5a --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -18,6 +18,13 @@ config KEYS_RK29 help rk29 keyboard drivers(gpio and adc) +config KEYS_RK29_NEWTON + tristate "rk29 newton keyboard" + depends on ARCH_RK29 + default y + help + rk29 newton keyboard drivers(gpio and adc) + config SYNAPTICS_SO340010 tristate "Synaptics So340010 TouchPad KEY" depends on I2C diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile old mode 100755 new mode 100644 index 0354fb555e09..c8f3a15d1a0e --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile @@ -4,7 +4,8 @@ # Each configuration option enables a list of files. -obj-$(CONFIG_KEYS_RK29) += rk29_keys.o +obj-$(CONFIG_KEYS_RK29) += rk29_keys.o +obj-$(CONFIG_KEYS_RK29_NEWTON) += rk29_newton_keys.o obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o obj-$(CONFIG_KEYBOARD_ADP5588) += adp5588-keys.o obj-$(CONFIG_KEYBOARD_AMIGA) += amikbd.o @@ -14,7 +15,7 @@ obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o obj-$(CONFIG_KEYBOARD_EP93XX) += ep93xx_keypad.o obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o -obj-$(CONFIG_KEYBOARD_WM831X_GPIO) += wm831x_gpio_keys.o +obj-$(CONFIG_KEYBOARD_WM831X_GPIO) += wm831x_gpio_keys.o obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o diff --git a/drivers/input/keyboard/rk29_newton_keys.c b/drivers/input/keyboard/rk29_newton_keys.c new file mode 100644 index 000000000000..6bc444931bb5 --- /dev/null +++ b/drivers/input/keyboard/rk29_newton_keys.c @@ -0,0 +1,401 @@ +/* + * Driver for keys on GPIO lines capable of generating interrupts. + * + * Copyright 2005 Phil Blundell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define EMPTY_ADVALUE 950 +#define DRIFT_ADVALUE 70 +#define INVALID_ADVALUE 10 + + +#if 0 +#define key_dbg(bdata, format, arg...) \ + dev_printk(KERN_INFO , &bdata->input->dev , format , ## arg) +#else +#define key_dbg(bdata, format, arg...) +#endif + +struct rk29_button_data { + int state; + int long_press_count; + struct rk29_keys_button *button; + struct input_dev *input; + struct timer_list timer; +}; + +struct rk29_keys_drvdata { + int nbuttons; + int result; + struct input_dev *input; + struct adc_client *client; + struct timer_list timer; + struct rk29_button_data data[0]; +}; + +static struct input_dev *input_dev; +static struct early_suspend newton_key_power; +static int suspend = 0; +void rk29_send_power_key(int state) +{ + if (!input_dev) + return; + if(state) + { + input_report_key(input_dev, KEY_POWER, 1); + input_sync(input_dev); + } + else + { + input_report_key(input_dev, KEY_POWER, 0); + input_sync(input_dev); + } +} + +void rk28_send_wakeup_key(void) +{ + if (!input_dev) + return; + + input_report_key(input_dev, KEY_WAKEUP, 1); + input_sync(input_dev); + input_report_key(input_dev, KEY_WAKEUP, 0); + input_sync(input_dev); +} + +static void keys_long_press_timer(unsigned long _data) +{ + int state; + struct rk29_button_data *bdata = (struct rk29_button_data *)_data; + struct rk29_keys_button *button = bdata->button; + struct input_dev *input = bdata->input; + unsigned int type = EV_KEY; + if(button->gpio != INVALID_GPIO ) + state = !!((gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low); + else + state = !!button->adc_state; + if(state) { + if(bdata->long_press_count != 0) { + if(bdata->long_press_count % (LONG_PRESS_COUNT+ONE_SEC_COUNT) == 0){ + key_dbg(bdata, "%skey[%s]: report ev[%d] state[0]\n", + (button->gpio == INVALID_GPIO)?"ad":"io", button->desc, button->code_long_press); + input_event(input, type, button->code_long_press, 0); + input_sync(input); + } + else if(bdata->long_press_count%LONG_PRESS_COUNT == 0) { + key_dbg(bdata, "%skey[%s]: report ev[%d] state[1]\n", + (button->gpio == INVALID_GPIO)?"ad":"io", button->desc, button->code_long_press); + input_event(input, type, button->code_long_press, 1); + input_sync(input); + } + } + bdata->long_press_count++; + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(DEFAULT_DEBOUNCE_INTERVAL)); + } + else { + if(bdata->long_press_count <= LONG_PRESS_COUNT) { + bdata->long_press_count = 0; + key_dbg(bdata, "%skey[%s]: report ev[%d] state[1], report ev[%d] state[0]\n", + (button->gpio == INVALID_GPIO)?"ad":"io", button->desc, button->code, button->code); + input_event(input, type, button->code, 1); + input_sync(input); + input_event(input, type, button->code, 0); + input_sync(input); + } + else if(bdata->state != state) { + key_dbg(bdata, "%skey[%s]: report ev[%d] state[0]\n", + (button->gpio == INVALID_GPIO)?"ad":"io", button->desc, button->code_long_press); + input_event(input, type, button->code_long_press, 0); + input_sync(input); + } + } + bdata->state = state; +} +static void keys_timer(unsigned long _data) +{ + int state; + struct rk29_button_data *bdata = (struct rk29_button_data *)_data; + struct rk29_keys_button *button = bdata->button; + struct input_dev *input = bdata->input; + unsigned int type = EV_KEY; + + if((suspend)&&(!button->wakeup)) + return; + if(button->gpio != INVALID_GPIO) + state = !!((gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low); + else + state = !!button->adc_state; + if(bdata->state != state) { + bdata->state = state; + key_dbg(bdata, "%skey[%s]: report ev[%d] state[%d]\n", + (button->gpio == INVALID_GPIO)?"ad":"io", button->desc, button->code, bdata->state); + input_event(input, type, button->code, bdata->state); + input_sync(input); + } + if(state) + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(DEFAULT_DEBOUNCE_INTERVAL)); +} + +static irqreturn_t keys_isr(int irq, void *dev_id) +{ + struct rk29_button_data *bdata = dev_id; + struct rk29_keys_button *button = bdata->button; + BUG_ON(irq != gpio_to_irq(button->gpio)); + bdata->long_press_count = 0; + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(DEFAULT_DEBOUNCE_INTERVAL)); + return IRQ_HANDLED; +} + +static int keys_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; + int i; + + if (device_may_wakeup(&pdev->dev)) { + for (i = 0; i < pdata->nbuttons; i++) { + struct rk29_keys_button *button = &pdata->buttons[i]; + int irq = gpio_to_irq(button->gpio); + enable_irq_wake(irq); + } + } + suspend = 1; + return 0; +} + +static int keys_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; + int i; + + if (device_may_wakeup(&pdev->dev)) { + for (i = 0; i < pdata->nbuttons; i++) { + struct rk29_keys_button *button = &pdata->buttons[i]; + if (button->wakeup) { + int irq = gpio_to_irq(button->gpio); + disable_irq_wake(irq); + } + } + } + suspend = 0; + return 0; +} + +static void newton_key_early_suspend(struct early_suspend *h) +{ + dev_info(&input_dev->dev, "newton_key_early_suspend!\n"); + keys_suspend(&input_dev->dev); +} + +static void newton_key_last_resume(struct early_suspend *h) +{ + dev_info(&input_dev->dev, "newton_key_last_resume!\n"); + keys_resume(&input_dev->dev); +} + +static int __devinit keys_probe(struct platform_device *pdev) +{ + struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; + struct rk29_keys_drvdata *ddata; + struct input_dev *input; + int i, error = 0; + int wakeup = 0; + + if(!pdata) + return -EINVAL; + + ddata = kzalloc(sizeof(struct rk29_keys_drvdata) + + pdata->nbuttons * sizeof(struct rk29_button_data), + GFP_KERNEL); + input = input_allocate_device(); + if (!ddata || !input) { + error = -ENOMEM; + goto fail0; + } + + platform_set_drvdata(pdev, ddata); + + input->name = pdev->name; + input->phys = "gpio-keys/input0"; + input->dev.parent = &pdev->dev; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + /* Enable auto repeat feature of Linux input subsystem */ + if (pdata->rep) + __set_bit(EV_REP, input->evbit); + ddata->nbuttons = pdata->nbuttons; + ddata->input = input; + + for (i = 0; i < pdata->nbuttons; i++) { + struct rk29_keys_button *button = &pdata->buttons[i]; + struct rk29_button_data *bdata = &ddata->data[i]; + int irq; + unsigned int type = EV_KEY; + + bdata->input = input; + bdata->button = button; + if(button->code_long_press) + setup_timer(&bdata->timer, + keys_long_press_timer, (unsigned long)bdata); + else if(button->code) + setup_timer(&bdata->timer, + keys_timer, (unsigned long)bdata); + if(button->gpio != INVALID_GPIO) { + error = gpio_request(button->gpio, button->desc ?: "keys"); + if (error < 0) { + pr_err("gpio-keys: failed to request GPIO %d," + " error %d\n", button->gpio, error); + goto fail2; + } + + error = gpio_direction_input(button->gpio); + if (error < 0) { + pr_err("gpio-keys: failed to configure input" + " direction for GPIO %d, error %d\n", + button->gpio, error); + gpio_free(button->gpio); + goto fail2; + } + irq = gpio_to_irq(button->gpio); + if (irq < 0) { + error = irq; + pr_err("gpio-keys: Unable to get irq number" + " for GPIO %d, error %d\n", + button->gpio, error); + gpio_free(button->gpio); + goto fail2; + } + + error = request_irq(irq, keys_isr, + (button->active_low)?IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING, + button->desc ? button->desc : "keys", + bdata); + if (error) { + pr_err("gpio-keys: Unable to claim irq %d; error %d\n", + irq, error); + gpio_free(button->gpio); + goto fail2; + } + } + if (button->wakeup) + wakeup = 1; + + input_set_capability(input, type, button->code); + } + + input_set_capability(input, EV_KEY, KEY_WAKEUP); + + error = input_register_device(input); + if (error) { + pr_err("gpio-keys: Unable to register input device, " + "error: %d\n", error); + goto fail2; + } + + device_init_wakeup(&pdev->dev, wakeup); + + input_dev = input; + + newton_key_power.suspend = newton_key_early_suspend; + newton_key_power.resume = newton_key_last_resume; + newton_key_power.level = 0x2; + register_early_suspend(&newton_key_power); + return error; + + fail2: + while (--i >= 0) { + free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]); + del_timer_sync(&ddata->data[i].timer); + gpio_free(pdata->buttons[i].gpio); + } + platform_set_drvdata(pdev, NULL); + fail0: + input_free_device(input); + kfree(ddata); + + return error; +} + +static int __devexit keys_remove(struct platform_device *pdev) +{ + struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; + struct rk29_keys_drvdata *ddata = platform_get_drvdata(pdev); + struct input_dev *input = ddata->input; + int i; + + input_dev = NULL; + device_init_wakeup(&pdev->dev, 0); + + for (i = 0; i < pdata->nbuttons; i++) { + int irq = gpio_to_irq(pdata->buttons[i].gpio); + free_irq(irq, &ddata->data[i]); + del_timer_sync(&ddata->data[i].timer); + gpio_free(pdata->buttons[i].gpio); + } + if(pdata->chn >= 0 && ddata->client); + adc_unregister(ddata->client); + input_unregister_device(input); + + return 0; +} + + + +static struct platform_driver keys_device_driver = { + .probe = keys_probe, + .remove = __devexit_p(keys_remove), + .driver = { + .name = "rk29-keypad", + .owner = THIS_MODULE, + } +}; + +static int __init keys_init(void) +{ + return platform_driver_register(&keys_device_driver); +} + +static void __exit keys_exit(void) +{ + platform_driver_unregister(&keys_device_driver); +} + +module_init(keys_init); +module_exit(keys_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Phil Blundell "); +MODULE_DESCRIPTION("Keyboard driver for CPU GPIOs"); +MODULE_ALIAS("platform:gpio-keys"); From 01ecc096b433cfab3258c2aad22f70de17ac37f4 Mon Sep 17 00:00:00 2001 From: eddie Date: Wed, 24 Aug 2011 16:02:09 +0800 Subject: [PATCH 009/150] newton:add newton backlight --- arch/arm/mach-rk29/board-rk29-newton-key.c | 64 +--- arch/arm/mach-rk29/board-rk29-newton.c | 15 +- drivers/video/backlight/Kconfig | 7 + drivers/video/backlight/Makefile | 1 + .../video/backlight/rk29_newton_backlight.c | 276 ++++++++++++++++++ 5 files changed, 300 insertions(+), 63 deletions(-) mode change 100755 => 100644 arch/arm/mach-rk29/board-rk29-newton-key.c mode change 100755 => 100644 arch/arm/mach-rk29/board-rk29-newton.c create mode 100644 drivers/video/backlight/rk29_newton_backlight.c diff --git a/arch/arm/mach-rk29/board-rk29-newton-key.c b/arch/arm/mach-rk29/board-rk29-newton-key.c old mode 100755 new mode 100644 index 03bdc73e006d..7470cb2bf330 --- a/arch/arm/mach-rk29/board-rk29-newton-key.c +++ b/arch/arm/mach-rk29/board-rk29-newton-key.c @@ -14,97 +14,43 @@ static struct rk29_keys_button key_button[] = { .code = EV_MENU, .gpio = RK29_PIN6_PA3, // PA0--> PA3: home -> menu .active_low = PRESS_LEV_LOW, + .wakeup = 0, }, { .desc = "vol+", .code = KEY_VOLUMEUP, .gpio = RK29_PIN6_PA2, .active_low = PRESS_LEV_LOW, + .wakeup = 0, }, { .desc = "vol-", .code = KEY_VOLUMEDOWN, .gpio = RK29_PIN6_PA1, .active_low = PRESS_LEV_LOW, + .wakeup = 0, }, { .desc = "home", .code = KEY_HOME, .gpio = RK29_PIN6_PA5, //PA3 --> PA5 .active_low = PRESS_LEV_LOW, - }, - { - .desc = "search", - .code = KEY_SEARCH, - .gpio = RK29_PIN6_PA4, - .active_low = PRESS_LEV_LOW, + .wakeup = 0, }, { .desc = "esc", .code = KEY_BACK, .gpio = RK29_PIN6_PA0, //PA5-->PA0: menu-> esc .active_low = PRESS_LEV_LOW, - }, - { - .desc = "sensor", - .code = KEY_CAMERA, - .gpio = RK29_PIN6_PA6, - .active_low = PRESS_LEV_LOW, + .wakeup = 0, }, { .desc = "play", .code = KEY_POWER, .gpio = RK29_PIN6_PA7, .active_low = PRESS_LEV_LOW, - //.code_long_press = EV_ENCALL, .wakeup = 1, }, -#if 0 - { - .desc = "vol+", - .code = KEY_VOLUMEDOWN, - .adc_value = 95, - .gpio = INVALID_GPIO, - .active_low = PRESS_LEV_LOW, - }, - { - .desc = "vol-", - .code = KEY_VOLUMEUP, - .adc_value = 249, - .gpio = INVALID_GPIO, - .active_low = PRESS_LEV_LOW, - }, - { - .desc = "menu", - .code = EV_MENU, - .adc_value = 406, - .gpio = INVALID_GPIO, - .active_low = PRESS_LEV_LOW, - }, - { - .desc = "home", - .code = KEY_HOME, - .code_long_press = KEY_F4, - .adc_value = 561, - .gpio = INVALID_GPIO, - .active_low = PRESS_LEV_LOW, - }, - { - .desc = "esc", - .code = KEY_ESC, - .adc_value = 726, - .gpio = INVALID_GPIO, - .active_low = PRESS_LEV_LOW, - }, - { - .desc = "adkey6", - .code = KEY_BACK, - .code_long_press = EV_ENCALL, - .adc_value = 899, - .gpio = INVALID_GPIO, - .active_low = PRESS_LEV_LOW, - }, -#endif }; struct rk29_keys_platform_data rk29_keys_pdata = { .buttons = key_button, diff --git a/arch/arm/mach-rk29/board-rk29-newton.c b/arch/arm/mach-rk29/board-rk29-newton.c old mode 100755 new mode 100644 index 3e1f48ba76cc..5001fd78c257 --- a/arch/arm/mach-rk29/board-rk29-newton.c +++ b/arch/arm/mach-rk29/board-rk29-newton.c @@ -1230,7 +1230,7 @@ static struct rk29camera_platform_ioctl_cb sensor_ioctl_cb = { * backlight devices * author: nzy@rock-chips.com *****************************************************************************************/ -#ifdef CONFIG_BACKLIGHT_RK29_BL +#ifdef CONFIG_BACKLIGHT_RK29_NEWTON_BL /* GPIO1B5_PWM0_NAME, GPIO1L_PWM0 GPIO5D2_PWM1_UART1SIRIN_NAME, GPIO5H_PWM1 @@ -1324,6 +1324,13 @@ struct rk29_bl_info rk29_bl_info = { .pwm_resume = rk29_backlight_pwm_resume, .min_brightness = BACKLIGHT_MINVALUE, }; +struct platform_device rk29_device_backlight = { + .name = "rk29_backlight", + .id = -1, + .dev = { + .platform_data = &rk29_bl_info, + } +}; #endif /***************************************************************************************** * pwm voltage regulator devices @@ -1685,7 +1692,7 @@ static struct platform_device rk29_device_gpu = { }; #endif -#ifdef CONFIG_KEYS_RK29 +#ifdef CONFIG_KEYS_RK29_NEWTON extern struct rk29_keys_platform_data rk29_keys_pdata; static struct platform_device rk29_device_keys = { .name = "rk29-keypad", @@ -1854,7 +1861,7 @@ static struct platform_device *devices[] __initdata = { &rk29_device_iis_8ch, #endif -#ifdef CONFIG_KEYS_RK29 +#ifdef CONFIG_KEYS_RK29_NEWTON &rk29_device_keys, #endif #ifdef CONFIG_SDMMC0_RK29 @@ -1884,7 +1891,7 @@ static struct platform_device *devices[] __initdata = { &rk29_device_fb, &rk29_device_dma_cpy, #endif -#ifdef CONFIG_BACKLIGHT_RK29_BL +#ifdef CONFIG_BACKLIGHT_RK29_NEWTON_BL &rk29_device_backlight, #endif #ifdef CONFIG_RK29_VMAC diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 8ecc980c7faa..28fda05ef926 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -276,6 +276,13 @@ config BACKLIGHT_RK29_BL help rk29 backlight support. +config BACKLIGHT_RK29_NEWTON_BL + bool "rk29 newton backlight driver" + depends on BACKLIGHT_CLASS_DEVICE && ARCH_RK29 + default y + help + rk29 newton backlight support. + config FIH_TOUCHKEY_LED bool "fih touch key led driver" depends on BACKLIGHT_CLASS_DEVICE && ARCH_RK29 diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 54235006d719..892787099223 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -30,6 +30,7 @@ obj-$(CONFIG_BACKLIGHT_ADX) += adx_bl.o obj-$(CONFIG_BACKLIGHT_ADP5520) += adp5520_bl.o obj-$(CONFIG_BACKLIGHT_RK2818_BL) += rk2818_backlight.o obj-$(CONFIG_BACKLIGHT_RK29_BL) += rk29_backlight.o +obj-$(CONFIG_BACKLIGHT_RK29_NEWTON_BL) += rk29_newton_backlight.o obj-$(CONFIG_BACKLIGHT_AW9364) += aw9364_bl.o obj-$(CONFIG_FIH_TOUCHKEY_LED) += fih_touchkey_led.o obj-$(CONFIG_BUTTON_LIGHT) += rk29_buttonlight.o diff --git a/drivers/video/backlight/rk29_newton_backlight.c b/drivers/video/backlight/rk29_newton_backlight.c new file mode 100644 index 000000000000..39dd024abfa8 --- /dev/null +++ b/drivers/video/backlight/rk29_newton_backlight.c @@ -0,0 +1,276 @@ +/* drivers/video/backlight/rk29_backlight.c + * + * Copyright (C) 2009-2011 Rockchip Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "rk2818_backlight.h" + +/* + * Debug + */ +#if 0 +#define DBG(x...) printk(KERN_INFO x) +#else +#define DBG(x...) +#endif + + +#define write_pwm_reg(id, addr, val) __raw_writel(val, addr+(RK29_PWM_BASE+id*0x10)) +#define read_pwm_reg(id, addr) __raw_readl(addr+(RK29_PWM_BASE+id*0x10)) + +static struct clk *pwm_clk; +static struct backlight_device *rk29_bl; +static int suspend_flag = 0; + +static int rk29_bl_update_status(struct backlight_device *bl) +{ + u32 divh,div_total; + struct rk29_bl_info *rk29_bl_info = bl_get_data(bl); + u32 id = rk29_bl_info->pwm_id; + u32 ref = rk29_bl_info->bl_ref; + + if (suspend_flag) + return 0; + + if (bl->props.brightness < rk29_bl_info->min_brightness) /*avoid can't view screen when close backlight*/ + bl->props.brightness = rk29_bl_info->min_brightness; + + div_total = read_pwm_reg(id, PWM_REG_LRC); + if (ref) { + divh = div_total*(bl->props.brightness)/BL_STEP; + } else { + divh = div_total*(BL_STEP-bl->props.brightness)/BL_STEP; + } + write_pwm_reg(id, PWM_REG_HRC, divh); + + DBG(">>>%s-->%d brightness = %d, div_total = %d, divh = %d\n",__FUNCTION__,__LINE__,bl->props.brightness, div_total, divh); + return 0; +} + +static int rk29_bl_get_brightness(struct backlight_device *bl) +{ + u32 divh,div_total; + struct rk29_bl_info *rk29_bl_info = bl_get_data(bl); + u32 id = rk29_bl_info->pwm_id; + u32 ref = rk29_bl_info->bl_ref; + + div_total = read_pwm_reg(id, PWM_REG_LRC); + divh = read_pwm_reg(id, PWM_REG_HRC); + + if (!div_total) + return 0; + + if (ref) { + return BL_STEP*divh/div_total; + } else { + return BL_STEP-(BL_STEP*divh/div_total); + } +} + +static struct backlight_ops rk29_bl_ops = { + .update_status = rk29_bl_update_status, + .get_brightness = rk29_bl_get_brightness, +}; + +static void rk29_backlight_work_func(struct work_struct *work) +{ + suspend_flag = 0; + rk29_bl_update_status(rk29_bl); +} +static DECLARE_DELAYED_WORK(rk29_backlight_work, rk29_backlight_work_func); + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void rk29_bl_suspend(struct early_suspend *h) +{ + struct rk29_bl_info *rk29_bl_info = bl_get_data(rk29_bl); + int brightness = rk29_bl->props.brightness; + + cancel_delayed_work_sync(&rk29_backlight_work); + + if (rk29_bl->props.brightness) { + rk29_bl->props.brightness = 0; + rk29_bl_update_status(rk29_bl); + rk29_bl->props.brightness = brightness; + } + + if (!suspend_flag) { + clk_disable(pwm_clk); + if (rk29_bl_info->pwm_suspend) + rk29_bl_info->pwm_suspend(); + } + + suspend_flag = 1; +} + +static void rk29_bl_resume(struct early_suspend *h) +{ + struct rk29_bl_info *rk29_bl_info = bl_get_data(rk29_bl); + DBG("%s : %s\n", __FILE__, __FUNCTION__); + + if (rk29_bl_info->pwm_resume) + rk29_bl_info->pwm_resume(); + + clk_enable(pwm_clk); + + schedule_delayed_work(&rk29_backlight_work, msecs_to_jiffies(rk29_bl_info->delay_ms)); +} + +static struct early_suspend bl_early_suspend = { + .suspend = rk29_bl_suspend, + .resume = rk29_bl_resume, + .level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 1, +}; +#endif + +static int rk29_backlight_probe(struct platform_device *pdev) +{ + int ret = 0; + struct rk29_bl_info *rk29_bl_info = pdev->dev.platform_data; + u32 id = rk29_bl_info->pwm_id; + u32 divh, div_total; + unsigned long pwm_clk_rate; + + if (rk29_bl) { + DBG(KERN_CRIT "%s: backlight device register has existed \n", + __func__); + return -EEXIST; + } + + if (!rk29_bl_info->delay_ms) + rk29_bl_info->delay_ms = 100; + + if (rk29_bl_info->min_brightness < 0 || rk29_bl_info->min_brightness > BL_STEP) + rk29_bl_info->min_brightness = 52; + + if (rk29_bl_info && rk29_bl_info->io_init) { + rk29_bl_info->io_init(); + } + + rk29_bl = backlight_device_register("rk28_bl", &pdev->dev, rk29_bl_info, &rk29_bl_ops); + if (!rk29_bl) { + DBG(KERN_CRIT "%s: backlight device register error\n", + __func__); + return -ENODEV; + } + + pwm_clk = clk_get(NULL, "pwm"); + if (IS_ERR(pwm_clk)) { + printk(KERN_ERR "failed to get pwm clock source\n"); + return -ENODEV; + } + pwm_clk_rate = clk_get_rate(pwm_clk); + div_total = pwm_clk_rate / PWM_APB_PRE_DIV; + + div_total >>= (1 + (PWM_DIV >> 9)); + div_total = (div_total) ? div_total : 1; + + if(rk29_bl_info->bl_ref) { + divh = 0; + } else { + divh = div_total; + } + + clk_enable(pwm_clk); + write_pwm_reg(id, PWM_REG_CTRL, PWM_DIV|PWM_RESET); + write_pwm_reg(id, PWM_REG_LRC, div_total); + write_pwm_reg(id, PWM_REG_HRC, divh); + write_pwm_reg(id, PWM_REG_CNTR, 0x0); + write_pwm_reg(id, PWM_REG_CTRL, PWM_DIV|PWM_ENABLE|PWM_TIME_EN); + + rk29_bl->props.power = FB_BLANK_UNBLANK; + rk29_bl->props.fb_blank = FB_BLANK_UNBLANK; + rk29_bl->props.max_brightness = BL_STEP; + rk29_bl->props.brightness = BL_STEP / 2; + + if (rk29_bl_info && rk29_bl_info->pwm_resume) { + rk29_bl_info->pwm_resume(); + } + + schedule_delayed_work(&rk29_backlight_work, msecs_to_jiffies(rk29_bl_info->delay_ms)); + + register_early_suspend(&bl_early_suspend); + + printk("RK29 Backlight Driver Initialized.\n"); + return ret; +} + +static int rk29_backlight_remove(struct platform_device *pdev) +{ + struct rk29_bl_info *rk29_bl_info = pdev->dev.platform_data; + + if (rk29_bl) { + backlight_device_unregister(rk29_bl); + unregister_early_suspend(&bl_early_suspend); + clk_disable(pwm_clk); + clk_put(pwm_clk); + if (rk29_bl_info && rk29_bl_info->io_deinit) { + rk29_bl_info->io_deinit(); + } + return 0; + } else { + DBG(KERN_CRIT "%s: no backlight device has registered\n", + __func__); + return -ENODEV; + } +} + +static void rk29_backlight_shutdown(struct platform_device *pdev) +{ + struct rk29_bl_info *rk29_bl_info = pdev->dev.platform_data; + + rk29_bl->props.brightness >>= 1; + rk29_bl_update_status(rk29_bl); + mdelay(100); + + rk29_bl->props.brightness >>= 1; + rk29_bl_update_status(rk29_bl); + mdelay(100); + + rk29_bl->props.brightness = 0; + rk29_bl_update_status(rk29_bl); + + if (rk29_bl_info && rk29_bl_info->io_deinit) + rk29_bl_info->io_deinit(); +} + +static struct platform_driver rk29_backlight_driver = { + .probe = rk29_backlight_probe, + .remove = rk29_backlight_remove, + .driver = { + .name = "rk29_backlight", + .owner = THIS_MODULE, + }, + .shutdown = rk29_backlight_shutdown, +}; + +static int __init rk29_backlight_init(void) +{ + platform_driver_register(&rk29_backlight_driver); + return 0; +} +fs_initcall_sync(rk29_backlight_init); From 7238dc05681bb8d7b959aeb8366015989f8a5084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 24 Aug 2011 17:09:32 +0800 Subject: [PATCH 010/150] rk29: timer: disable write buffer sometime, rk29_timer_set_next_event may take long time (10ms ~ 40ms) to finish because of write buffer. --- arch/arm/mach-rk29/timer.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-rk29/timer.c b/arch/arm/mach-rk29/timer.c index c390129d268f..a0d0596832c4 100644 --- a/arch/arm/mach-rk29/timer.c +++ b/arch/arm/mach-rk29/timer.c @@ -35,13 +35,15 @@ #define TIMER_ENABLE 3 #define TIMER_ENABLE_FREE_RUNNING 5 +#define timer_writel(v, addr) do { writel(v, addr); readl(addr); } while (0) + #if 1 /* by default, use periph sync timer */ -#define RK_TIMER_ENABLE(n) writel(TIMER_ENABLE, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_CONTROL_REG) -#define RK_TIMER_ENABLE_FREE_RUNNING(n) writel(TIMER_ENABLE_FREE_RUNNING, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_CONTROL_REG) -#define RK_TIMER_DISABLE(n) writel(TIMER_DISABLE, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_CONTROL_REG) +#define RK_TIMER_ENABLE(n) timer_writel(TIMER_ENABLE, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_CONTROL_REG) +#define RK_TIMER_ENABLE_FREE_RUNNING(n) timer_writel(TIMER_ENABLE_FREE_RUNNING, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_CONTROL_REG) +#define RK_TIMER_DISABLE(n) timer_writel(TIMER_DISABLE, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_CONTROL_REG) -#define RK_TIMER_SETCOUNT(n, count) writel(count, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_LOAD_COUNT) +#define RK_TIMER_SETCOUNT(n, count) timer_writel(count, RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_LOAD_COUNT) #define RK_TIMER_GETCOUNT(n) readl(RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_LOAD_COUNT) #define RK_TIMER_READVALUE(n) readl(RK29_TIMER2_BASE + 0x4000 * (n - 2) + TIMER_CUR_VALUE) @@ -59,11 +61,11 @@ #else -#define RK_TIMER_ENABLE(n) writel(TIMER_ENABLE, RK29_TIMER0_BASE + 0x2000 * n + TIMER_CONTROL_REG) -#define RK_TIMER_ENABLE_FREE_RUNNING(n) writel(TIMER_ENABLE_FREE_RUNNING, RK29_TIMER0_BASE + 0x2000 * n + TIMER_CONTROL_REG) -#define RK_TIMER_DISABLE(n) writel(TIMER_DISABLE, RK29_TIMER0_BASE + 0x2000 * n + TIMER_CONTROL_REG) +#define RK_TIMER_ENABLE(n) timer_writel(TIMER_ENABLE, RK29_TIMER0_BASE + 0x2000 * n + TIMER_CONTROL_REG) +#define RK_TIMER_ENABLE_FREE_RUNNING(n) timer_writel(TIMER_ENABLE_FREE_RUNNING, RK29_TIMER0_BASE + 0x2000 * n + TIMER_CONTROL_REG) +#define RK_TIMER_DISABLE(n) timer_writel(TIMER_DISABLE, RK29_TIMER0_BASE + 0x2000 * n + TIMER_CONTROL_REG) -#define RK_TIMER_SETCOUNT(n, count) writel(count, RK29_TIMER0_BASE + 0x2000 * n + TIMER_LOAD_COUNT) +#define RK_TIMER_SETCOUNT(n, count) timer_writel(count, RK29_TIMER0_BASE + 0x2000 * n + TIMER_LOAD_COUNT) #define RK_TIMER_GETCOUNT(n) readl(RK29_TIMER0_BASE + 0x2000 * n + TIMER_LOAD_COUNT) #define RK_TIMER_READVALUE(n) readl(RK29_TIMER0_BASE + 0x2000 * n + TIMER_CUR_VALUE) From 4777c18c246372f4cf03a92ab6c00f83b21b6ca3 Mon Sep 17 00:00:00 2001 From: eddie Date: Wed, 24 Aug 2011 17:43:35 +0800 Subject: [PATCH 011/150] remove newton default --- drivers/input/keyboard/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index 3dee66eebc5a..e453b1be9937 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig @@ -21,7 +21,6 @@ config KEYS_RK29 config KEYS_RK29_NEWTON tristate "rk29 newton keyboard" depends on ARCH_RK29 - default y help rk29 newton keyboard drivers(gpio and adc) From d632c24a4222f46255c4d235f2b74a3170432db6 Mon Sep 17 00:00:00 2001 From: eddie Date: Wed, 24 Aug 2011 17:48:26 +0800 Subject: [PATCH 012/150] newton: remove backlight default --- drivers/video/backlight/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 28fda05ef926..f284fd52fc90 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -279,7 +279,6 @@ config BACKLIGHT_RK29_BL config BACKLIGHT_RK29_NEWTON_BL bool "rk29 newton backlight driver" depends on BACKLIGHT_CLASS_DEVICE && ARCH_RK29 - default y help rk29 newton backlight support. From 463135e91d2ea835d23f0807f248528edf2d19f7 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 25 Aug 2011 12:42:26 +0800 Subject: [PATCH 013/150] A22: enable bt_mac = wifi_mac + 1 config --- arch/arm/configs/rk29_a22_defconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 arch/arm/configs/rk29_a22_defconfig diff --git a/arch/arm/configs/rk29_a22_defconfig b/arch/arm/configs/rk29_a22_defconfig old mode 100644 new mode 100755 index 89156bb831a1..4e8016e58c4d --- a/arch/arm/configs/rk29_a22_defconfig +++ b/arch/arm/configs/rk29_a22_defconfig @@ -492,8 +492,8 @@ CONFIG_BT_HCIUART_H4=y # CONFIG_BT_HCIVHCI is not set # CONFIG_BT_MRVL is not set CONFIG_BT_HCIBCM4325=y -CONFIG_IDBLOCK=y -# CONFIG_WIFI_MAC is not set +# CONFIG_IDBLOCK is not set +CONFIG_WIFI_MAC=y # CONFIG_AF_RXRPC is not set CONFIG_WIRELESS=y # CONFIG_CFG80211 is not set From fed295aa8e0d81a9272382c8d178d721abb04671 Mon Sep 17 00:00:00 2001 From: zwp Date: Wed, 24 Aug 2011 21:02:25 -0700 Subject: [PATCH 014/150] phone-pad:modify lcd screen width and height to fix android input method problem. --- drivers/video/display/screen/lcd_hsd07pfw1.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/video/display/screen/lcd_hsd07pfw1.c b/drivers/video/display/screen/lcd_hsd07pfw1.c index 20686a796876..631b1a7eb81a 100755 --- a/drivers/video/display/screen/lcd_hsd07pfw1.c +++ b/drivers/video/display/screen/lcd_hsd07pfw1.c @@ -26,8 +26,8 @@ #define V_VD 600 #define V_FP 0 -#define LCD_WIDTH 1024 -#define LCD_HEIGHT 600 +#define LCD_WIDTH 154//1024 +#define LCD_HEIGHT 91//600 /* Other */ #define DCLK_POL 0 #define SWAP_RB 0 From cd487f814e64dd6b9f6f2dec13cad92c6724029a Mon Sep 17 00:00:00 2001 From: zwp Date: Wed, 24 Aug 2011 23:23:16 -0700 Subject: [PATCH 015/150] phone-pad:add hdmi 5v power control. --- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk29/board-rk29phonepadsdk.c diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c old mode 100644 new mode 100755 index bd2b09d482e9..31e349525b60 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -670,7 +670,7 @@ static struct mpu3050_platform_data mpu3050_data = { //.orientation = { 0, -1, 0,-1, 0, 0,0, 0, -1 }, //.orientation = { 0, 1, 0,1, 0, 0,0, 0, -1 }, - .orientation = { -1, 0, 0, 0, -1, 0, 0, 0, 1 }, + .orientation = { 0, -1, 0, 1, 0, 0, 0, 0, 1 }, //.orientation = { 0, 1, 0, -1, 0, 0, 0, 0, -1 }, }, #endif @@ -1200,11 +1200,14 @@ static struct i2c_board_info __initdata board_i2c2_devices[] = { }; #endif #if defined (CONFIG_ANX7150) -#define HDMI_VDD_CTL RK29_PIN6_PD3 +#define HDMI_V33_CTL RK29_PIN6_PD3 //3.3V power control +#define HDMI_V5_CTL RK29_PIN4_PD0 //5V power control int anx7150_io_init(void) { - gpio_request(HDMI_VDD_CTL, "hdmi pwr ctl"); - gpio_direction_output(HDMI_VDD_CTL, GPIO_HIGH); + gpio_request(HDMI_V33_CTL, "hdmi pwr ctl 0"); + gpio_request(HDMI_V5_CTL, "hdmi pwr ctl 1"); + gpio_direction_output(HDMI_V33_CTL, GPIO_HIGH); + gpio_direction_output(HDMI_V5_CTL, GPIO_HIGH); //gpio_set_value(HDMI_VDD_CTL, GPIO_HIGH); mdelay(10); return 0; From 1699eadd4de2e6a4c28351224586f01f6ec99d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Thu, 25 Aug 2011 18:32:52 +0800 Subject: [PATCH 016/150] rk29: vpu: add time out error log and error recovery mechanism --- arch/arm/mach-rk29/vpu_service.c | 85 ++++++++++++++++++++++++-------- 1 file changed, 65 insertions(+), 20 deletions(-) diff --git a/arch/arm/mach-rk29/vpu_service.c b/arch/arm/mach-rk29/vpu_service.c index 374f9dac4e83..585929479819 100644 --- a/arch/arm/mach-rk29/vpu_service.c +++ b/arch/arm/mach-rk29/vpu_service.c @@ -97,6 +97,7 @@ typedef struct vpu_session { struct list_head done; wait_queue_head_t wait; pid_t pid; + atomic_t task_running; } vpu_session; /** @@ -126,7 +127,7 @@ typedef struct vpu_service_info { struct list_head running; /* link to link_reg in struct vpu_reg */ struct list_head done; /* link to link_reg in struct vpu_reg */ struct list_head session; /* link to list_session in struct vpu_session */ - atomic_t task_running; + atomic_t total_running; bool enabled; vpu_reg *reg_codec; vpu_reg *reg_pproc; @@ -168,6 +169,21 @@ static void vpu_put_clk(void) clk_put(hclk_cpu_vcodec); } +static void vpu_reset(void) +{ + clk_disable(aclk_ddr_vepu); + cru_set_soft_reset(SOFT_RST_CPU_VODEC_A2A_AHB, true); + cru_set_soft_reset(SOFT_RST_DDR_VCODEC_PORT, true); + cru_set_soft_reset(SOFT_RST_VCODEC_AHB_BUS, true); + cru_set_soft_reset(SOFT_RST_VCODEC_AXI_BUS, true); + mdelay(10); + cru_set_soft_reset(SOFT_RST_VCODEC_AXI_BUS, false); + cru_set_soft_reset(SOFT_RST_VCODEC_AHB_BUS, false); + cru_set_soft_reset(SOFT_RST_DDR_VCODEC_PORT, false); + cru_set_soft_reset(SOFT_RST_CPU_VODEC_A2A_AHB, false); + clk_enable(aclk_ddr_vepu); +} + static void vpu_service_power_off(void) { if (!service.enabled) @@ -176,7 +192,7 @@ static void vpu_service_power_off(void) service.enabled = false; printk("vpu: power off\n"); - while(atomic_read(&service.task_running)) { + while(atomic_read(&service.total_running)) { pr_alert("power off when task running!!\n"); udelay(10); } @@ -191,7 +207,7 @@ static void vpu_service_power_off(void) static void vpu_service_power_off_work_func(unsigned long data) { - printk("vpu: delayed power off work\n"); + printk("delayed "); vpu_service_power_off(); } @@ -310,6 +326,7 @@ static void reg_from_run_to_done(vpu_reg *reg) break; } } + atomic_sub(1, ®->session->task_running); wake_up_interruptible_sync(®->session->wait); spin_unlock(&service.lock); } @@ -318,7 +335,8 @@ void reg_copy_to_hw(vpu_reg *reg) { int i; u32 *src = (u32 *)®->reg[0]; - atomic_add(1, &service.task_running); + atomic_add(1, &service.total_running); + atomic_add(1, ®->session->task_running); switch (reg->type) { case VPU_ENC : { u32 *dst = (u32 *)enc_dev.hwregs; @@ -379,7 +397,8 @@ void reg_copy_to_hw(vpu_reg *reg) } break; default : { pr_err("unsupport session type %d", reg->type); - atomic_sub(1, &service.task_running); + atomic_sub(1, &service.total_running); + atomic_sub(1, ®->session->task_running); break; } } @@ -492,6 +511,7 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long case VPU_IOC_GET_REG : { vpu_request req; vpu_reg *reg; + unsigned long flag; if (copy_from_user(&req, (void __user *)arg, sizeof(vpu_request))) { pr_err("VPU_IOC_GET_REG copy_from_user failed\n"); return -EFAULT; @@ -499,19 +519,38 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long int ret = wait_event_interruptible_timeout(session->wait, !list_empty(&session->done), TIMEOUT_DELAY); if (unlikely(ret < 0)) { pr_err("pid %d wait task ret %d\n", session->pid, ret); - return ret; } else if (0 == ret) { - pr_err("pid %d wait task done timeout\n", session->pid); - return -ETIMEDOUT; + int task_running = atomic_read(&session->task_running); + pr_err("pid %d wait %d task done timeout\n", session->pid, task_running); + if (task_running) { + atomic_set(&session->task_running, 0); + atomic_sub(task_running, &service.total_running); + pr_err("%d task is running but not return, reset hardware...", task_running); + vpu_reset(); + pr_err("done\n"); + } + ret = -ETIMEDOUT; + } + if (ret < 0) { + vpu_reg *reg, *n; + spin_lock_irqsave(&service.lock, flag); + list_for_each_entry_safe(reg, n, &session->waiting, session_link) { + reg_deinit(reg); + } + list_for_each_entry_safe(reg, n, &session->running, session_link) { + reg_deinit(reg); + } + list_for_each_entry_safe(reg, n, &session->done, session_link) { + reg_deinit(reg); + } + spin_unlock_irqrestore(&service.lock, flag); + return ret; } } - { - unsigned long flag; - spin_lock_irqsave(&service.lock, flag); - reg = list_entry(session->done.next, vpu_reg, session_link); - return_reg(reg, (u32 __user *)req.req); - spin_unlock_irqrestore(&service.lock, flag); - } + spin_lock_irqsave(&service.lock, flag); + reg = list_entry(session->done.next, vpu_reg, session_link); + return_reg(reg, (u32 __user *)req.req); + spin_unlock_irqrestore(&service.lock, flag); break; } default : { @@ -620,6 +659,7 @@ static int vpu_service_open(struct inode *inode, struct file *filp) init_waitqueue_head(&session->wait); /* no need to protect */ list_add_tail(&session->list_session, &service.session); + atomic_set(&session->task_running, 0); filp->private_data = (void *)session; pr_debug("dev opened\n"); @@ -629,13 +669,18 @@ static int vpu_service_open(struct inode *inode, struct file *filp) static int vpu_service_release(struct inode *inode, struct file *filp) { unsigned long flag; + int task_running; vpu_session *session = (vpu_session *)filp->private_data; if (NULL == session) return -EINVAL; + task_running = atomic_read(&session->task_running); + if (task_running) { + pr_err("vpu_service session %d still has %d task running when closing\n", session->pid, task_running); + msleep(50); + } wake_up_interruptible_sync(&session->wait); - msleep(50); /* remove this filp from the asynchronusly notified filp's */ //vpu_service_fasync(-1, filp, 0); list_del(&session->list_session); @@ -912,7 +957,7 @@ static irqreturn_t vdpu_isr(int irq, void *dev_id) /* clear dec IRQ */ writel(irq_status_dec & (~DEC_INTERRUPT_BIT), dev->hwregs + DEC_INTERRUPT_REGISTER); pr_debug("DEC IRQ received!\n"); - atomic_sub(1, &service.task_running); + atomic_sub(1, &service.total_running); if (NULL == service.reg_codec) { pr_err("dec isr with no task waiting\n"); } else { @@ -924,7 +969,7 @@ static irqreturn_t vdpu_isr(int irq, void *dev_id) /* clear pp IRQ */ writel(irq_status_pp & (~DEC_INTERRUPT_BIT), dev->hwregs + PP_INTERRUPT_REGISTER); pr_debug("PP IRQ received!\n"); - atomic_sub(1, &service.task_running); + atomic_sub(1, &service.total_running); if (NULL == service.reg_pproc) { pr_err("pp isr with no task waiting\n"); } else { @@ -946,7 +991,7 @@ static irqreturn_t vepu_isr(int irq, void *dev_id) /* clear enc IRQ */ writel(irq_status & (~ENC_INTERRUPT_BIT), dev->hwregs + ENC_INTERRUPT_REGISTER); pr_debug("ENC IRQ received!\n"); - atomic_sub(1, &service.task_running); + atomic_sub(1, &service.total_running); if (NULL == service.reg_codec) { pr_err("enc isr with no task waiting\n"); } else { @@ -975,7 +1020,7 @@ static int __init vpu_service_init(void) spin_lock_init(&service.lock); service.reg_codec = NULL; service.reg_pproc = NULL; - atomic_set(&service.task_running, 0); + atomic_set(&service.total_running, 0); service.enabled = false; vpu_get_clk(); From f1961f5c0c4ca2f669c8d458c2f914ec6f5e5abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B1=E5=BB=BA=E6=96=8C?= Date: Fri, 26 Aug 2011 11:06:07 +0800 Subject: [PATCH 017/150] wm8994 : Improve the quality of the recording --- arch/arm/mach-rk29/board-rk29-phonesdk.c | 2 +- sound/soc/codecs/wm8994.c | 49 ++++++++++++++---------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index c3a27e27b792..0e7a23e355d6 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -1528,7 +1528,7 @@ struct wm8994_pdata wm8994_platdata = { .headset_normal_vol = -6, .BT_incall_vol = 0, .BT_incall_mic_vol = 0, - .recorder_vol = 20, + .recorder_vol = 30, }; diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index b74e22408b0c..8d2bf2c325ac 100755 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -272,7 +272,7 @@ static int wm8994_write(unsigned short reg,unsigned short value) return -EIO; } -static int wm8994_set_bit(unsigned short reg,unsigned short val) +static int wm8994_set_bit(unsigned short reg,unsigned short mask, unsigned short val) { int ret; u16 r; @@ -280,7 +280,8 @@ static int wm8994_set_bit(unsigned short reg,unsigned short val) ret = wm8994_read(reg, &r); if (ret < 0) goto out; - + + r &= ~mask; r |= val; ret = wm8994_write(reg, r); @@ -546,7 +547,7 @@ static int wm8994_sysclk_config(void) printk("wm8994->rate = %d!!!!\n",wm8994->rate); break; case 44100: - wm8994_write(0x210, 0x0073); // SR=48KHz + wm8994_write(0x210, 0x0073); // SR=44.1KHz break; case 48000: wm8994_write(0x210, 0x0083); // SR=48KHz @@ -794,17 +795,17 @@ void record_only(void) msleep(WM8994_DELAY); //clk wm8994_sysclk_config(); - wm8994_write(0x300, 0xC010); //AIF1ADCL_SRC=1, AIF1ADCR_SRC=1, AIF1_WL=00, AIF1_FMT=10 -// wm8994_write(0x300, 0xC050); // AIF1ADCL_SRC=1, AIF1ADCR_SRC=1, AIF1_WL=10, AIF1_FMT=10 +// wm8994_write(0x300, 0xC010); //AIF1ADCL_SRC=1, AIF1ADCR_SRC=1, AIF1_WL=00, AIF1_FMT=10 + wm8994_write(0x300, 0xC050); // AIF1ADCL_SRC=1, AIF1ADCR_SRC=1, AIF1_WL=10, AIF1_FMT=10 //path wm8994_write(0x28, 0x0003); // IN1RP_TO_IN1R=1, IN1RN_TO_IN1R=1 - wm8994_write(0x2A, 0x0030); //IN1R_TO_MIXINR IN1R_MIXINR_VOL + wm8994_write(0x2A, 0x0020); //IN1R_TO_MIXINR IN1R_MIXINR_VOL wm8994_write(0x606, 0x0002); // ADC1L_TO_AIF1ADC1L=1 wm8994_write(0x607, 0x0002); // ADC1R_TO_AIF1ADC1R=1 wm8994_write(0x620, 0x0000); //ADC_OSR128=0, DAC_OSR128=0 //DRC - wm8994_write(0x440, 0x01BF); - wm8994_write(0x450, 0x01BF); + wm8994_write(0x440, 0x01BB); + wm8994_write(0x450, 0x01BB); //valume // wm8994_write(0x1A, 0x014B);//IN1_VU=1, IN1R_MUTE=0, IN1R_ZC=1, IN1R_VOL=0_1011 wm8994_write(0x402, 0x01FF); // AIF1ADC1L_VOL [7:0] @@ -829,26 +830,33 @@ void recorder_add(void) if(wm8994_current_mode==wm8994_record_add)return; wm8994_current_mode=wm8994_record_add; //path - wm8994_set_bit(0x28, 0x0003); // IN1RP_TO_IN1R=1, IN1RN_TO_IN1R=1 - wm8994_set_bit(0x2A, 0x0030); //IN1R_TO_MIXINR IN1R_MIXINR_VOL - wm8994_set_bit(0x606, 0x0002); // ADC1L_TO_AIF1ADC1L=1 - wm8994_set_bit(0x607, 0x0002); // ADC1R_TO_AIF1ADC1R=1 + wm8994_set_bit(0x28, 0x0003 ,0x0003); // IN1RP_TO_IN1R=1, IN1RN_TO_IN1R=1 + wm8994_set_bit(0x2A, 0x0020 ,0x0020); //IN1R_TO_MIXINR IN1R_MIXINR_VOL + wm8994_set_bit(0x606,0x0002 ,0x0002); // ADC1L_TO_AIF1ADC1L=1 + wm8994_set_bit(0x607,0x0002 ,0x0002); // ADC1R_TO_AIF1ADC1R=1 //DRC - wm8994_set_bit(0x440, 0x01BF); - wm8994_set_bit(0x450, 0x01BF); + wm8994_set_bit(0x440,0x01BB,0x01BB); + wm8994_set_bit(0x450,0x01BB,0x01BB); //valume // wm8994_set_bit(0x1A, 0x014B);//IN1_VU=1, IN1R_MUTE=0, IN1R_ZC=1, IN1R_VOL=0_1011 - wm8994_set_bit(0x402, 0x01FF); // AIF1ADC1L_VOL [7:0] - wm8994_set_bit(0x403, 0x01FF); // AIF1ADC1R_VOL [7:0] + wm8994_set_bit(0x402,0x01FF,0x01FF); // AIF1ADC1L_VOL [7:0] + wm8994_set_bit(0x403,0x01FF,0x01FF); // AIF1ADC1R_VOL [7:0] //power - wm8994_set_bit(0x02, 0x6110); // TSHUT_ENA=1, TSHUT_OPDIS=1, MIXINR_ENA=1,IN1R_ENA=1 - wm8994_set_bit(0x04, 0x0303); // AIF1ADC1L_ENA=1, AIF1ADC1R_ENA=1, ADCL_ENA=1, ADCR_ENA=1 - wm8994_set_bit(0x01, 0x0033); + wm8994_set_bit(0x02, 0x6110,0x6110); // TSHUT_ENA=1, TSHUT_OPDIS=1, MIXINR_ENA=1,IN1R_ENA=1 + wm8994_set_bit(0x04, 0x0303,0x0303); // AIF1ADC1L_ENA=1, AIF1ADC1R_ENA=1, ADCL_ENA=1, ADCR_ENA=1 + wm8994_set_bit(0x01, 0x0033,0x0033); out: MAX_MIN(-16,pdata->recorder_vol,60); DBG("recorder_vol = %ddB \n",pdata->recorder_vol); - wm8994_write(0x1A, 320+(pdata->recorder_vol+16)*10/15); //mic vol + if(pdata->recorder_vol <= 30) + wm8994_set_bit(0x1A, 0x1FF , 320+(pdata->recorder_vol+16)*10/15); //mic vol + else + { + pdata->recorder_vol -= 30; + wm8994_set_bit(0x2A, 0x0010, 0x0010); //IN1R_TO_MIXINR IN1R_MIXINR_VOL + wm8994_set_bit(0x1A, 0x1FF , 320+(pdata->recorder_vol+16)*10/15); //mic vol + } } void AP_to_speakers_and_headset(void) @@ -1696,6 +1704,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, PA_ctrl(GPIO_LOW); break; } + //set rount switch(route) { From c4e1ccfd7d68780096334cf9b39c92d4ea9f9b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=B4?= Date: Thu, 25 Aug 2011 20:11:20 -0700 Subject: [PATCH 018/150] A22:set VCC 2.8V when in sleep,set key gpio pullup/down disable when in sleep --- arch/arm/mach-rk29/board-rk29-a22.c | 2 +- arch/arm/mach-rk29/spi_sram.c | 29 +++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c index 0bf00da5fdff..d86312438136 100755 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -654,7 +654,7 @@ int wm831x_post_init(struct wm831x *parm) dcdc = regulator_get(NULL, "dcdc3"); // 1th IO regulator_set_voltage(dcdc,3000000,3000000); - regulator_set_suspend_voltage(dcdc, 3000000); + regulator_set_suspend_voltage(dcdc, 2800000); regulator_enable(dcdc); printk("%s set dcdc3=%dmV end\n", __FUNCTION__, regulator_get_voltage(dcdc)); regulator_put(dcdc); diff --git a/arch/arm/mach-rk29/spi_sram.c b/arch/arm/mach-rk29/spi_sram.c index 9cb8299f60ff..6805cd67267f 100755 --- a/arch/arm/mach-rk29/spi_sram.c +++ b/arch/arm/mach-rk29/spi_sram.c @@ -471,21 +471,30 @@ int __sramdata crumode; //static GRF_REG_SAVE __sramdata pm_grf; static void pm_keygpio_prepare(void) { - gpio6_pull = grf_readl(GRF_GPIO6_PULL); gpio2_pull = grf_readl(GRF_GPIO2_PULL); - } - void pm_keygpio_suspend(void) + void pm_keygpio_sdk_suspend(void) { grf_writel(gpio6_pull|0x7f,GRF_GPIO6_PULL);//key pullup/pulldown disable grf_writel(gpio2_pull|0x00000f30,GRF_GPIO2_PULL); } - void pm_keygpio_resume(void) + void pm_keygpio_sdk_resume(void) { grf_writel(gpio6_pull,GRF_GPIO6_PULL);//key pullup/pulldown enable grf_writel(gpio2_pull,GRF_GPIO2_PULL); } + void pm_keygpio_a22_suspend(void) +{ + grf_writel(gpio6_pull|0x7f,GRF_GPIO6_PULL);//key pullup/pulldown disable + grf_writel(gpio2_pull|0x00000900,GRF_GPIO2_PULL); +} + void pm_keygpio_a22_resume(void) +{ + grf_writel(gpio6_pull,GRF_GPIO6_PULL);//key pullup/pulldown enable + grf_writel(gpio2_pull,GRF_GPIO2_PULL); +} + static void pm_spi_gpio_prepare(void) { @@ -542,7 +551,11 @@ void pm_gpio_suspend(void) { pm_spi_gpio_suspend(); // spi pullup/pulldown disable.... #if defined(CONFIG_MACH_RK29_PHONESDK) - { pm_keygpio_suspend();// key pullup/pulldown disable..... + { pm_keygpio_sdk_suspend();// key pullup/pulldown disable..... + } + #endif + #if defined(CONFIG_MACH_RK29_A22) + { pm_keygpio_a22_suspend();// key pullup/pulldown disable..... } #endif } @@ -550,7 +563,11 @@ void pm_gpio_resume(void) { pm_spi_gpio_resume(); // spi pullup/pulldown enable..... #if defined(CONFIG_MACH_RK29_PHONESDK) - { pm_keygpio_resume();// key pullup/pulldown enable..... + { pm_keygpio_sdk_resume();// key pullup/pulldown enable..... + } + #endif + #if defined(CONFIG_MACH_RK29_A22) + { pm_keygpio_a22_resume();// key pullup/pulldown enable..... } #endif } From 02b59631de9e60d26e50b60483c32a3c50278b27 Mon Sep 17 00:00:00 2001 From: lyx Date: Thu, 25 Aug 2011 19:38:43 -0700 Subject: [PATCH 019/150] rk29 ddr3 sdk: add irda board data struct --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 148 ++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 1daf070fbf03..ce80511a1da5 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -1385,6 +1386,145 @@ static struct platform_device rk29_device_gpu = { }; #endif +#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) +#define BU92747GUW_RESET_PIN RK29_PIN3_PD4// INVALID_GPIO // +#define BU92747GUW_RESET_MUX_NAME GPIO3D4_HOSTWRN_NAME//NULL // +#define BU92747GUW_RESET_MUX_MODE GPIO3H_GPIO3D4//NULL // + +#define BU92747GUW_PWDN_PIN RK29_PIN3_PD3//RK29_PIN5_PA7 // +#define BU92747GUW_PWDN_MUX_NAME GPIO3D3_HOSTRDN_NAME//GPIO5A7_HSADCDATA2_NAME // +#define BU92747GUW_PWDN_MUX_MODE GPIO3H_GPIO3D3//GPIO5L_GPIO5A7 // + +static int bu92747guw_io_init(void) +{ + int ret; + + //reset pin + if(BU92747GUW_RESET_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_RESET_MUX_NAME, BU92747GUW_RESET_MUX_MODE); + } + ret = gpio_request(BU92747GUW_RESET_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_RESET_PIN); + printk(">>>>>> BU92747GUW_RESET_PIN gpio_request err \n "); + } + gpio_direction_output(BU92747GUW_RESET_PIN, GPIO_HIGH); + + //power down pin + if(BU92747GUW_PWDN_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_PWDN_MUX_NAME, BU92747GUW_PWDN_MUX_MODE); + } + ret = gpio_request(BU92747GUW_PWDN_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_PWDN_PIN); + printk(">>>>>> BU92747GUW_PWDN_PIN gpio_request err \n "); + } + + //power down as default + gpio_direction_output(BU92747GUW_PWDN_PIN, GPIO_LOW); + + return 0; +} + + +static int bu92747guw_io_deinit(void) +{ + gpio_free(BU92747GUW_PWDN_PIN); + gpio_free(BU92747GUW_RESET_PIN); + return 0; +} + +//power ctl func is share with irda and remote +static int nPowerOnCount = 0; +static DEFINE_MUTEX(bu92747_power_mutex); + +//1---power on; 0---power off +static int bu92747guw_power_ctl(int enable) +{ + printk("%s \n",__FUNCTION__); + + mutex_lock(&bu92747_power_mutex); + if (enable) { + nPowerOnCount++; + if (nPowerOnCount == 1) {//power on first + //smc0_init(NULL); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_HIGH); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_LOW); + mdelay(5); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_HIGH); + mdelay(5); + } + } + else { + nPowerOnCount--; + if (nPowerOnCount <= 0) {//power down final + nPowerOnCount = 0; + //smc0_exit(); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_LOW); + } + } + mutex_unlock(&bu92747_power_mutex); + return 0; +} +#endif + +#ifdef CONFIG_RK_IRDA +#define IRDA_IRQ_PIN RK29_PIN5_PB2 +#define IRDA_IRQ_MUX_NAME GPIO5B2_HSADCDATA5_NAME +#define IRDA_IRQ_MUX_MODE GPIO5L_GPIO5B2 + +int irda_iomux_init(void) +{ + int ret = 0; + + //irda irq pin + if(IRDA_IRQ_MUX_NAME != NULL) + { + rk29_mux_api_set(IRDA_IRQ_MUX_NAME, IRDA_IRQ_MUX_MODE); + } + ret = gpio_request(IRDA_IRQ_PIN, NULL); + if(ret != 0) + { + gpio_free(IRDA_IRQ_PIN); + printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n "); + } + gpio_pull_updown(IRDA_IRQ_PIN, GPIO_HIGH); + gpio_direction_input(IRDA_IRQ_PIN); + + return 0; +} + +int irda_iomux_deinit(void) +{ + gpio_free(IRDA_IRQ_PIN); + return 0; +} + +static struct irda_info rk29_irda_info = { + .intr_pin = IRDA_IRQ_PIN, + .iomux_init = irda_iomux_init, + .iomux_deinit = irda_iomux_deinit, + .irda_pwr_ctl = bu92747guw_power_ctl, +}; + +static struct platform_device irda_device = { +#ifdef CONFIG_RK_IRDA_NET + .name = "rk_irda", +#else + .name = "bu92747_irda", +#endif + .id = -1, + .dev = { + .platform_data = &rk29_irda_info, + } +}; +#endif + + #ifdef CONFIG_KEYS_RK29 extern struct rk29_keys_platform_data rk29_keys_pdata; static struct platform_device rk29_device_keys = { @@ -1523,6 +1663,9 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_VIDEO_RK29XX_VOUT &rk29_v4l2_output_devce, #endif +#ifdef CONFIG_RK_IRDA + &irda_device, +#endif }; /***************************************************************************************** @@ -1812,6 +1955,11 @@ static void __init machine_rk29_board_init(void) #endif board_usb_detect_init(RK29_PIN0_PA0); +#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) + smc0_init(NULL); + bu92747guw_io_init(); +#endif + } static void __init machine_rk29_fixup(struct machine_desc *desc, struct tag *tags, From f623585f057c70e8ef3f6c884c8822317ba7cf8f Mon Sep 17 00:00:00 2001 From: lyx Date: Fri, 26 Aug 2011 02:56:45 -0700 Subject: [PATCH 020/150] newton: modify irda driver 1.add open mutex lock with cir 2.improve suspend and resume function 3.improve irda err handle --- drivers/net/irda/ir_serial.c | 144 ++++++++++++++++++++++------------- 1 file changed, 90 insertions(+), 54 deletions(-) diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index 09d9965eee5a..29f972291000 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -68,6 +68,7 @@ struct bu92747_port { struct work_struct work; /* set to 1 to make the workhandler exit as soon as possible */ int force_end_work; + int open_flag; /* need to know we are suspending to avoid deadlock on workqueue */ int suspending; @@ -89,13 +90,29 @@ static u8 g_receive_buf[BU92725GUW_FIFO_SIZE]; #define BU92747_IRDA_DBG(x...) #endif + +/* race on startup&shutdown, mutex lock with CIR driver */ +static DEFINE_MUTEX(irda_cir_lock); +int bu92747_try_lock(void) +{ + if (mutex_trylock(&irda_cir_lock)) + return 1; //ready + else + return 0; //busy +} + +void bu92747_unlock(void) +{ + return mutex_unlock(&irda_cir_lock); +} + static int add_frame_length(struct rev_frame_length *f, unsigned long length) { if (frame_write_full(f)) return -1; f->frame_length[f->iWrite] = length; - printk("add one frame, length=%d\n", f->frame_length[f->iWrite]); + printk("add one frame, length=%ld\n", f->frame_length[f->iWrite]); f->iCount++; printk("now frame iCount=%d\n", f->iCount); f->iWrite = (f->iWrite+1) % MAX_FRAME_NUM; @@ -111,7 +128,7 @@ static int get_frame_length(struct rev_frame_length *f, unsigned long *length) return -1; *length = f->frame_length[f->iRead]; - printk("read one frame, length=%d\n", *length); + printk("read one frame, length=%ld\n", *length); f->iCount--; printk("now frame iCount=%d\n", f->iCount); f->iRead = (f->iRead+1) % MAX_FRAME_NUM; @@ -149,10 +166,10 @@ static int bu92747_irda_do_rx(struct bu92747_port *s) static int bu92747_irda_do_tx(struct bu92747_port *s) { - int i; + //int i; struct circ_buf *xmit = &s->port.state->xmit; int len = uart_circ_chars_pending(xmit); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + printk("line %d, enter %s, sending %d data\n", __LINE__, __FUNCTION__, len); if (IS_FIR(s)) { //printk("fir sending.....\n"); @@ -163,11 +180,11 @@ static int bu92747_irda_do_tx(struct bu92747_port *s) irda_hw_tx_enable_irq(BU92725GUW_SIR); } - BU92747_IRDA_DBG("data:\n"); - for (i=0; ibuf[xmit->tail+i]); - } - BU92747_IRDA_DBG("\n"); + //BU92747_IRDA_DBG("data:\n"); + //for (i=0; ibuf[xmit->tail+i]); + //} + //BU92747_IRDA_DBG("\n"); if (len>0) { s->tx_empty = 0; @@ -197,7 +214,7 @@ static void bu92747_irda_work(struct work_struct *w) struct circ_buf *xmit = &s->port.state->xmit; dev_dbg(s->dev, "%s\n", __func__); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + printk("line %d, enter %s \n", __LINE__, __FUNCTION__); if (!s->force_end_work && !freezing(current)) { //BU92725GUW_dump_register(); @@ -222,18 +239,6 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); irq_src = irda_hw_get_irqsrc(); printk("[%s][%d], 0x%x\n",__FUNCTION__,__LINE__, irq_src); - /* error */ - if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE - | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { - BU92747_IRDA_DBG("[%s][%d]: do err\n", __FUNCTION__, __LINE__); - //BU92725GUW_dump_register(); - BU92725GUW_clr_fifo(); - BU92725GUW_reset(); - if ((BU92725GUW_SEND==irda_hw_get_mode()) - || (BU92725GUW_MULTI_SEND==irda_hw_get_mode())) { - s->tx_empty = 1; - } - } if (irq_src & (REG_INT_DRX | FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE)) { len = bu92747_irda_do_rx(s); @@ -266,6 +271,19 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) s->tx_empty = 1; irda_hw_set_moderx(); } + + /* error */ + if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE + | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { + BU92747_IRDA_DBG("[%s][%d]: do err\n", __FUNCTION__, __LINE__); + //BU92725GUW_dump_register(); + BU92725GUW_clr_fifo(); + BU92725GUW_reset(); + if ((BU92725GUW_SEND==irda_hw_get_mode()) + || (BU92725GUW_MULTI_SEND==irda_hw_get_mode())) { + s->tx_empty = 1; + } + } return IRQ_HANDLED; } @@ -294,10 +312,7 @@ static void bu92747_irda_start_tx(struct uart_port *port) if (IS_FIR(s)) return ; - if (s->tx_empty) - bu92747_irda_do_tx(s); - else - bu92747_irda_dowork(s); + bu92747_irda_dowork(s); } static void bu92747_irda_stop_rx(struct uart_port *port) @@ -385,14 +400,15 @@ static void bu92747_irda_shutdown(struct uart_port *port) struct bu92747_port *s = container_of(port, struct bu92747_port, port); + struct rev_frame_length *f = &(s->rev_frames); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); dev_dbg(s->dev, "%s\n", __func__); - struct rev_frame_length *f = &(s->rev_frames); if (s->suspending) return; + s->open_flag = 0; s->force_end_work = 1; if (s->workqueue) { @@ -412,8 +428,9 @@ static void bu92747_irda_shutdown(struct uart_port *port) irda_hw_shutdown(); if (s->pdata->irda_pwr_ctl) - s->pdata->irda_pwr_ctl(0); + s->pdata->irda_pwr_ctl(0); + bu92747_unlock(); } static int bu92747_irda_startup(struct uart_port *port) @@ -427,17 +444,23 @@ static int bu92747_irda_startup(struct uart_port *port) BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); dev_dbg(s->dev, "%s\n", __func__); - s->baud = 9600; s->rx_enabled = 1; + if (s->suspending) + return 0; + + if (!bu92747_try_lock()) { + printk("func %s, cannot get bu92747 lock, bu92747 in using\n", __func__); + return -EBUSY; + } + + s->baud = 9600; + spin_lock(&s->data_lock); frame_length_buf_clear(f); s->cur_frame_length = 0; spin_unlock(&s->data_lock); - if (s->suspending) - return 0; - s->tx_empty = 1; s->force_end_work = 0; @@ -445,6 +468,7 @@ static int bu92747_irda_startup(struct uart_port *port) s->workqueue = create_freezeable_workqueue(b); if (!s->workqueue) { dev_warn(s->dev, "cannot create workqueue\n"); + bu92747_unlock(); return -EBUSY; } INIT_WORK(&s->work, bu92747_irda_work); @@ -457,6 +481,7 @@ static int bu92747_irda_startup(struct uart_port *port) s->irq = 0; destroy_workqueue(s->workqueue); s->workqueue = NULL; + bu92747_unlock(); return -EBUSY; } @@ -470,6 +495,8 @@ static int bu92747_irda_startup(struct uart_port *port) enable_irq(s->irq); + s->open_flag = 1; + return 0; } @@ -700,8 +727,9 @@ static int __devinit bu92747_irda_probe(struct platform_device *pdev) dev_warn(&pdev->dev, "uart_add_one_port failed for line %d with error %d\n", i, retval); - - /* set shutdown mode to save power. Will be woken-up on open */ + bu92747s[i]->open_flag = 0; + bu92747s[i]->suspending = 0; + /* set shutdown mode to save power. Will be woken-up on open */ if (bu92747s[i]->pdata->irda_pwr_ctl) bu92747s[i]->pdata->irda_pwr_ctl(0); @@ -753,16 +781,18 @@ static int bu92747_irda_suspend(struct platform_device *pdev, pm_message_t state dev_dbg(s->dev, "%s\n", __func__); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - disable_irq(s->irq); + if (s->open_flag) { + printk("line %d, enter %s \n", __LINE__, __FUNCTION__); + disable_irq(s->irq); - s->suspending = 1; - uart_suspend_port(&bu92747_irda_uart_driver, &s->port); - - //irda_hw_shutdown(); - if (s->pdata->irda_pwr_ctl) - s->pdata->irda_pwr_ctl(0); + s->suspending = 1; + uart_suspend_port(&bu92747_irda_uart_driver, &s->port); + irda_hw_shutdown(); + if (s->pdata->irda_pwr_ctl) + s->pdata->irda_pwr_ctl(0); + } + return 0; } @@ -771,22 +801,28 @@ static int bu92747_irda_resume(struct platform_device *pdev) struct bu92747_port *s = dev_get_drvdata(&pdev->dev); dev_dbg(s->dev, "%s\n", __func__); - - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - if (s->pdata->irda_pwr_ctl) - s->pdata->irda_pwr_ctl(1); - //irda_hw_startup(); - irda_hw_set_speed(s->baud); + if (s->open_flag) { + printk("line %d, enter %s \n", __LINE__, __FUNCTION__); + if (s->pdata->irda_pwr_ctl) + s->pdata->irda_pwr_ctl(1); + + irda_hw_startup(); + irda_hw_set_speed(s->baud); + irda_hw_set_moderx(); - uart_resume_port(&bu92747_irda_uart_driver, &s->port); - s->suspending = 0; + uart_resume_port(&bu92747_irda_uart_driver, &s->port); + s->suspending = 0; - enable_irq(s->irq); + enable_irq(s->irq); + + if (!s->tx_empty) + s->tx_empty = 1; + + if (s->workqueue && !IS_FIR(s)) + bu92747_irda_dowork(s); + } - if (s->workqueue) - bu92747_irda_dowork(s); - return 0; } #else From 2d9a4cac1779cbb44a1afbf2cfca1ff5076cedab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 22 Aug 2011 15:41:10 +0800 Subject: [PATCH 021/150] rk29: cpufreq: add CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP macro --- arch/arm/mach-rk29/cpufreq.c | 92 ++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 36 deletions(-) diff --git a/arch/arm/mach-rk29/cpufreq.c b/arch/arm/mach-rk29/cpufreq.c index fde8e1e4d510..c74dc3582cc7 100755 --- a/arch/arm/mach-rk29/cpufreq.c +++ b/arch/arm/mach-rk29/cpufreq.c @@ -114,15 +114,20 @@ static int rk29_cpufreq_set_limit_avg_voltage(const char *val, struct kernel_par } module_param_call(limit_avg_voltage, rk29_cpufreq_set_limit_avg_voltage, param_get_uint, &limit_avg_voltage, 0644); +#define CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP static bool limit_fb1_is_on; static bool limit_hdmi_is_on; -static bool aclk_limit(void) { return limit_hdmi_is_on && limit_fb1_is_on; } +static inline bool aclk_limit(void) { return limit_hdmi_is_on && limit_fb1_is_on; } static int limit_index_816 = -1; static int limit_index_1008 = -1; module_param(limit_fb1_is_on, bool, 0644); module_param(limit_hdmi_is_on, bool, 0644); module_param(limit_index_816, int, 0444); module_param(limit_index_1008, int, 0444); +#else +static inline bool aclk_limit(void) { return false; } +#endif static bool rk29_cpufreq_is_ondemand_policy(struct cpufreq_policy *policy) { @@ -138,8 +143,10 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) limit_avg_freq = 0; limit_avg_index = -1; +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP limit_index_816 = -1; limit_index_1008 = -1; +#endif for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) { table[i].frequency = clk_round_rate(arm_clk, table[i].frequency * KHZ) / KHZ; @@ -147,6 +154,7 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) limit_avg_freq = table[i].frequency; limit_avg_index = i; } +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP if (table[i].frequency <= 816 * KHZ && (limit_index_816 < 0 || (limit_index_816 >= 0 && table[limit_index_816].frequency < table[i].frequency))) @@ -155,6 +163,7 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) (limit_index_1008 < 0 || (limit_index_1008 >= 0 && table[limit_index_1008].frequency < table[i].frequency))) limit_index_1008 = i; +#endif } if (!limit_avg_freq) @@ -231,6 +240,7 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i #define rk29_cpufreq_limit_by_temp(...) do {} while (0) #endif +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP static void rk29_cpufreq_limit_by_disp(int *index) { unsigned long ddr_rate; @@ -255,6 +265,9 @@ static void rk29_cpufreq_limit_by_disp(int *index) *index = new_index; } } +#else +#define rk29_cpufreq_limit_by_disp(...) do {} while (0) +#endif static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int target_freq, unsigned int relation) { @@ -396,6 +409,42 @@ static void rk29_cpufreq_work_func(struct work_struct *work) } #endif +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP +static int rk29_cpufreq_fb_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + struct cpufreq_policy *policy; + + switch (event) { + case RK29FB_EVENT_HDMI_ON: + limit_hdmi_is_on = true; + break; + case RK29FB_EVENT_HDMI_OFF: + limit_hdmi_is_on = false; + break; + case RK29FB_EVENT_FB1_ON: + limit_fb1_is_on = true; + break; + case RK29FB_EVENT_FB1_OFF: + limit_fb1_is_on = false; + break; + } + + dprintk(DEBUG_DISP, "event: %lu aclk_limit: %d\n", event, aclk_limit()); + policy = cpufreq_cpu_get(0); + if (policy) { + cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L | CPUFREQ_FORCE_CHANGE); + cpufreq_cpu_put(policy); + } + + return NOTIFY_OK; +} + +static struct notifier_block rk29_cpufreq_fb_notifier = { + .notifier_call = rk29_cpufreq_fb_notifier_event, +}; +#endif + static int rk29_cpufreq_init(struct cpufreq_policy *policy) { if (policy->cpu != 0) @@ -437,12 +486,18 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) queue_delayed_work(wq, &rk29_cpufreq_work, WORK_DELAY); } cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); +#endif +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP + rk29fb_register_notifier(&rk29_cpufreq_fb_notifier); #endif return 0; } static int rk29_cpufreq_exit(struct cpufreq_policy *policy) { +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP + rk29fb_unregister_notifier(&rk29_cpufreq_fb_notifier); +#endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP cpufreq_unregister_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); if (wq) { @@ -528,45 +583,10 @@ static struct notifier_block rk29_cpufreq_reboot_notifier = { .notifier_call = rk29_cpufreq_reboot_notifier_event, }; -static int rk29_cpufreq_fb_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - struct cpufreq_policy *policy; - - switch (event) { - case RK29FB_EVENT_HDMI_ON: - limit_hdmi_is_on = true; - break; - case RK29FB_EVENT_HDMI_OFF: - limit_hdmi_is_on = false; - break; - case RK29FB_EVENT_FB1_ON: - limit_fb1_is_on = true; - break; - case RK29FB_EVENT_FB1_OFF: - limit_fb1_is_on = false; - break; - } - - dprintk(DEBUG_DISP, "event: %lu aclk_limit: %d\n", event, aclk_limit()); - policy = cpufreq_cpu_get(0); - if (policy) { - cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L | CPUFREQ_FORCE_CHANGE); - cpufreq_cpu_put(policy); - } - - return NOTIFY_OK; -} - -static struct notifier_block rk29_cpufreq_fb_notifier = { - .notifier_call = rk29_cpufreq_fb_notifier_event, -}; - static int __init rk29_cpufreq_register(void) { register_pm_notifier(&rk29_cpufreq_pm_notifier); register_reboot_notifier(&rk29_cpufreq_reboot_notifier); - rk29fb_register_notifier(&rk29_cpufreq_fb_notifier); return cpufreq_register_driver(&rk29_cpufreq_driver); } From 97475ecdcc362dd6dd0adf31a4c1f186c397fd6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 22 Aug 2011 17:32:30 +0800 Subject: [PATCH 022/150] rk29: cpufreq: always enable wq --- arch/arm/mach-rk29/cpufreq.c | 80 +++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 34 deletions(-) diff --git a/arch/arm/mach-rk29/cpufreq.c b/arch/arm/mach-rk29/cpufreq.c index c74dc3582cc7..75b42465d50b 100755 --- a/arch/arm/mach-rk29/cpufreq.c +++ b/arch/arm/mach-rk29/cpufreq.c @@ -59,12 +59,9 @@ static int vcore_uV; #define CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP #endif -#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP static struct workqueue_struct *wq; -static void rk29_cpufreq_work_func(struct work_struct *work); -static DECLARE_DELAYED_WORK(rk29_cpufreq_work, rk29_cpufreq_work_func); -#define WORK_DELAY HZ +#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP static int limit = 1; module_param(limit, int, 0644); @@ -197,7 +194,7 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i static u64 last_idle_time_us; unsigned int cur = policy->cur; - if (!limit || !wq || !rk29_cpufreq_is_ondemand_policy(policy) || + if (!limit || !rk29_cpufreq_is_ondemand_policy(policy) || (limit_avg_index < 0) || (relation & MASK_FURTHER_CPUFREQ)) { limit_temp = 0; last.tv64 = 0; @@ -247,7 +244,7 @@ static void rk29_cpufreq_limit_by_disp(int *index) unsigned int frequency = freq_table[*index].frequency; int new_index = -1; - if (!ddr_clk || !aclk_limit()) + if (!aclk_limit()) return; ddr_rate = clk_get_rate(ddr_clk); @@ -368,26 +365,24 @@ static int rk29_cpufreq_target(struct cpufreq_policy *policy, unsigned int targe } #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP +static void rk29_cpufreq_limit_by_temp_work_func(struct work_struct *work); +static DECLARE_DELAYED_WORK(rk29_cpufreq_limit_by_temp_work, rk29_cpufreq_limit_by_temp_work_func); +#define WORK_DELAY HZ + static int rk29_cpufreq_notifier_policy(struct notifier_block *nb, unsigned long val, void *data) { struct cpufreq_policy *policy = data; - bool is_ondemand; if (val != CPUFREQ_NOTIFY) return 0; - is_ondemand = rk29_cpufreq_is_ondemand_policy(policy); - if (!wq && is_ondemand) { - dprintk(DEBUG_TEMP, "start wq\n"); - wq = create_singlethread_workqueue("rk29_cpufreqd"); - if (wq) - queue_delayed_work(wq, &rk29_cpufreq_work, WORK_DELAY); - } else if (wq && !is_ondemand) { - dprintk(DEBUG_TEMP, "stop wq\n"); - cancel_delayed_work(&rk29_cpufreq_work); - destroy_workqueue(wq); - wq = NULL; + if (rk29_cpufreq_is_ondemand_policy(policy)) { + dprintk(DEBUG_TEMP, "queue work\n"); + queue_delayed_work(wq, &rk29_cpufreq_limit_by_temp_work, WORK_DELAY); + } else { + dprintk(DEBUG_TEMP, "cancel work\n"); + cancel_delayed_work(&rk29_cpufreq_limit_by_temp_work); } return 0; @@ -397,7 +392,7 @@ static struct notifier_block notifier_policy_block = { .notifier_call = rk29_cpufreq_notifier_policy }; -static void rk29_cpufreq_work_func(struct work_struct *work) +static void rk29_cpufreq_limit_by_temp_work_func(struct work_struct *work) { struct cpufreq_policy *policy = cpufreq_cpu_get(0); @@ -405,16 +400,27 @@ static void rk29_cpufreq_work_func(struct work_struct *work) cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L); cpufreq_cpu_put(policy); } - queue_delayed_work(wq, &rk29_cpufreq_work, WORK_DELAY); + queue_delayed_work(wq, &rk29_cpufreq_limit_by_temp_work, WORK_DELAY); } #endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP -static int rk29_cpufreq_fb_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) +static void rk29_cpufreq_limit_by_disp_work_func(struct work_struct *work) { struct cpufreq_policy *policy; + policy = cpufreq_cpu_get(0); + if (policy) { + cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L | CPUFREQ_FORCE_CHANGE); + cpufreq_cpu_put(policy); + } +} + +static DECLARE_WORK(rk29_cpufreq_limit_by_disp_work, rk29_cpufreq_limit_by_disp_work_func); + +static int rk29_cpufreq_fb_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ switch (event) { case RK29FB_EVENT_HDMI_ON: limit_hdmi_is_on = true; @@ -431,11 +437,8 @@ static int rk29_cpufreq_fb_notifier_event(struct notifier_block *this, } dprintk(DEBUG_DISP, "event: %lu aclk_limit: %d\n", event, aclk_limit()); - policy = cpufreq_cpu_get(0); - if (policy) { - cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L | CPUFREQ_FORCE_CHANGE); - cpufreq_cpu_put(policy); - } + flush_work(&rk29_cpufreq_limit_by_disp_work); + queue_work(wq, &rk29_cpufreq_limit_by_disp_work); return NOTIFY_OK; } @@ -453,14 +456,17 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) arm_clk = clk_get(NULL, "arm_pll"); if (IS_ERR(arm_clk)) { int err = PTR_ERR(arm_clk); + pr_err("fail to get arm_pll clk: %d\n", err); arm_clk = NULL; return err; } ddr_clk = clk_get(NULL, "ddr"); if (IS_ERR(ddr_clk)) { - pr_err("fail to get ddr clk: %ld\n", PTR_ERR(ddr_clk)); + int err = PTR_ERR(ddr_clk); + pr_err("fail to get ddr clk: %d\n", err); ddr_clk = NULL; + return err; } #ifdef CONFIG_REGULATOR @@ -478,12 +484,16 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) policy->cpuinfo.transition_latency = 40 * NSEC_PER_USEC; // make default sampling_rate to 40000 + wq = create_singlethread_workqueue("rk29_cpufreqd"); + if (!wq) { + pr_err("fail to create workqueue\n"); + return -ENOMEM; + } + #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP if (rk29_cpufreq_is_ondemand_policy(policy)) { dprintk(DEBUG_TEMP, "start wq\n"); - wq = create_singlethread_workqueue("rk29_cpufreqd"); - if (wq) - queue_delayed_work(wq, &rk29_cpufreq_work, WORK_DELAY); + queue_delayed_work(wq, &rk29_cpufreq_limit_by_temp_work, WORK_DELAY); } cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); #endif @@ -500,17 +510,19 @@ static int rk29_cpufreq_exit(struct cpufreq_policy *policy) #endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP cpufreq_unregister_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); + if (wq) + cancel_delayed_work(&rk29_cpufreq_limit_by_temp_work); +#endif if (wq) { - dprintk(DEBUG_TEMP, "stop wq\n"); - cancel_delayed_work(&rk29_cpufreq_work); + flush_workqueue(wq); destroy_workqueue(wq); wq = NULL; } -#endif #ifdef CONFIG_REGULATOR if (vcore) regulator_put(vcore); #endif + clk_put(ddr_clk); clk_put(arm_clk); return 0; } From da9a553f0741e80c5387ec3e9bc2b7db19ef7c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Fri, 26 Aug 2011 20:20:42 +0800 Subject: [PATCH 023/150] rk29: clock: support notify --- arch/arm/mach-rk29/clock.c | 216 +++++++++++++++++++++++- arch/arm/mach-rk29/include/mach/clock.h | 74 ++++++++ 2 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 arch/arm/mach-rk29/include/mach/clock.h diff --git a/arch/arm/mach-rk29/clock.c b/arch/arm/mach-rk29/clock.c index f5fa5c8a09f3..41822edd7b6b 100755 --- a/arch/arm/mach-rk29/clock.c +++ b/arch/arm/mach-rk29/clock.c @@ -33,6 +33,7 @@ #include #include #include +#include /* Clock flags */ @@ -61,7 +62,8 @@ struct clk { long (*round_rate)(struct clk *, unsigned long); struct clk* (*get_parent)(struct clk *); /* get clk's parent from the hardware. default is clksel_get_parent if parents present */ int (*set_parent)(struct clk *, struct clk *); /* default is clksel_set_parent if parents present */ - s32 usecount; + s16 usecount; + u16 notifier_count; u8 gate_idx; u8 pll_idx; u8 clksel_con; @@ -73,6 +75,8 @@ struct clk { struct clk **parents; }; +static void clk_notify(struct clk *clk, unsigned long msg, + unsigned long old_rate, unsigned long new_rate); static int clk_enable_nolock(struct clk *clk); static void clk_disable_nolock(struct clk *clk); static int clk_set_rate_nolock(struct clk *clk, unsigned long rate); @@ -2220,13 +2224,16 @@ static int clk_enable_nolock(struct clk *clk) return ret; } - if (clk->mode) { + if (clk->notifier_count) + clk_notify(clk, CLK_PRE_ENABLE, clk->rate, clk->rate); + if (clk->mode) ret = clk->mode(clk, 1); - if (ret) { - if (clk->parent) - clk_disable_nolock(clk->parent); - return ret; - } + if (clk->notifier_count) + clk_notify(clk, ret ? CLK_ABORT_ENABLE : CLK_POST_ENABLE, clk->rate, clk->rate); + if (ret) { + if (clk->parent) + clk_disable_nolock(clk->parent); + return ret; } pr_debug("%s enabled\n", clk->name); } @@ -2259,10 +2266,15 @@ static void clk_disable_nolock(struct clk *clk) } if (--clk->usecount == 0) { + int ret = 0; + if (clk->notifier_count) + clk_notify(clk, CLK_PRE_DISABLE, clk->rate, clk->rate); if (clk->mode) - clk->mode(clk, 0); + ret = clk->mode(clk, 0); + if (clk->notifier_count) + clk_notify(clk, ret ? CLK_ABORT_DISABLE : CLK_POST_DISABLE, clk->rate, clk->rate); pr_debug("%s disabled\n", clk->name); - if (clk->parent) + if (ret == 0 && clk->parent) clk_disable_nolock(clk->parent); } } @@ -2332,6 +2344,7 @@ static void __clk_recalc(struct clk *clk) static int clk_set_rate_nolock(struct clk *clk, unsigned long rate) { int ret; + unsigned long old_rate; if (rate == clk->rate) return 0; @@ -2344,6 +2357,10 @@ static int clk_set_rate_nolock(struct clk *clk, unsigned long rate) if (!clk->set_rate) return -EINVAL; + old_rate = clk->rate; + if (clk->notifier_count) + clk_notify(clk, CLK_PRE_RATE_CHANGE, old_rate, rate); + ret = clk->set_rate(clk, rate); if (ret == 0) { @@ -2351,6 +2368,9 @@ static int clk_set_rate_nolock(struct clk *clk, unsigned long rate) __propagate_rate(clk); } + if (clk->notifier_count) + clk_notify(clk, ret ? CLK_ABORT_RATE_CHANGE : CLK_POST_RATE_CHANGE, old_rate, clk->rate); + return ret; } @@ -2877,3 +2897,181 @@ static int __init clk_proc_init(void) late_initcall(clk_proc_init); #endif /* CONFIG_PROC_FS */ +/* Clk notifier implementation */ + +/** + * struct clk_notifier - associate a clk with a notifier + * @clk: struct clk * to associate the notifier with + * @notifier_head: a atomic_notifier_head for this clk + * @node: linked list pointers + * + * A list of struct clk_notifier is maintained by the notifier code. + * An entry is created whenever code registers the first notifier on a + * particular @clk. Future notifiers on that @clk are added to the + * @notifier_head. + */ +struct clk_notifier { + struct clk *clk; + struct atomic_notifier_head notifier_head; + struct list_head node; +}; + +static LIST_HEAD(clk_notifier_list); + +/** + * _clk_free_notifier_chain - safely remove struct clk_notifier + * @cn: struct clk_notifier * + * + * Removes the struct clk_notifier @cn from the clk_notifier_list and + * frees it. + */ +static void _clk_free_notifier_chain(struct clk_notifier *cn) +{ + list_del(&cn->node); + kfree(cn); +} + +/** + * clk_notify - call clk notifier chain + * @clk: struct clk * that is changing rate + * @msg: clk notifier type (i.e., CLK_POST_RATE_CHANGE; see mach/clock.h) + * @old_rate: old rate + * @new_rate: new rate + * + * Triggers a notifier call chain on the post-clk-rate-change notifier + * for clock 'clk'. Passes a pointer to the struct clk and the + * previous and current rates to the notifier callback. Intended to be + * called by internal clock code only. No return value. + */ +static void clk_notify(struct clk *clk, unsigned long msg, + unsigned long old_rate, unsigned long new_rate) +{ + struct clk_notifier *cn; + struct clk_notifier_data cnd; + + cnd.clk = clk; + cnd.old_rate = old_rate; + cnd.new_rate = new_rate; + + list_for_each_entry(cn, &clk_notifier_list, node) { + if (cn->clk == clk) { + pr_debug("%s msg %lu rate %lu -> %lu\n", clk->name, msg, old_rate, new_rate); + atomic_notifier_call_chain(&cn->notifier_head, msg, &cnd); + break; + } + } +} + +/** + * clk_notifier_register - add a clock parameter change notifier + * @clk: struct clk * to watch + * @nb: struct notifier_block * with callback info + * + * Request notification for changes to the clock 'clk'. This uses a + * blocking notifier. Callback code must not call into the clock + * framework, as clocks_mutex is held. Pre-notifier callbacks will be + * passed the previous and new rate of the clock. + * + * clk_notifier_register() must be called from process + * context. Returns -EINVAL if called with null arguments, -ENOMEM + * upon allocation failure; otherwise, passes along the return value + * of blocking_notifier_chain_register(). + */ +int clk_notifier_register(struct clk *clk, struct notifier_block *nb) +{ + struct clk_notifier *cn = NULL, *cn_new = NULL; + int r; + struct clk *clkp; + + if (!clk || !nb) + return -EINVAL; + + mutex_lock(&clocks_mutex); + + list_for_each_entry(cn, &clk_notifier_list, node) + if (cn->clk == clk) + break; + + if (cn->clk != clk) { + cn_new = kzalloc(sizeof(struct clk_notifier), GFP_KERNEL); + if (!cn_new) { + r = -ENOMEM; + goto cnr_out; + }; + + cn_new->clk = clk; + ATOMIC_INIT_NOTIFIER_HEAD(&cn_new->notifier_head); + + list_add(&cn_new->node, &clk_notifier_list); + cn = cn_new; + } + + r = atomic_notifier_chain_register(&cn->notifier_head, nb); + if (!IS_ERR_VALUE(r)) { + clkp = clk; + do { + clkp->notifier_count++; + } while ((clkp = clkp->parent)); + } else { + if (cn_new) + _clk_free_notifier_chain(cn); + } + +cnr_out: + mutex_unlock(&clocks_mutex); + + return r; +} +EXPORT_SYMBOL(clk_notifier_register); + +/** + * clk_notifier_unregister - remove a clock change notifier + * @clk: struct clk * + * @nb: struct notifier_block * with callback info + * + * Request no further notification for changes to clock 'clk'. + * Returns -EINVAL if called with null arguments; otherwise, passes + * along the return value of blocking_notifier_chain_unregister(). + */ +int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb) +{ + struct clk_notifier *cn = NULL; + struct clk *clkp; + int r = -EINVAL; + + if (!clk || !nb) + return -EINVAL; + + mutex_lock(&clocks_mutex); + + list_for_each_entry(cn, &clk_notifier_list, node) + if (cn->clk == clk) + break; + + if (cn->clk != clk) { + r = -ENOENT; + goto cnu_out; + }; + + r = atomic_notifier_chain_unregister(&cn->notifier_head, nb); + if (!IS_ERR_VALUE(r)) { + clkp = clk; + do { + clkp->notifier_count--; + } while ((clkp = clkp->parent)); + } + + /* + * XXX ugh, layering violation. There should be some + * support in the notifier code for this. + */ + if (!cn->notifier_head.head) + _clk_free_notifier_chain(cn); + +cnu_out: + mutex_unlock(&clocks_mutex); + + return r; +} +EXPORT_SYMBOL(clk_notifier_unregister); + diff --git a/arch/arm/mach-rk29/include/mach/clock.h b/arch/arm/mach-rk29/include/mach/clock.h new file mode 100644 index 000000000000..e0ac1cef3919 --- /dev/null +++ b/arch/arm/mach-rk29/include/mach/clock.h @@ -0,0 +1,74 @@ +/* arch/arm/mach-rk29/include/mach/clock.h + * + * Copyright (C) 2011 ROCKCHIP, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ + +#ifndef __ASM_ARCH_RK29_CLOCK_H +#define __ASM_ARCH_RK29_CLOCK_H + +/** + * struct clk_notifier_data - rate data to pass to the notifier callback + * @clk: struct clk * being changed + * @old_rate: previous rate of this clock + * @new_rate: new rate of this clock + * + * For a pre-notifier, old_rate is the clock's rate before this rate + * change, and new_rate is what the rate will be in the future. For a + * post-notifier, old_rate and new_rate are both set to the clock's + * current rate (this was done to optimize the implementation). + */ +struct clk_notifier_data { + struct clk *clk; + unsigned long old_rate; + unsigned long new_rate; +}; + +/* + * Clk notifier callback types + * + * Since the notifier is called with interrupts disabled, any actions + * taken by callbacks must be extremely fast and lightweight. + * + * CLK_PRE_RATE_CHANGE - called after all callbacks have approved the + * rate change, immediately before the clock rate is changed, to + * indicate that the rate change will proceed. Drivers must + * immediately terminate any operations that will be affected by + * the rate change. Callbacks must always return NOTIFY_DONE. + * + * CLK_ABORT_RATE_CHANGE: called if the rate change failed for some + * reason after CLK_PRE_RATE_CHANGE. In this case, all registered + * notifiers on the clock will be called with + * CLK_ABORT_RATE_CHANGE. Callbacks must always return + * NOTIFY_DONE. + * + * CLK_POST_RATE_CHANGE - called after the clock rate change has + * successfully completed. Callbacks must always return + * NOTIFY_DONE. + * + */ +#define CLK_PRE_RATE_CHANGE 1 +#define CLK_POST_RATE_CHANGE 2 +#define CLK_ABORT_RATE_CHANGE 3 + +#define CLK_PRE_ENABLE 4 +#define CLK_POST_ENABLE 5 +#define CLK_ABORT_ENABLE 6 + +#define CLK_PRE_DISABLE 7 +#define CLK_POST_DISABLE 8 +#define CLK_ABORT_DISABLE 9 + +extern int clk_notifier_register(struct clk *clk, struct notifier_block *nb); +extern int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb); + +#endif From 4b90a24492ff445d435d005c16eda3b43d214dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Fri, 26 Aug 2011 20:26:58 +0800 Subject: [PATCH 024/150] rk29: support DDR frequency scaling --- arch/arm/mach-rk29/Kconfig | 3 + arch/arm/mach-rk29/clock.c | 5 +- arch/arm/mach-rk29/cpufreq.c | 157 +++++++++++++++++++++++++++++++++-- 3 files changed, 157 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-rk29/Kconfig b/arch/arm/mach-rk29/Kconfig index a5c0611fe1a5..24c3ebbbc26e 100755 --- a/arch/arm/mach-rk29/Kconfig +++ b/arch/arm/mach-rk29/Kconfig @@ -157,6 +157,9 @@ config DDR_SDRAM_FREQ int "DDR SDRAM frequence (in MHz)" default 400 +config DDR_FREQ + bool "Enable DDR frequency scaling (EXPERIMENTAL)" + config DDR_RECONFIG bool "Enable dynamic DDR reconfiguration (EXPERIMENTAL)" diff --git a/arch/arm/mach-rk29/clock.c b/arch/arm/mach-rk29/clock.c index 41822edd7b6b..facedb0ea984 100755 --- a/arch/arm/mach-rk29/clock.c +++ b/arch/arm/mach-rk29/clock.c @@ -2654,7 +2654,6 @@ static void __init clk_enable_init_clocks(void) clk_enable_nolock(&clk_dma1); clk_enable_nolock(&clk_emem); clk_enable_nolock(&clk_intmem); - clk_enable_nolock(&clk_ddr); clk_enable_nolock(&clk_debug); clk_enable_nolock(&clk_tpiu); clk_enable_nolock(&clk_jtag); @@ -2715,7 +2714,7 @@ void __init rk29_clock_init2(enum periph_pll ppll_rate, enum codec_pll cpll_rate printk(KERN_INFO "Clocking rate (apll/dpll/cpll/gpll/core/aclk_cpu/hclk_cpu/pclk_cpu/aclk_periph/hclk_periph/pclk_periph): %ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld MHz", arm_pll_clk.rate / MHZ, ddr_pll_clk.rate / MHZ, codec_pll_clk.rate / MHZ, general_pll_clk.rate / MHZ, clk_core.rate / MHZ, aclk_cpu.rate / MHZ, hclk_cpu.rate / MHZ, pclk_cpu.rate / MHZ, aclk_periph.rate / MHZ, hclk_periph.rate / MHZ, pclk_periph.rate / MHZ); - printk(KERN_CONT " (20110812)\n"); + printk(KERN_CONT " (20110826)\n"); preset_lpj = loops_per_jiffy; } @@ -2789,6 +2788,8 @@ static void dump_clock(struct seq_file *s, struct clk *clk, int deep) case CRU_GENERAL_MODE_SLOW27: seq_printf(s, "slow27 "); break; } if (cru_readl(CRU_GPLL_CON) & PLL_BYPASS) seq_printf(s, "bypass "); + } else if (clk == &clk_ddr) { + rate = clk->recalc(clk); } if (rate >= MHZ) { diff --git a/arch/arm/mach-rk29/cpufreq.c b/arch/arm/mach-rk29/cpufreq.c index 75b42465d50b..5001606d06ed 100755 --- a/arch/arm/mach-rk29/cpufreq.c +++ b/arch/arm/mach-rk29/cpufreq.c @@ -27,7 +27,9 @@ #include #include #include +#include #include +#include #include <../../../drivers/video/rk29_fb.h> #define MHZ (1000*1000) @@ -51,6 +53,7 @@ static struct cpufreq_frequency_table default_freq_table[] = { static struct cpufreq_frequency_table *freq_table = default_freq_table; static struct clk *arm_clk; static struct clk *ddr_clk; +static unsigned long ddr_max_rate; static DEFINE_MUTEX(mutex); #ifdef CONFIG_REGULATOR @@ -81,8 +84,9 @@ enum { DEBUG_CHANGE = 1U << 0, DEBUG_TEMP = 1U << 1, DEBUG_DISP = 1U << 2, + DEBUG_DDR = 1U << 3, }; -static uint debug_mask = DEBUG_CHANGE; +static uint debug_mask = DEBUG_CHANGE | DEBUG_DDR; module_param(debug_mask, uint, 0644); #define dprintk(mask, fmt, ...) do { if (mask & debug_mask) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) @@ -126,6 +130,12 @@ module_param(limit_index_1008, int, 0444); static inline bool aclk_limit(void) { return false; } #endif +#ifdef CONFIG_DDR_FREQ +static void rk29_cpufreq_change_ddr_freq(unsigned long mhz); +#else +static inline void rk29_cpufreq_change_ddr_freq(unsigned long mhz) {} +#endif + static bool rk29_cpufreq_is_ondemand_policy(struct cpufreq_policy *policy) { char c = 0; @@ -240,16 +250,13 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP static void rk29_cpufreq_limit_by_disp(int *index) { - unsigned long ddr_rate; unsigned int frequency = freq_table[*index].frequency; int new_index = -1; if (!aclk_limit()) return; - ddr_rate = clk_get_rate(ddr_clk); - - if (ddr_rate < 492 * MHZ) { + if (ddr_max_rate < 492 * MHZ) { if (limit_index_816 >= 0 && frequency > 816 * KHZ) new_index = limit_index_816; } else { @@ -274,6 +281,7 @@ static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int ta const struct cpufreq_frequency_table *freq; int err = 0; bool force = relation & CPUFREQ_FORCE_CHANGE; + unsigned long new_arm_rate; relation &= ~CPUFREQ_FORCE_CHANGE; @@ -310,6 +318,7 @@ static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int ta freqs.new = freq->frequency; freqs.cpu = 0; new_vcore_uV = freq->index; + new_arm_rate = freqs.new * KHZ; dprintk(DEBUG_CHANGE, "%d Hz r %d(%c) selected %d Hz (%d uV)\n", target_freq, relation, relation & CPUFREQ_RELATION_H ? 'H' : 'L', freq->frequency, new_vcore_uV); @@ -330,6 +339,7 @@ static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int ta cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); dprintk(DEBUG_CHANGE, "pre change\n"); clk_set_rate(arm_clk, freqs.new * KHZ + aclk_limit()); + rk29_cpufreq_change_ddr_freq(0); dprintk(DEBUG_CHANGE, "post change\n"); freqs.new = clk_get_rate(arm_clk) / KHZ; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); @@ -448,6 +458,119 @@ static struct notifier_block rk29_cpufreq_fb_notifier = { }; #endif +#ifdef CONFIG_DDR_FREQ +static struct clk *ddr_pll_clk; +static struct clk *aclk_lcdc; +static bool ddr_pll_can_change; +static bool aclk_lcdc_disabled; +static bool disable_ddr_freq; +module_param(ddr_pll_can_change, bool, 0644); +module_param(aclk_lcdc_disabled, bool, 0644); +module_param(disable_ddr_freq, bool, 0644); +static unsigned long ddr_max_mhz; +static unsigned long ddr_min_mhz; +module_param(ddr_max_mhz, ulong, 0644); +module_param(ddr_min_mhz, ulong, 0644); +#define DDR_ARM_RATE (408 * MHZ) + +static void rk29_cpufreq_change_ddr_freq(unsigned long mhz) +{ + unsigned long flags; + unsigned long ddr_rate, arm_rate; + bool changed = false; + + if (disable_ddr_freq) + return; + + if (DEBUG_DDR & debug_mask) { + unsigned long _mhz = mhz; + ddr_rate = clk_get_rate(ddr_clk); + if (!mhz && ddr_pll_can_change && aclk_lcdc_disabled) { + arm_rate = clk_get_rate(arm_clk); + if (arm_rate <= DDR_ARM_RATE && ddr_rate == ddr_max_rate) + _mhz = ddr_min_mhz; + else if (arm_rate > DDR_ARM_RATE && ddr_rate < ddr_max_rate) + _mhz = ddr_max_mhz; + } + if (_mhz) { + unsigned long hz = _mhz * MHZ; + if (hz != ddr_rate) + dprintk(DEBUG_DDR, "ddr %lu -> %lu Hz\n", ddr_rate, hz); + } + } + + local_irq_save(flags); + ddr_rate = clk_get_rate(ddr_clk); + if (!mhz && ddr_pll_can_change && aclk_lcdc_disabled) { + arm_rate = clk_get_rate(arm_clk); + if (arm_rate <= DDR_ARM_RATE && ddr_rate == ddr_max_rate) + mhz = ddr_min_mhz; + else if (arm_rate > DDR_ARM_RATE && ddr_rate < ddr_max_rate) + mhz = ddr_max_mhz; + } + if (mhz && (mhz * MHZ) != ddr_rate) { + ddr_change_freq(mhz); + changed = true; + } + local_irq_restore(flags); + + if (changed) + dprintk(DEBUG_DDR, "ok, got %lu Hz\n", clk_get_rate(ddr_clk)); +} + +static int rk29_cpufreq_ddr_pll_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + switch (event) { + case CLK_PRE_ENABLE: + ddr_pll_can_change = false; + break; + case CLK_ABORT_ENABLE: + case CLK_POST_DISABLE: + ddr_pll_can_change = true; + break; + default: + return NOTIFY_DONE; + } + + if (!disable_ddr_freq) { + dprintk(DEBUG_DDR, "event: %lu ddr_pll_can_change: %d\n", event, ddr_pll_can_change); + rk29_cpufreq_change_ddr_freq(ddr_pll_can_change ? 0 : ddr_max_mhz); + } + return NOTIFY_OK; +} + +static struct notifier_block rk29_cpufreq_ddr_pll_notifier = { + .notifier_call = rk29_cpufreq_ddr_pll_notifier_event, +}; + +static int rk29_cpufreq_aclk_lcdc_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + switch (event) { + case CLK_PRE_ENABLE: + aclk_lcdc_disabled = false; + break; + case CLK_ABORT_ENABLE: + case CLK_POST_DISABLE: + aclk_lcdc_disabled = true; + break; + default: + return NOTIFY_DONE; + } + + if (!disable_ddr_freq) { + dprintk(DEBUG_DDR, "event: %lu aclk_lcdc_disabled: %d\n", event, aclk_lcdc_disabled); + rk29_cpufreq_change_ddr_freq(aclk_lcdc_disabled ? 0 : ddr_max_mhz); + } + return NOTIFY_OK; +} + +static struct notifier_block rk29_cpufreq_aclk_lcdc_notifier = { + .notifier_call = rk29_cpufreq_aclk_lcdc_notifier_event, +}; +#endif + static int rk29_cpufreq_init(struct cpufreq_policy *policy) { if (policy->cpu != 0) @@ -468,6 +591,24 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) ddr_clk = NULL; return err; } + ddr_max_rate = clk_get_rate(ddr_clk); + +#ifdef CONFIG_DDR_FREQ + ddr_max_mhz = ddr_max_rate / MHZ; + { + unsigned long ddr_min_rate; + ddr_min_rate = ddr_max_rate >> 1; + if (ddr_min_rate > 150 * MHZ) + ddr_min_rate >>= 1; + ddr_min_mhz = ddr_min_rate / MHZ; + } + + ddr_pll_clk = clk_get(NULL, "ddr_pll"); + aclk_lcdc = clk_get(NULL, "aclk_lcdc"); + + clk_notifier_register(ddr_pll_clk, &rk29_cpufreq_ddr_pll_notifier); + clk_notifier_register(aclk_lcdc, &rk29_cpufreq_aclk_lcdc_notifier); +#endif #ifdef CONFIG_REGULATOR vcore = regulator_get(NULL, "vcore"); @@ -492,7 +633,7 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP if (rk29_cpufreq_is_ondemand_policy(policy)) { - dprintk(DEBUG_TEMP, "start wq\n"); + dprintk(DEBUG_TEMP, "queue work\n"); queue_delayed_work(wq, &rk29_cpufreq_limit_by_temp_work, WORK_DELAY); } cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); @@ -505,6 +646,10 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) static int rk29_cpufreq_exit(struct cpufreq_policy *policy) { +#ifdef CONFIG_DDR_FREQ + clk_notifier_unregister(ddr_pll_clk, &rk29_cpufreq_ddr_pll_notifier); + clk_notifier_unregister(aclk_lcdc, &rk29_cpufreq_aclk_lcdc_notifier); +#endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP rk29fb_unregister_notifier(&rk29_cpufreq_fb_notifier); #endif From 607c70763c34daf68283b1bd938ced8fc0ebe74a Mon Sep 17 00:00:00 2001 From: chenli Date: Sat, 27 Aug 2011 11:08:21 +0800 Subject: [PATCH 025/150] rk29-ipp:check whether support deinterlacing 1.Mobile phone dose not support deinterlacing 2.SF will check whether IPP support deinterlacing first --- arch/arm/configs/rk29_phonesdk_defconfig | 1 + arch/arm/mach-rk29/include/mach/rk29-ipp.h | 2 +- drivers/staging/rk29/ipp/Kconfig | 10 ++++++++- drivers/staging/rk29/ipp/rk29-ipp.c | 24 +++++++++++++++++----- 4 files changed, 30 insertions(+), 7 deletions(-) mode change 100644 => 100755 drivers/staging/rk29/ipp/Kconfig diff --git a/arch/arm/configs/rk29_phonesdk_defconfig b/arch/arm/configs/rk29_phonesdk_defconfig index 67b6e12677a7..5d4b17a0e189 100755 --- a/arch/arm/configs/rk29_phonesdk_defconfig +++ b/arch/arm/configs/rk29_phonesdk_defconfig @@ -1825,6 +1825,7 @@ CONFIG_VIVANTE=y # IPP # CONFIG_RK29_IPP=y +CONFIG_DEINTERLACE=n # # CMMB diff --git a/arch/arm/mach-rk29/include/mach/rk29-ipp.h b/arch/arm/mach-rk29/include/mach/rk29-ipp.h index 36027c802451..488f6e8787e2 100755 --- a/arch/arm/mach-rk29/include/mach/rk29-ipp.h +++ b/arch/arm/mach-rk29/include/mach/rk29-ipp.h @@ -34,7 +34,7 @@ struct rk29_ipp_req { */ uint8_t store_clip_mode; - //deinterlace_enable 1:enable 0:disable + //deinterlace_enable 0:disable 1:enable 2:query uint8_t deinterlace_enable; //the sum of three paras should be 32,and single para should be less than 32 uint8_t deinterlace_para0; diff --git a/drivers/staging/rk29/ipp/Kconfig b/drivers/staging/rk29/ipp/Kconfig old mode 100644 new mode 100755 index f7599165d96c..81a951f3178d --- a/drivers/staging/rk29/ipp/Kconfig +++ b/drivers/staging/rk29/ipp/Kconfig @@ -3,6 +3,14 @@ config RK29_IPP tristate "ROCKCHIP RK29 IPP" default y help - rk29 ipp module. + rk29 ipp module. + +config DEINTERLACE + bool "Deinterlacing support" + depends on RK29_IPP + default y + help + Mobile phone dose not support deinterlacing + endmenu diff --git a/drivers/staging/rk29/ipp/rk29-ipp.c b/drivers/staging/rk29/ipp/rk29-ipp.c index 8d9862bd5629..05e8c652e863 100755 --- a/drivers/staging/rk29/ipp/rk29-ipp.c +++ b/drivers/staging/rk29/ipp/rk29-ipp.c @@ -308,7 +308,7 @@ int ipp_blit(const struct rk29_ipp_req *req) uint32_t dst0_YrgbMst=0,dst0_CbrMst=0; uint32_t ret = 0; uint32_t deinterlace_config = 0; - + //printk("ipp_blit\n"); if (drvdata == NULL) { /* ddl@rock-chips.com : check driver is normal or not */ printk("%s drvdata is NULL, IPP driver probe is fail!!\n", __FUNCTION__); @@ -846,8 +846,12 @@ int ipp_blit(const struct rk29_ipp_req *req) { deinterlace_config = (req->deinterlace_enable<<24) | (req->deinterlace_para0<<19) | (req->deinterlace_para1<<14) | (req->deinterlace_para2<<9); DBG("para0 %d, para1 %d, para2 %d,deinterlace_config %x\n",req->deinterlace_para0,req->deinterlace_para1,req->deinterlace_para2,deinterlace_config); - ipp_write((ipp_read(IPP_CONFIG)&0xFE0001FF)|deinterlace_config, IPP_CONFIG); - //printk("IPP_CONFIG2 = 0x%x\n",ipp_read(IPP_CONFIG)); + #ifdef CONFIG_DEINTERLACE + ipp_write((ipp_read(IPP_CONFIG)&0xFE0001FF)|deinterlace_config, IPP_CONFIG); + #else + printk("does not support deinterlacing!\n"); + ipp_write(ipp_read(IPP_CONFIG)&(~DEINTERLACE_ENABLE), IPP_CONFIG); //disable deinterlace + #endif } else { @@ -878,6 +882,7 @@ int ipp_blit(const struct rk29_ipp_req *req) ipp_write(ipp_read(IPP_CONFIG)&(~STORE_CLIP_MODE), IPP_CONFIG); } + /* Start the operation */ ipp_write(8, IPP_INT);// dsb(); @@ -932,7 +937,6 @@ int ipp_blit_sync(const struct rk29_ipp_req *req) //printk("ipp_blit_sync -------------------\n"); - ////If IPP is busy now,wait until it becomes idle mutex_lock(&drvdata->mutex); { @@ -1026,7 +1030,17 @@ static int stretch_blit(/*struct ipp_context *ctx,*/ unsigned long arg ,unsigne goto err_noput; } - + if(req.deinterlace_enable==2) + { + #ifdef CONFIG_DEINTERLACE + printk("ipp support deinterlacing\n"); + return 0; + #else + printk("ipp dose not support deinterlacing\n"); + return -EPERM; + #endif + } + if(cmd == IPP_BLIT_SYNC) { ret = ipp_blit_sync(&req); From 0d0ad63ed41d2ade702bce7c8458e5270022d9da Mon Sep 17 00:00:00 2001 From: yzq Date: Sat, 27 Aug 2011 15:36:05 +0800 Subject: [PATCH 026/150] rk29fb : fix : playing low resolution video in rotation err use win0 scale to fix the scale not enough in video rotation --- drivers/video/rk29_fb.c | 48 +++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index f5d8be3261eb..737b1f4c9cce 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -1055,18 +1055,19 @@ static int win0_set_par(struct fb_info *info) if(((var->rotate == 270)||(var->rotate == 90) || (var->rotate == 180)) && (inf->video_mode)) { #ifdef CONFIG_FB_ROTATE_VIDEO - // if(xact > screen->x_res) + if(xact > screen->x_res) { xact = screen->x_res; /* visible resolution */ yact = screen->y_res; xvir = screen->x_res; /* virtual resolution */ yvir = screen->y_res; - } // else { - // xact = var->yres; /* visible resolution */ - // yact = var->xres; - // xvir = var->yres_virtual; /* virtual resolution */ - // yvir = var->xres_virtual; - // } + } else { + xact = var->xres; /* visible resolution */ + yact = var->yres; + xvir = var->xres_virtual; /* virtual resolution */ + yvir = var->yres_virtual; + printk("xact=%d yact =%d \n",xact,yact); + } #else //CONFIG_FB_ROTATE_VIDEO printk("LCDC not support rotate!\n"); return -EINVAL; @@ -2041,16 +2042,16 @@ static int fb1_set_par(struct fb_info *info) ipp_req.dst0.fmt = 3; ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - // if(var->xres > screen->x_res) - // { + if(var->xres > screen->x_res) + { ipp_req.dst0.w = screen->x_res; ipp_req.dst0.h = screen->y_res; - // } else { - // ipp_req.dst0.w = var->yres; - // ipp_req.dst0.h = var->xres; - // } - //ipp_req.src_vir_w = ipp_req.src0.w; - //ipp_req.dst_vir_w = ipp_req.dst0.w; + } else { + ipp_req.dst0.w = var->xres; + ipp_req.dst0.h = var->yres; + } + ipp_req.dst_vir_w = (ipp_req.dst0.w + 15) & (~15); + ipp_req.timeout = 100; if(var->rotate == 90) ipp_req.flag = IPP_ROT_90; @@ -2250,16 +2251,16 @@ static int fb1_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) ipp_req.dst0.fmt = 3; ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; ipp_req.dst0.CbrMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*(2*dstoffset+1); - // if(var->xres > screen->x_res) - // { + if(var->xres > screen->x_res) + { ipp_req.dst0.w = screen->x_res; ipp_req.dst0.h = screen->y_res; - // } else { - // ipp_req.dst0.w = var->yres; - // ipp_req.dst0.h = var->xres; - // } - // ipp_req.src_vir_w = ipp_req.src0.w; - // ipp_req.dst_vir_w = ipp_req.dst0.w; + } else { + ipp_req.dst0.w = var->xres; + ipp_req.dst0.h = var->yres; + + } + ipp_req.dst_vir_w = (ipp_req.dst0.w + 15) & (~15); ipp_req.timeout = 100; if(var->rotate == 90) ipp_req.flag = IPP_ROT_90; @@ -2269,6 +2270,7 @@ static int fb1_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) ipp_req.flag = IPP_ROT_270; //ipp_do_blit(&ipp_req); ipp_blit_sync(&ipp_req); + fbprintk("yaddr=0x%x,uvaddr=0x%x\n",ipp_req.dst0.YrgbMst,ipp_req.dst0.CbrMst); yuv_phy[0] = ipp_req.dst0.YrgbMst; yuv_phy[1] = ipp_req.dst0.CbrMst; From 286811adddebad1b405b2fb89788232b49207f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 29 Aug 2011 10:24:26 +0800 Subject: [PATCH 027/150] pack-kernel.sh: exclude ddr_reconfig.c --- pack-kernel.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pack-kernel.sh b/pack-kernel.sh index b6cc914406e5..6bb24bf0bd16 100755 --- a/pack-kernel.sh +++ b/pack-kernel.sh @@ -25,6 +25,8 @@ sound/*rk28*.c sound/*rk28*.h include/*rk28* +arch/arm/mach-rk29/ddr_reconfig.c + drivers/staging/rk29/vivante/*.c drivers/staging/rk29/vivante/*.h From 49292f62619b75dc8a88766fa29784d4a80f5ce7 Mon Sep 17 00:00:00 2001 From: huangdesheng Date: Mon, 29 Aug 2011 10:59:25 +0800 Subject: [PATCH 028/150] add dynamic change rgb565 in postfb --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 2 +- drivers/video/rk29_fb.c | 36 +++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index ce80511a1da5..c99ddae92339 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -104,7 +104,7 @@ #else #define MEM_CAMIPP_SIZE 0 #endif -#define MEM_FB_SIZE (3*SZ_2M) +#define MEM_FB_SIZE (9*SZ_1M) #ifdef CONFIG_FB_WORK_IPP #define MEM_FBIPP_SIZE SZ_8M //1920 x 1080 x 2 x 2 //RGB565 = x2;RGB888 = x4 #else diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index 737b1f4c9cce..59898681b122 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -1384,7 +1384,7 @@ static int fb0_check_var(struct fb_var_screeninfo *var, struct fb_info *info) } if( (var->xoffset+var->xres)>var->xres_virtual || - (var->yoffset+var->yres)>var->yres_virtual ) + (var->yoffset+var->yres)>var->yres_virtual*2 ) { printk(">>>>>> fb0_check_var fail 2!!! \n"); printk(">>>>>> (%d+%d)>%d || ", var->xoffset,var->xres,var->xres_virtual); @@ -1456,6 +1456,8 @@ static int fb0_set_par(struct fb_info *info) ipp_req.dst0.fmt = IPP_RGB_565; #endif offset = (ypos_virtual*xres_virtual + xpos_virtual)*(inf->fb0_color_deepth ? 4:2); + if(ypos_virtual == 3*var->yres && inf->fb0_color_deepth) + offset -= var->yres * var->xres *2; break; case 32: // rgb888 default: @@ -1466,11 +1468,26 @@ static int fb0_set_par(struct fb_info *info) fb0_second_buff_bits = 32; fix->line_length = 4 * xres_virtual; #ifdef CONFIG_FB_SCALING_OSD - dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*4; + dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*4; + ipp_req.src0.fmt = IPP_XRGB_8888; ipp_req.dst0.fmt = IPP_XRGB_8888; #endif offset = (ypos_virtual*xres_virtual + xpos_virtual)*4; + + if(ypos_virtual >= 2*var->yres) + { + par->format = 1; + #ifdef CONFIG_FB_SCALING_OSD + dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*2; + ipp_req.src0.fmt = IPP_RGB_565; + ipp_req.dst0.fmt = IPP_RGB_565; + #endif + if(ypos_virtual == 3*var->yres) + { + offset -= var->yres * var->xres *2; + } + } break; } @@ -1579,6 +1596,8 @@ static int fb0_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) ipp_req.dst0.fmt = IPP_RGB_565; #endif offset = (ypos_virtual*var1->xres_virtual + xpos_virtual)*(inf->fb0_color_deepth ? 4:2); + if(ypos_virtual == 3*var->yres && inf->fb0_color_deepth) + offset -= var->yres * var->xres *2; break; case 32: // rgb888 #ifdef CONFIG_FB_SCALING_OSD @@ -1587,6 +1606,19 @@ static int fb0_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) ipp_req.dst0.fmt = IPP_XRGB_8888; #endif offset = (ypos_virtual*var1->xres_virtual + xpos_virtual)*4; + if(ypos_virtual >= 2*var->yres) + { + par->format = 1; + #ifdef CONFIG_FB_SCALING_OSD + dstoffset = ((ypos_virtual*screen->y_res/var->yres) *screen->x_res + (xpos_virtual*screen->x_res)/var->xres )*2; + ipp_req.src0.fmt = IPP_RGB_565; + ipp_req.dst0.fmt = IPP_RGB_565; + #endif + if(ypos_virtual == 3*var->yres) + { + offset -= var->yres * var->xres *2; + } + } break; default: return -EINVAL; From 690206ef56afc2ce9717525fa78bee0bd45f21fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E4=BC=9F=E7=AB=8B?= Date: Mon, 29 Aug 2011 14:53:42 +0800 Subject: [PATCH 029/150] register the touchscreen(eeti_egalax) in the earlysuspend to save power consume --- drivers/input/touchscreen/eeti_egalax_i2c.c | 58 ++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/drivers/input/touchscreen/eeti_egalax_i2c.c b/drivers/input/touchscreen/eeti_egalax_i2c.c index 026c18bfe5df..65838a382435 100755 --- a/drivers/input/touchscreen/eeti_egalax_i2c.c +++ b/drivers/input/touchscreen/eeti_egalax_i2c.c @@ -41,6 +41,10 @@ #include #include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + //#define DEBUG #ifdef CONFIG_EETI_EGALAX_DEBUG #define TS_DEBUG(fmt,args...) printk( KERN_DEBUG "[egalax_i2c]: " fmt, ## args) @@ -67,6 +71,8 @@ static int global_minor = 0; #define EGALAX_IOCWAKEUP _IO(EGALAX_IOC_MAGIC, 1) #define EGALAX_IOC_MAXNR 1 +#define EETI_EARLYSUSPEND_LEVEL 151 + struct point_data { short Status; short X; @@ -83,6 +89,13 @@ struct _egalax_i2c { int irq; }; +#ifdef CONFIG_HAS_EARLYSUSPEND +struct suspend_info { + struct early_suspend early_suspend; + struct _egalax_i2c *egalax_i2c; +}; +#endif + struct egalax_char_dev { int OpenCnts; @@ -588,11 +601,45 @@ static int egalax_i2c_resume(struct i2c_client *client) return 0; } + +#ifdef CONFIG_HAS_EARLYSUSPEND + +static void egalax_i2c_early_suspend(struct early_suspend *h) +{ + pm_message_t mesg = {.event = 0}; + struct suspend_info *info = container_of(h,struct suspend_info,early_suspend); + struct i2c_client *client = info->egalax_i2c->client; + egalax_i2c_suspend(client,mesg); + +} +static void egalax_i2c_early_resume(struct early_suspend *h) +{ + + struct suspend_info *info = container_of(h,struct suspend_info,early_suspend); + struct i2c_client *client = info->egalax_i2c->client; + + egalax_i2c_resume(client); + +} + +#endif + + + #else #define egalax_i2c_suspend NULL #define egalax_i2c_resume NULL #endif +#ifdef CONFIG_HAS_EARLYSUSPEND +static struct suspend_info suspend_info = { + .early_suspend.suspend = egalax_i2c_early_suspend, + .early_suspend.resume = egalax_i2c_early_resume, + .early_suspend.level = EETI_EARLYSUSPEND_LEVEL, +}; +#endif + + static int __devinit egalax_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; @@ -654,6 +701,13 @@ if (pdata->init_platform_hw) device_init_wakeup(&client->dev, 0); #endif +#ifdef CONFIG_HAS_EARLYSUSPEND + + + suspend_info.egalax_i2c = p_egalax_i2c_dev; + register_early_suspend(&suspend_info.early_suspend); +#endif + printk(KERN_DEBUG "[egalax_i2c]: probe done\n"); return 0; @@ -722,8 +776,8 @@ static struct i2c_driver egalax_i2c_driver = { .id_table = egalax_i2c_idtable, .probe = egalax_i2c_probe, .remove = __devexit_p(egalax_i2c_remove), - .suspend = egalax_i2c_suspend, - .resume = egalax_i2c_resume, + //.suspend = egalax_i2c_suspend, + //.resume = egalax_i2c_resume, }; static const struct file_operations egalax_cdev_fops = { From 6aaaeefba25d07ef8a20df5393f54050ea2a2767 Mon Sep 17 00:00:00 2001 From: ddl Date: Mon, 29 Aug 2011 15:09:42 +0800 Subject: [PATCH 030/150] camera: fix mt9t111 may have not send video data after init, and update gc0309 --- drivers/media/video/gc0309.c | 25 ++++++++++++++----------- drivers/media/video/mt9t111.c | 24 +++++++++--------------- 2 files changed, 23 insertions(+), 26 deletions(-) mode change 100644 => 100755 drivers/media/video/gc0309.c mode change 100644 => 100755 drivers/media/video/mt9t111.c diff --git a/drivers/media/video/gc0309.c b/drivers/media/video/gc0309.c old mode 100644 new mode 100755 index 404628c9f9fe..f830b2870986 --- a/drivers/media/video/gc0309.c +++ b/drivers/media/video/gc0309.c @@ -29,7 +29,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); printk(KERN_WARNING fmt , ## arg); } while (0) #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__) -#define SENSOR_DG(format, ...) dprintk(0, format, ## __VA_ARGS__) +#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__) #define _CONS(a,b) a##b @@ -425,7 +425,18 @@ static struct reginfo sensor_init_data[] = ///////////////////////////////////////////////////////////////////// /////////////////////////// eeintp_t/////////////////////////////// #endif - + {0x23,0x00}, + {0x2d,0x0a}, // 0x08 + {0x20,0xff}, + {0xd2,0x90}, + {0x73,0x00}, + {0x77,0x54}, + + {0xb3,0x40}, + {0xb4,0x80}, + {0xba,0x00}, + {0xbb,0x00}, + {0x00,0x00} }; @@ -1656,21 +1667,16 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f) struct reginfo *winseqe_set_addr=NULL; int ret=0, set_w,set_h; - SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); if (sensor->info_priv.pixfmt != pix->pixelformat) { - SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); switch (pix->pixelformat) { - SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); case V4L2_PIX_FMT_YUYV: { - SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); winseqe_set_addr = sensor_ClrFmt_YUYV; break; } case V4L2_PIX_FMT_UYVY: { - SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); winseqe_set_addr = sensor_ClrFmt_UYVY; break; } @@ -1689,7 +1695,6 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f) set_w = pix->width; set_h = pix->height; - SENSOR_TR("------------------------------%s, %s ,%d,\n",SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); if (((set_w <= 176) && (set_h <= 144)) && sensor_qcif[0].reg) { winseqe_set_addr = sensor_qcif; @@ -1755,9 +1760,7 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f) sensor->info_priv.snap2preview = false; } SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h); - } - else - { + } else { SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h); } diff --git a/drivers/media/video/mt9t111.c b/drivers/media/video/mt9t111.c old mode 100644 new mode 100755 index 14cb2d4a9096..2f590d8dd4ae --- a/drivers/media/video/mt9t111.c +++ b/drivers/media/video/mt9t111.c @@ -31,7 +31,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); printk(KERN_WARNING fmt , ## arg); } while (0) #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__) -#define SENSOR_DG(format, ...) dprintk(0, format, ## __VA_ARGS__) +#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__) #define _CONS(a,b) a##b #define CONS(a,b) _CONS(a,b) @@ -1813,7 +1813,7 @@ static struct reginfo sensor_init_data[] = {0x0014, 0x2447, WORD_LEN, 0 }, // PLL_CONTROL {0x0014, 0x2047, WORD_LEN, 0 }, // PLL_CONTROL -{ SEQUENCE_WAIT_MS,10, WORD_LEN, 0}, +{SEQUENCE_WAIT_MS,50, WORD_LEN, 0}, // POLL PLL_CONTROL::PLL_LOCK => 0x01 {0x0014, 0x2046, WORD_LEN, 0 }, // PLL_CONTROL {0x0022, 0x01E0, WORD_LEN, 0 }, // VDD_DIS_COUNTER//208 @@ -1826,7 +1826,7 @@ static struct reginfo sensor_init_data[] = {0x0018, 0x402C, WORD_LEN, 0 }, // STANDBY_CONTROL_AND_STATUS {0x001e,0x0006, WORD_LEN, 0 }, //adjust slew rate to minimize EMI -{ SEQUENCE_WAIT_MS,10, WORD_LEN, 0}, +{SEQUENCE_WAIT_MS,100, WORD_LEN, 0}, // POLL STANDBY_CONTROL_AND_STATUS::STANDBY_DONE => 0x00 //{0x098E, 0x6006, WORD_LEN, 0 }, // MCU_ADDRESS @@ -7238,12 +7238,10 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f) ret |= sensor_write_array(client, sensor_Preview2Capture); if (ret != 0) { - SENSOR_TR("-----------%s : %s : %d Preview 2 Capture failed\n", SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); - goto sensor_s_fmt_end; - } - - - SENSOR_TR("-----------%s : %s : %d Preview 2 Capture success!\n", SENSOR_NAME_STRING(),__FUNCTION__,__LINE__); + SENSOR_TR("%s Preview 2 Capture failed\n", SENSOR_NAME_STRING()); + goto sensor_s_fmt_end; + } + SENSOR_DG("%s Preview 2 Capture success!\n", SENSOR_NAME_STRING()); #if CONFIG_SENSOR_Flash if( (sensor->info_priv.flash == 1)|| (sensor->info_priv.flash == 2)) { @@ -7271,7 +7269,7 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *f) mdelay(200); //delay microseconds to forbid invalidate data - SENSOR_TR("%s Capture 2 Preview success\n", SENSOR_NAME_STRING()); + SENSOR_DG("%s Capture 2 Preview success\n", SENSOR_NAME_STRING()); /* #if CONFIG_SENSOR_Flash if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) { @@ -8083,8 +8081,6 @@ static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_c if (sensor_set_flash(icd, qctrl,ext_ctrl->value) != 0) return -EINVAL; sensor->info_priv.flash = ext_ctrl->value; - - SENSOR_DG("--------flash------------%s flash is %x %d\n",SENSOR_NAME_STRING(), sensor->info_priv.flash,__LINE__); break; } #endif @@ -8126,9 +8122,7 @@ static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_control { struct i2c_client *client = sd->priv; struct soc_camera_device *icd = client->dev.platform_data; - int i, error_cnt=0, error_idx=-1; - - SENSOR_DG("\n%s..%s.. ext_ctrl->count = %d\n",__FUNCTION__,SENSOR_NAME_STRING(),ext_ctrl->count); + int i, error_cnt=0, error_idx=-1; for (i=0; icount; i++) { if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) { From 8145d31536233294ba9e7505bb0dbc6318f9e239 Mon Sep 17 00:00:00 2001 From: zyw Date: Mon, 29 Aug 2011 15:28:04 +0800 Subject: [PATCH 031/150] update fb for close win0 when overlay open, close win1 when overlay close --- drivers/video/rk29_fb.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index 59898681b122..fdba47c940a7 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -1007,11 +1007,14 @@ static int win0_blank(int blank_mode, struct fb_info *info) { case FB_BLANK_UNBLANK: LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(1)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); + LcdWrReg(inf, REG_CFG_DONE, 0x01); break; + case FB_BLANK_NORMAL: + LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(0)); + break; default: LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(0)); - LcdWrReg(inf, REG_CFG_DONE, 0x01); + LcdWrReg(inf, REG_CFG_DONE, 0x01); #ifdef CONFIG_DDR_RECONFIG msleep(40); #endif @@ -1180,12 +1183,17 @@ static int win1_blank(int blank_mode, struct fb_info *info) { case FB_BLANK_UNBLANK: LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE, v_W1_ENABLE(1)); + LcdWrReg(inf, REG_CFG_DONE, 0x01); break; + case FB_BLANK_NORMAL: + LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE, v_W1_ENABLE(0)); + break; default: LcdMskReg(inf, SYS_CONFIG, m_W1_ENABLE, v_W1_ENABLE(0)); + LcdWrReg(inf, REG_CFG_DONE, 0x01); break; } - LcdWrReg(inf, REG_CFG_DONE, 0x01); + mcu_refresh(inf); return 0; @@ -2163,9 +2171,9 @@ int fb1_open(struct fb_info *info, int user) return -EACCES; } else { par->refcount++; + win0_blank(FB_BLANK_NORMAL, info); fb0_set_par(inf->fb0); - fb0_pan_display(&inf->fb0->var, inf->fb0); - win0_blank(FB_BLANK_POWERDOWN, info); + rk29fb_notify(inf, RK29FB_EVENT_FB1_ON); return 0; } @@ -2187,12 +2195,8 @@ int fb1_release(struct fb_info *info, int user) inf->video_mode = 0; par->par_seted = 0; par->addr_seted = 0; - //win0_blank(FB_BLANK_POWERDOWN, info); + win1_blank(FB_BLANK_NORMAL, info); fb0_set_par(inf->fb0); - fb0_pan_display(&inf->fb0->var, inf->fb0); - win1_blank(FB_BLANK_POWERDOWN, info); - // wait for lcdc stop access memory - //msleep(50); // unmap memory info->screen_base = 0; @@ -2601,7 +2605,7 @@ static void rk29fb_early_suspend(struct early_suspend *h) if(inf->clk){ clk_disable(inf->aclk); } - clk_disable(inf->pd_display); + //clk_disable(inf->pd_display); inf->in_suspend = 1; } @@ -2626,7 +2630,7 @@ static void rk29fb_early_resume(struct early_suspend *h) { inf->in_suspend = 0; fbprintk(">>>>>> enable the lcdc clk! \n"); - clk_enable(inf->pd_display); + // clk_enable(inf->pd_display); clk_enable(inf->aclk_disp_matrix); clk_enable(inf->hclk_cpu_display); clk_enable(inf->clk); From 5d2546fbaacdea5b0101004c097c4b263c4e356e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=8D=AB=E5=9B=BD?= Date: Mon, 29 Aug 2011 17:56:49 +0800 Subject: [PATCH 032/150] =?UTF-8?q?=E6=9B=B4=E6=96=B0rt5631=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=EF=BC=9A=E8=A7=A3=E5=86=B3TX=5FLRCK=E4=B8=8ERX=5FLRCK?= =?UTF-8?q?=E5=86=B2=E7=AA=81=E9=80=A0=E6=88=90=E7=A0=B4=E9=9F=B3=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sound/soc/codecs/rt5631.c | 871 +++++++++++++++++++++++++++++++---- sound/soc/rk29/Kconfig | 7 + sound/soc/rk29/rk29_i2s.c | 18 + sound/soc/rk29/rk29_rt5631.c | 20 +- 4 files changed, 815 insertions(+), 101 deletions(-) diff --git a/sound/soc/codecs/rt5631.c b/sound/soc/codecs/rt5631.c index 00e6b860fa8d..9b5d72587aa1 100644 --- a/sound/soc/codecs/rt5631.c +++ b/sound/soc/codecs/rt5631.c @@ -28,19 +28,35 @@ #include #include "rt5631.h" +#include -#define RT5631_VERSION "0.01 alsa 1.0.21" +#if 1 +#define DBG(x...) printk(x) +#else +#define DBG(x...) +#endif + +#define RT5631_VERSION "0.02 alsa 1.0.21" #define ALSA_SOC_VERSION "1.0.21" static const u16 rt5631_reg[0x80]; static int timesofbclk = 32; module_param(timesofbclk, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(timeofbclk, "relationship between bclk and fs"); - + +#define RT5631_ALC_DAC_FUNC_ENA 0 //ALC functio for DAC +#define RT5631_ALC_ADC_FUNC_ENA 1 //ALC function for ADC +#define RT5631_EQ_FUNC_ENA 1 +#define RT5631_SPK_TIMER 1 //if enable this, MUST enable RT5631_EQ_FUNC_ENA first! + #define VIRTUAL_POWER_CONTROL 0x90 /* * bit0: spkl amp power * bit1: spkr amp power * bit2: dmic flag + * bit[4~7] for EQ function + * bit[8] for dacl->hpl + * bit[9] for dacr->hpr + * */ struct rt5631_priv { @@ -48,12 +64,16 @@ struct rt5631_priv { int sysclk; int dmic_used_flag; }; - +#if (RT5631_SPK_TIMER == 1) +static struct timer_list spk_timer; +struct work_struct spk_work; +static bool last_is_spk = false; // need modify. +#endif static unsigned int reg90; static int rt5631_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int val); static unsigned int rt5631_read(struct snd_soc_codec *codec, unsigned int reg); #define rt5631_reset(c) rt5631_write(c, RT5631_RESET, 0) -#define rt5631_write_mask(c, reg, val, mask) snd_soc_update_bits(c, reg, mask, val) +//#define rt5631_write_mask(c, reg, val, mask) snd_soc_update_bits(c, reg, mask, val) static int rt5631_reg_init(struct snd_soc_codec *codec); static struct snd_soc_device *rt5631_socdev; @@ -90,6 +110,7 @@ static int rt5631_write(struct snd_soc_codec *codec, unsigned int reg, unsigned if (reg > 0x7e) { if (reg == 0x90) reg90 = val; + return 0; } data[0] = reg; @@ -98,10 +119,10 @@ static int rt5631_write(struct snd_soc_codec *codec, unsigned int reg, unsigned if (codec->hw_write(codec->control_data, data, 3) == 3) { rt5631_write_reg_cache(codec, reg, val); - printk(KERN_INFO "%s reg=0x%x, val=0x%x\n", __func__, reg, val); + DBG(KERN_INFO "%s reg=0x%x, val=0x%x\n", __func__, reg, val); return 0; } else { - printk(KERN_ERR "%s failed\n", __func__); + DBG(KERN_ERR "%s failed\n", __func__); return -EIO; } } @@ -122,52 +143,180 @@ static unsigned int rt5631_read(struct snd_soc_codec *codec, unsigned int reg) value = (data[0]<<8) | data[1]; - printk("rt5631_read reg%x=%x\n",reg,value); + //DBG("rt5631_read reg%x=%x\n",reg,value); return value; } -#define rt5631_write_index_reg(c, addr, data) \ -{ \ - rt5631_write(c, 0x6a, addr); \ - rt5631_write(c, 0x6c, data); \ + +int rt5631_write_mask(struct snd_soc_codec *codec, unsigned int reg,unsigned int value,unsigned int mask) +{ + + unsigned char RetVal=0; + unsigned int CodecData; + +// DBG(KERN_INFO "rt5631_write_mask ok, reg = %x, value = %x ,mask= %x\n", reg, value,mask); + + if(!mask) + return 0; + + if(mask!=0xffff) + { + CodecData=rt5631_read(codec,reg); + CodecData&=~mask; + CodecData|=(value&mask); + RetVal=rt5631_write(codec,reg,CodecData); + } + else + { + RetVal=rt5631_write(codec,reg,value); + } + + return RetVal; } +void rt5631_write_index(struct snd_soc_codec *codec, unsigned int reg, + unsigned int value) +{ + + rt5631_write(codec,0x6a,reg); + rt5631_write(codec,0x6c,value); +} + +unsigned int rt5631_read_index(struct snd_soc_codec *codec, unsigned int reg) +{ + unsigned int value = 0x0; + rt5631_write(codec,0x6a,reg); + value=rt5631_read(codec,0x6c); + + return value; +} + +void rt5631_write_index_mask(struct snd_soc_codec *codec, unsigned int reg,unsigned int value,unsigned int mask) +{ + +// unsigned char RetVal=0; + unsigned int CodecData; + +// DBG(KERN_INFO "rt5631_write_index_mask ok, reg = %x, value = %x ,mask= %x\n", reg, value,mask); + + if(!mask) + return; + + if(mask!=0xffff) + { + CodecData=rt5631_read_index(codec,reg); + CodecData&=~mask; + CodecData|=(value&mask); + rt5631_write_index(codec,reg,CodecData); + } + else + { + rt5631_write_index(codec,reg,value); + } +} + struct rt5631_init_reg{ u8 reg; u16 val; }; +#ifndef DEF_VOL +#define DEF_VOL 0xc0 +#endif +#ifndef DEF_VOL_SPK +#define DEF_VOL_SPK 0xc4 +#endif + static struct rt5631_init_reg init_list[] = { - {RT5631_SPK_OUT_VOL , 0xc8c8}, //speaker channel volume select SPKMIXER,0DB by default - {RT5631_HP_OUT_VOL , 0xc0c0}, //Headphone channel volume select OUTMIXER,0DB by default + {RT5631_SPK_OUT_VOL , (DEF_VOL_SPK<<8) | DEF_VOL_SPK}, //speaker channel volume select SPKMIXER,0DB by default + {RT5631_HP_OUT_VOL , (DEF_VOL<<8) | DEF_VOL}, //Headphone channel volume select OUTMIXER,0DB by default {RT5631_MONO_AXO_1_2_VOL , 0xf0c0}, //AXO1/AXO2 channel volume select OUTMIXER,0DB by default {RT5631_ADC_REC_MIXER , 0xb0f0}, //Record Mixer source from Mic1 by default - {RT5631_MIC_CTRL_2 , 0x5500}, //Mic1/Mic2 boost 40DB by default + {RT5631_ADC_CTRL_1 , 0x0006},//STEREO ADC CONTROL 1 + {RT5631_MIC_CTRL_2 , 0x6600},//0x8800},//0x5500}, //Mic1/Mic2 boost 40DB by default + +#if RT5631_ALC_ADC_FUNC_ENA + + {RT5631_ALC_CTRL_1 , 0x0a0f},//ALC CONTROL 1 + {RT5631_ALC_CTRL_2 , 0x0005},//ALC CONTROL 2 + {RT5631_ALC_CTRL_3 , 0xe080},//ALC CONTROL 3 + +#endif {RT5631_OUTMIXER_L_CTRL , 0xdfC0}, //DAC_L-->OutMixer_L by default {RT5631_OUTMIXER_R_CTRL , 0xdfC0}, //DAC_R-->OutMixer_R by default {RT5631_AXO1MIXER_CTRL , 0x8840}, //OutMixer_L-->AXO1Mixer by default {RT5631_AXO2MIXER_CTRL , 0x8880}, //OutMixer_R-->AXO2Mixer by default {RT5631_SPK_MIXER_CTRL , 0xd8d8}, //DAC-->SpeakerMixer {RT5631_SPK_MONO_OUT_CTRL , 0x6c00}, //Speaker volume-->SPOMixer(L-->L,R-->R) - {RT5631_GEN_PUR_CTRL_REG , 0x4e00}, //Speaker AMP ratio gain is 1.44X - {RT5631_SPK_MONO_HP_OUT_CTRL, 0x0000}, //HP from OutMixer,speaker out from SpeakerOut Mixer + {RT5631_GEN_PUR_CTRL_REG , 0x2e00}, //Speaker AMP ratio gain is 1.27x +#if defined(CONFIG_ADJUST_VOL_BY_CODEC) + {RT5631_SPK_MONO_HP_OUT_CTRL, 0x0000}, //HP from outputmixer,speaker out from SpeakerOut Mixer +#else + {RT5631_SPK_MONO_HP_OUT_CTRL, 0x000c}, //HP from DAC,speaker out from SpeakerOut Mixer +#endif {RT5631_DEPOP_FUN_CTRL_2 , 0x8000}, //HP depop by register control {RT5631_INT_ST_IRQ_CTRL_2 , 0x0f18}, //enable HP zero cross {RT5631_MIC_CTRL_1 , 0x8000}, //set mic 1 to differnetial mode -// {RT5631_GPIO_CTRL , 0x0000}, //set GPIO to input pin + {RT5631_GPIO_CTRL , 0x0000}, //set GPIO to input pin // {RT5631_JACK_DET_CTRL , 0x4e80}, //Jack detect for GPIO,high is HP,low is speaker -// {RT5631_JACK_DET_CTRL , 0x4bc0}, //Jack detect for GPIO,high is speaker,low is hp + {RT5631_JACK_DET_CTRL , 0x4bc0}, //Jack detect for GPIO,high is speaker,low is hp }; #define RT5631_INIT_REG_LEN ARRAY_SIZE(init_list) +//************************************************************************************************* +//************************************************************************************************* +#if (RT5631_EQ_FUNC_ENA==1) +//EQ parameter +enum +{ + NORMAL=0, + CLUB, + DANCE, + LIVE, + POP, + ROCK, + OPPO, + TREBLE, + BASS, + HFREQ, + SPK_FR +}; + +typedef struct _HW_EQ_PRESET +{ + u16 HwEqType; + u16 EqValue[22]; + u16 HwEQCtrl; + +}HW_EQ_PRESET; + + +HW_EQ_PRESET HwEq_Preset[]={ +/* 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x6e*/ + {NORMAL,{0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000},0x0000}, + {CLUB ,{0x1C10,0x0000,0xC1CC,0x1E5D,0x0699,0xCD48,0x188D,0x0699,0xC3B6,0x1CD0,0x0699,0x0436,0x0000,0x0000,0x0000,0x0000},0x000E}, + {DANCE ,{0x1F2C,0x095B,0xC071,0x1F95,0x0616,0xC96E,0x1B11,0xFC91,0xDCF2,0x1194,0xFAF2,0x0436,0x0000,0x0000,0x0000,0x0000},0x000F}, + {LIVE ,{0x1EB5,0xFCB6,0xC24A,0x1DF8,0x0E7C,0xC883,0x1C10,0x0699,0xDA41,0x1561,0x0295,0x0436,0x0000,0x0000,0x0000,0x0000},0x000F}, + {POP ,{0x1EB5,0xFCB6,0xC1D4,0x1E5D,0x0E23,0xD92E,0x16E6,0xFCB6,0x0000,0x0969,0xF988,0x0436,0x0000,0x0000,0x0000,0x0000},0x000F}, + {ROCK ,{0x1EB5,0xFCB6,0xC071,0x1F95,0x0424,0xC30A,0x1D27,0xF900,0x0C5D,0x0FC7,0x0E23,0x0436,0x0000,0x0000,0x0000,0x0000},0x000F}, + {OPPO ,{0x0000,0x0000,0xCA4A,0x17F8,0x0FEC,0xCA4A,0x17F8,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000},0x000F}, + {TREBLE,{0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x188D,0x1699,0x0000,0x0000,0x0000},0x0010}, + {BASS ,{0x1A43,0x0C00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000},0x0001}, + {HFREQ, {0x1BBC,0x0000,0xC9A4,0x1BBC,0x0000,0x2997,0x142D,0xFCB6,0xEF01,0x1BBC,0x0000,0xE835,0x0FEC,0xC66E,0x1A29,0x1CEE},0x0014}, + {SPK_FR,{0x1CD4,0xF405,0xe0bf,0x0f9e,0xfa19,0x07CA,0x12AF,0xF805,0xE904,0x1C10,0x0000,0x1C8B,0x0000,0xc5e1,0x1afb,0x1d46},0x0090}, +}; + +#endif +//************************************************************************************************* +//************************************************************************************************* static int rt5631_reg_init(struct snd_soc_codec *codec) { int i; - + for (i = 0; i < RT5631_INIT_REG_LEN; i ++) { rt5631_write(codec, init_list[i].reg, init_list[i].val); } @@ -181,6 +330,13 @@ static const char *rt5631_mono_source_sel[] = {"MONOMIX", "MONOIN_RX", "VDAC"}; static const char *rt5631_input_mode_source_sel[] = {"Single-end", "Differential"}; static const char *rt5631_mic_boost[] = {"Bypass", "+20db", "+24db", "+30db", "+35db", "+40db", "+44db", "+50db", "+52db"}; +#if (RT5631_EQ_FUNC_ENA==1) +static const char *rt5631_eq_sel[] = {"NORMAL", "CLUB","DANCE", "LIVE","POP", + "ROCK", "OPPO", "TREBLE", "BASS"}; +#endif + +static const char *rt5631_hpl_source_sel[] = {"LEFT HPVOL","LEFT DAC"}; +static const char *rt5631_hpr_source_sel[] = {"RIGHT HPVOL","RIGHT DAC"}; static const struct soc_enum rt5631_enum[] = { SOC_ENUM_SINGLE(RT5631_SPK_MONO_HP_OUT_CTRL, 14, 4, rt5631_spol_source_sel), /*0*/ @@ -191,6 +347,11 @@ SOC_ENUM_SINGLE(RT5631_MIC_CTRL_1, 7, 2, rt5631_input_mode_source_sel), /*4*/ SOC_ENUM_SINGLE(RT5631_MONO_INPUT_VOL, 15, 2, rt5631_input_mode_source_sel), /*5*/ SOC_ENUM_SINGLE(RT5631_MIC_CTRL_2, 12, 9, rt5631_mic_boost), /*6*/ SOC_ENUM_SINGLE(RT5631_MIC_CTRL_2, 8, 9, rt5631_mic_boost), /*7*/ +SOC_ENUM_SINGLE(RT5631_SPK_MONO_HP_OUT_CTRL, 3, 2, rt5631_hpl_source_sel), /*8*/ +SOC_ENUM_SINGLE(RT5631_SPK_MONO_HP_OUT_CTRL, 2, 2, rt5631_hpr_source_sel), /*9*/ +#if (RT5631_EQ_FUNC_ENA==1) +SOC_ENUM_SINGLE(VIRTUAL_POWER_CONTROL, 4, 9, rt5631_eq_sel), /*10*/ +#endif }; static int rt5631_dmic_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) @@ -236,6 +397,111 @@ static int rt5631_dmic_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va return 0; } + +//************************************************************************************************* +//for EQ function +//************************************************************************************************* +#if (RT5631_EQ_FUNC_ENA==1) + +static void rt5631_update_eqmode(struct snd_soc_codec *codec, int mode) +{ + u16 HwEqIndex=0; + + rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x8380, 0x8380); + + if(mode==NORMAL) + { + /*clear EQ parameter*/ + for(HwEqIndex=0;HwEqIndex<=0x0f;HwEqIndex++) + { + rt5631_write_index(codec, HwEqIndex, HwEq_Preset[mode].EqValue[HwEqIndex]); + } + + rt5631_write_mask(codec,0x6e,0x0000,0x003f); //disable Hardware LP,BP1,BP2,BP3,HP1,HP2 block Control + + rt5631_write_index_mask(codec,0x11,0x0000,0x8000); /*disable EQ block*/ + } + else + { + rt5631_write_index_mask(codec,0x11,0x8000,0x8000); /*enable EQ block*/ + + rt5631_write(codec,0x6e,HwEq_Preset[mode].HwEQCtrl); + + /*Fill EQ parameter*/ + for(HwEqIndex=0;HwEqIndex<=0x0f;HwEqIndex++) + { + rt5631_write_index(codec, HwEqIndex,HwEq_Preset[mode].EqValue[HwEqIndex]); + } + //update EQ parameter + rt5631_write_mask(codec, 0x6e,0x4000,0x4000); + } +} + + +static int rt5631_eq_sel_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + unsigned short val; + unsigned short mask, bitmask; + + for (bitmask = 1; bitmask < e->max; bitmask <<= 1) + ; + if (ucontrol->value.enumerated.item[0] > e->max - 1) + return -EINVAL; + val = ucontrol->value.enumerated.item[0] << e->shift_l; + mask = (bitmask - 1) << e->shift_l; + if (e->shift_l != e->shift_r) { + if (ucontrol->value.enumerated.item[1] > e->max - 1) + return -EINVAL; + val |= ucontrol->value.enumerated.item[1] << e->shift_r; + mask |= (bitmask - 1) << e->shift_r; + } + + snd_soc_update_bits(codec, e->reg, mask, val); + + DBG( "value=%d\n", ucontrol->value.enumerated.item[0]); + rt5631_update_eqmode(codec, ucontrol->value.enumerated.item[0]); + return 0; +} +#endif +#if (RT5631_SPK_TIMER == 1) +static void spk_work_handler(struct work_struct *work) +{ + struct snd_soc_device *socdev = rt5631_socdev; + struct snd_soc_codec *codec = socdev->card->codec; + bool is_spk = (rt5631_read(codec, 0x4a)) & 0x04; //detect rt5631 reg4a[3], 1'b:SPK, 0'b:HP ; + if(last_is_spk != is_spk) + printk("%s---%s is in use.last is %s in use\n", __FUNCTION__,is_spk?"speaker":"headphone",last_is_spk?"speaker":"headphone"); + + if(is_spk && !last_is_spk){ + rt5631_write_index_mask(codec,0x11,0x0000,0x0007); //0db + rt5631_write_index(codec,0x12,0x0003); //0db + rt5631_update_eqmode(codec, SPK_FR); // SPK is in use, enable EQ mode of SPK_FR. + }else if(!is_spk && last_is_spk){ + //flove071311 rt5631_update_eqmode(codec, NORMAL); // HP is in use, enable EQ mode of NORMAL. + rt5631_write_index_mask(codec,0x11,0x0001,0x0003); + rt5631_write_index(codec,0x12,0x0001); + rt5631_update_eqmode(codec,HFREQ); + } + last_is_spk = is_spk; +} + +/* timer to judge SPK or HP in use, and handle EQ issues accordingly. */ +void spk_timer_callback(unsigned long data ) +{ + int ret = 0; + + schedule_work(&spk_work); + + //DBG("Starting timer to fire in 1000ms (%ld)\n", jiffies ); + ret = mod_timer(&spk_timer, jiffies + msecs_to_jiffies(1000)); + if (ret) printk("Error in mod_timer\n"); +} +#endif +//************************************************************************************************* +//************************************************************************************************* + static const struct snd_kcontrol_new rt5631_snd_controls[] = { SOC_ENUM("MIC1 Mode Control", rt5631_enum[3]), SOC_ENUM("MIC1 Boost", rt5631_enum[6]), @@ -267,6 +533,10 @@ SOC_DOUBLE("HP Playback Volume", RT5631_HP_OUT_VOL, 8, 0, 63, 1), //SOC_SINGLE_EXT("Voice Loopback", ), /*not finished*/ SOC_SINGLE_EXT("DMIC Capture Switch", VIRTUAL_POWER_CONTROL, 2, 1, 0, rt5631_dmic_get, rt5631_dmic_put), + +#if (RT5631_EQ_FUNC_ENA==1) +SOC_ENUM_EXT("EQ Mode", rt5631_enum[10], snd_soc_get_enum_double, rt5631_eq_sel_put), +#endif }; static int rt5631_add_controls(struct snd_soc_codec *codec) @@ -379,8 +649,34 @@ SOC_DAPM_ENUM("Route", rt5631_enum[1]); static const struct snd_kcontrol_new rt5631_mono_mux_control = SOC_DAPM_ENUM("Route", rt5631_enum[2]); +static const struct snd_kcontrol_new rt5631_hpl_mux_control = +SOC_DAPM_ENUM("Route", rt5631_enum[8]); +static const struct snd_kcontrol_new rt5631_hpr_mux_control = +SOC_DAPM_ENUM("Route", rt5631_enum[9]); - +//ALC for DAC function +#if (RT5631_ALC_DAC_FUNC_ENA==1) +static void rt5631_alc_enable(struct snd_soc_codec *codec,unsigned int EnableALC) +{ + if(EnableALC) + { + rt5631_write(codec, 0x64,0x0206); + rt5631_write(codec, 0x65,0x0003); + rt5631_write_index(codec, 0x21,0x5000); + rt5631_write_index(codec, 0x22,0xa480); + rt5631_write_index(codec, 0x23,0x0a08); + rt5631_write(codec, 0x0c,0x0010); + rt5631_write(codec, 0x66,0x650a); + + } + else + { + rt5631_write(codec, 0x66,0x250A); + rt5631_write(codec, 0x0c,0x0000); + } + +} +#endif static int spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { @@ -392,16 +688,23 @@ static int spk_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMD: - printk("spk_event --SND_SOC_DAPM_POST_PMD\n"); + DBG("spk_event --SND_SOC_DAPM_POST_PMD\n"); rt5631_write_mask(codec, RT5631_SPK_OUT_VOL, 0x8080, 0x8080); if ((l == 0) && (r == 0)) rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x0000, 0x1000); rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD4, 0x0000, 0xC000); +#if (RT5631_ALC_DAC_FUNC_ENA==1) + rt5631_alc_enable(codec,0); +#endif + break; case SND_SOC_DAPM_POST_PMU: - printk("spk_event --SND_SOC_DAPM_POST_PMU\n"); + DBG("spk_event --SND_SOC_DAPM_POST_PMU \n"); +#if (RT5631_ALC_DAC_FUNC_ENA==1) + rt5631_alc_enable(codec,1); +#endif if ((l != 0) || (r != 0)) rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x1000, 0x1000); rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD4, 0xC000, 0xC000); @@ -428,21 +731,21 @@ static void hp_depop2(struct snd_soc_codec *codec,unsigned int EnableHPOut) if(EnableHPOut) { - rt5631_write_index_reg(codec,0x56,0x303e); + rt5631_write_index(codec,0x56,0x303e); rt5631_write_mask(codec,RT5631_PWR_MANAG_ADD3,PWR_CHARGE_PUMP|PWR_HP_L_AMP|PWR_HP_R_AMP ,PWR_CHARGE_PUMP|PWR_HP_L_AMP|PWR_HP_R_AMP); rt5631_write(codec,RT5631_DEPOP_FUN_CTRL_1,POW_ON_SOFT_GEN|EN_DEPOP2_FOR_HP); schedule_timeout_uninterruptible(msecs_to_jiffies(100)); - rt5631_write_mask(codec,RT5631_PWR_MANAG_ADD3,PWR_HP_DEPOP_DIS|PWR_HP_AMP_DRIVING,PWR_HP_DEPOP_DIS|PWR_HP_AMP_DRIVING); + rt5631_write_mask(codec,RT5631_PWR_MANAG_ADD3,PWR_HP_DEPOP_DIS/*|PWR_HP_AMP_DRIVING*/,PWR_HP_DEPOP_DIS/*|PWR_HP_AMP_DRIVING*/); } else //disable HP out { - rt5631_write_index_reg(codec,0x56,0x303F); + rt5631_write_index(codec,0x56,0x303F); rt5631_write(codec,RT5631_DEPOP_FUN_CTRL_1,POW_ON_SOFT_GEN|EN_MUTE_UNMUTE_DEPOP|PD_HPAMP_L_ST_UP|PD_HPAMP_R_ST_UP); schedule_timeout_uninterruptible(msecs_to_jiffies(75)); rt5631_write(codec,RT5631_DEPOP_FUN_CTRL_1,POW_ON_SOFT_GEN|PD_HPAMP_L_ST_UP|PD_HPAMP_R_ST_UP); - rt5631_write_mask(codec,RT5631_PWR_MANAG_ADD3,0,PWR_HP_DEPOP_DIS|PWR_HP_AMP_DRIVING); + rt5631_write_mask(codec,RT5631_PWR_MANAG_ADD3,0,PWR_HP_DEPOP_DIS/*|PWR_HP_AMP_DRIVING*/); rt5631_write(codec,RT5631_DEPOP_FUN_CTRL_1,POW_ON_SOFT_GEN|EN_DEPOP2_FOR_HP|PD_HPAMP_L_ST_UP|PD_HPAMP_R_ST_UP); schedule_timeout_uninterruptible(msecs_to_jiffies(80)); rt5631_write(codec,RT5631_DEPOP_FUN_CTRL_1,POW_ON_SOFT_GEN); @@ -458,6 +761,8 @@ static void HP_Mute_Unmute_Depop(struct snd_soc_codec *codec,unsigned int Enable { unsigned int SoftVol,HPZeroCross; + + DBG("%s: %d\n", __func__, EnableHPOut); SoftVol = rt5631_read(codec, RT5631_SOFT_VOL_CTRL); rt5631_write(codec,RT5631_SOFT_VOL_CTRL,0); @@ -467,7 +772,7 @@ static void HP_Mute_Unmute_Depop(struct snd_soc_codec *codec,unsigned int Enable if(EnableHPOut) //unmute HP out { schedule_timeout_uninterruptible(msecs_to_jiffies(10)); - rt5631_write_index_reg(codec,0x56,0x302f); + rt5631_write_index(codec,0x56,0x302f); rt5631_write(codec,RT5631_DEPOP_FUN_CTRL_1,POW_ON_SOFT_GEN|EN_MUTE_UNMUTE_DEPOP|EN_HP_R_M_UN_MUTE_DEPOP|EN_HP_L_M_UN_MUTE_DEPOP); rt5631_write_mask(codec,RT5631_HP_OUT_VOL,0x0000,0x8080); schedule_timeout_uninterruptible(msecs_to_jiffies(160)); @@ -475,7 +780,7 @@ static void HP_Mute_Unmute_Depop(struct snd_soc_codec *codec,unsigned int Enable } else //mute HP out { - rt5631_write_index_reg(codec,0x56,0x302f); + rt5631_write_index(codec,0x56,0x302f); rt5631_write(codec,RT5631_DEPOP_FUN_CTRL_1,POW_ON_SOFT_GEN|EN_MUTE_UNMUTE_DEPOP|EN_HP_R_M_UN_MUTE_DEPOP|EN_HP_L_M_UN_MUTE_DEPOP); rt5631_write_mask(codec,RT5631_HP_OUT_VOL,0x8080,0x8080); schedule_timeout_uninterruptible(msecs_to_jiffies(150)); @@ -523,7 +828,7 @@ static int hp_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMD: - printk("hp_event --SND_SOC_DAPM_PRE_PMD\n"); + DBG("hp_event --SND_SOC_DAPM_PRE_PMD\n"); if ((l && r)&&(hp_out_enable)) { close_hp_end_widgets(codec); @@ -532,7 +837,7 @@ static int hp_event(struct snd_soc_dapm_widget *w, } break; case SND_SOC_DAPM_POST_PMU: - printk("hp_event --SND_SOC_DAPM_POST_PMU\n"); + DBG("hp_event --SND_SOC_DAPM_POST_PMU\n"); if ((l && r)&&(!hp_out_enable)) { hp_depop2(codec,1); @@ -541,12 +846,108 @@ static int hp_event(struct snd_soc_dapm_widget *w, } break; default: - return -EINVAL; + return 0; } return 0; } +static int dac_to_hp_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + unsigned int l, r; + static unsigned int hp_out_enable=0; + + l = (rt5631_read(codec, VIRTUAL_POWER_CONTROL) & (0x01 << 8)) >> 8; + r = (rt5631_read(codec, VIRTUAL_POWER_CONTROL) & (0x01 << 9)) >> 9; + + switch (event) { + case SND_SOC_DAPM_PRE_PMD: + DBG("dac_to_hp_event --SND_SOC_DAPM_PRE_PMD l=%x,r=%x,hp_out_enable=%x\n",l,r,hp_out_enable); + if ((l && r)&&(hp_out_enable)) + { + + HP_Mute_Unmute_Depop(codec,0); + hp_depop2(codec,0); + hp_out_enable=0; + } + break; + case SND_SOC_DAPM_POST_PMU: + DBG("dac_to_hp_event --SND_SOC_DAPM_POST_PMUl=%x,r=%x,hp_out_enable=%x\n",l,r,hp_out_enable); + if ((l && r)&&(!hp_out_enable)) + { + hp_depop2(codec,1); + HP_Mute_Unmute_Depop(codec,1); + hp_out_enable=1; + } + break; + default: + return 0; + } + + return 0; +} + + +static int mic_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_codec *codec = w->codec; + unsigned int mic1_gain_power,mic2_gain_power; + + mic1_gain_power = (rt5631_read(codec, RT5631_PWR_MANAG_ADD2) & 0x0020) >>5; + mic2_gain_power = (rt5631_read(codec, RT5631_PWR_MANAG_ADD2) & 0x0010) >>4; + + switch (event) { + case SND_SOC_DAPM_POST_PMD: + DBG("mic_event --SND_SOC_DAPM_POST_PMD\n"); + + if(mic1_gain_power&&mic2_gain_power) //use stereo mic from mic1&mic2,no copy ADC channel + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x0000, 0xc000); + } + else if(mic1_gain_power) //use mic1,copy ADC left to right + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x4000, 0xc000); + } + else if(mic2_gain_power)//use mic2,copy ADC right to left + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x8000, 0xc000); + } + else + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x0000, 0xc000); + } + + break; + case SND_SOC_DAPM_POST_PMU: + DBG("mic_event --SND_SOC_DAPM_POST_PMU\n"); + + if(mic1_gain_power&&mic2_gain_power) //use stereo mic from mic1&mic2,no copy ADC channel + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x0000, 0xc000); + } + else if(mic1_gain_power) //use mic1,copy ADC left to right + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x4000, 0xc000); + } + else if(mic2_gain_power)//use mic2,copy ADC right to left + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x8000, 0xc000); + } + else + { + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x0000, 0xc000); + } + + break; + default: + return 0; +} + + return 0; +} static const struct snd_soc_dapm_widget rt5631_dapm_widgets[] = { @@ -557,10 +958,12 @@ SND_SOC_DAPM_INPUT("AXIR"), SND_SOC_DAPM_INPUT("MONOIN_RXN"), SND_SOC_DAPM_INPUT("MONOIN_RXP"), +SND_SOC_DAPM_PGA_E("Mic1 Boost", RT5631_PWR_MANAG_ADD2, 5, 0, NULL, 0, + mic_event, SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU), + +SND_SOC_DAPM_PGA_E("Mic2 Boost", RT5631_PWR_MANAG_ADD2, 4, 0, NULL, 0, + mic_event, SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU), -SND_SOC_DAPM_PGA("Mic1 Boost", RT5631_PWR_MANAG_ADD2, 5, 0, NULL, 0), - -SND_SOC_DAPM_PGA("Mic2 Boost", RT5631_PWR_MANAG_ADD2, 4, 0, NULL, 0), SND_SOC_DAPM_PGA("MONOIN_RXP Boost", RT5631_PWR_MANAG_ADD4, 7, 0, NULL, 0), SND_SOC_DAPM_PGA("MONOIN_RXN Boost", RT5631_PWR_MANAG_ADD4, 6, 0, NULL, 0), @@ -597,6 +1000,12 @@ SND_SOC_DAPM_PGA_E("Left HP Vol", RT5631_PWR_MANAG_ADD4, 11, 0, NULL, 0, hp_event, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_PGA_E("Right HP Vol", RT5631_PWR_MANAG_ADD4, 10, 0, NULL, 0, hp_event, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), + +SND_SOC_DAPM_PGA_E("Left DAC_HP", VIRTUAL_POWER_CONTROL, 8, 0, NULL, 0, + dac_to_hp_event, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), +SND_SOC_DAPM_PGA_E("Right DAC_HP", VIRTUAL_POWER_CONTROL,9, 0, NULL, 0, + dac_to_hp_event, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_PGA("Left Out Vol", RT5631_PWR_MANAG_ADD4, 13, 0, NULL, 0), SND_SOC_DAPM_PGA("Right Out Vol", RT5631_PWR_MANAG_ADD4, 12, 0, NULL, 0), @@ -616,6 +1025,9 @@ SND_SOC_DAPM_MUX("SPOL Mux", SND_SOC_NOPM, 0, 0, &rt5631_spol_mux_control), SND_SOC_DAPM_MUX("SPOR Mux", SND_SOC_NOPM, 0, 0, &rt5631_spor_mux_control), SND_SOC_DAPM_MUX("Mono Mux", SND_SOC_NOPM, 0, 0, &rt5631_mono_mux_control), +SND_SOC_DAPM_MUX("HPL Mux", SND_SOC_NOPM, 0, 0, &rt5631_hpl_mux_control), +SND_SOC_DAPM_MUX("HPR Mux", SND_SOC_NOPM, 0, 0, &rt5631_hpr_mux_control), + SND_SOC_DAPM_PGA("Mono Amp", RT5631_PWR_MANAG_ADD3, 7, 0, NULL, 0), @@ -744,6 +1156,14 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Mono Mux", "MONOIN_RX", "MONO_IN"}, {"Mono Mux", "VDAC", "Voice DAC Boost"}, + {"Right DAC_HP", "NULL", "Right DAC"}, + {"Left DAC_HP", "NULL", "Left DAC"}, + + {"HPL Mux", "LEFT HPVOL", "Left HP Vol"}, + {"HPL Mux", "LEFT DAC", "Left DAC_HP"}, + {"HPR Mux", "RIGHT HPVOL", "Right HP Vol"}, + {"HPR Mux", "RIGHT DAC", "Right DAC_HP"}, + {"SPKL Amp", NULL, "SPOL Mux"}, {"SPKR Amp", NULL, "SPOR Mux"}, {"Mono Amp", NULL, "Mono Mux"}, @@ -752,8 +1172,10 @@ static const struct snd_soc_dapm_route audio_map[] = { {"ROUT", NULL, "AXO2MIX Mixer"}, {"SPOL", NULL, "SPKL Amp"}, {"SPOR", NULL, "SPKR Amp"}, - {"HPOL", NULL, "Left HP Vol"}, - {"HPOR", NULL, "Right HP Vol"}, + + {"HPOL", NULL, "HPL Mux"}, + {"HPOR", NULL, "HPR Mux"}, + {"MONO", NULL, "Mono Amp"} }; @@ -768,6 +1190,130 @@ static int rt5631_add_widgets(struct snd_soc_codec *codec) return 0; } +static int voltab[2][16] = +{ + //spk + {0x27, 0x1b, 0x18, 0x15, 0x13, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06}, + //hp + {0x1f, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, +}; +static int gvolume = 0; +#if 1 + +static int get_vol(int max, int min, int stage_num, int stage) +{ + int ret, step=((max-min)<<8)/(stage_num-1); + if(stage==stage_num-1) + ret=min; + else if(stage==0) + ret=max; + else { + ret=(stage_num-stage-1) * step; + ret >>= 8; + ret = min+ret; + } + DBG("%s(): ret=%02x, max=0x%02x, min=0x%02x, stage_num=%d, stage=%d\n", + __FUNCTION__, + ret, + max, + min, + stage_num, + stage); + return ret; +} + +static void rt5631_set_volume(int vollevel) +{ + struct snd_soc_device *socdev; + struct snd_soc_codec *codec; + int tmpvol1, tmpvol2; + + //DBG("rt5631_set_volume = %d\n", vollevel); + + socdev =rt5631_socdev; + codec = socdev->card->codec; + + if (vollevel > 15) vollevel = 8; + gvolume = vollevel; + +// tmpvol1 = voltab[0][vollevel]; +// tmpvol2 = voltab[1][vollevel]; + tmpvol1=get_vol(0x27, DEF_VOL_SPK&0x3f, 16, vollevel); + tmpvol2=get_vol(0x1f, DEF_VOL&0x1f, 16, vollevel); + + if(vollevel == 0){ + rt5631_write_mask(codec, RT5631_SPK_OUT_VOL, 0x8080, 0x8080); + rt5631_write_mask(codec, RT5631_HP_OUT_VOL, 0x8080, 0x8080); + } +// else{ +// rt5631_write_mask(codec, RT5631_SPK_OUT_VOL, 0x00, 0x8080); +// rt5631_write_mask(codec, RT5631_HP_OUT_VOL, 0x00, 0x8080); +// } + + rt5631_write_mask(codec, RT5631_SPK_OUT_VOL, ((tmpvol1<<8)|tmpvol1), 0x3f3f); + rt5631_write_mask(codec, RT5631_HP_OUT_VOL, ((tmpvol2<<8)|tmpvol2), 0x3f3f); +} + +static void rt5631_set_eq(int on) +{ + struct snd_soc_device *socdev; + struct snd_soc_codec *codec; + unsigned int Reg0C; + + socdev =rt5631_socdev; + codec = socdev->card->codec; + + Reg0C = rt5631_read(codec, RT5631_STEREO_DAC_VOL_1); + DBG("------- rt5631_set_eq: read Reg0C = 0x%04x\n", Reg0C); + + Reg0C &= 0xFF80; + if(on) { + Reg0C |= 0x10; + } else { + Reg0C |= 0x00; + } + + DBG("------- rt5631_set_eq: write Reg0C = 0x%04x\n", Reg0C); + rt5631_write(codec, RT5631_STEREO_DAC_VOL_1, Reg0C); +} + +#else + +static void rt5631_set_volume(int vollevel) +{ + struct snd_soc_device *socdev; + struct snd_soc_codec *codec; + u8 tmpvol1, tmpvol2; + u16 spk_vol, hp_vol; + + DBG("rt5631_set_volume = %d\n", vollevel); + + socdev =rt5631_socdev; + codec = socdev->card->codec; + + if (vollevel > 15) vollevel = 8; + gvolume = vollevel; + + tmpvol1 = voltab[0][vollevel]; + tmpvol2 = voltab[1][vollevel]; + + spk_vol = snd_soc_read(codec, RT5631_SPK_OUT_VOL); + hp_vol = snd_soc_read(codec, RT5631_HP_OUT_VOL); + + DBG("\n\nold value: 0x%04x, 0x%04x\n", spk_vol & 0x3F3F, hp_vol & 0x3F3F); + DBG("new value: 0x%04x\n", (tmpvol1<<8)|tmpvol1, (tmpvol2<<8)|tmpvol2); + + spk_vol &= 0x3C3C; + spk_vol |= (tmpvol1<<8)|tmpvol1; + hp_vol &= 0x3C3C; + hp_vol |= (tmpvol2<<8)|tmpvol2; + + snd_soc_write(codec, RT5631_SPK_OUT_VOL, spk_vol); + snd_soc_write(codec, RT5631_HP_OUT_VOL , hp_vol); +} + +#endif + struct _coeff_div{ unsigned int mclk; //pllout or MCLK unsigned int bclk; //master mode @@ -832,7 +1378,11 @@ static const struct _pll_div codec_slave_pll_div[] = { { 3072000, 24576000, 0x1ea0}, { 705600, 11289600, 0x3ea0}, { 705600, 8467200, 0x3ab0}, - + { 24576000, 24576000, 0x02a0}, + { 1411200, 11289600, 0x1690}, + { 2822400, 11289600, 0x0a90}, + { 1536000, 12288000, 0x1690}, + { 3072000, 12288000, 0x0a90}, }; struct _coeff_div coeff_div[] = { @@ -915,7 +1465,7 @@ static void rt5631_set_dmic_params(struct snd_soc_codec *codec, struct snd_pcm_h unsigned int rate; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); rt5631_write_mask(codec, RT5631_GPIO_CTRL, GPIO_PIN_FUN_SEL_GPIO_DIMC|GPIO_DMIC_FUN_SEL_DIMC , GPIO_PIN_FUN_SEL_MASK|GPIO_DMIC_FUN_SEL_MASK); rt5631_write_mask(codec, RT5631_DIG_MIC_CTRL, DMIC_ENA, DMIC_ENA_MASK); @@ -957,9 +1507,8 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, unsigned int iface = 0; int rate = params_rate(params); int coeff = 0; - unsigned int CodecRegData; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); if (!rt5631->master) coeff = get_coeff_in_slave_mode(rt5631->sysclk, rate); @@ -967,7 +1516,7 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, coeff = get_coeff_in_master_mode(rt5631->sysclk, rate, rate * timesofbclk); if (coeff < 0) { - printk(KERN_ERR "%s get_coeff err!\n", __func__); + DBG(KERN_ERR "%s get_coeff err!\n", __func__); // return -EINVAL; } @@ -991,27 +1540,6 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, if (stream == SNDRV_PCM_STREAM_CAPTURE) { if (rt5631->dmic_used_flag) //use Digital Mic rt5631_set_dmic_params(codec, params); - else //use Analog Mic - { - CodecRegData=rt5631_read(codec,RT5631_ADC_REC_MIXER); - if((CodecRegData&0x4040)==0) //use stereo mic from mic1&mic2,no copy ADC channel - { - rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x0000, 0xc000); - } - else if((CodecRegData&0x4000)==0) //use mic1,copy ADC left to right - { - rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x4000, 0xc000); - } - else if((CodecRegData&0x0040)==0)//use mic2,copy ADC right to left - { - rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x8000, 0xc000); - } - else - { - rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x0000, 0xc000); - } - - } } rt5631_write_mask(codec, RT5631_SDP_CTRL, iface, SDP_I2S_DL_MASK); @@ -1019,9 +1547,12 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, if(coeff>=0) rt5631_write(codec, RT5631_STEREO_AD_DA_CLK_CTRL, coeff_div[coeff].reg_val); +// if((rt5631_read(codec,RT5631_SPK_MONO_HP_OUT_CTRL)&0x000c)==0x000c) +// rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x83e0, 0x8380); +// else + rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x83e0, 0x83e0); - rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x80e0, 0x80e0); - + rt5631_write_mask(codec, 0x6e,0x4000,0x4000); return 0; } @@ -1031,7 +1562,7 @@ static int rt5631_hifi_codec_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned struct rt5631_priv *rt5631 = codec->private_data; u16 iface = 0; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: rt5631->master = 1; @@ -1080,14 +1611,14 @@ static int rt5631_hifi_codec_set_dai_sysclk(struct snd_soc_dai *codec_dai, struct snd_soc_codec *codec = codec_dai->codec; struct rt5631_priv *rt5631 = codec->private_data; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); if ((freq >= (256 * 8000)) && (freq <= (512 * 48000))) { rt5631->sysclk = freq; return 0; } - printk("unsupported sysclk freq %u for audio i2s\n", freq); - printk("Set sysclk to 24.576Mhz by default\n"); + DBG("unsupported sysclk freq %u for audio i2s\n", freq); + DBG("Set sysclk to 24.576Mhz by default\n"); rt5631->sysclk = 24576000; return 0; @@ -1103,7 +1634,7 @@ static int rt5631_codec_set_dai_pll(struct snd_soc_dai *codec_dai, int ret = -EINVAL; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); // rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD2, 0, PWR_PLL); if (!freq_in || !freq_out) @@ -1143,12 +1674,34 @@ static int rt5631_codec_set_dai_pll(struct snd_soc_dai *codec_dai, return 0; } -static void rt5631_hifi_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai) +static int rt5631_trigger(struct snd_pcm_substream *substream, int status, struct snd_soc_dai *dai) { - + //DBG("rt5631_trigger\n"); + if(status == SNDRV_PCM_TRIGGER_VOLUME){ + //DBG("rt5631_trigger: vol = %d\n", substream->number); + if(substream->number < 100){ + rt5631_set_volume(substream->number); + } else { + if(substream->number == 100) { // eq off + DBG("---------- eq off\n"); + rt5631_set_eq(0); + } else { // eq on +6dB + DBG("---------- eq on\n"); + rt5631_set_eq(1); + } + } + } + + return 0; } -#define RT5631_STEREO_RATES (SNDRV_PCM_RATE_8000_48000) +static void rt5631_hifi_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai) +{ + DBG( "enter %s\n", __func__); +} + +//#define RT5631_STEREO_RATES (SNDRV_PCM_RATE_8000_48000) +#define RT5631_STEREO_RATES (SNDRV_PCM_RATE_44100) // zyy 20110704, playback and record use same sample rate #define RT5631_FORMAT (SNDRV_PCM_FMTBIT_S16_LE |\ SNDRV_PCM_FMTBIT_S20_3LE |\ SNDRV_PCM_FMTBIT_S24_LE |\ @@ -1159,7 +1712,10 @@ struct snd_soc_dai_ops rt5631_ops = { .set_fmt = rt5631_hifi_codec_set_dai_fmt, .set_sysclk = rt5631_hifi_codec_set_dai_sysclk, .set_pll = rt5631_codec_set_dai_pll, - .shutdown = rt5631_hifi_shutdown, + .shutdown = rt5631_hifi_shutdown, +#if defined(CONFIG_ADJUST_VOL_BY_CODEC) + .trigger = rt5631_trigger, +#endif }; struct snd_soc_dai rt5631_dai[] = { @@ -1191,11 +1747,48 @@ struct snd_soc_dai rt5631_dai[] = { EXPORT_SYMBOL_GPL(rt5631_dai); + +static ssize_t rt5631_index_reg_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct snd_soc_device *socdev = dev_get_drvdata(dev); + struct snd_soc_codec *codec = socdev->card->codec; + int count = 0; + int value; + int i; + + count += sprintf(buf, "%s index register\n", codec->name); + + for (i = 0; i < 0x55; i++) { + count += sprintf(buf + count, "%2x= ", i); + if (count >= PAGE_SIZE - 1) + break; + value = rt5631_read_index(codec, i); + count += snprintf(buf + count, PAGE_SIZE - count, "0x%4x", value); + + if (count >= PAGE_SIZE - 1) + break; + + count += snprintf(buf + count, PAGE_SIZE - count, "\n"); + if (count >= PAGE_SIZE - 1) + break; + } + + if (count >= PAGE_SIZE) + count = PAGE_SIZE - 1; + + return count; + +} + +static DEVICE_ATTR(index_reg, 0444, rt5631_index_reg_show, NULL); + + static int rt5631_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); - printk("rt5631_set_bias_level=%d\n",level); + DBG("rt5631_set_bias_level=%d\n",level); switch (level) { case SND_SOC_BIAS_ON: @@ -1208,6 +1801,7 @@ static int rt5631_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_ break; case SND_SOC_BIAS_OFF: + rt5631_write_index(codec, 0x11,0x0000); rt5631_write_mask(codec, RT5631_SPK_OUT_VOL ,0x8080, 0x8080); rt5631_write_mask(codec, RT5631_HP_OUT_VOL ,0x8080, 0x8080); rt5631_write(codec, RT5631_PWR_MANAG_ADD1, 0x0000); @@ -1226,7 +1820,7 @@ static int rt5631_init(struct snd_soc_device *socdev) struct snd_soc_codec *codec = socdev->card->codec; int ret; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); codec->name = "RT5631"; codec->owner = THIS_MODULE; codec->read = rt5631_read; @@ -1243,7 +1837,7 @@ static int rt5631_init(struct snd_soc_device *socdev) ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); if (ret < 0) { - printk(KERN_ERR "rt5631: failed to create pcms\n"); + DBG(KERN_ERR "rt5631: failed to create pcms\n"); goto pcm_err; } @@ -1255,14 +1849,32 @@ static int rt5631_init(struct snd_soc_device *socdev) schedule_delayed_work(&codec->delayed_work, msecs_to_jiffies(100)); rt5631_reg_init(codec); +#if defined(CONFIG_ADJUST_VOL_BY_CODEC) + rt5631_set_volume(gvolume); +#endif +#if 0 //(RT5631_EQ_FUNC_ENA==1) + rt5631_write_index_mask(codec,0x11,0x0001,0x0003); + rt5631_write_index(codec,0x12,0x0001); + rt5631_update_eqmode(codec,HFREQ); + //rt5631_update_eqmode(codec,SPK_FR); +#endif +#if (RT5631_SPK_TIMER == 1) +/* Timer module installing */ + setup_timer( &spk_timer, spk_timer_callback, 0 ); + DBG( "Starting timer to fire in 5s (%ld)\n", jiffies ); + ret = mod_timer( &spk_timer, jiffies + msecs_to_jiffies(5000) ); + if (ret) printk("Error in mod_timer\n"); + + INIT_WORK(&spk_work, spk_work_handler); +#endif rt5631_add_controls(codec); rt5631_add_widgets(codec); ret = snd_soc_init_card(socdev); if (ret < 0) { - printk(KERN_ERR "rt5631: failed to register card!\n"); + DBG(KERN_ERR "rt5631: failed to register card!\n"); goto card_err; } - printk(KERN_INFO "rt5631 initial ok!\n"); + DBG(KERN_INFO "rt5631 initial ok!\n"); return 0; @@ -1289,7 +1901,7 @@ static int rt5631_i2c_probe(struct i2c_client *i2c, struct snd_soc_codec *codec = socdev->card->codec; int ret; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); i2c_set_clientdata(i2c, codec); codec->control_data = i2c; @@ -1306,11 +1918,18 @@ static int rt5631_i2c_remove(struct i2c_client *client) { struct snd_soc_codec *codec = i2c_get_clientdata(client); - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); kfree(codec->reg_cache); return 0; } +static void rt5631_i2c_shutdown(void){ + struct snd_soc_device *socdev = rt5631_socdev; + struct snd_soc_codec *codec = socdev->card->codec; + + DBG( "enter %s\n", __func__); + rt5631_set_bias_level(codec, SND_SOC_BIAS_OFF); +} struct i2c_driver rt5631_i2c_driver = { .driver = { .name = "RT5631 I2C Codec", @@ -1318,6 +1937,7 @@ struct i2c_driver rt5631_i2c_driver = { }, .probe = rt5631_i2c_probe, .remove = rt5631_i2c_remove, + .shutdown = rt5631_i2c_shutdown, .id_table = rt5631_i2c_id, }; @@ -1332,7 +1952,7 @@ static int rt5631_add_i2c_device(struct platform_device *pdev, #endif int ret; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); ret = i2c_add_driver(&rt5631_i2c_driver); if (ret != 0) { dev_err(&pdev->dev, "can't add i2c driver\n"); @@ -1386,7 +2006,7 @@ static int rt5631_probe(struct platform_device *pdev) struct rt5631_priv *rt5631; int ret = 0; - printk(KERN_DEBUG "enter %s\n", __func__); + DBG( "enter %s\n", __func__); pr_info("RT5631 Audio Codec %s", RT5631_VERSION); @@ -1413,7 +2033,10 @@ static int rt5631_probe(struct platform_device *pdev) INIT_LIST_HEAD(&codec->dapm_widgets); INIT_LIST_HEAD(&codec->dapm_paths); INIT_DELAYED_WORK(&codec->delayed_work, rt5631_work); - + + ret = device_create_file(&pdev->dev, &dev_attr_index_reg); + if (ret < 0) + printk(KERN_WARNING "asoc: failed to add index_reg sysfs files\n"); #if 0 if (setup->i2c_address) { codec->hw_write = (hw_write_t)i2c_master_send; @@ -1464,7 +2087,13 @@ static int rt5631_remove(struct platform_device *pdev) struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec =socdev->card->codec; - +#if (RT5631_SPK_TIMER == 1) +/* Timermoduleuninstalling */ + int ret; + ret = del_timer(&spk_timer); + if(ret) printk("The timer is still in use...\n"); + DBG("Timer module uninstalling\n"); +#endif if (codec->control_data) rt5631_set_bias_level(codec, SND_SOC_BIAS_OFF); run_delayed_work(&codec->delayed_work); @@ -1481,6 +2110,7 @@ static int rt5631_remove(struct platform_device *pdev) static int rt5631_suspend(struct platform_device *pdev, pm_message_t state) { + DBG( "enter %s\n", __func__); struct snd_soc_device *socdev = platform_get_drvdata(pdev); struct snd_soc_codec *codec =socdev->card->codec; @@ -1499,13 +2129,27 @@ static int rt5631_resume(struct platform_device *pdev) // u16 *cache = codec->reg_cache; #if 1 + rt5631_reset(codec); rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD3,PWR_VREF|PWR_MAIN_BIAS, PWR_VREF|PWR_MAIN_BIAS); schedule_timeout_uninterruptible(msecs_to_jiffies(110)); rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD3, PWR_FAST_VREF_CTRL, PWR_FAST_VREF_CTRL); rt5631_reg_init(codec); - rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x80e0, 0x80e0); +#if defined(CONFIG_ADJUST_VOL_BY_CODEC) + rt5631_set_volume(gvolume); +#endif + DBG( "enter %s\n", __func__); + rt5631_write_mask(codec, RT5631_PWR_MANAG_ADD1, 0x83e0, 0x83e0); + +#if 0 //(RT5631_EQ_FUNC_ENA==1) + rt5631_write_index_mask(codec,0x11,0x0001,0x0003); + rt5631_write_index(codec,0x12,0x0001); + rt5631_update_eqmode(codec,HFREQ); + //rt5631_update_eqmode(codec,SPK_FR); +#endif +#if (RT5631_SPK_TIMER == 1) + last_is_spk = !last_is_spk; //wired~, update eqmode right here by spk_timer. +#endif #else - printk(KERN_DEBUG "enter %s\n", __func__); for (i = 0; i < ARRAY_SIZE(rt5631_reg); i++) { if (i == RT5631_RESET) continue; @@ -1529,6 +2173,59 @@ static int rt5631_resume(struct platform_device *pdev) } +void codec_set_spk(bool on) +{ + struct snd_soc_device *socdev; + struct snd_soc_codec *codec; + + socdev = rt5631_socdev; + + DBG("%s: %d\n", __func__, on); + + if(!socdev) + return; + + codec = socdev->card->codec; + if(!codec) + return; + + if(on){ + DBG("snd_soc_dapm_enable_pin\n"); + snd_soc_dapm_enable_pin(codec, "Headphone Jack"); + snd_soc_dapm_enable_pin(codec, "Ext Spk"); + } + else{ + + DBG("snd_soc_dapm_disable_pin\n"); + snd_soc_dapm_disable_pin(codec, "Headphone Jack"); + snd_soc_dapm_disable_pin(codec, "Ext Spk"); + } + + snd_soc_dapm_sync(codec); + + return; +} + +//detect short current for mic1 +int rt5631_ext_mic_detect(void) +{ + int CodecValue; + struct snd_soc_device *socdev = rt5631_socdev; + struct snd_soc_codec *codec = socdev->card->codec; + + rt5631_write_mask(codec, RT5631_MIC_CTRL_2,MICBIAS1_S_C_DET_ENA,MICBIAS1_S_C_DET_MASK); + // rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2,0x2000,0x2000); + CodecValue=rt5631_read(codec,RT5631_INT_ST_IRQ_CTRL_2) & 0x0001; + + rt5631_write_mask(codec, RT5631_INT_ST_IRQ_CTRL_2,0x0001,0x00001); + + return CodecValue; + +} + +EXPORT_SYMBOL_GPL(rt5631_ext_mic_detect); + + struct snd_soc_codec_device soc_codec_dev_rt5631 = { .probe = rt5631_probe, diff --git a/sound/soc/rk29/Kconfig b/sound/soc/rk29/Kconfig index a6ac20ef8214..e3a0b5c69654 100644 --- a/sound/soc/rk29/Kconfig +++ b/sound/soc/rk29/Kconfig @@ -102,4 +102,11 @@ choice config SND_RK29_CODEC_SOC_SLAVE tristate "Codec run in Slave" endchoice + +config ADJUST_VOL_BY_CODEC + bool "Adjust volume by codec" + default n + help + adjust volume by codec + endif diff --git a/sound/soc/rk29/rk29_i2s.c b/sound/soc/rk29/rk29_i2s.c index c94cd0568ed0..f91dd898178e 100755 --- a/sound/soc/rk29/rk29_i2s.c +++ b/sound/soc/rk29/rk29_i2s.c @@ -271,7 +271,14 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai, return -EINVAL; } I2S_DBG("Enter::%s----%d, I2S_TXCR=0x%X\n",__FUNCTION__,__LINE__,tx_ctl); +#if defined(CONFIG_SND_RK29_SOC_alc5631) || defined(CONFIG_SND_RK29_SOC_alc5621) + rx_ctl = tx_ctl; + rx_ctl &= ~I2S_MODE_MASK; + rx_ctl |= I2S_SLAVE_MODE; // set tx slave, rx master + writel(rx_ctl, &(pheadi2s->I2S_TXCR)); +#else writel(tx_ctl, &(pheadi2s->I2S_TXCR)); +#endif rx_ctl = tx_ctl & 0x00007FFF; writel(rx_ctl, &(pheadi2s->I2S_RXCR)); return 0; @@ -338,7 +345,14 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream, writel(dmarc, &(pheadi2s->I2S_DMACR)); I2S_DBG("Enter %s, %d I2S_TXCR=0x%08X\n", __func__, __LINE__, iismod); +#if defined(CONFIG_SND_RK29_SOC_alc5631) || defined(CONFIG_SND_RK29_SOC_alc5621) + dmarc = iismod; + dmarc &= ~I2S_MODE_MASK; + dmarc |= I2S_SLAVE_MODE; // set tx slave, rx master + writel(dmarc, &(pheadi2s->I2S_TXCR)); +#else writel(iismod, &(pheadi2s->I2S_TXCR)); +#endif iismod = iismod & 0x00007FFF; writel(iismod, &(pheadi2s->I2S_RXCR)); return 0; @@ -468,9 +482,13 @@ int rockchip_i2s_resume(struct snd_soc_dai *cpu_dai) #define rockchip_i2s_resume NULL #endif +#if defined(CONFIG_SND_RK29_SOC_alc5631) || defined(CONFIG_SND_RK29_SOC_alc5621) +#define ROCKCHIP_I2S_RATES (SNDRV_PCM_RATE_44100) //zyy 20110704, playback and record use same sample rate +#else #define ROCKCHIP_I2S_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\ SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000) +#endif static struct snd_soc_dai_ops rockchip_i2s_dai_ops = { .trigger = rockchip_i2s_trigger, diff --git a/sound/soc/rk29/rk29_rt5631.c b/sound/soc/rk29/rk29_rt5631.c index 690c00aacb6e..0b93043bda4c 100644 --- a/sound/soc/rk29/rk29_rt5631.c +++ b/sound/soc/rk29/rk29_rt5631.c @@ -119,22 +119,14 @@ static int rk29_hw_params(struct snd_pcm_substream *substream, } #endif -/* - #if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER) - if((24576000%params_rate(params))==0) //for 8k,16k,32k,48k - { - snd_soc_dai_set_pll(codec_dai,0,pll_out, 24576000); - snd_soc_dai_set_sysclk(codec_dai,0, 24576000, SND_SOC_CLOCK_IN); - } - else if((22579200%params_rate(params))==0) //for 11k,22k,44k - { - snd_soc_dai_set_pll(codec_dai,0,pll_out, 22579200); - snd_soc_dai_set_sysclk(codec_dai,0, 22579200, SND_SOC_CLOCK_IN); - } + #if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER) + + // snd_soc_dai_set_pll(codec_dai,0,pll_out, 22579200); + snd_soc_dai_set_sysclk(codec_dai,0,pll_out, SND_SOC_CLOCK_IN); #endif -*/ + #if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE) snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0); @@ -255,4 +247,4 @@ module_exit(audio_card_exit); MODULE_AUTHOR("rockchip"); MODULE_DESCRIPTION("ROCKCHIP i2s ASoC Interface"); MODULE_LICENSE("GPL"); - + From d32f5dbe19fbcdb0781f962da165668239343bac Mon Sep 17 00:00:00 2001 From: lyx Date: Mon, 29 Aug 2011 01:04:50 -0700 Subject: [PATCH 033/150] newton: improve irda driver 1.improve err handle 2.improve FIR get length --- drivers/net/irda/ir_serial.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index 29f972291000..407f58c838aa 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -239,6 +239,19 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); irq_src = irda_hw_get_irqsrc(); printk("[%s][%d], 0x%x\n",__FUNCTION__,__LINE__, irq_src); + + /* error */ + if (irq_src & (REG_INT_CRC | REG_INT_OE | REG_INT_FE + | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { + printk("[%s][%d]: do err\n", __FUNCTION__, __LINE__); + //BU92725GUW_dump_register(); + BU92725GUW_clr_fifo(); + BU92725GUW_reset(); + if ((BU92725GUW_SEND==irda_hw_get_mode()) + || (BU92725GUW_MULTI_SEND==irda_hw_get_mode())) { + s->tx_empty = 1; + } + } if (irq_src & (REG_INT_DRX | FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE)) { len = bu92747_irda_do_rx(s); @@ -273,9 +286,8 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) } /* error */ - if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE - | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { - BU92747_IRDA_DBG("[%s][%d]: do err\n", __FUNCTION__, __LINE__); + if (irq_src & REG_INT_TO) { + BU92747_IRDA_DBG("[%s][%d]: do timeout err\n", __FUNCTION__, __LINE__); //BU92725GUW_dump_register(); BU92725GUW_clr_fifo(); BU92725GUW_reset(); @@ -284,7 +296,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) s->tx_empty = 1; } } - + return IRQ_HANDLED; } @@ -598,6 +610,7 @@ static int bu92747_get_frame_length(struct bu92747_port *s) spin_lock(&s->data_lock); if (get_frame_length(f, &len) != 0) { printk("line %d: FIR data not ready......\n", __LINE__); + len = 0; //atomic_set(&(s->data_ready), 0); } spin_unlock(&s->data_lock); @@ -618,7 +631,7 @@ static int bu92747_irda_ioctl(struct uart_port *port, unsigned int cmd, unsigned switch (cmd) { case TTYIR_GETLENGTH: len = bu92747_get_frame_length(s); - if (len > 0) { + if (len >= 0) { if (copy_to_user(argp, &len, sizeof(len))) ret = -EFAULT; } From cf0b398a468b367d2a8b54ec12d3c2fd2e4f68eb Mon Sep 17 00:00:00 2001 From: lyx Date: Mon, 29 Aug 2011 02:50:38 -0700 Subject: [PATCH 034/150] newton: remove redefined of bu92747_lock && bu92747_unlock function --- drivers/cir/bu92747guw_cir.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/drivers/cir/bu92747guw_cir.c b/drivers/cir/bu92747guw_cir.c index a4022801a2d0..6963654aedea 100755 --- a/drivers/cir/bu92747guw_cir.c +++ b/drivers/cir/bu92747guw_cir.c @@ -58,20 +58,6 @@ static struct miscdevice bu92747guw_device; int repeat_flag=-1; int start_flag = 0; -//mutex lock between remote and irda -static DEFINE_MUTEX(bu92747_mutex); -void bu92747_lock(void) -{ - mutex_lock(&bu92747_mutex); -} -void bu92747_unlock(void) -{ - mutex_unlock(&bu92747_mutex); -} - - - - static int bu92747_cir_i2c_read_regs(struct i2c_client *client, u8 reg, u8 *buf, int len) { From ba19fa7b42c7432bb502f7cbbf9abbae8fa37ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 30 Aug 2011 16:04:57 +0800 Subject: [PATCH 035/150] rk29: cpufreq: better support 1.2G --- arch/arm/mach-rk29/cpufreq.c | 75 +++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/arch/arm/mach-rk29/cpufreq.c b/arch/arm/mach-rk29/cpufreq.c index 5001606d06ed..094bb0659528 100755 --- a/arch/arm/mach-rk29/cpufreq.c +++ b/arch/arm/mach-rk29/cpufreq.c @@ -121,15 +121,17 @@ static bool limit_fb1_is_on; static bool limit_hdmi_is_on; static inline bool aclk_limit(void) { return limit_hdmi_is_on && limit_fb1_is_on; } static int limit_index_816 = -1; -static int limit_index_1008 = -1; module_param(limit_fb1_is_on, bool, 0644); module_param(limit_hdmi_is_on, bool, 0644); -module_param(limit_index_816, int, 0444); -module_param(limit_index_1008, int, 0444); #else static inline bool aclk_limit(void) { return false; } #endif +#if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) +static int limit_index_1008 = -1; +static unsigned int limit_freq_1008; +#endif + #ifdef CONFIG_DDR_FREQ static void rk29_cpufreq_change_ddr_freq(unsigned long mhz); #else @@ -152,7 +154,10 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) limit_avg_index = -1; #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP limit_index_816 = -1; +#endif +#if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) limit_index_1008 = -1; + limit_freq_1008 = 0; #endif for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) { @@ -166,10 +171,14 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) (limit_index_816 < 0 || (limit_index_816 >= 0 && table[limit_index_816].frequency < table[i].frequency))) limit_index_816 = i; +#endif +#if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) if (table[i].frequency <= 1008 * KHZ && (limit_index_1008 < 0 || - (limit_index_1008 >= 0 && table[limit_index_1008].frequency < table[i].frequency))) + (limit_index_1008 >= 0 && table[limit_index_1008].frequency < table[i].frequency))) { limit_index_1008 = i; + limit_freq_1008 = table[i].frequency; + } #endif } @@ -194,6 +203,13 @@ static int rk29_cpufreq_verify(struct cpufreq_policy *policy) } #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP +#define TEMP_COEFF_IDLE -1000 +#define TEMP_COEFF_408 -325 +#define TEMP_COEFF_624 -202 +#define TEMP_COEFF_816 -78 +#define TEMP_COEFF_1008 325 +#define TEMP_COEFF_1200 (TEMP_COEFF_1008 * 5 / 2) +#define WORK_DELAY (2*HZ) static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned int relation, int *index) { int c, ms; @@ -203,6 +219,10 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i u64 idle_time_us; static u64 last_idle_time_us; unsigned int cur = policy->cur; + int overheat_temp_1200, overheat_temp; + int temp; + int target_index; + unsigned int target_freq; if (!limit || !rk29_cpufreq_is_ondemand_policy(policy) || (limit_avg_index < 0) || (relation & MASK_FURTHER_CPUFREQ)) { @@ -219,29 +239,46 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i return; } - limit_temp -= idle_time_us - last_idle_time_us; // -1000 - dprintk(DEBUG_TEMP, "idle %lld us (%lld - %lld)\n", idle_time_us - last_idle_time_us, idle_time_us, last_idle_time_us); - last_idle_time_us = idle_time_us; + temp = limit_temp; + if (idle_time_us != last_idle_time_us) { + temp -= idle_time_us - last_idle_time_us; // -1000 + dprintk(DEBUG_TEMP, "idle %lld us\n", idle_time_us - last_idle_time_us); + last_idle_time_us = idle_time_us; + } ms = div_u64(ktime_us_delta(now, last), 1000); - dprintk(DEBUG_TEMP, "%d kHz (%d uV) elapsed %d ms (%lld - %lld)\n", cur, vcore_uV, ms, now.tv64, last.tv64); + dprintk(DEBUG_TEMP, "%d kHz (%d uV) elapsed %d ms\n", cur, vcore_uV, ms); last = now; if (cur <= 408 * 1000) - c = -325; + c = TEMP_COEFF_408; else if (cur <= 624 * 1000) - c = -202; + c = TEMP_COEFF_624; else if (cur <= limit_avg_freq) - c = -78; + c = TEMP_COEFF_816; + else if (cur <= 1008 * 1000) + c = TEMP_COEFF_1008; else - c = 325; - limit_temp += c * ms; + c = TEMP_COEFF_1200; + temp += c * ms; - if (limit_temp < 0) - limit_temp = 0; - if (limit_temp > 325 * limit_secs * 1000 && freq_table[*index].frequency > limit_avg_freq) - *index = limit_avg_index; - dprintk(DEBUG_TEMP, "c %d temp %d (%s) index %d", c, limit_temp, limit_temp > 325 * limit_secs * 1000 ? "overheat" : "normal", *index); + if (temp < 0) + temp = 0; + + target_index = *index; + target_freq = freq_table[target_index].frequency; + overheat_temp = TEMP_COEFF_1008 * limit_secs * 1000; + overheat_temp_1200 = overheat_temp - TEMP_COEFF_1200 * (WORK_DELAY/HZ) * 1000; + + if (temp > overheat_temp && target_freq > limit_avg_freq) + target_index = limit_avg_index; + else if (target_freq > limit_freq_1008 && limit_freq_1008 > limit_avg_freq && + temp > overheat_temp_1200 && temp <= overheat_temp) + target_index = limit_index_1008; + + limit_temp = temp; + *index = target_index; + dprintk(DEBUG_TEMP, "c %d temp %d (%s) index %d\n", c, temp, temp > overheat_temp ? "overheat" : "normal", target_index); } #else #define rk29_cpufreq_limit_by_temp(...) do {} while (0) @@ -377,7 +414,6 @@ static int rk29_cpufreq_target(struct cpufreq_policy *policy, unsigned int targe #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP static void rk29_cpufreq_limit_by_temp_work_func(struct work_struct *work); static DECLARE_DELAYED_WORK(rk29_cpufreq_limit_by_temp_work, rk29_cpufreq_limit_by_temp_work_func); -#define WORK_DELAY HZ static int rk29_cpufreq_notifier_policy(struct notifier_block *nb, unsigned long val, void *data) @@ -407,6 +443,7 @@ static void rk29_cpufreq_limit_by_temp_work_func(struct work_struct *work) struct cpufreq_policy *policy = cpufreq_cpu_get(0); if (policy) { + dprintk(DEBUG_TEMP, "target %d KHz\n", policy->cur); cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L); cpufreq_cpu_put(policy); } From c68e9a8580a75fcd590f8209d1d63beb53f0e196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E9=87=91=E6=B3=89?= Date: Tue, 30 Aug 2011 17:27:58 +0800 Subject: [PATCH 036/150] =?UTF-8?q?=E8=A7=A3=E5=86=B3kernel=20logo?= =?UTF-8?q?=E5=8D=A0=E7=94=A8=E7=A9=BA=E9=97=B4=E8=BF=87=E5=A4=A7=E9=97=AE?= =?UTF-8?q?=E9=A2=98,=E9=9C=80=E4=BD=BF=E7=94=A8=E6=96=B0tool=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0kernel=20logo=E6=9B=BF=E6=8D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/pnmtologo.c | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/scripts/pnmtologo.c b/scripts/pnmtologo.c index d38bbe16b930..b5beb5bc5eb5 100755 --- a/scripts/pnmtologo.c +++ b/scripts/pnmtologo.c @@ -40,8 +40,6 @@ static const char *logo_types[LINUX_LOGO_GRAY256+1] = { }; #define MAX_LINUX_LOGO_COLORS 224 -#define MAX_LINUX_LOGO_WIDTH 1280 -#define MAX_LINUX_LOGO_HEIGHT 800 struct color { unsigned char red; @@ -393,6 +391,11 @@ static void write_logo_clut224(void) /* write file header */ write_header(); + write_hex((unsigned char)(logo_width >> 8)); + write_hex((unsigned char)logo_width); + write_hex((unsigned char)(logo_height >> 8)); + write_hex((unsigned char)logo_height); + for (i = 0; i < sizeof(data_name); i++){ write_hex(data_name[i]); } @@ -410,26 +413,6 @@ static void write_logo_clut224(void) write_hex(k+32); } - if (logo_height < MAX_LINUX_LOGO_HEIGHT || logo_width < MAX_LINUX_LOGO_WIDTH) { - if (logo_height == MAX_LINUX_LOGO_HEIGHT) { - for (i = 0; i < MAX_LINUX_LOGO_HEIGHT; i++) - for (j = logo_width; j < MAX_LINUX_LOGO_WIDTH; j++) - write_hex(32); - } else if (logo_width == MAX_LINUX_LOGO_WIDTH) { - for (i = logo_height; i < MAX_LINUX_LOGO_HEIGHT; i++) - for (j = 0; j < MAX_LINUX_LOGO_WIDTH; j++) - write_hex(32); - } else { - for (i = logo_height; i < MAX_LINUX_LOGO_HEIGHT; i++) - for (j = 0; j < MAX_LINUX_LOGO_WIDTH; j++) - write_hex(32); - - for (i = 0; i < logo_height; i++) - for (j = logo_width; j < MAX_LINUX_LOGO_WIDTH; j++) - write_hex(32); - } - } - fputs("\n};\n\n", out); /* write logo clut */ @@ -449,6 +432,11 @@ static void write_logo_clut224(void) write_hex(logo_clut[i].blue); } + for (i = logo_clutsize; i < (MAX_LINUX_LOGO_COLORS * 3); i++) + { + write_hex(32); + } + /* write logo structure and file footer */ write_footer(); } From 6a8deefc1c0669dc4a273324c61b0003ac2bb607 Mon Sep 17 00:00:00 2001 From: yangkai Date: Wed, 31 Aug 2011 10:24:26 +0800 Subject: [PATCH 037/150] change msc buffer flush depends on usb packets --- drivers/usb/gadget/f_mass_storage.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) mode change 100644 => 100755 drivers/usb/gadget/f_mass_storage.c diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c old mode 100644 new mode 100755 index 71798209bc83..32bf6fcc625e --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -84,7 +84,8 @@ #define BULK_BUFFER_SIZE 16384 * 4//4096 /* flush after every 4 meg of writes to avoid excessive block level caching */ -#define MAX_UNFLUSHED_BYTES (512 * 1024)// (4 * 1024 * 1024) //original value is 4MB,Modifyed by xbw at 2011-08-18 +//#define MAX_UNFLUSHED_BYTES (512 * 1024)// (4 * 1024 * 1024) //original value is 4MB,Modifyed by xbw at 2011-08-18 +#define MAX_UNFLUSHED_PACKETS 16 /*-------------------------------------------------------------------------*/ @@ -233,7 +234,7 @@ struct lun { struct file *filp; loff_t file_length; loff_t num_sectors; - unsigned int unflushed_bytes; + unsigned int unflushed_packet; unsigned int ro : 1; unsigned int prevent_medium_removal : 1; @@ -1079,10 +1080,10 @@ static int do_write(struct fsg_dev *fsg) fsg->residue -= nwritten; #ifdef MAX_UNFLUSHED_BYTES - curlun->unflushed_bytes += nwritten; - if (curlun->unflushed_bytes >= MAX_UNFLUSHED_BYTES) { + curlun->unflushed_packet ++; + if (curlun->unflushed_packet >= MAX_UNFLUSHED_PACKETS) { fsync_sub(curlun); - curlun->unflushed_bytes = 0; + curlun->unflushed_packet = 0; } #endif /* If an error occurred, report it and its position */ @@ -2754,7 +2755,7 @@ static int open_backing_file(struct fsg_dev *fsg, struct lun *curlun, curlun->ro = ro; curlun->filp = filp; curlun->file_length = size; - curlun->unflushed_bytes = 0; + curlun->unflushed_packet = 0; curlun->num_sectors = num_sectors; LDBG(curlun, "open backing file: %s size: %lld num_sectors: %lld\n", filename, size, num_sectors); From 99b6d2267bd84bb303d09a463d1ba3addfd692a3 Mon Sep 17 00:00:00 2001 From: CMY Date: Wed, 31 Aug 2011 10:55:09 +0800 Subject: [PATCH 038/150] Add some 3G dongle --- drivers/base/devices_filter.h | 15 ++------------- drivers/usb/serial/option.c | 4 ++++ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/drivers/base/devices_filter.h b/drivers/base/devices_filter.h index 0a39257583ad..e53840a0f590 100644 --- a/drivers/base/devices_filter.h +++ b/drivers/base/devices_filter.h @@ -55,6 +55,8 @@ static usb_parameter skip_device_list[] = { // 山寨 // {0x05C6, -1, NULL, NULL, NULL}, + {0x05C6, 0x1000, NULL, NULL, NULL}, + {0x1AB7, 0x5700, NULL, NULL, NULL}, {0x20B9, 0x1682, NULL, NULL, NULL}, {0x028A, 0x1006, NULL, NULL, NULL}, @@ -71,19 +73,6 @@ static usb_parameter skip_device_list[] = { {0x0685, 0x7000, NULL, NULL, NULL}, }; -/* - 0 - 不同 - 1 - 相同 - */ -static int match_string(const char* s1, const char* s2) -{ - int count = 0; - while( s1[count] && s2[count] && !(s1[count]-s2[count]) ) - ++count; - - return !(s1[count]-s2[count]); -} - /* 1 - match * 0 - no match */ diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 2c07ad320cee..a7ab681063aa 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -955,6 +955,10 @@ static struct usb_device_id option_ids[] = { { USB_DEVICE(0x04CC, 0x226E) }, { USB_DEVICE(0x04CC, 0x225A) }, { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0015) }, + { USB_DEVICE(ALCATEL_VENDOR_ID, 0x00b7) }, + { USB_DEVICE(ZTE_VENDOR_ID, 0xFFFF) }, + { USB_DEVICE(LEADCORE_VENDOR_ID, 0x5700) }, + { USB_DEVICE(LEADCORE_VENDOR_ID, 0x6341) }, /* Cinterion */ { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, From d7915d341abd2ec436e513daaae48e15e957a7f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E9=87=91=E6=B3=89?= Date: Wed, 31 Aug 2011 12:46:31 +0800 Subject: [PATCH 039/150] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BC=80=E6=9C=BAker?= =?UTF-8?q?nel=20logo=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/pnmtologo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pnmtologo.c b/scripts/pnmtologo.c index b5beb5bc5eb5..3b2698d427fc 100755 --- a/scripts/pnmtologo.c +++ b/scripts/pnmtologo.c @@ -278,7 +278,7 @@ static void write_footer(void) if (logo_type == LINUX_LOGO_CLUT224) { fprintf(out, "\t.clut\t\t= &(%s_clut[%ld]),\n", logoname, sizeof(clut_name)); - fprintf(out, "\t.data\t\t= &(%s_data[%ld])\n", logoname, sizeof(data_name)); + fprintf(out, "\t.data\t\t= &(%s_data[%ld])\n", logoname, sizeof(data_name) + 4); } else { fprintf(out, "\t.width\t\t= %d,\n", logo_width); fprintf(out, "\t.height\t\t= %d,\n", logo_height); From aca7b2eafcf65a2ffbbd9651f939181a30baf98e Mon Sep 17 00:00:00 2001 From: xbw Date: Wed, 31 Aug 2011 14:34:13 +0800 Subject: [PATCH 040/150] modify the bug about host-state error --- drivers/mmc/core/core.c | 8 ++++- drivers/mmc/host/rk29_sdmmc.c | 57 ++++++++++++++++++++++++----------- include/linux/mmc/host.h | 1 + 3 files changed, 48 insertions(+), 18 deletions(-) mode change 100644 => 100755 drivers/mmc/core/core.c mode change 100644 => 100755 include/linux/mmc/host.h diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c old mode 100644 new mode 100755 index dd2a7a006438..519722a41b6b --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -195,6 +195,7 @@ static void mmc_wait_done(struct mmc_request *mrq) */ void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq) { + unsigned long waittime; DECLARE_COMPLETION_ONSTACK(complete); mrq->done_data = &complete; @@ -203,7 +204,12 @@ void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq) mmc_start_request(host, mrq); #if defined(CONFIG_SDMMC_RK29) && !defined(CONFIG_SDMMC_RK29_OLD) - wait_for_completion_timeout(&complete,HZ*3); //for cmd dead. Modifyed by xbw at 2011-06-02 + waittime = wait_for_completion_timeout(&complete,HZ*7); //for cmd dead. Modifyed by xbw at 2011-06-02 + if(waittime <= 1) + { + host->doneflag = 0; + printk("%s...%d.. =====!!!!!!!!!CMD%d timeout ===xbw===\n",__FUNCTION__, __LINE__, mrq->cmd->opcode); + } #else wait_for_completion(&complete); #endif diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index c8c42ffde1e6..6db516289c73 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.04 The last modify date is 2011-08-24,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.05 The last modify date is 2011-08-29,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -196,6 +196,7 @@ struct rk29_sdmmc { unsigned int oldstatus; unsigned int complete_done; + unsigned int retryfunc; #ifdef CONFIG_PM int gpio_irq; int gpio_det; @@ -209,6 +210,8 @@ static struct rk29_sdmmc *globalSDhost[3]; #define rk29_sdmmc_test_and_clear_pending(host, event) \ test_and_clear_bit(event, &host->pending_events) +#define rk29_sdmmc_test_pending(host, event) \ + test_bit(event, &host->pending_events) #define rk29_sdmmc_set_completed(host, event) \ set_bit(event, &host->completed_events) @@ -677,7 +680,8 @@ static int rk29_sdmmc_start_command(struct rk29_sdmmc *host, struct mmc_command host->errorstep = 0x1; return SDM_WAIT_FOR_CMDSTART_TIMEOUT; } - + host->mmc->doneflag = 1; + return SDM_SUCCESS; } @@ -732,7 +736,7 @@ static int rk29_sdmmc_wait_unbusy(struct rk29_sdmmc *host) static void send_stop_cmd(struct rk29_sdmmc *host) { - mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+250)); + mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+600)); host->stopcmd.opcode = MMC_STOP_TRANSMISSION; host->stopcmd.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;; @@ -1681,7 +1685,6 @@ static int rk29_sdmmc_start_request(struct mmc_host *mmc ) mrq = host->new_mrq; cmd = mrq->cmd; cmd->error = 0; - host->complete_done = 0; cmdr = rk29_sdmmc_prepare_command(cmd); ret = SDM_SUCCESS; @@ -1735,6 +1738,8 @@ static int rk29_sdmmc_start_request(struct mmc_host *mmc ) host->errorstep = 0; host->dodma = 0; + host->complete_done = 0; + host->retryfunc = 0; if(RK29_CTRL_SDMMC_ID == host->pdev->id) { @@ -2381,11 +2386,12 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) struct rk29_sdmmc *host = (struct rk29_sdmmc *)priv; struct mmc_data *data = host->cmd->data; enum rk29_sdmmc_state state = host->state; - + int pending_flag; + spin_lock(&host->lock); - - state = host->state; + state = host->state; + pending_flag = 0; do { switch (state) @@ -2419,7 +2425,7 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) __FUNCTION__, __LINE__,host->cmd->opcode,host->dma_name); host->complete_done = 1; - goto unlock; + break;//goto unlock; } if(host->cmd->error) @@ -2440,7 +2446,7 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) } - state = STATE_DATA_BUSY; + state = STATE_DATA_BUSY; /* fall through */ } @@ -2465,7 +2471,7 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) if(!( (MMC_READ_SINGLE_BLOCK == host->cmd->opcode)&&( -EIO == data->error))) //deal with START_BIT_ERROR { host->complete_done = 1; - goto unlock; + break;//goto unlock; } } @@ -2491,11 +2497,22 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) rk29_sdmmc_request_end(host, host->cmd); host->complete_done = 1; - goto unlock; + break;//goto unlock; } } - } while(0); + + pending_flag = (1==host->complete_done) && (host->retryfunc<50) \ + && (rk29_sdmmc_test_pending(host, EVENT_CMD_COMPLETE)|| rk29_sdmmc_test_pending(host, EVENT_DATA_COMPLETE) ); + if(pending_flag) + { + printk("%s..%d... cmd=%d(arg=0x%x),retrycount=%d, host->state=0x%x,\n pendingEvent=0x%lu, completeEvents=0x%lu ====xbw[%s]====\n",\ + __FUNCTION__, __LINE__,host->cmd->opcode,host->cmd->arg, host->retryfunc, host->state, \ + host->pending_events,host->completed_events,host->dma_name); + cpu_relax(); + } + + } while(pending_flag && ++host->retryfunc); //while(0); host->state = state; @@ -2509,7 +2526,7 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) host->state = STATE_IDLE; spin_unlock(&host->lock); - if(host->mrq) + if(host->mrq && host->mmc->doneflag) { mmc_request_done(host->mmc, host->mrq); } @@ -2620,6 +2637,9 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_SDIO); mmc_signal_sdio_irq(host->mmc); + + spin_unlock_irqrestore(&host->lock, iflags); + return IRQ_HANDLED; } @@ -2810,6 +2830,7 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) host->error_times = 0; host->state = STATE_IDLE; host->complete_done = 0; + host->retryfunc = 0; host->mrq = NULL; host->new_mrq = NULL; @@ -2871,6 +2892,7 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) | MMC_VDD_31_32|MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_34_35| MMC_VDD_35_36; ///set valid volage 2.7---3.6v mmc->caps = pdata->host_caps; mmc->re_initialized_flags = 1; + mmc->doneflag = 1; /* * We can do SGIO @@ -2902,6 +2924,11 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) tasklet_init(&host->tasklet, rk29_sdmmc_tasklet_func, (unsigned long)host); + /* Create card detect handler thread */ + setup_timer(&host->detect_timer, rk29_sdmmc_detect_change,(unsigned long)host); + setup_timer(&host->request_timer,rk29_sdmmc_INT_CMD_DONE_timeout,(unsigned long)host); + setup_timer(&host->DTO_timer,rk29_sdmmc_INT_DTO_timeout,(unsigned long)host); + irq = platform_get_irq(pdev, 0); if (irq < 0) { @@ -2991,10 +3018,6 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) } } - /* Create card detect handler thread */ - setup_timer(&host->detect_timer, rk29_sdmmc_detect_change,(unsigned long)host); - setup_timer(&host->request_timer,rk29_sdmmc_INT_CMD_DONE_timeout,(unsigned long)host); - setup_timer(&host->DTO_timer,rk29_sdmmc_INT_DTO_timeout,(unsigned long)host); platform_set_drvdata(pdev, mmc); diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h old mode 100644 new mode 100755 index f19c1cf7a66f..4125ef55faee --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -204,6 +204,7 @@ struct mmc_host { #define MMC_BUSRESUME_NEEDS_RESUME (1 << 1) unsigned int re_initialized_flags; //in order to begin the rescan ; added by xbw@2011-04-07 + unsigned int doneflag;//added by xbw at 2011-08-27 unsigned int sdio_irqs; struct task_struct *sdio_irq_thread; From 13a3936ec4ffc6877930637b4443f6a8f0cb728a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Wed, 31 Aug 2011 16:03:06 +0800 Subject: [PATCH 041/150] rk29: vpu_service: add reset operation when vpu error, add status dump --- arch/arm/mach-rk29/vpu_service.c | 112 ++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 39 deletions(-) diff --git a/arch/arm/mach-rk29/vpu_service.c b/arch/arm/mach-rk29/vpu_service.c index 585929479819..bdebd44b19e7 100644 --- a/arch/arm/mach-rk29/vpu_service.c +++ b/arch/arm/mach-rk29/vpu_service.c @@ -182,27 +182,85 @@ static void vpu_reset(void) cru_set_soft_reset(SOFT_RST_DDR_VCODEC_PORT, false); cru_set_soft_reset(SOFT_RST_CPU_VODEC_A2A_AHB, false); clk_enable(aclk_ddr_vepu); + service.reg_codec = NULL; + service.reg_pproc = NULL; + service.reg_resev = NULL; +} + +static void reg_deinit(vpu_reg *reg); +static void vpu_service_session_clear(vpu_session *session) +{ + unsigned long flag; + vpu_reg *reg, *n; + spin_lock_irqsave(&service.lock, flag); + list_for_each_entry_safe(reg, n, &session->waiting, session_link) { + reg_deinit(reg); + } + list_for_each_entry_safe(reg, n, &session->running, session_link) { + reg_deinit(reg); + } + list_for_each_entry_safe(reg, n, &session->done, session_link) { + reg_deinit(reg); + } + spin_unlock_irqrestore(&service.lock, flag); +} + +static void vpu_service_dump(void) +{ + int running; + unsigned long flag; + vpu_reg *reg, *reg_tmp; + vpu_session *session, *session_tmp; + + spin_lock_irqsave(&service.lock, flag); + running = atomic_read(&service.total_running); + printk("total_running %d\n", running); + + printk("reg_codec 0x%.8x\n", (unsigned int)service.reg_codec); + printk("reg_pproc 0x%.8x\n", (unsigned int)service.reg_pproc); + printk("reg_resev 0x%.8x\n", (unsigned int)service.reg_resev); + + list_for_each_entry_safe(session, session_tmp, &service.session, list_session) { + printk("session pid %d type %d:\n", session->pid, session->type); + running = atomic_read(&session->task_running); + printk("task_running %d\n", running); + list_for_each_entry_safe(reg, reg_tmp, &session->waiting, session_link) { + printk("waiting register set 0x%.8x\n", (unsigned int)reg); + } + list_for_each_entry_safe(reg, reg_tmp, &session->running, session_link) { + printk("running register set 0x%.8x\n", (unsigned int)reg); + } + list_for_each_entry_safe(reg, reg_tmp, &session->done, session_link) { + printk("done register set 0x%.8x\n", (unsigned int)reg); + } + } + spin_unlock_irqrestore(&service.lock, flag); } static void vpu_service_power_off(void) { + int total_running; + if (!service.enabled) return; service.enabled = false; - printk("vpu: power off\n"); - - while(atomic_read(&service.total_running)) { - pr_alert("power off when task running!!\n"); - udelay(10); + total_running = atomic_read(&service.total_running); + if (total_running) { + pr_alert("power off when %d task running!!\n", total_running); + mdelay(50); + pr_alert("delay 50 ms for running task\n"); + vpu_service_dump(); } + printk("vpu: power off..."); pmu_set_power_domain(PD_VCODEC, false); udelay(10); clk_disable(hclk_cpu_vcodec); clk_disable(aclk_ddr_vepu); clk_disable(hclk_vepu); clk_disable(aclk_vepu); + printk("done\n"); } static void vpu_service_power_off_work_func(unsigned long data) @@ -413,9 +471,9 @@ static void try_set_reg(void) vpu_reg *reg = list_entry(service.waiting.next, vpu_reg, status_link); if (((VPU_DEC_PP == reg->type) && (NULL == service.reg_codec) && (NULL == service.reg_pproc)) || - ((VPU_DEC == reg->type) && (NULL == service.reg_codec)) || - ((VPU_PP == reg->type) && (NULL == service.reg_pproc)) || - ((VPU_ENC == reg->type) && (NULL == service.reg_codec))) { + ((VPU_DEC == reg->type) && (NULL == service.reg_codec)) || + ((VPU_PP == reg->type) && (NULL == service.reg_pproc)) || + ((VPU_ENC == reg->type) && (NULL == service.reg_codec))) { reg_from_wait_to_run(reg); vpu_service_power_on(); reg_copy_to_hw(reg); @@ -520,8 +578,12 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long if (unlikely(ret < 0)) { pr_err("pid %d wait task ret %d\n", session->pid, ret); } else if (0 == ret) { + pr_err("pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running)); + ret = -ETIMEDOUT; + } + if (ret < 0) { int task_running = atomic_read(&session->task_running); - pr_err("pid %d wait %d task done timeout\n", session->pid, task_running); + vpu_service_dump(); if (task_running) { atomic_set(&session->task_running, 0); atomic_sub(task_running, &service.total_running); @@ -529,21 +591,7 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long vpu_reset(); pr_err("done\n"); } - ret = -ETIMEDOUT; - } - if (ret < 0) { - vpu_reg *reg, *n; - spin_lock_irqsave(&service.lock, flag); - list_for_each_entry_safe(reg, n, &session->waiting, session_link) { - reg_deinit(reg); - } - list_for_each_entry_safe(reg, n, &session->running, session_link) { - reg_deinit(reg); - } - list_for_each_entry_safe(reg, n, &session->done, session_link) { - reg_deinit(reg); - } - spin_unlock_irqrestore(&service.lock, flag); + vpu_service_session_clear(session); return ret; } } @@ -668,7 +716,6 @@ static int vpu_service_open(struct inode *inode, struct file *filp) static int vpu_service_release(struct inode *inode, struct file *filp) { - unsigned long flag; int task_running; vpu_session *session = (vpu_session *)filp->private_data; if (NULL == session) @@ -685,20 +732,7 @@ static int vpu_service_release(struct inode *inode, struct file *filp) //vpu_service_fasync(-1, filp, 0); list_del(&session->list_session); - spin_lock_irqsave(&service.lock, flag); - { - vpu_reg *reg, *n; - list_for_each_entry_safe(reg, n, &session->waiting, session_link) { - reg_deinit(reg); - } - list_for_each_entry_safe(reg, n, &session->running, session_link) { - reg_deinit(reg); - } - list_for_each_entry_safe(reg, n, &session->done, session_link) { - reg_deinit(reg); - } - } - spin_unlock_irqrestore(&service.lock, flag); + vpu_service_session_clear(session); kfree(session); From d0d306e3acb3e28d3993ae034d281184dfb1001b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Wed, 31 Aug 2011 18:50:44 +0800 Subject: [PATCH 042/150] rk29: vpu_service: fix bug on task counting --- arch/arm/mach-rk29/vpu_service.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-rk29/vpu_service.c b/arch/arm/mach-rk29/vpu_service.c index bdebd44b19e7..91695dd31c3b 100644 --- a/arch/arm/mach-rk29/vpu_service.c +++ b/arch/arm/mach-rk29/vpu_service.c @@ -586,10 +586,9 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long vpu_service_dump(); if (task_running) { atomic_set(&session->task_running, 0); - atomic_sub(task_running, &service.total_running); - pr_err("%d task is running but not return, reset hardware...", task_running); + printk("%d task is running but not return, reset hardware...", task_running); vpu_reset(); - pr_err("done\n"); + printk("done\n"); } vpu_service_session_clear(session); return ret; From e9ee7749cb891e1c82b220bf46633ef959e86a91 Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 30 Aug 2011 02:30:38 -0700 Subject: [PATCH 043/150] add it7260 touchscreen driver for rk29 kernel --- drivers/input/touchscreen/IT7260_ts.h | 29 + drivers/input/touchscreen/IT7260_ts_i2c.c | 858 ++++++++++++++++++++++ drivers/input/touchscreen/Kconfig | 10 + drivers/input/touchscreen/Makefile | 1 + 4 files changed, 898 insertions(+) create mode 100755 drivers/input/touchscreen/IT7260_ts.h create mode 100755 drivers/input/touchscreen/IT7260_ts_i2c.c mode change 100644 => 100755 drivers/input/touchscreen/Kconfig mode change 100644 => 100755 drivers/input/touchscreen/Makefile diff --git a/drivers/input/touchscreen/IT7260_ts.h b/drivers/input/touchscreen/IT7260_ts.h new file mode 100755 index 000000000000..eca2e3d9b56e --- /dev/null +++ b/drivers/input/touchscreen/IT7260_ts.h @@ -0,0 +1,29 @@ +#define MAX_BUFFER_SIZE 144 +#define MAX_FINGER_NUMBER 3 +#define MAX_PRESSURE 15 +#define DEVICE_NAME "IT7260" +#define DEVICE_VENDOR 0 +#define DEVICE_PRODUCT 0 +#define DEVICE_VERSION 0 +#define IT7260_X_RESOLUTION 1024 +#define IT7260_Y_RESOLUTION 600 +#define SCREEN_X_RESOLUTION 1024 +#define SCREEN_Y_RESOLUTION 600 +#define VERSION_ABOVE_ANDROID_20 + +//unsigned char bufferIndex; +//unsigned int length; +//unsigned char buffer[MAX_BUFFER_SIZE]; +struct ioctl_cmd168 { + unsigned short bufferIndex; + unsigned short length; + unsigned short buffer[MAX_BUFFER_SIZE]; +}; + +#define IOC_MAGIC 'd' +#define IOCTL_SET _IOW(IOC_MAGIC, 1, struct ioctl_cmd168) +#define IOCTL_GET _IOR(IOC_MAGIC, 2, struct ioctl_cmd168) +#define IOCTL_READ_CDC _IOR(IOC_MAGIC, 0x10, struct ioctl_cmd168) +//#define IOCTL_SET _IOW(IOC_MAGIC, 1, struct ioctl_cmd) +//#define IOCTL_GET _IOR(IOC_MAGIC, 2, struct ioctl_cmd) +//#define IOCTL_READ_CDC _IOR(IOC_MAGIC, 0x10, struct ioctl_cmd) diff --git a/drivers/input/touchscreen/IT7260_ts_i2c.c b/drivers/input/touchscreen/IT7260_ts_i2c.c new file mode 100755 index 000000000000..fc6884669f8c --- /dev/null +++ b/drivers/input/touchscreen/IT7260_ts_i2c.c @@ -0,0 +1,858 @@ +/* drivers/input/touchscreen/IT7260_ts_i2c.c + * + * Copyright (C) 2007 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IT7260_ts.h" + +// >>> [110308] protect touch panel [Derek] +#include +#include + +static struct timer_list tp_timer; +static void tp_irq_handler_reg(unsigned long arg); + +// <<< [110308] protect touch panel [Derek] + +extern void set_tp_status(int number, int status) ; +extern int get_tp_status(int number) ; + +#define IT7260_I2C_NAME "IT7260" +#include +static int ite7260_major = 0; // dynamic major by default +static int ite7260_minor = 0; +static struct cdev ite7260_cdev; +static struct class *ite7260_class = NULL; +static dev_t ite7260_dev; +static struct input_dev *input_dev; + +#ifdef DEBUG +#define TS_DEBUG(fmt,args...) printk( KERN_DEBUG "[it7260_i2c]: " fmt, ## args) +#define DBG() printk("[%s]:%d => \n",__FUNCTION__,__LINE__) +#else +#define TS_DEBUG(fmt,args...) +#define DBG() +#endif + +static struct workqueue_struct *IT7260_wq; + +struct IT7260_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + int use_irq; + struct work_struct work; + struct early_suspend early_suspend; + uint8_t debug_log_level; +}; +#ifdef CONFIG_HAS_EARLYSUSPEND +static void IT7260_ts_early_suspend(struct early_suspend *h); +static void IT7260_ts_late_resume(struct early_suspend *h); +#endif + +static struct IT7260_ts_data *gl_ts; + +int i2cReadFromIt7260(struct i2c_client *client, unsigned char bufferIndex, + unsigned char dataBuffer[], unsigned short dataLength) { + int ret; + struct i2c_msg msgs[2] = { { .addr = client->addr, .flags = I2C_M_NOSTART, + .len = 1, .buf = &bufferIndex }, { .addr = client->addr, .flags = + I2C_M_RD, .len = dataLength, .buf = dataBuffer } }; + + memset(dataBuffer, 0xFF, dataLength); + ret = i2c_transfer(client->adapter, msgs, 2); + return ret; +} + +int i2cWriteToIt7260(struct i2c_client *client, unsigned char bufferIndex, + unsigned char const dataBuffer[], unsigned short dataLength) { + unsigned char buffer4Write[256]; + struct i2c_msg msgs[1] = { { .addr = client->addr, .flags = 0, .len = + dataLength + 1, .buf = buffer4Write } }; + + buffer4Write[0] = bufferIndex; + memcpy(&(buffer4Write[1]), dataBuffer, dataLength); + return i2c_transfer(client->adapter, msgs, 1); +} + +static int IdentifyCapSensor(struct IT7260_ts_data *ts); + +static void Read_Point(struct IT7260_ts_data *ts) { + unsigned char ucQuery = 0; + unsigned char pucPoint[14]; +#ifdef HAS_8_BYTES_LIMIT + unsigned char cPoint[8]; + unsigned char ePoint[6]; +#endif //HAS_8_BYTES_LIMIT + int ret = 0; + int finger2_pressed = 0; + int xraw, yraw, xtmp, ytmp; + int i = 0; + static int x[2] = { (int) -1, (int) -1 }; + static int y[2] = { (int) -1, (int) -1 }; + static bool finger[2] = { 0, 0 }; + static bool flag = 0; + + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + if (ucQuery < 0) { + //pr_info("=error Read_Point=\n"); + if (ts->use_irq) + enable_irq(ts->client->irq); + return; + } else { + if (ucQuery & 0x80) { +#ifdef HAS_8_BYTES_LIMIT + i2cReadFromIt7260(ts->client, 0xC0, cPoint, 8); + ret = i2cReadFromIt7260(ts->client, 0xE0, ePoint, 6); + for(i=0; i<6; i++) { + pucPoint[i] = ePoint[i]; + } + for(i=0; i<8; i++) { + pucPoint[i+6] = cPoint[i]; + } +#else //HAS_8_BYTES_LIMIT + ret = i2cReadFromIt7260(ts->client, 0xE0, pucPoint, 14); +#endif //HAS_8_BYTES_LIMIT + //pr_info("=Read_Point read ret[%d]--point[%x][%x][%x][%x][%x][%x][%x][%x][%x][%x][%x][%x][%x][%x]=\n", + // ret,pucPoint[0],pucPoint[1],pucPoint[2], + // pucPoint[3],pucPoint[4],pucPoint[5],pucPoint[6],pucPoint[7],pucPoint[8], + // pucPoint[9],pucPoint[10],pucPoint[11],pucPoint[12],pucPoint[13]); + if (ret) { + // gesture + if (pucPoint[0] & 0xF0) { + if (ts->use_irq) + enable_irq(ts->client->irq); + //pr_info("(pucPoint[0] & 0xF0) is true, it's a gesture\n") ; + //pr_info("pucPoint[0]=%x\n", pucPoint[0]); + return; + } + // palm + if (pucPoint[1] & 0x01) { + if (ts->use_irq) + enable_irq(ts->client->irq); + //pr_info("pucPoint 1 is 0x01, it's a palm\n") ; + return; + } + // no more data + if (!(pucPoint[0] & 0x08)) { + if (finger[0]) { + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 1); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, pressure_point); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x[0]); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y[0]); + input_mt_sync(ts->input_dev); + finger[0] = 0; + flag = 1; + } + if (finger[1]) { + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 2); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, pressure_point); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x[1]); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y[1]); + input_mt_sync(ts->input_dev); + finger[1] = 0; + flag = 1; + } + if (flag) { + input_sync(ts->input_dev); + flag = 0; + } + if (ts->use_irq) + enable_irq(ts->client->irq); + //pr_info("(pucPoint[0] & 0x08) is false, means no more data\n") ; + return; + } + // 3 fingers + if (pucPoint[0] & 0x04) { + if (ts->use_irq) + enable_irq(ts->client->irq); + //pr_info("(pucPoint[0] & 0x04) is true, we don't support three fingers\n") ; + return; + } + + if (pucPoint[0] & 0x01) { + char pressure_point, z, w; + + xraw = ((pucPoint[3] & 0x0F) << 8) + pucPoint[2]; + yraw = ((pucPoint[3] & 0xF0) << 4) + pucPoint[4]; + + pressure_point = pucPoint[5] & 0x0f; + //pr_info("=Read_Point1 x=%d y=%d p=%d=\n",xraw,yraw,pressure_point); + + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 1); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 1); + //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, pressure_point); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, xraw); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, yraw); + input_mt_sync(ts->input_dev); + x[0] = xraw; + y[0] = yraw; + finger[0] = 1; + //pr_info("=input Read_Point1 x=%d y=%d p=%d=\n",xraw,yraw,pressure_point); + } else { + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 1); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, pressure_point); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x[0]); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y[0]); + input_mt_sync(ts->input_dev); + finger[0] = 0; + } + + if (pucPoint[0] & 0x02) { + char pressure_point, z, w; + xraw = ((pucPoint[7] & 0x0F) << 8) + pucPoint[6]; + yraw = ((pucPoint[7] & 0xF0) << 4) + pucPoint[8]; + + pressure_point = pucPoint[9] & 0x0f; + + //pr_info("=Read_Point2 x=%d y=%d p=%d=\n",xraw,yraw,pressure_point); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 2); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 1); + //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, pressure_point); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, xraw); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, yraw); + input_mt_sync(ts->input_dev); + x[1] = xraw; + y[1] = yraw; + finger[1] = 1; + //pr_info("input Read_Point2 x=%d y=%d p=%d=\n",xraw,yraw,pressure_point); + } else { + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 2); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, pressure_point); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x[1]); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y[1]); + input_mt_sync(ts->input_dev); + finger[1] = 0; + } + input_sync(ts->input_dev); + } + } + } + if (ts->use_irq) + enable_irq(ts->client->irq); + //pr_info("=end Read_Point=\n"); + + //IdentifyCapSensor(gl_ts); +} + +/////////////////////////////////////////////////////////////////////////////////////// + +static void IT7260_ts_work_func(struct work_struct *work) { + int i; + int ret; + int bad_data = 0; + struct i2c_msg msg[2]; + uint8_t start_reg; + uint8_t buf[15]; + //printk(KERN_INFO "=IT7260_ts_work_func=\n"); + struct IT7260_ts_data *ts = container_of(work, struct IT7260_ts_data, work); + gl_ts = ts; + Read_Point(ts); +} + +// >>> [110308] protect touch panel [Derek] +int delayCount = 1; +static irqreturn_t IT7260_ts_irq_handler(int irq, void *dev_id) { + struct IT7260_ts_data *ts = dev_id; + + if (delayCount == 1) + { + pr_info("=IT7260_ts_irq_handler=\n"); + } + + disable_irq_nosync(ts->client->irq); + queue_work(IT7260_wq, &ts->work); + return IRQ_HANDLED; +} +// <<< [110308] protect touch panel [Derek] + +///////////////////////////////////////////////////////// +void sendCalibrationCmd(void) { + int ret = 0; + struct IT7260_ts_data *ts = gl_ts; + unsigned char data[] = { 0x13, 0x00, 0x00, 0x00, 0x00 }; + unsigned char resp[2]; + + ret = i2cWriteToIt7260(ts->client, 0x20, data, 5); + printk(KERN_INFO "IT7260 sent calibration command [%d]!!!\n", ret); + + //MUST sleep 5 seconds here! + mdelay(5000); + + //Read out response to clear interrupt. + i2cReadFromIt7260(ts->client, 0xA0, resp, 2); +} + +EXPORT_SYMBOL( sendCalibrationCmd); + +// >>> [110308] protect touch panel [Derek] +static void tp_irq_handler_reg(unsigned long arg) +{ + delayCount = 0; +} +// <<< [110308] protect touch panel [Derek] + +static int IdentifyCapSensor(struct IT7260_ts_data *ts) { + unsigned char ucQuery; + unsigned char pucCmd[80]; + int ret = 0; + int test_read_count = 0; + //pr_info("=entry IdentifyCapSensor=\n"); + //pr_info("=entry IdentifyCapSensor---name[%s]---addr[%x]-flags[%d]=\n",ts->client->name,ts->client->addr,ts->client->flags); + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + //pr_info("=IdentifyCapSensor read 0x80 =%d=\n",ucQuery); + if (ucQuery < 0) { + msleep(250); + ucQuery = 0xFF; + } + while (ucQuery & 0x01) { + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + if (ucQuery < 0) { + ucQuery = 0xFF; + } + } + //pr_info("=IdentifyCapSensor write cmd=\n"); + pucCmd[0] = 0x00; + ret = i2cWriteToIt7260(ts->client, 0x20, pucCmd, 1); + if (ret < 0) { + printk(KERN_ERR "i2c_smbus_write_byte_data failed\n"); + /* fail? */ + return ret; + } + + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + if (ucQuery < 0) { + ucQuery = 0xFF; + } + test_read_count = 0; + while ((ucQuery & 0x01) && (test_read_count < 0x2000)) { + test_read_count++; + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + if (ucQuery < 0) { + ucQuery = 0xFF; + } + } + //pr_info("=IdentifyCapSensor write read id=\n"); + ret = i2cReadFromIt7260(ts->client, 0xA0, pucCmd, 8); + //pr_info( + // "=IdentifyCapSensor read id--[%d][%x][%x][%x][%x][%x][%x][%x][%x][%x][%x]=\n", + // ret, pucCmd[0], pucCmd[1], pucCmd[2], pucCmd[3], pucCmd[4], + // pucCmd[5], pucCmd[6], pucCmd[7], pucCmd[8], pucCmd[9]); + +} + +static int IT7260_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) { + struct IT7260_ts_data *ts; + int ret = 0; + struct IT7260_i2c_platform_data *pdata; + unsigned long irqflags; + unsigned char ucQuery = 0; + u8 cmdbuf[2] = { 0x07, 0 }; + + irqflags = IRQF_TRIGGER_HIGH; + pr_info("=entry IT7260_ts_probe=\n"); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk(KERN_ERR "IT7260_ts_probe: need I2C_FUNC_I2C\n"); + ret = -ENODEV; + goto err_check_functionality_failed; + } + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + if (ts == NULL) { + ret = -ENOMEM; + goto err_check_functionality_failed; + } + ts->client = client; + + ts->debug_log_level = 0x3; + ts->input_dev = input_dev; + + i2c_set_clientdata(client, ts); + pdata = client->dev.platform_data; + +#if 0 + //ret=IdentifyCapSensor(ts); + //if(ret<0) + // goto err_power_failed; + + // Ant start -- to identify if this device is exist + if (get_tp_status(1) == 0) + { + printk(KERN_ERR "The ite TP device is not exist\n"); + ret = -ENODEV; + goto err_power_failed; + } else { + set_tp_status(1, 1) ; + } + // Ant end +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 1; + ts->early_suspend.suspend = IT7260_ts_early_suspend; + ts->early_suspend.resume = IT7260_ts_late_resume; + register_early_suspend(&ts->early_suspend); +#endif + + //IT7260_wq = create_singlethread_workqueue("IT7260_wq"); + IT7260_wq = create_workqueue("IT7260_wq"); + if (!IT7260_wq) + goto err_check_functionality_failed; + INIT_WORK(&ts->work, IT7260_ts_work_func); + + // >>> [110308] protect touch panel [Derek] + init_timer(&tp_timer) ; + + tp_timer.expires = jiffies + 30 * HZ; + tp_timer.function = &tp_irq_handler_reg; + + add_timer(&tp_timer); + // >>> [110308] protect touch panel [Derek] + + pr_info("IT7260_ts_probe-client->irq[%d]=\n", client->irq); + if (client->irq) { + ret = request_irq(client->irq, IT7260_ts_irq_handler, IRQF_TRIGGER_LOW, +// ret = request_irq(client->irq, IT7260_ts_irq_handler, IRQF_DISABLED | IRQF_TRIGGER_LOW, +// ret = request_irq(client->irq, IT7260_ts_irq_handler, IRQF_SHARED | IRQF_TRIGGER_LOW, + client->name, ts); + pr_info("IT7260_ts_probe-request_irq[%d]=\n", ret); + if (ret == 0) + ts->use_irq = 1; + else + dev_err(&client->dev, "request_irq failed\n"); + } + + gl_ts = ts; + pr_info("=end IT7260_ts_probe=\n"); + + //To reset point queue. + i2cWriteToIt7260(ts->client, 0x20, cmdbuf, 1); + mdelay(10); + i2cReadFromIt7260(ts->client, 0xA0, cmdbuf, 2); + mdelay(10); + + return 0; + err_power_failed: kfree(ts); + + err_check_functionality_failed: return ret; + +} + +static int IT7260_ts_remove(struct i2c_client *client) { + return 0; +} + +static int IT7260_ts_suspend(struct i2c_client *client, pm_message_t mesg) { + char ret; + u8 cmdbuf[] = { 0x04, 0x00, 0x02 }; + + printk(KERN_DEBUG "IT7260_ts_i2c call suspend\n"); + if (i2cWriteToIt7260(client, 0x20, cmdbuf, 3) >= 0) + ret = 0; + else + ret = -1; + + return ret; +} + +static int IT7260_ts_resume(struct i2c_client *client) { + unsigned char ucQuery; + + printk(KERN_DEBUG "IT7260_ts_i2c call resume\n"); +#ifdef INT_PIN_OPEN_DRAIN + //TODO: Here 2 is the pin number of INT pin, so please modify it to the one your system uses. + gpio_direction_output(2, 0); + mdelay(10); +#endif //INT_PIN_OPEN_DRAIN + i2cReadFromIt7260(client, 0x80, &ucQuery, 1); +#ifdef INT_PIN_OPEN_DRAIN + mdelay(10); + gpio_direction_output(2, 1); + mdelay(50); + gpio_direction_input(2); +#endif //INT_PIN_OPEN_DRAIN + return 0; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void IT7260_ts_early_suspend(struct early_suspend *h) +{ + struct IT7260_ts_data *ts; + ts = container_of(h, struct IT7260_ts_data, early_suspend); + IT7260_ts_suspend(ts->client, PMSG_SUSPEND); +} + +static void IT7260_ts_late_resume(struct early_suspend *h) +{ + struct IT7260_ts_data *ts; + ts = container_of(h, struct IT7260_ts_data, early_suspend); + IT7260_ts_resume(ts->client); +} +#endif + +static const struct i2c_device_id IT7260_ts_id[] = { { IT7260_I2C_NAME, 0 }, + { } }; + +bool IT7260_Init(void) { + int i; + int tmp; + unsigned char ucQuery = 0; + unsigned char buffer[128]; + struct IT7260_ts_data *ts = gl_ts; + + // Identify Cap Sensor + do { + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + } while (ucQuery & 0x01); + buffer[0] = 0x00; + i2cWriteToIt7260(ts->client, 0x20, buffer, 1); + do { + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + } while (ucQuery & 0x01); + + memset(&buffer, 0, sizeof(buffer)); + i2cReadFromIt7260(ts->client, 0xA0, buffer, 8); + pr_info("=IT7260_Init --[%x][%x][%x][%x][%x][%x]=\n", buffer[0], buffer[1], + buffer[2], buffer[3], buffer[4], buffer[5]); + if (buffer[1] != 'I' || buffer[2] != 'T' || buffer[3] != 'E') { + // return false; + } + + // Get firmware information + do { + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + } while (ucQuery & 0x01); + buffer[0] = 0x01; + buffer[1] = 0x00; + i2cWriteToIt7260(ts->client, 0x20, buffer, 2); + do { + i2cReadFromIt7260(ts->client, 0x80, &ucQuery, 1); + } while (ucQuery & 0x01); + memset(&buffer, 0, sizeof(buffer)); + i2cReadFromIt7260(ts->client, 0xA0, buffer, 8); + tmp = 0; + //for (i = 5; i < 9; i++) { + for (i = 5; i < 8; i++) { + tmp += buffer[i]; + } + if (tmp == 0) { + // return false; + } + + //// Reinitialize Firmware + //set_ite_i2c_nostop(1); + //do { + // ucQuery = i2c_smbus_read_byte_data(ts->client, 0x80); + //} while (ucQuery & 0x01); + //buffer[0] = 0x6F; + //set_ite_i2c_nostop(0); + //i2c_smbus_write_byte_data(ts->client, 0x20, buffer[0]); + + return true; +} + +static struct i2c_driver IT7260_ts_driver = { .probe = IT7260_ts_probe, + .remove = IT7260_ts_remove, +#ifndef CONFIG_HAS_EARLYSUSPEND + .suspend = IT7260_ts_suspend, .resume = IT7260_ts_resume, +#endif + .id_table = IT7260_ts_id, .driver = { .name = "IT7260-ts", }, }; + +struct ite7260_data { + rwlock_t lock; + unsigned short bufferIndex; + unsigned short length; + unsigned short buffer[MAX_BUFFER_SIZE]; +}; + +int ite7260_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg) { + struct ite7260_data *dev = filp->private_data; + int retval = 0; + int i; + unsigned char ucQuery; + unsigned char buffer[MAX_BUFFER_SIZE]; + struct ioctl_cmd168 data; + unsigned char datalen; + unsigned char ent[] = {0x60, 0x00, 0x49, 0x54, 0x37, 0x32}; + unsigned char ext[] = {0x60, 0x80, 0x49, 0x54, 0x37, 0x32}; + + //pr_info("=ite7260_ioctl=\n"); + memset(&data, 0, sizeof(struct ioctl_cmd168)); + + switch (cmd) { + case IOCTL_SET: + //pr_info("=IOCTL_SET=\n"); + if (!access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd))) { + retval = -EFAULT; + goto done; + } + + if ( copy_from_user(&data, (int __user *)arg, sizeof(struct ioctl_cmd168)) ) { + retval = -EFAULT; + goto done; + } + buffer[0] = (unsigned char) data.bufferIndex; + //pr_info("%.2X ", buffer[0]); + for (i = 1; i < data.length + 1; i++) { + buffer[i] = (unsigned char) data.buffer[i - 1]; + //pr_info("%.2X ", buffer[i]); + } + if (!memcmp(&(buffer[1]), ent, sizeof(ent))) { + + pr_info("Disabling IRQ.\n"); + + disable_irq(gl_ts->client->irq); + + } + + if (!memcmp(&(buffer[1]), ext, sizeof(ext))) { + + pr_info("Enabling IRQ.\n"); + + enable_irq(gl_ts->client->irq); + + } + + //pr_info("=================================================\n"); + //pr_info("name[%s]---addr[%x]-flags[%d]=\n",gl_ts->client->name,gl_ts->client->addr,gl_ts->client->flags); + datalen = (unsigned char) (data.length + 1); + //pr_info("datalen=%d\n", datalen); + //write_lock(&dev->lock); + retval = i2cWriteToIt7260(gl_ts->client, + (unsigned char) data.bufferIndex, &(buffer[1]), datalen - 1); + //write_unlock(&dev->lock); + //pr_info("SET:retval=%x\n", retval); + retval = 0; + break; + + case IOCTL_GET: + //pr_info("=IOCTL_GET=\n"); + if (!access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd))) { + retval = -EFAULT; + goto done; + } + + if (!access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd))) { + retval = -EFAULT; + goto done; + } + + //pr_info("sizeof(struct ioctl_cmd168)=%d\n", sizeof(struct ioctl_cmd168)); + if ( copy_from_user(&data, (int __user *)arg, sizeof(struct ioctl_cmd168)) ) { + retval = -EFAULT; + goto done; + } + + //pr_info("=================================================\n"); + //pr_info("name[%s]---addr[%x]-flags[%d]=\n",gl_ts->client->name,gl_ts->client->addr,gl_ts->client->flags); + //read_lock(&dev->lock); + retval = i2cReadFromIt7260(gl_ts->client, + (unsigned char) data.bufferIndex, (unsigned char*) buffer, + (unsigned char) data.length); + //read_unlock(&dev->lock); + //pr_info("GET:retval=%x\n", retval); + retval = 0; + for (i = 0; i < data.length; i++) { + data.buffer[i] = (unsigned short) buffer[i]; + } + //pr_info("GET:bufferIndex=%x, dataLength=%d, buffer[0]=%x, buffer[1]=%x, buffer[2]=%x, buffer[3]=%x\n", data.bufferIndex, data.length, buffer[0], buffer[1], buffer[2], buffer[3]); + //pr_info("GET:bufferIndex=%x, dataLength=%d, buffer[0]=%x, buffer[1]=%x, buffer[2]=%x, buffer[3]=%x\n", data.bufferIndex, data.length, data.buffer[0], data.buffer[1], data.buffer[2], data.buffer[3]); + //if (data.bufferIndex == 0x80) + // data.buffer[0] = 0x00; + if ( copy_to_user((int __user *)arg, &data, sizeof(struct ioctl_cmd168)) ) { + retval = -EFAULT; + goto done; + } + break; + + default: + retval = -ENOTTY; + break; + } + + done: + //pr_info("DONE! retval=%d\n", retval); + return (retval); +} + +int ite7260_open(struct inode *inode, struct file *filp) { + int i; + struct ite7260_data *dev; + + pr_info("=ite7260_open=\n"); + dev = kmalloc(sizeof(struct ite7260_data), GFP_KERNEL); + if (dev == NULL) { + return -ENOMEM; + } + + /* initialize members */ + rwlock_init(&dev->lock); + for (i = 0; i < MAX_BUFFER_SIZE; i++) { + dev->buffer[i] = 0xFF; + } + + filp->private_data = dev; + + return 0; /* success */ +} + +int ite7260_close(struct inode *inode, struct file *filp) { + struct ite7260_data *dev = filp->private_data; + + if (dev) { + kfree(dev); + } + + return 0; /* success */ +} + +struct file_operations ite7260_fops = { .owner = THIS_MODULE, .open = + ite7260_open, .release = ite7260_close, .ioctl = ite7260_ioctl, }; + +static int __devinit IT7260_ts_init(void) { + dev_t dev = MKDEV(ite7260_major, 0); + int alloc_ret = 0; + int cdev_err = 0; + int input_err = 0; + struct device *class_dev = NULL; + + DBG(); + + // if(!IT7260_Init()) { + // TS_DEBUG("IT7260 cannot be connected or is in firmware upgrade mode.\n"); + // goto error; + // } + + alloc_ret = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME); + if (alloc_ret) { + TS_DEBUG("IT7260 cdev can't get major number\n"); + goto error; + } + ite7260_major = MAJOR(dev); + + // allocate the character device + cdev_init(&ite7260_cdev, &ite7260_fops); + ite7260_cdev.owner = THIS_MODULE; + ite7260_cdev.ops = &ite7260_fops; + cdev_err = cdev_add(&ite7260_cdev, MKDEV(ite7260_major, ite7260_minor), 1); + if(cdev_err) { + goto error; + } + + // register class + ite7260_class = class_create(THIS_MODULE, DEVICE_NAME); + if(IS_ERR(ite7260_class)) { + TS_DEBUG("Err: failed in creating class.\n"); + goto error; + } + + ite7260_dev = MKDEV(ite7260_major, ite7260_minor); + class_dev = device_create(ite7260_class, NULL, ite7260_dev, NULL, DEVICE_NAME); + if(class_dev == NULL) + { + TS_DEBUG("Err: failed in creating device.\n"); + goto error; + } + TS_DEBUG("=========================================\n"); + TS_DEBUG("register IT7260 cdev, major: %d, minor: %d \n", ite7260_major, ite7260_minor); + TS_DEBUG("=========================================\n"); + + input_dev = input_allocate_device(); + if (input_dev == NULL) { + input_err = -ENOMEM; + printk(KERN_ERR "IT7260_ts_probe: Failed to allocate input device\n"); + goto error; + } + input_dev->name = "IT7260"; + input_dev->phys = "I2C"; + input_dev->id.bustype = BUS_I2C; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x7260; + //set_bit(EV_SYN, input_dev->evbit); + //set_bit(EV_KEY, input_dev->evbit); + set_bit(EV_ABS, input_dev->evbit); + //set_bit(BTN_TOUCH, input_dev->keybit); + //set_bit(BTN_2, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, 1024, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, 600, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 2, 0, 0); + input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 2, 0, 0); + input_set_abs_params(input_dev, ABS_X, 0, 1024, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 600, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 1, 0, 0); + input_err = input_register_device(input_dev); + if (input_err) goto error; + pr_info("it7260 driver is on###############################################################\n"); + + return i2c_add_driver(&IT7260_ts_driver); + + error: + if(cdev_err == 0) { + cdev_del(&ite7260_cdev); + } + if(alloc_ret == 0) { + unregister_chrdev_region(dev, 1); + } + if(input_dev) { + input_free_device(input_dev); + } + if (IT7260_wq) + destroy_workqueue(IT7260_wq); + + return -1; +} + +static void __exit IT7260_ts_exit(void) { + dev_t dev = MKDEV(ite7260_major, ite7260_minor); + + // unregister class + device_destroy(ite7260_class, ite7260_dev); + class_destroy(ite7260_class); + + // unregister driver handle + cdev_del(&ite7260_cdev); + unregister_chrdev_region(dev, 1); + + i2c_del_driver(&IT7260_ts_driver); + if (IT7260_wq) + destroy_workqueue(IT7260_wq); +} + +module_init( IT7260_ts_init); +module_exit( IT7260_ts_exit); + +MODULE_DESCRIPTION("IT7260 Touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig old mode 100644 new mode 100755 index 845c63510856..0c2c040f7094 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -723,6 +723,16 @@ config TOUCHSCREEN_IT7260 code includes that in its table of I2C devices. If unsure, say N (but it's safe to say "Y"). + +config TOUCHSCREEN_IT7260_I2C + tristate "IT7260 based touchscreens: IT7260 I2C Interface" + depends on I2C_RK29 + help + Say Y here if you have a touchscreen interface using the + IT7260 controller, and your board-specific initialization + code includes that in its table of I2C devices. + + If unsure, say N (but it's safe to say "Y"). config TOUCHSCREEN_NAS tristate "NAS based touchscreens: NAS Interface" diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile old mode 100644 new mode 100755 index e2a26d7000a8..be8398c5d5d4 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -50,6 +50,7 @@ obj-$(CONFIG_TOUCHSCREEN_IT7250) += ctp_it7250.o obj-$(CONFIG_RK28_I2C_TS_NTP070) += ntp070.o obj-$(CONFIG_HANNSTAR_P1003) += hannstar_p1003.o obj-$(CONFIG_TOUCHSCREEN_IT7260) += it7260_ts.o +obj-$(CONFIG_TOUCHSCREEN_IT7260_I2C) += IT7260_ts_i2c.o obj-$(CONFIG_SINTEK_3FA16) += sintek_3FA16.o obj-$(CONFIG_EETI_EGALAX) += eeti_egalax_i2c.o obj-$(CONFIG_ATMEL_MXT224) += atmel_maxtouch.o From e4ba846f04d543258f7509ca057c1f495eb1ac70 Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 30 Aug 2011 03:08:24 -0700 Subject: [PATCH 044/150] add gsensor kxtf9 driver to rk29 kernel --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 25 + arch/arm/mach-rk29/board-rk29sdk.c | 25 + drivers/input/gsensor/Kconfig | 10 + drivers/input/gsensor/Makefile | 1 + drivers/input/gsensor/kxtf9.c | 1456 +++++++++++++++++++++++ include/linux/kxtf9.h | 137 +++ 6 files changed, 1654 insertions(+) mode change 100644 => 100755 drivers/input/gsensor/Kconfig mode change 100644 => 100755 drivers/input/gsensor/Makefile create mode 100755 drivers/input/gsensor/kxtf9.c create mode 100755 include/linux/kxtf9.h diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index c99ddae92339..e0bed71904e0 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -491,6 +491,31 @@ static struct eeti_egalax_platform_data eeti_egalax_info = { .disp_on_value = TOUCH_SCREEN_DISPLAY_VALUE, }; #endif + +#ifdef CONFIG_GS_KXTF9 +#include +#define KXTF9_DEVICE_MAP 1 +#define KXTF9_MAP_X (KXTF9_DEVICE_MAP-1)%2 +#define KXTF9_MAP_Y KXTF9_DEVICE_MAP%2 +#define KXTF9_NEG_X (KXTF9_DEVICE_MAP/2)%2 +#define KXTF9_NEG_Y (KXTF9_DEVICE_MAP+1)/4 +#define KXTF9_NEG_Z (KXTF9_DEVICE_MAP-1)/4 +struct kxtf9_platform_data kxtf9_pdata = { + .min_interval = 1, + .poll_interval = 20, + .g_range = KXTF9_G_2G, + .axis_map_x = KXTF9_MAP_X, + .axis_map_y = KXTF9_MAP_Y, + .axis_map_z = 2, + .negate_x = KXTF9_NEG_X, + .negate_y = KXTF9_NEG_Y, + .negate_z = KXTF9_NEG_Z, + //.ctrl_regc_init = KXTF9_G_2G | ODR50F, + //.ctrl_regb_init = ENABLE, +}; +#endif /* CONFIG_GS_KXTF9 */ + + /*MMA8452 gsensor*/ #if defined (CONFIG_GS_MMA8452) #define MMA8452_INT_PIN RK29_PIN0_PA3 diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index ba5b660625c3..b614f34f625f 100755 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -478,6 +478,31 @@ static struct eeti_egalax_platform_data eeti_egalax_info = { .disp_on_value = TOUCH_SCREEN_DISPLAY_VALUE, }; #endif + +#ifdef CONFIG_GS_KXTF9 +#include +#define KXTF9_DEVICE_MAP 1 +#define KXTF9_MAP_X (KXTF9_DEVICE_MAP-1)%2 +#define KXTF9_MAP_Y KXTF9_DEVICE_MAP%2 +#define KXTF9_NEG_X (KXTF9_DEVICE_MAP/2)%2 +#define KXTF9_NEG_Y (KXTF9_DEVICE_MAP+1)/4 +#define KXTF9_NEG_Z (KXTF9_DEVICE_MAP-1)/4 +struct kxtf9_platform_data kxtf9_pdata = { + .min_interval = 1, + .poll_interval = 20, + .g_range = KXTF9_G_2G, + .axis_map_x = KXTF9_MAP_X, + .axis_map_y = KXTF9_MAP_Y, + .axis_map_z = 2, + .negate_x = KXTF9_NEG_X, + .negate_y = KXTF9_NEG_Y, + .negate_z = KXTF9_NEG_Z, + //.ctrl_regc_init = KXTF9_G_2G | ODR50F, + //.ctrl_regb_init = ENABLE, +}; +#endif /* CONFIG_GS_KXTF9 */ + + /*MMA8452 gsensor*/ #if defined (CONFIG_GS_MMA8452) #define MMA8452_INT_PIN RK29_PIN0_PA3 diff --git a/drivers/input/gsensor/Kconfig b/drivers/input/gsensor/Kconfig old mode 100644 new mode 100755 index 687fcec87527..c917cf3a7485 --- a/drivers/input/gsensor/Kconfig +++ b/drivers/input/gsensor/Kconfig @@ -27,6 +27,16 @@ config GS_MMA8452 To have support for your specific gsesnor you will have to select the proper drivers which depend on this option. +config GS_KXTF9 + bool "gs_kxtf9" + depends on G_SENSOR_DEVICE && SYSFS && I2C_RK29 + default n + help + If you say yes here you get support for the Kionix KXTF9 digital tri-axis + accelerometer. + This driver can also be built as a module. If so, the module will be + called kxtf9. + config GS_L3G4200D bool "gs_l3g4200d" depends on G_SENSOR_DEVICE diff --git a/drivers/input/gsensor/Makefile b/drivers/input/gsensor/Makefile old mode 100644 new mode 100755 index 77565613a1bb..b312821ac104 --- a/drivers/input/gsensor/Makefile +++ b/drivers/input/gsensor/Makefile @@ -3,3 +3,4 @@ obj-$(CONFIG_GS_MMA7660) += mma7660.o obj-$(CONFIG_GS_MMA8452) += mma8452.o obj-$(CONFIG_GS_L3G4200D) += l3g4200d.o +obj-$(CONFIG_GS_KXTF9) += kxtf9.o diff --git a/drivers/input/gsensor/kxtf9.c b/drivers/input/gsensor/kxtf9.c new file mode 100755 index 000000000000..76c2a85a1129 --- /dev/null +++ b/drivers/input/gsensor/kxtf9.c @@ -0,0 +1,1456 @@ +/* drivers/i2c/chips/kxtf9.c - KXTF9 accelerometer driver + * + * Copyright (C) 2010 Kionix, Inc. + * Written by Kuching Tan + * + * 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 3 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, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NAME "kxtf9" + +#define G_MAX 8000 +/* OUTPUT REGISTERS */ +#define XOUT_HPF_L 0x00 +#define XOUT_L 0x06 +#define DCST_RESP 0x0C +#define WHO_AM_I 0x0F +#define TILT_POS_CUR 0x10 +#define TILT_POS_PRE 0x11 +#define INT_SRC_REG1 0x15 +#define INT_SRC_REG2 0x16 +#define STATUS_REG 0x18 +#define INT_REL 0x1A +/* CONTROL REGISTERS */ +#define CTRL_REG1 0x1B +#define CTRL_REG2 0x1C +#define CTRL_REG3 0x1D +#define INT_CTRL_REG1 0x1E +#define INT_CTRL_REG2 0x1F +#define INT_CTRL_REG3 0x20 +#define DATA_CTRL_REG 0x21 +#define TILT_TIMER 0x28 +#define WUF_TIMER 0x29 +#define TDT_TIMER 0x2B +#define TDT_H_THRESH 0x2C +#define TDT_L_THRESH 0x2D +#define TDT_TAP_TIMER 0x2E +#define TDT_TOTAL_TIMER 0x2F +#define TDT_LAT_TIMER 0x30 +#define TDT_WIN_TIMER 0x31 +#define WUF_THRESH 0x5A +#define TILT_ANGLE 0x5C +#define HYST_SET 0x5F +/* CTRL_REG1 BITS */ +#define PC1_OFF 0x00 +#define PC1_ON 0x80 +/* INT_SRC_REG2 BITS */ +#define TPS 0x01 +#define WUFS 0x02 +#define TDTS0 0x04 +#define TDTS1 0x08 +//#define DRDY 0x10 +/* Direction Mask */ +/* Used for TILT_POS_CUR, TILT_POS_PRE */ +/* INT_SRC_REG1, CTRL_REG2 */ +/* INT_CTRL_REG3*/ +#define DIR_LE 0x20 +#define DIR_RI 0x10 +#define DIR_DO 0x08 +#define DIR_UP 0x04 +#define DIR_FD 0x02 +#define DIR_FU 0x01 +/* ODR MASKS */ +#define OTPM 0x60 // CTRL_REG3 +#define OWUFM 0x03 // CTRL_REG3 +#define OTDTM 0x0C // CTRL_REG3 +#define HPFROM 0x30 // DATA_CTRL_REG +#define OSAM 0x07 // DATA_CTRL_REG +/* INPUT_ABS CONSTANTS */ +#define FUZZ 32 +#define FLAT 32 +/* RESUME STATE INDICES */ +#define RES_CTRL_REG1 0 +#define RES_CTRL_REG2 1 +#define RES_CTRL_REG3 2 +#define RES_INT_CTRL_REG1 3 +#define RES_INT_CTRL_REG2 4 +#define RES_INT_CTRL_REG3 5 +#define RES_DATA_CTRL_REG 6 +#define RES_TILT_TIMER 7 +#define RES_WUF_TIMER 8 +#define RES_TDT_TIMER 9 +#define RES_TDT_H_THRESH 10 +#define RES_TDT_L_THRESH 11 +#define RES_TDT_TAP_TIMER 12 +#define RES_TDT_TOTAL_TIMER 13 +#define RES_TDT_LAT_TIMER 14 +#define RES_TDT_WIN_TIMER 15 +#define RES_WUF_THRESH 16 +#define RES_TILT_ANGLE 17 +#define RES_HYST_SET 18 +#define RESUME_ENTRIES 19 +/* OFFSET and SENSITIVITY */ +#define OFFSET 0 +#define SENS 1024 + +#define IOCTL_BUFFER_SIZE 64 + +/* + * The following table lists the maximum appropriate poll interval for each + * available output data rate. + */ +struct { + unsigned int cutoff; + u8 mask; +} kxtf9_odr_table[] = { + { + 3, ODR800F}, { + 5, ODR400F}, { + 10, ODR200F}, { + 20, ODR100F}, { + 40, ODR50F}, { + 0, ODR25F}, +}; + +struct kxtf9_data { + struct i2c_client *client; + struct kxtf9_platform_data *pdata; + struct mutex lock; + struct delayed_work input_work; + struct input_dev *input_dev; + struct work_struct irq_work; + + int acc_sens[3]; + int hw_initialized; + atomic_t enabled; + u8 resume[RESUME_ENTRIES]; + int res_interval; + int irq; +}; + +static struct kxtf9_data *tf9 = NULL; +static atomic_t kxtf9_dev_open_count; + +// Debug Flag, set to 1 to turn on debugging output +#define DEBUG 0 + +static int kxtf9_i2c_read(u8 addr, u8 *data, int len) +{ + int err; + + struct i2c_msg msgs[] = { + { + .addr = tf9->client->addr, + .flags = tf9->client->flags & I2C_M_TEN, + .len = 1, + .buf = &addr, + }, + { + .addr = tf9->client->addr, + .flags = (tf9->client->flags & I2C_M_TEN) | I2C_M_RD, + .len = len, + .buf = data, + }, + }; + err = i2c_transfer(tf9->client->adapter, msgs, 2); + + if(err != 2) + dev_err(&tf9->client->dev, "read transfer error\n"); + else + err = 0; + + return err; +} + +static int kxtf9_i2c_write(u8 addr, u8 *data, int len) +{ + int err; + int i; + u8 buf[len + 1]; + + struct i2c_msg msgs[] = { + { + .addr = tf9->client->addr, + .flags = tf9->client->flags & I2C_M_TEN, + .len = len + 1, + .buf = buf, + }, + }; + + buf[0] = addr; + for (i = 0; i < len; i++) + buf[i + 1] = data[i]; + + err = i2c_transfer(tf9->client->adapter, msgs, 1); + + if(err != 1) + dev_err(&tf9->client->dev, "write transfer error\n"); + else + err = 0; + + return err; +} + +int kxtf9_get_bits(u8 reg_addr, u8* bits_value, u8 bits_mask) +{ + int err; + u8 reg_data; + + err = kxtf9_i2c_read(reg_addr, ®_data, 1); + if(err < 0) + return err; + + *bits_value = reg_data & bits_mask; + + return 1; +} + +int kxtf9_get_byte(u8 reg_addr, u8* reg_value) +{ + int err; + u8 reg_data; + + err = kxtf9_i2c_read(reg_addr, ®_data, 1); + if(err < 0) + return err; + + *reg_value = reg_data; + + return 1; +} + +int kxtf9_set_bits(int res_index, u8 reg_addr, u8 bits_value, u8 bits_mask) +{ + int err=0, err1=0, retval=0; + u8 reg_data = 0x00, reg_bits = 0x00, bits_set = 0x00; + + // Turn off PC1 + reg_data = tf9->resume[RES_CTRL_REG1] & ~PC1_ON; + + err = kxtf9_i2c_write(CTRL_REG1, ®_data, 1); + if(err < 0) + goto exit0; + + // Read from device register + err = kxtf9_i2c_read(reg_addr, ®_data, 1); + if(err < 0) + goto exit0; + + // Apply mask to device register; + reg_bits = reg_data & bits_mask; + + // Update resume state data + bits_set = bits_mask & bits_value; + tf9->resume[res_index] &= ~bits_mask; + tf9->resume[res_index] |= bits_set; + + // Return 0 if value in device register and value to be written is the same + if(reg_bits == bits_set) + retval = 0; + // Else, return 1 + else + retval = 1; + + // Write to device register + err = kxtf9_i2c_write(reg_addr, &tf9->resume[res_index], 1); + if(err < 0) + goto exit0; + +exit0: + // Turn on PC1 + reg_data = tf9->resume[RES_CTRL_REG1] | PC1_ON; + + err1 = kxtf9_i2c_write(CTRL_REG1, ®_data, 1); + if(err1 < 0) + return err1; + + if(err < 0) + return err; + + return retval; +} + +int kxtf9_set_byte(int res_index, u8 reg_addr, u8 reg_value) +{ + int err, err1, retval=0; + u8 reg_data; + + // Turn off PC1 + reg_data = tf9->resume[RES_CTRL_REG1] & ~PC1_ON; + + err = kxtf9_i2c_write(CTRL_REG1, ®_data, 1); + if(err < 0) + goto exit0; + + // Read from device register + err = kxtf9_i2c_read(reg_addr, ®_data, 1); + if(err < 0) + goto exit0; + + // Update resume state data + tf9->resume[res_index] = reg_value; + + // Return 0 if value in device register and value to be written is the same + if(reg_data == reg_value) + retval = 0; + // Else, return 1 + else + retval = 1; + + // Write to device register + err = kxtf9_i2c_write(reg_addr, &tf9->resume[res_index], 1); + if(err < 0) + goto exit0; + +exit0: + // Turn on PC1 + reg_data = tf9->resume[RES_CTRL_REG1] | PC1_ON; + + err1 = kxtf9_i2c_write(CTRL_REG1, ®_data, 1); + if(err1 < 0) + return err1; + + if(err < 0) + return err; + + return retval; +} + +static int kxtf9_verify(void) +{ + int err; + u8 buf; + + err = kxtf9_i2c_read(WHO_AM_I, &buf, 1); + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: WHO_AM_I(Chip ID) = 0x%02x\n", __FUNCTION__, buf); + #endif + if(err < 0) + dev_err(&tf9->client->dev, "read err int source\n"); + if(buf != 1) + err = -1; + return err; +} + +static int kxtf9_hw_init(void) +{ + int err = -1; + u8 buf[7]; + + buf[0] = PC1_OFF; + err = kxtf9_i2c_write(CTRL_REG1, buf, 1); + if(err < 0) + return err; + err = kxtf9_i2c_write(DATA_CTRL_REG, &tf9->resume[RES_DATA_CTRL_REG], 1); + if(err < 0) + return err; + err = kxtf9_i2c_write(CTRL_REG3, &tf9->resume[RES_CTRL_REG3], 1); + if(err < 0) + return err; + err = kxtf9_i2c_write(TILT_TIMER, &tf9->resume[RES_TILT_TIMER], 1); + if(err < 0) + return err; + err = kxtf9_i2c_write(WUF_TIMER, &tf9->resume[RES_WUF_TIMER], 1); + if(err < 0) + return err; + err = kxtf9_i2c_write(WUF_THRESH, &tf9->resume[RES_WUF_THRESH], 1); + if(err < 0) + return err; + buf[0] = tf9->resume[RES_TDT_TIMER]; + buf[1] = tf9->resume[RES_TDT_H_THRESH]; + buf[2] = tf9->resume[RES_TDT_L_THRESH]; + buf[3] = tf9->resume[RES_TDT_TAP_TIMER]; + buf[4] = tf9->resume[RES_TDT_TOTAL_TIMER]; + buf[5] = tf9->resume[RES_TDT_LAT_TIMER]; + buf[6] = tf9->resume[RES_TDT_WIN_TIMER]; + err = kxtf9_i2c_write(TDT_TIMER, buf, 7); + if(err < 0) + return err; + err = kxtf9_i2c_write(INT_CTRL_REG1, &tf9->resume[RES_INT_CTRL_REG1], 1); + if(err < 0) + return err; + buf[0] = (tf9->resume[RES_CTRL_REG1] | PC1_ON); + err = kxtf9_i2c_write(CTRL_REG1, buf, 1); + if(err < 0) + return err; + tf9->resume[RES_CTRL_REG1] = buf[0]; + tf9->hw_initialized = 1; + + return 0; +} + +static void kxtf9_device_power_off(void) +{ + int err; + u8 buf = PC1_OFF; + + err = kxtf9_i2c_write(CTRL_REG1, &buf, 1); + if(err < 0) + dev_err(&tf9->client->dev, "soft power off failed\n"); + disable_irq(tf9->irq); + if(tf9->pdata->power_off) + tf9->pdata->power_off(); + tf9->hw_initialized = 0; +} + +static int kxtf9_device_power_on(void) +{ + int err; + + if(tf9->pdata->power_on) { + err = tf9->pdata->power_on(); + if(err < 0) + return err; + } + enable_irq(tf9->irq); + if(!tf9->hw_initialized) { + mdelay(100); + err = kxtf9_hw_init(); + if(err < 0) { + kxtf9_device_power_off(); + return err; + } + } + return 0; +} + +static irqreturn_t kxtf9_isr(int irq, void *dev) +{ + disable_irq_nosync(irq); + schedule_work(&tf9->irq_work); + + return IRQ_HANDLED; +} + +static u8 kxtf9_resolve_dir(u8 dir) +{ + switch (dir) { + case 0x20: /* -X */ + if(tf9->pdata->negate_x) + dir = 0x10; + if(tf9->pdata->axis_map_y == 0) + dir >>= 2; + if(tf9->pdata->axis_map_z == 0) + dir >>= 4; + break; + case 0x10: /* +X */ + if(tf9->pdata->negate_x) + dir = 0x20; + if(tf9->pdata->axis_map_y == 0) + dir >>= 2; + if(tf9->pdata->axis_map_z == 0) + dir >>= 4; + break; + case 0x08: /* -Y */ + if(tf9->pdata->negate_y) + dir = 0x04; + if(tf9->pdata->axis_map_x == 1) + dir <<= 2; + if(tf9->pdata->axis_map_z == 1) + dir >>= 2; + break; + case 0x04: /* +Y */ + if(tf9->pdata->negate_y) + dir = 0x08; + if(tf9->pdata->axis_map_x == 1) + dir <<= 2; + if(tf9->pdata->axis_map_z == 1) + dir >>= 2; + break; + case 0x02: /* -Z */ + if(tf9->pdata->negate_z) + dir = 0x01; + if(tf9->pdata->axis_map_x == 2) + dir <<= 4; + if(tf9->pdata->axis_map_y == 2) + dir <<= 2; + break; + case 0x01: /* +Z */ + if(tf9->pdata->negate_z) + dir = 0x02; + if(tf9->pdata->axis_map_x == 2) + dir <<= 4; + if(tf9->pdata->axis_map_y == 2) + dir <<= 2; + break; + default: + return -EINVAL; + } + + return dir; +} + +static void kxtf9_irq_work_func(struct work_struct *work) +{ +/* + * int_status output: + * [INT_SRC_REG2][INT_SRC_REG1][TILT_POS_PRE][TILT_POS_CUR] + * INT_SRC_REG1, TILT_POS_PRE, and TILT_POS_CUR directions are translated + * based on platform data variables. + */ + + int err; + int int_status = 0; + u8 status; + u8 buf[2]; + + err = kxtf9_i2c_read(INT_SRC_REG2, &status, 1); + if(err < 0) + dev_err(&tf9->client->dev, "read err int source\n"); + int_status = status << 24; + if((status & TPS) > 0) { + err = kxtf9_i2c_read(TILT_POS_CUR, buf, 2); + if(err < 0) + dev_err(&tf9->client->dev, "read err tilt dir\n"); + int_status |= kxtf9_resolve_dir(buf[0]); + int_status |= kxtf9_resolve_dir(buf[1]) << 8; + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: IRQ TILT [%x]\n", __FUNCTION__, + kxtf9_resolve_dir(buf[0])); + #endif + } + if(((status & TDTS0) | (status & TDTS1)) > 0) { + err = kxtf9_i2c_read(INT_SRC_REG1, buf, 1); + if(err < 0) + dev_err(&tf9->client->dev, "read err tap dir\n"); + int_status |= (kxtf9_resolve_dir(buf[0])) << 16; + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: IRQ TAP%d [%x]\n", __FUNCTION__, + ((status & TDTS1) ? (2) : (1)), kxtf9_resolve_dir(buf[0])); + #endif + } + #if defined DEBUG && DEBUG == 1 + if((status & 0x02) > 0) { + if(((status & TDTS0) | (status & TDTS1)) > 0) + dev_info(&tf9->client->dev, "%s: IRQ WUF + TAP\n", __FUNCTION__); + else + dev_info(&tf9->client->dev, "%s: IRQ WUF\n", __FUNCTION__); + } + #endif + if(int_status & 0x2FFF) { + input_report_abs(tf9->input_dev, ABS_MISC, int_status); + input_sync(tf9->input_dev); + } + err = kxtf9_i2c_read(INT_REL, buf, 1); + if(err < 0) + dev_err(&tf9->client->dev, + "error clearing interrupt status: %d\n", err); + + enable_irq(tf9->irq); +} + +int kxtf9_update_g_range(u8 new_g_range) +{ + int err; + u8 shift; + u8 buf; + + switch (new_g_range) { + case KXTF9_G_2G: + shift = SHIFT_ADJ_2G; + break; + case KXTF9_G_4G: + shift = SHIFT_ADJ_4G; + break; + case KXTF9_G_8G: + shift = SHIFT_ADJ_8G; + break; + default: + dev_err(&tf9->client->dev, "invalid g range request\n"); + return -EINVAL; + } + if(shift != tf9->pdata->shift_adj) { + if(tf9->pdata->shift_adj > shift) + tf9->resume[RES_WUF_THRESH] >>= + (tf9->pdata->shift_adj - shift); + if(tf9->pdata->shift_adj < shift) + tf9->resume[RES_WUF_THRESH] <<= + (shift - tf9->pdata->shift_adj); + + if(atomic_read(&tf9->enabled)) { + buf = PC1_OFF; + err = kxtf9_i2c_write(CTRL_REG1, &buf, 1); + if(err < 0) + return err; + buf = tf9->resume[RES_WUF_THRESH]; + err = kxtf9_i2c_write(WUF_THRESH, &buf, 1); + if(err < 0) + return err; + buf = (tf9->resume[RES_CTRL_REG1] & 0xE7) | new_g_range; + err = kxtf9_i2c_write(CTRL_REG1, &buf, 1); + if(err < 0) + return err; + tf9->resume[RES_CTRL_REG1] = buf; + } + tf9->pdata->shift_adj = shift; + } + + return 0; +} + +static int kxtf9_update_odr(int poll_interval) +{ + int err = -1; + int i; + u8 config; + + /* Convert the poll interval into an output data rate configuration + * that is as low as possible. The ordering of these checks must be + * maintained due to the cascading cut off values - poll intervals are + * checked from shortest to longest. At each check, if the next slower + * ODR cannot support the current poll interval, we stop searching */ + for (i = 0; i < ARRAY_SIZE(kxtf9_odr_table); i++) { + config = kxtf9_odr_table[i].mask; + if(poll_interval < kxtf9_odr_table[i].cutoff) + break; + } + + tf9->resume[RES_DATA_CTRL_REG] = config; + if(atomic_read(&tf9->enabled)) { + err = kxtf9_set_byte(RES_DATA_CTRL_REG, DATA_CTRL_REG, config); + if(err < 0) + return err; + } + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: poll_interval is %dms, ODR set to 0x%02X\n", __FUNCTION__, poll_interval, config); + #endif + + return 0; +} + +static int kxtf9_get_acceleration_data(int *xyz) +{ + int err; + /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + u8 acc_data[6], res12bit; + /* x,y,z hardware values */ + int hw_d[3]; + + err = kxtf9_i2c_read(XOUT_L, acc_data, 6); + if(err < 0) + return err; + + err = kxtf9_get_bits(CTRL_REG1, &res12bit, RES_12BIT); + if(err < 0) + return err; + + acc_data[0] = (res12bit & RES_12BIT) ? (acc_data[0]) : (0x00); + acc_data[2] = (res12bit & RES_12BIT) ? (acc_data[2]) : (0x00); + acc_data[4] = (res12bit & RES_12BIT) ? (acc_data[4]) : (0x00); + + hw_d[0] = (int) (((acc_data[1]) << 8) | acc_data[0]); + hw_d[1] = (int) (((acc_data[3]) << 8) | acc_data[2]); + hw_d[2] = (int) (((acc_data[5]) << 8) | acc_data[4]); + + hw_d[0] = (hw_d[0] & 0x8000) ? (hw_d[0] | 0xFFFF0000) : (hw_d[0]); + hw_d[1] = (hw_d[1] & 0x8000) ? (hw_d[1] | 0xFFFF0000) : (hw_d[1]); + hw_d[2] = (hw_d[2] & 0x8000) ? (hw_d[2] | 0xFFFF0000) : (hw_d[2]); + + hw_d[0] >>= tf9->pdata->shift_adj; + hw_d[1] >>= tf9->pdata->shift_adj; + hw_d[2] >>= tf9->pdata->shift_adj; + + xyz[0] = ((tf9->pdata->negate_x) ? (-hw_d[tf9->pdata->axis_map_x]) + : (hw_d[tf9->pdata->axis_map_x])); + xyz[1] = ((tf9->pdata->negate_y) ? (-hw_d[tf9->pdata->axis_map_y]) + : (hw_d[tf9->pdata->axis_map_y])); + xyz[2] = ((tf9->pdata->negate_z) ? (-hw_d[tf9->pdata->axis_map_z]) + : (hw_d[tf9->pdata->axis_map_z])); + + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: x:%5d y:%5d z:%5d\n", __FUNCTION__, xyz[0], xyz[1], xyz[2]); + #endif + + return err; +} + +static void kxtf9_report_values(int *xyz) +{ + input_report_abs(tf9->input_dev, ABS_X, xyz[0]); + input_report_abs(tf9->input_dev, ABS_Y, xyz[1]); + input_report_abs(tf9->input_dev, ABS_Z, xyz[2]); + input_sync(tf9->input_dev); +} + +static int kxtf9_enable(void) +{ + int err; + int int_status = 0; + u8 buf; + + if(!atomic_cmpxchg(&tf9->enabled, 0, 1)) { + err = kxtf9_device_power_on(); + err = kxtf9_i2c_read(INT_REL, &buf, 1); + if(err < 0) { + dev_err(&tf9->client->dev, + "error clearing interrupt: %d\n", err); + atomic_set(&tf9->enabled, 0); + return err; + } + if((tf9->resume[RES_CTRL_REG1] & TPE) > 0) { + err = kxtf9_i2c_read(TILT_POS_CUR, &buf, 1); + if(err < 0) + dev_err(&tf9->client->dev, + "read err current tilt\n"); + int_status |= kxtf9_resolve_dir(buf); + input_report_abs(tf9->input_dev, ABS_MISC, int_status); + input_sync(tf9->input_dev); + } + schedule_delayed_work(&tf9->input_work, + msecs_to_jiffies(tf9->res_interval)); + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: Enabled\n", __FUNCTION__); + #endif + } + return 0; +} + +static int kxtf9_disable(void) +{ + if(atomic_cmpxchg(&tf9->enabled, 1, 0)) { + cancel_delayed_work_sync(&tf9->input_work); + kxtf9_device_power_off(); + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: Disabled\n", __FUNCTION__); + #endif + } + return 0; +} + +static void kxtf9_input_work_func(struct work_struct *work) +{ + int xyz[3] = { 0 }; + int err; + + mutex_lock(&tf9->lock); + err = kxtf9_get_acceleration_data(xyz); + if(err < 0) + dev_err(&tf9->client->dev, "get_acceleration_data failed\n"); + else + kxtf9_report_values(xyz); + schedule_delayed_work(&tf9->input_work, + msecs_to_jiffies(tf9->res_interval)); + mutex_unlock(&tf9->lock); +} + +int kxtf9_input_open(struct input_dev *input) +{ + return kxtf9_enable(); +} + +void kxtf9_input_close(struct input_dev *dev) +{ + kxtf9_disable(); +} + +static int kxtf9_input_init(void) +{ + int err; + + INIT_DELAYED_WORK(&tf9->input_work, kxtf9_input_work_func); + tf9->input_dev = input_allocate_device(); + if(!tf9->input_dev) { + err = -ENOMEM; + dev_err(&tf9->client->dev, "input device allocate failed\n"); + goto err0; + } + tf9->input_dev->open = kxtf9_input_open; + tf9->input_dev->close = kxtf9_input_close; + + input_set_drvdata(tf9->input_dev, tf9); + + set_bit(EV_ABS, tf9->input_dev->evbit); + set_bit(ABS_MISC, tf9->input_dev->absbit); + + input_set_abs_params(tf9->input_dev, ABS_X, -G_MAX, G_MAX, FUZZ, FLAT); + input_set_abs_params(tf9->input_dev, ABS_Y, -G_MAX, G_MAX, FUZZ, FLAT); + input_set_abs_params(tf9->input_dev, ABS_Z, -G_MAX, G_MAX, FUZZ, FLAT); + + tf9->input_dev->name = INPUT_NAME_ACC; + + err = input_register_device(tf9->input_dev); + if(err) { + dev_err(&tf9->client->dev, + "unable to register input polled device %s: %d\n", + tf9->input_dev->name, err); + goto err1; + } + + return 0; +err1: + input_free_device(tf9->input_dev); +err0: + return err; +} + +static void kxtf9_input_cleanup(void) +{ + input_unregister_device(tf9->input_dev); +} + +/* sysfs */ +static ssize_t kxtf9_delay_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%d\n", tf9->res_interval); +} + +static ssize_t kxtf9_delay_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int val = simple_strtoul(buf, NULL, 10); + + tf9->res_interval = max(val, tf9->pdata->min_interval); + kxtf9_update_odr(tf9->res_interval); + + return count; +} + +static ssize_t kxtf9_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%d\n", atomic_read(&tf9->enabled)); +} + +static ssize_t kxtf9_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int val = simple_strtoul(buf, NULL, 10); + if(val) + kxtf9_enable(); + else + kxtf9_disable(); + return count; +} + +static ssize_t kxtf9_tilt_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 tilt; + + if(tf9->resume[RES_CTRL_REG1] & TPE) { + kxtf9_i2c_read(TILT_POS_CUR, &tilt, 1); + return sprintf(buf, "%d\n", kxtf9_resolve_dir(tilt)); + } else { + return sprintf(buf, "%d\n", 0); + } +} + +static ssize_t kxtf9_tilt_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int val = simple_strtoul(buf, NULL, 10); + if(val) + tf9->resume[RES_CTRL_REG1] |= TPE; + else + tf9->resume[RES_CTRL_REG1] &= (~TPE); + kxtf9_i2c_write(CTRL_REG1, &tf9->resume[RES_CTRL_REG1], 1); + return count; +} + +static ssize_t kxtf9_wake_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 val = tf9->resume[RES_CTRL_REG1] & WUFE; + if(val) + return sprintf(buf, "%d\n", 1); + else + return sprintf(buf, "%d\n", 0); +} + +static ssize_t kxtf9_wake_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int val = simple_strtoul(buf, NULL, 10); + if(val) + tf9->resume[RES_CTRL_REG1] |= WUFE; + else + tf9->resume[RES_CTRL_REG1] &= (~WUFE); + kxtf9_i2c_write(CTRL_REG1, &tf9->resume[RES_CTRL_REG1], 1); + return count; +} + +static ssize_t kxtf9_tap_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 val = tf9->resume[RES_CTRL_REG1] & TDTE; + if(val) + return sprintf(buf, "%d\n", 1); + else + return sprintf(buf, "%d\n", 0); +} + +static ssize_t kxtf9_tap_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int val = simple_strtoul(buf, NULL, 10); + if(val) + tf9->resume[RES_CTRL_REG1] |= TDTE; + else + tf9->resume[RES_CTRL_REG1] &= (~TDTE); + kxtf9_i2c_write(CTRL_REG1, &tf9->resume[RES_CTRL_REG1], 1); + return count; +} + +static ssize_t kxtf9_selftest_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int val = simple_strtoul(buf, NULL, 10); + u8 ctrl = 0x00; + if(val) + ctrl = 0xCA; + kxtf9_i2c_write(0x3A, &ctrl, 1); + return count; +} + +static DEVICE_ATTR(delay, S_IRUGO|S_IWUSR, kxtf9_delay_show, kxtf9_delay_store); +static DEVICE_ATTR(enable, S_IRUGO|S_IWUSR, kxtf9_enable_show, + kxtf9_enable_store); +static DEVICE_ATTR(tilt, S_IRUGO|S_IWUSR, kxtf9_tilt_show, kxtf9_tilt_store); +static DEVICE_ATTR(wake, S_IRUGO|S_IWUSR, kxtf9_wake_show, kxtf9_wake_store); +static DEVICE_ATTR(tap, S_IRUGO|S_IWUSR, kxtf9_tap_show, kxtf9_tap_store); +static DEVICE_ATTR(selftest, S_IWUSR, NULL, kxtf9_selftest_store); + +static struct attribute *kxtf9_attributes[] = { + &dev_attr_delay.attr, + &dev_attr_enable.attr, + &dev_attr_tilt.attr, + &dev_attr_wake.attr, + &dev_attr_tap.attr, + &dev_attr_selftest.attr, + NULL +}; + +static struct attribute_group kxtf9_attribute_group = { + .attrs = kxtf9_attributes +}; +/* /sysfs */ + +static int kxtf9_get_count(char *buf, int bufsize) +{ + const char ACC_REG_SIZE = 6; + int err; + /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + u8 acc_data[ACC_REG_SIZE], res12bit; + /* x,y,z hardware values */ + int hw_d[3], xyz[3]; + + if((!buf)||(bufsize<=(sizeof(xyz)*3))) + return -1; + + err = kxtf9_i2c_read(XOUT_L, acc_data, ACC_REG_SIZE); + if(err < 0) + return err; + + err = kxtf9_get_bits(CTRL_REG1, &res12bit, RES_12BIT); + if(err < 0) + return err; + + acc_data[0] = (res12bit & RES_12BIT) ? (acc_data[0]) : (0x00); + acc_data[2] = (res12bit & RES_12BIT) ? (acc_data[2]) : (0x00); + acc_data[4] = (res12bit & RES_12BIT) ? (acc_data[4]) : (0x00); + + hw_d[0] = (int) (((acc_data[1]) << 8) | acc_data[0]); + hw_d[1] = (int) (((acc_data[3]) << 8) | acc_data[2]); + hw_d[2] = (int) (((acc_data[5]) << 8) | acc_data[4]); + + hw_d[0] = (hw_d[0] & 0x8000) ? (hw_d[0] | 0xFFFF0000) : (hw_d[0]); + hw_d[1] = (hw_d[1] & 0x8000) ? (hw_d[1] | 0xFFFF0000) : (hw_d[1]); + hw_d[2] = (hw_d[2] & 0x8000) ? (hw_d[2] | 0xFFFF0000) : (hw_d[2]); + + hw_d[0] >>= tf9->pdata->shift_adj; + hw_d[1] >>= tf9->pdata->shift_adj; + hw_d[2] >>= tf9->pdata->shift_adj; + + xyz[0] = ((tf9->pdata->negate_x) ? (-hw_d[tf9->pdata->axis_map_x]) + : (hw_d[tf9->pdata->axis_map_x])); + xyz[1] = ((tf9->pdata->negate_y) ? (-hw_d[tf9->pdata->axis_map_y]) + : (hw_d[tf9->pdata->axis_map_y])); + xyz[2] = ((tf9->pdata->negate_z) ? (-hw_d[tf9->pdata->axis_map_z]) + : (hw_d[tf9->pdata->axis_map_z])); + + sprintf(buf, "%d %d %d %d %d %d %d %d %d",\ + xyz[0], xyz[1], xyz[2],\ + 0, 0, 0,\ + ((int)SENS), ((int)SENS), ((int)SENS)); + + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: [%5d] [%5d] [%5d] [%5d] [%5d] [%5d] [%5d] [%5d] [%5d]\n", __FUNCTION__,\ + xyz[0], xyz[1], xyz[2],\ + 0, 0, 0,\ + ((int)SENS), ((int)SENS), ((int)SENS)); + #endif + + return err; +} + +static int kxtf9_get_mg(char *buf, int bufsize) +{ + const char ACC_REG_SIZE = 6; + int err; + /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + u8 acc_data[ACC_REG_SIZE], res12bit; + /* x,y,z hardware values */ + int hw_d[3], xyz[3], mg[3]; + + if((!buf)||(bufsize<=(sizeof(mg)))) + return -1; + + err = kxtf9_i2c_read(XOUT_L, acc_data, ACC_REG_SIZE); + if(err < 0) + return err; + + err = kxtf9_get_bits(CTRL_REG1, &res12bit, RES_12BIT); + if(err < 0) + return err; + + acc_data[0] = (res12bit & RES_12BIT) ? (acc_data[0]) : (0x00); + acc_data[2] = (res12bit & RES_12BIT) ? (acc_data[2]) : (0x00); + acc_data[4] = (res12bit & RES_12BIT) ? (acc_data[4]) : (0x00); + + hw_d[0] = (int) (((acc_data[1]) << 8) | acc_data[0]); + hw_d[1] = (int) (((acc_data[3]) << 8) | acc_data[2]); + hw_d[2] = (int) (((acc_data[5]) << 8) | acc_data[4]); + + hw_d[0] = (hw_d[0] & 0x8000) ? (hw_d[0] | 0xFFFF0000) : (hw_d[0]); + hw_d[1] = (hw_d[1] & 0x8000) ? (hw_d[1] | 0xFFFF0000) : (hw_d[1]); + hw_d[2] = (hw_d[2] & 0x8000) ? (hw_d[2] | 0xFFFF0000) : (hw_d[2]); + + hw_d[0] >>= tf9->pdata->shift_adj; + hw_d[1] >>= tf9->pdata->shift_adj; + hw_d[2] >>= tf9->pdata->shift_adj; + + xyz[0] = ((tf9->pdata->negate_x) ? (-hw_d[tf9->pdata->axis_map_x]) + : (hw_d[tf9->pdata->axis_map_x])); + xyz[1] = ((tf9->pdata->negate_y) ? (-hw_d[tf9->pdata->axis_map_y]) + : (hw_d[tf9->pdata->axis_map_y])); + xyz[2] = ((tf9->pdata->negate_z) ? (-hw_d[tf9->pdata->axis_map_z]) + : (hw_d[tf9->pdata->axis_map_z])); + + mg[0] = xyz[0] * 1000 / SENS; + mg[1] = xyz[1] * 1000 / SENS; + mg[2] = xyz[2] * 1000 / SENS; + + sprintf(buf, "%d %d %d",mg[0], mg[1], mg[2]); + + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: [%5d] [%5d] [%5d]\n", __FUNCTION__, mg[0], mg[1], mg[2]); + #endif + + return err; +} + +static int kxtf9_open(struct inode *inode, struct file *file) +{ + int ret = -1; + + if(kxtf9_enable() < 0) + return ret; + + atomic_inc(&kxtf9_dev_open_count); + + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: opened %d times\n",\ + __FUNCTION__, atomic_read(&kxtf9_dev_open_count)); + #endif + + return 0; +} + +static int kxtf9_release(struct inode *inode, struct file *file) +{ + int open_count; + + atomic_dec(&kxtf9_dev_open_count); + open_count = (int)atomic_read(&kxtf9_dev_open_count); + + if(open_count == 0) + kxtf9_disable(); + + #if defined DEBUG && DEBUG == 1 + dev_info(&tf9->client->dev, "%s: opened %d times\n",\ + __FUNCTION__, atomic_read(&kxtf9_dev_open_count)); + #endif + + return 0; +} + +static int kxtf9_ioctl(struct inode *inode, struct file *file, unsigned int cmd, + unsigned long arg) +{ + char buffer[IOCTL_BUFFER_SIZE]; + void __user *data; + u8 reg_buffer = 0x00; + const u8 set = 0xFF, unset = 0x00; + int retval=0, val_int=0; + short val_short=0; + + switch (cmd) { + case KXTF9_IOCTL_GET_COUNT: + data = (void __user *) arg; + if(data == NULL){ + retval = -EFAULT; + goto err_out; + } + retval = kxtf9_get_count(buffer, sizeof(buffer)); + if(retval < 0) + goto err_out; + + if(copy_to_user(data, buffer, sizeof(buffer))) { + retval = -EFAULT; + goto err_out; + } + break; + + case KXTF9_IOCTL_GET_MG: + data = (void __user *) arg; + if(data == NULL){ + retval = -EFAULT; + goto err_out; + } + retval = kxtf9_get_mg(buffer, sizeof(buffer)); + if(retval < 0) + goto err_out; + + if(copy_to_user(data, buffer, sizeof(buffer))) { + retval = -EFAULT; + goto err_out; + } + break; + + case KXTF9_IOCTL_ENABLE_OUTPUT: + retval = kxtf9_enable(); + if(retval < 0) + goto err_out; + break; + + case KXTF9_IOCTL_DISABLE_OUTPUT: + retval = kxtf9_disable(); + if(retval < 0) + goto err_out; + break; + + case KXTF9_IOCTL_GET_ENABLE: + data = (void __user *) arg; + if(data == NULL){ + retval = -EFAULT; + goto err_out; + } + retval = kxtf9_get_bits(CTRL_REG1, ®_buffer, PC1_ON); + if(retval < 0) + goto err_out; + + val_short = (short)reg_buffer; + + if(copy_to_user(data, &val_short, sizeof(val_short))) { + retval = -EFAULT; + goto err_out; + } + break; + + case KXTF9_IOCTL_RESET: + retval = kxtf9_set_bits(RES_CTRL_REG3, CTRL_REG3, set, SRST); + if(retval < 0) + goto err_out; + break; + + case KXTF9_IOCTL_UPDATE_ODR: + data = (void __user *) arg; + if(data == NULL){ + retval = -EFAULT; + goto err_out; + } + if(copy_from_user(&val_int, data, sizeof(val_int))) { + retval = -EFAULT; + goto err_out; + } + + mutex_lock(&tf9->lock); + tf9->res_interval = max(val_int, tf9->pdata->min_interval); + mutex_unlock(&tf9->lock); + + retval = kxtf9_update_odr(tf9->res_interval); + if(retval < 0) + goto err_out; + break; + + case KXTF9_IOCTL_ENABLE_DCST: + retval = kxtf9_set_bits(RES_CTRL_REG3, CTRL_REG3, set, DCST); + if(retval < 0) + goto err_out; + break; + + case KXTF9_IOCTL_DISABLE_DCST: + retval = kxtf9_set_bits(RES_CTRL_REG3, CTRL_REG3, unset, DCST); + if(retval < 0) + goto err_out; + break; + + case KXTF9_IOCTL_GET_DCST_RESP: + data = (void __user *) arg; + if(data == NULL){ + retval = -EFAULT; + goto err_out; + } + retval = kxtf9_get_byte(DCST_RESP, ®_buffer); + if(retval < 0) + goto err_out; + + buffer[0] = (char)reg_buffer; + if(copy_to_user(data, buffer, sizeof(buffer))) { + retval = -EFAULT; + goto err_out; + } + break; + + default: + retval = -ENOIOCTLCMD; + break; + } + +err_out: + return retval; +} + +static struct file_operations kxtf9_fops = { + .owner = THIS_MODULE, + .open = kxtf9_open, + .release = kxtf9_release, + .ioctl = kxtf9_ioctl, +}; + +static struct miscdevice kxtf9_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = NAME_DEV, + .fops = &kxtf9_fops, +}; + +static int __devinit kxtf9_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int err = -1; + tf9 = kzalloc(sizeof(*tf9), GFP_KERNEL); + if(tf9 == NULL) { + dev_err(&client->dev, + "failed to allocate memory for module data\n"); + err = -ENOMEM; + goto err0; + } + if(client->dev.platform_data == NULL) { + dev_err(&client->dev, "platform data is NULL. exiting.\n"); + err = -ENODEV; + goto err0; + } + if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "client not i2c capable\n"); + err = -ENODEV; + goto err0; + } + mutex_init(&tf9->lock); + mutex_lock(&tf9->lock); + tf9->client = client; + i2c_set_clientdata(client, tf9); + + INIT_WORK(&tf9->irq_work, kxtf9_irq_work_func); + tf9->pdata = kmalloc(sizeof(*tf9->pdata), GFP_KERNEL); + if(tf9->pdata == NULL) + goto err1; + + err = sysfs_create_group(&client->dev.kobj, &kxtf9_attribute_group); + if(err) + goto err1; + + memcpy(tf9->pdata, client->dev.platform_data, sizeof(*tf9->pdata)); + if(tf9->pdata->init) { + err = tf9->pdata->init(); + if(err < 0) + goto err2; + } + + tf9->irq = gpio_to_irq(tf9->pdata->gpio); + + memset(tf9->resume, 0, ARRAY_SIZE(tf9->resume)); + tf9->resume[RES_DATA_CTRL_REG] = tf9->pdata->data_odr_init; + tf9->resume[RES_CTRL_REG1] = tf9->pdata->ctrl_reg1_init; + tf9->resume[RES_INT_CTRL_REG1] = tf9->pdata->int_ctrl_init; + tf9->resume[RES_TILT_TIMER] = tf9->pdata->tilt_timer_init; + tf9->resume[RES_CTRL_REG3] = tf9->pdata->engine_odr_init; + tf9->resume[RES_WUF_TIMER] = tf9->pdata->wuf_timer_init; + tf9->resume[RES_WUF_THRESH] = tf9->pdata->wuf_thresh_init; + tf9->resume[RES_TDT_TIMER] = tf9->pdata->tdt_timer_init; + tf9->resume[RES_TDT_H_THRESH] = tf9->pdata->tdt_h_thresh_init; + tf9->resume[RES_TDT_L_THRESH] = tf9->pdata->tdt_l_thresh_init; + tf9->resume[RES_TDT_TAP_TIMER] = tf9->pdata->tdt_tap_timer_init; + tf9->resume[RES_TDT_TOTAL_TIMER] = tf9->pdata->tdt_total_timer_init; + tf9->resume[RES_TDT_LAT_TIMER] = tf9->pdata->tdt_latency_timer_init; + tf9->resume[RES_TDT_WIN_TIMER] = tf9->pdata->tdt_window_timer_init; + tf9->res_interval = tf9->pdata->poll_interval; + + err = kxtf9_device_power_on(); + if(err < 0) + goto err3; + atomic_set(&tf9->enabled, 1); + + err = kxtf9_verify(); + if(err < 0) { + dev_err(&client->dev, "unresolved i2c client\n"); + goto err4; + } + + err = kxtf9_update_g_range(tf9->pdata->g_range); + if(err < 0) { + dev_err(&client->dev, "update_g_range failed\n"); + goto err4; + } + + err = kxtf9_update_odr(tf9->res_interval); + if(err < 0) { + dev_err(&client->dev, "update_odr failed\n"); + goto err4; + } + + err = kxtf9_input_init(); + if(err < 0) + goto err4; + + err = misc_register(&kxtf9_device); + if(err) { + dev_err(&client->dev, "misc. device failed to register.\n"); + goto err5; + } + + dev_info(&client->dev, "%s: Registered %s\n", __FUNCTION__, DIR_DEV); + + kxtf9_device_power_off(); + atomic_set(&tf9->enabled, 0); + err = request_irq(tf9->irq, kxtf9_isr, + IRQF_TRIGGER_RISING | IRQF_DISABLED, "kxtf9-irq", tf9); + if(err < 0) { + pr_err("%s: request irq failed: %d\n", __func__, err); + goto err6; + } + disable_irq_nosync(tf9->irq); + + mutex_unlock(&tf9->lock); + + return 0; + +err6: + misc_deregister(&kxtf9_device); +err5: + kxtf9_input_cleanup(); +err4: + kxtf9_device_power_off(); +err3: + if(tf9->pdata->exit) + tf9->pdata->exit(); +err2: + kfree(tf9->pdata); + sysfs_remove_group(&client->dev.kobj, &kxtf9_attribute_group); +err1: + mutex_unlock(&tf9->lock); + kfree(tf9); +err0: + return err; +} + +static int __devexit kxtf9_remove(struct i2c_client *client) +{ + free_irq(tf9->irq, tf9); + gpio_free(tf9->pdata->gpio); + kxtf9_input_cleanup(); + misc_deregister(&kxtf9_device); + kxtf9_device_power_off(); + if(tf9->pdata->exit) + tf9->pdata->exit(); + kfree(tf9->pdata); + sysfs_remove_group(&client->dev.kobj, &kxtf9_attribute_group); + kfree(tf9); + + return 0; +} + +#ifdef CONFIG_PM +static int kxtf9_resume(struct i2c_client *client) +{ + return kxtf9_enable(); +} + +static int kxtf9_suspend(struct i2c_client *client, pm_message_t mesg) +{ + return kxtf9_disable(); +} +#endif + +static const struct i2c_device_id kxtf9_id[] = { + {NAME, 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, kxtf9_id); + +static struct i2c_driver kxtf9_driver = { + .driver = { + .name = NAME, + }, + .probe = kxtf9_probe, + .remove = __devexit_p(kxtf9_remove), + .resume = kxtf9_resume, + .suspend = kxtf9_suspend, + .id_table = kxtf9_id, +}; + +static int __init kxtf9_init(void) +{ + atomic_set(&kxtf9_dev_open_count, 0); + + return i2c_add_driver(&kxtf9_driver); +} + +static void __exit kxtf9_exit(void) +{ + atomic_set(&kxtf9_dev_open_count, 0); + + i2c_del_driver(&kxtf9_driver); +} + +module_init(kxtf9_init); +module_exit(kxtf9_exit); + +MODULE_DESCRIPTION("KXTF9 accelerometer driver"); +MODULE_AUTHOR("Kuching Tan "); +MODULE_LICENSE("GPL"); +MODULE_VERSION(VERSION_DEV); diff --git a/include/linux/kxtf9.h b/include/linux/kxtf9.h new file mode 100755 index 000000000000..709bb829d6c9 --- /dev/null +++ b/include/linux/kxtf9.h @@ -0,0 +1,137 @@ +/* include/linux/kxtf9.h - KXTF9 accelerometer driver + * + * Copyright (C) 2010 Kionix, Inc. + * Written by Kuching Tan + * + * 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 3 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, see . + * + */ + +#ifndef __KXTF9_H__ +#define __KXTF9_H__ + +#define KXTF9_I2C_ADDR 0x0F +/* CTRL_REG1 BITS */ +#define RES_12BIT 0x40 +#define KXTF9_G_2G 0x00 +#define KXTF9_G_4G 0x08 +#define KXTF9_G_8G 0x10 +#define SHIFT_ADJ_2G 4 +#define SHIFT_ADJ_4G 3 +#define SHIFT_ADJ_8G 2 +#define TPE 0x01 /* tilt position function enable bit */ +#define WUFE 0x02 /* wake-up function enable bit */ +#define TDTE 0x04 /* tap/double-tap function enable bit */ +/* CTRL_REG3 BITS */ +#define SRST 0x80 /* software reset */ +#define DCST 0x10 /* communication-test function */ +#define OTP1_6 0x00 /* tilt ODR masks */ +#define OTP6_3 0x20 +#define OTP12_5 0x40 +#define OTP50 0x60 +#define OWUF25 0x00 /* wuf ODR masks */ +#define OWUF50 0x01 +#define OWUF100 0x02 +#define OWUF200 0x03 +#define OTDT50 0x00 /* tdt ODR masks */ +#define OTDT100 0x04 +#define OTDT200 0x08 +#define OTDT400 0x0C +/* INT_CTRL_REG1 BITS */ +#define KXTF9_IEN 0x20 /* interrupt enable */ +#define KXTF9_IEA 0x10 /* interrupt polarity */ +#define KXTF9_IEL 0x08 /* interrupt response */ +#define IEU 0x04 /* alternate unlatched response */ +/* DATA_CTRL_REG BITS */ +#define ODR800F 0x06 /* lpf output ODR masks */ +#define ODR400F 0x05 +#define ODR200F 0x04 +#define ODR100F 0x03 +#define ODR50F 0x02 +#define ODR25F 0x01 + +/* Device Meta Data */ +#define DESC_DEV "KXTF9 3-axis Accelerometer" // Device Description +#define VERSION_DEV "1.1.8" +#define VER_MAJOR_DEV 1 +#define VER_MINOR_DEV 1 +#define VER_MAINT_DEV 8 +#define MAX_G_DEV (8.0f) // Maximum G Level +#define MAX_SENS_DEV (1024.0f) // Maximum Sensitivity +#define PWR_DEV (0.57f) // Typical Current + +/* Input Device Name */ +#define INPUT_NAME_ACC "kxtf9_accel" + +/* Device name for kxtf9 misc. device */ +#define NAME_DEV "kxtf9" +#define DIR_DEV "/dev/kxtf9" + +/* IOCTLs for kxtf9 misc. device library */ +#define KXTF9IO 0x94 +#define KXTF9_IOCTL_GET_COUNT _IOR(KXTF9IO, 0x01, int) +#define KXTF9_IOCTL_GET_MG _IOR(KXTF9IO, 0x02, int) +#define KXTF9_IOCTL_ENABLE_OUTPUT _IO(KXTF9IO, 0x03) +#define KXTF9_IOCTL_DISABLE_OUTPUT _IO(KXTF9IO, 0x04) +#define KXTF9_IOCTL_GET_ENABLE _IOR(KXTF9IO, 0x05, int) +#define KXTF9_IOCTL_RESET _IO(KXTF9IO, 0x06) +#define KXTF9_IOCTL_UPDATE_ODR _IOW(KXTF9IO, 0x07, int) +#define KXTF9_IOCTL_ENABLE_DCST _IO(KXTF9IO, 0x08) +#define KXTF9_IOCTL_DISABLE_DCST _IO(KXTF9IO, 0x09) +#define KXTF9_IOCTL_GET_DCST_RESP _IOR(KXTF9IO, 0x0A, int) + + +#ifdef __KERNEL__ +struct kxtf9_platform_data { + int poll_interval; + int min_interval; + + u8 g_range; + u8 shift_adj; + u8 mul_fac; + + u8 axis_map_x; + u8 axis_map_y; + u8 axis_map_z; + + u8 negate_x; + u8 negate_y; + u8 negate_z; + + u8 data_odr_init; + u8 ctrl_reg1_init; + u8 int_ctrl_init; + u8 tilt_timer_init; + u8 engine_odr_init; + u8 wuf_timer_init; + u8 wuf_thresh_init; + u8 tdt_timer_init; + u8 tdt_h_thresh_init; + u8 tdt_l_thresh_init; + u8 tdt_tap_timer_init; + u8 tdt_total_timer_init; + u8 tdt_latency_timer_init; + u8 tdt_window_timer_init; + + int (*init)(void); + void (*exit)(void); + int (*power_on)(void); + int (*power_off)(void); + + int gpio; +}; +#endif /* __KERNEL__ */ + +#endif /* __KXTF9_H__ */ + From df3e0a2393927b6fbf36e4dcafcc9a4e3ccff5df Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 30 Aug 2011 23:31:29 -0700 Subject: [PATCH 045/150] newton: improve irda driver 1.improve irda read data effectiveness, reduce overrun err when receiving --- drivers/net/irda/ir_serial.c | 76 ++++++++---------------------------- 1 file changed, 16 insertions(+), 60 deletions(-) diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index 407f58c838aa..e5ae48cea4b9 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -112,11 +112,11 @@ static int add_frame_length(struct rev_frame_length *f, unsigned long length) return -1; f->frame_length[f->iWrite] = length; - printk("add one frame, length=%ld\n", f->frame_length[f->iWrite]); + //printk("add one frame, length=%ld\n", f->frame_length[f->iWrite]); f->iCount++; - printk("now frame iCount=%d\n", f->iCount); + //printk("now frame iCount=%d\n", f->iCount); f->iWrite = (f->iWrite+1) % MAX_FRAME_NUM; - printk("now frame iWrite=%d\n", f->iWrite); + //printk("now frame iWrite=%d\n", f->iWrite); return 0; @@ -128,20 +128,21 @@ static int get_frame_length(struct rev_frame_length *f, unsigned long *length) return -1; *length = f->frame_length[f->iRead]; - printk("read one frame, length=%ld\n", *length); + //printk("read one frame, length=%ld\n", *length); f->iCount--; - printk("now frame iCount=%d\n", f->iCount); + //printk("now frame iCount=%d\n", f->iCount); f->iRead = (f->iRead+1) % MAX_FRAME_NUM; - printk("now frame iRead=%d\n", f->iRead); + //printk("now frame iRead=%d\n", f->iRead); return 0; } static int bu92747_irda_do_rx(struct bu92747_port *s) { - int i; - unsigned int ch, flag; + //int i; + //unsigned int ch, flag; int len; + struct tty_struct *tty = s->port.state->port.tty; BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); if (s->rx_enabled == 0) { @@ -151,6 +152,7 @@ static int bu92747_irda_do_rx(struct bu92747_port *s) } len = BU92725GUW_get_data(g_receive_buf); + #if 0 flag = TTY_NORMAL; //printk("receive data:\n"); for (i=0;i 0) { + tty_insert_flip_string(tty, g_receive_buf, len); + s->port.icount.rx += len; + } + #endif return len; } @@ -213,7 +220,6 @@ static void bu92747_irda_work(struct work_struct *w) struct bu92747_port *s = container_of(w, struct bu92747_port, work); struct circ_buf *xmit = &s->port.state->xmit; - dev_dbg(s->dev, "%s\n", __func__); printk("line %d, enter %s \n", __LINE__, __FUNCTION__); if (!s->force_end_work && !freezing(current)) { @@ -235,8 +241,6 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) unsigned long len; struct rev_frame_length *f = &(s->rev_frames); - dev_dbg(s->dev, "%s\n", __func__); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); irq_src = irda_hw_get_irqsrc(); printk("[%s][%d], 0x%x\n",__FUNCTION__,__LINE__, irq_src); @@ -303,12 +307,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) static void bu92747_irda_stop_tx(struct uart_port *port) { - struct bu92747_port *s = container_of(port, - struct bu92747_port, - port); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - - dev_dbg(s->dev, "%s\n", __func__); } static void bu92747_irda_start_tx(struct uart_port *port) @@ -318,8 +317,6 @@ static void bu92747_irda_start_tx(struct uart_port *port) port); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); - //wait for start cmd if (IS_FIR(s)) return ; @@ -333,7 +330,6 @@ static void bu92747_irda_stop_rx(struct uart_port *port) struct bu92747_port, port); - dev_dbg(s->dev, "%s\n", __func__); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); s->rx_enabled = 0; @@ -348,7 +344,6 @@ static unsigned int bu92747_irda_tx_empty(struct uart_port *port) port); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); /* may not be truly up-to-date */ //bu92747_irda_dowork(s); @@ -362,19 +357,13 @@ static const char *bu92747_irda_type(struct uart_port *port) port); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); return s->port.type == PORT_IRDA ? "BU92747" : NULL; } static void bu92747_irda_release_port(struct uart_port *port) { - struct bu92747_port *s = container_of(port, - struct bu92747_port, - port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); } static void bu92747_irda_config_port(struct uart_port *port, int flags) @@ -384,7 +373,6 @@ static void bu92747_irda_config_port(struct uart_port *port, int flags) port); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); if (flags & UART_CONFIG_TYPE) s->port.type = PORT_IRDA; @@ -393,13 +381,9 @@ static void bu92747_irda_config_port(struct uart_port *port, int flags) static int bu92747_irda_verify_port(struct uart_port *port, struct serial_struct *ser) { - struct bu92747_port *s = container_of(port, - struct bu92747_port, - port); int ret = -EINVAL; BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); if (ser->type == PORT_UNKNOWN || ser->type == PORT_IRDA) ret = 0; @@ -415,7 +399,6 @@ static void bu92747_irda_shutdown(struct uart_port *port) struct rev_frame_length *f = &(s->rev_frames); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); if (s->suspending) return; @@ -454,7 +437,6 @@ static int bu92747_irda_startup(struct uart_port *port) struct rev_frame_length *f = &(s->rev_frames); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); s->rx_enabled = 1; @@ -514,43 +496,22 @@ static int bu92747_irda_startup(struct uart_port *port) static int bu92747_irda_request_port(struct uart_port *port) { - struct bu92747_port *s = container_of(port, - struct bu92747_port, - port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); return 0; } static void bu92747_irda_break_ctl(struct uart_port *port, int break_state) { - struct bu92747_port *s = container_of(port, - struct bu92747_port, - port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); } static unsigned int bu92747_irda_get_mctrl(struct uart_port *port) { - struct bu92747_port *s = container_of(port, - struct bu92747_port, - port); - - dev_dbg(s->dev, "%s\n", __func__); - return TIOCM_DSR | TIOCM_CAR; } static void bu92747_irda_set_mctrl(struct uart_port *port, unsigned int mctrl) { - struct bu92747_port *s = container_of(port, - struct bu92747_port, - port); - - dev_dbg(s->dev, "%s\n", __func__); BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); } @@ -566,7 +527,6 @@ bu92747_irda_set_termios(struct uart_port *port, struct ktermios *termios, struct tty_struct *tty = s->port.state->port.tty; BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); - dev_dbg(s->dev, "%s\n", __func__); if (!tty) return; @@ -792,8 +752,6 @@ static int bu92747_irda_suspend(struct platform_device *pdev, pm_message_t state { struct bu92747_port *s = dev_get_drvdata(&pdev->dev); - dev_dbg(s->dev, "%s\n", __func__); - if (s->open_flag) { printk("line %d, enter %s \n", __LINE__, __FUNCTION__); disable_irq(s->irq); @@ -812,8 +770,6 @@ static int bu92747_irda_suspend(struct platform_device *pdev, pm_message_t state static int bu92747_irda_resume(struct platform_device *pdev) { struct bu92747_port *s = dev_get_drvdata(&pdev->dev); - - dev_dbg(s->dev, "%s\n", __func__); if (s->open_flag) { printk("line %d, enter %s \n", __LINE__, __FUNCTION__); From 3d292d14079e4fd317a4f92df3980d444624aba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Thu, 1 Sep 2011 10:15:09 +0800 Subject: [PATCH 046/150] gpu : add pages pool to avoid alloc_pages failure --- .../hal/os/linux/kernel/gc_hal_kernel_os.c | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c old mode 100644 new mode 100755 index ae77f39a1b82..96fc28b69930 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -143,6 +143,9 @@ struct _gckOS gctINT cacheNum; gcsMapedNonPagedCache * cacheHead; gcsMapedNonPagedCache * cacheTail; + + gctINT pageNum; + struct page * pageCache[100]; #endif }; @@ -526,6 +529,13 @@ gckOS_Construct( os->signal.currentID = 0; #endif +#if gcdkUSE_MAPED_NONPAGE_CACHE + for(os->pageNum=0; os->pageNum<50; os->pageNum++) { + os->pageCache[os->pageNum] = alloc_pages(GFP_KERNEL | GFP_DMA, get_order(5 * PAGE_SIZE)); + } + //printk("os->pageNum = %d\n", os->pageNum); +#endif + /* Return pointer to the gckOS object. */ *Os = os; @@ -601,6 +611,12 @@ gckOS_Destroy( // dkm : gcdkUSE_MAPED_NONPAGE_CACHE #if gcdkUSE_MAPED_NONPAGE_CACHE _FreeAllMapedNonPagedCache(Os, 0); + + for(i=0; ipageNum; i++) { + if(Os->pageCache[i]) { + free_pages((unsigned long)page_address(Os->pageCache[i]), get_order(5 * PAGE_SIZE)); + } + } #endif #if !USE_NEW_LINUX_SIGNAL @@ -1496,7 +1512,19 @@ gckOS_AllocateNonPagedMemory( #else size = mdl->numPages * PAGE_SIZE; order = get_order(size); + +#if gcdkUSE_MAPED_NONPAGE_CACHE + if(5==mdl->numPages && Os->pageNum>0 && Os->pageCache[Os->pageNum-1]) { + Os->pageNum--; + page = Os->pageCache[Os->pageNum]; + Os->pageCache[Os->pageNum] = gcvNULL; + //printk("pop pages, os->pageNum = %d\n", Os->pageNum); + } else { + page = alloc_pages(GFP_KERNEL | GFP_DMA, order); + } +#else page = alloc_pages(GFP_KERNEL | GFP_DMA, order); +#endif if (page == gcvNULL) { @@ -1833,7 +1861,17 @@ gceSTATUS gckOS_FreeNonPagedMemoryRealy( size -= PAGE_SIZE; } +#if gcdkUSE_MAPED_NONPAGE_CACHE + if(5==mdl->numPages && Os->pageNum<100 && !Os->pageCache[Os->pageNum]) { + Os->pageCache[Os->pageNum] = virt_to_page(mdl->kaddr); + Os->pageNum ++; + //printk("push pages, os->pageNum = %d\n", Os->pageNum); + } else { + free_pages((unsigned long)mdl->kaddr, get_order(mdl->numPages * PAGE_SIZE)); + } +#else free_pages((unsigned long)mdl->kaddr, get_order(mdl->numPages * PAGE_SIZE)); +#endif iounmap(mdl->addr); #endif /* NO_DMA_COHERENT */ From a5635b4e5433d4bb0fa07abc60b6c6c5011ed088 Mon Sep 17 00:00:00 2001 From: lyx Date: Wed, 31 Aug 2011 19:16:03 -0700 Subject: [PATCH 047/150] rk29sdk:add irda board config to rk29sdk --- arch/arm/mach-rk29/board-rk29sdk.c | 148 +++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index b614f34f625f..dc67f13830d7 100755 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -44,6 +44,8 @@ #include #include #include +#include +#include #include #include @@ -1398,6 +1400,144 @@ static struct platform_device rk29_device_gpu = { }; #endif +#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) +#define BU92747GUW_RESET_PIN RK29_PIN3_PD4// INVALID_GPIO // +#define BU92747GUW_RESET_MUX_NAME GPIO3D4_HOSTWRN_NAME//NULL // +#define BU92747GUW_RESET_MUX_MODE GPIO3H_GPIO3D4//NULL // + +#define BU92747GUW_PWDN_PIN RK29_PIN3_PD3//RK29_PIN5_PA7 // +#define BU92747GUW_PWDN_MUX_NAME GPIO3D3_HOSTRDN_NAME//GPIO5A7_HSADCDATA2_NAME // +#define BU92747GUW_PWDN_MUX_MODE GPIO3H_GPIO3D3//GPIO5L_GPIO5A7 // + +static int bu92747guw_io_init(void) +{ + int ret; + + //reset pin + if(BU92747GUW_RESET_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_RESET_MUX_NAME, BU92747GUW_RESET_MUX_MODE); + } + ret = gpio_request(BU92747GUW_RESET_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_RESET_PIN); + printk(">>>>>> BU92747GUW_RESET_PIN gpio_request err \n "); + } + gpio_direction_output(BU92747GUW_RESET_PIN, GPIO_HIGH); + + //power down pin + if(BU92747GUW_PWDN_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_PWDN_MUX_NAME, BU92747GUW_PWDN_MUX_MODE); + } + ret = gpio_request(BU92747GUW_PWDN_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_PWDN_PIN); + printk(">>>>>> BU92747GUW_PWDN_PIN gpio_request err \n "); + } + + //power down as default + gpio_direction_output(BU92747GUW_PWDN_PIN, GPIO_LOW); + + return 0; +} + + +static int bu92747guw_io_deinit(void) +{ + gpio_free(BU92747GUW_PWDN_PIN); + gpio_free(BU92747GUW_RESET_PIN); + return 0; +} + +//power ctl func is share with irda and remote +static int nPowerOnCount = 0; +static DEFINE_MUTEX(bu92747_power_mutex); + +//1---power on; 0---power off +static int bu92747guw_power_ctl(int enable) +{ + printk("%s \n",__FUNCTION__); + + mutex_lock(&bu92747_power_mutex); + if (enable) { + nPowerOnCount++; + if (nPowerOnCount == 1) {//power on first + //smc0_init(NULL); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_HIGH); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_LOW); + mdelay(5); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_HIGH); + mdelay(5); + } + } + else { + nPowerOnCount--; + if (nPowerOnCount <= 0) {//power down final + nPowerOnCount = 0; + //smc0_exit(); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_LOW); + } + } + mutex_unlock(&bu92747_power_mutex); + return 0; +} +#endif + +#ifdef CONFIG_RK_IRDA +#define IRDA_IRQ_PIN RK29_PIN5_PB2 +#define IRDA_IRQ_MUX_NAME GPIO5B2_HSADCDATA5_NAME +#define IRDA_IRQ_MUX_MODE GPIO5L_GPIO5B2 + +int irda_iomux_init(void) +{ + int ret = 0; + + //irda irq pin + if(IRDA_IRQ_MUX_NAME != NULL) + { + rk29_mux_api_set(IRDA_IRQ_MUX_NAME, IRDA_IRQ_MUX_MODE); + } + ret = gpio_request(IRDA_IRQ_PIN, NULL); + if(ret != 0) + { + gpio_free(IRDA_IRQ_PIN); + printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n "); + } + gpio_pull_updown(IRDA_IRQ_PIN, GPIO_HIGH); + gpio_direction_input(IRDA_IRQ_PIN); + + return 0; +} + +int irda_iomux_deinit(void) +{ + gpio_free(IRDA_IRQ_PIN); + return 0; +} + +static struct irda_info rk29_irda_info = { + .intr_pin = IRDA_IRQ_PIN, + .iomux_init = irda_iomux_init, + .iomux_deinit = irda_iomux_deinit, + .irda_pwr_ctl = bu92747guw_power_ctl, +}; + +static struct platform_device irda_device = { +#ifdef CONFIG_RK_IRDA_NET + .name = "rk_irda", +#else + .name = "bu92747_irda", +#endif + .id = -1, + .dev = { + .platform_data = &rk29_irda_info, + } +}; +#endif + #ifdef CONFIG_KEYS_RK29 extern struct rk29_keys_platform_data rk29_keys_pdata; static struct platform_device rk29_device_keys = { @@ -1538,6 +1678,9 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_VIDEO_RK29XX_VOUT &rk29_v4l2_output_devce, #endif +#ifdef CONFIG_RK_IRDA + &irda_device, +#endif }; /***************************************************************************************** @@ -1819,6 +1962,11 @@ static void __init machine_rk29_board_init(void) #endif board_usb_detect_init(RK29_PIN0_PA0); +#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) + smc0_init(NULL); + bu92747guw_io_init(); +#endif + } static void __init machine_rk29_fixup(struct machine_desc *desc, struct tag *tags, From 308a76e8971d5e5475b0c389b0ca00f3807c8f0c Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:26:04 +0800 Subject: [PATCH 048/150] modify lcd_at070tn93 parameter --- drivers/video/display/screen/lcd_at070tn93.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 drivers/video/display/screen/lcd_at070tn93.c diff --git a/drivers/video/display/screen/lcd_at070tn93.c b/drivers/video/display/screen/lcd_at070tn93.c old mode 100755 new mode 100644 index 4b528b3d75e8..614f9f79b30b --- a/drivers/video/display/screen/lcd_at070tn93.c +++ b/drivers/video/display/screen/lcd_at070tn93.c @@ -10,8 +10,8 @@ /* Base */ #define OUT_TYPE SCREEN_RGB -#define OUT_FACE OUT_D888_P666 -#define OUT_CLK 50000000 +#define OUT_FACE OUT_P888 +#define OUT_CLK 46800000//33300000//50000000 #define LCDC_ACLK 500000000 //29 lcdc axi DMA Ƶ /* Timing */ From 17b382f40440162f7a6db891e304caae05f5f1f8 Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:27:41 +0800 Subject: [PATCH 049/150] newton key early suspend --- drivers/input/keyboard/rk29_newton_keys.c | 108 ++++++++++++---------- 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/drivers/input/keyboard/rk29_newton_keys.c b/drivers/input/keyboard/rk29_newton_keys.c index 6bc444931bb5..7a662f1685a2 100644 --- a/drivers/input/keyboard/rk29_newton_keys.c +++ b/drivers/input/keyboard/rk29_newton_keys.c @@ -143,7 +143,6 @@ static void keys_timer(unsigned long _data) struct rk29_keys_button *button = bdata->button; struct input_dev *input = bdata->input; unsigned int type = EV_KEY; - if((suspend)&&(!button->wakeup)) return; if(button->gpio != INVALID_GPIO) @@ -172,54 +171,9 @@ static irqreturn_t keys_isr(int irq, void *dev_id) jiffies + msecs_to_jiffies(DEFAULT_DEBOUNCE_INTERVAL)); return IRQ_HANDLED; } +static void newton_key_early_suspend(struct early_suspend *h); +static void newton_key_last_resume(struct early_suspend *h); -static int keys_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; - int i; - - if (device_may_wakeup(&pdev->dev)) { - for (i = 0; i < pdata->nbuttons; i++) { - struct rk29_keys_button *button = &pdata->buttons[i]; - int irq = gpio_to_irq(button->gpio); - enable_irq_wake(irq); - } - } - suspend = 1; - return 0; -} - -static int keys_resume(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; - int i; - - if (device_may_wakeup(&pdev->dev)) { - for (i = 0; i < pdata->nbuttons; i++) { - struct rk29_keys_button *button = &pdata->buttons[i]; - if (button->wakeup) { - int irq = gpio_to_irq(button->gpio); - disable_irq_wake(irq); - } - } - } - suspend = 0; - return 0; -} - -static void newton_key_early_suspend(struct early_suspend *h) -{ - dev_info(&input_dev->dev, "newton_key_early_suspend!\n"); - keys_suspend(&input_dev->dev); -} - -static void newton_key_last_resume(struct early_suspend *h) -{ - dev_info(&input_dev->dev, "newton_key_last_resume!\n"); - keys_resume(&input_dev->dev); -} static int __devinit keys_probe(struct platform_device *pdev) { @@ -257,7 +211,6 @@ static int __devinit keys_probe(struct platform_device *pdev) __set_bit(EV_REP, input->evbit); ddata->nbuttons = pdata->nbuttons; ddata->input = input; - for (i = 0; i < pdata->nbuttons; i++) { struct rk29_keys_button *button = &pdata->buttons[i]; struct rk29_button_data *bdata = &ddata->data[i]; @@ -288,6 +241,7 @@ static int __devinit keys_probe(struct platform_device *pdev) gpio_free(button->gpio); goto fail2; } + irq = gpio_to_irq(button->gpio); if (irq < 0) { error = irq; @@ -372,6 +326,59 @@ static int __devexit keys_remove(struct platform_device *pdev) } +#ifdef CONFIG_PM +static int keys_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; + int i; + + if (device_may_wakeup(&pdev->dev)) { + for (i = 0; i < pdata->nbuttons; i++) { + struct rk29_keys_button *button = &pdata->buttons[i]; + if (button->wakeup) { + int irq = gpio_to_irq(button->gpio); + enable_irq_wake(irq); + } + } + } + + return 0; +} + +static int keys_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct rk29_keys_platform_data *pdata = pdev->dev.platform_data; + int i; + + if (device_may_wakeup(&pdev->dev)) { + for (i = 0; i < pdata->nbuttons; i++) { + struct rk29_keys_button *button = &pdata->buttons[i]; + if (button->wakeup) { + int irq = gpio_to_irq(button->gpio); + disable_irq_wake(irq); + } + } + } + + return 0; +} + +static void newton_key_early_suspend(struct early_suspend *h) +{ + suspend = 1; +} + +static void newton_key_last_resume(struct early_suspend *h) +{ + suspend = 0; +} +static const struct dev_pm_ops keys_pm_ops = { + .suspend = keys_suspend, + .resume = keys_resume, +}; +#endif static struct platform_driver keys_device_driver = { .probe = keys_probe, @@ -379,6 +386,9 @@ static struct platform_driver keys_device_driver = { .driver = { .name = "rk29-keypad", .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &keys_pm_ops, +#endif } }; From 8d2617b0d21aa6cc637a3a7f1c729fcb60814e6f Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:34:26 +0800 Subject: [PATCH 050/150] bq27541 when system up with no battary,shutdown system --- arch/arm/mach-rk29/board-rk29-newton.c | 22 +--- arch/arm/mach-rk29/include/mach/board.h | 4 +- drivers/power/bq27541_battery.c | 149 ++++++++++++++++++++++-- 3 files changed, 147 insertions(+), 28 deletions(-) mode change 100755 => 100644 drivers/power/bq27541_battery.c diff --git a/arch/arm/mach-rk29/board-rk29-newton.c b/arch/arm/mach-rk29/board-rk29-newton.c index 5001fd78c257..943b7a1b1b6b 100644 --- a/arch/arm/mach-rk29/board-rk29-newton.c +++ b/arch/arm/mach-rk29/board-rk29-newton.c @@ -617,6 +617,9 @@ struct cs42l52_platform_data cs42l52_info = { #if defined (CONFIG_BATTERY_BQ27541) #define DC_CHECK_PIN RK29_PIN4_PA1 #define LI_LION_BAT_NUM 1 +#define CHG_OK RK29_PIN4_PA3 +#define BAT_LOW RK29_PIN4_PA2 + static int bq27541_init_dc_check_pin(void){ if(gpio_request(DC_CHECK_PIN,"dc_check") != 0){ gpio_free(DC_CHECK_PIN); @@ -631,6 +634,8 @@ struct bq27541_platform_data bq27541_info = { .init_dc_check_pin = bq27541_init_dc_check_pin, .dc_check_pin = DC_CHECK_PIN, .bat_num = LI_LION_BAT_NUM, + .chgok_check_pin = CHG_OK, + .bat_check_pin = BAT_LOW, }; #endif static struct android_pmem_platform_data android_pmem_pdata = { @@ -2203,24 +2208,9 @@ static struct cpufreq_frequency_table freq_table[] = { { .frequency = CPUFREQ_TABLE_END }, }; -#define BAT_LOW RK29_PIN4_PA2 -#define POWER_ON_PIN RK29_PIN4_PA4 + static void __init machine_rk29_board_init(void) { - int val =0; - gpio_request(BAT_LOW, NULL); - gpio_direction_input(BAT_LOW); - val = gpio_get_value(BAT_LOW); - if (val == 0){ - printk("no battery, no power up\n"); - gpio_request(POWER_ON_PIN, "poweronpin"); - gpio_direction_output(POWER_ON_PIN, GPIO_LOW); - while(1){ - gpio_set_value(POWER_ON_PIN, GPIO_LOW); - mdelay(100); - } - } - gpio_free(BAT_LOW); rk29_board_iomux_init(); board_power_init(); diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h index a9a72b23e842..c97306d4af19 100644 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -164,7 +164,9 @@ struct bq27510_platform_data { struct bq27541_platform_data { int (*init_dc_check_pin)(void); - unsigned int dc_check_pin; + unsigned int dc_check_pin; + unsigned int bat_check_pin; + unsigned int chgok_check_pin; unsigned int bat_num; }; diff --git a/drivers/power/bq27541_battery.c b/drivers/power/bq27541_battery.c old mode 100755 new mode 100644 index 3b775fecda00..1ead67d8f6bb --- a/drivers/power/bq27541_battery.c +++ b/drivers/power/bq27541_battery.c @@ -25,6 +25,9 @@ #include #include #include +#include +#include + #define DRIVER_VERSION "1.1.0" @@ -46,14 +49,16 @@ #define BQ27510_SPEED 100 * 1000 #define POWER_ON_PIN RK29_PIN4_PA4 +//#define CHG_OK RK29_PIN4_PA3 -#define BAT_LOW RK29_PIN4_PA2 +//#define BAT_LOW RK29_PIN4_PA2 int virtual_battery_enable = 0; extern int dwc_vbus_status(void); static void bq27541_set(void); + #if 0 #define DBG(x...) printk(KERN_INFO x) #else @@ -70,9 +75,12 @@ struct bq27541_device_info { struct power_supply bat; struct power_supply ac; struct delayed_work work; + struct delayed_work wakeup_work; struct i2c_client *client; + int wake_irq; unsigned int interval; unsigned int dc_check_pin; + unsigned int bat_check_pin; unsigned int bat_num; int power_down; }; @@ -156,6 +164,36 @@ static int bq27541_write(struct i2c_client *client, u8 reg, u8 const buf[], unsi * Return the battery temperature in tenths of degree Celsius * Or < 0 if something fails. */ + +static irqreturn_t bq27541_bat_wakeup(int irq, void *dev_id) +{ + struct bq27541_device_info *di = (struct bq27541_device_info *)dev_id; + + printk("!!! bq27541 bat_low irq low vol !!!\n\n\n"); + disable_irq_wake(di->wake_irq); + + schedule_delayed_work(&di->wakeup_work, msecs_to_jiffies(0)); + return IRQ_HANDLED; +} + +static void bq27541_battery_wake_work(struct work_struct *work) +{ + int ret; + struct bq27541_device_info *di = + (struct bq27541_device_info *)container_of(work, struct bq27541_device_info, wakeup_work.work); + + rk28_send_wakeup_key(); + + free_irq(di->wake_irq, di); + di->wake_irq = gpio_to_irq(di->bat_check_pin); + + ret = request_irq(di->wake_irq, bq27541_bat_wakeup, IRQF_TRIGGER_FALLING, "bq27541_battery", di); + if (ret) { + printk("request faild!\n"); + return; + } + enable_irq_wake(di->wake_irq); +} static int bq27541_battery_temperature(struct bq27541_device_info *di) @@ -187,6 +225,9 @@ static int bq27541_battery_temperature(struct bq27541_device_info *di) * Return the battery Voltage in milivolts * Or < 0 if something fails. */ + + + static int bq27541_battery_voltage(struct bq27541_device_info *di) { int ret; @@ -202,7 +243,6 @@ static int bq27541_battery_voltage(struct bq27541_device_info *di) ret = bq27541_read(di->client,BQ27x00_REG_VOLT,buf,2); if (ret<0) { dev_err(di->dev, "error reading voltage\n"); - printk("vol smaller then 3.4V, shutdown"); // gpio_set_value(POWER_ON_PIN, GPIO_LOW); return ret; } @@ -215,15 +255,16 @@ static int bq27541_battery_voltage(struct bq27541_device_info *di) volt = volt * 1000; } + + - if ((volt <= 3400000) && (volt > 0)){ - printk("vol smaller then 3.4V, shutdown"); + if ((volt <= 3400000) && (volt > 0) && gpio_get_value(di->dc_check_pin)){ + printk("vol smaller then 3.4V, report to android!"); di->power_down = 1; }else{ di->power_down = 0; } - DBG("Enter:%s %d--volt = %d\n",__FUNCTION__,__LINE__,volt); return volt; @@ -468,7 +509,6 @@ static int bq27541_battery_get_property(struct power_supply *psy, union power_supply_propval *val) { int ret = 0; - int vals=0; struct bq27541_device_info *di = to_bq27541_device_info(psy); DBG("Enter:%s %d psp= %d\n",__FUNCTION__,__LINE__,psp); @@ -489,10 +529,10 @@ static int bq27541_battery_get_property(struct power_supply *psy, val->intval = bq27541_battery_current(di); break; case POWER_SUPPLY_PROP_CAPACITY: - if (!(di->power_down)){ // < 3.4V power down ,capacity = 0; - val->intval = bq27541_battery_rsoc(di); - }else{ + if (di->power_down == 1){ // < 3.4V power down ,capacity = 0; val->intval = 0; + }else { + val->intval = bq27541_battery_rsoc(di); } break; @@ -629,8 +669,8 @@ static int bq27541_battery_probe(struct i2c_client *client, int retval = 0; struct bq27541_platform_data *pdata; int val =0; - - + char buf[2]; + int volt; DBG("********** bq27541_battery_probe************** "); pdata = client->dev.platform_data; @@ -649,6 +689,7 @@ static int bq27541_battery_probe(struct i2c_client *client, di->bat_num = pdata->bat_num; di->dc_check_pin = pdata->dc_check_pin; + di->bat_check_pin = pdata->bat_check_pin; if (pdata->init_dc_check_pin) pdata->init_dc_check_pin( ); @@ -671,11 +712,95 @@ static int bq27541_battery_probe(struct i2c_client *client, INIT_DELAYED_WORK(&di->work, bq27541_battery_work); schedule_delayed_work(&di->work, di->interval); dev_info(&client->dev, "support ver. %s enabled\n", DRIVER_VERSION); + +#if !defined (CONFIG_NO_BATTERY_IC) + + // no battery , no power up + gpio_request(POWER_ON_PIN, "poweronpin"); + gpio_request(pdata->bat_check_pin, NULL); + gpio_direction_input(pdata->bat_check_pin); + gpio_request(pdata->chgok_check_pin, "CHG_OK"); + gpio_direction_input(pdata->chgok_check_pin); + + val = gpio_get_value(pdata->bat_check_pin); + if (val == 1){ + printk("\n\n!!! bat_low high !!!\n\n"); + val = bq27541_read(di->client,BQ27x00_REG_VOLT,buf,2); + if (val < 0){ + printk("\n\n!!! bq i2c err! no battery, power down\n!!!\n\n"); + gpio_direction_output(POWER_ON_PIN, GPIO_LOW); + while(1){ + gpio_set_value(POWER_ON_PIN, GPIO_LOW); + mdelay(100); + } + } + + }else{ + + printk("\n\n!!! bat_low low !!!\n\n"); + val = gpio_get_value(pdata->chgok_check_pin); + if (val == 1){ + printk("no battery, power down \n"); + gpio_direction_output(POWER_ON_PIN, GPIO_LOW); + while(1){ + gpio_set_value(POWER_ON_PIN, GPIO_LOW); + mdelay(100); + } + }else{ + mdelay(1000); + val = gpio_get_value(pdata->chgok_check_pin); + if (val == 1){ + printk("no battery, power down \n"); + gpio_direction_output(POWER_ON_PIN, GPIO_LOW); + while(1){ + gpio_set_value(POWER_ON_PIN, GPIO_LOW); + mdelay(100); + } + } + } + + } + +// gpio_free(POWER_ON_PIN); +// gpio_free(pdata->bat_check_pin); + gpio_free(pdata->chgok_check_pin); + + + //smaller 3.4V , no power up + if (gpio_get_value(di->dc_check_pin) && (gpio_get_value(pdata->bat_check_pin) == 0)){ + printk("no AC && battery low ,so power down \n"); + gpio_direction_output(POWER_ON_PIN, GPIO_LOW); + while(1){ + printk("no AC && battery low ,so power down \n"); + gpio_set_value(POWER_ON_PIN, GPIO_LOW); + mdelay(100); + } + } + + + // battery low irq + di->wake_irq = gpio_to_irq(pdata->bat_check_pin); + retval = request_irq(di->wake_irq, bq27541_bat_wakeup, IRQF_TRIGGER_FALLING, "bq27541_battery", di); + if (retval) { + printk("failed to request bat det irq\n"); + goto err_batirq_failed; + } + + INIT_DELAYED_WORK(&di->wakeup_work, bq27541_battery_wake_work); + enable_irq_wake(di->wake_irq); + + +#endif + return 0; batt_failed_4: kfree(di); batt_failed_2: + +err_batirq_failed: + gpio_free(pdata->bat_check_pin); + return retval; } @@ -718,6 +843,8 @@ static int __init bq27541_battery_init(void) } //module_init(bq27541_battery_init); +//fs_initcall_sync(bq27541_battery_init); + fs_initcall(bq27541_battery_init); //arch_initcall(bq27541_battery_init); From 2d49a81e77f48eea053053ceae8304a9cf5d8bfe Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:37:34 +0800 Subject: [PATCH 051/150] gt819 and ft5406 update fw and modiry suspend wake up --- arch/arm/mach-rk29/board-rk29-newton.c | 9 +- drivers/input/touchscreen/ft5406_ts.c | 2 - drivers/input/touchscreen/ft_app.i | 98 +- drivers/input/touchscreen/gt819.c | 17 +- drivers/input/touchscreen/gt819.cfg | 2 +- drivers/input/touchscreen/gt819.i | 3312 -------------- drivers/input/touchscreen/gt819_fw.i | 5812 ++++++++++++------------ 7 files changed, 2939 insertions(+), 6313 deletions(-) delete mode 100755 drivers/input/touchscreen/gt819.i diff --git a/arch/arm/mach-rk29/board-rk29-newton.c b/arch/arm/mach-rk29/board-rk29-newton.c index 943b7a1b1b6b..84feada0046a 100644 --- a/arch/arm/mach-rk29/board-rk29-newton.c +++ b/arch/arm/mach-rk29/board-rk29-newton.c @@ -515,6 +515,7 @@ int ft5406_platform_wakeup(void) { printk("ft5406_platform_wakeup\n"); gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + msleep(300); return 0; } @@ -548,11 +549,11 @@ int gt819_init_platform_hw(void) gpio_direction_output(TOUCH_RESET_PIN, 0); gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); mdelay(10); - gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); - mdelay(10); - gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); +// gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); +// mdelay(10); +// gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); gpio_direction_input(TOUCH_INT_PIN); - mdelay(10); +// mdelay(10); gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); msleep(300); return 0; diff --git a/drivers/input/touchscreen/ft5406_ts.c b/drivers/input/touchscreen/ft5406_ts.c index d36cfbceb55e..991507fb51b5 100755 --- a/drivers/input/touchscreen/ft5406_ts.c +++ b/drivers/input/touchscreen/ft5406_ts.c @@ -676,13 +676,11 @@ static int ft5406_resume(struct i2c_client *client) static void ft5406_suspend_early(struct early_suspend *h) { - dev_info(&this_client->dev, "ft5406_suspend_early!\n"); ft5406_suspend(this_client,PMSG_SUSPEND); } static void ft5406_resume_early(struct early_suspend *h) { - dev_info(&this_client->dev, "ft5406_resume_early!\n"); ft5406_resume(this_client); } static int __devexit ft5406_remove(struct i2c_client *client) diff --git a/drivers/input/touchscreen/ft_app.i b/drivers/input/touchscreen/ft_app.i index d94fe629ad2a..a538af7cf033 100755 --- a/drivers/input/touchscreen/ft_app.i +++ b/drivers/input/touchscreen/ft_app.i @@ -554,7 +554,7 @@ 0x12,0x1f,0xea,0x90,0x8, 0x27,0xe0,0x70,0x10,0x90,0x8, 0x20,0xe0,0xb4,0x4, 0x9, 0x90,0xa, 0xda,0xe4,0xf0,0xa3,0x74,0xa, 0xf0,0xd3,0x90,0xa, 0xdb,0xe0,0x94,0x0, 0x90,0xa, 0xda,0xe0,0x94,0x0, 0x40,0x12,0xa3,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xda, -0xe0,0x34,0xff,0xf0,0x90,0x8, 0x20,0x74,0x4, 0xf0,0xb1,0xcc,0x12,0x50,0x8, 0x90, +0xe0,0x34,0xff,0xf0,0x90,0x8, 0x20,0x74,0x4, 0xf0,0xb1,0xcc,0x12,0x50,0x5, 0x90, 0x9, 0x15,0xef,0xf0,0xf1,0x6c,0xb1,0xd5,0x12,0x58,0x41,0xf1,0x43,0x11,0xe6,0x90, 0x8, 0x20,0xe0,0xb4,0x6, 0xe, 0x90,0x8, 0x60,0xe0,0xd3,0x94,0x1, 0x40,0x5, 0xe4, 0x90,0x8, 0x20,0xf0,0xf1,0xaf,0x75,0x27,0x1, 0x75,0x28,0x9, 0x75,0x29,0x18,0xf1, @@ -1167,17 +1167,17 @@ 0x74,0x53,0x25,0x2c,0xf5,0x82,0x74,0xb, 0x35,0x2b,0xf5,0x83,0xe4,0xf0,0x5, 0x2c, 0xe5,0x2c,0x70,0x2, 0x5, 0x2b,0xb4,0x5e,0xe7,0xe5,0x2b,0xb4,0x1, 0xe2,0xe5,0x2d, 0xf4,0x60,0x4, 0x7f,0x4, 0x51,0xbf,0x22,0xa3,0xf0,0xe4,0xa3,0xf0,0xa3,0x22,0x12, -0x17,0xeb,0x90,0xc, 0xb2,0x74,0x11,0xf0,0xa3,0x74,0x32,0xf0,0x90,0xc, 0xb7,0x74, +0x17,0xeb,0x90,0xc, 0xb2,0x74,0x19,0xf0,0xa3,0x74,0x32,0xf0,0x90,0xc, 0xb7,0x74, 0xa0,0xf0,0xa3,0x74,0x1, 0xf0,0xa3,0x74,0xc8,0xf0,0xa3,0x74,0x7, 0xf0,0xa3,0x74, 0x28,0xf0,0x90,0xc, 0xc9,0x74,0x32,0xf0,0x90,0xc, 0xd2,0x74,0xff,0xf0,0x90,0xc, -0xd5,0x74,0x55,0xf0,0xa3,0x74,0x1, 0xf0,0xe4,0xa3,0xf0,0xa3,0x74,0x14,0xf0,0xa3, +0xd5,0x74,0x55,0xf0,0xa3,0x74,0x1, 0xf0,0xe4,0xa3,0xf0,0xa3,0x74,0x15,0xf0,0xa3, 0x74,0x1, 0xf0,0x74,0x79,0x31,0x8, 0xf0,0x90,0xc, 0xe1,0x4, 0xf0,0x90,0xc, 0xe0, 0x74,0x96,0xf0,0x90,0xc, 0xe5,0x74,0x1e,0xf0,0xa3,0x74,0x28,0xf0,0x12,0x15,0xfb, 0xe4,0x12,0x1, 0xc5,0x12,0x15,0xfb,0x4, 0x12,0x3f,0xb7,0x90,0x0, 0x9, 0xe4,0x12, 0x1, 0xd7,0x90,0x0, 0x3, 0x74,0xe, 0x12,0x1, 0xd7,0x74,0x7, 0x12,0x27,0xed,0x74, 0x28,0x51,0x7a,0x74,0x28,0x12,0x1, 0xd7,0x90,0x0, 0x8, 0x74,0xc8,0x12,0x1, 0xd7, 0x90,0x0, 0xa, 0x74,0x1, 0x12,0x1, 0xd7,0x12,0x47,0x5c,0x12,0x16,0x23,0xe4,0x75, -0xf0,0x46,0x12,0x3, 0x3c,0x12,0x16,0x23,0x90,0x0, 0x2, 0x74,0x11,0x12,0x1, 0xd7, +0xf0,0x64,0x12,0x3, 0x3c,0x12,0x16,0x23,0x90,0x0, 0x2, 0x74,0x19,0x12,0x1, 0xd7, 0x90,0x0, 0x3, 0xe4,0x75,0xf0,0x32,0x12,0x3, 0x5b,0x90,0x0, 0x22,0x74,0x10,0x12, 0x1, 0xd7,0x90,0x0, 0x15,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x16,0x74,0x3, 0x12, 0x1, 0xd7,0x90,0x0, 0x1a,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x1b,0x74,0x18,0x12,0x1, @@ -1258,51 +1258,51 @@ 0xaf,0x33,0xfe,0xc2,0x88,0xd2,0xa8,0xc2,0xaf,0x30,0x89,0x6, 0xc2,0x89,0xe4,0xff, 0x80,0x1, 0xf, 0xef,0xd3,0x94,0xfa,0x40,0xf0,0xee,0x24,0xff,0x92,0xaf,0x75,0xf7, 0xff,0x22,0x12,0x17,0xeb,0xe4,0xf5,0x24,0x75,0x25,0x1, 0x12,0x16,0x23,0xe5,0x25, -0x12,0x68,0x11,0xe5,0x24,0x12,0x68,0xb, 0x12,0x2, 0xb7,0xc3,0x94,0xf1,0x12,0x51, -0x7c,0x40,0x2, 0xe1,0xf0,0xe4,0xf5,0x27,0x85,0x25,0x26,0x12,0x16,0x23,0x12,0x67, -0x94,0x75,0xf0,0x2, 0xe5,0x24,0x12,0x14,0x5c,0x12,0x68,0x8e,0x94,0x80,0x50,0x5, -0x75,0x27,0x1, 0x80,0xb, 0xe5,0x26,0xd3,0x94,0x1, 0x40,0x4, 0x15,0x26,0x80,0xdb, -0xe5,0x27,0x70,0x2a,0xe5,0x25,0x4, 0xf5,0x26,0xe5,0x26,0xc3,0x94,0x18,0x50,0x1e, -0x12,0x16,0x23,0x12,0x67,0x94,0x75,0xf0,0x2, 0xe5,0x24,0x12,0x14,0x5c,0x12,0x68, -0x8e,0x94,0x80,0x50,0x5, 0x75,0x27,0x1, 0x80,0x4, 0x5, 0x26,0x80,0xdb,0xe5,0x27, -0x64,0x1, 0x60,0x2, 0xe1,0xf0,0x12,0x16,0x23,0xe5,0x25,0x12,0x1b,0xee,0x12,0x67, -0xbb,0xea,0x35,0xf0,0x12,0x37,0xef,0x12,0x37,0xbe,0xae,0xf0,0x2d,0xf5,0x29,0xec, -0x3e,0xf5,0x28,0xe5,0x26,0x12,0x1b,0xee,0xe5,0x26,0x12,0x67,0xbd,0xea,0x35,0xf0, -0x12,0x37,0xef,0x12,0x37,0xbe,0xae,0xf0,0x2d,0xf5,0x2b,0xec,0x3e,0xf5,0x2a,0xe5, -0x26,0x7c,0x0, 0x12,0x67,0xbf,0xec,0x35,0xf0,0x12,0x37,0xef,0x33,0x8f,0x82,0xf5, -0x83,0x12,0x1b,0xff,0x12,0x67,0xbb,0xea,0x35,0xf0,0x12,0x37,0xef,0x12,0x37,0xbe, -0x12,0x68,0x84,0xc0,0x6, 0xc0,0x7, 0xc3,0xe5,0x29,0x95,0x2b,0xff,0xe5,0x28,0x95, -0x2a,0xfe,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0xd3,0xef,0x9d,0xec,0x12,0x5f,0x15, -0x40,0x3e,0xab,0x21,0xe5,0x23,0x24,0x60,0xf9,0xe5,0x22,0x34,0x7, 0xfa,0xe5,0x25, -0x75,0xf0,0x10,0xa4,0x25,0x24,0x12,0x66,0xd7,0xfe,0xef,0x78,0x3, 0x12,0x2d,0x56, -0xd8,0xfb,0x12,0x7, 0x74,0xff,0xe5,0x25,0xc4,0x54,0xf0,0x25,0x24,0x54,0x7, 0xfe, -0x74,0x1, 0xa8,0x6, 0x8, 0x80,0x2, 0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x12,0x1, 0xc5, -0x5, 0x25,0xe5,0x25,0xc3,0x94,0x18,0x50,0x2, 0xc1,0xbb,0x5, 0x24,0xe5,0x24,0xc3, -0x94,0xe, 0x50,0x3, 0x2, 0x4e,0xb8,0x22,0x12,0x17,0xeb,0xe4,0xf5,0x2b,0xf5,0x2c, -0x12,0x15,0xfb,0x12,0x17,0xe5,0x60,0x8, 0x90,0x0, 0x2e,0x12,0x1, 0x65,0x60,0x3, -0x7f,0x0, 0x22,0x12,0x1, 0x4c,0xc3,0x13,0xf5,0x28,0x12,0x2b,0x2f,0xc3,0x13,0xf5, -0x29,0xe4,0xf5,0x2a,0xf5,0x27,0x12,0x16,0x23,0x12,0x14,0x4c,0x12,0x0, 0x6, 0xd3, -0xef,0x94,0x14,0xee,0x64,0x80,0x94,0x80,0x40,0x2, 0x5, 0x2a,0x31,0x3e,0x40,0xe6, -0xe5,0x2a,0xd3,0x94,0xa, 0x40,0x2, 0x31,0x46,0xe4,0xf5,0x2a,0xe5,0x28,0xd3,0x94, -0x0, 0x40,0x32,0xe4,0xf5,0x27,0x12,0x16,0x23,0x12,0x14,0x4c,0x12,0x0, 0x6, 0xc0, -0x6, 0xc0,0x7, 0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0x60,0x31,0x61,0x12,0x16,0x23, -0x12,0x14,0x57,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0x12,0x2e,0xbe,0x40,0x2, 0x5, -0x2a,0x31,0x3e,0x40,0xd1,0xe5,0x2a,0xd3,0x94,0xa, 0x40,0x2, 0x31,0x46,0xe4,0xf5, -0x2a,0xe5,0x28,0xc3,0x94,0x18,0x50,0x32,0xe4,0xf5,0x27,0x12,0x16,0x23,0x12,0x14, -0x4c,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0xa0, -0x31,0x61,0x12,0x16,0x23,0x12,0x14,0x57,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0x12, -0x2e,0xbe,0x40,0x2, 0x5, 0x2a,0x31,0x3e,0x40,0xd1,0xe5,0x2a,0xd3,0x94,0xa, 0x40, -0x2, 0x31,0x46,0xe5,0x29,0xd3,0x94,0x0, 0x40,0x1f,0xe5,0x28,0x75,0xf0,0x20,0x12, -0x1b,0xe2,0xe5,0x29,0x75,0xf0,0x2, 0xa4,0x24,0x7e,0xff,0xe5,0xf0,0x34,0x3, 0xfe, -0x12,0x2e,0xd6,0x31,0x76,0x50,0x2, 0x31,0x6a,0xe5,0x29,0x24,0x1, 0xff,0xe4,0x33, -0xfe,0xc3,0xef,0x94,0x19,0xee,0x64,0x80,0x94,0x80,0x50,0x1f,0xe5,0x28,0x75,0xf0, +0x12,0x68,0x11,0xe5,0x24,0x12,0x68,0xb, 0x12,0x2, 0xb7,0x12,0x51,0x6d,0x40,0x2, +0xe1,0xed,0xe4,0xf5,0x27,0x85,0x25,0x26,0x12,0x16,0x23,0x12,0x67,0x94,0x75,0xf0, +0x2, 0xe5,0x24,0x12,0x14,0x5c,0x12,0x68,0x8e,0x94,0x80,0x50,0x5, 0x75,0x27,0x1, +0x80,0xb, 0xe5,0x26,0xd3,0x94,0x1, 0x40,0x4, 0x15,0x26,0x80,0xdb,0xe5,0x27,0x70, +0x2a,0xe5,0x25,0x4, 0xf5,0x26,0xe5,0x26,0xc3,0x94,0x18,0x50,0x1e,0x12,0x16,0x23, +0x12,0x67,0x94,0x75,0xf0,0x2, 0xe5,0x24,0x12,0x14,0x5c,0x12,0x68,0x8e,0x94,0x80, +0x50,0x5, 0x75,0x27,0x1, 0x80,0x4, 0x5, 0x26,0x80,0xdb,0xe5,0x27,0x64,0x1, 0x60, +0x2, 0xe1,0xed,0x12,0x16,0x23,0xe5,0x25,0x12,0x1b,0xee,0x12,0x67,0xbb,0xea,0x35, +0xf0,0x12,0x37,0xef,0x12,0x37,0xbe,0xae,0xf0,0x2d,0xf5,0x29,0xec,0x3e,0xf5,0x28, +0xe5,0x26,0x12,0x1b,0xee,0xe5,0x26,0x12,0x67,0xbd,0xea,0x35,0xf0,0x12,0x37,0xef, +0x12,0x37,0xbe,0xae,0xf0,0x2d,0xf5,0x2b,0xec,0x3e,0xf5,0x2a,0xe5,0x26,0x7c,0x0, +0x12,0x67,0xbf,0xec,0x35,0xf0,0x12,0x37,0xef,0x33,0x8f,0x82,0xf5,0x83,0x12,0x1b, +0xff,0x12,0x67,0xbb,0xea,0x35,0xf0,0x12,0x37,0xef,0x12,0x37,0xbe,0x12,0x68,0x84, +0xc0,0x6, 0xc0,0x7, 0xc3,0xe5,0x29,0x95,0x2b,0xff,0xe5,0x28,0x95,0x2a,0xfe,0x12, +0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0xd3,0xef,0x9d,0xec,0x12,0x5f,0x15,0x40,0x3e,0xab, +0x21,0xe5,0x23,0x24,0x60,0xf9,0xe5,0x22,0x34,0x7, 0xfa,0xe5,0x25,0x75,0xf0,0x10, +0xa4,0x25,0x24,0x12,0x66,0xd7,0xfe,0xef,0x78,0x3, 0x12,0x2d,0x56,0xd8,0xfb,0x12, +0x7, 0x74,0xff,0xe5,0x25,0xc4,0x54,0xf0,0x25,0x24,0x54,0x7, 0xfe,0x74,0x1, 0xa8, +0x6, 0x8, 0x80,0x2, 0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x12,0x1, 0xc5,0x5, 0x25,0xe5, +0x25,0xc3,0x94,0x18,0x50,0x2, 0xc1,0xbb,0x5, 0x24,0xe5,0x24,0xc3,0x94,0xe, 0x50, +0x3, 0x2, 0x4e,0xb8,0x22,0x12,0x17,0xeb,0xe4,0xf5,0x2b,0xf5,0x2c,0x12,0x15,0xfb, +0x12,0x17,0xe5,0x60,0x8, 0x90,0x0, 0x2e,0x12,0x1, 0x65,0x60,0x3, 0x7f,0x0, 0x22, +0x12,0x1, 0x4c,0xc3,0x13,0xf5,0x28,0x12,0x2b,0x2f,0xc3,0x13,0xf5,0x29,0xe4,0xf5, +0x2a,0xf5,0x27,0x12,0x16,0x23,0x12,0x14,0x4c,0x12,0x0, 0x6, 0xd3,0xef,0x94,0x14, +0xee,0x64,0x80,0x94,0x80,0x40,0x2, 0x5, 0x2a,0x31,0x41,0x40,0xe6,0xe5,0x2a,0xd3, +0x94,0xa, 0x40,0x2, 0x31,0x49,0xe4,0xf5,0x2a,0xe5,0x28,0xd3,0x94,0x0, 0x40,0x32, +0xe4,0xf5,0x27,0x12,0x16,0x23,0x12,0x14,0x4c,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, +0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0x60,0x31,0x64,0x12,0x16,0x23,0x12,0x14,0x57, +0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0x12,0x2e,0xbe,0x40,0x2, 0x5, 0x2a,0x31,0x41, +0x40,0xd1,0xe5,0x2a,0xd3,0x94,0xa, 0x40,0x2, 0x31,0x49,0xe4,0xf5,0x2a,0xe5,0x28, +0xc3,0x94,0x18,0x50,0x32,0xe4,0xf5,0x27,0x12,0x16,0x23,0x12,0x14,0x4c,0x12,0x0, +0x6, 0xc0,0x6, 0xc0,0x7, 0xe5,0x28,0x75,0xf0,0x20,0xa4,0x24,0xa0,0x31,0x64,0x12, +0x16,0x23,0x12,0x14,0x57,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0x12,0x2e,0xbe,0x40, +0x2, 0x5, 0x2a,0x31,0x41,0x40,0xd1,0xe5,0x2a,0xd3,0x94,0xa, 0x40,0x2, 0x31,0x49, +0xe5,0x29,0xd3,0x94,0x0, 0x40,0x22,0xe5,0x28,0x75,0xf0,0x20,0x12,0x1b,0xe2,0xe5, +0x29,0x75,0xf0,0x2, 0xa4,0x24,0x7e,0xff,0xe5,0xf0,0x34,0x3, 0xfe,0x12,0x2e,0xd6, +0x12,0x2, 0x8c,0x31,0x6d,0x50,0x2, 0x31,0x77,0xe5,0x29,0x24,0x1, 0xff,0xe4,0x33, +0xfe,0xc3,0xef,0x94,0x19,0xee,0x64,0x80,0x94,0x80,0x50,0x22,0xe5,0x28,0x75,0xf0, 0x20,0x12,0x1b,0xe2,0xe5,0x29,0x75,0xf0,0x2, 0xa4,0x24,0x82,0xff,0xe5,0xf0,0x34, -0x3, 0xfe,0x12,0x2e,0xd6,0x31,0x76,0x50,0x2, 0x31,0x6a,0xaf,0x2c,0x22,0x5, 0x27, -0xe5,0x27,0xc3,0x94,0xe, 0x22,0xe5,0x2a,0x24,0xf6,0xff,0xe4,0x34,0xff,0xfe,0x7c, -0x0, 0x7d,0xa, 0x12,0x1, 0xf9,0xef,0x25,0x2c,0xf5,0x2c,0xee,0x35,0x2b,0xf5,0x2b, -0x22,0xf5,0x82,0x74,0x3, 0x35,0xf0,0xf5,0x83,0x22,0x74,0xa, 0x25,0x2c,0xf5,0x2c, -0xe4,0x35,0x2b,0xf5,0x2b,0x22,0x12,0x2, 0x8c,0xc3,0x94,0xce,0xe5,0xf0,0x64,0x80, -0x94,0x7f,0x22,0x12,0x17,0xeb,0x90,0x0, 0x2f,0x51,0xe, 0x30,0xe0,0x3a,0x12,0x16, +0x3, 0xfe,0x12,0x2e,0xd6,0x12,0x2, 0x8c,0x31,0x6d,0x50,0x2, 0x31,0x77,0xaf,0x2c, +0x22,0x5, 0x27,0xe5,0x27,0xc3,0x94,0xe, 0x22,0xe5,0x2a,0x24,0xf6,0xff,0xe4,0x34, +0xff,0xfe,0x7c,0x0, 0x7d,0xa, 0x12,0x1, 0xf9,0xef,0x25,0x2c,0xf5,0x2c,0xee,0x35, +0x2b,0xf5,0x2b,0x22,0xf5,0x82,0x74,0x3, 0x35,0xf0,0xf5,0x83,0x22,0xc3,0x94,0xce, +0xe5,0xf0,0x64,0x80,0x94,0x7f,0x22,0x74,0xa, 0x25,0x2c,0xf5,0x2c,0xe4,0x35,0x2b, +0xf5,0x2b,0x22,0x12,0x17,0xeb,0x90,0x0, 0x2f,0x51,0xe, 0x30,0xe0,0x3a,0x12,0x16, 0x23,0x90,0x0, 0x4d,0x12,0x2, 0xb7,0xc3,0x94,0x3c,0xe5,0xf0,0x94,0x0, 0x50,0xc, 0x90,0x0, 0x4d,0xe4,0x75,0xf0,0x1, 0x12,0x2, 0xef,0x80,0x1c,0x12,0x15,0xfb,0x12, 0x3e,0xc5,0x85,0x24,0x35,0x12,0x3f,0x94,0x12,0x14,0x13,0x12,0x2d,0xf1,0x90,0xa, @@ -1681,4 +1681,4 @@ 0xff,0x74,0xff,0x3e,0xfe,0x22,0xe0,0xfc,0xa3,0xe0,0xd3,0x9f,0xec,0x22,0xee,0xf0, 0xa3,0xef,0xf0,0x5, 0x2c,0x22,0xff,0xab,0x29,0xe5,0x2b,0x24,0x1c,0x22,0x74,0x32, 0x25,0x2a,0xf8,0x76,0x1, 0x22,0xf9,0xe4,0x35,0x22,0xfa,0xe5,0x2b,0x22,0xc3,0xef, -0x94,0x3, 0xee,0x94,0x0, 0x22,0x69,0x36,0x96,0xc9,0x9, 0xf6,0x14,0xeb, \ No newline at end of file +0x94,0x3, 0xee,0x94,0x0, 0x22,0x69,0x36,0x96,0xc9,0x7c,0x83,0x15,0xea, \ No newline at end of file diff --git a/drivers/input/touchscreen/gt819.c b/drivers/input/touchscreen/gt819.c index 0705c6c333a6..109be9dffd6d 100755 --- a/drivers/input/touchscreen/gt819.c +++ b/drivers/input/touchscreen/gt819.c @@ -602,7 +602,22 @@ static int gt819_remove(struct i2c_client *client) static int gt819_init_panel(struct goodix_ts_data *ts) { int ret,I2cDelay; + int len = sizeof(config_info)-1; uint8_t rd_cfg_buf[10]; + struct goodix_platform_data *pdata = ts->client->dev.platform_data; + + ret = gt819_set_regs(ts->client, 101, &config_info[1], len); + if(ret < 0) + { + pdata->platform_sleep(); + msleep(10); + pdata->platform_wakeup(); + msleep(100); + printk("First IIC request failed,retry!\n"); + ret = gt819_set_regs(ts->client, 101, &config_info[1], len); + if(ret<0) + return ret; + } ret = gt819_read_regs(ts->client, 101, rd_cfg_buf, 10); if (ret < 0) @@ -650,7 +665,7 @@ static int gt819_probe(struct i2c_client *client, const struct i2c_device_id *id { int ret = 0; char version[17]; - char version_base[17]={"GT81XNI_1R05_18G"}; + char version_base[17]={"GT81XNI_1R05_18Q"}; struct goodix_ts_data *ts; struct goodix_platform_data *pdata = client->dev.platform_data; const char irq_table[4] = {IRQ_TYPE_EDGE_RISING, diff --git a/drivers/input/touchscreen/gt819.cfg b/drivers/input/touchscreen/gt819.cfg index 63031433e77b..1ca306ffc217 100755 --- a/drivers/input/touchscreen/gt819.cfg +++ b/drivers/input/touchscreen/gt819.cfg @@ -1 +1 @@ -0x65,0x02,0x03,0x20,0x01,0xE0,0x05,0xA1,0x21,0x00,0x0F,0x0F,0x02,0x10,0x10,0x00,0x00,0x38,0x00,0x00,0x10,0x10,0x10,0x00,0x17,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0xFF,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0xFF,0xFF,0xFF,0x00,0x00,0x28,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40 \ No newline at end of file +0x65,0x02,0x03,0x20,0x01,0xE0,0x05,0xA1,0x21,0x00,0x0F,0x0F,0x20,0x10,0x10,0x00,0x00,0x20,0x00,0x00,0x10,0x10,0x10,0x00,0x37,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0xFF,0xFF,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0xFF,0xFF,0xFF,0x00,0x00,0x46,0x78,0x2E,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x02,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20 \ No newline at end of file diff --git a/drivers/input/touchscreen/gt819.i b/drivers/input/touchscreen/gt819.i deleted file mode 100755 index 1cc2dd331b21..000000000000 --- a/drivers/input/touchscreen/gt819.i +++ /dev/null @@ -1,3312 +0,0 @@ - 0x20, 0x1F, 0x00, 0x20, 0x65, 0x02, 0x00, 0x00, 0x8B, 0x02, 0x00, 0x00, 0x8D, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x02, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, - 0x4D, 0x0C, 0x00, 0x00, 0xC1, 0xB1, 0x00, 0x00, 0x85, 0x3F, 0x00, 0x00, 0xA9, 0x3F, 0x00, 0x00, - 0x79, 0x47, 0x00, 0x00, 0xB5, 0x47, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, - 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, - 0xE1, 0xA4, 0x00, 0x00, 0x01, 0xA5, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, - 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x39, 0x60, 0x00, 0x00, - 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x4D, 0xA5, 0x00, 0x00, - 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, - 0xA1, 0x7D, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, - 0x00, 0xF0, 0x02, 0xF8, 0x00, 0xF0, 0x32, 0xF8, 0x0C, 0xA0, 0x30, 0xC8, 0x08, 0x38, 0x24, 0x18, - 0x2D, 0x18, 0xA2, 0x46, 0x67, 0x1E, 0xAB, 0x46, 0x54, 0x46, 0x5D, 0x46, 0xAC, 0x42, 0x01, 0xD1, - 0x00, 0xF0, 0x24, 0xF8, 0x7E, 0x46, 0x0F, 0x3E, 0x0F, 0xCC, 0xB6, 0x46, 0x01, 0x26, 0x33, 0x42, - 0x00, 0xD0, 0xFB, 0x1A, 0xA2, 0x46, 0xAB, 0x46, 0x33, 0x43, 0x18, 0x47, 0x04, 0xCD, 0x00, 0x00, - 0x24, 0xCD, 0x00, 0x00, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x10, 0x3A, 0x01, 0xD3, - 0x78, 0xC1, 0xFB, 0xD8, 0x52, 0x07, 0x00, 0xD3, 0x30, 0xC1, 0x00, 0xD5, 0x0B, 0x60, 0x70, 0x47, - 0x1F, 0xB5, 0xC0, 0x46, 0xC0, 0x46, 0x1F, 0xBD, 0x10, 0xB5, 0x10, 0xBD, 0x00, 0xF0, 0x84, 0xF9, - 0x11, 0x46, 0xFF, 0xF7, 0xF5, 0xFF, 0x0B, 0xF0, 0xB7, 0xFB, 0x00, 0xF0, 0x9C, 0xF9, 0xFF, 0xF7, - 0xF3, 0xFF, 0x00, 0xF0, 0xA3, 0xF9, 0x00, 0x00, 0xF0, 0xB5, 0x24, 0x4F, 0x3F, 0x78, 0x03, 0x00, - 0x0C, 0x00, 0x50, 0x20, 0x00, 0x04, 0x40, 0x30, 0x00, 0x02, 0x08, 0x30, 0x00, 0x21, 0x09, 0x02, - 0x80, 0x31, 0x09, 0x18, 0x00, 0x22, 0x12, 0x02, 0x80, 0x32, 0x12, 0x18, 0x01, 0x25, 0x6D, 0x02, - 0x0E, 0x68, 0xAE, 0x43, 0x0E, 0x60, 0x80, 0x20, 0x01, 0x25, 0xAD, 0x02, 0x0E, 0x68, 0x03, 0x42, - 0x01, 0xD0, 0x2E, 0x43, 0x00, 0xE0, 0xAE, 0x43, 0x0E, 0x60, 0x01, 0x25, 0xED, 0x02, 0x16, 0x68, - 0xAE, 0x43, 0x16, 0x60, 0x01, 0x25, 0x6D, 0x02, 0x0E, 0x68, 0x2E, 0x43, 0x0E, 0x60, 0x01, 0x25, - 0x2D, 0x03, 0x16, 0x68, 0x04, 0x42, 0x01, 0xD0, 0x2E, 0x43, 0x00, 0xE0, 0xAE, 0x43, 0x16, 0x60, - 0x3E, 0x00, 0x76, 0x1E, 0xFD, 0xD1, 0x00, 0xBF, 0x01, 0x25, 0xED, 0x02, 0x16, 0x68, 0x2E, 0x43, - 0x16, 0x60, 0x01, 0x25, 0x6D, 0x02, 0x0E, 0x68, 0xAE, 0x43, 0x0E, 0x60, 0x07, 0x26, 0x76, 0x1E, - 0xFD, 0xD1, 0x40, 0x08, 0x00, 0x28, 0xCF, 0xD1, 0xF0, 0xBD, 0x00, 0xBF, 0xDD, 0x00, 0x00, 0x20, - 0xF0, 0xB5, 0x03, 0xB4, 0x1E, 0x4F, 0x3F, 0x78, 0x01, 0x37, 0x50, 0x20, 0x00, 0x04, 0x40, 0x30, - 0x00, 0x02, 0x00, 0x21, 0x09, 0x02, 0x80, 0x31, 0x09, 0x18, 0x00, 0x22, 0x12, 0x02, 0x80, 0x32, - 0x12, 0x18, 0x00, 0x20, 0x00, 0x23, 0x00, 0x24, 0x5B, 0x00, 0x64, 0x00, 0x01, 0x25, 0x6D, 0x02, - 0x8E, 0x68, 0x2E, 0x43, 0x8E, 0x60, 0x01, 0x25, 0xED, 0x02, 0x96, 0x68, 0x2E, 0x43, 0x96, 0x60, - 0x3E, 0x00, 0x76, 0x1E, 0xFD, 0xD1, 0x0E, 0x69, 0x76, 0x05, 0xF6, 0x0F, 0x33, 0x43, 0x16, 0x69, - 0xF6, 0x04, 0xF6, 0x0F, 0x34, 0x43, 0x01, 0x25, 0x6D, 0x02, 0x8E, 0x68, 0xAE, 0x43, 0x8E, 0x60, - 0x01, 0x25, 0xED, 0x02, 0x96, 0x68, 0xAE, 0x43, 0x96, 0x60, 0x3E, 0x00, 0x76, 0x1E, 0xFD, 0xD1, - 0x40, 0x1C, 0x08, 0x28, 0xD8, 0xD1, 0x03, 0xBC, 0x03, 0x70, 0x0C, 0x70, 0xF0, 0xBD, 0x00, 0xBF, - 0xDD, 0x00, 0x00, 0x20, 0x0F, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x49, 0x01, 0x60, 0x10, 0x49, - 0x01, 0x60, 0x10, 0x4A, 0x10, 0x49, 0x11, 0x60, 0x10, 0x4A, 0x11, 0x49, 0x11, 0x60, 0x00, 0x21, - 0x01, 0x60, 0x10, 0x48, 0x80, 0x47, 0x10, 0x48, 0x00, 0x47, 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, - 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, 0x00, 0x00, 0x0C, 0x48, 0x0D, 0x49, 0x0B, 0x4A, 0x0D, 0x4B, - 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x59, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x88, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x50, 0xA5, 0x5A, 0x00, 0x00, 0x18, 0xC0, 0x00, 0x50, - 0x80, 0x00, 0x00, 0x00, 0x2D, 0xA4, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x20, 0x1B, 0x00, 0x20, - 0x20, 0x1F, 0x00, 0x20, 0x20, 0x1B, 0x00, 0x20, 0x00, 0x22, 0x03, 0x09, 0x8B, 0x42, 0x2C, 0xD3, - 0x03, 0x0A, 0x8B, 0x42, 0x11, 0xD3, 0x00, 0x23, 0x9C, 0x46, 0x4E, 0xE0, 0x03, 0x46, 0x0B, 0x43, - 0x3C, 0xD4, 0x00, 0x22, 0x43, 0x08, 0x8B, 0x42, 0x31, 0xD3, 0x03, 0x09, 0x8B, 0x42, 0x1C, 0xD3, - 0x03, 0x0A, 0x8B, 0x42, 0x01, 0xD3, 0x94, 0x46, 0x3F, 0xE0, 0xC3, 0x09, 0x8B, 0x42, 0x01, 0xD3, - 0xCB, 0x01, 0xC0, 0x1A, 0x52, 0x41, 0x83, 0x09, 0x8B, 0x42, 0x01, 0xD3, 0x8B, 0x01, 0xC0, 0x1A, - 0x52, 0x41, 0x43, 0x09, 0x8B, 0x42, 0x01, 0xD3, 0x4B, 0x01, 0xC0, 0x1A, 0x52, 0x41, 0x03, 0x09, - 0x8B, 0x42, 0x01, 0xD3, 0x0B, 0x01, 0xC0, 0x1A, 0x52, 0x41, 0xC3, 0x08, 0x8B, 0x42, 0x01, 0xD3, - 0xCB, 0x00, 0xC0, 0x1A, 0x52, 0x41, 0x83, 0x08, 0x8B, 0x42, 0x01, 0xD3, 0x8B, 0x00, 0xC0, 0x1A, - 0x52, 0x41, 0x43, 0x08, 0x8B, 0x42, 0x01, 0xD3, 0x4B, 0x00, 0xC0, 0x1A, 0x52, 0x41, 0x41, 0x1A, - 0x00, 0xD2, 0x01, 0x46, 0x52, 0x41, 0x10, 0x46, 0x70, 0x47, 0x5D, 0xE0, 0xCA, 0x0F, 0x00, 0xD0, - 0x49, 0x42, 0x03, 0x10, 0x00, 0xD3, 0x40, 0x42, 0x53, 0x40, 0x00, 0x22, 0x9C, 0x46, 0x03, 0x09, - 0x8B, 0x42, 0x2D, 0xD3, 0x03, 0x0A, 0x8B, 0x42, 0x12, 0xD3, 0xFC, 0x22, 0x89, 0x01, 0x12, 0xBA, - 0x03, 0x0A, 0x8B, 0x42, 0x0C, 0xD3, 0x89, 0x01, 0x92, 0x11, 0x8B, 0x42, 0x08, 0xD3, 0x89, 0x01, - 0x92, 0x11, 0x8B, 0x42, 0x04, 0xD3, 0x89, 0x01, 0x3A, 0xD0, 0x92, 0x11, 0x00, 0xE0, 0x89, 0x09, - 0xC3, 0x09, 0x8B, 0x42, 0x01, 0xD3, 0xCB, 0x01, 0xC0, 0x1A, 0x52, 0x41, 0x83, 0x09, 0x8B, 0x42, - 0x01, 0xD3, 0x8B, 0x01, 0xC0, 0x1A, 0x52, 0x41, 0x43, 0x09, 0x8B, 0x42, 0x01, 0xD3, 0x4B, 0x01, - 0xC0, 0x1A, 0x52, 0x41, 0x03, 0x09, 0x8B, 0x42, 0x01, 0xD3, 0x0B, 0x01, 0xC0, 0x1A, 0x52, 0x41, - 0xC3, 0x08, 0x8B, 0x42, 0x01, 0xD3, 0xCB, 0x00, 0xC0, 0x1A, 0x52, 0x41, 0x83, 0x08, 0x8B, 0x42, - 0x01, 0xD3, 0x8B, 0x00, 0xC0, 0x1A, 0x52, 0x41, 0xD9, 0xD2, 0x43, 0x08, 0x8B, 0x42, 0x01, 0xD3, - 0x4B, 0x00, 0xC0, 0x1A, 0x52, 0x41, 0x41, 0x1A, 0x00, 0xD2, 0x01, 0x46, 0x63, 0x46, 0x52, 0x41, - 0x5B, 0x10, 0x10, 0x46, 0x01, 0xD3, 0x40, 0x42, 0x00, 0x2B, 0x00, 0xD5, 0x49, 0x42, 0x70, 0x47, - 0x63, 0x46, 0x5B, 0x10, 0x00, 0xD3, 0x40, 0x42, 0x01, 0xB5, 0x00, 0x20, 0xC0, 0x46, 0xC0, 0x46, - 0x02, 0xBD, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, 0x75, 0x46, 0x00, 0xF0, 0x23, 0xF8, 0xAE, 0x46, - 0x05, 0x00, 0x69, 0x46, 0x53, 0x46, 0xC0, 0x08, 0xC0, 0x00, 0x85, 0x46, 0x18, 0xB0, 0x20, 0xB5, - 0xFF, 0xF7, 0x22, 0xFF, 0x60, 0xBC, 0x00, 0x27, 0x49, 0x08, 0xB6, 0x46, 0x00, 0x26, 0xC0, 0xC5, - 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0x40, 0x3D, - 0x49, 0x00, 0x8D, 0x46, 0x70, 0x47, 0x04, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0x20, 0x46, 0xFF, 0xF7, - 0x5E, 0xFE, 0x00, 0x00, 0x00, 0x48, 0x70, 0x47, 0xC0, 0x1A, 0x00, 0x20, 0x02, 0x48, 0x03, 0x49, - 0xAB, 0xBE, 0x70, 0x47, 0x0D, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, - 0x70, 0x47, 0x70, 0xB5, 0x8C, 0x18, 0x05, 0x78, 0x40, 0x1C, 0x6B, 0x07, 0x5B, 0x0F, 0x01, 0xD1, - 0x03, 0x78, 0x40, 0x1C, 0x2A, 0x11, 0x06, 0xD1, 0x02, 0x78, 0x40, 0x1C, 0x03, 0xE0, 0x06, 0x78, - 0x40, 0x1C, 0x0E, 0x70, 0x49, 0x1C, 0x5B, 0x1E, 0xF9, 0xD1, 0x2B, 0x07, 0x06, 0xD4, 0x00, 0x23, - 0x01, 0xE0, 0x0B, 0x70, 0x49, 0x1C, 0x52, 0x1E, 0xFB, 0xD5, 0x0A, 0xE0, 0x03, 0x78, 0x40, 0x1C, - 0xCB, 0x1A, 0x92, 0x1C, 0x03, 0xE0, 0x1D, 0x78, 0x5B, 0x1C, 0x0D, 0x70, 0x49, 0x1C, 0x52, 0x1E, - 0xF9, 0xD5, 0xA1, 0x42, 0xD7, 0xD3, 0x00, 0x20, 0x70, 0xBD, 0x00, 0x28, 0x00, 0xDA, 0x40, 0x42, - 0x70, 0x47, 0x00, 0x00, 0xFE, 0xB5, 0x00, 0x20, 0xFF, 0x4E, 0x02, 0x90, 0x30, 0x77, 0x70, 0x71, - 0xB1, 0x78, 0x35, 0x46, 0x49, 0x08, 0x49, 0x00, 0x04, 0x46, 0xB1, 0x70, 0x80, 0x35, 0xA9, 0x6A, - 0x09, 0x5C, 0x00, 0x29, 0x18, 0xD0, 0x31, 0x7F, 0x49, 0x1C, 0x31, 0x77, 0x2A, 0x6A, 0x41, 0x00, - 0xEB, 0x6A, 0x52, 0x5A, 0x5A, 0x52, 0x6A, 0x6A, 0x2B, 0x6B, 0x52, 0x5A, 0x5A, 0x52, 0xAA, 0x6A, - 0x6B, 0x6B, 0x12, 0x5C, 0x5A, 0x52, 0xAB, 0x6A, 0x00, 0x22, 0x1C, 0x54, 0x2B, 0x6A, 0xD2, 0x43, - 0x5A, 0x52, 0x6B, 0x6A, 0x5A, 0x52, 0x08, 0xE0, 0x00, 0x22, 0xD2, 0x43, 0xEB, 0x6A, 0x41, 0x00, - 0x5A, 0x52, 0x2B, 0x6B, 0x5A, 0x52, 0x6A, 0x6B, 0x54, 0x52, 0x40, 0x1C, 0x0A, 0x28, 0xD6, 0xDB, - 0x1C, 0x21, 0x71, 0x56, 0x00, 0x29, 0x14, 0xD1, 0xE4, 0x4F, 0x3D, 0x46, 0x3C, 0x35, 0xE3, 0x4B, - 0x00, 0x22, 0x48, 0x00, 0xD2, 0x43, 0x28, 0x33, 0x1A, 0x52, 0x2A, 0x52, 0x3A, 0x52, 0x14, 0x3B, - 0x1A, 0x52, 0x1A, 0x46, 0x3C, 0x32, 0x49, 0x1C, 0x14, 0x52, 0x0A, 0x29, 0xEF, 0xDB, 0xF4, 0x76, - 0xFE, 0xBD, 0x1B, 0x20, 0x30, 0x56, 0x81, 0x42, 0x23, 0xD0, 0xD7, 0x4A, 0x20, 0x32, 0x52, 0x78, - 0x00, 0x2A, 0x1E, 0xD0, 0xF2, 0x78, 0x52, 0x1C, 0xD2, 0xB2, 0xF2, 0x70, 0xF3, 0x7D, 0x5F, 0x00, - 0xDB, 0x19, 0x9A, 0x42, 0x15, 0xD2, 0xD1, 0x4C, 0x00, 0x20, 0x3C, 0x34, 0x27, 0x46, 0x14, 0x37, - 0xCE, 0x4A, 0x41, 0x00, 0x28, 0x32, 0x2B, 0x6A, 0x52, 0x5A, 0x5A, 0x52, 0x6B, 0x6A, 0x62, 0x5A, - 0x5A, 0x52, 0x03, 0x46, 0xAA, 0x6A, 0x79, 0x5A, 0x40, 0x1C, 0x0A, 0x28, 0xD1, 0x54, 0xEF, 0xDB, - 0x1D, 0xE0, 0x81, 0x42, 0x20, 0xDA, 0xF1, 0x78, 0x49, 0x1C, 0xC9, 0xB2, 0xF1, 0x70, 0xF2, 0x7D, - 0x91, 0x42, 0x19, 0xD2, 0xC1, 0x4C, 0x00, 0x20, 0x3C, 0x34, 0x27, 0x46, 0x14, 0x37, 0xBF, 0x4A, - 0x41, 0x00, 0x28, 0x32, 0x2B, 0x6A, 0x52, 0x5A, 0x5A, 0x52, 0x6B, 0x6A, 0x62, 0x5A, 0x5A, 0x52, - 0x03, 0x46, 0xAA, 0x6A, 0x79, 0x5A, 0x40, 0x1C, 0x0A, 0x28, 0xD1, 0x54, 0xEF, 0xDB, 0xB0, 0x78, - 0x01, 0x21, 0x08, 0x43, 0xB0, 0x70, 0xFE, 0xBD, 0xB3, 0x49, 0x00, 0x22, 0x0C, 0x46, 0x40, 0x34, - 0xCA, 0x70, 0x00, 0x28, 0x49, 0xD1, 0x00, 0x21, 0x41, 0xE0, 0x01, 0x20, 0xE3, 0x8B, 0x88, 0x40, - 0x18, 0x42, 0x38, 0xD0, 0xAC, 0x4E, 0x1B, 0x23, 0xEF, 0x6A, 0xF3, 0x56, 0xAB, 0x4E, 0x48, 0x00, - 0x3A, 0x5A, 0x28, 0x36, 0x5B, 0x00, 0xF2, 0x52, 0x2A, 0x6B, 0xBC, 0x46, 0x14, 0x36, 0x17, 0x5A, - 0xF7, 0x52, 0xA6, 0x4F, 0x6E, 0x6B, 0x50, 0x37, 0x36, 0x5A, 0xFE, 0x52, 0x67, 0x46, 0x3E, 0x5A, - 0xA2, 0x4F, 0xFE, 0x52, 0x3E, 0x46, 0x12, 0x5A, 0x14, 0x36, 0xF2, 0x52, 0x67, 0x46, 0x3A, 0x5A, - 0x2E, 0x6A, 0x9D, 0x4F, 0xF2, 0x52, 0x1B, 0x23, 0xFB, 0x56, 0x2A, 0x6B, 0x6E, 0x6A, 0x12, 0x5A, - 0x5B, 0x00, 0xF2, 0x52, 0x6E, 0x6B, 0x3B, 0x46, 0x30, 0x5A, 0x1B, 0x26, 0x9E, 0x57, 0xAA, 0x6A, - 0x01, 0x23, 0x90, 0x55, 0xBA, 0x78, 0x38, 0x46, 0x1A, 0x43, 0x82, 0x70, 0xC0, 0x7E, 0x3A, 0x46, - 0x40, 0x1C, 0xD0, 0x76, 0x02, 0xE0, 0x50, 0x79, 0x40, 0x1C, 0x50, 0x71, 0x49, 0x1C, 0x8E, 0x4A, - 0x1C, 0x20, 0x10, 0x56, 0x81, 0x42, 0xB8, 0xDB, 0xFE, 0xBD, 0x04, 0xF0, 0x8B, 0xFB, 0x00, 0x26, - 0xA8, 0x6B, 0x80, 0x57, 0x00, 0x28, 0x1E, 0xDB, 0x2A, 0x6C, 0xB1, 0x00, 0x51, 0x58, 0x2B, 0x68, - 0x99, 0x42, 0x18, 0xD9, 0x85, 0x49, 0x77, 0x00, 0x14, 0x31, 0xCA, 0x5F, 0x14, 0x39, 0xC9, 0x5F, - 0x00, 0x91, 0x82, 0x49, 0x01, 0x92, 0x3C, 0x31, 0xCB, 0x5F, 0x14, 0x39, 0xCA, 0x5F, 0x29, 0x6B, - 0x40, 0x00, 0xEF, 0x6A, 0x09, 0x5E, 0x38, 0x5E, 0x09, 0xF0, 0xDA, 0xF9, 0x01, 0x28, 0x02, 0xD1, - 0xA9, 0x6B, 0xFF, 0x20, 0x88, 0x55, 0x79, 0x48, 0x72, 0x00, 0x28, 0x30, 0x77, 0x49, 0x80, 0x5E, - 0x88, 0x52, 0x76, 0x4B, 0x3C, 0x31, 0x14, 0x33, 0x89, 0x5A, 0x99, 0x52, 0x40, 0x1C, 0x32, 0xD0, - 0xAF, 0x6B, 0xB8, 0x57, 0x00, 0x28, 0x2E, 0xDB, 0xEB, 0x6A, 0x40, 0x00, 0x6F, 0x49, 0x18, 0x5A, - 0x28, 0x31, 0x88, 0x52, 0xB9, 0x57, 0x6D, 0x4B, 0x2F, 0x6B, 0x49, 0x00, 0x3C, 0x33, 0x79, 0x5A, - 0x99, 0x52, 0x29, 0x6A, 0x88, 0x52, 0x69, 0x6A, 0x98, 0x5A, 0x88, 0x52, 0xA8, 0x6B, 0x6B, 0x6B, - 0x80, 0x57, 0xA9, 0x6A, 0x40, 0x00, 0x18, 0x5A, 0x64, 0x4B, 0xC0, 0xB2, 0x50, 0x33, 0x88, 0x55, - 0x98, 0x52, 0xA9, 0x6B, 0x00, 0x20, 0x89, 0x57, 0xEA, 0x6A, 0xC0, 0x43, 0x49, 0x00, 0x50, 0x52, - 0xA8, 0x6B, 0x69, 0x6B, 0x80, 0x57, 0x00, 0x23, 0x42, 0x00, 0x5B, 0x48, 0x8B, 0x52, 0x81, 0x78, - 0x01, 0x22, 0x11, 0x43, 0x81, 0x70, 0x76, 0x1C, 0x0A, 0x2E, 0x99, 0xDB, 0x00, 0x20, 0xA0, 0x82, - 0x20, 0x83, 0x69, 0x6B, 0x42, 0x00, 0x89, 0x5E, 0x00, 0x29, 0x45, 0xDD, 0x01, 0x21, 0xE3, 0x8B, - 0x81, 0x40, 0x19, 0x42, 0x39, 0xD0, 0x52, 0x4E, 0x2F, 0x6C, 0x31, 0xE0, 0x8B, 0x00, 0xFB, 0x58, - 0xB3, 0x42, 0x2B, 0xD1, 0x01, 0x21, 0x02, 0x91, 0x14, 0x21, 0x61, 0x5E, 0xEB, 0x6A, 0x4B, 0x4E, - 0x9B, 0x5A, 0x28, 0x36, 0x49, 0x00, 0x73, 0x52, 0x2E, 0x6B, 0x48, 0x4F, 0xB6, 0x5A, 0x3C, 0x37, - 0x7E, 0x52, 0x3C, 0x3F, 0x7B, 0x52, 0x14, 0x37, 0x7E, 0x52, 0x2E, 0x6A, 0x28, 0x37, 0x73, 0x52, - 0x14, 0x21, 0x61, 0x5E, 0x6E, 0x6A, 0x49, 0x00, 0x7B, 0x5A, 0x73, 0x52, 0x6B, 0x6B, 0xA9, 0x6A, - 0x9A, 0x5A, 0x14, 0x23, 0xE3, 0x5E, 0xD2, 0xB2, 0xCA, 0x54, 0x14, 0x21, 0x61, 0x5E, 0x3E, 0x46, - 0x4B, 0x00, 0x14, 0x36, 0xF2, 0x52, 0x49, 0x1C, 0xA1, 0x82, 0x0A, 0xE0, 0x49, 0x1C, 0xA1, 0x82, - 0x14, 0x21, 0x61, 0x5E, 0x0A, 0x29, 0xC9, 0xDB, 0x03, 0xE0, 0x33, 0x49, 0x4A, 0x79, 0x52, 0x1C, - 0x4A, 0x71, 0x21, 0x8B, 0x49, 0x1C, 0x21, 0x83, 0x40, 0x1C, 0x0A, 0x28, 0xB1, 0xDB, 0x02, 0x98, - 0x01, 0x28, 0x02, 0xD1, 0x2C, 0x48, 0x00, 0x7F, 0x02, 0x90, 0x00, 0x27, 0x2B, 0x4E, 0xA7, 0x82, - 0x0A, 0x3E, 0x02, 0x98, 0x00, 0x28, 0x2C, 0xD0, 0x14, 0x20, 0x20, 0x5E, 0xA9, 0x6A, 0x09, 0x5C, - 0x00, 0x29, 0x29, 0xD1, 0x25, 0x4A, 0x06, 0x21, 0x41, 0x43, 0x64, 0x32, 0x51, 0x5E, 0x4A, 0x1C, - 0x22, 0xD0, 0x02, 0x9A, 0x52, 0x1E, 0xD2, 0xB2, 0x02, 0x92, 0x32, 0x5C, 0x01, 0x2A, 0x01, 0xD1, - 0x37, 0x54, 0x2A, 0xE0, 0x01, 0x22, 0x32, 0x54, 0x2A, 0x6A, 0x40, 0x00, 0x11, 0x52, 0x14, 0x20, - 0x20, 0x5E, 0x06, 0x23, 0x02, 0x46, 0x19, 0x49, 0x5A, 0x43, 0xA0, 0x31, 0x40, 0x00, 0x8A, 0x5A, - 0x6B, 0x6A, 0xBE, 0x39, 0x1A, 0x52, 0x14, 0x20, 0x20, 0x5E, 0xAA, 0x6A, 0x09, 0x5C, 0x11, 0x54, - 0x13, 0xE0, 0x14, 0x21, 0x61, 0x5E, 0x77, 0x54, 0x14, 0x21, 0x61, 0x5E, 0x0F, 0x4B, 0x2A, 0x6A, - 0x48, 0x00, 0x28, 0x33, 0x12, 0x5A, 0x1A, 0x52, 0x6A, 0x6A, 0x14, 0x33, 0x12, 0x5A, 0x1A, 0x52, - 0xAA, 0x6A, 0x52, 0x5C, 0x19, 0x46, 0x14, 0x31, 0x0A, 0x52, 0xA0, 0x8A, 0x40, 0x1C, 0x00, 0xB2, - 0xA0, 0x82, 0x0A, 0x28, 0xB5, 0xDB, 0x04, 0x49, 0x08, 0x7F, 0x4A, 0x79, 0x80, 0x1A, 0x40, 0xB2, - 0xC8, 0x76, 0x00, 0x28, 0x06, 0xE0, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0xBA, 0x05, 0x00, 0x20, - 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xDC, 0xDF, 0xE6, 0x8A, 0x78, 0x01, 0x20, 0x02, 0x43, 0x8A, 0x70, - 0xFE, 0xBD, 0x70, 0xB5, 0x00, 0x26, 0x00, 0x24, 0x20, 0x26, 0x10, 0xE0, 0x30, 0x46, 0x04, 0xF0, - 0x15, 0xFD, 0x00, 0x28, 0x06, 0xD0, 0x00, 0x2C, 0x02, 0xD1, 0x34, 0x46, 0x35, 0x46, 0x04, 0xE0, - 0x35, 0x46, 0x02, 0xE0, 0x00, 0x2C, 0x00, 0xD0, 0x03, 0xE0, 0x30, 0x1D, 0xC6, 0xB2, 0x50, 0x2E, - 0xEC, 0xDB, 0x00, 0xBF, 0x26, 0x46, 0x11, 0xE0, 0x30, 0x46, 0x04, 0xF0, 0xFF, 0xFC, 0x00, 0x28, - 0x01, 0xD0, 0x34, 0x46, 0x08, 0xE0, 0x71, 0x1C, 0xC8, 0xB2, 0x04, 0xF0, 0xF7, 0xFC, 0x00, 0x28, - 0x01, 0xD0, 0x70, 0x1C, 0xC4, 0xB2, 0x03, 0xE0, 0xB0, 0x1E, 0xC6, 0xB2, 0x20, 0x2E, 0xEB, 0xDC, - 0x00, 0xBF, 0x2E, 0x46, 0x11, 0xE0, 0x30, 0x46, 0x04, 0xF0, 0xE8, 0xFC, 0x00, 0x28, 0x01, 0xD0, - 0x35, 0x46, 0x08, 0xE0, 0x71, 0x1E, 0xC8, 0xB2, 0x04, 0xF0, 0xE0, 0xFC, 0x00, 0x28, 0x01, 0xD0, - 0x70, 0x1E, 0xC5, 0xB2, 0x03, 0xE0, 0xB0, 0x1C, 0xC6, 0xB2, 0x50, 0x2E, 0xEB, 0xDB, 0x00, 0xBF, - 0x00, 0x2C, 0x01, 0xD1, 0x00, 0x20, 0x70, 0xBD, 0x61, 0x19, 0x48, 0x1C, 0xC1, 0x0F, 0x09, 0x18, - 0xC9, 0x05, 0x0E, 0x0E, 0x30, 0x46, 0xF6, 0xE7, 0xF0, 0xB5, 0x87, 0xB0, 0x9D, 0x48, 0x06, 0x90, - 0x00, 0x7C, 0x00, 0x09, 0x7E, 0xD0, 0x9C, 0x48, 0x84, 0x7C, 0xA4, 0x1C, 0x65, 0x00, 0x60, 0x1C, - 0x01, 0x90, 0x06, 0x98, 0x00, 0x7C, 0xC0, 0x06, 0x41, 0xD5, 0x01, 0x9E, 0x96, 0x49, 0x70, 0x00, - 0x80, 0x31, 0x05, 0x90, 0xCB, 0x68, 0x00, 0x22, 0x1A, 0x52, 0x4A, 0x69, 0x02, 0x27, 0x97, 0x55, - 0xCF, 0x68, 0x02, 0x21, 0xC0, 0x19, 0x41, 0x5E, 0x24, 0x29, 0x03, 0xDD, 0x04, 0x22, 0x82, 0x5E, - 0x91, 0x42, 0x09, 0xDA, 0x32, 0x19, 0x52, 0x00, 0xBA, 0x5E, 0x24, 0x2A, 0x27, 0xDD, 0x73, 0x19, - 0x5B, 0x00, 0xFB, 0x5E, 0x9A, 0x42, 0x22, 0xDB, 0x32, 0x19, 0x52, 0x00, 0xBB, 0x5E, 0xD2, 0x19, - 0xC9, 0x18, 0x02, 0x23, 0xD3, 0x5E, 0x04, 0x22, 0x82, 0x5E, 0xC9, 0x1A, 0x88, 0x1A, 0x71, 0x19, - 0x49, 0x00, 0x79, 0x5E, 0x40, 0x1A, 0x80, 0x00, 0x03, 0x21, 0xFF, 0xF7, 0x4F, 0xFC, 0x32, 0x30, - 0x00, 0xB2, 0x00, 0x28, 0x00, 0xDA, 0x00, 0x20, 0x05, 0x99, 0x7B, 0x4A, 0x78, 0x52, 0x7A, 0x49, - 0x80, 0x32, 0x49, 0x7D, 0x88, 0x42, 0x02, 0xDD, 0x51, 0x69, 0x00, 0x20, 0x88, 0x55, 0x06, 0x98, - 0x00, 0x7C, 0x80, 0x06, 0x49, 0xD5, 0x74, 0x49, 0x01, 0x98, 0x89, 0x7C, 0x00, 0x22, 0x46, 0x18, - 0x76, 0x1E, 0x71, 0x49, 0x70, 0x00, 0x80, 0x31, 0x04, 0x90, 0xCB, 0x68, 0x02, 0x27, 0x1A, 0x52, - 0x4A, 0x69, 0x97, 0x55, 0xCF, 0x68, 0x1E, 0x21, 0xC0, 0x19, 0x20, 0x38, 0x41, 0x5E, 0x24, 0x29, - 0x03, 0xDD, 0x1C, 0x22, 0x82, 0x5E, 0x91, 0x42, 0x09, 0xDA, 0x32, 0x19, 0x52, 0x00, 0xBA, 0x5E, - 0x24, 0x2A, 0x2A, 0xDD, 0x73, 0x19, 0x5B, 0x00, 0xFB, 0x5E, 0x9A, 0x42, 0x25, 0xDD, 0x32, 0x19, - 0x52, 0x00, 0xBB, 0x5E, 0xD2, 0x19, 0xC9, 0x18, 0x20, 0x3A, 0x1E, 0x23, 0xD3, 0x5E, 0xC9, 0x1A, - 0x1C, 0x22, 0x00, 0xE0, 0xB4, 0xE0, 0x82, 0x5E, 0x88, 0x1A, 0x71, 0x19, 0x49, 0x00, 0x79, 0x5E, - 0x40, 0x1A, 0x80, 0x00, 0x03, 0x21, 0xFF, 0xF7, 0x01, 0xFC, 0x32, 0x30, 0x00, 0xB2, 0x00, 0x28, - 0x00, 0xDA, 0x00, 0x20, 0x04, 0x99, 0x54, 0x4A, 0x78, 0x52, 0x53, 0x49, 0x80, 0x32, 0x49, 0x7D, - 0x88, 0x42, 0x02, 0xDD, 0x51, 0x69, 0x00, 0x20, 0x88, 0x55, 0x06, 0x98, 0x00, 0x7C, 0x40, 0x06, - 0x46, 0xD5, 0x4D, 0x48, 0x01, 0x99, 0xC0, 0x7C, 0x00, 0x22, 0x40, 0x1E, 0x60, 0x43, 0x46, 0x18, - 0x49, 0x49, 0x70, 0x00, 0x80, 0x31, 0x03, 0x90, 0xCB, 0x68, 0x02, 0x27, 0x1A, 0x52, 0x4A, 0x69, - 0x97, 0x55, 0xCF, 0x68, 0x02, 0x21, 0xC0, 0x19, 0x41, 0x5E, 0x24, 0x29, 0x03, 0xDD, 0x04, 0x22, - 0x82, 0x5E, 0x91, 0x42, 0x09, 0xDA, 0x32, 0x1B, 0x52, 0x00, 0xBA, 0x5E, 0x24, 0x2A, 0x27, 0xDD, - 0x73, 0x1B, 0x5B, 0x00, 0xFB, 0x5E, 0x9A, 0x42, 0x22, 0xDB, 0x32, 0x1B, 0x52, 0x00, 0xBB, 0x5E, - 0xD2, 0x19, 0xC9, 0x18, 0x02, 0x23, 0xD3, 0x5E, 0x04, 0x22, 0x82, 0x5E, 0xC9, 0x1A, 0x88, 0x1A, - 0x71, 0x1B, 0x49, 0x00, 0x79, 0x5E, 0x40, 0x1A, 0x80, 0x00, 0x03, 0x21, 0xFF, 0xF7, 0xB6, 0xFB, - 0x32, 0x30, 0x00, 0xB2, 0x00, 0x28, 0x00, 0xDA, 0x00, 0x20, 0x03, 0x99, 0x2E, 0x4A, 0x78, 0x52, - 0x2D, 0x49, 0x80, 0x32, 0x49, 0x7D, 0x88, 0x42, 0x02, 0xDD, 0x51, 0x69, 0x00, 0x20, 0x88, 0x55, - 0x06, 0x98, 0x00, 0x7C, 0x00, 0x06, 0x4B, 0xD5, 0x27, 0x49, 0x01, 0x9A, 0xC8, 0x7C, 0x89, 0x7C, - 0x40, 0x1E, 0x60, 0x43, 0x80, 0x18, 0x49, 0x1E, 0x46, 0x18, 0x23, 0x49, 0x70, 0x00, 0x80, 0x31, - 0x02, 0x90, 0xCB, 0x68, 0x00, 0x22, 0x1A, 0x52, 0x4A, 0x69, 0x02, 0x27, 0x97, 0x55, 0xCF, 0x68, - 0x1E, 0x21, 0xC0, 0x19, 0x20, 0x38, 0x41, 0x5E, 0x24, 0x29, 0x03, 0xDD, 0x1C, 0x22, 0x82, 0x5E, - 0x91, 0x42, 0x09, 0xDA, 0x32, 0x1B, 0x52, 0x00, 0xBA, 0x5E, 0x24, 0x2A, 0x28, 0xDD, 0x73, 0x1B, - 0x5B, 0x00, 0xFB, 0x5E, 0x9A, 0x42, 0x23, 0xDB, 0x32, 0x1B, 0x52, 0x00, 0xBB, 0x5E, 0xD2, 0x19, - 0xC9, 0x18, 0x20, 0x3A, 0x1E, 0x23, 0xD3, 0x5E, 0x1C, 0x22, 0x82, 0x5E, 0xC9, 0x1A, 0x88, 0x1A, - 0x71, 0x1B, 0x49, 0x00, 0x79, 0x5E, 0x40, 0x1A, 0x80, 0x00, 0x03, 0x21, 0xFF, 0xF7, 0x66, 0xFB, - 0x32, 0x30, 0x00, 0xB2, 0x00, 0x28, 0x00, 0xDA, 0x00, 0x20, 0x02, 0x9A, 0x06, 0x49, 0xB8, 0x52, - 0x05, 0x4A, 0x80, 0x31, 0x52, 0x7D, 0x90, 0x42, 0x02, 0xDD, 0x49, 0x69, 0x00, 0x20, 0x88, 0x55, - 0x07, 0xB0, 0xF0, 0xBD, 0x1C, 0x04, 0x00, 0x20, 0x38, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x05, 0x20, - 0x00, 0x07, 0x80, 0x69, 0x10, 0x21, 0x88, 0x43, 0x10, 0x30, 0x05, 0x21, 0x09, 0x07, 0x88, 0x61, - 0x03, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, - 0x28, 0x01, 0x00, 0x20, 0xF7, 0xB5, 0x82, 0xB0, 0x04, 0x46, 0x0D, 0x46, 0x29, 0x46, 0x20, 0x46, - 0xFF, 0xF7, 0x2A, 0xFB, 0x00, 0x07, 0x00, 0x0F, 0x02, 0x28, 0x17, 0xD2, 0x68, 0x01, 0xA0, 0x42, - 0x14, 0xD2, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x49, 0x07, 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, - 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x09, 0x07, 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, 0x29, 0x46, - 0x20, 0x46, 0xFF, 0xF7, 0x11, 0xFB, 0x00, 0x09, 0x86, 0x1E, 0x4C, 0xE0, 0x04, 0x98, 0x00, 0x68, - 0x01, 0x21, 0x49, 0x07, 0x88, 0x43, 0x41, 0x18, 0x04, 0x98, 0x01, 0x60, 0x04, 0x98, 0x00, 0x68, - 0x01, 0x21, 0x09, 0x07, 0x88, 0x43, 0x40, 0x18, 0x04, 0x99, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, - 0xFF, 0xF7, 0xFA, 0xFA, 0x86, 0x1E, 0x21, 0x48, 0x86, 0x42, 0x34, 0xDD, 0x04, 0x98, 0x00, 0x68, - 0x01, 0x21, 0x49, 0x07, 0x88, 0x43, 0x41, 0x18, 0x04, 0x98, 0x01, 0x60, 0x04, 0x98, 0x00, 0x68, - 0x01, 0x21, 0x09, 0x07, 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, 0x08, 0x27, 0x20, 0xE0, 0x29, 0x46, - 0x20, 0x46, 0xFF, 0xF7, 0xE1, 0xFA, 0x79, 0x1C, 0x01, 0x90, 0xFF, 0xF7, 0xDD, 0xFA, 0x03, 0x29, - 0x15, 0xD2, 0x04, 0x98, 0x01, 0x68, 0x0F, 0x20, 0x00, 0x06, 0x81, 0x43, 0x38, 0x06, 0x0F, 0x22, - 0x12, 0x06, 0x10, 0x40, 0x01, 0x43, 0x04, 0x98, 0x01, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, - 0xCB, 0xFA, 0x79, 0x1C, 0x01, 0x90, 0xFF, 0xF7, 0xC7, 0xFA, 0x86, 0x1E, 0x02, 0xE0, 0x7F, 0x1C, - 0x10, 0x2F, 0xDC, 0xDB, 0x00, 0xBF, 0x04, 0x98, 0x00, 0x68, 0x00, 0x0C, 0x00, 0x04, 0xB1, 0xB2, - 0x08, 0x43, 0x04, 0x99, 0x08, 0x60, 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, - 0xFE, 0xB5, 0x8B, 0x4D, 0x2B, 0x68, 0x2D, 0x68, 0x23, 0x26, 0x76, 0x01, 0xAC, 0x19, 0x89, 0x4D, - 0x2D, 0x68, 0x01, 0x95, 0x87, 0x4D, 0x2D, 0x68, 0xAD, 0x19, 0x00, 0x95, 0x00, 0x21, 0x00, 0x22, - 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, - 0x01, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, - 0x7D, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, - 0x40, 0x1C, 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, - 0x56, 0x00, 0x00, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, - 0x52, 0x1C, 0x72, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, - 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, - 0x6B, 0x4E, 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, 0x6A, 0x4D, 0x2D, 0x78, 0x00, 0x2D, - 0x3C, 0xD0, 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, - 0x4E, 0x00, 0x01, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, - 0x49, 0x1C, 0x60, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, - 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, - 0x65, 0x5B, 0x56, 0x00, 0x00, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, - 0x40, 0x1C, 0x52, 0x1C, 0x54, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, - 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, - 0x02, 0x95, 0x4B, 0x4E, 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, 0x00, 0x25, 0x02, 0x95, - 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, 0xBE, 0x5B, - 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x3E, 0x4D, 0x2D, 0x78, - 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, - 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, 0x00, 0x9F, - 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x33, 0x4D, - 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, - 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x2F, 0x4E, 0x36, 0x78, - 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, 0x2B, 0x4D, 0x2D, 0x78, 0x00, 0x2D, 0x3C, 0xD0, 0x00, 0x25, - 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, - 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x21, 0x4D, - 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, - 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, - 0x00, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, - 0x15, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, - 0x40, 0x1C, 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x0F, 0x4E, - 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, 0x05, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, - 0x4E, 0x00, 0xA5, 0x53, 0x49, 0x1C, 0x23, 0x25, 0x2D, 0x01, 0xA9, 0x42, 0xF5, 0xDB, 0xFE, 0xBD, - 0xC8, 0x01, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, 0x43, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, - 0x48, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, 0x49, 0x01, 0x00, 0x20, - 0xFC, 0xB5, 0xF4, 0x48, 0x80, 0x7D, 0x04, 0x11, 0xF2, 0x48, 0x85, 0x7D, 0x00, 0x20, 0x01, 0x90, - 0xF0, 0x48, 0x80, 0x79, 0xC0, 0x06, 0xC0, 0x0F, 0x01, 0xD0, 0x10, 0x20, 0x01, 0x90, 0x01, 0x99, - 0x00, 0x23, 0x2C, 0xE0, 0xEB, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xFF, 0x28, 0x24, 0xD0, 0xE9, 0x48, - 0x1A, 0x30, 0x40, 0x5C, 0xE8, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0xE7, 0x48, 0x00, 0x68, 0x5E, 0x1C, - 0x84, 0x55, 0xE5, 0x48, 0x00, 0x68, 0x9E, 0x1C, 0x84, 0x55, 0xE3, 0x48, 0x00, 0x68, 0xDE, 0x1C, - 0x84, 0x55, 0xE0, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xE0, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0xDF, 0x48, - 0x00, 0x68, 0x5E, 0x1C, 0x84, 0x55, 0xDD, 0x48, 0x00, 0x68, 0x9E, 0x1C, 0x84, 0x55, 0xDB, 0x48, - 0x00, 0x68, 0xDE, 0x1C, 0x84, 0x55, 0x00, 0xE0, 0x03, 0xE0, 0x49, 0x1C, 0x1B, 0x1D, 0x40, 0x2B, - 0xD0, 0xDB, 0x00, 0xBF, 0xD6, 0x48, 0x00, 0x78, 0x40, 0x1E, 0x80, 0x00, 0xD2, 0x4E, 0x36, 0x68, - 0x30, 0x5C, 0x10, 0x26, 0x30, 0x43, 0xD2, 0x4E, 0x36, 0x78, 0x76, 0x1E, 0xB6, 0x00, 0xCE, 0x4F, - 0x3F, 0x68, 0xB8, 0x55, 0xCE, 0x48, 0x00, 0x78, 0x40, 0x1E, 0x80, 0x00, 0xCB, 0x4E, 0x36, 0x68, - 0x30, 0x5C, 0x10, 0x26, 0x30, 0x43, 0xCA, 0x4E, 0x36, 0x78, 0x76, 0x1E, 0xB6, 0x00, 0xC7, 0x4F, - 0x3F, 0x68, 0xB8, 0x55, 0x01, 0x9E, 0x30, 0x46, 0x10, 0x30, 0xC6, 0x17, 0xF6, 0x0E, 0x36, 0x18, - 0x76, 0x11, 0x76, 0x01, 0x81, 0x1B, 0x40, 0x23, 0x2C, 0xE0, 0xBE, 0x48, 0x1A, 0x30, 0x40, 0x5C, - 0xFF, 0x28, 0x24, 0xD0, 0xBB, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xBB, 0x4E, 0x36, 0x68, 0xF0, 0x54, - 0xB9, 0x48, 0x00, 0x68, 0x5E, 0x1C, 0x85, 0x55, 0xB7, 0x48, 0x00, 0x68, 0x9E, 0x1C, 0x85, 0x55, - 0xB5, 0x48, 0x00, 0x68, 0xDE, 0x1C, 0x85, 0x55, 0xB2, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xB3, 0x4E, - 0x36, 0x68, 0xF0, 0x54, 0xB1, 0x48, 0x00, 0x68, 0x5E, 0x1C, 0x85, 0x55, 0xAF, 0x48, 0x00, 0x68, - 0x9E, 0x1C, 0x85, 0x55, 0xAD, 0x48, 0x00, 0x68, 0xDE, 0x1C, 0x85, 0x55, 0x00, 0xE0, 0x03, 0xE0, - 0x49, 0x1C, 0x1B, 0x1D, 0x80, 0x2B, 0xD0, 0xDB, 0x00, 0xBF, 0xAA, 0x48, 0x00, 0x78, 0x40, 0x1E, - 0x80, 0x00, 0x40, 0x30, 0xA4, 0x4E, 0x36, 0x68, 0x30, 0x5C, 0x10, 0x26, 0x30, 0x43, 0xA5, 0x4E, - 0x36, 0x78, 0x76, 0x1E, 0xB6, 0x00, 0x40, 0x36, 0x9F, 0x4F, 0x3F, 0x68, 0xB8, 0x55, 0xA1, 0x48, - 0x00, 0x78, 0x40, 0x1E, 0x80, 0x00, 0x40, 0x30, 0x9C, 0x4E, 0x36, 0x68, 0x30, 0x5C, 0x10, 0x26, - 0x30, 0x43, 0x9C, 0x4E, 0x36, 0x78, 0x76, 0x1E, 0xB6, 0x00, 0x40, 0x36, 0x97, 0x4F, 0x3F, 0x68, - 0xB8, 0x55, 0x80, 0x23, 0x96, 0x48, 0x00, 0x78, 0x93, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x94, 0x48, - 0x06, 0x78, 0x18, 0x46, 0x5B, 0x1C, 0x91, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x91, 0x48, 0x00, 0x78, - 0x8D, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x8F, 0x48, 0x06, 0x78, 0x18, 0x46, 0x5B, 0x1C, 0x8B, 0x4F, - 0x3F, 0x68, 0x3E, 0x54, 0x8C, 0x48, 0x00, 0x78, 0x87, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x8B, 0x48, - 0x06, 0x78, 0x18, 0x46, 0x5B, 0x1C, 0x85, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x88, 0x48, 0x00, 0x78, - 0x81, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x87, 0x48, 0x06, 0x78, 0x18, 0x46, 0x5B, 0x1C, 0x7F, 0x4F, - 0x3F, 0x68, 0x3E, 0x54, 0x03, 0x20, 0x7C, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x02, 0x20, 0x7B, 0x4E, - 0x36, 0x68, 0xF0, 0x54, 0x77, 0x48, 0x80, 0x79, 0xC0, 0x06, 0xC0, 0x0F, 0x07, 0xD0, 0x02, 0x20, - 0x75, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x03, 0x20, 0x74, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x5B, 0x1C, - 0x00, 0x21, 0x0D, 0xE0, 0x6F, 0x48, 0x10, 0x30, 0x40, 0x5C, 0x6F, 0x4E, 0x36, 0x68, 0xF0, 0x54, - 0x6C, 0x48, 0x10, 0x30, 0x40, 0x5C, 0x6D, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x49, 0x1C, 0x5B, 0x1C, - 0x06, 0x29, 0xEF, 0xDB, 0x00, 0x20, 0x68, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x01, 0x26, 0x18, 0x46, - 0x5B, 0x1C, 0x66, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x62, 0x48, 0xC0, 0x7D, 0x03, 0x26, 0x30, 0x43, - 0x61, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x5F, 0x48, 0xC6, 0x7D, 0x03, 0x20, 0x06, 0x43, 0x18, 0x46, - 0x5B, 0x1C, 0x5E, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x5A, 0x48, 0x40, 0x30, 0xC0, 0x79, 0x00, 0x07, - 0x00, 0x0F, 0x03, 0x28, 0x65, 0xD1, 0x00, 0x24, 0x00, 0x25, 0x00, 0x20, 0x5E, 0x4E, 0x30, 0x70, - 0x00, 0x21, 0x1D, 0xE0, 0x53, 0x48, 0x3F, 0x30, 0x40, 0x5C, 0x02, 0x07, 0x12, 0x0F, 0x08, 0x2A, - 0x09, 0xDA, 0x01, 0x20, 0x90, 0x40, 0x20, 0x43, 0xC4, 0xB2, 0x57, 0x48, 0x00, 0x78, 0x40, 0x1C, - 0x55, 0x4E, 0x30, 0x70, 0x0B, 0xE0, 0x0A, 0x2A, 0x09, 0xDA, 0x08, 0x3A, 0x01, 0x20, 0x90, 0x40, - 0x28, 0x43, 0xC5, 0xB2, 0x50, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x4F, 0x4E, 0x30, 0x70, 0x49, 0x1C, - 0x08, 0x29, 0xDF, 0xDB, 0x44, 0x48, 0x00, 0x68, 0xC4, 0x54, 0x18, 0x46, 0x5B, 0x1C, 0x43, 0x4E, - 0x36, 0x68, 0x34, 0x54, 0x40, 0x48, 0x00, 0x68, 0xC5, 0x54, 0x18, 0x46, 0x5B, 0x1C, 0x3F, 0x4E, - 0x36, 0x68, 0x35, 0x54, 0x44, 0x48, 0x00, 0x78, 0x00, 0x28, 0x3B, 0xDD, 0x39, 0x48, 0x40, 0x30, - 0x84, 0x7A, 0x0F, 0x2C, 0x00, 0xDD, 0x0F, 0x24, 0x7C, 0x20, 0x01, 0x90, 0x10, 0x20, 0x20, 0x43, - 0x06, 0x46, 0x01, 0x98, 0x47, 0x1C, 0x01, 0x97, 0x34, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x31, 0x48, - 0x40, 0x30, 0x46, 0x7A, 0x01, 0x98, 0x47, 0x1C, 0x01, 0x97, 0x30, 0x4F, 0x3F, 0x68, 0x3E, 0x54, - 0x2C, 0x48, 0x40, 0x30, 0x46, 0x7A, 0x01, 0x98, 0x47, 0x1C, 0x01, 0x97, 0x2B, 0x4F, 0x3F, 0x68, - 0x3E, 0x54, 0x28, 0x48, 0x40, 0x30, 0x40, 0x7A, 0x28, 0x4E, 0x36, 0x68, 0x01, 0x9F, 0xF0, 0x55, - 0x10, 0xE0, 0x00, 0x20, 0x24, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x1E, 0x46, 0x5B, 0x1C, 0x23, 0x4F, - 0x3F, 0x68, 0xB8, 0x55, 0x20, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x1E, 0x46, 0x5B, 0x1C, 0x1F, 0x4F, - 0x3F, 0x68, 0xB8, 0x55, 0x1B, 0x4E, 0x20, 0x36, 0xB6, 0x7F, 0x77, 0x00, 0xF0, 0x19, 0xC6, 0x17, - 0xB6, 0x0F, 0x36, 0x18, 0xB6, 0x05, 0x34, 0x0E, 0x17, 0x48, 0x00, 0x68, 0xC4, 0x54, 0x18, 0x46, - 0x5B, 0x1C, 0x16, 0x4E, 0x36, 0x68, 0x34, 0x54, 0x12, 0x48, 0x40, 0x30, 0x00, 0x7A, 0x12, 0x4E, - 0x36, 0x68, 0xF0, 0x54, 0x0F, 0x48, 0x40, 0x30, 0x00, 0x7A, 0x1E, 0x46, 0x5B, 0x1C, 0x0F, 0x4F, - 0x3F, 0x68, 0xB8, 0x55, 0x15, 0x4E, 0x30, 0x78, 0xC6, 0x17, 0xB6, 0x0F, 0x36, 0x18, 0xB6, 0x10, - 0x09, 0x4F, 0x3F, 0x68, 0xFE, 0x54, 0x11, 0x48, 0x00, 0x78, 0x00, 0x90, 0xC0, 0x17, 0x86, 0x0F, - 0x00, 0x98, 0x30, 0x18, 0x80, 0x10, 0x1E, 0x46, 0x5B, 0x1C, 0x04, 0x4F, 0x3F, 0x68, 0xB8, 0x55, - 0xD8, 0xB2, 0xFC, 0xBD, 0x21, 0x04, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, - 0x48, 0x01, 0x00, 0x20, 0x49, 0x01, 0x00, 0x20, 0x43, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, - 0x44, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, 0x7D, 0x03, 0x00, 0x20, 0x4C, 0x01, 0x00, 0x20, - 0x00, 0x20, 0x1B, 0xE0, 0x41, 0x00, 0x10, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x0F, 0x4A, 0x91, 0x42, - 0x05, 0xDD, 0x11, 0x46, 0x42, 0x00, 0x0C, 0x4B, 0x1B, 0x68, 0x99, 0x52, 0x0D, 0xE0, 0x41, 0x00, - 0x09, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x09, 0x4A, 0xD2, 0x43, 0x91, 0x42, 0x05, 0xDA, 0x7F, 0x21, - 0x49, 0x02, 0x42, 0x00, 0x04, 0x4B, 0x1B, 0x68, 0x99, 0x52, 0x40, 0x1C, 0x23, 0x21, 0x49, 0x01, - 0x88, 0x42, 0xDF, 0xD3, 0x70, 0x47, 0x00, 0x00, 0xC8, 0x01, 0x00, 0x20, 0xFF, 0x01, 0x00, 0x00, - 0xF8, 0xB5, 0x30, 0x4A, 0x00, 0x21, 0x13, 0x46, 0x80, 0x3B, 0x08, 0x46, 0x5F, 0x7E, 0xD6, 0x69, - 0x05, 0xE0, 0x42, 0x00, 0xB2, 0x5E, 0x8A, 0x42, 0x00, 0xDD, 0x11, 0x46, 0x40, 0x1C, 0xB8, 0x42, - 0xF7, 0xDB, 0x28, 0x4C, 0x00, 0x25, 0x40, 0x3C, 0xA1, 0x83, 0x48, 0x00, 0x00, 0x90, 0x0D, 0xE0, - 0x03, 0x21, 0x00, 0x98, 0xFE, 0xF7, 0x52, 0xFF, 0x69, 0x00, 0x71, 0x5E, 0x88, 0x42, 0x04, 0xDD, - 0x01, 0x20, 0xE1, 0x8B, 0xA8, 0x40, 0x81, 0x43, 0xE1, 0x83, 0x6D, 0x1C, 0xBD, 0x42, 0xEF, 0xDB, - 0x1C, 0x4A, 0x1C, 0x20, 0x20, 0x3A, 0x10, 0x5E, 0x15, 0x46, 0x00, 0x26, 0x40, 0x3D, 0x09, 0x28, - 0x2E, 0xDD, 0x1E, 0x21, 0x51, 0x5E, 0x00, 0x29, 0x2A, 0xDD, 0x60, 0x3A, 0x12, 0x7E, 0x4B, 0x00, - 0xD2, 0x1A, 0x12, 0xB2, 0xE2, 0x82, 0x0A, 0x2A, 0x01, 0xDA, 0x0A, 0x22, 0xE2, 0x82, 0xFE, 0xF7, - 0x2D, 0xFF, 0x16, 0x21, 0x61, 0x5E, 0x88, 0x42, 0x02, 0xDD, 0x05, 0x20, 0x68, 0x70, 0x02, 0xE0, - 0x68, 0x78, 0x00, 0x28, 0x13, 0xD0, 0x68, 0x78, 0x40, 0x1E, 0x68, 0x70, 0x08, 0xF0, 0xEE, 0xFC, - - 0x06, 0xF0, 0xAC, 0xF8, 0xAE, 0x70, 0x05, 0xF0, 0x33, 0xFC, 0x07, 0x4A, 0xE6, 0x82, 0x16, 0x20, - 0x20, 0x5E, 0x41, 0x1C, 0x09, 0xB2, 0x16, 0x54, 0xE1, 0x82, 0x0A, 0x29, 0xF7, 0xDB, 0xF8, 0xBD, - 0x6E, 0x70, 0xF8, 0xBD, 0xB8, 0x01, 0x00, 0x20, 0xA6, 0x05, 0x00, 0x20, 0xF8, 0xB5, 0x69, 0x48, - 0x00, 0x90, 0x00, 0x79, 0x00, 0x22, 0x00, 0x28, 0x7E, 0xD0, 0x66, 0x4B, 0x20, 0x3B, 0x59, 0x7E, - 0x81, 0x42, 0x79, 0xD9, 0x00, 0x20, 0x01, 0x46, 0x29, 0xE0, 0x62, 0x4B, 0x61, 0x4D, 0x60, 0x33, - 0xDB, 0x6B, 0x00, 0x24, 0x60, 0x35, 0x1C, 0x54, 0xAB, 0x69, 0x5E, 0x4E, 0x5C, 0x18, 0x65, 0x78, - 0x5B, 0x5C, 0x60, 0x36, 0x5B, 0x19, 0xF5, 0x6A, 0x44, 0x00, 0x5B, 0x08, 0x2B, 0x53, 0xB3, 0x69, - 0x87, 0x00, 0x5B, 0x18, 0x9D, 0x78, 0xDE, 0x78, 0x56, 0x4B, 0xAD, 0x19, 0x60, 0x33, 0x1B, 0x6B, - 0x6D, 0x08, 0x1D, 0x53, 0x53, 0x4B, 0x54, 0x4E, 0x60, 0x33, 0x1C, 0x6C, 0x1D, 0x46, 0xE6, 0x51, - 0x6D, 0x6C, 0x00, 0x23, 0x51, 0x4C, 0x2B, 0x54, 0x23, 0x54, 0x40, 0x1C, 0x09, 0x1D, 0x4D, 0x4B, - 0x20, 0x3B, 0x5C, 0x7E, 0xA0, 0x42, 0xD0, 0xDB, 0x00, 0x21, 0x1E, 0xE0, 0x49, 0x4F, 0x48, 0x1C, - 0x60, 0x37, 0x4B, 0x00, 0x13, 0xE0, 0xFC, 0x6A, 0x46, 0x00, 0xE5, 0x5E, 0xA4, 0x5F, 0x2C, 0x1B, - 0x3D, 0x6B, 0x64, 0x43, 0xAE, 0x5F, 0xED, 0x5E, 0xAD, 0x1B, 0x6D, 0x43, 0x64, 0x19, 0x0C, 0x2C, - 0x04, 0xDA, 0x7D, 0x6C, 0x01, 0x24, 0x6C, 0x54, 0x7D, 0x6C, 0x2C, 0x54, 0x40, 0x1C, 0x3D, 0x4C, - 0x20, 0x3C, 0x64, 0x7E, 0xA0, 0x42, 0xE6, 0xDB, 0x49, 0x1C, 0x3A, 0x4B, 0x20, 0x3B, 0x58, 0x7E, - 0x81, 0x42, 0xDB, 0xDB, 0x00, 0x21, 0x33, 0xE0, 0x36, 0x4B, 0x60, 0x33, 0x58, 0x6C, 0x40, 0x5C, - 0x00, 0x28, 0x2C, 0xD0, 0x00, 0x20, 0x8C, 0x00, 0x4B, 0x00, 0x1C, 0xE0, 0x31, 0x4D, 0x34, 0x4E, - 0x60, 0x35, 0xED, 0x6A, 0x36, 0x5C, 0xED, 0x5E, 0xAF, 0x1B, 0x2E, 0x4D, 0x30, 0x4E, 0x60, 0x35, - 0x2D, 0x6B, 0x0A, 0x36, 0x36, 0x5C, 0xED, 0x5E, 0x7F, 0x43, 0xAD, 0x1B, 0x29, 0x4E, 0x6D, 0x43, - 0x60, 0x36, 0x7D, 0x19, 0x36, 0x6C, 0x00, 0xE0, 0x4B, 0xE0, 0x37, 0x59, 0xAF, 0x42, 0x01, 0xDD, - 0x02, 0x46, 0x35, 0x51, 0x40, 0x1C, 0x00, 0x9D, 0x2D, 0x79, 0xA8, 0x42, 0xDE, 0xDB, 0x21, 0x48, - 0x60, 0x30, 0x83, 0x6B, 0x5A, 0x54, 0xC0, 0x6B, 0x83, 0x5C, 0x5B, 0x1C, 0x83, 0x54, 0x49, 0x1C, - 0x1C, 0x48, 0x20, 0x38, 0x40, 0x7E, 0x81, 0x42, 0xC6, 0xDB, 0x00, 0x24, 0x2D, 0xE0, 0x19, 0x4D, - 0x60, 0x35, 0xE8, 0x6B, 0x00, 0x57, 0x01, 0x28, 0x26, 0xDD, 0x00, 0x21, 0x2B, 0x46, 0x08, 0x46, - 0x80, 0x3B, 0x0A, 0xE0, 0xAA, 0x6B, 0x12, 0x56, 0xA2, 0x42, 0x05, 0xD1, 0x0E, 0x46, 0x6A, 0x6C, - 0x49, 0x1C, 0x02, 0x29, 0x90, 0x55, 0x03, 0xDA, 0x40, 0x1C, 0x5A, 0x7E, 0x90, 0x42, 0xF1, 0xDB, - 0x68, 0x6C, 0xEB, 0x6A, 0x41, 0x78, 0x00, 0x78, 0x4A, 0x00, 0x46, 0x00, 0x9F, 0x5F, 0x9B, 0x5E, - 0x2D, 0x6B, 0xFB, 0x1A, 0xAA, 0x5E, 0xAD, 0x5F, 0x5B, 0x43, 0xAA, 0x1A, 0x52, 0x43, 0x9A, 0x18, - 0x0C, 0x2A, 0x01, 0xDA, 0x02, 0xF0, 0x88, 0xFF, 0x64, 0x1C, 0x00, 0x98, 0x00, 0x79, 0x84, 0x42, - 0xCD, 0xDB, 0xF8, 0xBD, 0x58, 0x01, 0x00, 0x20, 0xFF, 0xFF, 0x7F, 0x00, 0xA6, 0x05, 0x00, 0x20, - 0x32, 0x07, 0x00, 0x20, 0x10, 0xB5, 0x00, 0xBF, 0x01, 0x21, 0x08, 0x46, 0x88, 0x40, 0x16, 0x49, - 0x08, 0x60, 0x00, 0xBF, 0x59, 0x20, 0x15, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, - 0x08, 0x60, 0x01, 0xF0, 0x2D, 0xF8, 0x7D, 0x24, 0xA4, 0x02, 0x05, 0xE0, 0x20, 0x46, 0x01, 0xF0, - 0x3B, 0xF8, 0xFF, 0x34, 0xFF, 0x34, 0x02, 0x34, 0x0D, 0x48, 0x84, 0x42, 0xF6, 0xDB, 0x01, 0xF0, - 0x15, 0xF8, 0x00, 0x20, 0x09, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x01, 0x21, 0x08, 0x46, 0x88, 0x40, - 0x05, 0x49, 0x80, 0x39, 0x08, 0x60, 0x00, 0xBF, 0x48, 0x17, 0x06, 0x49, 0x08, 0x60, 0x00, 0x20, - 0x05, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0x00, 0x01, 0x00, 0x50, - 0xC8, 0xFC, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x0A, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x8E, 0x46, - 0x0F, 0x49, 0x94, 0x46, 0x8A, 0x7C, 0x0D, 0x46, 0x92, 0x1C, 0x40, 0x35, 0x42, 0x43, 0xAA, 0x82, - 0x00, 0x26, 0x0A, 0x46, 0x80, 0x32, 0x10, 0xE0, 0x64, 0x46, 0x05, 0xE0, 0x14, 0x27, 0xEF, 0x5F, - 0x51, 0x69, 0x3F, 0x19, 0x64, 0x1C, 0xCE, 0x55, 0x9C, 0x42, 0xF7, 0xDD, 0x04, 0x4C, 0xA9, 0x8A, - 0xA4, 0x7C, 0x09, 0x19, 0x89, 0x1C, 0xA9, 0x82, 0x40, 0x1C, 0x70, 0x45, 0xEC, 0xDD, 0xF0, 0xBD, - 0x38, 0x01, 0x00, 0x20, 0xFF, 0x20, 0x01, 0x49, 0x08, 0x70, 0x70, 0x47, 0x92, 0x00, 0x00, 0x20, - 0xF8, 0xB5, 0x01, 0x20, 0x06, 0xF0, 0xE4, 0xF9, 0x59, 0x20, 0x24, 0x49, 0x08, 0x60, 0x16, 0x20, - 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x00, 0xF0, 0xCB, 0xFF, 0x69, 0x46, 0x1F, 0x20, 0x00, 0x03, - 0x01, 0xF0, 0x14, 0xF8, 0x01, 0x26, 0x1E, 0x49, 0x00, 0x98, 0x88, 0x42, 0x29, 0xD1, 0x1D, 0x48, - 0x05, 0x68, 0x1D, 0x4E, 0x0F, 0xE0, 0x69, 0x46, 0x30, 0x46, 0x01, 0xF0, 0x07, 0xF8, 0x00, 0x24, - 0x05, 0xE0, 0x00, 0x98, 0x28, 0x55, 0x00, 0x98, 0x00, 0x0A, 0x00, 0x90, 0x64, 0x1C, 0x04, 0x2C, - 0xF7, 0xD3, 0x2D, 0x1D, 0x36, 0x1D, 0x14, 0x48, 0x5E, 0x30, 0x86, 0x42, 0xEB, 0xD3, 0x00, 0x26, - 0x10, 0x48, 0x05, 0x68, 0x00, 0x24, 0x09, 0xE0, 0x20, 0x46, 0x65, 0x30, 0x0F, 0x49, 0x08, 0x5C, - 0x29, 0x5D, 0x88, 0x42, 0x01, 0xD0, 0x01, 0x26, 0x02, 0xE0, 0x64, 0x1C, 0x5E, 0x2C, 0xF3, 0xD3, - 0x00, 0xBF, 0x01, 0xF0, 0xAB, 0xFD, 0x00, 0xF0, 0x89, 0xFF, 0x00, 0x20, 0x03, 0x49, 0x08, 0x60, - 0x01, 0x20, 0x06, 0xF0, 0xBB, 0xF9, 0xF0, 0xB2, 0xF8, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, - 0x21, 0x43, 0x65, 0x87, 0xCC, 0x01, 0x00, 0x20, 0x04, 0xF0, 0x01, 0x00, 0xBC, 0x03, 0x00, 0x20, - 0x04, 0x4B, 0x40, 0x00, 0x1A, 0x5A, 0x00, 0x2A, 0x01, 0xD0, 0x51, 0x18, 0x49, 0x08, 0x19, 0x52, - 0x70, 0x47, 0x00, 0x00, 0x80, 0x1A, 0x00, 0x20, 0xF0, 0xB5, 0x13, 0x4F, 0x00, 0x20, 0x39, 0x46, - 0x24, 0x39, 0x10, 0x4D, 0x03, 0x46, 0x4E, 0x79, 0x19, 0xE0, 0x0E, 0x4A, 0x0D, 0x4C, 0x41, 0x00, - 0x10, 0x3A, 0x20, 0x3C, 0x52, 0x5A, 0x64, 0x5A, 0x12, 0x1B, 0x0B, 0x4C, 0x12, 0xB2, 0x08, 0x34, - 0x24, 0x5C, 0x54, 0x43, 0x22, 0x11, 0x6C, 0x5E, 0x12, 0xB2, 0x54, 0x43, 0x00, 0x2C, 0x03, 0xDA, - 0x04, 0x4C, 0x10, 0x34, 0x63, 0x52, 0x3B, 0x54, 0x40, 0x1C, 0x6A, 0x52, 0xC0, 0xB2, 0xB0, 0x42, - 0xE3, 0xD3, 0xF0, 0xBD, 0xA0, 0x1A, 0x00, 0x20, 0x9C, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x1C, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x13, 0xD0, 0x00, 0x20, 0x19, 0x49, 0x08, 0x70, 0x04, 0xF0, 0x76, 0xFC, - 0xFF, 0xF7, 0x66, 0xFF, 0x00, 0x28, 0x0A, 0xD0, 0x07, 0xF0, 0x56, 0xFA, 0x01, 0x20, 0x15, 0x49, - 0x08, 0x70, 0x15, 0x49, 0x08, 0x70, 0x15, 0x49, 0x08, 0x70, 0x15, 0x49, 0x08, 0x70, 0x15, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x08, 0xF0, 0xD7, 0xF9, 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, - 0x0D, 0x49, 0x08, 0x70, 0x10, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, 0x0A, 0xF0, - 0xEF, 0xF8, 0x0A, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD0, 0x03, 0x20, 0x0A, 0xF0, 0xE8, 0xF8, - 0x0A, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x01, 0xD1, 0x07, 0xF0, 0x30, 0xF8, 0x10, 0xBD, 0x00, 0x00, - 0xA2, 0x00, 0x00, 0x20, 0xAC, 0x00, 0x00, 0x20, 0x9E, 0x00, 0x00, 0x20, 0xA6, 0x00, 0x00, 0x20, - 0xA5, 0x00, 0x00, 0x20, 0xAD, 0x00, 0x00, 0x20, 0xA7, 0x00, 0x00, 0x20, 0x40, 0x01, 0x00, 0x20, - 0x10, 0xB5, 0x00, 0x20, 0x76, 0x49, 0x08, 0x70, 0x76, 0x49, 0x08, 0x70, 0x01, 0x20, 0x76, 0x49, - 0x08, 0x70, 0x07, 0xF0, 0xE7, 0xF8, 0x02, 0xF0, 0x91, 0xFF, 0xFF, 0xF7, 0x21, 0xFA, 0x73, 0x48, - 0x00, 0x78, 0x04, 0x28, 0x0A, 0xDA, 0x71, 0x48, 0x00, 0x78, 0x01, 0x28, 0x06, 0xD0, 0x70, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x02, 0xD1, 0x08, 0xF0, 0xCD, 0xF9, 0x07, 0xE0, 0x6D, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x03, 0xDD, 0xFF, 0xF7, 0x34, 0xFD, 0x07, 0xF0, 0x66, 0xF9, 0x69, 0x48, 0x00, 0x68, - 0x01, 0x28, 0x7D, 0xDD, 0x00, 0x20, 0x64, 0x49, 0x08, 0x70, 0x67, 0x49, 0x08, 0x5E, 0x67, 0x49, - 0x09, 0x78, 0x88, 0x42, 0x07, 0xDC, 0x65, 0x48, 0x00, 0x78, 0x40, 0x42, 0x64, 0x49, 0x00, 0x22, - 0x8A, 0x5E, 0x90, 0x42, 0x06, 0xDD, 0x5A, 0x48, 0x00, 0x78, 0x01, 0x28, 0x08, 0xD1, 0x59, 0x49, - 0x08, 0x70, 0x05, 0xE0, 0x01, 0x20, 0x56, 0x49, 0x08, 0x70, 0x00, 0x20, 0x5D, 0x49, 0x08, 0x70, - 0x58, 0x48, 0x00, 0x68, 0x0A, 0x28, 0x7E, 0xDB, 0x5B, 0x48, 0x00, 0x78, 0x01, 0x28, 0x29, 0xD1, - 0x56, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD1, 0x18, 0xCA, 0x0F, 0x52, 0x18, 0x52, 0x10, 0x52, 0x4B, - 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0C, 0xDB, 0x50, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD0, 0x18, - 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x52, 0x42, 0x4D, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, - 0x11, 0xDD, 0x4E, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x4D, 0x49, 0x88, 0x42, 0x07, 0xDA, 0x4B, 0x48, - 0x00, 0x88, 0x4C, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x48, 0x49, 0x08, 0x80, 0x01, 0x20, - 0x49, 0x49, 0x08, 0x70, 0x5B, 0xE0, 0x41, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD1, 0x18, 0xCA, 0x17, - 0x92, 0x0F, 0x52, 0x18, 0x92, 0x10, 0x3C, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0D, 0xDB, - 0x3A, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD0, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x12, 0x18, 0x92, 0x10, - 0x52, 0x42, 0x37, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x12, 0xDD, 0x37, 0x49, 0x00, 0x20, - 0x08, 0x5E, 0x37, 0x49, 0x88, 0x42, 0x07, 0xDA, 0x34, 0x48, 0x00, 0x88, 0x35, 0x49, 0x09, 0x88, - 0x40, 0x18, 0x00, 0xB2, 0x31, 0x49, 0x08, 0x80, 0x02, 0x20, 0x33, 0x49, 0x08, 0x70, 0x2E, 0xE0, - 0x38, 0xE0, 0x28, 0x4A, 0x12, 0x68, 0x64, 0x2A, 0x29, 0xDB, 0x2F, 0x4A, 0x12, 0x78, 0x03, 0x2A, - 0x25, 0xDA, 0x26, 0x4A, 0x11, 0x78, 0xCA, 0x0F, 0x52, 0x18, 0x52, 0x10, 0x22, 0x4B, 0x00, 0x24, - 0x1C, 0x5F, 0xA2, 0x42, 0x1B, 0xDD, 0x21, 0x4A, 0x10, 0x78, 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, - 0x52, 0x42, 0x1F, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x10, 0xDA, 0x1F, 0x49, 0x00, 0x20, - 0x08, 0x5E, 0x1F, 0x49, 0x00, 0xE0, 0x07, 0xE0, 0x88, 0x42, 0x08, 0xDA, 0x00, 0x20, 0x1B, 0x49, - 0x08, 0x80, 0x1D, 0x49, 0x08, 0x70, 0x02, 0xE0, 0x01, 0x20, 0x1B, 0x49, 0x08, 0x70, 0x11, 0x48, - 0x00, 0x68, 0x64, 0x28, 0x03, 0xDB, 0x18, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, - 0x09, 0x49, 0x08, 0x70, 0x07, 0x48, 0x00, 0x78, 0x01, 0x28, 0x02, 0xD1, 0x07, 0xF0, 0xC4, 0xFA, - 0x01, 0xE0, 0x07, 0xF0, 0x5D, 0xFD, 0x02, 0x20, 0x10, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x00, 0x00, - 0x0A, 0x01, 0x00, 0x20, 0x14, 0x01, 0x00, 0x20, 0x0B, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, - 0xEF, 0x00, 0x00, 0x20, 0x10, 0x01, 0x00, 0x20, 0x8A, 0x01, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, - 0x88, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, 0x0C, 0x01, 0x00, 0x20, - 0x60, 0xEA, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x0E, 0x01, 0x00, 0x20, 0x12, 0x02, 0x00, 0x20, - 0xF0, 0xB5, 0xC2, 0x48, 0x00, 0x21, 0x86, 0xB0, 0x04, 0x46, 0x81, 0x82, 0x40, 0x3C, 0xBF, 0x4B, - 0x14, 0x22, 0x40, 0x33, 0x82, 0x5E, 0x99, 0x6A, 0x89, 0x5C, 0x00, 0x29, 0x7E, 0xD0, 0xBC, 0x4E, - 0xB5, 0x5C, 0x00, 0x2D, 0x01, 0xD1, 0xA0, 0x21, 0x01, 0xE0, 0x21, 0x79, 0xC9, 0x00, 0x01, 0x83, - 0x2D, 0x07, 0x00, 0x21, 0x2D, 0x0F, 0x01, 0x2D, 0x1B, 0xD1, 0x56, 0x00, 0x1A, 0x6A, 0xB5, 0x4D, - 0x05, 0x92, 0xB4, 0x46, 0x92, 0x5F, 0xAE, 0x5F, 0x25, 0x79, 0x77, 0x19, 0xBA, 0x42, 0x05, 0xDD, - 0x01, 0x21, 0x52, 0x1B, 0x05, 0x9E, 0x65, 0x46, 0x72, 0x53, 0x4D, 0xE0, 0x18, 0x27, 0xC7, 0x5F, - 0xD7, 0x19, 0xB7, 0x42, 0x48, 0xDA, 0x01, 0x21, 0x52, 0x19, 0x05, 0x9E, 0x65, 0x46, 0x72, 0x53, - 0x3A, 0xE0, 0x02, 0x2D, 0x16, 0xD1, 0x57, 0x00, 0x1A, 0x6A, 0x26, 0x79, 0x94, 0x46, 0xD2, 0x5F, - 0xA4, 0x4D, 0x04, 0x96, 0xED, 0x5F, 0x96, 0x19, 0xAE, 0x42, 0x03, 0xDA, 0x62, 0x46, 0x01, 0x21, - 0xD6, 0x53, 0x31, 0xE0, 0x18, 0x26, 0x86, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x2C, 0xDD, 0x01, 0x21, - 0x04, 0x9D, 0x0D, 0xE0, 0x57, 0x00, 0x1A, 0x6A, 0x9A, 0x4D, 0x94, 0x46, 0xD2, 0x5F, 0xED, 0x5F, - 0x18, 0x26, 0x03, 0x95, 0x86, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x0C, 0xDD, 0x25, 0x79, 0x01, 0x21, - 0x52, 0x1B, 0x65, 0x46, 0xEA, 0x53, 0x14, 0x22, 0x91, 0x4D, 0x82, 0x5E, 0xAE, 0x5C, 0x36, 0x09, - 0x36, 0x01, 0x76, 0x1C, 0x0F, 0xE0, 0x95, 0x19, 0x03, 0x9E, 0xB5, 0x42, 0x0C, 0xDA, 0x25, 0x79, - 0x01, 0x21, 0x52, 0x19, 0x65, 0x46, 0xEA, 0x53, 0x14, 0x22, 0x89, 0x4D, 0x82, 0x5E, 0xAE, 0x5C, - 0x36, 0x09, 0x36, 0x01, 0xB6, 0x1C, 0xAE, 0x54, 0x14, 0x22, 0x85, 0x4D, 0x82, 0x5E, 0xAD, 0x5C, - 0x2D, 0x09, 0x01, 0x2D, 0x20, 0xD1, 0x56, 0x00, 0x82, 0x4D, 0x5A, 0x6A, 0x02, 0x92, 0xB4, 0x46, - 0x14, 0x35, 0x92, 0x5F, 0xAE, 0x5F, 0x25, 0x79, 0x77, 0x19, 0x00, 0xE0, 0xEC, 0xE0, 0xBA, 0x42, - 0x06, 0xDD, 0x10, 0x26, 0x31, 0x43, 0x52, 0x1B, 0x02, 0x9E, 0x65, 0x46, 0x72, 0x53, 0x54, 0xE0, - 0x18, 0x27, 0xC7, 0x5F, 0xD7, 0x19, 0xB7, 0x42, 0x4F, 0xDA, 0x10, 0x26, 0x31, 0x43, 0x55, 0x19, - 0x02, 0x9E, 0x62, 0x46, 0xB5, 0x52, 0x40, 0xE0, 0x02, 0x2D, 0x19, 0xD1, 0x57, 0x00, 0x5A, 0x6A, - 0x25, 0x79, 0x94, 0x46, 0xD2, 0x5F, 0x01, 0x95, 0x56, 0x19, 0x6E, 0x4D, 0x14, 0x35, 0xED, 0x5F, - 0xAE, 0x42, 0x04, 0xDA, 0x10, 0x22, 0x11, 0x43, 0x62, 0x46, 0xD6, 0x53, 0x35, 0xE0, 0x18, 0x26, - 0x86, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x30, 0xDD, 0x10, 0x25, 0x29, 0x43, 0x01, 0x9D, 0x0F, 0xE0, - 0x57, 0x00, 0x64, 0x4D, 0x5A, 0x6A, 0x14, 0x35, 0x94, 0x46, 0xD2, 0x5F, 0xED, 0x5F, 0x18, 0x26, - 0x00, 0x95, 0x86, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x0D, 0xDD, 0x10, 0x25, 0x29, 0x43, 0x25, 0x79, - 0x52, 0x1B, 0x65, 0x46, 0xEA, 0x53, 0x14, 0x22, 0x59, 0x4D, 0x82, 0x5E, 0xAE, 0x5C, 0x36, 0x07, - 0x36, 0x0F, 0x10, 0x36, 0x10, 0xE0, 0x95, 0x19, 0x00, 0x9E, 0xB5, 0x42, 0x0D, 0xDA, 0x10, 0x25, - 0x29, 0x43, 0x25, 0x79, 0x52, 0x19, 0x65, 0x46, 0xEA, 0x53, 0x14, 0x22, 0x50, 0x4D, 0x82, 0x5E, - 0xAE, 0x5C, 0x36, 0x07, 0x36, 0x0F, 0x20, 0x36, 0xAE, 0x54, 0x00, 0x29, 0x0F, 0xD1, 0x14, 0x21, - 0x41, 0x5E, 0x4C, 0x4A, 0x49, 0x00, 0x28, 0x32, 0x55, 0x5A, 0x1E, 0x6A, 0x14, 0x32, 0x75, 0x52, - 0x14, 0x21, 0x41, 0x5E, 0x5D, 0x6A, 0x49, 0x00, 0x52, 0x5A, 0x6A, 0x52, 0x5A, 0xE0, 0x43, 0x4A, - 0x01, 0x25, 0x20, 0x3A, 0x55, 0x71, 0x0A, 0x07, 0x12, 0x0F, 0x01, 0x2A, 0x23, 0xD1, 0x14, 0x22, - 0x82, 0x5E, 0x1D, 0x6A, 0x52, 0x00, 0x3F, 0x4E, 0xAF, 0x5A, 0xB7, 0x52, 0xAD, 0x5A, 0x28, 0x36, - 0xB5, 0x52, 0x0D, 0x06, 0x2D, 0x0F, 0x16, 0xD1, 0x3A, 0x4F, 0x5D, 0x6A, 0x3C, 0x37, 0xBF, 0x5E, - 0xAE, 0x5E, 0xBC, 0x46, 0x08, 0x37, 0xBE, 0x42, 0x01, 0xDD, 0x08, 0x3E, 0x02, 0xE0, 0x08, 0x36, - 0x66, 0x45, 0x06, 0xDA, 0xAE, 0x52, 0x14, 0x22, 0x82, 0x5E, 0x32, 0x4D, 0x52, 0x00, 0x3C, 0x35, - 0x00, 0xE0, 0x66, 0x46, 0xAE, 0x52, 0x0A, 0x06, 0x12, 0x0F, 0x01, 0x2A, 0x2A, 0xD1, 0x14, 0x22, - 0x82, 0x5E, 0x2C, 0x4E, 0x5D, 0x6A, 0x52, 0x00, 0x14, 0x36, 0xAF, 0x5A, 0xB7, 0x52, 0x28, 0x36, - 0xAD, 0x5A, 0xB5, 0x52, 0x09, 0x07, 0x1D, 0xD1, 0x26, 0x4D, 0x19, 0x6A, 0x28, 0x35, 0xAD, 0x5E, - 0x8E, 0x5E, 0x2F, 0x46, 0x08, 0x37, 0xBE, 0x42, 0x07, 0xDD, 0x08, 0x3E, 0x8E, 0x52, 0x14, 0x21, - 0x41, 0x5E, 0x20, 0x4A, 0x49, 0x00, 0x28, 0x32, 0x09, 0xE0, 0x1E, 0x4F, 0x08, 0x36, 0x28, 0x37, - 0xAE, 0x42, 0x06, 0xDA, 0x8E, 0x52, 0x14, 0x21, 0x41, 0x5E, 0x3A, 0x46, 0x49, 0x00, 0x56, 0x52, - 0x00, 0xE0, 0x8D, 0x52, 0x15, 0x49, 0x14, 0x22, 0x15, 0x4B, 0x40, 0x31, 0x82, 0x5E, 0x89, 0x6A, - 0x0A, 0x3B, 0x9B, 0x5C, 0x8E, 0x5C, 0x9C, 0x46, 0xF3, 0x1A, 0x5D, 0xB2, 0x23, 0x79, 0x5B, 0x00, - 0xAB, 0x42, 0x01, 0xDA, 0xF3, 0x1A, 0x05, 0xE0, 0x5F, 0x42, 0xAF, 0x42, 0x01, 0xDD, 0xF3, 0x18, - 0x00, 0xE0, 0x63, 0x46, 0x8B, 0x54, 0x09, 0x49, 0x09, 0x4A, 0x40, 0x31, 0x8B, 0x6A, 0x14, 0x21, - 0x41, 0x5E, 0x0A, 0x3A, 0x5B, 0x5C, 0x53, 0x54, 0x81, 0x8A, 0x49, 0x1C, 0x09, 0xB2, 0x81, 0x82, - 0x0A, 0x29, 0x00, 0xDA, 0x83, 0xE6, 0x06, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x78, 0x01, 0x00, 0x20, - 0xA6, 0x05, 0x00, 0x20, 0xE2, 0x06, 0x00, 0x20, 0xF0, 0xB5, 0x89, 0xB0, 0x01, 0x20, 0x8E, 0x4B, - 0x00, 0x90, 0x00, 0x20, 0x1A, 0x46, 0x58, 0x71, 0x20, 0x32, 0x90, 0x82, 0x8A, 0x4D, 0x14, 0x21, - 0x60, 0x35, 0x51, 0x5E, 0xA8, 0x6A, 0x08, 0x90, 0x40, 0x5C, 0x00, 0x28, 0x1A, 0xD1, 0x08, 0x46, - 0x06, 0x24, 0x60, 0x43, 0x85, 0x4E, 0x05, 0x46, 0x30, 0x5E, 0x40, 0x1C, 0x0D, 0xD0, 0x00, 0x20, - 0x44, 0x1E, 0xAD, 0x19, 0x46, 0x00, 0x40, 0x1C, 0xAC, 0x53, 0x03, 0x28, 0xFA, 0xDB, 0x7F, 0x4C, - 0x00, 0x20, 0x6E, 0x3C, 0x60, 0x54, 0x01, 0x20, 0x58, 0x71, 0x7C, 0x4C, 0x00, 0x20, 0x82, 0x3C, - 0x60, 0x54, 0xDD, 0xE0, 0x00, 0x20, 0x00, 0x90, 0x08, 0x46, 0x06, 0x24, 0x77, 0x4F, 0x60, 0x43, - 0x3C, 0x5E, 0x66, 0x1C, 0x40, 0xD1, 0x3E, 0x46, 0x3C, 0x36, 0x86, 0x19, 0xC0, 0x19, 0x07, 0x96, - 0x06, 0x90, 0x68, 0x6A, 0x00, 0x24, 0x2D, 0x6A, 0x84, 0x46, 0x48, 0x00, 0x05, 0x95, 0x2E, 0x5A, - 0x65, 0x00, 0x06, 0x9F, 0x64, 0x1C, 0x7E, 0x53, 0x66, 0x46, 0x07, 0x9F, 0x36, 0x5A, 0x7E, 0x53, - 0x03, 0x2C, 0x01, 0xDA, 0x05, 0x9D, 0xF2, 0xE7, 0x05, 0x9C, 0x68, 0x4D, 0x24, 0x5A, 0x78, 0x35, - 0x2C, 0x52, 0x64, 0x46, 0x24, 0x5A, 0x14, 0x35, 0x2C, 0x52, 0x00, 0x24, 0x14, 0x35, 0x6C, 0x54, - 0x08, 0x9D, 0x62, 0x4E, 0x6D, 0x5C, 0x82, 0x3E, 0x75, 0x54, 0x35, 0x46, 0x0A, 0x35, 0x6C, 0x54, - 0x05, 0x99, 0x5E, 0x4C, 0x09, 0x5A, 0xC4, 0x34, 0x21, 0x52, 0x61, 0x46, 0x09, 0x5A, 0x14, 0x34, - 0x21, 0x52, 0x05, 0x99, 0x14, 0x34, 0x09, 0x5A, 0x21, 0x52, 0x61, 0x46, 0x09, 0x5A, 0x14, 0x34, - 0x21, 0x52, 0x01, 0x20, 0x58, 0x71, 0x93, 0xE0, 0x48, 0x00, 0x29, 0x6A, 0x08, 0x5E, 0x00, 0x1B, - 0xFE, 0xF7, 0xDB, 0xFA, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x42, 0x0E, 0xD8, 0x14, 0x20, 0x10, 0x5E, - 0x6E, 0x6A, 0x44, 0x00, 0x34, 0x5F, 0x06, 0x26, 0x70, 0x43, 0x4C, 0x4E, 0x3C, 0x36, 0x30, 0x5E, - 0x20, 0x1A, 0xFE, 0xF7, 0xCA, 0xFA, 0x88, 0x42, 0x04, 0xD9, 0xD8, 0x78, 0x0A, 0x28, 0x01, 0xD2, - 0x40, 0x1C, 0xD8, 0x70, 0xD8, 0x78, 0x0A, 0x28, 0x08, 0xD1, 0x14, 0x20, 0x10, 0x5E, 0x29, 0x6A, - 0x40, 0x00, 0x09, 0x5E, 0x03, 0x91, 0x69, 0x6A, 0x08, 0x5E, 0x2F, 0xE0, 0x14, 0x21, 0x51, 0x5E, - 0x06, 0x20, 0x48, 0x43, 0x3D, 0x4C, 0x04, 0x26, 0x07, 0x19, 0x02, 0x24, 0x3C, 0x5F, 0xBE, 0x5F, - 0x3A, 0x4F, 0xA4, 0x19, 0x2E, 0x6A, 0x49, 0x00, 0x76, 0x5E, 0x3F, 0x5E, 0xB6, 0x00, 0x7F, 0x00, - 0xF6, 0x19, 0xA4, 0x19, 0x24, 0x1D, 0xE6, 0x17, 0x76, 0x0F, 0x34, 0x19, 0xE4, 0x10, 0x03, 0x94, - 0x32, 0x4C, 0x04, 0x26, 0x3C, 0x34, 0x07, 0x19, 0x02, 0x24, 0x3C, 0x5F, 0xBE, 0x5F, 0x2F, 0x4F, - 0xA4, 0x19, 0x6E, 0x6A, 0x3C, 0x37, 0x71, 0x5E, 0x38, 0x5E, 0x89, 0x00, 0x40, 0x00, 0x08, 0x18, - 0x20, 0x18, 0x00, 0x1D, 0xC1, 0x17, 0x49, 0x0F, 0x08, 0x18, 0xC0, 0x10, 0x02, 0x90, 0x26, 0x48, - 0x26, 0x49, 0x60, 0x30, 0x84, 0x6A, 0x14, 0x20, 0x10, 0x5E, 0x82, 0x39, 0x24, 0x5C, 0x04, 0x90, - 0x08, 0x5C, 0x04, 0x99, 0x20, 0x18, 0x06, 0x24, 0x61, 0x43, 0x20, 0x4C, 0x40, 0x08, 0x01, 0x90, - 0x3C, 0x34, 0x1E, 0x4D, 0x01, 0x20, 0x0C, 0x19, 0x8C, 0x46, 0x4D, 0x19, 0x41, 0x00, 0x6E, 0x5A, - 0x6F, 0x18, 0x7E, 0x80, 0x66, 0x5A, 0x61, 0x18, 0x4E, 0x80, 0x40, 0x1E, 0xF6, 0xD5, 0x17, 0x4C, - 0x61, 0x46, 0x03, 0x98, 0x60, 0x52, 0x15, 0x4D, 0x64, 0x46, 0x3C, 0x35, 0x02, 0x99, 0x29, 0x53, - 0x04, 0x9C, 0x65, 0x00, 0x10, 0x4C, 0x60, 0x34, 0x26, 0x6A, 0x70, 0x53, 0x14, 0x25, 0x55, 0x5F, - 0x66, 0x6A, 0x6D, 0x00, 0x01, 0x98, 0x71, 0x53, 0xA1, 0x6A, 0x14, 0x24, 0x14, 0x5F, 0x08, 0x55, - 0x90, 0x8A, 0x40, 0x1C, 0x00, 0xB2, 0x90, 0x82, 0x0A, 0x28, 0x00, 0xDA, 0xF6, 0xE6, 0xD8, 0x78, - 0x00, 0x28, 0x06, 0xD0, 0x0A, 0x20, 0xD8, 0x70, 0x00, 0x98, 0x01, 0x28, 0x01, 0xD1, 0x00, 0x20, - 0xD8, 0x70, 0x09, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x58, 0x01, 0x00, 0x20, 0x1E, 0x06, 0x00, 0x20, - 0xF8, 0xB5, 0x04, 0xF0, 0x2F, 0xF9, 0x00, 0x20, 0xD8, 0x49, 0x08, 0x70, 0xD8, 0x49, 0x08, 0x80, - 0xD8, 0x49, 0x08, 0x80, 0x04, 0xF0, 0x16, 0xFE, 0xD7, 0x48, 0xC0, 0x79, 0x00, 0x07, 0x00, 0x0F, - 0x03, 0x28, 0x03, 0xD1, 0xD5, 0x48, 0x00, 0x78, 0xD5, 0x49, 0x08, 0x70, 0x00, 0x24, 0x66, 0xE1, - 0xD4, 0x48, 0x00, 0x68, 0x00, 0x5D, 0x00, 0x28, 0x7E, 0xDD, 0x60, 0x00, 0xD2, 0x49, 0x09, 0x68, - 0x08, 0x5A, 0x61, 0x00, 0xD1, 0x4A, 0x51, 0x5A, 0x40, 0x1A, 0x05, 0xB2, 0x00, 0x2D, 0x01, 0xDA, - 0x68, 0x42, 0x05, 0xB2, 0x60, 0x00, 0xCC, 0x49, 0x09, 0x68, 0x09, 0x5A, 0x06, 0x20, 0x60, 0x43, - 0xCB, 0x4A, 0x80, 0x18, 0x40, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, - 0x03, 0xDA, 0x00, 0x98, 0x40, 0x42, 0x00, 0xB2, 0x00, 0x90, 0x60, 0x00, 0xC5, 0x49, 0x09, 0x68, - 0x08, 0x5A, 0x61, 0x00, 0xC4, 0x4A, 0x51, 0x5A, 0x40, 0x1A, 0x06, 0xB2, 0x00, 0x2E, 0x01, 0xDA, - 0x70, 0x42, 0x06, 0xB2, 0x60, 0x00, 0xBF, 0x49, 0x09, 0x68, 0x09, 0x5A, 0x06, 0x20, 0x60, 0x43, - 0xBE, 0x4A, 0x80, 0x18, 0x40, 0x88, 0x08, 0x1A, 0x07, 0xB2, 0x00, 0x2F, 0x01, 0xDA, 0x78, 0x42, - 0x07, 0xB2, 0x01, 0x20, 0x40, 0x02, 0x85, 0x42, 0x08, 0xDA, 0x86, 0x42, 0x06, 0xDA, 0x01, 0x20, - 0xA0, 0x40, 0xAC, 0x49, 0x09, 0x88, 0x08, 0x43, 0xAA, 0x49, 0x08, 0x80, 0x00, 0x98, 0xAA, 0x28, - 0x01, 0xDC, 0xAA, 0x2F, 0x17, 0xDD, 0x01, 0x20, 0xA0, 0x40, 0xA6, 0x49, 0x09, 0x88, 0x08, 0x43, - 0xA4, 0x49, 0x08, 0x80, 0x60, 0x00, 0xA8, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x61, 0x00, 0xA7, 0x4A, - 0x50, 0x52, 0x60, 0x00, 0xA7, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x61, 0x00, 0xA6, 0x4A, 0x50, 0x52, - 0x00, 0x20, 0xA7, 0x49, 0x08, 0x55, 0xA6, 0x48, 0x01, 0x5D, 0x00, 0x5D, 0x40, 0x1C, 0xA4, 0x4A, - 0x10, 0x55, 0x64, 0x29, 0x20, 0xDD, 0x61, 0x00, 0x9B, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x62, 0x00, - 0x9A, 0x4B, 0x9A, 0x5E, 0x88, 0x18, 0xC1, 0x0F, 0x09, 0x18, 0x49, 0x10, 0x09, 0xB2, 0x62, 0x00, - 0x99, 0x52, 0x61, 0x00, 0x97, 0x4A, 0x00, 0xE0, 0xE0, 0xE0, 0x12, 0x68, 0x51, 0x5E, 0x62, 0x00, - 0x95, 0x4B, 0x9A, 0x5E, 0x88, 0x18, 0xC1, 0x0F, 0x09, 0x18, 0x49, 0x10, 0x09, 0xB2, 0x62, 0x00, - 0x99, 0x52, 0x00, 0x20, 0x92, 0x49, 0x08, 0x55, 0x87, 0x48, 0x40, 0x38, 0x80, 0x79, 0x40, 0x06, - 0xC0, 0x0F, 0x23, 0xD1, 0x61, 0x00, 0x88, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x8D, 0x4A, 0x13, 0x5E, - 0x59, 0x43, 0x08, 0x46, 0x8C, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0x70, 0xF8, 0x00, 0xB2, 0x61, 0x00, - 0x81, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x61, 0x00, 0x82, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x87, 0x4A, - 0x00, 0x23, 0xD3, 0x5E, 0x59, 0x43, 0x08, 0x46, 0x85, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0x5E, 0xF8, - 0x00, 0xB2, 0x61, 0x00, 0x7B, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x23, 0xE0, 0x61, 0x00, 0x79, 0x4A, - 0x12, 0x68, 0x51, 0x5E, 0x7B, 0x4A, 0x00, 0x23, 0xD3, 0x5E, 0x59, 0x43, 0x08, 0x46, 0x7C, 0x49, - 0x09, 0x88, 0xFE, 0xF7, 0x4B, 0xF8, 0x05, 0xB2, 0x61, 0x00, 0x6F, 0x4A, 0x12, 0x68, 0x51, 0x5E, - 0x76, 0x4A, 0x00, 0x23, 0xD3, 0x5E, 0x59, 0x43, 0x08, 0x46, 0x73, 0x49, 0x09, 0x88, 0xFE, 0xF7, - 0x3D, 0xF8, 0x01, 0xB2, 0x60, 0x00, 0x6B, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x60, 0x00, 0x66, 0x49, - 0x09, 0x68, 0x0D, 0x52, 0x6F, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x01, 0x28, 0x05, 0xD0, - 0x02, 0x28, 0x11, 0xD0, 0x03, 0x28, 0x38, 0xD1, 0x1C, 0xE0, 0x37, 0xE0, 0x65, 0x48, 0x00, 0x88, - 0x41, 0x1E, 0x60, 0x00, 0x5C, 0x4A, 0x12, 0x68, 0x10, 0x5A, 0x08, 0x1A, 0x01, 0xB2, 0x60, 0x00, - 0x59, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x29, 0xE0, 0x60, 0x48, 0x00, 0x88, 0x41, 0x1E, 0x60, 0x00, - 0x58, 0x4A, 0x12, 0x68, 0x10, 0x5A, 0x08, 0x1A, 0x01, 0xB2, 0x60, 0x00, 0x55, 0x4A, 0x12, 0x68, - 0x11, 0x52, 0x1B, 0xE0, 0x57, 0x48, 0x00, 0x88, 0x40, 0x1E, 0x61, 0x00, 0x4E, 0x4A, 0x12, 0x68, - 0x51, 0x5A, 0x40, 0x1A, 0x01, 0xB2, 0x60, 0x00, 0x4B, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x53, 0x48, - 0x00, 0x88, 0x41, 0x1E, 0x60, 0x00, 0x4B, 0x4A, 0x12, 0x68, 0x10, 0x5A, 0x08, 0x1A, 0x00, 0xB2, - 0x61, 0x00, 0x48, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x00, 0xE0, 0x00, 0xBF, 0x00, 0xBF, 0x60, 0x00, - 0x41, 0x49, 0x09, 0x68, 0x08, 0x5E, 0x47, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, 0x07, 0xDB, - 0x08, 0x46, 0x00, 0x88, 0x40, 0x1E, 0x00, 0xB2, 0x61, 0x00, 0x3B, 0x4A, 0x12, 0x68, 0x50, 0x52, - 0x60, 0x00, 0x39, 0x49, 0x09, 0x68, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDA, 0x00, 0x21, 0x60, 0x00, - 0x35, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x60, 0x00, 0x36, 0x49, 0x09, 0x68, 0x08, 0x5E, 0x3B, 0x49, - 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, 0x07, 0xDB, 0x08, 0x46, 0x00, 0x88, 0x40, 0x1E, 0x01, 0xB2, - 0x60, 0x00, 0x30, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x60, 0x00, 0x2E, 0x49, 0x09, 0x68, 0x08, 0x5E, - 0x00, 0x28, 0x04, 0xDA, 0x00, 0x21, 0x60, 0x00, 0x2A, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x01, 0x20, - 0xA0, 0x40, 0x1F, 0x49, 0x09, 0x88, 0x08, 0x43, 0x1D, 0x49, 0x08, 0x80, 0x64, 0x1C, 0x2E, 0x48, - 0x00, 0x78, 0x84, 0x42, 0x00, 0xDA, 0x93, 0xE6, 0x1D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, - 0x17, 0x48, 0x00, 0x88, 0x00, 0x28, 0x15, 0xD0, 0x01, 0x20, 0x28, 0x49, 0x08, 0x70, 0x13, 0x49, - 0x08, 0x70, 0x00, 0x20, 0x26, 0x49, 0x08, 0x70, 0x26, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD1, - 0x13, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, 0x23, 0x49, 0x08, 0x70, 0x02, 0xE0, 0x01, 0x20, - 0x21, 0x49, 0x08, 0x70, 0x09, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0D, 0xD1, 0x1B, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x09, 0xD0, 0x00, 0x20, 0x19, 0x49, 0x08, 0x70, 0x01, 0x20, 0x03, 0x49, 0x08, 0x70, - 0x19, 0x49, 0x08, 0x70, 0x16, 0x49, 0x08, 0x70, 0xF8, 0xBD, 0x00, 0x00, 0x41, 0x01, 0x00, 0x20, - 0x98, 0x00, 0x00, 0x20, 0x9A, 0x00, 0x00, 0x20, 0x61, 0x04, 0x00, 0x20, 0x80, 0x03, 0x00, 0x20, - 0x56, 0x01, 0x00, 0x20, 0xE0, 0x01, 0x00, 0x20, 0xD8, 0x01, 0x00, 0x20, 0x96, 0x06, 0x00, 0x20, - 0x1E, 0x06, 0x00, 0x20, 0xDC, 0x01, 0x00, 0x20, 0xAA, 0x06, 0x00, 0x20, 0x5A, 0x06, 0x00, 0x20, - 0xBE, 0x06, 0x00, 0x20, 0x94, 0x00, 0x00, 0x20, 0x84, 0x01, 0x00, 0x20, 0x96, 0x00, 0x00, 0x20, - 0x86, 0x01, 0x00, 0x20, 0x52, 0x01, 0x00, 0x20, 0x1E, 0x02, 0x00, 0x20, 0xA4, 0x00, 0x00, 0x20, - 0xA3, 0x00, 0x00, 0x20, 0x5D, 0x01, 0x00, 0x20, 0xB1, 0x00, 0x00, 0x20, 0xF7, 0xB5, 0x00, 0x25, - 0x6C, 0x4F, 0x84, 0xB0, 0xAC, 0x46, 0xAE, 0x46, 0x2C, 0x46, 0x29, 0x46, 0x28, 0x46, 0x01, 0x2A, - 0x04, 0xD1, 0xFA, 0x7A, 0x6B, 0x46, 0x1A, 0x71, 0x3E, 0x7B, 0x03, 0xE0, 0xBA, 0x7B, 0x6B, 0x46, - 0x1A, 0x71, 0xFE, 0x7B, 0x6B, 0x46, 0x5E, 0x71, 0x9A, 0x71, 0xDE, 0x71, 0xF3, 0xB2, 0x61, 0x4A, - 0x03, 0x93, 0x92, 0x7C, 0x00, 0x2B, 0x03, 0xD1, 0x6B, 0x46, 0xDB, 0x79, 0x00, 0x2B, 0x00, 0xD0, - 0x52, 0x00, 0x5C, 0x4F, 0x6B, 0x46, 0x3E, 0x7C, 0x1E, 0x70, 0x5E, 0x70, 0x7E, 0x7C, 0x9E, 0x70, - 0xDE, 0x70, 0xA6, 0xE0, 0x04, 0x9B, 0x9B, 0x5C, 0x01, 0x2B, 0x4E, 0xD1, 0x52, 0x1C, 0x04, 0x9B, - 0x92, 0xB2, 0x9B, 0x5C, 0x02, 0x93, 0x3E, 0xE0, 0x00, 0x2D, 0x2F, 0xD1, 0x04, 0x9E, 0x63, 0x46, - 0xF3, 0x5C, 0x05, 0x9F, 0x9E, 0x46, 0x63, 0x46, 0x5B, 0x1C, 0xDB, 0xB2, 0x9C, 0x46, 0x73, 0x46, - 0x9B, 0x00, 0xFF, 0x3B, 0xFF, 0x3B, 0x02, 0x3B, 0x46, 0x00, 0xBB, 0x53, 0x6E, 0x46, 0x73, 0x5C, - 0x40, 0x1C, 0x5B, 0x1E, 0xDB, 0xB2, 0x73, 0x54, 0x01, 0xAE, 0x36, 0x5D, 0x80, 0xB2, 0x00, 0x2E, - 0x02, 0xD1, 0x64, 0x1C, 0xE4, 0xB2, 0x01, 0xE0, 0x76, 0x1E, 0xF5, 0xB2, 0x00, 0x2B, 0x0D, 0xD1, - 0x03, 0x9B, 0x00, 0x2B, 0x06, 0xD1, 0x6B, 0x46, 0xDB, 0x79, 0x00, 0x2B, 0x02, 0xD1, 0x89, 0x1C, - 0xC9, 0xB2, 0x03, 0xE0, 0x49, 0x1C, 0x64, 0x1C, 0xC9, 0xB2, 0xE4, 0xB2, 0x73, 0x46, 0x9B, 0x00, - 0xFF, 0x3B, 0x46, 0x00, 0xFF, 0x3B, 0x02, 0x3B, 0x05, 0x9F, 0x40, 0x1C, 0xBB, 0x53, 0x6D, 0x1E, - 0x02, 0x9B, 0x80, 0xB2, 0xED, 0xB2, 0x5E, 0x1E, 0xB6, 0xB2, 0x02, 0x96, 0x00, 0x2B, 0x56, 0xD0, - 0x23, 0x23, 0x1B, 0x01, 0x98, 0x42, 0xB7, 0xD3, 0x51, 0xE0, 0xFF, 0x2B, 0x57, 0xD0, 0x00, 0x2D, - 0x2F, 0xD1, 0x04, 0x9B, 0x66, 0x46, 0x9B, 0x5D, 0x05, 0x9F, 0x9E, 0x46, 0x63, 0x46, 0x5B, 0x1C, - 0xDB, 0xB2, 0x9C, 0x46, 0x73, 0x46, 0x9B, 0x00, 0xFF, 0x3B, 0xFF, 0x3B, 0x02, 0x3B, 0x46, 0x00, - 0xBB, 0x53, 0x6E, 0x46, 0x73, 0x5C, 0x40, 0x1C, 0x5B, 0x1E, 0xDB, 0xB2, 0x73, 0x54, 0x01, 0xAE, - 0x36, 0x5D, 0x80, 0xB2, 0x00, 0x2E, 0x02, 0xD1, 0x64, 0x1C, 0xE4, 0xB2, 0x01, 0xE0, 0x76, 0x1E, - 0xF5, 0xB2, 0x00, 0x2B, 0x0D, 0xD1, 0x03, 0x9B, 0x00, 0x2B, 0x06, 0xD1, 0x6B, 0x46, 0xDB, 0x79, - 0x00, 0x2B, 0x02, 0xD1, 0x89, 0x1C, 0xC9, 0xB2, 0x03, 0xE0, 0x49, 0x1C, 0x64, 0x1C, 0xC9, 0xB2, - 0xE4, 0xB2, 0x14, 0x4F, 0x04, 0x9B, 0x3E, 0x7D, 0x9B, 0x5C, 0xB6, 0x08, 0xB3, 0x42, 0x07, 0xD9, - 0xFF, 0x27, 0x01, 0x37, 0xBE, 0x1B, 0xB3, 0x42, 0x02, 0xD2, 0x0E, 0x4E, 0x01, 0x23, 0x73, 0x72, - 0x04, 0x9B, 0x46, 0x00, 0x9B, 0x5C, 0x40, 0x1C, 0x73, 0x44, 0x1B, 0x06, 0x9B, 0x0D, 0xFF, 0x3B, - 0xFF, 0x3B, 0x02, 0x3B, 0x05, 0x9F, 0x6D, 0x1E, 0xBB, 0x53, 0x80, 0xB2, 0xED, 0xB2, 0x52, 0x1C, - 0x92, 0xB2, 0x05, 0x4B, 0x9A, 0x42, 0x02, 0xD2, 0x98, 0x42, 0x00, 0xD2, 0x52, 0xE7, 0x07, 0xB0, - 0xF0, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0x31, 0x02, 0x00, 0x00, 0x70, 0xB5, 0x08, 0x49, - 0x09, 0x78, 0xFF, 0x22, 0xF0, 0x32, 0x51, 0x43, 0x08, 0x46, 0x3C, 0x21, 0xFD, 0xF7, 0x5E, 0xFE, - 0x85, 0xB2, 0x00, 0x24, 0x01, 0xE0, 0x60, 0x1C, 0x84, 0xB2, 0xAC, 0x42, 0xFB, 0xDB, 0x70, 0xBD, - 0xC2, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x08, 0x49, 0x09, 0x78, 0x28, 0x22, 0x51, 0x43, 0x08, 0x46, - 0x3C, 0x21, 0xFD, 0xF7, 0x4B, 0xFE, 0xC5, 0xB2, 0x00, 0x24, 0x01, 0xE0, 0x60, 0x1C, 0xC4, 0xB2, - 0xAC, 0x42, 0xFB, 0xDB, 0x70, 0xBD, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x08, 0x49, - 0x09, 0x78, 0x08, 0x4A, 0x51, 0x43, 0x08, 0x46, 0x3C, 0x21, 0xFD, 0xF7, 0x37, 0xFE, 0x85, 0xB2, - 0x00, 0x24, 0x01, 0xE0, 0x60, 0x1C, 0x84, 0xB2, 0xAC, 0x42, 0xFB, 0xDB, 0x70, 0xBD, 0x00, 0x00, - 0xC2, 0x00, 0x00, 0x20, 0x1E, 0x14, 0x00, 0x00, 0x70, 0xB5, 0x08, 0x49, 0x09, 0x78, 0x0E, 0x22, - 0x51, 0x43, 0x08, 0x46, 0x3C, 0x21, 0xFD, 0xF7, 0x21, 0xFE, 0xC5, 0xB2, 0x00, 0x24, 0x01, 0xE0, - 0x60, 0x1C, 0xC4, 0xB2, 0xAC, 0x42, 0xFB, 0xDB, 0x70, 0xBD, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x20, - 0x10, 0xB5, 0x04, 0x46, 0x01, 0xE0, 0xFF, 0xF7, 0xD1, 0xFF, 0x20, 0x46, 0x61, 0x1E, 0xCC, 0xB2, - 0x00, 0x28, 0xF8, 0xD1, 0x10, 0xBD, 0x00, 0x00, 0x07, 0x49, 0x09, 0x68, 0x02, 0x22, 0x91, 0x43, - 0x00, 0x28, 0x01, 0xD0, 0x01, 0x22, 0x00, 0xE0, 0x00, 0x22, 0x52, 0x00, 0x02, 0x23, 0x1A, 0x40, - 0x11, 0x43, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0xC0, 0x00, 0x50, 0x03, 0x48, 0x00, 0x68, - 0x40, 0x08, 0x40, 0x00, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x50, - 0x07, 0x48, 0x40, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x05, 0x49, 0x48, 0x60, 0x05, 0x48, - 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x02, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x50, 0x00, 0xC0, 0x00, 0x50, 0x01, 0x46, 0x1A, 0x48, 0xC0, 0x68, 0x00, 0x09, - 0x00, 0x01, 0x80, 0x1C, 0x17, 0x4A, 0xD0, 0x60, 0x10, 0x46, 0xC0, 0x68, 0x10, 0x22, 0x90, 0x43, - 0x14, 0x4A, 0xD0, 0x60, 0x10, 0x46, 0xC0, 0x68, 0x20, 0x22, 0x90, 0x43, 0x20, 0x30, 0x11, 0x4A, - 0xD0, 0x60, 0x10, 0x46, 0x41, 0x60, 0x00, 0x69, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x10, 0x61, - 0xBF, 0xF3, 0x60, 0x8F, 0x00, 0xBF, 0x0B, 0x48, 0x00, 0x69, 0xC0, 0x07, 0xC0, 0x0F, 0xFA, 0xD1, - 0x08, 0x48, 0x00, 0x68, 0x40, 0x06, 0xC0, 0x0F, 0x01, 0x28, 0x08, 0xD1, 0x05, 0x48, 0x00, 0x68, - 0x40, 0x22, 0x90, 0x43, 0x40, 0x30, 0x03, 0x4A, 0x10, 0x60, 0x03, 0x48, 0x70, 0x47, 0x00, 0x20, - 0xFC, 0xE7, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x50, 0x81, 0x88, 0xFF, 0xFF, 0x02, 0x46, 0x1C, 0x48, - 0xC0, 0x68, 0x00, 0x09, 0x00, 0x01, 0x1A, 0x4B, 0xD8, 0x60, 0x18, 0x46, 0xC0, 0x68, 0x10, 0x23, - 0x98, 0x43, 0x17, 0x4B, 0xD8, 0x60, 0x18, 0x46, 0xC0, 0x68, 0x20, 0x23, 0x98, 0x43, 0x14, 0x4B, - 0xD8, 0x60, 0x18, 0x46, 0x42, 0x60, 0x00, 0x20, 0x98, 0x60, 0x18, 0x46, 0x00, 0x69, 0x40, 0x08, - 0x40, 0x00, 0x40, 0x1C, 0x18, 0x61, 0xBF, 0xF3, 0x60, 0x8F, 0x00, 0xBF, 0x0C, 0x48, 0x00, 0x69, - 0xC0, 0x07, 0xC0, 0x0F, 0xFA, 0xD1, 0x0A, 0x48, 0x00, 0x68, 0x40, 0x06, 0xC0, 0x0F, 0x01, 0x28, - 0x08, 0xD1, 0x07, 0x48, 0x00, 0x68, 0x40, 0x23, 0x98, 0x43, 0x40, 0x30, 0x04, 0x4B, 0x18, 0x60, - 0x04, 0x48, 0x70, 0x47, 0x02, 0x48, 0x80, 0x68, 0x08, 0x60, 0x00, 0x20, 0xF9, 0xE7, 0x00, 0x00, - 0x00, 0xC0, 0x00, 0x50, 0x81, 0x88, 0xFF, 0xFF, 0x02, 0x46, 0x1A, 0x48, 0xC0, 0x68, 0x00, 0x09, - 0x00, 0x01, 0x40, 0x1C, 0x17, 0x4B, 0xD8, 0x60, 0x18, 0x46, 0xC0, 0x68, 0x10, 0x23, 0x98, 0x43, - 0x14, 0x4B, 0xD8, 0x60, 0x18, 0x46, 0xC0, 0x68, 0x20, 0x23, 0x98, 0x43, 0x20, 0x30, 0x11, 0x4B, - 0xD8, 0x60, 0x18, 0x46, 0x42, 0x60, 0x81, 0x60, 0x00, 0x69, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, - 0x18, 0x61, 0xBF, 0xF3, 0x60, 0x8F, 0x00, 0xBF, 0x0A, 0x48, 0x00, 0x69, 0xC0, 0x07, 0xC0, 0x0F, - 0xFA, 0xD1, 0x08, 0x48, 0x00, 0x68, 0x40, 0x06, 0xC0, 0x0F, 0x01, 0x28, 0x08, 0xD1, 0x05, 0x48, - 0x00, 0x68, 0x40, 0x23, 0x98, 0x43, 0x40, 0x30, 0x02, 0x4B, 0x18, 0x60, 0x02, 0x48, 0x70, 0x47, - 0x00, 0x20, 0xFC, 0xE7, 0x00, 0xC0, 0x00, 0x50, 0x81, 0x88, 0xFF, 0xFF, 0x10, 0xB5, 0x03, 0x46, - 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, 0x05, 0x48, 0x10, 0xBD, 0x98, 0x01, 0x05, 0x4C, - 0x02, 0x19, 0x90, 0x68, 0x01, 0x24, 0x8C, 0x40, 0xA0, 0x43, 0x90, 0x60, 0x00, 0x20, 0xF4, 0xE7, - 0x01, 0x89, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0x50, 0x70, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x0E, 0x48, - 0xA1, 0x01, 0x46, 0x18, 0x01, 0x22, 0xAA, 0x40, 0x28, 0x46, 0x10, 0x30, 0x01, 0x21, 0x81, 0x40, - 0x0A, 0x43, 0x30, 0x68, 0x90, 0x43, 0x30, 0x60, 0x00, 0x2C, 0x01, 0xD0, 0x01, 0x2C, 0x02, 0xD1, - 0x04, 0x20, 0x05, 0xF0, 0x27, 0xF9, 0x02, 0x2C, 0x01, 0xD0, 0x03, 0x2C, 0x02, 0xD1, 0x05, 0x20, - 0x05, 0xF0, 0x20, 0xF9, 0x00, 0x20, 0x70, 0xBD, 0x1C, 0x40, 0x00, 0x50, 0xFF, 0xB5, 0x81, 0xB0, - 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x02, 0x2E, 0x05, 0xD1, 0x04, 0x98, 0x01, 0x28, 0x02, 0xD1, - 0x2F, 0x48, 0x05, 0xB0, 0xF0, 0xBD, 0x01, 0x2C, 0x05, 0xD1, 0x0E, 0x2D, 0x01, 0xD0, 0x0F, 0x2D, - 0x01, 0xD1, 0x2B, 0x48, 0xF5, 0xE7, 0x2B, 0x48, 0xA1, 0x01, 0x47, 0x18, 0x00, 0x2E, 0x07, 0xD1, - 0x39, 0x68, 0x28, 0x46, 0x10, 0x30, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, 0x39, 0x60, 0x16, 0xE0, - 0x01, 0x2E, 0x05, 0xD1, 0x39, 0x68, 0x01, 0x20, 0xA8, 0x40, 0x01, 0x43, 0x39, 0x60, 0x0E, 0xE0, - 0x02, 0x2E, 0x0A, 0xD1, 0x38, 0x68, 0x01, 0x21, 0xA9, 0x40, 0x08, 0x43, 0x29, 0x46, 0x10, 0x31, - 0x01, 0x22, 0x8A, 0x40, 0x10, 0x43, 0x38, 0x60, 0x01, 0xE0, 0x19, 0x48, 0xD1, 0xE7, 0x19, 0x48, - 0x00, 0x1F, 0xA1, 0x01, 0x47, 0x18, 0x04, 0x98, 0x00, 0x28, 0x05, 0xD1, 0x39, 0x68, 0x01, 0x20, - 0xA8, 0x40, 0x81, 0x43, 0x39, 0x60, 0x0A, 0xE0, 0x04, 0x98, 0x01, 0x28, 0x05, 0xD1, 0x38, 0x68, - 0x01, 0x21, 0xA9, 0x40, 0x08, 0x43, 0x38, 0x60, 0x01, 0xE0, 0x0D, 0x48, 0xB9, 0xE7, 0x00, 0x2C, - 0x01, 0xD0, 0x01, 0x2C, 0x06, 0xD1, 0x02, 0x21, 0x04, 0x20, 0x05, 0xF0, 0x31, 0xF9, 0x04, 0x20, - 0x05, 0xF0, 0xDE, 0xF8, 0x02, 0x2C, 0x01, 0xD0, 0x03, 0x2C, 0x06, 0xD1, 0x02, 0x21, 0x05, 0x20, - 0x05, 0xF0, 0x26, 0xF9, 0x05, 0x20, 0x05, 0xF0, 0xD3, 0xF8, 0x00, 0x20, 0xA1, 0xE7, 0x00, 0x00, - 0x01, 0x89, 0xFF, 0xFF, 0x1C, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, - 0x10, 0x29, 0x01, 0xDD, 0x04, 0x48, 0x10, 0xBD, 0x04, 0x48, 0x9C, 0x01, 0x02, 0x19, 0x10, 0x68, - 0xC8, 0x40, 0xC0, 0x07, 0xC0, 0x0F, 0xF6, 0xE7, 0x01, 0x89, 0xFF, 0xFF, 0x10, 0x40, 0x00, 0x50, - 0x10, 0xB5, 0x01, 0x46, 0x0B, 0x46, 0x08, 0xF0, 0x8E, 0xFC, 0x18, 0x0D, 0x15, 0x26, 0x27, 0x28, - 0x29, 0x2A, 0x2B, 0x82, 0x92, 0xA2, 0xB3, 0xC3, 0xD3, 0xE3, 0xF7, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, - 0xF0, 0xEF, 0xEE, 0xED, 0x00, 0x20, 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, 0x58, 0x63, 0x98, 0x63, - 0xD8, 0x63, 0x66, 0xE1, 0x05, 0x20, 0x00, 0x07, 0x00, 0x6B, 0x03, 0x23, 0x9B, 0x02, 0x18, 0x43, - 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, 0xB0, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x02, 0x98, 0x43, - 0xAD, 0x4B, 0x18, 0x61, 0x55, 0xE1, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, - 0x02, 0x29, 0x03, 0xDB, 0x04, 0x29, 0x01, 0xDC, 0x00, 0x22, 0x00, 0xE0, 0x04, 0x22, 0x02, 0x29, - 0x01, 0xD0, 0x05, 0x29, 0x17, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x44, 0x6B, 0x0F, 0x23, 0x93, 0x40, - 0x1C, 0x43, 0x44, 0x63, 0x02, 0x29, 0x06, 0xD1, 0x9F, 0x48, 0x00, 0x69, 0x8B, 0x02, 0x98, 0x43, - 0x9D, 0x4B, 0x18, 0x61, 0x3A, 0xE0, 0x9C, 0x48, 0x00, 0x69, 0x07, 0x23, 0xDB, 0x03, 0x98, 0x43, - 0x99, 0x4B, 0x18, 0x61, 0x32, 0xE0, 0x03, 0x29, 0x01, 0xD0, 0x06, 0x29, 0x10, 0xD1, 0x05, 0x20, - 0x00, 0x07, 0x44, 0x6B, 0x03, 0x23, 0x93, 0x40, 0x1C, 0x43, 0x44, 0x63, 0x06, 0x29, 0x25, 0xD1, - 0x91, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x03, 0x98, 0x43, 0x8F, 0x4B, 0x18, 0x61, 0x1D, 0xE0, - 0x04, 0x29, 0x01, 0xD0, 0x07, 0x29, 0x19, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x44, 0x6B, 0x90, 0x1C, - 0x03, 0x23, 0x83, 0x40, 0x1C, 0x43, 0x05, 0x20, 0x00, 0x07, 0x44, 0x63, 0x04, 0x29, 0x06, 0xD1, - 0x85, 0x48, 0x00, 0x69, 0x4B, 0x02, 0x98, 0x43, 0x83, 0x4B, 0x18, 0x61, 0x06, 0xE0, 0x82, 0x48, - 0x00, 0x69, 0x03, 0x23, 0x1B, 0x04, 0x98, 0x43, 0x7F, 0x4B, 0x18, 0x61, 0xF9, 0xE0, 0x05, 0x20, - 0x00, 0x07, 0x80, 0x6B, 0x0F, 0x23, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x98, 0x63, 0x7A, 0x48, - 0x00, 0x69, 0xFF, 0x23, 0xE1, 0x33, 0x98, 0x43, 0x77, 0x4B, 0x18, 0x61, 0xE9, 0xE0, 0x05, 0x20, - 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, 0x9B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, - 0x71, 0x48, 0x00, 0x69, 0x01, 0x23, 0x18, 0x43, 0x6F, 0x4B, 0x18, 0x61, 0xD9, 0xE0, 0x05, 0x20, - 0x00, 0x07, 0x80, 0x6B, 0x0F, 0x23, 0x1B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x98, 0x63, - 0x69, 0x48, 0x00, 0x69, 0x0F, 0x23, 0x1B, 0x04, 0x98, 0x43, 0x67, 0x4B, 0x18, 0x61, 0xC8, 0xE0, - 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, 0x5B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, - 0x58, 0x63, 0x61, 0x48, 0x00, 0x69, 0x02, 0x23, 0x18, 0x43, 0x5F, 0x4B, 0x18, 0x61, 0xB8, 0xE0, - 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x10, 0x23, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, - 0x59, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x03, 0x18, 0x43, 0x57, 0x4B, 0x18, 0x61, 0xA8, 0xE0, - 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, 0x9B, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, - 0x58, 0x63, 0x51, 0x48, 0x00, 0x69, 0x08, 0x23, 0x98, 0x43, 0x4F, 0x4B, 0x18, 0x61, 0x98, 0xE0, - 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, 0xDB, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, - 0x58, 0x63, 0x8E, 0xE0, 0x8B, 0xE0, 0x53, 0xE0, 0x51, 0xE0, 0x30, 0xE0, 0x2E, 0xE0, 0x50, 0xE0, - 0x2E, 0xE0, 0x1B, 0xE0, 0x0A, 0xE0, 0xFF, 0xE7, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0xFF, 0x23, - 0x01, 0x33, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x7A, 0xE0, 0x05, 0x20, 0x00, 0x07, - 0x40, 0x6B, 0x01, 0x23, 0x5B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x3A, 0x48, - 0x00, 0x69, 0x02, 0x23, 0x98, 0x43, 0x38, 0x4B, 0x18, 0x61, 0x6A, 0xE0, 0x05, 0x20, 0x00, 0x07, - 0x40, 0x6B, 0x01, 0x23, 0x9B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x32, 0x48, - 0x00, 0x69, 0x40, 0x08, 0x40, 0x00, 0x30, 0x4B, 0x18, 0x61, 0x5A, 0xE0, 0x00, 0xBF, 0x00, 0xBF, - 0x12, 0x29, 0x09, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x00, 0x6B, 0x03, 0x23, 0x1B, 0x03, 0x18, 0x43, - 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, 0x0A, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x04, 0x6B, 0x0B, 0x46, - 0x08, 0x3B, 0x01, 0x20, 0x98, 0x40, 0x04, 0x43, 0x05, 0x20, 0x00, 0x07, 0x04, 0x63, 0x22, 0x48, - 0x00, 0x69, 0x01, 0x23, 0xDB, 0x02, 0x98, 0x43, 0x1F, 0x4B, 0x18, 0x61, 0x39, 0xE0, 0x00, 0xBF, - 0x00, 0xBF, 0x13, 0x29, 0x16, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x00, 0x6B, 0x03, 0x23, 0x9B, 0x03, - 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, 0x17, 0x48, 0x00, 0x69, 0x01, 0x23, 0x5B, 0x02, - 0x98, 0x43, 0x15, 0x4B, 0x18, 0x61, 0x18, 0x46, 0x00, 0x69, 0x5B, 0x01, 0x98, 0x43, 0x12, 0x4B, - 0x18, 0x61, 0x1B, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x04, 0x6B, 0x0B, 0x46, 0x08, 0x3B, 0x01, 0x20, - 0x98, 0x40, 0x04, 0x43, 0x05, 0x20, 0x00, 0x07, 0x04, 0x63, 0x16, 0x29, 0x07, 0xD1, 0x0A, 0x48, - 0x00, 0x69, 0x01, 0x23, 0xDB, 0x02, 0x98, 0x43, 0x07, 0x4B, 0x18, 0x61, 0x06, 0xE0, 0x06, 0x48, - 0x00, 0x69, 0x01, 0x23, 0x5B, 0x02, 0x98, 0x43, 0x03, 0x4B, 0x18, 0x61, 0x01, 0xE0, 0x03, 0x48, - 0x10, 0xBD, 0x00, 0xBF, 0x00, 0x20, 0xFB, 0xE7, 0x40, 0x00, 0x00, 0x50, 0x01, 0x89, 0xFF, 0xFF, - 0x70, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, 0x17, 0x48, 0x70, 0xBD, - 0x98, 0x01, 0x17, 0x4D, 0x44, 0x19, 0x00, 0x2A, 0x03, 0xD0, 0x01, 0x2A, 0x01, 0xD0, 0x02, 0x2A, - 0x17, 0xD1, 0x25, 0x68, 0x4E, 0x00, 0x03, 0x20, 0xB0, 0x40, 0x85, 0x43, 0x25, 0x60, 0x01, 0x2A, - 0x06, 0xD1, 0x25, 0x68, 0x4E, 0x00, 0x01, 0x20, 0xB0, 0x40, 0x05, 0x43, 0x25, 0x60, 0x13, 0xE0, - 0x02, 0x2A, 0x11, 0xD1, 0x20, 0x68, 0x4E, 0x00, 0x02, 0x25, 0xB5, 0x40, 0x28, 0x43, 0x20, 0x60, - 0x0A, 0xE0, 0x03, 0x2A, 0x06, 0xD1, 0x20, 0x68, 0x4E, 0x00, 0x03, 0x25, 0xB5, 0x40, 0x28, 0x43, - 0x20, 0x60, 0x01, 0xE0, 0x01, 0x48, 0xD2, 0xE7, 0x00, 0x20, 0xD0, 0xE7, 0x01, 0x89, 0xFF, 0xFF, - 0x00, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, - 0x05, 0x48, 0x10, 0xBD, 0x98, 0x01, 0x05, 0x4C, 0x02, 0x19, 0x90, 0x68, 0x01, 0x24, 0x8C, 0x40, - 0x20, 0x43, 0x90, 0x60, 0x00, 0x20, 0xF4, 0xE7, 0x01, 0x89, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0x50, - 0x02, 0x4A, 0x10, 0x60, 0x12, 0x1D, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x18, 0x01, 0x00, 0x20, - 0x0F, 0x48, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, 0x0D, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, 0x07, - 0xC0, 0x68, 0x49, 0x15, 0x88, 0x43, 0x40, 0x18, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x08, 0x46, - 0xC0, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x05, 0x48, - 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x02, 0x49, 0x88, 0x60, 0x00, 0x20, 0x70, 0x47, - 0x00, 0x00, 0x12, 0x40, 0x00, 0x02, 0x00, 0x50, 0x10, 0xB5, 0x0A, 0x48, 0x00, 0x68, 0x80, 0x21, - 0x88, 0x43, 0x80, 0x30, 0x07, 0x49, 0x08, 0x60, 0x02, 0x21, 0x13, 0x20, 0x04, 0xF0, 0x70, 0xFF, - 0x00, 0xBF, 0x13, 0x21, 0x01, 0x20, 0x88, 0x40, 0x03, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x00, 0x20, - 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x00, 0xE1, 0x00, 0xE0, 0x02, 0x46, 0x00, 0x2A, - 0x06, 0xD0, 0x01, 0x2A, 0x07, 0xD0, 0x02, 0x2A, 0x08, 0xD0, 0x03, 0x2A, 0x0C, 0xD1, 0x08, 0xE0, - 0x08, 0x48, 0x01, 0x60, 0x0A, 0xE0, 0x07, 0x48, 0x41, 0x60, 0x07, 0xE0, 0x05, 0x48, 0x81, 0x60, - 0x04, 0xE0, 0x04, 0x48, 0xC1, 0x60, 0x01, 0xE0, 0x03, 0x48, 0x70, 0x47, 0x00, 0xBF, 0x00, 0x20, - 0xFB, 0xE7, 0x00, 0x00, 0x70, 0x1A, 0x00, 0x20, 0x01, 0x8B, 0xFF, 0xFF, 0x70, 0xB5, 0x04, 0x46, - 0xA1, 0x00, 0x19, 0x4A, 0x12, 0x68, 0x0A, 0x23, 0x5A, 0x43, 0x10, 0x46, 0xFD, 0xF7, 0x1C, 0xFA, - 0x46, 0x1D, 0x0A, 0x21, 0x30, 0x46, 0xFD, 0xF7, 0x17, 0xFA, 0x45, 0x1E, 0x13, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x40, 0x18, 0x10, 0x49, 0x88, 0x60, 0x05, 0x20, 0x00, 0x07, - 0xC0, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x40, 0x18, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, - 0x08, 0x46, 0xC0, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, - 0x07, 0x48, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, 0x40, 0x30, 0x05, 0x49, 0x08, 0x60, 0x08, 0x46, - 0x05, 0x61, 0x00, 0x20, 0x70, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x50, - 0x00, 0x00, 0x12, 0x40, 0x01, 0x48, 0x80, 0x68, 0xC0, 0xB2, 0x70, 0x47, 0x00, 0x00, 0x12, 0x40, - 0x30, 0xB5, 0x03, 0x46, 0x00, 0x2B, 0x06, 0xD0, 0x01, 0x2B, 0x17, 0xD0, 0x02, 0x2B, 0x28, 0xD0, - 0x03, 0x2B, 0x4C, 0xD1, 0x38, 0xE0, 0x28, 0x48, 0x44, 0x68, 0xFE, 0x20, 0x84, 0x43, 0x48, 0x00, - 0xFE, 0x25, 0x28, 0x40, 0x04, 0x43, 0x24, 0x48, 0x44, 0x60, 0x40, 0x68, 0x40, 0x08, 0x40, 0x00, - 0xD4, 0x07, 0xE4, 0x0F, 0x20, 0x43, 0x20, 0x4C, 0x60, 0x60, 0x3A, 0xE0, 0x1E, 0x48, 0x84, 0x69, - 0xFE, 0x20, 0x84, 0x43, 0x48, 0x00, 0xFE, 0x25, 0x28, 0x40, 0x04, 0x43, 0x1A, 0x48, 0x84, 0x61, - 0x80, 0x69, 0x40, 0x08, 0x40, 0x00, 0xD4, 0x07, 0xE4, 0x0F, 0x20, 0x43, 0x16, 0x4C, 0xA0, 0x61, - 0x27, 0xE0, 0x15, 0x48, 0xC4, 0x69, 0xFE, 0x20, 0x84, 0x43, 0x48, 0x00, 0xFE, 0x25, 0x28, 0x40, - 0x04, 0x43, 0x11, 0x48, 0xC4, 0x61, 0xC0, 0x69, 0x40, 0x08, 0x40, 0x00, 0xD4, 0x07, 0xE4, 0x0F, - 0x20, 0x43, 0x0D, 0x4C, 0xE0, 0x61, 0x14, 0xE0, 0x0B, 0x48, 0x04, 0x6A, 0xFE, 0x20, 0x84, 0x43, - 0x48, 0x00, 0xFE, 0x25, 0x28, 0x40, 0x04, 0x43, 0x07, 0x48, 0x04, 0x62, 0x00, 0x6A, 0x40, 0x08, - 0x40, 0x00, 0xD4, 0x07, 0xE4, 0x0F, 0x20, 0x43, 0x03, 0x4C, 0x20, 0x62, 0x01, 0xE0, 0x03, 0x48, - 0x30, 0xBD, 0x00, 0xBF, 0x00, 0x20, 0xFB, 0xE7, 0x00, 0x00, 0x12, 0x40, 0x01, 0x8B, 0xFF, 0xFF, - 0x01, 0x49, 0x88, 0x60, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x08, 0x49, 0x09, 0x68, - 0x41, 0x43, 0x08, 0x4A, 0x51, 0x61, 0x00, 0x21, 0x91, 0x61, 0x05, 0x21, 0x11, 0x61, 0x00, 0xBF, - 0x04, 0x49, 0x09, 0x69, 0x01, 0x22, 0x12, 0x04, 0x11, 0x42, 0xF9, 0xD0, 0x70, 0x47, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xB5, 0x01, 0x46, 0x0B, 0x46, 0x08, 0xF0, - 0x92, 0xF9, 0x05, 0x04, 0x09, 0x0E, 0x13, 0x18, 0x1D, 0x00, 0x0F, 0x48, 0xC0, 0x68, 0xC2, 0x07, - 0xD2, 0x0F, 0x15, 0xE0, 0x0C, 0x48, 0xC0, 0x68, 0x80, 0x07, 0xC2, 0x0F, 0x10, 0xE0, 0x0A, 0x48, - 0xC0, 0x68, 0xC0, 0x06, 0xC2, 0x0F, 0x0B, 0xE0, 0x07, 0x48, 0xC0, 0x68, 0x00, 0x07, 0xC2, 0x0F, - 0x06, 0xE0, 0x05, 0x48, 0xC0, 0x68, 0x40, 0x07, 0xC2, 0x0F, 0x01, 0xE0, 0x03, 0x48, 0x00, 0xBD, - 0x00, 0xBF, 0x10, 0x46, 0xFB, 0xE7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x03, 0x96, 0xFF, 0xFF, - 0x00, 0x48, 0x70, 0x47, 0x00, 0x1B, 0xB7, 0x00, 0x7F, 0xB5, 0x00, 0x24, 0x18, 0x48, 0x6E, 0x46, - 0x2E, 0xC8, 0x2E, 0xC6, 0x17, 0x48, 0x00, 0x6A, 0x00, 0x03, 0xC0, 0x0F, 0x01, 0x28, 0x01, 0xD1, - 0x15, 0x4D, 0x00, 0xE0, 0x15, 0x4D, 0x13, 0x48, 0x00, 0x6A, 0xC0, 0x03, 0xC0, 0x0F, 0x01, 0x28, - 0x01, 0xD1, 0x00, 0x24, 0x19, 0xE0, 0x0F, 0x4A, 0x12, 0x6A, 0x92, 0x04, 0xD2, 0x0E, 0x91, 0x1C, - 0x0C, 0x4A, 0x12, 0x6A, 0xD2, 0x05, 0xD2, 0x0D, 0x92, 0x1C, 0x6A, 0x43, 0x10, 0x46, 0xFD, 0xF7, - 0x13, 0xF9, 0x06, 0x46, 0x07, 0x48, 0x00, 0x6A, 0x00, 0x04, 0x80, 0x0F, 0x80, 0x00, 0x6A, 0x46, - 0x11, 0x58, 0x30, 0x46, 0xFD, 0xF7, 0x08, 0xF9, 0x04, 0x46, 0x20, 0x46, 0x04, 0xB0, 0x70, 0xBD, - 0x60, 0xC9, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x00, 0x80, 0x51, 0x01, 0x00, 0x1B, 0xB7, 0x00, - 0xFE, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x28, 0x48, 0x01, 0x90, 0x00, 0x20, 0x00, 0x90, 0x27, 0x48, - 0x85, 0x42, 0x06, 0xD2, 0x26, 0x48, 0x85, 0x42, 0x03, 0xD3, 0x03, 0x20, 0x02, 0x90, 0xAD, 0x00, - 0x14, 0xE0, 0x24, 0x48, 0x85, 0x42, 0x06, 0xD2, 0x40, 0x10, 0x85, 0x42, 0x03, 0xD3, 0x01, 0x20, - 0x02, 0x90, 0x6D, 0x00, 0x0A, 0xE0, 0x20, 0x48, 0x85, 0x42, 0x05, 0xD8, 0x40, 0x10, 0x85, 0x42, - 0x02, 0xD3, 0x00, 0x20, 0x02, 0x90, 0x01, 0xE0, 0x1C, 0x48, 0xFE, 0xBD, 0x00, 0x2C, 0x02, 0xD1, - 0x15, 0x48, 0x01, 0x90, 0x03, 0xE0, 0x01, 0x2C, 0x01, 0xD1, 0x19, 0x48, 0x01, 0x90, 0x19, 0x49, - 0x28, 0x46, 0xFD, 0xF7, 0xC9, 0xF8, 0x07, 0x46, 0x16, 0x49, 0x01, 0x98, 0xFD, 0xF7, 0xC4, 0xF8, - 0x06, 0x46, 0x0C, 0xE0, 0xF0, 0x07, 0xC0, 0x0F, 0x06, 0xD1, 0xF8, 0x07, 0xC0, 0x0F, 0x03, 0xD1, - 0x02, 0x2E, 0x01, 0xD0, 0x02, 0x2F, 0x00, 0xD1, 0x02, 0xE0, 0x76, 0x08, 0x7F, 0x08, 0xF1, 0xE7, - 0x00, 0xBF, 0x02, 0x98, 0x80, 0x03, 0xB1, 0x1E, 0x49, 0x02, 0x08, 0x43, 0xB9, 0x1E, 0x08, 0x43, - 0x00, 0x90, 0x00, 0x98, 0xD1, 0xE7, 0x00, 0x00, 0x00, 0x1B, 0xB7, 0x00, 0x40, 0x59, 0x73, 0x07, - 0x40, 0x78, 0x7D, 0x01, 0x80, 0xB2, 0xE6, 0x0E, 0x00, 0x65, 0xCD, 0x1D, 0x2E, 0xC2, 0x00, 0x00, - 0x00, 0x80, 0x51, 0x01, 0x40, 0x42, 0x0F, 0x00, 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, 0x2B, 0x48, - 0x84, 0x42, 0x02, 0xD8, 0x2A, 0x48, 0x84, 0x42, 0x01, 0xD2, 0x2A, 0x48, 0x70, 0xBD, 0x2A, 0x48, - 0x00, 0x6A, 0x00, 0x03, 0xC0, 0x0F, 0x1B, 0xD1, 0x27, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, - 0x40, 0x1C, 0x25, 0x49, 0x08, 0x60, 0x4B, 0x20, 0x00, 0x01, 0xFF, 0xF7, 0xFF, 0xFE, 0x22, 0x48, - 0xC0, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0xD0, 0x00, 0x25, 0x17, 0xE0, 0x1E, 0x48, 0x00, 0x6A, - 0x01, 0x21, 0xC9, 0x04, 0x88, 0x43, 0x40, 0x18, 0x1B, 0x49, 0x08, 0x62, 0x01, 0x25, 0x0D, 0xE0, - 0x19, 0x48, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x17, 0x49, 0x08, 0x60, 0x00, 0xBF, - 0x15, 0x48, 0xC0, 0x68, 0xC0, 0x06, 0xC0, 0x0F, 0xFA, 0xD0, 0x01, 0x25, 0x21, 0x46, 0x28, 0x46, - 0xFF, 0xF7, 0x5E, 0xFF, 0x06, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x62, 0xF8, 0x0E, 0x48, 0x00, 0x6A, - 0x01, 0x21, 0x89, 0x04, 0x88, 0x43, 0x0C, 0x49, 0x08, 0x62, 0x08, 0x46, 0x00, 0x6A, 0xC9, 0x01, - 0x88, 0x43, 0x09, 0x49, 0x08, 0x62, 0x00, 0xBF, 0x07, 0x48, 0xC0, 0x68, 0x40, 0x07, 0xC0, 0x0F, - 0xFA, 0xD0, 0x02, 0x20, 0x00, 0xF0, 0x14, 0xF8, 0x00, 0x20, 0xAF, 0xE7, 0x00, 0x87, 0x93, 0x03, - 0x40, 0x78, 0x7D, 0x01, 0x06, 0x96, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x50, 0x05, 0x20, 0x00, 0x07, - 0x80, 0x68, 0x02, 0x21, 0x88, 0x43, 0x80, 0x1C, 0x05, 0x21, 0x09, 0x07, 0x88, 0x60, 0x70, 0x47, - 0x10, 0xB5, 0x04, 0x46, 0x07, 0x2C, 0x03, 0xDC, 0x03, 0x2C, 0x03, 0xDD, 0x07, 0x2C, 0x01, 0xDA, - 0x0E, 0x48, 0x10, 0xBD, 0x0E, 0x48, 0x00, 0x69, 0xC0, 0x08, 0xC0, 0x00, 0x61, 0x07, 0x49, 0x0F, - 0x08, 0x43, 0x0B, 0x49, 0x08, 0x61, 0x08, 0x46, 0xC0, 0x68, 0x00, 0x06, 0xC0, 0x0F, 0x09, 0xD0, - 0x08, 0x46, 0xC0, 0x68, 0x80, 0x21, 0x88, 0x43, 0x80, 0x30, 0x05, 0x49, 0xC8, 0x60, 0x03, 0x48, - 0x00, 0x1D, 0xE6, 0xE7, 0x07, 0xF0, 0x62, 0xF8, 0x00, 0x20, 0xE2, 0xE7, 0x03, 0x96, 0xFF, 0xFF, - 0x00, 0x02, 0x00, 0x50, 0x05, 0x49, 0x0A, 0x6A, 0x89, 0x02, 0x8A, 0x43, 0xC1, 0x04, 0x01, 0x23, - 0xDB, 0x04, 0x19, 0x40, 0x0A, 0x43, 0x01, 0x49, 0x0A, 0x62, 0x70, 0x47, 0x00, 0x02, 0x00, 0x50, - 0x11, 0x49, 0x09, 0x6A, 0x49, 0x0A, 0x49, 0x02, 0xC2, 0x05, 0xD2, 0x0D, 0x11, 0x43, 0x0E, 0x4A, - 0x11, 0x62, 0x11, 0x46, 0x0A, 0x6A, 0x1F, 0x21, 0x49, 0x02, 0x8A, 0x43, 0x41, 0x0A, 0x49, 0x02, - 0x1F, 0x23, 0x5B, 0x02, 0x19, 0x40, 0x0A, 0x43, 0x07, 0x49, 0x0A, 0x62, 0x0A, 0x6A, 0x03, 0x21, - 0x89, 0x03, 0x8A, 0x43, 0x81, 0x0B, 0x89, 0x03, 0x03, 0x23, 0x9B, 0x03, 0x19, 0x40, 0x0A, 0x43, - 0x01, 0x49, 0x0A, 0x62, 0x70, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x30, 0xB5, 0x8C, 0x4B, - 0x9B, 0x79, 0x1B, 0x06, 0xDB, 0x0F, 0x01, 0x2B, 0x02, 0xD1, 0x0A, 0x21, 0x10, 0x22, 0x01, 0xE0, - 0x14, 0x21, 0x0E, 0x22, 0x86, 0x4B, 0x9B, 0x7A, 0x86, 0x4C, 0x23, 0x70, 0x24, 0x78, 0x63, 0x1C, - 0xDC, 0x0F, 0xE4, 0x18, 0xE4, 0x05, 0x24, 0x0E, 0x83, 0x4D, 0x2C, 0x70, 0x81, 0x4C, 0x23, 0x78, - 0xDC, 0x0F, 0xE4, 0x18, 0x64, 0x10, 0x81, 0x4D, 0x2C, 0x70, 0x7F, 0x4B, 0x1B, 0x78, 0x03, 0x2B, - 0x03, 0xDB, 0x7D, 0x4B, 0x1B, 0x78, 0x8B, 0x42, 0x01, 0xDD, 0x7B, 0x4B, 0x19, 0x70, 0x7B, 0x4B, - 0x1B, 0x78, 0x03, 0x2B, 0x03, 0xDB, 0x79, 0x4B, 0x1B, 0x78, 0x8B, 0x42, 0x01, 0xDD, 0x77, 0x4B, - 0x19, 0x70, 0x73, 0x4B, 0x9B, 0x79, 0x1B, 0x06, 0xDB, 0x0F, 0x01, 0x2B, 0x0E, 0xD1, 0x72, 0x4B, - 0x1B, 0x78, 0x73, 0x4C, 0x23, 0x70, 0x00, 0x23, 0x72, 0x4C, 0x23, 0x70, 0x6F, 0x4B, 0x1B, 0x78, - 0x71, 0x4C, 0x23, 0x70, 0x00, 0x23, 0x71, 0x4C, 0x23, 0x70, 0x1F, 0xE0, 0x6A, 0x4C, 0x24, 0x78, - 0x63, 0x1C, 0xDC, 0x0F, 0xE4, 0x18, 0xE4, 0x05, 0x24, 0x0E, 0x69, 0x4D, 0x2C, 0x70, 0x66, 0x4C, - 0x23, 0x78, 0xDC, 0x0F, 0xE4, 0x18, 0x64, 0x10, 0x66, 0x4D, 0x2C, 0x70, 0x63, 0x4C, 0x24, 0x78, - 0x63, 0x1C, 0xDC, 0x0F, 0xE4, 0x18, 0xE4, 0x05, 0x24, 0x0E, 0x63, 0x4D, 0x2C, 0x70, 0x5F, 0x4C, - 0x23, 0x78, 0xDC, 0x0F, 0xE4, 0x18, 0x64, 0x10, 0x60, 0x4D, 0x2C, 0x70, 0x00, 0x20, 0x00, 0x23, - 0x5F, 0x4C, 0x23, 0x70, 0x0D, 0xE0, 0x56, 0x4B, 0x1A, 0x33, 0x1B, 0x5C, 0xFF, 0x2B, 0x05, 0xD0, - 0x5B, 0x4B, 0x1B, 0x78, 0x5B, 0x1C, 0x5A, 0x4C, 0x23, 0x70, 0x00, 0xE0, 0x03, 0xE0, 0x43, 0x1C, - 0xD8, 0xB2, 0x90, 0x42, 0xEF, 0xDB, 0x00, 0xBF, 0x10, 0x20, 0x00, 0x23, 0x55, 0x4C, 0x23, 0x70, - 0x0D, 0xE0, 0x4B, 0x4B, 0x1A, 0x33, 0x1B, 0x5C, 0xFF, 0x2B, 0x05, 0xD0, 0x51, 0x4B, 0x1B, 0x78, - 0x5B, 0x1C, 0x50, 0x4C, 0x23, 0x70, 0x00, 0xE0, 0x05, 0xE0, 0x43, 0x1C, 0xD8, 0xB2, 0x13, 0x46, - 0x10, 0x33, 0x83, 0x42, 0xED, 0xDC, 0x00, 0xBF, 0x41, 0x4B, 0x9B, 0x79, 0xDB, 0x06, 0xDB, 0x0F, - 0x07, 0xD0, 0x47, 0x4B, 0x18, 0x78, 0x47, 0x4B, 0x1B, 0x78, 0x45, 0x4C, 0x23, 0x70, 0x45, 0x4B, - 0x18, 0x70, 0x43, 0x4B, 0x1B, 0x78, 0x43, 0x4C, 0x24, 0x78, 0x1B, 0x19, 0x42, 0x4C, 0x23, 0x70, - 0x3F, 0x4B, 0x1B, 0x78, 0x3A, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x40, 0x4C, 0x23, 0x80, 0x3C, 0x4B, - 0x1B, 0x78, 0x38, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x3D, 0x4C, 0x23, 0x80, 0x39, 0x4B, 0x1B, 0x78, - 0x33, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x3B, 0x4C, 0x23, 0x80, 0x36, 0x4B, 0x1B, 0x78, 0x31, 0x4C, - 0x24, 0x78, 0x63, 0x43, 0x38, 0x4C, 0x23, 0x80, 0x31, 0x4B, 0x1B, 0x78, 0x2E, 0x4C, 0x24, 0x78, - 0x63, 0x43, 0x36, 0x4C, 0x23, 0x80, 0x2E, 0x4B, 0x1B, 0x78, 0x2C, 0x4C, 0x24, 0x78, 0x63, 0x43, - 0x33, 0x4C, 0x23, 0x80, 0x2B, 0x4B, 0x1B, 0x78, 0x27, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x31, 0x4C, - 0x23, 0x80, 0x28, 0x4B, 0x1B, 0x78, 0x25, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x2E, 0x4C, 0x23, 0x80, - 0x23, 0x4B, 0x1B, 0x78, 0x1C, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x2C, 0x4C, 0x23, 0x80, 0x21, 0x4B, - 0x1B, 0x78, 0x19, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x29, 0x4C, 0x23, 0x80, 0x1C, 0x4B, 0x1B, 0x78, - 0x16, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x27, 0x4C, 0x23, 0x80, 0x1A, 0x4B, 0x1B, 0x78, 0x13, 0x4C, - 0x24, 0x78, 0x63, 0x43, 0x24, 0x4C, 0x23, 0x80, 0x17, 0x4B, 0x1B, 0x78, 0x0E, 0x4C, 0x24, 0x78, - 0x63, 0x43, 0x22, 0x4C, 0x23, 0x80, 0x14, 0x4B, 0x1B, 0x78, 0x0C, 0x4C, 0x24, 0x78, 0x63, 0x43, - 0x1F, 0x4C, 0x23, 0x80, 0x10, 0x4B, 0x1B, 0x78, 0x5B, 0x06, 0x1B, 0x0C, 0x1D, 0x4C, 0x23, 0x80, - 0x04, 0x4B, 0x1B, 0x78, 0x5B, 0x06, 0x1B, 0x0C, 0x1B, 0x4C, 0x23, 0x80, 0x30, 0xBD, 0x00, 0x00, - 0x21, 0x04, 0x00, 0x20, 0x4B, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, 0x45, 0x01, 0x00, 0x20, - 0x43, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, - 0x48, 0x01, 0x00, 0x20, 0x49, 0x01, 0x00, 0x20, 0x4A, 0x01, 0x00, 0x20, 0x72, 0x01, 0x00, 0x20, - 0x14, 0x02, 0x00, 0x20, 0x74, 0x01, 0x00, 0x20, 0x16, 0x02, 0x00, 0x20, 0x76, 0x01, 0x00, 0x20, - 0x18, 0x02, 0x00, 0x20, 0x78, 0x01, 0x00, 0x20, 0x1A, 0x02, 0x00, 0x20, 0x7A, 0x01, 0x00, 0x20, - 0x7C, 0x01, 0x00, 0x20, 0x7E, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x20, 0x82, 0x01, 0x00, 0x20, - 0x1C, 0x02, 0x00, 0x20, 0x84, 0x01, 0x00, 0x20, 0x86, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x02, 0x46, - 0x24, 0x48, 0x13, 0x18, 0xC8, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x00, 0xD1, 0x18, 0x68, 0x02, 0x20, - 0x08, 0x40, 0x02, 0x28, 0x01, 0xD1, 0x00, 0x20, 0x18, 0x60, 0x04, 0x20, 0x08, 0x40, 0x04, 0x28, - 0x0E, 0xD1, 0x98, 0x69, 0x40, 0x24, 0xA0, 0x43, 0x40, 0x30, 0x98, 0x61, 0x98, 0x69, 0x20, 0x24, - 0xA0, 0x43, 0x20, 0x30, 0x98, 0x61, 0x98, 0x69, 0x10, 0x24, 0xA0, 0x43, 0x10, 0x30, 0x98, 0x61, - 0x08, 0x20, 0x08, 0x40, 0x08, 0x28, 0x04, 0xD1, 0x58, 0x69, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, - 0x58, 0x61, 0x10, 0x20, 0x08, 0x40, 0x10, 0x28, 0x00, 0xD1, 0x18, 0x68, 0xFF, 0x20, 0x01, 0x30, - 0x08, 0x40, 0xC4, 0x1F, 0xF9, 0x3C, 0x04, 0xD1, 0xD8, 0x69, 0x80, 0x24, 0xA0, 0x43, 0x80, 0x30, - 0xD8, 0x61, 0x20, 0x20, 0x08, 0x40, 0x20, 0x28, 0x0A, 0xD1, 0x98, 0x69, 0x01, 0x24, 0x24, 0x06, - 0xA0, 0x43, 0x00, 0x19, 0x98, 0x61, 0x98, 0x69, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x98, 0x61, - 0x00, 0x20, 0x10, 0xBD, 0x00, 0x00, 0x05, 0x40, 0x10, 0xB5, 0x04, 0x46, 0x01, 0x20, 0x00, 0x05, - 0x84, 0x42, 0x13, 0xD1, 0x00, 0xBF, 0x14, 0x48, 0x80, 0x69, 0xC0, 0x00, 0xC0, 0x0F, 0xFA, 0xD0, - 0x12, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x04, 0x88, 0x43, 0x10, 0x49, 0x88, 0x60, 0x00, 0x20, - 0x0F, 0x49, 0x08, 0x60, 0x0D, 0x20, 0x04, 0xF0, 0x57, 0xFA, 0x13, 0xE0, 0x00, 0xBF, 0x0D, 0x48, - 0x80, 0x69, 0xC0, 0x00, 0xC0, 0x0F, 0xFA, 0xD0, 0x08, 0x48, 0x80, 0x68, 0x01, 0x21, 0x09, 0x04, - 0x88, 0x43, 0x06, 0x49, 0x88, 0x60, 0x00, 0x20, 0x05, 0x49, 0x09, 0x1F, 0x08, 0x60, 0x0C, 0x20, - 0x04, 0xF0, 0x42, 0xFA, 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x15, 0x40, 0x00, 0x02, 0x00, 0x50, - 0x34, 0x01, 0x00, 0x20, 0x00, 0x00, 0x05, 0x40, 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, - 0x38, 0x48, 0x27, 0x18, 0x78, 0x68, 0x40, 0x08, 0x40, 0x00, 0xE9, 0x07, 0xC9, 0x0F, 0x08, 0x43, - 0x78, 0x60, 0x79, 0x68, 0x02, 0x20, 0x81, 0x43, 0x28, 0x40, 0x40, 0x08, 0x40, 0x00, 0x02, 0x22, - 0x10, 0x40, 0x01, 0x43, 0x79, 0x60, 0x79, 0x68, 0x04, 0x20, 0x81, 0x43, 0x28, 0x40, 0x80, 0x08, - 0x80, 0x00, 0x04, 0x22, 0x10, 0x40, 0x01, 0x43, 0x79, 0x60, 0x79, 0x68, 0x08, 0x20, 0x81, 0x43, - 0x28, 0x40, 0xC0, 0x08, 0xC0, 0x00, 0x08, 0x22, 0x10, 0x40, 0x01, 0x43, 0x79, 0x60, 0x79, 0x68, - 0x10, 0x02, 0x81, 0x43, 0x10, 0x20, 0x28, 0x40, 0x00, 0x09, 0xC0, 0x02, 0x12, 0x02, 0x10, 0x40, - 0x01, 0x43, 0x79, 0x60, 0x79, 0x68, 0x10, 0x20, 0x81, 0x43, 0x28, 0x40, 0x00, 0x09, 0x00, 0x01, - 0x10, 0x22, 0x10, 0x40, 0x01, 0x43, 0x79, 0x60, 0x79, 0x68, 0x20, 0x20, 0x81, 0x43, 0x28, 0x40, - 0x40, 0x09, 0x40, 0x01, 0x20, 0x22, 0x10, 0x40, 0x01, 0x43, 0x79, 0x60, 0x79, 0x68, 0x40, 0x20, - 0x81, 0x43, 0x28, 0x40, 0x80, 0x09, 0x80, 0x01, 0x40, 0x22, 0x10, 0x40, 0x01, 0x43, 0x79, 0x60, - 0x79, 0x68, 0x90, 0x00, 0x81, 0x43, 0x28, 0x40, 0x00, 0x0A, 0x00, 0x02, 0x92, 0x00, 0x10, 0x40, - 0x01, 0x43, 0x79, 0x60, 0x00, 0x2C, 0x09, 0xD1, 0x0B, 0x48, 0x06, 0x60, 0x02, 0x21, 0x0C, 0x20, - 0x04, 0xF0, 0x72, 0xFA, 0x0C, 0x20, 0x04, 0xF0, 0xED, 0xF9, 0x09, 0xE0, 0x06, 0x48, 0x00, 0x1D, - 0x06, 0x60, 0x02, 0x21, 0x0D, 0x20, 0x04, 0xF0, 0x67, 0xFA, 0x0D, 0x20, 0x04, 0xF0, 0xE2, 0xF9, - 0xF8, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x05, 0x40, 0x30, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x04, 0x46, - 0x0D, 0x46, 0x00, 0x2C, 0x05, 0xD0, 0x01, 0x20, 0x00, 0x05, 0x84, 0x42, 0x01, 0xD0, 0x83, 0x48, - 0xF8, 0xBD, 0xA8, 0x79, 0x00, 0x28, 0x0E, 0xD0, 0xA8, 0x79, 0x03, 0x28, 0x0B, 0xD0, 0xA8, 0x79, - 0x01, 0x28, 0x08, 0xD0, 0xA8, 0x79, 0x05, 0x28, 0x05, 0xD0, 0xA8, 0x79, 0x07, 0x28, 0x02, 0xD0, - 0x7A, 0x48, 0x40, 0x1C, 0xEC, 0xE7, 0x28, 0x79, 0x00, 0x28, 0x0B, 0xD0, 0x28, 0x79, 0x01, 0x28, - 0x08, 0xD0, 0x28, 0x79, 0x02, 0x28, 0x05, 0xD0, 0x28, 0x79, 0x03, 0x28, 0x02, 0xD0, 0x73, 0x48, - 0x80, 0x1C, 0xDD, 0xE7, 0x68, 0x79, 0x00, 0x28, 0x08, 0xD0, 0x68, 0x79, 0x01, 0x28, 0x05, 0xD0, - 0x68, 0x79, 0x01, 0x28, 0x02, 0xD0, 0x6D, 0x48, 0xC0, 0x1C, 0xD1, 0xE7, 0xE8, 0x79, 0x00, 0x28, - 0x14, 0xD0, 0xE8, 0x79, 0x01, 0x28, 0x11, 0xD0, 0xE8, 0x79, 0x02, 0x28, 0x0E, 0xD0, 0xE8, 0x79, - 0x03, 0x28, 0x0B, 0xD0, 0xE8, 0x79, 0x04, 0x28, 0x08, 0xD0, 0xE8, 0x79, 0x05, 0x28, 0x05, 0xD0, - 0xE8, 0x79, 0x06, 0x28, 0x02, 0xD0, 0x61, 0x48, 0x00, 0x1D, 0xB9, 0xE7, 0x00, 0x2C, 0x19, 0xD1, - 0x5F, 0x48, 0x80, 0x68, 0x01, 0x21, 0x09, 0x04, 0x88, 0x43, 0x40, 0x18, 0x5C, 0x49, 0x88, 0x60, - 0x05, 0x20, 0x00, 0x07, 0xC0, 0x68, 0xC9, 0x01, 0x88, 0x43, 0x40, 0x18, 0x05, 0x21, 0x09, 0x07, - 0xC8, 0x60, 0x08, 0x46, 0xC0, 0x68, 0x01, 0x21, 0x09, 0x04, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, - 0xC8, 0x60, 0x1A, 0xE0, 0x01, 0x20, 0x00, 0x05, 0x84, 0x42, 0x16, 0xD1, 0x50, 0x48, 0x80, 0x68, - 0xE1, 0x10, 0x88, 0x43, 0x40, 0x18, 0x4E, 0x49, 0x88, 0x60, 0x05, 0x20, 0x00, 0x07, 0xC0, 0x68, - 0x09, 0x02, 0x88, 0x43, 0x40, 0x18, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x08, 0x46, 0xC0, 0x68, - 0xE1, 0x10, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x46, 0x48, 0x26, 0x18, 0xB0, 0x68, - 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0xB0, 0x60, 0xB0, 0x68, 0x02, 0x21, 0x88, 0x43, 0x80, 0x1C, - 0xB0, 0x60, 0xB1, 0x68, 0xF0, 0x20, 0x81, 0x43, 0xE8, 0x79, 0x00, 0x01, 0xF0, 0x22, 0x10, 0x40, - 0x01, 0x43, 0xB1, 0x60, 0xF0, 0x68, 0x20, 0x21, 0x88, 0x43, 0xA9, 0x79, 0x04, 0x22, 0x11, 0x40, - 0x89, 0x08, 0x49, 0x01, 0x20, 0x22, 0x11, 0x40, 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, 0x10, 0x21, - 0x88, 0x43, 0xA9, 0x79, 0x02, 0x22, 0x11, 0x40, 0x49, 0x08, 0x09, 0x01, 0x10, 0x22, 0x11, 0x40, - 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, 0x08, 0x21, 0x88, 0x43, 0xA9, 0x79, 0xC9, 0x00, 0x08, 0x22, - 0x11, 0x40, 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, 0x80, 0x08, 0x80, 0x00, 0x29, 0x79, 0x89, 0x07, - 0x89, 0x0F, 0x08, 0x43, 0xF0, 0x60, 0xF1, 0x68, 0x04, 0x20, 0x81, 0x43, 0x68, 0x79, 0x80, 0x00, - 0x04, 0x22, 0x10, 0x40, 0x01, 0x43, 0xF1, 0x60, 0x30, 0x6A, 0xC0, 0x09, 0xC0, 0x01, 0x29, 0x7A, - 0x49, 0x06, 0x49, 0x0E, 0x08, 0x43, 0x30, 0x62, 0x1D, 0x48, 0xC0, 0x68, 0xC0, 0x07, 0xC0, 0x0F, - 0x07, 0xD0, 0x1B, 0x48, 0x40, 0x69, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x18, 0x49, 0x48, 0x61, - 0x22, 0xE0, 0x17, 0x48, 0xC0, 0x68, 0x40, 0x07, 0xC0, 0x0F, 0x0A, 0xD0, 0x14, 0x48, 0x40, 0x69, - 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x01, 0x21, 0x09, 0x06, 0x40, 0x18, 0x10, 0x49, 0x48, 0x61, - 0x12, 0xE0, 0x0F, 0x48, 0xC0, 0x68, 0xC0, 0x06, 0xC0, 0x0F, 0x0A, 0xD0, 0x0C, 0x48, 0x40, 0x69, - 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x01, 0x21, 0x09, 0x06, 0x40, 0x18, 0x08, 0x49, 0x48, 0x61, - 0x02, 0xE0, 0x06, 0x48, 0x80, 0x1D, 0x03, 0xE7, 0x01, 0xF0, 0xF6, 0xFB, 0x07, 0x46, 0x32, 0x46, - 0x24, 0x32, 0x29, 0x68, 0xFD, 0xF7, 0x3E, 0xF9, 0x00, 0x20, 0xF9, 0xE6, 0x02, 0x98, 0xFF, 0xFF, - 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x05, 0x40, 0x70, 0xB5, 0x03, 0x46, 0x0C, 0x48, 0x1E, 0x18, - 0x00, 0x24, 0x10, 0xE0, 0x00, 0x25, 0x06, 0xE0, 0x6D, 0x1C, 0x01, 0x20, 0x80, 0x07, 0x85, 0x42, - 0x01, 0xD3, 0x08, 0x48, 0x70, 0xBD, 0xB0, 0x69, 0x40, 0x04, 0xC0, 0x0F, 0x01, 0x28, 0xF3, 0xD0, - 0x30, 0x68, 0x08, 0x55, 0x64, 0x1C, 0x94, 0x42, 0xEC, 0xD3, 0x00, 0x20, 0xF2, 0xE7, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x40, 0x01, 0x98, 0xFF, 0xFF, 0x1C, 0x49, 0x89, 0x68, 0xC9, 0x09, 0xC9, 0x01, - 0x1A, 0x4A, 0x91, 0x60, 0x11, 0x46, 0x09, 0x68, 0x01, 0x22, 0xD2, 0x03, 0x91, 0x43, 0x17, 0x4A, - 0x11, 0x60, 0x17, 0x49, 0x09, 0x6D, 0x17, 0x4A, 0x89, 0x1A, 0x14, 0x4A, 0x91, 0x61, 0x00, 0x20, - 0x17, 0xE0, 0x01, 0x21, 0x02, 0x01, 0x11, 0x4B, 0xD2, 0x18, 0xD1, 0x62, 0x81, 0x00, 0x12, 0x4A, - 0x51, 0x58, 0x89, 0x05, 0x89, 0x0D, 0x02, 0x01, 0xD2, 0x18, 0x91, 0x62, 0x0C, 0x21, 0x41, 0x43, - 0x0E, 0x4A, 0x89, 0x18, 0x89, 0x68, 0x0B, 0x4A, 0x89, 0x1A, 0x02, 0x01, 0xD2, 0x18, 0x11, 0x62, - 0x40, 0x1C, 0x0C, 0x21, 0x41, 0x43, 0x09, 0x4A, 0x89, 0x18, 0x49, 0x68, 0x00, 0x29, 0xE0, 0xD1, - 0x07, 0x4A, 0x11, 0x70, 0x07, 0x4A, 0x11, 0x70, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, - 0x04, 0x1A, 0x00, 0x20, 0x00, 0x01, 0x06, 0x40, 0xEC, 0x19, 0x00, 0x20, 0x20, 0x02, 0x00, 0x20, - 0x64, 0x03, 0x00, 0x20, 0x65, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x21, 0x08, 0x46, 0x00, 0xF0, - 0x05, 0xFA, 0x04, 0x46, 0x20, 0x01, 0x0C, 0x49, 0x40, 0x18, 0xC0, 0x6A, 0x03, 0x21, 0x08, 0x43, - 0x21, 0x01, 0x09, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x80, 0x21, 0x00, 0x20, 0x00, 0xF0, 0xF6, 0xF9, - 0x04, 0x46, 0x20, 0x01, 0x04, 0x49, 0x40, 0x18, 0xC0, 0x6A, 0x03, 0x21, 0x08, 0x43, 0x21, 0x01, - 0x01, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x10, 0xBD, 0x00, 0x00, 0x06, 0x40, 0x70, 0xB5, 0x00, 0x24, - 0x15, 0xE0, 0x20, 0x01, 0x0B, 0x49, 0x45, 0x18, 0xA8, 0x68, 0x00, 0x28, 0x0E, 0xD0, 0x29, 0x78, - 0x09, 0x48, 0x00, 0x78, 0x60, 0x22, 0x10, 0x40, 0x81, 0x42, 0x07, 0xD1, 0x68, 0x78, 0x06, 0x49, - 0x49, 0x78, 0x88, 0x42, 0x02, 0xD1, 0xA8, 0x68, 0x80, 0x47, 0x70, 0xBD, 0x64, 0x1C, 0x0D, 0x2C, - 0xE7, 0xD3, 0xFA, 0xE7, 0x50, 0x02, 0x00, 0x20, 0x5C, 0x03, 0x00, 0x20, 0x0B, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x03, 0xD1, 0x07, 0x20, 0x0A, 0x49, 0x08, 0x60, 0x0D, 0xE0, 0x0F, 0x20, 0x08, 0x49, - 0x08, 0x60, 0x06, 0x49, 0x09, 0x78, 0x48, 0x06, 0x40, 0x0E, 0x06, 0x49, 0x89, 0x68, 0xC9, 0x09, - 0xC9, 0x01, 0x01, 0x43, 0x03, 0x4A, 0x91, 0x60, 0x70, 0x47, 0x00, 0x00, 0x64, 0x03, 0x00, 0x20, - 0x58, 0x03, 0x00, 0x20, 0x00, 0x00, 0x06, 0x40, 0x70, 0xB5, 0x00, 0x24, 0x15, 0xE0, 0x20, 0x01, - 0x0B, 0x49, 0x45, 0x18, 0xE8, 0x68, 0x00, 0x28, 0x0E, 0xD0, 0x29, 0x78, 0x09, 0x48, 0x00, 0x78, - 0x60, 0x22, 0x10, 0x40, 0x81, 0x42, 0x07, 0xD1, 0x68, 0x78, 0x06, 0x49, 0x49, 0x78, 0x88, 0x42, - 0x02, 0xD1, 0xE8, 0x68, 0x80, 0x47, 0x70, 0xBD, 0x64, 0x1C, 0x0D, 0x2C, 0xE7, 0xD3, 0xFA, 0xE7, - 0x50, 0x02, 0x00, 0x20, 0x5C, 0x03, 0x00, 0x20, 0xF8, 0xB5, 0x00, 0x21, 0x08, 0x46, 0x00, 0xF0, - 0x85, 0xF9, 0x07, 0x46, 0x38, 0x01, 0x23, 0x49, 0x40, 0x18, 0xC0, 0x6A, 0x01, 0x21, 0x08, 0x43, - 0x39, 0x01, 0x20, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x80, 0x21, 0x00, 0x20, 0x00, 0xF0, 0x76, 0xF9, - 0x07, 0x46, 0x38, 0x01, 0x1B, 0x49, 0x40, 0x18, 0xC0, 0x6A, 0x01, 0x21, 0x08, 0x43, 0x39, 0x01, - 0x18, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x18, 0x48, 0x00, 0x68, 0x07, 0x28, 0x02, 0xDA, 0xFF, 0xF7, - 0x5B, 0xFF, 0xF8, 0xBD, 0x15, 0x48, 0x06, 0x6D, 0x00, 0x24, 0x03, 0xE0, 0x30, 0x5D, 0x14, 0x49, - 0x08, 0x55, 0x64, 0x1C, 0x08, 0x2C, 0xF9, 0xD3, 0x00, 0x24, 0x15, 0xE0, 0x20, 0x01, 0x11, 0x49, - 0x45, 0x18, 0x68, 0x68, 0x00, 0x28, 0x0E, 0xD0, 0x29, 0x78, 0x0D, 0x48, 0x00, 0x78, 0x60, 0x22, - 0x10, 0x40, 0x81, 0x42, 0x07, 0xD1, 0x68, 0x78, 0x09, 0x49, 0x49, 0x78, 0x88, 0x42, 0x02, 0xD1, - 0x68, 0x68, 0x80, 0x47, 0xDD, 0xE7, 0x64, 0x1C, 0x0D, 0x2C, 0xE7, 0xD3, 0xFF, 0xF7, 0x34, 0xFF, - 0xD7, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x58, 0x03, 0x00, 0x20, 0x04, 0x1A, 0x00, 0x20, - 0x5C, 0x03, 0x00, 0x20, 0x50, 0x02, 0x00, 0x20, 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xB5, 0x01, 0x22, - 0x02, 0x49, 0x00, 0x20, 0x00, 0xF0, 0x6A, 0xF8, 0x00, 0xBD, 0x00, 0x00, 0x65, 0x03, 0x00, 0x20, - 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xB5, 0x0A, 0x48, 0x00, 0x68, 0x07, 0x28, - 0x0C, 0xD1, 0x09, 0x48, 0x80, 0x78, 0x09, 0x49, 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, 0x10, 0x46, - 0x00, 0xF0, 0x54, 0xF8, 0x0F, 0x20, 0x03, 0x49, 0x08, 0x60, 0x01, 0xE0, 0xFF, 0xF7, 0x04, 0xFF, - 0x00, 0xBD, 0x00, 0x00, 0x58, 0x03, 0x00, 0x20, 0x5C, 0x03, 0x00, 0x20, 0x64, 0x03, 0x00, 0x20, - 0x10, 0xB5, 0x1D, 0x48, 0x00, 0x68, 0x40, 0x68, 0x00, 0x28, 0x06, 0xD0, 0x1B, 0x4A, 0x90, 0x78, - 0x19, 0x4A, 0x12, 0x68, 0x51, 0x68, 0x88, 0x47, 0x00, 0xE0, 0x01, 0x20, 0x04, 0x46, 0x17, 0x48, - 0x80, 0x78, 0x00, 0x28, 0x0C, 0xD1, 0x0F, 0x20, 0x15, 0x49, 0x08, 0x60, 0x13, 0x48, 0x80, 0x78, - 0x14, 0x49, 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, 0x10, 0x46, 0x00, 0xF0, 0x27, 0xF8, 0x19, 0xE0, - 0x00, 0x2C, 0x15, 0xD0, 0x1F, 0x20, 0x0E, 0x49, 0x08, 0x60, 0x0B, 0x48, 0x00, 0x68, 0x00, 0x68, - 0x00, 0x28, 0x03, 0xD0, 0x08, 0x49, 0x09, 0x68, 0x08, 0x68, 0x80, 0x47, 0x07, 0x48, 0x80, 0x78, - 0x08, 0x49, 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, 0x10, 0x46, 0x00, 0xF0, 0x0F, 0xF8, 0x01, 0xE0, - 0xFF, 0xF7, 0xC2, 0xFE, 0x10, 0xBD, 0x00, 0x00, 0x68, 0x03, 0x00, 0x20, 0x5C, 0x03, 0x00, 0x20, - 0x58, 0x03, 0x00, 0x20, 0x65, 0x03, 0x00, 0x20, 0x00, 0xBF, 0xFE, 0xE7, 0xF0, 0xB5, 0x04, 0x46, - 0x0D, 0x46, 0x16, 0x46, 0x80, 0x21, 0x20, 0x46, 0x00, 0xF0, 0xB8, 0xF8, 0x07, 0x46, 0x00, 0x2D, - 0x0A, 0xD0, 0x00, 0x2E, 0x08, 0xD0, 0x0C, 0x21, 0x79, 0x43, 0x20, 0x4A, 0x89, 0x18, 0x32, 0x46, - 0x88, 0x68, 0x29, 0x46, 0x07, 0xF0, 0xB0, 0xFA, 0x0C, 0x20, 0x78, 0x43, 0x1B, 0x49, 0x40, 0x18, - 0x80, 0x68, 0x1B, 0x49, 0x40, 0x1A, 0x39, 0x01, 0x1A, 0x4A, 0x89, 0x18, 0x08, 0x62, 0x00, 0x2D, - 0x06, 0xD1, 0x00, 0x2E, 0x04, 0xD1, 0x00, 0x20, 0xA1, 0x00, 0x17, 0x4A, 0x50, 0x50, 0x0A, 0xE0, - 0xA0, 0x00, 0x15, 0x49, 0x08, 0x58, 0x00, 0x28, 0x01, 0xD1, 0x01, 0x20, 0x00, 0xE0, 0x00, 0x20, - 0xA1, 0x00, 0x11, 0x4A, 0x50, 0x50, 0xA0, 0x00, 0x0F, 0x49, 0x08, 0x58, 0x00, 0x28, 0x06, 0xD0, - 0x38, 0x01, 0x0C, 0x49, 0x40, 0x18, 0x80, 0x6A, 0x0C, 0x49, 0x08, 0x40, 0x05, 0xE0, 0x38, 0x01, - 0x08, 0x49, 0x40, 0x18, 0x80, 0x6A, 0x80, 0x21, 0x08, 0x43, 0x39, 0x01, 0x05, 0x4A, 0x89, 0x18, - 0x88, 0x62, 0x38, 0x01, 0x11, 0x46, 0x40, 0x18, 0x46, 0x62, 0xF0, 0xBD, 0x04, 0x1A, 0x00, 0x20, - 0x00, 0x01, 0x06, 0x40, 0x00, 0x00, 0x06, 0x40, 0x58, 0x1A, 0x00, 0x20, 0x7F, 0x03, 0x00, 0x00, - 0xF8, 0xB5, 0x2C, 0x48, 0x00, 0x68, 0x2C, 0x49, 0x08, 0x40, 0x2A, 0x49, 0x08, 0x60, 0x08, 0x46, - 0x00, 0x68, 0xC0, 0x0F, 0xC0, 0x07, 0x08, 0xD0, 0x01, 0x20, 0xC0, 0x07, 0x27, 0x49, 0x48, 0x60, - 0x01, 0x20, 0x27, 0x49, 0x08, 0x60, 0xFF, 0xF7, 0xC7, 0xFE, 0x24, 0x48, 0x40, 0x68, 0x21, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0xFF, 0x21, 0x09, 0x04, 0x08, 0x40, 0x1F, 0x49, 0x48, 0x60, - 0x10, 0x27, 0x33, 0xE0, 0x01, 0x20, 0xB8, 0x40, 0x1A, 0x49, 0x09, 0x68, 0x08, 0x42, 0x2C, 0xD0, - 0x3D, 0x46, 0x10, 0x3D, 0x28, 0x01, 0x19, 0x49, 0x40, 0x18, 0x80, 0x6A, 0x04, 0x07, 0x24, 0x0F, - 0x68, 0x00, 0x29, 0x18, 0x09, 0x1D, 0x17, 0x48, 0x00, 0x68, 0xC8, 0x40, 0x70, 0x21, 0x06, 0x46, - 0x0E, 0x40, 0x00, 0x2E, 0x08, 0xD1, 0x00, 0x2C, 0x02, 0xD1, 0xFF, 0xF7, 0x3F, 0xFE, 0x14, 0xE0, - 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, 0x10, 0xE0, 0x20, 0x2E, 0x06, 0xD1, 0x01, 0x20, 0xA1, 0x00, - 0x0B, 0x4A, 0x50, 0x50, 0xFF, 0xF7, 0x70, 0xFE, 0x07, 0xE0, 0x60, 0x2E, 0x05, 0xD1, 0x00, 0x20, - 0xA1, 0x00, 0x07, 0x4A, 0x50, 0x50, 0xFF, 0xF7, 0x67, 0xFE, 0x7F, 0x1C, 0x16, 0x2F, 0xC9, 0xDB, - 0xF8, 0xBD, 0x00, 0x00, 0x54, 0x03, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x06, 0x40, - 0x58, 0x1A, 0x00, 0x20, 0x4C, 0x03, 0x00, 0x20, 0x44, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x03, 0x46, - 0x00, 0x22, 0x0A, 0xE0, 0x0C, 0x20, 0x50, 0x43, 0x06, 0x4C, 0x24, 0x58, 0x18, 0x46, 0x08, 0x43, - 0x84, 0x42, 0x01, 0xD1, 0x10, 0x46, 0x10, 0xBD, 0x52, 0x1C, 0x06, 0x2A, 0xF2, 0xD3, 0x02, 0x48, - 0xF9, 0xE7, 0x00, 0x00, 0x04, 0x1A, 0x00, 0x20, 0x02, 0x99, 0xFF, 0xFF, 0x30, 0xB5, 0x04, 0x46, - 0x80, 0x21, 0x20, 0x46, 0xFF, 0xF7, 0xE2, 0xFF, 0x05, 0x46, 0x13, 0x48, 0x85, 0x42, 0x0C, 0xD0, - 0xA8, 0x00, 0x12, 0x49, 0x08, 0x58, 0x80, 0x05, 0x80, 0x0D, 0x29, 0x01, 0x10, 0x4A, 0x89, 0x18, - 0x88, 0x62, 0x01, 0x20, 0x29, 0x01, 0x89, 0x18, 0xC8, 0x62, 0x00, 0x21, 0x20, 0x46, 0xFF, 0xF7, - 0xCD, 0xFF, 0x05, 0x46, 0x08, 0x48, 0x85, 0x42, 0x0C, 0xD0, 0xA8, 0x00, 0x07, 0x49, 0x08, 0x58, - 0x80, 0x05, 0x80, 0x0D, 0x29, 0x01, 0x06, 0x4A, 0x89, 0x18, 0x88, 0x62, 0x01, 0x20, 0x29, 0x01, - 0x89, 0x18, 0xC8, 0x62, 0x30, 0xBD, 0x00, 0x00, 0x02, 0x99, 0xFF, 0xFF, 0xEC, 0x19, 0x00, 0x20, - 0x00, 0x00, 0x06, 0x40, 0x10, 0xB5, 0x01, 0x20, 0x80, 0x03, 0x05, 0x49, 0x08, 0x62, 0x05, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x03, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x00, 0x00, - 0x40, 0x40, 0x00, 0x50, 0x20, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x01, 0x20, 0xC0, 0x03, 0x05, 0x49, - 0x08, 0x62, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x03, 0x48, 0x00, 0x68, 0x80, 0x47, - 0x10, 0xBD, 0x00, 0x00, 0x40, 0x40, 0x00, 0x50, 0x24, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x56, 0x48, - 0x41, 0x7E, 0x00, 0x29, 0x7E, 0xD0, 0x07, 0x46, 0x00, 0x26, 0x80, 0x37, 0x04, 0x46, 0x60, 0x34, - 0x9C, 0xE0, 0xB8, 0x69, 0xB5, 0x00, 0x42, 0x5D, 0xA2, 0x80, 0x29, 0x18, 0x48, 0x78, 0xE0, 0x80, - 0x88, 0x78, 0x20, 0x81, 0xC9, 0x78, 0x61, 0x81, 0x13, 0x46, 0x00, 0xF0, 0xB3, 0xFE, 0x00, 0x90, - 0x04, 0x23, 0xE3, 0x5E, 0x0A, 0x21, 0x18, 0x46, 0x42, 0x1E, 0x08, 0x20, 0x61, 0x5E, 0x20, 0x5E, - 0x5B, 0x1E, 0x49, 0x1C, 0x40, 0x1E, 0x00, 0xF0, 0xA5, 0xFE, 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, - 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, 0x03, 0xDD, 0xA0, 0x88, - 0xB9, 0x69, 0x40, 0x1E, 0x48, 0x55, 0x06, 0x23, 0xE3, 0x5E, 0x0A, 0x21, 0x08, 0x20, 0x1A, 0x46, - 0x61, 0x5E, 0x20, 0x5E, 0x00, 0xF0, 0x8E, 0xFE, 0x00, 0x90, 0x06, 0x23, 0xE3, 0x5E, 0x0A, 0x21, - 0x18, 0x46, 0x42, 0x1C, 0x08, 0x20, 0x61, 0x5E, 0x20, 0x5E, 0x5B, 0x1C, 0x49, 0x1C, 0x40, 0x1E, - 0x00, 0xF0, 0x80, 0xFE, 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, - 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, 0x04, 0xDD, 0xE0, 0x88, 0xB9, 0x69, 0x40, 0x1C, 0x69, 0x18, - 0x48, 0x70, 0x08, 0x21, 0x61, 0x5E, 0x06, 0x23, 0x04, 0x22, 0xE3, 0x5E, 0xA2, 0x5E, 0x08, 0x46, - 0x00, 0xF0, 0x68, 0xFE, 0x00, 0x90, 0x08, 0x20, 0x06, 0x23, 0x04, 0x22, 0x20, 0x5E, 0xE3, 0x5E, - 0xA2, 0x5E, 0x41, 0x1E, 0x5B, 0x1C, 0x52, 0x1E, 0x40, 0x1E, 0x00, 0xF0, 0x5B, 0xFE, 0x01, 0x46, - 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, - 0x04, 0xDD, 0x20, 0x89, 0xB9, 0x69, 0x40, 0x1E, 0x69, 0x18, 0x88, 0x70, 0x06, 0x23, 0xE3, 0x5E, - 0x04, 0x22, 0x00, 0xE0, 0x27, 0xE0, 0x0A, 0x21, 0x61, 0x5E, 0xA2, 0x5E, 0x08, 0x46, 0x00, 0xF0, - 0x41, 0xFE, 0x00, 0x90, 0x0A, 0x20, 0x06, 0x23, 0x04, 0x22, 0x20, 0x5E, 0xE3, 0x5E, 0xA2, 0x5E, - 0x41, 0x1C, 0x5B, 0x1C, 0x52, 0x1E, 0x40, 0x1C, 0x00, 0xF0, 0x34, 0xFE, 0x01, 0x46, 0x00, 0x98, - 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, 0x04, 0xDD, - 0x60, 0x89, 0xB9, 0x69, 0x40, 0x1C, 0x69, 0x18, 0xC8, 0x70, 0x76, 0x1C, 0x02, 0x48, 0x40, 0x7E, - 0x86, 0x42, 0x00, 0xDA, 0x5D, 0xE7, 0xF8, 0xBD, 0x38, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0xB0, - 0xFF, 0x4F, 0xB8, 0x7D, 0x0F, 0x28, 0x7E, 0xD8, 0x40, 0x1C, 0x3C, 0x46, 0xB8, 0x75, 0x40, 0x34, - 0x14, 0x25, 0x20, 0x46, 0x65, 0x5F, 0x40, 0x30, 0xC3, 0x68, 0x69, 0x00, 0x59, 0x5E, 0x60, 0x38, - 0xE1, 0x82, 0x82, 0x79, 0x1C, 0x20, 0x20, 0x5E, 0x01, 0x2A, 0x05, 0xD1, 0xCA, 0x17, 0x92, 0x0F, - 0x86, 0x10, 0x51, 0x18, 0x89, 0x10, 0x09, 0xE0, 0x42, 0x00, 0x82, 0x18, 0xD6, 0x17, 0xB6, 0x0F, - 0xB2, 0x18, 0x92, 0x10, 0x16, 0xB2, 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, 0x09, 0xB2, 0x01, 0x91, - 0xB1, 0x10, 0xEB, 0x49, 0x7A, 0x7D, 0x89, 0x7C, 0xE9, 0x4A, 0x69, 0x18, 0x89, 0x1C, 0x09, 0xB2, - 0xA1, 0x82, 0x80, 0x32, 0x52, 0x69, 0xE6, 0x4D, 0x94, 0x46, 0x52, 0x5C, 0x01, 0x27, 0x60, 0x35, - 0x01, 0x2A, 0x1F, 0xD0, 0x4A, 0x00, 0x9A, 0x5E, 0xE2, 0x82, 0xB2, 0x42, 0x18, 0xDD, 0x82, 0x42, - 0x00, 0xDD, 0xA2, 0x83, 0x28, 0x88, 0x40, 0x1C, 0x28, 0x80, 0x60, 0x46, 0x47, 0x54, 0xDC, 0x48, - 0x81, 0x7C, 0x14, 0x20, 0x89, 0x1C, 0x20, 0x5E, 0xFC, 0xF7, 0x90, 0xF8, 0x00, 0xB2, 0x20, 0x83, - 0x0A, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, 0x68, 0x81, 0xFF, 0xF7, 0xA7, 0xFF, 0x01, 0xE0, - 0x60, 0x46, 0x47, 0x54, 0xD2, 0x48, 0xA1, 0x8A, 0x80, 0x7C, 0x08, 0x1A, 0x40, 0x1E, 0xD0, 0x49, - 0x00, 0xB2, 0xA0, 0x82, 0x80, 0x31, 0x4B, 0x69, 0x19, 0x5C, 0x01, 0x29, 0x23, 0xD0, 0xCC, 0x4A, - 0x41, 0x00, 0x80, 0x32, 0xD2, 0x68, 0x51, 0x5E, 0xE1, 0x82, 0xB1, 0x42, 0x1A, 0xDD, 0x1C, 0x22, - 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0xA1, 0x83, 0x29, 0x88, 0x49, 0x1C, 0x29, 0x80, 0x1F, 0x54, - 0xC3, 0x48, 0x81, 0x7C, 0x14, 0x20, 0x89, 0x1C, 0x20, 0x5E, 0xFC, 0xF7, 0x5F, 0xF8, 0x21, 0x83, - 0x06, 0x20, 0x28, 0x5E, 0x00, 0xE0, 0xA3, 0xE1, 0x81, 0x42, 0x00, 0xDD, 0xE9, 0x80, 0xFF, 0xF7, - 0x75, 0xFF, 0x00, 0xE0, 0x1F, 0x54, 0xBA, 0x49, 0xA0, 0x8A, 0x89, 0x7C, 0x40, 0x1A, 0xC0, 0x1E, - 0xB7, 0x49, 0x00, 0xB2, 0xA0, 0x82, 0x80, 0x31, 0x4B, 0x69, 0x19, 0x5C, 0x01, 0x29, 0x22, 0xD0, - 0xB3, 0x4A, 0x41, 0x00, 0x80, 0x32, 0xD2, 0x68, 0x51, 0x5E, 0xE1, 0x82, 0xB1, 0x42, 0x19, 0xDD, - 0x1C, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0xA1, 0x83, 0x29, 0x88, 0x49, 0x1C, 0x29, 0x80, - 0x1F, 0x54, 0xAB, 0x48, 0x81, 0x7C, 0x14, 0x20, 0x89, 0x1C, 0x20, 0x5E, 0xFC, 0xF7, 0x2E, 0xF8, - 0x00, 0xB2, 0x20, 0x83, 0x08, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDA, 0x28, 0x81, 0xFF, 0xF7, - 0x45, 0xFF, 0x00, 0xE0, 0x1F, 0x54, 0xA2, 0x48, 0xA1, 0x8A, 0x80, 0x7C, 0x08, 0x18, 0x40, 0x1C, - 0x9F, 0x49, 0x00, 0xB2, 0xA0, 0x82, 0x80, 0x31, 0x4B, 0x69, 0x19, 0x5C, 0x01, 0x29, 0x21, 0xD0, - 0x9B, 0x4A, 0x41, 0x00, 0x80, 0x32, 0xD2, 0x68, 0x51, 0x5E, 0xE1, 0x82, 0xB1, 0x42, 0x18, 0xDD, - 0x1C, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0xA1, 0x83, 0x29, 0x88, 0x49, 0x1C, 0x29, 0x80, - 0x1F, 0x54, 0x93, 0x48, 0x81, 0x7C, 0x14, 0x20, 0x89, 0x1C, 0x20, 0x5E, 0xFB, 0xF7, 0xFE, 0xFF, - 0x21, 0x83, 0x04, 0x20, 0x28, 0x5E, 0x81, 0x42, 0x00, 0xDA, 0xA9, 0x80, 0xFF, 0xF7, 0x16, 0xFF, - 0x00, 0xE0, 0x1F, 0x54, 0xF0, 0x10, 0x30, 0x1A, 0x06, 0xB2, 0x89, 0x48, 0xA1, 0x8A, 0x80, 0x7C, - 0x06, 0x90, 0x08, 0x1A, 0x80, 0x1E, 0x86, 0x49, 0x00, 0xB2, 0xA0, 0x82, 0x80, 0x31, 0x49, 0x69, - 0x0A, 0x5C, 0x05, 0x91, 0x01, 0x2A, 0x3E, 0xD0, 0x81, 0x49, 0x42, 0x00, 0x80, 0x31, 0xC9, 0x68, - 0x8C, 0x46, 0x89, 0x5E, 0xE1, 0x82, 0xB1, 0x42, 0x35, 0xDD, 0x63, 0x46, 0xD3, 0x18, 0x02, 0x22, - 0x9A, 0x5E, 0x52, 0x10, 0x22, 0x83, 0x06, 0x9B, 0x96, 0x46, 0xC3, 0x18, 0x5B, 0x00, 0x62, 0x46, - 0x9A, 0x18, 0x04, 0x23, 0xD3, 0x5E, 0x72, 0x46, 0x5B, 0x10, 0x63, 0x83, 0xD2, 0x18, 0x22, 0x83, - 0x01, 0x9B, 0x9A, 0x42, 0x1F, 0xDD, 0x1C, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0xA1, 0x83, - 0x29, 0x88, 0x49, 0x1C, 0x29, 0x80, 0x05, 0x99, 0x0F, 0x54, 0x6D, 0x48, 0x81, 0x7C, 0x14, 0x20, - 0x89, 0x1C, 0x20, 0x5E, 0xFB, 0xF7, 0xB2, 0xFF, 0x21, 0x83, 0x04, 0x22, 0xAA, 0x5E, 0x91, 0x42, - 0x00, 0xDA, 0xA9, 0x80, 0x00, 0xB2, 0x20, 0x83, 0x08, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDA, - 0x28, 0x81, 0xFF, 0xF7, 0xC3, 0xFE, 0xA0, 0x8A, 0x61, 0x49, 0x80, 0x1C, 0x00, 0xB2, 0xA0, 0x82, - 0x80, 0x31, 0x49, 0x69, 0x0A, 0x5C, 0x04, 0x91, 0x01, 0x2A, 0x3D, 0xD0, 0x5C, 0x49, 0x42, 0x00, - 0x80, 0x31, 0xC9, 0x68, 0x8B, 0x5E, 0xE3, 0x82, 0x9C, 0x46, 0xB3, 0x42, 0x34, 0xDD, 0x53, 0x18, - 0x20, 0x3B, 0x1E, 0x22, 0x9A, 0x5E, 0x56, 0x4B, 0x52, 0x10, 0x22, 0x83, 0x9B, 0x7C, 0xC3, 0x18, - 0x5B, 0x00, 0x5B, 0x18, 0x04, 0x21, 0x59, 0x5E, 0x49, 0x10, 0x61, 0x83, 0x51, 0x18, 0x21, 0x83, - 0x01, 0x9A, 0x91, 0x42, 0x20, 0xDD, 0x1C, 0x22, 0xA2, 0x5E, 0x94, 0x45, 0x01, 0xDD, 0x61, 0x46, - 0xA1, 0x83, 0x29, 0x88, 0x49, 0x1C, 0x29, 0x80, 0x04, 0x99, 0x0F, 0x54, 0x48, 0x48, 0x81, 0x7C, - 0x14, 0x20, 0x89, 0x1C, 0x20, 0x5E, 0xFB, 0xF7, 0x69, 0xFF, 0x21, 0x83, 0x06, 0x22, 0xAA, 0x5E, - 0x91, 0x42, 0x00, 0xDD, 0xE9, 0x80, 0x00, 0xB2, 0x20, 0x83, 0x08, 0x21, 0x69, 0x5E, 0x88, 0x42, - 0x00, 0xDA, 0x28, 0x81, 0xFF, 0xF7, 0x7A, 0xFE, 0x3D, 0x48, 0xA1, 0x8A, 0x80, 0x7C, 0x03, 0x90, - 0x40, 0x00, 0x40, 0x18, 0x00, 0x1D, 0x3A, 0x49, 0x00, 0xB2, 0xA0, 0x82, 0x80, 0x31, 0x49, 0x69, - 0x0A, 0x5C, 0x02, 0x91, 0x01, 0x2A, 0x40, 0xD0, 0x35, 0x49, 0x42, 0x00, 0x80, 0x31, 0xC9, 0x68, - 0x8C, 0x46, 0x89, 0x5E, 0xE1, 0x82, 0xB1, 0x42, 0x37, 0xDD, 0x63, 0x46, 0xD3, 0x18, 0x20, 0x3B, - 0x1E, 0x22, 0x9A, 0x5E, 0x52, 0x10, 0x22, 0x83, 0x03, 0x9B, 0x96, 0x46, 0xC3, 0x1A, 0x5B, 0x00, - 0x62, 0x46, 0x9A, 0x18, 0x20, 0x3A, 0x1C, 0x23, 0xD3, 0x5E, 0x72, 0x46, 0x5B, 0x10, 0x63, 0x83, - 0xD2, 0x18, 0x22, 0x83, 0x01, 0x9B, 0x9A, 0x42, 0x1F, 0xDD, 0x1C, 0x22, 0xA2, 0x5E, 0x91, 0x42, - 0x00, 0xDD, 0xA1, 0x83, 0x29, 0x88, 0x49, 0x1C, 0x29, 0x80, 0x02, 0x99, 0x0F, 0x54, 0x20, 0x48, - 0x81, 0x7C, 0x14, 0x20, 0x89, 0x1C, 0x20, 0x5E, 0xFB, 0xF7, 0x18, 0xFF, 0x21, 0x83, 0x06, 0x22, - 0xAA, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0xE9, 0x80, 0x00, 0xB2, 0x20, 0x83, 0x0A, 0x21, 0x69, 0x5E, - 0x88, 0x42, 0x00, 0xDD, 0x68, 0x81, 0xFF, 0xF7, 0x29, 0xFE, 0xA0, 0x8A, 0x14, 0x49, 0x80, 0x1E, - 0x00, 0xB2, 0xA0, 0x82, 0x80, 0x31, 0x49, 0x69, 0x0A, 0x5C, 0x8C, 0x46, 0x01, 0x2A, 0x3E, 0xD0, - 0x0F, 0x49, 0x43, 0x00, 0x80, 0x31, 0xC9, 0x68, 0xCA, 0x5E, 0xE2, 0x82, 0xB2, 0x42, 0x36, 0xDD, - 0x5E, 0x18, 0x02, 0x23, 0xF3, 0x5E, 0x5E, 0x10, 0x09, 0x4B, 0x26, 0x83, 0x9B, 0x7C, 0xC3, 0x1A, - 0x5B, 0x00, 0x5B, 0x18, 0x20, 0x3B, 0x1C, 0x21, 0x59, 0x5E, 0x49, 0x10, 0x61, 0x83, 0x71, 0x18, - 0x21, 0x83, 0x01, 0x9B, 0x99, 0x42, 0x22, 0xDD, 0x1C, 0x21, 0x61, 0x5E, 0x8A, 0x42, 0x01, 0xE0, - 0x38, 0x01, 0x00, 0x20, 0x00, 0xDD, 0xA2, 0x83, 0x29, 0x88, 0x49, 0x1C, 0x29, 0x80, 0x61, 0x46, - 0x0F, 0x54, 0x10, 0x48, 0x81, 0x7C, 0x14, 0x20, 0x89, 0x1C, 0x20, 0x5E, 0xFB, 0xF7, 0xCE, 0xFE, - 0x21, 0x83, 0x04, 0x22, 0xAA, 0x5E, 0x91, 0x42, 0x00, 0xDA, 0xA9, 0x80, 0x00, 0xB2, 0x20, 0x83, - 0x0A, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, 0x68, 0x81, 0xFF, 0xF7, 0xDF, 0xFD, 0x05, 0x48, - 0xA1, 0x8A, 0x82, 0x7C, 0x89, 0x1A, 0x49, 0x1E, 0xA1, 0x82, 0x81, 0x7D, 0x49, 0x1E, 0x81, 0x75, - 0x07, 0xB0, 0xF0, 0xBD, 0x38, 0x01, 0x00, 0x20, 0xF3, 0xB5, 0x85, 0xB0, 0x04, 0x46, 0x02, 0xAA, - 0x03, 0xA9, 0x00, 0xF0, 0xA9, 0xFB, 0x5A, 0x49, 0x04, 0x91, 0x88, 0x83, 0x6A, 0x46, 0x01, 0xA9, - 0x06, 0x98, 0x00, 0xF0, 0xA1, 0xFB, 0x56, 0x4A, 0x06, 0x9B, 0x40, 0x32, 0x90, 0x69, 0xA5, 0x00, - 0x9E, 0x00, 0x41, 0x5D, 0x83, 0x5D, 0x99, 0x42, 0x00, 0xD3, 0x19, 0x46, 0x50, 0x4C, 0x8C, 0x46, - 0x20, 0x34, 0xA1, 0x80, 0x29, 0x18, 0x37, 0x18, 0x4B, 0x78, 0x78, 0x78, 0x83, 0x42, 0x00, 0xD8, - 0x03, 0x46, 0xE3, 0x80, 0x88, 0x78, 0xBA, 0x78, 0x90, 0x42, 0x00, 0xD3, 0x10, 0x46, 0x20, 0x81, - 0xC9, 0x78, 0xFA, 0x78, 0x91, 0x42, 0x00, 0xD8, 0x11, 0x46, 0x61, 0x81, 0x62, 0x46, 0x5B, 0x1C, - 0x52, 0x1E, 0x49, 0x1C, 0x40, 0x1E, 0x04, 0xF0, 0xE9, 0xFF, 0x06, 0x23, 0x04, 0x22, 0x0A, 0x21, - 0x08, 0x20, 0xE3, 0x5E, 0xA2, 0x5E, 0x61, 0x5E, 0x20, 0x5E, 0xFD, 0xF7, 0x7F, 0xF8, 0x3C, 0x4F, - 0x02, 0x98, 0x40, 0x3F, 0xB9, 0x7C, 0x02, 0x46, 0x89, 0x1C, 0x4A, 0x43, 0x03, 0x99, 0x04, 0x9B, - 0x52, 0x18, 0x9A, 0x82, 0xA1, 0x80, 0xE1, 0x80, 0x20, 0x81, 0x60, 0x81, 0x38, 0x46, 0x01, 0x21, - 0x20, 0x30, 0x81, 0x71, 0x00, 0x20, 0xB8, 0x75, 0xFF, 0xF7, 0x78, 0xFD, 0x04, 0x21, 0x61, 0x5E, - 0x01, 0x98, 0x88, 0x42, 0x5A, 0xDB, 0x06, 0x21, 0x61, 0x5E, 0x88, 0x42, 0x56, 0xDC, 0x08, 0x21, - 0x61, 0x5E, 0x00, 0x98, 0x88, 0x42, 0x51, 0xDB, 0x0A, 0x21, 0x61, 0x5E, 0x88, 0x42, 0x4D, 0xDC, - 0x38, 0x46, 0x80, 0x30, 0x81, 0x69, 0x8A, 0x5D, 0x4B, 0x5D, 0x93, 0x42, 0x00, 0xD2, 0x1A, 0x46, - 0x4A, 0x55, 0x81, 0x69, 0x72, 0x18, 0x53, 0x78, 0x6A, 0x18, 0x51, 0x78, 0x99, 0x42, 0x00, 0xD8, - 0x19, 0x46, 0x51, 0x70, 0x81, 0x69, 0x72, 0x18, 0x93, 0x78, 0x6A, 0x18, 0x91, 0x78, 0x99, 0x42, - 0x00, 0xD3, 0x19, 0x46, 0x91, 0x70, 0x81, 0x69, 0x72, 0x18, 0x6B, 0x18, 0xD2, 0x78, 0xD9, 0x78, - 0x91, 0x42, 0x00, 0xD8, 0x11, 0x46, 0xD9, 0x70, 0x06, 0x99, 0x03, 0x91, 0x1F, 0xE0, 0xC2, 0x69, - 0x49, 0x00, 0x8B, 0x18, 0x5B, 0x88, 0x53, 0x52, 0x03, 0x99, 0x82, 0x69, 0x89, 0x00, 0x8B, 0x18, - 0x1B, 0x79, 0x53, 0x54, 0x03, 0x99, 0x82, 0x69, 0x89, 0x00, 0x89, 0x18, 0x4A, 0x79, 0x4A, 0x70, - 0x03, 0x99, 0x82, 0x69, 0x89, 0x00, 0x89, 0x18, 0x8A, 0x79, 0x8A, 0x70, 0x03, 0x99, 0x82, 0x69, - 0x89, 0x00, 0x89, 0x18, 0xCA, 0x79, 0xCA, 0x70, 0x03, 0x99, 0x49, 0x1C, 0x03, 0x91, 0x7A, 0x7E, - 0x52, 0x1E, 0x91, 0x42, 0xDB, 0xDB, 0x78, 0x7E, 0x40, 0x1E, 0x78, 0x76, 0x07, 0xB0, 0xF0, 0xBD, - 0x78, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x1A, 0x4B, 0x02, 0x46, 0x1B, 0x7B, 0x08, 0x46, 0x19, 0x07, - 0x09, 0x0F, 0x03, 0x29, 0x0F, 0xD1, 0x00, 0x2A, 0x0E, 0xD0, 0x16, 0x4C, 0x01, 0x2A, 0x0E, 0xD0, - 0x02, 0x2A, 0x08, 0xD1, 0x00, 0x20, 0x05, 0xF0, 0x51, 0xFD, 0x00, 0x20, 0x10, 0x49, 0x60, 0x70, - 0x20, 0x72, 0x60, 0x39, 0x48, 0x74, 0x10, 0xBD, 0x05, 0xF0, 0x7A, 0xFE, 0x10, 0xBD, 0x61, 0x79, - 0x00, 0x29, 0x11, 0xD0, 0x02, 0xF0, 0xC6, 0xF9, 0xE0, 0x79, 0x10, 0x28, 0x06, 0xD2, 0x01, 0x21, - 0x61, 0x72, 0x40, 0x1C, 0xE0, 0x71, 0x00, 0xF0, 0x2D, 0xFB, 0x05, 0xE0, 0xFD, 0xF7, 0x64, 0xF8, - 0x01, 0xF0, 0xA0, 0xFE, 0x01, 0xF0, 0x78, 0xFE, 0x02, 0xF0, 0x14, 0xF9, 0x10, 0xBD, 0x00, 0x00, - 0x5C, 0x04, 0x00, 0x20, 0x78, 0x03, 0x00, 0x20, 0x70, 0xB5, 0x0C, 0x48, 0x05, 0x6A, 0x0B, 0x48, - 0x40, 0x30, 0x04, 0x6A, 0x03, 0x21, 0x89, 0x03, 0x20, 0x46, 0x88, 0x43, 0x04, 0x46, 0x07, 0x48, - 0x05, 0x62, 0x06, 0x48, 0x40, 0x30, 0x04, 0x62, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x04, 0xD0, - 0x21, 0x46, 0x28, 0x46, 0x02, 0x4A, 0x12, 0x68, 0x90, 0x47, 0x70, 0xBD, 0x00, 0x40, 0x00, 0x50, - 0x18, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x0A, 0x48, 0x04, 0x6A, 0x09, 0x48, 0x40, 0x30, 0x05, 0x6A, - 0x07, 0x48, 0x04, 0x62, 0x06, 0x48, 0x40, 0x30, 0x05, 0x62, 0x06, 0x48, 0x00, 0x68, 0x00, 0x28, - 0x04, 0xD0, 0x29, 0x46, 0x20, 0x46, 0x03, 0x4A, 0x12, 0x68, 0x90, 0x47, 0x70, 0xBD, 0x00, 0x00, - 0x80, 0x40, 0x00, 0x50, 0x1C, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x13, 0x46, 0x13, 0x4A, 0x12, 0x78, - 0x03, 0x2A, 0x02, 0xD0, 0x02, 0x22, 0x11, 0x4C, 0x22, 0x70, 0x00, 0x22, 0x10, 0x4C, 0x22, 0x70, - 0x10, 0x4C, 0x22, 0x70, 0x10, 0x4A, 0x12, 0x6A, 0x01, 0x24, 0xA4, 0x04, 0xA2, 0x43, 0x0E, 0x4C, - 0x22, 0x62, 0x22, 0x46, 0x12, 0x6A, 0xE4, 0x01, 0xA2, 0x43, 0x0B, 0x4C, 0x22, 0x62, 0x22, 0x46, - 0x12, 0x68, 0x80, 0x24, 0xA2, 0x43, 0x08, 0x4C, 0x22, 0x60, 0x22, 0x46, 0x12, 0x68, 0xFF, 0x24, - 0x01, 0x34, 0xA2, 0x43, 0x04, 0x4C, 0x22, 0x60, 0x10, 0xBD, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x20, - 0x8E, 0x00, 0x00, 0x20, 0x8F, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x50, 0x30, 0xB5, 0x85, 0xB0, - 0x0F, 0x48, 0x04, 0x68, 0x23, 0x20, 0x40, 0x01, 0x25, 0x18, 0x03, 0x22, 0x0D, 0x48, 0x03, 0x95, - 0x02, 0x94, 0x04, 0x92, 0x02, 0x88, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x0A, 0x49, - 0xA0, 0x20, 0x00, 0x23, 0x00, 0xF0, 0x24, 0xFF, 0x06, 0x48, 0x01, 0x88, 0x20, 0x46, 0x02, 0xF0, - 0x49, 0xF9, 0x04, 0x48, 0x01, 0x88, 0x28, 0x46, 0x02, 0xF0, 0x44, 0xF9, 0x05, 0xB0, 0x30, 0xBD, - 0xC8, 0x01, 0x00, 0x20, 0x16, 0x01, 0x00, 0x20, 0x30, 0x46, 0x00, 0x00, 0x05, 0x48, 0x00, 0x78, - 0xFF, 0x28, 0x00, 0xD1, 0x70, 0x47, 0x03, 0x48, 0x01, 0x78, 0xFF, 0x20, 0x01, 0x4A, 0x10, 0x70, - 0x08, 0x46, 0xF7, 0xE7, 0x92, 0x00, 0x00, 0x20, 0xFE, 0xB5, 0x31, 0x4A, 0x08, 0x25, 0x04, 0x24, - 0x55, 0x5F, 0x14, 0x5F, 0x94, 0x46, 0x60, 0x3A, 0x01, 0x95, 0x96, 0x7C, 0x62, 0x46, 0x06, 0x23, - 0xD3, 0x5E, 0x2B, 0x4A, 0xB6, 0x46, 0xB6, 0x1C, 0x00, 0x20, 0x20, 0x32, 0x00, 0x96, 0xD2, 0x68, - 0x01, 0x46, 0x01, 0x2D, 0x0B, 0xDB, 0x6F, 0x1E, 0x77, 0x43, 0x25, 0x46, 0x05, 0xE0, 0x7E, 0x19, - 0x76, 0x00, 0x96, 0x5F, 0x49, 0x1C, 0x30, 0x18, 0x6D, 0x1C, 0x9D, 0x42, 0xF7, 0xDD, 0x65, 0x46, - 0x0A, 0x26, 0xAE, 0x5F, 0x1E, 0x4D, 0xB4, 0x46, 0x60, 0x3D, 0xED, 0x7C, 0xAE, 0x42, 0x0E, 0xDC, - 0x65, 0x46, 0x00, 0x9E, 0x6D, 0x1C, 0x75, 0x43, 0x2F, 0x46, 0x25, 0x46, 0x05, 0xE0, 0x7E, 0x19, - 0x76, 0x00, 0x96, 0x5F, 0x49, 0x1C, 0x80, 0x19, 0x6D, 0x1C, 0x9D, 0x42, 0xF7, 0xDD, 0x14, 0x4F, - 0x68, 0x26, 0x60, 0x3F, 0xBD, 0x7C, 0xBE, 0x5F, 0xAD, 0x1C, 0x6E, 0x43, 0x01, 0x2C, 0x0C, 0xDB, - 0x64, 0x1E, 0x35, 0x19, 0x01, 0x9C, 0x06, 0xE0, 0x6F, 0x00, 0xD7, 0x5F, 0x75, 0x44, 0xC0, 0x19, - 0x49, 0x1C, 0xAD, 0x1C, 0x64, 0x1C, 0x64, 0x45, 0xF6, 0xDD, 0x73, 0x45, 0x0C, 0xDC, 0x5B, 0x1C, - 0xF4, 0x18, 0x01, 0x9B, 0x06, 0xE0, 0x65, 0x00, 0x55, 0x5F, 0x74, 0x44, 0x40, 0x19, 0x49, 0x1C, - 0xA4, 0x1C, 0x5B, 0x1C, 0x63, 0x45, 0xF6, 0xDD, 0xFB, 0xF7, 0xB8, 0xFC, 0xFE, 0xBD, 0x00, 0x00, - 0x98, 0x01, 0x00, 0x20, 0x70, 0xB5, 0xFC, 0xF7, 0xE5, 0xFE, 0x0B, 0x48, 0x0B, 0x49, 0x08, 0x80, - 0x00, 0x25, 0x0C, 0xE0, 0xFD, 0xF7, 0x42, 0xFE, 0xFF, 0xF7, 0x80, 0xFF, 0x04, 0x46, 0xFF, 0x2C, - 0x04, 0xD0, 0x30, 0x20, 0x60, 0x43, 0x05, 0x49, 0x08, 0x80, 0x02, 0xE0, 0x6D, 0x1C, 0x0A, 0x2D, - 0xF0, 0xDB, 0x00, 0xBF, 0x70, 0xBD, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x20, - 0xC1, 0x07, 0xC2, 0x0F, 0x10, 0x18, 0x42, 0x10, 0x07, 0x48, 0x10, 0x18, 0x00, 0x78, 0x00, 0x29, - 0x02, 0xD0, 0x00, 0x07, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x09, 0x08, 0x28, 0x02, 0xDD, 0x00, 0x20, - 0xC0, 0x43, 0x70, 0x47, 0x40, 0x1E, 0x70, 0x47, 0x6D, 0x04, 0x00, 0x20, 0xF8, 0xB5, 0x00, 0x27, - 0xC4, 0x5F, 0x0E, 0x46, 0x94, 0x46, 0x01, 0x23, 0x25, 0x46, 0x09, 0xE0, 0x59, 0x00, 0x41, 0x5E, - 0xA1, 0x42, 0x01, 0xDD, 0x0C, 0x46, 0x02, 0xE0, 0xA9, 0x42, 0x00, 0xDA, 0x0D, 0x46, 0x5B, 0x1C, - 0xB3, 0x42, 0xF3, 0xDB, 0x61, 0x1B, 0x30, 0x29, 0x04, 0xDA, 0x61, 0x19, 0xCA, 0x0F, 0x51, 0x18, - 0x4A, 0x10, 0x28, 0xE0, 0x00, 0x21, 0x20, 0x4D, 0x0B, 0x46, 0x6B, 0x54, 0x49, 0x1C, 0x10, 0x29, - 0xFB, 0xDB, 0x00, 0x24, 0x23, 0x46, 0x2A, 0x46, 0x17, 0xE0, 0x59, 0x00, 0x41, 0x5E, 0x11, 0x25, - 0x6D, 0x01, 0x49, 0x19, 0xCD, 0x17, 0xAD, 0x0E, 0x69, 0x18, 0x89, 0x11, 0x01, 0xD5, 0x00, 0x21, - 0x02, 0xE0, 0x0F, 0x29, 0x00, 0xDD, 0x0F, 0x21, 0x55, 0x5C, 0x6D, 0x1C, 0xED, 0xB2, 0x55, 0x54, - 0xA5, 0x42, 0x01, 0xDD, 0x64, 0x1C, 0x0F, 0x46, 0x5B, 0x1C, 0xB3, 0x42, 0xE5, 0xDB, 0xBA, 0x01, - 0xFF, 0x3A, 0xFF, 0x3A, 0x01, 0x3A, 0x00, 0x25, 0x17, 0x46, 0x30, 0x37, 0x29, 0x46, 0x2B, 0x46, - 0x30, 0x3A, 0x08, 0xE0, 0x5C, 0x00, 0x04, 0x5F, 0xBC, 0x42, 0x03, 0xDA, 0x94, 0x42, 0x01, 0xDD, - 0x2D, 0x19, 0x49, 0x1C, 0x5B, 0x1C, 0xB3, 0x42, 0xF4, 0xDB, 0x60, 0x46, 0x01, 0x60, 0x28, 0x46, - 0xFB, 0xF7, 0x24, 0xFC, 0xF8, 0xBD, 0x00, 0x00, 0x8C, 0x05, 0x00, 0x20, 0xFF, 0xB5, 0x8C, 0x46, - 0x00, 0x21, 0x44, 0x5E, 0x81, 0xB0, 0x8E, 0x46, 0x01, 0x22, 0x25, 0x46, 0x09, 0xE0, 0x51, 0x00, - 0x41, 0x5E, 0xA1, 0x42, 0x01, 0xDD, 0x0C, 0x46, 0x02, 0xE0, 0xA9, 0x42, 0x00, 0xDA, 0x0D, 0x46, - 0x52, 0x1C, 0x62, 0x45, 0xF3, 0xDB, 0x67, 0x1B, 0x30, 0x2F, 0x10, 0xDA, 0x61, 0x19, 0xCA, 0x0F, - 0x51, 0x18, 0x49, 0x10, 0x0A, 0x1E, 0x00, 0xDA, 0x4A, 0x42, 0x2F, 0x4B, 0x1A, 0x26, 0x9E, 0x5F, - 0xB2, 0x42, 0x2E, 0xDD, 0x10, 0x2F, 0x2C, 0xDA, 0x5A, 0x83, 0x1A, 0x83, 0x29, 0xE0, 0x00, 0x22, - 0x2A, 0x49, 0x13, 0x46, 0x8B, 0x54, 0x52, 0x1C, 0x10, 0x2A, 0xFB, 0xDB, 0x00, 0x26, 0x33, 0x46, - 0x18, 0xE0, 0x59, 0x00, 0x41, 0x5E, 0x11, 0x22, 0x52, 0x01, 0x89, 0x18, 0xCA, 0x17, 0x92, 0x0E, - 0x51, 0x18, 0x8A, 0x11, 0x01, 0xD5, 0x00, 0x22, 0x02, 0xE0, 0x0F, 0x2A, 0x00, 0xDD, 0x0F, 0x22, - 0x1E, 0x49, 0x8F, 0x5C, 0x7F, 0x1C, 0xFF, 0xB2, 0x8F, 0x54, 0xB7, 0x42, 0x01, 0xDD, 0x76, 0x1C, - 0x96, 0x46, 0x5B, 0x1C, 0x63, 0x45, 0xE4, 0xDB, 0x71, 0x46, 0x89, 0x01, 0xFF, 0x39, 0xFF, 0x39, - 0x01, 0x39, 0x00, 0x23, 0x0F, 0x46, 0x30, 0x37, 0x1A, 0x46, 0x30, 0x39, 0x00, 0x93, 0x0A, 0xE0, - 0x56, 0x00, 0x86, 0x5F, 0xBE, 0x42, 0x05, 0xDA, 0x8E, 0x42, 0x03, 0xDD, 0x9B, 0x19, 0x00, 0x9E, - 0x76, 0x1C, 0x00, 0x96, 0x52, 0x1C, 0x62, 0x45, 0xF2, 0xDB, 0x18, 0x46, 0x00, 0x99, 0xFB, 0xF7, - 0xB5, 0xFB, 0x03, 0x99, 0x00, 0x9A, 0x0A, 0x60, 0x00, 0x2D, 0x03, 0xDD, 0x04, 0x99, 0x0D, 0x60, - 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0x2C, 0x02, 0xDA, 0x04, 0x99, 0x0C, 0x60, 0xF8, 0xE7, 0x04, 0x9A, - 0x00, 0x21, 0x11, 0x60, 0xF4, 0xE7, 0x00, 0x00, 0x98, 0x01, 0x00, 0x20, 0x8C, 0x05, 0x00, 0x20, - 0xF0, 0xB5, 0x4B, 0x4E, 0x00, 0x22, 0x37, 0x46, 0xB2, 0x83, 0x10, 0x46, 0x20, 0x37, 0x19, 0xE0, - 0x40, 0x1C, 0x99, 0x7C, 0x84, 0x46, 0x89, 0x1C, 0x48, 0x43, 0x00, 0x21, 0x09, 0xE0, 0x53, 0x00, - 0x3C, 0x69, 0x45, 0x00, 0xE3, 0x5A, 0x49, 0x1C, 0xFC, 0x68, 0x52, 0x1C, 0x09, 0xB2, 0x63, 0x53, - 0x12, 0xB2, 0x3F, 0x4B, 0x40, 0x1C, 0x60, 0x3B, 0x9B, 0x7C, 0x00, 0xB2, 0x99, 0x42, 0xEE, 0xDB, - 0x60, 0x46, 0x00, 0xB2, 0x3A, 0x4B, 0x60, 0x3B, 0xD9, 0x7C, 0x88, 0x42, 0xE0, 0xDB, 0x19, 0x46, - 0xCA, 0x7C, 0x88, 0x7C, 0x52, 0x1C, 0x83, 0x1C, 0x5A, 0x43, 0x80, 0x1C, 0x14, 0xB2, 0x13, 0xE0, - 0x33, 0x4B, 0xFA, 0x68, 0x41, 0x00, 0x60, 0x3B, 0x5B, 0x7D, 0x51, 0x5E, 0x99, 0x42, 0x06, 0xDD, - 0x7A, 0x69, 0x00, 0x21, 0x11, 0x54, 0xB1, 0x8B, 0x49, 0x1C, 0xB1, 0x83, 0x02, 0xE0, 0x7A, 0x69, - 0x02, 0x21, 0x11, 0x54, 0x40, 0x1C, 0x00, 0xB2, 0xA0, 0x42, 0xE9, 0xDB, 0x29, 0x48, 0x01, 0x7E, - 0x00, 0x29, 0x4C, 0xD0, 0xC1, 0x7D, 0x1C, 0xE0, 0x25, 0x4A, 0x61, 0x46, 0x60, 0x3A, 0x93, 0x7C, - 0x82, 0x7D, 0x9B, 0x1C, 0x59, 0x43, 0x89, 0x18, 0x00, 0x23, 0x09, 0xB2, 0x02, 0x26, 0x08, 0xE0, - 0xFD, 0x68, 0x4C, 0x00, 0x2B, 0x53, 0x7C, 0x69, 0x52, 0x1C, 0x66, 0x54, 0x49, 0x1C, 0x12, 0xB2, - 0x09, 0xB2, 0x84, 0x7D, 0x05, 0x7E, 0x64, 0x19, 0x94, 0x42, 0xF1, 0xDC, 0x61, 0x46, 0x49, 0x1C, - 0x09, 0xB2, 0x8C, 0x46, 0xC1, 0x7D, 0x42, 0x7E, 0x8A, 0x18, 0x62, 0x45, 0xDC, 0xDC, 0x01, 0x7F, - 0x00, 0x29, 0x24, 0xD0, 0xC1, 0x7E, 0x1C, 0xE0, 0x11, 0x4A, 0x61, 0x46, 0x60, 0x3A, 0x93, 0x7C, - 0x82, 0x7E, 0x9B, 0x1C, 0x59, 0x43, 0x89, 0x18, 0x00, 0x23, 0x09, 0xB2, 0x02, 0x26, 0x08, 0xE0, - 0xFD, 0x68, 0x4C, 0x00, 0x2B, 0x53, 0x7C, 0x69, 0x52, 0x1C, 0x66, 0x54, 0x49, 0x1C, 0x12, 0xB2, - 0x09, 0xB2, 0x84, 0x7E, 0x05, 0x7F, 0x64, 0x19, 0x94, 0x42, 0xF1, 0xDC, 0x61, 0x46, 0x49, 0x1C, - 0x09, 0xB2, 0x8C, 0x46, 0xC1, 0x7E, 0x42, 0x7F, 0x8A, 0x18, 0x62, 0x45, 0xDC, 0xDC, 0xF0, 0xBD, - 0x98, 0x01, 0x00, 0x20, 0x5C, 0x04, 0x00, 0x20, 0xF7, 0xB5, 0x03, 0x46, 0x96, 0x46, 0x1C, 0x49, - 0x9A, 0x00, 0x8B, 0x69, 0x82, 0xB0, 0x9C, 0x5C, 0x20, 0x39, 0x8C, 0x80, 0x01, 0x94, 0xD2, 0x18, - 0x57, 0x78, 0xCF, 0x80, 0x93, 0x78, 0x0B, 0x81, 0xD2, 0x78, 0x0C, 0x46, 0x60, 0x3C, 0x00, 0x92, - 0x4A, 0x81, 0xA1, 0x7C, 0x26, 0x46, 0x40, 0x36, 0x8C, 0x46, 0x00, 0x20, 0x89, 0x1C, 0x59, 0x43, - 0xB1, 0x82, 0x17, 0xE0, 0x14, 0x25, 0x75, 0x5F, 0x01, 0x99, 0x0C, 0xE0, 0x0C, 0x4A, 0x6C, 0x18, - 0xD2, 0x68, 0x64, 0x00, 0x14, 0x5F, 0x84, 0x42, 0x04, 0xDD, 0x20, 0x46, 0x03, 0x9C, 0x72, 0x46, - 0x21, 0x60, 0x13, 0x60, 0x49, 0x1C, 0xB9, 0x42, 0xF0, 0xDD, 0x61, 0x46, 0x69, 0x18, 0x89, 0x1C, - 0xB1, 0x82, 0x5B, 0x1C, 0x00, 0x99, 0x8B, 0x42, 0xE4, 0xDD, 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0x00, - 0xB8, 0x01, 0x00, 0x20, 0xFF, 0xB5, 0x12, 0x49, 0x9C, 0x46, 0x8B, 0x7C, 0x0F, 0x46, 0x05, 0x46, - 0x99, 0x1C, 0x40, 0x37, 0x69, 0x43, 0xB9, 0x82, 0x00, 0x20, 0x39, 0x46, 0x96, 0x46, 0x40, 0x31, - 0xCA, 0x68, 0x10, 0xE0, 0x14, 0x26, 0x71, 0x46, 0xBE, 0x5F, 0x06, 0xE0, 0x74, 0x18, 0x64, 0x00, - 0x14, 0x5F, 0x84, 0x42, 0x00, 0xDD, 0x20, 0x46, 0x49, 0x1C, 0x61, 0x45, 0xF6, 0xDD, 0xF1, 0x18, - 0x89, 0x1C, 0xB9, 0x82, 0x6D, 0x1C, 0x01, 0x99, 0x8D, 0x42, 0xEB, 0xDD, 0x04, 0xB0, 0xF0, 0xBD, - 0x38, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x0D, 0x4F, 0x0B, 0x48, 0x38, 0x61, 0x0C, 0x4A, 0x00, 0x20, - 0x14, 0x46, 0x10, 0x3C, 0x7E, 0x79, 0x0C, 0xE0, 0x41, 0x00, 0x53, 0x5A, 0x65, 0x5A, 0x5B, 0x19, - 0x1B, 0x04, 0x5B, 0x0C, 0x53, 0x52, 0x51, 0x5A, 0x3B, 0x69, 0x99, 0x42, 0x00, 0xD2, 0x39, 0x61, - 0x40, 0x1C, 0xB0, 0x42, 0xF0, 0xDB, 0xF0, 0xBD, 0xFF, 0xFF, 0xFF, 0x7F, 0x78, 0x03, 0x00, 0x20, - 0x90, 0x1A, 0x00, 0x20, 0xFC, 0xB5, 0x00, 0x25, 0x6F, 0x4C, 0xED, 0x43, 0x00, 0x20, 0x26, 0x46, - 0x6C, 0x4F, 0xAC, 0x46, 0x80, 0x3E, 0x04, 0xE0, 0x00, 0x22, 0xE3, 0x6B, 0x41, 0x1C, 0x1A, 0x54, - 0x08, 0x46, 0x69, 0x4A, 0x1C, 0x21, 0x80, 0x3A, 0x51, 0x56, 0x88, 0x42, 0xF4, 0xDB, 0x00, 0x21, - 0x14, 0x46, 0x40, 0x34, 0x88, 0x00, 0x64, 0x4F, 0x01, 0x90, 0x3E, 0x6C, 0x61, 0x4B, 0x33, 0x50, - 0xBB, 0x6B, 0xFF, 0x22, 0x5A, 0x54, 0x61, 0x4A, 0x48, 0x00, 0x12, 0x5E, 0x52, 0x1C, 0x70, 0xD0, - 0x5C, 0x4A, 0x00, 0x23, 0x3D, 0xE0, 0x5D, 0x4E, 0x28, 0x3E, 0x33, 0x5E, 0x5B, 0x1C, 0x04, 0xD0, - 0x33, 0x46, 0x14, 0x33, 0x1B, 0x5E, 0x5B, 0x1C, 0x08, 0xD1, 0x58, 0x4B, 0x57, 0x4D, 0x1B, 0x5A, - 0x33, 0x52, 0x56, 0x4B, 0x14, 0x33, 0x1B, 0x5A, 0x14, 0x3D, 0x2B, 0x52, 0x52, 0x4F, 0x73, 0x46, - 0x5D, 0x00, 0xFF, 0x6A, 0x36, 0x5E, 0x7F, 0x5F, 0x50, 0x4B, 0xF6, 0x19, 0xF7, 0x0F, 0xBE, 0x19, - 0x1B, 0x5E, 0x76, 0x10, 0x9B, 0x1B, 0x00, 0x93, 0x4C, 0x4B, 0x4B, 0x4F, 0x14, 0x3B, 0x3F, 0x6B, - 0x1E, 0x5E, 0x7D, 0x5F, 0x28, 0x33, 0x75, 0x19, 0xEE, 0x0F, 0x1B, 0x5E, 0x75, 0x19, 0x6D, 0x10, - 0x5D, 0x1B, 0x00, 0x9B, 0x6D, 0x43, 0x5B, 0x43, 0x5D, 0x19, 0x95, 0x42, 0x07, 0xDA, 0x42, 0x4E, - 0x73, 0x46, 0xB6, 0x6B, 0x2A, 0x46, 0x73, 0x54, 0x14, 0x23, 0xE3, 0x5E, 0x9C, 0x46, 0xA3, 0x8A, - 0x5B, 0x1C, 0x3D, 0x4E, 0xA3, 0x82, 0x80, 0x3E, 0x1C, 0x27, 0x1B, 0xB2, 0xF7, 0x57, 0x9E, 0x46, - 0xBB, 0x42, 0xB8, 0xDB, 0x38, 0x4B, 0x66, 0x46, 0xDB, 0x6B, 0x67, 0x46, 0x9E, 0x5D, 0x76, 0x1C, - 0xDE, 0x55, 0x35, 0x4E, 0x01, 0x9B, 0x36, 0x6C, 0x33, 0x4F, 0xF2, 0x50, 0x7B, 0x68, 0x9A, 0x42, - 0x17, 0xD9, 0x32, 0x4B, 0x3E, 0x46, 0x1D, 0x5E, 0x63, 0x46, 0xF6, 0x6A, 0x5B, 0x00, 0xF6, 0x5E, - 0x2E, 0x4F, 0xAD, 0x1B, 0x2C, 0x4E, 0x14, 0x37, 0x36, 0x6B, 0x38, 0x5E, 0xF3, 0x5E, 0x6D, 0x43, - 0xC0, 0x1A, 0x40, 0x43, 0x2D, 0x18, 0x95, 0x42, 0x03, 0xDA, 0x27, 0x4A, 0x01, 0x98, 0x12, 0x6C, - 0x15, 0x50, 0x49, 0x1C, 0x0A, 0x29, 0x00, 0xDA, 0x7C, 0xE7, 0x00, 0x26, 0x3B, 0xE0, 0x22, 0x4F, - 0xF8, 0x6B, 0x81, 0x57, 0x01, 0x29, 0x35, 0xDD, 0x00, 0x20, 0xC0, 0x43, 0x02, 0x29, 0x02, 0xD1, - 0x30, 0x46, 0x00, 0xF0, 0x3D, 0xF8, 0x41, 0x1C, 0x2C, 0xD1, 0x1B, 0x49, 0xCA, 0x6B, 0x00, 0x21, - 0x92, 0x57, 0x24, 0xE0, 0x18, 0x4F, 0x14, 0x21, 0xBB, 0x6B, 0x61, 0x5E, 0x9C, 0x46, 0x5B, 0x56, - 0xB3, 0x42, 0x1A, 0xD1, 0x43, 0x1C, 0x04, 0xD1, 0x08, 0x46, 0x3B, 0x6C, 0x89, 0x00, 0x5D, 0x58, - 0x12, 0xE0, 0x11, 0x4F, 0x8B, 0x00, 0x3F, 0x6C, 0xFB, 0x58, 0xAB, 0x42, 0x09, 0xDA, 0xFF, 0x25, - 0x61, 0x46, 0x0D, 0x54, 0x0C, 0x4B, 0x14, 0x20, 0x20, 0x5E, 0x19, 0x6C, 0x83, 0x00, 0xCD, 0x58, - 0x02, 0xE0, 0xFF, 0x23, 0x67, 0x46, 0x7B, 0x54, 0x52, 0x1E, 0xA1, 0x8A, 0x49, 0x1C, 0xA1, 0x82, - 0x00, 0x2A, 0xD7, 0xDC, 0x76, 0x1C, 0x04, 0x48, 0x1C, 0x21, 0x80, 0x38, 0x41, 0x56, 0x8E, 0x42, - 0xBD, 0xDB, 0xFC, 0xBD, 0xFF, 0xFF, 0xFF, 0x7F, 0xB8, 0x01, 0x00, 0x20, 0xE2, 0x05, 0x00, 0x20, - 0xF0, 0xB5, 0x00, 0x24, 0xE4, 0x43, 0x89, 0xB0, 0x80, 0x4A, 0x02, 0x94, 0x01, 0x94, 0x92, 0x6B, - 0xA4, 0x46, 0x00, 0x21, 0x08, 0x92, 0x52, 0x56, 0x82, 0x42, 0x01, 0xD1, 0xA4, 0x46, 0x0C, 0x46, - 0x49, 0x1C, 0x0A, 0x29, 0x01, 0xDA, 0x08, 0x9A, 0xF5, 0xE7, 0x78, 0x48, 0x00, 0x21, 0xC3, 0x6B, - 0x07, 0x93, 0xC3, 0x6A, 0x00, 0x6B, 0x9E, 0x46, 0x74, 0x4B, 0x06, 0x90, 0x80, 0x3B, 0x1C, 0x20, - 0x18, 0x56, 0x73, 0x4A, 0x05, 0x90, 0x3D, 0xE0, 0x07, 0x98, 0x40, 0x5C, 0x00, 0x28, 0x37, 0xD1, - 0x60, 0x46, 0x70, 0x4E, 0x40, 0x00, 0x33, 0x5E, 0x5B, 0x1C, 0x04, 0xD0, 0x33, 0x46, 0x14, 0x33, - 0x1B, 0x5E, 0x5B, 0x1C, 0x09, 0xD1, 0x6B, 0x4B, 0x6A, 0x4D, 0x28, 0x33, 0x1B, 0x5A, 0x33, 0x52, - 0x68, 0x4B, 0x3C, 0x33, 0x1B, 0x5A, 0x14, 0x35, 0x2B, 0x52, 0x33, 0x5E, 0x4D, 0x00, 0x2F, 0x46, - 0x76, 0x46, 0x75, 0x5F, 0x5E, 0x19, 0x63, 0x4B, 0xF5, 0x0F, 0x28, 0x33, 0xAD, 0x19, 0x1B, 0x5E, - 0x6D, 0x10, 0x5B, 0x1B, 0x00, 0x93, 0x5F, 0x4B, 0x06, 0x9E, 0x14, 0x33, 0x1B, 0x5E, 0xF5, 0x5F, - 0x5B, 0x19, 0x5C, 0x4D, 0x3C, 0x35, 0x28, 0x5E, 0xDD, 0x0F, 0xEB, 0x18, 0x5B, 0x10, 0xC0, 0x1A, - 0x00, 0x9B, 0x40, 0x43, 0x5B, 0x43, 0x18, 0x18, 0x90, 0x42, 0x01, 0xDA, 0x02, 0x46, 0x02, 0x91, - 0x05, 0x98, 0x49, 0x1C, 0x81, 0x42, 0xBF, 0xDB, 0x51, 0x4E, 0xB2, 0x42, 0x5F, 0xD0, 0x4F, 0x48, - 0x40, 0x68, 0x04, 0x90, 0x82, 0x42, 0x15, 0xD9, 0x60, 0x46, 0x41, 0x00, 0x4D, 0x48, 0x75, 0x46, - 0x28, 0x30, 0x43, 0x5E, 0x02, 0x98, 0x40, 0x00, 0x2D, 0x5E, 0x5B, 0x1B, 0x49, 0x4D, 0x5B, 0x43, - 0x3C, 0x35, 0x69, 0x5E, 0x06, 0x9D, 0x28, 0x5E, 0x08, 0x1A, 0x40, 0x43, 0x18, 0x18, 0x90, 0x42, - 0x00, 0xDA, 0x02, 0x46, 0x42, 0x4B, 0x00, 0x21, 0x3B, 0xE0, 0x07, 0x98, 0x40, 0x5C, 0x00, 0x28, - 0x36, 0xD1, 0x40, 0x4F, 0x60, 0x00, 0x3E, 0x5E, 0x76, 0x1C, 0x04, 0xD0, 0x3E, 0x46, 0x14, 0x36, - 0x36, 0x5E, 0x76, 0x1C, 0x08, 0xD1, 0x3B, 0x4E, 0x28, 0x36, 0x36, 0x5A, 0x3E, 0x52, 0x39, 0x4E, - 0x3C, 0x36, 0x35, 0x5A, 0x28, 0x3E, 0x35, 0x52, 0x3D, 0x5E, 0x4E, 0x00, 0x77, 0x46, 0x03, 0x96, - 0xBE, 0x5F, 0xAF, 0x19, 0x33, 0x4D, 0xFE, 0x0F, 0x28, 0x35, 0xF6, 0x19, 0x2D, 0x5E, 0x76, 0x10, - 0xAD, 0x1B, 0x00, 0x95, 0x2F, 0x4D, 0x06, 0x9F, 0x03, 0x9E, 0x14, 0x35, 0x2D, 0x5E, 0xBE, 0x5F, - 0xAD, 0x19, 0x2C, 0x4E, 0x3C, 0x36, 0x30, 0x5E, 0xEE, 0x0F, 0x75, 0x19, 0x6D, 0x10, 0x40, 0x1B, - 0x00, 0x9D, 0x40, 0x43, 0x6D, 0x43, 0x28, 0x18, 0x98, 0x42, 0x01, 0xDA, 0x03, 0x46, 0x01, 0x91, - 0x49, 0x1C, 0x05, 0x98, 0x81, 0x42, 0xC0, 0xDB, 0x21, 0x48, 0x83, 0x42, 0x03, 0xD1, 0x00, 0x20, - 0xC0, 0x43, 0x09, 0xB0, 0xF0, 0xBD, 0x04, 0x98, 0x1C, 0x4F, 0x83, 0x42, 0x14, 0xD9, 0x1D, 0x48, - 0x66, 0x00, 0x28, 0x30, 0x81, 0x5F, 0x01, 0x98, 0x75, 0x46, 0x40, 0x00, 0x2D, 0x5E, 0x49, 0x1B, - 0x18, 0x4D, 0x49, 0x43, 0x3C, 0x35, 0xAD, 0x5F, 0x06, 0x9E, 0x30, 0x5E, 0x28, 0x1A, 0x40, 0x43, - 0x08, 0x18, 0x98, 0x42, 0x00, 0xDA, 0x03, 0x46, 0x60, 0x46, 0x39, 0x6C, 0x80, 0x00, 0x3E, 0x46, - 0x0F, 0x58, 0xA5, 0x00, 0x49, 0x59, 0xFF, 0x18, 0x89, 0x18, 0x8F, 0x42, 0x0A, 0xDD, 0x08, 0x9C, - 0x63, 0x46, 0x02, 0x99, 0xE1, 0x54, 0xF3, 0x6B, 0x02, 0x9C, 0x01, 0x21, 0x19, 0x55, 0x31, 0x6C, - 0x0A, 0x50, 0x08, 0xE0, 0x08, 0x98, 0x01, 0x99, 0x01, 0x55, 0xF1, 0x6B, 0x01, 0x9A, 0x01, 0x20, - 0x88, 0x54, 0x30, 0x6C, 0x43, 0x51, 0x00, 0x20, 0xC3, 0xE7, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x20, - 0xFF, 0xFF, 0xFF, 0x7F, 0xBA, 0x05, 0x00, 0x20, 0x70, 0xB5, 0x00, 0x24, 0x12, 0x48, 0x80, 0x69, - 0x00, 0x05, 0x05, 0x0F, 0x10, 0x48, 0x40, 0x69, 0x80, 0x01, 0x80, 0x0F, 0x07, 0xD1, 0xFD, 0xF7, - 0x37, 0xFF, 0x06, 0x46, 0x69, 0x1C, 0xFB, 0xF7, 0x6F, 0xF8, 0x04, 0x46, 0x12, 0xE0, 0x0A, 0x48, - 0x40, 0x69, 0x80, 0x01, 0x80, 0x0F, 0x01, 0x28, 0x07, 0xD1, 0xFD, 0xF7, 0x2D, 0xFF, 0x06, 0x46, - 0x69, 0x1C, 0xFB, 0xF7, 0x61, 0xF8, 0x04, 0x46, 0x04, 0xE0, 0x69, 0x1C, 0x03, 0x48, 0xFB, 0xF7, - 0x5B, 0xF8, 0x04, 0x46, 0x20, 0x46, 0x70, 0xBD, 0x00, 0x02, 0x00, 0x50, 0x00, 0x80, 0x51, 0x01, - 0x10, 0xB5, 0x86, 0xB0, 0x00, 0x24, 0x0D, 0xE0, 0xFD, 0xF7, 0x04, 0xFA, 0x60, 0x1C, 0x80, 0xB2, - 0x04, 0x46, 0x3D, 0x49, 0x88, 0x42, 0x05, 0xDD, 0xF1, 0x20, 0x03, 0xF0, 0x33, 0xFA, 0x01, 0x20, - 0x06, 0xB0, 0x10, 0xBD, 0xFF, 0xF7, 0x22, 0xFB, 0x35, 0x28, 0xED, 0xD1, 0x00, 0x24, 0x05, 0xE0, - 0x00, 0x20, 0x36, 0x49, 0x09, 0x68, 0x08, 0x55, 0x60, 0x1C, 0x84, 0xB2, 0x10, 0x2C, 0xF7, 0xDB, - 0x03, 0x22, 0x32, 0x48, 0x01, 0x68, 0x32, 0x48, 0x00, 0x68, 0x02, 0xAB, 0x07, 0xC3, 0x31, 0x48, - 0x00, 0x78, 0x42, 0x00, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x2E, 0x49, 0xA0, 0x20, - 0x00, 0x23, 0x00, 0xF0, 0x15, 0xFA, 0x29, 0x48, 0x01, 0x68, 0x01, 0x20, 0xFF, 0xF7, 0x32, 0xFA, - 0x02, 0xF0, 0x72, 0xFD, 0x00, 0x28, 0x01, 0xD0, 0x03, 0xF0, 0x3A, 0xF9, 0x00, 0x20, 0x27, 0x49, - 0x08, 0x70, 0x27, 0x48, 0x80, 0x79, 0x00, 0x06, 0xC0, 0x0F, 0x01, 0x28, 0x02, 0xD1, 0x25, 0x48, - 0x04, 0x78, 0x02, 0xE0, 0x23, 0x48, 0x00, 0x78, 0x44, 0x00, 0x03, 0x22, 0x1B, 0x48, 0x01, 0x68, - 0x1B, 0x48, 0x00, 0x68, 0x02, 0xAB, 0x07, 0xC3, 0x00, 0x21, 0x0A, 0x46, 0x01, 0x94, 0x00, 0x91, - 0x11, 0x21, 0x89, 0x02, 0xA0, 0x20, 0x00, 0x23, 0x00, 0xF0, 0xEA, 0xF9, 0x02, 0x22, 0x13, 0x48, - 0x00, 0x68, 0x01, 0x19, 0x12, 0x48, 0x00, 0x68, 0x00, 0x19, 0x02, 0xAB, 0x07, 0xC3, 0x16, 0x48, - 0x00, 0x1B, 0x82, 0xB2, 0x00, 0x21, 0x11, 0x20, 0x80, 0x02, 0x20, 0x18, 0x01, 0x92, 0x00, 0x91, - 0x81, 0xB2, 0x00, 0x22, 0xA0, 0x20, 0x13, 0x46, 0x00, 0xF0, 0xD2, 0xF9, 0x08, 0x48, 0x00, 0x68, - 0x00, 0x5D, 0xFF, 0x28, 0x04, 0xD0, 0x05, 0x48, 0x00, 0x68, 0x00, 0x5D, 0xFF, 0x28, 0x01, 0xD1, - 0x02, 0x20, 0x8D, 0xE7, 0x00, 0x20, 0x8B, 0xE7, 0x20, 0x4E, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x20, - 0xB4, 0x00, 0x00, 0x20, 0x7D, 0x03, 0x00, 0x20, 0xD0, 0x4C, 0x00, 0x00, 0xB3, 0x00, 0x00, 0x20, - 0x21, 0x04, 0x00, 0x20, 0x4A, 0x01, 0x00, 0x20, 0x31, 0x02, 0x00, 0x00, 0x11, 0xB5, 0x83, 0xB0, - 0x5A, 0x20, 0x02, 0x90, 0x03, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x12, 0x49, 0xA0, 0x20, 0x03, 0xAB, - 0x00, 0xF0, 0x94, 0xFC, 0xFD, 0xF7, 0x52, 0xF9, 0xFC, 0xF7, 0xEC, 0xF9, 0x02, 0xAA, 0x00, 0x92, - 0x01, 0x22, 0x0D, 0x49, 0xA0, 0x20, 0x02, 0xAB, 0x00, 0xF0, 0x88, 0xFC, 0x00, 0x24, 0x03, 0xE0, - 0xFD, 0xF7, 0x58, 0xF9, 0x60, 0x1C, 0xC4, 0xB2, 0x0F, 0x2C, 0xF9, 0xDB, 0xFF, 0xF7, 0x7E, 0xFA, - 0x6B, 0x46, 0x19, 0x7A, 0x88, 0x42, 0x02, 0xD0, 0x00, 0x20, 0x04, 0xB0, 0x10, 0xBD, 0x01, 0x20, - 0xFB, 0xE7, 0x00, 0x00, 0x22, 0x15, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x10, 0xB5, 0x22, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x3B, 0xD0, 0x20, 0x48, 0x00, 0x1F, 0x00, 0x68, 0x00, 0x28, 0x09, 0xD1, - 0x00, 0x22, 0x1D, 0x48, 0x01, 0x68, 0x10, 0x46, 0xFE, 0xF7, 0xC8, 0xFC, 0x00, 0x20, 0x1A, 0x49, - 0x08, 0x60, 0x2F, 0xE0, 0x18, 0x48, 0x00, 0x1F, 0x00, 0x68, 0x08, 0x28, 0x03, 0xD2, 0x16, 0x48, - 0x00, 0x1F, 0x00, 0x68, 0x00, 0xE0, 0x08, 0x20, 0x04, 0x46, 0x22, 0x46, 0x12, 0x48, 0x01, 0x68, - 0x00, 0x20, 0xFE, 0xF7, 0xB3, 0xFC, 0x10, 0x48, 0x01, 0x68, 0x08, 0x19, 0x0E, 0x49, 0x08, 0x60, - 0x08, 0x1F, 0x01, 0x68, 0x08, 0x1B, 0x0C, 0x49, 0x09, 0x1F, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, - 0x00, 0x28, 0x0F, 0xD1, 0x08, 0x2C, 0x02, 0xD2, 0x09, 0x1D, 0x08, 0x60, 0x0A, 0xE0, 0x06, 0x48, - 0x08, 0x38, 0x00, 0x78, 0x00, 0x28, 0x05, 0xD1, 0x03, 0x49, 0x08, 0x60, 0x02, 0xE0, 0x00, 0x20, - 0x02, 0x49, 0x48, 0x63, 0x10, 0xBD, 0x00, 0x00, 0x74, 0x03, 0x00, 0x20, 0x00, 0x00, 0x06, 0x40, - 0x00, 0x20, 0x03, 0x49, 0x08, 0x60, 0x09, 0x1D, 0x08, 0x60, 0x08, 0x39, 0x08, 0x70, 0x70, 0x47, - 0x70, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x39, 0x48, 0xC4, 0x79, 0x24, 0x02, 0x80, 0x79, 0x00, 0x19, - 0x84, 0xB2, 0x00, 0x20, 0x36, 0x49, 0x08, 0x70, 0x34, 0x48, 0xC0, 0x78, 0x03, 0x28, 0x2C, 0xD0, - 0x04, 0xDC, 0x01, 0x28, 0x07, 0xD0, 0x02, 0x28, 0x5B, 0xD1, 0x0E, 0xE0, 0x21, 0x28, 0x13, 0xD0, - 0x22, 0x28, 0x56, 0xD1, 0x18, 0xE0, 0x22, 0x46, 0x12, 0x21, 0x2E, 0x48, 0x08, 0x23, 0x00, 0xF0, - 0x95, 0xF8, 0x00, 0x20, 0x2C, 0x49, 0x48, 0x63, 0x4E, 0xE0, 0x2C, 0x48, 0x81, 0x78, 0x22, 0x46, - 0x08, 0x23, 0x00, 0xF0, 0x8B, 0xF8, 0x47, 0xE0, 0x22, 0x46, 0x09, 0x21, 0x28, 0x48, 0x00, 0x68, - 0x08, 0x23, 0x00, 0xF0, 0x83, 0xF8, 0x3F, 0xE0, 0x22, 0x46, 0x26, 0x48, 0x01, 0x68, 0x26, 0x48, - 0x00, 0x68, 0x08, 0x23, 0x00, 0xF0, 0x7A, 0xF8, 0x36, 0xE0, 0x1C, 0x48, 0x80, 0x78, 0x00, 0x28, - 0x06, 0xD1, 0x22, 0x46, 0x04, 0x21, 0x21, 0x48, 0x08, 0x23, 0x00, 0xF0, 0x6F, 0xF8, 0x27, 0xE0, - 0x16, 0x48, 0x80, 0x78, 0x01, 0x28, 0x04, 0xD0, 0x02, 0x28, 0x0C, 0xD0, 0x03, 0x28, 0x1B, 0xD1, - 0x13, 0xE0, 0x1B, 0x4A, 0x52, 0x68, 0x11, 0x78, 0x19, 0x4A, 0x50, 0x68, 0x22, 0x46, 0x08, 0x23, - 0x00, 0xF0, 0x5C, 0xF8, 0x13, 0xE0, 0x16, 0x4A, 0x92, 0x68, 0x11, 0x78, 0x14, 0x4A, 0x90, 0x68, - 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, 0x52, 0xF8, 0x09, 0xE0, 0x12, 0x48, 0x01, 0x78, 0x22, 0x46, - 0x08, 0x23, 0x00, 0xF0, 0x4B, 0xF8, 0x02, 0xE0, 0xFE, 0xF7, 0xCE, 0xFA, 0x00, 0xBF, 0x00, 0xBF, - 0x02, 0xE0, 0xFE, 0xF7, 0xC9, 0xFA, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, 0x5C, 0x03, 0x00, 0x20, - 0x6C, 0x03, 0x00, 0x20, 0x10, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x24, 0xCC, 0x00, 0x00, - 0x38, 0x03, 0x00, 0x20, 0x34, 0x03, 0x00, 0x20, 0x30, 0x03, 0x00, 0x20, 0x48, 0xCC, 0x00, 0x00, - 0xE0, 0x19, 0x00, 0x20, 0xE4, 0xCD, 0x00, 0x00, 0x00, 0xB5, 0x02, 0x22, 0x03, 0x49, 0x00, 0x20, - 0xFE, 0xF7, 0xF4, 0xFB, 0x01, 0x20, 0x02, 0x49, 0x08, 0x70, 0x00, 0xBD, 0x28, 0x03, 0x00, 0x20, - 0x2A, 0x03, 0x00, 0x20, 0x04, 0x48, 0x80, 0x6A, 0x80, 0x21, 0x08, 0x43, 0x02, 0x49, 0x88, 0x62, - 0x00, 0x20, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0xBF, 0xFE, 0xE7, - 0x00, 0xBF, 0xFE, 0xE7, 0x01, 0x46, 0x04, 0x48, 0x40, 0x79, 0x88, 0x42, 0x01, 0xD1, 0x01, 0x20, - 0x70, 0x47, 0x00, 0x20, 0xFC, 0xE7, 0x00, 0x00, 0x24, 0xCC, 0x00, 0x00, 0xF0, 0xB5, 0x04, 0x46, - 0x0D, 0x46, 0x16, 0x46, 0x1F, 0x46, 0x19, 0x48, 0x06, 0x60, 0xAE, 0x42, 0x04, 0xD9, 0x05, 0x60, - 0x01, 0x20, 0x16, 0x49, 0x09, 0x1F, 0x08, 0x70, 0x14, 0x48, 0x00, 0x1D, 0x04, 0x60, 0x00, 0x1F, - 0x00, 0x68, 0xB8, 0x42, 0x0D, 0xD2, 0x11, 0x48, 0x02, 0x68, 0x00, 0x1D, 0x01, 0x68, 0x00, 0x20, - 0xFE, 0xF7, 0xB4, 0xFB, 0x00, 0x20, 0x0D, 0x49, 0x09, 0x1D, 0x08, 0x60, 0x09, 0x1F, 0x08, 0x60, - 0x12, 0xE0, 0x3A, 0x46, 0x09, 0x48, 0x00, 0x1D, 0x01, 0x68, 0x00, 0x20, 0xFE, 0xF7, 0xA6, 0xFB, - 0x06, 0x48, 0x00, 0x1D, 0x00, 0x68, 0xC0, 0x19, 0x04, 0x49, 0x09, 0x1D, 0x08, 0x60, 0x08, 0x1F, - 0x00, 0x68, 0xC0, 0x1B, 0x09, 0x1F, 0x08, 0x60, 0xF0, 0xBD, 0x00, 0x00, 0x70, 0x03, 0x00, 0x20, - 0x70, 0x47, 0x10, 0xB5, 0x01, 0x20, 0xFE, 0xF7, 0x69, 0xFC, 0xFF, 0xF7, 0xF9, 0xFF, 0x10, 0xBD, - 0x10, 0xB5, 0x11, 0x48, 0x00, 0x78, 0x01, 0x28, 0x0B, 0xD1, 0x00, 0xBF, 0x0F, 0x48, 0x00, 0x78, - 0x01, 0x28, 0xFB, 0xD0, 0x05, 0xF0, 0xA6, 0xFD, 0x05, 0xF0, 0x58, 0xF8, 0x04, 0xF0, 0x16, 0xF8, - 0x10, 0xE0, 0x0B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, 0x00, 0xF0, 0x7D, 0xFE, 0x09, 0xE0, - 0x08, 0x48, 0x00, 0x78, 0x02, 0x28, 0x05, 0xD1, 0x04, 0x48, 0x00, 0x78, 0x00, 0x28, 0x01, 0xD1, - 0x04, 0xF0, 0x04, 0xF8, 0x10, 0xBD, 0x00, 0x00, 0xB1, 0x00, 0x00, 0x20, 0x9C, 0x00, 0x00, 0x20, - 0x9D, 0x00, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0xE0, 0x41, 0x1C, 0xC8, 0xB2, - 0x03, 0x28, 0xFB, 0xDB, 0x70, 0x47, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x70, 0x47, - 0xFF, 0xB5, 0x81, 0xB0, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x0B, 0x9F, 0x00, 0xF0, 0x2E, 0xFA, - 0xFE, 0x22, 0x22, 0x40, 0x11, 0x46, 0xFE, 0x22, 0x22, 0x40, 0x10, 0x46, 0x00, 0xF0, 0x8C, 0xF9, - 0x03, 0x28, 0x04, 0xD0, 0x00, 0xF0, 0x80, 0xFA, 0x00, 0x20, 0x05, 0xB0, 0xF0, 0xBD, 0x28, 0x12, - 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0x00, 0xF0, 0x7F, 0xF9, 0x03, 0x28, 0x03, 0xD0, 0x00, 0xF0, - 0x73, 0xFA, 0x00, 0x20, 0xF1, 0xE7, 0xE8, 0xB2, 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0x00, 0xF0, - 0x73, 0xF9, 0x03, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x67, 0xFA, 0x00, 0x20, 0xE5, 0xE7, 0x13, 0xE0, - 0x0A, 0x9A, 0x11, 0x78, 0x04, 0x9A, 0x10, 0x78, 0x00, 0xF0, 0x66, 0xF9, 0x03, 0x28, 0x03, 0xD0, - 0x00, 0xF0, 0x5A, 0xFA, 0x00, 0x20, 0xD8, 0xE7, 0x04, 0x98, 0x40, 0x1C, 0x04, 0x90, 0x0A, 0x98, - 0x40, 0x1C, 0x0A, 0x90, 0x70, 0x1E, 0x86, 0xB2, 0x00, 0x2E, 0xE9, 0xD1, 0x00, 0x2F, 0x79, 0xD0, - 0x00, 0xF0, 0xEC, 0xF9, 0x01, 0x22, 0x22, 0x43, 0x11, 0x46, 0x01, 0x22, 0x22, 0x43, 0x10, 0x46, - 0x00, 0xF0, 0x4A, 0xF9, 0x03, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x3E, 0xFA, 0x00, 0x20, 0xBC, 0xE7, - 0x0E, 0x98, 0x02, 0x28, 0x51, 0xD1, 0x2D, 0xE0, 0x00, 0x22, 0x0D, 0x99, 0x0C, 0x98, 0x00, 0xF0, - 0x67, 0xF8, 0x0C, 0x98, 0x00, 0x78, 0xFF, 0x28, 0x05, 0xD1, 0x30, 0x48, 0x00, 0x78, 0x01, 0x21, - 0x08, 0x43, 0x2E, 0x49, 0x08, 0x70, 0x0D, 0x98, 0x00, 0x78, 0xFF, 0x28, 0x05, 0xD1, 0x2B, 0x48, - 0x00, 0x78, 0x02, 0x21, 0x08, 0x43, 0x29, 0x49, 0x08, 0x70, 0x0C, 0x98, 0x40, 0x1C, 0x0C, 0x90, - 0x0D, 0x98, 0x40, 0x1C, 0x0D, 0x90, 0x78, 0x1E, 0x87, 0xB2, 0x24, 0x48, 0x00, 0x78, 0x03, 0x28, - 0x08, 0xD1, 0x01, 0x22, 0x0D, 0x99, 0x0C, 0x98, 0x00, 0xF0, 0x42, 0xF8, 0x00, 0xF0, 0x0C, 0xFA, - 0x04, 0x20, 0x8A, 0xE7, 0x01, 0x2F, 0xCF, 0xDC, 0x01, 0x22, 0x0D, 0x99, 0x0C, 0x98, 0x00, 0xF0, - 0x37, 0xF8, 0x0C, 0x98, 0x00, 0x78, 0xFF, 0x28, 0x05, 0xD1, 0x18, 0x48, 0x00, 0x78, 0x01, 0x21, - 0x08, 0x43, 0x16, 0x49, 0x08, 0x70, 0x0D, 0x98, 0x00, 0x78, 0xFF, 0x28, 0x05, 0xD1, 0x13, 0x48, - 0x00, 0x78, 0x02, 0x21, 0x08, 0x43, 0x11, 0x49, 0x08, 0x70, 0x10, 0x48, 0x00, 0x78, 0x03, 0x28, - 0x18, 0xD1, 0x00, 0xF0, 0xE9, 0xF9, 0x04, 0x20, 0x67, 0xE7, 0x0C, 0xE0, 0x00, 0x22, 0x0D, 0x99, - 0x0C, 0x98, 0x00, 0xF0, 0x15, 0xF8, 0x0C, 0x98, 0x40, 0x1C, 0x0C, 0x90, 0x0D, 0x98, 0x40, 0x1C, - 0x0D, 0x90, 0x78, 0x1E, 0x87, 0xB2, 0x01, 0x2F, 0xF0, 0xDC, 0x01, 0x22, 0x0D, 0x99, 0x0C, 0x98, - 0x00, 0xF0, 0x06, 0xF8, 0x00, 0xF0, 0xD0, 0xF9, 0x01, 0x20, 0x4E, 0xE7, 0xB3, 0x00, 0x00, 0x20, - 0x70, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x36, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, - 0x88, 0x43, 0x34, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, - 0x30, 0x49, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFA, 0xF7, 0xB2, 0xFC, 0x2D, 0x48, 0x00, 0x68, - 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x2B, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, - 0x49, 0x05, 0x08, 0x43, 0x27, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, - 0x88, 0x43, 0x24, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, 0x21, 0x49, - 0x08, 0x60, 0x00, 0x2E, 0x0E, 0xD1, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, - 0x1C, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x88, 0x43, 0x19, 0x49, - 0x88, 0x60, 0x0E, 0xE0, 0x17, 0x48, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x15, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x08, 0x43, 0x11, 0x49, 0x88, 0x60, - 0x00, 0xBF, 0x00, 0xBF, 0x0F, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x0D, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x09, 0x49, 0x88, 0x60, - 0xFF, 0xF7, 0xCA, 0xFE, 0x07, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x01, 0x49, 0x88, 0x60, - 0x70, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, - 0x1F, 0x46, 0x00, 0xF0, 0xF3, 0xF8, 0xFE, 0x22, 0x22, 0x40, 0x11, 0x46, 0xFE, 0x22, 0x22, 0x40, - 0x10, 0x46, 0x00, 0xF0, 0x51, 0xF8, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0x00, 0xF0, - 0x43, 0xF9, 0x00, 0x20, 0xF8, 0xBD, 0x28, 0x12, 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0x00, 0xF0, - 0x43, 0xF8, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x35, 0xF9, 0x00, 0x20, - 0xF0, 0xE7, 0xE8, 0xB2, 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0x00, 0xF0, 0x35, 0xF8, 0xC0, 0x07, - 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x27, 0xF9, 0x00, 0x20, 0xE2, 0xE7, 0x00, 0x2E, - 0x25, 0xD0, 0x00, 0xF0, 0xC3, 0xF8, 0x01, 0x22, 0x22, 0x43, 0x11, 0x46, 0x22, 0x46, 0x01, 0x23, - 0x1A, 0x43, 0x10, 0x46, 0x00, 0xF0, 0x20, 0xF8, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, - 0x00, 0xF0, 0x12, 0xF9, 0x00, 0x20, 0xCD, 0xE7, 0x0A, 0xE0, 0x00, 0x22, 0x38, 0x46, 0x06, 0x99, - 0xFF, 0xF7, 0x3E, 0xFF, 0x7F, 0x1C, 0x06, 0x98, 0x40, 0x1C, 0x06, 0x90, 0x70, 0x1E, 0x86, 0xB2, - 0x01, 0x2E, 0xF2, 0xDC, 0x01, 0x22, 0x38, 0x46, 0x06, 0x99, 0xFF, 0xF7, 0x31, 0xFF, 0x00, 0xF0, - 0xFB, 0xF8, 0x01, 0x20, 0xB6, 0xE7, 0x00, 0x00, 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x38, 0x48, - 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x35, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, - 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x32, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, - 0x09, 0x06, 0x88, 0x43, 0x2E, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, - 0x2B, 0x49, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFA, 0xF7, 0x86, 0xFB, 0xFF, 0xF7, 0x3B, 0xFE, - 0x27, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x25, 0x49, 0x08, 0x60, 0x08, 0x46, - 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x21, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, - 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x1E, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x24, 0xFE, 0x1C, 0x48, - 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x19, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, - 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x16, 0x49, 0x88, 0x60, 0x08, 0x46, 0x00, 0x69, 0x40, 0x05, - 0xC0, 0x0F, 0x01, 0x21, 0x48, 0x40, 0x06, 0x46, 0x11, 0x48, 0x80, 0x68, 0x49, 0x02, 0x88, 0x43, - 0x0F, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x07, 0xFE, 0x0D, 0x48, 0x00, 0x69, 0xC0, 0x04, 0xC0, 0x0F, - 0x01, 0x21, 0x48, 0x40, 0x07, 0x46, 0x0A, 0x48, 0x80, 0x68, 0xC9, 0x02, 0x88, 0x43, 0x08, 0x49, - 0x88, 0x60, 0xBE, 0x42, 0x05, 0xD0, 0x00, 0x2E, 0x01, 0xD0, 0x01, 0x20, 0xF8, 0xBD, 0x02, 0x20, - 0xFC, 0xE7, 0x00, 0x2E, 0x01, 0xD0, 0x03, 0x20, 0xF8, 0xE7, 0x00, 0x20, 0xF6, 0xE7, 0x00, 0x00, - 0x80, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x00, 0x24, 0x00, 0xF0, 0x04, 0xFC, 0x01, 0x20, 0x0D, 0x49, - 0x08, 0x70, 0x03, 0xF0, 0xD3, 0xFD, 0x0D, 0xE0, 0x05, 0xF0, 0x5C, 0xFB, 0x0A, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x02, 0xD1, 0xFC, 0xF7, 0xB2, 0xFD, 0x64, 0x1C, 0x7D, 0x20, 0xC0, 0x00, 0x84, 0x42, - 0x00, 0xDD, 0x03, 0xE0, 0x03, 0x48, 0x00, 0x78, 0x00, 0x28, 0xED, 0xD1, 0x00, 0xBF, 0x03, 0xF0, - 0x41, 0xF8, 0x10, 0xBD, 0x9D, 0x00, 0x00, 0x20, 0x9C, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x2D, 0x48, - 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x2A, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, - 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x27, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, - 0x09, 0x06, 0x88, 0x43, 0x23, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, - 0x20, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x1D, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x08, 0x43, 0x19, 0x49, 0x88, 0x60, - 0xFF, 0xF7, 0x92, 0xFD, 0x17, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x15, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x11, 0x49, 0x88, 0x60, - 0xFF, 0xF7, 0x82, 0xFD, 0x0F, 0x48, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, 0x0D, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x88, 0x43, 0x09, 0x49, 0x88, 0x60, - 0xFF, 0xF7, 0x72, 0xFD, 0x07, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x01, 0x49, 0x88, 0x60, - 0x00, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0x00, 0xB5, 0x2B, 0x48, 0x80, 0x68, 0x01, 0x21, - 0x49, 0x02, 0x88, 0x43, 0x28, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, - 0x88, 0x43, 0x25, 0x49, 0x88, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, - 0x21, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x1E, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x1A, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, 0x17, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, - 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, 0x14, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0x09, 0x03, 0x88, 0x43, 0x10, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, - 0x08, 0x43, 0x0D, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, - 0x09, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x18, 0xFD, 0x07, 0x48, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, - 0x08, 0x43, 0x05, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x08, 0x43, - 0x01, 0x49, 0x88, 0x60, 0x00, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xF8, 0xB5, 0x04, 0x46, - 0x0D, 0x46, 0x16, 0x46, 0x1F, 0x46, 0xFF, 0xF7, 0x41, 0xFF, 0xFE, 0x22, 0x22, 0x40, 0x11, 0x46, - 0xFE, 0x22, 0x22, 0x40, 0x10, 0x46, 0xFF, 0xF7, 0x9F, 0xFE, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, - 0x03, 0xD0, 0xFF, 0xF7, 0x91, 0xFF, 0x00, 0x20, 0xF8, 0xBD, 0x28, 0x12, 0x00, 0x90, 0x00, 0x99, - 0x08, 0x46, 0xFF, 0xF7, 0x91, 0xFE, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0xFF, 0xF7, - 0x83, 0xFF, 0x00, 0x20, 0xF0, 0xE7, 0xE8, 0xB2, 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0xFF, 0xF7, - 0x83, 0xFE, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0xFF, 0xF7, 0x75, 0xFF, 0x00, 0x20, - 0xE2, 0xE7, 0x12, 0xE0, 0x06, 0x9A, 0x11, 0x78, 0x38, 0x78, 0xFF, 0xF7, 0x75, 0xFE, 0xC0, 0x07, - 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0xFF, 0xF7, 0x67, 0xFF, 0x00, 0x20, 0xD4, 0xE7, 0x7F, 0x1C, - 0x06, 0x98, 0x40, 0x1C, 0x06, 0x90, 0x70, 0x1E, 0x86, 0xB2, 0x00, 0x2E, 0xEA, 0xD1, 0xFF, 0xF7, - 0x5B, 0xFF, 0x01, 0x20, 0xC8, 0xE7, 0x00, 0x00, 0x04, 0x49, 0x09, 0x68, 0x3C, 0x22, 0x91, 0x43, - 0x20, 0x31, 0x18, 0x22, 0x11, 0x43, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x12, 0x40, - 0x70, 0xB5, 0x04, 0x46, 0x60, 0x07, 0x40, 0x0F, 0x73, 0xD1, 0xE3, 0x10, 0x0C, 0x3B, 0x05, 0xF0, - 0xEA, 0xFA, 0x0D, 0x08, 0x09, 0x70, 0x70, 0x20, 0x70, 0x70, 0x70, 0xF7, 0xB0, 0xB1, 0xB2, 0xF8, - 0x70, 0x00, 0x00, 0xBF, 0x00, 0x20, 0x9D, 0x49, 0x08, 0x70, 0x9D, 0x49, 0x08, 0x70, 0x01, 0x20, - 0x9C, 0x49, 0x08, 0x70, 0x00, 0x20, 0x9C, 0x49, 0x08, 0x70, 0x9C, 0x49, 0x08, 0x70, 0x9C, 0x49, - 0x08, 0x70, 0x9C, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0x99, 0x49, 0x08, 0x60, - 0x22, 0xE1, 0x01, 0x20, 0x98, 0x49, 0x08, 0x70, 0x93, 0x48, 0x00, 0x78, 0x00, 0x28, 0x2B, 0xD1, - 0xFD, 0xF7, 0xA8, 0xF8, 0x95, 0x49, 0x08, 0x70, 0x95, 0x48, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, - 0x01, 0x28, 0x1D, 0xD1, 0x08, 0x46, 0x00, 0x78, 0x1A, 0x28, 0x02, 0xD1, 0xC3, 0x20, 0x08, 0x70, - 0x16, 0xE0, 0x8E, 0x48, 0x00, 0x78, 0x3D, 0x28, 0x03, 0xD1, 0x6A, 0x20, 0x8B, 0x49, 0x08, 0x70, - 0x0E, 0xE0, 0x8A, 0x48, 0x00, 0x78, 0x38, 0x28, 0x03, 0xD1, 0x01, 0x20, 0x7F, 0x49, 0x08, 0x70, - 0x06, 0xE0, 0x86, 0x48, 0x00, 0x78, 0x39, 0x28, 0x02, 0xD1, 0x01, 0x20, 0x7C, 0x49, 0x08, 0x70, - 0x01, 0x20, 0x7D, 0x49, 0x08, 0x70, 0x54, 0xE0, 0x01, 0x20, 0x7C, 0x49, 0x08, 0x70, 0x80, 0x48, - 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x33, 0xD1, 0x74, 0x48, 0x00, 0x78, 0x01, 0x28, - 0x1D, 0xD1, 0x00, 0x20, 0x71, 0x49, 0x08, 0x70, 0xFD, 0xF7, 0x6C, 0xF8, 0x05, 0x46, 0x55, 0x2D, - 0x08, 0xD1, 0x01, 0x21, 0x76, 0x48, 0x25, 0x38, 0x01, 0x74, 0x01, 0x20, 0x75, 0x49, 0x08, 0x70, - 0x1F, 0xE0, 0xC9, 0xE0, 0x56, 0x2D, 0x1C, 0xD1, 0x01, 0x20, 0x73, 0x49, 0x08, 0x70, 0x01, 0x21, - 0x6F, 0x48, 0x25, 0x38, 0x01, 0x74, 0x01, 0x20, 0x6E, 0x49, 0x08, 0x70, 0x11, 0xE0, 0x64, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x0D, 0xD1, 0x00, 0x20, 0x61, 0x49, 0x08, 0x70, 0xFD, 0xF7, 0x4A, 0xF8, - 0x55, 0x28, 0x06, 0xD1, 0x00, 0x21, 0x66, 0x48, 0x25, 0x38, 0x01, 0x74, 0x00, 0x20, 0x65, 0x49, - 0x08, 0x70, 0x66, 0x48, 0x00, 0x78, 0x00, 0x28, 0x07, 0xD0, 0x60, 0x48, 0x00, 0x78, 0x50, 0x28, - 0x03, 0xD0, 0x5E, 0x48, 0x00, 0x78, 0x51, 0x28, 0x06, 0xD1, 0xFD, 0xF7, 0x33, 0xF8, 0x5C, 0x49, - 0x65, 0x39, 0x5A, 0x4A, 0x12, 0x78, 0x88, 0x54, 0x58, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x57, 0x49, - 0x08, 0x70, 0x54, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0x51, 0x49, 0x08, 0x60, - 0x92, 0xE0, 0x00, 0xBF, 0x00, 0xBF, 0x56, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x02, 0xD0, 0xCA, 0x28, - 0x1D, 0xD1, 0x00, 0xE0, 0x00, 0xBF, 0x53, 0x48, 0x00, 0x68, 0x40, 0x1C, 0x51, 0x49, 0x08, 0x60, - 0x47, 0x48, 0x00, 0x78, 0x00, 0x28, 0x08, 0xD0, 0x08, 0x46, 0x00, 0x68, 0x4E, 0x49, 0x09, 0x68, - 0x40, 0x1A, 0x23, 0x21, 0x89, 0x01, 0x88, 0x42, 0x03, 0xDB, 0x4B, 0x48, 0x00, 0x68, 0x49, 0x49, - 0x08, 0x60, 0x48, 0x49, 0x09, 0x68, 0x08, 0x78, 0xFD, 0xF7, 0x62, 0xF8, 0x0C, 0xE0, 0x40, 0x49, - 0x65, 0x39, 0x3E, 0x4A, 0x12, 0x78, 0x88, 0x5C, 0xFD, 0xF7, 0x5A, 0xF8, 0x3B, 0x48, 0x00, 0x78, - 0x40, 0x1C, 0x3A, 0x49, 0x08, 0x70, 0x00, 0xBF, 0x00, 0xBF, 0x01, 0x20, 0x34, 0x49, 0x08, 0x70, - 0x3E, 0x48, 0x00, 0x78, 0x02, 0x28, 0x02, 0xD1, 0x00, 0x20, 0x3C, 0x49, 0x08, 0x70, 0x31, 0x48, - 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0x2E, 0x49, 0x08, 0x60, 0x4C, 0xE0, 0x00, 0xE0, - 0x0C, 0xE0, 0x00, 0x20, 0x36, 0x49, 0x08, 0x70, 0x26, 0x49, 0x08, 0x70, 0x29, 0x48, 0x00, 0x68, - 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0x27, 0x49, 0x08, 0x60, 0x3D, 0xE0, 0x23, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x05, 0xD0, 0x00, 0x20, 0x1F, 0x49, 0x08, 0x70, 0x01, 0x20, 0x2D, 0x49, 0x08, 0x70, - 0x1F, 0x48, 0x00, 0x78, 0x00, 0x28, 0x1F, 0xD0, 0x21, 0x48, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, - 0x01, 0x28, 0x00, 0xD1, 0x02, 0x26, 0x22, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x0F, 0xD0, 0x20, 0x48, - 0x00, 0x78, 0xCA, 0x28, 0x0B, 0xD0, 0x1A, 0x48, 0x65, 0x38, 0x40, 0x78, 0x18, 0x49, 0x65, 0x39, - 0x89, 0x78, 0x08, 0x43, 0x03, 0xD0, 0x15, 0x48, 0x00, 0x78, 0xB0, 0x42, 0x04, 0xDD, 0x00, 0x20, - 0x1B, 0x49, 0x08, 0x70, 0x0B, 0x49, 0x08, 0x70, 0x0E, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, - 0x0C, 0x30, 0x0C, 0x49, 0x08, 0x60, 0x07, 0xE0, 0x0A, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, - 0x08, 0x30, 0x08, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x00, 0xBF, 0x70, 0xBD, 0xD4, 0x00, 0x00, 0x20, - 0xD5, 0x00, 0x00, 0x20, 0x9C, 0x00, 0x00, 0x20, 0x9F, 0x00, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, - 0xA1, 0x00, 0x00, 0x20, 0x00, 0x00, 0x12, 0x40, 0xCC, 0x00, 0x00, 0x20, 0xCD, 0x00, 0x00, 0x20, - 0x21, 0x04, 0x00, 0x20, 0x8E, 0x00, 0x00, 0x20, 0x8F, 0x00, 0x00, 0x20, 0x9E, 0x00, 0x00, 0x20, - 0x40, 0x01, 0x00, 0x20, 0xD0, 0x00, 0x00, 0x20, 0xC8, 0x01, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x20, - 0x9D, 0x00, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x1B, 0x48, 0xC4, 0x68, 0x40, 0x69, - 0xC0, 0x07, 0xC0, 0x0F, 0x0F, 0xD0, 0x18, 0x48, 0x40, 0x69, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, - 0x15, 0x49, 0x48, 0x61, 0x15, 0x48, 0xC0, 0x68, 0x00, 0x28, 0x24, 0xD0, 0x13, 0x48, 0xC1, 0x68, - 0x20, 0x46, 0x88, 0x47, 0x1F, 0xE0, 0x00, 0x2C, 0x0A, 0xD0, 0x38, 0x2C, 0x11, 0xD1, 0x0F, 0x48, - 0x40, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x0D, 0x48, 0x41, 0x68, 0x20, 0x46, 0x88, 0x47, 0x11, 0xE0, - 0x0A, 0x48, 0x80, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x08, 0x48, 0x81, 0x68, 0x20, 0x46, 0x88, 0x47, - 0x08, 0xE0, 0x06, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x04, 0x48, 0x01, 0x68, 0x20, 0x46, - 0x88, 0x47, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, 0x00, 0x00, 0x12, 0x40, 0x70, 0x1A, 0x00, 0x20, - 0x10, 0xB5, 0x00, 0x20, 0x29, 0x49, 0x08, 0x70, 0x29, 0x49, 0x08, 0x70, 0x01, 0x20, 0xFC, 0xF7, - 0xA7, 0xFC, 0x28, 0x48, 0xFC, 0xF7, 0xE2, 0xFE, 0x27, 0x48, 0xC0, 0x79, 0x40, 0x07, 0x40, 0x0F, - 0x01, 0x28, 0x0A, 0xD1, 0x00, 0x22, 0x55, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x19, 0xFF, 0x00, 0x22, - 0x55, 0x21, 0x01, 0x20, 0xFC, 0xF7, 0x14, 0xFF, 0x1A, 0xE0, 0x1F, 0x48, 0xC0, 0x79, 0x40, 0x07, - 0x40, 0x0F, 0x02, 0x28, 0x0A, 0xD1, 0x00, 0x22, 0x5C, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x08, 0xFF, - 0x00, 0x22, 0x5C, 0x21, 0x01, 0x20, 0xFC, 0xF7, 0x03, 0xFF, 0x09, 0xE0, 0x00, 0x22, 0x55, 0x21, - 0x10, 0x46, 0xFC, 0xF7, 0xFD, 0xFE, 0x00, 0x22, 0x5C, 0x21, 0x01, 0x20, 0xFC, 0xF7, 0xF8, 0xFE, - 0x12, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x10, 0x49, 0x08, 0x60, 0xFC, 0xF7, - 0x73, 0xFE, 0x0F, 0x49, 0x00, 0x20, 0xFC, 0xF7, 0x89, 0xFE, 0x0E, 0x49, 0x01, 0x20, 0xFC, 0xF7, - 0x85, 0xFE, 0x0C, 0x49, 0x02, 0x20, 0xFC, 0xF7, 0x81, 0xFE, 0x0A, 0x49, 0x03, 0x20, 0xFC, 0xF7, - 0x7D, 0xFE, 0x00, 0x20, 0x08, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x20, - 0x9E, 0x00, 0x00, 0x20, 0xC0, 0x27, 0x09, 0x00, 0x21, 0x04, 0x00, 0x20, 0x00, 0x00, 0x12, 0x40, - 0x51, 0x5D, 0x00, 0x00, 0x39, 0x5D, 0x00, 0x00, 0xA3, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x54, 0x48, - 0x00, 0x78, 0x41, 0x07, 0x49, 0x0F, 0x53, 0x48, 0xC0, 0x79, 0x40, 0x07, 0x40, 0x0F, 0x81, 0x42, - 0x0C, 0xD0, 0x50, 0x49, 0xC9, 0x79, 0x48, 0x07, 0x40, 0x0F, 0x4D, 0x49, 0x09, 0x78, 0xC9, 0x08, - 0xC9, 0x00, 0x01, 0x43, 0x4A, 0x4A, 0x11, 0x70, 0xFF, 0xF7, 0x82, 0xFF, 0x4A, 0x48, 0x00, 0x78, - 0xC9, 0x28, 0x14, 0xD1, 0x47, 0x48, 0x25, 0x38, 0x00, 0x7C, 0x01, 0x28, 0x04, 0xD1, 0xC9, 0x21, - 0x44, 0x48, 0x25, 0x38, 0x01, 0x74, 0x14, 0xE0, 0x42, 0x48, 0x25, 0x38, 0x00, 0x7C, 0xC9, 0x28, - 0x0F, 0xD0, 0x01, 0x20, 0x41, 0x49, 0x08, 0x70, 0x41, 0x49, 0x08, 0x70, 0x09, 0xE0, 0x3D, 0x48, - 0x25, 0x38, 0x00, 0x7C, 0xC9, 0x28, 0x04, 0xD1, 0x01, 0x20, 0x3C, 0x49, 0x08, 0x70, 0x3C, 0x49, - 0x08, 0x70, 0x39, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x08, 0xD1, 0x36, 0x48, 0x25, 0x38, 0x00, 0x7C, - 0x01, 0x28, 0x03, 0xD1, 0xCA, 0x21, 0x33, 0x48, 0x25, 0x38, 0x01, 0x74, 0x31, 0x48, 0x25, 0x38, - 0x00, 0x7C, 0x31, 0x49, 0x08, 0x70, 0x08, 0x46, 0x00, 0x78, 0x04, 0x28, 0x41, 0xD0, 0x06, 0xDC, - 0x01, 0x28, 0x09, 0xD0, 0x02, 0x28, 0x11, 0xD0, 0x03, 0x28, 0x47, 0xD1, 0x35, 0xE0, 0xC9, 0x28, - 0x42, 0xD0, 0xCA, 0x28, 0x42, 0xD1, 0x40, 0xE0, 0x00, 0x21, 0x26, 0x48, 0x25, 0x38, 0x01, 0x74, - 0x00, 0x20, 0x25, 0x49, 0x08, 0x70, 0x01, 0xF0, 0xBF, 0xFD, 0x3F, 0xE0, 0x25, 0x48, 0x00, 0x68, - 0x25, 0x49, 0x08, 0x43, 0x23, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x89, 0x03, - 0x08, 0x43, 0x20, 0x49, 0x88, 0x60, 0x04, 0xF0, 0x7B, 0xFF, 0x59, 0x20, 0x1F, 0x49, 0x08, 0x60, - 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xFC, 0xF7, 0x4A, 0xFA, 0xF9, 0x20, 0x40, 0x02, - 0xFC, 0xF7, 0x5A, 0xFA, 0x1A, 0x49, 0xF9, 0x20, 0x40, 0x02, 0xFC, 0xF7, 0xCD, 0xFA, 0x01, 0x20, - 0xFC, 0xF7, 0x22, 0xFA, 0xFC, 0xF7, 0xEA, 0xFF, 0x18, 0xE0, 0x03, 0x20, 0x05, 0xF0, 0x08, 0xFC, - 0x14, 0xE0, 0x03, 0x20, 0x02, 0xF0, 0x2E, 0xFD, 0x00, 0x21, 0x0A, 0x48, 0x25, 0x38, 0x01, 0x74, - 0x00, 0x20, 0x09, 0x49, 0x08, 0x70, 0x09, 0xE0, 0x08, 0xE0, 0x07, 0xE0, 0x00, 0x21, 0x05, 0x48, - 0x25, 0x38, 0x01, 0x74, 0x00, 0x20, 0x04, 0x49, 0x08, 0x70, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, - 0xD6, 0x00, 0x00, 0x20, 0x21, 0x04, 0x00, 0x20, 0x40, 0x01, 0x00, 0x20, 0xA6, 0x00, 0x00, 0x20, - 0xA5, 0x00, 0x00, 0x20, 0x40, 0x40, 0x00, 0x50, 0x00, 0x00, 0x01, 0x40, 0x00, 0x01, 0x00, 0x50, - 0x33, 0x33, 0x33, 0x33, 0x10, 0xB5, 0x0A, 0x48, 0x80, 0x79, 0x80, 0x07, 0x80, 0x0F, 0x02, 0xD0, - 0x01, 0x28, 0x0A, 0xD1, 0x04, 0xE0, 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, 0xC7, 0xFA, 0x05, 0xE0, - 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, 0x3E, 0xFD, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, - 0x21, 0x04, 0x00, 0x20, 0x12, 0x49, 0x08, 0x69, 0x02, 0x46, 0x50, 0x32, 0x4A, 0x62, 0x08, 0x62, - 0x50, 0x32, 0x8A, 0x62, 0xA0, 0x32, 0xCA, 0x62, 0x50, 0x32, 0x0A, 0x63, 0x50, 0x32, 0x4A, 0x63, - 0x23, 0x22, 0x12, 0x01, 0x82, 0x18, 0xCA, 0x63, 0x05, 0x22, 0xD2, 0x01, 0x82, 0x18, 0x0A, 0x64, - 0x5F, 0x22, 0xD2, 0x00, 0x82, 0x18, 0x8A, 0x63, 0x06, 0x4A, 0x82, 0x18, 0x4A, 0x64, 0x87, 0x22, - 0x12, 0x01, 0x82, 0x18, 0x8A, 0x61, 0x03, 0x4A, 0x3C, 0x32, 0x80, 0x18, 0xC8, 0x61, 0x70, 0x47, - 0xB8, 0x01, 0x00, 0x20, 0x5C, 0x08, 0x00, 0x00, 0x10, 0xB5, 0x0D, 0x48, 0x80, 0x79, 0x80, 0x07, - 0x80, 0x0F, 0x06, 0xD0, 0x01, 0x28, 0x0A, 0xD0, 0x02, 0x28, 0x09, 0xD0, 0x03, 0x28, 0x0C, 0xD1, - 0x00, 0xE0, 0x00, 0xBF, 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, 0x80, 0xFA, 0x06, 0xE0, 0x00, 0xBF, - 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, 0xF6, 0xFC, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, - 0x21, 0x04, 0x00, 0x20, 0xF0, 0xB5, 0x25, 0x4A, 0x92, 0x6A, 0x52, 0x5C, 0x00, 0x2A, 0x42, 0xD0, - 0x23, 0x4A, 0x17, 0x7C, 0x94, 0x46, 0x21, 0x4A, 0x20, 0x4E, 0x54, 0x6A, 0x80, 0x3E, 0x13, 0x6A, - 0x32, 0x46, 0x60, 0x32, 0x45, 0x00, 0x49, 0x00, 0x00, 0x2F, 0x1D, 0xD0, 0x67, 0x46, 0x3F, 0x7C, - 0x87, 0x42, 0x19, 0xD8, 0xF0, 0x7F, 0x00, 0x28, 0x02, 0xD1, 0x58, 0x5E, 0x61, 0x5E, 0x01, 0xE0, - 0x60, 0x5E, 0x59, 0x5E, 0x12, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x24, 0xDD, 0x14, 0x23, 0xD3, 0x5E, - 0x98, 0x42, 0x20, 0xDA, 0x13, 0x48, 0x43, 0x5F, 0x16, 0x20, 0x10, 0x5E, 0x18, 0xE0, 0x18, 0x18, - 0x88, 0x42, 0x18, 0xDD, 0x01, 0x20, 0xF0, 0xBD, 0x70, 0x7F, 0x00, 0x28, 0x02, 0xD1, 0x58, 0x5E, - 0x61, 0x5E, 0x01, 0xE0, 0x60, 0x5E, 0x59, 0x5E, 0x0C, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x0A, 0xDD, - 0x0E, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x06, 0xDA, 0x06, 0x48, 0x43, 0x5F, 0x10, 0x20, 0x10, 0x5E, - 0x1A, 0x1A, 0x8A, 0x42, 0xE3, 0xDB, 0x00, 0x20, 0xF0, 0xBD, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x20, - 0x5C, 0x04, 0x00, 0x20, 0xD2, 0x06, 0x00, 0x20, 0x08, 0x4B, 0x10, 0xB5, 0x00, 0x20, 0x58, 0x72, - 0x19, 0x46, 0x24, 0x31, 0x5A, 0x79, 0x06, 0xE0, 0x0C, 0x5C, 0x03, 0x2C, 0x02, 0xD9, 0x01, 0x20, - 0x58, 0x72, 0x10, 0xBD, 0x40, 0x1C, 0x90, 0x42, 0xF6, 0xDB, 0x10, 0xBD, 0x78, 0x03, 0x00, 0x20, - 0x06, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x05, 0x49, 0x08, 0x70, 0x08, 0x46, 0x00, 0x78, 0x32, 0x28, - 0x03, 0xDD, 0x00, 0x20, 0x08, 0x70, 0x02, 0x49, 0x08, 0x70, 0x70, 0x47, 0x90, 0x00, 0x00, 0x20, - 0x91, 0x00, 0x00, 0x20, 0xF8, 0xB5, 0x3B, 0x4C, 0x00, 0x25, 0x62, 0x79, 0x2E, 0x46, 0x2F, 0x46, - 0x00, 0x2A, 0x6E, 0xD0, 0x00, 0x20, 0x38, 0x4B, 0x0C, 0xE0, 0x41, 0x00, 0x59, 0x5E, 0xA9, 0x42, - 0x03, 0xDD, 0x2E, 0x46, 0x0D, 0x46, 0x07, 0x46, 0x02, 0xE0, 0xB1, 0x42, 0x00, 0xDD, 0x0E, 0x46, - 0x40, 0x1C, 0xC0, 0xB2, 0x90, 0x42, 0xF0, 0xD3, 0x00, 0x24, 0x17, 0xE0, 0x2E, 0x4A, 0x60, 0x00, - 0x10, 0x32, 0x11, 0x5E, 0x19, 0x23, 0xDB, 0x01, 0x99, 0x42, 0x08, 0xDC, 0x2B, 0x4B, 0x1B, 0x88, - 0xC9, 0x18, 0x11, 0x52, 0x27, 0x49, 0x24, 0x31, 0x08, 0x5D, 0x40, 0x1C, 0x08, 0x55, 0xA7, 0x42, - 0x02, 0xD0, 0x20, 0x46, 0x04, 0xF0, 0x96, 0xFD, 0x64, 0x1C, 0xE4, 0xB2, 0x21, 0x48, 0x40, 0x79, - 0x84, 0x42, 0xE3, 0xD3, 0x1F, 0x4C, 0xE0, 0x78, 0x85, 0x42, 0x03, 0xDA, 0x38, 0x46, 0x04, 0xF0, - 0x89, 0xFD, 0x18, 0xE0, 0xA0, 0x78, 0x85, 0x42, 0x15, 0xDD, 0xB5, 0x42, 0x13, 0xD0, 0xA8, 0x19, - 0x0A, 0x22, 0xA9, 0x1B, 0x50, 0x43, 0xF9, 0xF7, 0xD9, 0xFE, 0x21, 0x79, 0x88, 0x42, 0x0A, 0xDC, - 0x15, 0x49, 0x00, 0x20, 0x7A, 0x00, 0x10, 0x31, 0x88, 0x52, 0x12, 0x49, 0x24, 0x31, 0xC8, 0x55, - 0x01, 0x20, 0xB8, 0x40, 0x20, 0x72, 0x0E, 0x20, 0x20, 0x5E, 0x11, 0x49, 0x88, 0x42, 0x03, 0xDC, - 0x0E, 0x4A, 0x12, 0x88, 0x80, 0x18, 0xE0, 0x81, 0x0E, 0x20, 0x20, 0x5E, 0x88, 0x42, 0x0C, 0xDD, - 0x09, 0x4A, 0x78, 0x00, 0x10, 0x3A, 0x13, 0x46, 0x10, 0x3B, 0x11, 0x5A, 0x1B, 0x5A, 0xC9, 0x18, - 0x09, 0x04, 0x49, 0x0C, 0x11, 0x52, 0x10, 0x20, 0xE0, 0x71, 0x20, 0x7A, 0x00, 0x28, 0x00, 0xD1, - 0xE0, 0x81, 0xF8, 0xBD, 0x78, 0x03, 0x00, 0x20, 0xA0, 0x1A, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, - 0x30, 0x75, 0x00, 0x00, 0xFF, 0xB5, 0x00, 0x20, 0xF6, 0x4B, 0x00, 0x90, 0x98, 0x7E, 0xF6, 0x49, - 0x03, 0x90, 0xC9, 0x7A, 0x49, 0x06, 0x02, 0xD5, 0x03, 0x21, 0x08, 0x1A, 0xC0, 0xB2, 0x02, 0x28, - 0x02, 0xD3, 0x05, 0x21, 0x08, 0x1A, 0xC0, 0xB2, 0xEF, 0x4C, 0x40, 0x34, 0xE1, 0x7D, 0x14, 0x29, - 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0xE1, 0x7D, 0xE1, 0x75, 0xA1, 0x7D, 0x1E, 0x29, 0x01, 0xD9, - 0x00, 0x21, 0x00, 0xE0, 0xA1, 0x7D, 0xA1, 0x75, 0x21, 0x7E, 0xA2, 0x7D, 0x89, 0x18, 0x1F, 0x29, - 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0x21, 0x7E, 0x21, 0x76, 0x61, 0x7E, 0xE2, 0x7D, 0x89, 0x18, - 0x15, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0x61, 0x7E, 0x61, 0x76, 0xE1, 0x7E, 0x14, 0x29, - 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0xE1, 0x7E, 0xE1, 0x76, 0xA1, 0x7E, 0x1E, 0x29, 0x01, 0xD9, - 0x00, 0x21, 0x00, 0xE0, 0xA1, 0x7E, 0xA1, 0x76, 0x21, 0x7F, 0xA2, 0x7E, 0x89, 0x18, 0x1F, 0x29, - 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0x21, 0x7F, 0x21, 0x77, 0x61, 0x7F, 0xE2, 0x7E, 0x89, 0x18, - 0x15, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0x61, 0x7F, 0x61, 0x77, 0xA2, 0x7F, 0xCD, 0x49, - 0xC8, 0x31, 0x0A, 0x71, 0xCC, 0x4A, 0x60, 0x32, 0x55, 0x78, 0x4D, 0x71, 0xE5, 0x7F, 0x8D, 0x71, - 0x12, 0x78, 0xCA, 0x71, 0x85, 0x07, 0x0A, 0x79, 0xAD, 0x0F, 0x4A, 0x55, 0x42, 0x1C, 0x92, 0x07, - 0x4D, 0x79, 0x92, 0x0F, 0x8D, 0x54, 0x82, 0x1C, 0x92, 0x07, 0x8D, 0x79, 0x92, 0x0F, 0x8D, 0x54, - 0xC2, 0x1C, 0x92, 0x07, 0xCD, 0x79, 0x92, 0x0F, 0x8D, 0x54, 0xBE, 0x4A, 0x00, 0x25, 0x15, 0x85, - 0x0D, 0x46, 0x88, 0x3D, 0xAB, 0x89, 0x00, 0x26, 0x9C, 0x46, 0x1B, 0xB2, 0x02, 0x93, 0x93, 0x85, - 0x56, 0x85, 0xEE, 0x89, 0x33, 0xB2, 0x01, 0x93, 0xD3, 0x85, 0xCF, 0x78, 0x63, 0x46, 0x5F, 0x43, - 0xBF, 0x0A, 0x17, 0x86, 0x4F, 0x78, 0x5F, 0x43, 0xBF, 0x0A, 0xDB, 0x1B, 0x93, 0x86, 0x0F, 0x78, - 0x77, 0x43, 0xBF, 0x0A, 0x57, 0x86, 0x89, 0x78, 0xB0, 0x4F, 0x71, 0x43, 0x89, 0x0A, 0x71, 0x1A, - 0xD1, 0x86, 0x00, 0x21, 0xA9, 0x82, 0x4A, 0x1E, 0x14, 0x26, 0xAE, 0x5F, 0x06, 0x21, 0x71, 0x43, - 0x7A, 0x52, 0xC9, 0x19, 0x4A, 0x80, 0x8A, 0x80, 0x76, 0x1C, 0x31, 0xB2, 0xA9, 0x82, 0x0A, 0x29, - 0xF2, 0xDB, 0x21, 0x7B, 0x09, 0x07, 0x04, 0xD0, 0x21, 0x7B, 0x09, 0x07, 0x09, 0x0F, 0x03, 0x29, - 0x09, 0xD1, 0xA0, 0x48, 0x00, 0x21, 0xC1, 0x71, 0x01, 0x85, 0x02, 0x9A, 0x82, 0x85, 0x41, 0x85, - 0x01, 0x99, 0xC1, 0x85, 0xFF, 0xBD, 0x21, 0x7B, 0x02, 0x01, 0x8A, 0x18, 0x99, 0x49, 0x8A, 0x77, - 0xD2, 0xB2, 0x92, 0x06, 0x23, 0x7B, 0x92, 0x0E, 0x80, 0x01, 0x18, 0x18, 0x88, 0x77, 0xC0, 0xB2, - 0x80, 0x09, 0x80, 0x01, 0x10, 0x43, 0xC8, 0x71, 0x00, 0x21, 0x92, 0x4A, 0xA9, 0x82, 0xD0, 0x32, - 0x91, 0x4B, 0x14, 0x20, 0x28, 0x5E, 0x60, 0x3B, 0x1B, 0x18, 0xA0, 0x33, 0x1B, 0x79, 0x8F, 0x4F, - 0x46, 0x00, 0xB4, 0x37, 0xBB, 0x53, 0x8B, 0x4B, 0xC8, 0x33, 0x19, 0x54, 0x11, 0x54, 0x40, 0x1C, - 0x00, 0xB2, 0xA8, 0x82, 0x08, 0x28, 0xEB, 0xDB, 0x3A, 0x46, 0xA9, 0x82, 0x0A, 0x3A, 0x14, 0x20, - 0x28, 0x5E, 0x00, 0x23, 0x41, 0x1C, 0x09, 0xB2, 0x13, 0x54, 0xA9, 0x82, 0x0A, 0x29, 0xF6, 0xDB, - 0x03, 0x98, 0x80, 0x4E, 0x00, 0x28, 0x15, 0xD0, 0x01, 0x28, 0x13, 0xD0, 0x02, 0x28, 0x05, 0xD0, - 0x03, 0x28, 0x0F, 0xD1, 0x00, 0x20, 0x02, 0xF0, 0x3F, 0xFC, 0x08, 0xE0, 0xF0, 0x79, 0xC0, 0x07, - 0x08, 0xD0, 0x00, 0x20, 0x02, 0xF0, 0x38, 0xFC, 0xF0, 0x79, 0xC0, 0x07, 0x02, 0xD0, 0x01, 0x20, - 0x02, 0xF0, 0x32, 0xFC, 0x73, 0x48, 0xC3, 0x79, 0x75, 0x48, 0xD9, 0x06, 0x71, 0x49, 0x22, 0xD4, - 0x9A, 0x06, 0x92, 0x0F, 0x0C, 0xD1, 0x82, 0x81, 0xA2, 0x7B, 0xEE, 0x89, 0x72, 0x43, 0x92, 0x0A, - 0xC2, 0x81, 0xA2, 0x7B, 0xE7, 0x7B, 0xD2, 0x19, 0x72, 0x43, 0x92, 0x0A, 0x4A, 0x85, 0x0D, 0xE0, - 0xEA, 0x89, 0xC2, 0x81, 0xA6, 0x7B, 0x56, 0x43, 0xB6, 0x0A, 0x96, 0x1B, 0x86, 0x81, 0xA6, 0x7B, - 0xE7, 0x7B, 0xF6, 0x19, 0x56, 0x43, 0xB6, 0x0A, 0x92, 0x1B, 0xCA, 0x85, 0x01, 0x22, 0x4A, 0x77, - 0x62, 0x7B, 0xA9, 0x89, 0x23, 0xE0, 0x9A, 0x06, 0x92, 0x0F, 0x03, 0x2A, 0x0D, 0xD1, 0x00, 0x22, - 0x82, 0x81, 0xA2, 0x7B, 0xAE, 0x89, 0x72, 0x43, 0x92, 0x0A, 0xC2, 0x81, 0xA2, 0x7B, 0xE7, 0x7B, - 0xD2, 0x19, 0x72, 0x43, 0x92, 0x0A, 0x0A, 0x85, 0x0D, 0xE0, 0xAA, 0x89, 0xC2, 0x81, 0xA6, 0x7B, - 0x56, 0x43, 0xB6, 0x0A, 0x96, 0x1B, 0x86, 0x81, 0xA6, 0x7B, 0xE7, 0x7B, 0xF6, 0x19, 0x56, 0x43, - 0xB6, 0x0A, 0x92, 0x1B, 0x8A, 0x85, 0x00, 0x22, 0x4A, 0x77, 0x62, 0x7B, 0xE9, 0x89, 0x4A, 0x43, - 0x52, 0x0A, 0x02, 0x82, 0x22, 0x7C, 0x09, 0xB2, 0x00, 0x2A, 0x4C, 0xD0, 0x49, 0x4A, 0x5E, 0x06, - 0x21, 0xD4, 0x9B, 0x09, 0x0C, 0xD1, 0x43, 0x82, 0xA3, 0x7C, 0xEE, 0x89, 0x73, 0x43, 0x9B, 0x0A, - 0x83, 0x82, 0xA3, 0x7C, 0xE7, 0x7C, 0xDB, 0x19, 0x73, 0x43, 0x9B, 0x0A, 0x53, 0x85, 0x0D, 0xE0, - 0xEB, 0x89, 0x83, 0x82, 0xA6, 0x7C, 0x5E, 0x43, 0xB6, 0x0A, 0x9E, 0x1B, 0x46, 0x82, 0xA6, 0x7C, - 0xE7, 0x7C, 0xF6, 0x19, 0x5E, 0x43, 0xB6, 0x0A, 0x9B, 0x1B, 0xD3, 0x85, 0x01, 0x23, 0xD3, 0x77, - 0x63, 0x7C, 0xAA, 0x89, 0x22, 0xE0, 0x9B, 0x09, 0x03, 0x2B, 0x0D, 0xD1, 0x00, 0x23, 0x43, 0x82, - 0xA3, 0x7C, 0xAE, 0x89, 0x73, 0x43, 0x9B, 0x0A, 0x83, 0x82, 0xA3, 0x7C, 0xE7, 0x7C, 0xDB, 0x19, - 0x73, 0x43, 0x9B, 0x0A, 0x13, 0x85, 0x0D, 0xE0, 0xAB, 0x89, 0x83, 0x82, 0xA6, 0x7C, 0x5E, 0x43, - 0xB6, 0x0A, 0x9E, 0x1B, 0x46, 0x82, 0xA6, 0x7C, 0xE7, 0x7C, 0xF6, 0x19, 0x5E, 0x43, 0xB6, 0x0A, - 0x9B, 0x1B, 0x93, 0x85, 0x00, 0x23, 0xD3, 0x77, 0x63, 0x7C, 0xEA, 0x89, 0x53, 0x43, 0x5B, 0x0A, - 0x12, 0xB2, 0xC3, 0x82, 0x00, 0x92, 0x00, 0x20, 0xA8, 0x82, 0x23, 0x4A, 0x14, 0x20, 0x28, 0x5E, - 0x60, 0x3A, 0x12, 0x18, 0xA0, 0x32, 0x12, 0x79, 0x00, 0x2A, 0x1B, 0xD0, 0x22, 0x7C, 0x00, 0x2A, - 0x09, 0xD0, 0x22, 0x7C, 0x82, 0x42, 0x06, 0xDC, 0x1C, 0x4E, 0x43, 0x00, 0xB4, 0x36, 0xF2, 0x5E, - 0x00, 0x9F, 0x7A, 0x43, 0x04, 0xE0, 0x19, 0x4E, 0x43, 0x00, 0xB4, 0x36, 0xF2, 0x5E, 0x4A, 0x43, - 0xD7, 0x17, 0x3F, 0x0E, 0xBA, 0x18, 0x12, 0x12, 0x40, 0x1C, 0x00, 0xB2, 0xF2, 0x52, 0xA8, 0x82, - 0x08, 0x28, 0xDA, 0xDB, 0x0F, 0x49, 0x30, 0x22, 0x28, 0x20, 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, - 0x00, 0xDA, 0x08, 0x86, 0x34, 0x22, 0x2C, 0x20, 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDD, - 0x88, 0x86, 0x32, 0x22, 0x2A, 0x20, 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDA, 0x48, 0x86, - 0x36, 0x22, 0x2E, 0x20, 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDD, 0xC8, 0x86, 0xA8, 0x8A, - 0x88, 0x71, 0xFF, 0xBD, 0x38, 0x01, 0x00, 0x20, 0x1C, 0x04, 0x00, 0x20, 0x1E, 0x06, 0x00, 0x20, - 0x98, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x19, 0x4B, 0x58, 0x78, 0x99, 0x79, 0x04, 0x46, 0x00, 0x29, - 0x02, 0xD1, 0x17, 0x48, 0x40, 0x7C, 0x22, 0xE0, 0xFF, 0x29, 0x20, 0xD0, 0x1A, 0x7A, 0x00, 0x2A, - 0x03, 0xD1, 0x14, 0x4D, 0x2D, 0x78, 0x00, 0x2D, 0x0D, 0xD0, 0x00, 0x25, 0x03, 0x29, 0x01, 0xD1, - 0xFF, 0x20, 0x06, 0xE0, 0x00, 0x2A, 0x06, 0xD0, 0x01, 0x29, 0xF9, 0xD0, 0x02, 0x29, 0x00, 0xD1, - 0x10, 0x46, 0x5D, 0x81, 0x0B, 0xE0, 0x0A, 0x21, 0x0C, 0x22, 0x59, 0x5E, 0x9A, 0x5E, 0x91, 0x42, - 0x04, 0xDC, 0x09, 0x4A, 0x12, 0x88, 0x89, 0x18, 0x59, 0x81, 0x00, 0xE0, 0x00, 0x20, 0xA0, 0x42, - 0x03, 0xD0, 0x58, 0x70, 0xC0, 0xB2, 0x03, 0xF0, 0xE9, 0xFB, 0x70, 0xBD, 0x78, 0x03, 0x00, 0x20, - 0xFC, 0x03, 0x00, 0x20, 0xA4, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x2F, 0x48, - 0xC0, 0x79, 0x00, 0x28, 0x58, 0xD0, 0x2D, 0x4E, 0x00, 0x20, 0x40, 0x36, 0x2C, 0x4F, 0x35, 0x46, - 0xB0, 0x82, 0x88, 0x35, 0x14, 0x20, 0x30, 0x5E, 0x39, 0x5C, 0x00, 0x29, 0x1E, 0xD1, 0x27, 0x49, - 0x80, 0x31, 0x89, 0x6A, 0x08, 0x5C, 0x00, 0x28, 0x22, 0xD0, 0x00, 0x24, 0x12, 0xE0, 0x28, 0x5D, - 0x00, 0x28, 0x0D, 0xD1, 0xB0, 0x8A, 0xC1, 0xB2, 0x20, 0x46, 0xFF, 0xF7, 0xB3, 0xFC, 0x28, 0x55, - 0x28, 0x5D, 0x00, 0x28, 0x04, 0xD0, 0x1D, 0x49, 0xB0, 0x8A, 0xD0, 0x31, 0x08, 0x55, 0x05, 0xE0, - 0x64, 0x1C, 0xE4, 0xB2, 0x19, 0x48, 0x80, 0x79, 0x84, 0x42, 0xE8, 0xD3, 0x17, 0x48, 0x14, 0x21, - 0x80, 0x30, 0x80, 0x6A, 0x71, 0x5E, 0x40, 0x5C, 0x00, 0x28, 0x01, 0xD0, 0x01, 0x21, 0x00, 0xE0, - 0x00, 0x21, 0x14, 0x20, 0x30, 0x5E, 0x42, 0x1C, 0x12, 0xB2, 0x39, 0x54, 0xB2, 0x82, 0x0A, 0x2A, - 0xC8, 0xDB, 0x0E, 0x4E, 0x00, 0x20, 0x37, 0x46, 0xB0, 0x77, 0x04, 0x46, 0xD0, 0x37, 0x10, 0xE0, - 0x28, 0x5D, 0x01, 0x28, 0x0B, 0xD1, 0x39, 0x5D, 0x20, 0x46, 0xFF, 0xF7, 0x83, 0xFC, 0x28, 0x55, - 0x28, 0x5D, 0x01, 0x28, 0x03, 0xD1, 0xB1, 0x7F, 0xA0, 0x40, 0x08, 0x43, 0xB0, 0x77, 0x64, 0x1C, - 0xE4, 0xB2, 0xB0, 0x79, 0x84, 0x42, 0xEB, 0xD3, 0xF0, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, - 0xC8, 0x06, 0x00, 0x20, 0xF0, 0xB5, 0x0D, 0x4E, 0x00, 0x24, 0x37, 0x46, 0x05, 0x46, 0x10, 0x3F, - 0x0E, 0xE0, 0x60, 0x00, 0x29, 0x5C, 0x42, 0x19, 0x52, 0x78, 0x09, 0x02, 0x89, 0x18, 0x64, 0x29, - 0x02, 0xD2, 0x31, 0x5A, 0x39, 0x52, 0x02, 0xE0, 0xE0, 0xB2, 0xFA, 0xF7, 0x89, 0xFE, 0x64, 0x1C, - 0x03, 0x48, 0x40, 0x79, 0x84, 0x42, 0xEC, 0xDB, 0xF0, 0xBD, 0x00, 0x00, 0x90, 0x1A, 0x00, 0x20, - 0x78, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x23, 0x06, 0xE0, 0xC2, 0x5C, 0x5C, 0x1C, 0x04, 0x5D, - 0xC4, 0x54, 0x5C, 0x1C, 0x02, 0x55, 0x9B, 0x1C, 0x8B, 0x42, 0xF6, 0xDB, 0x10, 0xBD, 0x00, 0x00, - 0x38, 0xB5, 0x04, 0xF0, 0x15, 0xFB, 0x3C, 0x20, 0x58, 0x49, 0x08, 0x70, 0x59, 0x20, 0x58, 0x49, - 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x56, 0x48, 0x00, 0x68, 0x04, 0x21, - 0x88, 0x43, 0x00, 0x1D, 0x53, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, - 0x08, 0x60, 0x00, 0xBF, 0x02, 0x20, 0xFC, 0xF7, 0x4F, 0xFA, 0x01, 0x28, 0xFA, 0xD1, 0xFB, 0xF7, - 0xCF, 0xFD, 0x69, 0x46, 0xF9, 0x20, 0x40, 0x02, 0xFB, 0xF7, 0x18, 0xFE, 0x4A, 0x49, 0x00, 0x98, - 0x88, 0x42, 0x08, 0xD1, 0xF9, 0x20, 0x40, 0x02, 0xFB, 0xF7, 0xD6, 0xFD, 0x47, 0x49, 0xF9, 0x20, - 0x40, 0x02, 0xFB, 0xF7, 0x49, 0xFE, 0x01, 0x20, 0xFC, 0xF7, 0x9C, 0xFB, 0x3F, 0x49, 0x09, 0x78, - 0x43, 0x4A, 0x51, 0x43, 0x08, 0x46, 0xFC, 0xF7, 0xFF, 0xFA, 0x02, 0x20, 0xFC, 0xF7, 0x68, 0xFB, - 0xFB, 0xF7, 0xA4, 0xFD, 0x00, 0x20, 0x3A, 0x49, 0x08, 0x60, 0xFB, 0xF7, 0x29, 0xFF, 0x3D, 0x48, - 0x00, 0x68, 0x3D, 0x49, 0x08, 0x40, 0x3B, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x3B, 0x49, - 0x08, 0x43, 0x38, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x04, 0x21, 0x88, 0x43, 0x35, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x36, 0x49, 0x08, 0x43, 0x32, 0x49, 0x88, 0x60, 0x31, 0x48, - 0x40, 0x30, 0x00, 0x68, 0x30, 0x21, 0x08, 0x43, 0x2E, 0x49, 0x40, 0x31, 0x08, 0x60, 0x08, 0x46, - 0x80, 0x68, 0x04, 0x21, 0x08, 0x43, 0x2B, 0x49, 0x40, 0x31, 0x88, 0x60, 0x03, 0x22, 0x11, 0x46, - 0x10, 0x46, 0xFC, 0xF7, 0x85, 0xF8, 0x03, 0x22, 0x01, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0x80, 0xF8, - 0x03, 0x22, 0x11, 0x46, 0x02, 0x20, 0xFC, 0xF7, 0x7B, 0xF8, 0x02, 0x22, 0x09, 0x21, 0x10, 0x46, - 0xFC, 0xF7, 0x76, 0xF8, 0x02, 0x22, 0x0B, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x71, 0xF8, 0x02, 0x22, - 0x09, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x6C, 0xF8, 0x02, 0x22, 0x0C, 0x21, 0x10, 0x46, 0xFC, 0xF7, - 0x67, 0xF8, 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x62, 0xF8, 0x01, 0x20, 0x19, 0x49, - 0x08, 0x70, 0x00, 0x20, 0x18, 0x49, 0x08, 0x70, 0x18, 0x49, 0x08, 0x70, 0x03, 0x21, 0x08, 0x46, - 0xFB, 0xF7, 0xBA, 0xFE, 0x05, 0x46, 0x03, 0x21, 0x02, 0x20, 0xFB, 0xF7, 0xB5, 0xFE, 0x04, 0x46, - 0x00, 0x2C, 0x04, 0xD1, 0x00, 0x22, 0x03, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0x49, 0xF8, 0x68, 0x00, - 0x00, 0x19, 0xC1, 0xB2, 0x0E, 0x48, 0x81, 0x74, 0x38, 0xBD, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x50, 0x00, 0x02, 0x00, 0x50, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, - 0x40, 0x42, 0x0F, 0x00, 0x80, 0x40, 0x00, 0x50, 0xCC, 0xFF, 0xFC, 0xF3, 0x13, 0x00, 0x03, 0x0C, - 0x01, 0x21, 0x00, 0x00, 0xA5, 0x00, 0x00, 0x20, 0xA6, 0x00, 0x00, 0x20, 0xCD, 0x00, 0x00, 0x20, - 0xFC, 0x03, 0x00, 0x20, 0x10, 0xB5, 0xFF, 0xF7, 0x25, 0xFB, 0xFD, 0xF7, 0x69, 0xFF, 0x00, 0xF0, - 0x95, 0xFC, 0xF9, 0xF7, 0x71, 0xFE, 0x0D, 0x48, 0x01, 0x21, 0x81, 0x70, 0x00, 0xF0, 0x18, 0xF8, - 0xFA, 0xF7, 0x8E, 0xFB, 0xFA, 0xF7, 0xF2, 0xFB, 0xFA, 0xF7, 0xF0, 0xFB, 0xFD, 0xF7, 0x66, 0xF9, - 0x00, 0xF0, 0xFE, 0xF8, 0xF9, 0xF7, 0xFE, 0xFB, 0xFB, 0xF7, 0x9E, 0xF8, 0xFA, 0xF7, 0x10, 0xFF, - 0xFF, 0xF7, 0x7C, 0xFE, 0x02, 0xF0, 0x5E, 0xFE, 0x10, 0xBD, 0x00, 0x00, 0x58, 0x01, 0x00, 0x20, - 0xFE, 0xB5, 0x76, 0x4C, 0x00, 0x20, 0x25, 0x46, 0x60, 0x80, 0x20, 0x3D, 0x21, 0x46, 0xE8, 0x83, - 0x60, 0x39, 0x48, 0x76, 0xE0, 0x83, 0x48, 0x70, 0x88, 0x7C, 0xC9, 0x7C, 0x80, 0x1C, 0x49, 0x1C, - 0x41, 0x43, 0x89, 0xB2, 0x00, 0x91, 0xA8, 0x82, 0x20, 0x46, 0x40, 0x38, 0x01, 0x90, 0xCD, 0xE0, - 0x6A, 0x4F, 0x20, 0x37, 0x7B, 0x69, 0x19, 0x5C, 0x00, 0x29, 0x7E, 0xD1, 0xFA, 0x68, 0x41, 0x00, - 0x56, 0x5E, 0x8A, 0x18, 0xEE, 0x82, 0x02, 0x21, 0x51, 0x5E, 0xB1, 0x42, 0x75, 0xDC, 0x02, 0x21, - 0x18, 0x18, 0x41, 0x70, 0x3A, 0x46, 0x14, 0x21, 0x80, 0x3A, 0x69, 0x5E, 0x93, 0x7C, 0xF8, 0x68, - 0xC9, 0x18, 0x4B, 0x00, 0x18, 0x18, 0x16, 0x26, 0x04, 0x23, 0xAE, 0x5F, 0xC3, 0x5E, 0xB3, 0x42, - 0xEC, 0xDC, 0x7B, 0x69, 0x02, 0x20, 0xC9, 0x18, 0x88, 0x70, 0x14, 0x20, 0x28, 0x5E, 0xF9, 0x68, - 0x43, 0x00, 0x5B, 0x18, 0x20, 0x3B, 0x1E, 0x26, 0x9E, 0x5F, 0x16, 0x23, 0xEB, 0x5E, 0x9E, 0x42, - 0xDC, 0xDC, 0x96, 0x7C, 0x86, 0x1B, 0x76, 0x00, 0x71, 0x18, 0x20, 0x39, 0x1C, 0x26, 0x8E, 0x5F, - 0x9E, 0x42, 0xD3, 0xDC, 0x39, 0x46, 0x49, 0x69, 0x01, 0x26, 0x0E, 0x54, 0x91, 0x7C, 0x14, 0x20, - 0x17, 0x46, 0x89, 0x1C, 0x28, 0x5E, 0xF9, 0xF7, 0x89, 0xFA, 0xA1, 0x80, 0xE1, 0x80, 0x20, 0x81, - 0x60, 0x81, 0x26, 0x80, 0xE8, 0x8A, 0xA8, 0x83, 0x00, 0x20, 0xB8, 0x75, 0x01, 0x99, 0x88, 0x71, - 0xFD, 0xF7, 0x9C, 0xF9, 0x20, 0x89, 0xC1, 0xB2, 0x15, 0xE0, 0xA0, 0x88, 0xC0, 0xB2, 0x0C, 0xE0, - 0x3E, 0x4A, 0x3E, 0x4B, 0x60, 0x3A, 0x92, 0x7C, 0x20, 0x33, 0x5B, 0x69, 0x92, 0x1C, 0x47, 0x1C, - 0x4A, 0x43, 0x18, 0x18, 0xFF, 0xB2, 0x16, 0x54, 0x38, 0x46, 0x06, 0x22, 0xA2, 0x5E, 0x90, 0x42, - 0xEE, 0xDD, 0x49, 0x1C, 0xC9, 0xB2, 0x0A, 0x20, 0x20, 0x5E, 0x81, 0x42, 0xE5, 0xDD, 0xA8, 0x8B, - 0x00, 0x28, 0x58, 0xD0, 0x06, 0x21, 0x04, 0x20, 0x61, 0x5E, 0x20, 0x5E, 0x81, 0x42, 0x06, 0xD1, - 0x0A, 0x22, 0x08, 0x23, 0xA2, 0x5E, 0xE3, 0x5E, 0xD2, 0x1A, 0x05, 0x2A, 0x4B, 0xDC, 0x08, 0x1A, - 0x05, 0x28, 0x07, 0xDD, 0x0A, 0x20, 0x20, 0x5E, 0x00, 0xE0, 0x44, 0xE0, 0x08, 0x21, 0x61, 0x5E, - 0x88, 0x42, 0x40, 0xD0, 0x25, 0x4F, 0x20, 0x88, 0x60, 0x3F, 0x39, 0x7E, 0x88, 0x42, 0x00, 0xD3, - 0x7E, 0x70, 0x01, 0x98, 0x80, 0x78, 0x00, 0x28, 0x04, 0xD1, 0xFD, 0xF7, 0x1D, 0xFD, 0xA9, 0x8B, - 0x08, 0x1A, 0xA8, 0x83, 0x1D, 0x49, 0x7A, 0x7E, 0x20, 0x31, 0xCB, 0x69, 0xA8, 0x8B, 0x52, 0x00, - 0x98, 0x52, 0x1C, 0x20, 0x28, 0x5E, 0x3A, 0x7D, 0x90, 0x42, 0x02, 0xDD, 0xE0, 0x8B, 0x40, 0x1C, - 0xE0, 0x83, 0x63, 0x88, 0x8A, 0x69, 0xA0, 0x88, 0xD0, 0x54, 0x60, 0x88, 0x40, 0x1C, 0x80, 0xB2, - 0x60, 0x80, 0x8B, 0x69, 0xE2, 0x88, 0x1A, 0x54, 0x60, 0x88, 0x40, 0x1C, 0x80, 0xB2, 0x60, 0x80, - 0x8B, 0x69, 0x22, 0x89, 0x1A, 0x54, 0x60, 0x88, 0x40, 0x1C, 0x80, 0xB2, 0x60, 0x80, 0x89, 0x69, - 0x62, 0x89, 0x0A, 0x54, 0x60, 0x88, 0x40, 0x1C, 0x60, 0x80, 0x78, 0x7E, 0x40, 0x1C, 0xC0, 0xB2, - 0x78, 0x76, 0x0A, 0x28, 0x08, 0xD2, 0xA8, 0x8A, 0x40, 0x1C, 0xA8, 0x82, 0x14, 0x20, 0x28, 0x5E, - 0x00, 0x99, 0x88, 0x42, 0x00, 0xDA, 0x2B, 0xE7, 0xFE, 0xBD, 0x00, 0x00, 0x98, 0x01, 0x00, 0x20, - 0xF0, 0xB5, 0x00, 0x20, 0xFB, 0x4A, 0x93, 0xB0, 0x43, 0x1E, 0x05, 0x46, 0x14, 0x6A, 0x41, 0x00, - 0x63, 0x52, 0x54, 0x6A, 0x63, 0x52, 0x44, 0x1C, 0x91, 0x6A, 0xA4, 0xB2, 0x0D, 0x54, 0x20, 0x46, - 0x0A, 0x2C, 0xF3, 0xD3, 0xF3, 0x48, 0x80, 0x38, 0x03, 0x46, 0x41, 0x7E, 0x60, 0x33, 0x12, 0x93, - 0x59, 0x80, 0x40, 0x3B, 0x19, 0x71, 0x12, 0x9B, 0x59, 0x88, 0x00, 0x29, 0x7D, 0xD0, 0x04, 0x46, - 0x40, 0x34, 0xE5, 0x83, 0xA5, 0x82, 0xEB, 0x4A, 0x03, 0x7D, 0xD2, 0x69, 0x0A, 0xE0, 0x46, 0x00, - 0x96, 0x5F, 0x9E, 0x42, 0x04, 0xDD, 0x01, 0x26, 0xE7, 0x8B, 0x86, 0x40, 0x3E, 0x43, 0xE6, 0x83, - 0x40, 0x1C, 0xA0, 0x82, 0x14, 0x20, 0x20, 0x5E, 0x88, 0x42, 0xF0, 0xDB, 0x00, 0x20, 0x07, 0x90, - 0xE0, 0x8B, 0x05, 0x90, 0x00, 0x20, 0xE5, 0x83, 0x06, 0x90, 0x01, 0x29, 0x19, 0xD1, 0xDD, 0x48, - 0x80, 0x69, 0x01, 0x78, 0x00, 0x29, 0x01, 0xD0, 0x49, 0x1E, 0x01, 0x70, 0xD9, 0x4A, 0x41, 0x78, - 0x80, 0x3A, 0x93, 0x7C, 0x99, 0x42, 0x01, 0xD2, 0x49, 0x1C, 0x41, 0x70, 0x81, 0x78, 0x00, 0x29, - 0x01, 0xD0, 0x49, 0x1E, 0x81, 0x70, 0xC1, 0x78, 0xD2, 0x7C, 0x91, 0x42, 0x01, 0xD2, 0x49, 0x1C, - 0xC1, 0x70, 0x00, 0x20, 0xA0, 0x82, 0xD0, 0x48, 0x11, 0x90, 0x18, 0xE3, 0x81, 0x04, 0x0A, 0x0C, - 0xCC, 0x49, 0x15, 0x46, 0x89, 0x69, 0x12, 0x9B, 0x4E, 0x5D, 0x9E, 0x80, 0x52, 0x1C, 0x92, 0xB2, - 0x10, 0x96, 0x8B, 0x5C, 0x12, 0x9D, 0x52, 0x1C, 0xEB, 0x80, 0x92, 0xB2, 0x8F, 0x5C, 0x12, 0x9D, - 0x52, 0x1C, 0x2F, 0x81, 0x92, 0xB2, 0x0F, 0x97, 0x89, 0x5C, 0x12, 0x9A, 0x9C, 0x46, 0x51, 0x81, - 0x9A, 0x19, 0xD3, 0x0F, 0x9A, 0x18, 0xC1, 0x4B, 0x0E, 0x91, 0x52, 0x10, 0x1A, 0x54, 0x79, 0x18, - 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, 0x1A, 0x46, 0x0A, 0x32, 0x00, 0x23, 0x11, 0x54, 0x1E, 0x46, - 0x1D, 0x46, 0x23, 0xE0, 0x10, 0x98, 0x82, 0xB2, 0x1C, 0xE0, 0xB6, 0x48, 0xB5, 0x49, 0x80, 0x38, - 0x80, 0x7C, 0xC9, 0x68, 0x80, 0x1C, 0x78, 0x43, 0x80, 0x18, 0x00, 0x04, 0xC0, 0x0B, 0x08, 0x5E, - 0x20, 0x83, 0x10, 0x28, 0x02, 0xDA, 0x00, 0x20, 0x01, 0xE0, 0xDF, 0xE2, 0x10, 0x38, 0xE0, 0x82, - 0x00, 0xB2, 0x01, 0x46, 0x79, 0x43, 0x8E, 0x19, 0x2D, 0x18, 0x51, 0x1C, 0x50, 0x43, 0x89, 0xB2, - 0xC3, 0x18, 0x0A, 0x46, 0x62, 0x45, 0xE0, 0xDD, 0x7F, 0x1C, 0xBF, 0xB2, 0x0E, 0x98, 0x87, 0x42, - 0xD8, 0xDD, 0x10, 0x98, 0x80, 0xB2, 0x5D, 0xE0, 0x0F, 0x99, 0x8F, 0xB2, 0xA1, 0x49, 0x04, 0x97, - 0x80, 0x39, 0x89, 0x7C, 0x0D, 0x91, 0x8A, 0x1C, 0x57, 0x43, 0x0C, 0x91, 0x39, 0x18, 0x8F, 0xB2, - 0x0B, 0x92, 0x9C, 0x49, 0x7A, 0x00, 0xC9, 0x68, 0x0A, 0x91, 0x8A, 0x5E, 0x8E, 0x46, 0x52, 0x10, - 0x62, 0x83, 0x0C, 0x99, 0x7F, 0x1A, 0xBF, 0x1E, 0x3F, 0x04, 0xFF, 0x0B, 0x71, 0x46, 0xC9, 0x5F, - 0x21, 0x83, 0x91, 0x42, 0x00, 0xDB, 0x11, 0x46, 0x21, 0x83, 0x10, 0x29, 0x01, 0xDA, 0x00, 0x21, - 0x00, 0xE0, 0x10, 0x39, 0xE1, 0x82, 0x04, 0x99, 0x49, 0x1E, 0x8A, 0xB2, 0x16, 0x21, 0x61, 0x5E, - 0x4A, 0x43, 0x92, 0x19, 0x6F, 0x18, 0x02, 0x92, 0x41, 0x43, 0x0E, 0x9A, 0xCB, 0x18, 0x0B, 0x99, - 0x92, 0xB2, 0x51, 0x43, 0x09, 0x18, 0x8D, 0xB2, 0x0A, 0x9E, 0x69, 0x00, 0x71, 0x5E, 0x49, 0x10, - 0x61, 0x83, 0x0D, 0x9E, 0xAD, 0x19, 0xAD, 0x1C, 0x2D, 0x04, 0x0A, 0x9E, 0xED, 0x0B, 0x75, 0x5F, - 0x25, 0x83, 0x8D, 0x42, 0x00, 0xDB, 0x0D, 0x46, 0x25, 0x83, 0x10, 0x2D, 0x02, 0xDA, 0x00, 0x21, - 0xE1, 0x82, 0x01, 0xE0, 0x10, 0x3D, 0xE5, 0x82, 0x52, 0x1C, 0x16, 0x21, 0x96, 0xB2, 0x61, 0x5E, - 0x02, 0x46, 0x0D, 0x46, 0x75, 0x43, 0x02, 0x9E, 0x40, 0x1C, 0xAE, 0x19, 0x7D, 0x18, 0x51, 0x43, - 0x80, 0xB2, 0xCB, 0x18, 0x60, 0x45, 0x9F, 0xDD, 0x0F, 0x98, 0x87, 0xB2, 0x54, 0xE0, 0x10, 0x98, - 0x81, 0xB2, 0x70, 0x48, 0x03, 0x91, 0x80, 0x38, 0x80, 0x7C, 0x80, 0x1C, 0x78, 0x43, 0x41, 0x18, - 0x09, 0x90, 0x8A, 0xB2, 0x6B, 0x48, 0x51, 0x00, 0xC0, 0x68, 0x08, 0x90, 0x41, 0x5E, 0x52, 0x1E, - 0x49, 0x10, 0x12, 0x04, 0x61, 0x83, 0xD2, 0x0B, 0x80, 0x5E, 0x20, 0x83, 0x88, 0x42, 0x00, 0xDB, - 0x08, 0x46, 0x20, 0x83, 0x10, 0x28, 0x01, 0xDA, 0x00, 0x20, 0x00, 0xE0, 0x10, 0x38, 0xE0, 0x82, - 0x03, 0x98, 0x40, 0x1E, 0x81, 0xB2, 0x16, 0x20, 0x20, 0x5E, 0x02, 0x46, 0x7A, 0x43, 0x96, 0x19, - 0x2A, 0x18, 0x01, 0x92, 0x62, 0x46, 0x09, 0x9D, 0x92, 0xB2, 0x48, 0x43, 0xAD, 0x18, 0xA9, 0xB2, - 0xC3, 0x18, 0x48, 0x00, 0x08, 0x9D, 0x49, 0x1C, 0x28, 0x5E, 0x09, 0x04, 0x40, 0x10, 0x60, 0x83, - 0x08, 0x9D, 0xC9, 0x0B, 0x69, 0x5E, 0x21, 0x83, 0x81, 0x42, 0x00, 0xDB, 0x01, 0x46, 0x21, 0x83, - 0x10, 0x29, 0x02, 0xDA, 0x00, 0x20, 0xE0, 0x82, 0x01, 0xE0, 0x10, 0x39, 0xE1, 0x82, 0x16, 0x20, - 0x20, 0x5E, 0x01, 0x9D, 0x01, 0x46, 0x79, 0x43, 0x52, 0x1C, 0x92, 0xB2, 0x2D, 0x18, 0x7F, 0x1C, - 0x8E, 0x19, 0x50, 0x43, 0xBF, 0xB2, 0xC3, 0x18, 0x0E, 0x98, 0x87, 0x42, 0xA7, 0xDD, 0x00, 0x2D, - 0x00, 0xD1, 0x01, 0x25, 0x58, 0x02, 0x29, 0x46, 0xF9, 0xF7, 0x76, 0xF8, 0xFF, 0x38, 0x01, 0x38, - 0x07, 0xB2, 0x70, 0x02, 0x29, 0x46, 0xF9, 0xF7, 0x6F, 0xF8, 0xFF, 0x38, 0x01, 0x38, 0x06, 0xB2, - 0xFF, 0x20, 0x00, 0x01, 0x85, 0x42, 0x01, 0xD3, 0xFF, 0x20, 0x05, 0xE0, 0x28, 0x11, 0x00, 0xB2, - 0x00, 0x90, 0x01, 0x28, 0x01, 0xDA, 0x01, 0x20, 0x00, 0x90, 0x00, 0x2F, 0x01, 0xDA, 0x00, 0x27, - 0x04, 0xE0, 0xA0, 0x89, 0x87, 0x42, 0x01, 0xDB, 0x40, 0x1E, 0x07, 0xB2, 0x00, 0x2E, 0x00, 0xDA, - 0x00, 0x26, 0xE5, 0x89, 0xAE, 0x42, 0x01, 0xDB, 0x68, 0x1E, 0x06, 0xB2, 0x11, 0x98, 0x00, 0x7B, - 0x40, 0x09, 0x5D, 0xD1, 0x2B, 0x4A, 0x28, 0x20, 0x80, 0x3A, 0x10, 0x5E, 0x03, 0x21, 0x09, 0x02, - 0x43, 0x18, 0x9F, 0x42, 0x0F, 0xDA, 0x87, 0x42, 0x0D, 0xDB, 0xC3, 0x1B, 0x5B, 0x18, 0x5D, 0x00, - 0x5B, 0x19, 0xDD, 0x0F, 0xEB, 0x18, 0x5B, 0x10, 0xC3, 0x1A, 0x5B, 0x18, 0x1F, 0xB2, 0x87, 0x42, - 0x16, 0xDA, 0x07, 0x46, 0x14, 0xE0, 0x2C, 0x20, 0x10, 0x5E, 0x43, 0x1A, 0x9F, 0x42, 0x0F, 0xDD, - 0x87, 0x42, 0x0D, 0xDA, 0x3B, 0x1A, 0x5B, 0x18, 0x5D, 0x00, 0x5B, 0x19, 0xDD, 0x0F, 0xEB, 0x18, - 0x5B, 0x10, 0x1B, 0x18, 0x5B, 0x1A, 0x1F, 0xB2, 0x87, 0x42, 0x01, 0xDB, 0x40, 0x1E, 0x07, 0xB2, - 0x2A, 0x20, 0x10, 0x5E, 0x43, 0x18, 0x9E, 0x42, 0x0F, 0xDA, 0x86, 0x42, 0x0D, 0xDB, 0x82, 0x1B, - 0x52, 0x18, 0x53, 0x00, 0xD2, 0x18, 0xD3, 0x0F, 0x9A, 0x18, 0x52, 0x10, 0x82, 0x1A, 0x51, 0x18, - 0x0E, 0xB2, 0x86, 0x42, 0x00, 0xDA, 0x06, 0x46, 0x73, 0xE1, 0x2E, 0x20, 0x10, 0x5E, 0x42, 0x1A, - 0x96, 0x42, 0xF9, 0xDD, 0x86, 0x42, 0xF7, 0xDA, 0x32, 0x1A, 0x52, 0x18, 0x53, 0x00, 0xD2, 0x18, - 0xD3, 0x0F, 0x9A, 0x18, 0x52, 0x10, 0x12, 0x18, 0x51, 0x1A, 0x0E, 0xB2, 0x86, 0x42, 0xEB, 0xDB, - 0x40, 0x1E, 0x5D, 0xE1, 0xB8, 0x01, 0x00, 0x20, 0x1C, 0x04, 0x00, 0x20, 0x32, 0x07, 0x00, 0x20, - 0x11, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x01, 0x28, 0x7E, 0xD1, 0xBD, 0x48, 0x28, 0x25, 0x45, 0x5F, - 0x01, 0x20, 0x80, 0x02, 0x28, 0x18, 0x87, 0x42, 0x2F, 0xDA, 0xAF, 0x42, 0x2D, 0xDB, 0xE8, 0x1B, - 0x01, 0x27, 0xBF, 0x02, 0xC0, 0x19, 0x80, 0xB2, 0xB9, 0x10, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, - 0x48, 0x43, 0x05, 0x21, 0xF8, 0xF7, 0xD0, 0xFF, 0x28, 0x1A, 0xC0, 0x19, 0x18, 0xE0, 0x01, 0x21, - 0x49, 0x02, 0x88, 0x42, 0x09, 0xD8, 0xAF, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF8, 0xF7, - 0xCD, 0xFF, 0xAD, 0x49, 0x28, 0x1A, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, - 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF8, 0xF7, 0xC1, 0xFF, 0x28, 0x1A, 0xFF, 0x30, 0x79, 0x30, - 0x07, 0xB2, 0xAF, 0x42, 0x39, 0xDA, 0x2F, 0x46, 0x37, 0xE0, 0xA1, 0x49, 0x2C, 0x25, 0x4D, 0x5F, - 0x01, 0x21, 0x89, 0x02, 0x6A, 0x1A, 0x97, 0x42, 0x2F, 0xDD, 0xAF, 0x42, 0x2D, 0xDA, 0x78, 0x1B, - 0x40, 0x18, 0x0F, 0x46, 0x80, 0xB2, 0x89, 0x10, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, - 0x05, 0x21, 0xF8, 0xF7, 0x99, 0xFF, 0x40, 0x19, 0xC0, 0x1B, 0x19, 0xE0, 0x01, 0x21, 0x49, 0x02, - 0x88, 0x42, 0x0A, 0xD8, 0x93, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF8, 0xF7, 0x96, 0xFF, - 0x91, 0x49, 0x40, 0x19, 0x49, 0x42, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, - 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF8, 0xF7, 0x89, 0xFF, 0x40, 0x19, 0xFF, 0x38, 0x79, 0x38, - 0x07, 0xB2, 0xAF, 0x42, 0x01, 0xDB, 0x6D, 0x1E, 0x2F, 0xB2, 0x85, 0x49, 0x2A, 0x25, 0x4D, 0x5F, - 0x01, 0x20, 0x80, 0x02, 0x2A, 0x18, 0x96, 0x42, 0x31, 0xDA, 0xAE, 0x42, 0x2F, 0xDB, 0xA9, 0x1B, - 0x06, 0x46, 0x08, 0x18, 0x80, 0xB2, 0x00, 0xE0, 0x60, 0xE0, 0xFF, 0x21, 0x01, 0x31, 0x88, 0x42, - 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, 0xF8, 0xF7, 0x5E, 0xFF, 0x28, 0x1A, 0x80, 0x19, - 0x18, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, 0x09, 0xD8, 0x76, 0x49, 0x80, 0x00, 0x40, 0x18, - 0x03, 0x21, 0xF8, 0xF7, 0x5B, 0xFF, 0x74, 0x49, 0x28, 0x1A, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, - 0xFF, 0x38, 0x02, 0x38, 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF8, 0xF7, 0x4F, 0xFF, 0x28, 0x1A, - 0xFF, 0x30, 0x79, 0x30, 0x06, 0xB2, 0xAE, 0x42, 0x00, 0xDA, 0x2E, 0x46, 0xA9, 0xE0, 0x2E, 0x25, - 0x4D, 0x5F, 0x29, 0x1A, 0x8E, 0x42, 0xF9, 0xDD, 0xAE, 0x42, 0xF7, 0xDA, 0x71, 0x1B, 0x06, 0x46, - 0x08, 0x18, 0xFF, 0x21, 0x80, 0xB2, 0x01, 0x31, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, - 0x05, 0x21, 0xF8, 0xF7, 0x29, 0xFF, 0x40, 0x19, 0x80, 0x1B, 0x19, 0xE0, 0x01, 0x21, 0x49, 0x02, - 0x88, 0x42, 0x0A, 0xD8, 0x5B, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF8, 0xF7, 0x26, 0xFF, - 0x59, 0x49, 0x40, 0x19, 0x49, 0x42, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, - 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF8, 0xF7, 0x19, 0xFF, 0x40, 0x19, 0xFF, 0x38, 0x79, 0x38, - 0x06, 0xB2, 0xAE, 0x42, 0x75, 0xDB, 0x6D, 0x1E, 0x2E, 0xB2, 0x72, 0xE0, 0x11, 0x98, 0x00, 0x7B, - 0x40, 0x09, 0x02, 0x28, 0x40, 0xD1, 0xFF, 0x3F, 0x01, 0x3F, 0x38, 0xB2, 0x00, 0x28, 0x01, 0xDA, - 0x00, 0x20, 0x07, 0xE0, 0xA1, 0x89, 0xCA, 0x1F, 0xFF, 0x3A, 0xFA, 0x3A, 0x90, 0x42, 0x01, 0xDB, - 0x51, 0x1E, 0x08, 0xB2, 0xA1, 0x89, 0x48, 0x43, 0xFF, 0x39, 0xFF, 0x39, 0x02, 0x39, 0xF8, 0xF7, - 0xEB, 0xFE, 0xFF, 0x36, 0x07, 0xB2, 0x01, 0x36, 0x01, 0x21, 0x30, 0xB2, 0x89, 0x02, 0x88, 0x42, - 0x0C, 0xDA, 0x08, 0x1A, 0x0E, 0x22, 0x50, 0x43, 0xC2, 0x17, 0x52, 0x0F, 0x10, 0x18, 0xC0, 0x10, - 0x08, 0x1A, 0x00, 0xB2, 0x00, 0x28, 0x13, 0xDA, 0x00, 0x20, 0x11, 0xE0, 0x27, 0x21, 0x49, 0x02, - 0x88, 0x42, 0x0D, 0xDD, 0x40, 0x1A, 0x0E, 0x22, 0x50, 0x43, 0xC2, 0x17, 0x52, 0x0F, 0x10, 0x18, - 0xC0, 0x10, 0x40, 0x18, 0x29, 0x21, 0x00, 0xB2, 0x49, 0x02, 0x88, 0x42, 0x00, 0xDB, 0x48, 0x1E, - 0x68, 0x43, 0x29, 0x21, 0x49, 0x02, 0x29, 0xE0, 0x11, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x03, 0x28, - 0x27, 0xD1, 0xFF, 0x3F, 0x01, 0x3F, 0x38, 0xB2, 0x00, 0x28, 0x01, 0xDA, 0x00, 0x20, 0x07, 0xE0, - 0xA1, 0x89, 0xCA, 0x1F, 0xFF, 0x3A, 0xFA, 0x3A, 0x90, 0x42, 0x01, 0xDB, 0x51, 0x1E, 0x08, 0xB2, - 0xA1, 0x89, 0x48, 0x43, 0xFF, 0x39, 0xFF, 0x39, 0x02, 0x39, 0xF8, 0xF7, 0xA5, 0xFE, 0xFF, 0x3E, - 0x07, 0xB2, 0x01, 0x3E, 0x30, 0xB2, 0x00, 0x28, 0x00, 0xDA, 0x00, 0x20, 0xE9, 0x1F, 0xFF, 0x39, - 0xFA, 0x39, 0x88, 0x42, 0x01, 0xDB, 0x48, 0x1E, 0x00, 0xB2, 0x68, 0x43, 0xF8, 0xF7, 0x94, 0xFE, - 0x06, 0xB2, 0x13, 0x4A, 0x06, 0x98, 0x80, 0x32, 0x11, 0x6A, 0x40, 0x00, 0x00, 0x9B, 0x0F, 0x52, - 0x55, 0x6A, 0x06, 0x99, 0x2E, 0x52, 0x4F, 0x1C, 0x90, 0x6A, 0xFA, 0xB2, 0x06, 0x92, 0x07, 0x9D, - 0x43, 0x54, 0x01, 0x22, 0x05, 0x98, 0xAA, 0x40, 0x02, 0x40, 0xE1, 0x8B, 0x07, 0x98, 0x0A, 0x43, - 0x40, 0x1C, 0xE2, 0x83, 0xC0, 0xB2, 0x07, 0x90, 0xA0, 0x8A, 0x40, 0x1C, 0xA0, 0x82, 0x12, 0x99, - 0x14, 0x20, 0x20, 0x5E, 0x49, 0x88, 0x88, 0x42, 0x00, 0xDA, 0xDF, 0xE4, 0x13, 0xB0, 0xF0, 0xBD, - 0x38, 0x01, 0x00, 0x20, 0x00, 0xFC, 0xFF, 0xFF, 0xCD, 0x02, 0x00, 0x00, 0xF0, 0xB5, 0x21, 0x4F, - 0x00, 0x20, 0xB9, 0x7C, 0xFA, 0x7C, 0x89, 0x1C, 0x52, 0x1C, 0x51, 0x43, 0x3E, 0x46, 0x04, 0x46, - 0x89, 0xB2, 0x80, 0x36, 0x0D, 0xE0, 0x75, 0x69, 0x02, 0x23, 0x2B, 0x54, 0x75, 0x69, 0x0A, 0x18, - 0xAB, 0x54, 0x43, 0x00, 0xF5, 0x68, 0x52, 0x00, 0xEC, 0x52, 0xF3, 0x68, 0x40, 0x1C, 0x00, 0xB2, - 0x9C, 0x52, 0xBA, 0x7C, 0x92, 0x1C, 0x90, 0x42, 0xED, 0xDB, 0xB8, 0x7C, 0x80, 0x1C, 0x02, 0x22, - 0x08, 0xE0, 0x73, 0x69, 0x45, 0x00, 0x1A, 0x54, 0xF3, 0x68, 0x5C, 0x53, 0xBB, 0x7C, 0xC0, 0x18, - 0x80, 0x1C, 0x00, 0xB2, 0x88, 0x42, 0xF4, 0xDB, 0xB8, 0x7C, 0xFB, 0x7C, 0x81, 0x1C, 0x9B, 0x1C, - 0x59, 0x43, 0x40, 0x00, 0x89, 0xB2, 0xC0, 0x1C, 0x08, 0xE0, 0x73, 0x69, 0x45, 0x00, 0x1A, 0x54, - 0xF3, 0x68, 0x5C, 0x53, 0xBB, 0x7C, 0xC0, 0x18, 0x80, 0x1C, 0x00, 0xB2, 0x88, 0x42, 0xF4, 0xDB, - 0xF0, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0xB0, 0x00, 0x20, 0x04, 0x90, - 0xFF, 0x48, 0x04, 0x78, 0xFF, 0x48, 0x05, 0x68, 0xFF, 0x48, 0x00, 0x78, 0xFF, 0x4E, 0x36, 0x78, - 0x70, 0x43, 0x40, 0x00, 0xFB, 0x4E, 0x36, 0x68, 0x80, 0x19, 0x03, 0x90, 0x00, 0x21, 0xE1, 0xE0, - 0x00, 0x20, 0x06, 0x90, 0x05, 0x90, 0xFA, 0x48, 0x00, 0x78, 0x48, 0x43, 0x03, 0x46, 0x00, 0x22, - 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, 0x40, 0x00, - 0x28, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, - 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, 0x30, 0x1A, - 0x05, 0x90, 0x52, 0x1C, 0xEA, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0xE9, 0x48, 0x06, 0x78, - 0xE7, 0x48, 0x00, 0x78, 0x46, 0x43, 0xE8, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, - 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, 0x40, 0x00, - 0x28, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, - 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, 0x30, 0x1A, - 0x05, 0x90, 0x52, 0x1C, 0xD8, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0xD7, 0x48, 0x00, 0x78, - 0x48, 0x43, 0x03, 0x46, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, - 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x19, - 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, - 0x06, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, - 0x52, 0x1C, 0xC6, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0xC2, 0x48, 0x06, 0x78, 0xC3, 0x48, - 0x00, 0x78, 0x46, 0x43, 0xC2, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, - 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, 0x40, 0x00, - 0x03, 0x9E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, - 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, - 0x30, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0xB1, 0x48, 0x00, 0x78, 0x82, 0x42, - 0xDE, 0xDB, 0x48, 0x00, 0xAF, 0x4E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x1B, 0x06, 0x90, 0x48, 0x00, - 0xAD, 0x4E, 0x30, 0x5E, 0x05, 0x9E, 0x80, 0x1B, 0x05, 0x90, 0x4E, 0x00, 0xA9, 0x4F, 0xBE, 0x5F, - 0x00, 0x2E, 0x13, 0xDD, 0x4E, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x00, 0x96, 0xBE, 0x19, 0x76, 0x10, - 0x06, 0x9F, 0xBE, 0x42, 0x22, 0xDB, 0x4E, 0x00, 0xA2, 0x4F, 0xBE, 0x5F, 0xF7, 0x0F, 0x01, 0x96, - 0xBE, 0x19, 0x76, 0x10, 0x76, 0x42, 0x06, 0x9F, 0xBE, 0x42, 0x17, 0xDC, 0x4E, 0x00, 0x9E, 0x4F, - 0xBE, 0x5F, 0x00, 0x2E, 0x15, 0xDD, 0x4E, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x02, 0x96, 0xBE, 0x19, - 0x76, 0x10, 0x05, 0x9F, 0xBE, 0x42, 0x09, 0xDB, 0x4E, 0x00, 0x97, 0x4F, 0xB8, 0x5F, 0xC6, 0x0F, - 0x36, 0x18, 0x76, 0x10, 0x76, 0x42, 0x05, 0x9F, 0xBE, 0x42, 0x02, 0xDD, 0x04, 0x98, 0x40, 0x1C, - 0x04, 0x90, 0x49, 0x1C, 0x8B, 0x48, 0x00, 0x78, 0x81, 0x42, 0x00, 0xDA, 0x18, 0xE7, 0x00, 0x21, - 0x34, 0xE1, 0x00, 0x20, 0x06, 0x90, 0x05, 0x90, 0x85, 0x48, 0x00, 0x78, 0x86, 0x4E, 0x36, 0x78, - 0x86, 0x19, 0x84, 0x48, 0x00, 0x78, 0x46, 0x43, 0x81, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, - 0x00, 0x22, 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, - 0x40, 0x00, 0x2E, 0x5E, 0x06, 0x98, 0x30, 0x18, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, - 0x28, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, - 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0x72, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0x70, 0x48, - 0x00, 0x78, 0x71, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x6E, 0x48, 0x00, 0x78, 0x46, 0x43, 0x73, 0x48, - 0x00, 0x78, 0x6B, 0x4F, 0x3F, 0x78, 0x78, 0x43, 0x36, 0x18, 0x6B, 0x48, 0x00, 0x78, 0x48, 0x43, - 0x33, 0x18, 0x00, 0x22, 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, - 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, - 0x40, 0x00, 0x28, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, - 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0x5B, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, - 0x5A, 0x48, 0x00, 0x78, 0x5A, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x56, 0x48, 0x00, 0x78, 0x46, 0x43, - 0x56, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x40, 0x00, - 0x03, 0x9E, 0x30, 0x5E, 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, - 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, - 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x05, 0x9E, - 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0x45, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0x43, 0x48, - 0x00, 0x78, 0x43, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x3E, 0x48, 0x00, 0x78, 0x46, 0x43, 0x43, 0x48, - 0x00, 0x78, 0x3E, 0x4F, 0x3F, 0x78, 0x78, 0x43, 0x36, 0x18, 0x3D, 0x48, 0x00, 0x78, 0x48, 0x43, - 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0xA0, 0x42, - 0x07, 0xDD, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, - 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, - 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, - 0x2B, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0x26, 0x48, 0x00, 0x78, 0x08, 0x18, 0x40, 0x00, - 0x28, 0x4E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x1B, 0x06, 0x90, 0x22, 0x48, 0x00, 0x78, 0x08, 0x18, - 0x40, 0x00, 0x25, 0x4E, 0x30, 0x5E, 0x05, 0x9E, 0x80, 0x1B, 0x05, 0x90, 0x1D, 0x4E, 0x36, 0x78, - 0x8E, 0x19, 0x76, 0x00, 0x1F, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, 0x19, 0xDD, 0x19, 0x4E, 0x36, 0x78, - 0x8E, 0x19, 0x76, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x00, 0x96, 0xBE, 0x19, 0x76, 0x10, 0x06, 0x9F, - 0xBE, 0x42, 0x47, 0xDB, 0x13, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0x15, 0x4F, 0xBE, 0x5F, - 0xF7, 0x0F, 0x01, 0x96, 0xBE, 0x19, 0x76, 0x10, 0x76, 0x42, 0x06, 0x9F, 0xBE, 0x42, 0x39, 0xDC, - 0x0C, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0x0F, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, 0x34, 0xDD, - 0x08, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x02, 0x96, 0x17, 0xE0, - 0x4D, 0x01, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x20, 0x4A, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, - 0x43, 0x01, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, - 0x47, 0x01, 0x00, 0x20, 0x0C, 0x05, 0x00, 0x20, 0x4C, 0x05, 0x00, 0x20, 0x49, 0x01, 0x00, 0x20, - 0xBE, 0x19, 0x76, 0x10, 0x05, 0x9F, 0xBE, 0x42, 0x0C, 0xDB, 0x11, 0x4E, 0x36, 0x78, 0x8E, 0x19, - 0x76, 0x00, 0x10, 0x4F, 0xB8, 0x5F, 0xC6, 0x0F, 0x36, 0x18, 0x76, 0x10, 0x76, 0x42, 0x05, 0x9F, - 0xBE, 0x42, 0x02, 0xDD, 0x04, 0x98, 0x40, 0x1C, 0x04, 0x90, 0x49, 0x1C, 0x0A, 0x48, 0x00, 0x78, - 0x81, 0x42, 0x00, 0xDA, 0xC5, 0xE6, 0x09, 0x4E, 0x30, 0x78, 0xC6, 0x0F, 0x36, 0x18, 0x76, 0x10, - 0x04, 0x9F, 0xBE, 0x42, 0x02, 0xDA, 0x00, 0x20, 0x07, 0xB0, 0xF0, 0xBD, 0x01, 0x20, 0xFB, 0xE7, - 0x48, 0x01, 0x00, 0x20, 0x4C, 0x05, 0x00, 0x20, 0x49, 0x01, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, - 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, - 0x80, 0xE1, 0x00, 0xE0, 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, - 0x70, 0x47, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, - 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0xC2, 0x06, 0xD2, 0x0E, - 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x00, 0xE1, 0x00, 0xE0, - 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, - 0x00, 0xE1, 0x00, 0xE0, 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, - 0x70, 0x47, 0x00, 0x00, 0x00, 0xE1, 0x00, 0xE0, 0x10, 0xB5, 0x00, 0x28, 0x19, 0xDA, 0x1A, 0x4A, - 0x03, 0x07, 0x1B, 0x0F, 0x08, 0x3B, 0x9B, 0x08, 0x9B, 0x00, 0xD2, 0x58, 0x83, 0x07, 0xDC, 0x0E, - 0xFF, 0x23, 0xA3, 0x40, 0x9A, 0x43, 0x8B, 0x07, 0x1B, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA3, 0x40, - 0x1A, 0x43, 0x11, 0x4B, 0x04, 0x07, 0x24, 0x0F, 0x08, 0x3C, 0xA4, 0x08, 0xA4, 0x00, 0x1A, 0x51, - 0x18, 0xE0, 0x0E, 0x4A, 0x03, 0x23, 0x1B, 0x02, 0xD2, 0x18, 0x83, 0x08, 0x9B, 0x00, 0xD3, 0x58, - 0x82, 0x07, 0xD4, 0x0E, 0xFF, 0x22, 0xA2, 0x40, 0x93, 0x43, 0x8A, 0x07, 0x12, 0x0E, 0x84, 0x07, - 0xE4, 0x0E, 0xA2, 0x40, 0x13, 0x43, 0x05, 0x4A, 0x03, 0x24, 0x24, 0x02, 0x12, 0x19, 0x84, 0x08, - 0xA4, 0x00, 0x13, 0x51, 0x10, 0xBD, 0x00, 0x00, 0x1C, 0xED, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, - 0x10, 0xB5, 0x00, 0x28, 0x19, 0xDA, 0x1A, 0x4A, 0x03, 0x07, 0x1B, 0x0F, 0x08, 0x3B, 0x9B, 0x08, - 0x9B, 0x00, 0xD2, 0x58, 0x83, 0x07, 0xDC, 0x0E, 0xFF, 0x23, 0xA3, 0x40, 0x9A, 0x43, 0x8B, 0x07, - 0x1B, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA3, 0x40, 0x1A, 0x43, 0x11, 0x4B, 0x04, 0x07, 0x24, 0x0F, - 0x08, 0x3C, 0xA4, 0x08, 0xA4, 0x00, 0x1A, 0x51, 0x18, 0xE0, 0x0E, 0x4A, 0x03, 0x23, 0x1B, 0x02, - 0xD2, 0x18, 0x83, 0x08, 0x9B, 0x00, 0xD3, 0x58, 0x82, 0x07, 0xD4, 0x0E, 0xFF, 0x22, 0xA2, 0x40, - 0x93, 0x43, 0x8A, 0x07, 0x12, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA2, 0x40, 0x13, 0x43, 0x05, 0x4A, - 0x03, 0x24, 0x24, 0x02, 0x12, 0x19, 0x84, 0x08, 0xA4, 0x00, 0x13, 0x51, 0x10, 0xBD, 0x00, 0x00, - 0x1C, 0xED, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, 0x10, 0xB5, 0x00, 0x28, 0x19, 0xDA, 0x1A, 0x4A, - 0x03, 0x07, 0x1B, 0x0F, 0x08, 0x3B, 0x9B, 0x08, 0x9B, 0x00, 0xD2, 0x58, 0x83, 0x07, 0xDC, 0x0E, - 0xFF, 0x23, 0xA3, 0x40, 0x9A, 0x43, 0x8B, 0x07, 0x1B, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA3, 0x40, - 0x1A, 0x43, 0x11, 0x4B, 0x04, 0x07, 0x24, 0x0F, 0x08, 0x3C, 0xA4, 0x08, 0xA4, 0x00, 0x1A, 0x51, - 0x18, 0xE0, 0x0E, 0x4A, 0x03, 0x23, 0x1B, 0x02, 0xD2, 0x18, 0x83, 0x08, 0x9B, 0x00, 0xD3, 0x58, - 0x82, 0x07, 0xD4, 0x0E, 0xFF, 0x22, 0xA2, 0x40, 0x93, 0x43, 0x8A, 0x07, 0x12, 0x0E, 0x84, 0x07, - 0xE4, 0x0E, 0xA2, 0x40, 0x13, 0x43, 0x05, 0x4A, 0x03, 0x24, 0x24, 0x02, 0x12, 0x19, 0x84, 0x08, - 0xA4, 0x00, 0x13, 0x51, 0x10, 0xBD, 0x00, 0x00, 0x1C, 0xED, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, - 0x10, 0xB5, 0x00, 0x28, 0x19, 0xDA, 0x1A, 0x4A, 0x03, 0x07, 0x1B, 0x0F, 0x08, 0x3B, 0x9B, 0x08, - 0x9B, 0x00, 0xD2, 0x58, 0x83, 0x07, 0xDC, 0x0E, 0xFF, 0x23, 0xA3, 0x40, 0x9A, 0x43, 0x8B, 0x07, - 0x1B, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA3, 0x40, 0x1A, 0x43, 0x11, 0x4B, 0x04, 0x07, 0x24, 0x0F, - 0x08, 0x3C, 0xA4, 0x08, 0xA4, 0x00, 0x1A, 0x51, 0x18, 0xE0, 0x0E, 0x4A, 0x03, 0x23, 0x1B, 0x02, - 0xD2, 0x18, 0x83, 0x08, 0x9B, 0x00, 0xD3, 0x58, 0x82, 0x07, 0xD4, 0x0E, 0xFF, 0x22, 0xA2, 0x40, - 0x93, 0x43, 0x8A, 0x07, 0x12, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA2, 0x40, 0x13, 0x43, 0x05, 0x4A, - 0x03, 0x24, 0x24, 0x02, 0x12, 0x19, 0x84, 0x08, 0xA4, 0x00, 0x13, 0x51, 0x10, 0xBD, 0x00, 0x00, - 0x1C, 0xED, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, 0x04, 0x48, 0xC1, 0x79, 0x10, 0x29, 0x03, 0xD1, - 0x11, 0x21, 0xC1, 0x71, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x78, 0x03, 0x00, 0x20, - 0x10, 0xB5, 0x07, 0x48, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, 0x40, 0x30, 0x04, 0x49, 0x08, 0x60, - 0x04, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x02, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, - 0x00, 0x02, 0x00, 0x50, 0x2C, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x21, 0x02, 0x20, 0xFC, 0xF7, - 0x99, 0xFC, 0x01, 0xF0, 0x81, 0xFC, 0x83, 0x48, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, - 0x06, 0xD1, 0x81, 0x48, 0x00, 0x78, 0x01, 0x28, 0x04, 0xD1, 0xFA, 0xF7, 0xF1, 0xFF, 0x01, 0xE0, - 0xFA, 0xF7, 0xEE, 0xFF, 0x01, 0x20, 0x00, 0x05, 0xFB, 0xF7, 0x3E, 0xFC, 0x05, 0x20, 0x00, 0x07, - 0x40, 0x6B, 0x10, 0x21, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, 0x48, 0x63, 0x08, 0x46, 0x40, 0x6B, - 0x20, 0x21, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, 0x48, 0x63, 0x01, 0x22, 0x04, 0x21, 0x10, 0x46, - 0xFA, 0xF7, 0x7E, 0xFF, 0x01, 0x22, 0x05, 0x21, 0x10, 0x46, 0xFA, 0xF7, 0x79, 0xFF, 0x04, 0x21, - 0x01, 0x20, 0xFA, 0xF7, 0xAF, 0xFF, 0x05, 0x21, 0x01, 0x20, 0xFA, 0xF7, 0xAB, 0xFF, 0x59, 0x20, - 0x6A, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x68, 0x48, 0x00, 0x68, - 0x80, 0x21, 0x88, 0x43, 0x66, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, - 0x63, 0x49, 0x08, 0x60, 0x0A, 0x20, 0xFA, 0xF7, 0x2B, 0xFC, 0x03, 0x21, 0x08, 0x46, 0xFA, 0xF7, - 0x15, 0xFD, 0x01, 0x21, 0x03, 0x20, 0xFA, 0xF7, 0x8D, 0xFF, 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, - 0xFA, 0xF7, 0x4E, 0xFF, 0x5B, 0x49, 0x00, 0x20, 0xFA, 0xF7, 0x9A, 0xFF, 0x01, 0x22, 0x11, 0x46, - 0x03, 0x20, 0x00, 0x23, 0xFA, 0xF7, 0x3A, 0xFD, 0x57, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, - 0x55, 0x49, 0x08, 0x60, 0x4F, 0x48, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x0E, 0xD1, - 0x4D, 0x48, 0x00, 0x78, 0x01, 0x28, 0x14, 0xD1, 0x04, 0x20, 0x50, 0x49, 0x08, 0x61, 0x4E, 0x48, - 0x00, 0x68, 0x20, 0x21, 0x88, 0x43, 0x20, 0x30, 0x4B, 0x49, 0x08, 0x60, 0x09, 0xE0, 0x04, 0x20, - 0x4A, 0x49, 0x08, 0x61, 0x48, 0x48, 0x00, 0x68, 0x20, 0x21, 0x88, 0x43, 0x20, 0x30, 0x46, 0x49, - 0x08, 0x60, 0x45, 0x48, 0x00, 0x68, 0xFF, 0x21, 0x01, 0x31, 0x88, 0x43, 0x40, 0x18, 0x42, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, 0x88, 0x43, 0x80, 0x30, 0x3E, 0x49, 0x08, 0x60, - 0x38, 0x48, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x0A, 0xD1, 0x07, 0xE0, 0x30, 0xBF, - 0x3B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, 0x33, 0x49, 0x08, 0x70, 0x00, 0xE0, 0xF6, 0xE7, - 0x00, 0xE0, 0x30, 0xBF, 0x34, 0x48, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x32, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x08, 0x60, 0x00, 0xBF, 0x02, 0x20, - 0xFB, 0xF7, 0x62, 0xF8, 0x01, 0x28, 0xFA, 0xD1, 0x2B, 0x48, 0x00, 0x69, 0xC0, 0x08, 0xC0, 0x00, - 0x00, 0x1D, 0x29, 0x49, 0x08, 0x61, 0x08, 0x46, 0x00, 0x6A, 0x49, 0x02, 0x88, 0x43, 0x26, 0x49, - 0x08, 0x62, 0x08, 0x46, 0x00, 0x6A, 0xC9, 0x01, 0x88, 0x43, 0x23, 0x49, 0x08, 0x62, 0x01, 0x20, - 0xFB, 0xF7, 0xB0, 0xF9, 0xFA, 0xF7, 0x7A, 0xFB, 0x22, 0x49, 0x09, 0x78, 0x22, 0x4A, 0x51, 0x43, - 0x08, 0x46, 0xFB, 0xF7, 0x11, 0xF9, 0xFA, 0xF7, 0x71, 0xFB, 0x02, 0x20, 0xFB, 0xF7, 0x78, 0xF9, - 0x05, 0x20, 0xFA, 0xF7, 0x95, 0xFB, 0x00, 0x20, 0x14, 0x49, 0x08, 0x60, 0x01, 0x21, 0x03, 0x20, - 0xFA, 0xF7, 0x92, 0xFC, 0x19, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0D, 0xD1, 0x01, 0x21, 0x02, 0x20, - 0xFA, 0xF7, 0x74, 0xFC, 0x01, 0x20, 0xFA, 0xF7, 0x83, 0xFB, 0x01, 0x21, 0x02, 0x20, 0xFA, 0xF7, - 0xE9, 0xFE, 0x01, 0x20, 0xFA, 0xF7, 0x7C, 0xFB, 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, 0x01, 0x20, - 0x10, 0x49, 0x08, 0x70, 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, 0xFA, 0xF7, 0xA1, 0xFE, 0xFE, 0xF7, - 0xCB, 0xF9, 0x10, 0xBD, 0x21, 0x04, 0x00, 0x20, 0x8F, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x40, 0x00, 0x40, 0xE9, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x00, 0xED, 0x00, 0xE0, - 0x8E, 0x00, 0x00, 0x20, 0xC2, 0x00, 0x00, 0x20, 0x40, 0x42, 0x0F, 0x00, 0xAE, 0x00, 0x00, 0x20, - 0xA4, 0x00, 0x00, 0x20, 0xA7, 0x00, 0x00, 0x20, 0x30, 0xB5, 0x85, 0xB0, 0x9E, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x07, 0xD1, 0x9D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, 0x9C, 0x48, 0x00, 0x78, - 0x03, 0x28, 0x06, 0xD1, 0x00, 0x20, 0x9B, 0x49, 0x08, 0x70, 0x9B, 0x49, 0x08, 0x80, 0x9B, 0x49, - 0x08, 0x70, 0x64, 0x20, 0x9A, 0x49, 0x08, 0x80, 0x9A, 0x48, 0x00, 0x69, 0x01, 0x21, 0x09, 0x04, - 0x08, 0x42, 0x59, 0xD1, 0x97, 0x49, 0x88, 0x69, 0x97, 0x49, 0x09, 0x78, 0xF8, 0xF7, 0x3C, 0xF9, - 0x04, 0x46, 0x96, 0x49, 0x08, 0x1B, 0x7D, 0x21, 0xC9, 0x00, 0xF8, 0xF7, 0x3F, 0xF9, 0x90, 0x49, - 0x08, 0x80, 0x8E, 0x48, 0x00, 0x78, 0x00, 0x28, 0x46, 0xD1, 0x08, 0x46, 0x00, 0x88, 0x90, 0x49, - 0x09, 0x78, 0x88, 0x42, 0x31, 0xDA, 0x8E, 0x48, 0x00, 0x78, 0x89, 0x49, 0x08, 0x80, 0x8C, 0x48, - 0x00, 0x78, 0x7D, 0x21, 0xC9, 0x00, 0x48, 0x43, 0x88, 0x49, 0x09, 0x1B, 0x44, 0x1A, 0x19, 0x20, - 0x80, 0x01, 0x84, 0x42, 0x1E, 0xDD, 0x01, 0x46, 0x20, 0x46, 0xF8, 0xF7, 0x1F, 0xF9, 0xC5, 0xB2, - 0x19, 0x20, 0x80, 0x01, 0x68, 0x43, 0x24, 0x1A, 0x00, 0x20, 0x03, 0xF0, 0xAD, 0xF8, 0x0B, 0xE0, - 0x01, 0x20, 0x80, 0x49, 0x08, 0x70, 0x00, 0x20, 0x03, 0xF0, 0xA6, 0xF8, 0x00, 0xE0, 0x30, 0xBF, - 0x7C, 0x48, 0x00, 0x78, 0x00, 0x28, 0xFA, 0xD1, 0x28, 0x46, 0x69, 0x1E, 0xCD, 0xB2, 0x00, 0x28, - 0xEE, 0xD1, 0x00, 0xBF, 0x02, 0x20, 0x03, 0xF0, 0x97, 0xF8, 0x6F, 0x48, 0x00, 0x88, 0x70, 0x49, - 0x09, 0x88, 0x40, 0x18, 0x6C, 0x49, 0x08, 0x80, 0x08, 0x46, 0x00, 0x88, 0x72, 0x49, 0x88, 0x42, - 0x02, 0xDD, 0x01, 0x20, 0x69, 0x49, 0x08, 0x70, 0x66, 0x48, 0x00, 0x78, 0x00, 0x28, 0x13, 0xDD, - 0x64, 0x48, 0x00, 0x78, 0x40, 0x1E, 0x00, 0x06, 0x00, 0x0E, 0x62, 0x49, 0x08, 0x70, 0x03, 0xD1, - 0x01, 0x20, 0x62, 0x49, 0x08, 0x70, 0x07, 0xE0, 0x5E, 0x48, 0x00, 0x78, 0x01, 0x28, 0x03, 0xD1, - 0x66, 0x48, 0x00, 0x88, 0x5E, 0x49, 0x08, 0x80, 0x5C, 0x48, 0x00, 0x78, 0x01, 0x28, 0x69, 0xD1, - 0x63, 0x48, 0x00, 0x78, 0x00, 0x28, 0xFA, 0xD1, 0x62, 0x48, 0x00, 0x78, 0x00, 0x28, 0xF6, 0xD1, - 0x61, 0x48, 0x00, 0x78, 0x00, 0x28, 0xF2, 0xD1, 0x54, 0x49, 0x08, 0x70, 0x52, 0x49, 0x08, 0x80, - 0x02, 0x20, 0x5E, 0x49, 0x09, 0x68, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x59, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xFF, 0x21, - 0x9E, 0x31, 0x03, 0x68, 0xA0, 0x20, 0xFD, 0xF7, 0x9B, 0xFA, 0x01, 0x20, 0xFA, 0xF7, 0x98, 0xFA, - 0x03, 0xF0, 0x96, 0xF8, 0x00, 0xF0, 0xAA, 0xF8, 0xFA, 0xF7, 0x54, 0xFA, 0x40, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x38, 0xD1, 0xFC, 0xF7, 0xEE, 0xFB, 0x4D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x09, 0xD1, - 0x01, 0x20, 0xFA, 0xF7, 0x85, 0xFA, 0x00, 0x22, 0x01, 0x21, 0x4A, 0x48, 0x03, 0xF0, 0xA7, 0xF8, - 0xFA, 0xF7, 0x2C, 0xFA, 0x04, 0x20, 0x45, 0x49, 0x09, 0x68, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x40, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, - 0x01, 0x22, 0xFF, 0x21, 0x9E, 0x31, 0x03, 0x68, 0xA0, 0x20, 0xFD, 0xF7, 0x69, 0xFA, 0xF9, 0xF7, - 0xB1, 0xFA, 0x03, 0xF0, 0x65, 0xF8, 0x00, 0xF0, 0xD5, 0xFC, 0x05, 0x20, 0x29, 0x49, 0x08, 0x70, - 0x26, 0x48, 0x00, 0x78, 0x00, 0x28, 0x41, 0xD0, 0x00, 0x20, 0x08, 0x70, 0x26, 0x49, 0x08, 0x80, - 0x26, 0x49, 0x08, 0x70, 0x3A, 0xE0, 0xF9, 0xF7, 0x9D, 0xFA, 0x31, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x04, 0xD1, 0x00, 0x22, 0x01, 0x21, 0x2F, 0x48, 0x03, 0xF0, 0x71, 0xF8, 0x03, 0x20, 0x2B, 0x49, - 0x09, 0x68, 0x08, 0x70, 0x02, 0xE0, 0x01, 0x20, 0xFA, 0xF7, 0x42, 0xFA, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x24, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, - 0x01, 0x22, 0xFF, 0x21, 0x9E, 0x31, 0x03, 0x68, 0xA0, 0x20, 0xFD, 0xF7, 0x31, 0xFA, 0x00, 0x28, - 0xE9, 0xD0, 0x00, 0x24, 0x07, 0xE0, 0xFA, 0xF7, 0xED, 0xF9, 0x60, 0x1C, 0x04, 0x46, 0x1E, 0x49, - 0x88, 0x42, 0x00, 0xDD, 0x03, 0xE0, 0xFC, 0xF7, 0x11, 0xFB, 0x35, 0x28, 0xF3, 0xD1, 0x00, 0xBF, - 0x00, 0x20, 0x08, 0x49, 0x08, 0x70, 0x01, 0x20, 0xFA, 0xF7, 0x1A, 0xFA, 0x0B, 0x48, 0x02, 0xF0, - 0x05, 0xF8, 0x05, 0xB0, 0x30, 0xBD, 0x00, 0x00, 0x9D, 0x00, 0x00, 0x20, 0x41, 0x01, 0x00, 0x20, - 0xCC, 0x00, 0x00, 0x20, 0xAB, 0x00, 0x00, 0x20, 0xCA, 0x00, 0x00, 0x20, 0xA8, 0x00, 0x00, 0x20, - 0xC0, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xE0, 0xC2, 0x00, 0x00, 0x20, 0xA0, 0x86, 0x01, 0x00, - 0xC3, 0x00, 0x00, 0x20, 0xA9, 0x00, 0x00, 0x20, 0xB8, 0x0B, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x20, - 0x02, 0x01, 0x00, 0x20, 0x81, 0x03, 0x00, 0x20, 0x9C, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, - 0xAE, 0x00, 0x00, 0x20, 0x21, 0x15, 0x00, 0x00, 0x70, 0x17, 0x00, 0x00, 0x10, 0xB5, 0x00, 0x24, - 0xF9, 0xF7, 0x30, 0xFA, 0xFF, 0x20, 0x80, 0x49, 0x08, 0x70, 0x00, 0xBF, 0x7F, 0x48, 0x00, 0x78, - 0x0E, 0x28, 0x7E, 0xD0, 0xFA, 0xF7, 0x64, 0xFD, 0x01, 0x20, 0x00, 0x05, 0xFB, 0xF7, 0xB4, 0xF9, - 0x59, 0x20, 0x7B, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x79, 0x48, - 0x00, 0x68, 0x80, 0x21, 0x88, 0x43, 0x77, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x21, - 0x88, 0x43, 0x74, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x10, 0x21, 0x88, 0x43, - 0x05, 0x21, 0x09, 0x07, 0x48, 0x63, 0x08, 0x46, 0x40, 0x6B, 0x20, 0x21, 0x88, 0x43, 0x05, 0x21, - 0x09, 0x07, 0x48, 0x63, 0x00, 0x22, 0x04, 0x21, 0x01, 0x20, 0xFA, 0xF7, 0xE1, 0xFC, 0x00, 0x22, - 0x05, 0x21, 0x01, 0x20, 0xFA, 0xF7, 0xDC, 0xFC, 0x67, 0x49, 0x68, 0x48, 0xFA, 0xF7, 0x28, 0xFD, - 0x01, 0x22, 0x04, 0x21, 0x10, 0x46, 0x00, 0x23, 0xFA, 0xF7, 0xC8, 0xFA, 0x5F, 0x48, 0x00, 0x78, - 0x0F, 0x28, 0x21, 0xDA, 0x05, 0x20, 0x00, 0x07, 0x00, 0x6B, 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, - 0x05, 0x21, 0x09, 0x07, 0x08, 0x63, 0x08, 0x46, 0x00, 0x6B, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, - 0x05, 0x21, 0x09, 0x07, 0x08, 0x63, 0x00, 0x22, 0x0A, 0x21, 0x10, 0x46, 0xFA, 0xF7, 0xB8, 0xFC, - 0x00, 0x22, 0x0B, 0x21, 0x10, 0x46, 0xFA, 0xF7, 0xB3, 0xFC, 0x01, 0x22, 0x0B, 0x21, 0x00, 0x20, - 0x03, 0x46, 0xFA, 0xF7, 0xA3, 0xFA, 0x0E, 0xE0, 0x01, 0x21, 0x03, 0x20, 0xFA, 0xF7, 0xE2, 0xFC, - 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, 0xFA, 0xF7, 0xA3, 0xFC, 0x01, 0x22, 0x11, 0x46, 0x03, 0x20, - 0x00, 0x23, 0xFA, 0xF7, 0x93, 0xFA, 0x4A, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x48, 0x49, - 0x08, 0x60, 0x04, 0x20, 0x47, 0x49, 0x08, 0x61, 0x45, 0x48, 0x00, 0x68, 0x20, 0x21, 0x88, 0x43, - 0x00, 0xE0, 0x3A, 0xE0, 0x20, 0x30, 0x42, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0xFF, 0x21, - 0x01, 0x31, 0x88, 0x43, 0x40, 0x18, 0x3E, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, - 0x88, 0x43, 0x80, 0x30, 0x3A, 0x49, 0x08, 0x60, 0x30, 0xBF, 0x36, 0x48, 0x00, 0x68, 0x80, 0x21, - 0x88, 0x43, 0x80, 0x30, 0x33, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, - 0x40, 0x30, 0x30, 0x49, 0x08, 0x60, 0x00, 0x20, 0x2D, 0x49, 0x08, 0x60, 0x0B, 0x21, 0xFA, 0xF7, - 0x3B, 0xFA, 0x04, 0x21, 0x01, 0x20, 0xFA, 0xF7, 0x37, 0xFA, 0xFD, 0xF7, 0x29, 0xFE, 0x02, 0xF0, - 0x19, 0xF9, 0x01, 0x21, 0x03, 0x20, 0xFA, 0xF7, 0x2F, 0xFA, 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, - 0xFA, 0xF7, 0x56, 0xFC, 0xFD, 0xF7, 0x80, 0xFF, 0x00, 0xE0, 0x30, 0xBF, 0x1E, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x07, 0xD0, 0x1C, 0x48, 0x00, 0x78, 0x02, 0x28, 0x03, 0xD0, 0x22, 0x48, 0x00, 0x78, - 0xFF, 0x28, 0x00, 0xD0, 0x2A, 0xE0, 0x02, 0xF0, 0x8D, 0xFE, 0x18, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x04, 0xDD, 0x16, 0x48, 0x04, 0x78, 0x0D, 0x21, 0x4C, 0x43, 0x00, 0xE0, 0x21, 0x24, 0x15, 0xE0, - 0x11, 0x48, 0x00, 0x78, 0xFF, 0x28, 0x03, 0xD1, 0x17, 0x48, 0x00, 0x78, 0xFF, 0x28, 0x00, 0xD0, - 0x0E, 0xE0, 0x00, 0x20, 0x02, 0xF0, 0xA8, 0xFE, 0x01, 0x20, 0x14, 0x49, 0x08, 0x70, 0x00, 0xE0, - 0x30, 0xBF, 0x12, 0x48, 0x00, 0x78, 0x00, 0x28, 0xFA, 0xD1, 0x64, 0x1E, 0x00, 0x2C, 0xE7, 0xDC, - 0x00, 0xBF, 0x05, 0x48, 0x00, 0x78, 0x01, 0x28, 0x00, 0xD0, 0x07, 0xE7, 0x00, 0xBF, 0x02, 0x20, - 0x02, 0xF0, 0x92, 0xFE, 0x10, 0xBD, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x20, 0xD7, 0x00, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, 0xE9, 0x47, 0x00, 0x00, 0xCD, 0xA6, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x50, 0x00, 0xED, 0x00, 0xE0, 0x92, 0x00, 0x00, 0x20, 0xA9, 0x00, 0x00, 0x20, - 0x30, 0xB5, 0x85, 0xB0, 0x00, 0x25, 0x00, 0x24, 0x12, 0xE0, 0x68, 0x00, 0x13, 0x49, 0x08, 0x5A, - 0x02, 0x12, 0x20, 0x46, 0x64, 0x1C, 0x12, 0x49, 0x09, 0x68, 0x0A, 0x54, 0x68, 0x00, 0x0F, 0x49, - 0x08, 0x5A, 0xC2, 0xB2, 0x20, 0x46, 0x64, 0x1C, 0x0D, 0x49, 0x09, 0x68, 0x0A, 0x54, 0x6D, 0x1C, - 0x0C, 0x48, 0x00, 0x78, 0x85, 0x42, 0xE8, 0xDB, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x06, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, 0xA2, 0xB2, 0x06, 0x49, - 0x03, 0x68, 0xA0, 0x20, 0xFD, 0xF7, 0xA4, 0xF8, 0x05, 0xB0, 0x30, 0xBD, 0x90, 0x1A, 0x00, 0x20, - 0xB8, 0x00, 0x00, 0x20, 0x7D, 0x03, 0x00, 0x20, 0xC0, 0x4C, 0x00, 0x00, 0x00, 0xB5, 0x85, 0xB0, - 0x24, 0x48, 0x00, 0x78, 0x05, 0x28, 0x43, 0xDC, 0x23, 0x48, 0x00, 0x78, 0x03, 0x28, 0x02, 0xDD, - 0x05, 0x20, 0x20, 0x49, 0x08, 0x70, 0x1F, 0x48, 0x00, 0x78, 0x04, 0x28, 0x2A, 0xD1, 0x01, 0xF0, - 0x25, 0xF9, 0x00, 0xF0, 0x1F, 0xF9, 0x1D, 0x48, 0x00, 0x88, 0x1E, 0x28, 0x22, 0xDD, 0x64, 0x20, - 0x1B, 0x49, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, - 0x17, 0x49, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xFF, 0x21, 0x9F, 0x31, 0xA0, 0x20, 0x14, 0x4B, - 0xFD, 0xF7, 0x6E, 0xF8, 0x01, 0x20, 0xFA, 0xF7, 0x6B, 0xF8, 0x02, 0xF0, 0x69, 0xFE, 0x0A, 0x20, - 0xFA, 0xF7, 0x66, 0xF8, 0x03, 0x20, 0x0B, 0x49, 0x08, 0x70, 0x0B, 0x48, 0x00, 0x78, 0x40, 0x1C, - 0x09, 0x49, 0x08, 0x70, 0x07, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x06, 0x49, 0x08, 0x70, 0x08, 0x46, - 0x00, 0x78, 0x05, 0x28, 0x01, 0xDD, 0xF9, 0xF7, 0x7B, 0xF9, 0x00, 0x20, 0x05, 0x49, 0x08, 0x70, - 0x05, 0xB0, 0x00, 0xBD, 0xEC, 0x00, 0x00, 0x20, 0xED, 0x00, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, - 0x8C, 0x05, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x11, 0x48, 0x00, 0x78, 0x00, 0x28, 0x1D, 0xD0, - 0x10, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x02, 0xD1, 0x00, 0x20, 0x0D, 0x49, 0x08, 0x70, 0x00, 0x20, - 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x70, - 0x0D, 0x48, 0x0E, 0x49, 0x08, 0x80, 0x00, 0x20, 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, - 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, 0x70, 0x47, 0x00, 0x00, - 0x02, 0x01, 0x00, 0x20, 0x40, 0x01, 0x00, 0x20, 0x06, 0x01, 0x00, 0x20, 0x08, 0x01, 0x00, 0x20, - 0x09, 0x01, 0x00, 0x20, 0x03, 0x01, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x20, - 0xFC, 0x00, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, - 0xFE, 0x00, 0x00, 0x20, 0x00, 0xBF, 0x04, 0x49, 0x89, 0x69, 0x09, 0x02, 0xC9, 0x0F, 0x01, 0x29, - 0xF9, 0xD0, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x15, 0x40, 0xF8, 0xB5, 0x3E, 0x4F, - 0x00, 0x24, 0x04, 0xE0, 0x3D, 0x48, 0x00, 0x5D, 0x38, 0x70, 0x7F, 0x1C, 0x64, 0x1C, 0x3A, 0x48, - 0x10, 0x30, 0x87, 0x42, 0xF6, 0xD3, 0x00, 0x21, 0xC0, 0x38, 0x01, 0x74, 0x00, 0x20, 0x38, 0x49, - 0x08, 0x70, 0x38, 0x49, 0x08, 0x70, 0x38, 0x49, 0x08, 0x70, 0x38, 0x49, 0x08, 0x70, 0x01, 0x20, - 0xFF, 0xF7, 0x16, 0xFA, 0x59, 0x20, 0x36, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, - 0x08, 0x60, 0xF9, 0xF7, 0xFD, 0xFF, 0x00, 0x20, 0x32, 0x49, 0x08, 0x70, 0x69, 0x46, 0x1F, 0x20, - 0x00, 0x03, 0xFA, 0xF7, 0x43, 0xF8, 0x30, 0x49, 0x00, 0x98, 0x88, 0x42, 0x37, 0xD1, 0x26, 0x4F, - 0x8B, 0x3F, 0x2E, 0x4E, 0x0F, 0xE0, 0x69, 0x46, 0x30, 0x46, 0xFA, 0xF7, 0x37, 0xF8, 0x00, 0x25, - 0x05, 0xE0, 0x00, 0x98, 0x78, 0x55, 0x00, 0x98, 0x00, 0x0A, 0x00, 0x90, 0x6D, 0x1C, 0x04, 0x2D, - 0xF7, 0xDB, 0x3F, 0x1D, 0x36, 0x1D, 0x25, 0x48, 0x5A, 0x30, 0x86, 0x42, 0xEB, 0xD9, 0x69, 0x46, - 0x30, 0x46, 0xFA, 0xF7, 0x23, 0xF8, 0x02, 0x26, 0x5C, 0x24, 0x00, 0x25, 0x09, 0xE0, 0x61, 0x19, - 0x65, 0x31, 0x15, 0x4A, 0xF0, 0x3A, 0x00, 0x98, 0x50, 0x54, 0x00, 0x98, 0x00, 0x0A, 0x00, 0x90, - 0x6D, 0x1C, 0xB5, 0x42, 0xF3, 0xD3, 0xF9, 0xF7, 0xB9, 0xFF, 0x00, 0x20, 0x14, 0x49, 0x08, 0x60, - 0x01, 0x20, 0xFF, 0xF7, 0xEB, 0xF9, 0x01, 0x20, 0x12, 0x49, 0x08, 0x70, 0xF8, 0xBD, 0xF9, 0xF7, - 0xAD, 0xFF, 0x00, 0x20, 0x0E, 0x49, 0x08, 0x60, 0x01, 0x20, 0xFF, 0xF7, 0xDF, 0xF9, 0x06, 0x4F, - 0x8B, 0x3F, 0x00, 0x24, 0x04, 0xE0, 0x0E, 0x48, 0x00, 0x5D, 0x38, 0x70, 0x7F, 0x1C, 0x64, 0x1C, - 0x5E, 0x2C, 0xF8, 0xD3, 0xEA, 0xE7, 0x00, 0x00, 0xAC, 0x04, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, - 0x40, 0x01, 0x00, 0x20, 0xAC, 0x00, 0x00, 0x20, 0xAD, 0x00, 0x00, 0x20, 0x9E, 0x00, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x50, 0xB0, 0x00, 0x00, 0x20, 0x21, 0x43, 0x65, 0x87, 0x04, 0xF0, 0x01, 0x00, - 0x2D, 0x00, 0x00, 0x20, 0xFC, 0xB5, 0x50, 0x4D, 0x00, 0x24, 0x2C, 0x87, 0x4F, 0x4E, 0x00, 0x94, - 0xF0, 0x7A, 0x40, 0x07, 0x11, 0xD5, 0x01, 0x94, 0x08, 0xE0, 0x00, 0x22, 0x01, 0xA9, 0x68, 0x46, - 0x00, 0xF0, 0xB0, 0xFD, 0x6B, 0x46, 0x18, 0x79, 0x40, 0x1C, 0x01, 0x90, 0x6B, 0x46, 0x04, 0x20, - 0x18, 0x56, 0xA9, 0x7A, 0x88, 0x42, 0xF0, 0xDB, 0x0F, 0xE0, 0xA8, 0x7A, 0x06, 0xE0, 0x00, 0x22, - 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, 0x9E, 0xFD, 0x6B, 0x46, 0x18, 0x79, 0x6B, 0x46, 0x40, 0x1E, - 0x01, 0x90, 0x04, 0x20, 0x18, 0x56, 0x00, 0x28, 0xF1, 0xDA, 0xF0, 0x7A, 0x00, 0x07, 0x11, 0xD5, - 0x01, 0x94, 0x08, 0xE0, 0x01, 0x22, 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, 0x8B, 0xFD, 0x6B, 0x46, - 0x18, 0x79, 0x40, 0x1C, 0x01, 0x90, 0x6B, 0x46, 0x04, 0x20, 0x18, 0x56, 0x69, 0x7B, 0x88, 0x42, - 0xF0, 0xDB, 0x0F, 0xE0, 0x68, 0x7B, 0x06, 0xE0, 0x01, 0x22, 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, - 0x79, 0xFD, 0x6B, 0x46, 0x18, 0x79, 0x6B, 0x46, 0x40, 0x1E, 0x01, 0x90, 0x04, 0x20, 0x18, 0x56, - 0x00, 0x28, 0xF1, 0xDA, 0x28, 0x49, 0x28, 0x7A, 0x80, 0x31, 0xCA, 0x28, 0x01, 0xD0, 0xC9, 0x28, - 0x32, 0xD1, 0x01, 0x22, 0x52, 0x02, 0x23, 0x27, 0x7F, 0x01, 0x06, 0xE0, 0x0B, 0x69, 0x40, 0x00, - 0x1A, 0x52, 0x6B, 0x46, 0x18, 0x88, 0x40, 0x1C, 0x00, 0x90, 0x6B, 0x46, 0x18, 0x88, 0xB8, 0x42, - 0xF4, 0xD3, 0xF0, 0x7A, 0xC0, 0x09, 0x01, 0xD0, 0x20, 0x20, 0x00, 0xE0, 0x1C, 0x20, 0xAA, 0x7C, - 0x00, 0x92, 0x2A, 0x7A, 0x1A, 0x4E, 0xCA, 0x2A, 0x01, 0x94, 0x16, 0xD1, 0x19, 0x4C, 0x0D, 0xE0, - 0x6B, 0x46, 0x1B, 0x88, 0x52, 0x00, 0x0D, 0x69, 0xA2, 0x5A, 0x5B, 0x00, 0xEA, 0x52, 0x6B, 0x46, - 0x1A, 0x88, 0x12, 0x18, 0x00, 0x92, 0x1A, 0x79, 0x52, 0x1C, 0x01, 0x92, 0x6B, 0x46, 0x04, 0x22, - 0x9A, 0x56, 0x33, 0x78, 0x9A, 0x42, 0xEB, 0xDB, 0xFC, 0xBD, 0x0F, 0x4C, 0x0D, 0xE0, 0x6B, 0x46, - 0x1B, 0x88, 0x52, 0x00, 0x0D, 0x69, 0xA2, 0x5A, 0x5B, 0x00, 0xEA, 0x52, 0x6B, 0x46, 0x1A, 0x88, - 0x12, 0x18, 0x00, 0x92, 0x1A, 0x79, 0x52, 0x1C, 0x01, 0x92, 0x6B, 0x46, 0x04, 0x22, 0x9A, 0x56, - 0x33, 0x78, 0x9A, 0x42, 0xEB, 0xDB, 0xFC, 0xBD, 0x38, 0x01, 0x00, 0x20, 0x1C, 0x04, 0x00, 0x20, - 0x7D, 0x03, 0x00, 0x20, 0xA0, 0x1A, 0x00, 0x20, 0x80, 0x1A, 0x00, 0x20, 0xF0, 0xB5, 0x89, 0xB0, - 0x59, 0x48, 0x00, 0x88, 0x40, 0x04, 0x00, 0x0C, 0x07, 0x90, 0x58, 0x48, 0x00, 0x88, 0x40, 0x04, - 0x00, 0x0C, 0x06, 0x90, 0x06, 0x99, 0x07, 0x98, 0x88, 0x42, 0x01, 0xDD, 0x07, 0x98, 0x00, 0xE0, - 0x06, 0x98, 0x80, 0xB2, 0x05, 0x90, 0x01, 0x20, 0x51, 0x49, 0x08, 0x70, 0x51, 0x48, 0x07, 0x68, - 0x23, 0x20, 0x40, 0x01, 0x38, 0x18, 0x08, 0x90, 0x95, 0xE0, 0x4F, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x04, 0xD0, 0x00, 0x20, 0x4C, 0x49, 0x08, 0x70, 0xFD, 0xF7, 0xF0, 0xFB, 0x4B, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x07, 0xD0, 0x00, 0x20, 0x46, 0x49, 0x08, 0x70, 0x03, 0x20, 0x03, 0xF0, 0x80, 0xF8, - 0x09, 0xB0, 0xF0, 0xBD, 0x02, 0xF0, 0x84, 0xFC, 0x00, 0xBF, 0xFB, 0xF7, 0x6F, 0xFF, 0x35, 0x28, - 0xFB, 0xD1, 0x00, 0x24, 0x04, 0xE0, 0x00, 0x20, 0x41, 0x49, 0x09, 0x68, 0x08, 0x55, 0x64, 0x1C, - 0x10, 0x2C, 0xF8, 0xDB, 0x03, 0x22, 0x3E, 0x48, 0x01, 0x68, 0x3E, 0x48, 0x00, 0x68, 0x02, 0xAB, - 0x07, 0xC3, 0x3D, 0x48, 0x00, 0x78, 0x42, 0x00, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, - 0x3A, 0x49, 0xA0, 0x20, 0x00, 0x23, 0xFC, 0xF7, 0x63, 0xFE, 0x35, 0x48, 0x01, 0x68, 0x01, 0x20, - 0xFB, 0xF7, 0x80, 0xFE, 0x03, 0x22, 0x08, 0x99, 0x02, 0x97, 0x04, 0x92, 0x03, 0x91, 0x00, 0x21, - 0x05, 0x9A, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x31, 0x49, 0xA0, 0x20, 0x00, 0x23, 0xFC, 0xF7, - 0x4F, 0xFE, 0x00, 0x25, 0x00, 0x24, 0x0D, 0xE0, 0x38, 0x5D, 0x06, 0x02, 0x60, 0x1C, 0x38, 0x5C, - 0x80, 0x19, 0x86, 0xB2, 0x32, 0xB2, 0x28, 0x46, 0x6D, 0x1C, 0x40, 0x00, 0x29, 0x49, 0x09, 0x68, - 0x0A, 0x52, 0xA4, 0x1C, 0x07, 0x98, 0x84, 0x42, 0xEE, 0xDB, 0x00, 0x24, 0x0F, 0xE0, 0x08, 0x98, - 0x00, 0x5D, 0x06, 0x02, 0x60, 0x1C, 0x08, 0x99, 0x08, 0x5C, 0x80, 0x19, 0x86, 0xB2, 0x32, 0xB2, - 0x28, 0x46, 0x6D, 0x1C, 0x40, 0x00, 0x1F, 0x49, 0x09, 0x68, 0x0A, 0x52, 0xA4, 0x1C, 0x06, 0x98, - 0x84, 0x42, 0xEC, 0xDB, 0x00, 0x20, 0x1C, 0x49, 0x08, 0x70, 0xFF, 0xF7, 0xBB, 0xFE, 0xFD, 0xF7, - 0x39, 0xFC, 0x01, 0x20, 0x19, 0x49, 0x08, 0x70, 0x00, 0xF0, 0x08, 0xFE, 0x00, 0x24, 0x0D, 0xE0, - 0x02, 0xF0, 0x90, 0xFB, 0x16, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, 0xF9, 0xF7, 0xE6, 0xFD, - 0x64, 0x1C, 0x7D, 0x20, 0xC0, 0x00, 0x84, 0x42, 0x00, 0xDD, 0x03, 0xE0, 0x0F, 0x48, 0x00, 0x78, - 0x00, 0x28, 0xED, 0xD1, 0x00, 0xBF, 0x68, 0xE7, 0x82, 0x01, 0x00, 0x20, 0x1C, 0x02, 0x00, 0x20, - 0x9E, 0x00, 0x00, 0x20, 0xC8, 0x01, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x20, 0xA6, 0x00, 0x00, 0x20, - 0xB8, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0x7D, 0x03, 0x00, 0x20, 0xD0, 0x4C, 0x00, 0x00, - 0x30, 0x46, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x20, 0x12, 0x02, 0x00, 0x20, 0x9D, 0x00, 0x00, 0x20, - 0x9C, 0x00, 0x00, 0x20, 0xF8, 0xB5, 0x25, 0x48, 0x07, 0x68, 0x25, 0x4E, 0x02, 0xF0, 0x30, 0xFB, - 0x59, 0x20, 0x24, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xF9, 0xF7, - 0xFF, 0xFD, 0x69, 0x46, 0x7D, 0x20, 0x80, 0x02, 0xF9, 0xF7, 0x48, 0xFE, 0x1E, 0x49, 0x00, 0x98, - 0x08, 0x60, 0x00, 0x25, 0x1D, 0x4C, 0x11, 0xE0, 0x69, 0x46, 0x20, 0x46, 0xF9, 0xF7, 0x3E, 0xFE, - 0x00, 0x98, 0x38, 0x80, 0x38, 0x88, 0x45, 0x19, 0xBF, 0x1C, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x90, - 0x00, 0x98, 0x2D, 0x18, 0x00, 0x98, 0x38, 0x80, 0xBF, 0x1C, 0x24, 0x1D, 0x7D, 0x20, 0x80, 0x02, - 0x30, 0x18, 0xA0, 0x42, 0xE8, 0xD8, 0x10, 0x48, 0x00, 0x68, 0x64, 0x28, 0x0C, 0xDB, 0x69, 0x46, - 0x20, 0x46, 0xF9, 0xF7, 0x23, 0xFE, 0x00, 0x98, 0x85, 0x42, 0x03, 0xD1, 0x01, 0x20, 0x0C, 0x49, - 0x08, 0x70, 0x01, 0xE0, 0xF8, 0xF7, 0x8E, 0xFD, 0xF9, 0xF7, 0xC0, 0xFD, 0x00, 0x20, 0x05, 0x49, - 0x08, 0x60, 0x02, 0x20, 0x02, 0xF0, 0x48, 0xFB, 0xF8, 0xBD, 0x00, 0x00, 0xC4, 0x01, 0x00, 0x20, - 0xC4, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x10, 0x01, 0x00, 0x20, 0x04, 0xF4, 0x01, 0x00, - 0x0A, 0x01, 0x00, 0x20, 0x10, 0xB5, 0xFC, 0xF7, 0x43, 0xFB, 0x17, 0x49, 0x08, 0x70, 0x08, 0x46, - 0x00, 0x78, 0x01, 0x28, 0x03, 0xD1, 0x02, 0x20, 0x02, 0xF0, 0x7A, 0xFF, 0x22, 0xE0, 0x12, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x1E, 0xD1, 0x11, 0x48, 0x00, 0x78, 0x00, 0x28, 0x05, 0xD0, 0x00, 0x20, - 0x0E, 0x49, 0x08, 0x70, 0x01, 0x20, 0x0E, 0x49, 0x08, 0x70, 0x01, 0x22, 0x0D, 0x48, 0x01, 0x68, - 0x0D, 0x48, 0x00, 0x68, 0xF9, 0xF7, 0x3A, 0xFC, 0x0C, 0x48, 0x00, 0x78, 0x0C, 0x4A, 0x12, 0x78, - 0x50, 0x43, 0x40, 0x00, 0x07, 0x4A, 0x12, 0x68, 0x81, 0x18, 0x02, 0x22, 0x09, 0x48, 0x00, 0x68, - 0xF9, 0xF7, 0x2C, 0xFC, 0x10, 0xBD, 0x00, 0x00, 0x12, 0x02, 0x00, 0x20, 0xAC, 0x00, 0x00, 0x20, - 0xAD, 0x00, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0x4A, 0x01, 0x00, 0x20, - 0x42, 0x01, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x2C, 0x48, 0x05, 0x68, 0x00, 0x68, - 0x23, 0x21, 0x49, 0x01, 0x46, 0x18, 0x2A, 0x48, 0x2A, 0x49, 0x08, 0x80, 0x40, 0x42, 0x2A, 0x49, - 0x08, 0x80, 0x00, 0x24, 0x0A, 0xE0, 0x29, 0x48, 0x03, 0x78, 0x32, 0x46, 0x28, 0x48, 0x01, 0x78, - 0x28, 0x46, 0x01, 0xF0, 0x49, 0xFA, 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x25, 0x48, 0x00, 0x78, - 0x84, 0x42, 0xF0, 0xDB, 0x24, 0x48, 0x00, 0x78, 0x00, 0x28, 0x10, 0xD0, 0x00, 0x24, 0x0A, 0xE0, - 0x22, 0x48, 0x03, 0x78, 0x32, 0x46, 0x20, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, 0x34, 0xFA, - 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x1B, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, 0x00, 0x24, - 0x0A, 0xE0, 0x16, 0x48, 0x03, 0x78, 0x32, 0x46, 0x15, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, - 0x23, 0xFA, 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x15, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, - 0x11, 0x48, 0x00, 0x78, 0x00, 0x28, 0x10, 0xD0, 0x00, 0x24, 0x0A, 0xE0, 0x0F, 0x48, 0x03, 0x78, - 0x32, 0x46, 0x0D, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, 0x0E, 0xFA, 0x14, 0x35, 0x14, 0x36, - 0x64, 0x1C, 0x0B, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, 0x70, 0xBD, 0xC8, 0x01, 0x00, 0x20, - 0x18, 0xFC, 0xFF, 0xFF, 0x8A, 0x01, 0x00, 0x20, 0x88, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, - 0x43, 0x01, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, - 0x49, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, 0x23, 0x46, 0x02, 0xF0, 0x13, 0xFB, - 0x05, 0x04, 0x07, 0x0C, 0x11, 0x14, 0x17, 0x00, 0x01, 0xF0, 0x02, 0xFE, 0x10, 0xE0, 0x01, 0xF0, - 0x7D, 0xFE, 0xFF, 0xF7, 0x89, 0xFC, 0x0B, 0xE0, 0xFF, 0xF7, 0x30, 0xFC, 0x02, 0xF0, 0xBE, 0xF9, - 0x06, 0xE0, 0x00, 0xF0, 0x6F, 0xFC, 0x03, 0xE0, 0xF8, 0xF7, 0xAC, 0xFC, 0x00, 0xE0, 0x00, 0xBF, - 0x00, 0xBF, 0x28, 0x46, 0x70, 0xBD, 0x00, 0x00, 0x10, 0xB5, 0xFD, 0xF7, 0x15, 0xFB, 0x90, 0x48, - 0x40, 0x79, 0x80, 0x07, 0x80, 0x0F, 0x8F, 0x49, 0x08, 0x70, 0x8D, 0x48, 0x40, 0x1D, 0xC0, 0x79, - 0xC0, 0x06, 0x80, 0x0F, 0x24, 0xD1, 0x8A, 0x48, 0x40, 0x1D, 0x40, 0x78, 0x8A, 0x49, 0x08, 0x80, - 0x08, 0x46, 0x00, 0x88, 0x00, 0x02, 0x00, 0xB2, 0x08, 0x80, 0x85, 0x48, 0x40, 0x1D, 0x80, 0x78, - 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x84, 0x49, 0x08, 0x80, 0x81, 0x48, 0x40, 0x1D, 0xC0, 0x78, - 0x82, 0x49, 0x08, 0x80, 0x08, 0x46, 0x00, 0x88, 0x00, 0x02, 0x00, 0xB2, 0x08, 0x80, 0x7C, 0x48, - 0x40, 0x1D, 0x00, 0x79, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x7C, 0x49, 0x08, 0x80, 0x23, 0xE0, - 0x77, 0x48, 0x40, 0x1D, 0x80, 0x78, 0x78, 0x49, 0x08, 0x80, 0x08, 0x46, 0x00, 0x88, 0x00, 0x02, - 0x00, 0xB2, 0x08, 0x80, 0x72, 0x48, 0x40, 0x1D, 0x40, 0x78, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, - 0x71, 0x49, 0x08, 0x80, 0x6E, 0x48, 0x40, 0x1D, 0x00, 0x79, 0x70, 0x49, 0x08, 0x80, 0x08, 0x46, - 0x00, 0x88, 0x00, 0x02, 0x00, 0xB2, 0x08, 0x80, 0x69, 0x48, 0x40, 0x1D, 0xC0, 0x78, 0x09, 0x88, - 0x40, 0x18, 0x00, 0xB2, 0x69, 0x49, 0x08, 0x80, 0x0A, 0x20, 0x69, 0x49, 0x08, 0x70, 0x64, 0x48, - 0x40, 0x1D, 0x40, 0x79, 0x0A, 0x28, 0x05, 0xDC, 0x61, 0x48, 0x40, 0x1D, 0x40, 0x79, 0x00, 0x07, - 0x00, 0x0F, 0x08, 0x70, 0x5E, 0x48, 0x40, 0x1D, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, - 0x15, 0xD1, 0x5B, 0x48, 0x40, 0x1D, 0x81, 0x78, 0x5B, 0x30, 0xC1, 0x70, 0x5B, 0x38, 0x41, 0x78, - 0x5B, 0x30, 0x01, 0x71, 0x5B, 0x38, 0x01, 0x79, 0x5B, 0x30, 0x41, 0x71, 0x5B, 0x38, 0xC1, 0x78, - 0x5B, 0x30, 0x81, 0x71, 0x56, 0x48, 0x01, 0x78, 0x51, 0x48, 0x60, 0x30, 0x01, 0x73, 0x50, 0x49, - 0x49, 0x1D, 0xC9, 0x79, 0x48, 0x07, 0x40, 0x0F, 0x52, 0x49, 0x09, 0x78, 0xC9, 0x08, 0xC9, 0x00, - 0x01, 0x43, 0x50, 0x4A, 0x11, 0x70, 0x4A, 0x48, 0x40, 0x1D, 0xC0, 0x7A, 0x00, 0x07, 0x00, 0x0F, - 0x4D, 0x49, 0x08, 0x70, 0x46, 0x48, 0x40, 0x1D, 0x00, 0x7B, 0x4C, 0x49, 0x08, 0x70, 0x44, 0x48, - 0x40, 0x1D, 0x40, 0x7B, 0x4A, 0x49, 0x08, 0x70, 0xFA, 0xF7, 0x58, 0xFA, 0x40, 0x48, 0x25, 0x30, - 0x00, 0x7F, 0x48, 0x49, 0x08, 0x70, 0x3E, 0x48, 0x25, 0x30, 0x40, 0x7F, 0x46, 0x49, 0x08, 0x70, - 0x01, 0x20, 0xFE, 0xF7, 0x45, 0xFE, 0x59, 0x20, 0x44, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, - 0x88, 0x20, 0x08, 0x60, 0x42, 0x49, 0x09, 0x78, 0x42, 0x4A, 0x51, 0x43, 0x08, 0x46, 0xFA, 0xF7, - 0x73, 0xF9, 0x00, 0x20, 0x3D, 0x49, 0x08, 0x60, 0x01, 0x20, 0xFE, 0xF7, 0x4F, 0xFE, 0x02, 0x20, - 0xF9, 0xF7, 0xF6, 0xFB, 0x01, 0xF0, 0xDE, 0xFB, 0x2D, 0x48, 0x45, 0x30, 0x40, 0x7F, 0x00, 0x06, - 0x00, 0x0F, 0x40, 0x00, 0x80, 0x1D, 0x38, 0x49, 0x08, 0x70, 0x08, 0x46, 0x00, 0x78, 0x24, 0x28, - 0x01, 0xDD, 0x24, 0x20, 0x08, 0x70, 0x34, 0x49, 0x09, 0x78, 0x34, 0x4A, 0x51, 0x43, 0x08, 0x46, - 0x06, 0x21, 0xF7, 0xF7, 0xF3, 0xF9, 0x32, 0x49, 0x08, 0x60, 0x2F, 0x49, 0x09, 0x78, 0x19, 0x22, - 0xD2, 0x02, 0x51, 0x43, 0x08, 0x46, 0x06, 0x21, 0xF7, 0xF7, 0xE8, 0xF9, 0x2D, 0x49, 0x08, 0x60, - 0xFD, 0xF7, 0x40, 0xFB, 0x2C, 0x48, 0x2D, 0x49, 0x08, 0x60, 0x2D, 0x48, 0x2D, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x2C, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x2B, 0x49, 0x08, 0x60, - 0x2B, 0x49, 0x09, 0x78, 0x2B, 0x4A, 0x12, 0x78, 0x51, 0x43, 0x08, 0x46, 0xC9, 0x0F, 0x09, 0x18, - 0x49, 0x10, 0x25, 0x4A, 0x12, 0x68, 0x89, 0x18, 0x14, 0x31, 0x27, 0x4A, 0x11, 0x60, 0x1F, 0x48, - 0x00, 0x68, 0x26, 0x49, 0x08, 0x60, 0x00, 0x20, 0x25, 0x49, 0x08, 0x80, 0x25, 0x49, 0x08, 0x80, - 0x25, 0x49, 0x08, 0x70, 0x03, 0x20, 0x25, 0x49, 0x08, 0x70, 0x05, 0x48, 0x40, 0x1D, 0x40, 0x7A, - 0x00, 0x07, 0x00, 0x0F, 0x22, 0x49, 0x08, 0x70, 0x05, 0x20, 0x22, 0x49, 0x08, 0x70, 0x10, 0xBD, - 0x1C, 0x04, 0x00, 0x20, 0x52, 0x01, 0x00, 0x20, 0x94, 0x00, 0x00, 0x20, 0x96, 0x00, 0x00, 0x20, - 0x1E, 0x02, 0x00, 0x20, 0xD6, 0x00, 0x00, 0x20, 0x4F, 0x01, 0x00, 0x20, 0x3C, 0x01, 0x00, 0x20, - 0x50, 0x01, 0x00, 0x20, 0x4D, 0x01, 0x00, 0x20, 0x4C, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, - 0xC2, 0x00, 0x00, 0x20, 0x40, 0x42, 0x0F, 0x00, 0xC3, 0x00, 0x00, 0x20, 0x80, 0xDE, 0x0F, 0x00, - 0xB8, 0x01, 0x00, 0x20, 0xBC, 0x01, 0x00, 0x20, 0x48, 0x07, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, - 0x20, 0x11, 0x00, 0x20, 0xC8, 0x01, 0x00, 0x20, 0xCC, 0x01, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, - 0x4A, 0x01, 0x00, 0x20, 0x4B, 0x01, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x20, - 0xB0, 0x01, 0x00, 0x20, 0xB2, 0x01, 0x00, 0x20, 0x58, 0x01, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, - 0xD7, 0x00, 0x00, 0x20, 0xDD, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x11, 0x49, 0x00, 0x28, 0x05, 0xD1, - 0x0B, 0x7C, 0x08, 0x22, 0x00, 0x2B, 0x07, 0xD0, 0x0A, 0x7C, 0x15, 0xE0, 0x08, 0x7C, 0x08, 0x22, - 0x00, 0x28, 0x13, 0xD0, 0x08, 0x7C, 0x0F, 0xE0, 0x09, 0x49, 0xA0, 0x39, 0x09, 0x18, 0xA0, 0x31, - 0x0B, 0x79, 0x00, 0x2B, 0x0A, 0xD0, 0x09, 0x79, 0xFF, 0x23, 0x01, 0x33, 0x59, 0x1A, 0x44, 0x00, - 0x04, 0x4B, 0x40, 0x1C, 0x19, 0x53, 0xC0, 0xB2, 0x90, 0x42, 0xED, 0xD3, 0x10, 0xBD, 0x00, 0x00, - 0x5C, 0x04, 0x00, 0x20, 0xD2, 0x06, 0x00, 0x20, 0xFC, 0xB5, 0xBA, 0x48, 0x07, 0x68, 0x00, 0x68, - 0x23, 0x21, 0x49, 0x01, 0x40, 0x18, 0x00, 0x90, 0x00, 0xF0, 0x92, 0xFA, 0xB6, 0x48, 0x06, 0x78, - 0x00, 0x25, 0x00, 0x24, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, - 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0xB1, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0xAD, 0x4A, 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, - 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0xAA, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, - 0x00, 0xB2, 0x61, 0x00, 0xA6, 0x4A, 0x50, 0x52, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, - 0x0B, 0xDD, 0x60, 0x00, 0xA1, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0x9D, 0x4A, 0x50, 0x52, 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, - 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x99, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, - 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x95, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, - 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x91, 0x48, 0x00, 0x78, - 0x84, 0x42, 0xB0, 0xDB, 0x90, 0x48, 0x00, 0x78, 0x00, 0x28, 0x50, 0xD0, 0x00, 0x24, 0x4A, 0xE0, - 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, - 0x86, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x83, 0x4A, - 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, - 0x7F, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x7C, 0x4A, - 0x50, 0x52, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, 0x0B, 0xDD, 0x60, 0x00, 0x77, 0x49, - 0x09, 0x5A, 0x6A, 0x00, 0x00, 0x98, 0x80, 0x5A, 0x08, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x73, 0x4A, - 0x50, 0x52, 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, - 0x60, 0x00, 0x6F, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, - 0x61, 0x00, 0x6B, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, - 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x67, 0x48, 0x00, 0x78, 0x84, 0x42, 0xB0, 0xDB, 0x65, 0x48, - 0x04, 0x78, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0xB0, 0x42, - 0x0A, 0xDD, 0x60, 0x00, 0x5D, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, 0x00, 0xB2, - 0x61, 0x00, 0x5A, 0x4A, 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, 0x88, 0x42, - 0x09, 0xDA, 0x60, 0x00, 0x56, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, 0x00, 0xB2, - 0x61, 0x00, 0x53, 0x4A, 0x50, 0x52, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, 0x0B, 0xDD, - 0x60, 0x00, 0x4E, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x18, 0x00, 0xB2, - 0x61, 0x00, 0x4A, 0x4A, 0x50, 0x52, 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0x71, 0x42, - 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x46, 0x49, 0x08, 0x5A, 0x6A, 0x00, 0x00, 0x99, 0x89, 0x5A, - 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x42, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, 0x01, 0x90, - 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x3E, 0x48, 0x00, 0x78, 0x3F, 0x49, - 0x09, 0x78, 0x40, 0x18, 0xA0, 0x42, 0xAD, 0xDC, 0x3B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x54, 0xD0, - 0x38, 0x48, 0x04, 0x78, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, - 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0x31, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0x2D, 0x4A, 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, - 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0x2A, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, - 0x00, 0xB2, 0x61, 0x00, 0x26, 0x4A, 0x50, 0x52, 0x69, 0x00, 0x00, 0x98, 0x40, 0x5E, 0xB0, 0x42, - 0x0B, 0xDD, 0x60, 0x00, 0x21, 0x49, 0x09, 0x5A, 0x6A, 0x00, 0x00, 0x98, 0x80, 0x5A, 0x08, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0x1D, 0x4A, 0x50, 0x52, 0x10, 0xE0, 0x69, 0x00, 0x00, 0x98, 0x40, 0x5E, - 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x19, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, - 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x15, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, - 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x11, 0x48, 0x00, 0x78, - 0x12, 0x49, 0x09, 0x78, 0x40, 0x18, 0xA0, 0x42, 0xAD, 0xDC, 0x00, 0x24, 0x0F, 0xE0, 0x60, 0x00, - 0x0A, 0x49, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDC, 0x60, 0x00, 0x09, 0x49, 0x08, 0x5E, 0x00, 0x28, - 0x04, 0xDD, 0x0B, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x09, 0x49, 0x08, 0x70, 0x64, 0x1C, 0x20, 0x2C, - 0xED, 0xDB, 0xFC, 0xBD, 0xC8, 0x01, 0x00, 0x20, 0x4D, 0x01, 0x00, 0x20, 0x0C, 0x05, 0x00, 0x20, - 0x4C, 0x05, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x49, 0x01, 0x00, 0x20, - 0xE0, 0x00, 0x00, 0x20, 0xF7, 0xB5, 0x87, 0xB0, 0x7A, 0x4B, 0x06, 0x93, 0xDC, 0x7A, 0x00, 0x22, - 0x79, 0x4B, 0xE5, 0x09, 0x5E, 0x89, 0xDC, 0x88, 0x1F, 0x89, 0x05, 0x96, 0x5E, 0x88, 0x04, 0x94, - 0x9C, 0x88, 0x03, 0x97, 0x75, 0x4F, 0x02, 0x94, 0xBF, 0x68, 0x8C, 0x56, 0x01, 0x97, 0x7E, 0xD1, - 0xE1, 0x03, 0x0F, 0x0C, 0x19, 0x46, 0x40, 0x39, 0x4D, 0x8F, 0x89, 0x8F, 0xB6, 0x46, 0x8C, 0x46, - 0x09, 0x99, 0x02, 0x9E, 0x01, 0x29, 0x0A, 0xD1, 0x05, 0x99, 0x03, 0x9E, 0x79, 0x18, 0x8F, 0xB2, - 0x19, 0x46, 0x40, 0x39, 0xCD, 0x8F, 0x19, 0x88, 0x04, 0x9B, 0x8C, 0x46, 0x9E, 0x46, 0x06, 0x99, - 0xC9, 0x7A, 0xC9, 0x06, 0x02, 0xD5, 0x00, 0x21, 0x8E, 0x46, 0x00, 0xE0, 0x00, 0x26, 0x62, 0x49, - 0x40, 0x39, 0x0B, 0x7B, 0xC9, 0x7B, 0xE4, 0x07, 0x05, 0xD1, 0x5F, 0x49, 0x40, 0x39, 0xCB, 0x7A, - 0x89, 0x7B, 0x00, 0x25, 0xAC, 0x46, 0x09, 0x9C, 0x01, 0x2C, 0x00, 0xD1, 0x0B, 0x46, 0x01, 0x9C, - 0x79, 0x00, 0x0C, 0x19, 0x00, 0x21, 0x75, 0x19, 0x00, 0x95, 0x10, 0xE0, 0x0D, 0x46, 0x00, 0x9E, - 0x5D, 0x43, 0xAD, 0x19, 0x6D, 0x00, 0x67, 0x5B, 0x05, 0x88, 0x52, 0x1C, 0x6E, 0x1C, 0x06, 0x80, - 0x52, 0x4E, 0x49, 0x1C, 0x36, 0x69, 0x6D, 0x00, 0x92, 0xB2, 0xC9, 0xB2, 0x77, 0x53, 0x4E, 0x4D, - 0x40, 0x3D, 0x2E, 0x7C, 0xB1, 0x42, 0xE9, 0xD3, 0x66, 0x46, 0x76, 0x44, 0x00, 0x21, 0xB4, 0x46, - 0x0F, 0xE0, 0x0D, 0x46, 0x5D, 0x43, 0x65, 0x44, 0x6D, 0x00, 0x67, 0x5B, 0x05, 0x88, 0x52, 0x1C, - 0x6E, 0x1C, 0x06, 0x80, 0x45, 0x4E, 0x49, 0x1C, 0x36, 0x69, 0x6D, 0x00, 0x92, 0xB2, 0xC9, 0xB2, - 0x77, 0x53, 0x41, 0x4D, 0x40, 0x3D, 0x6D, 0x7C, 0xA9, 0x42, 0xEA, 0xD3, 0x3E, 0x49, 0x40, 0x39, - 0x09, 0x7A, 0xCA, 0x29, 0x01, 0xD0, 0xC9, 0x29, 0x0F, 0xD1, 0x01, 0x24, 0xD1, 0xB2, 0x3B, 0x4D, - 0x64, 0x02, 0x08, 0xE0, 0x0B, 0xE0, 0x02, 0x88, 0x53, 0x1C, 0x03, 0x80, 0x49, 0x1C, 0x2B, 0x69, - 0x52, 0x00, 0xC9, 0xB2, 0x9C, 0x52, 0x1C, 0x29, 0xF5, 0xD3, 0x0A, 0xB0, 0xF0, 0xBD, 0x32, 0x4F, - 0xB6, 0x46, 0x40, 0x3F, 0x09, 0x9E, 0xBB, 0x7A, 0x02, 0x9D, 0xA1, 0xB2, 0x01, 0x2E, 0x06, 0xD1, - 0x05, 0x99, 0x7B, 0x7B, 0x61, 0x18, 0x04, 0x9C, 0x03, 0x9D, 0x89, 0xB2, 0xA6, 0x46, 0x06, 0x9C, - 0xE4, 0x7A, 0xE4, 0x06, 0x02, 0xD5, 0x00, 0x24, 0xA6, 0x46, 0x00, 0xE0, 0x00, 0x25, 0x01, 0x9C, - 0x49, 0x00, 0x09, 0x19, 0x8C, 0x46, 0x00, 0x21, 0x10, 0xE0, 0x0C, 0x46, 0x5C, 0x43, 0x64, 0x19, - 0x66, 0x46, 0x64, 0x00, 0x37, 0x5B, 0x04, 0x88, 0x52, 0x1C, 0x66, 0x1C, 0x06, 0x80, 0x1F, 0x4E, - 0x49, 0x1C, 0x36, 0x69, 0x64, 0x00, 0x92, 0xB2, 0xC9, 0xB2, 0x37, 0x53, 0x1A, 0x4C, 0x40, 0x3C, - 0x26, 0x7C, 0xB1, 0x42, 0xE9, 0xD3, 0x00, 0x21, 0x18, 0x4F, 0x0F, 0xE0, 0x0C, 0x46, 0x5C, 0x43, - 0x74, 0x44, 0x66, 0x46, 0x64, 0x00, 0x36, 0x5B, 0x04, 0x88, 0x52, 0x1C, 0x65, 0x1C, 0x05, 0x80, - 0x49, 0x1C, 0x3D, 0x69, 0x64, 0x00, 0x92, 0xB2, 0xC9, 0xB2, 0x2E, 0x53, 0x0E, 0x4C, 0x40, 0x3C, - 0x64, 0x7C, 0xA1, 0x42, 0xEA, 0xD3, 0x0C, 0x49, 0x40, 0x39, 0x09, 0x7A, 0xCA, 0x29, 0x01, 0xD0, - 0xC9, 0x29, 0xAA, 0xD1, 0x01, 0x23, 0xD1, 0xB2, 0x5B, 0x02, 0x07, 0xE0, 0x02, 0x88, 0x54, 0x1C, - 0x04, 0x80, 0x49, 0x1C, 0x3C, 0x69, 0x52, 0x00, 0xC9, 0xB2, 0xA3, 0x52, 0x20, 0x29, 0xF5, 0xD3, - 0x9B, 0xE7, 0x00, 0x00, 0x1C, 0x04, 0x00, 0x20, 0x78, 0x01, 0x00, 0x20, 0xB8, 0x01, 0x00, 0x20, - 0x00, 0xBF, 0x0A, 0x49, 0x89, 0x69, 0x09, 0x02, 0xC9, 0x0F, 0x01, 0x29, 0xF9, 0xD0, 0x07, 0x49, - 0x08, 0x60, 0x0A, 0x28, 0x09, 0xD1, 0x00, 0xBF, 0x04, 0x49, 0x89, 0x69, 0x09, 0x02, 0xC9, 0x0F, - 0x01, 0x29, 0xF9, 0xD0, 0x0D, 0x21, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x15, 0x40, - 0x00, 0x20, 0x07, 0xE0, 0x00, 0x21, 0x42, 0x00, 0x05, 0x4B, 0x99, 0x52, 0x42, 0x00, 0x05, 0x4B, - 0x99, 0x52, 0x40, 0x1C, 0x20, 0x28, 0xF5, 0xDB, 0x00, 0x21, 0x03, 0x4A, 0x11, 0x70, 0x70, 0x47, - 0x0C, 0x05, 0x00, 0x20, 0x4C, 0x05, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x8E, 0x46, - 0x0F, 0x49, 0x94, 0x46, 0x8A, 0x7C, 0x0D, 0x46, 0x92, 0x1C, 0x40, 0x35, 0x42, 0x43, 0xAA, 0x82, - 0x01, 0x26, 0x0A, 0x46, 0x80, 0x32, 0x10, 0xE0, 0x64, 0x46, 0x05, 0xE0, 0x14, 0x27, 0xEF, 0x5F, - 0x51, 0x69, 0x3F, 0x19, 0x64, 0x1C, 0xCE, 0x55, 0x9C, 0x42, 0xF7, 0xDD, 0x04, 0x4C, 0xA9, 0x8A, - 0xA4, 0x7C, 0x09, 0x19, 0x89, 0x1C, 0xA9, 0x82, 0x40, 0x1C, 0x70, 0x45, 0xEC, 0xDD, 0xF0, 0xBD, - 0x38, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x24, 0x05, 0xE0, 0x00, 0x20, 0x61, 0x00, 0x17, 0x4A, - 0x12, 0x68, 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, 0xF5, 0xDB, 0xFB, 0xF7, - 0x0D, 0xF9, 0xF7, 0xF7, 0x9D, 0xFB, 0x00, 0x24, 0x08, 0xE0, 0x60, 0x00, 0x10, 0x49, 0x09, 0x68, - 0x08, 0x5A, 0x61, 0x00, 0x0D, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, - 0x84, 0x42, 0xF2, 0xDB, 0x64, 0x20, 0x0B, 0x49, 0x08, 0x60, 0x01, 0x20, 0x0A, 0x49, 0x08, 0x70, - 0x00, 0x20, 0x0A, 0x49, 0x08, 0x70, 0x0A, 0x49, 0x08, 0x70, 0x0A, 0x49, 0x08, 0x80, 0x0A, 0x49, - 0x08, 0x70, 0x23, 0x20, 0x80, 0x01, 0x00, 0xF0, 0xA3, 0xFA, 0x10, 0xBD, 0xC4, 0x01, 0x00, 0x20, - 0xC8, 0x01, 0x00, 0x20, 0x10, 0x01, 0x00, 0x20, 0x0A, 0x01, 0x00, 0x20, 0x14, 0x01, 0x00, 0x20, - 0x0B, 0x01, 0x00, 0x20, 0x0C, 0x01, 0x00, 0x20, 0x0E, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x0D, 0x48, - 0x80, 0x79, 0x80, 0x07, 0x80, 0x0F, 0x06, 0xD0, 0x01, 0x28, 0x0A, 0xD0, 0x02, 0x28, 0x09, 0xD0, - 0x03, 0x28, 0x0C, 0xD1, 0x00, 0xE0, 0x00, 0xBF, 0x01, 0x21, 0x03, 0x20, 0xF9, 0xF7, 0x6A, 0xFB, - 0x06, 0xE0, 0x00, 0xBF, 0x01, 0x21, 0x03, 0x20, 0xF9, 0xF7, 0xE8, 0xF8, 0x00, 0xBF, 0x00, 0xBF, - 0x00, 0xBF, 0x10, 0xBD, 0x21, 0x04, 0x00, 0x20, 0x00, 0xB5, 0x87, 0xB0, 0x00, 0x20, 0x05, 0x90, - 0x05, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, - 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x3E, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFB, 0xF7, - 0xDF, 0xFF, 0x01, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, - 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x37, 0x49, 0xA0, 0x20, 0x05, 0xAB, - 0xFB, 0xF7, 0xCE, 0xFF, 0x23, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x2E, 0x49, 0xA0, 0x20, - 0x05, 0xAB, 0xFB, 0xF7, 0xBD, 0xFF, 0x45, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, - 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x26, 0x49, - 0xA0, 0x20, 0x05, 0xAB, 0xFB, 0xF7, 0xAC, 0xFF, 0x67, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, - 0x1D, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFB, 0xF7, 0x9B, 0xFF, 0x05, 0x20, 0x06, 0x90, 0x05, 0xAA, - 0x00, 0x92, 0x01, 0x22, 0x17, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x7F, 0xFA, 0x01, 0x20, - 0x06, 0x90, 0x05, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x13, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, - 0x75, 0xFA, 0x23, 0x20, 0x06, 0x90, 0x05, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x0E, 0x49, 0xA0, 0x20, - 0x06, 0xAB, 0xFC, 0xF7, 0x6B, 0xFA, 0x45, 0x20, 0x06, 0x90, 0x05, 0xAA, 0x00, 0x92, 0x01, 0x22, - 0x09, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x61, 0xFA, 0x67, 0x20, 0x06, 0x90, 0x05, 0xAA, - 0x00, 0x92, 0x01, 0x22, 0x04, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x57, 0xFA, 0x07, 0xB0, - 0x00, 0xBD, 0x00, 0x00, 0x03, 0x13, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0xF8, 0xB5, 0x7D, 0x21, - 0x6E, 0x48, 0xC9, 0x00, 0x01, 0x82, 0x49, 0x42, 0x41, 0x82, 0x6D, 0x4A, 0x00, 0x21, 0x11, 0x60, - 0x6C, 0x4A, 0x11, 0x60, 0x6C, 0x4A, 0x11, 0x70, 0x6C, 0x4A, 0x11, 0x70, 0x6C, 0x49, 0xCA, 0x7A, - 0x01, 0x46, 0x40, 0x39, 0x93, 0x06, 0x8C, 0x7C, 0x8A, 0x7A, 0x7E, 0xD5, 0x00, 0x26, 0x35, 0x46, - 0x54, 0x43, 0x37, 0x46, 0x17, 0xE0, 0x61, 0x48, 0x62, 0x00, 0x40, 0x30, 0x80, 0x68, 0x5F, 0x49, - 0x12, 0x18, 0x6B, 0x00, 0x18, 0x18, 0x40, 0x39, 0x8B, 0x7B, 0xC9, 0x7A, 0x00, 0xF0, 0x6E, 0xFB, - 0x80, 0x19, 0xC6, 0xB2, 0x59, 0x48, 0x40, 0x38, 0xC0, 0x7A, 0x2D, 0x18, 0x57, 0x48, 0x40, 0x38, - 0x80, 0x7B, 0x24, 0x18, 0x7F, 0x1C, 0x55, 0x49, 0x40, 0x39, 0x08, 0x7C, 0x87, 0x42, 0xE2, 0xDB, - 0x08, 0x46, 0x00, 0x7B, 0x00, 0x28, 0x1E, 0xD0, 0x00, 0x27, 0x17, 0xE0, 0x4F, 0x48, 0x62, 0x00, - 0x40, 0x30, 0x80, 0x68, 0x4D, 0x49, 0x12, 0x18, 0x6B, 0x00, 0x18, 0x18, 0x40, 0x39, 0xCB, 0x7B, - 0x09, 0x7B, 0x00, 0xF0, 0x4B, 0xFB, 0x80, 0x19, 0xC6, 0xB2, 0x48, 0x48, 0x40, 0x38, 0x00, 0x7B, - 0x2D, 0x18, 0x46, 0x48, 0x40, 0x38, 0xC0, 0x7B, 0x24, 0x18, 0x7F, 0x1C, 0x43, 0x49, 0x40, 0x39, - 0x08, 0x7C, 0x87, 0x42, 0xE2, 0xDB, 0x00, 0x27, 0x17, 0xE0, 0x40, 0x48, 0x62, 0x00, 0x40, 0x30, - 0x80, 0x68, 0x3E, 0x49, 0x12, 0x18, 0x6B, 0x00, 0x18, 0x18, 0x40, 0x39, 0x8B, 0x7B, 0xC9, 0x7A, - 0x00, 0xF0, 0x2C, 0xFB, 0x80, 0x19, 0xC6, 0xB2, 0x38, 0x48, 0x40, 0x38, 0xC0, 0x7A, 0x2D, 0x18, - 0x36, 0x48, 0x40, 0x38, 0x80, 0x7B, 0x24, 0x18, 0x7F, 0x1C, 0x34, 0x49, 0x40, 0x39, 0x48, 0x7C, - 0x87, 0x42, 0xE2, 0xDB, 0x08, 0x46, 0x00, 0x7B, 0x00, 0x28, 0x20, 0xD0, 0x00, 0x27, 0x19, 0xE0, - 0x2E, 0x48, 0x62, 0x00, 0x40, 0x30, 0x80, 0x68, 0x2C, 0x49, 0x12, 0x18, 0x6B, 0x00, 0x18, 0x18, - 0x40, 0x39, 0xCB, 0x7B, 0x09, 0x7B, 0x00, 0xF0, 0x09, 0xFB, 0x80, 0x19, 0xC6, 0xB2, 0x27, 0x48, - 0x40, 0x38, 0x00, 0x7B, 0x2D, 0x18, 0x25, 0x48, 0x00, 0xE0, 0x1D, 0xE0, 0x40, 0x38, 0xC0, 0x7B, - 0x24, 0x18, 0x7F, 0x1C, 0x21, 0x49, 0x40, 0x39, 0x48, 0x7C, 0x87, 0x42, 0xE0, 0xDB, 0x1F, 0x48, - 0x40, 0x38, 0x01, 0x78, 0x06, 0x70, 0x72, 0x1A, 0x20, 0x30, 0x01, 0x78, 0x4B, 0x1C, 0x03, 0x70, - 0xC8, 0x29, 0x05, 0xD9, 0x00, 0x21, 0x01, 0x70, 0x40, 0x30, 0x43, 0x8B, 0x03, 0x83, 0x41, 0x83, - 0x02, 0x2A, 0x29, 0xDD, 0x01, 0x20, 0xF8, 0xBD, 0x4B, 0x7B, 0x00, 0x21, 0xD7, 0x18, 0x13, 0x4A, - 0x67, 0x43, 0x40, 0x3A, 0x53, 0x7D, 0x80, 0x32, 0x94, 0x68, 0x1B, 0xE0, 0x4D, 0x00, 0x12, 0x26, - 0x62, 0x5F, 0x86, 0x5F, 0xB2, 0x42, 0x01, 0xDD, 0x42, 0x82, 0x04, 0xE0, 0x10, 0x26, 0x86, 0x5F, - 0xB2, 0x42, 0x00, 0xDA, 0x02, 0x82, 0x62, 0x5F, 0x9A, 0x42, 0x03, 0xDD, 0x08, 0x4E, 0x35, 0x68, - 0x52, 0x19, 0x05, 0xE0, 0x5D, 0x42, 0xAA, 0x42, 0x03, 0xDA, 0x06, 0x4E, 0x35, 0x68, 0xAA, 0x1A, - 0x32, 0x60, 0x49, 0x1C, 0xB9, 0x42, 0xE1, 0xDB, 0x00, 0x20, 0xF8, 0xBD, 0x78, 0x01, 0x00, 0x20, - 0xE4, 0x00, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x05, 0x01, 0x00, 0x20, - 0x1C, 0x04, 0x00, 0x20, 0xF8, 0xB5, 0x3D, 0x48, 0x34, 0x21, 0x30, 0x22, 0x41, 0x5E, 0x82, 0x5E, - 0x40, 0x30, 0x00, 0x90, 0x80, 0x89, 0x89, 0x1A, 0x81, 0x42, 0x09, 0xD1, 0x37, 0x48, 0x36, 0x21, - 0x32, 0x22, 0x41, 0x5E, 0x82, 0x5E, 0x00, 0x98, 0x89, 0x1A, 0xC0, 0x89, 0x81, 0x42, 0x63, 0xD0, - 0x00, 0x24, 0x32, 0x48, 0x80, 0x30, 0x80, 0x6A, 0x01, 0x5D, 0x86, 0x46, 0x00, 0x29, 0x57, 0xD0, - 0x2E, 0x48, 0x36, 0x27, 0x32, 0x22, 0xC7, 0x5F, 0x82, 0x5E, 0x00, 0x98, 0xC3, 0x89, 0xB8, 0x1A, - 0x84, 0x46, 0x98, 0x42, 0x1F, 0xDA, 0x29, 0x48, 0x65, 0x00, 0x80, 0x30, 0x46, 0x6A, 0x39, 0x46, - 0x70, 0x5F, 0xC8, 0x31, 0x88, 0x42, 0x03, 0xDA, 0x11, 0x46, 0xC8, 0x39, 0x88, 0x42, 0x03, 0xDA, - 0x00, 0x20, 0x71, 0x46, 0x08, 0x55, 0x0E, 0xE0, 0xB8, 0x42, 0x02, 0xDB, 0x5B, 0x1E, 0x73, 0x53, - 0x09, 0xE0, 0x90, 0x42, 0x01, 0xDC, 0x00, 0x20, 0x04, 0xE0, 0x80, 0x1A, 0x58, 0x43, 0x61, 0x46, - 0xF6, 0xF7, 0x44, 0xFC, 0x70, 0x53, 0x19, 0x48, 0x34, 0x27, 0x30, 0x22, 0xC7, 0x5F, 0x82, 0x5E, - 0x00, 0x98, 0x83, 0x89, 0xB8, 0x1A, 0x84, 0x46, 0x98, 0x42, 0x21, 0xDA, 0x13, 0x48, 0x65, 0x00, - 0x80, 0x30, 0x06, 0x6A, 0x11, 0x46, 0x70, 0x5F, 0xC8, 0x39, 0x88, 0x42, 0x03, 0xDB, 0x39, 0x46, - 0xC8, 0x31, 0x88, 0x42, 0x05, 0xDB, 0x0D, 0x49, 0x00, 0x20, 0x80, 0x31, 0x89, 0x6A, 0x08, 0x55, - 0x0E, 0xE0, 0xB8, 0x42, 0x02, 0xDB, 0x5B, 0x1E, 0x73, 0x53, 0x09, 0xE0, 0x90, 0x42, 0x01, 0xDC, - 0x00, 0x20, 0x04, 0xE0, 0x80, 0x1A, 0x58, 0x43, 0x61, 0x46, 0xF6, 0xF7, 0x17, 0xFC, 0x70, 0x53, - 0x64, 0x1C, 0xE4, 0xB2, 0x0A, 0x2C, 0x9C, 0xD3, 0xF8, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, - 0xFF, 0xB5, 0x85, 0xB0, 0x00, 0x20, 0x03, 0x90, 0x02, 0x90, 0x0E, 0x98, 0x14, 0x46, 0x11, 0x1A, - 0x0F, 0x98, 0x49, 0x43, 0x1A, 0x1A, 0x52, 0x43, 0x8F, 0x18, 0x06, 0x99, 0x05, 0x98, 0xC9, 0x1A, - 0x00, 0x1B, 0x40, 0x43, 0x49, 0x43, 0x1D, 0x46, 0x46, 0x18, 0x30, 0x4B, 0x1C, 0x20, 0x0E, 0x9A, - 0x18, 0x56, 0x94, 0x42, 0x04, 0x90, 0x09, 0xD1, 0x0F, 0x98, 0x85, 0x42, 0x06, 0xD1, 0x04, 0x98, - 0x04, 0x28, 0x03, 0xDA, 0x01, 0x20, 0xC0, 0x05, 0x86, 0x42, 0x49, 0xDB, 0xB8, 0x1B, 0x01, 0x90, - 0x01, 0xD5, 0x40, 0x42, 0x01, 0x90, 0xB7, 0x42, 0x05, 0xDD, 0x00, 0x2E, 0x00, 0xD1, 0x01, 0x26, - 0x31, 0x46, 0x38, 0x46, 0x04, 0xE0, 0x00, 0x2F, 0x00, 0xD1, 0x01, 0x27, 0x39, 0x46, 0x30, 0x46, - 0xF6, 0xF7, 0xD4, 0xFB, 0x0A, 0x28, 0x02, 0xDD, 0x04, 0x99, 0x02, 0x29, 0x33, 0xDC, 0x01, 0x21, - 0x49, 0x02, 0x88, 0x42, 0x2F, 0xDC, 0xFF, 0x28, 0x2A, 0xDD, 0x19, 0x21, 0x01, 0x98, 0x09, 0x04, - 0x88, 0x42, 0x25, 0xDB, 0x0E, 0x98, 0x84, 0x42, 0x02, 0xDD, 0x05, 0x98, 0x84, 0x42, 0x05, 0xDB, - 0x0E, 0x98, 0x84, 0x42, 0x04, 0xDA, 0x05, 0x98, 0x84, 0x42, 0x01, 0xDD, 0x01, 0x20, 0x03, 0x90, - 0x0F, 0x98, 0x85, 0x42, 0x02, 0xDD, 0x06, 0x98, 0x85, 0x42, 0x05, 0xDB, 0x0F, 0x98, 0x85, 0x42, - 0x04, 0xDA, 0x06, 0x98, 0x85, 0x42, 0x01, 0xDD, 0x01, 0x20, 0x02, 0x90, 0x02, 0x99, 0x03, 0x98, - 0x08, 0x43, 0x08, 0xD0, 0x01, 0x20, 0x80, 0x04, 0x87, 0x42, 0x04, 0xDD, 0x86, 0x42, 0x02, 0xDD, - 0x00, 0x20, 0x09, 0xB0, 0xF0, 0xBD, 0x01, 0x20, 0xFB, 0xE7, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, - 0xF1, 0xB5, 0x01, 0xF0, 0xCD, 0xFA, 0x59, 0x20, 0x23, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, - 0x88, 0x20, 0x08, 0x60, 0xF8, 0xF7, 0x9C, 0xFD, 0x7D, 0x24, 0xA4, 0x02, 0x05, 0xE0, 0x20, 0x46, - 0xF8, 0xF7, 0xAA, 0xFD, 0xFF, 0x34, 0xFF, 0x34, 0x02, 0x34, 0x1C, 0x49, 0x00, 0x98, 0x40, 0x18, - 0xA0, 0x42, 0xF4, 0xD8, 0x1A, 0x48, 0x00, 0x68, 0x40, 0x1C, 0x19, 0x49, 0x08, 0x60, 0x08, 0x46, - 0x05, 0x68, 0x29, 0x46, 0x7D, 0x20, 0x80, 0x02, 0xF8, 0xF7, 0x0E, 0xFE, 0x00, 0x26, 0x15, 0x48, - 0x07, 0x68, 0x12, 0x4C, 0x24, 0x1F, 0x0C, 0xE0, 0x7D, 0x88, 0x76, 0x19, 0x2D, 0x04, 0x38, 0x88, - 0x86, 0x19, 0x38, 0x88, 0x45, 0x19, 0x3F, 0x1D, 0x29, 0x46, 0x20, 0x46, 0xF8, 0xF7, 0xFC, 0xFD, - 0x24, 0x1D, 0x0A, 0x49, 0x09, 0x1F, 0x00, 0x98, 0x40, 0x18, 0xA0, 0x42, 0xEC, 0xD8, 0x31, 0x46, - 0x20, 0x46, 0xF8, 0xF7, 0xF1, 0xFD, 0xF8, 0xF7, 0x59, 0xFD, 0x00, 0x20, 0x02, 0x49, 0x08, 0x60, - 0x02, 0x20, 0x01, 0xF0, 0xE1, 0xFA, 0xF8, 0xBD, 0x00, 0x01, 0x00, 0x50, 0x08, 0xF4, 0x01, 0x00, - 0x10, 0x01, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x01, 0x20, 0xFD, 0xF7, 0x60, 0xFF, - 0x59, 0x20, 0x18, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xF8, 0xF7, - 0x47, 0xFD, 0x1F, 0x20, 0x00, 0x03, 0xF8, 0xF7, 0x57, 0xFD, 0x13, 0x4F, 0x13, 0x4D, 0x0E, 0xE0, - 0x00, 0x26, 0x03, 0x24, 0x03, 0xE0, 0x36, 0x02, 0x38, 0x5D, 0x06, 0x43, 0x64, 0x1E, 0x00, 0x2C, - 0xF9, 0xDA, 0x31, 0x46, 0x28, 0x46, 0xF8, 0xF7, 0xBF, 0xFD, 0x3F, 0x1D, 0x2D, 0x1D, 0x0B, 0x48, - 0x5E, 0x30, 0x85, 0x42, 0xEC, 0xD3, 0x0A, 0x4E, 0x31, 0x46, 0x1F, 0x20, 0x00, 0x03, 0xF8, 0xF7, - 0xB3, 0xFD, 0xF8, 0xF7, 0x1B, 0xFD, 0x00, 0x20, 0x02, 0x49, 0x08, 0x60, 0x01, 0x20, 0xFD, 0xF7, - 0x4D, 0xFF, 0xF8, 0xBD, 0x00, 0x01, 0x00, 0x50, 0x21, 0x04, 0x00, 0x20, 0x04, 0xF0, 0x01, 0x00, - 0x21, 0x43, 0x65, 0x87, 0xF8, 0xB5, 0x00, 0x20, 0x5E, 0x49, 0x08, 0x70, 0x5E, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x12, 0xDC, 0x00, 0x24, 0x08, 0xE0, 0x60, 0x00, 0x5C, 0x49, 0x09, 0x68, 0x09, 0x5A, - 0x60, 0x00, 0x5B, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, - 0xF2, 0xDB, 0x00, 0x20, 0x54, 0x49, 0x08, 0x60, 0x9F, 0xE0, 0x53, 0x48, 0x00, 0x68, 0x05, 0x28, - 0x01, 0xDC, 0x01, 0x25, 0x10, 0xE0, 0x50, 0x48, 0x00, 0x68, 0x0A, 0x28, 0x01, 0xDC, 0x03, 0x25, - 0x0A, 0xE0, 0x4D, 0x48, 0x00, 0x68, 0x0A, 0x28, 0x06, 0xDD, 0x4E, 0x48, 0x00, 0x78, 0x01, 0x28, - 0x01, 0xDD, 0x01, 0x25, 0x00, 0xE0, 0x03, 0x25, 0x00, 0x24, 0x25, 0xE0, 0x60, 0x00, 0x47, 0x49, - 0x09, 0x68, 0x08, 0x5E, 0x28, 0x41, 0x06, 0x46, 0x60, 0x00, 0x44, 0x49, 0x09, 0x68, 0x08, 0x5E, - 0x00, 0x28, 0x03, 0xDD, 0x0A, 0x2E, 0x0C, 0xDA, 0x0A, 0x26, 0x0A, 0xE0, 0x60, 0x00, 0x3F, 0x49, - 0x09, 0x68, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDA, 0x09, 0x20, 0xC0, 0x43, 0x86, 0x42, 0x00, 0xDD, - 0x06, 0x46, 0x60, 0x00, 0x3A, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x80, 0x19, 0x00, 0xB2, 0x61, 0x00, - 0x37, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, 0xD5, 0xDB, - 0xFE, 0xF7, 0x42, 0xFF, 0x34, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x0D, 0xDD, 0x01, 0x46, - 0x00, 0x20, 0x08, 0x5E, 0x28, 0x41, 0x06, 0x46, 0x0A, 0x2E, 0x00, 0xDA, 0x0A, 0x26, 0x2E, 0x48, - 0x00, 0x88, 0x80, 0x1B, 0x00, 0xB2, 0x2C, 0x49, 0x08, 0x80, 0x2C, 0x48, 0x00, 0x21, 0x41, 0x5E, - 0x00, 0x29, 0x0F, 0xDA, 0x01, 0x46, 0x00, 0x20, 0x08, 0x5E, 0x28, 0x41, 0x06, 0x46, 0x09, 0x20, - 0xC0, 0x43, 0x86, 0x42, 0x00, 0xDD, 0x06, 0x46, 0x24, 0x48, 0x00, 0x88, 0x80, 0x1B, 0x00, 0xB2, - 0x22, 0x49, 0x08, 0x80, 0x1C, 0x48, 0x00, 0x68, 0x0A, 0x28, 0x2D, 0xDB, 0x20, 0x4A, 0x11, 0x78, - 0xCA, 0x0F, 0x52, 0x18, 0x52, 0x10, 0x1C, 0x4B, 0x00, 0x27, 0xDF, 0x5F, 0xBA, 0x42, 0x23, 0xDD, - 0x1B, 0x4A, 0x10, 0x78, 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x52, 0x42, 0x17, 0x4B, 0x00, 0x27, - 0xDF, 0x5F, 0xBA, 0x42, 0x18, 0xDA, 0x13, 0x48, 0x00, 0x78, 0x03, 0x28, 0x05, 0xDA, 0x11, 0x48, - 0x00, 0x78, 0x40, 0x1C, 0x0F, 0x49, 0x08, 0x70, 0x0E, 0xE0, 0x01, 0x20, 0x11, 0x49, 0x08, 0x70, - 0x00, 0x20, 0x11, 0x49, 0x08, 0x80, 0x0B, 0x49, 0x08, 0x70, 0x07, 0x48, 0x00, 0x68, 0x64, 0x28, - 0x02, 0xDA, 0x64, 0x20, 0x04, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x23, 0x20, 0x80, 0x01, 0xFF, 0xF7, - 0xAF, 0xFE, 0xF8, 0xBD, 0xEF, 0x00, 0x00, 0x20, 0x10, 0x01, 0x00, 0x20, 0xC8, 0x01, 0x00, 0x20, - 0xC4, 0x01, 0x00, 0x20, 0x0E, 0x01, 0x00, 0x20, 0x8A, 0x01, 0x00, 0x20, 0x88, 0x01, 0x00, 0x20, - 0x15, 0x01, 0x00, 0x20, 0x0A, 0x01, 0x00, 0x20, 0x0C, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x26, 0x4D, - 0x28, 0x7D, 0x2C, 0x46, 0x41, 0x00, 0x40, 0x34, 0x1C, 0x20, 0x20, 0x5E, 0x81, 0x42, 0x03, 0xDA, - 0xC1, 0x0F, 0x08, 0x18, 0x40, 0x10, 0x02, 0xE0, 0x03, 0x21, 0xF6, 0xF7, 0x1F, 0xFA, 0x60, 0x83, - 0x00, 0x27, 0x17, 0xE0, 0x7F, 0x1C, 0x90, 0x7C, 0x39, 0x46, 0x80, 0x1C, 0x41, 0x43, 0x00, 0x20, - 0x09, 0xE0, 0x19, 0x4A, 0x4B, 0x00, 0x80, 0x32, 0xD2, 0x68, 0x65, 0x8B, 0xD6, 0x5A, 0x75, 0x1B, - 0x40, 0x1C, 0xD5, 0x52, 0x00, 0xB2, 0x14, 0x4A, 0x49, 0x1C, 0x92, 0x7C, 0x09, 0xB2, 0x90, 0x42, - 0xEF, 0xDB, 0x3F, 0xB2, 0x10, 0x4A, 0xD0, 0x7C, 0x87, 0x42, 0xE3, 0xDB, 0x16, 0x46, 0xB0, 0x7C, - 0xF1, 0x7C, 0x82, 0x1C, 0x49, 0x1C, 0x51, 0x43, 0x0D, 0xB2, 0x80, 0x1C, 0x31, 0x46, 0x80, 0x31, - 0x02, 0x27, 0x0D, 0xE0, 0xCB, 0x68, 0x42, 0x00, 0x74, 0x7D, 0x9A, 0x5E, 0xA2, 0x42, 0x03, 0xDD, - 0x4B, 0x69, 0x00, 0x22, 0x1A, 0x54, 0x01, 0xE0, 0x4A, 0x69, 0x17, 0x54, 0x40, 0x1C, 0x00, 0xB2, - 0xA8, 0x42, 0xEF, 0xDB, 0xF8, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0xFF, 0xB5, 0x85, 0xB0, - 0x00, 0x20, 0x04, 0x90, 0x03, 0x90, 0x0D, 0x46, 0x04, 0xAA, 0x02, 0xAB, 0x05, 0x98, 0xFA, 0xF7, - 0xB5, 0xFD, 0x04, 0x46, 0x03, 0xAA, 0x01, 0xAB, 0x08, 0x99, 0x07, 0x98, 0xFA, 0xF7, 0xAE, 0xFD, - 0x21, 0x18, 0xCA, 0x0F, 0x51, 0x18, 0x5F, 0x4A, 0x49, 0x10, 0x52, 0x7D, 0x52, 0x08, 0x8A, 0x42, - 0x01, 0xDA, 0x5D, 0x4A, 0x03, 0xE0, 0x52, 0x42, 0x8A, 0x42, 0x03, 0xDD, 0x5B, 0x4A, 0x11, 0x78, - 0x49, 0x1C, 0x11, 0x70, 0x21, 0x1A, 0x00, 0xD5, 0x49, 0x42, 0x00, 0x22, 0x96, 0x46, 0x20, 0x29, - 0x07, 0xDC, 0x03, 0x9B, 0x04, 0x9A, 0xD3, 0x18, 0x08, 0x9A, 0xAA, 0x18, 0x52, 0x08, 0x93, 0x42, - 0x45, 0xDC, 0x30, 0x29, 0x16, 0xDD, 0x01, 0x21, 0x8E, 0x46, 0x21, 0x1E, 0x00, 0xDA, 0x61, 0x42, - 0x02, 0x1E, 0x00, 0xDA, 0x42, 0x42, 0x91, 0x42, 0x06, 0xD9, 0x04, 0x99, 0x03, 0x9A, 0x49, 0x1C, - 0x8A, 0x42, 0x1B, 0xDD, 0x04, 0x46, 0x19, 0xE0, 0x03, 0x99, 0x04, 0x9A, 0x49, 0x1C, 0x8A, 0x42, - 0x14, 0xDD, 0x12, 0xE0, 0x6A, 0x08, 0x04, 0x99, 0x92, 0x1C, 0x8A, 0x42, 0x04, 0xDD, 0x03, 0x9B, - 0x4A, 0x1C, 0x93, 0x42, 0x00, 0xDD, 0x04, 0x46, 0x08, 0x9A, 0x53, 0x08, 0x03, 0x9A, 0x9B, 0x1C, - 0x93, 0x42, 0x03, 0xDD, 0x52, 0x1C, 0x91, 0x42, 0x00, 0xDD, 0x20, 0x46, 0x21, 0x1E, 0x00, 0xDA, - 0x61, 0x42, 0x38, 0x4B, 0x18, 0x22, 0x60, 0x33, 0x9A, 0x5E, 0x91, 0x42, 0x04, 0xD9, 0x04, 0x9B, - 0x69, 0x1E, 0x8B, 0x42, 0x00, 0xDA, 0x02, 0x9C, 0x01, 0x1E, 0x00, 0xDA, 0x41, 0x42, 0x91, 0x42, - 0x05, 0xD9, 0x08, 0x99, 0x03, 0x9A, 0x49, 0x1E, 0x8A, 0x42, 0x00, 0xDA, 0x01, 0x98, 0x02, 0x99, - 0x8C, 0x42, 0x00, 0xDA, 0x0C, 0x46, 0x01, 0x99, 0x88, 0x42, 0x00, 0xDA, 0x08, 0x46, 0x29, 0x4A, - 0x00, 0x23, 0x40, 0x32, 0x22, 0xE0, 0x5E, 0x00, 0x05, 0x99, 0xB4, 0x46, 0x89, 0x5F, 0x12, 0x26, - 0x96, 0x5F, 0x09, 0x1B, 0xB1, 0x42, 0x01, 0xDD, 0x51, 0x82, 0x04, 0xE0, 0x10, 0x26, 0x96, 0x5F, - 0xB1, 0x42, 0x00, 0xDA, 0x11, 0x82, 0x1F, 0x4E, 0x76, 0x7D, 0xB1, 0x42, 0x03, 0xDD, 0x20, 0x4F, - 0x3E, 0x68, 0x76, 0x18, 0x05, 0xE0, 0x76, 0x42, 0xB1, 0x42, 0x03, 0xDA, 0x1D, 0x4F, 0x3E, 0x68, - 0x76, 0x1A, 0x3E, 0x60, 0x05, 0x9F, 0x66, 0x46, 0xB9, 0x53, 0x5B, 0x1C, 0xAB, 0x42, 0xDA, 0xDB, - 0x00, 0x23, 0x20, 0xE0, 0x07, 0x99, 0x5C, 0x00, 0x09, 0x5F, 0x12, 0x25, 0x55, 0x5F, 0x09, 0x1A, - 0xA9, 0x42, 0x01, 0xDD, 0x51, 0x82, 0x04, 0xE0, 0x10, 0x25, 0x55, 0x5F, 0xA9, 0x42, 0x00, 0xDA, - 0x11, 0x82, 0x0C, 0x4D, 0x6D, 0x7D, 0xA9, 0x42, 0x03, 0xDD, 0x0D, 0x4D, 0x2E, 0x68, 0x76, 0x18, - 0x05, 0xE0, 0x6D, 0x42, 0xA9, 0x42, 0x03, 0xDA, 0x0A, 0x4D, 0x2E, 0x68, 0x76, 0x1A, 0x2E, 0x60, - 0x07, 0x9D, 0x5B, 0x1C, 0x29, 0x53, 0x08, 0x99, 0x8B, 0x42, 0xDB, 0xDB, 0x70, 0x46, 0x09, 0xB0, - 0xF0, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x05, 0x01, 0x00, 0x20, - 0xE4, 0x00, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, 0xFF, 0xB5, 0x87, 0xB0, 0x04, 0x46, 0x0D, 0x46, - 0x16, 0x46, 0x02, 0xAA, 0x29, 0x46, 0x20, 0x46, 0xFA, 0xF7, 0x78, 0xFC, 0x05, 0x90, 0x01, 0xAA, - 0x30, 0x46, 0x0A, 0x99, 0xFA, 0xF7, 0x72, 0xFC, 0x04, 0x90, 0x05, 0x98, 0xF6, 0xF7, 0xF5, 0xF9, - 0x07, 0x46, 0x04, 0x98, 0xF6, 0xF7, 0xF1, 0xF9, 0x87, 0x42, 0x01, 0xD9, 0x04, 0x98, 0x05, 0x90, - 0x00, 0x20, 0x06, 0x90, 0x20, 0xE0, 0x06, 0x98, 0x40, 0x00, 0x21, 0x5E, 0x05, 0x98, 0x08, 0x1A, - 0x03, 0x90, 0x24, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x03, 0x98, 0x90, 0x42, 0x03, 0xDA, 0x03, 0x98, - 0x00, 0xB2, 0x08, 0x80, 0x08, 0xE0, 0x20, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x03, 0x98, 0x90, 0x42, - 0x02, 0xDD, 0x03, 0x98, 0x00, 0xB2, 0x08, 0x80, 0x03, 0x98, 0x00, 0xB2, 0x06, 0x99, 0x49, 0x00, - 0x60, 0x52, 0x06, 0x98, 0x40, 0x1C, 0x06, 0x90, 0x06, 0x98, 0xA8, 0x42, 0xDB, 0xDB, 0x00, 0x20, - 0x06, 0x90, 0x20, 0xE0, 0x06, 0x98, 0x40, 0x00, 0x31, 0x5E, 0x05, 0x98, 0x08, 0x1A, 0x03, 0x90, - 0x10, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x03, 0x98, 0x90, 0x42, 0x03, 0xDA, 0x03, 0x98, 0x00, 0xB2, - 0x08, 0x80, 0x08, 0xE0, 0x0C, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x03, 0x98, 0x90, 0x42, 0x02, 0xDD, - 0x03, 0x98, 0x00, 0xB2, 0x08, 0x80, 0x03, 0x98, 0x00, 0xB2, 0x06, 0x99, 0x49, 0x00, 0x70, 0x52, - 0x06, 0x98, 0x40, 0x1C, 0x06, 0x90, 0x0A, 0x99, 0x06, 0x98, 0x88, 0x42, 0xDA, 0xDB, 0x0B, 0xB0, - 0xF0, 0xBD, 0x00, 0x00, 0x88, 0x01, 0x00, 0x20, 0x8A, 0x01, 0x00, 0x20, 0xF1, 0xB5, 0x30, 0x48, - 0x80, 0x79, 0xFF, 0x28, 0x5B, 0xD0, 0x00, 0x9E, 0x00, 0x25, 0x28, 0x46, 0xFA, 0xF7, 0xF0, 0xFB, - 0x04, 0x1E, 0x1E, 0xDB, 0x2A, 0x4A, 0x14, 0x32, 0x10, 0x5D, 0x01, 0x06, 0x19, 0xD5, 0x17, 0x46, - 0x08, 0x37, 0x40, 0x06, 0x39, 0x5D, 0x40, 0x0E, 0x01, 0x22, 0xF8, 0xF7, 0x91, 0xFD, 0xF0, 0x07, - 0x0F, 0xD1, 0x23, 0x48, 0x39, 0x5D, 0x00, 0x78, 0x00, 0x28, 0x22, 0x48, 0x00, 0x5D, 0x04, 0xD0, - 0x40, 0x06, 0x40, 0x0E, 0xF8, 0xF7, 0x42, 0xFB, 0x03, 0xE0, 0x40, 0x06, 0x40, 0x0E, 0xF8, 0xF7, - 0xB9, 0xFD, 0x6D, 0x1C, 0xED, 0xB2, 0x76, 0x08, 0x08, 0x2D, 0xD6, 0xD3, 0x00, 0x9D, 0x00, 0x26, - 0x30, 0x46, 0xFA, 0xF7, 0xC5, 0xFB, 0x04, 0x1E, 0x1A, 0xDB, 0x16, 0x48, 0x00, 0x5D, 0x01, 0x06, - 0x16, 0xD5, 0xE9, 0x07, 0x14, 0xD0, 0x12, 0x4F, 0x39, 0x78, 0x00, 0x29, 0x12, 0x49, 0x09, 0x5D, - 0x04, 0xD0, 0x40, 0x06, 0x40, 0x0E, 0xF8, 0xF7, 0x9D, 0xFD, 0x03, 0xE0, 0x40, 0x06, 0x40, 0x0E, - 0xF8, 0xF7, 0x1C, 0xFB, 0x39, 0x78, 0x60, 0x00, 0x40, 0x18, 0xB4, 0x30, 0xFE, 0xF7, 0x22, 0xFA, - 0x76, 0x1C, 0xF6, 0xB2, 0x6D, 0x08, 0x08, 0x2E, 0xDA, 0xD3, 0x00, 0x98, 0x00, 0x28, 0x01, 0xD1, - 0xBC, 0x20, 0x02, 0xE0, 0xFF, 0x28, 0x02, 0xD1, 0xBD, 0x20, 0xFE, 0xF7, 0x13, 0xFA, 0xF8, 0xBD, - 0x78, 0x03, 0x00, 0x20, 0x8C, 0x03, 0x00, 0x20, 0x94, 0x03, 0x00, 0x20, 0x04, 0x49, 0x09, 0x78, - 0x41, 0x43, 0x04, 0x4A, 0x51, 0x61, 0x00, 0x21, 0x91, 0x61, 0x05, 0x21, 0x11, 0x61, 0x70, 0x47, - 0xC2, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xE0, 0x10, 0xB5, 0xFC, 0xF7, 0x5D, 0xF8, 0x00, 0x20, - 0xFE, 0xF7, 0x20, 0xFD, 0x00, 0x20, 0x1C, 0x49, 0x08, 0x70, 0x1C, 0x49, 0x08, 0x70, 0x1C, 0x49, - 0x08, 0x70, 0x1C, 0x48, 0x00, 0x78, 0x1C, 0x49, 0x08, 0x80, 0x00, 0x20, 0x1B, 0x49, 0x08, 0x70, - 0x1B, 0x49, 0x08, 0x70, 0x1B, 0x49, 0x08, 0x70, 0x1B, 0x49, 0x08, 0x70, 0x1B, 0x49, 0x08, 0x70, - 0x1B, 0x49, 0x08, 0x80, 0x1B, 0x49, 0x08, 0x70, 0x1B, 0x49, 0x08, 0x70, 0x1B, 0x49, 0x08, 0x70, - 0x1B, 0x49, 0x08, 0x70, 0x02, 0x20, 0x1B, 0x49, 0x08, 0x70, 0x00, 0x20, 0x1A, 0x49, 0x08, 0x80, - 0x1A, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0B, 0xD1, 0x00, 0xF0, 0x22, 0xFF, 0x01, 0x20, 0x17, 0x49, - 0x08, 0x70, 0x17, 0x49, 0x08, 0x70, 0x17, 0x49, 0x08, 0x70, 0x02, 0x20, 0x00, 0xF0, 0x74, 0xFF, - 0x15, 0x48, 0xFF, 0xF7, 0xB3, 0xFF, 0x10, 0xBD, 0xA5, 0x00, 0x00, 0x20, 0xA6, 0x00, 0x00, 0x20, - 0xA7, 0x00, 0x00, 0x20, 0xC3, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0xA4, 0x00, 0x00, 0x20, - 0x9C, 0x00, 0x00, 0x20, 0x9D, 0x00, 0x00, 0x20, 0xB1, 0x00, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x20, - 0xCA, 0x00, 0x00, 0x20, 0xA8, 0x00, 0x00, 0x20, 0xAA, 0x00, 0x00, 0x20, 0x91, 0x00, 0x00, 0x20, - 0x90, 0x00, 0x00, 0x20, 0x12, 0x02, 0x00, 0x20, 0x10, 0x02, 0x00, 0x20, 0xB0, 0x00, 0x00, 0x20, - 0xAC, 0x00, 0x00, 0x20, 0x9E, 0x00, 0x00, 0x20, 0xA0, 0x86, 0x01, 0x00, 0x70, 0xB5, 0x20, 0x48, - 0x00, 0x69, 0x45, 0x07, 0x6D, 0x0F, 0x05, 0x2D, 0x00, 0xD9, 0x04, 0x25, 0x02, 0x2D, 0x03, 0xD0, - 0xA8, 0x00, 0x1C, 0x49, 0x0C, 0x58, 0x1E, 0xE0, 0x19, 0x48, 0x00, 0x6A, 0x00, 0x04, 0x86, 0x0F, - 0x01, 0x2E, 0x00, 0xD9, 0x76, 0x1E, 0x16, 0x4A, 0x12, 0x6A, 0x12, 0x03, 0xD2, 0x0F, 0x01, 0xD0, - 0x15, 0x4A, 0x00, 0xE0, 0x15, 0x4A, 0x12, 0x4B, 0x1B, 0x6A, 0xDB, 0x05, 0xDB, 0x0D, 0x9B, 0x1C, - 0x10, 0x46, 0x58, 0x43, 0x0E, 0x4A, 0x12, 0x6A, 0x92, 0x04, 0xD2, 0x0E, 0x91, 0x1C, 0xF5, 0xF7, - 0x7B, 0xFF, 0xF0, 0x40, 0x04, 0x46, 0x0A, 0x48, 0x80, 0x69, 0x00, 0x07, 0x00, 0x0F, 0x41, 0x1C, - 0x20, 0x46, 0xF5, 0xF7, 0x71, 0xFF, 0x0A, 0x49, 0x08, 0x60, 0x0A, 0x49, 0x08, 0x48, 0x00, 0x68, - 0x4A, 0x10, 0x80, 0x18, 0xF5, 0xF7, 0x68, 0xFF, 0x07, 0x49, 0x08, 0x60, 0x70, 0xBD, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x50, 0x08, 0x00, 0x00, 0x20, 0x00, 0x80, 0x51, 0x01, 0x00, 0x1B, 0xB7, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x40, 0x42, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, - 0xF8, 0xB5, 0x28, 0x4A, 0x00, 0x24, 0x26, 0x48, 0x13, 0x46, 0x44, 0x72, 0xC4, 0x71, 0xC4, 0x81, - 0x15, 0x46, 0x16, 0x46, 0x22, 0x4F, 0x04, 0x72, 0x10, 0x33, 0x20, 0x35, 0x30, 0x36, 0x20, 0x46, - 0x2C, 0x37, 0x41, 0x00, 0x54, 0x52, 0x5C, 0x52, 0x6C, 0x52, 0x74, 0x52, 0x1C, 0x49, 0x24, 0x31, - 0x0C, 0x54, 0x1D, 0x49, 0x09, 0x18, 0xA0, 0x31, 0x09, 0x79, 0x09, 0x09, 0x49, 0x1C, 0x39, 0x54, - 0x40, 0x1C, 0xC0, 0xB2, 0x08, 0x28, 0xEC, 0xD3, 0x17, 0x4D, 0xA0, 0x35, 0x28, 0x7B, 0x00, 0x07, - 0x00, 0x0F, 0x03, 0x28, 0x23, 0xD1, 0x12, 0x4E, 0x74, 0x70, 0x28, 0x7B, 0x40, 0x06, 0xC0, 0x0F, - 0x30, 0x70, 0xE8, 0x78, 0xB0, 0x70, 0x40, 0x00, 0x03, 0x21, 0xF5, 0xF7, 0x1D, 0xFF, 0xF0, 0x70, - 0x28, 0x7C, 0x00, 0x07, 0x00, 0x0F, 0xC0, 0xB2, 0x81, 0x00, 0x40, 0x18, 0x0F, 0x30, 0x30, 0x71, - 0x28, 0x7B, 0x80, 0x06, 0x80, 0x0F, 0xB0, 0x71, 0x28, 0x7B, 0x00, 0x06, 0x01, 0xD4, 0xFF, 0x20, - 0xB0, 0x71, 0x00, 0x20, 0xFF, 0xF7, 0x82, 0xFE, 0x74, 0x81, 0x04, 0x48, 0xB0, 0x81, 0xF8, 0xBD, - 0x78, 0x03, 0x00, 0x20, 0x80, 0x1A, 0x00, 0x20, 0xBC, 0x03, 0x00, 0x20, 0x54, 0x0B, 0x00, 0x00, - 0x10, 0xB5, 0x05, 0x48, 0xC4, 0x69, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x20, 0x46, - 0x02, 0x49, 0x09, 0x68, 0x88, 0x47, 0x10, 0xBD, 0x00, 0x00, 0x05, 0x40, 0x30, 0x01, 0x00, 0x20, - 0x10, 0xB5, 0x05, 0x48, 0xC4, 0x69, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x20, 0x46, - 0x02, 0x49, 0x09, 0x68, 0x88, 0x47, 0x10, 0xBD, 0x00, 0x00, 0x15, 0x40, 0x34, 0x01, 0x00, 0x20, - 0x10, 0xB5, 0x04, 0x46, 0xE0, 0x07, 0xC0, 0x0F, 0x08, 0xD0, 0x01, 0x22, 0x04, 0x49, 0x10, 0x05, - 0xF9, 0xF7, 0x6A, 0xFA, 0x01, 0x21, 0x08, 0x05, 0xF9, 0xF7, 0x50, 0xF8, 0x10, 0xBD, 0x00, 0x00, - 0x92, 0x00, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0xB5, 0x49, 0x48, - 0x40, 0x68, 0x49, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x08, 0x42, 0x31, 0xD0, - 0x44, 0x48, 0x40, 0x69, 0xC0, 0x07, 0xC0, 0x0F, 0x44, 0x49, 0x08, 0x60, 0x04, 0x20, 0x41, 0x49, - 0x48, 0x60, 0x42, 0x48, 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x0D, 0xD0, 0x40, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x75, 0xD1, 0x01, 0x20, 0x3E, 0x49, 0x08, 0x60, 0x7D, 0x20, 0x00, 0x01, 0x39, 0x49, - 0x08, 0x61, 0x0F, 0x20, 0x08, 0x60, 0x6B, 0xE0, 0x00, 0x20, 0x39, 0x49, 0x08, 0x60, 0x3B, 0x20, - 0x40, 0x01, 0x34, 0x49, 0x08, 0x61, 0x00, 0x20, 0x36, 0x49, 0x08, 0x70, 0x36, 0x49, 0x08, 0x70, - 0x30, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x2D, 0x49, - 0x08, 0x60, 0x55, 0xE0, 0x2E, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD1, 0x0B, 0x20, 0x29, 0x49, - 0x48, 0x60, 0x4D, 0xE0, 0x28, 0x48, 0x00, 0x68, 0x08, 0x21, 0x08, 0x42, 0x03, 0xD0, 0x08, 0x20, - 0x24, 0x49, 0x48, 0x60, 0x44, 0xE0, 0x24, 0x48, 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x34, 0xD0, - 0x20, 0x48, 0x00, 0x69, 0x25, 0x49, 0x08, 0x60, 0x01, 0x20, 0x1E, 0x49, 0x48, 0x60, 0x23, 0x48, - 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x08, 0xD0, 0x7D, 0x20, 0x00, 0x01, 0x08, 0x61, 0x07, 0x20, - 0x1B, 0x49, 0x08, 0x60, 0xF9, 0xF7, 0x18, 0xFA, 0x2A, 0xE0, 0x1C, 0x48, 0x00, 0x68, 0x02, 0x21, - 0x08, 0x42, 0x0A, 0xD0, 0x1F, 0x20, 0x80, 0x01, 0x12, 0x49, 0x08, 0x61, 0x14, 0x48, 0x00, 0x68, - 0x20, 0x21, 0x08, 0x43, 0x12, 0x49, 0x08, 0x60, 0x1A, 0xE0, 0x14, 0x48, 0x00, 0x68, 0x04, 0x21, - 0x08, 0x42, 0x15, 0xD0, 0x7D, 0x20, 0x00, 0x01, 0x0A, 0x49, 0x08, 0x61, 0x0C, 0x48, 0x00, 0x68, - 0x20, 0x21, 0x88, 0x43, 0x0A, 0x49, 0x08, 0x60, 0x0A, 0xE0, 0x07, 0x48, 0x00, 0x68, 0x02, 0x21, - 0x08, 0x42, 0x05, 0xD0, 0x03, 0x48, 0xC0, 0x68, 0x09, 0x49, 0x08, 0x60, 0xF9, 0xF7, 0xD8, 0xFB, - 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x54, 0x03, 0x00, 0x20, 0x50, 0x03, 0x00, 0x20, - 0x58, 0x03, 0x00, 0x20, 0x2A, 0x03, 0x00, 0x20, 0x44, 0x03, 0x00, 0x20, 0x48, 0x03, 0x00, 0x20, - 0x4C, 0x03, 0x00, 0x20, 0x0E, 0xB5, 0x05, 0x20, 0xF8, 0xF7, 0xBA, 0xF9, 0xE1, 0x20, 0x40, 0x02, - 0x00, 0x90, 0x03, 0x20, 0x6B, 0x46, 0x18, 0x71, 0x00, 0x20, 0x58, 0x71, 0x98, 0x71, 0xD8, 0x71, - 0x69, 0x46, 0x01, 0x20, 0x00, 0x05, 0xF9, 0xF7, 0x91, 0xF8, 0x03, 0x4A, 0x41, 0x21, 0x01, 0x20, - 0x00, 0x05, 0xF9, 0xF7, 0x11, 0xF8, 0x0E, 0xBD, 0x21, 0xA5, 0x00, 0x00, 0x00, 0x29, 0x06, 0xD0, - 0x10, 0x4A, 0x12, 0x78, 0x03, 0x2A, 0x02, 0xD0, 0x00, 0x22, 0x0E, 0x4B, 0x1A, 0x70, 0x0E, 0x4A, - 0x12, 0x6A, 0x01, 0x23, 0x9B, 0x04, 0x9A, 0x43, 0x0B, 0x4B, 0x1A, 0x62, 0x1A, 0x46, 0x12, 0x6A, - 0xDB, 0x01, 0x9A, 0x43, 0x08, 0x4B, 0x1A, 0x62, 0x1A, 0x46, 0x12, 0x68, 0x80, 0x23, 0x9A, 0x43, - 0x05, 0x4B, 0x1A, 0x60, 0x1A, 0x46, 0x12, 0x68, 0xFF, 0x23, 0x01, 0x33, 0x9A, 0x43, 0x02, 0x4B, - 0x1A, 0x60, 0x70, 0x47, 0xCC, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x50, 0x30, 0xB5, 0x00, 0x22, - 0x55, 0x4B, 0xDB, 0x79, 0xDB, 0x06, 0x9B, 0x0F, 0x01, 0x2B, 0x01, 0xD1, 0x00, 0x20, 0x05, 0xE0, - 0x52, 0x4B, 0x1B, 0x78, 0x50, 0x4C, 0x65, 0x3C, 0x23, 0x70, 0x01, 0x20, 0x50, 0x4B, 0x1B, 0x88, - 0xDD, 0xB2, 0x03, 0x46, 0x40, 0x1C, 0x4C, 0x4C, 0x65, 0x3C, 0xE5, 0x54, 0x4C, 0x4B, 0x1B, 0x88, - 0x1D, 0x12, 0x03, 0x46, 0x40, 0x1C, 0xE5, 0x54, 0x4A, 0x4B, 0x1B, 0x78, 0x01, 0x2B, 0x02, 0xD1, - 0x02, 0x23, 0x48, 0x4C, 0x23, 0x70, 0x00, 0x21, 0x67, 0xE0, 0x01, 0x23, 0x8B, 0x40, 0x44, 0x4C, - 0x24, 0x88, 0x23, 0x42, 0x60, 0xD0, 0x40, 0x4B, 0xDB, 0x79, 0xDB, 0x06, 0x9B, 0x0F, 0x01, 0x2B, - 0x2A, 0xD1, 0x4B, 0x00, 0x40, 0x4C, 0x24, 0x68, 0xE3, 0x5A, 0xDD, 0xB2, 0x03, 0x46, 0x40, 0x1C, - 0x39, 0x4C, 0x65, 0x3C, 0xE5, 0x54, 0x4B, 0x00, 0x3B, 0x4C, 0x24, 0x68, 0xE3, 0x5A, 0x1B, 0x04, - 0x1D, 0x0E, 0x03, 0x46, 0x40, 0x1C, 0x34, 0x4C, 0x65, 0x3C, 0xE5, 0x54, 0x4B, 0x00, 0x37, 0x4C, - 0x24, 0x68, 0xE3, 0x5A, 0xDD, 0xB2, 0x03, 0x46, 0x40, 0x1C, 0x2F, 0x4C, 0x65, 0x3C, 0xE5, 0x54, - 0x4B, 0x00, 0x32, 0x4C, 0x24, 0x68, 0xE3, 0x5A, 0x1B, 0x04, 0x1D, 0x0E, 0x03, 0x46, 0x40, 0x1C, - 0x29, 0x4C, 0x65, 0x3C, 0xE5, 0x54, 0x2F, 0xE0, 0x4B, 0x00, 0x2B, 0x4C, 0x24, 0x68, 0xE3, 0x5A, - 0x1B, 0x04, 0x1D, 0x0E, 0x03, 0x46, 0x40, 0x1C, 0x23, 0x4C, 0x65, 0x3C, 0xE5, 0x54, 0x4B, 0x00, - 0x25, 0x4C, 0x24, 0x68, 0xE3, 0x5A, 0xDD, 0xB2, 0x03, 0x46, 0x40, 0x1C, 0x1E, 0x4C, 0x65, 0x3C, - 0xE5, 0x54, 0x4B, 0x00, 0x21, 0x4C, 0x24, 0x68, 0xE3, 0x5A, 0x1B, 0x04, 0x1D, 0x0E, 0x03, 0x46, - 0x40, 0x1C, 0x19, 0x4C, 0x65, 0x3C, 0xE5, 0x54, 0x4B, 0x00, 0x1C, 0x4C, 0x24, 0x68, 0xE3, 0x5A, - 0xDD, 0xB2, 0x03, 0x46, 0x40, 0x1C, 0x14, 0x4C, 0x65, 0x3C, 0xE5, 0x54, 0x18, 0x4B, 0x1B, 0x68, - 0x5D, 0x5C, 0x03, 0x46, 0x40, 0x1C, 0xE5, 0x54, 0x49, 0x1C, 0x16, 0x4B, 0x1B, 0x78, 0x99, 0x42, - 0x93, 0xDB, 0x0D, 0x4B, 0xDB, 0x79, 0xDB, 0x06, 0x9B, 0x0F, 0x0E, 0xD1, 0x01, 0x21, 0x05, 0xE0, - 0x09, 0x4B, 0x65, 0x3B, 0x5B, 0x5C, 0x9B, 0x18, 0xDA, 0xB2, 0x49, 0x1C, 0x81, 0x42, 0xF7, 0xDB, - 0x53, 0x42, 0xDA, 0xB2, 0x04, 0x4B, 0x65, 0x3B, 0x1A, 0x54, 0x01, 0x23, 0x0A, 0x4C, 0x23, 0x70, - 0x00, 0x23, 0x0A, 0x4C, 0x23, 0x70, 0x30, 0xBD, 0x21, 0x04, 0x00, 0x20, 0x56, 0x01, 0x00, 0x20, - 0x98, 0x00, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x20, 0xD8, 0x01, 0x00, 0x20, 0xDC, 0x01, 0x00, 0x20, - 0xE0, 0x01, 0x00, 0x20, 0x1E, 0x02, 0x00, 0x20, 0x9D, 0x00, 0x00, 0x20, 0xB1, 0x00, 0x00, 0x20, - 0x70, 0xB5, 0x1B, 0x48, 0x00, 0x24, 0x04, 0x5F, 0x1A, 0x48, 0x00, 0x26, 0x86, 0x5F, 0x1A, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x00, 0xD1, 0x70, 0xBD, 0xFE, 0xF7, 0xA0, 0xFF, 0x14, 0x49, 0x00, 0x20, - 0x08, 0x5E, 0xA0, 0x42, 0x03, 0xDD, 0x00, 0x20, 0x08, 0x5E, 0x00, 0x1B, 0x03, 0xE0, 0x10, 0x48, - 0x00, 0x21, 0x41, 0x5E, 0x60, 0x1A, 0x05, 0xB2, 0x10, 0x48, 0x00, 0x78, 0x85, 0x42, 0x01, 0xDD, - 0x00, 0x20, 0xE8, 0xE7, 0x0B, 0x49, 0x00, 0x20, 0x08, 0x5E, 0xB0, 0x42, 0x03, 0xDD, 0x00, 0x20, - 0x08, 0x5E, 0x80, 0x1B, 0x03, 0xE0, 0x07, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x70, 0x1A, 0x05, 0xB2, - 0x06, 0x48, 0x00, 0x78, 0x85, 0x42, 0x01, 0xDD, 0x00, 0x20, 0xD4, 0xE7, 0x01, 0x20, 0xD2, 0xE7, - 0x88, 0x01, 0x00, 0x20, 0x8A, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, - 0x00, 0x20, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x48, 0x22, 0x49, 0x08, 0x60, 0x00, 0x20, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, - 0x08, 0x80, 0x22, 0x49, 0x08, 0x80, 0x22, 0x48, 0x22, 0x49, 0x08, 0x80, 0x00, 0x20, 0x22, 0x49, - 0x08, 0x80, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, 0x08, 0x70, 0x22, 0x48, - 0x00, 0x78, 0x22, 0x49, 0x08, 0x70, 0x22, 0x48, 0x00, 0x78, 0x14, 0x21, 0x48, 0x43, 0x21, 0x49, - 0x08, 0x80, 0x21, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x1D, 0x48, 0x00, 0x78, 0x40, 0x00, - 0x14, 0x21, 0x48, 0x43, 0x1B, 0x49, 0x08, 0x80, 0x70, 0x47, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x20, - 0xED, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, 0xEF, 0x00, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, - 0xF0, 0x00, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, - 0x98, 0x3A, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x20, - 0xFF, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, - 0x03, 0x01, 0x00, 0x20, 0x06, 0x01, 0x00, 0x20, 0x08, 0x01, 0x00, 0x20, 0x09, 0x01, 0x00, 0x20, - 0x0C, 0x01, 0x00, 0x20, 0x0E, 0x01, 0x00, 0x20, 0x4D, 0x01, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, - 0x4A, 0x01, 0x00, 0x20, 0x16, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x10, 0xB5, 0xFF, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x07, 0xD1, 0xFE, 0x48, 0x00, 0x68, 0xFE, 0x49, 0x09, 0x88, 0x40, 0x1A, - 0xFB, 0x49, 0x08, 0x60, 0x0E, 0xE0, 0xFC, 0x48, 0x00, 0x78, 0x01, 0x28, 0x07, 0xD1, 0xF8, 0x48, - 0x00, 0x68, 0xF8, 0x49, 0x09, 0x88, 0x40, 0x1A, 0xF5, 0x49, 0x08, 0x60, 0x02, 0xE0, 0xF7, 0x48, - 0xF3, 0x49, 0x08, 0x60, 0xF2, 0x48, 0x00, 0x68, 0x00, 0x28, 0x0B, 0xDA, 0xEF, 0x48, 0x00, 0x78, - 0x01, 0x28, 0x01, 0xD1, 0xF2, 0x49, 0x08, 0x70, 0x01, 0x20, 0xEC, 0x49, 0x08, 0x70, 0xEF, 0x48, - 0xEB, 0x49, 0x08, 0x60, 0xEF, 0x48, 0x00, 0x78, 0x01, 0x28, 0x1C, 0xD1, 0xEE, 0x48, 0x00, 0x88, - 0xEE, 0x49, 0x09, 0x88, 0x88, 0x42, 0x7E, 0xD1, 0xED, 0x49, 0x00, 0x20, 0x08, 0x5E, 0xED, 0x49, - 0x09, 0x78, 0x88, 0x42, 0x07, 0xDC, 0xEB, 0x48, 0x00, 0x78, 0x40, 0x42, 0xEA, 0x49, 0x00, 0x22, - 0x8A, 0x5E, 0x90, 0x42, 0x6F, 0xDD, 0xFC, 0xF7, 0xF7, 0xFD, 0x00, 0x28, 0x6B, 0xD0, 0x01, 0x20, - 0xE6, 0x49, 0x08, 0x70, 0x10, 0xBD, 0xE6, 0x48, 0x00, 0x78, 0x01, 0x28, 0xE3, 0xD1, 0xE5, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x50, 0xD1, 0xE4, 0x48, 0x00, 0x78, 0x81, 0x00, 0x40, 0x18, 0x40, 0x1D, - 0xE2, 0x49, 0x09, 0x78, 0x88, 0x42, 0x1A, 0xDA, 0xE1, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, - 0xDF, 0x48, 0x00, 0x78, 0x01, 0x28, 0x08, 0xD1, 0x01, 0x20, 0xDD, 0x49, 0x08, 0x70, 0xDD, 0x48, - 0x00, 0x88, 0x40, 0x1C, 0xDB, 0x49, 0x08, 0x80, 0x36, 0xE0, 0xD9, 0x48, 0x00, 0x78, 0x02, 0x28, - 0x32, 0xD1, 0x00, 0x20, 0xD6, 0x49, 0x08, 0x70, 0xD6, 0x49, 0x08, 0x80, 0x2C, 0xE0, 0xD3, 0x48, - 0x00, 0x78, 0x81, 0x00, 0x40, 0x18, 0x40, 0x1D, 0xCF, 0x49, 0x09, 0x78, 0x88, 0x42, 0x1A, 0xDA, - 0xCF, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0xCD, 0x48, 0x00, 0x78, 0x02, 0x28, 0x08, 0xD1, - 0x02, 0x20, 0xCB, 0x49, 0x08, 0x70, 0xCB, 0x48, 0x00, 0x88, 0x40, 0x1C, 0xC9, 0x49, 0x08, 0x80, - 0x12, 0xE0, 0xC7, 0x48, 0x00, 0x78, 0x01, 0x28, 0x0E, 0xD1, 0x00, 0x20, 0xC4, 0x49, 0x08, 0x70, - 0xC4, 0x49, 0x08, 0x80, 0x08, 0xE0, 0xC3, 0x48, 0x00, 0x88, 0x00, 0x28, 0x04, 0xDD, 0xC1, 0x48, - 0x00, 0x88, 0x80, 0x1E, 0xBF, 0x49, 0x08, 0x80, 0xBE, 0x48, 0x00, 0x88, 0xFF, 0x21, 0x2D, 0x31, - 0x88, 0x42, 0x05, 0xDD, 0x01, 0x20, 0xB7, 0x49, 0x08, 0x70, 0x00, 0x20, 0xB9, 0x49, 0x08, 0x80, - 0xB4, 0x48, 0x00, 0x78, 0x00, 0xE0, 0xCD, 0xE0, 0x01, 0x28, 0x12, 0xD1, 0xB5, 0x48, 0x00, 0x88, - 0x40, 0x1C, 0xB4, 0x49, 0x08, 0x80, 0xB4, 0x48, 0x00, 0x78, 0x00, 0x28, 0x01, 0xD0, 0x00, 0x20, - 0x08, 0x80, 0xB0, 0x48, 0x00, 0x88, 0x50, 0x28, 0x03, 0xDD, 0x02, 0x20, 0xA7, 0x49, 0x08, 0x70, - 0x80, 0xE7, 0x9D, 0x48, 0x00, 0x78, 0x01, 0x28, 0x13, 0xD1, 0xAC, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x0F, 0xD1, 0x9F, 0x49, 0x08, 0x5E, 0xA0, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0xA8, 0x49, - 0x09, 0x78, 0x88, 0x42, 0x05, 0xDD, 0x01, 0x20, 0xA4, 0x49, 0x08, 0x70, 0xA5, 0x48, 0xA6, 0x49, - 0x08, 0x80, 0x97, 0x4B, 0x00, 0x22, 0x9A, 0x5E, 0x97, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0x12, 0x1B, - 0x94, 0x4B, 0x1B, 0x78, 0x5B, 0x00, 0x9A, 0x42, 0x7E, 0xDA, 0xA0, 0x4A, 0x11, 0x78, 0xCA, 0x17, - 0x92, 0x0F, 0x52, 0x18, 0x92, 0x10, 0x8E, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0B, 0xDA, - 0x9A, 0x4A, 0x10, 0x78, 0xC2, 0x17, 0x92, 0x0F, 0x12, 0x18, 0x92, 0x10, 0x52, 0x42, 0x8A, 0x4B, - 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x07, 0xDC, 0x95, 0x4A, 0x12, 0x68, 0x64, 0x2A, 0x03, 0xDB, - 0x7D, 0x4A, 0x12, 0x78, 0x01, 0x2A, 0x64, 0xD1, 0x8F, 0x48, 0x00, 0x88, 0x79, 0x49, 0x09, 0x88, - 0x40, 0x1A, 0x00, 0xB2, 0x8C, 0x49, 0x08, 0x80, 0x88, 0x48, 0x00, 0x78, 0x01, 0x28, 0x07, 0xD1, - 0x74, 0x48, 0x00, 0x88, 0xC0, 0x00, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x86, 0x49, 0x08, 0x80, - 0x85, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x02, 0xDC, 0x01, 0x20, 0x85, 0x49, 0x08, 0x70, - 0x84, 0x48, 0x00, 0x78, 0x01, 0x28, 0x55, 0xD1, 0x71, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x72, 0x49, - 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x80, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x6D, 0x49, - 0x09, 0x78, 0x49, 0x10, 0x88, 0x42, 0x0C, 0xDD, 0x7C, 0x48, 0x77, 0x49, 0x08, 0x80, 0x69, 0x48, - 0x00, 0x78, 0x40, 0x10, 0x78, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x76, 0x49, 0x08, 0x80, - 0x1C, 0xE0, 0x63, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x63, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, - 0x71, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x5E, 0x49, 0x09, 0x78, 0x49, 0x10, 0x49, 0x42, - 0x88, 0x42, 0x0B, 0xDA, 0x6D, 0x48, 0x68, 0x49, 0x08, 0x80, 0x5A, 0x48, 0x00, 0x78, 0x40, 0x10, - 0x69, 0x49, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x67, 0x49, 0x08, 0x80, 0x62, 0x48, 0x00, 0x21, - 0x41, 0x5E, 0x00, 0x29, 0x16, 0xDC, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x20, 0x53, 0x49, 0x08, 0x70, - 0xD8, 0xE6, 0x5E, 0x49, 0x08, 0x78, 0x4E, 0x4A, 0x00, 0x21, 0x51, 0x5E, 0x4E, 0x4A, 0x00, 0x23, - 0xD3, 0x5E, 0xC9, 0x1A, 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x91, 0x42, 0x02, 0xDA, 0x55, 0x48, - 0x55, 0x49, 0x08, 0x80, 0x4A, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0x41, 0x48, 0x00, 0x78, - 0x01, 0x28, 0x71, 0xD1, 0x50, 0x48, 0x00, 0x88, 0x3A, 0x49, 0x09, 0x88, 0x40, 0x1A, 0x00, 0xB2, - 0x4D, 0x49, 0x08, 0x80, 0x3E, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x3E, 0x49, 0x09, 0x78, 0x88, 0x42, - 0x07, 0xDC, 0x3C, 0x48, 0x00, 0x78, 0x40, 0x42, 0x3B, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, - 0x08, 0xDD, 0x30, 0x48, 0x00, 0x88, 0x40, 0x00, 0x43, 0x49, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, - 0x41, 0x49, 0x08, 0x80, 0x40, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x02, 0xDC, 0x01, 0x20, - 0x40, 0x49, 0x08, 0x70, 0x3F, 0x48, 0x00, 0x78, 0x01, 0x28, 0x46, 0xD1, 0x36, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x03, 0xD1, 0x3E, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0x64, 0x20, 0x36, 0x49, - 0x08, 0x80, 0x7B, 0xE0, 0x26, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x37, 0x49, 0x00, 0x22, 0x8A, 0x5E, - 0x80, 0x1A, 0x24, 0x49, 0x09, 0x78, 0x88, 0x42, 0x08, 0xDD, 0x2E, 0x48, 0x2E, 0x49, 0x08, 0x80, - 0x1F, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x30, 0x49, 0x08, 0x80, 0x67, 0xE0, 0x1C, 0x49, 0x00, 0x20, - 0x08, 0x5E, 0x2D, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x1A, 0x49, 0x09, 0x78, 0x49, 0x10, - 0x88, 0x42, 0x08, 0xDD, 0x29, 0x48, 0x24, 0x49, 0x08, 0x80, 0x15, 0x49, 0x00, 0x20, 0x08, 0x5E, - 0x25, 0x49, 0x08, 0x80, 0x52, 0xE0, 0x12, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x22, 0x49, 0x00, 0x22, - 0x8A, 0x5E, 0x80, 0x1A, 0x0F, 0x49, 0x09, 0x78, 0x49, 0x42, 0x88, 0x42, 0x46, 0xDA, 0x64, 0x20, - 0x19, 0x49, 0x08, 0x80, 0x0A, 0x49, 0x3D, 0xE0, 0xC0, 0xE0, 0x48, 0xE0, 0xEE, 0x00, 0x00, 0x20, - 0xF0, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x0B, 0x01, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, - 0xEF, 0x00, 0x00, 0x20, 0x14, 0x01, 0x00, 0x20, 0x98, 0x00, 0x00, 0x20, 0x9A, 0x00, 0x00, 0x20, - 0x8A, 0x01, 0x00, 0x20, 0x4D, 0x01, 0x00, 0x20, 0x88, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, - 0x0A, 0x01, 0x00, 0x20, 0x09, 0x01, 0x00, 0x20, 0x05, 0x01, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, - 0x08, 0x01, 0x00, 0x20, 0x06, 0x01, 0x00, 0x20, 0x3A, 0x01, 0x00, 0x20, 0x03, 0x01, 0x00, 0x20, - 0x4C, 0x01, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, - 0x10, 0x01, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x20, 0xB8, 0x0B, 0x00, 0x00, - 0x39, 0x01, 0x00, 0x20, 0x00, 0x20, 0x08, 0x5E, 0x53, 0x49, 0x08, 0x80, 0x53, 0x48, 0x00, 0x21, - 0x41, 0x5E, 0x00, 0x29, 0x03, 0xDC, 0x03, 0x20, 0x51, 0x49, 0x08, 0x70, 0x02, 0xE6, 0x51, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x11, 0xD1, 0x50, 0x48, 0x00, 0x88, 0x50, 0x49, 0x09, 0x88, 0x40, 0x18, - 0x00, 0xB2, 0x4D, 0x49, 0x08, 0x80, 0x00, 0x20, 0x08, 0x5E, 0x4D, 0x49, 0x88, 0x42, 0x04, 0xDB, - 0x00, 0x20, 0x48, 0x49, 0x08, 0x70, 0x4B, 0x49, 0x08, 0x70, 0x4B, 0x48, 0x00, 0x68, 0x81, 0x00, - 0x40, 0x18, 0x4A, 0x49, 0x09, 0x78, 0x40, 0x18, 0x49, 0x49, 0x09, 0x68, 0x88, 0x42, 0x11, 0xDA, - 0x48, 0x48, 0x00, 0x88, 0x41, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x45, 0x49, 0x08, 0x80, - 0x00, 0x20, 0x08, 0x5E, 0xFF, 0x21, 0xF5, 0x31, 0x88, 0x42, 0x06, 0xDB, 0x04, 0x20, 0x38, 0x49, - 0x08, 0x70, 0xCF, 0xE5, 0x00, 0x20, 0x3F, 0x49, 0x08, 0x80, 0x3F, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x03, 0xD1, 0x3E, 0x48, 0x00, 0x78, 0x00, 0x28, 0x4A, 0xD0, 0x3D, 0x48, 0x00, 0x88, 0x3D, 0x49, - 0x09, 0x88, 0x88, 0x42, 0x33, 0xD1, 0x3C, 0x48, 0x00, 0x21, 0x41, 0x56, 0x0A, 0x29, 0x04, 0xDA, - 0x00, 0x78, 0x40, 0x1C, 0x40, 0xB2, 0x38, 0x49, 0x08, 0x70, 0x38, 0x48, 0x00, 0x88, 0x2B, 0x49, - 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x35, 0x49, 0x08, 0x80, 0x26, 0x48, 0x00, 0x78, 0x01, 0x28, - 0x07, 0xD1, 0x26, 0x48, 0x00, 0x88, 0x80, 0x00, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x2F, 0x49, - 0x08, 0x80, 0x2E, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x2D, 0x49, 0x88, 0x42, 0x32, 0xDB, 0x1D, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x04, 0xD1, 0x1F, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x1D, 0x49, 0x08, 0x70, - 0x00, 0x20, 0x26, 0x49, 0x08, 0x80, 0x05, 0x20, 0x15, 0x49, 0x08, 0x70, 0x22, 0xE0, 0x22, 0x48, - 0x00, 0x21, 0x41, 0x56, 0x00, 0x29, 0x04, 0xDD, 0x00, 0x78, 0x40, 0x1E, 0x40, 0xB2, 0x1E, 0x49, - 0x08, 0x70, 0x1D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x14, 0xD1, 0x1C, 0x49, 0x08, 0x80, 0x11, 0xE0, - 0x1A, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x09, 0xDD, 0x0C, 0x48, 0x00, 0x88, 0x80, 0x00, - 0x16, 0x49, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x14, 0x49, 0x08, 0x80, 0x02, 0xE0, 0x00, 0x20, - 0x12, 0x49, 0x08, 0x80, 0x66, 0xE5, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x20, 0xFA, 0x00, 0x00, 0x20, - 0x02, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, - 0x30, 0x75, 0x00, 0x00, 0x01, 0x01, 0x00, 0x20, 0xE4, 0x00, 0x00, 0x20, 0x4D, 0x01, 0x00, 0x20, - 0xE8, 0x00, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x20, 0x3A, 0x01, 0x00, 0x20, 0x39, 0x01, 0x00, 0x20, - 0x98, 0x00, 0x00, 0x20, 0x9A, 0x00, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, - 0x98, 0x3A, 0x00, 0x00, 0xF0, 0xB5, 0x1B, 0x4A, 0x41, 0x00, 0x52, 0x5E, 0x19, 0x4E, 0x13, 0x46, - 0x09, 0x33, 0x10, 0x36, 0x13, 0x2B, 0x03, 0xD2, 0x00, 0x23, 0x17, 0x4C, 0x73, 0x52, 0x23, 0x54, - 0x01, 0x23, 0x15, 0x4D, 0x83, 0x40, 0x24, 0x3D, 0x2C, 0x7A, 0x1F, 0x46, 0x27, 0x42, 0x19, 0xD1, - 0x70, 0x5E, 0x19, 0x23, 0xDB, 0x01, 0x98, 0x42, 0x01, 0xDD, 0x00, 0x2A, 0x05, 0xDC, 0xFF, 0x23, - 0x01, 0x33, 0x98, 0x42, 0x0D, 0xDD, 0x00, 0x2A, 0x0B, 0xDA, 0x0A, 0x4A, 0x10, 0x3A, 0x13, 0x46, - 0x10, 0x3B, 0x50, 0x5A, 0x5B, 0x5A, 0xC0, 0x18, 0x00, 0x04, 0x40, 0x0C, 0x50, 0x52, 0x10, 0x20, - 0xE8, 0x71, 0xF0, 0xBD, 0x00, 0x22, 0x72, 0x52, 0x03, 0x49, 0x9C, 0x43, 0x0A, 0x54, 0x2C, 0x72, - 0xF0, 0xBD, 0x00, 0x00, 0xA0, 0x1A, 0x00, 0x20, 0x9C, 0x03, 0x00, 0x20, 0x00, 0xB5, 0x85, 0xB0, - 0x25, 0x48, 0x00, 0x78, 0x02, 0x28, 0x45, 0xDA, 0x24, 0x48, 0x00, 0x78, 0x00, 0x28, 0x41, 0xDD, - 0xFF, 0xF7, 0xEE, 0xFB, 0x00, 0x28, 0x3A, 0xD0, 0x20, 0x48, 0x00, 0x78, 0x04, 0x28, 0x19, 0xD1, - 0x1F, 0x48, 0x00, 0x78, 0x03, 0x28, 0x10, 0xDA, 0x01, 0x20, 0x1E, 0x49, 0x08, 0x70, 0x1C, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x01, 0xD0, 0x01, 0x20, 0x00, 0xE0, 0x00, 0x20, 0x1A, 0x49, 0x09, 0x88, - 0x48, 0x43, 0x00, 0xB2, 0x18, 0x49, 0x08, 0x80, 0x04, 0xE0, 0x00, 0x20, 0x15, 0x49, 0x08, 0x70, - 0x13, 0x49, 0x08, 0x70, 0x64, 0x20, 0x15, 0x49, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, - 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x11, 0x49, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xFF, 0x21, - 0x9F, 0x31, 0xA0, 0x20, 0x0D, 0x4B, 0xFA, 0xF7, 0xCB, 0xFA, 0x01, 0x20, 0xF7, 0xF7, 0xC8, 0xFA, - 0x00, 0xF0, 0xC6, 0xF8, 0x0A, 0x20, 0xF7, 0xF7, 0xC3, 0xFA, 0xF6, 0xF7, 0xE9, 0xFB, 0x00, 0x20, - 0x02, 0x49, 0x08, 0x70, 0x05, 0xB0, 0x00, 0xBD, 0xAB, 0x00, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, - 0x01, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, 0x8C, 0x05, 0x00, 0x20, - 0x10, 0xB5, 0x01, 0x20, 0xFC, 0xF7, 0xE4, 0xFC, 0x59, 0x20, 0x10, 0x49, 0x08, 0x60, 0x16, 0x20, - 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x0E, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, - 0x0B, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, 0x88, 0x43, 0x08, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, 0x05, 0x49, 0x08, 0x60, 0x00, 0x20, 0x03, 0x49, - 0x08, 0x60, 0x01, 0x20, 0xFC, 0xF7, 0xE2, 0xFC, 0x10, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x40, 0x00, 0x40, 0x01, 0x20, 0x01, 0x49, 0x08, 0x70, 0x70, 0x47, 0xAA, 0x00, 0x00, 0x20, - 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, 0x59, 0x20, 0x10, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, - 0x88, 0x20, 0x08, 0x60, 0x0E, 0x48, 0x00, 0x68, 0x08, 0x21, 0x88, 0x43, 0x08, 0x30, 0x0C, 0x49, - 0x08, 0x60, 0x0C, 0x48, 0x00, 0x78, 0x00, 0x28, 0x09, 0xD0, 0x00, 0x20, 0x09, 0x49, 0x08, 0x70, - 0x07, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x05, 0x49, 0x08, 0x60, 0x00, 0x20, - 0x02, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0xA9, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x40, 0x00, 0x40, 0xAA, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x04, 0x46, 0x01, 0x20, 0xFC, 0xF7, - 0x87, 0xFC, 0x01, 0x21, 0x08, 0x46, 0xFC, 0xF7, 0xBF, 0xFC, 0x59, 0x20, 0x21, 0x49, 0x08, 0x60, - 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x1F, 0x48, 0x80, 0x68, 0x40, 0x08, 0x40, 0x00, - 0x40, 0x1C, 0x1D, 0x49, 0x88, 0x60, 0x08, 0x46, 0x40, 0x69, 0x80, 0x08, 0x80, 0x00, 0xC0, 0x1C, - 0x48, 0x61, 0x1A, 0x48, 0x01, 0x68, 0x07, 0x20, 0x00, 0x02, 0x81, 0x43, 0x20, 0x02, 0x07, 0x22, - 0x12, 0x02, 0x10, 0x40, 0x01, 0x43, 0x15, 0x48, 0x01, 0x60, 0x00, 0x68, 0x02, 0x21, 0x88, 0x43, - 0x80, 0x1C, 0x12, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, - 0x0E, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, 0x40, 0x30, 0x0B, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, 0x88, 0x43, 0x80, 0x30, 0x07, 0x49, 0x08, 0x60, - 0xFF, 0xF7, 0x88, 0xFF, 0x00, 0x20, 0x03, 0x49, 0x08, 0x60, 0x01, 0x20, 0xFC, 0xF7, 0x5E, 0xFC, - 0x10, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x00, 0x02, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, - 0x00, 0xB5, 0x87, 0xB0, 0x0B, 0xA0, 0x00, 0x68, 0x06, 0x90, 0x00, 0x20, 0x05, 0x90, 0x03, 0x22, - 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x05, 0xA9, 0x01, 0x92, 0x00, 0x91, - 0x01, 0x22, 0x0B, 0x21, 0x49, 0x02, 0xA0, 0x20, 0x06, 0xAB, 0xFA, 0xF7, 0xE9, 0xF9, 0x07, 0xB0, - 0x00, 0xBD, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0xB5, 0x04, 0x46, 0x0B, 0x46, 0x00, 0x25, - 0x02, 0xE0, 0x5E, 0x5D, 0x66, 0x55, 0x6D, 0x1C, 0x95, 0x42, 0xFA, 0xDB, 0x70, 0xBD, 0x17, 0xB5, - 0x81, 0xB0, 0x04, 0x46, 0x0C, 0xE0, 0xF7, 0xF7, 0xBF, 0xF9, 0x03, 0xAA, 0x00, 0x92, 0x01, 0x22, - 0x21, 0x46, 0xA0, 0x20, 0x02, 0xAB, 0xFA, 0xF7, 0xB9, 0xFC, 0x01, 0x28, 0x00, 0xD1, 0x00, 0xE0, - 0xF1, 0xE7, 0x00, 0xBF, 0x1F, 0xBD, 0x30, 0xB4, 0x74, 0x46, 0x64, 0x1E, 0x25, 0x78, 0x64, 0x1C, - 0xAB, 0x42, 0x00, 0xD2, 0x1D, 0x46, 0x63, 0x5D, 0x5B, 0x00, 0xE3, 0x18, 0x30, 0xBC, 0x18, 0x47, - 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, 0x00, 0xBF, 0x0A, 0xE0, 0x48, 0x5D, 0x66, 0x5D, 0xB0, 0x42, - 0x03, 0xD1, 0x50, 0x5D, 0x66, 0x5D, 0xB0, 0x42, 0x01, 0xD0, 0x00, 0x20, 0x70, 0xBD, 0x6D, 0x1C, - 0x9D, 0x42, 0xF2, 0xDB, 0x01, 0x20, 0xF9, 0xE7, 0x30, 0xB5, 0x89, 0xB0, 0x00, 0x24, 0x00, 0xBF, - 0x00, 0x20, 0xFF, 0x49, 0x08, 0x70, 0x0A, 0x20, 0xFE, 0x49, 0x08, 0x70, 0x01, 0x22, 0x03, 0x21, - 0x08, 0x46, 0xF7, 0xF7, 0xC5, 0xFC, 0x03, 0x21, 0x08, 0x46, 0xF7, 0xF7, 0x7F, 0xFA, 0x01, 0x20, - 0xF9, 0x49, 0x08, 0x70, 0x07, 0xAA, 0x00, 0x92, 0x01, 0x22, 0xF8, 0x49, 0xA0, 0x20, 0x06, 0xAB, - 0xFA, 0xF7, 0xC2, 0xFA, 0x01, 0x28, 0x09, 0xD1, 0x6B, 0x46, 0x18, 0x7E, 0x00, 0x28, 0x05, 0xD0, - 0x18, 0x7E, 0xFF, 0x28, 0x02, 0xD0, 0x00, 0x20, 0xEF, 0x49, 0x08, 0x70, 0xEE, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x5E, 0xD0, 0x03, 0x21, 0x08, 0x46, 0xF7, 0xF7, 0xDC, 0xFC, 0x02, 0x20, 0xE9, 0x49, - 0x08, 0x70, 0xF7, 0xF7, 0x6D, 0xF9, 0x01, 0x20, 0x08, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, - 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xE4, 0x49, - 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x5C, 0xF9, 0x01, 0x20, 0x08, 0x90, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, - 0xDC, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x4B, 0xF9, 0x23, 0x20, 0x08, 0x90, 0x03, 0x22, - 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, - 0x01, 0x22, 0xD4, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x3A, 0xF9, 0x45, 0x20, 0x08, 0x90, - 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, - 0x00, 0x91, 0x01, 0x22, 0xCB, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x29, 0xF9, 0x67, 0x20, - 0x08, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, - 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xC3, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x18, 0xF9, - 0x0A, 0xE0, 0x00, 0x22, 0x01, 0x21, 0xBD, 0x48, 0x40, 0x1E, 0xFF, 0xF7, 0x38, 0xFF, 0x02, 0x20, - 0xF7, 0xF7, 0x0E, 0xF9, 0xFE, 0xF7, 0x18, 0xF9, 0xF7, 0xF7, 0xB8, 0xF8, 0x01, 0x21, 0x02, 0x20, - 0xF7, 0xF7, 0xF4, 0xF9, 0x01, 0x20, 0xF7, 0xF7, 0x03, 0xF9, 0x01, 0x21, 0x02, 0x20, 0xF7, 0xF7, - 0x69, 0xFC, 0x01, 0x20, 0xF7, 0xF7, 0xFC, 0xF8, 0xAF, 0x48, 0x00, 0x78, 0x00, 0x28, 0x32, 0xD0, - 0x80, 0x20, 0x08, 0x90, 0xF6, 0xF7, 0x3E, 0xF9, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x13, 0x21, 0x09, 0x02, - 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0xE4, 0xF8, 0x0A, 0x20, 0xF7, 0xF7, 0xE1, 0xF8, 0x03, 0x22, - 0xA5, 0x48, 0x01, 0x68, 0xA5, 0x48, 0x00, 0x68, 0x02, 0xAB, 0x07, 0xC3, 0x01, 0x22, 0x00, 0x21, - 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x9D, 0x49, 0xA0, 0x20, 0x00, 0x23, 0xFA, 0xF7, 0xD0, 0xF8, - 0x00, 0x20, 0x9F, 0x49, 0x08, 0x70, 0x9D, 0x48, 0x00, 0x68, 0x00, 0x78, 0x20, 0x28, 0x28, 0xD1, - 0x01, 0x20, 0x08, 0x70, 0x25, 0xE0, 0x00, 0x22, 0x01, 0x21, 0x94, 0x48, 0x40, 0x1E, 0xFF, 0xF7, - 0xE6, 0xFE, 0xF5, 0xF7, 0xEE, 0xF9, 0x06, 0x90, 0x6B, 0x46, 0x18, 0x7E, 0x00, 0x28, 0x07, 0xD1, - 0x40, 0x20, 0x06, 0x90, 0x8A, 0x48, 0x00, 0x78, 0x02, 0x21, 0x08, 0x43, 0x88, 0x49, 0x08, 0x70, - 0x6B, 0x46, 0x1A, 0x7E, 0x11, 0x46, 0x89, 0x48, 0xFF, 0xF7, 0xD1, 0xFE, 0x02, 0x20, 0x85, 0x49, - 0x08, 0x70, 0xF7, 0xF7, 0x67, 0xF8, 0x0D, 0x20, 0xFD, 0xF7, 0xFA, 0xFF, 0x01, 0x20, 0x88, 0x49, - 0x08, 0x70, 0xFF, 0xF7, 0xED, 0xFD, 0x7E, 0x48, 0x00, 0x78, 0x04, 0x21, 0x08, 0x43, 0x7C, 0x49, - 0x08, 0x70, 0x00, 0x20, 0x07, 0x90, 0x11, 0xE0, 0xF9, 0xF7, 0x80, 0xF9, 0x3E, 0x28, 0x06, 0xD1, - 0x77, 0x48, 0x00, 0x78, 0x04, 0x21, 0x88, 0x43, 0x75, 0x49, 0x08, 0x70, 0x0A, 0xE0, 0xF7, 0xF7, - 0x5D, 0xF8, 0x6B, 0x46, 0x18, 0x7F, 0x40, 0x1C, 0xC0, 0xB2, 0x07, 0x90, 0x6B, 0x46, 0x18, 0x7F, - 0x32, 0x28, 0xE9, 0xDB, 0x00, 0xBF, 0x05, 0x20, 0x6E, 0x49, 0x08, 0x70, 0x75, 0x48, 0x00, 0x78, - 0xC9, 0x28, 0x08, 0xD1, 0x74, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0D, 0xD0, 0x73, 0x49, 0x74, 0x48, - 0x00, 0xF0, 0xA6, 0xF9, 0x08, 0xE0, 0x70, 0x48, 0x00, 0x78, 0x00, 0x28, 0x04, 0xD0, 0x4F, 0x21, - 0x49, 0x01, 0x70, 0x48, 0x00, 0xF0, 0x9C, 0xF9, 0x6B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x3D, 0xD1, - 0x05, 0x20, 0xF7, 0xF7, 0x5D, 0xF8, 0x0D, 0x20, 0xFD, 0xF7, 0xB2, 0xFF, 0x0A, 0x20, 0xF7, 0xF7, - 0x57, 0xF8, 0x65, 0x20, 0xFD, 0xF7, 0xAC, 0xFF, 0x0A, 0x20, 0xF7, 0xF7, 0x51, 0xF8, 0x20, 0x20, - 0xFD, 0xF7, 0xA6, 0xFF, 0x0A, 0x20, 0xF7, 0xF7, 0x4B, 0xF8, 0x30, 0x20, 0xFD, 0xF7, 0xA0, 0xFF, - 0x0A, 0x20, 0xF7, 0xF7, 0x45, 0xF8, 0x36, 0x20, 0xFD, 0xF7, 0x9A, 0xFF, 0x0A, 0x20, 0xF7, 0xF7, - 0x3F, 0xF8, 0x31, 0x20, 0xFD, 0xF7, 0x94, 0xFF, 0x0A, 0x20, 0xF7, 0xF7, 0x39, 0xF8, 0x30, 0x20, - 0xFD, 0xF7, 0x8E, 0xFF, 0x0A, 0x20, 0xF7, 0xF7, 0x33, 0xF8, 0x57, 0x48, 0x80, 0x68, 0x01, 0x21, - 0x49, 0x02, 0x88, 0x43, 0x54, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, - 0x88, 0x43, 0x51, 0x49, 0x88, 0x60, 0x0D, 0x20, 0xFD, 0xF7, 0x7A, 0xFF, 0x02, 0x20, 0xFF, 0xF7, - 0xCB, 0xFD, 0x3F, 0x48, 0x00, 0x78, 0x08, 0x21, 0x08, 0x43, 0x3D, 0x49, 0x08, 0x70, 0x00, 0x20, - 0x07, 0x90, 0x11, 0xE0, 0xF9, 0xF7, 0x02, 0xF9, 0x21, 0x28, 0x06, 0xD1, 0x38, 0x48, 0x00, 0x78, - 0x08, 0x21, 0x88, 0x43, 0x36, 0x49, 0x08, 0x70, 0x0A, 0xE0, 0xF6, 0xF7, 0xDF, 0xFF, 0x6B, 0x46, - 0x18, 0x7F, 0x40, 0x1C, 0xC0, 0xB2, 0x07, 0x90, 0x6B, 0x46, 0x18, 0x7F, 0x14, 0x28, 0xE9, 0xDB, - 0x00, 0xBF, 0x3D, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x3A, 0x49, 0x88, 0x60, - 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x37, 0x49, 0x88, 0x60, 0x03, 0x22, - 0x2D, 0x48, 0x01, 0x68, 0x2D, 0x48, 0x00, 0x68, 0x02, 0xAB, 0x07, 0xC3, 0x01, 0x22, 0x00, 0x21, - 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0xFF, 0x21, 0x9E, 0x31, 0xA0, 0x20, 0x00, 0x23, 0xF9, 0xF7, - 0xDF, 0xFF, 0x26, 0x48, 0x00, 0x68, 0x00, 0x78, 0x40, 0x06, 0x40, 0x0E, 0x55, 0x28, 0x06, 0xD1, - 0x21, 0x48, 0x00, 0x68, 0x00, 0x78, 0x40, 0x06, 0x40, 0x0E, 0x55, 0x28, 0x05, 0xD0, 0x18, 0x48, - 0x00, 0x78, 0x10, 0x21, 0x08, 0x43, 0x16, 0x49, 0x08, 0x70, 0x15, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x13, 0xDD, 0x60, 0x1C, 0xC4, 0xB2, 0x02, 0x2C, 0x03, 0xDA, 0x01, 0x20, 0x1A, 0x49, 0x08, 0x70, - 0x1E, 0xE6, 0x09, 0xE0, 0x1D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x05, 0xD0, 0x1C, 0x48, 0x00, 0x7C, - 0x02, 0x28, 0x01, 0xD1, 0xFA, 0xF7, 0x12, 0xFD, 0xF4, 0xE7, 0x10, 0x48, 0x00, 0x68, 0x00, 0x78, - 0x80, 0x21, 0x08, 0x42, 0x0B, 0xD0, 0x0D, 0x48, 0x00, 0x68, 0x00, 0x78, 0x08, 0x42, 0x06, 0xD0, - 0x13, 0x48, 0x25, 0x30, 0x80, 0x79, 0x00, 0x06, 0xC0, 0x0F, 0x01, 0x28, 0x29, 0xD1, 0x21, 0xE0, - 0xDC, 0x00, 0x00, 0x20, 0xDD, 0x00, 0x00, 0x20, 0xAE, 0x00, 0x00, 0x20, 0x22, 0x15, 0x00, 0x00, - 0x03, 0x13, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, - 0xAF, 0x00, 0x00, 0x20, 0x40, 0x01, 0x00, 0x20, 0xA5, 0x00, 0x00, 0x20, 0x83, 0x04, 0x00, 0x00, - 0xDA, 0xC4, 0x00, 0x00, 0xFA, 0xBA, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xA2, 0x00, 0x00, 0x20, - 0xFC, 0x03, 0x00, 0x20, 0x32, 0x48, 0x00, 0x78, 0x05, 0x28, 0x02, 0xDD, 0x05, 0x20, 0x30, 0x49, - 0x08, 0x70, 0x00, 0x21, 0x08, 0x46, 0xF8, 0xF7, 0x95, 0xFF, 0xF5, 0xF7, 0xF1, 0xFB, 0x08, 0x90, - 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x29, 0x48, 0x01, 0x68, - 0x29, 0x48, 0x01, 0x92, 0x00, 0x91, 0x08, 0xAB, 0x1A, 0x78, 0xFF, 0x21, 0x02, 0x31, 0x05, 0x68, - 0xA0, 0x20, 0x2B, 0x46, 0xF9, 0xF7, 0x5C, 0xFF, 0x24, 0x48, 0x00, 0x78, 0x22, 0x49, 0x09, 0x68, - 0x08, 0x70, 0x23, 0x48, 0x00, 0x78, 0x20, 0x49, 0x09, 0x68, 0x48, 0x70, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x1B, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, - 0x02, 0x22, 0xFF, 0x21, 0x9C, 0x31, 0x03, 0x68, 0xA0, 0x20, 0xF9, 0xF7, 0x41, 0xFF, 0x17, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x1B, 0xD0, 0xDD, 0x20, 0x13, 0x49, 0x09, 0x68, 0x08, 0x70, 0x14, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0x00, 0x20, 0x0F, 0x49, 0x09, 0x68, 0x08, 0x70, 0x03, 0x22, - 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x0B, 0x48, 0x01, 0x68, 0x01, 0x92, - 0x00, 0x91, 0x01, 0x22, 0x0B, 0x49, 0x03, 0x68, 0xA0, 0x20, 0xF9, 0xF7, 0x21, 0xFF, 0xF6, 0xF7, - 0xCD, 0xFE, 0xFF, 0xF7, 0x1D, 0xFD, 0x01, 0x20, 0xF6, 0xF7, 0x1A, 0xFF, 0x09, 0xB0, 0x30, 0xBD, - 0x1E, 0x02, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0xAE, 0x00, 0x00, 0x20, - 0xAF, 0x00, 0x00, 0x20, 0x21, 0x15, 0x00, 0x00, 0x10, 0xB5, 0x00, 0x20, 0x00, 0xF0, 0x00, 0xF9, - 0x39, 0xE0, 0xFF, 0xF7, 0x7F, 0xFC, 0xF5, 0xF7, 0xE1, 0xFF, 0x02, 0x20, 0xFD, 0xF7, 0x22, 0xFA, - 0xFF, 0xF7, 0xFE, 0xFC, 0xF6, 0xF7, 0xE8, 0xFE, 0x17, 0x48, 0x00, 0x78, 0x00, 0x28, 0x27, 0xD1, - 0xFD, 0xF7, 0x94, 0xFF, 0x04, 0x46, 0xFA, 0xF7, 0xD3, 0xFD, 0x01, 0x20, 0xFD, 0xF7, 0x12, 0xFA, - 0xFC, 0xF7, 0x88, 0xFF, 0x11, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x04, 0xD1, 0x00, 0x2C, 0x17, 0xD1, - 0xFA, 0xF7, 0xF8, 0xF8, 0x17, 0xE0, 0x0D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x10, 0xD1, 0xFA, 0xF7, - 0xF9, 0xFC, 0x00, 0x2C, 0x0C, 0xD1, 0xF6, 0xF7, 0xC3, 0xFB, 0xF9, 0xF7, 0xA1, 0xFE, 0xFE, 0xF7, - 0x19, 0xFE, 0xFE, 0xF7, 0x18, 0xFE, 0xFD, 0xF7, 0x45, 0xF9, 0xFC, 0xF7, 0x7D, 0xFB, 0x02, 0xE0, - 0xFD, 0xF7, 0x40, 0xF9, 0x00, 0xBF, 0xC4, 0xE7, 0x12, 0x02, 0x00, 0x20, 0x40, 0x01, 0x00, 0x20, - 0xF3, 0xB5, 0x81, 0xB0, 0x04, 0x46, 0x65, 0x20, 0xFD, 0xF7, 0x1A, 0xFE, 0x61, 0x26, 0x36, 0x01, - 0x25, 0x46, 0x06, 0x21, 0x02, 0x98, 0xF4, 0xF7, 0xD1, 0xFC, 0x87, 0xB2, 0x2A, 0x46, 0x39, 0x46, - 0x30, 0x46, 0x00, 0xF0, 0x51, 0xF8, 0x20, 0x20, 0xFD, 0xF7, 0x0A, 0xFE, 0xF0, 0x19, 0x86, 0xB2, - 0x2C, 0x46, 0xED, 0x19, 0x2A, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x45, 0xF8, 0x30, 0x20, - 0xFD, 0xF7, 0xFE, 0xFD, 0xF0, 0x19, 0x86, 0xB2, 0xED, 0x19, 0x2A, 0x46, 0x39, 0x46, 0x30, 0x46, - 0x00, 0xF0, 0x3A, 0xF8, 0x36, 0x20, 0xFD, 0xF7, 0xF3, 0xFD, 0xF0, 0x19, 0x86, 0xB2, 0xED, 0x19, - 0x2A, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x2F, 0xF8, 0x31, 0x20, 0xFD, 0xF7, 0xE8, 0xFD, - 0xF0, 0x19, 0x86, 0xB2, 0xED, 0x19, 0x2A, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x24, 0xF8, - 0x30, 0x20, 0xFD, 0xF7, 0xDD, 0xFD, 0xF0, 0x19, 0x86, 0xB2, 0xED, 0x19, 0xB8, 0x00, 0x38, 0x18, - 0x02, 0x9A, 0x10, 0x1A, 0x81, 0xB2, 0x2A, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x15, 0xF8, 0x09, 0x48, - 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x06, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, - 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x03, 0x49, 0x88, 0x60, 0x0D, 0x20, 0xFD, 0xF7, 0xC0, 0xFD, - 0xFE, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xF0, 0xB5, 0x87, 0xB0, 0x04, 0x46, 0x0D, 0x46, - 0x16, 0x46, 0x00, 0x27, 0x27, 0x48, 0x06, 0x90, 0x27, 0x48, 0x05, 0x90, 0x00, 0xBF, 0x27, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x00, 0xD0, 0x41, 0xE0, 0x0A, 0xE0, 0x78, 0x1C, 0xC7, 0xB2, 0x03, 0x2F, - 0x06, 0xD1, 0x22, 0x48, 0x00, 0x78, 0x01, 0x21, 0x08, 0x43, 0x20, 0x49, 0x08, 0x70, 0x0E, 0xE0, - 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x03, 0x91, 0x33, 0x46, 0x00, 0x96, 0x04, 0x92, 0x01, 0x91, - 0x2A, 0x46, 0x21, 0x46, 0xA0, 0x20, 0xF9, 0xF7, 0x3B, 0xFE, 0x01, 0x28, 0xE5, 0xD1, 0x00, 0xBF, - 0x0A, 0xE0, 0x78, 0x1C, 0xC7, 0xB2, 0x03, 0x2F, 0x06, 0xD1, 0x14, 0x48, 0x00, 0x78, 0x01, 0x21, - 0x08, 0x43, 0x12, 0x49, 0x08, 0x70, 0x10, 0xE0, 0x03, 0x22, 0x06, 0x99, 0x05, 0x98, 0x04, 0x92, - 0x02, 0x91, 0x03, 0x90, 0x00, 0x21, 0x0A, 0x46, 0x01, 0x95, 0x00, 0x91, 0x21, 0x46, 0xA0, 0x20, - 0x00, 0x23, 0xF9, 0xF7, 0x1D, 0xFE, 0x01, 0x28, 0xE3, 0xD1, 0x00, 0xBF, 0x2B, 0x46, 0x30, 0x46, - 0x05, 0x9A, 0x06, 0x99, 0xFF, 0xF7, 0x5C, 0xFC, 0x00, 0x28, 0xB8, 0xD0, 0x00, 0xBF, 0x07, 0xB0, - 0xF0, 0xBD, 0x00, 0x00, 0x48, 0x07, 0x00, 0x20, 0x94, 0x10, 0x00, 0x20, 0xDC, 0x00, 0x00, 0x20, - 0x10, 0xB5, 0x04, 0x46, 0x00, 0x2C, 0x06, 0xD0, 0x01, 0x2C, 0x07, 0xD0, 0x02, 0x2C, 0x06, 0xD0, - 0x03, 0x2C, 0x17, 0xD1, 0x0E, 0xE0, 0xFB, 0xF7, 0x33, 0xF8, 0x00, 0xBF, 0x00, 0xBF, 0xFF, 0xF7, - 0x47, 0xFB, 0xFC, 0xF7, 0xFB, 0xFD, 0xFD, 0xF7, 0x37, 0xF9, 0xFA, 0xF7, 0xE9, 0xFA, 0xFE, 0xF7, - 0xD9, 0xFD, 0x00, 0xBF, 0x02, 0x20, 0xFF, 0xF7, 0x97, 0xFB, 0xFF, 0xF7, 0x45, 0xFC, 0xFE, 0xF7, - 0xE3, 0xFB, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, 0x4F, 0xCE, 0x00, 0x50, 0x20, 0x03, - 0xA7, 0x00, 0x08, 0x8C, 0x00, 0x5C, 0x26, 0xF8, 0x8E, 0x00, 0xFE, 0xBD, 0x0C, 0xC5, 0x20, 0xFE, - 0x3C, 0xCC, 0x0F, 0xB4, 0xCE, 0x00, 0x00, 0xED, 0x10, 0xCC, 0x0F, 0xBC, 0xED, 0x12, 0xCC, 0x0F, - 0xCE, 0xED, 0x14, 0xCC, 0x0F, 0xDA, 0xED, 0x16, 0xCC, 0x0F, 0xE1, 0xED, 0x18, 0xCC, 0x0F, 0xE8, - 0xED, 0x1C, 0xC6, 0x03, 0xCE, 0x10, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x01, 0xE7, 0x02, 0xE7, 0x03, - 0xE7, 0x04, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xE7, 0x01, 0xCC, 0x3A, 0x98, 0xED, 0x02, 0xCC, 0x00, - 0xFF, 0xED, 0x04, 0x5F, 0xED, 0x06, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x04, 0xED, 0x01, 0x5F, - 0xCE, 0x13, 0x00, 0xE7, 0x01, 0xC6, 0x09, 0xE7, 0x03, 0xC6, 0x80, 0xCE, 0x14, 0x00, 0xE7, 0x00, - 0xC6, 0x50, 0xE7, 0x01, 0x5F, 0xED, 0x02, 0xE7, 0x04, 0xC6, 0x54, 0xCE, 0x15, 0x00, 0xE7, 0x00, - 0x5F, 0xE7, 0x15, 0x86, 0x02, 0xED, 0x1C, 0x4C, 0xED, 0x1E, 0xE7, 0x20, 0xCE, 0x16, 0x00, 0xE7, - 0x00, 0xE7, 0x01, 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xE7, 0x05, 0x5C, 0xE7, 0x06, 0x5F, 0xE7, - 0x07, 0x07, 0x84, 0x7F, 0x06, 0x38, 0x39, 0x3C, 0xFE, 0x00, 0x5A, 0xF6, 0x01, 0x9C, 0x26, 0x3C, - 0xEC, 0x00, 0x04, 0x04, 0xED, 0x00, 0xEC, 0x02, 0x04, 0x04, 0xED, 0x02, 0xEC, 0x04, 0x04, 0x04, - 0xED, 0x04, 0xEC, 0x06, 0x04, 0x04, 0xED, 0x06, 0xEC, 0x08, 0x04, 0x04, 0xED, 0x08, 0xEC, 0x0A, - 0x04, 0x04, 0xED, 0x0A, 0xEC, 0x0C, 0x04, 0x04, 0xED, 0x0C, 0xEC, 0x0E, 0x04, 0x04, 0xED, 0x0E, - 0xEC, 0x10, 0x04, 0x04, 0xED, 0x10, 0xEC, 0x12, 0x04, 0x04, 0xED, 0x12, 0x18, 0xFE, 0x00, 0x58, - 0x18, 0xEC, 0x00, 0xA3, 0x00, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, - 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x4B, 0x18, 0xEC, 0x02, 0xA3, 0x02, 0x2C, 0x03, 0x5F, 0x20, 0x0A, - 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x4A, 0x18, 0xEC, 0x04, 0xA3, - 0x04, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, - 0xD7, 0x49, 0x18, 0xEC, 0x06, 0xA3, 0x06, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, - 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x48, 0x18, 0xEC, 0x08, 0xA3, 0x08, 0x2C, 0x03, 0x5F, - 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x47, 0x18, 0xEC, - 0x0A, 0xA3, 0x0A, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, - 0xC6, 0xFF, 0xD7, 0x46, 0x18, 0xEC, 0x0C, 0xA3, 0x0C, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, - 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x45, 0x18, 0xEC, 0x0E, 0xA3, 0x0E, 0x2C, - 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x44, - 0x18, 0xEC, 0x10, 0xA3, 0x10, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, - 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x43, 0x18, 0xEC, 0x12, 0xA3, 0x12, 0x2C, 0x03, 0x5F, 0x20, 0x0A, - 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x42, 0xD6, 0x4B, 0xFE, 0x00, - 0x50, 0xE7, 0x00, 0x08, 0xFF, 0x00, 0x50, 0xFE, 0x00, 0x56, 0xD6, 0x4A, 0xD0, 0x4B, 0xE7, 0x00, - 0xD6, 0x49, 0xD0, 0x4B, 0xE7, 0x01, 0xD6, 0x48, 0xD0, 0x4B, 0xE7, 0x02, 0xD6, 0x47, 0xD0, 0x4B, - 0xE7, 0x03, 0xD6, 0x46, 0xD0, 0x4B, 0xE7, 0x04, 0xD6, 0x45, 0xD0, 0x4B, 0xE7, 0x05, 0xD6, 0x44, - 0xD0, 0x4B, 0xE7, 0x06, 0xD6, 0x43, 0xD0, 0x4B, 0xE7, 0x07, 0xD6, 0x42, 0xD0, 0x4B, 0xE7, 0x08, - 0xD6, 0x36, 0x5A, 0x4F, 0xF3, 0x00, 0x56, 0xFD, 0x00, 0x56, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x14, - 0xFD, 0x00, 0x5A, 0xFC, 0x00, 0x58, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x58, 0x7A, 0x00, 0x35, 0x27, - 0x03, 0x7E, 0x06, 0xBE, 0x38, 0x39, 0x3C, 0xFE, 0x00, 0x5A, 0x18, 0xFE, 0x00, 0x58, 0xF6, 0x01, - 0x9C, 0x5A, 0x26, 0x4C, 0xEC, 0x00, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x00, 0xEC, 0x02, 0xC3, 0x02, - 0x00, 0x18, 0xED, 0x02, 0xEC, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x04, 0xEC, 0x06, 0xC3, 0x02, - 0x00, 0x18, 0xED, 0x06, 0xEC, 0x08, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x08, 0xEC, 0x0A, 0xC3, 0x02, - 0x00, 0x18, 0xED, 0x0A, 0xEC, 0x0C, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0C, 0xEC, 0x0E, 0xC3, 0x02, - 0x00, 0x18, 0xED, 0x0E, 0xEC, 0x10, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x10, 0xEC, 0x12, 0x20, 0x5E, - 0xEC, 0x00, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x00, 0xEC, 0x02, 0x04, 0x04, 0xC3, 0x02, - 0x00, 0x18, 0xED, 0x02, 0xEC, 0x04, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x04, 0xEC, 0x06, - 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x06, 0xEC, 0x08, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, - 0xED, 0x08, 0xEC, 0x0A, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0A, 0xEC, 0x0C, 0x04, 0x04, - 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0C, 0xEC, 0x0E, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0E, - 0xEC, 0x10, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x10, 0xEC, 0x12, 0x04, 0x04, 0xC3, 0x02, - 0x00, 0x18, 0xED, 0x12, 0xFC, 0x00, 0x58, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x58, 0xFC, 0x00, 0x5A, - 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x5A, 0x7A, 0x00, 0x35, 0x27, 0x03, 0x7E, 0x08, 0x4D, 0x38, 0x39, - 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x24, 0x04, 0xBD, 0x08, 0x4C, 0x39, 0xBD, 0x06, 0xBD, 0x39, 0x3C, - 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x86, 0xE7, 0x19, 0xF6, 0x01, 0x87, - 0xE7, 0x1A, 0xF6, 0x01, 0x88, 0xE7, 0x1B, 0xF6, 0x01, 0x89, 0xE7, 0x16, 0xF6, 0x01, 0x8A, 0xE7, - 0x17, 0xF6, 0x01, 0x8B, 0xE7, 0x18, 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x2F, 0xF6, - 0x01, 0x81, 0xB6, 0x01, 0x84, 0x3D, 0xD7, 0x2E, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x83, 0x3D, 0xD7, - 0x2D, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x84, 0x3D, 0xD7, 0x2C, 0xF6, 0x01, 0x81, 0x86, 0x14, 0x3D, - 0xDD, 0x2A, 0xF6, 0x01, 0x82, 0x86, 0x14, 0x3D, 0xDD, 0x28, 0xF6, 0x01, 0x81, 0xFB, 0x01, 0x82, - 0xD7, 0x27, 0x7D, 0x01, 0x84, 0x27, 0x03, 0x78, 0x00, 0x27, 0xF6, 0x01, 0x92, 0xC1, 0x0A, 0x24, - 0x05, 0xC6, 0x0A, 0xF7, 0x01, 0x92, 0x38, 0x39, 0x01, 0x01, 0xCF, 0x7D, 0x01, 0x9F, 0x26, 0xFB, - 0x39, 0x3C, 0xF6, 0x01, 0x90, 0x54, 0x54, 0xD7, 0x22, 0xB6, 0x01, 0x8F, 0x5F, 0xFB, 0x01, 0x8E, - 0x89, 0x00, 0xDD, 0x23, 0x5F, 0xD7, 0x25, 0xDC, 0x23, 0xDD, 0x39, 0x5F, 0xD7, 0x31, 0x13, 0x3A, - 0x01, 0x03, 0x7C, 0x00, 0x25, 0x74, 0x00, 0x39, 0x76, 0x00, 0x3A, 0xC1, 0x08, 0x24, 0x13, 0xCE, - 0x4C, 0xC0, 0x58, 0x3A, 0x4F, 0x5F, 0xED, 0x00, 0xCE, 0x4C, 0xF0, 0xD6, 0x31, 0x58, 0x3A, 0x5F, - 0xED, 0x00, 0x7C, 0x00, 0x31, 0xD6, 0x31, 0xC1, 0x0A, 0x25, 0xD3, 0x38, 0x39, 0x3C, 0xCE, 0x00, - 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xD6, 0x25, 0x27, 0x1F, 0xF6, 0x01, - 0x8C, 0x5A, 0x26, 0x19, 0xF6, 0x01, 0x91, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xC6, 0x03, 0xE7, 0x15, - 0xCC, 0x15, 0xEC, 0xED, 0x1E, 0xCC, 0x01, 0x7D, 0xED, 0x1C, 0x1C, 0x15, 0x80, 0xC6, 0x01, 0xCE, - 0x16, 0x00, 0xE7, 0x00, 0x38, 0x39, 0x3C, 0xCC, 0x05, 0xEC, 0xFD, 0x00, 0x5A, 0xDC, 0x23, 0xDD, - 0x39, 0x5F, 0xD7, 0x3F, 0xD7, 0x31, 0x13, 0x3A, 0x01, 0x21, 0x4F, 0x05, 0xF3, 0x00, 0x5A, 0x8F, - 0xEC, 0x00, 0xDD, 0x3B, 0x7D, 0x01, 0x9C, 0x26, 0x04, 0x04, 0x04, 0xDD, 0x3B, 0xCE, 0x4C, 0xD0, - 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x58, 0x3A, 0xDC, 0x3B, 0xED, 0x00, 0x74, 0x00, 0x39, 0x76, 0x00, - 0x3A, 0x7C, 0x00, 0x31, 0xD6, 0x31, 0xC1, 0x0A, 0x25, 0xCC, 0x7D, 0x01, 0x9D, 0x27, 0x05, 0xFC, - 0x4C, 0xC0, 0x26, 0x02, 0x38, 0x39, 0xCC, 0x4C, 0xC0, 0xFD, 0x00, 0x5A, 0x5F, 0xD7, 0x31, 0x20, - 0x64, 0xFE, 0x00, 0x5A, 0xEC, 0x10, 0xDD, 0x3B, 0xD6, 0x20, 0x27, 0x0E, 0xEC, 0x00, 0xD3, 0x3B, - 0x04, 0xED, 0x00, 0x4F, 0x5F, 0xED, 0x30, 0x7A, 0x00, 0x20, 0xEC, 0x00, 0x93, 0x3B, 0xDD, 0x37, - 0xEC, 0x20, 0xD8, 0x38, 0x98, 0x37, 0xDD, 0x33, 0xDC, 0x37, 0xED, 0x20, 0xDC, 0x33, 0x2F, 0x13, - 0xD6, 0x22, 0x4F, 0x1A, 0x93, 0x37, 0x2D, 0x04, 0xD3, 0x37, 0x2C, 0x07, 0xEC, 0x30, 0xC3, 0x00, - 0x01, 0x20, 0x02, 0x4F, 0x5F, 0xED, 0x30, 0x83, 0x00, 0x03, 0x22, 0x08, 0xF6, 0x01, 0x90, 0x4F, - 0x93, 0x37, 0x2C, 0x03, 0x7C, 0x00, 0x21, 0x7C, 0x00, 0x31, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x02, - 0xFD, 0x00, 0x5A, 0xD6, 0x31, 0xD1, 0x25, 0x25, 0x98, 0x38, 0x39, 0x3C, 0x37, 0x36, 0x30, 0x18, - 0xCE, 0x10, 0x00, 0x18, 0xE6, 0x03, 0xC4, 0x0C, 0xC1, 0x0C, 0x26, 0xF7, 0xE6, 0x01, 0x18, 0xE7, - 0x05, 0x38, 0x38, 0x39, 0x3C, 0xC6, 0x07, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x16, 0xE7, 0x00, - 0xC6, 0x25, 0xE7, 0x00, 0xC6, 0x34, 0xE7, 0x00, 0x38, 0x39, 0xD6, 0x27, 0xD7, 0x35, 0xF6, 0x01, - 0x9C, 0xD7, 0x3D, 0xC6, 0x01, 0xF7, 0x01, 0x9C, 0xBD, 0x08, 0x4C, 0xD6, 0x3D, 0xF7, 0x01, 0x9C, - 0x39, 0x3C, 0x5F, 0xD7, 0x3F, 0xD7, 0x41, 0x20, 0x73, 0xFE, 0x00, 0x54, 0x3A, 0xE6, 0x00, 0xD7, - 0x3D, 0xC1, 0x04, 0x23, 0x16, 0xC1, 0xFC, 0x24, 0x12, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, - 0x3F, 0x3A, 0xD6, 0x3D, 0xE7, 0x00, 0x7C, 0x00, 0x41, 0x20, 0x51, 0xC6, 0x01, 0xD7, 0x3E, 0x20, - 0x35, 0xFE, 0x00, 0x54, 0x3A, 0xE6, 0x00, 0xD7, 0x3D, 0xC1, 0x04, 0x23, 0x26, 0xC1, 0xFC, 0x24, - 0x22, 0xD6, 0x3E, 0xC1, 0x01, 0x23, 0x2A, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, - 0xC6, 0x01, 0xE7, 0x00, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, 0xD6, 0x3E, 0xE7, - 0x00, 0x20, 0x19, 0x7C, 0x00, 0x3E, 0x7C, 0x00, 0x41, 0xD6, 0x41, 0xD1, 0x30, 0x25, 0xC2, 0x20, - 0xD0, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, 0x6F, 0x00, 0xD6, 0x41, 0xD1, 0x30, - 0x25, 0x87, 0xD6, 0x3F, 0x4F, 0xF3, 0x00, 0x52, 0xFD, 0x00, 0x52, 0xD6, 0x30, 0x4F, 0xF3, 0x00, - 0x54, 0xFD, 0x00, 0x54, 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, 0x00, 0x64, 0xED, 0x00, 0x1A, 0xEE, - 0x00, 0x83, 0x00, 0x01, 0xED, 0x00, 0x18, 0x8C, 0x00, 0x01, 0x22, 0xF2, 0x38, 0x38, 0x39, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x39, 0x3C, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x8C, 0xC1, - 0x01, 0x26, 0x05, 0xBD, 0x09, 0xAE, 0x20, 0x1F, 0x8D, 0xE5, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, - 0xF7, 0x8D, 0xDC, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, 0xF7, 0xC6, 0x01, 0xE7, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x38, 0x39, 0x3C, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, - 0xD7, 0x3F, 0x01, 0x1F, 0x02, 0x01, 0x05, 0x7C, 0x00, 0x3F, 0xD6, 0x3F, 0xC1, 0x03, 0x25, 0xF2, - 0x38, 0x39, 0x3C, 0x7D, 0x01, 0x8C, 0x26, 0x18, 0x7D, 0x01, 0x9B, 0x26, 0x09, 0xC6, 0x01, 0xCE, - 0x15, 0x00, 0xE7, 0x21, 0x8D, 0x99, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xBD, 0x0B, 0xDC, - 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, 0x44, 0x00, 0xFD, 0x00, 0x50, 0xD6, 0x27, 0x4F, 0xC3, 0x44, - 0x00, 0xFD, 0x00, 0x52, 0x4F, 0x5F, 0xDD, 0x33, 0xF3, 0x00, 0x52, 0x18, 0x8F, 0x18, 0xE6, 0x00, - 0xD7, 0x3D, 0xF1, 0x01, 0x92, 0x23, 0x13, 0x4F, 0xED, 0x00, 0xC6, 0xFF, 0xF0, 0x01, 0x92, 0x82, - 0x00, 0xA3, 0x00, 0x2F, 0x05, 0x7C, 0x00, 0x21, 0x20, 0x13, 0xD6, 0x3D, 0x5A, 0x26, 0x09, 0xDC, - 0x33, 0xC3, 0x00, 0x01, 0xDD, 0x33, 0x20, 0x08, 0xD6, 0x3D, 0x5C, 0x26, 0x03, 0x38, 0x38, 0x39, - 0xDC, 0x33, 0xC3, 0x00, 0x01, 0xDD, 0x33, 0x1A, 0x83, 0x02, 0x30, 0x2D, 0xBB, 0x20, 0xEE, 0x3C, - 0x0F, 0xBD, 0x06, 0x26, 0x0E, 0x5F, 0xF7, 0x01, 0x9F, 0xCE, 0x16, 0x00, 0xE7, 0x05, 0x5C, 0xE7, - 0x03, 0xC6, 0xFF, 0xE7, 0x04, 0xCE, 0x15, 0x00, 0xE6, 0x00, 0xC4, 0x80, 0xCA, 0x55, 0xF7, 0x01, - 0x9D, 0xCC, 0x00, 0x21, 0xBD, 0x0B, 0x01, 0xBD, 0x0B, 0xDC, 0xBD, 0x09, 0xAE, 0xBD, 0x09, 0x35, - 0xBD, 0x09, 0xB7, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xBD, 0x0B, 0x1A, 0x5F, 0xF7, 0x01, 0x9E, - 0xD7, 0x26, 0xF7, 0x01, 0x9D, 0xCE, 0x00, 0x00, 0xE7, 0xFF, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, - 0xF6, 0x01, 0x85, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x46, 0x30, 0xFD, 0x00, 0x58, 0xCC, 0x4A, - 0x90, 0xFD, 0x00, 0x56, 0xCC, 0x01, 0xA0, 0xFD, 0x00, 0x5A, 0xCC, 0x4A, 0x90, 0xFD, 0x00, 0x54, - 0xCC, 0x44, 0x00, 0xFD, 0x00, 0x50, 0xD6, 0x27, 0x4F, 0xC3, 0x44, 0x00, 0xFD, 0x00, 0x52, 0x5F, - 0xD7, 0x21, 0x7D, 0x01, 0x9B, 0x26, 0x14, 0xF6, 0x01, 0x9D, 0x5A, 0x26, 0x0E, 0x7D, 0x01, 0x8C, - 0x26, 0x09, 0xBD, 0x0B, 0xDC, 0x5F, 0xCE, 0x15, 0x00, 0xE7, 0x21, 0xBD, 0x09, 0xAE, 0xF6, 0x01, - 0x9D, 0x27, 0x49, 0x5A, 0x27, 0x0B, 0x5A, 0x27, 0x13, 0x5A, 0x27, 0x2A, 0x5A, 0x27, 0x2A, 0x20, - 0x99, 0xCE, 0x14, 0x00, 0x1D, 0x00, 0x80, 0xBD, 0x0C, 0x48, 0x20, 0x30, 0xD7, 0x26, 0x7D, 0x01, - 0x8C, 0x26, 0x07, 0xC6, 0xAF, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xC6, 0x01, 0xF7, 0x01, 0x9D, 0xC6, - 0x04, 0xD7, 0x20, 0x7E, 0x0D, 0x10, 0xBD, 0x0C, 0x48, 0x5F, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0x7F, - 0x01, 0x9D, 0xC6, 0x35, 0xCE, 0x10, 0x00, 0xE7, 0x05, 0x7E, 0x0D, 0x10, 0xBD, 0x0B, 0xFB, 0x5F, - 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x23, 0x0B, 0xBD, 0x0B, 0x30, 0xC6, - 0x03, 0xF7, 0x01, 0x9E, 0x7E, 0x0D, 0x10, 0xCC, 0x01, 0x01, 0xCE, 0x15, 0x00, 0xED, 0x1C, 0xCC, - 0x11, 0xA0, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, - 0x5F, 0xE7, 0xFF, 0x7D, 0x01, 0x84, 0x26, 0x03, 0x7E, 0x0E, 0xB2, 0xCE, 0x15, 0x00, 0x1C, 0x15, - 0x04, 0xEC, 0x1E, 0xD3, 0x2A, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, - 0x00, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, 0x2F, - 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, - 0xFA, 0x5F, 0xE7, 0xFF, 0xBD, 0x0B, 0xFB, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, - 0x85, 0xC8, 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, - 0x2A, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x84, 0xD7, 0x36, - 0xBD, 0x09, 0x26, 0xD6, 0x2E, 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0xCE, 0x00, 0x00, - 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xBD, 0x0B, 0xFB, 0xCE, 0x15, 0x00, 0x1C, - 0x15, 0x04, 0xEC, 0x1E, 0xD3, 0x28, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0x5F, 0xCE, 0x16, 0x00, 0xE7, - 0x00, 0xF6, 0x01, 0x82, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, 0x2D, - 0xF0, 0x01, 0x82, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0xBD, 0x0A, 0x03, 0xF6, 0x01, 0x82, 0xD7, 0x35, - 0xF6, 0x01, 0x84, 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, 0x2C, 0x20, 0x41, 0xF6, 0x01, 0x85, 0xC8, - 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, 0x2A, 0xED, - 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x09, - 0x26, 0xD6, 0x2F, 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0xBD, 0x0A, 0x03, 0xF6, 0x01, - 0x82, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, 0x2D, 0xF0, 0x01, 0x82, - 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0x7D, 0x00, 0x25, 0x27, 0x15, 0xF6, 0x01, 0x8C, 0x5A, 0x26, 0x0F, - 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xBD, 0x0A, 0x3C, 0xF6, - 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x24, 0x15, 0xD6, 0x27, - 0x4F, 0xC3, 0x44, 0x00, 0xFD, 0x00, 0x52, 0xC6, 0xFF, 0xFE, 0x00, 0x52, 0xE7, 0x00, 0x7C, 0x01, - 0x9E, 0x20, 0x6F, 0xC6, 0xFF, 0xFE, 0x00, 0x52, 0xE7, 0x00, 0xF6, 0x01, 0x9D, 0xC1, 0x01, 0x26, - 0x61, 0xCE, 0x14, 0x00, 0x1C, 0x00, 0x80, 0x7C, 0x00, 0x26, 0xBD, 0x0C, 0x68, 0xBD, 0x0C, 0x2F, - 0x7D, 0x01, 0x8C, 0x26, 0x1A, 0x5F, 0xD7, 0x3F, 0xCE, 0x16, 0x00, 0x1E, 0x02, 0x01, 0x05, 0x7C, - 0x00, 0x21, 0x20, 0x16, 0x7C, 0x00, 0x3F, 0xD6, 0x3F, 0xC1, 0x0A, 0x25, 0xEE, 0x20, 0x0B, 0xD6, - 0x21, 0x27, 0x07, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xD6, 0x21, 0x26, 0x06, 0xD6, 0x26, - 0xC1, 0xC8, 0x23, 0x11, 0xCC, 0x00, 0x35, 0xBD, 0x0B, 0x01, 0xBD, 0x0B, 0xDC, 0xD6, 0x26, 0x4F, - 0xBD, 0x0B, 0x01, 0xD6, 0x26, 0xC1, 0xC8, 0x22, 0x03, 0x7E, 0x0D, 0x10, 0x5F, 0xD7, 0x26, 0x7E, - 0x0D, 0x10, 0xBD, 0x0C, 0x2F, 0xCC, 0x00, 0x35, 0xBD, 0x0B, 0x01, 0x7E, 0x0D, 0x10, 0xC6, 0xFF, - 0xCE, 0x16, 0x00, 0xE7, 0x04, 0x3B, 0xCE, 0x11, 0x00, 0x1F, 0x00, 0x08, 0x03, 0x1C, 0x00, 0x04, - 0x1F, 0x00, 0x20, 0x03, 0x1C, 0x00, 0x20, 0x3B, 0xCE, 0x15, 0x00, 0x1C, 0x00, 0x02, 0xCE, 0x00, - 0x00, 0x6C, 0xFF, 0x3B, 0xCE, 0x14, 0x00, 0x1C, 0x00, 0x14, 0x3B, 0x5F, 0xCE, 0x10, 0x00, 0xE7, - 0x04, 0x3B, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0x3B, 0x3B, 0x4F, 0xCE, 0x00, 0x50, 0x20, 0x03, - 0xA7, 0x00, 0x08, 0x8C, 0x00, 0x5C, 0x26, 0xF8, 0x8E, 0x00, 0xFE, 0xBD, 0x08, 0x7B, 0x20, 0xFE, - 0x3C, 0xCC, 0x0A, 0x57, 0xCE, 0x00, 0x00, 0xED, 0x10, 0xCC, 0x0A, 0x5F, 0xED, 0x12, 0xCC, 0x0A, - 0x71, 0xED, 0x14, 0xCC, 0x0A, 0x7D, 0xED, 0x16, 0xCC, 0x0A, 0x84, 0xED, 0x18, 0xCC, 0x0A, 0x8B, - 0xED, 0x1C, 0xC6, 0x03, 0xCE, 0x10, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x01, 0xE7, 0x02, 0xE7, 0x03, - 0xE7, 0x04, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xE7, 0x01, 0xCC, 0x00, 0xFF, 0xED, 0x02, 0xED, 0x04, - 0x5F, 0xED, 0x06, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x04, 0xED, 0x01, 0x5F, 0xCE, 0x13, 0x00, - 0xE7, 0x01, 0xC6, 0x09, 0xE7, 0x03, 0xC6, 0x80, 0xCE, 0x14, 0x00, 0xE7, 0x00, 0xC6, 0x50, 0xE7, - 0x01, 0x5F, 0xED, 0x02, 0xE7, 0x04, 0xC6, 0x54, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x15, - 0x86, 0x02, 0xED, 0x1C, 0x4C, 0xED, 0x1E, 0xE7, 0x20, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xE7, 0x01, - 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xE7, 0x05, 0x5C, 0xE7, 0x06, 0x5F, 0xE7, 0x07, 0x07, 0x84, - 0x7F, 0x06, 0x38, 0x39, 0x3C, 0x20, 0x77, 0xFE, 0x00, 0x5A, 0xEC, 0x00, 0xFE, 0x00, 0x58, 0xED, - 0x00, 0xFE, 0x00, 0x5A, 0xEC, 0x02, 0xFE, 0x00, 0x58, 0xED, 0x02, 0xFE, 0x00, 0x5A, 0xEC, 0x04, - 0xFE, 0x00, 0x58, 0xED, 0x04, 0xFE, 0x00, 0x5A, 0xEC, 0x06, 0xFE, 0x00, 0x58, 0xED, 0x06, 0xFE, - 0x00, 0x5A, 0xEC, 0x08, 0xFE, 0x00, 0x58, 0xED, 0x08, 0xFE, 0x00, 0x5A, 0xEC, 0x0A, 0xFE, 0x00, - 0x58, 0xED, 0x0A, 0xFE, 0x00, 0x5A, 0xEC, 0x0C, 0xFE, 0x00, 0x58, 0xED, 0x0C, 0xFE, 0x00, 0x5A, - 0xEC, 0x0E, 0xFE, 0x00, 0x58, 0xED, 0x0E, 0xFE, 0x00, 0x5A, 0xEC, 0x10, 0xFE, 0x00, 0x58, 0xED, - 0x10, 0xFE, 0x00, 0x5A, 0xEC, 0x12, 0xFE, 0x00, 0x58, 0xED, 0x12, 0xD6, 0x32, 0x4F, 0x05, 0xF3, - 0x00, 0x58, 0xFD, 0x00, 0x58, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x5A, 0xD6, 0x31, - 0x7A, 0x00, 0x31, 0x5D, 0x26, 0x81, 0x38, 0x39, 0x3C, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, - 0x00, 0xF6, 0x01, 0x86, 0xE7, 0x19, 0xF6, 0x01, 0x87, 0xE7, 0x1A, 0xF6, 0x01, 0x88, 0xE7, 0x1B, - 0xF6, 0x01, 0x89, 0xE7, 0x16, 0xF6, 0x01, 0x8A, 0xE7, 0x17, 0xF6, 0x01, 0x8B, 0xE7, 0x18, 0xF6, - 0x01, 0x81, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x2B, 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x84, 0x3D, 0xD7, - 0x2A, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x29, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x84, - 0x3D, 0xD7, 0x28, 0xF6, 0x01, 0x81, 0x86, 0x14, 0x3D, 0xDD, 0x26, 0xF6, 0x01, 0x82, 0x86, 0x14, - 0x3D, 0xDD, 0x24, 0xF6, 0x01, 0x81, 0xFB, 0x01, 0x82, 0xD7, 0x23, 0x7D, 0x01, 0x84, 0x27, 0x03, - 0x78, 0x00, 0x23, 0x38, 0x39, 0x01, 0x01, 0xCF, 0x7D, 0x01, 0x9F, 0x26, 0xFB, 0x39, 0xB6, 0x01, - 0x8F, 0x5F, 0xFB, 0x01, 0x8E, 0x89, 0x00, 0xDD, 0x20, 0x5F, 0xD7, 0x22, 0xDC, 0x20, 0xDD, 0x35, - 0x5F, 0xD7, 0x2D, 0x13, 0x36, 0x01, 0x03, 0x7C, 0x00, 0x22, 0x74, 0x00, 0x35, 0x76, 0x00, 0x36, - 0x7C, 0x00, 0x2D, 0xD6, 0x2D, 0xC1, 0x0A, 0x25, 0xEA, 0x39, 0x3C, 0x37, 0x36, 0x30, 0x18, 0xCE, - 0x10, 0x00, 0x18, 0xE6, 0x03, 0xC4, 0x0C, 0xC1, 0x0C, 0x26, 0xF7, 0xE6, 0x01, 0x18, 0xE7, 0x05, - 0x38, 0x38, 0x39, 0x3C, 0xC6, 0x07, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x16, 0xE7, 0x00, 0xC6, - 0x25, 0xE7, 0x00, 0xC6, 0x34, 0xE7, 0x00, 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, 0x00, 0x32, 0xED, - 0x00, 0x1A, 0xEE, 0x00, 0x83, 0x00, 0x01, 0xED, 0x00, 0x18, 0x8C, 0x00, 0x01, 0x22, 0xF2, 0x38, - 0x38, 0x39, 0x01, 0x01, 0x01, 0x01, 0x01, 0x39, 0x3C, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, - 0x01, 0x8C, 0xC1, 0x01, 0x26, 0x05, 0xBD, 0x07, 0xAB, 0x20, 0x1F, 0x8D, 0xE5, 0xCE, 0x16, 0x00, - 0x1F, 0x02, 0x01, 0xF7, 0x8D, 0xDC, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, 0xF7, 0xC6, 0x01, 0xE7, - 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x38, 0x39, 0x3C, 0x5F, 0xCE, 0x16, - 0x00, 0xE7, 0x00, 0xD7, 0x3B, 0x01, 0x1F, 0x02, 0x01, 0x05, 0x7C, 0x00, 0x3B, 0xD6, 0x3B, 0xC1, - 0x03, 0x25, 0xF2, 0x38, 0x39, 0x3C, 0x0F, 0xBD, 0x06, 0x26, 0x0E, 0x5F, 0xF7, 0x01, 0x9F, 0xCE, - 0x16, 0x00, 0xE7, 0x05, 0x5C, 0xE7, 0x03, 0xC6, 0xFF, 0xE7, 0x04, 0xCE, 0x15, 0x00, 0xE6, 0x00, - 0xC4, 0x80, 0xCA, 0x55, 0xF7, 0x01, 0x9D, 0xCC, 0x00, 0x21, 0xBD, 0x07, 0xE0, 0xBD, 0x08, 0x0F, - 0xBD, 0x07, 0xAB, 0xBD, 0x07, 0x3E, 0xBD, 0x07, 0xB4, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xBD, - 0x07, 0xF9, 0x5F, 0xF7, 0x01, 0x9E, 0xCE, 0x00, 0x00, 0xE7, 0xFF, 0xF6, 0x01, 0x85, 0xCE, 0x15, - 0x00, 0xE7, 0x15, 0xCC, 0x46, 0x30, 0xFD, 0x00, 0x58, 0xCC, 0x01, 0xA0, 0xFD, 0x00, 0x5A, 0xBD, - 0x07, 0xAB, 0xBD, 0x08, 0x2E, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xCC, 0x01, 0x01, 0xCE, 0x15, - 0x00, 0xED, 0x1C, 0xCC, 0x11, 0xA0, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xCE, 0x00, 0x00, 0xE6, 0xFF, - 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0x7D, 0x01, 0x84, 0x26, 0x03, 0x7E, 0x09, 0xC2, 0xCE, - 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, 0x1E, 0xD3, 0x26, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, - 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0xD7, 0x32, 0xBD, 0x06, 0xBA, 0xCE, 0x00, 0x00, 0xE6, 0xFF, - 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x85, 0xC8, 0x01, 0xCE, 0x15, 0x00, 0xE7, - 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, 0x26, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, - 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x84, 0xD7, 0x32, 0xBD, 0x06, 0xBA, 0xCE, 0x00, 0x00, 0xE6, - 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xCE, 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, 0x1E, - 0xD3, 0x24, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x82, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0xD7, - 0x32, 0xBD, 0x06, 0xBA, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, - 0xF6, 0x01, 0x82, 0xD7, 0x31, 0xF6, 0x01, 0x84, 0xD7, 0x32, 0xBD, 0x06, 0xBA, 0xC6, 0x01, 0xCE, - 0x16, 0x00, 0xE7, 0x00, 0xD6, 0x22, 0x26, 0x03, 0x7E, 0x0A, 0x4B, 0xF6, 0x01, 0x8C, 0x5A, 0x26, - 0xF7, 0xF6, 0x01, 0x91, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xC6, 0x03, 0xE7, 0x15, 0xCC, 0x15, 0xEC, - 0xED, 0x1E, 0xCC, 0x01, 0x7D, 0xED, 0x1C, 0x1C, 0x15, 0x80, 0x20, 0x3B, 0xF6, 0x01, 0x85, 0xC8, - 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, 0x26, 0xED, - 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0xD7, 0x32, 0xBD, 0x06, - 0xBA, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x82, - 0xD7, 0x31, 0xF6, 0x01, 0x83, 0x20, 0x91, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xF7, - 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xCC, 0x05, 0xEC, 0xFD, 0x00, - 0x5A, 0xDC, 0x20, 0xDD, 0x35, 0x5F, 0xD7, 0x3B, 0xD7, 0x2D, 0x13, 0x36, 0x01, 0x18, 0xCE, 0x4C, - 0xD0, 0xD6, 0x3B, 0x7C, 0x00, 0x3B, 0x58, 0x3A, 0x3C, 0xD6, 0x2D, 0x4F, 0x05, 0xF3, 0x00, 0x5A, - 0x8F, 0xEC, 0x00, 0x38, 0xED, 0x00, 0x74, 0x00, 0x35, 0x76, 0x00, 0x36, 0x7C, 0x00, 0x2D, 0xD6, - 0x2D, 0xC1, 0x0A, 0x25, 0xD5, 0xBD, 0x08, 0x62, 0xCC, 0x00, 0x35, 0xBD, 0x07, 0xE0, 0x7E, 0x08, - 0xC1, 0xC6, 0xFF, 0xCE, 0x16, 0x00, 0xE7, 0x04, 0x3B, 0xCE, 0x11, 0x00, 0x1F, 0x00, 0x08, 0x03, - 0x1C, 0x00, 0x04, 0x1F, 0x00, 0x20, 0x03, 0x1C, 0x00, 0x20, 0x3B, 0xCE, 0x15, 0x00, 0x1C, 0x00, - 0x02, 0xCE, 0x00, 0x00, 0x6C, 0xFF, 0x3B, 0xCE, 0x14, 0x00, 0x1C, 0x00, 0x14, 0x3B, 0x5F, 0xCE, - 0x10, 0x00, 0xE7, 0x04, 0x3B, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0x3B, 0x3B, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x05, 0x0D, 0x09, 0x04, 0xA1, 0x01, 0x85, 0x01, 0x09, 0x22, 0xA1, 0x02, 0x09, 0x42, 0x15, 0x00, - 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, - 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, - 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, - 0x09, 0x31, 0x45, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, - 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, - 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, - 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, - 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0x05, 0x0D, 0x09, 0x54, 0x95, 0x01, 0x75, 0x08, 0x15, - 0x00, 0x25, 0x05, 0x81, 0x02, 0x85, 0x02, 0x09, 0x55, 0xB1, 0x02, 0xC0, 0x9C, 0x02, 0x00, 0x00, - 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x51, 0xC2, 0x01, 0x1C, 0x00, 0x01, 0x01, 0x02, - 0x03, 0x01, 0x00, 0x00, 0x09, 0x02, 0x22, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00, - 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x09, 0x21, 0x00, 0x01, 0x00, 0x01, 0x22, 0x9C, 0x02, 0x07, - 0x05, 0x81, 0x03, 0x40, 0x00, 0x04, 0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x10, 0x03, 0x4E, 0x00, - 0x55, 0x00, 0x56, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x4F, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x57, 0x00, 0x50, 0x00, 0x4D, 0x00, - 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1A, 0x03, 0x42, 0x00, 0x30, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, - 0x30, 0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00, 0x35, 0x00, 0x31, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x20, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xAC, 0x03, 0x00, 0x00, 0xA2, 0x04, 0x00, 0x00, - 0xF0, 0xCE, 0x00, 0x00, 0xAC, 0x03, 0x00, 0x20, 0x74, 0x1B, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, - 0x11, 0x45, 0x80, 0x51, 0x01, 0x16, 0x23, 0x1B, 0xB7, 0x32, 0x80, 0x19, 0x10, 0x4B, 0x10, 0x27, - 0x08, 0x10, 0x11, 0x47, 0x54, 0x38, 0x31, 0x58, 0x4E, 0x49, 0x5F, 0x31, 0x52, 0x30, 0x35, 0x5F, - 0x31, 0x37, 0x35, 0x13, 0x02, 0x04, 0x26, 0x02, 0x58, 0x0A, 0x4D, 0x01, 0x25, 0x26, 0x02, 0x08, - 0x19, 0x22, 0x1A, 0x36, 0x88, 0x88, 0x88, 0x03, 0x13, 0x28, 0x0C, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x01, 0xF9, 0x10, 0x11, 0x04, 0x26, 0x3C, 0x64, 0x50, 0x19, - 0x2C, 0x01, 0xA7, 0x02, 0x28, 0x08, 0x12, 0x3C, 0xBA, 0x28, 0x08, 0x01, 0x44, 0x23, 0xE8, 0x03, - 0x02, 0x62, 0x64, 0xDA, 0x80, 0xE8, 0x69, 0x0C, 0x32, 0x81, 0x02, 0x14, 0x40, 0x22, 0x05, 0x23, - 0xA9, 0x3C, 0x73, 0x5D, 0x3B, 0x22, 0x01, 0x1A, 0x89, 0x10, 0x91, 0x19, 0xB7, 0xB9, 0x10, 0x19, - 0x51, 0xAA, 0x8D, 0x10, 0x31, 0xAA, 0xA5, 0x10, 0x22, 0x0A, 0xAA, 0xA1, 0x10, 0x22, 0x0B, 0xB3, - 0x69, 0x3D, 0x22, 0x06, 0x23, 0x65, 0x54, 0x23, 0xBD, 0x53, 0x1A, 0x51, 0x08, 0x11, 0x22, 0x09, - 0x9A, 0xE1, 0x30, 0x1A, 0x20, 0x10, 0x9B, 0xB1, 0x55, 0x10, 0x19, 0x50, 0xAA, 0x95, 0x10, 0x19, - 0x50, 0xAA, 0xAD, 0x10, 0x19, 0xB0, 0x9A, 0x79, 0x10, 0x23, 0x43, 0x56, 0x1A, 0xB5, 0x10, 0x1A, - 0x02, 0x38, 0x01, 0x60, 0x55, 0x82, 0x82, 0x82, 0x83, 0x04, 0x14, 0x0D, 0x08, 0x02, 0x00, 0x00, diff --git a/drivers/input/touchscreen/gt819_fw.i b/drivers/input/touchscreen/gt819_fw.i index 1cb087f96c65..d9599ac1fa0b 100755 --- a/drivers/input/touchscreen/gt819_fw.i +++ b/drivers/input/touchscreen/gt819_fw.i @@ -1,23 +1,23 @@ - 0x38, 0x1F, 0x00, 0x20, 0x79, 0x02, 0x00, 0x00, 0x9F, 0x02, 0x00, 0x00, 0xA1, 0x02, 0x00, 0x00, + 0xD8, 0x1E, 0x00, 0x20, 0x79, 0x02, 0x00, 0x00, 0x9F, 0x02, 0x00, 0x00, 0xA1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x02, 0x00, 0x00, 0xA7, 0x02, 0x00, 0x00, - 0x89, 0x09, 0x00, 0x00, 0x8D, 0xA6, 0x00, 0x00, 0x8D, 0x39, 0x00, 0x00, 0xB1, 0x39, 0x00, 0x00, - 0x8D, 0x41, 0x00, 0x00, 0xC9, 0x41, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, + 0x65, 0x0A, 0x00, 0x00, 0xFD, 0xA2, 0x00, 0x00, 0xB9, 0x36, 0x00, 0x00, 0xDD, 0x36, 0x00, 0x00, + 0xB9, 0x3E, 0x00, 0x00, 0xF5, 0x3E, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, - 0xFD, 0x99, 0x00, 0x00, 0x1D, 0x9A, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, - 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0x49, 0x58, 0x00, 0x00, - 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0x3D, 0x9A, 0x00, 0x00, + 0x99, 0x96, 0x00, 0x00, 0xB9, 0x96, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, + 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xE1, 0x53, 0x00, 0x00, + 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xD9, 0x96, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, - 0xE9, 0x74, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, + 0xC9, 0x6F, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0xA9, 0x02, 0x00, 0x00, 0x00, 0xF0, 0x02, 0xF8, 0x00, 0xF0, 0x32, 0xF8, 0x0C, 0xA0, 0x30, 0xC8, 0x08, 0x38, 0x24, 0x18, 0x2D, 0x18, 0xA2, 0x46, 0x67, 0x1E, 0xAB, 0x46, 0x54, 0x46, 0x5D, 0x46, 0xAC, 0x42, 0x01, 0xD1, 0x00, 0xF0, 0x24, 0xF8, 0x7E, 0x46, 0x0F, 0x3E, 0x0F, 0xCC, 0xB6, 0x46, 0x01, 0x26, 0x33, 0x42, - 0x00, 0xD0, 0xFB, 0x1A, 0xA2, 0x46, 0xAB, 0x46, 0x33, 0x43, 0x18, 0x47, 0x48, 0xC2, 0x00, 0x00, - 0x68, 0xC2, 0x00, 0x00, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x10, 0x3A, 0x01, 0xD3, + 0x00, 0xD0, 0xFB, 0x1A, 0xA2, 0x46, 0xAB, 0x46, 0x33, 0x43, 0x18, 0x47, 0x94, 0xBD, 0x00, 0x00, + 0xB4, 0xBD, 0x00, 0x00, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x10, 0x3A, 0x01, 0xD3, 0x78, 0xC1, 0xFB, 0xD8, 0x52, 0x07, 0x00, 0xD3, 0x30, 0xC1, 0x00, 0xD5, 0x0B, 0x60, 0x70, 0x47, 0x1F, 0xB5, 0xC0, 0x46, 0xC0, 0x46, 0x1F, 0xBD, 0x10, 0xB5, 0x10, 0xBD, 0x00, 0xF0, 0x8E, 0xF9, - 0x11, 0x46, 0xFF, 0xF7, 0xF5, 0xFF, 0x0A, 0xF0, 0x57, 0xFE, 0x00, 0xF0, 0xA6, 0xF9, 0xFF, 0xF7, + 0x11, 0x46, 0xFF, 0xF7, 0xF5, 0xFF, 0x0A, 0xF0, 0xE9, 0xFB, 0x00, 0xF0, 0xA6, 0xF9, 0xFF, 0xF7, 0xF3, 0xFF, 0x00, 0xF0, 0xAD, 0xF9, 0x00, 0x00, 0xF0, 0xB5, 0x29, 0x4F, 0x3F, 0x78, 0x02, 0x3F, 0x03, 0x00, 0x0C, 0x00, 0x50, 0x20, 0x00, 0x04, 0x40, 0x30, 0x00, 0x02, 0x08, 0x30, 0x00, 0x21, 0x09, 0x02, 0x80, 0x31, 0x09, 0x18, 0x00, 0x22, 0x12, 0x02, 0x80, 0x32, 0x12, 0x18, 0x01, 0x25, @@ -29,7 +29,7 @@ 0xAE, 0x43, 0x16, 0x60, 0x01, 0x26, 0x76, 0x1E, 0xFD, 0xD1, 0x00, 0xBF, 0x01, 0x25, 0xED, 0x02, 0x16, 0x68, 0x2E, 0x43, 0x16, 0x60, 0x3E, 0x00, 0x01, 0x36, 0x76, 0x1E, 0xFD, 0xD1, 0x01, 0x25, 0x6D, 0x02, 0x0E, 0x68, 0xAE, 0x43, 0x0E, 0x60, 0x40, 0x08, 0x00, 0x28, 0xC5, 0xD1, 0xF0, 0xBD, - 0xDD, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x03, 0xB4, 0x1E, 0x4F, 0x3F, 0x78, 0x01, 0x37, 0x50, 0x20, + 0x3F, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x03, 0xB4, 0x1E, 0x4F, 0x3F, 0x78, 0x01, 0x37, 0x50, 0x20, 0x00, 0x04, 0x40, 0x30, 0x00, 0x02, 0x00, 0x21, 0x09, 0x02, 0x80, 0x31, 0x09, 0x18, 0x00, 0x22, 0x12, 0x02, 0x80, 0x32, 0x12, 0x18, 0x00, 0x20, 0x00, 0x23, 0x00, 0x24, 0x5B, 0x00, 0x64, 0x00, 0x01, 0x25, 0x6D, 0x02, 0x8E, 0x68, 0x2E, 0x43, 0x8E, 0x60, 0x01, 0x25, 0xED, 0x02, 0x96, 0x68, @@ -37,14 +37,14 @@ 0x33, 0x43, 0x16, 0x69, 0xF6, 0x04, 0xF6, 0x0F, 0x34, 0x43, 0x01, 0x25, 0x6D, 0x02, 0x8E, 0x68, 0xAE, 0x43, 0x8E, 0x60, 0x01, 0x25, 0xED, 0x02, 0x96, 0x68, 0xAE, 0x43, 0x96, 0x60, 0x3E, 0x00, 0x01, 0x36, 0x76, 0x1E, 0xFD, 0xD1, 0x40, 0x1C, 0x08, 0x28, 0xD7, 0xD1, 0x03, 0xBC, 0x03, 0x70, - 0x0C, 0x70, 0xF0, 0xBD, 0xDD, 0x00, 0x00, 0x20, 0x0F, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x49, + 0x0C, 0x70, 0xF0, 0xBD, 0x3F, 0x00, 0x00, 0x20, 0x0F, 0x48, 0x10, 0x49, 0x01, 0x60, 0x10, 0x49, 0x01, 0x60, 0x10, 0x49, 0x01, 0x60, 0x10, 0x4A, 0x10, 0x49, 0x11, 0x60, 0x10, 0x4A, 0x11, 0x49, 0x11, 0x60, 0x00, 0x21, 0x01, 0x60, 0x10, 0x48, 0x80, 0x47, 0x10, 0x48, 0x00, 0x47, 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, 0xFE, 0xE7, 0x00, 0x00, 0x0C, 0x48, 0x0D, 0x49, 0x0B, 0x4A, 0x0D, 0x4B, 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x59, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x50, 0xA5, 0x5A, 0x00, 0x00, - 0x18, 0xC0, 0x00, 0x50, 0x80, 0x00, 0x00, 0x00, 0x49, 0x99, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, - 0x38, 0x1B, 0x00, 0x20, 0x38, 0x1F, 0x00, 0x20, 0x38, 0x1B, 0x00, 0x20, 0x00, 0x22, 0x03, 0x09, + 0x18, 0xC0, 0x00, 0x50, 0x80, 0x00, 0x00, 0x00, 0xE5, 0x95, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, + 0xD8, 0x1A, 0x00, 0x20, 0xD8, 0x1E, 0x00, 0x20, 0xD8, 0x1A, 0x00, 0x20, 0x00, 0x22, 0x03, 0x09, 0x8B, 0x42, 0x2C, 0xD3, 0x03, 0x0A, 0x8B, 0x42, 0x11, 0xD3, 0x00, 0x23, 0x9C, 0x46, 0x4E, 0xE0, 0x03, 0x46, 0x0B, 0x43, 0x3C, 0xD4, 0x00, 0x22, 0x43, 0x08, 0x8B, 0x42, 0x31, 0xD3, 0x03, 0x09, 0x8B, 0x42, 0x1C, 0xD3, 0x03, 0x0A, 0x8B, 0x42, 0x01, 0xD3, 0x94, 0x46, 0x3F, 0xE0, 0xC3, 0x09, @@ -71,7 +71,7 @@ 0x18, 0xB0, 0x20, 0xB5, 0xFF, 0xF7, 0x22, 0xFF, 0x60, 0xBC, 0x00, 0x27, 0x49, 0x08, 0xB6, 0x46, 0x00, 0x26, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0xC0, 0xC5, 0x40, 0x3D, 0x49, 0x00, 0x8D, 0x46, 0x70, 0x47, 0x04, 0x46, 0xC0, 0x46, 0xC0, 0x46, - 0x20, 0x46, 0xFF, 0xF7, 0x54, 0xFE, 0x00, 0x00, 0x00, 0x48, 0x70, 0x47, 0xD8, 0x1A, 0x00, 0x20, + 0x20, 0x46, 0xFF, 0xF7, 0x54, 0xFE, 0x00, 0x00, 0x00, 0x48, 0x70, 0x47, 0x78, 0x1A, 0x00, 0x20, 0x02, 0x48, 0x03, 0x49, 0xAB, 0xBE, 0x70, 0x47, 0x0D, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x26, 0x00, 0x02, 0x00, 0x70, 0x47, 0x70, 0xB5, 0x8C, 0x18, 0x05, 0x78, 0x40, 0x1C, 0x6B, 0x07, 0x5B, 0x0F, 0x01, 0xD1, 0x03, 0x78, 0x40, 0x1C, 0x2A, 0x11, 0x06, 0xD1, 0x02, 0x78, 0x40, 0x1C, @@ -81,462 +81,429 @@ 0x49, 0x1C, 0x52, 0x1E, 0xF9, 0xD5, 0xA1, 0x42, 0xD7, 0xD3, 0x00, 0x20, 0x70, 0xBD, 0x00, 0x28, 0x00, 0xDA, 0x40, 0x42, 0x70, 0x47, 0x00, 0x00, 0xFE, 0xB5, 0xEE, 0x4E, 0x00, 0x24, 0xF4, 0x76, 0x34, 0x71, 0x71, 0x78, 0x30, 0x46, 0x49, 0x08, 0x49, 0x00, 0x20, 0x30, 0x71, 0x70, 0x01, 0x79, - 0x00, 0x29, 0x01, 0xD0, 0x49, 0x1E, 0x01, 0x71, 0xE6, 0x4D, 0x00, 0x20, 0x80, 0x35, 0x69, 0x6A, - 0x09, 0x5C, 0x00, 0x29, 0x18, 0xD0, 0xF1, 0x7E, 0x49, 0x1C, 0xF1, 0x76, 0xEA, 0x69, 0x41, 0x00, - 0xAB, 0x6A, 0x52, 0x5A, 0x5A, 0x52, 0x2A, 0x6A, 0xEB, 0x6A, 0x52, 0x5A, 0x5A, 0x52, 0x6A, 0x6A, - 0x2B, 0x6B, 0x12, 0x5C, 0x5A, 0x52, 0x6B, 0x6A, 0x00, 0x22, 0x1C, 0x54, 0xEB, 0x69, 0xD2, 0x43, - 0x5A, 0x52, 0x2B, 0x6A, 0x5A, 0x52, 0x08, 0xE0, 0x00, 0x22, 0xD2, 0x43, 0xAB, 0x6A, 0x41, 0x00, - 0x5A, 0x52, 0xEB, 0x6A, 0x5A, 0x52, 0x2A, 0x6B, 0x54, 0x52, 0x40, 0x1C, 0x0A, 0x28, 0xD6, 0xDB, + 0x00, 0x29, 0x01, 0xD0, 0x49, 0x1E, 0x01, 0x71, 0xE6, 0x4D, 0x00, 0x20, 0x80, 0x35, 0xA9, 0x6A, + 0x09, 0x5C, 0x00, 0x29, 0x18, 0xD0, 0xF1, 0x7E, 0x49, 0x1C, 0xF1, 0x76, 0x2A, 0x6A, 0x41, 0x00, + 0xEB, 0x6A, 0x52, 0x5A, 0x5A, 0x52, 0x6A, 0x6A, 0x2B, 0x6B, 0x52, 0x5A, 0x5A, 0x52, 0xAA, 0x6A, + 0x6B, 0x6B, 0x12, 0x5C, 0x5A, 0x52, 0xAB, 0x6A, 0x00, 0x22, 0x1C, 0x54, 0x2B, 0x6A, 0xD2, 0x43, + 0x5A, 0x52, 0x6B, 0x6A, 0x5A, 0x52, 0x08, 0xE0, 0x00, 0x22, 0xD2, 0x43, 0xEB, 0x6A, 0x41, 0x00, + 0x5A, 0x52, 0x2B, 0x6B, 0x5A, 0x52, 0x6A, 0x6B, 0x54, 0x52, 0x40, 0x1C, 0x0A, 0x28, 0xD6, 0xDB, 0x1B, 0x21, 0x71, 0x56, 0x00, 0x29, 0x12, 0xD1, 0xCF, 0x4F, 0x4A, 0x1E, 0x3D, 0x46, 0x3C, 0x35, 0xCD, 0x4B, 0x48, 0x00, 0x28, 0x33, 0x1A, 0x52, 0x2A, 0x52, 0x3A, 0x52, 0x14, 0x3B, 0x1A, 0x52, 0x3C, 0x33, 0x49, 0x1C, 0x1C, 0x52, 0x0A, 0x29, 0xF2, 0xDB, 0xB4, 0x76, 0xFE, 0xBD, 0x1A, 0x20, 0x30, 0x56, 0x81, 0x42, 0x1E, 0xDA, 0xC3, 0x4A, 0x91, 0x78, 0x49, 0x1C, 0xC9, 0xB2, 0x91, 0x70, 0x92, 0x7D, 0x91, 0x42, 0x16, 0xD2, 0xC0, 0x4F, 0x00, 0x20, 0x28, 0x37, 0x3C, 0x46, 0x14, 0x34, - 0x26, 0x46, 0x14, 0x36, 0x41, 0x00, 0xEB, 0x69, 0x7A, 0x5A, 0x5A, 0x52, 0x2B, 0x6A, 0x62, 0x5A, - 0x5A, 0x52, 0x03, 0x46, 0x6A, 0x6A, 0x71, 0x5A, 0x40, 0x1C, 0x0A, 0x28, 0xD1, 0x54, 0xF1, 0xDB, + 0x26, 0x46, 0x14, 0x36, 0x41, 0x00, 0x2B, 0x6A, 0x7A, 0x5A, 0x5A, 0x52, 0x6B, 0x6A, 0x62, 0x5A, + 0x5A, 0x52, 0x03, 0x46, 0xAA, 0x6A, 0x71, 0x5A, 0x40, 0x1C, 0x0A, 0x28, 0xD1, 0x54, 0xF1, 0xDB, 0xB4, 0x49, 0x61, 0xE1, 0xB3, 0x49, 0x00, 0x22, 0x0C, 0x46, 0x40, 0x34, 0x8A, 0x70, 0x00, 0x28, 0x48, 0xD1, 0x00, 0x21, 0x40, 0xE0, 0x01, 0x20, 0x63, 0x8B, 0x88, 0x40, 0x18, 0x42, 0x37, 0xD0, - 0xAC, 0x4E, 0x1A, 0x23, 0xAF, 0x6A, 0xF3, 0x56, 0xAB, 0x4E, 0x48, 0x00, 0x3A, 0x5A, 0x28, 0x36, - 0x5B, 0x00, 0xF2, 0x52, 0xEA, 0x6A, 0xBC, 0x46, 0x14, 0x36, 0x17, 0x5A, 0xF7, 0x52, 0xA6, 0x4F, - 0x2E, 0x6B, 0x50, 0x37, 0x36, 0x5A, 0xFE, 0x52, 0x67, 0x46, 0x3E, 0x5A, 0xA2, 0x4F, 0xFE, 0x52, - 0x3E, 0x46, 0x12, 0x5A, 0x14, 0x36, 0xF2, 0x52, 0x67, 0x46, 0x3A, 0x5A, 0xEE, 0x69, 0x9D, 0x4F, - 0xF2, 0x52, 0x1A, 0x23, 0xFB, 0x56, 0xEA, 0x6A, 0x2E, 0x6A, 0x12, 0x5A, 0x5B, 0x00, 0xF2, 0x52, - 0x2E, 0x6B, 0x3B, 0x46, 0x30, 0x5A, 0x1A, 0x26, 0x9E, 0x57, 0x6A, 0x6A, 0x01, 0x23, 0x90, 0x55, + 0xAC, 0x4E, 0x1A, 0x23, 0xEF, 0x6A, 0xF3, 0x56, 0xAB, 0x4E, 0x48, 0x00, 0x3A, 0x5A, 0x28, 0x36, + 0x5B, 0x00, 0xF2, 0x52, 0x2A, 0x6B, 0xBC, 0x46, 0x14, 0x36, 0x17, 0x5A, 0xF7, 0x52, 0xA6, 0x4F, + 0x6E, 0x6B, 0x50, 0x37, 0x36, 0x5A, 0xFE, 0x52, 0x67, 0x46, 0x3E, 0x5A, 0xA2, 0x4F, 0xFE, 0x52, + 0x3E, 0x46, 0x12, 0x5A, 0x14, 0x36, 0xF2, 0x52, 0x67, 0x46, 0x3A, 0x5A, 0x2E, 0x6A, 0x9D, 0x4F, + 0xF2, 0x52, 0x1A, 0x23, 0xFB, 0x56, 0x2A, 0x6B, 0x6E, 0x6A, 0x12, 0x5A, 0x5B, 0x00, 0xF2, 0x52, + 0x6E, 0x6B, 0x3B, 0x46, 0x30, 0x5A, 0x1A, 0x26, 0x9E, 0x57, 0xAA, 0x6A, 0x01, 0x23, 0x90, 0x55, 0x78, 0x78, 0x3A, 0x46, 0x18, 0x43, 0x50, 0x70, 0x90, 0x7E, 0x40, 0x1C, 0x90, 0x76, 0x02, 0xE0, 0x10, 0x79, 0x40, 0x1C, 0x10, 0x71, 0x49, 0x1C, 0x8E, 0x4A, 0x1B, 0x20, 0x10, 0x56, 0x81, 0x42, - 0xB9, 0xDB, 0xFE, 0xBD, 0x03, 0xF0, 0x92, 0xFF, 0x00, 0x26, 0x68, 0x6B, 0x80, 0x57, 0x00, 0x28, - 0x1F, 0xDB, 0x88, 0x4B, 0xEA, 0x6B, 0xB1, 0x00, 0x9B, 0x6F, 0x51, 0x58, 0x99, 0x42, 0x18, 0xD9, + 0xB9, 0xDB, 0xFE, 0xBD, 0x03, 0xF0, 0x30, 0xFE, 0x00, 0x26, 0xA8, 0x6B, 0x80, 0x57, 0x00, 0x28, + 0x1F, 0xDB, 0x88, 0x4B, 0x2A, 0x6C, 0xB1, 0x00, 0xDB, 0x6F, 0x51, 0x58, 0x99, 0x42, 0x18, 0xD9, 0x85, 0x49, 0x77, 0x00, 0x14, 0x31, 0xCA, 0x5F, 0x14, 0x39, 0xC9, 0x5F, 0x00, 0x91, 0x82, 0x49, - 0x01, 0x92, 0x3C, 0x31, 0xCB, 0x5F, 0x14, 0x39, 0xCA, 0x5F, 0xE9, 0x6A, 0x40, 0x00, 0xAF, 0x6A, - 0x09, 0x5E, 0x38, 0x5E, 0x08, 0xF0, 0xCC, 0xFA, 0x01, 0x28, 0x02, 0xD1, 0x69, 0x6B, 0xFF, 0x20, + 0x01, 0x92, 0x3C, 0x31, 0xCB, 0x5F, 0x14, 0x39, 0xCA, 0x5F, 0x29, 0x6B, 0x40, 0x00, 0xEF, 0x6A, + 0x09, 0x5E, 0x38, 0x5E, 0x08, 0xF0, 0x52, 0xF9, 0x01, 0x28, 0x02, 0xD1, 0xA9, 0x6B, 0xFF, 0x20, 0x88, 0x55, 0x79, 0x48, 0x72, 0x00, 0x28, 0x30, 0x77, 0x49, 0x80, 0x5E, 0x88, 0x52, 0x76, 0x4B, - 0x3C, 0x31, 0x14, 0x33, 0x89, 0x5A, 0x99, 0x52, 0x40, 0x1C, 0x31, 0xD0, 0x69, 0x6B, 0x88, 0x57, - 0x00, 0x28, 0x2D, 0xDB, 0xAF, 0x6A, 0x40, 0x00, 0x14, 0x33, 0x38, 0x5A, 0x98, 0x52, 0x89, 0x57, - 0xEF, 0x6A, 0x4B, 0x00, 0x6C, 0x49, 0xFB, 0x5A, 0x3C, 0x31, 0x8B, 0x52, 0xEB, 0x69, 0x98, 0x52, - 0x88, 0x5A, 0x29, 0x6A, 0x88, 0x52, 0x68, 0x6B, 0x2B, 0x6B, 0x80, 0x57, 0x69, 0x6A, 0x40, 0x00, - 0x18, 0x5A, 0x65, 0x4B, 0xC0, 0xB2, 0x50, 0x33, 0x88, 0x55, 0x98, 0x52, 0x6A, 0x6B, 0x00, 0x20, - 0x92, 0x57, 0xA9, 0x6A, 0xC0, 0x43, 0x53, 0x00, 0xC8, 0x52, 0x68, 0x6B, 0x29, 0x6B, 0x80, 0x57, + 0x3C, 0x31, 0x14, 0x33, 0x89, 0x5A, 0x99, 0x52, 0x40, 0x1C, 0x31, 0xD0, 0xA9, 0x6B, 0x88, 0x57, + 0x00, 0x28, 0x2D, 0xDB, 0xEF, 0x6A, 0x40, 0x00, 0x14, 0x33, 0x38, 0x5A, 0x98, 0x52, 0x89, 0x57, + 0x2F, 0x6B, 0x4B, 0x00, 0x6C, 0x49, 0xFB, 0x5A, 0x3C, 0x31, 0x8B, 0x52, 0x2B, 0x6A, 0x98, 0x52, + 0x88, 0x5A, 0x69, 0x6A, 0x88, 0x52, 0xA8, 0x6B, 0x6B, 0x6B, 0x80, 0x57, 0xA9, 0x6A, 0x40, 0x00, + 0x18, 0x5A, 0x65, 0x4B, 0xC0, 0xB2, 0x50, 0x33, 0x88, 0x55, 0x98, 0x52, 0xAA, 0x6B, 0x00, 0x20, + 0x92, 0x57, 0xE9, 0x6A, 0xC0, 0x43, 0x53, 0x00, 0xC8, 0x52, 0xA8, 0x6B, 0x69, 0x6B, 0x80, 0x57, 0x00, 0x22, 0x43, 0x00, 0x5B, 0x48, 0xCA, 0x52, 0x41, 0x78, 0x01, 0x22, 0x11, 0x43, 0x41, 0x70, - 0x76, 0x1C, 0x0A, 0x2E, 0x99, 0xDB, 0x00, 0x20, 0xA8, 0x61, 0xA0, 0x82, 0x29, 0x6B, 0x42, 0x00, + 0x76, 0x1C, 0x0A, 0x2E, 0x99, 0xDB, 0x00, 0x20, 0xE8, 0x61, 0xA0, 0x82, 0x69, 0x6B, 0x42, 0x00, 0x89, 0x5E, 0x00, 0x29, 0x41, 0xDD, 0x01, 0x21, 0x63, 0x8B, 0x81, 0x40, 0x19, 0x42, 0x35, 0xD0, - 0x50, 0x49, 0x52, 0x4E, 0x89, 0x7C, 0xEF, 0x6B, 0x8C, 0x46, 0xA9, 0x69, 0x2B, 0xE0, 0x8B, 0x00, - 0xFB, 0x58, 0xB3, 0x42, 0x25, 0xD1, 0xAB, 0x6A, 0x4B, 0x4E, 0x9B, 0x5A, 0x28, 0x36, 0x49, 0x00, - 0x73, 0x52, 0xEE, 0x6A, 0xB7, 0x5A, 0x48, 0x4E, 0x3C, 0x36, 0x77, 0x52, 0x3C, 0x3E, 0x73, 0x52, - 0x14, 0x36, 0x77, 0x52, 0xEE, 0x69, 0x44, 0x4F, 0x73, 0x52, 0xA9, 0x69, 0x3C, 0x37, 0x49, 0x00, - 0x2E, 0x6A, 0x7B, 0x5A, 0x73, 0x52, 0x2B, 0x6B, 0x69, 0x6A, 0x9A, 0x5A, 0xAB, 0x69, 0xD2, 0xB2, - 0xCA, 0x54, 0xA9, 0x69, 0x3E, 0x46, 0x4B, 0x00, 0x14, 0x36, 0xF2, 0x52, 0x49, 0x1C, 0xA9, 0x61, - 0x08, 0xE0, 0x49, 0x1C, 0xA9, 0x61, 0x61, 0x45, 0xD1, 0xDB, 0x03, 0xE0, 0x35, 0x49, 0x0A, 0x79, + 0x50, 0x49, 0x52, 0x4E, 0x89, 0x7C, 0x2F, 0x6C, 0x8C, 0x46, 0xE9, 0x69, 0x2B, 0xE0, 0x8B, 0x00, + 0xFB, 0x58, 0xB3, 0x42, 0x25, 0xD1, 0xEB, 0x6A, 0x4B, 0x4E, 0x9B, 0x5A, 0x28, 0x36, 0x49, 0x00, + 0x73, 0x52, 0x2E, 0x6B, 0xB7, 0x5A, 0x48, 0x4E, 0x3C, 0x36, 0x77, 0x52, 0x3C, 0x3E, 0x73, 0x52, + 0x14, 0x36, 0x77, 0x52, 0x2E, 0x6A, 0x44, 0x4F, 0x73, 0x52, 0xE9, 0x69, 0x3C, 0x37, 0x49, 0x00, + 0x6E, 0x6A, 0x7B, 0x5A, 0x73, 0x52, 0x6B, 0x6B, 0xA9, 0x6A, 0x9A, 0x5A, 0xEB, 0x69, 0xD2, 0xB2, + 0xCA, 0x54, 0xE9, 0x69, 0x3E, 0x46, 0x4B, 0x00, 0x14, 0x36, 0xF2, 0x52, 0x49, 0x1C, 0xE9, 0x61, + 0x08, 0xE0, 0x49, 0x1C, 0xE9, 0x61, 0x61, 0x45, 0xD1, 0xDB, 0x03, 0xE0, 0x35, 0x49, 0x0A, 0x79, 0x52, 0x1C, 0x0A, 0x71, 0xA1, 0x8A, 0x49, 0x1C, 0xA1, 0x82, 0x40, 0x1C, 0x0A, 0x28, 0xB5, 0xDB, - 0x00, 0x24, 0x31, 0x4E, 0x2F, 0x4F, 0xAC, 0x61, 0x64, 0x36, 0xB9, 0x7C, 0x20, 0x46, 0x6A, 0x6A, + 0x00, 0x24, 0x31, 0x4E, 0x2F, 0x4F, 0xEC, 0x61, 0x64, 0x36, 0xB9, 0x7C, 0x20, 0x46, 0xAA, 0x6A, 0x09, 0xE0, 0x13, 0x5C, 0x00, 0x2B, 0x04, 0xD1, 0x06, 0x23, 0x43, 0x43, 0xF3, 0x5E, 0x5B, 0x1C, - 0x03, 0xD1, 0x40, 0x1C, 0xA8, 0x61, 0x88, 0x42, 0xF3, 0xDB, 0x88, 0x42, 0xAC, 0x61, 0x28, 0xDA, - 0x24, 0x4B, 0x20, 0x46, 0x21, 0xE0, 0x69, 0x6A, 0x09, 0x5C, 0x00, 0x29, 0x1A, 0xD0, 0x06, 0x22, + 0x03, 0xD1, 0x40, 0x1C, 0xE8, 0x61, 0x88, 0x42, 0xF3, 0xDB, 0x88, 0x42, 0xEC, 0x61, 0x28, 0xDA, + 0x24, 0x4B, 0x20, 0x46, 0x21, 0xE0, 0xA9, 0x6A, 0x09, 0x5C, 0x00, 0x29, 0x1A, 0xD0, 0x06, 0x22, 0x01, 0x46, 0x51, 0x43, 0x71, 0x5E, 0x49, 0x1C, 0x14, 0xD1, 0x1F, 0x4A, 0x49, 0x1E, 0x40, 0x00, - 0x28, 0x32, 0x11, 0x52, 0x14, 0x32, 0x11, 0x52, 0x14, 0x32, 0x11, 0x52, 0xEA, 0x69, 0x11, 0x52, - 0xA8, 0x69, 0x2A, 0x6A, 0x40, 0x00, 0x11, 0x52, 0xA9, 0x69, 0x68, 0x6A, 0x44, 0x54, 0x18, 0x79, - 0x40, 0x1C, 0x18, 0x71, 0xA8, 0x69, 0x40, 0x1C, 0xA8, 0x61, 0x99, 0x7C, 0x88, 0x42, 0xDA, 0xDB, - 0x11, 0xE0, 0x2F, 0x6A, 0xEE, 0x69, 0xA9, 0x69, 0x0F, 0x4C, 0x48, 0x00, 0x33, 0x5A, 0x28, 0x34, + 0x28, 0x32, 0x11, 0x52, 0x14, 0x32, 0x11, 0x52, 0x14, 0x32, 0x11, 0x52, 0x2A, 0x6A, 0x11, 0x52, + 0xE8, 0x69, 0x6A, 0x6A, 0x40, 0x00, 0x11, 0x52, 0xE9, 0x69, 0xA8, 0x6A, 0x44, 0x54, 0x18, 0x79, + 0x40, 0x1C, 0x18, 0x71, 0xE8, 0x69, 0x40, 0x1C, 0xE8, 0x61, 0x99, 0x7C, 0x88, 0x42, 0xDA, 0xDB, + 0x11, 0xE0, 0x6F, 0x6A, 0x2E, 0x6A, 0xE9, 0x69, 0x0F, 0x4C, 0x48, 0x00, 0x33, 0x5A, 0x28, 0x34, 0x23, 0x52, 0x3B, 0x5A, 0x14, 0x34, 0x23, 0x52, 0x53, 0x5C, 0x14, 0x34, 0x49, 0x1C, 0x23, 0x52, - 0xA9, 0x61, 0x0A, 0x29, 0xEF, 0xDB, 0x07, 0x49, 0xC8, 0x7E, 0x0A, 0x79, 0x80, 0x1A, 0x40, 0xB2, + 0xE9, 0x61, 0x0A, 0x29, 0xEF, 0xDB, 0x07, 0x49, 0xC8, 0x7E, 0x0A, 0x79, 0x80, 0x1A, 0x40, 0xB2, 0x88, 0x76, 0x00, 0x28, 0x00, 0xDC, 0xEC, 0xE6, 0x48, 0x78, 0x01, 0x22, 0x10, 0x43, 0x48, 0x70, - 0xFE, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0xD2, 0x05, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x7F, - 0x70, 0xB5, 0x00, 0x26, 0x00, 0x24, 0x00, 0x25, 0x20, 0x26, 0x10, 0xE0, 0x30, 0x46, 0x04, 0xF0, - 0x17, 0xF9, 0x00, 0x28, 0x06, 0xD0, 0x00, 0x2C, 0x02, 0xD1, 0x34, 0x46, 0x35, 0x46, 0x04, 0xE0, - 0x35, 0x46, 0x02, 0xE0, 0x00, 0x2C, 0x00, 0xD0, 0x03, 0xE0, 0x30, 0x1D, 0xC6, 0xB2, 0x50, 0x2E, - 0xEC, 0xDB, 0x00, 0xBF, 0x26, 0x46, 0x11, 0xE0, 0x30, 0x46, 0x04, 0xF0, 0x01, 0xF9, 0x00, 0x28, - 0x01, 0xD0, 0x34, 0x46, 0x08, 0xE0, 0x71, 0x1C, 0xC8, 0xB2, 0x04, 0xF0, 0xF9, 0xF8, 0x00, 0x28, - 0x01, 0xD0, 0x70, 0x1C, 0xC4, 0xB2, 0x03, 0xE0, 0xB0, 0x1E, 0xC6, 0xB2, 0x20, 0x2E, 0xEB, 0xDC, - 0x00, 0xBF, 0x2E, 0x46, 0x11, 0xE0, 0x30, 0x46, 0x04, 0xF0, 0xEA, 0xF8, 0x00, 0x28, 0x01, 0xD0, - 0x35, 0x46, 0x08, 0xE0, 0x71, 0x1E, 0xC8, 0xB2, 0x04, 0xF0, 0xE2, 0xF8, 0x00, 0x28, 0x01, 0xD0, - 0x70, 0x1E, 0xC5, 0xB2, 0x03, 0xE0, 0xB0, 0x1C, 0xC6, 0xB2, 0x50, 0x2E, 0xEB, 0xDB, 0x00, 0xBF, - 0x00, 0x2C, 0x01, 0xD1, 0x00, 0x20, 0x70, 0xBD, 0x61, 0x19, 0x48, 0x1C, 0xC1, 0x0F, 0x09, 0x18, - 0xC9, 0x05, 0x0E, 0x0E, 0x30, 0x46, 0xF6, 0xE7, 0x10, 0xB5, 0x05, 0x20, 0x00, 0x07, 0x80, 0x69, - 0x10, 0x21, 0x88, 0x43, 0x10, 0x30, 0x05, 0x21, 0x09, 0x07, 0x88, 0x61, 0x03, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x02, 0xD0, 0x01, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x28, 0x01, 0x00, 0x20, - 0xF7, 0xB5, 0x82, 0xB0, 0x04, 0x46, 0x0D, 0x46, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0x96, 0xFC, - 0x00, 0x07, 0x00, 0x0F, 0x02, 0x28, 0x17, 0xD2, 0x68, 0x01, 0xA0, 0x42, 0x14, 0xD2, 0x04, 0x98, - 0x00, 0x68, 0x01, 0x21, 0x49, 0x07, 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, 0x04, 0x98, 0x00, 0x68, - 0x01, 0x21, 0x09, 0x07, 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, - 0x7D, 0xFC, 0x00, 0x09, 0x86, 0x1E, 0x4C, 0xE0, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x49, 0x07, - 0x88, 0x43, 0x41, 0x18, 0x04, 0x98, 0x01, 0x60, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x09, 0x07, - 0x88, 0x43, 0x40, 0x18, 0x04, 0x99, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0x66, 0xFC, - 0x86, 0x1E, 0x21, 0x48, 0x86, 0x42, 0x34, 0xDD, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x49, 0x07, - 0x88, 0x43, 0x41, 0x18, 0x04, 0x98, 0x01, 0x60, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x09, 0x07, - 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, 0x08, 0x27, 0x20, 0xE0, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, - 0x4D, 0xFC, 0x79, 0x1C, 0x01, 0x90, 0xFF, 0xF7, 0x49, 0xFC, 0x03, 0x29, 0x15, 0xD2, 0x04, 0x98, - 0x01, 0x68, 0x0F, 0x20, 0x00, 0x06, 0x81, 0x43, 0x38, 0x06, 0x0F, 0x22, 0x12, 0x06, 0x10, 0x40, - 0x01, 0x43, 0x04, 0x98, 0x01, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0x37, 0xFC, 0x79, 0x1C, - 0x01, 0x90, 0xFF, 0xF7, 0x33, 0xFC, 0x86, 0x1E, 0x02, 0xE0, 0x7F, 0x1C, 0x10, 0x2F, 0xDC, 0xDB, - 0x00, 0xBF, 0x04, 0x98, 0x00, 0x68, 0x00, 0x0C, 0x00, 0x04, 0xB1, 0xB2, 0x08, 0x43, 0x04, 0x99, - 0x08, 0x60, 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xB5, 0x8B, 0x4D, - 0x2B, 0x68, 0x2D, 0x68, 0x23, 0x26, 0x76, 0x01, 0xAC, 0x19, 0x89, 0x4D, 0x2D, 0x68, 0x01, 0x95, - 0x87, 0x4D, 0x2D, 0x68, 0xAD, 0x19, 0x00, 0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x25, 0x02, 0x95, - 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, 0xBE, 0x5B, - 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x7D, 0x4D, 0x2D, 0x78, - 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, - 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, 0x00, 0x9F, - 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x72, 0x4D, - 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, - 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x6B, 0x4E, 0x36, 0x78, - 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, 0x6A, 0x4D, 0x2D, 0x78, 0x00, 0x2D, 0x3C, 0xD0, 0x00, 0x25, - 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, - 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x60, 0x4D, - 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, - 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, - 0x00, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, - 0x54, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, - 0x40, 0x1C, 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x4B, 0x4E, - 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, + 0xFE, 0xBD, 0x00, 0x00, 0x24, 0x01, 0x00, 0x20, 0x72, 0x05, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x7F, + 0x70, 0xB5, 0x00, 0x24, 0x26, 0x46, 0x20, 0x25, 0x28, 0x46, 0x03, 0xF0, 0xCB, 0xFF, 0x00, 0x28, + 0x06, 0xD0, 0x00, 0x2C, 0x02, 0xD1, 0x2C, 0x46, 0x2E, 0x46, 0x03, 0xE0, 0x2E, 0x46, 0x01, 0xE0, + 0x00, 0x2C, 0x03, 0xD1, 0x2D, 0x1D, 0xED, 0xB2, 0x50, 0x2D, 0xED, 0xD3, 0x25, 0x46, 0x07, 0xE0, + 0x28, 0x46, 0x03, 0xF0, 0xB7, 0xFF, 0x00, 0x28, 0x06, 0xD0, 0x2C, 0x46, 0xAD, 0x1E, 0xED, 0xB2, + 0x20, 0x2D, 0xF5, 0xD8, 0x35, 0x46, 0x0F, 0xE0, 0x6D, 0x1C, 0xE8, 0xB2, 0x03, 0xF0, 0xAA, 0xFF, + 0x00, 0x28, 0xF7, 0xD0, 0xEC, 0xB2, 0xF5, 0xE7, 0x28, 0x46, 0x03, 0xF0, 0xA3, 0xFF, 0x00, 0x28, + 0x08, 0xD0, 0x2E, 0x46, 0xAD, 0x1C, 0xED, 0xB2, 0x50, 0x2D, 0xF5, 0xD3, 0x00, 0x2C, 0x09, 0xD1, + 0x00, 0x20, 0x70, 0xBD, 0x6D, 0x1E, 0xE8, 0xB2, 0x03, 0xF0, 0x94, 0xFF, 0x00, 0x28, 0xF5, 0xD0, + 0xEE, 0xB2, 0xF3, 0xE7, 0xA0, 0x19, 0x40, 0x1C, 0xC0, 0x05, 0x00, 0x0E, 0x70, 0xBD, 0x00, 0x00, + 0xF0, 0xB5, 0x39, 0x4A, 0x10, 0x7C, 0x00, 0x09, 0x6D, 0xD0, 0x38, 0x4E, 0x30, 0x7C, 0x80, 0x1C, + 0x84, 0x46, 0x41, 0x1C, 0x10, 0x7C, 0xC3, 0x06, 0x35, 0x48, 0x10, 0xD5, 0x07, 0x46, 0x20, 0x37, + 0x3D, 0x69, 0x02, 0x23, 0x6B, 0x54, 0xBD, 0x68, 0x4C, 0x00, 0x43, 0x8B, 0x2B, 0x53, 0x1A, 0x23, + 0xC3, 0x5E, 0x34, 0x7D, 0xA3, 0x42, 0x02, 0xDD, 0x3C, 0x69, 0x00, 0x23, 0x63, 0x54, 0x13, 0x7C, + 0x9B, 0x06, 0x17, 0xD5, 0x2A, 0x4C, 0x33, 0x7C, 0x20, 0x34, 0xCB, 0x18, 0x27, 0x69, 0x02, 0x25, + 0x5B, 0x1E, 0xFD, 0x54, 0x26, 0x4F, 0x5C, 0x00, 0x20, 0x37, 0xBF, 0x68, 0x45, 0x8B, 0x3D, 0x53, + 0x1A, 0x24, 0x04, 0x5F, 0x35, 0x7D, 0xAC, 0x42, 0x04, 0xDD, 0x21, 0x4D, 0x00, 0x24, 0x20, 0x35, + 0x2D, 0x69, 0xEC, 0x54, 0x13, 0x7C, 0x5B, 0x06, 0x19, 0xD5, 0x74, 0x7C, 0x63, 0x46, 0x64, 0x1E, + 0x63, 0x43, 0x1B, 0x4C, 0x02, 0x25, 0x20, 0x34, 0x27, 0x69, 0x5B, 0x18, 0xFD, 0x54, 0x18, 0x4F, + 0x5C, 0x00, 0x20, 0x37, 0xBF, 0x68, 0x45, 0x8B, 0x3D, 0x53, 0x1A, 0x24, 0x04, 0x5F, 0x35, 0x7D, + 0xAC, 0x42, 0x04, 0xDD, 0x12, 0x4D, 0x00, 0x24, 0x20, 0x35, 0x2D, 0x69, 0xEC, 0x54, 0x12, 0x7C, + 0x12, 0x06, 0x18, 0xD5, 0x73, 0x7C, 0x62, 0x46, 0x5B, 0x1E, 0x5A, 0x43, 0x33, 0x7C, 0x51, 0x18, + 0x0B, 0x4D, 0x5B, 0x1E, 0x20, 0x35, 0xC9, 0x18, 0x2B, 0x69, 0x02, 0x22, 0x5A, 0x54, 0xAB, 0x68, + 0x4C, 0x00, 0x42, 0x8B, 0x1A, 0x53, 0x1A, 0x22, 0x82, 0x5E, 0x30, 0x7D, 0x82, 0x42, 0x02, 0xDD, + 0x2A, 0x69, 0x00, 0x20, 0x50, 0x54, 0xF0, 0xBD, 0x14, 0x04, 0x00, 0x20, 0x24, 0x01, 0x00, 0x20, + 0x84, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x05, 0x20, 0x00, 0x07, 0x80, 0x69, 0x10, 0x21, 0x88, 0x43, + 0x10, 0x30, 0x05, 0x21, 0x09, 0x07, 0x88, 0x61, 0x03, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, + 0x01, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x14, 0x01, 0x00, 0x20, 0xF7, 0xB5, 0x82, 0xB0, + 0x04, 0x46, 0x0D, 0x46, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0x28, 0xFC, 0x00, 0x07, 0x00, 0x0F, + 0x02, 0x28, 0x17, 0xD2, 0x68, 0x01, 0xA0, 0x42, 0x14, 0xD2, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, + 0x49, 0x07, 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x09, 0x07, + 0x88, 0x43, 0x04, 0x99, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0x0F, 0xFC, 0x00, 0x09, + 0x86, 0x1E, 0x4C, 0xE0, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x49, 0x07, 0x88, 0x43, 0x41, 0x18, + 0x04, 0x98, 0x01, 0x60, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x09, 0x07, 0x88, 0x43, 0x40, 0x18, + 0x04, 0x99, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0xF8, 0xFB, 0x86, 0x1E, 0x21, 0x48, + 0x86, 0x42, 0x34, 0xDD, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x49, 0x07, 0x88, 0x43, 0x41, 0x18, + 0x04, 0x98, 0x01, 0x60, 0x04, 0x98, 0x00, 0x68, 0x01, 0x21, 0x09, 0x07, 0x88, 0x43, 0x04, 0x99, + 0x08, 0x60, 0x08, 0x27, 0x20, 0xE0, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0xDF, 0xFB, 0x79, 0x1C, + 0x01, 0x90, 0xFF, 0xF7, 0xDB, 0xFB, 0x03, 0x29, 0x15, 0xD2, 0x04, 0x98, 0x01, 0x68, 0x0F, 0x20, + 0x00, 0x06, 0x81, 0x43, 0x38, 0x06, 0x0F, 0x22, 0x12, 0x06, 0x10, 0x40, 0x01, 0x43, 0x04, 0x98, + 0x01, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFF, 0xF7, 0xC9, 0xFB, 0x79, 0x1C, 0x01, 0x90, 0xFF, 0xF7, + 0xC5, 0xFB, 0x86, 0x1E, 0x02, 0xE0, 0x7F, 0x1C, 0x10, 0x2F, 0xDC, 0xDB, 0x00, 0xBF, 0x04, 0x98, + 0x00, 0x68, 0x00, 0x0C, 0x00, 0x04, 0xB1, 0xB2, 0x08, 0x43, 0x04, 0x99, 0x08, 0x60, 0x05, 0xB0, + 0xF0, 0xBD, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xB5, 0x8B, 0x4D, 0x2B, 0x68, 0x2D, 0x68, + 0x23, 0x26, 0x76, 0x01, 0xAC, 0x19, 0x89, 0x4D, 0x2D, 0x68, 0x01, 0x95, 0x87, 0x4D, 0x2D, 0x68, + 0xAD, 0x19, 0x00, 0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, - 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x3E, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, + 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x7D, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, 0x00, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, - 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x33, 0x4D, 0x2D, 0x78, 0xA8, 0x42, + 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x72, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x0A, 0x28, - 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x2F, 0x4E, 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, - 0xC5, 0xDB, 0x2B, 0x4D, 0x2D, 0x78, 0x00, 0x2D, 0x3C, 0xD0, 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, + 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x6B, 0x4E, 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, + 0xC5, 0xDB, 0x6A, 0x4D, 0x2D, 0x78, 0x00, 0x2D, 0x3C, 0xD0, 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, - 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x21, 0x4D, 0x2D, 0x78, 0xA8, 0x42, + 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x60, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, 0x00, 0x9F, 0xBE, 0x5B, - 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x15, 0x4D, 0x2D, 0x78, + 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x54, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, - 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x0F, 0x4E, 0x36, 0x78, 0x02, 0x9D, - 0xB5, 0x42, 0xC5, 0xDB, 0x05, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x4E, 0x00, 0xA5, 0x53, - 0x49, 0x1C, 0x23, 0x25, 0x2D, 0x01, 0xA9, 0x42, 0xF5, 0xDB, 0xFE, 0xBD, 0xC0, 0x01, 0x00, 0x20, - 0xBC, 0x01, 0x00, 0x20, 0x41, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, - 0x42, 0x01, 0x00, 0x20, 0x45, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, 0xFC, 0xB5, 0xF7, 0x48, - 0xC0, 0x7A, 0xF0, 0x26, 0x30, 0x42, 0x02, 0xD0, 0x00, 0x24, 0x00, 0x25, 0x04, 0xE0, 0xF3, 0x48, - 0x80, 0x7D, 0x04, 0x11, 0xF1, 0x48, 0x85, 0x7D, 0x00, 0x20, 0x01, 0x90, 0xEF, 0x48, 0x80, 0x79, - 0xC0, 0x06, 0xC0, 0x0F, 0x01, 0xD0, 0x10, 0x20, 0x01, 0x90, 0x01, 0x99, 0x00, 0x23, 0x2C, 0xE0, - 0xEA, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xFF, 0x28, 0x24, 0xD0, 0xE8, 0x48, 0x1A, 0x30, 0x40, 0x5C, - 0xE7, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0xE6, 0x48, 0x00, 0x68, 0x5E, 0x1C, 0x84, 0x55, 0xE4, 0x48, - 0x00, 0x68, 0x9E, 0x1C, 0x84, 0x55, 0xE2, 0x48, 0x00, 0x68, 0xDE, 0x1C, 0x84, 0x55, 0xDF, 0x48, - 0x1A, 0x30, 0x40, 0x5C, 0xDF, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0xDE, 0x48, 0x00, 0x68, 0x5E, 0x1C, - 0x84, 0x55, 0xDC, 0x48, 0x00, 0x68, 0x9E, 0x1C, 0x84, 0x55, 0xDA, 0x48, 0x00, 0x68, 0xDE, 0x1C, - 0x84, 0x55, 0x00, 0xE0, 0x03, 0xE0, 0x49, 0x1C, 0x1B, 0x1D, 0x40, 0x2B, 0xD0, 0xDB, 0x00, 0xBF, - 0xD5, 0x48, 0x00, 0x78, 0x40, 0x1E, 0x80, 0x00, 0xD1, 0x4E, 0x36, 0x68, 0x30, 0x5C, 0x10, 0x26, - 0x30, 0x43, 0xD1, 0x4E, 0x36, 0x78, 0x76, 0x1E, 0xB6, 0x00, 0xCD, 0x4F, 0x3F, 0x68, 0xB8, 0x55, - 0xCD, 0x48, 0x00, 0x78, 0x40, 0x1E, 0x80, 0x00, 0xCA, 0x4E, 0x36, 0x68, 0x30, 0x5C, 0x10, 0x26, - 0x30, 0x43, 0xC9, 0x4E, 0x36, 0x78, 0x76, 0x1E, 0xB6, 0x00, 0xC6, 0x4F, 0x3F, 0x68, 0xB8, 0x55, - 0x01, 0x9E, 0x30, 0x46, 0x10, 0x30, 0xC6, 0x17, 0xF6, 0x0E, 0x36, 0x18, 0x76, 0x11, 0x76, 0x01, - 0x81, 0x1B, 0x40, 0x23, 0x2C, 0xE0, 0xBD, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xFF, 0x28, 0x24, 0xD0, - 0xBA, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xBA, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0xB8, 0x48, 0x00, 0x68, - 0x5E, 0x1C, 0x85, 0x55, 0xB6, 0x48, 0x00, 0x68, 0x9E, 0x1C, 0x85, 0x55, 0xB4, 0x48, 0x00, 0x68, - 0xDE, 0x1C, 0x85, 0x55, 0xB1, 0x48, 0x1A, 0x30, 0x40, 0x5C, 0xB2, 0x4E, 0x36, 0x68, 0xF0, 0x54, - 0xB0, 0x48, 0x00, 0x68, 0x5E, 0x1C, 0x85, 0x55, 0xAE, 0x48, 0x00, 0x68, 0x9E, 0x1C, 0x85, 0x55, - 0xAC, 0x48, 0x00, 0x68, 0xDE, 0x1C, 0x85, 0x55, 0x00, 0xE0, 0x03, 0xE0, 0x49, 0x1C, 0x1B, 0x1D, - 0x80, 0x2B, 0xD0, 0xDB, 0x00, 0xBF, 0xA5, 0x48, 0xC0, 0x7A, 0xF0, 0x26, 0x30, 0x42, 0x41, 0xD0, - 0xA2, 0x48, 0x80, 0x7D, 0x04, 0x11, 0xA1, 0x48, 0x85, 0x7D, 0xC0, 0x7A, 0x10, 0x26, 0x30, 0x42, - 0x04, 0xD1, 0x9E, 0x48, 0xC0, 0x7A, 0x40, 0x26, 0x30, 0x42, 0x12, 0xD0, 0x9C, 0x48, 0x00, 0x68, - 0x44, 0x70, 0x9B, 0x48, 0x00, 0x68, 0x84, 0x70, 0x99, 0x48, 0x00, 0x68, 0xC4, 0x70, 0x99, 0x48, - 0x00, 0x68, 0x45, 0x70, 0x97, 0x48, 0x00, 0x68, 0x85, 0x70, 0x96, 0x48, 0x00, 0x68, 0xC5, 0x70, - 0x20, 0xE0, 0x92, 0x48, 0xC0, 0x7A, 0x20, 0x26, 0x30, 0x42, 0x03, 0xD1, 0x8F, 0x48, 0xC0, 0x7A, - 0x30, 0x42, 0x17, 0xD0, 0xD8, 0x1E, 0x8E, 0x4E, 0x36, 0x68, 0x34, 0x54, 0x98, 0x1E, 0x8C, 0x4E, - 0x36, 0x68, 0x34, 0x54, 0x58, 0x1E, 0x8A, 0x4E, 0x36, 0x68, 0x34, 0x54, 0xD8, 0x1E, 0x89, 0x4E, - 0x36, 0x68, 0x35, 0x54, 0x98, 0x1E, 0x87, 0x4E, 0x36, 0x68, 0x35, 0x54, 0x58, 0x1E, 0x85, 0x4E, - 0x36, 0x68, 0x35, 0x54, 0x85, 0x48, 0x00, 0x78, 0x40, 0x1E, 0x80, 0x00, 0x40, 0x30, 0x80, 0x4E, - 0x36, 0x68, 0x30, 0x5C, 0x10, 0x26, 0x30, 0x43, 0x80, 0x4E, 0x36, 0x78, 0x76, 0x1E, 0xB6, 0x00, - 0x40, 0x36, 0x7B, 0x4F, 0x3F, 0x68, 0xB8, 0x55, 0x7C, 0x48, 0x00, 0x78, 0x40, 0x1E, 0x80, 0x00, - 0x40, 0x30, 0x78, 0x4E, 0x36, 0x68, 0x30, 0x5C, 0x10, 0x26, 0x30, 0x43, 0x77, 0x4E, 0x36, 0x78, - 0x76, 0x1E, 0xB6, 0x00, 0x40, 0x36, 0x73, 0x4F, 0x3F, 0x68, 0xB8, 0x55, 0x80, 0x23, 0x72, 0x48, - 0x00, 0x78, 0x6F, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x6F, 0x48, 0x00, 0x78, 0x1E, 0x46, 0x5B, 0x1C, - 0x6C, 0x4F, 0x3F, 0x68, 0xB8, 0x55, 0x6D, 0x48, 0x00, 0x78, 0x69, 0x4E, 0x36, 0x68, 0xF0, 0x54, - 0x6A, 0x48, 0x00, 0x78, 0x1E, 0x46, 0x5B, 0x1C, 0x66, 0x4F, 0x3F, 0x68, 0xB8, 0x55, 0x68, 0x48, - 0x00, 0x78, 0x63, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x66, 0x48, 0x00, 0x78, 0x1E, 0x46, 0x5B, 0x1C, - 0x60, 0x4F, 0x3F, 0x68, 0xB8, 0x55, 0x64, 0x48, 0x00, 0x78, 0x5D, 0x4E, 0x36, 0x68, 0xF0, 0x54, - 0x62, 0x48, 0x06, 0x78, 0x18, 0x46, 0x5B, 0x1C, 0x5A, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x03, 0x20, - 0x57, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x02, 0x20, 0x56, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x53, 0x48, - 0x80, 0x79, 0xC0, 0x06, 0xC0, 0x0F, 0x07, 0xD0, 0x02, 0x20, 0x51, 0x4E, 0x36, 0x68, 0xF0, 0x54, - 0x03, 0x20, 0x50, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x5B, 0x1C, 0x00, 0x21, 0x0D, 0xE0, 0x4B, 0x48, - 0x10, 0x30, 0x40, 0x5C, 0x4A, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x48, 0x48, 0x10, 0x30, 0x40, 0x5C, - 0x48, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x49, 0x1C, 0x5B, 0x1C, 0x06, 0x29, 0xEF, 0xDB, 0x00, 0x20, - 0x43, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x01, 0x26, 0x18, 0x46, 0x5B, 0x1C, 0x41, 0x4F, 0x3F, 0x68, - 0x3E, 0x54, 0x3E, 0x48, 0xC0, 0x7D, 0x03, 0x26, 0x30, 0x43, 0x3D, 0x4E, 0x36, 0x68, 0xF0, 0x54, - 0x3A, 0x48, 0xC6, 0x7D, 0x03, 0x20, 0x06, 0x43, 0x18, 0x46, 0x5B, 0x1C, 0x39, 0x4F, 0x3F, 0x68, - 0x3E, 0x54, 0x36, 0x48, 0x40, 0x30, 0xC0, 0x79, 0x00, 0x07, 0x00, 0x0F, 0x03, 0x28, 0x7A, 0xD1, - 0x00, 0x24, 0x00, 0x25, 0x00, 0x20, 0x3A, 0x4E, 0x30, 0x70, 0x00, 0x21, 0x1D, 0xE0, 0x2F, 0x48, - 0x3F, 0x30, 0x40, 0x5C, 0x02, 0x07, 0x12, 0x0F, 0x08, 0x2A, 0x09, 0xDA, 0x01, 0x20, 0x90, 0x40, - 0x20, 0x43, 0xC4, 0xB2, 0x32, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x31, 0x4E, 0x30, 0x70, 0x0B, 0xE0, - 0x0A, 0x2A, 0x09, 0xDA, 0x08, 0x3A, 0x01, 0x20, 0x90, 0x40, 0x28, 0x43, 0xC5, 0xB2, 0x2C, 0x48, - 0x00, 0x78, 0x40, 0x1C, 0x2A, 0x4E, 0x30, 0x70, 0x49, 0x1C, 0x08, 0x29, 0xDF, 0xDB, 0x20, 0x48, - 0x00, 0x68, 0xC4, 0x54, 0x18, 0x46, 0x5B, 0x1C, 0x1E, 0x4E, 0x36, 0x68, 0x34, 0x54, 0x1C, 0x48, - 0x00, 0x68, 0xC5, 0x54, 0x18, 0x46, 0x5B, 0x1C, 0x1A, 0x4E, 0x36, 0x68, 0x35, 0x54, 0x20, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x53, 0xDD, 0x15, 0x48, 0x40, 0x30, 0x84, 0x7A, 0x0F, 0x2C, 0x00, 0xDD, - 0x0F, 0x24, 0x7C, 0x20, 0x01, 0x90, 0x10, 0x20, 0x20, 0x43, 0x06, 0x46, 0x01, 0x98, 0x47, 0x1C, - 0x01, 0x97, 0x10, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x0C, 0x48, 0x40, 0x30, 0x46, 0x7A, 0x01, 0x98, - 0x47, 0x1C, 0x01, 0x97, 0x0B, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x08, 0x48, 0x40, 0x30, 0x46, 0x7A, - 0x01, 0x98, 0x47, 0x1C, 0x01, 0x97, 0x07, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x03, 0x48, 0x40, 0x30, - 0x40, 0x7A, 0x04, 0x4E, 0x36, 0x68, 0x01, 0x9F, 0xF0, 0x55, 0x28, 0xE0, 0x39, 0x04, 0x00, 0x20, - 0xB4, 0x00, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, - 0x41, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, 0x45, 0x01, 0x00, 0x20, - 0x95, 0x03, 0x00, 0x20, 0xFF, 0xE7, 0x00, 0x20, 0x24, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x00, 0x26, - 0x18, 0x46, 0x5B, 0x1C, 0x22, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x00, 0x20, 0x1F, 0x4E, 0x36, 0x68, - 0xF0, 0x54, 0x00, 0x26, 0x18, 0x46, 0x5B, 0x1C, 0x1D, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0x1D, 0x4E, - 0xB6, 0x7F, 0x77, 0x00, 0xF0, 0x19, 0xC6, 0x17, 0xB6, 0x0F, 0x36, 0x18, 0xB6, 0x05, 0x34, 0x0E, - 0x16, 0x48, 0x00, 0x68, 0xC4, 0x54, 0x18, 0x46, 0x5B, 0x1C, 0x15, 0x4E, 0x36, 0x68, 0x34, 0x54, - 0x14, 0x48, 0x20, 0x30, 0x00, 0x7A, 0x11, 0x4E, 0x36, 0x68, 0xF0, 0x54, 0x11, 0x48, 0x20, 0x30, - 0x00, 0x7A, 0x1E, 0x46, 0x5B, 0x1C, 0x0E, 0x4F, 0x3F, 0x68, 0xB8, 0x55, 0x0E, 0x4E, 0x30, 0x78, - 0xC6, 0x17, 0xB6, 0x0F, 0x36, 0x18, 0xB6, 0x10, 0x08, 0x4F, 0x3F, 0x68, 0xFE, 0x54, 0x0A, 0x48, - 0x00, 0x78, 0x00, 0x90, 0xC0, 0x17, 0x86, 0x0F, 0x00, 0x98, 0x30, 0x18, 0x86, 0x10, 0x18, 0x46, - 0x5B, 0x1C, 0x03, 0x4F, 0x3F, 0x68, 0x3E, 0x54, 0xD8, 0xB2, 0xFC, 0xBD, 0xB4, 0x00, 0x00, 0x20, - 0xB8, 0x00, 0x00, 0x20, 0x59, 0x04, 0x00, 0x20, 0x4B, 0x01, 0x00, 0x20, 0x00, 0x20, 0x1B, 0xE0, - 0x41, 0x00, 0x10, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x0F, 0x4A, 0x91, 0x42, 0x05, 0xDD, 0x11, 0x46, - 0x42, 0x00, 0x0C, 0x4B, 0x1B, 0x68, 0x99, 0x52, 0x0D, 0xE0, 0x41, 0x00, 0x09, 0x4A, 0x12, 0x68, - 0x51, 0x5E, 0x09, 0x4A, 0xD2, 0x43, 0x91, 0x42, 0x05, 0xDA, 0x7F, 0x21, 0x49, 0x02, 0x42, 0x00, - 0x04, 0x4B, 0x1B, 0x68, 0x99, 0x52, 0x40, 0x1C, 0x23, 0x21, 0x49, 0x01, 0x88, 0x42, 0xDF, 0xD3, - 0x70, 0x47, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x20, 0xFF, 0x01, 0x00, 0x00, 0x70, 0xB5, 0x12, 0x4C, - 0x00, 0x21, 0x23, 0x46, 0x80, 0x3B, 0x08, 0x46, 0x1E, 0x7E, 0x65, 0x69, 0x05, 0xE0, 0x42, 0x00, - 0xAA, 0x5E, 0x8A, 0x42, 0x00, 0xDD, 0x11, 0x46, 0x40, 0x1C, 0xB0, 0x42, 0xF7, 0xDB, 0x0A, 0x48, - 0xCA, 0x0F, 0x40, 0x38, 0x01, 0x83, 0x00, 0x20, 0x51, 0x18, 0x4D, 0x10, 0x08, 0xE0, 0x62, 0x69, - 0x41, 0x00, 0x56, 0x5E, 0xAE, 0x42, 0x02, 0xDA, 0xDE, 0x7C, 0x76, 0x1E, 0x56, 0x52, 0x40, 0x1C, - 0x19, 0x7E, 0x88, 0x42, 0xF3, 0xDB, 0x70, 0xBD, 0xB8, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x69, 0x48, - 0x00, 0x90, 0x00, 0x78, 0x00, 0x22, 0x00, 0x28, 0x7E, 0xD0, 0x66, 0x4B, 0x20, 0x3B, 0x19, 0x7E, - 0x81, 0x42, 0x79, 0xD9, 0x00, 0x20, 0x01, 0x46, 0x29, 0xE0, 0x62, 0x4B, 0x61, 0x4D, 0x60, 0x33, - 0x9B, 0x6B, 0x00, 0x24, 0x60, 0x35, 0x1C, 0x54, 0x2B, 0x69, 0x5E, 0x4E, 0x5C, 0x18, 0x65, 0x78, - 0x5B, 0x5C, 0x60, 0x36, 0x5B, 0x19, 0xB5, 0x6A, 0x44, 0x00, 0x5B, 0x08, 0x2B, 0x53, 0x33, 0x69, - 0x87, 0x00, 0x5B, 0x18, 0x9D, 0x78, 0xDE, 0x78, 0x56, 0x4B, 0xAD, 0x19, 0x60, 0x33, 0xDB, 0x6A, - 0x6D, 0x08, 0x1D, 0x53, 0x53, 0x4B, 0x54, 0x4E, 0x60, 0x33, 0xDC, 0x6B, 0x1D, 0x46, 0xE6, 0x51, - 0x2D, 0x6C, 0x00, 0x23, 0x51, 0x4C, 0x2B, 0x54, 0x23, 0x54, 0x40, 0x1C, 0x09, 0x1D, 0x4D, 0x4B, - 0x20, 0x3B, 0x1C, 0x7E, 0xA0, 0x42, 0xD0, 0xDB, 0x00, 0x21, 0x1E, 0xE0, 0x49, 0x4F, 0x48, 0x1C, - 0x60, 0x37, 0x4B, 0x00, 0x13, 0xE0, 0xBC, 0x6A, 0x46, 0x00, 0xE5, 0x5E, 0xA4, 0x5F, 0x2C, 0x1B, - 0xFD, 0x6A, 0x64, 0x43, 0xAE, 0x5F, 0xED, 0x5E, 0xAD, 0x1B, 0x6D, 0x43, 0x64, 0x19, 0x0C, 0x2C, - 0x04, 0xDA, 0x3D, 0x6C, 0x01, 0x24, 0x6C, 0x54, 0x3D, 0x6C, 0x2C, 0x54, 0x40, 0x1C, 0x3D, 0x4C, - 0x20, 0x3C, 0x24, 0x7E, 0xA0, 0x42, 0xE6, 0xDB, 0x49, 0x1C, 0x3A, 0x4B, 0x20, 0x3B, 0x18, 0x7E, - 0x81, 0x42, 0xDB, 0xDB, 0x00, 0x21, 0x33, 0xE0, 0x36, 0x4B, 0x60, 0x33, 0x18, 0x6C, 0x40, 0x5C, - 0x00, 0x28, 0x2C, 0xD0, 0x00, 0x20, 0x8C, 0x00, 0x4B, 0x00, 0x1C, 0xE0, 0x31, 0x4D, 0x34, 0x4E, - 0x60, 0x35, 0xAD, 0x6A, 0x36, 0x5C, 0xED, 0x5E, 0xAF, 0x1B, 0x2E, 0x4D, 0x30, 0x4E, 0x60, 0x35, - 0xED, 0x6A, 0x0A, 0x36, 0x36, 0x5C, 0xED, 0x5E, 0x7F, 0x43, 0xAD, 0x1B, 0x29, 0x4E, 0x6D, 0x43, - 0x60, 0x36, 0x7D, 0x19, 0xF6, 0x6B, 0x00, 0xE0, 0x4B, 0xE0, 0x37, 0x59, 0xAF, 0x42, 0x01, 0xDD, - 0x02, 0x46, 0x35, 0x51, 0x40, 0x1C, 0x00, 0x9D, 0x2D, 0x78, 0xA8, 0x42, 0xDE, 0xDB, 0x21, 0x48, - 0x60, 0x30, 0x43, 0x6B, 0x5A, 0x54, 0x80, 0x6B, 0x83, 0x5C, 0x5B, 0x1C, 0x83, 0x54, 0x49, 0x1C, - 0x1C, 0x48, 0x20, 0x38, 0x00, 0x7E, 0x81, 0x42, 0xC6, 0xDB, 0x00, 0x24, 0x2D, 0xE0, 0x19, 0x4D, - 0x60, 0x35, 0xA8, 0x6B, 0x00, 0x57, 0x01, 0x28, 0x26, 0xDD, 0x00, 0x21, 0x2B, 0x46, 0x08, 0x46, - 0x80, 0x3B, 0x0A, 0xE0, 0x6A, 0x6B, 0x12, 0x56, 0xA2, 0x42, 0x05, 0xD1, 0x0E, 0x46, 0x2A, 0x6C, - 0x49, 0x1C, 0x02, 0x29, 0x90, 0x55, 0x03, 0xDA, 0x40, 0x1C, 0x1A, 0x7E, 0x90, 0x42, 0xF1, 0xDB, - 0x28, 0x6C, 0xAB, 0x6A, 0x41, 0x78, 0x00, 0x78, 0x4A, 0x00, 0x46, 0x00, 0x9F, 0x5F, 0x9B, 0x5E, - 0xED, 0x6A, 0xFB, 0x1A, 0xAA, 0x5E, 0xAD, 0x5F, 0x5B, 0x43, 0xAA, 0x1A, 0x52, 0x43, 0x9A, 0x18, - 0x0C, 0x2A, 0x01, 0xDA, 0x02, 0xF0, 0xDA, 0xFD, 0x64, 0x1C, 0x00, 0x98, 0x00, 0x78, 0x84, 0x42, - 0xCD, 0xDB, 0xF8, 0xBD, 0x58, 0x01, 0x00, 0x20, 0xFF, 0xFF, 0x7F, 0x00, 0xBE, 0x05, 0x00, 0x20, - 0x4A, 0x07, 0x00, 0x20, 0x10, 0xB5, 0x00, 0xBF, 0x01, 0x21, 0x08, 0x46, 0x88, 0x40, 0x16, 0x49, - 0x08, 0x60, 0x00, 0xBF, 0x59, 0x20, 0x15, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, - 0x08, 0x60, 0x00, 0xF0, 0xF9, 0xFF, 0x7D, 0x24, 0xA4, 0x02, 0x05, 0xE0, 0x20, 0x46, 0x01, 0xF0, - 0x03, 0xF8, 0xFF, 0x34, 0xFF, 0x34, 0x02, 0x34, 0x0D, 0x48, 0x84, 0x42, 0xF6, 0xDB, 0x00, 0xF0, - 0xE3, 0xFF, 0x00, 0x20, 0x09, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x01, 0x21, 0x08, 0x46, 0x88, 0x40, - 0x05, 0x49, 0x80, 0x39, 0x08, 0x60, 0x00, 0xBF, 0x48, 0x17, 0x06, 0x49, 0x08, 0x60, 0x00, 0x20, - 0x05, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0x00, 0x01, 0x00, 0x50, - 0xC8, 0xFC, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x0A, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x0E, 0x4E, - 0x8C, 0x46, 0x34, 0x7C, 0x31, 0x46, 0x80, 0x31, 0xA4, 0x1C, 0x44, 0x43, 0x00, 0x25, 0x8C, 0x61, - 0x0F, 0xE0, 0x14, 0x46, 0x04, 0xE0, 0x8E, 0x69, 0xCF, 0x68, 0x36, 0x19, 0x64, 0x1C, 0xBD, 0x55, - 0x9C, 0x42, 0xF8, 0xDD, 0x04, 0x4E, 0x8C, 0x69, 0x36, 0x7C, 0xA4, 0x19, 0xA4, 0x1C, 0x40, 0x1C, - 0x8C, 0x61, 0x60, 0x45, 0xED, 0xDD, 0xF0, 0xBD, 0x38, 0x01, 0x00, 0x20, 0xFF, 0x20, 0x01, 0x49, - 0x08, 0x70, 0x70, 0x47, 0x90, 0x00, 0x00, 0x20, 0xF8, 0xB5, 0x01, 0x20, 0x05, 0xF0, 0x56, 0xFF, - 0x59, 0x20, 0x24, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x00, 0xF0, - 0x9B, 0xFF, 0x69, 0x46, 0x1F, 0x20, 0x00, 0x03, 0x00, 0xF0, 0xCE, 0xFF, 0x01, 0x26, 0x1E, 0x49, - 0x00, 0x98, 0x88, 0x42, 0x29, 0xD1, 0x1D, 0x48, 0x05, 0x68, 0x1D, 0x4E, 0x0F, 0xE0, 0x69, 0x46, - 0x30, 0x46, 0x00, 0xF0, 0xC1, 0xFF, 0x00, 0x24, 0x05, 0xE0, 0x00, 0x98, 0x28, 0x55, 0x00, 0x98, - 0x00, 0x0A, 0x00, 0x90, 0x64, 0x1C, 0x04, 0x2C, 0xF7, 0xD3, 0x2D, 0x1D, 0x36, 0x1D, 0x14, 0x48, - 0x5E, 0x30, 0x86, 0x42, 0xEB, 0xD3, 0x00, 0x26, 0x10, 0x48, 0x05, 0x68, 0x00, 0x24, 0x09, 0xE0, - 0x20, 0x46, 0x65, 0x30, 0x0F, 0x49, 0x08, 0x5C, 0x29, 0x5D, 0x88, 0x42, 0x01, 0xD0, 0x01, 0x26, - 0x02, 0xE0, 0x64, 0x1C, 0x5E, 0x2C, 0xF3, 0xD3, 0x00, 0xBF, 0x01, 0xF0, 0xE3, 0xFC, 0x00, 0xF0, - 0x5B, 0xFF, 0x00, 0x20, 0x03, 0x49, 0x08, 0x60, 0x01, 0x20, 0x05, 0xF0, 0x2D, 0xFF, 0xF0, 0xB2, - 0xF8, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x21, 0x43, 0x65, 0x87, 0xC4, 0x01, 0x00, 0x20, - 0x04, 0xF0, 0x01, 0x00, 0xD4, 0x03, 0x00, 0x20, 0x04, 0x4B, 0x40, 0x00, 0x1A, 0x5A, 0x00, 0x2A, - 0x01, 0xD0, 0x51, 0x18, 0x49, 0x08, 0x19, 0x52, 0x70, 0x47, 0x00, 0x00, 0x98, 0x1A, 0x00, 0x20, - 0xF0, 0xB5, 0x13, 0x4F, 0x00, 0x20, 0x39, 0x46, 0x24, 0x39, 0x10, 0x4D, 0x03, 0x46, 0x4E, 0x79, - 0x19, 0xE0, 0x0E, 0x4A, 0x0D, 0x4C, 0x41, 0x00, 0x10, 0x3A, 0x20, 0x3C, 0x52, 0x5A, 0x64, 0x5A, - 0x12, 0x1B, 0x0B, 0x4C, 0x12, 0xB2, 0x08, 0x34, 0x24, 0x5C, 0x54, 0x43, 0x22, 0x11, 0x6C, 0x5E, - 0x12, 0xB2, 0x54, 0x43, 0x00, 0x2C, 0x03, 0xDA, 0x04, 0x4C, 0x10, 0x34, 0x63, 0x52, 0x3B, 0x54, - 0x40, 0x1C, 0x6A, 0x52, 0xC0, 0xB2, 0xB0, 0x42, 0xE3, 0xD3, 0xF0, 0xBD, 0xB8, 0x1A, 0x00, 0x20, - 0xB4, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x1C, 0x48, 0x00, 0x78, 0x00, 0x28, 0x13, 0xD0, 0x00, 0x20, - 0x19, 0x49, 0x08, 0x70, 0x04, 0xF0, 0xB4, 0xF9, 0xFF, 0xF7, 0x66, 0xFF, 0x00, 0x28, 0x0A, 0xD0, - 0x06, 0xF0, 0xC2, 0xFC, 0x01, 0x20, 0x15, 0x49, 0x08, 0x70, 0x15, 0x49, 0x08, 0x70, 0x15, 0x49, - 0x08, 0x70, 0x15, 0x49, 0x08, 0x70, 0x15, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x07, 0xF0, - 0x21, 0xFC, 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x70, 0x10, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, 0x09, 0xF0, 0xDD, 0xFC, 0x0A, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x02, 0xD0, 0x03, 0x20, 0x09, 0xF0, 0xD6, 0xFC, 0x0A, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x01, 0xD1, - 0x06, 0xF0, 0x9C, 0xFA, 0x10, 0xBD, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x20, 0xAA, 0x00, 0x00, 0x20, - 0x9C, 0x00, 0x00, 0x20, 0xA4, 0x00, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x20, 0xAB, 0x00, 0x00, 0x20, - 0xA5, 0x00, 0x00, 0x20, 0x3F, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x20, 0x76, 0x49, 0x08, 0x70, - 0x76, 0x49, 0x08, 0x70, 0x01, 0x20, 0x76, 0x49, 0x08, 0x70, 0x06, 0xF0, 0x53, 0xFB, 0x02, 0xF0, - 0xE7, 0xFD, 0xFF, 0xF7, 0x0B, 0xFA, 0x73, 0x48, 0x00, 0x78, 0x04, 0x28, 0x0A, 0xDA, 0x71, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x06, 0xD0, 0x70, 0x48, 0x00, 0x78, 0x01, 0x28, 0x02, 0xD1, 0x07, 0xF0, - 0x17, 0xFC, 0x07, 0xE0, 0x6D, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xDD, 0xFF, 0xF7, 0x76, 0xFD, - 0x06, 0xF0, 0xD2, 0xFB, 0x69, 0x48, 0x00, 0x68, 0x01, 0x28, 0x7D, 0xDD, 0x00, 0x20, 0x64, 0x49, - 0x08, 0x70, 0x67, 0x49, 0x08, 0x5E, 0x67, 0x49, 0x09, 0x78, 0x88, 0x42, 0x07, 0xDC, 0x65, 0x48, - 0x00, 0x78, 0x40, 0x42, 0x64, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, 0x06, 0xDD, 0x5A, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x08, 0xD1, 0x59, 0x49, 0x08, 0x70, 0x05, 0xE0, 0x01, 0x20, 0x56, 0x49, - 0x08, 0x70, 0x00, 0x20, 0x5D, 0x49, 0x08, 0x70, 0x58, 0x48, 0x00, 0x68, 0x0A, 0x28, 0x7E, 0xDB, - 0x5B, 0x48, 0x00, 0x78, 0x01, 0x28, 0x29, 0xD1, 0x56, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD1, 0x18, - 0xCA, 0x0F, 0x52, 0x18, 0x52, 0x10, 0x52, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0C, 0xDB, - 0x50, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD0, 0x18, 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x52, 0x42, - 0x4D, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x11, 0xDD, 0x4E, 0x49, 0x00, 0x20, 0x08, 0x5E, - 0x4D, 0x49, 0x88, 0x42, 0x07, 0xDA, 0x4B, 0x48, 0x00, 0x88, 0x4C, 0x49, 0x09, 0x88, 0x40, 0x18, - 0x00, 0xB2, 0x48, 0x49, 0x08, 0x80, 0x01, 0x20, 0x49, 0x49, 0x08, 0x70, 0x5B, 0xE0, 0x41, 0x4A, - 0x12, 0x78, 0x53, 0x00, 0xD1, 0x18, 0xCA, 0x17, 0x92, 0x0F, 0x52, 0x18, 0x92, 0x10, 0x3C, 0x4B, - 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0D, 0xDB, 0x3A, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD0, 0x18, - 0xC2, 0x17, 0x92, 0x0F, 0x12, 0x18, 0x92, 0x10, 0x52, 0x42, 0x37, 0x4B, 0x00, 0x24, 0x1C, 0x5F, - 0xA2, 0x42, 0x12, 0xDD, 0x37, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x37, 0x49, 0x88, 0x42, 0x07, 0xDA, - 0x34, 0x48, 0x00, 0x88, 0x35, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x31, 0x49, 0x08, 0x80, - 0x02, 0x20, 0x33, 0x49, 0x08, 0x70, 0x2E, 0xE0, 0x38, 0xE0, 0x28, 0x4A, 0x12, 0x68, 0x64, 0x2A, - 0x29, 0xDB, 0x2F, 0x4A, 0x12, 0x78, 0x03, 0x2A, 0x25, 0xDA, 0x26, 0x4A, 0x11, 0x78, 0xCA, 0x0F, - 0x52, 0x18, 0x52, 0x10, 0x22, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x1B, 0xDD, 0x21, 0x4A, - 0x10, 0x78, 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x52, 0x42, 0x1F, 0x4B, 0x00, 0x24, 0x1C, 0x5F, - 0xA2, 0x42, 0x10, 0xDA, 0x1F, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x1F, 0x49, 0x00, 0xE0, 0x07, 0xE0, - 0x88, 0x42, 0x08, 0xDA, 0x00, 0x20, 0x1B, 0x49, 0x08, 0x80, 0x1D, 0x49, 0x08, 0x70, 0x02, 0xE0, - 0x01, 0x20, 0x1B, 0x49, 0x08, 0x70, 0x11, 0x48, 0x00, 0x68, 0x64, 0x28, 0x03, 0xDB, 0x18, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, 0x09, 0x49, 0x08, 0x70, 0x07, 0x48, 0x00, 0x78, - 0x01, 0x28, 0x02, 0xD1, 0x06, 0xF0, 0x30, 0xFD, 0x01, 0xE0, 0x06, 0xF0, 0xC5, 0xFF, 0x02, 0x20, - 0x10, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x00, 0x00, 0x0A, 0x01, 0x00, 0x20, 0x14, 0x01, 0x00, 0x20, - 0x0B, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0xEF, 0x00, 0x00, 0x20, 0x10, 0x01, 0x00, 0x20, - 0x88, 0x01, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, 0x86, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x20, - 0xEE, 0x00, 0x00, 0x20, 0x0C, 0x01, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, - 0x0E, 0x01, 0x00, 0x20, 0x2C, 0x02, 0x00, 0x20, 0xFF, 0xB5, 0xC4, 0x4A, 0x00, 0x20, 0x13, 0x46, - 0x80, 0x3B, 0x19, 0x46, 0x90, 0x61, 0x40, 0x31, 0x18, 0x46, 0x20, 0x30, 0x03, 0x90, 0xBF, 0x48, - 0x44, 0x6A, 0x82, 0x69, 0xA0, 0x5C, 0x00, 0x28, 0x7E, 0xD0, 0xBD, 0x4D, 0xAC, 0x5C, 0x00, 0x2C, - 0x12, 0xD1, 0x03, 0x98, 0x80, 0x78, 0x00, 0x28, 0x01, 0xD1, 0xA0, 0x20, 0x0A, 0xE0, 0x01, 0x28, - 0x01, 0xD1, 0x80, 0x20, 0x06, 0xE0, 0x02, 0x28, 0x01, 0xD1, 0x40, 0x20, 0x02, 0xE0, 0x03, 0x28, - 0x05, 0xD1, 0xD8, 0x78, 0x88, 0x82, 0x02, 0xE0, 0xD8, 0x78, 0xC0, 0x00, 0xFA, 0xE7, 0x24, 0x07, - 0x00, 0x20, 0x24, 0x0F, 0x01, 0x2C, 0x1C, 0xD1, 0xAC, 0x4D, 0x54, 0x00, 0xEA, 0x69, 0xAD, 0x4D, - 0x94, 0x46, 0x2E, 0x5F, 0xDD, 0x78, 0x12, 0x5F, 0x77, 0x19, 0xBA, 0x42, 0x04, 0xDD, 0x01, 0x20, - 0x52, 0x1B, 0x65, 0x46, 0x2A, 0x53, 0x51, 0xE0, 0x14, 0x27, 0xCF, 0x5F, 0xD7, 0x19, 0xB7, 0x42, - 0x4C, 0xDA, 0x01, 0x20, 0x52, 0x19, 0x65, 0x46, 0xA0, 0x4E, 0x2A, 0x53, 0xA0, 0x4C, 0xB2, 0x69, - 0x3D, 0xE0, 0x9E, 0x4D, 0x02, 0x2C, 0x17, 0xD1, 0xEF, 0x69, 0x54, 0x00, 0xDD, 0x78, 0x3A, 0x5F, - 0xAC, 0x46, 0x56, 0x19, 0x9B, 0x4D, 0x2D, 0x5F, 0xAE, 0x42, 0x02, 0xDA, 0x01, 0x20, 0x3E, 0x53, - 0x34, 0xE0, 0x14, 0x26, 0x8E, 0x5F, 0xAE, 0x19, 0xB2, 0x42, 0x2F, 0xDD, 0x01, 0x20, 0x66, 0x46, - 0x92, 0x1B, 0x92, 0x4D, 0x3A, 0x53, 0x10, 0xE0, 0x54, 0x00, 0xEA, 0x69, 0x91, 0x4D, 0x94, 0x46, - 0x2E, 0x5F, 0x14, 0x25, 0x4D, 0x5F, 0x12, 0x5F, 0x77, 0x19, 0xBA, 0x42, 0x0C, 0xDD, 0xDE, 0x78, - 0x01, 0x20, 0x92, 0x1B, 0x89, 0x4D, 0x66, 0x46, 0x32, 0x53, 0x89, 0x4C, 0xAA, 0x69, 0xA5, 0x5C, - 0x2D, 0x09, 0x2D, 0x01, 0x6D, 0x1C, 0x0E, 0xE0, 0x84, 0x4F, 0x55, 0x19, 0xB5, 0x42, 0x0D, 0xDA, - 0xDE, 0x78, 0x01, 0x20, 0x92, 0x19, 0x66, 0x46, 0x32, 0x53, 0x81, 0x4C, 0xBA, 0x69, 0xA5, 0x5C, - 0x2D, 0x09, 0x2D, 0x01, 0xAD, 0x1C, 0x00, 0xE0, 0xF0, 0xE0, 0xA5, 0x54, 0x7B, 0x4C, 0x7C, 0x4D, - 0xA2, 0x69, 0xAD, 0x5C, 0x2D, 0x09, 0x01, 0x2D, 0x1F, 0xD1, 0x55, 0x00, 0x02, 0x95, 0x79, 0x4E, - 0x22, 0x6A, 0x14, 0x36, 0x94, 0x46, 0x52, 0x5F, 0x76, 0x5F, 0xDD, 0x78, 0x37, 0x46, 0x76, 0x19, - 0xB2, 0x42, 0x06, 0xDD, 0x10, 0x26, 0x30, 0x43, 0x52, 0x1B, 0x02, 0x9E, 0x65, 0x46, 0xAA, 0x53, - 0x52, 0xE0, 0x14, 0x26, 0x8E, 0x5F, 0x96, 0x19, 0xBE, 0x42, 0x4D, 0xDA, 0x10, 0x26, 0x30, 0x43, - 0x52, 0x19, 0x02, 0x9D, 0x66, 0x46, 0x72, 0x53, 0x3F, 0xE0, 0x02, 0x2D, 0x19, 0xD1, 0x57, 0x00, - 0x22, 0x6A, 0x68, 0x4D, 0x94, 0x46, 0xD2, 0x5F, 0xDE, 0x78, 0x14, 0x35, 0x01, 0x96, 0xED, 0x5F, - 0x96, 0x19, 0xAE, 0x42, 0x04, 0xDA, 0x10, 0x22, 0x10, 0x43, 0x62, 0x46, 0xD6, 0x53, 0x33, 0xE0, - 0x14, 0x26, 0x8E, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x2E, 0xDD, 0x10, 0x25, 0x28, 0x43, 0x01, 0x9D, - 0x0F, 0xE0, 0x57, 0x00, 0x5B, 0x4D, 0x22, 0x6A, 0x14, 0x35, 0x94, 0x46, 0xD2, 0x5F, 0xED, 0x5F, - 0x14, 0x26, 0x00, 0x95, 0x8E, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x0C, 0xDD, 0x10, 0x25, 0x28, 0x43, - 0xDD, 0x78, 0x52, 0x1B, 0x65, 0x46, 0xEA, 0x53, 0x51, 0x4D, 0xA2, 0x69, 0xAE, 0x5C, 0x36, 0x07, - 0x36, 0x0F, 0x10, 0x36, 0x0F, 0xE0, 0x95, 0x19, 0x00, 0x9E, 0xB5, 0x42, 0x0C, 0xDA, 0x10, 0x25, - 0x28, 0x43, 0xDD, 0x78, 0x52, 0x19, 0x65, 0x46, 0xEA, 0x53, 0x49, 0x4D, 0xA2, 0x69, 0xAE, 0x5C, - 0x36, 0x07, 0x36, 0x0F, 0x20, 0x36, 0xAE, 0x54, 0x00, 0x28, 0x0D, 0xD1, 0x45, 0x4A, 0xA0, 0x69, - 0x28, 0x32, 0x40, 0x00, 0x15, 0x5A, 0xE6, 0x69, 0x14, 0x32, 0x35, 0x52, 0xA0, 0x69, 0x25, 0x6A, - 0x40, 0x00, 0x12, 0x5A, 0x2A, 0x52, 0x53, 0xE0, 0x03, 0x9A, 0x01, 0x25, 0x55, 0x70, 0x02, 0x07, - 0x12, 0x0F, 0x01, 0x2A, 0x21, 0xD1, 0xA2, 0x69, 0xE5, 0x69, 0x52, 0x00, 0x39, 0x4E, 0xAF, 0x5A, - 0xB7, 0x52, 0xAD, 0x5A, 0x28, 0x36, 0xB5, 0x52, 0x05, 0x06, 0x2D, 0x0F, 0x15, 0xD1, 0x35, 0x4F, - 0x25, 0x6A, 0x3C, 0x37, 0xBF, 0x5E, 0xAE, 0x5E, 0xBC, 0x46, 0x3F, 0x1D, 0xBE, 0x42, 0x01, 0xDD, - 0x36, 0x1F, 0x02, 0xE0, 0x36, 0x1D, 0x66, 0x45, 0x05, 0xDA, 0xAE, 0x52, 0xA2, 0x69, 0x2D, 0x4D, - 0x52, 0x00, 0x3C, 0x35, 0x00, 0xE0, 0x66, 0x46, 0xAE, 0x52, 0x02, 0x06, 0x12, 0x0F, 0x01, 0x2A, - 0x26, 0xD1, 0xA2, 0x69, 0x27, 0x4E, 0x25, 0x6A, 0x52, 0x00, 0x14, 0x36, 0xAF, 0x5A, 0xB7, 0x52, - 0x28, 0x36, 0xAD, 0x5A, 0xB5, 0x52, 0x00, 0x07, 0x1A, 0xD1, 0x22, 0x4D, 0xE0, 0x69, 0x28, 0x35, - 0xAD, 0x5E, 0x86, 0x5E, 0x2F, 0x1D, 0xBE, 0x42, 0x06, 0xDD, 0x36, 0x1F, 0x86, 0x52, 0xA0, 0x69, - 0x1C, 0x4A, 0x40, 0x00, 0x28, 0x32, 0x08, 0xE0, 0x1A, 0x4F, 0x36, 0x1D, 0x28, 0x37, 0xAE, 0x42, - 0x05, 0xDA, 0x86, 0x52, 0xA0, 0x69, 0x3A, 0x46, 0x40, 0x00, 0x16, 0x52, 0x00, 0xE0, 0x85, 0x52, - 0x12, 0x4A, 0x13, 0x4C, 0x50, 0x6A, 0x92, 0x69, 0x0A, 0x3C, 0xA4, 0x5C, 0x86, 0x5C, 0xA4, 0x46, - 0x34, 0x1B, 0x65, 0xB2, 0xDC, 0x78, 0x64, 0x00, 0xAC, 0x42, 0x01, 0xDA, 0x34, 0x1B, 0x05, 0xE0, - 0x67, 0x42, 0xAF, 0x42, 0x01, 0xDD, 0x34, 0x19, 0x00, 0xE0, 0x64, 0x46, 0x84, 0x54, 0x07, 0x48, - 0x07, 0x4C, 0x42, 0x6A, 0x80, 0x69, 0x0A, 0x3C, 0x12, 0x5C, 0x22, 0x54, 0x03, 0x4A, 0x90, 0x69, - 0x40, 0x1C, 0x90, 0x61, 0x0A, 0x28, 0x00, 0xDA, 0x81, 0xE6, 0xFF, 0xBD, 0xB8, 0x01, 0x00, 0x20, - 0xBE, 0x05, 0x00, 0x20, 0xFA, 0x06, 0x00, 0x20, 0xF0, 0xB5, 0x86, 0xB0, 0x01, 0x20, 0x00, 0x90, - 0x8C, 0x48, 0x00, 0x21, 0x05, 0x90, 0x41, 0x70, 0x20, 0x38, 0x02, 0x7E, 0x05, 0x98, 0x02, 0x70, - 0x88, 0x48, 0x60, 0x30, 0x81, 0x61, 0x87, 0x49, 0x60, 0x31, 0x48, 0x6A, 0x89, 0x69, 0x04, 0x90, - 0x40, 0x5C, 0x00, 0x28, 0x1B, 0xD1, 0x08, 0x46, 0x06, 0x22, 0x50, 0x43, 0x82, 0x4C, 0x02, 0x46, - 0x20, 0x5E, 0x40, 0x1C, 0x0E, 0xD0, 0x00, 0x20, 0x43, 0x1E, 0x12, 0x19, 0x44, 0x00, 0x40, 0x1C, - 0x13, 0x53, 0x03, 0x28, 0xFA, 0xDB, 0x7C, 0x4A, 0x00, 0x20, 0x6E, 0x3A, 0x50, 0x54, 0x05, 0x98, - 0x01, 0x22, 0x42, 0x70, 0x78, 0x4A, 0x00, 0x20, 0x82, 0x3A, 0x50, 0x54, 0xD4, 0xE0, 0x00, 0x20, - 0x00, 0x90, 0x08, 0x46, 0x06, 0x22, 0x74, 0x4B, 0x72, 0x4C, 0x50, 0x43, 0x1A, 0x5E, 0x60, 0x34, - 0x55, 0x1C, 0x36, 0xD1, 0x1D, 0x46, 0x3C, 0x35, 0x45, 0x19, 0xC0, 0x18, 0x03, 0x90, 0x23, 0x6A, - 0x00, 0x22, 0xE4, 0x69, 0xAC, 0x46, 0x48, 0x00, 0x55, 0x00, 0x03, 0x9F, 0x26, 0x5A, 0x7E, 0x53, - 0x1F, 0x5A, 0x66, 0x46, 0x52, 0x1C, 0x77, 0x53, 0x03, 0x2A, 0xF5, 0xDB, 0x66, 0x4D, 0x22, 0x5A, - 0x78, 0x35, 0x2A, 0x52, 0x1A, 0x5A, 0x14, 0x35, 0x2A, 0x52, 0x00, 0x22, 0x14, 0x35, 0x6A, 0x54, - 0x04, 0x9D, 0x61, 0x4E, 0x6D, 0x5C, 0x82, 0x3E, 0x75, 0x54, 0x35, 0x46, 0x0A, 0x35, 0x6A, 0x54, - 0x5D, 0x4A, 0x21, 0x5A, 0xC4, 0x32, 0x11, 0x52, 0x19, 0x5A, 0x14, 0x32, 0x11, 0x52, 0x21, 0x5A, - 0x14, 0x32, 0x11, 0x52, 0x19, 0x5A, 0x14, 0x32, 0x11, 0x52, 0x05, 0x99, 0x01, 0x20, 0x48, 0x70, - 0x92, 0xE0, 0x48, 0x00, 0xE1, 0x69, 0x08, 0x5E, 0x80, 0x1A, 0xFE, 0xF7, 0x30, 0xFC, 0x03, 0x21, - 0x89, 0x02, 0x88, 0x42, 0x0D, 0xD8, 0xA0, 0x69, 0x25, 0x6A, 0x42, 0x00, 0xAD, 0x5E, 0x06, 0x22, - 0x50, 0x43, 0x4D, 0x4A, 0x3C, 0x32, 0x10, 0x5E, 0x28, 0x1A, 0xFE, 0xF7, 0x20, 0xFC, 0x88, 0x42, - 0x12, 0xD9, 0x48, 0x49, 0x20, 0x39, 0xC8, 0x7F, 0x0A, 0x28, 0x0D, 0xD2, 0x40, 0x1C, 0xC8, 0x77, - 0xA0, 0x69, 0xE2, 0x69, 0x41, 0x00, 0x06, 0x25, 0x52, 0x5A, 0x68, 0x43, 0x1A, 0x52, 0x42, 0x4A, - 0x25, 0x6A, 0x3C, 0x32, 0x69, 0x5A, 0x11, 0x52, 0x3E, 0x48, 0x20, 0x38, 0xC0, 0x7F, 0x0A, 0x28, - 0x07, 0xD1, 0xA0, 0x69, 0xE1, 0x69, 0x40, 0x00, 0x09, 0x5E, 0x8C, 0x46, 0x21, 0x6A, 0x08, 0x5E, - 0x2A, 0xE0, 0xA1, 0x69, 0x06, 0x20, 0x48, 0x43, 0xC6, 0x18, 0x02, 0x22, 0x04, 0x25, 0xB2, 0x5E, - 0x75, 0x5F, 0x49, 0x00, 0x52, 0x19, 0xE5, 0x69, 0x1E, 0x5E, 0x6D, 0x5E, 0x76, 0x00, 0xAD, 0x00, - 0xAD, 0x19, 0x52, 0x19, 0x12, 0x1D, 0xD5, 0x17, 0x6D, 0x0F, 0xAA, 0x18, 0x2E, 0x4F, 0xD2, 0x10, - 0x3C, 0x37, 0xC5, 0x19, 0x94, 0x46, 0x02, 0x22, 0x04, 0x26, 0xAA, 0x5E, 0xAE, 0x5F, 0x25, 0x6A, - 0x38, 0x5E, 0x69, 0x5E, 0x40, 0x00, 0x89, 0x00, 0x92, 0x19, 0x08, 0x18, 0x10, 0x18, 0x00, 0x1D, - 0xC1, 0x17, 0x49, 0x0F, 0x08, 0x18, 0xC0, 0x10, 0x02, 0x90, 0x23, 0x49, 0xA5, 0x69, 0x60, 0x6A, - 0x82, 0x39, 0x40, 0x5D, 0x49, 0x5D, 0x2B, 0x46, 0x40, 0x18, 0x06, 0x21, 0x4B, 0x43, 0x1E, 0x49, - 0x40, 0x08, 0x3C, 0x31, 0x01, 0x90, 0x5A, 0x18, 0x01, 0x20, 0x3C, 0x39, 0x5C, 0x18, 0x41, 0x00, - 0x66, 0x5A, 0x67, 0x18, 0x7E, 0x80, 0x56, 0x5A, 0x51, 0x18, 0x4E, 0x80, 0x40, 0x1E, 0xF6, 0xD5, - 0x14, 0x48, 0x15, 0x4A, 0x61, 0x46, 0x14, 0x4C, 0x60, 0x30, 0xD1, 0x52, 0x3C, 0x34, 0x02, 0x9A, - 0xE2, 0x52, 0xC4, 0x69, 0x6B, 0x00, 0xE1, 0x52, 0x81, 0x69, 0x04, 0x6A, 0x4B, 0x00, 0x01, 0x99, - 0xE2, 0x52, 0x42, 0x6A, 0x80, 0x69, 0x11, 0x54, 0x0A, 0x49, 0x60, 0x31, 0x88, 0x69, 0x40, 0x1C, - 0x88, 0x61, 0x0A, 0x28, 0x00, 0xDA, 0xFE, 0xE6, 0x08, 0x46, 0x80, 0x38, 0xC1, 0x7F, 0x00, 0x29, - 0x06, 0xD0, 0x0A, 0x21, 0xC1, 0x77, 0x00, 0x99, 0x01, 0x29, 0x01, 0xD1, 0x00, 0x21, 0xC1, 0x77, - 0x06, 0xB0, 0xF0, 0xBD, 0x58, 0x01, 0x00, 0x20, 0x36, 0x06, 0x00, 0x20, 0xF8, 0xB5, 0x03, 0xF0, - 0x6B, 0xFE, 0x00, 0x20, 0xD2, 0x49, 0x08, 0x70, 0xD2, 0x49, 0x08, 0x80, 0xD2, 0x49, 0x08, 0x80, - 0x04, 0xF0, 0x58, 0xFB, 0xD1, 0x48, 0xC0, 0x79, 0x00, 0x07, 0x00, 0x0F, 0x03, 0x28, 0x03, 0xD1, - 0xCF, 0x48, 0x00, 0x78, 0xCF, 0x49, 0x08, 0x70, 0x00, 0x24, 0x66, 0xE1, 0xCE, 0x48, 0x00, 0x68, - 0x00, 0x5D, 0x00, 0x28, 0x7E, 0xDD, 0x60, 0x00, 0xCC, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x61, 0x00, - 0xCB, 0x4A, 0x51, 0x5A, 0x40, 0x1A, 0x05, 0xB2, 0x00, 0x2D, 0x01, 0xDA, 0x68, 0x42, 0x05, 0xB2, - 0x60, 0x00, 0xC6, 0x49, 0x09, 0x68, 0x09, 0x5A, 0x06, 0x20, 0x60, 0x43, 0xC5, 0x4A, 0x80, 0x18, - 0x40, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x03, 0xDA, 0x00, 0x98, - 0x40, 0x42, 0x00, 0xB2, 0x00, 0x90, 0x60, 0x00, 0xBF, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x61, 0x00, - 0xBE, 0x4A, 0x51, 0x5A, 0x40, 0x1A, 0x06, 0xB2, 0x00, 0x2E, 0x01, 0xDA, 0x70, 0x42, 0x06, 0xB2, - 0x60, 0x00, 0xB9, 0x49, 0x09, 0x68, 0x09, 0x5A, 0x06, 0x20, 0x60, 0x43, 0xB8, 0x4A, 0x80, 0x18, - 0x40, 0x88, 0x08, 0x1A, 0x07, 0xB2, 0x00, 0x2F, 0x01, 0xDA, 0x78, 0x42, 0x07, 0xB2, 0x01, 0x20, - 0x40, 0x02, 0x85, 0x42, 0x08, 0xDA, 0x86, 0x42, 0x06, 0xDA, 0x01, 0x20, 0xA0, 0x40, 0xA6, 0x49, - 0x09, 0x88, 0x08, 0x43, 0xA4, 0x49, 0x08, 0x80, 0x00, 0x98, 0xAA, 0x28, 0x01, 0xDC, 0xAA, 0x2F, - 0x17, 0xDD, 0x01, 0x20, 0xA0, 0x40, 0xA0, 0x49, 0x09, 0x88, 0x08, 0x43, 0x9E, 0x49, 0x08, 0x80, - 0x60, 0x00, 0xA2, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x61, 0x00, 0xA1, 0x4A, 0x50, 0x52, 0x60, 0x00, - 0xA1, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x61, 0x00, 0xA0, 0x4A, 0x50, 0x52, 0x00, 0x20, 0xA1, 0x49, - 0x08, 0x55, 0xA0, 0x48, 0x01, 0x5D, 0x00, 0x5D, 0x40, 0x1C, 0x9E, 0x4A, 0x10, 0x55, 0x64, 0x29, - 0x20, 0xDD, 0x61, 0x00, 0x95, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x62, 0x00, 0x94, 0x4B, 0x9A, 0x5E, - 0x88, 0x18, 0xC1, 0x0F, 0x09, 0x18, 0x49, 0x10, 0x09, 0xB2, 0x62, 0x00, 0x99, 0x52, 0x61, 0x00, - 0x91, 0x4A, 0x00, 0xE0, 0xE0, 0xE0, 0x12, 0x68, 0x51, 0x5E, 0x62, 0x00, 0x8F, 0x4B, 0x9A, 0x5E, - 0x88, 0x18, 0xC1, 0x0F, 0x09, 0x18, 0x49, 0x10, 0x09, 0xB2, 0x62, 0x00, 0x99, 0x52, 0x00, 0x20, - 0x8C, 0x49, 0x08, 0x55, 0x81, 0x48, 0x40, 0x38, 0x80, 0x79, 0x40, 0x06, 0xC0, 0x0F, 0x23, 0xD1, - 0x61, 0x00, 0x82, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x87, 0x4A, 0x13, 0x5E, 0x59, 0x43, 0x08, 0x46, - 0x86, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0xC4, 0xF9, 0x00, 0xB2, 0x61, 0x00, 0x7B, 0x4A, 0x12, 0x68, - 0x50, 0x52, 0x61, 0x00, 0x7C, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x81, 0x4A, 0x00, 0x23, 0xD3, 0x5E, - 0x59, 0x43, 0x08, 0x46, 0x7F, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0xB2, 0xF9, 0x01, 0xB2, 0x60, 0x00, - 0x75, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x23, 0xE0, 0x61, 0x00, 0x73, 0x4A, 0x12, 0x68, 0x51, 0x5E, - 0x75, 0x4A, 0x00, 0x23, 0xD3, 0x5E, 0x59, 0x43, 0x08, 0x46, 0x76, 0x49, 0x09, 0x88, 0xFE, 0xF7, - 0x9F, 0xF9, 0x05, 0xB2, 0x61, 0x00, 0x69, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x70, 0x4A, 0x00, 0x23, - 0xD3, 0x5E, 0x59, 0x43, 0x08, 0x46, 0x6D, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0x91, 0xF9, 0x01, 0xB2, - 0x60, 0x00, 0x65, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x60, 0x00, 0x60, 0x49, 0x09, 0x68, 0x0D, 0x52, - 0x69, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x01, 0x28, 0x05, 0xD0, 0x02, 0x28, 0x11, 0xD0, - 0x03, 0x28, 0x38, 0xD1, 0x1C, 0xE0, 0x37, 0xE0, 0x5F, 0x48, 0x00, 0x88, 0x41, 0x1E, 0x60, 0x00, - 0x56, 0x4A, 0x12, 0x68, 0x10, 0x5A, 0x08, 0x1A, 0x01, 0xB2, 0x60, 0x00, 0x53, 0x4A, 0x12, 0x68, - 0x11, 0x52, 0x29, 0xE0, 0x5A, 0x48, 0x00, 0x88, 0x41, 0x1E, 0x60, 0x00, 0x52, 0x4A, 0x12, 0x68, - 0x10, 0x5A, 0x08, 0x1A, 0x01, 0xB2, 0x60, 0x00, 0x4F, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x1B, 0xE0, - 0x51, 0x48, 0x00, 0x88, 0x41, 0x1E, 0x60, 0x00, 0x48, 0x4A, 0x12, 0x68, 0x10, 0x5A, 0x08, 0x1A, - 0x01, 0xB2, 0x60, 0x00, 0x45, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x4D, 0x48, 0x00, 0x88, 0x40, 0x1E, - 0x61, 0x00, 0x45, 0x4A, 0x12, 0x68, 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x42, 0x4A, - 0x12, 0x68, 0x50, 0x52, 0x00, 0xE0, 0x00, 0xBF, 0x00, 0xBF, 0x60, 0x00, 0x3B, 0x49, 0x09, 0x68, - 0x08, 0x5E, 0x41, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, 0x07, 0xDB, 0x08, 0x46, 0x00, 0x88, - 0x40, 0x1E, 0x00, 0xB2, 0x61, 0x00, 0x35, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x60, 0x00, 0x33, 0x49, - 0x09, 0x68, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDA, 0x00, 0x21, 0x60, 0x00, 0x2F, 0x4A, 0x12, 0x68, - 0x11, 0x52, 0x60, 0x00, 0x30, 0x49, 0x09, 0x68, 0x08, 0x5E, 0x35, 0x49, 0x00, 0x22, 0x8A, 0x5E, - 0x90, 0x42, 0x07, 0xDB, 0x08, 0x46, 0x00, 0x88, 0x40, 0x1E, 0x01, 0xB2, 0x60, 0x00, 0x2A, 0x4A, - 0x12, 0x68, 0x11, 0x52, 0x60, 0x00, 0x28, 0x49, 0x09, 0x68, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDA, - 0x00, 0x21, 0x60, 0x00, 0x24, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x01, 0x20, 0xA0, 0x40, 0x19, 0x49, - 0x09, 0x88, 0x08, 0x43, 0x17, 0x49, 0x08, 0x80, 0x64, 0x1C, 0x28, 0x48, 0x00, 0x78, 0x84, 0x42, - 0x00, 0xDA, 0x93, 0xE6, 0x17, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, 0x11, 0x48, 0x00, 0x88, - 0x00, 0x28, 0x0A, 0xD0, 0x01, 0x20, 0x22, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x70, 0x00, 0x20, - 0x20, 0x49, 0x08, 0x70, 0x01, 0x20, 0x20, 0x49, 0x08, 0x70, 0x09, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x0D, 0xD1, 0x1B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x09, 0xD0, 0x00, 0x20, 0x18, 0x49, 0x08, 0x70, - 0x01, 0x20, 0x03, 0x49, 0x08, 0x70, 0x18, 0x49, 0x08, 0x70, 0x16, 0x49, 0x08, 0x70, 0xF8, 0xBD, - 0x28, 0x02, 0x00, 0x20, 0x96, 0x00, 0x00, 0x20, 0x98, 0x00, 0x00, 0x20, 0x79, 0x04, 0x00, 0x20, - 0x98, 0x03, 0x00, 0x20, 0x55, 0x01, 0x00, 0x20, 0xDC, 0x01, 0x00, 0x20, 0xD4, 0x01, 0x00, 0x20, - 0xAE, 0x06, 0x00, 0x20, 0x36, 0x06, 0x00, 0x20, 0xD8, 0x01, 0x00, 0x20, 0xC2, 0x06, 0x00, 0x20, - 0x72, 0x06, 0x00, 0x20, 0xD6, 0x06, 0x00, 0x20, 0x92, 0x00, 0x00, 0x20, 0x82, 0x01, 0x00, 0x20, - 0x94, 0x00, 0x00, 0x20, 0x84, 0x01, 0x00, 0x20, 0x51, 0x01, 0x00, 0x20, 0x4A, 0x01, 0x00, 0x20, - 0xA2, 0x00, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x20, 0xAF, 0x00, 0x00, 0x20, 0xF7, 0xB5, 0x00, 0x26, + 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x4B, 0x4E, 0x36, 0x78, 0x02, 0x9D, + 0xB5, 0x42, 0xC5, 0xDB, 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, 0x4D, 0x00, + 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, 0x9D, 0x53, + 0x40, 0x1C, 0x49, 0x1C, 0x3E, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, 0x00, 0x25, + 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, 0x0A, 0xE0, + 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, 0x00, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x56, 0x00, + 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x33, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, + 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x02, 0x9D, + 0x6D, 0x1C, 0x02, 0x95, 0x2F, 0x4E, 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, 0x2B, 0x4D, + 0x2D, 0x78, 0x00, 0x2D, 0x3C, 0xD0, 0x00, 0x25, 0x02, 0x95, 0x34, 0xE0, 0x00, 0x20, 0x0A, 0xE0, + 0x4D, 0x00, 0x5D, 0x5B, 0x4E, 0x00, 0x01, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, 0x4E, 0x00, + 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x21, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, 0x04, 0xE0, + 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x40, 0x1C, 0x49, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, 0x00, 0x20, + 0x0A, 0xE0, 0x55, 0x00, 0x65, 0x5B, 0x56, 0x00, 0x00, 0x9F, 0xBE, 0x5B, 0xAD, 0x1B, 0x2D, 0xB2, + 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x15, 0x4D, 0x2D, 0x78, 0xA8, 0x42, 0xF0, 0xDB, + 0x04, 0xE0, 0x00, 0x25, 0x56, 0x00, 0xA5, 0x53, 0x40, 0x1C, 0x52, 0x1C, 0x0A, 0x28, 0xF8, 0xDB, + 0x02, 0x9D, 0x6D, 0x1C, 0x02, 0x95, 0x0F, 0x4E, 0x36, 0x78, 0x02, 0x9D, 0xB5, 0x42, 0xC5, 0xDB, + 0x05, 0xE0, 0x00, 0x25, 0x4E, 0x00, 0x9D, 0x53, 0x4E, 0x00, 0xA5, 0x53, 0x49, 0x1C, 0x23, 0x25, + 0x2D, 0x01, 0xA9, 0x42, 0xF5, 0xDB, 0xFE, 0xBD, 0xB0, 0x01, 0x00, 0x20, 0xAC, 0x01, 0x00, 0x20, + 0x2D, 0x01, 0x00, 0x20, 0x30, 0x01, 0x00, 0x20, 0x32, 0x01, 0x00, 0x20, 0x2E, 0x01, 0x00, 0x20, + 0x31, 0x01, 0x00, 0x20, 0x33, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0xC1, 0x48, 0xC1, 0x7E, 0x84, 0x46, + 0xC2, 0x7E, 0x09, 0x09, 0x00, 0x20, 0x00, 0x90, 0x60, 0x46, 0xC0, 0x7A, 0xC0, 0x06, 0x01, 0xD5, + 0x10, 0x20, 0x00, 0x90, 0xBB, 0x4D, 0x00, 0x9E, 0x00, 0x20, 0xB9, 0x4B, 0x60, 0x3B, 0x9F, 0x19, + 0x60, 0x37, 0xFB, 0x7F, 0xFF, 0x2B, 0x1B, 0xD0, 0xFB, 0x7F, 0x6C, 0x6B, 0x23, 0x54, 0x6B, 0x6B, + 0x1B, 0x18, 0x59, 0x70, 0x6B, 0x6B, 0x1B, 0x18, 0x99, 0x70, 0x6B, 0x6B, 0x1B, 0x18, 0xD9, 0x70, + 0xFB, 0x7F, 0xAC, 0x6B, 0x76, 0x1C, 0x23, 0x54, 0xAB, 0x6B, 0x1B, 0x18, 0x59, 0x70, 0xAB, 0x6B, + 0x1B, 0x18, 0x99, 0x70, 0xAB, 0x6B, 0x1B, 0x18, 0x00, 0x1D, 0xD9, 0x70, 0x40, 0x28, 0xDC, 0xDB, + 0xA9, 0x4B, 0x69, 0x6B, 0x18, 0x78, 0xA6, 0x4F, 0x80, 0x00, 0x40, 0x18, 0x20, 0x38, 0x04, 0x7F, + 0x10, 0x21, 0x0C, 0x43, 0x04, 0x77, 0x18, 0x78, 0xAB, 0x6B, 0x80, 0x00, 0xC0, 0x18, 0x20, 0x38, + 0x03, 0x7F, 0x0B, 0x43, 0x03, 0x77, 0x00, 0x98, 0x10, 0x30, 0xC1, 0x17, 0xC9, 0x0E, 0x09, 0x18, + 0x49, 0x09, 0x49, 0x01, 0x44, 0x1A, 0x40, 0x20, 0x60, 0x3F, 0x3E, 0x19, 0x60, 0x36, 0xF1, 0x7F, + 0xFF, 0x29, 0x1B, 0xD0, 0xF1, 0x7F, 0x6B, 0x6B, 0x19, 0x54, 0x69, 0x6B, 0x09, 0x18, 0x4A, 0x70, + 0x69, 0x6B, 0x09, 0x18, 0x8A, 0x70, 0x69, 0x6B, 0x09, 0x18, 0xCA, 0x70, 0xF1, 0x7F, 0xAB, 0x6B, + 0x64, 0x1C, 0x19, 0x54, 0xA9, 0x6B, 0x09, 0x18, 0x4A, 0x70, 0xA9, 0x6B, 0x09, 0x18, 0x8A, 0x70, + 0xA9, 0x6B, 0x09, 0x18, 0x00, 0x1D, 0xCA, 0x70, 0x80, 0x28, 0xDE, 0xDB, 0x8B, 0x4C, 0x69, 0x6B, + 0x20, 0x78, 0x89, 0x4B, 0x80, 0x00, 0x40, 0x18, 0x20, 0x30, 0x02, 0x7F, 0x10, 0x21, 0x0A, 0x43, + 0x02, 0x77, 0x20, 0x78, 0xAA, 0x6B, 0x80, 0x00, 0x80, 0x18, 0x20, 0x30, 0x02, 0x7F, 0x03, 0x26, + 0x0A, 0x43, 0x02, 0x77, 0x6A, 0x6B, 0x80, 0x20, 0x19, 0x78, 0x11, 0x54, 0x1A, 0x78, 0xAB, 0x6B, + 0x81, 0x21, 0x1A, 0x54, 0x6A, 0x6B, 0x20, 0x78, 0x50, 0x54, 0x22, 0x78, 0xAB, 0x6B, 0x7C, 0x4C, + 0x5A, 0x54, 0x21, 0x78, 0x6A, 0x6B, 0x82, 0x20, 0x7A, 0x4B, 0x11, 0x54, 0x1A, 0x78, 0xAB, 0x6B, + 0x79, 0x4C, 0x1A, 0x54, 0x6A, 0x6B, 0x83, 0x21, 0x20, 0x78, 0x78, 0x4B, 0x50, 0x54, 0x18, 0x78, + 0xAA, 0x6B, 0x84, 0x23, 0x50, 0x54, 0x68, 0x6B, 0x02, 0x21, 0xC6, 0x54, 0xA8, 0x6B, 0x62, 0x46, + 0xC1, 0x54, 0xD0, 0x7A, 0xC0, 0x06, 0x03, 0xD5, 0x68, 0x6B, 0xC1, 0x54, 0xA8, 0x6B, 0xC6, 0x54, + 0x85, 0x21, 0x00, 0x20, 0x3A, 0x18, 0x60, 0x32, 0x53, 0x7D, 0x6C, 0x6B, 0x63, 0x54, 0x52, 0x7D, + 0xAB, 0x6B, 0x4C, 0x1C, 0x40, 0x1C, 0x5A, 0x54, 0x21, 0x46, 0x06, 0x28, 0xF2, 0xDB, 0x61, 0x48, + 0x00, 0x22, 0x44, 0x6B, 0x01, 0x23, 0x62, 0x54, 0x84, 0x6B, 0x4A, 0x1C, 0x63, 0x54, 0x61, 0x46, + 0x09, 0x7F, 0x43, 0x6B, 0x31, 0x43, 0x64, 0x46, 0x99, 0x54, 0x24, 0x7F, 0x81, 0x6B, 0x34, 0x43, + 0x57, 0x48, 0x53, 0x1C, 0x40, 0x30, 0x8C, 0x54, 0x01, 0x7B, 0x09, 0x07, 0x09, 0x0F, 0x03, 0x29, + 0x7E, 0xD1, 0x00, 0x24, 0x5A, 0x4A, 0x21, 0x46, 0x14, 0x70, 0x25, 0x46, 0x50, 0x4A, 0x60, 0x3A, + 0x52, 0x19, 0xA0, 0x32, 0x12, 0x79, 0x16, 0x07, 0x36, 0x0F, 0x08, 0x2E, 0x04, 0xDA, 0x01, 0x27, + 0xB7, 0x40, 0x27, 0x43, 0xFC, 0xB2, 0x06, 0xE0, 0x0A, 0x2E, 0x08, 0xDA, 0x08, 0x3E, 0x01, 0x27, + 0xB7, 0x40, 0x0F, 0x43, 0xF9, 0xB2, 0x4E, 0x4A, 0x16, 0x78, 0x76, 0x1C, 0x16, 0x70, 0x6D, 0x1C, + 0x08, 0x2D, 0xE3, 0xDB, 0x43, 0x4E, 0x5A, 0x1C, 0x75, 0x6B, 0x17, 0x46, 0xEC, 0x54, 0xB5, 0x6B, + 0xEC, 0x54, 0x73, 0x6B, 0x54, 0x1C, 0x99, 0x54, 0xB2, 0x6B, 0x45, 0x4D, 0xD1, 0x55, 0x29, 0x78, + 0x00, 0x29, 0x14, 0xD0, 0xC2, 0x7B, 0x0F, 0x2A, 0x00, 0xD9, 0x0F, 0x22, 0x10, 0x21, 0xB5, 0x6B, + 0x7C, 0x23, 0x0A, 0x43, 0xEA, 0x54, 0x82, 0x7B, 0x7D, 0x21, 0xB3, 0x6B, 0x7E, 0x25, 0x5A, 0x54, + 0x82, 0x7B, 0xB3, 0x6B, 0x7F, 0x21, 0x5A, 0x55, 0x82, 0x7B, 0xB3, 0x6B, 0x5A, 0x54, 0xC1, 0x78, + 0x30, 0x4D, 0x4A, 0x00, 0x89, 0x18, 0x6B, 0x6B, 0x8A, 0x08, 0x1A, 0x55, 0xAB, 0x6B, 0x61, 0x1C, + 0x1A, 0x55, 0x42, 0x7B, 0x6B, 0x6B, 0x5A, 0x54, 0x43, 0x7B, 0xAC, 0x6B, 0x31, 0x4E, 0x4A, 0x1C, + 0x63, 0x54, 0x31, 0x78, 0x6B, 0x6B, 0x89, 0x08, 0x99, 0x54, 0x31, 0x78, 0x56, 0x1C, 0xAB, 0x6B, + 0x89, 0x08, 0x99, 0x54, 0x61, 0x46, 0x09, 0x7C, 0x09, 0x09, 0x36, 0xD0, 0xC2, 0x7B, 0x7C, 0x21, + 0x10, 0x23, 0x1A, 0x43, 0x6B, 0x6B, 0x5A, 0x54, 0xAC, 0x6B, 0x7D, 0x23, 0x62, 0x54, 0x81, 0x7B, + 0x6A, 0x6B, 0x7E, 0x24, 0xD1, 0x54, 0xAA, 0x6B, 0xD1, 0x54, 0x6A, 0x6B, 0x7F, 0x23, 0x11, 0x55, + 0xAA, 0x6B, 0x11, 0x55, 0x6A, 0x6B, 0xD1, 0x54, 0xAA, 0x6B, 0xD1, 0x54, 0x02, 0x79, 0x00, 0xE0, + 0x0F, 0xE0, 0x69, 0x6B, 0x80, 0x31, 0x4A, 0x73, 0x03, 0x79, 0xAA, 0x6B, 0x80, 0x32, 0x53, 0x73, + 0x43, 0x7B, 0x0B, 0x74, 0x43, 0x7B, 0x01, 0x20, 0x13, 0x74, 0x88, 0x74, 0x90, 0x74, 0x76, 0x1C, + 0x13, 0xE0, 0x0C, 0x4C, 0x00, 0x22, 0x61, 0x6B, 0xCA, 0x54, 0xA5, 0x6B, 0x59, 0x1C, 0xEA, 0x54, + 0x63, 0x6B, 0x5A, 0x54, 0xA3, 0x6B, 0x4C, 0x1C, 0xA8, 0xE7, 0x68, 0x6B, 0x00, 0x21, 0x80, 0x30, + 0x81, 0x74, 0xA8, 0x6B, 0x76, 0x1C, 0x80, 0x30, 0x81, 0x74, 0xF0, 0xB2, 0xF8, 0xBD, 0x00, 0x00, + 0x14, 0x04, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, 0x32, 0x01, 0x00, 0x20, 0x33, 0x01, 0x00, 0x20, + 0x2D, 0x01, 0x00, 0x20, 0x30, 0x01, 0x00, 0x20, 0x2E, 0x01, 0x00, 0x20, 0x31, 0x01, 0x00, 0x20, + 0x85, 0x03, 0x00, 0x20, 0x37, 0x01, 0x00, 0x20, 0x00, 0x20, 0x1B, 0xE0, 0x41, 0x00, 0x10, 0x4A, + 0x12, 0x68, 0x51, 0x5E, 0x0F, 0x4A, 0x91, 0x42, 0x05, 0xDD, 0x11, 0x46, 0x42, 0x00, 0x0C, 0x4B, + 0x1B, 0x68, 0x99, 0x52, 0x0D, 0xE0, 0x41, 0x00, 0x09, 0x4A, 0x12, 0x68, 0x51, 0x5E, 0x09, 0x4A, + 0xD2, 0x43, 0x91, 0x42, 0x05, 0xDA, 0x7F, 0x21, 0x49, 0x02, 0x42, 0x00, 0x04, 0x4B, 0x1B, 0x68, + 0x99, 0x52, 0x40, 0x1C, 0x23, 0x21, 0x49, 0x01, 0x88, 0x42, 0xDF, 0xD3, 0x70, 0x47, 0x00, 0x00, + 0xB0, 0x01, 0x00, 0x20, 0xFF, 0x01, 0x00, 0x00, 0x70, 0xB5, 0x12, 0x4C, 0x00, 0x21, 0x23, 0x46, + 0x80, 0x3B, 0x08, 0x46, 0x1E, 0x7E, 0xA5, 0x69, 0x05, 0xE0, 0x42, 0x00, 0xAA, 0x5E, 0x8A, 0x42, + 0x00, 0xDD, 0x11, 0x46, 0x40, 0x1C, 0xB0, 0x42, 0xF7, 0xDB, 0x0A, 0x48, 0xCA, 0x0F, 0x40, 0x38, + 0x01, 0x83, 0x00, 0x20, 0x51, 0x18, 0x4D, 0x10, 0x08, 0xE0, 0xA2, 0x69, 0x41, 0x00, 0x56, 0x5E, + 0xAE, 0x42, 0x02, 0xDA, 0xDE, 0x7C, 0x76, 0x1E, 0x56, 0x52, 0x40, 0x1C, 0x19, 0x7E, 0x88, 0x42, + 0xF3, 0xDB, 0x70, 0xBD, 0xA4, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x69, 0x48, 0x00, 0x90, 0x00, 0x78, + 0x00, 0x22, 0x00, 0x28, 0x7E, 0xD0, 0x66, 0x4B, 0x20, 0x3B, 0x19, 0x7E, 0x81, 0x42, 0x79, 0xD9, + 0x00, 0x20, 0x01, 0x46, 0x29, 0xE0, 0x62, 0x4B, 0x61, 0x4D, 0x60, 0x33, 0xDB, 0x6B, 0x00, 0x24, + 0x60, 0x35, 0x1C, 0x54, 0x6B, 0x69, 0x5E, 0x4E, 0x5C, 0x18, 0x65, 0x78, 0x5B, 0x5C, 0x60, 0x36, + 0x5B, 0x19, 0xF5, 0x6A, 0x44, 0x00, 0x5B, 0x08, 0x2B, 0x53, 0x73, 0x69, 0x87, 0x00, 0x5B, 0x18, + 0x9D, 0x78, 0xDE, 0x78, 0x56, 0x4B, 0xAD, 0x19, 0x60, 0x33, 0x1B, 0x6B, 0x6D, 0x08, 0x1D, 0x53, + 0x53, 0x4B, 0x54, 0x4E, 0x60, 0x33, 0x1C, 0x6C, 0x1D, 0x46, 0xE6, 0x51, 0x6D, 0x6C, 0x00, 0x23, + 0x51, 0x4C, 0x2B, 0x54, 0x23, 0x54, 0x40, 0x1C, 0x09, 0x1D, 0x4D, 0x4B, 0x20, 0x3B, 0x1C, 0x7E, + 0xA0, 0x42, 0xD0, 0xDB, 0x00, 0x21, 0x1E, 0xE0, 0x49, 0x4F, 0x48, 0x1C, 0x60, 0x37, 0x4B, 0x00, + 0x13, 0xE0, 0xFC, 0x6A, 0x46, 0x00, 0xE5, 0x5E, 0xA4, 0x5F, 0x2C, 0x1B, 0x3D, 0x6B, 0x64, 0x43, + 0xAE, 0x5F, 0xED, 0x5E, 0xAD, 0x1B, 0x6D, 0x43, 0x64, 0x19, 0x0C, 0x2C, 0x04, 0xDA, 0x7D, 0x6C, + 0x01, 0x24, 0x6C, 0x54, 0x7D, 0x6C, 0x2C, 0x54, 0x40, 0x1C, 0x3D, 0x4C, 0x20, 0x3C, 0x24, 0x7E, + 0xA0, 0x42, 0xE6, 0xDB, 0x49, 0x1C, 0x3A, 0x4B, 0x20, 0x3B, 0x18, 0x7E, 0x81, 0x42, 0xDB, 0xDB, + 0x00, 0x21, 0x33, 0xE0, 0x36, 0x4B, 0x60, 0x33, 0x58, 0x6C, 0x40, 0x5C, 0x00, 0x28, 0x2C, 0xD0, + 0x00, 0x20, 0x8C, 0x00, 0x4B, 0x00, 0x1C, 0xE0, 0x31, 0x4D, 0x34, 0x4E, 0x60, 0x35, 0xED, 0x6A, + 0x36, 0x5C, 0xED, 0x5E, 0xAF, 0x1B, 0x2E, 0x4D, 0x30, 0x4E, 0x60, 0x35, 0x2D, 0x6B, 0x0A, 0x36, + 0x36, 0x5C, 0xED, 0x5E, 0x7F, 0x43, 0xAD, 0x1B, 0x29, 0x4E, 0x6D, 0x43, 0x60, 0x36, 0x7D, 0x19, + 0x36, 0x6C, 0x00, 0xE0, 0x4B, 0xE0, 0x37, 0x59, 0xAF, 0x42, 0x01, 0xDD, 0x02, 0x46, 0x35, 0x51, + 0x40, 0x1C, 0x00, 0x9D, 0x2D, 0x78, 0xA8, 0x42, 0xDE, 0xDB, 0x21, 0x48, 0x60, 0x30, 0x83, 0x6B, + 0x5A, 0x54, 0xC0, 0x6B, 0x83, 0x5C, 0x5B, 0x1C, 0x83, 0x54, 0x49, 0x1C, 0x1C, 0x48, 0x20, 0x38, + 0x00, 0x7E, 0x81, 0x42, 0xC6, 0xDB, 0x00, 0x24, 0x2D, 0xE0, 0x19, 0x4D, 0x60, 0x35, 0xE8, 0x6B, + 0x00, 0x57, 0x01, 0x28, 0x26, 0xDD, 0x00, 0x21, 0x2B, 0x46, 0x08, 0x46, 0x80, 0x3B, 0x0A, 0xE0, + 0xAA, 0x6B, 0x12, 0x56, 0xA2, 0x42, 0x05, 0xD1, 0x0E, 0x46, 0x6A, 0x6C, 0x49, 0x1C, 0x02, 0x29, + 0x90, 0x55, 0x03, 0xDA, 0x40, 0x1C, 0x1A, 0x7E, 0x90, 0x42, 0xF1, 0xDB, 0x68, 0x6C, 0xEB, 0x6A, + 0x41, 0x78, 0x00, 0x78, 0x4A, 0x00, 0x46, 0x00, 0x9F, 0x5F, 0x9B, 0x5E, 0x2D, 0x6B, 0xFB, 0x1A, + 0xAA, 0x5E, 0xAD, 0x5F, 0x5B, 0x43, 0xAA, 0x1A, 0x52, 0x43, 0x9A, 0x18, 0x0C, 0x2A, 0x01, 0xDA, + 0x02, 0xF0, 0xC2, 0xFC, 0x64, 0x1C, 0x00, 0x98, 0x00, 0x78, 0x84, 0x42, 0xCD, 0xDB, 0xF8, 0xBD, + 0x44, 0x01, 0x00, 0x20, 0xFF, 0xFF, 0x7F, 0x00, 0x5E, 0x05, 0x00, 0x20, 0xEA, 0x06, 0x00, 0x20, + 0x10, 0xB5, 0x00, 0xBF, 0x01, 0x21, 0x08, 0x46, 0x88, 0x40, 0x16, 0x49, 0x08, 0x60, 0x00, 0xBF, + 0x59, 0x20, 0x15, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x00, 0xF0, + 0x3D, 0xFF, 0x7D, 0x24, 0xA4, 0x02, 0x05, 0xE0, 0x20, 0x46, 0x00, 0xF0, 0x47, 0xFF, 0xFF, 0x34, + 0xFF, 0x34, 0x02, 0x34, 0x0D, 0x48, 0x84, 0x42, 0xF6, 0xDB, 0x00, 0xF0, 0x27, 0xFF, 0x00, 0x20, + 0x09, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x01, 0x21, 0x08, 0x46, 0x88, 0x40, 0x05, 0x49, 0x80, 0x39, + 0x08, 0x60, 0x00, 0xBF, 0x48, 0x17, 0x06, 0x49, 0x08, 0x60, 0x00, 0x20, 0x05, 0x49, 0x08, 0x70, + 0x10, 0xBD, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0x00, 0x01, 0x00, 0x50, 0xC8, 0xFC, 0x01, 0x00, + 0xFC, 0x00, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x0E, 0x4E, 0x8C, 0x46, 0x34, 0x7C, + 0x31, 0x46, 0x80, 0x31, 0xA4, 0x1C, 0x44, 0x43, 0x00, 0x25, 0xCC, 0x61, 0x0F, 0xE0, 0x14, 0x46, + 0x04, 0xE0, 0xCE, 0x69, 0x0F, 0x69, 0x36, 0x19, 0x64, 0x1C, 0xBD, 0x55, 0x9C, 0x42, 0xF8, 0xDD, + 0x04, 0x4E, 0xCC, 0x69, 0x36, 0x7C, 0xA4, 0x19, 0xA4, 0x1C, 0x40, 0x1C, 0xCC, 0x61, 0x60, 0x45, + 0xED, 0xDD, 0xF0, 0xBD, 0x24, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x01, 0x20, 0x05, 0xF0, 0x00, 0xFD, + 0x21, 0x4E, 0x59, 0x20, 0x30, 0x60, 0x16, 0x20, 0x30, 0x60, 0x88, 0x20, 0x30, 0x60, 0x00, 0xF0, + 0xE5, 0xFE, 0x1F, 0x20, 0x69, 0x46, 0x00, 0x03, 0x00, 0xF0, 0x18, 0xFF, 0x1B, 0x49, 0x00, 0x98, + 0x01, 0x24, 0x88, 0x42, 0x24, 0xD1, 0x1A, 0x4F, 0x1A, 0x4D, 0x3C, 0x68, 0x69, 0x46, 0x28, 0x46, + 0x00, 0xF0, 0x0C, 0xFF, 0x00, 0x20, 0x00, 0x99, 0x21, 0x54, 0x00, 0x99, 0x40, 0x1C, 0x09, 0x0A, + 0x00, 0x91, 0x04, 0x28, 0xF7, 0xD3, 0x13, 0x48, 0x24, 0x1D, 0x2D, 0x1D, 0x5E, 0x30, 0x85, 0x42, + 0xEC, 0xD3, 0x00, 0x24, 0x10, 0x49, 0x3A, 0x68, 0x20, 0x46, 0x0B, 0x18, 0x60, 0x33, 0x5B, 0x79, + 0x15, 0x5C, 0xAB, 0x42, 0x01, 0xD0, 0x01, 0x24, 0x02, 0xE0, 0x40, 0x1C, 0x5E, 0x28, 0xF4, 0xD3, + 0x01, 0xF0, 0x32, 0xFC, 0x00, 0xF0, 0xAA, 0xFE, 0x00, 0x20, 0x30, 0x60, 0x01, 0x20, 0x05, 0xF0, + 0xDD, 0xFC, 0xE0, 0xB2, 0xF8, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x21, 0x43, 0x65, 0x87, + 0xB4, 0x01, 0x00, 0x20, 0x04, 0xF0, 0x01, 0x00, 0xB4, 0x03, 0x00, 0x20, 0x04, 0x4B, 0x40, 0x00, + 0x1A, 0x5A, 0x00, 0x2A, 0x01, 0xD0, 0x51, 0x18, 0x49, 0x08, 0x19, 0x52, 0x70, 0x47, 0x00, 0x00, + 0x38, 0x1A, 0x00, 0x20, 0xF0, 0xB5, 0x13, 0x4F, 0x00, 0x20, 0x39, 0x46, 0x24, 0x39, 0x10, 0x4D, + 0x03, 0x46, 0x4E, 0x79, 0x19, 0xE0, 0x0E, 0x4A, 0x0D, 0x4C, 0x41, 0x00, 0x10, 0x3A, 0x20, 0x3C, + 0x52, 0x5A, 0x64, 0x5A, 0x12, 0x1B, 0x0B, 0x4C, 0x12, 0xB2, 0x08, 0x34, 0x24, 0x5C, 0x54, 0x43, + 0x22, 0x11, 0x6C, 0x5E, 0x12, 0xB2, 0x54, 0x43, 0x00, 0x2C, 0x03, 0xDA, 0x04, 0x4C, 0x10, 0x34, + 0x63, 0x52, 0x3B, 0x54, 0x40, 0x1C, 0x6A, 0x52, 0xC0, 0xB2, 0xB0, 0x42, 0xE3, 0xD3, 0xF0, 0xBD, + 0x58, 0x1A, 0x00, 0x20, 0xA4, 0x03, 0x00, 0x20, 0x70, 0xB5, 0x16, 0x4C, 0x60, 0x7A, 0x00, 0x25, + 0x00, 0x28, 0x0D, 0xD0, 0x65, 0x72, 0x03, 0xF0, 0xC7, 0xFF, 0xFF, 0xF7, 0x6D, 0xFF, 0x00, 0x28, + 0x06, 0xD0, 0x06, 0xF0, 0xE9, 0xFB, 0x01, 0x20, 0xE0, 0x74, 0x60, 0x71, 0x60, 0x73, 0x20, 0x73, + 0x20, 0x7D, 0x00, 0x28, 0x03, 0xD0, 0x07, 0xF0, 0x0B, 0xFB, 0x25, 0x75, 0x65, 0x71, 0xA0, 0x7B, + 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, 0x09, 0xF0, 0xBF, 0xFA, 0x60, 0x7B, 0x00, 0x28, 0x02, 0xD0, + 0x03, 0x20, 0x09, 0xF0, 0xB9, 0xFA, 0x04, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x01, 0xD1, 0x06, 0xF0, + 0x01, 0xFA, 0x70, 0xBD, 0x1C, 0x00, 0x00, 0x20, 0x2B, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x20, + 0x76, 0x49, 0x08, 0x70, 0x76, 0x49, 0x08, 0x70, 0x01, 0x20, 0x76, 0x49, 0x08, 0x70, 0x06, 0xF0, + 0x9F, 0xFA, 0x02, 0xF0, 0xE1, 0xFC, 0xFF, 0xF7, 0xEF, 0xFA, 0x73, 0x48, 0x00, 0x78, 0x04, 0x28, + 0x0A, 0xDA, 0x71, 0x48, 0x00, 0x78, 0x01, 0x28, 0x06, 0xD0, 0x70, 0x48, 0x00, 0x78, 0x01, 0x28, + 0x02, 0xD1, 0x07, 0xF0, 0x0D, 0xFB, 0x07, 0xE0, 0x6D, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xDD, + 0xFF, 0xF7, 0x9A, 0xFD, 0x06, 0xF0, 0x10, 0xFB, 0x69, 0x48, 0x00, 0x68, 0x01, 0x28, 0x7D, 0xDD, + 0x00, 0x20, 0x64, 0x49, 0x08, 0x70, 0x67, 0x49, 0x08, 0x5E, 0x67, 0x49, 0x09, 0x78, 0x88, 0x42, + 0x07, 0xDC, 0x65, 0x48, 0x00, 0x78, 0x40, 0x42, 0x64, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, + 0x06, 0xDD, 0x5A, 0x48, 0x00, 0x78, 0x01, 0x28, 0x08, 0xD1, 0x59, 0x49, 0x08, 0x70, 0x05, 0xE0, + 0x01, 0x20, 0x56, 0x49, 0x08, 0x70, 0x00, 0x20, 0x5D, 0x49, 0x08, 0x70, 0x58, 0x48, 0x00, 0x68, + 0x0A, 0x28, 0x7E, 0xDB, 0x5B, 0x48, 0x00, 0x78, 0x01, 0x28, 0x29, 0xD1, 0x56, 0x4A, 0x12, 0x78, + 0x53, 0x00, 0xD1, 0x18, 0xCA, 0x0F, 0x52, 0x18, 0x52, 0x10, 0x52, 0x4B, 0x00, 0x24, 0x1C, 0x5F, + 0xA2, 0x42, 0x0C, 0xDB, 0x50, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD0, 0x18, 0xC2, 0x0F, 0x12, 0x18, + 0x52, 0x10, 0x52, 0x42, 0x4D, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x11, 0xDD, 0x4E, 0x49, + 0x00, 0x20, 0x08, 0x5E, 0x4D, 0x49, 0x88, 0x42, 0x07, 0xDA, 0x4B, 0x48, 0x00, 0x88, 0x4C, 0x49, + 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x48, 0x49, 0x08, 0x80, 0x01, 0x20, 0x49, 0x49, 0x08, 0x70, + 0x5B, 0xE0, 0x41, 0x4A, 0x12, 0x78, 0x53, 0x00, 0xD1, 0x18, 0xCA, 0x17, 0x92, 0x0F, 0x52, 0x18, + 0x92, 0x10, 0x3C, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0D, 0xDB, 0x3A, 0x4A, 0x12, 0x78, + 0x53, 0x00, 0xD0, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x12, 0x18, 0x92, 0x10, 0x52, 0x42, 0x37, 0x4B, + 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x12, 0xDD, 0x37, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x37, 0x49, + 0x88, 0x42, 0x07, 0xDA, 0x34, 0x48, 0x00, 0x88, 0x35, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, + 0x31, 0x49, 0x08, 0x80, 0x02, 0x20, 0x33, 0x49, 0x08, 0x70, 0x2E, 0xE0, 0x38, 0xE0, 0x28, 0x4A, + 0x12, 0x68, 0x64, 0x2A, 0x29, 0xDB, 0x2F, 0x4A, 0x12, 0x78, 0x03, 0x2A, 0x25, 0xDA, 0x26, 0x4A, + 0x11, 0x78, 0xCA, 0x0F, 0x52, 0x18, 0x52, 0x10, 0x22, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, + 0x1B, 0xDD, 0x21, 0x4A, 0x10, 0x78, 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x52, 0x42, 0x1F, 0x4B, + 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x10, 0xDA, 0x1F, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x1F, 0x49, + 0x00, 0xE0, 0x07, 0xE0, 0x88, 0x42, 0x08, 0xDA, 0x00, 0x20, 0x1B, 0x49, 0x08, 0x80, 0x1D, 0x49, + 0x08, 0x70, 0x02, 0xE0, 0x01, 0x20, 0x1B, 0x49, 0x08, 0x70, 0x11, 0x48, 0x00, 0x68, 0x64, 0x28, + 0x03, 0xDB, 0x18, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x20, 0x09, 0x49, 0x08, 0x70, + 0x07, 0x48, 0x00, 0x78, 0x01, 0x28, 0x02, 0xD1, 0x06, 0xF0, 0xF2, 0xFB, 0x01, 0xE0, 0x06, 0xF0, + 0x87, 0xFE, 0x02, 0x20, 0x10, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x00, 0x00, 0xF6, 0x00, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x20, 0xF7, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, 0xDB, 0x00, 0x00, 0x20, + 0xFC, 0x00, 0x00, 0x20, 0x74, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, 0x72, 0x01, 0x00, 0x20, + 0xEC, 0x00, 0x00, 0x20, 0xDA, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, + 0x4A, 0x00, 0x00, 0x20, 0xFA, 0x00, 0x00, 0x20, 0x1C, 0x02, 0x00, 0x20, 0xFF, 0xB5, 0xC4, 0x4A, + 0x00, 0x20, 0x13, 0x46, 0x80, 0x3B, 0x19, 0x46, 0xD0, 0x61, 0x40, 0x31, 0x18, 0x46, 0x20, 0x30, + 0x03, 0x90, 0xBF, 0x48, 0x84, 0x6A, 0xC2, 0x69, 0xA0, 0x5C, 0x00, 0x28, 0x7E, 0xD0, 0xBD, 0x4D, + 0xAC, 0x5C, 0x00, 0x2C, 0x12, 0xD1, 0x03, 0x98, 0x80, 0x78, 0x00, 0x28, 0x01, 0xD1, 0xA0, 0x20, + 0x0A, 0xE0, 0x01, 0x28, 0x01, 0xD1, 0x80, 0x20, 0x06, 0xE0, 0x02, 0x28, 0x01, 0xD1, 0x40, 0x20, + 0x02, 0xE0, 0x03, 0x28, 0x05, 0xD1, 0xD8, 0x78, 0x88, 0x82, 0x02, 0xE0, 0xD8, 0x78, 0xC0, 0x00, + 0xFA, 0xE7, 0x24, 0x07, 0x00, 0x20, 0x24, 0x0F, 0x01, 0x2C, 0x1C, 0xD1, 0xAC, 0x4D, 0x54, 0x00, + 0x2A, 0x6A, 0xAD, 0x4D, 0x94, 0x46, 0x2E, 0x5F, 0xDD, 0x78, 0x12, 0x5F, 0x77, 0x19, 0xBA, 0x42, + 0x04, 0xDD, 0x01, 0x20, 0x52, 0x1B, 0x65, 0x46, 0x2A, 0x53, 0x51, 0xE0, 0x14, 0x27, 0xCF, 0x5F, + 0xD7, 0x19, 0xB7, 0x42, 0x4C, 0xDA, 0x01, 0x20, 0x52, 0x19, 0x65, 0x46, 0xA0, 0x4E, 0x2A, 0x53, + 0xA0, 0x4C, 0xF2, 0x69, 0x3D, 0xE0, 0x9E, 0x4D, 0x02, 0x2C, 0x17, 0xD1, 0x2F, 0x6A, 0x54, 0x00, + 0xDD, 0x78, 0x3A, 0x5F, 0xAC, 0x46, 0x56, 0x19, 0x9B, 0x4D, 0x2D, 0x5F, 0xAE, 0x42, 0x02, 0xDA, + 0x01, 0x20, 0x3E, 0x53, 0x34, 0xE0, 0x14, 0x26, 0x8E, 0x5F, 0xAE, 0x19, 0xB2, 0x42, 0x2F, 0xDD, + 0x01, 0x20, 0x66, 0x46, 0x92, 0x1B, 0x92, 0x4D, 0x3A, 0x53, 0x10, 0xE0, 0x54, 0x00, 0x2A, 0x6A, + 0x91, 0x4D, 0x94, 0x46, 0x2E, 0x5F, 0x14, 0x25, 0x4D, 0x5F, 0x12, 0x5F, 0x77, 0x19, 0xBA, 0x42, + 0x0C, 0xDD, 0xDE, 0x78, 0x01, 0x20, 0x92, 0x1B, 0x89, 0x4D, 0x66, 0x46, 0x32, 0x53, 0x89, 0x4C, + 0xEA, 0x69, 0xA5, 0x5C, 0x2D, 0x09, 0x2D, 0x01, 0x6D, 0x1C, 0x0E, 0xE0, 0x84, 0x4F, 0x55, 0x19, + 0xB5, 0x42, 0x0D, 0xDA, 0xDE, 0x78, 0x01, 0x20, 0x92, 0x19, 0x66, 0x46, 0x32, 0x53, 0x81, 0x4C, + 0xFA, 0x69, 0xA5, 0x5C, 0x2D, 0x09, 0x2D, 0x01, 0xAD, 0x1C, 0x00, 0xE0, 0xF0, 0xE0, 0xA5, 0x54, + 0x7B, 0x4C, 0x7C, 0x4D, 0xE2, 0x69, 0xAD, 0x5C, 0x2D, 0x09, 0x01, 0x2D, 0x1F, 0xD1, 0x55, 0x00, + 0x02, 0x95, 0x79, 0x4E, 0x62, 0x6A, 0x14, 0x36, 0x94, 0x46, 0x52, 0x5F, 0x76, 0x5F, 0xDD, 0x78, + 0x37, 0x46, 0x76, 0x19, 0xB2, 0x42, 0x06, 0xDD, 0x10, 0x26, 0x30, 0x43, 0x52, 0x1B, 0x02, 0x9E, + 0x65, 0x46, 0xAA, 0x53, 0x52, 0xE0, 0x14, 0x26, 0x8E, 0x5F, 0x96, 0x19, 0xBE, 0x42, 0x4D, 0xDA, + 0x10, 0x26, 0x30, 0x43, 0x52, 0x19, 0x02, 0x9D, 0x66, 0x46, 0x72, 0x53, 0x3F, 0xE0, 0x02, 0x2D, + 0x19, 0xD1, 0x57, 0x00, 0x62, 0x6A, 0x68, 0x4D, 0x94, 0x46, 0xD2, 0x5F, 0xDE, 0x78, 0x14, 0x35, + 0x01, 0x96, 0xED, 0x5F, 0x96, 0x19, 0xAE, 0x42, 0x04, 0xDA, 0x10, 0x22, 0x10, 0x43, 0x62, 0x46, + 0xD6, 0x53, 0x33, 0xE0, 0x14, 0x26, 0x8E, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x2E, 0xDD, 0x10, 0x25, + 0x28, 0x43, 0x01, 0x9D, 0x0F, 0xE0, 0x57, 0x00, 0x5B, 0x4D, 0x62, 0x6A, 0x14, 0x35, 0x94, 0x46, + 0xD2, 0x5F, 0xED, 0x5F, 0x14, 0x26, 0x00, 0x95, 0x8E, 0x5F, 0xAD, 0x19, 0xAA, 0x42, 0x0C, 0xDD, + 0x10, 0x25, 0x28, 0x43, 0xDD, 0x78, 0x52, 0x1B, 0x65, 0x46, 0xEA, 0x53, 0x51, 0x4D, 0xE2, 0x69, + 0xAE, 0x5C, 0x36, 0x07, 0x36, 0x0F, 0x10, 0x36, 0x0F, 0xE0, 0x95, 0x19, 0x00, 0x9E, 0xB5, 0x42, + 0x0C, 0xDA, 0x10, 0x25, 0x28, 0x43, 0xDD, 0x78, 0x52, 0x19, 0x65, 0x46, 0xEA, 0x53, 0x49, 0x4D, + 0xE2, 0x69, 0xAE, 0x5C, 0x36, 0x07, 0x36, 0x0F, 0x20, 0x36, 0xAE, 0x54, 0x00, 0x28, 0x0D, 0xD1, + 0x45, 0x4A, 0xE0, 0x69, 0x28, 0x32, 0x40, 0x00, 0x15, 0x5A, 0x26, 0x6A, 0x14, 0x32, 0x35, 0x52, + 0xE0, 0x69, 0x65, 0x6A, 0x40, 0x00, 0x12, 0x5A, 0x2A, 0x52, 0x53, 0xE0, 0x03, 0x9A, 0x01, 0x25, + 0x55, 0x70, 0x02, 0x07, 0x12, 0x0F, 0x01, 0x2A, 0x21, 0xD1, 0xE2, 0x69, 0x25, 0x6A, 0x52, 0x00, + 0x39, 0x4E, 0xAF, 0x5A, 0xB7, 0x52, 0xAD, 0x5A, 0x28, 0x36, 0xB5, 0x52, 0x05, 0x06, 0x2D, 0x0F, + 0x15, 0xD1, 0x35, 0x4F, 0x65, 0x6A, 0x3C, 0x37, 0xBF, 0x5E, 0xAE, 0x5E, 0xBC, 0x46, 0x3F, 0x1D, + 0xBE, 0x42, 0x01, 0xDD, 0x36, 0x1F, 0x02, 0xE0, 0x36, 0x1D, 0x66, 0x45, 0x05, 0xDA, 0xAE, 0x52, + 0xE2, 0x69, 0x2D, 0x4D, 0x52, 0x00, 0x3C, 0x35, 0x00, 0xE0, 0x66, 0x46, 0xAE, 0x52, 0x02, 0x06, + 0x12, 0x0F, 0x01, 0x2A, 0x26, 0xD1, 0xE2, 0x69, 0x27, 0x4E, 0x65, 0x6A, 0x52, 0x00, 0x14, 0x36, + 0xAF, 0x5A, 0xB7, 0x52, 0x28, 0x36, 0xAD, 0x5A, 0xB5, 0x52, 0x00, 0x07, 0x1A, 0xD1, 0x22, 0x4D, + 0x20, 0x6A, 0x28, 0x35, 0xAD, 0x5E, 0x86, 0x5E, 0x2F, 0x1D, 0xBE, 0x42, 0x06, 0xDD, 0x36, 0x1F, + 0x86, 0x52, 0xE0, 0x69, 0x1C, 0x4A, 0x40, 0x00, 0x28, 0x32, 0x08, 0xE0, 0x1A, 0x4F, 0x36, 0x1D, + 0x28, 0x37, 0xAE, 0x42, 0x05, 0xDA, 0x86, 0x52, 0xE0, 0x69, 0x3A, 0x46, 0x40, 0x00, 0x16, 0x52, + 0x00, 0xE0, 0x85, 0x52, 0x12, 0x4A, 0x13, 0x4C, 0x90, 0x6A, 0xD2, 0x69, 0x0A, 0x3C, 0xA4, 0x5C, + 0x86, 0x5C, 0xA4, 0x46, 0x34, 0x1B, 0x65, 0xB2, 0xDC, 0x78, 0x64, 0x00, 0xAC, 0x42, 0x01, 0xDA, + 0x34, 0x1B, 0x05, 0xE0, 0x67, 0x42, 0xAF, 0x42, 0x01, 0xDD, 0x34, 0x19, 0x00, 0xE0, 0x64, 0x46, + 0x84, 0x54, 0x07, 0x48, 0x07, 0x4C, 0x82, 0x6A, 0xC0, 0x69, 0x0A, 0x3C, 0x12, 0x5C, 0x22, 0x54, + 0x03, 0x4A, 0xD0, 0x69, 0x40, 0x1C, 0xD0, 0x61, 0x0A, 0x28, 0x00, 0xDA, 0x81, 0xE6, 0xFF, 0xBD, + 0xA4, 0x01, 0x00, 0x20, 0x5E, 0x05, 0x00, 0x20, 0x9A, 0x06, 0x00, 0x20, 0xF0, 0xB5, 0x86, 0xB0, + 0x01, 0x20, 0x00, 0x90, 0x8C, 0x48, 0x00, 0x21, 0x05, 0x90, 0x41, 0x70, 0x20, 0x38, 0x02, 0x7E, + 0x05, 0x98, 0x02, 0x70, 0x88, 0x48, 0x60, 0x30, 0xC1, 0x61, 0x87, 0x49, 0x60, 0x31, 0x88, 0x6A, + 0xC9, 0x69, 0x04, 0x90, 0x40, 0x5C, 0x00, 0x28, 0x1B, 0xD1, 0x08, 0x46, 0x06, 0x22, 0x50, 0x43, + 0x82, 0x4C, 0x02, 0x46, 0x20, 0x5E, 0x40, 0x1C, 0x0E, 0xD0, 0x00, 0x20, 0x43, 0x1E, 0x12, 0x19, + 0x44, 0x00, 0x40, 0x1C, 0x13, 0x53, 0x03, 0x28, 0xFA, 0xDB, 0x7C, 0x4A, 0x00, 0x20, 0x6E, 0x3A, + 0x50, 0x54, 0x05, 0x98, 0x01, 0x22, 0x42, 0x70, 0x78, 0x4A, 0x00, 0x20, 0x82, 0x3A, 0x50, 0x54, + 0xD4, 0xE0, 0x00, 0x20, 0x00, 0x90, 0x08, 0x46, 0x06, 0x22, 0x74, 0x4B, 0x72, 0x4C, 0x50, 0x43, + 0x1A, 0x5E, 0x60, 0x34, 0x55, 0x1C, 0x36, 0xD1, 0x1D, 0x46, 0x3C, 0x35, 0x45, 0x19, 0xC0, 0x18, + 0x03, 0x90, 0x63, 0x6A, 0x00, 0x22, 0x24, 0x6A, 0xAC, 0x46, 0x48, 0x00, 0x55, 0x00, 0x03, 0x9F, + 0x26, 0x5A, 0x7E, 0x53, 0x1F, 0x5A, 0x66, 0x46, 0x52, 0x1C, 0x77, 0x53, 0x03, 0x2A, 0xF5, 0xDB, + 0x66, 0x4D, 0x22, 0x5A, 0x78, 0x35, 0x2A, 0x52, 0x1A, 0x5A, 0x14, 0x35, 0x2A, 0x52, 0x00, 0x22, + 0x14, 0x35, 0x6A, 0x54, 0x04, 0x9D, 0x61, 0x4E, 0x6D, 0x5C, 0x82, 0x3E, 0x75, 0x54, 0x35, 0x46, + 0x0A, 0x35, 0x6A, 0x54, 0x5D, 0x4A, 0x21, 0x5A, 0xC4, 0x32, 0x11, 0x52, 0x19, 0x5A, 0x14, 0x32, + 0x11, 0x52, 0x21, 0x5A, 0x14, 0x32, 0x11, 0x52, 0x19, 0x5A, 0x14, 0x32, 0x11, 0x52, 0x05, 0x99, + 0x01, 0x20, 0x48, 0x70, 0x92, 0xE0, 0x48, 0x00, 0x21, 0x6A, 0x08, 0x5E, 0x80, 0x1A, 0xFE, 0xF7, + 0xA6, 0xFC, 0x03, 0x21, 0x89, 0x02, 0x88, 0x42, 0x0D, 0xD8, 0xE0, 0x69, 0x65, 0x6A, 0x42, 0x00, + 0xAD, 0x5E, 0x06, 0x22, 0x50, 0x43, 0x4D, 0x4A, 0x3C, 0x32, 0x10, 0x5E, 0x28, 0x1A, 0xFE, 0xF7, + 0x96, 0xFC, 0x88, 0x42, 0x12, 0xD9, 0x48, 0x49, 0x20, 0x39, 0xC8, 0x7F, 0x0A, 0x28, 0x0D, 0xD2, + 0x40, 0x1C, 0xC8, 0x77, 0xE0, 0x69, 0x22, 0x6A, 0x41, 0x00, 0x06, 0x25, 0x52, 0x5A, 0x68, 0x43, + 0x1A, 0x52, 0x42, 0x4A, 0x65, 0x6A, 0x3C, 0x32, 0x69, 0x5A, 0x11, 0x52, 0x3E, 0x48, 0x20, 0x38, + 0xC0, 0x7F, 0x0A, 0x28, 0x07, 0xD1, 0xE0, 0x69, 0x21, 0x6A, 0x40, 0x00, 0x09, 0x5E, 0x8C, 0x46, + 0x61, 0x6A, 0x08, 0x5E, 0x2A, 0xE0, 0xE1, 0x69, 0x06, 0x20, 0x48, 0x43, 0xC6, 0x18, 0x02, 0x22, + 0x04, 0x25, 0xB2, 0x5E, 0x75, 0x5F, 0x49, 0x00, 0x52, 0x19, 0x25, 0x6A, 0x1E, 0x5E, 0x6D, 0x5E, + 0x76, 0x00, 0xAD, 0x00, 0xAD, 0x19, 0x52, 0x19, 0x12, 0x1D, 0xD5, 0x17, 0x6D, 0x0F, 0xAA, 0x18, + 0x2E, 0x4F, 0xD2, 0x10, 0x3C, 0x37, 0xC5, 0x19, 0x94, 0x46, 0x02, 0x22, 0x04, 0x26, 0xAA, 0x5E, + 0xAE, 0x5F, 0x65, 0x6A, 0x38, 0x5E, 0x69, 0x5E, 0x40, 0x00, 0x89, 0x00, 0x92, 0x19, 0x08, 0x18, + 0x10, 0x18, 0x00, 0x1D, 0xC1, 0x17, 0x49, 0x0F, 0x08, 0x18, 0xC0, 0x10, 0x02, 0x90, 0x23, 0x49, + 0xE5, 0x69, 0xA0, 0x6A, 0x82, 0x39, 0x40, 0x5D, 0x49, 0x5D, 0x2B, 0x46, 0x40, 0x18, 0x06, 0x21, + 0x4B, 0x43, 0x1E, 0x49, 0x40, 0x08, 0x3C, 0x31, 0x01, 0x90, 0x5A, 0x18, 0x01, 0x20, 0x3C, 0x39, + 0x5C, 0x18, 0x41, 0x00, 0x66, 0x5A, 0x67, 0x18, 0x7E, 0x80, 0x56, 0x5A, 0x51, 0x18, 0x4E, 0x80, + 0x40, 0x1E, 0xF6, 0xD5, 0x14, 0x48, 0x15, 0x4A, 0x61, 0x46, 0x14, 0x4C, 0x60, 0x30, 0xD1, 0x52, + 0x3C, 0x34, 0x02, 0x9A, 0xE2, 0x52, 0x04, 0x6A, 0x6B, 0x00, 0xE1, 0x52, 0xC1, 0x69, 0x44, 0x6A, + 0x4B, 0x00, 0x01, 0x99, 0xE2, 0x52, 0x82, 0x6A, 0xC0, 0x69, 0x11, 0x54, 0x0A, 0x49, 0x60, 0x31, + 0xC8, 0x69, 0x40, 0x1C, 0xC8, 0x61, 0x0A, 0x28, 0x00, 0xDA, 0xFE, 0xE6, 0x08, 0x46, 0x80, 0x38, + 0xC1, 0x7F, 0x00, 0x29, 0x06, 0xD0, 0x0A, 0x21, 0xC1, 0x77, 0x00, 0x99, 0x01, 0x29, 0x01, 0xD1, + 0x00, 0x21, 0xC1, 0x77, 0x06, 0xB0, 0xF0, 0xBD, 0x44, 0x01, 0x00, 0x20, 0xD6, 0x05, 0x00, 0x20, + 0xFE, 0xB5, 0x03, 0xF0, 0x5D, 0xFC, 0x90, 0x49, 0x00, 0x20, 0x08, 0x70, 0x8F, 0x49, 0x48, 0x85, + 0x88, 0x85, 0x04, 0xF0, 0x1F, 0xF9, 0x8E, 0x48, 0x00, 0x7B, 0x00, 0x07, 0x00, 0x0F, 0x03, 0x28, + 0x03, 0xD1, 0x8C, 0x48, 0x01, 0x78, 0x8C, 0x48, 0x01, 0x70, 0x00, 0x25, 0xEB, 0xE0, 0x8B, 0x48, + 0x00, 0x68, 0x40, 0x5D, 0x00, 0x28, 0x7E, 0xD0, 0x89, 0x49, 0x6C, 0x00, 0x89, 0x4A, 0x0E, 0x68, + 0x12, 0x5B, 0x30, 0x5F, 0x82, 0x1A, 0x12, 0xB2, 0x94, 0x46, 0x00, 0x2A, 0x03, 0xDA, 0x62, 0x46, + 0x52, 0x42, 0x12, 0xB2, 0x94, 0x46, 0x2A, 0x46, 0x06, 0x21, 0x4A, 0x43, 0x82, 0x49, 0x51, 0x18, + 0x49, 0x88, 0x40, 0x1A, 0x01, 0xB2, 0x00, 0x29, 0x01, 0xDA, 0x48, 0x42, 0x01, 0xB2, 0x7F, 0x48, + 0x03, 0x68, 0x7F, 0x48, 0x01, 0x93, 0x1B, 0x5F, 0x00, 0x5B, 0x18, 0x1A, 0x00, 0xB2, 0x00, 0x28, + 0x01, 0xDA, 0x40, 0x42, 0x00, 0xB2, 0x7B, 0x4F, 0xD2, 0x19, 0x52, 0x88, 0x9A, 0x1A, 0x12, 0xB2, + 0x00, 0x2A, 0x01, 0xDA, 0x52, 0x42, 0x12, 0xB2, 0x01, 0x27, 0x7F, 0x02, 0xBC, 0x45, 0x07, 0xDA, + 0xB8, 0x42, 0x05, 0xDA, 0x69, 0x4B, 0x01, 0x20, 0x9F, 0x8D, 0xA8, 0x40, 0x38, 0x43, 0x98, 0x85, + 0xAA, 0x29, 0x01, 0xDC, 0xAA, 0x2A, 0x0F, 0xDD, 0x64, 0x48, 0x01, 0x21, 0x82, 0x8D, 0xA9, 0x40, + 0x11, 0x43, 0x81, 0x85, 0x67, 0x49, 0x30, 0x5B, 0x08, 0x53, 0x01, 0x98, 0x68, 0x49, 0x00, 0x5B, + 0x08, 0x53, 0x69, 0x49, 0x00, 0x20, 0x48, 0x55, 0x67, 0x49, 0x48, 0x5D, 0x42, 0x1C, 0x4A, 0x55, + 0x64, 0x28, 0x12, 0xD9, 0x5F, 0x4A, 0x30, 0x5F, 0x13, 0x5F, 0xC0, 0x18, 0xC3, 0x0F, 0x18, 0x18, + 0x40, 0x10, 0x10, 0x53, 0x01, 0x98, 0x5E, 0x4A, 0x00, 0x5F, 0x13, 0x5F, 0xC0, 0x18, 0xC3, 0x0F, + 0x18, 0x18, 0x40, 0x10, 0x10, 0x53, 0x00, 0x20, 0x48, 0x55, 0x51, 0x48, 0x40, 0x38, 0xC0, 0x7A, + 0x40, 0x06, 0x17, 0xD4, 0x4D, 0x4F, 0x26, 0x21, 0x30, 0x5F, 0x79, 0x5E, 0x48, 0x43, 0x57, 0x49, + 0x09, 0x88, 0xFE, 0xF7, 0x65, 0xFA, 0x30, 0x53, 0x50, 0x48, 0x28, 0x21, 0x06, 0x68, 0x79, 0x5E, + 0x30, 0x5F, 0x48, 0x43, 0x00, 0xE0, 0x65, 0xE0, 0x51, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0x58, 0xFA, + 0x30, 0x53, 0x18, 0xE0, 0x01, 0x98, 0x41, 0x4F, 0x26, 0x21, 0x00, 0x5F, 0x79, 0x5E, 0x48, 0x43, + 0x4B, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0x4C, 0xFA, 0x00, 0x90, 0x28, 0x21, 0x30, 0x5F, 0x79, 0x5E, + 0x48, 0x43, 0x46, 0x49, 0x09, 0x88, 0xFE, 0xF7, 0x43, 0xFA, 0x01, 0x99, 0x08, 0x53, 0x3C, 0x49, + 0x00, 0x98, 0x09, 0x68, 0x08, 0x53, 0x43, 0x48, 0x00, 0x78, 0x00, 0x28, 0x1E, 0xD0, 0x01, 0x28, + 0x0F, 0xD0, 0x02, 0x28, 0x12, 0xD0, 0x03, 0x28, 0x18, 0xD1, 0x35, 0x48, 0x2F, 0x4A, 0x00, 0x68, + 0xD3, 0x8C, 0x01, 0x5B, 0x59, 0x1A, 0x49, 0x1E, 0x01, 0x53, 0x34, 0x48, 0x11, 0x8D, 0x00, 0x68, + 0x08, 0xE0, 0x2F, 0x48, 0x29, 0x49, 0x00, 0x68, 0xC9, 0x8C, 0x03, 0xE0, 0x2F, 0x48, 0x27, 0x49, + 0x00, 0x68, 0x09, 0x8D, 0x02, 0x5B, 0x89, 0x1A, 0x49, 0x1E, 0x01, 0x53, 0x28, 0x4B, 0x23, 0x4A, + 0x18, 0x68, 0x26, 0x21, 0x06, 0x5F, 0x51, 0x5E, 0x8E, 0x42, 0x01, 0xDB, 0x49, 0x1E, 0x01, 0x53, + 0x18, 0x68, 0x01, 0x5F, 0x00, 0x29, 0x01, 0xDA, 0x00, 0x21, 0x01, 0x53, 0x23, 0x4B, 0x28, 0x20, + 0x19, 0x68, 0x10, 0x5E, 0x0E, 0x5F, 0x86, 0x42, 0x01, 0xDB, 0x40, 0x1E, 0x08, 0x53, 0x18, 0x68, + 0x01, 0x5F, 0x00, 0x29, 0x01, 0xDA, 0x00, 0x21, 0x01, 0x53, 0x01, 0x20, 0x51, 0x8D, 0xA8, 0x40, + 0x08, 0x43, 0x50, 0x85, 0x6D, 0x1C, 0x20, 0x48, 0x00, 0x78, 0x85, 0x42, 0x00, 0xDA, 0x0E, 0xE7, + 0x11, 0x48, 0x01, 0x78, 0x0D, 0x48, 0x42, 0x8D, 0x11, 0x43, 0x07, 0xD0, 0x01, 0x21, 0xC1, 0x72, + 0x09, 0x4A, 0x11, 0x70, 0x00, 0x22, 0x82, 0x72, 0x01, 0x76, 0xFE, 0xBD, 0x06, 0x4A, 0x11, 0x78, + 0x00, 0x29, 0xFA, 0xD1, 0xC1, 0x7A, 0x00, 0x29, 0xF7, 0xD0, 0x00, 0x21, 0xC1, 0x72, 0x01, 0x21, + 0x11, 0x70, 0x01, 0x76, 0x81, 0x72, 0xFE, 0xBD, 0x18, 0x02, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, + 0x54, 0x04, 0x00, 0x20, 0x88, 0x03, 0x00, 0x20, 0x41, 0x01, 0x00, 0x20, 0xCC, 0x01, 0x00, 0x20, + 0xC4, 0x01, 0x00, 0x20, 0x4E, 0x06, 0x00, 0x20, 0xD6, 0x05, 0x00, 0x20, 0xC8, 0x01, 0x00, 0x20, + 0x62, 0x06, 0x00, 0x20, 0x12, 0x06, 0x00, 0x20, 0x76, 0x06, 0x00, 0x20, 0x6E, 0x01, 0x00, 0x20, + 0x70, 0x01, 0x00, 0x20, 0x3D, 0x01, 0x00, 0x20, 0x36, 0x01, 0x00, 0x20, 0xF7, 0xB5, 0x00, 0x26, 0x5E, 0x4F, 0x01, 0x2A, 0x84, 0xB0, 0xB6, 0x46, 0xB4, 0x46, 0x35, 0x46, 0x34, 0x46, 0x3A, 0x46, 0x04, 0xD1, 0x50, 0x7A, 0x6B, 0x46, 0x18, 0x71, 0x92, 0x7A, 0x03, 0xE0, 0x10, 0x7B, 0x6B, 0x46, 0x18, 0x71, 0x52, 0x7B, 0x6B, 0x46, 0x5A, 0x71, 0x98, 0x71, 0xDA, 0x71, 0xD0, 0xB2, 0x53, 0x4A, @@ -560,1306 +527,1250 @@ 0xA4, 0x1C, 0xE4, 0xB2, 0x03, 0xE0, 0x64, 0x1C, 0x6D, 0x1C, 0xE4, 0xB2, 0xED, 0xB2, 0x04, 0x9B, 0x47, 0x00, 0x9B, 0x5C, 0x40, 0x1C, 0x63, 0x44, 0x1B, 0x06, 0x9B, 0x0D, 0xFF, 0x3B, 0xFF, 0x3B, 0x02, 0x3B, 0x76, 0x1E, 0xCB, 0x53, 0xF6, 0xB2, 0x52, 0x1C, 0x05, 0x4B, 0x9A, 0x42, 0x02, 0xD2, - 0x98, 0x42, 0x00, 0xD2, 0x6D, 0xE7, 0x07, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, - 0x31, 0x02, 0x00, 0x00, 0x70, 0xB5, 0x08, 0x49, 0x09, 0x78, 0xFF, 0x22, 0xF0, 0x32, 0x51, 0x43, - 0x08, 0x46, 0x3C, 0x21, 0xFD, 0xF7, 0xDC, 0xFF, 0x85, 0xB2, 0x00, 0x24, 0x01, 0xE0, 0x60, 0x1C, - 0x84, 0xB2, 0xAC, 0x42, 0xFB, 0xDB, 0x70, 0xBD, 0xC2, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x08, 0x49, - 0x09, 0x78, 0x28, 0x22, 0x51, 0x43, 0x08, 0x46, 0x3C, 0x21, 0xFD, 0xF7, 0xC9, 0xFF, 0xC5, 0xB2, - 0x00, 0x24, 0x01, 0xE0, 0x60, 0x1C, 0xC4, 0xB2, 0xAC, 0x42, 0xFB, 0xDB, 0x70, 0xBD, 0x00, 0x00, - 0xC2, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x08, 0x49, 0x09, 0x78, 0x08, 0x4A, 0x51, 0x43, 0x08, 0x46, - 0x3C, 0x21, 0xFD, 0xF7, 0xB5, 0xFF, 0x85, 0xB2, 0x00, 0x24, 0x01, 0xE0, 0x60, 0x1C, 0x84, 0xB2, - 0xAC, 0x42, 0xFB, 0xDB, 0x70, 0xBD, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x20, 0x1E, 0x14, 0x00, 0x00, - 0x70, 0xB5, 0x08, 0x49, 0x09, 0x78, 0x0E, 0x22, 0x51, 0x43, 0x08, 0x46, 0x3C, 0x21, 0xFD, 0xF7, - 0x9F, 0xFF, 0xC5, 0xB2, 0x00, 0x24, 0x01, 0xE0, 0x60, 0x1C, 0xC4, 0xB2, 0xAC, 0x42, 0xFB, 0xDB, - 0x70, 0xBD, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x04, 0x46, 0x01, 0xE0, 0xFF, 0xF7, - 0xD1, 0xFF, 0x20, 0x46, 0x61, 0x1E, 0xCC, 0xB2, 0x00, 0x28, 0xF8, 0xD1, 0x10, 0xBD, 0x00, 0x00, - 0x02, 0x22, 0x04, 0x49, 0x00, 0x28, 0x08, 0x68, 0x01, 0xD0, 0x10, 0x43, 0x00, 0xE0, 0x90, 0x43, - 0x08, 0x60, 0x70, 0x47, 0x00, 0xC0, 0x00, 0x50, 0x02, 0x48, 0x01, 0x68, 0x49, 0x08, 0x49, 0x00, - 0x01, 0x60, 0x70, 0x47, 0x00, 0xC0, 0x00, 0x50, 0x05, 0x49, 0x48, 0x68, 0x04, 0x22, 0x10, 0x43, - 0x48, 0x60, 0x04, 0x49, 0x08, 0x68, 0x01, 0x22, 0x10, 0x43, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x50, 0x00, 0xC0, 0x00, 0x50, 0x11, 0x49, 0xCA, 0x68, 0x12, 0x09, 0x12, 0x01, - 0x92, 0x1C, 0xCA, 0x60, 0xCA, 0x68, 0x10, 0x23, 0x9A, 0x43, 0xCA, 0x60, 0xCA, 0x68, 0x20, 0x23, - 0x1A, 0x43, 0xCA, 0x60, 0x48, 0x60, 0x08, 0x69, 0x01, 0x22, 0x10, 0x43, 0x08, 0x61, 0xBF, 0xF3, - 0x60, 0x8F, 0x08, 0x69, 0xC0, 0x07, 0xFC, 0xD1, 0x08, 0x68, 0x40, 0x06, 0x05, 0xD5, 0x08, 0x68, - 0x40, 0x22, 0x10, 0x43, 0x08, 0x60, 0x03, 0x48, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, - 0x00, 0xC0, 0x00, 0x50, 0x81, 0x88, 0xFF, 0xFF, 0x10, 0xB5, 0x13, 0x4A, 0xD3, 0x68, 0x1B, 0x09, - 0x1B, 0x01, 0xD3, 0x60, 0xD3, 0x68, 0x10, 0x24, 0xA3, 0x43, 0xD3, 0x60, 0xD3, 0x68, 0x20, 0x24, - 0xA3, 0x43, 0xD3, 0x60, 0x50, 0x60, 0x00, 0x20, 0x90, 0x60, 0x10, 0x69, 0x01, 0x23, 0x18, 0x43, - 0x10, 0x61, 0xBF, 0xF3, 0x60, 0x8F, 0x10, 0x69, 0xC0, 0x07, 0xFC, 0xD1, 0x10, 0x68, 0x40, 0x06, - 0x05, 0xD5, 0x10, 0x68, 0x40, 0x21, 0x08, 0x43, 0x10, 0x60, 0x04, 0x48, 0x10, 0xBD, 0x90, 0x68, - 0x08, 0x60, 0x00, 0x20, 0x10, 0xBD, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x50, 0x81, 0x88, 0xFF, 0xFF, - 0x10, 0xB5, 0x12, 0x4A, 0xD3, 0x68, 0x1B, 0x09, 0x1B, 0x01, 0x5B, 0x1C, 0xD3, 0x60, 0xD3, 0x68, - 0x10, 0x24, 0xA3, 0x43, 0xD3, 0x60, 0xD3, 0x68, 0x20, 0x24, 0x23, 0x43, 0xD3, 0x60, 0x50, 0x60, - 0x91, 0x60, 0x10, 0x69, 0x01, 0x21, 0x08, 0x43, 0x10, 0x61, 0xBF, 0xF3, 0x60, 0x8F, 0x10, 0x69, - 0xC0, 0x07, 0xFC, 0xD1, 0x10, 0x68, 0x40, 0x06, 0x05, 0xD5, 0x10, 0x68, 0x40, 0x21, 0x08, 0x43, - 0x10, 0x60, 0x03, 0x48, 0x10, 0xBD, 0x00, 0x20, 0x10, 0xBD, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x50, - 0x81, 0x88, 0xFF, 0xFF, 0x10, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, - 0x05, 0x48, 0x10, 0xBD, 0x98, 0x01, 0x05, 0x4C, 0x02, 0x19, 0x90, 0x68, 0x01, 0x24, 0x8C, 0x40, - 0xA0, 0x43, 0x90, 0x60, 0x00, 0x20, 0xF4, 0xE7, 0x01, 0x89, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0x50, - 0x70, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x0E, 0x48, 0xA1, 0x01, 0x46, 0x18, 0x01, 0x22, 0xAA, 0x40, - 0x28, 0x46, 0x10, 0x30, 0x01, 0x21, 0x81, 0x40, 0x0A, 0x43, 0x30, 0x68, 0x90, 0x43, 0x30, 0x60, - 0x00, 0x2C, 0x01, 0xD0, 0x01, 0x2C, 0x02, 0xD1, 0x04, 0x20, 0x04, 0xF0, 0x01, 0xFF, 0x02, 0x2C, - 0x01, 0xD0, 0x03, 0x2C, 0x02, 0xD1, 0x05, 0x20, 0x04, 0xF0, 0xFA, 0xFE, 0x00, 0x20, 0x70, 0xBD, - 0x1C, 0x40, 0x00, 0x50, 0xFF, 0xB5, 0x81, 0xB0, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x02, 0x2E, - 0x05, 0xD1, 0x04, 0x98, 0x01, 0x28, 0x02, 0xD1, 0x2F, 0x48, 0x05, 0xB0, 0xF0, 0xBD, 0x01, 0x2C, - 0x05, 0xD1, 0x0E, 0x2D, 0x01, 0xD0, 0x0F, 0x2D, 0x01, 0xD1, 0x2B, 0x48, 0xF5, 0xE7, 0x2B, 0x48, - 0xA1, 0x01, 0x47, 0x18, 0x00, 0x2E, 0x07, 0xD1, 0x39, 0x68, 0x28, 0x46, 0x10, 0x30, 0x01, 0x22, - 0x82, 0x40, 0x11, 0x43, 0x39, 0x60, 0x16, 0xE0, 0x01, 0x2E, 0x05, 0xD1, 0x39, 0x68, 0x01, 0x20, - 0xA8, 0x40, 0x01, 0x43, 0x39, 0x60, 0x0E, 0xE0, 0x02, 0x2E, 0x0A, 0xD1, 0x38, 0x68, 0x01, 0x21, - 0xA9, 0x40, 0x08, 0x43, 0x29, 0x46, 0x10, 0x31, 0x01, 0x22, 0x8A, 0x40, 0x10, 0x43, 0x38, 0x60, - 0x01, 0xE0, 0x19, 0x48, 0xD1, 0xE7, 0x19, 0x48, 0x00, 0x1F, 0xA1, 0x01, 0x47, 0x18, 0x04, 0x98, - 0x00, 0x28, 0x05, 0xD1, 0x39, 0x68, 0x01, 0x20, 0xA8, 0x40, 0x81, 0x43, 0x39, 0x60, 0x0A, 0xE0, - 0x04, 0x98, 0x01, 0x28, 0x05, 0xD1, 0x38, 0x68, 0x01, 0x21, 0xA9, 0x40, 0x08, 0x43, 0x38, 0x60, - 0x01, 0xE0, 0x0D, 0x48, 0xB9, 0xE7, 0x00, 0x2C, 0x01, 0xD0, 0x01, 0x2C, 0x06, 0xD1, 0x02, 0x21, - 0x04, 0x20, 0x04, 0xF0, 0x01, 0xFF, 0x04, 0x20, 0x04, 0xF0, 0xB8, 0xFE, 0x02, 0x2C, 0x01, 0xD0, - 0x03, 0x2C, 0x06, 0xD1, 0x02, 0x21, 0x05, 0x20, 0x04, 0xF0, 0xF6, 0xFE, 0x05, 0x20, 0x04, 0xF0, - 0xAD, 0xFE, 0x00, 0x20, 0xA1, 0xE7, 0x00, 0x00, 0x01, 0x89, 0xFF, 0xFF, 0x1C, 0x40, 0x00, 0x50, - 0x10, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, 0x04, 0x48, 0x10, 0xBD, - 0x04, 0x48, 0x9C, 0x01, 0x02, 0x19, 0x10, 0x68, 0xC8, 0x40, 0xC0, 0x07, 0xC0, 0x0F, 0xF6, 0xE7, - 0x01, 0x89, 0xFF, 0xFF, 0x10, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x01, 0x46, 0x0B, 0x46, 0x08, 0xF0, - 0xB7, 0xF8, 0x18, 0x0D, 0x15, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x82, 0x92, 0xA2, 0xB3, 0xC3, - 0xD3, 0xE3, 0xF7, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0, 0xEF, 0xEE, 0xED, 0x00, 0x20, 0x05, 0x23, - 0x1B, 0x07, 0x18, 0x63, 0x58, 0x63, 0x98, 0x63, 0xD8, 0x63, 0x66, 0xE1, 0x05, 0x20, 0x00, 0x07, - 0x00, 0x6B, 0x03, 0x23, 0x9B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, 0xB0, 0x48, - 0x00, 0x69, 0x01, 0x23, 0xDB, 0x02, 0x98, 0x43, 0xAD, 0x4B, 0x18, 0x61, 0x55, 0xE1, 0x00, 0xBF, - 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x02, 0x29, 0x03, 0xDB, 0x04, 0x29, 0x01, 0xDC, - 0x00, 0x22, 0x00, 0xE0, 0x04, 0x22, 0x02, 0x29, 0x01, 0xD0, 0x05, 0x29, 0x17, 0xD1, 0x05, 0x20, - 0x00, 0x07, 0x44, 0x6B, 0x0F, 0x23, 0x93, 0x40, 0x1C, 0x43, 0x44, 0x63, 0x02, 0x29, 0x06, 0xD1, - 0x9F, 0x48, 0x00, 0x69, 0x8B, 0x02, 0x98, 0x43, 0x9D, 0x4B, 0x18, 0x61, 0x3A, 0xE0, 0x9C, 0x48, - 0x00, 0x69, 0x07, 0x23, 0xDB, 0x03, 0x98, 0x43, 0x99, 0x4B, 0x18, 0x61, 0x32, 0xE0, 0x03, 0x29, - 0x01, 0xD0, 0x06, 0x29, 0x10, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x44, 0x6B, 0x03, 0x23, 0x93, 0x40, - 0x1C, 0x43, 0x44, 0x63, 0x06, 0x29, 0x25, 0xD1, 0x91, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x03, - 0x98, 0x43, 0x8F, 0x4B, 0x18, 0x61, 0x1D, 0xE0, 0x04, 0x29, 0x01, 0xD0, 0x07, 0x29, 0x19, 0xD1, - 0x05, 0x20, 0x00, 0x07, 0x44, 0x6B, 0x90, 0x1C, 0x03, 0x23, 0x83, 0x40, 0x1C, 0x43, 0x05, 0x20, - 0x00, 0x07, 0x44, 0x63, 0x04, 0x29, 0x06, 0xD1, 0x85, 0x48, 0x00, 0x69, 0x4B, 0x02, 0x98, 0x43, - 0x83, 0x4B, 0x18, 0x61, 0x06, 0xE0, 0x82, 0x48, 0x00, 0x69, 0x03, 0x23, 0x1B, 0x04, 0x98, 0x43, - 0x7F, 0x4B, 0x18, 0x61, 0xF9, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x80, 0x6B, 0x0F, 0x23, 0x18, 0x43, - 0x05, 0x23, 0x1B, 0x07, 0x98, 0x63, 0x7A, 0x48, 0x00, 0x69, 0xFF, 0x23, 0xE1, 0x33, 0x98, 0x43, - 0x77, 0x4B, 0x18, 0x61, 0xE9, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, 0x9B, 0x02, - 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x71, 0x48, 0x00, 0x69, 0x01, 0x23, 0x18, 0x43, - 0x6F, 0x4B, 0x18, 0x61, 0xD9, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x80, 0x6B, 0x0F, 0x23, 0x1B, 0x02, - 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x98, 0x63, 0x69, 0x48, 0x00, 0x69, 0x0F, 0x23, 0x1B, 0x04, - 0x98, 0x43, 0x67, 0x4B, 0x18, 0x61, 0xC8, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, - 0x5B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x61, 0x48, 0x00, 0x69, 0x02, 0x23, - 0x18, 0x43, 0x5F, 0x4B, 0x18, 0x61, 0xB8, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x10, 0x23, - 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x59, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x03, - 0x18, 0x43, 0x57, 0x4B, 0x18, 0x61, 0xA8, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, - 0x9B, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x51, 0x48, 0x00, 0x69, 0x08, 0x23, - 0x98, 0x43, 0x4F, 0x4B, 0x18, 0x61, 0x98, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, - 0xDB, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x8E, 0xE0, 0x8B, 0xE0, 0x53, 0xE0, - 0x51, 0xE0, 0x30, 0xE0, 0x2E, 0xE0, 0x50, 0xE0, 0x2E, 0xE0, 0x1B, 0xE0, 0x0A, 0xE0, 0xFF, 0xE7, - 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0xFF, 0x23, 0x01, 0x33, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, - 0x58, 0x63, 0x7A, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, 0x5B, 0x02, 0x18, 0x43, - 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x3A, 0x48, 0x00, 0x69, 0x02, 0x23, 0x98, 0x43, 0x38, 0x4B, - 0x18, 0x61, 0x6A, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, 0x9B, 0x02, 0x18, 0x43, - 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x32, 0x48, 0x00, 0x69, 0x40, 0x08, 0x40, 0x00, 0x30, 0x4B, - 0x18, 0x61, 0x5A, 0xE0, 0x00, 0xBF, 0x00, 0xBF, 0x12, 0x29, 0x09, 0xD1, 0x05, 0x20, 0x00, 0x07, - 0x00, 0x6B, 0x03, 0x23, 0x1B, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, 0x0A, 0xE0, + 0x98, 0x42, 0x00, 0xD2, 0x6D, 0xE7, 0x07, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x24, 0x01, 0x00, 0x20, + 0x31, 0x02, 0x00, 0x00, 0x10, 0xB5, 0x08, 0x48, 0xFF, 0x21, 0x80, 0x7E, 0xF0, 0x31, 0x48, 0x43, + 0x3C, 0x21, 0xFE, 0xF7, 0xDB, 0xF8, 0x81, 0xB2, 0x00, 0x20, 0x01, 0xE0, 0x40, 0x1C, 0x80, 0xB2, + 0x88, 0x42, 0xFB, 0xD3, 0x10, 0xBD, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x07, 0x48, + 0x28, 0x21, 0x80, 0x7E, 0x48, 0x43, 0x3C, 0x21, 0xFE, 0xF7, 0xC8, 0xF8, 0xC1, 0xB2, 0x00, 0x20, + 0x01, 0xE0, 0x40, 0x1C, 0xC0, 0xB2, 0x88, 0x42, 0xFB, 0xD3, 0x10, 0xBD, 0x1C, 0x00, 0x00, 0x20, + 0x10, 0xB5, 0x07, 0x48, 0x07, 0x49, 0x80, 0x7E, 0x48, 0x43, 0x3C, 0x21, 0xFE, 0xF7, 0xB6, 0xF8, + 0x81, 0xB2, 0x00, 0x20, 0x01, 0xE0, 0x40, 0x1C, 0x80, 0xB2, 0x88, 0x42, 0xFB, 0xD3, 0x10, 0xBD, + 0x1C, 0x00, 0x00, 0x20, 0x1E, 0x14, 0x00, 0x00, 0x10, 0xB5, 0x07, 0x48, 0x0E, 0x21, 0x80, 0x7E, + 0x48, 0x43, 0x3C, 0x21, 0xFE, 0xF7, 0xA2, 0xF8, 0xC1, 0xB2, 0x00, 0x20, 0x01, 0xE0, 0x40, 0x1C, + 0xC0, 0xB2, 0x88, 0x42, 0xFB, 0xD3, 0x10, 0xBD, 0x1C, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x04, 0x46, + 0x01, 0xE0, 0xFF, 0xF7, 0xD5, 0xFF, 0x20, 0x46, 0x64, 0x1E, 0xE4, 0xB2, 0x00, 0x28, 0xF8, 0xD1, + 0x10, 0xBD, 0x00, 0x00, 0x02, 0x22, 0x04, 0x49, 0x00, 0x28, 0x08, 0x68, 0x01, 0xD0, 0x10, 0x43, + 0x00, 0xE0, 0x90, 0x43, 0x08, 0x60, 0x70, 0x47, 0x00, 0xC0, 0x00, 0x50, 0x02, 0x48, 0x01, 0x68, + 0x49, 0x08, 0x49, 0x00, 0x01, 0x60, 0x70, 0x47, 0x00, 0xC0, 0x00, 0x50, 0x05, 0x49, 0x48, 0x68, + 0x04, 0x22, 0x10, 0x43, 0x48, 0x60, 0x04, 0x49, 0x08, 0x68, 0x01, 0x22, 0x10, 0x43, 0x08, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x00, 0xC0, 0x00, 0x50, 0x11, 0x49, 0xCA, 0x68, + 0x12, 0x09, 0x12, 0x01, 0x92, 0x1C, 0xCA, 0x60, 0xCA, 0x68, 0x10, 0x23, 0x9A, 0x43, 0xCA, 0x60, + 0xCA, 0x68, 0x20, 0x23, 0x1A, 0x43, 0xCA, 0x60, 0x48, 0x60, 0x08, 0x69, 0x01, 0x22, 0x10, 0x43, + 0x08, 0x61, 0xBF, 0xF3, 0x60, 0x8F, 0x08, 0x69, 0xC0, 0x07, 0xFC, 0xD1, 0x08, 0x68, 0x40, 0x06, + 0x05, 0xD5, 0x08, 0x68, 0x40, 0x22, 0x10, 0x43, 0x08, 0x60, 0x03, 0x48, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x50, 0x81, 0x88, 0xFF, 0xFF, 0x10, 0xB5, 0x13, 0x4A, + 0xD3, 0x68, 0x1B, 0x09, 0x1B, 0x01, 0xD3, 0x60, 0xD3, 0x68, 0x10, 0x24, 0xA3, 0x43, 0xD3, 0x60, + 0xD3, 0x68, 0x20, 0x24, 0xA3, 0x43, 0xD3, 0x60, 0x50, 0x60, 0x00, 0x20, 0x90, 0x60, 0x10, 0x69, + 0x01, 0x23, 0x18, 0x43, 0x10, 0x61, 0xBF, 0xF3, 0x60, 0x8F, 0x10, 0x69, 0xC0, 0x07, 0xFC, 0xD1, + 0x10, 0x68, 0x40, 0x06, 0x05, 0xD5, 0x10, 0x68, 0x40, 0x21, 0x08, 0x43, 0x10, 0x60, 0x04, 0x48, + 0x10, 0xBD, 0x90, 0x68, 0x08, 0x60, 0x00, 0x20, 0x10, 0xBD, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x50, + 0x81, 0x88, 0xFF, 0xFF, 0x10, 0xB5, 0x12, 0x4A, 0xD3, 0x68, 0x1B, 0x09, 0x1B, 0x01, 0x5B, 0x1C, + 0xD3, 0x60, 0xD3, 0x68, 0x10, 0x24, 0xA3, 0x43, 0xD3, 0x60, 0xD3, 0x68, 0x20, 0x24, 0x23, 0x43, + 0xD3, 0x60, 0x50, 0x60, 0x91, 0x60, 0x10, 0x69, 0x01, 0x21, 0x08, 0x43, 0x10, 0x61, 0xBF, 0xF3, + 0x60, 0x8F, 0x10, 0x69, 0xC0, 0x07, 0xFC, 0xD1, 0x10, 0x68, 0x40, 0x06, 0x05, 0xD5, 0x10, 0x68, + 0x40, 0x21, 0x08, 0x43, 0x10, 0x60, 0x03, 0x48, 0x10, 0xBD, 0x00, 0x20, 0x10, 0xBD, 0x00, 0x00, + 0x00, 0xC0, 0x00, 0x50, 0x81, 0x88, 0xFF, 0xFF, 0x10, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, + 0x10, 0x29, 0x01, 0xDD, 0x05, 0x48, 0x10, 0xBD, 0x98, 0x01, 0x05, 0x4C, 0x02, 0x19, 0x90, 0x68, + 0x01, 0x24, 0x8C, 0x40, 0xA0, 0x43, 0x90, 0x60, 0x00, 0x20, 0xF4, 0xE7, 0x01, 0x89, 0xFF, 0xFF, + 0x00, 0x40, 0x00, 0x50, 0x70, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x0E, 0x48, 0xA1, 0x01, 0x46, 0x18, + 0x01, 0x22, 0xAA, 0x40, 0x28, 0x46, 0x10, 0x30, 0x01, 0x21, 0x81, 0x40, 0x0A, 0x43, 0x30, 0x68, + 0x90, 0x43, 0x30, 0x60, 0x00, 0x2C, 0x01, 0xD0, 0x01, 0x2C, 0x02, 0xD1, 0x04, 0x20, 0x04, 0xF0, + 0x61, 0xFD, 0x02, 0x2C, 0x01, 0xD0, 0x03, 0x2C, 0x02, 0xD1, 0x05, 0x20, 0x04, 0xF0, 0x5A, 0xFD, + 0x00, 0x20, 0x70, 0xBD, 0x1C, 0x40, 0x00, 0x50, 0xFF, 0xB5, 0x81, 0xB0, 0x04, 0x46, 0x0D, 0x46, + 0x16, 0x46, 0x02, 0x2E, 0x05, 0xD1, 0x04, 0x98, 0x01, 0x28, 0x02, 0xD1, 0x2F, 0x48, 0x05, 0xB0, + 0xF0, 0xBD, 0x01, 0x2C, 0x05, 0xD1, 0x0E, 0x2D, 0x01, 0xD0, 0x0F, 0x2D, 0x01, 0xD1, 0x2B, 0x48, + 0xF5, 0xE7, 0x2B, 0x48, 0xA1, 0x01, 0x47, 0x18, 0x00, 0x2E, 0x07, 0xD1, 0x39, 0x68, 0x28, 0x46, + 0x10, 0x30, 0x01, 0x22, 0x82, 0x40, 0x11, 0x43, 0x39, 0x60, 0x16, 0xE0, 0x01, 0x2E, 0x05, 0xD1, + 0x39, 0x68, 0x01, 0x20, 0xA8, 0x40, 0x01, 0x43, 0x39, 0x60, 0x0E, 0xE0, 0x02, 0x2E, 0x0A, 0xD1, + 0x38, 0x68, 0x01, 0x21, 0xA9, 0x40, 0x08, 0x43, 0x29, 0x46, 0x10, 0x31, 0x01, 0x22, 0x8A, 0x40, + 0x10, 0x43, 0x38, 0x60, 0x01, 0xE0, 0x19, 0x48, 0xD1, 0xE7, 0x19, 0x48, 0x00, 0x1F, 0xA1, 0x01, + 0x47, 0x18, 0x04, 0x98, 0x00, 0x28, 0x05, 0xD1, 0x39, 0x68, 0x01, 0x20, 0xA8, 0x40, 0x81, 0x43, + 0x39, 0x60, 0x0A, 0xE0, 0x04, 0x98, 0x01, 0x28, 0x05, 0xD1, 0x38, 0x68, 0x01, 0x21, 0xA9, 0x40, + 0x08, 0x43, 0x38, 0x60, 0x01, 0xE0, 0x0D, 0x48, 0xB9, 0xE7, 0x00, 0x2C, 0x01, 0xD0, 0x01, 0x2C, + 0x06, 0xD1, 0x02, 0x21, 0x04, 0x20, 0x04, 0xF0, 0x47, 0xFD, 0x04, 0x20, 0x04, 0xF0, 0x18, 0xFD, + 0x02, 0x2C, 0x01, 0xD0, 0x03, 0x2C, 0x06, 0xD1, 0x02, 0x21, 0x05, 0x20, 0x04, 0xF0, 0x3C, 0xFD, + 0x05, 0x20, 0x04, 0xF0, 0x0D, 0xFD, 0x00, 0x20, 0xA1, 0xE7, 0x00, 0x00, 0x01, 0x89, 0xFF, 0xFF, + 0x1C, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, + 0x04, 0x48, 0x10, 0xBD, 0x04, 0x48, 0x9C, 0x01, 0x02, 0x19, 0x10, 0x68, 0xC8, 0x40, 0xC0, 0x07, + 0xC0, 0x0F, 0xF6, 0xE7, 0x01, 0x89, 0xFF, 0xFF, 0x10, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x01, 0x46, + 0x0B, 0x46, 0x07, 0xF0, 0xD5, 0xFF, 0x18, 0x0D, 0x15, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x82, + 0x92, 0xA2, 0xB3, 0xC3, 0xD3, 0xE3, 0xF7, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0, 0xEF, 0xEE, 0xED, + 0x00, 0x20, 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, 0x58, 0x63, 0x98, 0x63, 0xD8, 0x63, 0x66, 0xE1, + 0x05, 0x20, 0x00, 0x07, 0x00, 0x6B, 0x03, 0x23, 0x9B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, + 0x18, 0x63, 0xB0, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x02, 0x98, 0x43, 0xAD, 0x4B, 0x18, 0x61, + 0x55, 0xE1, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x02, 0x29, 0x03, 0xDB, + 0x04, 0x29, 0x01, 0xDC, 0x00, 0x22, 0x00, 0xE0, 0x04, 0x22, 0x02, 0x29, 0x01, 0xD0, 0x05, 0x29, + 0x17, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x44, 0x6B, 0x0F, 0x23, 0x93, 0x40, 0x1C, 0x43, 0x44, 0x63, + 0x02, 0x29, 0x06, 0xD1, 0x9F, 0x48, 0x00, 0x69, 0x8B, 0x02, 0x98, 0x43, 0x9D, 0x4B, 0x18, 0x61, + 0x3A, 0xE0, 0x9C, 0x48, 0x00, 0x69, 0x07, 0x23, 0xDB, 0x03, 0x98, 0x43, 0x99, 0x4B, 0x18, 0x61, + 0x32, 0xE0, 0x03, 0x29, 0x01, 0xD0, 0x06, 0x29, 0x10, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x44, 0x6B, + 0x03, 0x23, 0x93, 0x40, 0x1C, 0x43, 0x44, 0x63, 0x06, 0x29, 0x25, 0xD1, 0x91, 0x48, 0x00, 0x69, + 0x01, 0x23, 0xDB, 0x03, 0x98, 0x43, 0x8F, 0x4B, 0x18, 0x61, 0x1D, 0xE0, 0x04, 0x29, 0x01, 0xD0, + 0x07, 0x29, 0x19, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x44, 0x6B, 0x90, 0x1C, 0x03, 0x23, 0x83, 0x40, + 0x1C, 0x43, 0x05, 0x20, 0x00, 0x07, 0x44, 0x63, 0x04, 0x29, 0x06, 0xD1, 0x85, 0x48, 0x00, 0x69, + 0x4B, 0x02, 0x98, 0x43, 0x83, 0x4B, 0x18, 0x61, 0x06, 0xE0, 0x82, 0x48, 0x00, 0x69, 0x03, 0x23, + 0x1B, 0x04, 0x98, 0x43, 0x7F, 0x4B, 0x18, 0x61, 0xF9, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x80, 0x6B, + 0x0F, 0x23, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x98, 0x63, 0x7A, 0x48, 0x00, 0x69, 0xFF, 0x23, + 0xE1, 0x33, 0x98, 0x43, 0x77, 0x4B, 0x18, 0x61, 0xE9, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, + 0x01, 0x23, 0x9B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x71, 0x48, 0x00, 0x69, + 0x01, 0x23, 0x18, 0x43, 0x6F, 0x4B, 0x18, 0x61, 0xD9, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x80, 0x6B, + 0x0F, 0x23, 0x1B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x98, 0x63, 0x69, 0x48, 0x00, 0x69, + 0x0F, 0x23, 0x1B, 0x04, 0x98, 0x43, 0x67, 0x4B, 0x18, 0x61, 0xC8, 0xE0, 0x05, 0x20, 0x00, 0x07, + 0x40, 0x6B, 0x01, 0x23, 0x5B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x61, 0x48, + 0x00, 0x69, 0x02, 0x23, 0x18, 0x43, 0x5F, 0x4B, 0x18, 0x61, 0xB8, 0xE0, 0x05, 0x20, 0x00, 0x07, + 0x40, 0x6B, 0x10, 0x23, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x59, 0x48, 0x00, 0x69, + 0x01, 0x23, 0xDB, 0x03, 0x18, 0x43, 0x57, 0x4B, 0x18, 0x61, 0xA8, 0xE0, 0x05, 0x20, 0x00, 0x07, + 0x40, 0x6B, 0x01, 0x23, 0x9B, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x51, 0x48, + 0x00, 0x69, 0x08, 0x23, 0x98, 0x43, 0x4F, 0x4B, 0x18, 0x61, 0x98, 0xE0, 0x05, 0x20, 0x00, 0x07, + 0x40, 0x6B, 0x01, 0x23, 0xDB, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x8E, 0xE0, + 0x8B, 0xE0, 0x53, 0xE0, 0x51, 0xE0, 0x30, 0xE0, 0x2E, 0xE0, 0x50, 0xE0, 0x2E, 0xE0, 0x1B, 0xE0, + 0x0A, 0xE0, 0xFF, 0xE7, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0xFF, 0x23, 0x01, 0x33, 0x18, 0x43, + 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x7A, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, + 0x5B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x3A, 0x48, 0x00, 0x69, 0x02, 0x23, + 0x98, 0x43, 0x38, 0x4B, 0x18, 0x61, 0x6A, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x01, 0x23, + 0x9B, 0x02, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x58, 0x63, 0x32, 0x48, 0x00, 0x69, 0x40, 0x08, + 0x40, 0x00, 0x30, 0x4B, 0x18, 0x61, 0x5A, 0xE0, 0x00, 0xBF, 0x00, 0xBF, 0x12, 0x29, 0x09, 0xD1, + 0x05, 0x20, 0x00, 0x07, 0x00, 0x6B, 0x03, 0x23, 0x1B, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, + 0x18, 0x63, 0x0A, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x04, 0x6B, 0x0B, 0x46, 0x08, 0x3B, 0x01, 0x20, + 0x98, 0x40, 0x04, 0x43, 0x05, 0x20, 0x00, 0x07, 0x04, 0x63, 0x22, 0x48, 0x00, 0x69, 0x01, 0x23, + 0xDB, 0x02, 0x98, 0x43, 0x1F, 0x4B, 0x18, 0x61, 0x39, 0xE0, 0x00, 0xBF, 0x00, 0xBF, 0x13, 0x29, + 0x16, 0xD1, 0x05, 0x20, 0x00, 0x07, 0x00, 0x6B, 0x03, 0x23, 0x9B, 0x03, 0x18, 0x43, 0x05, 0x23, + 0x1B, 0x07, 0x18, 0x63, 0x17, 0x48, 0x00, 0x69, 0x01, 0x23, 0x5B, 0x02, 0x98, 0x43, 0x15, 0x4B, + 0x18, 0x61, 0x18, 0x46, 0x00, 0x69, 0x5B, 0x01, 0x98, 0x43, 0x12, 0x4B, 0x18, 0x61, 0x1B, 0xE0, 0x05, 0x20, 0x00, 0x07, 0x04, 0x6B, 0x0B, 0x46, 0x08, 0x3B, 0x01, 0x20, 0x98, 0x40, 0x04, 0x43, - 0x05, 0x20, 0x00, 0x07, 0x04, 0x63, 0x22, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x02, 0x98, 0x43, - 0x1F, 0x4B, 0x18, 0x61, 0x39, 0xE0, 0x00, 0xBF, 0x00, 0xBF, 0x13, 0x29, 0x16, 0xD1, 0x05, 0x20, - 0x00, 0x07, 0x00, 0x6B, 0x03, 0x23, 0x9B, 0x03, 0x18, 0x43, 0x05, 0x23, 0x1B, 0x07, 0x18, 0x63, - 0x17, 0x48, 0x00, 0x69, 0x01, 0x23, 0x5B, 0x02, 0x98, 0x43, 0x15, 0x4B, 0x18, 0x61, 0x18, 0x46, - 0x00, 0x69, 0x5B, 0x01, 0x98, 0x43, 0x12, 0x4B, 0x18, 0x61, 0x1B, 0xE0, 0x05, 0x20, 0x00, 0x07, - 0x04, 0x6B, 0x0B, 0x46, 0x08, 0x3B, 0x01, 0x20, 0x98, 0x40, 0x04, 0x43, 0x05, 0x20, 0x00, 0x07, - 0x04, 0x63, 0x16, 0x29, 0x07, 0xD1, 0x0A, 0x48, 0x00, 0x69, 0x01, 0x23, 0xDB, 0x02, 0x98, 0x43, - 0x07, 0x4B, 0x18, 0x61, 0x06, 0xE0, 0x06, 0x48, 0x00, 0x69, 0x01, 0x23, 0x5B, 0x02, 0x98, 0x43, - 0x03, 0x4B, 0x18, 0x61, 0x01, 0xE0, 0x03, 0x48, 0x10, 0xBD, 0x00, 0xBF, 0x00, 0x20, 0xFB, 0xE7, - 0x40, 0x00, 0x00, 0x50, 0x01, 0x89, 0xFF, 0xFF, 0x70, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, - 0x10, 0x29, 0x01, 0xDD, 0x17, 0x48, 0x70, 0xBD, 0x98, 0x01, 0x17, 0x4D, 0x44, 0x19, 0x00, 0x2A, - 0x03, 0xD0, 0x01, 0x2A, 0x01, 0xD0, 0x02, 0x2A, 0x17, 0xD1, 0x25, 0x68, 0x4E, 0x00, 0x03, 0x20, - 0xB0, 0x40, 0x85, 0x43, 0x25, 0x60, 0x01, 0x2A, 0x06, 0xD1, 0x25, 0x68, 0x4E, 0x00, 0x01, 0x20, - 0xB0, 0x40, 0x05, 0x43, 0x25, 0x60, 0x13, 0xE0, 0x02, 0x2A, 0x11, 0xD1, 0x20, 0x68, 0x4E, 0x00, - 0x02, 0x25, 0xB5, 0x40, 0x28, 0x43, 0x20, 0x60, 0x0A, 0xE0, 0x03, 0x2A, 0x06, 0xD1, 0x20, 0x68, - 0x4E, 0x00, 0x03, 0x25, 0xB5, 0x40, 0x28, 0x43, 0x20, 0x60, 0x01, 0xE0, 0x01, 0x48, 0xD2, 0xE7, - 0x00, 0x20, 0xD0, 0xE7, 0x01, 0x89, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x03, 0x46, - 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, 0x05, 0x48, 0x10, 0xBD, 0x98, 0x01, 0x05, 0x4C, - 0x02, 0x19, 0x90, 0x68, 0x01, 0x24, 0x8C, 0x40, 0x20, 0x43, 0x90, 0x60, 0x00, 0x20, 0xF4, 0xE7, - 0x01, 0x89, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0x50, 0x02, 0x4A, 0x10, 0x60, 0x12, 0x1D, 0x11, 0x60, - 0x70, 0x47, 0x00, 0x00, 0x18, 0x01, 0x00, 0x20, 0x0A, 0x48, 0x01, 0x68, 0x40, 0x22, 0x91, 0x43, - 0x01, 0x60, 0x05, 0x20, 0x00, 0x07, 0xC2, 0x68, 0x01, 0x21, 0x49, 0x02, 0x0A, 0x43, 0xC2, 0x60, - 0xC2, 0x68, 0x8A, 0x43, 0xC2, 0x60, 0x04, 0x4A, 0x90, 0x68, 0x88, 0x43, 0x90, 0x60, 0x00, 0x20, - 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x00, 0x02, 0x00, 0x50, 0x09, 0x4A, 0x00, 0x28, - 0x07, 0xD0, 0x01, 0x28, 0x07, 0xD0, 0x02, 0x28, 0x07, 0xD0, 0x03, 0x28, 0x08, 0xD1, 0xD1, 0x60, - 0x04, 0xE0, 0x11, 0x60, 0x02, 0xE0, 0x51, 0x60, 0x00, 0xE0, 0x91, 0x60, 0x00, 0x20, 0x70, 0x47, - 0x01, 0x48, 0x70, 0x47, 0x88, 0x1A, 0x00, 0x20, 0x01, 0x8B, 0xFF, 0xFF, 0x81, 0x00, 0x10, 0xB5, - 0x10, 0x48, 0x0A, 0x22, 0x00, 0x68, 0x50, 0x43, 0xFD, 0xF7, 0x08, 0xFC, 0x40, 0x1D, 0x0A, 0x21, - 0xFD, 0xF7, 0x04, 0xFC, 0x0C, 0x49, 0x40, 0x1E, 0x8B, 0x68, 0x01, 0x22, 0x52, 0x02, 0x13, 0x43, - 0x8B, 0x60, 0x05, 0x21, 0x09, 0x07, 0xCB, 0x68, 0x13, 0x43, 0xCB, 0x60, 0xCB, 0x68, 0x93, 0x43, - 0xCB, 0x60, 0x06, 0x49, 0x0A, 0x68, 0x40, 0x23, 0x1A, 0x43, 0x0A, 0x60, 0x08, 0x61, 0x00, 0x20, - 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x12, 0x40, - 0x01, 0x48, 0x80, 0x68, 0xC0, 0xB2, 0x70, 0x47, 0x00, 0x00, 0x12, 0x40, 0x10, 0xB5, 0x49, 0x06, - 0xD2, 0x07, 0x1B, 0x4B, 0xFE, 0x24, 0x09, 0x0E, 0xD2, 0x0F, 0x00, 0x28, 0x0F, 0xD0, 0x01, 0x28, - 0x17, 0xD0, 0x02, 0x28, 0x1F, 0xD0, 0x03, 0x28, 0x28, 0xD1, 0x18, 0x6A, 0xA0, 0x43, 0x08, 0x43, - 0x18, 0x62, 0x18, 0x6A, 0x40, 0x08, 0x40, 0x00, 0x10, 0x43, 0x18, 0x62, 0x1C, 0xE0, 0x58, 0x68, - 0xA0, 0x43, 0x08, 0x43, 0x58, 0x60, 0x58, 0x68, 0x40, 0x08, 0x40, 0x00, 0x10, 0x43, 0x58, 0x60, - 0x12, 0xE0, 0x98, 0x69, 0xA0, 0x43, 0x08, 0x43, 0x98, 0x61, 0x98, 0x69, 0x40, 0x08, 0x40, 0x00, - 0x10, 0x43, 0x98, 0x61, 0x08, 0xE0, 0xD8, 0x69, 0xA0, 0x43, 0x08, 0x43, 0xD8, 0x61, 0xD8, 0x69, - 0x40, 0x08, 0x40, 0x00, 0x10, 0x43, 0xD8, 0x61, 0x00, 0x20, 0x10, 0xBD, 0x01, 0x48, 0x10, 0xBD, - 0x00, 0x00, 0x12, 0x40, 0x01, 0x8B, 0xFF, 0xFF, 0x01, 0x49, 0x88, 0x60, 0x70, 0x47, 0x00, 0x00, - 0x00, 0x00, 0x12, 0x40, 0x08, 0x49, 0x09, 0x68, 0x41, 0x43, 0x08, 0x4A, 0x51, 0x61, 0x00, 0x21, - 0x91, 0x61, 0x05, 0x21, 0x11, 0x61, 0x00, 0xBF, 0x04, 0x49, 0x09, 0x69, 0x01, 0x22, 0x12, 0x04, - 0x11, 0x42, 0xF9, 0xD0, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xE0, - 0x00, 0xB5, 0x01, 0x46, 0x0B, 0x46, 0x07, 0xF0, 0x1B, 0xFE, 0x05, 0x04, 0x09, 0x0E, 0x13, 0x18, - 0x1D, 0x00, 0x0F, 0x48, 0xC0, 0x68, 0xC2, 0x07, 0xD2, 0x0F, 0x15, 0xE0, 0x0C, 0x48, 0xC0, 0x68, - 0x80, 0x07, 0xC2, 0x0F, 0x10, 0xE0, 0x0A, 0x48, 0xC0, 0x68, 0xC0, 0x06, 0xC2, 0x0F, 0x0B, 0xE0, - 0x07, 0x48, 0xC0, 0x68, 0x00, 0x07, 0xC2, 0x0F, 0x06, 0xE0, 0x05, 0x48, 0xC0, 0x68, 0x40, 0x07, - 0xC2, 0x0F, 0x01, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x00, 0xBF, 0x10, 0x46, 0xFB, 0xE7, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x50, 0x03, 0x96, 0xFF, 0xFF, 0x00, 0x48, 0x70, 0x47, 0x00, 0x1B, 0xB7, 0x00, - 0x7F, 0xB5, 0x00, 0x24, 0x18, 0x48, 0x6E, 0x46, 0x2E, 0xC8, 0x2E, 0xC6, 0x17, 0x48, 0x00, 0x6A, - 0x00, 0x03, 0xC0, 0x0F, 0x01, 0x28, 0x01, 0xD1, 0x15, 0x4D, 0x00, 0xE0, 0x15, 0x4D, 0x13, 0x48, - 0x00, 0x6A, 0xC0, 0x03, 0xC0, 0x0F, 0x01, 0x28, 0x01, 0xD1, 0x00, 0x24, 0x19, 0xE0, 0x0F, 0x4A, - 0x12, 0x6A, 0x92, 0x04, 0xD2, 0x0E, 0x91, 0x1C, 0x0C, 0x4A, 0x12, 0x6A, 0xD2, 0x05, 0xD2, 0x0D, - 0x92, 0x1C, 0x6A, 0x43, 0x10, 0x46, 0xFD, 0xF7, 0x31, 0xFB, 0x06, 0x46, 0x07, 0x48, 0x00, 0x6A, - 0x00, 0x04, 0x80, 0x0F, 0x80, 0x00, 0x6A, 0x46, 0x11, 0x58, 0x30, 0x46, 0xFD, 0xF7, 0x26, 0xFB, - 0x04, 0x46, 0x20, 0x46, 0x04, 0xB0, 0x70, 0xBD, 0xA4, 0xBE, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, - 0x00, 0x80, 0x51, 0x01, 0x00, 0x1B, 0xB7, 0x00, 0xFE, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x28, 0x48, - 0x01, 0x90, 0x00, 0x20, 0x00, 0x90, 0x27, 0x48, 0x85, 0x42, 0x06, 0xD2, 0x26, 0x48, 0x85, 0x42, - 0x03, 0xD3, 0x03, 0x20, 0x02, 0x90, 0xAD, 0x00, 0x14, 0xE0, 0x24, 0x48, 0x85, 0x42, 0x06, 0xD2, - 0x40, 0x10, 0x85, 0x42, 0x03, 0xD3, 0x01, 0x20, 0x02, 0x90, 0x6D, 0x00, 0x0A, 0xE0, 0x20, 0x48, - 0x85, 0x42, 0x05, 0xD8, 0x40, 0x10, 0x85, 0x42, 0x02, 0xD3, 0x00, 0x20, 0x02, 0x90, 0x01, 0xE0, - 0x1C, 0x48, 0xFE, 0xBD, 0x00, 0x2C, 0x02, 0xD1, 0x15, 0x48, 0x01, 0x90, 0x03, 0xE0, 0x01, 0x2C, - 0x01, 0xD1, 0x19, 0x48, 0x01, 0x90, 0x19, 0x49, 0x28, 0x46, 0xFD, 0xF7, 0xE7, 0xFA, 0x07, 0x46, - 0x16, 0x49, 0x01, 0x98, 0xFD, 0xF7, 0xE2, 0xFA, 0x06, 0x46, 0x0C, 0xE0, 0xF0, 0x07, 0xC0, 0x0F, - 0x06, 0xD1, 0xF8, 0x07, 0xC0, 0x0F, 0x03, 0xD1, 0x02, 0x2E, 0x01, 0xD0, 0x02, 0x2F, 0x00, 0xD1, - 0x02, 0xE0, 0x76, 0x08, 0x7F, 0x08, 0xF1, 0xE7, 0x00, 0xBF, 0x02, 0x98, 0x80, 0x03, 0xB1, 0x1E, - 0x49, 0x02, 0x08, 0x43, 0xB9, 0x1E, 0x08, 0x43, 0x00, 0x90, 0x00, 0x98, 0xD1, 0xE7, 0x00, 0x00, - 0x00, 0x1B, 0xB7, 0x00, 0x40, 0x59, 0x73, 0x07, 0x40, 0x78, 0x7D, 0x01, 0x80, 0xB2, 0xE6, 0x0E, - 0x00, 0x65, 0xCD, 0x1D, 0x2E, 0xC2, 0x00, 0x00, 0x00, 0x80, 0x51, 0x01, 0x40, 0x42, 0x0F, 0x00, - 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, 0x2B, 0x48, 0x84, 0x42, 0x02, 0xD8, 0x2A, 0x48, 0x84, 0x42, - 0x01, 0xD2, 0x2A, 0x48, 0x70, 0xBD, 0x2A, 0x48, 0x00, 0x6A, 0x00, 0x03, 0xC0, 0x0F, 0x1B, 0xD1, - 0x27, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x25, 0x49, 0x08, 0x60, 0x4B, 0x20, - 0x00, 0x01, 0xFF, 0xF7, 0xFF, 0xFE, 0x22, 0x48, 0xC0, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0xD0, - 0x00, 0x25, 0x17, 0xE0, 0x1E, 0x48, 0x00, 0x6A, 0x01, 0x21, 0xC9, 0x04, 0x88, 0x43, 0x40, 0x18, - 0x1B, 0x49, 0x08, 0x62, 0x01, 0x25, 0x0D, 0xE0, 0x19, 0x48, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, - 0x00, 0x1D, 0x17, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x15, 0x48, 0xC0, 0x68, 0xC0, 0x06, 0xC0, 0x0F, - 0xFA, 0xD0, 0x01, 0x25, 0x21, 0x46, 0x28, 0x46, 0xFF, 0xF7, 0x5E, 0xFF, 0x06, 0x46, 0x30, 0x46, - 0x00, 0xF0, 0x62, 0xF8, 0x0E, 0x48, 0x00, 0x6A, 0x01, 0x21, 0x89, 0x04, 0x88, 0x43, 0x0C, 0x49, - 0x08, 0x62, 0x08, 0x46, 0x00, 0x6A, 0xC9, 0x01, 0x88, 0x43, 0x09, 0x49, 0x08, 0x62, 0x00, 0xBF, - 0x07, 0x48, 0xC0, 0x68, 0x40, 0x07, 0xC0, 0x0F, 0xFA, 0xD0, 0x02, 0x20, 0x00, 0xF0, 0x14, 0xF8, - 0x00, 0x20, 0xAF, 0xE7, 0x00, 0x87, 0x93, 0x03, 0x40, 0x78, 0x7D, 0x01, 0x06, 0x96, 0xFF, 0xFF, - 0x00, 0x02, 0x00, 0x50, 0x05, 0x20, 0x00, 0x07, 0x80, 0x68, 0x02, 0x21, 0x88, 0x43, 0x80, 0x1C, - 0x05, 0x21, 0x09, 0x07, 0x88, 0x60, 0x70, 0x47, 0x10, 0xB5, 0x04, 0x46, 0x07, 0x2C, 0x03, 0xDC, - 0x03, 0x2C, 0x03, 0xDD, 0x07, 0x2C, 0x01, 0xDA, 0x0E, 0x48, 0x10, 0xBD, 0x0E, 0x48, 0x00, 0x69, - 0xC0, 0x08, 0xC0, 0x00, 0x61, 0x07, 0x49, 0x0F, 0x08, 0x43, 0x0B, 0x49, 0x08, 0x61, 0x08, 0x46, - 0xC0, 0x68, 0x00, 0x06, 0xC0, 0x0F, 0x09, 0xD0, 0x08, 0x46, 0xC0, 0x68, 0x80, 0x21, 0x88, 0x43, - 0x80, 0x30, 0x05, 0x49, 0xC8, 0x60, 0x03, 0x48, 0x00, 0x1D, 0xE6, 0xE7, 0x06, 0xF0, 0x04, 0xFD, - 0x00, 0x20, 0xE2, 0xE7, 0x03, 0x96, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x50, 0x05, 0x49, 0x0A, 0x6A, - 0x89, 0x02, 0x8A, 0x43, 0xC1, 0x04, 0x01, 0x23, 0xDB, 0x04, 0x19, 0x40, 0x0A, 0x43, 0x01, 0x49, - 0x0A, 0x62, 0x70, 0x47, 0x00, 0x02, 0x00, 0x50, 0x11, 0x49, 0x09, 0x6A, 0x49, 0x0A, 0x49, 0x02, - 0xC2, 0x05, 0xD2, 0x0D, 0x11, 0x43, 0x0E, 0x4A, 0x11, 0x62, 0x11, 0x46, 0x0A, 0x6A, 0x1F, 0x21, - 0x49, 0x02, 0x8A, 0x43, 0x41, 0x0A, 0x49, 0x02, 0x1F, 0x23, 0x5B, 0x02, 0x19, 0x40, 0x0A, 0x43, - 0x07, 0x49, 0x0A, 0x62, 0x0A, 0x6A, 0x03, 0x21, 0x89, 0x03, 0x8A, 0x43, 0x81, 0x0B, 0x89, 0x03, - 0x03, 0x23, 0x9B, 0x03, 0x19, 0x40, 0x0A, 0x43, 0x01, 0x49, 0x0A, 0x62, 0x70, 0x47, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x50, 0x30, 0xB5, 0x8C, 0x4B, 0x9B, 0x79, 0x1B, 0x06, 0xDB, 0x0F, 0x01, 0x2B, - 0x02, 0xD1, 0x0A, 0x21, 0x10, 0x22, 0x01, 0xE0, 0x14, 0x21, 0x0E, 0x22, 0x86, 0x4B, 0x9B, 0x7A, - 0x86, 0x4C, 0x23, 0x70, 0x24, 0x78, 0x63, 0x1C, 0xDC, 0x0F, 0xE4, 0x18, 0xE4, 0x05, 0x24, 0x0E, - 0x83, 0x4D, 0x2C, 0x70, 0x81, 0x4C, 0x23, 0x78, 0xDC, 0x0F, 0xE4, 0x18, 0x64, 0x10, 0x81, 0x4D, - 0x2C, 0x70, 0x7F, 0x4B, 0x1B, 0x78, 0x03, 0x2B, 0x03, 0xDB, 0x7D, 0x4B, 0x1B, 0x78, 0x8B, 0x42, - 0x01, 0xDD, 0x7B, 0x4B, 0x19, 0x70, 0x7B, 0x4B, 0x1B, 0x78, 0x03, 0x2B, 0x03, 0xDB, 0x79, 0x4B, - 0x1B, 0x78, 0x8B, 0x42, 0x01, 0xDD, 0x77, 0x4B, 0x19, 0x70, 0x73, 0x4B, 0x9B, 0x79, 0x1B, 0x06, - 0xDB, 0x0F, 0x01, 0x2B, 0x0E, 0xD1, 0x72, 0x4B, 0x1B, 0x78, 0x73, 0x4C, 0x23, 0x70, 0x00, 0x23, - 0x72, 0x4C, 0x23, 0x70, 0x6F, 0x4B, 0x1B, 0x78, 0x71, 0x4C, 0x23, 0x70, 0x00, 0x23, 0x71, 0x4C, - 0x23, 0x70, 0x1F, 0xE0, 0x6A, 0x4C, 0x24, 0x78, 0x63, 0x1C, 0xDC, 0x0F, 0xE4, 0x18, 0xE4, 0x05, - 0x24, 0x0E, 0x69, 0x4D, 0x2C, 0x70, 0x66, 0x4C, 0x23, 0x78, 0xDC, 0x0F, 0xE4, 0x18, 0x64, 0x10, - 0x66, 0x4D, 0x2C, 0x70, 0x63, 0x4C, 0x24, 0x78, 0x63, 0x1C, 0xDC, 0x0F, 0xE4, 0x18, 0xE4, 0x05, - 0x24, 0x0E, 0x63, 0x4D, 0x2C, 0x70, 0x5F, 0x4C, 0x23, 0x78, 0xDC, 0x0F, 0xE4, 0x18, 0x64, 0x10, - 0x60, 0x4D, 0x2C, 0x70, 0x00, 0x20, 0x00, 0x23, 0x5F, 0x4C, 0x23, 0x70, 0x0D, 0xE0, 0x56, 0x4B, - 0x1A, 0x33, 0x1B, 0x5C, 0xFF, 0x2B, 0x05, 0xD0, 0x5B, 0x4B, 0x1B, 0x78, 0x5B, 0x1C, 0x5A, 0x4C, - 0x23, 0x70, 0x00, 0xE0, 0x03, 0xE0, 0x43, 0x1C, 0xD8, 0xB2, 0x90, 0x42, 0xEF, 0xDB, 0x00, 0xBF, - 0x10, 0x20, 0x00, 0x23, 0x55, 0x4C, 0x23, 0x70, 0x0D, 0xE0, 0x4B, 0x4B, 0x1A, 0x33, 0x1B, 0x5C, - 0xFF, 0x2B, 0x05, 0xD0, 0x51, 0x4B, 0x1B, 0x78, 0x5B, 0x1C, 0x50, 0x4C, 0x23, 0x70, 0x00, 0xE0, - 0x05, 0xE0, 0x43, 0x1C, 0xD8, 0xB2, 0x13, 0x46, 0x10, 0x33, 0x83, 0x42, 0xED, 0xDC, 0x00, 0xBF, - 0x41, 0x4B, 0x9B, 0x79, 0xDB, 0x06, 0xDB, 0x0F, 0x07, 0xD0, 0x47, 0x4B, 0x18, 0x78, 0x47, 0x4B, - 0x1B, 0x78, 0x45, 0x4C, 0x23, 0x70, 0x45, 0x4B, 0x18, 0x70, 0x43, 0x4B, 0x1B, 0x78, 0x43, 0x4C, - 0x24, 0x78, 0x1B, 0x19, 0x42, 0x4C, 0x23, 0x70, 0x3F, 0x4B, 0x1B, 0x78, 0x3A, 0x4C, 0x24, 0x78, - 0x63, 0x43, 0x40, 0x4C, 0x23, 0x80, 0x3C, 0x4B, 0x1B, 0x78, 0x38, 0x4C, 0x24, 0x78, 0x63, 0x43, - 0x3D, 0x4C, 0x23, 0x80, 0x39, 0x4B, 0x1B, 0x78, 0x33, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x3B, 0x4C, - 0x23, 0x80, 0x36, 0x4B, 0x1B, 0x78, 0x31, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x38, 0x4C, 0x23, 0x80, - 0x31, 0x4B, 0x1B, 0x78, 0x2E, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x36, 0x4C, 0x23, 0x80, 0x2E, 0x4B, - 0x1B, 0x78, 0x2C, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x33, 0x4C, 0x23, 0x80, 0x2B, 0x4B, 0x1B, 0x78, - 0x27, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x31, 0x4C, 0x23, 0x80, 0x28, 0x4B, 0x1B, 0x78, 0x25, 0x4C, - 0x24, 0x78, 0x63, 0x43, 0x2E, 0x4C, 0x23, 0x80, 0x23, 0x4B, 0x1B, 0x78, 0x1C, 0x4C, 0x24, 0x78, - 0x63, 0x43, 0x2C, 0x4C, 0x23, 0x80, 0x21, 0x4B, 0x1B, 0x78, 0x19, 0x4C, 0x24, 0x78, 0x63, 0x43, - 0x29, 0x4C, 0x23, 0x80, 0x1C, 0x4B, 0x1B, 0x78, 0x16, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x27, 0x4C, - 0x23, 0x80, 0x1A, 0x4B, 0x1B, 0x78, 0x13, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x24, 0x4C, 0x23, 0x80, - 0x17, 0x4B, 0x1B, 0x78, 0x0E, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x22, 0x4C, 0x23, 0x80, 0x14, 0x4B, - 0x1B, 0x78, 0x0C, 0x4C, 0x24, 0x78, 0x63, 0x43, 0x1F, 0x4C, 0x23, 0x80, 0x10, 0x4B, 0x1B, 0x78, - 0x5B, 0x06, 0x1B, 0x0C, 0x1D, 0x4C, 0x23, 0x80, 0x04, 0x4B, 0x1B, 0x78, 0x5B, 0x06, 0x1B, 0x0C, - 0x1B, 0x4C, 0x23, 0x80, 0x30, 0xBD, 0x00, 0x00, 0x39, 0x04, 0x00, 0x20, 0x49, 0x01, 0x00, 0x20, - 0x40, 0x01, 0x00, 0x20, 0x43, 0x01, 0x00, 0x20, 0x41, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, - 0x44, 0x01, 0x00, 0x20, 0x45, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, - 0x48, 0x01, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, 0x2E, 0x02, 0x00, 0x20, 0x72, 0x01, 0x00, 0x20, - 0x30, 0x02, 0x00, 0x20, 0x74, 0x01, 0x00, 0x20, 0x32, 0x02, 0x00, 0x20, 0x76, 0x01, 0x00, 0x20, - 0x34, 0x02, 0x00, 0x20, 0x78, 0x01, 0x00, 0x20, 0x7A, 0x01, 0x00, 0x20, 0x7C, 0x01, 0x00, 0x20, - 0x7E, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x20, 0x36, 0x02, 0x00, 0x20, 0x82, 0x01, 0x00, 0x20, - 0x84, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x04, 0x46, 0x01, 0x20, 0x00, 0x05, 0x84, 0x42, 0x13, 0xD1, - 0x00, 0xBF, 0x14, 0x48, 0x80, 0x69, 0xC0, 0x00, 0xC0, 0x0F, 0xFA, 0xD0, 0x12, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x49, 0x04, 0x88, 0x43, 0x10, 0x49, 0x88, 0x60, 0x00, 0x20, 0x0F, 0x49, 0x08, 0x60, - 0x0D, 0x20, 0x04, 0xF0, 0xDF, 0xF8, 0x13, 0xE0, 0x00, 0xBF, 0x0D, 0x48, 0x80, 0x69, 0xC0, 0x00, - 0xC0, 0x0F, 0xFA, 0xD0, 0x08, 0x48, 0x80, 0x68, 0x01, 0x21, 0x09, 0x04, 0x88, 0x43, 0x06, 0x49, - 0x88, 0x60, 0x00, 0x20, 0x05, 0x49, 0x09, 0x1F, 0x08, 0x60, 0x0C, 0x20, 0x04, 0xF0, 0xCA, 0xF8, - 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x15, 0x40, 0x00, 0x02, 0x00, 0x50, 0x34, 0x01, 0x00, 0x20, - 0x00, 0x00, 0x05, 0x40, 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x00, 0x2C, 0x05, 0xD0, 0x01, 0x20, - 0x00, 0x05, 0x84, 0x42, 0x01, 0xD0, 0x83, 0x48, 0xF8, 0xBD, 0xA8, 0x79, 0x00, 0x28, 0x0E, 0xD0, - 0xA8, 0x79, 0x03, 0x28, 0x0B, 0xD0, 0xA8, 0x79, 0x01, 0x28, 0x08, 0xD0, 0xA8, 0x79, 0x05, 0x28, - 0x05, 0xD0, 0xA8, 0x79, 0x07, 0x28, 0x02, 0xD0, 0x7A, 0x48, 0x40, 0x1C, 0xEC, 0xE7, 0x28, 0x79, - 0x00, 0x28, 0x0B, 0xD0, 0x28, 0x79, 0x01, 0x28, 0x08, 0xD0, 0x28, 0x79, 0x02, 0x28, 0x05, 0xD0, - 0x28, 0x79, 0x03, 0x28, 0x02, 0xD0, 0x73, 0x48, 0x80, 0x1C, 0xDD, 0xE7, 0x68, 0x79, 0x00, 0x28, - 0x08, 0xD0, 0x68, 0x79, 0x01, 0x28, 0x05, 0xD0, 0x68, 0x79, 0x01, 0x28, 0x02, 0xD0, 0x6D, 0x48, - 0xC0, 0x1C, 0xD1, 0xE7, 0xE8, 0x79, 0x00, 0x28, 0x14, 0xD0, 0xE8, 0x79, 0x01, 0x28, 0x11, 0xD0, - 0xE8, 0x79, 0x02, 0x28, 0x0E, 0xD0, 0xE8, 0x79, 0x03, 0x28, 0x0B, 0xD0, 0xE8, 0x79, 0x04, 0x28, - 0x08, 0xD0, 0xE8, 0x79, 0x05, 0x28, 0x05, 0xD0, 0xE8, 0x79, 0x06, 0x28, 0x02, 0xD0, 0x61, 0x48, - 0x00, 0x1D, 0xB9, 0xE7, 0x00, 0x2C, 0x19, 0xD1, 0x5F, 0x48, 0x80, 0x68, 0x01, 0x21, 0x09, 0x04, - 0x88, 0x43, 0x40, 0x18, 0x5C, 0x49, 0x88, 0x60, 0x05, 0x20, 0x00, 0x07, 0xC0, 0x68, 0xC9, 0x01, - 0x88, 0x43, 0x40, 0x18, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x08, 0x46, 0xC0, 0x68, 0x01, 0x21, - 0x09, 0x04, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x1A, 0xE0, 0x01, 0x20, 0x00, 0x05, - 0x84, 0x42, 0x16, 0xD1, 0x50, 0x48, 0x80, 0x68, 0xE1, 0x10, 0x88, 0x43, 0x40, 0x18, 0x4E, 0x49, - 0x88, 0x60, 0x05, 0x20, 0x00, 0x07, 0xC0, 0x68, 0x09, 0x02, 0x88, 0x43, 0x40, 0x18, 0x05, 0x21, - 0x09, 0x07, 0xC8, 0x60, 0x08, 0x46, 0xC0, 0x68, 0xE1, 0x10, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, - 0xC8, 0x60, 0x46, 0x48, 0x26, 0x18, 0xB0, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0xB0, 0x60, - 0xB0, 0x68, 0x02, 0x21, 0x88, 0x43, 0x80, 0x1C, 0xB0, 0x60, 0xB1, 0x68, 0xF0, 0x20, 0x81, 0x43, - 0xE8, 0x79, 0x00, 0x01, 0xF0, 0x22, 0x10, 0x40, 0x01, 0x43, 0xB1, 0x60, 0xF0, 0x68, 0x20, 0x21, - 0x88, 0x43, 0xA9, 0x79, 0x04, 0x22, 0x11, 0x40, 0x89, 0x08, 0x49, 0x01, 0x20, 0x22, 0x11, 0x40, - 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, 0x10, 0x21, 0x88, 0x43, 0xA9, 0x79, 0x02, 0x22, 0x11, 0x40, - 0x49, 0x08, 0x09, 0x01, 0x10, 0x22, 0x11, 0x40, 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, 0x08, 0x21, - 0x88, 0x43, 0xA9, 0x79, 0xC9, 0x00, 0x08, 0x22, 0x11, 0x40, 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, - 0x80, 0x08, 0x80, 0x00, 0x29, 0x79, 0x89, 0x07, 0x89, 0x0F, 0x08, 0x43, 0xF0, 0x60, 0xF1, 0x68, - 0x04, 0x20, 0x81, 0x43, 0x68, 0x79, 0x80, 0x00, 0x04, 0x22, 0x10, 0x40, 0x01, 0x43, 0xF1, 0x60, - 0x30, 0x6A, 0xC0, 0x09, 0xC0, 0x01, 0x29, 0x7A, 0x49, 0x06, 0x49, 0x0E, 0x08, 0x43, 0x30, 0x62, - 0x1D, 0x48, 0xC0, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x07, 0xD0, 0x1B, 0x48, 0x40, 0x69, 0x03, 0x21, - 0x09, 0x06, 0x88, 0x43, 0x18, 0x49, 0x48, 0x61, 0x22, 0xE0, 0x17, 0x48, 0xC0, 0x68, 0x40, 0x07, - 0xC0, 0x0F, 0x0A, 0xD0, 0x14, 0x48, 0x40, 0x69, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x01, 0x21, - 0x09, 0x06, 0x40, 0x18, 0x10, 0x49, 0x48, 0x61, 0x12, 0xE0, 0x0F, 0x48, 0xC0, 0x68, 0xC0, 0x06, - 0xC0, 0x0F, 0x0A, 0xD0, 0x0C, 0x48, 0x40, 0x69, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x01, 0x21, - 0x09, 0x06, 0x40, 0x18, 0x08, 0x49, 0x48, 0x61, 0x02, 0xE0, 0x06, 0x48, 0x80, 0x1D, 0x03, 0xE7, - 0x01, 0xF0, 0xB6, 0xFA, 0x07, 0x46, 0x32, 0x46, 0x24, 0x32, 0x29, 0x68, 0xFD, 0xF7, 0xB8, 0xFA, - 0x00, 0x20, 0xF9, 0xE6, 0x02, 0x98, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x05, 0x40, - 0x1C, 0x49, 0x89, 0x68, 0xC9, 0x09, 0xC9, 0x01, 0x1A, 0x4A, 0x91, 0x60, 0x11, 0x46, 0x09, 0x68, - 0x01, 0x22, 0xD2, 0x03, 0x91, 0x43, 0x17, 0x4A, 0x11, 0x60, 0x17, 0x49, 0x09, 0x6D, 0x17, 0x4A, - 0x89, 0x1A, 0x14, 0x4A, 0x91, 0x61, 0x00, 0x20, 0x17, 0xE0, 0x01, 0x21, 0x02, 0x01, 0x11, 0x4B, - 0xD2, 0x18, 0xD1, 0x62, 0x81, 0x00, 0x12, 0x4A, 0x51, 0x58, 0x89, 0x05, 0x89, 0x0D, 0x02, 0x01, - 0xD2, 0x18, 0x91, 0x62, 0x0C, 0x21, 0x41, 0x43, 0x0E, 0x4A, 0x89, 0x18, 0x89, 0x68, 0x0B, 0x4A, - 0x89, 0x1A, 0x02, 0x01, 0xD2, 0x18, 0x11, 0x62, 0x40, 0x1C, 0x0C, 0x21, 0x41, 0x43, 0x09, 0x4A, - 0x89, 0x18, 0x49, 0x68, 0x00, 0x29, 0xE0, 0xD1, 0x07, 0x4A, 0x11, 0x70, 0x07, 0x4A, 0x11, 0x70, - 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x1C, 0x1A, 0x00, 0x20, 0x00, 0x01, 0x06, 0x40, - 0x04, 0x1A, 0x00, 0x20, 0x38, 0x02, 0x00, 0x20, 0x7C, 0x03, 0x00, 0x20, 0x7D, 0x03, 0x00, 0x20, - 0x10, 0xB5, 0x00, 0x21, 0x08, 0x46, 0x00, 0xF0, 0x05, 0xFA, 0x04, 0x46, 0x20, 0x01, 0x0C, 0x49, - 0x40, 0x18, 0xC0, 0x6A, 0x03, 0x21, 0x08, 0x43, 0x21, 0x01, 0x09, 0x4A, 0x89, 0x18, 0xC8, 0x62, - 0x80, 0x21, 0x00, 0x20, 0x00, 0xF0, 0xF6, 0xF9, 0x04, 0x46, 0x20, 0x01, 0x04, 0x49, 0x40, 0x18, - 0xC0, 0x6A, 0x03, 0x21, 0x08, 0x43, 0x21, 0x01, 0x01, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x10, 0xBD, - 0x00, 0x00, 0x06, 0x40, 0x70, 0xB5, 0x00, 0x24, 0x15, 0xE0, 0x20, 0x01, 0x0B, 0x49, 0x45, 0x18, - 0xA8, 0x68, 0x00, 0x28, 0x0E, 0xD0, 0x29, 0x78, 0x09, 0x48, 0x00, 0x78, 0x60, 0x22, 0x10, 0x40, - 0x81, 0x42, 0x07, 0xD1, 0x68, 0x78, 0x06, 0x49, 0x49, 0x78, 0x88, 0x42, 0x02, 0xD1, 0xA8, 0x68, - 0x80, 0x47, 0x70, 0xBD, 0x64, 0x1C, 0x0D, 0x2C, 0xE7, 0xD3, 0xFA, 0xE7, 0x68, 0x02, 0x00, 0x20, - 0x74, 0x03, 0x00, 0x20, 0x0B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, 0x07, 0x20, 0x0A, 0x49, - 0x08, 0x60, 0x0D, 0xE0, 0x0F, 0x20, 0x08, 0x49, 0x08, 0x60, 0x06, 0x49, 0x09, 0x78, 0x48, 0x06, - 0x40, 0x0E, 0x06, 0x49, 0x89, 0x68, 0xC9, 0x09, 0xC9, 0x01, 0x01, 0x43, 0x03, 0x4A, 0x91, 0x60, - 0x70, 0x47, 0x00, 0x00, 0x7C, 0x03, 0x00, 0x20, 0x70, 0x03, 0x00, 0x20, 0x00, 0x00, 0x06, 0x40, - 0x70, 0xB5, 0x00, 0x24, 0x15, 0xE0, 0x20, 0x01, 0x0B, 0x49, 0x45, 0x18, 0xE8, 0x68, 0x00, 0x28, + 0x05, 0x20, 0x00, 0x07, 0x04, 0x63, 0x16, 0x29, 0x07, 0xD1, 0x0A, 0x48, 0x00, 0x69, 0x01, 0x23, + 0xDB, 0x02, 0x98, 0x43, 0x07, 0x4B, 0x18, 0x61, 0x06, 0xE0, 0x06, 0x48, 0x00, 0x69, 0x01, 0x23, + 0x5B, 0x02, 0x98, 0x43, 0x03, 0x4B, 0x18, 0x61, 0x01, 0xE0, 0x03, 0x48, 0x10, 0xBD, 0x00, 0xBF, + 0x00, 0x20, 0xFB, 0xE7, 0x40, 0x00, 0x00, 0x50, 0x01, 0x89, 0xFF, 0xFF, 0x70, 0xB5, 0x03, 0x46, + 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, 0x17, 0x48, 0x70, 0xBD, 0x98, 0x01, 0x17, 0x4D, + 0x44, 0x19, 0x00, 0x2A, 0x03, 0xD0, 0x01, 0x2A, 0x01, 0xD0, 0x02, 0x2A, 0x17, 0xD1, 0x25, 0x68, + 0x4E, 0x00, 0x03, 0x20, 0xB0, 0x40, 0x85, 0x43, 0x25, 0x60, 0x01, 0x2A, 0x06, 0xD1, 0x25, 0x68, + 0x4E, 0x00, 0x01, 0x20, 0xB0, 0x40, 0x05, 0x43, 0x25, 0x60, 0x13, 0xE0, 0x02, 0x2A, 0x11, 0xD1, + 0x20, 0x68, 0x4E, 0x00, 0x02, 0x25, 0xB5, 0x40, 0x28, 0x43, 0x20, 0x60, 0x0A, 0xE0, 0x03, 0x2A, + 0x06, 0xD1, 0x20, 0x68, 0x4E, 0x00, 0x03, 0x25, 0xB5, 0x40, 0x28, 0x43, 0x20, 0x60, 0x01, 0xE0, + 0x01, 0x48, 0xD2, 0xE7, 0x00, 0x20, 0xD0, 0xE7, 0x01, 0x89, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0x50, + 0x10, 0xB5, 0x03, 0x46, 0x00, 0x29, 0x01, 0xDB, 0x10, 0x29, 0x01, 0xDD, 0x05, 0x48, 0x10, 0xBD, + 0x98, 0x01, 0x05, 0x4C, 0x02, 0x19, 0x90, 0x68, 0x01, 0x24, 0x8C, 0x40, 0x20, 0x43, 0x90, 0x60, + 0x00, 0x20, 0xF4, 0xE7, 0x01, 0x89, 0xFF, 0xFF, 0x00, 0x40, 0x00, 0x50, 0x02, 0x4A, 0x10, 0x60, + 0x12, 0x1D, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x04, 0x01, 0x00, 0x20, 0x0A, 0x48, 0x01, 0x68, + 0x40, 0x22, 0x91, 0x43, 0x01, 0x60, 0x05, 0x20, 0x00, 0x07, 0xC2, 0x68, 0x01, 0x21, 0x49, 0x02, + 0x0A, 0x43, 0xC2, 0x60, 0xC2, 0x68, 0x8A, 0x43, 0xC2, 0x60, 0x04, 0x4A, 0x90, 0x68, 0x88, 0x43, + 0x90, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x00, 0x02, 0x00, 0x50, + 0x09, 0x4A, 0x00, 0x28, 0x07, 0xD0, 0x01, 0x28, 0x07, 0xD0, 0x02, 0x28, 0x07, 0xD0, 0x03, 0x28, + 0x08, 0xD1, 0xD1, 0x60, 0x04, 0xE0, 0x11, 0x60, 0x02, 0xE0, 0x51, 0x60, 0x00, 0xE0, 0x91, 0x60, + 0x00, 0x20, 0x70, 0x47, 0x01, 0x48, 0x70, 0x47, 0x28, 0x1A, 0x00, 0x20, 0x01, 0x8B, 0xFF, 0xFF, + 0x81, 0x00, 0x10, 0xB5, 0x10, 0x48, 0x0A, 0x22, 0x00, 0x68, 0x50, 0x43, 0xFD, 0xF7, 0x16, 0xFD, + 0x40, 0x1D, 0x0A, 0x21, 0xFD, 0xF7, 0x12, 0xFD, 0x0C, 0x49, 0x40, 0x1E, 0x8B, 0x68, 0x01, 0x22, + 0x52, 0x02, 0x13, 0x43, 0x8B, 0x60, 0x05, 0x21, 0x09, 0x07, 0xCB, 0x68, 0x13, 0x43, 0xCB, 0x60, + 0xCB, 0x68, 0x93, 0x43, 0xCB, 0x60, 0x06, 0x49, 0x0A, 0x68, 0x40, 0x23, 0x1A, 0x43, 0x0A, 0x60, + 0x08, 0x61, 0x00, 0x20, 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x50, + 0x00, 0x00, 0x12, 0x40, 0x01, 0x48, 0x80, 0x68, 0xC0, 0xB2, 0x70, 0x47, 0x00, 0x00, 0x12, 0x40, + 0x10, 0xB5, 0x49, 0x06, 0xD2, 0x07, 0x1B, 0x4B, 0xFE, 0x24, 0x09, 0x0E, 0xD2, 0x0F, 0x00, 0x28, + 0x0F, 0xD0, 0x01, 0x28, 0x17, 0xD0, 0x02, 0x28, 0x1F, 0xD0, 0x03, 0x28, 0x28, 0xD1, 0x18, 0x6A, + 0xA0, 0x43, 0x08, 0x43, 0x18, 0x62, 0x18, 0x6A, 0x40, 0x08, 0x40, 0x00, 0x10, 0x43, 0x18, 0x62, + 0x1C, 0xE0, 0x58, 0x68, 0xA0, 0x43, 0x08, 0x43, 0x58, 0x60, 0x58, 0x68, 0x40, 0x08, 0x40, 0x00, + 0x10, 0x43, 0x58, 0x60, 0x12, 0xE0, 0x98, 0x69, 0xA0, 0x43, 0x08, 0x43, 0x98, 0x61, 0x98, 0x69, + 0x40, 0x08, 0x40, 0x00, 0x10, 0x43, 0x98, 0x61, 0x08, 0xE0, 0xD8, 0x69, 0xA0, 0x43, 0x08, 0x43, + 0xD8, 0x61, 0xD8, 0x69, 0x40, 0x08, 0x40, 0x00, 0x10, 0x43, 0xD8, 0x61, 0x00, 0x20, 0x10, 0xBD, + 0x01, 0x48, 0x10, 0xBD, 0x00, 0x00, 0x12, 0x40, 0x01, 0x8B, 0xFF, 0xFF, 0x01, 0x49, 0x88, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x08, 0x49, 0x09, 0x68, 0x41, 0x43, 0x08, 0x4A, + 0x51, 0x61, 0x00, 0x21, 0x91, 0x61, 0x05, 0x21, 0x11, 0x61, 0x00, 0xBF, 0x04, 0x49, 0x09, 0x69, + 0x01, 0x22, 0x12, 0x04, 0x11, 0x42, 0xF9, 0xD0, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, + 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xB5, 0x01, 0x46, 0x0B, 0x46, 0x07, 0xF0, 0x39, 0xFD, 0x05, 0x04, + 0x09, 0x0E, 0x13, 0x18, 0x1D, 0x00, 0x0F, 0x48, 0xC0, 0x68, 0xC2, 0x07, 0xD2, 0x0F, 0x15, 0xE0, + 0x0C, 0x48, 0xC0, 0x68, 0x80, 0x07, 0xC2, 0x0F, 0x10, 0xE0, 0x0A, 0x48, 0xC0, 0x68, 0xC0, 0x06, + 0xC2, 0x0F, 0x0B, 0xE0, 0x07, 0x48, 0xC0, 0x68, 0x00, 0x07, 0xC2, 0x0F, 0x06, 0xE0, 0x05, 0x48, + 0xC0, 0x68, 0x40, 0x07, 0xC2, 0x0F, 0x01, 0xE0, 0x03, 0x48, 0x00, 0xBD, 0x00, 0xBF, 0x10, 0x46, + 0xFB, 0xE7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x03, 0x96, 0xFF, 0xFF, 0x00, 0x48, 0x70, 0x47, + 0x00, 0x1B, 0xB7, 0x00, 0x7F, 0xB5, 0x00, 0x24, 0x18, 0x48, 0x6E, 0x46, 0x2E, 0xC8, 0x2E, 0xC6, + 0x17, 0x48, 0x00, 0x6A, 0x00, 0x03, 0xC0, 0x0F, 0x01, 0x28, 0x01, 0xD1, 0x15, 0x4D, 0x00, 0xE0, + 0x15, 0x4D, 0x13, 0x48, 0x00, 0x6A, 0xC0, 0x03, 0xC0, 0x0F, 0x01, 0x28, 0x01, 0xD1, 0x00, 0x24, + 0x19, 0xE0, 0x0F, 0x4A, 0x12, 0x6A, 0x92, 0x04, 0xD2, 0x0E, 0x91, 0x1C, 0x0C, 0x4A, 0x12, 0x6A, + 0xD2, 0x05, 0xD2, 0x0D, 0x92, 0x1C, 0x6A, 0x43, 0x10, 0x46, 0xFD, 0xF7, 0x3F, 0xFC, 0x06, 0x46, + 0x07, 0x48, 0x00, 0x6A, 0x00, 0x04, 0x80, 0x0F, 0x80, 0x00, 0x6A, 0x46, 0x11, 0x58, 0x30, 0x46, + 0xFD, 0xF7, 0x34, 0xFC, 0x04, 0x46, 0x20, 0x46, 0x04, 0xB0, 0x70, 0xBD, 0xF0, 0xB9, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x50, 0x00, 0x80, 0x51, 0x01, 0x00, 0x1B, 0xB7, 0x00, 0xFE, 0xB5, 0x04, 0x46, + 0x0D, 0x46, 0x28, 0x48, 0x01, 0x90, 0x00, 0x20, 0x00, 0x90, 0x27, 0x48, 0x85, 0x42, 0x06, 0xD2, + 0x26, 0x48, 0x85, 0x42, 0x03, 0xD3, 0x03, 0x20, 0x02, 0x90, 0xAD, 0x00, 0x14, 0xE0, 0x24, 0x48, + 0x85, 0x42, 0x06, 0xD2, 0x40, 0x10, 0x85, 0x42, 0x03, 0xD3, 0x01, 0x20, 0x02, 0x90, 0x6D, 0x00, + 0x0A, 0xE0, 0x20, 0x48, 0x85, 0x42, 0x05, 0xD8, 0x40, 0x10, 0x85, 0x42, 0x02, 0xD3, 0x00, 0x20, + 0x02, 0x90, 0x01, 0xE0, 0x1C, 0x48, 0xFE, 0xBD, 0x00, 0x2C, 0x02, 0xD1, 0x15, 0x48, 0x01, 0x90, + 0x03, 0xE0, 0x01, 0x2C, 0x01, 0xD1, 0x19, 0x48, 0x01, 0x90, 0x19, 0x49, 0x28, 0x46, 0xFD, 0xF7, + 0xF5, 0xFB, 0x07, 0x46, 0x16, 0x49, 0x01, 0x98, 0xFD, 0xF7, 0xF0, 0xFB, 0x06, 0x46, 0x0C, 0xE0, + 0xF0, 0x07, 0xC0, 0x0F, 0x06, 0xD1, 0xF8, 0x07, 0xC0, 0x0F, 0x03, 0xD1, 0x02, 0x2E, 0x01, 0xD0, + 0x02, 0x2F, 0x00, 0xD1, 0x02, 0xE0, 0x76, 0x08, 0x7F, 0x08, 0xF1, 0xE7, 0x00, 0xBF, 0x02, 0x98, + 0x80, 0x03, 0xB1, 0x1E, 0x49, 0x02, 0x08, 0x43, 0xB9, 0x1E, 0x08, 0x43, 0x00, 0x90, 0x00, 0x98, + 0xD1, 0xE7, 0x00, 0x00, 0x00, 0x1B, 0xB7, 0x00, 0x40, 0x59, 0x73, 0x07, 0x40, 0x78, 0x7D, 0x01, + 0x80, 0xB2, 0xE6, 0x0E, 0x00, 0x65, 0xCD, 0x1D, 0x2E, 0xC2, 0x00, 0x00, 0x00, 0x80, 0x51, 0x01, + 0x40, 0x42, 0x0F, 0x00, 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, 0x2B, 0x48, 0x84, 0x42, 0x02, 0xD8, + 0x2A, 0x48, 0x84, 0x42, 0x01, 0xD2, 0x2A, 0x48, 0x70, 0xBD, 0x2A, 0x48, 0x00, 0x6A, 0x00, 0x03, + 0xC0, 0x0F, 0x1B, 0xD1, 0x27, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x25, 0x49, + 0x08, 0x60, 0x4B, 0x20, 0x00, 0x01, 0xFF, 0xF7, 0xFF, 0xFE, 0x22, 0x48, 0xC0, 0x68, 0xC0, 0x07, + 0xC0, 0x0F, 0x01, 0xD0, 0x00, 0x25, 0x17, 0xE0, 0x1E, 0x48, 0x00, 0x6A, 0x01, 0x21, 0xC9, 0x04, + 0x88, 0x43, 0x40, 0x18, 0x1B, 0x49, 0x08, 0x62, 0x01, 0x25, 0x0D, 0xE0, 0x19, 0x48, 0x00, 0x68, + 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x17, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x15, 0x48, 0xC0, 0x68, + 0xC0, 0x06, 0xC0, 0x0F, 0xFA, 0xD0, 0x01, 0x25, 0x21, 0x46, 0x28, 0x46, 0xFF, 0xF7, 0x5E, 0xFF, + 0x06, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x62, 0xF8, 0x0E, 0x48, 0x00, 0x6A, 0x01, 0x21, 0x89, 0x04, + 0x88, 0x43, 0x0C, 0x49, 0x08, 0x62, 0x08, 0x46, 0x00, 0x6A, 0xC9, 0x01, 0x88, 0x43, 0x09, 0x49, + 0x08, 0x62, 0x00, 0xBF, 0x07, 0x48, 0xC0, 0x68, 0x40, 0x07, 0xC0, 0x0F, 0xFA, 0xD0, 0x02, 0x20, + 0x00, 0xF0, 0x14, 0xF8, 0x00, 0x20, 0xAF, 0xE7, 0x00, 0x87, 0x93, 0x03, 0x40, 0x78, 0x7D, 0x01, + 0x06, 0x96, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x50, 0x05, 0x20, 0x00, 0x07, 0x80, 0x68, 0x02, 0x21, + 0x88, 0x43, 0x80, 0x1C, 0x05, 0x21, 0x09, 0x07, 0x88, 0x60, 0x70, 0x47, 0x10, 0xB5, 0x04, 0x46, + 0x07, 0x2C, 0x03, 0xDC, 0x03, 0x2C, 0x03, 0xDD, 0x07, 0x2C, 0x01, 0xDA, 0x0E, 0x48, 0x10, 0xBD, + 0x0E, 0x48, 0x00, 0x69, 0xC0, 0x08, 0xC0, 0x00, 0x61, 0x07, 0x49, 0x0F, 0x08, 0x43, 0x0B, 0x49, + 0x08, 0x61, 0x08, 0x46, 0xC0, 0x68, 0x00, 0x06, 0xC0, 0x0F, 0x09, 0xD0, 0x08, 0x46, 0xC0, 0x68, + 0x80, 0x21, 0x88, 0x43, 0x80, 0x30, 0x05, 0x49, 0xC8, 0x60, 0x03, 0x48, 0x00, 0x1D, 0xE6, 0xE7, + 0x06, 0xF0, 0x60, 0xFC, 0x00, 0x20, 0xE2, 0xE7, 0x03, 0x96, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x50, + 0x05, 0x49, 0x0A, 0x6A, 0x89, 0x02, 0x8A, 0x43, 0xC1, 0x04, 0x01, 0x23, 0xDB, 0x04, 0x19, 0x40, + 0x0A, 0x43, 0x01, 0x49, 0x0A, 0x62, 0x70, 0x47, 0x00, 0x02, 0x00, 0x50, 0x11, 0x49, 0x09, 0x6A, + 0x49, 0x0A, 0x49, 0x02, 0xC2, 0x05, 0xD2, 0x0D, 0x11, 0x43, 0x0E, 0x4A, 0x11, 0x62, 0x11, 0x46, + 0x0A, 0x6A, 0x1F, 0x21, 0x49, 0x02, 0x8A, 0x43, 0x41, 0x0A, 0x49, 0x02, 0x1F, 0x23, 0x5B, 0x02, + 0x19, 0x40, 0x0A, 0x43, 0x07, 0x49, 0x0A, 0x62, 0x0A, 0x6A, 0x03, 0x21, 0x89, 0x03, 0x8A, 0x43, + 0x81, 0x0B, 0x89, 0x03, 0x03, 0x23, 0x9B, 0x03, 0x19, 0x40, 0x0A, 0x43, 0x01, 0x49, 0x0A, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0xF0, 0xB5, 0x5E, 0x49, 0xC8, 0x7A, 0xC0, 0x09, + 0x02, 0xD0, 0x0A, 0x20, 0x10, 0x26, 0x01, 0xE0, 0x14, 0x20, 0x0E, 0x26, 0xCB, 0x7B, 0x5A, 0x4A, + 0x5A, 0x4C, 0x13, 0x70, 0xDA, 0xB2, 0x53, 0x1C, 0x96, 0x46, 0x5B, 0x08, 0x58, 0x4D, 0x23, 0x70, + 0x52, 0x08, 0x2A, 0x70, 0x22, 0x78, 0x03, 0x2A, 0x01, 0xD3, 0x82, 0x42, 0x00, 0xD9, 0x20, 0x70, + 0x2A, 0x78, 0x03, 0x2A, 0x01, 0xD3, 0x82, 0x42, 0x00, 0xD9, 0x28, 0x70, 0xC8, 0x7A, 0x00, 0x27, + 0xC0, 0x09, 0x00, 0x28, 0x20, 0x78, 0x4F, 0x4B, 0x08, 0xD0, 0x18, 0x70, 0x4E, 0x48, 0x4F, 0x4B, + 0x07, 0x70, 0x28, 0x78, 0x18, 0x70, 0x4E, 0x48, 0x07, 0x70, 0x0D, 0xE0, 0x42, 0x1C, 0x52, 0x08, + 0x1A, 0x70, 0x42, 0x08, 0x48, 0x48, 0x49, 0x4B, 0x02, 0x70, 0x28, 0x78, 0x42, 0x1C, 0x52, 0x08, + 0x1A, 0x70, 0x47, 0x4A, 0x40, 0x08, 0x10, 0x70, 0x3B, 0x46, 0x3A, 0x46, 0x45, 0x4F, 0x00, 0x20, + 0x3A, 0x70, 0x0B, 0xE0, 0x3B, 0x4A, 0x60, 0x3A, 0x12, 0x18, 0x60, 0x32, 0xD2, 0x7F, 0xFF, 0x2A, + 0x06, 0xD0, 0x3A, 0x78, 0x52, 0x1C, 0x40, 0x1C, 0x3A, 0x70, 0xC0, 0xB2, 0xB0, 0x42, 0xF1, 0xD3, + 0x1A, 0x46, 0x3D, 0x4B, 0x10, 0x20, 0x1A, 0x70, 0x10, 0x36, 0x0B, 0xE0, 0x31, 0x4A, 0x60, 0x3A, + 0x12, 0x18, 0x60, 0x32, 0xD2, 0x7F, 0xFF, 0x2A, 0x06, 0xD0, 0x1A, 0x78, 0x52, 0x1C, 0x40, 0x1C, + 0x1A, 0x70, 0xC0, 0xB2, 0xB0, 0x42, 0xF1, 0xD3, 0xC8, 0x7A, 0xC0, 0x06, 0x03, 0xD5, 0x38, 0x78, + 0x19, 0x78, 0x39, 0x70, 0x18, 0x70, 0x38, 0x78, 0x19, 0x78, 0x30, 0x4B, 0x42, 0x18, 0xD2, 0xB2, + 0x1A, 0x70, 0x28, 0x4B, 0x06, 0x46, 0x1F, 0x78, 0x2D, 0x4B, 0x7E, 0x43, 0x1E, 0x80, 0x26, 0x4B, + 0x2C, 0x4E, 0x1B, 0x78, 0x9C, 0x46, 0x43, 0x43, 0x33, 0x80, 0x0B, 0x46, 0x2A, 0x4E, 0x7B, 0x43, + 0x33, 0x80, 0x63, 0x46, 0x29, 0x4E, 0x4B, 0x43, 0x33, 0x80, 0x20, 0x4B, 0x06, 0x46, 0x1F, 0x78, + 0x27, 0x4B, 0x7E, 0x43, 0xBC, 0x46, 0x1E, 0x4F, 0x1E, 0x80, 0x3B, 0x78, 0x25, 0x4E, 0x07, 0x46, + 0x5F, 0x43, 0x37, 0x80, 0x67, 0x46, 0x0E, 0x46, 0x7E, 0x43, 0x23, 0x4F, 0x4B, 0x43, 0x3E, 0x80, + 0x22, 0x4E, 0x33, 0x80, 0x23, 0x78, 0x22, 0x4C, 0x06, 0x46, 0x5E, 0x43, 0x26, 0x80, 0x0C, 0x46, + 0x20, 0x4E, 0x5C, 0x43, 0x34, 0x80, 0x2C, 0x78, 0x1F, 0x4D, 0x60, 0x43, 0x28, 0x80, 0x1F, 0x48, + 0x61, 0x43, 0x01, 0x80, 0x10, 0x46, 0x1E, 0x49, 0x58, 0x43, 0x08, 0x80, 0x10, 0x46, 0x1D, 0x49, + 0x60, 0x43, 0x08, 0x80, 0x1C, 0x49, 0x50, 0x02, 0x08, 0x80, 0x70, 0x46, 0x1B, 0x49, 0x40, 0x02, + 0x08, 0x80, 0xF0, 0xBD, 0x14, 0x04, 0x00, 0x20, 0x35, 0x01, 0x00, 0x20, 0x2C, 0x01, 0x00, 0x20, + 0x2F, 0x01, 0x00, 0x20, 0x2D, 0x01, 0x00, 0x20, 0x2E, 0x01, 0x00, 0x20, 0x30, 0x01, 0x00, 0x20, + 0x31, 0x01, 0x00, 0x20, 0x32, 0x01, 0x00, 0x20, 0x33, 0x01, 0x00, 0x20, 0x34, 0x01, 0x00, 0x20, + 0x5C, 0x01, 0x00, 0x20, 0x1E, 0x02, 0x00, 0x20, 0x5E, 0x01, 0x00, 0x20, 0x20, 0x02, 0x00, 0x20, + 0x60, 0x01, 0x00, 0x20, 0x22, 0x02, 0x00, 0x20, 0x62, 0x01, 0x00, 0x20, 0x24, 0x02, 0x00, 0x20, + 0x64, 0x01, 0x00, 0x20, 0x66, 0x01, 0x00, 0x20, 0x68, 0x01, 0x00, 0x20, 0x6A, 0x01, 0x00, 0x20, + 0x6C, 0x01, 0x00, 0x20, 0x26, 0x02, 0x00, 0x20, 0x6E, 0x01, 0x00, 0x20, 0x70, 0x01, 0x00, 0x20, + 0x10, 0xB5, 0x04, 0x46, 0x01, 0x20, 0x00, 0x05, 0x84, 0x42, 0x13, 0xD1, 0x00, 0xBF, 0x14, 0x48, + 0x80, 0x69, 0xC0, 0x00, 0xC0, 0x0F, 0xFA, 0xD0, 0x12, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x04, + 0x88, 0x43, 0x10, 0x49, 0x88, 0x60, 0x00, 0x20, 0x0F, 0x49, 0x08, 0x60, 0x0D, 0x20, 0x03, 0xF0, + 0x9B, 0xFF, 0x13, 0xE0, 0x00, 0xBF, 0x0D, 0x48, 0x80, 0x69, 0xC0, 0x00, 0xC0, 0x0F, 0xFA, 0xD0, + 0x08, 0x48, 0x80, 0x68, 0x01, 0x21, 0x09, 0x04, 0x88, 0x43, 0x06, 0x49, 0x88, 0x60, 0x00, 0x20, + 0x05, 0x49, 0x09, 0x1F, 0x08, 0x60, 0x0C, 0x20, 0x03, 0xF0, 0x86, 0xFF, 0x10, 0xBD, 0x00, 0x00, + 0x00, 0x00, 0x15, 0x40, 0x00, 0x02, 0x00, 0x50, 0x20, 0x01, 0x00, 0x20, 0x00, 0x00, 0x05, 0x40, + 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x00, 0x2C, 0x05, 0xD0, 0x01, 0x20, 0x00, 0x05, 0x84, 0x42, + 0x01, 0xD0, 0x83, 0x48, 0xF8, 0xBD, 0xA8, 0x79, 0x00, 0x28, 0x0E, 0xD0, 0xA8, 0x79, 0x03, 0x28, + 0x0B, 0xD0, 0xA8, 0x79, 0x01, 0x28, 0x08, 0xD0, 0xA8, 0x79, 0x05, 0x28, 0x05, 0xD0, 0xA8, 0x79, + 0x07, 0x28, 0x02, 0xD0, 0x7A, 0x48, 0x40, 0x1C, 0xEC, 0xE7, 0x28, 0x79, 0x00, 0x28, 0x0B, 0xD0, + 0x28, 0x79, 0x01, 0x28, 0x08, 0xD0, 0x28, 0x79, 0x02, 0x28, 0x05, 0xD0, 0x28, 0x79, 0x03, 0x28, + 0x02, 0xD0, 0x73, 0x48, 0x80, 0x1C, 0xDD, 0xE7, 0x68, 0x79, 0x00, 0x28, 0x08, 0xD0, 0x68, 0x79, + 0x01, 0x28, 0x05, 0xD0, 0x68, 0x79, 0x01, 0x28, 0x02, 0xD0, 0x6D, 0x48, 0xC0, 0x1C, 0xD1, 0xE7, + 0xE8, 0x79, 0x00, 0x28, 0x14, 0xD0, 0xE8, 0x79, 0x01, 0x28, 0x11, 0xD0, 0xE8, 0x79, 0x02, 0x28, + 0x0E, 0xD0, 0xE8, 0x79, 0x03, 0x28, 0x0B, 0xD0, 0xE8, 0x79, 0x04, 0x28, 0x08, 0xD0, 0xE8, 0x79, + 0x05, 0x28, 0x05, 0xD0, 0xE8, 0x79, 0x06, 0x28, 0x02, 0xD0, 0x61, 0x48, 0x00, 0x1D, 0xB9, 0xE7, + 0x00, 0x2C, 0x19, 0xD1, 0x5F, 0x48, 0x80, 0x68, 0x01, 0x21, 0x09, 0x04, 0x88, 0x43, 0x40, 0x18, + 0x5C, 0x49, 0x88, 0x60, 0x05, 0x20, 0x00, 0x07, 0xC0, 0x68, 0xC9, 0x01, 0x88, 0x43, 0x40, 0x18, + 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x08, 0x46, 0xC0, 0x68, 0x01, 0x21, 0x09, 0x04, 0x88, 0x43, + 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x1A, 0xE0, 0x01, 0x20, 0x00, 0x05, 0x84, 0x42, 0x16, 0xD1, + 0x50, 0x48, 0x80, 0x68, 0xE1, 0x10, 0x88, 0x43, 0x40, 0x18, 0x4E, 0x49, 0x88, 0x60, 0x05, 0x20, + 0x00, 0x07, 0xC0, 0x68, 0x09, 0x02, 0x88, 0x43, 0x40, 0x18, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, + 0x08, 0x46, 0xC0, 0x68, 0xE1, 0x10, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, 0xC8, 0x60, 0x46, 0x48, + 0x26, 0x18, 0xB0, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0xB0, 0x60, 0xB0, 0x68, 0x02, 0x21, + 0x88, 0x43, 0x80, 0x1C, 0xB0, 0x60, 0xB1, 0x68, 0xF0, 0x20, 0x81, 0x43, 0xE8, 0x79, 0x00, 0x01, + 0xF0, 0x22, 0x10, 0x40, 0x01, 0x43, 0xB1, 0x60, 0xF0, 0x68, 0x20, 0x21, 0x88, 0x43, 0xA9, 0x79, + 0x04, 0x22, 0x11, 0x40, 0x89, 0x08, 0x49, 0x01, 0x20, 0x22, 0x11, 0x40, 0x08, 0x43, 0xF0, 0x60, + 0xF0, 0x68, 0x10, 0x21, 0x88, 0x43, 0xA9, 0x79, 0x02, 0x22, 0x11, 0x40, 0x49, 0x08, 0x09, 0x01, + 0x10, 0x22, 0x11, 0x40, 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, 0x08, 0x21, 0x88, 0x43, 0xA9, 0x79, + 0xC9, 0x00, 0x08, 0x22, 0x11, 0x40, 0x08, 0x43, 0xF0, 0x60, 0xF0, 0x68, 0x80, 0x08, 0x80, 0x00, + 0x29, 0x79, 0x89, 0x07, 0x89, 0x0F, 0x08, 0x43, 0xF0, 0x60, 0xF1, 0x68, 0x04, 0x20, 0x81, 0x43, + 0x68, 0x79, 0x80, 0x00, 0x04, 0x22, 0x10, 0x40, 0x01, 0x43, 0xF1, 0x60, 0x30, 0x6A, 0xC0, 0x09, + 0xC0, 0x01, 0x29, 0x7A, 0x49, 0x06, 0x49, 0x0E, 0x08, 0x43, 0x30, 0x62, 0x1D, 0x48, 0xC0, 0x68, + 0xC0, 0x07, 0xC0, 0x0F, 0x07, 0xD0, 0x1B, 0x48, 0x40, 0x69, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, + 0x18, 0x49, 0x48, 0x61, 0x22, 0xE0, 0x17, 0x48, 0xC0, 0x68, 0x40, 0x07, 0xC0, 0x0F, 0x0A, 0xD0, + 0x14, 0x48, 0x40, 0x69, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x01, 0x21, 0x09, 0x06, 0x40, 0x18, + 0x10, 0x49, 0x48, 0x61, 0x12, 0xE0, 0x0F, 0x48, 0xC0, 0x68, 0xC0, 0x06, 0xC0, 0x0F, 0x0A, 0xD0, + 0x0C, 0x48, 0x40, 0x69, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x01, 0x21, 0x09, 0x06, 0x40, 0x18, + 0x08, 0x49, 0x48, 0x61, 0x02, 0xE0, 0x06, 0x48, 0x80, 0x1D, 0x03, 0xE7, 0x01, 0xF0, 0xBC, 0xFA, + 0x07, 0x46, 0x32, 0x46, 0x24, 0x32, 0x29, 0x68, 0xFD, 0xF7, 0x90, 0xFC, 0x00, 0x20, 0xF9, 0xE6, + 0x02, 0x98, 0xFF, 0xFF, 0x00, 0x02, 0x00, 0x50, 0x00, 0x00, 0x05, 0x40, 0x1C, 0x49, 0x89, 0x68, + 0xC9, 0x09, 0xC9, 0x01, 0x1A, 0x4A, 0x91, 0x60, 0x11, 0x46, 0x09, 0x68, 0x01, 0x22, 0xD2, 0x03, + 0x91, 0x43, 0x17, 0x4A, 0x11, 0x60, 0x17, 0x49, 0x09, 0x6D, 0x17, 0x4A, 0x89, 0x1A, 0x14, 0x4A, + 0x91, 0x61, 0x00, 0x20, 0x17, 0xE0, 0x01, 0x21, 0x02, 0x01, 0x11, 0x4B, 0xD2, 0x18, 0xD1, 0x62, + 0x81, 0x00, 0x12, 0x4A, 0x51, 0x58, 0x89, 0x05, 0x89, 0x0D, 0x02, 0x01, 0xD2, 0x18, 0x91, 0x62, + 0x0C, 0x21, 0x41, 0x43, 0x0E, 0x4A, 0x89, 0x18, 0x89, 0x68, 0x0B, 0x4A, 0x89, 0x1A, 0x02, 0x01, + 0xD2, 0x18, 0x11, 0x62, 0x40, 0x1C, 0x0C, 0x21, 0x41, 0x43, 0x09, 0x4A, 0x89, 0x18, 0x49, 0x68, + 0x00, 0x29, 0xE0, 0xD1, 0x07, 0x4A, 0x11, 0x70, 0x07, 0x4A, 0x11, 0x70, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x40, 0xBC, 0x19, 0x00, 0x20, 0x00, 0x01, 0x06, 0x40, 0xA4, 0x19, 0x00, 0x20, + 0x28, 0x02, 0x00, 0x20, 0x6C, 0x03, 0x00, 0x20, 0x6D, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x21, + 0x08, 0x46, 0x00, 0xF0, 0x05, 0xFA, 0x04, 0x46, 0x20, 0x01, 0x0C, 0x49, 0x40, 0x18, 0xC0, 0x6A, + 0x03, 0x21, 0x08, 0x43, 0x21, 0x01, 0x09, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x80, 0x21, 0x00, 0x20, + 0x00, 0xF0, 0xF6, 0xF9, 0x04, 0x46, 0x20, 0x01, 0x04, 0x49, 0x40, 0x18, 0xC0, 0x6A, 0x03, 0x21, + 0x08, 0x43, 0x21, 0x01, 0x01, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x10, 0xBD, 0x00, 0x00, 0x06, 0x40, + 0x70, 0xB5, 0x00, 0x24, 0x15, 0xE0, 0x20, 0x01, 0x0B, 0x49, 0x45, 0x18, 0xA8, 0x68, 0x00, 0x28, 0x0E, 0xD0, 0x29, 0x78, 0x09, 0x48, 0x00, 0x78, 0x60, 0x22, 0x10, 0x40, 0x81, 0x42, 0x07, 0xD1, - 0x68, 0x78, 0x06, 0x49, 0x49, 0x78, 0x88, 0x42, 0x02, 0xD1, 0xE8, 0x68, 0x80, 0x47, 0x70, 0xBD, - 0x64, 0x1C, 0x0D, 0x2C, 0xE7, 0xD3, 0xFA, 0xE7, 0x68, 0x02, 0x00, 0x20, 0x74, 0x03, 0x00, 0x20, - 0xF8, 0xB5, 0x00, 0x21, 0x08, 0x46, 0x00, 0xF0, 0x85, 0xF9, 0x07, 0x46, 0x38, 0x01, 0x23, 0x49, - 0x40, 0x18, 0xC0, 0x6A, 0x01, 0x21, 0x08, 0x43, 0x39, 0x01, 0x20, 0x4A, 0x89, 0x18, 0xC8, 0x62, - 0x80, 0x21, 0x00, 0x20, 0x00, 0xF0, 0x76, 0xF9, 0x07, 0x46, 0x38, 0x01, 0x1B, 0x49, 0x40, 0x18, - 0xC0, 0x6A, 0x01, 0x21, 0x08, 0x43, 0x39, 0x01, 0x18, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x18, 0x48, - 0x00, 0x68, 0x07, 0x28, 0x02, 0xDA, 0xFF, 0xF7, 0x5B, 0xFF, 0xF8, 0xBD, 0x15, 0x48, 0x06, 0x6D, - 0x00, 0x24, 0x03, 0xE0, 0x30, 0x5D, 0x14, 0x49, 0x08, 0x55, 0x64, 0x1C, 0x08, 0x2C, 0xF9, 0xD3, - 0x00, 0x24, 0x15, 0xE0, 0x20, 0x01, 0x11, 0x49, 0x45, 0x18, 0x68, 0x68, 0x00, 0x28, 0x0E, 0xD0, - 0x29, 0x78, 0x0D, 0x48, 0x00, 0x78, 0x60, 0x22, 0x10, 0x40, 0x81, 0x42, 0x07, 0xD1, 0x68, 0x78, - 0x09, 0x49, 0x49, 0x78, 0x88, 0x42, 0x02, 0xD1, 0x68, 0x68, 0x80, 0x47, 0xDD, 0xE7, 0x64, 0x1C, - 0x0D, 0x2C, 0xE7, 0xD3, 0xFF, 0xF7, 0x34, 0xFF, 0xD7, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, - 0x70, 0x03, 0x00, 0x20, 0x1C, 0x1A, 0x00, 0x20, 0x74, 0x03, 0x00, 0x20, 0x68, 0x02, 0x00, 0x20, - 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xB5, 0x01, 0x22, 0x02, 0x49, 0x00, 0x20, 0x00, 0xF0, 0x6A, 0xF8, - 0x00, 0xBD, 0x00, 0x00, 0x7D, 0x03, 0x00, 0x20, 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xBF, 0xFE, 0xE7, - 0x00, 0xB5, 0x0A, 0x48, 0x00, 0x68, 0x07, 0x28, 0x0C, 0xD1, 0x09, 0x48, 0x80, 0x78, 0x09, 0x49, - 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, 0x10, 0x46, 0x00, 0xF0, 0x54, 0xF8, 0x0F, 0x20, 0x03, 0x49, - 0x08, 0x60, 0x01, 0xE0, 0xFF, 0xF7, 0x04, 0xFF, 0x00, 0xBD, 0x00, 0x00, 0x70, 0x03, 0x00, 0x20, - 0x74, 0x03, 0x00, 0x20, 0x7C, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x1D, 0x48, 0x00, 0x68, 0x40, 0x68, - 0x00, 0x28, 0x06, 0xD0, 0x1B, 0x4A, 0x90, 0x78, 0x19, 0x4A, 0x12, 0x68, 0x51, 0x68, 0x88, 0x47, - 0x00, 0xE0, 0x01, 0x20, 0x04, 0x46, 0x17, 0x48, 0x80, 0x78, 0x00, 0x28, 0x0C, 0xD1, 0x0F, 0x20, - 0x15, 0x49, 0x08, 0x60, 0x13, 0x48, 0x80, 0x78, 0x14, 0x49, 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, - 0x10, 0x46, 0x00, 0xF0, 0x27, 0xF8, 0x19, 0xE0, 0x00, 0x2C, 0x15, 0xD0, 0x1F, 0x20, 0x0E, 0x49, - 0x08, 0x60, 0x0B, 0x48, 0x00, 0x68, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x08, 0x49, 0x09, 0x68, - 0x08, 0x68, 0x80, 0x47, 0x07, 0x48, 0x80, 0x78, 0x08, 0x49, 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, - 0x10, 0x46, 0x00, 0xF0, 0x0F, 0xF8, 0x01, 0xE0, 0xFF, 0xF7, 0xC2, 0xFE, 0x10, 0xBD, 0x00, 0x00, - 0x80, 0x03, 0x00, 0x20, 0x74, 0x03, 0x00, 0x20, 0x70, 0x03, 0x00, 0x20, 0x7D, 0x03, 0x00, 0x20, - 0x00, 0xBF, 0xFE, 0xE7, 0xF0, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x80, 0x21, 0x20, 0x46, - 0x00, 0xF0, 0xB8, 0xF8, 0x07, 0x46, 0x00, 0x2D, 0x0A, 0xD0, 0x00, 0x2E, 0x08, 0xD0, 0x0C, 0x21, - 0x79, 0x43, 0x20, 0x4A, 0x89, 0x18, 0x32, 0x46, 0x88, 0x68, 0x29, 0x46, 0x07, 0xF0, 0x18, 0xF8, - 0x0C, 0x20, 0x78, 0x43, 0x1B, 0x49, 0x40, 0x18, 0x80, 0x68, 0x1B, 0x49, 0x40, 0x1A, 0x39, 0x01, - 0x1A, 0x4A, 0x89, 0x18, 0x08, 0x62, 0x00, 0x2D, 0x06, 0xD1, 0x00, 0x2E, 0x04, 0xD1, 0x00, 0x20, - 0xA1, 0x00, 0x17, 0x4A, 0x50, 0x50, 0x0A, 0xE0, 0xA0, 0x00, 0x15, 0x49, 0x08, 0x58, 0x00, 0x28, - 0x01, 0xD1, 0x01, 0x20, 0x00, 0xE0, 0x00, 0x20, 0xA1, 0x00, 0x11, 0x4A, 0x50, 0x50, 0xA0, 0x00, - 0x0F, 0x49, 0x08, 0x58, 0x00, 0x28, 0x06, 0xD0, 0x38, 0x01, 0x0C, 0x49, 0x40, 0x18, 0x80, 0x6A, - 0x0C, 0x49, 0x08, 0x40, 0x05, 0xE0, 0x38, 0x01, 0x08, 0x49, 0x40, 0x18, 0x80, 0x6A, 0x80, 0x21, - 0x08, 0x43, 0x39, 0x01, 0x05, 0x4A, 0x89, 0x18, 0x88, 0x62, 0x38, 0x01, 0x11, 0x46, 0x40, 0x18, - 0x46, 0x62, 0xF0, 0xBD, 0x1C, 0x1A, 0x00, 0x20, 0x00, 0x01, 0x06, 0x40, 0x00, 0x00, 0x06, 0x40, - 0x70, 0x1A, 0x00, 0x20, 0x7F, 0x03, 0x00, 0x00, 0xF8, 0xB5, 0x2C, 0x48, 0x00, 0x68, 0x2C, 0x49, - 0x08, 0x40, 0x2A, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0xC0, 0x0F, 0xC0, 0x07, 0x08, 0xD0, - 0x01, 0x20, 0xC0, 0x07, 0x27, 0x49, 0x48, 0x60, 0x01, 0x20, 0x27, 0x49, 0x08, 0x60, 0xFF, 0xF7, - 0xC7, 0xFE, 0x24, 0x48, 0x40, 0x68, 0x21, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0xFF, 0x21, - 0x09, 0x04, 0x08, 0x40, 0x1F, 0x49, 0x48, 0x60, 0x10, 0x27, 0x33, 0xE0, 0x01, 0x20, 0xB8, 0x40, - 0x1A, 0x49, 0x09, 0x68, 0x08, 0x42, 0x2C, 0xD0, 0x3D, 0x46, 0x10, 0x3D, 0x28, 0x01, 0x19, 0x49, - 0x40, 0x18, 0x80, 0x6A, 0x04, 0x07, 0x24, 0x0F, 0x68, 0x00, 0x29, 0x18, 0x09, 0x1D, 0x17, 0x48, - 0x00, 0x68, 0xC8, 0x40, 0x70, 0x21, 0x06, 0x46, 0x0E, 0x40, 0x00, 0x2E, 0x08, 0xD1, 0x00, 0x2C, - 0x02, 0xD1, 0xFF, 0xF7, 0x3F, 0xFE, 0x14, 0xE0, 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, 0x10, 0xE0, - 0x20, 0x2E, 0x06, 0xD1, 0x01, 0x20, 0xA1, 0x00, 0x0B, 0x4A, 0x50, 0x50, 0xFF, 0xF7, 0x70, 0xFE, - 0x07, 0xE0, 0x60, 0x2E, 0x05, 0xD1, 0x00, 0x20, 0xA1, 0x00, 0x07, 0x4A, 0x50, 0x50, 0xFF, 0xF7, - 0x67, 0xFE, 0x7F, 0x1C, 0x16, 0x2F, 0xC9, 0xDB, 0xF8, 0xBD, 0x00, 0x00, 0x6C, 0x03, 0x00, 0x20, - 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x06, 0x40, 0x70, 0x1A, 0x00, 0x20, 0x64, 0x03, 0x00, 0x20, - 0x5C, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x03, 0x46, 0x00, 0x22, 0x0A, 0xE0, 0x0C, 0x20, 0x50, 0x43, - 0x06, 0x4C, 0x24, 0x58, 0x18, 0x46, 0x08, 0x43, 0x84, 0x42, 0x01, 0xD1, 0x10, 0x46, 0x10, 0xBD, - 0x52, 0x1C, 0x06, 0x2A, 0xF2, 0xD3, 0x02, 0x48, 0xF9, 0xE7, 0x00, 0x00, 0x1C, 0x1A, 0x00, 0x20, - 0x02, 0x99, 0xFF, 0xFF, 0x30, 0xB5, 0x04, 0x46, 0x80, 0x21, 0x20, 0x46, 0xFF, 0xF7, 0xE2, 0xFF, - 0x05, 0x46, 0x13, 0x48, 0x85, 0x42, 0x0C, 0xD0, 0xA8, 0x00, 0x12, 0x49, 0x08, 0x58, 0x80, 0x05, - 0x80, 0x0D, 0x29, 0x01, 0x10, 0x4A, 0x89, 0x18, 0x88, 0x62, 0x01, 0x20, 0x29, 0x01, 0x89, 0x18, - 0xC8, 0x62, 0x00, 0x21, 0x20, 0x46, 0xFF, 0xF7, 0xCD, 0xFF, 0x05, 0x46, 0x08, 0x48, 0x85, 0x42, - 0x0C, 0xD0, 0xA8, 0x00, 0x07, 0x49, 0x08, 0x58, 0x80, 0x05, 0x80, 0x0D, 0x29, 0x01, 0x06, 0x4A, - 0x89, 0x18, 0x88, 0x62, 0x01, 0x20, 0x29, 0x01, 0x89, 0x18, 0xC8, 0x62, 0x30, 0xBD, 0x00, 0x00, - 0x02, 0x99, 0xFF, 0xFF, 0x04, 0x1A, 0x00, 0x20, 0x00, 0x00, 0x06, 0x40, 0x10, 0xB5, 0x01, 0x20, - 0x80, 0x03, 0x05, 0x49, 0x08, 0x62, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x03, 0x48, - 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x00, 0x00, 0x40, 0x40, 0x00, 0x50, 0x20, 0x01, 0x00, 0x20, - 0x10, 0xB5, 0x01, 0x20, 0xC0, 0x03, 0x05, 0x49, 0x08, 0x62, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, - 0x02, 0xD0, 0x03, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x00, 0x00, 0x40, 0x40, 0x00, 0x50, - 0x24, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x56, 0x48, 0x01, 0x7E, 0x00, 0x29, 0x7E, 0xD0, 0x07, 0x46, - 0x00, 0x26, 0x80, 0x37, 0x04, 0x46, 0x60, 0x34, 0x9C, 0xE0, 0x38, 0x69, 0xB5, 0x00, 0x42, 0x5D, - 0x22, 0x80, 0x29, 0x18, 0x48, 0x78, 0x60, 0x80, 0x88, 0x78, 0xA0, 0x80, 0xC9, 0x78, 0xE1, 0x80, - 0x13, 0x46, 0x00, 0xF0, 0x9B, 0xFD, 0x00, 0x90, 0x00, 0x23, 0xE3, 0x5E, 0x06, 0x21, 0x18, 0x46, - 0x42, 0x1E, 0x04, 0x20, 0x61, 0x5E, 0x20, 0x5E, 0x5B, 0x1E, 0x49, 0x1C, 0x40, 0x1E, 0x00, 0xF0, - 0x8D, 0xFD, 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, - 0x82, 0x10, 0x8A, 0x42, 0x03, 0xDD, 0x20, 0x88, 0x39, 0x69, 0x40, 0x1E, 0x48, 0x55, 0x02, 0x23, - 0xE3, 0x5E, 0x06, 0x21, 0x04, 0x20, 0x1A, 0x46, 0x61, 0x5E, 0x20, 0x5E, 0x00, 0xF0, 0x76, 0xFD, - 0x00, 0x90, 0x02, 0x23, 0xE3, 0x5E, 0x06, 0x21, 0x18, 0x46, 0x42, 0x1C, 0x04, 0x20, 0x61, 0x5E, - 0x20, 0x5E, 0x5B, 0x1C, 0x49, 0x1C, 0x40, 0x1E, 0x00, 0xF0, 0x68, 0xFD, 0x01, 0x46, 0x00, 0x98, - 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, 0x04, 0xDD, - 0x60, 0x88, 0x39, 0x69, 0x40, 0x1C, 0x69, 0x18, 0x48, 0x70, 0x04, 0x21, 0x61, 0x5E, 0x02, 0x23, - 0x00, 0x22, 0xE3, 0x5E, 0xA2, 0x5E, 0x08, 0x46, 0x00, 0xF0, 0x50, 0xFD, 0x00, 0x90, 0x04, 0x20, - 0x02, 0x23, 0x00, 0x22, 0x20, 0x5E, 0xE3, 0x5E, 0xA2, 0x5E, 0x41, 0x1E, 0x5B, 0x1C, 0x52, 0x1E, - 0x40, 0x1E, 0x00, 0xF0, 0x43, 0xFD, 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, - 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, 0x04, 0xDD, 0xA0, 0x88, 0x39, 0x69, 0x40, 0x1E, - 0x69, 0x18, 0x88, 0x70, 0x02, 0x23, 0xE3, 0x5E, 0x00, 0x22, 0x00, 0xE0, 0x27, 0xE0, 0x06, 0x21, - 0x61, 0x5E, 0xA2, 0x5E, 0x08, 0x46, 0x00, 0xF0, 0x29, 0xFD, 0x00, 0x90, 0x06, 0x20, 0x02, 0x23, - 0x00, 0x22, 0x20, 0x5E, 0xE3, 0x5E, 0xA2, 0x5E, 0x41, 0x1C, 0x5B, 0x1C, 0x52, 0x1E, 0x40, 0x1C, - 0x00, 0xF0, 0x1C, 0xFD, 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, - 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, 0x04, 0xDD, 0xE0, 0x88, 0x39, 0x69, 0x40, 0x1C, 0x69, 0x18, - 0xC8, 0x70, 0x76, 0x1C, 0x02, 0x48, 0x00, 0x7E, 0x86, 0x42, 0x00, 0xDA, 0x5D, 0xE7, 0xF8, 0xBD, - 0x38, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0xB0, 0xFF, 0x4F, 0x78, 0x7D, 0x0F, 0x28, 0x7E, 0xD8, - 0x40, 0x1C, 0x78, 0x75, 0x38, 0x46, 0x80, 0x30, 0x85, 0x69, 0x43, 0x68, 0x68, 0x00, 0x3C, 0x46, - 0x40, 0x34, 0x19, 0x5E, 0x20, 0x46, 0x61, 0x82, 0x20, 0x38, 0xC2, 0x78, 0x18, 0x20, 0x20, 0x5E, - 0x01, 0x2A, 0x05, 0xD1, 0xCA, 0x17, 0x92, 0x0F, 0x86, 0x10, 0x51, 0x18, 0x89, 0x10, 0x09, 0xE0, - 0x42, 0x00, 0x82, 0x18, 0xD6, 0x17, 0xB6, 0x0F, 0xB2, 0x18, 0x92, 0x10, 0x16, 0xB2, 0xCA, 0x0F, - 0x51, 0x18, 0x49, 0x10, 0x09, 0xB2, 0x01, 0x91, 0xB1, 0x10, 0xEB, 0x49, 0x3A, 0x7D, 0x09, 0x7C, - 0xE9, 0x4A, 0x69, 0x18, 0x80, 0x32, 0x89, 0x1C, 0x91, 0x61, 0xD2, 0x68, 0xE6, 0x4D, 0x94, 0x46, - 0x52, 0x5C, 0x01, 0x27, 0x60, 0x35, 0x01, 0x2A, 0x20, 0xD0, 0x4A, 0x00, 0x9A, 0x5E, 0x62, 0x82, - 0xB2, 0x42, 0x19, 0xDD, 0x82, 0x42, 0x00, 0xDD, 0x22, 0x83, 0xA0, 0x8B, 0x62, 0x46, 0x40, 0x1C, - 0xA0, 0x83, 0x57, 0x54, 0xDC, 0x49, 0xDC, 0x48, 0x09, 0x7C, 0x80, 0x30, 0x89, 0x1C, 0x80, 0x69, - 0xFC, 0xF7, 0x96, 0xFB, 0x00, 0xB2, 0xA0, 0x82, 0x06, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, - 0xE8, 0x80, 0xFF, 0xF7, 0xA7, 0xFF, 0x01, 0xE0, 0x60, 0x46, 0x47, 0x54, 0xD2, 0x49, 0xD2, 0x4A, - 0x80, 0x31, 0x12, 0x7C, 0x88, 0x69, 0x80, 0x1A, 0x40, 0x1E, 0x88, 0x61, 0xCB, 0x68, 0x19, 0x5C, - 0x01, 0x29, 0x25, 0xD0, 0xCC, 0x4A, 0x41, 0x00, 0x80, 0x32, 0x52, 0x68, 0x51, 0x5E, 0x61, 0x82, - 0xB1, 0x42, 0x1C, 0xDD, 0x18, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0x21, 0x83, 0xA1, 0x8B, - 0xC5, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x1F, 0x54, 0xC3, 0x48, 0x80, 0x32, 0x01, 0x7C, 0x90, 0x69, - 0x89, 0x1C, 0xFC, 0xF7, 0x65, 0xFB, 0x08, 0xB2, 0xA0, 0x82, 0x02, 0x21, 0x00, 0xE0, 0xA8, 0xE1, - 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, 0x68, 0x80, 0xFF, 0xF7, 0x74, 0xFF, 0x00, 0xE0, 0x1F, 0x54, - 0xB9, 0x49, 0xB9, 0x4A, 0x80, 0x31, 0x12, 0x7C, 0x88, 0x69, 0x80, 0x1A, 0xC0, 0x1E, 0x88, 0x61, - 0xCB, 0x68, 0x19, 0x5C, 0x01, 0x29, 0x23, 0xD0, 0xB3, 0x4A, 0x41, 0x00, 0x80, 0x32, 0x52, 0x68, - 0x51, 0x5E, 0x61, 0x82, 0xB1, 0x42, 0x1A, 0xDD, 0x18, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, - 0x21, 0x83, 0xA1, 0x8B, 0xAC, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x1F, 0x54, 0xAA, 0x48, 0x80, 0x32, - 0x01, 0x7C, 0x90, 0x69, 0x89, 0x1C, 0xFC, 0xF7, 0x33, 0xFB, 0x00, 0xB2, 0xA0, 0x82, 0x04, 0x21, - 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDA, 0xA8, 0x80, 0xFF, 0xF7, 0x44, 0xFF, 0x00, 0xE0, 0x1F, 0x54, - 0xA1, 0x49, 0xA1, 0x4A, 0x80, 0x31, 0x12, 0x7C, 0x88, 0x69, 0x80, 0x18, 0x40, 0x1C, 0x88, 0x61, - 0xCB, 0x68, 0x19, 0x5C, 0x01, 0x29, 0x23, 0xD0, 0x9B, 0x4A, 0x41, 0x00, 0x80, 0x32, 0x52, 0x68, - 0x51, 0x5E, 0x61, 0x82, 0xB1, 0x42, 0x1A, 0xDD, 0x18, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, - 0x21, 0x83, 0xA1, 0x8B, 0x94, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x1F, 0x54, 0x92, 0x48, 0x80, 0x32, - 0x01, 0x7C, 0x90, 0x69, 0x89, 0x1C, 0xFC, 0xF7, 0x03, 0xFB, 0x08, 0xB2, 0xA0, 0x82, 0x00, 0x21, - 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDA, 0x28, 0x80, 0xFF, 0xF7, 0x14, 0xFF, 0x00, 0xE0, 0x1F, 0x54, - 0xF0, 0x10, 0x89, 0x4A, 0x30, 0x1A, 0x88, 0x49, 0x06, 0xB2, 0x80, 0x32, 0x09, 0x7C, 0x90, 0x69, - 0x06, 0x91, 0x40, 0x1A, 0x80, 0x1E, 0x90, 0x61, 0xD1, 0x68, 0x0A, 0x5C, 0x05, 0x91, 0x01, 0x2A, - 0x40, 0xD0, 0x81, 0x49, 0x42, 0x00, 0x80, 0x31, 0x49, 0x68, 0x8C, 0x46, 0x89, 0x5E, 0x61, 0x82, - 0xB1, 0x42, 0x37, 0xDD, 0x63, 0x46, 0xD3, 0x18, 0x02, 0x22, 0x9A, 0x5E, 0x52, 0x10, 0xA2, 0x82, - 0x06, 0x9B, 0x96, 0x46, 0xC3, 0x18, 0x5B, 0x00, 0x62, 0x46, 0x9A, 0x18, 0x04, 0x23, 0xD3, 0x5E, - 0x72, 0x46, 0x5B, 0x10, 0xE3, 0x82, 0xD2, 0x18, 0xA2, 0x82, 0x01, 0x9B, 0x9A, 0x42, 0x21, 0xDD, - 0x18, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0x21, 0x83, 0xA1, 0x8B, 0x6E, 0x4A, 0x49, 0x1C, - 0xA1, 0x83, 0x05, 0x99, 0x80, 0x32, 0x0F, 0x54, 0x6B, 0x48, 0x01, 0x7C, 0x90, 0x69, 0x89, 0x1C, - 0xFC, 0xF7, 0xB6, 0xFA, 0x09, 0xB2, 0xA1, 0x82, 0x00, 0x22, 0xAA, 0x5E, 0x91, 0x42, 0x00, 0xDA, - 0x29, 0x80, 0x00, 0xB2, 0xA0, 0x82, 0x04, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDA, 0xA8, 0x80, - 0xFF, 0xF7, 0xC0, 0xFE, 0x60, 0x49, 0x80, 0x31, 0x88, 0x69, 0x80, 0x1C, 0x88, 0x61, 0xC9, 0x68, - 0x0A, 0x5C, 0x04, 0x91, 0x01, 0x2A, 0x3F, 0xD0, 0x5B, 0x49, 0x42, 0x00, 0x80, 0x31, 0x49, 0x68, - 0x8B, 0x5E, 0x63, 0x82, 0x9C, 0x46, 0xB3, 0x42, 0x36, 0xDD, 0x53, 0x18, 0x20, 0x3B, 0x1E, 0x22, - 0x9A, 0x5E, 0x55, 0x4B, 0x52, 0x10, 0xA2, 0x82, 0x1B, 0x7C, 0xC3, 0x18, 0x5B, 0x00, 0x5B, 0x18, - 0x04, 0x21, 0x59, 0x5E, 0x49, 0x10, 0xE1, 0x82, 0x51, 0x18, 0xA1, 0x82, 0x01, 0x9A, 0x91, 0x42, - 0x22, 0xDD, 0x18, 0x22, 0xA2, 0x5E, 0x94, 0x45, 0x01, 0xDD, 0x61, 0x46, 0x21, 0x83, 0xA1, 0x8B, - 0x49, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x04, 0x99, 0x80, 0x32, 0x0F, 0x54, 0x46, 0x48, 0x01, 0x7C, - 0x90, 0x69, 0x89, 0x1C, 0xFC, 0xF7, 0x6C, 0xFA, 0x09, 0xB2, 0xA1, 0x82, 0x02, 0x22, 0xAA, 0x5E, - 0x91, 0x42, 0x00, 0xDD, 0x69, 0x80, 0x00, 0xB2, 0xA0, 0x82, 0x04, 0x21, 0x69, 0x5E, 0x88, 0x42, - 0x00, 0xDA, 0xA8, 0x80, 0xFF, 0xF7, 0x76, 0xFE, 0x3B, 0x48, 0x3B, 0x49, 0x00, 0x7C, 0x80, 0x31, - 0x03, 0x90, 0x8A, 0x69, 0x40, 0x00, 0x80, 0x18, 0x00, 0x1D, 0x88, 0x61, 0xC9, 0x68, 0x0A, 0x5C, - 0x02, 0x91, 0x01, 0x2A, 0x3F, 0xD0, 0x34, 0x49, 0x42, 0x00, 0x80, 0x31, 0x49, 0x68, 0x8B, 0x5E, - 0x63, 0x82, 0x9C, 0x46, 0xB3, 0x42, 0x36, 0xDD, 0x53, 0x18, 0x20, 0x3B, 0x1E, 0x22, 0x9A, 0x5E, - 0x52, 0x10, 0xA2, 0x82, 0x03, 0x9B, 0xC3, 0x1A, 0x5B, 0x00, 0x5B, 0x18, 0x20, 0x3B, 0x1C, 0x21, - 0x59, 0x5E, 0x49, 0x10, 0xE1, 0x82, 0x51, 0x18, 0xA1, 0x82, 0x01, 0x9A, 0x91, 0x42, 0x22, 0xDD, - 0x18, 0x22, 0xA2, 0x5E, 0x94, 0x45, 0x01, 0xDD, 0x61, 0x46, 0x21, 0x83, 0xA1, 0x8B, 0x22, 0x4A, - 0x49, 0x1C, 0xA1, 0x83, 0x02, 0x99, 0x80, 0x32, 0x0F, 0x54, 0x1F, 0x48, 0x01, 0x7C, 0x90, 0x69, - 0x89, 0x1C, 0xFC, 0xF7, 0x1D, 0xFA, 0x09, 0xB2, 0xA1, 0x82, 0x02, 0x22, 0xAA, 0x5E, 0x91, 0x42, - 0x00, 0xDD, 0x69, 0x80, 0x00, 0xB2, 0xA0, 0x82, 0x06, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, - 0xE8, 0x80, 0xFF, 0xF7, 0x27, 0xFE, 0x14, 0x49, 0x80, 0x31, 0x88, 0x69, 0x80, 0x1E, 0x88, 0x61, - 0xC9, 0x68, 0x0A, 0x5C, 0x8C, 0x46, 0x01, 0x2A, 0x40, 0xD0, 0x0F, 0x49, 0x43, 0x00, 0x80, 0x31, - 0x49, 0x68, 0xCA, 0x5E, 0x62, 0x82, 0xB2, 0x42, 0x38, 0xDD, 0x5E, 0x18, 0x02, 0x23, 0xF3, 0x5E, - 0x5E, 0x10, 0x09, 0x4B, 0xA6, 0x82, 0x1B, 0x7C, 0xC3, 0x1A, 0x5B, 0x00, 0x59, 0x18, 0x20, 0x39, - 0x1C, 0x23, 0xCB, 0x5E, 0x59, 0x10, 0xE1, 0x82, 0x71, 0x18, 0xA1, 0x82, 0x01, 0x9B, 0x99, 0x42, - 0x24, 0xDD, 0x18, 0x21, 0x61, 0x5E, 0x01, 0xE0, 0x38, 0x01, 0x00, 0x20, 0x8A, 0x42, 0x00, 0xDD, - 0x22, 0x83, 0xA1, 0x8B, 0x14, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x61, 0x46, 0x0F, 0x54, 0x10, 0x46, - 0x80, 0x38, 0x01, 0x7C, 0x90, 0x69, 0x89, 0x1C, 0xFC, 0xF7, 0xD2, 0xF9, 0x09, 0xB2, 0xA1, 0x82, - 0x00, 0x22, 0xAA, 0x5E, 0x91, 0x42, 0x00, 0xDA, 0x29, 0x80, 0x00, 0xB2, 0xA0, 0x82, 0x06, 0x21, - 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, 0xE8, 0x80, 0xFF, 0xF7, 0xDC, 0xFD, 0x06, 0x4A, 0x10, 0x46, - 0x80, 0x38, 0x03, 0x7C, 0x91, 0x69, 0xC9, 0x1A, 0x49, 0x1E, 0x91, 0x61, 0x41, 0x7D, 0x49, 0x1E, - 0x41, 0x75, 0x07, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x20, 0xF3, 0xB5, 0x85, 0xB0, - 0x04, 0x46, 0x03, 0xAA, 0x04, 0xA9, 0x00, 0xF0, 0x8F, 0xFA, 0x5A, 0x49, 0x01, 0xAA, 0x08, 0x83, - 0x02, 0xA9, 0x06, 0x98, 0x00, 0xF0, 0x88, 0xFA, 0x56, 0x4A, 0x06, 0x9B, 0x40, 0x32, 0x10, 0x69, - 0xA5, 0x00, 0x9E, 0x00, 0x41, 0x5D, 0x83, 0x5D, 0x99, 0x42, 0x00, 0xD3, 0x19, 0x46, 0x51, 0x4C, - 0x8C, 0x46, 0x20, 0x34, 0x21, 0x80, 0x29, 0x18, 0x37, 0x18, 0x4B, 0x78, 0x78, 0x78, 0x83, 0x42, - 0x00, 0xD8, 0x03, 0x46, 0x63, 0x80, 0x88, 0x78, 0xBA, 0x78, 0x90, 0x42, 0x00, 0xD3, 0x10, 0x46, - 0xA0, 0x80, 0xC9, 0x78, 0xFA, 0x78, 0x91, 0x42, 0x00, 0xD8, 0x11, 0x46, 0xE1, 0x80, 0x62, 0x46, - 0x5B, 0x1C, 0x52, 0x1E, 0x49, 0x1C, 0x40, 0x1E, 0x04, 0xF0, 0xFC, 0xFB, 0x02, 0x23, 0x00, 0x22, - 0x06, 0x21, 0x04, 0x20, 0xE3, 0x5E, 0xA2, 0x5E, 0x61, 0x5E, 0x20, 0x5E, 0xFD, 0xF7, 0x2E, 0xFA, - 0x3C, 0x4A, 0x03, 0x98, 0x40, 0x3A, 0x11, 0x7C, 0x03, 0x46, 0x89, 0x1C, 0x4B, 0x43, 0x04, 0x99, - 0x17, 0x46, 0x5B, 0x18, 0x80, 0x37, 0xBB, 0x61, 0x21, 0x80, 0x61, 0x80, 0xA0, 0x80, 0xE0, 0x80, - 0x10, 0x46, 0x01, 0x21, 0x20, 0x30, 0xC1, 0x70, 0x00, 0x20, 0x50, 0x75, 0xFF, 0xF7, 0x72, 0xFD, - 0x00, 0x21, 0x61, 0x5E, 0x02, 0x98, 0x88, 0x42, 0x5A, 0xDB, 0x02, 0x21, 0x61, 0x5E, 0x88, 0x42, - 0x56, 0xDC, 0x04, 0x21, 0x61, 0x5E, 0x01, 0x98, 0x88, 0x42, 0x51, 0xDB, 0x06, 0x21, 0x61, 0x5E, - 0x88, 0x42, 0x4D, 0xDC, 0x38, 0x69, 0x82, 0x5D, 0x41, 0x5D, 0x91, 0x42, 0x00, 0xD3, 0x11, 0x46, - 0x41, 0x55, 0x38, 0x69, 0x31, 0x18, 0x2A, 0x18, 0x49, 0x78, 0x50, 0x78, 0x88, 0x42, 0x00, 0xD8, - 0x08, 0x46, 0x50, 0x70, 0x38, 0x69, 0x31, 0x18, 0x8A, 0x78, 0x29, 0x18, 0x88, 0x78, 0x90, 0x42, - 0x00, 0xD3, 0x10, 0x46, 0x88, 0x70, 0x38, 0x69, 0x31, 0x18, 0x2A, 0x18, 0xC9, 0x78, 0xD0, 0x78, - 0x88, 0x42, 0x00, 0xD8, 0x08, 0x46, 0xD0, 0x70, 0x16, 0x4A, 0x06, 0x98, 0x40, 0x3A, 0x04, 0x90, - 0x1F, 0xE0, 0x79, 0x69, 0x40, 0x00, 0x43, 0x18, 0x5B, 0x88, 0x0B, 0x52, 0x04, 0x98, 0x39, 0x69, - 0x80, 0x00, 0x43, 0x18, 0x1B, 0x79, 0x0B, 0x54, 0x04, 0x98, 0x39, 0x69, 0x80, 0x00, 0x40, 0x18, - 0x41, 0x79, 0x41, 0x70, 0x04, 0x98, 0x39, 0x69, 0x80, 0x00, 0x40, 0x18, 0x81, 0x79, 0x81, 0x70, - 0x04, 0x98, 0x39, 0x69, 0x80, 0x00, 0x40, 0x18, 0xC1, 0x79, 0xC1, 0x70, 0x04, 0x98, 0x40, 0x1C, - 0x04, 0x90, 0x11, 0x7E, 0x49, 0x1E, 0x88, 0x42, 0xDB, 0xDB, 0x10, 0x7E, 0x40, 0x1E, 0x10, 0x76, - 0x07, 0xB0, 0xF0, 0xBD, 0x78, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x1A, 0x4B, 0x02, 0x46, 0x1B, 0x7B, - 0x08, 0x46, 0x19, 0x07, 0x09, 0x0F, 0x03, 0x29, 0x0F, 0xD1, 0x00, 0x2A, 0x0E, 0xD0, 0x16, 0x4C, - 0x01, 0x2A, 0x0E, 0xD0, 0x02, 0x2A, 0x08, 0xD1, 0x00, 0x20, 0x05, 0xF0, 0xDD, 0xFA, 0x00, 0x20, - 0x10, 0x49, 0x60, 0x70, 0x20, 0x72, 0x60, 0x39, 0x48, 0x74, 0x10, 0xBD, 0x05, 0xF0, 0xFE, 0xFB, - 0x10, 0xBD, 0x61, 0x79, 0x00, 0x29, 0x11, 0xD0, 0x02, 0xF0, 0xB4, 0xF8, 0xE0, 0x79, 0x10, 0x28, - 0x06, 0xD2, 0x01, 0x21, 0x61, 0x72, 0x40, 0x1C, 0xE0, 0x71, 0x00, 0xF0, 0x0F, 0xFA, 0x05, 0xE0, - 0xFD, 0xF7, 0x0E, 0xFA, 0x01, 0xF0, 0x92, 0xFD, 0x01, 0xF0, 0x7C, 0xFD, 0x02, 0xF0, 0x0C, 0xF8, - 0x10, 0xBD, 0x00, 0x00, 0x74, 0x04, 0x00, 0x20, 0x90, 0x03, 0x00, 0x20, 0x70, 0xB5, 0x0C, 0x48, - 0x05, 0x6A, 0x0B, 0x48, 0x40, 0x30, 0x04, 0x6A, 0x03, 0x21, 0x89, 0x03, 0x20, 0x46, 0x88, 0x43, - 0x04, 0x46, 0x07, 0x48, 0x05, 0x62, 0x06, 0x48, 0x40, 0x30, 0x04, 0x62, 0x05, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x04, 0xD0, 0x21, 0x46, 0x28, 0x46, 0x02, 0x4A, 0x12, 0x68, 0x90, 0x47, 0x70, 0xBD, - 0x00, 0x40, 0x00, 0x50, 0x18, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x0A, 0x48, 0x04, 0x6A, 0x09, 0x48, - 0x40, 0x30, 0x05, 0x6A, 0x07, 0x48, 0x04, 0x62, 0x06, 0x48, 0x40, 0x30, 0x05, 0x62, 0x06, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x04, 0xD0, 0x29, 0x46, 0x20, 0x46, 0x03, 0x4A, 0x12, 0x68, 0x90, 0x47, - 0x70, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0x1C, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x13, 0x46, - 0x13, 0x4A, 0x12, 0x78, 0x03, 0x2A, 0x02, 0xD0, 0x02, 0x22, 0x11, 0x4C, 0x22, 0x70, 0x00, 0x22, - 0x10, 0x4C, 0x22, 0x70, 0x10, 0x4C, 0x22, 0x70, 0x10, 0x4A, 0x12, 0x6A, 0x01, 0x24, 0xA4, 0x04, - 0xA2, 0x43, 0x0E, 0x4C, 0x22, 0x62, 0x22, 0x46, 0x12, 0x6A, 0xE4, 0x01, 0xA2, 0x43, 0x0B, 0x4C, - 0x22, 0x62, 0x22, 0x46, 0x12, 0x68, 0x80, 0x24, 0xA2, 0x43, 0x08, 0x4C, 0x22, 0x60, 0x22, 0x46, - 0x12, 0x68, 0xFF, 0x24, 0x01, 0x34, 0xA2, 0x43, 0x04, 0x4C, 0x22, 0x60, 0x10, 0xBD, 0x00, 0x00, - 0xCC, 0x00, 0x00, 0x20, 0x8E, 0x00, 0x00, 0x20, 0x8F, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x50, - 0x30, 0xB5, 0x85, 0xB0, 0x0F, 0x48, 0x04, 0x68, 0x23, 0x20, 0x40, 0x01, 0x25, 0x18, 0x03, 0x22, - 0x0D, 0x48, 0x03, 0x95, 0x02, 0x94, 0x04, 0x92, 0x02, 0x88, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, - 0x0A, 0x46, 0x0A, 0x49, 0xA0, 0x20, 0x00, 0x23, 0x00, 0xF0, 0x06, 0xFE, 0x06, 0x48, 0x01, 0x88, - 0x20, 0x46, 0x02, 0xF0, 0x37, 0xF8, 0x04, 0x48, 0x01, 0x88, 0x28, 0x46, 0x02, 0xF0, 0x32, 0xF8, - 0x05, 0xB0, 0x30, 0xBD, 0xC0, 0x01, 0x00, 0x20, 0x16, 0x01, 0x00, 0x20, 0x30, 0x46, 0x00, 0x00, - 0x05, 0x48, 0x80, 0x69, 0x40, 0x04, 0xC0, 0x0F, 0x03, 0xD1, 0x03, 0x48, 0x00, 0x68, 0xC0, 0xB2, - 0x70, 0x47, 0xFF, 0x20, 0xFC, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x15, 0x40, 0xFE, 0xB5, 0x30, 0x4A, - 0x00, 0x20, 0x04, 0x25, 0x55, 0x5F, 0x14, 0x5E, 0x94, 0x46, 0x60, 0x3A, 0x01, 0x95, 0x16, 0x7C, - 0x62, 0x46, 0x02, 0x23, 0xD3, 0x5E, 0x2A, 0x4A, 0xB6, 0x46, 0xB6, 0x1C, 0x20, 0x32, 0x00, 0x96, - 0x52, 0x68, 0x01, 0x46, 0x01, 0x2D, 0x0B, 0xDB, 0x6F, 0x1E, 0x77, 0x43, 0x25, 0x46, 0x05, 0xE0, - 0x7E, 0x19, 0x76, 0x00, 0x96, 0x5F, 0x49, 0x1C, 0x30, 0x18, 0x6D, 0x1C, 0x9D, 0x42, 0xF7, 0xDD, - 0x65, 0x46, 0x06, 0x26, 0xAE, 0x5F, 0x1E, 0x4D, 0xB4, 0x46, 0x60, 0x3D, 0x6D, 0x7C, 0xAE, 0x42, - 0x0E, 0xDC, 0x65, 0x46, 0x00, 0x9E, 0x6D, 0x1C, 0x75, 0x43, 0x2F, 0x46, 0x25, 0x46, 0x05, 0xE0, - 0x7E, 0x19, 0x76, 0x00, 0x96, 0x5F, 0x49, 0x1C, 0x80, 0x19, 0x6D, 0x1C, 0x9D, 0x42, 0xF7, 0xDD, - 0x13, 0x4F, 0x64, 0x26, 0x60, 0x3F, 0x3D, 0x7C, 0xBE, 0x5F, 0xAD, 0x1C, 0x6E, 0x43, 0x01, 0x2C, - 0x0C, 0xDB, 0x64, 0x1E, 0x35, 0x19, 0x01, 0x9C, 0x06, 0xE0, 0x6F, 0x00, 0xD7, 0x5F, 0x75, 0x44, - 0xC0, 0x19, 0x49, 0x1C, 0xAD, 0x1C, 0x64, 0x1C, 0x64, 0x45, 0xF6, 0xDD, 0x73, 0x45, 0x0C, 0xDC, - 0x5B, 0x1C, 0xF4, 0x18, 0x01, 0x9B, 0x06, 0xE0, 0x65, 0x00, 0x55, 0x5F, 0x74, 0x44, 0x40, 0x19, - 0x49, 0x1C, 0xA4, 0x1C, 0x5B, 0x1C, 0x63, 0x45, 0xF6, 0xDD, 0xFB, 0xF7, 0xB9, 0xFF, 0xFE, 0xBD, - 0x98, 0x01, 0x00, 0x20, 0xC1, 0x07, 0xC2, 0x0F, 0x10, 0x18, 0x42, 0x10, 0x07, 0x48, 0x10, 0x18, - 0x00, 0x78, 0x00, 0x29, 0x02, 0xD0, 0x00, 0x07, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x09, 0x08, 0x28, - 0x02, 0xDD, 0x00, 0x20, 0xC0, 0x43, 0x70, 0x47, 0x40, 0x1E, 0x70, 0x47, 0x85, 0x04, 0x00, 0x20, - 0xF0, 0xB5, 0x00, 0x22, 0x13, 0x46, 0x3E, 0x4F, 0x14, 0xE0, 0x21, 0x7C, 0x58, 0x1C, 0x89, 0x1C, - 0x48, 0x43, 0x00, 0x21, 0x07, 0xE0, 0xBD, 0x68, 0x54, 0x00, 0x2C, 0x5B, 0x46, 0x00, 0x7D, 0x68, - 0x49, 0x1C, 0x52, 0x1C, 0xAC, 0x53, 0x36, 0x4C, 0x40, 0x1C, 0x80, 0x3C, 0x24, 0x7C, 0xA1, 0x42, - 0xF1, 0xDB, 0x5B, 0x1C, 0x32, 0x4C, 0x80, 0x3C, 0x60, 0x7C, 0x83, 0x42, 0xE5, 0xDB, 0x21, 0x46, - 0x4D, 0x7C, 0x08, 0x7C, 0x6D, 0x1C, 0x82, 0x1C, 0x55, 0x43, 0x80, 0x1C, 0x00, 0x23, 0x02, 0x26, - 0x0C, 0xE0, 0x2B, 0x4C, 0x7A, 0x68, 0x41, 0x00, 0x80, 0x3C, 0x24, 0x7D, 0x51, 0x5E, 0xA1, 0x42, - 0xF9, 0x68, 0x01, 0xDD, 0x0B, 0x54, 0x00, 0xE0, 0x0E, 0x54, 0x40, 0x1C, 0xA8, 0x42, 0xF0, 0xDB, - 0x24, 0x48, 0x01, 0x7E, 0x00, 0x29, 0x42, 0xD0, 0xC1, 0x7D, 0x17, 0xE0, 0x20, 0x4A, 0x61, 0x46, - 0x80, 0x3A, 0x14, 0x7C, 0x82, 0x7D, 0xA4, 0x1C, 0x61, 0x43, 0x89, 0x18, 0x07, 0xE0, 0x7D, 0x68, - 0x4C, 0x00, 0x2B, 0x53, 0xFC, 0x68, 0x52, 0x1C, 0x4D, 0x1C, 0x66, 0x54, 0x29, 0x46, 0x84, 0x7D, - 0x05, 0x7E, 0x64, 0x19, 0x94, 0x42, 0xF2, 0xDC, 0x61, 0x46, 0x49, 0x1C, 0x8C, 0x46, 0xC1, 0x7D, - 0x42, 0x7E, 0x8A, 0x18, 0x62, 0x45, 0xE1, 0xDC, 0x01, 0x7F, 0x00, 0x29, 0x1F, 0xD0, 0xC1, 0x7E, - 0x17, 0xE0, 0x0F, 0x4A, 0x61, 0x46, 0x80, 0x3A, 0x14, 0x7C, 0x82, 0x7E, 0xA4, 0x1C, 0x61, 0x43, - 0x89, 0x18, 0x07, 0xE0, 0x7D, 0x68, 0x4C, 0x00, 0x2B, 0x53, 0xFC, 0x68, 0x52, 0x1C, 0x4D, 0x1C, - 0x66, 0x54, 0x29, 0x46, 0x84, 0x7E, 0x05, 0x7F, 0x64, 0x19, 0x94, 0x42, 0xF2, 0xDC, 0x61, 0x46, - 0x49, 0x1C, 0x8C, 0x46, 0xC1, 0x7E, 0x42, 0x7F, 0x8A, 0x18, 0x62, 0x45, 0xE1, 0xDC, 0xF0, 0xBD, - 0xB8, 0x01, 0x00, 0x20, 0x74, 0x04, 0x00, 0x20, 0xF7, 0xB5, 0x1B, 0x4E, 0x03, 0x46, 0x34, 0x69, - 0x94, 0x46, 0x9B, 0x00, 0x31, 0x46, 0x81, 0xB0, 0x20, 0x39, 0xE2, 0x5C, 0x0A, 0x80, 0x00, 0x92, - 0x1A, 0x19, 0x57, 0x78, 0x4F, 0x80, 0x93, 0x78, 0x8B, 0x80, 0xD2, 0x78, 0x0C, 0x46, 0x60, 0x3C, - 0xCA, 0x80, 0x21, 0x7C, 0x96, 0x46, 0x0A, 0x46, 0x00, 0x20, 0x89, 0x1C, 0x59, 0x43, 0xB1, 0x61, - 0x15, 0xE0, 0x00, 0x99, 0x0C, 0xE0, 0xB4, 0x69, 0x75, 0x68, 0x64, 0x18, 0x64, 0x00, 0x2C, 0x5F, - 0x84, 0x42, 0x04, 0xDD, 0x20, 0x46, 0x02, 0x9C, 0x21, 0x60, 0x64, 0x46, 0x23, 0x60, 0x49, 0x1C, - 0xB9, 0x42, 0xF0, 0xDD, 0xB1, 0x69, 0x89, 0x18, 0x89, 0x1C, 0x5B, 0x1C, 0xB1, 0x61, 0x73, 0x45, - 0xE7, 0xDD, 0x04, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x20, 0xFF, 0xB5, 0x96, 0x46, - 0x11, 0x49, 0x11, 0x4A, 0x09, 0x7C, 0x80, 0x32, 0x05, 0x46, 0x8C, 0x46, 0x00, 0x20, 0x89, 0x1C, - 0x69, 0x43, 0x14, 0x46, 0x91, 0x61, 0x67, 0x68, 0x10, 0xE0, 0x71, 0x46, 0x96, 0x69, 0x06, 0xE0, - 0x74, 0x18, 0x64, 0x00, 0x3C, 0x5F, 0x84, 0x42, 0x00, 0xDD, 0x20, 0x46, 0x49, 0x1C, 0x99, 0x42, - 0xF6, 0xDD, 0x61, 0x46, 0x71, 0x18, 0x89, 0x1C, 0x6D, 0x1C, 0x91, 0x61, 0x01, 0x99, 0x8D, 0x42, - 0xEB, 0xDD, 0x04, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x0D, 0x4F, - 0x0B, 0x48, 0x38, 0x61, 0x0C, 0x4A, 0x00, 0x20, 0x14, 0x46, 0x10, 0x3C, 0x7E, 0x79, 0x0C, 0xE0, - 0x41, 0x00, 0x53, 0x5A, 0x65, 0x5A, 0x5B, 0x19, 0x1B, 0x04, 0x5B, 0x0C, 0x53, 0x52, 0x51, 0x5A, - 0x3B, 0x69, 0x99, 0x42, 0x00, 0xD2, 0x39, 0x61, 0x40, 0x1C, 0xB0, 0x42, 0xF0, 0xDB, 0xF0, 0xBD, - 0xFF, 0xFF, 0xFF, 0x7F, 0x90, 0x03, 0x00, 0x20, 0xA8, 0x1A, 0x00, 0x20, 0xF8, 0xB5, 0x00, 0x23, - 0x6A, 0x4E, 0xDB, 0x43, 0x00, 0x20, 0x37, 0x46, 0x1C, 0x46, 0x80, 0x3F, 0x04, 0xE0, 0x00, 0x22, - 0xB5, 0x6B, 0x41, 0x1C, 0x2A, 0x54, 0x08, 0x46, 0x64, 0x4A, 0x1B, 0x21, 0x80, 0x3A, 0x51, 0x56, - 0x88, 0x42, 0xF4, 0xDB, 0x00, 0x21, 0x88, 0x00, 0x60, 0x4E, 0x00, 0x90, 0xF7, 0x6B, 0x60, 0x4D, - 0x3D, 0x50, 0x75, 0x6B, 0xFF, 0x22, 0x6A, 0x54, 0x5E, 0x4A, 0x48, 0x00, 0x12, 0x5E, 0x52, 0x1C, - 0x6E, 0xD0, 0x5B, 0x4A, 0x00, 0x26, 0x59, 0x4D, 0x3D, 0xE0, 0x5A, 0x4C, 0x28, 0x3C, 0x25, 0x5E, - 0x6D, 0x1C, 0x04, 0xD0, 0x25, 0x46, 0x14, 0x35, 0x2D, 0x5E, 0x6D, 0x1C, 0x08, 0xD1, 0x55, 0x4D, - 0x54, 0x4E, 0x2D, 0x5A, 0x25, 0x52, 0x53, 0x4D, 0x14, 0x35, 0x2D, 0x5A, 0x14, 0x3E, 0x35, 0x52, - 0x4E, 0x4E, 0x25, 0x5E, 0x64, 0x46, 0xB6, 0x6A, 0x64, 0x00, 0x36, 0x5F, 0x4D, 0x4F, 0xAD, 0x19, - 0xEE, 0x0F, 0x75, 0x19, 0x3F, 0x5E, 0x6D, 0x10, 0x7D, 0x1B, 0xAE, 0x46, 0x47, 0x4E, 0x49, 0x4D, - 0xF6, 0x6A, 0x14, 0x3D, 0x2D, 0x5E, 0x34, 0x5F, 0x46, 0x4F, 0x2C, 0x19, 0xE5, 0x0F, 0x2C, 0x19, - 0x14, 0x37, 0x3F, 0x5E, 0x64, 0x10, 0x3C, 0x1B, 0x75, 0x46, 0x6D, 0x43, 0x64, 0x43, 0x2C, 0x19, - 0x94, 0x42, 0x05, 0xDA, 0x3D, 0x4D, 0x63, 0x46, 0x6E, 0x6B, 0x22, 0x46, 0x73, 0x54, 0xAB, 0x69, - 0x3A, 0x4D, 0xAE, 0x69, 0x76, 0x1C, 0xAE, 0x61, 0x38, 0x4D, 0x38, 0x4F, 0xAD, 0x69, 0x80, 0x3F, - 0x1B, 0x26, 0xBE, 0x57, 0xAC, 0x46, 0xB5, 0x42, 0xB7, 0xDB, 0x80, 0x37, 0xBD, 0x6B, 0xEE, 0x5C, - 0x76, 0x1C, 0xEE, 0x54, 0x00, 0x9D, 0xFE, 0x6B, 0x80, 0x3F, 0x72, 0x51, 0xFD, 0x6F, 0xAA, 0x42, - 0x16, 0xD9, 0x30, 0x4C, 0x2D, 0x4E, 0x25, 0x5E, 0xB6, 0x6A, 0x5C, 0x00, 0x36, 0x5F, 0x2D, 0x4F, - 0xAD, 0x1B, 0x2A, 0x4E, 0x14, 0x37, 0xF6, 0x6A, 0x38, 0x5E, 0x34, 0x5F, 0x6D, 0x43, 0x00, 0x1B, - 0x40, 0x43, 0x2C, 0x18, 0x94, 0x42, 0x03, 0xDA, 0x24, 0x4A, 0x00, 0x98, 0xD2, 0x6B, 0x14, 0x50, - 0x49, 0x1C, 0x0A, 0x29, 0x00, 0xDA, 0x7E, 0xE7, 0x00, 0x25, 0x38, 0xE0, 0x1F, 0x4E, 0xB0, 0x6B, - 0x41, 0x57, 0x01, 0x29, 0x32, 0xDD, 0x00, 0x20, 0xC0, 0x43, 0x02, 0x29, 0x02, 0xD1, 0x28, 0x46, - 0x00, 0xF0, 0x3A, 0xF8, 0x41, 0x1C, 0x29, 0xD1, 0x18, 0x49, 0x00, 0x23, 0x8A, 0x6B, 0x52, 0x57, - 0x21, 0xE0, 0x16, 0x49, 0x4B, 0x6B, 0x89, 0x69, 0x5E, 0x56, 0xAE, 0x42, 0x18, 0xD1, 0x46, 0x1C, - 0x05, 0xD1, 0x12, 0x4B, 0x08, 0x46, 0xDB, 0x6B, 0x89, 0x00, 0x5C, 0x58, 0x0F, 0xE0, 0x0F, 0x4E, - 0x8F, 0x00, 0xF6, 0x6B, 0xF6, 0x59, 0xA6, 0x42, 0x07, 0xDA, 0xFF, 0x24, 0x0B, 0x49, 0x1C, 0x54, - 0x88, 0x69, 0xC9, 0x6B, 0x83, 0x00, 0xCC, 0x58, 0x01, 0xE0, 0xFF, 0x26, 0x5E, 0x54, 0x52, 0x1E, - 0x06, 0x49, 0x8B, 0x69, 0x5B, 0x1C, 0x8B, 0x61, 0x00, 0x2A, 0xDA, 0xDC, 0x6D, 0x1C, 0x03, 0x48, - 0x1B, 0x21, 0x80, 0x38, 0x41, 0x56, 0x8D, 0x42, 0xC0, 0xDB, 0xF8, 0xBD, 0xB8, 0x01, 0x00, 0x20, - 0xFF, 0xFF, 0xFF, 0x7F, 0xFA, 0x05, 0x00, 0x20, 0xF0, 0xB5, 0x00, 0x24, 0xE4, 0x43, 0x89, 0xB0, - 0x80, 0x4A, 0x02, 0x94, 0x01, 0x94, 0x52, 0x6B, 0xA4, 0x46, 0x00, 0x21, 0x08, 0x92, 0x52, 0x56, - 0x82, 0x42, 0x01, 0xD1, 0xA4, 0x46, 0x0C, 0x46, 0x49, 0x1C, 0x0A, 0x29, 0x01, 0xDA, 0x08, 0x9A, - 0xF5, 0xE7, 0x78, 0x48, 0x00, 0x21, 0x83, 0x6B, 0x07, 0x93, 0x83, 0x6A, 0xC0, 0x6A, 0x9E, 0x46, - 0x74, 0x4B, 0x06, 0x90, 0x80, 0x3B, 0x1B, 0x20, 0x18, 0x56, 0x73, 0x4A, 0x05, 0x90, 0x3D, 0xE0, - 0x07, 0x98, 0x40, 0x5C, 0x00, 0x28, 0x37, 0xD1, 0x60, 0x46, 0x70, 0x4E, 0x40, 0x00, 0x33, 0x5E, - 0x5B, 0x1C, 0x04, 0xD0, 0x33, 0x46, 0x14, 0x33, 0x1B, 0x5E, 0x5B, 0x1C, 0x09, 0xD1, 0x6B, 0x4B, - 0x6A, 0x4D, 0x28, 0x33, 0x1B, 0x5A, 0x33, 0x52, 0x68, 0x4B, 0x3C, 0x33, 0x1B, 0x5A, 0x14, 0x35, - 0x2B, 0x52, 0x33, 0x5E, 0x4D, 0x00, 0x2F, 0x46, 0x76, 0x46, 0x75, 0x5F, 0x5E, 0x19, 0x63, 0x4B, - 0xF5, 0x0F, 0x28, 0x33, 0xAD, 0x19, 0x1B, 0x5E, 0x6D, 0x10, 0x5B, 0x1B, 0x00, 0x93, 0x5F, 0x4B, - 0x06, 0x9E, 0x14, 0x33, 0x1B, 0x5E, 0xF5, 0x5F, 0x5B, 0x19, 0x5C, 0x4D, 0x3C, 0x35, 0x28, 0x5E, - 0xDD, 0x0F, 0xEB, 0x18, 0x5B, 0x10, 0xC0, 0x1A, 0x00, 0x9B, 0x40, 0x43, 0x5B, 0x43, 0x18, 0x18, - 0x90, 0x42, 0x01, 0xDA, 0x02, 0x46, 0x02, 0x91, 0x05, 0x98, 0x49, 0x1C, 0x81, 0x42, 0xBF, 0xDB, - 0x51, 0x4E, 0xB2, 0x42, 0x60, 0xD0, 0x4F, 0x48, 0x80, 0x38, 0xC0, 0x6F, 0x04, 0x90, 0x82, 0x42, - 0x15, 0xD9, 0x60, 0x46, 0x41, 0x00, 0x4D, 0x48, 0x75, 0x46, 0x28, 0x30, 0x43, 0x5E, 0x02, 0x98, - 0x40, 0x00, 0x2D, 0x5E, 0x5B, 0x1B, 0x49, 0x4D, 0x5B, 0x43, 0x3C, 0x35, 0x69, 0x5E, 0x06, 0x9D, - 0x28, 0x5E, 0x08, 0x1A, 0x40, 0x43, 0x18, 0x18, 0x90, 0x42, 0x00, 0xDA, 0x02, 0x46, 0x42, 0x4B, - 0x00, 0x21, 0x3B, 0xE0, 0x07, 0x98, 0x40, 0x5C, 0x00, 0x28, 0x36, 0xD1, 0x3F, 0x4F, 0x60, 0x00, - 0x3E, 0x5E, 0x76, 0x1C, 0x04, 0xD0, 0x3E, 0x46, 0x14, 0x36, 0x36, 0x5E, 0x76, 0x1C, 0x08, 0xD1, - 0x3A, 0x4E, 0x28, 0x36, 0x36, 0x5A, 0x3E, 0x52, 0x38, 0x4E, 0x3C, 0x36, 0x35, 0x5A, 0x28, 0x3E, - 0x35, 0x52, 0x3D, 0x5E, 0x4E, 0x00, 0x77, 0x46, 0x03, 0x96, 0xBE, 0x5F, 0xAF, 0x19, 0x33, 0x4D, - 0xFE, 0x0F, 0x28, 0x35, 0xF6, 0x19, 0x2D, 0x5E, 0x76, 0x10, 0xAD, 0x1B, 0x00, 0x95, 0x2F, 0x4D, - 0x06, 0x9F, 0x03, 0x9E, 0x14, 0x35, 0x2D, 0x5E, 0xBE, 0x5F, 0xAD, 0x19, 0x2B, 0x4E, 0x3C, 0x36, - 0x30, 0x5E, 0xEE, 0x0F, 0x75, 0x19, 0x6D, 0x10, 0x40, 0x1B, 0x00, 0x9D, 0x40, 0x43, 0x6D, 0x43, - 0x28, 0x18, 0x98, 0x42, 0x01, 0xDA, 0x03, 0x46, 0x01, 0x91, 0x49, 0x1C, 0x05, 0x98, 0x81, 0x42, - 0xC0, 0xDB, 0x21, 0x48, 0x83, 0x42, 0x03, 0xD1, 0x00, 0x20, 0xC0, 0x43, 0x09, 0xB0, 0xF0, 0xBD, - 0x04, 0x98, 0x83, 0x42, 0x14, 0xD9, 0x1D, 0x48, 0x66, 0x00, 0x28, 0x30, 0x81, 0x5F, 0x01, 0x98, - 0x75, 0x46, 0x40, 0x00, 0x2D, 0x5E, 0x49, 0x1B, 0x18, 0x4D, 0x49, 0x43, 0x3C, 0x35, 0xAD, 0x5F, - 0x06, 0x9E, 0x30, 0x5E, 0x28, 0x1A, 0x40, 0x43, 0x08, 0x18, 0x98, 0x42, 0x00, 0xDA, 0x03, 0x46, - 0x10, 0x49, 0x60, 0x46, 0xCD, 0x6B, 0x80, 0x00, 0x2E, 0x58, 0xA1, 0x00, 0x6D, 0x58, 0xF6, 0x18, - 0xAD, 0x18, 0x01, 0x27, 0xAE, 0x42, 0x0A, 0xDD, 0x08, 0x9D, 0x63, 0x46, 0x02, 0x9C, 0x09, 0x49, - 0xEC, 0x54, 0x8B, 0x6B, 0x02, 0x9C, 0x1F, 0x55, 0xC9, 0x6B, 0x0A, 0x50, 0x08, 0xE0, 0x08, 0x9D, - 0x01, 0x98, 0x04, 0x4A, 0x28, 0x55, 0x90, 0x6B, 0x01, 0x9C, 0x07, 0x55, 0xD0, 0x6B, 0x43, 0x50, - 0x00, 0x20, 0xC3, 0xE7, 0xB8, 0x01, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x7F, 0xD2, 0x05, 0x00, 0x20, - 0x70, 0xB5, 0x00, 0x24, 0x12, 0x48, 0x80, 0x69, 0x00, 0x05, 0x05, 0x0F, 0x10, 0x48, 0x40, 0x69, - 0x80, 0x01, 0x80, 0x0F, 0x07, 0xD1, 0xFE, 0xF7, 0x3F, 0xF9, 0x06, 0x46, 0x69, 0x1C, 0xFB, 0xF7, - 0x95, 0xFC, 0x04, 0x46, 0x12, 0xE0, 0x0A, 0x48, 0x40, 0x69, 0x80, 0x01, 0x80, 0x0F, 0x01, 0x28, - 0x07, 0xD1, 0xFE, 0xF7, 0x35, 0xF9, 0x06, 0x46, 0x69, 0x1C, 0xFB, 0xF7, 0x87, 0xFC, 0x04, 0x46, - 0x04, 0xE0, 0x69, 0x1C, 0x03, 0x48, 0xFB, 0xF7, 0x81, 0xFC, 0x04, 0x46, 0x20, 0x46, 0x70, 0xBD, - 0x00, 0x02, 0x00, 0x50, 0x00, 0x80, 0x51, 0x01, 0x10, 0xB5, 0x86, 0xB0, 0x00, 0x24, 0x0A, 0xE0, - 0xFD, 0xF7, 0xAC, 0xFC, 0x60, 0x1C, 0x80, 0xB2, 0x04, 0x46, 0x3C, 0x49, 0x88, 0x42, 0x02, 0xDD, - 0x01, 0x20, 0x06, 0xB0, 0x10, 0xBD, 0xFF, 0xF7, 0x4B, 0xFC, 0x35, 0x28, 0xF0, 0xD1, 0x00, 0x24, - 0x05, 0xE0, 0x00, 0x20, 0x36, 0x49, 0x09, 0x68, 0x08, 0x55, 0x60, 0x1C, 0x84, 0xB2, 0x10, 0x2C, - 0xF7, 0xDB, 0x03, 0x22, 0x32, 0x48, 0x01, 0x68, 0x32, 0x48, 0x00, 0x68, 0x02, 0xAB, 0x07, 0xC3, - 0x31, 0x48, 0x00, 0x78, 0x42, 0x00, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x2F, 0x49, - 0xA0, 0x20, 0x00, 0x23, 0x00, 0xF0, 0x20, 0xFA, 0x29, 0x48, 0x01, 0x68, 0x01, 0x20, 0xFF, 0xF7, - 0x5B, 0xFB, 0x02, 0xF0, 0x35, 0xFD, 0x00, 0x28, 0x01, 0xD0, 0x02, 0xF0, 0x79, 0xFE, 0x00, 0x20, - 0x27, 0x49, 0x08, 0x70, 0x27, 0x48, 0x80, 0x79, 0x00, 0x06, 0xC0, 0x0F, 0x01, 0x28, 0x02, 0xD1, - 0x25, 0x48, 0x04, 0x78, 0x02, 0xE0, 0x24, 0x48, 0x00, 0x78, 0x44, 0x00, 0x03, 0x22, 0x1C, 0x48, - 0x01, 0x68, 0x1C, 0x48, 0x00, 0x68, 0x02, 0xAB, 0x07, 0xC3, 0x00, 0x21, 0x0A, 0x46, 0x01, 0x94, - 0x00, 0x91, 0x11, 0x21, 0x89, 0x02, 0xA0, 0x20, 0x00, 0x23, 0x00, 0xF0, 0xF5, 0xF9, 0x02, 0x22, - 0x13, 0x48, 0x00, 0x68, 0x01, 0x19, 0x13, 0x48, 0x00, 0x68, 0x00, 0x19, 0x02, 0xAB, 0x07, 0xC3, - 0x16, 0x48, 0x00, 0x1B, 0x82, 0xB2, 0x00, 0x21, 0x11, 0x20, 0x80, 0x02, 0x20, 0x18, 0x01, 0x92, - 0x00, 0x91, 0x81, 0xB2, 0x00, 0x22, 0xA0, 0x20, 0x13, 0x46, 0x00, 0xF0, 0xDD, 0xF9, 0x09, 0x48, - 0x00, 0x68, 0x00, 0x5D, 0xFF, 0x28, 0x04, 0xD0, 0x05, 0x48, 0x00, 0x68, 0x00, 0x5D, 0xFF, 0x28, - 0x01, 0xD1, 0x02, 0x20, 0x8D, 0xE7, 0x00, 0x20, 0x8B, 0xE7, 0x00, 0x00, 0x20, 0x4E, 0x00, 0x00, - 0xB8, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0x95, 0x03, 0x00, 0x20, 0xD0, 0x4C, 0x00, 0x00, - 0xB1, 0x00, 0x00, 0x20, 0x39, 0x04, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, 0x31, 0x02, 0x00, 0x00, - 0x11, 0xB5, 0x83, 0xB0, 0x5A, 0x20, 0x02, 0x90, 0x03, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x12, 0x49, - 0xA0, 0x20, 0x03, 0xAB, 0x00, 0xF0, 0x9E, 0xFC, 0xFD, 0xF7, 0xFC, 0xFB, 0xFC, 0xF7, 0xBE, 0xFC, - 0x02, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x0D, 0x49, 0xA0, 0x20, 0x02, 0xAB, 0x00, 0xF0, 0x92, 0xFC, - 0x00, 0x24, 0x03, 0xE0, 0xFD, 0xF7, 0x02, 0xFC, 0x60, 0x1C, 0xC4, 0xB2, 0x0F, 0x2C, 0xF9, 0xDB, - 0xFF, 0xF7, 0xA6, 0xFB, 0x6B, 0x46, 0x19, 0x7A, 0x88, 0x42, 0x02, 0xD0, 0x00, 0x20, 0x04, 0xB0, - 0x10, 0xBD, 0x01, 0x20, 0xFB, 0xE7, 0x00, 0x00, 0x22, 0x15, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, - 0x10, 0xB5, 0x22, 0x48, 0x00, 0x68, 0x00, 0x28, 0x3B, 0xD0, 0x20, 0x48, 0x00, 0x1F, 0x00, 0x68, - 0x00, 0x28, 0x09, 0xD1, 0x00, 0x22, 0x1D, 0x48, 0x01, 0x68, 0x10, 0x46, 0xFE, 0xF7, 0xEA, 0xFD, - 0x00, 0x20, 0x1A, 0x49, 0x08, 0x60, 0x2F, 0xE0, 0x18, 0x48, 0x00, 0x1F, 0x00, 0x68, 0x08, 0x28, - 0x03, 0xD2, 0x16, 0x48, 0x00, 0x1F, 0x00, 0x68, 0x00, 0xE0, 0x08, 0x20, 0x04, 0x46, 0x22, 0x46, - 0x12, 0x48, 0x01, 0x68, 0x00, 0x20, 0xFE, 0xF7, 0xD5, 0xFD, 0x10, 0x48, 0x01, 0x68, 0x08, 0x19, - 0x0E, 0x49, 0x08, 0x60, 0x08, 0x1F, 0x01, 0x68, 0x08, 0x1B, 0x0C, 0x49, 0x09, 0x1F, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x00, 0x28, 0x0F, 0xD1, 0x08, 0x2C, 0x02, 0xD2, 0x09, 0x1D, 0x08, 0x60, - 0x0A, 0xE0, 0x06, 0x48, 0x08, 0x38, 0x00, 0x78, 0x00, 0x28, 0x05, 0xD1, 0x03, 0x49, 0x08, 0x60, - 0x02, 0xE0, 0x00, 0x20, 0x02, 0x49, 0x48, 0x63, 0x10, 0xBD, 0x00, 0x00, 0x8C, 0x03, 0x00, 0x20, - 0x00, 0x00, 0x06, 0x40, 0x00, 0x20, 0x03, 0x49, 0x08, 0x60, 0x09, 0x1D, 0x08, 0x60, 0x08, 0x39, - 0x08, 0x70, 0x70, 0x47, 0x88, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x39, 0x48, 0xC4, 0x79, 0x24, 0x02, - 0x80, 0x79, 0x00, 0x19, 0x84, 0xB2, 0x00, 0x20, 0x36, 0x49, 0x08, 0x70, 0x34, 0x48, 0xC0, 0x78, - 0x03, 0x28, 0x2C, 0xD0, 0x04, 0xDC, 0x01, 0x28, 0x07, 0xD0, 0x02, 0x28, 0x5B, 0xD1, 0x0E, 0xE0, - 0x21, 0x28, 0x13, 0xD0, 0x22, 0x28, 0x56, 0xD1, 0x18, 0xE0, 0x22, 0x46, 0x12, 0x21, 0x2E, 0x48, - 0x08, 0x23, 0x00, 0xF0, 0x95, 0xF8, 0x00, 0x20, 0x2C, 0x49, 0x48, 0x63, 0x4E, 0xE0, 0x2C, 0x48, - 0x81, 0x78, 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, 0x8B, 0xF8, 0x47, 0xE0, 0x22, 0x46, 0x09, 0x21, - 0x28, 0x48, 0x00, 0x68, 0x08, 0x23, 0x00, 0xF0, 0x83, 0xF8, 0x3F, 0xE0, 0x22, 0x46, 0x26, 0x48, - 0x01, 0x68, 0x26, 0x48, 0x00, 0x68, 0x08, 0x23, 0x00, 0xF0, 0x7A, 0xF8, 0x36, 0xE0, 0x1C, 0x48, - 0x80, 0x78, 0x00, 0x28, 0x06, 0xD1, 0x22, 0x46, 0x04, 0x21, 0x21, 0x48, 0x08, 0x23, 0x00, 0xF0, - 0x6F, 0xF8, 0x27, 0xE0, 0x16, 0x48, 0x80, 0x78, 0x01, 0x28, 0x04, 0xD0, 0x02, 0x28, 0x0C, 0xD0, - 0x03, 0x28, 0x1B, 0xD1, 0x13, 0xE0, 0x1B, 0x4A, 0x52, 0x68, 0x11, 0x78, 0x19, 0x4A, 0x50, 0x68, - 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, 0x5C, 0xF8, 0x13, 0xE0, 0x16, 0x4A, 0x92, 0x68, 0x11, 0x78, - 0x14, 0x4A, 0x90, 0x68, 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, 0x52, 0xF8, 0x09, 0xE0, 0x12, 0x48, - 0x01, 0x78, 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, 0x4B, 0xF8, 0x02, 0xE0, 0xFE, 0xF7, 0xF0, 0xFB, - 0x00, 0xBF, 0x00, 0xBF, 0x02, 0xE0, 0xFE, 0xF7, 0xEB, 0xFB, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, - 0x74, 0x03, 0x00, 0x20, 0x84, 0x03, 0x00, 0x20, 0x54, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, - 0x68, 0xC1, 0x00, 0x00, 0x50, 0x03, 0x00, 0x20, 0x4C, 0x03, 0x00, 0x20, 0x48, 0x03, 0x00, 0x20, - 0x8C, 0xC1, 0x00, 0x00, 0xF8, 0x19, 0x00, 0x20, 0x28, 0xC3, 0x00, 0x00, 0x00, 0xB5, 0x02, 0x22, - 0x03, 0x49, 0x00, 0x20, 0xFE, 0xF7, 0x16, 0xFD, 0x01, 0x20, 0x02, 0x49, 0x08, 0x70, 0x00, 0xBD, - 0x40, 0x03, 0x00, 0x20, 0x42, 0x03, 0x00, 0x20, 0x04, 0x48, 0x80, 0x6A, 0x80, 0x21, 0x08, 0x43, - 0x02, 0x49, 0x88, 0x62, 0x00, 0x20, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, - 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xBF, 0xFE, 0xE7, 0x01, 0x46, 0x04, 0x48, 0x40, 0x79, 0x88, 0x42, - 0x01, 0xD1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0xFC, 0xE7, 0x00, 0x00, 0x68, 0xC1, 0x00, 0x00, - 0xF0, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x1F, 0x46, 0x19, 0x48, 0x06, 0x60, 0xAE, 0x42, - 0x04, 0xD9, 0x05, 0x60, 0x01, 0x20, 0x16, 0x49, 0x09, 0x1F, 0x08, 0x70, 0x14, 0x48, 0x00, 0x1D, - 0x04, 0x60, 0x00, 0x1F, 0x00, 0x68, 0xB8, 0x42, 0x0D, 0xD2, 0x11, 0x48, 0x02, 0x68, 0x00, 0x1D, - 0x01, 0x68, 0x00, 0x20, 0xFE, 0xF7, 0xD6, 0xFC, 0x00, 0x20, 0x0D, 0x49, 0x09, 0x1D, 0x08, 0x60, - 0x09, 0x1F, 0x08, 0x60, 0x12, 0xE0, 0x3A, 0x46, 0x09, 0x48, 0x00, 0x1D, 0x01, 0x68, 0x00, 0x20, - 0xFE, 0xF7, 0xC8, 0xFC, 0x06, 0x48, 0x00, 0x1D, 0x00, 0x68, 0xC0, 0x19, 0x04, 0x49, 0x09, 0x1D, - 0x08, 0x60, 0x08, 0x1F, 0x00, 0x68, 0xC0, 0x1B, 0x09, 0x1F, 0x08, 0x60, 0xF0, 0xBD, 0x00, 0x00, - 0x88, 0x03, 0x00, 0x20, 0x70, 0x47, 0x10, 0xB5, 0x01, 0x20, 0xFE, 0xF7, 0x8B, 0xFD, 0xFF, 0xF7, - 0xF9, 0xFF, 0x10, 0xBD, 0x10, 0xB5, 0x16, 0x48, 0x00, 0x78, 0x01, 0x28, 0x0B, 0xD1, 0x00, 0xBF, - 0x14, 0x48, 0x00, 0x78, 0x01, 0x28, 0xFB, 0xD0, 0x05, 0xF0, 0x2A, 0xFC, 0x04, 0xF0, 0xBE, 0xFE, - 0x03, 0xF0, 0x4C, 0xFD, 0x1B, 0xE0, 0x10, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, 0x00, 0xF0, - 0xA9, 0xFE, 0x14, 0xE0, 0x0D, 0x48, 0x00, 0x78, 0x02, 0x28, 0x10, 0xDB, 0x0B, 0x48, 0x00, 0x78, - 0x40, 0x1E, 0x0A, 0x49, 0x08, 0x70, 0x08, 0x46, 0x00, 0x78, 0x02, 0x28, 0x01, 0xDA, 0x00, 0x20, - 0x08, 0x70, 0x04, 0x48, 0x00, 0x78, 0x00, 0x28, 0x01, 0xD1, 0x03, 0xF0, 0x2F, 0xFD, 0x10, 0xBD, - 0xAF, 0x00, 0x00, 0x20, 0x9A, 0x00, 0x00, 0x20, 0x9B, 0x00, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x20, - 0x00, 0x20, 0x01, 0xE0, 0x41, 0x1C, 0xC8, 0xB2, 0x03, 0x28, 0xFB, 0xDB, 0x70, 0x47, 0x00, 0xBF, - 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x70, 0x47, 0xFF, 0xB5, 0x81, 0xB0, 0x04, 0x46, 0x0D, 0x46, - 0x16, 0x46, 0x0B, 0x9F, 0x00, 0xF0, 0x2E, 0xFA, 0xFE, 0x22, 0x22, 0x40, 0x11, 0x46, 0xFE, 0x22, - 0x22, 0x40, 0x10, 0x46, 0x00, 0xF0, 0x8C, 0xF9, 0x03, 0x28, 0x04, 0xD0, 0x00, 0xF0, 0x80, 0xFA, - 0x00, 0x20, 0x05, 0xB0, 0xF0, 0xBD, 0x28, 0x12, 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0x00, 0xF0, - 0x7F, 0xF9, 0x03, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x73, 0xFA, 0x00, 0x20, 0xF1, 0xE7, 0xE8, 0xB2, - 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0x00, 0xF0, 0x73, 0xF9, 0x03, 0x28, 0x03, 0xD0, 0x00, 0xF0, - 0x67, 0xFA, 0x00, 0x20, 0xE5, 0xE7, 0x13, 0xE0, 0x0A, 0x9A, 0x11, 0x78, 0x04, 0x9A, 0x10, 0x78, - 0x00, 0xF0, 0x66, 0xF9, 0x03, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x5A, 0xFA, 0x00, 0x20, 0xD8, 0xE7, - 0x04, 0x98, 0x40, 0x1C, 0x04, 0x90, 0x0A, 0x98, 0x40, 0x1C, 0x0A, 0x90, 0x70, 0x1E, 0x86, 0xB2, - 0x00, 0x2E, 0xE9, 0xD1, 0x00, 0x2F, 0x79, 0xD0, 0x00, 0xF0, 0xEC, 0xF9, 0x01, 0x22, 0x22, 0x43, - 0x11, 0x46, 0x01, 0x22, 0x22, 0x43, 0x10, 0x46, 0x00, 0xF0, 0x4A, 0xF9, 0x03, 0x28, 0x03, 0xD0, - 0x00, 0xF0, 0x3E, 0xFA, 0x00, 0x20, 0xBC, 0xE7, 0x0E, 0x98, 0x02, 0x28, 0x51, 0xD1, 0x2D, 0xE0, - 0x00, 0x22, 0x0D, 0x99, 0x0C, 0x98, 0x00, 0xF0, 0x67, 0xF8, 0x0C, 0x98, 0x00, 0x78, 0xFF, 0x28, - 0x05, 0xD1, 0x30, 0x48, 0x00, 0x78, 0x01, 0x21, 0x08, 0x43, 0x2E, 0x49, 0x08, 0x70, 0x0D, 0x98, - 0x00, 0x78, 0xFF, 0x28, 0x05, 0xD1, 0x2B, 0x48, 0x00, 0x78, 0x02, 0x21, 0x08, 0x43, 0x29, 0x49, - 0x08, 0x70, 0x0C, 0x98, 0x40, 0x1C, 0x0C, 0x90, 0x0D, 0x98, 0x40, 0x1C, 0x0D, 0x90, 0x78, 0x1E, - 0x87, 0xB2, 0x24, 0x48, 0x00, 0x78, 0x03, 0x28, 0x08, 0xD1, 0x01, 0x22, 0x0D, 0x99, 0x0C, 0x98, - 0x00, 0xF0, 0x42, 0xF8, 0x00, 0xF0, 0x0C, 0xFA, 0x04, 0x20, 0x8A, 0xE7, 0x01, 0x2F, 0xCF, 0xDC, - 0x01, 0x22, 0x0D, 0x99, 0x0C, 0x98, 0x00, 0xF0, 0x37, 0xF8, 0x0C, 0x98, 0x00, 0x78, 0xFF, 0x28, - 0x05, 0xD1, 0x18, 0x48, 0x00, 0x78, 0x01, 0x21, 0x08, 0x43, 0x16, 0x49, 0x08, 0x70, 0x0D, 0x98, - 0x00, 0x78, 0xFF, 0x28, 0x05, 0xD1, 0x13, 0x48, 0x00, 0x78, 0x02, 0x21, 0x08, 0x43, 0x11, 0x49, - 0x08, 0x70, 0x10, 0x48, 0x00, 0x78, 0x03, 0x28, 0x18, 0xD1, 0x00, 0xF0, 0xE9, 0xF9, 0x04, 0x20, - 0x67, 0xE7, 0x0C, 0xE0, 0x00, 0x22, 0x0D, 0x99, 0x0C, 0x98, 0x00, 0xF0, 0x15, 0xF8, 0x0C, 0x98, - 0x40, 0x1C, 0x0C, 0x90, 0x0D, 0x98, 0x40, 0x1C, 0x0D, 0x90, 0x78, 0x1E, 0x87, 0xB2, 0x01, 0x2F, - 0xF0, 0xDC, 0x01, 0x22, 0x0D, 0x99, 0x0C, 0x98, 0x00, 0xF0, 0x06, 0xF8, 0x00, 0xF0, 0xD0, 0xF9, - 0x01, 0x20, 0x4E, 0xE7, 0xB1, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, - 0x36, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x34, 0x49, 0x08, 0x60, 0x08, 0x46, - 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x30, 0x49, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, - 0xFB, 0xF7, 0xD0, 0xF8, 0x2D, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x2B, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x27, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x24, 0x49, 0x08, 0x60, 0x08, 0x46, - 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, 0x21, 0x49, 0x08, 0x60, 0x00, 0x2E, 0x0E, 0xD1, 0x08, 0x46, - 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, 0x1C, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, - 0x01, 0x21, 0x09, 0x03, 0x88, 0x43, 0x19, 0x49, 0x88, 0x60, 0x0E, 0xE0, 0x17, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x15, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0x09, 0x03, 0x08, 0x43, 0x11, 0x49, 0x88, 0x60, 0x00, 0xBF, 0x00, 0xBF, 0x0F, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x0D, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0xC9, 0x02, 0x08, 0x43, 0x09, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0xCA, 0xFE, 0x07, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0xC9, 0x02, 0x88, 0x43, 0x01, 0x49, 0x88, 0x60, 0x70, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, - 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x1F, 0x46, 0x00, 0xF0, 0xF3, 0xF8, 0xFE, 0x22, - 0x22, 0x40, 0x11, 0x46, 0xFE, 0x22, 0x22, 0x40, 0x10, 0x46, 0x00, 0xF0, 0x51, 0xF8, 0xC0, 0x07, - 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x43, 0xF9, 0x00, 0x20, 0xF8, 0xBD, 0x28, 0x12, - 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0x00, 0xF0, 0x43, 0xF8, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, - 0x03, 0xD0, 0x00, 0xF0, 0x35, 0xF9, 0x00, 0x20, 0xF0, 0xE7, 0xE8, 0xB2, 0x00, 0x90, 0x00, 0x99, - 0x08, 0x46, 0x00, 0xF0, 0x35, 0xF8, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0x00, 0xF0, - 0x27, 0xF9, 0x00, 0x20, 0xE2, 0xE7, 0x00, 0x2E, 0x25, 0xD0, 0x00, 0xF0, 0xC3, 0xF8, 0x01, 0x22, - 0x22, 0x43, 0x11, 0x46, 0x22, 0x46, 0x01, 0x23, 0x1A, 0x43, 0x10, 0x46, 0x00, 0xF0, 0x20, 0xF8, - 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0x00, 0xF0, 0x12, 0xF9, 0x00, 0x20, 0xCD, 0xE7, - 0x0A, 0xE0, 0x00, 0x22, 0x38, 0x46, 0x06, 0x99, 0xFF, 0xF7, 0x3E, 0xFF, 0x7F, 0x1C, 0x06, 0x98, - 0x40, 0x1C, 0x06, 0x90, 0x70, 0x1E, 0x86, 0xB2, 0x01, 0x2E, 0xF2, 0xDC, 0x01, 0x22, 0x38, 0x46, - 0x06, 0x99, 0xFF, 0xF7, 0x31, 0xFF, 0x00, 0xF0, 0xFB, 0xF8, 0x01, 0x20, 0xB6, 0xE7, 0x00, 0x00, - 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x38, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, - 0x35, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x32, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x2E, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, 0x2B, 0x49, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, - 0xFA, 0xF7, 0x9A, 0xFF, 0xFF, 0xF7, 0x3B, 0xFE, 0x27, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, - 0x88, 0x43, 0x25, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, - 0x21, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x1E, 0x49, - 0x88, 0x60, 0xFF, 0xF7, 0x24, 0xFE, 0x1C, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, - 0x19, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x16, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x00, 0x69, 0x40, 0x05, 0xC0, 0x0F, 0x01, 0x21, 0x48, 0x40, 0x06, 0x46, - 0x11, 0x48, 0x80, 0x68, 0x49, 0x02, 0x88, 0x43, 0x0F, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x07, 0xFE, - 0x0D, 0x48, 0x00, 0x69, 0xC0, 0x04, 0xC0, 0x0F, 0x01, 0x21, 0x48, 0x40, 0x07, 0x46, 0x0A, 0x48, - 0x80, 0x68, 0xC9, 0x02, 0x88, 0x43, 0x08, 0x49, 0x88, 0x60, 0xBE, 0x42, 0x05, 0xD0, 0x00, 0x2E, - 0x01, 0xD0, 0x01, 0x20, 0xF8, 0xBD, 0x02, 0x20, 0xFC, 0xE7, 0x00, 0x2E, 0x01, 0xD0, 0x03, 0x20, - 0xF8, 0xE7, 0x00, 0x20, 0xF6, 0xE7, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0x10, 0xB5, 0x00, 0x24, - 0x00, 0xF0, 0x0A, 0xFC, 0x01, 0x20, 0x0D, 0x49, 0x08, 0x70, 0x03, 0xF0, 0xFF, 0xFA, 0x0D, 0xE0, - 0x05, 0xF0, 0xD6, 0xF9, 0x0A, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, 0xFD, 0xF7, 0x52, 0xF8, - 0x64, 0x1C, 0x7D, 0x20, 0xC0, 0x00, 0x84, 0x42, 0x00, 0xDD, 0x03, 0xE0, 0x03, 0x48, 0x00, 0x78, - 0x00, 0x28, 0xED, 0xD1, 0x00, 0xBF, 0x02, 0xF0, 0x75, 0xFD, 0x10, 0xBD, 0x9B, 0x00, 0x00, 0x20, - 0x9A, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x2D, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, - 0x2A, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x27, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x23, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, 0x20, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, - 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x1D, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0x09, 0x03, 0x08, 0x43, 0x19, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x92, 0xFD, 0x17, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x15, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0xC9, 0x02, 0x08, 0x43, 0x11, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x82, 0xFD, 0x0F, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, 0x0D, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0x09, 0x03, 0x88, 0x43, 0x09, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x72, 0xFD, 0x07, 0x48, 0x80, 0x68, - 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, - 0xC9, 0x02, 0x88, 0x43, 0x01, 0x49, 0x88, 0x60, 0x00, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, - 0x00, 0xB5, 0x2B, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x28, 0x49, 0x88, 0x60, - 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x25, 0x49, 0x88, 0x60, 0x08, 0x46, - 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x21, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, - 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x1E, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, - 0x09, 0x06, 0x88, 0x43, 0x1A, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, - 0x17, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, 0x14, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x88, 0x43, 0x10, 0x49, 0x88, 0x60, - 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x0D, 0x49, 0x88, 0x60, 0x08, 0x46, - 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x09, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x18, 0xFD, - 0x07, 0x48, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x05, 0x49, 0x88, 0x60, 0x08, 0x46, - 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x08, 0x43, 0x01, 0x49, 0x88, 0x60, 0x00, 0xBD, 0x00, 0x00, - 0x80, 0x40, 0x00, 0x50, 0xF8, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x1F, 0x46, 0xFF, 0xF7, - 0x41, 0xFF, 0xFE, 0x22, 0x22, 0x40, 0x11, 0x46, 0xFE, 0x22, 0x22, 0x40, 0x10, 0x46, 0xFF, 0xF7, - 0x9F, 0xFE, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0xFF, 0xF7, 0x91, 0xFF, 0x00, 0x20, - 0xF8, 0xBD, 0x28, 0x12, 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0xFF, 0xF7, 0x91, 0xFE, 0xC0, 0x07, - 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0xFF, 0xF7, 0x83, 0xFF, 0x00, 0x20, 0xF0, 0xE7, 0xE8, 0xB2, - 0x00, 0x90, 0x00, 0x99, 0x08, 0x46, 0xFF, 0xF7, 0x83, 0xFE, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, - 0x03, 0xD0, 0xFF, 0xF7, 0x75, 0xFF, 0x00, 0x20, 0xE2, 0xE7, 0x12, 0xE0, 0x06, 0x9A, 0x11, 0x78, - 0x38, 0x78, 0xFF, 0xF7, 0x75, 0xFE, 0xC0, 0x07, 0xC0, 0x0F, 0x01, 0x28, 0x03, 0xD0, 0xFF, 0xF7, - 0x67, 0xFF, 0x00, 0x20, 0xD4, 0xE7, 0x7F, 0x1C, 0x06, 0x98, 0x40, 0x1C, 0x06, 0x90, 0x70, 0x1E, - 0x86, 0xB2, 0x00, 0x2E, 0xEA, 0xD1, 0xFF, 0xF7, 0x5B, 0xFF, 0x01, 0x20, 0xC8, 0xE7, 0x00, 0x00, - 0x04, 0x49, 0x09, 0x68, 0x3C, 0x22, 0x91, 0x43, 0x20, 0x31, 0x18, 0x22, 0x11, 0x43, 0x01, 0x4A, - 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x12, 0x40, 0x70, 0xB5, 0x04, 0x46, 0xC0, 0x2C, 0x0C, 0xD1, - 0xB2, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0xB0, 0x49, 0x08, 0x60, 0x00, 0x20, - 0xAF, 0x49, 0x08, 0x70, 0xAF, 0x49, 0x08, 0x70, 0x70, 0xBD, 0xA8, 0x2C, 0x60, 0xD3, 0xB8, 0x2C, - 0x5E, 0xD8, 0xAD, 0x48, 0x00, 0x78, 0x00, 0x28, 0x12, 0xD1, 0xAC, 0x48, 0xAC, 0x49, 0x09, 0x78, - 0x40, 0x5C, 0xA6, 0x49, 0x88, 0x60, 0x08, 0x46, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, - 0xA2, 0x49, 0x08, 0x60, 0xA6, 0x48, 0x00, 0x78, 0x40, 0x1C, 0xA5, 0x49, 0x08, 0x70, 0x3C, 0xE0, - 0xA1, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x03, 0xD0, 0x9F, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x22, 0xD1, - 0xA0, 0x48, 0x00, 0x68, 0x40, 0x1C, 0x9F, 0x49, 0x08, 0x60, 0x9F, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x08, 0xD0, 0x08, 0x46, 0x00, 0x68, 0x9D, 0x49, 0x09, 0x68, 0x40, 0x1A, 0x23, 0x21, 0x89, 0x01, - 0x88, 0x42, 0x03, 0xDB, 0x99, 0x48, 0x00, 0x68, 0x96, 0x49, 0x08, 0x60, 0x95, 0x49, 0x09, 0x68, - 0x08, 0x78, 0xFD, 0xF7, 0xF1, 0xFA, 0x8D, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, - 0x8A, 0x49, 0x08, 0x60, 0x11, 0xE0, 0x8D, 0x49, 0x8D, 0x4A, 0x12, 0x78, 0x88, 0x5C, 0xFD, 0xF7, - 0xE3, 0xFA, 0x86, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0x83, 0x49, 0x08, 0x60, - 0x87, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x86, 0x49, 0x08, 0x70, 0x01, 0x20, 0x86, 0x49, 0x08, 0x70, - 0x87, 0x48, 0x00, 0x78, 0x02, 0x28, 0x02, 0xDB, 0x00, 0x20, 0x85, 0x49, 0x08, 0x70, 0x9B, 0xE7, - 0x60, 0x2C, 0x06, 0xD0, 0x68, 0x2C, 0x05, 0xD0, 0x80, 0x2C, 0x1A, 0xD0, 0xA0, 0x2C, 0x71, 0xD1, - 0xAC, 0xE0, 0x00, 0xBF, 0x75, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0x73, 0x49, - 0x08, 0x60, 0x00, 0x20, 0x7B, 0x49, 0x08, 0x70, 0x7B, 0x49, 0x08, 0x70, 0x01, 0x20, 0x71, 0x49, - 0x08, 0x70, 0x00, 0x20, 0x79, 0x49, 0x08, 0x70, 0x79, 0x49, 0x08, 0x70, 0x72, 0x49, 0x08, 0x70, - 0xD2, 0xE0, 0xFD, 0xF7, 0x65, 0xFA, 0x06, 0x46, 0x68, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, - 0x0C, 0x30, 0x66, 0x49, 0x08, 0x60, 0x01, 0x20, 0x72, 0x49, 0x08, 0x70, 0x6F, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x2B, 0xD1, 0x66, 0x48, 0x06, 0x70, 0x64, 0x48, 0x65, 0x30, 0xC0, 0x79, 0xC0, 0x06, - 0x80, 0x0F, 0x01, 0x28, 0x1E, 0xD1, 0x62, 0x48, 0x00, 0x78, 0x1A, 0x28, 0x03, 0xD1, 0xC3, 0x20, - 0x5F, 0x49, 0x08, 0x70, 0x16, 0xE0, 0x5E, 0x48, 0x00, 0x78, 0x3D, 0x28, 0x03, 0xD1, 0x6A, 0x20, - 0x5B, 0x49, 0x08, 0x70, 0x0E, 0xE0, 0x5A, 0x48, 0x00, 0x78, 0x38, 0x28, 0x03, 0xD1, 0x01, 0x20, - 0x5C, 0x49, 0x08, 0x70, 0x06, 0xE0, 0x56, 0x48, 0x00, 0x78, 0x39, 0x28, 0x02, 0xD1, 0x01, 0x20, - 0x59, 0x49, 0x08, 0x70, 0x01, 0x20, 0x59, 0x49, 0x08, 0x70, 0x56, 0xE0, 0x01, 0x20, 0x58, 0x49, - 0x08, 0x70, 0x4E, 0x48, 0x65, 0x30, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x2F, 0xD1, - 0x50, 0x48, 0x00, 0x78, 0x01, 0x28, 0x1B, 0xD1, 0x00, 0x20, 0x4E, 0x49, 0x08, 0x70, 0x35, 0x46, - 0x55, 0x2D, 0x08, 0xD1, 0x01, 0x21, 0x45, 0x48, 0x40, 0x30, 0x01, 0x74, 0x01, 0x20, 0x4E, 0x49, - 0x08, 0x70, 0x1D, 0xE0, 0x70, 0xE0, 0x56, 0x2D, 0x1A, 0xD1, 0x01, 0x20, 0x4B, 0x49, 0x08, 0x70, - 0x01, 0x21, 0x3E, 0x48, 0x40, 0x30, 0x01, 0x74, 0x01, 0x20, 0x47, 0x49, 0x08, 0x70, 0x0F, 0xE0, - 0x41, 0x48, 0x00, 0x78, 0x01, 0x28, 0x0B, 0xD1, 0x00, 0x20, 0x3F, 0x49, 0x08, 0x70, 0x55, 0x2E, - 0x06, 0xD1, 0x00, 0x21, 0x35, 0x48, 0x40, 0x30, 0x01, 0x74, 0x00, 0x20, 0x3E, 0x49, 0x08, 0x70, - 0x3F, 0x48, 0x00, 0x78, 0x00, 0x28, 0x07, 0xD1, 0x31, 0x48, 0x00, 0x78, 0x65, 0x28, 0x03, 0xDB, - 0x2F, 0x48, 0x00, 0x78, 0xC2, 0x28, 0x07, 0xD9, 0x2D, 0x48, 0x00, 0x78, 0x50, 0x28, 0x03, 0xD0, - 0x2B, 0x48, 0x00, 0x78, 0x51, 0x28, 0x03, 0xD1, 0x28, 0x48, 0x29, 0x49, 0x09, 0x78, 0x46, 0x54, - 0x27, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x26, 0x49, 0x08, 0x70, 0x3D, 0xE0, 0x1F, 0x48, 0x00, 0x68, - 0x3C, 0x21, 0x88, 0x43, 0x0C, 0x30, 0x1D, 0x49, 0x08, 0x60, 0x29, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x05, 0xD0, 0x00, 0x20, 0x1B, 0x49, 0x08, 0x70, 0x01, 0x20, 0x2A, 0x49, 0x08, 0x70, 0x1E, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x1F, 0xD0, 0x03, 0x26, 0x18, 0x48, 0x65, 0x30, 0xC0, 0x79, 0xC0, 0x06, - 0x80, 0x0F, 0x01, 0x28, 0x00, 0xD1, 0x02, 0x26, 0x13, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x0D, 0xD0, - 0x11, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x09, 0xD0, 0x10, 0x48, 0x40, 0x78, 0x0F, 0x49, 0x89, 0x78, - 0x08, 0x43, 0x03, 0xD0, 0x0E, 0x48, 0x00, 0x78, 0xB0, 0x42, 0x04, 0xDD, 0x00, 0x20, 0x08, 0x49, - 0x08, 0x70, 0x08, 0x49, 0x08, 0x70, 0x07, 0xE0, 0x04, 0x48, 0x00, 0x68, 0x3C, 0x21, 0x88, 0x43, - 0x08, 0x30, 0x02, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x00, 0xBF, 0xA5, 0xE6, 0x00, 0x00, 0x12, 0x40, - 0x9B, 0x00, 0x00, 0x20, 0x9A, 0x00, 0x00, 0x20, 0x3F, 0x01, 0x00, 0x20, 0xD4, 0x03, 0x00, 0x20, - 0xCD, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x00, 0x20, 0x9F, 0x00, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x20, - 0xA1, 0x00, 0x00, 0x20, 0xD4, 0x00, 0x00, 0x20, 0xD5, 0x00, 0x00, 0x20, 0x9D, 0x00, 0x00, 0x20, - 0x9E, 0x00, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, 0x8E, 0x00, 0x00, 0x20, 0x8F, 0x00, 0x00, 0x20, - 0x9C, 0x00, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, 0x30, 0xB4, 0x0A, 0x49, 0xC8, 0x68, 0x4B, 0x69, - 0x09, 0x4A, 0xDB, 0x07, 0x05, 0xD0, 0x4B, 0x69, 0x01, 0x24, 0x23, 0x43, 0x4B, 0x61, 0xD1, 0x68, - 0x02, 0xE0, 0x38, 0x28, 0x04, 0xD9, 0x11, 0x68, 0x00, 0x29, 0x01, 0xD0, 0x30, 0xBC, 0x08, 0x47, - 0x30, 0xBC, 0x70, 0x47, 0x00, 0x00, 0x12, 0x40, 0x88, 0x1A, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x20, - 0x2F, 0x49, 0x08, 0x70, 0x2F, 0x49, 0x08, 0x70, 0x01, 0x20, 0xFC, 0xF7, 0x0D, 0xFF, 0x2E, 0x48, - 0xFD, 0xF7, 0x1C, 0xF9, 0x2D, 0x48, 0xC0, 0x79, 0x40, 0x07, 0x40, 0x0F, 0x01, 0x28, 0x0A, 0xD1, - 0x00, 0x22, 0x55, 0x21, 0x10, 0x46, 0xFD, 0xF7, 0x41, 0xF9, 0x00, 0x22, 0x55, 0x21, 0x01, 0x20, - 0xFD, 0xF7, 0x3C, 0xF9, 0x1A, 0xE0, 0x25, 0x48, 0xC0, 0x79, 0x40, 0x07, 0x40, 0x0F, 0x02, 0x28, - 0x0A, 0xD1, 0x00, 0x22, 0x5C, 0x21, 0x10, 0x46, 0xFD, 0xF7, 0x30, 0xF9, 0x00, 0x22, 0x5C, 0x21, - 0x01, 0x20, 0xFD, 0xF7, 0x2B, 0xF9, 0x09, 0xE0, 0x00, 0x22, 0x55, 0x21, 0x10, 0x46, 0xFD, 0xF7, - 0x25, 0xF9, 0x00, 0x22, 0x5C, 0x21, 0x01, 0x20, 0xFD, 0xF7, 0x20, 0xF9, 0x18, 0x48, 0x00, 0x68, - 0x3C, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x16, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, - 0x88, 0x43, 0x80, 0x30, 0x12, 0x49, 0x08, 0x60, 0x00, 0x21, 0x13, 0x20, 0x01, 0xF0, 0x68, 0xFD, - 0x13, 0x20, 0x01, 0xF0, 0x51, 0xFD, 0x0F, 0x49, 0x00, 0x20, 0xFD, 0xF7, 0xBF, 0xF8, 0x0E, 0x49, - 0x01, 0x20, 0xFD, 0xF7, 0xBB, 0xF8, 0x0C, 0x49, 0x02, 0x20, 0xFD, 0xF7, 0xB7, 0xF8, 0x0A, 0x49, - 0x03, 0x20, 0xFD, 0xF7, 0xB3, 0xF8, 0x00, 0x20, 0x08, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x00, 0x00, - 0xA0, 0x00, 0x00, 0x20, 0x9C, 0x00, 0x00, 0x20, 0xC0, 0x27, 0x09, 0x00, 0x39, 0x04, 0x00, 0x20, - 0x00, 0x00, 0x12, 0x40, 0x29, 0x55, 0x00, 0x00, 0x11, 0x55, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x20, - 0x10, 0xB5, 0x54, 0x48, 0x00, 0x78, 0x41, 0x07, 0x49, 0x0F, 0x53, 0x48, 0xC0, 0x79, 0x40, 0x07, - 0x40, 0x0F, 0x81, 0x42, 0x0C, 0xD0, 0x50, 0x49, 0xC9, 0x79, 0x48, 0x07, 0x40, 0x0F, 0x4D, 0x49, - 0x09, 0x78, 0xC9, 0x08, 0xC9, 0x00, 0x01, 0x43, 0x4A, 0x4A, 0x11, 0x70, 0xFF, 0xF7, 0x76, 0xFF, - 0x4A, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x14, 0xD1, 0x47, 0x48, 0x25, 0x38, 0x00, 0x7C, 0x01, 0x28, - 0x04, 0xD1, 0xC9, 0x21, 0x44, 0x48, 0x25, 0x38, 0x01, 0x74, 0x14, 0xE0, 0x42, 0x48, 0x25, 0x38, - 0x00, 0x7C, 0xC9, 0x28, 0x0F, 0xD0, 0x01, 0x20, 0x41, 0x49, 0x08, 0x70, 0x41, 0x49, 0x08, 0x70, - 0x09, 0xE0, 0x3D, 0x48, 0x25, 0x38, 0x00, 0x7C, 0xC9, 0x28, 0x04, 0xD1, 0x01, 0x20, 0x3C, 0x49, - 0x08, 0x70, 0x3C, 0x49, 0x08, 0x70, 0x39, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x08, 0xD1, 0x36, 0x48, - 0x25, 0x38, 0x00, 0x7C, 0x01, 0x28, 0x03, 0xD1, 0xCA, 0x21, 0x33, 0x48, 0x25, 0x38, 0x01, 0x74, - 0x31, 0x48, 0x25, 0x38, 0x00, 0x7C, 0x31, 0x49, 0x08, 0x70, 0x08, 0x46, 0x00, 0x78, 0x04, 0x28, - 0x41, 0xD0, 0x06, 0xDC, 0x01, 0x28, 0x09, 0xD0, 0x02, 0x28, 0x11, 0xD0, 0x03, 0x28, 0x47, 0xD1, - 0x35, 0xE0, 0xC9, 0x28, 0x42, 0xD0, 0xCA, 0x28, 0x42, 0xD1, 0x40, 0xE0, 0x00, 0x21, 0x26, 0x48, - 0x25, 0x38, 0x01, 0x74, 0x00, 0x20, 0x25, 0x49, 0x08, 0x70, 0x01, 0xF0, 0x71, 0xFD, 0x3F, 0xE0, - 0x25, 0x48, 0x00, 0x68, 0x25, 0x49, 0x08, 0x43, 0x23, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, - 0x01, 0x21, 0x89, 0x03, 0x08, 0x43, 0x20, 0x49, 0x88, 0x60, 0x04, 0xF0, 0xEF, 0xFD, 0x59, 0x20, - 0x1F, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xFC, 0xF7, 0xDC, 0xFC, - 0xF9, 0x20, 0x40, 0x02, 0xFC, 0xF7, 0xE8, 0xFC, 0x1A, 0x49, 0xF9, 0x20, 0x40, 0x02, 0xFC, 0xF7, - 0x37, 0xFD, 0x01, 0x20, 0xFC, 0xF7, 0xBC, 0xFC, 0xFD, 0xF7, 0xE4, 0xF9, 0x18, 0xE0, 0x03, 0x20, - 0x05, 0xF0, 0xB8, 0xFA, 0x14, 0xE0, 0x03, 0x20, 0x02, 0xF0, 0x5C, 0xFA, 0x00, 0x21, 0x0A, 0x48, - 0x25, 0x38, 0x01, 0x74, 0x00, 0x20, 0x09, 0x49, 0x08, 0x70, 0x09, 0xE0, 0x08, 0xE0, 0x07, 0xE0, - 0x00, 0x21, 0x05, 0x48, 0x25, 0x38, 0x01, 0x74, 0x00, 0x20, 0x04, 0x49, 0x08, 0x70, 0x00, 0xBF, - 0x00, 0xBF, 0x10, 0xBD, 0xD6, 0x00, 0x00, 0x20, 0x39, 0x04, 0x00, 0x20, 0x3F, 0x01, 0x00, 0x20, - 0xA4, 0x00, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x20, 0x40, 0x40, 0x00, 0x50, 0x00, 0x00, 0x01, 0x40, - 0x00, 0x01, 0x00, 0x50, 0x33, 0x33, 0x33, 0x33, 0x10, 0xB5, 0x0A, 0x48, 0x80, 0x79, 0x80, 0x07, - 0x80, 0x0F, 0x02, 0xD0, 0x01, 0x28, 0x0A, 0xD1, 0x04, 0xE0, 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, - 0x21, 0xFD, 0x05, 0xE0, 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, 0x98, 0xFF, 0x00, 0xBF, 0x00, 0xBF, - 0x00, 0xBF, 0x10, 0xBD, 0x39, 0x04, 0x00, 0x20, 0x20, 0x49, 0x88, 0x68, 0x02, 0x46, 0x50, 0x32, - 0x0A, 0x62, 0xC8, 0x61, 0x50, 0x32, 0x4A, 0x62, 0xA0, 0x32, 0x8A, 0x62, 0x50, 0x32, 0xCA, 0x62, - 0x50, 0x32, 0x0A, 0x63, 0x23, 0x22, 0x12, 0x01, 0x82, 0x18, 0x8A, 0x63, 0x05, 0x22, 0xD2, 0x01, - 0x82, 0x18, 0xCA, 0x63, 0x5F, 0x22, 0xD2, 0x00, 0x82, 0x18, 0x4A, 0x63, 0x0F, 0x22, 0x92, 0x01, - 0x82, 0x18, 0x8A, 0x65, 0x23, 0x22, 0x52, 0x01, 0x82, 0x18, 0xCA, 0x65, 0x05, 0x22, 0x12, 0x02, - 0x82, 0x18, 0x4A, 0x64, 0x2D, 0x22, 0x52, 0x01, 0x82, 0x18, 0x8A, 0x64, 0x19, 0x22, 0x92, 0x01, - 0x82, 0x18, 0xCA, 0x64, 0x37, 0x22, 0x52, 0x01, 0x82, 0x18, 0x0A, 0x65, 0x0F, 0x22, 0xD2, 0x01, - 0x82, 0x18, 0x4A, 0x65, 0x06, 0x4A, 0x82, 0x18, 0x0A, 0x64, 0x87, 0x22, 0x12, 0x01, 0x82, 0x18, - 0x0A, 0x61, 0x03, 0x4A, 0x3C, 0x32, 0x80, 0x18, 0x48, 0x61, 0x70, 0x47, 0xB8, 0x01, 0x00, 0x20, - 0x5C, 0x08, 0x00, 0x00, 0x10, 0xB5, 0x0D, 0x48, 0x80, 0x79, 0x80, 0x07, 0x80, 0x0F, 0x06, 0xD0, - 0x01, 0x28, 0x0A, 0xD0, 0x02, 0x28, 0x09, 0xD0, 0x03, 0x28, 0x0C, 0xD1, 0x00, 0xE0, 0x00, 0xBF, - 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, 0xBE, 0xFC, 0x06, 0xE0, 0x00, 0xBF, 0x01, 0x21, 0x03, 0x20, - 0xFC, 0xF7, 0x34, 0xFF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, 0x39, 0x04, 0x00, 0x20, - 0xF0, 0xB5, 0x25, 0x4A, 0x52, 0x6A, 0x52, 0x5C, 0x00, 0x2A, 0x42, 0xD0, 0x23, 0x4A, 0x17, 0x7C, - 0x94, 0x46, 0x21, 0x4A, 0x20, 0x4E, 0x14, 0x6A, 0x80, 0x3E, 0xD3, 0x69, 0x32, 0x46, 0x60, 0x32, - 0x45, 0x00, 0x49, 0x00, 0x00, 0x2F, 0x1D, 0xD0, 0x67, 0x46, 0x3F, 0x7C, 0x87, 0x42, 0x19, 0xD8, - 0xB0, 0x7F, 0x00, 0x28, 0x02, 0xD1, 0x58, 0x5E, 0x61, 0x5E, 0x01, 0xE0, 0x60, 0x5E, 0x59, 0x5E, - 0x0E, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x24, 0xDD, 0x10, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x20, 0xDA, - 0x13, 0x48, 0x43, 0x5F, 0x12, 0x20, 0x10, 0x5E, 0x18, 0xE0, 0x18, 0x18, 0x88, 0x42, 0x18, 0xDD, - 0x01, 0x20, 0xF0, 0xBD, 0x30, 0x7F, 0x00, 0x28, 0x02, 0xD1, 0x58, 0x5E, 0x61, 0x5E, 0x01, 0xE0, - 0x60, 0x5E, 0x59, 0x5E, 0x08, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x0A, 0xDD, 0x0A, 0x23, 0xD3, 0x5E, - 0x98, 0x42, 0x06, 0xDA, 0x06, 0x48, 0x43, 0x5F, 0x0C, 0x20, 0x10, 0x5E, 0x1A, 0x1A, 0x8A, 0x42, - 0xE3, 0xDB, 0x00, 0x20, 0xF0, 0xBD, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x20, 0x74, 0x04, 0x00, 0x20, - 0xEA, 0x06, 0x00, 0x20, 0x08, 0x4B, 0x10, 0xB5, 0x00, 0x20, 0x58, 0x72, 0x19, 0x46, 0x24, 0x31, - 0x5A, 0x79, 0x06, 0xE0, 0x0C, 0x5C, 0x03, 0x2C, 0x02, 0xD9, 0x01, 0x20, 0x58, 0x72, 0x10, 0xBD, - 0x40, 0x1C, 0x90, 0x42, 0xF6, 0xDB, 0x10, 0xBD, 0x90, 0x03, 0x00, 0x20, 0xF8, 0xB5, 0x3B, 0x4C, - 0x00, 0x25, 0x62, 0x79, 0x2E, 0x46, 0x2F, 0x46, 0x00, 0x2A, 0x6E, 0xD0, 0x00, 0x20, 0x38, 0x4B, - 0x0C, 0xE0, 0x41, 0x00, 0x59, 0x5E, 0xA9, 0x42, 0x03, 0xDD, 0x2E, 0x46, 0x0D, 0x46, 0x07, 0x46, - 0x02, 0xE0, 0xB1, 0x42, 0x00, 0xDD, 0x0E, 0x46, 0x40, 0x1C, 0xC0, 0xB2, 0x90, 0x42, 0xF0, 0xD3, - 0x00, 0x24, 0x17, 0xE0, 0x2E, 0x4A, 0x60, 0x00, 0x10, 0x32, 0x11, 0x5E, 0x19, 0x23, 0xDB, 0x01, - 0x99, 0x42, 0x08, 0xDC, 0x2B, 0x4B, 0x1B, 0x88, 0xC9, 0x18, 0x11, 0x52, 0x27, 0x49, 0x24, 0x31, - 0x08, 0x5D, 0x40, 0x1C, 0x08, 0x55, 0xA7, 0x42, 0x02, 0xD0, 0x20, 0x46, 0x04, 0xF0, 0x00, 0xFC, - 0x64, 0x1C, 0xE4, 0xB2, 0x21, 0x48, 0x40, 0x79, 0x84, 0x42, 0xE3, 0xD3, 0x1F, 0x4C, 0xE0, 0x78, - 0x85, 0x42, 0x03, 0xDA, 0x38, 0x46, 0x04, 0xF0, 0xF3, 0xFB, 0x18, 0xE0, 0xA0, 0x78, 0x85, 0x42, - 0x15, 0xDD, 0xB5, 0x42, 0x13, 0xD0, 0xA8, 0x19, 0x0A, 0x22, 0xA9, 0x1B, 0x50, 0x43, 0xFA, 0xF7, - 0xE7, 0xFA, 0x21, 0x79, 0x88, 0x42, 0x0A, 0xDC, 0x15, 0x49, 0x00, 0x20, 0x7A, 0x00, 0x10, 0x31, - 0x88, 0x52, 0x12, 0x49, 0x24, 0x31, 0xC8, 0x55, 0x01, 0x20, 0xB8, 0x40, 0x20, 0x72, 0x0E, 0x20, - 0x20, 0x5E, 0x11, 0x49, 0x88, 0x42, 0x03, 0xDC, 0x0E, 0x4A, 0x12, 0x88, 0x80, 0x18, 0xE0, 0x81, - 0x0E, 0x20, 0x20, 0x5E, 0x88, 0x42, 0x0C, 0xDD, 0x09, 0x4A, 0x78, 0x00, 0x10, 0x3A, 0x13, 0x46, - 0x10, 0x3B, 0x11, 0x5A, 0x1B, 0x5A, 0xC9, 0x18, 0x09, 0x04, 0x49, 0x0C, 0x11, 0x52, 0x10, 0x20, - 0xE0, 0x71, 0x20, 0x7A, 0x00, 0x28, 0x00, 0xD1, 0xE0, 0x81, 0xF8, 0xBD, 0x90, 0x03, 0x00, 0x20, - 0xB8, 0x1A, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x30, 0x75, 0x00, 0x00, 0xFE, 0xB5, 0x00, 0x20, - 0xF9, 0x4B, 0x00, 0x90, 0x58, 0x7E, 0xF9, 0x49, 0x02, 0x90, 0xC9, 0x7A, 0x49, 0x06, 0x02, 0xD5, - 0x03, 0x21, 0x08, 0x1A, 0xC0, 0xB2, 0x02, 0x28, 0x02, 0xD3, 0x05, 0x21, 0x08, 0x1A, 0xC0, 0xB2, - 0xF2, 0x4C, 0x40, 0x34, 0xE1, 0x7D, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0xE1, 0x7D, - 0xE1, 0x75, 0xA1, 0x7D, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0xA1, 0x7D, 0xA1, 0x75, - 0x21, 0x7E, 0xA2, 0x7D, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0x21, 0x7E, - 0x21, 0x76, 0x61, 0x7E, 0xE2, 0x7D, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, - 0x61, 0x7E, 0x61, 0x76, 0xE1, 0x7E, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0xE1, 0x7E, - 0xE1, 0x76, 0xA1, 0x7E, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0xA1, 0x7E, 0xA1, 0x76, - 0x21, 0x7F, 0xA2, 0x7E, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, 0x21, 0x7F, - 0x21, 0x77, 0x61, 0x7F, 0xE2, 0x7E, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, - 0x61, 0x7F, 0x61, 0x77, 0xA2, 0x7F, 0xD0, 0x49, 0xE0, 0x31, 0x0A, 0x71, 0xCF, 0x4A, 0x60, 0x32, - 0x55, 0x78, 0x4D, 0x71, 0xE5, 0x7F, 0x8D, 0x71, 0x12, 0x78, 0xCA, 0x71, 0x85, 0x07, 0x0A, 0x79, - 0xAD, 0x0F, 0x4A, 0x55, 0x42, 0x1C, 0x92, 0x07, 0x4D, 0x79, 0x92, 0x0F, 0x8D, 0x54, 0x82, 0x1C, - 0x92, 0x07, 0x8D, 0x79, 0x92, 0x0F, 0x8D, 0x54, 0xC2, 0x1C, 0x92, 0x07, 0xCD, 0x79, 0x92, 0x0F, - 0x8D, 0x54, 0xC1, 0x4A, 0x00, 0x25, 0xD5, 0x84, 0x0D, 0x46, 0xA0, 0x3D, 0x6A, 0x89, 0xBE, 0x4B, - 0x17, 0xB2, 0x01, 0x97, 0x00, 0x26, 0x5F, 0x85, 0x1E, 0x85, 0xAF, 0x89, 0x1E, 0x46, 0x3B, 0xB2, - 0x9C, 0x46, 0xB3, 0x85, 0xCB, 0x78, 0x53, 0x43, 0x9B, 0x0A, 0xF3, 0x85, 0x4B, 0x78, 0x53, 0x43, - 0x9B, 0x0A, 0xD2, 0x1A, 0x33, 0x46, 0x5A, 0x86, 0x0A, 0x78, 0xB5, 0x4E, 0x7A, 0x43, 0x92, 0x0A, - 0x1A, 0x86, 0x89, 0x78, 0x79, 0x43, 0x89, 0x0A, 0x7A, 0x1A, 0x19, 0x46, 0x8A, 0x86, 0x00, 0x22, - 0x80, 0x31, 0x8A, 0x61, 0x52, 0x1E, 0xAC, 0x49, 0x06, 0x27, 0x80, 0x31, 0x89, 0x69, 0x0B, 0x46, - 0x79, 0x43, 0x72, 0x52, 0x89, 0x19, 0x4A, 0x80, 0x8A, 0x80, 0x59, 0x1C, 0xA6, 0x4B, 0x80, 0x33, - 0x99, 0x61, 0x0A, 0x29, 0xEF, 0xDB, 0x21, 0x7B, 0x09, 0x07, 0x04, 0xD0, 0x21, 0x7B, 0x09, 0x07, - 0x09, 0x0F, 0x03, 0x29, 0x09, 0xD1, 0xA0, 0x48, 0x00, 0x21, 0x81, 0x71, 0xC1, 0x84, 0x01, 0x9A, - 0x42, 0x85, 0x01, 0x85, 0x61, 0x46, 0x81, 0x85, 0xFE, 0xBD, 0x21, 0x7B, 0x02, 0x01, 0x8A, 0x18, - 0x99, 0x49, 0x4A, 0x77, 0xD2, 0xB2, 0x92, 0x06, 0x23, 0x7B, 0x92, 0x0E, 0x80, 0x01, 0x18, 0x18, - 0x48, 0x77, 0xC0, 0xB2, 0x80, 0x09, 0x80, 0x01, 0x10, 0x43, 0x00, 0x26, 0x0F, 0x46, 0x88, 0x71, - 0x80, 0x37, 0xBE, 0x61, 0x91, 0x49, 0xB8, 0x69, 0x60, 0x39, 0x09, 0x18, 0xA0, 0x31, 0x09, 0x79, - 0x8F, 0x4B, 0x42, 0x00, 0xB4, 0x33, 0x99, 0x52, 0x8B, 0x49, 0xE0, 0x31, 0x0E, 0x54, 0x08, 0x31, - 0x0E, 0x54, 0x40, 0x1C, 0xB8, 0x61, 0x08, 0x28, 0xEC, 0xDB, 0x1A, 0x46, 0x0A, 0x3A, 0xBE, 0x61, - 0x85, 0x4E, 0x00, 0x23, 0x80, 0x36, 0xB0, 0x69, 0x41, 0x1C, 0x13, 0x54, 0xB1, 0x61, 0x0A, 0x29, - 0xF6, 0xDB, 0x02, 0x98, 0x80, 0x3E, 0x00, 0x28, 0x15, 0xD0, 0x01, 0x28, 0x13, 0xD0, 0x02, 0x28, - 0x05, 0xD0, 0x03, 0x28, 0x0F, 0xD1, 0x00, 0x20, 0x02, 0xF0, 0x5E, 0xF9, 0x08, 0xE0, 0xB0, 0x79, - 0xC0, 0x07, 0x08, 0xD0, 0x00, 0x20, 0x02, 0xF0, 0x57, 0xF9, 0xB0, 0x79, 0xC0, 0x07, 0x02, 0xD0, - 0x01, 0x20, 0x02, 0xF0, 0x51, 0xF9, 0x74, 0x48, 0x81, 0x79, 0x76, 0x48, 0xCA, 0x06, 0x72, 0x4A, - 0x22, 0xD4, 0x8B, 0x06, 0x9B, 0x0F, 0x0C, 0xD1, 0x03, 0x81, 0xA3, 0x7B, 0xAE, 0x89, 0x73, 0x43, - 0x9B, 0x0A, 0x43, 0x81, 0xA3, 0x7B, 0xE7, 0x7B, 0xDB, 0x19, 0x73, 0x43, 0x9B, 0x0A, 0x13, 0x85, - 0x0D, 0xE0, 0xAB, 0x89, 0x43, 0x81, 0xA6, 0x7B, 0x5E, 0x43, 0xB6, 0x0A, 0x9E, 0x1B, 0x06, 0x81, - 0xA6, 0x7B, 0xE7, 0x7B, 0xF6, 0x19, 0x5E, 0x43, 0xB6, 0x0A, 0x9B, 0x1B, 0x93, 0x85, 0x01, 0x23, - 0x13, 0x77, 0x63, 0x7B, 0x6A, 0x89, 0x23, 0xE0, 0x8B, 0x06, 0x9B, 0x0F, 0x03, 0x2B, 0x0D, 0xD1, - 0x00, 0x23, 0x03, 0x81, 0xA3, 0x7B, 0x6E, 0x89, 0x73, 0x43, 0x9B, 0x0A, 0x43, 0x81, 0xA3, 0x7B, - 0xE7, 0x7B, 0xDB, 0x19, 0x73, 0x43, 0x9B, 0x0A, 0xD3, 0x84, 0x0D, 0xE0, 0x6B, 0x89, 0x43, 0x81, - 0xA6, 0x7B, 0x5E, 0x43, 0xB6, 0x0A, 0x9E, 0x1B, 0x06, 0x81, 0xA6, 0x7B, 0xE7, 0x7B, 0xF6, 0x19, - 0x5E, 0x43, 0xB6, 0x0A, 0x9B, 0x1B, 0x53, 0x85, 0x00, 0x23, 0x13, 0x77, 0x63, 0x7B, 0xAA, 0x89, - 0x53, 0x43, 0x5B, 0x0A, 0x83, 0x81, 0x23, 0x7C, 0x12, 0xB2, 0x00, 0x2B, 0x4C, 0xD0, 0x4A, 0x4B, - 0x4E, 0x06, 0x21, 0xD4, 0x89, 0x09, 0x0C, 0xD1, 0xC1, 0x81, 0xA1, 0x7C, 0xAE, 0x89, 0x71, 0x43, - 0x89, 0x0A, 0x01, 0x82, 0xA1, 0x7C, 0xE7, 0x7C, 0xC9, 0x19, 0x71, 0x43, 0x89, 0x0A, 0x19, 0x85, - 0x0D, 0xE0, 0xA9, 0x89, 0x01, 0x82, 0xA6, 0x7C, 0x4E, 0x43, 0xB6, 0x0A, 0x8E, 0x1B, 0xC6, 0x81, - 0xA6, 0x7C, 0xE7, 0x7C, 0xF6, 0x19, 0x4E, 0x43, 0xB6, 0x0A, 0x89, 0x1B, 0x99, 0x85, 0x01, 0x21, - 0x99, 0x77, 0x63, 0x7C, 0x69, 0x89, 0x22, 0xE0, 0x89, 0x09, 0x03, 0x29, 0x0D, 0xD1, 0x00, 0x21, - 0xC1, 0x81, 0xA1, 0x7C, 0x6E, 0x89, 0x71, 0x43, 0x89, 0x0A, 0x01, 0x82, 0xA1, 0x7C, 0xE7, 0x7C, - 0xC9, 0x19, 0x71, 0x43, 0x89, 0x0A, 0xD9, 0x84, 0x0D, 0xE0, 0x69, 0x89, 0x01, 0x82, 0xA6, 0x7C, - 0x4E, 0x43, 0xB6, 0x0A, 0x8E, 0x1B, 0xC6, 0x81, 0xA6, 0x7C, 0xE7, 0x7C, 0xF6, 0x19, 0x4E, 0x43, - 0xB6, 0x0A, 0x89, 0x1B, 0x59, 0x85, 0x00, 0x21, 0x99, 0x77, 0x63, 0x7C, 0xA9, 0x89, 0x4B, 0x43, - 0x5B, 0x0A, 0x09, 0xB2, 0x43, 0x82, 0x00, 0x91, 0x26, 0x48, 0x00, 0x21, 0x20, 0x30, 0x07, 0x46, - 0x81, 0x61, 0x22, 0x49, 0xB8, 0x69, 0x60, 0x39, 0x09, 0x18, 0xA0, 0x31, 0x09, 0x79, 0x00, 0x29, - 0x1A, 0xD0, 0x21, 0x7C, 0x00, 0x29, 0x09, 0xD0, 0x21, 0x7C, 0x81, 0x42, 0x06, 0xDC, 0x1C, 0x4D, - 0x43, 0x00, 0xB4, 0x35, 0xE9, 0x5E, 0x00, 0x9E, 0x71, 0x43, 0x04, 0xE0, 0x18, 0x4D, 0x43, 0x00, - 0xB4, 0x35, 0xE9, 0x5E, 0x51, 0x43, 0xCE, 0x17, 0x36, 0x0E, 0x71, 0x18, 0x09, 0x12, 0x40, 0x1C, - 0xE9, 0x52, 0xB8, 0x61, 0x08, 0x28, 0xDC, 0xDB, 0x0F, 0x49, 0x2E, 0x22, 0x26, 0x20, 0x8A, 0x5E, - 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDA, 0xC8, 0x85, 0x32, 0x22, 0x2A, 0x20, 0x8A, 0x5E, 0x08, 0x5E, - 0x82, 0x42, 0x00, 0xDD, 0x48, 0x86, 0x30, 0x22, 0x28, 0x20, 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, - 0x00, 0xDA, 0x08, 0x86, 0x34, 0x22, 0x2C, 0x20, 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDD, - 0x88, 0x86, 0xB8, 0x69, 0x48, 0x71, 0xFE, 0xBD, 0x38, 0x01, 0x00, 0x20, 0x34, 0x04, 0x00, 0x20, - 0x36, 0x06, 0x00, 0x20, 0x98, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x19, 0x4B, 0x58, 0x78, 0x99, 0x79, - 0x04, 0x46, 0x00, 0x29, 0x02, 0xD1, 0x17, 0x48, 0x40, 0x7C, 0x22, 0xE0, 0xFF, 0x29, 0x20, 0xD0, - 0x1A, 0x7A, 0x00, 0x2A, 0x03, 0xD1, 0x14, 0x4D, 0x2D, 0x78, 0x00, 0x2D, 0x0D, 0xD0, 0x00, 0x25, - 0x03, 0x29, 0x01, 0xD1, 0xFF, 0x20, 0x06, 0xE0, 0x00, 0x2A, 0x06, 0xD0, 0x01, 0x29, 0xF9, 0xD0, - 0x02, 0x29, 0x00, 0xD1, 0x10, 0x46, 0x5D, 0x81, 0x0B, 0xE0, 0x0A, 0x21, 0x0C, 0x22, 0x59, 0x5E, - 0x9A, 0x5E, 0x91, 0x42, 0x04, 0xDC, 0x09, 0x4A, 0x12, 0x88, 0x89, 0x18, 0x59, 0x81, 0x00, 0xE0, - 0x00, 0x20, 0xA0, 0x42, 0x03, 0xD0, 0x58, 0x70, 0xC0, 0xB2, 0x03, 0xF0, 0x7D, 0xFA, 0x70, 0xBD, - 0x90, 0x03, 0x00, 0x20, 0x14, 0x04, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, - 0xF0, 0xB5, 0x2A, 0x48, 0x80, 0x79, 0x00, 0x28, 0x4F, 0xD0, 0x28, 0x4E, 0x00, 0x20, 0x80, 0x36, - 0x27, 0x4F, 0x35, 0x46, 0x60, 0x35, 0xB0, 0x61, 0x39, 0x5C, 0x00, 0x29, 0x1C, 0xD1, 0x71, 0x6A, - 0x08, 0x5C, 0x00, 0x28, 0x1F, 0xD0, 0x00, 0x24, 0x12, 0xE0, 0x28, 0x5D, 0x00, 0x28, 0x0D, 0xD1, - 0xB0, 0x69, 0xC1, 0xB2, 0x20, 0x46, 0xFF, 0xF7, 0xC3, 0xFC, 0x28, 0x55, 0x28, 0x5D, 0x00, 0x28, - 0x04, 0xD0, 0x1A, 0x49, 0xB0, 0x69, 0xE8, 0x31, 0x08, 0x55, 0x05, 0xE0, 0x64, 0x1C, 0xE4, 0xB2, - 0x16, 0x48, 0x40, 0x79, 0x84, 0x42, 0xE8, 0xD3, 0xB1, 0x69, 0x70, 0x6A, 0x40, 0x5C, 0x00, 0x28, - 0x01, 0xD0, 0x01, 0x22, 0x00, 0xE0, 0x00, 0x22, 0xB1, 0x69, 0x48, 0x1C, 0x7A, 0x54, 0xB0, 0x61, - 0x0A, 0x28, 0xD1, 0xDB, 0x0D, 0x4E, 0x00, 0x20, 0x37, 0x46, 0x70, 0x77, 0x04, 0x46, 0xE8, 0x37, - 0x10, 0xE0, 0x28, 0x5D, 0x01, 0x28, 0x0B, 0xD1, 0x39, 0x5D, 0x20, 0x46, 0xFF, 0xF7, 0x98, 0xFC, - 0x28, 0x55, 0x28, 0x5D, 0x01, 0x28, 0x03, 0xD1, 0x71, 0x7F, 0xA0, 0x40, 0x08, 0x43, 0x70, 0x77, - 0x64, 0x1C, 0xE4, 0xB2, 0x70, 0x79, 0x84, 0x42, 0xEB, 0xD3, 0xF0, 0xBD, 0x38, 0x01, 0x00, 0x20, - 0xE0, 0x06, 0x00, 0x20, 0xF0, 0xB5, 0x0D, 0x4E, 0x00, 0x24, 0x37, 0x46, 0x05, 0x46, 0x10, 0x3F, - 0x0E, 0xE0, 0x60, 0x00, 0x29, 0x5C, 0x42, 0x19, 0x52, 0x78, 0x09, 0x02, 0x89, 0x18, 0x64, 0x29, - 0x02, 0xD2, 0x31, 0x5A, 0x39, 0x52, 0x02, 0xE0, 0xE0, 0xB2, 0xFB, 0xF7, 0x45, 0xF9, 0x64, 0x1C, - 0x03, 0x48, 0x40, 0x79, 0x84, 0x42, 0xEC, 0xDB, 0xF0, 0xBD, 0x00, 0x00, 0xA8, 0x1A, 0x00, 0x20, - 0x90, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x23, 0x06, 0xE0, 0xC2, 0x5C, 0x5C, 0x1C, 0x04, 0x5D, - 0xC4, 0x54, 0x5C, 0x1C, 0x02, 0x55, 0x9B, 0x1C, 0x8B, 0x42, 0xF6, 0xDB, 0x10, 0xBD, 0x00, 0x00, - 0x38, 0xB5, 0x04, 0xF0, 0x83, 0xF9, 0x3C, 0x20, 0x58, 0x49, 0x08, 0x70, 0x59, 0x20, 0x58, 0x49, - 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x56, 0x48, 0x00, 0x68, 0x04, 0x21, - 0x88, 0x43, 0x00, 0x1D, 0x53, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, - 0x08, 0x60, 0x00, 0xBF, 0x02, 0x20, 0xFC, 0xF7, 0x43, 0xFC, 0x01, 0x28, 0xFA, 0xD1, 0xFC, 0xF7, - 0x5B, 0xF8, 0x69, 0x46, 0xF9, 0x20, 0x40, 0x02, 0xFC, 0xF7, 0x8E, 0xF8, 0x4A, 0x49, 0x00, 0x98, - 0x88, 0x42, 0x08, 0xD1, 0xF9, 0x20, 0x40, 0x02, 0xFC, 0xF7, 0x5E, 0xF8, 0x47, 0x49, 0xF9, 0x20, - 0x40, 0x02, 0xFC, 0xF7, 0xAD, 0xF8, 0x01, 0x20, 0xFC, 0xF7, 0x90, 0xFD, 0x3F, 0x49, 0x09, 0x78, - 0x43, 0x4A, 0x51, 0x43, 0x08, 0x46, 0xFC, 0xF7, 0xF3, 0xFC, 0x02, 0x20, 0xFC, 0xF7, 0x5C, 0xFD, - 0xFC, 0xF7, 0x32, 0xF8, 0x00, 0x20, 0x3A, 0x49, 0x08, 0x60, 0xFC, 0xF7, 0x7D, 0xF9, 0x3D, 0x48, - 0x00, 0x68, 0x3D, 0x49, 0x08, 0x40, 0x3B, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x3B, 0x49, - 0x08, 0x43, 0x38, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x04, 0x21, 0x88, 0x43, 0x35, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x36, 0x49, 0x08, 0x43, 0x32, 0x49, 0x88, 0x60, 0x31, 0x48, - 0x40, 0x30, 0x00, 0x68, 0x30, 0x21, 0x08, 0x43, 0x2E, 0x49, 0x40, 0x31, 0x08, 0x60, 0x08, 0x46, - 0x80, 0x68, 0x04, 0x21, 0x08, 0x43, 0x2B, 0x49, 0x40, 0x31, 0x88, 0x60, 0x03, 0x22, 0x11, 0x46, - 0x10, 0x46, 0xFC, 0xF7, 0xD9, 0xFA, 0x03, 0x22, 0x01, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0xD4, 0xFA, - 0x03, 0x22, 0x11, 0x46, 0x02, 0x20, 0xFC, 0xF7, 0xCF, 0xFA, 0x02, 0x22, 0x09, 0x21, 0x10, 0x46, - 0xFC, 0xF7, 0xCA, 0xFA, 0x02, 0x22, 0x0B, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0xC5, 0xFA, 0x02, 0x22, - 0x0A, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0xC0, 0xFA, 0x02, 0x22, 0x0C, 0x21, 0x10, 0x46, 0xFC, 0xF7, - 0xBB, 0xFA, 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0xB6, 0xFA, 0x01, 0x20, 0x19, 0x49, - 0x08, 0x70, 0x00, 0x20, 0x18, 0x49, 0x08, 0x70, 0x18, 0x49, 0x08, 0x70, 0x03, 0x21, 0x08, 0x46, - 0xFC, 0xF7, 0x0E, 0xF9, 0x05, 0x46, 0x03, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0x09, 0xF9, 0x04, 0x46, - 0x00, 0x2C, 0x04, 0xD1, 0x00, 0x22, 0x03, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0x9D, 0xFA, 0x68, 0x00, - 0x00, 0x19, 0xC1, 0xB2, 0x0E, 0x48, 0x81, 0x74, 0x38, 0xBD, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x50, 0x00, 0x02, 0x00, 0x50, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, - 0x40, 0x42, 0x0F, 0x00, 0x80, 0x40, 0x00, 0x50, 0xCC, 0xFF, 0xFC, 0xF3, 0x13, 0x00, 0x03, 0x0C, - 0x01, 0x21, 0x00, 0x00, 0xA3, 0x00, 0x00, 0x20, 0xA4, 0x00, 0x00, 0x20, 0xCD, 0x00, 0x00, 0x20, - 0x14, 0x04, 0x00, 0x20, 0x10, 0xB5, 0xFD, 0xF7, 0x7B, 0xFF, 0x00, 0xF0, 0xCB, 0xFC, 0x00, 0xF0, - 0x15, 0xF8, 0xFA, 0xF7, 0x93, 0xFE, 0xFA, 0xF7, 0xB9, 0xFE, 0xFA, 0xF7, 0xB7, 0xFE, 0xFD, 0xF7, - 0x79, 0xFA, 0x00, 0xF0, 0xF5, 0xF8, 0xFA, 0xF7, 0x17, 0xF8, 0xFB, 0xF7, 0x65, 0xFB, 0xFB, 0xF7, - 0xD3, 0xF9, 0xFF, 0xF7, 0x8D, 0xFE, 0x02, 0xF0, 0x45, 0xFB, 0x10, 0xBD, 0xF8, 0xB5, 0x73, 0x4D, - 0x00, 0x20, 0x29, 0x46, 0x40, 0x39, 0x0C, 0x46, 0xE8, 0x83, 0x60, 0x34, 0x68, 0x83, 0x08, 0x76, - 0xA0, 0x82, 0x08, 0x70, 0x08, 0x7C, 0x49, 0x7C, 0x22, 0x46, 0x80, 0x1C, 0x20, 0x32, 0x49, 0x1C, - 0x41, 0x43, 0x00, 0x91, 0x90, 0x61, 0xC8, 0xE0, 0x68, 0x49, 0x40, 0x31, 0xCB, 0x68, 0x19, 0x5C, - 0x00, 0x29, 0x7E, 0xD1, 0x65, 0x4F, 0x41, 0x00, 0x40, 0x37, 0x7A, 0x68, 0x56, 0x5E, 0x8A, 0x18, - 0x6E, 0x82, 0x02, 0x21, 0x51, 0x5E, 0xB1, 0x42, 0x73, 0xDC, 0x18, 0x18, 0x02, 0x21, 0x41, 0x70, - 0x3E, 0x46, 0x80, 0x3E, 0x32, 0x7C, 0xB8, 0x69, 0x79, 0x68, 0x80, 0x18, 0x42, 0x00, 0x51, 0x18, - 0x12, 0x23, 0x04, 0x22, 0xEB, 0x5E, 0x8A, 0x5E, 0x9A, 0x42, 0xED, 0xDC, 0xFA, 0x68, 0x02, 0x21, - 0x80, 0x18, 0x81, 0x70, 0xB8, 0x69, 0x79, 0x68, 0x42, 0x00, 0x52, 0x18, 0x20, 0x3A, 0x1E, 0x23, - 0xD3, 0x5E, 0x12, 0x22, 0xAA, 0x5E, 0x93, 0x42, 0xDE, 0xDC, 0x33, 0x7C, 0xC3, 0x1A, 0x5B, 0x00, - 0x59, 0x18, 0x20, 0x39, 0x1C, 0x23, 0xCB, 0x5E, 0x93, 0x42, 0x4A, 0xDC, 0xFB, 0x68, 0x01, 0x21, - 0x19, 0x54, 0x31, 0x7C, 0xB8, 0x69, 0x89, 0x1C, 0xF9, 0xF7, 0xAA, 0xFE, 0x21, 0x80, 0x61, 0x80, - 0xA0, 0x80, 0xE0, 0x80, 0x01, 0x20, 0xA8, 0x83, 0x68, 0x8A, 0x28, 0x83, 0x00, 0x21, 0x30, 0x46, - 0x71, 0x75, 0x20, 0x30, 0xC1, 0x70, 0xFD, 0xF7, 0xB5, 0xFA, 0x04, 0x21, 0x61, 0x5E, 0x01, 0x23, - 0x13, 0xE0, 0x00, 0x20, 0x20, 0x5E, 0x0B, 0xE0, 0x3C, 0x4A, 0x3C, 0x4E, 0x40, 0x3A, 0x12, 0x7C, - 0x40, 0x36, 0xF6, 0x68, 0x92, 0x1C, 0x4A, 0x43, 0x47, 0x1C, 0x30, 0x18, 0x13, 0x54, 0x38, 0x46, - 0x02, 0x22, 0xA2, 0x5E, 0x90, 0x42, 0xEF, 0xD9, 0x49, 0x1C, 0x06, 0x20, 0x20, 0x5E, 0x81, 0x42, - 0xE7, 0xD9, 0x28, 0x8B, 0x00, 0x28, 0x53, 0xD0, 0x02, 0x20, 0x00, 0x21, 0x20, 0x5E, 0x61, 0x5E, - 0x88, 0x42, 0x06, 0xD1, 0x06, 0x22, 0x04, 0x26, 0xA2, 0x5E, 0xA6, 0x5F, 0x92, 0x1B, 0x03, 0x2A, - 0x46, 0xDC, 0x40, 0x1A, 0x03, 0x28, 0x07, 0xDD, 0x06, 0x20, 0x04, 0x21, 0x20, 0x5E, 0x61, 0x5E, - 0x00, 0xE0, 0x3D, 0xE0, 0x88, 0x42, 0x3B, 0xD0, 0x24, 0x4E, 0xA8, 0x8B, 0x40, 0x3E, 0xF1, 0x7D, - 0x88, 0x42, 0x00, 0xD3, 0x33, 0x70, 0xFD, 0xF7, 0x41, 0xFE, 0x29, 0x8B, 0x08, 0x1A, 0x28, 0x83, - 0x31, 0x7E, 0x4A, 0x00, 0x1D, 0x49, 0x40, 0x31, 0x4B, 0x69, 0x98, 0x52, 0x18, 0x20, 0x28, 0x5E, - 0xF2, 0x7C, 0x90, 0x42, 0x02, 0xDD, 0xA0, 0x8A, 0x40, 0x1C, 0xA0, 0x82, 0xEB, 0x8B, 0x0A, 0x69, - 0x20, 0x88, 0xD0, 0x54, 0xE8, 0x8B, 0x40, 0x1C, 0x80, 0xB2, 0xE8, 0x83, 0x0B, 0x69, 0x62, 0x88, - 0x1A, 0x54, 0xE8, 0x8B, 0x40, 0x1C, 0x80, 0xB2, 0xE8, 0x83, 0x0B, 0x69, 0xA2, 0x88, 0x1A, 0x54, - 0xE8, 0x8B, 0x40, 0x1C, 0x80, 0xB2, 0xE8, 0x83, 0x09, 0x69, 0xE2, 0x88, 0x0A, 0x54, 0xE8, 0x8B, - 0x40, 0x1C, 0xE8, 0x83, 0x30, 0x7E, 0x40, 0x1C, 0xC0, 0xB2, 0x30, 0x76, 0x0A, 0x28, 0x0B, 0xD2, - 0x06, 0x48, 0x40, 0x30, 0x81, 0x69, 0x49, 0x1C, 0x81, 0x61, 0x04, 0x49, 0x00, 0x9A, 0x40, 0x31, - 0x88, 0x69, 0x90, 0x42, 0x00, 0xD2, 0x2F, 0xE7, 0xF8, 0xBD, 0x00, 0x00, 0x78, 0x01, 0x00, 0x20, - 0xF0, 0xB5, 0x00, 0x20, 0xF9, 0x4D, 0x93, 0xB0, 0x43, 0x1E, 0x02, 0x46, 0xEC, 0x69, 0x41, 0x00, - 0x63, 0x52, 0x2C, 0x6A, 0x63, 0x52, 0x44, 0x1C, 0x69, 0x6A, 0xA4, 0xB2, 0x0A, 0x54, 0x20, 0x46, - 0x0A, 0x2C, 0xF3, 0xD3, 0xF1, 0x48, 0x80, 0x38, 0x04, 0x46, 0x01, 0x7E, 0x40, 0x34, 0xE1, 0x83, - 0x89, 0xB2, 0x00, 0x29, 0x7C, 0xD0, 0x00, 0x22, 0x62, 0x83, 0xAA, 0x61, 0xC7, 0x7C, 0x10, 0x46, - 0x6E, 0x69, 0x0A, 0xE0, 0x42, 0x00, 0xB2, 0x5E, 0xBA, 0x42, 0x04, 0xDD, 0x01, 0x22, 0x63, 0x8B, - 0x82, 0x40, 0x1A, 0x43, 0x62, 0x83, 0x40, 0x1C, 0xA8, 0x61, 0x88, 0x42, 0xF2, 0xDB, 0x00, 0x20, - 0x07, 0x90, 0x60, 0x8B, 0x00, 0x22, 0x05, 0x90, 0x62, 0x83, 0x06, 0x92, 0x01, 0x29, 0x18, 0xD1, - 0x28, 0x69, 0x01, 0x78, 0x00, 0x29, 0x01, 0xD0, 0x49, 0x1E, 0x01, 0x70, 0xDB, 0x4B, 0x41, 0x78, - 0x80, 0x3B, 0x1E, 0x7C, 0xB1, 0x42, 0x01, 0xD2, 0x49, 0x1C, 0x41, 0x70, 0x81, 0x78, 0x00, 0x29, - 0x01, 0xD0, 0x49, 0x1E, 0x81, 0x70, 0xC1, 0x78, 0x5B, 0x7C, 0x99, 0x42, 0x01, 0xD2, 0x49, 0x1C, - 0xC1, 0x70, 0x00, 0x20, 0xA8, 0x61, 0xD2, 0x48, 0x12, 0x90, 0xD0, 0x48, 0x20, 0x38, 0x11, 0x90, - 0x60, 0xE3, 0x82, 0x04, 0xCD, 0x49, 0x12, 0x0C, 0x15, 0x46, 0x09, 0x69, 0x11, 0x9B, 0x4E, 0x5D, - 0x1E, 0x80, 0x52, 0x1C, 0x92, 0xB2, 0x10, 0x96, 0x8B, 0x5C, 0x11, 0x9D, 0x52, 0x1C, 0x6B, 0x80, - 0x92, 0xB2, 0x8F, 0x5C, 0x11, 0x9D, 0x52, 0x1C, 0xAF, 0x80, 0x92, 0xB2, 0x0F, 0x97, 0x89, 0x5C, - 0x11, 0x9A, 0x9C, 0x46, 0xD1, 0x80, 0x9A, 0x19, 0xD3, 0x0F, 0x9A, 0x18, 0xC1, 0x4B, 0x0E, 0x91, - 0x52, 0x10, 0x1A, 0x54, 0x79, 0x18, 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, 0x1A, 0x46, 0x0A, 0x32, - 0x00, 0x23, 0x11, 0x54, 0x1E, 0x46, 0x1D, 0x46, 0x23, 0xE0, 0x10, 0x98, 0x82, 0xB2, 0x1C, 0xE0, - 0xB6, 0x48, 0xB6, 0x49, 0x80, 0x38, 0x00, 0x7C, 0x49, 0x68, 0x80, 0x1C, 0x78, 0x43, 0x80, 0x18, - 0x00, 0x04, 0xC0, 0x0B, 0x08, 0x5E, 0xA0, 0x82, 0x10, 0x28, 0x02, 0xDA, 0x00, 0x20, 0x01, 0xE0, - 0x27, 0xE3, 0x10, 0x38, 0x60, 0x82, 0x00, 0xB2, 0x01, 0x46, 0x79, 0x43, 0x8E, 0x19, 0x2D, 0x18, - 0x51, 0x1C, 0x50, 0x43, 0x89, 0xB2, 0xC3, 0x18, 0x0A, 0x46, 0x62, 0x45, 0xE0, 0xDD, 0x7F, 0x1C, - 0xBF, 0xB2, 0x0E, 0x98, 0x87, 0x42, 0xD8, 0xDD, 0x10, 0x98, 0x80, 0xB2, 0x5D, 0xE0, 0x0F, 0x99, - 0x8F, 0xB2, 0xA2, 0x49, 0x04, 0x97, 0x80, 0x39, 0x09, 0x7C, 0x0D, 0x91, 0x8A, 0x1C, 0x57, 0x43, - 0x0C, 0x91, 0x39, 0x18, 0x8F, 0xB2, 0x0B, 0x92, 0x9C, 0x49, 0x7A, 0x00, 0x49, 0x68, 0x0A, 0x91, - 0x8A, 0x5E, 0x8E, 0x46, 0x52, 0x10, 0xE2, 0x82, 0x0C, 0x99, 0x7F, 0x1A, 0xBF, 0x1E, 0x3F, 0x04, - 0xFF, 0x0B, 0x71, 0x46, 0xC9, 0x5F, 0xA1, 0x82, 0x91, 0x42, 0x00, 0xDB, 0x11, 0x46, 0xA1, 0x82, - 0x10, 0x29, 0x01, 0xDA, 0x00, 0x21, 0x00, 0xE0, 0x10, 0x39, 0x61, 0x82, 0x04, 0x99, 0x49, 0x1E, - 0x8A, 0xB2, 0x12, 0x21, 0x61, 0x5E, 0x4A, 0x43, 0x92, 0x19, 0x6F, 0x18, 0x02, 0x92, 0x41, 0x43, - 0x0E, 0x9A, 0xCB, 0x18, 0x0B, 0x99, 0x92, 0xB2, 0x51, 0x43, 0x09, 0x18, 0x8D, 0xB2, 0x0A, 0x9E, - 0x69, 0x00, 0x71, 0x5E, 0x49, 0x10, 0xE1, 0x82, 0x0D, 0x9E, 0xAD, 0x19, 0xAD, 0x1C, 0x2D, 0x04, - 0x0A, 0x9E, 0xED, 0x0B, 0x75, 0x5F, 0xA5, 0x82, 0x8D, 0x42, 0x00, 0xDB, 0x0D, 0x46, 0xA5, 0x82, - 0x10, 0x2D, 0x02, 0xDA, 0x00, 0x21, 0x61, 0x82, 0x01, 0xE0, 0x10, 0x3D, 0x65, 0x82, 0x52, 0x1C, - 0x12, 0x21, 0x96, 0xB2, 0x61, 0x5E, 0x02, 0x46, 0x0D, 0x46, 0x75, 0x43, 0x02, 0x9E, 0x40, 0x1C, - 0xAE, 0x19, 0x7D, 0x18, 0x51, 0x43, 0x80, 0xB2, 0xCB, 0x18, 0x60, 0x45, 0x9F, 0xDD, 0x0F, 0x98, - 0x87, 0xB2, 0x54, 0xE0, 0x10, 0x98, 0x81, 0xB2, 0x70, 0x48, 0x03, 0x91, 0x80, 0x38, 0x00, 0x7C, - 0x80, 0x1C, 0x78, 0x43, 0x41, 0x18, 0x09, 0x90, 0x8A, 0xB2, 0x6C, 0x48, 0x51, 0x00, 0x40, 0x68, - 0x08, 0x90, 0x41, 0x5E, 0x52, 0x1E, 0x49, 0x10, 0x12, 0x04, 0xE1, 0x82, 0xD2, 0x0B, 0x80, 0x5E, - 0xA0, 0x82, 0x88, 0x42, 0x00, 0xDB, 0x08, 0x46, 0xA0, 0x82, 0x10, 0x28, 0x01, 0xDA, 0x00, 0x20, - 0x00, 0xE0, 0x10, 0x38, 0x60, 0x82, 0x03, 0x98, 0x40, 0x1E, 0x81, 0xB2, 0x12, 0x20, 0x20, 0x5E, - 0x02, 0x46, 0x7A, 0x43, 0x96, 0x19, 0x2A, 0x18, 0x01, 0x92, 0x62, 0x46, 0x09, 0x9D, 0x92, 0xB2, - 0x48, 0x43, 0xAD, 0x18, 0xA9, 0xB2, 0xC3, 0x18, 0x48, 0x00, 0x08, 0x9D, 0x49, 0x1C, 0x28, 0x5E, - 0x09, 0x04, 0x40, 0x10, 0xE0, 0x82, 0x08, 0x9D, 0xC9, 0x0B, 0x69, 0x5E, 0xA1, 0x82, 0x81, 0x42, - 0x00, 0xDB, 0x01, 0x46, 0xA1, 0x82, 0x10, 0x29, 0x02, 0xDA, 0x00, 0x20, 0x60, 0x82, 0x01, 0xE0, - 0x10, 0x39, 0x61, 0x82, 0x12, 0x20, 0x20, 0x5E, 0x01, 0x9D, 0x01, 0x46, 0x79, 0x43, 0x52, 0x1C, - 0x92, 0xB2, 0x2D, 0x18, 0x7F, 0x1C, 0x8E, 0x19, 0x50, 0x43, 0xBF, 0xB2, 0xC3, 0x18, 0x0E, 0x98, - 0x87, 0x42, 0xA7, 0xDD, 0x00, 0x2D, 0x00, 0xD1, 0x01, 0x25, 0x58, 0x02, 0x29, 0x46, 0xF9, 0xF7, - 0x9D, 0xFC, 0xFF, 0x38, 0x01, 0x38, 0x07, 0xB2, 0x70, 0x02, 0x29, 0x46, 0xF9, 0xF7, 0x96, 0xFC, - 0xFF, 0x38, 0x01, 0x38, 0x06, 0xB2, 0xFF, 0x20, 0x00, 0x01, 0x85, 0x42, 0x01, 0xD3, 0xFF, 0x20, - 0x05, 0xE0, 0x28, 0x11, 0x00, 0xB2, 0x00, 0x90, 0x01, 0x28, 0x01, 0xDA, 0x01, 0x20, 0x00, 0x90, - 0x00, 0x2F, 0x01, 0xDA, 0x00, 0x27, 0x04, 0xE0, 0x60, 0x89, 0x87, 0x42, 0x01, 0xDB, 0x40, 0x1E, - 0x07, 0xB2, 0x00, 0x2E, 0x00, 0xDA, 0x00, 0x26, 0xA5, 0x89, 0xAE, 0x42, 0x01, 0xDB, 0x68, 0x1E, - 0x06, 0xB2, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x5E, 0xD1, 0x2C, 0x4A, 0x26, 0x20, 0x80, 0x3A, - 0x10, 0x5E, 0x03, 0x21, 0x09, 0x02, 0x43, 0x18, 0x9F, 0x42, 0x0F, 0xDA, 0x87, 0x42, 0x0D, 0xDB, - 0xC3, 0x1B, 0x5B, 0x18, 0x5D, 0x00, 0x5B, 0x19, 0xDD, 0x0F, 0xEB, 0x18, 0x5B, 0x10, 0xC3, 0x1A, - 0x5B, 0x18, 0x1F, 0xB2, 0x87, 0x42, 0x16, 0xDA, 0x07, 0x46, 0x14, 0xE0, 0x2A, 0x20, 0x10, 0x5E, - 0x43, 0x1A, 0x9F, 0x42, 0x0F, 0xDD, 0x87, 0x42, 0x0D, 0xDA, 0x3B, 0x1A, 0x5B, 0x18, 0x5D, 0x00, - 0x5B, 0x19, 0xDD, 0x0F, 0xEB, 0x18, 0x5B, 0x10, 0x1B, 0x18, 0x5B, 0x1A, 0x1F, 0xB2, 0x87, 0x42, - 0x01, 0xDB, 0x40, 0x1E, 0x07, 0xB2, 0x28, 0x20, 0x10, 0x5E, 0x43, 0x18, 0x9E, 0x42, 0x0F, 0xDA, - 0x86, 0x42, 0x0D, 0xDB, 0x82, 0x1B, 0x52, 0x18, 0x53, 0x00, 0xD2, 0x18, 0xD3, 0x0F, 0x9A, 0x18, - 0x52, 0x10, 0x82, 0x1A, 0x51, 0x18, 0x0E, 0xB2, 0x86, 0x42, 0x00, 0xDA, 0x06, 0x46, 0xBB, 0xE1, - 0x2C, 0x20, 0x10, 0x5E, 0x42, 0x1A, 0x96, 0x42, 0xF9, 0xDD, 0x86, 0x42, 0xF7, 0xDA, 0x32, 0x1A, - 0x52, 0x18, 0x53, 0x00, 0xD2, 0x18, 0xD3, 0x0F, 0x9A, 0x18, 0x52, 0x10, 0x12, 0x18, 0x51, 0x1A, - 0x0E, 0xB2, 0x86, 0x42, 0xEB, 0xDB, 0x40, 0x1E, 0xA5, 0xE1, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x20, - 0x34, 0x04, 0x00, 0x20, 0x4A, 0x07, 0x00, 0x20, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x01, 0x28, - 0x7E, 0xD1, 0xE1, 0x48, 0x26, 0x25, 0x45, 0x5F, 0x01, 0x20, 0x80, 0x02, 0x28, 0x18, 0x87, 0x42, - 0x2F, 0xDA, 0xAF, 0x42, 0x2D, 0xDB, 0xE8, 0x1B, 0x01, 0x27, 0xBF, 0x02, 0xC0, 0x19, 0x80, 0xB2, - 0xB9, 0x10, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, 0xF9, 0xF7, 0xF6, 0xFB, - 0x28, 0x1A, 0xC0, 0x19, 0x18, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, 0x09, 0xD8, 0xD3, 0x49, - 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, 0xF3, 0xFB, 0xD1, 0x49, 0x28, 0x1A, 0x40, 0x18, - 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF9, 0xF7, - 0xE7, 0xFB, 0x28, 0x1A, 0xFF, 0x30, 0x79, 0x30, 0x07, 0xB2, 0xAF, 0x42, 0x39, 0xDA, 0x2F, 0x46, - 0x37, 0xE0, 0xC5, 0x49, 0x2A, 0x25, 0x4D, 0x5F, 0x01, 0x21, 0x89, 0x02, 0x6A, 0x1A, 0x97, 0x42, - 0x2F, 0xDD, 0xAF, 0x42, 0x2D, 0xDA, 0x78, 0x1B, 0x40, 0x18, 0x0F, 0x46, 0x80, 0xB2, 0x89, 0x10, - 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, 0xF9, 0xF7, 0xBF, 0xFB, 0x40, 0x19, - 0xC0, 0x1B, 0x19, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, 0x0A, 0xD8, 0xB7, 0x49, 0x80, 0x00, - 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, 0xBC, 0xFB, 0xB5, 0x49, 0x40, 0x19, 0x49, 0x42, 0x40, 0x18, - 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF9, 0xF7, - 0xAF, 0xFB, 0x40, 0x19, 0xFF, 0x38, 0x79, 0x38, 0x07, 0xB2, 0xAF, 0x42, 0x01, 0xDB, 0x6D, 0x1E, - 0x2F, 0xB2, 0xA9, 0x49, 0x28, 0x25, 0x4D, 0x5F, 0x01, 0x20, 0x80, 0x02, 0x2A, 0x18, 0x96, 0x42, - 0x31, 0xDA, 0xAE, 0x42, 0x2F, 0xDB, 0xA9, 0x1B, 0x06, 0x46, 0x08, 0x18, 0x80, 0xB2, 0x00, 0xE0, - 0x60, 0xE0, 0xFF, 0x21, 0x01, 0x31, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, - 0xF9, 0xF7, 0x84, 0xFB, 0x28, 0x1A, 0x80, 0x19, 0x18, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, - 0x09, 0xD8, 0x9A, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, 0x81, 0xFB, 0x98, 0x49, + 0x68, 0x78, 0x06, 0x49, 0x49, 0x78, 0x88, 0x42, 0x02, 0xD1, 0xA8, 0x68, 0x80, 0x47, 0x70, 0xBD, + 0x64, 0x1C, 0x0D, 0x2C, 0xE7, 0xD3, 0xFA, 0xE7, 0x58, 0x02, 0x00, 0x20, 0x64, 0x03, 0x00, 0x20, + 0x0B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, 0x07, 0x20, 0x0A, 0x49, 0x08, 0x60, 0x0D, 0xE0, + 0x0F, 0x20, 0x08, 0x49, 0x08, 0x60, 0x06, 0x49, 0x09, 0x78, 0x48, 0x06, 0x40, 0x0E, 0x06, 0x49, + 0x89, 0x68, 0xC9, 0x09, 0xC9, 0x01, 0x01, 0x43, 0x03, 0x4A, 0x91, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x6C, 0x03, 0x00, 0x20, 0x60, 0x03, 0x00, 0x20, 0x00, 0x00, 0x06, 0x40, 0x70, 0xB5, 0x00, 0x24, + 0x15, 0xE0, 0x20, 0x01, 0x0B, 0x49, 0x45, 0x18, 0xE8, 0x68, 0x00, 0x28, 0x0E, 0xD0, 0x29, 0x78, + 0x09, 0x48, 0x00, 0x78, 0x60, 0x22, 0x10, 0x40, 0x81, 0x42, 0x07, 0xD1, 0x68, 0x78, 0x06, 0x49, + 0x49, 0x78, 0x88, 0x42, 0x02, 0xD1, 0xE8, 0x68, 0x80, 0x47, 0x70, 0xBD, 0x64, 0x1C, 0x0D, 0x2C, + 0xE7, 0xD3, 0xFA, 0xE7, 0x58, 0x02, 0x00, 0x20, 0x64, 0x03, 0x00, 0x20, 0xF8, 0xB5, 0x00, 0x21, + 0x08, 0x46, 0x00, 0xF0, 0x85, 0xF9, 0x07, 0x46, 0x38, 0x01, 0x23, 0x49, 0x40, 0x18, 0xC0, 0x6A, + 0x01, 0x21, 0x08, 0x43, 0x39, 0x01, 0x20, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x80, 0x21, 0x00, 0x20, + 0x00, 0xF0, 0x76, 0xF9, 0x07, 0x46, 0x38, 0x01, 0x1B, 0x49, 0x40, 0x18, 0xC0, 0x6A, 0x01, 0x21, + 0x08, 0x43, 0x39, 0x01, 0x18, 0x4A, 0x89, 0x18, 0xC8, 0x62, 0x18, 0x48, 0x00, 0x68, 0x07, 0x28, + 0x02, 0xDA, 0xFF, 0xF7, 0x5B, 0xFF, 0xF8, 0xBD, 0x15, 0x48, 0x06, 0x6D, 0x00, 0x24, 0x03, 0xE0, + 0x30, 0x5D, 0x14, 0x49, 0x08, 0x55, 0x64, 0x1C, 0x08, 0x2C, 0xF9, 0xD3, 0x00, 0x24, 0x15, 0xE0, + 0x20, 0x01, 0x11, 0x49, 0x45, 0x18, 0x68, 0x68, 0x00, 0x28, 0x0E, 0xD0, 0x29, 0x78, 0x0D, 0x48, + 0x00, 0x78, 0x60, 0x22, 0x10, 0x40, 0x81, 0x42, 0x07, 0xD1, 0x68, 0x78, 0x09, 0x49, 0x49, 0x78, + 0x88, 0x42, 0x02, 0xD1, 0x68, 0x68, 0x80, 0x47, 0xDD, 0xE7, 0x64, 0x1C, 0x0D, 0x2C, 0xE7, 0xD3, + 0xFF, 0xF7, 0x34, 0xFF, 0xD7, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x60, 0x03, 0x00, 0x20, + 0xBC, 0x19, 0x00, 0x20, 0x64, 0x03, 0x00, 0x20, 0x58, 0x02, 0x00, 0x20, 0x00, 0xBF, 0xFE, 0xE7, + 0x00, 0xB5, 0x01, 0x22, 0x02, 0x49, 0x00, 0x20, 0x00, 0xF0, 0x6A, 0xF8, 0x00, 0xBD, 0x00, 0x00, + 0x6D, 0x03, 0x00, 0x20, 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xB5, 0x0A, 0x48, + 0x00, 0x68, 0x07, 0x28, 0x0C, 0xD1, 0x09, 0x48, 0x80, 0x78, 0x09, 0x49, 0x08, 0x70, 0x00, 0x22, + 0x11, 0x46, 0x10, 0x46, 0x00, 0xF0, 0x54, 0xF8, 0x0F, 0x20, 0x03, 0x49, 0x08, 0x60, 0x01, 0xE0, + 0xFF, 0xF7, 0x04, 0xFF, 0x00, 0xBD, 0x00, 0x00, 0x60, 0x03, 0x00, 0x20, 0x64, 0x03, 0x00, 0x20, + 0x6C, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x1D, 0x48, 0x00, 0x68, 0x40, 0x68, 0x00, 0x28, 0x06, 0xD0, + 0x1B, 0x4A, 0x90, 0x78, 0x19, 0x4A, 0x12, 0x68, 0x51, 0x68, 0x88, 0x47, 0x00, 0xE0, 0x01, 0x20, + 0x04, 0x46, 0x17, 0x48, 0x80, 0x78, 0x00, 0x28, 0x0C, 0xD1, 0x0F, 0x20, 0x15, 0x49, 0x08, 0x60, + 0x13, 0x48, 0x80, 0x78, 0x14, 0x49, 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, 0x10, 0x46, 0x00, 0xF0, + 0x27, 0xF8, 0x19, 0xE0, 0x00, 0x2C, 0x15, 0xD0, 0x1F, 0x20, 0x0E, 0x49, 0x08, 0x60, 0x0B, 0x48, + 0x00, 0x68, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x08, 0x49, 0x09, 0x68, 0x08, 0x68, 0x80, 0x47, + 0x07, 0x48, 0x80, 0x78, 0x08, 0x49, 0x08, 0x70, 0x00, 0x22, 0x11, 0x46, 0x10, 0x46, 0x00, 0xF0, + 0x0F, 0xF8, 0x01, 0xE0, 0xFF, 0xF7, 0xC2, 0xFE, 0x10, 0xBD, 0x00, 0x00, 0x70, 0x03, 0x00, 0x20, + 0x64, 0x03, 0x00, 0x20, 0x60, 0x03, 0x00, 0x20, 0x6D, 0x03, 0x00, 0x20, 0x00, 0xBF, 0xFE, 0xE7, + 0xF0, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x80, 0x21, 0x20, 0x46, 0x00, 0xF0, 0xB8, 0xF8, + 0x07, 0x46, 0x00, 0x2D, 0x0A, 0xD0, 0x00, 0x2E, 0x08, 0xD0, 0x0C, 0x21, 0x79, 0x43, 0x20, 0x4A, + 0x89, 0x18, 0x32, 0x46, 0x88, 0x68, 0x29, 0x46, 0x06, 0xF0, 0x98, 0xFF, 0x0C, 0x20, 0x78, 0x43, + 0x1B, 0x49, 0x40, 0x18, 0x80, 0x68, 0x1B, 0x49, 0x40, 0x1A, 0x39, 0x01, 0x1A, 0x4A, 0x89, 0x18, + 0x08, 0x62, 0x00, 0x2D, 0x06, 0xD1, 0x00, 0x2E, 0x04, 0xD1, 0x00, 0x20, 0xA1, 0x00, 0x17, 0x4A, + 0x50, 0x50, 0x0A, 0xE0, 0xA0, 0x00, 0x15, 0x49, 0x08, 0x58, 0x00, 0x28, 0x01, 0xD1, 0x01, 0x20, + 0x00, 0xE0, 0x00, 0x20, 0xA1, 0x00, 0x11, 0x4A, 0x50, 0x50, 0xA0, 0x00, 0x0F, 0x49, 0x08, 0x58, + 0x00, 0x28, 0x06, 0xD0, 0x38, 0x01, 0x0C, 0x49, 0x40, 0x18, 0x80, 0x6A, 0x0C, 0x49, 0x08, 0x40, + 0x05, 0xE0, 0x38, 0x01, 0x08, 0x49, 0x40, 0x18, 0x80, 0x6A, 0x80, 0x21, 0x08, 0x43, 0x39, 0x01, + 0x05, 0x4A, 0x89, 0x18, 0x88, 0x62, 0x38, 0x01, 0x11, 0x46, 0x40, 0x18, 0x46, 0x62, 0xF0, 0xBD, + 0xBC, 0x19, 0x00, 0x20, 0x00, 0x01, 0x06, 0x40, 0x00, 0x00, 0x06, 0x40, 0x10, 0x1A, 0x00, 0x20, + 0x7F, 0x03, 0x00, 0x00, 0xF8, 0xB5, 0x2C, 0x48, 0x00, 0x68, 0x2C, 0x49, 0x08, 0x40, 0x2A, 0x49, + 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0xC0, 0x0F, 0xC0, 0x07, 0x08, 0xD0, 0x01, 0x20, 0xC0, 0x07, + 0x27, 0x49, 0x48, 0x60, 0x01, 0x20, 0x27, 0x49, 0x08, 0x60, 0xFF, 0xF7, 0xC7, 0xFE, 0x24, 0x48, + 0x40, 0x68, 0x21, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0xFF, 0x21, 0x09, 0x04, 0x08, 0x40, + 0x1F, 0x49, 0x48, 0x60, 0x10, 0x27, 0x33, 0xE0, 0x01, 0x20, 0xB8, 0x40, 0x1A, 0x49, 0x09, 0x68, + 0x08, 0x42, 0x2C, 0xD0, 0x3D, 0x46, 0x10, 0x3D, 0x28, 0x01, 0x19, 0x49, 0x40, 0x18, 0x80, 0x6A, + 0x04, 0x07, 0x24, 0x0F, 0x68, 0x00, 0x29, 0x18, 0x09, 0x1D, 0x17, 0x48, 0x00, 0x68, 0xC8, 0x40, + 0x70, 0x21, 0x06, 0x46, 0x0E, 0x40, 0x00, 0x2E, 0x08, 0xD1, 0x00, 0x2C, 0x02, 0xD1, 0xFF, 0xF7, + 0x3F, 0xFE, 0x14, 0xE0, 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, 0x10, 0xE0, 0x20, 0x2E, 0x06, 0xD1, + 0x01, 0x20, 0xA1, 0x00, 0x0B, 0x4A, 0x50, 0x50, 0xFF, 0xF7, 0x70, 0xFE, 0x07, 0xE0, 0x60, 0x2E, + 0x05, 0xD1, 0x00, 0x20, 0xA1, 0x00, 0x07, 0x4A, 0x50, 0x50, 0xFF, 0xF7, 0x67, 0xFE, 0x7F, 0x1C, + 0x16, 0x2F, 0xC9, 0xDB, 0xF8, 0xBD, 0x00, 0x00, 0x5C, 0x03, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x80, + 0x00, 0x00, 0x06, 0x40, 0x10, 0x1A, 0x00, 0x20, 0x54, 0x03, 0x00, 0x20, 0x4C, 0x03, 0x00, 0x20, + 0x10, 0xB5, 0x03, 0x46, 0x00, 0x22, 0x0A, 0xE0, 0x0C, 0x20, 0x50, 0x43, 0x06, 0x4C, 0x24, 0x58, + 0x18, 0x46, 0x08, 0x43, 0x84, 0x42, 0x01, 0xD1, 0x10, 0x46, 0x10, 0xBD, 0x52, 0x1C, 0x06, 0x2A, + 0xF2, 0xD3, 0x02, 0x48, 0xF9, 0xE7, 0x00, 0x00, 0xBC, 0x19, 0x00, 0x20, 0x02, 0x99, 0xFF, 0xFF, + 0x30, 0xB5, 0x04, 0x46, 0x80, 0x21, 0x20, 0x46, 0xFF, 0xF7, 0xE2, 0xFF, 0x05, 0x46, 0x13, 0x48, + 0x85, 0x42, 0x0C, 0xD0, 0xA8, 0x00, 0x12, 0x49, 0x08, 0x58, 0x80, 0x05, 0x80, 0x0D, 0x29, 0x01, + 0x10, 0x4A, 0x89, 0x18, 0x88, 0x62, 0x01, 0x20, 0x29, 0x01, 0x89, 0x18, 0xC8, 0x62, 0x00, 0x21, + 0x20, 0x46, 0xFF, 0xF7, 0xCD, 0xFF, 0x05, 0x46, 0x08, 0x48, 0x85, 0x42, 0x0C, 0xD0, 0xA8, 0x00, + 0x07, 0x49, 0x08, 0x58, 0x80, 0x05, 0x80, 0x0D, 0x29, 0x01, 0x06, 0x4A, 0x89, 0x18, 0x88, 0x62, + 0x01, 0x20, 0x29, 0x01, 0x89, 0x18, 0xC8, 0x62, 0x30, 0xBD, 0x00, 0x00, 0x02, 0x99, 0xFF, 0xFF, + 0xA4, 0x19, 0x00, 0x20, 0x00, 0x00, 0x06, 0x40, 0x10, 0xB5, 0x01, 0x20, 0x80, 0x03, 0x05, 0x49, + 0x08, 0x62, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x03, 0x48, 0x00, 0x68, 0x80, 0x47, + 0x10, 0xBD, 0x00, 0x00, 0x40, 0x40, 0x00, 0x50, 0x0C, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x01, 0x20, + 0xC0, 0x03, 0x05, 0x49, 0x08, 0x62, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, 0x03, 0x48, + 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x00, 0x00, 0x40, 0x40, 0x00, 0x50, 0x10, 0x01, 0x00, 0x20, + 0xF8, 0xB5, 0x56, 0x48, 0x01, 0x7E, 0x00, 0x29, 0x7E, 0xD0, 0x07, 0x46, 0x00, 0x26, 0x80, 0x37, + 0x04, 0x46, 0x60, 0x34, 0x9C, 0xE0, 0x78, 0x69, 0xB5, 0x00, 0x42, 0x5D, 0x22, 0x80, 0x29, 0x18, + 0x48, 0x78, 0x60, 0x80, 0x88, 0x78, 0xA0, 0x80, 0xC9, 0x78, 0xE1, 0x80, 0x13, 0x46, 0x00, 0xF0, + 0xA3, 0xFD, 0x00, 0x90, 0x00, 0x23, 0xE3, 0x5E, 0x06, 0x21, 0x18, 0x46, 0x42, 0x1E, 0x04, 0x20, + 0x61, 0x5E, 0x20, 0x5E, 0x5B, 0x1E, 0x49, 0x1C, 0x40, 0x1E, 0x00, 0xF0, 0x95, 0xFD, 0x01, 0x46, + 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, + 0x03, 0xDD, 0x20, 0x88, 0x79, 0x69, 0x40, 0x1E, 0x48, 0x55, 0x02, 0x23, 0xE3, 0x5E, 0x06, 0x21, + 0x04, 0x20, 0x1A, 0x46, 0x61, 0x5E, 0x20, 0x5E, 0x00, 0xF0, 0x7E, 0xFD, 0x00, 0x90, 0x02, 0x23, + 0xE3, 0x5E, 0x06, 0x21, 0x18, 0x46, 0x42, 0x1C, 0x04, 0x20, 0x61, 0x5E, 0x20, 0x5E, 0x5B, 0x1C, + 0x49, 0x1C, 0x40, 0x1E, 0x00, 0xF0, 0x70, 0xFD, 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, + 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, 0x8A, 0x42, 0x04, 0xDD, 0x60, 0x88, 0x79, 0x69, + 0x40, 0x1C, 0x69, 0x18, 0x48, 0x70, 0x04, 0x21, 0x61, 0x5E, 0x02, 0x23, 0x00, 0x22, 0xE3, 0x5E, + 0xA2, 0x5E, 0x08, 0x46, 0x00, 0xF0, 0x58, 0xFD, 0x00, 0x90, 0x04, 0x20, 0x02, 0x23, 0x00, 0x22, + 0x20, 0x5E, 0xE3, 0x5E, 0xA2, 0x5E, 0x41, 0x1E, 0x5B, 0x1C, 0x52, 0x1E, 0x40, 0x1E, 0x00, 0xF0, + 0x4B, 0xFD, 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, + 0x82, 0x10, 0x8A, 0x42, 0x04, 0xDD, 0xA0, 0x88, 0x79, 0x69, 0x40, 0x1E, 0x69, 0x18, 0x88, 0x70, + 0x02, 0x23, 0xE3, 0x5E, 0x00, 0x22, 0x00, 0xE0, 0x27, 0xE0, 0x06, 0x21, 0x61, 0x5E, 0xA2, 0x5E, + 0x08, 0x46, 0x00, 0xF0, 0x31, 0xFD, 0x00, 0x90, 0x06, 0x20, 0x02, 0x23, 0x00, 0x22, 0x20, 0x5E, + 0xE3, 0x5E, 0xA2, 0x5E, 0x41, 0x1C, 0x5B, 0x1C, 0x52, 0x1E, 0x40, 0x1C, 0x00, 0xF0, 0x24, 0xFD, + 0x01, 0x46, 0x00, 0x98, 0x42, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x82, 0x10, + 0x8A, 0x42, 0x04, 0xDD, 0xE0, 0x88, 0x79, 0x69, 0x40, 0x1C, 0x69, 0x18, 0xC8, 0x70, 0x76, 0x1C, + 0x02, 0x48, 0x00, 0x7E, 0x86, 0x42, 0x00, 0xDA, 0x5D, 0xE7, 0xF8, 0xBD, 0x24, 0x01, 0x00, 0x20, + 0xF0, 0xB5, 0x87, 0xB0, 0xFF, 0x4F, 0x78, 0x7D, 0x0F, 0x28, 0x7E, 0xD8, 0x40, 0x1C, 0x78, 0x75, + 0x38, 0x46, 0x80, 0x30, 0xC5, 0x69, 0x83, 0x68, 0x68, 0x00, 0x3C, 0x46, 0x40, 0x34, 0x19, 0x5E, + 0x20, 0x46, 0x61, 0x82, 0x20, 0x38, 0xC2, 0x78, 0x18, 0x20, 0x20, 0x5E, 0x01, 0x2A, 0x05, 0xD1, + 0xCA, 0x17, 0x92, 0x0F, 0x86, 0x10, 0x51, 0x18, 0x89, 0x10, 0x09, 0xE0, 0x42, 0x00, 0x82, 0x18, + 0xD6, 0x17, 0xB6, 0x0F, 0xB2, 0x18, 0x92, 0x10, 0x16, 0xB2, 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, + 0x09, 0xB2, 0x01, 0x91, 0xB1, 0x10, 0xEB, 0x49, 0x3A, 0x7D, 0x09, 0x7C, 0xE9, 0x4A, 0x69, 0x18, + 0x80, 0x32, 0x89, 0x1C, 0xD1, 0x61, 0x12, 0x69, 0xE6, 0x4D, 0x94, 0x46, 0x52, 0x5C, 0x01, 0x27, + 0x60, 0x35, 0x01, 0x2A, 0x20, 0xD0, 0x4A, 0x00, 0x9A, 0x5E, 0x62, 0x82, 0xB2, 0x42, 0x19, 0xDD, + 0x82, 0x42, 0x00, 0xDD, 0x22, 0x83, 0xA0, 0x8B, 0x62, 0x46, 0x40, 0x1C, 0xA0, 0x83, 0x57, 0x54, + 0xDC, 0x49, 0xDC, 0x48, 0x09, 0x7C, 0x80, 0x30, 0x89, 0x1C, 0xC0, 0x69, 0xFC, 0xF7, 0x00, 0xFD, + 0x00, 0xB2, 0xA0, 0x82, 0x06, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, 0xE8, 0x80, 0xFF, 0xF7, + 0xA7, 0xFF, 0x01, 0xE0, 0x60, 0x46, 0x47, 0x54, 0xD2, 0x49, 0xD2, 0x4A, 0x80, 0x31, 0x12, 0x7C, + 0xC8, 0x69, 0x80, 0x1A, 0x40, 0x1E, 0xC8, 0x61, 0x0B, 0x69, 0x19, 0x5C, 0x01, 0x29, 0x25, 0xD0, + 0xCC, 0x4A, 0x41, 0x00, 0x80, 0x32, 0x92, 0x68, 0x51, 0x5E, 0x61, 0x82, 0xB1, 0x42, 0x1C, 0xDD, + 0x18, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0x21, 0x83, 0xA1, 0x8B, 0xC5, 0x4A, 0x49, 0x1C, + 0xA1, 0x83, 0x1F, 0x54, 0xC3, 0x48, 0x80, 0x32, 0x01, 0x7C, 0xD0, 0x69, 0x89, 0x1C, 0xFC, 0xF7, + 0xCF, 0xFC, 0x08, 0xB2, 0xA0, 0x82, 0x02, 0x21, 0x00, 0xE0, 0xA8, 0xE1, 0x69, 0x5E, 0x88, 0x42, + 0x00, 0xDD, 0x68, 0x80, 0xFF, 0xF7, 0x74, 0xFF, 0x00, 0xE0, 0x1F, 0x54, 0xB9, 0x49, 0xB9, 0x4A, + 0x80, 0x31, 0x12, 0x7C, 0xC8, 0x69, 0x80, 0x1A, 0xC0, 0x1E, 0xC8, 0x61, 0x0B, 0x69, 0x19, 0x5C, + 0x01, 0x29, 0x23, 0xD0, 0xB3, 0x4A, 0x41, 0x00, 0x80, 0x32, 0x92, 0x68, 0x51, 0x5E, 0x61, 0x82, + 0xB1, 0x42, 0x1A, 0xDD, 0x18, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0x21, 0x83, 0xA1, 0x8B, + 0xAC, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x1F, 0x54, 0xAA, 0x48, 0x80, 0x32, 0x01, 0x7C, 0xD0, 0x69, + 0x89, 0x1C, 0xFC, 0xF7, 0x9D, 0xFC, 0x00, 0xB2, 0xA0, 0x82, 0x04, 0x21, 0x69, 0x5E, 0x88, 0x42, + 0x00, 0xDA, 0xA8, 0x80, 0xFF, 0xF7, 0x44, 0xFF, 0x00, 0xE0, 0x1F, 0x54, 0xA1, 0x49, 0xA1, 0x4A, + 0x80, 0x31, 0x12, 0x7C, 0xC8, 0x69, 0x80, 0x18, 0x40, 0x1C, 0xC8, 0x61, 0x0B, 0x69, 0x19, 0x5C, + 0x01, 0x29, 0x23, 0xD0, 0x9B, 0x4A, 0x41, 0x00, 0x80, 0x32, 0x92, 0x68, 0x51, 0x5E, 0x61, 0x82, + 0xB1, 0x42, 0x1A, 0xDD, 0x18, 0x22, 0xA2, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0x21, 0x83, 0xA1, 0x8B, + 0x94, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x1F, 0x54, 0x92, 0x48, 0x80, 0x32, 0x01, 0x7C, 0xD0, 0x69, + 0x89, 0x1C, 0xFC, 0xF7, 0x6D, 0xFC, 0x08, 0xB2, 0xA0, 0x82, 0x00, 0x21, 0x69, 0x5E, 0x88, 0x42, + 0x00, 0xDA, 0x28, 0x80, 0xFF, 0xF7, 0x14, 0xFF, 0x00, 0xE0, 0x1F, 0x54, 0xF0, 0x10, 0x89, 0x4A, + 0x30, 0x1A, 0x88, 0x49, 0x06, 0xB2, 0x80, 0x32, 0x09, 0x7C, 0xD0, 0x69, 0x06, 0x91, 0x40, 0x1A, + 0x80, 0x1E, 0xD0, 0x61, 0x11, 0x69, 0x0A, 0x5C, 0x05, 0x91, 0x01, 0x2A, 0x40, 0xD0, 0x81, 0x49, + 0x42, 0x00, 0x80, 0x31, 0x89, 0x68, 0x8C, 0x46, 0x89, 0x5E, 0x61, 0x82, 0xB1, 0x42, 0x37, 0xDD, + 0x63, 0x46, 0xD3, 0x18, 0x02, 0x22, 0x9A, 0x5E, 0x52, 0x10, 0xA2, 0x82, 0x06, 0x9B, 0x96, 0x46, + 0xC3, 0x18, 0x5B, 0x00, 0x62, 0x46, 0x9A, 0x18, 0x04, 0x23, 0xD3, 0x5E, 0x72, 0x46, 0x5B, 0x10, + 0xE3, 0x82, 0xD2, 0x18, 0xA2, 0x82, 0x01, 0x9B, 0x9A, 0x42, 0x21, 0xDD, 0x18, 0x22, 0xA2, 0x5E, + 0x91, 0x42, 0x00, 0xDD, 0x21, 0x83, 0xA1, 0x8B, 0x6E, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x05, 0x99, + 0x80, 0x32, 0x0F, 0x54, 0x6B, 0x48, 0x01, 0x7C, 0xD0, 0x69, 0x89, 0x1C, 0xFC, 0xF7, 0x20, 0xFC, + 0x09, 0xB2, 0xA1, 0x82, 0x00, 0x22, 0xAA, 0x5E, 0x91, 0x42, 0x00, 0xDA, 0x29, 0x80, 0x00, 0xB2, + 0xA0, 0x82, 0x04, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDA, 0xA8, 0x80, 0xFF, 0xF7, 0xC0, 0xFE, + 0x60, 0x49, 0x80, 0x31, 0xC8, 0x69, 0x80, 0x1C, 0xC8, 0x61, 0x09, 0x69, 0x0A, 0x5C, 0x04, 0x91, + 0x01, 0x2A, 0x3F, 0xD0, 0x5B, 0x49, 0x42, 0x00, 0x80, 0x31, 0x89, 0x68, 0x8B, 0x5E, 0x63, 0x82, + 0x9C, 0x46, 0xB3, 0x42, 0x36, 0xDD, 0x53, 0x18, 0x20, 0x3B, 0x1E, 0x22, 0x9A, 0x5E, 0x55, 0x4B, + 0x52, 0x10, 0xA2, 0x82, 0x1B, 0x7C, 0xC3, 0x18, 0x5B, 0x00, 0x5B, 0x18, 0x04, 0x21, 0x59, 0x5E, + 0x49, 0x10, 0xE1, 0x82, 0x51, 0x18, 0xA1, 0x82, 0x01, 0x9A, 0x91, 0x42, 0x22, 0xDD, 0x18, 0x22, + 0xA2, 0x5E, 0x94, 0x45, 0x01, 0xDD, 0x61, 0x46, 0x21, 0x83, 0xA1, 0x8B, 0x49, 0x4A, 0x49, 0x1C, + 0xA1, 0x83, 0x04, 0x99, 0x80, 0x32, 0x0F, 0x54, 0x46, 0x48, 0x01, 0x7C, 0xD0, 0x69, 0x89, 0x1C, + 0xFC, 0xF7, 0xD6, 0xFB, 0x09, 0xB2, 0xA1, 0x82, 0x02, 0x22, 0xAA, 0x5E, 0x91, 0x42, 0x00, 0xDD, + 0x69, 0x80, 0x00, 0xB2, 0xA0, 0x82, 0x04, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDA, 0xA8, 0x80, + 0xFF, 0xF7, 0x76, 0xFE, 0x3B, 0x48, 0x3B, 0x49, 0x00, 0x7C, 0x80, 0x31, 0x03, 0x90, 0xCA, 0x69, + 0x40, 0x00, 0x80, 0x18, 0x00, 0x1D, 0xC8, 0x61, 0x09, 0x69, 0x0A, 0x5C, 0x02, 0x91, 0x01, 0x2A, + 0x3F, 0xD0, 0x34, 0x49, 0x42, 0x00, 0x80, 0x31, 0x89, 0x68, 0x8B, 0x5E, 0x63, 0x82, 0x9C, 0x46, + 0xB3, 0x42, 0x36, 0xDD, 0x53, 0x18, 0x20, 0x3B, 0x1E, 0x22, 0x9A, 0x5E, 0x52, 0x10, 0xA2, 0x82, + 0x03, 0x9B, 0xC3, 0x1A, 0x5B, 0x00, 0x5B, 0x18, 0x20, 0x3B, 0x1C, 0x21, 0x59, 0x5E, 0x49, 0x10, + 0xE1, 0x82, 0x51, 0x18, 0xA1, 0x82, 0x01, 0x9A, 0x91, 0x42, 0x22, 0xDD, 0x18, 0x22, 0xA2, 0x5E, + 0x94, 0x45, 0x01, 0xDD, 0x61, 0x46, 0x21, 0x83, 0xA1, 0x8B, 0x22, 0x4A, 0x49, 0x1C, 0xA1, 0x83, + 0x02, 0x99, 0x80, 0x32, 0x0F, 0x54, 0x1F, 0x48, 0x01, 0x7C, 0xD0, 0x69, 0x89, 0x1C, 0xFC, 0xF7, + 0x87, 0xFB, 0x09, 0xB2, 0xA1, 0x82, 0x02, 0x22, 0xAA, 0x5E, 0x91, 0x42, 0x00, 0xDD, 0x69, 0x80, + 0x00, 0xB2, 0xA0, 0x82, 0x06, 0x21, 0x69, 0x5E, 0x88, 0x42, 0x00, 0xDD, 0xE8, 0x80, 0xFF, 0xF7, + 0x27, 0xFE, 0x14, 0x49, 0x80, 0x31, 0xC8, 0x69, 0x80, 0x1E, 0xC8, 0x61, 0x09, 0x69, 0x0A, 0x5C, + 0x8C, 0x46, 0x01, 0x2A, 0x40, 0xD0, 0x0F, 0x49, 0x43, 0x00, 0x80, 0x31, 0x89, 0x68, 0xCA, 0x5E, + 0x62, 0x82, 0xB2, 0x42, 0x38, 0xDD, 0x5E, 0x18, 0x02, 0x23, 0xF3, 0x5E, 0x5E, 0x10, 0x09, 0x4B, + 0xA6, 0x82, 0x1B, 0x7C, 0xC3, 0x1A, 0x5B, 0x00, 0x59, 0x18, 0x20, 0x39, 0x1C, 0x23, 0xCB, 0x5E, + 0x59, 0x10, 0xE1, 0x82, 0x71, 0x18, 0xA1, 0x82, 0x01, 0x9B, 0x99, 0x42, 0x24, 0xDD, 0x18, 0x21, + 0x61, 0x5E, 0x01, 0xE0, 0x24, 0x01, 0x00, 0x20, 0x8A, 0x42, 0x00, 0xDD, 0x22, 0x83, 0xA1, 0x8B, + 0x14, 0x4A, 0x49, 0x1C, 0xA1, 0x83, 0x61, 0x46, 0x0F, 0x54, 0x10, 0x46, 0x80, 0x38, 0x01, 0x7C, + 0xD0, 0x69, 0x89, 0x1C, 0xFC, 0xF7, 0x3C, 0xFB, 0x09, 0xB2, 0xA1, 0x82, 0x00, 0x22, 0xAA, 0x5E, + 0x91, 0x42, 0x00, 0xDA, 0x29, 0x80, 0x00, 0xB2, 0xA0, 0x82, 0x06, 0x21, 0x69, 0x5E, 0x88, 0x42, + 0x00, 0xDD, 0xE8, 0x80, 0xFF, 0xF7, 0xDC, 0xFD, 0x06, 0x4A, 0x10, 0x46, 0x80, 0x38, 0x03, 0x7C, + 0xD1, 0x69, 0xC9, 0x1A, 0x49, 0x1E, 0xD1, 0x61, 0x41, 0x7D, 0x49, 0x1E, 0x41, 0x75, 0x07, 0xB0, + 0xF0, 0xBD, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x20, 0xF3, 0xB5, 0x85, 0xB0, 0x04, 0x46, 0x03, 0xAA, + 0x04, 0xA9, 0x00, 0xF0, 0x97, 0xFA, 0x5A, 0x49, 0x01, 0xAA, 0x08, 0x83, 0x02, 0xA9, 0x06, 0x98, + 0x00, 0xF0, 0x90, 0xFA, 0x56, 0x4A, 0x06, 0x9B, 0x40, 0x32, 0x50, 0x69, 0xA5, 0x00, 0x9E, 0x00, + 0x41, 0x5D, 0x83, 0x5D, 0x99, 0x42, 0x00, 0xD3, 0x19, 0x46, 0x51, 0x4C, 0x8C, 0x46, 0x20, 0x34, + 0x21, 0x80, 0x29, 0x18, 0x37, 0x18, 0x4B, 0x78, 0x78, 0x78, 0x83, 0x42, 0x00, 0xD8, 0x03, 0x46, + 0x63, 0x80, 0x88, 0x78, 0xBA, 0x78, 0x90, 0x42, 0x00, 0xD3, 0x10, 0x46, 0xA0, 0x80, 0xC9, 0x78, + 0xFA, 0x78, 0x91, 0x42, 0x00, 0xD8, 0x11, 0x46, 0xE1, 0x80, 0x62, 0x46, 0x5B, 0x1C, 0x52, 0x1E, + 0x49, 0x1C, 0x40, 0x1E, 0x04, 0xF0, 0xB2, 0xFB, 0x02, 0x23, 0x00, 0x22, 0x06, 0x21, 0x04, 0x20, + 0xE3, 0x5E, 0xA2, 0x5E, 0x61, 0x5E, 0x20, 0x5E, 0xFD, 0xF7, 0x46, 0xFB, 0x3C, 0x4A, 0x03, 0x98, + 0x40, 0x3A, 0x11, 0x7C, 0x03, 0x46, 0x89, 0x1C, 0x4B, 0x43, 0x04, 0x99, 0x17, 0x46, 0x5B, 0x18, + 0x80, 0x37, 0xFB, 0x61, 0x21, 0x80, 0x61, 0x80, 0xA0, 0x80, 0xE0, 0x80, 0x10, 0x46, 0x01, 0x21, + 0x20, 0x30, 0xC1, 0x70, 0x00, 0x20, 0x50, 0x75, 0xFF, 0xF7, 0x72, 0xFD, 0x00, 0x21, 0x61, 0x5E, + 0x02, 0x98, 0x88, 0x42, 0x5A, 0xDB, 0x02, 0x21, 0x61, 0x5E, 0x88, 0x42, 0x56, 0xDC, 0x04, 0x21, + 0x61, 0x5E, 0x01, 0x98, 0x88, 0x42, 0x51, 0xDB, 0x06, 0x21, 0x61, 0x5E, 0x88, 0x42, 0x4D, 0xDC, + 0x78, 0x69, 0x82, 0x5D, 0x41, 0x5D, 0x91, 0x42, 0x00, 0xD3, 0x11, 0x46, 0x41, 0x55, 0x78, 0x69, + 0x31, 0x18, 0x2A, 0x18, 0x49, 0x78, 0x50, 0x78, 0x88, 0x42, 0x00, 0xD8, 0x08, 0x46, 0x50, 0x70, + 0x78, 0x69, 0x31, 0x18, 0x8A, 0x78, 0x29, 0x18, 0x88, 0x78, 0x90, 0x42, 0x00, 0xD3, 0x10, 0x46, + 0x88, 0x70, 0x78, 0x69, 0x31, 0x18, 0x2A, 0x18, 0xC9, 0x78, 0xD0, 0x78, 0x88, 0x42, 0x00, 0xD8, + 0x08, 0x46, 0xD0, 0x70, 0x16, 0x4A, 0x06, 0x98, 0x40, 0x3A, 0x04, 0x90, 0x1F, 0xE0, 0xB9, 0x69, + 0x40, 0x00, 0x43, 0x18, 0x5B, 0x88, 0x0B, 0x52, 0x04, 0x98, 0x79, 0x69, 0x80, 0x00, 0x43, 0x18, + 0x1B, 0x79, 0x0B, 0x54, 0x04, 0x98, 0x79, 0x69, 0x80, 0x00, 0x40, 0x18, 0x41, 0x79, 0x41, 0x70, + 0x04, 0x98, 0x79, 0x69, 0x80, 0x00, 0x40, 0x18, 0x81, 0x79, 0x81, 0x70, 0x04, 0x98, 0x79, 0x69, + 0x80, 0x00, 0x40, 0x18, 0xC1, 0x79, 0xC1, 0x70, 0x04, 0x98, 0x40, 0x1C, 0x04, 0x90, 0x11, 0x7E, + 0x49, 0x1E, 0x88, 0x42, 0xDB, 0xDB, 0x10, 0x7E, 0x40, 0x1E, 0x10, 0x76, 0x07, 0xB0, 0xF0, 0xBD, + 0x64, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x1A, 0x4B, 0x02, 0x46, 0x1B, 0x7B, 0x08, 0x46, 0x19, 0x07, + 0x09, 0x0F, 0x03, 0x29, 0x0F, 0xD1, 0x00, 0x2A, 0x0E, 0xD0, 0x16, 0x4C, 0x01, 0x2A, 0x0E, 0xD0, + 0x02, 0x2A, 0x08, 0xD1, 0x00, 0x20, 0x05, 0xF0, 0xC5, 0xFA, 0x00, 0x20, 0x10, 0x49, 0x60, 0x70, + 0x20, 0x72, 0x60, 0x39, 0x48, 0x74, 0x10, 0xBD, 0x05, 0xF0, 0xB6, 0xFB, 0x10, 0xBD, 0x61, 0x79, + 0x00, 0x29, 0x11, 0xD0, 0x01, 0xF0, 0x90, 0xFF, 0xE0, 0x79, 0x10, 0x28, 0x06, 0xD2, 0x01, 0x21, + 0x61, 0x72, 0x40, 0x1C, 0xE0, 0x71, 0x00, 0xF0, 0x17, 0xFA, 0x05, 0xE0, 0xFD, 0xF7, 0x1A, 0xFB, + 0x01, 0xF0, 0x6E, 0xFC, 0x01, 0xF0, 0x58, 0xFC, 0x01, 0xF0, 0xE8, 0xFE, 0x10, 0xBD, 0x00, 0x00, + 0x54, 0x04, 0x00, 0x20, 0x80, 0x03, 0x00, 0x20, 0x70, 0xB5, 0x0C, 0x48, 0x05, 0x6A, 0x0B, 0x48, + 0x40, 0x30, 0x04, 0x6A, 0x03, 0x21, 0x89, 0x03, 0x20, 0x46, 0x88, 0x43, 0x04, 0x46, 0x07, 0x48, + 0x05, 0x62, 0x06, 0x48, 0x40, 0x30, 0x04, 0x62, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x04, 0xD0, + 0x21, 0x46, 0x28, 0x46, 0x02, 0x4A, 0x12, 0x68, 0x90, 0x47, 0x70, 0xBD, 0x00, 0x40, 0x00, 0x50, + 0x04, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x0A, 0x48, 0x04, 0x6A, 0x09, 0x48, 0x40, 0x30, 0x05, 0x6A, + 0x07, 0x48, 0x04, 0x62, 0x06, 0x48, 0x40, 0x30, 0x05, 0x62, 0x06, 0x48, 0x00, 0x68, 0x00, 0x28, + 0x04, 0xD0, 0x29, 0x46, 0x20, 0x46, 0x03, 0x4A, 0x12, 0x68, 0x90, 0x47, 0x70, 0xBD, 0x00, 0x00, + 0x80, 0x40, 0x00, 0x50, 0x08, 0x01, 0x00, 0x20, 0x0D, 0x48, 0x01, 0x7F, 0x03, 0x29, 0x01, 0xD0, + 0x02, 0x21, 0x01, 0x77, 0x00, 0x21, 0x01, 0x70, 0x41, 0x70, 0x0A, 0x48, 0x01, 0x6A, 0x42, 0x02, + 0x91, 0x43, 0x01, 0x62, 0x01, 0x6A, 0xC2, 0x01, 0x91, 0x43, 0x01, 0x62, 0x01, 0x68, 0x80, 0x22, + 0x91, 0x43, 0x01, 0x60, 0x01, 0x68, 0x52, 0x00, 0x91, 0x43, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x20, 0x00, 0x02, 0x00, 0x50, 0x30, 0xB5, 0x85, 0xB0, 0x10, 0x48, 0x04, 0x68, + 0x23, 0x20, 0x40, 0x01, 0x25, 0x18, 0x03, 0x22, 0x0E, 0x48, 0x03, 0x95, 0x02, 0x94, 0x04, 0x92, + 0x02, 0x88, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x95, 0x21, 0x09, 0x01, 0xA0, 0x20, + 0x00, 0x23, 0x00, 0xF0, 0x25, 0xFE, 0x07, 0x48, 0x01, 0x88, 0x20, 0x46, 0x01, 0xF0, 0x24, 0xFF, + 0x04, 0x48, 0x01, 0x88, 0x28, 0x46, 0x01, 0xF0, 0x1F, 0xFF, 0x05, 0xB0, 0x30, 0xBD, 0x00, 0x00, + 0xB0, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x05, 0x48, 0x80, 0x69, 0x40, 0x04, 0xC0, 0x0F, + 0x03, 0xD1, 0x03, 0x48, 0x00, 0x68, 0xC0, 0xB2, 0x70, 0x47, 0xFF, 0x20, 0xFC, 0xE7, 0x00, 0x00, + 0x00, 0x00, 0x15, 0x40, 0xFE, 0xB5, 0x30, 0x4A, 0x00, 0x20, 0x04, 0x25, 0x55, 0x5F, 0x14, 0x5E, + 0x94, 0x46, 0x60, 0x3A, 0x01, 0x95, 0x16, 0x7C, 0x62, 0x46, 0x02, 0x23, 0xD3, 0x5E, 0x2A, 0x4A, + 0xB6, 0x46, 0xB6, 0x1C, 0x20, 0x32, 0x00, 0x96, 0x92, 0x68, 0x01, 0x46, 0x01, 0x2D, 0x0B, 0xDB, + 0x6F, 0x1E, 0x77, 0x43, 0x25, 0x46, 0x05, 0xE0, 0x7E, 0x19, 0x76, 0x00, 0x96, 0x5F, 0x49, 0x1C, + 0x30, 0x18, 0x6D, 0x1C, 0x9D, 0x42, 0xF7, 0xDD, 0x65, 0x46, 0x06, 0x26, 0xAE, 0x5F, 0x1E, 0x4D, + 0xB4, 0x46, 0x60, 0x3D, 0x6D, 0x7C, 0xAE, 0x42, 0x0E, 0xDC, 0x65, 0x46, 0x00, 0x9E, 0x6D, 0x1C, + 0x75, 0x43, 0x2F, 0x46, 0x25, 0x46, 0x05, 0xE0, 0x7E, 0x19, 0x76, 0x00, 0x96, 0x5F, 0x49, 0x1C, + 0x80, 0x19, 0x6D, 0x1C, 0x9D, 0x42, 0xF7, 0xDD, 0x13, 0x4F, 0x64, 0x26, 0x60, 0x3F, 0x3D, 0x7C, + 0xBE, 0x5F, 0xAD, 0x1C, 0x6E, 0x43, 0x01, 0x2C, 0x0C, 0xDB, 0x64, 0x1E, 0x35, 0x19, 0x01, 0x9C, + 0x06, 0xE0, 0x6F, 0x00, 0xD7, 0x5F, 0x75, 0x44, 0xC0, 0x19, 0x49, 0x1C, 0xAD, 0x1C, 0x64, 0x1C, + 0x64, 0x45, 0xF6, 0xDD, 0x73, 0x45, 0x0C, 0xDC, 0x5B, 0x1C, 0xF4, 0x18, 0x01, 0x9B, 0x06, 0xE0, + 0x65, 0x00, 0x55, 0x5F, 0x74, 0x44, 0x40, 0x19, 0x49, 0x1C, 0xA4, 0x1C, 0x5B, 0x1C, 0x63, 0x45, + 0xF6, 0xDD, 0xFC, 0xF7, 0x35, 0xF9, 0xFE, 0xBD, 0x84, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x0A, 0x4D, + 0xFF, 0x20, 0xA8, 0x70, 0x09, 0x48, 0xA8, 0x84, 0x00, 0x24, 0xFE, 0xF7, 0x3B, 0xF8, 0xFF, 0xF7, + 0x83, 0xFF, 0xFF, 0x28, 0x03, 0xD0, 0x30, 0x21, 0x48, 0x43, 0xA8, 0x84, 0x70, 0xBD, 0x64, 0x1C, + 0x0A, 0x2C, 0xF2, 0xDB, 0x70, 0xBD, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x10, 0x27, 0x00, 0x00, + 0xC1, 0x07, 0xC2, 0x0F, 0x10, 0x18, 0x42, 0x10, 0x07, 0x48, 0x10, 0x18, 0x00, 0x78, 0x00, 0x29, + 0x02, 0xD0, 0x00, 0x07, 0x00, 0x0F, 0x00, 0xE0, 0x00, 0x09, 0x08, 0x28, 0x02, 0xDD, 0x00, 0x20, + 0xC0, 0x43, 0x70, 0x47, 0x40, 0x1E, 0x70, 0x47, 0x65, 0x04, 0x00, 0x20, 0xF0, 0xB5, 0x00, 0x22, + 0x13, 0x46, 0x3E, 0x4F, 0x14, 0xE0, 0x21, 0x7C, 0x58, 0x1C, 0x89, 0x1C, 0x48, 0x43, 0x00, 0x21, + 0x07, 0xE0, 0xFD, 0x68, 0x54, 0x00, 0x2C, 0x5B, 0x46, 0x00, 0xBD, 0x68, 0x49, 0x1C, 0x52, 0x1C, + 0xAC, 0x53, 0x36, 0x4C, 0x40, 0x1C, 0x80, 0x3C, 0x24, 0x7C, 0xA1, 0x42, 0xF1, 0xDB, 0x5B, 0x1C, + 0x32, 0x4C, 0x80, 0x3C, 0x60, 0x7C, 0x83, 0x42, 0xE5, 0xDB, 0x21, 0x46, 0x4D, 0x7C, 0x08, 0x7C, + 0x6D, 0x1C, 0x82, 0x1C, 0x55, 0x43, 0x80, 0x1C, 0x00, 0x23, 0x02, 0x26, 0x0C, 0xE0, 0x2B, 0x4C, + 0xBA, 0x68, 0x41, 0x00, 0x80, 0x3C, 0x24, 0x7D, 0x51, 0x5E, 0xA1, 0x42, 0x39, 0x69, 0x01, 0xDD, + 0x0B, 0x54, 0x00, 0xE0, 0x0E, 0x54, 0x40, 0x1C, 0xA8, 0x42, 0xF0, 0xDB, 0x24, 0x48, 0x01, 0x7E, + 0x00, 0x29, 0x42, 0xD0, 0xC1, 0x7D, 0x17, 0xE0, 0x20, 0x4A, 0x61, 0x46, 0x80, 0x3A, 0x14, 0x7C, + 0x82, 0x7D, 0xA4, 0x1C, 0x61, 0x43, 0x89, 0x18, 0x07, 0xE0, 0xBD, 0x68, 0x4C, 0x00, 0x2B, 0x53, + 0x3C, 0x69, 0x52, 0x1C, 0x4D, 0x1C, 0x66, 0x54, 0x29, 0x46, 0x84, 0x7D, 0x05, 0x7E, 0x64, 0x19, + 0x94, 0x42, 0xF2, 0xDC, 0x61, 0x46, 0x49, 0x1C, 0x8C, 0x46, 0xC1, 0x7D, 0x42, 0x7E, 0x8A, 0x18, + 0x62, 0x45, 0xE1, 0xDC, 0x01, 0x7F, 0x00, 0x29, 0x1F, 0xD0, 0xC1, 0x7E, 0x17, 0xE0, 0x0F, 0x4A, + 0x61, 0x46, 0x80, 0x3A, 0x14, 0x7C, 0x82, 0x7E, 0xA4, 0x1C, 0x61, 0x43, 0x89, 0x18, 0x07, 0xE0, + 0xBD, 0x68, 0x4C, 0x00, 0x2B, 0x53, 0x3C, 0x69, 0x52, 0x1C, 0x4D, 0x1C, 0x66, 0x54, 0x29, 0x46, + 0x84, 0x7E, 0x05, 0x7F, 0x64, 0x19, 0x94, 0x42, 0xF2, 0xDC, 0x61, 0x46, 0x49, 0x1C, 0x8C, 0x46, + 0xC1, 0x7E, 0x42, 0x7F, 0x8A, 0x18, 0x62, 0x45, 0xE1, 0xDC, 0xF0, 0xBD, 0xA4, 0x01, 0x00, 0x20, + 0x54, 0x04, 0x00, 0x20, 0xF7, 0xB5, 0x1B, 0x4E, 0x03, 0x46, 0x74, 0x69, 0x94, 0x46, 0x9B, 0x00, + 0x31, 0x46, 0x81, 0xB0, 0x20, 0x39, 0xE2, 0x5C, 0x0A, 0x80, 0x00, 0x92, 0x1A, 0x19, 0x57, 0x78, + 0x4F, 0x80, 0x93, 0x78, 0x8B, 0x80, 0xD2, 0x78, 0x0C, 0x46, 0x60, 0x3C, 0xCA, 0x80, 0x21, 0x7C, + 0x96, 0x46, 0x0A, 0x46, 0x00, 0x20, 0x89, 0x1C, 0x59, 0x43, 0xF1, 0x61, 0x15, 0xE0, 0x00, 0x99, + 0x0C, 0xE0, 0xF4, 0x69, 0xB5, 0x68, 0x64, 0x18, 0x64, 0x00, 0x2C, 0x5F, 0x84, 0x42, 0x04, 0xDD, + 0x20, 0x46, 0x02, 0x9C, 0x21, 0x60, 0x64, 0x46, 0x23, 0x60, 0x49, 0x1C, 0xB9, 0x42, 0xF0, 0xDD, + 0xF1, 0x69, 0x89, 0x18, 0x89, 0x1C, 0x5B, 0x1C, 0xF1, 0x61, 0x73, 0x45, 0xE7, 0xDD, 0x04, 0xB0, + 0xF0, 0xBD, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x20, 0xFF, 0xB5, 0x96, 0x46, 0x11, 0x49, 0x11, 0x4A, + 0x09, 0x7C, 0x80, 0x32, 0x05, 0x46, 0x8C, 0x46, 0x00, 0x20, 0x89, 0x1C, 0x69, 0x43, 0x14, 0x46, + 0xD1, 0x61, 0xA7, 0x68, 0x10, 0xE0, 0x71, 0x46, 0xD6, 0x69, 0x06, 0xE0, 0x74, 0x18, 0x64, 0x00, + 0x3C, 0x5F, 0x84, 0x42, 0x00, 0xDD, 0x20, 0x46, 0x49, 0x1C, 0x99, 0x42, 0xF6, 0xDD, 0x61, 0x46, + 0x71, 0x18, 0x89, 0x1C, 0x6D, 0x1C, 0xD1, 0x61, 0x01, 0x99, 0x8D, 0x42, 0xEB, 0xDD, 0x04, 0xB0, + 0xF0, 0xBD, 0x00, 0x00, 0x24, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x0D, 0x4F, 0x0B, 0x48, 0x38, 0x61, + 0x0C, 0x4A, 0x00, 0x20, 0x14, 0x46, 0x10, 0x3C, 0x7E, 0x79, 0x0C, 0xE0, 0x41, 0x00, 0x53, 0x5A, + 0x65, 0x5A, 0x5B, 0x19, 0x1B, 0x04, 0x5B, 0x0C, 0x53, 0x52, 0x51, 0x5A, 0x3B, 0x69, 0x99, 0x42, + 0x00, 0xD2, 0x39, 0x61, 0x40, 0x1C, 0xB0, 0x42, 0xF0, 0xDB, 0xF0, 0xBD, 0xFF, 0xFF, 0xFF, 0x7F, + 0x80, 0x03, 0x00, 0x20, 0x48, 0x1A, 0x00, 0x20, 0xF8, 0xB5, 0x00, 0x23, 0x69, 0x4E, 0xDB, 0x43, + 0x00, 0x20, 0x37, 0x46, 0x1C, 0x46, 0x80, 0x3F, 0x04, 0xE0, 0x00, 0x22, 0xF5, 0x6B, 0x41, 0x1C, + 0x2A, 0x54, 0x08, 0x46, 0x63, 0x4A, 0x1B, 0x21, 0x80, 0x3A, 0x51, 0x56, 0x88, 0x42, 0xF4, 0xDB, + 0x00, 0x21, 0x88, 0x00, 0x5F, 0x4E, 0x00, 0x90, 0x37, 0x6C, 0x5F, 0x4D, 0x3D, 0x50, 0xB5, 0x6B, + 0xFF, 0x22, 0x6A, 0x54, 0x5D, 0x4A, 0x48, 0x00, 0x12, 0x5E, 0x52, 0x1C, 0x6D, 0xD0, 0x5A, 0x4A, + 0x00, 0x26, 0x58, 0x4D, 0x3D, 0xE0, 0x59, 0x4C, 0x28, 0x3C, 0x25, 0x5E, 0x6D, 0x1C, 0x04, 0xD0, + 0x25, 0x46, 0x14, 0x35, 0x2D, 0x5E, 0x6D, 0x1C, 0x08, 0xD1, 0x54, 0x4D, 0x53, 0x4E, 0x2D, 0x5A, + 0x25, 0x52, 0x52, 0x4D, 0x14, 0x35, 0x2D, 0x5A, 0x14, 0x3E, 0x35, 0x52, 0x4D, 0x4E, 0x25, 0x5E, + 0x64, 0x46, 0xF6, 0x6A, 0x64, 0x00, 0x36, 0x5F, 0x4C, 0x4F, 0xAD, 0x19, 0xEE, 0x0F, 0x75, 0x19, + 0x3F, 0x5E, 0x6D, 0x10, 0x7D, 0x1B, 0xAE, 0x46, 0x46, 0x4E, 0x48, 0x4D, 0x36, 0x6B, 0x14, 0x3D, + 0x2D, 0x5E, 0x34, 0x5F, 0x45, 0x4F, 0x2C, 0x19, 0xE5, 0x0F, 0x2C, 0x19, 0x14, 0x37, 0x3F, 0x5E, + 0x64, 0x10, 0x3C, 0x1B, 0x75, 0x46, 0x6D, 0x43, 0x64, 0x43, 0x2C, 0x19, 0x94, 0x42, 0x05, 0xDA, + 0x3C, 0x4D, 0x63, 0x46, 0xAE, 0x6B, 0x22, 0x46, 0x73, 0x54, 0xEB, 0x69, 0x39, 0x4D, 0xEE, 0x69, + 0x76, 0x1C, 0xEE, 0x61, 0x37, 0x4D, 0x37, 0x4F, 0xED, 0x69, 0x80, 0x3F, 0x1B, 0x26, 0xBE, 0x57, + 0xAC, 0x46, 0xB5, 0x42, 0xB7, 0xDB, 0x80, 0x37, 0xFD, 0x6B, 0xEE, 0x5C, 0x76, 0x1C, 0xEE, 0x54, + 0x00, 0x9D, 0x3E, 0x6C, 0x72, 0x51, 0x3D, 0x68, 0xAA, 0x42, 0x16, 0xD9, 0x2F, 0x4C, 0x3E, 0x46, + 0x25, 0x5E, 0xF6, 0x6A, 0x5C, 0x00, 0x36, 0x5F, 0x2C, 0x4F, 0xAD, 0x1B, 0x29, 0x4E, 0x14, 0x37, + 0x36, 0x6B, 0x38, 0x5E, 0x34, 0x5F, 0x6D, 0x43, 0x00, 0x1B, 0x40, 0x43, 0x2C, 0x18, 0x94, 0x42, + 0x03, 0xDA, 0x24, 0x4A, 0x00, 0x98, 0x12, 0x6C, 0x14, 0x50, 0x49, 0x1C, 0x0A, 0x29, 0x80, 0xDB, + 0x00, 0x25, 0x38, 0xE0, 0x1F, 0x4E, 0xF0, 0x6B, 0x41, 0x57, 0x01, 0x29, 0x32, 0xDD, 0x00, 0x20, + 0xC0, 0x43, 0x02, 0x29, 0x02, 0xD1, 0x28, 0x46, 0x00, 0xF0, 0x3A, 0xF8, 0x41, 0x1C, 0x29, 0xD1, + 0x18, 0x49, 0x00, 0x23, 0xCA, 0x6B, 0x52, 0x57, 0x21, 0xE0, 0x16, 0x49, 0x8B, 0x6B, 0xC9, 0x69, + 0x5E, 0x56, 0xAE, 0x42, 0x18, 0xD1, 0x46, 0x1C, 0x05, 0xD1, 0x12, 0x4B, 0x08, 0x46, 0x1B, 0x6C, + 0x89, 0x00, 0x5C, 0x58, 0x0F, 0xE0, 0x0F, 0x4E, 0x8F, 0x00, 0x36, 0x6C, 0xF6, 0x59, 0xA6, 0x42, + 0x07, 0xDA, 0xFF, 0x24, 0x0B, 0x49, 0x1C, 0x54, 0xC8, 0x69, 0x09, 0x6C, 0x83, 0x00, 0xCC, 0x58, + 0x01, 0xE0, 0xFF, 0x26, 0x5E, 0x54, 0x52, 0x1E, 0x06, 0x49, 0xCB, 0x69, 0x5B, 0x1C, 0xCB, 0x61, + 0x00, 0x2A, 0xDA, 0xDC, 0x6D, 0x1C, 0x03, 0x48, 0x1B, 0x21, 0x80, 0x38, 0x41, 0x56, 0x8D, 0x42, + 0xC0, 0xDB, 0xF8, 0xBD, 0xA4, 0x01, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x7F, 0x9A, 0x05, 0x00, 0x20, + 0xF0, 0xB5, 0x00, 0x24, 0xE4, 0x43, 0x89, 0xB0, 0x80, 0x4A, 0x02, 0x94, 0x01, 0x94, 0x92, 0x6B, + 0xA4, 0x46, 0x00, 0x21, 0x08, 0x92, 0x52, 0x56, 0x82, 0x42, 0x01, 0xD1, 0xA4, 0x46, 0x0C, 0x46, + 0x49, 0x1C, 0x0A, 0x29, 0x01, 0xDA, 0x08, 0x9A, 0xF5, 0xE7, 0x78, 0x48, 0x00, 0x21, 0xC3, 0x6B, + 0x07, 0x93, 0xC3, 0x6A, 0x00, 0x6B, 0x9E, 0x46, 0x74, 0x4B, 0x06, 0x90, 0x80, 0x3B, 0x1B, 0x20, + 0x18, 0x56, 0x73, 0x4A, 0x05, 0x90, 0x3D, 0xE0, 0x07, 0x98, 0x40, 0x5C, 0x00, 0x28, 0x37, 0xD1, + 0x60, 0x46, 0x70, 0x4E, 0x40, 0x00, 0x33, 0x5E, 0x5B, 0x1C, 0x04, 0xD0, 0x33, 0x46, 0x14, 0x33, + 0x1B, 0x5E, 0x5B, 0x1C, 0x09, 0xD1, 0x6B, 0x4B, 0x6A, 0x4D, 0x28, 0x33, 0x1B, 0x5A, 0x33, 0x52, + 0x68, 0x4B, 0x3C, 0x33, 0x1B, 0x5A, 0x14, 0x35, 0x2B, 0x52, 0x33, 0x5E, 0x4D, 0x00, 0x2F, 0x46, + 0x76, 0x46, 0x75, 0x5F, 0x5E, 0x19, 0x63, 0x4B, 0xF5, 0x0F, 0x28, 0x33, 0xAD, 0x19, 0x1B, 0x5E, + 0x6D, 0x10, 0x5B, 0x1B, 0x00, 0x93, 0x5F, 0x4B, 0x06, 0x9E, 0x14, 0x33, 0x1B, 0x5E, 0xF5, 0x5F, + 0x5B, 0x19, 0x5C, 0x4D, 0x3C, 0x35, 0x28, 0x5E, 0xDD, 0x0F, 0xEB, 0x18, 0x5B, 0x10, 0xC0, 0x1A, + 0x00, 0x9B, 0x40, 0x43, 0x5B, 0x43, 0x18, 0x18, 0x90, 0x42, 0x01, 0xDA, 0x02, 0x46, 0x02, 0x91, + 0x05, 0x98, 0x49, 0x1C, 0x81, 0x42, 0xBF, 0xDB, 0x51, 0x4E, 0xB2, 0x42, 0x5F, 0xD0, 0x4F, 0x48, + 0x00, 0x68, 0x04, 0x90, 0x82, 0x42, 0x15, 0xD9, 0x60, 0x46, 0x41, 0x00, 0x4D, 0x48, 0x75, 0x46, + 0x28, 0x30, 0x43, 0x5E, 0x02, 0x98, 0x40, 0x00, 0x2D, 0x5E, 0x5B, 0x1B, 0x49, 0x4D, 0x5B, 0x43, + 0x3C, 0x35, 0x69, 0x5E, 0x06, 0x9D, 0x28, 0x5E, 0x08, 0x1A, 0x40, 0x43, 0x18, 0x18, 0x90, 0x42, + 0x00, 0xDA, 0x02, 0x46, 0x42, 0x4B, 0x00, 0x21, 0x3B, 0xE0, 0x07, 0x98, 0x40, 0x5C, 0x00, 0x28, + 0x36, 0xD1, 0x40, 0x4F, 0x60, 0x00, 0x3E, 0x5E, 0x76, 0x1C, 0x04, 0xD0, 0x3E, 0x46, 0x14, 0x36, + 0x36, 0x5E, 0x76, 0x1C, 0x08, 0xD1, 0x3B, 0x4E, 0x28, 0x36, 0x36, 0x5A, 0x3E, 0x52, 0x39, 0x4E, + 0x3C, 0x36, 0x35, 0x5A, 0x28, 0x3E, 0x35, 0x52, 0x3D, 0x5E, 0x4E, 0x00, 0x77, 0x46, 0x03, 0x96, + 0xBE, 0x5F, 0xAF, 0x19, 0x33, 0x4D, 0xFE, 0x0F, 0x28, 0x35, 0xF6, 0x19, 0x2D, 0x5E, 0x76, 0x10, + 0xAD, 0x1B, 0x00, 0x95, 0x2F, 0x4D, 0x06, 0x9F, 0x03, 0x9E, 0x14, 0x35, 0x2D, 0x5E, 0xBE, 0x5F, + 0xAD, 0x19, 0x2C, 0x4E, 0x3C, 0x36, 0x30, 0x5E, 0xEE, 0x0F, 0x75, 0x19, 0x6D, 0x10, 0x40, 0x1B, + 0x00, 0x9D, 0x40, 0x43, 0x6D, 0x43, 0x28, 0x18, 0x98, 0x42, 0x01, 0xDA, 0x03, 0x46, 0x01, 0x91, + 0x49, 0x1C, 0x05, 0x98, 0x81, 0x42, 0xC0, 0xDB, 0x21, 0x48, 0x83, 0x42, 0x03, 0xD1, 0x00, 0x20, + 0xC0, 0x43, 0x09, 0xB0, 0xF0, 0xBD, 0x04, 0x98, 0x1C, 0x4F, 0x83, 0x42, 0x14, 0xD9, 0x1D, 0x48, + 0x66, 0x00, 0x28, 0x30, 0x81, 0x5F, 0x01, 0x98, 0x75, 0x46, 0x40, 0x00, 0x2D, 0x5E, 0x49, 0x1B, + 0x18, 0x4D, 0x49, 0x43, 0x3C, 0x35, 0xAD, 0x5F, 0x06, 0x9E, 0x30, 0x5E, 0x28, 0x1A, 0x40, 0x43, + 0x08, 0x18, 0x98, 0x42, 0x00, 0xDA, 0x03, 0x46, 0x60, 0x46, 0x39, 0x6C, 0x80, 0x00, 0x3E, 0x46, + 0x0F, 0x58, 0xA5, 0x00, 0x49, 0x59, 0xFF, 0x18, 0x89, 0x18, 0x8F, 0x42, 0x0A, 0xDD, 0x08, 0x9C, + 0x63, 0x46, 0x02, 0x99, 0xE1, 0x54, 0xF3, 0x6B, 0x02, 0x9C, 0x01, 0x21, 0x19, 0x55, 0x31, 0x6C, + 0x0A, 0x50, 0x08, 0xE0, 0x08, 0x98, 0x01, 0x99, 0x01, 0x55, 0xF1, 0x6B, 0x01, 0x9A, 0x01, 0x20, + 0x88, 0x54, 0x30, 0x6C, 0x43, 0x51, 0x00, 0x20, 0xC3, 0xE7, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x20, + 0xFF, 0xFF, 0xFF, 0x7F, 0x72, 0x05, 0x00, 0x20, 0x70, 0xB5, 0x00, 0x24, 0x12, 0x48, 0x80, 0x69, + 0x00, 0x05, 0x05, 0x0F, 0x10, 0x48, 0x40, 0x69, 0x80, 0x01, 0x80, 0x0F, 0x07, 0xD1, 0xFE, 0xF7, + 0x95, 0xF9, 0x06, 0x46, 0x69, 0x1C, 0xFB, 0xF7, 0xF9, 0xFD, 0x04, 0x46, 0x12, 0xE0, 0x0A, 0x48, + 0x40, 0x69, 0x80, 0x01, 0x80, 0x0F, 0x01, 0x28, 0x07, 0xD1, 0xFE, 0xF7, 0x8B, 0xF9, 0x06, 0x46, + 0x69, 0x1C, 0xFB, 0xF7, 0xEB, 0xFD, 0x04, 0x46, 0x04, 0xE0, 0x69, 0x1C, 0x03, 0x48, 0xFB, 0xF7, + 0xE5, 0xFD, 0x04, 0x46, 0x20, 0x46, 0x70, 0xBD, 0x00, 0x02, 0x00, 0x50, 0x00, 0x80, 0x51, 0x01, + 0x70, 0xB5, 0x86, 0xB0, 0x00, 0x24, 0x4A, 0x4D, 0x08, 0xE0, 0xFD, 0xF7, 0x07, 0xFD, 0x64, 0x1C, + 0xA4, 0xB2, 0xAC, 0x42, 0x02, 0xD9, 0x01, 0x20, 0x06, 0xB0, 0x70, 0xBD, 0xFF, 0xF7, 0x34, 0xFC, + 0x35, 0x28, 0xF2, 0xD1, 0x00, 0x20, 0x43, 0x4D, 0x04, 0x46, 0x41, 0x1C, 0xAA, 0x6B, 0x89, 0xB2, + 0x14, 0x54, 0x08, 0x46, 0x10, 0x29, 0xF8, 0xD3, 0x68, 0x6B, 0x03, 0x22, 0xA9, 0x6B, 0x02, 0xAB, + 0x07, 0xC3, 0x3D, 0x48, 0x00, 0x21, 0x00, 0x78, 0x00, 0x91, 0x42, 0x00, 0x01, 0x92, 0x0A, 0x46, + 0x3A, 0x49, 0xA0, 0x20, 0x00, 0x23, 0x00, 0xF0, 0x2B, 0xFA, 0x01, 0x20, 0xA9, 0x6B, 0xFF, 0xF7, + 0x59, 0xFB, 0x02, 0xF0, 0x0D, 0xFC, 0x00, 0x28, 0x01, 0xD0, 0x02, 0xF0, 0xEF, 0xFE, 0x34, 0x4E, + 0x30, 0x7C, 0x00, 0x09, 0x22, 0xD0, 0x68, 0x6B, 0x03, 0x22, 0xA9, 0x6B, 0x02, 0xAB, 0x07, 0xC3, + 0x14, 0x22, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x2E, 0x49, 0xA0, 0x20, 0x00, 0x23, + 0x00, 0xF0, 0x0E, 0xFA, 0x30, 0x46, 0x40, 0x30, 0x81, 0x79, 0x2B, 0x4A, 0x00, 0x29, 0x41, 0x79, + 0x02, 0xD1, 0x4B, 0x00, 0x69, 0x6B, 0x01, 0xE0, 0x4B, 0x00, 0xA9, 0x6B, 0x40, 0x79, 0xCB, 0x5C, + 0x40, 0x00, 0x40, 0x18, 0x40, 0x78, 0x1B, 0x02, 0x18, 0x18, 0x10, 0x80, 0x6C, 0x76, 0xF1, 0x7A, + 0x22, 0x48, 0xC9, 0x09, 0x01, 0xD0, 0x04, 0x78, 0x01, 0xE0, 0x00, 0x78, 0x44, 0x00, 0x68, 0x6B, + 0x03, 0x22, 0xA9, 0x6B, 0x02, 0xAB, 0x07, 0xC3, 0x00, 0x21, 0x71, 0x26, 0x0A, 0x46, 0x36, 0x01, + 0x00, 0x91, 0x01, 0x94, 0x31, 0x46, 0xA0, 0x20, 0x00, 0x23, 0x00, 0xF0, 0xE1, 0xF9, 0xA8, 0x6B, + 0x02, 0x22, 0x01, 0x19, 0x68, 0x6B, 0x02, 0xAB, 0x00, 0x19, 0x07, 0xC3, 0x14, 0x48, 0x00, 0x21, + 0x00, 0x1B, 0x82, 0xB2, 0xA0, 0x19, 0x01, 0x92, 0x00, 0x91, 0x81, 0xB2, 0x00, 0x22, 0xA0, 0x20, + 0x13, 0x46, 0x00, 0xF0, 0xCD, 0xF9, 0x68, 0x6B, 0x00, 0x5D, 0xFF, 0x28, 0x03, 0xD0, 0xA8, 0x6B, + 0x00, 0x5D, 0xFF, 0x28, 0x01, 0xD1, 0x02, 0x20, 0x76, 0xE7, 0x00, 0x20, 0x74, 0xE7, 0x00, 0x00, + 0x88, 0x13, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x85, 0x03, 0x00, 0x20, 0xD0, 0x4F, 0x00, 0x00, + 0x14, 0x04, 0x00, 0x20, 0xEC, 0x05, 0x00, 0x00, 0x9A, 0x01, 0x00, 0x20, 0x34, 0x01, 0x00, 0x20, + 0x31, 0x02, 0x00, 0x00, 0x11, 0xB5, 0x83, 0xB0, 0x5A, 0x20, 0x03, 0xAA, 0x00, 0x92, 0x02, 0x90, + 0x01, 0x22, 0x12, 0x49, 0xA0, 0x20, 0x03, 0xAB, 0x00, 0xF0, 0x76, 0xFC, 0xFD, 0xF7, 0x42, 0xFC, + 0x0F, 0x49, 0xFF, 0x20, 0x88, 0x70, 0x02, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x0D, 0x49, 0xA0, 0x20, + 0x02, 0xAB, 0x00, 0xF0, 0x69, 0xFC, 0x00, 0x24, 0xFD, 0xF7, 0x48, 0xFC, 0x64, 0x1C, 0xE4, 0xB2, + 0x0F, 0x2C, 0xF9, 0xD3, 0xFF, 0xF7, 0x78, 0xFB, 0x6B, 0x46, 0x19, 0x7A, 0x88, 0x42, 0x02, 0xD0, + 0x00, 0x20, 0x04, 0xB0, 0x10, 0xBD, 0x01, 0x20, 0xFB, 0xE7, 0x00, 0x00, 0x22, 0x15, 0x00, 0x00, + 0x1C, 0x00, 0x00, 0x20, 0x05, 0x10, 0x00, 0x00, 0x10, 0xB5, 0x22, 0x48, 0x00, 0x68, 0x00, 0x28, + 0x3B, 0xD0, 0x20, 0x48, 0x00, 0x1F, 0x00, 0x68, 0x00, 0x28, 0x09, 0xD1, 0x00, 0x22, 0x1D, 0x48, + 0x01, 0x68, 0x10, 0x46, 0xFE, 0xF7, 0xCC, 0xFD, 0x00, 0x20, 0x1A, 0x49, 0x08, 0x60, 0x2F, 0xE0, + 0x18, 0x48, 0x00, 0x1F, 0x00, 0x68, 0x08, 0x28, 0x03, 0xD2, 0x16, 0x48, 0x00, 0x1F, 0x00, 0x68, + 0x00, 0xE0, 0x08, 0x20, 0x04, 0x46, 0x22, 0x46, 0x12, 0x48, 0x01, 0x68, 0x00, 0x20, 0xFE, 0xF7, + 0xB7, 0xFD, 0x10, 0x48, 0x01, 0x68, 0x08, 0x19, 0x0E, 0x49, 0x08, 0x60, 0x08, 0x1F, 0x01, 0x68, + 0x08, 0x1B, 0x0C, 0x49, 0x09, 0x1F, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x00, 0x28, 0x0F, 0xD1, + 0x08, 0x2C, 0x02, 0xD2, 0x09, 0x1D, 0x08, 0x60, 0x0A, 0xE0, 0x06, 0x48, 0x08, 0x38, 0x00, 0x78, + 0x00, 0x28, 0x05, 0xD1, 0x03, 0x49, 0x08, 0x60, 0x02, 0xE0, 0x00, 0x20, 0x02, 0x49, 0x48, 0x63, + 0x10, 0xBD, 0x00, 0x00, 0x7C, 0x03, 0x00, 0x20, 0x00, 0x00, 0x06, 0x40, 0x00, 0x20, 0x03, 0x49, + 0x08, 0x60, 0x09, 0x1D, 0x08, 0x60, 0x08, 0x39, 0x08, 0x70, 0x70, 0x47, 0x78, 0x03, 0x00, 0x20, + 0x10, 0xB5, 0x39, 0x48, 0xC4, 0x79, 0x24, 0x02, 0x80, 0x79, 0x00, 0x19, 0x84, 0xB2, 0x00, 0x20, + 0x36, 0x49, 0x08, 0x70, 0x34, 0x48, 0xC0, 0x78, 0x03, 0x28, 0x2C, 0xD0, 0x04, 0xDC, 0x01, 0x28, + 0x07, 0xD0, 0x02, 0x28, 0x5B, 0xD1, 0x0E, 0xE0, 0x21, 0x28, 0x13, 0xD0, 0x22, 0x28, 0x56, 0xD1, + 0x18, 0xE0, 0x22, 0x46, 0x12, 0x21, 0x2E, 0x48, 0x08, 0x23, 0x00, 0xF0, 0x95, 0xF8, 0x00, 0x20, + 0x2C, 0x49, 0x48, 0x63, 0x4E, 0xE0, 0x2C, 0x48, 0x81, 0x78, 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, + 0x8B, 0xF8, 0x47, 0xE0, 0x22, 0x46, 0x09, 0x21, 0x28, 0x48, 0x00, 0x68, 0x08, 0x23, 0x00, 0xF0, + 0x83, 0xF8, 0x3F, 0xE0, 0x22, 0x46, 0x26, 0x48, 0x01, 0x68, 0x26, 0x48, 0x00, 0x68, 0x08, 0x23, + 0x00, 0xF0, 0x7A, 0xF8, 0x36, 0xE0, 0x1C, 0x48, 0x80, 0x78, 0x00, 0x28, 0x06, 0xD1, 0x22, 0x46, + 0x04, 0x21, 0x21, 0x48, 0x08, 0x23, 0x00, 0xF0, 0x6F, 0xF8, 0x27, 0xE0, 0x16, 0x48, 0x80, 0x78, + 0x01, 0x28, 0x04, 0xD0, 0x02, 0x28, 0x0C, 0xD0, 0x03, 0x28, 0x1B, 0xD1, 0x13, 0xE0, 0x1B, 0x4A, + 0x52, 0x68, 0x11, 0x78, 0x19, 0x4A, 0x50, 0x68, 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, 0x5C, 0xF8, + 0x13, 0xE0, 0x16, 0x4A, 0x92, 0x68, 0x11, 0x78, 0x14, 0x4A, 0x90, 0x68, 0x22, 0x46, 0x08, 0x23, + 0x00, 0xF0, 0x52, 0xF8, 0x09, 0xE0, 0x12, 0x48, 0x01, 0x78, 0x22, 0x46, 0x08, 0x23, 0x00, 0xF0, + 0x4B, 0xF8, 0x02, 0xE0, 0xFE, 0xF7, 0xD2, 0xFB, 0x00, 0xBF, 0x00, 0xBF, 0x02, 0xE0, 0xFE, 0xF7, + 0xCD, 0xFB, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, 0x64, 0x03, 0x00, 0x20, 0x74, 0x03, 0x00, 0x20, + 0xA0, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xB4, 0xBC, 0x00, 0x00, 0x40, 0x03, 0x00, 0x20, + 0x3C, 0x03, 0x00, 0x20, 0x38, 0x03, 0x00, 0x20, 0xD8, 0xBC, 0x00, 0x00, 0x98, 0x19, 0x00, 0x20, + 0x74, 0xBE, 0x00, 0x00, 0x00, 0xB5, 0x02, 0x22, 0x03, 0x49, 0x00, 0x20, 0xFE, 0xF7, 0xF8, 0xFC, + 0x01, 0x20, 0x02, 0x49, 0x08, 0x70, 0x00, 0xBD, 0x30, 0x03, 0x00, 0x20, 0x32, 0x03, 0x00, 0x20, + 0x04, 0x48, 0x80, 0x6A, 0x80, 0x21, 0x08, 0x43, 0x02, 0x49, 0x88, 0x62, 0x00, 0x20, 0x48, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0xBF, 0xFE, 0xE7, 0x00, 0xBF, 0xFE, 0xE7, + 0x01, 0x46, 0x04, 0x48, 0x40, 0x79, 0x88, 0x42, 0x01, 0xD1, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0xFC, 0xE7, 0x00, 0x00, 0xB4, 0xBC, 0x00, 0x00, 0xF0, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, + 0x1F, 0x46, 0x19, 0x48, 0x06, 0x60, 0xAE, 0x42, 0x04, 0xD9, 0x05, 0x60, 0x01, 0x20, 0x16, 0x49, + 0x09, 0x1F, 0x08, 0x70, 0x14, 0x48, 0x00, 0x1D, 0x04, 0x60, 0x00, 0x1F, 0x00, 0x68, 0xB8, 0x42, + 0x0D, 0xD2, 0x11, 0x48, 0x02, 0x68, 0x00, 0x1D, 0x01, 0x68, 0x00, 0x20, 0xFE, 0xF7, 0xB8, 0xFC, + 0x00, 0x20, 0x0D, 0x49, 0x09, 0x1D, 0x08, 0x60, 0x09, 0x1F, 0x08, 0x60, 0x12, 0xE0, 0x3A, 0x46, + 0x09, 0x48, 0x00, 0x1D, 0x01, 0x68, 0x00, 0x20, 0xFE, 0xF7, 0xAA, 0xFC, 0x06, 0x48, 0x00, 0x1D, + 0x00, 0x68, 0xC0, 0x19, 0x04, 0x49, 0x09, 0x1D, 0x08, 0x60, 0x08, 0x1F, 0x00, 0x68, 0xC0, 0x1B, + 0x09, 0x1F, 0x08, 0x60, 0xF0, 0xBD, 0x00, 0x00, 0x78, 0x03, 0x00, 0x20, 0x70, 0x47, 0x10, 0xB5, + 0x01, 0x20, 0xFE, 0xF7, 0x6D, 0xFD, 0xFF, 0xF7, 0xF9, 0xFF, 0x10, 0xBD, 0x10, 0xB5, 0x11, 0x48, + 0x01, 0x7E, 0x01, 0x29, 0x07, 0xD1, 0xC1, 0x78, 0x01, 0x29, 0xFC, 0xD0, 0x01, 0x21, 0x41, 0x74, + 0x04, 0xF0, 0x78, 0xFE, 0x13, 0xE0, 0x01, 0x79, 0x00, 0x29, 0x02, 0xD1, 0x00, 0xF0, 0x72, 0xFD, + 0x10, 0xBD, 0x81, 0x7A, 0x02, 0x29, 0xFB, 0xD3, 0x81, 0x7A, 0x49, 0x1E, 0x81, 0x72, 0x81, 0x7A, + 0x02, 0x29, 0x01, 0xD2, 0x00, 0x21, 0x81, 0x72, 0xC0, 0x78, 0x00, 0x28, 0xF0, 0xD1, 0x03, 0xF0, + 0xD1, 0xFC, 0x10, 0xBD, 0x1C, 0x00, 0x00, 0x20, 0x00, 0x20, 0x01, 0xE0, 0x41, 0x1C, 0xC8, 0xB2, + 0x03, 0x28, 0xFB, 0xDB, 0x70, 0x47, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x70, 0x47, + 0xFF, 0xB5, 0x81, 0xB0, 0x0B, 0xAC, 0x70, 0xCC, 0x17, 0x46, 0x00, 0xF0, 0x15, 0xFA, 0x01, 0x98, + 0x40, 0x08, 0x40, 0x00, 0x01, 0x46, 0x00, 0xF0, 0x41, 0xF9, 0x03, 0x28, 0x2C, 0xD1, 0x02, 0x98, + 0x00, 0x0A, 0x01, 0x46, 0x00, 0xF0, 0x3A, 0xF9, 0x03, 0x28, 0x25, 0xD1, 0x02, 0x98, 0xC0, 0xB2, + 0x01, 0x46, 0x00, 0xF0, 0x33, 0xF9, 0x03, 0x28, 0x1E, 0xD1, 0x0F, 0xE0, 0x0A, 0x98, 0x01, 0x78, + 0x04, 0x98, 0x00, 0x78, 0x00, 0xF0, 0x2A, 0xF9, 0x03, 0x28, 0x15, 0xD1, 0x04, 0x98, 0x40, 0x1C, + 0x04, 0x90, 0x0A, 0x98, 0x40, 0x1C, 0x7F, 0x1E, 0xBF, 0xB2, 0x0A, 0x90, 0x00, 0x2F, 0xED, 0xD1, + 0x00, 0x2C, 0x5F, 0xD0, 0x00, 0xF0, 0xE8, 0xF9, 0x01, 0x98, 0x01, 0x27, 0x38, 0x43, 0x01, 0x46, + 0x00, 0xF0, 0x14, 0xF9, 0x03, 0x28, 0x04, 0xD0, 0x00, 0xF0, 0x3C, 0xFA, 0x00, 0x20, 0x05, 0xB0, + 0xF0, 0xBD, 0x0E, 0x98, 0x02, 0x28, 0x46, 0xD1, 0x28, 0x4F, 0x1F, 0xE0, 0x00, 0x22, 0x31, 0x46, + 0x28, 0x46, 0x00, 0xF0, 0x4D, 0xF8, 0x28, 0x78, 0xFF, 0x28, 0x03, 0xD1, 0x78, 0x7E, 0x01, 0x21, + 0x08, 0x43, 0x78, 0x76, 0x30, 0x78, 0xFF, 0x28, 0x03, 0xD1, 0x78, 0x7E, 0x02, 0x21, 0x08, 0x43, + 0x78, 0x76, 0x64, 0x1E, 0x78, 0x7E, 0x6D, 0x1C, 0x76, 0x1C, 0xA4, 0xB2, 0x03, 0x28, 0x05, 0xD1, + 0x01, 0x22, 0x31, 0x46, 0x28, 0x46, 0x00, 0xF0, 0x33, 0xF8, 0x17, 0xE0, 0x01, 0x2C, 0xDD, 0xD8, + 0x01, 0x22, 0x31, 0x46, 0x28, 0x46, 0x00, 0xF0, 0x2B, 0xF8, 0x28, 0x78, 0xFF, 0x28, 0x03, 0xD1, + 0x78, 0x7E, 0x01, 0x21, 0x08, 0x43, 0x78, 0x76, 0x30, 0x78, 0xFF, 0x28, 0x03, 0xD1, 0x79, 0x7E, + 0x02, 0x20, 0x01, 0x43, 0x79, 0x76, 0x78, 0x7E, 0x03, 0x28, 0x13, 0xD1, 0x00, 0xF0, 0xFA, 0xF9, + 0x04, 0x20, 0xBC, 0xE7, 0x00, 0x22, 0x31, 0x46, 0x28, 0x46, 0x00, 0xF0, 0x11, 0xF8, 0x6D, 0x1C, + 0x76, 0x1C, 0x64, 0x1E, 0xA4, 0xB2, 0x01, 0x2C, 0xF4, 0xD8, 0x01, 0x22, 0x31, 0x46, 0x28, 0x46, + 0x00, 0xF0, 0x06, 0xF8, 0x00, 0xF0, 0xE6, 0xF9, 0x01, 0x20, 0xA8, 0xE7, 0x1C, 0x00, 0x00, 0x20, + 0x70, 0xB5, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x36, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, + 0x88, 0x43, 0x34, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, + 0x30, 0x49, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFB, 0xF7, 0x5C, 0xFA, 0x2D, 0x48, 0x00, 0x68, + 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x2B, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, + 0x49, 0x05, 0x08, 0x43, 0x27, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, + 0x88, 0x43, 0x24, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, 0x21, 0x49, + 0x08, 0x60, 0x00, 0x2E, 0x0E, 0xD1, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, + 0x1C, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x88, 0x43, 0x19, 0x49, + 0x88, 0x60, 0x0E, 0xE0, 0x17, 0x48, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x15, 0x49, + 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x08, 0x43, 0x11, 0x49, 0x88, 0x60, + 0x00, 0xBF, 0x00, 0xBF, 0x0F, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x0D, 0x49, + 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x09, 0x49, 0x88, 0x60, + 0xFF, 0xF7, 0xFA, 0xFE, 0x07, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x49, + 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x01, 0x49, 0x88, 0x60, + 0x70, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xFF, 0xB5, 0x81, 0xB0, 0x0F, 0x46, 0x14, 0x46, + 0x1D, 0x46, 0x0A, 0x9E, 0x00, 0xF0, 0x08, 0xF9, 0x01, 0x98, 0x40, 0x08, 0x40, 0x00, 0x01, 0x46, + 0x00, 0xF0, 0x34, 0xF8, 0xC0, 0x07, 0x17, 0xD0, 0x38, 0x0A, 0x01, 0x46, 0x00, 0xF0, 0x2E, 0xF8, + 0xC0, 0x07, 0x11, 0xD0, 0xF8, 0xB2, 0x01, 0x46, 0x00, 0xF0, 0x28, 0xF8, 0xC0, 0x07, 0x0B, 0xD0, + 0x00, 0x2C, 0x1E, 0xD0, 0x00, 0xF0, 0xF0, 0xF8, 0x01, 0x98, 0x01, 0x21, 0x08, 0x43, 0x01, 0x46, + 0x00, 0xF0, 0x1C, 0xF8, 0xC0, 0x07, 0x0D, 0xD1, 0x00, 0xF0, 0x44, 0xF9, 0x00, 0x20, 0x05, 0xB0, + 0xF0, 0xBD, 0x00, 0x22, 0x31, 0x46, 0x28, 0x46, 0xFF, 0xF7, 0x5A, 0xFF, 0x6D, 0x1C, 0x76, 0x1C, + 0x64, 0x1E, 0xA4, 0xB2, 0x01, 0x2C, 0xF4, 0xD8, 0x01, 0x22, 0x31, 0x46, 0x28, 0x46, 0xFF, 0xF7, + 0x4F, 0xFF, 0x00, 0xF0, 0x2F, 0xF9, 0x01, 0x20, 0xE9, 0xE7, 0x00, 0x00, 0xF8, 0xB5, 0x04, 0x46, + 0x0D, 0x46, 0x38, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x35, 0x49, 0x08, 0x60, + 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x32, 0x49, 0x08, 0x60, 0x08, 0x46, + 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x2E, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, + 0x89, 0x04, 0x08, 0x43, 0x2B, 0x49, 0x08, 0x60, 0x29, 0x46, 0x20, 0x46, 0xFB, 0xF7, 0x44, 0xF9, + 0xFF, 0xF7, 0x89, 0xFE, 0x27, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x25, 0x49, + 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x21, 0x49, 0x88, 0x60, + 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x1E, 0x49, 0x88, 0x60, 0xFF, 0xF7, + 0x72, 0xFE, 0x1C, 0x48, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x19, 0x49, 0x08, 0x60, + 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x16, 0x49, 0x88, 0x60, 0x08, 0x46, + 0x00, 0x69, 0x40, 0x05, 0xC0, 0x0F, 0x01, 0x21, 0x48, 0x40, 0x06, 0x46, 0x11, 0x48, 0x80, 0x68, + 0x49, 0x02, 0x88, 0x43, 0x0F, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x55, 0xFE, 0x0D, 0x48, 0x00, 0x69, + 0xC0, 0x04, 0xC0, 0x0F, 0x01, 0x21, 0x48, 0x40, 0x07, 0x46, 0x0A, 0x48, 0x80, 0x68, 0xC9, 0x02, + 0x88, 0x43, 0x08, 0x49, 0x88, 0x60, 0xBE, 0x42, 0x05, 0xD0, 0x00, 0x2E, 0x01, 0xD0, 0x01, 0x20, + 0xF8, 0xBD, 0x02, 0x20, 0xFC, 0xE7, 0x00, 0x2E, 0x01, 0xD0, 0x03, 0x20, 0xF8, 0xE7, 0x00, 0x20, + 0xF6, 0xE7, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xF8, 0xB5, 0x00, 0x24, 0x00, 0xF0, 0x30, 0xFB, + 0x23, 0x48, 0x01, 0x7C, 0x09, 0x09, 0x2C, 0xD0, 0x02, 0x7C, 0x22, 0x49, 0xD3, 0x06, 0x22, 0x4A, + 0x02, 0xD5, 0x15, 0x68, 0x0B, 0x88, 0x2B, 0x80, 0x03, 0x7C, 0x20, 0x4E, 0x9B, 0x06, 0x06, 0xD5, + 0x33, 0x78, 0x17, 0x68, 0x5B, 0x00, 0xDB, 0x19, 0x0D, 0x88, 0x20, 0x3B, 0xDD, 0x83, 0x03, 0x7C, + 0x5B, 0x06, 0x07, 0xD5, 0x1A, 0x4B, 0x17, 0x68, 0x1B, 0x78, 0x0D, 0x88, 0x9B, 0x01, 0xDB, 0x19, + 0x40, 0x3B, 0x1D, 0x80, 0x00, 0x7C, 0x00, 0x06, 0x0B, 0xD5, 0x15, 0x48, 0x33, 0x78, 0x00, 0x78, + 0x12, 0x68, 0x40, 0x01, 0x20, 0x38, 0xC0, 0x18, 0x40, 0x00, 0x80, 0x18, 0x09, 0x88, 0x20, 0x38, + 0xC1, 0x83, 0x10, 0x4D, 0x01, 0x26, 0x2E, 0x71, 0x03, 0xF0, 0xC4, 0xFA, 0x7D, 0x27, 0xFF, 0x00, + 0x08, 0xE0, 0x6E, 0x74, 0xE8, 0x78, 0x00, 0x28, 0x02, 0xD1, 0xFD, 0xF7, 0xC1, 0xF8, 0x64, 0x1C, + 0xBC, 0x42, 0x02, 0xDC, 0x28, 0x79, 0x00, 0x28, 0xF3, 0xD1, 0x02, 0xF0, 0xC9, 0xFD, 0xF8, 0xBD, + 0x14, 0x04, 0x00, 0x20, 0x9E, 0x01, 0x00, 0x20, 0xB0, 0x01, 0x00, 0x20, 0x34, 0x01, 0x00, 0x20, + 0x35, 0x01, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x2D, 0x48, 0x00, 0x68, 0x03, 0x21, + 0x09, 0x05, 0x88, 0x43, 0x2A, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, 0x49, 0x05, + 0x08, 0x43, 0x27, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, + 0x23, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x89, 0x04, 0x08, 0x43, 0x20, 0x49, 0x08, 0x60, + 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x1D, 0x49, 0x88, 0x60, 0x08, 0x46, + 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x08, 0x43, 0x19, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0xAC, 0xFD, + 0x17, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x15, 0x49, 0x88, 0x60, 0x08, 0x46, + 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x11, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x9C, 0xFD, + 0x0F, 0x48, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x88, 0x43, 0x0D, 0x49, 0x88, 0x60, 0x08, 0x46, + 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x88, 0x43, 0x09, 0x49, 0x88, 0x60, 0xFF, 0xF7, 0x8C, 0xFD, + 0x07, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x05, 0x49, 0x88, 0x60, 0x08, 0x46, + 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x01, 0x49, 0x88, 0x60, 0x00, 0xBD, 0x00, 0x00, + 0x80, 0x40, 0x00, 0x50, 0x00, 0xB5, 0x2B, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, + 0x28, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x25, 0x49, + 0x88, 0x60, 0x08, 0x46, 0x00, 0x68, 0x03, 0x21, 0x09, 0x05, 0x88, 0x43, 0x21, 0x49, 0x08, 0x60, + 0x08, 0x46, 0x00, 0x68, 0x01, 0x21, 0x49, 0x05, 0x08, 0x43, 0x1E, 0x49, 0x08, 0x60, 0x08, 0x46, + 0x00, 0x68, 0x03, 0x21, 0x09, 0x06, 0x88, 0x43, 0x1A, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, + 0x89, 0x04, 0x08, 0x43, 0x17, 0x49, 0x08, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, + 0x88, 0x43, 0x14, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x88, 0x43, + 0x10, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x08, 0x43, 0x0D, 0x49, + 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x08, 0x43, 0x09, 0x49, 0x88, 0x60, + 0xFF, 0xF7, 0x32, 0xFD, 0x07, 0x48, 0x80, 0x68, 0x01, 0x21, 0x89, 0x02, 0x08, 0x43, 0x05, 0x49, + 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0x09, 0x03, 0x08, 0x43, 0x01, 0x49, 0x88, 0x60, + 0x00, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xFF, 0xB5, 0x81, 0xB0, 0x0F, 0x46, 0x14, 0x46, + 0x1D, 0x46, 0x0A, 0x9E, 0xFF, 0xF7, 0x40, 0xFF, 0x01, 0x98, 0x40, 0x08, 0x40, 0x00, 0x01, 0x46, + 0xFF, 0xF7, 0x6C, 0xFE, 0xC0, 0x07, 0x12, 0xD0, 0x38, 0x0A, 0x01, 0x46, 0xFF, 0xF7, 0x66, 0xFE, + 0xC0, 0x07, 0x0C, 0xD0, 0xF8, 0xB2, 0x01, 0x46, 0xFF, 0xF7, 0x60, 0xFE, 0xC0, 0x07, 0x0F, 0xD1, + 0x05, 0xE0, 0x31, 0x78, 0x28, 0x78, 0xFF, 0xF7, 0x59, 0xFE, 0xC0, 0x07, 0x04, 0xD1, 0xFF, 0xF7, + 0x81, 0xFF, 0x00, 0x20, 0x05, 0xB0, 0xF0, 0xBD, 0x6D, 0x1C, 0x76, 0x1C, 0x64, 0x1E, 0xA4, 0xB2, + 0x00, 0x2C, 0xEE, 0xD1, 0xFF, 0xF7, 0x76, 0xFF, 0x01, 0x20, 0xF3, 0xE7, 0x04, 0x49, 0x08, 0x68, + 0x3C, 0x23, 0x98, 0x43, 0x18, 0x22, 0x20, 0x30, 0x10, 0x43, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x40, 0xF8, 0xB5, 0x71, 0x4C, 0x3C, 0x25, 0x71, 0x4E, 0xC0, 0x28, 0x04, 0xD1, + 0x20, 0x68, 0xA8, 0x43, 0x0C, 0x30, 0x20, 0x60, 0x6C, 0xE0, 0x6E, 0x49, 0x6C, 0x4A, 0x03, 0x46, + 0xA8, 0x3B, 0x09, 0x78, 0x52, 0x7F, 0x10, 0x2B, 0x3A, 0xD8, 0x00, 0x29, 0x09, 0xD1, 0x6A, 0x48, + 0x80, 0x5C, 0xA0, 0x60, 0x20, 0x68, 0xA8, 0x43, 0x0C, 0x30, 0x20, 0x60, 0x52, 0x1C, 0x72, 0x77, + 0x26, 0xE0, 0xC9, 0x29, 0x01, 0xD0, 0xCA, 0x29, 0x17, 0xD1, 0xF1, 0x6B, 0x49, 0x1C, 0xF1, 0x63, + 0x32, 0x7A, 0x62, 0x48, 0x00, 0x2A, 0x00, 0x68, 0x06, 0xD0, 0x23, 0x22, 0x09, 0x1A, 0x92, 0x01, + 0x91, 0x42, 0x01, 0xDA, 0xF0, 0x6B, 0x00, 0xE0, 0xF0, 0x63, 0x00, 0x78, 0xFD, 0xF7, 0x8E, 0xFB, + 0x20, 0x68, 0xA8, 0x43, 0x0C, 0x30, 0x20, 0x60, 0x0A, 0xE0, 0x57, 0x48, 0x80, 0x5C, 0xFD, 0xF7, + 0x85, 0xFB, 0x20, 0x68, 0xA8, 0x43, 0x0C, 0x30, 0x20, 0x60, 0x70, 0x7F, 0x40, 0x1C, 0x70, 0x77, + 0x01, 0x20, 0x30, 0x72, 0xB0, 0x7A, 0x02, 0x28, 0x01, 0xD3, 0x00, 0x20, 0xB0, 0x72, 0xF8, 0xBD, + 0x60, 0x28, 0x2B, 0xD0, 0x68, 0x28, 0x29, 0xD0, 0x4B, 0x4F, 0x60, 0x37, 0x80, 0x28, 0x32, 0xD0, + 0xA0, 0x28, 0x20, 0x68, 0x7E, 0xD1, 0xA8, 0x43, 0x0C, 0x30, 0x20, 0x60, 0xF0, 0x79, 0x00, 0x28, + 0x03, 0xD0, 0x00, 0x20, 0xF0, 0x70, 0x01, 0x20, 0x70, 0x72, 0x30, 0x7A, 0x00, 0x28, 0xE6, 0xD0, + 0x3B, 0x7B, 0x03, 0x20, 0xDB, 0x06, 0x9B, 0x0F, 0x01, 0x2B, 0x00, 0xD1, 0x02, 0x20, 0xC9, 0x29, + 0x08, 0xD0, 0xCA, 0x29, 0x06, 0xD0, 0x3C, 0x49, 0x4B, 0x78, 0x89, 0x78, 0x0B, 0x43, 0x01, 0xD0, + 0x82, 0x42, 0xD4, 0xD9, 0x00, 0x20, 0x30, 0x71, 0xF0, 0x70, 0xF8, 0xBD, 0x20, 0x68, 0xA8, 0x43, + 0x0C, 0x30, 0x20, 0x60, 0x00, 0x20, 0xB0, 0x77, 0xF0, 0x77, 0x01, 0x21, 0xF1, 0x70, 0xB0, 0x71, + 0xF0, 0x71, 0x30, 0x72, 0xF8, 0xBD, 0xFD, 0xF7, 0xF5, 0xFA, 0x21, 0x68, 0xA9, 0x43, 0x0C, 0x31, + 0x21, 0x60, 0x01, 0x22, 0x32, 0x77, 0xB1, 0x79, 0x00, 0x29, 0x18, 0xD1, 0x70, 0x77, 0x38, 0x7B, + 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x10, 0xD1, 0x70, 0x7F, 0x1A, 0x28, 0x01, 0xD1, 0xC3, 0x20, + 0x02, 0xE0, 0x3D, 0x28, 0x02, 0xD1, 0x6A, 0x20, 0x70, 0x77, 0x06, 0xE0, 0x38, 0x28, 0x01, 0xD1, + 0xB2, 0x77, 0x02, 0xE0, 0x39, 0x28, 0x00, 0xD1, 0xF2, 0x77, 0xB2, 0x71, 0xF8, 0xBD, 0xF2, 0x71, + 0x39, 0x7B, 0xC9, 0x06, 0x89, 0x0F, 0x01, 0x29, 0x15, 0xD1, 0xB3, 0x7F, 0x1A, 0x49, 0x40, 0x31, + 0x01, 0x2B, 0x07, 0xD1, 0x00, 0x23, 0xB3, 0x77, 0x55, 0x28, 0x0A, 0xD0, 0x56, 0x28, 0x0A, 0xD1, + 0x72, 0x70, 0x06, 0xE0, 0xF2, 0x7F, 0x01, 0x2A, 0x05, 0xD1, 0x00, 0x22, 0xF2, 0x77, 0x55, 0x28, + 0x01, 0xD1, 0x0A, 0x74, 0x32, 0x70, 0x71, 0x79, 0x00, 0x29, 0x04, 0xD1, 0x71, 0x7F, 0x65, 0x29, + 0x01, 0xD3, 0xC2, 0x29, 0x04, 0xD9, 0x71, 0x7F, 0x50, 0x29, 0x01, 0xD0, 0x51, 0x29, 0x04, 0xD1, + 0x09, 0x49, 0x00, 0xE0, 0x05, 0xE0, 0x72, 0x7F, 0x88, 0x54, 0x70, 0x7F, 0x40, 0x1C, 0x70, 0x77, + 0xF8, 0xBD, 0xA8, 0x43, 0x08, 0x30, 0x20, 0x60, 0xF8, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, + 0x1C, 0x00, 0x00, 0x20, 0x2B, 0x01, 0x00, 0x20, 0xB4, 0x03, 0x00, 0x20, 0xB0, 0x01, 0x00, 0x20, + 0x30, 0xB4, 0x0A, 0x49, 0xC8, 0x68, 0x4B, 0x69, 0x09, 0x4A, 0xDB, 0x07, 0x05, 0xD0, 0x4B, 0x69, + 0x01, 0x24, 0x23, 0x43, 0x4B, 0x61, 0xD1, 0x68, 0x02, 0xE0, 0x38, 0x28, 0x04, 0xD9, 0x11, 0x68, + 0x00, 0x29, 0x01, 0xD0, 0x30, 0xBC, 0x08, 0x47, 0x30, 0xBC, 0x70, 0x47, 0x00, 0x00, 0x12, 0x40, + 0x28, 0x1A, 0x00, 0x20, 0x70, 0xB5, 0x26, 0x4D, 0x00, 0x24, 0x6C, 0x72, 0x6C, 0x71, 0x01, 0x20, + 0xFD, 0xF7, 0x34, 0xF8, 0x23, 0x48, 0xFD, 0xF7, 0x43, 0xFA, 0x23, 0x48, 0x01, 0x7B, 0x49, 0x07, + 0x49, 0x0F, 0x01, 0x29, 0x07, 0xD1, 0x00, 0x22, 0x55, 0x21, 0x10, 0x46, 0xFD, 0xF7, 0x68, 0xFA, + 0x00, 0x22, 0x55, 0x21, 0x0E, 0xE0, 0x00, 0x7B, 0x40, 0x07, 0x40, 0x0F, 0x02, 0x28, 0x02, 0xD1, + 0x00, 0x22, 0x5C, 0x21, 0x01, 0xE0, 0x00, 0x22, 0x55, 0x21, 0x00, 0x20, 0xFD, 0xF7, 0x58, 0xFA, + 0x00, 0x22, 0x5C, 0x21, 0x01, 0x20, 0xFD, 0xF7, 0x53, 0xFA, 0x14, 0x48, 0x01, 0x68, 0x3C, 0x22, + 0x91, 0x43, 0x09, 0x1D, 0x01, 0x60, 0x01, 0x68, 0x80, 0x22, 0x11, 0x43, 0x01, 0x60, 0x00, 0x21, + 0x13, 0x20, 0x01, 0xF0, 0xFF, 0xFC, 0x13, 0x20, 0x01, 0xF0, 0xE8, 0xFC, 0x0C, 0x49, 0x00, 0x20, + 0xFD, 0xF7, 0xF6, 0xF9, 0x0B, 0x49, 0x01, 0x20, 0xFD, 0xF7, 0xF2, 0xF9, 0x09, 0x49, 0x02, 0x20, + 0xFD, 0xF7, 0xEE, 0xF9, 0x07, 0x49, 0x03, 0x20, 0xFD, 0xF7, 0xEA, 0xF9, 0xAC, 0x72, 0x70, 0xBD, + 0x1C, 0x00, 0x00, 0x20, 0xC0, 0x27, 0x09, 0x00, 0x14, 0x04, 0x00, 0x20, 0x00, 0x00, 0x12, 0x40, + 0x05, 0x52, 0x00, 0x00, 0xED, 0x51, 0x00, 0x00, 0x70, 0xB5, 0x3A, 0x49, 0x0A, 0x78, 0x3A, 0x48, + 0x52, 0x07, 0x03, 0x7B, 0x52, 0x0F, 0x5B, 0x07, 0x5B, 0x0F, 0x9A, 0x42, 0x09, 0xD0, 0x00, 0x7B, + 0x0A, 0x78, 0x40, 0x07, 0x40, 0x0F, 0xD2, 0x08, 0xD2, 0x00, 0x02, 0x43, 0x0A, 0x70, 0xFF, 0xF7, + 0x91, 0xFF, 0x32, 0x4D, 0x2F, 0x4B, 0x30, 0x4C, 0x28, 0x78, 0x01, 0x22, 0x20, 0x3B, 0x20, 0x3C, + 0xC9, 0x28, 0x09, 0xD1, 0x20, 0x7C, 0x01, 0x28, 0x01, 0xD1, 0xC9, 0x20, 0x0D, 0xE0, 0xC9, 0x28, + 0x0C, 0xD0, 0x5A, 0x73, 0x1A, 0x73, 0x09, 0xE0, 0x21, 0x7C, 0xC9, 0x29, 0x01, 0xD1, 0x5A, 0x73, + 0x1A, 0x73, 0xCA, 0x28, 0x02, 0xD1, 0x01, 0x29, 0x00, 0xD1, 0x20, 0x74, 0x20, 0x7C, 0x00, 0x26, + 0x28, 0x70, 0x04, 0x28, 0x37, 0xD0, 0x08, 0xDC, 0x01, 0x28, 0x0B, 0xD0, 0x02, 0x28, 0x0E, 0xD0, + 0x03, 0x28, 0x33, 0xD1, 0x05, 0xF0, 0xD0, 0xFA, 0x70, 0xBD, 0xC9, 0x28, 0xFC, 0xD0, 0xCA, 0x28, + 0xFA, 0xD0, 0x2B, 0xE0, 0x26, 0x74, 0x2E, 0x70, 0x01, 0xF0, 0x4A, 0xFD, 0x70, 0xBD, 0x18, 0x48, + 0x01, 0x68, 0x18, 0x4A, 0x11, 0x43, 0x01, 0x60, 0x81, 0x68, 0x01, 0x22, 0x92, 0x03, 0x11, 0x43, + 0x81, 0x60, 0x04, 0xF0, 0xA1, 0xFE, 0x14, 0x48, 0x59, 0x21, 0x01, 0x60, 0x16, 0x21, 0x01, 0x60, + 0x88, 0x21, 0x01, 0x60, 0xFC, 0xF7, 0x3A, 0xFE, 0xF9, 0x24, 0x64, 0x02, 0x20, 0x46, 0xFC, 0xF7, + 0x45, 0xFE, 0x0E, 0x49, 0x20, 0x46, 0xFC, 0xF7, 0x95, 0xFE, 0x01, 0x20, 0xFC, 0xF7, 0x1A, 0xFE, + 0xFD, 0xF7, 0x42, 0xFB, 0x70, 0xBD, 0x03, 0x20, 0x02, 0xF0, 0x94, 0xFB, 0x26, 0x74, 0x2E, 0x70, + 0x70, 0xBD, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x20, 0x14, 0x04, 0x00, 0x20, 0x2B, 0x01, 0x00, 0x20, + 0x40, 0x40, 0x00, 0x50, 0x00, 0x00, 0x01, 0x40, 0x00, 0x01, 0x00, 0x50, 0x33, 0x33, 0x33, 0x33, + 0x10, 0xB5, 0x08, 0x48, 0xC0, 0x7A, 0x80, 0x07, 0x80, 0x0F, 0x06, 0xD0, 0x01, 0x28, 0x03, 0xD1, + 0x01, 0x21, 0x03, 0x20, 0xFD, 0xF7, 0x14, 0xF9, 0x10, 0xBD, 0x01, 0x21, 0x03, 0x20, 0xFC, 0xF7, + 0x93, 0xFE, 0x10, 0xBD, 0x14, 0x04, 0x00, 0x20, 0x20, 0x49, 0xC8, 0x68, 0x02, 0x46, 0x50, 0x32, + 0x4A, 0x62, 0x08, 0x62, 0x50, 0x32, 0x8A, 0x62, 0xA0, 0x32, 0xCA, 0x62, 0x50, 0x32, 0x0A, 0x63, + 0x50, 0x32, 0x4A, 0x63, 0x23, 0x22, 0x12, 0x01, 0x82, 0x18, 0xCA, 0x63, 0x05, 0x22, 0xD2, 0x01, + 0x82, 0x18, 0x0A, 0x64, 0x5F, 0x22, 0xD2, 0x00, 0x82, 0x18, 0x8A, 0x63, 0x0F, 0x22, 0x92, 0x01, + 0x82, 0x18, 0xCA, 0x65, 0x23, 0x22, 0x52, 0x01, 0x82, 0x18, 0x0A, 0x66, 0x05, 0x22, 0x12, 0x02, + 0x82, 0x18, 0x8A, 0x64, 0x2D, 0x22, 0x52, 0x01, 0x82, 0x18, 0xCA, 0x64, 0x19, 0x22, 0x92, 0x01, + 0x82, 0x18, 0x0A, 0x65, 0x37, 0x22, 0x52, 0x01, 0x82, 0x18, 0x4A, 0x65, 0x0F, 0x22, 0xD2, 0x01, + 0x82, 0x18, 0x8A, 0x65, 0x06, 0x4A, 0x82, 0x18, 0x4A, 0x64, 0x87, 0x22, 0x12, 0x01, 0x82, 0x18, + 0x4A, 0x61, 0x03, 0x4A, 0x3C, 0x32, 0x80, 0x18, 0x88, 0x61, 0x70, 0x47, 0xA4, 0x01, 0x00, 0x20, + 0x5C, 0x08, 0x00, 0x00, 0x10, 0xB5, 0x0A, 0x48, 0xC0, 0x7A, 0x80, 0x07, 0x80, 0x0F, 0x05, 0xD0, + 0x01, 0x28, 0x08, 0xD0, 0x02, 0x28, 0x06, 0xD0, 0x03, 0x28, 0x03, 0xD1, 0x01, 0x21, 0x03, 0x20, + 0xFC, 0xF7, 0x3A, 0xFE, 0x10, 0xBD, 0x01, 0x21, 0x03, 0x20, 0xFD, 0xF7, 0xB1, 0xF8, 0x10, 0xBD, + 0x14, 0x04, 0x00, 0x20, 0xF0, 0xB5, 0x25, 0x4A, 0x92, 0x6A, 0x52, 0x5C, 0x00, 0x2A, 0x42, 0xD0, + 0x23, 0x4A, 0x17, 0x7C, 0x94, 0x46, 0x21, 0x4A, 0x20, 0x4E, 0x54, 0x6A, 0x80, 0x3E, 0x13, 0x6A, + 0x32, 0x46, 0x60, 0x32, 0x45, 0x00, 0x49, 0x00, 0x00, 0x2F, 0x1D, 0xD0, 0x67, 0x46, 0x3F, 0x7C, + 0x87, 0x42, 0x19, 0xD8, 0xB0, 0x7F, 0x00, 0x28, 0x02, 0xD1, 0x58, 0x5E, 0x61, 0x5E, 0x01, 0xE0, + 0x60, 0x5E, 0x59, 0x5E, 0x0E, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x24, 0xDD, 0x10, 0x23, 0xD3, 0x5E, + 0x98, 0x42, 0x20, 0xDA, 0x13, 0x48, 0x43, 0x5F, 0x12, 0x20, 0x10, 0x5E, 0x18, 0xE0, 0x18, 0x18, + 0x88, 0x42, 0x18, 0xDD, 0x01, 0x20, 0xF0, 0xBD, 0x30, 0x7F, 0x00, 0x28, 0x02, 0xD1, 0x58, 0x5E, + 0x61, 0x5E, 0x01, 0xE0, 0x60, 0x5E, 0x59, 0x5E, 0x08, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x0A, 0xDD, + 0x0A, 0x23, 0xD3, 0x5E, 0x98, 0x42, 0x06, 0xDA, 0x06, 0x48, 0x43, 0x5F, 0x0C, 0x20, 0x10, 0x5E, + 0x1A, 0x1A, 0x8A, 0x42, 0xE3, 0xDB, 0x00, 0x20, 0xF0, 0xBD, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x20, + 0x54, 0x04, 0x00, 0x20, 0x8A, 0x06, 0x00, 0x20, 0x08, 0x4B, 0x10, 0xB5, 0x00, 0x20, 0x58, 0x72, + 0x19, 0x46, 0x24, 0x31, 0x5A, 0x79, 0x06, 0xE0, 0x0C, 0x5C, 0x03, 0x2C, 0x02, 0xD9, 0x01, 0x20, + 0x58, 0x72, 0x10, 0xBD, 0x40, 0x1C, 0x90, 0x42, 0xF6, 0xDB, 0x10, 0xBD, 0x80, 0x03, 0x00, 0x20, + 0xF8, 0xB5, 0x3B, 0x4C, 0x00, 0x25, 0x62, 0x79, 0x2E, 0x46, 0x2F, 0x46, 0x00, 0x2A, 0x6E, 0xD0, + 0x00, 0x20, 0x38, 0x4B, 0x0C, 0xE0, 0x41, 0x00, 0x59, 0x5E, 0xA9, 0x42, 0x03, 0xDD, 0x2E, 0x46, + 0x0D, 0x46, 0x07, 0x46, 0x02, 0xE0, 0xB1, 0x42, 0x00, 0xDD, 0x0E, 0x46, 0x40, 0x1C, 0xC0, 0xB2, + 0x90, 0x42, 0xF0, 0xD3, 0x00, 0x24, 0x17, 0xE0, 0x2E, 0x4A, 0x60, 0x00, 0x10, 0x32, 0x11, 0x5E, + 0x19, 0x23, 0xDB, 0x01, 0x99, 0x42, 0x08, 0xDC, 0x2B, 0x4B, 0x1B, 0x88, 0xC9, 0x18, 0x11, 0x52, + 0x27, 0x49, 0x24, 0x31, 0x08, 0x5D, 0x40, 0x1C, 0x08, 0x55, 0xA7, 0x42, 0x02, 0xD0, 0x20, 0x46, + 0x04, 0xF0, 0xCA, 0xFC, 0x64, 0x1C, 0xE4, 0xB2, 0x21, 0x48, 0x40, 0x79, 0x84, 0x42, 0xE3, 0xD3, + 0x1F, 0x4C, 0xE0, 0x78, 0x85, 0x42, 0x03, 0xDA, 0x38, 0x46, 0x04, 0xF0, 0xBD, 0xFC, 0x18, 0xE0, + 0xA0, 0x78, 0x85, 0x42, 0x15, 0xDD, 0xB5, 0x42, 0x13, 0xD0, 0xA8, 0x19, 0x0A, 0x22, 0xA9, 0x1B, + 0x50, 0x43, 0xFA, 0xF7, 0x75, 0xFD, 0x21, 0x79, 0x88, 0x42, 0x0A, 0xDC, 0x15, 0x49, 0x00, 0x20, + 0x7A, 0x00, 0x10, 0x31, 0x88, 0x52, 0x12, 0x49, 0x24, 0x31, 0xC8, 0x55, 0x01, 0x20, 0xB8, 0x40, + 0x20, 0x72, 0x0E, 0x20, 0x20, 0x5E, 0x11, 0x49, 0x88, 0x42, 0x03, 0xDC, 0x0E, 0x4A, 0x12, 0x88, + 0x80, 0x18, 0xE0, 0x81, 0x0E, 0x20, 0x20, 0x5E, 0x88, 0x42, 0x0C, 0xDD, 0x09, 0x4A, 0x78, 0x00, + 0x10, 0x3A, 0x13, 0x46, 0x10, 0x3B, 0x11, 0x5A, 0x1B, 0x5A, 0xC9, 0x18, 0x09, 0x04, 0x49, 0x0C, + 0x11, 0x52, 0x10, 0x20, 0xE0, 0x71, 0x20, 0x7A, 0x00, 0x28, 0x00, 0xD1, 0xE0, 0x81, 0xF8, 0xBD, + 0x80, 0x03, 0x00, 0x20, 0x58, 0x1A, 0x00, 0x20, 0x4A, 0x00, 0x00, 0x20, 0x30, 0x75, 0x00, 0x00, + 0xFE, 0xB5, 0x00, 0x20, 0xF9, 0x4B, 0x00, 0x90, 0x58, 0x7E, 0xF9, 0x49, 0x02, 0x90, 0xC9, 0x7A, + 0x49, 0x06, 0x02, 0xD5, 0x03, 0x21, 0x08, 0x1A, 0xC0, 0xB2, 0x02, 0x28, 0x02, 0xD3, 0x05, 0x21, + 0x08, 0x1A, 0xC0, 0xB2, 0xF2, 0x4C, 0x40, 0x34, 0xE1, 0x7D, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, + 0x00, 0xE0, 0xE1, 0x7D, 0xE1, 0x75, 0xA1, 0x7D, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, + 0xA1, 0x7D, 0xA1, 0x75, 0x21, 0x7E, 0xA2, 0x7D, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, + 0x00, 0xE0, 0x21, 0x7E, 0x21, 0x76, 0x61, 0x7E, 0xE2, 0x7D, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, + 0x00, 0x21, 0x00, 0xE0, 0x61, 0x7E, 0x61, 0x76, 0xE1, 0x7E, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, + 0x00, 0xE0, 0xE1, 0x7E, 0xE1, 0x76, 0xA1, 0x7E, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, 0x00, 0xE0, + 0xA1, 0x7E, 0xA1, 0x76, 0x21, 0x7F, 0xA2, 0x7E, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, 0x00, 0x21, + 0x00, 0xE0, 0x21, 0x7F, 0x21, 0x77, 0x61, 0x7F, 0xE2, 0x7E, 0x89, 0x18, 0x2A, 0x29, 0x01, 0xD9, + 0x00, 0x21, 0x00, 0xE0, 0x61, 0x7F, 0x61, 0x77, 0xA2, 0x7F, 0xD0, 0x49, 0xE4, 0x31, 0x0A, 0x71, + 0xCF, 0x4A, 0x60, 0x32, 0x55, 0x78, 0x4D, 0x71, 0xE5, 0x7F, 0x8D, 0x71, 0x12, 0x78, 0xCA, 0x71, + 0x85, 0x07, 0x0A, 0x79, 0xAD, 0x0F, 0x4A, 0x55, 0x42, 0x1C, 0x92, 0x07, 0x4D, 0x79, 0x92, 0x0F, + 0x8D, 0x54, 0x82, 0x1C, 0x92, 0x07, 0x8D, 0x79, 0x92, 0x0F, 0x8D, 0x54, 0xC2, 0x1C, 0x92, 0x07, + 0xCD, 0x79, 0x92, 0x0F, 0x8D, 0x54, 0xC1, 0x4A, 0x00, 0x25, 0xD5, 0x84, 0x0D, 0x46, 0xA4, 0x3D, + 0x6A, 0x89, 0xBE, 0x4B, 0x17, 0xB2, 0x01, 0x97, 0x00, 0x26, 0x5F, 0x85, 0x1E, 0x85, 0xAF, 0x89, + 0x1E, 0x46, 0x3B, 0xB2, 0x9C, 0x46, 0xB3, 0x85, 0xCB, 0x78, 0x53, 0x43, 0x9B, 0x0A, 0xF3, 0x85, + 0x4B, 0x78, 0x53, 0x43, 0x9B, 0x0A, 0xD2, 0x1A, 0x33, 0x46, 0x5A, 0x86, 0x0A, 0x78, 0xB5, 0x4E, + 0x7A, 0x43, 0x92, 0x0A, 0x1A, 0x86, 0x89, 0x78, 0x79, 0x43, 0x89, 0x0A, 0x7A, 0x1A, 0x19, 0x46, + 0x8A, 0x86, 0x00, 0x22, 0x80, 0x31, 0xCA, 0x61, 0x52, 0x1E, 0xAC, 0x49, 0x06, 0x27, 0x80, 0x31, + 0xC9, 0x69, 0x0B, 0x46, 0x79, 0x43, 0x72, 0x52, 0x89, 0x19, 0x4A, 0x80, 0x8A, 0x80, 0x59, 0x1C, + 0xA6, 0x4B, 0x80, 0x33, 0xD9, 0x61, 0x0A, 0x29, 0xEF, 0xDB, 0x21, 0x7B, 0x09, 0x07, 0x04, 0xD0, + 0x21, 0x7B, 0x09, 0x07, 0x09, 0x0F, 0x03, 0x29, 0x09, 0xD1, 0xA0, 0x48, 0x00, 0x21, 0x81, 0x71, + 0xC1, 0x84, 0x01, 0x9A, 0x42, 0x85, 0x01, 0x85, 0x61, 0x46, 0x81, 0x85, 0xFE, 0xBD, 0x21, 0x7B, + 0x02, 0x01, 0x8A, 0x18, 0x99, 0x49, 0x4A, 0x77, 0xD2, 0xB2, 0x92, 0x06, 0x23, 0x7B, 0x92, 0x0E, + 0x80, 0x01, 0x18, 0x18, 0x48, 0x77, 0xC0, 0xB2, 0x80, 0x09, 0x80, 0x01, 0x10, 0x43, 0x00, 0x26, + 0x0F, 0x46, 0x88, 0x71, 0x80, 0x37, 0xFE, 0x61, 0x91, 0x49, 0xF8, 0x69, 0x60, 0x39, 0x09, 0x18, + 0xA0, 0x31, 0x09, 0x79, 0x8F, 0x4B, 0x42, 0x00, 0xB4, 0x33, 0x99, 0x52, 0x8B, 0x49, 0xE4, 0x31, + 0x0E, 0x54, 0x08, 0x31, 0x0E, 0x54, 0x40, 0x1C, 0xF8, 0x61, 0x08, 0x28, 0xEC, 0xDB, 0x1A, 0x46, + 0x0A, 0x3A, 0xFE, 0x61, 0x85, 0x4E, 0x00, 0x23, 0x80, 0x36, 0xF0, 0x69, 0x41, 0x1C, 0x13, 0x54, + 0xF1, 0x61, 0x0A, 0x29, 0xF6, 0xDB, 0x02, 0x98, 0x80, 0x3E, 0x00, 0x28, 0x15, 0xD0, 0x01, 0x28, + 0x13, 0xD0, 0x02, 0x28, 0x05, 0xD0, 0x03, 0x28, 0x0F, 0xD1, 0x00, 0x20, 0x02, 0xF0, 0x38, 0xFA, + 0x08, 0xE0, 0xB0, 0x79, 0xC0, 0x07, 0x08, 0xD0, 0x00, 0x20, 0x02, 0xF0, 0x31, 0xFA, 0xB0, 0x79, + 0xC0, 0x07, 0x02, 0xD0, 0x01, 0x20, 0x02, 0xF0, 0x2B, 0xFA, 0x74, 0x48, 0x81, 0x79, 0x76, 0x48, + 0xCA, 0x06, 0x72, 0x4A, 0x22, 0xD4, 0x8B, 0x06, 0x9B, 0x0F, 0x0C, 0xD1, 0x03, 0x81, 0xA3, 0x7B, + 0xAE, 0x89, 0x73, 0x43, 0x9B, 0x0A, 0x43, 0x81, 0xA3, 0x7B, 0xE7, 0x7B, 0xDB, 0x19, 0x73, 0x43, + 0x9B, 0x0A, 0x13, 0x85, 0x0D, 0xE0, 0xAB, 0x89, 0x43, 0x81, 0xA6, 0x7B, 0x5E, 0x43, 0xB6, 0x0A, + 0x9E, 0x1B, 0x06, 0x81, 0xA6, 0x7B, 0xE7, 0x7B, 0xF6, 0x19, 0x5E, 0x43, 0xB6, 0x0A, 0x9B, 0x1B, + 0x93, 0x85, 0x01, 0x23, 0x13, 0x77, 0x63, 0x7B, 0x6A, 0x89, 0x23, 0xE0, 0x8B, 0x06, 0x9B, 0x0F, + 0x03, 0x2B, 0x0D, 0xD1, 0x00, 0x23, 0x03, 0x81, 0xA3, 0x7B, 0x6E, 0x89, 0x73, 0x43, 0x9B, 0x0A, + 0x43, 0x81, 0xA3, 0x7B, 0xE7, 0x7B, 0xDB, 0x19, 0x73, 0x43, 0x9B, 0x0A, 0xD3, 0x84, 0x0D, 0xE0, + 0x6B, 0x89, 0x43, 0x81, 0xA6, 0x7B, 0x5E, 0x43, 0xB6, 0x0A, 0x9E, 0x1B, 0x06, 0x81, 0xA6, 0x7B, + 0xE7, 0x7B, 0xF6, 0x19, 0x5E, 0x43, 0xB6, 0x0A, 0x9B, 0x1B, 0x53, 0x85, 0x00, 0x23, 0x13, 0x77, + 0x63, 0x7B, 0xAA, 0x89, 0x53, 0x43, 0x5B, 0x0A, 0x83, 0x81, 0x23, 0x7C, 0x12, 0xB2, 0x00, 0x2B, + 0x4C, 0xD0, 0x4A, 0x4B, 0x4E, 0x06, 0x21, 0xD4, 0x89, 0x09, 0x0C, 0xD1, 0xC1, 0x81, 0xA1, 0x7C, + 0xAE, 0x89, 0x71, 0x43, 0x89, 0x0A, 0x01, 0x82, 0xA1, 0x7C, 0xE7, 0x7C, 0xC9, 0x19, 0x71, 0x43, + 0x89, 0x0A, 0x19, 0x85, 0x0D, 0xE0, 0xA9, 0x89, 0x01, 0x82, 0xA6, 0x7C, 0x4E, 0x43, 0xB6, 0x0A, + 0x8E, 0x1B, 0xC6, 0x81, 0xA6, 0x7C, 0xE7, 0x7C, 0xF6, 0x19, 0x4E, 0x43, 0xB6, 0x0A, 0x89, 0x1B, + 0x99, 0x85, 0x01, 0x21, 0x99, 0x77, 0x63, 0x7C, 0x69, 0x89, 0x22, 0xE0, 0x89, 0x09, 0x03, 0x29, + 0x0D, 0xD1, 0x00, 0x21, 0xC1, 0x81, 0xA1, 0x7C, 0x6E, 0x89, 0x71, 0x43, 0x89, 0x0A, 0x01, 0x82, + 0xA1, 0x7C, 0xE7, 0x7C, 0xC9, 0x19, 0x71, 0x43, 0x89, 0x0A, 0xD9, 0x84, 0x0D, 0xE0, 0x69, 0x89, + 0x01, 0x82, 0xA6, 0x7C, 0x4E, 0x43, 0xB6, 0x0A, 0x8E, 0x1B, 0xC6, 0x81, 0xA6, 0x7C, 0xE7, 0x7C, + 0xF6, 0x19, 0x4E, 0x43, 0xB6, 0x0A, 0x89, 0x1B, 0x59, 0x85, 0x00, 0x21, 0x99, 0x77, 0x63, 0x7C, + 0xA9, 0x89, 0x4B, 0x43, 0x5B, 0x0A, 0x09, 0xB2, 0x43, 0x82, 0x00, 0x91, 0x26, 0x48, 0x00, 0x21, + 0x20, 0x30, 0x07, 0x46, 0xC1, 0x61, 0x22, 0x49, 0xF8, 0x69, 0x60, 0x39, 0x09, 0x18, 0xA0, 0x31, + 0x09, 0x79, 0x00, 0x29, 0x1A, 0xD0, 0x21, 0x7C, 0x00, 0x29, 0x09, 0xD0, 0x21, 0x7C, 0x81, 0x42, + 0x06, 0xDC, 0x1C, 0x4D, 0x43, 0x00, 0xB4, 0x35, 0xE9, 0x5E, 0x00, 0x9E, 0x71, 0x43, 0x04, 0xE0, + 0x18, 0x4D, 0x43, 0x00, 0xB4, 0x35, 0xE9, 0x5E, 0x51, 0x43, 0xCE, 0x17, 0x36, 0x0E, 0x71, 0x18, + 0x09, 0x12, 0x40, 0x1C, 0xE9, 0x52, 0xF8, 0x61, 0x08, 0x28, 0xDC, 0xDB, 0x0F, 0x49, 0x2E, 0x22, + 0x26, 0x20, 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDA, 0xC8, 0x85, 0x32, 0x22, 0x2A, 0x20, + 0x8A, 0x5E, 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDD, 0x48, 0x86, 0x30, 0x22, 0x28, 0x20, 0x8A, 0x5E, + 0x08, 0x5E, 0x82, 0x42, 0x00, 0xDA, 0x08, 0x86, 0x34, 0x22, 0x2C, 0x20, 0x8A, 0x5E, 0x08, 0x5E, + 0x82, 0x42, 0x00, 0xDD, 0x88, 0x86, 0xF8, 0x69, 0x48, 0x71, 0xFE, 0xBD, 0x24, 0x01, 0x00, 0x20, + 0x14, 0x04, 0x00, 0x20, 0xD6, 0x05, 0x00, 0x20, 0x84, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x19, 0x4B, + 0x58, 0x78, 0x99, 0x79, 0x04, 0x46, 0x00, 0x29, 0x02, 0xD1, 0x17, 0x48, 0x40, 0x7C, 0x22, 0xE0, + 0xFF, 0x29, 0x20, 0xD0, 0x1A, 0x7A, 0x00, 0x2A, 0x03, 0xD1, 0x14, 0x4D, 0x2D, 0x78, 0x00, 0x2D, + 0x0D, 0xD0, 0x00, 0x25, 0x03, 0x29, 0x01, 0xD1, 0xFF, 0x20, 0x06, 0xE0, 0x00, 0x2A, 0x06, 0xD0, + 0x01, 0x29, 0xF9, 0xD0, 0x02, 0x29, 0x00, 0xD1, 0x10, 0x46, 0x5D, 0x81, 0x0B, 0xE0, 0x0A, 0x21, + 0x0C, 0x22, 0x59, 0x5E, 0x9A, 0x5E, 0x91, 0x42, 0x04, 0xDC, 0x09, 0x4A, 0x12, 0x88, 0x89, 0x18, + 0x59, 0x81, 0x00, 0xE0, 0x00, 0x20, 0xA0, 0x42, 0x03, 0xD0, 0x58, 0x70, 0xC0, 0xB2, 0x03, 0xF0, + 0x89, 0xFB, 0x70, 0xBD, 0x80, 0x03, 0x00, 0x20, 0xF4, 0x03, 0x00, 0x20, 0x27, 0x00, 0x00, 0x20, + 0x4A, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x2A, 0x48, 0x80, 0x79, 0x00, 0x28, 0x4F, 0xD0, 0x28, 0x4E, + 0x00, 0x20, 0x80, 0x36, 0x27, 0x4F, 0x35, 0x46, 0x64, 0x35, 0xF0, 0x61, 0x39, 0x5C, 0x00, 0x29, + 0x1C, 0xD1, 0xB1, 0x6A, 0x08, 0x5C, 0x00, 0x28, 0x1F, 0xD0, 0x00, 0x24, 0x12, 0xE0, 0x28, 0x5D, + 0x00, 0x28, 0x0D, 0xD1, 0xF0, 0x69, 0xC1, 0xB2, 0x20, 0x46, 0xFF, 0xF7, 0xC3, 0xFC, 0x28, 0x55, + 0x28, 0x5D, 0x00, 0x28, 0x04, 0xD0, 0x1A, 0x49, 0xF0, 0x69, 0xEC, 0x31, 0x08, 0x55, 0x05, 0xE0, + 0x64, 0x1C, 0xE4, 0xB2, 0x16, 0x48, 0x40, 0x79, 0x84, 0x42, 0xE8, 0xD3, 0xF1, 0x69, 0xB0, 0x6A, + 0x40, 0x5C, 0x00, 0x28, 0x01, 0xD0, 0x01, 0x22, 0x00, 0xE0, 0x00, 0x22, 0xF1, 0x69, 0x48, 0x1C, + 0x7A, 0x54, 0xF0, 0x61, 0x0A, 0x28, 0xD1, 0xDB, 0x0D, 0x4E, 0x00, 0x20, 0x37, 0x46, 0x70, 0x77, + 0x04, 0x46, 0xEC, 0x37, 0x10, 0xE0, 0x28, 0x5D, 0x01, 0x28, 0x0B, 0xD1, 0x39, 0x5D, 0x20, 0x46, + 0xFF, 0xF7, 0x98, 0xFC, 0x28, 0x55, 0x28, 0x5D, 0x01, 0x28, 0x03, 0xD1, 0x71, 0x7F, 0xA0, 0x40, + 0x08, 0x43, 0x70, 0x77, 0x64, 0x1C, 0xE4, 0xB2, 0x70, 0x79, 0x84, 0x42, 0xEB, 0xD3, 0xF0, 0xBD, + 0x24, 0x01, 0x00, 0x20, 0x80, 0x06, 0x00, 0x20, 0xF0, 0xB5, 0x0D, 0x4E, 0x00, 0x24, 0x37, 0x46, + 0x05, 0x46, 0x10, 0x3F, 0x0E, 0xE0, 0x60, 0x00, 0x29, 0x5C, 0x42, 0x19, 0x52, 0x78, 0x09, 0x02, + 0x89, 0x18, 0x64, 0x29, 0x02, 0xD2, 0x31, 0x5A, 0x39, 0x52, 0x02, 0xE0, 0xE0, 0xB2, 0xFB, 0xF7, + 0x75, 0xFB, 0x64, 0x1C, 0x03, 0x48, 0x40, 0x79, 0x84, 0x42, 0xEC, 0xDB, 0xF0, 0xBD, 0x00, 0x00, + 0x48, 0x1A, 0x00, 0x20, 0x80, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x23, 0x06, 0xE0, 0xC2, 0x5C, + 0x5C, 0x1C, 0x04, 0x5D, 0xC4, 0x54, 0x5C, 0x1C, 0x02, 0x55, 0x9B, 0x1C, 0x8B, 0x42, 0xF6, 0xDB, + 0x10, 0xBD, 0x00, 0x00, 0xF8, 0xB5, 0x04, 0xF0, 0x57, 0xFA, 0x4B, 0x4C, 0x3C, 0x20, 0xA0, 0x76, + 0x4A, 0x4F, 0x59, 0x20, 0x38, 0x60, 0x16, 0x20, 0x38, 0x60, 0x88, 0x20, 0x38, 0x60, 0x48, 0x48, + 0x01, 0x68, 0x04, 0x26, 0x31, 0x43, 0x01, 0x60, 0x01, 0x68, 0x49, 0x08, 0x49, 0x00, 0x01, 0x60, + 0x02, 0x20, 0xFC, 0xF7, 0xC7, 0xFD, 0x01, 0x28, 0xFA, 0xD1, 0xFC, 0xF7, 0xDF, 0xF9, 0xF9, 0x25, + 0x6D, 0x02, 0x69, 0x46, 0x28, 0x46, 0xFC, 0xF7, 0x11, 0xFA, 0x3E, 0x49, 0x00, 0x98, 0x88, 0x42, + 0x06, 0xD1, 0x28, 0x46, 0xFC, 0xF7, 0xE2, 0xF9, 0x3B, 0x49, 0x28, 0x46, 0xFC, 0xF7, 0x32, 0xFA, + 0x01, 0x20, 0xFC, 0xF7, 0x15, 0xFF, 0xA0, 0x7E, 0x38, 0x49, 0x48, 0x43, 0xFC, 0xF7, 0x7A, 0xFE, + 0x02, 0x20, 0xFC, 0xF7, 0xE3, 0xFE, 0xFC, 0xF7, 0xB9, 0xF9, 0x00, 0x25, 0x3D, 0x60, 0x28, 0x46, + 0xFC, 0xF7, 0x04, 0xFB, 0x32, 0x48, 0x01, 0x68, 0x32, 0x4A, 0x11, 0x40, 0x01, 0x60, 0x01, 0x68, + 0x31, 0x4A, 0x11, 0x43, 0x01, 0x60, 0x81, 0x68, 0xB1, 0x43, 0x81, 0x60, 0x81, 0x68, 0x2F, 0x4A, + 0x11, 0x43, 0x81, 0x60, 0x2A, 0x48, 0x40, 0x30, 0x01, 0x68, 0x30, 0x22, 0x11, 0x43, 0x01, 0x60, + 0x81, 0x68, 0x31, 0x43, 0x81, 0x60, 0x03, 0x22, 0x11, 0x46, 0x10, 0x46, 0xFC, 0xF7, 0x6E, 0xFC, + 0x03, 0x22, 0x01, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0x69, 0xFC, 0x03, 0x22, 0x11, 0x46, 0x02, 0x20, + 0xFC, 0xF7, 0x64, 0xFC, 0x02, 0x22, 0x09, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x5F, 0xFC, 0x02, 0x22, + 0x0B, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x5A, 0xFC, 0x02, 0x22, 0x0A, 0x21, 0x10, 0x46, 0xFC, 0xF7, + 0x55, 0xFC, 0x02, 0x22, 0x0C, 0x21, 0x10, 0x46, 0xFC, 0xF7, 0x50, 0xFC, 0x03, 0x22, 0x01, 0x21, + 0x10, 0x46, 0xFC, 0xF7, 0x4B, 0xFC, 0x01, 0x20, 0x20, 0x73, 0x65, 0x73, 0x03, 0x21, 0x65, 0x77, + 0x08, 0x46, 0xFC, 0xF7, 0xA7, 0xFA, 0x05, 0x46, 0x03, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0xA2, 0xFA, + 0x04, 0x00, 0x04, 0xD1, 0x00, 0x22, 0x03, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0x37, 0xFC, 0x68, 0x00, + 0x01, 0x19, 0x0B, 0x48, 0x81, 0x74, 0xF8, 0xBD, 0x1C, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, + 0x00, 0x02, 0x00, 0x50, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x40, 0x42, 0x0F, 0x00, + 0x80, 0x40, 0x00, 0x50, 0xCC, 0xFF, 0xFC, 0xF3, 0x13, 0x00, 0x03, 0x0C, 0x01, 0x21, 0x00, 0x00, + 0xF4, 0x03, 0x00, 0x20, 0x10, 0xB5, 0xFE, 0xF7, 0xC9, 0xF8, 0x00, 0xF0, 0xCD, 0xFC, 0xFA, 0xF7, + 0xFF, 0xFC, 0x00, 0xF0, 0x15, 0xF8, 0xFB, 0xF7, 0xEF, 0xF8, 0xFB, 0xF7, 0x15, 0xF9, 0xFB, 0xF7, + 0x13, 0xF9, 0xFD, 0xF7, 0xBD, 0xFB, 0x00, 0xF0, 0xF5, 0xF8, 0xFA, 0xF7, 0xC5, 0xFA, 0xFB, 0xF7, + 0x9D, 0xFD, 0xFB, 0xF7, 0x0B, 0xFC, 0xFF, 0xF7, 0xAD, 0xFE, 0x02, 0xF0, 0x79, 0xFC, 0x10, 0xBD, + 0xF8, 0xB5, 0x73, 0x4D, 0x00, 0x20, 0x29, 0x46, 0x40, 0x39, 0x0C, 0x46, 0xE8, 0x83, 0x60, 0x34, + 0x68, 0x83, 0x08, 0x76, 0xA0, 0x82, 0x08, 0x70, 0x08, 0x7C, 0x49, 0x7C, 0x22, 0x46, 0x80, 0x1C, + 0x20, 0x32, 0x49, 0x1C, 0x41, 0x43, 0x00, 0x91, 0xD0, 0x61, 0xC8, 0xE0, 0x68, 0x49, 0x40, 0x31, + 0x0B, 0x69, 0x19, 0x5C, 0x00, 0x29, 0x7E, 0xD1, 0x65, 0x4F, 0x41, 0x00, 0x40, 0x37, 0xBA, 0x68, + 0x56, 0x5E, 0x8A, 0x18, 0x6E, 0x82, 0x02, 0x21, 0x51, 0x5E, 0xB1, 0x42, 0x73, 0xDC, 0x18, 0x18, + 0x02, 0x21, 0x41, 0x70, 0x3E, 0x46, 0x80, 0x3E, 0x32, 0x7C, 0xF8, 0x69, 0xB9, 0x68, 0x80, 0x18, + 0x42, 0x00, 0x51, 0x18, 0x12, 0x23, 0x04, 0x22, 0xEB, 0x5E, 0x8A, 0x5E, 0x9A, 0x42, 0xED, 0xDC, + 0x3A, 0x69, 0x02, 0x21, 0x80, 0x18, 0x81, 0x70, 0xF8, 0x69, 0xB9, 0x68, 0x42, 0x00, 0x52, 0x18, + 0x20, 0x3A, 0x1E, 0x23, 0xD3, 0x5E, 0x12, 0x22, 0xAA, 0x5E, 0x93, 0x42, 0xDE, 0xDC, 0x33, 0x7C, + 0xC3, 0x1A, 0x5B, 0x00, 0x59, 0x18, 0x20, 0x39, 0x1C, 0x23, 0xCB, 0x5E, 0x93, 0x42, 0x4A, 0xDC, + 0x3B, 0x69, 0x01, 0x21, 0x19, 0x54, 0x31, 0x7C, 0xF8, 0x69, 0x89, 0x1C, 0xFA, 0xF7, 0x58, 0xF9, + 0x21, 0x80, 0x61, 0x80, 0xA0, 0x80, 0xE0, 0x80, 0x01, 0x20, 0xA8, 0x83, 0x68, 0x8A, 0x28, 0x83, + 0x00, 0x21, 0x30, 0x46, 0x71, 0x75, 0x20, 0x30, 0xC1, 0x70, 0xFD, 0xF7, 0xF9, 0xFB, 0x04, 0x21, + 0x61, 0x5E, 0x01, 0x23, 0x13, 0xE0, 0x00, 0x20, 0x20, 0x5E, 0x0B, 0xE0, 0x3C, 0x4A, 0x3C, 0x4E, + 0x40, 0x3A, 0x12, 0x7C, 0x40, 0x36, 0x36, 0x69, 0x92, 0x1C, 0x4A, 0x43, 0x47, 0x1C, 0x30, 0x18, + 0x13, 0x54, 0x38, 0x46, 0x02, 0x22, 0xA2, 0x5E, 0x90, 0x42, 0xEF, 0xD9, 0x49, 0x1C, 0x06, 0x20, + 0x20, 0x5E, 0x81, 0x42, 0xE7, 0xD9, 0x28, 0x8B, 0x00, 0x28, 0x53, 0xD0, 0x02, 0x20, 0x00, 0x21, + 0x20, 0x5E, 0x61, 0x5E, 0x88, 0x42, 0x06, 0xD1, 0x06, 0x22, 0x04, 0x26, 0xA2, 0x5E, 0xA6, 0x5F, + 0x92, 0x1B, 0x03, 0x2A, 0x46, 0xDC, 0x40, 0x1A, 0x03, 0x28, 0x07, 0xDD, 0x06, 0x20, 0x04, 0x21, + 0x20, 0x5E, 0x61, 0x5E, 0x00, 0xE0, 0x3D, 0xE0, 0x88, 0x42, 0x3B, 0xD0, 0x24, 0x4E, 0xA8, 0x8B, + 0x40, 0x3E, 0xF1, 0x7D, 0x88, 0x42, 0x00, 0xD3, 0x33, 0x70, 0xFD, 0xF7, 0x73, 0xFF, 0x29, 0x8B, + 0x08, 0x1A, 0x28, 0x83, 0x31, 0x7E, 0x4A, 0x00, 0x1D, 0x49, 0x40, 0x31, 0x8B, 0x69, 0x98, 0x52, + 0x18, 0x20, 0x28, 0x5E, 0xF2, 0x7C, 0x90, 0x42, 0x02, 0xDD, 0xA0, 0x8A, 0x40, 0x1C, 0xA0, 0x82, + 0xEB, 0x8B, 0x4A, 0x69, 0x20, 0x88, 0xD0, 0x54, 0xE8, 0x8B, 0x40, 0x1C, 0x80, 0xB2, 0xE8, 0x83, + 0x4B, 0x69, 0x62, 0x88, 0x1A, 0x54, 0xE8, 0x8B, 0x40, 0x1C, 0x80, 0xB2, 0xE8, 0x83, 0x4B, 0x69, + 0xA2, 0x88, 0x1A, 0x54, 0xE8, 0x8B, 0x40, 0x1C, 0x80, 0xB2, 0xE8, 0x83, 0x49, 0x69, 0xE2, 0x88, + 0x0A, 0x54, 0xE8, 0x8B, 0x40, 0x1C, 0xE8, 0x83, 0x30, 0x7E, 0x40, 0x1C, 0xC0, 0xB2, 0x30, 0x76, + 0x0A, 0x28, 0x0B, 0xD2, 0x06, 0x48, 0x40, 0x30, 0xC1, 0x69, 0x49, 0x1C, 0xC1, 0x61, 0x04, 0x49, + 0x00, 0x9A, 0x40, 0x31, 0xC8, 0x69, 0x90, 0x42, 0x00, 0xD2, 0x2F, 0xE7, 0xF8, 0xBD, 0x00, 0x00, + 0x64, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x00, 0x20, 0xF9, 0x4D, 0x93, 0xB0, 0x43, 0x1E, 0x02, 0x46, + 0x2C, 0x6A, 0x41, 0x00, 0x63, 0x52, 0x6C, 0x6A, 0x63, 0x52, 0x44, 0x1C, 0xA9, 0x6A, 0xA4, 0xB2, + 0x0A, 0x54, 0x20, 0x46, 0x0A, 0x2C, 0xF3, 0xD3, 0xF1, 0x48, 0x80, 0x38, 0x04, 0x46, 0x01, 0x7E, + 0x40, 0x34, 0xE1, 0x83, 0x89, 0xB2, 0x00, 0x29, 0x7C, 0xD0, 0x00, 0x22, 0x62, 0x83, 0xEA, 0x61, + 0xC7, 0x7C, 0x10, 0x46, 0xAE, 0x69, 0x0A, 0xE0, 0x42, 0x00, 0xB2, 0x5E, 0xBA, 0x42, 0x04, 0xDD, + 0x01, 0x22, 0x63, 0x8B, 0x82, 0x40, 0x1A, 0x43, 0x62, 0x83, 0x40, 0x1C, 0xE8, 0x61, 0x88, 0x42, + 0xF2, 0xDB, 0x00, 0x20, 0x07, 0x90, 0x60, 0x8B, 0x00, 0x22, 0x05, 0x90, 0x62, 0x83, 0x06, 0x92, + 0x01, 0x29, 0x18, 0xD1, 0x68, 0x69, 0x01, 0x78, 0x00, 0x29, 0x01, 0xD0, 0x49, 0x1E, 0x01, 0x70, + 0xDB, 0x4B, 0x41, 0x78, 0x80, 0x3B, 0x1E, 0x7C, 0xB1, 0x42, 0x01, 0xD2, 0x49, 0x1C, 0x41, 0x70, + 0x81, 0x78, 0x00, 0x29, 0x01, 0xD0, 0x49, 0x1E, 0x81, 0x70, 0xC1, 0x78, 0x5B, 0x7C, 0x99, 0x42, + 0x01, 0xD2, 0x49, 0x1C, 0xC1, 0x70, 0x00, 0x20, 0xE8, 0x61, 0xD2, 0x48, 0x12, 0x90, 0xD0, 0x48, + 0x20, 0x38, 0x11, 0x90, 0x60, 0xE3, 0x82, 0x04, 0xCD, 0x49, 0x12, 0x0C, 0x15, 0x46, 0x49, 0x69, + 0x11, 0x9B, 0x4E, 0x5D, 0x1E, 0x80, 0x52, 0x1C, 0x92, 0xB2, 0x10, 0x96, 0x8B, 0x5C, 0x11, 0x9D, + 0x52, 0x1C, 0x6B, 0x80, 0x92, 0xB2, 0x8F, 0x5C, 0x11, 0x9D, 0x52, 0x1C, 0xAF, 0x80, 0x92, 0xB2, + 0x0F, 0x97, 0x89, 0x5C, 0x11, 0x9A, 0x9C, 0x46, 0xD1, 0x80, 0x9A, 0x19, 0xD3, 0x0F, 0x9A, 0x18, + 0xC1, 0x4B, 0x0E, 0x91, 0x52, 0x10, 0x1A, 0x54, 0x79, 0x18, 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, + 0x1A, 0x46, 0x0A, 0x32, 0x00, 0x23, 0x11, 0x54, 0x1E, 0x46, 0x1D, 0x46, 0x23, 0xE0, 0x10, 0x98, + 0x82, 0xB2, 0x1C, 0xE0, 0xB6, 0x48, 0xB6, 0x49, 0x80, 0x38, 0x00, 0x7C, 0x89, 0x68, 0x80, 0x1C, + 0x78, 0x43, 0x80, 0x18, 0x00, 0x04, 0xC0, 0x0B, 0x08, 0x5E, 0xA0, 0x82, 0x10, 0x28, 0x02, 0xDA, + 0x00, 0x20, 0x01, 0xE0, 0x27, 0xE3, 0x10, 0x38, 0x60, 0x82, 0x00, 0xB2, 0x01, 0x46, 0x79, 0x43, + 0x8E, 0x19, 0x2D, 0x18, 0x51, 0x1C, 0x50, 0x43, 0x89, 0xB2, 0xC3, 0x18, 0x0A, 0x46, 0x62, 0x45, + 0xE0, 0xDD, 0x7F, 0x1C, 0xBF, 0xB2, 0x0E, 0x98, 0x87, 0x42, 0xD8, 0xDD, 0x10, 0x98, 0x80, 0xB2, + 0x5D, 0xE0, 0x0F, 0x99, 0x8F, 0xB2, 0xA2, 0x49, 0x04, 0x97, 0x80, 0x39, 0x09, 0x7C, 0x0D, 0x91, + 0x8A, 0x1C, 0x57, 0x43, 0x0C, 0x91, 0x39, 0x18, 0x8F, 0xB2, 0x0B, 0x92, 0x9C, 0x49, 0x7A, 0x00, + 0x89, 0x68, 0x0A, 0x91, 0x8A, 0x5E, 0x8E, 0x46, 0x52, 0x10, 0xE2, 0x82, 0x0C, 0x99, 0x7F, 0x1A, + 0xBF, 0x1E, 0x3F, 0x04, 0xFF, 0x0B, 0x71, 0x46, 0xC9, 0x5F, 0xA1, 0x82, 0x91, 0x42, 0x00, 0xDB, + 0x11, 0x46, 0xA1, 0x82, 0x10, 0x29, 0x01, 0xDA, 0x00, 0x21, 0x00, 0xE0, 0x10, 0x39, 0x61, 0x82, + 0x04, 0x99, 0x49, 0x1E, 0x8A, 0xB2, 0x12, 0x21, 0x61, 0x5E, 0x4A, 0x43, 0x92, 0x19, 0x6F, 0x18, + 0x02, 0x92, 0x41, 0x43, 0x0E, 0x9A, 0xCB, 0x18, 0x0B, 0x99, 0x92, 0xB2, 0x51, 0x43, 0x09, 0x18, + 0x8D, 0xB2, 0x0A, 0x9E, 0x69, 0x00, 0x71, 0x5E, 0x49, 0x10, 0xE1, 0x82, 0x0D, 0x9E, 0xAD, 0x19, + 0xAD, 0x1C, 0x2D, 0x04, 0x0A, 0x9E, 0xED, 0x0B, 0x75, 0x5F, 0xA5, 0x82, 0x8D, 0x42, 0x00, 0xDB, + 0x0D, 0x46, 0xA5, 0x82, 0x10, 0x2D, 0x02, 0xDA, 0x00, 0x21, 0x61, 0x82, 0x01, 0xE0, 0x10, 0x3D, + 0x65, 0x82, 0x52, 0x1C, 0x12, 0x21, 0x96, 0xB2, 0x61, 0x5E, 0x02, 0x46, 0x0D, 0x46, 0x75, 0x43, + 0x02, 0x9E, 0x40, 0x1C, 0xAE, 0x19, 0x7D, 0x18, 0x51, 0x43, 0x80, 0xB2, 0xCB, 0x18, 0x60, 0x45, + 0x9F, 0xDD, 0x0F, 0x98, 0x87, 0xB2, 0x54, 0xE0, 0x10, 0x98, 0x81, 0xB2, 0x70, 0x48, 0x03, 0x91, + 0x80, 0x38, 0x00, 0x7C, 0x80, 0x1C, 0x78, 0x43, 0x41, 0x18, 0x09, 0x90, 0x8A, 0xB2, 0x6C, 0x48, + 0x51, 0x00, 0x80, 0x68, 0x08, 0x90, 0x41, 0x5E, 0x52, 0x1E, 0x49, 0x10, 0x12, 0x04, 0xE1, 0x82, + 0xD2, 0x0B, 0x80, 0x5E, 0xA0, 0x82, 0x88, 0x42, 0x00, 0xDB, 0x08, 0x46, 0xA0, 0x82, 0x10, 0x28, + 0x01, 0xDA, 0x00, 0x20, 0x00, 0xE0, 0x10, 0x38, 0x60, 0x82, 0x03, 0x98, 0x40, 0x1E, 0x81, 0xB2, + 0x12, 0x20, 0x20, 0x5E, 0x02, 0x46, 0x7A, 0x43, 0x96, 0x19, 0x2A, 0x18, 0x01, 0x92, 0x62, 0x46, + 0x09, 0x9D, 0x92, 0xB2, 0x48, 0x43, 0xAD, 0x18, 0xA9, 0xB2, 0xC3, 0x18, 0x48, 0x00, 0x08, 0x9D, + 0x49, 0x1C, 0x28, 0x5E, 0x09, 0x04, 0x40, 0x10, 0xE0, 0x82, 0x08, 0x9D, 0xC9, 0x0B, 0x69, 0x5E, + 0xA1, 0x82, 0x81, 0x42, 0x00, 0xDB, 0x01, 0x46, 0xA1, 0x82, 0x10, 0x29, 0x02, 0xDA, 0x00, 0x20, + 0x60, 0x82, 0x01, 0xE0, 0x10, 0x39, 0x61, 0x82, 0x12, 0x20, 0x20, 0x5E, 0x01, 0x9D, 0x01, 0x46, + 0x79, 0x43, 0x52, 0x1C, 0x92, 0xB2, 0x2D, 0x18, 0x7F, 0x1C, 0x8E, 0x19, 0x50, 0x43, 0xBF, 0xB2, + 0xC3, 0x18, 0x0E, 0x98, 0x87, 0x42, 0xA7, 0xDD, 0x00, 0x2D, 0x00, 0xD1, 0x01, 0x25, 0x58, 0x02, + 0x29, 0x46, 0xF9, 0xF7, 0x4B, 0xFF, 0xFF, 0x38, 0x01, 0x38, 0x07, 0xB2, 0x70, 0x02, 0x29, 0x46, + 0xF9, 0xF7, 0x44, 0xFF, 0xFF, 0x38, 0x01, 0x38, 0x06, 0xB2, 0xFF, 0x20, 0x00, 0x01, 0x85, 0x42, + 0x01, 0xD3, 0xFF, 0x20, 0x05, 0xE0, 0x28, 0x11, 0x00, 0xB2, 0x00, 0x90, 0x01, 0x28, 0x01, 0xDA, + 0x01, 0x20, 0x00, 0x90, 0x00, 0x2F, 0x01, 0xDA, 0x00, 0x27, 0x04, 0xE0, 0x60, 0x89, 0x87, 0x42, + 0x01, 0xDB, 0x40, 0x1E, 0x07, 0xB2, 0x00, 0x2E, 0x00, 0xDA, 0x00, 0x26, 0xA5, 0x89, 0xAE, 0x42, + 0x01, 0xDB, 0x68, 0x1E, 0x06, 0xB2, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x5E, 0xD1, 0x2C, 0x4A, + 0x26, 0x20, 0x80, 0x3A, 0x10, 0x5E, 0x03, 0x21, 0x09, 0x02, 0x43, 0x18, 0x9F, 0x42, 0x0F, 0xDA, + 0x87, 0x42, 0x0D, 0xDB, 0xC3, 0x1B, 0x5B, 0x18, 0x5D, 0x00, 0x5B, 0x19, 0xDD, 0x0F, 0xEB, 0x18, + 0x5B, 0x10, 0xC3, 0x1A, 0x5B, 0x18, 0x1F, 0xB2, 0x87, 0x42, 0x16, 0xDA, 0x07, 0x46, 0x14, 0xE0, + 0x2A, 0x20, 0x10, 0x5E, 0x43, 0x1A, 0x9F, 0x42, 0x0F, 0xDD, 0x87, 0x42, 0x0D, 0xDA, 0x3B, 0x1A, + 0x5B, 0x18, 0x5D, 0x00, 0x5B, 0x19, 0xDD, 0x0F, 0xEB, 0x18, 0x5B, 0x10, 0x1B, 0x18, 0x5B, 0x1A, + 0x1F, 0xB2, 0x87, 0x42, 0x01, 0xDB, 0x40, 0x1E, 0x07, 0xB2, 0x28, 0x20, 0x10, 0x5E, 0x43, 0x18, + 0x9E, 0x42, 0x0F, 0xDA, 0x86, 0x42, 0x0D, 0xDB, 0x82, 0x1B, 0x52, 0x18, 0x53, 0x00, 0xD2, 0x18, + 0xD3, 0x0F, 0x9A, 0x18, 0x52, 0x10, 0x82, 0x1A, 0x51, 0x18, 0x0E, 0xB2, 0x86, 0x42, 0x00, 0xDA, + 0x06, 0x46, 0xBB, 0xE1, 0x2C, 0x20, 0x10, 0x5E, 0x42, 0x1A, 0x96, 0x42, 0xF9, 0xDD, 0x86, 0x42, + 0xF7, 0xDA, 0x32, 0x1A, 0x52, 0x18, 0x53, 0x00, 0xD2, 0x18, 0xD3, 0x0F, 0x9A, 0x18, 0x52, 0x10, + 0x12, 0x18, 0x51, 0x1A, 0x0E, 0xB2, 0x86, 0x42, 0xEB, 0xDB, 0x40, 0x1E, 0xA5, 0xE1, 0x00, 0x00, + 0xA4, 0x01, 0x00, 0x20, 0x14, 0x04, 0x00, 0x20, 0xEA, 0x06, 0x00, 0x20, 0x12, 0x98, 0x00, 0x7B, + 0x40, 0x09, 0x01, 0x28, 0x7E, 0xD1, 0xE1, 0x48, 0x26, 0x25, 0x45, 0x5F, 0x01, 0x20, 0x80, 0x02, + 0x28, 0x18, 0x87, 0x42, 0x2F, 0xDA, 0xAF, 0x42, 0x2D, 0xDB, 0xE8, 0x1B, 0x01, 0x27, 0xBF, 0x02, + 0xC0, 0x19, 0x80, 0xB2, 0xB9, 0x10, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, + 0xF9, 0xF7, 0xA4, 0xFE, 0x28, 0x1A, 0xC0, 0x19, 0x18, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, + 0x09, 0xD8, 0xD3, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, 0xA1, 0xFE, 0xD1, 0x49, 0x28, 0x1A, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, 0x16, 0x21, 0x48, 0x43, - 0x0F, 0x21, 0xF9, 0xF7, 0x75, 0xFB, 0x28, 0x1A, 0xFF, 0x30, 0x79, 0x30, 0x06, 0xB2, 0xAE, 0x42, - 0x00, 0xDA, 0x2E, 0x46, 0xF0, 0xE0, 0x2C, 0x25, 0x4D, 0x5F, 0x29, 0x1A, 0x8E, 0x42, 0xF9, 0xDD, - 0xAE, 0x42, 0xF7, 0xDA, 0x71, 0x1B, 0x06, 0x46, 0x08, 0x18, 0xFF, 0x21, 0x80, 0xB2, 0x01, 0x31, - 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, 0xF9, 0xF7, 0x4F, 0xFB, 0x40, 0x19, - 0x80, 0x1B, 0x19, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, 0x0A, 0xD8, 0x7F, 0x49, 0x80, 0x00, - 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, 0x4C, 0xFB, 0x7D, 0x49, 0x40, 0x19, 0x49, 0x42, 0x40, 0x18, - 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF9, 0xF7, - 0x3F, 0xFB, 0x40, 0x19, 0xFF, 0x38, 0x79, 0x38, 0x06, 0xB2, 0xAE, 0x42, 0xCA, 0xDB, 0x6D, 0x1E, - 0x2E, 0xB2, 0xB9, 0xE0, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x02, 0x28, 0x40, 0xD1, 0xFF, 0x3F, + 0x0F, 0x21, 0xF9, 0xF7, 0x95, 0xFE, 0x28, 0x1A, 0xFF, 0x30, 0x79, 0x30, 0x07, 0xB2, 0xAF, 0x42, + 0x39, 0xDA, 0x2F, 0x46, 0x37, 0xE0, 0xC5, 0x49, 0x2A, 0x25, 0x4D, 0x5F, 0x01, 0x21, 0x89, 0x02, + 0x6A, 0x1A, 0x97, 0x42, 0x2F, 0xDD, 0xAF, 0x42, 0x2D, 0xDA, 0x78, 0x1B, 0x40, 0x18, 0x0F, 0x46, + 0x80, 0xB2, 0x89, 0x10, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, 0xF9, 0xF7, + 0x6D, 0xFE, 0x40, 0x19, 0xC0, 0x1B, 0x19, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, 0x0A, 0xD8, + 0xB7, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, 0x6A, 0xFE, 0xB5, 0x49, 0x40, 0x19, + 0x49, 0x42, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, 0x16, 0x21, 0x48, 0x43, + 0x0F, 0x21, 0xF9, 0xF7, 0x5D, 0xFE, 0x40, 0x19, 0xFF, 0x38, 0x79, 0x38, 0x07, 0xB2, 0xAF, 0x42, + 0x01, 0xDB, 0x6D, 0x1E, 0x2F, 0xB2, 0xA9, 0x49, 0x28, 0x25, 0x4D, 0x5F, 0x01, 0x20, 0x80, 0x02, + 0x2A, 0x18, 0x96, 0x42, 0x31, 0xDA, 0xAE, 0x42, 0x2F, 0xDB, 0xA9, 0x1B, 0x06, 0x46, 0x08, 0x18, + 0x80, 0xB2, 0x00, 0xE0, 0x60, 0xE0, 0xFF, 0x21, 0x01, 0x31, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, + 0x48, 0x43, 0x05, 0x21, 0xF9, 0xF7, 0x32, 0xFE, 0x28, 0x1A, 0x80, 0x19, 0x18, 0xE0, 0x01, 0x21, + 0x49, 0x02, 0x88, 0x42, 0x09, 0xD8, 0x9A, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, + 0x2F, 0xFE, 0x98, 0x49, 0x28, 0x1A, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, + 0x16, 0x21, 0x48, 0x43, 0x0F, 0x21, 0xF9, 0xF7, 0x23, 0xFE, 0x28, 0x1A, 0xFF, 0x30, 0x79, 0x30, + 0x06, 0xB2, 0xAE, 0x42, 0x00, 0xDA, 0x2E, 0x46, 0xF0, 0xE0, 0x2C, 0x25, 0x4D, 0x5F, 0x29, 0x1A, + 0x8E, 0x42, 0xF9, 0xDD, 0xAE, 0x42, 0xF7, 0xDA, 0x71, 0x1B, 0x06, 0x46, 0x08, 0x18, 0xFF, 0x21, + 0x80, 0xB2, 0x01, 0x31, 0x88, 0x42, 0x07, 0xD8, 0x06, 0x21, 0x48, 0x43, 0x05, 0x21, 0xF9, 0xF7, + 0xFD, 0xFD, 0x40, 0x19, 0x80, 0x1B, 0x19, 0xE0, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, 0x0A, 0xD8, + 0x7F, 0x49, 0x80, 0x00, 0x40, 0x18, 0x03, 0x21, 0xF9, 0xF7, 0xFA, 0xFD, 0x7D, 0x49, 0x40, 0x19, + 0x49, 0x42, 0x40, 0x18, 0x0A, 0xE0, 0xFF, 0x38, 0xFF, 0x38, 0x02, 0x38, 0x16, 0x21, 0x48, 0x43, + 0x0F, 0x21, 0xF9, 0xF7, 0xED, 0xFD, 0x40, 0x19, 0xFF, 0x38, 0x79, 0x38, 0x06, 0xB2, 0xAE, 0x42, + 0xCA, 0xDB, 0x6D, 0x1E, 0x2E, 0xB2, 0xB9, 0xE0, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x02, 0x28, + 0x40, 0xD1, 0xFF, 0x3F, 0x01, 0x3F, 0x38, 0xB2, 0x00, 0x28, 0x01, 0xDA, 0x00, 0x20, 0x07, 0xE0, + 0x61, 0x89, 0xCA, 0x1F, 0xFF, 0x3A, 0xFA, 0x3A, 0x90, 0x42, 0x01, 0xDB, 0x51, 0x1E, 0x08, 0xB2, + 0x61, 0x89, 0x48, 0x43, 0xFF, 0x39, 0xFF, 0x39, 0x02, 0x39, 0xF9, 0xF7, 0xBF, 0xFD, 0xFF, 0x36, + 0x07, 0xB2, 0x01, 0x36, 0x01, 0x21, 0x30, 0xB2, 0x89, 0x02, 0x88, 0x42, 0x0C, 0xDA, 0x08, 0x1A, + 0x0E, 0x22, 0x50, 0x43, 0xC2, 0x17, 0x52, 0x0F, 0x10, 0x18, 0xC0, 0x10, 0x08, 0x1A, 0x00, 0xB2, + 0x00, 0x28, 0x13, 0xDA, 0x00, 0x20, 0x11, 0xE0, 0x27, 0x21, 0x49, 0x02, 0x88, 0x42, 0x0D, 0xDD, + 0x40, 0x1A, 0x0E, 0x22, 0x50, 0x43, 0xC2, 0x17, 0x52, 0x0F, 0x10, 0x18, 0xC0, 0x10, 0x40, 0x18, + 0x29, 0x21, 0x00, 0xB2, 0x49, 0x02, 0x88, 0x42, 0x00, 0xDB, 0x48, 0x1E, 0x68, 0x43, 0x29, 0x21, + 0x49, 0x02, 0x70, 0xE0, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x03, 0x28, 0x25, 0xD1, 0xFF, 0x3F, 0x01, 0x3F, 0x38, 0xB2, 0x00, 0x28, 0x01, 0xDA, 0x00, 0x20, 0x07, 0xE0, 0x61, 0x89, 0xCA, 0x1F, 0xFF, 0x3A, 0xFA, 0x3A, 0x90, 0x42, 0x01, 0xDB, 0x51, 0x1E, 0x08, 0xB2, 0x61, 0x89, 0x48, 0x43, - 0xFF, 0x39, 0xFF, 0x39, 0x02, 0x39, 0xF9, 0xF7, 0x11, 0xFB, 0xFF, 0x36, 0x07, 0xB2, 0x01, 0x36, - 0x01, 0x21, 0x30, 0xB2, 0x89, 0x02, 0x88, 0x42, 0x0C, 0xDA, 0x08, 0x1A, 0x0E, 0x22, 0x50, 0x43, - 0xC2, 0x17, 0x52, 0x0F, 0x10, 0x18, 0xC0, 0x10, 0x08, 0x1A, 0x00, 0xB2, 0x00, 0x28, 0x13, 0xDA, - 0x00, 0x20, 0x11, 0xE0, 0x27, 0x21, 0x49, 0x02, 0x88, 0x42, 0x0D, 0xDD, 0x40, 0x1A, 0x0E, 0x22, - 0x50, 0x43, 0xC2, 0x17, 0x52, 0x0F, 0x10, 0x18, 0xC0, 0x10, 0x40, 0x18, 0x29, 0x21, 0x00, 0xB2, - 0x49, 0x02, 0x88, 0x42, 0x00, 0xDB, 0x48, 0x1E, 0x68, 0x43, 0x29, 0x21, 0x49, 0x02, 0x70, 0xE0, - 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x03, 0x28, 0x25, 0xD1, 0xFF, 0x3F, 0x01, 0x3F, 0x38, 0xB2, - 0x00, 0x28, 0x01, 0xDA, 0x00, 0x20, 0x07, 0xE0, 0x61, 0x89, 0xCA, 0x1F, 0xFF, 0x3A, 0xFA, 0x3A, - 0x90, 0x42, 0x01, 0xDB, 0x51, 0x1E, 0x08, 0xB2, 0x61, 0x89, 0x48, 0x43, 0xFF, 0x39, 0xFF, 0x39, - 0x02, 0x39, 0xF9, 0xF7, 0xCB, 0xFA, 0xFF, 0x3E, 0x07, 0xB2, 0x01, 0x3E, 0x30, 0xB2, 0x00, 0x28, - 0x00, 0xDA, 0x00, 0x20, 0xE9, 0x1F, 0xFF, 0x39, 0xFA, 0x39, 0x88, 0x42, 0x01, 0xDB, 0x48, 0x1E, - 0x00, 0xB2, 0x68, 0x43, 0x45, 0xE0, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, 0x04, 0x28, 0x43, 0xD1, - 0xFF, 0x3F, 0x01, 0x3F, 0x38, 0xB2, 0x00, 0x28, 0x01, 0xDA, 0x00, 0x20, 0x07, 0xE0, 0x61, 0x89, - 0xCA, 0x1F, 0xFF, 0x3A, 0xFA, 0x3A, 0x90, 0x42, 0x01, 0xDB, 0x51, 0x1E, 0x08, 0xB2, 0x61, 0x89, - 0x48, 0x43, 0xFF, 0x39, 0xFF, 0x39, 0x02, 0x39, 0xF9, 0xF7, 0xA0, 0xFA, 0xFF, 0x36, 0xFF, 0x36, - 0x07, 0xB2, 0x02, 0x36, 0x05, 0x21, 0x30, 0xB2, 0x09, 0x02, 0x88, 0x42, 0x0C, 0xDA, 0x08, 0x1A, - 0xC2, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x80, 0x10, 0x08, 0x1A, 0x00, 0xB2, - 0x00, 0x28, 0x13, 0xDA, 0x00, 0x20, 0x11, 0xE0, 0x4F, 0x21, 0x09, 0x02, 0x88, 0x42, 0x0D, 0xDD, - 0x40, 0x1A, 0xC2, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x80, 0x10, 0x40, 0x18, - 0x15, 0x21, 0x00, 0xB2, 0x89, 0x02, 0x88, 0x42, 0x00, 0xDB, 0x48, 0x1E, 0x15, 0x21, 0x68, 0x43, - 0x89, 0x02, 0xF9, 0xF7, 0x73, 0xFA, 0x06, 0xB2, 0x13, 0x4A, 0x06, 0x98, 0x80, 0x32, 0xD1, 0x69, - 0x40, 0x00, 0x00, 0x9B, 0x0F, 0x52, 0x17, 0x6A, 0x06, 0x99, 0x3E, 0x52, 0x4D, 0x1C, 0xE8, 0xB2, - 0x56, 0x6A, 0x06, 0x90, 0x07, 0x9D, 0x73, 0x54, 0x01, 0x20, 0x05, 0x99, 0xA8, 0x40, 0x08, 0x40, - 0x63, 0x8B, 0x07, 0x99, 0x18, 0x43, 0x49, 0x1C, 0x60, 0x83, 0xC8, 0xB2, 0x07, 0x90, 0x90, 0x69, - 0x40, 0x1C, 0x90, 0x61, 0x04, 0x49, 0xE2, 0x8B, 0x80, 0x31, 0x88, 0x69, 0x90, 0x42, 0x00, 0xDA, - 0x97, 0xE4, 0x13, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, 0x00, 0xFC, 0xFF, 0xFF, - 0xCD, 0x02, 0x00, 0x00, 0xF0, 0xB5, 0x1E, 0x4B, 0x00, 0x20, 0x19, 0x7C, 0x5A, 0x7C, 0x89, 0x1C, - 0x52, 0x1C, 0x51, 0x43, 0x02, 0x22, 0x1E, 0x46, 0x04, 0x46, 0x80, 0x36, 0x0B, 0xE0, 0xF5, 0x68, - 0x0B, 0x18, 0x2A, 0x54, 0xF5, 0x68, 0xEA, 0x54, 0x77, 0x68, 0x45, 0x00, 0x7C, 0x53, 0x5B, 0x00, - 0x75, 0x68, 0x40, 0x1C, 0xEC, 0x52, 0x12, 0x4B, 0x1B, 0x7C, 0x9B, 0x1C, 0x98, 0x42, 0xEE, 0xDB, - 0x0F, 0x4F, 0x38, 0x7C, 0x06, 0xE0, 0xF3, 0x68, 0x45, 0x00, 0x1A, 0x54, 0x73, 0x68, 0x5C, 0x53, - 0x3B, 0x7C, 0xC0, 0x18, 0x80, 0x1C, 0x88, 0x42, 0xF5, 0xDB, 0x38, 0x7C, 0x7B, 0x7C, 0x81, 0x1C, - 0x9B, 0x1C, 0x40, 0x00, 0x59, 0x43, 0xC0, 0x1C, 0x07, 0xE0, 0xF3, 0x68, 0x45, 0x00, 0x1A, 0x54, - 0x73, 0x68, 0x5C, 0x53, 0x3B, 0x7C, 0xC0, 0x18, 0x80, 0x1C, 0x88, 0x42, 0xF5, 0xDB, 0xF0, 0xBD, - 0x38, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0xB0, 0x00, 0x20, 0x04, 0x90, 0xFF, 0x48, 0x04, 0x78, - 0xFF, 0x48, 0x05, 0x68, 0xFF, 0x48, 0x00, 0x78, 0xFF, 0x4E, 0x36, 0x78, 0x70, 0x43, 0x40, 0x00, - 0xFB, 0x4E, 0x36, 0x68, 0x80, 0x19, 0x03, 0x90, 0x00, 0x21, 0xE1, 0xE0, 0x00, 0x20, 0x06, 0x90, - 0x05, 0x90, 0xFA, 0x48, 0x00, 0x78, 0x48, 0x43, 0x03, 0x46, 0x00, 0x22, 0x18, 0xE0, 0x98, 0x18, - 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x06, 0x9E, - 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x66, 0x42, 0xB0, 0x42, - 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, - 0xEA, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0xE9, 0x48, 0x06, 0x78, 0xE7, 0x48, 0x00, 0x78, - 0x46, 0x43, 0xE8, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x18, 0xE0, 0x98, 0x18, - 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x06, 0x9E, - 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x66, 0x42, 0xB0, 0x42, - 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, - 0xD8, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0xD7, 0x48, 0x00, 0x78, 0x48, 0x43, 0x03, 0x46, - 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0xA0, 0x42, 0x07, 0xDD, - 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, - 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, 0x98, 0x18, - 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0xC6, 0x48, - 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0xC2, 0x48, 0x06, 0x78, 0xC3, 0x48, 0x00, 0x78, 0x46, 0x43, - 0xC2, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x46, 0x00, - 0x03, 0x98, 0x80, 0x5F, 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, - 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, - 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x05, 0x9E, - 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0xB1, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0x48, 0x00, - 0xAF, 0x4E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x1B, 0x06, 0x90, 0x48, 0x00, 0xAD, 0x4E, 0x30, 0x5E, - 0x05, 0x9E, 0x80, 0x1B, 0x05, 0x90, 0x4E, 0x00, 0xA9, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, 0x13, 0xDD, - 0x4E, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x00, 0x96, 0xBE, 0x19, 0x76, 0x10, 0x06, 0x9F, 0xBE, 0x42, - 0x22, 0xDB, 0x4E, 0x00, 0xA2, 0x4F, 0xBE, 0x5F, 0xF7, 0x0F, 0x01, 0x96, 0xBE, 0x19, 0x76, 0x10, - 0x76, 0x42, 0x06, 0x9F, 0xBE, 0x42, 0x17, 0xDC, 0x4E, 0x00, 0x9E, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, - 0x15, 0xDD, 0x4E, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x02, 0x96, 0xBE, 0x19, 0x76, 0x10, 0x05, 0x9F, - 0xBE, 0x42, 0x09, 0xDB, 0x4E, 0x00, 0x97, 0x4F, 0xB8, 0x5F, 0xC6, 0x0F, 0x36, 0x18, 0x76, 0x10, - 0x76, 0x42, 0x05, 0x9F, 0xBE, 0x42, 0x02, 0xDD, 0x04, 0x98, 0x40, 0x1C, 0x04, 0x90, 0x49, 0x1C, - 0x8B, 0x48, 0x00, 0x78, 0x81, 0x42, 0x00, 0xDA, 0x18, 0xE7, 0x00, 0x21, 0x34, 0xE1, 0x00, 0x20, - 0x06, 0x90, 0x05, 0x90, 0x85, 0x48, 0x00, 0x78, 0x86, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x84, 0x48, - 0x00, 0x78, 0x46, 0x43, 0x81, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x18, 0xE0, - 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x2E, 0x5E, - 0x06, 0x98, 0x30, 0x18, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x66, 0x42, - 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, - 0x52, 0x1C, 0x72, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0x70, 0x48, 0x00, 0x78, 0x71, 0x4E, - 0x36, 0x78, 0x86, 0x19, 0x6E, 0x48, 0x00, 0x78, 0x46, 0x43, 0x73, 0x48, 0x00, 0x78, 0x6B, 0x4F, - 0x3F, 0x78, 0x78, 0x43, 0x36, 0x18, 0x6B, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, + 0xFF, 0x39, 0xFF, 0x39, 0x02, 0x39, 0xF9, 0xF7, 0x79, 0xFD, 0xFF, 0x3E, 0x07, 0xB2, 0x01, 0x3E, + 0x30, 0xB2, 0x00, 0x28, 0x00, 0xDA, 0x00, 0x20, 0xE9, 0x1F, 0xFF, 0x39, 0xFA, 0x39, 0x88, 0x42, + 0x01, 0xDB, 0x48, 0x1E, 0x00, 0xB2, 0x68, 0x43, 0x45, 0xE0, 0x12, 0x98, 0x00, 0x7B, 0x40, 0x09, + 0x04, 0x28, 0x43, 0xD1, 0xFF, 0x3F, 0x01, 0x3F, 0x38, 0xB2, 0x00, 0x28, 0x01, 0xDA, 0x00, 0x20, + 0x07, 0xE0, 0x61, 0x89, 0xCA, 0x1F, 0xFF, 0x3A, 0xFA, 0x3A, 0x90, 0x42, 0x01, 0xDB, 0x51, 0x1E, + 0x08, 0xB2, 0x61, 0x89, 0x48, 0x43, 0xFF, 0x39, 0xFF, 0x39, 0x02, 0x39, 0xF9, 0xF7, 0x4E, 0xFD, + 0xFF, 0x36, 0xFF, 0x36, 0x07, 0xB2, 0x02, 0x36, 0x05, 0x21, 0x30, 0xB2, 0x09, 0x02, 0x88, 0x42, + 0x0C, 0xDA, 0x08, 0x1A, 0xC2, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, 0x80, 0x10, + 0x08, 0x1A, 0x00, 0xB2, 0x00, 0x28, 0x13, 0xDA, 0x00, 0x20, 0x11, 0xE0, 0x4F, 0x21, 0x09, 0x02, + 0x88, 0x42, 0x0D, 0xDD, 0x40, 0x1A, 0xC2, 0x00, 0x80, 0x18, 0xC2, 0x17, 0x92, 0x0F, 0x10, 0x18, + 0x80, 0x10, 0x40, 0x18, 0x15, 0x21, 0x00, 0xB2, 0x89, 0x02, 0x88, 0x42, 0x00, 0xDB, 0x48, 0x1E, + 0x15, 0x21, 0x68, 0x43, 0x89, 0x02, 0xF9, 0xF7, 0x21, 0xFD, 0x06, 0xB2, 0x13, 0x4A, 0x06, 0x98, + 0x80, 0x32, 0x11, 0x6A, 0x40, 0x00, 0x00, 0x9B, 0x0F, 0x52, 0x57, 0x6A, 0x06, 0x99, 0x3E, 0x52, + 0x4D, 0x1C, 0xE8, 0xB2, 0x96, 0x6A, 0x06, 0x90, 0x07, 0x9D, 0x73, 0x54, 0x01, 0x20, 0x05, 0x99, + 0xA8, 0x40, 0x08, 0x40, 0x63, 0x8B, 0x07, 0x99, 0x18, 0x43, 0x49, 0x1C, 0x60, 0x83, 0xC8, 0xB2, + 0x07, 0x90, 0xD0, 0x69, 0x40, 0x1C, 0xD0, 0x61, 0x04, 0x49, 0xE2, 0x8B, 0x80, 0x31, 0xC8, 0x69, + 0x90, 0x42, 0x00, 0xDA, 0x97, 0xE4, 0x13, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x24, 0x01, 0x00, 0x20, + 0x00, 0xFC, 0xFF, 0xFF, 0xCD, 0x02, 0x00, 0x00, 0xF0, 0xB5, 0x1E, 0x4B, 0x00, 0x20, 0x19, 0x7C, + 0x5A, 0x7C, 0x89, 0x1C, 0x52, 0x1C, 0x51, 0x43, 0x02, 0x22, 0x1E, 0x46, 0x04, 0x46, 0x80, 0x36, + 0x0B, 0xE0, 0x35, 0x69, 0x0B, 0x18, 0x2A, 0x54, 0x35, 0x69, 0xEA, 0x54, 0xB7, 0x68, 0x45, 0x00, + 0x7C, 0x53, 0x5B, 0x00, 0xB5, 0x68, 0x40, 0x1C, 0xEC, 0x52, 0x12, 0x4B, 0x1B, 0x7C, 0x9B, 0x1C, + 0x98, 0x42, 0xEE, 0xDB, 0x0F, 0x4F, 0x38, 0x7C, 0x06, 0xE0, 0x33, 0x69, 0x45, 0x00, 0x1A, 0x54, + 0xB3, 0x68, 0x5C, 0x53, 0x3B, 0x7C, 0xC0, 0x18, 0x80, 0x1C, 0x88, 0x42, 0xF5, 0xDB, 0x38, 0x7C, + 0x7B, 0x7C, 0x81, 0x1C, 0x9B, 0x1C, 0x40, 0x00, 0x59, 0x43, 0xC0, 0x1C, 0x07, 0xE0, 0x33, 0x69, + 0x45, 0x00, 0x1A, 0x54, 0xB3, 0x68, 0x5C, 0x53, 0x3B, 0x7C, 0xC0, 0x18, 0x80, 0x1C, 0x88, 0x42, + 0xF5, 0xDB, 0xF0, 0xBD, 0x24, 0x01, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0xB0, 0x00, 0x20, 0x04, 0x90, + 0xFF, 0x48, 0x04, 0x78, 0xFF, 0x48, 0x05, 0x68, 0xFF, 0x48, 0x00, 0x78, 0xFF, 0x4E, 0x36, 0x78, + 0x70, 0x43, 0x40, 0x00, 0xFB, 0x4E, 0x36, 0x68, 0x80, 0x19, 0x03, 0x90, 0x00, 0x21, 0xE1, 0xE0, + 0x00, 0x20, 0x06, 0x90, 0x05, 0x90, 0xFA, 0x48, 0x00, 0x78, 0x48, 0x43, 0x03, 0x46, 0x00, 0x22, 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, 0x30, 0x1A, - 0x05, 0x90, 0x52, 0x1C, 0x5B, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0x5A, 0x48, 0x00, 0x78, - 0x5A, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x56, 0x48, 0x00, 0x78, 0x46, 0x43, 0x56, 0x48, 0x00, 0x78, - 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, + 0x05, 0x90, 0x52, 0x1C, 0xEA, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0xE9, 0x48, 0x06, 0x78, + 0xE7, 0x48, 0x00, 0x78, 0x46, 0x43, 0xE8, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, + 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, 0x40, 0x00, + 0x28, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, + 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, 0x30, 0x1A, + 0x05, 0x90, 0x52, 0x1C, 0xD8, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0xD7, 0x48, 0x00, 0x78, + 0x48, 0x43, 0x03, 0x46, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, - 0x06, 0xDA, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, - 0x52, 0x1C, 0x45, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0x43, 0x48, 0x00, 0x78, 0x43, 0x4E, - 0x36, 0x78, 0x86, 0x19, 0x3E, 0x48, 0x00, 0x78, 0x46, 0x43, 0x43, 0x48, 0x00, 0x78, 0x3E, 0x4F, - 0x3F, 0x78, 0x78, 0x43, 0x36, 0x18, 0x3D, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, - 0x1C, 0xE0, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, - 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, - 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, 0x98, 0x18, 0x46, 0x00, - 0x03, 0x98, 0x80, 0x5F, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0x2B, 0x48, 0x00, 0x78, - 0x82, 0x42, 0xDE, 0xDB, 0x26, 0x48, 0x00, 0x78, 0x08, 0x18, 0x40, 0x00, 0x28, 0x4E, 0x30, 0x5E, - 0x06, 0x9E, 0x80, 0x1B, 0x06, 0x90, 0x22, 0x48, 0x00, 0x78, 0x08, 0x18, 0x40, 0x00, 0x25, 0x4E, - 0x30, 0x5E, 0x05, 0x9E, 0x80, 0x1B, 0x05, 0x90, 0x1D, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, - 0x1F, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, 0x19, 0xDD, 0x19, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, - 0xBE, 0x5F, 0xF7, 0x0F, 0x00, 0x96, 0xBE, 0x19, 0x76, 0x10, 0x06, 0x9F, 0xBE, 0x42, 0x47, 0xDB, - 0x13, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0x15, 0x4F, 0xBE, 0x5F, 0xF7, 0x0F, 0x01, 0x96, - 0xBE, 0x19, 0x76, 0x10, 0x76, 0x42, 0x06, 0x9F, 0xBE, 0x42, 0x39, 0xDC, 0x0C, 0x4E, 0x36, 0x78, - 0x8E, 0x19, 0x76, 0x00, 0x0F, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, 0x34, 0xDD, 0x08, 0x4E, 0x36, 0x78, - 0x8E, 0x19, 0x76, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x02, 0x96, 0x17, 0xE0, 0x4C, 0x01, 0x00, 0x20, - 0xB8, 0x01, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, 0x40, 0x01, 0x00, 0x20, 0x41, 0x01, 0x00, 0x20, - 0x46, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, 0x45, 0x01, 0x00, 0x20, - 0x24, 0x05, 0x00, 0x20, 0x64, 0x05, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, 0xBE, 0x19, 0x76, 0x10, - 0x05, 0x9F, 0xBE, 0x42, 0x0C, 0xDB, 0x11, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0x10, 0x4F, - 0xB8, 0x5F, 0xC6, 0x0F, 0x36, 0x18, 0x76, 0x10, 0x76, 0x42, 0x05, 0x9F, 0xBE, 0x42, 0x02, 0xDD, - 0x04, 0x98, 0x40, 0x1C, 0x04, 0x90, 0x49, 0x1C, 0x0A, 0x48, 0x00, 0x78, 0x81, 0x42, 0x00, 0xDA, - 0xC5, 0xE6, 0x09, 0x4E, 0x30, 0x78, 0xC6, 0x0F, 0x36, 0x18, 0x76, 0x10, 0x04, 0x9F, 0xBE, 0x42, - 0x02, 0xDA, 0x00, 0x20, 0x07, 0xB0, 0xF0, 0xBD, 0x01, 0x20, 0xFB, 0xE7, 0x46, 0x01, 0x00, 0x20, - 0x64, 0x05, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, 0xC2, 0x06, 0xD2, 0x0E, - 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, - 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x06, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, + 0x52, 0x1C, 0xC6, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0xC2, 0x48, 0x06, 0x78, 0xC3, 0x48, + 0x00, 0x78, 0x46, 0x43, 0xC2, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, + 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, 0x40, 0x00, + 0x03, 0x9E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, + 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, + 0x30, 0x5E, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0xB1, 0x48, 0x00, 0x78, 0x82, 0x42, + 0xDE, 0xDB, 0x48, 0x00, 0xAF, 0x4E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x1B, 0x06, 0x90, 0x48, 0x00, + 0xAD, 0x4E, 0x30, 0x5E, 0x05, 0x9E, 0x80, 0x1B, 0x05, 0x90, 0x4E, 0x00, 0xA9, 0x4F, 0xBE, 0x5F, + 0x00, 0x2E, 0x13, 0xDD, 0x4E, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x00, 0x96, 0xBE, 0x19, 0x76, 0x10, + 0x06, 0x9F, 0xBE, 0x42, 0x22, 0xDB, 0x4E, 0x00, 0xA2, 0x4F, 0xBE, 0x5F, 0xF7, 0x0F, 0x01, 0x96, + 0xBE, 0x19, 0x76, 0x10, 0x76, 0x42, 0x06, 0x9F, 0xBE, 0x42, 0x17, 0xDC, 0x4E, 0x00, 0x9E, 0x4F, + 0xBE, 0x5F, 0x00, 0x2E, 0x15, 0xDD, 0x4E, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x02, 0x96, 0xBE, 0x19, + 0x76, 0x10, 0x05, 0x9F, 0xBE, 0x42, 0x09, 0xDB, 0x4E, 0x00, 0x97, 0x4F, 0xB8, 0x5F, 0xC6, 0x0F, + 0x36, 0x18, 0x76, 0x10, 0x76, 0x42, 0x05, 0x9F, 0xBE, 0x42, 0x02, 0xDD, 0x04, 0x98, 0x40, 0x1C, + 0x04, 0x90, 0x49, 0x1C, 0x8B, 0x48, 0x00, 0x78, 0x81, 0x42, 0x00, 0xDA, 0x18, 0xE7, 0x00, 0x21, + 0x34, 0xE1, 0x00, 0x20, 0x06, 0x90, 0x05, 0x90, 0x85, 0x48, 0x00, 0x78, 0x86, 0x4E, 0x36, 0x78, + 0x86, 0x19, 0x84, 0x48, 0x00, 0x78, 0x46, 0x43, 0x81, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, + 0x00, 0x22, 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, 0x98, 0x18, + 0x40, 0x00, 0x2E, 0x5E, 0x06, 0x98, 0x30, 0x18, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, 0x40, 0x00, + 0x28, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x05, 0x9E, + 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0x72, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, 0x70, 0x48, + 0x00, 0x78, 0x71, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x6E, 0x48, 0x00, 0x78, 0x46, 0x43, 0x73, 0x48, + 0x00, 0x78, 0x6B, 0x4F, 0x3F, 0x78, 0x78, 0x43, 0x36, 0x18, 0x6B, 0x48, 0x00, 0x78, 0x48, 0x43, + 0x33, 0x18, 0x00, 0x22, 0x18, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0xA0, 0x42, 0x06, 0xDD, + 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0B, 0xE0, 0x98, 0x18, + 0x40, 0x00, 0x28, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x05, 0xDA, 0x98, 0x18, 0x40, 0x00, 0x28, 0x5E, + 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0x5B, 0x48, 0x00, 0x78, 0x82, 0x42, 0xE2, 0xDB, + 0x5A, 0x48, 0x00, 0x78, 0x5A, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x56, 0x48, 0x00, 0x78, 0x46, 0x43, + 0x56, 0x48, 0x00, 0x78, 0x48, 0x43, 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x40, 0x00, + 0x03, 0x9E, 0x30, 0x5E, 0xA0, 0x42, 0x07, 0xDD, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, + 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, + 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x05, 0x9E, + 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, 0x45, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0x43, 0x48, + 0x00, 0x78, 0x43, 0x4E, 0x36, 0x78, 0x86, 0x19, 0x3E, 0x48, 0x00, 0x78, 0x46, 0x43, 0x43, 0x48, + 0x00, 0x78, 0x3E, 0x4F, 0x3F, 0x78, 0x78, 0x43, 0x36, 0x18, 0x3D, 0x48, 0x00, 0x78, 0x48, 0x43, + 0x33, 0x18, 0x00, 0x22, 0x1C, 0xE0, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0xA0, 0x42, + 0x07, 0xDD, 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x06, 0x9E, 0x80, 0x19, 0x06, 0x90, + 0x0D, 0xE0, 0x98, 0x18, 0x40, 0x00, 0x03, 0x9E, 0x30, 0x5E, 0x66, 0x42, 0xB0, 0x42, 0x06, 0xDA, + 0x98, 0x18, 0x46, 0x00, 0x03, 0x98, 0x80, 0x5F, 0x05, 0x9E, 0x30, 0x1A, 0x05, 0x90, 0x52, 0x1C, + 0x2B, 0x48, 0x00, 0x78, 0x82, 0x42, 0xDE, 0xDB, 0x26, 0x48, 0x00, 0x78, 0x08, 0x18, 0x40, 0x00, + 0x28, 0x4E, 0x30, 0x5E, 0x06, 0x9E, 0x80, 0x1B, 0x06, 0x90, 0x22, 0x48, 0x00, 0x78, 0x08, 0x18, + 0x40, 0x00, 0x25, 0x4E, 0x30, 0x5E, 0x05, 0x9E, 0x80, 0x1B, 0x05, 0x90, 0x1D, 0x4E, 0x36, 0x78, + 0x8E, 0x19, 0x76, 0x00, 0x1F, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, 0x19, 0xDD, 0x19, 0x4E, 0x36, 0x78, + 0x8E, 0x19, 0x76, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x00, 0x96, 0xBE, 0x19, 0x76, 0x10, 0x06, 0x9F, + 0xBE, 0x42, 0x47, 0xDB, 0x13, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0x15, 0x4F, 0xBE, 0x5F, + 0xF7, 0x0F, 0x01, 0x96, 0xBE, 0x19, 0x76, 0x10, 0x76, 0x42, 0x06, 0x9F, 0xBE, 0x42, 0x39, 0xDC, + 0x0C, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0x0F, 0x4F, 0xBE, 0x5F, 0x00, 0x2E, 0x34, 0xDD, + 0x08, 0x4E, 0x36, 0x78, 0x8E, 0x19, 0x76, 0x00, 0xBE, 0x5F, 0xF7, 0x0F, 0x02, 0x96, 0x17, 0xE0, + 0x38, 0x01, 0x00, 0x20, 0xA8, 0x01, 0x00, 0x20, 0x34, 0x01, 0x00, 0x20, 0x2C, 0x01, 0x00, 0x20, + 0x2D, 0x01, 0x00, 0x20, 0x32, 0x01, 0x00, 0x20, 0x2E, 0x01, 0x00, 0x20, 0x30, 0x01, 0x00, 0x20, + 0x31, 0x01, 0x00, 0x20, 0xC4, 0x04, 0x00, 0x20, 0x04, 0x05, 0x00, 0x20, 0x33, 0x01, 0x00, 0x20, + 0xBE, 0x19, 0x76, 0x10, 0x05, 0x9F, 0xBE, 0x42, 0x0C, 0xDB, 0x11, 0x4E, 0x36, 0x78, 0x8E, 0x19, + 0x76, 0x00, 0x10, 0x4F, 0xB8, 0x5F, 0xC6, 0x0F, 0x36, 0x18, 0x76, 0x10, 0x76, 0x42, 0x05, 0x9F, + 0xBE, 0x42, 0x02, 0xDD, 0x04, 0x98, 0x40, 0x1C, 0x04, 0x90, 0x49, 0x1C, 0x0A, 0x48, 0x00, 0x78, + 0x81, 0x42, 0x00, 0xDA, 0xC5, 0xE6, 0x09, 0x4E, 0x30, 0x78, 0xC6, 0x0F, 0x36, 0x18, 0x76, 0x10, + 0x04, 0x9F, 0xBE, 0x42, 0x02, 0xDA, 0x00, 0x20, 0x07, 0xB0, 0xF0, 0xBD, 0x01, 0x20, 0xFB, 0xE7, + 0x32, 0x01, 0x00, 0x20, 0x04, 0x05, 0x00, 0x20, 0x33, 0x01, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, + 0xC1, 0x06, 0xC9, 0x0E, 0x01, 0x20, 0x88, 0x40, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, - 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x00, 0xE1, 0x00, 0xE0, 0xC2, 0x06, 0xD2, 0x0E, - 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x00, 0xE1, 0x00, 0xE0, - 0x10, 0xB5, 0x00, 0x28, 0x19, 0xDA, 0x1A, 0x4A, 0x03, 0x07, 0x1B, 0x0F, 0x08, 0x3B, 0x9B, 0x08, - 0x9B, 0x00, 0xD2, 0x58, 0x83, 0x07, 0xDC, 0x0E, 0xFF, 0x23, 0xA3, 0x40, 0x9A, 0x43, 0x8B, 0x07, - 0x1B, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA3, 0x40, 0x1A, 0x43, 0x11, 0x4B, 0x04, 0x07, 0x24, 0x0F, - 0x08, 0x3C, 0xA4, 0x08, 0xA4, 0x00, 0x1A, 0x51, 0x18, 0xE0, 0x0E, 0x4A, 0x03, 0x23, 0x1B, 0x02, - 0xD2, 0x18, 0x83, 0x08, 0x9B, 0x00, 0xD3, 0x58, 0x82, 0x07, 0xD4, 0x0E, 0xFF, 0x22, 0xA2, 0x40, - 0x93, 0x43, 0x8A, 0x07, 0x12, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA2, 0x40, 0x13, 0x43, 0x05, 0x4A, - 0x03, 0x24, 0x24, 0x02, 0x12, 0x19, 0x84, 0x08, 0xA4, 0x00, 0x13, 0x51, 0x10, 0xBD, 0x00, 0x00, - 0x1C, 0xED, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, 0x10, 0xB5, 0x00, 0x28, 0x19, 0xDA, 0x1A, 0x4A, + 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0xE1, 0x00, 0xE0, 0xC1, 0x06, 0xC9, 0x0E, + 0x01, 0x20, 0x88, 0x40, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x00, 0xE1, 0x00, 0xE0, + 0xC2, 0x06, 0xD2, 0x0E, 0x01, 0x21, 0x91, 0x40, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x00, 0xE1, 0x00, 0xE0, 0x83, 0x07, 0xFF, 0x22, 0xDB, 0x0E, 0x9A, 0x40, 0x89, 0x07, 0x09, 0x0E, + 0x99, 0x40, 0x00, 0x28, 0x0B, 0xDA, 0x00, 0x07, 0x00, 0x0F, 0x08, 0x38, 0x83, 0x08, 0x08, 0x48, + 0x9B, 0x00, 0x18, 0x18, 0xC3, 0x69, 0x93, 0x43, 0x0B, 0x43, 0xC3, 0x61, 0x70, 0x47, 0x83, 0x08, + 0x04, 0x48, 0x9B, 0x00, 0x18, 0x18, 0x03, 0x68, 0x93, 0x43, 0x0B, 0x43, 0x03, 0x60, 0x70, 0x47, + 0x00, 0xED, 0x00, 0xE0, 0x00, 0xE4, 0x00, 0xE0, 0x10, 0xB5, 0x00, 0x28, 0x19, 0xDA, 0x1A, 0x4A, 0x03, 0x07, 0x1B, 0x0F, 0x08, 0x3B, 0x9B, 0x08, 0x9B, 0x00, 0xD2, 0x58, 0x83, 0x07, 0xDC, 0x0E, 0xFF, 0x23, 0xA3, 0x40, 0x9A, 0x43, 0x8B, 0x07, 0x1B, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA3, 0x40, 0x1A, 0x43, 0x11, 0x4B, 0x04, 0x07, 0x24, 0x0F, 0x08, 0x3C, 0xA4, 0x08, 0xA4, 0x00, 0x1A, 0x51, @@ -1867,423 +1778,464 @@ 0x82, 0x07, 0xD4, 0x0E, 0xFF, 0x22, 0xA2, 0x40, 0x93, 0x43, 0x8A, 0x07, 0x12, 0x0E, 0x84, 0x07, 0xE4, 0x0E, 0xA2, 0x40, 0x13, 0x43, 0x05, 0x4A, 0x03, 0x24, 0x24, 0x02, 0x12, 0x19, 0x84, 0x08, 0xA4, 0x00, 0x13, 0x51, 0x10, 0xBD, 0x00, 0x00, 0x1C, 0xED, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE0, + 0xF0, 0xB5, 0x19, 0x4D, 0x07, 0x20, 0x69, 0x6B, 0x85, 0xB0, 0x01, 0x26, 0x00, 0x24, 0x09, 0x27, + 0x08, 0x70, 0x7F, 0x02, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x02, 0x91, 0x03, 0x91, 0x0A, 0x46, + 0x69, 0x6B, 0x01, 0x92, 0x0B, 0x46, 0x00, 0x91, 0x72, 0x1C, 0x39, 0x46, 0xA0, 0x20, 0xFD, 0xF7, + 0x37, 0xFE, 0x68, 0x6B, 0x64, 0x1C, 0x01, 0x78, 0xE4, 0xB2, 0x0F, 0x31, 0x01, 0x70, 0x04, 0x2C, + 0xE8, 0xD3, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x02, 0x91, 0x03, 0x91, 0x0A, 0x46, 0x69, 0x6B, + 0x01, 0x92, 0x0B, 0x46, 0x00, 0x91, 0x01, 0x22, 0x04, 0x49, 0xA0, 0x20, 0xFD, 0xF7, 0x20, 0xFE, + 0x01, 0x20, 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x01, 0x12, 0x00, 0x00, 0x04, 0x48, 0xC1, 0x79, 0x10, 0x29, 0x03, 0xD1, 0x11, 0x21, 0xC1, 0x71, 0x01, 0x20, 0x70, 0x47, - 0x00, 0x20, 0x70, 0x47, 0x90, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x07, 0x48, 0x00, 0x68, 0x40, 0x21, + 0x00, 0x20, 0x70, 0x47, 0x80, 0x03, 0x00, 0x20, 0x10, 0xB5, 0x07, 0x48, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, 0x40, 0x30, 0x04, 0x49, 0x08, 0x60, 0x04, 0x48, 0x00, 0x68, 0x00, 0x28, 0x02, 0xD0, - 0x02, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x00, 0x02, 0x00, 0x50, 0x2C, 0x01, 0x00, 0x20, - 0x10, 0xB5, 0x00, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0xFF, 0xFD, 0x01, 0xF0, 0xF5, 0xF9, 0x83, 0x48, - 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x06, 0xD1, 0x81, 0x48, 0x00, 0x78, 0x01, 0x28, - 0x04, 0xD1, 0xFB, 0xF7, 0x99, 0xFA, 0x01, 0xE0, 0xFB, 0xF7, 0x96, 0xFA, 0x01, 0x20, 0x00, 0x05, - 0xFB, 0xF7, 0x38, 0xFE, 0x05, 0x20, 0x00, 0x07, 0x40, 0x6B, 0x10, 0x21, 0x88, 0x43, 0x05, 0x21, - 0x09, 0x07, 0x48, 0x63, 0x08, 0x46, 0x40, 0x6B, 0x20, 0x21, 0x88, 0x43, 0x05, 0x21, 0x09, 0x07, - 0x48, 0x63, 0x01, 0x22, 0x04, 0x21, 0x10, 0x46, 0xFB, 0xF7, 0x26, 0xFA, 0x01, 0x22, 0x05, 0x21, - 0x10, 0x46, 0xFB, 0xF7, 0x21, 0xFA, 0x04, 0x21, 0x01, 0x20, 0xFB, 0xF7, 0x57, 0xFA, 0x05, 0x21, - 0x01, 0x20, 0xFB, 0xF7, 0x53, 0xFA, 0x59, 0x20, 0x6A, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, - 0x88, 0x20, 0x08, 0x60, 0x68, 0x48, 0x00, 0x68, 0x80, 0x21, 0x88, 0x43, 0x66, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x40, 0x21, 0x88, 0x43, 0x63, 0x49, 0x08, 0x60, 0x0A, 0x20, 0xFA, 0xF7, - 0x13, 0xFF, 0x03, 0x21, 0x08, 0x46, 0xFA, 0xF7, 0xBD, 0xFF, 0x01, 0x21, 0x03, 0x20, 0xFB, 0xF7, - 0x35, 0xFA, 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, 0xFB, 0xF7, 0xF6, 0xF9, 0x5B, 0x49, 0x00, 0x20, - 0xFB, 0xF7, 0x42, 0xFA, 0x01, 0x22, 0x11, 0x46, 0x03, 0x20, 0x00, 0x23, 0xFA, 0xF7, 0xE2, 0xFF, - 0x57, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x55, 0x49, 0x08, 0x60, 0x4F, 0x48, 0xC0, 0x79, - 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x0E, 0xD1, 0x4D, 0x48, 0x00, 0x78, 0x01, 0x28, 0x14, 0xD1, - 0x04, 0x20, 0x50, 0x49, 0x08, 0x61, 0x4E, 0x48, 0x00, 0x68, 0x20, 0x21, 0x88, 0x43, 0x20, 0x30, - 0x4B, 0x49, 0x08, 0x60, 0x09, 0xE0, 0x04, 0x20, 0x4A, 0x49, 0x08, 0x61, 0x48, 0x48, 0x00, 0x68, - 0x20, 0x21, 0x88, 0x43, 0x20, 0x30, 0x46, 0x49, 0x08, 0x60, 0x45, 0x48, 0x00, 0x68, 0xFF, 0x21, - 0x01, 0x31, 0x88, 0x43, 0x40, 0x18, 0x42, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, - 0x88, 0x43, 0x80, 0x30, 0x3E, 0x49, 0x08, 0x60, 0x38, 0x48, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, - 0x01, 0x28, 0x0A, 0xD1, 0x07, 0xE0, 0x30, 0xBF, 0x3B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, - 0x33, 0x49, 0x08, 0x70, 0x00, 0xE0, 0xF6, 0xE7, 0x00, 0xE0, 0x30, 0xBF, 0x34, 0x48, 0x00, 0x68, - 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x32, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x40, 0x08, - 0x40, 0x00, 0x08, 0x60, 0x00, 0xBF, 0x02, 0x20, 0xFB, 0xF7, 0xAA, 0xFA, 0x01, 0x28, 0xFA, 0xD1, - 0x2B, 0x48, 0x00, 0x69, 0xC0, 0x08, 0xC0, 0x00, 0x00, 0x1D, 0x29, 0x49, 0x08, 0x61, 0x08, 0x46, - 0x00, 0x6A, 0x49, 0x02, 0x88, 0x43, 0x26, 0x49, 0x08, 0x62, 0x08, 0x46, 0x00, 0x6A, 0xC9, 0x01, - 0x88, 0x43, 0x23, 0x49, 0x08, 0x62, 0x01, 0x20, 0xFB, 0xF7, 0xF8, 0xFB, 0xFA, 0xF7, 0x62, 0xFE, - 0x22, 0x49, 0x09, 0x78, 0x22, 0x4A, 0x51, 0x43, 0x08, 0x46, 0xFB, 0xF7, 0x59, 0xFB, 0xFA, 0xF7, - 0x59, 0xFE, 0x02, 0x20, 0xFB, 0xF7, 0xC0, 0xFB, 0x05, 0x20, 0xFA, 0xF7, 0x7D, 0xFE, 0x00, 0x20, - 0x14, 0x49, 0x08, 0x60, 0x01, 0x21, 0x03, 0x20, 0xFA, 0xF7, 0x3A, 0xFF, 0x19, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x0D, 0xD1, 0x01, 0x21, 0x02, 0x20, 0xFA, 0xF7, 0x1C, 0xFF, 0x01, 0x20, 0xFA, 0xF7, - 0x6B, 0xFE, 0x01, 0x21, 0x02, 0x20, 0xFB, 0xF7, 0x91, 0xF9, 0x01, 0x20, 0xFA, 0xF7, 0x64, 0xFE, - 0x00, 0x20, 0x11, 0x49, 0x08, 0x70, 0x01, 0x20, 0x10, 0x49, 0x08, 0x70, 0x03, 0x22, 0x01, 0x21, - 0x10, 0x46, 0xFB, 0xF7, 0x49, 0xF9, 0xFE, 0xF7, 0x35, 0xFA, 0x10, 0xBD, 0x39, 0x04, 0x00, 0x20, - 0x8F, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, 0xFD, 0x41, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x50, 0x00, 0xED, 0x00, 0xE0, 0x8E, 0x00, 0x00, 0x20, 0xC2, 0x00, 0x00, 0x20, - 0x40, 0x42, 0x0F, 0x00, 0xAC, 0x00, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x20, 0xA5, 0x00, 0x00, 0x20, - 0x30, 0xB5, 0x85, 0xB0, 0x00, 0x25, 0x00, 0x24, 0x12, 0xE0, 0x68, 0x00, 0x13, 0x49, 0x08, 0x5A, - 0x02, 0x12, 0x20, 0x46, 0x64, 0x1C, 0x12, 0x49, 0x09, 0x68, 0x0A, 0x54, 0x68, 0x00, 0x0F, 0x49, - 0x08, 0x5A, 0xC2, 0xB2, 0x20, 0x46, 0x64, 0x1C, 0x0D, 0x49, 0x09, 0x68, 0x0A, 0x54, 0x6D, 0x1C, - 0x0C, 0x48, 0x00, 0x78, 0x85, 0x42, 0xE8, 0xDB, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x06, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, 0xA2, 0xB2, 0x06, 0x49, - 0x03, 0x68, 0xA0, 0x20, 0xFD, 0xF7, 0x70, 0xFB, 0x05, 0xB0, 0x30, 0xBD, 0xA8, 0x1A, 0x00, 0x20, - 0xB8, 0x00, 0x00, 0x20, 0x95, 0x03, 0x00, 0x20, 0xC0, 0x4C, 0x00, 0x00, 0x00, 0xB5, 0x85, 0xB0, - 0x24, 0x48, 0x00, 0x78, 0x05, 0x28, 0x43, 0xDC, 0x23, 0x48, 0x00, 0x78, 0x03, 0x28, 0x02, 0xDD, - 0x05, 0x20, 0x20, 0x49, 0x08, 0x70, 0x1F, 0x48, 0x00, 0x78, 0x04, 0x28, 0x2A, 0xD1, 0x01, 0xF0, - 0x1D, 0xF9, 0x00, 0xF0, 0x1F, 0xF9, 0x1D, 0x48, 0x00, 0x88, 0x1E, 0x28, 0x22, 0xDD, 0x64, 0x20, - 0x1B, 0x49, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, - 0x17, 0x49, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xFF, 0x21, 0x9F, 0x31, 0xA0, 0x20, 0x14, 0x4B, - 0xFD, 0xF7, 0x3A, 0xFB, 0x01, 0x20, 0xFA, 0xF7, 0xD7, 0xFD, 0x02, 0xF0, 0xB5, 0xFF, 0x0A, 0x20, - 0xFA, 0xF7, 0xD2, 0xFD, 0x03, 0x20, 0x0B, 0x49, 0x08, 0x70, 0x0B, 0x48, 0x00, 0x78, 0x40, 0x1C, - 0x09, 0x49, 0x08, 0x70, 0x07, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x06, 0x49, 0x08, 0x70, 0x08, 0x46, - 0x00, 0x78, 0x05, 0x28, 0x01, 0xDD, 0xF9, 0xF7, 0x0F, 0xFF, 0x00, 0x20, 0x05, 0x49, 0x08, 0x70, - 0x05, 0xB0, 0x00, 0xBD, 0xEC, 0x00, 0x00, 0x20, 0xED, 0x00, 0x00, 0x20, 0x6E, 0x01, 0x00, 0x20, - 0xA4, 0x05, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x11, 0x48, 0x00, 0x78, 0x00, 0x28, 0x1D, 0xD0, - 0x10, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x02, 0xD1, 0x00, 0x20, 0x0D, 0x49, 0x08, 0x70, 0x00, 0x20, - 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x70, - 0x0D, 0x48, 0x0E, 0x49, 0x08, 0x80, 0x00, 0x20, 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, - 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, 0x70, 0x47, 0x00, 0x00, - 0x02, 0x01, 0x00, 0x20, 0x3F, 0x01, 0x00, 0x20, 0x06, 0x01, 0x00, 0x20, 0x08, 0x01, 0x00, 0x20, - 0x09, 0x01, 0x00, 0x20, 0x03, 0x01, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x20, - 0xFC, 0x00, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, - 0xFE, 0x00, 0x00, 0x20, 0x00, 0xBF, 0x04, 0x49, 0x89, 0x69, 0x09, 0x02, 0xC9, 0x0F, 0x01, 0x29, - 0xF9, 0xD0, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x15, 0x40, 0xF8, 0xB5, 0x3E, 0x4F, - 0x00, 0x24, 0x04, 0xE0, 0x3D, 0x48, 0x00, 0x5D, 0x38, 0x70, 0x7F, 0x1C, 0x64, 0x1C, 0x3A, 0x48, - 0x10, 0x30, 0x87, 0x42, 0xF6, 0xD3, 0x00, 0x21, 0xC0, 0x38, 0x01, 0x74, 0x00, 0x20, 0x38, 0x49, - 0x08, 0x70, 0x38, 0x49, 0x08, 0x70, 0x38, 0x49, 0x08, 0x70, 0x38, 0x49, 0x08, 0x70, 0x01, 0x20, - 0xFF, 0xF7, 0x1C, 0xFD, 0x59, 0x20, 0x36, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, - 0x08, 0x60, 0xFA, 0xF7, 0x61, 0xFD, 0x00, 0x20, 0x32, 0x49, 0x08, 0x70, 0x69, 0x46, 0x1F, 0x20, - 0x00, 0x03, 0xFA, 0xF7, 0x91, 0xFD, 0x30, 0x49, 0x00, 0x98, 0x88, 0x42, 0x37, 0xD1, 0x26, 0x4F, - 0x8B, 0x3F, 0x2E, 0x4E, 0x0F, 0xE0, 0x69, 0x46, 0x30, 0x46, 0xFA, 0xF7, 0x85, 0xFD, 0x00, 0x25, - 0x05, 0xE0, 0x00, 0x98, 0x78, 0x55, 0x00, 0x98, 0x00, 0x0A, 0x00, 0x90, 0x6D, 0x1C, 0x04, 0x2D, - 0xF7, 0xDB, 0x3F, 0x1D, 0x36, 0x1D, 0x25, 0x48, 0x5A, 0x30, 0x86, 0x42, 0xEB, 0xD9, 0x69, 0x46, - 0x30, 0x46, 0xFA, 0xF7, 0x71, 0xFD, 0x02, 0x26, 0x5C, 0x24, 0x00, 0x25, 0x09, 0xE0, 0x61, 0x19, - 0x65, 0x31, 0x15, 0x4A, 0xF0, 0x3A, 0x00, 0x98, 0x50, 0x54, 0x00, 0x98, 0x00, 0x0A, 0x00, 0x90, - 0x6D, 0x1C, 0xB5, 0x42, 0xF3, 0xD3, 0xFA, 0xF7, 0x1F, 0xFD, 0x00, 0x20, 0x14, 0x49, 0x08, 0x60, - 0x01, 0x20, 0xFF, 0xF7, 0xF1, 0xFC, 0x01, 0x20, 0x12, 0x49, 0x08, 0x70, 0xF8, 0xBD, 0xFA, 0xF7, - 0x13, 0xFD, 0x00, 0x20, 0x0E, 0x49, 0x08, 0x60, 0x01, 0x20, 0xFF, 0xF7, 0xE5, 0xFC, 0x06, 0x4F, - 0x8B, 0x3F, 0x00, 0x24, 0x04, 0xE0, 0x0E, 0x48, 0x00, 0x5D, 0x38, 0x70, 0x7F, 0x1C, 0x64, 0x1C, - 0x5E, 0x2C, 0xF8, 0xD3, 0xEA, 0xE7, 0x00, 0x00, 0xC4, 0x04, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, - 0x3F, 0x01, 0x00, 0x20, 0xAA, 0x00, 0x00, 0x20, 0xAB, 0x00, 0x00, 0x20, 0x9C, 0x00, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x50, 0xAE, 0x00, 0x00, 0x20, 0x21, 0x43, 0x65, 0x87, 0x04, 0xF0, 0x01, 0x00, - 0x2D, 0x00, 0x00, 0x20, 0xFC, 0xB5, 0x50, 0x4D, 0x00, 0x24, 0xEC, 0x86, 0x4F, 0x4E, 0x00, 0x94, - 0xF0, 0x7A, 0x40, 0x07, 0x11, 0xD5, 0x01, 0x94, 0x08, 0xE0, 0x00, 0x22, 0x01, 0xA9, 0x68, 0x46, - 0x00, 0xF0, 0xB0, 0xFD, 0x6B, 0x46, 0x18, 0x79, 0x40, 0x1C, 0x01, 0x90, 0x6B, 0x46, 0x04, 0x20, - 0x18, 0x56, 0x29, 0x7A, 0x88, 0x42, 0xF0, 0xDB, 0x0F, 0xE0, 0x28, 0x7A, 0x06, 0xE0, 0x00, 0x22, - 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, 0x9E, 0xFD, 0x6B, 0x46, 0x18, 0x79, 0x6B, 0x46, 0x40, 0x1E, - 0x01, 0x90, 0x04, 0x20, 0x18, 0x56, 0x00, 0x28, 0xF1, 0xDA, 0xF0, 0x7A, 0x00, 0x07, 0x11, 0xD5, - 0x01, 0x94, 0x08, 0xE0, 0x01, 0x22, 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, 0x8B, 0xFD, 0x6B, 0x46, - 0x18, 0x79, 0x40, 0x1C, 0x01, 0x90, 0x6B, 0x46, 0x04, 0x20, 0x18, 0x56, 0xE9, 0x7A, 0x88, 0x42, - 0xF0, 0xDB, 0x0F, 0xE0, 0xE8, 0x7A, 0x06, 0xE0, 0x01, 0x22, 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, - 0x79, 0xFD, 0x6B, 0x46, 0x18, 0x79, 0x6B, 0x46, 0x40, 0x1E, 0x01, 0x90, 0x04, 0x20, 0x18, 0x56, - 0x00, 0x28, 0xF1, 0xDA, 0x28, 0x49, 0xE8, 0x79, 0x80, 0x31, 0xCA, 0x28, 0x01, 0xD0, 0xC9, 0x28, - 0x32, 0xD1, 0x01, 0x22, 0x52, 0x02, 0x23, 0x27, 0x7F, 0x01, 0x06, 0xE0, 0x8B, 0x68, 0x40, 0x00, - 0x1A, 0x52, 0x6B, 0x46, 0x18, 0x88, 0x40, 0x1C, 0x00, 0x90, 0x6B, 0x46, 0x18, 0x88, 0xB8, 0x42, - 0xF4, 0xD3, 0xF0, 0x7A, 0xC0, 0x09, 0x01, 0xD0, 0x20, 0x20, 0x00, 0xE0, 0x1C, 0x20, 0x2A, 0x7C, - 0x00, 0x92, 0xEA, 0x79, 0x1A, 0x4E, 0xCA, 0x2A, 0x01, 0x94, 0x16, 0xD1, 0x19, 0x4C, 0x0D, 0xE0, - 0x6B, 0x46, 0x1B, 0x88, 0x52, 0x00, 0x8D, 0x68, 0xA2, 0x5A, 0x5B, 0x00, 0xEA, 0x52, 0x6B, 0x46, - 0x1A, 0x88, 0x12, 0x18, 0x00, 0x92, 0x1A, 0x79, 0x52, 0x1C, 0x01, 0x92, 0x6B, 0x46, 0x04, 0x22, - 0x9A, 0x56, 0x33, 0x78, 0x9A, 0x42, 0xEB, 0xDB, 0xFC, 0xBD, 0x0F, 0x4C, 0x0D, 0xE0, 0x6B, 0x46, - 0x1B, 0x88, 0x52, 0x00, 0x8D, 0x68, 0xA2, 0x5A, 0x5B, 0x00, 0xEA, 0x52, 0x6B, 0x46, 0x1A, 0x88, - 0x12, 0x18, 0x00, 0x92, 0x1A, 0x79, 0x52, 0x1C, 0x01, 0x92, 0x6B, 0x46, 0x04, 0x22, 0x9A, 0x56, - 0x33, 0x78, 0x9A, 0x42, 0xEB, 0xDB, 0xFC, 0xBD, 0x38, 0x01, 0x00, 0x20, 0x34, 0x04, 0x00, 0x20, - 0x95, 0x03, 0x00, 0x20, 0xB8, 0x1A, 0x00, 0x20, 0x98, 0x1A, 0x00, 0x20, 0xF0, 0xB5, 0x89, 0xB0, - 0x59, 0x48, 0x00, 0x88, 0x40, 0x04, 0x00, 0x0C, 0x07, 0x90, 0x58, 0x48, 0x00, 0x88, 0x40, 0x04, - 0x00, 0x0C, 0x06, 0x90, 0x06, 0x99, 0x07, 0x98, 0x88, 0x42, 0x01, 0xDD, 0x07, 0x98, 0x00, 0xE0, - 0x06, 0x98, 0x80, 0xB2, 0x05, 0x90, 0x01, 0x20, 0x51, 0x49, 0x08, 0x70, 0x51, 0x48, 0x07, 0x68, - 0x23, 0x20, 0x40, 0x01, 0x38, 0x18, 0x08, 0x90, 0x95, 0xE0, 0x4F, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x04, 0xD0, 0x00, 0x20, 0x4C, 0x49, 0x08, 0x70, 0xFD, 0xF7, 0xC2, 0xFE, 0x4B, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x07, 0xD0, 0x00, 0x20, 0x46, 0x49, 0x08, 0x70, 0x03, 0x20, 0x03, 0xF0, 0x02, 0xFA, - 0x09, 0xB0, 0xF0, 0xBD, 0x02, 0xF0, 0xD0, 0xFD, 0x00, 0xBF, 0xFC, 0xF7, 0x59, 0xFB, 0x35, 0x28, - 0xFB, 0xD1, 0x00, 0x24, 0x04, 0xE0, 0x00, 0x20, 0x41, 0x49, 0x09, 0x68, 0x08, 0x55, 0x64, 0x1C, - 0x10, 0x2C, 0xF8, 0xDB, 0x03, 0x22, 0x3E, 0x48, 0x01, 0x68, 0x3E, 0x48, 0x00, 0x68, 0x02, 0xAB, - 0x07, 0xC3, 0x3D, 0x48, 0x00, 0x78, 0x42, 0x00, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, - 0x3A, 0x49, 0xA0, 0x20, 0x00, 0x23, 0xFD, 0xF7, 0x2F, 0xF9, 0x35, 0x48, 0x01, 0x68, 0x01, 0x20, - 0xFC, 0xF7, 0x6A, 0xFA, 0x03, 0x22, 0x08, 0x99, 0x02, 0x97, 0x04, 0x92, 0x03, 0x91, 0x00, 0x21, - 0x05, 0x9A, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x31, 0x49, 0xA0, 0x20, 0x00, 0x23, 0xFD, 0xF7, - 0x1B, 0xF9, 0x00, 0x25, 0x00, 0x24, 0x0D, 0xE0, 0x38, 0x5D, 0x06, 0x02, 0x60, 0x1C, 0x38, 0x5C, - 0x80, 0x19, 0x86, 0xB2, 0x32, 0xB2, 0x28, 0x46, 0x6D, 0x1C, 0x40, 0x00, 0x29, 0x49, 0x09, 0x68, - 0x0A, 0x52, 0xA4, 0x1C, 0x07, 0x98, 0x84, 0x42, 0xEE, 0xDB, 0x00, 0x24, 0x0F, 0xE0, 0x08, 0x98, - 0x00, 0x5D, 0x06, 0x02, 0x60, 0x1C, 0x08, 0x99, 0x08, 0x5C, 0x80, 0x19, 0x86, 0xB2, 0x32, 0xB2, - 0x28, 0x46, 0x6D, 0x1C, 0x40, 0x00, 0x1F, 0x49, 0x09, 0x68, 0x0A, 0x52, 0xA4, 0x1C, 0x06, 0x98, - 0x84, 0x42, 0xEC, 0xDB, 0x00, 0x20, 0x1C, 0x49, 0x08, 0x70, 0xFF, 0xF7, 0xBB, 0xFE, 0xFD, 0xF7, - 0x0B, 0xFF, 0x01, 0x20, 0x19, 0x49, 0x08, 0x70, 0x00, 0xF0, 0x00, 0xFE, 0x00, 0x24, 0x0D, 0xE0, - 0x02, 0xF0, 0xD6, 0xFC, 0x16, 0x48, 0x00, 0x78, 0x00, 0x28, 0x02, 0xD1, 0xFA, 0xF7, 0x52, 0xFB, - 0x64, 0x1C, 0x7D, 0x20, 0xC0, 0x00, 0x84, 0x42, 0x00, 0xDD, 0x03, 0xE0, 0x0F, 0x48, 0x00, 0x78, - 0x00, 0x28, 0xED, 0xD1, 0x00, 0xBF, 0x68, 0xE7, 0x80, 0x01, 0x00, 0x20, 0x36, 0x02, 0x00, 0x20, - 0x9C, 0x00, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, 0xA4, 0x00, 0x00, 0x20, - 0xB8, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0x95, 0x03, 0x00, 0x20, 0xD0, 0x4C, 0x00, 0x00, - 0x30, 0x46, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x20, 0x2C, 0x02, 0x00, 0x20, 0x9B, 0x00, 0x00, 0x20, - 0x9A, 0x00, 0x00, 0x20, 0xF8, 0xB5, 0x25, 0x48, 0x07, 0x68, 0x25, 0x4E, 0x02, 0xF0, 0x76, 0xFC, - 0x59, 0x20, 0x24, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xFA, 0xF7, - 0x63, 0xFB, 0x69, 0x46, 0x7D, 0x20, 0x80, 0x02, 0xFA, 0xF7, 0x96, 0xFB, 0x1E, 0x49, 0x00, 0x98, - 0x08, 0x60, 0x00, 0x25, 0x1D, 0x4C, 0x11, 0xE0, 0x69, 0x46, 0x20, 0x46, 0xFA, 0xF7, 0x8C, 0xFB, - 0x00, 0x98, 0x38, 0x80, 0x38, 0x88, 0x45, 0x19, 0xBF, 0x1C, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x90, - 0x00, 0x98, 0x2D, 0x18, 0x00, 0x98, 0x38, 0x80, 0xBF, 0x1C, 0x24, 0x1D, 0x7D, 0x20, 0x80, 0x02, - 0x30, 0x18, 0xA0, 0x42, 0xE8, 0xD8, 0x10, 0x48, 0x00, 0x68, 0x64, 0x28, 0x0C, 0xDB, 0x69, 0x46, - 0x20, 0x46, 0xFA, 0xF7, 0x71, 0xFB, 0x00, 0x98, 0x85, 0x42, 0x03, 0xD1, 0x01, 0x20, 0x0C, 0x49, - 0x08, 0x70, 0x01, 0xE0, 0xF9, 0xF7, 0x26, 0xFB, 0xFA, 0xF7, 0x26, 0xFB, 0x00, 0x20, 0x05, 0x49, - 0x08, 0x60, 0x02, 0x20, 0x02, 0xF0, 0x8E, 0xFC, 0xF8, 0xBD, 0x00, 0x00, 0xBC, 0x01, 0x00, 0x20, - 0xC4, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x10, 0x01, 0x00, 0x20, 0x04, 0xF4, 0x01, 0x00, - 0x0A, 0x01, 0x00, 0x20, 0x10, 0xB5, 0xFC, 0xF7, 0x07, 0xFE, 0x17, 0x49, 0x08, 0x70, 0x08, 0x46, - 0x00, 0x78, 0x01, 0x28, 0x03, 0xD1, 0x02, 0x20, 0x03, 0xF0, 0xFC, 0xF8, 0x22, 0xE0, 0x12, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x1E, 0xD1, 0x11, 0x48, 0x00, 0x78, 0x00, 0x28, 0x05, 0xD0, 0x00, 0x20, - 0x0E, 0x49, 0x08, 0x70, 0x01, 0x20, 0x0E, 0x49, 0x08, 0x70, 0x01, 0x22, 0x0D, 0x48, 0x01, 0x68, - 0x0D, 0x48, 0x00, 0x68, 0xFA, 0xF7, 0xC2, 0xF9, 0x0C, 0x48, 0x00, 0x78, 0x0C, 0x4A, 0x12, 0x78, - 0x50, 0x43, 0x40, 0x00, 0x07, 0x4A, 0x12, 0x68, 0x81, 0x18, 0x02, 0x22, 0x09, 0x48, 0x00, 0x68, - 0xFA, 0xF7, 0xB4, 0xF9, 0x10, 0xBD, 0x00, 0x00, 0x2C, 0x02, 0x00, 0x20, 0xAA, 0x00, 0x00, 0x20, - 0xAB, 0x00, 0x00, 0x20, 0xB8, 0x01, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, - 0x40, 0x01, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x2C, 0x48, 0x05, 0x68, 0x00, 0x68, + 0x02, 0x48, 0x00, 0x68, 0x80, 0x47, 0x10, 0xBD, 0x00, 0x02, 0x00, 0x50, 0x18, 0x01, 0x00, 0x20, + 0xF8, 0xB5, 0x00, 0x21, 0x02, 0x20, 0xFC, 0xF7, 0x25, 0xFF, 0x01, 0xF0, 0xCB, 0xFA, 0x66, 0x4C, + 0x20, 0x7B, 0x66, 0x4D, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x02, 0xD1, 0x68, 0x78, 0x01, 0x28, + 0x01, 0xD1, 0xFB, 0xF7, 0x1B, 0xFC, 0x01, 0x20, 0x00, 0x05, 0xFB, 0xF7, 0x61, 0xFF, 0x05, 0x20, + 0x00, 0x07, 0x41, 0x6B, 0x10, 0x22, 0x91, 0x43, 0x41, 0x63, 0x41, 0x6B, 0x20, 0x26, 0xB1, 0x43, + 0x41, 0x63, 0x01, 0x22, 0x04, 0x21, 0x10, 0x46, 0xFB, 0xF7, 0xB0, 0xFB, 0x01, 0x22, 0x05, 0x21, + 0x10, 0x46, 0xFB, 0xF7, 0xAB, 0xFB, 0x04, 0x21, 0x01, 0x20, 0xFB, 0xF7, 0xE1, 0xFB, 0x05, 0x21, + 0x01, 0x20, 0xFB, 0xF7, 0xDD, 0xFB, 0x52, 0x48, 0x59, 0x21, 0x01, 0x60, 0x16, 0x21, 0x01, 0x60, + 0x88, 0x21, 0x01, 0x60, 0x4F, 0x48, 0x01, 0x68, 0x80, 0x27, 0xB9, 0x43, 0x01, 0x60, 0x01, 0x68, + 0x40, 0x22, 0x91, 0x43, 0x01, 0x60, 0x0A, 0x20, 0xFB, 0xF7, 0xA0, 0xF8, 0x03, 0x21, 0x08, 0x46, + 0xFB, 0xF7, 0x4A, 0xF9, 0x01, 0x21, 0x03, 0x20, 0xFB, 0xF7, 0xC2, 0xFB, 0x03, 0x22, 0x01, 0x21, + 0x10, 0x46, 0xFB, 0xF7, 0x83, 0xFB, 0x44, 0x49, 0x00, 0x20, 0xFB, 0xF7, 0xCF, 0xFB, 0x01, 0x22, + 0x11, 0x46, 0x03, 0x20, 0x00, 0x23, 0xFB, 0xF7, 0x6F, 0xF9, 0x40, 0x49, 0x08, 0x68, 0x40, 0x08, + 0x40, 0x00, 0x08, 0x60, 0x20, 0x7B, 0x3E, 0x4A, 0xC0, 0x06, 0x83, 0x0F, 0x04, 0x20, 0x01, 0x2B, + 0x02, 0xD1, 0x6B, 0x78, 0x01, 0x2B, 0x03, 0xD1, 0x10, 0x61, 0x0A, 0x68, 0x32, 0x43, 0x0A, 0x60, + 0x0A, 0x68, 0xFF, 0x23, 0x01, 0x33, 0x1A, 0x43, 0x0A, 0x60, 0x0A, 0x68, 0x3A, 0x43, 0x0A, 0x60, + 0x22, 0x7B, 0x00, 0x24, 0xD2, 0x06, 0x92, 0x0F, 0x01, 0x2A, 0x05, 0xD1, 0x30, 0xBF, 0x2A, 0x78, + 0x00, 0x2A, 0xFB, 0xD1, 0x6C, 0x70, 0x00, 0xE0, 0x30, 0xBF, 0x0F, 0x46, 0x09, 0x68, 0x01, 0x43, + 0x39, 0x60, 0x38, 0x68, 0x40, 0x08, 0x40, 0x00, 0x38, 0x60, 0x02, 0x20, 0xFB, 0xF7, 0x5A, 0xFC, + 0x01, 0x28, 0xFA, 0xD1, 0x38, 0x69, 0xC0, 0x08, 0xC0, 0x00, 0x00, 0x1D, 0x38, 0x61, 0x38, 0x6A, + 0x01, 0x21, 0x89, 0x04, 0x88, 0x43, 0x38, 0x62, 0x38, 0x6A, 0x89, 0x10, 0x88, 0x43, 0x38, 0x62, + 0x01, 0x20, 0xFB, 0xF7, 0xAD, 0xFD, 0xFB, 0xF7, 0x1B, 0xF8, 0xA8, 0x7E, 0x1D, 0x49, 0x48, 0x43, + 0xFB, 0xF7, 0x10, 0xFD, 0xFB, 0xF7, 0x14, 0xF8, 0x02, 0x20, 0xFB, 0xF7, 0x77, 0xFD, 0x05, 0x20, + 0xFB, 0xF7, 0x34, 0xF8, 0x12, 0x48, 0x04, 0x60, 0x01, 0x21, 0x03, 0x20, 0xFB, 0xF7, 0xF2, 0xF8, + 0x68, 0x7D, 0x00, 0x28, 0x0D, 0xD1, 0x01, 0x21, 0x02, 0x20, 0xFB, 0xF7, 0xD5, 0xF8, 0x01, 0x20, + 0xFB, 0xF7, 0x24, 0xF8, 0x01, 0x21, 0x02, 0x20, 0xFB, 0xF7, 0x4A, 0xFB, 0x01, 0x20, 0xFB, 0xF7, + 0x1D, 0xF8, 0xEC, 0x72, 0x01, 0x20, 0xA8, 0x73, 0x03, 0x22, 0x01, 0x46, 0x10, 0x46, 0xFB, 0xF7, + 0x05, 0xFB, 0xFE, 0xF7, 0x77, 0xFA, 0xF8, 0xBD, 0x14, 0x04, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, 0x29, 0x3F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, + 0x00, 0xED, 0x00, 0xE0, 0x40, 0x42, 0x0F, 0x00, 0xF0, 0xB5, 0x7A, 0x4D, 0x85, 0xB0, 0x28, 0x79, + 0x79, 0x49, 0x00, 0x27, 0x09, 0x78, 0x08, 0x43, 0x02, 0xD1, 0x28, 0x7F, 0x03, 0x28, 0x02, 0xD1, + 0xAF, 0x74, 0x2F, 0x86, 0xEF, 0x73, 0x64, 0x20, 0xE8, 0x85, 0x74, 0x48, 0x01, 0x69, 0x01, 0x26, + 0xC9, 0x03, 0x00, 0x29, 0x3C, 0xDB, 0x80, 0x69, 0xA9, 0x7E, 0xF9, 0xF7, 0x7F, 0xF8, 0x70, 0x49, + 0x08, 0x1A, 0x7D, 0x21, 0x04, 0x46, 0xC9, 0x00, 0xF9, 0xF7, 0x82, 0xF8, 0x80, 0xB2, 0xE8, 0x85, + 0xE9, 0x7B, 0x00, 0x29, 0x2C, 0xD1, 0xE9, 0x7E, 0x88, 0x42, 0x20, 0xD2, 0x7D, 0x20, 0xE9, 0x85, + 0xC0, 0x00, 0x41, 0x43, 0x08, 0x1B, 0x19, 0x21, 0x89, 0x01, 0x88, 0x42, 0x14, 0xDD, 0xF9, 0xF7, + 0x6F, 0xF8, 0xC4, 0xB2, 0x00, 0x20, 0x03, 0xF0, 0x89, 0xF8, 0x08, 0xE0, 0x00, 0x20, 0x03, 0xF0, + 0x85, 0xF8, 0x2E, 0x74, 0x00, 0xE0, 0x30, 0xBF, 0x28, 0x7C, 0x00, 0x28, 0xFB, 0xD1, 0x20, 0x46, + 0x64, 0x1E, 0xE4, 0xB2, 0x00, 0x28, 0xF1, 0xD1, 0x02, 0x20, 0x03, 0xF0, 0x77, 0xF8, 0x28, 0x8E, + 0xE9, 0x8D, 0x40, 0x18, 0x80, 0xB2, 0x57, 0x49, 0x28, 0x86, 0x88, 0x42, 0x00, 0xD9, 0xEE, 0x73, + 0xA8, 0x7C, 0x00, 0x28, 0x0C, 0xD0, 0xA8, 0x7C, 0x40, 0x1E, 0x00, 0x06, 0x00, 0x0E, 0xA8, 0x74, + 0x01, 0xD1, 0xEE, 0x73, 0x04, 0xE0, 0xA8, 0x7C, 0x01, 0x28, 0x01, 0xD1, 0xA8, 0x8C, 0xE8, 0x85, + 0xE8, 0x7B, 0x01, 0x28, 0x56, 0xD1, 0x4C, 0x48, 0x00, 0x78, 0x00, 0x28, 0xFA, 0xD1, 0x4B, 0x48, + 0x00, 0x78, 0x00, 0x28, 0xF6, 0xD1, 0xE8, 0x78, 0x00, 0x28, 0x7D, 0xD1, 0xEF, 0x73, 0x2F, 0x86, + 0x6B, 0x6B, 0x02, 0x20, 0x18, 0x70, 0x00, 0x21, 0x03, 0x22, 0xFF, 0x26, 0x02, 0x91, 0x03, 0x91, + 0x04, 0x92, 0x01, 0x91, 0x9E, 0x36, 0x00, 0x93, 0x01, 0x22, 0x31, 0x46, 0xA0, 0x20, 0xFD, 0xF7, + 0x8F, 0xFC, 0x01, 0x20, 0xFA, 0xF7, 0x7A, 0xFF, 0x03, 0xF0, 0x7E, 0xF8, 0x00, 0xF0, 0x7C, 0xF8, + 0xFA, 0xF7, 0x3C, 0xFF, 0x28, 0x7F, 0xFF, 0x24, 0x00, 0x28, 0x2C, 0xD1, 0xFC, 0xF7, 0xDE, 0xFE, + 0x68, 0x7D, 0x00, 0x28, 0x09, 0xD1, 0x01, 0x20, 0xFA, 0xF7, 0x68, 0xFF, 0x00, 0x22, 0x01, 0x21, + 0x33, 0x48, 0x03, 0xF0, 0x8E, 0xF8, 0xFA, 0xF7, 0x15, 0xFF, 0x6B, 0x6B, 0x04, 0x20, 0x18, 0x70, + 0x00, 0x21, 0x03, 0x22, 0x02, 0x91, 0x03, 0x91, 0x04, 0x92, 0x01, 0x91, 0x00, 0x93, 0x01, 0x22, + 0x31, 0x46, 0xA0, 0x20, 0xFD, 0xF7, 0x64, 0xFC, 0xAC, 0x70, 0x03, 0xF0, 0x55, 0xF8, 0x00, 0xF0, + 0x37, 0xFC, 0x05, 0x20, 0xA8, 0x74, 0x20, 0x48, 0x00, 0x78, 0x00, 0x28, 0x34, 0xD0, 0xAF, 0x74, + 0x2F, 0x86, 0xEF, 0x73, 0x30, 0xE0, 0xAC, 0x70, 0x68, 0x7D, 0x00, 0x28, 0x04, 0xD1, 0x00, 0x22, + 0x01, 0x21, 0x1F, 0x48, 0x03, 0xF0, 0x65, 0xF8, 0x69, 0x6B, 0x03, 0x20, 0x08, 0x70, 0x02, 0xE0, + 0x01, 0x20, 0xFA, 0xF7, 0x33, 0xFF, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x02, 0x91, 0x03, 0x91, + 0x0A, 0x46, 0x69, 0x6B, 0x01, 0x92, 0x0B, 0x46, 0x00, 0x91, 0x01, 0x22, 0x31, 0x46, 0xA0, 0x20, + 0xFD, 0xF7, 0x36, 0xFC, 0x00, 0x28, 0xEB, 0xD0, 0x00, 0x24, 0x12, 0x4E, 0x04, 0xE0, 0xFA, 0xF7, + 0xE5, 0xFE, 0x64, 0x1C, 0xB4, 0x42, 0x03, 0xDC, 0xFC, 0xF7, 0x16, 0xFE, 0x35, 0x28, 0xF6, 0xD1, + 0xAF, 0x74, 0x01, 0x20, 0xFA, 0xF7, 0x12, 0xFF, 0x05, 0x48, 0x02, 0xF0, 0x93, 0xF8, 0x05, 0xB0, + 0xF0, 0xBD, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x18, 0x02, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xE0, + 0xA0, 0x86, 0x01, 0x00, 0xB8, 0x0B, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x20, 0x89, 0x03, 0x00, 0x20, + 0x21, 0x15, 0x00, 0x00, 0x70, 0x17, 0x00, 0x00, 0xF8, 0xB5, 0x65, 0x49, 0xFF, 0x20, 0x88, 0x70, + 0x0D, 0x46, 0x08, 0x77, 0x20, 0x35, 0x68, 0x78, 0x0E, 0x28, 0x7D, 0xD0, 0xFB, 0xF7, 0x36, 0xFA, + 0x01, 0x20, 0x00, 0x05, 0xFB, 0xF7, 0x7C, 0xFD, 0x5E, 0x48, 0x59, 0x21, 0x01, 0x60, 0x16, 0x21, + 0x01, 0x60, 0x88, 0x21, 0x01, 0x60, 0x5C, 0x4C, 0x20, 0x68, 0x80, 0x21, 0x88, 0x43, 0x20, 0x60, + 0x20, 0x68, 0x40, 0x21, 0x88, 0x43, 0x20, 0x60, 0x05, 0x27, 0x3F, 0x07, 0x78, 0x6B, 0x10, 0x21, + 0x88, 0x43, 0x78, 0x63, 0x78, 0x6B, 0x20, 0x26, 0xB0, 0x43, 0x78, 0x63, 0x00, 0x22, 0x04, 0x21, + 0x01, 0x20, 0xFB, 0xF7, 0xBB, 0xF9, 0x00, 0x22, 0x05, 0x21, 0x01, 0x20, 0xFB, 0xF7, 0xB6, 0xF9, + 0x4E, 0x49, 0x4F, 0x48, 0xFB, 0xF7, 0x02, 0xFA, 0x01, 0x22, 0x04, 0x21, 0x10, 0x46, 0x00, 0x23, + 0xFA, 0xF7, 0xA2, 0xFF, 0x68, 0x78, 0x0F, 0x28, 0x15, 0xD2, 0x38, 0x6B, 0x21, 0x15, 0x88, 0x43, + 0x38, 0x63, 0x38, 0x6B, 0x49, 0x00, 0x88, 0x43, 0x38, 0x63, 0x00, 0x22, 0x0A, 0x21, 0x10, 0x46, + 0xFB, 0xF7, 0x9C, 0xF9, 0x00, 0x22, 0x0B, 0x21, 0x10, 0x46, 0xFB, 0xF7, 0x97, 0xF9, 0x01, 0x22, + 0x0B, 0x21, 0x00, 0x20, 0x0B, 0xE0, 0x01, 0x21, 0x03, 0x20, 0xFB, 0xF7, 0xC9, 0xF9, 0x03, 0x22, + 0x01, 0x21, 0x10, 0x46, 0xFB, 0xF7, 0x8A, 0xF9, 0x01, 0x22, 0x11, 0x46, 0x03, 0x20, 0x00, 0x23, + 0xFA, 0xF7, 0x7A, 0xFF, 0x37, 0x48, 0x01, 0x68, 0x49, 0x08, 0x49, 0x00, 0x01, 0x60, 0x36, 0x4A, + 0x04, 0x21, 0x11, 0x61, 0x01, 0x68, 0x31, 0x43, 0x01, 0x60, 0x01, 0x68, 0xFF, 0x22, 0x01, 0x32, + 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x80, 0x22, 0x11, 0x43, 0x01, 0x60, 0x30, 0xBF, 0x20, 0x68, + 0x10, 0x43, 0x20, 0x60, 0x20, 0x68, 0x40, 0x21, 0x08, 0x43, 0x20, 0x60, 0x25, 0x48, 0x00, 0x21, + 0x01, 0x60, 0x0B, 0x21, 0x00, 0x20, 0x00, 0xE0, 0x15, 0xE0, 0xFA, 0xF7, 0x33, 0xFF, 0x04, 0x21, + 0x01, 0x20, 0xFA, 0xF7, 0x2F, 0xFF, 0x02, 0xF0, 0x9B, 0xF9, 0xFD, 0xF7, 0x93, 0xFF, 0x01, 0x21, + 0x03, 0x20, 0xFA, 0xF7, 0x27, 0xFF, 0x03, 0x22, 0x01, 0x21, 0x10, 0x46, 0xFB, 0xF7, 0x4E, 0xF9, + 0xFE, 0xF7, 0xC0, 0xF8, 0x00, 0xE0, 0x30, 0xBF, 0x15, 0x4E, 0x30, 0x7F, 0x00, 0x28, 0x23, 0xD0, + 0x02, 0x28, 0x21, 0xD0, 0xB0, 0x78, 0xFF, 0x28, 0x1E, 0xD1, 0x01, 0x27, 0x77, 0x74, 0x6C, 0x78, + 0x00, 0x2C, 0x02, 0xD0, 0x0D, 0x20, 0x44, 0x43, 0x11, 0xE0, 0x21, 0x24, 0x30, 0x7F, 0xFF, 0x28, + 0x0F, 0xD1, 0xB0, 0x78, 0xFF, 0x28, 0x00, 0xD0, 0x4D, 0xE7, 0x00, 0x20, 0x02, 0xF0, 0xFE, 0xFE, + 0x37, 0x74, 0x00, 0xE0, 0x30, 0xBF, 0x30, 0x7C, 0x00, 0x28, 0xFB, 0xD1, 0x64, 0x1E, 0x00, 0x2C, + 0xEC, 0xDC, 0x30, 0x7F, 0x01, 0x28, 0xEF, 0xD1, 0x02, 0x20, 0x02, 0xF0, 0xEF, 0xFE, 0xF8, 0xBD, + 0x1C, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, 0x29, 0x3F, 0x00, 0x00, + 0x49, 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x00, 0xED, 0x00, 0xE0, 0xF0, 0xB5, 0x00, 0x20, + 0x85, 0xB0, 0x03, 0x46, 0x11, 0x4C, 0x12, 0x4F, 0x0A, 0xE0, 0x42, 0x00, 0xB9, 0x5A, 0xA6, 0x6B, + 0x0D, 0x0A, 0xF5, 0x54, 0x59, 0x1C, 0xA5, 0x6B, 0xBA, 0x5A, 0x9B, 0x1C, 0x40, 0x1C, 0x6A, 0x54, + 0x0C, 0x49, 0x09, 0x78, 0x88, 0x42, 0xF0, 0xDB, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x02, 0x91, + 0x03, 0x91, 0x0A, 0x46, 0xA1, 0x6B, 0x01, 0x92, 0x9A, 0xB2, 0x00, 0x91, 0x0B, 0x46, 0x06, 0x49, + 0xA0, 0x20, 0xFD, 0xF7, 0x0D, 0xFB, 0x05, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, + 0x48, 0x1A, 0x00, 0x20, 0x85, 0x03, 0x00, 0x20, 0xC0, 0x4F, 0x00, 0x00, 0x00, 0xB5, 0x85, 0xB0, + 0x27, 0x48, 0x00, 0x78, 0x05, 0x28, 0x48, 0xDC, 0x26, 0x48, 0x00, 0x78, 0x03, 0x28, 0x02, 0xDD, + 0x05, 0x20, 0x23, 0x49, 0x08, 0x70, 0x22, 0x48, 0x00, 0x78, 0x04, 0x28, 0x2A, 0xD1, 0x01, 0xF0, + 0x55, 0xF8, 0x00, 0xF0, 0x13, 0xF9, 0x20, 0x48, 0x00, 0x88, 0x1E, 0x28, 0x22, 0xDD, 0x64, 0x20, + 0x1E, 0x49, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, + 0x1A, 0x49, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xFF, 0x21, 0x9F, 0x31, 0xA0, 0x20, 0x17, 0x4B, + 0xFD, 0xF7, 0xD6, 0xFA, 0x01, 0x20, 0xFA, 0xF7, 0xC1, 0xFD, 0x02, 0xF0, 0xC5, 0xFE, 0x0A, 0x20, + 0xFA, 0xF7, 0xBC, 0xFD, 0x03, 0x20, 0x0E, 0x49, 0x08, 0x70, 0x0E, 0x48, 0x00, 0x78, 0x40, 0x1C, + 0x0C, 0x49, 0x08, 0x70, 0x0A, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x09, 0x49, 0x08, 0x70, 0x08, 0x46, + 0x00, 0x78, 0x05, 0x28, 0x06, 0xDD, 0x0A, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x09, 0x49, 0x08, 0x80, + 0xF9, 0xF7, 0x8C, 0xFF, 0x00, 0x20, 0x08, 0x49, 0x08, 0x70, 0x05, 0xB0, 0x00, 0xBD, 0x00, 0x00, + 0xD8, 0x00, 0x00, 0x20, 0xD9, 0x00, 0x00, 0x20, 0x5A, 0x01, 0x00, 0x20, 0x44, 0x05, 0x00, 0x20, + 0x9A, 0x01, 0x00, 0x20, 0x9C, 0x01, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, 0x11, 0x48, 0x00, 0x78, + 0x00, 0x28, 0x1D, 0xD0, 0x10, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x02, 0xD1, 0x00, 0x20, 0x0D, 0x49, + 0x08, 0x70, 0x00, 0x20, 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x70, + 0x0D, 0x49, 0x08, 0x70, 0x0D, 0x48, 0x0E, 0x49, 0x08, 0x80, 0x00, 0x20, 0x0D, 0x49, 0x08, 0x80, + 0x0D, 0x49, 0x08, 0x70, 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x80, 0x0D, 0x49, 0x08, 0x70, + 0x70, 0x47, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x20, 0x2B, 0x01, 0x00, 0x20, 0xF2, 0x00, 0x00, 0x20, + 0xF4, 0x00, 0x00, 0x20, 0xF5, 0x00, 0x00, 0x20, 0xEF, 0x00, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, + 0xE6, 0x00, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, 0xEB, 0x00, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, + 0xE2, 0x00, 0x00, 0x20, 0xEA, 0x00, 0x00, 0x20, 0x00, 0xBF, 0x04, 0x49, 0x89, 0x69, 0x09, 0x02, + 0xC9, 0x0F, 0x01, 0x29, 0xF9, 0xD0, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, 0x15, 0x40, + 0xF8, 0xB5, 0x38, 0x48, 0x00, 0x21, 0x03, 0x46, 0x37, 0x4A, 0x10, 0x33, 0x03, 0xE0, 0x54, 0x5C, + 0x04, 0x70, 0x40, 0x1C, 0x49, 0x1C, 0x98, 0x42, 0xF9, 0xD3, 0x32, 0x48, 0x00, 0x24, 0xB0, 0x38, + 0x04, 0x74, 0x32, 0x48, 0x30, 0x4E, 0x04, 0x70, 0x40, 0x3E, 0xF4, 0x74, 0x34, 0x75, 0x74, 0x71, + 0x01, 0x20, 0xFF, 0xF7, 0x5D, 0xFB, 0x2E, 0x4D, 0x59, 0x20, 0x28, 0x60, 0x16, 0x20, 0x28, 0x60, + 0x88, 0x20, 0x28, 0x60, 0xFA, 0xF7, 0x42, 0xFD, 0x1F, 0x20, 0xF4, 0x75, 0x69, 0x46, 0x00, 0x03, + 0xFA, 0xF7, 0x74, 0xFD, 0x23, 0x4E, 0x27, 0x49, 0x00, 0x98, 0x8B, 0x3E, 0x88, 0x42, 0x31, 0xD1, + 0x25, 0x4F, 0x69, 0x46, 0x38, 0x46, 0xFA, 0xF7, 0x69, 0xFD, 0x00, 0x20, 0x00, 0x99, 0x31, 0x54, + 0x00, 0x99, 0x40, 0x1C, 0x09, 0x0A, 0x00, 0x91, 0x04, 0x28, 0xF7, 0xDB, 0x1E, 0x48, 0x36, 0x1D, + 0x3F, 0x1D, 0x5A, 0x30, 0x87, 0x42, 0xEC, 0xD9, 0x69, 0x46, 0x38, 0x46, 0xFA, 0xF7, 0x56, 0xFD, + 0x14, 0x4B, 0x02, 0x27, 0x5C, 0x26, 0x00, 0x20, 0xF0, 0x3B, 0x32, 0x18, 0xD2, 0x18, 0x60, 0x32, + 0x00, 0x99, 0x51, 0x71, 0x09, 0x0A, 0x40, 0x1C, 0x00, 0x91, 0xB8, 0x42, 0xF5, 0xD3, 0xFA, 0xF7, + 0x05, 0xFD, 0x2C, 0x60, 0x01, 0x20, 0xFF, 0xF7, 0x39, 0xFB, 0x0B, 0x48, 0x01, 0x21, 0x40, 0x38, + 0xC1, 0x75, 0xF8, 0xBD, 0xFA, 0xF7, 0xFA, 0xFC, 0x2C, 0x60, 0x01, 0x20, 0xFF, 0xF7, 0x2E, 0xFB, + 0x05, 0x49, 0x00, 0x20, 0x11, 0x31, 0x0A, 0x5C, 0x32, 0x70, 0x76, 0x1C, 0x40, 0x1C, 0x5E, 0x28, + 0xF9, 0xD3, 0xF8, 0xBD, 0xA4, 0x04, 0x00, 0x20, 0x5C, 0x00, 0x00, 0x20, 0x2B, 0x01, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x50, 0x21, 0x43, 0x65, 0x87, 0x04, 0xF0, 0x01, 0x00, 0xFC, 0xB5, 0x50, 0x4D, + 0x00, 0x24, 0xEC, 0x86, 0x4F, 0x4E, 0x00, 0x94, 0xF0, 0x7A, 0x40, 0x07, 0x11, 0xD5, 0x01, 0x94, + 0x08, 0xE0, 0x00, 0x22, 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, 0x00, 0xFD, 0x6B, 0x46, 0x18, 0x79, + 0x40, 0x1C, 0x01, 0x90, 0x6B, 0x46, 0x04, 0x20, 0x18, 0x56, 0x29, 0x7A, 0x88, 0x42, 0xF0, 0xDB, + 0x0F, 0xE0, 0x28, 0x7A, 0x06, 0xE0, 0x00, 0x22, 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, 0xEE, 0xFC, + 0x6B, 0x46, 0x18, 0x79, 0x6B, 0x46, 0x40, 0x1E, 0x01, 0x90, 0x04, 0x20, 0x18, 0x56, 0x00, 0x28, + 0xF1, 0xDA, 0xF0, 0x7A, 0x00, 0x07, 0x11, 0xD5, 0x01, 0x94, 0x08, 0xE0, 0x01, 0x22, 0x01, 0xA9, + 0x68, 0x46, 0x00, 0xF0, 0xDB, 0xFC, 0x6B, 0x46, 0x18, 0x79, 0x40, 0x1C, 0x01, 0x90, 0x6B, 0x46, + 0x04, 0x20, 0x18, 0x56, 0xE9, 0x7A, 0x88, 0x42, 0xF0, 0xDB, 0x0F, 0xE0, 0xE8, 0x7A, 0x06, 0xE0, + 0x01, 0x22, 0x01, 0xA9, 0x68, 0x46, 0x00, 0xF0, 0xC9, 0xFC, 0x6B, 0x46, 0x18, 0x79, 0x6B, 0x46, + 0x40, 0x1E, 0x01, 0x90, 0x04, 0x20, 0x18, 0x56, 0x00, 0x28, 0xF1, 0xDA, 0x28, 0x49, 0xE8, 0x79, + 0x80, 0x31, 0xCA, 0x28, 0x01, 0xD0, 0xC9, 0x28, 0x32, 0xD1, 0x01, 0x22, 0x52, 0x02, 0x23, 0x27, + 0x7F, 0x01, 0x06, 0xE0, 0xCB, 0x68, 0x40, 0x00, 0x1A, 0x52, 0x6B, 0x46, 0x18, 0x88, 0x40, 0x1C, + 0x00, 0x90, 0x6B, 0x46, 0x18, 0x88, 0xB8, 0x42, 0xF4, 0xD3, 0xF0, 0x7A, 0xC0, 0x09, 0x01, 0xD0, + 0x20, 0x20, 0x00, 0xE0, 0x1C, 0x20, 0x2A, 0x7C, 0x00, 0x92, 0xEA, 0x79, 0x1A, 0x4E, 0xCA, 0x2A, + 0x01, 0x94, 0x16, 0xD1, 0x19, 0x4C, 0x0D, 0xE0, 0x6B, 0x46, 0x1B, 0x88, 0x52, 0x00, 0xCD, 0x68, + 0xA2, 0x5A, 0x5B, 0x00, 0xEA, 0x52, 0x6B, 0x46, 0x1A, 0x88, 0x12, 0x18, 0x00, 0x92, 0x1A, 0x79, + 0x52, 0x1C, 0x01, 0x92, 0x6B, 0x46, 0x04, 0x22, 0x9A, 0x56, 0x33, 0x78, 0x9A, 0x42, 0xEB, 0xDB, + 0xFC, 0xBD, 0x0F, 0x4C, 0x0D, 0xE0, 0x6B, 0x46, 0x1B, 0x88, 0x52, 0x00, 0xCD, 0x68, 0xA2, 0x5A, + 0x5B, 0x00, 0xEA, 0x52, 0x6B, 0x46, 0x1A, 0x88, 0x12, 0x18, 0x00, 0x92, 0x1A, 0x79, 0x52, 0x1C, + 0x01, 0x92, 0x6B, 0x46, 0x04, 0x22, 0x9A, 0x56, 0x33, 0x78, 0x9A, 0x42, 0xEB, 0xDB, 0xFC, 0xBD, + 0x24, 0x01, 0x00, 0x20, 0x14, 0x04, 0x00, 0x20, 0x85, 0x03, 0x00, 0x20, 0x58, 0x1A, 0x00, 0x20, + 0x38, 0x1A, 0x00, 0x20, 0xF0, 0xB5, 0x4E, 0x48, 0x4E, 0x49, 0x00, 0x88, 0x09, 0x88, 0x40, 0x04, + 0x06, 0x0C, 0x48, 0x04, 0x01, 0x0C, 0x87, 0xB0, 0x30, 0x46, 0x06, 0x91, 0x8E, 0x42, 0x00, 0xD8, + 0x08, 0x46, 0x05, 0x90, 0x48, 0x48, 0x01, 0x21, 0x41, 0x71, 0x48, 0x49, 0x0C, 0x68, 0x23, 0x21, + 0x49, 0x01, 0x65, 0x18, 0x44, 0x4F, 0x78, 0x7A, 0x00, 0x28, 0x03, 0xD0, 0x00, 0x20, 0x78, 0x72, + 0xFD, 0xF7, 0x82, 0xFD, 0x78, 0x7B, 0x00, 0x28, 0x07, 0xD0, 0x3F, 0x49, 0x00, 0x20, 0x48, 0x71, + 0x03, 0x20, 0x03, 0xF0, 0x89, 0xF8, 0x07, 0xB0, 0xF0, 0xBD, 0x02, 0xF0, 0xF5, 0xFC, 0xFC, 0xF7, + 0xEB, 0xFA, 0x35, 0x28, 0xFB, 0xD1, 0x00, 0x20, 0x03, 0x46, 0x00, 0x21, 0xBA, 0x6B, 0x40, 0x1C, + 0x10, 0x28, 0xD1, 0x54, 0xF8, 0xDB, 0x34, 0x4F, 0x03, 0x22, 0x78, 0x6B, 0xB9, 0x6B, 0x02, 0xAB, + 0x07, 0xC3, 0x33, 0x48, 0x00, 0x21, 0x00, 0x78, 0x00, 0x91, 0x42, 0x00, 0x01, 0x92, 0x0A, 0x46, + 0x30, 0x49, 0xA0, 0x20, 0x00, 0x23, 0xFD, 0xF7, 0xE3, 0xF8, 0x01, 0x20, 0xB9, 0x6B, 0xFC, 0xF7, + 0x11, 0xFA, 0x03, 0x22, 0x04, 0x92, 0x05, 0x9A, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, + 0x95, 0x21, 0x03, 0x95, 0x02, 0x94, 0x09, 0x01, 0xA0, 0x20, 0x00, 0x23, 0xFD, 0xF7, 0xD0, 0xF8, + 0x00, 0x20, 0x01, 0x46, 0x0A, 0xE0, 0x62, 0x5C, 0x63, 0x18, 0x5B, 0x78, 0x12, 0x02, 0x9A, 0x18, + 0x21, 0x4F, 0x43, 0x00, 0x3F, 0x68, 0x40, 0x1C, 0x89, 0x1C, 0xFA, 0x52, 0xB1, 0x42, 0xF2, 0xDB, + 0x00, 0x21, 0x0A, 0xE0, 0x6A, 0x5C, 0x6B, 0x18, 0x5B, 0x78, 0x12, 0x02, 0x9A, 0x18, 0x1A, 0x4F, + 0x43, 0x00, 0x3F, 0x68, 0x40, 0x1C, 0x89, 0x1C, 0xFA, 0x52, 0x06, 0x9A, 0x91, 0x42, 0xF1, 0xDB, + 0x16, 0x49, 0x00, 0x20, 0x08, 0x70, 0xFF, 0xF7, 0xD1, 0xFE, 0xFD, 0xF7, 0xA1, 0xFD, 0x0E, 0x49, + 0x01, 0x20, 0x08, 0x71, 0x00, 0xF0, 0x66, 0xFD, 0x00, 0x27, 0x0C, 0xE0, 0x01, 0x21, 0x41, 0x74, + 0xC0, 0x78, 0x00, 0x28, 0x02, 0xD1, 0xFA, 0xF7, 0x63, 0xFB, 0x7F, 0x1C, 0x7D, 0x20, 0xC0, 0x00, + 0x87, 0x42, 0x00, 0xDD, 0x7E, 0xE7, 0x04, 0x48, 0x01, 0x79, 0x00, 0x29, 0xEE, 0xD1, 0x79, 0xE7, + 0x6C, 0x01, 0x00, 0x20, 0x26, 0x02, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, 0xB0, 0x01, 0x00, 0x20, + 0x85, 0x03, 0x00, 0x20, 0xD0, 0x4F, 0x00, 0x00, 0xA8, 0x01, 0x00, 0x20, 0x1C, 0x02, 0x00, 0x20, + 0xF8, 0xB5, 0x25, 0x48, 0x07, 0x68, 0x25, 0x4E, 0x02, 0xF0, 0xE6, 0xFB, 0x59, 0x20, 0x24, 0x49, + 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xFA, 0xF7, 0x7F, 0xFB, 0x69, 0x46, + 0x7D, 0x20, 0x80, 0x02, 0xFA, 0xF7, 0xB2, 0xFB, 0x1E, 0x49, 0x00, 0x98, 0x08, 0x60, 0x00, 0x25, + 0x1D, 0x4C, 0x11, 0xE0, 0x69, 0x46, 0x20, 0x46, 0xFA, 0xF7, 0xA8, 0xFB, 0x00, 0x98, 0x38, 0x80, + 0x38, 0x88, 0x45, 0x19, 0xBF, 0x1C, 0x00, 0x98, 0x00, 0x0C, 0x00, 0x90, 0x00, 0x98, 0x2D, 0x18, + 0x00, 0x98, 0x38, 0x80, 0xBF, 0x1C, 0x24, 0x1D, 0x7D, 0x20, 0x80, 0x02, 0x30, 0x18, 0xA0, 0x42, + 0xE8, 0xD8, 0x10, 0x48, 0x00, 0x68, 0x64, 0x28, 0x0C, 0xDB, 0x69, 0x46, 0x20, 0x46, 0xFA, 0xF7, + 0x8D, 0xFB, 0x00, 0x98, 0x85, 0x42, 0x03, 0xD1, 0x01, 0x20, 0x0C, 0x49, 0x08, 0x70, 0x01, 0xE0, + 0xF9, 0xF7, 0xFE, 0xFB, 0xFA, 0xF7, 0x42, 0xFB, 0x00, 0x20, 0x05, 0x49, 0x08, 0x60, 0x02, 0x20, + 0x02, 0xF0, 0xE4, 0xFB, 0xF8, 0xBD, 0x00, 0x00, 0xAC, 0x01, 0x00, 0x20, 0xC4, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x50, 0xFC, 0x00, 0x00, 0x20, 0x04, 0xF4, 0x01, 0x00, 0xF6, 0x00, 0x00, 0x20, + 0x70, 0xB5, 0xFC, 0xF7, 0xCD, 0xFD, 0x13, 0x49, 0x08, 0x70, 0xC0, 0xB2, 0x01, 0x28, 0x03, 0xD1, + 0x02, 0x20, 0x02, 0xF0, 0xA1, 0xFF, 0x70, 0xBD, 0x00, 0x28, 0xFC, 0xD1, 0x0E, 0x4C, 0xE0, 0x7C, + 0x00, 0x28, 0x03, 0xD0, 0x00, 0x20, 0xE0, 0x74, 0x01, 0x20, 0x20, 0x75, 0x0B, 0x4D, 0x01, 0x22, + 0x29, 0x68, 0x60, 0x6B, 0xFA, 0xF7, 0xEA, 0xF9, 0x09, 0x48, 0x0A, 0x49, 0x00, 0x78, 0x09, 0x78, + 0x02, 0x22, 0x48, 0x43, 0x29, 0x68, 0x40, 0x00, 0x41, 0x18, 0xA0, 0x6B, 0xFA, 0xF7, 0xDE, 0xF9, + 0x70, 0xBD, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x20, 0xA8, 0x01, 0x00, 0x20, + 0x34, 0x01, 0x00, 0x20, 0x2C, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x2C, 0x48, 0x05, 0x68, 0x00, 0x68, 0x23, 0x21, 0x49, 0x01, 0x46, 0x18, 0x2A, 0x48, 0x2A, 0x49, 0x08, 0x80, 0x40, 0x42, 0x2A, 0x49, 0x08, 0x80, 0x00, 0x24, 0x0A, 0xE0, 0x29, 0x48, 0x03, 0x78, 0x32, 0x46, 0x28, 0x48, 0x01, 0x78, - 0x28, 0x46, 0x01, 0xF0, 0xF9, 0xF8, 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x25, 0x48, 0x00, 0x78, + 0x28, 0x46, 0x01, 0xF0, 0xB1, 0xF8, 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x25, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, 0x24, 0x48, 0x00, 0x78, 0x00, 0x28, 0x10, 0xD0, 0x00, 0x24, 0x0A, 0xE0, - 0x22, 0x48, 0x03, 0x78, 0x32, 0x46, 0x20, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, 0xE4, 0xF8, + 0x22, 0x48, 0x03, 0x78, 0x32, 0x46, 0x20, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, 0x9C, 0xF8, 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x1B, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, 0x00, 0x24, 0x0A, 0xE0, 0x16, 0x48, 0x03, 0x78, 0x32, 0x46, 0x15, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, - 0xD3, 0xF8, 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x15, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, + 0x8B, 0xF8, 0x14, 0x35, 0x14, 0x36, 0x64, 0x1C, 0x15, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, 0x11, 0x48, 0x00, 0x78, 0x00, 0x28, 0x10, 0xD0, 0x00, 0x24, 0x0A, 0xE0, 0x0F, 0x48, 0x03, 0x78, - 0x32, 0x46, 0x0D, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, 0xBE, 0xF8, 0x14, 0x35, 0x14, 0x36, - 0x64, 0x1C, 0x0B, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, 0x70, 0xBD, 0xC0, 0x01, 0x00, 0x20, - 0x18, 0xFC, 0xFF, 0xFF, 0x88, 0x01, 0x00, 0x20, 0x86, 0x01, 0x00, 0x20, 0x44, 0x01, 0x00, 0x20, - 0x41, 0x01, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, 0x45, 0x01, 0x00, 0x20, - 0x47, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, 0x23, 0x46, 0x02, 0xF0, 0x68, 0xFC, - 0x05, 0x04, 0x07, 0x0C, 0x11, 0x14, 0x17, 0x00, 0x01, 0xF0, 0x48, 0xFF, 0x10, 0xE0, 0x01, 0xF0, - 0xC3, 0xFF, 0xFF, 0xF7, 0x89, 0xFC, 0x0B, 0xE0, 0xFF, 0xF7, 0x30, 0xFC, 0x02, 0xF0, 0x04, 0xFB, - 0x06, 0xE0, 0x00, 0xF0, 0x67, 0xFC, 0x03, 0xE0, 0xF9, 0xF7, 0x44, 0xFA, 0x00, 0xE0, 0x00, 0xBF, - 0x00, 0xBF, 0x28, 0x46, 0x70, 0xBD, 0x00, 0x00, 0x10, 0xB5, 0xFD, 0xF7, 0x03, 0xFE, 0x93, 0x48, - 0x40, 0x79, 0x80, 0x07, 0x80, 0x0F, 0x92, 0x49, 0x08, 0x70, 0x90, 0x48, 0x40, 0x1D, 0xC0, 0x79, - 0xC0, 0x06, 0x80, 0x0F, 0x24, 0xD1, 0x8D, 0x48, 0x40, 0x1D, 0x40, 0x78, 0x8D, 0x49, 0x08, 0x80, - 0x08, 0x46, 0x00, 0x88, 0x00, 0x02, 0x00, 0xB2, 0x08, 0x80, 0x88, 0x48, 0x40, 0x1D, 0x80, 0x78, - 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x87, 0x49, 0x08, 0x80, 0x84, 0x48, 0x40, 0x1D, 0xC0, 0x78, - 0x85, 0x49, 0x08, 0x80, 0x08, 0x46, 0x00, 0x88, 0x00, 0x02, 0x00, 0xB2, 0x08, 0x80, 0x7F, 0x48, - 0x40, 0x1D, 0x00, 0x79, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x7F, 0x49, 0x08, 0x80, 0x23, 0xE0, - 0x7A, 0x48, 0x40, 0x1D, 0x80, 0x78, 0x7B, 0x49, 0x08, 0x80, 0x08, 0x46, 0x00, 0x88, 0x00, 0x02, - 0x00, 0xB2, 0x08, 0x80, 0x75, 0x48, 0x40, 0x1D, 0x40, 0x78, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, - 0x74, 0x49, 0x08, 0x80, 0x71, 0x48, 0x40, 0x1D, 0x00, 0x79, 0x73, 0x49, 0x08, 0x80, 0x08, 0x46, - 0x00, 0x88, 0x00, 0x02, 0x00, 0xB2, 0x08, 0x80, 0x6C, 0x48, 0x40, 0x1D, 0xC0, 0x78, 0x09, 0x88, - 0x40, 0x18, 0x00, 0xB2, 0x6C, 0x49, 0x08, 0x80, 0x0A, 0x20, 0x6C, 0x49, 0x08, 0x70, 0x67, 0x48, - 0x40, 0x1D, 0x40, 0x79, 0x0A, 0x28, 0x05, 0xDC, 0x64, 0x48, 0x40, 0x1D, 0x40, 0x79, 0x00, 0x07, - 0x00, 0x0F, 0x08, 0x70, 0x61, 0x48, 0x40, 0x1D, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, - 0x15, 0xD1, 0x5E, 0x48, 0x40, 0x1D, 0x81, 0x78, 0x5B, 0x30, 0xC1, 0x70, 0x5B, 0x38, 0x41, 0x78, - 0x5B, 0x30, 0x01, 0x71, 0x5B, 0x38, 0x01, 0x79, 0x5B, 0x30, 0x41, 0x71, 0x5B, 0x38, 0xC1, 0x78, - 0x5B, 0x30, 0x81, 0x71, 0x59, 0x48, 0x01, 0x78, 0x54, 0x48, 0x60, 0x30, 0x01, 0x73, 0x53, 0x49, - 0x49, 0x1D, 0xC9, 0x79, 0x48, 0x07, 0x40, 0x0F, 0x55, 0x49, 0x09, 0x78, 0xC9, 0x08, 0xC9, 0x00, - 0x01, 0x43, 0x53, 0x4A, 0x11, 0x70, 0x4D, 0x48, 0x40, 0x1D, 0xC0, 0x7A, 0x00, 0x07, 0x00, 0x0F, - 0x50, 0x49, 0x08, 0x70, 0x49, 0x48, 0x40, 0x1D, 0x00, 0x7B, 0x80, 0x06, 0x80, 0x0E, 0x4E, 0x49, - 0x08, 0x70, 0x46, 0x48, 0x40, 0x1D, 0x00, 0x7B, 0xC0, 0x21, 0x08, 0x40, 0x80, 0x11, 0x4B, 0x49, - 0x08, 0x70, 0x42, 0x48, 0x40, 0x1D, 0x40, 0x7B, 0x49, 0x49, 0x08, 0x70, 0xFA, 0xF7, 0x1A, 0xFF, - 0x3E, 0x48, 0x25, 0x30, 0x00, 0x7F, 0x47, 0x49, 0x08, 0x70, 0x3C, 0x48, 0x25, 0x30, 0x40, 0x7F, - 0x45, 0x49, 0x08, 0x70, 0x01, 0x20, 0xFF, 0xF7, 0x41, 0xF9, 0x59, 0x20, 0x43, 0x49, 0x08, 0x60, - 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x41, 0x49, 0x09, 0x78, 0x41, 0x4A, 0x51, 0x43, - 0x08, 0x46, 0xFA, 0xF7, 0x35, 0xFE, 0x00, 0x20, 0x3C, 0x49, 0x08, 0x60, 0x01, 0x20, 0xFF, 0xF7, - 0x4B, 0xF9, 0x02, 0x20, 0xFA, 0xF7, 0x58, 0xF9, 0x01, 0xF0, 0x2C, 0xFD, 0x2B, 0x48, 0x45, 0x30, - 0x40, 0x7F, 0x00, 0x06, 0x00, 0x0F, 0x40, 0x00, 0x80, 0x1D, 0x37, 0x49, 0x08, 0x70, 0x08, 0x46, - 0x00, 0x78, 0x24, 0x28, 0x01, 0xDD, 0x24, 0x20, 0x08, 0x70, 0x33, 0x49, 0x09, 0x78, 0x7D, 0x22, - 0xD2, 0x02, 0x51, 0x43, 0x08, 0x46, 0x06, 0x21, 0xF8, 0xF7, 0xD2, 0xF8, 0x2F, 0x49, 0x08, 0x60, - 0x2D, 0x49, 0x09, 0x78, 0x19, 0x22, 0x92, 0x02, 0x51, 0x43, 0x08, 0x46, 0x06, 0x21, 0xF8, 0xF7, - 0xC7, 0xF8, 0x2B, 0x49, 0x08, 0x60, 0xFD, 0xF7, 0x11, 0xFE, 0x2A, 0x48, 0x2A, 0x49, 0x08, 0x60, - 0x2A, 0x48, 0x2B, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x2A, 0x49, 0x08, 0x60, 0x08, 0x46, - 0x00, 0x68, 0x29, 0x49, 0x08, 0x60, 0x29, 0x49, 0x09, 0x78, 0x29, 0x4A, 0x12, 0x78, 0x51, 0x43, - 0x08, 0x46, 0xC9, 0x0F, 0x09, 0x18, 0x49, 0x10, 0x22, 0x4A, 0x12, 0x68, 0x89, 0x18, 0x14, 0x31, - 0x24, 0x4A, 0x11, 0x60, 0x1C, 0x48, 0x00, 0x68, 0x23, 0x49, 0x08, 0x60, 0xFD, 0xF7, 0xA4, 0xFC, - 0x03, 0x20, 0x22, 0x49, 0x08, 0x70, 0x05, 0x48, 0x40, 0x1D, 0x40, 0x7A, 0x00, 0x07, 0x00, 0x0F, - 0x1F, 0x49, 0x08, 0x70, 0x07, 0x20, 0x1F, 0x49, 0x08, 0x70, 0x10, 0xBD, 0x34, 0x04, 0x00, 0x20, - 0x51, 0x01, 0x00, 0x20, 0x92, 0x00, 0x00, 0x20, 0x94, 0x00, 0x00, 0x20, 0x4A, 0x01, 0x00, 0x20, - 0xD6, 0x00, 0x00, 0x20, 0x4E, 0x01, 0x00, 0x20, 0x3B, 0x01, 0x00, 0x20, 0x5A, 0x01, 0x00, 0x20, - 0x4F, 0x01, 0x00, 0x20, 0x4C, 0x01, 0x00, 0x20, 0x4B, 0x01, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, - 0xC2, 0x00, 0x00, 0x20, 0x40, 0x42, 0x0F, 0x00, 0xC3, 0x00, 0x00, 0x20, 0xB0, 0x01, 0x00, 0x20, - 0xB4, 0x01, 0x00, 0x20, 0x60, 0x07, 0x00, 0x20, 0xBC, 0x01, 0x00, 0x20, 0x38, 0x11, 0x00, 0x20, - 0xC0, 0x01, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, - 0x49, 0x01, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, 0xB8, 0x01, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, - 0xD7, 0x00, 0x00, 0x20, 0xDD, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x11, 0x49, 0x00, 0x28, 0x05, 0xD1, - 0x0B, 0x7C, 0x08, 0x22, 0x00, 0x2B, 0x07, 0xD0, 0x0A, 0x7C, 0x15, 0xE0, 0x08, 0x7C, 0x08, 0x22, - 0x00, 0x28, 0x13, 0xD0, 0x08, 0x7C, 0x0F, 0xE0, 0x09, 0x49, 0xA0, 0x39, 0x09, 0x18, 0xA0, 0x31, - 0x0B, 0x79, 0x00, 0x2B, 0x0A, 0xD0, 0x09, 0x79, 0xFF, 0x23, 0x01, 0x33, 0x59, 0x1A, 0x44, 0x00, - 0x04, 0x4B, 0x40, 0x1C, 0x19, 0x53, 0xC0, 0xB2, 0x90, 0x42, 0xED, 0xD3, 0x10, 0xBD, 0x00, 0x00, - 0x74, 0x04, 0x00, 0x20, 0xEA, 0x06, 0x00, 0x20, 0xFC, 0xB5, 0xBA, 0x48, 0x07, 0x68, 0x00, 0x68, - 0x23, 0x21, 0x49, 0x01, 0x40, 0x18, 0x00, 0x90, 0x00, 0xF0, 0x8E, 0xFA, 0xB6, 0x48, 0x06, 0x78, - 0x00, 0x25, 0x00, 0x24, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, - 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0xB1, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0xAD, 0x4A, 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, - 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0xAA, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, - 0x00, 0xB2, 0x61, 0x00, 0xA6, 0x4A, 0x50, 0x52, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, - 0x0B, 0xDD, 0x60, 0x00, 0xA1, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0x9D, 0x4A, 0x50, 0x52, 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, - 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x99, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, - 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x95, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, - 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x91, 0x48, 0x00, 0x78, - 0x84, 0x42, 0xB0, 0xDB, 0x90, 0x48, 0x00, 0x78, 0x00, 0x28, 0x50, 0xD0, 0x00, 0x24, 0x4A, 0xE0, - 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, - 0x86, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x83, 0x4A, - 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, - 0x7F, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x7C, 0x4A, - 0x50, 0x52, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, 0x0B, 0xDD, 0x60, 0x00, 0x77, 0x49, - 0x09, 0x5A, 0x6A, 0x00, 0x00, 0x98, 0x80, 0x5A, 0x08, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x73, 0x4A, - 0x50, 0x52, 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, - 0x60, 0x00, 0x6F, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, - 0x61, 0x00, 0x6B, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, - 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x67, 0x48, 0x00, 0x78, 0x84, 0x42, 0xB0, 0xDB, 0x65, 0x48, - 0x04, 0x78, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0xB0, 0x42, - 0x0A, 0xDD, 0x60, 0x00, 0x5D, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, 0x00, 0xB2, - 0x61, 0x00, 0x5A, 0x4A, 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, 0x88, 0x42, - 0x09, 0xDA, 0x60, 0x00, 0x56, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, 0x00, 0xB2, - 0x61, 0x00, 0x53, 0x4A, 0x50, 0x52, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, 0x0B, 0xDD, - 0x60, 0x00, 0x4E, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x18, 0x00, 0xB2, - 0x61, 0x00, 0x4A, 0x4A, 0x50, 0x52, 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0x71, 0x42, - 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x46, 0x49, 0x08, 0x5A, 0x6A, 0x00, 0x00, 0x99, 0x89, 0x5A, - 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x42, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, 0x01, 0x90, - 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x3E, 0x48, 0x00, 0x78, 0x3F, 0x49, - 0x09, 0x78, 0x40, 0x18, 0xA0, 0x42, 0xAD, 0xDC, 0x3B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x54, 0xD0, - 0x38, 0x48, 0x04, 0x78, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, - 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0x31, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0x2D, 0x4A, 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, - 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0x2A, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, - 0x00, 0xB2, 0x61, 0x00, 0x26, 0x4A, 0x50, 0x52, 0x69, 0x00, 0x00, 0x98, 0x40, 0x5E, 0xB0, 0x42, - 0x0B, 0xDD, 0x60, 0x00, 0x21, 0x49, 0x09, 0x5A, 0x6A, 0x00, 0x00, 0x98, 0x80, 0x5A, 0x08, 0x18, - 0x00, 0xB2, 0x61, 0x00, 0x1D, 0x4A, 0x50, 0x52, 0x10, 0xE0, 0x69, 0x00, 0x00, 0x98, 0x40, 0x5E, - 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x19, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, - 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x15, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, - 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x11, 0x48, 0x00, 0x78, - 0x12, 0x49, 0x09, 0x78, 0x40, 0x18, 0xA0, 0x42, 0xAD, 0xDC, 0x00, 0x24, 0x0F, 0xE0, 0x60, 0x00, - 0x0A, 0x49, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDC, 0x60, 0x00, 0x09, 0x49, 0x08, 0x5E, 0x00, 0x28, - 0x04, 0xDD, 0x0B, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x09, 0x49, 0x08, 0x70, 0x64, 0x1C, 0x20, 0x2C, - 0xED, 0xDB, 0xFC, 0xBD, 0xC0, 0x01, 0x00, 0x20, 0x4C, 0x01, 0x00, 0x20, 0x24, 0x05, 0x00, 0x20, - 0x64, 0x05, 0x00, 0x20, 0x46, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, 0x47, 0x01, 0x00, 0x20, - 0xE0, 0x00, 0x00, 0x20, 0xF7, 0xB5, 0x86, 0xB0, 0x78, 0x4B, 0x05, 0x93, 0xDC, 0x7A, 0x00, 0x22, - 0x77, 0x4B, 0xE7, 0x09, 0x1E, 0x89, 0x9D, 0x88, 0xDC, 0x88, 0x04, 0x96, 0x1E, 0x88, 0x03, 0x95, - 0x5D, 0x88, 0x74, 0x4B, 0x02, 0x94, 0x1B, 0x68, 0x8C, 0x56, 0x01, 0x93, 0x7D, 0xD1, 0xE1, 0x03, - 0x0F, 0x0C, 0x6F, 0x49, 0xB6, 0x46, 0x40, 0x39, 0x0B, 0x8F, 0x49, 0x8F, 0x8C, 0x46, 0x08, 0x99, - 0x01, 0x29, 0x0A, 0xD1, 0x04, 0x99, 0x03, 0x9D, 0x79, 0x18, 0x8F, 0xB2, 0x68, 0x49, 0xAE, 0x46, - 0x40, 0x39, 0x8B, 0x8F, 0xC9, 0x8F, 0x02, 0x9D, 0x8C, 0x46, 0x05, 0x99, 0xC9, 0x7A, 0xC9, 0x06, - 0x02, 0xD5, 0x00, 0x21, 0x8E, 0x46, 0x00, 0xE0, 0x00, 0x25, 0x61, 0x49, 0x40, 0x39, 0x8E, 0x7A, - 0x49, 0x7B, 0xE4, 0x07, 0x05, 0xD1, 0x5E, 0x49, 0x40, 0x39, 0x4E, 0x7A, 0x09, 0x7B, 0x00, 0x23, - 0x9C, 0x46, 0x08, 0x9C, 0x01, 0x2C, 0x00, 0xD1, 0x0E, 0x46, 0x01, 0x9C, 0x79, 0x00, 0x0C, 0x19, - 0x00, 0x21, 0xEB, 0x18, 0x00, 0x93, 0x10, 0xE0, 0x0B, 0x46, 0x00, 0x9D, 0x73, 0x43, 0x5B, 0x19, - 0x5B, 0x00, 0xE7, 0x5A, 0x03, 0x88, 0x52, 0x1C, 0x5D, 0x1C, 0x05, 0x80, 0x51, 0x4D, 0x49, 0x1C, - 0xAD, 0x68, 0x5B, 0x00, 0x92, 0xB2, 0xC9, 0xB2, 0xEF, 0x52, 0x4D, 0x4B, 0x40, 0x3B, 0x9D, 0x7B, - 0xA9, 0x42, 0xE9, 0xD3, 0x65, 0x46, 0x75, 0x44, 0x00, 0x21, 0xAC, 0x46, 0x0F, 0xE0, 0x0B, 0x46, - 0x73, 0x43, 0x63, 0x44, 0x5B, 0x00, 0xE7, 0x5A, 0x03, 0x88, 0x52, 0x1C, 0x5D, 0x1C, 0x05, 0x80, - 0x44, 0x4D, 0x49, 0x1C, 0xAD, 0x68, 0x5B, 0x00, 0x92, 0xB2, 0xC9, 0xB2, 0xEF, 0x52, 0x40, 0x4B, - 0x40, 0x3B, 0xDB, 0x7B, 0x99, 0x42, 0xEA, 0xD3, 0x3D, 0x49, 0x40, 0x39, 0xC9, 0x79, 0xCA, 0x29, - 0x01, 0xD0, 0xC9, 0x29, 0x0F, 0xD1, 0x01, 0x23, 0xD1, 0xB2, 0x3A, 0x4D, 0x5B, 0x02, 0x08, 0xE0, - 0x0B, 0xE0, 0x02, 0x88, 0x54, 0x1C, 0x04, 0x80, 0x49, 0x1C, 0xAC, 0x68, 0x52, 0x00, 0xC9, 0xB2, - 0xA3, 0x52, 0x1C, 0x29, 0xF5, 0xD3, 0x09, 0xB0, 0xF0, 0xBD, 0x31, 0x4F, 0xB6, 0x46, 0x40, 0x3F, - 0x08, 0x9E, 0x3B, 0x7A, 0xA1, 0xB2, 0x01, 0x2E, 0x06, 0xD1, 0x04, 0x99, 0xFB, 0x7A, 0x61, 0x18, - 0x03, 0x9C, 0x02, 0x9D, 0x89, 0xB2, 0xA6, 0x46, 0x05, 0x9C, 0xE4, 0x7A, 0xE4, 0x06, 0x02, 0xD5, - 0x00, 0x24, 0xA6, 0x46, 0x00, 0xE0, 0x00, 0x25, 0x01, 0x9C, 0x49, 0x00, 0x09, 0x19, 0x8C, 0x46, - 0x00, 0x21, 0x10, 0xE0, 0x0C, 0x46, 0x5C, 0x43, 0x64, 0x19, 0x66, 0x46, 0x64, 0x00, 0x37, 0x5B, - 0x04, 0x88, 0x52, 0x1C, 0x66, 0x1C, 0x06, 0x80, 0x1E, 0x4E, 0x49, 0x1C, 0xB6, 0x68, 0x64, 0x00, - 0x92, 0xB2, 0xC9, 0xB2, 0x37, 0x53, 0x1A, 0x4C, 0x40, 0x3C, 0xA6, 0x7B, 0xB1, 0x42, 0xE9, 0xD3, - 0x00, 0x21, 0x18, 0x4F, 0x0F, 0xE0, 0x0C, 0x46, 0x5C, 0x43, 0x74, 0x44, 0x66, 0x46, 0x64, 0x00, - 0x36, 0x5B, 0x04, 0x88, 0x52, 0x1C, 0x65, 0x1C, 0x05, 0x80, 0x49, 0x1C, 0xBD, 0x68, 0x64, 0x00, - 0x92, 0xB2, 0xC9, 0xB2, 0x2E, 0x53, 0x0E, 0x4C, 0x40, 0x3C, 0xE4, 0x7B, 0xA1, 0x42, 0xEA, 0xD3, - 0x0B, 0x49, 0x40, 0x39, 0xC9, 0x79, 0xCA, 0x29, 0x01, 0xD0, 0xC9, 0x29, 0xAB, 0xD1, 0x01, 0x23, - 0xD1, 0xB2, 0x5B, 0x02, 0x07, 0xE0, 0x02, 0x88, 0x54, 0x1C, 0x04, 0x80, 0x49, 0x1C, 0xBC, 0x68, - 0x52, 0x00, 0xC9, 0xB2, 0xA3, 0x52, 0x20, 0x29, 0xF5, 0xD3, 0x9C, 0xE7, 0x34, 0x04, 0x00, 0x20, - 0x78, 0x01, 0x00, 0x20, 0xB8, 0x01, 0x00, 0x20, 0x00, 0xBF, 0x0A, 0x49, 0x89, 0x69, 0x09, 0x02, - 0xC9, 0x0F, 0x01, 0x29, 0xF9, 0xD0, 0x07, 0x49, 0x08, 0x60, 0x0A, 0x28, 0x09, 0xD1, 0x00, 0xBF, - 0x04, 0x49, 0x89, 0x69, 0x09, 0x02, 0xC9, 0x0F, 0x01, 0x29, 0xF9, 0xD0, 0x0D, 0x21, 0x01, 0x4A, - 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x15, 0x40, 0x00, 0x20, 0x07, 0xE0, 0x00, 0x21, 0x42, 0x00, - 0x05, 0x4B, 0x99, 0x52, 0x42, 0x00, 0x05, 0x4B, 0x99, 0x52, 0x40, 0x1C, 0x20, 0x28, 0xF5, 0xDB, - 0x00, 0x21, 0x03, 0x4A, 0x11, 0x70, 0x70, 0x47, 0x24, 0x05, 0x00, 0x20, 0x64, 0x05, 0x00, 0x20, - 0xE0, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x0E, 0x4E, 0x8C, 0x46, 0x34, 0x7C, 0x31, 0x46, 0x80, 0x31, - 0xA4, 0x1C, 0x44, 0x43, 0x01, 0x25, 0x8C, 0x61, 0x0F, 0xE0, 0x14, 0x46, 0x04, 0xE0, 0x8E, 0x69, - 0xCF, 0x68, 0x36, 0x19, 0x64, 0x1C, 0xBD, 0x55, 0x9C, 0x42, 0xF8, 0xDD, 0x04, 0x4E, 0x8C, 0x69, - 0x36, 0x7C, 0xA4, 0x19, 0xA4, 0x1C, 0x40, 0x1C, 0x8C, 0x61, 0x60, 0x45, 0xED, 0xDD, 0xF0, 0xBD, - 0x38, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x24, 0x05, 0xE0, 0x00, 0x20, 0x61, 0x00, 0x17, 0x4A, - 0x12, 0x68, 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, 0xF5, 0xDB, 0xFB, 0xF7, - 0xFF, 0xFC, 0xF8, 0xF7, 0x23, 0xF9, 0x00, 0x24, 0x08, 0xE0, 0x60, 0x00, 0x10, 0x49, 0x09, 0x68, - 0x08, 0x5A, 0x61, 0x00, 0x0D, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, - 0x84, 0x42, 0xF2, 0xDB, 0x64, 0x20, 0x0B, 0x49, 0x08, 0x60, 0x01, 0x20, 0x0A, 0x49, 0x08, 0x70, - 0x00, 0x20, 0x0A, 0x49, 0x08, 0x70, 0x0A, 0x49, 0x08, 0x70, 0x0A, 0x49, 0x08, 0x80, 0x0A, 0x49, - 0x08, 0x70, 0x23, 0x20, 0x80, 0x01, 0x00, 0xF0, 0x89, 0xFA, 0x10, 0xBD, 0xBC, 0x01, 0x00, 0x20, - 0xC0, 0x01, 0x00, 0x20, 0x10, 0x01, 0x00, 0x20, 0x0A, 0x01, 0x00, 0x20, 0x14, 0x01, 0x00, 0x20, - 0x0B, 0x01, 0x00, 0x20, 0x0C, 0x01, 0x00, 0x20, 0x0E, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x0D, 0x48, - 0x80, 0x79, 0x80, 0x07, 0x80, 0x0F, 0x06, 0xD0, 0x01, 0x28, 0x0A, 0xD0, 0x02, 0x28, 0x09, 0xD0, - 0x03, 0x28, 0x0C, 0xD1, 0x00, 0xE0, 0x00, 0xBF, 0x01, 0x21, 0x03, 0x20, 0xFA, 0xF7, 0x9E, 0xF8, - 0x06, 0xE0, 0x00, 0xBF, 0x01, 0x21, 0x03, 0x20, 0xF9, 0xF7, 0x1C, 0xFE, 0x00, 0xBF, 0x00, 0xBF, - 0x00, 0xBF, 0x10, 0xBD, 0x39, 0x04, 0x00, 0x20, 0x00, 0xB5, 0x87, 0xB0, 0x00, 0x20, 0x05, 0x90, - 0x05, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, - 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x3E, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, - 0xB3, 0xFA, 0x01, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, - 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x37, 0x49, 0xA0, 0x20, 0x05, 0xAB, - 0xFC, 0xF7, 0xA2, 0xFA, 0x23, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x2E, 0x49, 0xA0, 0x20, - 0x05, 0xAB, 0xFC, 0xF7, 0x91, 0xFA, 0x45, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, - 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x26, 0x49, - 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, 0x80, 0xFA, 0x67, 0x20, 0x06, 0x90, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, - 0x1D, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, 0x6F, 0xFA, 0x05, 0x20, 0x06, 0x90, 0x05, 0xAA, - 0x00, 0x92, 0x01, 0x22, 0x17, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x53, 0xFD, 0x01, 0x20, - 0x06, 0x90, 0x05, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x13, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, - 0x49, 0xFD, 0x23, 0x20, 0x06, 0x90, 0x05, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x0E, 0x49, 0xA0, 0x20, - 0x06, 0xAB, 0xFC, 0xF7, 0x3F, 0xFD, 0x45, 0x20, 0x06, 0x90, 0x05, 0xAA, 0x00, 0x92, 0x01, 0x22, - 0x09, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x35, 0xFD, 0x67, 0x20, 0x06, 0x90, 0x05, 0xAA, - 0x00, 0x92, 0x01, 0x22, 0x04, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x2B, 0xFD, 0x07, 0xB0, - 0x00, 0xBD, 0x00, 0x00, 0x03, 0x13, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0xF8, 0xB5, 0x7D, 0x21, - 0x4E, 0x48, 0xC9, 0x00, 0xC1, 0x81, 0x49, 0x42, 0x01, 0x82, 0x4D, 0x4A, 0x00, 0x21, 0x11, 0x60, - 0x4C, 0x4A, 0x11, 0x60, 0x4C, 0x4A, 0x11, 0x70, 0x4C, 0x4A, 0x11, 0x70, 0x4C, 0x49, 0xC9, 0x7A, - 0x06, 0x46, 0x40, 0x3E, 0x34, 0x7C, 0x32, 0x7A, 0x8B, 0x06, 0x5C, 0xD5, 0x00, 0x25, 0x54, 0x43, - 0x2F, 0x46, 0x0F, 0xE0, 0x41, 0x48, 0x61, 0x00, 0x40, 0x30, 0x00, 0x68, 0x33, 0x7B, 0x0A, 0x18, - 0x69, 0x00, 0x08, 0x18, 0x71, 0x7A, 0x00, 0xF0, 0x07, 0xFB, 0x70, 0x7A, 0x2D, 0x18, 0x30, 0x7B, - 0x24, 0x18, 0x7F, 0x1C, 0xB0, 0x7B, 0x87, 0x42, 0xEC, 0xDB, 0xB0, 0x7A, 0x00, 0x28, 0x14, 0xD0, - 0x00, 0x27, 0x0F, 0xE0, 0x35, 0x48, 0x61, 0x00, 0x40, 0x30, 0x00, 0x68, 0x73, 0x7B, 0x0A, 0x18, - 0x69, 0x00, 0x08, 0x18, 0xB1, 0x7A, 0x00, 0xF0, 0xEF, 0xFA, 0xB0, 0x7A, 0x2D, 0x18, 0x70, 0x7B, - 0x24, 0x18, 0x7F, 0x1C, 0xB0, 0x7B, 0x87, 0x42, 0xEC, 0xDB, 0x00, 0x27, 0x0F, 0xE0, 0x2B, 0x48, - 0x61, 0x00, 0x40, 0x30, 0x00, 0x68, 0x33, 0x7B, 0x0A, 0x18, 0x69, 0x00, 0x08, 0x18, 0x71, 0x7A, - 0x00, 0xF0, 0xDA, 0xFA, 0x70, 0x7A, 0x2D, 0x18, 0x30, 0x7B, 0x24, 0x18, 0x7F, 0x1C, 0xF0, 0x7B, - 0x87, 0x42, 0xEC, 0xDB, 0xB0, 0x7A, 0x00, 0x28, 0x3D, 0xD0, 0x00, 0x27, 0x0F, 0xE0, 0x1F, 0x48, - 0x61, 0x00, 0x40, 0x30, 0x00, 0x68, 0x73, 0x7B, 0x0A, 0x18, 0x69, 0x00, 0x08, 0x18, 0xB1, 0x7A, - 0x00, 0xF0, 0xC2, 0xFA, 0xB0, 0x7A, 0x2D, 0x18, 0x70, 0x7B, 0x24, 0x18, 0x7F, 0x1C, 0xF0, 0x7B, - 0x87, 0x42, 0xEC, 0xDB, 0x27, 0xE0, 0xF3, 0x7A, 0x00, 0x21, 0xD7, 0x18, 0x13, 0x4A, 0x67, 0x43, - 0x40, 0x3A, 0x13, 0x7D, 0x80, 0x32, 0x14, 0x68, 0x1B, 0xE0, 0x4D, 0x00, 0x10, 0x26, 0x62, 0x5F, - 0x86, 0x5F, 0xB2, 0x42, 0x01, 0xDD, 0x02, 0x82, 0x04, 0xE0, 0x0E, 0x26, 0x86, 0x5F, 0xB2, 0x42, - 0x00, 0xDA, 0xC2, 0x81, 0x62, 0x5F, 0x9A, 0x42, 0x03, 0xDD, 0x09, 0x4E, 0x35, 0x68, 0x52, 0x19, - 0x05, 0xE0, 0x5D, 0x42, 0xAA, 0x42, 0x03, 0xDA, 0x06, 0x4E, 0x35, 0x68, 0xAA, 0x1A, 0x32, 0x60, - 0x49, 0x1C, 0xB9, 0x42, 0xE1, 0xDB, 0x00, 0x20, 0xF8, 0xBD, 0x00, 0x00, 0x78, 0x01, 0x00, 0x20, - 0xE4, 0x00, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x05, 0x01, 0x00, 0x20, - 0x34, 0x04, 0x00, 0x20, 0xF8, 0xB5, 0x3D, 0x48, 0x32, 0x21, 0x2E, 0x22, 0x41, 0x5E, 0x82, 0x5E, - 0x40, 0x30, 0x00, 0x90, 0x40, 0x89, 0x89, 0x1A, 0x81, 0x42, 0x09, 0xD1, 0x37, 0x48, 0x34, 0x21, - 0x30, 0x22, 0x41, 0x5E, 0x82, 0x5E, 0x00, 0x98, 0x89, 0x1A, 0x80, 0x89, 0x81, 0x42, 0x63, 0xD0, - 0x00, 0x24, 0x32, 0x48, 0x80, 0x30, 0x40, 0x6A, 0x01, 0x5D, 0x86, 0x46, 0x00, 0x29, 0x57, 0xD0, - 0x2E, 0x48, 0x34, 0x27, 0x30, 0x22, 0xC7, 0x5F, 0x82, 0x5E, 0x00, 0x98, 0x83, 0x89, 0xB8, 0x1A, - 0x84, 0x46, 0x98, 0x42, 0x1F, 0xDA, 0x29, 0x48, 0x65, 0x00, 0x80, 0x30, 0x06, 0x6A, 0x39, 0x46, - 0x70, 0x5F, 0xC8, 0x31, 0x88, 0x42, 0x03, 0xDA, 0x11, 0x46, 0xC8, 0x39, 0x88, 0x42, 0x03, 0xDA, - 0x00, 0x20, 0x71, 0x46, 0x08, 0x55, 0x0E, 0xE0, 0xB8, 0x42, 0x02, 0xDB, 0x5B, 0x1E, 0x73, 0x53, - 0x09, 0xE0, 0x90, 0x42, 0x01, 0xDC, 0x00, 0x20, 0x04, 0xE0, 0x80, 0x1A, 0x58, 0x43, 0x61, 0x46, - 0xF7, 0xF7, 0x76, 0xFB, 0x70, 0x53, 0x19, 0x48, 0x32, 0x27, 0x2E, 0x22, 0xC7, 0x5F, 0x82, 0x5E, - 0x00, 0x98, 0x43, 0x89, 0xB8, 0x1A, 0x84, 0x46, 0x98, 0x42, 0x21, 0xDA, 0x13, 0x48, 0x65, 0x00, - 0x80, 0x30, 0xC6, 0x69, 0x11, 0x46, 0x70, 0x5F, 0xC8, 0x39, 0x88, 0x42, 0x03, 0xDB, 0x39, 0x46, - 0xC8, 0x31, 0x88, 0x42, 0x05, 0xDB, 0x0D, 0x49, 0x00, 0x20, 0x80, 0x31, 0x49, 0x6A, 0x08, 0x55, - 0x0E, 0xE0, 0xB8, 0x42, 0x02, 0xDB, 0x5B, 0x1E, 0x73, 0x53, 0x09, 0xE0, 0x90, 0x42, 0x01, 0xDC, - 0x00, 0x20, 0x04, 0xE0, 0x80, 0x1A, 0x58, 0x43, 0x61, 0x46, 0xF7, 0xF7, 0x49, 0xFB, 0x70, 0x53, - 0x64, 0x1C, 0xE4, 0xB2, 0x0A, 0x2C, 0x9C, 0xD3, 0xF8, 0xBD, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, - 0xFF, 0xB5, 0x87, 0xB0, 0x00, 0x20, 0x02, 0x90, 0x01, 0x90, 0x10, 0x98, 0x11, 0x99, 0x10, 0x1A, - 0x15, 0x46, 0x5A, 0x1A, 0x40, 0x43, 0x52, 0x43, 0x87, 0x18, 0x08, 0x98, 0x07, 0x99, 0xC2, 0x1A, - 0x49, 0x1B, 0x49, 0x43, 0x52, 0x43, 0x8C, 0x18, 0x1E, 0x46, 0x43, 0x4A, 0x03, 0x92, 0x42, 0x4B, - 0x10, 0x98, 0x11, 0x79, 0x12, 0x78, 0x20, 0x3B, 0x06, 0x91, 0x19, 0x7E, 0x05, 0x92, 0x04, 0x91, - 0x85, 0x42, 0x16, 0xD1, 0x11, 0x98, 0x86, 0x42, 0x13, 0xD1, 0x06, 0x98, 0x00, 0x28, 0x03, 0xD0, - 0x01, 0x20, 0x80, 0x04, 0x84, 0x42, 0x6D, 0xDC, 0x01, 0x20, 0xC0, 0x05, 0x84, 0x42, 0x66, 0xDB, - 0x09, 0x20, 0x00, 0x05, 0x84, 0x42, 0x65, 0xDA, 0x01, 0x2A, 0x63, 0xD1, 0x01, 0x29, 0x61, 0xD1, - 0x5D, 0xE0, 0x38, 0x1B, 0x00, 0x90, 0x01, 0xD5, 0x40, 0x42, 0x00, 0x90, 0xA7, 0x42, 0x05, 0xDD, - 0x00, 0x2C, 0x00, 0xD1, 0x01, 0x24, 0x21, 0x46, 0x38, 0x46, 0x04, 0xE0, 0x00, 0x2F, 0x00, 0xD1, - 0x01, 0x27, 0x39, 0x46, 0x20, 0x46, 0xF7, 0xF7, 0xF3, 0xFA, 0xFF, 0x21, 0x01, 0x31, 0x88, 0x42, - 0x07, 0xDD, 0x04, 0x99, 0x05, 0x98, 0x88, 0x42, 0x44, 0xD0, 0x03, 0x98, 0xC8, 0x21, 0x01, 0x71, - 0x40, 0xE0, 0x0A, 0x28, 0x05, 0xDD, 0x20, 0x49, 0x1B, 0x22, 0x20, 0x39, 0x8A, 0x56, 0x02, 0x2A, - 0x38, 0xDC, 0x06, 0x99, 0x00, 0x29, 0x05, 0xD0, 0x0A, 0x28, 0x33, 0xDC, 0x01, 0x21, 0x89, 0x04, - 0x8C, 0x42, 0x2F, 0xDC, 0x32, 0x28, 0x2A, 0xDB, 0x19, 0x20, 0x00, 0x99, 0x00, 0x04, 0x81, 0x42, - 0x25, 0xDB, 0x10, 0x98, 0x85, 0x42, 0x02, 0xDD, 0x07, 0x98, 0x85, 0x42, 0x05, 0xDB, 0x10, 0x98, - 0x85, 0x42, 0x04, 0xDA, 0x07, 0x98, 0x85, 0x42, 0x01, 0xDD, 0x01, 0x20, 0x02, 0x90, 0x11, 0x98, - 0x86, 0x42, 0x02, 0xDD, 0x08, 0x98, 0x86, 0x42, 0x05, 0xDB, 0x11, 0x98, 0x86, 0x42, 0x04, 0xDA, - 0x08, 0x98, 0x86, 0x42, 0x01, 0xDD, 0x01, 0x20, 0x01, 0x90, 0x01, 0x99, 0x02, 0x98, 0x08, 0x43, - 0x08, 0xD0, 0x01, 0x20, 0x80, 0x04, 0x87, 0x42, 0x04, 0xDD, 0x84, 0x42, 0x02, 0xDD, 0x00, 0x20, - 0x0B, 0xB0, 0xF0, 0xBD, 0x01, 0x20, 0xFB, 0xE7, 0x58, 0x01, 0x00, 0x20, 0xF1, 0xB5, 0x01, 0xF0, - 0x35, 0xFC, 0x59, 0x20, 0x23, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, - 0xF9, 0xF7, 0x22, 0xFB, 0x7D, 0x24, 0xA4, 0x02, 0x05, 0xE0, 0x20, 0x46, 0xF9, 0xF7, 0x2C, 0xFB, - 0xFF, 0x34, 0xFF, 0x34, 0x02, 0x34, 0x1C, 0x49, 0x00, 0x98, 0x40, 0x18, 0xA0, 0x42, 0xF4, 0xD8, - 0x1A, 0x48, 0x00, 0x68, 0x40, 0x1C, 0x19, 0x49, 0x08, 0x60, 0x08, 0x46, 0x05, 0x68, 0x29, 0x46, - 0x7D, 0x20, 0x80, 0x02, 0xF9, 0xF7, 0x6C, 0xFB, 0x00, 0x26, 0x15, 0x48, 0x07, 0x68, 0x12, 0x4C, - 0x24, 0x1F, 0x0C, 0xE0, 0x7D, 0x88, 0x76, 0x19, 0x2D, 0x04, 0x38, 0x88, 0x86, 0x19, 0x38, 0x88, - 0x45, 0x19, 0x3F, 0x1D, 0x29, 0x46, 0x20, 0x46, 0xF9, 0xF7, 0x5A, 0xFB, 0x24, 0x1D, 0x0A, 0x49, - 0x09, 0x1F, 0x00, 0x98, 0x40, 0x18, 0xA0, 0x42, 0xEC, 0xD8, 0x31, 0x46, 0x20, 0x46, 0xF9, 0xF7, - 0x4F, 0xFB, 0xF9, 0xF7, 0xE1, 0xFA, 0x00, 0x20, 0x02, 0x49, 0x08, 0x60, 0x02, 0x20, 0x01, 0xF0, - 0x49, 0xFC, 0xF8, 0xBD, 0x00, 0x01, 0x00, 0x50, 0x08, 0xF4, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, - 0xBC, 0x01, 0x00, 0x20, 0xF8, 0xB5, 0x01, 0x20, 0xFE, 0xF7, 0x88, 0xFA, 0x59, 0x20, 0x18, 0x49, - 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xF9, 0xF7, 0xCD, 0xFA, 0x1F, 0x20, - 0x00, 0x03, 0xF9, 0xF7, 0xD9, 0xFA, 0x13, 0x4F, 0x13, 0x4D, 0x0E, 0xE0, 0x00, 0x26, 0x03, 0x24, - 0x03, 0xE0, 0x36, 0x02, 0x38, 0x5D, 0x06, 0x43, 0x64, 0x1E, 0x00, 0x2C, 0xF9, 0xDA, 0x31, 0x46, - 0x28, 0x46, 0xF9, 0xF7, 0x1D, 0xFB, 0x3F, 0x1D, 0x2D, 0x1D, 0x0B, 0x48, 0x5E, 0x30, 0x85, 0x42, - 0xEC, 0xD3, 0x0A, 0x4E, 0x31, 0x46, 0x1F, 0x20, 0x00, 0x03, 0xF9, 0xF7, 0x11, 0xFB, 0xF9, 0xF7, - 0xA3, 0xFA, 0x00, 0x20, 0x02, 0x49, 0x08, 0x60, 0x01, 0x20, 0xFE, 0xF7, 0x75, 0xFA, 0xF8, 0xBD, - 0x00, 0x01, 0x00, 0x50, 0x39, 0x04, 0x00, 0x20, 0x04, 0xF0, 0x01, 0x00, 0x21, 0x43, 0x65, 0x87, + 0x32, 0x46, 0x0D, 0x48, 0x01, 0x78, 0x28, 0x46, 0x01, 0xF0, 0x76, 0xF8, 0x14, 0x35, 0x14, 0x36, + 0x64, 0x1C, 0x0B, 0x48, 0x00, 0x78, 0x84, 0x42, 0xF0, 0xDB, 0x70, 0xBD, 0xB0, 0x01, 0x00, 0x20, + 0x18, 0xFC, 0xFF, 0xFF, 0x74, 0x01, 0x00, 0x20, 0x72, 0x01, 0x00, 0x20, 0x30, 0x01, 0x00, 0x20, + 0x2D, 0x01, 0x00, 0x20, 0x32, 0x01, 0x00, 0x20, 0x2E, 0x01, 0x00, 0x20, 0x31, 0x01, 0x00, 0x20, + 0x33, 0x01, 0x00, 0x20, 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, 0x23, 0x46, 0x02, 0xF0, 0xB0, 0xFB, + 0x05, 0x04, 0x07, 0x0C, 0x11, 0x14, 0x17, 0x00, 0x01, 0xF0, 0xAA, 0xFE, 0x10, 0xE0, 0x01, 0xF0, + 0x25, 0xFF, 0xFF, 0xF7, 0xD3, 0xFC, 0x0B, 0xE0, 0xFF, 0xF7, 0x70, 0xFC, 0x02, 0xF0, 0x78, 0xFA, + 0x06, 0xE0, 0x00, 0xF0, 0xEB, 0xFB, 0x03, 0xE0, 0xF9, 0xF7, 0x2A, 0xFB, 0x00, 0xE0, 0x00, 0xBF, + 0x00, 0xBF, 0x28, 0x46, 0x70, 0xBD, 0x00, 0x00, 0xF8, 0xB5, 0xFD, 0xF7, 0xB3, 0xFC, 0x5E, 0x4C, + 0x60, 0x79, 0x5E, 0x49, 0x80, 0x07, 0x80, 0x0F, 0x08, 0x70, 0x20, 0x7B, 0x5C, 0x4E, 0xC0, 0x06, + 0x80, 0x0F, 0x0C, 0xD1, 0xA0, 0x79, 0xF0, 0x84, 0x80, 0xB2, 0xE1, 0x79, 0x00, 0x02, 0x08, 0x18, + 0xF0, 0x84, 0x20, 0x7A, 0x30, 0x85, 0x80, 0xB2, 0x00, 0x02, 0x61, 0x7A, 0x0B, 0xE0, 0xE0, 0x79, + 0xF0, 0x84, 0x80, 0xB2, 0xA1, 0x79, 0x00, 0x02, 0x08, 0x18, 0xF0, 0x84, 0x60, 0x7A, 0x30, 0x85, + 0x80, 0xB2, 0x21, 0x7A, 0x00, 0x02, 0x08, 0x18, 0x30, 0x85, 0x4E, 0x48, 0x0A, 0x21, 0x01, 0x70, + 0xA1, 0x7A, 0x0A, 0x29, 0x03, 0xD8, 0xA1, 0x7A, 0x09, 0x07, 0x09, 0x0F, 0x01, 0x70, 0x21, 0x7B, + 0x45, 0x4D, 0xC9, 0x06, 0x60, 0x35, 0x89, 0x0F, 0x01, 0x29, 0x09, 0xD1, 0xE1, 0x79, 0xE9, 0x70, + 0xA1, 0x79, 0x29, 0x71, 0x61, 0x7A, 0x69, 0x71, 0x21, 0x7A, 0xA9, 0x71, 0x00, 0x78, 0x28, 0x73, + 0x20, 0x7B, 0x3F, 0x4A, 0x40, 0x07, 0x40, 0x0F, 0x20, 0x32, 0x11, 0x78, 0xC9, 0x08, 0xC9, 0x00, + 0x01, 0x43, 0x11, 0x70, 0x20, 0x7C, 0x3C, 0x49, 0x00, 0x07, 0x00, 0x0F, 0x08, 0x70, 0x60, 0x7C, + 0x3A, 0x49, 0x80, 0x06, 0x80, 0x0E, 0x08, 0x70, 0x60, 0x7C, 0x39, 0x49, 0x80, 0x09, 0x08, 0x70, + 0xA0, 0x7C, 0x38, 0x49, 0x08, 0x70, 0xFA, 0xF7, 0x8F, 0xFF, 0x2F, 0x48, 0x40, 0x30, 0x41, 0x78, + 0x35, 0x4A, 0x11, 0x70, 0x80, 0x78, 0x35, 0x49, 0x08, 0x70, 0x01, 0x20, 0xFF, 0xF7, 0x18, 0xF8, + 0x33, 0x4F, 0x59, 0x20, 0x38, 0x60, 0x16, 0x20, 0x38, 0x60, 0x88, 0x20, 0x38, 0x60, 0xB0, 0x7E, + 0x30, 0x49, 0x48, 0x43, 0xFA, 0xF7, 0xAE, 0xFE, 0x00, 0x20, 0x38, 0x60, 0x01, 0x20, 0xFF, 0xF7, + 0x25, 0xF8, 0x02, 0x20, 0xFA, 0xF7, 0xD2, 0xF9, 0x01, 0xF0, 0x02, 0xFD, 0xA8, 0x78, 0x00, 0x09, + 0x40, 0x00, 0x80, 0x1D, 0xF0, 0x76, 0xC0, 0xB2, 0x24, 0x28, 0x01, 0xD9, 0x24, 0x20, 0xF0, 0x76, + 0xF5, 0x7E, 0x7D, 0x20, 0xC0, 0x02, 0x68, 0x43, 0x06, 0x21, 0xF8, 0xF7, 0x57, 0xFA, 0x22, 0x49, + 0x08, 0x60, 0x19, 0x20, 0x80, 0x02, 0x68, 0x43, 0x06, 0x21, 0xF8, 0xF7, 0x4F, 0xFA, 0x1F, 0x49, + 0x08, 0x60, 0xFD, 0xF7, 0x15, 0xFD, 0x1F, 0x48, 0x1D, 0x49, 0x01, 0x60, 0x1F, 0x4A, 0x1E, 0x48, + 0x10, 0x60, 0x1F, 0x4A, 0x20, 0x4B, 0x10, 0x60, 0x1E, 0x4A, 0x70, 0x63, 0x12, 0x78, 0x1B, 0x78, + 0x5A, 0x43, 0x52, 0x08, 0x10, 0x18, 0x14, 0x30, 0xB0, 0x63, 0x1C, 0x48, 0x01, 0x60, 0xFD, 0xF7, + 0xBB, 0xFB, 0x03, 0x20, 0x30, 0x77, 0xA0, 0x7B, 0x01, 0x07, 0x05, 0x48, 0x09, 0x0F, 0x20, 0x30, + 0x41, 0x70, 0x07, 0x21, 0xC1, 0x70, 0xF8, 0xBD, 0x14, 0x04, 0x00, 0x20, 0x3D, 0x01, 0x00, 0x20, + 0x1C, 0x00, 0x00, 0x20, 0x36, 0x01, 0x00, 0x20, 0x3A, 0x01, 0x00, 0x20, 0x27, 0x01, 0x00, 0x20, + 0x46, 0x01, 0x00, 0x20, 0x3B, 0x01, 0x00, 0x20, 0x38, 0x01, 0x00, 0x20, 0x37, 0x01, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x50, 0x40, 0x42, 0x0F, 0x00, 0xA0, 0x01, 0x00, 0x20, 0xA4, 0x01, 0x00, 0x20, + 0x00, 0x07, 0x00, 0x20, 0xAC, 0x01, 0x00, 0x20, 0xD8, 0x10, 0x00, 0x20, 0xB0, 0x01, 0x00, 0x20, + 0xB4, 0x01, 0x00, 0x20, 0x34, 0x01, 0x00, 0x20, 0x35, 0x01, 0x00, 0x20, 0xA8, 0x01, 0x00, 0x20, + 0x10, 0xB5, 0x11, 0x49, 0x00, 0x28, 0x05, 0xD1, 0x0B, 0x7C, 0x08, 0x22, 0x00, 0x2B, 0x07, 0xD0, + 0x0A, 0x7C, 0x15, 0xE0, 0x08, 0x7C, 0x08, 0x22, 0x00, 0x28, 0x13, 0xD0, 0x08, 0x7C, 0x0F, 0xE0, + 0x09, 0x49, 0xA0, 0x39, 0x09, 0x18, 0xA0, 0x31, 0x0B, 0x79, 0x00, 0x2B, 0x0A, 0xD0, 0x09, 0x79, + 0xFF, 0x23, 0x01, 0x33, 0x59, 0x1A, 0x44, 0x00, 0x04, 0x4B, 0x40, 0x1C, 0x19, 0x53, 0xC0, 0xB2, + 0x90, 0x42, 0xED, 0xD3, 0x10, 0xBD, 0x00, 0x00, 0x54, 0x04, 0x00, 0x20, 0x8A, 0x06, 0x00, 0x20, + 0xFC, 0xB5, 0xBA, 0x48, 0x07, 0x68, 0x00, 0x68, 0x23, 0x21, 0x49, 0x01, 0x40, 0x18, 0x00, 0x90, + 0x00, 0xF0, 0x8E, 0xFA, 0xB6, 0x48, 0x06, 0x78, 0x00, 0x25, 0x00, 0x24, 0x4A, 0xE0, 0x00, 0x20, + 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0xB1, 0x49, + 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0xAD, 0x4A, 0x50, 0x52, + 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0xAA, 0x49, + 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0xA6, 0x4A, 0x50, 0x52, + 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, 0x0B, 0xDD, 0x60, 0x00, 0xA1, 0x49, 0x08, 0x5A, + 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x9D, 0x4A, 0x50, 0x52, + 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, + 0x99, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, + 0x95, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, + 0xB8, 0xDB, 0x64, 0x1C, 0x91, 0x48, 0x00, 0x78, 0x84, 0x42, 0xB0, 0xDB, 0x90, 0x48, 0x00, 0x78, + 0x00, 0x28, 0x50, 0xD0, 0x00, 0x24, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, + 0x38, 0x5E, 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0x86, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, + 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x83, 0x4A, 0x50, 0x52, 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, + 0x71, 0x42, 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0x7F, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, + 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x7C, 0x4A, 0x50, 0x52, 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, + 0xB0, 0x42, 0x0B, 0xDD, 0x60, 0x00, 0x77, 0x49, 0x09, 0x5A, 0x6A, 0x00, 0x00, 0x98, 0x80, 0x5A, + 0x08, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x73, 0x4A, 0x50, 0x52, 0x10, 0xE0, 0x68, 0x00, 0x00, 0x99, + 0x08, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x6F, 0x49, 0x08, 0x5A, 0x69, 0x00, + 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x6B, 0x4A, 0x50, 0x52, 0x01, 0x98, + 0x40, 0x1C, 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, 0x64, 0x1C, 0x67, 0x48, + 0x00, 0x78, 0x84, 0x42, 0xB0, 0xDB, 0x65, 0x48, 0x04, 0x78, 0x4A, 0xE0, 0x00, 0x20, 0x01, 0x90, + 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0x5D, 0x49, 0x08, 0x5A, + 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x5A, 0x4A, 0x50, 0x52, 0x0E, 0xE0, + 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0x56, 0x49, 0x08, 0x5A, + 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x53, 0x4A, 0x50, 0x52, 0x68, 0x00, + 0x00, 0x99, 0x08, 0x5E, 0xB0, 0x42, 0x0B, 0xDD, 0x60, 0x00, 0x4E, 0x49, 0x08, 0x5A, 0x69, 0x00, + 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x4A, 0x4A, 0x50, 0x52, 0x10, 0xE0, + 0x68, 0x00, 0x00, 0x99, 0x08, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, 0x46, 0x49, + 0x08, 0x5A, 0x6A, 0x00, 0x00, 0x99, 0x89, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x42, 0x4A, + 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, 0xB8, 0xDB, + 0x64, 0x1C, 0x3E, 0x48, 0x00, 0x78, 0x3F, 0x49, 0x09, 0x78, 0x40, 0x18, 0xA0, 0x42, 0xAD, 0xDC, + 0x3B, 0x48, 0x00, 0x78, 0x00, 0x28, 0x54, 0xD0, 0x38, 0x48, 0x04, 0x78, 0x4A, 0xE0, 0x00, 0x20, + 0x01, 0x90, 0x43, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0xB0, 0x42, 0x0A, 0xDD, 0x60, 0x00, 0x31, 0x49, + 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x2D, 0x4A, 0x50, 0x52, + 0x0E, 0xE0, 0x68, 0x00, 0x38, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x09, 0xDA, 0x60, 0x00, 0x2A, 0x49, + 0x08, 0x5A, 0x69, 0x00, 0x79, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, 0x26, 0x4A, 0x50, 0x52, + 0x69, 0x00, 0x00, 0x98, 0x40, 0x5E, 0xB0, 0x42, 0x0B, 0xDD, 0x60, 0x00, 0x21, 0x49, 0x09, 0x5A, + 0x6A, 0x00, 0x00, 0x98, 0x80, 0x5A, 0x08, 0x18, 0x00, 0xB2, 0x61, 0x00, 0x1D, 0x4A, 0x50, 0x52, + 0x10, 0xE0, 0x69, 0x00, 0x00, 0x98, 0x40, 0x5E, 0x71, 0x42, 0x88, 0x42, 0x0A, 0xDA, 0x60, 0x00, + 0x19, 0x49, 0x08, 0x5A, 0x69, 0x00, 0x00, 0x9A, 0x51, 0x5A, 0x40, 0x1A, 0x00, 0xB2, 0x61, 0x00, + 0x15, 0x4A, 0x50, 0x52, 0x01, 0x98, 0x40, 0x1C, 0x01, 0x90, 0x6D, 0x1C, 0x01, 0x98, 0x0A, 0x28, + 0xB8, 0xDB, 0x64, 0x1C, 0x11, 0x48, 0x00, 0x78, 0x12, 0x49, 0x09, 0x78, 0x40, 0x18, 0xA0, 0x42, + 0xAD, 0xDC, 0x00, 0x24, 0x0F, 0xE0, 0x60, 0x00, 0x0A, 0x49, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDC, + 0x60, 0x00, 0x09, 0x49, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDD, 0x0B, 0x48, 0x00, 0x78, 0x40, 0x1C, + 0x09, 0x49, 0x08, 0x70, 0x64, 0x1C, 0x20, 0x2C, 0xED, 0xDB, 0xFC, 0xBD, 0xB0, 0x01, 0x00, 0x20, + 0x38, 0x01, 0x00, 0x20, 0xC4, 0x04, 0x00, 0x20, 0x04, 0x05, 0x00, 0x20, 0x32, 0x01, 0x00, 0x20, + 0x2E, 0x01, 0x00, 0x20, 0x33, 0x01, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, 0xF7, 0xB5, 0x86, 0xB0, + 0x78, 0x4B, 0x05, 0x93, 0xDC, 0x7A, 0x00, 0x22, 0x77, 0x4B, 0xE7, 0x09, 0x1E, 0x89, 0x9D, 0x88, + 0xDC, 0x88, 0x04, 0x96, 0x1E, 0x88, 0x03, 0x95, 0x5D, 0x88, 0x74, 0x4B, 0x02, 0x94, 0x5B, 0x68, + 0x8C, 0x56, 0x01, 0x93, 0x7D, 0xD1, 0xE1, 0x03, 0x0F, 0x0C, 0x6F, 0x49, 0xB6, 0x46, 0x40, 0x39, + 0x0B, 0x8F, 0x49, 0x8F, 0x8C, 0x46, 0x08, 0x99, 0x01, 0x29, 0x0A, 0xD1, 0x04, 0x99, 0x03, 0x9D, + 0x79, 0x18, 0x8F, 0xB2, 0x68, 0x49, 0xAE, 0x46, 0x40, 0x39, 0x8B, 0x8F, 0xC9, 0x8F, 0x02, 0x9D, + 0x8C, 0x46, 0x05, 0x99, 0xC9, 0x7A, 0xC9, 0x06, 0x02, 0xD5, 0x00, 0x21, 0x8E, 0x46, 0x00, 0xE0, + 0x00, 0x25, 0x61, 0x49, 0x40, 0x39, 0x8E, 0x7A, 0x49, 0x7B, 0xE4, 0x07, 0x05, 0xD1, 0x5E, 0x49, + 0x40, 0x39, 0x4E, 0x7A, 0x09, 0x7B, 0x00, 0x23, 0x9C, 0x46, 0x08, 0x9C, 0x01, 0x2C, 0x00, 0xD1, + 0x0E, 0x46, 0x01, 0x9C, 0x79, 0x00, 0x0C, 0x19, 0x00, 0x21, 0xEB, 0x18, 0x00, 0x93, 0x10, 0xE0, + 0x0B, 0x46, 0x00, 0x9D, 0x73, 0x43, 0x5B, 0x19, 0x5B, 0x00, 0xE7, 0x5A, 0x03, 0x88, 0x52, 0x1C, + 0x5D, 0x1C, 0x05, 0x80, 0x51, 0x4D, 0x49, 0x1C, 0xED, 0x68, 0x5B, 0x00, 0x92, 0xB2, 0xC9, 0xB2, + 0xEF, 0x52, 0x4D, 0x4B, 0x40, 0x3B, 0x9D, 0x7B, 0xA9, 0x42, 0xE9, 0xD3, 0x65, 0x46, 0x75, 0x44, + 0x00, 0x21, 0xAC, 0x46, 0x0F, 0xE0, 0x0B, 0x46, 0x73, 0x43, 0x63, 0x44, 0x5B, 0x00, 0xE7, 0x5A, + 0x03, 0x88, 0x52, 0x1C, 0x5D, 0x1C, 0x05, 0x80, 0x44, 0x4D, 0x49, 0x1C, 0xED, 0x68, 0x5B, 0x00, + 0x92, 0xB2, 0xC9, 0xB2, 0xEF, 0x52, 0x40, 0x4B, 0x40, 0x3B, 0xDB, 0x7B, 0x99, 0x42, 0xEA, 0xD3, + 0x3D, 0x49, 0x40, 0x39, 0xC9, 0x79, 0xCA, 0x29, 0x01, 0xD0, 0xC9, 0x29, 0x0F, 0xD1, 0x01, 0x23, + 0xD1, 0xB2, 0x3A, 0x4D, 0x5B, 0x02, 0x08, 0xE0, 0x0B, 0xE0, 0x02, 0x88, 0x54, 0x1C, 0x04, 0x80, + 0x49, 0x1C, 0xEC, 0x68, 0x52, 0x00, 0xC9, 0xB2, 0xA3, 0x52, 0x1C, 0x29, 0xF5, 0xD3, 0x09, 0xB0, + 0xF0, 0xBD, 0x31, 0x4F, 0xB6, 0x46, 0x40, 0x3F, 0x08, 0x9E, 0x3B, 0x7A, 0xA1, 0xB2, 0x01, 0x2E, + 0x06, 0xD1, 0x04, 0x99, 0xFB, 0x7A, 0x61, 0x18, 0x03, 0x9C, 0x02, 0x9D, 0x89, 0xB2, 0xA6, 0x46, + 0x05, 0x9C, 0xE4, 0x7A, 0xE4, 0x06, 0x02, 0xD5, 0x00, 0x24, 0xA6, 0x46, 0x00, 0xE0, 0x00, 0x25, + 0x01, 0x9C, 0x49, 0x00, 0x09, 0x19, 0x8C, 0x46, 0x00, 0x21, 0x10, 0xE0, 0x0C, 0x46, 0x5C, 0x43, + 0x64, 0x19, 0x66, 0x46, 0x64, 0x00, 0x37, 0x5B, 0x04, 0x88, 0x52, 0x1C, 0x66, 0x1C, 0x06, 0x80, + 0x1E, 0x4E, 0x49, 0x1C, 0xF6, 0x68, 0x64, 0x00, 0x92, 0xB2, 0xC9, 0xB2, 0x37, 0x53, 0x1A, 0x4C, + 0x40, 0x3C, 0xA6, 0x7B, 0xB1, 0x42, 0xE9, 0xD3, 0x00, 0x21, 0x18, 0x4F, 0x0F, 0xE0, 0x0C, 0x46, + 0x5C, 0x43, 0x74, 0x44, 0x66, 0x46, 0x64, 0x00, 0x36, 0x5B, 0x04, 0x88, 0x52, 0x1C, 0x65, 0x1C, + 0x05, 0x80, 0x49, 0x1C, 0xFD, 0x68, 0x64, 0x00, 0x92, 0xB2, 0xC9, 0xB2, 0x2E, 0x53, 0x0E, 0x4C, + 0x40, 0x3C, 0xE4, 0x7B, 0xA1, 0x42, 0xEA, 0xD3, 0x0B, 0x49, 0x40, 0x39, 0xC9, 0x79, 0xCA, 0x29, + 0x01, 0xD0, 0xC9, 0x29, 0xAB, 0xD1, 0x01, 0x23, 0xD1, 0xB2, 0x5B, 0x02, 0x07, 0xE0, 0x02, 0x88, + 0x54, 0x1C, 0x04, 0x80, 0x49, 0x1C, 0xFC, 0x68, 0x52, 0x00, 0xC9, 0xB2, 0xA3, 0x52, 0x20, 0x29, + 0xF5, 0xD3, 0x9C, 0xE7, 0x14, 0x04, 0x00, 0x20, 0x64, 0x01, 0x00, 0x20, 0xA4, 0x01, 0x00, 0x20, + 0x00, 0xBF, 0x0A, 0x49, 0x89, 0x69, 0x09, 0x02, 0xC9, 0x0F, 0x01, 0x29, 0xF9, 0xD0, 0x07, 0x49, + 0x08, 0x60, 0x0A, 0x28, 0x09, 0xD1, 0x00, 0xBF, 0x04, 0x49, 0x89, 0x69, 0x09, 0x02, 0xC9, 0x0F, + 0x01, 0x29, 0xF9, 0xD0, 0x0D, 0x21, 0x01, 0x4A, 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x15, 0x40, + 0x00, 0x20, 0x07, 0xE0, 0x00, 0x21, 0x42, 0x00, 0x05, 0x4B, 0x99, 0x52, 0x42, 0x00, 0x05, 0x4B, + 0x99, 0x52, 0x40, 0x1C, 0x20, 0x28, 0xF5, 0xDB, 0x00, 0x21, 0x03, 0x4A, 0x11, 0x70, 0x70, 0x47, + 0xC4, 0x04, 0x00, 0x20, 0x04, 0x05, 0x00, 0x20, 0xCC, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0x0E, 0x4E, + 0x8C, 0x46, 0x34, 0x7C, 0x31, 0x46, 0x80, 0x31, 0xA4, 0x1C, 0x44, 0x43, 0x01, 0x25, 0xCC, 0x61, + 0x0F, 0xE0, 0x14, 0x46, 0x04, 0xE0, 0xCE, 0x69, 0x0F, 0x69, 0x36, 0x19, 0x64, 0x1C, 0xBD, 0x55, + 0x9C, 0x42, 0xF8, 0xDD, 0x04, 0x4E, 0xCC, 0x69, 0x36, 0x7C, 0xA4, 0x19, 0xA4, 0x1C, 0x40, 0x1C, + 0xCC, 0x61, 0x60, 0x45, 0xED, 0xDD, 0xF0, 0xBD, 0x24, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x24, + 0x05, 0xE0, 0x00, 0x20, 0x61, 0x00, 0x17, 0x4A, 0x12, 0x68, 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, + 0x40, 0x01, 0x84, 0x42, 0xF5, 0xDB, 0xFB, 0xF7, 0x37, 0xFD, 0xF8, 0xF7, 0x45, 0xFB, 0x00, 0x24, + 0x08, 0xE0, 0x60, 0x00, 0x10, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x61, 0x00, 0x0D, 0x4A, 0x12, 0x68, + 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, 0xF2, 0xDB, 0x64, 0x20, 0x0B, 0x49, + 0x08, 0x60, 0x01, 0x20, 0x0A, 0x49, 0x08, 0x70, 0x00, 0x20, 0x0A, 0x49, 0x08, 0x70, 0x0A, 0x49, + 0x08, 0x70, 0x0A, 0x49, 0x08, 0x80, 0x0A, 0x49, 0x08, 0x70, 0x23, 0x20, 0x80, 0x01, 0x00, 0xF0, + 0xC3, 0xFA, 0x10, 0xBD, 0xAC, 0x01, 0x00, 0x20, 0xB0, 0x01, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x20, + 0xF6, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x20, 0xF7, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, + 0xFA, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x0A, 0x48, 0xC0, 0x7A, 0x80, 0x07, 0x80, 0x0F, 0x05, 0xD0, + 0x01, 0x28, 0x08, 0xD0, 0x02, 0x28, 0x06, 0xD0, 0x03, 0x28, 0x03, 0xD1, 0x01, 0x21, 0x03, 0x20, + 0xFA, 0xF7, 0x46, 0xF9, 0x10, 0xBD, 0x01, 0x21, 0x03, 0x20, 0xF9, 0xF7, 0xC5, 0xFE, 0x10, 0xBD, + 0x14, 0x04, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0xB0, 0x00, 0x20, 0x05, 0x25, 0x05, 0x90, 0x03, 0x22, + 0x06, 0xA9, 0x06, 0x95, 0x02, 0x90, 0x03, 0x90, 0x04, 0x92, 0x00, 0x91, 0x01, 0x90, 0x01, 0x22, + 0x3C, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, 0x13, 0xFB, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, + 0x0A, 0x46, 0x01, 0x26, 0x02, 0x91, 0x03, 0x91, 0x06, 0x96, 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, + 0x32, 0x46, 0x35, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, 0x02, 0xFB, 0x00, 0x21, 0x03, 0x22, + 0x04, 0x92, 0x0A, 0x46, 0x23, 0x27, 0x02, 0x91, 0x03, 0x91, 0x06, 0x97, 0x06, 0xA9, 0x01, 0x92, + 0x00, 0x91, 0x01, 0x22, 0x2C, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, 0xF1, 0xFA, 0x00, 0x21, + 0x03, 0x22, 0x04, 0x92, 0x0A, 0x46, 0x45, 0x24, 0x02, 0x91, 0x03, 0x91, 0x06, 0x94, 0x06, 0xA9, + 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x24, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, 0xE0, 0xFA, + 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x0A, 0x46, 0x67, 0x20, 0x02, 0x91, 0x03, 0x91, 0x06, 0x90, + 0x06, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x1B, 0x49, 0xA0, 0x20, 0x05, 0xAB, 0xFC, 0xF7, + 0xCF, 0xFA, 0x05, 0xAA, 0x00, 0x92, 0x06, 0x95, 0x01, 0x22, 0x16, 0x49, 0xA0, 0x20, 0x06, 0xAB, + 0xFC, 0xF7, 0x9A, 0xFD, 0x05, 0xAA, 0x00, 0x92, 0x06, 0x96, 0x01, 0x22, 0x12, 0x49, 0xA0, 0x20, + 0x06, 0xAB, 0xFC, 0xF7, 0x91, 0xFD, 0x05, 0xAA, 0x00, 0x92, 0x06, 0x97, 0x01, 0x22, 0x0E, 0x49, + 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x88, 0xFD, 0x05, 0xAA, 0x00, 0x92, 0x06, 0x94, 0x01, 0x22, + 0x09, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x7F, 0xFD, 0x67, 0x20, 0x05, 0xAA, 0x00, 0x92, + 0x06, 0x90, 0x01, 0x22, 0x04, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFC, 0xF7, 0x75, 0xFD, 0x07, 0xB0, + 0xF0, 0xBD, 0x00, 0x00, 0x03, 0x13, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0xF8, 0xB5, 0x7D, 0x20, + 0x70, 0x4C, 0xC0, 0x00, 0xE0, 0x81, 0x40, 0x42, 0x20, 0x82, 0x6F, 0x49, 0x00, 0x20, 0x08, 0x60, + 0x6E, 0x49, 0x08, 0x60, 0x6E, 0x49, 0x08, 0x70, 0x6E, 0x49, 0x08, 0x70, 0x6E, 0x48, 0x00, 0x90, + 0xC1, 0x7A, 0x20, 0x46, 0x40, 0x38, 0x8B, 0x06, 0x05, 0x7C, 0x01, 0x7A, 0x7F, 0xD5, 0x00, 0x26, + 0x4D, 0x43, 0x37, 0x46, 0x15, 0xE0, 0x63, 0x48, 0x6A, 0x00, 0x40, 0x30, 0x40, 0x68, 0x61, 0x49, + 0x12, 0x18, 0x73, 0x00, 0x18, 0x18, 0x40, 0x39, 0x0B, 0x7B, 0x49, 0x7A, 0x00, 0xF0, 0x44, 0xFB, + 0x5C, 0x48, 0x40, 0x38, 0x40, 0x7A, 0x36, 0x18, 0x5A, 0x48, 0x40, 0x38, 0x00, 0x7B, 0x2D, 0x18, + 0x7F, 0x1C, 0x58, 0x49, 0x40, 0x39, 0x88, 0x7B, 0x87, 0x42, 0xE4, 0xDB, 0x08, 0x46, 0x80, 0x7A, + 0x00, 0x28, 0x1C, 0xD0, 0x00, 0x27, 0x15, 0xE0, 0x52, 0x48, 0x6A, 0x00, 0x40, 0x30, 0x40, 0x68, + 0x50, 0x49, 0x12, 0x18, 0x73, 0x00, 0x18, 0x18, 0x40, 0x39, 0x4B, 0x7B, 0x89, 0x7A, 0x00, 0xF0, + 0x23, 0xFB, 0x4C, 0x48, 0x40, 0x38, 0x80, 0x7A, 0x36, 0x18, 0x4A, 0x48, 0x40, 0x38, 0x40, 0x7B, + 0x2D, 0x18, 0x7F, 0x1C, 0x47, 0x49, 0x40, 0x39, 0x88, 0x7B, 0x87, 0x42, 0xE4, 0xDB, 0x00, 0x27, + 0x15, 0xE0, 0x44, 0x48, 0x6A, 0x00, 0x40, 0x30, 0x40, 0x68, 0x42, 0x49, 0x12, 0x18, 0x73, 0x00, + 0x18, 0x18, 0x40, 0x39, 0x0B, 0x7B, 0x49, 0x7A, 0x00, 0xF0, 0x06, 0xFB, 0x3D, 0x48, 0x40, 0x38, + 0x40, 0x7A, 0x36, 0x18, 0x3B, 0x48, 0x40, 0x38, 0x00, 0x7B, 0x2D, 0x18, 0x7F, 0x1C, 0x39, 0x49, + 0x40, 0x39, 0xC8, 0x7B, 0x87, 0x42, 0xE4, 0xDB, 0x08, 0x46, 0x81, 0x7A, 0x00, 0x29, 0x47, 0xD0, + 0x00, 0x27, 0x15, 0xE0, 0x33, 0x48, 0x6A, 0x00, 0x40, 0x30, 0x40, 0x68, 0x31, 0x49, 0x12, 0x18, + 0x73, 0x00, 0x18, 0x18, 0x40, 0x39, 0x4B, 0x7B, 0x89, 0x7A, 0x00, 0xF0, 0xE5, 0xFA, 0x2D, 0x48, + 0x40, 0x38, 0x80, 0x7A, 0x36, 0x18, 0x2B, 0x48, 0x40, 0x38, 0x40, 0x7B, 0x2D, 0x18, 0x7F, 0x1C, + 0x28, 0x49, 0x40, 0x39, 0xC8, 0x7B, 0x87, 0x42, 0xE4, 0xDB, 0x29, 0xE0, 0xFF, 0xE7, 0xC2, 0x7A, + 0x00, 0x20, 0x8F, 0x18, 0x23, 0x49, 0x6F, 0x43, 0x40, 0x39, 0x0A, 0x7D, 0x80, 0x31, 0x4B, 0x68, + 0x1C, 0xE0, 0x45, 0x00, 0x10, 0x26, 0x59, 0x5F, 0xA6, 0x5F, 0xB1, 0x42, 0x01, 0xDD, 0x21, 0x82, + 0x04, 0xE0, 0x0E, 0x26, 0xA6, 0x5F, 0xB1, 0x42, 0x00, 0xDA, 0xE1, 0x81, 0x59, 0x5F, 0x91, 0x42, + 0x04, 0xDD, 0x19, 0x4E, 0x35, 0x68, 0x49, 0x19, 0x31, 0x60, 0x06, 0xE0, 0x55, 0x42, 0xA9, 0x42, + 0x03, 0xDA, 0x16, 0x4D, 0x2E, 0x68, 0x71, 0x1A, 0x29, 0x60, 0x40, 0x1C, 0xB8, 0x42, 0xE0, 0xDB, + 0x00, 0x98, 0x00, 0x7C, 0x00, 0x09, 0x1A, 0xD0, 0x0E, 0x48, 0x20, 0x30, 0x01, 0x8B, 0xC2, 0x8A, + 0x89, 0x1A, 0x09, 0xB2, 0x11, 0x4A, 0x41, 0x83, 0x91, 0x42, 0x02, 0xDC, 0xD2, 0x43, 0x91, 0x42, + 0x00, 0xDA, 0x42, 0x83, 0x1A, 0x21, 0x41, 0x5E, 0x10, 0x20, 0x20, 0x5E, 0x81, 0x42, 0x01, 0xDD, + 0x21, 0x82, 0x04, 0xE0, 0x0E, 0x20, 0x20, 0x5E, 0x81, 0x42, 0x00, 0xDA, 0xE1, 0x81, 0x00, 0x20, + 0xF8, 0xBD, 0x00, 0x00, 0x64, 0x01, 0x00, 0x20, 0xD0, 0x00, 0x00, 0x20, 0xD4, 0x00, 0x00, 0x20, + 0xF0, 0x00, 0x00, 0x20, 0xF1, 0x00, 0x00, 0x20, 0x14, 0x04, 0x00, 0x20, 0xFF, 0x01, 0x00, 0x00, + 0xF8, 0xB5, 0x3D, 0x48, 0x32, 0x21, 0x2E, 0x22, 0x41, 0x5E, 0x82, 0x5E, 0x40, 0x30, 0x00, 0x90, + 0x40, 0x89, 0x89, 0x1A, 0x81, 0x42, 0x09, 0xD1, 0x37, 0x48, 0x34, 0x21, 0x30, 0x22, 0x41, 0x5E, + 0x82, 0x5E, 0x00, 0x98, 0x89, 0x1A, 0x80, 0x89, 0x81, 0x42, 0x63, 0xD0, 0x00, 0x24, 0x32, 0x48, + 0x80, 0x30, 0x80, 0x6A, 0x01, 0x5D, 0x86, 0x46, 0x00, 0x29, 0x57, 0xD0, 0x2E, 0x48, 0x34, 0x27, + 0x30, 0x22, 0xC7, 0x5F, 0x82, 0x5E, 0x00, 0x98, 0x83, 0x89, 0xB8, 0x1A, 0x84, 0x46, 0x98, 0x42, + 0x1F, 0xDA, 0x29, 0x48, 0x65, 0x00, 0x80, 0x30, 0x46, 0x6A, 0x39, 0x46, 0x70, 0x5F, 0xC8, 0x31, + 0x88, 0x42, 0x03, 0xDA, 0x11, 0x46, 0xC8, 0x39, 0x88, 0x42, 0x03, 0xDA, 0x00, 0x20, 0x71, 0x46, + 0x08, 0x55, 0x0E, 0xE0, 0xB8, 0x42, 0x02, 0xDB, 0x5B, 0x1E, 0x73, 0x53, 0x09, 0xE0, 0x90, 0x42, + 0x01, 0xDC, 0x00, 0x20, 0x04, 0xE0, 0x80, 0x1A, 0x58, 0x43, 0x61, 0x46, 0xF7, 0xF7, 0xF0, 0xFC, + 0x70, 0x53, 0x19, 0x48, 0x32, 0x27, 0x2E, 0x22, 0xC7, 0x5F, 0x82, 0x5E, 0x00, 0x98, 0x43, 0x89, + 0xB8, 0x1A, 0x84, 0x46, 0x98, 0x42, 0x21, 0xDA, 0x13, 0x48, 0x65, 0x00, 0x80, 0x30, 0x06, 0x6A, + 0x11, 0x46, 0x70, 0x5F, 0xC8, 0x39, 0x88, 0x42, 0x03, 0xDB, 0x39, 0x46, 0xC8, 0x31, 0x88, 0x42, + 0x05, 0xDB, 0x0D, 0x49, 0x00, 0x20, 0x80, 0x31, 0x89, 0x6A, 0x08, 0x55, 0x0E, 0xE0, 0xB8, 0x42, + 0x02, 0xDB, 0x5B, 0x1E, 0x73, 0x53, 0x09, 0xE0, 0x90, 0x42, 0x01, 0xDC, 0x00, 0x20, 0x04, 0xE0, + 0x80, 0x1A, 0x58, 0x43, 0x61, 0x46, 0xF7, 0xF7, 0xC3, 0xFC, 0x70, 0x53, 0x64, 0x1C, 0xE4, 0xB2, + 0x0A, 0x2C, 0x9C, 0xD3, 0xF8, 0xBD, 0x00, 0x00, 0x24, 0x01, 0x00, 0x20, 0xFF, 0xB5, 0x87, 0xB0, + 0x00, 0x20, 0x02, 0x90, 0x01, 0x90, 0x10, 0x98, 0x11, 0x99, 0x10, 0x1A, 0x15, 0x46, 0x5A, 0x1A, + 0x40, 0x43, 0x52, 0x43, 0x87, 0x18, 0x08, 0x98, 0x07, 0x99, 0xC2, 0x1A, 0x49, 0x1B, 0x49, 0x43, + 0x52, 0x43, 0x8C, 0x18, 0x1E, 0x46, 0x43, 0x4A, 0x03, 0x92, 0x42, 0x4B, 0x10, 0x98, 0x11, 0x79, + 0x12, 0x78, 0x20, 0x3B, 0x06, 0x91, 0x19, 0x7E, 0x05, 0x92, 0x04, 0x91, 0x85, 0x42, 0x16, 0xD1, + 0x11, 0x98, 0x86, 0x42, 0x13, 0xD1, 0x06, 0x98, 0x00, 0x28, 0x03, 0xD0, 0x01, 0x20, 0x80, 0x04, + 0x84, 0x42, 0x6D, 0xDC, 0x01, 0x20, 0xC0, 0x05, 0x84, 0x42, 0x66, 0xDB, 0x09, 0x20, 0x00, 0x05, + 0x84, 0x42, 0x65, 0xDA, 0x01, 0x2A, 0x63, 0xD1, 0x01, 0x29, 0x61, 0xD1, 0x5D, 0xE0, 0x38, 0x1B, + 0x00, 0x90, 0x01, 0xD5, 0x40, 0x42, 0x00, 0x90, 0xA7, 0x42, 0x05, 0xDD, 0x00, 0x2C, 0x00, 0xD1, + 0x01, 0x24, 0x21, 0x46, 0x38, 0x46, 0x04, 0xE0, 0x00, 0x2F, 0x00, 0xD1, 0x01, 0x27, 0x39, 0x46, + 0x20, 0x46, 0xF7, 0xF7, 0x6D, 0xFC, 0xFF, 0x21, 0x01, 0x31, 0x88, 0x42, 0x07, 0xDD, 0x04, 0x99, + 0x05, 0x98, 0x88, 0x42, 0x44, 0xD0, 0x03, 0x98, 0xC8, 0x21, 0x01, 0x71, 0x40, 0xE0, 0x0A, 0x28, + 0x05, 0xDD, 0x20, 0x49, 0x1B, 0x22, 0x20, 0x39, 0x8A, 0x56, 0x02, 0x2A, 0x38, 0xDC, 0x06, 0x99, + 0x00, 0x29, 0x05, 0xD0, 0x0A, 0x28, 0x33, 0xDC, 0x01, 0x21, 0x89, 0x04, 0x8C, 0x42, 0x2F, 0xDC, + 0x32, 0x28, 0x2A, 0xDB, 0x19, 0x20, 0x00, 0x99, 0x00, 0x04, 0x81, 0x42, 0x25, 0xDB, 0x10, 0x98, + 0x85, 0x42, 0x02, 0xDD, 0x07, 0x98, 0x85, 0x42, 0x05, 0xDB, 0x10, 0x98, 0x85, 0x42, 0x04, 0xDA, + 0x07, 0x98, 0x85, 0x42, 0x01, 0xDD, 0x01, 0x20, 0x02, 0x90, 0x11, 0x98, 0x86, 0x42, 0x02, 0xDD, + 0x08, 0x98, 0x86, 0x42, 0x05, 0xDB, 0x11, 0x98, 0x86, 0x42, 0x04, 0xDA, 0x08, 0x98, 0x86, 0x42, + 0x01, 0xDD, 0x01, 0x20, 0x01, 0x90, 0x01, 0x99, 0x02, 0x98, 0x08, 0x43, 0x08, 0xD0, 0x01, 0x20, + 0x80, 0x04, 0x87, 0x42, 0x04, 0xDD, 0x84, 0x42, 0x02, 0xDD, 0x00, 0x20, 0x0B, 0xB0, 0xF0, 0xBD, + 0x01, 0x20, 0xFB, 0xE7, 0x44, 0x01, 0x00, 0x20, 0xF1, 0xB5, 0x01, 0xF0, 0xF5, 0xFB, 0x59, 0x20, + 0x23, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0xF9, 0xF7, 0x8E, 0xFB, + 0x7D, 0x24, 0xA4, 0x02, 0x05, 0xE0, 0x20, 0x46, 0xF9, 0xF7, 0x98, 0xFB, 0xFF, 0x34, 0xFF, 0x34, + 0x02, 0x34, 0x1C, 0x49, 0x00, 0x98, 0x40, 0x18, 0xA0, 0x42, 0xF4, 0xD8, 0x1A, 0x48, 0x00, 0x68, + 0x40, 0x1C, 0x19, 0x49, 0x08, 0x60, 0x08, 0x46, 0x05, 0x68, 0x29, 0x46, 0x7D, 0x20, 0x80, 0x02, + 0xF9, 0xF7, 0xD8, 0xFB, 0x00, 0x26, 0x15, 0x48, 0x07, 0x68, 0x12, 0x4C, 0x24, 0x1F, 0x0C, 0xE0, + 0x7D, 0x88, 0x76, 0x19, 0x2D, 0x04, 0x38, 0x88, 0x86, 0x19, 0x38, 0x88, 0x45, 0x19, 0x3F, 0x1D, + 0x29, 0x46, 0x20, 0x46, 0xF9, 0xF7, 0xC6, 0xFB, 0x24, 0x1D, 0x0A, 0x49, 0x09, 0x1F, 0x00, 0x98, + 0x40, 0x18, 0xA0, 0x42, 0xEC, 0xD8, 0x31, 0x46, 0x20, 0x46, 0xF9, 0xF7, 0xBB, 0xFB, 0xF9, 0xF7, + 0x4D, 0xFB, 0x00, 0x20, 0x02, 0x49, 0x08, 0x60, 0x02, 0x20, 0x01, 0xF0, 0xEF, 0xFB, 0xF8, 0xBD, + 0x00, 0x01, 0x00, 0x50, 0x08, 0xF4, 0x01, 0x00, 0xFC, 0x00, 0x00, 0x20, 0xAC, 0x01, 0x00, 0x20, + 0xF8, 0xB5, 0x01, 0x20, 0xFE, 0xF7, 0x54, 0xF9, 0x15, 0x4E, 0x59, 0x20, 0x30, 0x60, 0x16, 0x20, + 0x30, 0x60, 0x88, 0x20, 0x30, 0x60, 0xF9, 0xF7, 0x39, 0xFB, 0x1F, 0x20, 0x00, 0x03, 0xF9, 0xF7, + 0x45, 0xFB, 0x11, 0x4F, 0x0F, 0x4C, 0x10, 0x4D, 0x5E, 0x37, 0x00, 0x21, 0x03, 0x20, 0x0A, 0x02, + 0x21, 0x5C, 0x11, 0x43, 0x40, 0x1E, 0xFA, 0xD5, 0x28, 0x46, 0xF9, 0xF7, 0x8B, 0xFB, 0x24, 0x1D, + 0x2D, 0x1D, 0xBD, 0x42, 0xF1, 0xD3, 0x1F, 0x20, 0x08, 0x49, 0x00, 0x03, 0xF9, 0xF7, 0x82, 0xFB, + 0xF9, 0xF7, 0x14, 0xFB, 0x00, 0x20, 0x30, 0x60, 0x01, 0x20, 0xFE, 0xF7, 0x47, 0xF9, 0xF8, 0xBD, + 0x00, 0x01, 0x00, 0x50, 0x19, 0x04, 0x00, 0x20, 0x04, 0xF0, 0x01, 0x00, 0x21, 0x43, 0x65, 0x87, 0xF8, 0xB5, 0x00, 0x20, 0x5E, 0x49, 0x08, 0x70, 0x5E, 0x48, 0x00, 0x68, 0x00, 0x28, 0x12, 0xDC, 0x00, 0x24, 0x08, 0xE0, 0x60, 0x00, 0x5C, 0x49, 0x09, 0x68, 0x09, 0x5A, 0x60, 0x00, 0x5B, 0x4A, 0x12, 0x68, 0x11, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, 0xF2, 0xDB, 0x00, 0x20, @@ -2295,7 +2247,7 @@ 0x0A, 0x2E, 0x0C, 0xDA, 0x0A, 0x26, 0x0A, 0xE0, 0x60, 0x00, 0x3F, 0x49, 0x09, 0x68, 0x08, 0x5E, 0x00, 0x28, 0x04, 0xDA, 0x09, 0x20, 0xC0, 0x43, 0x86, 0x42, 0x00, 0xDD, 0x06, 0x46, 0x60, 0x00, 0x3A, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x80, 0x19, 0x00, 0xB2, 0x61, 0x00, 0x37, 0x4A, 0x12, 0x68, - 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, 0xD5, 0xDB, 0xFE, 0xF7, 0x64, 0xFF, + 0x50, 0x52, 0x64, 0x1C, 0x23, 0x20, 0x40, 0x01, 0x84, 0x42, 0xD5, 0xDB, 0xFE, 0xF7, 0xAC, 0xFF, 0x34, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x0D, 0xDD, 0x01, 0x46, 0x00, 0x20, 0x08, 0x5E, 0x28, 0x41, 0x06, 0x46, 0x0A, 0x2E, 0x00, 0xDA, 0x0A, 0x26, 0x2E, 0x48, 0x00, 0x88, 0x80, 0x1B, 0x00, 0xB2, 0x2C, 0x49, 0x08, 0x80, 0x2C, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x0F, 0xDA, @@ -2307,795 +2259,768 @@ 0x18, 0xDA, 0x13, 0x48, 0x00, 0x78, 0x03, 0x28, 0x05, 0xDA, 0x11, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x0F, 0x49, 0x08, 0x70, 0x0E, 0xE0, 0x01, 0x20, 0x11, 0x49, 0x08, 0x70, 0x00, 0x20, 0x11, 0x49, 0x08, 0x80, 0x0B, 0x49, 0x08, 0x70, 0x07, 0x48, 0x00, 0x68, 0x64, 0x28, 0x02, 0xDA, 0x64, 0x20, - 0x04, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x23, 0x20, 0x80, 0x01, 0xFF, 0xF7, 0xAF, 0xFE, 0xF8, 0xBD, - 0xEF, 0x00, 0x00, 0x20, 0x10, 0x01, 0x00, 0x20, 0xC0, 0x01, 0x00, 0x20, 0xBC, 0x01, 0x00, 0x20, - 0x0E, 0x01, 0x00, 0x20, 0x88, 0x01, 0x00, 0x20, 0x86, 0x01, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, - 0x0A, 0x01, 0x00, 0x20, 0x0C, 0x01, 0x00, 0x20, 0xFF, 0xB5, 0x91, 0xB0, 0x00, 0x20, 0x11, 0x99, - 0x12, 0x9A, 0x08, 0x5E, 0x52, 0x1E, 0x07, 0x90, 0x06, 0x90, 0x0E, 0xD0, 0x11, 0x9B, 0x51, 0x00, - 0x59, 0x5E, 0x07, 0x9B, 0x40, 0x18, 0x99, 0x42, 0x01, 0xDD, 0x07, 0x91, 0x03, 0xE0, 0x06, 0x9B, + 0x04, 0x49, 0x08, 0x60, 0x00, 0xBF, 0x23, 0x20, 0x80, 0x01, 0xFF, 0xF7, 0xB5, 0xFE, 0xF8, 0xBD, + 0xDB, 0x00, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x20, 0xB0, 0x01, 0x00, 0x20, 0xAC, 0x01, 0x00, 0x20, + 0xFA, 0x00, 0x00, 0x20, 0x74, 0x01, 0x00, 0x20, 0x72, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, + 0xF6, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, 0xFF, 0xB5, 0x91, 0xB0, 0x00, 0x20, 0x11, 0x99, + 0x12, 0x9A, 0x08, 0x5E, 0x52, 0x1E, 0x07, 0x90, 0x06, 0x90, 0x0E, 0xD0, 0x11, 0x99, 0x53, 0x00, + 0xC9, 0x5E, 0x07, 0x9B, 0x40, 0x18, 0x99, 0x42, 0x01, 0xDD, 0x07, 0x91, 0x03, 0xE0, 0x06, 0x9B, 0x99, 0x42, 0x00, 0xDA, 0x06, 0x91, 0x52, 0x1E, 0xF0, 0xD1, 0x00, 0x27, 0x13, 0x99, 0x14, 0x9D, - 0xCF, 0x5F, 0x6D, 0x1E, 0x05, 0x97, 0x03, 0x97, 0x0F, 0xD0, 0x13, 0x9A, 0x69, 0x00, 0x56, 0x5E, + 0xCF, 0x5F, 0x6D, 0x1E, 0x05, 0x97, 0x03, 0x97, 0x0F, 0xD0, 0x13, 0x99, 0x6A, 0x00, 0x8E, 0x5E, 0x03, 0x99, 0x89, 0x19, 0x03, 0x91, 0x05, 0x99, 0x8E, 0x42, 0x01, 0xDD, 0x05, 0x96, 0x02, 0xE0, 0xBE, 0x42, 0x00, 0xDA, 0x37, 0x46, 0x6D, 0x1E, 0xEF, 0xD1, 0x06, 0x9A, 0x07, 0x99, 0x89, 0x1A, - 0xF8, 0x4A, 0x16, 0x7D, 0x14, 0x46, 0x40, 0x34, 0xB1, 0x42, 0x5B, 0xDA, 0x05, 0x99, 0xC9, 0x1B, - 0xB1, 0x42, 0x57, 0xDA, 0x12, 0x99, 0xF7, 0xF7, 0xFB, 0xF8, 0x06, 0x9A, 0x07, 0x99, 0x89, 0x18, - 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, 0x81, 0x42, 0x04, 0xDD, 0x06, 0x99, 0x40, 0x18, 0xC1, 0x0F, - 0x08, 0x18, 0x40, 0x10, 0x12, 0x9A, 0x10, 0xE0, 0x11, 0x99, 0x53, 0x00, 0xC9, 0x5E, 0x10, 0x25, + 0xFB, 0x4A, 0x16, 0x7D, 0x14, 0x46, 0x40, 0x34, 0xB1, 0x42, 0x59, 0xDA, 0x05, 0x99, 0xC9, 0x1B, + 0xB1, 0x42, 0x55, 0xDA, 0x12, 0x99, 0xF7, 0xF7, 0x7B, 0xFA, 0xB1, 0x08, 0x88, 0x42, 0x01, 0xDD, + 0xF4, 0x4A, 0x03, 0xE0, 0x49, 0x42, 0x88, 0x42, 0x03, 0xDA, 0xF3, 0x4A, 0x11, 0x78, 0x49, 0x1C, + 0x11, 0x70, 0x06, 0x9A, 0x07, 0x99, 0x89, 0x18, 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, 0x81, 0x42, + 0x04, 0xDD, 0x06, 0x99, 0x40, 0x18, 0xC1, 0x0F, 0x08, 0x18, 0x40, 0x10, 0x12, 0x9A, 0x10, 0xE0, + 0x11, 0x99, 0x53, 0x00, 0xC9, 0x5E, 0x10, 0x25, 0x65, 0x5F, 0x09, 0x1A, 0xA9, 0x42, 0x01, 0xDD, + 0x21, 0x82, 0x04, 0xE0, 0x0E, 0x25, 0x65, 0x5F, 0xA9, 0x42, 0x00, 0xDA, 0xE1, 0x81, 0x11, 0x9D, + 0xE9, 0x52, 0x52, 0x1E, 0xEC, 0xD5, 0x14, 0x99, 0x03, 0x98, 0xF7, 0xF7, 0x49, 0xFA, 0x05, 0x99, + 0xC9, 0x19, 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, 0x81, 0x42, 0x03, 0xDD, 0xC0, 0x19, 0xC1, 0x0F, + 0x08, 0x18, 0x40, 0x10, 0x14, 0x9A, 0x10, 0xE0, 0x13, 0x99, 0x53, 0x00, 0xC9, 0x5E, 0x10, 0x25, 0x65, 0x5F, 0x09, 0x1A, 0xA9, 0x42, 0x01, 0xDD, 0x21, 0x82, 0x04, 0xE0, 0x0E, 0x25, 0x65, 0x5F, - 0xA9, 0x42, 0x00, 0xDA, 0xE1, 0x81, 0x11, 0x9D, 0xE9, 0x52, 0x52, 0x1E, 0xEC, 0xD5, 0x14, 0x99, - 0x03, 0x98, 0xF7, 0xF7, 0xD5, 0xF8, 0x05, 0x99, 0xC9, 0x19, 0xCA, 0x0F, 0x51, 0x18, 0x49, 0x10, - 0x81, 0x42, 0x03, 0xDD, 0xC0, 0x19, 0xC1, 0x0F, 0x08, 0x18, 0x40, 0x10, 0x14, 0x9A, 0x10, 0xE0, - 0x13, 0x99, 0x53, 0x00, 0xC9, 0x5E, 0x10, 0x25, 0x65, 0x5F, 0x09, 0x1A, 0xA9, 0x42, 0x01, 0xDD, - 0x21, 0x82, 0x04, 0xE0, 0x0E, 0x25, 0x65, 0x5F, 0xA9, 0x42, 0x00, 0xDA, 0xE1, 0x81, 0x13, 0x9D, - 0xE9, 0x52, 0x52, 0x1E, 0xEC, 0xD5, 0xCF, 0x49, 0x09, 0x7D, 0x49, 0x08, 0x88, 0x42, 0x01, 0xDD, - 0xCD, 0x48, 0x03, 0xE0, 0x49, 0x42, 0x88, 0x42, 0x03, 0xDA, 0xCC, 0x48, 0x01, 0x78, 0x49, 0x1C, - 0x01, 0x70, 0x98, 0xE2, 0x06, 0x98, 0xB8, 0x42, 0x00, 0xDB, 0x38, 0x46, 0x05, 0x9A, 0x07, 0x99, - 0x91, 0x42, 0x00, 0xDC, 0x11, 0x46, 0x08, 0x1A, 0x03, 0x21, 0xF7, 0xF7, 0x99, 0xF8, 0xC1, 0x49, - 0x03, 0x90, 0xC9, 0x7C, 0x88, 0x42, 0x01, 0xDD, 0x03, 0x91, 0x04, 0xE0, 0x03, 0x99, 0x70, 0x08, - 0x88, 0x42, 0x00, 0xDD, 0x03, 0x90, 0xBE, 0x48, 0x10, 0x90, 0xC1, 0x7A, 0x12, 0x9A, 0x14, 0x98, - 0x10, 0x18, 0xB8, 0x4A, 0x0F, 0x90, 0x80, 0x32, 0x48, 0x07, 0x0E, 0xD5, 0x0F, 0x98, 0x40, 0x1E, - 0x07, 0xE0, 0x11, 0x99, 0x6B, 0x00, 0xC9, 0x5E, 0x83, 0x00, 0x56, 0x6C, 0x40, 0x1E, 0x6D, 0x1C, - 0xF1, 0x50, 0x12, 0x99, 0x8D, 0x42, 0xF4, 0xDB, 0x0C, 0xE0, 0x14, 0x98, 0x07, 0xE0, 0x11, 0x99, - 0x6B, 0x00, 0xC9, 0x5E, 0x83, 0x00, 0x56, 0x6C, 0x40, 0x1C, 0x6D, 0x1C, 0xF1, 0x50, 0x12, 0x99, - 0x8D, 0x42, 0xF4, 0xDB, 0x10, 0x98, 0xC0, 0x7A, 0x00, 0x07, 0x0F, 0xD5, 0x14, 0x99, 0x49, 0x1E, - 0x00, 0x20, 0x07, 0xE0, 0x13, 0x9D, 0x43, 0x00, 0xEB, 0x5E, 0x8D, 0x00, 0x56, 0x6C, 0x49, 0x1E, - 0x40, 0x1C, 0x73, 0x51, 0x14, 0x9B, 0x98, 0x42, 0xF4, 0xDB, 0x0D, 0xE0, 0x00, 0x21, 0x08, 0x46, - 0x07, 0xE0, 0x13, 0x9B, 0x45, 0x00, 0x5B, 0x5F, 0x8D, 0x00, 0x56, 0x6C, 0x49, 0x1C, 0x40, 0x1C, - 0x73, 0x51, 0x14, 0x9B, 0x98, 0x42, 0xF4, 0xDB, 0x0F, 0x98, 0x08, 0x90, 0x00, 0x20, 0x02, 0x90, - 0x01, 0x20, 0x53, 0x6C, 0x01, 0x90, 0x00, 0x21, 0x18, 0x68, 0x05, 0x91, 0x04, 0x91, 0x5B, 0x68, - 0x95, 0x6C, 0xC3, 0x1A, 0x01, 0x26, 0x2B, 0x60, 0x01, 0x46, 0x32, 0x46, 0x09, 0x96, 0x94, 0xE0, - 0x8C, 0x4F, 0x92, 0x00, 0x80, 0x37, 0x0E, 0x92, 0x7B, 0x6C, 0xBD, 0x6C, 0xD6, 0x18, 0x40, 0x3E, - 0x9B, 0x58, 0xF6, 0x6B, 0x9B, 0x1B, 0xAB, 0x50, 0x00, 0xD5, 0x5B, 0x42, 0x03, 0x9A, 0x93, 0x42, - 0x72, 0xD9, 0x00, 0x23, 0x48, 0xE0, 0x83, 0x4D, 0x03, 0x9F, 0x80, 0x35, 0x2D, 0x6D, 0x9A, 0x00, - 0xFE, 0x0F, 0x0D, 0x95, 0xF6, 0x19, 0xAD, 0x58, 0x76, 0x10, 0x0C, 0x95, 0xAD, 0x1B, 0x2F, 0x46, - 0x8D, 0x42, 0x06, 0xDC, 0x7B, 0x4D, 0x80, 0x35, 0xED, 0x6C, 0xAD, 0x58, 0xAD, 0x19, 0x8D, 0x42, - 0x19, 0xDA, 0x87, 0x42, 0x06, 0xDC, 0x77, 0x4D, 0x80, 0x35, 0xED, 0x6C, 0xAD, 0x58, 0xAD, 0x19, - 0x85, 0x42, 0x10, 0xDA, 0x8F, 0x1B, 0x0C, 0x9D, 0xBC, 0x46, 0xBD, 0x42, 0x02, 0xDB, 0x37, 0x18, - 0xBD, 0x42, 0x08, 0xDD, 0x6F, 0x4D, 0x80, 0x35, 0xED, 0x6C, 0xAD, 0x58, 0x65, 0x45, 0x1A, 0xDB, - 0x36, 0x18, 0xB5, 0x42, 0x17, 0xDC, 0x6B, 0x4D, 0x9E, 0x00, 0x80, 0x35, 0x2D, 0x6D, 0xAD, 0x59, - 0x8D, 0x42, 0x01, 0xDD, 0x0D, 0x9D, 0xA9, 0x50, 0x66, 0x4D, 0x80, 0x35, 0xED, 0x6C, 0xAE, 0x58, - 0x86, 0x42, 0x00, 0xDA, 0xA8, 0x50, 0x63, 0x4D, 0x01, 0x9E, 0x80, 0x35, 0x6D, 0x6D, 0xAF, 0x58, - 0xBE, 0x19, 0xAE, 0x50, 0x03, 0xE0, 0x5B, 0x1C, 0x02, 0x9A, 0x93, 0x42, 0xB3, 0xDB, 0x02, 0x9A, - 0x93, 0x42, 0x0F, 0xD1, 0x5B, 0x4E, 0x02, 0x46, 0x02, 0x98, 0x80, 0x36, 0xF5, 0x6C, 0x80, 0x00, - 0x01, 0x9F, 0x2A, 0x50, 0x02, 0x9D, 0x32, 0x6D, 0x6D, 0x1C, 0x11, 0x50, 0x71, 0x6D, 0x2D, 0xB2, - 0x0F, 0x50, 0x02, 0x95, 0x53, 0x4D, 0x01, 0x20, 0x01, 0x90, 0x80, 0x35, 0x69, 0x6C, 0x6D, 0x6D, - 0x0E, 0x98, 0x9A, 0x00, 0xAA, 0x58, 0x08, 0x58, 0x04, 0x9D, 0x01, 0x46, 0xAA, 0x42, 0x11, 0xDD, - 0x05, 0x93, 0x04, 0x92, 0x0E, 0xE0, 0xFF, 0xE7, 0x01, 0x9A, 0x52, 0x1C, 0x12, 0xB2, 0x01, 0x92, - 0x0E, 0x9A, 0x7B, 0x6C, 0x9A, 0x58, 0x82, 0x42, 0x01, 0xDD, 0x10, 0x46, 0x02, 0xE0, 0x8A, 0x42, - 0x00, 0xDA, 0x11, 0x46, 0x09, 0x9A, 0x52, 0x1C, 0x09, 0x92, 0x08, 0x9B, 0x9A, 0x42, 0x00, 0xDA, - 0x66, 0xE7, 0x00, 0x22, 0x45, 0xE0, 0x3F, 0x4F, 0x03, 0x9B, 0x80, 0x37, 0x62, 0x46, 0xDE, 0x0F, - 0x3D, 0x6D, 0x92, 0x00, 0xF3, 0x18, 0x0B, 0x95, 0xAE, 0x58, 0x5B, 0x10, 0xF5, 0x1A, 0x0A, 0x95, - 0x8D, 0x42, 0x04, 0xDC, 0xFD, 0x6C, 0xAD, 0x58, 0xED, 0x18, 0x8D, 0x42, 0x16, 0xDA, 0x0A, 0x9D, - 0x85, 0x42, 0x04, 0xDC, 0xFD, 0x6C, 0xAD, 0x58, 0xED, 0x18, 0x85, 0x42, 0x0E, 0xDA, 0xCD, 0x1A, - 0xAE, 0x42, 0x02, 0xDB, 0x1F, 0x18, 0xBE, 0x42, 0x08, 0xDD, 0x2E, 0x4E, 0x80, 0x36, 0xF6, 0x6C, - 0xB6, 0x58, 0xAE, 0x42, 0x1B, 0xDB, 0x1B, 0x18, 0x9E, 0x42, 0x18, 0xDC, 0x29, 0x4D, 0x63, 0x46, - 0x80, 0x35, 0x2D, 0x6D, 0x9B, 0x00, 0xEB, 0x58, 0x8B, 0x42, 0x01, 0xDD, 0x0B, 0x9B, 0x99, 0x50, - 0x24, 0x4B, 0x80, 0x33, 0xDB, 0x6C, 0x9D, 0x58, 0x85, 0x42, 0x00, 0xDA, 0x98, 0x50, 0x21, 0x4B, - 0x01, 0x9D, 0x80, 0x33, 0x5B, 0x6D, 0x9E, 0x58, 0x75, 0x19, 0x9D, 0x50, 0x05, 0xE0, 0x62, 0x46, - 0x52, 0x1C, 0x02, 0x9B, 0x94, 0x46, 0x9A, 0x42, 0xB5, 0xDB, 0x02, 0x9A, 0x94, 0x45, 0x0A, 0xD1, - 0x03, 0x46, 0x90, 0x00, 0x17, 0x4A, 0x01, 0x9E, 0x80, 0x32, 0xD5, 0x6C, 0x2B, 0x50, 0x13, 0x6D, - 0x19, 0x50, 0x51, 0x6D, 0x0E, 0x50, 0x13, 0x4A, 0x60, 0x46, 0x80, 0x32, 0x51, 0x6D, 0x80, 0x00, - 0x08, 0x58, 0x04, 0x99, 0x88, 0x42, 0x01, 0xDC, 0x05, 0x98, 0x01, 0xE0, 0x60, 0x46, 0x05, 0x90, - 0x81, 0x00, 0xD0, 0x6C, 0x13, 0x6D, 0x40, 0x58, 0x5F, 0x58, 0x84, 0x46, 0x00, 0x20, 0x01, 0x26, - 0x1B, 0xE0, 0x08, 0x49, 0x82, 0x00, 0x80, 0x31, 0x4B, 0x6C, 0x9B, 0x58, 0xBB, 0x42, 0x11, 0xDB, - 0x63, 0x45, 0x0F, 0xDC, 0x8D, 0x6D, 0x00, 0x23, 0xAB, 0x50, 0x4B, 0x6C, 0xC9, 0x6D, 0x9B, 0x58, - 0x8B, 0x50, 0x09, 0xE0, 0x38, 0x01, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x05, 0x01, 0x00, 0x20, - 0x34, 0x04, 0x00, 0x20, 0x89, 0x6D, 0x8E, 0x50, 0x40, 0x1C, 0x08, 0x99, 0x88, 0x42, 0xE0, 0xDB, - 0x00, 0x20, 0x33, 0xE0, 0x09, 0x9A, 0x00, 0x20, 0x04, 0x21, 0x52, 0x1E, 0x0E, 0xD4, 0x7B, 0x4B, - 0x5E, 0x6C, 0x9D, 0x6D, 0x93, 0x00, 0xEF, 0x58, 0x01, 0x2F, 0x05, 0xD0, 0xF3, 0x58, 0x49, 0x1E, - 0x18, 0x18, 0x09, 0xB2, 0x02, 0x29, 0x01, 0xD0, 0x52, 0x1E, 0xF3, 0xD5, 0x73, 0x4B, 0x09, 0x9A, - 0x9D, 0x6D, 0x52, 0x1C, 0x5E, 0x6C, 0x0A, 0xE0, 0x93, 0x00, 0xEF, 0x58, 0x01, 0x2F, 0x05, 0xD0, - 0xF3, 0x58, 0x49, 0x1E, 0x18, 0x18, 0x09, 0xB2, 0x00, 0x29, 0x03, 0xD0, 0x52, 0x1C, 0x08, 0x9B, - 0x9A, 0x42, 0xF1, 0xDB, 0x04, 0x22, 0x51, 0x1A, 0x09, 0xB2, 0xF6, 0xF7, 0xD9, 0xFE, 0x67, 0x4A, - 0x09, 0x99, 0xD2, 0x6D, 0x89, 0x00, 0x50, 0x50, 0x09, 0x98, 0x40, 0x1C, 0x08, 0x99, 0x09, 0x90, - 0x88, 0x42, 0xC7, 0xDB, 0x10, 0x98, 0xC0, 0x7A, 0x61, 0x4B, 0x40, 0x07, 0x2E, 0xD5, 0x0F, 0x9A, - 0x52, 0x1E, 0x00, 0x21, 0x26, 0xE0, 0x5D, 0x4F, 0x11, 0x98, 0xFF, 0x6D, 0x4D, 0x00, 0x96, 0x00, - 0x40, 0x5F, 0xBE, 0x59, 0x52, 0x1E, 0x80, 0x1B, 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, - 0x20, 0x82, 0x04, 0xE0, 0x0E, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x53, 0x4E, - 0x80, 0x3E, 0x36, 0x7D, 0xB0, 0x42, 0x04, 0xDD, 0x52, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, - 0x05, 0xE0, 0x76, 0x42, 0xB0, 0x42, 0x02, 0xDA, 0x1E, 0x68, 0x36, 0x1A, 0x1E, 0x60, 0x11, 0x9E, - 0x49, 0x1C, 0x70, 0x53, 0x12, 0x98, 0x81, 0x42, 0xD5, 0xDB, 0x2C, 0xE0, 0x00, 0x21, 0x14, 0x9A, - 0x26, 0xE0, 0x46, 0x4F, 0x11, 0x98, 0xFF, 0x6D, 0x4D, 0x00, 0x96, 0x00, 0x40, 0x5F, 0xBE, 0x59, - 0x52, 0x1C, 0x80, 0x1B, 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, 0x20, 0x82, 0x04, 0xE0, - 0x0E, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x3C, 0x4E, 0x80, 0x3E, 0x36, 0x7D, - 0xB0, 0x42, 0x04, 0xDD, 0x3B, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, 0x05, 0xE0, 0x76, 0x42, + 0xA9, 0x42, 0x00, 0xDA, 0xE1, 0x81, 0x13, 0x9D, 0xE9, 0x52, 0x52, 0x1E, 0xEC, 0xD5, 0x98, 0xE2, + 0x06, 0x99, 0xB9, 0x42, 0x00, 0xDB, 0x39, 0x46, 0x05, 0x9A, 0x07, 0x98, 0x90, 0x42, 0x00, 0xDC, + 0x10, 0x46, 0x40, 0x1A, 0x03, 0x21, 0xF7, 0xF7, 0x1B, 0xFA, 0xC5, 0x49, 0x03, 0x90, 0xC9, 0x7C, + 0x88, 0x42, 0x01, 0xDD, 0x03, 0x91, 0x04, 0xE0, 0x03, 0x99, 0x70, 0x08, 0x88, 0x42, 0x00, 0xDD, + 0x03, 0x90, 0xC2, 0x48, 0x10, 0x90, 0xC1, 0x7A, 0x12, 0x9A, 0x14, 0x98, 0x10, 0x18, 0xBC, 0x4A, + 0x0F, 0x90, 0x80, 0x32, 0x48, 0x07, 0x0E, 0xD5, 0x0F, 0x98, 0x40, 0x1E, 0x07, 0xE0, 0x11, 0x99, + 0x6B, 0x00, 0xC9, 0x5E, 0x83, 0x00, 0x96, 0x6C, 0x40, 0x1E, 0x6D, 0x1C, 0xF1, 0x50, 0x12, 0x99, + 0x8D, 0x42, 0xF4, 0xDB, 0x0C, 0xE0, 0x14, 0x98, 0x07, 0xE0, 0x11, 0x99, 0x6B, 0x00, 0xC9, 0x5E, + 0x83, 0x00, 0x96, 0x6C, 0x40, 0x1C, 0x6D, 0x1C, 0xF1, 0x50, 0x12, 0x99, 0x8D, 0x42, 0xF4, 0xDB, + 0x10, 0x98, 0xC0, 0x7A, 0x00, 0x07, 0x0F, 0xD5, 0x14, 0x99, 0x49, 0x1E, 0x00, 0x20, 0x07, 0xE0, + 0x13, 0x9B, 0x45, 0x00, 0x5B, 0x5F, 0x8D, 0x00, 0x96, 0x6C, 0x49, 0x1E, 0x40, 0x1C, 0x73, 0x51, + 0x14, 0x9B, 0x98, 0x42, 0xF4, 0xDB, 0x0D, 0xE0, 0x00, 0x21, 0x08, 0x46, 0x07, 0xE0, 0x13, 0x9B, + 0x45, 0x00, 0x5B, 0x5F, 0x8D, 0x00, 0x96, 0x6C, 0x49, 0x1C, 0x40, 0x1C, 0x73, 0x51, 0x14, 0x9B, + 0x98, 0x42, 0xF4, 0xDB, 0x0F, 0x98, 0x08, 0x90, 0x00, 0x20, 0x02, 0x90, 0x01, 0x20, 0x93, 0x6C, + 0x01, 0x90, 0x00, 0x21, 0x18, 0x68, 0x05, 0x91, 0x04, 0x91, 0x5B, 0x68, 0xD5, 0x6C, 0xC3, 0x1A, + 0x01, 0x26, 0x2B, 0x60, 0x01, 0x46, 0x32, 0x46, 0x09, 0x96, 0x94, 0xE0, 0x90, 0x4F, 0x92, 0x00, + 0x80, 0x37, 0x0E, 0x92, 0xBB, 0x6C, 0xFD, 0x6C, 0xD6, 0x18, 0x40, 0x3E, 0x9B, 0x58, 0xF6, 0x6B, + 0x9B, 0x1B, 0xAB, 0x50, 0x00, 0xD5, 0x5B, 0x42, 0x03, 0x9A, 0x93, 0x42, 0x72, 0xD9, 0x00, 0x23, + 0x48, 0xE0, 0x87, 0x4D, 0x03, 0x9F, 0x80, 0x35, 0x6D, 0x6D, 0x9A, 0x00, 0xFE, 0x0F, 0x0D, 0x95, + 0xF6, 0x19, 0xAD, 0x58, 0x76, 0x10, 0x0C, 0x95, 0xAD, 0x1B, 0x2F, 0x46, 0x8D, 0x42, 0x06, 0xDC, + 0x7F, 0x4D, 0x80, 0x35, 0x2D, 0x6D, 0xAD, 0x58, 0xAD, 0x19, 0x8D, 0x42, 0x19, 0xDA, 0x87, 0x42, + 0x06, 0xDC, 0x7B, 0x4D, 0x80, 0x35, 0x2D, 0x6D, 0xAD, 0x58, 0xAD, 0x19, 0x85, 0x42, 0x10, 0xDA, + 0x8F, 0x1B, 0x0C, 0x9D, 0xBC, 0x46, 0xBD, 0x42, 0x02, 0xDB, 0x37, 0x18, 0xBD, 0x42, 0x08, 0xDD, + 0x73, 0x4D, 0x80, 0x35, 0x2D, 0x6D, 0xAD, 0x58, 0x65, 0x45, 0x1A, 0xDB, 0x36, 0x18, 0xB5, 0x42, + 0x17, 0xDC, 0x6F, 0x4E, 0x9D, 0x00, 0x80, 0x36, 0x76, 0x6D, 0x75, 0x59, 0x8D, 0x42, 0x01, 0xDD, + 0x0D, 0x9D, 0xA9, 0x50, 0x6A, 0x4D, 0x80, 0x35, 0x2D, 0x6D, 0xAE, 0x58, 0x86, 0x42, 0x00, 0xDA, + 0xA8, 0x50, 0x67, 0x4D, 0x01, 0x9E, 0x80, 0x35, 0xAD, 0x6D, 0xAF, 0x58, 0xBE, 0x19, 0xAE, 0x50, + 0x03, 0xE0, 0x5B, 0x1C, 0x02, 0x9A, 0x93, 0x42, 0xB3, 0xDB, 0x02, 0x9A, 0x93, 0x42, 0x0F, 0xD1, + 0x5F, 0x4E, 0x02, 0x46, 0x02, 0x98, 0x80, 0x36, 0x35, 0x6D, 0x80, 0x00, 0x01, 0x9F, 0x2A, 0x50, + 0x02, 0x9D, 0x72, 0x6D, 0x6D, 0x1C, 0x11, 0x50, 0xB1, 0x6D, 0x2D, 0xB2, 0x0F, 0x50, 0x02, 0x95, + 0x57, 0x4A, 0x01, 0x20, 0x01, 0x90, 0x80, 0x32, 0x91, 0x6C, 0x92, 0x6D, 0x0E, 0x98, 0x9D, 0x00, + 0x52, 0x59, 0x08, 0x58, 0x04, 0x9D, 0x01, 0x46, 0xAA, 0x42, 0x11, 0xDD, 0x05, 0x93, 0x04, 0x92, + 0x0E, 0xE0, 0xFF, 0xE7, 0x01, 0x9A, 0x0E, 0x9B, 0x52, 0x1C, 0x12, 0xB2, 0x01, 0x92, 0xBA, 0x6C, + 0xD2, 0x58, 0x82, 0x42, 0x01, 0xDD, 0x10, 0x46, 0x02, 0xE0, 0x8A, 0x42, 0x00, 0xDA, 0x11, 0x46, + 0x09, 0x9A, 0x52, 0x1C, 0x09, 0x92, 0x08, 0x9B, 0x9A, 0x42, 0x00, 0xDA, 0x66, 0xE7, 0x00, 0x22, + 0x45, 0xE0, 0x43, 0x4F, 0x03, 0x9B, 0x80, 0x37, 0x62, 0x46, 0xDE, 0x0F, 0x7D, 0x6D, 0x92, 0x00, + 0xF3, 0x18, 0x0B, 0x95, 0xAE, 0x58, 0x5B, 0x10, 0xF5, 0x1A, 0x0A, 0x95, 0x8D, 0x42, 0x04, 0xDC, + 0x3D, 0x6D, 0xAD, 0x58, 0xED, 0x18, 0x8D, 0x42, 0x16, 0xDA, 0x0A, 0x9D, 0x85, 0x42, 0x04, 0xDC, + 0x3D, 0x6D, 0xAD, 0x58, 0xED, 0x18, 0x85, 0x42, 0x0E, 0xDA, 0xCF, 0x1A, 0xBE, 0x42, 0x02, 0xDB, + 0x1D, 0x18, 0xAE, 0x42, 0x08, 0xDD, 0x32, 0x4D, 0x80, 0x35, 0x2D, 0x6D, 0xAD, 0x58, 0xBD, 0x42, + 0x1B, 0xDB, 0x1B, 0x18, 0x9D, 0x42, 0x18, 0xDC, 0x2D, 0x4D, 0x63, 0x46, 0x80, 0x35, 0x6D, 0x6D, + 0x9B, 0x00, 0xEB, 0x58, 0x8B, 0x42, 0x01, 0xDD, 0x0B, 0x9B, 0x99, 0x50, 0x28, 0x4B, 0x80, 0x33, + 0x1B, 0x6D, 0x9D, 0x58, 0x85, 0x42, 0x00, 0xDA, 0x98, 0x50, 0x25, 0x4B, 0x01, 0x9D, 0x80, 0x33, + 0x9B, 0x6D, 0x9E, 0x58, 0x75, 0x19, 0x9D, 0x50, 0x05, 0xE0, 0x62, 0x46, 0x52, 0x1C, 0x02, 0x9B, + 0x94, 0x46, 0x9A, 0x42, 0xB5, 0xDB, 0x02, 0x9A, 0x94, 0x45, 0x0A, 0xD1, 0x03, 0x46, 0x90, 0x00, + 0x1B, 0x4A, 0x01, 0x9E, 0x80, 0x32, 0x15, 0x6D, 0x2B, 0x50, 0x53, 0x6D, 0x19, 0x50, 0x91, 0x6D, + 0x0E, 0x50, 0x17, 0x4A, 0x60, 0x46, 0x80, 0x32, 0x91, 0x6D, 0x80, 0x00, 0x08, 0x58, 0x04, 0x99, + 0x88, 0x42, 0x01, 0xDC, 0x05, 0x98, 0x01, 0xE0, 0x60, 0x46, 0x05, 0x90, 0x81, 0x00, 0x10, 0x6D, + 0x53, 0x6D, 0x40, 0x58, 0x5F, 0x58, 0x84, 0x46, 0x00, 0x20, 0x01, 0x26, 0x13, 0xE0, 0x0C, 0x49, + 0x82, 0x00, 0x80, 0x31, 0x8B, 0x6C, 0x9B, 0x58, 0xBB, 0x42, 0x09, 0xDB, 0x63, 0x45, 0x07, 0xDC, + 0xCD, 0x6D, 0x00, 0x23, 0xAB, 0x50, 0x8B, 0x6C, 0x09, 0x6E, 0x9B, 0x58, 0x8B, 0x50, 0x01, 0xE0, + 0xC9, 0x6D, 0x8E, 0x50, 0x40, 0x1C, 0x08, 0x99, 0x88, 0x42, 0xE8, 0xDB, 0x00, 0x20, 0x3B, 0xE0, + 0x24, 0x01, 0x00, 0x20, 0xF0, 0x00, 0x00, 0x20, 0xF1, 0x00, 0x00, 0x20, 0x14, 0x04, 0x00, 0x20, + 0x09, 0x9A, 0x00, 0x20, 0x04, 0x21, 0x52, 0x1E, 0x0E, 0xD4, 0x7B, 0x4B, 0x9E, 0x6C, 0xDD, 0x6D, + 0x93, 0x00, 0xEF, 0x58, 0x01, 0x2F, 0x05, 0xD0, 0xF3, 0x58, 0x49, 0x1E, 0x18, 0x18, 0x09, 0xB2, + 0x02, 0x29, 0x01, 0xD0, 0x52, 0x1E, 0xF3, 0xD5, 0x73, 0x4B, 0x09, 0x9A, 0xDD, 0x6D, 0x52, 0x1C, + 0x9E, 0x6C, 0x0A, 0xE0, 0x93, 0x00, 0xEF, 0x58, 0x01, 0x2F, 0x05, 0xD0, 0xF3, 0x58, 0x49, 0x1E, + 0x18, 0x18, 0x09, 0xB2, 0x00, 0x29, 0x03, 0xD0, 0x52, 0x1C, 0x08, 0x9B, 0x9A, 0x42, 0xF1, 0xDB, + 0x04, 0x22, 0x51, 0x1A, 0x09, 0xB2, 0xF7, 0xF7, 0x5B, 0xF8, 0x67, 0x4A, 0x09, 0x99, 0x12, 0x6E, + 0x89, 0x00, 0x50, 0x50, 0x09, 0x98, 0x40, 0x1C, 0x08, 0x99, 0x09, 0x90, 0x88, 0x42, 0xC7, 0xDB, + 0x10, 0x98, 0xC0, 0x7A, 0x61, 0x4B, 0x40, 0x07, 0x2E, 0xD5, 0x0F, 0x9A, 0x52, 0x1E, 0x00, 0x21, + 0x26, 0xE0, 0x5D, 0x4F, 0x11, 0x98, 0x3F, 0x6E, 0x4D, 0x00, 0x96, 0x00, 0x40, 0x5F, 0xBE, 0x59, + 0x52, 0x1E, 0x80, 0x1B, 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, 0x20, 0x82, 0x04, 0xE0, + 0x0E, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x53, 0x4E, 0x80, 0x3E, 0x36, 0x7D, + 0xB0, 0x42, 0x04, 0xDD, 0x52, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, 0x05, 0xE0, 0x76, 0x42, 0xB0, 0x42, 0x02, 0xDA, 0x1E, 0x68, 0x36, 0x1A, 0x1E, 0x60, 0x11, 0x9E, 0x49, 0x1C, 0x70, 0x53, - 0x12, 0x98, 0x81, 0x42, 0xD5, 0xDB, 0x10, 0x98, 0xC0, 0x7A, 0x00, 0x07, 0x2E, 0xD5, 0x14, 0x9A, - 0x52, 0x1E, 0x00, 0x21, 0x26, 0xE0, 0x2D, 0x4F, 0x13, 0x98, 0xFF, 0x6D, 0x4D, 0x00, 0x96, 0x00, - 0x40, 0x5F, 0xBE, 0x59, 0x52, 0x1E, 0x80, 0x1B, 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, - 0x20, 0x82, 0x04, 0xE0, 0x0E, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x23, 0x4E, - 0x80, 0x3E, 0x36, 0x7D, 0xB0, 0x42, 0x04, 0xDD, 0x22, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, - 0x05, 0xE0, 0x76, 0x42, 0xB0, 0x42, 0x02, 0xDA, 0x1E, 0x68, 0x36, 0x1A, 0x1E, 0x60, 0x13, 0x9E, - 0x49, 0x1C, 0x70, 0x53, 0x14, 0x98, 0x81, 0x42, 0xD5, 0xDB, 0x2C, 0xE0, 0x00, 0x22, 0x11, 0x46, - 0x26, 0xE0, 0x16, 0x4F, 0x13, 0x98, 0xFF, 0x6D, 0x4D, 0x00, 0x96, 0x00, 0x40, 0x5F, 0xBE, 0x59, - 0x52, 0x1C, 0x80, 0x1B, 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, 0x20, 0x82, 0x04, 0xE0, - 0x0E, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x0C, 0x4E, 0x80, 0x3E, 0x36, 0x7D, - 0xB0, 0x42, 0x04, 0xDD, 0x0B, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, 0x05, 0xE0, 0x76, 0x42, + 0x12, 0x98, 0x81, 0x42, 0xD5, 0xDB, 0x2C, 0xE0, 0x00, 0x21, 0x14, 0x9A, 0x26, 0xE0, 0x46, 0x4F, + 0x11, 0x98, 0x3F, 0x6E, 0x4D, 0x00, 0x96, 0x00, 0x40, 0x5F, 0xBE, 0x59, 0x52, 0x1C, 0x80, 0x1B, + 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, 0x20, 0x82, 0x04, 0xE0, 0x0E, 0x26, 0xA6, 0x5F, + 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x3C, 0x4E, 0x80, 0x3E, 0x36, 0x7D, 0xB0, 0x42, 0x04, 0xDD, + 0x3B, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, 0x05, 0xE0, 0x76, 0x42, 0xB0, 0x42, 0x02, 0xDA, + 0x1E, 0x68, 0x36, 0x1A, 0x1E, 0x60, 0x11, 0x9E, 0x49, 0x1C, 0x70, 0x53, 0x12, 0x98, 0x81, 0x42, + 0xD5, 0xDB, 0x10, 0x98, 0xC0, 0x7A, 0x00, 0x07, 0x2E, 0xD5, 0x14, 0x9A, 0x52, 0x1E, 0x00, 0x21, + 0x26, 0xE0, 0x2D, 0x4F, 0x13, 0x98, 0x3F, 0x6E, 0x4D, 0x00, 0x96, 0x00, 0x40, 0x5F, 0xBE, 0x59, + 0x52, 0x1E, 0x80, 0x1B, 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, 0x20, 0x82, 0x04, 0xE0, + 0x0E, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x23, 0x4E, 0x80, 0x3E, 0x36, 0x7D, + 0xB0, 0x42, 0x04, 0xDD, 0x22, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, 0x05, 0xE0, 0x76, 0x42, 0xB0, 0x42, 0x02, 0xDA, 0x1E, 0x68, 0x36, 0x1A, 0x1E, 0x60, 0x13, 0x9E, 0x49, 0x1C, 0x70, 0x53, - 0x14, 0x98, 0x81, 0x42, 0xD5, 0xDB, 0x00, 0x20, 0x15, 0xB0, 0xF0, 0xBD, 0xB8, 0x01, 0x00, 0x20, - 0xE8, 0x00, 0x00, 0x20, 0xE4, 0x00, 0x00, 0x20, 0xF1, 0xB5, 0x30, 0x48, 0x80, 0x79, 0xFF, 0x28, - 0x5B, 0xD0, 0x00, 0x9E, 0x00, 0x25, 0x28, 0x46, 0xFA, 0xF7, 0x44, 0xFE, 0x04, 0x1E, 0x1E, 0xDB, - 0x2A, 0x4A, 0x14, 0x32, 0x10, 0x5D, 0x01, 0x06, 0x19, 0xD5, 0x17, 0x46, 0x08, 0x37, 0x40, 0x06, - 0x39, 0x5D, 0x40, 0x0E, 0x01, 0x22, 0xF9, 0xF7, 0x47, 0xF9, 0xF0, 0x07, 0x0F, 0xD1, 0x23, 0x48, - 0x39, 0x5D, 0x00, 0x78, 0x00, 0x28, 0x22, 0x48, 0x00, 0x5D, 0x04, 0xD0, 0x40, 0x06, 0x40, 0x0E, - 0xF8, 0xF7, 0xF8, 0xFE, 0x03, 0xE0, 0x40, 0x06, 0x40, 0x0E, 0xF9, 0xF7, 0x6F, 0xF9, 0x6D, 0x1C, - 0xED, 0xB2, 0x76, 0x08, 0x08, 0x2D, 0xD6, 0xD3, 0x00, 0x9D, 0x00, 0x26, 0x30, 0x46, 0xFA, 0xF7, - 0x19, 0xFE, 0x04, 0x1E, 0x1A, 0xDB, 0x16, 0x48, 0x00, 0x5D, 0x01, 0x06, 0x16, 0xD5, 0xE9, 0x07, - 0x14, 0xD0, 0x12, 0x4F, 0x39, 0x78, 0x00, 0x29, 0x12, 0x49, 0x09, 0x5D, 0x04, 0xD0, 0x40, 0x06, - 0x40, 0x0E, 0xF9, 0xF7, 0x53, 0xF9, 0x03, 0xE0, 0x40, 0x06, 0x40, 0x0E, 0xF8, 0xF7, 0xD2, 0xFE, - 0x39, 0x78, 0x60, 0x00, 0x40, 0x18, 0xB4, 0x30, 0xFE, 0xF7, 0xAC, 0xF8, 0x76, 0x1C, 0xF6, 0xB2, - 0x6D, 0x08, 0x08, 0x2E, 0xDA, 0xD3, 0x00, 0x98, 0x00, 0x28, 0x01, 0xD1, 0xBC, 0x20, 0x02, 0xE0, - 0xFF, 0x28, 0x02, 0xD1, 0xBD, 0x20, 0xFE, 0xF7, 0x9D, 0xF8, 0xF8, 0xBD, 0x90, 0x03, 0x00, 0x20, - 0xA4, 0x03, 0x00, 0x20, 0xAC, 0x03, 0x00, 0x20, 0x04, 0x49, 0x09, 0x78, 0x41, 0x43, 0x04, 0x4A, - 0x51, 0x61, 0x00, 0x21, 0x91, 0x61, 0x05, 0x21, 0x11, 0x61, 0x70, 0x47, 0xC2, 0x00, 0x00, 0x20, - 0x00, 0xE0, 0x00, 0xE0, 0x10, 0xB5, 0xFC, 0xF7, 0xD5, 0xF9, 0x00, 0x20, 0xFE, 0xF7, 0xAA, 0xFB, - 0x00, 0x20, 0x1A, 0x49, 0x08, 0x70, 0x1A, 0x49, 0x08, 0x70, 0x1A, 0x49, 0x08, 0x70, 0x1A, 0x48, - 0x00, 0x78, 0x1A, 0x49, 0x08, 0x80, 0x00, 0x20, 0x19, 0x49, 0x08, 0x70, 0x19, 0x49, 0x08, 0x70, - 0x19, 0x49, 0x08, 0x70, 0x19, 0x49, 0x08, 0x70, 0x19, 0x49, 0x08, 0x70, 0x19, 0x49, 0x08, 0x80, - 0x19, 0x49, 0x08, 0x70, 0x19, 0x49, 0x08, 0x70, 0x02, 0x20, 0x19, 0x49, 0x08, 0x70, 0x00, 0x20, - 0x18, 0x49, 0x08, 0x80, 0x18, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0B, 0xD1, 0x00, 0xF0, 0xF6, 0xFE, - 0x01, 0x20, 0x15, 0x49, 0x08, 0x70, 0x15, 0x49, 0x08, 0x70, 0x15, 0x49, 0x08, 0x70, 0x02, 0x20, - 0x00, 0xF0, 0x48, 0xFF, 0x13, 0x48, 0xFF, 0xF7, 0xB7, 0xFF, 0x10, 0xBD, 0xA3, 0x00, 0x00, 0x20, - 0xA4, 0x00, 0x00, 0x20, 0xA5, 0x00, 0x00, 0x20, 0xC3, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, - 0xA2, 0x00, 0x00, 0x20, 0x9A, 0x00, 0x00, 0x20, 0x9B, 0x00, 0x00, 0x20, 0xAF, 0x00, 0x00, 0x20, - 0xA1, 0x00, 0x00, 0x20, 0xCA, 0x00, 0x00, 0x20, 0xA6, 0x00, 0x00, 0x20, 0xA8, 0x00, 0x00, 0x20, - 0x2C, 0x02, 0x00, 0x20, 0x2A, 0x02, 0x00, 0x20, 0xAE, 0x00, 0x00, 0x20, 0xAA, 0x00, 0x00, 0x20, - 0x9C, 0x00, 0x00, 0x20, 0xA0, 0x86, 0x01, 0x00, 0x70, 0xB5, 0x20, 0x48, 0x00, 0x69, 0x45, 0x07, - 0x6D, 0x0F, 0x05, 0x2D, 0x00, 0xD9, 0x04, 0x25, 0x02, 0x2D, 0x03, 0xD0, 0xA8, 0x00, 0x1C, 0x49, - 0x0C, 0x58, 0x1E, 0xE0, 0x19, 0x48, 0x00, 0x6A, 0x00, 0x04, 0x86, 0x0F, 0x01, 0x2E, 0x00, 0xD9, - 0x76, 0x1E, 0x16, 0x4A, 0x12, 0x6A, 0x12, 0x03, 0xD2, 0x0F, 0x01, 0xD0, 0x15, 0x4A, 0x00, 0xE0, - 0x15, 0x4A, 0x12, 0x4B, 0x1B, 0x6A, 0xDB, 0x05, 0xDB, 0x0D, 0x9B, 0x1C, 0x10, 0x46, 0x58, 0x43, - 0x0E, 0x4A, 0x12, 0x6A, 0x92, 0x04, 0xD2, 0x0E, 0x91, 0x1C, 0xF6, 0xF7, 0xF7, 0xFC, 0xF0, 0x40, - 0x04, 0x46, 0x0A, 0x48, 0x80, 0x69, 0x00, 0x07, 0x00, 0x0F, 0x41, 0x1C, 0x20, 0x46, 0xF6, 0xF7, - 0xED, 0xFC, 0x0A, 0x49, 0x08, 0x60, 0x0A, 0x49, 0x08, 0x48, 0x00, 0x68, 0x4A, 0x10, 0x80, 0x18, - 0xF6, 0xF7, 0xE4, 0xFC, 0x07, 0x49, 0x08, 0x60, 0x70, 0xBD, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, - 0x08, 0x00, 0x00, 0x20, 0x00, 0x80, 0x51, 0x01, 0x00, 0x1B, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x40, 0x42, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xF8, 0xB5, 0x28, 0x4A, - 0x00, 0x24, 0x26, 0x48, 0x13, 0x46, 0x44, 0x72, 0xC4, 0x71, 0xC4, 0x81, 0x15, 0x46, 0x16, 0x46, - 0x22, 0x4F, 0x04, 0x72, 0x10, 0x33, 0x20, 0x35, 0x30, 0x36, 0x20, 0x46, 0x2C, 0x37, 0x41, 0x00, - 0x54, 0x52, 0x5C, 0x52, 0x6C, 0x52, 0x74, 0x52, 0x1C, 0x49, 0x24, 0x31, 0x0C, 0x54, 0x1D, 0x49, - 0x09, 0x18, 0xA0, 0x31, 0x09, 0x79, 0x09, 0x09, 0x49, 0x1C, 0x39, 0x54, 0x40, 0x1C, 0xC0, 0xB2, - 0x08, 0x28, 0xEC, 0xD3, 0x17, 0x4D, 0xA0, 0x35, 0x28, 0x7B, 0x00, 0x07, 0x00, 0x0F, 0x03, 0x28, - 0x23, 0xD1, 0x12, 0x4E, 0x74, 0x70, 0x28, 0x7B, 0x40, 0x06, 0xC0, 0x0F, 0x30, 0x70, 0xE8, 0x78, - 0xB0, 0x70, 0x40, 0x00, 0x03, 0x21, 0xF6, 0xF7, 0x99, 0xFC, 0xF0, 0x70, 0x28, 0x7C, 0x00, 0x07, - 0x00, 0x0F, 0xC0, 0xB2, 0x81, 0x00, 0x40, 0x18, 0x0F, 0x30, 0x30, 0x71, 0x28, 0x7B, 0x80, 0x06, - 0x80, 0x0F, 0xB0, 0x71, 0x28, 0x7B, 0x00, 0x06, 0x01, 0xD4, 0xFF, 0x20, 0xB0, 0x71, 0x00, 0x20, - 0xFF, 0xF7, 0x8A, 0xFE, 0x74, 0x81, 0x04, 0x48, 0xB0, 0x81, 0xF8, 0xBD, 0x90, 0x03, 0x00, 0x20, - 0x98, 0x1A, 0x00, 0x20, 0xD4, 0x03, 0x00, 0x20, 0x54, 0x0B, 0x00, 0x00, 0x10, 0xB5, 0x05, 0x48, - 0xC4, 0x69, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x20, 0x46, 0x02, 0x49, 0x09, 0x68, - 0x88, 0x47, 0x10, 0xBD, 0x00, 0x00, 0x05, 0x40, 0x30, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x05, 0x48, - 0xC4, 0x69, 0x05, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x20, 0x46, 0x02, 0x49, 0x09, 0x68, - 0x88, 0x47, 0x10, 0xBD, 0x00, 0x00, 0x15, 0x40, 0x34, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x49, 0x48, - 0x40, 0x68, 0x49, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x08, 0x42, 0x31, 0xD0, - 0x44, 0x48, 0x40, 0x69, 0xC0, 0x07, 0xC0, 0x0F, 0x44, 0x49, 0x08, 0x60, 0x04, 0x20, 0x41, 0x49, - 0x48, 0x60, 0x42, 0x48, 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x0D, 0xD0, 0x40, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x75, 0xD1, 0x01, 0x20, 0x3E, 0x49, 0x08, 0x60, 0x7D, 0x20, 0x00, 0x01, 0x39, 0x49, - 0x08, 0x61, 0x0F, 0x20, 0x08, 0x60, 0x6B, 0xE0, 0x00, 0x20, 0x39, 0x49, 0x08, 0x60, 0x3B, 0x20, - 0x40, 0x01, 0x34, 0x49, 0x08, 0x61, 0x00, 0x20, 0x36, 0x49, 0x08, 0x70, 0x36, 0x49, 0x08, 0x70, - 0x30, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x2D, 0x49, - 0x08, 0x60, 0x55, 0xE0, 0x2E, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD1, 0x0B, 0x20, 0x29, 0x49, - 0x48, 0x60, 0x4D, 0xE0, 0x28, 0x48, 0x00, 0x68, 0x08, 0x21, 0x08, 0x42, 0x03, 0xD0, 0x08, 0x20, - 0x24, 0x49, 0x48, 0x60, 0x44, 0xE0, 0x24, 0x48, 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x34, 0xD0, - 0x20, 0x48, 0x00, 0x69, 0x25, 0x49, 0x08, 0x60, 0x01, 0x20, 0x1E, 0x49, 0x48, 0x60, 0x23, 0x48, - 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x08, 0xD0, 0x7D, 0x20, 0x00, 0x01, 0x08, 0x61, 0x07, 0x20, - 0x1B, 0x49, 0x08, 0x60, 0xF9, 0xF7, 0xA4, 0xFC, 0x2A, 0xE0, 0x1C, 0x48, 0x00, 0x68, 0x02, 0x21, - 0x08, 0x42, 0x0A, 0xD0, 0x1F, 0x20, 0x80, 0x01, 0x12, 0x49, 0x08, 0x61, 0x14, 0x48, 0x00, 0x68, - 0x20, 0x21, 0x08, 0x43, 0x12, 0x49, 0x08, 0x60, 0x1A, 0xE0, 0x14, 0x48, 0x00, 0x68, 0x04, 0x21, - 0x08, 0x42, 0x15, 0xD0, 0x7D, 0x20, 0x00, 0x01, 0x0A, 0x49, 0x08, 0x61, 0x0C, 0x48, 0x00, 0x68, - 0x20, 0x21, 0x88, 0x43, 0x0A, 0x49, 0x08, 0x60, 0x0A, 0xE0, 0x07, 0x48, 0x00, 0x68, 0x02, 0x21, - 0x08, 0x42, 0x05, 0xD0, 0x03, 0x48, 0xC0, 0x68, 0x09, 0x49, 0x08, 0x60, 0xF9, 0xF7, 0x64, 0xFE, - 0x10, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x6C, 0x03, 0x00, 0x20, 0x68, 0x03, 0x00, 0x20, - 0x70, 0x03, 0x00, 0x20, 0x42, 0x03, 0x00, 0x20, 0x5C, 0x03, 0x00, 0x20, 0x60, 0x03, 0x00, 0x20, - 0x64, 0x03, 0x00, 0x20, 0x0E, 0xB5, 0x05, 0x20, 0xF8, 0xF7, 0x8E, 0xFD, 0xE1, 0x20, 0x40, 0x02, - 0x00, 0x90, 0x03, 0x20, 0x6B, 0x46, 0x18, 0x71, 0x00, 0x20, 0x58, 0x71, 0x98, 0x71, 0xD8, 0x71, - 0x69, 0x46, 0x01, 0x20, 0x00, 0x05, 0xF9, 0xF7, 0x3D, 0xFB, 0x0E, 0xBD, 0x70, 0xB5, 0x00, 0x26, - 0x00, 0x24, 0x00, 0x25, 0x15, 0xE0, 0x64, 0x1C, 0xF8, 0xF7, 0xFA, 0xFB, 0x7D, 0x20, 0xC0, 0x00, - 0x84, 0x42, 0x02, 0xD1, 0xFE, 0xF7, 0x82, 0xFE, 0x0B, 0xE0, 0x19, 0x20, 0x80, 0x01, 0x84, 0x42, - 0x07, 0xD1, 0x00, 0x24, 0xFB, 0xF7, 0x80, 0xFF, 0x68, 0x1C, 0x05, 0x46, 0x07, 0x28, 0x00, 0xDD, - 0x03, 0xE0, 0x58, 0x48, 0x00, 0x78, 0x01, 0x28, 0xE5, 0xD0, 0x00, 0xBF, 0x56, 0x48, 0xC0, 0x79, - 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x01, 0xD1, 0x00, 0x24, 0x05, 0xE0, 0x53, 0x48, 0x00, 0x78, - 0x51, 0x49, 0x65, 0x39, 0x08, 0x70, 0x01, 0x24, 0x51, 0x48, 0x00, 0x88, 0xC2, 0xB2, 0x20, 0x46, - 0x64, 0x1C, 0x4D, 0x49, 0x65, 0x39, 0x0A, 0x54, 0x4D, 0x48, 0x00, 0x88, 0x02, 0x12, 0x20, 0x46, - 0x64, 0x1C, 0x0A, 0x54, 0x4B, 0x48, 0x00, 0x78, 0x01, 0x28, 0x02, 0xD1, 0x0A, 0x20, 0x49, 0x49, - 0x08, 0x70, 0x00, 0x25, 0x67, 0xE0, 0x01, 0x20, 0xA8, 0x40, 0x45, 0x49, 0x09, 0x88, 0x08, 0x42, - 0x60, 0xD0, 0x41, 0x48, 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x01, 0x28, 0x2A, 0xD1, 0x68, 0x00, - 0x41, 0x49, 0x09, 0x68, 0x08, 0x5A, 0xC2, 0xB2, 0x20, 0x46, 0x64, 0x1C, 0x3A, 0x49, 0x65, 0x39, - 0x0A, 0x54, 0x68, 0x00, 0x3C, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x00, 0x04, 0x02, 0x0E, 0x20, 0x46, - 0x64, 0x1C, 0x35, 0x49, 0x65, 0x39, 0x0A, 0x54, 0x68, 0x00, 0x38, 0x49, 0x09, 0x68, 0x08, 0x5A, - 0xC2, 0xB2, 0x20, 0x46, 0x64, 0x1C, 0x30, 0x49, 0x65, 0x39, 0x0A, 0x54, 0x68, 0x00, 0x33, 0x49, - 0x09, 0x68, 0x08, 0x5A, 0x00, 0x04, 0x02, 0x0E, 0x20, 0x46, 0x64, 0x1C, 0x2A, 0x49, 0x65, 0x39, - 0x0A, 0x54, 0x2F, 0xE0, 0x68, 0x00, 0x2C, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x00, 0x04, 0x02, 0x0E, - 0x20, 0x46, 0x64, 0x1C, 0x24, 0x49, 0x65, 0x39, 0x0A, 0x54, 0x68, 0x00, 0x26, 0x49, 0x09, 0x68, - 0x08, 0x5A, 0xC2, 0xB2, 0x20, 0x46, 0x64, 0x1C, 0x1F, 0x49, 0x65, 0x39, 0x0A, 0x54, 0x68, 0x00, - 0x22, 0x49, 0x09, 0x68, 0x08, 0x5A, 0x00, 0x04, 0x02, 0x0E, 0x20, 0x46, 0x64, 0x1C, 0x1A, 0x49, - 0x65, 0x39, 0x0A, 0x54, 0x68, 0x00, 0x1D, 0x49, 0x09, 0x68, 0x08, 0x5A, 0xC2, 0xB2, 0x20, 0x46, - 0x64, 0x1C, 0x15, 0x49, 0x65, 0x39, 0x0A, 0x54, 0x19, 0x48, 0x00, 0x68, 0x42, 0x5D, 0x20, 0x46, - 0x64, 0x1C, 0x0A, 0x54, 0x6D, 0x1C, 0x17, 0x48, 0x00, 0x78, 0x85, 0x42, 0x93, 0xDB, 0x0E, 0x48, - 0xC0, 0x79, 0xC0, 0x06, 0x80, 0x0F, 0x0E, 0xD1, 0x01, 0x25, 0x05, 0xE0, 0x0A, 0x48, 0x65, 0x38, - 0x40, 0x5D, 0x80, 0x19, 0xC6, 0xB2, 0x6D, 0x1C, 0xA5, 0x42, 0xF7, 0xDB, 0x70, 0x42, 0xC6, 0xB2, - 0x05, 0x48, 0x65, 0x38, 0x06, 0x55, 0x01, 0x20, 0x02, 0x49, 0x08, 0x70, 0x00, 0x20, 0x0A, 0x49, - 0x08, 0x70, 0x70, 0xBD, 0x9B, 0x00, 0x00, 0x20, 0x39, 0x04, 0x00, 0x20, 0x55, 0x01, 0x00, 0x20, - 0x96, 0x00, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x20, 0xD4, 0x01, 0x00, 0x20, 0xD8, 0x01, 0x00, 0x20, - 0xDC, 0x01, 0x00, 0x20, 0x4A, 0x01, 0x00, 0x20, 0xAF, 0x00, 0x00, 0x20, 0x70, 0xB5, 0x1B, 0x48, - 0x00, 0x24, 0x04, 0x5F, 0x1A, 0x48, 0x00, 0x26, 0x86, 0x5F, 0x1A, 0x48, 0x00, 0x78, 0x01, 0x28, - 0x00, 0xD1, 0x70, 0xBD, 0xFE, 0xF7, 0x52, 0xFE, 0x14, 0x49, 0x00, 0x20, 0x08, 0x5E, 0xA0, 0x42, - 0x03, 0xDD, 0x00, 0x20, 0x08, 0x5E, 0x00, 0x1B, 0x03, 0xE0, 0x10, 0x48, 0x00, 0x21, 0x41, 0x5E, - 0x60, 0x1A, 0x05, 0xB2, 0x10, 0x48, 0x00, 0x78, 0x85, 0x42, 0x01, 0xDD, 0x00, 0x20, 0xE8, 0xE7, - 0x0B, 0x49, 0x00, 0x20, 0x08, 0x5E, 0xB0, 0x42, 0x03, 0xDD, 0x00, 0x20, 0x08, 0x5E, 0x80, 0x1B, - 0x03, 0xE0, 0x07, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x70, 0x1A, 0x05, 0xB2, 0x06, 0x48, 0x00, 0x78, - 0x85, 0x42, 0x01, 0xDD, 0x00, 0x20, 0xD4, 0xE7, 0x01, 0x20, 0xD2, 0xE7, 0x86, 0x01, 0x00, 0x20, - 0x88, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, 0x00, 0x20, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x48, - 0x22, 0x49, 0x08, 0x60, 0x00, 0x20, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, - 0x08, 0x80, 0x22, 0x48, 0x22, 0x49, 0x08, 0x80, 0x00, 0x20, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, 0x08, 0x70, 0x22, 0x48, 0x00, 0x78, 0x22, 0x49, - 0x08, 0x70, 0x22, 0x48, 0x00, 0x78, 0x14, 0x21, 0x48, 0x43, 0x21, 0x49, 0x08, 0x80, 0x21, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x1D, 0x48, 0x00, 0x78, 0x40, 0x00, 0x14, 0x21, 0x48, 0x43, - 0x1B, 0x49, 0x08, 0x80, 0x70, 0x47, 0x00, 0x00, 0xEC, 0x00, 0x00, 0x20, 0xED, 0x00, 0x00, 0x20, - 0xEE, 0x00, 0x00, 0x20, 0xEF, 0x00, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x20, - 0xF4, 0x00, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, - 0xFA, 0x00, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x03, 0x01, 0x00, 0x20, - 0x06, 0x01, 0x00, 0x20, 0x08, 0x01, 0x00, 0x20, 0x09, 0x01, 0x00, 0x20, 0x0C, 0x01, 0x00, 0x20, - 0x0E, 0x01, 0x00, 0x20, 0x4C, 0x01, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, 0x48, 0x01, 0x00, 0x20, - 0x16, 0x01, 0x00, 0x20, 0x42, 0x01, 0x00, 0x20, 0x10, 0xB5, 0xFF, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x07, 0xD1, 0xFE, 0x48, 0x00, 0x68, 0xFE, 0x49, 0x09, 0x88, 0x40, 0x1A, 0xFB, 0x49, 0x08, 0x60, - 0x0E, 0xE0, 0xFC, 0x48, 0x00, 0x78, 0x01, 0x28, 0x07, 0xD1, 0xF8, 0x48, 0x00, 0x68, 0xF8, 0x49, - 0x09, 0x88, 0x40, 0x1A, 0xF5, 0x49, 0x08, 0x60, 0x02, 0xE0, 0xF7, 0x48, 0xF3, 0x49, 0x08, 0x60, - 0xF2, 0x48, 0x00, 0x68, 0x00, 0x28, 0x0B, 0xDA, 0xEF, 0x48, 0x00, 0x78, 0x01, 0x28, 0x01, 0xD1, - 0xF2, 0x49, 0x08, 0x70, 0x01, 0x20, 0xEC, 0x49, 0x08, 0x70, 0xEF, 0x48, 0xEB, 0x49, 0x08, 0x60, - 0xEF, 0x48, 0x00, 0x78, 0x01, 0x28, 0x1C, 0xD1, 0xEE, 0x48, 0x00, 0x88, 0xEE, 0x49, 0x09, 0x88, - 0x88, 0x42, 0x7E, 0xD1, 0xED, 0x49, 0x00, 0x20, 0x08, 0x5E, 0xED, 0x49, 0x09, 0x78, 0x88, 0x42, - 0x07, 0xDC, 0xEB, 0x48, 0x00, 0x78, 0x40, 0x42, 0xEA, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, - 0x6F, 0xDD, 0xFC, 0xF7, 0xB7, 0xFF, 0x00, 0x28, 0x6B, 0xD0, 0x01, 0x20, 0xE6, 0x49, 0x08, 0x70, - 0x10, 0xBD, 0xE6, 0x48, 0x00, 0x78, 0x01, 0x28, 0xE3, 0xD1, 0xE5, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x50, 0xD1, 0xE4, 0x48, 0x00, 0x78, 0x81, 0x00, 0x40, 0x18, 0x40, 0x1D, 0xE2, 0x49, 0x09, 0x78, - 0x88, 0x42, 0x1A, 0xDA, 0xE1, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0xDF, 0x48, 0x00, 0x78, - 0x01, 0x28, 0x08, 0xD1, 0x01, 0x20, 0xDD, 0x49, 0x08, 0x70, 0xDD, 0x48, 0x00, 0x88, 0x40, 0x1C, - 0xDB, 0x49, 0x08, 0x80, 0x36, 0xE0, 0xD9, 0x48, 0x00, 0x78, 0x02, 0x28, 0x32, 0xD1, 0x00, 0x20, - 0xD6, 0x49, 0x08, 0x70, 0xD6, 0x49, 0x08, 0x80, 0x2C, 0xE0, 0xD3, 0x48, 0x00, 0x78, 0x81, 0x00, - 0x40, 0x18, 0x40, 0x1D, 0xCF, 0x49, 0x09, 0x78, 0x88, 0x42, 0x1A, 0xDA, 0xCF, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x03, 0xD0, 0xCD, 0x48, 0x00, 0x78, 0x02, 0x28, 0x08, 0xD1, 0x02, 0x20, 0xCB, 0x49, - 0x08, 0x70, 0xCB, 0x48, 0x00, 0x88, 0x40, 0x1C, 0xC9, 0x49, 0x08, 0x80, 0x12, 0xE0, 0xC7, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x0E, 0xD1, 0x00, 0x20, 0xC4, 0x49, 0x08, 0x70, 0xC4, 0x49, 0x08, 0x80, - 0x08, 0xE0, 0xC3, 0x48, 0x00, 0x88, 0x00, 0x28, 0x04, 0xDD, 0xC1, 0x48, 0x00, 0x88, 0x80, 0x1E, - 0xBF, 0x49, 0x08, 0x80, 0xBE, 0x48, 0x00, 0x88, 0xFF, 0x21, 0x2D, 0x31, 0x88, 0x42, 0x05, 0xDD, - 0x01, 0x20, 0xB7, 0x49, 0x08, 0x70, 0x00, 0x20, 0xB9, 0x49, 0x08, 0x80, 0xB4, 0x48, 0x00, 0x78, - 0x00, 0xE0, 0xCD, 0xE0, 0x01, 0x28, 0x12, 0xD1, 0xB5, 0x48, 0x00, 0x88, 0x40, 0x1C, 0xB4, 0x49, - 0x08, 0x80, 0xB4, 0x48, 0x00, 0x78, 0x00, 0x28, 0x01, 0xD0, 0x00, 0x20, 0x08, 0x80, 0xB0, 0x48, - 0x00, 0x88, 0x50, 0x28, 0x03, 0xDD, 0x02, 0x20, 0xA7, 0x49, 0x08, 0x70, 0x80, 0xE7, 0x9D, 0x48, - 0x00, 0x78, 0x01, 0x28, 0x13, 0xD1, 0xAC, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0F, 0xD1, 0x9F, 0x49, - 0x08, 0x5E, 0xA0, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0xA8, 0x49, 0x09, 0x78, 0x88, 0x42, - 0x05, 0xDD, 0x01, 0x20, 0xA4, 0x49, 0x08, 0x70, 0xA5, 0x48, 0xA6, 0x49, 0x08, 0x80, 0x97, 0x4B, - 0x00, 0x22, 0x9A, 0x5E, 0x97, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0x12, 0x1B, 0x94, 0x4B, 0x1B, 0x78, - 0x5B, 0x00, 0x9A, 0x42, 0x7E, 0xDA, 0xA0, 0x4A, 0x11, 0x78, 0xCA, 0x17, 0x92, 0x0F, 0x52, 0x18, - 0x92, 0x10, 0x8E, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0B, 0xDA, 0x9A, 0x4A, 0x10, 0x78, - 0xC2, 0x17, 0x92, 0x0F, 0x12, 0x18, 0x92, 0x10, 0x52, 0x42, 0x8A, 0x4B, 0x00, 0x24, 0x1C, 0x5F, - 0xA2, 0x42, 0x07, 0xDC, 0x95, 0x4A, 0x12, 0x68, 0x64, 0x2A, 0x03, 0xDB, 0x7D, 0x4A, 0x12, 0x78, - 0x01, 0x2A, 0x64, 0xD1, 0x8F, 0x48, 0x00, 0x88, 0x79, 0x49, 0x09, 0x88, 0x40, 0x1A, 0x00, 0xB2, - 0x8C, 0x49, 0x08, 0x80, 0x88, 0x48, 0x00, 0x78, 0x01, 0x28, 0x07, 0xD1, 0x74, 0x48, 0x00, 0x88, - 0xC0, 0x00, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x86, 0x49, 0x08, 0x80, 0x85, 0x48, 0x00, 0x21, - 0x41, 0x5E, 0x00, 0x29, 0x02, 0xDC, 0x01, 0x20, 0x85, 0x49, 0x08, 0x70, 0x84, 0x48, 0x00, 0x78, - 0x01, 0x28, 0x55, 0xD1, 0x71, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x72, 0x49, 0x00, 0x22, 0x8A, 0x5E, - 0x80, 0x1A, 0x80, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x6D, 0x49, 0x09, 0x78, 0x49, 0x10, - 0x88, 0x42, 0x0C, 0xDD, 0x7C, 0x48, 0x77, 0x49, 0x08, 0x80, 0x69, 0x48, 0x00, 0x78, 0x40, 0x10, - 0x78, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x76, 0x49, 0x08, 0x80, 0x1C, 0xE0, 0x63, 0x49, - 0x00, 0x20, 0x08, 0x5E, 0x63, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x71, 0x49, 0x00, 0x22, - 0x8A, 0x5E, 0x80, 0x1A, 0x5E, 0x49, 0x09, 0x78, 0x49, 0x10, 0x49, 0x42, 0x88, 0x42, 0x0B, 0xDA, - 0x6D, 0x48, 0x68, 0x49, 0x08, 0x80, 0x5A, 0x48, 0x00, 0x78, 0x40, 0x10, 0x69, 0x49, 0x09, 0x88, - 0x08, 0x1A, 0x00, 0xB2, 0x67, 0x49, 0x08, 0x80, 0x62, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, - 0x16, 0xDC, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x20, 0x53, 0x49, 0x08, 0x70, 0xD8, 0xE6, 0x5E, 0x49, - 0x08, 0x78, 0x4E, 0x4A, 0x00, 0x21, 0x51, 0x5E, 0x4E, 0x4A, 0x00, 0x23, 0xD3, 0x5E, 0xC9, 0x1A, - 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x91, 0x42, 0x02, 0xDA, 0x55, 0x48, 0x55, 0x49, 0x08, 0x80, - 0x4A, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0x41, 0x48, 0x00, 0x78, 0x01, 0x28, 0x71, 0xD1, - 0x50, 0x48, 0x00, 0x88, 0x3A, 0x49, 0x09, 0x88, 0x40, 0x1A, 0x00, 0xB2, 0x4D, 0x49, 0x08, 0x80, - 0x3E, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x3E, 0x49, 0x09, 0x78, 0x88, 0x42, 0x07, 0xDC, 0x3C, 0x48, - 0x00, 0x78, 0x40, 0x42, 0x3B, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, 0x08, 0xDD, 0x30, 0x48, - 0x00, 0x88, 0x40, 0x00, 0x43, 0x49, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x41, 0x49, 0x08, 0x80, - 0x40, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x02, 0xDC, 0x01, 0x20, 0x40, 0x49, 0x08, 0x70, - 0x3F, 0x48, 0x00, 0x78, 0x01, 0x28, 0x46, 0xD1, 0x36, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, - 0x3E, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0x64, 0x20, 0x36, 0x49, 0x08, 0x80, 0x7B, 0xE0, - 0x26, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x37, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x24, 0x49, - 0x09, 0x78, 0x88, 0x42, 0x08, 0xDD, 0x2E, 0x48, 0x2E, 0x49, 0x08, 0x80, 0x1F, 0x49, 0x00, 0x20, - 0x08, 0x5E, 0x30, 0x49, 0x08, 0x80, 0x67, 0xE0, 0x1C, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x2D, 0x49, - 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x1A, 0x49, 0x09, 0x78, 0x49, 0x10, 0x88, 0x42, 0x08, 0xDD, - 0x29, 0x48, 0x24, 0x49, 0x08, 0x80, 0x15, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x25, 0x49, 0x08, 0x80, - 0x52, 0xE0, 0x12, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x22, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, - 0x0F, 0x49, 0x09, 0x78, 0x49, 0x42, 0x88, 0x42, 0x46, 0xDA, 0x64, 0x20, 0x19, 0x49, 0x08, 0x80, - 0x0A, 0x49, 0x3D, 0xE0, 0xC0, 0xE0, 0x48, 0xE0, 0xEE, 0x00, 0x00, 0x20, 0xF0, 0x00, 0x00, 0x20, - 0xC0, 0x00, 0x00, 0x20, 0x0B, 0x01, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, 0xEF, 0x00, 0x00, 0x20, - 0x14, 0x01, 0x00, 0x20, 0x96, 0x00, 0x00, 0x20, 0x98, 0x00, 0x00, 0x20, 0x88, 0x01, 0x00, 0x20, - 0x4C, 0x01, 0x00, 0x20, 0x86, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x0A, 0x01, 0x00, 0x20, - 0x09, 0x01, 0x00, 0x20, 0x05, 0x01, 0x00, 0x20, 0x04, 0x01, 0x00, 0x20, 0x08, 0x01, 0x00, 0x20, - 0x06, 0x01, 0x00, 0x20, 0x39, 0x01, 0x00, 0x20, 0x03, 0x01, 0x00, 0x20, 0x4B, 0x01, 0x00, 0x20, - 0x98, 0x3A, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x20, 0x15, 0x01, 0x00, 0x20, 0x10, 0x01, 0x00, 0x20, - 0xFF, 0x00, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x20, 0xB8, 0x0B, 0x00, 0x00, 0x38, 0x01, 0x00, 0x20, - 0x00, 0x20, 0x08, 0x5E, 0x53, 0x49, 0x08, 0x80, 0x53, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, - 0x03, 0xDC, 0x03, 0x20, 0x51, 0x49, 0x08, 0x70, 0x02, 0xE6, 0x51, 0x48, 0x00, 0x78, 0x01, 0x28, - 0x11, 0xD1, 0x50, 0x48, 0x00, 0x88, 0x50, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x4D, 0x49, - 0x08, 0x80, 0x00, 0x20, 0x08, 0x5E, 0x4D, 0x49, 0x88, 0x42, 0x04, 0xDB, 0x00, 0x20, 0x48, 0x49, - 0x08, 0x70, 0x4B, 0x49, 0x08, 0x70, 0x4B, 0x48, 0x00, 0x68, 0x81, 0x00, 0x40, 0x18, 0x4A, 0x49, - 0x09, 0x78, 0x40, 0x18, 0x49, 0x49, 0x09, 0x68, 0x88, 0x42, 0x11, 0xDA, 0x48, 0x48, 0x00, 0x88, - 0x41, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x45, 0x49, 0x08, 0x80, 0x00, 0x20, 0x08, 0x5E, - 0xFF, 0x21, 0xF5, 0x31, 0x88, 0x42, 0x06, 0xDB, 0x04, 0x20, 0x38, 0x49, 0x08, 0x70, 0xCF, 0xE5, - 0x00, 0x20, 0x3F, 0x49, 0x08, 0x80, 0x3F, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, 0x3E, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x4A, 0xD0, 0x3D, 0x48, 0x00, 0x88, 0x3D, 0x49, 0x09, 0x88, 0x88, 0x42, - 0x33, 0xD1, 0x3C, 0x48, 0x00, 0x21, 0x41, 0x56, 0x0A, 0x29, 0x04, 0xDA, 0x00, 0x78, 0x40, 0x1C, - 0x40, 0xB2, 0x38, 0x49, 0x08, 0x70, 0x38, 0x48, 0x00, 0x88, 0x2B, 0x49, 0x09, 0x88, 0x40, 0x18, - 0x00, 0xB2, 0x35, 0x49, 0x08, 0x80, 0x26, 0x48, 0x00, 0x78, 0x01, 0x28, 0x07, 0xD1, 0x26, 0x48, - 0x00, 0x88, 0x80, 0x00, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x2F, 0x49, 0x08, 0x80, 0x2E, 0x49, - 0x00, 0x20, 0x08, 0x5E, 0x2D, 0x49, 0x88, 0x42, 0x32, 0xDB, 0x1D, 0x48, 0x00, 0x78, 0x01, 0x28, - 0x04, 0xD1, 0x1F, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x1D, 0x49, 0x08, 0x70, 0x00, 0x20, 0x26, 0x49, - 0x08, 0x80, 0x05, 0x20, 0x15, 0x49, 0x08, 0x70, 0x22, 0xE0, 0x22, 0x48, 0x00, 0x21, 0x41, 0x56, - 0x00, 0x29, 0x04, 0xDD, 0x00, 0x78, 0x40, 0x1E, 0x40, 0xB2, 0x1E, 0x49, 0x08, 0x70, 0x1D, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x14, 0xD1, 0x1C, 0x49, 0x08, 0x80, 0x11, 0xE0, 0x1A, 0x48, 0x00, 0x21, - 0x41, 0x5E, 0x00, 0x29, 0x09, 0xDD, 0x0C, 0x48, 0x00, 0x88, 0x80, 0x00, 0x16, 0x49, 0x09, 0x88, - 0x08, 0x1A, 0x00, 0xB2, 0x14, 0x49, 0x08, 0x80, 0x02, 0xE0, 0x00, 0x20, 0x12, 0x49, 0x08, 0x80, - 0x66, 0xE5, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x20, 0xFA, 0x00, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20, 0x30, 0x75, 0x00, 0x00, - 0x01, 0x01, 0x00, 0x20, 0xE4, 0x00, 0x00, 0x20, 0x4C, 0x01, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, - 0xF4, 0x00, 0x00, 0x20, 0x39, 0x01, 0x00, 0x20, 0x38, 0x01, 0x00, 0x20, 0x96, 0x00, 0x00, 0x20, - 0x98, 0x00, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, - 0xF0, 0xB5, 0x1B, 0x4A, 0x41, 0x00, 0x52, 0x5E, 0x19, 0x4E, 0x13, 0x46, 0x09, 0x33, 0x10, 0x36, - 0x13, 0x2B, 0x03, 0xD2, 0x00, 0x23, 0x17, 0x4C, 0x73, 0x52, 0x23, 0x54, 0x01, 0x23, 0x15, 0x4D, - 0x83, 0x40, 0x24, 0x3D, 0x2C, 0x7A, 0x1F, 0x46, 0x27, 0x42, 0x19, 0xD1, 0x70, 0x5E, 0x19, 0x23, - 0xDB, 0x01, 0x98, 0x42, 0x01, 0xDD, 0x00, 0x2A, 0x05, 0xDC, 0xFF, 0x23, 0x01, 0x33, 0x98, 0x42, - 0x0D, 0xDD, 0x00, 0x2A, 0x0B, 0xDA, 0x0A, 0x4A, 0x10, 0x3A, 0x13, 0x46, 0x10, 0x3B, 0x50, 0x5A, - 0x5B, 0x5A, 0xC0, 0x18, 0x00, 0x04, 0x40, 0x0C, 0x50, 0x52, 0x10, 0x20, 0xE8, 0x71, 0xF0, 0xBD, - 0x00, 0x22, 0x72, 0x52, 0x03, 0x49, 0x9C, 0x43, 0x0A, 0x54, 0x2C, 0x72, 0xF0, 0xBD, 0x00, 0x00, - 0xB8, 0x1A, 0x00, 0x20, 0xB4, 0x03, 0x00, 0x20, 0x00, 0xB5, 0x85, 0xB0, 0x25, 0x48, 0x00, 0x78, - 0x02, 0x28, 0x45, 0xDA, 0x24, 0x48, 0x00, 0x78, 0x00, 0x28, 0x41, 0xDD, 0xFF, 0xF7, 0xEE, 0xFB, - 0x00, 0x28, 0x3A, 0xD0, 0x20, 0x48, 0x00, 0x78, 0x04, 0x28, 0x19, 0xD1, 0x1F, 0x48, 0x00, 0x78, - 0x03, 0x28, 0x10, 0xDA, 0x01, 0x20, 0x1E, 0x49, 0x08, 0x70, 0x1C, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x01, 0xD0, 0x01, 0x20, 0x00, 0xE0, 0x00, 0x20, 0x1A, 0x49, 0x09, 0x88, 0x48, 0x43, 0x00, 0xB2, - 0x18, 0x49, 0x08, 0x80, 0x04, 0xE0, 0x00, 0x20, 0x15, 0x49, 0x08, 0x70, 0x13, 0x49, 0x08, 0x70, - 0x64, 0x20, 0x15, 0x49, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, - 0x0A, 0x46, 0x11, 0x49, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xFF, 0x21, 0x9F, 0x31, 0xA0, 0x20, - 0x0D, 0x4B, 0xFA, 0xF7, 0x51, 0xFC, 0x01, 0x20, 0xF7, 0xF7, 0xEE, 0xFE, 0x00, 0xF0, 0xCC, 0xF8, - 0x0A, 0x20, 0xF7, 0xF7, 0xE9, 0xFE, 0xF7, 0xF7, 0x37, 0xF8, 0x00, 0x20, 0x02, 0x49, 0x08, 0x70, - 0x05, 0xB0, 0x00, 0xBD, 0xA9, 0x00, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, - 0x00, 0x01, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x20, 0xA4, 0x05, 0x00, 0x20, 0x10, 0xB5, 0x01, 0x20, - 0xFC, 0xF7, 0xA4, 0xFE, 0x59, 0x20, 0x10, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, - 0x08, 0x60, 0x0E, 0x48, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x0B, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, 0x88, 0x43, 0x08, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, - 0x40, 0x21, 0x88, 0x43, 0x05, 0x49, 0x08, 0x60, 0x00, 0x20, 0x03, 0x49, 0x08, 0x60, 0x01, 0x20, - 0xFC, 0xF7, 0xA2, 0xFE, 0x10, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, - 0x01, 0x20, 0x01, 0x49, 0x08, 0x70, 0x70, 0x47, 0xA8, 0x00, 0x00, 0x20, 0x00, 0x20, 0x11, 0x49, - 0x08, 0x70, 0x59, 0x20, 0x10, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, - 0x0E, 0x48, 0x00, 0x68, 0x08, 0x21, 0x88, 0x43, 0x08, 0x30, 0x0C, 0x49, 0x08, 0x60, 0x0C, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x09, 0xD0, 0x00, 0x20, 0x09, 0x49, 0x08, 0x70, 0x07, 0x48, 0x00, 0x68, - 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x05, 0x49, 0x08, 0x60, 0x00, 0x20, 0x02, 0x49, 0x08, 0x60, - 0x70, 0x47, 0x00, 0x00, 0xA7, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, - 0xA8, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x04, 0x46, 0x01, 0x20, 0xFC, 0xF7, 0x47, 0xFE, 0x01, 0x21, - 0x08, 0x46, 0xFC, 0xF7, 0x75, 0xFE, 0x59, 0x20, 0x24, 0x49, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, - 0x88, 0x20, 0x08, 0x60, 0x22, 0x48, 0x80, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x20, 0x49, - 0x88, 0x60, 0x08, 0x46, 0x40, 0x69, 0x80, 0x08, 0x80, 0x00, 0xC0, 0x1C, 0x48, 0x61, 0x1D, 0x48, - 0x01, 0x68, 0x07, 0x20, 0x00, 0x02, 0x81, 0x43, 0x20, 0x02, 0x07, 0x22, 0x12, 0x02, 0x10, 0x40, - 0x01, 0x43, 0x18, 0x48, 0x01, 0x60, 0x00, 0x68, 0x02, 0x21, 0x88, 0x43, 0x80, 0x1C, 0x15, 0x49, - 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x11, 0x49, 0x08, 0x60, - 0x08, 0x46, 0x00, 0x68, 0x40, 0x08, 0x40, 0x00, 0x40, 0x1C, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, - 0x40, 0x21, 0x88, 0x43, 0x40, 0x30, 0x0B, 0x49, 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x80, 0x21, - 0x88, 0x43, 0x80, 0x30, 0x07, 0x49, 0x08, 0x60, 0xFF, 0xF7, 0x82, 0xFF, 0x00, 0x20, 0x03, 0x49, - 0x08, 0x60, 0x01, 0x20, 0xFC, 0xF7, 0x18, 0xFE, 0x10, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, - 0x00, 0x02, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, 0x00, 0xB5, 0x87, 0xB0, 0x0B, 0xA0, 0x00, 0x68, - 0x06, 0x90, 0x00, 0x20, 0x05, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, - 0x0A, 0x46, 0x05, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x0B, 0x21, 0x49, 0x02, 0xA0, 0x20, - 0x06, 0xAB, 0xFA, 0xF7, 0x69, 0xFB, 0x07, 0xB0, 0x00, 0xBD, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x70, 0xB5, 0x04, 0x46, 0x0B, 0x46, 0x00, 0x25, 0x02, 0xE0, 0x5E, 0x5D, 0x66, 0x55, 0x6D, 0x1C, - 0x95, 0x42, 0xFA, 0xDB, 0x70, 0xBD, 0x37, 0xB5, 0x82, 0xB0, 0x05, 0x46, 0x00, 0x24, 0x13, 0xE0, - 0xF7, 0xF7, 0xDE, 0xFD, 0x04, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x29, 0x46, 0xA0, 0x20, 0x03, 0xAB, - 0xFA, 0xF7, 0x38, 0xFE, 0x01, 0x28, 0x00, 0xD1, 0x07, 0xE0, 0x20, 0x46, 0x64, 0x1C, 0x7D, 0x21, - 0xC9, 0x00, 0x88, 0x42, 0x00, 0xD9, 0x00, 0xE0, 0xEA, 0xE7, 0x00, 0xBF, 0x05, 0xB0, 0x30, 0xBD, + 0x14, 0x98, 0x81, 0x42, 0xD5, 0xDB, 0x2C, 0xE0, 0x00, 0x22, 0x11, 0x46, 0x26, 0xE0, 0x16, 0x4F, + 0x13, 0x98, 0x3F, 0x6E, 0x4D, 0x00, 0x96, 0x00, 0x40, 0x5F, 0xBE, 0x59, 0x52, 0x1C, 0x80, 0x1B, + 0x10, 0x26, 0xA6, 0x5F, 0xB0, 0x42, 0x01, 0xDD, 0x20, 0x82, 0x04, 0xE0, 0x0E, 0x26, 0xA6, 0x5F, + 0xB0, 0x42, 0x00, 0xDA, 0xE0, 0x81, 0x0C, 0x4E, 0x80, 0x3E, 0x36, 0x7D, 0xB0, 0x42, 0x04, 0xDD, + 0x0B, 0x4F, 0x3E, 0x68, 0x36, 0x18, 0x3E, 0x60, 0x05, 0xE0, 0x76, 0x42, 0xB0, 0x42, 0x02, 0xDA, + 0x1E, 0x68, 0x36, 0x1A, 0x1E, 0x60, 0x13, 0x9E, 0x49, 0x1C, 0x70, 0x53, 0x14, 0x98, 0x81, 0x42, + 0xD5, 0xDB, 0x00, 0x20, 0x15, 0xB0, 0xF0, 0xBD, 0xA4, 0x01, 0x00, 0x20, 0xD4, 0x00, 0x00, 0x20, + 0xD0, 0x00, 0x00, 0x20, 0xF1, 0xB5, 0x30, 0x48, 0x80, 0x79, 0xFF, 0x28, 0x5B, 0xD0, 0x00, 0x9E, + 0x00, 0x25, 0x28, 0x46, 0xFA, 0xF7, 0x64, 0xFE, 0x04, 0x1E, 0x1E, 0xDB, 0x2A, 0x4A, 0x14, 0x32, + 0x10, 0x5D, 0x01, 0x06, 0x19, 0xD5, 0x17, 0x46, 0x08, 0x37, 0x40, 0x06, 0x39, 0x5D, 0x40, 0x0E, + 0x01, 0x22, 0xF9, 0xF7, 0xBB, 0xF9, 0xF0, 0x07, 0x0F, 0xD1, 0x23, 0x48, 0x39, 0x5D, 0x00, 0x78, + 0x00, 0x28, 0x22, 0x48, 0x00, 0x5D, 0x04, 0xD0, 0x40, 0x06, 0x40, 0x0E, 0xF8, 0xF7, 0x6C, 0xFF, + 0x03, 0xE0, 0x40, 0x06, 0x40, 0x0E, 0xF9, 0xF7, 0xE3, 0xF9, 0x6D, 0x1C, 0xED, 0xB2, 0x76, 0x08, + 0x08, 0x2D, 0xD6, 0xD3, 0x00, 0x9D, 0x00, 0x26, 0x30, 0x46, 0xFA, 0xF7, 0x39, 0xFE, 0x04, 0x1E, + 0x1A, 0xDB, 0x16, 0x48, 0x00, 0x5D, 0x01, 0x06, 0x16, 0xD5, 0xE9, 0x07, 0x14, 0xD0, 0x12, 0x4F, + 0x39, 0x78, 0x00, 0x29, 0x12, 0x49, 0x09, 0x5D, 0x04, 0xD0, 0x40, 0x06, 0x40, 0x0E, 0xF9, 0xF7, + 0xC7, 0xF9, 0x03, 0xE0, 0x40, 0x06, 0x40, 0x0E, 0xF8, 0xF7, 0x46, 0xFF, 0x39, 0x78, 0x60, 0x00, + 0x40, 0x18, 0xB4, 0x30, 0xFE, 0xF7, 0x40, 0xF9, 0x76, 0x1C, 0xF6, 0xB2, 0x6D, 0x08, 0x08, 0x2E, + 0xDA, 0xD3, 0x00, 0x98, 0x00, 0x28, 0x01, 0xD1, 0xBC, 0x20, 0x02, 0xE0, 0xFF, 0x28, 0x02, 0xD1, + 0xBD, 0x20, 0xFE, 0xF7, 0x31, 0xF9, 0xF8, 0xBD, 0x80, 0x03, 0x00, 0x20, 0x94, 0x03, 0x00, 0x20, + 0x9C, 0x03, 0x00, 0x20, 0x04, 0x49, 0x8A, 0x7E, 0x04, 0x49, 0x50, 0x43, 0x48, 0x61, 0x00, 0x20, + 0x88, 0x61, 0x05, 0x20, 0x08, 0x61, 0x70, 0x47, 0x1C, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xE0, + 0x10, 0xB5, 0xFC, 0xF7, 0xCF, 0xF8, 0x00, 0x20, 0xFE, 0xF7, 0xF4, 0xFB, 0x11, 0x4C, 0x00, 0x20, + 0x20, 0x73, 0x60, 0x73, 0xA0, 0x73, 0xE1, 0x7E, 0xE1, 0x85, 0xE0, 0x72, 0xE0, 0x70, 0x20, 0x71, + 0x20, 0x76, 0xA0, 0x72, 0x20, 0x86, 0xE0, 0x73, 0x60, 0x74, 0x0B, 0x4A, 0x02, 0x21, 0x11, 0x70, + 0x0A, 0x49, 0x08, 0x80, 0xE0, 0x7D, 0x00, 0x28, 0x08, 0xD1, 0x00, 0xF0, 0xCD, 0xFE, 0x01, 0x20, + 0xE0, 0x75, 0xE0, 0x74, 0x60, 0x71, 0x02, 0x20, 0x00, 0xF0, 0x08, 0xFF, 0x04, 0x48, 0xFF, 0xF7, + 0xC9, 0xFF, 0x10, 0xBD, 0x1C, 0x00, 0x00, 0x20, 0x1C, 0x02, 0x00, 0x20, 0x1A, 0x02, 0x00, 0x20, + 0xA0, 0x86, 0x01, 0x00, 0x70, 0xB5, 0x20, 0x48, 0x00, 0x69, 0x45, 0x07, 0x6D, 0x0F, 0x05, 0x2D, + 0x00, 0xD9, 0x04, 0x25, 0x02, 0x2D, 0x03, 0xD0, 0xA8, 0x00, 0x1C, 0x49, 0x0C, 0x58, 0x1E, 0xE0, + 0x19, 0x48, 0x00, 0x6A, 0x00, 0x04, 0x86, 0x0F, 0x01, 0x2E, 0x00, 0xD9, 0x76, 0x1E, 0x16, 0x4A, + 0x12, 0x6A, 0x12, 0x03, 0xD2, 0x0F, 0x01, 0xD0, 0x15, 0x4A, 0x00, 0xE0, 0x15, 0x4A, 0x12, 0x4B, + 0x1B, 0x6A, 0xDB, 0x05, 0xDB, 0x0D, 0x9B, 0x1C, 0x10, 0x46, 0x58, 0x43, 0x0E, 0x4A, 0x12, 0x6A, + 0x92, 0x04, 0xD2, 0x0E, 0x91, 0x1C, 0xF6, 0xF7, 0xA9, 0xFE, 0xF0, 0x40, 0x04, 0x46, 0x0A, 0x48, + 0x80, 0x69, 0x00, 0x07, 0x00, 0x0F, 0x41, 0x1C, 0x20, 0x46, 0xF6, 0xF7, 0x9F, 0xFE, 0x0A, 0x49, + 0x08, 0x60, 0x0A, 0x49, 0x08, 0x48, 0x00, 0x68, 0x4A, 0x10, 0x80, 0x18, 0xF6, 0xF7, 0x96, 0xFE, + 0x07, 0x49, 0x08, 0x60, 0x70, 0xBD, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0x08, 0x00, 0x00, 0x20, + 0x00, 0x80, 0x51, 0x01, 0x00, 0x1B, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x42, 0x0F, 0x00, + 0x04, 0x00, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xF8, 0xB5, 0x28, 0x4A, 0x00, 0x24, 0x26, 0x48, + 0x13, 0x46, 0x44, 0x72, 0xC4, 0x71, 0xC4, 0x81, 0x15, 0x46, 0x16, 0x46, 0x22, 0x4F, 0x04, 0x72, + 0x10, 0x33, 0x20, 0x35, 0x30, 0x36, 0x20, 0x46, 0x2C, 0x37, 0x41, 0x00, 0x54, 0x52, 0x5C, 0x52, + 0x6C, 0x52, 0x74, 0x52, 0x1C, 0x49, 0x24, 0x31, 0x0C, 0x54, 0x1D, 0x49, 0x09, 0x18, 0xA0, 0x31, + 0x09, 0x79, 0x09, 0x09, 0x49, 0x1C, 0x39, 0x54, 0x40, 0x1C, 0xC0, 0xB2, 0x08, 0x28, 0xEC, 0xD3, + 0x17, 0x4D, 0xA0, 0x35, 0x28, 0x7B, 0x00, 0x07, 0x00, 0x0F, 0x03, 0x28, 0x23, 0xD1, 0x12, 0x4E, + 0x74, 0x70, 0x28, 0x7B, 0x40, 0x06, 0xC0, 0x0F, 0x30, 0x70, 0xE8, 0x78, 0xB0, 0x70, 0x40, 0x00, + 0x03, 0x21, 0xF6, 0xF7, 0x4B, 0xFE, 0xF0, 0x70, 0x28, 0x7C, 0x00, 0x07, 0x00, 0x0F, 0xC0, 0xB2, + 0x81, 0x00, 0x40, 0x18, 0x0F, 0x30, 0x30, 0x71, 0x28, 0x7B, 0x80, 0x06, 0x80, 0x0F, 0xB0, 0x71, + 0x28, 0x7B, 0x00, 0x06, 0x01, 0xD4, 0xFF, 0x20, 0xB0, 0x71, 0x00, 0x20, 0xFF, 0xF7, 0xBA, 0xFE, + 0x74, 0x81, 0x04, 0x48, 0xB0, 0x81, 0xF8, 0xBD, 0x80, 0x03, 0x00, 0x20, 0x38, 0x1A, 0x00, 0x20, + 0xB4, 0x03, 0x00, 0x20, 0x54, 0x0B, 0x00, 0x00, 0x10, 0xB5, 0x05, 0x48, 0xC4, 0x69, 0x05, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x20, 0x46, 0x02, 0x49, 0x09, 0x68, 0x88, 0x47, 0x10, 0xBD, + 0x00, 0x00, 0x05, 0x40, 0x1C, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x05, 0x48, 0xC4, 0x69, 0x05, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x03, 0xD0, 0x20, 0x46, 0x02, 0x49, 0x09, 0x68, 0x88, 0x47, 0x10, 0xBD, + 0x00, 0x00, 0x15, 0x40, 0x20, 0x01, 0x00, 0x20, 0x10, 0xB5, 0x49, 0x48, 0x40, 0x68, 0x49, 0x49, + 0x08, 0x60, 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x08, 0x42, 0x31, 0xD0, 0x44, 0x48, 0x40, 0x69, + 0xC0, 0x07, 0xC0, 0x0F, 0x44, 0x49, 0x08, 0x60, 0x04, 0x20, 0x41, 0x49, 0x48, 0x60, 0x42, 0x48, + 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x0D, 0xD0, 0x40, 0x48, 0x00, 0x68, 0x00, 0x28, 0x75, 0xD1, + 0x01, 0x20, 0x3E, 0x49, 0x08, 0x60, 0x7D, 0x20, 0x00, 0x01, 0x39, 0x49, 0x08, 0x61, 0x0F, 0x20, + 0x08, 0x60, 0x6B, 0xE0, 0x00, 0x20, 0x39, 0x49, 0x08, 0x60, 0x3B, 0x20, 0x40, 0x01, 0x34, 0x49, + 0x08, 0x61, 0x00, 0x20, 0x36, 0x49, 0x08, 0x70, 0x36, 0x49, 0x08, 0x70, 0x30, 0x49, 0x08, 0x60, + 0x08, 0x46, 0x00, 0x68, 0x04, 0x21, 0x88, 0x43, 0x00, 0x1D, 0x2D, 0x49, 0x08, 0x60, 0x55, 0xE0, + 0x2E, 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xD1, 0x0B, 0x20, 0x29, 0x49, 0x48, 0x60, 0x4D, 0xE0, + 0x28, 0x48, 0x00, 0x68, 0x08, 0x21, 0x08, 0x42, 0x03, 0xD0, 0x08, 0x20, 0x24, 0x49, 0x48, 0x60, + 0x44, 0xE0, 0x24, 0x48, 0x00, 0x68, 0xC0, 0x07, 0xC0, 0x0F, 0x34, 0xD0, 0x20, 0x48, 0x00, 0x69, + 0x25, 0x49, 0x08, 0x60, 0x01, 0x20, 0x1E, 0x49, 0x48, 0x60, 0x23, 0x48, 0x00, 0x68, 0xC0, 0x07, + 0xC0, 0x0F, 0x08, 0xD0, 0x7D, 0x20, 0x00, 0x01, 0x08, 0x61, 0x07, 0x20, 0x1B, 0x49, 0x08, 0x60, + 0xF9, 0xF7, 0xEC, 0xFC, 0x2A, 0xE0, 0x1C, 0x48, 0x00, 0x68, 0x02, 0x21, 0x08, 0x42, 0x0A, 0xD0, + 0x1F, 0x20, 0x80, 0x01, 0x12, 0x49, 0x08, 0x61, 0x14, 0x48, 0x00, 0x68, 0x20, 0x21, 0x08, 0x43, + 0x12, 0x49, 0x08, 0x60, 0x1A, 0xE0, 0x14, 0x48, 0x00, 0x68, 0x04, 0x21, 0x08, 0x42, 0x15, 0xD0, + 0x7D, 0x20, 0x00, 0x01, 0x0A, 0x49, 0x08, 0x61, 0x0C, 0x48, 0x00, 0x68, 0x20, 0x21, 0x88, 0x43, + 0x0A, 0x49, 0x08, 0x60, 0x0A, 0xE0, 0x07, 0x48, 0x00, 0x68, 0x02, 0x21, 0x08, 0x42, 0x05, 0xD0, + 0x03, 0x48, 0xC0, 0x68, 0x09, 0x49, 0x08, 0x60, 0xF9, 0xF7, 0xAC, 0xFE, 0x10, 0xBD, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x40, 0x5C, 0x03, 0x00, 0x20, 0x58, 0x03, 0x00, 0x20, 0x60, 0x03, 0x00, 0x20, + 0x32, 0x03, 0x00, 0x20, 0x4C, 0x03, 0x00, 0x20, 0x50, 0x03, 0x00, 0x20, 0x54, 0x03, 0x00, 0x20, + 0x0E, 0xB5, 0x05, 0x20, 0xF8, 0xF7, 0x32, 0xFE, 0xE1, 0x20, 0x40, 0x02, 0x00, 0x90, 0x03, 0x20, + 0x6B, 0x46, 0x18, 0x71, 0x00, 0x20, 0x58, 0x71, 0x98, 0x71, 0xD8, 0x71, 0x01, 0x20, 0x69, 0x46, + 0x00, 0x05, 0xF9, 0xF7, 0x85, 0xFB, 0x0E, 0xBD, 0x00, 0x29, 0x05, 0xD0, 0x0B, 0x48, 0x01, 0x7F, + 0x03, 0x29, 0x01, 0xD0, 0x00, 0x21, 0x01, 0x77, 0x09, 0x48, 0x01, 0x6A, 0x42, 0x02, 0x91, 0x43, + 0x01, 0x62, 0x01, 0x6A, 0xC2, 0x01, 0x91, 0x43, 0x01, 0x62, 0x01, 0x68, 0x80, 0x22, 0x91, 0x43, + 0x01, 0x60, 0x01, 0x68, 0x52, 0x00, 0x91, 0x43, 0x01, 0x60, 0x70, 0x47, 0x1C, 0x00, 0x00, 0x20, + 0x00, 0x02, 0x00, 0x50, 0xF8, 0xB5, 0x00, 0x24, 0x25, 0x46, 0x27, 0x46, 0x45, 0x4E, 0x13, 0xE0, + 0x6D, 0x1C, 0xF8, 0xF7, 0x81, 0xFC, 0x7D, 0x20, 0xC0, 0x00, 0x85, 0x42, 0x02, 0xD1, 0xFE, 0xF7, + 0x61, 0xFE, 0x09, 0xE0, 0x19, 0x20, 0x80, 0x01, 0x85, 0x42, 0x05, 0xD1, 0x00, 0x25, 0xFB, 0xF7, + 0x8F, 0xFE, 0x7F, 0x1C, 0x07, 0x2F, 0x02, 0xDC, 0x30, 0x79, 0x01, 0x28, 0xE8, 0xD0, 0x3A, 0x48, + 0x84, 0x46, 0x00, 0x7B, 0x38, 0x4B, 0xC0, 0x06, 0x60, 0x3B, 0x80, 0x0F, 0x01, 0x28, 0x01, 0xD1, + 0x00, 0x25, 0x03, 0xE0, 0x35, 0x48, 0x01, 0x25, 0x00, 0x78, 0x18, 0x70, 0x31, 0x49, 0x48, 0x8D, + 0x58, 0x55, 0x86, 0x46, 0x6D, 0x1C, 0x00, 0x0A, 0x58, 0x55, 0x88, 0x7A, 0x6D, 0x1C, 0x01, 0x28, + 0x01, 0xD1, 0x0A, 0x20, 0x88, 0x72, 0x2E, 0x49, 0x00, 0x20, 0x09, 0x78, 0x00, 0x91, 0x39, 0xE0, + 0x01, 0x21, 0x81, 0x40, 0x72, 0x46, 0x11, 0x42, 0x32, 0xD0, 0x61, 0x46, 0x09, 0x7B, 0xC9, 0x06, + 0x89, 0x0F, 0x01, 0x29, 0x13, 0xD1, 0x27, 0x4A, 0x41, 0x00, 0x12, 0x68, 0x56, 0x5A, 0x5E, 0x55, + 0x52, 0x5A, 0x6D, 0x1C, 0x12, 0x12, 0x5A, 0x55, 0x23, 0x4A, 0x6D, 0x1C, 0x12, 0x68, 0x6E, 0x1C, + 0x57, 0x5A, 0x5F, 0x55, 0x51, 0x5A, 0x09, 0x12, 0x99, 0x55, 0xAD, 0x1C, 0x18, 0xE0, 0x1D, 0x4A, + 0x41, 0x00, 0x12, 0x68, 0x56, 0x5A, 0x36, 0x12, 0x5E, 0x55, 0x6D, 0x1C, 0x52, 0x5A, 0x5A, 0x55, + 0x19, 0x4A, 0x6D, 0x1C, 0x12, 0x68, 0x56, 0x5A, 0x36, 0x12, 0x5E, 0x55, 0x6D, 0x1C, 0x51, 0x5A, + 0x59, 0x55, 0x16, 0x49, 0x6D, 0x1C, 0x09, 0x68, 0x6E, 0x1C, 0x09, 0x5C, 0x59, 0x55, 0x35, 0x46, + 0x00, 0x99, 0x40, 0x1C, 0x88, 0x42, 0xC3, 0xDB, 0x60, 0x46, 0x00, 0x7B, 0xC0, 0x06, 0x80, 0x0F, + 0x09, 0xD1, 0x01, 0x20, 0x03, 0xE0, 0x19, 0x5C, 0x09, 0x19, 0xCC, 0xB2, 0x40, 0x1C, 0xA8, 0x42, + 0xF9, 0xDB, 0x60, 0x42, 0x58, 0x55, 0x03, 0x48, 0x01, 0x21, 0x01, 0x71, 0x00, 0x21, 0x01, 0x76, + 0xF8, 0xBD, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x14, 0x04, 0x00, 0x20, 0x41, 0x01, 0x00, 0x20, + 0x36, 0x01, 0x00, 0x20, 0xC4, 0x01, 0x00, 0x20, 0xC8, 0x01, 0x00, 0x20, 0xCC, 0x01, 0x00, 0x20, + 0x70, 0xB5, 0x1B, 0x48, 0x00, 0x24, 0x04, 0x5F, 0x1A, 0x48, 0x00, 0x26, 0x86, 0x5F, 0x1A, 0x48, + 0x00, 0x78, 0x01, 0x28, 0x00, 0xD1, 0x70, 0xBD, 0xFE, 0xF7, 0x68, 0xFE, 0x14, 0x49, 0x00, 0x20, + 0x08, 0x5E, 0xA0, 0x42, 0x03, 0xDD, 0x00, 0x20, 0x08, 0x5E, 0x00, 0x1B, 0x03, 0xE0, 0x10, 0x48, + 0x00, 0x21, 0x41, 0x5E, 0x60, 0x1A, 0x05, 0xB2, 0x10, 0x48, 0x00, 0x78, 0x85, 0x42, 0x01, 0xDD, + 0x00, 0x20, 0xE8, 0xE7, 0x0B, 0x49, 0x00, 0x20, 0x08, 0x5E, 0xB0, 0x42, 0x03, 0xDD, 0x00, 0x20, + 0x08, 0x5E, 0x80, 0x1B, 0x03, 0xE0, 0x07, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x70, 0x1A, 0x05, 0xB2, + 0x06, 0x48, 0x00, 0x78, 0x85, 0x42, 0x01, 0xDD, 0x00, 0x20, 0xD4, 0xE7, 0x01, 0x20, 0xD2, 0xE7, + 0x72, 0x01, 0x00, 0x20, 0x74, 0x01, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, + 0x00, 0x20, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, + 0x08, 0x70, 0x22, 0x48, 0x22, 0x49, 0x08, 0x60, 0x00, 0x20, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, + 0x08, 0x80, 0x22, 0x49, 0x08, 0x80, 0x22, 0x48, 0x22, 0x49, 0x08, 0x80, 0x00, 0x20, 0x22, 0x49, + 0x08, 0x80, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, + 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, + 0x08, 0x70, 0x22, 0x49, 0x08, 0x70, 0x22, 0x49, 0x08, 0x80, 0x22, 0x49, 0x08, 0x70, 0x22, 0x48, + 0x00, 0x78, 0x22, 0x49, 0x08, 0x70, 0x22, 0x48, 0x00, 0x78, 0x14, 0x21, 0x48, 0x43, 0x21, 0x49, + 0x08, 0x80, 0x21, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD0, 0x1D, 0x48, 0x00, 0x78, 0x40, 0x00, + 0x14, 0x21, 0x48, 0x43, 0x1B, 0x49, 0x08, 0x80, 0x70, 0x47, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x20, + 0xD9, 0x00, 0x00, 0x20, 0xDA, 0x00, 0x00, 0x20, 0xDB, 0x00, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, + 0xDC, 0x00, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, 0xE2, 0x00, 0x00, 0x20, 0xE4, 0x00, 0x00, 0x20, + 0x98, 0x3A, 0x00, 0x00, 0xE6, 0x00, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, 0xEA, 0x00, 0x00, 0x20, + 0xEB, 0x00, 0x00, 0x20, 0xEC, 0x00, 0x00, 0x20, 0xED, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, + 0xEF, 0x00, 0x00, 0x20, 0xF2, 0x00, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x20, 0xF5, 0x00, 0x00, 0x20, + 0xF8, 0x00, 0x00, 0x20, 0xFA, 0x00, 0x00, 0x20, 0x38, 0x01, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, + 0x34, 0x01, 0x00, 0x20, 0x02, 0x01, 0x00, 0x20, 0x2E, 0x01, 0x00, 0x20, 0x10, 0xB5, 0xFF, 0x48, + 0x00, 0x78, 0x00, 0x28, 0x07, 0xD1, 0xFE, 0x48, 0x00, 0x68, 0xFE, 0x49, 0x09, 0x88, 0x40, 0x1A, + 0xFB, 0x49, 0x08, 0x60, 0x0E, 0xE0, 0xFC, 0x48, 0x00, 0x78, 0x01, 0x28, 0x07, 0xD1, 0xF8, 0x48, + 0x00, 0x68, 0xF8, 0x49, 0x09, 0x88, 0x40, 0x1A, 0xF5, 0x49, 0x08, 0x60, 0x02, 0xE0, 0xF7, 0x48, + 0xF3, 0x49, 0x08, 0x60, 0xF2, 0x48, 0x00, 0x68, 0x00, 0x28, 0x0B, 0xDA, 0xEF, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x01, 0xD1, 0xF2, 0x49, 0x08, 0x70, 0x01, 0x20, 0xEC, 0x49, 0x08, 0x70, 0xEF, 0x48, + 0xEB, 0x49, 0x08, 0x60, 0xEF, 0x48, 0x00, 0x78, 0x00, 0x28, 0x5B, 0xD1, 0xEE, 0x48, 0x00, 0x78, + 0x81, 0x00, 0x40, 0x18, 0x40, 0x1D, 0xED, 0x49, 0x09, 0x78, 0x88, 0x42, 0x1D, 0xDA, 0xEC, 0x48, + 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, 0xEA, 0x48, 0x00, 0x78, 0x01, 0x28, 0x0B, 0xD1, 0x01, 0x20, + 0xE7, 0x49, 0x08, 0x70, 0xE7, 0x48, 0x00, 0x88, 0xDE, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, + 0xE4, 0x49, 0x08, 0x80, 0x3E, 0xE0, 0xE2, 0x48, 0x00, 0x78, 0x02, 0x28, 0x3A, 0xD1, 0x00, 0x20, + 0xDF, 0x49, 0x08, 0x70, 0xDF, 0x49, 0x08, 0x80, 0x34, 0xE0, 0xDC, 0x48, 0x00, 0x78, 0x81, 0x00, + 0x40, 0x18, 0x40, 0x1D, 0xD8, 0x49, 0x09, 0x78, 0x88, 0x42, 0x1D, 0xDA, 0xD8, 0x48, 0x00, 0x78, + 0x00, 0x28, 0x03, 0xD0, 0xD6, 0x48, 0x00, 0x78, 0x02, 0x28, 0x0B, 0xD1, 0x02, 0x20, 0xD4, 0x49, + 0x08, 0x70, 0xD4, 0x48, 0x00, 0x88, 0xCB, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0xD1, 0x49, + 0x08, 0x80, 0x17, 0xE0, 0xCE, 0x48, 0x00, 0x78, 0x01, 0x28, 0x13, 0xD1, 0x00, 0x20, 0xCC, 0x49, + 0x08, 0x70, 0xCC, 0x49, 0x08, 0x80, 0x0D, 0xE0, 0xCA, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, + 0x08, 0xDD, 0xC0, 0x48, 0x00, 0x88, 0x40, 0x00, 0xC6, 0x49, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, + 0xC4, 0x49, 0x08, 0x80, 0xC3, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x7D, 0x21, 0xC9, 0x00, 0x88, 0x42, + 0x05, 0xDD, 0x01, 0x20, 0xBB, 0x49, 0x08, 0x70, 0x00, 0x20, 0xBE, 0x49, 0x08, 0x80, 0xB9, 0x48, + 0x00, 0x78, 0x01, 0x28, 0x18, 0xD1, 0xBB, 0x48, 0x00, 0x88, 0xB2, 0x49, 0x09, 0x88, 0x40, 0x18, + 0x00, 0xB2, 0xB8, 0x49, 0x08, 0x80, 0xB8, 0x48, 0x00, 0x78, 0x00, 0x28, 0x01, 0xD0, 0x00, 0x20, + 0x08, 0x80, 0xB4, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x19, 0x21, 0x49, 0x01, 0x88, 0x42, 0x03, 0xDD, + 0x02, 0x20, 0xB2, 0x49, 0x08, 0x70, 0x10, 0xBD, 0xB1, 0x48, 0x00, 0x78, 0x01, 0x28, 0x1C, 0xD1, + 0xB0, 0x48, 0x00, 0x88, 0xB0, 0x49, 0x09, 0x88, 0x88, 0x42, 0x7E, 0xD1, 0xAF, 0x49, 0x00, 0x20, + 0x08, 0x5E, 0xAF, 0x49, 0x09, 0x78, 0x88, 0x42, 0x07, 0xDC, 0xAD, 0x48, 0x00, 0x78, 0x40, 0x42, + 0xAC, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x90, 0x42, 0x6F, 0xDD, 0xFC, 0xF7, 0x55, 0xFE, 0x00, 0x28, + 0x6B, 0xD0, 0x01, 0x20, 0xA1, 0x49, 0x08, 0x70, 0xDD, 0xE7, 0xA7, 0x48, 0x00, 0x78, 0x01, 0x28, + 0xE3, 0xD1, 0x95, 0x48, 0x00, 0x78, 0x01, 0x28, 0x13, 0xD1, 0xA4, 0x48, 0x00, 0x78, 0x00, 0x28, + 0x0F, 0xD1, 0x9E, 0x49, 0x08, 0x5E, 0x9F, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0xA0, 0x49, + 0x09, 0x78, 0x88, 0x42, 0x05, 0xDD, 0x01, 0x20, 0x9C, 0x49, 0x08, 0x70, 0x9D, 0x48, 0x9E, 0x49, + 0x08, 0x80, 0x96, 0x4B, 0x00, 0x22, 0x9A, 0x5E, 0x96, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0x12, 0x1B, + 0x93, 0x4B, 0x1B, 0x78, 0x5B, 0x00, 0x9A, 0x42, 0x7E, 0xDA, 0x98, 0x4A, 0x11, 0x78, 0xCA, 0x17, + 0x92, 0x0F, 0x52, 0x18, 0x92, 0x10, 0x8D, 0x4B, 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x0B, 0xDA, + 0x92, 0x4A, 0x10, 0x78, 0xC2, 0x17, 0x92, 0x0F, 0x12, 0x18, 0x92, 0x10, 0x52, 0x42, 0x89, 0x4B, + 0x00, 0x24, 0x1C, 0x5F, 0xA2, 0x42, 0x07, 0xDC, 0x8D, 0x4A, 0x12, 0x68, 0x64, 0x2A, 0x03, 0xDB, + 0x75, 0x4A, 0x12, 0x78, 0x01, 0x2A, 0x66, 0xD1, 0x87, 0x48, 0x00, 0x88, 0x71, 0x49, 0x09, 0x88, + 0x40, 0x1A, 0x00, 0xB2, 0x84, 0x49, 0x08, 0x80, 0x80, 0x48, 0x00, 0x78, 0x01, 0x28, 0x07, 0xD1, + 0x6C, 0x48, 0x00, 0x88, 0xC0, 0x00, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x7E, 0x49, 0x08, 0x80, + 0x7D, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x02, 0xDC, 0x01, 0x20, 0x7D, 0x49, 0x08, 0x70, + 0x7C, 0x48, 0x00, 0x78, 0x01, 0x28, 0x57, 0xD1, 0x00, 0xE0, 0x55, 0xE0, 0x6F, 0x49, 0x00, 0x20, + 0x08, 0x5E, 0x70, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x77, 0x49, 0x00, 0x22, 0x8A, 0x5E, + 0x80, 0x1A, 0x6B, 0x49, 0x09, 0x78, 0x49, 0x10, 0x88, 0x42, 0x0C, 0xDD, 0x73, 0x48, 0x6E, 0x49, + 0x08, 0x80, 0x67, 0x48, 0x00, 0x78, 0x40, 0x10, 0x6F, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, + 0x6D, 0x49, 0x08, 0x80, 0x1C, 0xE0, 0x61, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x61, 0x49, 0x00, 0x22, + 0x8A, 0x5E, 0x80, 0x1A, 0x68, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x5C, 0x49, 0x09, 0x78, + 0x49, 0x10, 0x49, 0x42, 0x88, 0x42, 0x0B, 0xDA, 0x64, 0x48, 0x5F, 0x49, 0x08, 0x80, 0x58, 0x48, + 0x00, 0x78, 0x40, 0x10, 0x60, 0x49, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x5E, 0x49, 0x08, 0x80, + 0x59, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0xE0, 0x05, 0xE0, 0x00, 0x29, 0x14, 0xDC, 0x03, 0x20, + 0x4A, 0x49, 0x08, 0x70, 0x2F, 0xE7, 0x55, 0x49, 0x08, 0x78, 0x4C, 0x4A, 0x00, 0x21, 0x51, 0x5E, + 0x4C, 0x4A, 0x00, 0x23, 0xD3, 0x5E, 0xC9, 0x1A, 0xC2, 0x0F, 0x12, 0x18, 0x52, 0x10, 0x91, 0x42, + 0x02, 0xDA, 0x4C, 0x48, 0x4C, 0x49, 0x08, 0x80, 0x47, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, + 0x3F, 0x48, 0x00, 0x78, 0x01, 0x28, 0x60, 0xD1, 0x47, 0x48, 0x00, 0x88, 0x31, 0x49, 0x09, 0x88, + 0x40, 0x1A, 0x00, 0xB2, 0x44, 0x49, 0x08, 0x80, 0x3C, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x3C, 0x49, + 0x09, 0x78, 0x88, 0x42, 0x07, 0xDC, 0x3A, 0x48, 0x00, 0x78, 0x40, 0x42, 0x39, 0x49, 0x00, 0x22, + 0x8A, 0x5E, 0x90, 0x42, 0x08, 0xDD, 0x27, 0x48, 0x00, 0x88, 0x40, 0x00, 0x3A, 0x49, 0x09, 0x88, + 0x08, 0x1A, 0x00, 0xB2, 0x38, 0x49, 0x08, 0x80, 0x37, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, + 0x02, 0xDC, 0x01, 0x20, 0x37, 0x49, 0x08, 0x70, 0x36, 0x48, 0x00, 0x78, 0x01, 0x28, 0x71, 0xD1, + 0x25, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD1, 0x35, 0x48, 0x00, 0x78, 0x00, 0x28, 0x03, 0xD0, + 0x64, 0x20, 0x2D, 0x49, 0x08, 0x80, 0x7A, 0xE0, 0x24, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x2E, 0x49, + 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x22, 0x49, 0x09, 0x78, 0x88, 0x42, 0x08, 0xDD, 0x25, 0x48, + 0x25, 0x49, 0x08, 0x80, 0x1D, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x27, 0x49, 0x08, 0x80, 0x66, 0xE0, + 0x1A, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x24, 0x49, 0x00, 0x22, 0x8A, 0x5E, 0x80, 0x1A, 0x18, 0x49, + 0x09, 0x78, 0x49, 0x10, 0x88, 0x42, 0x46, 0xDD, 0x20, 0x48, 0x1B, 0x49, 0x08, 0x80, 0x13, 0x49, + 0x00, 0x20, 0x08, 0x5E, 0x1C, 0x49, 0x08, 0x80, 0x51, 0xE0, 0xD0, 0xE0, 0xDA, 0x00, 0x00, 0x20, + 0xDC, 0x00, 0x00, 0x20, 0x4A, 0x00, 0x00, 0x20, 0xF7, 0x00, 0x00, 0x20, 0x60, 0xEA, 0x00, 0x00, + 0xDB, 0x00, 0x00, 0x20, 0xF5, 0x00, 0x00, 0x20, 0xF1, 0x00, 0x00, 0x20, 0xF0, 0x00, 0x00, 0x20, + 0xF4, 0x00, 0x00, 0x20, 0xF2, 0x00, 0x00, 0x20, 0x25, 0x01, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, + 0x00, 0x01, 0x00, 0x20, 0x46, 0x00, 0x00, 0x20, 0x48, 0x00, 0x00, 0x20, 0x74, 0x01, 0x00, 0x20, + 0x38, 0x01, 0x00, 0x20, 0x72, 0x01, 0x00, 0x20, 0xF6, 0x00, 0x00, 0x20, 0xEF, 0x00, 0x00, 0x20, + 0x37, 0x01, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, 0xE6, 0x00, 0x00, 0x20, 0x01, 0x01, 0x00, 0x20, + 0xFC, 0x00, 0x00, 0x20, 0xEB, 0x00, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, 0xB8, 0x0B, 0x00, 0x00, + 0x24, 0x01, 0x00, 0x20, 0x1C, 0xE0, 0x5C, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x5B, 0x49, 0x00, 0x22, + 0x8A, 0x5E, 0x80, 0x1A, 0x5A, 0x49, 0x09, 0x78, 0x49, 0x42, 0x88, 0x42, 0x07, 0xDA, 0x64, 0x20, + 0x58, 0x49, 0x08, 0x80, 0x54, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x54, 0x49, 0x08, 0x80, 0x55, 0x48, + 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x03, 0xDC, 0x03, 0x20, 0x53, 0x49, 0x08, 0x70, 0x5A, 0xE6, + 0x52, 0x48, 0x00, 0x78, 0x01, 0x28, 0x11, 0xD1, 0x51, 0x48, 0x00, 0x88, 0x51, 0x49, 0x09, 0x88, + 0x40, 0x18, 0x00, 0xB2, 0x4E, 0x49, 0x08, 0x80, 0x00, 0x20, 0x08, 0x5E, 0x4E, 0x49, 0x88, 0x42, + 0x04, 0xDB, 0x00, 0x20, 0x49, 0x49, 0x08, 0x70, 0x4C, 0x49, 0x08, 0x70, 0x4C, 0x48, 0x00, 0x68, + 0x81, 0x00, 0x40, 0x18, 0x42, 0x49, 0x09, 0x78, 0x40, 0x18, 0x4A, 0x49, 0x09, 0x68, 0x88, 0x42, + 0x11, 0xDA, 0x49, 0x48, 0x00, 0x88, 0x43, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x46, 0x49, + 0x08, 0x80, 0x00, 0x20, 0x08, 0x5E, 0xFF, 0x21, 0xF5, 0x31, 0x88, 0x42, 0x06, 0xDB, 0x04, 0x20, + 0x39, 0x49, 0x08, 0x70, 0x27, 0xE6, 0x00, 0x20, 0x3F, 0x49, 0x08, 0x80, 0x3F, 0x48, 0x00, 0x78, + 0x00, 0x28, 0x03, 0xD1, 0x3E, 0x48, 0x00, 0x78, 0x00, 0x28, 0x4A, 0xD0, 0x3D, 0x48, 0x00, 0x88, + 0x3D, 0x49, 0x09, 0x88, 0x88, 0x42, 0x33, 0xD1, 0x3C, 0x48, 0x00, 0x21, 0x41, 0x56, 0x0A, 0x29, + 0x04, 0xDA, 0x00, 0x78, 0x40, 0x1C, 0x40, 0xB2, 0x38, 0x49, 0x08, 0x70, 0x38, 0x48, 0x00, 0x88, + 0x2C, 0x49, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, 0x35, 0x49, 0x08, 0x80, 0x27, 0x48, 0x00, 0x78, + 0x01, 0x28, 0x07, 0xD1, 0x27, 0x48, 0x00, 0x88, 0x80, 0x00, 0x09, 0x88, 0x40, 0x18, 0x00, 0xB2, + 0x2F, 0x49, 0x08, 0x80, 0x2E, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x2E, 0x49, 0x88, 0x42, 0x32, 0xDB, + 0x1E, 0x48, 0x00, 0x78, 0x01, 0x28, 0x04, 0xD1, 0x20, 0x48, 0x00, 0x78, 0x40, 0x1C, 0x1F, 0x49, + 0x08, 0x70, 0x00, 0x20, 0x26, 0x49, 0x08, 0x80, 0x05, 0x20, 0x17, 0x49, 0x08, 0x70, 0x22, 0xE0, + 0x22, 0x48, 0x00, 0x21, 0x41, 0x56, 0x00, 0x29, 0x04, 0xDD, 0x00, 0x78, 0x40, 0x1E, 0x40, 0xB2, + 0x1E, 0x49, 0x08, 0x70, 0x1D, 0x48, 0x00, 0x78, 0x00, 0x28, 0x14, 0xD1, 0x1C, 0x49, 0x08, 0x80, + 0x11, 0xE0, 0x1B, 0x48, 0x00, 0x21, 0x41, 0x5E, 0x00, 0x29, 0x09, 0xDD, 0x0D, 0x48, 0x00, 0x88, + 0x80, 0x00, 0x17, 0x49, 0x09, 0x88, 0x08, 0x1A, 0x00, 0xB2, 0x15, 0x49, 0x08, 0x80, 0x02, 0xE0, + 0x00, 0x20, 0x13, 0x49, 0x08, 0x80, 0xBE, 0xE5, 0x74, 0x01, 0x00, 0x20, 0xE8, 0x00, 0x00, 0x20, + 0x38, 0x01, 0x00, 0x20, 0xE6, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, 0xEC, 0x00, 0x00, 0x20, + 0xE4, 0x00, 0x00, 0x20, 0x4A, 0x00, 0x00, 0x20, 0x30, 0x75, 0x00, 0x00, 0xED, 0x00, 0x00, 0x20, + 0xD0, 0x00, 0x00, 0x20, 0xD4, 0x00, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x20, 0x25, 0x01, 0x00, 0x20, + 0x24, 0x01, 0x00, 0x20, 0x46, 0x00, 0x00, 0x20, 0x48, 0x00, 0x00, 0x20, 0xEA, 0x00, 0x00, 0x20, + 0xE2, 0x00, 0x00, 0x20, 0x98, 0x3A, 0x00, 0x00, 0xF0, 0xB5, 0x1B, 0x4A, 0x41, 0x00, 0x52, 0x5E, + 0x19, 0x4E, 0x13, 0x46, 0x09, 0x33, 0x10, 0x36, 0x13, 0x2B, 0x03, 0xD2, 0x00, 0x23, 0x17, 0x4C, + 0x73, 0x52, 0x23, 0x54, 0x01, 0x23, 0x15, 0x4D, 0x83, 0x40, 0x24, 0x3D, 0x2C, 0x7A, 0x1F, 0x46, + 0x27, 0x42, 0x19, 0xD1, 0x70, 0x5E, 0x19, 0x23, 0xDB, 0x01, 0x98, 0x42, 0x01, 0xDD, 0x00, 0x2A, + 0x05, 0xDC, 0xFF, 0x23, 0x01, 0x33, 0x98, 0x42, 0x0D, 0xDD, 0x00, 0x2A, 0x0B, 0xDA, 0x0A, 0x4A, + 0x10, 0x3A, 0x13, 0x46, 0x10, 0x3B, 0x50, 0x5A, 0x5B, 0x5A, 0xC0, 0x18, 0x00, 0x04, 0x40, 0x0C, + 0x50, 0x52, 0x10, 0x20, 0xE8, 0x71, 0xF0, 0xBD, 0x00, 0x22, 0x72, 0x52, 0x03, 0x49, 0x9C, 0x43, + 0x0A, 0x54, 0x2C, 0x72, 0xF0, 0xBD, 0x00, 0x00, 0x58, 0x1A, 0x00, 0x20, 0xA4, 0x03, 0x00, 0x20, + 0x00, 0xB5, 0x85, 0xB0, 0x28, 0x48, 0x00, 0x78, 0x02, 0x28, 0x4A, 0xDA, 0x27, 0x48, 0x00, 0x78, + 0x00, 0x28, 0x46, 0xDD, 0xFF, 0xF7, 0xDC, 0xFB, 0x00, 0x28, 0x3F, 0xD0, 0x23, 0x48, 0x00, 0x78, + 0x04, 0x28, 0x19, 0xD1, 0x22, 0x48, 0x00, 0x78, 0x03, 0x28, 0x10, 0xDA, 0x01, 0x20, 0x21, 0x49, + 0x08, 0x70, 0x1F, 0x48, 0x00, 0x78, 0x00, 0x28, 0x01, 0xD0, 0x01, 0x20, 0x00, 0xE0, 0x00, 0x20, + 0x1D, 0x49, 0x09, 0x88, 0x48, 0x43, 0x00, 0xB2, 0x1B, 0x49, 0x08, 0x80, 0x04, 0xE0, 0x00, 0x20, + 0x18, 0x49, 0x08, 0x70, 0x16, 0x49, 0x08, 0x70, 0x18, 0x49, 0x00, 0x20, 0x08, 0x5E, 0x18, 0x49, + 0x08, 0x80, 0x64, 0x20, 0x17, 0x49, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, + 0x03, 0x91, 0x0A, 0x46, 0x13, 0x49, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xFF, 0x21, 0x9F, 0x31, + 0xA0, 0x20, 0x10, 0x4B, 0xFA, 0xF7, 0xB4, 0xFC, 0x01, 0x20, 0xF7, 0xF7, 0x9F, 0xFF, 0x00, 0xF0, + 0xA3, 0xF8, 0x0A, 0x20, 0xF7, 0xF7, 0x9A, 0xFF, 0xF7, 0xF7, 0x80, 0xF9, 0x00, 0x20, 0x03, 0x49, + 0x08, 0x70, 0x05, 0xB0, 0x00, 0xBD, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x20, 0xEE, 0x00, 0x00, 0x20, + 0xED, 0x00, 0x00, 0x20, 0xEC, 0x00, 0x00, 0x20, 0xE4, 0x00, 0x00, 0x20, 0x9A, 0x01, 0x00, 0x20, + 0x9C, 0x01, 0x00, 0x20, 0x44, 0x05, 0x00, 0x20, 0x10, 0xB5, 0x01, 0x20, 0xFC, 0xF7, 0xB0, 0xFD, + 0x0C, 0x49, 0x59, 0x20, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x0A, 0x48, + 0x02, 0x68, 0x01, 0x23, 0x1A, 0x43, 0x02, 0x60, 0x02, 0x68, 0x80, 0x23, 0x9A, 0x43, 0x02, 0x60, + 0x02, 0x68, 0x40, 0x23, 0x9A, 0x43, 0x02, 0x60, 0x00, 0x20, 0x08, 0x60, 0x01, 0x20, 0xFC, 0xF7, + 0xB5, 0xFD, 0x10, 0xBD, 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, 0x30, 0xB5, 0x0C, 0x4D, + 0x00, 0x20, 0x28, 0x74, 0x0B, 0x49, 0x59, 0x22, 0x0A, 0x60, 0x16, 0x22, 0x0A, 0x60, 0x88, 0x22, + 0x0A, 0x60, 0x09, 0x4A, 0x13, 0x68, 0x08, 0x24, 0x23, 0x43, 0x13, 0x60, 0x6B, 0x7C, 0x00, 0x2B, + 0x04, 0xD0, 0x68, 0x74, 0x13, 0x68, 0x01, 0x24, 0x23, 0x43, 0x13, 0x60, 0x08, 0x60, 0x30, 0xBD, + 0x1C, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, 0x70, 0xB5, 0x04, 0x46, + 0x01, 0x20, 0xFC, 0xF7, 0x6D, 0xFD, 0x01, 0x21, 0x08, 0x46, 0xFC, 0xF7, 0x9B, 0xFD, 0x1A, 0x49, + 0x59, 0x20, 0x08, 0x60, 0x16, 0x20, 0x08, 0x60, 0x88, 0x20, 0x08, 0x60, 0x17, 0x48, 0x83, 0x68, + 0x01, 0x22, 0x13, 0x43, 0x83, 0x60, 0x43, 0x69, 0x03, 0x25, 0x2B, 0x43, 0x43, 0x61, 0x14, 0x48, + 0x03, 0x68, 0x07, 0x25, 0x2D, 0x02, 0x64, 0x07, 0xAB, 0x43, 0x64, 0x0D, 0x23, 0x43, 0x03, 0x60, + 0x03, 0x68, 0x02, 0x24, 0x23, 0x43, 0x03, 0x60, 0x03, 0x68, 0x04, 0x24, 0x23, 0x43, 0x03, 0x60, + 0x03, 0x68, 0x13, 0x43, 0x03, 0x60, 0x03, 0x68, 0x40, 0x24, 0x23, 0x43, 0x03, 0x60, 0x03, 0x68, + 0x80, 0x24, 0x23, 0x43, 0x03, 0x60, 0x07, 0x48, 0x42, 0x74, 0x00, 0x20, 0x08, 0x60, 0x01, 0x20, + 0xFC, 0xF7, 0x54, 0xFD, 0x70, 0xBD, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0x00, 0x02, 0x00, 0x50, + 0x00, 0x40, 0x00, 0x40, 0x1C, 0x00, 0x00, 0x20, 0x00, 0xB5, 0x87, 0xB0, 0x0A, 0xA0, 0x00, 0x68, + 0x06, 0x90, 0x00, 0x20, 0x05, 0x90, 0x05, 0xA9, 0x03, 0x22, 0x00, 0x91, 0x02, 0x90, 0x03, 0x90, + 0x04, 0x92, 0x01, 0x90, 0x0B, 0x21, 0x01, 0x22, 0x49, 0x02, 0xA0, 0x20, 0x06, 0xAB, 0xFA, 0xF7, + 0xF7, 0xFB, 0x07, 0xB0, 0x00, 0xBD, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x70, 0xB5, 0x04, 0x46, + 0x0B, 0x46, 0x00, 0x25, 0x02, 0xE0, 0x5E, 0x5D, 0x66, 0x55, 0x6D, 0x1C, 0x95, 0x42, 0xFA, 0xDB, + 0x70, 0xBD, 0x77, 0xB5, 0x7D, 0x25, 0x81, 0xB0, 0x06, 0x46, 0x00, 0x24, 0xED, 0x00, 0xF7, 0xF7, + 0xBB, 0xFE, 0x03, 0xAA, 0x00, 0x92, 0x01, 0x22, 0x31, 0x46, 0xA0, 0x20, 0x02, 0xAB, 0xFA, 0xF7, + 0xAB, 0xFE, 0x01, 0x28, 0x03, 0xD0, 0x20, 0x46, 0x64, 0x1C, 0xA8, 0x42, 0xEF, 0xD9, 0x7F, 0xBD, 0x30, 0xB4, 0x74, 0x46, 0x64, 0x1E, 0x25, 0x78, 0x64, 0x1C, 0xAB, 0x42, 0x00, 0xD2, 0x1D, 0x46, - 0x63, 0x5D, 0x5B, 0x00, 0xE3, 0x18, 0x30, 0xBC, 0x18, 0x47, 0x70, 0xB5, 0x04, 0x46, 0x00, 0x25, - 0x00, 0xBF, 0x0A, 0xE0, 0x48, 0x5D, 0x66, 0x5D, 0xB0, 0x42, 0x03, 0xD1, 0x50, 0x5D, 0x66, 0x5D, - 0xB0, 0x42, 0x01, 0xD0, 0x00, 0x20, 0x70, 0xBD, 0x6D, 0x1C, 0x9D, 0x42, 0xF2, 0xDB, 0x01, 0x20, - 0xF9, 0xE7, 0x00, 0x00, 0x30, 0xB5, 0x89, 0xB0, 0x00, 0x24, 0x00, 0xBF, 0x00, 0x20, 0xFF, 0x49, - 0x08, 0x70, 0x0A, 0x20, 0xFE, 0x49, 0x08, 0x70, 0x01, 0x22, 0x03, 0x21, 0x08, 0x46, 0xF8, 0xF7, - 0x9B, 0xF8, 0x03, 0x21, 0x08, 0x46, 0xF7, 0xF7, 0x55, 0xFE, 0x01, 0x20, 0xF9, 0x49, 0x08, 0x70, - 0x07, 0xAA, 0x00, 0x92, 0x01, 0x22, 0xF8, 0x49, 0xA0, 0x20, 0x06, 0xAB, 0xFA, 0xF7, 0x38, 0xFC, - 0x01, 0x28, 0x09, 0xD1, 0x6B, 0x46, 0x18, 0x7E, 0x00, 0x28, 0x05, 0xD0, 0x18, 0x7E, 0xFF, 0x28, - 0x02, 0xD0, 0x00, 0x20, 0xEF, 0x49, 0x08, 0x70, 0xEE, 0x48, 0x00, 0x78, 0x00, 0x28, 0x5F, 0xD0, - 0x03, 0x21, 0x08, 0x46, 0xF8, 0xF7, 0xB2, 0xF8, 0x03, 0x20, 0xE9, 0x49, 0x08, 0x70, 0x02, 0x20, - 0xF7, 0xF7, 0x82, 0xFD, 0x01, 0x20, 0x08, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xE3, 0x49, 0xA0, 0x20, - 0x08, 0xAB, 0xFA, 0xF7, 0xD1, 0xFA, 0x01, 0x20, 0x08, 0x90, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, - 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xDC, 0x49, - 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0xC0, 0xFA, 0x23, 0x20, 0x08, 0x90, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, - 0xD3, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0xAF, 0xFA, 0x45, 0x20, 0x08, 0x90, 0x03, 0x22, - 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, - 0x01, 0x22, 0xCB, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x9E, 0xFA, 0x67, 0x20, 0x08, 0x90, - 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, - 0x00, 0x91, 0x01, 0x22, 0xC2, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x8D, 0xFA, 0x0A, 0xE0, - 0x00, 0x22, 0x01, 0x21, 0xBC, 0x48, 0x40, 0x1E, 0xFF, 0xF7, 0x2D, 0xFF, 0x02, 0x20, 0xF7, 0xF7, - 0x23, 0xFD, 0xFD, 0xF7, 0xB9, 0xFF, 0xF7, 0xF7, 0xCD, 0xFC, 0x01, 0x21, 0x02, 0x20, 0xF7, 0xF7, - 0xC9, 0xFD, 0x01, 0x20, 0xF7, 0xF7, 0x18, 0xFD, 0x01, 0x21, 0x02, 0x20, 0xF8, 0xF7, 0x3E, 0xF8, - 0x01, 0x20, 0xF7, 0xF7, 0x11, 0xFD, 0xAF, 0x48, 0x00, 0x78, 0x00, 0x28, 0x32, 0xD0, 0x80, 0x20, - 0x08, 0x90, 0xF6, 0xF7, 0x7B, 0xFD, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, - 0x0A, 0x46, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0x13, 0x21, 0x09, 0x02, 0xA0, 0x20, - 0x08, 0xAB, 0xFA, 0xF7, 0x59, 0xFA, 0x0A, 0x20, 0xF7, 0xF7, 0xF6, 0xFC, 0x03, 0x22, 0xA5, 0x48, - 0x01, 0x68, 0xA5, 0x48, 0x00, 0x68, 0x02, 0xAB, 0x07, 0xC3, 0x01, 0x22, 0x00, 0x21, 0x01, 0x92, - 0x00, 0x91, 0x0A, 0x46, 0x9C, 0x49, 0xA0, 0x20, 0x00, 0x23, 0xFA, 0xF7, 0x45, 0xFA, 0x01, 0x20, - 0x9E, 0x49, 0x08, 0x70, 0x9C, 0x48, 0x00, 0x68, 0x00, 0x78, 0x40, 0x28, 0x28, 0xD1, 0x00, 0x20, - 0x08, 0x70, 0x25, 0xE0, 0x00, 0x22, 0x01, 0x21, 0x93, 0x48, 0x40, 0x1E, 0xFF, 0xF7, 0xDB, 0xFE, - 0xF5, 0xF7, 0x56, 0xFF, 0x06, 0x90, 0x6B, 0x46, 0x18, 0x7E, 0x00, 0x28, 0x07, 0xD1, 0x40, 0x20, - 0x06, 0x90, 0x8A, 0x48, 0x00, 0x78, 0x02, 0x21, 0x08, 0x43, 0x88, 0x49, 0x08, 0x70, 0x6B, 0x46, - 0x1A, 0x7E, 0x11, 0x46, 0x88, 0x48, 0xFF, 0xF7, 0xC6, 0xFE, 0x03, 0x20, 0x84, 0x49, 0x08, 0x70, - 0xF7, 0xF7, 0x7C, 0xFC, 0x0D, 0x20, 0xFD, 0xF7, 0x9F, 0xFE, 0x01, 0x20, 0x87, 0x49, 0x08, 0x70, - 0xFF, 0xF7, 0xDC, 0xFD, 0x7D, 0x48, 0x00, 0x78, 0x04, 0x21, 0x08, 0x43, 0x7B, 0x49, 0x08, 0x70, - 0x00, 0x20, 0x07, 0x90, 0x11, 0xE0, 0xF9, 0xF7, 0x13, 0xFC, 0x3E, 0x28, 0x06, 0xD1, 0x77, 0x48, - 0x00, 0x78, 0x04, 0x21, 0x88, 0x43, 0x75, 0x49, 0x08, 0x70, 0x0A, 0xE0, 0xF7, 0xF7, 0x72, 0xFC, - 0x6B, 0x46, 0x18, 0x7F, 0x40, 0x1C, 0xC0, 0xB2, 0x07, 0x90, 0x6B, 0x46, 0x18, 0x7F, 0x32, 0x28, - 0xE9, 0xDB, 0x00, 0xBF, 0x76, 0x48, 0x00, 0x78, 0xC9, 0x28, 0x08, 0xD1, 0x75, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x0D, 0xD0, 0x74, 0x49, 0x75, 0x48, 0x00, 0xF0, 0xC6, 0xF9, 0x08, 0xE0, 0x71, 0x48, - 0x00, 0x78, 0x00, 0x28, 0x04, 0xD0, 0x4F, 0x21, 0x49, 0x01, 0x71, 0x48, 0x00, 0xF0, 0xBC, 0xF9, - 0x6C, 0x48, 0x00, 0x78, 0x00, 0x28, 0x3D, 0xD1, 0x05, 0x20, 0xF7, 0xF7, 0x75, 0xFC, 0x0D, 0x20, - 0xFD, 0xF7, 0x5A, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, 0x6F, 0xFC, 0x65, 0x20, 0xFD, 0xF7, 0x54, 0xFE, - 0x0A, 0x20, 0xF7, 0xF7, 0x69, 0xFC, 0x20, 0x20, 0xFD, 0xF7, 0x4E, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, - 0x63, 0xFC, 0x30, 0x20, 0xFD, 0xF7, 0x48, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, 0x5D, 0xFC, 0x36, 0x20, - 0xFD, 0xF7, 0x42, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, 0x57, 0xFC, 0x31, 0x20, 0xFD, 0xF7, 0x3C, 0xFE, - 0x0A, 0x20, 0xF7, 0xF7, 0x51, 0xFC, 0x30, 0x20, 0xFD, 0xF7, 0x36, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, - 0x4B, 0xFC, 0x58, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, 0x55, 0x49, 0x88, 0x60, - 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x52, 0x49, 0x88, 0x60, 0x0D, 0x20, - 0xFD, 0xF7, 0x22, 0xFE, 0x02, 0x20, 0xFF, 0xF7, 0xBD, 0xFD, 0x40, 0x48, 0x00, 0x78, 0x08, 0x21, - 0x08, 0x43, 0x3E, 0x49, 0x08, 0x70, 0x00, 0x20, 0x07, 0x90, 0x11, 0xE0, 0xF9, 0xF7, 0x98, 0xFB, - 0x21, 0x28, 0x06, 0xD1, 0x39, 0x48, 0x00, 0x78, 0x08, 0x21, 0x88, 0x43, 0x37, 0x49, 0x08, 0x70, - 0x0A, 0xE0, 0xF7, 0xF7, 0xF7, 0xFB, 0x6B, 0x46, 0x18, 0x7F, 0x40, 0x1C, 0xC0, 0xB2, 0x07, 0x90, - 0x6B, 0x46, 0x18, 0x7F, 0x14, 0x28, 0xE9, 0xDB, 0x00, 0xBF, 0x3E, 0x48, 0x80, 0x68, 0x01, 0x21, - 0x49, 0x02, 0x08, 0x43, 0x3B, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, - 0x08, 0x43, 0x38, 0x49, 0x88, 0x60, 0x03, 0x22, 0x2E, 0x48, 0x01, 0x68, 0x2E, 0x48, 0x00, 0x68, - 0x02, 0xAB, 0x07, 0xC3, 0x01, 0x22, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0xFF, 0x21, - 0x9E, 0x31, 0xA0, 0x20, 0x00, 0x23, 0xFA, 0xF7, 0x57, 0xF9, 0x27, 0x48, 0x00, 0x68, 0x00, 0x78, - 0x40, 0x06, 0x40, 0x0E, 0x55, 0x28, 0x06, 0xD1, 0x22, 0x48, 0x00, 0x68, 0x00, 0x78, 0x40, 0x06, - 0x40, 0x0E, 0x55, 0x28, 0x05, 0xD0, 0x19, 0x48, 0x00, 0x78, 0x10, 0x21, 0x08, 0x43, 0x17, 0x49, - 0x08, 0x70, 0x16, 0x48, 0x00, 0x78, 0x00, 0x28, 0x0F, 0xDD, 0x60, 0x1C, 0xC4, 0xB2, 0x02, 0x2C, - 0x03, 0xDA, 0x01, 0x20, 0x1B, 0x49, 0x08, 0x70, 0x20, 0xE6, 0x05, 0xE0, 0x1E, 0x48, 0x00, 0x78, - 0x00, 0x28, 0x01, 0xD0, 0xFA, 0xF7, 0x94, 0xFE, 0xF8, 0xE7, 0x13, 0x48, 0x00, 0x68, 0x00, 0x78, - 0x80, 0x21, 0x08, 0x42, 0x0A, 0xD0, 0x10, 0x48, 0x00, 0x68, 0x00, 0x78, 0x08, 0x42, 0x05, 0xD0, - 0x16, 0x48, 0x80, 0x79, 0x00, 0x06, 0xC0, 0x0F, 0x01, 0x28, 0x06, 0xD1, 0x14, 0x48, 0x00, 0x78, - 0x05, 0x28, 0x02, 0xDD, 0x05, 0x20, 0x12, 0x49, 0x08, 0x70, 0x23, 0xE0, 0xDC, 0x00, 0x00, 0x20, - 0xDD, 0x00, 0x00, 0x20, 0xAC, 0x00, 0x00, 0x20, 0x22, 0x15, 0x00, 0x00, 0x03, 0x13, 0x00, 0x00, - 0x04, 0x14, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0xAD, 0x00, 0x00, 0x20, - 0x3F, 0x01, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x20, 0x83, 0x04, 0x00, 0x00, 0x1E, 0xBA, 0x00, 0x00, - 0x3E, 0xB0, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xA0, 0x00, 0x00, 0x20, 0x39, 0x04, 0x00, 0x20, - 0x4A, 0x01, 0x00, 0x20, 0x00, 0x20, 0x07, 0x90, 0x19, 0xE0, 0x44, 0x48, 0x6B, 0x46, 0x19, 0x7F, - 0x40, 0x5C, 0xFF, 0x28, 0x00, 0xD1, 0x16, 0xE0, 0x40, 0x48, 0x6B, 0x46, 0x19, 0x7F, 0x40, 0x5C, - 0x02, 0x28, 0x04, 0xD0, 0x3D, 0x48, 0x19, 0x7F, 0x40, 0x5C, 0x03, 0x28, 0x02, 0xD1, 0xFF, 0x20, - 0x07, 0x90, 0x08, 0xE0, 0x6B, 0x46, 0x18, 0x7F, 0x40, 0x1C, 0xC0, 0xB2, 0x07, 0x90, 0x6B, 0x46, - 0x18, 0x7F, 0x10, 0x28, 0xE1, 0xDB, 0x00, 0xBF, 0x6B, 0x46, 0x18, 0x7F, 0xFF, 0x28, 0x06, 0xD0, - 0x33, 0x48, 0x00, 0x78, 0x02, 0x28, 0x02, 0xDD, 0x02, 0x20, 0x31, 0x49, 0x08, 0x70, 0x00, 0x21, - 0x08, 0x46, 0xF9, 0xF7, 0x01, 0xFA, 0xF5, 0xF7, 0xF1, 0xFF, 0x08, 0x90, 0x03, 0x22, 0x00, 0x21, - 0x02, 0x91, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x2A, 0x48, 0x01, 0x68, 0x2A, 0x48, 0x01, 0x92, - 0x00, 0x91, 0x08, 0xAB, 0x1A, 0x78, 0xFF, 0x21, 0x02, 0x31, 0x05, 0x68, 0xA0, 0x20, 0x2B, 0x46, - 0xFA, 0xF7, 0xAA, 0xF8, 0x25, 0x48, 0x00, 0x78, 0x23, 0x49, 0x09, 0x68, 0x08, 0x70, 0x24, 0x48, - 0x00, 0x78, 0x21, 0x49, 0x09, 0x68, 0x48, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x04, 0x92, - 0x03, 0x91, 0x0A, 0x46, 0x1C, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, 0x02, 0x22, 0xFF, 0x21, - 0x9C, 0x31, 0x03, 0x68, 0xA0, 0x20, 0xFA, 0xF7, 0x8F, 0xF8, 0x18, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x1B, 0xD0, 0xDD, 0x20, 0x14, 0x49, 0x09, 0x68, 0x08, 0x70, 0x15, 0x48, 0x00, 0x78, 0x00, 0x28, - 0x03, 0xD0, 0x00, 0x20, 0x10, 0x49, 0x09, 0x68, 0x08, 0x70, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, - 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x0C, 0x48, 0x01, 0x68, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, - 0x0C, 0x49, 0x03, 0x68, 0xA0, 0x20, 0xFA, 0xF7, 0x6F, 0xF8, 0xF7, 0xF7, 0xBB, 0xFA, 0xFF, 0xF7, - 0xEB, 0xFC, 0x01, 0x20, 0xF7, 0xF7, 0x08, 0xFB, 0x09, 0xB0, 0x30, 0xBD, 0x53, 0x04, 0x00, 0x20, - 0x4A, 0x01, 0x00, 0x20, 0xB8, 0x00, 0x00, 0x20, 0xB4, 0x00, 0x00, 0x20, 0xAC, 0x00, 0x00, 0x20, - 0xAD, 0x00, 0x00, 0x20, 0x21, 0x15, 0x00, 0x00, 0x10, 0xB5, 0x00, 0x20, 0x00, 0xF0, 0x02, 0xF9, - 0x2D, 0xE0, 0xFF, 0xF7, 0x45, 0xFC, 0xF6, 0xF7, 0xF5, 0xFB, 0x02, 0x20, 0xFD, 0xF7, 0xA2, 0xF8, - 0xFF, 0xF7, 0xCA, 0xFC, 0xF7, 0xF7, 0xD4, 0xFA, 0x11, 0x48, 0x00, 0x78, 0x00, 0x28, 0x1B, 0xD1, - 0xFD, 0xF7, 0x0C, 0xFE, 0x04, 0x46, 0x01, 0x20, 0xFD, 0xF7, 0x94, 0xF8, 0xFC, 0xF7, 0x0A, 0xFE, - 0x0C, 0x48, 0x00, 0x78, 0xCA, 0x28, 0x04, 0xD1, 0x00, 0x2C, 0x0D, 0xD1, 0xFA, 0xF7, 0x46, 0xFA, - 0x0D, 0xE0, 0x08, 0x48, 0x00, 0x78, 0x00, 0x28, 0x06, 0xD1, 0xF6, 0xF7, 0xDF, 0xFF, 0xF9, 0xF7, - 0xE9, 0xFF, 0xFC, 0xF7, 0xCF, 0xFF, 0x02, 0xE0, 0xFC, 0xF7, 0xCC, 0xFF, 0x00, 0xBF, 0xD0, 0xE7, - 0x2C, 0x02, 0x00, 0x20, 0x3F, 0x01, 0x00, 0x20, 0xF3, 0xB5, 0x81, 0xB0, 0x04, 0x46, 0x65, 0x20, - 0xFD, 0xF7, 0xA2, 0xFC, 0x61, 0x26, 0x36, 0x01, 0x25, 0x46, 0x06, 0x21, 0x02, 0x98, 0xF5, 0xF7, - 0x47, 0xFA, 0x87, 0xB2, 0x2A, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x51, 0xF8, 0x20, 0x20, - 0xFD, 0xF7, 0x92, 0xFC, 0xF0, 0x19, 0x86, 0xB2, 0x2C, 0x46, 0xED, 0x19, 0x2A, 0x46, 0x39, 0x46, - 0x30, 0x46, 0x00, 0xF0, 0x45, 0xF8, 0x30, 0x20, 0xFD, 0xF7, 0x86, 0xFC, 0xF0, 0x19, 0x86, 0xB2, - 0xED, 0x19, 0x2A, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x3A, 0xF8, 0x36, 0x20, 0xFD, 0xF7, - 0x7B, 0xFC, 0xF0, 0x19, 0x86, 0xB2, 0xED, 0x19, 0x2A, 0x46, 0x39, 0x46, 0x30, 0x46, 0x00, 0xF0, - 0x2F, 0xF8, 0x31, 0x20, 0xFD, 0xF7, 0x70, 0xFC, 0xF0, 0x19, 0x86, 0xB2, 0xED, 0x19, 0x2A, 0x46, - 0x39, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x24, 0xF8, 0x30, 0x20, 0xFD, 0xF7, 0x65, 0xFC, 0xF0, 0x19, - 0x86, 0xB2, 0xED, 0x19, 0xB8, 0x00, 0x38, 0x18, 0x02, 0x9A, 0x10, 0x1A, 0x81, 0xB2, 0x2A, 0x46, - 0x30, 0x46, 0x00, 0xF0, 0x15, 0xF8, 0x09, 0x48, 0x80, 0x68, 0x01, 0x21, 0x49, 0x02, 0x88, 0x43, - 0x06, 0x49, 0x88, 0x60, 0x08, 0x46, 0x80, 0x68, 0x01, 0x21, 0xC9, 0x02, 0x88, 0x43, 0x03, 0x49, - 0x88, 0x60, 0x0D, 0x20, 0xFD, 0xF7, 0x48, 0xFC, 0xFE, 0xBD, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, - 0xF0, 0xB5, 0x87, 0xB0, 0x04, 0x46, 0x0D, 0x46, 0x16, 0x46, 0x00, 0x27, 0x2E, 0x48, 0x06, 0x90, - 0x2E, 0x48, 0x05, 0x90, 0x00, 0xBF, 0x2E, 0x48, 0x00, 0x78, 0x00, 0x28, 0x00, 0xD0, 0x4F, 0xE0, - 0x0A, 0xE0, 0x78, 0x1C, 0xC7, 0xB2, 0x03, 0x2F, 0x06, 0xDB, 0x29, 0x48, 0x00, 0x78, 0x01, 0x21, - 0x08, 0x43, 0x27, 0x49, 0x08, 0x70, 0x0E, 0xE0, 0x03, 0x22, 0x00, 0x21, 0x02, 0x91, 0x03, 0x91, - 0x33, 0x46, 0x00, 0x96, 0x04, 0x92, 0x01, 0x91, 0x2A, 0x46, 0x21, 0x46, 0xA0, 0x20, 0xF9, 0xF7, - 0x93, 0xFF, 0x01, 0x28, 0xE5, 0xD1, 0x00, 0xBF, 0x0A, 0xE0, 0x78, 0x1C, 0xC7, 0xB2, 0x03, 0x2F, - 0x06, 0xDB, 0x1B, 0x48, 0x00, 0x78, 0x01, 0x21, 0x08, 0x43, 0x19, 0x49, 0x08, 0x70, 0x10, 0xE0, - 0x03, 0x22, 0x06, 0x99, 0x05, 0x98, 0x04, 0x92, 0x02, 0x91, 0x03, 0x90, 0x00, 0x21, 0x0A, 0x46, - 0x01, 0x95, 0x00, 0x91, 0x21, 0x46, 0xA0, 0x20, 0x00, 0x23, 0xF9, 0xF7, 0x75, 0xFF, 0x01, 0x28, - 0xE3, 0xD1, 0x00, 0xBF, 0x2B, 0x46, 0x30, 0x46, 0x05, 0x9A, 0x06, 0x99, 0xFF, 0xF7, 0x3D, 0xFC, - 0x00, 0x28, 0x0B, 0xD1, 0x38, 0x46, 0x79, 0x1C, 0xCF, 0xB2, 0x03, 0x28, 0x07, 0xDB, 0x08, 0x48, - 0x00, 0x78, 0x01, 0x21, 0x08, 0x43, 0x06, 0x49, 0x08, 0x70, 0x01, 0xE0, 0x00, 0xE0, 0xAA, 0xE7, - 0x00, 0xBF, 0x07, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0xAC, 0x10, 0x00, 0x20, - 0xDC, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x04, 0x46, 0x00, 0x2C, 0x06, 0xD0, 0x01, 0x2C, 0x07, 0xD0, - 0x02, 0x2C, 0x06, 0xD0, 0x03, 0x2C, 0x17, 0xD1, 0x0E, 0xE0, 0xFB, 0xF7, 0x89, 0xF9, 0x00, 0xBF, - 0x00, 0xBF, 0xFF, 0xF7, 0x0B, 0xFB, 0xFC, 0xF7, 0x79, 0xFC, 0xFC, 0xF7, 0xB5, 0xFF, 0xFA, 0xF7, - 0x2D, 0xFC, 0xFE, 0xF7, 0xAF, 0xFD, 0x00, 0xBF, 0x02, 0x20, 0xFF, 0xF7, 0x5B, 0xFB, 0xFF, 0xF7, - 0x19, 0xFC, 0xFE, 0xF7, 0xD7, 0xFB, 0x00, 0xBF, 0x00, 0xBF, 0x00, 0xBF, 0x10, 0xBD, 0x4F, 0xCE, - 0x00, 0x50, 0x20, 0x03, 0xA7, 0x00, 0x08, 0x8C, 0x00, 0x5C, 0x26, 0xF8, 0x8E, 0x00, 0xFE, 0xBD, - 0x0C, 0xC5, 0x20, 0xFE, 0x3C, 0xCC, 0x0F, 0xB4, 0xCE, 0x00, 0x00, 0xED, 0x10, 0xCC, 0x0F, 0xBC, - 0xED, 0x12, 0xCC, 0x0F, 0xCE, 0xED, 0x14, 0xCC, 0x0F, 0xDA, 0xED, 0x16, 0xCC, 0x0F, 0xE1, 0xED, - 0x18, 0xCC, 0x0F, 0xE8, 0xED, 0x1C, 0xC6, 0x03, 0xCE, 0x10, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x01, - 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xE7, 0x01, 0xCC, 0x3A, 0x98, - 0xED, 0x02, 0xCC, 0x00, 0xFF, 0xED, 0x04, 0x5F, 0xED, 0x06, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, - 0x04, 0xED, 0x01, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0xC6, 0x09, 0xE7, 0x03, 0xC6, 0x80, 0xCE, - 0x14, 0x00, 0xE7, 0x00, 0xC6, 0x50, 0xE7, 0x01, 0x5F, 0xED, 0x02, 0xE7, 0x04, 0xC6, 0x54, 0xCE, - 0x15, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x15, 0x86, 0x02, 0xED, 0x1C, 0x4C, 0xED, 0x1E, 0xE7, 0x20, - 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xE7, 0x01, 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xE7, 0x05, 0x5C, - 0xE7, 0x06, 0x5F, 0xE7, 0x07, 0x07, 0x84, 0x7F, 0x06, 0x38, 0x39, 0x3C, 0xFE, 0x00, 0x5A, 0xF6, - 0x01, 0x9C, 0x26, 0x3C, 0xEC, 0x00, 0x04, 0x04, 0xED, 0x00, 0xEC, 0x02, 0x04, 0x04, 0xED, 0x02, - 0xEC, 0x04, 0x04, 0x04, 0xED, 0x04, 0xEC, 0x06, 0x04, 0x04, 0xED, 0x06, 0xEC, 0x08, 0x04, 0x04, - 0xED, 0x08, 0xEC, 0x0A, 0x04, 0x04, 0xED, 0x0A, 0xEC, 0x0C, 0x04, 0x04, 0xED, 0x0C, 0xEC, 0x0E, - 0x04, 0x04, 0xED, 0x0E, 0xEC, 0x10, 0x04, 0x04, 0xED, 0x10, 0xEC, 0x12, 0x04, 0x04, 0xED, 0x12, - 0x18, 0xFE, 0x00, 0x58, 0x18, 0xEC, 0x00, 0xA3, 0x00, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, - 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x4B, 0x18, 0xEC, 0x02, 0xA3, 0x02, 0x2C, - 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x4A, - 0x18, 0xEC, 0x04, 0xA3, 0x04, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, - 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x49, 0x18, 0xEC, 0x06, 0xA3, 0x06, 0x2C, 0x03, 0x5F, 0x20, 0x0A, - 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x48, 0x18, 0xEC, 0x08, 0xA3, - 0x08, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, - 0xD7, 0x47, 0x18, 0xEC, 0x0A, 0xA3, 0x0A, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, - 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x46, 0x18, 0xEC, 0x0C, 0xA3, 0x0C, 0x2C, 0x03, 0x5F, - 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x45, 0x18, 0xEC, - 0x0E, 0xA3, 0x0E, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, - 0xC6, 0xFF, 0xD7, 0x44, 0x18, 0xEC, 0x10, 0xA3, 0x10, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, - 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x43, 0x18, 0xEC, 0x12, 0xA3, 0x12, 0x2C, - 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x42, - 0xD6, 0x4B, 0xFE, 0x00, 0x50, 0xE7, 0x00, 0x08, 0xFF, 0x00, 0x50, 0xFE, 0x00, 0x56, 0xD6, 0x4A, - 0xD0, 0x4B, 0xE7, 0x00, 0xD6, 0x49, 0xD0, 0x4B, 0xE7, 0x01, 0xD6, 0x48, 0xD0, 0x4B, 0xE7, 0x02, - 0xD6, 0x47, 0xD0, 0x4B, 0xE7, 0x03, 0xD6, 0x46, 0xD0, 0x4B, 0xE7, 0x04, 0xD6, 0x45, 0xD0, 0x4B, - 0xE7, 0x05, 0xD6, 0x44, 0xD0, 0x4B, 0xE7, 0x06, 0xD6, 0x43, 0xD0, 0x4B, 0xE7, 0x07, 0xD6, 0x42, - 0xD0, 0x4B, 0xE7, 0x08, 0xD6, 0x36, 0x5A, 0x4F, 0xF3, 0x00, 0x56, 0xFD, 0x00, 0x56, 0xFC, 0x00, - 0x5A, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x5A, 0xFC, 0x00, 0x58, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x58, - 0x7A, 0x00, 0x35, 0x27, 0x03, 0x7E, 0x06, 0xBE, 0x38, 0x39, 0x3C, 0xFE, 0x00, 0x5A, 0x18, 0xFE, - 0x00, 0x58, 0xF6, 0x01, 0x9C, 0x5A, 0x26, 0x4C, 0xEC, 0x00, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x00, - 0xEC, 0x02, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x02, 0xEC, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x04, - 0xEC, 0x06, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x06, 0xEC, 0x08, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x08, - 0xEC, 0x0A, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0A, 0xEC, 0x0C, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0C, - 0xEC, 0x0E, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0E, 0xEC, 0x10, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x10, - 0xEC, 0x12, 0x20, 0x5E, 0xEC, 0x00, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x00, 0xEC, 0x02, - 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x02, 0xEC, 0x04, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, - 0xED, 0x04, 0xEC, 0x06, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x06, 0xEC, 0x08, 0x04, 0x04, - 0xC3, 0x02, 0x00, 0x18, 0xED, 0x08, 0xEC, 0x0A, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0A, - 0xEC, 0x0C, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0C, 0xEC, 0x0E, 0x04, 0x04, 0xC3, 0x02, - 0x00, 0x18, 0xED, 0x0E, 0xEC, 0x10, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x10, 0xEC, 0x12, - 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x12, 0xFC, 0x00, 0x58, 0xC3, 0x00, 0x14, 0xFD, 0x00, - 0x58, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x5A, 0x7A, 0x00, 0x35, 0x27, 0x03, 0x7E, - 0x08, 0x4D, 0x38, 0x39, 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x24, 0x04, 0xBD, 0x08, 0x4C, 0x39, 0xBD, - 0x06, 0xBD, 0x39, 0x3C, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x86, 0xE7, - 0x19, 0xF6, 0x01, 0x87, 0xE7, 0x1A, 0xF6, 0x01, 0x88, 0xE7, 0x1B, 0xF6, 0x01, 0x89, 0xE7, 0x16, - 0xF6, 0x01, 0x8A, 0xE7, 0x17, 0xF6, 0x01, 0x8B, 0xE7, 0x18, 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x83, - 0x3D, 0xD7, 0x2F, 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x84, 0x3D, 0xD7, 0x2E, 0xF6, 0x01, 0x82, 0xB6, - 0x01, 0x83, 0x3D, 0xD7, 0x2D, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x84, 0x3D, 0xD7, 0x2C, 0xF6, 0x01, - 0x81, 0x86, 0x14, 0x3D, 0xDD, 0x2A, 0xF6, 0x01, 0x82, 0x86, 0x14, 0x3D, 0xDD, 0x28, 0xF6, 0x01, - 0x81, 0xFB, 0x01, 0x82, 0xD7, 0x27, 0x7D, 0x01, 0x84, 0x27, 0x03, 0x78, 0x00, 0x27, 0xF6, 0x01, - 0x92, 0xC1, 0x0A, 0x24, 0x05, 0xC6, 0x0A, 0xF7, 0x01, 0x92, 0x38, 0x39, 0x01, 0x01, 0xCF, 0x7D, - 0x01, 0x9F, 0x26, 0xFB, 0x39, 0x3C, 0xF6, 0x01, 0x90, 0x54, 0x54, 0xD7, 0x22, 0xB6, 0x01, 0x8F, - 0x5F, 0xFB, 0x01, 0x8E, 0x89, 0x00, 0xDD, 0x23, 0x5F, 0xD7, 0x25, 0xDC, 0x23, 0xDD, 0x39, 0x5F, - 0xD7, 0x31, 0x13, 0x3A, 0x01, 0x03, 0x7C, 0x00, 0x25, 0x74, 0x00, 0x39, 0x76, 0x00, 0x3A, 0xC1, - 0x08, 0x24, 0x13, 0xCE, 0x4C, 0xC0, 0x58, 0x3A, 0x4F, 0x5F, 0xED, 0x00, 0xCE, 0x4C, 0xF0, 0xD6, - 0x31, 0x58, 0x3A, 0x5F, 0xED, 0x00, 0x7C, 0x00, 0x31, 0xD6, 0x31, 0xC1, 0x0A, 0x25, 0xD3, 0x38, - 0x39, 0x3C, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xD6, 0x25, - 0x27, 0x1F, 0xF6, 0x01, 0x8C, 0x5A, 0x26, 0x19, 0xF6, 0x01, 0x91, 0xCE, 0x15, 0x00, 0xE7, 0x00, - 0xC6, 0x03, 0xE7, 0x15, 0xCC, 0x15, 0xEC, 0xED, 0x1E, 0xCC, 0x01, 0x7D, 0xED, 0x1C, 0x1C, 0x15, - 0x80, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0x38, 0x39, 0x3C, 0xCC, 0x05, 0xEC, 0xFD, 0x00, - 0x5A, 0xDC, 0x23, 0xDD, 0x39, 0x5F, 0xD7, 0x3F, 0xD7, 0x31, 0x13, 0x3A, 0x01, 0x21, 0x4F, 0x05, - 0xF3, 0x00, 0x5A, 0x8F, 0xEC, 0x00, 0xDD, 0x3B, 0x7D, 0x01, 0x9C, 0x26, 0x04, 0x04, 0x04, 0xDD, - 0x3B, 0xCE, 0x4C, 0xD0, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x58, 0x3A, 0xDC, 0x3B, 0xED, 0x00, 0x74, - 0x00, 0x39, 0x76, 0x00, 0x3A, 0x7C, 0x00, 0x31, 0xD6, 0x31, 0xC1, 0x0A, 0x25, 0xCC, 0x7D, 0x01, - 0x9D, 0x27, 0x05, 0xFC, 0x4C, 0xC0, 0x26, 0x02, 0x38, 0x39, 0xCC, 0x4C, 0xC0, 0xFD, 0x00, 0x5A, - 0x5F, 0xD7, 0x31, 0x20, 0x64, 0xFE, 0x00, 0x5A, 0xEC, 0x10, 0xDD, 0x3B, 0xD6, 0x20, 0x27, 0x0E, - 0xEC, 0x00, 0xD3, 0x3B, 0x04, 0xED, 0x00, 0x4F, 0x5F, 0xED, 0x30, 0x7A, 0x00, 0x20, 0xEC, 0x00, - 0x93, 0x3B, 0xDD, 0x37, 0xEC, 0x20, 0xD8, 0x38, 0x98, 0x37, 0xDD, 0x33, 0xDC, 0x37, 0xED, 0x20, - 0xDC, 0x33, 0x2F, 0x13, 0xD6, 0x22, 0x4F, 0x1A, 0x93, 0x37, 0x2D, 0x04, 0xD3, 0x37, 0x2C, 0x07, - 0xEC, 0x30, 0xC3, 0x00, 0x01, 0x20, 0x02, 0x4F, 0x5F, 0xED, 0x30, 0x83, 0x00, 0x03, 0x22, 0x08, - 0xF6, 0x01, 0x90, 0x4F, 0x93, 0x37, 0x2C, 0x03, 0x7C, 0x00, 0x21, 0x7C, 0x00, 0x31, 0xFC, 0x00, - 0x5A, 0xC3, 0x00, 0x02, 0xFD, 0x00, 0x5A, 0xD6, 0x31, 0xD1, 0x25, 0x25, 0x98, 0x38, 0x39, 0x3C, - 0x37, 0x36, 0x30, 0x18, 0xCE, 0x10, 0x00, 0x18, 0xE6, 0x03, 0xC4, 0x0C, 0xC1, 0x0C, 0x26, 0xF7, - 0xE6, 0x01, 0x18, 0xE7, 0x05, 0x38, 0x38, 0x39, 0x3C, 0xC6, 0x07, 0xCE, 0x12, 0x00, 0xE7, 0x00, - 0xC6, 0x16, 0xE7, 0x00, 0xC6, 0x25, 0xE7, 0x00, 0xC6, 0x34, 0xE7, 0x00, 0x38, 0x39, 0xD6, 0x27, - 0xD7, 0x35, 0xF6, 0x01, 0x9C, 0xD7, 0x3D, 0xC6, 0x01, 0xF7, 0x01, 0x9C, 0xBD, 0x08, 0x4C, 0xD6, - 0x3D, 0xF7, 0x01, 0x9C, 0x39, 0x3C, 0x5F, 0xD7, 0x3F, 0xD7, 0x41, 0x20, 0x73, 0xFE, 0x00, 0x54, - 0x3A, 0xE6, 0x00, 0xD7, 0x3D, 0xC1, 0x04, 0x23, 0x16, 0xC1, 0xFC, 0x24, 0x12, 0xFE, 0x00, 0x52, - 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, 0xD6, 0x3D, 0xE7, 0x00, 0x7C, 0x00, 0x41, 0x20, 0x51, 0xC6, - 0x01, 0xD7, 0x3E, 0x20, 0x35, 0xFE, 0x00, 0x54, 0x3A, 0xE6, 0x00, 0xD7, 0x3D, 0xC1, 0x04, 0x23, - 0x26, 0xC1, 0xFC, 0x24, 0x22, 0xD6, 0x3E, 0xC1, 0x01, 0x23, 0x2A, 0xFE, 0x00, 0x52, 0xD6, 0x3F, - 0x7C, 0x00, 0x3F, 0x3A, 0xC6, 0x01, 0xE7, 0x00, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, - 0x3A, 0xD6, 0x3E, 0xE7, 0x00, 0x20, 0x19, 0x7C, 0x00, 0x3E, 0x7C, 0x00, 0x41, 0xD6, 0x41, 0xD1, - 0x30, 0x25, 0xC2, 0x20, 0xD0, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, 0x6F, 0x00, - 0xD6, 0x41, 0xD1, 0x30, 0x25, 0x87, 0xD6, 0x3F, 0x4F, 0xF3, 0x00, 0x52, 0xFD, 0x00, 0x52, 0xD6, - 0x30, 0x4F, 0xF3, 0x00, 0x54, 0xFD, 0x00, 0x54, 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, 0x00, 0x64, - 0xED, 0x00, 0x1A, 0xEE, 0x00, 0x83, 0x00, 0x01, 0xED, 0x00, 0x18, 0x8C, 0x00, 0x01, 0x22, 0xF2, - 0x38, 0x38, 0x39, 0x01, 0x01, 0x01, 0x01, 0x01, 0x39, 0x3C, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, - 0xF6, 0x01, 0x8C, 0xC1, 0x01, 0x26, 0x05, 0xBD, 0x09, 0xAE, 0x20, 0x1F, 0x8D, 0xE5, 0xCE, 0x16, - 0x00, 0x1F, 0x02, 0x01, 0xF7, 0x8D, 0xDC, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, 0xF7, 0xC6, 0x01, - 0xE7, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x38, 0x39, 0x3C, 0x5F, 0xCE, - 0x16, 0x00, 0xE7, 0x00, 0xD7, 0x3F, 0x01, 0x1F, 0x02, 0x01, 0x05, 0x7C, 0x00, 0x3F, 0xD6, 0x3F, - 0xC1, 0x03, 0x25, 0xF2, 0x38, 0x39, 0x3C, 0x7D, 0x01, 0x8C, 0x26, 0x18, 0x7D, 0x01, 0x9B, 0x26, - 0x09, 0xC6, 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x21, 0x8D, 0x99, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, - 0x00, 0xBD, 0x0B, 0xDC, 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, 0x44, 0x00, 0xFD, 0x00, 0x50, 0xD6, - 0x27, 0x4F, 0xC3, 0x44, 0x00, 0xFD, 0x00, 0x52, 0x4F, 0x5F, 0xDD, 0x33, 0xF3, 0x00, 0x52, 0x18, - 0x8F, 0x18, 0xE6, 0x00, 0xD7, 0x3D, 0xF1, 0x01, 0x92, 0x23, 0x13, 0x4F, 0xED, 0x00, 0xC6, 0xFF, - 0xF0, 0x01, 0x92, 0x82, 0x00, 0xA3, 0x00, 0x2F, 0x05, 0x7C, 0x00, 0x21, 0x20, 0x13, 0xD6, 0x3D, - 0x5A, 0x26, 0x09, 0xDC, 0x33, 0xC3, 0x00, 0x01, 0xDD, 0x33, 0x20, 0x08, 0xD6, 0x3D, 0x5C, 0x26, - 0x03, 0x38, 0x38, 0x39, 0xDC, 0x33, 0xC3, 0x00, 0x01, 0xDD, 0x33, 0x1A, 0x83, 0x02, 0x30, 0x2D, - 0xBB, 0x20, 0xEE, 0x3C, 0x0F, 0xBD, 0x06, 0x26, 0x0E, 0x5F, 0xF7, 0x01, 0x9F, 0xCE, 0x16, 0x00, - 0xE7, 0x05, 0x5C, 0xE7, 0x03, 0xC6, 0xFF, 0xE7, 0x04, 0xCE, 0x15, 0x00, 0xE6, 0x00, 0xC4, 0x80, - 0xCA, 0x55, 0xF7, 0x01, 0x9D, 0xCC, 0x00, 0x21, 0xBD, 0x0B, 0x01, 0xBD, 0x0B, 0xDC, 0xBD, 0x09, - 0xAE, 0xBD, 0x09, 0x35, 0xBD, 0x09, 0xB7, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xBD, 0x0B, 0x1A, - 0x5F, 0xF7, 0x01, 0x9E, 0xD7, 0x26, 0xF7, 0x01, 0x9D, 0xCE, 0x00, 0x00, 0xE7, 0xFF, 0x5F, 0xCE, - 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x85, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x46, 0x30, 0xFD, - 0x00, 0x58, 0xCC, 0x4A, 0x90, 0xFD, 0x00, 0x56, 0xCC, 0x01, 0xA0, 0xFD, 0x00, 0x5A, 0xCC, 0x4A, - 0x90, 0xFD, 0x00, 0x54, 0xCC, 0x44, 0x00, 0xFD, 0x00, 0x50, 0xD6, 0x27, 0x4F, 0xC3, 0x44, 0x00, - 0xFD, 0x00, 0x52, 0x5F, 0xD7, 0x21, 0x7D, 0x01, 0x9B, 0x26, 0x14, 0xF6, 0x01, 0x9D, 0x5A, 0x26, - 0x0E, 0x7D, 0x01, 0x8C, 0x26, 0x09, 0xBD, 0x0B, 0xDC, 0x5F, 0xCE, 0x15, 0x00, 0xE7, 0x21, 0xBD, - 0x09, 0xAE, 0xF6, 0x01, 0x9D, 0x27, 0x49, 0x5A, 0x27, 0x0B, 0x5A, 0x27, 0x13, 0x5A, 0x27, 0x2A, - 0x5A, 0x27, 0x2A, 0x20, 0x99, 0xCE, 0x14, 0x00, 0x1D, 0x00, 0x80, 0xBD, 0x0C, 0x48, 0x20, 0x30, - 0xD7, 0x26, 0x7D, 0x01, 0x8C, 0x26, 0x07, 0xC6, 0xAF, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xC6, 0x01, - 0xF7, 0x01, 0x9D, 0xC6, 0x04, 0xD7, 0x20, 0x7E, 0x0D, 0x10, 0xBD, 0x0C, 0x48, 0x5F, 0xCE, 0x11, - 0x00, 0xE7, 0x00, 0x7F, 0x01, 0x9D, 0xC6, 0x35, 0xCE, 0x10, 0x00, 0xE7, 0x05, 0x7E, 0x0D, 0x10, - 0xBD, 0x0B, 0xFB, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x23, 0x0B, - 0xBD, 0x0B, 0x30, 0xC6, 0x03, 0xF7, 0x01, 0x9E, 0x7E, 0x0D, 0x10, 0xCC, 0x01, 0x01, 0xCE, 0x15, - 0x00, 0xED, 0x1C, 0xCC, 0x11, 0xA0, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xCE, 0x00, 0x00, 0xE6, 0xFF, - 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0x7D, 0x01, 0x84, 0x26, 0x03, 0x7E, 0x0E, 0xB2, 0xCE, - 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, 0x1E, 0xD3, 0x2A, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xC6, 0x01, - 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, - 0x09, 0x26, 0xD6, 0x2F, 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0xCE, 0x00, 0x00, 0xE6, - 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xBD, 0x0B, 0xFB, 0xC6, 0x01, 0xCE, 0x16, 0x00, - 0xE7, 0x00, 0xF6, 0x01, 0x85, 0xC8, 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, - 0x1C, 0xEC, 0x1E, 0xD3, 0x2A, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, - 0x01, 0x84, 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, 0x2E, 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x0B, - 0x47, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xBD, 0x0B, 0xFB, - 0xCE, 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, 0x1E, 0xD3, 0x28, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0x5F, - 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x82, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, - 0x09, 0x26, 0xD6, 0x2D, 0xF0, 0x01, 0x82, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0xBD, 0x0A, 0x03, 0xF6, - 0x01, 0x82, 0xD7, 0x35, 0xF6, 0x01, 0x84, 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, 0x2C, 0x20, 0x41, - 0xF6, 0x01, 0x85, 0xC8, 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, - 0x1E, 0xD3, 0x2A, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x83, - 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, 0x2F, 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0xBD, - 0x0A, 0x03, 0xF6, 0x01, 0x82, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x09, 0x26, 0xD6, - 0x2D, 0xF0, 0x01, 0x82, 0xD7, 0x30, 0xBD, 0x0B, 0x47, 0x7D, 0x00, 0x25, 0x27, 0x15, 0xF6, 0x01, - 0x8C, 0x5A, 0x26, 0x0F, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, - 0xBD, 0x0A, 0x3C, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x9E, 0xC1, 0x03, - 0x24, 0x15, 0xD6, 0x27, 0x4F, 0xC3, 0x44, 0x00, 0xFD, 0x00, 0x52, 0xC6, 0xFF, 0xFE, 0x00, 0x52, - 0xE7, 0x00, 0x7C, 0x01, 0x9E, 0x20, 0x6F, 0xC6, 0xFF, 0xFE, 0x00, 0x52, 0xE7, 0x00, 0xF6, 0x01, - 0x9D, 0xC1, 0x01, 0x26, 0x61, 0xCE, 0x14, 0x00, 0x1C, 0x00, 0x80, 0x7C, 0x00, 0x26, 0xBD, 0x0C, - 0x68, 0xBD, 0x0C, 0x2F, 0x7D, 0x01, 0x8C, 0x26, 0x1A, 0x5F, 0xD7, 0x3F, 0xCE, 0x16, 0x00, 0x1E, - 0x02, 0x01, 0x05, 0x7C, 0x00, 0x21, 0x20, 0x16, 0x7C, 0x00, 0x3F, 0xD6, 0x3F, 0xC1, 0x0A, 0x25, - 0xEE, 0x20, 0x0B, 0xD6, 0x21, 0x27, 0x07, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xD6, 0x21, - 0x26, 0x06, 0xD6, 0x26, 0xC1, 0xC8, 0x23, 0x11, 0xCC, 0x00, 0x35, 0xBD, 0x0B, 0x01, 0xBD, 0x0B, - 0xDC, 0xD6, 0x26, 0x4F, 0xBD, 0x0B, 0x01, 0xD6, 0x26, 0xC1, 0xC8, 0x22, 0x03, 0x7E, 0x0D, 0x10, - 0x5F, 0xD7, 0x26, 0x7E, 0x0D, 0x10, 0xBD, 0x0C, 0x2F, 0xCC, 0x00, 0x35, 0xBD, 0x0B, 0x01, 0x7E, - 0x0D, 0x10, 0xC6, 0xFF, 0xCE, 0x16, 0x00, 0xE7, 0x04, 0x3B, 0xCE, 0x11, 0x00, 0x1F, 0x00, 0x08, - 0x03, 0x1C, 0x00, 0x04, 0x1F, 0x00, 0x20, 0x03, 0x1C, 0x00, 0x20, 0x3B, 0xCE, 0x15, 0x00, 0x1C, - 0x00, 0x02, 0xCE, 0x00, 0x00, 0x6C, 0xFF, 0x3B, 0xCE, 0x14, 0x00, 0x1C, 0x00, 0x14, 0x3B, 0x5F, - 0xCE, 0x10, 0x00, 0xE7, 0x04, 0x3B, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0x3B, 0x3B, 0x4F, 0xCE, - 0x00, 0x50, 0x20, 0x03, 0xA7, 0x00, 0x08, 0x8C, 0x00, 0x5C, 0x26, 0xF8, 0x8E, 0x00, 0xFE, 0xBD, - 0x08, 0x7B, 0x20, 0xFE, 0x3C, 0xCC, 0x0A, 0x57, 0xCE, 0x00, 0x00, 0xED, 0x10, 0xCC, 0x0A, 0x5F, - 0xED, 0x12, 0xCC, 0x0A, 0x71, 0xED, 0x14, 0xCC, 0x0A, 0x7D, 0xED, 0x16, 0xCC, 0x0A, 0x84, 0xED, - 0x18, 0xCC, 0x0A, 0x8B, 0xED, 0x1C, 0xC6, 0x03, 0xCE, 0x10, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x01, - 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xE7, 0x01, 0xCC, 0x00, 0xFF, - 0xED, 0x02, 0xED, 0x04, 0x5F, 0xED, 0x06, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x04, 0xED, 0x01, - 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0xC6, 0x09, 0xE7, 0x03, 0xC6, 0x80, 0xCE, 0x14, 0x00, 0xE7, - 0x00, 0xC6, 0x50, 0xE7, 0x01, 0x5F, 0xED, 0x02, 0xE7, 0x04, 0xC6, 0x54, 0xCE, 0x15, 0x00, 0xE7, - 0x00, 0x5F, 0xE7, 0x15, 0x86, 0x02, 0xED, 0x1C, 0x4C, 0xED, 0x1E, 0xE7, 0x20, 0xCE, 0x16, 0x00, - 0xE7, 0x00, 0xE7, 0x01, 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xE7, 0x05, 0x5C, 0xE7, 0x06, 0x5F, - 0xE7, 0x07, 0x07, 0x84, 0x7F, 0x06, 0x38, 0x39, 0x3C, 0x20, 0x77, 0xFE, 0x00, 0x5A, 0xEC, 0x00, - 0xFE, 0x00, 0x58, 0xED, 0x00, 0xFE, 0x00, 0x5A, 0xEC, 0x02, 0xFE, 0x00, 0x58, 0xED, 0x02, 0xFE, - 0x00, 0x5A, 0xEC, 0x04, 0xFE, 0x00, 0x58, 0xED, 0x04, 0xFE, 0x00, 0x5A, 0xEC, 0x06, 0xFE, 0x00, - 0x58, 0xED, 0x06, 0xFE, 0x00, 0x5A, 0xEC, 0x08, 0xFE, 0x00, 0x58, 0xED, 0x08, 0xFE, 0x00, 0x5A, - 0xEC, 0x0A, 0xFE, 0x00, 0x58, 0xED, 0x0A, 0xFE, 0x00, 0x5A, 0xEC, 0x0C, 0xFE, 0x00, 0x58, 0xED, - 0x0C, 0xFE, 0x00, 0x5A, 0xEC, 0x0E, 0xFE, 0x00, 0x58, 0xED, 0x0E, 0xFE, 0x00, 0x5A, 0xEC, 0x10, - 0xFE, 0x00, 0x58, 0xED, 0x10, 0xFE, 0x00, 0x5A, 0xEC, 0x12, 0xFE, 0x00, 0x58, 0xED, 0x12, 0xD6, - 0x32, 0x4F, 0x05, 0xF3, 0x00, 0x58, 0xFD, 0x00, 0x58, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x14, 0xFD, - 0x00, 0x5A, 0xD6, 0x31, 0x7A, 0x00, 0x31, 0x5D, 0x26, 0x81, 0x38, 0x39, 0x3C, 0xF6, 0x01, 0x8D, - 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x86, 0xE7, 0x19, 0xF6, 0x01, 0x87, 0xE7, 0x1A, 0xF6, - 0x01, 0x88, 0xE7, 0x1B, 0xF6, 0x01, 0x89, 0xE7, 0x16, 0xF6, 0x01, 0x8A, 0xE7, 0x17, 0xF6, 0x01, - 0x8B, 0xE7, 0x18, 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x2B, 0xF6, 0x01, 0x81, 0xB6, - 0x01, 0x84, 0x3D, 0xD7, 0x2A, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x29, 0xF6, 0x01, - 0x82, 0xB6, 0x01, 0x84, 0x3D, 0xD7, 0x28, 0xF6, 0x01, 0x81, 0x86, 0x14, 0x3D, 0xDD, 0x26, 0xF6, - 0x01, 0x82, 0x86, 0x14, 0x3D, 0xDD, 0x24, 0xF6, 0x01, 0x81, 0xFB, 0x01, 0x82, 0xD7, 0x23, 0x7D, - 0x01, 0x84, 0x27, 0x03, 0x78, 0x00, 0x23, 0x38, 0x39, 0x01, 0x01, 0xCF, 0x7D, 0x01, 0x9F, 0x26, - 0xFB, 0x39, 0xB6, 0x01, 0x8F, 0x5F, 0xFB, 0x01, 0x8E, 0x89, 0x00, 0xDD, 0x20, 0x5F, 0xD7, 0x22, - 0xDC, 0x20, 0xDD, 0x35, 0x5F, 0xD7, 0x2D, 0x13, 0x36, 0x01, 0x03, 0x7C, 0x00, 0x22, 0x74, 0x00, - 0x35, 0x76, 0x00, 0x36, 0x7C, 0x00, 0x2D, 0xD6, 0x2D, 0xC1, 0x0A, 0x25, 0xEA, 0x39, 0x3C, 0x37, - 0x36, 0x30, 0x18, 0xCE, 0x10, 0x00, 0x18, 0xE6, 0x03, 0xC4, 0x0C, 0xC1, 0x0C, 0x26, 0xF7, 0xE6, - 0x01, 0x18, 0xE7, 0x05, 0x38, 0x38, 0x39, 0x3C, 0xC6, 0x07, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, - 0x16, 0xE7, 0x00, 0xC6, 0x25, 0xE7, 0x00, 0xC6, 0x34, 0xE7, 0x00, 0x38, 0x39, 0x3C, 0x3C, 0x30, - 0xCC, 0x00, 0x32, 0xED, 0x00, 0x1A, 0xEE, 0x00, 0x83, 0x00, 0x01, 0xED, 0x00, 0x18, 0x8C, 0x00, - 0x01, 0x22, 0xF2, 0x38, 0x38, 0x39, 0x01, 0x01, 0x01, 0x01, 0x01, 0x39, 0x3C, 0x5F, 0xCE, 0x16, - 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x8C, 0xC1, 0x01, 0x26, 0x05, 0xBD, 0x07, 0xAB, 0x20, 0x1F, 0x8D, - 0xE5, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, 0xF7, 0x8D, 0xDC, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, - 0xF7, 0xC6, 0x01, 0xE7, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x38, 0x39, - 0x3C, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xD7, 0x3B, 0x01, 0x1F, 0x02, 0x01, 0x05, 0x7C, 0x00, - 0x3B, 0xD6, 0x3B, 0xC1, 0x03, 0x25, 0xF2, 0x38, 0x39, 0x3C, 0x0F, 0xBD, 0x06, 0x26, 0x0E, 0x5F, - 0xF7, 0x01, 0x9F, 0xCE, 0x16, 0x00, 0xE7, 0x05, 0x5C, 0xE7, 0x03, 0xC6, 0xFF, 0xE7, 0x04, 0xCE, - 0x15, 0x00, 0xE6, 0x00, 0xC4, 0x80, 0xCA, 0x55, 0xF7, 0x01, 0x9D, 0xCC, 0x00, 0x21, 0xBD, 0x07, - 0xE0, 0xBD, 0x08, 0x0F, 0xBD, 0x07, 0xAB, 0xBD, 0x07, 0x3E, 0xBD, 0x07, 0xB4, 0x5F, 0xCE, 0x16, - 0x00, 0xE7, 0x00, 0xBD, 0x07, 0xF9, 0x5F, 0xF7, 0x01, 0x9E, 0xCE, 0x00, 0x00, 0xE7, 0xFF, 0xF6, - 0x01, 0x85, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x46, 0x30, 0xFD, 0x00, 0x58, 0xCC, 0x01, 0xA0, - 0xFD, 0x00, 0x5A, 0xBD, 0x07, 0xAB, 0xBD, 0x08, 0x2E, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xCC, - 0x01, 0x01, 0xCE, 0x15, 0x00, 0xED, 0x1C, 0xCC, 0x11, 0xA0, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xCE, - 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0x7D, 0x01, 0x84, 0x26, 0x03, - 0x7E, 0x09, 0xC2, 0xCE, 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, 0x1E, 0xD3, 0x26, 0xED, 0x1E, 0x1C, - 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0xD7, 0x32, 0xBD, 0x06, 0xBA, 0xCE, - 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x85, 0xC8, 0x01, - 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, 0x26, 0xED, 0x1E, - 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x84, 0xD7, 0x32, 0xBD, 0x06, 0xBA, - 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xCE, 0x15, 0x00, 0x1C, - 0x15, 0x04, 0xEC, 0x1E, 0xD3, 0x24, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x82, 0xD7, 0x31, - 0xF6, 0x01, 0x83, 0xD7, 0x32, 0xBD, 0x06, 0xBA, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, - 0xFA, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x82, 0xD7, 0x31, 0xF6, 0x01, 0x84, 0xD7, 0x32, 0xBD, 0x06, - 0xBA, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xD6, 0x22, 0x26, 0x03, 0x7E, 0x0A, 0x4B, 0xF6, - 0x01, 0x8C, 0x5A, 0x26, 0xF7, 0xF6, 0x01, 0x91, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xC6, 0x03, 0xE7, - 0x15, 0xCC, 0x15, 0xEC, 0xED, 0x1E, 0xCC, 0x01, 0x7D, 0xED, 0x1C, 0x1C, 0x15, 0x80, 0x20, 0x3B, - 0xF6, 0x01, 0x85, 0xC8, 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, - 0x1E, 0xD3, 0x26, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x83, - 0xD7, 0x32, 0xBD, 0x06, 0xBA, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, - 0xFF, 0xF6, 0x01, 0x82, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0x20, 0x91, 0xCE, 0x00, 0x00, 0xE6, 0xFF, - 0xC1, 0x01, 0x25, 0xF7, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xCC, - 0x05, 0xEC, 0xFD, 0x00, 0x5A, 0xDC, 0x20, 0xDD, 0x35, 0x5F, 0xD7, 0x3B, 0xD7, 0x2D, 0x13, 0x36, - 0x01, 0x18, 0xCE, 0x4C, 0xD0, 0xD6, 0x3B, 0x7C, 0x00, 0x3B, 0x58, 0x3A, 0x3C, 0xD6, 0x2D, 0x4F, - 0x05, 0xF3, 0x00, 0x5A, 0x8F, 0xEC, 0x00, 0x38, 0xED, 0x00, 0x74, 0x00, 0x35, 0x76, 0x00, 0x36, - 0x7C, 0x00, 0x2D, 0xD6, 0x2D, 0xC1, 0x0A, 0x25, 0xD5, 0xBD, 0x08, 0x62, 0xCC, 0x00, 0x35, 0xBD, - 0x07, 0xE0, 0x7E, 0x08, 0xC1, 0xC6, 0xFF, 0xCE, 0x16, 0x00, 0xE7, 0x04, 0x3B, 0xCE, 0x11, 0x00, - 0x1F, 0x00, 0x08, 0x03, 0x1C, 0x00, 0x04, 0x1F, 0x00, 0x20, 0x03, 0x1C, 0x00, 0x20, 0x3B, 0xCE, - 0x15, 0x00, 0x1C, 0x00, 0x02, 0xCE, 0x00, 0x00, 0x6C, 0xFF, 0x3B, 0xCE, 0x14, 0x00, 0x1C, 0x00, - 0x14, 0x3B, 0x5F, 0xCE, 0x10, 0x00, 0xE7, 0x04, 0x3B, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0x3B, - 0x3B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x05, 0x0D, 0x09, 0x04, 0xA1, 0x01, 0x85, 0x01, 0x09, 0x22, 0xA1, 0x02, - 0x09, 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, - 0x09, 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, - 0x05, 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, - 0x00, 0x00, 0x81, 0x02, 0x09, 0x31, 0x45, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, - 0x42, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, - 0x47, 0x81, 0x02, 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, - 0x01, 0x26, 0xFF, 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, - 0x00, 0x81, 0x02, 0x09, 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0x05, 0x0D, 0x09, 0x54, 0x95, - 0x01, 0x75, 0x08, 0x15, 0x00, 0x25, 0x05, 0x81, 0x02, 0x85, 0x02, 0x09, 0x55, 0xB1, 0x02, 0xC0, - 0x9C, 0x02, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x51, 0xC2, 0x01, 0x1C, - 0x00, 0x01, 0x01, 0x02, 0x03, 0x01, 0x00, 0x00, 0x09, 0x02, 0x22, 0x00, 0x01, 0x01, 0x00, 0x80, - 0x32, 0x09, 0x04, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x09, 0x21, 0x00, 0x01, 0x00, 0x01, - 0x22, 0x9C, 0x02, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x04, 0x00, 0x00, 0x04, 0x03, 0x09, 0x04, - 0x10, 0x03, 0x4E, 0x00, 0x55, 0x00, 0x56, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x4F, 0x00, 0x4E, 0x00, + 0x63, 0x5D, 0x5B, 0x00, 0xE3, 0x18, 0x30, 0xBC, 0x18, 0x47, 0x70, 0xB5, 0x00, 0x24, 0x09, 0xE0, + 0x0E, 0x5D, 0x05, 0x5D, 0xAE, 0x42, 0x02, 0xD1, 0x16, 0x5D, 0xAE, 0x42, 0x01, 0xD0, 0x00, 0x20, + 0x70, 0xBD, 0x64, 0x1C, 0x9C, 0x42, 0xF3, 0xDB, 0x01, 0x20, 0x70, 0xBD, 0xF0, 0xB5, 0x00, 0x25, + 0x89, 0xB0, 0x01, 0x26, 0xFF, 0x4F, 0x3C, 0x46, 0x20, 0x34, 0x00, 0x20, 0xA0, 0x70, 0x0A, 0x20, + 0xE0, 0x70, 0x03, 0x21, 0x01, 0x22, 0x08, 0x46, 0xF8, 0xF7, 0x80, 0xF9, 0x03, 0x21, 0x08, 0x46, + 0xF7, 0xF7, 0x3A, 0xFF, 0x7E, 0x75, 0x07, 0xAA, 0x00, 0x92, 0x01, 0x22, 0xF6, 0x49, 0xA0, 0x20, + 0x06, 0xAB, 0xFA, 0xF7, 0xA1, 0xFC, 0x01, 0x28, 0x08, 0xD1, 0x6B, 0x46, 0x18, 0x7E, 0x00, 0x28, + 0x04, 0xD0, 0xFF, 0x28, 0x02, 0xD0, 0x00, 0x20, 0x78, 0x75, 0x5F, 0xE0, 0x78, 0x7D, 0x00, 0x28, + 0x5C, 0xD0, 0x03, 0x21, 0x08, 0x46, 0xF8, 0xF7, 0x9B, 0xF9, 0x03, 0x20, 0xE0, 0x70, 0x02, 0x20, + 0xF7, 0xF7, 0x6C, 0xFE, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x0A, 0x46, 0x08, 0x96, 0x02, 0x91, + 0x03, 0x91, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xE4, 0x49, 0xA0, 0x20, 0x08, 0xAB, + 0xFA, 0xF7, 0x6E, 0xFB, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x0A, 0x46, 0x08, 0x96, 0x02, 0x91, + 0x03, 0x91, 0x08, 0xA9, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xDD, 0x49, 0xA0, 0x20, 0x08, 0xAB, + 0xFA, 0xF7, 0x5E, 0xFB, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, 0x02, 0x91, + 0x23, 0x20, 0x08, 0xA9, 0x08, 0x90, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xD4, 0x49, 0xA0, 0x20, + 0x08, 0xAB, 0xFA, 0xF7, 0x4D, 0xFB, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x03, 0x91, 0x0A, 0x46, + 0x02, 0x91, 0x45, 0x20, 0x08, 0xA9, 0x08, 0x90, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, 0xCC, 0x49, + 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x3C, 0xFB, 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x03, 0x91, + 0x0A, 0x46, 0x02, 0x91, 0x67, 0x20, 0x08, 0xA9, 0x08, 0x90, 0x01, 0x92, 0x00, 0x91, 0x01, 0x22, + 0xC3, 0x49, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0x2B, 0xFB, 0x0A, 0xE0, 0xBE, 0x48, 0x00, 0x22, + 0x01, 0x21, 0x40, 0x1E, 0xFF, 0xF7, 0x3D, 0xFF, 0x02, 0x20, 0xF7, 0xF7, 0x0F, 0xFE, 0xFD, 0xF7, + 0xF9, 0xFF, 0xF7, 0xF7, 0xBF, 0xFD, 0x01, 0x21, 0x02, 0x20, 0xF7, 0xF7, 0xB5, 0xFE, 0x01, 0x20, + 0xF7, 0xF7, 0x04, 0xFE, 0x01, 0x21, 0x02, 0x20, 0xF8, 0xF7, 0x2A, 0xF9, 0x01, 0x20, 0xF7, 0xF7, + 0xFD, 0xFD, 0x78, 0x7D, 0x00, 0x28, 0x2D, 0xD0, 0x80, 0x20, 0x08, 0x90, 0xFF, 0x20, 0xB8, 0x70, + 0x00, 0x21, 0x03, 0x22, 0x04, 0x92, 0x0A, 0x46, 0x02, 0x91, 0x03, 0x91, 0x08, 0xA9, 0x00, 0x91, + 0x01, 0x92, 0x13, 0x21, 0x01, 0x22, 0x09, 0x02, 0xA0, 0x20, 0x08, 0xAB, 0xFA, 0xF7, 0xF8, 0xFA, + 0x0A, 0x20, 0xF7, 0xF7, 0xE3, 0xFD, 0x78, 0x6B, 0x03, 0x22, 0xB9, 0x6B, 0x02, 0xAB, 0x07, 0xC3, + 0x01, 0x22, 0x00, 0x21, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0x9F, 0x49, 0xA0, 0x20, 0x00, 0x23, + 0xFA, 0xF7, 0xE6, 0xFA, 0xBE, 0x75, 0x78, 0x6B, 0x00, 0x78, 0x40, 0x28, 0x23, 0xD1, 0x00, 0x20, + 0xB8, 0x75, 0x20, 0xE0, 0x98, 0x48, 0x00, 0x22, 0x01, 0x21, 0x40, 0x1E, 0xFF, 0xF7, 0xF1, 0xFE, + 0xF6, 0xF7, 0x56, 0xF9, 0x6B, 0x46, 0x06, 0x90, 0x18, 0x7E, 0x00, 0x28, 0x05, 0xD1, 0x40, 0x20, + 0x06, 0x90, 0xA0, 0x78, 0x02, 0x21, 0x08, 0x43, 0xA0, 0x70, 0x6B, 0x46, 0x1A, 0x7E, 0x8E, 0x48, + 0x11, 0x46, 0xFF, 0xF7, 0xDE, 0xFE, 0x03, 0x20, 0xE0, 0x70, 0xF7, 0xF7, 0x77, 0xFD, 0x0D, 0x20, + 0xFD, 0xF7, 0xEE, 0xFE, 0xBE, 0x75, 0xFF, 0xF7, 0x27, 0xFE, 0xA0, 0x78, 0x04, 0x21, 0x08, 0x43, + 0xA0, 0x70, 0x00, 0x20, 0x07, 0x90, 0xF9, 0xF7, 0x9F, 0xFC, 0x3E, 0x28, 0x04, 0xD1, 0xA0, 0x78, + 0xFB, 0x21, 0x08, 0x40, 0xA0, 0x70, 0x08, 0xE0, 0xF7, 0xF7, 0x72, 0xFD, 0x6B, 0x46, 0x18, 0x7F, + 0x40, 0x1C, 0xC0, 0xB2, 0x07, 0x90, 0x32, 0x28, 0xED, 0xD3, 0xFC, 0xF7, 0x51, 0xFC, 0x7D, 0x48, + 0x00, 0x78, 0xC9, 0x28, 0x38, 0x7B, 0x04, 0xD1, 0x00, 0x28, 0x08, 0xD0, 0x7A, 0x49, 0x7B, 0x48, + 0x03, 0xE0, 0x00, 0x28, 0x03, 0xD0, 0x7A, 0x49, 0x7A, 0x48, 0x00, 0xF0, 0x61, 0xF9, 0x38, 0x7B, + 0x00, 0x28, 0x39, 0xD1, 0x05, 0x20, 0xF7, 0xF7, 0x79, 0xFD, 0x0D, 0x20, 0xFD, 0xF7, 0xB8, 0xFE, + 0x0A, 0x20, 0xF7, 0xF7, 0x73, 0xFD, 0x65, 0x20, 0xFD, 0xF7, 0xB2, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, + 0x6D, 0xFD, 0x20, 0x20, 0xFD, 0xF7, 0xAC, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, 0x67, 0xFD, 0x34, 0x20, + 0xFD, 0xF7, 0xA6, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, 0x61, 0xFD, 0x30, 0x20, 0xFD, 0xF7, 0xA0, 0xFE, + 0x0A, 0x20, 0xF7, 0xF7, 0x5B, 0xFD, 0x31, 0x20, 0xFD, 0xF7, 0x9A, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, + 0x55, 0xFD, 0x30, 0x20, 0xFD, 0xF7, 0x94, 0xFE, 0x0A, 0x20, 0xF7, 0xF7, 0x4F, 0xFD, 0x62, 0x48, + 0x81, 0x68, 0x01, 0x22, 0x52, 0x02, 0x91, 0x43, 0x81, 0x60, 0x81, 0x68, 0x92, 0x00, 0x91, 0x43, + 0x81, 0x60, 0x0D, 0x20, 0xFD, 0xF7, 0x84, 0xFE, 0x02, 0x20, 0xFF, 0xF7, 0xFF, 0xFD, 0xA0, 0x78, + 0x08, 0x21, 0x08, 0x43, 0xA0, 0x70, 0x00, 0x20, 0x07, 0x90, 0xF9, 0xF7, 0x35, 0xFC, 0x21, 0x28, + 0x04, 0xD1, 0xA0, 0x78, 0xF7, 0x21, 0x08, 0x40, 0xA0, 0x70, 0x08, 0xE0, 0xF7, 0xF7, 0x08, 0xFD, + 0x6B, 0x46, 0x18, 0x7F, 0x40, 0x1C, 0xC0, 0xB2, 0x07, 0x90, 0x14, 0x28, 0xED, 0xD3, 0x4E, 0x48, + 0x81, 0x68, 0x01, 0x22, 0x52, 0x02, 0x11, 0x43, 0x81, 0x60, 0x81, 0x68, 0x92, 0x00, 0x11, 0x43, + 0x81, 0x60, 0x78, 0x6B, 0x03, 0x22, 0xB9, 0x6B, 0x02, 0xAB, 0x07, 0xC3, 0x01, 0x22, 0x00, 0x21, + 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0xFF, 0x21, 0x9E, 0x31, 0xA0, 0x20, 0x00, 0x23, 0xFA, 0xF7, + 0x1F, 0xFA, 0x78, 0x6B, 0x00, 0x78, 0x40, 0x06, 0x40, 0x0E, 0x55, 0x28, 0x05, 0xD1, 0xB8, 0x6B, + 0x00, 0x78, 0x40, 0x06, 0x40, 0x0E, 0x55, 0x28, 0x03, 0xD0, 0xA0, 0x78, 0x10, 0x21, 0x08, 0x43, + 0xA0, 0x70, 0xA0, 0x78, 0x00, 0x28, 0x0B, 0xD0, 0x6D, 0x1C, 0xED, 0xB2, 0x02, 0x2D, 0x01, 0xD2, + 0x3E, 0x73, 0x5A, 0xE6, 0x78, 0x7A, 0x00, 0x28, 0xFC, 0xD0, 0xFA, 0xF7, 0x75, 0xFE, 0xF9, 0xE7, + 0x78, 0x6B, 0x32, 0x49, 0x00, 0x78, 0x00, 0x06, 0x03, 0xD5, 0x31, 0x48, 0xC0, 0x7A, 0xC0, 0x09, + 0x04, 0xD0, 0x08, 0x78, 0x05, 0x28, 0x01, 0xD9, 0x05, 0x20, 0x08, 0x70, 0x00, 0x24, 0x2C, 0x4A, + 0x07, 0x94, 0x60, 0x3A, 0x6B, 0x46, 0x1B, 0x7F, 0xD0, 0x18, 0x60, 0x30, 0xC5, 0x7F, 0xFF, 0x2D, + 0x0D, 0xD0, 0xC5, 0x7F, 0x02, 0x2D, 0x02, 0xD0, 0xC0, 0x7F, 0x03, 0x28, 0x02, 0xD1, 0xFF, 0x20, + 0x07, 0x90, 0x0D, 0xE0, 0x5B, 0x1C, 0xD8, 0xB2, 0x07, 0x90, 0x10, 0x28, 0xEA, 0xD3, 0x6B, 0x46, + 0x18, 0x7F, 0xFF, 0x28, 0x04, 0xD0, 0x08, 0x78, 0x02, 0x28, 0x01, 0xD9, 0x02, 0x20, 0x08, 0x70, + 0x00, 0x21, 0x08, 0x46, 0xF9, 0xF7, 0xFE, 0xFA, 0xF6, 0xF7, 0xC6, 0xFA, 0x00, 0x21, 0x03, 0x22, + 0x03, 0x91, 0x04, 0x92, 0x08, 0x90, 0x02, 0x91, 0x0A, 0x46, 0xB9, 0x6B, 0x00, 0x91, 0x01, 0x92, + 0x08, 0xAB, 0x7D, 0x6B, 0x1A, 0x78, 0xFF, 0x21, 0x02, 0x31, 0xA0, 0x20, 0x2B, 0x46, 0xFA, 0xF7, + 0xB7, 0xF9, 0x7B, 0x6B, 0x78, 0x7D, 0x18, 0x70, 0xB8, 0x7D, 0x03, 0x22, 0x58, 0x70, 0x00, 0x21, + 0x02, 0x91, 0x17, 0xE0, 0x1C, 0x00, 0x00, 0x20, 0x22, 0x15, 0x00, 0x00, 0x03, 0x13, 0x00, 0x00, + 0x04, 0x14, 0x00, 0x00, 0x2B, 0x01, 0x00, 0x20, 0x83, 0x04, 0x00, 0x00, 0x6D, 0xB5, 0x00, 0x00, + 0x49, 0x0A, 0x00, 0x00, 0x24, 0xAB, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0x36, 0x01, 0x00, 0x20, + 0x14, 0x04, 0x00, 0x20, 0x03, 0x91, 0x01, 0x91, 0x04, 0x92, 0xFF, 0x21, 0x00, 0x93, 0x02, 0x22, + 0x9C, 0x31, 0xA0, 0x20, 0xFA, 0xF7, 0x8C, 0xF9, 0x78, 0x7D, 0x00, 0x28, 0x12, 0xD0, 0x7B, 0x6B, + 0xDD, 0x20, 0x18, 0x70, 0xB8, 0x7D, 0x00, 0x28, 0x00, 0xD0, 0x1C, 0x70, 0x00, 0x21, 0x03, 0x22, + 0x02, 0x91, 0x03, 0x91, 0x04, 0x92, 0x01, 0x91, 0x00, 0x93, 0x01, 0x22, 0x06, 0x49, 0xA0, 0x20, + 0xFA, 0xF7, 0x76, 0xF9, 0xF7, 0xF7, 0x16, 0xFC, 0xFF, 0xF7, 0x66, 0xFD, 0x01, 0x20, 0xF7, 0xF7, + 0x5D, 0xFC, 0x09, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x21, 0x15, 0x00, 0x00, 0xF8, 0xB5, 0x00, 0x20, + 0x00, 0xF0, 0xEA, 0xF8, 0x17, 0x4E, 0x18, 0x4F, 0x01, 0x25, 0x75, 0x74, 0xF6, 0xF7, 0x04, 0xFE, + 0x02, 0x20, 0xFD, 0xF7, 0xD7, 0xF9, 0xFF, 0xF7, 0x4F, 0xFD, 0xF7, 0xF7, 0x35, 0xFC, 0x13, 0x48, + 0x00, 0x78, 0x00, 0x28, 0x1A, 0xD1, 0xFD, 0xF7, 0xB9, 0xFE, 0x04, 0x46, 0x01, 0x20, 0xFD, 0xF7, + 0xC9, 0xF9, 0xFC, 0xF7, 0x73, 0xFF, 0x38, 0x78, 0xCA, 0x28, 0x04, 0xD1, 0x00, 0x2C, 0x0D, 0xD1, + 0xFA, 0xF7, 0x0A, 0xFB, 0xE1, 0xE7, 0x00, 0x28, 0x08, 0xD1, 0xF7, 0xF7, 0xD9, 0xF9, 0xFA, 0xF7, + 0x0D, 0xF9, 0xFD, 0xF7, 0x15, 0xF9, 0xFC, 0xF7, 0x27, 0xFC, 0xD6, 0xE7, 0xFD, 0xF7, 0x10, 0xF9, + 0xD3, 0xE7, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x2B, 0x01, 0x00, 0x20, 0x1C, 0x02, 0x00, 0x20, + 0xF8, 0xB5, 0x05, 0x46, 0x0F, 0x46, 0x65, 0x20, 0xFD, 0xF7, 0x5A, 0xFD, 0x28, 0x4E, 0x06, 0x21, + 0x38, 0x46, 0xF5, 0xF7, 0xAB, 0xFC, 0x04, 0x46, 0x01, 0x46, 0x2A, 0x46, 0x30, 0x46, 0x00, 0xF0, + 0x4B, 0xF8, 0x20, 0x20, 0xFD, 0xF7, 0x4C, 0xFD, 0x30, 0x19, 0x86, 0xB2, 0x2D, 0x19, 0x2A, 0x46, + 0x21, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x40, 0xF8, 0x34, 0x20, 0xFD, 0xF7, 0x41, 0xFD, 0x30, 0x19, + 0x86, 0xB2, 0x2D, 0x19, 0x2A, 0x46, 0x21, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x35, 0xF8, 0x30, 0x20, + 0xFD, 0xF7, 0x36, 0xFD, 0x30, 0x19, 0x86, 0xB2, 0x2D, 0x19, 0x2A, 0x46, 0x21, 0x46, 0x30, 0x46, + 0x00, 0xF0, 0x2A, 0xF8, 0x31, 0x20, 0xFD, 0xF7, 0x2B, 0xFD, 0x30, 0x19, 0x86, 0xB2, 0x2D, 0x19, + 0x2A, 0x46, 0x21, 0x46, 0x30, 0x46, 0x00, 0xF0, 0x1F, 0xF8, 0x30, 0x20, 0xFD, 0xF7, 0x20, 0xFD, + 0x30, 0x19, 0x83, 0xB2, 0xA1, 0x00, 0x60, 0x18, 0x38, 0x1A, 0x81, 0xB2, 0x2A, 0x19, 0x18, 0x46, + 0x00, 0xF0, 0x12, 0xF8, 0x07, 0x48, 0x81, 0x68, 0x01, 0x22, 0x52, 0x02, 0x91, 0x43, 0x81, 0x60, + 0x81, 0x68, 0x92, 0x00, 0x91, 0x43, 0x81, 0x60, 0x0D, 0x20, 0xFD, 0xF7, 0x09, 0xFD, 0xF8, 0xBD, + 0x10, 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0x50, 0xF7, 0xB5, 0x88, 0xB0, 0x27, 0x48, 0x07, 0x90, + 0x00, 0x24, 0x27, 0x48, 0x27, 0x4D, 0x17, 0x46, 0x01, 0x26, 0x06, 0x90, 0xA8, 0x78, 0x00, 0x28, + 0x42, 0xD1, 0x07, 0xE0, 0x64, 0x1C, 0xE4, 0xB2, 0x03, 0x2C, 0x03, 0xD3, 0xA8, 0x78, 0x30, 0x43, + 0xA8, 0x70, 0x17, 0xE0, 0x00, 0x21, 0x03, 0x22, 0x02, 0x91, 0x03, 0x91, 0x04, 0x92, 0x01, 0x91, + 0x3B, 0x46, 0x00, 0x97, 0xA0, 0x20, 0x09, 0x9A, 0x08, 0x99, 0xFA, 0xF7, 0xB1, 0xF8, 0x01, 0x28, + 0xE8, 0xD1, 0x07, 0xE0, 0x64, 0x1C, 0xE4, 0xB2, 0x03, 0x2C, 0x03, 0xD3, 0xA8, 0x78, 0x30, 0x43, + 0xA8, 0x70, 0x11, 0xE0, 0x03, 0x22, 0x07, 0x99, 0x06, 0x98, 0x04, 0x92, 0x02, 0x91, 0x00, 0x21, + 0x09, 0x9A, 0x03, 0x90, 0x01, 0x92, 0x00, 0x91, 0x0A, 0x46, 0xA0, 0x20, 0x00, 0x23, 0x08, 0x99, + 0xFA, 0xF7, 0x96, 0xF8, 0x01, 0x28, 0xE5, 0xD1, 0x38, 0x46, 0x09, 0x9B, 0x06, 0x9A, 0x07, 0x99, + 0xFF, 0xF7, 0xCB, 0xFC, 0x00, 0x28, 0x07, 0xD1, 0x20, 0x46, 0x64, 0x1C, 0xE4, 0xB2, 0x03, 0x28, + 0xBC, 0xD3, 0xA8, 0x78, 0x30, 0x43, 0xA8, 0x70, 0x0B, 0xB0, 0xF0, 0xBD, 0x00, 0x07, 0x00, 0x20, + 0x4C, 0x10, 0x00, 0x20, 0x3C, 0x00, 0x00, 0x20, 0x10, 0xB5, 0x00, 0x28, 0x06, 0xD0, 0x01, 0x28, + 0x06, 0xD0, 0x02, 0x28, 0x04, 0xD0, 0x03, 0x28, 0x13, 0xD1, 0x0B, 0xE0, 0xFB, 0xF7, 0x82, 0xF9, + 0xFF, 0xF7, 0xDA, 0xFB, 0xFC, 0xF7, 0x14, 0xFE, 0xFD, 0xF7, 0x06, 0xF9, 0xFA, 0xF7, 0x82, 0xFC, + 0xFE, 0xF7, 0x86, 0xFE, 0x02, 0x20, 0xFF, 0xF7, 0x11, 0xFC, 0xFF, 0xF7, 0xAF, 0xFC, 0xFE, 0xF7, + 0xDF, 0xFC, 0x10, 0xBD, 0x4F, 0xCE, 0x00, 0x50, 0x20, 0x03, 0xA7, 0x00, 0x08, 0x8C, 0x00, 0x5C, + 0x26, 0xF8, 0x8E, 0x00, 0xFE, 0xBD, 0x46, 0xDB, 0x20, 0xFE, 0x3C, 0xCC, 0x4A, 0x1D, 0xCE, 0x00, + 0x00, 0xED, 0x10, 0xCC, 0x4A, 0x25, 0xED, 0x12, 0xCC, 0x4A, 0x37, 0xED, 0x14, 0xCC, 0x4A, 0x43, + 0xED, 0x16, 0xCC, 0x4A, 0x4A, 0xED, 0x18, 0xCC, 0x4A, 0x51, 0xED, 0x1C, 0xC6, 0x03, 0xCE, 0x10, + 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x01, 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xCE, 0x11, 0x00, 0xE7, + 0x00, 0xE7, 0x01, 0xCC, 0x3A, 0x98, 0xED, 0x02, 0xCC, 0x00, 0xFF, 0xED, 0x04, 0x5F, 0xED, 0x06, + 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x04, 0xED, 0x01, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0xC6, + 0x09, 0xE7, 0x03, 0xC6, 0x80, 0xCE, 0x14, 0x00, 0xE7, 0x00, 0xC6, 0x50, 0xE7, 0x01, 0x5F, 0xED, + 0x02, 0xE7, 0x04, 0xC6, 0x54, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x15, 0x86, 0x02, 0xED, + 0x1C, 0x4C, 0xED, 0x1E, 0xE7, 0x20, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xE7, 0x01, 0xE7, 0x02, 0xE7, + 0x03, 0xE7, 0x04, 0xE7, 0x05, 0x5C, 0xE7, 0x06, 0x5F, 0xE7, 0x07, 0x07, 0x84, 0x7F, 0x06, 0x38, + 0x39, 0x3C, 0xFE, 0x00, 0x5A, 0xF6, 0x01, 0x9C, 0x26, 0x3C, 0xEC, 0x00, 0x04, 0x04, 0xED, 0x00, + 0xEC, 0x02, 0x04, 0x04, 0xED, 0x02, 0xEC, 0x04, 0x04, 0x04, 0xED, 0x04, 0xEC, 0x06, 0x04, 0x04, + 0xED, 0x06, 0xEC, 0x08, 0x04, 0x04, 0xED, 0x08, 0xEC, 0x0A, 0x04, 0x04, 0xED, 0x0A, 0xEC, 0x0C, + 0x04, 0x04, 0xED, 0x0C, 0xEC, 0x0E, 0x04, 0x04, 0xED, 0x0E, 0xEC, 0x10, 0x04, 0x04, 0xED, 0x10, + 0xEC, 0x12, 0x04, 0x04, 0xED, 0x12, 0x18, 0xFE, 0x00, 0x58, 0x18, 0xEC, 0x00, 0xA3, 0x00, 0x2C, + 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x4B, + 0x18, 0xEC, 0x02, 0xA3, 0x02, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, + 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x4A, 0x18, 0xEC, 0x04, 0xA3, 0x04, 0x2C, 0x03, 0x5F, 0x20, 0x0A, + 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x49, 0x18, 0xEC, 0x06, 0xA3, + 0x06, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, + 0xD7, 0x48, 0x18, 0xEC, 0x08, 0xA3, 0x08, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, + 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x47, 0x18, 0xEC, 0x0A, 0xA3, 0x0A, 0x2C, 0x03, 0x5F, + 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x46, 0x18, 0xEC, + 0x0C, 0xA3, 0x0C, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, + 0xC6, 0xFF, 0xD7, 0x45, 0x18, 0xEC, 0x0E, 0xA3, 0x0E, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, + 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x44, 0x18, 0xEC, 0x10, 0xA3, 0x10, 0x2C, + 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x43, + 0x18, 0xEC, 0x12, 0xA3, 0x12, 0x2C, 0x03, 0x5F, 0x20, 0x0A, 0x81, 0x03, 0x2E, 0x04, 0x04, 0x04, + 0x20, 0x02, 0xC6, 0xFF, 0xD7, 0x42, 0xD6, 0x4B, 0xFE, 0x00, 0x50, 0xE7, 0x00, 0x08, 0xFF, 0x00, + 0x50, 0xFE, 0x00, 0x56, 0xD6, 0x4A, 0xD0, 0x4B, 0xE7, 0x00, 0xD6, 0x49, 0xD0, 0x4B, 0xE7, 0x01, + 0xD6, 0x48, 0xD0, 0x4B, 0xE7, 0x02, 0xD6, 0x47, 0xD0, 0x4B, 0xE7, 0x03, 0xD6, 0x46, 0xD0, 0x4B, + 0xE7, 0x04, 0xD6, 0x45, 0xD0, 0x4B, 0xE7, 0x05, 0xD6, 0x44, 0xD0, 0x4B, 0xE7, 0x06, 0xD6, 0x43, + 0xD0, 0x4B, 0xE7, 0x07, 0xD6, 0x42, 0xD0, 0x4B, 0xE7, 0x08, 0xD6, 0x36, 0x5A, 0x4F, 0xF3, 0x00, + 0x56, 0xFD, 0x00, 0x56, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x5A, 0xFC, 0x00, 0x58, + 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x58, 0x7A, 0x00, 0x35, 0x27, 0x03, 0x7E, 0x40, 0xBE, 0x38, 0x39, + 0x3C, 0xFE, 0x00, 0x5A, 0x18, 0xFE, 0x00, 0x58, 0xF6, 0x01, 0x9C, 0x5A, 0x26, 0x4C, 0xEC, 0x00, + 0xC3, 0x02, 0x00, 0x18, 0xED, 0x00, 0xEC, 0x02, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x02, 0xEC, 0x04, + 0xC3, 0x02, 0x00, 0x18, 0xED, 0x04, 0xEC, 0x06, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x06, 0xEC, 0x08, + 0xC3, 0x02, 0x00, 0x18, 0xED, 0x08, 0xEC, 0x0A, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0A, 0xEC, 0x0C, + 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0C, 0xEC, 0x0E, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0E, 0xEC, 0x10, + 0xC3, 0x02, 0x00, 0x18, 0xED, 0x10, 0xEC, 0x12, 0x20, 0x5E, 0xEC, 0x00, 0x04, 0x04, 0xC3, 0x02, + 0x00, 0x18, 0xED, 0x00, 0xEC, 0x02, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x02, 0xEC, 0x04, + 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x04, 0xEC, 0x06, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, + 0xED, 0x06, 0xEC, 0x08, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x08, 0xEC, 0x0A, 0x04, 0x04, + 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0A, 0xEC, 0x0C, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0C, + 0xEC, 0x0E, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x0E, 0xEC, 0x10, 0x04, 0x04, 0xC3, 0x02, + 0x00, 0x18, 0xED, 0x10, 0xEC, 0x12, 0x04, 0x04, 0xC3, 0x02, 0x00, 0x18, 0xED, 0x12, 0xFC, 0x00, + 0x58, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x58, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x14, 0xFD, 0x00, 0x5A, + 0x7A, 0x00, 0x35, 0x27, 0x03, 0x7E, 0x42, 0x4D, 0x38, 0x39, 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x24, + 0x04, 0xBD, 0x42, 0x4C, 0x39, 0xBD, 0x40, 0xBD, 0x39, 0x3C, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, + 0xE7, 0x00, 0xF6, 0x01, 0x86, 0xE7, 0x19, 0xF6, 0x01, 0x87, 0xE7, 0x1A, 0xF6, 0x01, 0x88, 0xE7, + 0x1B, 0xF6, 0x01, 0x89, 0xE7, 0x16, 0xF6, 0x01, 0x8A, 0xE7, 0x17, 0xF6, 0x01, 0x8B, 0xE7, 0x18, + 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x2F, 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x84, 0x3D, + 0xD7, 0x2E, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x2D, 0xF6, 0x01, 0x82, 0xB6, 0x01, + 0x84, 0x3D, 0xD7, 0x2C, 0xF6, 0x01, 0x81, 0x86, 0x14, 0x3D, 0xDD, 0x2A, 0xF6, 0x01, 0x82, 0x86, + 0x14, 0x3D, 0xDD, 0x28, 0xF6, 0x01, 0x81, 0xFB, 0x01, 0x82, 0xD7, 0x27, 0x7D, 0x01, 0x84, 0x27, + 0x03, 0x78, 0x00, 0x27, 0xF6, 0x01, 0x92, 0xC1, 0x0A, 0x24, 0x05, 0xC6, 0x0A, 0xF7, 0x01, 0x92, + 0x38, 0x39, 0x01, 0x01, 0xCF, 0x7D, 0x01, 0x9F, 0x26, 0xFB, 0x39, 0x3C, 0x5F, 0xD7, 0x25, 0xF6, + 0x01, 0x93, 0x5A, 0x26, 0x02, 0x38, 0x39, 0xF6, 0x01, 0x90, 0x54, 0x54, 0xD7, 0x22, 0xB6, 0x01, + 0x8F, 0x5F, 0xFB, 0x01, 0x8E, 0x89, 0x00, 0xDD, 0x23, 0xDD, 0x39, 0x5F, 0xD7, 0x31, 0xD6, 0x3A, + 0xC4, 0x01, 0x4F, 0x83, 0x00, 0x01, 0x26, 0x03, 0x7C, 0x00, 0x25, 0x74, 0x00, 0x39, 0x76, 0x00, + 0x3A, 0xD6, 0x31, 0xC1, 0x08, 0x24, 0x13, 0xCE, 0x4F, 0xC0, 0x58, 0x3A, 0x4F, 0x5F, 0xED, 0x00, + 0xCE, 0x4F, 0xF0, 0xD6, 0x31, 0x58, 0x3A, 0x5F, 0xED, 0x00, 0x7C, 0x00, 0x31, 0xD6, 0x31, 0xC1, + 0x0A, 0x25, 0xCB, 0x38, 0x39, 0x3C, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, + 0xE7, 0xFF, 0xD6, 0x25, 0x27, 0x1F, 0xF6, 0x01, 0x8C, 0x5A, 0x26, 0x19, 0xF6, 0x01, 0x91, 0xCE, + 0x15, 0x00, 0xE7, 0x00, 0xC6, 0x03, 0xE7, 0x15, 0xCC, 0x15, 0xEC, 0xED, 0x1E, 0xCC, 0x01, 0x7D, + 0xED, 0x1C, 0x1C, 0x15, 0x80, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0x38, 0x39, 0x3C, 0xCC, + 0x05, 0xEC, 0xFD, 0x00, 0x5A, 0xDC, 0x23, 0xDD, 0x39, 0x5F, 0xD7, 0x3F, 0xD7, 0x31, 0xD6, 0x3A, + 0xC4, 0x01, 0x4F, 0x1A, 0x83, 0x00, 0x01, 0x26, 0x22, 0xD6, 0x31, 0x05, 0xF3, 0x00, 0x5A, 0x8F, + 0xEC, 0x00, 0xDD, 0x3B, 0x7D, 0x01, 0x9C, 0x26, 0x04, 0x04, 0x04, 0xDD, 0x3B, 0xCE, 0x4F, 0xD0, + 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x58, 0x3A, 0xDC, 0x3B, 0xED, 0x00, 0x74, 0x00, 0x39, 0x76, 0x00, + 0x3A, 0x7C, 0x00, 0x31, 0xD6, 0x31, 0xC1, 0x0A, 0x25, 0xC4, 0x7D, 0x01, 0x9D, 0x27, 0x05, 0xFC, + 0x4F, 0xC0, 0x26, 0x02, 0x38, 0x39, 0xCC, 0x4F, 0xC0, 0xFD, 0x00, 0x5A, 0x5F, 0xD7, 0x31, 0x20, + 0x64, 0xFE, 0x00, 0x5A, 0xEC, 0x10, 0xDD, 0x3B, 0xD6, 0x20, 0x27, 0x0E, 0xEC, 0x00, 0xD3, 0x3B, + 0x04, 0xED, 0x00, 0x4F, 0x5F, 0xED, 0x30, 0x7A, 0x00, 0x20, 0xEC, 0x00, 0x93, 0x3B, 0xDD, 0x37, + 0xEC, 0x20, 0xD8, 0x38, 0x98, 0x37, 0xDD, 0x33, 0xDC, 0x37, 0xED, 0x20, 0xDC, 0x33, 0x2F, 0x13, + 0xD6, 0x22, 0x4F, 0x1A, 0x93, 0x37, 0x2D, 0x04, 0xD3, 0x37, 0x2C, 0x07, 0xEC, 0x30, 0xC3, 0x00, + 0x01, 0x20, 0x02, 0x4F, 0x5F, 0xED, 0x30, 0x83, 0x00, 0x03, 0x22, 0x08, 0xF6, 0x01, 0x90, 0x4F, + 0x93, 0x37, 0x2C, 0x03, 0x7C, 0x00, 0x21, 0x7C, 0x00, 0x31, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x02, + 0xFD, 0x00, 0x5A, 0xD6, 0x31, 0xD1, 0x25, 0x25, 0x98, 0x38, 0x39, 0x3C, 0x37, 0x36, 0x30, 0x18, + 0xCE, 0x10, 0x00, 0x18, 0xE6, 0x03, 0xC4, 0x0C, 0xC1, 0x0C, 0x26, 0xF7, 0xE6, 0x01, 0x18, 0xE7, + 0x05, 0x38, 0x38, 0x39, 0x3C, 0xC6, 0x07, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x16, 0xE7, 0x00, + 0xC6, 0x25, 0xE7, 0x00, 0xC6, 0x34, 0xE7, 0x00, 0x38, 0x39, 0xD6, 0x27, 0xD7, 0x35, 0xF6, 0x01, + 0x9C, 0xD7, 0x3D, 0xC6, 0x01, 0xF7, 0x01, 0x9C, 0xBD, 0x42, 0x4C, 0xD6, 0x3D, 0xF7, 0x01, 0x9C, + 0x39, 0x3C, 0x5F, 0xD7, 0x3F, 0xD7, 0x41, 0x20, 0x73, 0xFE, 0x00, 0x54, 0x3A, 0xE6, 0x00, 0xD7, + 0x3D, 0xC1, 0x04, 0x23, 0x16, 0xC1, 0xFC, 0x24, 0x12, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, + 0x3F, 0x3A, 0xD6, 0x3D, 0xE7, 0x00, 0x7C, 0x00, 0x41, 0x20, 0x51, 0xC6, 0x01, 0xD7, 0x3E, 0x20, + 0x35, 0xFE, 0x00, 0x54, 0x3A, 0xE6, 0x00, 0xD7, 0x3D, 0xC1, 0x04, 0x23, 0x26, 0xC1, 0xFC, 0x24, + 0x22, 0xD6, 0x3E, 0xC1, 0x01, 0x23, 0x2A, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, + 0xC6, 0x01, 0xE7, 0x00, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, 0xD6, 0x3E, 0xE7, + 0x00, 0x20, 0x19, 0x7C, 0x00, 0x3E, 0x7C, 0x00, 0x41, 0xD6, 0x41, 0xD1, 0x30, 0x25, 0xC2, 0x20, + 0xD0, 0xFE, 0x00, 0x52, 0xD6, 0x3F, 0x7C, 0x00, 0x3F, 0x3A, 0x6F, 0x00, 0xD6, 0x41, 0xD1, 0x30, + 0x25, 0x87, 0xD6, 0x3F, 0x4F, 0xF3, 0x00, 0x52, 0xFD, 0x00, 0x52, 0xD6, 0x30, 0x4F, 0xF3, 0x00, + 0x54, 0xFD, 0x00, 0x54, 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, 0x00, 0x64, 0xED, 0x00, 0x1A, 0xEE, + 0x00, 0x83, 0x00, 0x01, 0xED, 0x00, 0x18, 0x8C, 0x00, 0x01, 0x22, 0xF2, 0x38, 0x38, 0x39, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x39, 0x3C, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x8C, 0xC1, + 0x01, 0x26, 0x05, 0xBD, 0x43, 0xAE, 0x20, 0x1F, 0x8D, 0xE5, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, + 0xF7, 0x8D, 0xDC, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, 0xF7, 0xC6, 0x01, 0xE7, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x38, 0x39, 0x3C, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, + 0xD7, 0x3F, 0x01, 0x1F, 0x02, 0x01, 0x05, 0x7C, 0x00, 0x3F, 0xD6, 0x3F, 0xC1, 0x03, 0x25, 0xF2, + 0x38, 0x39, 0x3C, 0x7D, 0x01, 0x8C, 0x26, 0x18, 0x7D, 0x01, 0x9B, 0x26, 0x09, 0xC6, 0x01, 0xCE, + 0x15, 0x00, 0xE7, 0x21, 0x8D, 0x99, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xBD, 0x45, 0xF2, + 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, 0x07, 0x10, 0xFD, 0x00, 0x50, 0xD6, 0x27, 0x4F, 0xC3, 0x07, + 0x10, 0xFD, 0x00, 0x52, 0x4F, 0x5F, 0xDD, 0x33, 0xF3, 0x00, 0x52, 0x18, 0x8F, 0x18, 0xE6, 0x00, + 0xD7, 0x3D, 0xF1, 0x01, 0x92, 0x23, 0x13, 0x4F, 0xED, 0x00, 0xC6, 0xFF, 0xF0, 0x01, 0x92, 0x82, + 0x00, 0xA3, 0x00, 0x2F, 0x05, 0x7C, 0x00, 0x21, 0x20, 0x13, 0xD6, 0x3D, 0x5A, 0x26, 0x09, 0xDC, + 0x33, 0xC3, 0x00, 0x01, 0xDD, 0x33, 0x20, 0x08, 0xD6, 0x3D, 0x5C, 0x26, 0x03, 0x38, 0x38, 0x39, + 0xDC, 0x33, 0xC3, 0x00, 0x01, 0xDD, 0x33, 0x1A, 0x83, 0x02, 0x30, 0x2D, 0xBB, 0x20, 0xEE, 0x3C, + 0x0F, 0xBD, 0x40, 0x26, 0x0E, 0x5F, 0xF7, 0x01, 0x9F, 0xCE, 0x16, 0x00, 0xE7, 0x05, 0x5C, 0xE7, + 0x03, 0xC6, 0xFF, 0xE7, 0x04, 0xCE, 0x15, 0x00, 0xE6, 0x00, 0xC4, 0x80, 0xCA, 0x55, 0xF7, 0x01, + 0x9D, 0xCC, 0x00, 0x21, 0xBD, 0x45, 0x17, 0xBD, 0x45, 0xF2, 0xBD, 0x43, 0xAE, 0xBD, 0x43, 0x35, + 0xBD, 0x43, 0xB7, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xBD, 0x45, 0x30, 0x5F, 0xF7, 0x01, 0x9E, + 0xD7, 0x26, 0xF7, 0x01, 0x9D, 0xCE, 0x00, 0x00, 0xE7, 0xFF, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, + 0xF6, 0x01, 0x85, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x09, 0x50, 0xFD, 0x00, 0x58, 0xCC, 0x0D, + 0xC0, 0xFD, 0x00, 0x56, 0xCC, 0x01, 0xA0, 0xFD, 0x00, 0x5A, 0xCC, 0x0D, 0xC0, 0xFD, 0x00, 0x54, + 0xCC, 0x07, 0x10, 0xFD, 0x00, 0x50, 0xD6, 0x27, 0x4F, 0xC3, 0x07, 0x10, 0xFD, 0x00, 0x52, 0x5F, + 0xD7, 0x21, 0x7D, 0x01, 0x9B, 0x26, 0x14, 0xF6, 0x01, 0x9D, 0x5A, 0x26, 0x0E, 0x7D, 0x01, 0x8C, + 0x26, 0x09, 0xBD, 0x45, 0xF2, 0x5F, 0xCE, 0x15, 0x00, 0xE7, 0x21, 0xBD, 0x43, 0xAE, 0xF6, 0x01, + 0x9D, 0x27, 0x49, 0x5A, 0x27, 0x0B, 0x5A, 0x27, 0x13, 0x5A, 0x27, 0x2A, 0x5A, 0x27, 0x2A, 0x20, + 0x99, 0xCE, 0x14, 0x00, 0x1D, 0x00, 0x80, 0xBD, 0x46, 0x5E, 0x20, 0x30, 0xD7, 0x26, 0x7D, 0x01, + 0x8C, 0x26, 0x07, 0xC6, 0xAF, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xC6, 0x01, 0xF7, 0x01, 0x9D, 0xC6, + 0x04, 0xD7, 0x20, 0x7E, 0x47, 0x26, 0xBD, 0x46, 0x5E, 0x5F, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0x7F, + 0x01, 0x9D, 0xC6, 0x35, 0xCE, 0x10, 0x00, 0xE7, 0x05, 0x7E, 0x47, 0x26, 0xBD, 0x46, 0x11, 0xF6, + 0x01, 0x93, 0x5A, 0x26, 0x47, 0x7D, 0x01, 0x8E, 0x27, 0x0A, 0xF6, 0x01, 0x85, 0xC8, 0x01, 0xCE, + 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x7D, 0xCE, 0x15, 0x00, 0xED, 0x1C, 0xCC, 0x15, 0xEC, 0xED, + 0x1E, 0xF6, 0x01, 0x90, 0xE7, 0x19, 0xF6, 0x01, 0x91, 0xE7, 0x00, 0x1C, 0x15, 0x80, 0xCE, 0x00, + 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, + 0xE7, 0x00, 0xF6, 0x01, 0x86, 0xE7, 0x19, 0xF6, 0x01, 0x85, 0xE7, 0x15, 0x5F, 0xCE, 0x16, 0x00, + 0xE7, 0x00, 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x23, 0x0B, 0xBD, 0x45, 0x46, 0xC6, 0x03, 0xF7, 0x01, + 0x9E, 0x7E, 0x47, 0x26, 0xCC, 0x01, 0x01, 0xCE, 0x15, 0x00, 0xED, 0x1C, 0xCC, 0x11, 0xA0, 0xED, + 0x1E, 0x1C, 0x15, 0x80, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, + 0x7D, 0x01, 0x84, 0x26, 0x03, 0x7E, 0x49, 0x15, 0xCE, 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, 0x1E, + 0xD3, 0x2A, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, + 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x43, 0x26, 0xD6, 0x2F, 0xF0, 0x01, 0x81, + 0xD7, 0x30, 0xBD, 0x45, 0x5D, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, + 0xFF, 0xBD, 0x46, 0x11, 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x85, 0xC8, 0x01, + 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, 0x2A, 0xED, 0x1E, + 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x84, 0xD7, 0x36, 0xBD, 0x43, 0x26, + 0xD6, 0x2E, 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x45, 0x5D, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, + 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xBD, 0x46, 0x11, 0xCE, 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, + 0x1E, 0xD3, 0x28, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xF6, 0x01, + 0x82, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x43, 0x26, 0xD6, 0x2D, 0xF0, 0x01, 0x82, + 0xD7, 0x30, 0xBD, 0x45, 0x5D, 0xBD, 0x44, 0x11, 0xF6, 0x01, 0x82, 0xD7, 0x35, 0xF6, 0x01, 0x84, + 0xD7, 0x36, 0xBD, 0x43, 0x26, 0xD6, 0x2C, 0x20, 0x41, 0xF6, 0x01, 0x85, 0xC8, 0x01, 0xCE, 0x15, + 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, 0x2A, 0xED, 0x1E, 0x1C, 0x15, + 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x35, 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x43, 0x26, 0xD6, 0x2F, + 0xF0, 0x01, 0x81, 0xD7, 0x30, 0xBD, 0x45, 0x5D, 0xBD, 0x44, 0x11, 0xF6, 0x01, 0x82, 0xD7, 0x35, + 0xF6, 0x01, 0x83, 0xD7, 0x36, 0xBD, 0x43, 0x26, 0xD6, 0x2D, 0xF0, 0x01, 0x82, 0xD7, 0x30, 0xBD, + 0x45, 0x5D, 0x7D, 0x00, 0x25, 0x27, 0x15, 0xF6, 0x01, 0x8C, 0x5A, 0x26, 0x0F, 0xCE, 0x00, 0x00, + 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xBD, 0x44, 0x4A, 0xF6, 0x01, 0x8D, 0xCE, + 0x15, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x9E, 0xC1, 0x03, 0x24, 0x15, 0xD6, 0x27, 0x4F, 0xC3, 0x07, + 0x10, 0xFD, 0x00, 0x52, 0xC6, 0xFF, 0xFE, 0x00, 0x52, 0xE7, 0x00, 0x7C, 0x01, 0x9E, 0x20, 0x75, + 0xC6, 0xFF, 0xFE, 0x00, 0x52, 0xE7, 0x00, 0xF6, 0x01, 0x9D, 0xC1, 0x01, 0x26, 0x67, 0xCE, 0x14, + 0x00, 0x1C, 0x00, 0x80, 0x7C, 0x00, 0x26, 0xBD, 0x46, 0x7E, 0xBD, 0x46, 0x45, 0x7D, 0x01, 0x8C, + 0x26, 0x1A, 0x5F, 0xD7, 0x3F, 0xCE, 0x16, 0x00, 0x1E, 0x02, 0x01, 0x05, 0x7C, 0x00, 0x21, 0x20, + 0x16, 0x7C, 0x00, 0x3F, 0xD6, 0x3F, 0xC1, 0x0A, 0x25, 0xEE, 0x20, 0x0B, 0xD6, 0x21, 0x27, 0x07, + 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xD6, 0x21, 0x26, 0x06, 0xD6, 0x26, 0xC1, 0xC8, 0x23, + 0x17, 0xCC, 0x00, 0x35, 0xBD, 0x45, 0x17, 0xBD, 0x45, 0xF2, 0xBD, 0x45, 0xF2, 0xBD, 0x45, 0xF2, + 0xD6, 0x26, 0x4F, 0xBD, 0x45, 0x17, 0xD6, 0x26, 0xC1, 0xC8, 0x22, 0x03, 0x7E, 0x47, 0x26, 0x5F, + 0xD7, 0x26, 0x7E, 0x47, 0x26, 0xBD, 0x46, 0x45, 0xCC, 0x00, 0x35, 0xBD, 0x45, 0x17, 0x7E, 0x47, + 0x26, 0xC6, 0xFF, 0xCE, 0x16, 0x00, 0xE7, 0x04, 0x3B, 0xCE, 0x11, 0x00, 0x1F, 0x00, 0x08, 0x03, + 0x1C, 0x00, 0x04, 0x1F, 0x00, 0x20, 0x03, 0x1C, 0x00, 0x20, 0x3B, 0xCE, 0x15, 0x00, 0x1C, 0x00, + 0x02, 0xCE, 0x00, 0x00, 0x6C, 0xFF, 0x3B, 0xCE, 0x14, 0x00, 0x1C, 0x00, 0x14, 0x3B, 0x5F, 0xCE, + 0x10, 0x00, 0xE7, 0x04, 0x3B, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0x3B, 0x3B, 0x4F, 0xCE, 0x00, + 0x50, 0x20, 0x03, 0xA7, 0x00, 0x08, 0x8C, 0x00, 0x5C, 0x26, 0xF8, 0x8E, 0x00, 0xFE, 0xBD, 0x42, + 0x7B, 0x20, 0xFE, 0x3C, 0xCC, 0x44, 0x57, 0xCE, 0x00, 0x00, 0xED, 0x10, 0xCC, 0x44, 0x5F, 0xED, + 0x12, 0xCC, 0x44, 0x71, 0xED, 0x14, 0xCC, 0x44, 0x7D, 0xED, 0x16, 0xCC, 0x44, 0x84, 0xED, 0x18, + 0xCC, 0x44, 0x8B, 0xED, 0x1C, 0xC6, 0x03, 0xCE, 0x10, 0x00, 0xE7, 0x00, 0x5F, 0xE7, 0x01, 0xE7, + 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xCE, 0x11, 0x00, 0xE7, 0x00, 0xE7, 0x01, 0xCC, 0x00, 0xFF, 0xED, + 0x02, 0xED, 0x04, 0x5F, 0xED, 0x06, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x04, 0xED, 0x01, 0x5F, + 0xCE, 0x13, 0x00, 0xE7, 0x01, 0xC6, 0x09, 0xE7, 0x03, 0xC6, 0x80, 0xCE, 0x14, 0x00, 0xE7, 0x00, + 0xC6, 0x50, 0xE7, 0x01, 0x5F, 0xED, 0x02, 0xE7, 0x04, 0xC6, 0x54, 0xCE, 0x15, 0x00, 0xE7, 0x00, + 0x5F, 0xE7, 0x15, 0x86, 0x02, 0xED, 0x1C, 0x4C, 0xED, 0x1E, 0xE7, 0x20, 0xCE, 0x16, 0x00, 0xE7, + 0x00, 0xE7, 0x01, 0xE7, 0x02, 0xE7, 0x03, 0xE7, 0x04, 0xE7, 0x05, 0x5C, 0xE7, 0x06, 0x5F, 0xE7, + 0x07, 0x07, 0x84, 0x7F, 0x06, 0x38, 0x39, 0x3C, 0x20, 0x77, 0xFE, 0x00, 0x5A, 0xEC, 0x00, 0xFE, + 0x00, 0x58, 0xED, 0x00, 0xFE, 0x00, 0x5A, 0xEC, 0x02, 0xFE, 0x00, 0x58, 0xED, 0x02, 0xFE, 0x00, + 0x5A, 0xEC, 0x04, 0xFE, 0x00, 0x58, 0xED, 0x04, 0xFE, 0x00, 0x5A, 0xEC, 0x06, 0xFE, 0x00, 0x58, + 0xED, 0x06, 0xFE, 0x00, 0x5A, 0xEC, 0x08, 0xFE, 0x00, 0x58, 0xED, 0x08, 0xFE, 0x00, 0x5A, 0xEC, + 0x0A, 0xFE, 0x00, 0x58, 0xED, 0x0A, 0xFE, 0x00, 0x5A, 0xEC, 0x0C, 0xFE, 0x00, 0x58, 0xED, 0x0C, + 0xFE, 0x00, 0x5A, 0xEC, 0x0E, 0xFE, 0x00, 0x58, 0xED, 0x0E, 0xFE, 0x00, 0x5A, 0xEC, 0x10, 0xFE, + 0x00, 0x58, 0xED, 0x10, 0xFE, 0x00, 0x5A, 0xEC, 0x12, 0xFE, 0x00, 0x58, 0xED, 0x12, 0xD6, 0x32, + 0x4F, 0x05, 0xF3, 0x00, 0x58, 0xFD, 0x00, 0x58, 0xFC, 0x00, 0x5A, 0xC3, 0x00, 0x14, 0xFD, 0x00, + 0x5A, 0xD6, 0x31, 0x7A, 0x00, 0x31, 0x5D, 0x26, 0x81, 0x38, 0x39, 0x3C, 0xF6, 0x01, 0x8D, 0xCE, + 0x15, 0x00, 0xE7, 0x00, 0xF6, 0x01, 0x86, 0xE7, 0x19, 0xF6, 0x01, 0x87, 0xE7, 0x1A, 0xF6, 0x01, + 0x88, 0xE7, 0x1B, 0xF6, 0x01, 0x89, 0xE7, 0x16, 0xF6, 0x01, 0x8A, 0xE7, 0x17, 0xF6, 0x01, 0x8B, + 0xE7, 0x18, 0xF6, 0x01, 0x81, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x2B, 0xF6, 0x01, 0x81, 0xB6, 0x01, + 0x84, 0x3D, 0xD7, 0x2A, 0xF6, 0x01, 0x82, 0xB6, 0x01, 0x83, 0x3D, 0xD7, 0x29, 0xF6, 0x01, 0x82, + 0xB6, 0x01, 0x84, 0x3D, 0xD7, 0x28, 0xF6, 0x01, 0x81, 0x86, 0x14, 0x3D, 0xDD, 0x26, 0xF6, 0x01, + 0x82, 0x86, 0x14, 0x3D, 0xDD, 0x24, 0xF6, 0x01, 0x81, 0xFB, 0x01, 0x82, 0xD7, 0x23, 0x7D, 0x01, + 0x84, 0x27, 0x03, 0x78, 0x00, 0x23, 0x38, 0x39, 0x01, 0x01, 0xCF, 0x7D, 0x01, 0x9F, 0x26, 0xFB, + 0x39, 0xB6, 0x01, 0x8F, 0x5F, 0xFB, 0x01, 0x8E, 0x89, 0x00, 0xDD, 0x20, 0x5F, 0xD7, 0x22, 0xDC, + 0x20, 0xDD, 0x35, 0x5F, 0xD7, 0x2D, 0x13, 0x36, 0x01, 0x03, 0x7C, 0x00, 0x22, 0x74, 0x00, 0x35, + 0x76, 0x00, 0x36, 0x7C, 0x00, 0x2D, 0xD6, 0x2D, 0xC1, 0x0A, 0x25, 0xEA, 0x39, 0x3C, 0x37, 0x36, + 0x30, 0x18, 0xCE, 0x10, 0x00, 0x18, 0xE6, 0x03, 0xC4, 0x0C, 0xC1, 0x0C, 0x26, 0xF7, 0xE6, 0x01, + 0x18, 0xE7, 0x05, 0x38, 0x38, 0x39, 0x3C, 0xC6, 0x07, 0xCE, 0x12, 0x00, 0xE7, 0x00, 0xC6, 0x16, + 0xE7, 0x00, 0xC6, 0x25, 0xE7, 0x00, 0xC6, 0x34, 0xE7, 0x00, 0x38, 0x39, 0x3C, 0x3C, 0x30, 0xCC, + 0x00, 0x32, 0xED, 0x00, 0x1A, 0xEE, 0x00, 0x83, 0x00, 0x01, 0xED, 0x00, 0x18, 0x8C, 0x00, 0x01, + 0x22, 0xF2, 0x38, 0x38, 0x39, 0x01, 0x01, 0x01, 0x01, 0x01, 0x39, 0x3C, 0x5F, 0xCE, 0x16, 0x00, + 0xE7, 0x00, 0xF6, 0x01, 0x8C, 0xC1, 0x01, 0x26, 0x05, 0xBD, 0x41, 0xAB, 0x20, 0x1F, 0x8D, 0xE5, + 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, 0xF7, 0x8D, 0xDC, 0xCE, 0x16, 0x00, 0x1F, 0x02, 0x01, 0xF7, + 0xC6, 0x01, 0xE7, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x38, 0x39, 0x3C, + 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xD7, 0x3B, 0x01, 0x1F, 0x02, 0x01, 0x05, 0x7C, 0x00, 0x3B, + 0xD6, 0x3B, 0xC1, 0x03, 0x25, 0xF2, 0x38, 0x39, 0x3C, 0x0F, 0xBD, 0x40, 0x26, 0x0E, 0x5F, 0xF7, + 0x01, 0x9F, 0xCE, 0x16, 0x00, 0xE7, 0x05, 0x5C, 0xE7, 0x03, 0xC6, 0xFF, 0xE7, 0x04, 0xCE, 0x15, + 0x00, 0xE6, 0x00, 0xC4, 0x80, 0xCA, 0x55, 0xF7, 0x01, 0x9D, 0xCC, 0x00, 0x21, 0xBD, 0x41, 0xE0, + 0xBD, 0x42, 0x0F, 0xBD, 0x41, 0xAB, 0xBD, 0x41, 0x3E, 0xBD, 0x41, 0xB4, 0x5F, 0xCE, 0x16, 0x00, + 0xE7, 0x00, 0xBD, 0x41, 0xF9, 0x5F, 0xF7, 0x01, 0x9E, 0xCE, 0x00, 0x00, 0xE7, 0xFF, 0xF6, 0x01, + 0x85, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x09, 0x50, 0xFD, 0x00, 0x58, 0xCC, 0x01, 0xA0, 0xFD, + 0x00, 0x5A, 0xBD, 0x41, 0xAB, 0xBD, 0x42, 0x2E, 0x5F, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xCC, 0x01, + 0x01, 0xCE, 0x15, 0x00, 0xED, 0x1C, 0xCC, 0x11, 0xA0, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xCE, 0x00, + 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0x7D, 0x01, 0x84, 0x26, 0x03, 0x7E, + 0x43, 0xC2, 0xCE, 0x15, 0x00, 0x1C, 0x15, 0x04, 0xEC, 0x1E, 0xD3, 0x26, 0xED, 0x1E, 0x1C, 0x15, + 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0xD7, 0x32, 0xBD, 0x40, 0xBA, 0xCE, 0x00, + 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x85, 0xC8, 0x01, 0xCE, + 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, 0xD3, 0x26, 0xED, 0x1E, 0x1C, + 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x84, 0xD7, 0x32, 0xBD, 0x40, 0xBA, 0xCE, + 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, 0xCE, 0x15, 0x00, 0x1C, 0x15, + 0x04, 0xEC, 0x1E, 0xD3, 0x24, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x82, 0xD7, 0x31, 0xF6, + 0x01, 0x83, 0xD7, 0x32, 0xBD, 0x40, 0xBA, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, + 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x82, 0xD7, 0x31, 0xF6, 0x01, 0x84, 0xD7, 0x32, 0xBD, 0x40, 0xBA, + 0xC6, 0x01, 0xCE, 0x16, 0x00, 0xE7, 0x00, 0xD6, 0x22, 0x26, 0x03, 0x7E, 0x44, 0x4B, 0xF6, 0x01, + 0x8C, 0x5A, 0x26, 0xF7, 0xF6, 0x01, 0x91, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xC6, 0x03, 0xE7, 0x15, + 0xCC, 0x15, 0xEC, 0xED, 0x1E, 0xCC, 0x01, 0x7D, 0xED, 0x1C, 0x1C, 0x15, 0x80, 0x20, 0x3B, 0xF6, + 0x01, 0x85, 0xC8, 0x01, 0xCE, 0x15, 0x00, 0xE7, 0x15, 0xCC, 0x01, 0x41, 0xED, 0x1C, 0xEC, 0x1E, + 0xD3, 0x26, 0xED, 0x1E, 0x1C, 0x15, 0x80, 0xF6, 0x01, 0x81, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0xD7, + 0x32, 0xBD, 0x40, 0xBA, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, 0x01, 0x25, 0xFA, 0x5F, 0xE7, 0xFF, + 0xF6, 0x01, 0x82, 0xD7, 0x31, 0xF6, 0x01, 0x83, 0x20, 0x91, 0xCE, 0x00, 0x00, 0xE6, 0xFF, 0xC1, + 0x01, 0x25, 0xF7, 0x5F, 0xE7, 0xFF, 0xF6, 0x01, 0x8D, 0xCE, 0x15, 0x00, 0xE7, 0x00, 0xCC, 0x05, + 0xEC, 0xFD, 0x00, 0x5A, 0xDC, 0x20, 0xDD, 0x35, 0x5F, 0xD7, 0x3B, 0xD7, 0x2D, 0x13, 0x36, 0x01, + 0x18, 0xCE, 0x4F, 0xD0, 0xD6, 0x3B, 0x7C, 0x00, 0x3B, 0x58, 0x3A, 0x3C, 0xD6, 0x2D, 0x4F, 0x05, + 0xF3, 0x00, 0x5A, 0x8F, 0xEC, 0x00, 0x38, 0xED, 0x00, 0x74, 0x00, 0x35, 0x76, 0x00, 0x36, 0x7C, + 0x00, 0x2D, 0xD6, 0x2D, 0xC1, 0x0A, 0x25, 0xD5, 0xBD, 0x42, 0x62, 0xCC, 0x00, 0x35, 0xBD, 0x41, + 0xE0, 0x7E, 0x42, 0xC1, 0xC6, 0xFF, 0xCE, 0x16, 0x00, 0xE7, 0x04, 0x3B, 0xCE, 0x11, 0x00, 0x1F, + 0x00, 0x08, 0x03, 0x1C, 0x00, 0x04, 0x1F, 0x00, 0x20, 0x03, 0x1C, 0x00, 0x20, 0x3B, 0xCE, 0x15, + 0x00, 0x1C, 0x00, 0x02, 0xCE, 0x00, 0x00, 0x6C, 0xFF, 0x3B, 0xCE, 0x14, 0x00, 0x1C, 0x00, 0x14, + 0x3B, 0x5F, 0xCE, 0x10, 0x00, 0xE7, 0x04, 0x3B, 0x5F, 0xCE, 0x13, 0x00, 0xE7, 0x01, 0x3B, 0x3B, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x05, 0x0D, 0x09, 0x04, 0xA1, 0x01, 0x85, 0x01, 0x09, 0x22, 0xA1, 0x02, 0x09, 0x42, 0x15, 0x00, + 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, + 0x95, 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, + 0x7F, 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, + 0x09, 0x31, 0x45, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0xA1, 0x02, 0x05, 0x0D, 0x09, 0x42, 0x15, 0x00, 0x25, + 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x02, 0x09, 0x32, 0x81, 0x02, 0x09, 0x47, 0x81, 0x02, 0x95, + 0x05, 0x81, 0x03, 0x75, 0x08, 0x09, 0x51, 0x95, 0x01, 0x81, 0x02, 0x05, 0x01, 0x26, 0xFF, 0x7F, + 0x75, 0x10, 0x55, 0x00, 0x65, 0x00, 0x09, 0x30, 0x35, 0x00, 0x46, 0x00, 0x00, 0x81, 0x02, 0x09, + 0x31, 0x46, 0x00, 0x00, 0x81, 0x02, 0xC0, 0x05, 0x0D, 0x09, 0x54, 0x95, 0x01, 0x75, 0x08, 0x15, + 0x00, 0x25, 0x05, 0x81, 0x02, 0x85, 0x02, 0x09, 0x55, 0xB1, 0x02, 0xC0, 0x9C, 0x02, 0x00, 0x00, + 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x51, 0xC2, 0x01, 0x1C, 0x00, 0x01, 0x01, 0x02, + 0x03, 0x01, 0x00, 0x00, 0x09, 0x02, 0x22, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 0x04, 0x00, + 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x09, 0x21, 0x00, 0x01, 0x00, 0x01, 0x22, 0x9C, 0x02, 0x07, + 0x05, 0x81, 0x03, 0x40, 0x00, 0x04, 0x00, 0x00, 0x04, 0x03, 0x09, 0x04, 0x10, 0x03, 0x4E, 0x00, + 0x55, 0x00, 0x56, 0x00, 0x4F, 0x00, 0x54, 0x00, 0x4F, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3107,8 +3032,8 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x57, 0x00, - 0x50, 0x00, 0x4D, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x57, 0x00, 0x50, 0x00, 0x4D, 0x00, + 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3120,21 +3045,20 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x03, 0x42, 0x00, 0x30, 0x00, 0x32, 0x00, - 0x30, 0x00, 0x31, 0x00, 0x30, 0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00, 0x35, 0x00, 0x31, 0x00, - 0x34, 0x00, 0x00, 0x00, 0x64, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xC4, 0x03, 0x00, 0x00, - 0xB6, 0x04, 0x00, 0x00, 0x34, 0xC4, 0x00, 0x00, 0xC4, 0x03, 0x00, 0x20, 0x74, 0x1B, 0x00, 0x00, - 0x04, 0x01, 0x00, 0x00, 0x11, 0x45, 0x80, 0x51, 0x01, 0x16, 0x23, 0x1B, 0xB7, 0x32, 0x80, 0x19, - 0x10, 0x4B, 0x10, 0x27, 0x08, 0x10, 0x11, 0x47, 0x54, 0x38, 0x31, 0x58, 0x4E, 0x49, 0x5F, 0x31, - 0x52, 0x30, 0x35, 0x5F, 0x31, 0x38, 0x47, 0x13, 0x02, 0x04, 0x26, 0x02, 0x58, 0x0A, 0x4D, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x1A, 0x03, 0x42, 0x00, 0x30, 0x00, 0x32, 0x00, 0x30, 0x00, 0x31, 0x00, + 0x30, 0x00, 0x30, 0x00, 0x38, 0x00, 0x30, 0x00, 0x35, 0x00, 0x31, 0x00, 0x34, 0x00, 0x00, 0x00, + 0xB0, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xB4, 0x03, 0x00, 0x00, 0xB6, 0x04, 0x00, 0x00, + 0x80, 0xBF, 0x00, 0x00, 0xB4, 0x03, 0x00, 0x20, 0x24, 0x1B, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, + 0x11, 0x45, 0x80, 0x51, 0x01, 0x16, 0x23, 0x1B, 0xB7, 0x32, 0x80, 0x19, 0x10, 0x4B, 0x10, 0x27, + 0x08, 0x21, 0x02, 0x3D, 0xFF, 0x10, 0x11, 0x47, 0x54, 0x38, 0x31, 0x58, 0x4E, 0x49, 0x5F, 0x31, + 0x52, 0x30, 0x35, 0x5F, 0x31, 0x38, 0x51, 0x13, 0x02, 0x04, 0x1D, 0x02, 0x58, 0x0A, 0x4D, 0x59, 0x25, 0x26, 0x02, 0x08, 0x19, 0x22, 0x1A, 0x36, 0x88, 0x88, 0x88, 0x03, 0x13, 0x28, 0x0C, 0x01, - 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x01, 0xF9, 0x10, 0x11, 0x04, 0x24, - 0x3C, 0x64, 0x50, 0x19, 0x2A, 0x01, 0xA8, 0x02, 0x27, 0x08, 0x12, 0x3C, 0xBA, 0x28, 0x08, 0x01, - 0x3E, 0x23, 0xE8, 0x03, 0x02, 0x82, 0x64, 0x32, 0x80, 0xB2, 0x08, 0x69, 0x0C, 0x32, 0x81, 0x02, - 0x14, 0x40, 0x22, 0x05, 0x23, 0xB1, 0x36, 0x73, 0x65, 0x35, 0x22, 0x01, 0x1A, 0x91, 0x10, 0x91, - 0x19, 0xD7, 0xB9, 0x10, 0x19, 0x51, 0xAA, 0x95, 0x10, 0x31, 0xAA, 0xAD, 0x10, 0x22, 0x0A, 0xAA, - 0xA9, 0x10, 0x22, 0x0B, 0xB3, 0x71, 0x37, 0x22, 0x06, 0x1B, 0x29, 0x4C, 0x90, 0x22, 0x4B, 0x1A, - 0x15, 0x08, 0x11, 0x22, 0x09, 0x9A, 0xE9, 0x30, 0x1A, 0x20, 0x10, 0x9B, 0x75, 0x4D, 0x10, 0x19, - 0x50, 0xAA, 0x59, 0x10, 0x29, 0x50, 0xA9, 0x10, 0x19, 0xB0, 0x9A, 0x3D, 0x10, 0x23, 0x07, 0x4E, - 0x1A, 0x79, 0x10, 0x1A, 0x02, 0x38, 0x01, 0x60, 0x55, 0x82, 0x82, 0x82, 0x83, 0x04, 0x14, 0x0D, - 0x08, 0x02, 0x00, 0x00 + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x01, 0xF9, 0x10, 0x11, 0x04, 0x7B, + 0x3C, 0x64, 0x50, 0x02, 0x27, 0x08, 0x12, 0x3C, 0xBA, 0x28, 0x08, 0x01, 0x42, 0x23, 0xE8, 0x03, + 0x02, 0x82, 0x64, 0x32, 0x80, 0xB2, 0x08, 0x69, 0x0C, 0x32, 0x81, 0x02, 0x14, 0x40, 0x22, 0x05, + 0x23, 0xDD, 0x33, 0x73, 0x91, 0x32, 0x22, 0x01, 0x1A, 0xBD, 0x10, 0x91, 0x19, 0xD7, 0xB9, 0x10, + 0x19, 0x51, 0xAA, 0xC1, 0x10, 0x31, 0xAA, 0xD9, 0x10, 0x22, 0x0A, 0xAA, 0xD5, 0x10, 0x22, 0x0B, + 0xB3, 0x9D, 0x34, 0x1A, 0x06, 0x6C, 0x22, 0x49, 0x23, 0xE9, 0x48, 0x1A, 0x7D, 0x08, 0x11, 0x22, + 0x09, 0x9A, 0x15, 0x20, 0x1A, 0x20, 0x10, 0x9B, 0xDD, 0x4A, 0x10, 0x19, 0x50, 0xAA, 0xC1, 0x10, + 0x19, 0x50, 0xAA, 0xD9, 0x10, 0x19, 0xB0, 0x9A, 0xA5, 0x10, 0x23, 0x6F, 0x4B, 0x1A, 0xE1, 0x10, + 0x1A, 0x02, 0x38, 0x01, 0x60, 0x55, 0x82, 0x82, 0x82, 0x83, 0x04, 0x14, 0x0D, 0x08, 0x02, 0x00 From 5b14f754cb5a298e4689265245aac06ea087abea Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:45:47 +0800 Subject: [PATCH 052/150] bu92747guw_cir add suspend wake up --- drivers/cir/bu92747guw_cir.c | 98 +++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 6 deletions(-) mode change 100755 => 100644 drivers/cir/bu92747guw_cir.c diff --git a/drivers/cir/bu92747guw_cir.c b/drivers/cir/bu92747guw_cir.c old mode 100755 new mode 100644 index 6963654aedea..66048d443c2b --- a/drivers/cir/bu92747guw_cir.c +++ b/drivers/cir/bu92747guw_cir.c @@ -34,7 +34,7 @@ #include "bu92747guw_cir.h" -#if 0 +#if 1 #define BU92747_DBG(x...) printk(x) #else #define BU92747_DBG(x...) @@ -58,6 +58,20 @@ static struct miscdevice bu92747guw_device; int repeat_flag=-1; int start_flag = 0; +//mutex lock between remote and irda +static DEFINE_MUTEX(bu92747_mutex); +void bu92747_lock(void) +{ + mutex_lock(&bu92747_mutex); +} +void bu92747_unlock(void) +{ + mutex_unlock(&bu92747_mutex); +} + + + + static int bu92747_cir_i2c_read_regs(struct i2c_client *client, u8 reg, u8 *buf, int len) { @@ -366,8 +380,7 @@ static int bu92747_start(struct i2c_client *client) start_flag = 1; - //enable_irq(bu92747->irq); - //enable clk + bu92747->state = 0; bu92747_cir_i2c_read_regs(client, REG_SETTING0, reg_value, 1); reg_value[0] = reg_value[0]|0x01; bu92747_cir_i2c_set_regs(client, REG_SETTING0, reg_value, 1); @@ -745,6 +758,8 @@ static int bu92747_open(struct inode *inode, struct file *file) printk("bu92747_open\n"); bu92747->state = 0; + start_flag = 0; + repeat_flag = -1; // if (BU92747_OPEN == bu92747->state) // return -EBUSY; // bu92747->state = BU92747_OPEN; @@ -762,7 +777,7 @@ static int bu92747_open(struct inode *inode, struct file *file) //register init bu92747_cir_init_device(client, bu92747); - start_flag = -1; + start_flag = 0; BU92747_DBG("line %d: exit %s\n", __LINE__, __FUNCTION__); return 0; @@ -775,6 +790,8 @@ static int bu92747_release(struct inode *inode, struct file *file) struct bu92747guw_platform_data *pdata = bu92747->platdata; BU92747_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__); + smc0_write(REG_TRCR_ADDR, smc0_read(REG_TRCR_ADDR)|0x0040); + start_flag = -1; //power down if (pdata && pdata->cir_pwr_ctl) { @@ -788,6 +805,70 @@ static int bu92747_release(struct inode *inode, struct file *file) return 0; } +#if CONFIG_PM +static int bu92747_suspend(struct i2c_client *i, pm_message_t mesg) +{ + struct i2c_client *client = container_of(bu92747guw_device.parent, struct i2c_client, dev); + struct bu92747_data_info *bu92747 = (struct bu92747_data_info *)i2c_get_clientdata(client); + struct bu92747guw_platform_data *pdata = bu92747->platdata; + + BU92747_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__); + + if (start_flag == 0){ + BU92747_DBG("realy suspend!\n"); + disable_irq(bu92747->irq); + smc0_write(REG_TRCR_ADDR, smc0_read(REG_TRCR_ADDR)|0x0040); + start_flag = 0; + repeat_flag = -1; + + if (pdata && pdata->cir_pwr_ctl) { + pdata->cir_pwr_ctl(0); + } + } + BU92747_DBG("line %d: exit %s\n", __LINE__, __FUNCTION__); + + return 0; +} + +static int bu92747_resume(struct i2c_client *i) +{ + struct i2c_client *client = container_of(bu92747guw_device.parent, struct i2c_client, dev); + struct bu92747_data_info *bu92747 = (struct bu92747_data_info *)i2c_get_clientdata(client); + struct bu92747guw_platform_data *pdata = bu92747->platdata; + + BU92747_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__); + + if (start_flag == 0){ + BU92747_DBG("realy resume!\n"); + enable_irq(bu92747->irq); + bu92747->state = 0; + + //power on + if (pdata && pdata->cir_pwr_ctl) { + pdata->cir_pwr_ctl(1); + } + + //switch to remote control, mcr, ec_en=1,rc_mode=1 + smc0_write(REG_MCR_ADDR, smc0_read(REG_MCR_ADDR)|(3<<10)); + //set irda pwdownpin = 0 + smc0_write(REG_TRCR_ADDR, smc0_read(REG_TRCR_ADDR)&0xffbf); + BU92747_DBG("irda power down pin = %d\n", gpio_get_value(RK29_PIN5_PA7)); + + //register init + bu92747_cir_init_device(client, bu92747); + } + + printk("line %d: exit %s\n", __LINE__, __FUNCTION__); + + + return 0; + +} +#else +#define bu92747_suspend NULL +#define bu92747_resume NULL +#endif + static struct file_operations bu92747_fops = { .owner = THIS_MODULE, .open = bu92747_open, @@ -827,7 +908,8 @@ static int __devinit bu92747_cir_probe(struct i2c_client *client, const struct i bu92747->platdata = pdata; bu92747->client = client; i2c_set_clientdata(client, bu92747); - bu92747->state = BU92747_CLOSE; + bu92747->state = 0; + start_flag = -1; //register device bu92747guw_device.parent = &client->dev; @@ -895,7 +977,7 @@ static int __devexit bu92747_cir_remove(struct i2c_client *client) struct bu92747guw_platform_data *pdata = bu92747->platdata; printk(" cir_remove \n"); - start_flag = 0; + start_flag = -1; free_irq(bu92747->irq, bu92747); gpio_free(pdata->intr_pin); misc_deregister(&bu92747guw_device); @@ -919,6 +1001,10 @@ static struct i2c_driver bu92747_cir_driver = { .probe = bu92747_cir_probe, .remove = __devexit_p(bu92747_cir_remove), .id_table = bu92747_cir_id, +#ifdef CONFIG_PM + .suspend = bu92747_suspend, + .resume = bu92747_resume, +#endif }; static int __init bu92747_cir_init(void) From 2c3861c3ae895188d12b5507a5bac1c5b4502684 Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:46:22 +0800 Subject: [PATCH 053/150] newton:ov3640 close flash --- drivers/media/video/ov3640.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 drivers/media/video/ov3640.c diff --git a/drivers/media/video/ov3640.c b/drivers/media/video/ov3640.c old mode 100755 new mode 100644 index f8df6cd518d3..fa99f204508e --- a/drivers/media/video/ov3640.c +++ b/drivers/media/video/ov3640.c @@ -63,7 +63,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define CONFIG_SENSOR_Scene 1 #define CONFIG_SENSOR_DigitalZoom 0 #define CONFIG_SENSOR_Exposure 0 -#define CONFIG_SENSOR_Flash 1 +#define CONFIG_SENSOR_Flash 0 #define CONFIG_SENSOR_Mirror 0 #define CONFIG_SENSOR_Flip 0 #ifdef CONFIG_OV3640_AUTOFOCUS From ca4befd45c419aa45e6a978bb9e5db69df783805 Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:47:42 +0800 Subject: [PATCH 054/150] newton:add 1.2G support --- arch/arm/mach-rk29/Kconfig | 6 ++++ arch/arm/mach-rk29/board-rk29-newton.c | 44 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) mode change 100755 => 100644 arch/arm/mach-rk29/Kconfig diff --git a/arch/arm/mach-rk29/Kconfig b/arch/arm/mach-rk29/Kconfig old mode 100755 new mode 100644 index 24c3ebbbc26e..414c875a8a24 --- a/arch/arm/mach-rk29/Kconfig +++ b/arch/arm/mach-rk29/Kconfig @@ -67,6 +67,12 @@ config MACH_RK29_P91 endchoice +config RK29_NEWTON_CLOCK + depends on MACH_RK29_newton + bool "enable newton 1.2G cpu clock support" + help + support for newton 1.2G cpu clock. + choice DDR_TYPE prompt "DDR Memory Type" default DDR_TYPE_DDR3_DEFAULT diff --git a/arch/arm/mach-rk29/board-rk29-newton.c b/arch/arm/mach-rk29/board-rk29-newton.c index 84feada0046a..9cc5a5c99073 100644 --- a/arch/arm/mach-rk29/board-rk29-newton.c +++ b/arch/arm/mach-rk29/board-rk29-newton.c @@ -60,6 +60,12 @@ #ifdef CONFIG_BU92747GUW_CIR #include "../../../drivers/cir/bu92747guw_cir.h" #endif +#ifdef CONFIG_RK29_NEWTON_CLOCK +// 1: newton for 1.2G +#define RK29_NEWTON_CPU_CLK 1 +// 1: newton for hardware 1.5V +#define RK29_NEWTON_NEWBOARD 1 +#endif #ifdef CONFIG_VIDEO_RK29 /*---------------- Camera Sensor Macro Define Begin ------------------------*/ @@ -1662,8 +1668,13 @@ static struct platform_device rk29sdk_rfkill = { #ifdef CONFIG_VIVANTE +#ifdef RK29_NEWTON_CPU_CLK +#define GPU_HIGH_CLOCK 504 // 504 456 +#define GPU_LOW_CLOCK 300 +#else #define GPU_HIGH_CLOCK 552 #define GPU_LOW_CLOCK (periph_pll_default / 1000000) /* same as general pll clock rate below */ +#endif static struct resource resources_gpu[] = { [0] = { .name = "gpu_irq", @@ -2203,9 +2214,38 @@ static void __init machine_rk29_init_irq(void) } static struct cpufreq_frequency_table freq_table[] = { +#ifdef RK29_NEWTON_CPU_CLK +/* + * hardware change the max vdd from 1.4 to 1.5, so new table is: + * 1.075 -> 1.133 + * 1.125 -> 1.20 + * 1.15 -> 1.225 + * 1.225 -> 1.313 + * 1.30 -> 1.404 + * 1.325 -> 1.436 + * 1.35 -> 1.46 + * 1.40 -> 1.5 + * +*/ + { .index = 1075000, .frequency = 408000 }, + { .index = 1150000, .frequency = 816000 }, + { .index = 1225000, .frequency = 1008000 }, + +// { .index = 1300000, .frequency = 1200000 }, +// { .index = 1325000, .frequency = 1200000 }, + { .index = 1350000, .frequency = 1200000 }, +// { .index = 1400000, .frequency = 1200000 }, +#else +#ifdef RK29_NEWTON_NEWBOARD + { .index = 1075000, .frequency = 408000 }, + { .index = 1150000, .frequency = 816000 }, + { .index = 1225000, .frequency = 1008000 }, +#else { .index = 1200000, .frequency = 408000 }, { .index = 1200000, .frequency = 816000 }, { .index = 1300000, .frequency = 1008000 }, +#endif // RK29_NEWTON_NEWBOARD +#endif // RK29_NEWTON_CPU_CLK { .frequency = CPUFREQ_TABLE_END }, }; @@ -2270,7 +2310,11 @@ static void __init machine_rk29_mapio(void) rk29_map_common_io(); rk29_setup_early_printk(); rk29_sram_init(); +#ifdef RK29_NEWTON_CPU_CLK + rk29_clock_init(periph_pll_144mhz); +#else rk29_clock_init(periph_pll_default); +#endif rk29_iomux_init(); ddr_init(DDR_TYPE,DDR_FREQ); // DDR3_1333H, 400 } From 9156c0f0a1f7f39d141c394ad85984a0a4b53bdb Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 10:51:40 +0800 Subject: [PATCH 055/150] add newton rfkill,keeping on B23 power,for BT uart2 larkage --- arch/arm/mach-rk29/Makefile | 2 +- arch/arm/mach-rk29/board-newton-rfkill.c | 296 +++++++++++++++++++++++ arch/arm/mach-rk29/board-rk29-newton.c | 9 +- 3 files changed, 305 insertions(+), 2 deletions(-) mode change 100755 => 100644 arch/arm/mach-rk29/Makefile create mode 100644 arch/arm/mach-rk29/board-newton-rfkill.c diff --git a/arch/arm/mach-rk29/Makefile b/arch/arm/mach-rk29/Makefile old mode 100755 new mode 100644 index c3521e0db7e5..bc91143c770d --- a/arch/arm/mach-rk29/Makefile +++ b/arch/arm/mach-rk29/Makefile @@ -22,5 +22,5 @@ obj-$(CONFIG_MACH_RK29_PHONESDK) += board-rk29-phonesdk.o board-rk29-phonesdk-ke obj-$(CONFIG_MACH_RK29FIH) += board-rk29-fih.o board-rk29-fih-key.o board-rk29sdk-rfkill.o board-rk29sdk-power.o obj-$(CONFIG_MACH_RK29_A22) += board-rk29-a22.o board-rk29-a22-key.o board-rk29-a22-rfkill.o obj-$(CONFIG_MACH_RK29_PHONEPADSDK) += board-rk29phonepadsdk.o board-rk29phonepadsdk-key.o board-rk29phonepadsdk-rfkill.o board-rk29phonepadsdk-power.o -obj-$(CONFIG_MACH_RK29_newton) += board-rk29-newton.o board-rk29-newton-key.o board-rk29sdk-rfkill.o board-rk29sdk-power.o +obj-$(CONFIG_MACH_RK29_newton) += board-rk29-newton.o board-rk29-newton-key.o board-newton-rfkill.o board-rk29sdk-power.o diff --git a/arch/arm/mach-rk29/board-newton-rfkill.c b/arch/arm/mach-rk29/board-newton-rfkill.c new file mode 100644 index 000000000000..cd125e93b278 --- /dev/null +++ b/arch/arm/mach-rk29/board-newton-rfkill.c @@ -0,0 +1,296 @@ +/* + * Copyright (C) 2010 ROCKCHIP, Inc. + * Author: roger_chen + * + * This program is the bluetooth device bcm4329's driver, + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if 0 +#define DBG(x...) printk(KERN_INFO x) +#else +#define DBG(x...) +#endif + +#define BT_WAKE_HOST_SUPPORT 0 + +struct bt_ctrl +{ + struct rfkill *bt_rfk; +#if BT_WAKE_HOST_SUPPORT + struct timer_list tl; + bool b_HostWake; + struct wake_lock bt_wakelock; +#endif +}; + +#define BT_GPIO_POWER RK29_PIN5_PD6 +#define IOMUX_BT_GPIO_POWER rk29_mux_api_set(GPIO5D6_SDMMC1PWREN_NAME, GPIO5H_GPIO5D6); +#define BT_GPIO_RESET RK29_PIN6_PC4 +#define BT_GPIO_WAKE_UP RK29_PIN6_PC5 +#define BT_GPIO_WAKE_UP_HOST //RK2818_PIN_PA7 +#define IOMUX_BT_GPIO_WAKE_UP_HOST() //rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME,0); + +#define BT_WAKE_LOCK_TIMEOUT 10 //s + +static const char bt_name[] = "bcm4329"; +extern int rk29sdk_bt_power_state; +extern int rk29sdk_wifi_power_state; + +struct bt_ctrl gBtCtrl; + +#if BT_WAKE_HOST_SUPPORT +void resetBtHostSleepTimer(void) +{ + mod_timer(&(gBtCtrl.tl),jiffies + BT_WAKE_LOCK_TIMEOUT*HZ);//óʱֵ +} + +void btWakeupHostLock(void) +{ + if(gBtCtrl.b_HostWake == false){ + DBG("*************************Lock\n"); + wake_lock(&(gBtCtrl.bt_wakelock)); + gBtCtrl.b_HostWake = true; + } +} + +void btWakeupHostUnlock(void) +{ + if(gBtCtrl.b_HostWake == true){ + DBG("*************************UnLock\n"); + wake_unlock(&(gBtCtrl.bt_wakelock)); //ϵͳ˯ + gBtCtrl.b_HostWake = false; + } +} + +static void timer_hostSleep(unsigned long arg) +{ + DBG("%s---b_HostWake=%d\n",__FUNCTION__,gBtCtrl.b_HostWake); + btWakeupHostUnlock(); +} + + +#ifdef CONFIG_PM +static int bcm4329_rfkill_suspend(struct platform_device *pdev, pm_message_t state) +{ + DBG("%s\n",__FUNCTION__); + return 0; +} + +static int bcm4329_rfkill_resume(struct platform_device *pdev) +{ + DBG("%s\n",__FUNCTION__); + btWakeupHostLock(); + resetBtHostSleepTimer(); + return 0; +} +#else +#define bcm4329_rfkill_suspend NULL +#define bcm4329_rfkill_resume NULL +#endif + +static irqreturn_t bcm4329_wake_host_irq(int irq, void *dev) +{ + btWakeupHostLock(); + resetBtHostSleepTimer(); + return IRQ_HANDLED; +} +#endif + +#ifdef CONFIG_BT_HCIBCM4325 +int bcm4325_sleep(int bSleep) +{ +// printk("*************bt enter sleep***************\n"); + if (bSleep) + gpio_set_value(BT_GPIO_WAKE_UP, GPIO_LOW); //low represent bt device may enter sleep + else + gpio_set_value(BT_GPIO_WAKE_UP, GPIO_HIGH); //high represent bt device must be awake + + //printk("sleep=%d\n",bSleep); +} +#endif + +static int bcm4329_set_block(void *data, bool blocked) +{ + DBG("%s---blocked :%d\n", __FUNCTION__, blocked); + + IOMUX_BT_GPIO_POWER; + + if (false == blocked) { + gpio_set_value(BT_GPIO_POWER, GPIO_HIGH); /* bt power on */ + gpio_set_value(BT_GPIO_RESET, GPIO_LOW); + mdelay(200); + gpio_set_value(BT_GPIO_RESET, GPIO_HIGH); /* bt reset deactive*/ + mdelay(200); + +#if BT_WAKE_HOST_SUPPORT + btWakeupHostLock(); +#endif + pr_info("bt turn on power\n"); + } + else { +#if BT_WAKE_HOST_SUPPORT + btWakeupHostUnlock(); +#endif +// cwz 0: close for bt uart2 larkage. +#if 0 + if (!rk29sdk_wifi_power_state) { + gpio_set_value(BT_GPIO_POWER, GPIO_LOW); /* bt power off */ + mdelay(20); + pr_info("bt shut off power\n"); + }else { + pr_info("bt shouldn't shut off power, wifi is using it!\n"); + } +#endif + gpio_set_value(BT_GPIO_RESET, GPIO_LOW); /* bt reset active*/ + mdelay(20); + } + + rk29sdk_bt_power_state = !blocked; + return 0; +} + + +static const struct rfkill_ops bcm4329_rfk_ops = { + .set_block = bcm4329_set_block, +}; + +static int __devinit bcm4329_rfkill_probe(struct platform_device *pdev) +{ + int rc = 0; + bool default_state = true; + + DBG("Enter::%s,line=%d\n",__FUNCTION__,__LINE__); + + /* default to bluetooth off */ + bcm4329_set_block(NULL, default_state); /* blocked -> bt off */ + + gBtCtrl.bt_rfk = rfkill_alloc(bt_name, + NULL, + RFKILL_TYPE_BLUETOOTH, + &bcm4329_rfk_ops, + NULL); + + if (!gBtCtrl.bt_rfk) + { + printk("fail to rfkill_allocate************\n"); + return -ENOMEM; + } + + rfkill_set_states(gBtCtrl.bt_rfk, default_state, false); + + rc = rfkill_register(gBtCtrl.bt_rfk); + if (rc) + { + printk("failed to rfkill_register,rc=0x%x\n",rc); + rfkill_destroy(gBtCtrl.bt_rfk); + } + + gpio_request(BT_GPIO_POWER, NULL); + gpio_request(BT_GPIO_RESET, NULL); + gpio_request(BT_GPIO_WAKE_UP, NULL); + +#if BT_WAKE_HOST_SUPPORT + init_timer(&(gBtCtrl.tl)); + gBtCtrl.tl.expires = jiffies + BT_WAKE_LOCK_TIMEOUT*HZ; + gBtCtrl.tl.function = timer_hostSleep; + add_timer(&(gBtCtrl.tl)); + gBtCtrl.b_HostWake = false; + + wake_lock_init(&(gBtCtrl.bt_wakelock), WAKE_LOCK_SUSPEND, "bt_wake"); + + rc = gpio_request(BT_GPIO_WAKE_UP_HOST, "bt_wake"); + if (rc) { + printk("%s:failed to request RAHO_BT_WAKE_UP_HOST\n",__FUNCTION__); + } + + IOMUX_BT_GPIO_WAKE_UP_HOST(); + gpio_pull_updown(BT_GPIO_WAKE_UP_HOST,GPIOPullUp); + rc = request_irq(gpio_to_irq(BT_GPIO_WAKE_UP_HOST),bcm4329_wake_host_irq,IRQF_TRIGGER_FALLING,NULL,NULL); + if(rc) + { + printk("%s:failed to request RAHO_BT_WAKE_UP_HOST irq\n",__FUNCTION__); + gpio_free(BT_GPIO_WAKE_UP_HOST); + } + enable_irq_wake(gpio_to_irq(BT_GPIO_WAKE_UP_HOST)); // so RAHO_BT_WAKE_UP_HOST can wake up system + + printk(KERN_INFO "bcm4329 module has been initialized,rc=0x%x\n",rc); + #endif + + return rc; + + +} + + +static int __devexit bcm4329_rfkill_remove(struct platform_device *pdev) +{ + if (gBtCtrl.bt_rfk) + rfkill_unregister(gBtCtrl.bt_rfk); + gBtCtrl.bt_rfk = NULL; +#if BT_WAKE_HOST_SUPPORT + del_timer(&(gBtCtrl.tl));//ɾʱ + btWakeupHostUnlock(); + wake_lock_destroy(&(gBtCtrl.bt_wakelock)); +#endif + platform_set_drvdata(pdev, NULL); + + DBG("Enter::%s,line=%d\n",__FUNCTION__,__LINE__); + return 0; +} + +static struct platform_driver bcm4329_rfkill_driver = { + .probe = bcm4329_rfkill_probe, + .remove = __devexit_p(bcm4329_rfkill_remove), + .driver = { + .name = "rk29sdk_rfkill", + .owner = THIS_MODULE, + }, +#if BT_WAKE_HOST_SUPPORT + .suspend = bcm4329_rfkill_suspend, + .resume = bcm4329_rfkill_resume, +#endif +}; + +/* + * Module initialization + */ +static int __init bcm4329_mod_init(void) +{ + int ret; + DBG("Enter::%s,line=%d\n",__FUNCTION__,__LINE__); + ret = platform_driver_register(&bcm4329_rfkill_driver); + printk("ret=0x%x\n", ret); + return ret; +} + +static void __exit bcm4329_mod_exit(void) +{ + platform_driver_unregister(&bcm4329_rfkill_driver); +} + +module_init(bcm4329_mod_init); +module_exit(bcm4329_mod_exit); +MODULE_DESCRIPTION("bcm4329 Bluetooth driver"); +MODULE_AUTHOR("roger_chen cz@rock-chips.com"); +MODULE_LICENSE("GPL"); + diff --git a/arch/arm/mach-rk29/board-rk29-newton.c b/arch/arm/mach-rk29/board-rk29-newton.c index 9cc5a5c99073..f47a92a24c2d 100644 --- a/arch/arm/mach-rk29/board-rk29-newton.c +++ b/arch/arm/mach-rk29/board-rk29-newton.c @@ -1529,7 +1529,12 @@ static int rk29sdk_wifi_bt_gpio_control_init(void) return -1; } +// cwz 0: close for bt uart2 larkage. +#if 0 gpio_direction_output(RK29SDK_WIFI_BT_GPIO_POWER_N, GPIO_LOW); +#else + gpio_direction_output(RK29SDK_WIFI_BT_GPIO_POWER_N, GPIO_HIGH); +#endif gpio_direction_output(RK29SDK_WIFI_GPIO_RESET_N, GPIO_LOW); gpio_direction_output(RK29SDK_BT_GPIO_RESET_N, GPIO_LOW); @@ -1547,6 +1552,8 @@ static int rk29sdk_wifi_power(int on) mdelay(100); pr_info("wifi turn on power\n"); }else{ +// cwz 0: close for bt uart2 larkage. +#if 0 if (!rk29sdk_bt_power_state){ gpio_set_value(RK29SDK_WIFI_BT_GPIO_POWER_N, GPIO_LOW); mdelay(100); @@ -1555,8 +1562,8 @@ static int rk29sdk_wifi_power(int on) { pr_info("wifi shouldn't shut off power, bt is using it!\n"); } +#endif gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, GPIO_LOW); - } rk29sdk_wifi_power_state = on; From a3bf66d403643d0b2f46dacb98dcef557659c209 Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 11:12:02 +0800 Subject: [PATCH 056/150] newton:update config file --- arch/arm/configs/rk29_newton_defconfig | 32 ++++++++++++++------------ 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/arch/arm/configs/rk29_newton_defconfig b/arch/arm/configs/rk29_newton_defconfig index e239cdde7620..ed673fdc5ce1 100644 --- a/arch/arm/configs/rk29_newton_defconfig +++ b/arch/arm/configs/rk29_newton_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.32.27 -# Tue Aug 16 20:21:21 2011 +# Thu Sep 1 11:02:10 2011 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -210,6 +210,7 @@ CONFIG_ARCH_RK29=y # CONFIG_MACH_RK29_PHONEPADSDK is not set CONFIG_MACH_RK29_newton=y # CONFIG_MACH_RK29_P91 is not set +# CONFIG_RK29_NEWTON_CLOCK is not set # CONFIG_DDR_TYPE_DDRII is not set # CONFIG_DDR_TYPE_LPDDR is not set # CONFIG_DDR_TYPE_DDR3_800D is not set @@ -236,6 +237,7 @@ CONFIG_MACH_RK29_newton=y CONFIG_DDR_TYPE_DDR3_DEFAULT=y CONFIG_RK29_MEM_SIZE_M=512 CONFIG_DDR_SDRAM_FREQ=400 +# CONFIG_DDR_FREQ is not set # CONFIG_DDR_RECONFIG is not set CONFIG_WIFI_CONTROL_FUNC=y @@ -1037,7 +1039,8 @@ CONFIG_INPUT_KEYRESET=y # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y -CONFIG_KEYS_RK29=y +# CONFIG_KEYS_RK29 is not set +CONFIG_KEYS_RK29_NEWTON=y # CONFIG_SYNAPTICS_SO340010 is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ATKBD is not set @@ -1083,6 +1086,7 @@ CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_SINTEK_3FA16 is not set # CONFIG_EETI_EGALAX is not set # CONFIG_TOUCHSCREEN_IT7260 is not set +# CONFIG_TOUCHSCREEN_IT7260_I2C is not set # CONFIG_TOUCHSCREEN_NAS is not set # CONFIG_LAIBAO_TS is not set # CONFIG_TOUCHSCREEN_GT801_IIC is not set @@ -1111,6 +1115,7 @@ CONFIG_COMPASS_AK8975=y CONFIG_G_SENSOR_DEVICE=y # CONFIG_GS_MMA7660 is not set CONFIG_GS_MMA8452=y +# CONFIG_GS_KXTF9 is not set CONFIG_GS_L3G4200D=y # CONFIG_INPUT_JOGBALL is not set # CONFIG_LIGHT_SENSOR_DEVICE is not set @@ -1263,6 +1268,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_BQ27510 is not set CONFIG_BATTERY_BQ27541=y # CONFIG_BATTERY_BQ3060 is not set +# CONFIG_NO_BATTERY_IC is not set # CONFIG_HWMON is not set # CONFIG_THERMAL is not set # CONFIG_WATCHDOG is not set @@ -1289,7 +1295,6 @@ CONFIG_SSB_POSSIBLE=y # CONFIG_MFD_TC6387XB is not set # CONFIG_MFD_TC6393XB is not set # CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_WM8994 is not set # CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_I2C is not set # CONFIG_MFD_WM8350_I2C is not set @@ -1376,6 +1381,7 @@ CONFIG_OV3640_AUTOFOCUS=y # CONFIG_SOC_CAMERA_OV5640 is not set # CONFIG_SOC_CAMERA_S5K6AA is not set # CONFIG_SOC_CAMERA_GT2005 is not set +# CONFIG_SOC_CAMERA_GC0307 is not set # CONFIG_SOC_CAMERA_GC0308 is not set # CONFIG_SOC_CAMERA_GC0309 is not set # CONFIG_SOC_CAMERA_GC2015 is not set @@ -1445,13 +1451,7 @@ CONFIG_USB_PWC_INPUT_EVDEV=y # CONFIG_USB_ZR364XX is not set # CONFIG_USB_STKWEBCAM is not set # CONFIG_USB_S2255 is not set -CONFIG_RADIO_ADAPTERS=y -# CONFIG_I2C_SI4713 is not set -# CONFIG_RADIO_SI4713 is not set -# CONFIG_USB_DSBR is not set -# CONFIG_RADIO_SI470X is not set -# CONFIG_USB_MR800 is not set -# CONFIG_RADIO_TEA5764 is not set +# CONFIG_RADIO_ADAPTERS is not set # CONFIG_SMS_SIANO_MDTV is not set # CONFIG_DAB is not set @@ -1486,8 +1486,9 @@ CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_RK2818 is not set CONFIG_FB_RK29=y CONFIG_FB_WORK_IPP=y -# CONFIG_FB_SCALING_OSD is not set +CONFIG_FB_SCALING_OSD=y # CONFIG_FB_ROTATE_VIDEO is not set +# CONFIG_CLOSE_WIN1_DYNAMIC is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set @@ -1496,7 +1497,8 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_GENERIC is not set -CONFIG_BACKLIGHT_RK29_BL=y +# CONFIG_BACKLIGHT_RK29_BL is not set +CONFIG_BACKLIGHT_RK29_NEWTON_BL=y # CONFIG_FIH_TOUCHKEY_LED is not set # CONFIG_BACKLIGHT_AW9364 is not set # CONFIG_BUTTON_LIGHT is not set @@ -1575,9 +1577,7 @@ CONFIG_SND_JACK=y # CONFIG_SND_EMU10K1_SEQ is not set # CONFIG_SND_DRIVERS is not set # CONFIG_SND_ARM is not set -CONFIG_SND_USB=y -# CONFIG_SND_USB_AUDIO is not set -# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB is not set CONFIG_SND_SOC=y CONFIG_SND_RK29_SOC=y CONFIG_SND_RK29_SOC_I2S=y @@ -1592,6 +1592,7 @@ CONFIG_SND_RK29_SOC_I2S_8CH=y CONFIG_SND_RK29_SOC_CS42L52=y # CONFIG_SND_RK29_CODEC_SOC_MASTER is not set CONFIG_SND_RK29_CODEC_SOC_SLAVE=y +# CONFIG_ADJUST_VOL_BY_CODEC is not set CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_ALL_CODECS is not set CONFIG_SND_SOC_CS42L52=y @@ -2020,6 +2021,7 @@ CONFIG_VIVANTE=y # IPP # CONFIG_RK29_IPP=y +CONFIG_DEINTERLACE=y # # CMMB From e343017db47b4e201297e445db3e13b7af41f876 Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 11:23:09 +0800 Subject: [PATCH 057/150] fix bu92747 cir compile error --- drivers/cir/bu92747guw_cir.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/cir/bu92747guw_cir.c b/drivers/cir/bu92747guw_cir.c index 66048d443c2b..c63ea295a027 100644 --- a/drivers/cir/bu92747guw_cir.c +++ b/drivers/cir/bu92747guw_cir.c @@ -64,10 +64,10 @@ void bu92747_lock(void) { mutex_lock(&bu92747_mutex); } -void bu92747_unlock(void) -{ - mutex_unlock(&bu92747_mutex); -} +//void bu92747_unlock(void) +//{ +// mutex_unlock(&bu92747_mutex); +//} From c821fb2cdb9ba36671e31f852de907df10f02f5d Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 11:54:41 +0800 Subject: [PATCH 058/150] newton update board file --- arch/arm/mach-rk29/board-rk29-newton.c | 33 +++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rk29/board-rk29-newton.c b/arch/arm/mach-rk29/board-rk29-newton.c index f47a92a24c2d..0f7733e69b12 100644 --- a/arch/arm/mach-rk29/board-rk29-newton.c +++ b/arch/arm/mach-rk29/board-rk29-newton.c @@ -753,6 +753,31 @@ static struct eeti_egalax_platform_data eeti_egalax_info = { .disp_on_value = TOUCH_SCREEN_DISPLAY_VALUE, }; #endif + +#ifdef CONFIG_GS_KXTF9 +#include +#define KXTF9_DEVICE_MAP 1 +#define KXTF9_MAP_X (KXTF9_DEVICE_MAP-1)%2 +#define KXTF9_MAP_Y KXTF9_DEVICE_MAP%2 +#define KXTF9_NEG_X (KXTF9_DEVICE_MAP/2)%2 +#define KXTF9_NEG_Y (KXTF9_DEVICE_MAP+1)/4 +#define KXTF9_NEG_Z (KXTF9_DEVICE_MAP-1)/4 +struct kxtf9_platform_data kxtf9_pdata = { + .min_interval = 1, + .poll_interval = 20, + .g_range = KXTF9_G_2G, + .axis_map_x = KXTF9_MAP_X, + .axis_map_y = KXTF9_MAP_Y, + .axis_map_z = 2, + .negate_x = KXTF9_NEG_X, + .negate_y = KXTF9_NEG_Y, + .negate_z = KXTF9_NEG_Z, + //.ctrl_regc_init = KXTF9_G_2G | ODR50F, + //.ctrl_regb_init = ENABLE, +}; +#endif /* CONFIG_GS_KXTF9 */ + + /*MMA8452 gsensor*/ #if defined (CONFIG_GS_MMA8452) #define MMA8452_INT_PIN RK29_PIN0_PA3 @@ -1162,7 +1187,7 @@ static struct i2c_board_info __initdata board_i2c2_devices[] = { #ifdef CONFIG_I2C3_RK29 static struct i2c_board_info __initdata board_i2c3_devices[] = { - #if defined (CONFIG_BATTERY_BQ27541) +#if defined (CONFIG_BATTERY_BQ27541) { .type = "bq27541", .addr = 0x55, @@ -1885,6 +1910,9 @@ static struct platform_device *devices[] __initdata = { &rk29_device_iis_8ch, #endif +#ifdef CONFIG_KEYS_RK29 + &rk29_device_keys, +#endif #ifdef CONFIG_KEYS_RK29_NEWTON &rk29_device_keys, #endif @@ -1915,6 +1943,9 @@ static struct platform_device *devices[] __initdata = { &rk29_device_fb, &rk29_device_dma_cpy, #endif +#ifdef CONFIG_BACKLIGHT_RK29_BL + &rk29_device_backlight, +#endif #ifdef CONFIG_BACKLIGHT_RK29_NEWTON_BL &rk29_device_backlight, #endif From 0d2a3efea140a96666ad7df7456203ad24882c6d Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 11:55:12 +0800 Subject: [PATCH 059/150] rk29sdk update board file --- arch/arm/mach-rk29/board-rk29sdk.c | 627 ++++++++++++++++++++++------- 1 file changed, 482 insertions(+), 145 deletions(-) mode change 100755 => 100644 arch/arm/mach-rk29/board-rk29sdk.c diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c old mode 100755 new mode 100644 index dc67f13830d7..37193c3b64d7 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -39,8 +39,8 @@ #include #include #include +#include /* ddl@rock-chips.com : camera support */ #include /* ddl@rock-chips.com : camera support */ -#include /* ddl@rock-chips.com : camera support */ #include #include #include @@ -57,6 +57,9 @@ #include "devices.h" #include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h" +#ifdef CONFIG_BU92747GUW_CIR +#include "../../../drivers/cir/bu92747guw_cir.h" +#endif #ifdef CONFIG_VIDEO_RK29 /*---------------- Camera Sensor Macro Define Begin ------------------------*/ /*---------------- Camera Sensor Configuration Macro Begin ------------------------*/ @@ -155,15 +158,10 @@ struct rk29_nand_platform_data rk29_nand_data = { .io_init = rk29_nand_io_init, }; -/***************************************************************************************** -* touch screen devices -* author: cf@rock-chips.com -*****************************************************************************************/ #define TOUCH_SCREEN_STANDBY_PIN INVALID_GPIO #define TOUCH_SCREEN_STANDBY_VALUE GPIO_HIGH #define TOUCH_SCREEN_DISPLAY_PIN INVALID_GPIO #define TOUCH_SCREEN_DISPLAY_VALUE GPIO_HIGH - #ifdef CONFIG_FB_RK29 /***************************************************************************************** * lcd devices @@ -372,6 +370,344 @@ struct platform_device rk29_device_dma_cpy = { #endif +#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) +#define BU92747GUW_RESET_PIN RK29_PIN3_PD4// INVALID_GPIO // +#define BU92747GUW_RESET_MUX_NAME GPIO3D4_HOSTWRN_NAME//NULL // +#define BU92747GUW_RESET_MUX_MODE GPIO3H_GPIO3D4//NULL // + +#define BU92747GUW_PWDN_PIN RK29_PIN3_PD3//RK29_PIN5_PA7 // +#define BU92747GUW_PWDN_MUX_NAME GPIO3D3_HOSTRDN_NAME//GPIO5A7_HSADCDATA2_NAME // +#define BU92747GUW_PWDN_MUX_MODE GPIO3H_GPIO3D3//GPIO5L_GPIO5A7 // + +static int bu92747guw_io_init(void) +{ + int ret; + + //reset pin + if(BU92747GUW_RESET_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_RESET_MUX_NAME, BU92747GUW_RESET_MUX_MODE); + } + ret = gpio_request(BU92747GUW_RESET_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_RESET_PIN); + printk(">>>>>> BU92747GUW_RESET_PIN gpio_request err \n "); + } + gpio_direction_output(BU92747GUW_RESET_PIN, GPIO_HIGH); + + //power down pin + if(BU92747GUW_PWDN_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_PWDN_MUX_NAME, BU92747GUW_PWDN_MUX_MODE); + } + ret = gpio_request(BU92747GUW_PWDN_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_PWDN_PIN); + printk(">>>>>> BU92747GUW_PWDN_PIN gpio_request err \n "); + } + + //power down as default + gpio_direction_output(BU92747GUW_PWDN_PIN, GPIO_LOW); + + return 0; +} + + +static int bu92747guw_io_deinit(void) +{ + gpio_free(BU92747GUW_PWDN_PIN); + gpio_free(BU92747GUW_RESET_PIN); + return 0; +} + +//power ctl func is share with irda and remote +static int nPowerOnCount = 0; +static DEFINE_MUTEX(bu92747_power_mutex); + +//1---power on; 0---power off +static int bu92747guw_power_ctl(int enable) +{ + printk("%s \n",__FUNCTION__); + + mutex_lock(&bu92747_power_mutex); + if (enable) { + nPowerOnCount++; + if (nPowerOnCount == 1) {//power on first + //smc0_init(NULL); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_HIGH); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_LOW); + mdelay(5); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_HIGH); + mdelay(5); + } + } + else { + nPowerOnCount--; + if (nPowerOnCount <= 0) {//power down final + nPowerOnCount = 0; + //smc0_exit(); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_LOW); + } + } + mutex_unlock(&bu92747_power_mutex); + return 0; +} +#endif + +#ifdef CONFIG_RK_IRDA +#define IRDA_IRQ_PIN RK29_PIN5_PB2 +#define IRDA_IRQ_MUX_NAME GPIO5B2_HSADCDATA5_NAME +#define IRDA_IRQ_MUX_MODE GPIO5L_GPIO5B2 + +int irda_iomux_init(void) +{ + int ret = 0; + + //irda irq pin + if(IRDA_IRQ_MUX_NAME != NULL) + { + rk29_mux_api_set(IRDA_IRQ_MUX_NAME, IRDA_IRQ_MUX_MODE); + } + ret = gpio_request(IRDA_IRQ_PIN, NULL); + if(ret != 0) + { + gpio_free(IRDA_IRQ_PIN); + printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n "); + } + gpio_pull_updown(IRDA_IRQ_PIN, GPIO_HIGH); + gpio_direction_input(IRDA_IRQ_PIN); + + return 0; +} + +int irda_iomux_deinit(void) +{ + gpio_free(IRDA_IRQ_PIN); + return 0; +} + +static struct irda_info rk29_irda_info = { + .intr_pin = IRDA_IRQ_PIN, + .iomux_init = irda_iomux_init, + .iomux_deinit = irda_iomux_deinit, + .irda_pwr_ctl = bu92747guw_power_ctl, +}; + +static struct platform_device irda_device = { +#ifdef CONFIG_RK_IRDA_NET + .name = "rk_irda", +#else + .name = "bu92747_irda", +#endif + .id = -1, + .dev = { + .platform_data = &rk29_irda_info, + } +}; +#endif + +#ifdef CONFIG_BU92747GUW_CIR +#define BU92747_CIR_IRQ_PIN RK29_PIN5_PB0 +#define CIR_IRQ_PIN_IOMUX_NAME GPIO5B0_HSADCDATA3_NAME +#define CIR_IRQ_PIN_IOMUX_VALUE GPIO5L_GPIO5B0 +static int cir_iomux_init(void) +{ + if (CIR_IRQ_PIN_IOMUX_NAME) + rk29_mux_api_set(CIR_IRQ_PIN_IOMUX_NAME, CIR_IRQ_PIN_IOMUX_VALUE); + rk29_mux_api_set(GPIO5A7_HSADCDATA2_NAME, GPIO5L_GPIO5A7); + return 0; +} + +static struct bu92747guw_platform_data bu92747guw_pdata = { + .intr_pin = BU92747_CIR_IRQ_PIN, + .iomux_init = cir_iomux_init, + .iomux_deinit = NULL, + .cir_pwr_ctl = bu92747guw_power_ctl, +}; +#endif +#ifdef CONFIG_RK29_NEWTON +struct rk29_newton_data rk29_newton_info = { +}; +struct platform_device rk29_device_newton = { + .name = "rk29_newton", + .id = -1, + .dev = { + .platform_data = &rk29_newton_info, + } + }; +#endif +#if defined (CONFIG_TOUCHSCREEN_FT5406) +#define TOUCH_RESET_PIN RK29_PIN6_PC3 +#define TOUCH_INT_PIN RK29_PIN0_PA2 +int ft5406_init_platform_hw(void) +{ + printk("ft5406_init_platform_hw\n"); + if(gpio_request(TOUCH_RESET_PIN,NULL) != 0){ + gpio_free(TOUCH_RESET_PIN); + printk("ft5406_init_platform_hw gpio_request error\n"); + return -EIO; + } + + if(gpio_request(TOUCH_INT_PIN,NULL) != 0){ + gpio_free(TOUCH_INT_PIN); + printk("ift5406_init_platform_hw gpio_request error\n"); + return -EIO; + } + + gpio_direction_output(TOUCH_RESET_PIN, 0); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + mdelay(10); + gpio_direction_input(TOUCH_INT_PIN); + mdelay(10); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + msleep(300); + return 0; +} + +void ft5406_exit_platform_hw(void) +{ + printk("ft5406_exit_platform_hw\n"); + gpio_free(TOUCH_RESET_PIN); + gpio_free(TOUCH_INT_PIN); +} + +int ft5406_platform_sleep(void) +{ + printk("ft5406_platform_sleep\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + return 0; +} + +int ft5406_platform_wakeup(void) +{ + printk("ft5406_platform_wakeup\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + msleep(300); + return 0; +} + +struct ft5406_platform_data ft5406_info = { + + .init_platform_hw= ft5406_init_platform_hw, + .exit_platform_hw= ft5406_exit_platform_hw, + .platform_sleep = ft5406_platform_sleep, + .platform_wakeup = ft5406_platform_wakeup, + +}; +#endif + +#if defined(CONFIG_TOUCHSCREEN_GT819) +#define TOUCH_RESET_PIN RK29_PIN6_PC3 +#define TOUCH_INT_PIN RK29_PIN0_PA2 +int gt819_init_platform_hw(void) +{ + printk("gt819_init_platform_hw\n"); + if(gpio_request(TOUCH_RESET_PIN,NULL) != 0){ + gpio_free(TOUCH_RESET_PIN); + printk("gt819_init_platform_hw gpio_request error\n"); + return -EIO; + } + + if(gpio_request(TOUCH_INT_PIN,NULL) != 0){ + gpio_free(TOUCH_INT_PIN); + printk("gt819_init_platform_hw gpio_request error\n"); + return -EIO; + } + gpio_direction_output(TOUCH_RESET_PIN, 0); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + mdelay(10); +// gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); +// mdelay(10); +// gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + gpio_direction_input(TOUCH_INT_PIN); +// mdelay(10); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + msleep(300); + return 0; +} + + +void gt819_exit_platform_hw(void) +{ + printk("gt819_exit_platform_hw\n"); + gpio_free(TOUCH_RESET_PIN); + gpio_free(TOUCH_INT_PIN); +} + +int gt819_platform_sleep(void) +{ + printk("gt819_platform_sleep\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + return 0; +} + +int gt819_platform_wakeup(void) +{ + printk("gt819_platform_wakeup\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + //msleep(5); + //gpio_set_value(TOUCH_INT_PIN, GPIO_LOW); + //msleep(20); + //gpio_set_value(TOUCH_INT_PIN, GPIO_HIGH); + return 0; +} +struct goodix_platform_data goodix_info = { + + .init_platform_hw= gt819_init_platform_hw, + .exit_platform_hw= gt819_exit_platform_hw, + .platform_sleep = gt819_platform_sleep, + .platform_wakeup = gt819_platform_wakeup, + +}; +#endif + + +#if defined (CONFIG_SND_SOC_CS42L52) + +int cs42l52_init_platform_hw() +{ + printk("cs42l52_init_platform_hw\n"); + if(gpio_request(RK29_PIN6_PB6,NULL) != 0){ + gpio_free(RK29_PIN6_PB6); + printk("cs42l52_init_platform_hw gpio_request error\n"); + return -EIO; + } + gpio_direction_output(RK29_PIN6_PB6, 0); + gpio_set_value(RK29_PIN6_PB6,GPIO_HIGH); + return 0; +} +struct cs42l52_platform_data cs42l52_info = { + + .init_platform_hw= cs42l52_init_platform_hw, + +}; +#endif +#if defined (CONFIG_BATTERY_BQ27541) +#define DC_CHECK_PIN RK29_PIN4_PA1 +#define LI_LION_BAT_NUM 1 +#define CHG_OK RK29_PIN4_PA3 +#define BAT_LOW RK29_PIN4_PA2 + +static int bq27541_init_dc_check_pin(void){ + if(gpio_request(DC_CHECK_PIN,"dc_check") != 0){ + gpio_free(DC_CHECK_PIN); + printk("bq27541 init dc check pin request error\n"); + return -EIO; + } + gpio_direction_input(DC_CHECK_PIN); + return 0; +} + +struct bq27541_platform_data bq27541_info = { + .init_dc_check_pin = bq27541_init_dc_check_pin, + .dc_check_pin = DC_CHECK_PIN, + .bat_num = LI_LION_BAT_NUM, + .chgok_check_pin = CHG_OK, + .bat_check_pin = BAT_LOW, +}; +#endif static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, @@ -820,6 +1156,22 @@ static struct i2c_board_info __initdata board_i2c0_devices[] = { .platform_data = &mpu3050_data, }, #endif +#if defined (CONFIG_SND_SOC_CS42L52) + { + .type = "cs42l52", + .addr = 0x4A, + .flags = 0, + .platform_data = &cs42l52_info, + }, +#endif +#if defined (CONFIG_RTC_M41T66) + { + .type = "rtc-M41T66", + .addr = 0x68, + .flags = 0, + .irq = RK29_PIN0_PA1, + }, +#endif }; #endif #if defined (CONFIG_ANX7150) @@ -845,6 +1197,15 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = { .platform_data = &anx7150_data, }, #endif +#ifdef CONFIG_BU92747GUW_CIR + { + .type ="bu92747_cir", + .addr = 0x77, + .flags =0, + .irq = BU92747_CIR_IRQ_PIN, + .platform_data = &bu92747guw_pdata, + }, +#endif }; #endif @@ -870,11 +1231,37 @@ static struct i2c_board_info __initdata board_i2c2_devices[] = { .platform_data = &eeti_egalax_info, }, #endif +#if defined (CONFIG_TOUCHSCREEN_GT819) + { + .type = "Goodix-TS", + .addr = 0x55, + .flags =0, + .irq =RK29_PIN0_PA2, + .platform_data = &goodix_info, + }, +#endif +#if defined (CONFIG_TOUCHSCREEN_FT5406) + { + .type ="ft5x0x_ts", + .addr = 0x38, //0x70, + .flags =0, + .irq =RK29_PIN0_PA2, // support goodix tp detect, 20110706 + .platform_data = &ft5406_info, + }, +#endif }; #endif #ifdef CONFIG_I2C3_RK29 static struct i2c_board_info __initdata board_i2c3_devices[] = { +#if defined (CONFIG_BATTERY_BQ27541) + { + .type = "bq27541", + .addr = 0x55, + .flags = 0, + .platform_data = &bq27541_info, + }, +#endif }; #endif @@ -1400,144 +1787,6 @@ static struct platform_device rk29_device_gpu = { }; #endif -#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) -#define BU92747GUW_RESET_PIN RK29_PIN3_PD4// INVALID_GPIO // -#define BU92747GUW_RESET_MUX_NAME GPIO3D4_HOSTWRN_NAME//NULL // -#define BU92747GUW_RESET_MUX_MODE GPIO3H_GPIO3D4//NULL // - -#define BU92747GUW_PWDN_PIN RK29_PIN3_PD3//RK29_PIN5_PA7 // -#define BU92747GUW_PWDN_MUX_NAME GPIO3D3_HOSTRDN_NAME//GPIO5A7_HSADCDATA2_NAME // -#define BU92747GUW_PWDN_MUX_MODE GPIO3H_GPIO3D3//GPIO5L_GPIO5A7 // - -static int bu92747guw_io_init(void) -{ - int ret; - - //reset pin - if(BU92747GUW_RESET_MUX_NAME != NULL) - { - rk29_mux_api_set(BU92747GUW_RESET_MUX_NAME, BU92747GUW_RESET_MUX_MODE); - } - ret = gpio_request(BU92747GUW_RESET_PIN, NULL); - if(ret != 0) - { - gpio_free(BU92747GUW_RESET_PIN); - printk(">>>>>> BU92747GUW_RESET_PIN gpio_request err \n "); - } - gpio_direction_output(BU92747GUW_RESET_PIN, GPIO_HIGH); - - //power down pin - if(BU92747GUW_PWDN_MUX_NAME != NULL) - { - rk29_mux_api_set(BU92747GUW_PWDN_MUX_NAME, BU92747GUW_PWDN_MUX_MODE); - } - ret = gpio_request(BU92747GUW_PWDN_PIN, NULL); - if(ret != 0) - { - gpio_free(BU92747GUW_PWDN_PIN); - printk(">>>>>> BU92747GUW_PWDN_PIN gpio_request err \n "); - } - - //power down as default - gpio_direction_output(BU92747GUW_PWDN_PIN, GPIO_LOW); - - return 0; -} - - -static int bu92747guw_io_deinit(void) -{ - gpio_free(BU92747GUW_PWDN_PIN); - gpio_free(BU92747GUW_RESET_PIN); - return 0; -} - -//power ctl func is share with irda and remote -static int nPowerOnCount = 0; -static DEFINE_MUTEX(bu92747_power_mutex); - -//1---power on; 0---power off -static int bu92747guw_power_ctl(int enable) -{ - printk("%s \n",__FUNCTION__); - - mutex_lock(&bu92747_power_mutex); - if (enable) { - nPowerOnCount++; - if (nPowerOnCount == 1) {//power on first - //smc0_init(NULL); - gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_HIGH); - gpio_set_value(BU92747GUW_RESET_PIN, GPIO_LOW); - mdelay(5); - gpio_set_value(BU92747GUW_RESET_PIN, GPIO_HIGH); - mdelay(5); - } - } - else { - nPowerOnCount--; - if (nPowerOnCount <= 0) {//power down final - nPowerOnCount = 0; - //smc0_exit(); - gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_LOW); - } - } - mutex_unlock(&bu92747_power_mutex); - return 0; -} -#endif - -#ifdef CONFIG_RK_IRDA -#define IRDA_IRQ_PIN RK29_PIN5_PB2 -#define IRDA_IRQ_MUX_NAME GPIO5B2_HSADCDATA5_NAME -#define IRDA_IRQ_MUX_MODE GPIO5L_GPIO5B2 - -int irda_iomux_init(void) -{ - int ret = 0; - - //irda irq pin - if(IRDA_IRQ_MUX_NAME != NULL) - { - rk29_mux_api_set(IRDA_IRQ_MUX_NAME, IRDA_IRQ_MUX_MODE); - } - ret = gpio_request(IRDA_IRQ_PIN, NULL); - if(ret != 0) - { - gpio_free(IRDA_IRQ_PIN); - printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n "); - } - gpio_pull_updown(IRDA_IRQ_PIN, GPIO_HIGH); - gpio_direction_input(IRDA_IRQ_PIN); - - return 0; -} - -int irda_iomux_deinit(void) -{ - gpio_free(IRDA_IRQ_PIN); - return 0; -} - -static struct irda_info rk29_irda_info = { - .intr_pin = IRDA_IRQ_PIN, - .iomux_init = irda_iomux_init, - .iomux_deinit = irda_iomux_deinit, - .irda_pwr_ctl = bu92747guw_power_ctl, -}; - -static struct platform_device irda_device = { -#ifdef CONFIG_RK_IRDA_NET - .name = "rk_irda", -#else - .name = "bu92747_irda", -#endif - .id = -1, - .dev = { - .platform_data = &rk29_irda_info, - } -}; -#endif - #ifdef CONFIG_KEYS_RK29 extern struct rk29_keys_platform_data rk29_keys_pdata; static struct platform_device rk29_device_keys = { @@ -1549,6 +1798,76 @@ static struct platform_device rk29_device_keys = { }; #endif +#ifdef CONFIG_LEDS_GPIO_PLATFORM +struct gpio_led rk29_leds[] = { + { + .name = "rk29_red_led", + .gpio = RK29_PIN4_PB2, + .default_trigger = "timer", + .active_low = 0, + .retain_state_suspended = 1, + .default_state = LEDS_GPIO_DEFSTATE_OFF, + }, + { + .name = "rk29_green_led", + .gpio = RK29_PIN4_PB1, + .default_trigger = "timer", + .active_low = 0, + .retain_state_suspended = 1, + .default_state = LEDS_GPIO_DEFSTATE_OFF, + }, + { + .name = "rk29_blue_led", + .gpio = RK29_PIN4_PB0, + .default_trigger = "timer", + .active_low = 0, + .retain_state_suspended = 1, + .default_state = LEDS_GPIO_DEFSTATE_OFF, + }, +}; + +struct gpio_led_platform_data rk29_leds_pdata = { + .leds = &rk29_leds, + .num_leds = ARRAY_SIZE(rk29_leds), +}; + +struct platform_device rk29_device_gpio_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &rk29_leds_pdata, + }, +}; +#endif + +#ifdef CONFIG_LEDS_NEWTON_PWM +static struct led_newton_pwm rk29_pwm_leds[] = { + { + .name = "power_led", + .pwm_id = 1, + .pwm_gpio = RK29_PIN5_PD2, + .pwm_iomux_name = GPIO5D2_PWM1_UART1SIRIN_NAME, + .pwm_iomux_pwm = GPIO5H_PWM1, + .pwm_iomux_gpio = GPIO5H_GPIO5D2, + .freq = 1000, + .period = 255, + }, +}; + +static struct led_newton_pwm_platform_data rk29_pwm_leds_pdata = { + .leds = &rk29_pwm_leds, + .num_leds = ARRAY_SIZE(rk29_pwm_leds), +}; + +static struct platform_device rk29_device_pwm_leds = { + .name = "leds_newton_pwm", + .id = -1, + .dev = { + .platform_data = &rk29_pwm_leds_pdata, + }, +}; + +#endif static void __init rk29_board_iomux_init(void) { #ifdef CONFIG_RK29_PWM_REGULATOR @@ -1610,6 +1929,9 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_KEYS_RK29 &rk29_device_keys, #endif +#ifdef CONFIG_KEYS_RK29_NEWTON + &rk29_device_keys, +#endif #ifdef CONFIG_SDMMC0_RK29 &rk29_device_sdmmc0, #endif @@ -1640,6 +1962,9 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_BACKLIGHT_RK29_BL &rk29_device_backlight, #endif +#ifdef CONFIG_BACKLIGHT_RK29_NEWTON_BL + &rk29_device_backlight, +#endif #ifdef CONFIG_RK29_VMAC &rk29_device_vmac, #endif @@ -1678,8 +2003,20 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_VIDEO_RK29XX_VOUT &rk29_v4l2_output_devce, #endif +#ifdef CONFIG_RK29_NEWTON + &rk29_device_newton, +#endif #ifdef CONFIG_RK_IRDA - &irda_device, + &irda_device, +#endif +#ifdef CONFIG_LEDS_GPIO_PLATFORM + &rk29_device_gpio_leds, +#endif +#ifdef CONFIG_LEDS_NEWTON_PWM + &rk29_device_pwm_leds, +#endif +#ifdef CONFIG_SND_RK29_SOC_CS42L52 + &rk29_cs42l52_device, #endif }; From 92d85473568ec3d1661a6bae63e005e73b77f1af Mon Sep 17 00:00:00 2001 From: eddie Date: Thu, 1 Sep 2011 11:55:40 +0800 Subject: [PATCH 060/150] rk29 ddr3sdk update board file --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 636 ++++++++++++++++++------ 1 file changed, 491 insertions(+), 145 deletions(-) mode change 100755 => 100644 arch/arm/mach-rk29/board-rk29-ddr3sdk.c diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c old mode 100755 new mode 100644 index e0bed71904e0..de48ad040ab4 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -57,6 +57,9 @@ #include "devices.h" #include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h" +#ifdef CONFIG_BU92747GUW_CIR +#include "../../../drivers/cir/bu92747guw_cir.h" +#endif #ifdef CONFIG_VIDEO_RK29 /*---------------- Camera Sensor Macro Define Begin ------------------------*/ /*---------------- Camera Sensor Configuration Macro Begin ------------------------*/ @@ -88,6 +91,7 @@ #include "../../../drivers/media/video/rk29_camera.c" /*---------------- Camera Sensor Macro Define End ------------------------*/ + /* Set memory size of pmem */ #ifdef CONFIG_RK29_MEM_SIZE_M #define SDRAM_SIZE (CONFIG_RK29_MEM_SIZE_M * SZ_1M) @@ -310,6 +314,7 @@ static int rk29_fb_io_init(struct rk29_fb_setting_info *fb_setting) return ret; } + static struct rk29fb_info rk29_fb_info = { .fb_id = FB_ID, .mcu_fmk_pin = FB_MCU_FMK_PIN, @@ -368,6 +373,344 @@ struct platform_device rk29_device_dma_cpy = { #endif +#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) +#define BU92747GUW_RESET_PIN RK29_PIN3_PD4// INVALID_GPIO // +#define BU92747GUW_RESET_MUX_NAME GPIO3D4_HOSTWRN_NAME//NULL // +#define BU92747GUW_RESET_MUX_MODE GPIO3H_GPIO3D4//NULL // + +#define BU92747GUW_PWDN_PIN RK29_PIN3_PD3//RK29_PIN5_PA7 // +#define BU92747GUW_PWDN_MUX_NAME GPIO3D3_HOSTRDN_NAME//GPIO5A7_HSADCDATA2_NAME // +#define BU92747GUW_PWDN_MUX_MODE GPIO3H_GPIO3D3//GPIO5L_GPIO5A7 // + +static int bu92747guw_io_init(void) +{ + int ret; + + //reset pin + if(BU92747GUW_RESET_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_RESET_MUX_NAME, BU92747GUW_RESET_MUX_MODE); + } + ret = gpio_request(BU92747GUW_RESET_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_RESET_PIN); + printk(">>>>>> BU92747GUW_RESET_PIN gpio_request err \n "); + } + gpio_direction_output(BU92747GUW_RESET_PIN, GPIO_HIGH); + + //power down pin + if(BU92747GUW_PWDN_MUX_NAME != NULL) + { + rk29_mux_api_set(BU92747GUW_PWDN_MUX_NAME, BU92747GUW_PWDN_MUX_MODE); + } + ret = gpio_request(BU92747GUW_PWDN_PIN, NULL); + if(ret != 0) + { + gpio_free(BU92747GUW_PWDN_PIN); + printk(">>>>>> BU92747GUW_PWDN_PIN gpio_request err \n "); + } + + //power down as default + gpio_direction_output(BU92747GUW_PWDN_PIN, GPIO_LOW); + + return 0; +} + + +static int bu92747guw_io_deinit(void) +{ + gpio_free(BU92747GUW_PWDN_PIN); + gpio_free(BU92747GUW_RESET_PIN); + return 0; +} + +//power ctl func is share with irda and remote +static int nPowerOnCount = 0; +static DEFINE_MUTEX(bu92747_power_mutex); + +//1---power on; 0---power off +static int bu92747guw_power_ctl(int enable) +{ + printk("%s \n",__FUNCTION__); + + mutex_lock(&bu92747_power_mutex); + if (enable) { + nPowerOnCount++; + if (nPowerOnCount == 1) {//power on first + //smc0_init(NULL); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_HIGH); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_LOW); + mdelay(5); + gpio_set_value(BU92747GUW_RESET_PIN, GPIO_HIGH); + mdelay(5); + } + } + else { + nPowerOnCount--; + if (nPowerOnCount <= 0) {//power down final + nPowerOnCount = 0; + //smc0_exit(); + gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_LOW); + } + } + mutex_unlock(&bu92747_power_mutex); + return 0; +} +#endif + +#ifdef CONFIG_RK_IRDA +#define IRDA_IRQ_PIN RK29_PIN5_PB2 +#define IRDA_IRQ_MUX_NAME GPIO5B2_HSADCDATA5_NAME +#define IRDA_IRQ_MUX_MODE GPIO5L_GPIO5B2 + +int irda_iomux_init(void) +{ + int ret = 0; + + //irda irq pin + if(IRDA_IRQ_MUX_NAME != NULL) + { + rk29_mux_api_set(IRDA_IRQ_MUX_NAME, IRDA_IRQ_MUX_MODE); + } + ret = gpio_request(IRDA_IRQ_PIN, NULL); + if(ret != 0) + { + gpio_free(IRDA_IRQ_PIN); + printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n "); + } + gpio_pull_updown(IRDA_IRQ_PIN, GPIO_HIGH); + gpio_direction_input(IRDA_IRQ_PIN); + + return 0; +} + +int irda_iomux_deinit(void) +{ + gpio_free(IRDA_IRQ_PIN); + return 0; +} + +static struct irda_info rk29_irda_info = { + .intr_pin = IRDA_IRQ_PIN, + .iomux_init = irda_iomux_init, + .iomux_deinit = irda_iomux_deinit, + .irda_pwr_ctl = bu92747guw_power_ctl, +}; + +static struct platform_device irda_device = { +#ifdef CONFIG_RK_IRDA_NET + .name = "rk_irda", +#else + .name = "bu92747_irda", +#endif + .id = -1, + .dev = { + .platform_data = &rk29_irda_info, + } +}; +#endif + +#ifdef CONFIG_BU92747GUW_CIR +#define BU92747_CIR_IRQ_PIN RK29_PIN5_PB0 +#define CIR_IRQ_PIN_IOMUX_NAME GPIO5B0_HSADCDATA3_NAME +#define CIR_IRQ_PIN_IOMUX_VALUE GPIO5L_GPIO5B0 +static int cir_iomux_init(void) +{ + if (CIR_IRQ_PIN_IOMUX_NAME) + rk29_mux_api_set(CIR_IRQ_PIN_IOMUX_NAME, CIR_IRQ_PIN_IOMUX_VALUE); + rk29_mux_api_set(GPIO5A7_HSADCDATA2_NAME, GPIO5L_GPIO5A7); + return 0; +} + +static struct bu92747guw_platform_data bu92747guw_pdata = { + .intr_pin = BU92747_CIR_IRQ_PIN, + .iomux_init = cir_iomux_init, + .iomux_deinit = NULL, + .cir_pwr_ctl = bu92747guw_power_ctl, +}; +#endif +#ifdef CONFIG_RK29_NEWTON +struct rk29_newton_data rk29_newton_info = { +}; +struct platform_device rk29_device_newton = { + .name = "rk29_newton", + .id = -1, + .dev = { + .platform_data = &rk29_newton_info, + } + }; +#endif +#if defined (CONFIG_TOUCHSCREEN_FT5406) +#define TOUCH_RESET_PIN RK29_PIN6_PC3 +#define TOUCH_INT_PIN RK29_PIN0_PA2 +int ft5406_init_platform_hw(void) +{ + printk("ft5406_init_platform_hw\n"); + if(gpio_request(TOUCH_RESET_PIN,NULL) != 0){ + gpio_free(TOUCH_RESET_PIN); + printk("ft5406_init_platform_hw gpio_request error\n"); + return -EIO; + } + + if(gpio_request(TOUCH_INT_PIN,NULL) != 0){ + gpio_free(TOUCH_INT_PIN); + printk("ift5406_init_platform_hw gpio_request error\n"); + return -EIO; + } + + gpio_direction_output(TOUCH_RESET_PIN, 0); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + mdelay(10); + gpio_direction_input(TOUCH_INT_PIN); + mdelay(10); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + msleep(300); + return 0; +} + +void ft5406_exit_platform_hw(void) +{ + printk("ft5406_exit_platform_hw\n"); + gpio_free(TOUCH_RESET_PIN); + gpio_free(TOUCH_INT_PIN); +} + +int ft5406_platform_sleep(void) +{ + printk("ft5406_platform_sleep\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + return 0; +} + +int ft5406_platform_wakeup(void) +{ + printk("ft5406_platform_wakeup\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + msleep(300); + return 0; +} + +struct ft5406_platform_data ft5406_info = { + + .init_platform_hw= ft5406_init_platform_hw, + .exit_platform_hw= ft5406_exit_platform_hw, + .platform_sleep = ft5406_platform_sleep, + .platform_wakeup = ft5406_platform_wakeup, + +}; +#endif + +#if defined(CONFIG_TOUCHSCREEN_GT819) +#define TOUCH_RESET_PIN RK29_PIN6_PC3 +#define TOUCH_INT_PIN RK29_PIN0_PA2 +int gt819_init_platform_hw(void) +{ + printk("gt819_init_platform_hw\n"); + if(gpio_request(TOUCH_RESET_PIN,NULL) != 0){ + gpio_free(TOUCH_RESET_PIN); + printk("gt819_init_platform_hw gpio_request error\n"); + return -EIO; + } + + if(gpio_request(TOUCH_INT_PIN,NULL) != 0){ + gpio_free(TOUCH_INT_PIN); + printk("gt819_init_platform_hw gpio_request error\n"); + return -EIO; + } + gpio_direction_output(TOUCH_RESET_PIN, 0); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + mdelay(10); +// gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); +// mdelay(10); +// gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + gpio_direction_input(TOUCH_INT_PIN); +// mdelay(10); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + msleep(300); + return 0; +} + + +void gt819_exit_platform_hw(void) +{ + printk("gt819_exit_platform_hw\n"); + gpio_free(TOUCH_RESET_PIN); + gpio_free(TOUCH_INT_PIN); +} + +int gt819_platform_sleep(void) +{ + printk("gt819_platform_sleep\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW); + return 0; +} + +int gt819_platform_wakeup(void) +{ + printk("gt819_platform_wakeup\n"); + gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH); + //msleep(5); + //gpio_set_value(TOUCH_INT_PIN, GPIO_LOW); + //msleep(20); + //gpio_set_value(TOUCH_INT_PIN, GPIO_HIGH); + return 0; +} +struct goodix_platform_data goodix_info = { + + .init_platform_hw= gt819_init_platform_hw, + .exit_platform_hw= gt819_exit_platform_hw, + .platform_sleep = gt819_platform_sleep, + .platform_wakeup = gt819_platform_wakeup, + +}; +#endif + + +#if defined (CONFIG_SND_SOC_CS42L52) + +int cs42l52_init_platform_hw() +{ + printk("cs42l52_init_platform_hw\n"); + if(gpio_request(RK29_PIN6_PB6,NULL) != 0){ + gpio_free(RK29_PIN6_PB6); + printk("cs42l52_init_platform_hw gpio_request error\n"); + return -EIO; + } + gpio_direction_output(RK29_PIN6_PB6, 0); + gpio_set_value(RK29_PIN6_PB6,GPIO_HIGH); + return 0; +} +struct cs42l52_platform_data cs42l52_info = { + + .init_platform_hw= cs42l52_init_platform_hw, + +}; +#endif +#if defined (CONFIG_BATTERY_BQ27541) +#define DC_CHECK_PIN RK29_PIN4_PA1 +#define LI_LION_BAT_NUM 1 +#define CHG_OK RK29_PIN4_PA3 +#define BAT_LOW RK29_PIN4_PA2 + +static int bq27541_init_dc_check_pin(void){ + if(gpio_request(DC_CHECK_PIN,"dc_check") != 0){ + gpio_free(DC_CHECK_PIN); + printk("bq27541 init dc check pin request error\n"); + return -EIO; + } + gpio_direction_input(DC_CHECK_PIN); + return 0; +} + +struct bq27541_platform_data bq27541_info = { + .init_dc_check_pin = bq27541_init_dc_check_pin, + .dc_check_pin = DC_CHECK_PIN, + .bat_num = LI_LION_BAT_NUM, + .chgok_check_pin = CHG_OK, + .bat_check_pin = BAT_LOW, +}; +#endif static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, @@ -821,6 +1164,7 @@ static struct i2c_board_info __initdata board_i2c0_devices[] = { .irq = RK29_PIN0_PA4, }, #endif +/*mpu3050*/ #if defined (CONFIG_MPU_SENSORS_MPU3050) { .type = "mpu3050", @@ -830,14 +1174,29 @@ static struct i2c_board_info __initdata board_i2c0_devices[] = { .platform_data = &mpu3050_data, }, #endif +#if defined (CONFIG_SND_SOC_CS42L52) + { + .type = "cs42l52", + .addr = 0x4A, + .flags = 0, + .platform_data = &cs42l52_info, + }, +#endif +#if defined (CONFIG_RTC_M41T66) + { + .type = "rtc-M41T66", + .addr = 0x68, + .flags = 0, + .irq = RK29_PIN0_PA1, + }, +#endif }; #endif #if defined (CONFIG_ANX7150) -struct hdmi_platform_data anx7150_data = { - //.io_init = anx7150_io_init, +struct hdmi_platform_data anx7150_data = { + //.io_init = anx7150_io_init, }; #endif - #ifdef CONFIG_I2C1_RK29 static struct i2c_board_info __initdata board_i2c1_devices[] = { #if defined (CONFIG_RK1000_CONTROL1) @@ -856,6 +1215,15 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = { .platform_data = &anx7150_data, }, #endif +#ifdef CONFIG_BU92747GUW_CIR + { + .type ="bu92747_cir", + .addr = 0x77, + .flags =0, + .irq = BU92747_CIR_IRQ_PIN, + .platform_data = &bu92747guw_pdata, + }, +#endif }; #endif @@ -881,11 +1249,37 @@ static struct i2c_board_info __initdata board_i2c2_devices[] = { .platform_data = &eeti_egalax_info, }, #endif +#if defined (CONFIG_TOUCHSCREEN_GT819) + { + .type = "Goodix-TS", + .addr = 0x55, + .flags =0, + .irq =RK29_PIN0_PA2, + .platform_data = &goodix_info, + }, +#endif +#if defined (CONFIG_TOUCHSCREEN_FT5406) + { + .type ="ft5x0x_ts", + .addr = 0x38, //0x70, + .flags =0, + .irq =RK29_PIN0_PA2, // support goodix tp detect, 20110706 + .platform_data = &ft5406_info, + }, +#endif }; #endif #ifdef CONFIG_I2C3_RK29 static struct i2c_board_info __initdata board_i2c3_devices[] = { +#if defined (CONFIG_BATTERY_BQ27541) + { + .type = "bq27541", + .addr = 0x55, + .flags = 0, + .platform_data = &bq27541_info, + }, +#endif }; #endif @@ -893,7 +1287,7 @@ static struct i2c_board_info __initdata board_i2c3_devices[] = { * camera devices * author: ddl@rock-chips.com *****************************************************************************************/ -#ifdef CONFIG_VIDEO_RK29 +#ifdef CONFIG_VIDEO_RK29 #define CONFIG_SENSOR_POWER_IOCTL_USR 0 #define CONFIG_SENSOR_RESET_IOCTL_USR 0 #define CONFIG_SENSOR_POWERDOWN_IOCTL_USR 0 @@ -952,7 +1346,6 @@ static struct rk29camera_platform_ioctl_cb sensor_ioctl_cb = { .sensor_flash_cb = NULL, #endif }; - #include "../../../drivers/media/video/rk29_camera.c" #endif /***************************************************************************************** @@ -1010,6 +1403,7 @@ static int rk29_backlight_io_deinit(void) gpio_free(BL_EN_PIN); #endif rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO); + return ret; } @@ -1411,145 +1805,6 @@ static struct platform_device rk29_device_gpu = { }; #endif -#if defined(CONFIG_RK_IRDA) || defined(CONFIG_BU92747GUW_CIR) -#define BU92747GUW_RESET_PIN RK29_PIN3_PD4// INVALID_GPIO // -#define BU92747GUW_RESET_MUX_NAME GPIO3D4_HOSTWRN_NAME//NULL // -#define BU92747GUW_RESET_MUX_MODE GPIO3H_GPIO3D4//NULL // - -#define BU92747GUW_PWDN_PIN RK29_PIN3_PD3//RK29_PIN5_PA7 // -#define BU92747GUW_PWDN_MUX_NAME GPIO3D3_HOSTRDN_NAME//GPIO5A7_HSADCDATA2_NAME // -#define BU92747GUW_PWDN_MUX_MODE GPIO3H_GPIO3D3//GPIO5L_GPIO5A7 // - -static int bu92747guw_io_init(void) -{ - int ret; - - //reset pin - if(BU92747GUW_RESET_MUX_NAME != NULL) - { - rk29_mux_api_set(BU92747GUW_RESET_MUX_NAME, BU92747GUW_RESET_MUX_MODE); - } - ret = gpio_request(BU92747GUW_RESET_PIN, NULL); - if(ret != 0) - { - gpio_free(BU92747GUW_RESET_PIN); - printk(">>>>>> BU92747GUW_RESET_PIN gpio_request err \n "); - } - gpio_direction_output(BU92747GUW_RESET_PIN, GPIO_HIGH); - - //power down pin - if(BU92747GUW_PWDN_MUX_NAME != NULL) - { - rk29_mux_api_set(BU92747GUW_PWDN_MUX_NAME, BU92747GUW_PWDN_MUX_MODE); - } - ret = gpio_request(BU92747GUW_PWDN_PIN, NULL); - if(ret != 0) - { - gpio_free(BU92747GUW_PWDN_PIN); - printk(">>>>>> BU92747GUW_PWDN_PIN gpio_request err \n "); - } - - //power down as default - gpio_direction_output(BU92747GUW_PWDN_PIN, GPIO_LOW); - - return 0; -} - - -static int bu92747guw_io_deinit(void) -{ - gpio_free(BU92747GUW_PWDN_PIN); - gpio_free(BU92747GUW_RESET_PIN); - return 0; -} - -//power ctl func is share with irda and remote -static int nPowerOnCount = 0; -static DEFINE_MUTEX(bu92747_power_mutex); - -//1---power on; 0---power off -static int bu92747guw_power_ctl(int enable) -{ - printk("%s \n",__FUNCTION__); - - mutex_lock(&bu92747_power_mutex); - if (enable) { - nPowerOnCount++; - if (nPowerOnCount == 1) {//power on first - //smc0_init(NULL); - gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_HIGH); - gpio_set_value(BU92747GUW_RESET_PIN, GPIO_LOW); - mdelay(5); - gpio_set_value(BU92747GUW_RESET_PIN, GPIO_HIGH); - mdelay(5); - } - } - else { - nPowerOnCount--; - if (nPowerOnCount <= 0) {//power down final - nPowerOnCount = 0; - //smc0_exit(); - gpio_set_value(BU92747GUW_PWDN_PIN, GPIO_LOW); - } - } - mutex_unlock(&bu92747_power_mutex); - return 0; -} -#endif - -#ifdef CONFIG_RK_IRDA -#define IRDA_IRQ_PIN RK29_PIN5_PB2 -#define IRDA_IRQ_MUX_NAME GPIO5B2_HSADCDATA5_NAME -#define IRDA_IRQ_MUX_MODE GPIO5L_GPIO5B2 - -int irda_iomux_init(void) -{ - int ret = 0; - - //irda irq pin - if(IRDA_IRQ_MUX_NAME != NULL) - { - rk29_mux_api_set(IRDA_IRQ_MUX_NAME, IRDA_IRQ_MUX_MODE); - } - ret = gpio_request(IRDA_IRQ_PIN, NULL); - if(ret != 0) - { - gpio_free(IRDA_IRQ_PIN); - printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n "); - } - gpio_pull_updown(IRDA_IRQ_PIN, GPIO_HIGH); - gpio_direction_input(IRDA_IRQ_PIN); - - return 0; -} - -int irda_iomux_deinit(void) -{ - gpio_free(IRDA_IRQ_PIN); - return 0; -} - -static struct irda_info rk29_irda_info = { - .intr_pin = IRDA_IRQ_PIN, - .iomux_init = irda_iomux_init, - .iomux_deinit = irda_iomux_deinit, - .irda_pwr_ctl = bu92747guw_power_ctl, -}; - -static struct platform_device irda_device = { -#ifdef CONFIG_RK_IRDA_NET - .name = "rk_irda", -#else - .name = "bu92747_irda", -#endif - .id = -1, - .dev = { - .platform_data = &rk29_irda_info, - } -}; -#endif - - #ifdef CONFIG_KEYS_RK29 extern struct rk29_keys_platform_data rk29_keys_pdata; static struct platform_device rk29_device_keys = { @@ -1561,6 +1816,76 @@ static struct platform_device rk29_device_keys = { }; #endif +#ifdef CONFIG_LEDS_GPIO_PLATFORM +struct gpio_led rk29_leds[] = { + { + .name = "rk29_red_led", + .gpio = RK29_PIN4_PB2, + .default_trigger = "timer", + .active_low = 0, + .retain_state_suspended = 1, + .default_state = LEDS_GPIO_DEFSTATE_OFF, + }, + { + .name = "rk29_green_led", + .gpio = RK29_PIN4_PB1, + .default_trigger = "timer", + .active_low = 0, + .retain_state_suspended = 1, + .default_state = LEDS_GPIO_DEFSTATE_OFF, + }, + { + .name = "rk29_blue_led", + .gpio = RK29_PIN4_PB0, + .default_trigger = "timer", + .active_low = 0, + .retain_state_suspended = 1, + .default_state = LEDS_GPIO_DEFSTATE_OFF, + }, +}; + +struct gpio_led_platform_data rk29_leds_pdata = { + .leds = &rk29_leds, + .num_leds = ARRAY_SIZE(rk29_leds), +}; + +struct platform_device rk29_device_gpio_leds = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &rk29_leds_pdata, + }, +}; +#endif + +#ifdef CONFIG_LEDS_NEWTON_PWM +static struct led_newton_pwm rk29_pwm_leds[] = { + { + .name = "power_led", + .pwm_id = 1, + .pwm_gpio = RK29_PIN5_PD2, + .pwm_iomux_name = GPIO5D2_PWM1_UART1SIRIN_NAME, + .pwm_iomux_pwm = GPIO5H_PWM1, + .pwm_iomux_gpio = GPIO5H_GPIO5D2, + .freq = 1000, + .period = 255, + }, +}; + +static struct led_newton_pwm_platform_data rk29_pwm_leds_pdata = { + .leds = &rk29_pwm_leds, + .num_leds = ARRAY_SIZE(rk29_pwm_leds), +}; + +static struct platform_device rk29_device_pwm_leds = { + .name = "leds_newton_pwm", + .id = -1, + .dev = { + .platform_data = &rk29_pwm_leds_pdata, + }, +}; + +#endif static void __init rk29_board_iomux_init(void) { #ifdef CONFIG_RK29_PWM_REGULATOR @@ -1622,6 +1947,9 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_KEYS_RK29 &rk29_device_keys, #endif +#ifdef CONFIG_KEYS_RK29_NEWTON + &rk29_device_keys, +#endif #ifdef CONFIG_SDMMC0_RK29 &rk29_device_sdmmc0, #endif @@ -1652,6 +1980,9 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_BACKLIGHT_RK29_BL &rk29_device_backlight, #endif +#ifdef CONFIG_BACKLIGHT_RK29_NEWTON_BL + &rk29_device_backlight, +#endif #ifdef CONFIG_RK29_VMAC &rk29_device_vmac, #endif @@ -1682,14 +2013,29 @@ static struct platform_device *devices[] __initdata = { &android_usb_device, &usb_mass_storage_device, #endif +#ifdef CONFIG_USB_ANDROID_RNDIS + &rk29_device_rndis, +#endif #ifdef CONFIG_RK29_IPP &rk29_device_ipp, #endif #ifdef CONFIG_VIDEO_RK29XX_VOUT &rk29_v4l2_output_devce, #endif +#ifdef CONFIG_RK29_NEWTON + &rk29_device_newton, +#endif #ifdef CONFIG_RK_IRDA - &irda_device, + &irda_device, +#endif +#ifdef CONFIG_LEDS_GPIO_PLATFORM + &rk29_device_gpio_leds, +#endif +#ifdef CONFIG_LEDS_NEWTON_PWM + &rk29_device_pwm_leds, +#endif +#ifdef CONFIG_SND_RK29_SOC_CS42L52 + &rk29_cs42l52_device, #endif }; From 3a5b7f31e11eec70fc118d94545608ec91d69840 Mon Sep 17 00:00:00 2001 From: sxj Date: Thu, 1 Sep 2011 01:06:36 -0700 Subject: [PATCH 061/150] i2s dma optimization, default use burst 16 --- sound/soc/rk29/rk29_i2s.c | 3 +++ sound/soc/rk29/rk29_pcm.c | 21 +++++++++++++++++++-- sound/soc/rk29/rk29_pcm.h | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/sound/soc/rk29/rk29_i2s.c b/sound/soc/rk29/rk29_i2s.c index f91dd898178e..809efcf6d25d 100755 --- a/sound/soc/rk29/rk29_i2s.c +++ b/sound/soc/rk29/rk29_i2s.c @@ -658,8 +658,11 @@ static int __devinit rockchip_i2s_probe(struct platform_device *pdev) i2s->dma_capture->client = &rk29_dma_client_in; i2s->dma_capture->dma_size = 4; + i2s->dma_capture->flag = 0; //add by sxj, used for burst change i2s->dma_playback->client = &rk29_dma_client_out; i2s->dma_playback->dma_size = 4; + i2s->dma_playback->flag = 0; //add by sxj, used for burst change + i2s->iis_clk = clk_get(&pdev->dev, "i2s"); I2S_DBG("Enter:%s, %d, iis_clk=%d\n", __FUNCTION__, __LINE__, i2s->iis_clk); diff --git a/sound/soc/rk29/rk29_pcm.c b/sound/soc/rk29/rk29_pcm.c index 066eaa1ad50f..c29e0a00f149 100755 --- a/sound/soc/rk29/rk29_pcm.c +++ b/sound/soc/rk29/rk29_pcm.c @@ -54,7 +54,7 @@ static const struct snd_pcm_hardware rockchip_pcm_hardware = { .channels_max = 8, .buffer_bytes_max = 128*1024, .period_bytes_min = 64, ///PAGE_SIZE, - .period_bytes_max = 2047*4,///PAGE_SIZE*2, + .period_bytes_max = 2048*4,///PAGE_SIZE*2, .periods_min = 3,///2, .periods_max = 128, .fifo_size = 16, @@ -219,6 +219,23 @@ static void rockchip_pcm_enqueue(struct snd_pcm_substream *substream) if ((pos + len) > prtd->dma_end) { len = prtd->dma_end - pos; } + + if((len%(prtd->params->dma_size*16) == 0) && (prtd->params->flag == 1)) + { + ret = rk29_dma_config(prtd->params->channel, + prtd->params->dma_size, 16); + prtd->params->flag = 0; + DBG("size = 16, channel = %d, flag = %d\n",prtd->params->channel,prtd->params->flag); + } + else if((len%(prtd->params->dma_size*16) != 0) && (prtd->params->flag == 0)) + { + ret = rk29_dma_config(prtd->params->channel, + prtd->params->dma_size, 1); + prtd->params->flag = 1; + DBG("size = 1, channel = %d, flag = %d\n",prtd->params->channel,prtd->params->flag); + } + + //ret = rockchip_dma_buffer_set_enqueue(prtd, pos, len); ret = rk29_dma_enqueue(prtd->params->channel, substream, pos, len); @@ -403,7 +420,7 @@ static int rockchip_pcm_prepare(struct snd_pcm_substream *substream) } DBG("Enter::%s, %d, ret=%d, Channel=%d, Addr=0x%X\n", __FUNCTION__, __LINE__, ret, prtd->params->channel, prtd->params->dma_addr); ret = rk29_dma_config(prtd->params->channel, - prtd->params->dma_size, 1); + prtd->params->dma_size, 16); DBG("Enter:%s, %d, ret = %d, Channel=%d, Size=%d\n", __FUNCTION__, __LINE__, ret, prtd->params->channel, diff --git a/sound/soc/rk29/rk29_pcm.h b/sound/soc/rk29/rk29_pcm.h index 58710e1ca6a4..96d774c5a626 100755 --- a/sound/soc/rk29/rk29_pcm.h +++ b/sound/soc/rk29/rk29_pcm.h @@ -26,7 +26,8 @@ struct rockchip_pcm_dma_params { struct rockchip_dma_client *client; /* stream identifier */ int channel; /* Channel ID */ dma_addr_t dma_addr; - int dma_size; /* Size of the DMA transfer */ + int dma_size; /* Size of the DMA transfer */ + int flag; /*burst change flag*/ }; extern struct snd_soc_platform rk29_soc_platform; From c8a6f5f07365d323e6c9f6763b569132c6763046 Mon Sep 17 00:00:00 2001 From: lyx Date: Thu, 1 Sep 2011 00:38:17 -0700 Subject: [PATCH 062/150] gsensor,gyroscope: add gsensor lis3dh and gyroscope k3g drivers --- drivers/input/Kconfig | 2 + drivers/input/Makefile | 1 + drivers/input/gsensor/Kconfig | 8 + drivers/input/gsensor/Makefile | 1 + drivers/input/gsensor/lis3dh_acc_misc.c | 1505 +++++++++++++++++++++++ drivers/input/gsensor/lis3dh_acc_misc.h | 137 +++ drivers/input/gyroscope/Kconfig | 22 + drivers/input/gyroscope/Makefile | 4 + drivers/input/gyroscope/k3g.c | 703 +++++++++++ 9 files changed, 2383 insertions(+) create mode 100755 drivers/input/gsensor/lis3dh_acc_misc.c create mode 100755 drivers/input/gsensor/lis3dh_acc_misc.h create mode 100755 drivers/input/gyroscope/Kconfig create mode 100755 drivers/input/gyroscope/Makefile create mode 100755 drivers/input/gyroscope/k3g.c diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig index 85b41ff032d7..feac5b7ed311 100755 --- a/drivers/input/Kconfig +++ b/drivers/input/Kconfig @@ -185,6 +185,8 @@ source "drivers/input/magnetometer/Kconfig" source "drivers/input/gsensor/Kconfig" +source "drivers/input/gyroscope/Kconfig" + source "drivers/input/jogball/Kconfig" source "drivers/input/lightsensor/Kconfig" diff --git a/drivers/input/Makefile b/drivers/input/Makefile index f9357d4c0bc7..124cd3de8fdd 100755 --- a/drivers/input/Makefile +++ b/drivers/input/Makefile @@ -22,6 +22,7 @@ obj-$(CONFIG_INPUT_TABLET) += tablet/ obj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/ obj-$(CONFIG_INPUT_MISC) += misc/ obj-$(CONFIG_G_SENSOR_DEVICE) += gsensor/ +obj-$(CONFIG_GYRO_SENSOR_DEVICE) += gyroscope/ obj-$(CONFIG_INPUT_JOGBALL) += jogball/ obj-$(CONFIG_INPUT_APMPOWER) += apm-power.o diff --git a/drivers/input/gsensor/Kconfig b/drivers/input/gsensor/Kconfig index c917cf3a7485..efb19a016b38 100755 --- a/drivers/input/gsensor/Kconfig +++ b/drivers/input/gsensor/Kconfig @@ -37,6 +37,14 @@ config GS_KXTF9 This driver can also be built as a module. If so, the module will be called kxtf9. +config GS_LIS3DH + bool "gs_lis3dh" + depends on G_SENSOR_DEVICE + default n + help + To have support for your specific gsesnor you will have to + select the proper drivers which depend on this option. + config GS_L3G4200D bool "gs_l3g4200d" depends on G_SENSOR_DEVICE diff --git a/drivers/input/gsensor/Makefile b/drivers/input/gsensor/Makefile index b312821ac104..2f7f9c0ad14c 100755 --- a/drivers/input/gsensor/Makefile +++ b/drivers/input/gsensor/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_GS_MMA7660) += mma7660.o obj-$(CONFIG_GS_MMA8452) += mma8452.o obj-$(CONFIG_GS_L3G4200D) += l3g4200d.o obj-$(CONFIG_GS_KXTF9) += kxtf9.o +obj-$(CONFIG_GS_LIS3DH) += lis3dh_acc_misc.o \ No newline at end of file diff --git a/drivers/input/gsensor/lis3dh_acc_misc.c b/drivers/input/gsensor/lis3dh_acc_misc.c new file mode 100755 index 000000000000..9805ceb807eb --- /dev/null +++ b/drivers/input/gsensor/lis3dh_acc_misc.c @@ -0,0 +1,1505 @@ +/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** + * + * File Name : lis3dh_acc.c + * Authors : MSH - Motion Mems BU - Application Team + * : Carmine Iascone (carmine.iascone@st.com) + * : Matteo Dameno (matteo.dameno@st.com) + * Version : V.1.0.5 + * Date : 16/08/2010 + * Description : LIS3DH accelerometer sensor API + * + ******************************************************************************* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE + * PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT. + * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, + * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE + * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING + * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS. + * + ****************************************************************************** + Revision 1.0.0 05/11/09 + First Release + Revision 1.0.3 22/01/2010 + Linux K&R Compliant Release; + Revision 1.0.5 16/08/2010 + modified _get_acceleration_data function + modified _update_odr function + manages 2 interrupts + + ******************************************************************************/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +//#include +#include "lis3dh_acc_misc.h" + + +#define DEBUG 1 + +#define INTERRUPT_MANAGEMENT 1 + +#define G_MAX 16000 /** Maximum polled-device-reported g value */ + +/* +#define SHIFT_ADJ_2G 4 +#define SHIFT_ADJ_4G 3 +#define SHIFT_ADJ_8G 2 +#define SHIFT_ADJ_16G 1 +*/ + +#define SENSITIVITY_2G 1 /** mg/LSB */ +#define SENSITIVITY_4G 2 /** mg/LSB */ +#define SENSITIVITY_8G 4 /** mg/LSB */ +#define SENSITIVITY_16G 12 /** mg/LSB */ + + +#define HIGH_RESOLUTION 0x08 + +#define AXISDATA_REG 0x28 +#define WHOAMI_LIS3DH_ACC 0x33 /* Expctd content for WAI */ + +/* CONTROL REGISTERS */ +#define WHO_AM_I 0x0F /* WhoAmI register */ +#define TEMP_CFG_REG 0x1F /* temper sens control reg */ +/* ctrl 1: ODR3 ODR2 ODR ODR0 LPen Zenable Yenable Zenable */ +#define CTRL_REG1 0x20 /* control reg 1 */ +#define CTRL_REG2 0x21 /* control reg 2 */ +#define CTRL_REG3 0x22 /* control reg 3 */ +#define CTRL_REG4 0x23 /* control reg 4 */ +#define CTRL_REG5 0x24 /* control reg 5 */ +#define CTRL_REG6 0x25 /* control reg 6 */ + +#define FIFO_CTRL_REG 0x2E /* FiFo control reg */ + +#define INT_CFG1 0x30 /* interrupt 1 config */ +#define INT_SRC1 0x31 /* interrupt 1 source */ +#define INT_THS1 0x32 /* interrupt 1 threshold */ +#define INT_DUR1 0x33 /* interrupt 1 duration */ + +#define INT_CFG2 0x34 /* interrupt 2 config */ +#define INT_SRC2 0x35 /* interrupt 2 source */ +#define INT_THS2 0x36 /* interrupt 2 threshold */ +#define INT_DUR2 0x37 /* interrupt 2 duration */ + +#define TT_CFG 0x38 /* tap config */ +#define TT_SRC 0x39 /* tap source */ +#define TT_THS 0x3A /* tap threshold */ +#define TT_LIM 0x3B /* tap time limit */ +#define TT_TLAT 0x3C /* tap time latency */ +#define TT_TW 0x3D /* tap time window */ +/* end CONTROL REGISTRES */ + + +#define ENABLE_HIGH_RESOLUTION 1 + +#define LIS3DH_ACC_PM_OFF 0x00 +#define LIS3DH_ACC_ENABLE_ALL_AXES 0x07 + +#define PMODE_MASK 0x08 +#define ODR_MASK 0XF0 + +#define ODR1 0x10 /* 1Hz output data rate */ +#define ODR10 0x20 /* 10Hz output data rate */ +#define ODR25 0x30 /* 25Hz output data rate */ +#define ODR50 0x40 /* 50Hz output data rate */ +#define ODR100 0x50 /* 100Hz output data rate */ +#define ODR200 0x60 /* 200Hz output data rate */ +#define ODR400 0x70 /* 400Hz output data rate */ +#define ODR1250 0x90 /* 1250Hz output data rate */ + + + +#define IA 0x40 +#define ZH 0x20 +#define ZL 0x10 +#define YH 0x08 +#define YL 0x04 +#define XH 0x02 +#define XL 0x01 +/* */ +/* CTRL REG BITS*/ +#define CTRL_REG3_I1_AOI1 0x40 +#define CTRL_REG6_I2_TAPEN 0x80 +#define CTRL_REG6_HLACTIVE 0x02 +/* */ + +/* TAP_SOURCE_REG BIT */ +#define DTAP 0x20 +#define STAP 0x10 +#define SIGNTAP 0x08 +#define ZTAP 0x04 +#define YTAP 0x02 +#define XTAZ 0x01 + + +#define FUZZ 32 +#define FLAT 32 +#define I2C_RETRY_DELAY 5 +#define I2C_RETRIES 5 +#define I2C_AUTO_INCREMENT 0x80 + +/* RESUME STATE INDICES */ +#define RES_CTRL_REG1 0 +#define RES_CTRL_REG2 1 +#define RES_CTRL_REG3 2 +#define RES_CTRL_REG4 3 +#define RES_CTRL_REG5 4 +#define RES_CTRL_REG6 5 + +#define RES_INT_CFG1 6 +#define RES_INT_THS1 7 +#define RES_INT_DUR1 8 +#define RES_INT_CFG2 9 +#define RES_INT_THS2 10 +#define RES_INT_DUR2 11 + +#define RES_TT_CFG 12 +#define RES_TT_THS 13 +#define RES_TT_LIM 14 +#define RES_TT_TLAT 15 +#define RES_TT_TW 16 + +#define RES_TEMP_CFG_REG 17 +#define RES_REFERENCE_REG 18 +#define RES_FIFO_CTRL_REG 19 + +#define RESUME_ENTRIES 20 +/* end RESUME STATE INDICES */ + +struct { + unsigned int cutoff_ms; + unsigned int mask; +} lis3dh_acc_odr_table[] = { + { 1, ODR1250 }, + { 3, ODR400 }, + { 5, ODR200 }, + { 10, ODR100 }, + { 20, ODR50 }, + { 40, ODR25 }, + { 100, ODR10 }, + { 1000, ODR1 }, +}; + +struct lis3dh_acc_data { + struct i2c_client *client; + struct lis3dh_acc_platform_data *pdata; + + struct mutex lock; + struct delayed_work input_work; + + struct input_dev *input_dev; + + int hw_initialized; + /* hw_working=-1 means not tested yet */ + int hw_working; + atomic_t enabled; + int on_before_suspend; + + u8 sensitivity; + + u8 resume_state[RESUME_ENTRIES]; + + int irq1; + struct work_struct irq1_work; + struct workqueue_struct *irq1_work_queue; + int irq2; + struct work_struct irq2_work; + struct workqueue_struct *irq2_work_queue; +}; + +/* + * Because misc devices can not carry a pointer from driver register to + * open, we keep this global. This limits the driver to a single instance. + */ +struct lis3dh_acc_data *lis3dh_acc_misc_data; + +static int lis3dh_acc_i2c_read(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { + { + .addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = 1, + .buf = buf, }, + { + .addr = acc->client->addr, + .flags = (acc->client->flags & I2C_M_TEN) | I2C_M_RD, + .len = len, + .buf = buf, }, + }; + + do { + err = i2c_transfer(acc->client->adapter, msgs, 2); + if (err != 2) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != 2) && (++tries < I2C_RETRIES)); + + if (err != 2) { + dev_err(&acc->client->dev, "read transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + +static int lis3dh_acc_i2c_write(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { { .addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = len + 1, .buf = buf, }, }; + do { + err = i2c_transfer(acc->client->adapter, msgs, 1); + if (err != 1) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != 1) && (++tries < I2C_RETRIES)); + + if (err != 1) { + dev_err(&acc->client->dev, "write transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + +static int lis3dh_acc_hw_init(struct lis3dh_acc_data *acc) +{ + int err = -1; + u8 buf[7]; + + printk(KERN_INFO "%s: hw init start\n", LIS3DH_ACC_DEV_NAME); + + buf[0] = WHO_AM_I; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error_firstread; + else + acc->hw_working = 1; + if (buf[0] != WHOAMI_LIS3DH_ACC) { + err = -1; /* choose the right coded error */ + goto error_unknown_device; + } + + buf[0] = CTRL_REG1; + buf[1] = acc->resume_state[RES_CTRL_REG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = TEMP_CFG_REG; + buf[1] = acc->resume_state[RES_TEMP_CFG_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = FIFO_CTRL_REG; + buf[1] = acc->resume_state[RES_FIFO_CTRL_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | TT_THS); + buf[1] = acc->resume_state[RES_TT_THS]; + buf[2] = acc->resume_state[RES_TT_LIM]; + buf[3] = acc->resume_state[RES_TT_TLAT]; + buf[4] = acc->resume_state[RES_TT_TW]; + err = lis3dh_acc_i2c_write(acc, buf, 4); + if (err < 0) + goto error1; + buf[0] = TT_CFG; + buf[1] = acc->resume_state[RES_TT_CFG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS1); + buf[1] = acc->resume_state[RES_INT_THS1]; + buf[2] = acc->resume_state[RES_INT_DUR1]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG1; + buf[1] = acc->resume_state[RES_INT_CFG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS2); + buf[1] = acc->resume_state[RES_INT_THS2]; + buf[2] = acc->resume_state[RES_INT_DUR2]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG2; + buf[1] = acc->resume_state[RES_INT_CFG2]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | CTRL_REG2); + buf[1] = acc->resume_state[RES_CTRL_REG2]; + buf[2] = acc->resume_state[RES_CTRL_REG3]; + buf[3] = acc->resume_state[RES_CTRL_REG4]; + buf[4] = acc->resume_state[RES_CTRL_REG5]; + buf[5] = acc->resume_state[RES_CTRL_REG6]; + err = lis3dh_acc_i2c_write(acc, buf, 5); + if (err < 0) + goto error1; + + acc->hw_initialized = 1; + printk(KERN_INFO "%s: hw init done\n", LIS3DH_ACC_DEV_NAME); + return 0; + +error_firstread: + acc->hw_working = 0; + dev_warn(&acc->client->dev, "Error reading WHO_AM_I: is device " + "available/working?\n"); + goto error1; +error_unknown_device: + dev_err(&acc->client->dev, + "device unknown. Expected: 0x%x," + " Replies: 0x%x\n", WHOAMI_LIS3DH_ACC, buf[0]); +error1: + acc->hw_initialized = 0; + dev_err(&acc->client->dev, "hw init error 0x%x,0x%x: %d\n", buf[0], + buf[1], err); + return err; +} + +static void lis3dh_acc_device_power_off(struct lis3dh_acc_data *acc) +{ + int err; + u8 buf[2] = { CTRL_REG1, LIS3DH_ACC_PM_OFF }; + + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + dev_err(&acc->client->dev, "soft power off failed: %d\n", err); + + if (acc->pdata->power_off) { + disable_irq_nosync(acc->irq1); + disable_irq_nosync(acc->irq2); + acc->pdata->power_off(); + acc->hw_initialized = 0; + } + if (acc->hw_initialized) { + disable_irq_nosync(acc->irq1); + disable_irq_nosync(acc->irq2); + acc->hw_initialized = 0; + } + +} + +static int lis3dh_acc_device_power_on(struct lis3dh_acc_data *acc) +{ + int err = -1; + + if (acc->pdata->power_on) { + err = acc->pdata->power_on(); + if (err < 0) { + dev_err(&acc->client->dev, + "power_on failed: %d\n", err); + return err; + } + enable_irq(acc->irq1); + enable_irq(acc->irq2); + } + + if (!acc->hw_initialized) { + err = lis3dh_acc_hw_init(acc); + if (acc->hw_working == 1 && err < 0) { + lis3dh_acc_device_power_off(acc); + return err; + } + } + + if (acc->hw_initialized) { + enable_irq(acc->irq1); + enable_irq(acc->irq2); + printk(KERN_INFO "%s: power on: irq enabled\n", + LIS3DH_ACC_DEV_NAME); + } + return 0; +} + +static irqreturn_t lis3dh_acc_isr1(int irq, void *dev) +{ + struct lis3dh_acc_data *acc = dev; + + disable_irq_nosync(irq); + queue_work(acc->irq1_work_queue, &acc->irq1_work); + printk(KERN_INFO "%s: isr1 queued\n", LIS3DH_ACC_DEV_NAME); + + return IRQ_HANDLED; +} + +static irqreturn_t lis3dh_acc_isr2(int irq, void *dev) +{ + struct lis3dh_acc_data *acc = dev; + + disable_irq_nosync(irq); + queue_work(acc->irq2_work_queue, &acc->irq2_work); + printk(KERN_INFO "%s: isr2 queued\n", LIS3DH_ACC_DEV_NAME); + + return IRQ_HANDLED; +} + + + +static void lis3dh_acc_irq1_work_func(struct work_struct *work) +{ + + struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq1_work); + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_int1_source(acc); */ + ; + /* */ + printk(KERN_INFO "%s: IRQ1 triggered\n", LIS3DH_ACC_DEV_NAME); +exit: + enable_irq(acc->irq1); +} + +static void lis3dh_acc_irq2_work_func(struct work_struct *work) +{ + + struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq2_work); + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_tap_source(acc); */ + ; + /* */ + + printk(KERN_INFO "%s: IRQ2 triggered\n", LIS3DH_ACC_DEV_NAME); +exit: + enable_irq(acc->irq2); +} + +int lis3dh_acc_update_g_range(struct lis3dh_acc_data *acc, u8 new_g_range) +{ + int err; + + u8 sensitivity; + u8 buf[2]; + u8 updated_val; + u8 init_val; + u8 new_val; + u8 mask = LIS3DH_ACC_FS_MASK | HIGH_RESOLUTION; + + switch (new_g_range) { + case LIS3DH_ACC_G_2G: + + sensitivity = SENSITIVITY_2G; + break; + case LIS3DH_ACC_G_4G: + + sensitivity = SENSITIVITY_4G; + break; + case LIS3DH_ACC_G_8G: + + sensitivity = SENSITIVITY_8G; + break; + case LIS3DH_ACC_G_16G: + + sensitivity = SENSITIVITY_16G; + break; + default: + dev_err(&acc->client->dev, "invalid g range requested: %u\n", + new_g_range); + return -EINVAL; + } + + if (atomic_read(&acc->enabled)) { + /* Set configuration register 4, which contains g range setting + * NOTE: this is a straight overwrite because this driver does + * not use any of the other configuration bits in this + * register. Should this become untrue, we will have to read + * out the value and only change the relevant bits --XX---- + * (marked by X) */ + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error; + init_val = buf[0]; + acc->resume_state[RES_CTRL_REG4] = init_val; + new_val = new_g_range | HIGH_RESOLUTION; + updated_val = ((mask & new_val) | ((~mask) & init_val)); + buf[1] = updated_val; + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG4] = updated_val; + acc->sensitivity = sensitivity; + } + + + return 0; +error: + dev_err(&acc->client->dev, "update g range failed 0x%x,0x%x: %d\n", + buf[0], buf[1], err); + + return err; +} + +int lis3dh_acc_update_odr(struct lis3dh_acc_data *acc, int poll_interval_ms) +{ + int err = -1; + int i; + u8 config[2]; + + /* Convert the poll interval into an output data rate configuration + * that is as low as possible. The ordering of these checks must be + * maintained due to the cascading cut off values - poll intervals are + * checked from shortest to longest. At each check, if the next lower + * ODR cannot support the current poll interval, we stop searching */ + for (i = ARRAY_SIZE(lis3dh_acc_odr_table) - 1; i >= 0; i--) { + if (lis3dh_acc_odr_table[i].cutoff_ms <= poll_interval_ms) + break; + } + config[1] = lis3dh_acc_odr_table[i].mask; + + config[1] |= LIS3DH_ACC_ENABLE_ALL_AXES; + + /* If device is currently enabled, we need to write new + * configuration out to it */ + if (atomic_read(&acc->enabled)) { + config[0] = CTRL_REG1; + err = lis3dh_acc_i2c_write(acc, config, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG1] = config[1]; + } + + return 0; + +error: + dev_err(&acc->client->dev, "update odr failed 0x%x,0x%x: %d\n", + config[0], config[1], err); + + return err; +} + +/* */ + +static int lis3dh_acc_register_write(struct lis3dh_acc_data *acc, u8 *buf, + u8 reg_address, u8 new_value) +{ + int err = -1; + + if (atomic_read(&acc->enabled)) { + /* Sets configuration register at reg_address + * NOTE: this is a straight overwrite */ + buf[0] = reg_address; + buf[1] = new_value; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + return err; + } + return err; +} + +static int lis3dh_acc_register_read(struct lis3dh_acc_data *acc, u8 *buf, + u8 reg_address) +{ + + int err = -1; + buf[0] = (reg_address); + err = lis3dh_acc_i2c_read(acc, buf, 1); + return err; +} + +static int lis3dh_acc_register_update(struct lis3dh_acc_data *acc, u8 *buf, + u8 reg_address, u8 mask, u8 new_bit_values) +{ + int err = -1; + u8 init_val; + u8 updated_val; + err = lis3dh_acc_register_read(acc, buf, reg_address); + if (!(err < 0)) { + init_val = buf[1]; + updated_val = ((mask & new_bit_values) | ((~mask) & init_val)); + err = lis3dh_acc_register_write(acc, buf, reg_address, + updated_val); + } + return err; +} + +/* */ + +static int lis3dh_acc_get_acceleration_data(struct lis3dh_acc_data *acc, + int *xyz) +{ + int err = -1; + /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + u8 acc_data[6]; + /* x,y,z hardware data */ + s16 hw_d[3] = { 0 }; + + acc_data[0] = (I2C_AUTO_INCREMENT | AXISDATA_REG); + err = lis3dh_acc_i2c_read(acc, acc_data, 6); + if (err < 0) + return err; + + hw_d[0] = (((s16) ((acc_data[1] << 8) | acc_data[0])) >> 4); + hw_d[1] = (((s16) ((acc_data[3] << 8) | acc_data[2])) >> 4); + hw_d[2] = (((s16) ((acc_data[5] << 8) | acc_data[4])) >> 4); + + hw_d[0] = hw_d[0] * acc->sensitivity; + hw_d[1] = hw_d[1] * acc->sensitivity; + hw_d[2] = hw_d[2] * acc->sensitivity; + + + xyz[0] = ((acc->pdata->negate_x) ? (-hw_d[acc->pdata->axis_map_x]) + : (hw_d[acc->pdata->axis_map_x])); + xyz[1] = ((acc->pdata->negate_y) ? (-hw_d[acc->pdata->axis_map_y]) + : (hw_d[acc->pdata->axis_map_y])); + xyz[2] = ((acc->pdata->negate_z) ? (-hw_d[acc->pdata->axis_map_z]) + : (hw_d[acc->pdata->axis_map_z])); + + #ifdef DEBUG + /* + printk(KERN_INFO "%s read x=%d, y=%d, z=%d\n", + LIS3DH_ACC_DEV_NAME, xyz[0], xyz[1], xyz[2]); + */ + #endif + return err; +} + +static void lis3dh_acc_report_values(struct lis3dh_acc_data *acc, int *xyz) +{ + input_report_abs(acc->input_dev, ABS_X, xyz[0]); + input_report_abs(acc->input_dev, ABS_Y, xyz[1]); + input_report_abs(acc->input_dev, ABS_Z, xyz[2]); + input_sync(acc->input_dev); +} + +static int lis3dh_acc_enable(struct lis3dh_acc_data *acc) +{ + int err; + + if (!atomic_cmpxchg(&acc->enabled, 0, 1)) { + err = lis3dh_acc_device_power_on(acc); + if (err < 0) { + atomic_set(&acc->enabled, 0); + return err; + } + schedule_delayed_work(&acc->input_work, msecs_to_jiffies( + acc->pdata->poll_interval)); + } + + return 0; +} + +static int lis3dh_acc_disable(struct lis3dh_acc_data *acc) +{ + if (atomic_cmpxchg(&acc->enabled, 1, 0)) { + cancel_delayed_work_sync(&acc->input_work); + lis3dh_acc_device_power_off(acc); + } + + return 0; +} + +static int lis3dh_acc_misc_open(struct inode *inode, struct file *file) +{ + int err; + err = nonseekable_open(inode, file); + if (err < 0) + return err; + + file->private_data = lis3dh_acc_misc_data; + + return 0; +} + +static int lis3dh_acc_misc_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + void __user *argp = (void __user *)arg; + u8 buf[4]; + u8 mask; + u8 reg_address; + u8 bit_values; + int err; + int interval; + struct lis3dh_acc_data *acc = file->private_data; + + printk(KERN_INFO "%s: %s call with cmd 0x%x and arg 0x%x\n", + LIS3DH_ACC_DEV_NAME, __func__, cmd, (unsigned int)arg); + + switch (cmd) { + case LIS3DH_ACC_IOCTL_GET_DELAY: + interval = acc->pdata->poll_interval; + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EFAULT; + break; + + case LIS3DH_ACC_IOCTL_SET_DELAY: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval < 0 || interval > 1000) + return -EINVAL; + + acc->pdata->poll_interval = max(interval, + acc->pdata->min_interval); + err = lis3dh_acc_update_odr(acc, acc->pdata->poll_interval); + /* TODO: if update fails poll is still set */ + if (err < 0) + return err; + break; + + case LIS3DH_ACC_IOCTL_SET_ENABLE: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval > 1) + return -EINVAL; + if (interval) + err = lis3dh_acc_enable(acc); + else + err = lis3dh_acc_disable(acc); + return err; + break; + + case LIS3DH_ACC_IOCTL_GET_ENABLE: + interval = atomic_read(&acc->enabled); + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_G_RANGE: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + bit_values = buf[0]; + err = lis3dh_acc_update_g_range(acc, bit_values); + if (err < 0) + return err; + break; + +#ifdef INTERRUPT_MANAGEMENT + case LIS3DH_ACC_IOCTL_SET_CTRL_REG3: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG3; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG3] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_CTRL_REG3])); + break; + + case LIS3DH_ACC_IOCTL_SET_CTRL_REG6: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG6; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG6] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_CTRL_REG6])); + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR1] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_INT_DUR1])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS1] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_INT_THS1])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG1: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG1; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG1] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_INT_CFG1])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE1: + err = lis3dh_acc_register_read(acc, buf, INT_SRC1); + if (err < 0) + return err; +#if DEBUG + printk(KERN_ALERT "INT1_SRC content: %d , 0x%x\n", + buf[0], buf[0]); +#endif + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR2] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_INT_DUR2])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS2] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_INT_THS2])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG2: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG2; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG2] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_INT_CFG2])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE2: + err = lis3dh_acc_register_read(acc, buf, INT_SRC2); + if (err < 0) + return err; +#if DEBUG + printk(KERN_ALERT "INT2_SRC content: %d , 0x%x\n", + buf[0], buf[0]); +#endif + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_GET_TAP_SOURCE: + err = lis3dh_acc_register_read(acc, buf, TT_SRC); + if (err < 0) + return err; +#if DEBUG + printk(KERN_ALERT "TT_SRC content: %d , 0x%x\n", + buf[0], buf[0]); +#endif + if (copy_to_user(argp, buf, 1)) { + printk(KERN_ERR "%s: %s error in copy_to_user \n", + LIS3DH_ACC_DEV_NAME, __func__); + return -EINVAL; + } + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_CFG: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_CFG; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_CFG] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_TT_CFG])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLIM: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_LIM; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_LIM] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_TT_LIM])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_THS: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_THS; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_THS] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_TT_THS])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLAT: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TLAT; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TLAT] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_TT_TLAT])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TW: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TW; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TW] = ((mask & bit_values) | + ( ~mask & acc->resume_state[RES_TT_TW])); + break; + +#endif /* INTERRUPT_MANAGEMENT */ + + default: + return -EINVAL; + } + + return 0; +} + +static const struct file_operations lis3dh_acc_misc_fops = { + .owner = THIS_MODULE, + .open = lis3dh_acc_misc_open, + .ioctl = lis3dh_acc_misc_ioctl, +}; + +static struct miscdevice lis3dh_acc_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = LIS3DH_ACC_DEV_NAME, + .fops = &lis3dh_acc_misc_fops, +}; + +static void lis3dh_acc_input_work_func(struct work_struct *work) +{ + struct lis3dh_acc_data *acc; + + int xyz[3] = { 0 }; + int err; + + acc = container_of((struct delayed_work *)work, + struct lis3dh_acc_data, input_work); + + mutex_lock(&acc->lock); + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + dev_err(&acc->client->dev, "get_acceleration_data failed\n"); + else + lis3dh_acc_report_values(acc, xyz); + + schedule_delayed_work(&acc->input_work, msecs_to_jiffies( + acc->pdata->poll_interval)); + mutex_unlock(&acc->lock); +} + +#ifdef LIS3DH_OPEN_ENABLE +int lis3dh_acc_input_open(struct input_dev *input) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(input); + + return lis3dh_acc_enable(acc); +} + +void lis3dh_acc_input_close(struct input_dev *dev) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(dev); + + lis3dh_acc_disable(acc); +} +#endif + +static int lis3dh_acc_validate_pdata(struct lis3dh_acc_data *acc) +{ + acc->pdata->poll_interval = max(acc->pdata->poll_interval, + acc->pdata->min_interval); + + if (acc->pdata->axis_map_x > 2 || acc->pdata->axis_map_y > 2 + || acc->pdata->axis_map_z > 2) { + dev_err(&acc->client->dev, "invalid axis_map value " + "x:%u y:%u z%u\n", acc->pdata->axis_map_x, + acc->pdata->axis_map_y, acc->pdata->axis_map_z); + return -EINVAL; + } + + /* Only allow 0 and 1 for negation boolean flag */ + if (acc->pdata->negate_x > 1 || acc->pdata->negate_y > 1 + || acc->pdata->negate_z > 1) { + dev_err(&acc->client->dev, "invalid negate value " + "x:%u y:%u z:%u\n", acc->pdata->negate_x, + acc->pdata->negate_y, acc->pdata->negate_z); + return -EINVAL; + } + + /* Enforce minimum polling interval */ + if (acc->pdata->poll_interval < acc->pdata->min_interval) { + dev_err(&acc->client->dev, "minimum poll interval violated\n"); + return -EINVAL; + } + + return 0; +} + +static int lis3dh_acc_input_init(struct lis3dh_acc_data *acc) +{ + int err; + + INIT_DELAYED_WORK(&acc->input_work, lis3dh_acc_input_work_func); + acc->input_dev = input_allocate_device(); + if (!acc->input_dev) { + err = -ENOMEM; + dev_err(&acc->client->dev, "input device allocate failed\n"); + goto err0; + } + +#ifdef LIS3DH_ACC_OPEN_ENABLE + acc->input_dev->open = lis3dh_acc_input_open; + acc->input_dev->close = lis3dh_acc_input_close; +#endif + + input_set_drvdata(acc->input_dev, acc); + + set_bit(EV_ABS, acc->input_dev->evbit); + /* next is used for interruptA sources data if the case */ + set_bit(ABS_MISC, acc->input_dev->absbit); + /* next is used for interruptB sources data if the case */ + set_bit(ABS_WHEEL, acc->input_dev->absbit); + + input_set_abs_params(acc->input_dev, ABS_X, -G_MAX, G_MAX, FUZZ, FLAT); + input_set_abs_params(acc->input_dev, ABS_Y, -G_MAX, G_MAX, FUZZ, FLAT); + input_set_abs_params(acc->input_dev, ABS_Z, -G_MAX, G_MAX, FUZZ, FLAT); + /* next is used for interruptA sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_MISC, INT_MIN, INT_MAX, 0, 0); + /* next is used for interruptB sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_WHEEL, INT_MIN, INT_MAX, 0, 0); + + acc->input_dev->name = "accelerometer"; + + err = input_register_device(acc->input_dev); + if (err) { + dev_err(&acc->client->dev, + "unable to register input polled device %s\n", + acc->input_dev->name); + goto err1; + } + + return 0; + +err1: + input_free_device(acc->input_dev); +err0: + return err; +} + +static void lis3dh_acc_input_cleanup(struct lis3dh_acc_data *acc) +{ + input_unregister_device(acc->input_dev); + input_free_device(acc->input_dev); +} + +static int lis3dh_acc_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + + struct lis3dh_acc_data *acc; + + int err = -1; + int tempvalue; + + pr_info("%s: probe start.\n", LIS3DH_ACC_DEV_NAME); + + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "platform data is NULL. exiting.\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "client not i2c capable\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) { + dev_err(&client->dev, "client not smb-i2c capable:2\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_I2C_BLOCK)){ + dev_err(&client->dev, "client not smb-i2c capable:3\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + /* + * OK. From now, we presume we have a valid client. We now create the + * client structure, even though we cannot fill it completely yet. + */ + + acc = kzalloc(sizeof(struct lis3dh_acc_data), GFP_KERNEL); + if (acc == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for module data: " + "%d\n", err); + goto exit_alloc_data_failed; + } + + mutex_init(&acc->lock); + mutex_lock(&acc->lock); + + acc->client = client; + i2c_set_clientdata(client, acc); + + + INIT_WORK(&acc->irq1_work, lis3dh_acc_irq1_work_func); + acc->irq1_work_queue = create_singlethread_workqueue("lis3dh_acc_wq1"); + if (!acc->irq1_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue1: %d\n", err); + goto err_mutexunlockfreedata; + } + + INIT_WORK(&acc->irq2_work, lis3dh_acc_irq2_work_func); + acc->irq2_work_queue = create_singlethread_workqueue("lis3dh_acc_wq2"); + if (!acc->irq2_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue2: %d\n", err); + goto err_destoyworkqueue1; + } + + + + if (i2c_smbus_read_byte(client) < 0) { + printk(KERN_ERR "i2c_smbus_read_byte error!!\n"); + goto err_destoyworkqueue2; + } else { + printk(KERN_INFO "%s Device detected!\n", LIS3DH_ACC_DEV_NAME); + } + + /* read chip id */ + + tempvalue = i2c_smbus_read_word_data(client, WHO_AM_I); + if ((tempvalue & 0x00FF) == WHOAMI_LIS3DH_ACC) { + printk(KERN_INFO "%s I2C driver registered!\n", + LIS3DH_ACC_DEV_NAME); + } else { + acc->client = NULL; + printk(KERN_INFO "I2C driver not registered!" + " Device unknown\n"); + goto err_destoyworkqueue2; + } + + acc->pdata = kmalloc(sizeof(*acc->pdata), GFP_KERNEL); + if (acc->pdata == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for pdata: %d\n", + err); + goto err_destoyworkqueue2; + } + + memcpy(acc->pdata, client->dev.platform_data, sizeof(*acc->pdata)); + + err = lis3dh_acc_validate_pdata(acc); + if (err < 0) { + dev_err(&client->dev, "failed to validate platform data\n"); + goto exit_kfree_pdata; + } + + i2c_set_clientdata(client, acc); + + + if (acc->pdata->init) { + err = acc->pdata->init(); + if (err < 0) { + dev_err(&client->dev, "init failed: %d\n", err); + goto err2; + } + } + + memset(acc->resume_state, 0, ARRAY_SIZE(acc->resume_state)); + + acc->irq1 = gpio_to_irq(acc->pdata->gpio_int1); + printk(KERN_INFO "%s: %s has set irq1 to irq: %d mapped on gpio:%d\n", + LIS3DH_ACC_DEV_NAME, __func__, acc->irq1, + acc->pdata->gpio_int1); + acc->irq2 = gpio_to_irq(acc->pdata->gpio_int2); + printk(KERN_INFO "%s: %s has set irq2 to irq: %d mapped on gpio:%d\n", + LIS3DH_ACC_DEV_NAME, __func__, acc->irq2, + acc->pdata->gpio_int2); + + + + + acc->resume_state[RES_CTRL_REG1] = LIS3DH_ACC_ENABLE_ALL_AXES; + acc->resume_state[RES_CTRL_REG2] = 0x00; + acc->resume_state[RES_CTRL_REG3] = 0x00; + acc->resume_state[RES_CTRL_REG4] = 0x00; + acc->resume_state[RES_CTRL_REG5] = 0x00; + acc->resume_state[RES_CTRL_REG6] = 0x00; + + acc->resume_state[RES_TEMP_CFG_REG] = 0x00; + acc->resume_state[RES_FIFO_CTRL_REG] = 0x00; + acc->resume_state[RES_INT_CFG1] = 0x00; + acc->resume_state[RES_INT_THS1] = 0x00; + acc->resume_state[RES_INT_DUR1] = 0x00; + acc->resume_state[RES_INT_CFG2] = 0x00; + acc->resume_state[RES_INT_THS2] = 0x00; + acc->resume_state[RES_INT_DUR2] = 0x00; + + acc->resume_state[RES_TT_CFG] = 0x00; + acc->resume_state[RES_TT_THS] = 0x00; + acc->resume_state[RES_TT_LIM] = 0x00; + acc->resume_state[RES_TT_TLAT] = 0x00; + acc->resume_state[RES_TT_TW] = 0x00; + + err = lis3dh_acc_device_power_on(acc); + if (err < 0) { + dev_err(&client->dev, "power on failed: %d\n", err); + goto err2; + } + + atomic_set(&acc->enabled, 1); + + err = lis3dh_acc_update_g_range(acc, acc->pdata->g_range); + if (err < 0) { + dev_err(&client->dev, "update_g_range failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_update_odr(acc, acc->pdata->poll_interval); + if (err < 0) { + dev_err(&client->dev, "update_odr failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_input_init(acc); + if (err < 0) { + dev_err(&client->dev, "input init failed\n"); + goto err_power_off; + } + lis3dh_acc_misc_data = acc; + + err = misc_register(&lis3dh_acc_misc_device); + if (err < 0) { + dev_err(&client->dev, + "misc LIS3DH_ACC_DEV_NAME register failed\n"); + goto err_input_cleanup; + } + + lis3dh_acc_device_power_off(acc); + + /* As default, do not report information */ + atomic_set(&acc->enabled, 0); + + err = request_irq(acc->irq1, lis3dh_acc_isr1, IRQF_TRIGGER_RISING, + "lis3dh_acc_irq1", acc); + if (err < 0) { + dev_err(&client->dev, "request irq1 failed: %d\n", err); + goto err_misc_dereg; + } + disable_irq_nosync(acc->irq1); + + err = request_irq(acc->irq2, lis3dh_acc_isr2, IRQF_TRIGGER_RISING, + "lis3dh_acc_irq2", acc); + if (err < 0) { + dev_err(&client->dev, "request irq2 failed: %d\n", err); + goto err_free_irq1; + } + disable_irq_nosync(acc->irq2); + + mutex_unlock(&acc->lock); + + dev_info(&client->dev, "%s: probed\n", LIS3DH_ACC_DEV_NAME); + + return 0; + +err_free_irq1: + free_irq(acc->irq1, acc); +err_misc_dereg: + misc_deregister(&lis3dh_acc_misc_device); +err_input_cleanup: + lis3dh_acc_input_cleanup(acc); +err_power_off: + lis3dh_acc_device_power_off(acc); +err2: + if (acc->pdata->exit) + acc->pdata->exit(); +exit_kfree_pdata: + kfree(acc->pdata); +err_destoyworkqueue2: + destroy_workqueue(acc->irq2_work_queue); +err_destoyworkqueue1: + destroy_workqueue(acc->irq1_work_queue); +err_mutexunlockfreedata: + mutex_unlock(&acc->lock); + kfree(acc); +exit_alloc_data_failed: +exit_check_functionality_failed: + printk(KERN_ERR "%s: Driver Init failed\n", LIS3DH_ACC_DEV_NAME); + return err; +} + +static int __devexit lis3dh_acc_remove(struct i2c_client *client) +{ + /* TODO: revisit ordering here once _probe order is finalized */ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + + free_irq(acc->irq1, acc); + free_irq(acc->irq2, acc); + gpio_free(acc->pdata->gpio_int1); + gpio_free(acc->pdata->gpio_int2); + destroy_workqueue(acc->irq1_work_queue); + destroy_workqueue(acc->irq2_work_queue); + + misc_deregister(&lis3dh_acc_misc_device); + lis3dh_acc_input_cleanup(acc); + lis3dh_acc_device_power_off(acc); + if (acc->pdata->exit) + acc->pdata->exit(); + kfree(acc->pdata); + kfree(acc); + + return 0; +} + +static int lis3dh_acc_resume(struct i2c_client *client) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + + if (acc->on_before_suspend) + return lis3dh_acc_enable(acc); + return 0; +} + +static int lis3dh_acc_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + + acc->on_before_suspend = atomic_read(&acc->enabled); + return lis3dh_acc_disable(acc); +} + +static const struct i2c_device_id lis3dh_acc_id[] + = { { LIS3DH_ACC_DEV_NAME, 0 }, { }, }; + +MODULE_DEVICE_TABLE(i2c, lis3dh_acc_id); + +static struct i2c_driver lis3dh_acc_driver = { + .driver = { + .name = LIS3DH_ACC_DEV_NAME, + }, + .probe = lis3dh_acc_probe, + .remove = __devexit_p(lis3dh_acc_remove), + .resume = lis3dh_acc_resume, + .suspend = lis3dh_acc_suspend, + .id_table = lis3dh_acc_id, +}; + +static int __init lis3dh_acc_init(void) +{ + printk(KERN_INFO "%s accelerometer driver: init\n", + LIS3DH_ACC_DEV_NAME); + return i2c_add_driver(&lis3dh_acc_driver); +} + +static void __exit lis3dh_acc_exit(void) +{ + #if DEBUG + printk(KERN_INFO "%s accelerometer driver exit\n", LIS3DH_ACC_DEV_NAME); + #endif + i2c_del_driver(&lis3dh_acc_driver); + return; +} + +module_init(lis3dh_acc_init); +module_exit(lis3dh_acc_exit); + +MODULE_DESCRIPTION("lis3dh accelerometer misc driver"); +MODULE_AUTHOR("STMicroelectronics"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/gsensor/lis3dh_acc_misc.h b/drivers/input/gsensor/lis3dh_acc_misc.h new file mode 100755 index 000000000000..17b3c0fc225c --- /dev/null +++ b/drivers/input/gsensor/lis3dh_acc_misc.h @@ -0,0 +1,137 @@ + +/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** +* +* File Name : lis3dh_misc.h +* Authors : MH - C&I BU - Application Team +* : Carmine Iascone (carmine.iascone@st.com) +* : Matteo Dameno (matteo.dameno@st.com) +* Version : V 1.0.5 +* Date : 26/08/2010 +* +******************************************************************************** +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES +* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE +* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT. +* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, +* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE +* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING +* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. +* +* THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS. +* +*******************************************************************************/ +/******************************************************************************* +Version History. + +Revision 1-0-0 05/11/2009 +First Release +Revision 1-0-1 26/01/2010 +Linux K&R Compliant Release +Revision 1-0-5 16/08/2010 +Interrupt Management + +*******************************************************************************/ + +#ifndef __LIS3DH_H__ +#define __LIS3DH_H__ + +#include /* For IOCTL macros */ +#include + +#define SAD0L 0x00 +#define SAD0H 0x01 +#define LIS3DH_ACC_I2C_SADROOT 0x0C +#define LIS3DH_ACC_I2C_SAD_L ((LIS3DH_ACC_I2C_SADROOT<<1)|SAD0L) +#define LIS3DH_ACC_I2C_SAD_H ((LIS3DH_ACC_I2C_SADROOT<<1)|SAD0H) +#define LIS3DH_ACC_DEV_NAME "lis3dh_acc_misc" + + +#define LIS3DH_ACC_IOCTL_BASE 77 +/** The following define the IOCTL command values via the ioctl macros */ +#define LIS3DH_ACC_IOCTL_SET_DELAY _IOW(LIS3DH_ACC_IOCTL_BASE, 0, int) +#define LIS3DH_ACC_IOCTL_GET_DELAY _IOR(LIS3DH_ACC_IOCTL_BASE, 1, int) +#define LIS3DH_ACC_IOCTL_SET_ENABLE _IOW(LIS3DH_ACC_IOCTL_BASE, 2, int) +#define LIS3DH_ACC_IOCTL_GET_ENABLE _IOR(LIS3DH_ACC_IOCTL_BASE, 3, int) +#define LIS3DH_ACC_IOCTL_SET_FULLSCALE _IOW(LIS3DH_ACC_IOCTL_BASE, 4, int) +#define LIS3DH_ACC_IOCTL_SET_G_RANGE LIS3DH_ACC_IOCTL_SET_FULLSCALE + +#define LIS3DH_ACC_IOCTL_SET_CTRL_REG3 _IOW(LIS3DH_ACC_IOCTL_BASE, 6, int) +#define LIS3DH_ACC_IOCTL_SET_CTRL_REG6 _IOW(LIS3DH_ACC_IOCTL_BASE, 7, int) +#define LIS3DH_ACC_IOCTL_SET_DURATION1 _IOW(LIS3DH_ACC_IOCTL_BASE, 8, int) +#define LIS3DH_ACC_IOCTL_SET_THRESHOLD1 _IOW(LIS3DH_ACC_IOCTL_BASE, 9, int) +#define LIS3DH_ACC_IOCTL_SET_CONFIG1 _IOW(LIS3DH_ACC_IOCTL_BASE, 10, int) + +#define LIS3DH_ACC_IOCTL_SET_DURATION2 _IOW(LIS3DH_ACC_IOCTL_BASE, 11, int) +#define LIS3DH_ACC_IOCTL_SET_THRESHOLD2 _IOW(LIS3DH_ACC_IOCTL_BASE, 12, int) +#define LIS3DH_ACC_IOCTL_SET_CONFIG2 _IOW(LIS3DH_ACC_IOCTL_BASE, 13, int) + +#define LIS3DH_ACC_IOCTL_GET_SOURCE1 _IOW(LIS3DH_ACC_IOCTL_BASE, 14, int) +#define LIS3DH_ACC_IOCTL_GET_SOURCE2 _IOW(LIS3DH_ACC_IOCTL_BASE, 15, int) + +#define LIS3DH_ACC_IOCTL_GET_TAP_SOURCE _IOW(LIS3DH_ACC_IOCTL_BASE, 16, int) + +#define LIS3DH_ACC_IOCTL_SET_TAP_TW _IOW(LIS3DH_ACC_IOCTL_BASE, 17, int) +#define LIS3DH_ACC_IOCTL_SET_TAP_CFG _IOW(LIS3DH_ACC_IOCTL_BASE, 18, int) +#define LIS3DH_ACC_IOCTL_SET_TAP_TLIM _IOW(LIS3DH_ACC_IOCTL_BASE, 19, int) +#define LIS3DH_ACC_IOCTL_SET_TAP_THS _IOW(LIS3DH_ACC_IOCTL_BASE, 20, int) +#define LIS3DH_ACC_IOCTL_SET_TAP_TLAT _IOW(LIS3DH_ACC_IOCTL_BASE, 21, int) + + + + +/************************************************/ +/* Accelerometer defines section */ +/************************************************/ + +/* Accelerometer Sensor Full Scale */ +#define LIS3DH_ACC_FS_MASK 0x30 +#define LIS3DH_ACC_G_2G 0x00 +#define LIS3DH_ACC_G_4G 0x10 +#define LIS3DH_ACC_G_8G 0x20 +#define LIS3DH_ACC_G_16G 0x30 + + +/* Accelerometer Sensor Operating Mode */ +#define LIS3DH_ACC_ENABLE 0x01 +#define LIS3DH_ACC_DISABLE 0x00 + + + + + + +#ifdef __KERNEL__ +struct lis3dh_acc_platform_data { + int poll_interval; + int min_interval; + + u8 g_range; + + u8 axis_map_x; + u8 axis_map_y; + u8 axis_map_z; + + u8 negate_x; + u8 negate_y; + u8 negate_z; + + int (*init)(void); + void (*exit)(void); + int (*power_on)(void); + int (*power_off)(void); + + int gpio_int1; + int gpio_int2; + +}; +#endif /* __KERNEL__ */ + +#endif /* __LIS3DH_H__ */ + + + diff --git a/drivers/input/gyroscope/Kconfig b/drivers/input/gyroscope/Kconfig new file mode 100755 index 000000000000..596c0f3ebe76 --- /dev/null +++ b/drivers/input/gyroscope/Kconfig @@ -0,0 +1,22 @@ +# +# gyroscope drivers configuration +# + +menuconfig GYRO_SENSOR_DEVICE + bool "gyroscope device support" + default n + help + Enable this to be able to choose the drivers for controlling the + gyroscope sensor on some platforms, for example on PDAs. + +if GYRO_SENSOR_DEVICE + +config GYRO_SENSOR_K3G + bool "gyroscope k3g" + depends on GYRO_SENSOR_DEVICE + default n + help + To have support for your specific gyroscope sesnor you will have to + select the proper drivers which depend on this option. + +endif diff --git a/drivers/input/gyroscope/Makefile b/drivers/input/gyroscope/Makefile new file mode 100755 index 000000000000..002ba5fff2e2 --- /dev/null +++ b/drivers/input/gyroscope/Makefile @@ -0,0 +1,4 @@ +# gyroscope drivers + +obj-$(CONFIG_GYRO_SENSOR_K3G) += k3g.o + diff --git a/drivers/input/gyroscope/k3g.c b/drivers/input/gyroscope/k3g.c new file mode 100755 index 000000000000..1b4cd979c012 --- /dev/null +++ b/drivers/input/gyroscope/k3g.c @@ -0,0 +1,703 @@ +/* + * Copyright (C) 2010, Samsung Electronics Co. Ltd. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include + +/* k3g chip id */ +#define DEVICE_ID 0xD3 +/* k3g gyroscope registers */ +#define WHO_AM_I 0x0F +#define CTRL_REG1 0x20 /* power control reg */ +#define CTRL_REG2 0x21 /* power control reg */ +#define CTRL_REG3 0x22 /* power control reg */ +#define CTRL_REG4 0x23 /* interrupt control reg */ +#define CTRL_REG5 0x24 /* interrupt control reg */ +#define OUT_TEMP 0x26 /* Temperature data */ +#define STATUS_REG 0x27 +#define AXISDATA_REG 0x28 +#define OUT_Y_L 0x2A +#define FIFO_CTRL_REG 0x2E +#define FIFO_SRC_REG 0x2F +#define PM_OFF 0x00 +#define PM_NORMAL 0x08 +#define ENABLE_ALL_AXES 0x07 +#define BYPASS_MODE 0x00 +#define FIFO_MODE 0x20 + +#define FIFO_EMPTY 0x20 +#define FSS_MASK 0x1F +#define ODR_MASK 0xF0 +#define ODR105_BW12_5 0x00 /* ODR = 105Hz; BW = 12.5Hz */ +#define ODR105_BW25 0x10 /* ODR = 105Hz; BW = 25Hz */ +#define ODR210_BW12_5 0x40 /* ODR = 210Hz; BW = 12.5Hz */ +#define ODR210_BW25 0x50 /* ODR = 210Hz; BW = 25Hz */ +#define ODR210_BW50 0x60 /* ODR = 210Hz; BW = 50Hz */ +#define ODR210_BW70 0x70 /* ODR = 210Hz; BW = 70Hz */ +#define ODR420_BW20 0x80 /* ODR = 420Hz; BW = 20Hz */ +#define ODR420_BW25 0x90 /* ODR = 420Hz; BW = 25Hz */ +#define ODR420_BW50 0xA0 /* ODR = 420Hz; BW = 50Hz */ +#define ODR420_BW110 0xB0 /* ODR = 420Hz; BW = 110Hz */ +#define ODR840_BW30 0xC0 /* ODR = 840Hz; BW = 30Hz */ +#define ODR840_BW35 0xD0 /* ODR = 840Hz; BW = 35Hz */ +#define ODR840_BW50 0xE0 /* ODR = 840Hz; BW = 50Hz */ +#define ODR840_BW110 0xF0 /* ODR = 840Hz; BW = 110Hz */ + +#define MIN_ST 175 +#define MAX_ST 875 +#define AC (1 << 7) /* register auto-increment bit */ +#define MAX_ENTRY 1 +#define MAX_DELAY (MAX_ENTRY * 9523809LL) + +/* default register setting for device init */ +static const char default_ctrl_regs[] = { + 0x3F, /* 105HZ, PM-normal, xyz enable */ + 0x00, /* normal mode */ + 0x04, /* fifo wtm interrupt on */ + 0xA0, /* block data update, 2000d/s */ + 0x40, /* fifo enable */ +}; + +static const struct odr_delay { + u8 odr; /* odr reg setting */ + u32 delay_ns; /* odr in ns */ +} odr_delay_table[] = { + { ODR840_BW110, 1190476LL }, /* 840Hz */ + { ODR420_BW110, 2380952LL }, /* 420Hz */ + { ODR210_BW70, 4761904LL }, /* 210Hz */ + { ODR105_BW25, 9523809LL }, /* 105Hz */ +}; + +/* + * K3G gyroscope data + * brief structure containing gyroscope values for yaw, pitch and roll in + * signed short + */ +struct k3g_t { + s16 x; + s16 y; + s16 z; +}; + +struct k3g_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct mutex lock; + struct workqueue_struct *k3g_wq; + struct work_struct work; + struct hrtimer timer; + bool enable; + bool drop_next_event; + bool interruptible; /* interrupt or polling? */ + int entries; /* number of fifo entries */ + u8 ctrl_regs[5]; /* saving register settings */ + u32 time_to_read; /* time needed to read one entry */ + ktime_t polling_delay; /* polling time for timer */ +}; + +static int k3g_read_fifo_status(struct k3g_data *k3g_data) +{ + int fifo_status; + + fifo_status = i2c_smbus_read_byte_data(k3g_data->client, FIFO_SRC_REG); + if (fifo_status < 0) { + pr_err("%s: failed to read fifo source register\n", + __func__); + return fifo_status; + } + return (fifo_status & FSS_MASK) + !(fifo_status & FIFO_EMPTY); +} + +static int k3g_restart_fifo(struct k3g_data *k3g_data) +{ + int res = 0; + + res = i2c_smbus_write_byte_data(k3g_data->client, + FIFO_CTRL_REG, BYPASS_MODE); + if (res < 0) { + pr_err("%s : failed to set bypass_mode\n", __func__); + return res; + } + + res = i2c_smbus_write_byte_data(k3g_data->client, + FIFO_CTRL_REG, FIFO_MODE | (k3g_data->entries - 1)); + + if (res < 0) + pr_err("%s : failed to set fifo_mode\n", __func__); + + return res; +} + +static void set_polling_delay(struct k3g_data *k3g_data, int res) +{ + s64 delay_ns; + + delay_ns = k3g_data->entries + 1 - res; + if (delay_ns < 0) + delay_ns = 0; + + delay_ns = delay_ns * k3g_data->time_to_read; + k3g_data->polling_delay = ns_to_ktime(delay_ns); +} + +/* gyroscope data readout */ +static int k3g_read_gyro_values(struct i2c_client *client, + struct k3g_t *data, int total_read) +{ + int err; + struct i2c_msg msg[2]; + u8 reg_buf; + u8 gyro_data[sizeof(*data) * (total_read ? (total_read - 1) : 1)]; + + msg[0].addr = client->addr; + msg[0].buf = ®_buf; + msg[0].flags = 0; + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = gyro_data; + + if (total_read > 1) { + reg_buf = AXISDATA_REG | AC; + msg[1].len = sizeof(gyro_data); + + err = i2c_transfer(client->adapter, msg, 2); + if (err != 2) + return (err < 0) ? err : -EIO; + } + + reg_buf = AXISDATA_REG; + msg[1].len = 1; + err = i2c_transfer(client->adapter, msg, 2); + if (err != 2) + return (err < 0) ? err : -EIO; + + reg_buf = OUT_Y_L | AC; + msg[1].len = sizeof(*data); + err = i2c_transfer(client->adapter, msg, 2); + if (err != 2) + return (err < 0) ? err : -EIO; + + data->y = (gyro_data[1] << 8) | gyro_data[0]; + data->z = (gyro_data[3] << 8) | gyro_data[2]; + data->x = (gyro_data[5] << 8) | gyro_data[4]; + + return 0; +} + +static int k3g_report_gyro_values(struct k3g_data *k3g_data) +{ + int res; + struct k3g_t data; + + res = k3g_read_gyro_values(k3g_data->client, &data, + k3g_data->entries + k3g_data->drop_next_event); + if (res < 0) + return res; + + res = k3g_read_fifo_status(k3g_data); + + k3g_data->drop_next_event = !res; + + if (res >= 31 - k3g_data->entries) { + /* reset fifo to start again - data isn't trustworthy, + * our locked read might not have worked and we + * could have done i2c read in mid register update + */ + return k3g_restart_fifo(k3g_data); + } + + input_report_rel(k3g_data->input_dev, REL_RX, data.x); + input_report_rel(k3g_data->input_dev, REL_RY, data.y); + input_report_rel(k3g_data->input_dev, REL_RZ, data.z); + input_sync(k3g_data->input_dev); + + return res; +} + +static enum hrtimer_restart k3g_timer_func(struct hrtimer *timer) +{ + struct k3g_data *k3g_data = container_of(timer, struct k3g_data, timer); + queue_work(k3g_data->k3g_wq, &k3g_data->work); + return HRTIMER_NORESTART; +} + +static void k3g_work_func(struct work_struct *work) +{ + int res; + struct k3g_data *k3g_data = container_of(work, struct k3g_data, work); + + do { + res = k3g_read_fifo_status(k3g_data); + if (res < 0) + return; + + if (res < k3g_data->entries) { + pr_warning("%s: fifo entries are less than we want\n", + __func__); + goto timer_set; + } + + res = k3g_report_gyro_values(k3g_data); + if (res < 0) + return; +timer_set: + set_polling_delay(k3g_data, res); + + } while (!ktime_to_ns(k3g_data->polling_delay)); + + hrtimer_start(&k3g_data->timer, + k3g_data->polling_delay, HRTIMER_MODE_REL); +} + +static irqreturn_t k3g_interrupt_thread(int irq, void *k3g_data_p) +{ + int res; + struct k3g_data *k3g_data = k3g_data_p; + res = k3g_report_gyro_values(k3g_data); + if (res < 0) + pr_err("%s: failed to report gyro values\n", __func__); + + return IRQ_HANDLED; +} + +static ssize_t k3g_show_enable(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct k3g_data *k3g_data = dev_get_drvdata(dev); + return sprintf(buf, "%d\n", k3g_data->enable); +} + +static ssize_t k3g_set_enable(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int err = 0; + struct k3g_data *k3g_data = dev_get_drvdata(dev); + bool new_enable; + + if (sysfs_streq(buf, "1")) + new_enable = true; + else if (sysfs_streq(buf, "0")) + new_enable = false; + else { + pr_debug("%s: invalid value %d\n", __func__, *buf); + return -EINVAL; + } + + if (new_enable == k3g_data->enable) + return size; + + mutex_lock(&k3g_data->lock); + if (new_enable) { + /* turning on */ + err = i2c_smbus_write_i2c_block_data(k3g_data->client, + CTRL_REG1 | AC, sizeof(k3g_data->ctrl_regs), + k3g_data->ctrl_regs); + if (err < 0) { + err = -EIO; + goto unlock; + } + + /* reset fifo entries */ + err = k3g_restart_fifo(k3g_data); + if (err < 0) { + err = -EIO; + goto turn_off; + } + + if (k3g_data->interruptible) + enable_irq(k3g_data->client->irq); + else { + set_polling_delay(k3g_data, 0); + hrtimer_start(&k3g_data->timer, + k3g_data->polling_delay, HRTIMER_MODE_REL); + } + } else { + if (k3g_data->interruptible) + disable_irq(k3g_data->client->irq); + else { + hrtimer_cancel(&k3g_data->timer); + cancel_work_sync(&k3g_data->work); + } + /* turning off */ + err = i2c_smbus_write_byte_data(k3g_data->client, + CTRL_REG1, 0x00); + if (err < 0) + goto unlock; + } + k3g_data->enable = new_enable; + +turn_off: + if (err < 0) + i2c_smbus_write_byte_data(k3g_data->client, + CTRL_REG1, 0x00); +unlock: + mutex_unlock(&k3g_data->lock); + + return err ? err : size; +} + +static ssize_t k3g_show_delay(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct k3g_data *k3g_data = dev_get_drvdata(dev); + u64 delay; + + delay = k3g_data->time_to_read * k3g_data->entries; + delay = ktime_to_ns(ns_to_ktime(delay)); + + return sprintf(buf, "%lld\n", delay); +} + +static ssize_t k3g_set_delay(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + struct k3g_data *k3g_data = dev_get_drvdata(dev); + int odr_value = ODR105_BW25; + int res = 0; + int i; + u64 delay_ns; + u8 ctrl; + + res = strict_strtoll(buf, 10, &delay_ns); + if (res < 0) + return res; + + mutex_lock(&k3g_data->lock); + if (!k3g_data->interruptible) + hrtimer_cancel(&k3g_data->timer); + else + disable_irq(k3g_data->client->irq); + + /* round to the nearest supported ODR that is less than + * the requested value + */ + for (i = 0; i < ARRAY_SIZE(odr_delay_table); i++) + if (delay_ns <= odr_delay_table[i].delay_ns) { + odr_value = odr_delay_table[i].odr; + delay_ns = odr_delay_table[i].delay_ns; + k3g_data->time_to_read = delay_ns; + k3g_data->entries = 1; + break; + } + + if (delay_ns >= odr_delay_table[3].delay_ns) { + if (delay_ns >= MAX_DELAY) { + k3g_data->entries = MAX_ENTRY; + delay_ns = MAX_DELAY; + } else { + do_div(delay_ns, odr_delay_table[3].delay_ns); + k3g_data->entries = delay_ns; + } + k3g_data->time_to_read = odr_delay_table[3].delay_ns; + } + + if (odr_value != (k3g_data->ctrl_regs[0] & ODR_MASK)) { + ctrl = (k3g_data->ctrl_regs[0] & ~ODR_MASK); + ctrl |= odr_value; + k3g_data->ctrl_regs[0] = ctrl; + res = i2c_smbus_write_byte_data(k3g_data->client, + CTRL_REG1, ctrl); + } + + /* we see a noise in the first sample or two after we + * change rates. this delay helps eliminate that noise. + */ + msleep((u32)delay_ns * 2 / NSEC_PER_MSEC); + + /* (re)start fifo */ + k3g_restart_fifo(k3g_data); + + if (!k3g_data->interruptible) { + delay_ns = k3g_data->entries * k3g_data->time_to_read; + k3g_data->polling_delay = ns_to_ktime(delay_ns); + if (k3g_data->enable) + hrtimer_start(&k3g_data->timer, + k3g_data->polling_delay, HRTIMER_MODE_REL); + } else + enable_irq(k3g_data->client->irq); + + mutex_unlock(&k3g_data->lock); + + return size; +} + +static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP, + k3g_show_enable, k3g_set_enable); +static DEVICE_ATTR(poll_delay, S_IRUGO | S_IWUSR | S_IWGRP, + k3g_show_delay, k3g_set_delay); + +static int k3g_probe(struct i2c_client *client, + const struct i2c_device_id *devid) +{ + int ret; + int err = 0; + struct k3g_data *data; + struct input_dev *input_dev; + + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "platform data is NULL. exiting.\n"); + err = -ENODEV; + goto exit; + } + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (data == NULL) { + dev_err(&client->dev, + "failed to allocate memory for module data\n"); + err = -ENOMEM; + goto exit; + } + + data->client = client; + + /* read chip id */ + ret = i2c_smbus_read_byte_data(client, WHO_AM_I); + if (ret != DEVICE_ID) { + if (ret < 0) { + pr_err("%s: i2c for reading chip id failed\n", + __func__); + err = ret; + } else { + pr_err("%s : Device identification failed\n", + __func__); + err = -ENODEV; + } + goto err_read_reg; + } + + mutex_init(&data->lock); + + /* allocate gyro input_device */ + input_dev = input_allocate_device(); + if (!input_dev) { + pr_err("%s: could not allocate input device\n", __func__); + err = -ENOMEM; + goto err_input_allocate_device; + } + + data->input_dev = input_dev; + input_set_drvdata(input_dev, data); + input_dev->name = "gyro"; + /* X */ + input_set_capability(input_dev, EV_REL, REL_RX); + input_set_abs_params(input_dev, REL_RX, -2048, 2047, 0, 0); + /* Y */ + input_set_capability(input_dev, EV_REL, REL_RY); + input_set_abs_params(input_dev, REL_RY, -2048, 2047, 0, 0); + /* Z */ + input_set_capability(input_dev, EV_REL, REL_RZ); + input_set_abs_params(input_dev, REL_RZ, -2048, 2047, 0, 0); + + err = input_register_device(input_dev); + if (err < 0) { + pr_err("%s: could not register input device\n", __func__); + input_free_device(data->input_dev); + goto err_input_register_device; + } + + memcpy(&data->ctrl_regs, &default_ctrl_regs, sizeof(default_ctrl_regs)); + if (data->client->irq >= 0) { /* interrupt */ + data->interruptible = true; + err = request_threaded_irq(data->client->irq, NULL, + k3g_interrupt_thread, IRQF_TRIGGER_HIGH | IRQF_ONESHOT, + "k3g", data); + if (err < 0) { + pr_err("%s: can't allocate irq.\n", __func__); + goto err_request_irq; + } + disable_irq(data->client->irq); + + } else { /* polling */ + u64 delay_ns; + data->ctrl_regs[2] = 0x00; /* disable interrupt */ + /* hrtimer settings. we poll for gyro values using a timer. */ + hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + data->polling_delay = ns_to_ktime(200 * NSEC_PER_MSEC); + data->time_to_read = 10000000LL; + delay_ns = ktime_to_ns(data->polling_delay); + do_div(delay_ns, data->time_to_read); + data->entries = delay_ns; + data->timer.function = k3g_timer_func; + + /* the timer just fires off a work queue request. + We need a thread to read i2c (can be slow and blocking). */ + data->k3g_wq = create_singlethread_workqueue("k3g_wq"); + if (!data->k3g_wq) { + err = -ENOMEM; + pr_err("%s: could not create workqueue\n", __func__); + goto err_create_workqueue; + } + /* this is the thread function we run on the work queue */ + INIT_WORK(&data->work, k3g_work_func); + } + + if (device_create_file(&input_dev->dev, + &dev_attr_enable) < 0) { + pr_err("Failed to create device file(%s)!\n", + dev_attr_enable.attr.name); + goto err_device_create_file; + } + + if (device_create_file(&input_dev->dev, + &dev_attr_poll_delay) < 0) { + pr_err("Failed to create device file(%s)!\n", + dev_attr_poll_delay.attr.name); + goto err_device_create_file2; + } + + i2c_set_clientdata(client, data); + dev_set_drvdata(&input_dev->dev, data); + + return 0; + +err_device_create_file2: + device_remove_file(&input_dev->dev, &dev_attr_enable); +err_device_create_file: + if (data->interruptible) { + enable_irq(data->client->irq); + free_irq(data->client->irq, data); + } else + destroy_workqueue(data->k3g_wq); + input_unregister_device(data->input_dev); +err_create_workqueue: +err_request_irq: +err_input_register_device: +err_input_allocate_device: + mutex_destroy(&data->lock); +err_read_reg: + kfree(data); +exit: + return err; +} + +static int k3g_remove(struct i2c_client *client) +{ + int err = 0; + struct k3g_data *k3g_data = i2c_get_clientdata(client); + + device_remove_file(&k3g_data->input_dev->dev, &dev_attr_enable); + device_remove_file(&k3g_data->input_dev->dev, &dev_attr_poll_delay); + + if (k3g_data->enable) + err = i2c_smbus_write_byte_data(k3g_data->client, + CTRL_REG1, 0x00); + if (k3g_data->interruptible) { + if (!k3g_data->enable) /* no disable_irq before free_irq */ + enable_irq(k3g_data->client->irq); + free_irq(k3g_data->client->irq, k3g_data); + + } else { + hrtimer_cancel(&k3g_data->timer); + cancel_work_sync(&k3g_data->work); + destroy_workqueue(k3g_data->k3g_wq); + } + + input_unregister_device(k3g_data->input_dev); + mutex_destroy(&k3g_data->lock); + kfree(k3g_data); + + return err; +} + +static int k3g_suspend(struct device *dev) +{ + int err = 0; + struct i2c_client *client = to_i2c_client(dev); + struct k3g_data *k3g_data = i2c_get_clientdata(client); + + if (k3g_data->enable) { + mutex_lock(&k3g_data->lock); + if (!k3g_data->interruptible) { + hrtimer_cancel(&k3g_data->timer); + cancel_work_sync(&k3g_data->work); + } + err = i2c_smbus_write_byte_data(k3g_data->client, + CTRL_REG1, 0x00); + mutex_unlock(&k3g_data->lock); + } + + return err; +} + +static int k3g_resume(struct device *dev) +{ + int err = 0; + struct i2c_client *client = to_i2c_client(dev); + struct k3g_data *k3g_data = i2c_get_clientdata(client); + + if (k3g_data->enable) { + mutex_lock(&k3g_data->lock); + if (!k3g_data->interruptible) + hrtimer_start(&k3g_data->timer, + k3g_data->polling_delay, HRTIMER_MODE_REL); + err = i2c_smbus_write_i2c_block_data(client, + CTRL_REG1 | AC, sizeof(k3g_data->ctrl_regs), + k3g_data->ctrl_regs); + mutex_unlock(&k3g_data->lock); + } + + return err; +} + +static const struct dev_pm_ops k3g_pm_ops = { + .suspend = k3g_suspend, + .resume = k3g_resume +}; + +static const struct i2c_device_id k3g_id[] = { + { "k3g", 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, k3g_id); + +static struct i2c_driver k3g_driver = { + .probe = k3g_probe, + .remove = __devexit_p(k3g_remove), + .id_table = k3g_id, + .driver = { + .pm = &k3g_pm_ops, + .owner = THIS_MODULE, + .name = "k3g" + }, +}; + +static int __init k3g_init(void) +{ + return i2c_add_driver(&k3g_driver); +} + +static void __exit k3g_exit(void) +{ + i2c_del_driver(&k3g_driver); +} + +module_init(k3g_init); +module_exit(k3g_exit); + +MODULE_DESCRIPTION("k3g digital gyroscope driver"); +MODULE_AUTHOR("Tim SK Lee Samsung Electronics "); +MODULE_LICENSE("GPL"); From 805035e9c461630a068b4d3b5bacba274c2c965c Mon Sep 17 00:00:00 2001 From: ddl Date: Thu, 1 Sep 2011 17:43:00 +0800 Subject: [PATCH 063/150] camera: fix ov5640 sensor driver slab corruption in multi-regs write --- drivers/media/video/ov5640.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/video/ov5640.c b/drivers/media/video/ov5640.c index 21eb6889f50e..2270c5649f3a 100755 --- a/drivers/media/video/ov5640.c +++ b/drivers/media/video/ov5640.c @@ -1638,7 +1638,7 @@ static int sensor_write_array(struct i2c_client *client, struct reginfo *regarra int size_num; size_num = reg_num + 1; - ptemp = phead = (u8*)kmalloc(size_num*sizeof(u8),GFP_KERNEL); + ptemp = phead = (u8*)kmalloc((size_num+10)*sizeof(u8),GFP_KERNEL); if (!phead) { SENSOR_DG("-------------write registers allocate memory fail!!!\n"); i = j; From acb9fd44396d32bef7c7b1289adec61fd4dcf8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 1 Sep 2011 18:48:00 +0800 Subject: [PATCH 064/150] rk29: cpufreq: no slowdown too much when overheat --- arch/arm/mach-rk29/cpufreq.c | 40 ++++++++++++++---------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/arch/arm/mach-rk29/cpufreq.c b/arch/arm/mach-rk29/cpufreq.c index 094bb0659528..8d73cfb519a0 100755 --- a/arch/arm/mach-rk29/cpufreq.c +++ b/arch/arm/mach-rk29/cpufreq.c @@ -75,7 +75,7 @@ module_param(limit_secs, int, 0644); static int limit_temp; module_param(limit_temp, int, 0444); -#define LIMIT_AVG_VOLTAGE 1225000 /* vU */ +#define LIMIT_AVG_VOLTAGE 1200000 /* vU */ #else /* !CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP */ #define LIMIT_AVG_VOLTAGE 1400000 /* vU */ #endif /* CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP */ @@ -92,15 +92,7 @@ module_param(debug_mask, uint, 0644); #define LIMIT_AVG_FREQ (816 * KHZ) /* kHz */ static unsigned int limit_avg_freq = LIMIT_AVG_FREQ; -static int rk29_cpufreq_set_limit_avg_freq(const char *val, struct kernel_param *kp) -{ - int err = param_set_uint(val, kp); - if (!err) { - board_update_cpufreq_table(freq_table); - } - return err; -} -module_param_call(limit_avg_freq, rk29_cpufreq_set_limit_avg_freq, param_get_uint, &limit_avg_freq, 0644); +module_param(limit_avg_freq, uint, 0444); static int limit_avg_index = -1; @@ -120,7 +112,6 @@ module_param_call(limit_avg_voltage, rk29_cpufreq_set_limit_avg_voltage, param_g static bool limit_fb1_is_on; static bool limit_hdmi_is_on; static inline bool aclk_limit(void) { return limit_hdmi_is_on && limit_fb1_is_on; } -static int limit_index_816 = -1; module_param(limit_fb1_is_on, bool, 0644); module_param(limit_hdmi_is_on, bool, 0644); #else @@ -128,6 +119,8 @@ static inline bool aclk_limit(void) { return false; } #endif #if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) +static int limit_index_816 = -1; +static unsigned int limit_freq_816; static int limit_index_1008 = -1; static unsigned int limit_freq_1008; #endif @@ -152,10 +145,9 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) limit_avg_freq = 0; limit_avg_index = -1; -#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP - limit_index_816 = -1; -#endif #if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) + limit_index_816 = -1; + limit_freq_816 = 0; limit_index_1008 = -1; limit_freq_1008 = 0; #endif @@ -166,13 +158,11 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) limit_avg_freq = table[i].frequency; limit_avg_index = i; } -#ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP +#if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) if (table[i].frequency <= 816 * KHZ && (limit_index_816 < 0 || (limit_index_816 >= 0 && table[limit_index_816].frequency < table[i].frequency))) limit_index_816 = i; -#endif -#if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) if (table[i].frequency <= 1008 * KHZ && (limit_index_1008 < 0 || (limit_index_1008 >= 0 && table[limit_index_1008].frequency < table[i].frequency))) { @@ -225,7 +215,7 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i unsigned int target_freq; if (!limit || !rk29_cpufreq_is_ondemand_policy(policy) || - (limit_avg_index < 0) || (relation & MASK_FURTHER_CPUFREQ)) { + (limit_index_816 < 0) || (relation & MASK_FURTHER_CPUFREQ)) { limit_temp = 0; last.tv64 = 0; return; @@ -254,7 +244,7 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i c = TEMP_COEFF_408; else if (cur <= 624 * 1000) c = TEMP_COEFF_624; - else if (cur <= limit_avg_freq) + else if (cur <= 816 * 1000) c = TEMP_COEFF_816; else if (cur <= 1008 * 1000) c = TEMP_COEFF_1008; @@ -270,9 +260,9 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i overheat_temp = TEMP_COEFF_1008 * limit_secs * 1000; overheat_temp_1200 = overheat_temp - TEMP_COEFF_1200 * (WORK_DELAY/HZ) * 1000; - if (temp > overheat_temp && target_freq > limit_avg_freq) - target_index = limit_avg_index; - else if (target_freq > limit_freq_1008 && limit_freq_1008 > limit_avg_freq && + if (temp > overheat_temp && target_freq > limit_freq_816) + target_index = limit_index_816; + else if (target_freq > limit_freq_1008 && limit_freq_1008 > limit_freq_816 && temp > overheat_temp_1200 && temp <= overheat_temp) target_index = limit_index_1008; @@ -738,7 +728,7 @@ static int rk29_cpufreq_pm_notifier_event(struct notifier_block *this, switch (event) { case PM_SUSPEND_PREPARE: - ret = cpufreq_driver_target(policy, limit_avg_freq, DISABLE_FURTHER_CPUFREQ | CPUFREQ_RELATION_L); + ret = cpufreq_driver_target(policy, limit_avg_freq, DISABLE_FURTHER_CPUFREQ | CPUFREQ_RELATION_H); if (ret < 0) { ret = NOTIFY_BAD; goto out; @@ -747,7 +737,7 @@ static int rk29_cpufreq_pm_notifier_event(struct notifier_block *this, break; case PM_POST_RESTORE: case PM_POST_SUSPEND: - cpufreq_driver_target(policy, limit_avg_freq, ENABLE_FURTHER_CPUFREQ | CPUFREQ_RELATION_L); + cpufreq_driver_target(policy, limit_avg_freq, ENABLE_FURTHER_CPUFREQ | CPUFREQ_RELATION_H); ret = NOTIFY_OK; break; } @@ -766,7 +756,7 @@ static int rk29_cpufreq_reboot_notifier_event(struct notifier_block *this, struct cpufreq_policy *policy = cpufreq_cpu_get(0); if (policy) { - cpufreq_driver_target(policy, limit_avg_freq, DISABLE_FURTHER_CPUFREQ | CPUFREQ_RELATION_L); + cpufreq_driver_target(policy, limit_avg_freq, DISABLE_FURTHER_CPUFREQ | CPUFREQ_RELATION_H); cpufreq_cpu_put(policy); } From 2c54ff22b213210c2be78ff5736851ffb6dc0a34 Mon Sep 17 00:00:00 2001 From: ddl Date: Fri, 2 Sep 2011 11:32:50 +0800 Subject: [PATCH 065/150] camera: fix ov2659 may config error when in mirror or flip --- drivers/media/video/ov2659.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/video/ov2659.c b/drivers/media/video/ov2659.c index fcbadc0c4b3c..0e52029ce5fe 100755 --- a/drivers/media/video/ov2659.c +++ b/drivers/media/video/ov2659.c @@ -65,8 +65,8 @@ module_param(debug, int, S_IRUGO|S_IWUSR); #define CONFIG_SENSOR_Focus 0 #define CONFIG_SENSOR_Exposure 0 #define CONFIG_SENSOR_Flash 1 -#define CONFIG_SENSOR_Mirror 1 -#define CONFIG_SENSOR_Flip 1 +#define CONFIG_SENSOR_Mirror 0 +#define CONFIG_SENSOR_Flip 0 #define CONFIG_SENSOR_I2C_SPEED 350000 /* Hz */ /* Sensor write register continues by preempt_disable/preempt_enable for current process not be scheduled */ From bb2d646b32c1cde8ec56a2ffa5cb401d76f9cd93 Mon Sep 17 00:00:00 2001 From: ddl Date: Fri, 2 Sep 2011 11:57:01 +0800 Subject: [PATCH 066/150] camera(uvc): fix kernel may panic when close uvc camera,because uninit tasklet after uninit urb in uvc_uninit_video --- drivers/media/video/uvc/uvc_video.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c index 2dd8dc967157..2d44c1f6f126 100755 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c @@ -843,15 +843,17 @@ static void uvc_uninit_video(struct uvc_streaming *stream, int free_buffers) if (urb == NULL) continue; - usb_kill_urb(urb); - usb_free_urb(urb); - stream->urb[i] = NULL; - /* ddl@rock-chips.com */ + /* ddl@rock-chips.com: Tasklet must be kill before kill urb in uninit */ if (stream->tasklet[i]) { tasklet_kill(stream->tasklet[i]); kfree(stream->tasklet[i]); stream->tasklet[i] = NULL; } + + usb_kill_urb(urb); + usb_free_urb(urb); + stream->urb[i] = NULL; + } if (free_buffers) From fce8a46cb88c58fe2cf1c182ff9fbb92119592ba Mon Sep 17 00:00:00 2001 From: xbw Date: Fri, 2 Sep 2011 15:10:23 +0800 Subject: [PATCH 067/150] fix the bug of crash caused by frequent switching Wifi module --- drivers/mmc/host/rk29_sdmmc.c | 63 +++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 6db516289c73..87bfb41b5e53 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -61,7 +61,7 @@ int debug_level = 7; #define xbwprintk(n, arg...) #endif -#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN | SDMMC_INT_RTO | SDMMC_INT_HLE ) +#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN /*| SDMMC_INT_RTO*/ | SDMMC_INT_HLE ) #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD) #define RK29_SDMMC_INTMASK_USEIO (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD| SDMMC_INT_TXDR | SDMMC_INT_RXDR ) @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.05 The last modify date is 2011-08-29,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.06 The last modify date is 2011-09-01,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -333,7 +333,7 @@ ssize_t rk29_sdmmc_progress_store(struct kobject *kobj, struct kobj_attribute *a __LINE__, unmounting_times, host->dma_name); } host->mmc->re_initialized_flags = 0; - mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY)); + mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY*2)); } else if( !strncmp(buf, "sd-No-Media", strlen("sd-No-Media"))) { @@ -659,6 +659,8 @@ static int rk29_sdmmc_start_command(struct rk29_sdmmc *host, struct mmc_command xbwprintk(5, "\n%s..%d..************.start cmd=%d, arg=0x%x ********=====xbw[%s]=======\n", \ __FUNCTION__, __LINE__, cmd->opcode, cmd->arg, host->dma_name); + host->mmc->doneflag = 1; + /* wait until CIU accepts the command */ while (--tmo && (rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START)) { @@ -680,7 +682,6 @@ static int rk29_sdmmc_start_command(struct rk29_sdmmc *host, struct mmc_command host->errorstep = 0x1; return SDM_WAIT_FOR_CMDSTART_TIMEOUT; } - host->mmc->doneflag = 1; return SDM_SUCCESS; } @@ -1799,8 +1800,11 @@ static int rk29_sdmmc_start_request(struct mmc_host *mmc ) host->state = STATE_IDLE; //modifyed by xbw at 2011-08-15 spin_unlock_irqrestore(&host->lock, iflags); - - mmc_request_done(host->mmc, host->mrq); + + if(host->mrq && host->mmc->doneflag) + { + mmc_request_done(host->mmc, host->mrq); + } return ret; @@ -2470,7 +2474,7 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) if(!( (MMC_READ_SINGLE_BLOCK == host->cmd->opcode)&&( -EIO == data->error))) //deal with START_BIT_ERROR { - host->complete_done = 1; + host->complete_done = 2; break;//goto unlock; } @@ -2496,19 +2500,26 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) del_timer_sync(&host->request_timer); //delete the timer for INT_CMD_DONE int CMD12 rk29_sdmmc_request_end(host, host->cmd); - host->complete_done = 1; + host->complete_done = 3; break;//goto unlock; } } - pending_flag = (1==host->complete_done) && (host->retryfunc<50) \ + pending_flag = (host->complete_done > 0) && (host->retryfunc<50) \ && (rk29_sdmmc_test_pending(host, EVENT_CMD_COMPLETE)|| rk29_sdmmc_test_pending(host, EVENT_DATA_COMPLETE) ); if(pending_flag) { - printk("%s..%d... cmd=%d(arg=0x%x),retrycount=%d, host->state=0x%x,\n pendingEvent=0x%lu, completeEvents=0x%lu ====xbw[%s]====\n",\ - __FUNCTION__, __LINE__,host->cmd->opcode,host->cmd->arg, host->retryfunc, host->state, \ - host->pending_events,host->completed_events,host->dma_name); + printk("%s..%d... cmd=%d(arg=0x%x),completedone=%d, retrycount=%d, doneflag=%d, \n \ + host->state=0x%x, switchstate=%x, \n \ + pendingEvent=0x%lu, completeEvents=0x%lu, \n \ + mrqCMD=%d, arg=0x%x \n ====xbw[%s]====\n",\ + + __FUNCTION__, __LINE__,host->cmd->opcode, host->cmd->arg, host->complete_done,\ + host->retryfunc, host->mmc->doneflag,host->state, state, \ + host->pending_events,host->completed_events,host->dma_name, \ + host->mrq->cmd->opcode, host->mrq->cmd->arg); + cpu_relax(); } @@ -2568,8 +2579,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) pending = rk29_sdmmc_read(host->regs, SDMMC_MINTSTS);// read only mask reg if (!pending) { - spin_unlock_irqrestore(&host->lock, iflags); - return IRQ_HANDLED; + goto Exit_INT; } @@ -2597,7 +2607,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) if(host->mmc->re_initialized_flags) { - mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY/2)); + mod_timer(&host->detect_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_REMOVAL_DELAY)); } else { @@ -2614,8 +2624,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) } - spin_unlock_irqrestore(&host->lock, iflags); - return IRQ_HANDLED; + goto Exit_INT; } @@ -2628,6 +2637,8 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_CMD_DONE); // clear interrupt rk29_sdmmc_cmd_interrupt(host, status); + + goto Exit_INT; } if(pending & SDMMC_INT_SDIO) @@ -2638,8 +2649,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_SDIO); mmc_signal_sdio_irq(host->mmc); - spin_unlock_irqrestore(&host->lock, iflags); - return IRQ_HANDLED; + goto Exit_INT; } @@ -2657,8 +2667,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) if(!(pending & SDMMC_INT_CMD_DONE)) tasklet_schedule(&host->tasklet); - spin_unlock_irqrestore(&host->lock, iflags); - return IRQ_HANDLED; + goto Exit_INT; } @@ -2668,8 +2677,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) __FUNCTION__, pending,host->cmd->opcode, host->cmd->arg, host->cmd->retries, host->dma_name); rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_HLE); - spin_unlock_irqrestore(&host->lock, iflags); - return IRQ_HANDLED; + goto Exit_INT; } @@ -2688,9 +2696,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) rk29_sdmmc_set_pending(host, EVENT_DATA_COMPLETE); tasklet_schedule(&host->tasklet); - - spin_unlock_irqrestore(&host->lock, iflags); - return IRQ_HANDLED; + goto Exit_INT; } @@ -2700,8 +2706,7 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) __FUNCTION__, pending, host->cmd->opcode, host->cmd->arg, host->cmd->retries,host->dma_name); rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_FRUN); - spin_unlock_irqrestore(&host->lock, iflags); - return IRQ_HANDLED; + goto Exit_INT; } if (pending & SDMMC_INT_RXDR) @@ -2723,6 +2728,8 @@ static irqreturn_t rk29_sdmmc_interrupt(int irq, void *dev_id) rk29_sdmmc_write(host->regs, SDMMC_RINTSTS,SDMMC_INT_TXDR); // clear interrupt } +Exit_INT: + spin_unlock_irqrestore(&host->lock, iflags); return IRQ_HANDLED; } From 5299e3f6ed4efa265a243f844a13c4a065bb25e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=AD=90=E5=88=9D?= Date: Tue, 30 Aug 2011 12:23:22 +0500 Subject: [PATCH 068/150] phone-pad:update mu509 drivers --- drivers/misc/mu509.c | 57 +++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/drivers/misc/mu509.c b/drivers/misc/mu509.c index 38e8dc82d8ab..b7948b84d38d 100644 --- a/drivers/misc/mu509.c +++ b/drivers/misc/mu509.c @@ -30,18 +30,19 @@ MODULE_LICENSE("GPL"); #endif #define SLEEP 1 #define READY 0 -#define MU509_RESET 0x01 static struct wake_lock modem_wakelock; #define IRQ_BB_WAKEUP_AP_TRIGGER IRQF_TRIGGER_FALLING //#define IRQ_BB_WAKEUP_AP_TRIGGER IRQF_TRIGGER_RISING +#define airplane_mode RK29_PIN6_PC1 +#define MU509_RESET 0x01 +#define AIRPLANE_MODE_OFF 0x03 +#define AIRPLANE_MODE_ON 0x00 struct rk29_mu509_data *gpdata = NULL; static int do_wakeup_irq = 0; static void ap_wakeup_bp(struct platform_device *pdev, int wake) { struct rk29_mu509_data *pdata = pdev->dev.platform_data; - //struct modem_dev *mu509_data = platform_get_drvdata(pdev); - MODEMDBG("ap_wakeup_bp\n"); gpio_set_value(pdata->ap_wakeup_bp, wake); @@ -50,7 +51,7 @@ extern void rk28_send_wakeup_key(void); static void do_wakeup(struct work_struct *work) { - printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); +// MODEMDBG("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); rk28_send_wakeup_key(); } @@ -60,7 +61,7 @@ static irqreturn_t detect_irq_handler(int irq, void *dev_id) if(do_wakeup_irq) { do_wakeup_irq = 0; - printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + // MODEMDBG("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); wake_lock_timeout(&modem_wakelock, 10 * HZ); schedule_delayed_work(&wakeup_work, HZ / 10); } @@ -71,21 +72,17 @@ int modem_poweron_off(int on_off) struct rk29_mu509_data *pdata = gpdata; if(on_off) { - printk("------------modem_poweron\n"); -// gpio_set_value(pdata->bp_power, pdata->bp_power_active_low? GPIO_LOW:GPIO_HIGH); -// mdelay(300); -// gpio_set_value(pdata->bp_reset, pdata->bp_reset_active_low? GPIO_HIGH:GPIO_LOW); -// msleep(4000); -// gpio_set_value(pdata->bp_power, pdata->bp_power_active_low? GPIO_HIGH:GPIO_LOW); + MODEMDBG("------------modem_poweron\n"); gpio_set_value(pdata->bp_power, GPIO_LOW); msleep(1000); gpio_set_value(pdata->bp_power, GPIO_HIGH); msleep(700); gpio_set_value(pdata->ap_wakeup_bp, GPIO_LOW); + gpio_set_value(airplane_mode, GPIO_HIGH); } else { - printk("------------modem_poweroff\n"); + MODEMDBG("------------modem_poweroff\n"); gpio_set_value(pdata->bp_power, GPIO_LOW); mdelay(2500); gpio_set_value(pdata->bp_power, GPIO_HIGH); @@ -94,22 +91,23 @@ int modem_poweron_off(int on_off) } static int mu509_open(struct inode *inode, struct file *file) { - printk("-------------%s\n",__FUNCTION__); - modem_poweron_off(1); + //MODEMDBG("-------------%s\n",__FUNCTION__); + struct rk29_mu509_data *pdata = gpdata; + struct platform_data *pdev = container_of(pdata, struct device, platform_data); + device_init_wakeup(&pdev, 1); return 0; } static int mu509_release(struct inode *inode, struct file *file) { - printk("-------------%s\n",__FUNCTION__); - //modem_poweron_off(0); + //MODEMDBG("-------------%s\n",__FUNCTION__); return 0; } static int mu509_ioctl(struct inode *inode,struct file *file, unsigned int cmd, unsigned long arg) { struct rk29_mu509_data *pdata = gpdata; - printk("-------------%s\n",__FUNCTION__); + //MODEMDBG("-------------%s\n",__FUNCTION__); switch(cmd) { case MU509_RESET: @@ -122,6 +120,13 @@ static int mu509_ioctl(struct inode *inode,struct file *file, unsigned int cmd, gpio_set_value(pdata->bp_power, GPIO_HIGH); msleep(700); gpio_set_value(pdata->ap_wakeup_bp, GPIO_LOW); + gpio_set_value(airplane_mode, GPIO_HIGH); + break; + case AIRPLANE_MODE_ON: + gpio_set_value(airplane_mode, GPIO_LOW); + break; + case AIRPLANE_MODE_OFF: + gpio_set_value(airplane_mode, GPIO_HIGH); break; default: break; @@ -147,7 +152,7 @@ static int mu509_probe(struct platform_device *pdev) struct rk29_mu509_data *pdata = gpdata = pdev->dev.platform_data; struct modem_dev *mu509_data = NULL; int result, irq = 0; - printk("-------------%s\n",__FUNCTION__); + //MODEMDBG("-------------%s\n",__FUNCTION__); modem_poweron_off(1); mu509_data = kzalloc(sizeof(struct modem_dev), GFP_KERNEL); if(mu509_data == NULL) @@ -182,11 +187,11 @@ static int mu509_probe(struct platform_device *pdev) goto err0; } enable_irq_wake(gpio_to_irq(pdata->bp_wakeup_ap)); - printk("%s: request_irq(%d) success\n", __func__, irq); + result = misc_register(&mu509_misc); if(result) { - MODEMDBG("misc_register err\n"); + printk("misc_register err\n"); } return result; err0: @@ -202,16 +207,14 @@ static int mu509_probe(struct platform_device *pdev) int mu509_suspend(struct platform_device *pdev) { do_wakeup_irq = 1; - //struct rk29_mu509_data *pdata = pdev->dev.platform_data; - printk("-------------%s\n",__FUNCTION__); + //MODEMDBG("-------------%s\n",__FUNCTION__); ap_wakeup_bp(pdev, 1); return 0; } int mu509_resume(struct platform_device *pdev) { - //struct rk29_mu509_data *pdata = pdev->dev.platform_data; - printk("-------------%s\n",__FUNCTION__); + //MODEMDBG("-------------%s\n",__FUNCTION__); ap_wakeup_bp(pdev, 0); return 0; } @@ -221,7 +224,7 @@ void mu509_shutdown(struct platform_device *pdev, pm_message_t state) struct rk29_mu509_data *pdata = pdev->dev.platform_data; struct modem_dev *mu509_data = platform_get_drvdata(pdev); - printk("-------------%s\n",__FUNCTION__); + //MODEMDBG("-------------%s\n",__FUNCTION__); modem_poweron_off(0); cancel_work_sync(&mu509_data->work); gpio_free(pdata->bp_power); @@ -244,13 +247,13 @@ static struct platform_driver mu509_driver = { static int __init mu509_init(void) { - printk("-------------%s\n",__FUNCTION__); + //MODEMDBG("-------------%s\n",__FUNCTION__); return platform_driver_register(&mu509_driver); } static void __exit mu509_exit(void) { - printk("-------------%s\n",__FUNCTION__); + //MODEMDBG("-------------%s\n",__FUNCTION__); platform_driver_unregister(&mu509_driver); } From 2e55b6ab05f7ef143fe2050eb29664b67425a74f Mon Sep 17 00:00:00 2001 From: eddie Date: Fri, 2 Sep 2011 17:48:00 +0800 Subject: [PATCH 069/150] add lock between cir and irda --- drivers/cir/bu92747guw_cir.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/cir/bu92747guw_cir.c b/drivers/cir/bu92747guw_cir.c index c63ea295a027..5362add3793d 100644 --- a/drivers/cir/bu92747guw_cir.c +++ b/drivers/cir/bu92747guw_cir.c @@ -59,19 +59,19 @@ static struct miscdevice bu92747guw_device; int repeat_flag=-1; int start_flag = 0; //mutex lock between remote and irda -static DEFINE_MUTEX(bu92747_mutex); -void bu92747_lock(void) -{ - mutex_lock(&bu92747_mutex); -} -//void bu92747_unlock(void) -//{ -// mutex_unlock(&bu92747_mutex); -//} +#ifdef CONFIG_RK_IRDA_UART +extern int bu92747_try_lock(void); +extern void bu92747_unlock(void); +#else +int bu92747_try_lock(void) {return 1;} +void bu92747_unlock(void) {return;} +#endif + + static int bu92747_cir_i2c_read_regs(struct i2c_client *client, u8 reg, u8 *buf, int len) { @@ -753,10 +753,18 @@ static int bu92747_open(struct inode *inode, struct file *file) struct i2c_client *client = container_of(bu92747guw_device.parent, struct i2c_client, dev); struct bu92747_data_info *bu92747 = (struct bu92747_data_info *)i2c_get_clientdata(client); struct bu92747guw_platform_data *pdata = bu92747->platdata; - + int ret = 0; BU92747_DBG("line %d: enter %s\n", __LINE__, __FUNCTION__); printk("bu92747_open\n"); + + + ret = bu92747_try_lock(); + if (ret == 0){ + printk("cannot get lock. Please close irda!\n"); + return -2; + } + bu92747->state = 0; start_flag = 0; repeat_flag = -1; @@ -799,6 +807,7 @@ static int bu92747_release(struct inode *inode, struct file *file) } // bu92747->state = BU92747_CLOSE; + bu92747_unlock(); BU92747_DBG("line %d: exit %s\n", __LINE__, __FUNCTION__); From 0f325c52e4b98a452b78c73002a2bf518a2990a3 Mon Sep 17 00:00:00 2001 From: eddie Date: Fri, 2 Sep 2011 17:49:01 +0800 Subject: [PATCH 070/150] newton:update board and config --- arch/arm/configs/rk29_newton_defconfig | 2 +- arch/arm/mach-rk29/board-rk29-newton.c | 41 +++++++++++++------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/arch/arm/configs/rk29_newton_defconfig b/arch/arm/configs/rk29_newton_defconfig index ed673fdc5ce1..0636befd0e8e 100644 --- a/arch/arm/configs/rk29_newton_defconfig +++ b/arch/arm/configs/rk29_newton_defconfig @@ -210,7 +210,7 @@ CONFIG_ARCH_RK29=y # CONFIG_MACH_RK29_PHONEPADSDK is not set CONFIG_MACH_RK29_newton=y # CONFIG_MACH_RK29_P91 is not set -# CONFIG_RK29_NEWTON_CLOCK is not set +CONFIG_RK29_NEWTON_CLOCK=y # CONFIG_DDR_TYPE_DDRII is not set # CONFIG_DDR_TYPE_LPDDR is not set # CONFIG_DDR_TYPE_DDR3_800D is not set diff --git a/arch/arm/mach-rk29/board-rk29-newton.c b/arch/arm/mach-rk29/board-rk29-newton.c index 0f7733e69b12..7b6ba896b403 100644 --- a/arch/arm/mach-rk29/board-rk29-newton.c +++ b/arch/arm/mach-rk29/board-rk29-newton.c @@ -60,12 +60,10 @@ #ifdef CONFIG_BU92747GUW_CIR #include "../../../drivers/cir/bu92747guw_cir.h" #endif -#ifdef CONFIG_RK29_NEWTON_CLOCK -// 1: newton for 1.2G -#define RK29_NEWTON_CPU_CLK 1 -// 1: newton for hardware 1.5V -#define RK29_NEWTON_NEWBOARD 1 -#endif + +// define for newton for hardware 1.5V +#define RK29_NEWTON_NEWBOARD + #ifdef CONFIG_VIDEO_RK29 /*---------------- Camera Sensor Macro Define Begin ------------------------*/ @@ -1390,7 +1388,11 @@ static struct regulator_init_data rk29_pwm_regulator_data = { .constraints = { .name = "PWM2", .min_uV = 950000, +#ifdef CONFIG_RK29_NEWTON_CLOCK + .max_uV = 1500000, +#else .max_uV = 1400000, +#endif .apply_uV = 1, .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE, }, @@ -1700,7 +1702,7 @@ static struct platform_device rk29sdk_rfkill = { #ifdef CONFIG_VIVANTE -#ifdef RK29_NEWTON_CPU_CLK +#ifdef CONFIG_RK29_NEWTON_CLOCK #define GPU_HIGH_CLOCK 504 // 504 456 #define GPU_LOW_CLOCK 300 #else @@ -2252,10 +2254,17 @@ static void __init machine_rk29_init_irq(void) } static struct cpufreq_frequency_table freq_table[] = { -#ifdef RK29_NEWTON_CPU_CLK +#ifdef CONFIG_RK29_NEWTON_CLOCK + { .index = 1200000, .frequency = 408000 }, + { .index = 1250000, .frequency = 816000 }, + { .index = 1300000, .frequency = 1008000 }, + { .index = 1460000, .frequency = 1200000 }, +#else +#ifdef RK29_NEWTON_NEWBOARD /* * hardware change the max vdd from 1.4 to 1.5, so new table is: * 1.075 -> 1.133 + * 1.1 -> 1.16 * 1.125 -> 1.20 * 1.15 -> 1.225 * 1.225 -> 1.313 @@ -2265,17 +2274,7 @@ static struct cpufreq_frequency_table freq_table[] = { * 1.40 -> 1.5 * */ - { .index = 1075000, .frequency = 408000 }, - { .index = 1150000, .frequency = 816000 }, - { .index = 1225000, .frequency = 1008000 }, - -// { .index = 1300000, .frequency = 1200000 }, -// { .index = 1325000, .frequency = 1200000 }, - { .index = 1350000, .frequency = 1200000 }, -// { .index = 1400000, .frequency = 1200000 }, -#else -#ifdef RK29_NEWTON_NEWBOARD - { .index = 1075000, .frequency = 408000 }, + { .index = 1125000, .frequency = 408000 }, { .index = 1150000, .frequency = 816000 }, { .index = 1225000, .frequency = 1008000 }, #else @@ -2283,7 +2282,7 @@ static struct cpufreq_frequency_table freq_table[] = { { .index = 1200000, .frequency = 816000 }, { .index = 1300000, .frequency = 1008000 }, #endif // RK29_NEWTON_NEWBOARD -#endif // RK29_NEWTON_CPU_CLK +#endif // CONFIG_RK29_NEWTON_CLOCK { .frequency = CPUFREQ_TABLE_END }, }; @@ -2348,7 +2347,7 @@ static void __init machine_rk29_mapio(void) rk29_map_common_io(); rk29_setup_early_printk(); rk29_sram_init(); -#ifdef RK29_NEWTON_CPU_CLK +#ifdef CONFIG_RK29_NEWTON_CLOCK rk29_clock_init(periph_pll_144mhz); #else rk29_clock_init(periph_pll_default); From 422e9e988f60a849bd69006d7a6d973a97c8a1c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 5 Sep 2011 10:12:39 +0800 Subject: [PATCH 071/150] input: eeti_egalax_i2c: fix unbalanced disable_irq/enable_irq --- drivers/input/touchscreen/eeti_egalax_i2c.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/input/touchscreen/eeti_egalax_i2c.c b/drivers/input/touchscreen/eeti_egalax_i2c.c index 65838a382435..9d165a4c3645 100755 --- a/drivers/input/touchscreen/eeti_egalax_i2c.c +++ b/drivers/input/touchscreen/eeti_egalax_i2c.c @@ -514,9 +514,8 @@ static void egalax_i2c_wq(struct work_struct *work) egalax_i2c->skip_packet = 0; mutex_unlock(&egalax_i2c->mutex_wq); - - if( egalax_i2c->work_state > 0 ) - enable_irq(p_egalax_i2c_dev->irq); + + enable_irq(p_egalax_i2c_dev->irq); TS_DEBUG("egalax_i2c_wq leave\n"); } @@ -562,9 +561,13 @@ static int egalax_i2c_suspend(struct i2c_client *client, pm_message_t mesg) i2c_master_normal_send(client, cmdbuf, MAX_I2C_LEN, EETI_I2C_RATE); - egalax_i2c->work_state = 0; disable_irq(p_egalax_i2c_dev->irq); - cancel_work_sync(&egalax_i2c->work); + egalax_i2c->work_state = 0; + if (cancel_work_sync(&egalax_i2c->work)) { + /* if work was pending disable-count is now 2 */ + pr_info("%s: work was pending\n", __func__); + enable_irq(p_egalax_i2c_dev->irq); + } printk(KERN_DEBUG "[egalax_i2c]: device suspend done\n"); From 787482795f08208689809f54a0d5c0ed76ee06dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 5 Sep 2011 10:38:45 +0800 Subject: [PATCH 072/150] ddr3sdk: fix "TOUCH_SCREEN_DISPLAY_PIN gpio_request err" warning --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index de48ad040ab4..49311b77156d 100644 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -260,7 +260,7 @@ static int rk29_fb_io_init(struct rk29_fb_setting_info *fb_setting) printk(">>>>>> FB_DISPLAY_ON_PIN gpio_request err \n "); } } - else + else if (TOUCH_SCREEN_DISPLAY_PIN != INVALID_GPIO) { ret = gpio_request(TOUCH_SCREEN_DISPLAY_PIN, NULL); if(ret != 0) @@ -284,7 +284,7 @@ static int rk29_fb_io_init(struct rk29_fb_setting_info *fb_setting) printk(">>>>>> FB_LCD_STANDBY_PIN gpio_request err \n "); } } - else + else if (TOUCH_SCREEN_STANDBY_PIN != INVALID_GPIO) { ret = gpio_request(TOUCH_SCREEN_STANDBY_PIN, NULL); if(ret != 0) From a5ee543b51e100e324f1c5f8207567cb20507dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=B4?= Date: Sun, 4 Sep 2011 19:57:00 -0700 Subject: [PATCH 073/150] rk29-ddr3sdk:set keygpio pullup/down disable when in sleep --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 39 +++++++++++++++++++++++++ arch/arm/mach-rk29/gpio.c | 16 ++++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk29/board-rk29-ddr3sdk.c mode change 100644 => 100755 arch/arm/mach-rk29/gpio.c diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c old mode 100644 new mode 100755 index 49311b77156d..92b6c95e9bb7 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -164,6 +164,45 @@ struct rk29_nand_platform_data rk29_nand_data = { #define TOUCH_SCREEN_STANDBY_VALUE GPIO_HIGH #define TOUCH_SCREEN_DISPLAY_PIN INVALID_GPIO #define TOUCH_SCREEN_DISPLAY_VALUE GPIO_HIGH + +#if 1 +void key_gpio_pullupdown_enable(void) +{ gpio_pull_updown(RK29_PIN6_PA0, 0); + gpio_pull_updown(RK29_PIN6_PA1, 0); + gpio_pull_updown(RK29_PIN6_PA2, 0); + gpio_pull_updown(RK29_PIN6_PA3, 0); + gpio_pull_updown(RK29_PIN6_PA4, 0); + gpio_pull_updown(RK29_PIN6_PA5, 0); + gpio_pull_updown(RK29_PIN6_PA6, 0); + +} +void key_gpio_pullupdown_disable(void) +{ + gpio_pull_updown(RK29_PIN6_PA0, 1); + gpio_pull_updown(RK29_PIN6_PA1, 1); + gpio_pull_updown(RK29_PIN6_PA2, 1); + gpio_pull_updown(RK29_PIN6_PA3, 1); + gpio_pull_updown(RK29_PIN6_PA4, 1); + gpio_pull_updown(RK29_PIN6_PA5, 1); + gpio_pull_updown(RK29_PIN6_PA6, 1); +} +void rk29_setgpio_suspend_board(void) +{ + + key_gpio_pullupdown_enable(); + +} + +void rk29_setgpio_resume_board(void) +{ + + key_gpio_pullupdown_disable(); + + } +#endif + + + #ifdef CONFIG_FB_RK29 /***************************************************************************************** * lcd devices diff --git a/arch/arm/mach-rk29/gpio.c b/arch/arm/mach-rk29/gpio.c old mode 100644 new mode 100755 index 634e97b28d41..a52071caa03c --- a/arch/arm/mach-rk29/gpio.c +++ b/arch/arm/mach-rk29/gpio.c @@ -550,12 +550,22 @@ void __init rk29_gpio_init(void) } rk29_gpio_irq_setup(); } +__weak void rk29_setgpio_suspend_board(void) +{ +} +__weak void rk29_setgpio_resume_board(void) +{ + +} #ifdef CONFIG_PM + static int rk29_gpio_suspend(struct sys_device *dev, pm_message_t mesg) { unsigned i; - + + rk29_setgpio_suspend_board(); + for (i = 0; i < MAX_BANK; i++) { struct rk29_gpio_chip *rk29_gpio = &rk29gpio_chip[i]; @@ -572,7 +582,9 @@ static int rk29_gpio_suspend(struct sys_device *dev, pm_message_t mesg) static int rk29_gpio_resume(struct sys_device *dev) { unsigned i; - + + rk29_setgpio_resume_board(); + for (i = 0; i < MAX_BANK; i++) { struct rk29_gpio_chip *rk29_gpio = &rk29gpio_chip[i]; From 8b1e002a454b078fbea53a48e2c146a53d782fb4 Mon Sep 17 00:00:00 2001 From: xbw Date: Mon, 5 Sep 2011 16:21:48 +0800 Subject: [PATCH 074/150] modify a bug about the parameter for printk which cause panic --- drivers/mmc/host/rk29_sdmmc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 87bfb41b5e53..ae9f6c322c5e 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -2510,15 +2510,15 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) && (rk29_sdmmc_test_pending(host, EVENT_CMD_COMPLETE)|| rk29_sdmmc_test_pending(host, EVENT_DATA_COMPLETE) ); if(pending_flag) { - printk("%s..%d... cmd=%d(arg=0x%x),completedone=%d, retrycount=%d, doneflag=%d, \n \ + xbwprintk(7, "%s..%d... cmd=%d(arg=0x%x),completedone=%d, retrycount=%d, doneflag=%d, \n \ host->state=0x%x, switchstate=%x, \n \ pendingEvent=0x%lu, completeEvents=0x%lu, \n \ mrqCMD=%d, arg=0x%x \n ====xbw[%s]====\n",\ __FUNCTION__, __LINE__,host->cmd->opcode, host->cmd->arg, host->complete_done,\ host->retryfunc, host->mmc->doneflag,host->state, state, \ - host->pending_events,host->completed_events,host->dma_name, \ - host->mrq->cmd->opcode, host->mrq->cmd->arg); + host->pending_events,host->completed_events,\ + host->mrq->cmd->opcode, host->mrq->cmd->arg, host->dma_name); cpu_relax(); } From 6d247d11aed66288035669417c1f3f62d10ae28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E4=BC=9F=E7=AB=8B?= Date: Mon, 5 Sep 2011 18:31:29 +0800 Subject: [PATCH 075/150] close rtc out clock when system powerdown --- drivers/rtc/rtc-HYM8563.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) mode change 100644 => 100755 drivers/rtc/rtc-HYM8563.c diff --git a/drivers/rtc/rtc-HYM8563.c b/drivers/rtc/rtc-HYM8563.c old mode 100644 new mode 100755 index 341f20d550d9..c949925e0055 --- a/drivers/rtc/rtc-HYM8563.c +++ b/drivers/rtc/rtc-HYM8563.c @@ -478,6 +478,19 @@ static int __devexit hym8563_remove(struct i2c_client *client) return 0; } + +void hym8563_shutdown(struct i2c_client * client) +{ u8 regs[2]; + int ret; + //disable clkout + regs[0] = 0x00; + ret=hym8563_i2c_set_regs(client, RTC_CLKOUT, regs, 1); + if(ret<0) + printk("rtc shutdown is error\n"); +} + + + static const struct i2c_device_id hym8563_id[] = { { "rtc_hym8563", 0 }, { } @@ -491,6 +504,7 @@ static struct i2c_driver hym8563_driver = { }, .probe = hym8563_probe, .remove = __devexit_p(hym8563_remove), + .shutdown=hym8563_shutdown, .id_table = hym8563_id, }; From c2f4bad86bd77de512dcf9b6b09d575797b37a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 6 Sep 2011 16:27:01 +0800 Subject: [PATCH 076/150] rk29: ddr3sdk: fix warning: android_pmem: probe of android_pmem.3 failed with error -1 --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 92b6c95e9bb7..3cc9040611fb 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -125,7 +125,7 @@ #define MEM_CAMIPP_BASE (PMEM_CAM_BASE - MEM_CAMIPP_SIZE) #define MEM_FB_BASE (MEM_CAMIPP_BASE - MEM_FB_SIZE) #define MEM_FBIPP_BASE (MEM_FB_BASE - MEM_FBIPP_SIZE) -#define PMEM_SKYPE_BASE (MEM_FBIPP_BASE - PMEM_SKYPE_SIZE) +#define PMEM_SKYPE_BASE (MEM_FBIPP_BASE - PMEM_SKYPE_SIZE) #define LINUX_SIZE (PMEM_SKYPE_BASE - RK29_SDRAM_PHYS) #define PREALLOC_WLAN_SEC_NUM 4 @@ -781,6 +781,8 @@ static struct platform_device rk29_vpu_mem_device = { .platform_data = &vpu_mem_pdata, }, }; + +#if PMEM_SKYPE_SIZE > 0 static struct android_pmem_platform_data android_pmem_skype_pdata = { .name = "pmem_skype", .start = PMEM_SKYPE_BASE, @@ -796,6 +798,8 @@ static struct platform_device android_pmem_skype_device = { .platform_data = &android_pmem_skype_pdata, }, }; +#endif + #ifdef CONFIG_VIDEO_RK29XX_VOUT static struct platform_device rk29_v4l2_output_devce = { .name = "rk29_vout", @@ -2036,7 +2040,9 @@ static struct platform_device *devices[] __initdata = { &rk29_soc_camera_pdrv_1, &android_pmem_cam_device, #endif - &android_pmem_skype_device, +#if PMEM_SKYPE_SIZE > 0 + &android_pmem_skype_device, +#endif &android_pmem_device, &rk29_vpu_mem_device, #ifdef CONFIG_USB20_OTG From f12ea86e15a4de9ffd3b0f8fee1777d19a1eafcf Mon Sep 17 00:00:00 2001 From: root Date: Fri, 2 Sep 2011 14:30:14 +0800 Subject: [PATCH 077/150] A22:mask some log of touchscreen --- drivers/input/touchscreen/ili2102_ts.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/input/touchscreen/ili2102_ts.c b/drivers/input/touchscreen/ili2102_ts.c index e1218d2fbd5b..d95e9bc22c00 100755 --- a/drivers/input/touchscreen/ili2102_ts.c +++ b/drivers/input/touchscreen/ili2102_ts.c @@ -151,7 +151,7 @@ static ssize_t ilitek_file_write(struct file *filp, const char *buf, size_t coun msg[0].scl_rate = 400*1000; msg[0].udelay = 80; - printk("%s:count=0x%x\n",__FUNCTION__,count); + DBG("%s:count=0x%x\n",__FUNCTION__,count); // before sending data to touch device, we need to check whether the device is working or not if(g_ts->valid_i2c_register == 0){ @@ -266,7 +266,7 @@ static int ilitek_file_ioctl(struct inode *inode, struct file *filp, unsigned in return -1; } - printk("%s:cmd=0x%x\n",__FUNCTION__,cmd); + DBG("%s:cmd=0x%x\n",__FUNCTION__,cmd); return 0; } From 2d2868b6b36e8bd3ea4dce450618a0ba395b8bc3 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 2 Sep 2011 14:50:35 +0800 Subject: [PATCH 078/150] A22:set number of LUNS to one --- arch/arm/mach-rk29/board-rk29-a22.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c index d86312438136..0d539a68eb0a 100755 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -3030,6 +3030,7 @@ static void rk29_pm_power_off(void) while (1); } +extern struct usb_mass_storage_platform_data mass_storage_pdata; static void __init machine_rk29_board_init(void) { rk29_board_iomux_init(); @@ -3040,6 +3041,8 @@ static void __init machine_rk29_board_init(void) pm_power_off = rk29_pm_power_off; //arm_pm_restart = rk29_pm_power_restart; + mass_storage_pdata.nluns = 1;//change number of LUNS + platform_add_devices(devices, ARRAY_SIZE(devices)); #ifdef CONFIG_I2C0_RK29 i2c_register_board_info(default_i2c0_data.bus_num, board_i2c0_devices, From 673b8fbe391ff502549c1956392c285940ae3b47 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 7 Sep 2011 17:21:57 +0800 Subject: [PATCH 079/150] A22:modify lcd width and height to support android input method --- drivers/video/display/screen/lcd_nt35510.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/video/display/screen/lcd_nt35510.c b/drivers/video/display/screen/lcd_nt35510.c index 97f8546658d9..90ba8a1cb7ae 100755 --- a/drivers/video/display/screen/lcd_nt35510.c +++ b/drivers/video/display/screen/lcd_nt35510.c @@ -24,8 +24,8 @@ #define V_VD 800//480 //***480 #define V_FP 8//40 -#define LCD_WIDTH 800 //need modify //rk29 -#define LCD_HEIGHT 480 +#define LCD_WIDTH 57 //lcd size *mm +#define LCD_HEIGHT 94 /* Other */ #define DCLK_POL 1//0 From c229917263746ba765e7b4f3b9b0e8ebf872f7f3 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 7 Sep 2011 18:01:12 +0800 Subject: [PATCH 080/150] A22:update rk29_a22_defconfig from phonesdk Conflicts: arch/arm/configs/rk29_a22_defconfig --- arch/arm/configs/rk29_a22_defconfig | 106 ++++++++++++++++------------ 1 file changed, 59 insertions(+), 47 deletions(-) mode change 100755 => 100644 arch/arm/configs/rk29_a22_defconfig diff --git a/arch/arm/configs/rk29_a22_defconfig b/arch/arm/configs/rk29_a22_defconfig old mode 100755 new mode 100644 index 4e8016e58c4d..29cb79c8b9c6 --- a/arch/arm/configs/rk29_a22_defconfig +++ b/arch/arm/configs/rk29_a22_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.32.27 -# Wed Jul 13 20:55:31 2011 +# Thu Aug 25 15:26:43 2011 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -35,6 +35,12 @@ CONFIG_LOCK_KERNEL=y CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_LZO=y +# CONFIG_KERNEL_GZIP is not set +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +CONFIG_KERNEL_LZO=y # CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set @@ -52,7 +58,7 @@ CONFIG_RCU_FANOUT=32 # CONFIG_RCU_FANOUT_EXACT is not set # CONFIG_TREE_RCU_TRACE is not set # CONFIG_IKCONFIG is not set -CONFIG_LOG_BUF_SHIFT=17 +CONFIG_LOG_BUF_SHIFT=19 CONFIG_CGROUPS=y CONFIG_CGROUP_DEBUG=y # CONFIG_CGROUP_NS is not set @@ -193,9 +199,7 @@ CONFIG_MMU=y # CONFIG_ARCH_DAVINCI is not set # CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_BCMRING is not set -# CONFIG_ARCH_RK2818 is not set CONFIG_ARCH_RK29=y -CONFIG_WIFI_CONTROL_FUNC=y # CONFIG_MACH_RK29SDK is not set # CONFIG_MACH_RK29SDK_DDR3 is not set # CONFIG_MACH_RK29WINACCORD is not set @@ -229,14 +233,17 @@ CONFIG_DDR_TYPE_LPDDR=y # CONFIG_DDR_TYPE_DDR3_2133M is not set # CONFIG_DDR_TYPE_DDR3_2133N is not set # CONFIG_DDR_TYPE_DDR3_DEFAULT is not set +CONFIG_RK29_MEM_SIZE_512M=y +# CONFIG_RK29_MEM_SIZE_1G is not set CONFIG_RK29_MEM_SIZE_M=512 CONFIG_DDR_SDRAM_FREQ=192 +# CONFIG_DDR_RECONFIG is not set +CONFIG_WIFI_CONTROL_FUNC=y # # RK29 VPU (Video Processing Unit) support # CONFIG_RK29_VPU=y -CONFIG_RK29_VPU_SERVICE=y # CONFIG_RK29_VPU_DEBUG is not set # CONFIG_RK29_JTAG is not set CONFIG_RK29_LAST_LOG=y @@ -248,6 +255,7 @@ CONFIG_RK29_WORKING_POWER_MANAGEMENT=y CONFIG_RK29_CLK_SWITCH_TO_32K=y CONFIG_RK29_GPIO_SUSPEND=y CONFIG_RK29_SPI_INSRAM=y +# CONFIG_RK29_CHARGE_EARLYSUSPEND is not set # # Processor Type @@ -441,7 +449,27 @@ CONFIG_INET_TCP_DIAG=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -# CONFIG_IPV6 is not set +CONFIG_IPV6=y +CONFIG_IPV6_PRIVACY=y +CONFIG_IPV6_ROUTER_PREF=y +# CONFIG_IPV6_ROUTE_INFO is not set +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_INET6_XFRM_TUNNEL=y +CONFIG_INET6_TUNNEL=y +CONFIG_INET6_XFRM_MODE_TRANSPORT=y +CONFIG_INET6_XFRM_MODE_TUNNEL=y +CONFIG_INET6_XFRM_MODE_BEET=y +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=y +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=y +CONFIG_IPV6_MULTIPLE_TABLES=y +# CONFIG_IPV6_SUBTREES is not set +# CONFIG_IPV6_MROUTE is not set CONFIG_ANDROID_PARANOID_NETWORK=y # CONFIG_NETWORK_SECMARK is not set # CONFIG_NETFILTER is not set @@ -634,7 +662,7 @@ CONFIG_ANDROID_PMEM=y # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_KERNEL_DEBUGGER_CORE is not set # CONFIG_ISL29003 is not set -# CONFIG_UID_STAT is not set +CONFIG_UID_STAT=y # CONFIG_WL127X_RFKILL is not set CONFIG_APANIC=y CONFIG_APANIC_PLABEL="kpanic" @@ -653,6 +681,7 @@ CONFIG_MTK23D=y # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set +# CONFIG_RK29_SUPPORT_MODEM is not set CONFIG_RK29_GPS=y CONFIG_GPS_GNS7560=y @@ -660,8 +689,9 @@ CONFIG_GPS_GNS7560=y # Motion Sensors Support # # CONFIG_MPU_NONE is not set -# CONFIG_SENSORS_MPU3050 is not set -# CONFIG_SENSORS_MPU6000 is not set +# CONFIG_MPU_SENSORS_MPU3050 is not set +# CONFIG_MPU_SENSORS_MPU6000 is not set +# CONFIG_MPU_SENSORS_TIMERIRQ is not set CONFIG_HAVE_IDE=y # CONFIG_IDE is not set @@ -869,10 +899,12 @@ CONFIG_TOUCHSCREEN_ILI2102_IIC=y # CONFIG_SINTEK_3FA16 is not set # CONFIG_EETI_EGALAX is not set # CONFIG_TOUCHSCREEN_IT7260 is not set +# CONFIG_TOUCHSCREEN_NAS is not set +# CONFIG_LAIBAO_TS is not set # CONFIG_TOUCHSCREEN_GT801_IIC is not set # CONFIG_TOUCHSCREEN_GT818_IIC is not set # CONFIG_D70_L3188A is not set -# CONFIG_TOUCHSCREEN_GOODIX_NEWTON is not set +# CONFIG_TOUCHSCREEN_GT819 is not set # CONFIG_TOUCHSCREEN_FT5406 is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_LPSENSOR_ISL29028 is not set @@ -1011,7 +1043,6 @@ CONFIG_SPIM1_RK29=y CONFIG_ADC=y # CONFIG_ADC_RK28 is not set CONFIG_ADC_RK29=y -# CONFIG_SPI_FPGA is not set # # Headset device support @@ -1074,6 +1105,7 @@ CONFIG_WM831X_WITH_BATTERY=y # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_STC3100 is not set # CONFIG_BATTERY_BQ27510 is not set +# CONFIG_BATTERY_BQ27541 is not set # CONFIG_BATTERY_BQ3060 is not set # CONFIG_HWMON is not set # CONFIG_THERMAL is not set @@ -1101,7 +1133,6 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_TC6387XB is not set # CONFIG_MFD_TC6393XB is not set # CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_WM8994 is not set # CONFIG_MFD_WM8400 is not set CONFIG_MFD_WM831X=y # CONFIG_MFD_WM831X_I2C is not set @@ -1189,6 +1220,7 @@ CONFIG_SOC_CAMERA_MT9T111=y # CONFIG_SOC_CAMERA_OV5640 is not set # CONFIG_SOC_CAMERA_S5K6AA is not set # CONFIG_SOC_CAMERA_GT2005 is not set +# CONFIG_SOC_CAMERA_GC0307 is not set # CONFIG_SOC_CAMERA_GC0308 is not set CONFIG_SOC_CAMERA_GC0309=y # CONFIG_SOC_CAMERA_GC2015 is not set @@ -1276,6 +1308,7 @@ CONFIG_DISPLAY_SUPPORT=y # CONFIG_LCD_RGB_TFT480800_25_E is not set # CONFIG_LCD_HSD100PXN is not set # CONFIG_LCD_HSD07PFW1 is not set +# CONFIG_LCD_BYD8688FTGF is not set # CONFIG_LCD_B101AW06 is not set # CONFIG_LCD_LS035Y8DX02A is not set # CONFIG_LCD_CPTCLAA038LA31XE is not set @@ -1421,27 +1454,28 @@ CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set CONFIG_MMC_UNSAFE_RESUME=y CONFIG_MMC_EMBEDDED_SDIO=y -# CONFIG_MMC_PARANOID_SD_INIT is not set +CONFIG_MMC_PARANOID_SD_INIT=y # # MMC/SD/SDIO Card Drivers # CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_BOUNCE=y -CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +# CONFIG_MMC_BLOCK_DEFERRED_RESUME is not set # CONFIG_SDIO_UART is not set # CONFIG_MMC_TEST is not set # # MMC/SD/SDIO Host Controller Drivers # +CONFIG_SDMMC_RK29_OLD=y CONFIG_SDMMC_RK29=y # # Now, there are two SDMMC controllers selected, SDMMC0 and SDMMC1. # +# CONFIG_SDMMC_RK29_OLD is not set CONFIG_SDMMC0_RK29=y -# CONFIG_EMMC_RK29 is not set CONFIG_SDMMC1_RK29=y # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_AT91 is not set @@ -1456,6 +1490,7 @@ CONFIG_LEDS_CLASS=y # CONFIG_LEDS_PCA9532 is not set CONFIG_LEDS_GPIO=y CONFIG_LEDS_GPIO_PLATFORM=y +# CONFIG_LEDS_NEWTON_PWM is not set # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_PCA955X is not set CONFIG_LEDS_WM831X_STATUS=y @@ -1577,21 +1612,6 @@ CONFIG_ANDROID_LOW_MEMORY_KILLER=y # CONFIG_RAR_REGISTER is not set # CONFIG_IIO is not set -# -# DSP -# -# CONFIG_RK2818_DSP is not set - -# -# RK1000 control -# -# CONFIG_RK1000_CONTROL is not set - -# -# rk2818 POWER CONTROL -# -# CONFIG_RK2818_POWER is not set - # # GPU Vivante # @@ -1601,6 +1621,7 @@ CONFIG_VIVANTE=y # IPP # CONFIG_RK29_IPP=y +# CONFIG_DEINTERLACE is not set # # CMMB @@ -1620,12 +1641,12 @@ CONFIG_RK29_IPP=y # CONFIG_EXT2_FS is not set CONFIG_EXT3_FS=y CONFIG_EXT3_DEFAULTS_TO_ORDERED=y -CONFIG_EXT3_FS_XATTR=y -# CONFIG_EXT3_FS_POSIX_ACL is not set -# CONFIG_EXT3_FS_SECURITY is not set -# CONFIG_EXT4_FS is not set +# CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y +# CONFIG_EXT4_FS_XATTR is not set +# CONFIG_EXT4_DEBUG is not set CONFIG_JBD=y -CONFIG_FS_MBCACHE=y +CONFIG_JBD2=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set # CONFIG_FS_POSIX_ACL is not set @@ -1641,7 +1662,8 @@ CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set -# CONFIG_FUSE_FS is not set +CONFIG_FUSE_FS=y +# CONFIG_CUSE is not set # # Caches @@ -1683,17 +1705,7 @@ CONFIG_MISC_FILESYSTEMS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set -CONFIG_YAFFS_FS=y -CONFIG_YAFFS_YAFFS1=y -# CONFIG_YAFFS_9BYTE_TAGS is not set -# CONFIG_YAFFS_DOES_ECC is not set -CONFIG_YAFFS_YAFFS2=y -CONFIG_YAFFS_AUTO_YAFFS2=y -# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set -# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set -# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set -CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y -# CONFIG_YAFFS_EMPTY_LOST_AND_FOUND is not set +# CONFIG_YAFFS_FS is not set # CONFIG_JFFS2_FS is not set CONFIG_CRAMFS=y # CONFIG_SQUASHFS is not set From 3cbf2a22444c03b72a132464405cea7557112a53 Mon Sep 17 00:00:00 2001 From: yangkai Date: Thu, 8 Sep 2011 10:11:17 +0800 Subject: [PATCH 081/150] msc ext command update by ly&hsl --- drivers/usb/gadget/f_mass_storage.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 32bf6fcc625e..e5efee14a184 100755 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -1861,7 +1861,7 @@ typedef struct tagLoaderParam int crc; } PARM_INFO; #define PARM_TAG 0x4D524150 -#define MSC_EXT_DBG 1 +#define MSC_EXT_DBG 0 extern int GetParamterInfo(char * pbuf , int len); /* the buf is bh->buf,it is large enough. */ @@ -1975,13 +1975,21 @@ static int do_get_versions( int ret ,char* buf ) ver[4] = ASC_BCD1(p_f[0])|ASC_BCD0(p_f[1]); p_f+=3; } - ver[2] = ASC_BCD0(p_f[0]); - p_f++; - if( p_f[0] != ' ' ){ - ver[2] |= ASC_BCD1(p_f[0]); - p_f++; - } +// ver[2] = ASC_BCD0(p_f[0]); +// p_f++; +// if( p_f[0] != ' ' ){ +// ver[2] |= ASC_BCD1(p_f[0]); +// p_f++; +// } // only support 2 byte version. + if ((p_f[1]>='0')&&(p_f[1]<='9')) + { + ver[2] = ASC_BCD1(p_f[0])|ASC_BCD0(p_f[1]); + } + else + { + ver[2] = ASC_BCD0(p_f[0]); + } ver[3] = 0; #if MSC_EXT_DBG From 698e8886cc47b3c87d8c3e85efbc34ac88a9e92c Mon Sep 17 00:00:00 2001 From: zyw Date: Thu, 8 Sep 2011 10:19:07 +0800 Subject: [PATCH 082/150] modify fb pixclock for android refresh rate --- drivers/video/rk29_fb.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index fdba47c940a7..931849ade0a9 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -670,7 +670,7 @@ void load_screen(struct fb_info *info, bool initscreen) { printk(KERN_ERR ">>>>>> set lcdc dclk failed\n"); } - + inf->fb0->var.pixclock = inf->fb1->var.pixclock = div_u64(1000000000000llu, screen->pixclock); if(initscreen) { ret = clk_set_parent(inf->aclk, inf->aclk_parent); @@ -2774,7 +2774,7 @@ static int __init rk29fb_probe (struct platform_device *pdev) inf->fb0->var.yres_virtual = screen->y_res; inf->fb0->var.width = screen->width; inf->fb0->var.height = screen->height; - inf->fb0->var.pixclock = screen->pixclock; + inf->fb0->var.pixclock = div_u64(1000000000000llu, screen->pixclock); inf->fb0->var.left_margin = screen->left_margin; inf->fb0->var.right_margin = screen->right_margin; inf->fb0->var.upper_margin = screen->upper_margin; @@ -2863,7 +2863,7 @@ static int __init rk29fb_probe (struct platform_device *pdev) inf->fb1->var.yres_virtual = screen->y_res; inf->fb1->var.width = screen->width; inf->fb1->var.height = screen->height; - inf->fb1->var.pixclock = screen->pixclock; + inf->fb1->var.pixclock = div_u64(1000000000000llu, screen->pixclock); inf->fb1->var.left_margin = screen->left_margin; inf->fb1->var.right_margin = screen->right_margin; inf->fb1->var.upper_margin = screen->upper_margin; From c8b511f89f2f8dc73162aac9837c0e548c7e0aff Mon Sep 17 00:00:00 2001 From: zyw Date: Thu, 8 Sep 2011 10:53:19 +0800 Subject: [PATCH 083/150] update fb for accurate dclk --- drivers/video/rk29_fb.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index 931849ade0a9..a8b1a2fcec80 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -670,7 +670,7 @@ void load_screen(struct fb_info *info, bool initscreen) { printk(KERN_ERR ">>>>>> set lcdc dclk failed\n"); } - inf->fb0->var.pixclock = inf->fb1->var.pixclock = div_u64(1000000000000llu, screen->pixclock); + inf->fb0->var.pixclock = inf->fb1->var.pixclock = div_u64(1000000000000llu, clk_get_rate(inf->dclk)); if(initscreen) { ret = clk_set_parent(inf->aclk, inf->aclk_parent); @@ -2774,7 +2774,7 @@ static int __init rk29fb_probe (struct platform_device *pdev) inf->fb0->var.yres_virtual = screen->y_res; inf->fb0->var.width = screen->width; inf->fb0->var.height = screen->height; - inf->fb0->var.pixclock = div_u64(1000000000000llu, screen->pixclock); + //inf->fb0->var.pixclock = div_u64(1000000000000llu, screen->pixclock); inf->fb0->var.left_margin = screen->left_margin; inf->fb0->var.right_margin = screen->right_margin; inf->fb0->var.upper_margin = screen->upper_margin; @@ -2863,7 +2863,7 @@ static int __init rk29fb_probe (struct platform_device *pdev) inf->fb1->var.yres_virtual = screen->y_res; inf->fb1->var.width = screen->width; inf->fb1->var.height = screen->height; - inf->fb1->var.pixclock = div_u64(1000000000000llu, screen->pixclock); + //inf->fb1->var.pixclock = div_u64(1000000000000llu, screen->pixclock); inf->fb1->var.left_margin = screen->left_margin; inf->fb1->var.right_margin = screen->right_margin; inf->fb1->var.upper_margin = screen->upper_margin; From bcf12b26cd9475e81d26113e4ed59a04634b8ba0 Mon Sep 17 00:00:00 2001 From: xbw Date: Fri, 9 Sep 2011 11:40:23 +0800 Subject: [PATCH 084/150] fix crash: INC_CD come during dealing with doneflag. --- drivers/mmc/host/rk29_sdmmc.c | 55 ++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index ae9f6c322c5e..650ef1d264cf 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.06 The last modify date is 2011-09-01,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.07 The last modify date is 2011-09-09,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -752,6 +752,9 @@ static void send_stop_cmd(struct rk29_sdmmc *host) } host->cmdr = rk29_sdmmc_prepare_command(&host->stopcmd); + + rk29_sdmmc_wait_unbusy(host); + rk29_sdmmc_start_command(host, &host->stopcmd, host->cmdr); } @@ -1588,6 +1591,9 @@ void rk29_sdmmc_set_frq(struct rk29_sdmmc *host) static void rk29_sdmmc_dealwith_timeout(struct rk29_sdmmc *host) { + if(0 == host->mmc->doneflag) + return; //not to generate error flag if the command has been over. + switch(host->state) { case STATE_IDLE: @@ -1799,12 +1805,18 @@ static int rk29_sdmmc_start_request(struct mmc_host *mmc ) } host->state = STATE_IDLE; //modifyed by xbw at 2011-08-15 - spin_unlock_irqrestore(&host->lock, iflags); - + if(host->mrq && host->mmc->doneflag) { + host->mmc->doneflag = 0; + spin_unlock_irqrestore(&host->lock, iflags); + mmc_request_done(host->mmc, host->mrq); } + else + { + spin_unlock_irqrestore(&host->lock, iflags); + } return ret; @@ -1868,7 +1880,7 @@ static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq) } else { - if(host->error_times++ % (RK29_ERROR_PRINTK_INTERVAL*2) ==0) + if(host->error_times++ % (RK29_ERROR_PRINTK_INTERVAL*3) ==0) { printk("%s: Refuse to run CMD%2d(arg=0x%8x) due to the removal of card. 3==xbw[%s]==\n", \ __FUNCTION__, mrq->cmd->opcode, mrq->cmd->arg, host->dma_name); @@ -2390,12 +2402,14 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) struct rk29_sdmmc *host = (struct rk29_sdmmc *)priv; struct mmc_data *data = host->cmd->data; enum rk29_sdmmc_state state = host->state; - int pending_flag; + int pending_flag, stopflag; spin_lock(&host->lock); state = host->state; pending_flag = 0; + stopflag = 0; + do { switch (state) @@ -2441,8 +2455,12 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) xbwprintk(7, "%s..%d.. cmderr, so call send_stop_cmd() ====xbw[%s]====\n", \ __FUNCTION__, __LINE__, host->dma_name); + #if 0 state = STATE_SENDING_CMD;//STATE_SENDING_STOP; - send_stop_cmd(host); + send_stop_cmd(host); + #else + stopflag = 1; //Moidfyed by xbw at 2011-09-08 + #endif break; } @@ -2482,9 +2500,14 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) xbwprintk(7, "%s..%d.. after DATA_COMPLETE, so call send_stop_cmd() ====xbw[%s]====\n", \ __FUNCTION__, __LINE__, host->dma_name); - + + #if 0 state = STATE_SENDING_CMD; send_stop_cmd(host); + #else + stopflag = 1; //Moidfyed by xbw at 2011-09-08 + #endif + break; } @@ -2525,9 +2548,15 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) } while(pending_flag && ++host->retryfunc); //while(0); + if(1==stopflag) + { + state = STATE_SENDING_CMD; + send_stop_cmd(host); //Moidfyed by xbw at 2011-09-08 + } + host->state = state; -unlock: +unlock: if(0==host->complete_done) { spin_unlock(&host->lock); @@ -2535,12 +2564,18 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) } host->state = STATE_IDLE; - spin_unlock(&host->lock); - + if(host->mrq && host->mmc->doneflag) { + host->mmc->doneflag = 0; + spin_unlock(&host->lock); + mmc_request_done(host->mmc, host->mrq); } + else + { + spin_unlock(&host->lock); + } } From a11a4258be8f4be30da1cd7f25cc031bc4326998 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 9 Sep 2011 14:20:10 +0800 Subject: [PATCH 085/150] A22:update board-rk29-a22.c from phonesdk --- arch/arm/mach-rk29/board-rk29-a22.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) mode change 100755 => 100644 arch/arm/mach-rk29/board-rk29-a22.c diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c old mode 100755 new mode 100644 index 0d539a68eb0a..97d6f4520140 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -133,7 +133,11 @@ #else #define MEM_FBIPP_SIZE 0 #endif -#define PMEM_GPU_BASE ((u32)RK29_SDRAM_PHYS + SDRAM_SIZE - PMEM_GPU_SIZE) +#if SDRAM_SIZE > SZ_512M +#define PMEM_GPU_BASE (RK29_SDRAM_PHYS + SZ_512M - PMEM_GPU_SIZE) +#else +#define PMEM_GPU_BASE (RK29_SDRAM_PHYS + SDRAM_SIZE - PMEM_GPU_SIZE) +#endif #define PMEM_UI_BASE (PMEM_GPU_BASE - PMEM_UI_SIZE) #define PMEM_VPU_BASE (PMEM_UI_BASE - PMEM_VPU_SIZE) #define PMEM_CAM_BASE (PMEM_VPU_BASE - PMEM_CAM_SIZE) @@ -2160,7 +2164,11 @@ static int rk29_sdmmc0_cfg_gpio(void) rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1); rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2); rk29_mux_api_set(GPIO1D5_SDMMC0DATA3_NAME, GPIO1H_SDMMC0_DATA3); - rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N); +#ifdef CONFIG_SDMMC_RK29_OLD + rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_GPIO2A2); +#else + rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);//Modifyed by xbw. +#endif rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5); ///GPIO5H_SDMMC0_PWR_EN); ///GPIO5H_GPIO5D5); gpio_request(RK29_PIN5_PD5,"sdmmc"); gpio_set_value(RK29_PIN5_PD5,GPIO_HIGH); @@ -2183,6 +2191,7 @@ struct rk29_sdmmc_platform_data default_sdmmc0_data = { .use_dma = 0, #endif .detect_irq = INVALID_GPIO, + .enable_sd_wakeup = 0, }; #endif #ifdef CONFIG_SDMMC1_RK29 @@ -2422,13 +2431,13 @@ static struct resource resources_gpu[] = { [1] = { .name = "gpu_base", .start = RK29_GPU_PHYS, - .end = RK29_GPU_PHYS + RK29_GPU_SIZE, + .end = RK29_GPU_PHYS + RK29_GPU_SIZE - 1, .flags = IORESOURCE_MEM, }, [2] = { .name = "gpu_mem", .start = PMEM_GPU_BASE, - .end = PMEM_GPU_BASE + PMEM_GPU_SIZE, + .end = PMEM_GPU_BASE + PMEM_GPU_SIZE - 1, .flags = IORESOURCE_MEM, }, }; @@ -3078,6 +3087,11 @@ static void __init machine_rk29_fixup(struct machine_desc *desc, struct tag *tag mi->bank[0].start = RK29_SDRAM_PHYS; mi->bank[0].node = PHYS_TO_NID(RK29_SDRAM_PHYS); mi->bank[0].size = LINUX_SIZE; +#if SDRAM_SIZE > SZ_512M + mi->nr_banks = 2; + mi->bank[1].start = RK29_SDRAM_PHYS + SZ_512M; + mi->bank[1].size = SDRAM_SIZE - SZ_512M; +#endif } static void __init machine_rk29_mapio(void) @@ -3092,7 +3106,7 @@ static void __init machine_rk29_mapio(void) MACHINE_START(RK29, "RK29board") /* UART for LL DEBUG */ - .phys_io = RK29_UART1_PHYS, + .phys_io = RK29_UART1_PHYS & 0xfff00000, .io_pg_offst = ((RK29_UART1_BASE) >> 18) & 0xfffc, .boot_params = RK29_SDRAM_PHYS + 0x88000, .fixup = machine_rk29_fixup, From 1921541e99f3921955c4eb918608087c32a2ccdd Mon Sep 17 00:00:00 2001 From: root Date: Fri, 9 Sep 2011 14:28:33 +0800 Subject: [PATCH 086/150] rk29_phone:modify charge parameter of wm831x --- arch/arm/mach-rk29/board-rk29-a22.c | 4 ++-- arch/arm/mach-rk29/board-rk29-phonesdk.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c index 97d6f4520140..0da7ee9da791 100644 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -856,9 +856,9 @@ struct wm831x_battery_pdata wm831x_battery_platdata = { .off_mask = 1, /** Mask OFF while charging */ .trickle_ilim = 200, /** Trickle charge current limit, in mA */ .vsel = 4200, /** Target voltage, in mV */ - .eoc_iterm = 90, /** End of trickle charge current, in mA */ + .eoc_iterm = 50, /** End of trickle charge current, in mA */ .fast_ilim = 600, /** Fast charge current limit, in mA */ - .timeout = 240, /** Charge cycle timeout, in minutes */ + .timeout = 480, /** Charge cycle timeout, in minutes */ .syslo = 3300, /* syslo threshold, in mV*/ .sysok = 3500, /* sysko threshold, in mV*/ }; diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 0e7a23e355d6..5d981c7e7913 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -930,9 +930,9 @@ struct wm831x_battery_pdata wm831x_battery_platdata = { .off_mask = 1, /** Mask OFF while charging */ .trickle_ilim = 200, /** Trickle charge current limit, in mA */ .vsel = 4200, /** Target voltage, in mV */ - .eoc_iterm = 90, /** End of trickle charge current, in mA */ + .eoc_iterm = 50, /** End of trickle charge current, in mA */ .fast_ilim = 500, /** Fast charge current limit, in mA */ - .timeout = 240, /** Charge cycle timeout, in minutes */ + .timeout = 480, /** Charge cycle timeout, in minutes */ .syslo = 3300, /* syslo threshold, in mV*/ .sysok = 3500, /* sysko threshold, in mV*/ }; From faf0e3c356693cc6d0976562bd5f0784b4c8b5dd Mon Sep 17 00:00:00 2001 From: xbw Date: Tue, 13 Sep 2011 15:21:33 +0800 Subject: [PATCH 087/150] fix bug:It did not respond with the removal of card at the first time if you reboot reboot with card present. --- drivers/mmc/host/rk29_sdmmc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 650ef1d264cf..c9ed1c8522cb 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -3046,7 +3046,14 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) if(RK29_CTRL_SDMMC_ID== host->pdev->id) { - clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags); + if(rk29_sdmmc_get_cd(host->mmc)) + { + set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags); + } + else + { + clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags); + } } From 4310b3e54253b7feb830bde533b5f56cb535a37f Mon Sep 17 00:00:00 2001 From: xbw Date: Tue, 13 Sep 2011 15:21:33 +0800 Subject: [PATCH 088/150] fix bug:It did not respond with the removal of card at the first time if you reboot device with card present. --- drivers/mmc/host/rk29_sdmmc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 650ef1d264cf..c9ed1c8522cb 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -3046,7 +3046,14 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) if(RK29_CTRL_SDMMC_ID== host->pdev->id) { - clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags); + if(rk29_sdmmc_get_cd(host->mmc)) + { + set_bit(RK29_SDMMC_CARD_PRESENT, &host->flags); + } + else + { + clear_bit(RK29_SDMMC_CARD_PRESENT, &host->flags); + } } From 6c526e53e08fb424432697026489cf6cb7989512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Tue, 13 Sep 2011 16:40:23 +0800 Subject: [PATCH 089/150] rk29: vpu_service: move power on out of spinlock, use power maintain instead --- arch/arm/mach-rk29/vpu_service.c | 43 ++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/arch/arm/mach-rk29/vpu_service.c b/arch/arm/mach-rk29/vpu_service.c index 91695dd31c3b..b29bb4fbadda 100644 --- a/arch/arm/mach-rk29/vpu_service.c +++ b/arch/arm/mach-rk29/vpu_service.c @@ -269,26 +269,35 @@ static void vpu_service_power_off_work_func(unsigned long data) vpu_service_power_off(); } -static void vpu_service_power_on(void) +static void vpu_service_power_maintain(void) { if (service.enabled) { mod_timer(&service.timer, jiffies + POWER_OFF_DELAY); - return; + } else { + pr_err("maintain power when power is off!\n"); } - service.enabled = true; - printk("vpu: power on\n"); +} - clk_enable(aclk_vepu); - clk_enable(hclk_vepu); - clk_enable(hclk_cpu_vcodec); - udelay(10); - pmu_set_power_domain(PD_VCODEC, true); - udelay(10); - clk_enable(aclk_ddr_vepu); - init_timer(&service.timer); - service.timer.expires = jiffies + POWER_OFF_DELAY; - service.timer.function = vpu_service_power_off_work_func; - add_timer(&service.timer); +static void vpu_service_power_on(void) +{ + if (!service.enabled) { + service.enabled = true; + printk("vpu: power on\n"); + + clk_enable(aclk_vepu); + clk_enable(hclk_vepu); + clk_enable(hclk_cpu_vcodec); + udelay(10); + pmu_set_power_domain(PD_VCODEC, true); + udelay(10); + clk_enable(aclk_ddr_vepu); + init_timer(&service.timer); + service.timer.expires = jiffies + POWER_OFF_DELAY; + service.timer.function = vpu_service_power_off_work_func; + add_timer(&service.timer); + } else { + vpu_service_power_maintain(); + } } static vpu_reg *reg_init(vpu_session *session, void __user *src, unsigned long size) @@ -470,12 +479,12 @@ static void try_set_reg(void) if (!list_empty(&service.waiting)) { vpu_reg *reg = list_entry(service.waiting.next, vpu_reg, status_link); + vpu_service_power_maintain(); if (((VPU_DEC_PP == reg->type) && (NULL == service.reg_codec) && (NULL == service.reg_pproc)) || ((VPU_DEC == reg->type) && (NULL == service.reg_codec)) || ((VPU_PP == reg->type) && (NULL == service.reg_pproc)) || ((VPU_ENC == reg->type) && (NULL == service.reg_codec))) { reg_from_wait_to_run(reg); - vpu_service_power_on(); reg_copy_to_hw(reg); } } @@ -561,6 +570,7 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long if (NULL == reg) { return -EFAULT; } else { + vpu_service_power_on(); try_set_reg(); } @@ -777,6 +787,7 @@ static int vpu_service_resume(struct platform_device *pdev) if (service.enabled) { service.enabled = false; vpu_service_power_on(); + try_set_reg(); } return 0; } From 24e11d13783a71b3e8ba0c2f1ffb652554a40240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Sep 2011 19:33:49 +0800 Subject: [PATCH 090/150] rk29: mmu.c: set vmalloc_reserve to 512MB for better support 1G memory --- arch/arm/mm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 9c9a47a2f9ba..6cfc032ae80c 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -672,7 +672,7 @@ void __init iotable_init(struct map_desc *io_desc, int nr) } #if defined(CONFIG_RK29_MEM_SIZE_M) && CONFIG_RK29_MEM_SIZE_M >= 1024 -static unsigned long __initdata vmalloc_reserve = SZ_256M; +static unsigned long __initdata vmalloc_reserve = SZ_512M; #else static unsigned long __initdata vmalloc_reserve = SZ_128M; #endif From 4d03f7e525b28d5bf7d8e0c016b27f6fe62886b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Fri, 9 Sep 2011 16:57:23 +0800 Subject: [PATCH 091/150] rk29: clock.h: Add 'struct notifier_block' forward declaration --- arch/arm/mach-rk29/include/mach/clock.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/mach-rk29/include/mach/clock.h b/arch/arm/mach-rk29/include/mach/clock.h index e0ac1cef3919..800dd9294c90 100644 --- a/arch/arm/mach-rk29/include/mach/clock.h +++ b/arch/arm/mach-rk29/include/mach/clock.h @@ -68,6 +68,8 @@ struct clk_notifier_data { #define CLK_POST_DISABLE 8 #define CLK_ABORT_DISABLE 9 +struct notifier_block; + extern int clk_notifier_register(struct clk *clk, struct notifier_block *nb); extern int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb); From 43e588873ae35423048de33127059b2a93ce67c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Fri, 9 Sep 2011 17:03:30 +0800 Subject: [PATCH 092/150] rk29: clock: throttle aclk_cpu for 1G+ --- arch/arm/mach-rk29/clock.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-rk29/clock.c b/arch/arm/mach-rk29/clock.c index facedb0ea984..4df3bd736feb 100755 --- a/arch/arm/mach-rk29/clock.c +++ b/arch/arm/mach-rk29/clock.c @@ -408,9 +408,9 @@ static unsigned long lpj_gpll; static const struct arm_pll_set arm_pll[] = { // rate = 24 * NF / (NR * NO) // rate NR NF NO adiv hdiv pdiv - ARM_PLL(1200, 1, 50, 1, 21, 21, 81), - ARM_PLL(1176, 2, 98, 1, 21, 21, 81), - ARM_PLL(1104, 1, 46, 1, 21, 21, 81), + ARM_PLL(1200, 1, 50, 1, 31, 21, 81), + ARM_PLL(1176, 2, 98, 1, 31, 21, 81), + ARM_PLL(1104, 1, 46, 1, 31, 21, 81), ARM_PLL(1008, 1, 42, 1, 21, 21, 81), ARM_PLL( 912, 1, 38, 1, 21, 21, 81), ARM_PLL( 888, 2, 74, 1, 21, 21, 81), From d97bba0655e1535a280cf1f0728d6b21dbc51c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Fri, 9 Sep 2011 17:08:52 +0800 Subject: [PATCH 093/150] rk29: clock: do not hold lock when notify --- arch/arm/mach-rk29/clock.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-rk29/clock.c b/arch/arm/mach-rk29/clock.c index 4df3bd736feb..4419dfc48b48 100755 --- a/arch/arm/mach-rk29/clock.c +++ b/arch/arm/mach-rk29/clock.c @@ -1,6 +1,6 @@ /* arch/arm/mach-rk29/clock.c * - * Copyright (C) 2010 ROCKCHIP, Inc. + * Copyright (C) 2010, 2011 ROCKCHIP, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -2714,7 +2714,7 @@ void __init rk29_clock_init2(enum periph_pll ppll_rate, enum codec_pll cpll_rate printk(KERN_INFO "Clocking rate (apll/dpll/cpll/gpll/core/aclk_cpu/hclk_cpu/pclk_cpu/aclk_periph/hclk_periph/pclk_periph): %ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld/%ld MHz", arm_pll_clk.rate / MHZ, ddr_pll_clk.rate / MHZ, codec_pll_clk.rate / MHZ, general_pll_clk.rate / MHZ, clk_core.rate / MHZ, aclk_cpu.rate / MHZ, hclk_cpu.rate / MHZ, pclk_cpu.rate / MHZ, aclk_periph.rate / MHZ, hclk_periph.rate / MHZ, pclk_periph.rate / MHZ); - printk(KERN_CONT " (20110826)\n"); + printk(KERN_CONT " (20110909)\n"); preset_lpj = loops_per_jiffy; } @@ -2903,7 +2903,7 @@ late_initcall(clk_proc_init); /** * struct clk_notifier - associate a clk with a notifier * @clk: struct clk * to associate the notifier with - * @notifier_head: a atomic_notifier_head for this clk + * @notifier_head: a raw_notifier_head for this clk * @node: linked list pointers * * A list of struct clk_notifier is maintained by the notifier code. @@ -2913,7 +2913,7 @@ late_initcall(clk_proc_init); */ struct clk_notifier { struct clk *clk; - struct atomic_notifier_head notifier_head; + struct raw_notifier_head notifier_head; struct list_head node; }; @@ -2954,13 +2954,15 @@ static void clk_notify(struct clk *clk, unsigned long msg, cnd.old_rate = old_rate; cnd.new_rate = new_rate; + UNLOCK(); list_for_each_entry(cn, &clk_notifier_list, node) { if (cn->clk == clk) { pr_debug("%s msg %lu rate %lu -> %lu\n", clk->name, msg, old_rate, new_rate); - atomic_notifier_call_chain(&cn->notifier_head, msg, &cnd); + raw_notifier_call_chain(&cn->notifier_head, msg, &cnd); break; } } + LOCK(); } /** @@ -3001,13 +3003,13 @@ int clk_notifier_register(struct clk *clk, struct notifier_block *nb) }; cn_new->clk = clk; - ATOMIC_INIT_NOTIFIER_HEAD(&cn_new->notifier_head); + RAW_INIT_NOTIFIER_HEAD(&cn_new->notifier_head); list_add(&cn_new->node, &clk_notifier_list); cn = cn_new; } - r = atomic_notifier_chain_register(&cn->notifier_head, nb); + r = raw_notifier_chain_register(&cn->notifier_head, nb); if (!IS_ERR_VALUE(r)) { clkp = clk; do { @@ -3054,7 +3056,7 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb) goto cnu_out; }; - r = atomic_notifier_chain_unregister(&cn->notifier_head, nb); + r = raw_notifier_chain_unregister(&cn->notifier_head, nb); if (!IS_ERR_VALUE(r)) { clkp = clk; do { From 350abdd3316bdccdfeded78208d0512108d34ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Fri, 9 Sep 2011 17:13:55 +0800 Subject: [PATCH 094/150] rk29: move ddr frequency scaling from cpufreq.c to ddrfreq.c --- arch/arm/mach-rk29/Makefile | 1 + arch/arm/mach-rk29/cpufreq.c | 145 +------------------------------- arch/arm/mach-rk29/ddrfreq.c | 155 +++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 144 deletions(-) create mode 100644 arch/arm/mach-rk29/ddrfreq.c diff --git a/arch/arm/mach-rk29/Makefile b/arch/arm/mach-rk29/Makefile index bc91143c770d..ea3f7a12425d 100644 --- a/arch/arm/mach-rk29/Makefile +++ b/arch/arm/mach-rk29/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_RK29_LAST_LOG) += last_log.o obj-$(CONFIG_USB_GADGET) += usb_detect.o obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_CPU_FREQ) += cpufreq.o +obj-$(CONFIG_DDR_FREQ) += ddrfreq.o obj-$(CONFIG_RK29_VPU) += vpu_mem.o obj-y += spi_sram.o obj-$(CONFIG_RK29_VPU_SERVICE) += vpu_service.o diff --git a/arch/arm/mach-rk29/cpufreq.c b/arch/arm/mach-rk29/cpufreq.c index 8d73cfb519a0..6da7b65b4f46 100755 --- a/arch/arm/mach-rk29/cpufreq.c +++ b/arch/arm/mach-rk29/cpufreq.c @@ -29,7 +29,6 @@ #include #include #include -#include #include <../../../drivers/video/rk29_fb.h> #define MHZ (1000*1000) @@ -84,9 +83,8 @@ enum { DEBUG_CHANGE = 1U << 0, DEBUG_TEMP = 1U << 1, DEBUG_DISP = 1U << 2, - DEBUG_DDR = 1U << 3, }; -static uint debug_mask = DEBUG_CHANGE | DEBUG_DDR; +static uint debug_mask = DEBUG_CHANGE; module_param(debug_mask, uint, 0644); #define dprintk(mask, fmt, ...) do { if (mask & debug_mask) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) @@ -125,12 +123,6 @@ static int limit_index_1008 = -1; static unsigned int limit_freq_1008; #endif -#ifdef CONFIG_DDR_FREQ -static void rk29_cpufreq_change_ddr_freq(unsigned long mhz); -#else -static inline void rk29_cpufreq_change_ddr_freq(unsigned long mhz) {} -#endif - static bool rk29_cpufreq_is_ondemand_policy(struct cpufreq_policy *policy) { char c = 0; @@ -366,7 +358,6 @@ static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int ta cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); dprintk(DEBUG_CHANGE, "pre change\n"); clk_set_rate(arm_clk, freqs.new * KHZ + aclk_limit()); - rk29_cpufreq_change_ddr_freq(0); dprintk(DEBUG_CHANGE, "post change\n"); freqs.new = clk_get_rate(arm_clk) / KHZ; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); @@ -485,119 +476,6 @@ static struct notifier_block rk29_cpufreq_fb_notifier = { }; #endif -#ifdef CONFIG_DDR_FREQ -static struct clk *ddr_pll_clk; -static struct clk *aclk_lcdc; -static bool ddr_pll_can_change; -static bool aclk_lcdc_disabled; -static bool disable_ddr_freq; -module_param(ddr_pll_can_change, bool, 0644); -module_param(aclk_lcdc_disabled, bool, 0644); -module_param(disable_ddr_freq, bool, 0644); -static unsigned long ddr_max_mhz; -static unsigned long ddr_min_mhz; -module_param(ddr_max_mhz, ulong, 0644); -module_param(ddr_min_mhz, ulong, 0644); -#define DDR_ARM_RATE (408 * MHZ) - -static void rk29_cpufreq_change_ddr_freq(unsigned long mhz) -{ - unsigned long flags; - unsigned long ddr_rate, arm_rate; - bool changed = false; - - if (disable_ddr_freq) - return; - - if (DEBUG_DDR & debug_mask) { - unsigned long _mhz = mhz; - ddr_rate = clk_get_rate(ddr_clk); - if (!mhz && ddr_pll_can_change && aclk_lcdc_disabled) { - arm_rate = clk_get_rate(arm_clk); - if (arm_rate <= DDR_ARM_RATE && ddr_rate == ddr_max_rate) - _mhz = ddr_min_mhz; - else if (arm_rate > DDR_ARM_RATE && ddr_rate < ddr_max_rate) - _mhz = ddr_max_mhz; - } - if (_mhz) { - unsigned long hz = _mhz * MHZ; - if (hz != ddr_rate) - dprintk(DEBUG_DDR, "ddr %lu -> %lu Hz\n", ddr_rate, hz); - } - } - - local_irq_save(flags); - ddr_rate = clk_get_rate(ddr_clk); - if (!mhz && ddr_pll_can_change && aclk_lcdc_disabled) { - arm_rate = clk_get_rate(arm_clk); - if (arm_rate <= DDR_ARM_RATE && ddr_rate == ddr_max_rate) - mhz = ddr_min_mhz; - else if (arm_rate > DDR_ARM_RATE && ddr_rate < ddr_max_rate) - mhz = ddr_max_mhz; - } - if (mhz && (mhz * MHZ) != ddr_rate) { - ddr_change_freq(mhz); - changed = true; - } - local_irq_restore(flags); - - if (changed) - dprintk(DEBUG_DDR, "ok, got %lu Hz\n", clk_get_rate(ddr_clk)); -} - -static int rk29_cpufreq_ddr_pll_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - switch (event) { - case CLK_PRE_ENABLE: - ddr_pll_can_change = false; - break; - case CLK_ABORT_ENABLE: - case CLK_POST_DISABLE: - ddr_pll_can_change = true; - break; - default: - return NOTIFY_DONE; - } - - if (!disable_ddr_freq) { - dprintk(DEBUG_DDR, "event: %lu ddr_pll_can_change: %d\n", event, ddr_pll_can_change); - rk29_cpufreq_change_ddr_freq(ddr_pll_can_change ? 0 : ddr_max_mhz); - } - return NOTIFY_OK; -} - -static struct notifier_block rk29_cpufreq_ddr_pll_notifier = { - .notifier_call = rk29_cpufreq_ddr_pll_notifier_event, -}; - -static int rk29_cpufreq_aclk_lcdc_notifier_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - switch (event) { - case CLK_PRE_ENABLE: - aclk_lcdc_disabled = false; - break; - case CLK_ABORT_ENABLE: - case CLK_POST_DISABLE: - aclk_lcdc_disabled = true; - break; - default: - return NOTIFY_DONE; - } - - if (!disable_ddr_freq) { - dprintk(DEBUG_DDR, "event: %lu aclk_lcdc_disabled: %d\n", event, aclk_lcdc_disabled); - rk29_cpufreq_change_ddr_freq(aclk_lcdc_disabled ? 0 : ddr_max_mhz); - } - return NOTIFY_OK; -} - -static struct notifier_block rk29_cpufreq_aclk_lcdc_notifier = { - .notifier_call = rk29_cpufreq_aclk_lcdc_notifier_event, -}; -#endif - static int rk29_cpufreq_init(struct cpufreq_policy *policy) { if (policy->cpu != 0) @@ -620,23 +498,6 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) } ddr_max_rate = clk_get_rate(ddr_clk); -#ifdef CONFIG_DDR_FREQ - ddr_max_mhz = ddr_max_rate / MHZ; - { - unsigned long ddr_min_rate; - ddr_min_rate = ddr_max_rate >> 1; - if (ddr_min_rate > 150 * MHZ) - ddr_min_rate >>= 1; - ddr_min_mhz = ddr_min_rate / MHZ; - } - - ddr_pll_clk = clk_get(NULL, "ddr_pll"); - aclk_lcdc = clk_get(NULL, "aclk_lcdc"); - - clk_notifier_register(ddr_pll_clk, &rk29_cpufreq_ddr_pll_notifier); - clk_notifier_register(aclk_lcdc, &rk29_cpufreq_aclk_lcdc_notifier); -#endif - #ifdef CONFIG_REGULATOR vcore = regulator_get(NULL, "vcore"); if (IS_ERR(vcore)) { @@ -673,10 +534,6 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) static int rk29_cpufreq_exit(struct cpufreq_policy *policy) { -#ifdef CONFIG_DDR_FREQ - clk_notifier_unregister(ddr_pll_clk, &rk29_cpufreq_ddr_pll_notifier); - clk_notifier_unregister(aclk_lcdc, &rk29_cpufreq_aclk_lcdc_notifier); -#endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP rk29fb_unregister_notifier(&rk29_cpufreq_fb_notifier); #endif diff --git a/arch/arm/mach-rk29/ddrfreq.c b/arch/arm/mach-rk29/ddrfreq.c new file mode 100644 index 000000000000..a183ba3dee9b --- /dev/null +++ b/arch/arm/mach-rk29/ddrfreq.c @@ -0,0 +1,155 @@ +/* arch/arm/mach-rk29/ddrfreq.c + * + * Copyright (C) 2011 ROCKCHIP, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ + +#include +#include +#include +#include +#include +#include + +#define MHZ (1000*1000) + +enum { + DEBUG_CHANGE = 1U << 0, + DEBUG_EVENT = 1U << 1, +}; +static uint debug_mask = DEBUG_CHANGE; +module_param(debug_mask, uint, 0644); +#define dprintk(mask, fmt, ...) do { if (mask & debug_mask) printk(KERN_DEBUG "ddrfreq: " fmt, ##__VA_ARGS__); } while (0) + +static struct clk *clk_ddr; +static struct clk *ddr_pll_clk; +static struct clk *aclk_lcdc; +static bool ddr_pll_can_change; +static bool aclk_lcdc_disabled; +static bool disable_ddr_freq; +module_param(ddr_pll_can_change, bool, 0644); +module_param(aclk_lcdc_disabled, bool, 0644); +module_param(disable_ddr_freq, bool, 0644); + +static unsigned long ddr_max_mhz; +static unsigned long ddr_min_mhz = 96; +static void rk29_ddrfreq_change_freq(void); +static int rk29_ddrfreq_set_ddr_mhz(const char *val, struct kernel_param *kp) +{ + int err = param_set_uint(val, kp); + if (!err) { + rk29_ddrfreq_change_freq(); + } + return err; +} +module_param_call(ddr_max_mhz, rk29_ddrfreq_set_ddr_mhz, param_get_uint, &ddr_max_mhz, 0644); +module_param_call(ddr_min_mhz, rk29_ddrfreq_set_ddr_mhz, param_get_uint, &ddr_min_mhz, 0644); + +static DEFINE_SPINLOCK(ddr_lock); + +static void rk29_ddrfreq_change_freq(void) +{ + unsigned long ddr_rate, mhz; + + if (disable_ddr_freq) + return; + + ddr_rate = clk_get_rate(clk_ddr); + mhz = (ddr_pll_can_change && aclk_lcdc_disabled) ? ddr_min_mhz : ddr_max_mhz; + if ((mhz * MHZ) != ddr_rate) { + dprintk(DEBUG_CHANGE, "%lu -> %lu Hz\n", ddr_rate, mhz * MHZ); + ddr_change_freq(mhz); + dprintk(DEBUG_CHANGE, "got %lu Hz\n", clk_get_rate(clk_ddr)); + } +} + +static int rk29_ddrfreq_ddr_pll_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + spin_lock_bh(&ddr_lock); + switch (event) { + case CLK_PRE_ENABLE: + ddr_pll_can_change = false; + break; + case CLK_ABORT_ENABLE: + case CLK_POST_DISABLE: + ddr_pll_can_change = true; + break; + default: + goto out; + } + + if (!disable_ddr_freq) { + dprintk(DEBUG_EVENT, "event: %lu ddr_pll_can_change: %d\n", event, ddr_pll_can_change); + rk29_ddrfreq_change_freq(); + } +out: + spin_unlock_bh(&ddr_lock); + return NOTIFY_OK; +} + +static struct notifier_block rk29_ddrfreq_ddr_pll_notifier = { + .notifier_call = rk29_ddrfreq_ddr_pll_notifier_event, +}; + +static int rk29_ddrfreq_aclk_lcdc_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + spin_lock_bh(&ddr_lock); + switch (event) { + case CLK_PRE_ENABLE: + aclk_lcdc_disabled = false; + break; + case CLK_ABORT_ENABLE: + case CLK_POST_DISABLE: + aclk_lcdc_disabled = true; + break; + default: + goto out; + } + + if (!disable_ddr_freq) { + dprintk(DEBUG_EVENT, "event: %lu aclk_lcdc_disabled: %d\n", event, aclk_lcdc_disabled); + rk29_ddrfreq_change_freq(); + } +out: + spin_unlock_bh(&ddr_lock); + return NOTIFY_OK; +} + +static struct notifier_block rk29_ddrfreq_aclk_lcdc_notifier = { + .notifier_call = rk29_ddrfreq_aclk_lcdc_notifier_event, +}; + +static int __init rk29_ddrfreq_init(void) +{ + clk_ddr = clk_get(NULL, "ddr"); + if (IS_ERR(clk_ddr)) { + int err = PTR_ERR(clk_ddr); + pr_err("fail to get ddr clk: %d\n", err); + clk_ddr = NULL; + return err; + } + + ddr_max_mhz = clk_get_rate(clk_ddr) / MHZ; + + ddr_pll_clk = clk_get(NULL, "ddr_pll"); + aclk_lcdc = clk_get(NULL, "aclk_lcdc"); + + clk_notifier_register(ddr_pll_clk, &rk29_ddrfreq_ddr_pll_notifier); + clk_notifier_register(aclk_lcdc, &rk29_ddrfreq_aclk_lcdc_notifier); + + printk("ddrfreq: version 1.0\n"); + return 0; +} + +late_initcall(rk29_ddrfreq_init); From 9cba9b55eb91b5bf030d556cb71e7bc44aa74917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Sep 2011 10:52:45 +0800 Subject: [PATCH 095/150] rk29: cpufreq: throttle more when run 1.2G --- arch/arm/mach-rk29/cpufreq.c | 205 +++++++++++++++++++++++++++-------- 1 file changed, 158 insertions(+), 47 deletions(-) diff --git a/arch/arm/mach-rk29/cpufreq.c b/arch/arm/mach-rk29/cpufreq.c index 6da7b65b4f46..bbc7bcc60107 100755 --- a/arch/arm/mach-rk29/cpufreq.c +++ b/arch/arm/mach-rk29/cpufreq.c @@ -1,6 +1,6 @@ -/* arch/arm/mach-rk2818/cpufreq.c +/* arch/arm/mach-rk29/cpufreq.c * - * Copyright (C) 2010 ROCKCHIP, Inc. + * Copyright (C) 2010, 2011 ROCKCHIP, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -13,11 +13,6 @@ * */ -#ifdef CONFIG_CPU_FREQ_DEBUG -#define DEBUG -#endif -#define pr_fmt(fmt) "%s: " fmt, __func__ - #include #include #include @@ -32,7 +27,6 @@ #include <../../../drivers/video/rk29_fb.h> #define MHZ (1000*1000) -#define KHZ 1000 static int no_cpufreq_access; @@ -64,13 +58,15 @@ static int vcore_uV; static struct workqueue_struct *wq; #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP -static int limit = 1; -module_param(limit, int, 0644); +static bool limit = true; +module_param(limit, bool, 0644); -#define LIMIT_SECS 30 -static int limit_secs = LIMIT_SECS; +static int limit_secs = 30; module_param(limit_secs, int, 0644); +static int limit_secs_1200 = 6; +module_param(limit_secs_1200, int, 0644); + static int limit_temp; module_param(limit_temp, int, 0444); @@ -86,9 +82,9 @@ enum { }; static uint debug_mask = DEBUG_CHANGE; module_param(debug_mask, uint, 0644); -#define dprintk(mask, fmt, ...) do { if (mask & debug_mask) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) +#define dprintk(mask, fmt, ...) do { if (mask & debug_mask) printk(KERN_DEBUG "cpufreq: " fmt, ##__VA_ARGS__); } while (0) -#define LIMIT_AVG_FREQ (816 * KHZ) /* kHz */ +#define LIMIT_AVG_FREQ (816 * 1000) /* kHz */ static unsigned int limit_avg_freq = LIMIT_AVG_FREQ; module_param(limit_avg_freq, uint, 0444); @@ -107,16 +103,17 @@ module_param_call(limit_avg_voltage, rk29_cpufreq_set_limit_avg_voltage, param_g #define CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP -static bool limit_fb1_is_on; -static bool limit_hdmi_is_on; -static inline bool aclk_limit(void) { return limit_hdmi_is_on && limit_fb1_is_on; } -module_param(limit_fb1_is_on, bool, 0644); -module_param(limit_hdmi_is_on, bool, 0644); +static bool limit_fb1_enabled; +static bool limit_hdmi_enabled; +static inline bool aclk_limit(void) { return limit_hdmi_enabled && limit_fb1_enabled; } +module_param(limit_fb1_enabled, bool, 0644); +module_param(limit_hdmi_enabled, bool, 0644); #else static inline bool aclk_limit(void) { return false; } #endif #if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) +static unsigned int limit_max_freq; static int limit_index_816 = -1; static unsigned int limit_freq_816; static int limit_index_1008 = -1; @@ -138,6 +135,7 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) limit_avg_freq = 0; limit_avg_index = -1; #if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) + limit_max_freq = 0; limit_index_816 = -1; limit_freq_816 = 0; limit_index_1008 = -1; @@ -145,17 +143,19 @@ static void board_do_update_cpufreq_table(struct cpufreq_frequency_table *table) #endif for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) { - table[i].frequency = clk_round_rate(arm_clk, table[i].frequency * KHZ) / KHZ; + table[i].frequency = clk_round_rate(arm_clk, table[i].frequency * 1000) / 1000; if (table[i].index <= limit_avg_voltage && limit_avg_freq < table[i].frequency) { limit_avg_freq = table[i].frequency; limit_avg_index = i; } #if defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP) || defined(CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP) - if (table[i].frequency <= 816 * KHZ && + if (limit_max_freq < table[i].frequency) + limit_max_freq = table[i].frequency; + if (table[i].frequency <= 816000 && (limit_index_816 < 0 || (limit_index_816 >= 0 && table[limit_index_816].frequency < table[i].frequency))) limit_index_816 = i; - if (table[i].frequency <= 1008 * KHZ && + if (table[i].frequency <= 1008000 && (limit_index_1008 < 0 || (limit_index_1008 >= 0 && table[limit_index_1008].frequency < table[i].frequency))) { limit_index_1008 = i; @@ -185,13 +185,25 @@ static int rk29_cpufreq_verify(struct cpufreq_policy *policy) } #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP +static bool limit_vpu_enabled; +static bool limit_gpu_enabled; +static bool limit_gpu_high; +module_param(limit_vpu_enabled, bool, 0644); +module_param(limit_gpu_enabled, bool, 0644); +module_param(limit_gpu_high, bool, 0644); +static struct clk* aclk_vepu; +static struct clk* clk_gpu; +#define GPU_LOW_RATE (300 * MHZ) +static unsigned long limit_gpu_low_rate = GPU_LOW_RATE; +module_param(limit_gpu_low_rate, ulong, 0644); + #define TEMP_COEFF_IDLE -1000 #define TEMP_COEFF_408 -325 #define TEMP_COEFF_624 -202 #define TEMP_COEFF_816 -78 #define TEMP_COEFF_1008 325 -#define TEMP_COEFF_1200 (TEMP_COEFF_1008 * 5 / 2) -#define WORK_DELAY (2*HZ) +#define TEMP_COEFF_1200 1300 +#define WORK_DELAY HZ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned int relation, int *index) { int c, ms; @@ -200,11 +212,13 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i cputime64_t wall; u64 idle_time_us; static u64 last_idle_time_us; + int idle; unsigned int cur = policy->cur; int overheat_temp_1200, overheat_temp; int temp; int target_index; unsigned int target_freq; + bool overheat; if (!limit || !rk29_cpufreq_is_ondemand_policy(policy) || (limit_index_816 < 0) || (relation & MASK_FURTHER_CPUFREQ)) { @@ -222,14 +236,14 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i } temp = limit_temp; - if (idle_time_us != last_idle_time_us) { - temp -= idle_time_us - last_idle_time_us; // -1000 - dprintk(DEBUG_TEMP, "idle %lld us\n", idle_time_us - last_idle_time_us); + idle = idle_time_us - last_idle_time_us; + if (idle) { + temp -= idle; // -1000 last_idle_time_us = idle_time_us; } ms = div_u64(ktime_us_delta(now, last), 1000); - dprintk(DEBUG_TEMP, "%d kHz (%d uV) elapsed %d ms\n", cur, vcore_uV, ms); + dprintk(DEBUG_TEMP, "%d kHz (%d uV) elapsed %d ms idle %d us\n", cur, vcore_uV, ms, idle); last = now; if (cur <= 408 * 1000) @@ -249,18 +263,24 @@ static void rk29_cpufreq_limit_by_temp(struct cpufreq_policy *policy, unsigned i target_index = *index; target_freq = freq_table[target_index].frequency; - overheat_temp = TEMP_COEFF_1008 * limit_secs * 1000; - overheat_temp_1200 = overheat_temp - TEMP_COEFF_1200 * (WORK_DELAY/HZ) * 1000; + overheat_temp = TEMP_COEFF_1008 * limit_secs * MSEC_PER_SEC; + overheat_temp_1200 = TEMP_COEFF_1200 * limit_secs_1200 * MSEC_PER_SEC; + overheat = false; - if (temp > overheat_temp && target_freq > limit_freq_816) + if (temp >= overheat_temp && target_freq > limit_freq_816) { target_index = limit_index_816; - else if (target_freq > limit_freq_1008 && limit_freq_1008 > limit_freq_816 && - temp > overheat_temp_1200 && temp <= overheat_temp) + overheat = true; + } else if (target_freq > limit_freq_1008 && limit_freq_1008 > limit_freq_816 && + temp >= overheat_temp_1200 && temp < overheat_temp) { target_index = limit_index_1008; + overheat = true; + } else if (target_freq > 1008000 && (limit_vpu_enabled || (limit_gpu_enabled && limit_gpu_high))) { + target_index = limit_index_1008; + } + dprintk(DEBUG_TEMP, "%d kHz c %d temp %d (%s) selected %d kHz\n", target_freq, c, temp, overheat ? "overheat" : "normal", freq_table[target_index].frequency); limit_temp = temp; *index = target_index; - dprintk(DEBUG_TEMP, "c %d temp %d (%s) index %d\n", c, temp, temp > overheat_temp ? "overheat" : "normal", target_index); } #else #define rk29_cpufreq_limit_by_temp(...) do {} while (0) @@ -276,10 +296,10 @@ static void rk29_cpufreq_limit_by_disp(int *index) return; if (ddr_max_rate < 492 * MHZ) { - if (limit_index_816 >= 0 && frequency > 816 * KHZ) + if (limit_index_816 >= 0 && frequency > 816000) new_index = limit_index_816; } else { - if (limit_index_1008 >= 0 && frequency > 1008 * KHZ) + if (limit_index_1008 >= 0 && frequency > 1008000) new_index = limit_index_1008; } @@ -337,8 +357,8 @@ static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int ta freqs.new = freq->frequency; freqs.cpu = 0; new_vcore_uV = freq->index; - new_arm_rate = freqs.new * KHZ; - dprintk(DEBUG_CHANGE, "%d Hz r %d(%c) selected %d Hz (%d uV)\n", + new_arm_rate = freqs.new * 1000; + dprintk(DEBUG_CHANGE, "%d kHz r %d(%c) selected %d kHz (%d uV)\n", target_freq, relation, relation & CPUFREQ_RELATION_H ? 'H' : 'L', freq->frequency, new_vcore_uV); @@ -357,9 +377,9 @@ static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int ta cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); dprintk(DEBUG_CHANGE, "pre change\n"); - clk_set_rate(arm_clk, freqs.new * KHZ + aclk_limit()); + clk_set_rate(arm_clk, freqs.new * 1000 + aclk_limit()); dprintk(DEBUG_CHANGE, "post change\n"); - freqs.new = clk_get_rate(arm_clk) / KHZ; + freqs.new = clk_get_rate(arm_clk) / 1000; cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); #ifdef CONFIG_REGULATOR @@ -373,7 +393,7 @@ static int rk29_cpufreq_do_target(struct cpufreq_policy *policy, unsigned int ta } } #endif - dprintk(DEBUG_CHANGE, "ok, got %d kHz\n", freqs.new); + dprintk(DEBUG_CHANGE, "got %d kHz\n", freqs.new); return err; } @@ -424,12 +444,91 @@ static void rk29_cpufreq_limit_by_temp_work_func(struct work_struct *work) struct cpufreq_policy *policy = cpufreq_cpu_get(0); if (policy) { - dprintk(DEBUG_TEMP, "target %d KHz\n", policy->cur); + dprintk(DEBUG_TEMP, "check %d kHz\n", policy->cur); cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L); cpufreq_cpu_put(policy); } queue_delayed_work(wq, &rk29_cpufreq_limit_by_temp_work, WORK_DELAY); } + +static int rk29_cpufreq_aclk_vepu_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + switch (event) { + case CLK_PRE_ENABLE: + limit_vpu_enabled = true; + break; + case CLK_ABORT_ENABLE: + case CLK_POST_DISABLE: + limit_vpu_enabled = false; + break; + default: + return NOTIFY_OK; + } + + if (limit_vpu_enabled) { + struct cpufreq_policy *policy = cpufreq_cpu_get(0); + + if (policy) { + dprintk(DEBUG_TEMP, "vpu on\n"); + cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L); + cpufreq_cpu_put(policy); + } + } + return NOTIFY_OK; +} + +static struct notifier_block rk29_cpufreq_aclk_vepu_notifier = { + .notifier_call = rk29_cpufreq_aclk_vepu_notifier_event, +}; + +static int rk29_cpufreq_clk_gpu_notifier_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + struct clk_notifier_data *cnd = ptr; + bool gpu_high_old = limit_gpu_enabled && limit_gpu_high; + bool gpu_high; + + switch (event) { + case CLK_PRE_RATE_CHANGE: + if (cnd->new_rate > limit_gpu_low_rate) + limit_gpu_high = true; + break; + case CLK_ABORT_RATE_CHANGE: + if (cnd->new_rate > limit_gpu_low_rate && cnd->old_rate <= limit_gpu_low_rate) + limit_gpu_high = false; + break; + case CLK_POST_RATE_CHANGE: + if (cnd->new_rate <= limit_gpu_low_rate) + limit_gpu_high = false; + break; + case CLK_PRE_ENABLE: + limit_gpu_enabled = true; + break; + case CLK_ABORT_ENABLE: + case CLK_POST_DISABLE: + limit_gpu_enabled = false; + break; + default: + return NOTIFY_OK; + } + + gpu_high = limit_gpu_enabled && limit_gpu_high; + if (gpu_high_old != gpu_high && gpu_high) { + struct cpufreq_policy *policy = cpufreq_cpu_get(0); + + if (policy) { + dprintk(DEBUG_TEMP, "gpu high\n"); + cpufreq_driver_target(policy, policy->cur, CPUFREQ_RELATION_L); + cpufreq_cpu_put(policy); + } + } + return NOTIFY_OK; +} + +static struct notifier_block rk29_cpufreq_clk_gpu_notifier = { + .notifier_call = rk29_cpufreq_clk_gpu_notifier_event, +}; #endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP @@ -451,16 +550,16 @@ static int rk29_cpufreq_fb_notifier_event(struct notifier_block *this, { switch (event) { case RK29FB_EVENT_HDMI_ON: - limit_hdmi_is_on = true; + limit_hdmi_enabled = true; break; case RK29FB_EVENT_HDMI_OFF: - limit_hdmi_is_on = false; + limit_hdmi_enabled = false; break; case RK29FB_EVENT_FB1_ON: - limit_fb1_is_on = true; + limit_fb1_enabled = true; break; case RK29FB_EVENT_FB1_OFF: - limit_fb1_is_on = false; + limit_fb1_enabled = false; break; } @@ -509,7 +608,7 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) board_update_cpufreq_table(freq_table); /* force update frequency */ BUG_ON(cpufreq_frequency_table_cpuinfo(policy, freq_table)); cpufreq_frequency_table_get_attr(freq_table, policy->cpu); - policy->cur = clk_get_rate(arm_clk) / KHZ; + policy->cur = clk_get_rate(arm_clk) / 1000; policy->cpuinfo.transition_latency = 40 * NSEC_PER_USEC; // make default sampling_rate to 40000 @@ -525,6 +624,12 @@ static int rk29_cpufreq_init(struct cpufreq_policy *policy) queue_delayed_work(wq, &rk29_cpufreq_limit_by_temp_work, WORK_DELAY); } cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); + if (limit_max_freq > 1008000) { + clk_gpu = clk_get(NULL, "gpu"); + aclk_vepu = clk_get(NULL, "aclk_vepu"); + clk_notifier_register(clk_gpu, &rk29_cpufreq_clk_gpu_notifier); + clk_notifier_register(aclk_vepu, &rk29_cpufreq_aclk_vepu_notifier); + } #endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_DISP rk29fb_register_notifier(&rk29_cpufreq_fb_notifier); @@ -538,6 +643,12 @@ static int rk29_cpufreq_exit(struct cpufreq_policy *policy) rk29fb_unregister_notifier(&rk29_cpufreq_fb_notifier); #endif #ifdef CONFIG_RK29_CPU_FREQ_LIMIT_BY_TEMP + if (limit_max_freq > 1008000) { + clk_notifier_unregister(clk_gpu, &rk29_cpufreq_clk_gpu_notifier); + clk_notifier_unregister(aclk_vepu, &rk29_cpufreq_aclk_vepu_notifier); + clk_put(clk_gpu); + clk_put(aclk_vepu); + } cpufreq_unregister_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); if (wq) cancel_delayed_work(&rk29_cpufreq_limit_by_temp_work); From 157943416d74c2f6c3169605e38819f1b94bf32c Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 13 Sep 2011 18:40:48 -0700 Subject: [PATCH 096/150] newton: improve irda driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.去掉一些关键地方的打印信息,解决FIR大数据量快速传输时的丢包问题 --- drivers/net/irda/ir_serial.c | 125 ++++++++++++++--------------------- 1 file changed, 51 insertions(+), 74 deletions(-) diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index e5ae48cea4b9..36fefebb0ffd 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -60,6 +60,7 @@ struct bu92747_port { int rx_enabled; /* if we should rx chars */ + int irq_pin; int irq; /* irq assigned to the bu92747 */ int minor; /* minor number */ @@ -68,6 +69,7 @@ struct bu92747_port { struct work_struct work; /* set to 1 to make the workhandler exit as soon as possible */ int force_end_work; + int open_flag; /* need to know we are suspending to avoid deadlock on workqueue */ int suspending; @@ -85,11 +87,22 @@ static int max_rate = 4000000; static u8 g_receive_buf[BU92725GUW_FIFO_SIZE]; #if 0 -#define BU92747_IRDA_DBG(x...) printk(x) +#define IRDA_DBG_FUNC(x...) printk(x) #else -#define BU92747_IRDA_DBG(x...) +#define IRDA_DBG_FUNC(x...) #endif +#if 0 +#define IRDA_DBG_RECV(x...) printk(x) +#else +#define IRDA_DBG_RECV(x...) +#endif + +#if 1 +#define IRDA_DBG_SENT(x...) printk(x) +#else +#define IRDA_DBG_SENT(x...) +#endif /* race on startup&shutdown, mutex lock with CIR driver */ static DEFINE_MUTEX(irda_cir_lock); @@ -112,12 +125,8 @@ static int add_frame_length(struct rev_frame_length *f, unsigned long length) return -1; f->frame_length[f->iWrite] = length; - //printk("add one frame, length=%ld\n", f->frame_length[f->iWrite]); f->iCount++; - //printk("now frame iCount=%d\n", f->iCount); - f->iWrite = (f->iWrite+1) % MAX_FRAME_NUM; - //printk("now frame iWrite=%d\n", f->iWrite); - + f->iWrite = (f->iWrite+1) % MAX_FRAME_NUM; return 0; } @@ -128,11 +137,8 @@ static int get_frame_length(struct rev_frame_length *f, unsigned long *length) return -1; *length = f->frame_length[f->iRead]; - //printk("read one frame, length=%ld\n", *length); f->iCount--; - //printk("now frame iCount=%d\n", f->iCount); f->iRead = (f->iRead+1) % MAX_FRAME_NUM; - //printk("now frame iRead=%d\n", f->iRead); return 0; } @@ -143,7 +149,7 @@ static int bu92747_irda_do_rx(struct bu92747_port *s) //unsigned int ch, flag; int len; struct tty_struct *tty = s->port.state->port.tty; - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); if (s->rx_enabled == 0) { BU92725GUW_clr_fifo(); @@ -164,6 +170,7 @@ static int bu92747_irda_do_rx(struct bu92747_port *s) //printk("\n"); #else if (len > 0) { + IRDA_DBG_RECV("line %d, enter %s, receive %d data........\n", __LINE__, __func__, len); tty_insert_flip_string(tty, g_receive_buf, len); s->port.icount.rx += len; } @@ -176,22 +183,14 @@ static int bu92747_irda_do_tx(struct bu92747_port *s) //int i; struct circ_buf *xmit = &s->port.state->xmit; int len = uart_circ_chars_pending(xmit); - printk("line %d, enter %s, sending %d data\n", __LINE__, __FUNCTION__, len); + IRDA_DBG_SENT("line %d, enter %s, sending %d data\n", __LINE__, __FUNCTION__, len); if (IS_FIR(s)) { - //printk("fir sending.....\n"); irda_hw_tx_enable_irq(BU92725GUW_FIR); } else { - //printk("sir sending.....\n"); irda_hw_tx_enable_irq(BU92725GUW_SIR); } - - //BU92747_IRDA_DBG("data:\n"); - //for (i=0; ibuf[xmit->tail+i]); - //} - //BU92747_IRDA_DBG("\n"); if (len>0) { s->tx_empty = 0; @@ -220,11 +219,9 @@ static void bu92747_irda_work(struct work_struct *w) struct bu92747_port *s = container_of(w, struct bu92747_port, work); struct circ_buf *xmit = &s->port.state->xmit; - printk("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_SENT("line %d, enter %s \n", __LINE__, __FUNCTION__); if (!s->force_end_work && !freezing(current)) { - //BU92725GUW_dump_register(); - if (!uart_circ_empty(xmit) && !uart_tx_stopped(&s->port)) { if (s->tx_empty) bu92747_irda_do_tx(s); @@ -242,13 +239,12 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) struct rev_frame_length *f = &(s->rev_frames); irq_src = irda_hw_get_irqsrc(); - printk("[%s][%d], 0x%x\n",__FUNCTION__,__LINE__, irq_src); + IRDA_DBG_RECV("[%s][%d], 0x%x\n",__FUNCTION__,__LINE__, irq_src); /* error */ if (irq_src & (REG_INT_CRC | REG_INT_OE | REG_INT_FE | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { - printk("[%s][%d]: do err\n", __FUNCTION__, __LINE__); - //BU92725GUW_dump_register(); + printk("[%s][%d]: do err, REG_EIR = 0x%x\n", __FUNCTION__, __LINE__, irq_src); BU92725GUW_clr_fifo(); BU92725GUW_reset(); if ((BU92725GUW_SEND==irda_hw_get_mode()) @@ -274,11 +270,9 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) spin_lock(&s->data_lock); if (add_frame_length(f, s->cur_frame_length) == 0) { s->cur_frame_length = 0; - //atomic_set(&(s->data_ready), 1); - //wake_up(&(s->data_ready_wq) ); } else { - printk("line %d: FIR frame length buf full......\n", __LINE__); + printk("func %s,line %d: FIR frame length buf full......\n", __FUNCTION__, __LINE__); } spin_unlock(&s->data_lock); } @@ -291,8 +285,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) /* error */ if (irq_src & REG_INT_TO) { - BU92747_IRDA_DBG("[%s][%d]: do timeout err\n", __FUNCTION__, __LINE__); - //BU92725GUW_dump_register(); + printk("[%s][%d]: do timeout err\n", __FUNCTION__, __LINE__); BU92725GUW_clr_fifo(); BU92725GUW_reset(); if ((BU92725GUW_SEND==irda_hw_get_mode()) @@ -300,14 +293,14 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) s->tx_empty = 1; } } - + return IRQ_HANDLED; } static void bu92747_irda_stop_tx(struct uart_port *port) { - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); } static void bu92747_irda_start_tx(struct uart_port *port) @@ -315,7 +308,7 @@ static void bu92747_irda_start_tx(struct uart_port *port) struct bu92747_port *s = container_of(port, struct bu92747_port, port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); //wait for start cmd if (IS_FIR(s)) @@ -330,11 +323,9 @@ static void bu92747_irda_stop_rx(struct uart_port *port) struct bu92747_port, port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); s->rx_enabled = 0; - - bu92747_irda_dowork(s); } static unsigned int bu92747_irda_tx_empty(struct uart_port *port) @@ -343,10 +334,9 @@ static unsigned int bu92747_irda_tx_empty(struct uart_port *port) struct bu92747_port, port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); /* may not be truly up-to-date */ - //bu92747_irda_dowork(s); return s->tx_empty; } @@ -356,14 +346,14 @@ static const char *bu92747_irda_type(struct uart_port *port) struct bu92747_port, port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); return s->port.type == PORT_IRDA ? "BU92747" : NULL; } static void bu92747_irda_release_port(struct uart_port *port) { - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); } static void bu92747_irda_config_port(struct uart_port *port, int flags) @@ -372,7 +362,7 @@ static void bu92747_irda_config_port(struct uart_port *port, int flags) struct bu92747_port, port); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); if (flags & UART_CONFIG_TYPE) s->port.type = PORT_IRDA; @@ -383,7 +373,7 @@ static int bu92747_irda_verify_port(struct uart_port *port, { int ret = -EINVAL; - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); if (ser->type == PORT_UNKNOWN || ser->type == PORT_IRDA) ret = 0; @@ -398,7 +388,7 @@ static void bu92747_irda_shutdown(struct uart_port *port) port); struct rev_frame_length *f = &(s->rev_frames); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + printk("line %d, enter %s \n", __LINE__, __FUNCTION__); if (s->suspending) return; @@ -413,7 +403,6 @@ static void bu92747_irda_shutdown(struct uart_port *port) } spin_lock(&s->data_lock); - //atomic_set(&(s->data_ready), 0); frame_length_buf_clear(f); s->cur_frame_length = 0; spin_unlock(&s->data_lock); @@ -436,7 +425,7 @@ static int bu92747_irda_startup(struct uart_port *port) char b[32]; struct rev_frame_length *f = &(s->rev_frames); - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + printk("line %d, enter %s \n", __LINE__, __FUNCTION__); s->rx_enabled = 1; @@ -459,7 +448,7 @@ static int bu92747_irda_startup(struct uart_port *port) s->force_end_work = 0; sprintf(b, "bu92747_irda-%d", s->minor); - s->workqueue = create_freezeable_workqueue(b); + s->workqueue = create_rt_workqueue(b); if (!s->workqueue) { dev_warn(s->dev, "cannot create workqueue\n"); bu92747_unlock(); @@ -467,10 +456,8 @@ static int bu92747_irda_startup(struct uart_port *port) } INIT_WORK(&s->work, bu92747_irda_work); - //atomic_set(&(s->data_ready), 0); - if (request_irq(s->irq, bu92747_irda_irq, - IRQ_TYPE_LEVEL_LOW, "bu92747_irda", s) < 0) { + IRQF_TRIGGER_LOW, "bu92747_irda", s) < 0) { dev_warn(s->dev, "cannot allocate irq %d\n", s->irq); s->irq = 0; destroy_workqueue(s->workqueue); @@ -496,13 +483,13 @@ static int bu92747_irda_startup(struct uart_port *port) static int bu92747_irda_request_port(struct uart_port *port) { - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); return 0; } static void bu92747_irda_break_ctl(struct uart_port *port, int break_state) { - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); } static unsigned int bu92747_irda_get_mctrl(struct uart_port *port) @@ -512,7 +499,7 @@ static unsigned int bu92747_irda_get_mctrl(struct uart_port *port) static void bu92747_irda_set_mctrl(struct uart_port *port, unsigned int mctrl) { - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); } static void @@ -526,7 +513,7 @@ bu92747_irda_set_termios(struct uart_port *port, struct ktermios *termios, unsigned cflag; struct tty_struct *tty = s->port.state->port.tty; - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); if (!tty) return; @@ -541,8 +528,10 @@ bu92747_irda_set_termios(struct uart_port *port, struct ktermios *termios, case 115200: case 4000000: if (s->baud!=baud) { + //printk("func %s:irda set baudrate %d........\n", __FUNCTION__, baud); irda_hw_set_speed(baud); s->baud = baud; + s->tx_empty = 1; } break; @@ -558,20 +547,11 @@ static int bu92747_get_frame_length(struct bu92747_port *s) { struct rev_frame_length *f = &(s->rev_frames); unsigned long len = 0; -#if 0 - wait_event_interruptible_timeout(s->data_ready_wq, - atomic_read(&(s->data_ready) ), - msecs_to_jiffies(1000) ); - if ( 0 == atomic_read(&(s->data_ready)) ) { - printk("waiting 'data_ready_wq' timed out."); - return -1; - } -#endif + spin_lock(&s->data_lock); if (get_frame_length(f, &len) != 0) { - printk("line %d: FIR data not ready......\n", __LINE__); + IRDA_DBG_RECV("func %s, line %d: FIR data not ready......\n", __FUNCTION__, __LINE__); len = 0; - //atomic_set(&(s->data_ready), 0); } spin_unlock(&s->data_lock); @@ -586,7 +566,7 @@ static int bu92747_irda_ioctl(struct uart_port *port, unsigned int cmd, unsigned void __user *argp = (void __user *)arg; unsigned long len = 0; int ret = 0; - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); switch (cmd) { case TTYIR_GETLENGTH: @@ -645,7 +625,7 @@ static int __devinit bu92747_irda_probe(struct platform_device *pdev) int i, retval; struct irda_info *platdata = pdev->dev.platform_data; - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); if (!platdata) { dev_warn(&pdev->dev, "no platform data info\n"); return -1; @@ -680,6 +660,7 @@ static int __devinit bu92747_irda_probe(struct platform_device *pdev) return -ENOMEM; } bu92747s[i]->dev = &pdev->dev; + bu92747s[i]->irq_pin = platdata->intr_pin; bu92747s[i]->irq = gpio_to_irq(platdata->intr_pin); if (platdata->iomux_init) platdata->iomux_init(); @@ -706,8 +687,6 @@ static int __devinit bu92747_irda_probe(struct platform_device *pdev) if (bu92747s[i]->pdata->irda_pwr_ctl) bu92747s[i]->pdata->irda_pwr_ctl(0); - //init_waitqueue_head(&(bu92747s[i]->data_ready_wq)); - spin_lock_init(&(bu92747s[i]->data_lock)); mutex_unlock(&bu92747s_lock); @@ -720,7 +699,7 @@ static int __devexit bu92747_irda_remove(struct platform_device *pdev) struct bu92747_port *s = dev_get_drvdata(&pdev->dev); int i; - BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); + IRDA_DBG_FUNC("line %d, enter %s \n", __LINE__, __FUNCTION__); mutex_lock(&bu92747s_lock); /* find out the index for the chip we are removing */ @@ -755,7 +734,7 @@ static int bu92747_irda_suspend(struct platform_device *pdev, pm_message_t state if (s->open_flag) { printk("line %d, enter %s \n", __LINE__, __FUNCTION__); disable_irq(s->irq); - + cancel_work_sync(&s->work); s->suspending = 1; uart_suspend_port(&bu92747_irda_uart_driver, &s->port); @@ -783,11 +762,9 @@ static int bu92747_irda_resume(struct platform_device *pdev) uart_resume_port(&bu92747_irda_uart_driver, &s->port); s->suspending = 0; - enable_irq(s->irq); - if (!s->tx_empty) s->tx_empty = 1; - + enable_irq(s->irq); if (s->workqueue && !IS_FIR(s)) bu92747_irda_dowork(s); } From 7c7bd2f2c995fc5b4b0f68484fd8c6ae81a8c27d Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 13 Sep 2011 19:26:28 -0700 Subject: [PATCH 097/150] newton: improve irda driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.去掉中断函数里面的超时处理,超时不是错误不需要处理, 保留会造成中断函数耗时太长,导致接收不及时,数据会丢失 --- drivers/net/irda/ir_serial.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index 36fefebb0ffd..1add7b6d2d92 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -98,7 +98,7 @@ static u8 g_receive_buf[BU92725GUW_FIFO_SIZE]; #define IRDA_DBG_RECV(x...) #endif -#if 1 +#if 0 #define IRDA_DBG_SENT(x...) printk(x) #else #define IRDA_DBG_SENT(x...) @@ -283,6 +283,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) irda_hw_set_moderx(); } +#if 0 /* error */ if (irq_src & REG_INT_TO) { printk("[%s][%d]: do timeout err\n", __FUNCTION__, __LINE__); @@ -293,7 +294,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) s->tx_empty = 1; } } - +#endif return IRQ_HANDLED; } @@ -528,7 +529,7 @@ bu92747_irda_set_termios(struct uart_port *port, struct ktermios *termios, case 115200: case 4000000: if (s->baud!=baud) { - //printk("func %s:irda set baudrate %d........\n", __FUNCTION__, baud); + IRDA_DBG_RECV("func %s:irda set baudrate %d........\n", __FUNCTION__, baud); irda_hw_set_speed(baud); s->baud = baud; s->tx_empty = 1; From d412ece815c6884a9ffd85c64ab8fe6807773867 Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 13 Sep 2011 19:30:25 -0700 Subject: [PATCH 098/150] newton: improve smc drivers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.减少smc0_write函数中的delay,提高irda模块调用该接口进行数据发送的效率 --- drivers/smc/rk29_smc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/smc/rk29_smc.c b/drivers/smc/rk29_smc.c index 7f1339a1bb88..36d99d9fbfbb 100755 --- a/drivers/smc/rk29_smc.c +++ b/drivers/smc/rk29_smc.c @@ -155,7 +155,7 @@ int smc0_write(u32 addr, u16 data) u16 *p = rank0_vir_base + addr; int readdata; *p = data; - udelay(5); + udelay(2); //readdata = *p; //mdelay(5); //mdelay(10); From b388456763680303a472f07c255101f18546dc60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Sep 2011 13:02:18 +0800 Subject: [PATCH 099/150] rk29: sdk: defconfig: enable CLOSE_WIN1_DYNAMIC for save more power when play video --- arch/arm/configs/rk29_ddr3sdk_defconfig | 2 +- arch/arm/configs/rk29_phonepadsdk_defconfig | 1 + arch/arm/configs/rk29_phonesdk_defconfig | 1 + arch/arm/configs/rk29_sdk_defconfig | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/arm/configs/rk29_ddr3sdk_defconfig b/arch/arm/configs/rk29_ddr3sdk_defconfig index 102f8803cb28..a6c160c95147 100755 --- a/arch/arm/configs/rk29_ddr3sdk_defconfig +++ b/arch/arm/configs/rk29_ddr3sdk_defconfig @@ -1305,7 +1305,7 @@ CONFIG_FB_RK29=y CONFIG_FB_WORK_IPP=y # CONFIG_FB_SCALING_OSD is not set # CONFIG_FB_ROTATE_VIDEO is not set -# CONFIG_CLOSE_WIN1_DYNAMIC is not set +CONFIG_CLOSE_WIN1_DYNAMIC=y # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set diff --git a/arch/arm/configs/rk29_phonepadsdk_defconfig b/arch/arm/configs/rk29_phonepadsdk_defconfig index bec35abac4c6..6a309947fda0 100644 --- a/arch/arm/configs/rk29_phonepadsdk_defconfig +++ b/arch/arm/configs/rk29_phonepadsdk_defconfig @@ -1437,6 +1437,7 @@ CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_RK2818 is not set CONFIG_FB_RK29=y CONFIG_FB_WORK_IPP=y +CONFIG_CLOSE_WIN1_DYNAMIC=y # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set diff --git a/arch/arm/configs/rk29_phonesdk_defconfig b/arch/arm/configs/rk29_phonesdk_defconfig index 5d4b17a0e189..16ef1dee4c5f 100755 --- a/arch/arm/configs/rk29_phonesdk_defconfig +++ b/arch/arm/configs/rk29_phonesdk_defconfig @@ -1331,6 +1331,7 @@ CONFIG_FB_RK29=y CONFIG_FB_WORK_IPP=y # CONFIG_FB_SCALING_OSD is not set CONFIG_FB_ROTATE_VIDEO=y +CONFIG_CLOSE_WIN1_DYNAMIC=y # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set diff --git a/arch/arm/configs/rk29_sdk_defconfig b/arch/arm/configs/rk29_sdk_defconfig index 90915e6a100b..18c90bca340f 100755 --- a/arch/arm/configs/rk29_sdk_defconfig +++ b/arch/arm/configs/rk29_sdk_defconfig @@ -1480,7 +1480,7 @@ CONFIG_FB_RK29=y CONFIG_FB_WORK_IPP=y CONFIG_FB_SCALING_OSD=y # CONFIG_FB_ROTATE_VIDEO is not set -# CONFIG_CLOSE_WIN1_DYNAMIC is not set +CONFIG_CLOSE_WIN1_DYNAMIC=y # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set From 54889a327ce7bc4163978a6eea57af72d6bc30f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Sep 2011 13:06:35 +0800 Subject: [PATCH 100/150] rk29: sdk: defconfig: enable DDR_FREQ for save more power when play music --- arch/arm/configs/rk29_ddr3sdk_defconfig | 1 + arch/arm/configs/rk29_phonepadsdk_defconfig | 1 + arch/arm/configs/rk29_phonesdk_defconfig | 1 + arch/arm/configs/rk29_sdk_defconfig | 1 + 4 files changed, 4 insertions(+) diff --git a/arch/arm/configs/rk29_ddr3sdk_defconfig b/arch/arm/configs/rk29_ddr3sdk_defconfig index a6c160c95147..20907f443e19 100755 --- a/arch/arm/configs/rk29_ddr3sdk_defconfig +++ b/arch/arm/configs/rk29_ddr3sdk_defconfig @@ -236,6 +236,7 @@ CONFIG_MACH_RK29SDK_DDR3=y CONFIG_DDR_TYPE_DDR3_DEFAULT=y CONFIG_RK29_MEM_SIZE_M=512 CONFIG_DDR_SDRAM_FREQ=456 +CONFIG_DDR_FREQ=y # CONFIG_DDR_RECONFIG is not set CONFIG_WIFI_CONTROL_FUNC=y diff --git a/arch/arm/configs/rk29_phonepadsdk_defconfig b/arch/arm/configs/rk29_phonepadsdk_defconfig index 6a309947fda0..eee1a810eb38 100644 --- a/arch/arm/configs/rk29_phonepadsdk_defconfig +++ b/arch/arm/configs/rk29_phonepadsdk_defconfig @@ -231,6 +231,7 @@ CONFIG_MACH_RK29_PHONEPADSDK=y CONFIG_DDR_TYPE_DDR3_DEFAULT=y CONFIG_RK29_MEM_SIZE_M=512 CONFIG_DDR_SDRAM_FREQ=400 +CONFIG_DDR_FREQ=y # # RK29 VPU (Video Processing Unit) support diff --git a/arch/arm/configs/rk29_phonesdk_defconfig b/arch/arm/configs/rk29_phonesdk_defconfig index 16ef1dee4c5f..89ed26a541bd 100755 --- a/arch/arm/configs/rk29_phonesdk_defconfig +++ b/arch/arm/configs/rk29_phonesdk_defconfig @@ -232,6 +232,7 @@ CONFIG_RK29_MEM_SIZE_512M=y # CONFIG_RK29_MEM_SIZE_1G is not set CONFIG_RK29_MEM_SIZE_M=512 CONFIG_DDR_SDRAM_FREQ=192 +CONFIG_DDR_FREQ=y # # RK29 VPU (Video Processing Unit) support diff --git a/arch/arm/configs/rk29_sdk_defconfig b/arch/arm/configs/rk29_sdk_defconfig index 18c90bca340f..4e74731ab992 100755 --- a/arch/arm/configs/rk29_sdk_defconfig +++ b/arch/arm/configs/rk29_sdk_defconfig @@ -236,6 +236,7 @@ CONFIG_MACH_RK29SDK=y CONFIG_DDR_TYPE_DDR3_DEFAULT=y CONFIG_RK29_MEM_SIZE_M=512 CONFIG_DDR_SDRAM_FREQ=400 +CONFIG_DDR_FREQ=y # CONFIG_DDR_RECONFIG is not set CONFIG_WIFI_CONTROL_FUNC=y From 199e4a8fe6ceb626663fd6d165c5c576c5718d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Sep 2011 13:13:26 +0800 Subject: [PATCH 101/150] rk29: enable DDR frequency scaling by default --- arch/arm/mach-rk29/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rk29/Kconfig b/arch/arm/mach-rk29/Kconfig index 414c875a8a24..a738886e2c6b 100644 --- a/arch/arm/mach-rk29/Kconfig +++ b/arch/arm/mach-rk29/Kconfig @@ -164,7 +164,8 @@ config DDR_SDRAM_FREQ default 400 config DDR_FREQ - bool "Enable DDR frequency scaling (EXPERIMENTAL)" + bool "Enable DDR frequency scaling" + default y config DDR_RECONFIG bool "Enable dynamic DDR reconfiguration (EXPERIMENTAL)" From 6dd5fa522774aae1ac6f509185e0bf9beb212b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Sep 2011 14:07:43 +0800 Subject: [PATCH 102/150] rk29: sdk: ui pmem should be no_allocator --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 2 +- arch/arm/mach-rk29/board-rk29-phonesdk.c | 2 +- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 2 +- arch/arm/mach-rk29/board-rk29sdk.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 3cc9040611fb..4c17524f75c0 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -754,7 +754,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 0, + .no_allocator = 1, .cached = 1, }; diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 5d981c7e7913..6e2b66b6d183 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -381,7 +381,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 0, + .no_allocator = 1, .cached = 1, }; diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index 31e349525b60..02e654ffb9a2 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -384,7 +384,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 0, + .no_allocator = 1, .cached = 1, }; diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index 37193c3b64d7..9d5332c75d7b 100644 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -712,7 +712,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 0, + .no_allocator = 1, .cached = 1, }; From 7f4b4c1f9e06147927bd22836c4fecbfa944f605 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 14 Sep 2011 11:06:04 +0800 Subject: [PATCH 103/150] rk29_phone:disable pull down resistor of uart1 --- arch/arm/mach-rk29/board-rk29-a22.c | 20 +++++++++++++++++++- arch/arm/mach-rk29/board-rk29-phonesdk.c | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) mode change 100644 => 100755 arch/arm/mach-rk29/board-rk29-a22.c diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c old mode 100644 new mode 100755 index 0da7ee9da791..599ce5865cc1 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -2487,7 +2487,25 @@ struct platform_device rk29_device_vibrator ={ static void __init rk29_board_iomux_init(void) { - int err; + int err; + +#ifdef CONFIG_UART1_RK29 + //disable uart1 pull down + rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_GPIO2A5); + rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_GPIO2A4); + + gpio_request(RK29_PIN2_PA5, NULL); + gpio_request(RK29_PIN2_PA4, NULL); + + gpio_pull_updown(RK29_PIN2_PA5, PullDisable); + gpio_pull_updown(RK29_PIN2_PA4, PullDisable); + + rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_UART1_SOUT); + rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_UART1_SIN); + + gpio_free(RK29_PIN2_PA5); + gpio_free(RK29_PIN2_PA4); +#endif #if CONFIG_ANDROID_TIMED_GPIO rk29_mux_api_set(GPIO1B5_PWM0_NAME, GPIO1L_GPIO1B5);//for timed gpio diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 6e2b66b6d183..47e0c7603bcb 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -2454,6 +2454,24 @@ static struct platform_device gpio_wave_device = { static void __init rk29_board_iomux_init(void) { int err; + +#ifdef CONFIG_UART1_RK29 + //disable uart1 pull down + rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_GPIO2A5); + rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_GPIO2A4); + + gpio_request(RK29_PIN2_PA5, NULL); + gpio_request(RK29_PIN2_PA4, NULL); + + gpio_pull_updown(RK29_PIN2_PA5, PullDisable); + gpio_pull_updown(RK29_PIN2_PA4, PullDisable); + + rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_UART1_SOUT); + rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_UART1_SIN); + + gpio_free(RK29_PIN2_PA5); + gpio_free(RK29_PIN2_PA4); +#endif #ifdef CONFIG_RK29_PWM_REGULATOR rk29_mux_api_set(REGULATOR_PWM_MUX_NAME,REGULATOR_PWM_MUX_MODE); #endif From 3574d2ba4a53a4bafa62b9fba67045e65b50368e Mon Sep 17 00:00:00 2001 From: root Date: Wed, 14 Sep 2011 17:27:11 +0800 Subject: [PATCH 104/150] rk29_phone: disable pull down resistor of uart3 for gps --- drivers/misc/gps/rk29_gps.c | 6 ++++++ 1 file changed, 6 insertions(+) mode change 100644 => 100755 drivers/misc/gps/rk29_gps.c diff --git a/drivers/misc/gps/rk29_gps.c b/drivers/misc/gps/rk29_gps.c old mode 100644 new mode 100755 index 2dc8f76d65cf..0e4aa47e22ec --- a/drivers/misc/gps/rk29_gps.c +++ b/drivers/misc/gps/rk29_gps.c @@ -34,8 +34,14 @@ static int rk29_gps_uart_to_gpio(int uart_id) gpio_request(RK29_PIN2_PB3, NULL); gpio_request(RK29_PIN2_PB2, NULL); + gpio_pull_updown(RK29_PIN2_PB3, PullDisable); + gpio_pull_updown(RK29_PIN2_PB2, PullDisable); + gpio_direction_output(RK29_PIN2_PB3, GPIO_LOW); gpio_direction_output(RK29_PIN2_PB2, GPIO_LOW); + + gpio_free(RK29_PIN2_PB3); + gpio_free(RK29_PIN2_PB2); } else if(uart_id == 2) { rk29_mux_api_set(GPIO2B1_UART2SOUT_NAME, GPIO2L_GPIO2B1); From d966820fee857402838498b692d1619099edd2d4 Mon Sep 17 00:00:00 2001 From: zyw Date: Thu, 15 Sep 2011 12:23:41 +0800 Subject: [PATCH 105/150] update fb fix data abort when enable CONFIG_CLOSE_WIN1_DYNAMIC --- drivers/video/rk29_fb.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index a8b1a2fcec80..a646813b1cb1 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -1205,18 +1205,42 @@ static void win1_check_work_func(struct work_struct *work) { struct rk29fb_inf *inf = platform_get_drvdata(g_pdev); struct fb_info *fb0_inf = inf->fb0; + struct fb_var_screeninfo *var = &fb0_inf->var; int i=0; int *p = NULL; int blank_data,total_data; - + int format = 0; u16 xres_virtual = fb0_inf->var.xres_virtual; //virtual screen size u16 xpos_virtual = fb0_inf->var.xoffset; //visiable offset in virtual screen u16 ypos_virtual = fb0_inf->var.yoffset; - int offset = (ypos_virtual*xres_virtual + xpos_virtual)*((inf->fb0_color_deepth || fb0_inf->var.bits_per_pixel==32)? 4:2)/4; + int offset = 0;//(ypos_virtual*xres_virtual + xpos_virtual)*((inf->fb0_color_deepth || fb0_inf->var.bits_per_pixel==32)? 4:2)/4; + switch(var->bits_per_pixel) + { + case 16: + format = 1; + offset = (ypos_virtual*xres_virtual + xpos_virtual)*(inf->fb0_color_deepth ? 4:2); + if(ypos_virtual == 3*var->yres && inf->fb0_color_deepth) + offset -= var->yres * var->xres *2; + break; + default: + format = 0; + offset = (ypos_virtual*xres_virtual + xpos_virtual)*4; + if(ypos_virtual >= 2*var->yres) + { + format = 1; + if(ypos_virtual == 3*var->yres) + { + offset -= var->yres * var->xres *2; + } + } + break; + } p = (int*)fb0_inf->screen_base + offset; blank_data = (inf->fb0_color_deepth==32) ? 0xff000000 : 0; - total_data = fb0_inf->var.xres*fb0_inf->var.yres*fb0_inf->var.bits_per_pixel/32; + total_data = fb0_inf->var.xres * fb0_inf->var.yres / (format+1); + + // printk("var->bits_per_pixel=%d,ypos_virtual=%d, var->yres=%d,offset=%d,total_data=%d\n",var->bits_per_pixel,ypos_virtual,var->yres,offset,total_data); for(i=0; i < total_data; i++) { From 48f7a1b9a34352b536220b3fe1eb420d9c301253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=B4?= Date: Wed, 14 Sep 2011 22:33:46 -0700 Subject: [PATCH 106/150] add pmu act8891 drivers --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 286 +++++++++++ drivers/regulator/Kconfig | 5 + drivers/regulator/Makefile | 1 + drivers/regulator/act8891.c | 637 ++++++++++++++++++++++++ include/linux/regulator/act8891.h | 48 ++ 5 files changed, 977 insertions(+) create mode 100755 drivers/regulator/act8891.c create mode 100755 include/linux/regulator/act8891.h diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 4c17524f75c0..b74587b1aeb3 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -50,6 +50,8 @@ #include #include +#include + #include #include #include @@ -995,6 +997,281 @@ struct bq27510_platform_data bq27510_info = { }; #endif +/*************************************PMU ACT8891****************************************/ + +#if defined (CONFIG_REGULATOR_ACT8891) + /*dcdc mode*/ +/*act8891 in REGULATOR_MODE_STANDBY mode is said DCDC is in PMF mode is can save power,when in REGULATOR_MODE_NORMAL +mode is said DCDC is in PWM mode , General default is in REGULATOR_MODE_STANDBY mode*/ + /*ldo mode */ +/*act8891 in REGULATOR_MODE_STANDBY mode is said LDO is in low power mode is can save power,when in REGULATOR_MODE_NORMAL +mode is said DCDC is in nomal mode , General default is in REGULATOR_MODE_STANDBY mode*/ +/*set dcdc and ldo voltage by regulator_set_voltage()*/ +static struct act8891 *act8891; +int act8891_set_init(struct act8891 *act8891) +{ + int tmp = 0; + struct regulator *act_ldo1,*act_ldo2,*act_ldo3,*act_ldo4; + struct regulator *act_dcdc1,*act_dcdc2,*act_dcdc3; + + /*init ldo1*/ + act_ldo1 = regulator_get(NULL, "act_ldo1"); + regulator_enable(act_ldo1); + regulator_set_voltage(act_ldo1,1800000,1800000); + tmp = regulator_get_voltage(act_ldo1); + regulator_set_mode(act_ldo1,REGULATOR_MODE_STANDBY); + //regulator_set_mode(act_ldo1,REGULATOR_MODE_NORMAL); + printk("***regulator_set_init: ldo1 vcc =%d\n",tmp); + regulator_put(act_ldo1); + + /*init ldo2*/ + act_ldo2 = regulator_get(NULL, "act_ldo2"); + regulator_enable(act_ldo2); + regulator_set_voltage(act_ldo2,1200000,1200000); + tmp = regulator_get_voltage(act_ldo2); + regulator_set_mode(act_ldo2,REGULATOR_MODE_STANDBY); + //regulator_set_mode(act_ldo2,REGULATOR_MODE_NORMAL); + printk("***regulator_set_init: ldo2 vcc =%d\n",tmp); + regulator_put(act_ldo2); + + /*init ldo3*/ + act_ldo3 = regulator_get(NULL, "act_ldo3"); + regulator_enable(act_ldo3); + regulator_set_voltage(act_ldo3,3300000,3300000); + tmp = regulator_get_voltage(act_ldo3); + regulator_set_mode(act_ldo3,REGULATOR_MODE_STANDBY); + //regulator_set_mode(act_ldo3,REGULATOR_MODE_NORMAL); + printk("***regulator_set_init: ldo3 vcc =%d\n",tmp); + regulator_put(act_ldo3); + + /*init ldo4*/ + act_ldo4 = regulator_get(NULL, "act_ldo4"); + regulator_enable(act_ldo4); + regulator_set_voltage(act_ldo4,2500000,2500000); + tmp = regulator_get_voltage(act_ldo4); + regulator_set_mode(act_ldo4,REGULATOR_MODE_STANDBY); + //regulator_set_mode(act_ldo4,REGULATOR_MODE_NORMAL); + printk("***regulator_set_init: ldo4 vcc =%d\n",tmp); + regulator_put(act_ldo4); + + /*init dcdc1*/ + act_dcdc1 = regulator_get(NULL, "act_dcdc1"); + regulator_enable(act_dcdc1); + regulator_set_voltage(act_dcdc1,3000000,3000000); + tmp = regulator_get_voltage(act_dcdc1); + regulator_set_mode(act_dcdc1,REGULATOR_MODE_STANDBY); + //regulator_set_mode(act_dcdc1,REGULATOR_MODE_NORMAL); + printk("***regulator_set_init: dcdc1 vcc =%d\n",tmp); + regulator_put(act_dcdc1); + + /*init dcdc2*/ + act_dcdc2 = regulator_get(NULL, "act_dcdc2"); + regulator_enable(act_dcdc2); + regulator_set_voltage(act_dcdc2,1500000,1500000); + tmp = regulator_get_voltage(act_dcdc2); + regulator_set_mode(act_dcdc2,REGULATOR_MODE_STANDBY); + //regulator_set_mode(act_dcdc2,REGULATOR_MODE_NORMAL); + printk("***regulator_set_init: dcdc2 vcc =%d\n",tmp); + regulator_put(act_dcdc2); + + /*init dcdc3*/ + act_dcdc3 = regulator_get(NULL, "act_dcdc3"); + regulator_enable(act_dcdc3); + regulator_set_voltage(act_dcdc3,1200000,1200000); + tmp = regulator_get_voltage(act_dcdc3); + regulator_set_mode(act_dcdc3,REGULATOR_MODE_STANDBY); + //regulator_set_mode(act_dcdc3,REGULATOR_MODE_NORMAL); + printk("***regulator_set_init: dcdc3 vcc =%d\n",tmp); + regulator_put(act_dcdc3); + + return(0); +} + +static struct regulator_consumer_supply act8891_ldo1_consumers[] = { + { + .supply = "act_ldo1", + } +}; + +static struct regulator_init_data act8891_ldo1_data = { + .constraints = { + .name = "ACT_LDO1", + .min_uV = 600000, + .max_uV = 3900000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE, + .valid_modes_mask = REGULATOR_MODE_STANDBY | REGULATOR_MODE_NORMAL, + }, + .num_consumer_supplies = ARRAY_SIZE(act8891_ldo1_consumers), + .consumer_supplies = act8891_ldo1_consumers, +}; + +/**/ +static struct regulator_consumer_supply act8891_ldo2_consumers[] = { + { + .supply = "act_ldo2", + } +}; + +static struct regulator_init_data act8891_ldo2_data = { + .constraints = { + .name = "ACT_LDO2", + .min_uV = 600000, + .max_uV = 3900000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE, + .valid_modes_mask = REGULATOR_MODE_STANDBY | REGULATOR_MODE_NORMAL, + }, + .num_consumer_supplies = ARRAY_SIZE(act8891_ldo2_consumers), + .consumer_supplies = act8891_ldo2_consumers, +}; + +/*ldo3 VCC_NAND WIFI/BT/FM_BCM4325*/ +static struct regulator_consumer_supply act8891_ldo3_consumers[] = { + { + .supply = "act_ldo3", + } +}; + +static struct regulator_init_data act8891_ldo3_data = { + .constraints = { + .name = "ACT_LDO3", + .min_uV = 600000, + .max_uV = 3900000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE, + .valid_modes_mask = REGULATOR_MODE_STANDBY | REGULATOR_MODE_NORMAL, + }, + .num_consumer_supplies = ARRAY_SIZE(act8891_ldo3_consumers), + .consumer_supplies = act8891_ldo3_consumers, +}; + +/*ldo4 VCCA CODEC_WM8994*/ +static struct regulator_consumer_supply act8891_ldo4_consumers[] = { + { + .supply = "act_ldo4", + } +}; + +static struct regulator_init_data act8891_ldo4_data = { + .constraints = { + .name = "ACT_LDO4", + .min_uV = 600000, + .max_uV = 3900000, + .apply_uV = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE, + .valid_modes_mask = REGULATOR_MODE_STANDBY | REGULATOR_MODE_NORMAL, + }, + .num_consumer_supplies = ARRAY_SIZE(act8891_ldo4_consumers), + .consumer_supplies = act8891_ldo4_consumers, +}; +/*buck1 vcc Core*/ +static struct regulator_consumer_supply act8891_dcdc1_consumers[] = { + { + .supply = "act_dcdc1", + } +}; + +static struct regulator_init_data act8891_dcdc1_data = { + .constraints = { + .name = "ACT_DCDC1", + .min_uV = 600000, + .max_uV = 3900000, + .apply_uV = 1, + //.always_on = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE, + .valid_modes_mask = REGULATOR_MODE_STANDBY | REGULATOR_MODE_NORMAL, + }, + .num_consumer_supplies = ARRAY_SIZE(act8891_dcdc1_consumers), + .consumer_supplies = act8891_dcdc1_consumers +}; + +/*buck2 VDDDR MobileDDR VCC*/ +static struct regulator_consumer_supply act8891_dcdc2_consumers[] = { + { + .supply = "act_dcdc2", + } +}; + +static struct regulator_init_data act8891_dcdc2_data = { + .constraints = { + .name = "ACT_DCDC2", + .min_uV = 600000, + .max_uV = 3900000, + .apply_uV = 1, + //.always_on = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE, + .valid_modes_mask = REGULATOR_MODE_STANDBY | REGULATOR_MODE_NORMAL, + }, + .num_consumer_supplies = ARRAY_SIZE(act8891_dcdc2_consumers), + .consumer_supplies = act8891_dcdc2_consumers +}; + +/*buck3 vdd Core*/ +static struct regulator_consumer_supply act8891_dcdc3_consumers[] = { + { + .supply = "act_dcdc3", + } +}; + +static struct regulator_init_data act8891_dcdc3_data = { + .constraints = { + .name = "ACT_DCDC3", + .min_uV = 600000, + .max_uV = 3900000, + .apply_uV = 1, + //.always_on = 1, + .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE, + .valid_modes_mask = REGULATOR_MODE_STANDBY | REGULATOR_MODE_NORMAL, + }, + .num_consumer_supplies = ARRAY_SIZE(act8891_dcdc3_consumers), + .consumer_supplies = act8891_dcdc3_consumers +}; + +struct act8891_regulator_subdev act8891_regulator_subdev_id[] = { + { + .id=0, + .initdata=&act8891_ldo1_data, + }, + + { + .id=1, + .initdata=&act8891_ldo2_data, + }, + + { + .id=2, + .initdata=&act8891_ldo3_data, + }, + + { + .id=3, + .initdata=&act8891_ldo4_data, + }, + + { + .id=4, + .initdata=&act8891_dcdc1_data, + }, + + { + .id=5, + .initdata=&act8891_dcdc2_data, + }, + { + .id=6, + .initdata=&act8891_dcdc3_data, + }, + +}; + +struct act8891_platform_data act8891_data={ + .set_init=act8891_set_init, + .num_regulators=7, + .regulators=act8891_regulator_subdev_id, + +}; +#endif /***************************************************************************************** * i2c devices @@ -1323,6 +1600,15 @@ static struct i2c_board_info __initdata board_i2c3_devices[] = { .platform_data = &bq27541_info, }, #endif +#if defined (CONFIG_REGULATOR_ACT8891) + { + .type = "act8891", + .addr = 0x5b, + .flags = 0, + .platform_data=&act8891_data, + }, +#endif + }; #endif diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 6399e8c5482e..68f037653845 100755 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -173,6 +173,11 @@ config RK2818_REGULATOR_LP8725 depends on I2C help Say Y to enable support for the voltage regulators pmic lp8725 on the RK2818. +config REGULATOR_ACT8891 + tristate "Active Semi ACT8891 PMIC regulators" + depends on I2C + help + Support the voltage and current regulators of the ACT8891 series of PMIC devices. config RK29_PWM_REGULATOR tristate "rk2918 pwm voltage regulator" help diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index ec0e204b5541..cc77cab0d4f1 100755 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -29,5 +29,6 @@ obj-$(CONFIG_RK29_PWM_REGULATOR) += rk29-pwm-regulator.o obj-$(CONFIG_REGULATOR_TPS65023) += tps65023-regulator.o obj-$(CONFIG_REGULATOR_TPS6507X) += tps6507x-regulator.o +obj-$(CONFIG_REGULATOR_ACT8891) += act8891.o ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG diff --git a/drivers/regulator/act8891.c b/drivers/regulator/act8891.c new file mode 100755 index 000000000000..16b8ada0ad1a --- /dev/null +++ b/drivers/regulator/act8891.c @@ -0,0 +1,637 @@ +/* drivers/regulator/act8891.c + * + * Copyright (C) 2011 ROCKCHIP, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ +/*******************************************************************/ +/* COPYRIGHT (C) ROCK-CHIPS FUZHOU . ALL RIGHTS RESERVED. */ +/******************************************************************* +FILE : act8891.c +DESC : act8891 PMIC driver +AUTHOR : zq +DATE : 2011-09-05 +NOTES : +$LOG: GPIO.C,V $ +REVISION 0.01 +********************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if 0 +#define DBG(x...) printk(KERN_INFO x) +#else +#define DBG(x...) +#endif +#if 1 +#define DBG_INFO(x...) printk(KERN_INFO x) +#else +#define DBG_INFO(x...) +#endif +#define PM_CONTROL + +struct act8891 { + struct device *dev; + struct mutex io_lock; + struct i2c_client *i2c; + int num_regulators; + struct regulator_dev **rdev; +}; + +static u8 act8891_reg_read(struct act8891 *act8891, u8 reg); +static int act8891_set_bits(struct act8891 *act8891, u8 reg, u16 mask, u16 val); + + +#define act8891_BUCK1_SET_VOL_BASE 0x20 +#define act8891_BUCK2_SET_VOL_BASE 0x30 +#define act8891_BUCK3_SET_VOL_BASE 0x40 +#define act8891_LDO1_SET_VOL_BASE 0x50 +#define act8891_LDO2_SET_VOL_BASE 0x54 +#define act8891_LDO3_SET_VOL_BASE 0x60 +#define act8891_LDO4_SET_VOL_BASE 0x64 + +#define act8891_BUCK1_CONTR_BASE 0x22 +#define act8891_BUCK2_CONTR_BASE 0x32 +#define act8891_BUCK3_CONTR_BASE 0x42 +#define act8891_LDO1_CONTR_BASE 0x51 +#define act8891_LDO2_CONTR_BASE 0x55 +#define act8891_LDO3_CONTR_BASE 0x61 +#define act8891_LDO4_CONTR_BASE 0x65 + +#define BUCK_VOL_MASK 0x3f +#define LDO_VOL_MASK 0x3f + +#define VOL_MIN_IDX 0x00 +#define VOL_MAX_IDX 0x3f + +const static int buck_set_vol_base_addr[] = { + act8891_BUCK1_SET_VOL_BASE, + act8891_BUCK2_SET_VOL_BASE, + act8891_BUCK3_SET_VOL_BASE, +}; +const static int buck_contr_base_addr[] = { + act8891_BUCK1_CONTR_BASE, + act8891_BUCK2_CONTR_BASE, + act8891_BUCK3_CONTR_BASE, +}; +#define act8891_BUCK_SET_VOL_REG(x) (buck_set_vol_base_addr[x]) +#define act8891_BUCK_CONTR_REG(x) (buck_contr_base_addr[x]) + + +const static int ldo_set_vol_base_addr[] = { + act8891_LDO1_SET_VOL_BASE, + act8891_LDO2_SET_VOL_BASE, + act8891_LDO3_SET_VOL_BASE, + act8891_LDO4_SET_VOL_BASE, +}; +const static int ldo_contr_base_addr[] = { + act8891_LDO1_CONTR_BASE, + act8891_LDO2_CONTR_BASE, + act8891_LDO3_CONTR_BASE, + act8891_LDO4_CONTR_BASE, +}; +#define act8891_LDO_SET_VOL_REG(x) (ldo_set_vol_base_addr[x]) +#define act8891_LDO_CONTR_REG(x) (ldo_contr_base_addr[x]) + +const static int buck_voltage_map[] = { + 600, 625, 650, 675, 700, 725, 750, 775, + 800, 825, 850, 875, 900, 925, 950, 975, + 1000, 1025, 1050, 1075, 1100, 1125, 1150, + 1175, 1200, 1250, 1300, 1350, 1400, 1450, + 1500, 1550, 1600, 1650, 1700, 1750, 1800, + 1850, 1900, 1950, 2000, 2050, 2100, 2150, + 2200, 2250, 2300, 2350, 2400, 2500, 2600, + 2700, 2800, 2850, 2900, 3000, 3100, 3200, + 3300, 3400, 3500, 3600, 3700, 3800, 3900, +}; + +const static int ldo_voltage_map[] = { + 600, 625, 650, 675, 700, 725, 750, 775, + 800, 825, 850, 875, 900, 925, 950, 975, + 1000, 1025, 1050, 1075, 1100, 1125, 1150, + 1175, 1200, 1250, 1300, 1350, 1400, 1450, + 1500, 1550, 1600, 1650, 1700, 1750, 1800, + 1850, 1900, 1950, 2000, 2050, 2100, 2150, + 2200, 2250, 2300, 2350, 2400, 2500, 2600, + 2700, 2800, 2850, 2900, 3000, 3100, 3200, + 3300, 3400, 3500, 3600, 3700, 3800, 3900, +}; + +static int act8891_ldo_list_voltage(struct regulator_dev *dev, unsigned index) +{ + return 1000 * ldo_voltage_map[index]; +} +static int act8891_ldo_is_enabled(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int ldo = rdev_get_id(dev) -ACT8891_LDO1; + u16 val; + u16 mask=0x80; + val = act8891_reg_read(act8891, act8891_LDO_CONTR_REG(ldo)); + if (val < 0) + return val; + val=val&~0x7f; + if (val & mask) + return 1; + else + return 0; +} +static int act8891_ldo_enable(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int ldo= rdev_get_id(dev) -ACT8891_LDO1; + u16 mask=0x80; + int ret; + return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, 0x80); + +} +static int act8891_ldo_disable(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int ldo= rdev_get_id(dev) -ACT8891_LDO1; + u16 mask=0x80; + int ret; + return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, 0); + +} +static int act8891_ldo_get_voltage(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int ldo= rdev_get_id(dev) -ACT8891_LDO1; + u16 reg = 0; + int val; + reg = act8891_reg_read(act8891,act8891_LDO_SET_VOL_REG(ldo)); + reg &= LDO_VOL_MASK; + val = 1000 * ldo_voltage_map[reg]; + return val; +} +static int act8891_ldo_set_voltage(struct regulator_dev *dev, + int min_uV, int max_uV) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int ldo= rdev_get_id(dev) -ACT8891_LDO1; + int min_vol = min_uV / 1000, max_vol = max_uV / 1000; + const int *vol_map =ldo_voltage_map; + u16 val; + int ret = 0; + if (min_vol < vol_map[VOL_MIN_IDX] || + min_vol > vol_map[VOL_MAX_IDX]) + return -EINVAL; + + for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX; + val++){ + if (vol_map[val] >= min_vol) + break; } + + if (vol_map[val] > max_vol) + return -EINVAL; + + ret = act8891_set_bits(act8891, act8891_LDO_SET_VOL_REG(ldo), + LDO_VOL_MASK, val); + if (ret) + return ret; + +} +static int act8891_ldo_get_mode(struct regulator_dev *dev, unsigned index) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int ldo = rdev_get_id(dev) -ACT8891_LDO1 ; + u16 mask = 0xcf; + u16 val; + val = act8891_reg_read(act8891, act8891_LDO_CONTR_REG(ldo)); + val=val|mask; + if (val== mask) + return REGULATOR_MODE_NORMAL; + else + return REGULATOR_MODE_STANDBY; + +} +static int act8891_ldo_set_mode(struct regulator_dev *dev, unsigned int mode) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int ldo = rdev_get_id(dev) -ACT8891_LDO1 ; + u16 mask = 0x20; + switch(mode) + { + case REGULATOR_MODE_NORMAL: + return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, 0); + case REGULATOR_MODE_STANDBY: + return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, mask); + default: + printk("error:pmu_act8891 only lowpower and nomal mode\n"); + return -EINVAL; + } + + +} +static struct regulator_ops act8891_ldo_ops = { + .set_voltage = act8891_ldo_set_voltage, + .get_voltage = act8891_ldo_get_voltage, + .list_voltage = act8891_ldo_list_voltage, + .is_enabled = act8891_ldo_is_enabled, + .enable = act8891_ldo_enable, + .disable = act8891_ldo_disable, + .get_mode = act8891_ldo_get_mode, + .set_mode = act8891_ldo_set_mode, + +}; + +static int act8891_dcdc_list_voltage(struct regulator_dev *dev, unsigned index) +{ + return 1000 * buck_voltage_map[index]; +} +static int act8891_dcdc_is_enabled(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int buck = rdev_get_id(dev) -ACT8891_DCDC1; + u16 val; + u16 mask=0x80; + val = act8891_reg_read(act8891, act8891_BUCK_CONTR_REG(buck)); + if (val < 0) + return val; + val=val&~0x7f; + if (val & mask) + return 1; + else + return 0; +} +static int act8891_dcdc_enable(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int buck = rdev_get_id(dev) -ACT8891_DCDC1 ; + u16 mask=0x80; + return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, 0x80); + +} +static int act8891_dcdc_disable(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int buck = rdev_get_id(dev) -ACT8891_DCDC1 ; + u16 mask=0x80; + return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, 0); +} +static int act8891_dcdc_get_voltage(struct regulator_dev *dev) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int buck = rdev_get_id(dev) -ACT8891_DCDC1 ; + u16 reg = 0; + int val; + reg = act8891_reg_read(act8891,act8891_BUCK_SET_VOL_REG(buck)); + reg &= BUCK_VOL_MASK; + val = 1000 * buck_voltage_map[reg]; + return val; +} +static int act8891_dcdc_set_voltage(struct regulator_dev *dev, + int min_uV, int max_uV) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int buck = rdev_get_id(dev) -ACT8891_DCDC1 ; + int min_vol = min_uV / 1000, max_vol = max_uV / 1000; + const int *vol_map = buck_voltage_map; + u16 val; + int ret = 0; + + if (min_vol < vol_map[VOL_MIN_IDX] || + min_vol > vol_map[VOL_MAX_IDX]) + return -EINVAL; + + for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX; + val++){ + if (vol_map[val] >= min_vol) + break;} + + if (vol_map[val] > max_vol) + return -EINVAL; + ret = act8891_set_bits(act8891, act8891_BUCK_SET_VOL_REG(buck), + BUCK_VOL_MASK, val); + if (ret) + return ret; +} +static int act8891_dcdc_get_mode(struct regulator_dev *dev, unsigned index) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int buck = rdev_get_id(dev) -ACT8891_DCDC1 ; + u16 mask = 0xcf; + u16 val; + val = act8891_reg_read(act8891, act8891_BUCK_CONTR_REG(buck)); + val=val|mask; + if (val== mask) + return REGULATOR_MODE_STANDBY; + else + return REGULATOR_MODE_NORMAL; + +} +static int act8891_dcdc_set_mode(struct regulator_dev *dev, unsigned int mode) +{ + struct act8891 *act8891 = rdev_get_drvdata(dev); + int buck = rdev_get_id(dev) -ACT8891_DCDC1 ; + u16 mask = 0x20; + switch(mode) + { + case REGULATOR_MODE_STANDBY: + return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, 0); + case REGULATOR_MODE_NORMAL: + return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, mask); + default: + printk("error:pmu_act8891 only powersave and pwm mode\n"); + return -EINVAL; + } + + +} +static struct regulator_ops act8891_dcdc_ops = { + .set_voltage = act8891_dcdc_set_voltage, + .get_voltage = act8891_dcdc_get_voltage, + .list_voltage= act8891_dcdc_list_voltage, + .is_enabled = act8891_dcdc_is_enabled, + .enable = act8891_dcdc_enable, + .disable = act8891_dcdc_disable, + .get_mode = act8891_dcdc_get_mode, + .set_mode = act8891_dcdc_set_mode, +}; +static struct regulator_desc regulators[] = { + { + .name = "ACT_LDO1", + .id =0, + .ops = &act8891_ldo_ops, + .n_voltages = ARRAY_SIZE(ldo_voltage_map), + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + }, + { + .name = "ACT_LDO2", + .id = 1, + .ops = &act8891_ldo_ops, + .n_voltages = ARRAY_SIZE(ldo_voltage_map), + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + }, + { + .name = "ACT_LDO3", + .id = 2, + .ops = &act8891_ldo_ops, + .n_voltages = ARRAY_SIZE(ldo_voltage_map), + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + }, + { + .name = "ACT_LDO4", + .id = 3, + .ops = &act8891_ldo_ops, + .n_voltages = ARRAY_SIZE(ldo_voltage_map), + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + }, + + { + .name = "ACT_DCDC1", + .id = 4, + .ops = &act8891_dcdc_ops, + .n_voltages = ARRAY_SIZE(buck_voltage_map), + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + }, + { + .name = "ACT_DCDC2", + .id = 5, + .ops = &act8891_dcdc_ops, + .n_voltages = ARRAY_SIZE(buck_voltage_map), + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + }, + { + .name = "ACT_DCDC3", + .id = 6, + .ops = &act8891_dcdc_ops, + .n_voltages = ARRAY_SIZE(buck_voltage_map), + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + }, + +}; + +static int act8891_i2c_read(struct i2c_client *i2c, char reg, int count, u16 *dest) +{ + int ret; + struct i2c_adapter *adap; + struct i2c_msg msgs[2]; + + if(!i2c) + return ret; + + if (count != 1) + return -EIO; + + adap = i2c->adapter; + + msgs[0].addr = i2c->addr; + msgs[0].buf = ® + msgs[0].flags = i2c->flags; + msgs[0].len = 1; + msgs[0].scl_rate = 200*1000; + + msgs[1].buf = dest; + msgs[1].addr = i2c->addr; + msgs[1].flags = i2c->flags | I2C_M_RD; + msgs[1].len = 1; + msgs[1].scl_rate = 200*1000; + ret = i2c_transfer(adap, msgs, 2); + + DBG("***run in %s %d msgs[1].buf = %d\n",__FUNCTION__,__LINE__,*(msgs[1].buf)); + + return 0; +} + +static int act8891_i2c_write(struct i2c_client *i2c, char reg, int count, const u16 src) +{ + int ret=-1; + + struct i2c_adapter *adap; + struct i2c_msg msg; + char tx_buf[2]; + + if(!i2c) + return ret; + if (count != 1) + return -EIO; + + adap = i2c->adapter; + tx_buf[0] = reg; + tx_buf[1] = src; + + msg.addr = i2c->addr; + msg.buf = &tx_buf[0]; + msg.len = 1 +1; + msg.flags = i2c->flags; + msg.scl_rate = 200*1000; + + ret = i2c_transfer(adap, &msg, 1); + return ret; +} + +static u8 act8891_reg_read(struct act8891 *act8891, u8 reg) +{ + u16 val = 0; + + mutex_lock(&act8891->io_lock); + + act8891_i2c_read(act8891->i2c, reg, 1, &val); + + DBG("reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff); + + mutex_unlock(&act8891->io_lock); + + return val & 0xff; +} + +static int act8891_set_bits(struct act8891 *act8891, u8 reg, u16 mask, u16 val) +{ + u16 tmp; + int ret; + + mutex_lock(&act8891->io_lock); + + ret = act8891_i2c_read(act8891->i2c, reg, 1, &tmp); + tmp = (tmp & ~mask) | val; + if (ret == 0) { + ret = act8891_i2c_write(act8891->i2c, reg, 1, tmp); + DBG("reg write 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff); + } + mutex_unlock(&act8891->io_lock); + + return ret; +} +static int __devinit setup_regulators(struct act8891 *act8891, struct act8891_platform_data *pdata) +{ + int i, err; + + act8891->num_regulators = pdata->num_regulators; + act8891->rdev = kcalloc(pdata->num_regulators, + sizeof(struct regulator_dev *), GFP_KERNEL); + if (!act8891->rdev) { + return -ENOMEM; + } + /* Instantiate the regulators */ + for (i = 0; i < pdata->num_regulators; i++) { + int id = pdata->regulators[i].id; + act8891->rdev[i] = regulator_register(®ulators[id], + act8891->dev, pdata->regulators[i].initdata, act8891); +/* + if (IS_ERR(act8891->rdev[i])) { + err = PTR_ERR(act8891->rdev[i]); + dev_err(act8891->dev, "regulator init failed: %d\n", + err); + goto error; + }*/ + } + + return 0; +error: + while (--i >= 0) + regulator_unregister(act8891->rdev[i]); + kfree(act8891->rdev); + act8891->rdev = NULL; + return err; +} + +static int __devinit act8891_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) +{ + struct act8891 *act8891; + struct act8891_platform_data *pdata = i2c->dev.platform_data; + int ret; + act8891 = kzalloc(sizeof(struct act8891), GFP_KERNEL); + if (act8891 == NULL) { + ret = -ENOMEM; + goto err; + } + act8891->i2c = i2c; + act8891->dev = &i2c->dev; + i2c_set_clientdata(i2c, act8891); + mutex_init(&act8891->io_lock); + + + if (pdata) { + ret = setup_regulators(act8891, pdata); + if (ret < 0) + goto err; + } else + dev_warn(act8891->dev, "No platform init data supplied\n"); + + pdata->set_init(act8891); + + return 0; + +err: + return ret; + +} + +static int __devexit act8891_i2c_remove(struct i2c_client *i2c) +{ + struct act8891 *act8891 = i2c_get_clientdata(i2c); + int i; + + for (i = 0; i < act8891->num_regulators; i++) + if (act8891->rdev[i]) + regulator_unregister(act8891->rdev[i]); + kfree(act8891->rdev); + i2c_set_clientdata(i2c, NULL); + kfree(act8891); + + return 0; +} + +static const struct i2c_device_id act8891_i2c_id[] = { + { "act8891", 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, act8891_i2c_id); + +static struct i2c_driver act8891_i2c_driver = { + .driver = { + .name = "act8891", + .owner = THIS_MODULE, + }, + .probe = act8891_i2c_probe, + .remove = __devexit_p(act8891_i2c_remove), + .id_table = act8891_i2c_id, +}; + +static int __init act8891_module_init(void) +{ + int ret; + ret = i2c_add_driver(&act8891_i2c_driver); + if (ret != 0) + pr_err("Failed to register I2C driver: %d\n", ret); + return ret; +} +module_init(act8891_module_init); + +static void __exit act8891_module_exit(void) +{ + i2c_del_driver(&act8891_i2c_driver); +} +module_exit(act8891_module_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("zhangqing "); +MODULE_DESCRIPTION("act8891 PMIC driver"); + diff --git a/include/linux/regulator/act8891.h b/include/linux/regulator/act8891.h new file mode 100755 index 000000000000..bab564f7dc48 --- /dev/null +++ b/include/linux/regulator/act8891.h @@ -0,0 +1,48 @@ +/* include/linux/regulator/act8891.h + * + * Copyright (C) 2011 ROCKCHIP, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + * + */ +#ifndef __LINUX_REGULATOR_act8891_H +#define __LINUX_REGULATOR_act8891_H + +#include + +//#define ACT8891_START 30 + +#define ACT8891_LDO1 0 //(0+ACT8891_START) +#define ACT8891_LDO2 1 // (1+ACT8891_START) +#define ACT8891_LDO3 2 //(2+ACT8891_START) +#define ACT8891_LDO4 3 //(3+ACT8891_START) + + +#define ACT8891_DCDC1 4 //(4+ACT8891_START) +#define ACT8891_DCDC2 5 //(5+ACT8891_START) +#define ACT8891_DCDC3 6 //(6+ACT8891_START) + + +#define act8891_NUM_REGULATORS 7 +static struct act8891 *act8891; + +struct act8891_regulator_subdev { + int id; + struct regulator_init_data *initdata; +}; + +struct act8891_platform_data { + int num_regulators; + int (*set_init)(struct act8891 *act8891); + struct act8891_regulator_subdev *regulators; +}; + +#endif + From 203dd9c2b1fcb2eef1a7c84caef7e243ad2c7418 Mon Sep 17 00:00:00 2001 From: zyw Date: Thu, 15 Sep 2011 14:26:25 +0800 Subject: [PATCH 107/150] update fb fix UI scaling up when 1080p HDMI video playing next --- drivers/video/rk29_fb.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index a646813b1cb1..7eff5a019a7e 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -2220,7 +2220,8 @@ int fb1_release(struct fb_info *info, int user) par->par_seted = 0; par->addr_seted = 0; win1_blank(FB_BLANK_NORMAL, info); - fb0_set_par(inf->fb0); + if(inf->cur_screen->type != SCREEN_HDMI) + fb0_set_par(inf->fb0); // unmap memory info->screen_base = 0; @@ -2303,10 +2304,10 @@ static int fb1_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) ipp_req.src0.fmt = 3; ipp_req.src0.YrgbMst = yuv_phy[0]; ipp_req.src0.CbrMst = yuv_phy[1]; - ipp_req.src0.w = var->xres ; + ipp_req.src0.w = var->xres ; ipp_req.src0.h = var->yres ; - ipp_req.src_vir_w= (var->xres + 15) & (~15); - ipp_req.dst_vir_w=screen->x_res; + ipp_req.src_vir_w= (var->xres + 15) & (~15); + ipp_req.dst_vir_w=screen->x_res; ipp_req.dst0.fmt = 3; ipp_req.dst0.YrgbMst = inf->fb0->fix.mmio_start + screen->x_res*screen->y_res*2*dstoffset; From 5f0d040a13dcfd6e3b3709853999e70cdb444874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Thu, 15 Sep 2011 15:30:29 +0800 Subject: [PATCH 108/150] rk29: vpu_service: fix task counting bug --- arch/arm/mach-rk29/vpu_service.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-rk29/vpu_service.c b/arch/arm/mach-rk29/vpu_service.c index b29bb4fbadda..6c26538a6231 100644 --- a/arch/arm/mach-rk29/vpu_service.c +++ b/arch/arm/mach-rk29/vpu_service.c @@ -190,9 +190,7 @@ static void vpu_reset(void) static void reg_deinit(vpu_reg *reg); static void vpu_service_session_clear(vpu_session *session) { - unsigned long flag; vpu_reg *reg, *n; - spin_lock_irqsave(&service.lock, flag); list_for_each_entry_safe(reg, n, &session->waiting, session_link) { reg_deinit(reg); } @@ -202,17 +200,14 @@ static void vpu_service_session_clear(vpu_session *session) list_for_each_entry_safe(reg, n, &session->done, session_link) { reg_deinit(reg); } - spin_unlock_irqrestore(&service.lock, flag); } static void vpu_service_dump(void) { int running; - unsigned long flag; vpu_reg *reg, *reg_tmp; vpu_session *session, *session_tmp; - spin_lock_irqsave(&service.lock, flag); running = atomic_read(&service.total_running); printk("total_running %d\n", running); @@ -234,7 +229,6 @@ static void vpu_service_dump(void) printk("done register set 0x%.8x\n", (unsigned int)reg); } } - spin_unlock_irqrestore(&service.lock, flag); } static void vpu_service_power_off(void) @@ -394,6 +388,7 @@ static void reg_from_run_to_done(vpu_reg *reg) } } atomic_sub(1, ®->session->task_running); + atomic_sub(1, &service.total_running); wake_up_interruptible_sync(®->session->wait); spin_unlock(&service.lock); } @@ -591,18 +586,22 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long pr_err("pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running)); ret = -ETIMEDOUT; } + spin_lock_irqsave(&service.lock, flag); if (ret < 0) { int task_running = atomic_read(&session->task_running); vpu_service_dump(); if (task_running) { atomic_set(&session->task_running, 0); + atomic_sub(task_running, &service.total_running); printk("%d task is running but not return, reset hardware...", task_running); vpu_reset(); printk("done\n"); } vpu_service_session_clear(session); + spin_unlock_irqrestore(&service.lock, flag); return ret; } + spin_unlock_irqrestore(&service.lock, flag); } spin_lock_irqsave(&service.lock, flag); reg = list_entry(session->done.next, vpu_reg, session_link); @@ -726,6 +725,7 @@ static int vpu_service_open(struct inode *inode, struct file *filp) static int vpu_service_release(struct inode *inode, struct file *filp) { int task_running; + unsigned long flag; vpu_session *session = (vpu_session *)filp->private_data; if (NULL == session) return -EINVAL; @@ -737,6 +737,7 @@ static int vpu_service_release(struct inode *inode, struct file *filp) } wake_up_interruptible_sync(&session->wait); + spin_lock_irqsave(&service.lock, flag); /* remove this filp from the asynchronusly notified filp's */ //vpu_service_fasync(-1, filp, 0); list_del(&session->list_session); @@ -744,6 +745,7 @@ static int vpu_service_release(struct inode *inode, struct file *filp) vpu_service_session_clear(session); kfree(session); + spin_unlock_irqrestore(&service.lock, flag); pr_debug("dev closed\n"); return 0; @@ -1001,7 +1003,6 @@ static irqreturn_t vdpu_isr(int irq, void *dev_id) /* clear dec IRQ */ writel(irq_status_dec & (~DEC_INTERRUPT_BIT), dev->hwregs + DEC_INTERRUPT_REGISTER); pr_debug("DEC IRQ received!\n"); - atomic_sub(1, &service.total_running); if (NULL == service.reg_codec) { pr_err("dec isr with no task waiting\n"); } else { @@ -1013,7 +1014,6 @@ static irqreturn_t vdpu_isr(int irq, void *dev_id) /* clear pp IRQ */ writel(irq_status_pp & (~DEC_INTERRUPT_BIT), dev->hwregs + PP_INTERRUPT_REGISTER); pr_debug("PP IRQ received!\n"); - atomic_sub(1, &service.total_running); if (NULL == service.reg_pproc) { pr_err("pp isr with no task waiting\n"); } else { @@ -1035,7 +1035,6 @@ static irqreturn_t vepu_isr(int irq, void *dev_id) /* clear enc IRQ */ writel(irq_status & (~ENC_INTERRUPT_BIT), dev->hwregs + ENC_INTERRUPT_REGISTER); pr_debug("ENC IRQ received!\n"); - atomic_sub(1, &service.total_running); if (NULL == service.reg_codec) { pr_err("enc isr with no task waiting\n"); } else { From fb54f97e8368fb22aca11b4e7ff0118cfaaf47be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 15 Sep 2011 17:02:38 +0800 Subject: [PATCH 109/150] rk29: sdk: ui pmem set to 48m for 1024x768 screen --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 2 +- arch/arm/mach-rk29/board-rk29sdk.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index b74587b1aeb3..b385a7df0bb1 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -101,7 +101,7 @@ #define SDRAM_SIZE SZ_512M #endif #define PMEM_GPU_SIZE SZ_64M -#define PMEM_UI_SIZE SZ_32M +#define PMEM_UI_SIZE (48 * SZ_1M) /* 1280x800: 64M 1024x768: 48M ... */ #define PMEM_VPU_SIZE SZ_64M #define PMEM_SKYPE_SIZE 0 #define PMEM_CAM_SIZE PMEM_CAM_NECESSARY diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index 9d5332c75d7b..f2339f06cea2 100644 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -99,7 +99,7 @@ #define SDRAM_SIZE SZ_512M #endif #define PMEM_GPU_SIZE SZ_64M -#define PMEM_UI_SIZE SZ_32M +#define PMEM_UI_SIZE (48 * SZ_1M) /* 1280x800: 64M 1024x768: 48M ... */ #define PMEM_VPU_SIZE SZ_64M #define PMEM_CAM_SIZE PMEM_CAM_NECESSARY #ifdef CONFIG_VIDEO_RK29_WORK_IPP From 9c96055775a993a868deb5810e37d638c8c6d977 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Thu, 15 Sep 2011 19:33:30 +0800 Subject: [PATCH 110/150] Add NETFILTER configuration to support wifi softap, add wifi chip or module sys interface. --- arch/arm/configs/rk29_ddr3sdk_defconfig | 137 +++++++++++++++++- drivers/net/wireless/Makefile | 2 +- .../net/wireless/wifi_sys/rkwifi_sys_iface.c | 91 ++++++++++++ 3 files changed, 225 insertions(+), 5 deletions(-) create mode 100644 drivers/net/wireless/wifi_sys/rkwifi_sys_iface.c diff --git a/arch/arm/configs/rk29_ddr3sdk_defconfig b/arch/arm/configs/rk29_ddr3sdk_defconfig index 20907f443e19..ebe4cb2139f4 100755 --- a/arch/arm/configs/rk29_ddr3sdk_defconfig +++ b/arch/arm/configs/rk29_ddr3sdk_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.32.27 -# Tue Aug 23 09:57:52 2011 +# Thu Sep 15 19:19:01 2011 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -470,7 +470,123 @@ CONFIG_IPV6_NDISC_NODETYPE=y # CONFIG_IPV6_MROUTE is not set CONFIG_ANDROID_PARANOID_NETWORK=y # CONFIG_NETWORK_SECMARK is not set -# CONFIG_NETFILTER is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_DEBUG=y +CONFIG_NETFILTER_ADVANCED=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=y +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CT_ACCT=y +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_GRE=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_SIP=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XTABLES=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set +# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_HL=y +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +# CONFIG_NETFILTER_XT_MATCH_MARK is not set +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +# CONFIG_NETFILTER_XT_MATCH_OSF is not set +# CONFIG_IP_VS is not set + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_NF_CONNTRACK_PROC_COMPAT=y +# CONFIG_IP_NF_QUEUE is not set +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_ADDRTYPE=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_TARGET_LOG=y +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_NF_NAT=y +CONFIG_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +# CONFIG_NF_NAT_SNMP_BASIC is not set +CONFIG_NF_NAT_PROTO_DCCP=y +CONFIG_NF_NAT_PROTO_GRE=y +CONFIG_NF_NAT_PROTO_UDPLITE=y +CONFIG_NF_NAT_PROTO_SCTP=y +CONFIG_NF_NAT_FTP=y +CONFIG_NF_NAT_IRC=y +CONFIG_NF_NAT_TFTP=y +CONFIG_NF_NAT_AMANDA=y +CONFIG_NF_NAT_PPTP=y +CONFIG_NF_NAT_H323=y +CONFIG_NF_NAT_SIP=y +# CONFIG_IP_NF_MANGLE is not set +# CONFIG_IP_NF_TARGET_TTL is not set +# CONFIG_IP_NF_RAW is not set +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y + +# +# IPv6: Netfilter Configuration +# +# CONFIG_NF_CONNTRACK_IPV6 is not set +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -859,6 +975,7 @@ CONFIG_INPUT_KEYRESET=y # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYS_RK29=y +# CONFIG_KEYS_RK29_NEWTON is not set # CONFIG_SYNAPTICS_SO340010 is not set # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ATKBD is not set @@ -906,6 +1023,7 @@ CONFIG_EETI_EGALAX_MAX_X=1087 CONFIG_EETI_EGALAX_MAX_Y=800 # CONFIG_EETI_EGALAX_DEBUG is not set # CONFIG_TOUCHSCREEN_IT7260 is not set +# CONFIG_TOUCHSCREEN_IT7260_I2C is not set # CONFIG_TOUCHSCREEN_NAS is not set # CONFIG_LAIBAO_TS is not set # CONFIG_TOUCHSCREEN_GT801_IIC is not set @@ -931,7 +1049,10 @@ CONFIG_INPUT_UINPUT=y CONFIG_G_SENSOR_DEVICE=y # CONFIG_GS_MMA7660 is not set CONFIG_GS_MMA8452=y +# CONFIG_GS_KXTF9 is not set +# CONFIG_GS_LIS3DH is not set # CONFIG_GS_L3G4200D is not set +# CONFIG_GYRO_SENSOR_DEVICE is not set # CONFIG_INPUT_JOGBALL is not set # CONFIG_LIGHT_SENSOR_DEVICE is not set @@ -1126,6 +1247,7 @@ CONFIG_REGULATOR=y # CONFIG_REGULATOR_TPS6507X is not set # CONFIG_RK2818_REGULATOR_CHARGE is not set # CONFIG_RK2818_REGULATOR_LP8725 is not set +# CONFIG_REGULATOR_ACT8891 is not set CONFIG_RK29_PWM_REGULATOR=y CONFIG_MEDIA_SUPPORT=y @@ -1316,6 +1438,7 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_GENERIC is not set CONFIG_BACKLIGHT_RK29_BL=y +# CONFIG_BACKLIGHT_RK29_NEWTON_BL is not set # CONFIG_FIH_TOUCHKEY_LED is not set # CONFIG_BACKLIGHT_AW9364 is not set # CONFIG_BUTTON_LIGHT is not set @@ -1411,6 +1534,7 @@ CONFIG_SND_RK29_SOC_WM8900=y # CONFIG_SND_RK29_SOC_CS42L52 is not set # CONFIG_SND_RK29_CODEC_SOC_MASTER is not set CONFIG_SND_RK29_CODEC_SOC_SLAVE=y +# CONFIG_ADJUST_VOL_BY_CODEC is not set CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_ALL_CODECS is not set CONFIG_SND_SOC_WM8900=y @@ -1812,6 +1936,7 @@ CONFIG_VIVANTE=y # IPP # CONFIG_RK29_IPP=y +CONFIG_DEINTERLACE=y # # CMMB @@ -2082,7 +2207,7 @@ CONFIG_CRYPTO_ECB=y # # Digest # -# CONFIG_CRYPTO_CRC32C is not set +CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_GHASH is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y @@ -2142,13 +2267,17 @@ CONFIG_CRC16=y # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC7 is not set -# CONFIG_LIBCRC32C is not set +CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_DECOMPRESS_GZIP=y CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=y +CONFIG_TEXTSEARCH_BM=y +CONFIG_TEXTSEARCH_FSM=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y CONFIG_HAS_DMA=y diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile index 54e657e55e00..33ee5ec876bf 100644 --- a/drivers/net/wireless/Makefile +++ b/drivers/net/wireless/Makefile @@ -1,7 +1,7 @@ # # Makefile for the Linux Wireless network device drivers. # - +obj-y += wifi_sys/rkwifi_sys_iface.o obj-$(CONFIG_BCM4329) += bcm4329/ obj-$(CONFIG_MV8686) += mv8686/ obj-$(CONFIG_BCM4319) += bcm4319/ diff --git a/drivers/net/wireless/wifi_sys/rkwifi_sys_iface.c b/drivers/net/wireless/wifi_sys/rkwifi_sys_iface.c new file mode 100644 index 000000000000..f83ce51a8209 --- /dev/null +++ b/drivers/net/wireless/wifi_sys/rkwifi_sys_iface.c @@ -0,0 +1,91 @@ + +#include +#include +#include +#include +#include + +static ssize_t wifi_chip_read(struct class *cls, char *_buf) +{ + int count; + +#ifdef CONFIG_BCM4329 + count = sprintf(_buf, "%s", "BCM4329"); + printk("Current WiFi chip is BCM4329.\n"); +#endif + +#ifdef CONFIG_RTL8192CU + count = sprintf(_buf, "%s", "RTL8188"); + printk("Current WiFi chip is RTL8188.\n"); +#endif + + return count; +} + +/* +static ssize_t wifi_channel_write(struct class *cls, const char *_buf, size_t _count) +{ + int ret, channel; + + if (wifi_enabled == 0) + { + printk("WiFi is disabled.\n"); + return _count; + } + + channel = simple_strtol(_buf, NULL, 10); + + ret = wifi_emi_set_channel(channel); + if (ret != 0) + { + //printk("Set channel=%d fail.\n", channel); + } + else + { + //printk("Set channel=%d successfully.\n", channel); + wifi_channel = channel; + } + + return _count; +} +*/ + +static struct class *rkwifi_class = NULL; +static CLASS_ATTR(chip, 0666, wifi_chip_read, NULL); + +int rkwifi_sysif_init(void) +{ + int ret; + + printk("Rockchip WiFi SYS interface (V1.00) ... \n"); + + rkwifi_class = NULL; + + rkwifi_class = class_create(THIS_MODULE, "rkwifi"); + if (IS_ERR(rkwifi_class)) + { + printk("Create class rkwifi_class failed.\n"); + return -ENOMEM; + } + + ret = class_create_file(rkwifi_class, &class_attr_chip); + + return 0; +} + +void rkwifi_sysif_exit(void) +{ + // need to remove the sys files and class + class_remove_file(rkwifi_class, &class_attr_chip); + class_destroy(rkwifi_class); + + rkwifi_class = NULL; +} + +module_init(rkwifi_sysif_init); +module_exit(rkwifi_sysif_exit); + +MODULE_AUTHOR("Yongle Lai"); +MODULE_DESCRIPTION("WiFi SYS @ Rockchip"); +MODULE_LICENSE("GPL"); + From 1cdfe0359ab93d2b18d1fdafd68c7a7dee63dca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Fri, 16 Sep 2011 14:12:56 +0800 Subject: [PATCH 111/150] upload the packed driver of rtl8188cu.(V3.10) --- drivers/net/wireless/Kconfig | 2 +- drivers/net/wireless/Makefile | 1 + drivers/net/wireless/rtl8192c/Kconfig | 8 + drivers/net/wireless/rtl8192c/Makefile | 21 + drivers/net/wireless/rtl8192c/rtl8192c.uu | 11415 ++++++++++++++++ drivers/net/wireless/rtl8192c/wifi_power.c | 112 + drivers/net/wireless/rtl8192c/wifi_power.h | 87 + .../net/wireless/rtl8192c/wifi_power_ops.c | 112 + .../net/wireless/rtl8192c/wifi_power_usb.c | 118 + drivers/net/wireless/rtl8192c/wifi_version.h | 13 + 10 files changed, 11888 insertions(+), 1 deletion(-) create mode 100755 drivers/net/wireless/rtl8192c/Kconfig create mode 100644 drivers/net/wireless/rtl8192c/Makefile create mode 100644 drivers/net/wireless/rtl8192c/rtl8192c.uu create mode 100644 drivers/net/wireless/rtl8192c/wifi_power.c create mode 100644 drivers/net/wireless/rtl8192c/wifi_power.h create mode 100644 drivers/net/wireless/rtl8192c/wifi_power_ops.c create mode 100644 drivers/net/wireless/rtl8192c/wifi_power_usb.c create mode 100755 drivers/net/wireless/rtl8192c/wifi_version.h diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index 4d2f49d75bd2..e0189d992203 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig @@ -57,7 +57,7 @@ choice (4) Murata SP-8HEP-P source "drivers/net/wireless/bcm4319/Kconfig" - +source "drivers/net/wireless/rtl8192c/Kconfig" endchoice #source "drivers/net/wireless/bcm4329/Kconfig" diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile index 33ee5ec876bf..f463629aa9c2 100644 --- a/drivers/net/wireless/Makefile +++ b/drivers/net/wireless/Makefile @@ -5,4 +5,5 @@ obj-y += wifi_sys/rkwifi_sys_iface.o obj-$(CONFIG_BCM4329) += bcm4329/ obj-$(CONFIG_MV8686) += mv8686/ obj-$(CONFIG_BCM4319) += bcm4319/ +obj-$(CONFIG_RTL8192CU) += rtl8192c/ #obj-m += wlan/ diff --git a/drivers/net/wireless/rtl8192c/Kconfig b/drivers/net/wireless/rtl8192c/Kconfig new file mode 100755 index 000000000000..60dc33866eef --- /dev/null +++ b/drivers/net/wireless/rtl8192c/Kconfig @@ -0,0 +1,8 @@ +config RTL8192CU + tristate "Realtek 8192C USB WiFi" + depends on WLAN_80211 && USB + select WIRELESS_EXT + select IEEE80211 + ---help--- + Help message of RTL8192CU + diff --git a/drivers/net/wireless/rtl8192c/Makefile b/drivers/net/wireless/rtl8192c/Makefile new file mode 100644 index 000000000000..f05be4f5503e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/Makefile @@ -0,0 +1,21 @@ + +#EXTRA_CFLAGS += -I$(src)/rkcfg/include + +rk_cfg := \ + wifi_power.o \ + wifi_power_usb.o \ + wifi_power_ops.o + +rkcfg-y += $(rk_cfg) + +obj-$(CONFIG_RTL8192CU) += rtl8192c.o rkcfg.o + +$(obj)/rtl8192c.o: $(obj)/rtl8192c.uu + @echo "UUDE rtl8192c.uu" + @uudecode $(obj)/rtl8192c.uu -o $(obj)/rtl8192c.o + + +.PHONY: clean + +clean: + find . -name '*.o*' -exec rm -f {} \; diff --git a/drivers/net/wireless/rtl8192c/rtl8192c.uu b/drivers/net/wireless/rtl8192c/rtl8192c.uu new file mode 100644 index 000000000000..2bbd985e5b69 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/rtl8192c.uu @@ -0,0 +1,11415 @@ +begin 644 rtl8192cu.o +M?T5,1@$!`0````````````$`*``!```````````````(C04`````!30````` +M`"@`%P`4`![_+^$>_R_A!$`MY40PD.6R(@/C`B#3YP``4N,,```*["T"XP(@ +MT^<``%+C"```&K`@T>$Y`%+C!0``&@0@D>4`0)+E!`!4XP!`H!,!0*`#```` +MZ@!`H..=)0/C`C#3YP,PE.$``*`#`@``"D``T.4``%#B`0"@$Q``O>@>_R_A +M.#"0Y0$P@^(X,(#E'O\OX03@+>4,T$WB"""-X@$08N4M$*#C%#4#XP_@H.$# +M\)#G#-"-X@"`O>AP0"WI`&"@X0!04>(-```*_O__ZPTPH.%_3(&$*#A_O__ZP0PE.4!,$/B!#"$Y?[__^L!`*#C<("] +MZ!!`+>D!0*#A`P"1Z?[__^L$`*#A'!"@X_[__^L0@+WH$$`MZ0%`H.$#`)'I +M_O__ZP0`H.$<$*#C_O__ZQ"`O>@00"WI`$"@X;`PT.$.`%/C$`!3$P(```H$ +M`)#E"!"4Y?[__^L,`)3E``!0XP,```H0$)3E``!1XP````K^___K!`"@X1P0 +MH./^___K$("]Z!!`+>D!`*#A_O__ZQ"`O>CP02WI`$"@X0%0H.$,<)'E5PV` +MXA@`@.($$)'E_O__ZP!@4.+P@;T(`##7Y=@PAN74,(;E_O__ZPT@H.%_/<+C +M/S##XP0@D^4!((+B!""#Y6PPE.4!"!/C`@``"H``$^.`,,,3;#"$%6PPE.4! +M,(/C;#"$Y0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L%`*#A_O__Z_"! +MO>@00"WI`4"@X5<-@.(8`(#B#!"1Y?[__^L$`*#A_O__ZQ"`O>CP02WI`$"@ +MX0%PH.$$8)'E`C#1Y0``4^,%```*`#``XP`P0.,`$)/E10Z`X@P`@.+^___K +M10Z$X@P`@.+^___K_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y6PPE.40 +M`!/C#P``"E==A.(84(7B!&"&X@4`H.$&$*#A_O__ZP``4.,$```:!0"@X080 +MH.'^___K``!0XQ\```H$`*#A_O__ZQP``.IL`(3B_O__ZP"`4.(&```:A`"$ +MXO[__^L`@%#B%```"O[__^L0`(CE`@``Z@@`H.&$$(3B_O__ZWA0EN5X4(7B +M`%"&Y1P`B.(&$*#A!2"@X?[__^MX();EW`"$X@80H.%X((+B_O__ZVPPE.6` +M,,/C;#"$Y0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L'`*#A_O__Z_"! +MO>@00"WI`4"@X0(PT>4``%/C!0``"@`P`.,`,$#C`!"3Y44.@.(,`(#B_O__ +MZP0`H.'^___K$("]Z!!`+>D`0*#A`C#1Y0``4^,.```*_O__ZPT@H.%_/<+C +M/S##XP0@D^4!((+B!""#Y6P@E.4!((+C;""$Y00@D^4!($+B!""#Y?[__^L0 +M@+WH`0"@X?[__^L0@+WH<$`MZ0!0H.$!0*#A`C#1Y0``4^,1```*_O__ZPT@ +MH.%_/<+C/S##XP0@D^4!((+B!""#Y6PPE>4""Q/C`CLC$FPPA14-(*#A?SW" +MXS\PP^,$()/E`2!"X@0@@^7^___K!`"@X?[__^MP@+WH$$`MZ?[__^L0@+WH +M,$`MZ0S03>(`0*#A;#"0Y4``$^,H```:(``3XR8``!H$`%'C`?&?ER,``.KX +M!`````4```@%```T!0``8`4``/[__^L<``#J_O__ZQH``.H(((WB`3"@XP$P +M8N4`$*#C5S(#XP,0P.(`,*#C`3!E +MY?[__^L$`*#A)!"@XP4@H.$4-0/C#^"@X0/PE.<$``#J_O__ZUPR`^,#`(3G +M!`"@X?[__^L,T(WB,("]Z/!'+>D`0*#A?#4#XP,PD.<``%/C````"C/_+^%L +M,)3E(@T3XT0``!H$`*#A_O__ZVPPE.4!`!/C+P``"@@UE.5D`%/C!0``B@0E +ME.5D`%+C`&"@DP9PH)$&H*"1#```F@0EE.4"`%/A`6"@@P!PH(,&H*"!!@`` +MB@(`4^$`8*`S`7"@,P>@H#$`8*`C!G"@(0&@H"/Z#E/C!```B@0EE.7Z#E+C +M`%"@DP6`H)$%``":B",!XP(`4^$`4*"3`8"@DP%0H(,%@*"!##64Y00EE.4" +M((/@"`!2XP0``(H"`%/C`@``B@0`H.'^___K"0``Z@0`H.'^___K!@``Z@0` +MH.'^___K`%"@XP6`H.$%8*#A!7"@X06@H.$`,*#C"#6$Y00UA.4,-83E$*7$ +MY1%UQ.429<3E$X7$Y115Q.4$`*#A$#4#XP_@H.$#\)3G\(>]Z/!'+>D`8*#A +M`$!1X@0`H`/PA[T(`#"4Y0$P0^((`%/C`_&?ESP``.H8!P``Z`<``.@'```L +M!P``0`<``%`'``#H!P``Z`<``&`'```&`*#A"!"4Y00@E.7^___K+@``Z@8` +MH.$($)3E!""4Y?[__^LI``#J!@"@X000U.7^___K)0``Z@8`H.$$$-3E_O__ +MZR$``.H&`*#A_O__ZP!04.(=```*S#"5Y0``4^,:```:`%"@XQ2$`.,`?P_C +M_W!`XV2@H.,$``#J"@"@X?[__^L!4(7B"P!5XP\```H&`*#A"!"@X?[__^L' +M`!#A]?__&@H`5>,(``#*GC,"``#:_O__ZP``H./PA[WH``"@ +MX_"'O>AP0"WI`&"@X0!04>(`0*`##@``"@40H.'^___K`$!0X@(``!H%`*#A +M_O__ZP<``.H8`(;B!1"@X?[__^L`0*#A`0!0XP$``!H&`*#A_O__ZP0`H.%P +M@+WH\$$MZ0"`H.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,=```*#`"@X_[_ +M_^L`8*#A`'"@X0``4.,$```:!0"@X1P0H./^___K`$"@XQ(``.H),*#C`#"` +MY0!0H.,$4(#E"%"`Y10`A.+^___K.3"@X[`PQ.$$8(3E##"@XP@PA.4,4(3E +M$%"$Y4L-B.((`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP02WI`'"@X1P`H./^ +M___K`$"@X0!@H.$``%#C'P``"@P`H./^___K`%"@X0"`H.$``%#C!```&@0` +MH.$<$*#C_O__ZP!`H.,4``#J!#"@XP`P@.4`0*#C"$"`Y40`G^5$$)_E_O__ +MZQ0`AN+^___K.3"@X[`PQN$$4(;E##"@XP@PAN4,0(;E$$"&Y4L-A^((`(#B +M!A"@X?[__^MP0._F!`"@X?"!O>@``````````/!%+>D,T$WB`$"@X0%PH.$" +M8*#A"""-X@`PH.,!,&+E`1"@XQPU`^,/X*#A`_"0YP=0W>4``%7C`4"@`RH` +M``H!`%;C)```&AP`H./^___K`&"@X0!0H.$``%#C`$"@`R$```H,`*#C_O__ +MZP"`H.$`H*#A``!0XP0``!H&`*#A'!"@X_[__^L`0*#C%@``Z@8PH..(`(#H +M`&"@XPA@@.44`(7B_O__ZSDPH..P,,7A!("%Y0PPH.,(,(7E#&"%Y1!@A>5+ +M#83B"`"`X@40H.'^___K<$#OY@,``.H$`*#A!Q"@X?[__^L!0*#C!`"@X0S0 +MC>+PA;WH\$]Z/!!+>D`@*#A`7"@X1P`H./^___K`&"@X0!`H.$``%#C`$"@ +M`Q@```H!`*#C_O__ZP!04.($```:!@"@X1P0H./^___K`$"@XP\``.H`<,7E +M%`"$XO[__^L[,*#CL##$X010A.4!,*#C"#"$Y0`PH.,,,(3E$#"$Y4L-B.(( +M`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP02WI`("@X1P`H./^___K`%"@X0!` +MH.$``%#C`$"@`QT```H,`*#C_O__ZP!@H.$`<*#A``!0XP0``!H%`*#A'!"@ +MX_[__^L`0*#C$@``Z@$PH.,`,(#E`%"@XP10@.4(4(#E%`"$XO[__^LY,*#C +ML##$X01@A.4,,*#C"#"$Y0Q0A.404(3E2PV(X@@`@.($$*#A_O__ZW!`[^8$ +M`*#A\(&]Z/!'+>D`H*#A`7"@X0*`H.$<`*#C_O__ZP!0H.$`0*#A``!0XP!` +MH`,=```*#`"@X_[__^L`8*#A`)"@X0``4.,$```:!0"@X1P0H./^___K`$"@ +MXQ(``.H$<(#D"!"@X08@H./^___K%`"$XO[__^LM,*#CL##$X01@A.4,,*#C +M"#"$Y0`PH.,,,(3E$#"$Y4L-BN((`(#B!!"@X?[__^MP0._F!`"@X?"'O>CP +M1RWI`("@X0%PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,F```*!@"@X_[_ +M_^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,=``#J!`"@X_[__^L`H%#B!P`` +M&@4`H.$<$*#C_O__ZP8`H.$&$*#C_O__ZP!`H.,1``#J%`"$XO[__^L6,*#C +ML##$X01@A.4&(*#C"""$Y0R@A.4$,*#C$#"$Y08`H.$'$*#A_O__ZTL-B.(( +M`(#B!!"@X?[__^MP0._F!`"@X?"'O>CP1RWI`("@X0%PH.$<`*#C_O__ZP!0 +MH.$`0*#A``!0XP!`H`,;```*!`"@X_[__^L`8*#A`*"@X0``4.,$```:!0"@ +MX1P0H./^___K`$"@XQ```.H4`(3B_O__ZR(,$('B$""@X_[__^L!(*#C +M`3L!XP,@Q>=+#87B"`"`X@00H.'^___K<$#OY@0`H.'PA[WH\$$MZ0"`H.$! +M<*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#&```"@0`H./^___K`&!0X@0` +M`!H%`*#A'!"@X_[__^L`0*#C#P``ZA0`A.+^___K$3"@X[`PQ.$$8(3E!#"@ +MXP@PA.4`,*#C##"$Y1`PA.4`<,;E2PV(X@@`@.($$*#A_O__ZW!`[^8$`*#A +M\(&]Z/!!+>D`<*#A'`"@X_[__^L`8*#A`$"@X0``4.,`0*`#%P``"@0`H./^ +M___K`%!0X@0``!H&`*#A'!"@X_[__^L`0*#C#@``ZA0`A.+^___K#S"@X[`P +MQ.$$4(3E!#"@XP@PA.4`,*#C##"$Y1`PA.5+#8?B"`"`X@00H.'^___K<$#O +MY@0`H.'P@;WH\$(`0*#A`5"@X7Q@D>6L-`/C`S"0YP``4^,!```* +M"!"@XS/_+^$<`*#C_O__ZP!PH.$``%#C`$"@`X\```IL,)3E*``3XP8``!H` +M`%;C(#"#`VPPA`4"```*`0!6XP@P@P-L,(0%&VR$XAA@AN(``%;C`P``&AP0 +MH./^___K`$"@XWT``.H&`*#A`!"@X]\OH./^___KE""5Y08`H.$<$(7B>""" +MXO[__^N0.P'C`R"4YP@T`N,#(,3G#"!"XOX`4N,%``"*"0N$X@D`@.)N'83B +M(!"!XO[__^L%``#J"0N$X@D`@.)N'83B(!"!XO\@H./^___K`""@XY`[`>,# +M((3GC#24Y0(`4^$#```:N`"$XB`0A>(&(*#C_O__ZYB@A>)NC83B%("(X@0` +MH.$*$*#A"""@X90PE>7^___KD#L!XP,`A.<`,*#CQ#2$Y5HZ`N,#,-3G``!3 +MXP\```J4,)7E``"-Y00`H.$*$*#A"""@X?[__^L`D*#AD#L!XP,PE.<``%/A +MD#L!$P,`A!5N+83B$"""X@`@ +MC>4$`*#A"A"@X0@@H.'^___KD#L!XP,@E.<(-0+C`R#$Y_X`4N,%``"*)0R$ +MX@D`@.)N'83B%!"!XO[__^L%``#J)0R$X@D`@.)N'83B%!"!XO\@H./^___K +MD#L!XP,PE.=X,(/B"#"'Y10`A^+^___K#C"@X[`PQ^$$8(?E`#"@XPPPA^40 +M,(?E2PV$X@@`@.('$*#A_O__ZW!`[^8$`*#A"-"-XO"'O>CP02WI`'"@X0%0 +MH.$"8*#A'`"@X_[__^L`0%#B`$"@`PP```H4`(3B_O__ZQ`PH..P,,3A8`"$ +MZ0`PH.,,,(3E$#"$Y4L-A^((`(#B!!"@X?[__^MP0._F!`"@X?"!O>AP0"WI +M`%"@X:PT`^,#,)#G``!3XP$```H($*#C,_\OX1P`H./^___K`$!0X@!`H`,4 +M```*%`"$XO[__^L0,*#CL##$X:D]A>(D,(/B!#"$Y=PZ`N,#8)7G>&"&X@A@ +MA.4`,*#C##"$Y1`PA.5D.@+C`V"%YTL-A>((`(#B!!"@X?[__^MP0._F!`"@ +MX7"`O>CP1RWI`*"@X0&`H.$"<*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`# +M%P``"@$`H./^___K`&!0X@0``!H%`*#A'!"@X_[__^L`0*#C#@``ZA0`A.+^ +M___K!#"@X[`PQ.$$8(3E`2"@XP@@A.4,<(3E$#"$Y0"`QN5+#8KB"`"`X@00 +MH.'^___K<$#OY@0`H.'PA[WH\$]Z/!' +M+>D`H*#A`8"@X0)PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,7```*`0"@ +MX_[__^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,.``#J%`"$XO[__^L",*#C +ML##$X01@A.4!,*#C"#"$Y0QPA.40,(3E`(#&Y4L-BN((`(#B!!"@X?[__^MP +M0._F!`"@X?"'O>CP1RWI`*"@X0%PH.$"@*#A'`"@X_[__^L`4*#A`$"@X0`` +M4.,`0*`#&0``"@(`H./^___K`&!0X@0``!H%`*#A'!"@X_[__^L`0*#C$``` +MZA0`A.+^___K`S"@X[`PQ.$$8(3E`C"@XP@PA.4`,*#C##"$Y1`PA.4`<,;E +M`8#&Y4L-BN((`(#B!!"@X?[__^MP0._F!`"@X?"'O>CP1RWI`*"@X0%PH.$" +M@*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#&0``"@(`H./^___K`&!0X@0` +M`!H%`*#A'!"@X_[__^L`0*#C$```ZA0`A.+^___K'S"@X[`PQ.$$8(3E`C"@ +MXP@PA.4`,*#C##"$Y1`PA.4!<,;E`(#&Y4L-BN((`(#B!!"@X?[__^MP0._F +M!`"@X?"'O>CP02WI`("@X0%PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,: +M```*#0"@X_[__^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,1``#J%`"$XO[_ +M_^L9,*#CL##$X01@A.4-(*#C"""$Y0`PH.,,,(3E$#"$Y08`H.$'$*#A_O__ +MZTL-B.((`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP02WI`("@X0%PH.$<`*#C +M_O__ZP!0H.$`0*#A``!0XP!`H`,=```*#@"@X_[__^L`8%#B!```&@4`H.$< +M$*#C_O__ZP!`H.,4``#J%`"$XO[__^L;,*#CL##$X01@A.4.,*#C"#"$Y0`P +MH.,,,(3E$#"$Y08`H.$%,*#C`3#`Y`<0H.$-(*#C_O__ZTL-B.((`(#B!!"@ +MX?[__^MP0._F!`"@X?"!O>CP1RWI`$"@X0&@H.%L,)#E`0`3XP(```H`$*#C +M`2"@X_[__^L<`*#C_O__ZP!PH.$`4*#A``!0XP!0H`-(```*,`"@X_[__^L` +M@*#A`&"@X0``4.,$```:!P"@X1P0H./^___K`%"@XST``.H$`*#A`!"@X_[_ +M_^L4`(7B_O__ZQ(PH..P,,7A!("%Y3`PH.,(,(7E`!"@XPP0A>40$(7E!#"( +MY4HUU.4`,(CE"!"(Y0QPB.('`*#A(2"@X_[__^L``%KC!P``"@`@FN4``%+C +M!```"@<`H.$$$(KB_O__ZP`PFN4(,(CE;#"4Y0([@^-L,(3E2PV$X@@`@.(% +M$*#A_O__ZW!0[^8!`%7C$0``&O[__^O`!(3E`#``XP`P0.,`$)/E20Z$XC(> +M@>+^___KK#0#XP,PE.<``%/C`@``"@0`H.$&$*#C,_\OX1XPH.-8-(3E`@`` +MZFPPE.4".\/C;#"$Y04`H.'PA[WH\$D4T$WB`$"@X4M]@.((<(?B````XP``0.,`$`#C`!!`X_[__^L/`*#C_O__ +MZ^PR`>,#,)3G"#"-Y0$@H.,(,P'C`R#$YP>`H.$-(*#A?RW"XS\@PN,$((WE +M#""-Y8BE`^.,E0/C_+(!XP10H.$(`*#A_O__ZP``4.--```*!0"@X?[__^L! +M`%#C]___&@HPE>4$$);E +M!""@X?[__^NP,-;A/`!3XQH``(H`(`#C`"!`XX,Q@N`$0)/E``!4XP,```H% +M`*#A"!"=Y33_+^$"`,;EL##6X0`@`.,`($#C@S&"X.1!D^4``%3C`@``&@8` +MH.'^___K`@``Z@4`H.$&$*#A-/\OX>@B`>,",-7G`3"#X@(PQ><$()WE##"2 +MY00PD^4`,)/E`0`3X[G__PH,,)WE#`"3Y?[__^NU___J!4"@X0(``.H%0*#A +M````Z@5`H.$`(*#C"#,!XP,@Q.<$4*#A!P"@X?[__^L`0%#B`@``"@0`H.'^ +M___K^/__ZDL-A>(4`(#B_O__ZP``H.,`$*#A_O__ZQ!`+>D`0%#B$("]""`` +MA.+^___K!`"@X?[__^L,`(3B_O__ZR@`E.4``%#C`0``"@8@00"WI_O__ZQ"`O>@00"WI`$"@X0`0H./^ +M___K#`"$X@`0H./^___K&`"$XO[__^L!,*#C(##$Y08,H./^___K*`"$Y0`` +M4.,2```*?P^`X@,`@.*@!*#A@`2@X20`A.6!#Z#C_O__ZS``A.4``%#C"``` +M"@,`@.(#`,#C+`"$Y0`PH.,\,(3E.#"$Y30PA.4!0*#C````Z@!`H.,$`*#A +M$("]Z!!`+>G^___K$("]Z/`%+>D`0*#C`$"`Y01`@.4`,*#A`,"@X0A`S.4! +M0(3B`<",X@$,5./Z__\:`:R#X@!0H.,%0*#A"("@XPA@T^4&4(7@!,#1YPQ0 +MA>#_4`7B!<"`X`C`C.``<-SE`&#,Y0APP^4!0(3B`@!4X0!`H",!,(/B"@!3 +MX>___QKP!;WH'O\OX?`/+>D!L*#A``!3XQD```H`0*#C","@XP20TN<`4)#E +M`5"%XO]0!>(%@(#@#("(X``0V.4$8)#E!F"!X/]@!N(&H(#@#*"*X`!PVN5@ +M`(#H`!#*Y0!PR.4!$(?@<1#@Y@P0T>@>_R_AH!"@X0@0`>*`$X'AH#&@X:`3@>$$,`/BH"*@X0,P@>$"(`+B@!*@ +MX0(P@^%`$`'B@"&@X0$P@^$@(`+B@`"@X0(P@^$0``#B``"#X7``[^8>_R_A +M\$\MZ1303>(`L*#A!!"-Y0`P`.,`,$#C`$"3Y0``5.,D```:Y%"?Y0!@H.,( +MD*#CMWT!X\%T0.-V`._FVO__ZP`,H.$)0*#A``!0XX``)["``*"A`4!4XOK_ +M_QH@2*#A((2@X0"@H.$@#*#ASO__ZP``Q>5T`._FR___ZP$`Q>5X`._FR/__ +MZP(`Q>5Z`._FQ?__ZP,`Q>4!8(;B!%"%X@$,5N/C__\:`#``XP`P0.,!(*#C +M`""#Y00PG>4``%/C`$#@TPX``-H$P)WE`#"@XP!`X.,```#C``!`XP00H.,# +M(-OG`B`DX/\@`N("(8#@`2"2YR1$(N`!,(/B#`!3X?;__QH$`.#A%-"-XO"/ +MO>@$````,``MZ0!0H.,%0*#A!"#0YX0QH.$24X7A`4"$X@0`5./Y__\:!0"@ +MX3``O>@>_R_A,``MZ0`0P.4`0*#A(52@X0%0Y.4A6*#A`5#DY2$D` +M0*#A`5"@X0$`H.';___K``"$Y00`A>+8___K!`"$Y00`H.'L___K<("]Z`1` +M+>44,)#E@\&@X1`@D.41+(+A$""`Y0$P@^(4,(#E`P!3XQ4``)H(P)#E#"`B +MX`Q`D.7B1R3@`B"$X/\TPN/_/,/C_QC"X_\0P>,A%*#A`S2!X00P(^`"((/@ +MXCXCX`(@@^!B,2/@##"`Y0(@@^`(((#E`#"@XQ`P@.44,(#E$`"]Z![_+^'P +M02WI`'"@X0%@H.$`4%+B\(&]"`!`H.,'`*#A!!#6Y_[__^L!0(3B!0!4X?G_ +M_QKP@;WH<$`MZ0!`H.$!8*#A6A"@X_[__^L$`*#A`!"@X_[__^L$`*#A`!"@ +MX_[__^L$`*#A`!"@X_[__^L$`*#A`!"@X_[__^L4,)3E``!3XP8```H`4*#C +M!`"@X040H.'^___K%#"4Y0``4^/Y__\:!@"@X0@0E.63___K!`"&X@P0E.60 +M___K!`"@X9G__^MP@+WH\$`MZ2303>(`P*#A`4"@X0)@H.$#<*#A/%#=Y0`P +MH.,$,,WE!3#-Y08PS>4',,WE"`"-X@P0H.'^___K!%#-Y010H.$!,/7E`0`3 +MXQ````H(`(WB$!"$X@8@H./^___K`##5Y0(`$^,$```*"`"-XA@0A.(&(*#C +M_O__ZQ0``.H(`(WB"A"$X@8@H./^___K#P``Z@@`C>($$(3B!B"@X_[__^L` +M,-7E`@`3XP0```H(`(WB$!"$X@8@H./^___K`P``Z@@`C>(*$(3B!B"@X_[_ +M_^L(0(WB!`"@X000C>($(*#C_O__ZP0`H.$&$*#A!R"@X?[__^L$`*#A.!"= +MY?[__^LDT(WB\("]Z/`/+>D(T$WBL##`X0"@H.$C.*#ALC#JX0"`H.$!P-+E +M`##2Y0PT@^&T,.CA`'"@X0/`TN4",-+E##2#X;8PY^$`P*#A!4#2Y00PTN4$ +M-(/AN##LX0!`H.,`,`#C`#!`X[!0W.$!(`3B@I"@X0E@@>`$8(WE`Y0&0 +MB>()D('@`)"-Y0"PV>4+M*#A!9`FX`N0*>`IE*#A`9R)XHF0@^`%8";@=F#O +MYH9@@^"P4-GALX090)>"P8-#A!E"%X'50_^:P4,#A`I""XHF0H.$!8*#A +M"9#VYP%@UN4&9*#A"6`FX`5@)N`F9*#A`6R&XH9@@^`%D"G@>9#OYHF0@^"P +M4-;AL X090)>"P8-KA!E"%X'50_^:P4,KA!)""XHF0H.$!8*#A"9#VYP%@ +MUN4&9*#A"6`FX`5@)N`F9*#A`6R&XH9@@^`%D"G@>9#OYHF0@^"P4-;AL +MX090)>"P8-CA!E"%X'50_^:P4,CA!B""XH(@H.$!8*#A`B#VYP%@UN4&9*#A +M`F`FX`5@)N`F9*#A`6R&XH9@@^`%4"+@=5#OYH50@^"P(-;AL%#5X04@(N"P +M4-?A!2""X'(@_^:P(,?A!)"=Y0!0V>4`L)WE`&#;Y09DH.&PD-SA!6`FX`)@ +M)N`F9*#A`6R&XH9@@^`"4"7@=5#OYH50@^"P(-;ALX0E0A.`&("+@`B"% +MX+`@S.$!0(3B"`!4XX___QH(T(WB\`^]Z![_+^'P#RWI$-!-X@#`H.,$0(WB +MO%"2X;Q0A.$"P(SB"@!&P0-3A!'`GX+1`W>$$0(?@='#_Y@)`T>4#4-'E!52@X010)>`'4"7@)52@ +MX0%*%4(+@!T`DX'1`[^:$0(+@L(#5X;!`U.$$@"C@MD#=X01`B.!T@/_F +M!$#1Y050T>4%5*#A!%`EX`A0)>`E5*#A`5R%XH50@N`(0"3@=$#OYH1`@N"P +MH-7AL$#4X02@*N"X0-WA!$"*X'2@_^8&0-'E!U#1Y054H.$$4"7@"E`EX"54 +MH.$!7(7BA5""X`I`).!T0._FA$""X+"0U>&P0-3A!)`IX+I`W>$$0(G@=)#_ +MY@A`T>4)4-'E!52@X010)>`)4"7@)52@X0%*%4(+@";`DX'NP[^:+L(+@ +ML$#5X;!0V^$%4"3@O$#=X01`A>!T4/_F"K#1Y0M`T>4$1*#A"T`DX`5`).`D +M1*#A`4R$XH1`@N`%L"O@>[#OYHNP@N"P(-3AL$#;X00@(N`"8(;@=F#_Y@U` +MT>4,(-'E!"2"X08@(N""1Z#AHB"$X0)PA^!W(/_FM"#-X0]PT>4.0-'E!W2$ +MX0)P)^"')Z#AIW""X0>`B.!X@/_FMH#-X:@@H.&(AR+@"*"*X'J@_^:XH,WA +MJB"@X8JG(N`*D(G@>9#_YKJ0S>&I(*#AB9!U4/_FO%#-X:4@H.&% +M5R+@!6"&X'9@_^:^8,WA(R2@X0`@P.5?(`+B("""XP$@P.4",,#E`"#4"-(/A!F`CX,9@H.$#8,#E`#"@XP00C>*S()'A!"#`Y2(DH.$%(,#E`C"# +MX@(`@.(,`%/C]___&A#0C>+P#[WH'O\OX01`+>4`0*#C!,#1YP0PT.<#,"S@ +M!##"YP%`A.(0`%3C^/__&A``O>@>_R_A!$`MY0!`H.,$P-'G!##0YP,P+.`$ +M,,+G`4"$X@0`5./X__\:$`"]Z![_+^$`,`#C`#!`XP`P@^``!-/E'O\OX7!` +M+>D0T$WB`$"@X0%0H.$-,*#AH""?Y0<`DN@'`(/H#0#4Y?#__^L,`,WE#@#4 +MY>W__^L-`,WE#P#4Y>K__^L.`,WE!&"@X0P`]N7F___K#P#-Y1`PC>(%4(/@ +M$%!5Y00`H.$,$(WB!""@X=/__^L`,-3E`S`EX`10H.$$,,7D!0"@X000H.$% +M(*#AR___ZPA`A.($`*#A!1"@X00@H.'&___K!@"@X000H.$&(*#APO__ZQ#0 +MC>)P@+WH#`4``'!`+>D`4*#A`6"@X0!`H.,$`-7GQ/__ZP0`QN4%,-#E`3#!Y0HPT.4",,'E#S#0Y0,PP>4$,-#E +M!##!Y0DPT.4%,,'E#C#0Y08PP>4#,-#E!S#!Y0@PT.4(,,'E#3#0Y0DPP>4" +M,-#E"C#!Y04!,-#E#3#!Y08PT.4.,,'E"S#0Y0\P +MP>4>_R_A\$`MZ2303>(`0*#A`7"@X0!0H.,<$(WB!0"@X1O`H./5()3A``!2 +MXP7`P;<%`,&G`5"%X@0`5>/X__\:`B#4Y1`@S>4#,-3E$3#-Y000H.$!`-'D +M$@#-Y0`0T>43$,WE%##-Y14`S>46$,WE%R#-Y7\``.(,`,WE?Q`!X@T0S>5_ +M(`+B#B#-Y7\P`^(/,,WE`R"@XP)0H.$,,(WB!1#3YX$0H.%Q$._F!1##YP%0 +M1>+5`)/A``!0XP$0@;,"$,.W`2!"X@``5>/S__\:#%#=Y850H.$,4,WE&%"- +MXAP`C>(,$(WB!2"@X5C__^L(8(WB!`"@X040H.$&(*#A4___ZP@PW>4$,,WE +M"4#=Y0A`S>4*0-WE"4#-Y0M`W>4*0,WE"S#-Y01`C>(%`*#A!A"@X00@H.%% +M___K#5"@X1``C>(4$(WB#2"@X4#__^L$`*#A#1"@X0<@H.$\___K)-"-XO"` +MO>CP3RWI3-!-XA00C>4"@*#A`$"@XQ@@C>($,-#G!##"YP%`A.(0`%3C^O__ +M&@%@H.,`0*#C.'"-XBB0C>($L(GB!#"'X@`PC>4(,(GB!#"-Y0@PA^((,(WE +M##")X@PPC>4,,(?B$#"-Y1B@C>($4*#A`0``Z@%0A>(!8(;B!4"@X0``5>,' +M```:"@"@X100G>4((*#A"?__ZPH`H.$`$*#C(?__Z_+__^H*`%7C#```&CA0 +MC>((`*#A!1"@X4K__^LH0(WB!0"@X000H.%1___K!`"@X1@0C>(((*#A]_[_ +MZQD``.H(`*#A!Q"@X3[__^L'`*#A"1"@X4;__^L)`*#A!Q"@X63__^L+`*#A +M`!"=Y6'__^L#`)WI7___ZPP`G>40$)WE7/__ZP<`H.$*$*#A"""@X>'^_^L* +M`*#A!1"@X?G^_^L*`%;CR?__VDS0C>+PC[WH\``MZ1!0G>44P)WE64"@XP!` +MP.4"<*#A`&!1X@%@H!,``%+C``!1$QX@TQ4/(`(2`2#`%0``5^,`8*`3`6`& +M`@``5N,8(-,5#R`"$@$@P!4``%'C`""@`P$@P`4"0*#C"B#3Y00@P.@>_R_A`C!1XOT0@4(#$*!1012@X0`0P.4!,,#E`##2Y3`P +MP^,",,#E`3#2Y3@PP^,#,,#E!##2Y00PP.4%,-+E!3#`Y08PTN4&,,#E!S#2 +MY0D`0*#C!,"@X03`P.4!P,#E$L#1Y0+`P.43P-'E`\#`Y13` +MT>4$P,#E%<#1Y07`P.4`P*#C!L#`Y0?`P.4,<%+@`7"@$PP`4^$`P*`3`<`' +M`@``7.,)```*`5"@X0#`H.$`0*#C&Y0A@S.4!0(3B`5"%X@'`C.(&`%3C +M^/__&@`P4^(!,*`3``!2XP`@H!,!(`,"``!2XQ@@T14/(`(2""#`%0`@H!,) +M(,`5`P`7X0X```H!(*#A`#"@X0!`H.,8P-+E",##Y0%`A.(!((+B`3"#X@8` +M5./X__\:'C#1Y0\P`^(.,,#E`#"@XP\PP.7P`+WH'O\OX7``+>D,4)WE$&"= +MY0!`H.,$P*#A!,#`YP%`A.(0`%3C^___&@'`H.,`P,#E`,!2X@'`H!,``%'C +M``!2$QX@TQ4/(`(2`2#`%0``4>,`$*`3`1`,`@``4>,8(-,5#R`"$@$@P!4" +M0*#C"B#3Y00@P.<$(,#G`4"$X@$P +M0^(.`%3C^?__&O\PAN(``%;C!C"@H4,TH.$.,,#E#V#`Y7``O>@>_R_A!$`M +MY0!`H.,$P-'G!##0YP,P+.`$,,+G`4"$XA``5./X__\:$`"]Z![_+^$!(*#C +M`3L!XP,@P.<>_R_A\$\MZ4_?3>(`L*#A`6"@X6R0D>4``%GC>```"ATPT>4" +M`%/C=P``&EQ0D>4``%7C!0``&E<-@.(8`(#B1A"!XO[__^L`4%#B;```"D8P +MUN4!`!/C"#@!$P,PFQ<#,HL0!CN#$@PP@Q(`,(T5$5Z%`@!0C04HD(GB0""& +MX@0@C>4`H*#C60``ZK(QUN$#4(G@'H#6Y0.`B.`(@(G@`C#5Y1-`Q^<`,-7E +M$T3/YP0PU>432-?G!3#5Y1-,W^<&,-7E$W#'YP43=,_G)#B@X48/C>(& +M`)WH!SB#X9+\_^M*#XWB`!"=Y48OC>)T,/_F&/W_ZP&@BN(<,-;E`P!:X1D` +M`!JR,=;A&%"6Y0508^`>,-;E!5!CX!\PUN4%4&/@"`"@X040H.%Y^__K%`&- +MY0P`C>)*'XWB$""@XQ[[_^L,`(WB"!"@X0@@H.$%,*#A.OO_ZPP`C>(%$(C@ +M12^-X@0PH.,U^__K(```ZK(QUN$,)`'C`E";YP508^`>,-;E!5!CX!\PUN4% +M4&/@"`"@X040H.%>^__K%`&-Y0P`C>)*'XWB$""@XP/[_^L,`(WB"!"@X0@@ +MH.$%,*#A'_O_ZPP`C>(%$(C@12^-X@0PH.,:^__K#"0!XP(PF^<#D(G@`S`9 +MX@$PH!,ID8/@"9&@X1PPUN4#`%KAHO__N@$``.H`0*#C````Z@%`H.,$`*#A +M3]^-XO"/O>CP1RWI$]Y-X@!@H.$!0*#A<%"1Y30PT>4"`%/C`4"@$U<``!I$ +MH(3B5PV`XA@`@.(*$*#A_O__ZP!P4.)/```*2C#4Y0$`$^,1GH<"!0``"C@! +MG^7^___K5C#4Y0-BAN`&FX;B#)")XB@PE.4#8(7@+""4Y0-P@N`'<(7@:("4 +MY0B`8^`(@&+@`C#6Y0!`H.,30,?G`##6Y1-$S^<$,-;E$TC7YP4PUN433-_G +M!C#6Y0!0H.,34,?G!S#6Y1-4S^<1;HWB)#B@X08`H.$)$*#A"B"@X04X@^$- +M_/_K$EZ-X@4`H.$)$*#A!B"@X70P_^:2_/_K!$"-X@0`H.$%$*#A$""@XZ;Z +M_^L$`*#A!Q"@X0<@H.$(,*#APOK_ZP<`H.$$$$CB]/K_ZPP!C>4(,(?@`3!3 +MY2`,4^$0```:"#"'X`Y!W>4",%/E`P!4X0L``!H(,(?@#4'=Y0,P4^4#`%3A +M!@``&@APA^`,0=WE!#!7Y0,`5.$`0*`3`4"@`P```.H`0*#C!`"@X1/>C>+P +MA[WH*````/!/+>FLT$WB`+"@X1P0C>4(((WE(#"-Y;!`TN'\0`3BD`"-X@`0 +MH.,0(*#C_O__ZX``C>(`$*#C$""@X_[__^MP`(WB`!"@XQ`@H./^___K8`"- +MX@`0H.,0(*#C_O__ZU``C>(`$*#C$""@X_[__^M``(WB`!"@XQ`@H./^___K +M,`"-X@`0H.,0(*#C_O__ZQP`G>4:`%#C&`!0$P`@H!,!(*`#`2`BXG(@[^8D +M,J#A"#!#X@,`4^,`0*"#!@``BAP0G>4:`%'C`4"@`QPPG14",(,2'#"-%0%` +MH!,(,)WE'`"=Y0`0\^>@$,WE`1#3Y:$0S>4$$-/EHA#-Y040T^6C$,WE!A#3 +MY:00S>4',-/EI3#-Y11`C>40((WED$"-XB`0G>4`$(WEH#"-X@0PC>4$`*#A +M%!"=Y0@PG>7R_?_K@&"-X@8`H.$<$)WE"""=Y1?^_^MP<(WB!P"@X0@0G>40 +M()WE%#"=Y3;^_^L@()WE#R`"XB0@C>4@,)WE(S*@X0PPC>4<`)WE"`"`XA@` +MC>5`4(WB"P"@X000H.$%(*#AA/W_ZU!`C>(%`*#A!A"@X00@H.&7_O_K"P"@ +MX000H.$%(*#A>_W_ZP4`H.$'$*#A!""@X8_^_^L+`*#A!!"@X04@H.%S_?_K +M#!"=Y0``4>,84)T%%0``"@@@G>48,)WE`U""X`!`H.-`8(WB4'"-X@R`G>4& +M`*#A!1"@X0<@H.%\_O_K"P"@X0<0H.$&(*#A8/W_ZP%`A.(04(7B!`!8X?/_ +M_XH8`)WE#!"=Y0%2@.`D()WE``!2XQT```H`0*#C,""-X@0PH.$$,,+G`4"$ +MXA``5./[__\:`$"@XS`0C>((,)WE!2"#X`5@H.$D4)WE!##2YP0PP>)00(WB!@"@X3`0C>($(*#A5/[_ZPL`H.$$ +M$*#A!B"@X3C]_^L`0*#C*!"-XD`@C>($,-+G!##!YP%`A.((`%3C^O__&@!` +MH.,($)WE!5"!X"@@C>($,-+G!##%YP%`A.((`%3C^O__&AX``.H!@(CBH""- +MX@0!C>@*`*#A$!"=Y10@G>4(,)WE!_[_ZPL`H.$*$*#A"2"@X1K]_^L'8*#A +M"0"@X0<0H.$%(*#A+?[_ZP!`H.,$,-7G!##&YP%`A.(0`%3C^O__&A!PA^(, +M,)WE"`!3X>3__XH8`)WE`P*`X!@`C>4*``#J#!"=Y0``4>,'```*"""=Y1@P +MG>4#<(+@`("@XV"@C>)`D(WB4%"-XM7__^HD`)WE``!0XS$```J@,(WB`#"- +MY0P0G>4!,('B!#"-Y6``C>(0$)WE%""=Y0@PG>78_?_K`$"@XS`@C>($,*#A +M!##"YP%`A.(0`%3C^___&@!`H.,(()WE&`"=Y0`P@N`P$(WB)&"=Y0-0H.$$ +M(-/G!"#!YP%`A.(&`%3A^?__&D!`C>(+`*#A8!"-X@0@H.'7_/_K!`"@X3`0 +MC>)0((WBZ_W_ZP!`H.-0((WB)&"=Y00PTN<$,,7G`4"$X@8`5.'Z__\:&!"= +MY20@G>4"$('@&!"-Y:`PC>(`,(WE`$"@XP1`C>5@`(WB$!"=Y10@G>4(,)WE +MI_W_ZS`@C>($,*#A!##"YP%`A.(0`%3C^___&AP`G>4@$)WE`3"`X`@@G>4# +M,(+@`$"@XS`0C>(((-/E!"#!YP%`A.(!,(/B"`!4X_G__QI`0(WB"P"@X6`0 +MC>($(*#AIOS_ZP0`H.$P$(WB4""-XKK]_^L`0*#C"#"=Y1@`G>4`$(/@4""- +MX@0PTN<$,,'G`4"$X@@`5./Z__\:`0"@XZS0C>+PC[WH\$,=``#J`5"%X@4`4^$*```:LA'4X1C`E.4,P&'@'C#4 +MY0S`8^`?,-3E"@"@X0@@H.$,,&/@?/[_ZP\``.JR$=3A!\"6YPS`8>`>,-3E +M#,!CX!\PU.4*`*#A"""@X0PP8^!Q_O_K!S"6YP.`B.`#,!CB`3"@$RB!@^`( +M@:#A'##4Y0,`5>'>__^Z`0``Z@!`H.,```#J`4"@XP0`H.'PA[WH\$\MZ;30 +M3>(4`(WE)!"-Y0*PH.$L,(WEL$#2X?Q`!.*8`(WB`!"@XQ`@H./^___KB`"- +MX@`0H.,0(*#C_O__ZW@`C>(`$*#C$""@X_[__^MH`(WB`!"@XQ`@H./^___K +M6`"-X@`0H.,0(*#C_O__ZT@`C>(`$*#C$""@X_[__^LX`(WB`!"@XQ`@H./^ +M___K+!"=Y0@00>(H$(WE(2*@X1`@C>4/,`'B(#"-Y0LPH.$D$)WE`2#SYZ@@ +MS>4!(-/EJ2#-Y00@T^6J(,WE!2#3Y:L@S>4&(-/EK"#-Y04:`%/C`1"@`PP0C04D()T5`B""$B0@C14!,*`3##"-%200G>4( +M$('B'!"-Y1`@G>4``%+C`5"@`2(```H<,)WE`W"+X`"`H.-HH(WB2)"-XEA0 +MC>(!@(CBJ!"-X@(!C>@*`*#A&!"=Y0P@G>4+,*#AU?S_ZQ0`G>4*$*#A"2"@ +MX>C[_^L'8*#A"0"@X0<0H.$%(*#A^_S_ZP!`H.,$,-7G!##&YP%`A.(0`%3C +M^O__&A!PA^(0()WE"`!2X>3__XH<,)WE`E*#X"`0G>4``%'C*P``"J@PC>(` +M,(WE$""=Y0$P@N($,(WE:`"-XA@0G>4,()WE"S"@X;/\_^L`0*#C.""-X@0P +MH.$$,,+G`4"$XA``5./[__\:`$"@XP4PB^`X$(WB(&"=Y0-0H.$$(-/G!"#! +MYP%`A.(&`%3A^?__&DA`C>(4`)WE:!"-X@0@H.&T^__K!`"@X3@0C>)8((WB +MR/S_ZP!`H.-8((WB(&"=Y00PTN<$,,7G`4"$X@8`5.'Z__\:?$2?Y2PPG>4( +M((/B!`"@X0L0H.$D,)WE`R""X/[__^LD$)WE`3#[YZ@PS>4!,-OEJ3#-Y00P +MV^6J,,WE!3#;Y:LPS>4&,-OEK##-Y0(H$)WE`!"- +MY:@PC>($,(WE!@"@X0(0H.$8()WE!#"@X=W[_^N(<(WB!P"@X200G>4$(*#A +M`OS_ZWB`C>((`*#A!!"@X1@@G>4,,)WE(?S_ZTA0C>(4`)WE!A"@X04@H.%X +M^__K6$"-X@4`H.$'$*#A!""@X8O\_^L4`)WE!!"@X04@H.%O^__K!0"@X0@0 +MH.$$(*#A@_S_ZQ0`G>4$$*#A!2"@X6?[_^L0()WE``!2XQQ0G046```*:$.? +MY1PPG>4#0(3@`%"@XTA@C>)8<(WB$("=Y12@G>4&`*#A!!"@X0<@H.%O_/_K +M"@"@X0<0H.$&(*#A4_O_ZP%0A>(00(3B!0!8X?/__XH<$)WE$""=Y0)2@>`@ +M,)WE``!3XQP```H`0*#C.""-X@0PH.$$,,+G`4"$XA``5./[__\:Y#*?Y04P +M@^``0*#C.!"-XB!@G>4!(-/D!"#!YP%`A.(&`%3A^O__&B`0G>4!4(7@2&"- +MXEA`C>(&`*#A.!"-X@0@H.%(_/_K%`"=Y000H.$&(*#A+/O_ZP!`H.,P$(WB +M2""-X@0PTN<$,,'G`4"$X@@`5./Z__\:;#*?Y050@^``0*#C,""-X@0PTN/__XH<$)WE +M`Q*!X!P0C>4,``#J$""=Y0``4N,)```*N'&?Y1PPG>4#<(?@`X"@X0!@H.-H +MH(WBH)&?Y4BPC>)84(WBTO__ZB`0G>4``%'C,0``"J@PC>(`,(WE$""=Y0$P +M@N($,(WE:`"-XA@0G>4,()WE9#&?Y4#4(7@!3"@X0!`H.,X$(WB(&"=Y0$@T^0$(,'G +M`4"$X@8`5.'Z__\:2$"-XA0`G>5H$(WB!""@X+< +M^__K`$"@XU@@C>(@8)WE!##2YP$PQ>0!0(3B!@!4X?K__QH<$)WE(""=Y0(0 +M@>`<$(WEJ#"-X@`PC>4`0*#C!$"-Y6@`C>(8$)WE#""=Y:`PG^68^__K.""- +MX@0PH.$$,,+G`4"$XA``5./[__\:)!"=Y2P@G>4",('@=""?Y0,P@N``0*#C +M.!"-X@$@T^0$(,'G`4"$X@@`5./Z__\:2$"-XA0`G>5H$(WB!""@X9CZ_^L$ +M`*#A.!"-XE@@C>*L^__K+#"?Y1P0G>4!,(/@`$"@XU@0C>($(-'G`2##Y`%` +MA.((`%3C^O__&@$`H..TT(WB\(^]Z`0$``#P02WI`%"@X0%`H.%P8)'E-##1 +MY00`4^,!0*`3&0``&E<-@.(8`(#B1!"$XO[__^L`<%#B`$"@`Q(```I*,-3E +M`0`3XQ%>AP(%```*/`"?Y?[__^M6,-3E`U*%X`9;A>(,4(7B*!"4Y6C`E.4, +MP&'@+#"4Y04`H.$&(*#A##!CX!3^_^L!0*#C!`"@X?"!O>A<````\$4MZ4?? +M3>(`4*#A`4"@X7!@D>4T,-'E!0!3XP$`4Q,E```:5H#1Y5\^B.(,,(/B`S&` +MX`2@D^4-<*#A*!"1Y0T`H.$!$(;@`R"@X_[__^M>CXCB`X"(X@A2A>`#`(WB +M!!"%X@H@H.'^___K*#"4Y2P@E.5H4)3E!5!CX`508N`#,(+@`V"&X!!`C>($ +M`*#A#1"@X0,@BN+0]O_K!`"@X080H.$&(*#A!3"@X>SV_^L&`*#A!!!%XA[W +M_^M'WXWB\(6]Z/!/+>E+WTWB`&"@X0%`H.%LH)'E``!:XV,```H=,-'E!0!3 +MXP$`4Q-?```:**"*XK`W`>,#,)#G7SZ#X@PP@^(#,8#@!#"3Y0`PC>4`@*#C +M##"-X@,P@^($,(WE')"-X@%0H.%-``#JLA'5X0P`C>(!$(K@`R"@X_[__^NP +M-P'C`Q"6YUX?@>(#$('B`1*&X`0`G>4$$('B`""=Y?[__^L>,-7ELB'5X0-P +M@N`'<(K@`8"(XAP0U>4!`%CA&```&AA`E>4$0&+@!$!CX!\0U>4$0&'@!P"@ +MX000H.'D]O_K)`&-Y0D`H.$,$(WB`#"=Y0,@@^*(]O_K"0"@X0<0H.$'(*#A +M!#"@X:3V_^L)`*#A!!"'X$DOC>($,*#CG_;_ZQX``.H,M`'C"T"6YP1`8N`$ +M0&/@'Q#5Y01`8>`'`*#A!!"@X(`,)WE`R"#XF[V +M_^L)`*#A!Q"@X0<@H.$$,*#ABO;_ZPD`H.$$$(?@22^-X@0PH..%]O_K"S"6 +MYP.@BN`#,!KB`3"@$RJA@^`*H:#A'##5Y0,`6.&N__^Z2]^-XO"/O>@!(*#C +M`#"=Y0`@@^4``*#C'O\OX?!/+>D,T$WB`+"@X00PC>4T,)WEX(*3Y:0WV.4` +M`%/C)&"@`P&@H`-$```*"""@X0@`H.$#$*#A`%"@XP5`H.$%<*#A`0!1XP5P +MH`$!```*)`!1XP5`H`$!4(7BL!?0Y0P`@.(``%'C]?__&@!0H.,D8*#C`:"@ +MXZ@'`.,&D*#C!@!3XP@``!J'$(?@`1&(X``0@>"LQY+E!!"1Y0$`7.$%<*`Q +M":"@,1\``#HD$$/B<1#OYF<`4>,+``"*)!!#X@<`$>,(```:A!"$X`$1B.`` +M$('@K,>2Y000D>4!`%SA`V"@,0$`7.$%0*`Q:Q"#XG$0[^8/`%'C"P``BI40 +M0^('`!'C"```&H00A.`!$8C@`!"!X*S'DN4$$)'E`0!*P-]+E#"""X@``4^//__\:"P"@X000G>4`(`#C`"!`XP8PH.'^___K +M`$"@X0``B^`$,)WE`Q!DX``@`.,`($#C"C"@X?[__^L!(*#C,#"=Y0`@@^4$ +M`(#@#-"-XO"/O>@00"WI$-!-XAP@G>7@0I+E>B4!X]+`E.%[)0'CTB"4X0`@ +MC>5\)0'C`B#4YP0@C>5])0'C`B#4YP@@C>5^)0'C`B#4YPP@C>4#$*#A`"`` +MXP`@0.,,,*#A_O__ZP$@H.,8,)WE`""#Y1#0C>(0@+WH\$`MZ0S03>(`<*#A +M`V"@X20PG>7@4I/EE#0!XP,PE><%*Z#C`B"5YP`@C>4&$*#A`"``XP`@0./^ +M___K`$"@X0``A^`&$&3@`"``XP`@0.,@-0'C`S#5Y_[__^L!(*#C(#"=Y0`@ +M@^4$`(#@#-"-XO"`O>@00"WI"-!-XA0@G>7@0I+EC"4#XP+`E.>()0/C`B"4 +MYP`@C>4#$*#A`"``XP`@0.,,,*#A_O__ZP$@H.,0,)WE`""#Y0C0C>(0@+WH +M$$`MZ0C03>(4()WEX$*2Y9['U.6?)]3E`""-Y:`GU.4$((WE`Q"@X0`@`.,` +M($#C##"@X?[__^L!(*#C$#"=Y0`@@^4(T(WB$("]Z!!`+>D,()WEX,*2Y0,0 +MH.$`(`#C`"!`X]`TG.7^___K`2"@XP@PG>4`((/E$("]Z!!`+>D,()WEX,*2 +MY0,0H.$`(`#C`"!`X\0TG.7^___K`2"@XP@PG>4`((/E$("]Z!!`+>D,()WE +MX,*2Y0,0H.$`(`#C`"!`X\`YG.7^___K`2"@XP@PG>4`((/E$("]Z!!`+>D0 +MT$WB'""=Y>!"DN6H)P'C`L"4YZPG`>,"()3G`""-Y1`K`>,"()3G!""-Y10K +M`>,"()3G"""-Y0,0H.$`(`#C`"!`XPPPH.'^___K`2"@XQ@PG>4`((/E$-"- +MXA"`O>@00"WI#""=Y>#"DN4#$*#A`"``XP`@0.-L,)SE_O__ZP$@H.,(,)WE +M`""#Y1"`O>@00"WI`Q"@X0`@`.,`($#C`#``XP`P0./^___K`2"@XP@PG>4` +M((/E$("]Z/!/+>DLT$WB`("@X0-PH.%4,)WEX#*3Y20PC>6<-P'C)!"=Y;,P +MD>&>)P'CLB"1X0`@C>4'$*#A8"*?Y?[__^L`8*#A_O__ZPT@H.%_/<+C/S## +MXP0@D^4!((+B!""#Y20PG>57/8/B*#"#XB`PC>4`$*#C'!"-Y22BG^4<()WE +MK[^"X@&PB^(D,)WEB[&#X"`0G>4`D)'E`#``XP`P0.,8,(WE8P``Z@A`2>(` +MD)GEX##4Y>$@U.4`((WEXB#4Y00@C>7C(-3E"""-Y>0@U.4,((WEY2#4Y1`@ +MC>4&`(C@!Q!FX+PAG^7^___K!F"`X$TQU.5,(=3E`""-Y08`B.`'$&;@H"&? +MY?[__^L`8(;@W#"4Y?@EE.4`((WE3R'4Y00@C>4&`(C@!Q!FX!@@G>7^___K +M`&"&X-`PE.74()3E`""-Y=@@E.4$((WE3B'4Y0@@C>4&`(C@!Q!FX``@`.,` +M($#C_O__ZP!@AN`,-M3E#2;4Y0`@C>4.)M3E!""-Y08`B.`'$&;@`"``XP`@ +M0./^___K`&"&X`8`B.`'$&;@`"``XP`@0./\-93E_O__ZP!@AN`/-M3E$";4 +MY0`@C>4&`(C@!Q!FX``@`.,`($#C_O__ZP!@AN`&`(C@!Q!FX``@`.,`($#C +MS#"4Y?[__^L`8(;@;T^$X@!0H.,`,-3E``!3XP<```JR,-3A`#"-Y08`B.`' +M$&;@"B"@X04PH.'^___K`&"&X`%0A>)$0(3B$`!5X_#__QH+`*#A"1"@X?[_ +M_^L``%#CEO__"AP@G>4!((+B'""-Y2`PG>4(,(/B(#"-Y2``4N.#__\:#1"@ +MX7\]P>,_,,/C!""3Y0$@0N($((/E_O__ZP$@H.-0,)WE`""#Y08`H.$LT(WB +M\(^]Z#`"``!D`P``6`(``(@"``#P0"WI+-!-XN!RD^4`8%+B#0#@`SL```H` +M`%'C.```"@T@H.%_/<+C/S##XPA`D^4@4)'B!%#5,`!`H#,``%3C!0``&@@` +MC>(@(*#C_O__ZP``4.,$```**0``Z@@`C>(@$*#C_O__ZR4``.H(`(WB`!`` +MXP`00.,$((WB#3"@X?[__^L$0)WE`#!4X@$PH!,"`%#C``!4$P8`H!$9```: +M`$"=Y60`5.-D0*`C`$"-Y00PC>5X)0'C`C#'YP!`G>5Y-0'C`T#'YP1`G>4` +M`%3C!@``"@```.,``$#C`!``XP`00.,`()WE_O__ZP0``.H```#C``!`XP`0 +M`.,`$$#C_O__ZP8`H.$LT(WB\("]Z'!`+>D8T$WB`F"@X0$`4N,#``"*L`"? +MY?[__^L-`.#C)P``Z@``4>,D```*#2"@X7\]PN,_,,/C"$"3Y1!0D>($4-4P +M`$"@,P``5.,%```:"`"-XA`@H./^___K``!0XP0```H5``#J"`"-XA`0H./^ +M___K$0``Z@@`C>(`$`#C`!!`XP0@C>(-,*#A_O__ZP(`4.,#```*,`"?Y?[_ +M_^L&`*#A!@``Z@`P`.,`,$#C!$"=Y0!`@^4`0)WE!$"#Y08`H.$8T(WB<("] +MZ,0#``#L`P``\$4MZ1S03>(`<*#A`X"@X3PPG>7@0I/E5PV$XA@`@.+@$(3B +M_O__ZP!04.)@```*X##5Y>$@U>4`((WEXB#5Y00@C>7C(-7E"""-Y>0@U>4, +M((WEY2#5Y1`@C>4'`*#A"!"@X0`@`.,`($#C_O__ZP!`H.%-,=7E3"'5Y0`@ +MC>4``(?@"!!DX``@`.,`($#C_O__ZP1`@.#<,)7E^"65Y0`@C>5/(=7E!""- +MY00`A^`($&3@`"``XP`@0./^___K`$"$X-`PE>74()7E`""-Y=@@E>4$((WE +M3B'5Y0@@C>4$`(?@"!!DX``@`.,`($#C_O__ZP!`A.`,-M7E#2;5Y0`@C>4. +M)M7E!""-Y00`A^`($&3@`"``XP`@0./^___K`$"$X`0`A^`($&3@`"``XP`@ +M0./\-97E_O__ZP!`A.`/-M7E$";5Y0`@C>4$`(?@"!!DX``@`.,`($#C_O__ +MZP!@A.!O7X7B`$"@XP"@`.,`H$#C`##5Y0``4^,'```*LC#5X0`PC>4&`(?@ +M"!!FX`H@H.$$,*#A_O__ZP!@AN`!0(3B1%"%XA``5./P__\:$```ZN`PU.7A +M(-3E`""-Y>(@U.4$((WEXR#4Y0@@C>7D(-3E#""-Y>4@U.40((WE!P"@X0@0 +MH.$`(`#C`"!`X_[__^L`8*#A`2"@XS@PG>4`((/E!@"@X1S0C>+PA;WH\$$M +MZ0C03>(`4*#A`V"@X2"`G>4D,)WEX'*3Y0`P`.,`,$#C`$"3Y>X^#N/N/D[C +M`P!4X0$PH`,`,(@%`$"@`S,```H`,`#C`#!`XP0PD^4"`%/C#P``"@0`4^,9 +M```*`0!3XR,``!H'`*#A!!"@X?[__^L``(WE!0"@X080H.$`(`#C`"!`XP0P +MH.'^___K`$"@X1P``.H'`*#A!!"@X?[__^L``(WE!0"@X080H.$`(`#C`"!` +MXP0PH.'^___K`$"@X1```.H'`*#A!!"@X?[__^L``(WE!0"@X080H.$`(`#C +M`"!`XP0PH.'^___K`$"@X00``.H&$*#A`"``XP`@0./^___K`$"@X0$PH.,` +M,(CE!`"@X0C0C>+P@;WH\$`MZ3S03>("8*#AX'*3Y0(`4N,#``"*!`&?Y?[_ +M_^L-`.#C/```Z@``4>,Y```*#2"@X7\]PN,_,,/C"$"3Y2!0D>($4-4P`$"@ +M,P``5.,%```:&`"-XB`@H./^___K``!0XP0```HJ``#J&`"-XB`0H./^___K +M)@``Z@PPC>(`,(WE&`"-X@`0`.,`$$#C%""-XA`PC>+^___K`P!0XP,```I\ +M`)_E_O__ZP8`H.$9``#J#!"=Y0(`4>,(```*!`!1XPL```H!`%'C#@``&@<` +MH.$4$)WE$"#=Y?[__^L,``#J!P"@X100G>6P(=WA_O__ZP<``.H'`*#A%!"= +MY1`@G>7^___K`@``Z@```.,``$#C_O__ZP8`H.$\T(WB\("]Z+P$``#H!``` +M$$`MZ0`PH.$3#(#B)`"`XC@C`>,/X*#A`O"3YQ"`O>@00"WI`#"@X1,,@.(D +M`(#B/",!XP_@H.$"\)/G$("]Z!!`+>D`,*#A$PR`XB0`@.)-+:#C#^"@X0+P +MD^<0@+WH$$`MZ0`PH.$3#(#B)`"`XF##`>,/X*#A#/"3YQ"`O>@00"WI`#"@ +MX1,,@.(D`(#B9,,!XP_@H.$,\)/G$("]Z!!`+>D`,*#A$PR`XB0`@.)HPP'C +M#^"@X0SPD^<0@+WH$$`MZ0#`H.$3#(#B)`"`XFQ#`>,/X*#A!/"@0 +M0"WI`#"@X1,,@.(D`(#B<,,!XP_@H.$,\)/G$("]Z!!`+>D`,*#A$PR`XB0` +M@.)TPP'C#^"@X0SPD^<0@+WH$$`MZ0`PH.$3#(#B)`"`XGC#`>,/X*#A#/"3 +MYQ"`O>@00"WI`,"@X8@%`^,``)SG`0!0XQ"`O0B,!0/C``"@00"WI`,"@X8@%`^,``)SG`0!0XQ"`O0B,!0/C``",#0)#G``!4 +MXQ"`O0@3#(#B)`"`XC3_+^$0@+WH$$`MZ0#`H.$3#(#B)`"`XI!#`>,/X*#A +M!/"@00"WIG#,!XP-`D.<``%3C$("]"!,,@.(D`(#B-/\OX1"`O>@> +M_R_A'O\OX1!`+>D@,P'C`P"`YR0S`>,#`(#G'""`XB@S`>,#((#GM#'0X0(` +M4^,!```*`P!3XP0``!H3#(#B+`"`XO[__^L!`*#C$("]Z```H.,0@+WH``"0 +MY2``4.,``*"#`0"@DQ[_+^$00"WI`#"@X00@D>4-$=+C$P``&@$#$N,'```: +M!CN`X@PP@^(#(`+B`@*#X``0H.,0(*#C_O__ZPD``.I7#8#B&`"`XN`0@^+^ +M___K`$!0X@,```H1#H3B`!"@XQ`@H./^___K`0"@XQ"`O>CP02WI`4"@X0%@ +MH.$`4*#A`0!PX@``H#.A#Y#A%0``&@,`4>,3``"*7GV%XC0`A^(!`H#@`!"@ +MXQ`@H./^___K!0"@X2@0A^($(*#A`#"@X_[__^M?3H3B#$"$X@1!A>`$0(3B +M`#"@XP`PA.4#0%#@`4"@$P```.H`0*#C!`"@X?"!O>AP0"WI`$"@X0%0H.$$ +M8)'E`V'&XP0`5N,`0*##(@``R@@PD>4%`%/C`2"@`ZPW`0,#((0'!@``"@T` +M4^,`(*`3K##X;B`P"`X@`"A.`$`(#B#!"% +MX@@@E>7^___K7SZ&X@PP@^(#,83@"""5Y00@@^6P-P'C`V"$YP0`H.%>'83B +M*!"!X@8@H.$!,*#C_O__ZP!`4.(!0*`3!`"@X7"`O>CP1RWI"-!-X@!`H.$! +M4*#A!#"1Y0``4^,"``"Z`0$3XRX```I#`0#J`0$3XRL```I7#8#B&`"`XN`0 +MA.+^___K`&!0X@0```JH-P'C`S"4YP(`4^/L8)8%`0``"JPW`>,#8)3G!##5 +MY0``4^,Q`0`:##"5Y0$`<^,R`0`:L"'5X?\_#^,#`%+A+@$`&BD!`.H(,)7E +M(`!3XR8!`!I,``#J!`!6XPD``!H(,)7E$`!3XP8```H@`%/C'@$`&A`PH.,( +M,(7E`'"@XP>`H.%$``#J!0!6XP$`5A,6`0`*/```ZA`[`>,#,)3G`P!3XQ,` +M`(H$.`'C`S"4YP``4^,/```:"#"5Y04`4^,!(*`#K#,#8)3G`0``Z@0X`>,#8)3G +M;#"4Y2``$^,&```*##"5Y0$`<^/U```:L"'5X?\_#^,#`%+A\0``&@(`5N,# +M```:"#"5Y2``4^/L```:"```Z@0`5N,&```:"#"5Y1``4^,@`%,3Y0``&B`` +M4^,0,*`#"#"%!01PE>77?>#G;#"4Y2``$^,'```*`0`3XP%PH!,'@*`1`P`` +M"@,``.H`<*#C!X"@X0```.H!@*#CJ#4@((+BE#X!XP,@A.<$8)7E`F'&XY@^`>,#8(3G"""5Y9P^`>,# +M((3G('"%XGJ-A.(@`(CB!Q"@X0@@E>7^___K7C^&X@,P@^(#,H3@!`"#X@<0 +MH.$(()7E_O__ZU\^AN(,,(/B`S&$X`@@E>4$((/EL#4"`A/C&P``"@$`6.,,```:V`'%X0`@X./_/P_C +M`"`"X`$P`^`($(WB^"!AX6,-A.(8`(#B#1"@X0@@H./^___K#@``ZM@!Q>$` +M(.#C_S\/XP`@`N`!,`/@"!"-XO@@8>%C#83B$`"`X@T0H.$((*#C_O__ZU`` +M`.H!`%CC3@``&@$`5^,$(-4%"#@!`P,@A`<$,)7E`P`3XX$```H&:X3B#&"& +MX@,P`^(#`H;@`!"@XQ`@H./^___K87V$X@QPA^($`-7E`P``X@`"A^``$*#C +M$""@X_[__^MBC83B#("(X@0`U>4#``#B``*(X``0H.,0(*#C_O__ZP0PE>4! +M`A/C"P``"@,P`^(#`H?@,!"%X@@@H./^___K!`#5Y0,``.(``HC@.!"%X@@@ +MH./^___K"@``Z@,P`^(#`H?@.!"%X@@@H./^___K!`#5Y0,``.(``HC@,!"% +MX@@@H./^___K!`#5Y0,``.(``H;@(!"%X@@@E>7^___K!#"5Y0,P`^($,(7E +M`3"@XQLLH.,",,3G`!"@XP(K`>,"$,3G!`"@X5X=A.(H$('B!""5Y?[__^L` +M0%#B`4"@$SH``.I7#83B&`"`XN`0A.+^___K`(!0X@%`H`,S```*$:Z(X@H` +MH.$`$*#C$""@X_[__^L@D(7B"@"@X0D0H.$0(*#C_O__ZP(`5N,6```:`""@ +MXP$[`>,#(,3G!#"5Y0$"$^,(```*\`"(XA`0B>(((*#C_O__ZP$,B.(8$(GB +M"""@X_[__^L'``#J\`"(XA@0B>(((*#C_O__ZP$,B.(0$(GB"""@X_[__^L` +M`%?C!0``"@0`H.$($*#A`""@X_[__^L`0*#A!```Z@0`H.$($*#A`2"@X_[_ +M_^L`0*#A`$!4X@%`H!,```#J`$"@XP0`H.$(T(WB\(>]Z`(`5N/3_O\:SO[_ +MZA!`+>E>38#B*$"$XA`[`>,#$(#G`P!1XP(@H(.H-P&#`R"`AP00H.'^___K +M`0!0XP``H!,!`*`#$("]Z'!`+>DHT$WB`$!0XAX```J=-0/C`S#4YP``4^,: +M```*;#"4Y2(-$^,9```:$#74Y0$`4^,6```*_O__ZPTPH.%_;(%`*#A`!"@XR0@H./^___K!`"@X040H.'^___K`$"@ +MX00PEN4!,$/B!#"&Y?[__^L"``#J`$"@XP```.H!0*#C!`"@X2C0C>)P@+WH +M$$`MZ0!`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E;#"4Y0$`$^,% +M```*!`"@X?[__^L$`*#A_O__ZP0`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@ +M0N($((/E_O__ZP$`H.,0@+WH<$`MZ0!`H.$!4*#A/#&0Y0$`4^$^```*_O__ +MZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y6PPE.4!`!/C`@``&CPAE.4``%+C +M!```&@0`H.'^___K;#"4Y0$`$^,!```:0``3XP0```H$`*#A_O__ZVPPE.4! +M`!/C!```&CPQE.4!`%/C`0``"@``4^,!```:!`"@X?[__^L\,93E!`!3XP,` +M`!H`,.#CV#"$Y00`H.'^___K/%&$Y6PPE.5X,,/C;#"$Y0$`5>,(,(,#;#"$ +M!0@```H@,(,S;#"$-04``#H$`%7C`P``&A`P@^-L,(3E!`"@X?[__^L-(*#A +M?SW"XS\PP^,$()/E`2!"X@0@@^7^___K`0"@XW"`O>AP0"WI`$"@X0!0H.&$ +M8+7E````XP``0.,%$*#A!B"@X?[__^L!,.#CV#"$Y6PPE.6`,(/C;#"$Y7A@ +MA.4!,*#C<##$Y04`H.'^___K`0!0XPT``!IL,)3E@###XVPPA.40-=3E``!3 +MXP(```IQ,-3E``!3XSP```H$`*#AE!"$XO[__^L`0*#A.```ZFP`A.+^___K +M`0!0XPL``!H`,*#C<##$Y0`P`.,`,$#C`!"3Y44.A.(,`(#BHA^!X@(0@>+^ +M___K`4"@XR@``.IL,)3E(``3XQ<```I`,*#C;#"$Y:EMA.(P4(;B!0"@X0`0 +MH.,D(*#C_O__ZP4`H.&4$(3B)""@X_[__^L$`*#A_O__ZR@`AN+^___K!`"@ +MX?[__^L!`%#C`$"@$P`PH`-P,,0%`4"@`PT``.J`,,/C;#"$Y1`UU.4``%/C +M`@``"G$PU.4``%/C!```"@0`H.&4$(3B_O__ZP!`H.$```#J`4"@XP0`H.%P +M@+WH\$$MZ0!0H.$!<*#AG34#XP,PT.<``%/C!```&BP"G^4L$I_E_O__ZP!` +MH..```#J;#"0Y8``$^,"```:`@L3XWT``!H6``#J"`*?Y0`2G^7^___K;$"5 +MY=1#X.=T``#J;#"5Y0(+$^,%```*!@"@X?[__^L!0$3B`0!TX_?__QH!``#J +M``!4XP4``,K(`9_EO!&?Y?[__^ML0)7EU$/@YUP``.K^___K#2"@X7\]PN,_ +M,,/C!""3Y0$@@N($((/E;#"5Y4$`$^,S```*E""5Y0`PE^4#`%+A(0``&I@` +MA>($$(?B_O__ZP$`4.,<```:;#"5Y0@`$^,4```:!0"@X<`0A>+^___K``!0 +MXP%`H!-````:!0"@X?[__^ML,)7E`0`3XP$```H%`*#A_O__ZP4`H.'^___K +M;#"5Y4``$^-`,,,3(#"#$VPPA142``#J!0"@X0$0H.,!(*#A_O__ZPT``.H% +M`*#A_O__ZVPPE>4!`!/C`0``"@4`H.'^___K!0"@X?[__^ML,)7E0``3XT`P +MPQ,@,(,3;#"%%0PV`N,#,-7G`0!3XP0``!JL`)_EG!"?Y?[__^L`0*#C%0`` +MZ@<`H.'^___K``!0XP0``!J,`)_E>!"?Y?[__^L`0*#C#```ZI0`A>('$*#A +M)""@X_[__^L`,*#CC#2%Y04`H.'^___K`$!0X@(``!I4`)_E/!"?Y?[__^L- +M(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K!`"@X?"!O>AD`*#C_O__ZS!` +MH.-D8*#C@___ZDP%```D#@``@`4``+0%``#D!0``"`8``"@&``!P0"WI`$"@ +MX0%0H.$`,-'E``!3XP\``!H!(-'E``!2XPP``!H",-'E``!3XQH``!H#,-'E +M``!3XQ<``!H$,-'E``!3XQ0``!H%,-'E``!3XQ$``!I'``#J_P!3XPX``!H! +M,-7E_P!3XPL``!H",-7E_P!3XP@``!H#,-7E_P!3XP4``!H$,-7E_P!3XP(` +M`!H%,-7E_P!3XS8```K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E;#"4 +MY2(-$^/30^`7(P``&D$`$^,8```*X`"$X@40H.$&(*#C_O__ZP$`4.,$```: +M;#"4Y0@`$^,!0*`#%P``"@T``.H$`*#A_O__ZVPPE.4!`!/C`0``"@0`H.'^ +M___K!`"@X?[__^ML,)3E0``3XT`PPQ,@,(,3;#"$%;@`A.(%$*#A!B"@X_[_ +M_^L!,*#CC#2$Y00`H.'^___K`$"@X0T@H.%_/<+C/S##XP0@D^4!($+B!""# +MY?[__^L```#J`$"@XP0`H.%P@+WH!$`MY1303>(`P*#A`#``XP`P0.,-0*#A +M#P"3Z`<`I.@`,,3E`##=Y0``4^,.```*#`!3X0!`H`,%```:`0``Z@P`4^$$ +M```:`0"@XQ`$H.$&``#J`$"@XPT@H.$!0(3B!##2YP``4^/T__\:``"@XQ30 +MC>(0`+WH'O\OX01`+>4`,-#E``!3XQ@```I_,`/B!`!3XP(`4Q,2```*"P!3 +MXQ````H6`%/C`$"@$P@``!H,``#J?S`#X@0`4^,"`%,3"```"@L`4^,&```* +M%@!3XP0```H!0(3B!##0YP``4^/S__\:`0``Z@$`H.,```#J``"@XQ``O>@> +M_R_A!$`MY0`PT.4``%/C#0``"@!`H.-_,`/B`@!3XP0`4Q,$```*"P!3XP(` +M``H6`%/C``"@$P0``!H!0(3B!##0YP``4^/R__\:`0"@XQ``O>@>_R_A$$`M +MZ0!`H.$.`%+C!```VO[__^L!`%#C!`"@$P``H`,0@+WH_O__ZP$`4.,0@+T( +M!`"@X?[__^L!`%#C`P"@`P(`H!,0@+WH<``MZ0``4^,.``#:`%"@XP!0@N4` +M0*#A``#4Y0$`4.$!,-0%`#""!0<```H!8-3E`@"&X@!0A>`%`%/A`&"@P0!` +MA,#S___*`$"@XP0`H.%P`+WH'O\OX01`+>4`,-#E``!3XP!`H`,`0*`3`@`` +M&@4``.H-`%3C`P``"@%`A.($,-#G``!3X_G__QH$`*#A$`"]Z![_+^$00"WI +M`<"@X0(PH.$P$*#C#""@X?[__^L0@+WH`#"@X3``0.)P`._F"0!0XQ[_+Y%A +M($/B_R_A<$`MZ0%0H.'^___K`$"@X04`H.'^___K!$&$X(0`@.!P`._F<("] +MZ'!`+>D!4*#A_O__ZP!`H.$%`*#A_O__ZP0"@.%P`._F<("]Z'!`+>D`0*#A +M`E"@X1!@G>4`$,#E`2#$Y0``4N,"```*`@"`X@,0H.'^___K`@"%X@`PEN4` +M,(/@`#"&Y0``A.!P@+WH<$`MZ0!@H.$!0*#A`U"@X0(0H.$$(*#A_O__ZP`P +ME>4$,(/@`#"%Y00`AN!P@+WH\$`MZ0S03>(`<%#B2P``"@`P`.,`,$#C`$"3 +MY0``5.,.```*`&"@XPU0H.$``-3E`1#4Y?[__^L&`,7G`6"&X@-`A.(&`%;C +M]___&@<`H.$-$*#A!B"@X_[__^L#``#J#0"@X0<0H.$&(*#C_O__ZP`PW>7_ +M`%/C#P``&@%`W>7_`%3C#```&@)`W>7_`%3C*@``&@-`W>7_`%3C)P``&@1` +MW>7_`%3C)```&@5`W>7_`%3C(0``&A```.H``%/C'@``&@%`W>4``%3C&P`` +M&@)`W>4``%3C&```&@-`W>4``%3C%0``&@1`W>4``%3C$@``&@5`W>4``%3C +M#P``&@`PH.,`,,WE'R#@XP$@S>5L((+B`B#-Y7@@X.,#(,WE!##-Y04PS>4' +M`*#A#1"@X7\@@N+^___K"`"?Y?[__^L,T(WB\("]Z$`&``#P3RWI'-!-X@!@ +MH.$!@*#A`J"@X0.PH.$"`*#A`!"@X[@@H./^___K`0!8XP"0H)/+``":`$#6 +MY0%P]N4"@$CB!U"@X0<`6.$1```J!P``Z@5@AN``0-;E`7#VY0*`2.('4*#A +M!P!8X0%@AB(6```J``!;X[\```H$`Y_E!!"@X0<@H.$(,*#A_O__ZP``X..Y +M``#J`6"&X@"0H.,`,`#C`#!`XP@PC>4`,`#C`#!`XPPPC>4`,`#C`#!`XQ`P +MC>4`,`#C`#!`XQ0PC>4D`%3C@&"*!81PR@6>```*(```B@0`5.,@8(H%)'#* +M!9D```H-``"*`0!4XPA@B@4,<,H%E```"@!@BC4$<,HUD0``.@(`5.,08(H% +M%'#*!8T```H#`%3CA```&B\``.H&`%3C,&"*!31PR@6&```**&"*-2QPRC6# +M```Z$`!4XSA@B@4\<,H%?P``"B$`5.-V```:<@``ZC8`5..(8(H%C'#*!7@` +M``H.``"*+0!4XZ!@B@6D<,H%-P8(H%='#*!38```H!`%'C +M4&"*!51PR@44```:,0``Z@0`5>,#``"*#`"=Y040H.'^___K'P``Z@00UN4! +M`%'C8&"*E61PRI4F``":`@!1XVA@B@5L<,H%(@``"@```.,``$#C!2"@X?[_ +M_^L1``#J````XP``0.,%(*#A_O__ZPP``.H#$-;E,P!1X[!@B@6T<,H%$P`` +M"A``G>4%(*#A_O__ZP,``.H`4(WE````XP``0./^___K`9")X@D``.IX8(KE +M?'#*Y08``.H!D(GB``!;XP,```H(`)WE!!"@X0<@H.'^___K"(!EX`$`6.,Z +M__^*``!8XP(``!H``%GB`0"@$P```.H``.#C'-"-XO"/O>AX!@``<$`MZ0!0 +MH.$!0*#A`!"@XQ`@H./^___K%`!4XW"`O8@!,*#C$T2@X10P`.,1,$#C`S`$ +MX```4^,,```:"#T`XP`P0.,#,`3@``!3XPP``!H"`!3C<("]"`4`H.$`$`#C +M`!!`XP0@H./^___K<("]Z`4`H.$T$)_E"""@X_[__^MP@+WH`$``XP!`0.,% +M`*#A!!"@X00@H./^___K!`"%X@00A.(((*#C_O__ZW"`O>C,`P``\$$MZ1#0 +M3>(`0*#AL"G0X;`MP.$*,*#C##"-Y=)P@.("(*#CL"#'X2T@T.4#`%+C(B"@ +M`[`@QP%\()#E``!2X[`@UQ$0(((3L"#'$0Q0G>4"4(7B$&"-X@10)N58()#E +M`&"-Y0(`A^(`$*#C7#"$XO[__^L`@*#A*E#4Y1\`5>,#```:F%"4Y0X`5>,4 +M4*"#"U"@D[!PA.('`*#A!1"@X?[__^L'`*#A_O__ZP`@H.$`4*#A"`!0XQ4` +M`-H`8(WE"`"@X0$0H.,((*#C!S"@X?[__^L`8(WE`Q"@XP$@H..8,(3B_O__ +MZP!@C>4&$*#C`B"@XY0PA.+^___K`&"-Y3(0H.,(($7BN#"$XO[__^L.``#J +M`&"-Y0@`H.$!$*#C!S"@X?[__^L`8(WE`Q"@XP$@H..8,(3B_O__ZP!@C>4& +M$*#C`B"@XY0PA.+^___K#`"=Y1#0C>+P@;WH\$\MZ1303>(`4*#A`7"@X00@ +MC>4#L*#A`#``XP`P0.,0,)/E##"-Y0P`4>,C``":#$"@XP2@C>`$D*#C`8"@ +MXP1@A>``,-;EW0!3XQ4``!H"`(3B``"%X`H0H.$)(*#A_O__ZP$`4.,.```: +M!G"@X00PG>4``%/C!```"@$@UN4$`)WE!A"@X0(@@N+^___K``!;XP1`A1`! +M,-05`C"#$@`PBQ4&``#J!#"%X`@PT^<",(/B`T"$X`0`5^'?__^*`&"@XP8` +MH.$4T(WB\(^]Z#!`+>D,T$WB`5"@X0`P`.,`,$#C%#"3Y00PC>4`0%#B#0`` +M"@`PU.7=`%/C"@``&@(`A.($$(WB!""@X_[__^L!`%#C!```&@$PU.4",(/B +M`#"%Y0%`H.,```#J`$"@XP0`H.$,T(WB,("]Z/!/+>D4T$WB`'"@X0&`H.$$ +M((WE`["@X0`P`.,`,$#C&#"3Y0PPC>4,`%'C/```F@Q`H.,!H*#C!&"'X`!0 +MUN7=`%7C&@``&@*0A.()`(?@#!"-X@0@H./^___K`0!0XQ,``!H!0(3B!%"' +MX``@U>4X`)WE!A"@X0(@@N+^___K`"#5Y0(P@N(`0*#C"$"$XG1`[^8#`%3A +M^___N@(@@N(\,)WEL"##X0!`U>4$0(G@&0``ZC``5>,3```:`9"$X@F0A^`` +M(-GE!`"=Y080H.$"((+B_O__ZP`@V>4",(+B`%"@XPA0A>)U4._F`P!5X?O_ +M_[H"((+BL"#+X0)`A.(`,-GE`T"$X`,``.H$,(?@"C#3YP)`A.(#0(3@!`!8 +MX<3__XH\,)WEL`#3X;`PV^$#`(#@%-"-XO"/O>@00"WI`$"@X8`0G^4$(*#C +M_O__ZP$`4.,0@+T(!`"@X6P0G^4$(*#C_O__ZP$`4.,"`*`#$("]"`0`H.%4 +M$)_E!""@X_[__^L!`%#C"`"@`Q"`O0@$`*#A/!"?Y00@H./^___K`0!0XQ`` +MH`,0@+T(!`"@X200G^4$(*#C_O__ZP$`4.,$`*`#``"@$Q"`O>C4`P``V`,` +M`-P#``#@`P``Y`,``/!!+>D"4*#A`T"@X0``4>,M``#:`##0Y3``4^,J```: +M`C!!X@$@T.5S,._F`P!2X24``!H$<(#B!&!!X@,`5N,%``#:!P"@X?[__^L` +M`(7E!'"'X@1@1N(!``#J``!6XQD``,H!`%;C%```V@&`U^4`,-?E"(23X1,` +M``H"8$;B"`%6X1```+H``%CC$```V@)@A^(`<*#C`%"4Y08`H.'^___K!0"` +MX0``A.4$8(;B`7"'X@<`6.'V___*!```Z@%@5N(!8*`3`@``Z@!@H.,```#J +M`6"@XP8`H.'P@;WH$$`MZ0!`H.&`$)_E!""@X_[__^L!`%#C$("]"`0`H.%L +M$)_E!""@X_[__^L!`%#C`@"@`Q"`O0@$`*#A5!"?Y00@H./^___K`0!0XP@` +MH`,0@+T(!`"@X3P0G^4$(*#C_O__ZP$`4.,0`*`#$("]"`0`H.$D$)_E!""@ +MX_[__^L!`%#C!`"@`P``H!,0@+WHZ`,``.P#``#P`P``]`,``/@#``#P02WI +M`$"@X0)@H.$#<*#A`%!1XC,``-H`,-#EW0!3XS```!H",$7B`2#0Y7,P[^8# +M`%+A*P``&@(`@.*X$)_E!""@X_[__^L!`%#C)0``&@A`A.((4$7B`P!5XP4` +M`-H$`*#A_O__ZP``AN4$0(3B!%!%X@$``.H``%7C&0``R@$`5>,4``#:`8#4 +MY0`PU.4(A)/A$P``"@)01>((`57A$```N@``6.,0``#:`E"$X@!@H.,`0)?E +M!0"@X?[__^L$`(#A``"'Y010A>(!8(;B!@!8X?;__\H$``#J`5!5X@%0H!," +M``#J`%"@XP```.H!4*#C!0"@X?"!O>C\`P``\$\MZ1S03>(`<*#A!!"-Y0)@ +MH.$`,`#C`#!`XQPPD^4,,(WE`$"@X12`C>+=H*#C#)"-X@2PH.,$`*#A"A"@ +MX0@@H.$&,*#A_O__ZP!04.(1```*`@"%X@D0H.$+(*#A_O__ZP``4.,0```* +M$@"-X@80A>("(*#C_O__Z[)!W>$!`%3C"0``&@5`H.$!,-7E!""=Y0`P@N42 +M``#J!4"@X0`PH.,$()WE`#""Y0T``.H40)WE_C\/X_\_3^,#,&3@`S"'X`9@ +M@^`&8&7@``!6XP)`A,($0(7`UO__R@!`H.,$,)WE`$"#Y00`H.$6(-0/C`S"0YP``4^,%```:C#4#XP,PD.<``%/C;$"0!0%`!`(````* +M`$"@XP0`H.$0`+WH'O\OX0H`@.(>_R_A'O\OX0@`@.(>_R_A!$`MY:PW`>,# +M,)#G``!3XP,```I,0)'E`$!4X@%`H!,"``#J3$"1Y0%`5.(!0*`3!`"@X1`` +MO>@>_R_A'O\OX1[_+^$>_R_A'O\OX?`%+>D8<)WE#`!3XP!`H),V``":#$"@ +MXP)0H.,#8*#C!("@XP'`H.,$`-'GW0!0XR<``!H$`('@!0#0YP``4.,C```: +M!`"!X`8`T.=0`%#C'P``&@0`@>`(`-#G\@!0XQL``!H%`(3B`*#1YP(`6N,7 +M```:``!3X14``)H),(3B`P!4X0=`H"$(```J`#"@XP<`@N`$$('@`\#1YP/` +MP.7E+0+C`B#0YP$`4N,'(,T%(1"@XP<@C>(4Q0/C#^"@X0SP +MD^<&``#J"""-X@$0H.,!$&+E(1"@XQ3%`^,/X*#A#/"3YPS0C>(`@+WH<$`M +MZ0!`H.&I78#B*`"%XLL=A.(A$('B!B"@X_[__^LP`(7B*AR$XAP0@>(D(*#C +M_O__ZR`@H..D.@+C`R"$YV0@H..H.@+C`R"$YP`PH..T*@+C`C"$Y[@J`N," +M,(3GO"H"XP(PA.>K+:#C`C"$YW"`O>@$X"WE#-!-XGP`@.+^___K`!"@X08` +MC>("(*#C_O__Z[8`W>$,T(WB`("]Z!!`+>D`0*#A_O__ZPT@H.%_/<+C/S## +MXP0@D^4!((+B!""#Y6PPE.4""Q/C`CO#$VPPA!4-(*#A?SW"XS\PP^,$()/E +M`2!"X@0@@^7^___K$("]Z/!!+>D`8*#A`4"@X48PT>4!`!/C\(&]&#!PT>5< +M4)'E``!5XP4``!I7#8#B&`"`XD80@>+^___K`%!0XO"!O0CX-97E`0!3X_"! +MO1C\-97E`0!3X_"!O1@'@*#A#R;5Y1`VU>53-Z#A4C>#X0$`$^/P@;T8*`"? +MY0<0H.'^___K$#;5Y0$@H.,2AX/A$(;%Y08`H.$'$*#A1B"$XO[__^OP@;WH +MC`@``/!!+>D(T$WB`%"@X=`TD.4``%/C5```"M0TD.4``%/C"P``&N(]`N,# +M,-#G`0!3XP<``!KE/0+C`S#0YP$`4^,`,*`#U#2`!0$PH!/4-(`5!```ZN(] +M`N,#,-7G`@!3XP$PH`/4-(4%"#"-X@``H.,$`"/E#&"!X@QP0N(&`*#A+1"@ +MXP,@H.$',*#A_O__ZP"`4.()```*!$"=Y0``5.,&``#:!##8Y0,P`^(#,(/B +M`2"@XQ(SH.%S,._FX#2%Y04`H.'^___K`$!0X@P```IO/X3B`$"@XP0`H.$` +M(.#C0!"@XP``P^6R(,/AM"##X080P^4!0(3B1#"#XA``5./W__\:5PV%XA@` +M@.+@$(7B_O__ZP!`4.(,```*;S^$X@!`H.,$`*#A`"#@XT`0H.,``,/ELB## +MX;0@P^$&$,/E`4"$XD0P@^(0`%3C]___&@@@C>(`,*#C!#`BY08`H.$]$*#C +M!S"@X?[__^L(T(WB\(&]Z/!/+>D\T$WB`$"@X0%@H.$"H*#A8)"=Y0`0`.,` +M$$#C$""-X@,`D>@$`(+DLA#"X"$8H.$`$,+E`""@X]`DA.4,8(;B-'"-X@R` +M0^(&`*#A+1"@XP<@H.$(,*#A_O__ZP``4.-"```*-%"=Y0``5>,_```*Q#24 +MY0``4^,(```:``"9Y0"0C>4``(K@W1"@XP<@H.,0,(WB_O__ZP$PH./$-(3E +M`+"9Y1@`C>(`$*#C&B"@X_[__^OB,`'CN#'-X1Q5`^,$`*#A!1"@XPP@C>(/ +MX*#A!?"4YP0`H.$$$*#C"""-X@_@H.$%\)3G"%"=Y0PPG>4%4&/@'PQ5X[@Q +MW2$".X,CN#'-(0,PH.,:,,WE`)"-Y0L`BN`M$*#C&B"@XQ@PC>+^___K`3"@ +MX]`TA.4&`*#A/1"@XP<@H.$(,*#A_O__ZP!@4.()```*-%"=Y18`5>,&```: +M``"9Y0"0C>4``(K@/1"@XQ8@H.,",(;B_O__Z]`$E.4\T(WB\(^]Z'!`+>D` +M0*#A*ER`XAA0A>*L-P'C`R"0YP`@4N(!(*`3E#H"XP,@@.<`(*#CF#H"XP,@ +M@.=".@+C`S#0YP$P0^(>`%/C`_&?ES,``.HP?0``0'T``$!]``!0?0``A'T` +M`(1]``"$?0``0'T``(1]``!`?0``0'T``(1]``"$?0``A'T``(1]``"$?0`` +MA'T``(1]``"$?0``4'T``(1]``"$?0``A'T``(1]``"$?0``A'T``(1]``"$ +M?0``A'T``(1]``!@?0```2"@XZ`Z`N,#((#G$```Z@,@H..@.@+C`R"`YPP` +M`.H"(*#CH#H"XP,@@.<(``#J03H"XP,PT.<.`%/C`B"@@Z`Z`H,#(("'`R"@ +MDZ`Z`I,#(("703H"XP,@U.>P.@+C`R"$YSPQE.4``%/C`""@`ZPZ`@,#((0' +M/"&4Y<0Z`N,#((3G!0"@X?[__^O<.@+C`P"$YWA0@.)D.@+C`U"$YW"`O>@P +M0"WI#-!-X@!`H.$!4*#A?`"`XO[__^L`$*#A!@"-X@(@H./^___K?`"%XO[_ +M_^L`$*#A!`"-X@(@H./^___K#""4Y0PPE>4#`%+A%@``&DP@E.5,,)7E`P!2 +MX1(``!H$`(3B!!"%X@8@H./^___K`0!0XPP``!H0`(3B$!"%X@P@E.7^___K +M`0!0XP8``!JT4-WAMD#=X01`)>`#`!3C``"@$P$`H`,```#J``"@XPS0C>(P +M@+WH<$`MZ0!@H.$!0*#A`E"@X0(`H.$&$*#A!""@X30U`^,/X*#A`_"5YVPP +ME>4!`!/C$```"MP`A>($$*#AP?__ZP``4.,+```*?#4!XP,@U>=T(,3E?24! +MXP(@U>=U(,3E`U#5YP%0A>*E4*#A7U!%XC10A.44``#J="#6Y70PU.4"(8/@ +M9S8&XV8V1N.3$L+@PB"@X70@Q.5U$-;E=2#4Y0$A@N"3$L+@PB"@X74@Q.4T +M$);E-""4Y0$A@N"3$L/@PB^@X<,P8N`T,(3E>""4Y08`H.$$$*#A>"""XO[_ +M_^MP@+WH$$`MZ0P@D.4,,)'E`P!2X0``H!,0@+T8$`"`XA`0@>+^___K`0!0 +MXP``H!,!`*`#$("]Z/!!+>D(T$WB`&"@X0%PH.$`,*#C`##-Y0$PS>4",,WE +M`S#-Y00PS>4%,,WE#0"@X08@H./^___K``!0XP!0H!,?```:_O__ZPT@H.%_ +M/<+C/S##XP0@D^4!((+B!""#Y0!`EN4$`%;A#0``"@:`H.,$4*#A!P"@X2`0 +MA.(((*#A_O__ZP$`4.,#```*`$"4Y00`5N'U__\:`0``Z@8`5.$````:`%"@ +MXPT@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L%`*#A"-"-XO"!O>@00"WI +M_O__ZQ"`O>CP3RWIA=]-X@"0H.$!4*#A!""-Y0.`H.$`,`#C`#!`XP@PD^4( +M,(WE$#L!XP-`D.<4.P'C`V"0YP,P1.(!`%/C_Z"@@P`PH),,,4PH*#C!P!6XPP``(H!,*#C$V:@X04`%N,!,*`3#S'-%08``!K``!;C +M!#"@$P\QS14"```:,``6XP(PH!,/,($(*#C_O__ZP$` +M4.,%```:`2#6Y1$.C>(&$*#A`B""XO[__^L>``#J,`!:XP8``!H$0(7@`2#4 +MY1$.C>(&$*#A`B""XO[__^L5``#JW0!:XPP``!H"`(3B``"%X`@0C>($(*#C +M_O__ZP$`4.,%```:!#"%X`<@T^<+`*#A!A"@X0(@@N+^___K!#"%X`7=`%3C3P``&A$.C>("`(#B"!"-X@0@ +MH./^___K`0!0XTH``!H60=WE`0!4XT<``!H70=WE``!4XT0``!I&#XWB"!"- +MX@,@H./^___K`0!0XSX``!H;0=WE!0!4XP3QGY<8``#JH((``+""``#`@@`` +MT((``-""``#@@@```""@XP0X`>,#((GG#@``Z@$@H.,$.`'C`R")YPH``.H" +M(*#C!#@!XP,@B><&``#J!""@XP0X`>,#((GG`@``Z@4@H.,$.`'C`R")YQPQ +MW>4!`%/C!P``&D("`(#B0Q^-X@0@H./^___K`0!0XQ<``!H4``#J!S%# +MX@-QH.$!@*#C'('-Y1%NC>(.`(;B0Q^-X@0@H./^___K$A"'XA%!W>40($3B +M$@"&X@$0AN`"(&?@_O__ZQ%!W>4$0&?@$4'-Y0A@H.$"``#J`6"@XP```.H` +M8*#C,`!:XT@``!H20=WE`0!4XT0``!H30=WE``!4XT$``!I%#XWB0Q^-X@,@ +MH./^___K`0!0XSL``!H70=WE`4!$X@0`5.,$\9^7%```ZMB#``#H@P``&(0` +M`/B#```(A````2"@XP0X`>,#((GG#@``Z@(@H.,$.`'C`R")YPH``.H$(*#C +M!#@!XP,@B><&``#J!2"@XP0X`>,#((GG`@``Z@`@H.,$.`'C`R")YQ@QW>4! +M`%/C!P``&D8/C>("`(#B0Q^-X@0@H./^___K`0!0XQ0``!H4``#J!S%#X@.! +MH.$!,*#C&#'-Y1%^C>(*`(?B0Q^-X@0@H./^___K#A"(XA%!W>4,($3B#@"' +MX@$0A^`"(&C@_O__ZQ%!W>4$0&C@$4'-Y0```.H`8*#C!`"=Y040H.$,(*#C +M_O__Z_@X`>,#,-GG`0!3XPP``!K\2@'C!""=Y0P`@N)C'8GB.1"!X@0@F>?^ +M___K!("9YPR`B.(`(*#C^#@!XP,@R><>``#J,`!:XP!0H!,!4*`#,`!:X]T` +M6A,7```:`0!6XQ4``!H10=WE!#"=Y0P`@^(1'HWB`B"$XO[__^L10=WE#H"$ +MX@``5>,&```*!#"=Y0@@@^`!$$+B`#"@XP`PP>4"($+B`##"Y0D`H.$*$*#A +M$2Z-XO[__^L```#J#("@X[A@B>(F7(GB%%"%X@!`H.,&<*#C`##5Y0``4^,' +M```*!`.)X"8,@.(5`(#B!A"@X0<@H.'^___K`0!0XP0```H!0(3B0%"%XA`` +M5./P__\:`P``ZA``5.,!```*``!4XP$``*H(`*#A%```ZC``6N,1```:`3"@ +MXP0@G>4(,,+G`X"(X``PH.,(,,+G`5"(X@03B>`%`(+@)AR!XAL0@>(0(*#C +M_O__ZQ&`B.($,)WE#2#SY1(@@N(`(,/E"`"@X87?C>+PC[WH\$C#OY@$PQ.4#D,3E2"77Y0$0H.,1,X+A +M2#7'Y0`PU.4!,$/B!`!3XP/QGY`0(*#C_O__ZP$PH.,",,3E!@``ZF00AN($`(3B"A*! +MX!`@H./^___K`3"@XP(PQ.44,*#CL##%X01`A>4(,(7E`#"@XPPPA>40,(7E +M%`"%XO[__^M+#8?B"`"`X@40H.'^___K`$"@X0```.H`0*#C!`"@X?"'O>CP +M02WI`("@X0%PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,=```*!`"@X_[_ +M_^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,4``#J!@"@X0`0H.,$(*#C_O__ +MZP`PE^4`,,;E$S"@X[`PQ.$$8(3E!#"@XP@PA.4`,*#C##"$Y1`PA.44`(3B +M_O__ZTL-B.((`(#B!!"@X?[__^L`0*#A!`"@X?"!O>CP02WI`'"@X0!`D.4` +M8*#C!P"@X000H.'^___K`0!0XPT```H$4*#A##"4Y0$`4^,'```*``!6XP0` +M``H0()3E$#"6Y0(P8^```%/C````J@5@H.$`0)3E[/__Z@8`H.'P@;WH$$`M +MZ0!`H.&=-0/C`S#0YP``4^,0@+T(B#4#XP,PD.BL"```9`X``!!`+>D`0*#A``!1XA"`O0@,,)#E`0!3XQ"`O0@,`)#H +M!#""Y0`@@^4``(#E!`"`Y1`0A.+^___K)#"4Y0$P0^(D,(3E$("]Z!!`+>G^ +M___K$("]Z'!`+>D`8*#A`%!1X@T```K^___K#3"@X7]-P^,_0,3C!#"4Y0$P +M@^($,(3E!0"@X080H.'^___K!#"4Y0$P0^($,(3E_O__ZP$`H.-P@+WH$$`M +MZ?[__^L0@+WH$$`MZ0!`H.$8$)'E_O__ZU(-A.(P`(#B`1"@X_[__^L$`*#A +M_O__ZQ"`O>@00"WI`$"@X6PPD.4!,,/C;#"`Y:PT`^,#,)#G``!3XP$```H# +M$*#C,_\OX7$PU.4``%/C`0``&@0`H.'^___K!`"@X0,0H.,!(*#C_O__ZQ"` +MO>AP0"WI&-!-X@!`H.$`4%'BP%"``G$PT.4``%/C*@``"B`@U>4A,-7E(A#5 +MY0`0C>4C$-7E!!"-Y200U>4($(WE)1#5Y0P0C>4%8*#A*!"VY1`0C>5X`)_E +M+!"%XO[__^N4`(3B!A"@X20@H./^___K`#"@XXPTA.588)_E!`"@X?[__^L` +M4*#A`0!0XPX```H&`*#A!1"@X?[__^MQ,-3E`3!#XG,P[^9Q,,3E``!3X_'_ +M_QH@`)_E(!"?Y50N`./^___K!`"@X?[__^L8T(WB<("]Z+`(``#L"```"`D` +M`'P.``!P0"WI`%"@X0%@H.'^___K#3"@X7]-P^,_0,3C!#"4Y0$P@^($,(3E +M!0"@X080H.'^___K!#"4Y0$P0^($,(3E_O__ZW"`O>CP1RWI`&"@X6QP@.*( +M-0/C`S"0YP``4^/PA[T8C#4#XP,PD.<``%/C\(>]&/[__^L-(*#A?SW"XS\P +MP^,$()/E`2""X@0@@^5Q,-;E``!3XR4```H!,$/BB,#@``$$`MZ0!`H.$`(*#C<"#`Y2P0H.,4-0/C#^"@X0/PD.=L,)3E +M`3"#XVPPA.6L-`/C`S"4YP``4^,"```*!`"@X0(0H.,S_R_A!`"@X?[__^L` +M,*#C<3#$Y1"`O>CP02WI`$"@X0%@H.$!<*#AMPV`XC0`@.+^___K``!0X_"! +MO0AL,)3E$``3XPP```I7#83B&`"`X@80H.'^___K`%!0XO"!O0@$`*#A!1"@ +MX?[__^L$`*#A!1"@X?[__^OP@;WH5UV$XAA0A>(%`*#A!A"@X?[__^L``%#C +M\(&]&`4`H.$&$*#A_O__ZP!04.+P@;T(`#"@X]PPA>4(,);EV#"%Y:@W`>,# +M,)3G`@!3XZPW`0,#,)0'[#"%!0`PH./H,(7E_O__ZPT@H.%_/<+C/S##XP0@ +MD^4!((+B!""#Y6PPE.5``!/C`0``&B``$^,+```*Z#8!XP,PE.<"`%/C!P`` +M&H0`A.+@$(3B_O__ZP!@4.(!,*`3##"&%00`H.'^___K#2"@X7\]PN,_,,/C +M!""3Y0$@0N($((/E_O__ZP0`H.$%$*#A_O__Z_"!O>CX3RWI`&"@X0%`H.$@ +M`('BX!"&X@8@H./^___K`'"@X910E.5X4(7B'%"$Y=\/5>/H``"*_O__ZPT@ +MH.%_/<+C/S##XP0@D^4!((+B!""#Y1@PE.4``%/CQ0``V@`P`.,`,$#C`""@ +MXP`@P^5L,);E@``3X]<```I7C8;B&("(X@$`$^,M```*`0!7XP0``!J$`(;B +MX!"&XO[__^L`4*#A,@``ZH1PAN+@4(;B!P"@X040H.'^___K`*!0X@`PH!,, +M,(H5"`"@X040H.'^___K`*!0X@T```K^___K#3"@X7]=P^,_4,7C!#"5Y0$P +M@^($,(7E!@"@X0H0H.'^___K!#"5Y0$P0^($,(7E_O__ZP<`H.$@$(3B_O__ +MZP!0H.%L,);E"``3XQ````H``%#C`3"@$PPP@!4.```:I0``ZH0`AN(@$(3B +M_O__ZP!0H.%L,);E"``3XP0```H``%#C`3"@$PPP@!4"```:F0``Z@``5>.7 +M```*;#"6Y0@`$^,T```*(*"$X@@`H.$*$*#A_O__ZP!P4.($```:"`"@X0H0 +MH.'^___K`'!0XHD```H8,)3EU#"'Y0$PH./<,(?E`#"@X]@PA^6H-P'C`S"6 +MYP(`4^,?```:`("@XQL\H.,#@,;G`3L!XP.`QN<#.P'C`X#&YP$PH./H,(?E +MK#,)$);G9+"@XYL!`>#3C03C8H!!XY@A@>`*`*#A(1.#X/[__^N0(-7E +M?#4!XP,@QN>1(-7E?34!XP,@QN>04-7E`5"%XJ50H.%?4$7B>C4!XP-0QN<` +M,)?E"2"6YYL""^"8*XC@"@"@X2@3@^#^___K?#"4Y0``4^,@,*`#;#"&!00` +M``H!`%/C"#"@`VPPA@4`,*`3;#"&%08`H.%9'X;B5"&6Y?[__^L&`*#A5A^& +MXE0AEN7^___K;#"6Y0@`$^,%```*4@V&XC``@.(`$*#C_O__ZP8`H.'^___K +M10Z&X@P`@.+^___K&```Z@0`<^,,```:!@"@X?[__^L`,`#C`#!`XP`0D^5% +M#H;B#`"`XO[__^ML,);E@``3XX`PPQ-L,(85"0``Z@`P`.,`,$#C`!"3Y44. +MAN(,`(#B_O__ZVPPEN6``!/C@###$VPPAA4-(*#A?SW"XS\PP^,$()/E`2!" +MX@0@@^7^___K^(^]Z/!!+>D`0*#AX&"`XH0`@.(&$*#A_O__ZP!0H.%L,)3E +M&``3XQ(```I7#83B&`"`X@80H.'^___K`'"@X?[__^L-,*#A?VW#XS]@QN,$ +M,);E`3"#X@0PAN4$`*#A!Q"@X?[__^L$,);E`3!#X@0PAN7^___K;#"4Y7`` +M$^,4```*!`"@X?[__^L$`*#A_O__ZP!PH.'^___K#3"@X7]MP^,_8,;C!#"6 +MY0$P@^($,(;E!`"@X0<0H.'^___K!#"6Y0$P0^($,(;E_O__ZP0`H.'^___K +M``!5XP`PH!,,,(45;#"4Y4``$^,&```*Z#8!XP,PE.D(T$WB`$"@X0%0H.$4.P'C`W"0YTR` +MD>7X.`'C`S#0YP$`4^,'```:F`"!XI00D>4`(*#C!#"-XO[__^L`8%#B`6"@ +M$QP``.KE/0+C`S#0YP$`4^,!8*`3!0``&@$`5^,`8*`3`6"@`P``6.,`8*`# +M`6`FX@$P5^(!,*`3``!8XP`PH!,``%/C!```"C0`G^4'$*#A"""@X?[__^L` +M8*#C;#"4Y2``$^,#```*?""5Y3PQE.4#`%+A`&"@$P8`H.$(T(WB\(&]Z)`) +M``#P3RWI--!-X@!`H.$`8*#C+V#-Y1AP@.((L)#E&#"0Y0PP@.5,H(#B@#"` +MXB`PC>4L,(#B'#"-Y0"``.,`@$#C;#!`XB0PC>4&D*#C4```Z@PPE.4#4*#A +M``!3XP!`H`.D```*`#"3Y0PPA.4@-)3E`0!3XPP``!H``%;C`P``"E`@EN50 +M,)7E`P!2X4```*H@`(7B"A"@X0D@H.'^___K`0!0XSH``!J5``#J*""4Y0`` +M4N,&```:``!6XY````I0();E4#"5Y0,`4N&,``"Z+P``Z@4PU.4``%/C&0`` +M"@``5N,#```*4""6Y5`PE>4#`%+A)@``JB@@E>5\,)3E`P!2X2(``!HL`(7B +M(!"=Y?[__^L!`%#C'0``&A``E>7^___KAS,!XP,`4.$8``#*)`"=Y040H.'^ +M___K``!0XV\``!H2``#J``!6XP,```I0$);E4#"5Y0,`4>$,``"J*#"5Y0,` +M4N$)```:+`"%XAP0G>7^___K`0!0XP0``!HD`)WE!1"@X?[__^L``%#C6P`` +M&@<`H.$,$)3E_O__ZP``4..I__\*``!6XP4``!H```#C``!`XX@1G^7^___K +M`$"@XTL``.H+4*#A(##6Y2$@UN4`((WE(B#6Y00@C>4C(-;E"""-Y20@UN4, +M((WE)2#6Y1`@C>4```#C``!`XT`1G^4L((;B_O__ZP`PE.4!`!/C%```"BP! +MG^4D$9_E_O__ZW``A.(<$(;BFOG_ZP``4.,&```*$`&?Y001G^7^___K"P"@ +MX?[__^L"0*#C*```Z@L`H.'^___K"P"@X?[__^L+`*#A_O__ZP4`H.$!$*#C +M+R"-XAPU`^,/X*#A`_"5YR]`W>4!`%3C%0``&@4`H.$"$*#C+B"-XAPU`^,/ +MX*#A`_"5YY(@UN4"`%+C`!``XP`00.,`,`#C`#!`XP,0H!$N0-WE`@!4XP`@ +M`.,`($#C`#``XP`P0.,#(*`1;`"?Y?[__^L%`*#A!A"@X?[__^L`0*#A!`"@ +MX330C>+PC[WH("#5Y2$PU>4B$-7E`!"-Y2,0U>4$$(WE)!#5Y0@0C>4E$-7E +M#!"-Y5`0E>40$(WE"`"@X2P0A>+^___K!6"@X9+__^JH#@``$`H``#P*``"` +M"@``$$`MZ0!`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E!`"@X?[_ +M_^L!`%#C`$"@`P!`E!4$,)05`""4%00P@A4`((,5`$"$%01`A!4-(*#A?SW" +MXS\PP^,$()/E`2!"X@0@@^7^___K!`"@X1"`O>AP0"WI`$"@X?[__^L",*#C +M`##$Y1$PH.,!,,3E>##@XP(PQ.4#`,3E(#2@X00PQ.4@6*#A!5#$Y7"`O>CP +M02WI`$"@X0%0H.'^___K;#"4Y1``$^/P@;T8;'"$XO[__^L-(*#A?SW"XS\P +MP^,$()/E`2""X@0@@^5L,)3E"``3XQP```IQ,-3E``!3XP$P0Q)Q,,05\#T" +M`P,PU`=Q,,0%MB#5X?\_#^,#`%+A`#"@$W$PQ!4$`*#A_O__ZP0`H.'^___K +MA`"$XN`0A.+^___K`&!0X@0```H`,*#C##"&Y0<`H.$&$*#A_O__ZP0`H.'` +M$(3B_O__ZVPPE.5``!/C`0``&B``$^,Z```*5PV$XA@`@.(%$*#A_O__ZP!@ +MH.'^___K#3"@X7]=P^,_4,7C!#"5Y0$P@^($,(7E!`"@X080H.'^___K!#"5 +MY0$P0^($,(7E_O__Z^@V`>,#,)3G`0!3XR,``!J$`(3BX!"$XO[__^L`4%#B +M!```"@`PH.,,,(7E!P"@X040H.'^___KJ6V$XE0AE.4D`(;BW!"$XG@@@N+^ +M___K,%"&X@4`H.$`$*#C)""@X_[__^L%`*#AE!"$XB0@H./^___K!`"@X?[_ +M_^LH`(;B_O__ZVPPE.4@`!/C0#"#$R`PPQ-L,(05!`"@X?[__^L-(*#A?SW" +MXS\PP^,$()/E`2!"X@0@@^7^___K\(&]Z'!`+>D`0*#A_O__ZPT`H.%_/<#C +M/S##XP0@D^4!((+B!""#Y0`PH.-,-X3E;#"4Y0(+$^,$```*20Z$XO[__^ML +M,)3E`CO#XVPPA.4`,`#C`#!`XP`PD^6X)0'C`B"4YV00H..1`@'@TRT$XV(@ +M0>.2`8'@5@V$X@@`@.(A$X/@_O__ZW`PU.4!`%/C6```&FQ0A.)L,)3E(``3 +MXR@```H!`!/C4@``&H`P@^-L,(3E!0"@X?[__^L!`%#C"```&@`P`.,`,$#C +M`!"3Y44.A.(,`(#BHA^!X@(0@>+^___K0P``ZFPPE.4".\/C;#"$Y:EMA.(P +M4(;B!0"@X0`0H.,D(*#C_O__ZP4`H.&4$(3B)""@X_[__^L$`*#A_O__ZR@` +MAN+^___K0#"@XVPPA.4$`*#A_O__ZP`PH.-P,,3E*P``ZH`P@^-L,(3E`#"@ +MXW`PQ.4%`*#A_O__ZP$`4.,(```:`#``XP`P0.,`$)/E10Z$X@P`@.*B'X'B +M`A"!XO[__^L:``#JN`"?Y7$0U.7^___K<3#4Y0``4^,1```*`3!#XG,P[^9Q +M,,3E``!3XP8```H$`*#AE!"$XO[__^L!`%#C`3"@`W`PQ`4%```*`#"@XW$P +MQ.4$`*#A_O__ZP0`H.'^___K;#"4Y8`PP^-L,(3E!`"@X?[__^L-(*#A?SW" +MXS\PP^,$()/E`2!"X@0@@^7^___K!`"@X?[__^N,.93E``!3XW"`O1AX-0/C +M`S"4YP``4^-P@+T(!`"@X3/_+^%P@+WHX`H``/!!+>D`8*#A`E"@X0!`4>+P +M@;T(##"4Y0$`4^/P@;T(_O__ZP!PH.$`,);E0``3XP(``!H@`!/C%("@`P`` +M``H!@*#C``!5XP8``!H0,)3E!W!CX!\U"./K,47CDR>#X*,"6.'P@;V(_O__ +MZPTPH.%_74!,(/B!#"%Y0P`E.@$,(+E`""#Y0!`A.4$0(3E +M!`"@X1`0AN+^___K)#"6Y0$P0^(D,(;E!#"5Y0$P0^($,(7E_O__Z_"!O>@0 +M0"WI_O__ZQ"`O>CP02WI`$"@X0%PH.%L@(#B_O__ZPT@H.%_/<+C/S##XP0@ +MD^4!((+B!""#Y81@A.*$0)3E!0``Z@10H.$`0)3E"`"@X040H.$'(*#A_O__ +MZP8`H.$$$*#A_O__ZP``4./T__\*#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E +M_O__Z_"!O>@00"WI_O__ZQ"`O>AP0"WI`%"@X?[__^L-(*#A?SW"XS\PP^,$ +M()/E`2""X@0@@^40`(7B_O__ZP$`4.,`0*`##P``"A!`E>4,`)3H!#""Y0`@ +M@^4`0(3E!$"$Y0!@H.,(8(3E#&"$Y?[__^L0`(3E%&"$Y1A@A.4D,)7E`3"# +MXB0PA>4-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K!`"@X7"`O>@00"WI +M_O__ZQ"`O>CP1RWI`*"@X0%PH.&$@(#BA$"0Y0!@H.,&4*#A"`"@X000H.'^ +M___K`0!0XP\```H$4*#A'`"$X@<0H.&(]__K``!0XPD``!H``%;C!```"A`@ +ME.40,);E`C!CX```4^,```"J!6"@X0!`E.7J___J"`"@X000H.'^___K`0!0 +MXRT``!I\`(KB_O__ZP$`4.,4```:"@"@X0(0H.-V((?B'#4#XP_@H.$#\)KG +M>""7Y1P`AN('$*#A>"""XO[__^O^___K$`"&Y0!`H.,,0(;E_O__ZQ``AN4( +M0(;E%$"&Y1A`AN7PA[WH;`"*XO[__^L`0%#B\(>]"'A0E^5X4(7B!R"@X790 +M@N0*`*#A`A"@XQPU`^,/X*#A`_":YQP`A.('$*#A!2"@X?[__^L$`*#A"!"@ +MX?[__^OPA[WHE""5Y7@PE^4#`%+A`@``F@HPU^4!`%/C\(>]"!P`A>('$*#A +M"B"@X6SW_^O^___K$`"%Y?"'O>AP0"WI`$"@X0%@H.'^___K#2"@X7\]PN,_ +M,,/C!""3Y0$@@N($((/E;#"4Y0$`$^,-```*W%"$X@4`H.$&$*#A*O?_ZP`` +M4.,'```*!0"@X080H.$$(*#A4O?_ZP0`H.%9'X3B5"&4Y?[__^L$`*#A!A"@ +MX?[__^L-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K<("]Z/!!+>D`8*#A +M`4"@X7@PD>5X,(/BWP]3XR<``(K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($ +M((/E;#"6Y4``$^,4```*X`"&X@00A.(&(*#C_O__ZP``4.,.```*?'"$XE8/ +MAN('$*#A"""@X_[__^N$`(;B!!"$XO[__^L`4%#B!```"I@`A>('$*#A"""@ +MX_[__^L(``#J;#"6Y8``$^,%```:$##4Y0``4^,,,(0%!@"@X000H.'^___K +M#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__Z_"!O>@00"WI`$"@X?[__^L8 +M`(3B_O__ZR``A.+^___K$("]Z!!`+>D`0%#B$("]"`0`H.'^___K(`"4Y0`` +M4.,0@+T(YAR@X_[__^L0@+WH$$`MZ?[__^L0@+WH\$$MZ0!PH.%L8(#B!@"@ +MX0`0H.-R+J#C_O__ZW1PA^4`4*#C>%"'Y6Q0A^4",*#C/#&'Y0$PH.-*-@00"WI_O__ZQ"`O>@!`*#C'O\OX0$`H.,>_R_A`0"@XQ[_+^$! +M`*#C'O\OX0$`H.,>_R_A\$DPT$WB`5"@X0!``.,`0$#C#<"@X0\`M.@/`*SH#P"TZ`\`K.@/ +M`)3H!P"LZ``PS.4`0-WE!0!4X0D```H!0*#C#2"@X00PTN<%`%/A!```"@%` +MA.(M`%3C^?__&@``H.,```#J`0"@XS#0C>(P`+WH'O\OX0``4.,>_R\!^#60 +MY0$`4^,>_R\1_#60Y0$`4^,>_R\1$#;0Y0``4^,`,*`3$#;`%1[_+^$``*#C +M'O\OX03@+>4,T$WB`#"@X0`@T>4$`%+C`R"@`\`I@`4'(,T%"```"@$`4N," +M(*`#!R#-!00```H``%+C`2"@`P<@S04`(*`3!R#-%0,`H.$"$*#C!R"-XA3% +M`^,/X*#A#/"3YP``H.,,T(WB`("]Z``PT>4#`%/CU#F`E0``H.,>_R_A``!1 +MXP0`H`,``*`3'O\OX5`QD.54$9#E6B^@XP+`D.<#`%SA!@``&@(@@.`$()+E +M`0!2X0(``!K0`)#E4`'@YQ[_+^%H,8#E;!&`Y0$`H.,>_R_A`#"@XX@WP.5+ +M+:#C`C#`YU`W@.54-X#E6#>`Y6`W@.7(-(#E9#>`Y5PW@.5H-X#E;"<`X[(P +M@.$#$*#A`R"`X!` +MY7@W@.4>_R_A<$`MZ0!0H.$!0*#A`0"@X0`0H.-8(*#C_O__ZQ@PH..Z,,3A +M`3"@XQ0PQ.4',*#C*##$Y0`PH.,J,,3E$B"@XT\@Q.4,,(3EH3?5Y0$`$^,& +M,*`31S#$%04PH`-',,0%`#"@XQ4PQ.4",,3E13#$Y48PQ.5(,,3E23#$Y4HP +MQ.6<-P#CLS"5X;8PQ.%P@+WH\$\MZ0S03>(`4*#A`7"@X0*0H.$"`*#A`!"@ +MXP8MH./^___K!T"@X0```.,``$#C!Q"@X?[__^L2`%?C`P``FE`!G^7^___K +M`&"@XTX``.I".@+C`[#5YP*@"^($L`OB`#``XP`P0.,G(*#CDC``8*#C!D"@X0`P`.,`,$#C!#"-Y0`P +MU>4.`%/C`""@@P$@H),``%KC`""@`P``4N,;```*AB"&X`(AB>``,,+E"0!7 +MXPL``!H!$$/B<1#OY@H`4>,!$*"3!!""E0T``)H,,$/B4T$)_E!B"@X?[__^L!8(;B=F#OY@%`A.)T0._F`5"% +MX@0`6.'$__^*!@"@X0S0C>+PC[WH.`L````/``#H$0``$$`MZ0!`H.$``%'C +M!`"@`Q"`O0@$`*#A2174Y7HNA.($((+BC/__ZZ('Q.4``*#C$("]Z'!`+>D` +M0*#AT#20Y0$`4^,`4*`#4@``"FQ7`.-(`9_E2!&?Y;4@E.'^___KM3"4X00` +M$^,&```:8">4Y0``4N,+```*!#"#X[4PA.$!4*#C"```ZF`GE.4``%+C!``` +M&@0PP^-L)P#CLC"$X0%0H.,```#J`%"@XVPW`..S,)3A$``3XPH``!K())3E +M``!2XP(``!IH)Y3E``!2XQ$```H0,(/C;"<`X[(PA.$!4(7B"0``ZL@DE.4` +M`%+C&```&F@GE.4``%+C!@``&A`PP^-L)P#CLC"$X0%0A>+(-)3E``!3XPX` +M`!IL-P#CLS"4X00`$^,*```:Z#24Y0(,$^,#```*9#>4Y0``4^,"8*`3!``` +M&FAGE.4`8%;B`6"@$P```.H#8*#C;#<`X[,PE.$#(`/B!@!2X0,PPQ,#8(81 +M;#<`$[-@A!$!4(42(`"?Y1@0G^5L-P#CLR"4X04PH.'^___K!0"@X7"`O>AX +M"P``_!$``)@+```00"WI````XP``0.,($)_E_O__ZP$`H.,0@+WH%!(``!!` +M+>EP$)'ERPV`XB$`@.($$('B!B"@X_[__^L!`*#C$("]Z/!`+>D,T$WB`'"@ +MX0%`H.$"8*#A#3"@X6@@G^4#`)+H!`"#Y+`0P^%P4);E"#"4Y0``4^,1```* +M!%"%X@4`H.'+'8?B(1"!X@8@H./^___K``!0XP4``!H%`*#A#1"@X08@H./^ +M___K``!0XP,```H'`*#A!A"@X0_@H.$(\)3E#-"-XO"`O>@<$@``$$`MZ9X7 +MT.6@)]#EGS?0Y?[__^L!`*#C$("]Z!!`+>D`0*#A'@V`X@@`@.+^___K!`"@ +MX?[__^L0@+WH<$`MZ0!0H.$!8*#A`""1Y5)(Y^<8`%3C&```B@`P`.,`,$#C +MA#&#X%0SD^4``%/C`@``"G(@_^8"`%/A#P``&A,,A>(0`(#B_O__ZPA@EN(* +M```*`#``XP`P0..$08/@!0"@X080H.$/X*#A6/.4Y1PS`>,#()7G`2""X@,@ +MA><``*#C<("]Z/!!+>D`<*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#'``` +M"M\/H./^___K`&"@X0"`H.$``%#C!```&@4`H.$<$*#C_O__ZP!`H.,1``#J +MK1Z'XM\OH./^___K%`"$XO[__^LW,*#CL##$X01@A.7?/Z#C"#"$Y0`PH.,, +M,(3E$#"$Y4L-A^((`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP3RWI#-!-X@!` +MH.$!4*#A`F"@X0-PH.%+/:#C`S#0YP``4^/J```*_O__ZPT@H.%_/<+C/S## +MXP0@D^4!((+B!""#Y3``5>-G```*!@``BBH`5>-:```*+0!5XUT```H%`%7C +MS0``&@L``.K=`%7C9P``"O\`5>,"```*/0!5X\8``!I=``#J````XP``0.-$ +M$Y_E_O__Z\```.I6GX3B5*&4Y2V-A.(,@(CBGC(-4(7BGC0!,*#C`3#%Y)XW`>.S +M,)3A`0`3XP$PH!,!,,44`#"@`P$PQ00$`%CC!C#=!0$PQ00&```*!0!8XP0` +M`!H%`*#A!A"-X@(@H./^___K`E"%X@80A.`%`*#A5A^!X@H@9N#^___KW#"4 +MY0(P@^((,(/@T#J$Y0*@BN((@(K@2(N$Y00`H.'^___K=@``Z@```.,``$#C +M#!*?Y?[__^MQ``#J````XP``0./\$9_E_O__ZVP``.H```#C``!`X^P1G^7^ +M___K9P``Z@```.,``$#CW!&?Y?[__^MB``#J````XP``0./,$9_E_O__Z\@! +MG^4&$*#A!""@X_[__^L``%#C!```"@```.,``$#CK!&?Y?[__^M3``#JI`&? +MY080H.$$(*#C_O__ZP``4.,$```*````XP``0..($9_E_O__ZT@``.J``9_E +M!A"@X00@H./^___K``!0XT````H`@*#C"&"-X@B`)N4M783B#%"%XDBKE.4` +M``#C``!`XTP1G^7^___K!0"@X0H0H.$((*#A#3"@X?[__^L`D%#B,0``"@!@ +MG>4(`%;A+@``"@FP9>`*@&O@!H!8X`"@H`,'```*"`"@X?[__^L`H%#B`P`` +M"@H`H.$&$(G@"""@X?[__^MP5Y3E``!5XQX```H!(-7E`""-Y0(@@N(+,(+@ +M"#"#X`,,4^,/``"*"0"@X040H.'^___K`#"=Y0``6N,$```*`C"#X@,`B>`* +M$*#A"""@X?[__^L`4)WE`C"%X@LP@^`(,(/@2#N$Y0``6N,%```*"@"@X0@0 +MH.'^___K`0``ZFP`G^7^___K`3"@XX@WQ.4-(*#A?SW"XS\PP^,$()/E`2!" +MX@0@@^7^___K``!7XP$```H$`*#A_O__ZPS0C>+PC[WHY!(``/@2```0$P`` +M)!,``#@3``!0$P``A`0``&P3``"(!```@!,``(P$``"4$P``Q`L``'!`+>D8 +MT$WB`%"@X0%`H.',-I'E``!3XPT``*H(-]'E``!3XQ@``!H!,*#C"#?!Y5`W +MD.4!,(/B4#>`Y0$`4^,1```:*A"@XP`@H./^___K#0``Z@@WT>4``%/C"@`` +M"@`PH.,(-\'E4#>0Y0$P0^)0-X#E``!3XP,``!HJ$*#C`""@XP$PH./^___K +MR#8`X[,PE.$!"Q/C$0``&@DWU.4``%/C(```&@$PH.,)-\3E5#>5Y0$P@^)4 +M-X7EH2?5Y0$`4N,8``":`0!3XQ8``!H%`*#A_Q"@XP`@H./^___K$0``Z@DW +MU.4``%/C#@``"@`PH.,)-\3E5#>5Y0$P0^)4-X7EH2?5Y0$`4N,&``":``!3 +MXP0``!H%`*#A_Q"@XP`@H.,!,*#C_O__Z\PVE.6``!/C$0``&@HWU.4``%/C +M(```&@$PH.,*-\3E6#>5Y0$P@^)8-X7EH2?5Y0$`4N,8``":`0!3XQ8``!H% +M`*#A_Q"@XP`@H./^___K$0``Z@HWU.4``%/C#@``"@`PH.,*-\3E6#>5Y0$P +M0^)8-X7EH2?5Y0$`4N,&``":``!3XP0``!H%`*#A_Q"@XP`@H.,!,*#C_O__ +MZ\PVE.4""Q/C10``"A!FE.569._GX!#4Y>$@U.7B,-3EXP#4Y0``C>7D`-3E +M!`"-Y>4`U.4(`(WE#&"-Y80!G^7^___K##?4Y0``4^,`,*`3##?$%<@TE14! +M,$,2R#2%%1``%N,5```:"S?4Y0``4^,!,(,""S?$!6`WE04!,(,"8#>%!>`@ +MU.7A,-3EXA#4Y0`0C>7C$-3E!!"-Y>00U.4($(WEY1#4Y0P0C>5@%Y7E$!"- +MY1`!G^40$9_E_O__ZP(`%N,O```:#3?4Y0``4^,!,(,"#3?$!60WE04!,(," +M9#>%!>`@U.7A,-3EXA#4Y0`0C>7C$-3E!!"-Y>00U.4($(WEY1#4Y0P0C>5D +M%Y7E$!"-Y;@`G^6P$)_E_O__ZQ@``.H,-]3E``!3XP$PH`,,-\0%R#25!0$P +M@P+(-(4%T#25Y0$`4^,.```:X"#4Y>$PU.7B$-3E`!"-Y>,0U.4$$(WEY!#4 +MY0@0C>7E$-3E#!"-Y<@4E>40$(WE5`"?Y4@0G^7^___K!0"@X3K]_^L``%#C +M"0``V@4`H.$M$*#C`""@XP(PH.'^___K!0"@X3T0H.,`(*#C`3"@X_[__^L8 +MT(WB<("]Z-@+```<#```J!,``'`,``"\#```\$$MZ0!@H.&(.9#E`0!3X_"! +MO=@#`%/CD#F0!0$P@P*0.8`%'`"@X_[__^L`<*#A`$"@X0``4./P@;T(,`"@ +MX_[__^L`4%#B`P``&@<`H.$<$*#C_O__Z_"!O>@4`(?B_O__ZQ(PH..P,,?A +M!%"'Y3`PH.,(,(?E`#"@XPPPA^40,(?E2PV&X@@`@.('$*#A_O__Z_"!O>CP +M02WI$-!-X@!0H.$!0*#AP#F0Y0,P`^(#`%/C,0``&@&`H.%7#8#B&`"`XO[_ +M_^L`8%#B)@``"@9PU.4```#C``!`XP<0H.'^___KV!"6Y0$P0>(;`%/C!``` +MF@```.,``$#C_O__ZP4`H.,H``#J`Q"!XG%@[^8`$-3E`2#4Y0(PU.4#`-3E +M``"-Y00`U.4$`(WE!0#4Y0@`C>4,8(WE````XP``0./^___K!R&@X0=`A.(` +M0(WE!0"@X080H.$"*8+C"#"@X?[__^L!`*#C#P``Z@```.,``$#C_O__ZP4` +MH.,*``#J!B#1Y0(AH.$',('B`#"-Y040H.,"*8+C!#"@X?[__^L&,-3EW#F% +MY0``H.,0T(WB\(&]Z!!`+>D0T$WB`4"@X0`PH.,(,,WE"3#-Y0HPS>4+,,WE +M###-Y0TPS>4#,-'E``!3XP$PT17@.8`5`1#1Y0(Y@>,$(-3D`$"-Y0(A@^$( +M,(WB_O__ZP``H.,0T(WB$("]Z/!`+>D4T$WB`$"@X0!0`.,`4$#C!0"@X?[_ +M_^L```#C``!`XU8]H.,#$)3G_O__ZP```.,``$#C>S4!X],0E.'^___K!`"@ +MX0`0H.,,((WB'#4#XP_@H.$#\)3G````XP``0.,,$)WE_O__ZP```.,``$#C +M>C4!X],0E.'^___K````XP``0.-\-0'C`Q#4Y_[__^L```#C``!`XWTU`>,# +M$-3G_O__ZP4`H.'^___K!`"@X<4>H./^___K`%"@X00`H.%8'`#C_O__ZP`@ +MH.$```#C``!`XP40H.'^___K!`"@X:(=`./^___K`%"@X00`H.&D'0#C_O__ +MZP!@H.$$`*#AIAT`X_[__^L`<*#A!`"@X:@=`./^___K``"-Y0```.,``$#C +M!1"@X08@H.$',*#A_O__ZP0`H.%;&@#C_O__ZP!0H.$$`*#A7!H`X_[__^L` +M(*#A````XP``0.,%$*#A_O__ZQ30C>+P@+WH<$`MZ0!`H.'^___K``!0XP,` +M`!H$`*#A_O__ZP``4.-P@+T(`%"@XY]7Q.6@5\3E%&4#XP0`H.$*$*#C!2"@ +MX0_@H.$&\)3G!`"@X0,0H.,`(`#C`"!`XP_@H.$&\)3G!`"@X9X7U.6@)]3E +MGS?4Y?[__^L$`*#A_O__Z\!9A.4$`*#A!1"@X?[__^NP,@'C`U"$YTD-A.(\ +M`(#B_O__ZW"`O>AP0"WI`%"@X0%`H.'^___KT#25Y0``4^,-```*`3"@X_@U +MA.74-)7E_#6$Y04`H.&I'H7B"A"!XO[__^L``%#C`3"@$PXVQ!4!,*#CW#"$ +MY00``.H`,*#C^#6$Y?PUA.4.-L3EW#"$Y9\WU>4,-L3EH#?5Y0TVQ.4`,*#C +M#S;$Y1`VQ.7$-)7E``!3XP$PH!/<,(05`3"@X]`PA.5P@+WH<$`MZ0C03>(` +M0*#A``!1XPT``*H(((WB`3"@XP$P8N4450/C#!"@XP_@H.$%\)3G!`"@X0,0 +MH.,`(`#C`"!`XP_@H.$%\)3G;```ZL`YD.4#,`/B`0!3XPL``!K^___K`%!0 +MX@@```K8,)7E@S*$X$Q>@^4$`*#AV!"5Y?[__^L$`*#AV!"5Y?[__^M7#83B +M&`"`XJT>A.($$('B_O__ZP!@4.(D```*V#"6Y8,RA.!,;H/E!`"@X0<0H.,! +M(*#C_O__ZP0`H.'^___K%%4#XP0`H.$%$*#CLRZ$X@0@@N(/X*#A!?"4YP0` +MH.$-$*#CIBZ$X@H@@N(/X*#A!?"4YP0`H.%L.@#CLQ"4X?[__^L$`*#A_O__ +MZP0`H.'^___K!`"@X080H.'^___K!`"@X080H.&)___K&@``Z@0`H.$'$*#C +M`2"@X_[__^L$`*#A_O__ZQ15`^,$`*#A!1"@X[,NA.($((+B#^"@X07PE.<$ +M`*#A#1"@XZ8NA.(*((+B#^"@X07PE.<$`*#A;#H`X[,0E.'^___K!`"@X?[_ +M_^L$`*#A_O__ZP@@C>(",*#C`3!BY00`H.$,$*#C%#4#XP_@H.$#\)3GP#F4 +MY0,P`^("`%/C!0``&@0`H.%Y'H3B_O__ZP$@H..P,@'C`R"$YP0`H.$"$*#C +M`""@X_[__^L(T(WB<("]Z/!'+>D`8*#A`7"@X0*`H.$<`*#C_O__ZP!`H.$` +M4*#A``!0X_"'O0@4`*#C_O__ZP"@4.(#```:!`"@X1P0H./^___K\(>]Z!0` +MA.+^___K.#"@X[`PQ.$4,*#C"#"$Y02@A.4`,*#C##"$Y1`PA.4,,*#CL##* +MX0LPH.,",,KE>0Z&X@@`@.+^___K`P#*Y0A`BN($`*#A!Q"@X08@H./^___K +M"("$Y10`G^7^___K2PV&X@@`@.(%$*#A_O__Z_"'O>@8#P``\$$MZ0C03>(` +M8*#A`7"@X;8@S>$<`*#C_O__ZP!`H.$`4*#A``!0XR<```H0`*#C_O__ZP"` +M4.(#```:!`"@X1P0H./^___K'P``ZA0`A.+^___K.#"@X[`PQ.$0,*#C"#"$ +MY02`A.4`,*#C##"$Y1`PA.4(,*#CL##(X0PPH.,",,CE>0Z&X@@`@.+^___K +M`P#(Y0@`B.('$*#A!B"@X_[__^L.`(CB!A"-X@(@H./^___K&`"?Y?[__^M+ +M#8;B"`"`X@00H.'^___K"-"-XO"!O>@X#P``\$$MZ0!@H.$<`*#C_O__ZP!P +MH.$`0*#A``!0X_"!O0@,`*#C_O__ZP!04.(#```:!P"@X1P0H./^___K\(&] +MZ!0`A^+^___K.#"@X[`PQ^$,,*#C"#"'Y010A^4`,*#C##"'Y1`PA^4$,*#C +ML##%X0DPH.,",,7E>0Z&X@@`@.+^___K`P#%Y8PYEN4(,(7E2PV&X@@`@.(' +M$*#A_O__Z_"!O>CP02WI`'"@X0&`H.$<`*#C_O__ZP!0H.$`0*#A``!0X_"! +MO0@Z#J#C_O__ZP!@4.(#```:!0"@X1P0H./^___K\(&]Z!0`A>+^___K.#"@ +MX[`PQ>$Z/J#C"#"%Y01@A>4`,*#C##"%Y1`PA>7F/Z#CL##&X0HPH.,",,;E +M>0Z'X@@`@.+^___K`P#&Y0A0AN(D`(;BK1Z'XM\OH./^___K%("%Y1B`A>4' +M`*#A!1"@X?[__^M+#8?B"`"`X@00H.'^___K\(&]Z'!`+>D`0*#A`5"@X0)@ +MH.&M#H#B_O__ZP`0H.$%`*#A!B"@X_[__^L``%#C%@``"EP`G^5<$)_E_O__ +MZ\`YE.4#(`/B`@!2XP\``!H!"1/C!@``"@`PH./`.83E!`"@X040H.$&(*#A +M_O__ZP8``.HG#!/C!```"@`PH./`.83E!`"@X0$0X./^___K`0"@XW"`O>C` +M"P``N!,``#!`+>D,T$WB`$"@X:U>@.(<.Y#EGC?`Y04`H.'^___K:CH`X[,` +MA.$$`*#A_O__ZP4`H.'^___K`%"@X00`H.$%$*#A_O__ZP$`%>,D```*!`"@ +MX0(0H./^___KU#F4Y0(`4^/,,*`#SS"@$P@@C>(!,&+E!`"@X1$0H.,4-0/C +M#^"@X0/PE.<$`*#AGA?4Y:`GU.6?-]3E_O__ZVHZ`..S`)3A_O__ZP`P`.,` +M,$#C`#"3Y600H..1``'@TRT$XV(@0>.2`8'@20V$XCP`@.(A$X/@_O__ZP(Q +M`./`.83E%P``Z@(`%>,5```*!`"@X0$0H./^___K"""-XC`PX.,!,&+E!`"@ +MX1$0H.,4-0/C#^"@X0/PE.<$`*#AGA?4Y:`GU.6?-]3E_O__ZP0`H.'^___K +M`1"@X\`9A.4$`*#A_O__ZPS0C>(P@+WH\$\MZ0S03>(`<*#A`5"@X0)`H.%P +MD)'E:#"1Y1@P0^($,(WE`PQ3XP``H(.O``"*`@"@X0`0H./?+Z#C_O__ZPA@ +MC>($@#;E?#"(X@`PA.5X@(3E?`"$XA@0B>(((*#A_O__ZV0PE>4T,(3E63#5 +MY74PQ.5<,-7E=##$Y0<`H.$"$*#C=B"$XAPU`^,/X*#A`_"7YXB`A.)X,)3E +M"`"@X0`0H.,&(*#A##!#XO[__^L`H%#B`P``&C@"G^7^___K``"@XXD``.H* +M4*#A`2#UY0``4N,`,*`###"$!00```H0`(3B`A"*XO[__^L`,-7E##"$Y62@ +MA.(*`*#A`!"@XQ`@H./^___K>#"4Y0@`H.$!$*#C!B"@X0PP0^+^___K`%!0 +MX@"PH`,$```*"@"@X0(0A>($()WE_O__ZP2PG>5X,)3E"`"@X3(0H.,&(*#A +M##!#XO[__^L`4%#B`P``"@L`BN`"$(7B!""=Y?[__^L#$*#C/!"$Y7@PE.4( +M`*#A!B"@X0PP0^+^___K`#"@XTPPA.5`,(3E`%!0X@(PU15,,(05$@``&G@P +ME.4(`*#A/1"@XP8@H.$,,$/B_O__ZP!04.(",-453#"$%0@``!J(.9?E`P!3 +MXY`YEP6#,(,``S&'`*0WTP5,,(0%GC?7%4PPA!5\`(3B_O__ZP`0H.%$`(3B +M`B"@X_[__^L$`*#A_O__ZP!0H.$!`!#C!@``"@$PH.-@,(3E!`"$X@H0B>(& +M(*#C_O__ZP4``.H`,*#C8#"$Y00`A.(0$(GB!B"@X_[__^L0`!7C`3"@$S`P +MA!4`,*`#,#"$!0`PH.-(,(3EY3T"XP,PU^0Z&X@,`@.#^___K`P#%Y08`H.$($*#A"""%XO[__^L` +M`%#C!@``&@<`H.$<$*#C_O__ZP4`H.'A'Z#C_O__Z_"!O>A+#8;B"`"`X@<0 +MH.'^___KC#F6Y0$P@^*,.8;E\(&]Z/!!+>D`0*#A<%"1Y?[__^N(.93E`P!3 +MXQ<```JM#H3B_O__ZP`0H.$0`(7B!B"@X_[__^L``%#C#P``"L`YE.4!"1/C +M#```"E<-A.(8`(#B"A"%XO[__^L`0%#B!@``"A4^H./38(3A`0"@XP`0H.,& +M`)#@!Q"AX/,`A.$!`*#C\(&]Z'!`+>D`8*#A_O__ZP!`4.(.```*!@"@X?[_ +M_^L`4%#B!```&@8`H.$$$*#A_O__ZP!`H.,%``#J`S"@XV0PA.5P4(3E$#"5 +MY6PPA.440(7E!`"@X7"`O>CP3RWII-!-X@!`H.&,,(WB`""@XP0@@^0$((/D +M!""#Y``@@^7,-)#E`@!3X;H```K(-)#E`@!3X;<```J`.M#E`0!3X[0```K4 +M`I_EU!*?Y?[__^L$,*#CGS#-Y0`PH..>,,WE3@V$XC@`@.+^___K`'!0XJ@` +M``H$`*#A"!"'XO[__^ML`)?E`!"@XV@@H./^___K;&"7Y090H.$`,*#C*##E +MY0$PQ>6MCH3B"`"@X?[__^L`$*#A+`"&X@8@H./^___K,@"&XLL=A.(A$('B +M!B"@X_[__^L(`*#A_O__ZP`0H.$X`(;B!B"@X_[__^L&(*#AOA/RX9PW`..S +M`)3A#Q`!X@`2@>&P$,+ALR"4X0$@@N*S((3AL##5X?PPP^/0,(/CL##%X0>` +MH.$8,*#C%#"HY4``AN(!$*#CGR"-X@@PH.'^___K`1"@XYX@C>((,*#A_O__ +MZP"PH.',-)3E``!3XP<``-J@,(WB!""@XY`@8^4`@(WE2!"@XP$@H./^___K +M`+"@X10`C>(`$*#C>""@X_[__^O(-)3E``!3XU@``-K^___K#1"@X7\]P>,_ +M,,/C!""3Y0$@@N($((/EA""$X@P@C>6$H)3E`9"@XP1@H.$,`)WE"A"@X?[_ +M_^L!`%#C%P``"@I0H.$`H)KEE#"5Y:0`A>(M$*#C$""-X@PP0^+^___K``!0 +MXP(```H00)WE``!4X^W__QIH,)7E`2!#X@T`4N/I__^*H!"-X@,P@>",D$/E +M%$#=Y0``5.,4D,T%XO__Z@9`H.$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^ +M___K`)"@XPE@H.$!,*#C##"-Y0>@H.$$<*#A%!"-X@DPT>4/(*#CDA8CX`%0H.,,0)WE`2#3Y0$`4N,$```:#P!4XZ`0C=($(('0%%!" +MU0%`A-(!4(7B`3"#X@\`5>/S__\:`("-Y0L`H.%)$*#C!""@X8PPC>+^___K +M`+"@X0%@AN(/D(GB"`!6X]___QH'0*#A"G"@X10PE^48,(?E!`"@X0<0H.'^ +M___KI-"-XO"/O>C`"P``S!,``/!%+>D4L`(?B"A"@X08@H./^___K +M,@"'XLL=A.(A$('B!B"@X_[__^NM#H3B_O__ZP`0H.$X`(?B!B"@X_[__^L' +M(*#AOA/RX9PW`..S`)3A#Q`!X@`2@>&P$,+ALR"4X0$@@N*S((3AL##5X?PP +MP^/0,(/CL##%X0:`H.$8,*#C%#"HY4``A^(!$*#C%R"-X@@PH.'^___K`1"@ +MXP<@C>((,*#A_O__ZP!PH.&T,-WA%U#=Y0,`5>-;```:!R#=Y0$`4N,T```* +M?CK4-0(``#H"`%+C5```&D8``.H!,(/B$/,`/B`S&@X0$Z@^,",(/C&""-XK0P +M8N$"$*#C"#"@X?[__^L8((WB`#"@X[@P8N$"$*#C"#"@X?[__^L`<*#A5PV$ +MXA@`@.(*$*#A_O__ZP!04.('```*M##=X0$'`*#A`A"@XPX@C>((,*#A_O__ZR,``.HJ783B`1"@XP$@A>`( +M,*#A_O__ZP(0H.,$((WB"#"@X?[__^N".@#CLS"4X3\P`^(!.H/C&""-XK0P +M8N$"$*#C"#"@X?[__^L"$*#C!""%X@@PH.'^___K#```ZH,QH.'_,`/B&""- +MXK0P8N$"$*#C"#"@X?[__^L8((WB)3"@X[8P8N$"$*#C"#"@X?[__^L4,);E +M&#"&Y00`H.$&$*#A_O__ZQS0C>+PA;WH\$$MZ0!`H.$!8*#A!'"!XE<-@.(8 +M`(#B!Q"@X?[__^L`4%#B&0``"L`YE.4!"1/C`@``"G0JU.4``%+C`@``&@,P +M`^(#`%/C"P``&@0`H.$'$*#A`""@X[`PUN'^___K`#``XP`P0.,`$)/E8@^% +MXL@0@>+^___K!```Z@`PEN40)M7E`1"@XQ$SPN$0-L7E``"@X_"!O>CX3RWI +M`'"@X0%`H.$"@*#AP#F0Y0,@`^(#`%+C`0``"@$)$^-!```*5PV'XA@`@.(( +M$*#A_O__ZP!04.([```*``!4XQD``!IO7X7B`*``XP"@0.,"D*#C!+"@X01@ +MH.$`,-7E`0!3XPL``!H*`*#A!!"@X?[__^N$,*#A!P"@X0@0H.$)(*#A'C`# +MXO[__^L`L,7E`##@X[(PQ>$!0(3B1%"%XA``5./K__\:'P``Z@$`5.,=```: +M`$"@XP"@`.,`H$#C`I"@XP&PH.,$8*#A#S;5Y5,TH.$!`!/C$```"@H`H.$$ +M$*#A_O__ZX0PH.$!,(/C!P"@X0@0H.$)(*#A'S`#XO[__^L;9.#A#S;5Y0,P +M!N`/-L7E$#;5Y0-@!N`09L7E`4"$XA``5./F__\:`0"@X_B/O>CP1RWI"-!- +MX@"`H.$!8*#AU#"1Y0$P@^+8,('EJ#@DF.40-I;E4S3OYR(T`^!@ +M`!/C`3"@$PXVQA7H))CE$#:6Y5,T[^!`AN((`*#A`!"@ +MXP0@H.'^___K"`"@X0$0H.,$(*#A_O__ZP`0H.,/%L;E$!;&Y14.AN(X(*#C +M_O__ZP``5N-P```*!E"@X0!PH.,'0*#A,`'5Y0``4.,"```*?P``XO[__^L` +M<(?A`4"$X@%0A>(0`%3C]?__&O@UEN4``%/C`)"@`Q\```H(`*#A$Q"@XP<@ +MC>(8-0/C#^"@X0/PF.<'0-WE`@!4XQ#`H`,(P*`3`%"@XV$.H.,!X*#C!T"% +MX@``5>,%0*"AQ$&&X`!`A.`$(-3EQ3^@X:,^H.$#$(7@!Q`!X@$P8^!2,Z#A +M`0`3XPPPA1(>'M__^Z#I;6Y2@QF.4.`%/C!0``FO].Q^/_ +M0L3C``!4XQ1`H!,$0*`#!P``ZO\^Q^/_,L/C``!3XPM`H!,"```:_PX7XP-` +MH!,!0*`#!`"@X?[__^L`4*#A#P+'X_[__^O4$);E'P!1XR,``(H_H`#BV$#6 +MY1]`!.*`0(3C`0!9XPX``!H@0(3C!7Z'X0```.,``$#C!Q"@X00@H.'^___K +M"`"@X0<0H.$$(*#A+#4#XP_@H.$#\)CG0*"*XPL``.H%?H?A````XP``0.,' +M$*#A!""@X?[__^L(`*#A!Q"@X00@H.$L-0/C#^"@X0/PF.=.4<;E3Z'&Y0(` +M`.H```#C``!`X_[__^O^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/ET""6 +MY0$@@N/0((;E!""3Y0$@0N($((/E_O__ZPC0C>+PA[WH$$`MZ4"#!3C +M`3"@$]PP@14`,*`#W#"!!<0TD.4``%/CW#"!!0(+%.,!,*`3^#6!%=PP@14` +M,*`#^#6!!=`TD.4``%/C^#6!!?[__^L0@+WH\$$MZ0C03>(`0*#A`8"@X;8@ +MS>%.#8#B.`"`XO[__^L`4%#B-```"@0`H.$($(7B_O__ZVP`E>4`$*#C:""@ +MX_[__^ML<)7E!V"@X0`PH.,H,.;E`3#&Y2P`A^(($*#A!B"@X_[__^LR`(?B +MRQV$XB$0@>(&(*#C_O__ZZT.A.+^___K`!"@X3@`A^(&(*#C_O__ZP<@H.&^ +M$_+AG#<`X[,`E.$/$`'B`!*!X;`0PN&S()3A`2""XK,@A.&P,-;A_###X\`P +M@^.P,,;A!3"@X1@@H.,4(*/E0`"'X@(0H.,&((WB_O__ZQ0PE>48,(7E!`"@ +MX040H.'^___K"-"-XO"!O>AP0"WI`$"@X0!04>)P@+T("#?5Y0``4^,*```* +M`#"@XP@WQ>50-Y#E`3!#XE`W@.4``%/C`P``&BH0H.,`(*#C`3"@X_[__^L) +M-]7E``!3XPX```H`,*#C"3?%Y50WE.4!,$/B5#>$Y:$GU.4!`%+C!@``F@`` +M4^,$```:!`"@X?\0H.,`(*#C`3"@X_[__^L*-]7E``!3XPX```H`,*#C"C?% +MY5@WE.4!,$/B6#>$Y:$GU.4!`%+C!@``F@``4^,$```:!`"@X?\0H.,`(*#C +M`3"@X_[__^L+-]7E``!3XP`PH!,+-\458#>4%0$P0Q)@-X05##?5Y0``4^,` +M,*`3##?%%<@TE!4!,$,2R#2$%0TWU>4``%/C`#"@$PTWQ15D-Y05`3!#$F0W +MA!4$`*#AOO7_ZP``4.,)``#:!`"@X2T0H.,`(*#C`C"@X?[__^L$`*#A/1"@ +MXP`@H.,!,*#C_O__Z^!@A>($`*#A`!"@XP8@H.'^___K!`"@X0$0H.,&(*#A +M_O__ZP`PH.,/-L7E$#;%Y00`H.$&$*#A`R"@X_[__^O^___K#3"@X7]MP^,_ +M8,;C!#"6Y0$P@^($,(;E!`"@X040H.'^___K!#"6Y0$P0^($,(;E_O__ZW"` +MO>CP3RWI'-!-X@"`H.$7;(#B"&"&X@@W`>,#0)#G#3"@X7^MP^,_H,KC"I"@ +MX4``%/C +M(```"@$P0^(\-H7E``!3XQP``!H+,(7@.":5Y306E>4$(('E`!""Y30VA>4X +M-H7EX!#5Y>$@U>7B,-7EXP#5Y0``C>7D`-7E!`"-Y>4`U>4(`(WE%`"=Y?[_ +M_^O^___K!#":Y0$P@^($,(KE"`"@X040H.'^___K!#"9Y0$P0^($,(GE_O__ +MZP8`H.$$$*#A_O__ZP``4./4__\*%WR(XA<\H.,#0)CGU&D/X_]O3^,8IP'C +M+)8`XP"P`.,`L$#C(@``Z@90A.``0)3E!0"@X?[__^L``%#C"C"8%SPVA14\ +M-I7E``!3XQ@```H!,$/B/#:%Y0``4^,4```:"3"%X#`FE>4L%I7E!""!Y0`0 +M@N4L-H7E,#:%Y>`0U>7A(-7EXC#5Y>,`U>4``(WEY`#5Y00`C>7E`-7E"`"- +MY0L`H.'^___K"`"@X040H.'^___K!P"@X000H.'^___K``!0X]?__PHD`4*#A<$"1Y01PH.$08(3BK0Z`XO[__^L`$*#A!@"@X08@H./^ +M___K``!0XQ4```JX0=3A5`"?Y500G^4$(*#A_O__ZVPPE>40`!/C!P``"E<- +MA>(8`(#B"A"'XO[__^L`$*#A!0"@X?[__^L%``#J!0"@X080H.$$(*#A_O__ +MZP`PH.,0-<7E`0"@X_"!O>A0$```[!,``/!!+>D`4*#A<$"1Y01PH.$08(3B +MK0Z`XO[__^L`$*#A!@"@X08@H./^___K``!0XQ4```JX0=3A5`"?Y500G^4$ +M(*#A_O__ZVPPE>40`!/C!P``"E<-A>(8`(#B"A"'XO[__^L`$*#A!0"@X?[_ +M_^L%``#J!0"@X080H.$$(*#A_O__ZP`PH.,0-<7E`0"@X_"!O>A0$```^!,` +M`/!!+>D(T$WB`&"@X0TPH.&$()_E`P"2Z`0`@^2P$,/A%XR&XA<\H.,#4);G +MU'D/X_]_3^,,``#J!T"%X`!0E>5B/H3B##"#XC`FE.4L%I3E!""!Y0`0@N4L +M-H3E,#:$Y08`H.$$$*#A_O__ZP@`H.$%$*#A_O__ZP``4./M__\*!@"@X0T0 +MH.$#(*#C_O__ZP``H.,(T(WB\(&]Z`04``!P0"WI`$"@X0`PH..(-\#E2RV@ +MXP(PP.?^___K!`"@X?[__^L$`*#A_O__ZP!@H.'^___K#3"@X7]=P^,_4,7C +M!#"5Y0$P@^($,(7E!`"@X080H.'^___K!#"5Y0$P0^($,(7E_O__ZP0`H.'^ +M___K<`>4Y0``4.,#```*?!>4Y?[__^L`,*#C<#>$Y70'E.4``%#C`P``"H`7 +ME.7^___K`#"@XW0WA.5X!Y3E``!0XW"`O0B$%Y3E_O__ZP`PH.-X-X3E<("] +MZ!!`+>D`0*#A'@V`X@@`@.+^___K!`"@X?[__^L0@+WH<$`MZ0!0H.$`0)#E +M``!4XW"`O0@$`*#A_O__ZX@U`^,#,)3G`0!3XW"`O1BK#H7B#`"`XO[__^NN +M#H7B#`"`XO[__^MP@+WH<$`MZ0C03>(`0*#A_O__ZP``4.,$```*!`"@X:T> +MA.($$('B`R"@X_[__^L`4*#CP%F$Y9]7Q.6@5\3E!`"@X040H.'^___K%&4# +MXP0`H.$*$*#C!2"@X0_@H.$&\)3G!`"@X0,0H.,`(`#C`"!`XP_@H.$&\)3G +MP#F4Y0,P`^(#`%/C`0!3$P4``!H(((WB`5!BY00`H.$'$*#C#^"@X0;PE.<` +M4*#CP%F$Y00`H.&>%]3EH"?4Y9\WU.7^___K!`"@X?[__^M)#83B/`"`XO[_ +M_^NP,@'C`U"$YP4`H.$(T(WB<("]Z/!/+>D4T$WB`$"@X0%0H.&MCH#B`7"@ +MX<`YD.4!"1/C%```"@(`$^,"```*!!"(X@,@H./^___K`&"@X\!IA.4$`*#A +M_O__ZTD-A.(\`(#B_O__ZP0`H.$&$*#A_O__ZP0`H.$*$*#C!B"@X10U`^,/ +MX*#A`_"4YP0`H.%V$-?E`""@X_[__^L$`*#A_O__ZP`PH..P(@'C`C"$YY\W +MQ.6@-\3E""5Y4@KA.4##%+C!`"@@U8``(HM?83B#'"'X@<`H.%\$(7B +M_O__ZP<`H.%(&Y3E_O__ZVX*Q.5(.Y3E#`!3XS8``)H,4*#C`8"@X^&=`N,` +ML`#C`+!`XQBAG^4%8(?@`##6Y3T`4^,-```*W0!3XP(```HM`%/C(@``&@8` +M`.H"`(;B"A"@X00@H./^___K``!0XW&*Q!4:``#J=8K$Y1@``.IVBL3E;CK4 +MY0(`4^,4```:"3#4YP``4^,1```*`B"&X@0@C>4!,-+E!``3XPP```J?A\3E +M`3#2Y0,P`^(!`%/CH(?$!00```H#`%/C`""@$Z`GQ!4",*`#H#?$!0L`H.'^ +M___K`3#6Y0(P@^(#4(7@2#N4Y04`4^'.__^*%%4#XP0`H.$#$*#CK2Z$X@0@ +M@N(/X*#A!?"4YP!@H.,0((WB`6!BY00`H.$,$*#C#^"@X07PE.=)#83B/`"` +MXO[__^L$`*#A_O__ZP8`H.$4T(WB\(^]Z(@$``#P1RWI`%"@X0&0H.$"H*#A +M````XP``0..4$9_E_O__ZTX-A>(X`(#B_O__ZP!`4.+PA[T(!0"@X0@0A.+^ +M___KLC'4X0(P@^*R,<3A`3"@XTTPQ.58,,3E`("@XS&`Q.54@,3E;`"4Y0@0 +MH.%H(*#C_O__ZVQ@E.4H8(;B!G"@X0"`QN4!@,;EP#F5Y0,P`^(#`%/C`(#' +M!0(PH`,!,,8%!```"@(`4^,`,*`#`##&!0$PH`,!,,8%5##4Y0``4^,'```* +M`##7Y0$@U^4"-(/A`CJ#XW,P_^8`,,?E(S2@X0$PQ^6R@=3A`H!(X@B`AN`/ +MH`KBL##8X0.@BN%ZH/_FL*#(X5@PU.4!,`/B`S**X7,P_^:P,,CA,2#4Y0,@ +M`N*",H/AL##(X00`A^()$*#A!B"@X_[__^L*`(?BRQV%XB$0@>(&(*#C_O__ +MZZT.A>+^___K`!"@X1``A^(&(*#C_O__Z[8A]^&<-P#CLQ"5X0\@`N(!(H+A +ML"#'X;,@E>$!((+BLR"%X;`PUN'\,,/CR#"#X[`PQN$:,*#C%#"$Y1@PA.4% +M`*#A!!"@X?[__^OPA[WH#!0``/!!+>D`0*#A`8"@X4X-@.(X`(#B_O__ZP!0 +M4.+P@;T(!`"@X0@0A>+^___K;`"5Y0`0H.-H(*#C_O__ZVQPE>4H<(?B!V"@ +MX0`PH.,`,,?E`3#'Y<`YE.4#,`/B`P!3XP0``!H`,*#C`##'Y0(PH.,!,,?E +M!```Z@(`4^,`,*`#`##'!0$PH`,!,,<%``!8XP<```H`,-;E`2#6Y0(T@^$! +M.H/C(&(*#C_O__ZP@`H.'^___K`!"@X1``AN(&(*#C_O__ +MZ[8A]N&<-P#CLQ"4X0\@`N(!(H+AL"#&X;,@E.$!((+BLR"$X;`PU^'\,,/C +M2#"#X[`PQ^$8,*#C%#"%Y1@PA>4$`*#A!1"@X?[__^OP@;WH\$\MZ3303>(` +M0*#A3@V`XC@`@.+^___K`*!0XA\!``H$`*#A"!"*XO[__^ML`)KE`!"@XV@@ +MH./^___K;%":Y05@H.$`<*#C*'#FY0%PQN6MCH3B"`"@X?[__^L`$*#A+`"% +MX@8@H./^___K,@"%XLL=A.(A$('B!B"@X_[__^L(`*#A_O__ZP`0H.$X`(7B +M!B"@X_[__^L%(*#AOA/RX9PW`..S`)3A#Q`!X@`2@>&P$,+ALR"4X0$@@N*S +M((3AL##6X?PPP^.P,,;A0&"%XA@PH.,4,(KE+0V$X@P`@.+^___K`!"@X08` +MH.$"(*#C_O__ZQ0PFN4",(/B%#"*Y3`0C>(#(*#CLB!AX4(`A>("(*#C_O__ +MZQ0PFN4",(/B"B"@X10PHN4(((WEW"J4Y0@PG>4`,(WE1`"%X@<0H.&N/H3B +M_O__ZP!PH.$T.]3E``!3X\T``!H:``#J!C"$X#0[T^4``%/C!```"@8PP>4'`*#A`1"@XP@@ +MH.,%,*#A_O__ZP@PG>4`,(WE,A"@XP@@1N((,(7B_O__ZP"PH.$(``#J`&"@ +MXP@@G>4`((WE!P"@X0$0H.,&(*#A&#"-XO[__^L`L*#AM6Z$X@A@AN(H<(WB +M2#N4Y08`H.$P$*#C!R"@X0PP0^+^___K`%!0X@<```H(,)WE`#"-Y0L`H.$P +M$*#C*""=Y0(PA>+^___K`+"@X=`TE.4!`%/C1```&D@[E.4&`*#A+1"@XP<@ +MH.$,,$/B_O__ZP!04.(\```*!`"@X?[__^L``%#C.```&JD.A.(*`(#B`A"% +MXB`@H./^___KX3T"XP,PU.<``%/CFCH``[,@E`%"(,(#LR"$`9HZ`!.S()01 +M`B""$[,@A!&:.@#CLR"4X0P@@N.S((3A!`"@X1,0H.,G((WB#XP_@H.$# +M\)3G)U#=Y0,`5>,)```:FCH`X[,@E.$!+(+CLR"$X:D.A.(-`(#BH!&?Y1`@ +MH./^___K"```ZIHZ`..S()3A`BR"X[,@A.&I#H3B#0"`XGP1G^40(*#C_O__ +MZP@@G>4`((WE"P"@X2T0H.,H()WEJ3Z$X@HP@^+^___K`+"@X4@[E.4,`%/C +M.0``FBV-A.(,@(CB#&"@XP`P`.,`,$#CA""#XA`@C>4$D*#CC""#X@P@C>6( +M,(/B%#"-Y01PH.$&4(C@`##5Y=T`4^,A```:`D"%X@0`H.$0$)WE"2"@X?[_ +M_^L``%#C"P``&@0`H.$4$)WE"2"@X?[__^L``%#C!0``&@0`H.$,$)WE"2"@ +MX?[__^L``%#C#@``"@0`H.$,$)WE"2"@X?[__^L``%#C#C"@$P$PQ14!(-7E +M"#"=Y0`PC>4+`*#AW1"@XP(PA>+^___K`+"@X0$PU>4",(/B`V"&X$@[E^4& +M`%/AT___B@=`H.%N.M3E!0!3XP<``!H(()WE`""-Y0L`H.'=$*#C!B"@XP`P +M`.,`,$#C_O__ZQ0PFN48,(KE!`"@X0H0H.'^___K`P``ZC`0C>(8,&'E`6"@ +MXR[__^HTT(WB\(^]Z)`$``"@!```<$`MZ0!0H.%)38#B/$"$X@0`H.'^___K +MP#F5Y0,\P^,).X/CP#F%Y04`H.'^___K`#``XP`P0.,`$)/E!`"@X1X0@>+^ +M___K<("]Z/!/+>DDT$WB`$"@X0)PH.$#H*#AOA#-X0```.,``$#C[!.?Y?[_ +M_^M.#83B.`"`XO[__^L`8%#B\P``"@0`H.$($(;B_O__ZVP`EN4`$*#C:""@ +MX_[__^ML4);E*("%X@B0H.$`,*#C`##(Y0$PR.4L`(7BX!"'X@8@H./^___K +M,@"%XLL=A.(A$('B!B"@X_[__^NM#H3B_O__ZP`0H.$X`(7B!B"@X_[__^N^ +M(_7AG#<`X[,0E.$/(`+B`2*"X;`@Q>&S()3A`2""XK,@A.$P`%KC$`!:$\L` +M`!HMO83B#+"+X@`PV.4!(-CE`C2#X?PPP^,#H(KA>J#_Y@"@R.4JI*#A`:#( +MY1@0H..R$<;A%#"6Y1@P@^(&H*#A%#"JY1B`B.(+`*#A_O__ZR!0C>*P`-#A +ML@!EX0@`H.$"$*#C!2"@X0HPH.'^___K`A"@XPX@C>(*,*#A_O__Z[0]U^$# +M.8/COC'-X0(0H.,%(*#A"C"@X?[__^L`4*#A0"&7Y0@`4N,%``"*`*"-Y0$0 +MH.,3/H?B_O__ZP@`C>4+``#J`*"-Y0$0H.,((*#C$SZ'XO[__^M`(9?E`*"- +MY3(0H.,(($+B3C^'XO[__^L(`(WES#:7Y0(+$^,V```*T#24Y0``4^,S```* +M(%"-X@`PH.,(,"7E#("+XD@[E.4(`*#A+1"@XP4@H.$,,$/B_O__ZP"04.(/ +M```*&""=Y0``4N,,```*"`"=Y0D0H.$"((+B_O__ZQ@PG>4"((/B"!"=Y0(0 +M@>`($(WE%""6Y0(P@^`",(/B%#"&Y4@[E.4(`*#A/1"@XP4@H.$,,$/B_O__ +MZP!04.(/```*&""=Y0``4N,,```*"`"=Y040H.$"((+B_O__ZQ@PG>4"((/B +M"!"=Y0(0@>`($(WE%""6Y0(P@^`",(/B%#"&Y#^___K`%!0 +MXA<```H"`(7B"1"@X0L@H.'^___K``!0XRX```H(`)WE!1"@X1A0G>4"((7B +M_O__ZQ@PG>4"((/B"!"=Y0(0@>`($(WE%""6Y0(P@^`",(/B%#"&Y0(``.H" +M,(/B`U"%X-W__^IN.M3E!0!3XP<``!H`H(WE"`"=Y=T0H.,&(*#C`#``XP`P +M0./^___K"`"-Y7@7E.4``%'C"```"H0GE.4``%+C!0``"@@`G>7^___K%""6 +MY80WE.4#,(+@%#"&Y10PEN48,(;E!`"@X080H.'^___K`P``ZA@PG>4``%/C +MW/__&M[__^HDT(WB\(^]Z"`4```P%```\$\MZ1303>(`0*#A`8"@X0*@H.%. +M#8#B.`"`XO[__^L`8%#BN@``"@0`H.$($(;B_O__ZVP`EN4`$*#C:""@X_[_ +M_^MLD);E"7"@X0`PH.,H,.?E`3#'Y0D@H.&^$_+AG#<`X[,`E.$/$`'B`!*! +MX;`0PN&S()3A`2""XK,@A.&P,-?A_###X[`P@^.P,,?A0)")XA@PH.,4,(;E +M``!8XS@```H$`(?BX!"(X@8@H./^___KRUV$XB%0A>(*`(?B!1"@X08@H./^ +M___K$`"'X@40H.$&(*#C_O__ZT2VF.5[L/_F"S"@X;JPS>$``%KC`+"@$PLP +MH!&Z,,T1`0``&@"P6^(!L*`3"G"-XA10AN()`*#A`A"@XP<@H.$%,*#A_O__ +MZT`VF.6Z,,WA`A"@XP<@H.$%,*#A_O__Z[J@S>$"$*#C!R"@X04PH.'^___K +M`'"@X4`VF.4"`%/C9```&M`PF.6C-!O@80``"@!0C>40$*#C@""@XQD]B.(( +M,(/B_O__ZUH``.JM7H3B!0"@X?[__^L`$*#A!`"'X@8@H./^___K"@"'XLL= +MA.(A$('B!B"@X_[__^L%`*#A_O__ZP`0H.$0`(?B!B"@X_[__^O4N93E`0!; +MXP"PH!,!L*`#NK#-X=`YE.4#`%/C$```&L`YE.6C-!O@#0``"N0YE.7@&93E +M`1^#X1`@C>($$"+E`3"#XN0YA.4)`*#A!!"@XQ0PAN+^___K`)"@X00PH.,> +M,,;E"H"-XA10AN()`*#A`A"@XP@@H.$%,*#A_O__Z]`YE.6Z,,WA`A"@XP@@ +MH.$%,*#A_O__Z[J@S>$"$*#C"""@X04PH.'^___K`("@X=`YE.4#`%/C&0`` +M&L`YE.6C-!O@%@``"@!0C>40$*#C@""@XYX^A.((,(/B_O__ZP`PU^4!(-?E +M`C2#X0$Y@^-S,/_F`##'Y2,TH.$!,,?E&#"@X[(QQN$!,*#C'3#&Y00PH.,? +M,,;E%#"6Y00P@^(4,(;E%#"6Y1@PAN4$`*#A!A"@X?[__^L$`*#A!A"@X?[_ +M_^L4T(WB\(^]Z!!`+>D`0*#AP#F0Y0$,$^,'```*_`"?Y?[__^L`,*#CP#F$ +MY00`H.$"$.#C_O__ZQ"`O>@"#!/C'P``"L0YD.4!,(/BQ#F`Y0(`4^,+``": +MU#F0Y0,`4^,$```*`#"@X\`Y@.4`$.#C_O__ZQ"`O>@!,*#CU#F`Y0`PH./$ +M.8#EE`"?Y?[__^L!,*#CT#F$Y00`H.$`$*#C`2"@X?[__^MX,)_E`!"3Y4D- +MA.(\`(#B'A"!XO[__^L0@+WH`@H3XQ"`O0C(.9#E`3"#XL@Y@.4"`%/C!``` +MF@`PH./`.8#E`1#@X_[__^L0@+WH,`"?Y?[__^L$`*#A_O__ZQPPG^4`$)/E +M20V$XCP`@.(>$('B_O__ZQ"`O>B0$```O!````````#H$```<$`MZ0!`H.%) +M78#B/%"%X@4`H.'^___KP#F4Y0$\P^,"/(/CP#F$Y0$PH./0.83E`""@X\0I +MA.7(*83ES"F$Y00`H.$"$*#A_O__ZP`P`.,`,$#C`!"3Y04`H.$>$('B_O__ +MZW"`O>CP02WI"-!-X@!PH.%P0)'E:("1Y,=```:U#F7 +MY0$`4^,?```:'@"$XA`0H.,$((WB'C!(XO[__^L`0%#B'@``"IX.A^((`(#B +M`A"$X@0@G>7^___K`S"@X]`YA^4'`*#A`!"@XP$@H.'^___K`#``XP`P0.,` +M$)/E20V'XCP`@.(>$('B_O__ZP$`H.,+``#J!`!5XP@``!K4.9?E`0!3XP4` +M`!H'`*#A_O__ZP$`H.,"``#J`0"@XP```.H``*#C"-"-XO"!O>@8$0``\$4M +MZ2S03>(`0*#A`5"@X0`PH.,4,(WE##"-XNPAG^4#`)+H!`"#Y+`0P^%.#83B +M.`"`XO[__^L`8%#B<0``"@0`H.$($(;B_O__ZVP`EN4`$*#C:""@X_[__^ML +M<);E*'"'X@>`H.'+K83B(:"*X@`PH.,`,,?E`3#'Y0,`5>$-```:K5Z$X@4` +MH.'^___K`!"@X00`A^(&(*#C_O__ZP4`H.'^___K`!"@X1``A^(&(*#C_O__ +MZP@``.H,4(WB!`"'X@40H.$&(*#C_O__ZQ``A^(%$*#A!B"@X_[__^L*`(CB +M"A"@X08@H./^___KMB'XX9PW`..S$)3A#R`"X@$B@N&P(,CALR"4X0$@@N*S +M((3AL##7X?PPP^-`,(/CN#''X`90H.$8,*#C%#"EY9@IE.4`4(WE!P"@X0`0 +MH..9/H3B##"#XO[__^L`<*#A!`"@X1@0C>(4((WB_O__ZQ0@G>4(`%+C#@`` +MVAB`C>(`4(WE!P"@X0$0H.,((*#C"#"@X?[__^L`4(WE,A"@XQ10G>4(($7B +M"#"(XO[__^L`4*#A!0``Z@!0C>4'`*#A`1"@XQ@PC>+^___K`%"@X4PGE.4! +M$$+B_C$`XP,`4>$'``"*!0"@X14=A.(+$('B_O__ZQ0@EN5,-Y3E`S""X!0P +MAN44,);E&#"&Y00`H.$&$*#A_O__ZRS0C>+PA;WH.!0``/A/+>D`4*#A_O__ +MZP``4.-X```*4S8#XP,PU><``%/C`0``"@4`H.'^___KK6Z%X@1@AN)7#87B +M&`"`X@80H.'^___K`$!0XOB/O0A:/Z#C%2Z@XP,`E.<"$)3G`0!0X3D``!H$ +M$*#C`B"$X`,PA.`!`)/G`3"2YP,`4.$R```:M#(!XP,PE>76/:#C`S"5YP``4^,!```*!0"@X3/_+^$%`*#A`!"@X_[__^L%`*#A +M`!"@X_[__^L%`*#A`!"@X_[__^NT,@'C`R"5YP$@@N(#((7G`2"@X[`R`>,# +M((7G%```Z@!`H..T,@'C`T"%YX`!G^7^___K!0"@X080H.'_+P_C_O__Z\Q) +MA>7XC[WH`""@X[0R`>,#((7G%3Z@X],`A.%:/Z#C\P"$X0$@H..P,@'C`R"% +MY\PYE>4!((/BS"F%Y0``4^,$```:(#0!X],`A>$X-`'C\P"%X?B/O>@/`!+C +M^(^]&#@T`>,@)`'C`P"5YP(0E>/S`(7A^(^]Z`4` +MH.'^___K``!0X_B/O0CI3H7B27V%XA!PA^(`H*#C%8Z@XP20H./_OP_C`#"4 +MY0$`4^,9```:!&`4Y0``5N,6```*!#"4Y0@@EN<#`%+A#P``&@@PAN`),)/G +M"@!3X0L``!H(,)3E`@!3XP$P@Y((,(25"0``F@B@A.4`H(3E!0"@X>`0AN(+ +M(*#A_O__ZP(``.H(H(3E"#"6YP0PA.4@0(3B!P!4X=___QH!(*#CL#(!XP,@ +MA>?XC[WH-!$``'!`+>D(T$WB`$"@X9`YD.6#((/@`B&`X'HN@N($4-+E"&"2 +MY0``5>,A```*``!3XP0``!H%$*#A`""@XP(PH.'^___K`0``Z@40H.'^___K +ME#F4Y0$`4^,!`%8#!0``&@0`H.$!$*#C_O__ZP0`H.$!$*#C_O__ZP`P`.,` +M,$#C`#"3Y:PB`>.R()3A9!"@XY$"`>#3+03C8B!!XY(!@>!)#83B#`"`XB$3 +M@^#^___K/```ZC`U`^,/X*#A`_"4YP``4.,.```*`#"@XXPYA.4`,.#CD#F$ +MY:PR`>,R(*#CLR"$X0`P`.,`,$#C`!"3Y4D-A.(,`(#B!1"!XO[__^LH``#J +M!#"@XX@YA.4$`*#AGA?4Y:`GU.6?-]3E_O__ZP@@C>(`,*#C`3!BY00`H.$+ +M$*#C%#4#XP_@H.$#\)3GP!G4Y00`H.$#$`'B_O__ZP0`H.'^___K!`"@X?[_ +M_^L!`%#C`@``&@0`H.$`$*#C_O__ZP0`H.'^___KK#(!XV0`H..S`(3A`#"@ +MXX@YA.4$`*#A9O3_ZP0`H.%D]/_K!`"@X6+T_^L(T(WB<("]Z#!`+>D,T$WB +M`$"@X8@YD.4``%/C*@``&@%0H.$!,*#CB#F`Y0`PH..,.8#ED#F`Y0@@D>4# +M`%+A!```"ID.@.(,`(#B#!"!XO[__^L$``#JF0Z`X@P`@.(`$*#C(2"@X_[_ +M_^L(,)7EF#F$Y0`PE>64.83E!`"@X?[__^L!`%#C#P``&@(PH..(.83E!`"@ +MX0$0H./^___K!`"@X0$0H./^___K`#``XP`P0.,`$)/E20V$X@P`@.(%$('B +M_O__ZQ@``.J(.93E`3!#X@$`4^,2``"*!`"@X?[__^L$`*#A`!"@XP$@H.'^ +M___K!`"@X0`0H./^___K"""-X@$PH.,!,&+E!`"@X0L0H.,4-0/C#^"@X0/P +ME.<#,*#CB#F$Y00`H.'^___K``"@XPS0C>(P@+WH\$\MZ1S03>(`0*#A`8"@ +MX4X-@.(X`(#B_O__ZP!@4.(#```:3`.?Y4P3G^7^___KS@``Z@0`H.$($(;B +M_O__ZVP`EN4`$*#C:""@X_[__^ML<);E!U"@X0`PH.,H,.7E`3#%Y2P`A^(( +M$*#A!B"@X_[__^LR`(?BRQV$XB$0@>(&(*#C_O__ZS@`A^*M'H3B!!"!X@8@ +MH./^___KOB/WX9PW`..S$)3A#R`"X@$B@N&P(,?ALR"4X0$@@N*S((3A`##5 +MY0$@U>4"-(/A_###XP,XH.$C.*#A4#"#XP`PQ>4C-*#A`3#%Y1@PH..R,<;A +M%#"&Y4@;E.4##%'CFP``B@-PA>#`.93E`S`#X@,`4^-"```:+0V$X@P`@.(` +M(*#C%#"-XO[__^MT-Y3E`)"@X0``4^,``%`3+@``"A2`G>4``%CC*P``"BT= +MA.(,$('B`*!AX$B[E.4+L&K@"[!HX`<`H.$*(*#A_O__ZPIPA^`4,);E"C"# +MX!0PAN5T-Y3E`2#3Y10@C>4"((+B"C""X`,,4^,)``"*!P"@X707E.7^___K +M%#"=Y0(@@^("<(?@%""6Y0(P@^`",(/B%#"&Y110G>4"4(7B"J"%X`N@BN`# +M#%KC8```B@<`H.$($(G@"R"@X?[__^L4,);E"["#X!2PAN58``#J!P"@X2T= +MA.(,$('B2"N4Y?[__^L4();E2#N4Y0,P@N`4,(;E3@``Z@B`A^(@,*#C%#"& +MY2U=A.(,4(7B!0"@X?[__^L`$*#A"`"@X0(@H./^___K"H"'XA0PEN4",(/B +M%#"&Y04`H.'^___K`!"@X0@`H.$"(*#C_O__ZQ0PEN4",(/B!E"@X10PI>7< +M*I3E`%"-Y0P`A^(`$*#CKCZ$XO[__^L`H*#ALWZ$X@1PA^('`*#A_O__ZP"` +MH.$`4(WE"@"@X0$0H.,(`%CC"""@,0@@H",',*#A_O__ZP!0C>4#$*#C`2"@ +MX[$^A.(,,(/B_O__ZP!PH.'`.93E`S`#X@$`4^,-```:`""@XQ,@S>48,(WB +M#"`CY0!0C>4&$*#C`B"@X_[__^L`4(WE*A"@XP$@H.,3,(WB_O__ZP!PH.$( +M`%CC!@``F@!0C>4'`*#A,A"@XP@@2.*S/H3B##"#XO[__^L4,);E&#"&Y00` +MH.$&$*#A_O__ZQS0C>+PC[WH7!$``$`4``#P0"WI#-!-X@!`H.%P8)'E:%"1 +MY6PPD.4(`!/C)0``&@$`$^,!```:4``3XR$```H8`(;B`!"@XP0@C>(8,$7B +M_O__ZP!P4.(:```*!%"=Y0``5>,%```*`@"'XJX>A.+<*I3E_O__ZP``4.,1 +M```*L"#6X0$,$N,",*`3`#"@`](DX.<",(/A`0!3XQ!@A@($```*"F"&,@(` +M`#H"`%/C&&"&$@I@A@($`*#A!A"@X0`@H./^___K`0"@XPS0C>+P@+WH\$4M +MZ1S03>(`4*#A$#"-XIPBG^4#`)+H!`"#Y+`0P^%.#87B.`"`XO[__^L`0%#B +M`P``&GP"G^5\$I_E_O__ZYD``.K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($ +M((/E!0"@X0@0A.+^___K$#"@XU(A$('B!B"@ +MX_[__^NM#H7B_O__ZP`0H.$X`(?B!B"@X_[__^L',*#AOB/SX0\@`N*P(,/A +ML##6X?PPP^.`,(/CL##&X4!PA^(8,*#C%#"$Y<`YE>4#,`/B`P!3XPD``!H' +M`*#A+1V%X@P0@>)(*Y7E_O__ZQ0@E.5(.Y7E`S""X!0PA.5(``#J"("'XB`P +MH.,4,(3E+6V%X@Q@AN(&`*#A_O__ZP`0H.$(`*#A`B"@X_[__^L*@(?B%#"4 +MY0(P@^(4,(3E!@"@X?[__^L`$*#A"`"@X0(@H./^___K%#"4Y0(P@^($8*#A +M%#"FY=PJE>4`8(WE#`"'X@`0H..N/H7B_O__ZP"@H.&S?H7B!'"'X@<`H.'^ +M___K`("@X0!@C>4*`*#A`1"@XP@`6.,((*`Q"""@(P48,(WB$"`CY0!@C>4&$*#C`B"@ +MX_[__^L`8(WE*A"@XP$@H.,/,(WB_O__ZP!PH.$(`%CC!0``F@!@C>4R$*#C +M""!(XK,^A>(,,(/B_O__ZP`PH..(-\7E#2"@X7\]PN,_,,/C!""3Y0$@0N($ +M((/E_O__ZQ0PE.4@((/B`@Q2XP(``)HH`)_E_O__ZP,``.H8,(3E!0"@X000 +MH.'^___K'-"-XO"%O>A0%```7!$``%@4``!X$0``\$4MZ0S03>(`0*#A`&"@ +MXPAPC>(!8&?E&(4#XQ*@H.,$`*#A_O__ZP0`H.$*$*#A!R"@X0_@H.$(\)3G +M!U#=Y0``5>,#```:`6"&XF4`5N/R__\:!0``ZF0`5N,#```:%`"?Y?[__^L` +M`*#C````Z@$`H.,,T(WB\(6]Z)`1``#P1RWI$-!-X@!`H.'+^___K``!0XP$@H`-+/:`#`R#$ +M!\0TE.4``%/C`3"@$W$ZQ!70-)3E``!3XP$PH!-Q.L05=#K$%=@PE.4!`%/C +M`0``"@0`H.'^___K!`"@X0,0H./^___K%&4#XP0`H.$#$*#CX""$X@_@H.$& +M\)3G$%"-XA4$`*#A'1"@ +MXP4@H.$/X*#A!O"4YT0T"N,(,(WE!`"@X1X0H.,%(*#A#^"@X0;PE.>H-P'C +M`S"4YP(`4^/,,*`#SS"@$Q`@C>(!,&+E!`"@X1$0H.,/X*#A!O"4YP0`H.$- +M$*#C#""-X@_@H.$&\)3GV#"4Y0$`4^,#```*!`"@X0<0H.,!(*#C_O__ZU0Q +ME.59#X3B/1"@XP0@C>(,,$/B_O__ZP!@4.(5```*!%"=Y0``5>,2```*X3T" +MXP,PU.<``%/C#@``"@,PUN4$`!/C"P``"@,P`^(!($/B`@!2XP!0H(,!8*"# +M`3!#D@`@`),`($"3`R""D)AETI6<5=*5`0``Z@!0H.,%8*#A!`"@X0<0H.$% +M(*#A!C"@X?[__^L```#C``!`XP<0H.$&(*#A!3"@X?[__^N>=\3EGV?$Y:!7 +MQ.7(,)3EH3?$Y0@`H.$*$*#AW""4Y?[__^M+/:#C`S#4YP$`4^,*```:!`"@ +MX040H.,`(*#C`C"@X?[__^L$`*#A_O__ZP``4.,!```:9`&?Y?[__^L$`*#A +M_O__ZP"`4.)/```*`!"@X]00B.4!8*#CV&"(Y=P0B.7X%8CEZ!"(Y14.B.(X +M(*#C_O__ZP5=A.(%`*#A_O__ZP!PH.$%`*#A!Q"@X08@H.'^___K$PZ(X@40 +MH.$'(*#A_O__ZT!QB.4``%?C"@``V@A0H.$`8*#C,`'5Y0``4.,!```*?P`` +MXO[__^L!8(;B`5"%X@8`5^'V___**`&4Y0X`4.,5;J"##V"@DPX`4.,$`*"# +M`0"@D_[__^L`H*#A!@"@X?[__^L`D*#AV%#8Y1]0!>*`<(7C"EZ&X0```.,` +M`$#C!1"@X0<@H.'^___K!`"@X040H.$'(*#A+#4#XP_@H.$#\)3G3J'(Y3^0 +M">)/D]Z,`1``#X3RWI +M`'"@X?[__^L``%#C`P``&A`!G^7^___K!`"@X_B/O>@'`*#A_O__ZP!@4.([ +M```*GC4`4(/E`$"$Y01`A.7,,);E`3!#XLPPAN4``%/C +M5(#$%0LPH`%4,,0%5H#$Y0<`H.$$$*#A#^"@X0GPE^C`$0``,$`MZ0S03>(`0*#A`5"@ +MX0```.,``$#CP!"?Y?[__^O`.93E`R`#X@$`4N,=```:`0D3XQ,``!H$`*#A +M>1Z$XO[__^L$`*#A_O__ZP``4.,)```:V#"5Y8,RA.`Y/8/B"#"#X@`@H.,( +M((/EP#F4Y0$P(^+`.83E%@``ZL`YE.4!.8/CP#F$Y0@@C>(",*#C`3!BY00` +MH.$,$*#C%#4#XP_@H.$#\)3GV#"5Y8,RA.!,7H/E!`"@X=@0E>7^___K!`"@ +MX040H.&A[?_K`2"@X[`R`>,#((3G#-"-XC"`O>AP%```,$`MZ0S03>(`0*#A +MK5Z`XAP[D.6>-\#E!0"@X?[__^MJ.@#CLP"$X00`H.'^___K!0"@X?[__^L` +M4*#A!`"@X040H.'^___K`@`5XS$```H(((WB,##@XP$P8N4$`*#A$1"@XQ0U +M`^,/X*#A`_"4YP0`H.&>%]3E`""@XP(PH.'^___K!`"@X?[__^L!$*#CP!F$ +MY00`H.'^___K!`"@X?[__^L``%#C!0``&@0`H.$`$.#C_O__ZP`PH./`.83E +M%P``ZA15`^,$`*#A`Q"@XZDMA.(H((+B#^"@X07PE.<(((WB`#"@XP(P8N4$ +M`*#A#!"@XP_@H.$%\)3G!`"@X0$0H./^___KP#F4Y0$Y@^/`.83E`@``Z@P` +MG^4%$*#A_O__ZPS0C>(P@+WH'!(``'!`+>D`0*#A`6"@X6`PD>4$`%/C*@`` +M"@``4^,H```:_O__ZP!0H..P,@'C`U"$YY]7Q.6@5\3E@``*#C<("] +MZ/!!+>D`4*#A<$"1Y01@H.'+#8#B(0"`X@00A.(&(*#C_O__ZP``4.-H```* +MP#F5Y0,@`^(#`%+C`0``"@$)$^-B```*"G"&XE<-A>(8`(#B!Q"@X?[__^L` +M@%#B6P``"@1@H.$8,/;E`P!3XU<``!IT.M7E``!3XU0```H!,-;E`0!3XQP` +M``H"```Z`@!3XTX``!HM``#J*DV%X@%`A.($`*#A`A"&X@<@H./^___K!0"@ +MX000H.$'(*#A_O__ZW\ZU>4!`%/C!0``&@4`H.$'$*#A`2"@XP`PH./^___K +M.@``Z@4`H.$'$*#A`2"@XR4PH./^___K-```Z@5`UN540>+G!"#6Y0,PUN4" +M-)/A"0``&@$PH.,3-*#ARK5Y00PH.'^___K`0"@X_"!O>B0%```^$\MZ0!PH.%P8)'E:("1Y$``%3C!@``"@P"G^4$$*#A_O__ZP`PH./` +M.8?E`[#@XW@``.JX,=7A;"H`X[(PA^$!"Q/C"3"@$Q0PH`-O.L?EO+'5X0NY +MH.$KN:#A:#H`X[.PA^$>`%CC*```FAY`H..XH9_E!I"@XP10AN``,-7E+0!3 +MXQ$```H"``"**@!3XQD``!H5``#J/0!3XP\```K=`%/C%```&@(`A>(*$*#A +M"2"@X?[__^L``%#C#@``"@<`H.$%$*#A_O__ZPH``.H'`*#A!1"@X?[__^L& +M``#J!P"@X040H.'^___K`@``Z@<`H.$%$*#A_O__ZP$PU>4",(/B`T"$X`0` +M6.'9__^*P#F7Y0(ZP^,!.8/CP#F'Y;,.A^($`(#B`#"@XW_`X.,#$-#G?R`! +MX@(@0N(N`%+C`O&?ES```.H8"`$`(`@!`!@(`0`@"`$`(`@!`"`(`0`@"`$` +M(`@!`"`(`0`8"`$`&`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`(`0`@ +M"`$`(`@!`!@(`0`@"`$`&`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`( +M`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@! +M`"`(`0`@"`$`(`@!`"`(`0`@"`$`&`@!``P0@>$#$,#G`3"#XA``4^/%__\: +M!P"@X0L0H.'^___K`0"@X_B/O>A8$@``L`0``/!/+>G\T$WB`$"@X0$@H.$X +M,(WB:!B?Y0,`D>@$`(/DL!##X7!0DN5H8)+EP#F4Y0,P`^(#`%/C``"@$P8" +M`!JPH-7A_*`:X@2`H`,*@*`3`'!:X@%PH!,8,(CB`P!6X04``"H<")_E!Q"@ +MX08@H.'^___K``"@X_40,(WEX`>?Y>`7G^7^___KT#"9Y0$+$^,!.\,3`CJ#$]`PB14$ +M```:`0D3XP$YPQ,".H,3T#")%<(PV>7C`-GE``"-Y>0`V>4$`(WEY0#9Y0@`C>5$!Y_E +M_O__ZP%@H..O`0#J$&"-Y0@`H.$`$*#C-""-X@8PH.'^___K`&"@X310G>4` +M`%7CI`$`"@(`@.*N'H3BW"J4Y?[__^L``%#C`6"@`P$```H!8';B`&"@,]PZ +ME.4T4)WE`P!5X97^___K`%!0 +MX@,``!JX!I_E_O__ZP%@AN*+`0#J)`"-X@(0A>(T()WE_O__Z_@@C>+$<#+E +M"`"@X3(0H.,0,)WE_O__ZP!04.((```*$`!7XP8``(HD`(WB!P"`X`(0A>(T +M()WE_O__ZS10G>4%<(?@0'&)Y1,.B>(D$(WB!R"@X?[__^L`$*#CT!:)Y=06 +MB>78%HGEW!:)Y>`6B>7D%HGE;CZ)X@@P@^(4,(WE`P"@X2`@H./^___KY#@! +MXP,PE.<"`!/C(@``"I@@G>4``%+C'P``"@`PH.,<,(WE(#"-Y0)PH.&4(,(/B`S"4YR!0G>4#,`7@Y#:)Y0`` +M4N,I8*`#``!3XU$!``HC``#J`0`3XU(!``J0,)WE``!3XT\!``H`,*#C(#"- +MY1PPC>60<)WEE+#=Y0(`1^("$(OB(""-XAPPC>+^___K`0!0XT$!`!H!,*#C +MT#:)Y=0VF>4!,(/CU#:)Y>@X`>,#()3G(%"=Y0(@!>#8)HGE"#"#X@,PE.<< +M4)WE`S`%X.`VB>4``%+C*6"@`P``4^,L`0`*``!6XQ4``%?C#@``&K`PG>4``%/C!0``"KP$G^7^___KS#:9Y0$Z@^/,-HGE"P`` +MZJ@$G^7^___KS#:9Y0(Z@^/,-HGE!0``Z@(@B^(4`)WE`A!'XB``4N,@(*`C +M_O__Z\PVF>4"/,/CS#:)Y0`PH./<,(GE%#?)Y0$@H.,:)\GE&3?)Y1@WR>47 +M-\GE%C?)Y<0TE.4``%/C/P``"OBPC>(`,*#CQ#`KY0APH.'=@*#C!P"@X0@0 +MH.$+(*#A$#"=Y?[__^L`<%#B,P``"@(`A^(X$(WB!B"@X_[__^L``%#C*0`` +M"LPVF>4"/(/CS#:)Y0$PH./<,(GE"##7Y10WR>73(N'G%2?)Y0\P`^(/`%/C +M`3"@$QHWR14`,*`#&C?)!10WV>4/`!/C&P``"@$`$^,#,*`3&3?)%0`PH`,9 +M-\D%%#?9Y0(`$^,#,*`3&#?)%0`PH`,8-\D%%#?9Y00`$^,#,*`3%C?)%0`P +MH`,6-\D%%#?9Y0@`$^,#,*`3%S?)%0`PH`,7-\D%`P``ZC10G>4"4(7B!7"' +MX,3__^IA7HGB`5"%X@4`H.$`$*#C&B"@X_[__^O@,)WE``!3XPH```KD,-WE +M&0!3XP<``)K,-IGE"CR#X\PVB>4%`*#AX!"=Y1H@H./^___K`@``ZLPVF>4" +M.\/CS#:)Y=`TE.4``%/C`P``&LPVF>4""Q/CD```&A,``.K,-IGE`@L3XQ`` +M``KD-IGE"``3XP(``!K@-IGE"``3XPH```K@$-GEX2#9Y>(PV>7C`-GE``"- +MY>0`V>4$`(WEY0#9Y0@`C>6``I_E_O__Z\PFF>4"(8+CS":)Y4`1F>4),*#A +M`%"@XP<``.HP`=/E?P``X@$P@^(6`%#C`B'"P\PFB<4"``#*`5"%X@4`4>'U +M__^*R#8`X[,PF>$@`!/CS#:9%8`P@Q/,-HD5S#:9!8`PPP/,-HD%U!"9Y0`` +M4>,"```*"`*?Y?[__^L<``#J`3"@X]0PB>7%)0#C`A"#X`$1A.`$$)'E``!1 +MXP,```H!,(/BU#")Y2``4^/V__^:H"(%`*#A_O__ZP``4.,%```:.#:9Y30F +MF>4$,(+E`""#Y316B>4X5HGE8EZ)X@Q0A>(%`*#A_O__ZP``4.,%```*&#`0B>+4()GE_O__ZP``6N,&```:!`"@X080H.$) +M(*#A$#"@X_[__^L!`*#C'@``Z@0`H.$&$*#A"2"@X3`PH./^___K`0"@XQ<` +M`.H$`*#A!Q"@X08@H./^___K``"@XQ$``.H!8*#C`#"@X]0PB>4#`%KA!@`` +M&@0`H.$&$*#A"2"@X1`P@^+^___K``"@XP4``.H$`*#A!A"@X0D@H.$P,*#C +M_O__ZP``H./\T(WB\(^]Z"I@H./J___J*&"@X^C__^K,-IGE`SK#X\PVB>71 +M_O_JH!0``'@2``#`"P``J!0``+`2``#T$@``*!,``'`3``#`$P``#!0``!P4 +M```X%```5!0``/!/+>DTT$WB`$"@X7!@D>5H<)'EP#F0Y0,P`^(#`%/C``"@ +M$^L``!K(`Y_E_O__ZPJ@AN*H-P'C`S"4YQPPC>6ZL=;AN)'6X0E0H.&H`Y_E +M"1"@X0L@H.'^___K'!"=Y0(`4>,'```:K#4<$)WE`1!QX@`0H#,@$(WE`3"@X0``6>,`,*`#`3`#$@`` +M4^,&```:`3!YX@`PH#,D,(WE'!"=Y0$`4>,``%D#$0``&@`PVN4!(-KE`""- +MY0(@VN4$((WE`R#:Y0@@C>4$(-KE#""-Y04@VN40((WE``.?Y040H.$<()WE +M_O__ZP"`H.,-4*#CJP``ZE==A.(84(7B!0"@X0H0H.'^___K`(!0XA@``!H` +M$-KE`2#:Y0(PVN4#`-KE``"-Y00`VN4$`(WE!0#:Y0@`C>6H`I_E_O__ZP4` +MH.$*$*#A_O__ZP"`4.(#```:D`*?Y?[__^L14*#CD```Z@$\H./0,(CE`#"@ +MXT`VB.4+``#J8EZ(X@Q0A>(%`*#A_O__ZP``4.,%```:,#:8Y2PFF.4$,(+E +M`""#Y2Q6B.4P5HCE8UZ(X@10A>(%`*#A_O__ZP``4.,#```*!0"@X1<4"`%'C`3"# +M`P``4^,/```*`0!2XP@``!K0,)CE`3S#XP$[@^/0,(CE%#4``%7C`P``&B@!G^7^___K#U"@ +MXR0``.H"`(;B&1V(X@@0@>*`(*#C_O__ZP``4.,'```*T#"8Y0(\P^,!.X/C +MT#"(Y10W`>,#,)3G/#:(Y0@``.K@`)_E_O__ZP]0H.,1``#JU`"?Y0L0H.'^ +M___K#E"@XPP``.H!L(OB0+:(Y00`H.$($*#A`""@X_[__^O0,)CE`0L3XP$` +MH`,`,*`30#:(%0$`H!,2``#J``!8XPL```J(8)_E"("&X@@`H.$`$*#C*"<` +MX_[__^L",*#C2#:&Y>@`AN(*$*#A!B"@X_[__^L$`*#A"!"@X04@H.'^___K +M``"@XS30C>+PC[WH`3!YX@`PH#,D,(WE`!"@XR`0C>5&___JB!0``)04``"L +M%```_!0``#05``!H%0``J!4``.@5```,%@``/!8``&@6```(#```\$:Z$XL`IE.4!#!+C"@``"A@`AN(8$$?B +M_O__ZVX*Q.4*`*#A!A"@X0<@H.'^___K!`"@X?[__^M:``#J5UV$XAA0A>+` +M&93E`S`$XP`P0.,#,`'@`A`$XP$`4^$9```:!0"@X0H0AN+^___K`%!0XDP` +M``H5/J#CTP"%X0\@H.,`,*#C`"`"X`$P`^`#$)+A!```&@0`H.$&$*#A!R"@ +MX04PH.'^___K%3Z@X]-@A>$!`*#C`!"@XP8`D.`'$*'@\P"%X3<``.H#(`+B +M`0!2XS0``!H*@(;B!0"@X0@0H.'^___K`%!0XA0```H5/J#CTP"%X0\@H.,` +M,*#C`"`"X`$P`^`#$)+A!```&@0`H.$&$*#A!R"@X04PH.'^___K%3Z@X]-@ +MA>$!`*#C`!"@XP8`D.`'$*'@\P"%X1D``.H$`*#A_O__ZP!0H.$@`%#C%``` +M"@0`H.$D$(;B)"!'X@4PH.'^___K``!0XP4``!J%,H3@.3V#X@@P@^(`(*#C +M"""#Y0<``.H*`*#A!A"@X0<@H.'^___K!`"@X0@0H.$%(*#A_O__ZP$`H./P +MA[WH\$`MZ0S03>(`8*#A`5"@X0TPH.%P(9_E`P"2Z`0`@^2P$,/A<$"5Y01P +MH.&P,-3A#``3XU(``!H$0(3B!`"@X.3_ZVPPEN40`!/C`@``"@8`H.$%$*#A_O__ZPS0C>+P@+WHM!0``+@$ +M``#P02WI(-!-X@!`H.%Y?H#B!P"@X0`0H.,X*P#C_O__ZY!'A.40P(WB3#&? +MY0\`D^@'`*SH`##,Y0TPH.$`4*#C!%"#Y`10@^0$4(/D`%##Y0%@H.,!8,WE +M`H"@XP*`S>4#,*#C`S#-Y0`PX.,$,,WE"`"'X@40H.'^___KG#<`X[-0A.%! +M.@+C`S#4YYXWQ.6?5\3EH%?$Y;0R`>,#4(3G0CH"XP,PU.>A-\3EEPZ$X@D` +M@.(0$(WB#2"@X_[__^N6#H3B#`"`X@T0H.$-(*#C_O__ZXA9A.60683EC%F$ +MY!9A.7D683EW%F$Y=A9A.6>#H3B +M"`"`X@40H.&`(*#C_O__ZPDPH.-O.L3E<(K$Y7Y:Q.7J/0+C`S#4YW\ZQ.4$ +M`*#A_O__ZP0`H.'^___K!`"@X4D5U.5Z+H3B!"""XC+C_^NB!\3EK#(!XV0@ +MH..S((3AE&?$Y08`H.$@T(WB\(&]Z+P4```$0"WE``!1XQD``-H`,-#E?S`# +MX@0`4^,"`%,3$@``"@L`4^,0```*%@!3XP!`H!,)```:#```Z@0PT.=_,`/B +M!`!3XP(`4Q,'```*"P!3XP4```H6`%/C`P``"@%`A.($`%'A\___R@$``.H! +M`*#C````Z@``H.,0`+WH'O\OX01`+>4``%'C#0``V@!`H.,$,-#G?S`#X@(` +M4^,$`%,3!```"@L`4^,"```*%@!3XP``H!,#```:`4"$X@0`4>'R___*`0"@ +MXQ``O>@>_R_A!$`MY0$`0.)P`._F$P!0XP1`H(,`,`"3`#!`DP!`TY<$`*#A +M$`"]Z![_+^%P0"WI`4"@X0)@H.&>-]#E#@!3XP0``)IT6M#E``!5XQ10H!,$ +M4*`##P``ZG1:T.4``%7C"%"@$P!0H`,!`*#A`A"@X?[__^L!`%#C`5"%`P4` +M``H$`*#A!A"@X?[__^L!`%#C`U"%`P)0A1,%`*#A<("]Z`1`+>5_``#B"P!0 +MXP!`H(,`,`"3`#!`DP``@Y`40-"5!`"@X1``O>@>_R_A\$$MZ0!@H.$!<*#A +M`$"@XP0PAN!L6=/E`C"%XG,P[^8!`%/C!0``F@4`H.'^___K!P!0X0$``!H! +M`*#C\(&]Z`%`A.(-`%3C\/__&@``H./P@;WH\$,,```*_P!5XPT```H%`*#A_O__ +MZP!0H.$(`*#A!1"@X?[__^L!`%#C"5"%`750[P8'4,KG`7"'X@%`A.(&`%3A +M[/__&@<`H.'PA[WH!.`MY0S03>((((WB`3"@XP$P8N45$*#C%#4#XP_@H.$# +M\)#G#-"-X@"`O>@$X"WE#-!-X@@@C>(`,*#C`3!BY140H.,4-0/C#^"@X0/P +MD.<,T(WB`("]Z`3@+>4,T$WB`#"@X0<0S>4!`%+C!0``&A80H.,'((WB%,4# +MXP_@H.$,\)/G!```ZA<0H.,'((WB%,4#XP_@H.$,\)/G#-"-X@"`O>@$X"WE +M#-!-X@@@C>(!$&+E`1"@XQ0U`^,/X*#A`_"0YPS0C>(`@+WH!.`MY0S03>(( +M((WB`1!BY0`0H.,4-0/C#^"@X0/PD.<,T(WB`("]Z!!`+>D,-0/C`S"0YP`` +M4^,0@+T(,_\OX1"`O>@00"WI"#4#XP,PD.<``%/C$("]"#/_+^$0@+WH<$`M +MZ0!`H.$#8*#A`E"@X0``4N,``%,3`0``&O[__^L(``#J`0!2XP,``!H"$('B +M<1#OYO[__^L"``#J`A!!XG$0[^;^___K!`"@X080H.$%(*#A_O__ZW"`O>@! +M`!#C`P"@$]``X`<>_R_A!`"`XA[_+^'`*9#E`S`$XP`P0.,#,`+@`@`$XP`` +M4^$``*`3`0"@`Q[_+^'`*9#E`S`$XP`P0.,#,`+@`0`$XP``4^$``*`3`0"@ +M`Q[_+^&0/I#E`0!3XPD```H`,*#C`R"`X+`NDN4!`%+C!```"B`P@^(Z#E/C +M^/__&@$`H.,>_R_A``"@XQ[_+^$``:#A;S(!$&+E&!"@XQ0U`^,/X*#A`_"0YPS0 +MC>(`@+WH$$`MZ1D0H.,`(*#C%#4#XP_@H.$#\)#G$("]Z/!/+>D4T$WB`'"@ +MX00@C>4#8*#A@1&@X0`0C>4%4('B!$"@XQ2E`^,(D(WB&K"@XP$``.H!0$3B +M`5!%X@&`E.("```*`0!8XR```!H/``#J`##6Y00`G>4#.(#A`2#6Y0(\@^$( +M,(WE`""=Y0*`B.`,@(WE!P"@X1H0H.,(((WB%#4#XP_@H.$#\)?G)```Z@,@ +MUN4$,-;E`SB@X0(T@^$"(-;E`C"#X04@UN4"/(/A"#"-Y0Q0C>4'`*#A"Q"@ +MX0D@H.$/X*#A"O"7Y]C__^H!@$3B"(&@X3@`G>4(,(#@`1#3Y0(@T^4"**#A +M`22"X0@0T.4DT$WB`""@XQ@@S>49(,WE&B#-Y1L@ +MS>4<(,WE'2#-Y0@PC>($((/D!""#Y`0@@^0`((/E"#"-X@`PC>48,(WB_O__ +MZR30C>(`@+WH!$`MY9`^D.4``%/C`D"@`P0```KK/H#B`T"@XP`@D^4``%+C +M!@``&H0R@.`!(*#C4"Z#Y>4.@^(`,*#C"#"`Y0,``.H!0(3B(#"#XB``5./Q +M__\:!`"@X1``O>@>_R_A\$\MZ0S03>(`4*#A<3K0Y0``4^,[```*H7?0Y0$` +M5^,*<*`#$'"@$RI-@.(*0(3BJ6Z`X@I@AN(4A0/C!*"-XAN0H.,!Q$._F +M`2""X00@C>73,N'G`P!3XP/QGY<:``#JI"$!`+PA`0#4(0$`["$!``4`H.$= +M$*#C"B"@X0_@H.$(\)7G$```Z@4`H.$>$*#C"B"@X0_@H.$(\)7G"@``Z@4` +MH.$+$*#A"B"@X0_@H.$(\)7G!```Z@4`H.$)$*#A"B"@X0_@H.$(\)7G!$"$ +MX@8`5.'/__\:#-"-XO"/O>CP0"WI#-!-X@!@H.'0-)#E``!3XSX```H!,*#C +M=3K`Y0$PT>4``%/C'0``"JD^@.(*,(/B`$"@XP(`5.,%```*!""!X`(`TN4` +M(-/E`B``X``@P^4-``#JG%K6Y00@T>4#<`7B`^`"X@X`5^$.<*#!`W`%TAS` +M!>(<``+B``!4$`%+AY/__ +MB@8`H.$3$*#C!R"-XA@U`^,/X*#A`_"6YZENAN(-8(;B`$"@XP```.,``$#C +M`!``XP`00.,',-WE``!3XP,`4Q,$(-$'`##6!0,P`@``,,8%!"#0%P`PUA4# +M,`(0`##&%0%`A.(!8(;B$`!4X_#__QH,T(WB\("]Z$8Z`N,#,-#G``!3XP`P +MH`--,<$%3#'!!1[_+P$!`%/C"@``&D_R_A4>_R_A!$`MY7\``.($`$#B:`!0XP#QGY=J``#JZ"4!`)@E +M`0"8)0$`F"4!`)@E`0"8)0$`F"4!`.`E`0#0)0$`F"4!`)@E`0"8)0$`F"4! +M`)@E`0#()0$`F"4!`)@E`0"8)0$`V"4!`)@E`0#`)0$`F"4!`)@E`0"8)0$` +MF"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"X)0$`F"4!`)@E`0"8 +M)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"P)0$`F"4!`)@E +M`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4! +M`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"H)0$` +MF"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8 +M)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E +M`0"@)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4! +M`)@E`0"0)0$`"T"@XQ0``.H`0*#C$@``Z@I`H.,0``#J"4"@XPX``.H(0*#C +M#```Z@=`H.,*``#J!D"@XP@``.H%0*#C!@``Z@1`H.,$``#J`T"@XP(``.H" +M0*#C````Z@%`H.,$`*#A$`"]Z![_+^'P02WI`&"@X0T`4>,!4*`Q#5"@(P`` +M5>,`<*`#"@``"@!PH.,'0*#A`8"@XP0`UN>``!#C`0``"O[__^L8<(?A`4"$ +MX@0`5>'W__^*!P"@X?"!O>CP02WI`'"@X0T`4>,!8*`Q#6"@(P``5N,`4*`# +M"```"@!0H.,%0*#A`8"@XP0`U^?^___K&%"%X0%`A.($`%;A^?__B@4`H.'P +M@;WH!"#0Y0,PT.4#-J#A`@J#X1[_+^$$0"WE=#K0Y0``4^,,```*;CK0Y00` +M4^,)```*GS?0Y0$`$^,&0*`3!4"@`P`PT>4!`-'E``2#X5!$H.$!``3B```` +MZ@``H.,0`+WH'O\OX01`+>4"`Q#C&T"@$P,``!H:0*#C`3"@XQ,D$.`!```* +M=$#OY@,``.H!0$3B`0!TX_C__QH`0*#C!`"@X1``O>@>_R_A,``MZ010T.4# +M,-#E!52#X0()%>,/0*`3!@``&@Y`H.-5-*#A`0`3XP(``!H!0$3B`0!TX_G_ +M_QIT`._F,`"]Z![_+^$00"WI)#4#XP_@H.$#\)#G$("]Z!!`+>G^___K$("] +MZ!!`+>G8$)'E_O__ZQ"`O>@00"WI;CK0Y00`4^,(```*!0!3XPT```H#`%/C +M#P``&@$PH.-X.L#E`#"@XWDZP.40@+WH`""@XW@JP.4!,*#C>3K`Y?T0H./^ +M___K$("]Z/T0H.,`(*#C_O__ZQ"`O>@`,*#C>#K`Y0$PH.-Y.L#E$("]Z#!` +M+>D,T$WB`$"@X0%0H.$@`!'C#```"G`ZT.4#`%/C%0``"@@@C>(!,*#C`3!B +MY0,PH.-P.L#E$!"@XQ0U`^,/X*#A`_"4YPL``.IP.M#E`0!3XP@```H(((WB +M`#"@XP$P8N4!,*#C<#K`Y1`0H.,4-0/C#^"@X0/PE.<"`!7C%#"@$V\ZQ!43 +M```:H3?4Y0H`$^,+```*`0L5XP0```IO.M3E"0!3XPDPH!-O.L05"0``ZF\Z +MU.44`%/C%#"@$V\ZQ!4$``#J%``3XPDPH!-O.L05%#"@`V\ZQ`4$`*#A#A"@ +MXZ8NA.(/((+B%#4#XP_@H.$#\)3G#-"-XC"`O>@>_R_A!$`MY1A`@>($,)3E +M`""@XR@;`./Q((#A`,"4Y0P@@N'Q((#A$`"]Z![_+^$00"WI"!"@XP`@H.,4 +M-0/C#^"@X0/PD.<0@+WH$$`MZ2@U`^,/X*#A`_"0YQ"`O>AP0"WI`$"@X0%@ +MH.%7#8#B&`"`X@(0H.'^___K`%!0XG"`O0@!,-;E4S'CYP,R@^`#487@?SK4 +MY0$`4^,`,*`3`3"@`[PQQ>5P@+WH\$4MZ0S03>(`@*#A`5"@X0-`H.$$8(WB +M`G"@X0$`H.$!$*#C!B"@X07^___K!("=Y04`H.$R$*#C!B"@X0($()WE_O__ZP$`H.,,T(WB\(6]Z!!`+>FA-]#E`0`3 +MXP<```J!`H#@Y0Z`X@P`@.(`$`#C`!!`XP0@H./^___K$("]Z($"@.#E#H#B +M#`"`X@@0G^4$(*#C_O__ZQ"`O>AT!0``$$`MZ0$PH.$!(-'E`0!2XQ"`O8@! +M(*#CD4T$WB`&"@X0%P +MH.$$,(WE)(!2XD<```I7O8#B&+"+XJTN@.($((+B`""-Y0!`H.,`,`#C`#!` +MXPPPC>4(0(WE)%"$X@50A^``,-7E*@!3XRT```H]`%/C,0``&@``5>,O```* +M`S#5Y00`$^,`D*`#"*"=!0D```H#,`/B`2!#X@(`4N,`D*"#`:"@@P$P0Y(, +M()V5`S""D""@TY4DD-.5GS?6Y0H`4^$$```:H#?6Y0D`4^$`(*`#@"K&!1@` +M``H!,*#C@#K&Y9^GQN6@E\;E"P"@X0`0G>7^___K`*!0X@\```KX-9KE``!3 +MXY\WUA4,-LH5H#?6%0TVRA4`,*`###;*!0TVR@4%``#J!@"@X040H.'^___K +M!@"@X000G>7^___K`3#5Y0(P@^(#0(3@!`!8X<'__XH4T(WB\(^]Z!!`+>D! +M,*#AT"20Y0``4N,0@+T(`2#1Y18`4N,0@+V(`2"@XW8JP.6K#H#B"@"`X@(0 +M@>(!(-/E_O__ZQ"`O>@00"WIQ#20Y0``4^,`0*`#<4K`!00`H`$0@+T(`4"@ +MXW%*P.4J#8#B"`"`X@@0@>(2(*#C_O__ZP0`H.$0@+WH\$`MZ0S03>(`0*#A +MLUZ`X@10A>(%`*#A_O__ZW8ZU.4``%/C`P``"G4ZU.4``%/C`3"@$W0ZQ!6> +M-]3E#@!3XP0``)IT>M3E``!7XQ1PH!,$<*`#$```ZG1ZU.4``%?C"'"@$P!P +MH`,`8*#A!0"@X080H.'^___K`0!0XP%PAP,%```*!0"@X080H.'^___K`0!0 +MXP-PAP,"<(<30CH"XP,PU.<#<`?@H7?$Y0)P1^)W<._F`0!7XPHZ`).V,,V1 +M#CX`@[8PS8$$`*#A#Q"@XP8@C>(4-0/C#^"@X0/PE.<,T(WB\("]Z/!/+>D< +MT$WB`("@X0%PH.$,`%'C60``F@Q`H.,`H`#C`*!`XPBPBN($,(K@!#"-Y1`P +MBN((,(WE%)"*XA@PBN(,,(WE'#"*XA`PC>4@,(KB%#"-Y01@B.``,-;EW0!3 +MXT$``!H"4(;B!0"@X0L0H.$#(*#C_O__ZP``4.-#```:!0"@X000G>4#(*#C +M_O__ZP``4.,]```:!0"@X0@0G>4#(*#C_O__ZP``4.,Y```:!0"@X0D0H.$# +M(*#C_O__ZP``4.,S```:!0"@X0D0H.$#(*#C_O__ZP``4.,M```:!0"@X0P0 +MG>4#(*#C_O__ZP``4.,#`*`3)P``&@4`H.$0$)WE`R"@X_[__^L``%#C!`"@ +M$R```!H%`*#A%!"=Y0,@H./^___K``!0XP(`H!,9```:!0"@X200BN(#(*#C +M_O__ZP``4.,%`*`3$@``&@4`H.$H$(KB`R"@X_[__^L``%#C!@"@$PL``!H! +M,-;E`C"#X@-`A.`$`%?AM/__BAP`G^7^___K!P"@XP(``.H``*#C````Z@$` +MH.,(/X*#A!?"4Y^$]`N,#,-3G``!3XP@``!H; +M``#J`#"@XW0ZQ.4$`*#AGA?4Y:`GU.6?-]3E_O__ZR0``.J:.@#CLS"4X0(` +M$^,/```*NSK4Y00`$^,,```*`3"@XY\WQ.6[.M3E`S`#X@$`4^,!,*`#H#?$ +M!00```H#`%/C`#"@$Z`WQ!4",*`#H#?$!00`H.&>%]3EH"?4Y9\WU.7^___K +MFCH`X[,PE.%3,>'G>CK$Y0``4^,"```:&`"?Y1@0G^7^___KO#K4Y0,P`^)W +M.L3E#-"-XC"`O>C\%P``]!0``/!/+>D,T$WB`'"@X:T.@.+^___K$``0XS`` +M``I(.Y?E#`!3XRT``)HMC8?B#("(X@Q`H.,`D`#C`)!`XP2@H.,`L`#C`+!` +MXP`P`.,`,$#C!#"-Y01@B.``,-;E,`!3XP\```K=`%/C$P``&@)0AN(%`*#A +M"Q"@X0H@H.'^___K``!0XPP```H,`(7B!!"=Y0H@H.'^___K``!0XP8```H, +M``#J"@"&X@D0H.$*(*#A_O__ZP``4.,&```:`3#6Y0(P@^(#0(3@2#N7Y00` +M4^'?__^*`0``Z@$`H.,```#J``"@XPS0C>+PC[WH$$`MZ0!`H.$9$*#C`""@ +MXQ0U`^,/X*#A`_"0YSD-A.(,`(#B`!"@XP$KH./^___K$("]Z/!`+>D4T$WB +M`%"@X0%PH.$"8*#A#4"@X0T`H.$`$*#C#2"@X_[__^L%`*#A#1"@X?[__^L` +M(*#A``"&Y0<`H.$-$*#A_O__ZQ30C>+P@+WH!.`MY0S03>)\`(#B_O__ZP`0 +MH.$&`(WB`B"@X_[__^NV`-WA#-"-X@"`O>@P0"WI#-!-X@!`H.$R/*#C`S#0 +MYP$`4^$5```*B#4#XP,PD.$(((WB`3!BY3(\H.,#$,#G(A"@XQ0U`^,/X*#A`_"4YP4PU.>` +M,"/B!3#$YPS0C>(P@+WH`0"@XQ[_+^$!`*#C'O\OX0$`H.,>_R_A`0"@XQ[_ +M+^$>_R_A'O\OX1[_+^$>_R_A$$`MZ3@U`^,#,)#G``!3XP%`H`,!```*,_\O +MX0!`H.$$`*#A$("]Z!!`+>D`0*#A````XP``0.,`$`#C`!!`X_[__^L`,*#C +M%##$Y1"`O>@00"WI`$"@X0```.,``$#C)!"?Y?[__^O@,)3E``!3XP$```K4 +M`(3B_O__ZP`PH./@,(3EY#"$Y1"`O>@8%0``$$`MZ1XPH./<,(#E`#``XP`P +M0./@,(#E`#``XP`P0./D,(#EU`"`XO[__^L0@+WH$$`MZ=1`0.(```#C``!` +MXR@0G^7^___KZ##4Y0``4^,0@+T(QCU$XA0P0^(``)/E_O__ZP`PH./H,,3E +M$("]Z#@5```00"WIQTV`XC1`A.($`*#A_O__ZP0`H.'^___K$("]Z'!`+>D` +M0*#AQVV`XC1@AN(&`*#A`1"@X_[__^L`4*#CJ#(#XP-0A.<<,@/C`U"$YR`R +M`^,#4(3G3SH"XP,PU.=4(@/C`C#$YU4B`^,",,3G?2Z@XY@R`^,#((3GG#(# +MXP-0Q.=E,@/C`U#$YV8R`^,#4,3GLS(#XP-0Q.=7,@/C`U#$YTXZ`N,#,-3G +M6"(#XP(PQ.<%,%/@`3"@$U8B`^,",,3G63(#XP-0Q.<,(*#C`3(#XP,@Q.<$ +M,@/C`U#$YP4R`^,#4,3G?R#@XP(R`^,#(,3G`"``XW0R`^,`($#C`R"$YW@R +M`^,#0(3GR0V$XB@`@.(%$*#A!2"@X?[__^O4,@/C`U"$YP8`H.'^___K<("] +MZ!!`+>D`0*#A_O__ZUPR`^,#,)3G`#!CX&,`4^,8``":;#"4Y0$`$^,5```* +M$``3XQ,``!I``!/C$0``&B``$^,/```:9C(#XP,PU.,# +M,)3G`@!3XPD``!H;/*#C`S#4YP``4^,%```:&`"?Y?[__^L``*#C$("]Z``` +MH.,0@+WH`0"@XQ"`O>@@&```,$`MZ0S03>(`0*#A`E"@X0<0S>4*`%'C-0`` +MB@0R`^,#,-#G`0!3X0,``!H%,@/C`S#0YP(`4^$M```*``!1XQ0``!JP`)_E +M_O__ZP4R`^,#4,3G"%"-X@$@=>4!,$/B`R#$YP0`H.$,$*#C_O__ZP0`H.$C +M$*#C!2"@X10U`^,/X*#A`_"4YP`@H.-9,@/C`R#$YQ8``.H$`*#A_O__ZP`` +M4.,2```*4`"?Y?[__^L%,@/C`U#$YP@@C>(!$'+E`3!#X@,0Q.(P@+WH +M2!@``(@8```00"WI5C(#XP,PT.<``%/C$("]"`0R`^,#,-#G``!3XQ"`O0@` +M$*#C`2"@X?[__^L0@+WH\$(`0*#A;#"0Y0$`$^,J```*_O__ZU8R +M`^,#,-3G``!3XR4```H(((WB`3"@XP$P8N4$`*#A)1"@XQ@U`^,/X*#A`_"4 +MYP=0W>4``%7C$@``"AD``.H)`*#A_O__ZP%@5N($```:````XP``0.,`$*#C +M_O__ZQ```.H$`*#A"A"@X0@@H.$/X*#A!_"4YP=0W>4``%7C[O__"@<``.ID +M`*#C_O__ZP]G`N,8=0/C!X"-XB6@H.-DD*#C[O__Z@C0C>+PA[WH$$`MZ0`P +MH.%L()#E`0`2XQ"`O0@""Q+C$("]&!``$N,0@+T80``2XQ"`O1@@`!+C$("] +M&&8B`^,"(-#G`0!2XQ"`O0A6(@/C`B#0YP``4N,0@+T(5R(#XP(@T.D`0*#ALC(#XP,PT.<``%/C#P``"O[__^L`,`#C`#!`XP`P +MD^68(@/C`B"4YV00H..1`@'@TRT$XV(@0>.2`8'@R0V$XB@`@.(A$X/@_O__ +MZQ"`O>AL,)#E$``3XPP``!I``!/C"@``&B``$^,(```:@2@`XP`@0.,"(`/@ +M``!2XP,``!K(-0/C`S"0YP``4^,.```:`#``XP`P0.,`,)/EF"(#XP(@E.=D +M$*#CD0(!X-,M!.-B($'CD@&!X,D-A.(H`(#B(1.#X/[__^L0@+WHJ#(#XP,P +MD.<``%/C$("]&*`R`^,#,)#G``!3XQ"`O1@"(*#CK#(#XP,@@.<`(*#C$#!# +MX@,@P.<0`)_E;!"4Y?[__^L$`*#A_O__ZQ"`O>CX&```<$`MZ0!`H.&@,@/C +M`S"0YP$`4^-P@+T(LC(#XP,PT.<``%/C+0``"O[__^L`4%#B`"``XP`@0.,` +M,`#C`#!`XP,@H!$@`9_E(!&?Y?[__^NH,@/C`S"4YP,`5>$;```*`@!5XPH` +M`!H"(*#CK#(#XP,@A.W+X+B`C"$YP0`H.'^___K!``` +MZ@`@H..L,@/C`R"$YP0`H.'^___KJ#(#XP,@E.<"`%+C`!``XP`00.,`,`#C +M`#!`XP,0H!&D`)_E_O__ZYPR`^,#(-3G`2""X@,@Q.=8,@/C`S#4YP``4^-P +M@+T(J#(#XP,PE.<``%/C<("]&)PR`^,#,-3G`P`3XW"`O1AL()3E@3@`XP`P +M0.,#,`+@``!3XW"`O1@0`!+C<("]&$``$N-P@+T8(``2XW"`O1C(-0/C`S"4 +MYP``4^-P@+T((`"?Y100G^7^___K`B"@XZPR`^,#((3G<("]Z#09``!(%0`` +M5!D``'`9```P`"WI`#``XP`P0.,`$)/E``!1XP`PH-,#0*#1&0``V@`P`.,` +M,$#C!#"3Y0``4^$`,*`#"0``&@,``.J#(87@#""2YP``4N$(```:`"``XP`@ +M0..#(8+@"$"2Y0D``.H`0*#C`%``XP!00.,$P*#C`4"$XG1`[^8$,*#A`0!4 +MX>W__[H`0*#C;`D`XP,`4>$$`*`1,`"]Z![_+^$P`"WI`#``XP`P0.,`$)/E +M``!1XP`PH-,#0*#1&0``V@`P`.,`,$#C"#"3Y0``4^$`,*`#"0``&@,``.J# +M(87@#""2YP``4N$(```:`"``XP`@0..#(8+@!$"2Y0D``.H`0*#C`%``XP!0 +M0.,(P*#C`4"$XG1`[^8$,*#A`0!4X>W__[H`0*#C`P!1X00`H!$!`*`#,`"] +MZ![_+^%P0"WI`%"@X?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4%`*#A +M_O__ZP$`4.,`0*`##P``"@!`E>4,`)3H!#""Y0`@@^4`0(3E!$"$Y1!@E.4` +M`%;C!@``"E(]AN(X,(/B`P!5X=`T`0,#()8'`2!"`@,@A@<-(*#A?SW"XS\P +MP^,$()/E`2!"X@0@@^7^___K!`"@X7"`O>@00"WI_O__ZQ"`O>AP0"WI`$"@ +MX0%@H.$04)#E_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y0P`E.@$,(+E +M`""#Y0!`A.4$0(3E!`"@X080H.'^___K``!5XP8```I2/87B.#"#X@,`5N'0 +M-`$#`R"5!P$@@@(#((4'#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP$` +MH.-P@+WH\$$MZ0C03>(`0*#A$("0Y0``4.,`<*`#<'"0%30PT.4``%/C#``` +M"C`@D.4``%#C"0``"G0PD.4#,&+@=#"`Y7`0D.4!`%/A`C"#,'0P@#5H,)`E +M`R!B(&@@@"4L4)3E*#"4Y0-0A>`%8(?@!@"@X0`0`.,`$$#C!B"@X_[__^L` +M`%#C#0``"@90A>(%4(?@!0"@X8@1G^4"(*#C_O__ZP``4.,%```:!0"@X701 +MG^4"(*#C_O__ZP``4.,%```*!@"@X6`1G^4&(*#C_O__ZP``4.-,```*+""4 +MY2@PE.4#,(+@`6"@XP8@H.,",(/@N";4X0(@8^"V(,WA;""8Y0$($N,:```* +M`W"'X'@@X.,`(,?E$B"@XP$@Q^4``%3C`%"@`P40H`$,```*)#!#XG!0E.4# +M4(7@<%"$Y70@E.4"`%7A!5!C@'!0A(4`4*"#:""4E0(P8Y!H,(25;!"4Y04` +MH.$8(*#C_O__ZQA0A>(0``#JAB"@X0``5.,`4*`##```"@XP0^(",(/@<%"4 +MY0-0A>!P4(3E=""4Y0(`5>$%,&.`<#"$A0!0H(-H()25`C!CD&@PA)4%`*#A +M.!"$X@8@H./^___K!@"%XCX0A.(&(*#C_O__ZP``5N,'```:MC#=X2,DH.$# +M-(+A"!"-XK(P8>$,`(7B`B"@X_[__^L!`*#C"-"-XO"!O>@H()3E+#"4Y0,P +M@N``8*#C!B"@X;'__^I,#,-#G``!3 +MXP!PH!,'4*`1R34!`P-0T`>]-0$#`W#0!P$PH./()0'C`C#`Y[PE`>,",,#G +M;#"0Y0(+$^,P```:?#4!XP-@T.>&4(7@JSH*XZHZ2N.3!8/@HS"@X8,P@^`# +M`%7AJVH*$ZIJ2A.6)880IF"@$0%@AA*K:@H#JFI*`Y8UA@"F8*`!9`!6XV1@ +MH"-]-0'C`U#4YX50A^"K.@KCJCI*XY,%@^"C,*#A@S"#X`,`5>&K.@H3JCI* +M$Y,EA1"E4*`1`5"%$JLZ"@.J.DH#DP6%`*50H`%\-0'C`V#$YP%@AN*F8*#A +M7V!&XGHU`>,#8,3G9`!5XV10H"-]-0'C`U#$YP`P`.,`,$#C`#"3Y;@E`>," +M()3G9!"@XY$"`>#3+03C8B!!XY(!@>!6#83B"`"`XB$3@^#^___K\(&]Z'!` +M+>D`0*#A`%`/X8``#/$-(*#A?SW"XS\PP^,$()/E`2""X@0@@^7^___K`0!0 +MXP!`H`,`0)05!#"4%0`@E!4$,((5`""#%0!`A!4$0(05@``5XP$```H%\"'A +M````Z@7P(>$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^4`,)/E`@`3XP````K^ +M___K!`"@X7"`O>@00"WI`#"@X0!`#^&```SQ#<"@X7\MS.,_(,+C!,"2Y0'` +MC.($P(+E!""0Y0#`D.4$((SE`,""Y0``@^4$`(/E_O__ZX``%.,!```*!/`A +MX0```.H$\"'A#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E`#"3Y0(`$^,````* +M_O__ZP$`H.,0@+WH<$`MZ0!`H.$!8*#A$%"0Y0@`D.4``%#C`@``"O[__^L` +M,*#C"#"$Y?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4,`)3H!#""Y0`@ +M@^4`0(3E!$"$Y00`H.$&$*#A_O__ZP``5>,&```*4CV%XC@P@^(#`%;AT#0! +M`P,@E0E+WTWB`*"@X1`0C>52#8#B.`"`XAP`C>4H()'E``!1XPL```IP +M,)'E`C"#X'`P@>40`)WE=!"0Y0$`4^$#,&*`<#"`A1`0G95H,)&5`R!BD&@@ +M@940()WE+#"2Y0``4^,-``#:``!2XPL```IP()+E`R""X!``G>5P((#E=!"0 +MY0$`4N$",&.`<#"`A1`0G95H()&5`C!CD&@P@940()WE:)"2Y7!`DN4.`%GC +MPP``V@Q0U.4-,-3E!52#X05@H.$.,(7B!#"-Y0,`6>$0``"J"@``Z@50AN`$ +M0(7@#%#4Y0TPU.4%5(/A!7"@X0Z@A>($L(OB"0!:X0H``-H%8*#AW`*?Y0D0 +MH.$&(*#A_O__ZZH``.H`L*#C"X"@X05PH.$`H(WE!*"=Y0Y@A.(,`(?B_O__ +MZP!`4.(,```*H#"4Y0PP@^*@,(3EE#"4Y0PP@^*4,(3E!`"@X040H.'^___K +M!A"@X04@H.'^___K#P``ZA`0G>4(`)'E(!"@X_[__^L`0%#B!```"J!@A.54 +M4(3E!3"&X)0PA.4$``#J`*"=Y4`"G^4($*#A_O__ZQD``.HH((WB"T""YP&` +MB.)X@._F0`!8XP0``!H`H)WE````XP``0./^___K$```Z@Y`2>('<%3@"@`` +M"@-`"N($0&3B!`!4XP!`H`,'`%3A;P``R@>09.`.`%GCL?__R@"@G>4```#J +M`*"=Y0``6.-G```*$#"=Y3XP@^($,(WE$`"=Y3@`@.(``(WE`&"@XP9PH.$H +ML(WB_AX/X_\?3^,($(WE2B^-X@$@@N`,((WE`#``XP`P0.,4,(WE$#"#XA@P +MC>4(D*#A!E";YZ``E>4&0-#E!X#0Y50PE>4'`%/C(```FA00G>4&(*#C_O__ +MZP``4.,%```*!$2(X?,`".,W$0CC``!4X0$`5!$%```:H`"5Y1@0G>4&(*#C +M_O__ZP``4.,/```*!0"@X080H./^___K!0"@X080H./^___K!!"=Y08@H./^ +M___K!0"@X080H./^___K`!"=Y08@H./^___K%P``ZK0UU>$C)*#A`S2"X4H/ +MC>((()WELC"`X04`H.$"$*#C_O__ZPP0G>4"(*#C_O__ZP4`H.$&$*#C_O__ +MZP00G>4&(*#C_O__ZP4`H.$&$*#C_O__ZP`0G>4&(*#C_O__ZP``5>,+```* +MUTV@XP4`H.$$$)KG_O__Z[H&Q>$$,)KG&#"%Y6@PU>4?,40`)WE'!"=Y?[_ +M_^L!`*#C2]^-XO"/O>B(&0``O!D``/!/+>D,T$WB`("@X0%@H.$,<('B#%"1 +MY0$`4N,%```:!P"@X?[__^L``%#C10``&K`BU>&V(,;A#3"@X7^=P^,_D,GC +M!)"-Y5(MB.(X((+B`""-Y8BE`^.,M0/C-```Z@<`5>$Y```*!4"@X;8@UN&P +M,M7A`C!CX`(+$^,Q```:`%"5Y00PE.4$,(7E`%"#Y0!`A.4$0(3EMC#6X;`B +MU.$#`%+A`3"#`@,ZH`$C.J`!MC#&`1PPU.4``%/C$@``&@HPF.<``%/C&0`` +M&@LPF.<``%/C%@``&@0PF>4!,$/B!#")Y?[__^L(`*#A!!"@X?[__^O^___K +M!""=Y00PDN4!,(/B!#""Y0D``.H!`%/C!P``&@@`H.$$$*#AN_[_ZP$`4.," +M```*!`"@X0`0G>7^___K!P"@X?[__^L``%#CQO__"@$``.H!0*#C````Z@!` +MH.,$`*#A#-"-XO"/O>AP0"WI`%"@X0!`D.6(-0/C`S"4YP``4^-P@+T8C#4# +MXP,PE.<``%/C<("]&/[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4$`*#A +M!1"@X0$@H..1___K`0!0XP4``!H`,`#C`#!`XP`0D^44`(7B`Q"!XO[__^L- +M(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K<("]Z/!!+>D`8*#A`7"@X0B` +M@.((`*#A_O__ZP!`EN4$``#J!%"@X0!`E.4%`*#A!Q"@X?[__^L&`*#A!!"@ +MX?[__^L``%#C]?__"@@`H.'^___K\(&]Z/!/+>D\T$WB`&"@X1"`D.52#8CB +M.`"`XA0`C>5P0);E`%#4Y0-0!>*(.9CE`P!3XP<``!J0.9CE@S"#X`,QB.!Z +M/H/B"#"#X@0@D^4!((+B!""#Y0``5>.3!0`:!#"@X;`@U.%R<._F#%`'X@$, +M$N/2).#G`A"@$P`0H`,!((+A'R#&Y18@].4/(`+B(B#&Y;`@U.$B(J#AL"+& +MX;`@T^%2)N#G(R#&Y;`@T^%2)>#G)"#&Y;`@T^'2)N#G)2#&Y;`@T^%2)^#G +M)B#&Y;`PT^&C-Z#A'3#&Y00`5>,6```*"`!5XZX```H``%7C`)"@$_T"`!IP +M$);E5PV(XA@`@.(*$('B_O__ZP!`4.(&```*%3Z@X].@A.$!`*#C`!"@XPH` +MD.`+$*'@\P"$X0@`H.$&$*#A_O__ZUL%`.IP0);EL##4X0PP`^($`%/C5@4` +M&@0`A.++'8CB(1"!X@8@H./^___K``!0XT\%``JP,-3A_#`#XJ0`4^-+!0`: +MLG#4X5<-B.(8`(#B"A"$XO[__^L`4%#B1`4`"@=YH.$G>:#AU#"5Y0<`4^$_ +M!0`:%3Z@X].@A>$!`*#C`!"@XPH`D.`+$*'@\P"%X34PUN4'`%/C#@``BM4S +MUN$!(*#C$C.@X<``$^,91]45`4`$$@D``!HP`!/C&$?5%0%`!!(%```:!@`3 +MXQ9'U14"0`00`0``&A='U>4!0`3B``!4XR(%`!K0,)7E!``3XQ\%``J<-P'C +MLR"8X=0PE>52,Z#A`0`3XQD%``K^___K#1"@X7\]P>,_,,/C!""3Y0$@@N($ +M((/E!0"@X<1`L.4$$*#A_O__ZP``4.,G```:#`"4Z`0P@N4`((/E`$"$Y01` +MA.7,,)7E`3!#XLPPA>4``%/C`3"@$U0PQ!4`,*`#5##$!0$PH.-6,,3E"`"@ +MX000H.$\-0/C#^"@X0/PF.4``%/C +M)@``&IXW`>/4()7ELQ"8X0$`H.,0(L'ALR"(X0@`H.$%$*#C`""@XP(PH.'^ +M___K&@``ZIXW`>.S()CAU#"5Y5(SH.$!`!/C%```"LP0E>4``%'C`@``&H`/ +MG^7^___K`P``ZG@/G^7^___K`#"@X\PPA>6>-P'CU""5Y;,0F.$!`*#C$"+! +MX;,@B.$(`*#A!1"@XP`@H.,",*#A_O__ZPT@H.%_/<+C/S##XP0@D^4!($+B +M!""#Y?[__^O!!`#JK#0#XP,PF.<``%/C`@``"@@`H.$%$*#C,_\OX:=SH.$> +M<,;E<$"6Y1Q`C>6P,-3A`1P3X@(@H!,`(*`#TS3@YP,@@N$!`%+C!*"$`@$` +M``H0H(0B!*"$,@``4>,"(*`3`""@`P,@@N$!`%+C$'"$`@0```H*<(0R`@`` +M.@(`4N,8<(02"G"$`@``4>,"$*`3`!"@`P,P@>$#`%/C`_&?EP,``.HH30$` +M,$T!`#A-`0!`30$``%"@XP8``.H04(3B!```Z@I0A.("``#J!%"$X@```.H$ +M4(3B``!5XQ@"``HX,(;B&#"-Y0,`H.$*$*#A!B"@X_[__^L^D(;B"0"@X0<0 +MH.$&(*#C_O__ZU"PAN(+`*#A!1"@X08@H./^___K'S#6Y0,`4^,#\9^7B0$` +MZJQ-`0"\3P$`J%$!`)Q3`0!*4(;B!0"@X0H0H.$&(*#C_O__ZT1`AN($`*#A +M!Q"@X08@H./^___K<*"6Y2"@C>7@<(CB.*#6Y0&@"N)L,)CE(``3XP$``!I` +M`!/C)0``"LM-B.(A0(3B!`"@X0D0H.$&(*#C_O__ZP``4.-D```:!`"@X1@0 +MG>4&(*#C_O__ZP``4.,!```:``!:XUP```H+`*#A`!``XP`00.,&(*#C_O__ +MZP``4.-5```:!P"@X3`=G^4&(*#C_O__ZP``4.-/```:"P"@X0<0H.$&(*#C +M_O__ZP``4.,^<(82`9"@$SD``!I&``#J"``3XP@```H+`*#A"1"@X08@H./^ +M___K``!0XU!PAA(!D*`3+@``&CL``.H0`!/C#P``"@``6N,$```*4##6Y0$` +M$^,!D*`3)P``&C(``.H+`*#A&!"=Y08@H./^___K``!0XSYPAA(!D*`3(@`` +M&BD``.H!"!/C`)"@`PEPH`$7```*&`"=Y2`@G>4$$(+B!B"@X_[__^L)`*#A +M(#"=Y0H0@^(&(*#C_O__ZPL`H.$@L)WE$!"+X@8@H./^___K!0"@X1@0G>4& +M(*#C_O__ZP0`H.$)$*#A!B"@X_[__^L!D*#C``!:XP,```H(`*#A_O__ZP!0 +MH.$$``#J5PV(XA@`@.('$*#A_O__ZP!0H.$``%7C`)"@`P8!`.H`4*#C!9"@ +MX0,!`.I*<(;B!P"@X0H0H.$&(*#C_O__ZT1`AN($`*#A!1"@X08@H./^___K +M<*"6Y5==B.(84(7BX`"(XB``C>4X$-;E)!"-Y6PPF.4(`!/C/0``"@$`$^,! +M```:@``3XSD```JP,-KA_"`#XD@`4N-7```*B"`#XH@`4N,!```:<``3XU(` +M`!K+?8CB(7"'X@<`H.$)$*#A!B"@X_[__^L``%#C2@``&B0@G>4!0`+B!P"@ +MX1@0G>4&(*#C_O__ZP``4.,!```:``!4XT````H+`*#A`!N?Y08@H./^___K +M``!0XSH``!H@`)WEZ!J?Y08@H./^___K``!0XS0``!H+`*#A(!"=Y08@H./^ +M___K``!0XRX```H``%3C`P``"@@`H.'^___K`%"@X0,``.H%`*#A4!"&XO[_ +M_^L`4*#A``!5XR4``!HF``#J`0@3XQ\```H!`!/C'0``"A@`G>4$$(KB!B"@ +MX_[__^L)`*#A"A"*X@8@H./^___K"P"@X1`0BN(&(*#C_O__ZP<`H.$8$)WE +M!B"@X_[__^L$`*#A"1"@X08@H./^___K"P"@X2`0G>4&(*#C_O__ZP4`H.%0 +M$(;B_O__ZP!04.(#```:!```Z@!0H.,%D*#AC```Z@&0H..*``#J`)"@XX@` +M`.I*`(;B!1"@X08@H./^___K1`"&X@<0H.$&(*#C_O__ZW!PEN5L,)CE$``3 +MXP!0H`,!D*`#>@``"@L`H.'@$(CB!B"@X_[__^L``%#C`%"@`P60H`%R```* +M5ZV(XAB@BN(^D(;B"@"@X0D0H.'^___K`%!0XEH```IP0);E"@"@X0D0H.'^ +M___KL##4X0!`4.(9```*`0H3XPD```K0,)3E!#"#X]`PA.6<-P'CU""4Y;,0 +MF.$!`*#C$"*!X;,@B.$-``#JT#"4Y00`$^,*```*!#`CXM`PA.6<-P'CU""4 +MY;,0F.$!`*#C$"+!X;,@B.$(`*#A!!"@X?[__^NP(-?A_#`"XD@`4^,U```* +MB"`"XH@`4N,T```:R`!3XS````H*`*#A"1"@X?[__^L`<%#B+0``"MPPE^4` +M`%/C*@``"A0WU^4/`!/C)P``"M`PE^4$`!/C)```"C4@UN4'`%+C#@``BG(P +MK^8!$*#C$3.@X<``$^,91]<5`D`$$@D``!HP`!/C&$?7%0)`!!(%```:!@`3 +MXQ9'UQ4"0`02`0``&A='U^4"0`3B``!4XPX```H<-Y?E``!3XP0```H(`*#A +M!Q"@X?[__^L!D*#C%```Z@@`H.'@$(?B_O__ZP&0H.,/``#J`)"@XPT``.H! +MD*#C"P``ZDH`AN($$(3B!B"@X_[__^M$`(;B"A"$X@8@H./^___K`)"@XWL` +M`.H`4*#C!9"@X0``6>-W```*``!5XW0```J`4(;E`#"@XQPPQN4>,-;E`0!3 +MXQ0``!H<,)WE&"#SY0\@`N(U(,;EL!#3X=$2X>!N/X/BA#"&Y;`RUN$B(-;E#P!4XT0``,H/(`+B`S*" +MX7-P_^:$,(7@M#K3X0<`4^$]```*A$"%X+1ZQ.$F,-;E``!3XS(```JH-P'C +M`S"8YP,`4^,#\9^7#@``ZO!4`0#P5`$``%4!`/!4`0"L-P'C`S"8YS0PQN4& +M``#J2C#6Y0$`$^,$.`$3`S"8%S0PQA7L,)4%-##&!30PUN4!,$/B!`!3XP/Q +MGY<4``#J1%4!`%A5`0"$50$`<%4!`$15`0`$,*#C+#"&Y3`PAN4!D*#C%@`` +MZ@@PH.,L,(;E!#"@XS`PAN4!D*#C$```Z@@PH.,L,(;E,#"&Y0&0H.,+``#J +M`#"@XRPPAN4P,(;E`9"@XP8``.H`,*#C-##&Y3`PAN4L,(;E`9"@XP```.H` +MD*#C`0!9XP,```H&`*#A%!"=Y?[__^M5`@#JK#0#XP,PF.<``%/C`@``"@@` +MH.$%$*#C,_\OX30PUN4``%/C)P``"G`@EN4H,);E`S""X`,PT^4C,Z#A5C#& +MY30PUN4?```*)R#6Y0``4N,#```*""L!XP(@F.``#J9%8!`'16`0#,5@$`A%8!`&16`0`( +M`*#A!A"@X?[__^L5``#J"`"@X080H.'^___K$0``Z@@`H.$&$*#A_O__ZPT` +M`.HG(-;E`0!2XPH``!H``%/C"```"@$K`>,"(-CG`0!2XP$```H"`%/C`@`` +M"@$@H.,,.P'C`R"(YP``5N,X`@`*5SV(XA@P@^(8,(WE)%#6Y2)PUN4#`*#A +M1!"&XO[__^L`0%#B`*"@`QR@C06<0(02'$"-%06PE^$&0*`!`$"@$P$`5>,2 +M```:'`"=Y0``4.,+```*``!7XP4``!K^___K``!0XP(``!H<`)WE%!"=Y?[_ +M_^L&`*#A'!"=Y?[__^OR`0#J!@"@X100G>7^___K`$"@XP%0=>(`4*`S``!7 +MXP!0H`,``%7C;```"AP0G>4``%'C90``"@&PH.$&`*#A_O__ZQP@G>4`0)+E +M#`"4Z`0P@N4`((/E`$"$Y01`A.4B,-3E``!3XP<```H$`*#A%!"=Y?[__^L< +M`)WE%!"=Y?[__^L`0*#C5```ZAPPG>4`<)/E`:"@XT,``.H'4*#A(C#7Y0H` +M4^$'```*!`"@X100G>7^___K'`"=Y100G>7^___K`$"@XT0``.H!H(/B>J#O +MYB@PE^4L()?E``!7XPL```H#((+@5`R!BD&@@AY4P()3E``!4XQ<```IT,)3E`S!BX'0PA.5P +M$)3E`0!3X0(P@S!T,(0U:#"4)0,@8B!H((0E=`"4Y7`0E>5H()7E_O__ZV@@ +ME>5T,)3E`C"#X'0PA.5X$)3E`0!3X0,P8H!T,(2%"```B@0``.IT`)3E7^___K`@``ZF@PE.4"((/@:""$Y3`PE>4P,(3E`'"7Y0L`H.$'$*#A +M_O__ZP``4..V__\*'`"=Y100G>7^___K`P``Z@8`H.$4$)WE_O__ZWL!`.H` +M`%3C>0$`"B8PU.4``%/CC`$`"A@`G>5$$(3B_O__ZP!0H.$T,-3E`@!3XX4! +M`!H``%#C7@``"DHPU.4!`!/C`5R``@H```I64-3E&SR@XP,PV.<``%/C!5*( +M$&)=A1(,4(42`@``&O0!G^7^___K6P``ZB@PE.4L()3E:+"4Y0NP8^`P$)3E +M"[!AX`BP2^(+L&+@<'"4Y0.@@N`*H(?@+#"-X@`PC>4U,-3E!#"-Y04`H.$' +M$*#A"B"@X0LPH.'^___K"Z"*X`!PH.,'4*#A+!"-X@4@T><%,-KG`P!2X0%P +MH!,!4(7B"`!5X_C__QH!`%?C)```&F@PE.4``%/C`P``"@!0H.,(4(7B`P!5 +MX?S__SI*$-3E`1`!X@$`4>,!4*`3!```&E90U.7@.9CE`P!5X0!0H!,!4*`# +M)S#4Y0$`4^,`4*`3`5`%`@``5>,'```*"`"@X?[__^L```#C``!`XR<0U.7^ +M___K`%"@XQ```.H```#C``!`XP,0H.'^___K`%"@XPH``.H".P'C`S#8YP`` +M4^,%```:2C#4Y0$`$^,!4*`3`CL!$P-0R!<````:`5"@XW0PE.4(($/B=""$ +MY7`0E.4!`%+A=#"$-6@PE"4(,$,B:#"$)0``5>,8`0`:!`"@X100G>7^___K +M_@``Z@``5>,:```*Z#"5Y0``4^,7```**!"4Y2PPE.4#$('@!A"!XC8`C>(! +M$(?@`B"@X_[__^NV,]WA(R2@X0,T@N%S,/_FMC/-X8XH".,"`%/A!P``"@0` +MH.$4$)WE_O__ZPH!`.H@&@``0!H``%P5``"$&@``:`"4Y0"@H.'*OZ#A^*#- +MX>`T`>/3H(CAV`#-X0"@FN`!L*O@\Z"(X0@UF.4!,(/B"#6(Y3@PE.4!`'/C +M`P``&KPCU.'_/P_C`P!2X00```HX,-3E`0`3XPPUF`4!,(,"##6(!8!0E.4` +M`%7C#```"A4^H.,!H*#C`+"@X],`A>$`H)K@`;"KX/.@A>%6/Z#CTZ"%X=@` +MS>$*`)#@"Q"AX/,`A>'0-)CE`0!3XZ```!J$<)3E'##4Y0``4^,>```:!`"@ +MX3CX_^L>,-3E`0!3XPL```J(-0/C`S"8YP``4^.*```:C#4#XP,PF.<``%/C +MA@``&@@`H.$$$*#A_O__ZZ(``.H$,-?E``!3XQP``!JP$M3AMA#'X0@`H.$$ +M$*#A_O__Z[8PU^$!,(/B`SJ@X2,ZH.&V,,?AE```Z@$`4^,/```:!##7Y0`` +M4^,,```:L"+4X;8@Q^$(`*#A!!"@X6+Y_^NV,-?A`3"#X@,ZH.$C.J#AMC#' +MX0$`4..#```*8@``ZO[__^L-H*#A?SW*XS\PP^,$()/E`2""X@0@@^6P,M3A +M"E#7Y;80U^'_+P_C`@!1X;8PQP&V(-?A`P!BX`(+$.-*```:`@!3X00``!H! +M,(/B`SJ@X2,ZH.&V,,?AB@``Z@4`H.$!($'B`B"%X`(@8^`""Q+CA```"@%0 +M1>(%`%/A`3"#H@,`8*"V`,>A`3J#L@$P@[(#,&"PMC#'L7H``.JP,M7AL"+4 +MX0,08N`""Q'C`%"5%0(``!H#`%+A!0``&BH``.H*`*#A!1"@X?[__^L``%#C +M\?__"@P`E.@$,(+E`""#Y0!`A.4$0(3E!`"@X040H.'^___K"`"@X0<0H.$` +M(*#C%/K_ZP$`4.,-```:`#``XP`P0.,`$)/E%`"'X@,0@>+^___K#;"@X7\] +MR^,_,,/C!""3Y0$@0N($((/E_O__ZS```.H-`*#A?SW`XS\PP^,$()/E`2!" +MX@0@@^7^___K%`"'XO[__^LF``#J#1"@X7\]P>,_,,/C!""3Y0$@0N($((/E +M_O__ZX@U`^,#,)CG``!3XQL``!J,-0/C`S"8YP``4^,7```:$```Z@0`H.&; +M]__K`0!0XP"0H!$,```:B#4#XP,PF.<``%/C!P``&HPU`^,#,)CG``!3XP,` +M`!H(`*#A!!"@X?[__^L%``#J`)"@XP8`H.$4$)WE_O__ZP``6>,'```*Z#0! +MX]-`B.$!`*#C`!"@XP0`D.`%$*'@\P"(X08``.KP-`'CTT"(X0$`H.,`$*#C +M!`"0X`40H>#S`(CA"0"@X3S0C>+PC[WH`)"@XX_]_^H`(*#CMB/-X7!PE.48 +M`)WE1!"$XO[__^L`4*#AJ#D`0*#A_O__ZP`PH.-H,(3E$("]Z!!`+>D`0*#A_O__ +MZP@`A.+^___K$`"$XO[__^N\`(3B_O__ZQ"`O>AP0"WI`$"@X1Q0D.7^___K +M!`"@X?[__^L0`)3E``!0XP$```J)'*#C_O__ZP4`H.'8-`/C#^"@X0/PE>=P +M@+WH$$`MZ0!`H.$`$*#C+""@X_[__^L$`*#A_O__ZP0`A.+^___K$("]Z/!! +M+>D`@*#A`6"@X0`0H.,2+J#C_O__ZP@`H.'^___K"`"@X?[__^L(`(CB_O__ +MZQQ@B.4!/*#C&#"(Y0@`H.$&$*#A_O__ZXD,H./^___K$`"(Y0``4.,`4*`# +M*P``"O\`@.+_0,#C%$"(Y0APH.$B6X3B!`"@X?[__^L$`*#A!Q"@X?[__^L& +M`*#A!!"@X?[__^L08(3EB$"$X@4`5.'S__\:`3"@XV@PR.58`(CB`!"@X_[_ +M_^L&`*#AU#0#XP_@H.$#\);G`%"@X=!`B.(`,`#C`#!`X]PPB.7@8(CE!`"@ +MX0`0H.,!(*#A_O__Z_H_H.,`,8CE`#``XP`P0.,`$)/E!`"@X600@>+^___K +M!0"@X?"!O>@!`*#C'O\OX?!!+>D(T$WB`&"@X0%0H.$`(`#C`"!`XPTPH.$# +M`)+H!`"#Y+`0P^$``%7C`&"@`S````H`,-7E`0`3XPU0H!$`0-7E`3#5Y01! +M(^`",-7E!$$CX`,PU>4$02/@!##5Y01!(^`%,-7E!$$CX"1$).`?0`3B_O__ +MZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y0)`A.*$<8;@A$&6YP:`H.,'``#J +M"&!$XM@`A.(%$*#A"""@X?[__^L!`%#C!@``"@!`E.4'`*#A!!"@X?[__^L` +M`%#C\O__"@!@H.,-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K!@"@X0C0 +MC>+P@;WH!.`MY0S03>(`(*#A#3"@X2`0G^4#`)'H!`"#Y+`0P^%7#8+B&`"` +MX@T0H.'^___K#-"-X@"`O>AL%0``\$$MZ0!@H.$`4%'BL```"DY]@.(X<(?B +M!P"@X<00A>+^___K`("@X\R`A>7^___K#3"@X7]-P^,_0,3C!#"4Y0$P@^($ +M,(3E!P"@X5P0A>+^___K5#"%XE@@E>54$)7E!""!Y0`0@N54,(7E6#"%Y00P +ME.4!,$/B!#"$Y?[__^O^___K!#"4Y0$P@^($,(3E!P"@X4@0A>+^___K0#"% +MXD0@E>5`$)7E!""!Y0`0@N5`,(7E1#"%Y00PE.4!,$/B!#"$Y?[__^O^___K +M!#"4Y0$P@^($,(3E!P"@X300A>+^___K+#"%XC`@E>4L$)7E!""!Y0`0@N4L +M,(7E,#"%Y00PE.4!,$/B!#"$Y?[__^O^___K!#"4Y0$P@^($,(3E!P"@X2`0 +MA>+^___K&#"%XAP@E>48$)7E!""!Y0`0@N48,(7E'#"%Y00PE.4!,$/B!#"$ +MY?[__^L(,(7B#""5Y0@0E>4$(('E`!""Y0@PA>4,,(7EZ#8!XP,@EN+^___KF`"%XO[__^MB#X7B_O__ZPA`H.$$`H3@``&%X',/@.+^ +M___K`4"$XA``5./X__\:8CZ%X@PP@^(P)I7E+!:5Y00@@>4`$(+E+#:%Y04@ +MH.$P-J+E!"""XC@VE>4T%I7E!#"!Y0`0@^4T)H7E.":%Y0`PH.,\-H7E'#>% +MY10WQ>45-\7E%C?%Y148-\7E&3?%Y1HWQ>6<-P'C`2"@X]0`E>6S$);A +M$A#!X;,0AN&>-P'CU`"5Y;,0EN$2(,'ALR"&X08`H.$%$*#A_O__Z]0@E>4! +M($+B%SV"X@8P@^(#,8;@!#"3Y04`4^$&```:%RV"X@8@@N("(8;@!!""X@`@ +MH.,`(('EU""#Y?[__^L-,*#A?TW#XS]`Q.,$,)3E`3"#X@0PA.4%`*#A5QV& +MXB`0@>+^___K!#"4Y0$P0^($,(3E_O__ZP$`H./P@;WH\$@V`>,#,)CG`0!3X_"'O0C^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($ +M((/E5YV(XBB0B>(`H*#CKV^*X@%@AN*&88C@`$"9Y08``.H(4$3B`$"4Y04` +M5^$"```*"`"@X040H.'^___K!@"@X000H.'^___K``!0X_/__PH!H(KB")") +MXB``6N/J__\:#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__Z_"'O>@00"WI +M`$"@X?[__^L8`(3B_O__ZRP`A.+^___K0`"$XO[__^M4`(3B_O__ZQ"`O>@0 +M0"WI`$"@X0``5.,````*_O__ZQ``A.+^___KF`"$XO[__^ND`(3B_O__ZQ"` +MO>AP0"WI`$"@X?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4(8(3B"$"4 +MY0,``.H$4*#A`$"4Y04`H.'^___K!@"@X000H.'^___K``!0X_;__PH-(*#A +M?SW"XS\PP^,$()/E`2!"X@0@@^7^___K<("]Z'!`+>D`0*#A_O__ZQ!0A.(% +M`*#A_O__ZP4`H.'^___K20^$XO[__^M'#X3B_O__ZW"`O>@00"WI`$!0X@8` +M``H$`*#A_O__ZP``E.4``%#C`0``"@05#N/^___K`0"@XQ"`O>AP0"WI`$"@ +MX0`0H.,H)P#C_O__ZP0`H.'^___K!`"@X?[__^L(`(3B_O__Z\0`A.+^___K +M`%"@X\Q0A.40`(3B_O__ZY@`A.+^___K8@Z$X@P`@.+^___K8PZ$X@0`@.+^ +M___K/%:$YCP3RWI#-!-X@!PH.$!8*#A`"#@X[8@S>'^___K#2"@X7\]PN,_,,/C!""3 +MY0$@@N($((/E"`"'XO[__^L!`%#C`%"@`T\```H(4)?E#`"5Z`0P@N4`((/E +M`%"%Y010A>4%`*#A_O__Z^``A>(&$*#A!B"@X_[__^L`0-;E`3#6Y01!(^`" +M,-;E!$$CX`,PUN4$02/@!##6Y01!(^`%,-;E!$$CX"1$).`?0`3B_O__ZPTP +MH.%_;#^___K`6"&XD1`A.(0`%;C[?__&@T@H.%_/<+C/S## +MXP0@D^4!($+B!""#Y?[__^L%`*#A#-"-XO"/O>@00"WI"-!-X@`@H.$-,*#A +M,!"?Y0,`D>@$`(/DL!##X5<-@N(8`(#B#1"@X?[__^L`0%#B`3"@$]@PA!4! +M`*#C"-"-XA"`O>AT%0``\$$MZ0!@H.$$!0[C_O__ZP``AN4``%#C\(&]"`,` +MP.,$`(#B!`"&Y0APAN('`*#A_O__ZQ``AN+^___K`%"@XQ!1AN5%#X;B_O__ +MZT4H,-'E!P!3XPL``(K8,M'A`2"@XQ(SH.'``!/C5$"$ +M$@8``!HP`!/C0$"$$@,``!H&`!/C+$"$$@```!H80(3B$`"4Y1``O>@>_R_A +M\`,MZ60PD>4/,`/B`0!3XQ@``!H"8*#AQG^@X1@T`>/30(#A!D"4X`=0I>#S +M0(#A!#60Y0$P@^($-8#E7$"1Y0``5.,+```*%SZ@X].`A.$!`*#C`!"@XP@` +MD.`)$*'@\P"$X5X_H./3`(3A`&"6X`%PI^#S8(3A\`.]Z![_+^$$0"WE!P!2 +MXQ```(H!`*#C$"*@X<``$N-40($2`""@$P`@PQ4,```:,``2XT!`@1(!(*`3 +M`"##%0<``!H&`!+C+$"!$@,@H!,`(,,5`@``&AA`@>("(*#C`"##Y00`H.$0 +M`+WH'O\OX01`+>4``%'C!@``V@!`H.,$(*#AA#&`X`0@@^4!0(3B`0!4X?K_ +M_QH0`+WH'O\OX?A/+>D`H*#A`6"@X?[__^L-$*#A?SW!XS\PP^,$()/E`2"" +MX@0@@^7$D(;BQ'"6Y0&`H.,`L*#C1@``Z@=`H.$`<)?E,##4Y0<`4^,0``"* +MT#/4X1@SH.'``!/C"0``&C``$^,$```:!@`3XP@```H65];E`E`%X@<``.H8 +M5];E`E`%X@0``.H95];E`E`%X@$``.H75];E`E`%X@``5>,L```*#`"4Z`0P +M@N4`((/E`$"$Y01`A.7,,);E`3!#XLPPAN4<-Y;E`3!#XAPWAN4``%/C5(#$ +M%0L@H!%8(,05"S"@`50PQ`58@,0%5H#$Y0H`H.$$$*#A/"4#XP_@H.$"\)KG +M`0!0XP(``!H*`*#A!!"@X?[__^L<-Y;E``!3XPP``!H:-];E``!3XPD``!K4 +M();EGAD,T$WB`&"@X0%0H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E +MQ+"%XL1PE>4`,*#C`#"-Y0&`H..>EP'C!("-Y40``.H'0*#A`'"7Y00PE.4' +M(*#A!#"'Y0!P@^4`0(3E!$"$Y3`PU.4'`%/C$```BM`SU.$8,Z#AP``3XPD` +M`!HP`!/C!```&@8`$^,(```*%J?5Y0*@"N('``#J&*?5Y0*@"N($``#J&:?5 +MY0*@"N(!``#J%Z?5Y0*@"N+,,)7E`3!#XLPPA>4``%/C5(#$%0`@H`-4(,0% +M``!:XPD```H<-Y7E`3!#XAPWA>4``%/C5(#$%0`PH!-8,,05`""@`U0@Q`58 +M@,0%5H#$Y08`H.$$$*#A/#4#XP_@H.$#\);G`0!0XP(``!H&`*#A!!"@X?[_ +M_^O,,)7E``!3XP4``!K4()7EN3"6X1@RP^&Y,(;A!""=Y0`@C>4+`*#A!Q"@ +MX?[__^L``%#CM?__"@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L&`*#A +M_O__ZP!04.)%```*G#4)`*#A!Q"@X?[__^L` +M`%#CV?__"@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L`,)WE``!3XP0` +M``H&`*#A!1"@XP`@H.,",*#A_O__ZPS0C>+PC[WH\$$MZ0!@H.$!0*#A1G#1 +MY5Q0D>4``%7C!0``&E<-@.(8`(#B1A"!XO[__^L`4%#BB```"@%P!^)6,-3E +M`0!3XP4``!H``%?C$3"@$U.S +M,);A``!3XW@```H,`)3H!#""Y0`@@^4`0(3E!$"$Y?[__^L-(*#A?WW"XS]P +MQ^,$,)?E`3"#X@0PA^4$`*#AQ!"%XO[__^O,,)7E`3"#XLPPA>6>-P'CLR"6 +MX0$@@N.S((;A!@"@X040H.,`(*#C`C"@X?[__^L$,)?E`3!#X@0PA^7^___K +M`4"@XU@``.K0,)7E!``3XU0```J<-P'CLR"6X=0PE>52,Z#A`0`3XTX```H, +M`)3H!#""Y0`@@^4`0(3E!$"$Y?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@ +M@^4$`*#AQ!"%XO[__^O,,)7E`3"#XLPPA>4P,-3E!P!3XQ$``(K0,]3A`2"@ +MXQ(SH.'``!/C"0``&C``$^,$```:!@`3XP@```H61]7E`D`$X`<``.H81]7E +M`4`$X@0``.H91]7E`4`$X@$``.H71]7E`4`$X@``5.,)```*'#>5Y0$P@^(< +M-X7E&C?5Y0``4^,`0*`3`4`$`@``5.,#```:$```ZAHWU>4``%/C#0``"IXW +M`>/4()7ELQ"6X0$`H.,0(H'ALR"&X4``%/A!```&@8`H.$%$*#C`""@ +MXP(PH.'^___K#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP%`H.,```#J +M`$"@XP0`H.'P@;WH,$`MZ2S03>(`4*#A`4"@X0``D.4%$*#A_O__ZP4`H.$8 +M$(WB#B"@X_[__^NT,-3A`@M3XP8``!H%`*#A!!"-XA0@H./^___K!5#=Y:52 +MH.$#``#JCE@(XP4`4^$'4*`#`%"@$RA0Q.4:,*#CNC#$X7@P`"WI`$"@X54PX.,`,,#E`3#`Y0,PH.,",,#E\S`(XS4$,,#E`C#5Y04PP.4A +M-*#A`12#X;80P.$(`*#C,`"]Z![_+^$00"WI43V@XP-`D.<``%3C$("]"$0T +M`>,#$-#G!`"@X8$1H.'^___K$("]Z!!`+>D`0*#A!""@XT0T`>,#(,#G(`"@ +MX_[__^M1/:#C`P"$YP``4.,``.`#$("]"$0T`>,#,-3G!0!3XPP``!I/383B +M,#"$X@`P@.4H,(3B"#"`Y2`PA.(0,(#E&#"$XA@P@.400(3B($"`Y0``H.,0 +M@+WH!`!3XP``H!,0@+T83TV$XB@PA.(`,(#E(#"$X@@P@.40,(3B$#"`Y1A` +MA.(80(#E``"@XQ"`O>CP02WI"-!-X@!0H.$!8*#A43V@XP-PD.=<0)'E``!4 +MXP8``!I7#8#B&`"`XD80@>+^___K`$!0X@!`H`,9```*!0"@X000H.$P(-;E +M!S"-XO[__^L`0*#A`("@X?[__^L``%#C`P``"@=0W>4$`*#AA1&7Y_[__^L& +M`*#A"!"$XO[__^L0,)3E`3"#XA`PA.4'0-WEA'&'X`0PE^4!,(/B!#"'Y0%` +MH.,$`*#A"-"-XO"!O>@00"WI_O__ZP``4.(!`*`3$("]Z/!/+>D\T$WB!`"- +MY1`0C>44((WE6$"0Y0`PH.,H,(WE`3"@XRPPC>4",*#C,#"-Y0,PH.,T,(WE +MY3T"XP,PU.6T,)#E(#"-Y;@PD.4D +M,(WE`'"@XP%@H.,&0*#A'S#@XP\`X.,```#J!6"@X3C`C>($(8S@`Q"2YP4`((S@`,"2 +MY0#`@>4`4(+E`4"$X@,`5.,&4*#1Z?__V@%0AN(#`%7C!G"@T05`H-'D___: +M_O__ZPT0H.%_/<'C/S##XP0@D^4!((+B!""#Y10@G>4``%+C0@``V@`PH.,( +M,(WE*!"-X@C`G>4,,9'G$""=Y8,Q@N`,,(WE`+"3Y0"@F^4L``#J"F"@X0B0 +MBN($,)WE6("3Y0EPH.$(4)KE#@``Z@5`H.$`4)7E!#"4Y00PA>4`4(/E`$"$ +MY01`A.40,);E`3!#XA`PAN4(`*#A!!"@X?[__^L``%#C!0``"@<`H.$%$*#A +M_O__ZP``4./K__\*#P``Z@``5.,-```*#,"=Y00PG.4!,$/B!#",Y0D`H.'^ +M___K``!0XQ(```H,`);H!#""Y0`@@^4`8(;E!&"&Y0P``.H`H)KE"P"@X0H0 +MH.'^___K``!0X\W__PH($)WE`1"!X@@0C>44()WE`0!2X;[__\H`0*#C#<"@ +MX7\]S.,_,,/C!""3Y0$@0N($((/E_O__ZP0`H.$\T(WB\(^]Z!!`+>D`0*#A +M3PV`XA``@.+^___K``!0XP\```I/#83B&`"`XO[__^L``%#C"@``"D\-A.(@ +M`(#B_O__ZP``4.,%```*3PV$XB@`@.+^___K`0!PX@``H#,0@+WH`0"@XQ"` +MO>CP02WI`%"@X5APD.4`0%'B(0``"O[__^L-(*#A?SW"XS\PP^,$()/E`2"" +MX@0@@^4$`*#A#`"4Z`0P@N4`((/E`$"$Y01`A.5@8)3E``!6XP`PH!-@,(05 +M3!"%XO[__^M(,)7E`3"#XD@PA>4-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^ +M___K``!6XP(```H'`*#A!A"@X?[__^L!`*#C\(&]Z/!!+>D`<*#A`6"@X?[_ +M_^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4`0);E!```Z@10H.$`0)3E!P"@ +MX040H.'^___K!@"@X000H.'^___K``!0X_7__PH-(*#A?SW"XS\PP^,$()/E +M`2!"X@0@@^7^___K\(&]Z!!`+>D``%'C````"O[__^L!`*#C$("]Z/!!+>D` +M4*#A6'"0Y?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^5,`(7B_O__ZP$` +M4.,`0*`#)```"DQ`E>4,`)3H!#""Y0`@@^4`0(3E!$"$Y0``5.,<```*2#"5 +MY0$P0^)(,(7E`&"@XVQ@A.5P8(3E"`"$X@80H.%8(*#C_O__ZP$PH.-D,(3E +M8&"$Y70PQ.5(,)7E`0!3XPL``!K7/:#C`S"7YY0QD^4((+/E`0`2XP4``!H` +M4`_A@``,\0`@D^4!((+C`""#Y07P(>$-(*#A?SW"XS\PP^,$()/E`2!"X@0@ +M@^7^___K!`"@X?"!O>CP1RWI0-!-X@!@H.$!H*#A3GV`XCAPA^('`*#A_O__ +MZP!`4.(``.`#)@$`"AB`C>(*`*#A"!"@X?[__^LP4(WB"`"@X040H.$.(*#C +M_O__Z[PSW>$C)*#A`S2"X;PPQ.$TD(3B"0"@X040H.$&(*#C_O__ZSJ`A.(( +M`*#A!A"%X@8@H./^___K`#"@XU4PQ.5L,);E(``3XP$``!I``!/C"```"D8` +MA.()$*#A!B"@X_[__^M``(3B"!"@X08@H./^___K%```Z@@`$^,(```*1@"$ +MXN`0AN(&(*#C_O__ZT``A.(($*#A!B"@X_[__^L)``#J$``3XP<```I&`(3B +M"1"@X08@H./^___K0`"$XN`0AN(&(*#C_O__ZQPPG>44,(3EO##4X0(+4^,: +M```:&`"-X@T0H.$8(*#C_O__ZP`PH.,+,,3E&C$`XQP@G>4#`%+A$```FKPP +MU.$""U/C#0``&A4PW>5$`%/C`P``&A=0W>5#`%7C#0``&@0``.I#`%/C!``` +M&A=0W>5$`%7C`0``&@$PH.,+,,3EO##4X8XH".,&&`#C`@!3X0$`4Q$"```* +M"S#4Y0$`4^,#```:!@"@X000H.,!(*#C_O__ZT:0U.4!D!GB!```"@8`H.'^ +M___K`%!0X@8``!JF``#J5PV&XA@`@.)&$(3B_O__ZP!04.*@```*"("$XM@P +ME>4R,,3E7%"$Y0`PH.,Q,,3E#B"@X[`AQ.$8(*#CLB'$X0@@H.,)(,3E,##$ +MY6PPEN5P`!/C!@``"MPPE>4``%/C"0``"A@`C>(($*#ACOW_ZP4``.K$-);E +M``!3XP(```H8`(WB"!"@X8?]_^OH,)7E`0!3XPD``!H`,*#C'3#$Y;P@U.&. +M.`CC`P!2X4<```IL,);E`0@3XT0``!IV``#JJ#,$.`$3`S"6 +M%QTPQ!7L,)4%'3#$!:@W`>,#,);G`P!3XP/QGY<.``#JG'T!`)Q]`0"L?0$` +MG'T!`+`W`>,#,);G3##$Y0@``.H``%GC"#@!$P,PEA=,,,05`#"@`TPPQ`4! +M``#J`#"@XTPPQ.4=,-3E`3!#X@0`4^,#\9^7%0``ZOA]`0`(?@$`/'X!`"Q^ +M`0#X?0$`!#"@XQXPQ.4?,,3E#P``Z@@PH.,>,,3E!#"@XQ\PQ.4!.P'C`S#6 +MYP``4^,'```:-@``Z@@PH.,>,,3E'S#$Y0(``.H`,*#C'C#$Y1\PQ.4=,-3E +M``!3XPH```H$.P'C`S"6YP$`4^,#```*##L!XP,PEN<``%/C`@``&@$PH.,* +M,,3E`0``Z@`PH.,*,,3E"@"@X0@0H.'^___K`#"@XU0PQ.58,,3E5C#$Y=P@ +ME>5-(,3E^"75Y4X@Q.5.$=7E3Q#$Y0P6U>50$,3E#1;5Y5$0Q.4.%M7E4A#$ +MY5,PQ.4#`%+A&@``"OPUE>4``%/C%P``"@\FU>4P,-3E4C.@X0$`$^,!,*`3 +M4S#$%1```.H'`*#A!!"@X?[__^L``.#C"0``Z@8`H.$$$*#C,_\OX08`H.$$ +M$*#A/#4#XP_@H.$#\);G`0!PX@``H#-`T(WB\(>]Z&"@A.6L-`/C`S"6YP`` +M4^/N__\:\/__ZO!!+>D`<*#A`4"@X0)0H.$!8*#A`0"@X0`0H.-`(*#C_O__ +MZP`PU.4!(-3E`B2#X0,_#^,`,$#C`S`"X`,@`N(`(,3E(R2@X0$@Q.4!(-7E +M`C"#X0`PQ.4C)*#A`2#$Y0$@U>4(`!+CBP``"FP@E^4(`!+C$```"@$\@^,` +M,,3E(S2@X0$PQ.4$`(3BX!"'X@8@H./^___K"@"$XC(0A>(&(*#C_O__ZQ`` +MA.(L$(7B!B"@X_[__^LC``#J$``2XQ````H"/(/C`##$Y2,TH.$!,,3E!`"$ +MXBP0A>(&(*#C_O__ZPH`A.+@$(?B!B"@X_[__^L0`(3B,A"%X@8@H./^___K +M$```ZB``$N,"```:0``2XP!`H`-@```*!`"&XBP0A>(&(*#C_O__ZPH`AN(R +M$(7B!B"@X_[__^L0`(;BX!"'X@8@H./^___K3##5Y0``4^,'```*`##6Y0$@ +MUN4"-(/A`CJ#XW,P_^8`,,;E(S2@X0$PQN45,-7E``!3XP<```H`,-;E`2#6 +MY0(T@^$!.8/C$"8$;B +M!F"$X"@PU>4``%/CL"#6$0\P`Q(#,((1L##&$5`PU>4!,`/BL"#6X0,R@N%S +M,/_FL##&X2D@U>4#(`+B@C*#X;`PQN$^,-7E5&"5Y0``5N,,```:`0`3XP,` +M``H'`*#A_O__ZP!@H.$$``#J5PV'XA@`@.(^$(7B_O__ZP!@H.$``%;C%@`` +M"B@PU>4\,(/B@S"&X+`@T^$!((+BL"##X2@@U>4\((+B@B"&X+`PTN$#.J#A +M(SJ@X;`PPN$H,-7E@V"&X+@WUN&V,,7AMB'TX0\@`N(#,H+AL##$X0%`H.,` +M``#J`4"@XP0`H.'P@;WH<$`MZ0!0H.$`8`_A@``,\0T@H.%_/<+C/S##XP0@ +MD^4!((+B!""#Y<0`@.+^___K`0!0XP!`H`,+```*Q$"5Y0P`E.@$,(+E`""# +MY0!`A.4$0(3E``!4X]PPE14!,$,2W#"%%0`PH!,4,(05@``6XP$```H&\"'A +M````Z@;P(>$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^4`,)/E`@`3XP````K^ +M___K!`"@X7"`O>AP0"WI`$"@X0``4>(``*`#<("]"`!0#^&```SQ#2"@X7\] +MPN,_,,/C!""3Y0$@@N($((/E#`"0Z`0P@N4`((/E``"`Y00`@.7@$(3B_O__ +MZ_`PE.4!,(/B\#"$Y8``%>,!```*!?`AX0```.H%\"'A#2"@X7\]PN,_,,/C +M!""3Y0$@0N($((/E`#"3Y0(`$^,!`*`#<("]"/[__^L!`*#C<("]Z'!`+>D` +M0*#A``!1XP``H`-P@+T(N#'1X0``4^,#```*!`"@X?[__^L!`*#C<("]Z`!0 +M#^&```SQ#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E#`"1Z`0P@N4`((/E`!"! +MY000@>4!`*#AQ!"$XO[__^O<,)3E`3"#XMPPA.6``!7C`0``"@7P(>$```#J +M!?`AX0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y0`PD^4"`!/C`0"@`W"`O0C^ +M___K`0"@XW"`O>AP0"WI`%"@X0!@#^&```SQ#2"@X7\]PN,_,,/C!""3Y0$@ +M@N($((/EX`"`XO[__^L!`%#C`$"@`PL```K@0)7E#`"4Z`0P@N4`((/E`$"$ +MY01`A.4``%3C\#"5%0$P0Q+P,(45`#"@$Q0PA!6``!;C`0``"@;P(>$```#J +M!O`AX0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y0`PD^4"`!/C````"O[__^L$ +M`*#A<("]Z#!`+>D,T$WB`$"@X0(PH.$4)`'C`B#0YP``4N,`(*`#%30!`P,@ +MP`<9```*`0!2XQ<```H!`*#A*A"@XP0@C>+^___K`%!0X@`@H`,5-`$#`R#$ +M!PX```H",-7E`@`3XP`@H`,5-`$#`R#$!P@```I'.@+C`S#4YP$`4^,!(*`# +M%30!`P,@Q`<"(*`3%30!$P,@Q!<,T(WB,("]Z/!/+>ELT$WB#`"-Y0%@H.$" +M0*#A1I#2Y0&0">)4#$*#A"""$XO[__^L``%#C20(` +M"E!0C>(&`*#A!1"@X?[__^L%`*#A`!"@X[`AU.'^___K5#"=Y10PA.4,-`'C +M#`"=Y0,PD.<$,$/B"#"-Y2@0A.(4$(WE(""$XA`@C>4$8)WE`("@XU"PC>(& +M4*#AL##6X0$[@^.P,,;ALG'4X0=@AN`(,)WE`W!GX!XPU.4``%/CM```"ATP +MU.4!,$/B!`!3XP/QGY>H``#JB(8!`.R&`0`8B0$`#(@!`(B&`0`@,=KE(##$ +MY2$QVN4A,,3E(C':Y2(PQ.5,,-3E`S.@X2,PQ.42#J#CT""*X?\4X.,!`%+A +M`P``&@``4^,`(*`#`#"@`P,```H!`*#C`!"@XP`@DN`!,*/@$AZ@X_$@BN&* +M``#J``!9XR,```HA,=KE(##$Y2$QVN5?,`/B(#"#XR$PQ.4@,=KE(C#$Y4PP +MU.4#,Z#A(#"#XR,PQ.4B,=KE)##$Y2,QVN4E,,3E)#':Y28PQ.4E,=KE)S#$ +MY1(.H./0((KA`0!RXP0``!K_'P_C`0!3X0`@H`,`,*`#`P``"@$`H.,`$*#C +M`""2X`$PH^`2'J#C\2"*X60``.HA,=KE(##$Y2$QVN5?,`/B(#"#XR$PQ.4@ +M,=KE(C#$Y2`@H.,C(,3E(C':Y20PQ.4C,=KE)3#$Y20QVN4F,,3E)3':Y2

``#J(#':Y2`PQ.4A,=KE(3#$ +MY0`@H.,B(,3E(#"@XR,PQ.4B,=KE)##$Y2,QVN4E,,3E)#':Y28PQ.4E,=KE +M)S#$Y1(.H./0((KA`0!RXP0``!K_'P_C`0!3X0`@H`,`,*`#`P``"@$`H.,` +M$*#C`""2X`$PH^`2'J#C\2"*X08`H.$0$)WE'B#4Y?[__^L>,-3E`V"&X`=P +M8^```%CC`""@$P`@C14%```:!@"@X;P0U.'^___K``"-Y0!@AN`'<&#@'S#4 +MY0``4^,"```*"B#4Y0``4N,'<&,0``!9XP4```H+`*#A!A"@X10@E.7^___K +M`'"@X00``.H+`*#A!A"@X0<@H.'^___K`'"@X0=@AN`?(-3E``!2XP<```H* +M,-3E``!3XP0```H&`*#A%!"=Y?[__^L?,-3E`V"&X`&`B.(``%GC`P``&@L` +MH.'^___K`0!0X\,``!IX@._F'(#$Y;(AU.$>$-3E`#"=Y0$`6.,`,*`3`#"- +MY0HPU.4``%/C'S#4%0(@@>`'<(+@``"=Y0!PA^`#<(?@&'"$Y;`PU>$!.\/C +ML##%X0`PH.-,,,WE33#-Y4XPS>5/,,WE1F#4Y5Q0E.4#`%7A!0``&@P0G>57 +M#8'B&`"`XD80A.+^___K`%"@X1TPU.4"`%/CF0``&@``5>.7```*-#"-X@`@ +MH.,$((/D!""#Y`0@@^0`((/E;("4Y0$`%N,3```*"#@!XPP@G>4#`)+G``*" +MX&$-@.(,`(#B-!"-XA`@H./^___K`0!0XP(,$('B_O__ZP@``.KP`(7B-!"-XA`@H./^___K`0!0X_@```H< +M`(WB\!"%XO[__^LH<(CB"%"@X2DP]>4!`!/C$```"AP`C>(0$(?B!B"@X_[_ +M_^L`,-7E`@`3XP0```H<`(WB&!"'X@8@H./^___K%```ZAP`C>(*$(?B!B"@ +MX_[__^L/``#J'`"-X@00A^(&(*#C_O__ZP`PU>4"`!/C!```"AP`C>(0$(?B +M!B"@X_[__^L#``#J'`"-X@H0A^(&(*#C_O__ZPP0G>7$-)'E`0!3XS`PU`5, +M,,T%'`"-XDP0C>($(*#C_O__ZP!@H.,,A`'C'*"-X@:PH.$$4*#A)P``Z@-` +M%^(!0*`3)W&$X+(1U>$>(-7E`0""X`=Q@.`!8(;B`P!6X0T``!H8,)7E`Q!A +MX`$@8N`*,-7E``!3XPLPH`$?,-45`D!CX`H`H.$'$*#A!""@X?[__^L$<(?@ +M#P``Z@PPG>4(0)/G!!!AX`$@8N`*,-7E``!3XPM`H`$?0-45`D!DX`H`H.$' +M$*#A!""@X?[__^L?,-7E`T"$X`1PA^`<,-7E`P!6X=3__[H%0*#A1%"-XAP` +MC>(%$*#A_O__ZP<`H.$%$*#A"""@X_[__^L8,)3E"#"#XA@PA.4``%/C`P`` +M"@!0H.,(4(7B`P!5X?S__SH*,-3E``!3XPH``!H>``#J`S`6X@$PH!,F88/@ +M!F&@X2A@AN(&`*#A!!"=Y;(AU.'^___K0?[_ZATPU.4!,$/B!`!3XP/QGY4$$*#A_O__ZP``6>,`,*`3,S#$%0%`H!-<```:7%"4 +MY1PPU.4!`%/C##0!$PP`G14#8)`7&&"4!0P0G>6A-]'E!P!3XP,``)KE/0+C +M`S#1YP``4^,6```*2#H"XPP@G>6S,)+A!@!3X0$PH#,S,,0U`T"@,44``#I- +M,=7E``!3XP$PH!,S,,05`T"@$3\``!I,,=7E``!3XP(PH!,S,,05`4"@$P`P +MH`,S,,0%`4"@`S8``.I3/Z#CLS"5X0``4^,,```*33'5Y0``4^,!,*`3,S#$ +M%0-`H!$L```:3#'5Y0``4^,!0*`#`C"@$S,PQ!4!0*`3)0``ZDXPU.4``%/C +M#P``"@PPG>5W6M/EGS?3Y0``4^,$```*`C!%XG,P[^8!`%/C!@``B@$``.H# +M`%7C`P``&@$PH.,S,,3E`T"@X1(``.I(.@+C#`"=Y;,PD.$#`%;A`3"@@S,P +MQ(4#0*"!"@``BE,PU.4!`%/C,S#$!0-`H`$`,*`3,S#$%0%`H!,"``#J`$"@ +MXP```.H`0*#C!`"@X6S0C>+PC[WH$$`MZ0!`H.'^___K!`"@X?[__^L,`(3B +M_O__ZR``A.+^___K*`"$XO[__^LP`(3B_O__ZS@`A.+^___K0`"$XO[__^M4 +M`(3B_O__Z\P`A.+^___KU`"$XO[__^L0@+WH\$$MZ0!PH.%88)#E1$"0Y=B` +MD.4&`*#AT#0#XP_@H.$#\);G!P"@X?[__^M$,)?E``!3X_"!O0@>6X3B!@"@ +MX000H.'^___K>$"$X@4`5.'Y__\:"%"@X2-.B.(*C*#C!@"@X040H.$((*#A +M_O__ZXQ0A>($`%7A^/__&D``E^4``%#C`0``"@08!^/^___KU`"7Y0``4.,! +M```*C1^@X_[__^OH`(?B_O__Z^Q0E^4C3H7B`HN@XP8`H.$%$*#A"""@X?[_ +M_^N,4(7B!`!5X?C__QKH`)?E``!0XP$```J-'Z#C_O__ZP8`H.'^___K\(&] +MZ!!`+>D`0*#A_O__ZP@`A.+^___K`#"@XQ`PA.40@+WH$$`MZ0!`H.$`$*#C +MB""@X_[__^L$`*#A_O__ZP@`A.+N___K'`"$XNS__^LP`(3BZO__ZT0`A.+H +M___K6`"$XO[__^M@`(3B_O__ZQ"`O>CP3RWI#-!-X@"@H.$!<*#A`!"@XP$L +MH./^___K"@"@X?[__^L*`*#A`!"@X_[__^L,`(KB`!"@X_[__^OX`(KB`1"@ +MX_[__^M8<(KE&`"*XO[__^L@`(KB_O__ZR@`BN+^___K,`"*XO[__^LX`(KB +M_O__ZTP`BN+^___K!`@'X_[__^M``(KE``!0XP`PH`-$,(H%=P``"@,`@.(# +M0,#C1$"*Y4R`BN(>6X3B`&"@XP0`H.'^___K:'"$Y61@A.5@8(3E;&"$Y7!@ +MA.4$`*#A"!"@X?[__^MX0(3B!0!4X?+__QH!/*#C2#"*Y2HY`.-4,(KEQ`"* +MXO[__^O,`(KB_O__ZXT/H./^___KU`"*Y0``4.-7```*`P"`X@-`P./80(KE +MQ)"*XFF_A.(`4*#C"HR@XP1@H.$$`*#A_O__ZQ10A.4(<(3EN%'$X0<`H.$$ +M$*#A"""@X?[__^L``%#C1```"KI1Q.$$`*#A"1"@X?[__^L+`%3AC$"$$NS_ +M_QH$,*#CW#"*Y>``BN+^___KC0^@X_[__^OH`(KE``!0XS0```H#`(#B`T#` +MX^Q`BN7@L(KB:3^$X@0PC>4`8*#C`8"@XP*;H.,$4*#A!`"@X?[__^L48(3E +M"'"$Y;B!Q.$'`*#A!!"@X0D@H.'^___K``!0XQ\```H$`*#A"Q"@X?[__^L$ +M,)WE`P!4X8Q`A!+L__\:!#"@X_`PBN4'`*#A_O__ZP``4.,2```:B`":Y8P0 +MVN7^___K`3"@XYPPRN60`(KB`!"@X_[__^L`,*#CM#"*Y;@PBN6\,(KEP#"* +MY,``*`C +M'O\O(0`P`.,`,$#C`##3Y0``4^,&```:`#``XP`P0.,!$(/@!##1Y0`PPN4! +M`*#C'O\OX0```.,``$#C`3!#XH,$@.`!$(#@!#+1Y0`PPN4!`*#C'O\OX0(, +M4>,``*`C'O\O(0`P`.,`,$#C`##3Y0``4^,%```:`#``XP`P0.,!$(/@!"#! +MY0$`H.,>_R_A````XP``0.,!,$/B@P2`X`$0@.`$(L'E`0"@XQ[_+^$00"WI +M5#4#XP_@H.$#\)#G$("]Z!!`+>E@-0/C#^"@X0/PD.<0@+WH!$`MY0%`(.(! +M0`3B`@`0XP%`A`)T0.\&!``0XP%`A`)T0.\&"``0XP%`A`)T0.\&!`"@X1`` +MO>@>_R_A!.`MY0S03>(4P-WE$."=Y0#@C>4$P(WE6,4#XP_@H.$,\)#G#-"- +MX@"`O>@$X"WE#-!-XA#`W>4`P(WE7,4#XP_@H.$,\)#G#-"-X@"`O>@00"WI +M9,4#XP_@H.$,\)#G$("]Z`3@+>4,T$WB$,#=Y0#`C>5HQ0/C#^"@X0SPD.<, +MT(WB`("]Z`$`$.,`,-$%`##"!0$PT04!,,(%`@`0XP(PT04",,(%`S#1!0,P +MP@4$`!#C!##1!00PP@4%,-$%!3#"!0@`$.,&,-$%!C#"!04,T$WB$,#=Y0#`C>5LQ0/C#^"@X0SPD.<,T(WB`("]Z/!/+>D4T$WB +M`("@X0&PH.$"0*#A`Z"@X3B0G>4`4*#COE#-X;Q0S>$`4(WE!1"@X0$@H.,. +M,(WB_O__ZP!0C>4(`*#A!1"@X0,@H.,,,(WB_O__Z[Y0W>$$`%7A*0``.@$` +M6^,`<``3`'!`$P4``!H$,(K@O%#=X04`4^$A``#*`'``XP!P0.,(`*#A"Q"@ +MX0$@H./^___K``!:XQ,``-J^4-WA!`!5X0!@H(,%``"*#@``Z@%`A.)T0/_F +MOE#=X00`5>$)``":"`"@X000H.$&((G@-_\OX0!04.($```*`6"&X@H`5N'Q +M__^Z````Z@!0H.,(`*#A"Q"@X0`@H./^___K````Z@!0H.,%`*#A%-"-XO"/ +MO>@$X"WE%-!-X@`0H.,`$(WE`R"@XPXPC>+^___KO@#=X130C>(`@+WH<$`M +MZ0!`H.$!4*#A`!"@XP$@H./^___K!`"@X0`0H.,!(*#A_O__Z[``Q>$$`*#A +M`!"@XP$@H.'^___K`0"@XW"`O>CP02WI$-!-X@!PH.$!0*#A`F"@X0.`H.$` +M$*#C$#"-XK(08^$`$(WE!""@X_[__^L$,(;@OE#=X04`4^$``*##$```R@<` +MH.$`$*#C`2"@X_[__^L`@(WE`%"@XP10C>4'`*#A!1"@X00@H.$&,*#A_O__ +MZP<`H.$%$*#A!2"@X?[__^L!`*#C$-"-XO"!O>CP12WI%-!-X@!@H.$!@*#A +M`J"@X0-PH.$`0*#C$%"-XK)`9>$$$*#A`2"@X_[__^L`<(WE!@"@X0@0H.$$ +M(*#C!3"@X?[__^N^4-WA`*"-Y01PC>4&`*#A"!"@X00@H.$%,*#A_O__ZP8` +MH.$$$*#A!""@X?[__^L4T(WB\(6]Z`$`4>,%```:`B"`X,LM@N(H((+B`R#2 +MY0`@P^4>_R_A`@!1XPH``!H"((#@RQV"XB@0@>(#$-'EL!##X&P$,/A'O\OX00`4>,>_R\1`@"`X,LM@.(H((+B`Q#2Y0`0@^7+ +M+8#B*2""X@,@TN4"%('A`!"#Y$`((/ERPV`XBL` +M@.(#$-#E`2R"X0`@@^4>_R_A'O\OX?!!+>D`0`#C`$!`XP0`A.+_$*#C`BR@ +MX_[__^L""X3B!`"`XO\0H.,!+*#C_O__ZPD,A.($`(#B_Q"@XP$LH./^___K +M"DR$X@1`A.(&7(3B`FR@X_]PH.,$`*#A!A"@X0<@H.'^___K`DR$X@4`5.'X +M__\:`$``XP!`0./_#D3B!`!`XO\0H.,!*Z#C_O__Z[\.1.($`$#B_Q"@XP$K +MH./^___K5$"?Y09A`%0``<$`MZ1#03>(`0*#A`6"@X0)0H.$0,(WB`""@X[(@8^$` +M4(WE!""@X_[__^O@,@/C`S#4YP$`4^,%```:RPV$XBL`@.+_$*#COB#=X?[_ +M_^L%``#J!`"@X080H.'++83B*R""X@4PH.'^___K$-"-XG"`O>CP3RWI--!- +MXA``C>4!@*#A`F"@X0.@H.$`$*#C,#"-XKH08^$`$(WE!""@X_[__^L(@(WE +MM@+=X0@PAN```%/AF@``RO[__^L`D%#BEP``"A``G>4`$*#CMB+=X0DPH.'^ +M___K``!0XPP`C>6+```*$`"=Y0$0H.,!(*#A_O__Z]B!Y^(%,(+@`1")X`$@4>4)($/E +M`"#:Y0@@0^4!4(7B`4"@XS$``.H&`%3A.P``"@8P9.`!`%/C$```&@0@VN<( +MP)WE##"$X`,0V><"`%'A"```"L4`H.$!$*#C$7#'X3``C>(%4(#@""!%Y0,P +MB>`!,-/G!S!%Y0%`A.(G``#J!!"@X00PVN<(P)WE#""$X`(`V><#`%#A!@`` +M&@$`H.,$P(K@`B")X`#`W.<`(-+G`@!(` +M,`#C`#!`XQ0PC>4`,`#C`#!`XQ@PC>4`,`#C`#!`XQPPC>4'`%7CP?__V@\` +M5^,9```*``"@XP``C>40`)WE"!"@X0<@H.$+,*#A_O__ZW``[^8,`(WE%`"= +MY0@0H.'^___K&`"=Y0<0H.'^___K`%"@XQQPG>4'`*#A!1#;Y_[__^L!4(7B +M"`!5X_G__QH,$)WE``!1XPH```H&`%3A"```"@&`B.)X@._F"P"@X?\0H.,( +M(*#C_O__ZP!0H.,/<*#CUO__ZA``G>4!$*#C`""@X_[__^L)`*#AMA+=X?[_ +M_^L!``#J`""@XPP@C>4,`)WE--"-XO"/O>AP0"WI`%"@X0%`H.$"8*#A``!3 +MXP(```K^___K`$"@X2(``.HQ$*#C="#OYO[__^L%`*#A,A"@X_[__^M41.'G +M_"``X@4`H.$R$*#C!"""X?[__^L%`*#A,!"@XP8@H.'^___K!0"@X3,0H./R +M(*#C_O__ZP!`H.,S8*#C`0``Z@%`A.)T0._F!0"@X080H.'^___K@``0XP$` +M``ID`%3C]O__&F,`5.,`0*"#`4"@DP0`H.%P@+WH$$`MZ0`@TN4`,*#C_O__ +MZQ"`O>CP02WI`%"@X0%`H.$"<*#A``!3XP(```K^___K`$"@X2<``.HQ$*#C +M="#OYO[__^L%`*#A,A"@X_[__^M41.'G_"``X@4`H.$R$*#C!"""X?[__^L% +M`*#A,Q"@XW(@H./^___K`$"@XS-@H.,!``#J`4"$XG1`[^8%`*#A!A"@X?[_ +M_^N``!#C`@``&F0`5./V__\:!P``ZF,`5.,%``"*!0"@X3`0H./^___K``#' +MY0%`H.,"``#J`##@XP`PQ^4`0*#C!`"@X?"!O>@00"WI`#"@X_[__^L0@+WH +M\$`MZ1303>(`8*#A`5"@X0)PH.$`$*#C$#"-XK(08^$`$(WE`2"@X_[__^N^ +M0-WA!0!4X2D``)H&`*#A,!"@XP<@H.'^___K!@"@X3$0H.-U(._F_O__ZP8` +MH.$R$*#C_O__ZU54X>?\(`#B!@"@X3(0H.,%((+A_O__ZP8`H.$S$*#C_O__ +MZX`LX.&B+.#A!@"@X3,0H.-R(._F_O__ZP8`H.$S$*#C_O__ZP!0H.$`0*#C +M,W"@XP8``.H&`*#A!Q"@X?[__^L`4*#A`4"$XF0`5.,!```*@``5X_;__QH4 +MT(WB\("]Z/!`+>D4T$WB`&"@X0%0H.$`$*#C$#"-XK(08^$`$(WE`2"@X_[_ +M_^N^0-WA!0!4X?]`H),G``":!@"@X3$0H.-U(._F_O__ZP8`H.$R$*#C_O__ +MZU54X>?\(`#B!@"@X3(0H.,%((+A_O__ZP8`H.$S$*#C_O__ZW\@`.(&`*#A +M,Q"@X_[__^L&`*#A,Q"@X_[__^L`4*#A`$"@XS-PH.,&``#J!@"@X0<0H.'^ +M___K`%"@X0%`A.+Z#U3C`0``"H``%>/V__\*!@"@X3`0H./^___K`$"@X00` +MH.$4T(WB\("]Z/!!+>D`4*#A`4"@X0*`H.$``%/C`0``"O[__^OP@;WH,1"@ +MXW0@[^;^___K!0"@X3(0H./^___K5$3AY_P@`.(%`*#A,A"@XP0@@N'^___K +M!0"@X3,0H./^___K?R``X@4`H.$S$*#C_O__ZP4`H.$P$*#C_O__ZP``4.,. +M``"Z`$"@XS!@H.,/=P+C!0"@X080H.'^___K`4"$XG1`_^8'`%3A`#"@@P$P +MH),``%#C`#"@LP``4^/S__\:,@"@X_[__^L%`*#A,!"@X_[__^L``,CE\(&] +MZ!!`+>GT-`/C`S"0YP``4^,0@+T(,_\OX1"`O>@00"WI^#0#XP,PD.<``%/C +M$("]"#/_+^$0@+WH$$`MZ>PT`^,#,)#G``!3XQ"`O0@S_R_A$("]Z!!`+>GD +M-`/C`S"0YP``4^,0@+T(,_\OX1"`O>@00"WIW#0#XP,PD.<``%/C$("]"#/_ +M+^$0@+WH$$`MZ>`T`^,#,)#G``!3XQ"`O0@S_R_A$("]Z'!`+>D`0*#A`""@ +MXYTU`^,#(,#G`2"@XY\U`^,#(,#GN#0#XP_@H.$#\)#G`%"@X0$`4.,!(*`# +MG34#`P,@Q`<`(*`3G34#$P,@Q!<`(*#CGS4#XP,@Q.=P@+WH<$`MZ0!0H.&\ +M-`/C#^"@X0/PD.<`0*#A`0!0XP`@H`.=-0,#`R#%!W"`O>@00"WI<#4#XP,P +MD.<``%/C$("]"#/_+^$0@+WH!$`MY;0T`^,#0)#G`#"@XUDB`^,",,#G&C3$ +MY1``O>@>_R_A_P!1XP$`H!$*`*`#'O\OX0`PH.,#`-'G@``0XYX```I_``#B +M`@!`XFH`4.,`\9^7F0``ZIBD`0!4I0$`J*0!`%2E`0!4I0$`5*4!`%2E`0!4 +MI0$`5*4!`+BD`0#8I`$`5*4!`%2E`0!4I0$`5*4!`%2E`0#HI`$`5*4!`%2E +M`0!4I0$`R*0!`%2E`0#XI`$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4! +M`%2E`0!4I0$`5*4!`%2E`0`(I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$` +M5*4!`%2E`0!4I0$`5*4!`%2E`0`8I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4 +MI0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E +M`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0`HI0$`5*4!`%2E`0!4I0$`5*4! +M`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$` +M5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0`XI0$`5*4!`%2E`0!4 +MI0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!(I0$`L`#2X0$` +M@..P`,+A*@``ZK``TN$"`(#CL`#"X28``.JP`-+A!`"`X[``PN$B``#JL`#2 +MX0@`@..P`,+A'@``ZK``TN$0`(#CL`#"X1H``.JP`-+A(`"`X[``PN$6``#J +ML`#2X4``@..P`,+A$@``ZK``TN&``(#CL`#"X0X``.JP`-+A`0R`X[``PN$* +M``#JL`#2X0(,@..P`,+A!@``ZK``TN$!"X#CL`#"X0(``.JP`-+A`@N`X[`` +MPN$!,(/B$`!3XUK__QH>_R_A!$`MY03`W>4``%SC-0``"@4`4N,"\9^7+P`` +MZIBE`0"TI0$`T*4!`.RE`0`(I@$`)*8!``-`H.$``%'C(#"@`P`PQ`5_,.`3 +M`##$%7```.H#0*#A``!1XP(\H`.P,,0!!CR@$[`PQ!%I``#J`T"@X0``4>/Q +M,0`#L##$`1\^H!.P,,018@``Z@-`H.$``%'C\3$``[`PQ`%=/J`3L##$$5L` +M`.H#0*#A``!1XP$\H`.P,,0!`3N@$[`PQ!%4``#J`T"@X0``4>,/,*`#`##$ +M!1`PH!,`,,0530``Z@`@H.,`(,/E2@``Z@4`4N,"\9^710``ZG"F`0"XI@$` +MU*8!`/"F`0`,IP$`5*/Q,0`#L##$`5T^H!.P,,01&@``Z@-`H.$``%'C +M`3N@$[`PQ!$5```:MC'0X0D@0^)R(/_F`0!2XX`PH).P,,21#@``F@TP0^)S +M,/_F`0!3XP$\H).P,,21"```Z@-`H.$``%'C#S"@`P`PQ`40,*`3`##$%0$` +M`.H`(*#C`"##Y1``O>@>_R_A`#``XP`P0.,(,(#E`#``XP`P0.,L,(#E`#`` +MXP`P0.,P,(#E`#``XP`P0.,T,(#E`#``XP`P0.-0,(#E`#``XP`P0.-4,(#E +M`#``XP`P0.-8,(#E`#``XP`P0.-T,(#E`#``XP`P0.-X,(#E`#``XP`P0.-\ +M,(#E`#``XP`P0..,,(#E`#``XP`P0..0,(#E`#``XP`P0..4,(#E`#``XP`P +M0..8,(#E`#``XP`P0..<,(#E`#``XP`P0..@,(#E`#``XP`P0..D,(#E`#`` +MXP`P0..H,(#E`#``XP`P0..L,(#E`#``XP`P0..P,(#E`#``XP`P0..T,(#E +M`#``XP`P0..X,(#E`#``XP`P0..\,(#E`#``XP`P0./`,(#E`#``XP`P0./$ +M,(#E`#``XP`P0./(,(#E`#``XP`P0./,,(#E'O\OX?!/+>D40`(WB_Q"@XP@@H./^___K`0`7XPBPH!$/@*`3)@`` +M&@&0B.)YD/_F!`"@X0@0H.$`(-KE!C"@X?[__^L!L(GB>[#_Y@2@C>4$`*#A +M"1"@X0HPH.$!(//E!#"-Y08PH.'^___K$%"-X@0`H.$($*#A!2"@X08PH.'^ +M___K!`"@X0D0H.$!((7B!C"@X?[__^L`,-KE$%#=Y04`4^$%```:!""=Y0`P +MTN414-WE!0!3X0^`H`,````*#H"@XP(`%^,+D*`1*@``&@$PB^)S,/_F"`2- +MZ00`H.$+$*#A"C"@X0(@\^4(,(WE!C"@X?[__^L$()WE`9""XGF0_^8,H(WE +M!`"@X0(0H.$*,*#A`R#SY0PPC>4&,*#A_O__ZQ!0C>($`*#A"Q"@X0(@A>(& +M,*#A_O__ZP0`H.$$$)WE`R"%X@8PH.'^___K"""=Y0`PTN424-WE!0!3X00` +M`!H,()WE`##2Y1-0W>4%`%/A````"OV`".($`!?C";"@$2H``!H!,(GBD$`*#A"1"@X0HPH.$$(//E"#"-Y08PH.'^___K!""=Y0&P@N)[L/_F +M#*"-Y00`H.$"$*#A"C"@X04@\^4,,(WE!C"@X?[__^L04(WB!`"@X0D0H.$$ +M((7B!C"@X?[__^L$`*#A!!"=Y04@A>(&,*#A_O__ZP@@G>4`,-+E%%#=Y04` +M4^$$```:#""=Y0`PTN454-WE!0!3X0````K[@`CB"``7XR```!H!D(OB>9#_ +MY@IPH.$$`*#A"Q"@X08@]^4&,*#A_O__ZP0`H.$)$*#A!R#ZY08PH.'^___K +M$%"-X@0`H.$+$*#A!B"%X@8PH.'^___K!`"@X0D0H.$'((7B!C"@X?[__^L` +M,-?E%D#=Y00`4^$#```:`##:Y1=`W>4$`%/A````"O>`".((`*#A'-"-XO"/ +MO>@00"WI"-!-XA#`W>4``%SC`P``"@#`C>5`___K`$"@X0,``.H`P*#C`,"- +MY3O__^L`0*#A!`"@X0C0C>(0@+WH<$`MZ1#03>(`4*#A`6"@X0)`H.$0,(WB +M`""@X[(@8^$`0(WE`R"@X_[__^L%`*#A!A"@X00@H.'^___KOD#=X0``5.$` +M`*"3`0"@@Q#0C>)P@+WH\$$MZ0!PH.$!8*#A`H"@X0-`H.$"4(/B!0"@X?\0 +MH.,((*#C_O__ZP!PQ.4!8,3E!@"@X0@0H.$%(*#A_O__ZP$`U.7^___K"@#$ +MY?"!O>CP02WI"-!-X@!`H.$`,*#CMC#-X0!@4>($```*`#``XP`P0..P,-/A +MMC#-X2(``.HO$*#C!B"-XA@U`^,/X*#A`_"4YQP``.H%4-WE_P!5XR4```H? +M(`7B#P!2XP]0!1(.```:`3"#XG,0_^:V$,WA!`"@X0<@H.$&,*#A_O__ZP50 +MW>4/,`7B#P!3XP]0!1*V4-T!`5"%`K90S0$(```*!0"@X?[__^NV4-WA`5"% +MXH!0A>"V4,WA`0``Z@5PC>+_@0#C!`"@X;80W>$'(*#A!C"@X?[__^L``%#C +M`@``"K8PW>$(`%/AUO__F@``5N,$```*`#``XP`P0..V0-WA`$"#Y04``.H$ +M`*#A+Q"@XP8@C>(4-0/C#^"@X0/PE.>V`-WA"-"-XO"!O>CP1RWI$-!-X@!P +MH.$!D*#A`D"@X0-@H.$P@-WEL*#3X0A0C>(%`*#A_Q"@XP@@H./^___K!P"@ +MX0`0U.4%(*#A"#"@X?[__^L``%#C*```"@$0BN(!(-3E`("-Y0<`H.%Q$/_F +M"#"-XO[__^L`4*#A#P!0XQD```H``%GC!P``&@`0U.4`@(WE!P"@X04@H.$( +M,(WB_O__ZP!`H.$&``#J`!#4Y0"`C>4'`*#A!2"@X0@PC>+N``#K`$"@X0`` +M5.,``*`#$```"@<`H.$)$*#A"""@X?[__^L`H*#A"```Z@HPU.6#H(K@`:"* +MXGJ@_^8#``#J"C#4Y8.@BN`!H(KB>J#_YK"@QN$!`*#C$-"-XO"'O>CP3RWI +M+-!-X@!PH.$,$(WE`K"@X0.0H.%08-WE`##3Y0\`4^.,``":L##2X;0RS>$` +M0*#CLD+-X2=`S>4`8(WE`B"@XR(PC>+^___K)Z"-X@10H.%V``#J`(#9Y8B" +MH.$/@(CC>(#OY@<`H.$((*#A!C"@X?[__^L'`*#AM!+=X0H@H.$&,*#A_O__ +MZR7_`%/C%0``&@,`5>-L``"*`5"%XG50[^8#``#J`P!5XV<``(H!4(7B +M=5#OY@<`H.&T$MWA"""@X08PH.'^___K!P"@X;02W>$*(*#A!C"@X?[__^LG +M,-WE_P!3X^[__PH#`%CA20``&K1"W>$!$(3B<1#_YK02S>$`0-GE>$`$X@$P +MV>6$0(/A!P"@X00@H.$&,*#A_O__ZP<`H.&T$MWA"B"@X08PH.'^___K)S#= +MY?\`4^,5```:`P!5XT```(H!4(7B=5#OY@,``.H#`%7C.P``B@%0A>)U4._F +M!P"@X;02W>$$(*#A!C"@X?[__^L'`*#AM!+=X0H@H.$&,*#A_O__ZR7_ +M`%/C[O__"@\@`^(/`%+C!P``&@,`5>,G``"*`5"%XG50[^:T0MWA`4"$XK1" +MS>$9``#J`P!4X0%`H`,;```*\#`#XJB"H.&C,(CA%##-Y2=`W>4/``3B%0#- +MY?[__^L>`,WE`&"-Y0<`H.$,$)WE%""-XB0PC>(U___K``!0XP4``!H,``#J +M'S`#X@\`4^.T0MT!`D"$`K1"S0&T$MWALD+=X0$`5.&$__^*`$"@X[0RW>&P +M,,OA/P``Z@!`H.,]``#J`#"@XR6P$-+ALA+-X0!0V>4!,-GE!5*#X750 +M[^8%(*#A!C"@X?[__^L'`*#ALA+=X2<@C>(&,*#A_O__ZR7_`%/C`4"@ +M`R>`C0($```*$```Z@0`5.,D```*`4"$XG1`[^8'`*#ALA+=X04@H.$&,*#A +M_O__ZP<`H.&R$MWA"""@X08PH.'^___K)S#=Y?\`4^/N__\*`P!5X0%`H`,/ +M```*(S*@X10PS>4G0-WE#P`$XA4`S>7^___K'@#-Y0!@C>4'`*#A#!"=Y10@ +MC>(B,(WB[/[_ZP``4.,#```*`$"@X[(RW>&P,,OA````Z@!`H.,$`*#A+-"- +MXO"/O>CP12WI'-!-X@!@H.$!<*#A`H"@X0.@H.$X0-WE`#"@X[HPS>$!$*#C +M!""@X6+^_^L``%#C'@``"@Q0C>('`*#A"!"@X0H@H.$%,*#A;_[_ZP!`C>4& +M`*#A`1"@XPH@C>(%,*#A%0``ZP``4.,0```*`$"-Y08`H.$!$*#C"B"-X@PP +MC>(%___K``!0XP@```H`0(WE!@"@X0$0H.,*((WB##"-XNH``.L``%#B`0"@ +M$P```.H``*#C'-"-XO"%O>CP3RWI--!-X@!PH.$0$(WE&""-Y0@PC>588-WE +M`#"@XR\PS>6\,LWANC+-X;@RS>$`8(WE`B"@XRHPC>+^___K`&"-Y0<`H.$0 +M$)WE`2"@XR@PC>+^___K$""=Y0``4N,3```:``!6XP8```H`,`#C`#!`X[!` +MT^&$2Z#AI$N@X;Q"S>$9``#J!P"@X2\0H.,L((WB#XP_@H.$#\)?GO$+= +MX81+H.&D2Z#AO$+-X0X``.H``%;C!@``"@`P`.,`,$#CL$#3X81+H.&D2Z#A +MO$+-X04``.H`,`#C`#!`X[!`T^&$2Z#AI$N@X;Q"S>&\$MWANE+=X0$`5>&@ +M``":"#"=Y0(P@^(<,(WE`,"@XQ3`C>4'L*#A"P"@X2\@C>(&,*#A_O__ZP`` +M4../```*+T#=Y?\`5..,```*'S`$X@\`4^,D4J`1#W`$$A```!J\4MWA`5"% +MXG40_^:\$LWA"P"@X2\@C>(&,*#A_O__ZR]PW>4'4*#A#S`'X@\`4^-_```* +M\%`'XJ50H.&D4H7A`W"@X0<`H.'^___K`)"@X0@@G>4`,-+E!0!3X64``!J\ +M0MWA`4"$XG10_^:`@*#A``!8XQ4``-H`H*#C%$"=Y0QPC>4%<*#A!Q"$X`L` +MH.%Q$/_F)R"-X@8PH.'^___K``!0XP(```HG4-WE_P!5XP&@H!,!0(3B=$#O +MY@@`5.'P__^Z#'"=Y0``6N-)```:","=Y0$PW.4!`!/C`@``&@$`%^,.4*`# +M````"@]0H.,"`!/C`0``&@(`%^/]4`4"!``3XP$``!H$`!?C^U`%`@@`$^,! +M```:"``7X_=0!0(/`%7C,P``"KQ"W>$!$(3B`&"-Y0L`H.%Q$/_F!2"@X1PP +MG>7^___K`$"@X0\`4.,"```:`#"@XP@`G>46``#J$""=Y0``4N,(```:"#"= +MY0`0T^4`8(WE"P"@X00@H.$<,)WE_O__ZP!`H.$'``#J","=Y0`0W.4`8(WE +M"P"@X00@H.$<,)WE$/__ZP!`H.$``%3CYO__&AT``.H#$*#A52.@X0$`$N,! +M(-`%`<"@`QP3@@$!$,`%`3"#X@0`4^/U__\:"""=Y0$`TN7^___K"#"=Y0H` +MP^6\0MWA`1"$XHF0H.%Q$/GF<1#_YKI2W>$!`%7A!@``FKP2S>%I___JO,+= +MX1@@G>6PP,+A`4"@XP```.H`0*#C!`"@X330C>+PC[WH\$4MZ0S03>(`H*#A +M`8"@X0-`H.$H8-WE`G"#XK`0TN$!$('B`2#3Y0!@C>5Q$/_F!S"@X?[__^L` +M4*#A#P!0XP$`H`,2```*``!8XP<``!H`$-3E`&"-Y0H`H.$%(*#A!S"@X?[_ +M_^L`0*#A!@``Z@`0U.4`8(WE"@"@X04@H.$',*#AR/[_ZP!`H.$``%3B`0"@ +M$PS0C>+PA;WH\$4MZ1S03>(`8*#A`7"@X0*`H.$#H*#A.$#=Y0`0H..Z$,WA +M!""@X2?]_^L``%#C'@``"@Q0C>('`*#A"!"@X0H@H.$%,*#A-/W_ZP!`C>4& +M`*#A`!"@XPH@C>(%,*#AVO[_ZP``4.,0```*`$"-Y08`H.$`$*#C"B"-X@PP +MC>+*_?_K``!0XP@```H`0(WE!@"@X0`0H.,*((WB##"-XJ___^L``%#B`0"@ +M$P```.H``*#C'-"-XO"%O>CP3RWI3-!-X@"`H.$!H*#A`F"@X0-PH.%P0-WE +M``!4XP,```H`0(WEQ?__ZP!`H.$J`0#JMC'0X0D@0^)R(/_F`0!2XQH!`(H` +M$*#C`2"@X?[__^L?#E#C`$"@@Q\!`(HPH,WE,6#-Y3)0C>(%`*#A_Q"@XP@@ +MH./^___K!@"@X0<0H.$%(*#A_O__ZS$`W>7^___K$`"-Y0&0H.,`<*#C"6"@ +MX0`P`.,`,$#C##"-Y12@C>4$H*#A`0!6X]D``!H(`*#A!Q"@X4<@C>(`,*#C +M_O__ZP``4.."```*1T#=Y?\`5.-_```*1D#-Y0\@!.(8((WE`@"@X?[__^L< +M`(WE,##=Y20"4^$$```:@#"@X2`PC>4``%/C!@``RB@``.H!<(?B'""=Y8(P +MH.%W4$D*#A+'"- +MY2!PG>4+8*#A!1"+X`@`H.%Q$/_F1R"-X@HPH.'^___K``!0XP(```I'0-WE +M_P!4XP"0H!,!4(7B=5#OY@<`5>'O__^Z!E"@X21@G>4)0*#A*)"=Y2QPG>4` +M`%3C'#"=!8-PA0!W48()WE`S""X0$`$^,/0*`3#D"@`P(` +M$^/]0`0"!``3X_M`!`((`!/C]T`$`@10H.$/,`3B#P!3XS````H!$(?B`#"@ +MXP`PC>4(`*#A<1#_YA@@G>4R,(WB_O__ZP!`H.$/,`#B#P!3XP8```H`,*#C +M`#"-Y0@`H.$4$)WE!""@X3PPC>+^___K,3#=Y0-0)>`!`!7C#T"@`PY`H!," +M`!7C_4`$$@0`%>/[0`02"``5X_=`!!(/,`3B#P!3XP"0H`,'```*"`"@X0`0 +MH.,!(*#A_O__ZP!PH.$4,)WE,##-Y3%`S>4,()WE`$"2Y0%`A.(`0(+E`P!4 +MXWD``,IS``#J`7"'XAP@G>6",*#A=W#SYG=P_^84,)WE,##-Y6L``.HP0-WE +M,3#=Y01"@^%T0._F"`"@X0<0H.$$(*#A"C"@X?[__^L(`*#A!Q"@X48@C>(* +M,*#A_O__ZT8PW>4#`%3A(&"@`UD```K_`%/C!@``&@P@G>4`0)+E`4"$X@!` +M@N4#`%3C5@``RE```.HC4J#A#T`#X@0`H.'^___K`+"@X3P`C>+_$*#C"""@ +MX_[__^L(`*#A!1"@X3P@C>(*,*#A_O__ZP``4.,9```*`7"'XG=P_^8`H(WE +M"`"@X0<0H.$$(*#A/#"-XO[__^L`0*#A#S``X@\`4^.+<(<`=W#_!@\```H` +MH(WE"`"@X040H.$$(*#A/#"-XO[__^L(`*#A`!"@XPH@H.'^___K`'"@X0,` +M`.H!<(?BBS"@X7=P\^9W7^___K$`"-Y0PPG>4` +M0)/E`4"$X@!`@^4#`%3C!0``R@%@H.,?#E?C`#"@@P$P"9(``%/C`O__&@%` +MH.,*``#J#3!#XG,P_^8!`%/C`$"@@P4``(H`,*#C`#"-Y08@H.$',*#AF?[_ +MZP!`H.$$`*#A3-"-XO"/O>CP3RWI3-!-X@"`H.$($(WE`G"@X0-@H.$`(*#C +M2#"-X@T@8^4`8(WE`A"@X?[__^L``%?CH0``"CM`W>4(()WE`@!4X9T``#H' +M`*#A_Q"@XP@@H./^___K/`"-XO\0H.,((*#C_O__ZP"@H.,*4*#A#*"-Y0%` +MH.-'D(WB$*"-Y0`P`.,`,$#C&#"-Y0JPH.$!`!3C8@``"@@`H.$%$*#A"2"@ +MX08PH.'^___K``!0XVD```I'H-WE_P!:XV8```H?,`KB#P!3XRI"H!$/L`H2 +M%```&@%0A>)U4/_F"`"@X040H.$)(*#A!C"@X?[__^M',-WE#Q`#X@\`4>,$ +M```*\"`#XJ)`H.&J0H3A`;"@X00``.H8`)WE_O__ZP%0A>)U4/_F2@``Z@L` +MH.'^___K#`"-Y0@PG>4#`%3A,0``&H`@H.$<((WE``!2XR8``-H`H*#C$$"= +MY0$PH.,4,(WE`R"%X+`BS>$LL(WE,%"-Y0.PH.$T<(WE''"=Y7)0_^8%$(3@ +M"`"@X7$0_^8)(*#A!C"@X?[__^L``%#C!0``"D5(((WB"J""X`PP2N7_ +M`%/C`+"@$P%`A.)T0._F!*"@X0<`5.'L__^Z,%"=Y12PC>4LL)WE-'"=Y10P +MG>4``%/C($"@`QD```H!4(7B#""=Y8(PH.%U4//F=5#_Y@%`H.,2``#J`5"% +MX@P@G>6",*#A=5#SYG50_^8!0*#C"P``ZB``%.,)```*"P"@X3P0C>('(*#A +M_O__ZP%0A>(,()WE@C"@X750\^9U4/_F`4"@XP(,5>.,__\Z`##7Y?\`4^,7 +M```:`3#7Y?\`4^,4```:`C#7Y?\`4^,1```:`S#7Y?\`4^,.```:!##7Y?\` +M4^,+```:!3#7Y?\`4^,(```:!C#7Y?\`4^,%```:!P#7Y?\`4.(!`*`3`@`` +MZ@``H.,```#J`0"@XTS0C>+PC[WH\$\MZ3S03>(`0*#A`6"@X0)0H.$``%/C +M`@``"D+__^L`0*#AF0``ZK8QT.$)($/B4)@*#A`7"@XS>PC>(0D(WE_Z$`XPQ@C>4$8*#A`0`7XTD```H&`*#A"!"@ +MX0L@H.$`,*#C_O__ZP``4.-/```*-T#=Y?\`5.-,```*#R`$X@0@C>4"`*#A +M_O__ZP"0H.$,,)WE)`)3X3$``!J`(*#A%""-Y0``4N,G``#:`3"@XP@PC>4` +M<*#C$$"=Y0,@B."X(44@)WE%%"-Y7)0_^8$D*#A!1"$X`8` +MH.%Q$/_F"R"@X0DPH.'^___K``!0XP<```HW,-WE.""-X@=P@N`,,$?E"""= +MY?\`4^,`(*`3"""-Y0%`A.)T0._F!'"@X00`6.'J___*()"=Y22`G>444)WE +M"#"=Y0``4^,@<*`#%@``"@&`B.*),*#A>(#SYGB`_^8!<*#C$```Z@&`B.*` +M,*#A>(#SYGB`_^8!<*#C"@``ZB``%^,(```*!`"=Y2P0C>(%(*#A_O__ZP&` +MB.*),*#A>(#SYGB`_^8!<*#C"@!8X:;__YH`,-7E_P!3XQ<``!H!,-7E_P!3 +MXQ0``!H",-7E_P!3XQ$``!H#,-7E_P!3XPX``!H$,-7E_P!3XPL``!H%,-7E +M_P!3XP@``!H&,-7E_P!3XP4``!H'0-7E_T!4X@%`H!,-``#J`$"@XPL``.H! +M0*#C"0``Z@TP0^)S,/_F`0!3XP!`H(,$``"*!`"@X04@H.$`,*#CI_[_ZP!` +MH.$$`*#A/-"-XO"/O>AP0"WI`%"@X;!`T>$I,0CC`P!4X0`@H`/@,@,#`R#` +M!W"`O0@4`)_E!!"@X?[__^L!(*#CX#(#XP,@Q>=P@+WH*!L``'!`+>FT-`/C +M`T"0YP`PE.4``%+C!@``"@`PH./`-L3EPC;$Y<$VQ.7%-L3ER3;$Y7"`O>@( +M`!/C#P``"GDPT>6C,J#A!`!3XP`PH!,!,*`#P#;$Y7Q0T>75,.+GPC;$Y0$P +M!>+!-L3E53+@Y\4VQ.754N#GR5;$Y00``.I\,-'E(S*PX0`PH`,!,*`3P#;$ +MY;0T`^,#0)#GYST"XP,PT.<"`%/CQ3;$%>@]`N,#,-#G`0!3XP8PH`/'-L0% +M#```"@(`4^,`,*`#QS;$!0@```H$`%/C!S"@`\P0H./^___K4#OAYP$`4^,0,*`#`#"@$P-`A.$'``#J!S`$ +MX@$`4^.0```:!P"@X?00H./^___K#P(`XB!*A.$'4`3B`0!5XQ0``!H`,*#C +M!#"(Y0<`H.%H$*#C_O__ZU`AX.<$,)CE`S""X0$'$.,"(*`3`""@`P(P@^$! +M!1#C!""@$P`@H`,",(/A!#"(Y=`PX.<(,(CE4&S@YPQ@B.6(`%3C.```"@X` +M`(H8`%3C(0``"@0``(H``%3C1@``"@@`5.-4```:(P``ZB@`5.,=```*@0!4 +MXT,```H@`%3C30``&C@``.J(,`'C`P!4X3$```H&``"*F`!4XQH```JH`%3C +M'```"HD`5.-"```:.0``ZI`P`>,#`%3A'@``"J@P`>,#`%3A'P``"HDP`>,# +M`%3A.```&C,``.H```#C``!`X_[__^M-``#J````XP``0./^___K1@``Z@`` +M`.,``$#C_O__ZT(``.H```#C``!`X_[__^M!``#J````XP``0./^___K.@`` +MZ@```.,``$#C_O__ZS8``.H```#C``!`X_[__^LU``#J````XP``0./^___K +M+@``Z@```.,``$#C_O__ZRH``.H```#C``!`X_[__^LF``#J````XP``0./^ +M___K(@``Z@```.,``$#C_O__ZQX``.H```#C``!`X_[__^L:``#J````XP`` +M0./^___K%@``Z@```.,``$#C_O__ZP!`B.5P,`3B$`!3XP(``!H`,*#C*3#( +MY0@``.H@`%/C`C"@`RDPR`4$```*`0!5XP,PH`,I,,@%`S"@$RDPR!4$`*#A +M\(&]Z`=0!.*)___J`$"(Y7`P!.+O___J`$"(Y>K__^H00"WIM#0#XP-`D.?^ +M___K``"$Y1"`O>AP0"WI`$"@X0%@H.$``%+C!```"@`P`.,`,$#C`!##Y0%0 +MH.,H``#JMC'0X0TP0^)S,/_F`0!3XR(``(JT-`/C`S"0YP0PD^4"`!/C'0`` +M"C00H./^___K`P!6XP;QGY<1``#JS,@!`-C(`0#HR`$`^,@!``-LP.,!4*#C +M#```Z@-D,T$WB`&"@X0)PH.$``%'C*@``&@``4N,#```*`A"@X($<*#A_X$`XP<``.H'`-WE +M_P!0XW4```H/``#B_O__ZX!`A.`!0(3B=$#_Y@8`H.$$$*#A!2"@X0,@```*'S`%X@\`4^,/4`42#0``&@%`A.)T0/_F!@"@X000H.$((*#A!S"@ +MX?[__^L'4-WE#S`%X@\`4^,!0(0"=$#_!@]0!1(%```*!0"@X?[__^L!0(3B +M@`"@X71`\.9T0/_F!@"@X000H.$((*#A!S"@X?[__^L``%#C`0``"@H`5.'; +M__^:[S$`XP,`5.$#``":`9")XGF0[^8#`%GCR___F@FPH.$!,$OB@T2$X'1` +M_^8``%?C`#``$P`P0!,`0(,5`#```P`P0`,`0(,%!`"@X0S0C>+PC[WH?"`` +M`/!/+>F+WTWB``"-Y10@C>4<,(WE4"+=Y0@@C>48$(WE%,"=Y0$PC.`!#%/C +MU```RB@PC>(!'(/B`"#@X[`@P^&R(,/AM"##X;8@P^$(,(/B`0!3X?C__QH` +M$*#C(Q#-Y200S>4E$,WE_CT/X_\_3^.*+XWBLQ""X0``G>4H((WB`R!"X@@P +MG>7^___K)4#=Y?\`5..Z```*_CT/X_\_3^.*SXWBLU"*S4(SA`+"@ +MXP2PC>4!4*#C*!"-X@,00>(0$(WE'S`$X@\`4^,I```:`7"%XG=P_^8``)WE +M!1"@X20@C>((,)WE_O__ZR0PW>7_`%/C(P``"OXM#^/_+T_CBL^-XK)0G.$! +M4(7BLE",X0\@`^(/`%+C$```&@%0A^)U4/_F``"=Y0<0H.$0()WE"#"=Y?[_ +M_^LE0-WE_P!4XV\```K^/0_C_S]/XXH?C>*S0)'A`4"$XK-`@>%6``#J\!`# +MXJ1"H.&A0(3A!$"-Y0^P`^(#``#J)"*@X00@C>4/L`3B!7"@X00PG>4?`%/C +M!T"@@3@``(HHP(WB@X&,X`!@H.,DD(WB`9!)XOZM#^/_KT_C6S:@X0$`$^,' +M4*`1)```&@%0A^)U4/_F``"=Y0<0H.$)(*#A"#"=Y?[__^N*'XWBND"1X0%` +MA.*Z0('A(R#=Y0P@C>6P(,CA_S$`XP,`5>$9``"*`7"%XG=P_^8``)WE!1"@ +MX0D@H.$(,)WE_O__ZXK/C>*Z0)SA`4"$XKI`C.$C0-WE#!"=Y01$@>&P0,CA +M_R$`XP(`5^$'0*"!"0``B@=0H.$!8(;B`H"(X@0`5N,#```*!7"@X=#__^H% +M0*#A````Z@5`H.$!4(3B=5#_Y@``G>4$$*#A$""=Y0@PG>7^___K)4#=Y?\` +M5.,7```*_CT/X_\_3^.*SXWBLT")*SXWB`%"@X8`QH.$#$([@`S",X`5`H.'I +M___J%!"=Y0``4>,+```*2B^-XA@PG>4#((+@`#"@XP$`H.$+PC[WH\$\MZ4G?3>(``(WE#""-Y10PC>5(L=WE$!"-Y0$P@N"``%/C +MG0``RAPPC>((,(WE@!"#X@`@X..P(,/ALB##X;0@P^&V(,/A"#"#X@$`4^'X +M__\:^CX/X_\_3^,`$*#C$BZ-XK,0@N$``)WEG""-X@LPH.'^___KG$#=Y?\` +M5.,`0*`#^CX/$_\_3Q,2SHT2LT"<$0%`A!*S0(P1`4"@$_^1`./ZC@_C_X]/ +MXP10H.%```#J)Z*@X0]P!^**H:#A'!"-X@I@@>`(()WE"#""X@J@@^`!`!?C +M(```&@``G>4%$*#AG""-X@LPH.'^___K`5"%XG50_^82/HWBN$"3X0%`A.*X +M0(/AG,#=Y03`C>6PP,;A"0!5X5H``(H``)WE!1"@X9P@C>(+,*#A_O__ZP%0 +MA>)U4/_F$AZ-XKA`D>$!0(3BN$"!X9Q`W>4$()WE!$2"X;!`QN$)`%7A20`` +MB@)@AN(*`%;AIW"@$=C__QH``)WE!1"@X9P@C>(+,*#A_O__ZYQ`W>7_0%3B +M`4"@$PD`5>$`0*"#``!4XP4```H2/HWBN$"3X0%`A.*X0(/A`5"%XG50_^:< +M<-WE_S!7X@$PH!,)`%7A`#"@@P``4^.W__\:``"@XQS@C>*@P(WB`%"@X0L` +M`.JR(-'@`"##Y2(DH.$!(,/E`4"$XG1`_^8",(/B!`!4X_;__QH!`(#B$`!0 +MXP0```J`,:#A`Q".X`,PC.`%0*#A[O__Z@S`G>4``%SC"P``"J`@C>(0$)WE +M`2""X``PH.,,`*#A%,"=Y0$0TN0#$,SG`3"#XG,0_^8!`%#A^?__B@``G>4O +M$*#C'""-X@(@0N(4-0/C#^"@X0/PD.<%``#J``"=Y040H.&<((WB"S"@X?[_ +M_^O%___J2=^-XO"/O>CP3RWI--!-XAP`C>44$(WE$""-Y2`PC>58L-WE`#"@ +MXR\PS>4N,,WE+3#-Y0$+H./^___K``!0XQ@`C>4"```:``2?Y?[__^O\``#J +M`@R@X_[__^L`0*#A!`"-Y0``4.,`4*`3"&"@$P(``!K8`Y_E_O__Z_$``.H& +M`*#A_O__ZP4`A.<``%#C`@``&KP#G^7^___KZ0``Z@10A>("#%7C]/__&A`0 +MG>44()WE`C"!X`$+4^/A``#*`#"@XP`@X.,#$)3GL"#!X0,0E.>R(,'A`Q"4 +MY[0@P>$#$)3GMB#!X00P@^("#%/C]/__&@`PH.,(,(WE`1"@XPP0C>4#H*#A +M`#"-Y21`C>44+(*#A8_W_ZP``4./&```*"0"@X0`0H.,O +M((WB"S"@X?[__^LO0-WE_P!4X[X```H!4*#C'S`$X@\`4^,:```:`6"%XG9@ +M_^8)`*#A!1"@X2X@C>(+,*#A_O__ZRXPW>7_`%/C%```"@\0`^(/`%'C!P`` +M&@%0AN)U4/_F"0"@X080H.$O((WB"S"@X?[__^M*``#J\"`#XJ1"H.&B0(3A +M`$"-Y0^@`^(#``#J)"*@X0`@C>4/H`3B!6"@X0`PG>6``!/C+```&@00G>4# +M<8'@!E"@X0!`H.-:-*#A`0`3XP5@H!$>```:`6"%XG9@_^8)`*#A!1"@X2T@ +MC>(+,*#A_O__ZX2`H.$`,)?E+5#=Y;A0@^'_(0#C`@!6X18``(H!4(;B=5#_ +MY@D`H.$&$*#A+2"-X@LPH.'^___K`#"7Y0B`@^`M8-WEL##8X08T@^&P,,CA +M_S$`XP,`5>$%``"*!6"@X0%`A.($`%3C`@``"@90H.'7___J!6"@X0%0AN)U +M4/_F"0"@X080H.$O((WB"S"@X?[__^LO0-WE_P!4XP8``!H00(7B_Q$`XP$` +M5.$`0*#3`4"@PPA`C>4(``#J+T#=Y?\A`./_,%3B`3"@$P(`5>$`,*"#``!3 +MXY3__QH(0)WE"#"=Y0``4^,&```*#!"=Y0$P@>)S,._F##"-Y00`4^,(0(T5 +M>O__&@5@H.$D0)WE'`"=Y0`0H.,+(*#AW/S_ZQC`G>4`$*#C`>"@X0X``.H! +M`)3GLP"0X0``PN4!`)3GLP"0X2`$H.$!`,+E`C"#X@(@@N((`%/C]/__&@C` +MC.($$('B`@Q1XP(```H,(*#A#C"@X>W__^H0()WE``!2XPL```H8,)WE%!"= +MY0$@@^``,*#C$`"=Y2#`G>4!$-+D`Q#,YP$P@^)S$/_F`0!0X?G__XH``%OC +M!@``"@%@1N(,,)WE`2!#XH(DAN!H,)_E`""#Y04``.H!8$;B#!"=Y0$@0>*" +M)(;@4#"?Y0`@@^4`4*#C"&"@XP4`E.<&$*#A_O__ZP10A>("#%7C^?__&@0` +MH.$"'*#C_O__ZQ@`G>4!&Z#C_O__ZS30C>+PC[WHF"```+`@``#,(``````` +M```````00"WI"-!-XA#`G>440-WE``!4XPT```H``%'C!0``&@!`C>4"$*#A +M`R"@X0PPH.%._?_K)```Z@!`C>4"$*#A`R"@X0PPH.'5_O_K'@``Z@``4>,6 +M```:MA'0X0E`0>)T0/_F`0!4XP8``(H`$*#C`!"-Y0(0H.$#(*#A##"@X1W^ +M_^L0``#J#1!!XG$0_^8!`%'C#```B@`0H.,`$(WE`A"@X0,@H.$,,*#A+_W_ +MZP4``.H`$*#C`!"-Y0(0H.$#(*#A##"@X;7^_^L(T(WB$("]Z!!`+>FT-`/C +M`P"0YP``4.,0@+T('1V@X_[__^L0@+WH$$`MZ0H0H./^___K$```X@``4.,& +M`*`3!`"@`Q"`O>AP0"WI`$"@X0%@H.&V,=#A"1!#XG$0_^8!`%'C-```B@$` +M4N,I```:`!"@X_[__^L""1#C!```&@(I@.,$`*#A`!"@XW(@_^;^___K!`"@ +MX0(0H./^___K`0H0XP0``!H!*H#C!`"@X0(0H.-R(/_F_O__ZP0`H.$($*#C +M_O__ZP!0H.$B,`#B(@!3XP0```HB((#C!`"@X0@0H.-R(/_F_O__ZP$`5N-P +M@+T8!`"@X3<0H./^___K#R``X@0`H.$W$*#CL"""X_[__^MP@+WH`0!6XW"` +MO1@W$*#C_O__ZW\@`.($`*#A-Q"@X_[__^MP@+WH#3!#XG,P_^8!`%/C<("] +MB`$`4N,M```:SQ"@XVD@H./^___K!`"@X0`0H./^___K`@D0XP0``!H"*8#C +M!`"@X0`0H.-R(/_F_O__ZP0`H.$"$*#C_O__ZP$*$.,$```:`2J`XP0`H.$" +M$*#C@00"WI`$"@X0``4>,6```*`Q"@X_[__^L$ +M((#C!`"@X0,0H.-R(._F_O__ZP0`H.&`$*#C_O__ZP$@@.,$`*#A@!"@XW(@ +M[^;^___K!`"@X8(0H./^___K]R``X@0`H.&"$*#C_O__ZQ"`O>B`$*#C_O__ +MZ_X@`.($`*#A@!"@X_[__^L$`*#A@1"@XP`@H./^___K$("]Z/!/+>D,T$WB +M`'"@X0&`H.$$$(WEG6((XY=C1>.6,H;@)F.@X<2PH..;)FO@``!6XP!0H`,. +M```*`$"@XP10H.'$H*#C!P"@X0$:A.(*(*#A!#"(X/[__^L!4(7BQ$"$X@4` +M5N'V__^*Q%"@XY4&!>#$4$7B``!;XR<```K$,*#CDP8#X``PC>4'D`OBJX&P +MX1$```H!6H/B!""=Y0-`@N``8*#C"*"@XP<`H.$%$*#A"B"@X00PH.'^___K +M`6"&X@A0A>((0(3B!@!8X?7__XH>4DCB`#"=Y851@^```%GC#0``"@A@A>($ +M()WE!F""X`%:A>((4(7B`$"@XP<`H.$%$*#A!"#6Y_[__^L!0(3B`5"%X@0` +M6>'W__^*#-"-XO"/O>CP02WI`$"@X0%0H.$"8*#A`W"@X8(0H./^___K!R#` +MXP=0!>(%((+A!`"@X8(0H.-R(._F_O__ZP0`H.$&$*#A!R"@X:3__^OP@;WH +M\$$MZ0!0H.&T-`/C`T"0Y[(QU.$A`%/C`P``BO"!O1BV,=3A``!3X_"!O0@% +M`*#ASQ$`XR`@H./^___K!0"@X0,0H./^___K!``0XV-`H!,R8*`3`W"@$P0` +M`!KP@;WH`4!$XG1`[^8``%3C"```"@8`H.'^___K!0"@X0<0H.'^___K`!"@ +MX00`$./S__\:\(&]Z````.,``$#C_O__ZP4`H.$#$*#C_O__Z_L@`.(%`*#A +M`Q"@X_[__^OP@;WH\$\MZ0S03>(`0*#AM#0#XP-0D.<,`*#C_O__ZP"PH.$` +M8*#A``!0XP!`H`.K```*`#"5Y0@`$^,2```*`R"@X8`P#^,`,$#C`S`"X(`` +M4^,&```:=R`"XB``4N-T>@,3`*``$P"@0!.B```:G@``ZD(-4^-B>@,#`*`` +M`P"@0`.9```:FP``Z@$PH.,`,(#E`'"@XP>@H.$$H(;E"'"&Y;0PVN&R,<7A +M!C#:Y;8QQ>&P(-KA\#\/XP`P0.,#,`+@P"@(X\`2">,"`%/A`0!3$0$```HC +M#%/C`0``&B"@BN(@<$?B!`"@X8`0H./^___K@``0XP4```H$`*#A_O__ZP0` +MH.&`$*#C`""@X_[__^L$`*#A`1"@XP;__^NT-`/C`S"4YP`PD^4(`!/C%P`` +M"@>:H.$IFJ#A)W:PX0L```H*8*#A`%"@XP&*H.,$`*#A!1"@X08@H.$(,*#A +M9/__ZP%0A>(!:H;B!0!7X?;__XH``%GC"0``"@0`H.$'$*#A!R:*X`DPH.%9 +M___K`P``Z@0`H.$*$*#A!R"@X0O__^L$`*#A`!"@X^+^_^L$`*#A@!"@X_[_ +M_^L`8*#A`5"@XX!PH./I@P#C!@``Z@0`H.$'$*#A_O__ZP!@H.$!4(7B"`!5 +MX0,```H$`!;C]O__"OH/5>,#```Z&`&?Y080H.'^___K,0``Z@0`H.&`$*#C +M_O__ZP)0@.,$`*#A@!"@XT`@Q>/^___K`)"@XPF`H.&`8*#C!7"@XP`P`.,` +M,$#C!#"-Y0.@H.,(4*#A!`"@X080H.'^___K0``0XR@``!H'`*#A_O__Z_H/ +M5>,!4(42]?__&@0`H.$&$*#A_O__ZP`0H.$$`)WE_O__ZP``6>,.```:!`"@ +MX0H0H.'^___K`%"@X00`H.$*$*#A^R`%XO[__^L$((7C!`"@X0H0H.%R(._F +M_O__ZP&0H./=___J1`"?Y?[__^L`0*#C"0``Z@0`H.$,T(WB\(^]Z+I[`^,` +MH`#C`*!`XP$PH.,`,(;E9/__Z@%`H.,+`*#A#!"@X_[__^OQ___J4"$``*PA +M```$0"WE`0`0XP!`H!,&```:`4"@XS`TH.$!`!/C`@``&@%`A.(@`%3C^?__ +M&@0`H.$0`+WH'O\OX1[_+^$$0"WEM,0#XPQ`D.<.#%'C#0'4!0`#A``0,8`% +M$@``"@0.`.,``%'A!P``&@T!U.4``X3@%#&`Y6P(`.,``%'A``"@$P$`H`,0 +M``#J"`X`XP``4>$$```:#0'4Y0`#A.`H,8#E``"@XPT``.ILR`#C#`!1X0`` +MH!,!`*`#`0QRXPP`40$-P=0%#,.$`"PQC`7A#E'C#<'4!0S#A``8,8P%"P`` +M"A3.`.,,`%'A#<'4!0S#A``<,8P%"P``"AC.`.,,`%'A#<'4!0S#A``@,8P% +M"@``"AS.`.,,`%'A#<'4!0S#A``D,8P%"@``"H,.4>,-P=0%#,.$`#`QC`4* +M```*-,@`XPP`4>$-P=0%#,.$`#0QC`4$```*.,@`XPP`4>$-P=0%#,.$`$@Q +MC`7_`%+C`""@$P$@``(``%+C#2'4%0(CA!!,,8(5/"@`XP(`4>$-(=0%`B.$ +M`#@Q@@4+```*2"@`XP(`4>$-(=0%`D.$`#PQA`4,```*3"@`XP(`4>$-(=0% +M!2""`@(SA`<&```*:"@`XP(`4>$-(=0%`A.$`$0Q@04!((("#2'$!1``O>@> +M_R_A`0"@XQ[_+^$!`*#C'O\OX01`+>4"$$'B#@!1XP=`X(,`,`"3`#!`DP%! +MDY<"0&3@``!4XP!`H-.$0*#!=$#OQC\`5.,$`*`Q/P"@(Q``O>@>_R_A!$`M +MY0(00>(.`%'C!T#@@P`P`),`,$"3`1&#D#Q`D96B`(3@$`"]Z![_+^'P02WI +M`$"@X0&`H.&T-`/C`U"0YP(0H./H(M7E_O__ZP!PH.'I8M7E_R#5Y0(@AN`$ +M`*#A!!"@XW(@[^;^___K!P!0X0!0H*$'4*"Q!`"@X1`0H.,&(*#A_O__ZP`` +M5>$`4(BE``"(M?"!O>CP02WI`$"@X0%0H.&T-`/C`W"0YP(0H.,%(*#AP/__ +MZP!@H.$$`*#A$!"@XP4@H.&[___K`$"@X?\PU^4`(&/@``!2XP!`H-,$0&/` +M=$#OQ@!0H.,[8,?ED8T$WB#""- +MY00PC>6T-`/C`T"0YP`P`.,`,$#CN#?3X;0QS>$`,)3E=S`#XB``4^,`,*`3 +M`3"@`P@PC>4``%/C"'"@$P1PH`."@H'@!`"=Y8"B@>``,*#C`<"@XP-@H.$# +M0*#A#)"@X0-0H.$#()CG`P":YP``4N$"0&#``$!BT`4`5.,8``":!@!5XP(` +M51,4```:``!6XQ(``!H,L:#A"T"8YP0@@N```%+C!```&A@`C>(E(8#@!`"= +MY00`0N4)``#J"R":YP(@@.```%+C&`"-`B4A@``,`)T%!`!"!1EEAA$```#J +M&66&X0%0A>(!P(SB!#"#X@4`5^':__^*``!6XQT``!HG<;#A`4"@`S(```H" +MP*#C`4"@XP!0H.,4@(WB!6"@X04@V.?_`%+C#0``"@5!H.$$`%SA"0``FH(B +M@>`$,:#A`R""X`,P@>`$`)+D8`"#Y0%`A.($,(/B!`!4`,*`3`3`"`@``4^,&```*$""!XA`PF.5P +M,('E!("(X@00@>("`%'A^?__&@!`H.,$`*#A&-"-XO`/O>@>_R_A'O\OX7!` +M+>D`8*#A`4"@X0)0H.$`$)'E/R"@X_[__^L$(-7E!@"@X000E.7W(`+B_O__ +MZP@@U>4&`*#A"!"4Y?<@`N+^___K#"#5Y08`H.$,$)3EWR`"XO[__^MP@+WH +M\$$MZ0!@H.&T-`/C`W"0YP"`E^5W@`CB`$``XP!`0.,K7H3B!@"@X0`0E.4$ +M(-3E_O__ZPA`A.(%`%3A^/__&@8`H.'*%`#C"B"@X_[__^L@`%CC!@``&BLP +MU^4``%/C`P``&@8`H.%`$*#C!""@X_[__^L!`*#C\(&]Z/!!+>D`4*#A`6"@ +MX0)PH.$`0*#C!0"@X000EN?^___K!`"'YP1`A.(,`%3C^/__&@4`H.$,$);E +M_O__ZPP`A^7P@;WH<$`MZ0)`H.'^___K`%"@X00`H.%+_O_K!$`%X#0`H.%P +M@+WH\$]Z'!`+>D`4*#AM#0# +MXP-`D.?%'J#C_R"@X_[__^L)`<3E!0"@X5@<`./_(*#C_O__ZPH!Q.4%`*#A +MQAZ@X_\@H./^___K"P'$Y04`H.%H'`#C_R"@X_[__^L,`<3E!0"@X3@<`./_ +M(*#C_O__ZP`!Q.4%`*#A-!P`XP`@X./^___K!`&$Y7"`O>CP02WI`%"@X0%@ +MH.$"<*#A`$"@XP4`H.$$$);G!"#7Y_[__^L$0(3B#`!4X_C__QH%`*#A#!"6 +MY0P@E^7^___K\(&]Z/!!+>D`<*#A`8"@X0)`H.$#8*#A`0!RXP4```K^___K +M`%"@X00`H.'W_?_K!$#%X19@A.$'`*#A"!"@X08@H.'^___K\(&]Z!!`+>D` +M0*#A"!D`X_\O#^,`,*#C_O__ZP0`H.$(&0#C_R\/XP,X`./^___K!`"@X0@9 +M`./_+P_C!CH`X_[__^L$`*#A"!D`X_\O#^,',*#C_O__ZP0`H.$(&0#C_R\/ +MXP$\H./^___K!`"@X2@:`./_**#C#SB@X_[__^L$`*#A"!D`X_\O#^,!/*#C +M_O__ZP0`H.$H&@#C_RB@XQ4XH./^___K$("]Z'!`+>D`0*#A`6"@X0)0H.&= +M-0/C`S#0YP``4^,,```:3A"@X_[__^N`+.#AHBS@X00`H.%.$*#C!@`XP(JH.,!,*#C_O__ZP``5>,-```*``!6XP4```H$`*#A9!@` +MXV`@H.,!,*#C_O__ZW"`O>@$`*#A9!@`XV`@H.,",*#C_O__ZW"`O>@``%;C +M!0``"@0`H.&&'J#C`RR@XP(PH./^___K<("]Z`0`H.&&'J#C`RR@XP$PH./^ +M___K<("]Z!!`+>FT-`/C`S"0YP`PD^5W,`/B(`!3XP(``!H!(*#CP___ZQ"` +MO>@`(*#CP/__ZQ"`O>CP1RWI`*"@X0&`H.$"<*#A`&!3XO"'O0@`0*#C!%"@ +MX0"0X.,*`*#A!!"8YPD@H.$$,)?G_O__ZP%0A>($0(3B!0!6X?;__XKPA[WH +M\$$MZ0!PH.$!8*#A``!2XZ15`@,;6T`#I%4"$]M40!,``%/C!P``&@`0D>4` +M(.#CH#4"XQL[0./^___KH%4"X]M;0.,#``#J`!"1Y0`@X.,%,*#A_O__ZP%` +MH.,`@.#C!P"@X001EN<((*#A!3"@X?[__^L!0(3B$`!4X_?__QKP@;WH<$`M +MZ0!0H.$``%'C`$$`XP!!0.,!1*`#@AZ@XP`@X.,$,*#A_O__ZP4`H.$H&`#C +M`"#@XP0PH.'^___K<("]Z/!/+>F(/`)/H#P",Z"3`C>+,4(7B#P"UZ`\`K.@/`+7H#P"L +MZ``PE>4`,(SE`("6Y=B!X.<$()WE``!2XR```!H$`*#A`AN@XP`@X./^___K +M6%"-X@0`H.$%$*#A4BZ&X@@@@N(0,*#CR?[_ZP0`H.%($(WB5BZ&X@@@@N*J +M_O_K!`"@X200C>)9+H;B#"""X@DPH..^_O_K!`"@X040H.$!(*#C!S"@X8[_ +M_^L$`*#A@AZ@XP$LH./^___K[03&Y00``.H$`*#A6!"-X@$@H.,',*#A@___ +MZ^TTUN4``%/C`@``&@0`H.$!$*#CGO__ZP0`H.$"&Z#C`22@XP`PH./^___K +M!`"@X00<`.,`(.#C`#8%XZ`S0./^___K!`"@X0@<`.,`(.#CY#``XP@P0./^ +M___K!`"@X708`.,`(.#C`#`$XR`R0N/^___K!`"@X8<>H.,!*Z#C`3"@X_[_ +M_^L$`*#AAQZ@XP$CH.,!,*#C_O__ZP0`H.&&'J#C`2N@XP`PH./^___K!`"@ +MX608`.,!*Z#C`#"@X_[__^L``%?C"0``"@0`H.$A':#C`"#@XP$XH./^___K +M!`"@X408`.,`(.#C`3B@X_[__^M6OH;B"+"+X@0`H.%($(WB"R"@X1O^_^L` +M`%CC!0``"@0`H.%H&P#C`"#@XP(WH./^___K!```Z@0`H.%H&P#C`"#@X_8V +MH./^___K``!7XPP```H``%CC!0``"@0`H.%L&P#C`"#@XP(WH./^___K!``` +MZ@0`H.%L&P#C`"#@X_8VH./^___K!`"@X2@>`.,`(.#C`#``XX`P2./^___K +M!`"@X3D=H.,`(.#C`#P'XP`Q0./^___K!`"@X40>`.,`(.#C`#@$XP`Q0./^ +M___K!#"=Y8.BBN``@*#C'YP(XP"00>,"-0#C%CA"XQ@PC>4",@#C%CA"XPPP +MC>4`,`#C`#!`XQPPC>4$4*#A!0"@X>,>H.,`(.#C"3"@X?[__^L%`*#A-!X` +MXP`@X.,),*#A_O__ZP4`H.$X'@#C`"#@XP(Q`.,4,DCC_O__ZP``5^,G`0`* +M!0"@X3P>`.,`(.#C##"=Y?[__^LB3`CC`$!!XP4`H.'E'J#C`"#@XP0PH.'^ +M___K!0"@X50>`.,`(.#C!#"@X?[__^L%`*#A6!X`XP`@X.,",0#C%#)(X_[_ +M_^L%`*#A7!X`XP`@X.,,,)WE_O__ZP4`H.%,'@#C`"#@X]$X`N,0,$#C_O__ +MZP4`H.%('@#C`"#@X_DTH./^___K!0"@X4@>`.,`(.#C/C.@X_[__^OZ#Z#C +M_O__ZP4`H.&L'@#C`"#@X_[__^L`0*#A!0"@X90>`.,`(.#C_O__ZP@`C>4% +M`*#AG!X`XP`@X./^___K$`"-Y04`H.&D'@#C`"#@X_[__^L4`(WE`0(4XR0` +M`!H(,)WE4RCIYT(Q`.,#`%+A'P``"A`@G>52..GG0@!3XQL```H"`Q3C!@`` +M&E`HZ>,!```:S`.?Y?[__^L``%?C>```"@0`H.$H'@#C`"#@XP`PH./^___K!`"@ +MX2$=H.,`(.#C`3B@X_[__^L$`*#A*!X`XP`@X.,`,`#C@#!(X_[__^L$`*#A +M6!"-X@`@H.,',*#A9O[_ZP"`H.,`4`#C_U-`XP`P`.,`,$#C&#"-Y0`P`.,` +M,$#C'#"-Y0J0H.$$`*#AYAZ@XP`@X.,",*#C_O__ZP0`H.'F'J#C`"#@XP`P +MH./^___K^@^@X_[__^L$`*#AK!X`XP`@X./^___K`*"@X00`H.&T'@#C`"#@ +MX_[__^L(`(WE!`"@X;P>`.,`(.#C_O__ZPP`C>4$`*#AQ!X`XP`@X./^___K +M$`"-Y00`H.','@#C`"#@X_[__^L4`(WE``!:XRD``+H(()WE!3`"X$(A`.,C +M"%+A)```"@P@G>4%,`+@0@A3XR````H!`1KC!P``&A`@G>4%,`+@,B$`XR,( +M4N$"```*!3``X#8(4^-X```:&`"=Y?[__^L!`%CC`:"@$Q(``!H<`)WE_O__ +MZP0`H.&T'@#C`"#@X_[__^L%,`#@(SB@X1`PB>4$`*#AO!X`XP`@X./^___K +M!3``X",XH.$4,(GE`:"@XP```.H`H*#C`8"(X@(`6..J__\:"I"@X0``6N,! +M```:Y`&?Y?[__^L$`*#A*!X`XP`@X.,`,*#C_O__ZP0PG>4``%/C;0``"NTT +MUN4``%/C`@``&@0`H.$`$*#C%?[_ZP0`H.%8$(WB4BZ&X@@@@N(0,*#CV_W_ +MZP0`H.%($(WB"R"@X4K]_^L$`*#A)!"-XEDNAN(,((+B"3"@X]']_^L$`*#A +M(1V@XP`@X./3/@+C`S!`X_[__^L``%?C!0``"@0`H.%$&`#C`"#@X],^`N,# +M,$#C_O__ZP!<".,`44#C!`"@X>,>H.,`(.#C!3"@X?[__^L$`*#A-!X`XP`@ +MX.,%,*#A_O__ZSP``.H%`*#A/!X`XP`@X.,8,)WE_O__Z^W^_^H%0*#A!0"@ +MX90>`.,`(.#C_O__ZU`(Z><``(KE!0"@X9P>`.,`(.#C_O__ZU`(Z><$`(KE +M!0"@X:0>`.,`(.#C_O__ZU`(Z><(`(KE!0"@X:P>`.,`(.#C_O__ZU`(Z><, +M`(KE*___Z@F@H.$```#C``!`X_[__^L$`*#AM!X`XP`@X./^___K4`CIYQ`` +MB>4$`*#AO!X`XP`@X./^___K4`CIYQ0`B>4$`*#AQ!X`XP`@X./^___K4`CI +MYQ@`B>4$`*#AS!X`XP`@X./^___K4`CIYQP`B>6)___JG-"-XO"/O>C<(0`` +M+"(``/!/+>FTT$WB`*"@X0%`H.&T-`/C`V"0YXS`C>*$Y)_E#P"^Z`\`K.@/ +M`+[H#P"LZ``PGN4`,(SE``!4XP8```H*`*#AC!"-XE^__K``!0XQ<``!H*`*#A#!"-X@$@H.,",*#CE_O_ +MZP``4.,!4*`3$```&@!`H.-@,)7E`T"$X`10A>(%`%GA^O__&@``5./_4*`# +M`U"@$P8``.H!0(3B=$#OY@(`5./&__^:_U"@XP```.H`4*#C;'"=Y72PG>5\ +M@)WEA`"=Y0``C>7_`%7C$P``"J,PX..P$(WBA2*!X`-PDN?8=8;E!!""X@,0 +MD>?<%8;E"!""X@.PD><0$(+B`X"1Y^"%AN60,!+EY#6&Y8P@$N4`((WE`9"@ +MXPE`H.$&``#J`3R@X^`UAN78-8;E`)"@X^25AN7*% +M60!`3@"@"@X3(=H./_(P#C)#2@X?[_ +M_^L*`*#A3!P`XP(AH./4,^#G_O__ZP1`E^4"#!3C!$O@$21+X!$$$)WED00$ +MX`1`C>4D1*#A"@"@X90<`.,/(J#C5#/CY_[__^L*`*#A,AV@XS\HH.,_,`3B +M_O__ZPH`H.%,'`#C`B*@XP3`G>7<,^#G_O__ZP``6^,"```:M`&?Y?[__^L0 +M``#J"@"@X10<`./_(P#C"#"7Y?[__^L,,)?E"@"@X10<`.,_*Z#C/S`#XO[_ +M_^L,,)?E"@"@XH.,/(J#C4S/CY_[__^L`,);E=S`#XB``4^--```:``!8 +MXTL```H``%GC`!```P`00`,`$``3`!!`$P```.,``$#C_O__Z_\`5>-!```* +M``!9XS\```H*`*#AB!P`XP`@X./^___K('N@X0PPC>*%4H/@$$"5Y0(,%.,$ +M2^`1)$O@$9<$!.`*`*#AB!P`X_\C`.,D-*#A_O__ZPH`H.%,'`#C`B.@X]0S +MX.?^___K%$"5Y0(,%.,$2^`1)$O@$9<$!^`G1*#A"@"@X9P<`.,/(J#C5#/C +MY_[__^L*`*#AB!P`XS\HH.,_,`3B_O__ZPH`H.%,'`#C`B2@X]7^___K'#"5Y0H`H.$$ +M$*#A/RN@XS\P`^+^___K'#"5Y0H`H.%X'`#C#RJ@XU,SX^?^___K"@"@X8P0 +MC>)7+H;B""""X@DPH..+^__KM-"-XO"/O>AL%@``7"(``/A/+>D`4*#AM#0# +MXP-`D.<`,)3E=S`#XB``4^,/```:`#"4Y0@`$^,(```**S#4Y0(`4^,E```: +M=H$`XP!``.,`0$#C`&``XP!@0.,D``#JH`&?Y?[__^L``*#C^(^]Z``PE.4( +M`!/C%```"BLPU.4"`%/C!0``&G:!`.,`0`#C`$!`XP!@`.,`8$#C%```Z@$` +M4^-Z@0`#`$```P!`0`,`8``#`&!``W:!`!,`0``3`$!`$P!@`!,`8$`3"``` +MZC`!G^7^___K``"@X_B/O>AV@0#C`$``XP!`0.,`8`#C`&!`XP``4>,Q```: +M``!8XSX``-H&0*#A`&"@XP%PH.,%L*#C,I"@XP"@X.,`,)3E_@!3XP(``!H) +M`*#A_O__ZQ<``.K]`%/C`@``&@L`H.'^___K$@``ZOP`4^,"```:!P"@X?[_ +M_^L-``#J^P!3XP(``!H)`*#A_O__ZP@``.KZ`%/C`@``&@L`H.'^___K`P`` +MZOD`4^,!```:!P"@X?[__^L%`*#A`!"4Y0H@H.$$,)3E_O__ZP<`H.'^___K +M`F"&X@A`A.(&`%CAUO__R@X``.H!`%'C#```&@5LA.(`<.#C`8"@XP4`H.$` +M$)3E!R"@X00PE.7^___K"`"@X?[__^L(0(3B!@!4X?7__QH!`*#C^(^]Z*PB +M``#P1RWI`&"@X0%`H.&T-`/C`Z"0YS^0`N(D&`#C`"#@X_[__^L`<*#A``!4 +MXP!0H`$&```*A#&$X(,QBN`&`*#A#!.3Y0`@X./^___K`%"@X7]4Q>,"5<7C +M`H''XP8`H.$D&`#C`"#@XP@PH.'^___K"@"@X_[__^N$,83@@S&*X(E;A>$& +M`*#A#!.3Y0`@X.,",87C_O__ZV0`H./^___K!@"@X208`.,`(.#C`C&'X_[_ +M_^L*`*#C_O__ZP8`H.$D&`#C`"#@XP@PH.'^___K"@"@X_[__^L``%3C!0`` +M&@8`H.&"'J#C`2R@X_[__^MP4._F!@``Z@$`5.,/```:!@"@X2@8`.,!+*#C +M_O__ZW!0[^8``%7C"```"H1!A."$H8K@!@"@X3`3FN7_+P_C#R!`X_[__^L` +M0*#A!P``ZH1!A."$H8K@!@"@X2P3FN7_+P_C#R!`X_[__^L`0*#A!`"@X?"' +MO>CP1RWI`&"@X0%`H.$"@*#A`W"@X2"@G>7_/P_C#S!`XP,`5^$%```*FO__ +MZP!0H.$'`*#AZ?C_ZP=0Q>$:H(7AM#0#XP,PEN>$083@A$&#X/^DRN,/ILKC +M/S`(X@8`H.'\$I3E`"#@XP,ZBN'^___K\(>]Z'!`+>D#0*#AA?__ZP!0H.$$ +M`*#AU/C_ZP1`!>`T`*#A<("]Z/!/+>FYWTWB`$"@X0P0C>4"L*#AM#0#XP,P +MD.<<,(WE`&``XP!@0..FSXWB1>^&X@\`ON@/`*SH#P">Z`\`C.@`4*#C"CV- +MX@10@^0$4(/D!%"#Y`10@^0$4(/D`%"#Y2`PH.-X,HWE,#0%XZ`P0.-\,HWE +M@3>@XX`RC>7D,`#C"#!`XX0RC>6!.:#CB#*-Y7[/C>)-[X;B#P"^Z`\`K.@/ +M`+[H#P"LZ`\`ON@/`*SH#P">Z`\`C.AVSXWB73^&X@\`D^@/`(SH0'"@XV8/ +MC>(%$*#A!R"@X?[__^LL-0CCF#&-Y2PE".,!($#CG"&-Y2PU".,%,$#CH#&- +MY:0AC>6H,8WE+C4(XP(P0..X,8WE+C4(X[PQC>4N)0CC`R!`X\`AC>7$,8WE +MR#&-Y58/C>(%$*#A!R"@X?[__^L9,`+C!3!`XU@QC>44(`+C!2!`XUPAC>43 +M(`+C!2!`XV`AC>4/(`+C!2!`XV0AC>6-(`+C!2!`XV@AC>4:(`+C!2!`XW@A +MC>5\,8WE%C`"XP4P0..`,8WE,S`"XP4P0..$,8WE4#`"XP4P0..(,8WE1@^- +MX@40H.$'(*#A_O__Z[`]"N,!,$#C&#&-Y1PQC>6@/0KC`3!`XR`QC>60/0KC +M`3!`XR0QC>6`/0KC`3!`XR@QC>7[/J#C.#&-Y3PQC>7Z/J#C0#&-Y?D^H.-$ +M,8WE/CV@XT@QC>41/HWB82^&X@,`DN@#`(/H0C^-XF-OAN(#`);H`P"#Z*`` +MC>(%$*#A:""@X_[__^L#H.#CH*#-Y0*`X..A@,WE`2#@XZ(@S>6C(,WE`##@ +MXZ0PS>6E,,WE`7"@XZ=PS>4"8*#CJ&#-Y0-0H..I4,WE!,"@XZK`S>4%`*#C +MJP#-Y080H..L$,WEK:#-Y:Z`S>6O(,WEL"#-Y;$PS>6R,,WEM'#-Y;5@S>6V +M4,WEM\#-Y;@`S>6Y$,WE!9#@X[J0S>6[H,WEO"#-Y;T@S>6^,,WEOS#-Y<%P +MS>7"8,WEPU#-Y<3`S>7%`,WEQA#-Y<7(,,WER3#-Y7+,,WES##- +MY7/8,WET%#-Y='`S>72`,WETQ#-Y0H@X./4(,WE""#@X]4@S>4&(.#C +MUB#-Y00@X./7(,WEV(#-Y=DPS>4<()WE`#"2Y0``6^,"P*`3!\"@`3C`C>4( +M`!/CQ0$`&@0`H.%H&P#C`"#@X_XVH./^___K``!;XP0```H$`*#A:!L`XP`@ +MX./^-J#C_O__ZP!@H..F?XWB`(#@XZY?C>($`*#A!A"7YP@@H.'^___K!@"% +MYP1@AN(@`%;C]___&@0`H.%V'XWB>B^-XG3Y_^L$`*#A?A^-XHXOC>(0,*#C +MB?G_ZS@@G>4``%+C+@$`"@PPG>4.4(/BQ5"@X0P`5>,,4*"C0,"-XC3`C>5N +M+XWB,""-Y0`PH.,0,(WE##"-Y:`PC>(``%7C!3"#H#PPC>4`P`#C_,))XQ3` +MC>4$`*#A#!"=Y0X@H.,`,.#C_O__Z]`WY.4,`(/G +M$3Z-X@QPD^<`8*#C?E^-X@"`X.,$`*#A!A"5YP@@H.$',*#A_O__ZP1@AN)` +M`%;C]___&@P@G>4``%+C.@``&@!@H.,&4*#AIG^-X@&KH.,&D*#A`(0`XP"$ +M0.,`L.#C!`!5XP8``(H$`*#A!A"7YPL@H.&>SXWB!C",&```:KB^-X@8PDN<$`*#A"R"@X0,PB.'^___K`P``Z@0`H.$*(*#A +M"3"@X?[__^L!4(7B!&"&X@@`5>/D__\:`%P(XP!10.,$`*#AXQZ@XP`@X.,% +M,*#A_O__ZP0`H.$T'@#C`"#@XP4PH.'^___K!`"@X78?C>)Z+XWBROC_ZP$X +MH.,`,(WE!`"@X0$0H.,`(*#C`##@X_[__^LF``#J`%P(XP!10.,$`*#AY1Z@ +MXP`@X.,%,*#A_O__ZP0`H.%4'@#C`"#@XP4PH.'^___K!`"@X78?C>)Z+XWB +MLOC_ZP$XH.,`,(WE!`"@X0`0H.,!(*#A`##@X_[__^L/,`#C`3!`XP`PC>4$ +M`*#A`!"@XQ`@H.,`,.#C_O__ZP,Q`.,",$#C`#"-Y00`H.$`$*#C$2"@XP`P +MX./^___K#,"=Y8PRH.%F+XWB`R""X!@@C>5@((WB`R""X"P@C>56+XWB`R"" +MX"@@C>5&+XWB`R""X"0@C>4\()WE(""-Y2BN`.,$4*#A&#"=Y0!`D^44%`*#A#!"=Y0P@H.,`,.#C_O__ZRC` +MG>4`,)SE`#"-Y04`H.$,$)WE`""@XP`PX./^___K`$"-Y04`H.$,$)WE#2"@ +MXP`PX./^___K)""=Y0`PDN4`,(WE!0"@X0P0G>4*(*#C`##@X_[__^L`8*#C +M`$#@XP*QH.,#@*#C`)``X_R20>,%`*#A"A"@X00@H.$+,*#A_O__ZT+/C>(0 +M,)WE`W"7^___K"`"@X?[__^L%`*#A!Q"@X00@ +MH.$),*#A_O__ZP@`H.'^___K!0"@X0H0H.$$(*#A`#"@X_[__^L%`*#A#!"= +MY0L@H.,$,*#A_O__Z]!TY.4$<(+D+""-Y1@PG>4$,(/B&#"-Y2C`G>4$P(SB*,"-Y20@G>4$ +M((+B)""-Y2`PG>4-,(/B(#"-Y3#`G>48()WE`@!4"`%SAX_[_B@0`H.%V'XWB>B^-XHCX_^L`8*#CIG^-XJY?C>(`@.#C +M!`"@X080E^<((*#A!C"5Y_[__^L$8(;B(`!6X_?__QH$`*#A?A^-XHXOC>(0 +M,*#C!/G_ZS@PG>4``%/C1P``&D(``.H&,9?G`#"-Y04`H.$&$*#A#2"@XP`P +MX./^___K`0!6XPP``!H`L(WE!0"@X0@0H.$0(*#C`##@X_[__^L,P)WE`,"- +MY04`H.$($*#A$2"@XP`PX./^___KAC**X`8BB>`(0*#A`!"3Y0P`4>,$$!*% +M`!"#A0%`A.($,(/B!"""X@@`5./V__\:`6"&XC@@G>4&`%+AV?__B@5`H.%H +M4(WB'&"=Y0!PH.,.@*#C`*#@XP*0H.$,`)7H@S*@X0(E@^$(,)7E`R""X0@P +M%>6#-X+A\#2&Y000%>6!)X+A]"2&Y0`PC>4$`*#A!Q"@X0@@H.$*,*#A_O__ +MZP%PA^(@4(7B"&"&X@<`6>'I__^*`3"@XQS`G>4`-4`4(WE +M!`"@X0`0H.,-(*#C`##@X_[__^L`8*#C8*"-XD"0C>(&@*#AMG^-X@^P`.,! +ML$#C`3$`XP(P0.,,,(WE!%"@X;O__^JYWXWB\(^]Z!!`+>FT-`/C`T"0YP`U +MU.4``%/C$("]&``PE.5W,`/B(`!3XP(``!H!(*#C3?W_ZQ"`O>@`(*#C2OW_ +MZQ"`O>CP3RWI#-!-X@!`H.$!@*#AM#0#XP,PD.<`8)/E"&`&X@,=`./^___K +M`%"@X7!P$.(,```*!`"@X0,=`../(`7B_O__ZP0`H.$`$*#C`2"@X?\_`./^ +M___K`*"@X0``6.,@```*!@``Z@0`H.$B%0#C_R"@X_[__^L`D*#C":"@X2(` +M`.H$`*#A`1"@XP`@H./_/P#C_O__ZP"0H.'_OP_C"+!`XPLP"N`!.(/C`#"- +MY00`H.$`$*#C`2"@X?\_`./^___K"[`)X`&XB^,`L(WE!`"@X0$0H.,`(*#C +M_S\`X_[__^L)``#J_S3`X_4$`*#A`!"@XQ@@ +MH./_/P#C_O__ZP``5N,"```*9`"@X_[__^L!``#J`P"@X_[__^L``%?C$@`` +M"@0`H.$#'0#C!2"@X?[__^L`H(WE!`"@X0`0H.,!(*#A_S\`X_[__^L``%CC +M"@``"@"0C>4$`*#A`1"@XP`@H./_/P#C_O__ZP,``.H$`*#A(A4`XP`@H./^ +M___K#-"-XO"/O>@00"WIM#0#XP,PD.<`,)/E=S`#XB``4^,"```:`1"@XX3_ +M_^L0@+WH`!"@XX'__^L0@+WH\$\MZ3303>(`H*#A`8"@X0@@C>40P(WB(#&? +MY0\`D^@/`(SH`3R@XR`PC>4)/*#C)#"-Y0([H.,H,(WE`S"@XRPPC>4`0*#C +M!&"@X0&PH.,,<*#A_Y\/XP^00.,P((WB"#&"X!`P0^(,,(WE!%"@X0,`6.,( +M\9^7`P``ZI@)`@`<"0(`'`D"`$@)`@``L*#C'@``Z@PPG>4`0)/E"@"@X000 +MH.$%()?G_O__ZPH`H.$$$*#A_O__ZP!@H.$3``#J!3"7YP,ZH.$C.J#A!3"' +MYP`PC>4*`*#A"!"=Y0,@H.,),*#A_O__ZPH`H./^___K"@"@X0@0G>4#(*#C +M`##@X_[__^L`8*#A"@"@X_[__^L%0)?G!@!4X00``!H$4(7B$`!5XP(```H$ +M8*#AS___Z@"PH.,+`*#A--"-XO"/O>@0%P``\$\MZ0S03>(`<*#AM#0#XP-` +MD.<`,)3E=S`#XB``4^,(```:`#"4Y0@`$^.)```*3F"@XP!0`.,`4$#C`$`` +MXP!`0.,6``#J`#"4Y0@`$^.````**S#4Y0(`4^,%```:`6"@XP!0`.,`4$#C +M`$``XP!`0.,*``#J`0!3XP%@H`,`4``#`%!``P!```,`0$`#`6"@$P!0`!,` +M4$`3`$``$P!`0!,``%'C!```"@$`4>-J```:``!6XS,``,IG``#J1EZ$X@A0 +MA>+_CP_C#X!`XP"@H.,!8*#C!;"@XS*0H.,`()3E_@!2XP(``!H)`*#A_O__ +MZR```.K]`%+C`@``&@L`H.'^___K&P``ZOP`4N,"```:!@"@X?[__^L6``#J +M^P!2XP(``!H)`*#A_O__ZQ$``.KZ`%+C`@``&@L`H.'^___K#```ZOD`4N," +M```:!@"@X?[__^L'``#J!#"4Y0`PC>4'`*#A"A"@X0@PH.'^___K!@"@X?[_ +M_^L(0(3B!0!4X=7__QHT``#J!4"@X0!0H./_KP_C#Z!`XP&`H.,%L*#C,I"@ +MXP`@E.7^`%+C`@``&@D`H.'^___K(```ZOT`4N,"```:"P"@X?[__^L;``#J +M_`!2XP(``!H(`*#A_O__ZQ8``.K[`%+C`@``&@D`H.'^___K$0``ZOH`4N," +M```:"P"@X?[__^L,``#J^0!2XP(``!H(`*#A_O__ZP<``.H$,)3E`#"-Y0<` +MH.$($*#A"C"@X?[__^L(`*#A_O__ZP)0A>((0(3B!0!6X=3__\H!``#J`$"@ +MXP```.H!0*#C!`"@X0S0C>+PC[WH\$$MZ0!0H.&T-`/C`T"0YR!@E.4@$(3E +M)2#$Y8@U`^,#,)#G``!3XV<``!J,-0/C`S"0YP``4^-C```:M#0#XP-`D.(`0*#A`6"@X;0T`^,#4)#G.##5Y0``4^,?```*`2!!XG(@[^8",(7@.Q#3 +MY000S>5),-/E!3#-Y;0T`^,#,)#G*3#3Y0,`4^,``%,3!0``&@)0A>!7,-7E +M`##-Y64PU>4!,,WE!0``Z@(`4^,"4(4`D(T$WB`&"@X0%0 +MH.&T-`/C`T"0YR1PU.4H,-3E!0!3XRH```H``%'C`5"@`R10Q.6(-0/C`S"0 +MYP``4^,B```:C#4#XP,PD.<``%/C'@``&K0T`^,#<)#G!1"@X?[__^L%H*#A +M*C#7Y0``4^,7```*`$"@XP!<#^/_7T_C_X\/XP^`0.,8D*#C02^$X@(QE^<# +M,`7@"C"#X0(QA^<`,(WE!@"@X000H.$)(*#A"#"@X?[__^L!0(3B=$#OYBHP +MU^4$`%/A[___B@```.HD<,3E"-"-XO"'O>@00"WI_O__ZQ"`O>CX3RWI`&"@ +MX;0T`^,#4)#GASZ@X^PRA>4T,X7E=#@`XWPSA>7$,X7ECCZ@X_`RA>4X,X7E +MY#@`XX`SA>7(,X7EABZ@X_0BA>5D.`#C/#.%Y?@BA>5`,X7E(3V@X_PRA>5$ +M.`#C1#.%Y7@X`.,`,X7E2#.%Y7PX`..0,X7EV#.%Y0PX`.,$,X7E3#.%Y90S +MA>7<,X7E@CZ@XP@SA>4H.`#C4#.%Y20X`.,,,X7E+#@`XU0SA>58.`#C$#.% +MY5@SA>5<.`#CH#.%Y>@SA>7%/J#C%#.%Y5@\`.-<,X7EQCZ@XZ0SA>5H/`#C +M[#.%Y50\`.,8,X7E7#P`XV`SA>5D/`#CJ#.%Y6P\`./P,X7E%#P`XQPSA>4< +M/`#C9#.%Y20\`..L,X7E+#P`X_0SA>7!/J#C(#.%Y1@\`.-H,X7EPCZ@X[`S +MA>4H/`#C^#.%Y3(]H.,D,X7EB#P`XVPSA>7)/J#CM#.%Y9@\`./\,X7EA#P` +MXR@SA>6,/`#C<#.%Y90\`..X,X7EG#P`XP`TA>6*/J#C+#.%Y:0X`.-T,X7E +MJ#@`X[PSA>6L.`#C!#2%Y;@X`.,P,X7EO#@`XW@SA>6V,=#A#3!#XG,P_^8! +M`%/C+```BB@0H./^___K`$"@X0(`H./^___K`B"$XP8`H.$H$*#C4(`!/C!```&@8`H.$B$*#C'R"@X_[__^L'``#J +M!@"@X2(0H.,/(*#C_O__ZP8`H.$5$*#CZ2"@X_[__^L&`*#A)1"@XX`@H./^ +M___KM#0#XP-PEN<&`*#A`!"@XS+Y_^L`0*#A`0!0XX(``!H'L*#A*3#7Y0`` +M4^,U```:!@"@X008`.,#(*#C`C"#XO[__^L&`*#A#!D`XS,@`.,P($#C(C`` +MXR`P0./^___K!@"@X00:`./_)*#C13"@X_[__^L&`*#A!!P`X_\@H.,C,*#C +M_O__ZP8`H.'''J#C,""@XP$PH./^___K!@"@X70>`.,#(Z#C`C"@X_[__^L& +M`*#A>!X`XP,CH.,",*#C_O__ZP8`H.%\'@#C`R.@XP(PH./^___K!@"@X3H= +MH.,#(Z#C`C"@X_[__^L&`*#AB!X`XP,CH.,",*#C_O__Z^@!G^7^___KX#(# +MXP,PUN<``%/C.0``&@TQR^6T-`/C`T"6YP`PE.4(`!/C!0``"BLPU.4!`%/C +M`$```P!`0`,$```:!0``ZJ0!G^7^___K`$"@XS0``.H`0`#C`$!`XQ5]A.(! +MD*#C!:"@XS*`H.,`,)3E_@!3XP(``!H(`*#A_O__ZQ<``.K]`%/C`@``&@H` +MH.'^___K$@``ZOP`4^,"```:"0"@X?[__^L-``#J^P!3XP(``!H(`*#A_O__ +MZP@``.KZ`%/C`@``&@H`H.'^___K`P``ZOD`4^,!```:"0"@X?[__^L&`*#A +M#@"4Z/[__^L,0(3B!P!4X=O__QH&`*#A`1"@X[3X_^L`0*#A`0!0XP0``!H& +M`*#A)!@`XP(LH./^___K&`3+Y;8QUN$*`%/C#```&@`@E>6`,`_C`#!`XP,P +M`N!"#5/C!@``&BLPU>4!`%/C(@``&@8`H.%R'`#C4""@X_[__^NV,=;A#3!# +MXG,P_^8!`%/C&0``B@`PE>4(`!/C%@``&@8`H.%`$*#C_O__ZP0@@.,&`*#A +M0!"@XW(@[^;^___K!@"@X008`.,!*:#C`#"@X_[__^L&`*#AAQZ@XV`@H.,# +M,*#C_O__ZP8`H.&&'J#C8""@XP`PH./^___K!`"@X?B/O>CL(@``'",``![_ +M+^$`,`#C`#!`XP$38>`"(('@@@&3YQ[_+^$```#C``!`XP$38>`"$('@_S3# +MXP\VP^.!,8#G@1&`X`$PH.,',,'E'O\OX0```.,``$#C`1-AX`(0@>"!`8#@ +M!##`Y1[_+^$```#C``!`XP$38>`"$('@@0&`X`8PP.4>_R_A\$$MZ0!@H.$` +M4*#C!7"@X0&`H.,3``#J)C!$X@$`4^,%``":!@"@X040H.$$(*#A!S"@X?[_ +M_^L$``#J!@"@X040H.$$(*#A"#"@X?[__^L!0(3B0`!4X^[__QH!4(7B`@!5 +MX_"!O0@'0*#AZ?__ZO!!+>D`8*#A`%"@XP5PH.$!@*#C$P``ZB8P1.(!`%/C +M!0``F@8`H.$%$*#A!""@X0/P@;T(!T"@X>G__^IP`"WI`&"@XP`@ +M`.,`($#C!D"@X0L``.H`0(/E!$##Y09`P^4%0,/E!T##Y0%0A>((,(/B0`!5 +MX_;__QH!8(;B`@!6XP0```J&-*#AAC%#X`,P@N`$4*#A[O__ZG``O>@>_R_A +M!.`MY0S03>(`,`#C`#!`XP'#8>`"P(S@C#&#X`4PT^4!`%/C$```&@`P`.,` +M,$#C`<-AX`+`C.",,8/@!C#3Y0$`4^,(```:`#``XP`P0.,!PV'@`L",X(PQ +MD^<`,(WE_S\/XP\P0./^___K#-"-X@"`O>CP02WI`&"@X0!0H.,%<*#A"0`` +MZ@8`H.$%$*#A!""@X?[__^L!0(3B0`!4X_C__QH!4(7B`@!5X_"!O0@'0*#A +M\___ZA!`+>D(T$WBM#0#XP-`D.<``%'C`@``"@$`4>,4```:"@``ZA`TE.4# +M.\/C`3N#XQ`TA.4`,(WE`!"@XQ@@H./_/P_C#S!`X_[__^L(``#J$#24Y0,[ +MP^,0-(3E`#"-Y0`0H.,8(*#C_S\/XP\P0./^___K"-"-XA"`O>AP0"WI`4"@ +MX0)0H.$`,`#C`#!`XP$C8>`%((+@@C&#X`0PT^4!`%/C``"@$W"`O1@%(*#A +M_S\/XP\P0./^___K`#``XP`P0.,$(V3@!2""X((QD^<#`%#A!@``"@`P`.,` +M,$#C!"-DX`4@@N"",8/@`2"@XP4@P^4`,`#C`#!`XP1#9.`%4(3@A3&#X`4` +MT^5P@+WH\$$MZ0!@H.$`4*#C!7"@X0D``.H&`*#A!1"@X00@H.'^___K`4"$ +MXD``5./X__\:`5"%X@(`5>/P@;T(!T"@X?/__^IP0"WI"-!-X@!`H.&T-`/C +M`V"0YP`PH.,`,(WE!#"-Y8@YD.4#`%/C&P``&C\_`^,_/T/C!#"-Y0`PT>4# +M**#A`R2"X0,@@N$#/(+A`#"-Y2``4^,#``":W3+6Y0``4^,@,*`3`#"-%0$P +MT>4#**#A`R2"X0,@@N$#/(+A!#"-Y2``4^,I``":W3+6Y0``4^,@,*`3!#"- +M%20``.KB--;E`0!3XP0``!H0,`'C$#!!XP`PC>4$,(WE'```Z@(`4^,:```* +M`##1Y0,LH.$#)(+A`R""X0,X@N$`,(WE`3#1Y0,HH.$#)(+A`R""X0,\@N$$ +M,(WE-S#6Y0``4^,+```:*#&6Y0!0G>4#4(7@+#&6Y0,TA>``,(WE2#&6Y010 +MG>4#4(7@3#&6Y0,\A>`$,(WE#1"@X0C@C>(`P*#C/P"@XP%0H.$,,*#A`R#5 +MYS\`4N,#`,6'`3"#X@0`4^/Y__\:!!"!X@X`4>'T__\:!`"@X0@>`./_+*#C +M`##=Y?[__^L$`*#A;!@`X_\@X.,`4)WE)32@X?[__^L$`*#A;!@`X_\@H.,' +M,-WE_O__ZP0`H.$X&`#C_R#@XP1`G>7_-,3C_O__ZPC0C>)P@+WH\$\MZ0S0 +M3>(`8*#AM#0#XP-`D.P``"BHPVN4``%/C`5"@`P0``!IY``#J`#":Y0@`$^/W__\:<@``Z@`PH.,$ +M,(WE`7"@XP.PH.$#4*#A!H"@X05@H.$#`%7C!?&?EQ0``.HL'`(`4!P"`"P< +M`@!0'`(`A3&%X(,QBN"Z/X/B"`"@X000D^40(*#C_O__ZP0`C>4'``#JA3&% +MX(,QBN"Z/X/B"`"@X000D^4!)J#C_O__ZP0`C>6&D8;@B9&*X"].B>((`*#A +M"!"4Y0$FH.,',*#A_O__ZP<`H.'^___K"`"@X000E.40(*#C!S"@X?[__^L' +M`*#A_O__Z\)/B>((`*#A!!"4Y0$KH.,+,*#A_O__ZP<`H.'^___K"`"@X000 +ME.4"*Z#C"S"@X?[__^L'`*#A_O__ZP``5>,"```*`0!5XPH``!H$``#J"`"@ +MX080H.'^___K`$"@X0X``.H(`*#A!A"@X?[__^L`0*#A$P``Z@,`5>,%\9^7 +M`P``ZE`=`@!X'0(`4!T"`'@=`@`'0*#A$@``Z@=`H.&&88;@AF&*X+IOAN(( +M`*#A!!"6Y1`@H.,$,)WE_O__ZP@``.H'0*#AAF&&X(9ABN"Z;X;B"`"@X000 +MEN4!)J#C!#"=Y?[__^L!`%3C"```&@%0A>)U4._F*C#:Y04`4^&4__^*!%"@ +MX0(``.H`4*#C````Z@10H.$%`*#A#-"-XO"/O>CP3RWI9-!-X@``C>4@((WE +MM#0#XP-0D.<`,-'E1##-Y0$`0N(<`(WE`""%X*M`TN4#0(3@!#R@X00X@^$$ +M,(/A!$2#X5!`C>4!,-'E13#-Y;E`TN4#0(3@!#B@X00\@^$$,(/A!$2#X51` +MC>4@,)7E``!3XP(PH`&/,-,%1$#=!01`@P!$0,T%1$#=Y00TH.$$/(/A!#"# +MX01(@^%(0(WE(#"5Y0``4^,%```:'""=Y0)0A>"=,-7E14#=Y01`@^!%0,WE +M14#=Y00XH.$$/(/A!#"#X01$@^%,0(WE`#"@XP@PC>4$,(WE1$"-XB#`G>4$ +MP$SB_\`,XB3`C>4`,`#C`#!`XPPPC>4,X(/B$."-Y;0T`^,``)WE`V"0YQPP +MG>4#((;@XR""X@`PH.,#<*#A2!"-XOJY#^/YN4_C%*0!XQ2D0>,&@*#A`V"@ +MX3<`V.4#`%#C`/&?EVL``.I$'P(`@!\"`!@@`@`T(`(```!7XP@`H!,``*`# +M!,"=Y0``C.!$`(#B``&8YWS`[^8!`%SC4,"-D@-0G)<#4)&'`%"%X`!@H.-F +M``#J#0'8Y0$`4.,`8*`#$@``"@(`4.,0``":(."=Y0,`7N,`8*"3!@``FB0` +MG>4%`%#C`6"@DP(``)H@P)WE"0!G`G@.4%6*#A!ER%X41@W>4&8(7A +M15#=Y054AN$$X)WE?@#OY@$`4.-0`(V2`P"0EP,`D8<%4(#@`&"@XPT``.H` +M`%?C"`"@$P``H`,$P)WE``",X$0`@.(``9CG?,#OY@$`7.-0P(V2`U"(#4(#G`7"'X@0P@^(.((+B`@!7XW'__QJT-`/C`."=Y0,PGN<4,(WE +M.#"-X@S`G>4'`)SH!P"#Z"PPC>(0X)WE!P">Z`<`@^@`L*#C"Z"@X7^0H.,8 +ML(WE6`"-X@M0D.<`,*#C@R&@X1D2!>`Q(J#A4I,-#E`@!3XP4``!IH.`#C'"X`XP,`5>$"`%41!0``"BL``.I( +M.`#C%"X`XP,`5>$"`%41)@``&@APH.$4/@#C'"X`XP,`5>$"`%41R5Z@`P4` +M``I(.`#C:"@`XP,`5>$"`%41F#P`XP-0H`$%@*#A`&"@XP(`5N,#```*"`!7 +MXPAP1X()``"*!P``Z@8`5^,%``":!B!'X@``G>4"$(7B4($*#A=R#OYO[__^L!8(;B=F#OY@&`B.(#`%;CY___&@&@BN)Z +MH._F!+"+X@(`6N.B__\:!""=Y0$@@N($((WE"#"=Y0(P@^((,(WE!@!2X^W^ +M_QIDT(WB\(^]Z`1`+>6T-`/C`T"0YT0DE.7_),+C_RS"XP$P`.,$,$#C`P!2 +MX0@``!K8-)3E``!3X]!$E`4.```*T$24Y00`4^$#0*"Q!$"@H0D``.I$--3E +M`3!#XG,P[^8!`%/CT$24E0,``)I&--3E!`!3XP!`H!/81)0%=`#OYA``O>@> +M_R_AM#0#XP,PD.<`(*#C$B;#Y1[_+^$$0"WEM#0#XP-`D.?]-M3E``!3XPD` +M``H`,)3E=S`#XB``4^,%```*-#"1Y30`DN4``%/A-#""I78PT:5V,,*E$`"] +MZ![_+^$$0"WEM#0#XP-`D.<`,)3E=S`#XB``4^,>```*_3;4Y0``4^,;```* +M`#"@XP@WA.4,-X3E$#?$Y0`@X.,$)L3E#C;$Y54@X.,1)L3E_";4Y0PFQ.4- +M)L3E``"@XP`0H.-()@#C\@"$X64NH./R`(3A6"8`X_(`A.%F+J#C\@"$X6@F +M`./R`(3A9RZ@X_(`A.%X-L3E>3;$Y1``O>@>_R_A!$`MY;0T`^,#0)#G`#"4 +MY7$Y0@WE.4!,(/B"#>$Y04``.H$-Y3E`1"#X`07A.4, +M-Y3E`3"#X@PWA.40`+WH'O\OX?!/+>FLT$WB`+"@X;0T`^,#0)#G*`"-X@`0 +MH..`(*#C_O__ZVPPF^4!`!/CB```"A1`C>5P`!/C_P"@`P@`C05L```*`"`` +MXP`@0.,<,(WB`P"2Z`0`@^2P$,/A_O__ZPT`H.%_/<#C/S##XP0@D^4!((+B +M!""#Y7_,*#C"#"-Y0P@C>4" +MD*#A!G"@XQR@C>(0L(WE!+"@X:^/B>(!@(CB$`"=Y8B!@.``4)OE)```Z@A@ +M1>(`4)7EX$"&X@0`H.$*$*#A!R"@X?[__^L``%#C&P``&@0`H.$`$)WE!R"@ +MX?[__^L``%#C%0``&M`PEN4!`!/C$@``"B`WEN4($)WE`P!1X0,0H*$($(WE +M#""=Y0,`4N$#(*"Q#""-Y:@`C>($$)WE`2&`X-@0EN4#.('A@#`"Y00@G>4! +M,(+B4(`*#A!1"@X?[__^L``%#CU?__"@&0B>((L(OB(`!9X\O_ +M_QH0L)WE#0"@X7\]P.,_,,/C!""3Y0$@0N($((/E_O__ZQ00G>4;--'E`0!3 +MXPL``!H$8)WE``!6XP@``-HH0(WB`%"@XPL`H.$$$*#A_O__ZP%0A>($0(3B +M!@!5X?C__[H,()WE``!2XQ0PG17<)(,5`@``&@`PH.,4$)WEW#2!Y0@@G>7_ +M`%+C%#"=%=@D@Q4`,*`#%`"=!=@T@`5L,)OE"``3XPD```H4$)WE&S31Y0$` +M4^,%```:T#21Y0,XH.&H$(WBA#`AY0L`H.'^___KK-"-XO"/O>AP0"WI`%"@ +MX;0T`^,#0)#G,#34Y0``4^,7,*`#1S3$!7"`O0A(--3E1R34Y0,`4N%P@+T( +MQ1Z@XW\@H./^___K!0"@X5@<`.-_(*#C2#34Y?[__^M(--3E1S3$Y7"`O>AP +M0"WI`%"@X0%@H.&T-`/C`T"0Y_`UU.4``%/C&0``&G08`.,`(.#C_O__ZW,) +M`.(@!Z#A]`6$Y04`H.'''J#C`"#@X_[__^O0`>#G^`6$Y04`H.%<&`#C`"#@ +MX_[__^L@#*#A_`6$Y04`H.%T&@#C`"#@X_[__^M0!N/G``:$Y0$PH./P-<3E +M``!6XP$PH!-?-,05$@``&F`TE.4``%/C`C"@`U\TQ`4-```*7B34Y0$`4N,% +M```:'0!3XP`PH,-?-,3%`3"@TU\TQ-4$``#J&0!3XP$PH--?-,35`#"@PU\T +MQ,5?--3E7B34Y0,`4N%P@+T(``!3XR,``!H%`*#A=!@`XP(`8*#A`7"@X0W`H.$XX)_E#P"^Z`\`K.@# +M`)[H`P",Z`!`H.,-4*#A!@"@X000E><'(*#A_O__ZP1`A.(8`%3C^/__&AS0 +MC>+P@+WH0!<``'!`+>D`0*#A`%!1X@`0`!,`$$`3`!```P`00`,```#C``!` +MX_[__^NM#H3B_O__ZP`@H.$$`*#A!1"@X?[__^MP@+WH<$`MZ0!`H.&T-`/C +M`S"0Y^@6P^6M7H#B!0"@X?[__^L`(*#A!`"@X0`0H./^___K!0"@X?[__^L` +M(*#A!`"@X0$0H./^___K<("]Z!!`+>FT-`/C`T"0YP`PE.5W,`/B(`!3XQ<` +M``K]-M3E``!3XQ0```IL,)#E`0`3XP``H!,2!L05$("]&!(VU.4``%/C``"@ +M$Q(&Q!40@+T8`3"@XQ(VQ.4,%M3E`@!1XP,0H`$"$*`3#!;$Y0`@H./^___K +M`0"@XQ"`O>@``*#C$("]Z/!/+>D$Y0PWA.4$-L3ED@$` +MZA@T`>/38(7A2!8`X]$@A.$&@*#A!Y"@X0*`6.`#D,G@^(#-X>`D`>-E/J#C +MTX"$X=*@A>$(H%K@";#+X/"@S>'Q8(3AT@"%X?,`A.$$-M3E`0!3XVL``!H, +M-M3E`@!3XPL``!I8-@#CTP"$X=A@S>$&`)#@!Q"AX/,`A.%H-@#CTP"$X0H` +MD.`+$*'@\P"$X0L``.IF/J#CTP"$X=B`S>$(`)#@"1"AX/,`A.%G/J#CTP"$ +MX="@S>$*`)#@"Q"AX/,`A.$,9M3E`@!6XP%@H`,"8*`3#C;4Y0$P0^)S,._F +M#C;$Y0``4^,$```*`*"@XP"PH./PH#PH%H-@#CTP"$ +MX5@V`./3H(3A`*":X`&PJ^!Y-M3E`0!3XP8``!H*<*#ABS&@X:H^@^&*(:#A +M`J":X`.PJ^`%``#J``!3XP,``!K0`4Y0``4>,` +MD*#3`@``V@`'E.7^___K`)"@X0P7E.4``%'C`'"@TP(``-H$!Y3E_O__ZP!P +MH.$"`%CC!X"@$0EPH!$)@*`!"':$Y1D``.H(%Y3E``!1XP!@H-,"``#:``>4 +MY?[__^L`8*#A#!>4Y0``4>,`<*#3`@``V@0'E.7^___K`'"@X0R&U.4"`%CC +M!H"@`0>`H!$--M3E`@!3XP=@H!$(9H3E`&"@XP"@H.,`L*#C\*'-X00VU.4! +M`%/C5@``&@XFU.4``%+C4P``&@\VU.4``%/C,0``&A00G>4!`%OA`P``B@P` +M`!H0,)WE`P!:X0D``)H,-M3E`@!3XQ$VU`6#,*`!$3;$!1$VU!6#,*`1`3"# +M$A$VQ!4(``#J##;4Y0(`4^,1-M0%@S"@`0$P@P(1-L0%$3;4%8,PH!$1-L05 +M$1;4Y0`PH.,#<*#A`V"@X5$CH.$!`!+C`6"&$G9@[Q8!<(<"=W#O!@$P@^(( +M`%/C]O__&@PVU.4"`%/C`@``&@<`5N$"``"*`P``Z@<`5N$!```Z`F"@XP`` +M`.H!8*#C#S;4Y0$`4^,)```:53#@XQ$VQ.4(-I3E`P!8X0QFU*4#``"J#&;4 +MY0(`5N,!8*`#`F"@$P`PH.,$-L3E$#?$Y0`WA.4(-X3E!#>$Y0PWA.4`(*#C +M`#"@XU@6`./Q((3A9AZ@X_$@A.%H%@#C\2"$X6<>H./Q((3A20``Z@``4^-' +M```:>3;4Y0$`4^,2```:T"#-X=A@S>$&()+@!S"CX*,PL.%B(*#A``!3XP0` +M`!H&```:.!P)XQP00.,!`%+A`@``F@$PH.-Y-L3EA```Z@`PH.-Y-L3E$P`` +MZ@``4^,1```:T"#-X=B@S>$*()+@"S"CX*,PL.%B(*#A``!3XP0``!H&```: +M.!P)XQP00.,!`%+A`@``F@$PH.-Y-L3E;P``Z@`PH.-Y-L3E#&;4Y0(`5N,! +M8*`#`F"@$P$PH.,$-L3E$#?$Y=`@S>'8`,WA`""2X`$PH^```%/C`@``&@8` +M`!KZ#U+C!```F@0PH.,.-L3E`#"@XP\VQ.4#``#J`C"@XPXVQ.4!,*#C#S;$ +MY0`PH.,`-X3E"#>$Y00WA.4,-X3E##;4Y08`4^$#```*!0"@X080H.$!(*#C +M_O__ZPPVU.4--L3E#&;$Y0B&A.4.-M3E``!3XT0```H!`!/C'P``&@\VU.4` +M`%/C%```&GDVU.4!`%/C!P``&@`P`.,`,$#C`!"3Y6$.A.($`(#B`1"!XO[_ +M_^LT``#J``!3XS(``!H`,`#C`#!`XP`0D^5A#H3B!`"`X@40@>+^___K*@`` +MZ@`P`.,`,$#C`!"3Y6$.A.($`(#B,A"!XO[__^LB``#J#S;4Y0``4^,4```: +M>3;4Y0$`4^,'```:`#``XP`P0.,`$)/E80Z$X@0`@.()$('B_O__ZQ0``.H` +M`%/C$@``&@`P`.,`,$#C`!"3Y6$.A.($`(#B"A"!XO[__^L*``#J`#``XP`P +M0.,`$)/E80Z$X@0`@.(R$('B_O__ZP(``.H`,*#C$#;$Y8[__^HD`0*#A3#8#XP,PD.D4K-,7E*33%Y;04`^,!0);G,#3$Y00PH.,Q-,3E(#"@XT@TQ.4`,*#C1S3$ +MY44TQ.5$-,3E`R"@XT8DQ.4C`*#C-`2$Y2@`H.,X!(3E&0Z@XSP$A.7Z#Z#C +M0`2$Y3X`H.-,!,3E'@"@XTT$Q.4*P*#C2<3$Y0S`H.-*Q,3E`\#@XTO$Q.5/ +M),3E4#3$Y58$Q.55-,3E6#2$Y24PH..!-L3E*23%Y0%PEN@H.$`@*#C#4"@ +MX08`H.$($)3G_O__Z\`%RN4$@(CB`:"*XA@`6./W__\:`3"@X^`TQ^4`,*#C +MXC3'Y;0D`^,"$);GX#+!Y=@4`>,!,(;G`D"6YXTTQ.7,-,3E*#34Y0$`4^.( +M-,0%`#"@$X@TQ!4I--7E!#"#XRDTQ>6T)`/C`D"6YP`PH./C-,3EY#3$Y>DT +MQ.4!,*#CY33$Y2DTU>4(,(/C*33%Y0)`EN?`-M3E``!3XPL```H&`*#A`!"@ +MXQX@H./P,*#C_O__Z]0&Q.4&`*#A`!"@XQ\@H./P,*#C_O__Z]4&Q.6T)`/C +M`D"6YP(PH.-<-,3E733$Y5XTQ.5?-,3E`#"@XV`TA.4I%-7E$!"!XRD4Q>4" +M0);G`#>$Y00WA.4(-X3E##>$Y?P6U.4,%L3E#1;$Y0`0X.,$%L3E"#:$Y1`V +MQ.55$.#C$1;$Y0)`EN=\-H3E@#;$Y2DTU>4J-,7EA$0`XZ1T`.,&`*#A!!"@ +MX?[__^L_``#B@@;%Y0%`A.(!4(7B!P!4X?;__QHF(/`)7H +M!P"LZ+(PS.`C.*#A`##,Y>@UE.4!,(/BZ#6$Y0$PH./D-,3E)##4Y0X`4^,$ +M```:QC74Y0``4^,!,*`#QC7$!0,``.K&-=3E``!3XP`PH!/&-<05"0"@X0`0 +MH.,D(*#C'S"@X_[__^MPH._F.1#4Y0H08>`)`*#A<1#OYO[__^L)`*#A_O__ +MZP`@G>4``%+C`B"@$P$@H`,$((WE``!:XW`"``H)`*#A,AV@XP`@X./^___K +M`#``X\`_3^,#``#@`&``XX!O1^,&8`/@!@!0X0!0H`,'```*`5"@XY09G^4` +M(`#CP"]/XP4QD><#,`+@``!3X0$``!J,4,WE`@``Z@%0A>(E`%7C]O__&@`P +MG>4``%/C%0``"@D`H.&('`#C`"#@X_[__^L@"Z#A``N@X08`4.$`4*`#!P`` +M"@%0H.,P&9_E`"``X\`O3^,%,9'G`S`"X`,`4.$!```:C5#-Y0(``.H!4(7B +M)0!5X_;__QH)`*#A)!H`XP`@X./^___K/S\#XS\_0^,#,`#@F'"-X@0P)^4` +M4*#C!6"@X0`P`.,`,$#C0K^#X@*PB^($@*#C`C"#X@@PC>4,H(WE`Z"@X<8U +MU.4``%/C"```"@<`H.$%$(K@"""@X?[__^L!`%#C"@``&@R@G>5V8._F#0`` +MZ@<`H.$%$(O@"""@X?[__^L!`%#C#*"=!79@[P8%```*`6"&X@A0A>(A`%;C +MY___&@R@G>4`8*#CZ334Y0``4^,4```:.3#4Y>DTQ.7JI,3EZZ3$Y>PTQ.4$ +M$)WE``!1XPD``-H$,*#A`%"@XXP`C>(%(-#GR"7#Y'X__^Z=F#OYL=EQ.7+9<3E*S#4Y0$`4^,;```:UC74Y0,@A.#.I<+E`3"# +MXG,P[^;6-<3E"`!3XP`PH`/6-<0%!#"@X0!0H.,%<*#A!6"@X,4``#*'P``Z@00G>4``%'C"P``V@0PH.$`4*#CD`"-X@APS>7,)=/E +M",#=Y0(@;.`%(,#G`5"%X@$P@^(!`%7A]___NLLUU.4#<&?@=W#OY@APC>4/ +M``#J!#"@X0!0H..0`(WB"'#-Y'W__^ZRS74Y0-PA^!W<._F"'"-Y>DTU.4#`%KA"C!C@'-P[X8#,&J0(!,(/B`0!5X?C__[K' +M-=3E`S!FX,'X__^ZQS74Y0,PAN#'-<3E`#"@XP@PC>4K,-3E`0!3XR,```HY,-3E"@!3 +MX0,``#H$$)WE``!1XQ(``,H:``#J!!"=Y0``4>,)``#:!#"@X0!0H..0`(WB +MR"73Y0$@@N(%(,#G`5"%X@$P@^(!`%7A^/__NL4* +M``#J!#"@X0!0H..0`(WBR"73Y04@P.'Y__^ZQ\74Y0C` +MC>4$P)WE``!=S(*_F)`!2XR0@H,,%(,''`P`` +MRG,PK^8%`%/C!C"@TP4PP=,@(*## +M"""-Q00``,H(,)WE@``3XP$```H`P*#C","-Y>4TU.4``%/CSP``"@9@E^'- +M```*`#``XP`P0..04-WE!3&#X+`PD^78593EW&64Y0``5>,E```*`@P5XP5; +MX!$E6^`1(WN@X9<%!>`$4(WE523IYPP@C>4"#!;C!FO@$29KX!&7!@;@1E2@ +MX0PPG>4'>X/A/S`%X@D`H.$R':#C`"#@XP,XA^'^___K"0"@X90<`.,/(J#C +M53/CY_[__^L)`*#A3!P`XP(AH.,$P)WEW#/@Y_[__^L)`*#A3!P`XP(BH./6 +M,^#G_O__ZPT``.H)`*#A,AV@XP`@X./^___K"0"@X90<`.,/(J#C`#"@X_[_ +M_^L)`*#A3!P`XPHBH.,`,*#C_O__Z\8UU.4``%/C)P``&@@@G>5R<._F`&`` +MXP!@0..'48;@"0"@X2(:`.,((=7E_O__ZPD`H.$C&@#C"2'5Y?[__^L",(7B +M"0"@X20:`.,((=/E_O__ZPD`H.$E&@#C"R'5Y?[__^L$,(7B"0"@X28:`.,( +M(=/E_O__ZPD`H.$G&@#C#2'5Y?[__^L)`*#A*!H`XPXAU>7^___K"0"@X2D: +M`.,/(=7E_O__ZR4``.H(,)WE`)`*#A(QH`XP$@UN7^___K"0"@X20:`.,"(-;E_O__ZPD`H.$E&@#C +M`R#6Y?[__^L&4*#A"0"@X28:`.,$(-;E_O__ZPD`H.$G&@#C!2#6Y?[__^L) +M`*#A*!H`XP8@UN7^___K"0"@X2D:`.,'(-;E_O__ZP#`G>4``%SC/```"@`P +M`.,`,$#CD5#=Y04Q@^"P,)/EX%64Y>1EE.4``%7C)0``"@(,%>,%6^`1)5O@ +M$2-[H.&7!07@`%"-Y54DZ><$((WE`@P6XP9KX!$F:^`1EP8&X$94H.$$,)WE +M!WN#X3\P!>()`*#AB!P`XP`@X.,#.(?A_O__ZPD`H.&<'`#C#R*@XU4SX^?^ +M___K"0"@X4P<`.,"(Z#C`,"=Y=PSX.?^___K"0"@X4P<`.,")*#CUC/@Y_[_ +M_^L-``#J"0"@X8@<`.,`(.#C_O__ZPD`H.&<'`#C#R*@XP`PH./^___K"0"@ +MX4P<`.,*)*#C`#"@X_[__^L#`%CC`P``FNNDQ.4)`*#A`!"@X_[__^L+`%KA +M'P``"CE@U.4*8&;@=F#OY@,UU.4``%/C"@``"G90K^8-4(7BI5^%X,4PH.&8 +M((WB`S&"X`D`H.%H&P#C'RN@XW0P$^7^___K!#74Y0``4^,*```*=E"OY@U0 +MA>*E7X7@Q3"@X9C`C>(#,8S@"0"@X6P;`.,?*Z#C0#`3Y?[__^OLI,3EY334 +MY0``4^/II,05`#"@X^,TQ.64`$*#C)""@X_\_#^,/ +M,$#C_O__ZP$PH./F-,3E`@``ZC?]_^L`,*#CYC3$Y0C0C>(0@+WH\$\MZ3S0 +M3>(`0*#A.""-X@$PH.,!,&+EM#0#XP.`D.=9,@/C`U#0YR40H.,8-0/C#^"@ +MX0/PD.>=-0/C`S#4YP$`4^.U!``:``!5X[,$`!HW4-WE``!5X[`$``H$`*#A +M!OG_Z[1T`^,'4)3G!`"@X=H>H.,`(.#C_O__ZR`(H.%D!(7E!`"@X:0=`.,` +M(.#C_O__ZW`P_^9H-(7E(&B@X6QDA>4$`*#AJ!T`XP`@X./^___K<`#_YG`$ +MA>4$`*#ASQZ@XP`@X./^___K<##_YH`TA>4@:*#AA&2%Y6@4E>5D))7E`B"! +MX&P4E>4!((+@4$`*#A+!H`XP$IH.,!,*#C +M_O__ZP0`H.%<&@#C_R"@X_[__^MX!(7E!`"@X5@:`./_)*#C_O__ZP`,H.%X +M-)7E(#B#X'@TA>5H%)7E9"25Y0(@@>!L%)7E`2""X'`4E>4!((+@`S""X'PT +MA>4$`*#A#1R@XP(CH.,!,*#C_O__ZP0`H.$-'*#C`B.@XP`PH./^___K!`"@ +MX2P:`.,#*:#C`#"@X_[__^L$`*#A+!H`XP,IH.,",*#C_O__ZP=0E.,#,)3G`@!3XP0PH,-&-,7%M#0#XP-@E.=%)-;E1#36Y0,`4N$$```* +M`@!3XP0```H!`%/C?0``&@$``.H``%+CA0``"@0`H.'Y]__K3@3&Y;0T`^,# +M8)3G3C36Y10@@^(^`%+C/C"@PTPTQL44,(/23#3&U7PDEN40-P+C`P!2X14` +M`)I5)-;E`2""XG(@[^95),;E5C36Y4@4UN4!`%/A5A3&-0$PH#-5-,8U'P`` +M.@(`4N,=``":3"36Y0$0@^("`%'A323&Q0$P@])--,;5X3Z@XU@TAN44``#J +M6#26Y0``4^,!,$,26#2&%0\``!I5--;E``!3XPD``!I6--;E`2!#XAT`4N,> +M,*#35C3&U4TTQM4!($/"5B3&Q4TTQL4"``#J`P!3XP`PH`-5-,8%?#26Y?D` +M4^,B``"*!`"@X?T4`./^___K`0`0XPHPH!-)-,85%0``&GPTEN5`));E`@!3 +MX0<``)I)--;E2R36Y0(00^("`%'A223&M0(P0Z))-,:E"0``ZCPDEN4"`%/A +M!@``*DDTUN5*)-;E`A"#X@(`4>%)),;%`C"#TDDTQM5.)-;E"B""XDDTUN4" +M,&/@2#3&Y0X``.KZ#U/C1S36A0(P@X)(-,:%"0``BNXB`.,"`%/A1S36A0$P +M@X)(-,:%`P``BGT/4^-'--8U`3!#,D@TQC5,--;E2"36Y0,`4N%(-,:%3336 +MY4@DUN4#`%+A2#3&-00`H.&6^/_K"@``Z@`PH.-.-,;E!""@XS$DQN4*(*#C +M223&Y2`@H.-(),;E1S3&Y00`H.&*^/_KM#0#XP-@E.?8=);E;#"4Y7``$^," +M```*1#36Y0``4^,$```*`#"@XRPTQN4$,*#C,33&Y40``.HL--;E``!3XP<` +M`!H!,*#C+#3&Y0`PH.,Q-,;E(#"@XT@TQN4$`*#A6T-`/C +M`U"4YVPPE.4!`!/C!@``&M@TE>4``%/C#0``&F`TA>5L,)3E`0`3XPD```I` +M`!/C`0``&B``$^,"```*V#25Y6`TA>4$``#JT#25Y6`TA>4!``#JV#25Y6`T +MA>4`,)7E=S`#XB``4^,"```*!`"@X0`0H./^___KM#0#XP-@E.?@--;E``!3 +MXTH```HI--;E`@`3XP`PH`/B-,8%10``"FPPE.4!`!/C!@``&MA4EN4``%7C +M`#"@`^(TQ@7A-,8%!@``&CL``.I``!/C`@``&B``$^/05)8%````"MA4EN5) +M`%7C`C"@P^(TQL4'``#*0S!%X@,`4^,!,*"3XC3&E0(``)H]`%7C`#"@T^(T +MQM7B)-;EX336Y0,`4N$C```*!`"@X200UN7^___KXC36Y0``4^,2```:M#0# +MXP.@E.<Z`,`C.@`<*#C'%"-X@0`H.$'$)7G +MP"7:Y?[__^L$<(?B`:"*XA@`5^/W__\:"@``Z@$`4^,#```:!`"@X100H.,Z +M^/_K!```Z@(`4^,"```:!`"@X1`0H.,T^/_KXC36Y>$TQN4$`*#A_O__Z[0T +M`^,#8)3GZ#;6Y0``4^,'`@`**336Y0@`$^,$`@`*P#;6Y0``4^,!`@`*PC;6 +MY0,`4^/^`0`:;#"4Y1``$^/[`0`:`0`3XP"PH`/D.I\%`+##!0D```K8.I_E +M`%#3Y0``5>,!L*`#"Q"@`0`0PP4!(*`3O#J?%0`@PQ4`L*`3M#0#XP-PE.=L +M,)3E`0`3XP>@H`$`D*`#P```"@0`H.']%`#C_O__ZP"@H.$$`*#AB!0`X_[_ +M_^L`4*#A>`J?Y040H.'^___K!`"@X8P4`./^___K%`"-Y6`*G^44$)WE_O__ +MZP0`H.%)'J#C_O__ZP@`C>4!H`KBQ#;7Y0H`4^$B```*Q*;'Y>@]`N,#,-3G +M`P!3XP&0H!.7```:`""@XQ`ZG^4!(,/E!3"@X\($`*#A_10`XP4@H.'^___KQ`F?Y040H.'^___K`9"@XWH``.JT"9_EZ#T" +MXP,0U.?^___K_P3%X_J?H..9``#@"!"=Y?[__^L`4*#A%""=Y?\$PN.9``#@ +M"!"=Y?[__^L`D*#AS%:'Y=`&A^5P"9_E!1"@X?[__^MH"9_E"1"@X?[__^L` +M`%KC7P``"N@]`N,#,-3G`P!3XUL``!I("9_E_O__ZQT`5>,=`%F3!5"@DP\` +M`)IO,$GBB@!3XP!0H),+``":QP!5X\<`68,'4*"#!P``BE<_1>(",$/BE0!3 +MXPA0H),"``":?0]5XPE0H",&4*`S`B"@X\PXG^4!(,/EZ#B?Y1!2P^7'5L?E +MQ3;7Y0$`4^,",*`1`#"@`P.@BN%ZH._F!0!5XR`"``IZH._F``!5XP(``!JT +M")_E_O__ZQ```.H&`%7C`@``&J0(G^7^___K"P``Z@<`5>,"```:E`B?Y?[_ +M_^L&``#J"0!5XP(``!J$")_E_O__ZP$``.I\")_E_O__Z\?Y0L0H.$)(*#A!3"@X?[__^L$`*#A0!"@X_[__^L`$*#A0`>?Y?[_ +M_^L+D(GA!9"9X?H```K$-M;E``!3X]H```K(-M;E``!3XR(```IN.M3E`@!3 +MXQ@``!K'-M;E!0!3XPT```I_.M3E``!3XQD```KT!I_E_O__ZP!0H.-_6L3E +MK0Z$XO[__^L`(*#A!`"@X040H.'^___K#@``ZG\ZU.4``%/C"P``&L`&G^7^ +M___K`3"@XW\ZQ.4&``#J?SK4Y0``4^,#```:I`:?Y?[__^L!,*#C?SK$Y<4V +MUN4``%/CK@``"HP&G^7^___K;CK4Y0(`4^,)```:QS;6Y08`4^,&```:<`:? +MY?[__^L$`*#A0!"@XZ`@H./^___K)P``ZL,$#CX#:&Y>0VAN5,!9_ES!:6Y0@E +M`./^___K*P``Z@<`4^,'```:+R@+XUX@0./@)H;EY":&Y20%G^4(%0#C_O__ +MZR$``.H``%/C&```&LPVEN6@`%/C"```FB\W"N->,$#CX#:&Y>0VAN7T!)_E +MS!:6Y0@E`./^___K$P``ZBLS"N->,$#CX#:&Y2LT"N->,$#CY#:&Y,$#C_O__ZP8``.H`,*#CX#:&Y>0VAN6H!)_EQQ;6Y0@E +M`./^___KQS;6Y04`4^,:```*H3?4Y00`4^,,```:UC;6Y0@`$^,)```**R@+ +MXUX@0./@)H;EY":&Y6@$G^4(%0#C_O__Z\(*#CX3"#XO[__^LJ``#J*`2?Y=06UN7^ +M___KU#;6Y0`PC>4$`*#A`!"@XQX@H./P,*#C_O__ZQ\``.H`!)_E_O__ZQP` +M`.K(-M;E``!3XP8```I_.M3E``!3XP,``!K@`Y_E_O__ZP$PH.-_.L3EU`.? +MY?[__^L$`*#A0!"@XP`@H./^___KL`.?Y=06UN7^___KU#;6Y0`PC>4$`*#A +M`!"@XQX@H./P,*#C_O__ZP`PH./@-H;EY#:&Y;0T`^,#4)3GY3T"XP,PU.4``%+C!0``"N`F +ME>4``%+C"```&N0FE>4``%+C!0``&M@D`>,"()3G``!2XP"0H`,!```*2@`` +MZ@&0H.,8)`'CTJ"$X3`D`>/2`(3A`*!:X`&PR^#@)`'CTF"$X?@D`>/2`(3A +M`&!6X`%PQ^#X8,WA``!3XP0`4Q,+```:`&"@XP4"`%'A`P``B@,``!H(`)WE"@!0X0```)H!8*#C["65Y08`4N$"```:X"+5 +MY0``4N,8```:`0!9XVX_A@(#<94'#P``"@(`4^,(```:H3?4Y0@`$^,%```* +M`#``XP`P0.,&((;B`C&#X%QQD^4$``#J`#``XP`P0.,5((;B`C&#X%QQD^4$ +M`*#A"!4`XP<@H.'^___K[&6%Y0$PH./@,L7E"```ZN`RU>4``%/C!0``"@0` +MH.$(%0#CY"*5Y?[__^L`,*#CX#+%Y0`0H./8-`'C`Q"$YQ@T`>/38(3A,#0! +MX_-@A.'@-`'CTV"$X?@T`>/S8(3A!`"@X0+V_^ML,)3E"``3XP4``!KH-@'C +M`S"4YP$P@^(!`%/C!@``RA@``.H$`*#AA!0`X_[__^L_``#B@@;(Y1(``.H! +M8*#C!E"@X1JMH./H=@'C!`"@X1(=AN($$('B_O__ZP9@B.`*8(;@/P``X@(` +MQN4!4(7B=5#OY@5@H.$',)3G`3"#X@,`5>'P__^Z[ST"XP,PU.<``%/C&P`` +M"@0`H.%&$*#C_O__ZP0`@.-P4._F!`"@X480H.,%(*#A_O__ZP0`H.%$$*#C +M^R`%XO[__^L$`*#A1A"@X_[__^O[(`#B!`"@X480H./^___K!`"@X400H./^ +M___K`P``Z@2@BN.@`)_E_O__Z_']_^H\T(WB\(^]Z'P8``!`-P``B",``)PC +M``"X(P``P",``-0C``#H(P``^",```@D``#(!P``)"0``$`D``!D)```A"0` +M`*`D``#$)```W"0``!PE```X)0``3"4``&@E``"`)0``E"4``*@E``#`)0`` +MZ"4```PF``!,)@``>"8``+`F``#H)@``*"<``$@G``!H)P``?"<``)@G``"X +M)P``!$`MY3,@0>(Q`%+C9$"@DR<``)HI($'B"0!2XX%`H)$C``":'R!!X@D` +M4N,D0(&2'P``FA4@0>()`%+C(D"!DAL``)H*($'B"@!2XP<``(H*$$'B@1"@ +MX58U!>-5-47CDR'#X,$?0^`J0('B$```Z@4@0>($`%+C!0``BH$0@>`/$$'B +MH1^!X,%`H.$60(3B!P``Z@$P0>(#`%/C`4"@@0$009*!$(&0H1^!D,%`H)$& +M0(22!`"@X1``O>@>_R_A^$\MZ0"PH.$0H)#EM#0#XP-@FN=7,-#E`P!3XZ8` +M`(H!@*#AJ#(#XP,PFN<``%/C`@``&A@TUN4``%/C(0``&@4@V.4B,Z#A`P!3 +MXP/QGY(?B_WR'XO1PA^)W<._F(0``ZCX@`N(0<&+B=W#OYAT``.H%(-'ETC+AYP,` +M4^,#\9^7%P``ZMA6`@#$5@(`L%8"`)Q6`@`?(`+B+7#@XX)P1^!W<._F#P`` +MZA\@`N(9<.#C@G!'X'=P[^8*``#J'R`"X@MPX.."<$?@=W#OY@4``.H?(`+B +M@G"@X1!P9^)W<._F````Z@!PH.-W,._F8R"#XG(@[^9V`%+C`%"@@P,``(J` +M`!?C9%"@`V0P@Q)S4.\6L#'6X1,`4^,;```:!D"%XG1`[^9D`%3C!%"@,610 +MH",C,$7B,#<,KGL#'6X1,`4^,1```:,0!5XR$``(HC +M,$7B)S,._F#`!3XSQ`H),8``":$D!%XG1` +M[^8#`%3C*$"@DQ1`H(,2``#J*`!5XP\``(H$0-CE0`!4XP!`H(,,``"*$P!4 +MXPD``)I`0&3B9""@XY($`N#I,@KCBSY"XY,2P^#"+Z#APT%BX'1`[^8```#J +M9$"@XUE`R^5:0,OE`##@XULPR^4*`*#A!1"@X2+__^M<`,OE^(^]Z'PVEN4! +M,(/B?#:&Y0%PH.$J,-;E``!3XP"0H`,)@*`!)```"@"0H.,)@*#A"`0`XP\0 +MH.,)4*#A!3"@X04@AN``((+@!"#2Y0``4N,!D(D2>9#O%@4@U^<_(`+B-R!" +MXH(@H.%R(._F8\""XGS`[^9V`%SC`""@@P,``(J``!+C9""@`V0@@A)R(.\6 +M`H"(X`,@A^!6/H/BT4"2X<1`H.$#08KG`5"%XG50[^8J,-;E!0!3X=___XH$ +M,-?EHS"@X6XP0^)S,._F`U"@X6,@@^)R(._F=@!2XP!`H(,#``"*@``3XV1` +MH`-D,(,2,#4,KGL#'6X1,`4^,O```*6##; +MY0``4^,%```*5S#;Y1,`4^,"``":&P!3XP)`H),```":`4"@XPLPH.$`8*#C +M!R"@X0IPH.$(H*#A!("@X=U`TN'$3P3@=%#OYB``=.,%``"Z`%!EXH50A>!U +M4._F=4"OYF,`5.,````:9%"@XP``5N-94,L%6E##Y0%@AN)V8._F`2""X@$P +M@^(&`%CAZO__B@J`H.$'H*#A!P``Z@@`H.$)$*#A_O__ZP`0H.$*`*#AKO[_ +MZUP`R^7XC[WH``!9X_B/O0CT___J\$]",@U`>,#,-3G``!3XP8```H`,*#CS"4!XP(PA.?0 +M)0'C`C"$Y\@E`>,",,3GS#4!XP,0E.70-0'C`R"4YP(` +M@.`#`(3G_O__Z\DU`>,#`,3GM#0#XP.@E.>`8)7E5S#5Y0``5N,@AY85)'>6 +M%="$F@74=)H%`P!3XQ4``)H``%CC8("5M6`PE>4(`%/A"```FH@AB.""@(C@ +M`X"(X,TL#./,+$SCDCB(X"B"H.$!@(CB'```ZH@AB.""@(C@`X"(X,TL#./, +M+$SCDCB(X"B"H.$4``#J``!7XV!PE;5@,)7E!P!3X0@``)J'(8?@@G"'X`-P +MA^#-+`SCS"Q,XY(WA^`G&Y08``.J`-MKE`0!3X]"$B@4!```*``!3X]!TB@74=(KE``!4XP``51/P +MA[T(O#4!XP,PU.<``%/C!@``"@`PH.-7+:#C`C"$Y\0E`>,",(3GO"4!XP(P +MQ.=7/:#C`Q"4YP$0@>(#$(3G7`#5Y<0U`>,#()3G`@"`X`,`A.?^___KO34! +MXP,`Q.?PA[WH'O\OX7!`+>D`4*#A`4"@X0)@H.$`(*#C`"#!Y0$@P>4$`('B +M`Q"@X08@H./^___K"@"$XLL=A>(A$('B!B"@X_[__^L0`(3BK1Z%X@00@>(& +M(*#C_O__ZP0PH.&V(?/A#R`"XK`@P^$`,-3E`2#4Y0(T@^'\,,/C`SB@X2,X +MH.%0,(/C`##$Y2,TH.$!,,3E2"N5Y0,,4N-P@+V(&`"$XBT=A>(,$('B_O__ +MZT@[E>48,(/B`#"&Y7"`O>CP02WI`&"@X0%0H.$"@*#A`W"@X1@@W>4!0*#A +M`#"@XP`PP>4!,,'E`P!2X0`PP140,*`3`3#!%3PQD.4!`%/C`@``"@0`4^,P +M```:%P``Z@`PT>4!(-'E`C2#X0$\@^-S,/_F`##!Y2,TH.$!,,'EK0Z`XO[_ +M_^L`$*#A!`"%X@8@H./^___K"@"%XLL=AN(A$('B!B"@X_[__^L0`(7B!Q"@ +MX08@H./^___K)@``Z@`PT>4!(-'E`C2#X0(\@^-S,/_F`##!Y2,TH.$!,,'E +M!`"!X@<0H.$&(*#C_O__ZZT.AN+^___K`!"@X0H`A>(&(*#C_O__ZQ``A>++ +M'8;B(1"!X@8@H./^___K#@``Z@0`@>('$*#A!B"@X_[__^L*`(7BRQV&XB$0 +M@>(&(*#C_O__ZZT.AN+^___K`!"@X1``A>(&(*#C_O__Z[8Q].$/,`/BL##$ +MX;`PU>'\,,/C2#"#X[`PQ>$8,*#C`#"(Y?"!O>CP02WI`%"@X0%`H.$"<*#A +M`#"@XP`PP>408*#C`6#!Y;`PT>'\,,/CI#"#X[`PP>%H.@#CLS"0X0,Y@^.R +M,,'AK0Z`XO[__^L`$*#A!`"$X@8@H./^___K"@"$XLL=A>(A$('B!B"@X_[_ +M_^L`8(?E\(&]Z'!`+>D"4*#A`V"@X0%`H.$!`*#A`!"@XR`@H./^___K`#"4 +MY2,S@^,"-H/C=5#_Y@4P@^$`,(3E!#"4Y1(\@^,$,(3E``!6XP$V@Q,$,(05 +M$#"4!8`P@P,0,(0%##"4!0(Q@P,,,(0%$#"4Y0$\@^,0,(3E!`"@X?[__^MP +M@+WH\$4MZ1S03>(`0*#A`6"@X0*@H.$`(`#C`"!`XPPPC>(#`)+H!`"#Y+`0 +MP^$`,*#C`##&Y0$PQN4$`(;B#!"-X@8@H./^___K"@"&XLL=A.(A$('B!B"@ +MX_[__^NM#H3B_O__ZP`0H.$0`(;B!B"@X_[__^L&,*#AMB'SX0\@`N*P(,/A +ML##6X?PPP^.`,(/C!E"@X;`RQ>`@,*#C%#"-Y2U]A.(,<(?B!P"@X?[__^L` +M$*#A!0"@X0(@H./^___K(H"&XA10G>4"4(7B%%"-Y0<`H.'^___K`!"@X0@` +MH.$"(*#C_O__ZR1PAN(44)WE`E"%XA10C>7`.93E`S`#X@,`4^,(```:2"N4 +MY0P@0N(%((+@%""-Y0<`H.&U'H3B"!"!XO[__^LR``#JW"J4Y11@C>(`8(WE +M!P"@X0`0H..N/H3B_O__ZP"`H.&S7H3B!%"%X@4`H.'^___K`'"@X0!@C>4( +M`*#A`1"@XP@`5^,'(*`Q"""@(P4PH.'^___K`&"-Y0,0H.,!(*#CL3Z$X@PP +M@^+^___K`%"@X<`YE.4#,`/B`0!3XP@``!H8,(WB`""@XQ`@(^44((WB`""- +MY080H.,"(*#C_O__ZP!0H.$(`%?C!P``FA0PC>(`,(WE!0"@X3(0H.,(($?B +MLSZ$X@PP@^+^___K%#"=Y2`@@^("#%+C`#"*E0$``)H(`)_E_O__ZQS0C>+P +MA;WHV"<``/!/+>DTT$WB`&"@X1`0C>4"D*#AM"0#XP(@D.<(((WE`("2Y=B! +MX.<``%/C##"-Y6\```H%`%GC;0``B@`PH.,L,(WE,""-XK8P8N$8((WE9#"@ +MXR`PC>5SKZ#C+""-X@$@@N(4((WE##"=Y0(P@^(<,(WE`#``XP`P0.,D,(WE +M"""=Y1JTTN5D4*#C`3"@XQ-[H.$'+8OB!""-Y08`H.$*$*#A_O__ZP<``.!P +M0._F``!8XP(```H``%3C1@``"@8``.H``%3C!```&@8`H.$$$)WE_O__ZP`` +M4.,^```*``!5XS\```H!4$7BZO__ZA0`G>4,$)WE"2"@X?[__^L+``#J&`"= +MY0P0G>4"(*#C_O__ZQ0`G>4<$)WE`B!)XO[__^LL,-WE@SS@X:,\X.$L,,WE +M+##=Y1`@G>4#,(+A+##-Y2Q`G>6``!3C!```"D00B^(&`*#A@1"@X;HBW>'^ +M___K=!"+X@8`H.$!$:#A+""=Y?[__^L``%CC$0``&@8`H.$*$*#A_O__ZU`+ +MH.$!`!#C!P``&B0`G>7^___K(#"=Y0``4^,1```*`3!#XB`PC>6Q___J!@"@ +MX0<=B^+_(*#C_O__ZP&PB^(#L`OB"""=Y1JTPN4%``#J`P!9X\+__YK&___J +M````XP``0./^___K--"-XO"/O>CP3RWI+-!-X@!`H.$!8*#AM#0#XP-PD.H./^___K!`"@ +MX54>H./^___K$""`XP0`H.%5'J#C4$`*#A +M(A0`X[\@`N+^___K)#37Y4`PP^,D-,?EM#0#XP.0E.?Z#Z#C_O__ZP"`4.(# +M```:?`*?Y7P2G^7^___K=0``Z@@`H.$`$*#C^B^@X_[__^L$`*#A*!"(XAP@ +MC>+^___K'%"=Y2!0A>)_,!7B`3"@$Z53@^!UH._F`0!:XP*@H`,2I\GEBE.@ +MX2A0A>($`*#A!1"(X!0@C>+^___K(!!%X@0`H.$!$(C@%""=Y0$PH..#_O_K +M(:#-Y110G>4@4(7B?S`5X@$PH!.E4X/@!:"*X'J0[^:)4Z#A*%"%XJV^A.(+ +M`*#A_O__ZP`PH.$`H*#C`*"-Y00`H.$%$(C@$""-XO[__^L@$$7B!`"@X0$0 +MB.`0()WE"C"@X6G^_^LBD,WE$%"=Y2!0A>)_,!7B`3"@$Z53@^`%D(G@>9#O +MYHE3H.$H4(7B"P"@X?[__^L`,*#A`*"-Y00`H.$%$(C@&""-XO[__^L@$$7B +M!`"@X0$0B.`8()WE"C"@X5'^_^L@D,WE&*"=Y4X-A.(X`(#B_O__ZP!04.(? +M```*(*"*XG\P&N(!,*`3JJ.#X`J@B>!ZH._FBJ.@X00`H.$($(7B_O__ZQ`P +MH.-7,,7E(#!*XA@PA>44,(7E;`"5Y0@0H.$*(*#A_O__ZP0`H.$%$*#AU3V@ +MXP_@H.$#\)3G!`"@X0,0H.,!(*#A(#"-XO[__^L(`*#A^A^@X_[__^L$`*#A +M51Z@X_[__^L(((#C!`"@X54>H.-R(._F_O__ZP0`H.%5'J#C_O__Z^\@`.($ +M`*#A51Z@X_[__^L,,)WE``!3XP@```HD)-?E0"""XP0`H.$B%`#C@\*```_!@``'!`+>D(T$WB`$"@X0%0H.$%8@/C +M````XP``0.,T$)_E!2"@X08PU.?^___K!%#-Y08PU.<%,,WE`1"@XP80S>4$ +M`*#A`R"@XP0PC>+^___K"-"-XG"`O>@0&0``<$`MZ1#03>(`8*#A!!"-Y0)0 +MH.$(0(WB!`"@X0`0H.,%(*#C_O__ZP0`H.$$$(WB!""@X_[__^L,4,WE!@"@ +MX080H.,%(*#C!#"@X?[__^L!`*#C$-"-XG"`O>CP02WI`$"@X0)@H.&T-`/C +M`S"0YQLTT^4!`%/C`0``&O[__^OP@;WH#P+!X_[__^L_<`#B'U`&XB``%N-` +M<(<3!`"@X1(=A>($$('B!R"@X?[__^OP@;WH$$`MZ0$PH.$%$*#C`R"@X_[_ +M_^L!`*#C$("]Z!!`+>D`,%'B!`"@`Q"`O0@`$-/E`2#3Y0(P@^+^___K``"@ +MXQ"`O>@$0"WE2$"0Y0`@D.6T-`/C`S"2YX``4>,$```:`$"4Y8`P".,`,$SC +M!$2#X0\``.J!`%'C!```&@!`E.6`,`#C`C!,XP1$@^$(``#J!P!1XP!`H(,` +M()25`B2@D0,A@I-Q$..6,D?1E0]`!)*$1X*1!`"@X1``O>@>_R_A'O\OX1[_ +M+^$00"WI`$"@X0`0H..,(*#C_O__ZP`P`.,`,$#C##"$Y0`P`.,`,$#C$#"$ +MY0`P`.,`,$#C%#"$Y0`P`.,`,$#C4#"$Y0`P`.,`,$#C8#"$Y0`P`.,`,$#C +M-#"$Y0`P`.,`,$#C.#"$Y0`P`.,`,$#C/#"$Y0`P`.,`,$#C0#"$Y0`P`.,` +M,$#C5#"$Y0`P`.,`,$#C9#"$Y0`P`.,`,$#C;#"$Y0`P`.,`,$#C<#"$Y1"` +MO>CP02WI`$"0Y9`T`>,#8)3G`2"@XU(V`^,#(,3G:7^&X@"`H.,*``#J0`"5 +MY0``4.,````*_O__ZP%`A.($4(7B"`!4X_?__QH'`%;A\(&]"(Q@AN(&4*#A +M"$"@X?'__^IP0"WI`%"0Y6@U`>,#0)7G`2"@XU$V`^,#(,7GV%"$X@)@H.$H +M8,3E$`"4Y0``4.,````*_O__ZP4`5.%P@+T(2$"$XO;__^KP1RWI`7"@X0*0 +MH.$`0)#E`U"@X12`D^5DH)3EB#4#XP,PE.<``%/C!P``&HPU`^,#,)3G``!3 +MXP,``!ID,@/C`S#4YP``4^,%```*3@V$XC@`@.(%$*#A_O__ZP!`H.-L``#J +M`&`/X8``#/$-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4&`%'C`?&?ER4``.K4 +M:@(`\&H"``QK`@`H:P(`4&L"`%!K`@!$:P(`>#0!XP,@E.,#()3G`2""X@,@A.$+``#J<#0!XP,@E.$- +M(*#A?SW"XS\PP^,$()/E`2!"X@0@@^4`,)/E`@`3XP````K^___K0&"5Y1P` +MA.('$*#A*/__ZP!PH.&4-`'C`S"4YP,`$^,"```*N#'5X0``4^,#```*.#"6 +MY8`PP^,X,(;E`@``ZC@PEN6`,(/C.#"&Y6PPF.4HH(;E,'"&Y3PPAN5,D(;E +M`#``XP`P0.-P,(;E;%"&Y08`H.$@$*#C_O__ZP!04.(%```:M#0#XP-`E.?^ +M___KN`:$Y0%`H.,#``#J$`"?Y040H.'^___K`$"@XP0`H.'PA[WHB"@``/!! +M+>D`<*#A;&"0Y0A`EN5.783B.%"%XKHQUN$&`%/C`_&?EQP``.J0;`(`I&P" +M`+AL`@#,;`(`Z&P"`.AL`@#@;`(`>#0!XP,@E.,#()3G`2!"X@,@A.<&``#J<#0!XP,@E.@!(*#CC#4#XP,@A.=, +M`)_E_O__Z_"!O>BT-`/C`U"4Y_[__^N\!H7E43V$X@!@#^&```SQ'%"SY0$@ +MA>,`((/E!O`AX0$`%>/P@;T840V$XA@`@.+^___K\(&]Z*0H``#0*```\$\M +MZ2S03>(`0*#A`;"@X0*0H.$#H*#AM'7=X5B`W>4`4)#E2&"0Y8PU`^,#,)7G +M``!3XW```!ID,@/C`S#5YP``4^-L```:_@!7XP0``)JT`9_EM!&?Y?[__^L` +M8.#C9@``ZD`PD.4``%/C!```&IP!G^64$9_E_O__ZP!@X.->``#J,`"`XAP` +MC>7^___K0#"4Y1@PC>4#`*#A`!"@X_X@H./^___K`0!8XP<``!H`();E@#`` +MXP`P2.,"-(/A)#"-Y<``H.,@`(WE"0``Z@`PEN4#-*#A`C&#XR0PC>48`)WE +M4!"=Y0<@H.'^___K0#"@XR`PC>4`!HWH&`"=Y0@`C>4,<(WEB#,!XQ`PC>4& +M`*#A)!"=Y0L@H.$@,)WE_O__ZP!@4.(H``"J;`!VXQ,`=A,2```:"1"@X0$` +M6.,`(``3`"!`$P`@``,`($`#4`"=Y0`PD.4`,(WE````XP``0.,&,*#A_O__ +MZP$PH..()0/C`C"%YXPE`^,",(7G&@``Z@D0H.$!`%CC`"``$P`@0!,`(``# +M`"!``U``G>4`,)#E`#"-Y0```.,``$#C!C"@X?[__^L`()3EM#0#XP,PDN4&(*#A_O__ZQP` +MG>7^___K````Z@!@H.,&`*#A+-"-XO"/O>CH*```+!D``!@I```00"WI&-!- +MX@1`D.48,(WB!"`CY7$@_^8`,(WE!#"@XP0PC>4`,*#C"#"-Y00`H.$%$*#C +M:___ZQC0C>(0@+WH$$`MZ1C03>($0)#E&#"-X@0@(^5Q(/_F`#"-Y0(PH.,$ +M,(WE`#"@XP@PC>4$`*#A!1"@XUO__^L8T(WB$("]Z!!`+>D8T$WB!$"0Y1@P +MC>($("/E<2#_Y@`PC>4!,*#C!#"-Y0`PH.,(,(WE!`"@X040H.-+___K&-"- +MXA"`O>@$X"WE'-!-X@`PH.,8P(WB!#`LY00`D.5Q(/_F`,"-Y000H.,$$(WE +M`1"@XP@0C>4%$*#C.___ZQ0`G>44($ +M,"SE!`"0Y7$@_^8`P(WE`A"@XP00C>4!$*#C"!"-Y040H.,J___KM`'=X1S0 +MC>(`@+WH!.`MY1S03>(`,*#C&,"-X@0P+.4$`)#E<2#_Y@#`C>4!$*#C!!"- +MY0@0C>4%$*#C&O__ZQ0`W>4D1WDWB`%"@X0&`H.$"8*#A +M`W"@X1!`C>($`*#A`!"@X_X@H./^___K!%"5Y79@_^8$`*#A!Q"@X08@H.'^ +M___K4`"-Z``PH.,(,(WE!0"@X040H.-X(/_F__[_ZQ'>C>+P@;WH\$$MZ0%P +MH.$$8)#E`$"6Y4B`EN6()0/C`B"4YP``4N-J```:C"4#XP(@E.<``%+C9@`` +M&F0B`^,"(-3G``!2XV(``!H#4*#A*##3Y0``4^,"```*)#"5Y0``4^,&```: +M50V$X@P`@.+^___K)`"%Y0``4.,!,*`3*##%%0``5>-2```*!`"@X040H.'^ +M___K*##5Y0``4^,"```*)#"5Y0``4^,<```:USV@XP,`E.>@$0'C(""@X_[_ +M_^LD`(7E``!0XT$```J@()#E@CN@X:,[H.$"/&/B`R""X*`@@.64()#E`S"" +MX)0P@.4D,)7EG""3Y3`@A>6@()/E-""%Y90@D^4X((7EF""3Y3P@A>6@,)/E +M0#"%Y0P``.J<,)/E,#"%Y20PE>6@()/E-""%Y90@D^4X((7EF""3Y3P@A>6@ +M,)/E0#"%Y0`PH.,H,,7E(#4!XP,@U.4&`*#A!Q"@X3O] +M_^M`,)7E*("$Y3``A.4\,(3E^CZ@XTPPA.4`,`#C`#!`XW`PA.5L4(3E!`"@ +MX2`0H./^___K`%"@X0$P@.(!`%/C`4"@DP8``)H<`)_E!1"@X30@E.7^___K +M`$"@XP```.H`0*#C!`"@X?"!O>A\*0``\$$MZ0!@H.%L4)#E#$"5Y2`U`>,# +M(-3G`2!"X@,@Q.>,-0/C`S"4YP``4^,'```:B#4#XP,PE.<``%/C`P``&E$V +M`^,#,-3G``!3XP(```H!,*#C*##%Y?"!O>@T$)#E``!1XS(``!I0()#E&"!" +MXH@_`.,#`%+A"```F@$PH.,H,,7E!`"@X1PU`>,#$)3G`""@XP4PH.'^___K +M\(&]Z&@`A.(`$*#C_O__ZU`PEN4@,(7E)`"5Y5`0EN7^___K50V$XA@`@.(D +M$)7E_O__ZV`U`>,#,)3G`0!3XPL``(H5/(3B`'`/X8``#/$\8+/E`2"&XP`@ +M@^4'\"'A`0`6XP(``!H5#(3B.`"`XO[__^L`(*#C)""%Y2@@Q>4$`*#A'#4! +MXP,0E.<%,*#A_O__Z_"!O>BT`)_E_O__ZS0PEN4@`'/C#0``"@8``,IL`'/C +M"@``"D<`<^,,```*``#J$P!SXP,```H"`'/C`0``"A8`<^/P +M@;T8`2"@XX@U`^,#((3G\(&]Z+0T`^,#,)3G`B"@X[4FP^5H`(3B_O__ZP0` +M4.,#``#:/`"?Y000H./^___K\(&]Z`$PH.,H,,7E!`"@X1PU`>,#$)3G`""@ +MXP4PH.'^___K\(&]Z`P`G^7^___K\(&]Z+@I``#H*0``!"H``/!'+>D`0*#A +M3GV`XCAPA^)L,)#E`@L3X_"'O1B(50/CC&4#XU*&`^,`H*#C!3"4YP$`4^,% +M```*!C"4YP$`4^,"```*"##4YP$`4^,#```:````XP``0./^___K\(>]Z`0` +MH.$'$*#A"B"@X?[__^L``%#C[/__&O"'O>CP3RWI+-!-X@P`C>55/8#B&!"# +MXAP0C>52+8#B."""XA@@C>4,,(/B(#"-Y0`P`.,`,$#C)#"-Y90``.H,()WE +MB!4#XP$PDN7^ +M___KBP``ZA0PG>544)/EH'"3Y0J@U^4(<(WE`("7Y0AIH.$F::#A!!"7Y1`0 +MC>4(()?E`""-Y5A(X^>$0:#A!$"-Y1B0AN($D(G@!;"@X04`6>$`,*"3`3"@ +M@P``5N,!,(,#``!3XV4``!H"A1CB!H"@$Q@`G>7^___K`$!0XE\```H$`*#A +M_O__ZP`PH.-\,(3E:#"$Y0`0G>4/"A'C`#"@$P$PH`,0()WEHBT3X`XPA@(` +M,(T%!0``"G(V`.,#`%;A&AV@DP`0C94.((:"`""-A0P@G>77':#C`0"2YP`0 +MG>4@(*#C_O__ZP!04.(B```*#""=Y=<=H.,!,)+G&#"%Y0A0A.6@`)7E!S`` +MX@@P8^(#`(#@E""5Y0,P@N`(`(#@H`"%Y0@P@^"4,(7E!#"=Y1@0@^(!$(?@ +M!B"@X?[__^N@,)7E=#"$Y7`PA.5L,(3EH""5Y0`0G>4!((+@>""$Y08P@^!T +M,(3E`@!3X0,P9H!T,(2%"@``B@8``.H4`)WE(!"@X_[__^L(`(3E)`"=Y?[_ +M_^L9``#J:#"4Y09@@^!H8(3E!`"@X0@0G>7^___K!`"@X?[__^L!H$KB>J#_ +MY@M0:>```%7C`#"@TP$PH,,``%KC`""@$P$@`P(``%+C"""=%0J@TA4``%KC +M`#"@`P$P`Q(``%/C"7"'$(3__QH4$)WEH#"1Y90P@>4`(*#C5""!Y2``G>44 +M$)WE_O__ZQP`G>7^___K``!0XQ0`C>5E__\:+-"-XO"/O>AL*@``'O\OX?A/ +M+>D`0*#A$WR`XB1PA^*,,P'C`X"0YX`@H.,<-0'C`R"`YV@U`>,#4)#GV+"% +MXARE`>,`D*#C=&4!XP<`H.$*$)3G"2"@X04PH.$X_R_A``!0XP<```H&,)3G +M`3!#X@8PA.<+`%7A`4"@`P(```I(4(7B\/__Z@!`H.,$`*#A^(^]Z`1`+>6T +M-`/C`T"0YP<`4>,!\9^7!P``ZKAY`@#(>0(`]'D"``1Z`@`4>@(`)'H"`#1Z +M`@!$>@(``$"@XR4``.K0-)3E`#""Y0%`H.,A``#J`#"4Y76T-`/C`T"0Y\`VU.4``%/C!0``"L(VU.4#`%/C44$``P!`0`,$0`$`!P`` +M"@`PE.4``%/C7T$`$P!`0!,$0`$064$``P!`0`,$0`$``0"$XQ``O>@>_R_A +M,``MZ;0T`^,#4)#G`#"@XQLTQ>4Z,,7ELS(#XP,PT.<``%/C&C3%!0!`H.,Z +M0,7EYD3%Y2Q$Q>4#,*#C[#6%Y?!%Q>761<7E!#"@X4!0(3B=$#OY@%0 +MA>((`%3C^?__&C``O>@>_R_A`0"@XQ[_+^%P0"WI`$"@X=)=@.(X4(7B'0V@ +MX_[__^NT-`/C`P"$YP``4.,!```:;`&?Y?[__^L`(`#CN#0#XP`@0.,#((3G +M`"``X[PT`^,`($#C`R"$YP`@`./$-`/C`"!`XP,@A.<`(`#CR#0#XP`@0.,# +M((3G`"``X\PT`^,`($#C`R"$YP`@`./0-`/C`"!`XP,@A.<`(`#CU#0#XP`@ +M0.,#((3G`"``X]@T`^,`($#C`R"$YP`@`./<-`/C`"!`XP,@A.<`(`#CX#0# +MXP`@0.,#((3G`"``X_`T`^,`($#C`R"$YP`@`./T-`/C`"!`XP,@A.<`(`#C +M^#0#XP`@0.,#((3G`"``XQ0U`^,`($#C`R"$YP`@`.,8-0/C`"!`XP,@A.<` +M(`#C'#4#XP`@0.,#((3G`"``XR`U`^,`($#C`R"$YP`@`.,D-0/C`"!`XP,@ +MA.<`(`#C*#4#XP`@0.,#((3G`"``XSPU`^,`($#C`R"$YP`@`./5/:#C`"!` +MXP,@A.<`(`#C.#4#XP`@0.,#((3G!0"@X?[__^MP@+WHR"H``'!`+>FT-`/C +M`U"0YP8`4>,#```*!P!1XP!`H!-"```:`P``Z@`PTN41-\7E`4"@XST``.H` +M0-+E``!4XP4``!H`,*#C*33%Y>0`G^7^___K`4"$XC0``.H!`%3C!0``&BDT +MU>4!,,/C*33%Y<0`G^7^___K+```Z@(`5.,$```:*335Y0(PP^,I-,7E`4"@ +MXR4``.H#`%3C!@``&BDTU>4$,,/C*33%Y8P`G^7^___K`4"@XQP``.H$`%3C +M!```&BDTU>4(,,/C*33%Y0%`H.,5``#J!0!4XP0``!HI--7E$###XRDTQ>4! +M0*#C#@``Z@8`5.,!0*`3"P``&BDTU>4!`!/C`@``&L4>H./^___K1P3%Y2DT +MU>4?,(/C*33%Y1@`G^7^___K`4"@XP0`H.%P@+WH\"H``!@K```L*P``4"L` +M`!!`+>FT-`/C`T"0YP`PH.,[-\3EM#'0X0(`4^,0@+T8*S#4Y00`4^,0@+T8 +M`#"4Y9@`4^,9```*"@``BA@`4^,6```*`@``B@@`4^,0@+T8$@``ZB@`4^,0 +M```*B`!3XQ"`O1@-``#JB"`!XP(`4^$1```*`@``BJ@`4^,0@+T8!@``ZI`@ +M`>,"`%/A"@``"J@@`>,"`%/A$("]&`8``.KS$*#C_O__Z_```.(@`%#C`3"@ +M`SLWQ`40@+WH\Q"@X_[__^OP``#B(`!0XP$PH`,[-\0%$("]Z/!'+>D`0*#A +MM#0#XP-0D.%Y2@PD.4D +M-X7E+#"0Y1@WA>4P,)#E'#>%Y30PD.4H-X7E.#"0Y2`WA>4DH-#E)7#0Y;0T +M`^,#4)#G`&"5Y=9AX.<``%;C(@``"@`PH.,P-\7E,3?%Y68>#^/^___K`("@ +MX0\`$.,%```*,#?5Y0$P@^,P-\7E,3?5Y0$P@^(Q-\7E6(+GYP``6.,%```* +M,#?5Y00P@^,P-\7E,3?5Y0$P@^(Q-\7E!`"@X6<>#^/^___K#P`0XX$```HP +M-]7E`C"#XS`WQ>4Q-]7E`3"#XC$WQ>5Z``#J`#"@XS`WQ>4Q-\7E9!X/X_[_ +M_^M0`N'G`P!0XP#QGY<7``#J((`"`#2``@`T@`(`((`"``,PH.,P-\7E`C"@ +MXS$WQ>4.``#J!`"@X4@>#^/^___K#P`0XP$PH!,P-\45`@``&O``$.,",*`3 +M,#?%%0$PH.,Q-\7E`0``Z@$`6N/PA[T8`6`FXK0T`^,#4)3GY3T"XP-`U.<` +M0%3B`4"@$P(`5^,$```*`P!7XR@```H!`%?C\(>]&$$``.H&`!3A"@``"A@W +ME>4R-\7E'">5Y3,GQ>4T-\7E-2?%Y38WQ>4W-\7E.#?%Y3DWQ>7PA[WH`6`F +MX@8`%.$*```*'">5Y3(GQ>48-Y7E,S?%Y30GQ>4U-\7E-C?%Y34X-\7E +M.3?%Y?"'O>@8-Y7E,C?%Y3,WQ>4<)Y7E-"?%Y34GQ>4V-\7E-S?%Y3@WQ>4Y +M-\7E\(>]Z```5N/PA[T8``!4XPL```H8-Y7E,C?%Y1PGE>4S)\7E(!>5Y307 +MQ>4U)\7E-C?%Y34X-\7E.3?%Y?"'O>@8-Y7E,C?%Y1PGE>4S)\7E(">5 +MY30GQ>4U)\7E-C?%Y34X-\7E.3?%Y?"'O>@8-Y7E,C?%Y3,WQ>4T-\7E +M-3?%Y38WQ>4W-\7E.#?%Y3DWQ>7PA[WH,3?5Y0$`4^.B__\:G___ZO!/+>G$ +MT$WB`'"@X4``C>(`$*#C@""@X_[__^O@,@/C`S#7YP``4^,-```:ZC(#XP,P +MU^*`(*#C_O__ +MZPH``.H!(*#CX#(#XP,@Q^?J,@/C`S#7YP``4^,#```:!P"@X0`0H.,!(*#A +M_O__ZP<`H.%`$(WB_O__Z[0T`^,#4)?GX#(#XP,PU^<``%/C`#"@$S8PQ16^ +M0-T%-D#%!;0T`^,#4)?GX#(#XP,PU^<``%/C"0``&D`PC>*Z(-/AO"+%X;PP +MT^&^,L7AOT#=Y31`Q>690-WE-4#%Y0<``.IX-@7CO#+%X30R`>.^,L7A5##@ +MXS0PQ>4R,.#C-3#%Y30PU>4``%/C`P``"OX`4^,`(*`3L"'%$1$``.HL()7E +M`3`"XP@S0^,#`%+A##"@`[`QQ0$*```*`3`"XPDS0^,#`%+A#""@`[`AQ0$$ +M```*`3`"XPHS0^,#`%+A##"@`[`QQ0'@,@/C`S#7YP``4^,%```:RPV'XB$` +M@.)6$(WB!B"@X_[__^L*``#J`"``XP`@0.,4,(WB`P"2Z`0`@^2P$,/ARPV' +MXB$`@.(4$(WB!B"@X_[__^O@,@/C`S#7YP@PC>6T-`/C`S"7YP0PC>44`(WB +M`!"@XRP@H./^___K"#"=Y0``4^,%```:0!"-X@'`H.$`4*#C%."-X@5@H.$M +M``#J%."-X@PPCN(/X([B(A"@XP`@H.,"P*#C`P"@XPP00^4&$$/E`"##Y0;` +MP^4,`,/E$B##Y1@@P^4)$$/E`Q!#Y0,@P^4)P,/E#P##Y14@P^4;(,/E`3"# +MX@X`4^'N__\:`#"@XSXPS>4_,,WE00``ZEH`T^4``,+E8`#3Y08`PN4!0(3B +M`3"#X@$@@N(#`%3C]O__&@%0A>(#P(SB`@!5XP0``!H`0*#C%("-X@1@H.$/ +M4.#C)```ZH4@A>`"(([@##"@X09`H.'H___J9L#1Y5S"H.$/P`SB`,##Y6G` +MT>556W +M0-WE/T#-Y0$PH.,$()WE.##"Y0!`H.,$@*#AJZ#@XYO@X..3P.#CBP#@XPQP +MC>4$<*#A)0``Z@(`5>,(0*"1`@``F@@`5>,!0*"3`D"@@P$P@^($0('@"F"$ +MX`"0UN4`D,/E!I#6Y1R0P^4.D(3@`I#9Y520P^4,D(3@`+#9Y7"PP^4`L(3@ +M!+#;Y8RPP^4&D-GEJ)##Y09@UN4"0(3@!$#4Y00`5N$(0*"1!D!D@'1`[X8X +M0,/E`5"%X@X`5>/<__\:`7"'X@(`5^,+```*!S*@X84``%/CN4#= +M!0=`!`($()T%-T#"!0`PH!,$()T5-S#"%;0T`^,#4)?G`""5Y>`R`^,#,-?G +M``!3XPD```H'(`+B`0!2XP,PH`,I,,4%`C"@$RDPQ14`,*#CW#+%Y2LPQ>4( +M``#J"``2X[E`W16D0J`1O$#=!0]`!`(K0,7E`0!4XP$PH`/=,L4%X$(#XP<` +MH.%`$(WB!"#7Y_[__^NT-`/C`R"7YP0PU^<``%/C`$"@$P,``!H`,)+E"``3 +MX[5`W16]0-T%YCT"XP,PU^<2`%/C`""@DP$@H(.D(Y+A237'!0,```H'`*#A +M?Q`$XO[__^M)!4?`%3C`0``&@$PH.,!-<7E.3#5Y>6T-`/C`T"7YP$@ +MH..H-`/C`R#'Y[`QU.$``%/C`2"@`Z0T`P,#((<'!@``"AP`4^,!(*`3I#0# +M$P,@AQ<&(*`#I#0#`P,@AP,L3E +MX#(#XP,PU^<``%/C!0``"@`PH..Q(@/C`C#'YV+PC[WH<$`MZ0!`H.'^___KG#4#XP,`Q.?^___KM%0#XP4PE.<$ +M(*#C*"##Y00`H.$*$*#C_O__ZU`BX.?J,@/C`R#$YR``(.+0`N#GX#(#XP,` +MQ.<$`*#A+O[_ZP0`H.'^___K!4"4YRDPU.4#`%/C`3"@`PPTQ`4!,*`3#33$ +M%0PTQ!5P@+WH<$`MZ0!`H.&T-`/C`U"0YU4>H.,0(`'C_O__ZP0`H.$5':#C +M!"0&X_[__^L$`*#A6!4`XP4@H./^___K!`"@X5D5`.,"(*#C_O__ZP`PE>4( +M`!/C!```"@0`H.%1'J#C#R8&X_[__^MP@+WH!`"@X5$>H./_)@;C_O__ZW"` +MO>AP0"WI`%"@X;0T`^,#0)#G`#"4Y0@`$^,3```*)"34Y4`@@N,B%`#C@B%0#C_O__ZP`@H.$AP0"WI`&"@X0%`H.$1':#C="#OYO[__^L&`*#A010`XU0D +MY^?^___K`0!4XP!0H),%``":`%"@XZ1`H.$!4(7B=5#OY@$`5./Z__^*!@"@ +MX1(=H.,%(*#A_O__ZW"`O>AP0"WI`%"@X;0T`^,#0)#G`#"4Y0@`$^,1```* +M)"34Y2(4`.._(`+B_O__ZR0TU.5`,,/C)#3$Y04`H.%!%0#C9""@X_[__^LE +M)-3E_B`"XB4DQ.4%`*#A0A4`X_[__^MP@+WH(A4`X_[__^L`(*#A'`3$Y04` +MH.$B%0#C0"""X_[__^MP@+WH<$`MZ0!`H.&T-`/C`U"0YP``4>,)```*(!"@ +MXP0@H./^___K!`"@X2$0H./^___K_B``X@0`H.$A$*#C_O__ZP`PE>6`(`_C +M`"!`XP(@`^`$`*#A$1"@XT(-4N,C(*`3*R"@`_[__^L$`*#A!!"@XP(H!./^ +M___K!`"@X1P0H.,.(*#C_O__ZW"`O>@00"WI`$"@X1P0H.,`(*#C_O__ZP0` +MH.$$$*#C$B@(X_[__^L0@+WH$$`MZ0!`H.&Q,@/C`S#0YP``4^,)```*7!"@ +MX_[__^L`0*#A````XP``0.,$$*#A_O__ZX``%.,0```*$0``ZD,0H./^___K +M]R``X@0`H.%#$*#C_O__ZP0`H.%"$*#C_O__ZP!`H.$```#C``!`XP00H.'^ +M___K"``4XP$```H`0*#C````Z@)`H.,$`*#A$("]Z'!`+>D`0*#A5!4`XVHZ +M`..S()#A_O__ZP0`H.%:%0#C`B"@X_[__^L$`*#A(___ZP0`H.$;%0#C"2"@ +MX_[__^L$`*#A!!8`X_[__^L!4,#C!`"@X006`.,%(*#A_O__ZP0`H.$$%@#C +M`2"%X_[__^L$`*#A7A4`XU`@H./^___K!`"@X5\5`.-0(*#C_O__ZP0`H.%5 +M'J#C&B"@X_[__^L$`*#A)14`XV\@H./^___K!`"@X2'__^L$`*#A51Z@X_[_ +M_^L"((#C!`"@X54>H.-R(._F_O__ZW"`O>AP0"WI`$"@X0)@H.&T-`/C`U"0 +MYP400>(J`%'C`?&?EU<``.I$C@(`3(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(` +M^(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(`8(X"`)R.`@"0C@(`^(X"`/B.`@#X +MC@(`^(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(`^(X"`/B. +M`@#XC@(`^(X"`*B.`@#XC@(`^(X"`/B.`@#XC@(`^(X"`.".`@#XC@(`^(X" +M`/B.`@#LC@(`ME+5X;!0PN$$`*#A(A4`X_[__^L``,;E<("]Z((?H./^___K +M`%"@X0$($.-P@+T(!`"@X8(?H.,!*(7C_O__ZP$PH.,`,,;E<("]Z"DTU>4` +M,,+E<("]Z"DPU>4`,,+E<("]Z*@R`^,#,)#G`@!3XP$PH`,`,,(%<("]"`@6 +M`./^___K!P@0XP`PH!,`,,85`3"@`P`PQ@5P@+WH_#;5Y0`PPN5P@+WH/#<` +MX[,PE>&P,,+A<("]Z!!`+>D`0*#A`1R@X7(@[^8A*(+A'AZ@XP$A@N/^___K +M!`"@X1X>H./^___K`0"@XQ"`O>CP3RWI#-!-X@!`H.$!8*#AM#0#XP-PD.,S```:(```ZK-> +M@.($4(7B!0"@X?[__^L`@*#A!`"@X040H.$((*#A_O__ZP\``.+^___K`)"@ +MX04`H.$($*#A_O__ZP!0H.%T.M3E``!3XP``H`,"```*J0Z$X@H`@.+^___K +M"5Z%X0"PA>$$`*#AJ1Z$X@H0@>+^___K``!0X@$`H!,$`(WE)0``ZN<.@.(, +M`(#B_O__ZP!0H.&A-]3E`0`3XP$`H!,"`*`#_O__ZP"0H.&S#H3B!`"`X@40 +MH.'^___K";Z`X0`PH.,$,(WE$P``ZH%2@.#E7H7B#%"%X@4`H.'^___K`("@ +MX00`H.$%$*#A"""@X?[__^L/``#B_O__ZP"0H.&S#H3B!`"`X@@0H.'^___K +M";Z`X0`PH.,$,(WEP#;7Y0``4^,-```*PC;7Y0,`4^,*```:Q#;7Y0``4^,' +M```*Q3;7Y0``4^,$```*QS;7Y0<`4^,``%,3`[K+`S^PRP,+`*#A_O__ZS^` +M`.(;--?E`0!3XPD``!H?4`;B@%"%XP0PG>4!`%/C(%"%`P0`H.$+$*#A!2"@ +MX?[__^L'``#J!#"=Y0$`4^-`@(@#!`"@X1(=AN($$('B"""@X?[__^M.DAP0"WI`$"@X480H.,`(*#C_O__ZP0`H.%$ +M$*#C_O__Z_]$>+87C!`"@ +MX4(0H.-R(/_F_O__ZP0`H.%,$*#C@"`(X_[__^MP@+WH\$%#'Z#C_O__ZP-0!>(#0`3B!$2@X09CH.$% +M583AP&`&X@-P!^(&4(7A`X`(X@=RA>$(AH?A"J>(X0<``.(`H(KA"0"@X4,? +MH./W+P_C`"!`XP(@"N#^___K\(>]Z/!/+>D,!\9^7B`,`ZD23`@!HDP(`D),"``25`@"DH`(`+)4"`,B5`@#8E0(` +M$)8"`.B6`@!HEP(`V)<"`-R9`@``FP(`$)L"`(B;`@#HFP(`!)P"`*2@`@"D +MH`(`%)P"`""<`@`\G`(`4)P"`&2<`@`4G0(`))T"`$R=`@!`@"\G@(`S)X"``"?`@"DH`(`I*`"``R?`@`TGP(`F)\" +M`*2?`@"DH`(`L)\"`+B?`@"DH`(`X)\"`/"?`@`"$0#C_O__ZPQ@`.(`(-7E +M!`"@X0(1`.,"((;A_O__ZTX#`.H"$0#C_O__ZP`PU>4#(`#B`R&"X00`H.$" +M$0#CH.,2(*#C_O__ZP0`H.$(%@#CCB("XP`@1^/^___K +M!`"@X:06`./_+P_C_O__ZP0`H.&B%@#C`2N@X_[__^L$`*#A614`XP(@H./^ +M___K!`"@X5@5`.,%(*#C_O__ZP0`H.%:%0#C"B"@X_[__^L$`*#A41Z@XP`@ +MH./^___K!`"@X14=H.,$)`;C_O__ZP0`H.%3%0#C`2"@X_[__^L$`*#A51Z@ +MXPP@H./^___K`#"6Y0@`$^,'```*!`"@X54>H./^___K[R``X@0`H.%5'J#C +M_O__ZP8``.H$`*#A51Z@X_[__^O/(`#B!`"@X54>H./^___K!`"@X0(1`./^ +M___K#%``X@0`H.$"$0#C!R"%X?[__^OG`@#J`&"@XP0`H.%A'H;B"!"!X@8@ +MU>?^___K`6"&X@8`5N/W__\:W0(`ZA@@C>(`,*#CLC!BX040H.'^___KME'= +MX15>!>(-4(7CME'-X;92QN&V4=WA`2"%XW(@_^:V($$`*#A010`XR4DH.'^___KMC'=X0$`4^,`4*"3!@``F@!0H..C +M,*#A`5"%XG50[^8!`%/C^O__BK8QS>$$`*#A$AV@XP4@H.'^___KM@(`ZB(5 +M`.,`(-+E_O__Z[("`.H`,-+E``!3XP,```I5'J#C#""@X_[__^NK`@#J51Z@ +MX_[__^OS(`#B!`"@X54>H./^___KI`(`ZK@R`>/38(#A:CH`X[,@D.$"):#A +M!@"@X0<0H.'"/Z#A_O__ZP`L#^/_+T_C`##@XP)@EN`#<*?@`&!6X`%PQ^#` +M.93E`S`#X@,`4^,!`%,3`0``&@0`H.$6_?_K!`"@X54>H./^___K]R``X@0` +MH.%5'J#C_O__ZP0`H.%6'J#C!B"@X?[__^L$`*#A9!4`XP<@H.'^___K!`"@ +MX54>H./^___K"""`XP0`H.%5'J#CH.-R(._F_O__ZQD"`.H(%@#C +M_O__ZR$MP.,$`*#A"!8`X_[__^L$`*#A51Z@X_[__^LP((#C!`"@X54>H.-R +M(._F_O__ZPH"`.K^___K`0!0XP,```K`.93E`S`#X@$`4^,6```:!`"@X:06 +M`./_+P_C_O__ZP`PEN4(`!/C!P``"@0`H.%5'J#C_O__Z^\@`.($`*#A51Z@ +MX_[__^LC``#J!`"@X54>H./^___KSR``X@0`H.%5'J#C_O__ZQL``.H#`%/C +M&0``&@A6`.,$`*#A!1"@X?[__^L"*X#C!`"@X040H.'^___K`#"6Y0@`$^,' +M```*!`"@X54>H./^___K[R``X@0`H.%5'J#C_O__ZP8``.H$`*#A51Z@X_[_ +M_^O/(`#B!`"@X54>H./^___K`#"6Y0@`$^,3```*P#F4Y0,P`^(#`%/C!P`` +M&@0`H.$(%@#C_O__ZX`@@.,$`*#A"!8`X_[__^O!`0#J!`"@X0@6`./^___K +MP""`XP0`H.$(%@#C_O__Z[D!`.H$`*#A"!8`X_[__^M`((#C!`"@X0@6`./^ +M___KL0$`Z@!0TN4``%7C&P``&J06`./_+P_C_O__ZP`PEN4(`!/C!P``"@0` +MH.$(%@#C_O__Z\`@@.,$`*#A"!8`X_[__^L&``#J!`"@X0@6`./^___K0""` +MXP0`H.$(%@#C_O__ZVPPE.4(`!/C)0``"K`QUN$2`%/C)```&B$``.H!`%7C +M!```&J06`.,`(*#C_O__ZS!0H.,=``#J`@!5XQH``!H`,);E"``3XP8```I5 +M'J#C_O__Z^\@`.($`*#A51Z@X_[__^L%``#J51Z@X_[__^O/(`#B!`"@X54> +MH./^___K;#"4Y6``$^,'```*!`"@X4(5`.,"(*#C_O__ZP=0H.,"``#J!U"@ +MXP```.HP4*#C!`"@X2H4`.,%)(7A_O__ZV@!`.I4%0#CL"#2X?[__^MD`0#J +M&Q4`XP`@TN7^___K<3K4Y0``4^->`0`:H5?4Y0$`5>,*4*`#$%"@$V\ZU.6# +M4(7@=5#OY@0`H.$%'*#C!2"@X?[__^L$`*#A!!4`XP4@H.'^___K!`"@X0@5 +M`.,%(*#A_O__ZP0`H.$,%0#C!2"@X?[__^M&`0#J%14`XP`@TN7^___K!`"@ +MX1<5`.,!(-7E_O__ZP0`H.$I%`#C`"#5Y?[__^L$`*#A.Q8`XP`@U>7^___K +M!`"@X3T6`.,`(-7E_O__ZP0`H.$_%@#C`"#5Y?[__^LN`0#J`"#2Y4(4`.,` +M`%+C@""@$P`@H`/^___K)P$`ZAH=H.,`(-+E_O__ZR,!`.H`,-+E*33&Y2`! +M`.H`,-+E``!3XRDTUA4J-,85*C36!2DTQ@49`0#J`"#2Y2DTUN4#,(+A*33& +MY10!`.H`(-+E*336Y0,P`N`I-,;E#P$`Z@`PTN6#D:#A`7"@XP!@H.,&@*#A +M=+8`XP"@`.,!H$CC`S`#XA`P@^,$,(WE`%"@X0,``.H`@*#C`6"&X@%PA^)W +M<._F=D#OY@``5.,+```:!#"=Y0.`B.$)0(3@!0"@X0L0H.$((*#A_O__ZP4` +MH.%G'J#C"B"$X?[__^OM___J"4"$X`4`H.$+$*#A`""@X_[__^L%`*#A9QZ@ +MXPH@A.'^___K!P!7X^'__YKC``#J9QZ@XP,AH./^___KWP``ZG06`.,`()+E +M_O__ZP0@E>4$`*#A9QZ@XP(A@N,!*(+C_O__Z]4``.H%'*#C`""2Y?[__^O1 +M``#J!!4`XP`@DN7^___KS0``Z@`PDN7D,H;E"!4`XP`@DN7^___KQP``Z@P5 +M`.,`()+E_O__Z\,``.H`4-+E!P!5X\```(JL-P'C`S"0YP4`4^,'8*"#`"`` +MDP`@0),#,(*0"E5P4`./^___K^"``X@0`H.%<%`#C!0!6X08@@B$%(((Q +M_O__ZZX``.H`,`#C`#!`XQ`@D^40((WE%#"3Y0PPC>7`-M;E``!3XP,```K" +M-M;E`P!3XPQ@C0(````*$&"-X@!0U>4#`%7CG0``B@)0A>(!,*#C$U6@X750 +M[^8/`%7C!:"@,0^@H",*@*#A"G*@X0!0H.,'D*#A!3#6Y_`@`^('`%+A#S`# +MP@,PB<$%,,;'!3#6YP\@`^("`%CA\#`#L@,PBK$%,,:W!`"@X44>A>(($('B +M!2#6Y_[__^L!4(7B!`!5X^O__QI]``#J"AV@XP`@TN7^___K>0``ZE@>#^,` +M(-+E_O__ZW4``.H`4-+E``!5XP4```H`,);E=S`#XB``4^,!```*`1"@X_[_ +M_^L$`*#A!1"@X?[__^MH``#J`!#2Y?[__^ME``#JQ1Z@XW\@H.,`,)7E_O__ +MZP0`H.%8'`#C?R"@XP`PE>7^___K6P``Z@```.,``$#C_O__ZP0`H.%$$*#C +M`""@X_[__^L$`*#A1A"@X_\@H./^___K!`"@X400H.,`(`#C`2%`X_[__^L$ +M`*#A1!"@XP`A`.,!(4#C_O__ZP```.,``$#C_O__ZT(``.H`$-+E_O__ZS\` +M`.H`$-+E_O__ZSP``.K^___K.@``Z@!0TN7\-M;E!0!3X38```J&'J#C`RR@ +MXP4PH.'^___K_%;&Y3```.H\-P#CL%#2X;-0AN$L``#J(A4`X_\@H./^___K +M!`"@X=P4`./^___KK#0!X[,`A.&S,@/C`S#4YP$`4^,@```*!`"@X:$?H./^ +M___K`2>`XP0`H.&A'Z#C_O__ZV10H..A;Z#C!`"@X080H.'^___K`@@0XP0` +M``H!4$7B=5#OYO\`5>/V__\:`P``Z@``5>,!```:,`"?Y?[__^L$`*#AA1^@ +MXP`@H./^___K!`"@X0(C4*P`` +M$$`MZ?[__^L!`*#C$("]Z!!`+>D(T$WB`$"@X2(5`./_(*#C_O__ZP`@H.,` +M((WE!`"@X0(0H.'_,*#C_O__ZP0`H.$&'*#C0""@X_[__^L$`*#A`A"@XQ8@ +MH./^___K!`"@X0(0H.,4(*#C_O__ZPC0C>(0@+WH,$`MZ0S03>(`0*#AM#0# +MXP-0D.<```#C``!`X_`0G^7^___K!`"@X1$0H./^___K"2"`XP0`H.$1$*#C +M!@`XS@@`.,X($#C`3"@X_[__^L$ +M``#J!`"@X7@8`.,X(*#C`3"@X_[__^L$`*#A!!P`X_`@H.,!,*#C_O__ZP0` +MH.$"&Z#C`B"@XP`PH./^___K!`"@X><>H.,`(.#CH#4"XQLS1N/^___KE3T" +MXP,P0.,`,(WE!`"@X0`0H.,!(*#A`##@X_[__^LI,-7E`@!3XP<``!J5/0+C +M`S!`XP`PC>4$`*#A`1"@XP`@H.,`,.#C_O__ZPS0C>(P@+WH6!D``/!!+>D` +M0*#A`8"@X;0T`^,#,)#GLC'3X2``4^,=``"*@!"@XP`@H./^___K!`"@X0(0 +MH./^___K_RL/XP`@0.,"(`#@!`"@X0(0H./^___K!`"@X0(0H./^___K`"J@ +MX2(JH.$$`*#A`A"@XP4J@N/^___K!`"@X0(0H./^___K`2N`XP0`H.$"$*#C +MH.,@(*#C_O__ZP0`H.'/$0#C(""@X_[_ +M_^L!4*#C`F"@XS)PH.,%``#J!P"@X?[__^L!4(7B=5#OYF4`5>,&```*!`"@ +MX080H.'^___K`0L0X_3__QIC`%7C#```FJP`G^6L$)_E_O__ZP0`H.$#$*#C +M4""@X_[__^L*`*#C_O__ZP(``.J,`)_EA!"?Y?[__^L$`*#A`Q"@XU0@H./^ +M___K!`"@X5@>#^,`(*#C_O__ZP``6.,0```*!`"@X0@0H..C(`?C_O__ZP0` +MH.$H$*#C@""@X_[__^L$`*#A)!"@XP\H"./^___K!`"@X0`0H./Y(*#C_O__ +MZ_"!O>@$`*#A'Q"@XP`@H./^___K\(&]Z/PK``!D&0``-"P``/!!+>D`4*#A +MM#0#XP.`D.<`0*#C!&"@X^ES`.,%`*#A!A"@X?[__^L"`!#C`P``&@<`5.&: +M```*`4"$XO;__^H%`*#A'!"@XP`@H./^___K!0"@X1$0H.,K(*#C_O__ZV0` +MH./^___K!0"@X2$0H./^___K`0`0XPT``!H!((#C!0"@X2$0H.-R(._F_O__ +MZV0`H./^___K!0"@X0`0H./^___K_B``X@4`H.$`$*#C_O__ZP4`H.$$$*#C +M_O__ZP$L@.,%`*#A!!"@XW(@_^;^___K`$"@XP1@H./I!@`XP`@X./^___KN#(#XP,`A.<$`*#A!!P`XP`@X./^ +M___KO#(#XP,`A.<$`*#A`AN@XP`@X./^___KRSV@XP,`A.!@`XS@@`.,X($#C`#"@X_[__^L&``#J`P!3XP0``!H$`*#A>!@` +MXS@@H.,`,*#C_O__ZP0`H.$$'`#C\""@XP`PH./^___K!`"@X0(;H.,"(*#C +M`3"@X_[__^L$`*#AYQZ@XP`@X./^___KQ#(#XP,`A.<$`*#AYQZ@XP`@X..@ +M-0+C&S!`X_[__^L`(*#C`""-Y00`H.$"$*#A`##@X_[__^LI,-7E`@!3XP8` +M`!H`(*#C`""-Y00`H.$!$*#C_S\/XP\P0./^___K!`"@X1$0H./^___K`&"@ +MX0`@E>6`,`_C`#!`XP,P`N!"#5/C_F```O9@!A($`*#A$1"@XP8@H.'^___K +M!`"@X6D>H./^___K`B"`XP0`H.%I'J#C/C_ZR$``.J(`)_E_O__ZXPU +M`^,#,)3G``!3XQ$``!H$`*#AR_W_ZP0`H.$!$*#C*/[_ZP0`H.'I^?_K!`"@ +MX0@0H..C(`?C_O__ZP0`H.$!$*#C@B"@X_[__^L$`*#A`1"@XU_X_^NR,@/C +M`S#4YP``4^,%```*L3(#XP,PU.<``%/C`0``"@0`H.%X^/_K`0"@XQ"`O>A\ +M+```\$(`0*#AM#0#XP.`D.?^___KLS(#XP,PU.<``%/C$P``"@0` +MH.'^___K.C#8Y0``4^,#```*!`"@X0$0H./^___K!```Z@0`H.$`$*#C_O__ +MZP$PH.,Z,,CE!`"@X?[__^L$`*#A_O__ZP%@H.-E`P#J!`"@X6G^_^L`8%#B +M80,`"N4]`N,#H-3G``!:X_F@H`/VH*`3`%"@XP%P2N((``#J`6"%X@0`H.$% +M$*#A!B"@X0[Y_^L`4*#A`0!0XQ\``!H&4*#A!Q"@X0<`5>'S__\Z!`"@X?\@ +MH.,$^?_K`%"@X0$`4.,5```:"0``Z@90H.$!8(7B!`"@X040H.$&(*#A^OC_ +MZP!0H.$!`%#C!```"@H``.K^`%KC"E"@D?/__YH!``#J_@!6X^___YH$`*#A +M_Q"@XPH@H.'L^/_K`%"@X0!@5>(O`P`*M#0#XP-0E.<`8)7EUF'@Y^4]`N,# +M<-3G``!6XZ.0H`,"```*``!7X["0H!/GD*`#,#?5Y0$`$^,`H*`#!0``"@`` +M5N,"```*``!7XPR@H`,````**:"@XP(`$^,&```*``!6XRE@H`,0```*``!7 +MXQQ@H!,"8*`#`@``Z@``5N,*```*`&"@XP0`$^,`4*`#`@``"@``5^,<4*`3 +M`E"@`P0`H.&%'Z#C!2"@X?[__^L)*(KA`B&"XP0`H.$"'*#C!B2"X?[__^OE +M/0+C`U#4YP``5>/Y4*`#]E"@$P0`H.$D%`#C!2"@X?[__^L$`*#A)10`XP4@ +MH.'^___K!`"@X5T4`.,%(*#A_O__ZP0`H.%%'Z#C!2"@X?[__^L$`*#A"1(` +MXP4@H.'^___KM#0#XP-0E.<`,)7E"``3XT$```HQ-]7E`@!3XQ4```H#`%/C +M+@``"@$`4^-0```:,"?5Y0$@0N)R(._F`P!2XP!0H(,`,`"3`#!`DX(P@Y"\ +M5-.1`%"-Y010C>4(4(WE!`"@X040H.$%(*#A!3"@X3KY_^L^``#J,#?5Y0,P +M0^)S,._F`P!3XP!@H(,&4*"!`"``DP`@0).#,(*0M%73D;QETY'E/0+C`S#4 +MYP``4^,&H*`1!7"@$06@H`$&<*`!`*"-Y010C>4(4(WE!`"@X080H.$'(*#A +M!3"@X1_Y_^LC``#JY3T"XP,@U.<#,*#C`#"-Y00PC>4(,(WE!`"@X0$0H.,` +M`%+C`2"@`0(@H!,",*#C$?G_ZQ4``.HQ-]7E`0!3XP<```H"`%/C"P``&N4] +M`N,#4-3G``!5XS-0H`,U4*`3!@``ZC`WU>4"`%/C`@``"@$`4^,_4*`#```` +M"@!0H.,$`*#A#1$`XP4@H.'^___K!`"@X181`./_)P+C_O__ZP0`H.%!'Z#C +M$2"@X_[__^L9--CE``!3XPL```H$`*#A)!4`X_\@H./^___K!`"@X405`.," +M+*#C_O__ZP0`H.%C%`#C!2"@X_[__^L$`*#A_O__ZP``4.,'```:`&"@XU`V +M`^,#8,3G&V3(Y0```.,``$#C_O__ZV0"`.H!,*#C4"8#XP(PQ.<;-,CE```` +MXP``0./^___K!`"@X?[__^L-,@/C`S#4YP$`4^,"(*`#J#(#`P,@A`>T-`/C +M`U"4YP`PE>5W,`/B!""@XR@@Q>4@`%/C`S"@$RDPQ14&,*#C)##(Y00`H.'^ +M___K`&!0XD8"``H$`*#A#Q8`XP0@H./^___K!`"@X4D?H.,`(.#C_O__ZP0` +MH.$2'J#C`"#@X_[__^MA7J#C%F8`XP4PA."S/8/B$3"#X@0`H.$%$*#A`"#3 +MY?[__^L!4(7B!@!5X?7__QH$`*#A`1R@X_[__^L#*,#C!`"@X0$H.,` +M(.#C_O__ZP0`H.$D%@#C`"#@X_[__^L$`*#A$1V@X_[__^L@6J#A!5J@X00` +MH.$1':#C\2\/XP\@0.,"((7A_O__ZP0`H.$H%`#C$"`!X_[__^L$`*#A*A0` +MXS`@`^/^___K!`"@X2@4`.,*(`'C_O__ZP0`H.$Z%@#C"B`!X_[__^L$`*#A +M%!4`XPH@`>/^___K!`"@X185`.,*(`'C_O__ZP0`H.$(%0#C*R0*XUX@0./^ +M___K!`"@X0P5`.-/)`KC_O__ZP0`H.$$%0#C)",*XUX@0./^___K!`"@X04< +MH.,F(@KC+R!`X_[__^L$`*#A0QZ@XP`@H./^___K!`"@X304`.,$)`#C""!! +MX_[__^L$`*#A.!0`XP$B`.,#)$#C_O__ZP0`H.$\%`#C!28`XPH./^___K@"S@X:(LX.$$`*#A0AZ@XW(@[^;^___K!`"@X1D=H.-` +M(*#C_O__ZP8PE.<`(*#C.B?#Y00`H.$,]O_K!`"@X5T5`./_(*#C_O__ZP0` +MH.'^___K`&!0XK,!``H$`*#A_O__ZP!@4.*O`0`*`""8Y8`P#^,`,$#C`S`" +MX(``4^,2```:=R`"XB``4N,/```*53(`XP,P0.,`,(WE!`"@X0`0H.,:(*#C +M`##@X_[__^L`.@#C!3!`XP`PC>4$`*#A`!"@XQL@H.,`,.#C_O__Z_]?#^,/ +M4$#C!`"@X0`0H.,8(*#C!3"@X?[__^L0!(CE!`"@X0$0H.,8(*#C!3"@X?[_ +M_^L4!(CE!`"@X0(;H.,!)*#C`3"@X_[__^L$`*#A`AN@XP(DH.,!,*#C_O__ +MZP0`H.'^___K!`"@X200V.7^___K`#"8Y7H.,#+*#C_O__ZP(`4.,"(*`#_";%!6`UGP4!(*`3_";% +M%5@UGQ58!9_E2!6?Y?[__^L$`*#AS!0`X_\O#^,!(D#C_O__ZP0`H.$C%`#C +M_R"@X_[__^OE/0+C`S#4YP``4^,#```*!`"@X48>H.,`(*#C_O__ZP`@H..H +M,@/C`R"$YSHPV.4"`%/A`P``"@0`H.$!$*#C_O__ZP0``.H$`*#A`!"@X_[_ +M_^L!,*#C.C#(Y00`H.'^___K!`"@X?[__^NT-`/C`U"4YP0`H.%5'J#C_O__ +MZR`$A>4$`*#A(A4`X_[__^L4$`*#A0!X/X^`@H./^___K!`"@X4$>#^.-(*#C_O__ZP0`H.%" +M'@_C@""@X_[__^L$`*#A@Q^@XR`C`./]($#C_O__ZP`@F.6`,`_C`#!`XP,P +M`N"``%/C+P``"@0`H.%`'@_CYB"@X_[__^L$`*#A01X/XY0@H./^___K!`"@ +MX4(>#^.`(*#C_O__ZP0`H.%`'@_CX""@X_[__^L$`*#A01X/XQD@H./^___K +M!`"@X4(>#^.`(*#C_O__ZP0`H.%`'@_CY2"@X_[__^L$`*#A01X/XY$@H./^ +M___K!`"@X4(>#^.`(*#C_O__ZP0`H.%`'@_CXB"@X_[__^L$`*#A01X/XX$@ +MH./^___K!`"@X4(>#^.`(*#C_O__Z[0T`^,#4)3G`*"5Y0B`"N($`*#A^A$` +MX_[__^L`<*#A`0`0XR```!K_7P_C#U!`XP8T#^,`,(WE!`"@X0`0H.,5(*#C +M!3"@X?[__^L&-`_C!#!`XP`PC>4$`*#A`!"@XQ4@H.,%,*#A_O__ZP8T#^,( +M,$#C`#"-Y00`H.$`$*#C%2"@XP4PH.'^___K!C0/XPPP0.,`,(WE!`"@X0`0 +MH.,5(*#C!3"@X?[__^L","?BTS#@YP``6.,`@*`#`8`#$@``6.,C```*=Z`* +MXB``6N,@```:_U\/XP]00.,&-`_C`#"-Y00`H.$!$*#C%2"@XP4PH.'^___K +M!C0/XP0P0.,`,(WE!`"@X0$0H.,5(*#C!3"@X?[__^L&-`_C"#!`XP`PC>4$ +M`*#A`1"@XQ4@H.,%,*#A_O__ZP8T#^,,,$#C`#"-Y00`H.$!$*#C%2"@XP4P +MH.'^___K$``7XP<``!H$`*#A%A"@X_[__^L/(`#B!`"@X180H..0((+C_O__ +MZ[0T`^,#4)3GP#;5Y0``4^-=```*PC;5Y0,`4^-:```:Q3;5Y0``4^,'```* +M!`"@X4`0H..@(*#C_O__ZZ`!G^5`$*#CH""@X_[__^L$`*#A_10`X_[__^O% +M-M7E`0!3XP(PH!,`,*`#`7``XL4'<(/A``!2XP0@H!,`(*`#`G"'X7=P +M[^;]5`#C!`"@X040H.$'(*#A_O__ZT0!G^4%$*#A!R"@X?[__^O$A@#CJEH) +MXZI:2N,$`*#A"!"@X04@H.'^___K%'&?Y0<`H.$($*#A!2"@X?[__^L$@(CB +M0%``X[U?3^,$`*#A"!"@X04@H.'^___K!P"@X0@0H.$%(*#A_O__Z\Q6`.,$ +M`*#A!1"@X4$AH./^___K!P"@X040H.%!(:#C_O__ZP1\`.,$`*#A!Q"@X?[_ +M_^O]4`#B!`"@X0<0H.$%(*#A_O__ZY0`G^4%$*#A_O__ZP%\A^($`*#A!Q"@ +MX?[__^O]4`#B!`"@X0<0H.$%(*#A_O__ZV@`G^4%$*#A_O__ZP0`H.'^___K +M!`"@X140H./I(*#C_O__ZV%>H.,6=@#C!`"@X040H.'^___K`5"%X@<`5>'Y +M__\:!@"@X1#0C>+PA[WHS"P``*09``#<+```Z"P``/0L```(+0``("T``$@M +M``!@+0``$$`MZ0!`H.$<`(#B_O__ZP`PH.,.,,3E$("]Z!!`+>D`0*#ASPV` +MXBP`@.+S___KT0V$X@@`@.+P___K$("]Z'!`+>D!0*#A!0"!Z`(PH.,(,('E +M`%"@XPQ0P>4.4,'E%%"!Y1A0@>4`,`#C`#!`XR@P@>4L$(3E'`"!X@40H.$% +M(*#A_O__ZTQ0A.50,(3B4#"$Y50PA.4`,`#C`#!`XU@PA.5P@+WH$$`MZ0!` +MH.$`(`#CK#0#XP`@0.,#((#GSQV`XBP0@>(!(*#CV___ZP0`H.'1'83B"!"! +MX@(@H./6___K$("]Z'!`+>D`0*#A`5"@X;0T`^,#8)#GC#4#XP,PD.4!`%/C`@``"@(`4^,I```:!0``ZI`@`.($`*#A3A"@XV`@ +M@N/^___K(@``Z@\@`.($`*#A3A"@XR`@@N/^___K'```Z@0PD>4!`%/C`@`` +M"@(`4^,7```:$```ZOTVUN4``%/C!@``"DX0H./^___K!`"@X4X0H./@(*#C +M_O__ZPP``.I,$*#C_O__ZW`@`.($`*#A3!"@X_[__^L%``#J31"@X_[__^MP +M(`#B!`"@X4T0H./^___K`3"@XPPPQ>5P@+WH\$$MZ0!`H.$!4*#AM#0#XP-@ +MD.>,-0/C`S"0YP$`4^/P@;T(B#4#XP,PD.,M;E`0!3XP0``!H$`*#A3A"@XV(@ +MA^/^___K*0``Z@0`H.%.$*#C:""'X_[__^LD``#J!R``X@0`H.%.$*#C"""" +MX_[__^L>``#J!#"1Y0$`4^,"```*`@!3XQD``!H1``#J_3;6Y0``4^,&```* +M3A"@X_[__^L$`*#A3A"@X^@@H./^___K#@``ZDP0H./^___K<"``X@0`H.%, +M$*#C""""X_[__^L&``#J31"@X_[__^MP(`#B!`"@X4T0H.,(((+C_O__ZP`P +MH.,,,,7E\(&]Z/!!+>D`0*#A3&`TY8PU`^,#,);G`0!3X_"!O0B(-0/C`S"6 +MYP$`4^/P@;T(I#0#XP,PEN<&`%/C`_&?EV,$`.HHO`(`[+T"`*C"`@"@Q`(` +MD,<"``3+`@`\S0(`&#"4Y0$`4^,#```:!@"@X000H.$Z___K`@``Z@8`H.$$ +M$*#A??__ZQ0@E.4!($+B%""$Y0@PE.4(`%/C!P``"@D`4^,1```*`P!3XP%0 +MH!,0```:`5!RX@!0H#,-``#J;%"6Y0$`%>,`4*`#!```"B``%>,,```:0``5 +MXPH``!K54>#G``!2XP0```H!``#J`5!RX@!0H#,``%7C$```"FPPEN4!`!/C +M"0``"@PPU.4``%/C(00`&@8`H.$$$*#A#___ZP(``.H&`*#A!!"@X5+__^L` +M,*#C%#"$Y0XPQ.7P@;WH&#"4Y0$`4^,",*`#&#"$!0$PH!,8,(05"#"4Y0,P +M0^(&`%/C`_&?ER4``.I4O0(`<+T"`-"]`@#0O0(`T+T"`'"]`@",O0(``#`` +MXP`P0.,`$)/E'`"$X@H0@>+^___K\(&]Z``P`.,`,$#C`!"3Y1P`A.(4$('B +M_O__Z_"!O>@8,)3E`0!3XP8``!H`,`#C`#!`XP`0D^4<`(3B*!"!XO[__^OP +M@;WH`#``XP`P0.,`$)/E'`"$XB@0@>+^___K\(&]Z``P`.,`,$#C`!"3Y1P` +MA.(4$('B_O__Z_"!O>BT-`/C`W"6Y]%=AN((4(7B-##7Y08`4^,%0*`!&#"4 +MY0$`4^,#```:!@"@X000H.'"_O_K`@``Z@8`H.$$$*#A!?__ZS0PU^4``%/C +M)P``&FPPEN4!`!/C$@``"E4T`^,#,-;G``!3XP8``!H&`*#A!1"@X;'^_^L! +M(*#C530#XP,@QN<9``#J5#0#XP,PUN<``%/C%0``&@8`H.$%$*#AIO[_ZQ$` +M`.I5-`/C`S#6YP``4^,&```:!@"@X040H.'E_O_K`2"@XU4T`^,#(,;G!@`` +MZE0T`^,#,-;G``!3XP(```H&`*#A!1"@X=K^_^L(,)3E`S!#X@@`4^,#\9^7 +MJ@,`ZDB_`@`4OP(`G,T"`'R_`@"@,,-3E``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"! +MXO[__^OP@;WH%#"4Y0$P0^(4,(3E``!3XS```!JH,@/C`S"6YP``4^,#```* +M!@"@X000H.&F_O_K)0``ZFPPEN4!,`/B`0!3XP\``!H0,,3E`S"@XP@PA.4, +M,-3E``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"!XO[_ +M_^L1``#J``!3XP\``!H!,*#C#S#$Y00PH.,(,(3E###4Y0``4^,",*`3&#"$ +M%0$PH`,8,(0%`#``XP`P0.,`$)/E'`"$XF00@>+^___K`#"@XQ(PQ.7P@;WH +MJ#(#XP,PEN<``%/C`P``"@8`H.$$$*#A=?[_Z_"!O>@,,-3E``!3XP(PH!,8 +M,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B$A"!XO[__^OP@;WH%#"4Y0$P +M0^(4,(3E``!3XS$``!JH,@/C`S"6YP``4^,#```*!@"@X000H.%;_O_K)0`` +MZFPPEN4!,`/B`0!3XP\``!H0,,3E`S"@XP@PA.4,,-3E``!3XP(PH!,8,(05 +M`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"!XO[__^L1``#J``!3XP\``!H! +M,*#C#S#$Y00PH.,(,(3E###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P +M0.,`$)/E'`"$XF00@>+^___K`#"@XQ0PA.4.,,3E\(&]Z*@R`^,#,);G``!3 +MXP,```H&`*#A!!"@X2G^_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0% +M`#``XP`P0.,`$)/E'`"$X@40@>+^___K\(&]Z`PPU.4``%/C`C"@$Q@PA!4! +M,*`#&#"$!0`P`.,`,$#C`!"3Y1P`A.(2$('B_O__Z_"!O>@8,)3E`0!3XP@` +M`!H",*#C&#"$Y0`P`.,`,$#C`!"3Y1P`A.)]'X'B_O__Z_"!O>BH,@/C`S"6 +MYP``4^,#```*!@"@X000H.'[_?_K#P``Z@$PH.,0,,3E`S"@XP@PA.4,,-3E +M``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"!XO[__^L` +M,*#C$S#$Y?"!O>@8,)3E`0!3XP,``!H&`*#A!!"@X9K]_^L"``#J!@"@X000 +MH.'=_?_K"#"4Y08`4^,"```*"@!3X_"!O1@V``#J%#"4Y0$P0^(4,(3E``!3 +MXQP``!JH,@/C`S"6YP``4^,#```*!@"@X000H.'+_?_K$0``ZFPPEN4!,`/B +M`0!3XP4``!H(,(3E&#"$Y08`H.$$$*#A>OW_ZP<``.H``%/C!0``&@(PH.,( +M,(3E&#"$Y08`H.$$$*#AN/W_ZP`PH.,2,,3E\(&]Z*@R`^,#,);G``!3XP,` +M``H&`*#A!!"@X:[]_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#`` +MXP`P0.,`$)/E'`"$XA(0@>+^___K\(&]Z!0PE.4!,$/B%#"$Y0``4^,<```: +MJ#(#XP,PEN<``%/C`P``"@8`H.$$$*#AE/W_ZQ$``.IL,);E`3`#X@$`4^,% +M```:"#"$Y1@PA.4&`*#A!!"@X4/]_^L'``#J``!3XP4``!H",*#C"#"$Y1@P +MA.4&`*#A!!"@X8']_^L`,*#C#C#$Y?"!O>BH,@/C`S"6YP``4^,#```*!@"@ +MX000H.%W_?_K\(&]Z`PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$!0`P`.,`,$#C +M`!"3Y1P`A.(%$('B_O__Z_"!O>@8,)3E`0!3XP,``!H&`*#A!!"@X1S]_^L% +M``#J"#"4Y0L`4^.@```*!@"@X000H.%<_?_K"#"4Y08P0^(%`%/C`_&?ERP" +M`.H`Q0(`G,T"`)S-`@#HQ@(`],4"`!S'`@`4,)3E`3!#XA0PA.4``%/C(@`` +M&J@R`^,#,);G``!3XP,```H&`*#A!!"@X47]_^L7``#J;#"6Y0$P`^(!`%/C +M"```&@@PA.48,(3E###4Y0``4^,.```:!@"@X000H.'Q_/_K"@``Z@``4^,( +M```:`C"@XP@PA.48,(3E###4Y0``4^,"```*!@"@X000H.$L_?_K`#"@XQ(P +MQ.7P@;WHJ#(#XP,PEN<``%/C`P``"@8`H.$$$*#A(OW_Z_"!O>@,,-3E``!3 +MXP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B$A"!XO[__^OP@;WH +M%#"4Y0$P0^(4,(3E``!3XR(``!JH,@/C`S"6YP``4^,#```*!@"@X000H.$( +M_?_K%P``ZFPPEN4!,`/B`0!3XP@``!H(,(3E&#"$Y0PPU.4``%/C#@``&@8` +MH.$$$*#AM/S_ZPH``.H``%/C"```&@(PH.,(,(3E&#"$Y0PPU.4``%/C`@`` +M"@8`H.$$$*#A[_S_ZP`PH.,.,,3E\(&]Z*@R`^,#,);G``!3XP,```H&`*#A +M!!"@X>7\_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P0.,` +M$)/E'`"$X@40@>+^___K\(&]Z`PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$!0`P +M`.,`,$#C`!"3Y1P`A.(2$('B_O__Z_"!O>@8,)3E`0!3XP@``!H",*#C&#"$ +MY0`P`.,`,$#C`!"3Y1P`A.)]'X'B_O__Z_"!O>BH,@/C`S"6YP``4^,#```* +M!@"@X000H.&W_/_K!0``Z@$PH.,(,(3E&#"$Y08`H.$$$*#A:?S_ZP`PH.,3 +M,,3E\(&]Z!@PE.4!`%/C`P``&@8`H.$$$*#A8/S_ZP(``.H&`*#A!!"@X:/\ +M_^M;-`/C`S#6YP``4^,,```:8#0#XP,PEN<``%/C"```&@(PH.-@)`/C`C"& +MYU`D`^,",(;G!@"@X=$=AN(($('BDOS_ZP@PE.4$,$/B"`!3XP/QGY=B`0#J +M-,@"`)S-`@"\R`(`G,T"`&C(`@`@R@(`+,D"`'3*`@"HR@(`###4Y0``4^," +M,*`3&#"$%0$PH`,8,(0%`#``XP`P0.,`$)/E'`"$XF00@>+^___K\(&]Z`PP +MU.4``%/C"```"@(PH.,8,(3E`#``XP`P0.,`$)/E'`"$XA00@>+^___K\(&] +MZ`$PH.,8,(3E`#``XP`P0.,`$)/E'`"$X@H0@>+^___K\(&]Z!0PE.4!,$/B +M%#"$Y:@R`^,#,);G``!3XP<```H0,@/C`S"6YP("4^,#``":!@"@X000H.%4 +M_/_K\(&]Z`PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$!0`P`.,`,$#C`!"3Y1P` +MA.(2$('B_O__Z_"!O>@4,)3E`3!#XA0PA.4``%/C'@``&J@R`^,#,);G``!3 +MXP<```H0,@/C`S"6YP("4^,#``":!@"@X000H.$V_/_K#P``Z@$PH.,/,,3E +M!#"@XP@PA.4,,-3E``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4< +M`(3B9!"!XO[__^L`,*#C#C#$Y?"!O>BH,@/C`S"6YP``4^,'```*$#(#XP,P +MEN<"`E/C`P``F@8`H.$$$*#A%_S_Z_"!O>@,,-3E``!3XP(PH!,8,(05`3"@ +M`Q@PA`4`,`#C`#!`XP`0D^4<`(3B!1"!XO[__^OP@;WH###4Y0``4^,(```* +M`C"@XQ@PA.4`,`#C`#!`XP`0D^4<`(3B%!"!XO[__^OP@;WH`3"@XQ@PA.4` +M,`#C`#!`XP`0D^4<`(3B"A"!XO[__^OP@;WH###4Y0``4^,",*`3&#"$%0$P +MH`,8,(0%`#``XP`P0.,`$)/E'`"$X@H0@>+^___K\(&]Z!0PE.4!,$/B%#"$ +MY0``4^,$```:###4Y0``4^.J```*`3"@XQ0PA.4,,-3E``!3XP(PH!,8,(05 +M`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B"A"!XO[__^OP@;WH&#"4Y0$`4^,# +M```:!@"@X000H.&#^__K`@``Z@8`H.$$$*#AQOO_ZP@PE.4&`%/C`@``"@H` +M4^/P@;T8/@``ZA0PE.4!,$/B%#"$Y0``4^,@```:J#(#XP,PEN<``%/C#0`` +M"A`R`^,#,);G`@)3XPD``)H",*#C"#"$Y1@PA.4,,-3E``!3XP\```H&`*#A +M!!"@X:K[_^L+``#J`3"@XP@PA.48,(3E###4Y0``4^,%```:`#``XP`P0.,` +M$)/E'`"$X@40@>+^___K`#"@XQ(PQ.7P@;WHJ#(#XP,PEN<``%/C!P``"A`R +M`^,#,);G`@)3XP,``)H&`*#A!!"@X8_[_^OP@;WH###4Y0``4^,",*`3&#"$ +M%0$PH`,8,(0%`#``XP`P0.,`$)/E'`"$XA(0@>+^___K\(&]Z!0PE.4!,$/B +M%#"$Y0``4^,@```:J#(#XP,PEN<``%/C#0``"A`R`^,#,);G`@)3XPD``)H" +M,*#C"#"$Y1@PA.4,,-3E``!3XP\```H&`*#A!!"@X6O[_^L+``#J`3"@XP@P +MA.48,(3E###4Y0``4^,%```:`#``XP`P0.,`$)/E'`"$X@40@>+^___K`#"@ +MXPXPQ.7P@;WHJ#(#XP,PEN<``%/C!P``"A`R`^,#,);G`@)3XP,``)H&`*#A +M!!"@X5#[_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P0.,` +M$)/E'`"$X@40@>+^___K\(&]Z!@PE.4!`%/C`P``&@8`H.$$$*#A]?K_Z_"! +MO>@&`*#A!!"@X3C[_^OP@;WH`0!3X^+[_QK>^__J"C"@XQ0PA.4!,*#C&#"$ +MY0`P`.,`,$#C`!"3Y1P`A.(R$('B_O__Z_"!O>AP0"WI`%"@X;0T`^,#,)#G +M-##3Y08`4^//38`2+$"$$M%-@`((0(0"`1!!X@8`4>,!\9^76```ZO3-`@#T +MS0(`],T"`*3.`@"DS@(`&,X"``C/`@`!,*#C"#"$Y1@PA.4`,`#C`#!`XP`0 +MD^4<`(3B_O__ZW"`O>@0-=#E``!3XP(```IL,)#E`0`3XW"`O1@2,-3E``!3 +MXW"`O1@.,-3E`0!3XP,``!H<`(3B_O__ZP`PH.,.,,3E`3"@XQ(PQ.4&,*#C +M"#"$Y1@PH.,4,(3E###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P0.,` +M$)/E'`"$XA(0@>+^___K<("]Z`XPU.4``%/C<("]&`@PE.4&`%/C<("]"`$P +MH.,.,,3E"C"@XP@PA.4",*#C%#"$Y0PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$ +M!0`P`.,`,$#C`!"3Y1P`A.(%$('B_O__ZW"`O>@",*#C"#"$Y1@PA.4.,-3E +M``!3XP,```H<`(3B_O__ZP`PH.,.,,3E!0"@X000H.'"^O_K<("]Z'!`+>D` +M0*#AC#4#XP,PD.,"`%,3<("]F`$`4>,#`%$3<("]"*0T`^,#,)3G +M`3!#X@4`4^,#\9^79@8`ZO3/`@#,!\9^75`8`ZE30 +M`@#\T`(`5-`"`(#2`@"`T@(`I-$"`#35`@!4T`(`,-,"`/#3`@`PTP(`U-0" +M``\PU>4``%/C<("]&`@PE>4&`%/C<("]"`L`4^,)`%,3<("]"!,PU>4``%/C +M<("]&!`PU>4!`%/C`P``&AP`A>+^___K`#"@XQ`PQ>4.,-7E`0!3XP,``!H< +M`(7B_O__ZP`PH.,.,,7E`3"@XP\PQ>4#,(/B"#"%Y0PPU>4``%/C`C"@$Q@P +MA14!,*`#&#"%!:0]G^4`$)/E'`"%XF00@>+^___K<("]Z!`PU>4``%/C<("] +M&`@PE>4&`%/C<("]"`L`4^,)`%,3<("]"!,PU>4``%/C<("]&`\PU>4!`%/C +M`P``&AP`A>+^___K`#"@XP\PQ>4.,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,. +M,,7E`3"@XQ`PQ>4",(/B"#"%Y0PPU>4``%/C`C"@$Q@PA14!,*`#&#"%!?P\ +MG^4`$)/E'`"%XC(0@>+^___K<("]Z!`UU.4``%/C`@``"FPPE.4!`!/C<("] +M&!(PU>4``%/C<("]&`@PE>4+`%/C"0!3$W"`O0@3,-7E``!3XW"`O1@/,-7E +M`0!3XP,``!H<`(7B_O__ZP`PH.,/,,7E$##5Y0$`4^,#```:'`"%XO[__^L` +M,*#C$##%Y0XPU>4!`%/C`P``&AP`A>+^___K`#"@XPXPQ>4!,*#C$C#%Y04P +M@^((,(7E$C"#XA0PA>4,,-7E``!3XP(PH!,8,(45`3"@`Q@PA04@/)_E`!"3 +MY1P`A>(2$('B_O__ZW"`O>@.,-7E``!3XW"`O1@(,)7E!@!3XW"`O0@+`%/C +M"0!3$W"`O0@3,-7E``!3XW"`O1@/,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,/ +M,,7E$##5Y0$`4^,#```:'`"%XO[__^L`,*#C$##%Y0$PH.,.,,7E"3"#X@@P +MA>4",*#C%#"%Y0PPU>4``%/C`C"@$Q@PA14!,*`#&#"%!7`[G^4`$)/E'`"% +MX@40@>+^___K<("]Z!,PU>4``%/C<("]&`\PU>4!`%/C`P``&AP`A>+^___K +M`#"@XP\PQ>40,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,0,,7E#C#5Y0$`4^,# +M```:'`"%XO[__^L`,*#C#C#%Y1(PU>4!`%/C`P``&AP`A>+^___K`#"@XQ(P +MQ>4!,*#C$S#%Y0DPH.,(,(7E###5Y0``4^,",*`3&#"%%0$PH`,8,(4%`#`` +MXP`P0.,`$)/E'`"%XA(0@>+^___K<("]Z`\PU>4!`%/C`P``&AP`A>+^___K +M`#"@XP\PQ>40,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,0,,7E#C#5Y0$`4^,# +M```:'`"%XO[__^L`,*#C#C#%Y1(PU>4!`%/C`P``&AP`A>+^___K`#"@XQ(P +MQ>43,-7E``!3XP$PH`,3,,4%`0``"AP`A>+^___K"S"@XP@PA>4,,-7E``!3 +MXP@```H",*#C&#"%Y0`P`.,`,$#C`!"3Y1P`A>)]'X'B_O__ZW"`O>@!,*#C +M&#"%Y0`P`.,`,$#C`!"3Y1P`A>+^___K<("]Z!,PU>4``%/C`P``"AP`A>+^ +M___K`#"@XQ,PQ>4!,*#C#S#%Y00PH.,(,(7E###5Y0``4^,",*`3&#"%%0$P +MH`,8,(4%`#``XP`P0.,`$)/E'`"%XF00@>+^___K<("]Z`(PH.,(,(7E&#"% +MY0\PU>4``%/C`P``"AP`A>+^___K`#"@XP\PQ>40,-7E``!3XP,```H<`(7B +M_O__ZP`PH.,0,,7E#C#5Y0``4^,#```*'`"%XO[__^L`,*#C#C#%Y1,PU>4` +M`%/C`P``"AP`A>+^___K`#"@XQ,PQ>42,-7E``!3XP,```H<`(7B_O__ZP`P +MH.,2,,7E!`"@X040H.$;^?_K<("]Z,]=A.(L4(7B`A!!X@H`4>,!\9^7X`0` +MZI37`@!DV0(`[-8"`.S6`@`@U@(`H-D"`&39`@`4V`(`K-@"`!38`@`(V0(` +M$#74Y0``4^-P@+T8_C,#XP,PU.<``%/C<("]&/0S`^,#,)3G"P!3XPD`4Q-P +M@+T(_S,#XP,PU.<``%/C<("]&/HS`^,#,-3G`0!3XP4``!H-"X3B"`"`XO[_ +M_^L`(*#C^C,#XP,@Q.X-Y_E +M`!"3Y0T+A.((`(#B$A"!XO[__^MP@+WH^C,#XP,PU.<``%/C<("]&&PPE.4! +M`!/C<("]"/0S`^,#,)3G!@!3XW"`O0@+`%/C"0!3$W"`O0C_,P/C`S#4YP`` +M4^-P@+T8`2"@X_HS`^,#(,3G"2""X@8P0^(#((3G`B"@XPPP@^(#((3G"#!# +MX@,PU.<``%/C!#0#$P,@A!C_,P/C`S#4YP``4^-P@+T8^C,#XP,PU.@",*#C]",#XP(PA.<$)`/C`C"$YP`P +M`.,`,$#C`!"3Y0T+A.((`(#B_O__ZW"`O>C^,P/CLS"4X0``4^-P@+T8`C"# +MXO0C`^,",(3G$"""X@(PA.<`-9_E`!"3Y0T+A.((`(#B_O__ZW"`O>@",*#C +M]",#XP(PA.<$)`/C`C"$Y_HS`^,#,-3G``!3XP4```H-"X3B"`"`XO[__^L` +M(*#C^C,#XP,@Q.?^,P/C`S#4YP``4^,%```*#0N$X@@`@.+^___K`""@X_XS +M`^,#(,3G_S,#XP,PU.<``%/C!0``"@T+A.((`(#B_O__ZP`@H./_,P/C`R#$ +MYP`P`.,`,$#C`!"3Y0T+A.((`(#B_O__ZW"`O>@"$$'B"@!1XP'QGY?'`P#J +M^-L"`%3>`@!0VP(`4-L"`(3:`@"4W@(`5-X"`)S<`@!8W0(`G-P"`/S=`@`0 +M-=3E``!3XW"`O1C^,P/C`S#4YP``4^-P@+T8]#,#XP,PE.<+`%/C"0!3$W"` +MO0C_,P/C`S#4YP``4^-P@+T8^C,#XP,PU.CZ,P/C`S#4YP``4^-P@+T8;#"4Y0$` +M$^-P@+T(]#,#XP,PE.<&`%/C<("]"`L`4^,)`%,3<("]"/\S`^,#,-3G``!3 +MXW"`O1@!(*#C^C,#XP,@Q.<)((+B!C!#X@,@A.<"(*#C##"#X@,@A.<(,$/B +M`S#4YP``4^,$-`,3`R"$%P$@H`,$-`,#`R"$!ZPRG^4`$)/E#0N$X@@`@.(% +M$('B_O__ZW"`O>CT,P/C`S"4YPL`4^,)`%,3<("]"/\S`^,#,-3G``!3XW"` +MO1@!,*#C]",#XP(PA.<$)`/C`C"$Y_HS`^,#,-3G``!3XP4```H-"X3B"`"` +MXO[__^L`(*#C^C,#XP,@Q.?^,P/C`S#4YP``4^,%```*#0N$X@@`@.+^___K +M`""@X_XS`^,#(,3G`#``XP`P0.,`$)/E#0N$X@@`@.+^___K<("]Z/\S`^,# +M,-3G``!3XW"`O1CZ,P/C`S#4YP$`4^,%```:#0N$X@@`@.+^___K`""@X_HS +M`^,#(,3G_C,#XP,PU.+^___K<("]Z`$@H.,$-`/C +M`R"$YP`P`.,`,$#C`!"3Y0T+A.((`(#B_O__ZW"`O>C_,P/C`S#4YP``4^,% +M```*#0N$X@@`@.+^___K`""@X_\S`^,#(,3G`C"@X_0C`^,",(3G!"0#XP(P +MA.<`,`#C`#!`XP`0D^4-"X3B"`"`XO[__^MP@+WH_C,#X[,PE.$``%/C<("] +M&`(P@^+T(P/C`C"$YQ`@@N(",(3G$#"?Y0`0D^4-"X3B"`"`XO[__^MP@+WH +M``````(PH./T(P/C`C"$YP0D`^,",(3G^C,#XP,PU.<``%/C!0``"@T+A.(( +M`(#B_O__ZP`@H./Z,P/C`R#$Y_XS`^,#,-3G``!3XP4```H-"X3B"`"`XO[_ +M_^L`(*#C_C,#XP,@Q.?_,P/C`S#4YP``4^,%```*#0N$X@@`@.+^___K`""@ +MX_\S`^,#(,3G`#``XP`P0.,`$)/E#0N$X@@`@.+^___K<("]Z`(P0>(+`%/C +M`_&?EXH"`.K@X`(`X.`"``3C`@`$XP(`!.("`*CG`@!\WP(`R.,"`"CE`@#( +MXP(`K.4"`*3F`@!;-`/C`S#4YP``4^,3```*`""@XULT`^,#(,3GT0V$XB0` +M@.+^___K`C"@XV`D`^,",(3G$"!"X@(PA.=4-`/C`S#4YP``4^,$```*0#$? +MY0`0D^4-"X3B"`"`XO[__^O],P/C`S#4YP``4^-P@+T8]#,#XP,PE.<&`%/C +M<("]"`L`4^,)`%,3<("]"/\S`^,#,-3G``!3XW"`O1CZ,P/C`S#4YP$`4^,% +M```:#0N$X@@`@.+^___K`""@X_HS`^,#(,3G^S,#XP,PU.+^ +M___K<("]Z`(`4>,7```:6S0#XP,PU.<``%/C$P``"@`@H.-;-`/C`R#$Y]$- +MA.(D`(#B_O__ZP(PH.-@)`/C`C"$YQ`@0N(",(3G5#0#XP,PU.<``%/C!``` +M"JPR'^4`$)/E#0N$X@@`@.+^___K^S,#XP,PU.<``%/C<("]&/0S`^,#,)3G +M!@!3XW"`O0@+`%/C"0!3$W"`O0C_,P/C`S#4YP``4^-P@+T8^C,#XP,PU.@0-=3E``!3XP(```IL,)3E +M`0`3XW"`O1C^,P/C`S#4YP``4^-P@+T8]#,#XP,PE.<+`%/C"0!3$W"`O0C_ +M,P/C`S#4YP``4^-P@+T8^S,#XP,PU.+^___K<("]Z%LT`^,#,-3G``!3XQ,` +M``H`(*#C6S0#XP,@Q.?1#83B)`"`XO[__^L",*#C8"0#XP(PA.<0($+B`C"$ +MYU0T`^,#,-3G``!3XP0```J,-1_E`!"3Y0T+A.((`(#B_O__Z_\S`^,#,-3G +M``!3XW"`O1C[,P/C`S#4YP$`4^,%```:#0N$X@@`@.+^___K`""@X_LS`^,# +M(,3G^C,#XP,PU.+^___K<("]Z`$@H.,$-`/C`R"$YX0V'^4` +M$)/E#0N$X@@`@.(*$('B_O__ZW"`O>C_,P/C`S#4YP``4^,%```*#0N$X@@` +M@.+^___K`""@X_\S`^,#(,3G`2"@X_LS`^,#(,3G!""@X_0S`^,#((3G^#,# +MXP,PU.<``%/C`B"@$P0T`Q,#((07`2"@`P0T`P,#((0'`#``XP`P0.,`$)/E +M#0N$X@@`@.)D$('B_O__ZW"`O>C_,P/C`S#4YP``4^,%```*#0N$X@@`@.+^ +M___K`""@X_\S`^,#(,3G`2"@X_LS`^,#(,3G!""@X_0S`^,#((3G^#,#XP,P +MU.<``%/C`B"@$P0T`Q,#((07`2"@`P0T`P,#((0'#5N$X@A0A>(`,`#C`#!` +MXP`0D^4%`*#A9!"!XO[__^M;-`/C`S#4YP``4^,!(*`#6S0#`P,@Q`<"```* +MT0V$XB0`@.+^___K"R"@XU`T`^,#((3G5#0#XP,PU.<``%/C`B"@$V`T`Q,# +M((07`2"@`V`T`P,#((0'`#``XP`P0.,`$)/E!0"@X0H0@>+^___K<("]Z/\S +M`^,#,-3G``!3XP4```H-"X3B"`"`XO[__^L`(*#C_S,#XP,@Q.-P@+T8#@``Z@U;A.((4(7B!0"@X?[__^L!,*#C]",#XP(PA.<$ +M)`/C`C"$YP`P`.,`,$#C`!"3Y04`H.'^___K<("]Z`0`H.'/'83B+!"!XC/T +M_^MP@+WH<$`MZ0!0H.$`0)#EC#4#XP,PE.@>_R_A!$`MY54C,-#E``!3XP0```J!2Z#A#P)4XP!`H!,! +M0*`#`P``ZB`0@>(_`!'C`$"@$P%`H`,$`*#A$`"]Z![_+^$$0"WE'!"0Y2$8 +MH.$!&*#A'!"`Y0`PH.,#0*#ALR"0X0)`).`",(/B(`!3X_K__QH!$(3A'!"` +MY1``O>@>_R_A%3#0Y0``4^,>_R\!`B#0Y0``4N,>_R\1`3!#X@0`4^,#\9^7 +M#P``ZISJ`@"LZ@(`K.H"`+SJ`@"4! +M-8/C!#"!Y1[_+^$$,)'E`S6#XP0P@>4>_R_A*S#0Y0$`4^,"```*`@!3XP<` +M`!H#``#J`#"1Y0$Z@^,`,('E`@``Z@`PD>4".X/C`#"!Y2LPT.4``%/C`#"1 +M%0(Z@Q,`,($5'O\OX48PT.4``%/C'O\O`0`PD>5((-#E`0`2XP(DH!,`(*`# +M`R""X0`@@>5),-#E`0!3XP$F@@,`(($%'O\O`0(`4^,")H(#`""!!1[_+P$` +M`%/C`R:"$P`@@14>_R_A\$\MZ2S03>(`D*#A`6"@X7`0D>4($(WE3BV`XC@@ +M@N(8((WE9#"6Y0$`4^,.```:O##6X08H`.,"`%/A"@``"HXH".,"`%/A!P`` +M"@LPUN4!`%/C!```"A`UT.4!`%/C`0``&@80H.'^___K;*"6Y1PPUN4``%/C +MX```V@@0AN(@$(WE`("@XP`@`.,`($#C%""-Y00@`.,&($#C$""-Y0`@`.,` +M($#C)""-Y0`?#^,!$$#C'!"-Y0`@`.,@+$CC!""-Y0$P0^((`%/A&'"6!0@` +M``H,-`'C`W"9YP1P1^($.P'C`S"9YP``4^,`,*`3'S#6!0=P8^!H4);EM#0# +MXP,PE><,,(WE"D"@X48PUN4!,`/B`#"-Y04`H.$'$*#A_O__ZP``4.,`L*`3 +M"$"*`@&PH`,$`*#A`!"@XR`@H./^___K9!"6Y0\P`>(!`%/C1@``&C(@UN4? +M(`+B!#"4Y0,@@N$$((3E5S#6Y1\P`^(#-(+A!#"$Y4\@UN4"**#A#R@"X@(P +M@^$$,(3E(`"=Y000H.'^___K4S#6Y0$`4^,$,)0%(#"#`P0PA`4$,)050#"# +M$P0PA!6^(-;A##"4Y0(X@^$,,(3E33#6Y0``4^,0,)050#"#$Q`PA!6\,-;A +M!B@`XXX8".,!`%/A`@!3$1<```H+,-;E`0!3XQ0```H04(3B(`"=Y040H.'^ +M___K(`"=Y040H.'^___K$#"4Y0@P@^,0,(3E%#"4Y1P0G>4#,('A%#"$Y3(@ +MUN4,$)WE`B"!X((FTN4#,(+A%#"$Y3,``.H$,)3E0#"#XP0PA.40,)3E`3R# +MXQ`PA.4L``#J`P!3XQ@``!HR(-;E'R`"X@0PE.4#((+A!""$Y54"((/A=S#_Y@,P@N$`,(3E`!"=Y0``4>,!-(,3`#"$%0``6^,& +M```:!#"4Y0$S@^,$,(3E!`"@X?[__^LH0(?B!```Z@0`H.'^___K"*"*XFR@ +MAN4@0(?B!@"@X?[__^L`4*#A"0"@X040H.$$(*#A"#"=Y?[__^L)`*#A!A"@ +MX0<@H.'^___K`8"(XAPPUN4(`%/A!0``V@2@BN`#(!KB`2"@$RJA@N`*H:#A +M,/__ZA@`G>4&$*#A_O__ZRS0C>+PC[WH\$$MZ0!0H.$!0*#A,##1Y57^ +M___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E!0"@X000H.'^___K`0!0XQ<` +M`!H-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K7&"4Y0``5N,%```:5PV% +MXA@`@.)&$(3B_O__ZP!@4.)3```*S#"6Y2``4^-0``":!0"@X080H.'^___K +M``"@X_"!O>A.;87B.&"&X@4`H.$($(3B_O__ZP``4.,D``#*;#"5Y0(+$^,A +M```:!@"@X?[__^L`<%#B'0``"@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[_ +M_^MP<(3E$#"7Y6PPA.440(?E!0"@X6`0E.4$(*#A_O__ZP$`4.,$```:!0"@ +MX000H.'^___K`0"@X_"!O>@&`*#A!Q"@X?[__^L&`*#A!!"@X?[__^L!`*#C +M\(&]Z`4`H.$$$*#A_O__ZP!PH.$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^ +M___K`0!7XQ(```H&`*#A!!"@X?[__^L@-`'CTV"%X0``X.,`$.#C!@"0X`<0 +MH>#S`(7A*#0!X]-@A>$!`*#C`!"@XP8`D.`'$*'@\P"%X0$`H./P@;WH``"@ +MX_"!O>@00"WI_O__ZQ"`O>CP02WI`("@X0%PH.&(0)'EC%#1Y0!@4N(#```: +M`0"@X?[__^L`8%#B\(&]"`<`H.$$$*#A!2"@X?[__^L`0%#B(0``"G!@A.40 +M,);E;#"$Y11`AN5D,)3E#S`#X@$`4^,,```:,##4Y0\`4^,;``"*"`"@X6`0 +ME.4$(*#A_O__ZP!0H.$(`*#A!!"@X?[__^L!`%7C!```&@@`H.$$$*#A_O__ +MZP$`H./P@;WH!P"@X080H.'^___K!P"@X000H.'^___K`0"@X_"!O>@'`*#A +M!A"@X?[__^L``*#C\(&]Z`@`H.$$$*#A_O__Z^G__^H00"WI`""@X5$-@.(8 +M`(#B`!``XP`00./^___K`0"@XQ"`O>@`,*#C(#"!Y2PP@>4(,('E0#"1Y0`` +M4^,X,($5,#"!%30P@17Z/H,2/#"!%1[_+^'P02WI`$"@X0%@H.$0@)#E`#"1 +MY0(#$^,`(*`3`2"@`R<@P.4`()'E4G?@YS=PP.4,$-'E/Q`!XE<0P.4,$);E +M41/@YU@0P.4/.!/B`3"@$R(]$^#P@;T(<%"0Y;`PU>$,$`/B!`!1XWH```K2 +M)^#G`B"7X7<``!H!#!/C`B"@$P`@H`/3-.#G`S""X0,`4^,#\9^7`P``ZF3S +M`@!L\P(`=/,"`'SS`@``4*#C!@``ZA!0A>($``#J"E"%X@(``.H$4(7B```` +MZ@10A>(%`*#AX!"(X@8@H./^___K``!0XUP```IP4)3EL"#5X0$,$N,",*`3 +M`#"@`](DX.<",(/A`0!3XP10A0(!```*$%"%(@10A3(%`*#ARQV(XB$0@>(& +M(*#C_O__ZP!0H.%P,)3EL'#3X00`H.$8$(;B_O__ZP`PH..`,(3E;#"8Y1`` +M$^,:```*5VV(XAA@AN)P4)3EL"#5X0$,$N,",*`3`#"@`](DX.<",(/A`0!3 +MXQ!0A0($```*"E"%,@(``#H"`%/C&%"%$@I0A0(&`*#A!1"@X?[__^L`4%#B +M\(&]"(!0A.4(`*#A!!"@X?[__^OP@;WH_'`'X@``5>,%```:`5"%XH``5^,` +M4*`3`5`%`@``5>/P@;T(;#"8Y6``$^,5```*5VV(XAA@AN)P4)3EL"#5X0$, +M$N,",*`3`#"@`](DX.<",(/A`0!3XQ!0A0($```*"E"%,@(``#H"`%/C&%"% +M$@I0A0(&`*#A!1"@X?[__^L`4%#B@%"$%0@`H.$$$*#A_O__Z_"!O>AP,)3E +ML'#3X?QP!^($`*#A&!"&XO[__^L`4*#C@%"$Y=3__^IP0"WI`&"@X6@U`>,# +M0)#G$EZ$X@8`H.$$$*#A_O__ZTA`A.(%`%3A^?__&F0U`>,#`);G``!0XP$` +M``I)'Z#C_O__ZV`U`>,#,);G``!3XP$```H8`)_E_O__ZU5MAN(8`(;B_O__ +MZPP`AN+^___K<("]Z,`M``#X3RWI`%"@X14,@.(X`(#B`!``XP`00.,%(*#A +M_O__ZU4-A>(L`(#B_O__ZTD/H./^___K9#4!XP,`A><``%#C`+"@`T<```H` +M$*#C22^@X_[__^MD-0'C`T"5YP-`A.(#0,3C:#4!XP-`A>?8<(3B^FZ@XP"` +MH.,$`*#A_O__ZP@`A.+^___K&&"$Y04`H.$$$*#A_O__ZP"P4.($```*"("$ +MY0Q0A.4'`%3A2$"$$O#__QH$(*#C=#4!XP,@A>=5G87B&#")XE@E`>,",(7G +M7"4!XP(PA><`8*#C8#4!XP-@A><,D(GB3#4!XP.0A>=0-0'C`Y"%YU0U`>,# +M8(7GUWV@XZ"!`>,@H*#C!P"5YP@0H.$*(*#A_O__ZP!`4.(-```*!S"5YQ@P +MA.6@()3E@CN@X:,[H.$"/&/B`R""X*`@A.64()3E`S""X)0PA.4)`*#A!!"@ +MX?[__^L!8(;B"`!6X^C__QH+`*#A^(^]Z`1`+>6T-`/C`T"0YP`PH..T-L3E +MM3;$Y;@VA.6\-H3E$`"]Z![_+^%P0"WIM#0#XP-`D.>T-M3E`0!3XP!0H`,? +M```*(1Z@X_[__^L`4*#AZCH.X^HZ3N,#`%#A0#"@`[4VQ`48```*``!0XP4` +M``I<`)_E!1"@X?[__^L(,*#CM3;$Y1```.JU)M3E``!2XP!0H`,$```*.`"? +MY3@0G^7^___KM5;4Y?E0!>(L`)_E)!"?Y04@H.'^___K`#"@X[4VQ.4%`*#A +M<("]Z+4FU.7P___JW"T``.PM```(&@``""X``/!/+>D,T$WB`$"@X;0T`^,# +M8)#G`#"@X[4VQN77/:#C`S"0YY0QD^4((+/E`0`2XP4``!H`4`_A@``,\0`@ +MD^4!((+C`""#Y07P(>$$`*#A_O__ZU&-A.(8@(CB"`"@X?[__^MJ?H;B"'"' +MX@<`H.'^___K`3"@X[0VQN4"(*#CK#(#XP,@A.=L,)3E`0`3XZX```JT-`/C +M`U"4YP0`H.$`$*#C_O__ZP0`H.&D%@#C`""@X_[__^L$`*#A4Q4`XP,@H./^ +M___K`#"5Y0@`$^,(```*!`"@X54>H./^___K$""`XP0`H.%5'J#CH./^___K,""`XP0`H.%5'J#C%]3EH"?4Y9\WU.7^___KY3T"XP,PU.<``%/C&0``"@0`H.$%'*#C +M'",$XR\@0./^___K!`"@X005`.,<)`7C7B!`X_[__^L$`*#A"!4`XR4E"N/^ +M___K!`"@X0P5`.-))0KC_O__Z]`TE.4``%/C%P``&@0`H.$(%0#C(",$X_[_ +M_^L2``#J!`"@X04($#C_O__ +MZP0`H.$(%0#C(",%XQ`@0./^___K!`"@X0P5`.-$)`KC_O__ZQ15`^,$`*#A +M`Q"@XZTNA.($((+B#^"@X07PE.<(((WB`#"@XP$P8N4$`*#A#!"@XP_@H.$% +M\)3GP!G4Y00`H.$#$`'B_O__ZP0`H.$!$*#C_O__ZP0`H.'<%`#CK#0!XP,@ +MU.?^___KU#F4Y0(`4^,$```:!`"@X1H=H./,(*#C_O__ZP,``.H$`*#A&AV@ +MX\\@H./^___KK#G83B*)")X@!0H..PIP'C +M!;"@X0HPE.<#`%7A!0``&@0`H.$)$*#A!2"@X0$PH./^___K!```Z@0`H.$) +M$*#A!2"@X0LPH.'^___K`5"%X@0`5>/N__\:$P``Z@0`4^,"`%,3$```&E<- +MA.(8`(#BX!"$XO[__^L`4%#B"@``"@0`H.$%$*#A`2"@X_[__^L$`*#A7AV$ +MXB@0@>((.`'C`R"4YP`PH./^___K;#"4Y2(]P^-L,(3E`#"@X[0VQN4'`*#A +M_O__ZU$]A.(`8`_A@``,\1Q0L^4!((7C`""#Y0;P(>$!`!7C`0``&@@`H.'^ +M___K`#``XP`P0.,`$)/E40Z$X@@`@.+($('B_O__Z]<]H.,#,)3GE"&3Y0(P +MH.$($+/E`0`1XPD```H`4`_A@``,\0!`D^4!$,3C`!"#Y07P(>$!`!3C`0`` +M"@0`DN7^___K#-"-XO"/O>CP02WI`$"@X<4>H./^___K`%"@X00`H.%8'`#C +M_O__ZP!@H.$$`*#A)!@`X_[__^L`@*#A!`"@X0(;H./^___K`'"@X?]0Q>,` +M-`/C5#E&XP,`5>$0```:_V#&XP`T`^-4.4;C`P!6X0L``!K_@,CC`#``XSDP +M2.,Y"%CC`P!8$04``!K_<,#C`#``XP0S2./!!U?C`P!7$?"!O0@$`*#A_O__ +MZ_"!O>AP0"WI`$"@X;0T`^,#8)#G(1Z@X_[__^L``%#C`0``"@0`H.'^___K +M_O__ZP!0H.&4-`'C`S"4YP``4^-P@+T8N`:6Y04`8.#^___K?0Y0XW"`O9B\ +M!I;E``!0X[Q6A@5P@+T(!0!@X/[__^OZ#E#C<("]F`P`G^7^___K!`"@X?[_ +M_^MP@+WH)"X``!!`+>FT-`/C`T"0YVH.A.((`(#B_O__ZP`PH..T-L3EM3;$ +MY;@VA.6\-H3E$("]Z```@.4$`(#E'O\OX0`PD.4``%/A``"@$P$`H`,>_R_A +M!#"1Y00`@>4*`(#H``"#Y1[_+^$$,(#B"@"`Z`@P@.4>_R_A'O\OX00P@.(! +M(*#C#`"`Z`@P@.4>_R_A'O\OX1[_+^$>_R_A#2"@X7\]PN,_,,/C!""3Y0$@ +M@N($((/E'O\OX0T@H.%_/<+C/S##XP0@D^4!((+B!""#Y1[_+^$00"WI_O__ +MZQ"`O>@00"WI_O__ZQ"`O>@``%'A``"@$P$`H`,>_R_A`#``XP`P0.,``)/E +M'O\OX?H_H..3``/@'R4(X^LA1>.2$X+@H@*@X1[_+^$`,`#C`#!`XP`PD^4# +M,&#@^B^@XY(#`^`?)0CCZR%%XY(3@N"B`J#A'O\OX0$08.#Z/Z#CDP$!X!\U +M"./K,47CDR&#X*,"H.$>_R_A`!"`Y1[_+^$``)#E'O\OX3``+>F?3Y#A`4"$ +MX)1?@.$``#7C^O__&C``O>@>_R_A,``MZ9]/D.$!0$3@E%^`X0``->/Z__\: +M,`"]Z![_+^$P`"WIGT^0X0%`A.*47X#A```UX_K__QHP`+WH'O\OX3``+>F? +M3Y#A`4!$XI1?@.$``#7C^O__&C``O>@>_R_A,``MZ9]/D.$!0(3@E%^`X0`` +M->/Z__\:!`"@X3``O>@>_R_A,``MZ9]/D.$!0$3@E%^`X0``->/Z__\:!`"@ +MX3``O>@>_R_A,``MZ9]/D.$!0(3BE%^`X0``->/Z__\:!`"@X3``O>@>_R_A +M,``MZ9]/D.$!0$3BE%^`X0``->/Z__\:!`"@X3``O>@>_R_A\$,"```:!%"@X0```.H`4.#C!0"@X?"'O>CP1RWI +M`&"@X0&`H.$"<*#A$#"0Y0``4^,8```*##"3Y0``4^,5```*``!2XP!`H-,0 +M``#:(*"`X@!`H.,0P);E!@"@X000B.`'(&3@"C"@X0_@H.$,\)SE`%!0X@,` +M`-H%0(3@!`!7X?/__\H!``#J``!5XP(``!H$4*#A````Z@!0X.,%`*#A\(>] +MZ!!`+>D"0*#A_O__ZP(`H.$#$*#A$("]Z!!`+>D"0*#A_O__ZP$`H.$`$*#C +M$("]Z/!!+>D`<*#A`6"@X0@`H.,!$*#C_O__ZP!04.(%0*`1X&*D%01PA!4% +M`*#A\(&]Z!!`+>D`$*#C_O__ZP``H.,0@+WH<$`MZ0!0H.$!`*#A`A"@X0,@ +MH.'^___K`$"@X0$*<.,`,*"#`#"%A0``H($`0(65``"@DW"`O>@00"WI`"`` +MXP`@0.,`,0#C$#!`XP`@DN4#`%+A!@``"@`@`.,`($#C`#(`XR`P0.,$()+E +M`P!2X0,``!H8`)_E&!"?Y?[__^L0@+WH````XP``0./^___K$("]Z#PN```H +M&@``$$`MZ0`@`.,`($#C`#$`XQ`P0.,`()+E`P!2X08```H`(`#C`"!`XP`R +M`.,@,$#C!""2Y0,`4N$#```:&`"?Y1@0G^7^___K$("]Z````.,``$#C_O__ +MZQ"`O>@\+@``/!H``!!`+>D`(`#C`"!`XP`Q`.,0,$#C`""2Y0,`4N$&```* +M`"``XP`@0.,`,@#C(#!`XP0@DN4#`%+A`P``&A@`G^48$)_E_O__ZQ"`O>@` +M``#C``!`X_[__^L0@+WH/"X``%`:```00"WI````XP``0.,`$*#C`"``XP`@ +M0./^___K$("]Z!!`+>G^___K$("]Z'!`+>D`0%#B<("]"+!5!N-F5D#C!0"@ +MX?[__^L!0%3B^___&G"`O>@00"WI?0Y0XP(``+H!`*#C_O__ZQ"`O>C3/03C +M8C!!XY,@P^#`#Z#A0P-@X`$`@.+^___K$("]Z!!`+>G^___K$("]Z!!`+>ED +M0*#CE``$X-,]!.-B,$'CDR3#X,1/H.%#0V3@``!4XP%`H`,-(*#A?SW"XS\P +MP^,,,)/E`2"@XP`@@^4$`*#A_O__ZQ"`O>@00"WI#2"@X7\]PN,_,,/C!""3 +MY0$@0N($((/E`#"3Y0(`$^,0@+T(_O__ZQ"`O>@00"WI#2"@X7\]PN,_,,/C +M!""3Y0$@0N($((/E`#"3Y0(`$^,0@+T(_O__ZQ"`O>@00"WI_O__ZP$`<.(` +M`*`S$("]Z!!`+>G^___K$("]Z!!`+>D``%+C$("]"/[__^L0@+WH$$`MZ?[_ +M_^L!`'#B``"@,Q"`O>@00"WI_O__ZQ"`O>AP0"WI`$"@X0%@H.'7/:#C`U"0 +MYP``4.,V```*Q#4#XP,`D.<``%#C`P``"O[__^L`(*#CQ#4#XP,@A.?^___K +M``!0XP(``!H%`*#A_O__ZP$``.H%`*#A_O__ZP4`H.'^___KQ#4#XP-0A.<$ +M`*#A_O__ZP!04.(>```*8#"4Y2`P@^(0,H7E8`"4Y2``@.(%$*#A_O__ZP4` +MH.$&$*#A_O__ZT`!E>7+'83B(1"!X@8@H./^___K_O__ZP``4.,#```:!0"@ +MX?[__^L`0*#A`@``Z@4`H.'^___K`$"@X0``5.,#```:!0"@X?[__^L``*#C +M<("]Z```X.-P@+WH$$`MZ?[__^L0@+WH$$`MZ2`0H./^___K$("]Z'!`+>D` +M4*#A_O__ZP!`4.($```*``!5XP(```H$`*#A!1"@X?[__^L$`*#A<("]Z!!` +M+>G^___K$("]Z!!`+>D`0%#B$("]".`"E.4``%#C$("]"/[__^L$`*#A_O__ +MZQ"`O>@00"WI_O__ZQ"`O>AP0"WI`%"@X?[__^L`0%#B!```"@``5>,"```* +M!`"@X040H.'^___K!`"@X7"`O>CP02WI`$"@X0@`H.,!$*#C_O__ZP!@4.(1 +M```*+GZ&X@0`H.'^___K`%"@X0"`H.$``%#C`P``"@``5.,!```*!!"@X?[_ +M_^L`@(?E``!5XP1`AQ4"```:!@"@X?[__^L`8*#C!@"@X?"!O>@$0"WEX$*0 +MY2`T`>,#()3GT#4#XP,@A.?H-`'C`R"4Y\PU`^,#((3G*#0!XP,@E.?H-0/C +M`R"$Y_`T`>,#()3GY#4#XP,@A.<8-`'C`R"4Y]@U`^,#((3GX#0!XP,@E.?4 +M-0/C`R"$Y]<-A.(,`(#B$`"]Z![_+^%P0"WIX$*0Y64R`^,#,-3G`0!3XP4` +M`!JH,@/C`S"4YP(`4^,!(*`#I#(#`P,@A`H,@/C`S"4 +MYP``4^,2```:``!0XPD```J4,9#E"""SY0$`$N,%```:`%`/X8``#/$`()/E +M`2""XP`@@^4%\"'AK#0#XP,PE.<``%/C`@``"@0`H.$'$*#C,_\OX0``H.-P +M@+WH$$`MZ0!`H.'P-`/C#^"@X0/PD.<`,*#C428#XP(PQ.=2)@/C`C#$YU,F +M`^,",,3G'B"@XU@DA.4!(*#C2B7$Y:`B`^,",(3GJ"(#XP(PA.=F(@/C`C#$ +MYP``H.,`$*#C("0!X_(`A.'H)`'C\@"$X1`UQ.5L,)3E(CW#XVPPA.5T-0/C +M`S"4YP``4^,!```*!`"@X3/_+^$`,*#CG"(#XP(PQ.>(.83E`#``XP`P0.,` +M,)/EN"4!XP(@E.=D$*#CD0(!X-,M!.-B($'CD@&!X%8-A.((`(#B(1.#X/[_ +M_^L!`*#C$("]Z!!`+>D`0*#A````XP``0.,`$`#C`!!`X_[__^L$`*#A,!"@ +MXP`@H.,4-0/C#^"@X0/PE.>\-0/C`S"4YP``4^,!```*!`"@X3/_+^&,-0/C +M`S"4YP``4^,0@+T8!`"@X?[__^L0@+WH<$`MZ0!`H.'7/:#C`U"0YWD.@.+^ +M___K2PV$X@@`@.+^___K$PR$XA``@.+^___K;`"$XO[__^M.#83B.`"`XO[_ +M_^M7#83B&`"`XO[__^M2#83B.`"`XO[__^L$`*#A_O__ZP0`H.'3/:#C#^"@ +MX0/PE.?$-0/C`P"4YP``4.,#```*_O__ZP`@H./$-0/C`R"$YP``5>,!```* +M!0"@X?[__^L!`*#C<("]Z!!`+>D`0*#A10Z`X@P`@.+^___K20Z$XO[__^M1 +M#H3B"`"`XO[__^L$`*#A_O__Z\D-A.(H`(#B_O__ZU8-A.((`(#B_O__ZP0` +MH.'H-`/C#^"@X0/PE.<0@+WH<$`MZ0!`H.%&.@+C`R#0YQ0T`>,#(,#G1SH" +MXP,PT.<5)`'C`C#`YQ8D`>,",,#G2CH"X[,@D.$,-`'C`R"`YQXPH.-8-(#E +M`6"@XTIEP.4`4*#CU%2`Y1L\H.,#4,#G6#H"XP,@T.<$.P'C`R"`YUDZ`N,# +M(-#G"#L!XP,@@.>H-P'C`U"`YZPW`>,#4(#GL#,#8(#G$#L!XP-0@.<4.P'C`V"`Y_[__^L$`*#A_O__ZP0`H.'P-`/C#^"@ +MX0/PE.=1-@/C`U#$YU(V`^,#4,3G4S8#XP-0Q.<&`*#A<("]Z'!`+>D`0*#A +M2PV`X@@`@.+^___K``!0XT````H,,P'C`T"$YQ,,A.(0`(#B_O__ZP``4.,Y +M```*!`"@X?[__^L``%#C-0``"@0`H.'^___K``!0XS$```I.#83B.`"`X@00 +MH.'^___K``!0XP,``!JT`)_E_O__ZP!0H.,H``#J4@V$XC@`@.($$*#A_O__ +MZP``4.,#```:D`"?Y?[__^L`4*#C'@``ZEX-A.(H`(#B`!"@XW`B`>/^___K +M5PV$XA@`@.+^___K``!0XP,``!I<`)_E_O__ZP!0H.,0``#J_#8!XP-`A.<$ +M`*#A_O__ZP0`H.'^___K!`"@X?[__^L`4*#A!`"@X?[__^L$`*#A_O__ZP0` +MH.'^___K````Z@!0H.,%`*#A<("]Z(`N``"<+@``N"X``!!`+>D`0*#A2PV` +MX@@`@.+^___KH#4#XP,PE.<``%/C$("]"$L-A.(4`(#B_O__ZQ"`O>@00"WI +M`$"@X0```.,``$#C!!"@X08LH./^___KH#4#XP,`A.<``.#AH`^@X1"`O>@0 +M0"WIX$*0Y<@U`^,#,)3G``!3XP0``!K+#83B(0"`X@(0@>(&(*#C_O__ZP`` +MH.,0@+WH\$$MZ0`04.(#```*6`8#X_[__^L`0*#A`@``ZE@&`^/^___K`$"@ +MX0``5..A```*X&*4Y=<]H.,#0(;G?`*?Y?[__^MX,I_EM#"$Y4L_H..L,83E +M;#*?Y:PPA.5H4#(,;G`3"#X@@@E>4#(,;G!#"#X@P@E>4#(,;G`3"# +MXA`@E>4#(,;G`3"#XK0AU>&S((;A`C"#XK@AU>&S((;A!3!#XAP@E>4#(,;G +M`C!#XB`@E>4#(,;G"3"#XB0@E>4#(,;G`3"#X@P@E^4#(,;G`3"#XA`@E^4# +M(,;G`3"#XA0@E^4#(,;G"S!#XB@@E>4#(,;G#3"#XBP@E>4#(,;G`3"#XC`@ +ME>4#(,;G`C"#XK0CU>&S((;A`C"#XA@@E^4#(,;G`3"#XAP@E^4#(,;G`3"# +MXB`@E^4#(,;G`3"#XB0@E^4#(,;G`3"#XC@@E>4#(,;G`3"#XB@@E^4#(,;G +M`3"#XBP@E^4#(,;G`3"#XC`@E^4#(,;G`3"#XC0@E^4#(,;G`3"#XC@@E^4# +M(,;G`3"#XCP@E^4#(,;G#CV#XCP@E>4#(,;G`3"#XD`@E>4#(,;G`3"#XD0@ +ME>4#(,;G`3"#XD@@E>4#(,;G`3"#XD`@E^4#(,;G`3"#XD0@E^4#(,;G`3"# +MXDP@E>4#(,;G`3"#XE`@E>4#(,;G`3"#XE0@E>4#(,;G`3"#XE@@E>4#(,;G +M`3"#XEP@E>4#(,;G`3"#XF`@E>4#(,;G`C"#XF0@E>4#(,;G`3"#XD@@E^4# +M(,;G3'"7Y0$P@^(#<,;G:%"5Y0$P@^(#4,;G!`"@X?"!O>C4+@``?!H````` +M``"H-P``L$L!`/PN```00"WI`$"@X?[__^L$`*#A_O__ZP``H.,0@+WH<$`M +MZ0!0H.'@8I#E2#8#XP-`EN<`(*#C`R"&YP(`5.%P@+T(````XP``0.,$$*#A +M_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K````XP``0.,$ +M$*#A_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K````XP`` +M0.,$$*#A_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K```` +MXP``0.,$$*#A_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K +M````XP``0.,$$*#A_O__ZP```.,``$#C!!"@X?[__^L`0`#C`$!`XP4`H.%0 +M$)3E_O__ZU10E.4!4$7B5%"$Y0``5>-P@+T84!"4Y0``4>-P@+T(````XP`` +M0./^___K`$``XP!`0.,`,`#C`#!`XU@`A.(<$)/E_O__ZP`PH.-0,(3E<("] +MZ/!!+>D`0*#AX&*0Y0`P`.,`,$#C4%"3Y0``5>,M```:M#'6X0(`4^,%```: +MW`2?Y0`0`.,`$$#C"2"@X_[__^L&``#J`P!3XP0``!J\!)_E`!``XP`00.,) +M(*#C_O__ZP!0`.,`4$#C`#``XP`P0.-8`(7B`1F@XQP@D^7^___K`""@X5`` +MA>4``%#C`@``&GP$G^7^___K\(&]Z````.,``$#C)!$(X_[__^L`4%#B!``` +M"@`P`.,`,$#C.#"%Y31`A>4#``#J````XP``0./^___K\(&]Z$@V`^,#,);G +M``!3X_"!O1@`,`#C`#!`XP0`H.%M$03C4""3Y?[__^L`<*#A2#8#XP,`AN<` +M`%#C$```&OPSG^540)/E``!4XPD``!I00)/E``!4XP8```H#0*#A6`"#XMPS +MG^4<$)/E_O__ZP`PH.-0,(3ES`.?Y?[__^OP@;WH`#``XP`P0.-44)/E`5"% +MXE10@^4```#C``!`XR01".,'(*#A_O__ZP!04.(.```*`#``XP`P0.,X,(7E +M-$"%Y0`P`.,`,$#C/#"%Y0```.,``$#C)!$(XP<@H.'^___K`%!0X@0``!H2 +M``#J````XP``0./^___K\(&]Z``P`.,`,$#C.#"%Y31`A>4`,`#C`#!`XSPP +MA>4```#C``!`XR01".,'(*#A_O__ZP!04.($```:#P``Z@```.,``$#C_O__ +MZ_"!O>@`,`#C`#!`XS@PA>4T0(7E````XP``0.,D$0CC!R"@X?[__^L`4%#B +M!```&@\``.H```#C``!`X_[__^OP@;WH`#``XP`P0.,X,(7E-$"%Y0```.,` +M`$#C)!$(XP<@H.'^___K`%!0X@0``!H/``#J````XP``0./^___K\(&]Z``P +M`.,`,$#C.#"%Y31`A>4```#C``!`XR01".,'(*#A_O__ZP!04.($```:#P`` +MZ@```.,``$#C_O__Z_"!O>@`,`#C`#!`XS@PA>4T0(7E````XP``0.,D$0CC +M!R"@X?[__^L`4%#B!```&@\``.H```#C``!`X_[__^OP@;WH`#``XP`P0.,X +M,(7E-$"%Y0```.,``$#C)!$(XP<@H.'^___K`%!0X@0``!H/``#J````XP`` +M0./^___K\(&]Z``P`.,`,$#C.#"%Y31`A>4```#C``!`XR01".,'(*#A_O__ +MZP!04.($```:#P``Z@```.,``$#C_O__Z_"!O>@`,`#C`#!`XS@PA>4T0(7E +M````XP``0.,D$0CC!R"@X?[__^L`4%#B!```&@\``.H```#C``!`X_[__^OP +M@;WH`#``XP`P0.,X,(7E-$"%Y0```.,``$#C)!$(XP<@H.'^___K`%!0X@0` +M`!H/``#J````XP``0./^___K\(&]Z``P`.,`,$#C.#"%Y31`A>4```#C``!` +MXR01".,'(*#A_O__ZP!04.($```:#P``Z@```.,``$#C_O__Z_"!O>@`,`#C +M`#!`XS@PA>4T0(7E````XP``0.,D$0CC!R"@X?[__^L`4%#B!```&@\``.H` +M``#C``!`X_[__^OP@;WH`#``XP`P0.,X,(7E-$"%Y0```.,``$#C)!$(XP<@ +MH.'^___K`%!0X@0``!H+``#J````XP``0./^___K\(&]Z``P`.,`,$#C.#"% +MY31`A>4`,`#C`#!`XSPPA>7P@;WH````XP``0./^___K\(&]Z``X``#0+P`` +MJ#<````````<,```,$`MZ1303>(`4*#AX$*0Y:0R`^,#,)3G`0!3XP``H`-, +M-@,#`P"$!W8```K(-0/C`S"4YP``4^,H```:B"4#XP(PA.>,)0/C`C"$YY`E +M`^,",(3G!`"@X?[__^L``%#C6P``"D`!E>4`$-#E`2#0Y0(PT.4#P-#E`,"- +MY03`T.4$P(WE!0#0Y0@`C>5\`9_E_O__ZP0`H.'^___K``!0XTL```H$`*#A +M_O__ZP``4.-'```*N#4#XP,PE.<``%/C`0``"@0`H.$S_R_A!0"@X?[__^L! +M(*#CR#4#XP,@A.<`(*#C3#8#XP,@A.<`,`#C`#!`XP`0D^51#H3B"`"`XL@0 +M@>+^___K6#(#XP,PU.<``%/C`P``&K(R`^,#,-3G``!3XQ````H`(*#CH#(# +MXP,@A.<`,`#C`#!`XP`PD^68(@/C`B"4YV00H..1`@'@TRT$XV(@0>.2`8'@ +MR0V$XB@`@.(A$X/@_O__ZY0AE>4",*#A"!"SY0$`$>,'```:`$`/X8``#/$` +M()/E`2#"XP`@@^4$\"'A``"@XQD``.H`4`_A@``,\0!`D^4!$,3C`!"#Y07P +M(>$!`!3C``"@`Q````H$`)+E_O__ZP``H.,,``#J`""@X\@U`^,#((3G!0"@ +MX?[__^N4,97E`$`/X8``#/$((+/E`2""XP`@@^4$\"'A``#@XQ30C>(P@+WH +M0#```!!`+>D``%'C`0``"G;__^L`0*#A!`"@X1"`O>@00"WIQ#0#XP,PD.<` +M`%/C$("]"#/_+^$0@+WH$$`MZ?[__^L```#C``!`XP`PH.-L,(#E_O__Z_[_ +M_^L0@+WH$$`MZ?[__^L0@+WH$$`MZ0!`H.'(-0/C`S"0YP$`4^,0@+T8`2"@ +MXX@U`^,#((#GO#4#XP,PD.<``%/C````"C/_+^%E,@/C`S#4YP``4^,!```: +M!`"@X?[__^N,-0/C`S"4YP``4^,$```:!`"@X?[__^L!(*#CC#4#XP,@A.<` +M(*#CR#4#XP,@A.<0@+WH<$`MZ2#03>(@`(#B_O__ZP!0H.'@0I#ER#4#XP,P +ME.<``%/C4P``"H@U`^,#,)3G``!3XT\``!J,-0/C`S"4YP``4^-+```:-`&? +MY?[__^L``%3C0P``"@$@H.-F,@/C`R#$YP0`H.'^___K!`"@X?[__^O';83B +M-&"&X@8`H.'^___K``!5XP@```H%`*#A_O__ZY0QE>4`4`_A@``,\0@@L^4! +M((+C`""#Y07P(>$$`*#A`!"@X_[__^ML,)3E"``3XQ@```H!`!/C%@``"N`P +MU.4`,(WEX3#4Y00PC>7B,-3E"#"-Y>,PU.4,,(WEY##4Y1`PC>7E,-3E%#"- +MY>@PE.48,(WEE#"4Y1PPC>5P`)_E!T``/0P```H,0``\$$MZ0!0H.$@<(#B!P"@X?[__^L`8*#AX$*0 +MY0<`H.$`$*#C_O__ZP``5.,X```*!`"@X?[__^ML,)3E`0`3XP(```H$`*#A +M`!"@X_[__^L`,`#C`#!`XVPPD^4!`%/C`2"@`XPU`P,#((0'`#"4Y0$`4^,% +M```*``!6XP,```H&`*#A_O__ZP8`H.'^___K!`"@X?[__^L$`*#A4/__ZR$P +MU.4"`%/C`6"@$P,``!H@8-3E`0!6XP!@H!,!8*`#M#4#XP,PE.<``%/C`0`` +M"@0`H.$S_R_A!`"@X?[__^L@`)7E:`!`XO[__^L!`%;C!0``&B``E>5H`$#B +M&#"0Y0``4^,````*_O__Z_[__^OP@;WH(`"5Y6@`0.+^___K^?__ZA!`+>D` +M0*#AR#0#XP,PD.<``%/C````"C/_+^$$`*#A_O__ZQ"`O>@00"WI````XP`` +M0.,`$`#C`!!`X_[__^O^___K_O__ZP```.,``$#C`!``XP`00./^___K_O__ +MZP```.,``$#C`3"@XVPP@.4`$*#C`"``XP`@0./^___K$("]Z!!`+>G^___K +M$("]Z'!`+>D`0*#A````XP``0./^___K``!4XRL```H@`(3B_O__ZP!@H.'@ +M0I#E``!4XR4```K'783B-%"%X@4`H.'^___K!`"@X?[__^L`(*#CLS(#XP,@ +MQ.<&`*#A`1"@X_[__^L``%#C%P``&@8`H.'^___K!@"@X?[__^L%`*#A_O__ +MZP@0E.4``%'C!@``"DP`G^7^___K"`"4Y?[__^L,$*#C`2"@X_[__^L$`*#A +M`!"@X_[__^L```#C``!`X_[__^L``*#C<("]Z````.,``$#C#!"?Y?[__^L` +M`.#C<("]Z!`R``"$'0``<$`MZ0!0H.$@`(#B_O__Z^!"D.5E,@/C`S#4YP`` +M4^,#```*!0"@X?[__^L`0*#A"P``ZM0R`^,#,)3G``!3XP0```H!(*#CW#(# +MXP,@Q.<`0*#C`@``Z@4`H.'^___K`$"@X00`H.%P@+WH\$$MZ0!`H.%@`)#E +M(`"`XO[__^L``%3C.```"@!0H.'';83B-&"&X@8`H.'^___K`2"@XZ`R`^,# +M((3G!`"@X?[__^L%`*#A`!"@X_[__^L``%#C`@``"@8`H.'^___K)@``Z@4` +MH.'^___K!0"@X?[__^N4(97E`C"@X0@0L^4!`!'C!@``&@!0#^&```SQ`""3 +MY0$@PN,`((/E!?`AX0D``.H`<`_A@``,\0!0D^4!$,7C`!"#Y0?P(>$!`!7C +M`0``"@0`DN7^___K`%"@X[,R`^,#4,3GM#(#XP-0Q.>H,@/C`U"$YZ`R`^,# +M4(3G!@"@X?[__^L%`*#A\(&]Z`P`G^4,$)_E_O__ZP``X./P@;WH3#(``)@= +M``!P0"WI`$"@X6``D.4@`(#B_O__Z\@U`^,#,)3G``!3XT<```J(-0/C`S"4 +MYP``4^-#```:C#4#XP,PE.<``%/C/P``&@``5.,]```*`&"@X00`H.'^___K +M````XP``0./^___KQUV$XC10A>(%`*#A_O__ZP$@H..@,@/C`R"$YP``5N,( +M```*!@"@X?[__^N4,9;E`&`/X8``#/$((+/E`2""XP`@@^4&\"'A!`"@X0`0 +MH./^___K;#"4Y0$`$^,.```*`3##XVPPA.6L-`/C`S"4YP``4^,"```*!`"@ +MX0,0H.,S_R_A!`"@X?[__^L$`*#A`Q"@XP`@H./^___K!`"@X?[__^L$`*#A +M`1"@X_[__^L$`*#A_O__ZP(@H..H,@/C`R"$YP!@H..@,@/C`V"$YP4`H.'^ +M___K!@"@X7"`O>@```#C``!`XP@0G^7^___K``#@XW"`O>BH'0``$$`MZ5PP +MD.4``%/C`@``"E@`D.4.$0#C_O__ZP$`H.,0@+WH$$`MZ?[__^L0@+WH\$``#K`0!0 +MXS@``!H$`*#A_O__ZP0`H.'^___K``!0XS(```IG,@/C`S#4YP``4^,)```* +M9#"4Y(%`*#A_O__ZT`!E^4%$*#A!B"@X_[_ +M_^L'`*#A_O__ZP``4.,3```:`#``XP`P0.,($)/E``!1XP$```IH`)_E_O__ +MZ_[__^L``*#C\(>]Z"``MN5H`$#B_O__ZP8`H.$`$*#C_O__ZP``H.-I___K +M$@#@X_"'O>@@`);E:`!`XO[__^L(`*#A`!"@X_[__^L$`*#A7___ZP<`H.'^ +M___K$@#@X_"'O>BX'0``J#(``'!`+>D`0*#A3`"`XO[__^L.`0#C_O__ZU@` +MA.4``%#C!0``&@!0H.-84(3E(`"?Y?[__^L%0*#A`P``Z@\`@.(/`,#C7`"$ +MY0%`H.,$`*#A<("]Z+@R``#P02WI`$"@X62`D.4<`(3E`#"@XR0PP.4E,,#E +M`#``XP`P0.,`4)/E`'"5Y2@QF.4$,-/E(3#`Y0(PU^4@,,#E!!#7Y2(0P.4` +M`%'C(P``V@`@H.$`,*#C`U"@X0Q@E^4#8);@&```"@,`UN4#``#B`@!0XT(` +M`!K2P-;A``!(!4*`30`"$ +MX@`0H./^___K!`"@X?[__^L$`*#A_O__ZV@`A.(`$*#C_O__ZP4`H.'P@;WH +M`P!0X\'__PH"`%#CRO__&L3__^HP,$#B_R^103!`XG,P[^8%`%/C``#@@S<`0)(>_R_A``"@XQ[_ +M+^'@,I#E;#"3Y0@`$^,",*`3`#""%0L``!I``!/C`0``&B``$^,"```*`3"@ +MXP`P@N4$``#J$``3XP,PH!,`,((5`#"@`P`P@@4``*#C'O\OX01`+>7@0I#E +M;#"4Y0$`$^,&```*>C4!X],PE.$`,&/B`#""Y0`PH.,$,,+E!```Z@`PH.,` +M,(+E!##"Y0$PH.,%,,+E``"@XQ``O>@>_R_A`##0Y0``4^,(```*`0!3X0,` +M`!H(``#J#`"`X@$`4^$%```*###0Y0``4^/Y__\:``!3X@$`H!,>_R_A`0"@ +MXQ[_+^'@$I#E2#H"X[,PD>$`,(+E``"@XP0`PN4>_R_A!$`MY>!"D.4%,-+E +M``!3XP0```HJ*0#C##0!XP,@A.<``*#C"```Z@`PDN4!'$/B*B@`XP(`4>$5 +M`."#`3##DPPD`9,",(27``"@DQ``O>@>_R_AX!*0Y0PT`>,#,)'G`#""Y0`` +MH.,$`,+E'O\OX0_R_A``#@XQ[_+^$` +M`*#C'O\OX0``H.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A``"@XQ[_ +M+^$``*#C'O\OX0``H.,>_R_A!$`MY>!"D.5L,)3E`0`3XP<``!H`,*#C*B8# +MXP(PQ.,#$-3G?C4!XP,@U.=Z-0'C +MTP"4X2LV`^,#`,3G*C8#XP,0Q.G@ +M0I#E`S`!X@,`4^,,```:S`"?Y?[__^L`,*#C%"L!XP(PA.<"$*#C!"!"X@(0 +MA.,+```*E`"?Y?[__^L`,*#C%"L! +MXP(PA.,$ +M```*````XP``0./^___K`$"@XP,``.H```#C``!`X_[__^L50.#C!`"@X1"` +MO>A8,P``J#,``/!/+>DPH.$` +M,*#CB`&-Z06`H.$&<*#A!&"@X0-`H.$&`*#A"!"@X00@H.$`,.#C3,4#XP_@ +MH.$,\);G`%"@X!2D.4%`*#A!@"3Z/\_#^,/,$#C3,4#XP_@ +MH.$,\)7G`%"@X00`H.$`$`#C`!!`XP4@H.'^___K``"@XW"`O>CP3RWIJ]]- +MX@)PH.$#@*#AX**0Y6H]#^/_/T_C`$"@XZHOC>*S0(+A:#T/X_\_3^.S0(+A +MB@^-X@00H.&`(*#C_O__ZR@`C>($$*#A`BR@X_[__^L`$)?EMX0W`H.%_ +M/480(WE'$"-Y22`C>7@!I_EX!:?Y0@@H.'^___K!%"@X21@C>+0EI_E +M%+"-X@,``.H,`%7C!@``"@5`B^<$4(7B!@"@X0D0H.'^___K`$!0XO;__QH8 +M4)WE``!5XZ$!``H(%0(+@>$!$X@@``.H*`*#A`1!4Y?[__^L(`*#A +M"1"@X0@@H.$!,%3E_O__ZP%@AN(!0(3B$`!6X_/__QIX!9_E_O__ZP@`H.%P +M%9_E"""@X?[__^L04(7B@`!5X\K__QI4!9_E_O__ZP@`H.'^___KM`#'X0`` +MH.,^`0#J!`"@X3P5G^7^___K``!0XU@``!H@0(WB!0"@X000H.$0(*#C_O__ +MZW!@_^8&L*#A%`6?Y080H.'^___K"0"@X000H.$*(*#C_O__ZW!0_^8``%7C +M)P$`"@Q0C>7L!)_E!1"@X?[__^MJ30_C_T]/XP`0H.,`$(WE"@"@X0,@H..J +MSXWB!#",X/[__^L&L(7@JB^-XK1`DN$$`%OA`P``VJP$G^7^___K#0#@XQ(! +M`.H*`*#A!A"@X04@H.&*/XWB_O__ZP``4.,"```:A`2?Y?[__^L!``#J?`2? +MY?[__^L(`*#A`!"@XP0@H./^___K`$"@XV1DG^6*7XWB8*2?Y6"4G^5@M)_E +M#@``Z@8`H.$$$-7G_O__ZP@`H.$*$*#A"""@X00PU>?^___K"0"@X?[__^L( +M`*#A"Q"@X0@@H.'^___K`4"$X@PPG>4#`%3A[?__N@@`H.'^___K`0"`XK0` +MQ^$$!)_E"!"@X?[__^L``*#CX```Z@0`H.'P$Y_E_O__ZP``4.,]```:*#"- +MX@`PC>4*`*#A`!"@XP$@H.$"/*#C_O__ZP``4.,#```:>`.?Y?[__^L-`.#C +MS@``ZK`#G^7^___K"`"@X0`0H.,$(*#C_O__ZP!`H.,H4(WB4&.?Y5"CG^6, +MDY_EC+.?Y0```.,``$#C!!#5Y_[__^L(`*#A`!``XP`00.,((*#A!##5Y_[_ +M_^L/,`3B#P!3XP8``!H)`*#A_O__ZP@`H.$+$*#A"""@X?[__^L(``#J!S`$ +MX@<`4^,%```:!@"@X?[__^L(`*#A"A"@X0@@H.'^___K`4"$X@(,5./?__\: +M"`"@X?[__^NT`,?A``"@XYT``.H$`*#A]!*?Y?[__^L``%#C/```&FI-#^/_ +M3T_C`!"@XP`0C>4*`*#A`R"@XZK/C>($,(S@_O__ZZHOC>*T0)+A%0!4XP,` +M`,J``I_E_O__ZPT`X..'``#J"@"@X180H.,&(*#CBC^-XO[__^L``%#C`@`` +M&E@"G^7^___K`0``ZE`"G^7^___K"`"@X0`0H.,$(*#C_O__ZP!`H.,X8I_E +MBE^-XC2BG^4TDI_E-+*?Y08`H.$$$-7G_O__ZP@`H.$*$*#A"""@X00PU>?^ +M___K"0"@X?[__^L(`*#A"Q"@X0@@H.'^___K`4"$X@8`5./N__\:"`"@X?[_ +M_^NT`,?A``"@XUL``.H$`*#A\!&?Y?[__^L``%#C/```&FI-#^/_3T_C`!"@ +MXP`0C>4*`*#A`R"@XZK/C>($,(S@_O__ZZHOC>*T0)+A"0!4XP,``,IX`9_E +M_O__ZPT`X.-%``#J"@"@X0H0H.,$(*#CBC^-XO[__^L``%#C`@``&E`!G^7^ +M___K`0``ZD@!G^7^___K"`"@X0`0H.,$(*#C_O__ZP!`H.,P89_EBE^-XBRA +MG^4LD9_E++&?Y08`H.$$$-7G_O__ZP@`H.$*$*#A"""@X00PU>?^___K"0"@ +MX?[__^L(`*#A"Q"@X0@@H.'^___K`4"$X@0`5./N__\:"`"@X?[__^NT`,?A +M``"@XQD``.H$`*#A[!"?Y?[__^L``%#C``"@$Q,``!H*`*#A$!"-XO[__^L* +M`*#A_O__ZV@]#^/_/T_CJL^-XK-`G.$`,&3@"`"@X;`0G^4((*#A_O__ZP@` +MH.'^___KM`#'X0``H.,```#J%0#@XZO?C>+PC[WH;#0``/@=``!X-```?#0` +M`(0T``"8-```L#0``,0T``#L-```!#4```PU``#,-```^#0``!0U```8-0`` +M8#0``!PU```@-0``*#4``#0U``!`-0``8#4``'PU``"4-0``G#4``*@U``"L +M-0``L#4``+PU``#$-0``]#4``/@U````-@``!#8```PV```4-@``\$$MZ0C0 +M3>(#@*#AX'*0Y0)@H.$`,*#C!#"-Y0`0DN4-(*#A?SW"XS\PP^,(0)/E!%"1 +MX@10U3``0*`S``!4XP,``!H$`(WB!""@X_[__^L"``#J!`"-X@00H./^___K +MB#4#XP,PE^+@HI#E`$"@XPQ`C>400(WE%$"-Y6HM#^/_+T_C*AZ-XK)` +M@>$<,(WE````XP``0.-`%)_E`R"@X?[__^L<8(WB`'``XP!P0.,,@(WB`P`` +MZ@P`5.,&```*!%"(YP1`A.(&`*#A!Q"@X?[__^L`4%#B]O__&A!`G>4``%3C +M^```"A1@G>4``%;C]0``"@Q0G>4%`*#A`!``XP`00./^___K``!0XST``!H$ +M`*#A&!"-XA`@H./^___K<(#OYK@#G^4($*#A_O__ZP8`H.'^___KH'"PX>0` +M``J@`Y_E!Q"@X?[__^N8`Y_E!A"@X?[__^L`4*#C(DZ-X@0``.H"`%;E`1!6 +MY?[__^L%`,3G`5"%X@)@AN('`%7A]___.FI-#^/_3T_C`!"@XP`0C>4*`*#A +M`R"@XRK.C>($,(S@_O__ZP+^___K``!0XP,``!H$`Y_E_O__ZPT` +MX..W``#J^`*?Y?[__^L``*#CLP``Z@4`H.$`$`#C`!!`X_[__^L``%#C+0`` +M&@0`H.$8$(WB$""@X_[__^MP@._FJ`*?Y0@0H.'^___K!@"@X?[__^N@<+#A +MH```"J0"G^4'$*#A_O__ZX@"G^4&$*#A_O__ZP!0H.,@0(WB!```Z@(`5N4! +M$%;E_O__ZP4`Q.'W__\Z(#"-X@`PC>4*`*#A`1"@XP@@ +MH.%W,/_F_O__ZP``4.,#```:0`*?Y?[__^L-`.#C@P``ZC0"G^7^___K``"@ +MXW\``.H%`*#A`!``XP`00./^___K``!0XSL``!H$`*#A_O__ZZ!PL.%T```* +M!@!7XP0``)KX`9_E!!"@X?[__^L-`.#C;@``Z@```.,``$#C!!"@X?[__^L$ +M4*#A`&"@XR).C>(``-7E`1#5Y?[__^L&`,3G`6"&X@)0A>(&`%?A]___BFI- +M#^/_3T_C`!"@XP`0C>4*`*#A`R"@XRK.C>($,(S@_O__ZQ8PA^(J'HWBM$"1 +MX00`4^$#``":6`&?Y?[__^L-`.#C30``Z@H`H.$6$*#C=R#_YB(^C>+^___K +M``!0XP,``!HP`9_E_O__ZPT`X.-"``#J````XP``0./^___K``"@XST``.H% +M`*#A`!``XP`00./^___K``!0XP``H!,V```:!`"@X?[__^N@<+#A,0``"M@` +MG^4$$*#A_O__ZP10H.$`8*#C(DZ-X@0``.H"`%7E`1!5Y?[__^L&`,3G`6"& +MX@)0A>('`%;A]___.FI-#^/_3T_C`!"@XP`0C>4*`*#A`R"@XRK.C>($,(S@ +M_O__ZPHPA^(J'HWBM$"1X00`4^$#``"::`"?Y?[__^L-`.#C$0``Z@H`H.$* +M$*#C=R#_YB(^C>+^___K``!0XP,``!I``)_E_O__ZPT`X.,&``#J-`"?Y?[_ +M_^L``*#C`@``ZA4`X.,```#J#0#@XZG?C>+PA;WH'!X``"@U```T-0``5#8` +M`&@V``!\-@``F#8``+PV``#,-```Q#4``,PV``#P0"WI%-!-X@)`H.'@8I#E +M````XP``0..T$9_E_O__ZP`P`.,`,$#C`%#3Y0``5>,(```:`U"@X0`P`.,` +M,$#C!0"@X0`0D^40(*#C_O__ZP`PH.,/,,7EM##4X1``4^-7``"*`!"4Y0T@ +MH.%_/<+C/S##XPA0D^400)'B!4#4,`!0H#,``%7C!0``&@T`H.$0(*#C_O__ +MZP``4.-(```:!```Z@T`H.$0$*#C_O__ZPU`X.-#``#J&`&?Y1`1G^44(9_E +M#3"@X?[__^L&`*#A#1"@X?[__^L`0%#B.0``&O@`G^7^___K[`"?Y?`0G^4) +M(*#C_O__ZP$`4.,(```:U%"?Y1!PU>6H-`/C`W#&YP8`H.'^___K$5#5Y54R +M`^,#4,;GL%"?Y0UPH.$%`*#A#1"@X1`@H./^___K`#"@XP\PQ>4-`*#AE!"? +MY0D@H./^___K`0!0XQH``!J$`)_E;!"?Y?[__^L&`*#A`1"@X_[__^NL-`/C +M`S"6YP``4^,"```*!@"@X0<0H.,S_R_A1%"?Y:@T`^,#(-;G$"#%Y0!PH.,# +M<,;G!@"@X?[__^M5,@/C`R#6YQ$@Q>4#<,;G````Z@U`X.,$`*#A%-"-XO"` +MO>@P'@```#<``"@X```D-P``0#<``$PW``!P0"WI"-!-X@!@H.$"4*#A`T"@ +MX0```.,``$#C5!&?Y0,@H.'^___K!`"@X0`0`.,`$$#C!""@X_[__^L``%#C +M*```"K0PU>$$,$/B$$0(3BX%*6Y0$P0^(!`%/C`P``"@(`4^,` +M0*`3"```&@,``.H`0-3E,$!$XG1`[^8#``#J``#4Y0$0U.7^___K`$"@X0H` +M5.,R``"*6#(#XP,PU><$`%/A+@``"@``5.,"(*`35S(#$P,@Q1<@``#J!`"@X0`0`.,`$$#C +M!""@X_[__^L``%#C&0``"K0PU>$$,$/BM##%X>!2EN4(((WB`#"@XP0P(N4$ +M`(3B`!``XP`00./^___K!#"=Y0$`4^,+``"*52(#XP(PQ><$0)WE``!4XP`@ +M`.,`($#C`#``XP`P0.,#(*`1%`"?Y100G^7^___K``"@XPC0C>)P@+WH1!X` +M`)@W``!0'@``<$`MZ0-`H.'@`I#E`!"3Y?[__^L`4*#A!`"@X0`0`.,`$$#C +M!2"@X?[__^L``*#C<("]Z/!'+>D`8*#A````XP``0./^___K`4"@XP);H.,` +M@`#C`(!`XP!P`.,`<$#C`*``XP"@0./$/Z#A(S^@X0,@A.`#(`+B`C!CX`$` +M4^,"```:"`"@X040H.'^___K!@"@X040H.'^___K`!"@X0<`H.'^___K`P`4 +MXP$``!H*`*#A_O__ZP10A>("#%3C\(>]"`%`A.+F___J\$G@`I#E!@"3Z/[__^L``*#C$("]Z/!/+>DLT$WBX'*0Y0!`DN5T8/_F5%CG +MYP0PDN4D,(WE)$R@X7!`1.(/`%3C!/&?E_T"`.H4/P,`F#\#`$Q``P!\0`,` +MQ$`#`/Q``P!400,`S$H#`,Q*`P#,2@,`S$H#`,Q*`P#,2@,`S$H#`,Q*`P"4 +M00,``@!5XPP```H$`%7C$P``"@$`5>/J`@`:!P"@X080H.'^___K`""@X0`` +M`.,``$#C!A"@X?[__^OA`@#J!P"@X080H.'^___K`""@X0```.,``$#C!A"@ +MX?[__^O8`@#J!P"@X080H.'^___K`""@X0```.,``$#C!A"@X?[__^O/`@#J +M`@!5XQ````H$`%7C&P``"@$`5>/)`@`:!P"@X080H.%S(._F_O__ZP<`H.$& +M$*#A_O__ZP`@H.$```#C``!`XP80H.'^___KO`(`Z@<`H.$&$*#A5D`%3C9$"@ +M(WDU`>,#0,?G4`(`Z@D`5>/7```*$@``B@0`5>-+```*!P``B@$`5>,M```* +M)P``.@(`5>,W```*`P!5XT,"`!HY``#J!@!5XYP```I,```Z!P!5X[$```H( +M`%7C.P(`&K8``.H2`%7C20$`"@H``(H/`%7C.P$`"@(``(H,`%7C,@(`&BP! +M`.H0`%7C1@$`"A$`5>,M`@`:20$`ZOT`5>.,`0`*!```BMT`5>-/`0`*[@!5 +MXR4"`!I;`0#J_@!5XYP!``K_`%7C(`(`&J@!`.H```#C``!`XVP0E^7^___K +M&@(`ZJ@W`>,#$)?GK#,``)?G``"-Y0```.,` +M`$#C_O__ZPT"`.H```#C``!`X\`9E^7^___K"`(`Z@```.,``$#CQ!27Y?[_ +M_^L```#C``!`X]`4E^7^___K_P$`Z@```.,``$#CGA?7Y?[__^L```#C``!` +MXY\7U^7^___K````XP``0..@%]?E_O__Z_(!`.I7#8?B&`"`XN`0A^+^___K +M`%!0XCP```K@$-7EX2#5Y>(PU>7C`-7E``"-Y>0`U>4$`(WEY0#5Y0@`C>4` +M``#C``!`X_[__^L```#C``!`XTT1U>5,(=7E_O__ZP```.,``$#CW!"5Y?@E +ME>5/,=7E_O__Z]`0A>(.`)'H3@'5Y0``C>4```#C``!`X_[__^L```#C``!` +MXPP6U>4-)M7E#C;5Y?[__^L```#C``!`X_P5E>7^___K````XP``0.,/%M7E +M$";5Y?[__^MO7X7B`$"@XP!@`.,`8$#C`##5Y0``4^,#```*!@"@X000H.&R +M(-7A_O__ZP%`A.)$4(7B$`!4X_3__QJO`0#JX!#7Y>$@U^7B,-?EXP#7Y0`` +MC>7D`-?E!`"-Y>4`U^4(`(WEH`:?Y?[__^NC`0#J(T"-X@<`H.$4$*#C!""@ +MX1@U`^,/X*#A`_"7YP```.,``$#C(Q#=Y08@H.'^___K#Q`&XB,0S>4```#C +M``!`X_[__^L'`*#A%!"@XP0@H.$4-0/C#^"@X0/PE^>+`0#J````XP``0.., +M-0/C`Q"7YX@U`^,#()?G_O__ZX,!`.H```#C``!`XY0T`>,#$)?G!3N@XP,@ +ME^?^___K````XP``0.,@-0'C`Q#7Y_[__^MV`0#J````XP``0..<-P'CLQ"7 +MX9XW`>.S()?A_O__Z_[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^57G8?B +M*)")X@"@H.,`,`#C`#!`XQ0PC>4`,`#C`#!`XQ@PC>4`,`#C`#!`XQPPC>4' +M@*#AKW^*X@%PA^*'<8C@`$"9Y0"P`.,`L$#C`#``XP`P0.,0,(WE.P``Z@A@ +M1.(`0)3EU#"6Y210G>4%`%/A-0``&N`0UN7A(-;EXC#6Y>,`UN4``(WEY`#6 +MY00`C>7E`-;E"`"-Y10`G>7^___K"P"@X4T1UN5,(=;E_O__ZQ``G>7<$);E +M^"66Y4\QUN7^___K3C'6Y0`PC>48`)WET!"&X@X`D>C^___KT`2?Y0P6UN4- +M)M;E#C;6Y?[__^O`!)_E_!66Y?[__^NX!)_E#Q;6Y1`FUN7^___KK`2?Y(@`%KC +ML/__&@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L$`0#J````XP``0.,# +M$*#A_O__ZP<`H.$&$*#C)""-XB`U`^,/X*#A`_"7Y_D``.H``%/C]P``&O@# +MG^7^___K>#4#XP,PE^<``%/C\0``"@<`H.$S_R_A[@``Z@```.,``$#C'#(# +MXP,0E^?^___KZ```Z@```.,``$#C`!``XP`00./^___KX@``Z@$`4^,`$``3 +M`!!`$YP3GP4```#C``!`X_[__^LD0)WE4S8#XP-`Q^?7``#J``!3XP(``!H' +M`*#A_O__Z](``.H!`%/C`@``&@<`H.'^___KS0``Z@(`4^/+```:!P"@X?[_ +M_^O(``#J#P!3XQ<``!H'`*#A!Q"@XR,@C>(<-0/C#^"@X0/PE^(@-0/C#^"@X0/PE^<' +M`*#A!Q"@XR,@C>(<-0/C#^"@X0/PE^<```#C``!`XR,0W>7^___KG0``ZG9@ +M[^8'`*#AQ1Z@XP8@H.'^___K!P"@X<4>H./^___K`!"@X0```.,``$#C_O__ +MZP<`H.%8'`#C!B"@X?[__^L'`*#A6!P`X_[__^L`$*#A````XP``0./^___K +MA0``Z@<`H.'%'J#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A6!P`X_[__^L` +M$*#A````XP``0./^___K=@``Z@<`H.$A'J#C_O__ZP`0H.$```#C``!`X_[_ +M_^L'`*#A"!8`X_[__^L`$*#A````XP``0./^___K!P"@X0H=H./^___K`!"@ +MX0```.,``$#C_O__ZP<`H.&A'Z#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A +MHA^@X_[__^L`$*#A````XP``0./^___K!P"@X606`./^___K`!"@X0```.,` +M`$#C_O__ZP```.,``$#C_O__ZP<`H.%#'J#C_O__ZP`0H.$```#C``!`X_[_ +M_^L'`*#A.!0`X_[__^L`$*#A````XP``0./^___K!P"@X1$=H./^___K`!"@ +MX0```.,``$#C_O__ZP<`H.%8%`#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A +MA!0`X_[__^L`$*#A````XP``0./^___K!P"@X8@4`./^___K`!"@X0```.,` +M`$#C_O__ZP<`H.%$%`#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A2!0`X_[_ +M_^L`$*#A````XP``0./^___K!P"@X4P4`./^___K`!"@X0```.,``$#C_O__ +MZP<`H.%%'J#C_O__ZP`0H.$```#C``!`X_[__^L"``#J````XP``0./^___K +M``"@XRS0C>+PC[WHU#H``%`Z``!T.@``B#H``.0[```,/```@#P``*@\``#$ +M/```\#P``!@]``!(/0``@#T``+0]``#L/0``$$`MZ>!"D.4`$-+E217$Y00` +MH.'^___K`0!0XP``X!,``*`#$("]Z/!/+>E!2D.4```#C``!` +MX_[__^N(-0/C`R"5YQ00G>4!,''B`#"@,P``4N,!,(,3``!3XP!`H`,>8*`# +M!0``"J0``.H&`*#A_O__ZP%`A.)E`%3C`@``"FPPE>4B#1/C]___&@`@H.,4 +M,)WEMB##X100G>6T,-'A'P!3XY4``)H`$)'E#2"@X7\]PN,_,,/C"&"3Y2!` +MD>(&0-0P`&"@,P``5N,%```:+`"-XB`@H./^___K``!0XP4```J%``#J+`"- +MXB`0H./^___K%4#@XX,``.K^___K#1"@X7\]P>,_,,/C!""3Y0$@@N($((/E +MA""%XA@@C>6$H)7E`)"@XRRPC>),@(WB'("-Y0`P`.,`,$#C(#"-Y1@`G>4* +M$*#A_O__ZP$`4.-/```*"4"@X0M0H.$``-7E&?;_ZP!P4.(0``"Z`0#UY17V +M_^L`8%#B#```N@%0A>('8H;A!&#(YP0`5.,#``#*`##5Y3H`4^,$```:`5"% +MX@%`A.(&`%3CZ___&ED``.H```#C``!`XRP0C>+^___K#1"@X7\]P>,_,,/C +M!""3Y0$@0N($((/E_O__ZQ5`X.-)``#J3&#=Y4UPW>5.(-WE)""-Y4]`W>4` +M0(WE4$#=Y01`C>510-WE"$"-Y2``G>4&$*#A!R"@X20PG>7^___KI&"%XI0@ +ME>4&`*#A5!"-X@P@0N+^___K``!0XP4```I40)WE``!4XP$PH!,4$)T5MC#! +M$0X``!J4()7E!@"@X500C>(,($+B_O__ZP``4.,%```*5$"=Y0``5.,"(*`3 +M%#"=%;8@PQ$!```:`*":Y:K__^H-$*#A?SW!XS\PP^,$()/E`2!"X@0@@^7^ +M___K%""=Y;0PTN$A`%/C$0``F@``DN4@`(#B#1"@X7\]P>,_,,/C"%"3Y0%` +MD.(%0-0P`%"@,P``5>,$```:!A""X@$@H./^___K``!0XP$```H50.#C```` +MZ@!`H.,$`*#A7-"-XO"/O>@*4*#A'`"=Y2`0BN(&(*#C_O__ZP$`4./5__\: +MJO__ZO!/+>D,T$WB`D"@X>!BD.6T4-+A``!5X[T```H`,)+E``!3X[H```JV +ML-+A!7"@X04`H.'^___K`*!0X@M`X`.T```*`!"4Y0T@H.%_/<+C/S##XPB` +MD^4'4)'@"%#5,`"`H#,``%CC!0``&@H`H.$'(*#A_O__ZP``4..H```:!@`` +MZ@``5^,$```*"@"@X0<0H.'^___K#4#@XZ,``.H*D*#A`%":Y2(`5>,50."# +MG@``B@B`BN*``I_E@!*?Y?[__^L'`%7C3@``"@H``(H"`%7C%@``"@(``(H` +M`%7C$```"G4``.H#`%7C)@``"@8`5>-Q```:.0``ZB``5>-3```*`@``BA\` +M5>-K```:1@``ZB$`5>-7```*(@!5XV8``!I>``#J&`*?Y?[__^MB``#J!#"8 +MY0(`4^,(```*!`!3XPL```H!`%/C6P``&@8`H.$`$)CE_O__ZP@`B.56``#J +M!@"@X0`0F.7^___K"`"(Y5$``.H&`*#A`!"8Y?[__^L(`(CE3```Z@0PF.4" +M`%/C"```"@0`4^,+```*`0!3XT4``!H&`*#A`!"8Y0@@V.7^___K0```Z@8` +MH.$`$)CEN"#8X?[__^L[``#J!@"@X0`0F.4(()CE_O__ZS8``.H&`*#A`!#8 +MY00@V.4`,.#C3,4#XP_@H.$,\);G"`"(Y2T``.H`$-CE!"#8Y0@PF.4`,(WE +M!@"@X0`PX.-0Q0/C#^"@X0SPEN[#OY@``6^,7```: +M``"4Y0T@H.%_/<+C/S##XPA0D^4'0)#@!4#4,`!0H#,``%7C!T"@$0,``!H* +M$*#A!R"@X?[__^L`0*#A``!4XP8```H#``#J%4#@XP0`H.$,T(WB\(^]Z`U` +MX.,```#J`$"@XPH`H.$'$*#A_O__Z_7__^H<-0``8!X```!````\0```4$`` +M`&Q```#P1RWI$-!-XN!2D.4#0*#A`#"@XP@PC>6\,,WA`#"-Y;0PS>$-`*#A +M!A"$X@8@H./^___K`#"4Y0$`4^,O```:!`*?Y?[__^L-`*#A"!"-X@8@H./^ +M___K`0!0XU4```H`8*#C#7"@X0:`H.-VD._F!J"@X08#A>`F#(#B%0"`X@T0 +MH.$((*#A_O__ZP$`4.,1```:M`&?Y?[__^L&HZ#A$&8"XP8`BN```(7@"P"` +MXA00A.(0(*#C_O__ZPJ@A>`&8(K@`4"@XP1`QN4$D(G@%#H"XP.0Q>`%`(#B`!"@XP8@H./^___K"%"% +MX`1`A>``,*#C!##$Y0%`H.,2``#J`4"$XA``5./E__\:#0``Z@,`4^,)```: +M)@R%XA0`@.(`$*#C`2N@X_[__^L`(*#C%#H"XP,@Q>]Z!1J`N-\`)_E!A#5Y_[__^L&`-7G$'8"XP`# +MA^```(7@!0"`X@T0H.$&(*#C_O__ZP8`U><``X?@``"%X`L`@.(4$(3B$""@ +MX_[__^L&,-7G`S.%X`=P@^`!,*#C!##'Y08PU><0`%/C +MW?__&J?__^J`0```I$```-A`````00``<$`MZ0)`H.'@8I#E;""6Y0$`$N,' +M```:0``2XP4``!H``*#CM`#$X;8PU.$".8/CMC#$X7"`O>@&4-3E``!5XP0` +M``H$`%7C%0#@@P%019("``":<("]Z+`G`>,"4);G`1"%XG$0_^:V$,3A%"L! +MXP(@EN<&`%+C`O&?ES8``.K$5`,`L%0#`'!5`P"P5`,`6%4#`'!5`P!850,` +M``"@X[0`Q.$"&8'CMA#$X7"`O>A?+H7B#"""X@(AAN"T(-+AM"#$X0``4N,8 +M```*7A^%X@,0@>(!$H;@7UZ%X@Q0A>(%48;@`P"@X000@>($()7E_O__Z[8@ +MU.&V(,3A$#L!XP,PEN<``%/C`BJ"`[8@Q`$``*`#<("]"`$`4^,``*`3`2F" +M`[8@Q`$``*`#<("]Z```H..T`,3A`AF!X[80Q.%P@+WH$#"@X[0PQ.$*&X'C +MMA#$X0``H.-P@+WH``"@X[0`Q.$"&8'CMA#$X7"`O>@00"WI``!3X@<```H. +MP*#CM,#"X0$PH..V,,+A`!``XP`00.,,(*#A_O__ZP``H.,0@+WH<$`MZ0)0 +MH.'@0I#E;""4Y0$`$N,"```:0``2XP!`X`,(```*Z&"4Y;1@Q>$#`*#A[!"$ +MX@8@H.'^___K`3"@X[8PQ>$`0*#C!`"@X7"`O>AP0"WIX%*0Y0)`H.$!,*#C +MLC#$X`0`H.$`$*#C!B"@X_[__^ML,)7E`0`3XP,``!I``!/C`0``&A``$^,$ +M```*!`"@X>`0A>(&(*#C_O__ZP,``.H$`*#A`!"@XP8@H./^___K``"@XW"` +MO>CP02WI(-!-X@)@H.$#<*#AX$*0Y0```.,``$#CMA#2X?[__^L$`(WB`!"@ +MXQP@H./^___KME#6X0()%>,/```*0`*?Y?[__^L!(*#C%#L!XP,@A.<`,*#C +MK"(% +M```*!`!5XQ4`X(,!@$62`5"@DP8``)IW``#JL#,-```*Q`&?Y?[__^L`,*#C%"L!XP(PA.?;+T+B`C"$ +MYP0@@N(",(3G6"""X@(PA.?#+X+B`C"$YQ\``.H!"1'C#P``"@```.,``$#C +M_O__ZP`@H.,4.P'C`R"$YP$PH..H)P'C`C"$YZPG`>,",(3G!"@!XP(PA.<0 +M*P'C`C"$YPT``.H```#C``!`X_[__^L`,*#C%"L!XP(PA.>H)P'C`C"$YZPG +M`>,",(3G!"@!XP(PA.<0*P'C`C"$YPB`C>6T,-;A``!3XP8```H%`%/C!3"@ +MDPTPH(,,,(WE##"#X@0PC>4A``#J`#"@XPPPC>4!`%7C'0``&K`W`>,#@(3G +M7UZ(X@Q0A>(%483@P`"?Y0@0H.$$(+7E_O__ZP`PE>4%`%/C`@``"@T`4^,* +M```:!```Z@$@H..L-P'C`R"$YP!`H.,<``#J!2"@XZPW`>,#((3G`$"@XQ<` +M`.H`,*#CK"4",8/C"#"-Y010C>(,`(7B!Q"@ +MX0P@G>7^___K!`"@X040H.'^___K``!0XP0``!JH,@/C`S"4YP``4^->0.`# +M````"@!`H.,$`*#A(-"-XO"!O>AT00``B$$``*!!```00@``\$4;,,'EOC+1X3`P@^("`%/AV```B@0PD>4!`'/CU0``&K@@ +MT>'_/P_C`P!2X=$``!HD,-'E`P!3X\X``(I>?8;B*'"'X@Q0@>(%`*#A`!`` +MXP`00./^___K``!0XU```!I``Y_E_O__ZP`@H.,4.P'C`R"&YP$PH..L)P'C +M`C"&YU@@@N(",(;G)(#4Y;Y2U.$4`Y_E"!"@X?[__^L$`%CC%4#@@[8``(H` +M`%7CL0``"@4`5>,%H*"3#:"@@PR0BN()`*#A_O__ZP!04.*K```*!0"@X0`0 +MH.,<(*#C_O__ZPB@A>4`D(7E#0!:XP4PH`.L)P$#`C"&!U@@@@(",(8'`C&( +MXP0PA>4,H(7B"@"@X3`0A.((()7E_O__ZQPPU.4``%/C!P``"H`"G^7^___K +M!@"@X040H.'^___K``!0XY,```J0``#J9`*?Y?[__^L#`%CCC@``BEX_B.(# +M,(/B`S*&X`0`@^(*$*#A"""5Y?[__^M?/HCB##"#X@,QAN`(()7E!""#Y08` +MH.$'$*#A"""@X0`PH./^___K`$"@XWP``.JH-P'C`S"6YP(`4^-R```:;""6 +MY0@P`.,!,$#C`S`"X```4^-L```*5PV&XA@`@.+@$(;B_O__ZP"`4.)0```* +M!0"@X<@1G^7^___K``!0XP`PH!/H,(@5%#L!XP,PEN<&`%/C!`!3$ZPW`0,# +M,)8'[#"(!1PPU.4!`%/C&P``&C!PA.*^(M3A$0Z(X@<0H.$0`%+C$""@(_[_ +M_^L%`*#A,#(,;G!@"@X0@0H.$!(*#C_O__ZR0``.HD`-3E +M``*&X#"`A.*^(M3A!@N`X@P`@.(($*#A$`!2XQ`@H"/^___K)`#4Y0H`@.*H +MIP'C``**X```AN`$`(#B$!"(X@@@H./^___K)`#4Y0X`@.(``HK@``"&X`0` +M@.(8$(CB"""@X_[__^L!,*#C&RR@XP(PQN,#,);G!@!3XP0`4Q,&```:K#]Z`!`H.,```#J7D#@XP4`H.$)$*#A_O__Z_;_ +M_^I$0@``;$(``(!"``"00@``H$(``*A"``#P1RWI`)"@X0*@H.$#8*#AMG+3 +MX4!PA^('`*#A_O__ZP!`H.$`@*#A``!0XT(```H`$*#C!R"@X?[__^L$`*#A +M`S"@XP0P@.3_$*#C!B"@X_[__^NT,M;A`P!3XP/QGY%T#``!0`.,`4$#C!P``Z@!0`.,`4$#C!```Z@!0`.,`4$#C`0``Z@!0 +M`.,`4$#C#`"(X@40H.$0(*#C_O__ZP`PEN4$`!/C`#"@$QPPR!4`,);E"``3 +MXP$PH!,<,,@5!C#:Y0$P0^(D,,CE`#"6Y0(`$^,#```*)0"(X@P0AN(((*#C +M_O__Z[8RUN$``%/C!```"KXRR.$P`(CB*!"&XK8BUN'^___K"0"@X0@0H.$' +M(*#AP/[_ZP!0H.$$`*#A!Q"@X?[__^L```#J`%#@XP4`H.'PA[WH<$`MZ0!0 +MH.$"0*#AX&*0Y;8PTN$#.J#A(SJ@X0H`4^,#\9^7"@``ZD!?`P!`7P,`0%\# +M`$!?`P"$7@,`K%X#`/Q>`P!`7P,`0%\#`'Q>`P!`7P,`7D#@XR\``.H`,)+E +M``!3XP$@H!,,-@(3`R#&%P!`H!,`0*`###8"`P-`Q@,#0(;GJ#(`<*#A`D"@X0`PH.,, +M,(WE"#"-Y0%0H.$#`%'A`!"@$P$0H`.``%+C`3"@D0$P@8,``%/C!@``"@`@ +MH./X.`'C`R#`YP(`4>$"0*`1%4#@`\H``.H``%+C`$"@`\<```H$L*#A!`"@ +MX?[__^L`8%#B"T#@`\$```H&`*#A!1"@X0L@H.'^___K`P!4XP!`X)/'``": +M!%"@X08`H.$$$*#A#""-X@@PC>+^___K`0!0XP4``!H"(*#CJ#((,(WB_O__ZP$`4.,%```:`B"@XZ@W +M`>,#((?G!R"@XQ`[`>,#((?G#%"=Y0%01>(/`%7C!?&?ES$``.JP8`,`S&`# +M`#AA`P`@80,`.&$#`#AA`P`X80,`Z&`#`#AA`P`X80,`.&$#`#AA`P`X80,` +M.&$#`#AA`P`$80,``""@XP0X`>,#((?G`2"@XQ0[`>,#((?G&@``Z@$@H.,$ +M.`'C`R"'YP`@H.,4.P'C`R"'YQ,``.H"(*#C!#@!XP,@A^<$(*#C%#L!XP,@ +MA^<,``#J!""@XP0X`>,#((?G!B"@XQ0[`>,#((?G!0``Z@4@H.,$.`'C`R"' +MYP`@H.,4.P'C`R"'YPA0G>4!4$7B#P!5XP7QGY,#((?G!""@XQ0[`>,#((?G00`` +MZ@0@H..L-P'C`R"'YP8@H.,4.P'C`R"'YSH``.H%(*#CK#,#(,?G`#``XP`P0..8,)/E!#"-Y3(``.H% +M@*#A!:"&X``PVN7=`%/C&@``&@(`A>(``(;@!!"-X@0@H./^___K`0!0XQ,` +M`!JP`)_E_O__ZPJ`H.$!(-KE`B""X@(,4N,"+*"C_#H!XP,@A^=C#8?B.0"` +MX@H0H.'^___K^#@!XP$@H.,#(,?G=`"?Y?[__^L`0*#C%0``Z@B`AN`),-CG +M`C"#X@-0A>!U4/_F!0!4X=C__XH`0*#C#```Z@0`H.$4T(WB\(^]Z``@H./X +M.`'C`R#'YP`P`.,`,$#CF#"3Y00PC>4`4*#C`9"@X\G__^H&`*#A"Q"@X?[_ +M_^ON___JW$(``.A"```00"WIX`*0Y0,0H.&T(-+A!?__ZQ"`O>CP12WI#-!- +MX@)0H.$`,*#C!#"-Y>!BD.6R,,WA`3#-Y6PPEN4!`!/C`@``&D``$^,``.`# +M60``"E0QEN59#X;B+1"@XP0@C>(,,$/B_O__ZP!P4.(0```*!$"=Y0``5.,- +M```*!T"@X0(`C>(%$(?B`B"@X_[__^L",/3E`2#4Y0(T@^'3H.#G8``3XP!P +MH`,!<*`3`8"@XP(``.H`<*#C!Z"@X0>`H.%`,=;E`2!#XG(@[^;]`%+C`$"@ +M@PP``(H&(*#A`$"@XP0`H.%_,`/B!`!3X0-`H"$$`,7E03'2Y0$@@N(!$$/B +M<1#OYOT`4>/U__^:`0!8XR,``!H&`*#A$Q"@XP$@C>(8-0/C#^"@X0/PEN+PA;WH<$`MZ2#03>+@8I#E`$"2Y03@TN4-P*#A,#&?Y0\`D^@' +M`*SH`##,Y0$`=.,P```*I$*@X<4Z!>-\.D#CDR2#X*,SH.%N`%/C!5"@`RD` +M``H/``"*-P!3XP)0H`,E```*!0``B@H`4^,`4*`#(0``"A0`4^,>```:%0`` +MZCP`4^,#4*`#&P``"EH`4^,8```:$0``ZO``4^,(4*`#%0``"@4``(IX`%/C +M!E"@`Q$```JT`%/C#@``&@D``.I:#U/C"5"@`PL```H>#E/C"```&@4``.H! +M4*#C!@``Z@10H.,$``#J!U"@XP(``.H*4*#C````Z@M0H.,`0*#C#0"@X1`0 +MC>(`P.#C!##0YP4`4^$$P,$7`@``&@0PP><``%[C`@``"@%`A.(-`%3C]?__ +M&@8`H.$0$(WB_O__ZP$`4.,``*`#``#@$R#0C>)P@+WHB!X``/!`+>D,T$WB +M`F"@X>!"D.4`,*#C!#"-Y6PPE.5!`!/C3P``"E0QE.59#X3B+1"@XP0@C>(, +M,$/B_O__ZP``4.,`<*`#`@``"@10G>4`<%7B`7"@$P5=A.(%`*#A_O__ZP$` +M4.,-```:`0!7XP4``!H&`*#A$!"@XP`@`.,`($#C_O__ZSL``.H&`*#A$!"@ +MXP`@`.,`($#C_O__ZS4``.H%`*#A_O__ZP$`4.,-```:`0!7XP4``!H&`*#A +M$!"@XP`@`.,`($#C_O__ZRD``.H&`*#A$!"@XP`@`.,`($#C_O__ZR,``.HH +M,93E#@!3XPT``)H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^___K&```Z@8` +MH.$0$*#C`"``XP`@0./^___K$@``Z@$`5^,%```:!@"@X1`0H.,`(`#C`"!` +MX_[__^L*``#J!@"@X1`0H.,`(`#C`"!`X_[__^L$``#J`@"@X1`0H.,`(`#C +M`"!`X_[__^L``*#C#-"-XO"`O>CX3RWI`V"@X>!"D.6./Z#CM##"X08`H.$` +M$*#C`R"@X?[__^M`.P3C3#!`XP`PAN5D,*#C+##&Y2TPQN4N,,;E!S"@XR\P +MQN5<(*#C,"#&Y4T@X.,Q(,;E`%"@XS)0QN4S,,;E!#"@XS0PQN4`,`#C`#!` +MXP!PD^4X<(;E!'"3Y3QPAN4(<)/E0'"&Y0QPD^5$<(;E`3R@X\`PAN4J.0#C +MQ#"&Y;Q=QN$6,*#C&#'&Y1`PH.,9,<;E!7"@X0J@H.,$D*#CH+8(XP&P0..D +M-]3E``!3XPH```HF@(?BB(&&X`HPR.>D!]3E_O__ZYL``.`)`(CG`3"@X[@P +MR.$!<(?B=W#_YB``5^,#```*`5"%X@Q`A.(@`%7CZ___&A,^H..S<(;A,G'& +MY0\PH.,T,H;E/S"@XP\PQN4``*#C^(^]Z'!`+>D"4*#AX$*0Y6PPE.4!`!/C +M"@``"B@!E.7^___KH#8(XP$P0..3``/@`#"%Y0$PH..T,,7A*#&4Y08PQ>4) +M``#JG@?4Y?[__^N@-@CC`3!`XY,``^``,(7E`3"@X[0PQ>&>-]3E!C#%Y0`` +MH.-P@+WH\$\MZ<7?3>("L*#A`T"@X0`PH./T,HWE`BR-XK([PN$5.PCC_S]/ +MX[X_PN$!,*#C`RR-XK`PPN$##(WB`@"`XB`0B^(&(*#C_O__ZQ1@A.(X,YWE +M!@!3X0L``)HQ7HWB%""@X[0A9>$$`*#A!1"@X00@H./^___K!`"$X@00A>(0 +M(*#C_O__ZP9`H.$H`(OB_O__ZP``4.,@```*&SL(X_\_3^,"+(WBOC_"X0$P +MH.,#+(WBMC#"X;ARV^$@`%?C('"@([1PPN$(<(?B!U"$X#@SG>4%`%/A$``` +MFC%NC>*T<6;A!'"@XP0`H.$&$*#A!R"@X?[__^L'`(3@"!"&X@<@H.'^___K +M"`"$XBP0B^(#/(WBM"#3X?[__^L```#J!%"@X:0@B^(8((WEE#";Y0(`H.$M +M$*#CO2^-X@PP0^+^___K`&!0XA0```KT0IWE``!4XQ$```H&0*#A*PZ-X@(` +M@.(%$(;B`B"@X_[__^L",/3E`2#4Y0(T@^'3(.#G)""-Y6``$^,`,*`#`3"@ +M$Q`PC>4!(*#C#""-Y0,``.H`,*#C$#"-Y20PC>4,,(WE`3L(X_\_3^,"+(WB +MOC_"X8!`B^($`*#A_O__ZP$`4.,.```:##"=Y0$`4^,%```:`PR-XA`0H.,` +M(`#C`"!`X_[__^LX``#J`PR-XA`0H.,`(`#C`"!`X_[__^LR``#J!`"@X?[_ +M_^L!`%#C#@``&@P@G>4!`%+C!0``&@,,C>(0$*#C`"``XP`@0./^___K)0`` +MZ@,,C>(0$*#C`"``XP`@0./^___K'P``ZF@PF^4.`%/C#@``F@PPG>4!`%/C +M!0``&@,,C>(0$*#C`"``XP`@0./^___K$P``Z@,,C>(0$*#C`"``XP`@0./^ +M___K#0``Z@P@G>4!`%+C!0``&@,,C>(0$*#C`"``XP`@0./^___K!```Z@,, +MC>(0$*#C`"``XP`@0./^___K%&"%XC@SG>4&`%/A"P``FC%.C>(4(*#CM"%D +MX04`H.$$$*#A!""@X_[__^L$`(7B!!"$XA`@H./^___K!E"@X0<["./_/T_C +M`BR-XKX_PN&8,(OB"#"-Y0,`H.'^___K`!"@X;X/C>("`(#B`B"@X_[__^L" +M+(WBNC_2X0,`$^,5```*`0`3XP,PH!,`,XT5`3"@`P`SC04(H(7B.#.=Y0H` +M4^$,``":,4Z-X@@@H..T(63A!&"@XP4`H.$$$*#A!B"@X?[__^L&`(7@!A"$ +MX`8@H.'^___K````Z@6@H.%H,)OE``!3XP$PH`-H,(L%!3L(X_\_3^,"+(WB +MOC_"X6@`F^7^___KH#8(XP$P0..3``/@`#.-Y0$PH.,#+(WBM##"X6@PF^4& +M,\WE#%"*XC@SG>4%`%/A"P``FC%.C>(,(*#CM"%DX0H`H.$$$*#A!""@X_[_ +M_^L$`(KB!!"$X@@@H./^___K!:"@X2L["./_/T_C`BR-XKX_PN&Z3]+A$``4 +MXP([H!,#+(T2MC#"$0(YH`,#+(T"MC#"`0`PH.,#+(WBM##"X0A0BN(X,YWE +M!0!3X1$``)HQ3HWB"""@X[0A9.$$8*#C"@"@X000H.$&(*#A_O__ZP8`BN`( +M$(3B!B"@X?[__^L%`*#A+!"+X@,\C>*T(-/A_O__ZP6@H.&MCXWB"`"@X4`0 +MH.,`(`#C`"!`X_[__^N`(-OE``!2XP!PH`,C```*K4^-X@!`A.`+4*#A`'"@ +MXT"`B.(`,`#C`#!`XQ0PC>4`,`#C`V"@X0!@0.,`D`#C`)!`XQR@C>4@L(WE +M%+"=Y0:@H.%_8`+B!P!6X09PH"$($&3@IC"@X0$`$N,*(*`!"R"@$0`@C>4$ +M`*#A"2"@X?[__^N!(-7E`5"%X@``4N,`0(00[O__&AR@G>4@L)WE#""=Y0$` +M4N,Q```:`CR-XK(;T^$""1'C#```"B0@G>4``%+C!```"@YQ`.,0,)WE``!3 +MXTM_H!,D``#J$""=Y0``4N.0<*`3@G"@`Q\``.J``!'C"@``"B0PG>4``%/C +M`P``"A`@G>4``%+C%@``&A$``.H0,)WE``!3XQ```!H+``#JN`6?Y?[__^LD +M()WE``!2XP,```H0,)WE``!3XPD``!H$``#J$""=Y0``4N,#```:07"@XP0` +M`.J'<*#C`@``ZDAPH.,```#JEG"@XX=PH.$A.PCC_S]/XP(LC>*^/\+A`#"@ +MXP4SS>4$,\WE(#$*XP(`,(WE*SZ-X@0PC>4(`)WE+""-XJL_ +MC>+^___K`CR-XK!+T^$``%3C80``"HM/C>($`*#A`!"@XX`@H./^___K`#`` +MXP`P0.,#`)/H`P"$Z`(LC>*P2]+A``!4XQ````HC;HWB`V"&X@!`H.,`<`#C +M`'!`XTN/C>($4*#A!@"@X0<0H.$%(-CG_O__ZP!@AN`!4(7B`CR-XK!+T^$% +M`%3A]?__BK\/C>(`$*#C%""@X_[__^L"/`CC_S]/XP(LC>*^/\+ABP^-XO[_ +M_^MP`/_F`SR-XK0`P^$(4(#B!6"*X#@CG>4&`%+A$```FC%.C>*T463A!%"@ +MXPH`H.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XHL?C>(#/(WB +MM"#3X?[__^L&H*#AOP^-X@`0H.,4(*#C_O__ZP4\"./_/T_C`BR-XKX_PN&P +M6]+A`SR-XK10P^$(4(7B!6"*X#@CG>4&`%+A$```FC%.C>*T463A!%"@XPH` +MH.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XDL?C>(#/(WBM"#3 +MX?[__^L&H*#A`BR-XKQ*TN$``%3C80``"HM/C>($`*#A`!"@XX`@H./^___K +M`#``XP`P0.,#`)/H`P"$Z`(\C>*\2M/A``!4XQ````HC;HWB`V"&X@!`H.,` +M<`#C`'!`XRR`C>($4*#A!@"@X0<0H.$%(-CG_O__ZP!@AN`!4(7B`BR-XKQ* +MTN$%`%3A]?__BK\/C>(`$*#C%""@X_[__^L"/`CC_S]/XP(LC>*^/\+ABP^- +MXO[__^MP`/_F`SR-XK0`P^$(4(#B!6"*X#@CG>4&`%+A$```FC%.C>*T463A +M!%"@XPH`H.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XHL?C>(# +M/(WBM"#3X?[__^L&H*#AOP^-X@`0H.,4(*#C_O__ZP4\"./_/T_C`BR-XKX_ +MPN&\6M+A`SR-XK10P^$(4(7B!6"*X#@CG>4&`%+A$```FC%.C>*T463A!%"@ +MXPH`H.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XBP0C>(#/(WB +MM"#3X?[__^L&H*#A`#"@XZPRC>64<)OE#'!7XCD```H#0*#AJX^-X@4L"./_ +M+T_C#""-Y;\_C>((,(/B$#"-Y0&0H.,$4*#A%+"-Y0>PH.$8<)WE!6"'X`8` +MH.$($*#A_O__ZP``4.,?```*K$*=Y0(`5.,<``":#""=Y0(\C>*^+\/AO#K3 +MX0,LC>*T,,+A"#"#X@@PC>4#0(K@.#.=Y00`4^$0``":"""=Y0(\C>*\+\/A +M"@"@X;\?C>($(*#C_O__ZP0`BN(0$)WE!""@X_[__^L(`(KB!A"@X0,\C>*T +M(-/A_O__ZP2@H.$%,(?@"3#3YP(P@^(#4(7@!0!;X=/__XH4L)WE`3P(X_\_ +M3^,"+(WBOC_"X4LPH.,#,\WE5#";Y0``4^-0,-L%5#"+!50PV^6#((/@4##; +MY0,@@N!"(:#A`2/-Y50PB^60,-OE`#/-Y6,PX.,",\WE"&"*XC@SG>4&`%/A +M#```FC%.C>(((*#CM"%DX010H.,*`*#A!!"@X04@H.'^___K!0"*X`40A.`% +M(*#A_O__ZP:@H.$*`*#AQ=^-XO"/O>BX0P``\$\MZ1S03>(4$(WE#""-Y1`P +MC>7@DI#EM'#2X0=P@^"T,@/C`S#9YP``4^,$```*B#4#XP,PF><``%/C%4#@ +M$S8``!K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/EA(")XH1`F>5ZOHGB +M!+"+XA!@G>7_H@#C"`"@X000H.'^___K`0!0XQ8```H',&;@"@!3X09`X-,3 +M``#:!%"@X2@PE.4``%/C`$"4!?'__PH+`*#A:!"5Y?[__^L!`%#C!@``&@!P +MC>4)`*#A%!"=Y04@H.$&,*#AT?S_ZP!@H.$`0)3EX___Z@!`H.,-(*#A?SW" +MXS\PP^,$()/E`2!"X@0@@^7^___K$#"=Y09@8^`,()WEM&#"X0`PH..V,,+A +M!`"@X1S0C>+PC[WH<$`MZ>!2D.4`0%/B#P``"K`PU.$``%/C`P``"@$`4^-> +M0.`3#```&@0``.H%`*#A_O__ZP``4.,$```*!0``Z@4`H.'^___K``!0XP$` +M`!H`0.#C````Z@!`H.,$`*#A<("]Z#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@ +MXQ`@H./^___K`3"@X[`PS>$"`(WB`!"@XP8@H./^___KUSV@XP,`E><5&PCC +M#2"@X0`PH./^___K%-"-XC"`O>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0 +M(*#C_O__ZP$PH..P,,WA`@"-XN`0A>(&(*#C_O__Z]<]H.,#`)7G%1L(XPT@ +MH.$`,*#C_O__ZQ30C>(P@+WH,$`MZ1303>(`4*#A#4"@X0T`H.$`$*#C$""@ +MX_[__^O7/:#C`P"5YQD;".,-(*#A`#"@X_[__^L4T(WB,("]Z/!'+>D`D*#A +M`:"@X0)PH.$#@*#A````XP``0./0$)_E_O__ZQP`H./^___K`%"@X0!`H.$` +M`%#C`$"@`RH```H4`*#C_O__ZP!@4.($```:!0"@X1P0H./^___K`$"@XR$` +M`.H&`*#A`!"@XQ0@H./^___K`8#&Y0!PQN4!,*#C`S#&Y0%P1^)W<._F!`!7 +MXQ!0H(,`,`"3`#!`DP=P@Y"\4->5!`"&X@H0H.$%(*#A_O__ZQ0PH..P,,3A +M!&"$Y0@PA.4`,*#C##"$Y1`PA.44`(3B_O__ZTL-B>((`(#B!!"@X?[__^L` +M0*#A!`"@X?"'O>B8'@``$$`MZ04@0N)R(._F"`!2XP!`H(,`P`"3`,!`DP(@ +MC)#$0-*5!""@X;;__^L0@+WH<$`MZ0C03>(!8*#A`E"@X0`0`.,`$$#CT#"1 +MY00PC>7@0I#E````XP``0./4$('B_O__ZVPPE.40`!/C%4#@`R(```H.4$7B +M<`>4Y0``4.,#```*?!>4Y?[__^L`,*#C<#>$Y0``5>,`0*#3%P``V@4`H.'^ +M___K<`>$Y7Q7A.4``%#C!0``&DP`G^5,$)_E42H!X_[__^L50.#C"P``Z@X0 +MAN(%(*#A_O__ZP0`H.'=$*#C!""-X@$PH./^___K`2"@XTL]H.,#(,3G`$"@ +MXP0`H.$(T(WB<("]Z`!$``#`'@``\$\MZ4S03>(`8*#A`7"@X0!`H.'@(K3E +MG34#XP,PTN<``%/C`$#@`_L$``H`,)'E``!3XQ5`X`/W!``*M`#1X?[__^L0 +M`(WE`("@X0``4.,+0.`#\`0`"@`0E^6TD-?A#2"@X7\]PN,_,,/C"*"3Y0E0 +MD>`*4-4P`*"@,P``6N,$```:"2"@X?[__^L``%#C!```&@@``.H``%GC!@`` +M"@D0H.'^___K$`"=Y;00U^'^___K#4#@X]<$`.K(#Y_ER!^?Y0`@F.7^___K +M`!"8Y0$P0>(2`%/C`_&?E[0$`.H(>P,`,'L#`$!\`P"0C0,`@(L#``B#`P"0 +MC0,`D(T#`)"-`P"0C0,`D(T#`)"-`P"0C0,`D(T#`)"-`P#4)`-CE +M#`"-Y1`/G^7^___K;#"5Y1$`$^,P```*!#"8Y0$`<^,#```:N"#8X0$X@^(# +M`%+A*0``"E<-A>(8`(#B!!"(XO[__^L`0%#B"T#@`WP$``H08)CEO##8X=0P +MA.43#H3B%!"(XA`@H./^___K`@P6XP$PH!/<,(05`#"@`]PPA`7$-)7E``!3 +MX]PPA`4""Q;C`#"@`_@UA`4'```*`3"@X_@UA.7<,(3E80Z$X@,`@.`D$(CB +M&B"@X_[__^O0-)7E``!3X_@UA`4%`*#A!!"@X?[__^L`0*#C600`ZA5`X.-7 +M!`#J`%"4Y000V.4%(-CE!C#8Y0<`V.4``(WE"`#8Y00`C>4)`-CE"`"-Y0P. +MG^7^___K;#"5Y1$`$^,5```*!#"8Y0$`<^,#```:N"#8X0$X@^(#`%+A#@`` +M"E<-A>(8`(#B!!"(XO[__^L`0%#B!```"@4`H.$$$*#A_O__ZP!`H.,V!`#J +MM`V?Y?[__^L`0*#C,@0`ZA5`X.,P!`#JMX0`PH.-`,(WEE#V?Y10AD^4T +M((WE+""-XD8?@^(#`)'H!`""Y+`0PN$`4)3ES`V?Y1(>@^(&(*#A_O__ZVPP +ME>40`!/C=0$`"J!'`>,$`(7@#!"(X@(@H./^___KM#"5X0$P0^)S,/_F'P!3 +MXP0PH($@(*"#LR"%@0Y@1N)4887E`PQ6XPM`X(,,!`"*5D^%X@0`H.$`$*#C +M`RR@X_[__^L$`*#A#A"(XE0AE>7^___K/#&5Y00`4^-8`0`:`)"@XQ"1A>7@ +M`(7BRQV%XB$0@>(&(*#C_O__ZP0`H.'^___K`2#0Y0`PT.4"-(/A(#&%Y0$@ +MU.58,=7E`C2#X10PC>4,8(3B0*"-XE0QE>4&`*#A"1"@X0H@H.$,,$/B_O__ +MZP"04.(,```*0$"=Y0``5.,)```*Z`"%X@`0H.,D(*#C_O__Z^P`A>("$(GB +M0""=Y?[__^M`0)WEZ$"%Y0`PH.,<,87E5#&5Y08`H.$#$*#C"B"@X0PP0^+^ +M___K`)!0X@,```I`0)WE``!4XP*PV14````:`+"@XRBQA>4<`(WB`!"@XQ`@ +MH./^___K5#&5Y08`H.$!$*#C"B"@X0PP0^+^___K`$!0X@"0H`,$```*'`"- +MX@(0A.)`()WE_O__ZT"0G>54,97E!@"@X3(0H.,*(*#A##!#XO[__^L`0%#B +M!@``"AP`C>()`(#@`A"$XD`@G>7^___K0$"=Y020B>`<`(WB"1"@X0L@H.'^ +M___K<)#OY@4-A>()$*#A_O__ZU0QE>4&`*#A*A"@XPH@H.$,,$/B_O__ZP"P +M4.(%```*0$"=Y0``5.,"```*!0"@X0L0H.'^___K5#&5Y08`H.$M$*#C"B"@ +MX0PP0^+^___K`+!0XA<```I`0)WE``!4XQ0```H(D(GC!0"@X1,0H.-'((WB +M#XP_@H.$#\)7G1T#=Y0,`5.,"0(L"`##@`P,PQ`4!,(,"!##$!4X.A>() +M`(#B`A"+XD`@G>7^___K`;"@XP```.H`L*#C"P!9XQ$``(IY0*_F`3"@XQ-$ +MH.$,/`#C`#!`XP,P!.```%/C`S"@$Q@QA14)```:$``4XP(PH!,8,845!0`` +M&@(`%.,!,(,2&#&%%0$``!H#,*#C&#&%Y44,)WE$``3XP$PH!,,,845 +M`#"@`PPQA04`,*#CY"@!XP(PA><\,(WE.#"-Y0@@@N(",(7G""""X@(PA>=4 +M,97E!@"@X3`0H.,*(*#A##!#XO[__^L`0%#B&0``"D`0G>4``%'C%@``"@0` +MH.$"$('B/""-XC@PC>+^___K`0!0XP\``!H"(*#CJ#<$,(/B`R"5YP(@@N,#((7G/$"=Y0@P@^(#0(7G.$"=Y0@P@^(#0(7G +M`#"@XT`PC>4\,(WE.#"-Y>@H`>,",(7G""""X@(PA><&0*#AW9"@XU0QE>4. +M,$/B!`"@X0D0H.$*(*#A0$"=Y0,P9.#^___K`$!0XB$```H"`(3B-!"-X@0@ +MH./^___K``!0XR<#``H$`*#A0$"=Y0(0A.(\((WB.#"-XO[__^L!`%#C$P`` +M&@(@H..H-P'C`R"%YP$@H.-./X/B`R"%YP0P@^(#()7G`2""XP,@A><\0)WE +M!#"#X@-`A><"``#J`C"#X@-`A.#3___J`#"@XT`PC>7$ +M-(7E6CH"XP,PU><``%/C&@``"MV0H.-4,97E#C!#X@8`H.$)$*#A"B"@X4!` +MG>4#,&3@_O__ZP!`4.(/```*`@"$XBP0C>(&(*#C_O__ZP``4./W`@`*`3"@ +MX\0TA>4(,/3E@SS@X:,\X.$`,,3E`@``Z@(P@^(#8(3@Y?__Z@`PH./0-(7E +MX#T"XP,PU><``%/C`+"@`P&P"Q(``%OC!@``"@$PH./0-(7EQ#2%Y>(]`N,# +M,-7G`0!3X]0TA054,97E>#"#X@40H.'<,*'E!0"@X?[__^M7;87B&&"&XN!` +MA>(&`*#A!!"@X?[__^L``%#C!```&@8`H.$$$*#A_O__ZP``4.,%```*!0"@ +MX?[__^L!,*#CV#"%Y0!`H..G`@#J%4#@XZ4"`.JT4-?A`$"4Y5@'G^5L%Y_E +M_O__ZP`PH.,@,(CE&S#(Y;XRV.%`,(/B`P!5X<0"`!H$4*#A!#"8Y0$`<^,' +M```:N"#8X0$X@^(#`%+A`P``&B1@V.4#`%;CN0(`B@D``.I7#87B&`"`X@00 +MB.+^___K`&!0XJ@"`!H$!Y_E_O__ZP!`H..#`@#J#$"(X@0`H.'P%I_E_O__ +MZP``4.,$```:Y`:?Y080H.'^___K`$"@XW@"`.H$`*#A*!>?Y?[__^L!`'#B +M``"@,P``4.,`8*`#`3"@`V0```JP!I_E_O__ZR1@V.6^HMCAI`:?Y080H.$* +M(*#A_O__ZP$P>N(`,*`S`P!6XP$P@X,``%/CC`(`&@``6N,`0*`#$0``"@4` +M6N,%H*"3#:"@@PR0BN()`*#A_O__ZP!`4.(#```:5`:?Y?[__^L`0*#C4@(` +MZ@0`H.$`$*#C'""@X_[__^L(H(3E`)"$Y01@A.4,D(3B"0"@X3`0B.((()3E +M_O__ZQPPV.4``%/C)```"@P&G^7^___K`""@XQ0[`>,#((7G`3"@XZPG`>," +M,(7G6"""X@(PA><(,)3E#0!3XP4PH`-8($("`C"%!U@@@@(",(4'L#=>/X;B`S"#X@,RA>`$`(/B"1"@X0@@E.7^___K7SZ&X@PP@^(#,87@"""4 +MY00@@^4%`*#A#!"$X@@@U.4&,*#AZ?S_ZX\!`.I\!9_E_O__ZUX_AN(#,(/B +M`S*%X`0`@^()$*#A"""4Y?[__^M?/H;B##"#X@,QA>`(()3E!""#Y04`H.$, +M$(3B""#4Y08PH.'5_/_K>P$`Z@``4^-Z```*;#"5Y1``$^-W```*'##8Y0$` +M4^,K`@`:``!0XQ0```H(!9_EX!2?Y?[__^LD`-CE``*%X+XBV.$&"X#B#`"` +MXC`0B.(0`%+C$""@(_[__^L!(*#C!#@!XP,@A>>^,MCA#0!3XP0@@@($.`$# +M`R"%!T0``.H$`*#AM!2?Y?[__^L``%#C)```&J@$G^5X%)_E_O__ZP(@H.,$ +M.`'C`R"%YR0`V.4``H7@,$"(XKXBV.$&"X#B#`"`X@00H.$0`%+C$""@(_[_ +M_^LD`-CE"@"`XJAG`>,``H;@``"%X`0`@.(0$(3B"""@X_[__^LD`-CE#@"` +MX@`"AN```(7@!`"`XA@0A.(((*#C_O__ZP$@H.,!.P'C`R#%YQH``.H$`*#A +M%!2?Y?[__^L``%#C#P``&@@$G^70$Y_E_O__ZP0@H.,$.`'C`R"%YR0`V.4` +M`H7@OB+8X08+@.(,`(#B,!"(XA``4N,0(*`C_O__ZP4``.K,`Y_ED!.?Y?[_ +M_^L`(*#C!#@!XP,@A>>_/T/B`R"5 +MYU@P0^(#((7G!0"@X3`0B.)R(._F)##8Y2/\_^L%`*#A_O__ZP!@4.*\`0`* +M`$"@X^A`AN4$.`'C`S"5Y^PPAN6-`0#JJ#<"`%/C`#"@$P$PH`,` +M`%;C`#"@`P``4^.M`0`*;#"5Y1``$^.J`0`*'##8Y0$`4^-C```:,*"(XKXB +MV.$1#H;B"A"@X1``4N,0(*`C_O__ZP0`H.$D$Y_E_O__ZP``4.,)```:Z`*? +MY:@2G^7^___K`3"@X^PPAN6^,MCA#0!3XP4PH`/L,(8%)0``Z@0`H.&H$I_E +M_O__ZP``4.,0```:L`*?Y6P2G^7^___K`C"@X^PPAN7P`(;B$!"*X@@@H./^ +M___K`0R&XA@0BN(((*#C_O__ZP$@H.,!.P'C`R#%YP\``.H$`*#A6!*?Y?[_ +M_^L``%#C!0``&EP"G^44$I_E_O__ZP0PH./L,(;E!```ZD@"G^7\$9_E_O__ +MZP`PH./L,(;E'`"@X_[__^L`D*#A``!0XQ\```H7`*#C_O__ZP"@4.(#```: +M"0"@X1P0H./^___K%P``ZA0`B>+^___K%2"@X[`@R>$$H(GE%S"@XP@PB>4` +M,*#C##")Y1`PB>7L,);E!C#*Y0H`H.'@$(;B!B"@X_[__^L'`(KB$1Z&XA`@ +MH./^___K2PV%X@@`@.()$*#A_O__ZP!`H./H0(;E&@$`Z@``4.,1```*)`#8 +MY0`"A>"^(MCA!@N`X@P`@.(P$(CB$`!2XQ`@H"/^___K`2"@XP0X`>,#((7G +MOC+8X0T`4^,$((("!#@!`P,@A0=>``#J!`"@X2`1G^7^___K``!0XR$``!H" +M(*#C!#@!XP,@A>`$`(#B$!"$X@@@H./^___K)`#8 +MY0X`@.(``H;@``"%X`0`@.(8$(3B"""@X_[__^L!(*#C`3L!XP,@Q>```<-0``Z!X``"Q$ +M``!@1```C$0``.P=```<'P``T$0``*!"```810``1$4``&Q%``"<10``@$(` +M`)!"``#,10``J$(``.1%``"P0@```$8``!Q&```X1@``5$8``'!&``",1@`` +MJ$8``.1&```P'P``]$,```!$``!('P``_$8``$!"````(*#C!#@!XP,@A>>_/T/B`R"5YU@P0^(#((7G!0"@X3`0 +MB.)R(._F)##8Y23[_^L%`*#A_O__ZP!@4.*]```*`$"@X^A`AN4$.`'C`S"5 +MY^PPAN6.``#J``!4XXP```H$`*#A#!"*XO[__^L`0*#CAP``Z@!`E.4$$-CE +M!2#8Y08PV.4'`-CE``"-Y0@`V.4$`(WE"0#8Y0@`C>7<`!_E_O__ZVPPE.41 +M`!/C(```"@0PF.4!`'/C`P``&K@@V.$!.(/B`P!2X1D```I7#83B&`"`X@00 +MB.+^___K`$!0X@!`X`-J```*Z#;4Y=T`4^,P`%,3"@``&NDFU.4"((+B(`!2 +MXR`@H",,((CE$`"(XFX>A.(($('B_O__ZP!`H.-;``#J8`$?Y?[__^L`0*#C +M5P``ZA5`X.-5``#J!@"@X0@0H.&T(-?A)_O_ZP!`H.%/``#JM%#7X0!`E.60 +M`1_EF!$?Y04@H.'^___K;#"4Y1``$^,50.`#10``"@Y01>)T!Y3E``!0XP,` +M``J`%Y3E_O__ZP`PH.-T-X3E``!5XP!`H-,Z``#:!0"@X?[__^MT!X3E@%>$ +MY0``4.,%```:\`$?Y?P1'^5\*@'C_O__ZQ5`X.,N``#J#A"(X@4@H.'^___K +M`$"@XRD``.JT4-?A`$"4Y2@"'^4D$A_E!2"@X?[__^ML,)3E$``3XQ5`X`,? +M```*#E!%XG@'E.4``%#C`P``"H07E.7^___K`#"@XW@WA.4``%7C`$"@TQ0` +M`-H%`*#A_O__ZW@'A.6$5X3E``!0XP4``!J(`A_EB!(?Y:$J`>/^___K%4#@ +MXP@``.H.$(CB!2"@X?[__^L`0*#C`P``ZJP"'^7^___K7D#@XQ(``.H``%3C +M$```&@``E^6T8-?A#2"@X7\]PN,_,,/C"*"3Y090D.`*4-4P`*"@,P``6N,# +M```:"!"@X08@H.'^___K`&"@X0``5N,-0.`3$`"=Y;00U^'^___K!`"@X4S0 +MC>+PC[WH0#"=Y0``4^/M_/\:[_S_ZD`PG>4``%/C"_W_&@W]_^H,0(CB!`"@ +MX403'^7^___K`0!PX@``H#,`,*#CR_W_Z@!`H./4___J%4#@X]+__^KP1RWI +M`&"@X0%`H.'\.PCC`P!2X9X```K^.PCC`P!2X5Y@X!.=```:M`'1X3\`4..5 +M``":$#"1Y0``4^.2```*_O__ZP"`H.$`D*#A``!0XPM@X`.1```*$!"4Y;2A +MU.$-(*#A?SW"XS\PP^,(<)/E"E"1X`=0U3``<*`S``!7XP0``!H*(*#A_O__ +MZP``4.,)```*`P``Z@``6N,&```*"A"@X?[__^L(`*#AM!'4X?[__^L-8.#C +M>```Z@`0F>4!,$'B`P!3XP/QGY=2``#J-(\#`.R/`P`$D`,`')`#`!`0F>7@ +M4I;E###9Y0<`4^,(``"*W##9X0$@H.,2,Z#AW``3XR$``!H@`!/C&P``&@(` +M$^,!```:7F#@XT,``.H"(*#CJ#?_$`'B`0!1XP(```H"`%'A$P`` +M&@8``.H$,*#C$"L!XP(PA><4*P'C`C"%YP!@H.,S``#J!R"@XQ`[`>,#((7G +M!B"@XQ0[`>,#((7G`&"@XRL``.H&`*#A*^;_ZP!@H.$G``#J`&"@XR4``.K@ +M`I;E,!")XKP@V>'5\__K`&"@X1\``.H&`*#A"1"@X;0AU.$]\O_K`&"@X1D` +M`.K@4I;E##"9Y0$`4^,#```*`@!3XUY@X!,2```:!```Z@4`H.'^___K``!0 +MXP0``!H%``#J!0"@X?[__^L``%#C`0``"@!@H.,&``#J`&#@XP0``.H```#C +M``!`X_[__^M>8.#C$@``Z@``5N,0```:$`"4Y;2AU.$-(*#A?SW"XS\PP^,( +M<)/E"E"0X`=0U3``<*`S``!7XP,``!H)$*#A"B"@X?[__^L`H*#A``!:XPU@ +MX!,(`*#AM!'4X?[__^L$``#J%6#@XP(``.H0$('B.OK_ZP!@H.$&`*#A\(>] +MZ!!`+>D`0`#C`$!`XP`PH.,4,(3E9`"@X_[__^L40)3E`@!4XP$``!H,`)_E +M_O__ZP0`G^7^___K$("]Z$`X``!P0"WI`$``XP!`0.,84(3B!0"@X0`0H.,` +M(`#C`"!`X_[__^L%`*#A_O__ZP(PH.,4,(3E<("]Z!!`+>ED,@/C`S"0Y_\T +MP^/_,,/C`0A3XR,```I8,@/C`S#0YP``4^,A```*93(#XP,PT.#3+03C8B!!XY+!@>#) +M#8#B*`"`XB$3@^#^___K`4"@XP(``.H`0*#C````Z@%`H.,$`*#A$("]Z/!% +M+>DLT$WB`E"@X0-@H.'@0I#E!`"@X?[__^L``%#C!```&I`!G^60$9_E_O__ +MZP!`X.-=``#JR#4#XP,PE.<``%/C!```&G0!G^5L$9_E_O__ZP!`X.-4``#J +MM(#5X2``6.,$``":6`&?Y4P1G^7^___K!D#@XTP``.IL,)3E$``3XP0```H\ +M`9_E+!&?Y?[__^L`0.#C1```ZA`[`>,#H)3GMC#5X0``4^,^```*``!8XSP` +M``H@`%CC(("@(P10C>(%`*#A`!"@XR0@H./^___K*'"-XB2`)^4$`(7B!A"@ +MX0@@H.'^___KA&"$XH0PE.5X,(3E!'"'X@8`H.%X$)3E_O__ZP$`4.,=```* +M>%"4Y04`H.$L,)#D>#"$Y0<0H.$$()WE_O__ZP$`4./Q__\:*""5Y00PG>4# +M`%+A[?__&FPPE.4@`!/C`P``"GP@E>4\,93E`P!2X>;__QH$`*#A?!"5Y?[_ +M_^L``%#C!```&E0`G^5`$)_E_O__ZP!`X.,)``#J!`"@X0H0H.'^___K!`"@ +MX000C>+^___K``!0XP!`X`,````*`$"@XP0`H.$LT(WB\(6]Z%A'``!@'P`` +M=$<``)!'``"T1P``X$<``/!/+>DLT$WB`E"@X0-@H.'@0I#E!`"@X?[__^L` +M`%#CF0``"H@U`^,#$)3G``!1XP,```I@`I_E_O__ZP!`X..2``#JR#4#XP,P +ME.<``%/CC0``"ITU`^,#,-3G``!3XXD```H0-=3E`0!3XP,``!H$`*#A_O__ +MZP!`H..#``#J;#"4Y2(-$^,#```*!`"@X?[__^L`0*#C?```ZK0PU>%/#U/C +M*P``&K8PU>$"`!/C(0``"@%PUN4@`%?C('"@HP2`C>((`*#A`!"@XR0@H./^ +M___K%%"&X@0`B.(%$*#A!R"@X?[__^L$<(WEK`&?Y040H.$!(-;E_O__Z_[_ +M_^L-,*#A?UW#XS]0Q>,$,)7E`3"#X@0PA>4$`*#A"!"@X?[__^L`0*#A!#"5 +MY0$P0^($,(7E_O__ZU```.H`,-;E`0!3XU```!I4`9_E_O__ZP!`X.--``#J +M"P!3XT0``)H&`*#A/!&?Y0P@H./^___K`0!0XSX``!JT<-7A#'!'X@Q@AN($ +M`(WB`!"@XR0@H./^___K$*&?Y0B`C>(,D9_E#+&?Y2```.H&`*#A`!``XP`0 +M0.,#((WB_O__ZP-0W>53`%7C&@``&@%@AN(*`*#A_O__ZP%P1^+'7\?A!@"@ +MX=`0G^4"((WB_O__ZP%@AN(!4$7B`B#=Y0(`5>$'``"Z!""-Y0@`H.$&$*#A +M_O__ZPD`H.$+$*#A"""@X?[__^L"<-WE!V"&X`5P9^```%?CW/__RO[__^L- +M,*#A?UW#XS]0Q>,$,)7E`3"#X@0PA>4$`*#A!!"-XO[__^L`0*#A!#"5Y0$P +M0^($,(7E_O__ZP(``.H$`*#A_O__ZP!`H.$``%3C`$"@$P```!H`0.#C!`"@ +MX2S0C>+PC[WH$$@``"1(``!,2```=!\``(Q(``"H2```A!\``(A(``#P3RWI +M6=]-X@"PH.$0$(WE`H"@X10PC>7@DI#EMX0:@H.$&`*#A_O__ZP!04.(+ +M0.`#7=`%/C10$`&@(`A>(\ +M$(WB!""@X_[__^L!`%#C/P$`&@(,5N,";*"C%0V)X@L`@.(%$*#A!B"@X?[_ +M_^M,9XGE`$"@XS8!`.H+`%;C`P``R@``5N,`0*###0``RA4``.H%`*#AT!2? +MY0P@H./^___K`0!0X_7__QH+`*#A$!"=Y0@@H.$%,*#A]_[_ZP!`H.$C`0#J +M!##5YV$@0^)R(._F&0!2XR`P0Y($,,67`4"$X@0`5N'V___*`$"@XWQDG^4$ +M<9;G!P"@X?[__^L`(*#A!0"@X0<0H.'^___K``!0XP,```H!0(3B"0!4X_/_ +M_QKL``#J"`!4XP3QGY?I``#JP)@#`$R9`P#8F0,`&)H#`&2:`P"DF@,`Q)H# +M`.2:`P#@FP,`````XP``0./^___K`#``XP`P0.,40)/E`0!4XP0``!H#0*#A +M&`"#XO[__^L",*#C%#"$Y5PPC>(`(`#C`"!`XP,`DN@#(*#A!`""Y+`0PN'P +M+@_C_R]/XP40H.,6#HWBLA"`X0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`0 +M0.,#(*#C_O__Z\(``.H```#C``!`X_[__^M<,(WB`"``XP`@0.,#`)+H`R"@ +MX00`@N0`$,+E\"X/X_\O3^,$$*#C%@Z-XK(0@.$+`*#A`AP(XTP@C>+^___K +M!0"@X0`0`.,`$$#C`R"@X_[__^L`,`#C`#!`XQ1`D^4"`%3CI0``&@-`H.$8 +M`(/B_O__ZP$PH.,4,(3EGP``ZFPPF>4!`!/C!@``"@4`H.$`$`#C`!!`XWHU +M`>/3()GA_O__ZY4``.H%`*#A`!``XP`00.,#(*#C_O__ZX\``.H+`*#A$!"= +MY2P@C>(4,)WE1/+_ZP``4.,`0*`3+""=!8,^#0,;,T0#DQ+#`,(OH`%#26(` +M!0"@X0`0`.,`$$#C!""@X?[__^M\``#J0!&;Y0`@T>4!,-'E`@#1Y0``C>4# +M`-'E!`"-Y00`T>4(`(WE!1#1Y0P0C>4%`*#A`!``XP`00./^___K;```Z@$P +MH.-*-4%`*#A`!`` +MXP`00.,#(*#C_O__ZUP``.H\0(WB!0"@X0`0`.,`$$#C!""@X?[__^L$`*#A +M`!``XP`00./^___K``!0XP`PH`-(,(T%$P``"CP`C>(`$`#C`!!`X_[__^L` +M`%#C`C"@`T@PC04+```*/`"-X@`0`.,`$$#C_O__ZP``4.,%,*`#2#"-!0,` +M``I\`9_E?!&?Y3P@C>+^___K`#``XP`P0.-(0)WE`$##Y1Q`C>($`*#A2!"- +MX@0@H./^___K"P"@X1`0G>4$(*#A%#"=Y=[K_^L``%#C`@``"C0!G^4L$9_E +M_O__ZP```.,``$#C2!"=Y?[__^L%`*#A`!``XP`00.,#(*#C_O__ZQT``.H` +M,`#C`#!`XP`PT^4``%/C!0``"@(`4^,-0*`#`P``"@4`4^,.0*`#````"@M` +MH.,%`*#A`!``XP`00.,$(*#A_O__ZP`P`.,`,$#C````XP``0.,$$*#A`"#3 +MY?[__^L$``#J!0"@X0`0`.,`$$#C`R"@X_[__^L`D)CEM$#8X04`H.'^___K +M`7"`XG=P_^8'`%3A!'"@,0T@H.%_/<+C/S##XPA@D^4'0)G@!D#4,`!@H#,` +M`%;C!```&@D`H.$%$*#A!R"@X?[__^L`<*#A``!7XPU`X!,````:`$"@XP4` +MH.$*$*#A_O__ZP0`H.%9WXWB\(^]Z'0?``"$40$`B$D``)@?``"D20``\$$<(3BA#"4Y7@PA.4"8(;B!H"@XP<`H.%X$)3E_O__ZP$` +M4.,%```:!`"@X080H.'^___K``!0XQ8```H7``#J>%"4Y04`H.$@,)#D>#"$ +MY080H.$((*#A_O__ZP$`4./K__\:!`"@X7P0E>7^___K``!0XP<```H$`*#A +M"A"@X?[__^L$`*#A!A"@X?[__^L``%#C`0``&@!`X.,```#J`$"@XP0`H.'P +MA[WH6$<``*@?```\2@``<$`MZ0)0H.'@0I#E!`"@X?[__^L``%#C`$"@`Q\` +M``J=-0/C`S#4YP``4^,:```*`#"5Y0,`4^,#\9^7`P``ZFR>`P!DG@,`?)X# +M`'2>`P`50.#C$0``Z@!0H.,$``#J`E"@XP(``.H$4*#C````Z@%0H.,$`*#A +M!1"@X?[__^L``%#C!```"@0`H.$%$*#A_O__ZP!`H.,```#J`$#@XP0`H.%P +M@+WH#""0Y10PD.4#((+@$#"0Y0(`8^`>_R_A``"!Y:`PD.4,,('E$#"!Y50@ +MD.44(('E#`"!Z1[_+^$$`)#E`0!PX@``H#,>_R_A'O\OX?!!+>D`4*#AX$*1 +MY00`H.'^___K``!0XPP```H$`*#A!1"@X?[__^L``%#C!P``NB`T`>/38(3A +M`0"@XP`0H.,&`)#@!Q"AX/,`A.$(``#J*#0!X]-@A.$!`*#C`!"@XP8`D.`' +M$*'@\P"$X04`H.'^___K``"@X_"!O>AP0"WI`$"@X?[__^L-(*#A?SW"XS\P +MP^,$()/E`2""X@0@@^4$`*#A_O__ZP``4.,+```*43V$X@!@#^&```SQ'%"S +MY0$@A>,`((/E!O`AX0$`%>,"```:40V$XA@`@.+^___K#2"@X7\]PN,_,,/C +M!""3Y0$@0N($((/E_O__ZW"`O>AP0"WI`4"@X=<]H.,#,)#GE"&3Y0(PH.$( +M$+/E`0`1XPD```H`8`_A@``,\0!0D^4!$,7C`!"#Y0;P(>$!`!7C`0``"@0` +MDN7^___K!`"@X?[__^MP@+WH$$`MZ0%`H.%@$)'E``!1XP````K^___K`#"@ +MXV`PA.40@+WH\$$MZ0%@H.$"<*#A`5"@X0!`H.-``)7E``!0XP````K^___K +M`4"$X@10A>((`%3C]___&@P`EN4``%#C\(&]"`<0H.'^___K\(&]Z/!!+>D! +M4*#A`@"@X?[__^L,`(7E``!0X_"!O0A_#X#B`P"`XJ`$H.&`!*#A$`"%Y0!` +MH.-@0(7E!&"@X=!PH.,&`*#A!Q"@X?[__^M``(7E``!0XP,``!H@`)_E_O__ +MZP``H./P@;WH`4"$X@10A>((`%3C\?__&@$`H./P@;WHM$H``'!`+>D`0*#A +M`6"@X0)0H.'^___K!0!0X0!0H#$``%;C!0``"A00E.4)`)3H`1!CX`8@H.$% +M,*#A_O__ZQ`PE.4%,(/@$#"$Y00PE.4#,&7@!#"$Y04`H.%P@+WH,$`MZ130 +M3>(`0*#A``!1XQ<```K4,)'E(`!3XQ0``(H7/8/B!3"#X@,Q@.`$,)/E`0!3 +MX0X``!H04(WB`2"@X[`A9>$"`(7BX!"#X@8@H./^___K(`"?Y?[__^O7/:#C +M`P"4YP0<".,-(*#AUSU#XO[__^L4T(WB,("]Z-1*```P0"WI%-!-X@!`H.$` +M`%'C%P``"M0PD>4@`%/C%```BA<]@^(%,(/B`S&`X`0PD^4!`%/A#@``&A!0 +MC>(!(*#CL"%EX0(`A>+@$(/B!B"@X_[__^L@`)_E_O__Z]<]H.,#`)3G`QP( +MXPT@H.'7/4/B_O__ZQ30C>(P@+WH^$H``'!`+>D`0*#A`"``XU@R`>,`($#C +M`R"`YUPR`>,#`(3G25V`X@P`A>(`$*#C`2"@X?[__^L`(`#CB#(!XP`@0.,# +M((3GC#(!XP-`A.<\`(7B`!"@XP$@H.'^___K<("]Z!!`+>D`,`#C`#!`XY0Q +M@>68$8'E8@^!X@`0H.,!(*#A_O__ZQ"`O>@00"WI`$"@X0`P`.,`,$#C:#2` +MY6P$A.5%#H#B#`"`X@`0H.,!(*#A_O__ZP`P`.,`,$#CG#2$Y:!$A.5)#H3B +M`!"@XP$@H.'^___K`#``XP`P0.,D-83E*$6$Y5$.A.((`(#B`!"@XP$@H.'^ +M___K$("]Z!!`+>G^___K$("]Z!!`+>G^___K$("]Z!!`+>G^___K$("]Z/!' +M+>D`0*#AJ##83B +M*`"`X@`0H.-P(@'C_O__ZP<`H.$&$*#A`2N@X_[__^L(D,3G"E#$YP`@H.,0 +M.P'C`R"$YP$@H.,4.P'C`R"$Y_"'O>@`,*#CJ"L)P'C`C"`Y[`G +M`>,",(#G!"@!XP(P@.,!((#G^"@! +MXP(PP.?PA[WH\$(`D*#A`F"@X=T`4>,[```:`0R@X_[__^L`H*#A +M`!"@XP$LH./^___K"@"@X0`0`.,`$$#C$B"@X_[__^L14(KB`4#6Y0)`A.(! +M#%3C!'"@,0%\H",``%?C#0``"@`PH.,#0*#A`(``XP"`0.,%`*#A"!"@X0,@ +MUN?^___K`%"%X`%`A.)T0._F!#"@X00`5^'U__^*!0"@X0`0`.,`$$#C`B"@ +MX_[__^L-0*#A#0"@X0`0H.,0(*#C_O__ZP$PA>(#,&K@@00"WI`$"@X?[__^O7/:#C`P"4Y_[__^L$`*#A_O__ZQ"` +MO>@00"WI`$"@X?[__^O7/:#C`P"4Y_[__^L,`)3E``!0XQ"`O0C^___K#A"@ +MXP$@H./^___K$("]Z!!`+>D`0*#A_O__ZP`P`.,`,$#C`!"3Y5$.A.((`(#B +MR!"!XO[__^L0@+WH$$`MZ?[__^L0@+WH$$`MZ?[__^L0@+WH`0"@XQ[_+^$` +M,*#C"#"!Y0PP@>4!`*#C'O\OX1[_+^$>_R_A$$`MZ0`P`.,`,$#C(#"`Y20` +M@.44`(#B`!"@XP$@H.'^___K$("]Z!!`+>G^___K$("]Z'!`+>D`4*#A`4"@ +MX0@PD>4!,$/B"#"!Y20`D>7^___K`#"@XR0PA.4H,,3E'##4Y0``4^-P@+T8 +M!0"@X1PU`>,#$)7G`""@XP0PH.'^___K<("]Z/!'+>D`<*#A`6"@X5*-@.(X +M@(CB"$"1Y0``5.,^```*<#"1Y:`PA.5T,)'EE#"$Y6@PD>54,(3E;#"0Y1`` +M$^,B```*`0"@X3A0\.7+'8?B(1"!X@8@H./^___K``!0XQH``!H!H!7B!P`` +M"@<`H.'^___K`%"@X00`H.$@$*#C_O__ZP"0H.$%``#J5PV'XA@`@.(X$(;B +M_O__ZP!0H.$`D*#C``!5XP@```K7/:#C`R"7YQ@@A.4$`*#A`Q"7Y_[__^L` +M`%KC#```"@E`H.%H,-3E'S'#YV@PQ.77/:#C`R"7YQ@@A.4$`*#A`Q"7Y_[_ +M_^NZ!L3A!`"@X?[__^L`,*#C"#"&Y08`H.$($*#A_O__ZP$`H./PA[WH``!1 +MXP(```H!`*#A"!"@X?[__^OP-`'CTT"'X0$`H.,`$*#C!`"0X`40H>#S`(?A +M``"@X_"'O>AP0"WI,-!-X@!0H.$!0*#A!`"-X@`0H.,<(*#C_O__ZP``5.,$ +M,)T5!#"#$P0PC14$,)T%"#"#`P0PC04!,*#CN##-X01@C>(&`(;BN!"%X@8@ +MH./^___K($"-X@0`H.$`$*#C$""@X_[__^L<,*#CM#+-X=<]H.,#`)7G!AP( +MXP0@H.$&,*#A_O__ZS#0C>)P@+WH$$`MZ0%`H.$0`)'E``!0XP````K^___K +M)`"4Y0``4.,````*_O__ZP$`H.,0@+WH<$`MZ0%`H.$`4*#C'%#!Y04`H.'0 +M$*#C_O__ZQ``A.4D4(3E*%#$Y4!0A.5$4(3E/%"$Y3A0A.4P4(3E-%"$Y2!0 +MA.4L4(3E!0!0X`$`H!-P@+WH=BM>9-FNQ%CYT?0(F'^A7OZ[+)C@O[[$%GL_U?ZD6_(_=3 +MEN1;F\)U'.&N/6I,6FQ!?@+U3X-<:/11--$(^9/B5/%NW%AM>:56:4$<^*$.D&!('^\*!$>+HEXTOSHOY=P("*!:T_O"%(<`3Q +MWV/!=W6O8T(P(!KE#OUMOTR!%!@U)B_#X;ZB-JS(Y[HK +M,I7FH,"8&=&>?Z-F1'Y4JSN#"\J,*:?BO!T6=JT[VU9D3G0>%-N2 +M"@QL2.2X79]NO>]#IL2H.:0Q-].+\C+50XM9;K?:C`%DL=*RWO\J-9M +M.BS&I?B$[IGVC?\-UKW>L9%48%`"`\ZI5GWG&;5B3>;LFH]%'YV)0/J'[Q6R +MZX[)^PM![+-G7_U%ZB._4_?DEIM;=<+A'#VN3&IL6GY!]0*#3VA<4?31-/D( +MXI.K<1.7IO6Y:```P2Q`8.,?>;SB%AVM=ML[9%9T3A0>DML,"DALN.2?7;UN0^_$ICFH,:33-_*+U3*+0VY9 +MVK"0?$)QQ,RJD-@&!?1F5@Z)R>Y +MV3CK$RNS(C/2NZEP!XDSIRVV/"(5DLD@ATFJ_U!XI7H#CUGX"8`:%V7:US&$ +MQM"X@L,IL%IW'A%[RZC\;=8L.F-\=WOR:V_%,`%G*_[7JW;*@LE]^EE'\*W4 +MHJ^7Q<=@Q%03'(\,8E@6:!Q*`XNLGLG4)@RP:&VY: +MH%([UK,IXR^$4]$`[2#\L5MJR[XY2DQ8S]#OJOM#33.%1?D"?U`\GZA1HT"/ +MDITX];RVVB$0__/2S0P3[%^71!?$IWX]9%T9"]O@ +M,CH*208D7,+3K&*1E>1YY\@W;8W53JEL5O3J97JN"+IX)2XX?B8$6G9CI2;'H?ISE4HWXRAB0V_YD)H09DM +M#[!4NQ8!`@0($"!`@!LV-C:E8V/&A'Q\^)EW=^Z->WOV#?+R_[UK:]:Q;V_> +M5,7%D5`P,&`#`0$"J6=GSGTK*U89_O[G8M?7M>:KJTV:=G;L1)SV-BK4S$Q8C\5%2H,!`0(4L?'E64C(T9>P\.= +M*!@8,*&6ECRDI4C[CX]UQ+R]>EX2$$_534Z9HT=&Y`````"SM[<%@("!`'_S\ +MX\BQL7GM6UNVOFIJU$;+RXW9OKYG2SDY6JJD\6^_OMQ4-#AM=-39I5,S-FE(6%$<]%18H0^?GI!@("!(%_?_[P +M4%"@1#P\>+J?GR7CJ*A+\U%1HOZCHUW`0$"`BH^/!:V2DC^\G9TA2#@X<`3U +M]?'?O+QCP;:V=W7:VJ]C(2%",!`0(!K__^4.\_/];=+2OTS-S8$4#`P8-1,3 +M)B_L[,/A7U^^HI>7-JQD9,CG75VZ +M*QD9,I5S<^:@8&#`F(&!&=%/3YY_W-RC9B(B1'XJ*E2KD)`[@XB("\I&1HPI +M[N['T[BX:SP4%"AYWMZGXEY>O!T+"Q9VV]NM.^#@VU8R,F1..CIT'@H*%-M) +M29(*!@8,;"0D2.1<7+A=PL*?;M/3O>^LK$.F8F+$J)&1.:25E3$WY.33BWEY +M\C+GY]5#R,B+63KJSZ]E9GKTZ:ZN1Q@("!#5NKIOB'AX\&\E)4IR+BY<)!P<./&FIE?' +MM+1S4<;&ER/HZ,M\W=VAG'1TZ"$?'S[=2TN6W+V]88:+BPV%BHH/D'!PX$(^ +M/GS$M;5QJF9FS-A(2)`%`P,&`?;V]Q(.#ARC86'"7S4U:OE75Z[0N;EID8:& +M%UC!P9DG'1TZN9Z>)SCAX=D3^/CKLYB8*S,1$2*[:6G2<-G9J8F.C@>GE)0S +MMIN;+2(>'CR2AX<5(.GIR4G.SH?_556J>"@H4'K?WZ6/C(P#^*&A68")B0D7 +M#0T:VK^_93'FYM?&0D*$N&AHT,-!08*PF9DI=RTM6A$/#Q[+L+![_%14J-:[ +MNVTZ%A8L4*?T45-E07[#I!<:EEXG.LMKJSOQ19T?JUCZK),#XTM5^C`@]FUV +MK9%VS(@E3`+U_-?E3]?+*L6`1#4FCZ-BM4E:L=YG&[HEF`[J1>'`_ET"=2_# +M$O!,@:.71HW&^=-KYU^/`Y6FV_VEE2E2V#OM33(718*6G@243(R8YJ +MB<)U>'F.]&L^6)G=<;DGMD_AOA>MB/!FK"#)M#K.?1A*WV.",1KE8#-1ET5_ +M4V+@=V2QA*YKNQR@@?Z4*PCY6&A(OVI#GL@PNJ +M[V!`!I]Q7E$0;KWYBB$^/0;=EJX%/MU&O>9-M8U4D05=Q'%OU`8$_Q508"3[ +MF!F7Z;W6S$-`B7>>V6>]0NBPB(N)!SA;&>?;[LAY1PI\H>D/0GS)'H3X```` +M`(.&@`E([2LRK'`1'DYR6FS[_P[]5CB%#Q[5KCTG.2TV9-D/"B&F7&C15%N; +M.BXV)+%G"@P/YU>3TI;NM)Z1FQM/Q<"`HB#<86E+=UH6&A(<"KJ3XN4JH,!# +MX"(\'1<;$@L-"0ZMQXORN:BV+[]8'^CGR8!][SU +M%";S%]J8D9^5,(3C?;HN-B07O[L[VPEX)LWT&%EN`;>:[*B:3X-E;I7F?N;_ +MJ@C/O"'FZ!7OV9OGNLXV;TK4"9_JUGRP*:^RI#$Q(S\J,)2EQL!FHC4WO$YT +MILJ"_+#0D.`5V*&XAJ3+@?+,%_465&!.I>G5TUC`%S=(?Z+D$+^UH=9[-2TMN2,U80Z1-' +MUFV,8=>:>@RA-XX4^%F)/!/K[B>ISC7)8;?MY1SA/+%'>EG?TIP_<_)5>*\ +MBTD\*$&5#?]Q`:@YWK,,")SDM-B0P59D883+>W"V,M5T7&Q(0E>XT%():M4P +M-J4XOT"CGH'SU_M\XSF"FR__AS2.0T3$WNG+5'N4,J;"(SWN3)4+0OK#3@@N +MH68HV22R=ENB26V+T25R^/9DAFB8%M2D7,Q=9;:2;'!(4/WMN=I>%497IXV= +MA)#8JP",O-,*]^18!;BS10;0+!Z/RC\/`L&OO0,!$XIK.I$104]GW.J7\L_. +M\+3F2": +MV\#^>,U:]!_=J#.(!\`[%]@47^I&;5*#2WE>I^3R9SOH.`[3:XJ +M];#(Z[L\@U.9819FYV?H:.E`````0(#!`4&!P@)"@LD +M*"PP-#@\0&1H;'!TA(B,E9F=H:4````````@`0(#!`4&!P@)"@LD*"PP-#@\ +M0&1H;'!TB(R5F9VAI0`````````?`0(#!`4&!P@)"@L,#20H+#`T.#Q`9&AL +M<'1X?("$B(P````````@`0(#!`4&!P@)"@L,#0`````````````````````` +M```````````-`0(#!`4&!P@)"@L,#0`````````````````````````````` +M```-`0(#!`4&!P@)"@L,#0XD*"PP-#@\0``````````````````````6`0(# +M!`4&!P@)"@L,#0XD*"PP-#@\0``````````````````````6`0(#!`4&!P@) +M"@L,#20H+#`T.#Q````````````````````````5`0(#!`4&!P@)"@L,#0XD +M*"PP-#@\0``````````````````````6`0(#!`4&!P@)"@L,#0X````````` +M```````````````````````.`0(#!`4&!P@)"@L,#0`````````````````` +M```````````````-`0(#!`4&!P@)"@LX/$!D:&QP=(B,E9F=H:4````````` +M```````:`0(#!`4&!P@)"@N5F9VAI0`````````````````````````````0 +M`0(#!`4&!P@)"@LD*"PP-#@\0)69G:&E```````````````````8`0(#!`4& +M!P@)"@LD*"PP-#@\0&1H;'!T>'R5F9VAI0`````````?`0(#!`4&!P@)"@LD +M*"PP-#@\0``````````````````````````3`0(#!`4&!P@)"@L,#20H+#`T +M.#Q`9&AL<'1X?("$B(P````````@`0(#!`4&!P@)"@LD*"PPE9F=H:4````` +M```````````````````4`0(#!`4&!P@)"@L,#20H+#`````````````````` +M```````````1````:6YI=%]C:&%N;F5L7W-E=`````!R='=?:'1?;W!E5]S=7-P96YD`````X``'P.``"`#@`` +MA`X``(@.``",#@``T`X``-0.``#8#@``W`X``.`.``#L#@``(@4``%`%``!1 +M!0``0`````0,```(#```=`@``&@+``!L"P``<`@``&`(``!D"`````@``!0, +M```<#```3`P``'@,``"`#```B`P``)0,``"<#```H`P```0)```$#`````@` +M``@,``!T"```<`@``&`(``!D"```7`@``&P.``!P#@``=`X``'@.``!\#@`` +M@`X``(0.``"(#@``C`X``-`.``#4#@``V`X``-P.``#@#@``[`X``"(%``!0 +M!0``404``$````"D)=L$I"4;"V@+``!L"P``)_#__R^@5:HG````+U"J50`. +M!`X0#A0.&`X<#C`(-`@\"$@(3`AH"/_______P``D`P``)$,``"2#```F`P` +M`)D,``":#```D`P``)$,``"2#```F`P``)D,``":#```'````!P````=```` +M'0```!X````?```````````````!`````0````(````"`````P```!P````= +M````'@```!X````>````'P```````````````0````(````"`````P````,` +M`````0,$!@<)"@P-#Q`2$Q4`_@&`?^(!@'C'``#"D/@`PI@``3Z0^ +M`$^D7@!/I```*Z1>`"*D7@!/I```3Z0``$^D``!/I%X`'$->`"ND7@`PI@`` +M'$->`"ND7@`KI%X`*Z1>`/_______P``4V5T1G=2%]R;V%M:6YG7W1I;65S`')T;#@Q.3)C=2YR='=?:'=P=W)P +M7V1E=&5C=`!R=&PX,3DR8W4N5]T:')E7!E``!R=&PX,3DR8W4N%]S971?97-S:60`````0U-#04X@4P$``%,``````')T=U]W>%]S971?%]S971?=V%P``#@BP```D@` +M`')T=U]W'0```````#CBP````````````````````````````#D +MBP```4@``&%P:6YF;P````````````#EBP```D@``'-E='!I9``````````` +M``#FBP```4@``'=P0#HBP```4@``'=P7!T +M"@```')X(&)C+VUC('!A8VME=',L('1O('!E7!T"@````!B97-T7V-H86YN96Q?-4<@/2`E9`H```!B97-T7V-H86YN +M96Q?,C1'(#T@)60*``!R%]U"5X"@``875T:%]A;&<],'@E>"P@96YC7V%L9STP>"5X+"!A=71H +M7W1Y<&4],'@E>"P@96YC7W1Y<&4],'@E>`H`9G=S=&%T93TP>"5X"@```"5S +M"@!V,RXP+C(R,S`N,C`Q,3`W,C@``'-T85]D>E]B:71M87`],'@E>"P@=&EM +M7V)I=&UA<#TP>"5X"@````!S=&$G#HE,#)X +M.B4P,G@Z)3`R>#HE,#)X"@````!R='-E;CTE9"P@8W1S,G-L968])60*``!Q +M;W-?96X])60L(&AT7V5N/25D+"!I;FET7W)A=&4])60*``!S=&%T93TP>"5X +M+"!A:60])60L(&UA8VED/25D+"!R86ED/25D"@``8G=M;V1E/25D+"!C:%]O +M9F9S970])60L('-G:3TE9`H`````86UP9'5?96YA8FQE(#T@)60*``!A9V=? +M96YA8FQE7V)I=&UA<#TE>"P@8V%N9&ED871E7W1I9%]B:71M87`])7@*``!S +M;&5E<'%?;&5N/25D"@``=&ED/25D+"!I;F1I8V%T95]S97$])60*`````"5U +M("5U````"`E>````&EN=F%L:60@#HE,#)X.B4P,G@Z)3`R>`H```!R='=?"D],'@E>`H```!R='=?7!E/25D(&QE;CTE +M;'4I"@!U;FMN;W=N('9E;F1O#HE,#)X.B4P,G@@;&5N/25L +M=2D*`````$E%144@.#`R+C$Q(&5L96UE;G0@<&%R#HE,#)X.B4P,G@Z)3`R>#HE,#)X*2P@;&5N9W1H.B5D"@``2!A;F]T:&5R(')O86UI;F<* +M`"5S(')O86UI;F<@9&]?:F]I;B!R971U#HE,#)X.B4P,G@Z)3`R>#HE +M,#)X.B4P,G@I"@```"5S.B!?1E=?3$E.2T5$('=H:6QE(&%S:U]F;W)?:F]I +M;F)S#HE,#)X.B4P,G@Z)3`R>"D@`H`````8VAA;FYE +M;"!P;&%N(&ED(&5R7!E(0H``$A4.B!35$$@)3`R>#HE,#)X.B4P,G@Z)3`R +M>#HE,#)X.B4P,G@@2%0@0V%P86)I;&ET:65S($EN9F\Z(#!X)3`T>`H`)7,@ +M4U1!("4P,G@Z)3`R>#HE,#)X.B4P,G@Z)3`R>#HE,#)X("T@;F\@9W)E96YF +M:65L9"P@;G5M(&]F(&YO;BUG9B!S=&%T:6]N#HE,#)X.B4P,G@Z)3`R>#HE,#)X("T@,C`@34AZ($A4+"!N=6T@ +M;V8@,C!-2'H@2%0@4U1!#HE +M,#)X.B4P,G@Z)3`R>"`M(&YO($A4+"!N=6T@;V8@;F]N+4A4('-T871I;VYS +M("5D"@````!R.#%]S971?2!F86EL +M960L(&UA8U]I9"AA:60I/25D"@```%=R:71E($-!32P@;6%C7V%D9'(])7@Z +M)7@Z)7@Z)7@Z)7@Z)7@L(&-A;5]E;G1R>3TE9`H`````5]H9&PH*3H@"4P,G@I+"!0051(+4(H,'@E,#)X*0H`````($]&1$T@+4%L87)M($1!,B@P +M>"4P-'@I+$1!-"@P>"4P-'@I+$1!-B@P>"4P-'@I+$1!."@P>"4P-'@I"@`` +M`"!#0TL@+4%L87)M($$U0B@P>"4P,G@I+$$U0R@P>"4P,G@I"@````!R97!O +M"5X+"!A`H```!S=&%T:6]N(&%I9"`E9"!E>&-E960@=&AE(&UA>"!N=6UB97(* +M````875T:"!E>'!I"5X"@````!A9&1?4D%4:61?8FUC7W-T82!E#HE,#)X.B4P,G@Z +M)3`R>"!S96YT(&EN=F%L:60@87-S;V-I871I;VX@#HE,#)X.B4P,G@Z)3`R +M>#HE,#)X('1R:65D('1O('5S92!42TE0('=I=&@@2%0@87-S;V-I871I;VX* +M`````"`@;VQD($%)1"`E9`H````@(&YO(')O;VT@9F]R(&UO65R("T@:&]S=&%P9`H````K3VY!=71H +M"@````!A=71H(&%L9STE>"P@%]S97$])60L(&5X<%]S +M97$])61=(0H````H,BEA=71H(')E:F5C=&5D(&)E8V%U'!?'!?"D* +M````"D*`````&Y296UA:6Y?3&5N9W1H(&ES("5D(&%N9"!N4W5B9G)A +M;65?3&5N9W1H(&ES(#H@)60*``!S:V)?8VQO;F4H*2!&86EL(2$A("P@;G)? +M"`*`'=O"D@:7,@:6YV +M86QI9"$A"@````!";'5E5&]O=&@@0E1?06YT7TYU;2`]($%N='@R"@```$)L +M=654;V]T:"!"5%]!;G1?3G5M(#T@06YT>#$*````0FQU951O;W1H($)47T-O +M97AI7!E(#T@0E1?,E=I7!E(#T@0E1?06-C96P*`````$)L=654;V]T:"!"5%]#;V5X:7-T5'EP92`] +M($)47T-34E]"0S0*``!";'5E5&]O=&@@0E1?0V]E>&ES=%1Y<&4@/2!"5%]2 +M5$PX-S4V"@``0FQU951O;W1H($)47T-O97AI7!E(#T@56YK;F]W;@H` +M0FQU951O;W1H($)47T%N=%]I0H````` +M0FQU951O;W1H($)47U-E"5X"@``0VAI<"!697)S:6]N($E$.B!615)324].7TY/4DU! +M3%]44TU#7T-(25!?.3)#7S%4,E(N"@````!#:&EP(%9E&-E960@,'@E6"X@0VAE8VL@:70N"@```&-H:W-U;2!R97!O"4P.'@@+@H`4&]L;&EN9R!&5R!R96%D>2!F86EL +M(2$@4D5'7TU#54971$PZ,'@E,#AX("X*````1$P@1FER;7=A"!O;FQY(%1X($]+"@!&86EL960``%-U8V-E5]#;VYF:6="0E=I=&A(96%D97)&:6QE +M*"DZ(&1O(&YO="!S=7!P;W)T('1E#0X."`@/25X"@```%)A=&EO(#!X-#AC("`])7@* +M````3T9&`$].``!"5%\E#1F9"!T;R`E>`H`8E)E9T)4 +M7U-C;R`]("`E9`H```!2871I;U]4>#TE9`H`````4F%T:6]?4%))/25D"@`` +M`&)T7W-C;R`@/3TS($9O;&QO=R!#;W5N=&5R"@!"5"!465!%(%-E="!T;R`@ +M/3T^($)47U-#3PH`0E0@5%E012!3970@=&\@(#T]/B!"5%]/=&AE#1F9"!T;R`E>`H`8E=I9FE#;VYN96-T +M0VAA;F=E("5D+"!B0G13=&%T94-H86YG92`@)60L8E)S&ET(%)E9U\P>#0P("@E,G@I"@````!"5%]$:7-A;&QO +M=R!!35!$52`*`$)47T%L;&]W($%-4$15("!24U-)(#X]-#`*``!"5%]!;&QO +M=R!!35!$52!"5"!)9&QE"@!"5%])&ES=`H`0E1?5'5R;B!/1D8@0V]E>&ES=`H`````0E1?5'5R;B!/ +M3B!#;V5X:7-T*%)E9S!X-#0@/2`P>#$P,3`P*0H``$)47U1U2!S=&%T +M92!4>"`H)60I(#XS-3`@<&%R86UE=&5R*#!X)7@I(#T@,'@E>`H```!"5"!I +M;B!"5%]"=7-Y('-T871E('!A"5X*2`](#!X)7@*`$)4(&EN +M($)47U-#3R!S=&%T92!4>"`H)60I(#XQ-C`@<&%R86UE=&5R*#!X)7@I(#T@ +M,'@E>`H`0E0@:6X@0E1?4T-/('-T871E(%1X("@E9"D@/#$V,"!P87)A;65T +M97(H,'@E>"D@/2`P>"5X"@!"5"!I;B`@4W1A=&4@("5D("!A;F0@<&%R86UE +M=&5R*#!X)7@I('5S92!O"5X*2`](#!X)7@*``!"5"!3970@4F9296

#%%6S"5X(`H``$)47TES;VQA=&EO;DAI9V@*````0E1?06QL;W<@04U01%4@ +M8G0@:7,@;V9F"@```$)47U1U"P@=7-B("5S("!F86EL("QS=&%T=7,Z)60@=F%L=64],'@E>`H` +M``!C86YN;W0@"DL=7)B +M7W-T871U2!F;W(@ +M2$%,($1!5$$@"@`````]/3X@1&ES86)L92!A;&P@9'EN86UI8R!F=6YC=&EO +M;BXN+@H`````/3T^($1I"!P +M;W=E`H````]/3X@=')I9V=E0H```!3;&EM0V]M8F]$8F<@/3T@5%)5 +M10H```!C87)D(&1I"DE"5X"@```$)4('=R:71E(#!X +M)7@@/2`P>"5X(&9O$,P-"`] +M(#!X)7@*``!"5"!W$0P-"`](#!X)7@*``!P>&UI=&9R86UE+3YF +M%]S:V)?<75E=64@;F]T(&5M<'1Y"@``='AD +M;6%S=&%T=2@E>"D*`#T]/B5S(&5R"5X*2`*```]/3X@ +M)7,@=VEF:5]S=&%T=7,H,'@E>"D*````='@@:&%N9RXN+G-T87)T(')E0H`56YA +M8FQE('1O(&-R96%T95]P0H`34%#($%D9')E#HE,#)X.B4P,G@Z)3`R>`H`````=VQA;B5D```C(R,C(R,C(R,C +M(R`@#HE,#)X.B4P,G@Z)3`R>"DL(&QE;F=T:#HE9"!A +M%T*``!W<&%? +M"``(#!X)3`X>"`````` +M"@```#!X)3`U>```)7,Z(&EN/25S"@``+````')E86QM87````* +M"0``)7,*"0````!M86,`=FED<&ED``!A8FQEF5=(#T@)60`6R5S72!W<'-?```"CT]/3T]/3T@0D(@4D5' +M(#T]/3T]/3T*``````H]/3T]/3T]($U!0R!214<@/3T]/3T]/0H```!R='=? +M"D],'@E>`H```!R='=?"5X*3TP +M>"5X"@!R96%D7V)B"5X +M*3TP>"5X"@!R96%D(%)&7W)E9R!P871H*#!X)3`R>"DL;V9F"D*`````'=R:71E(%)&7W)E9R!P871H*#!X)3`R>"DL +M;V9F"D*````9G=S=&%T93TP>"5X"@`` +M`&%U=&A?86QG/3!X)7@L(&5N8U]A;&<],'@E>"P@875T:%]T>7!E/3!X)7@L +M(&5N8U]T>7!E/3!X)7@*`'!M;&UE:6YF;RT^`H``'%O#HE,#)X +M.B4P,G@Z)3`R>#HE,#)X.B4P,G@*`````')T`H``'1I9#TE9"P@:6YD:6-A=&5?"5X+"!A`H````H02E$349L86<],'@E>`H`8E-U&UI=&)U9E]C;G0])60L(&9R965?>&UI +M=&9R86UE7V-N=#TE9`H`"5X+"!T:6U?8FET;6%P/3!X)7@*`````'-L965P<5]L96X] +M)60*``!D=6UP(')X('!A8VME="`H)60I"@`````C(R,C(R,@2!F=6YC=&EO +M;@H````@/3T]($1-1FQA9R@P>"4P,G@I(#T]/2`*````97AT6YA;6EC(&9U;F,@"@!E>'1R85]A'1R +M85]A&ES=&5N8V4@+2!"250H,RD* +M````97AT'1R85]A"5X"@!W&,U."D],'@E>`H` +M"5X"@!D8F#8P."D],'@E>`H`````9&)G*#!X,C@P*3TP>"5X"@`` +M``!D8F#(X."D],'@E>`H`````9&)G +M*#!X-C8T*3TP>"5X"@````!D8F#0S +M."D],'@E>`H`````9&)G*#!X-#0P*3TP>"5X"@````!D8F#0X-"D],'@E>`H`````9&)G*#!X-#@X*3TP>"5X"@`` +M``!D8F#0T."D],'@E>`H`````9&)G +M*#!X-#1C*3TP>"5X"@````!D8F#HE,#)X.B4P,G@Z)3`R +M>`H`````.#%]D2!F;W(@;F]R;6%L(&UO9&4L(&-A +M;B=T(&5N=&5R(&UP(&UO9&4*````/3T^('1R:6=G97(@9W!I;R`P"@`]/3X@ +M`H```!; +M%]S971?<&UK:61=($E77U!-2U-!7U)%34]612$*`````%MR='=?=WA? +M2!I;F1E>"`]("5D(&9O`H`````16YC6EN +M9&5X7W!R;W9I9&5D(#T](#$I+"!K97EI9#TE9"P@:V5Y7VQE;CTE9`H`5T50 +M`'=P85]S971?96YC#TE9`H``'=E<"P@#TP +M"@``;F]N90````!42TE0`````$-#35``````)7,N+BYC86QL(')T=U]I;F1I +M8V%T95]D:7-C;VYN96-T"B``4T54(%=04U])10H`4T54(%=04U])12P@=W!S +M7W!H87-E/3U?5%)510H```!)145%(#@P,BXQ,6)N````245%12`X,#(N,3%B +M`````$E%144@.#`R+C$Q8F=N``!)145%(#@P,BXQ,6)G````245%12`X,#(N +M,3%A;@```$E%144@.#`R+C$Q80````!)145%(#@P,BXQ,6=N````245%12`X +M,#(N,3%G`````'5N87-S;V-I871E9``````@4F%T97,@*$UB+W,I.B`````` +M`"XU```E9"5S(````'=X7V=E=%]S8V%N+"!M8W-?`H``'=P85]I93T`)3`R>`````!R#HE,#)X.B4P,G@Z)3`R>`H` +M`')T=U]D96Q?#HE,#)X.B4P,G@Z)3`R>#HE,#)X"@`` +M7!T:6]N+"!C%]S971?96YC5]I9'@])60L(&QE;CTE9`H` +M```@2P@5T50"@`E2P@5$M)4`H`````)7,L('-E="!G2P@ +M5T50"@``)7,L('-E="!P86ER=VES92!K97DL(%1+25`*`"5S+"!S970@<&%I +M2P@;F]N90H` +M#HE +M,#)X.B4P,G@Z)3`R>`H`#HE,#)X.B4P,G@Z)3`R>``E*G,@ +M)7,``%53``!%50``2E```"5S('5N:VYO=VX@8V]U;G1R>5]C;V1E.B5S"@`E +M&UI=%]U +M``"PL*B`I!X``+"PJ("P'@``L+"H@-`>``"PL*B`W!X``+"PJ(!T'P``L+"H +M@(`?``"P7X"`!"```+"PIX"$(```L+"P@-@@``"PKP2`["$``+"PH8`<(@`` +ML+"A@$@B``"PL+"`:"(``+"PJH"8(@``L+"@@"`C``"PL*R`5",``+"PJH#D +M(P``L*L(@/`D``"PIP&`'"<``+"G`X#H*0``L+"@@!0J``"PL*"`0"H``+"P +ML(!4*@``L*H#@!0K``"PL*J`0"L``+"PL(#$*P``L*L(@"@M``"PKQ*`?"X` +M`+"PHX`D+P``L+"P@+@O``"PL*.`S#```+"PHH"(,0``L+"@@+0Q``"PL+"` +MQ#$``*\_#H#<,P``KC\+@'`U``"PKRJ`T#H``+"PKH#D.P``L*\L@`Q#``"P +ML*R`H$,```````!D1```KS\*@!A&``"PL+"`+$8``+"O`H"\1P``L*@#@"Q( +M``"PJP*`H$@``+"H`8#L2```L*@!@#A)``"PL*B`:$D``+"PJ("820``L+"H +M@,A)``"PJ`.`+$H``+"PJ(!<2@``L+"H@(A*``"PKPJ`.$T``+"K"H!(3@`` +ML*H%@!Q/``!?A`:`+%$``+"L`8!,4@``L*L.@'A3``"PL*B`F%,``+"PJ("X +M4P``L+"H@-A3``"PL*B`^%,``+"PJ(`85```L+"H@#A4``"PL*B`6%0``+"P +MJ(!X5```L+"H@)A4``"PL*B`N%0``+"PJ(#X5```L+"H@!A5``"PL*B`6%4` +M`+"PJ(!\50``L+"H@)Q5``"PL*B`P%4``+"PL(#$50``L+"P@,A5``"PL*B` +M&%8``+"PL(`L5@``L+"H@)A6``"PL*R`'%<``+"PJH#05P``L*X!@"1=``"P +ML*B`8%T``+"J"8`$7@``L+"H@'!>``"PL*J`C%\``+"PJH`$80``L+"L@'!C +M``"PL*J`]&0``+"@!(!P90``L+"@@/!E``"PL*"`1&8``+"PJ(",9@``L+"B +M@.1F``"PL*"`)&<``+"PJ(!`9P``L+"P@(AG``"PL*J`L&<``+"PJH#49P`` +ML+"J@!AH``"PL*J`2&@``+"K`H"4:0``L*\&@!QM``"PL*J`T&T``+"L`X`L +M;P``L*\$@/QO``"PJ0*`:'```+"O!("D<0``L+"H@$AR``"PL*R`*',``+"P +MJ(#,````(0"@'AX``"P +ML*B`S'@``+"PK(!T>0``L*P!@.AZ``"PKPZ`:'P``+"PJH#4?0``L*D"@(Q^ +M``"PL*J`<'\``+"PJ("D?P``L*P!@'2```"PL*B`@(```*\$LH`\A@``L+"N +M@*R'``"PL*R`5(@``+"PK("XB```L+"H@'R)``"PL*B`Q(D``+"PJ(#0B0`` +ML+"J@""*``"PL*B`+(H``+"PJ(!8B@``L+"H@*R*``"PJ@6`D(L``+"PJH#8 +MBP``L+"N@+"-``"PL*B`#(X``+"PK(!``"PL*R`O)X``+"PJ(#(G@``L+"J@&2?``"PL*B` +M<)\``+"PKH#DH```L+"J@'RA``"PL*R`6*(``+"PJ(!XH@``L+"H@*2B``"P +ML*B`L*(``+"PK("HHP``L+"H@+2C``"PL+"`O*,``+"PL(#$HP``L+"P@,RC +M``"PL+"`U*,``+"PL(#`0"PL+"`/!X!`+"PL(!@ +M'@$`L+"P@(0>`0"PL+"`P!X!`+"PL(#D'@$``(0"@`P?`0"PL*B`*!\!`+"O +M!(!4(`$``(0(@*0@`0"PL*"`!"$!`+"O`H`4(@$`L*L"@#`C`0"PL+"`U",! +M`+"PH(#X)0$`L+"L@$PF`0"PL*R`F"8!`+"PL("L)@$`L+"@@/PF`0"PL*"` +M0"`$`L+"L@'!Y`0"PL*B`B'D!`+"PK(!\>@$`L*X/@&1_ +M`0"PL*R`#((!`+"PJH"\@@$`L+"J@&"#`0"PL*J`)(0!`+"PJH#4A`$`L*D" +M@'"%`0"PKQJ`%(\!`+"PJ(!TCP$`L+"L@&B0`0"PL*B`B)`!`+"PJ(#8D`$` +ML*\"@%R3`0"PL+"`O),!`+"PL(`4E`$`L+"H@"B4`0"PL*B`/)0!`+"PH(!X +ME`$``(0"@*24`0``A`*`R)0!`+"PJ(#`0"PL*B`I)X!`+"K!(",GP$`L*L$@'"@`0"P +ML*R`2*$!`+"PJ(!DH0$`L+"H@("A`0"PL*B`G*$!`+"PJ("XH0$`L+"H@-2A +M`0"PL*B`\*$!`+"PJH!,H@$`L+"J@'BB`0"PL*B`E*(!`+"PH("XH@$`L+"P +M@,BB`0"PL+"`9*4!`+"PH("`IP$`L+"P@,BH`0"PKP:`J*L!`+"H`8#HJP$` +ML*H#@#RL`0"PL*R`C*P!`+"L`8"XK0$`L*X#@,RN`0"PKPJ`++(!`%^$!H#L +ML@$`L*\,@("V`0!?A`*`'+'`"`+"H!8"X +M<`(``(0&@/QP`@``A`:`0'$"``"$!H"`<0(`K#\#@.AQ`@"PL*R`R',"`+"P +MK(#$=0(`L+"N@$!V`@"PKPJ`\'@"`+"PL(#T>`(`KPBQ@'AY`@"PL*"`7'H" +M`+"PH("X>@(`L+"A@"1[`@"PL+"`+'L"`+"PJH#,?`(`L+"J@!!^`@"PL*B` +MZ'X"`+"PKH#H@0(`L*\P@-2(`@"PL*J`6(D"`+"PJH#8B0(`L+"J@&B*`@"P +ML*J`R(H"`+"PJH!0BP(`L+"J@-R+`@"PL*B`!(P"`+"PJ("8C`(`L+"J@'2- +M`@"PL*J`_(X"`+"PJ(`PCP(`L*\"@$R1`@"PL*J`X)$"`+"PKH! +M`P"PL*J`2"`#`+"PJ(!L(`,`L+"H@'@@`P"PL*Z`!",#`+"PJH!<(P,`L+"L +M@/0D`P"PL+"`-"4#`+"PL(`\)0,`L+"P@(PE`P"PL*"`W"4#`+"PL(`@)@,` +ML+"P@#PF`P"PL*"`D"8#`+"PL("L)@,`L+"P@,@F`P"PL+"`X"8#`+"H`8`8 +M)P,`L+"P@"`G`P"PL+"`*"<#`+"PL(`P)P,`L+"P@#@G`P"PL+"`0"<#`+"P +ML(!()P,`L+"P@%`G`P"PL+"`6"<#`+"PL(!@)P,`L+"P@&@G`P"PL*"`Z"<# +M`+"PJH",*`,`L+"H@'PI`P"PKP:`N"H#`+"PJH``*P,`KRJR@$0S`P"PK`&` +MB#0#``P````T.0,`L*L$@"`[`P"PJ@&`I#P#`+"PJH#8/`,`L+"N@'`]`P"P +ML*Z`B#X#`+"PJ("@/@,`L*\*@"!+`P"PL*B`2$L#`+"O%H!@3@,`L*\"@+A1 +M`P"PK@.`%%0#`+"PJH"$50,`L+"H@+A5`P"PL*J`"%8#`+"PJH!T5@,`L*P' +M@`Q9`P"PL*Z`X%P#`+"PKH`H7@,`L+"J@%1?`P"PKP2`*&,#`+"PJ(!`8P,` +M7X0"@.AD`P"PJ@>`/&8#`+"K`H#`9P,`KPBQ@`!I`P"PL*J`=&D#`*]$LH!0 +M=0,`L*\&@'QV`P"PL*J`X'8#`+"I!(`X=P,`L*D$@)!W`P"PJ02`T'<#`+"P +MKH#(>`,`L+"H@/AX`P"PJ@&`W'D#`+"O$H!4C@,`L+"N@/R0`P"PL*B`/)$# +M`+"PJH!TD0,`L+"H@#22`P!?A`J`")0#`+"O"H#$E@,`KS\8@.R<`P"PL*Z` +M#)X#`+"PJH"TG@,`L+"P@,R>`P"PL+"`[)X#`+"PL(#\G@,`L+"P@`"?`P"P +ML*R`?)\#`+"PJH``H`,`L+"J@%B@`P"PL*B`?*`#`+"PK(#(H`,`L+"L@$RA +M`P"PL*J`J*$#`+"I!(`HH@,`L*D$@*BB`P"PL*J`"*,#`+"PJ(`PHP,`L+"H +M@*2C`P"PL*B`L*,#`+"PJ("\HP,`L+"H@,BC`P"PL*Z`M*0#`+"N`X#$I0,` +ML+"H@.BE`P"PL*B`(*8#`+"PJ(!,I@,`L+"H@%BF`P"PL*B`9*8#`+"PL(!L +MI@,`L+"P@("F`P"PL+"`A*8#`+"PL("(I@,`L+"H@+"F`P"PL*B`O*8#`+"P +MJH`0IP,`L+"N@&2H`P"PJ@N`^*@#`+"PJ(`HJ0,`L+"J@``````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````!\`P````````0`````````?`,````````$`````````#`` +M````````!``````````4`````````!<`````````!@`````````&```````` +M``@`````````#0`````````$``````````X`````````!`````````!L```` +M``````0``````````@`````````$```````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````P````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````?`,````````````````````````` +M```````````````!`````````````````````0`````````"``````````,` +M````````!``````````%``````````8`````````!P`````````(```````` +M``D`````````"@`````````+``````````P`````````#0`````````.```` +M``````\`````````$``````````1`````````!(`````````$P`````````4 +M`````````!4`````````%@`````````7`````````!@`````````&0`````` +M```:`````````!L`````````'``````````=`````````!X`````````'P`` +M```````@`````````"$`````````(@`````````C`````````"0````````` +M)0`````````F`````````"<`````````*``````````I`````````"H````` +M````*P`````````L`````````"T`````````+@`````````O`````````#`` +M````````,0`````````R`````````#,`````````-``````````U```````` +M`#8`````````-P`````````X`````````#D`````````.@`````````[```` +M`````.[N[NX$````@H2+E@P2&"0P2&!L``^L```/K`$`#ZP"``^L!``/K`4` +M4/(``%#R`0!0\@(`4/($`%#R!0!0\@$`````1!<````````!````7!<````` +M```"````:!<````````#````=!<````````$````@!<````````%````D!<` +M```````&````K!<````````'````N!<````````(````Q!<````````1```` +MU!<```````!_````X!<`````````4/(!`%#R`@!0\@3_`````0`````````` +M````__\```$```````````````!0\@(!`0```````*@6````````$````+06 +M````````(````,`6````````,````-`6````````0````.`6````````4``` +M`.P6`````````````/@6`````````````/@6````````@`````07```````` +MD````!`7````````H````!@7````````L````"07````````P````"P7```` +M````T````#@7`````````%#R`@`!````4/("``^L`H*$BY:,F*2P``-_```3 +M=```$!@```KW``!00P``#$,``$"6``#@3```"O4```6U``#@3`(!(```-0`` +M``$```!L"0```@```'$)```#````=@D```0```!["0``!0```(`)```&```` +MA0D```<```"*"0``"````(\)```)````E`D```H```"9"0``"P```)X)```, +M````HPD```T```"H"0``#@```+0)```D````/!0``"@```!0%```+````&04 +M```P````>!0``#0```",%```.````*`4```\````M!0``$````#(%```E0`` +M`'$6``"9````A18``)T```"9%@``H0```*T6``"E````P18``*<```#+%@`` +MJ0```-46``"K````WQ8``*T```#I%@``9````'P5``!H````D!4``&P```"D +M%0``<````+@5``!T````S!4``'@```#@%0``?````/05``"`````"!8``(0` +M```<%@``B````#`6``",````1!8``"(````R%```)@```$84```J````6A0` +M`"X```!N%```N````#@3``"\````3!,``,````!@$P``Q````'03``#0```` +ML!,``-0```#$$P``V````-@3``"JJ@,``````($W``"`\P``JJH#``#X```` +M`/@`$P```*2>`@`3````=%X"`!,```"D#@(`$P```-#.`0`3````0)\!`!,` +M``!P3@$`$P```*`&`0`3````<,8``!,```"@@@``$P```'!"```3````0`(` +M`#8U+AL`````,S(K&0`````P+RD8`````"TM%Q<`````*RHE%0`````H*"04 +M`````"8E(1,`````)",?$@`````B(1T1`````"`@&Q``````'QX:#P`````= +M'!@.`````!L:%PX`````&AD6#0`````8%Q4,`````!<6$PL`````%A42"P`` +M```4%!$*`````!,3$`H`````$A(/"0`````1$0\)`````!`0#@@`````#P\- +M"``````.#@P'``````T-#`<`````#0P+!@`````,#`H&``````L+"@8````` +M"PH)!0`````*"@D%``````H)"`4`````"0D(!0`````)"`<$`````#8U+B4< +M$@D$,S(K(QH1"`0P+RDA&1`(`RTM)Q\8#P@#*RHE'A8.!P,H*"(<%0T'`R8E +M(1L4#08#)",?&1,,!@,B(1T8$0L&`B`@&Q81"`4"'QX:%1`*!0(='!@4#PH% +M`AL:%Q,."00"&AD6$@T)!`(8%Q41#`@$`A<6$Q`,"`0"%A42#PL'!`$4%!$. +M"P<#`A,3$`T*!@,!$A(/#`D&`P$1$0\,"08#`1`0#@L(!0,!#P\-"P@%`P$. +M#@P*"`4"`0T-#`H'!0(!#0P+"0<$`@$,#`H)!@0"`0L+"@@&!`(!"PH)"`8$ +M`@$*"@D'!0,"`0H)"`<%`P(!"0D(!@4#`0$)"`<&!`,!`04```#!B`(%2P`` +M``85$%::.P``-6@!``````````````````)#K0`````````````````````" +M2G0````````````````````````````````````````````````````````` +M```"6"D``````*%3````!00#`@`#!@4$`P`$!@4$`@`$"`<&!``&"@D(!@`( +M"@D(!``("@D(`@`("@D(```($A$0"``0&AD8$``8(B$@&``@(B$@$``@(B$@ +M"``@(B$<"``@(B$4"``@(B`8"``@,3`@$``P,3`8```P,2\0$``P,2P0$``P +M,2@0```P,2`0```P,1`0```P!`0$!00$!0<'!P@*!`0$!`8*"PT%!0<'"`L- +M#P0$!`4'!PD)#`X0$@0$!04&"A$3"0D)"0P.$1,````````````D)BH8&AT? +M(2`"@`,@! +M0`&0`>`",`$L`4`!X`+0`^@$L`9`!]```@`"``0`"``,`!(`&``D`#``2`!@ +M`&P`*``\`%``9`"@`,@`\`$8`&0`H`#P`6@!]`)8`R`#Z`("`@("`@,#!`0% +M!P0$!PH*#`P2!0<'"`L2)#P!`0$!`0(#!`4&!P@!`@,$!08'"`4&!P@)"@L, +M(!X<&!`8```````````````````````````````````````````````````` +M``````````````````````````````````````"[`0SE@BGU@N6#.O6#X")0 +M!NDE@OCF(KO^!NDE@OCB(N6"*?6"Y8,Z]8/DDR*[`0:)@HJ#\")0`O<9(KO^!^/U\`GC&2*) +M@HJ#Y)/U\'0!DR*[`1#E@BGU@N6#.O6#X/7PH^`B4`GI)8+XAO`(YB*[_@KI +M)8+XXO7P".(BY8,J]8/ID_7PH^F3(KL!"HF"BH/PY?"C\")0!O<)I_`9(KO^ +M!O/E\`GS&2+XNP$1Y8(I]8+E@SKU@^CPY?"C\")0">DE@LCV"*;P(KO^">DE +M@LCRY?`(\B+@_*/@_:/@_J/@_R*D)8+U@N7P-8/U@R+@^Z/@^J/@^2+XX/NC +MH^#Y)?#PY8(5@G`"%8/@^CCP(NOPH^KPH^GP(M"#T(+XY)-P$G0!DW`-HZ.3 +M^'0!D_6"B(/D!@J$"XY).C^N23H_CDDZ/(Q8+(RL6# +MRO"CR,6"R,K%@\K?Z=[G@+Y(EU<``````````$B73@``````````09=6`$&7 +MJP!!EVB`09>M``#PHW0#\.3[_7]4?@'3$*\!P\#0D)>*Z_"CX/NCX/5$Y/5% +M$C6KT-"2KR+DD)>+\)`%6.#_D)>&X"\D_I"7C/#D^_U_4'X!D6.0`5-T!?`B +MD`%?Y/"0`3QT"/#DD)>+\*-T%/#D^_U_7'X!D6.0`5]T!?"0!I)T`O"0EW(4 +M\)"7=.!4#\.4#%`1?0%_#!))"I"7>N`PX`,23R(BCX*.@Z.CH^3P(A):]P)7 +M:"(B`EAT`EA[TQ"O`0<7ZO9A5F[V`; +MD)>0Y'7P`7%G$BG9_Y"7C>1U\`%Q9^]138#>JV"J8:EBT-"2KR+`X,#PP(/` +M@L#0==``P`#``<`"P`/`!,`%P`;`!Y`!Q'13\'1%H_!3D=^0`3S@53#U-*/@ +M53'U-:/@53+U-J/@53/U-^4T,.!3D`$\=`'PD)>`X##@(!,35#\PX!F0EX+D +M\)"7@>!D`V`,?P'Q>>]P!7\"$E7+D)=ZX/\PX!X3$U0_,.`7D)=\Y/"0EWO@ +M9`1@"N3_\7GO<`,25[GE-##A"9`!/'0"\!)=6>4T,.(UD`$\=`3PD`:2X##@ +M()"7B^3PHW04\.3[_7]8?@&18Y`!6W0%\)`&DG0!\(`(D)=SY/`22F/E-##C +M-9`!/'0(\)`&DN`PX2"0EXOD\*-T%/#D^_U_7'X!D6.0`5]T!?"0!I)T`O"` +M")"7$=`'PD)>!X&0#8`Q_`?%Y[W`%?P(25YY38PX&Z0`3YT`?"0EX#@ +M,.`9D)>$Y/"0EX'@9`-@#'\!\7GO8`5_`1)5RY"7>N`PX$&0EW[D\/_Q>>]@ +M-A)TK9"7>^#_9`1@*N^T`P?D_Q)65H`2D)=[X+0"&!)9D.]P!7\!$E96D)=V +MX/]]`1))"A)/(G13!)`!Q/!T1:/PT`?0!M`%T`30`]`"T`'0`-#0T(+0@]#P +MT.`R[V0!<#V0EX/@8`-_`"*0EV;@8`-_`2*0EX+@8`-_`2*0EX#@_Q,35#\P +MX`OOQ!-4!S#@`W\`(I"7A.!_`6`V?P`BD)=]X&`#?P`BD)=FX&`#?P$BD)=\ +MX&`#?P$BD)=ZX!,35#\PX`-_`"*0EW[@?P%@`G\`(N3U(W]@?@&!\=,0KP'# +MP-"0!!W@8!J0!2+@5)!@!Y`!QN!$0/"0`9[_"C[?#DH_"C\.5J8`3D_Q&[D)>9X##@"9"7F^3PHW2`\)"7F>#_PQ.0 +M_1#PD`0E[_"0EYK@8!^CH^#_)`_U@N0T_/6#X$2`\'00+_6"Y#3\]8/@1(#P +MD)>;H^#__20(]8+D-/SU@^3P=`DM]8+D-/SU@^!4\/!T(2_U@N0T_/6#X%3W +M\)"7F^#^H^#_(N]@"Y"79^"T`1#D_X`)D)=GX+0!!7\!$G4A(I`!-W0"\!)T +MT>]P!I`!R'3]\'T"?P,2-N;E:F`$?P$1NQ)SG9"7=.!4\/#@1`+P(N#_?0&/ +M9XUHY6=4#_^0EW3@5`]O8';E9S#B,)"7=.`@X@5_`1):V9"7=.`PXPKE9R#C +M!1):O8!4D)=TX"#C3>5G,.-(KV@26F6`09"7=.!4#_^_#`WE9R#C"/'[[V`M +M$EJ]D)=TX%0/_[\$#>5G(.(($EF0[V`5$=:0EW3@5`__OP()$EGS[V`#$EOL +MD)=TX%0/_Y"7=N!4#V]P(^`PYA^0EW3@5`__D)=HX/Y/D`$O\.YD@)"7:/"0 +MEW;@5+_P(N]D`7`[?7Q_`A(V=7T"?P,2-G60`5?D\)`!/'0"\'T!?PPQ"I"7 +M>N`PX`+Q(N3_$;N0!@3@5'_PD`8*X%3X\"*0`39T?/"C=`+P?7S_$C;F?0)_ +M`Q(VYI`&!.!$@/"0!@K@1`?PD)=OX*/@D`58\.5I,.`CD)=LX'`BX`3PD)=T +MX%0/PY0$4`9]`7\$,0J0EWK@,.`'X2+DD)=L\"*0EWK@D)=V,.`%X/\"=(`DX_6"Y#24]8/DC_`20H'E4U0?_^4()>`DP/6"Y#21]8/DC_`2 +M0H'E"=.4!$`#=0D$=?`*Y0B0D``20U)U\`+E"1)#4N#^H^#_Y5-4'R__Y#[^ +M=?`*Y0B0D``20U)U\`+E"1)#4N[PH^_PY50@YB3E4U0?_^4()>`D8_6"Y#24 +M]8/DC_`20H'E3S#G-J\($EY!@"_E4U0?_^4()>`DH_6"Y#24]8/DC_`20H'E +M3S#G$N5/5'_]Y5-4'_4.JPFO"!)=_>5J%"3]4`*`/Y"7=^!@,I`!6^3PD`$\ +M=`3P\=[O9`%P)W5$%/5%^_U_6'X!$C6KD`%;=`7PD`:2=`'PD)=S\(`'\=Z_ +M`0)18^4L,.$AD`$T=`+PA=%8A=)9A=-:A=1;A=5A=E?$F\5Y2PP +MXP:0`31T"/#E+##D"9`!-'00\$-7$.4L,.4DD`'/X##E'>!4W_"0`31T(/!U +MJ`!UZ`#QAY```^!4^_#Q8H#^Y2PPY@:0`31T0/#E+C#A3)`!-G0"\$-70)`! +M`N!4`V0!<"F0`3?@,.`*=`'PD)=6Y/"`&)"75N`$\.##E`I`#.3PD`09X##@ +M`Q)02I"7A>"T`0F0!2+D\)"7A?#E+B#@`J%TD)=F=`'PD`$V\)"7@.`PX#"0 +MEX5T`?"0EX#@_Q,35#\PX!Z0EX)T`?`21(&0EX'@9`-@#7\!$D=Y[V`%?P$2 +M5>]@-!)TK9"7>^#_9`1@ +M*.^T`P?D_Q)65H`2D)=[X+0"%A)9D.]P!7\!$E96D)=VX/]]`3$*\2(27+:0 +MEV;D\.4N(.("H?J0`39T!/"0EWK@,.`&H^!D!&!LY6ED`7!FY6I@8N5J9`)@ +M!N5J9`5P)Y`&J^"0EVKPD`:JX)"7=?"0EVK@<`>0EW7@_X`%D)=JX/^0EVKO +M\)"7;.!@`^`4\)"7:^3PD`%7\)`!/'0"\)"7>>!4_?#@5._PY6H4)/U0`H`# +M$EPD`%7Y/"0`3QT`O"0EWCD\)"7>>!4 +M_?#@5`=P`E%CY2XPY1^0`39T(/#E:;0!%.5J8!"0EW?@9`)@!1)5J%"3]4`*`(9"7=^!@ +M!GT!?PR`#Y"7=.!4#\.4!%`&?0%_!#$*Y/\1NR*0EWO@9`1@+Y"7=.!4#Q1@ +M'Q1@%23^8`HD^'`;Y)"7>_`BD)=[=`'P(I"7>W0"\"*0`<;@1`CP(O3_D`!# +MX%_PTQ"O``E)`$&^!4?V1_ +M?P%@`G\`(I"7?^"T`0;D\-'P\2(B\=[O9`%@"9`!N.!$`?"`-9"7<^!@"9`! +MN.!$`O"`)I"7#_?0$22"J0!!]T(/`B=2@SY/4I=2H#]2N0 +M`3#E*/"CY2GPH^4J\*/E*_`BY)"7,/"C\'6.`A)S&Y```N!4X)"796`%=`'P +M@`-T`O"0`//@,.,(D)=G=`'P@`7DD)=G\)"79^"T`1.0`/+@,.<,D)=,=/WP +MHW0S\(`*D)=,=/WPHW0O\.3U5Q)G[Q)U&!)8@A(R/?'Y\><18>20EV;PD`#S +MX##B#9`%0700\)`%6O"CY/"0`61TH/#QSQ)%`9"7,N79\!)/L\*OD`"`X$1` +M\!)/8G7H`T.HA=*OD)35_^7X!$G,LOP$)D`8U +MX%0/\(`%@``"KX/]T`7X` +MJ`<(@`7#,\XSSMCY_^]=<`)!QI"7J^!U\`20`=`20U+@D)I=Y-1)%"9"7->#_Q!,3$U0!D)>K,.!9X'7P`I``B!)#4N"0ES;P +MD)>KX'7P`I``B1)#4N"0ES?PD)>KX'7P!)`!T1)#4N"0ESCPD)>KX'7P!)`! +MTA)#4N"0ESGPD)>KX'7P!)`!TQ)#4N"0ESKP@#/@=?`$D`'1$D-2X)"7-O"0 +MEZO@=?`$D`'2$D-2X)"7-_"0EZO@=?`$D`'3$D-2X)"7./#O5'__>P%ZEWDV +M40ESL20U[AZY"7.Q)#7@)P +M$I"7.Q)#7@)NYI"7.Q)#7@)NT)"7.Q)#7H`9D)<[$D->`G!:D)<[$D->X?&0 +M`<;@1`'P(M,0KP'#P-"0ESX20W[DD)=!\!(IV<,3(.`"@8Z0ESX20UX2*=G_ +M5`+^D)>`X%3]3O[P[U0!_^Y4_D__\!(IV?Y4"/WO5/=-_Y"7@/#N5!#^[U3O +M3O_P$BG9_E0@_>]4WTW_D)>`\.Y40/[O5+].\"#@`H%^D)=!="'PD)<^$D-> +M$BG9_Q,35`'^D)>`X/T3$U0!;F`J[U0$_^U4^T_PX!,35#\PX`Z0`31T0/#] +MY/\2-N:`"^20EX+P?4#_$C9UD)>`X/T3$Q-4'S#@!Y"70>!$$O#MQ%0/,.`' +MD)=!X$04\)"7@.#$$U0',.`'D)=!X$2`\)"7@.#$$Q-4`R#@!Y"70>!$0/"0 +MET'@D`4G\)"7@>!P!'\!L]4]TW_D)=Z\.Y4$/[O5.].__`2*=G^5$#][U2_ +M39"7>O`@X`*AEY"7070Q\.X3$U0!_Y"7>N#^$Q-4`6]@)Y"7/A)#7A(IV50$ +M_^Y4^T^0EWKPX!,35#\@X`ODD)=\\'U`_Q(V=9"7>N#]$Q,35!\PX`>0ET'@ +M1`+P[<14#S#@!Y"70>!$!/"0ET'@5`9@#)`!/G0#\/U_`A(W`)"70>"0!2?P +MD)=ZX/_$$Q-4`S#@#*/@9`1@6G\$T5:`5)"7>^!D!'`8?P'15N3_$D=Y[V`( +MD)=V$DD&@`3QN8`T$D\B@"^0ET%T`?"0!2?P?0-_`A(VDI"7>^"T!`1_`8`) +MD)=[X+0#!.3_T5823^T22F/Q^=#0DJ\BD)>!X/YO8&#O%&`:%&`R%&!$)`-P +M4NZT`P+A=9"7@>!D`G!$X8N0EX'@_K0#!'\!@#?NM`(#`EMVD)>!X'`I@#>0 +MEX'@_K0#!N3_T32`!>YP`M%#X:.0EX'@M`(#`D3[D)>!X'`"\94B[V`%D`4B +MY/"0EX%T`?`BD`$^=`/P_7\"$C<`D)>!=`'P(I"7>^#^;W`"X2#O%&`Q%&!6 +M%&!V%'`"X0(D!&`"X2#NM`,$?P'A1)"7>^#^M`0&?P'Q*X`([K0"!'\!\2'A +M79"7>^"T`P1_`?%$D)=[X'`"X3J0EWO@_K0$!'\!@'?N9`)P9W\!@&20EWO@ +MM`,$?P'Q1)"7>^!P!/$Z@`N0EWO@M`0$Y/_Q*P)T<)"7>^#^M`0&Y/_Q*X`( +M[K0"!'\!\2&0EWO@M`$"\5T"W0!\"*0EZ_O +M\!):]Y"7K^!@!9`%(N3PY)"7>_`B?P$26F7DD)=[\"*0!2)T#_"0EX%T`_`B +MD`4BY/!]`W\"$C:2D`4GY/"0EX'P(A):]Y`%(N3P@.60`3YT`_#]?P(2-P"` +MQ1)TT>]P!I`!R'3]\!)SG9"7@70"\"*0EWO@M`$$?P*`")"7>^!P!'\#T58B +M=3`?=3$!Y/4RD`$XY3#PH^4Q\*/E,O`BY/4F(A(IV?5I(A(IV9"7AO`BY)"7 +MAO"0EX#@5/[P5/OPY*/PH_"C\*/PH_"0EWK@5/[P5/OPY*/PH_"C\*/PH_`B +MP.#`@\""P-!UT`#`!<`&P`=]*9`!Q.WP=%C_H_!3D>^0`%'@_I``5>!>]3WE +M/3#F`W1`\)`!Q.WPH^_PT`?0!M`%T-#0@M"#T.`RCQV,'HT?(H\@C"&-(B+D +M]6F0EWGP]6J0EW9T#/"0EW3PY)"7=_"0EW/PD)=R\)"7=03PD)=J\.20EWCP +MD)=L\)"7<70'\.20EVOPD)=O\*-T`O#DD)=N\)"7:?`BY)"7>/"0EVOPD)=Y +M\"*+$8H2B1,1T:L1JA*I$Q(IV?5J%&`.%&`>%&`O)`-P07\!@#JK$:H2J1.0 +M``(20B#]Y/\Q08`GJQ&J$JD3D``"$D(@_7\!,4$?@!.K$:H2J1.0``(20B#] +M?P(Q0>3_$DG&(N\D_F`+!'`=D)=U=`'P@!'MD)=U<`5T!?"``NWPD)=UX)"7 +M:O`BTQ"O`!$`?"`2)"7>>!4`V`)D`&YX$0"\(`WD)=VX%0/TY0"0`F0 +M`;G@1`3P@".0EWG@,.()D`&YX$0(\(`3D)=YX##D"9`!N>!$$/"``W\!(I`! +MN^!$!/!_`"+E5V`)D`&ZX$0!\(!;D)=VX%0/TY0!0`F0`;K@1`+P@$>0`H?@ +M8`F0`;K@1`3P@#B0EV7@M`(0D)=,X/ZCX/6"CH/@8!&`(9`!K^!@"9`!NN!$ +M"/"`$I"7;N!P"9`!NN!$$/"``W\!(I`!N^!$`O!_`"*0!@3@5+_P[V`)Y6FT +M`03D_U&$D)=TX%3P\.!$#/`BCVP21_CO9`%P+I"781)()N5L8!!T(2_U@N0T +M_/6#X$00\(`.="$O]8+D-/SU@^!4[_"0!!]T(/`BD`8$X$1`\.5IM`$$?P%1 +MA)"7=.!4\/#@1`3P(I"7K._P4?>0EZS@8`60!2+D\)"7=.!4\/#@1`3P(I`` +M$>!$"?`23V*0EQT20T:0@(42*G]_>'X($B_9D)3]_Q(T@9"79^"T`1&0@%D2*HL``RV5Y/U_`1(T@2)1]Y"7A>!D`6`, +MD`$VX"#@!9`%(N3PD)>!=`'P(H]KY)"7I?"C\)`!">!_`##G`G\![V5K8#[# +MD)>FX)2(D)>EX)030`B0`<;@1(#P(I"7I>1U\`$20H%_%'X`$C=4TY"7IN"4 +M,I"7I>"4`$"YD`''X##@LB(BD)=TX%3P\.!$`?`210)QZ^!4\/#@1`+P(A)' +M^+\!$)"78.#_Y/T22"J0!!]T(/`BD`:IX/4+5,!P#I"7>>!4_O#@5/WP$DIC +MY0LPYAB0EWG@1`'PD)=WX&0"8`21!8`,$D2F@`>0EWG@5/[PY0N0EWDPYQC@ +M1`+PY)"7BQ)$5Y`!5W0%\)"7>'0!\"+@5/WP(H]M$D?X[V0!<"Z0EV(22";E +M;6`0="$O]8+D-/SU@^!$$/"`#G0A+_6"Y#3\]8/@5._PD`0?="#P(N20ER[P +MY6IP`J%8Y6ED`6`"H5CE:A1@*23]8"4D`B3[4`*`(Y"7:N`4\.!@!*/@8!:0 +MEVK@<`J0EW7@D)=J\(``D)>]P +M!)"7+O"0ER[@8#B0EWG@1!#PY)"7B_"0EW'@D)>,$D1;D`%7=`7PD)=TX%0/ +MPY0$4!%]`7\$$DD*D)=ZX##@`Q)/(B*0EWC@8`[D\*/@5/WPX%0'<"B`(Y"7 +M:^`$\)"7>>!4[_"0EVO@TY0!0`WE:;0!"Z/@<`?@!/`B$DIC(N_#E"!0.>\P +MX!?MQ%3P_>_#$_XDI/6"Y#0$]8/@5`^`$._#$_XDI/6"Y#0$]8/@5/#P=*0N +M]8+D-`3U@^!-\"+@_72$)1'U@N0TEO6#[?"O$=,0KP'#P-!TA"_U@N0T!/6# +M[?#0T)*O(NU4'_40=`$O]8+D-)+U@^#U#^O#E`%``H`JY0\E#O[E$)!!GI/\ +M[M.<=`%`#"_U@N0TDO6#Y/"`KR_U@N0TDO6#[O`BK`=U\`GLD),G$D-2X/]T +MI2SU@N0TEO6#X%0?^].?0`*K!^LEX"1F]8+D-$'U@^23_G0!D__K)>`D+O6" +MY#1!]8-T`9,O_^23/L,3_N\3_^PEX"3A]8+D-)+U@^[PH^_PKP2M`['EKP,B +MK0=TA"WU@N0T!/6#X%1_]1Q4'_QU\`GMD),G$D-2X/^0ESWP[27@)('U@N0T +MDO6#X/NCX)"7/LOPH^OP[27@).3U@N0TE?6#X/NCX)"70,OPH^OP["7@)"[U +M@N0T0?6#Y)/Z=`&3^^TEX"3A]8+D-)+U@^KPH^OP[,.?0`+AK'2E+?6"Y#26 +M]8/L\`3[D)<]X/_KTY]``N'=Z\.4$$`AZR3P_W0!?@"H!PB`!<,SSC/.V/G_ +MD)<^X%[^H^!?3G`CZ\.4$%`Y=`%^`*@#"(`%PS/.,\[8^?^0ET#@7OZCX%]. +M8!SK9!-@".MD$F`#NQ$)D)<^X##@`GL8K`.,'(`T"X"+D)<]X/ML<&ETI2WU +M@N0TEO6#[/!U\`GMD),I$D-2X+0!#.4<(.8'[$1`]1R``Z\<(NPEX"1F]8+D +M-$'U@^23_G0!D__L)>`D+O6"Y#1!]8-T`9,O_^23/L,3_N\3_^TEX"3A]8+D +M-)+U@^[PH^_P@%OLTYM`5I"7/>#_=*4M]8+D-);U@^_PK`>/'.PEX"1F]8+D +M-$'U@^23_G0!D__L)>`D+O6"Y#1!]8-T`9,O_^23/L,3_N\3_^TEX"3A]8+D +M-)+U@^[PH^_PKQPB=`$M]8+D-)+U@^3PKP7E'$2`_1)=Y>4<1(#_(JH'KP5T +MA"KU@N0T!/6#X%1_^U0?^9"7/_!U\`GJD),H$D-2X)"70?!U\`GJD),G$D-2 +MX/Z0ET+PZB7@).3U@N0TE?6#X/VCX)"70\WPH^WPZB7@)('U@N0TDO6#X/VC +MX)"710`F0ET+@D)<_\/OO<`(AT9"70._PZS#F"9"7/^#[H^`4 +M\)"70.!P`B'1D)<_X/_3E`!0`B'1Y)"7/O#O%)"7/?"0ET'@^9"7/>#_TYE` +M:N^4$$`A[R3P_W0!?@"H!PB`!<,SSC/.V/G_D)=%X%[^H^!?3G`GD)<]X/_# +ME!!0,G0!?@"H!PB`!<,SSC/.V/G_D)=#X%[^H^!?3F`5D)<]X/NCX`3PD)=` +MX/^0ES[@;V`(D)<]X!3P@(B0ET#@_Y"7/N##GU`,D)<]X+4!!9"70>#[ZR7@ +M)&;U@N0T0?6#Y)/^=`&3_^LEX"0N]8+D-$'U@W0!DR__Y),^PQ/^[Q/_ZB7@ +M).'U@N0TDO6#[O"C[_"O`JT#$EWEKP,BY/41=?`)Y1&0DRH20U+@9`%@`N'C +MY1$EX"3`]8+D-)'U@^#^H^#3E`#NE`!0`N'CY1%U\`JD)`#Y=)`U\'46`?47 +MB1CE$27@),#U@N0TD?6#X/^CX)"7-\_PH^_PY1$EX"1C]8+D-)3U@^#_H^"0 +MESG/\*/O\'2$)1'U@N0T!/6#X%0_D)41D),G$D-2X)"7 +M//!T9"41]8+D-);U@^##E`5``H&\D)<\X/^0ES3@GT`3D)<\X)"7-/#N5$#^ +MD)"4`$`(Y/VO$1&4X7KE$27@).'U@N0TDO6#X/49H^#U&JL3JA2I%1(IV?]^ +M`*L6JA>I&!)"E_VL\!(I\N\E&O4:[C49]1FK$ZH4J160``$20B#_?@"K%JH7 +MJ1B0``(20L+]K/`2*?+O)1KU&NXU&?49JQ.J%*D5D``"$D(@_WX`JQ:J%ZD8 +MD``$$D+"_:SP$BGR[R4:]1KN-1GU&:L3JA2I%9```Q)"(/]^`*L6JA>I&)`` +M!A)"POVL\!(I\N\E&O4:[C49]1FK$ZH4J160``020B#_?@"K%JH7J1B0``@2 +M0L+]K/`2*?+O)1KU&NXU&?49JQ.J%*D5D``%$D(@_WX`D)0`SE&I_U&N49GO49@`7D]1GU&N41)>`DX?6"Y#22]8/E&?"CY1KP +MD)`D9O6"Y#1! +M]8/3=`&3E1KDDY494`+A3GT!KQ$1E.%.=&0E$?6"Y#26]8/@_&0%8`+!5Y"3 +M(N#_M`,+D)\D!?_D,_YT(241]8+D-)+U@^#]TY_N9(#X=("84#+M)`7_Y#/^=",E$?6" +MY#25]8/@TY_N9(#X=("84!1TA"41]8+D-);U@^#_D)41 +MD),K$D-2X+0!$.3U&W1D)1'U@N0TEO6#Y/"M&^%)[&0&8`+A3O49]1J00=N3 +M_WX`D)"5&4`'!1+E$K0%O>42PQ/U$N4;M`$&Y1)P1H`3Y1NT`Q7E$G`%=1L# +M@#GE$K0!!74;`8`O@"KE&[0%*.42<`5U&P6`#>42M`$%=1L#@`-U&P'3D)`DH_6"Y#24]8/D\*/P!1'E$<.4(%`"01PBY/UTI"WU@N0T!/6# +MY/`-O1#PY/UU\`KMD)``$D-2Y/"C\'7P"NV0D`(20U+D\*/P=?`*[9"0!!)# +M4N3PH_!U\`KMD)`&$D-2Y/"C\'7P"NV0D`@20U+D\*/P=(0M]8+D-);U@W03 +M\'1$+?6"Y#25]8/D\'1#+?6"Y#24]8/D\.TEX"3`]8+D-)'U@^3PH_#M)>`D +M8_6"Y#24]8/D\*/P[27@)./U@N0TE/6#Y/"C\.TEX"2C]8+D-)3U@^3PH_#M +M)>`D9/6"Y#25]8/D\*/P[27@)*3U@N0TE?6#Y/"C\'1$+?6"Y#26]8/D\'0D +M+?6"Y#26]8/D\'1D+?6"Y#26]8/D\)!!C)/^=`&3_Y!!5'0!DR__Y),^PQ/^ +M[Q/_[27@).'U@N0TDO6#[O"C[_!U\`GMD),I$D-2=`'P=,$M]8+D-)+U@W0, +M\'7P">V0DR420U)T__"C\'7P">V0DR,20U+D\*-T#_!U\`GMD),G$D-2=!/P +M=?`)[9"3*!)#4N3P=(0M]8+D-`3U@W03\`WM9"!@`@$#(H\1[R7@).3U@N0T +ME:^"]1./%.41=?`"I"2!^722-?!U%0'U%HD7=?`)Y1&0DR420U*O@H6#&(\9 +MY1%U\`FD)"/Y=),U\'4:`?4;B1QTP241]8+D-)+U@^`20X=J!0!J&@%J+P)J +M1`-J;01J@@5JEP9JO0QJZ@UK%PYK1`\``&MXY1$EX"3D]8+D-)7U@W3P\*-T +M%8`\Y1$EX"3D]8+D-)7U@W3P\*-T$(`GY1$EX"3D]8+D-)7U@W3P\*-T!8`2 +MY1$EX"3D]8+D-)7U@W3P\*/D\.41)>`D@?6"Y#22]8-T#_"C=(_P87CE$27@ +M).3U@N0TE?6#=`_PHW3U@"?E$27@).3U@N0TE?6#=`_PHW3P@!+E$27@).3U +M@N0TE?6#Y/"C=`WPY1$EX"2!]8+D-)+U@^3PH_!A>)`$1^"K%:H6J1<20DV0 +M!$;@JQ6J%JD7D``!$D)?D`1%X(44@H43@_"0!$1A;Y`$2^"K%:H6J1<20DV0 +M!$K@JQ6J%JD7D``!$D)?D`1)X(44@H43@_"0!$B`6)`$3^"K%:H6J1<20DV0 +M!$[@JQ6J%JD7D``!$D)?D`1-X(44@H43@_"0!$R`*Y`$4^"K%:H6J1<20DV0 +M!%+@JQ6J%JD7D``!$D)?D`11X(44@H43@_"0!%#@A12"A1.#H_"K%:H6J1?` +M`\`"P`$2*=G_JQJJ&ZD<$BG97]`!T`+0`Q)"3:L5Y1T(+0@_"%%(*%$X.CP(/`@N#_A1F"A1B#H^#^[U[0@M"#\.41)>`D@?6" +MY#22]8/@_J/@3F`[=1(+=`%^`*@2"(`%PS/.,\[8^?_E$27@)('U@N0TDO6# +MX%[^H^!?3F`&Y1(D$(!=%1+E$L.4`%#*@%;E$27@).3U@N0TE?6#X/ZCX$Y@ +M/742#W0!?@"H$@B`!<,SSC/.V/G_Y1$EX"3D]8+D-)7U@^!>_J/@7TY@")"7 +M2N42\(`0%1+E$L.4`%#(@`7DD)=*\.41)>`DY/6"Y#25]8/@_J/@3F`[Y/42 +M=`%^`*@2"(`%PS/.,\[8^?_E$27@).3U@N0TE?6#X%[^H^!?3F`(D)=+Y1+P +M@%L%$N42M!#*@%+E$27@)('U@N0TDO6#X/ZCX$Y@.>3U$G0!?@"H$@B`!<,S +MSC/.V/G_Y1$EX"2!]8+D-)+U@^!>_J/@7TY@!N42)!"`"@42Y1*T#,R`!>20 +METOPD)=*X/]U\`GE$9"3)Q)#4N_PD)=+X/YU\`GE$9"3*!)#4N[P=(0E$?6" +MY#0$]8/@TY]`!I"72A)=U'2$)1'U@N0T!/6#X/^0ETO@_N_#GE`#$EW4D)=* +MX/_3E!-`")"3(G0#\(`A[].4"T`(D),B=`+P@!/OTY0#0`B0DR)T`?"`!>20 +MDR+PD),BX)`$L?`BD)<^[_"C[?"C$D-^D)=`$D->D``#$D(@5/#$5`^0ET/P +MD``$$D(@5$#$$Q-4`Y"71/"0ES[@_W7P"9"3)1)#4JV"K(.0ET7L\*/M\.]U +M\`FD)"/Y=),U\/I[`:,20WZ0ET`20UZ0``,20B!4#_^0ET<20U[O$D)-D)=` +M$D->D``"$D(@_Y"71Q)#7I```>\20E^0ET`20UZ0``$20B#_D)=%X/RCX/WU +M@HR#[_`2*=F-@HR#H_"0ET/@_I"7/N#_),'U@N0TDO6#[O"0ES_@_G7P">^0 +MDRD20U+N\'7P">^0DRH20U)T`?"0ET3@_G7P">^0DRL20U+N\"&%D``$$D(@ +M_U0?_N]4(,035`?]KP:AU!(IV?41PY0@4!60``(20B#_=",E$?6"Y#25]8/O +M\"+E$;0@"I```A)"()"3(?`BD)5B0EY820WX+ +M>I=Y+M,0KP'#P-"0EY,20WZ0EV7@9`)@;I"79>!D`7!FD)>MX/\$\)"7DQ)# +M7I```>\20E]_KWX!\;SO8$F0EY,20UZ+8XIDB65U9@)[`7H!>:`210F0EY82 +M0UZ+8XIDB660EY,20UX2*=G_Q%0/]69[`7H!>:(210F0`:]T__"0`=[O"C[_#DH_"C\)"7G>#^H^#U@HZ#X&`MPY"7H."4 +MZ)"7G^"4`T`+D`'&X$00\'\`@!60EY_D=?`!$D*!?PI^`!(W5(#%?P'0T)*O +M(I`"">#]$BG9_J\%[2Z0EU_PD``!$D(@_^TOD)=@\)```A)"(/_M+Y"78?"0 +M``,20B#_[2^0EV+PD``$$D(@_ZX%[2^0EV/P(M,0KP'#P-"0ESX20WZ0ESX2 +M0UZ0``$20L+ZY?`D`/_D.OZ0ESX20UZ0``'NC_`20QD2*=G_8"RU(Q:0ESX2 +M0UZ0``$20L)E)7`$Y21E\&`CD)<^$D->D``!$D+"_Z[P$=*`$)"7/A)#7A(I +MV64C8`,21^_0T)*O(I"70>[PH^_P=2,!CB3U)>3]?PLQ%.3]?P(Q%#'JY/\Q +MWN3U)Y`!R>4G\)"70>#\H^#][/N-1.3U17T!?V!^`0(UJ],0KP'#P-"0ET3M +M\)"70^_PTY0'4$^CX'`:D)=#X/]T`:@'"(`"PS/8_/3_D`!'X%_P@!>0ET/@ +M_W0!J`<(@`+#,]C\_Y``1^!/\!)/8I"70^#_=`&H!PB``L,SV/ST_Y``1H!: +MD)=#X"3X\*/@3U)H`#=28! +M?P$B?P`BY2-D`7`^,>J_`01_`3'>D`!&X$0$_7]&$D]RD`!$X%3[_7]$$D]R +MD`!&X%3[_7]&$D]R?P)1:X\GD`')Y2?PM`$"44LBD`!)X)"7KO#@5`_P1/#] +M?TD23W*0EZ[@1+#]?TD"3W+3$*\!P\#0D)>P[_#3E`=01^#_=`&H!PB``L,S +MV/ST_Y``1N!?\!)/8I"7L.#]=`%^`*@%"(`%PS/.,\[8^?^0`$3@^^3^[UNH +M!0B`!LZBYQ/.$]CX_X!$D)>PX"3X\.#_=`&H!PB``L,SV/P23UJ0E[#@_70! +M?@"H!0B`!<,SSC/.V/G_D`!"X/OD_N];J`4(@`;.HN<3SA/8^/_0T)*O(I`& +M-'3_\.2C\*/PH_`B(N20EV3PD`"`X$2`_7^``D]RCA&/$HL3BA2)%>20ES/P +M[Y``,?`23V+E$50#_Y``,N!4_$_P$D]BD``SX%1_\!)/8I``,^`@YPZ0ES/@ +MPY1D4`7@!/"`ZY"7,^##E&10$)``,."K$ZH4J1420DU_`2)_`"*0!2)T__!Q +MG9"7>W0#\")_>'X($B?>D)<=$BI_?P1^#!(GWI"7(1(J?W\`?@@2)]Z0ER42 +M*G^0EV?@D)<=M`$-$D-&[U3'_^U4Q_V`!Q)#1N]4Q__LD("%$BI_?WA^"!(O +MV9"7(1)#1N]4#__LD("%$BI_?P1^#!(OV9"7)1)#1N]$`O_LD("%$BI_?P!^ +M"!(OV7]P?@X2)]Z0ERD2*G^0@(42*HL`&R6@?W!^#A(OV9"`61(JBP````#D +M_?\2-(&0EV?@M`$1D(!9$BJ+`````.3]?P$2-(&0`!'@5/;P`D]B$DC6D)=[ +M=`+P(I`%(G0/\)"7>W0$\"*N!^3_$D=Y[V`9D)=ZX,03$U0#(.`-KP9]`1)) +M"A)/(G\!(G\`(I"7>N#_Q!,35`,PX`NCX&0$8`5_!!)65I"7>^!D!&`#$D_M +M(I`%(G3_\.20EZ?PH_"0!?C@<`^CX'`+H^!P!Z/@<`-_`2+3D)>HX)3HD)>G +MX)0#0`-_`")_,GX`$C=4D)>GY'7P`1)"@8#&D)=GX)"7+?`B[W`"P=B0ERW@ +M8`,">J20EQD20T:0@(42*G]_C'X($B_9D);%$D-&D("%$BI_?T1^"!(OV9"6 +MR1)#1I"`A1(J?W]'X. +M$B_9D);=$D-&D("%$BI_?WQ^#A(OV9"6X1)#1I"`A1(J?W^`?@X2+]F0EN42 +M0T:0@(42*G]_A'X.$B_9D);I$D-&D("%$BI_?XA^#A(OV9"6[1)#1I"`A1(J +M?W^,?@X2+]F0EO$20T:0@(42*G]_T'X.$B_9D);U$D-&D("%$BI_?]1^#A(O +MV9"6^1)#1I"`A1(J?W_8?@X2+]F0EOT20T:0@(42*G]_W'X.$B_9D)!D`6`#`GJD?XQ^"!(GWI"7 +M&1(J?W]$?@@2)]Z0EL42*G]_7'X($B?>D);)$BI_?VQ^#A(GWI"6S1(J?W]P +M?@X2)]Z0EM$2*G]_='X.$B?>D);5$BI_?WA^#A(GWI"6V1(J?W]\?@X2)]Z0 +MEMT2*G]_@'X.$B?>D);A$BI_?X1^#A(GWI"6Y1(J?W^(?@X2)]Z0END2*G]_ +MC'X.$B?>D);M$BI_?]!^#A(GWI"6\1(J?W_4?@X2)]Z0EO42*G]_V'X.$B?> +MD);Y$BI_?]Q^#A(GWI"6_1(J?W_@?@X2)]Z0EP$2*G]_['X.$B?>D)<%$BI_ +M?P1^#!(GWI"7"1(J?W\$?@T2)]Z0EPT2*G]_#'X)$B?>D)<1$BI_?P1^"!(G +MWI"7%1(J?W^,?@@2)]Z0EZ$2*G^0EZ$20T;M1,#][)"7H1(J?Y"7H1)#1I"` +MA1(J?W^,?@@2+]F0@(42*HL``0``?T1^"!(OV9"`A1(JBP#;):1_7'X($B_9 +MD("%$BJ+(-LEI']L?@X2+]F0@(42*HL@VR6D?W!^#A(OV9"`A1(JBP0;):1_ +M='X.$B_9D("%$BJ+!!LEI']X?@X2+]F0@(42*HL$&R6D?WQ^#A(OV9"`A1(J +MBP0;):1_@'X.$B_9D("%$BJ+8]LEI'^$?@X2+]F0@(42*HL$&R6D?XA^#A(O +MV9"`A1(JBR#;):1_C'X.$B_9D("%$BJ+(-LEI'_0?@X2+]F0@(42*HL@VR6D +M?]1^#A(OV9"`A1(JBR#;):1_V'X.$B_9D("%$BJ+`!LEI'_A$BI_D)>A$D-&D("%$BI_?P1^ +M#!(OV7\$?@T2)]Z0EZ$2*G^0EZ$20T;O5/#_[)"7H1(J?Y"7H1)#1N]$`?_L +MD)>A$BI_D)>A$D-&D("%$BI_?P1^#1(OV7\,?@D2)]Z0EZ$2*G^0EZ$20T;D +M_^R0EZ$2*G^0EZ$20T;O1!'_[)"7H1(J?Y"7H1)#1I"`A1(J?W\,?@D2+]E_ +M#'X)$B?>D)>A$BI_D)>A$D-&[50/_>Q4\/R0EZ$2*G^0EZ$20T;M1!#][$0! +M_)"7H1(J?Y"7H1)#1I"`A1(J?W\,?@D2+]E_!'X($B?>D)>A$BI_D)>A$D-& +M[U3P_^R0EZ$2*G^0EZ$20T;O1`'_[)"7H1(J?Y"7H1)#1I"`A1(J?W\$?@@2 +M+]GDD)J[?"0EZGO\-.4!U!EX/]T`:@'"(`"PS/8_/3_ +MD`!'X%_P$D]BD)>IX/]T`:@'"(`"PS/8_/^0`$;@3_`23V*0EZK@8!:0EZG@ +M_W0!J`<(@`+#,]C\_Y``18!HD)>IX/]T`:@'"(`"PS/8_/3_D`!%@&V0EZG@ +M)/CPX/]T`:@'"(`"PS/8_,14\!)/6I"7J>#_=`&H!PB``L,SV/S_D`!#X$_P +M$D]BD)>JX&`;D)>IX/]T`:@'"(`"PS/8_,14\/^0`$+@3X`:D)>IX/]T`:@' +M"(`"PS/8_,14\/3_D`!"X%_P$D]BT-"2KR(..```P8@"`$L````&%1,)5#H! +M`#5H`0`````````````````"0[H``````````````````````DOD```````` +M`````````````````````````````````````````````````````E\4```` +M``"AWP````4$`P(``P8%!`,`!`8%!`(`!`@'!@0`!@H)"`8`"`H)"`0`"`H) +M"`(`"`H)"```"!(1$`@`$!H9&!``&"(A(!@`("(A(!``("(A(`@`("(A'`@` +M("(A%`@`("(@&`@`(#$P(!``,#$P&```,#$O$!``,#$L$!``,#$H$```,#$@ +M$```,#$0$```,`0$!`4$!`0%!04&!@0$!`4%!08&!`0%!04%!@8$!`4%!04& +M!PH+#1`$!04&!@D,$0@("0D*#!`1!`0$!00$!0<'!P@*!`0$!`8*"PT%!0<' +M"`L-#P0$!`4'!PD)#`X0$@0$!04&"A$3"0D)"0P.$1,````````````D)BH8 +M&AT?(2`"@ +M`,@!0`&0`>`",`$L`4`!X`+0`^@$L`9`!]```@`"``0`"``,`!(`&``D`#`` +M2`!@`&P`*``\`%``9`"@`,@`\`$8`&0`H`#P`6@!]`)8`R`#Z`("`@("`@,# +M!`0%!P0$!PH*#`P2!0<'"`L2)#P!`0$!`0(#!`4&!P@!`@,$!08'"`4&!P@) +M"@L,(!X<&!`8````````````````NP$,Y8(I]8+E@SKU@^`B4`;I)8+XYB*[ +M_@;I)8+XXB+E@BGU@N6#.O6#Y),BNP$&B8**@_`B4`+W(KO^`?,B^+L!#>6" +M*?6"Y8,Z]8/H\")0!NDE@LCV(KO^!>DE@LCR(L7P^*/@*/#%\/CE@A6"<`(5 +M@^`X\"*[`0J)@HJ#X/7PH^`B4`:'\`GG&2*[_@?C]?`)XQDBB8**@^23]?!T +M`9,BNP$0Y8(I]8+E@SKU@^#U\*/@(E`)Z26"^(;P".8BN_X*Z26"^.+U\`CB +M(N6#*O6#Z9/U\*/IDR*[`0J)@HJ#\.7PH_`B4`;W":?P&2*[_@;SY?`)\QDB +M^+L!$>6"*?6"Y8,Z]8/H\.7PH_`B4`GI)8+(]@BF\"*[_@GI)8+(\N7P"/(B +M[TO_[DK^[4G][$C\(N#\H^#]H^#^H^#_(J0E@O6"Y?`U@_6#(N#[H^#ZH^#Y +M(OC@^Z.CX/DE\/#E@A6"<`(5@^#Z./`BZ_"CZO"CZ?`BT(/0@OCDDW`2=`&3 +M<`VCHY/X=`&3]8*(@^1S=`*3:&#OHZ.C@-\"0_@"4&_DDZ/XY).C0`/V@`'R +M"-_T@"GDDZ/X5`1^`9-@O*/_5#\PY0E4'_[DDZ-@`0[/5,`EX&"H0+CDDZ/ZY).C^.23H\C% +M@LC*Q8/*\*/(Q8+(RL6#RM_IWN>`ODB7=@``````````2)=M``````````!! +MEW4`09>]`$&7AX!!E[\``/"C=`/PY/O]?U1^`=,0KP'#P-"0EYSK\*/@^Z/@ +M]43D]442,&+0T)*O(I`!7^3PD`$\=`CPY)"7G?"C=!3PY/O]?UQ^`9%PD`%? +M=`7PD`:2=`+PD)>1%/"0EY/@5`_#E`Q0`Q)(VR*/@HZ#HZ.CY/`BY/5G?V!^ +M`8#MD)>5X/]]`0)(W[&QOP$/D)=_X/_D_?']D`0?="#P(B(B(B(```)?I@)? +MK=,0KP'#P-"+8(IAB6*0EY]QBZMCJF2I99"7HG&+KV859N]@&Y"7HN1U\`%Q +M=!(D8O^0EY_D=?`!<73O44V`WJM@JF&I8M#0DJ\BD`:IX/4+5,!P#9"7F.!4 +M_O#@5/WPD=[E"S#F%Y"7F.!$`?"0EY;@9`)@!)'H@`N1CH`'D)>8X%3^\.4+ +MD)>8,.<7X$0"\.20EYV19)`!5W0%\)"7EW0!\"+@5/WP(M,0KP'#P-"0!!W@ +M8!J0!2+@5)!@!Y`!QN!$0/"0`3PD=[E-##D")`!/'00\/$$Y30PY0F0`3QT(/`24NCE +M-3#@$)`!/70!\)``@^"0EY7PD=YTWP20`<3P=$6C\-`'T`;0!=`$T`/0`M`! +MT`#0T-""T(/0\-#@,N5G9`%P/1)LWK\!!'\!\=V0`$;@1`3]?T;Q4I``1.!4 +M^_U_1/%2D`!&X%3[_7]&\5)_`A)L^H]KD`')Y6OPM`$"\;\B\)``1>!4_OU_ +M1=,0KP'#P-"/@G6#`.WP$D_ET-"2KR*0`3QT__"C\*/PD`$T\*/PH_"C\/U_ +M5/%2??]_5?%2??]_5O%2??]_5X"_D`$PY/"C\*/PH_"0`3CPH_"C\*/P_7]0 +M\5+D_7]1\5+D_7]2\5+D_7]3@).0`$G@D)?`\.!4#_!$\/U_2?%2D)?`X$2P +M_7])X5*0`#\)``@.!$@/U_@.%2X/]]`9"7J^_PH^WP +MY*/PH_#E)V`$Y/\1CI"7J^`PX`F0EZWD\*-T@/"0EZO@_\,3D/T0\)`$)>_P +MD)>LX&`?HZ/@_R0/]8+D-/SU@^!$@/!T$"_U@N0T_/6#X$2`\)"7K:/@__TD +M"/6"Y#3\]8/D\'0)+?6"Y#3\]8/@5/#P="$O]8+D-/SU@^!4]_"0EZW@_J/@ +M_R+O8`N0EX;@M`$0Y/^`"9"7AN"T`05_`1)OJR)]`G\#$C$LY2<4)/U0`H`A +MD)>6X&`&?0%_#(`/D)>3X%0/PY0$4`9]`7\$$=_D_Q&.(GT!?PR/)(TEY214 +M#_^0EY/@5`]O8'#E)##B+9"7D^`@X@1_`7$/D)>3X##C">4D(.,$,96`4)"7 +MD^`@XTGE)##C1*\E<2Z`/I"7D^!4#_^_#`SE)"#C!W&&[V`J,960EY/@5`__ +MOP0,Y20@X@?Q]>]@%#&QD)>3X%0/_[\""!)@`^]@`E'UD)>3X%0/_Y"7E>!4 +M#V]P(^`PYA^0EY/@5`__D)>'X/Y/D`$O\.YD@)"7A_"0EY7@5+_P(I`&!.!$ +M0/#E)K0!!'\!<4V0EY/@5/#PX$0$\"*0`3=T`O"0!2)T__`2;@_O<`:0`.X*/@D`58\.4F,.`: +MD)>+X'`9X`3PD)>3X%0/PY0$4`M]`7\$`=_DD)>+\"*+$HH3B13QSZL2JA.I +M%!(D8O4G%&`.%&`>%&`O)`-P0'\!@#JK$JH3J120``(20B#]Y/]1SX`GJQ*J +M$ZD4D``"$D(@_7\!4<\?@!.K$JH3J120``(20B#]?P)1S^3_,>V0EY1P!70%\(`"[?"0EY3@D)>)\"*0EY/@5/#PX$0!\!)$ +M_1)$_N!4\/#@1`+P(I"7ON_P$FY0D)>^X&`%D`4BY/"0EY/@5/#PX$0$\"*0 +M!@3@5+_P[V`)Y2:T`03D_W%-D)>3X%3P\.!$#/`BCVT21;'O9`%P+I"7@!)' +M^>5M8!!T(2_U@N0T_/6#X$00\(`.="$O]8+D-/SU@^!4[_"0!!]T(/`B<=7O +M9`%@"9`!N.!$`?"`-9"7DN!@"9`!N.!$`O"`)I"7D>!@"9`!N.!$!/"`%Y"7 +ME>!4#].4!$`)D`&XX$0(\(`#?P$BD`&[X$0(\'\`(I`$&^!4?V1_?P%@`G\` +M(L#@P/#`@\""P-!UT`#``,`!P`+``\`$P`7`!L`'D`'$=.3P=$NC\)`!-.!5 +M*/4LD`$VX%4J]2ZCX%4K]2_E+"#@`J%]D`$T=`'PA=%-A=).A=-/A=10A=51 +MA=92A==3A=E4Y5140,,3_^535"!O<`*A-.54,.4"H33E4E0?]0CE350_]0GE +M450?_^4()>`DX_6"Y#24]8/DC_`20H'E4U0?_^4()>`DP/6"Y#21]8/DC_`2 +M0H'E"=.4!$`#=0D$=?`*Y0B0D``20U]U\`+E"1)#7^#^H^#_Y5-4'R__Y#[^ +M=?`*Y0B0D``20U]U\`+E"1)#7^[PH^_PY50@YB3E4U0?_^4()>`D8_6"Y#24 +M]8/DC_`20H'E3S#G-J\($EL^@"_E4U0?_^4()>`DH_6"Y#24]8/DC_`20H'E +M3S#G$N5/5'_]Y5-4'_4.JPFO"!):Z^4G%"3]4`*`0)"7EN!@,I`!6^3PD`$\ +M=`3P<=7O9`%P*'5$%/5%^_U_6'X!$C!BD`%;=`7PD`:2=`'PD)>2\(`(<=6_ +M`0,21-[E+##A(9`!-'0"\(716(7268736H746X757(7678777H797Q)IY.4L +M,.,&D`$T=`CPY2PPY`F0`31T$/!#5Q#E+##E)9`!S^`PY1[@5-_PD`$T="#P +M=:@`=>@`$D>3D``#X%3[\/'E@/[E+##F!I`!-'1`\.4N,.$[D`$V=`+P0U=` +MD`$"X%0#9`%P*)`!-^`PX`IT`?"0EW7D\(`7D)=UX`3PX,.4"D`+Y/"0!!G@ +M,.`"\9KE+C#@$I"7A70!\)`!-O`280:0EX7D\.4N,.)RD`$V=`3PY29D`7!F +MY2=@8N4G9`)@!N4G9`5P)Y`&J^"0EXGPD`:JX)"7E/"0EXG@<`>0EY3@_X`% +MD)>)X/^0EXGO\)"7B^!@`^`4\)"7BN3PD`%7\)`!/'0"\)"7F.!4_?#@5._P +MY2<4)/U0`H`#$D53Y2XPXRB0`39T"/#E)F0!6X&0" +M8`421.B``Q)$CN4N,.8>D`$V=$#PY2:T`1/E)V`/D)>8X%3^\.!4!W`#$D3> +MY2\PX0B0`3=T`O`1J73D!)`!Q/!T2Z/PT`?0!M`%T`30`]`"T`'0`-#0T(+0 +M@]#PT.`R$D6QOP$0D`()X/]]`1)'_9`$'W0@\")U*#/D]2EU*@/U*Y`!,.4H +M\*/E*?"CY2KPH^4K\"+DD)>7\)"7BO"0EYCP(O3_D`!#X%_PTQ"O`!$`O"`-Y"7E>!4 +M#].4`D`)D`&YX$0$\(`CD)>8X##B"9`!N>!$"/"`$Y"7F.`PY`F0`;G@1!#P +M@`-_`2*0`;O@1`3P?P`B=3`?=3$!Y/4RD`$XY3#PH^4Q\*/E,O`BY)"73_"C +M\'6.`A)'Z9```N!4X)"7A&`%=`'P@`-T`O"0`//@,.,(D)>&=`'P@`7DD)>& +M\)"7AN"T`1.0`/+@,.<,D)=K=/WPHW0S\(`*D)=K=/WPHW0O\.3U5Q)H`A)O +MHA)?M!(N`1)N"Q)/L>20EX7PD`#SX##B#9`%0700\)`%6O"CY/"0`61TH/`1 +M5Q)$_Q)WW)"74>79\!)':,*OD`"`X$1`\!)/Y77H`T.HA=*OD)=/X&0!\"1O +MD`'$\'10H_#E5S#D"<*O4U?OTJ]QGN57,.86PJ]35[_2KQ)A^9"7/.#_8`.T +M`0(QE)"7/.!P`Q)X.C%G@+F0!C3@8"8435_^7X!$FVIOP$)D`8U +MX%0/\(`%@``";9ODD`8T\"*0ES/@PY044`7@!/!!3)"7,^!D%&`"04R0ET+@ +M<"60ET7@0!/W@5/[PD)="X)`$ +M1/"0ET/@D`1%\)"71."0!$;PH^3PD)=%X)`$2/"0ET;@D`1)\)"71^"0!$KP +MH^3PD)#^TY]0"Y"72^##GM.4`4`0D)"0ETGPD`5BX)"72O"0!6/@D)=+\,-T_Y_^D)=) +MX-.>0![@+_"CX+3_#^3PH^"T_P/D\"*0ETN``Y"72N`$\"*0ETG@+_`BD)#_49:0ETQT`1)'2(!`D)=,X&0!<#B0ESW@_U&6 +MY)"73/"0`$7@1`']?T421U*0ES+@8!60ES020U.0@)82)0A_@'X($BL(@`60 +M!2+D\)`%A^!D@/"0ETC@D`6$\)"72>"0!87PD)=*X)`%AO"0ETO@D`6'\"*0 +M`]X/]T`7X`J`<(@`7#,\XSSMCY_^]=<`*! +MV)"7O>!U\`20`=`20U_@D)=3\'5C`75DEW5E4W5F`7L!>I=Y5!)%"9"75.#_ +MQ!,3$U0!D)>],.!9X'7P`I``B!)#7^"0EU7PD)>]X'7P`I``B1)#7^"0EU;P +MD)>]X'7P!)`!T1)#7^"0EU?PD)>]X'7P!)`!TA)#7^"0EUCPD)>]X'7P!)`! +MTQ)#7^"0EUGP@#/@=?`$D`'1$D-?X)"75?"0E[W@=?`$D`'2$D-?X)"75O"0 +ME[W@=?`$D`'3$D-?X)"75_#O5'__>P%ZEWE5D>"0EU+@_Y"7O>#^=`&H!@B` +M`L,SV/ST7Y"74O"0E[W@_W0!J`<(@`+#,]C\D`',\)"7O>`$\.!4`_!AJ)`! +MQN!$`O`BD)=:$D.+[Q)#E%4,`545`E4>`U4G!54P!E5C!U4X"55!#%5*#553 +M#@``55R0EUH20VL":N&0EUH20VL":PN0EUH20VL":Q&0EUH20VL":;60EUH2 +M0VN`+)"76A)#:P)K69"76A)#:P)Y$I"76A)#:P)WJ9"76A)#:P)V(I`!QN!$ +M`?`BD``$$D(@_U0?_N]4(,035`?]KP:0EUWO\*/M\*,20XN0EU\20VN0``,2 +M0B!4\,14#Y"78O"0``020B!40,03$U0#D)=C\)"77>#_=?`)D),E$D-?K8*L +M@Y"79.SPH^WP[W7P":0D(_ETDS7P^GL!HQ)#BY"77Q)#:Y```Q)"(%0/_Y"7 +M9A)#:^\20DV0EU\20VN0``(20B#_D)=F$D-KD``![Q)"7Y"77Q)#:Y```1)" +M(/^0EV3@_*/@_?6"C(/O\!(D8HV"C(.C\)"78N#^D)==X/\DP?6"Y#22]8/N +M\)"77N#^=?`)[Y"3*1)#7^[P=?`)[Y"3*A)#7W0!\)"78^#^=?`)[Y"3*Q)# +M7^[PCQ+O)>`DY/6"Y#25KX+U%(\5Y1)U\`*D)('Y=)(U\'46`?47B1AU\`GE +M$I"3)1)#7Z^"A8,9CQKE$G7P":0D(_ETDS7P=1L!]1R)'73!)1+U@N0TDO6# +MX!)#E%;R`%<'`5<<`E%!E>L#%?:#5@'#E@T#P``6&CE$B7@ +M).3U@N0TE?6#=/#PHW05@#SE$B7@).3U@N0TE?6#=/#PHW00@"?E$B7@).3U +M@N0TE?6#=/#PHW0%@!+E$B7@).3U@N0TE?6#=/#PH^3PY1(EX"2!]8+D-)+U +M@W0/\*-TC_`"6&CE$B7@).3U@N0TE?6#=`_PHW3U@"?E$B7@).3U@N0TE?6# +M=`_PHW3P@!+E$B7@).3U@N0TE?6#Y/"C=`WPY1(EX"2!]8+D-)+U@^3PH_`" +M6&B0!$?@JQ:J%ZD8$D)-D`1&X*L6JA>I&)```1)"7Y`$1>"%%8*%%(/PD`1$ +M`EA?D`1+X*L6JA>I&!)"39`$2N"K%JH7J1B0``$20E^0!$G@A16"A12#\)`$ +M2(!8D`1/X*L6JA>I&!)"39`$3N"K%JH7J1B0``$20E^0!$W@A16"A12#\)`$ +M3(`KD`13X*L6JA>I&!)"39`$4N"K%JH7J1B0``$20E^0!%'@A16"A12#\)`$ +M4."%%8*%%(.C\*L6JA>I&,`#P`+``1(D8O^K&ZH0U%_K``\`"P`$2)&+_JQNJ'*D=D``!$D(@7]`!T`+0`Q)"3845 +M@H44@\"#P(+@_X4:@H49@^#^[U[0@M"#\(45@H44@Z/`@\""X/^%&H*%&8.C +MX/[O7M""T(/PY1(EX"2!]8+D-)+U@^#^H^!.8#MU$PMT`7X`J!,(@`7#,\XS +MSMCY_^42)>`D@?6"Y#22]8/@7OZCX%].8`;E$R00@%T5$^43PY0`4,J`5N42 +M)>`DY/6"Y#25]8/@_J/@3F`]=1,/=`%^`*@3"(`%PS/.,\[8^?_E$B7@).3U +M@N0TE?6#X%[^H^!?3F`(D)=IY1/P@!`5$^43PY0`4,B`!>20EVGPY1(EX"3D +M]8+D-)7U@^#^H^!.8#OD]1-T`7X`J!,(@`7#,\XSSMCY_^42)>`DY/6"Y#25 +M]8/@7OZCX%].8`B0EVKE$_"`6P43Y1.T$,J`4N42)>`D@?6"Y#22]8/@_J/@ +M3F`YY/43=`%^`*@3"(`%PS/.,\[8^?_E$B7@)('U@N0TDO6#X%[^H^!?3F`& +MY1,D$(`*!1/E$[0,S(`%Y)"7:O"0EVG@_W7P">42D),G$D-?[_"0EVK@_G7P +M">42D),H$D-?[O!TA"42]8+D-`3U@^#3GT`%D)=I4<)TA"42]8+D-`3U@^#_ +MD)=JX/[OPYY0`E'"D)=IX/_3E!-`")"3(G0#\(`A[].4"T`(D),B=`+P@!/O +MTY0#0`B0DR)T`?"`!>20DR+PD),BX)`$L?`BX/UTA"42]8+D-);U@^WPKQ+3 +M$*\!P\#0=(0O]8+D-`3U@^WPT-"2KR+M5!_U$'0!+_6"Y#22]8/@]0^0!/W@ +MM`$%=1$#@`-U$0'KPY410`*`*N4/)0[^Y1"00=:3_.[3G'0!0`PO]8+D-)+U +M@^3P@*`O]8+D-)+U@^[P(JP'=?`)[)"3)Q)#7^#_=*4L]8+D-);U@^!4'_O3 +MGT`"JP?K)>`DGO6"Y#1!]8/DD_YT`9/_ZR7@)&;U@N0T0?6#=`&3+__DDS[# +M$_[O$__L)>`DX?6"Y#22]8/N\*/O\*\$K0-1TZ\#(JH'KP5TA"KU@N0T!/6# +MX%1_^U0?^9"77O!U\`GJD),H$D-?X)"78/!U\`GJD),G$D-?X/Z0EV'PZB7@ +M).3U@N0TE?6#X/VCX)"78LWPH^WPZB7@)('U@N0TDO6#X/VCX)"79,WPH^WP +MZ=.>0`F0EV'@D)=>\/OO<`*!Y)"77^_PZS#F"9"77N#[H^`4\)"77^!P`H'D +MD)=>X/_3E`!0`H'DY)"77?#O%)"77/"0EV#@^9"77.#_TYE`:N^4$$`A[R3P +M_W0!?@"H!PB`!<,SSC/.V/G_D)=DX%[^H^!?3G`GD)=##GU`,D)=V0DR<20U_@ +M_Y"77/#M)>`D@?6"Y#22]8/@^Z/@D)==R_"CZ_#M)>`DY/6"Y#25]8/@^Z/@ +MD)=?R_"CZ_#L)>`D9O6"Y#1!]8/DD_IT`9/[[27@).'U@N0TDO6#ZO"CZ_#L +MPY]``L$M=*4M]8+D-);U@^SP!/N0EUS@_^O3GT`"P5[KPY000"'K)/#_=`%^ +M`*@'"(`%PS/.,\[8^?^0EUW@7OZCX%].<"/KPY004#ET`7X`J`,(@`7#,\XS +MSMCY_Y"77^!>_J/@7TY@'.MD$V`(ZV028`.[$0F0EUW@,.`">QBL`XP=@#0+ +M@(N0EUS@^VQP:72E+?6"Y#26]8/L\'7P">V0DRD20U_@M`$,Y1T@Y@?L1$#U +M'8`#KQTB["7@))[U@N0T0?6#Y)/^=`&3_^PEX"1F]8+D-$'U@W0!DR__Y),^ +MPQ/^[Q/_[27@).'U@N0TDO6#[O"C[_"`6^S3FT!6D)=4=1(#] +M4=/E'42`_R+`X,#PP(/`@L#0==``P`#``<`"P`/`!,`%P`;`!Y`!Q'04\'1? +MH_!3D>^0`%'@_Y``5>!?]3WE/3#F&'1`\)"7.^!4`_^_`PN0ESC@8`5_`1)V +M^N4],.<5D`!5=(#PD)<[X%0#_[\#!7\"$G;ZD`'$=!3P=%^C\-`'T`;0!=`$ +MT`/0`M`!T`#0T-""T(/0\-#@,H\>C!^-("*/(8PBC2,BY/4FD)>8\/4GD)>5 +M=`SPD)>3\.20EY;PD)>2\)"7D?"0EY0$\)"7B?#DD)>7\)"7B_"0EY!T!_#D +MD)>*\)"7CO"C=`+PY)"7C?"0EXCP(N578`F0`;K@1`'P@%N0EY7@5`_3E`%` +M"9`!NN!$`O"`1Y`"A^!@"9`!NN!$!/"`.)"7A."T`A"0EVO@_J/@]8*.@^!@ +M$8`AD`&OX&`)D`&ZX$0(\(`2D)>-X'`)D`&ZX$00\(`#?P$BD`&[X$0"\'\` +M(H]LY)"7M_"C\)`!">!_`##G`G\![V5L8#[#D)>XX)2(D)>WX)030`B0`<;@ +M1(#P(I"7M^1U\`$20H%_%'X`$C(5TY"7N."4,I"7M^"4`$"YD`''X##@LB*/ +M;A)%L>]D`7`ND)>!$D?YY6Y@$'0A+_6"Y#3\]8/@1!#P@`YT(2_U@N0T_/6# +MX%3O\)`$'W0@\"+DD)=-\.4G8&[E)F0!<&CE)Q1@*23]8"4D`B3[4`*`(Y"7 +MB>`4\.!@!*/@8!:0EXG@<`J0EY3@D)>)\(``D)=-=`'PD)=-X&`ND)>8X$00 +M\.20EYWPD)>0X)"7GA)$:)`!5W0%\)"7D^!4#\.4!%`'?0%_!!)(WR*0EY?@ +M8`[D\*/@5/WPX%0'<"B`(Y"7BN`$\)"7F.!4[_"0EXK@TY0!0`WE)K0!"Z/@ +M<`?@!/`B$D3>(N_#E"!0.>\PX!?MQ%3P_>_#$_XDI/6"Y#0$]8/@5`^`$._# +M$_XDI/6"Y#0$]8/@5/#P=*0N]8+D-`3U@^!-\"+D]1)U\`GE$I"3*A)#7^!D +M`6`"X?7E$B7@),#U@N0TD?6#X/ZCX-.4`.Z4`%`"X?7E$G7P"J0D`/ETD#7P +M=142)>`DP/6"Y#21]8/@_Z/@D)=6S_"C[_#E$B7@)&/U@N0TE/6# +MX/^CX)"76,_PH^_P=(0E$O6"Y#0$]8/@5#^0EU+PX/Y4'Z/P=?`)Y1*0DR<2 +M0U_@D)=;\'1D)1+U@N0TEO6#X,.4!4`"@<^0EUO@_Y"74^"?0!.0EUO@D)=3 +M\.Y40/Z0EU+P[T[PD`3]X&0!<"F0EU/@_Y!!2I/^=",E$O6"Y#25]8/@PYY` +M!N^00-J`,)"74^"00/:`)Y"74^#_D$%*D_YT(R42]8+D-)7U@^##GD`&[Y!! +M$H`'D)=3X)!!+I.0EUKPD)=:X'7P!J0D4/ET0#7P=13_]16)%I"74N"00?*3 +M_].0EUG@GY"76."4`$`)Y/VO$A);I^&,Y1(EX"3A]8+D-)+U@^#U&J/@]1NK +M%*H5J182)&+_?@"K%ZH8J1D20I?]K/`2)'OO)1OU&^XU&O4:JQ2J%:D6D``! +M$D(@_WX`JQ>J&*D9D``"$D+"_:SP$B1[[R4;]1ON-1KU&JL4JA6I%I```A)" +M(/]^`*L7JABI&9``!!)"POVL\!(D>^\E&_4;[C4:]1JK%*H5J1:0``,20B#_ +M?@"K%ZH8J1F0``820L+]K/`2)'OO)1OU&^XU&O4:JQ2J%:D6D``$$D(@_WX` +MJQ>J&*D9D``($D+"_:SP$B1[[R4;]1ON-1KU&JL4JA6I%I``!1)"(/]^`)"7 +M5N#\H^#]$B1[T^4;G^4:GD`,Y1N?]1OE&I[U&H`%Y/4:]1OE$B7@).'U@N0T +MDO6#Y1KPH^4;\)"74N#Y)>`D9O6"Y#1!]8/#=`&3E1ODDY4:4`>O$A)=*^%@ +MZ27@))[U@N0T0?6#TW0!DY4;Y).5&E`"X6!]`:\2$ENGX6!T9"42]8+D-);U +M@^#\9`5@`L%JD),BX/^T`PN0EU/@PY090#V`+N^T`@N0EU/@PY010"Z`'Y"3 +M(N#_M`$+D)=3X,.4"D`;@`SO20E4/P=$,E +M$O6"Y#24]8/@]1QT(R42]8+D-)7U@^#_PY0P4`+!%Y"50^!D`6`"P1=T1"42 +M]8+D-)7U@^!D"F!1[R0%_^0S_G0A)1+U@N0TDO6#X/W3G^YD@/AT@)A0,NTD +M!?_D,_YT(R42]8+D-)7U@^#3G^YD@/AT@)A0%'2$)1+U@N0TEO6#X/^0EU/@ +M;V`]=",E$O6"Y#25]8/@_].40D`%=1P%@`[OTY0Y0`5U'`.``W4<`70A)1+U +M@N0TDO6#[_!T1"42]8+D-)6`*71D)1+U@N0TEO6#Y/!T1"42]8+D-)7U@^`$ +M\(`0Y/4<=&0E$O6"Y#26]8/D\)"74^#_=(0E$O6"Y#26]8/O\'1#)1+U@N0T +ME/6#Y1SP=?`)Y1*0DRL20U_@M`$0Y/4<=&0E$O6"Y#26]8/D\*TY"75.[PH^_P=$,E$O6"Y#24]8/@ +M]1SD]1.K%ZH8J1EU\`+E$Z3U@H7P@Q)"POVL\.43D$(.D_]^`!(D>^\E&_4; +M[C4:]1K#D)=5X)4;D)=4X)4:0`<%$^43M`6]Y1/#$_43Y1RT`0;E$W!&@!/E +M'+0#%>43<`5U'`.`.>43M`$%=1P!@"^`*N43U\!)"^JL7JABI&9```N3U\!)#&9`` +M!.3U\!)#&9``!N3U\!)#&9``".3U\!)#&>42)>`DP/6"Y#21]8/D\*/PY1(E +MX"1C]8+D-)3U@^3PH_#E$B7@)*/U@N0TE/6#Y/"C\`42Y1+#E"!0`P)A_"*0 +M!$1T$?"C=/#PHW0/\*/D\/UTI"WU@N0T!/6#Y/`-O1#PY/UU\`KMD)``$D-? +MY/"C\'7P"NV0D`(20U_D\*/P=?`*[9"0!!)#7^3PH_!U\`KMD)`&$D-?Y/"C +M\'7P"NV0D`@20U_D\*/P=(0M]8+D-);U@W03\'1$+?6"Y#25]8/D\'1#+?6" +MY#24]8/D\.TEX"3`]8+D-)'U@^3PH_#M)>`D8_6"Y#24]8/D\*/P[27@)./U +M@N0TE/6#Y/"C\.TEX"2C]8+D-)3U@^3PH_#M)>`D9/6"Y#25]8/D\*/P[27@ +M)*3U@N0TE?6#Y/"C\'1$+?6"Y#26]8/D\'0D+?6"Y#26]8/D\'1D+?6"Y#26 +M]8/D\)!!Q)/^=`&3_Y!!C'0!DR__Y),^PQ/^[Q/_[27@).'U@N0TDO6#[O"C +M[_!U\`GMD),J$D-?=`'P=?`)[9"3*1)#7W0!\'3!+?6"Y#22]8-T#/!U\`GM +MD),E$D-?=/_PH_!U\`GMD),C$D-?Y/"C=`_P=?`)[9"3)Q)#7W03\'7P">V0 +MDR@20U_D\'2$+?6"Y#0$]8-T$_`-[60@8`(!)B(2)&+U$L.4(%`5D``"$D(@ +M_W0C)1+U@N0TE?6#[_`BY1*T(`J0``(20B"0DR'P(I"73>!4\$0#\%0/1(#P +M>P!Z`'E8D)>H$D.+"WJ7>4W3$*\!P\#0D)>E$D.+D)>$X&0"8&Z0EX3@9`%P +M9I"7O^#_!/"0EZ420VN0``'O$D)??Z]^`5&+[V!)D)>E$D-KBV.*9(EE=68" +M>P%Z`7F@$D4)D)>H$D-KBV.*9(EED)>E$D-K$B1B_\14#_5F>P%Z`7FB$D4) +MD`&O=/_PD`'+X&2`\-#0DJ\BTQ"O`QY'7P`1)"@7\* +M?@`2,A6`Q7\!T-"2KR+3$*\!P\#0D``!$D(@D)>6\)```Q)"()"7B/`2)&)E +M)V`#$DINT-"2KR(2)&+U)B*0`@G@_1(D8OZO!>TND)=^\)```1)"(/_M+Y"7 +M?_"0``(20B#_[2^0EX#PD``#$D(@_^TOD)>!\)``!!)"(/^N!>TOD)>"\"+3 +M$*\!P\#0D)==$D.+D)==$D-KD``!$D+"^N7P)`#_Y#K^D)==$D-KD``![H_P +M$D,9$B1B_V`LM6<6D)==$D-KD``!$D+"96EP!.5H9?!@(Y"771)#:Y```1)" +MPO^N\''1@!"0EUT20VL2)&)E9V`#$D35T-"2KR*0EV#N\*/O\'5G`8YH]6GD +M_7\+D13D_7\"D121WN3_$D?=Y/5KD`')Y6OPD)=@X/RCX/WL^XU$Y/5%?0%_ +M8'X!`C!BTQ"O`#]=`%^`*@%"(`%PS/.,\[8^?^0`$3@^^3^[UNH!0B`!LZB +MYQ/.$]CX_X!$D)?!X"3X\.#_=`&H!PB``L,SV/P23]V0E\'@_70!?@"H!0B` +M!<,SSC/.V/G_D`!"X/OD_N];J`4(@`;.HN<3SA/8^/_0T)*O(I`&-'3_\.2C +M\*/PH_`BCA*/$XL4BA6)%N20EU+P[Y``,?`23^7E$E0#_Y``,N!4_$_P$D_E +MD``SX%1_\!)/Y9``,^`@YPZ0EU+@PY1D4`7@!/"`ZY"74N##E&10$)``,."K +M%*H5J1820DU_`2)_`"+D]6HBY)"7N?"C\)`%^.!P#Z/@<`NCX'`'H^!P`W\! +M(M.0E[K@E.B0E[G@E`-``W\`(G\R?@`2,A60E[GD=?`!$D*!@,:0`!'@1`GP +M$D_ED)<=$D-3D("6$B4(?WA^"!(K")"7(1)#4Y"`EA(E"'\$?@P2*PB0ER42 +M0U.0@)82)0A_`'X($BL(D)3]?P$2,"PB?WA^"!(B99"7'1(E"'\$ +M?@P2(F60ER$2)0A_`'X($B)ED)&X)"7';0!#1)#4^]4Q__M5,?] +M@`<20U/O5,?_[)"`EA(E"']X?@@2*PB0ER$20U/O5`__[)"`EA(E"'\$?@P2 +M*PB0ER420U/O1`+_[)"`EA(E"'\`?@@2*PA_<'X.$B)ED)&X+0!$9"`:!(E%`````#D +M_7\!$C`LD``1X%3V\`)/Y9"7AN"0ERWP(N]P`P)Q8Y"7+>!@`P)U+I"7&1)# +M4Y"`EA(E"'^,?@@2*PB0EL420U.0@)82)0A_1'X($BL(D);)$D-3D("6$B4( +M?UQ^"!(K")"6S1)#4Y"`EA(E"']L?@X2*PB0EM$20U.0@)82)0A_<'X.$BL( +MD);5$D-3D("6$B4(?W1^#A(K")"6V1)#4Y"`EA(E"']X?@X2*PB0EMT20U.0 +M@)82)0A_?'X.$BL(D);A$D-3D("6$B4(?X!^#A(K")"6Y1)#4Y"`EA(E"'^$ +M?@X2*PB0END20U.0@)82)0A_B'X.$BL(D);M$D-3D("6$B4(?XQ^#A(K")"6 +M\1)#4Y"`EA(E"'_0?@X2*PB0EO420U.0@)82)0A_U'X.$BL(D);Y$D-3D("6 +M$B4(?]A^#A(K")"6_1)#4Y"`EA(E"'_S$B4(D)>S$D-3[43`_>R0E[,2)0B0E[,20U.0@)82)0A_C'X($BL( +MD("6$B44``$``']$?@@2*PB0@)82)10`VR6D?UQ^"!(K")"`EA(E%"#;):1_ +M;'X.$BL(D("6$B44(-LEI']P?@X2*PB0@)82)10$&R6D?W1^#A(K")"`EA(E +M%`0;):1_>'X.$BL(D("6$B44!!LEI']\?@X2*PB0@)82)10$&R6D?X!^#A(K +M")"`EA(E%&/;):1_A'X.$BL(D("6$B44!!LEI'^(?@X2*PB0@)82)10@VR6D +M?XQ^#A(K")"`EA(E%"#;):1_T'X.$BL(D("6$B44(-LEI'_4?@X2*PB0@)82 +M)10@VR6D?]A^#A(K")"`EA(E%``;):1_W'X.$BL(D("6$B44`!LEI'_@?@X2 +M*PB0@)82)10DVR6D?^Q^#A(K"'\$?@P2(F60E[,2)0B0E[,20U/D_^R0E[,2 +M)0B0E[,20U/O1!'_[)"7LQ(E")"7LQ)#4Y"`EA(E"'\$?@P2*PA_!'X-$B)E +MD)>S$B4(D)>S$D-3[U3P_^R0E[,2)0B0E[,20U/O1`'_[)"7LQ(E")"7LQ)# +M4Y"`EA(E"'\$?@T2*PA_#'X)$B)ED)>S$B4(D)>S$D-3Y/_LD)>S$B4(D)>S +M$D-3[T01_^R0E[,2)0B0E[,20U.0@)82)0A_#'X)$BL(?PQ^"1(B99"7LQ(E +M")"7LQ)#4^U4#_WL5/#\D)>S$B4(D)>S$D-3[400_>Q$`?R0E[,2)0B0E[,2 +M0U.0@)82)0A_#'X)$BL(?P1^"!(B99"7LQ(E")"7LQ)#4^]4\/_LD)>S$B4( +MD)>S$D-3[T0!_^R0E[,2)0B0E[,20U.0@)82)0A_!'X($BL(Y)"7+?`BTQ"O +M`[[_#3E`=09>#_=`&H!PB``L,SV/ST_Y``1^!?\!)/Y9"7 +MN^#_=`&H!PB``L,SV/S_D`!&X$_P$D_ED)>\X&`6D)>[X/]T`:@'"(`"PS/8 +M_/^0`$6`:)"7N^#_=`&H!PB``L,SV/ST_Y``18!MD)>[X"3X\.#_=`&H!PB` +M`L,SV/S$5/`23]V0E[O@_W0!J`<(@`+#,]C\_Y``0^!/\!)/Y9"7O.!@&Y"7 +MN^#_=`&H!PB``L,SV/S$5/#_D`!"X$^`&I"7N^#_=`&H!PB``L,SV/S$5/#T +M_Y``0N!?\!)/Y=#0DJ\BBQ**$XD4D``"$D(@D)<[\.`PX$N0ES)T`?!_@'X( +M$B)ED)D`!'X%3S_7]'$D=2D`!(X%3S_7]($D=2D`!&X%3O_7]&$D=2 +MY)"7./`B[Q1@,A1@:B0"8`+AJ)"7.'0"\)``2.!$#/U_2!)'4I``1^!$"/U_ +M1Q)'4I``1>!$$/U_18!UY)"7./"0ES020U.0@)82)0A_@'X($BL(D`!%X$3O +M_7]%$D=2D`!%X%3O_7]%$D=2D`!&X$00_7]&@#J0ESAT`?"0ESX20U.0@)82 +M)0A_@'X($BL(D`!%X$0@_7]%$D=2D`!%X$00_7]%$D=2D`!&X$00_7]&$D=2 +M(I```A)"()"7//#@8`3@]'`AHJ_D,_42PJ^0`$?@5/O]?T<21U)]0'\!$C%F +MY1(D_Y*O(N3]?T421U*0!/WD\*/PD)<\\)"70O"0ET7PD)=#\)"71O"0ET3P +MD)='\)"7+@3PY*/PH_"C\)"7,_"0ESCPD)`$\(`DD)=#X,.4_U`& +MX`3PY(`1D)=$X,.4_U`,X`3PY)"70_"0ET+PD`!$X##C,I"71>##E/]0!>`$ +M\(`DD)=&X,.4_U`&X`3PY(`1D)='X,.4_U`,X`3PY)"71O"0ET7PD`3]X$0! +M\"*0``(20B"0ESKPD``!$D(@)>`EX)"7.?`2)&(EX"7@D)<]\)`%8."0ETCP +MD`5AX)"72?"0!6+@D)=*\)`%8^"0ETOPHJ_D,Y"77?#"KY"7.>#_$E*6D)== +MX"3_DJ^0ESK@<`)!')"7.>!P`D$`+9"7 +M.N!P+Y"73!)'2)``1N!4_OU_1A)'4I`%(N3PHJ\SD)==\,*O?2#D_Q(Q29"7 +M7>`D_Y*O(D98PH@"`$L````&%1,10CH!`#5H`0`````````````````"0[H` +M`````````````````````DOD```````````````````````````````````` +M`````````````````````````E\4``````"AWP````4$`P(``P8%!`,`!`8% +M!`(`!`@'!@0`!@H)"`8`"`H)"`0`"`H)"`(`"`H)"```"!(1$`@`$!H9&!`` +M&"(A(!@`("(A(!``("(A(`@`("(A'`@`("(A%`@`("(@&`@`(#$P(!``,#$P +M&```,#$O$!``,#$L$!``,#$H$```,#$@$```,#$0$```,`0$!`4$!`0%!04& +M!@0$!`4%!08&!`0%!04%!@8$!`4%!04&!PH+#1`$!04&!@D,$0@("0D*#!`1 +M!`0$!00$!0<'!P@*!`0$!`8*"PT%!0<'"`L-#P0$!`4'!PD)#`X0$@0$!04& +M"A$3"0D)"0P.$1,````````````D)BH8&AT?(2`"@`,@!0`&0`>`",`$L`4`!X`+0`^@$ +ML`9`!]```@`"``0`"``,`!(`&``D`#``2`!@`&P`*``\`%``9`"@`,@`\`$8 +M`&0`H`#P`6@!]`)8`R`#Z`("`@("`@,#!`0%!P0$!PH*#`P2!0<'"`L2)#P! +M`0$!`0(#!`4&!P@!`@,$!08'"`4&!P@)"@L,(!X<&!`8```````````````` +MNP$,Y8(I]8+E@SKU@^`B4`;I)8+XYB*[_@;I)8+XXB+E@BGU@N6#.O6#Y),B +MNP$&B8**@_`B4`+W(KO^`?,B^+L!#>6"*?6"Y8,Z]8/H\")0!NDE@LCV(KO^ +M!>DE@LCR(L7P^*/@*/#%\/CE@A6"<`(5@^`X\"*[`0J)@HJ#X/7PH^`B4`:' +M\`GG&2*[_@?C]?`)XQDBB8**@^23]?!T`9,BNP$0Y8(I]8+E@SKU@^#U\*/@ +M(E`)Z26"^(;P".8BN_X*Z26"^.+U\`CB(N6#*O6#Z9/U\*/IDR*[`0J)@HJ# +M\.7PH_`B4`;W":?P&2*[_@;SY?`)\QDB^+L!$>6"*?6"Y8,Z]8/H\.7PH_`B +M4`GI)8+(]@BF\"*[_@GI)8+(\N7P"/(B[TO_[DK^[4G][$C\(N#\H^#]H^#^ +MH^#_(J0E@O6"Y?`U@_6#(N#[H^#ZH^#Y(OC@^Z.CX/DE\/#E@A6"<`(5@^#Z +M./`BZ_"CZO"CZ?`BT(/0@OCDDW`2=`&3<`VCHY/X=`&3]8*(@^1S=`*3:&#O +MHZ.C@-\"0_@"4&_DDZ/XY).C0`/V@`'R"-_T@"GDDZ/X5`1^`9-@O*/_5#\PY0E4'_[DDZ-@ +M`0[/5,`EX&"H0+CDDZ/ZY).C^.23H\C%@LC*Q8/*\*/(Q8+(RL6#RM_IWN>` +MODB7=@``````````2)=M``````````!!EW4`09>]`$&7AX!!E[\``/"C=`/P +MY/O]?U1^`=,0KP'#P-"0EYSK\*/@^Z/@]43D]442-:O0T)*O(I`!7^3PD`$\ +M=`CPY)"7G?"C=!3PY/O]?UQ^`9%PD`%?=`7PD`:2=`+PD)>1%/"0EY/@5`_# +ME`Q0`Q)(VR*/@HZ#HZ.CY/`BY/5G?V!^`8#MD)>5X/]]`0)(W[&QOP$/D)=_ +MX/_D_?']D`0?="#P(B(B(B(```)?I@)?K=,0KP'#P-"+8(IAB6*0EY]QBZMC +MJF2I99"7HG&+KV859N]@&Y"7HN1U\`%Q=!(IV?^0EY_D=?`!<73O44V`WJM@ +MJF&I8M#0DJ\BD`:IX/4+5,!P#9"7F.!4_O#@5/WPD=[E"S#F%Y"7F.!$`?"0 +MEY;@9`)@!)'H@`N1CH`'D)>8X%3^\.4+D)>8,.<7X$0"\.20EYV19)`!5W0% +M\)"7EW0!\"+@5/WP(M,0KP'#P-"0!!W@8!J0!2+@5)!@!Y`!QN!$0/"0`3PD=[E-##D +M")`!/'00\/$$Y30PY0F0`3QT(/`24NCE-3#@$)`!/70!\)``@^"0EY7PD=YT +MWP20`<3P=$6C\-`'T`;0!=`$T`/0`M`!T`#0T-""T(/0\-#@,N5G9`%P/1)L +MWK\!!'\!\=V0`$;@1`3]?T;Q4I``1.!4^_U_1/%2D`!&X%3[_7]&\5)_`A)L +M^H]KD`')Y6OPM`$"\;\B\)``1>!4_OU_1=,0KP'#P-"/@G6#`.WP$D_ET-"2 +MKR*0`3QT__"C\*/PD`$T\*/PH_"C\/U_5/%2??]_5?%2??]_5O%2??]_5X"_ +MD`$PY/"C\*/PH_"0`3CPH_"C\*/P_7]0\5+D_7]1\5+D_7]2\5+D_7]3@).0 +M`$G@D)?`\.!4#_!$\/U_2?%2D)?`X$2P_7])X5*0`# +M\)``@.!$@/U_@.%2X/]]`9"7J^_PH^WPY*/PH_#E)V`$Y/\1CI"7J^`PX`F0 +MEZWD\*-T@/"0EZO@_\,3D/T0\)`$)>_PD)>LX&`?HZ/@_R0/]8+D-/SU@^!$ +M@/!T$"_U@N0T_/6#X$2`\)"7K:/@__TD"/6"Y#3\]8/D\'0)+?6"Y#3\]8/@ +M5/#P="$O]8+D-/SU@^!4]_"0EZW@_J/@_R+O8`N0EX;@M`$0Y/^`"9"7AN"T +M`05_`1)OF")]`G\#$C9UY2<4)/U0`H`AD)>6X&`&?0%_#(`/D)>3X%0/PY0$ +M4`9]`7\$$=_D_Q&.(GT!?PR/)(TEY214#_^0EY/@5`]O8'#E)##B+9"7D^`@ +MX@1_`7$/D)>3X##C">4D(.,$,96`4)"7D^`@XTGE)##C1*\E<2Z`/I"7D^!4 +M#_^_#`SE)"#C!W&&[V`J,960EY/@5`__OP0,Y20@X@?Q]>]@%#&QD)>3X%0/ +M_[\""!)@`^]@`E'UD)>3X%0/_Y"7E>!4#V]P(^`PYA^0EY/@5`__D)>'X/Y/ +MD`$O\.YD@)"7A_"0EY7@5+_P(I`&!.!$0/#E)K0!!'\!<4V0EY/@5/#PX$0$ +M\"*0`3=T`O"0!2)T__`2;@_O<`:0`.X*/@D`58\.4F,.`:D)>+X'`9X`3PD)>3X%0/PY0$4`M] +M`7\$`=_DD)>+\"*+$HH3B13QSZL2JA.I%!(IV?4G%&`.%&`>%&`O)`-P0'\! +M@#JK$JH3J120``(20B#]Y/]1SX`GJQ*J$ZD4D``"$D(@_7\!4<\?@!.K$JH3 +MJ120``(20B#]?P)1S^3_,>V0EY1P!70%\(`" +M[?"0EY3@D)>)\"*0EY/@5/#PX$0!\!)$_1)$_N!4\/#@1`+P(I"7ON_P$FY0 +MD)>^X&`%D`4BY/"0EY/@5/#PX$0$\"*0!@3@5+_P[V`)Y2:T`03D_W%-D)>3 +MX%3P\.!$#/`BCVT21;'O9`%P+I"7@!)'^>5M8!!T(2_U@N0T_/6#X$00\(`. +M="$O]8+D-/SU@^!4[_"0!!]T(/`B<=7O9`%@"9`!N.!$`?"`-9"7DN!@"9`! +MN.!$`O"`)I"7D>!@"9`!N.!$!/"`%Y"7E>!4#].4!$`)D`&XX$0(\(`#?P$B +MD`&[X$0(\'\`(I`$&^!4?V1_?P%@`G\`(L#@P/#`@\""P-!UT`#``,`!P`+` +M`\`$P`7`!L`'D`'$=.3P=$NC\)`!-.!5*/4LD`$VX%4J]2ZCX%4K]2_E+"#@ +M`J%]D`$T=`'PA=%-A=).A=-/A=10A=51A=92A==3A=E4Y5140,,3_^535"!O +M<`*A-.54,.4"H33E4E0?]0CE350_]0GE450?_^4()>`DX_6"Y#24]8/DC_`2 +M0H'E4U0?_^4()>`DP/6"Y#21]8/DC_`20H'E"=.4!$`#=0D$=?`*Y0B0D``2 +M0U]U\`+E"1)#7^#^H^#_Y5-4'R__Y#[^=?`*Y0B0D``20U]U\`+E"1)#7^[P +MH^_PY50@YB3E4U0?_^4()>`D8_6"Y#24]8/DC_`20H'E3S#G-J\($EL^@"_E +M4U0?_^4()>`DH_6"Y#24]8/DC_`20H'E3S#G$N5/5'_]Y5-4'_4.JPFO"!): +MZ^4G%"3]4`*`0)"7EN!@,I`!6^3PD`$\=`3P<=7O9`%P*'5$%/5%^_U_6'X! +M$C6KD`%;=`7PD`:2=`'PD)>2\(`(<=6_`0,21-[E+##A(9`!-'0"\(716(72 +M68736H746X757(7678777H797Q)IY.4L,.,&D`$T=`CPY2PPY`F0`31T$/!# +M5Q#E+##E)9`!S^`PY1[@5-_PD`$T="#P=:@`=>@`$D>3D``#X%3[\/'E@/[E +M+##F!I`!-'1`\.4N,.$[D`$V=`+P0U=`D`$"X%0#9`%P*)`!-^`PX`IT`?"0 +MEW7D\(`7D)=UX`3PX,.4"D`+Y/"0!!G@,.`"\9KE+C#@$I"7A70!\)`!-O`2 +M80:0EX7D\.4N,.)RD`$V=`3PY29D`7!FY2=@8N4G9`)@!N4G9`5P)Y`&J^"0 +MEXGPD`:JX)"7E/"0EXG@<`>0EY3@_X`%D)>)X/^0EXGO\)"7B^!@`^`4\)"7 +MBN3PD`%7\)`!/'0"\)"7F.!4_?#@5._PY2<4)/U0`H`#$D53Y2XPXRB0`39T +M"/#E)F0!6X&0"8`421.B``Q)$CN4N,.8>D`$V=$#P +MY2:T`1/E)V`/D)>8X%3^\.!4!W`#$D3>Y2\PX0B0`3=T`O`1J73D!)`!Q/!T +M2Z/PT`?0!M`%T`30`]`"T`'0`-#0T(+0@]#PT.`R$D6QOP$0D`()X/]]`1)' +M_9`$'W0@\")U*#/D]2EU*@/U*Y`!,.4H\*/E*?"CY2KPH^4K\"+DD)>7\)"7 +MBO"0EYCP(O3_D`!#X%_PTQ"O`!$`O"`-Y"7E>!4#].4`D`)D`&YX$0$\(`CD)>8X##B +M"9`!N>!$"/"`$Y"7F.`PY`F0`;G@1!#P@`-_`2*0`;O@1`3P?P`B=3`?=3$! +MY/4RD`$XY3#PH^4Q\*/E,O`BY)"73_"C\'6.`A)'Z9```N!4X)"7A&`%=`'P +M@`-T`O"0`//@,.,(D)>&=`'P@`7DD)>&\)"7AN"T`1.0`/+@,.<,D)=K=/WP +MHW0S\(`*D)=K=/WPHW0O\.3U5Q)H`A)OCQ)?M!(R/1)N"Q)/L>20EX7PD`#S +MX##B#9`%0700\)`%6O"CY/"0`61TH/`15Q)$_Q)WR9"74>79\!)':,*OD`"` +MX$1`\!)/Y77H`T.HA=*OD)=/X&0!\"1OD`'$\'10H_#E5S#D"<*O4U?OTJ]Q +MGN57,.86PJ]35[_2KQ)A^9"7/.#_8`.T`0(QE)"7/.!P`Q)X)S%G@+F0!C3@ +M8"8435_^7X!$FVIOP$)D`8UX%0/\(`%@``";9ODD`8T\"*0ES/@ +MPY044`7@!/!!3)"7,^!D%&`"04R0ET+@<"60ET7@0!/W@5/[PD)="X)`$1/"0ET/@D`1%\)"71."0!$;PH^3P +MD)=%X)`$2/"0ET;@D`1)\)"71^"0!$KPH^3PD)#^TY]0 +M"Y"72^##GM.4`4`0D)"0ETGP +MD`5BX)"72O"0!6/@D)=+\,-T_Y_^D)=)X-.>0![@+_"CX+3_#^3PH^"T_P/D +M\"*0ETN``Y"72N`$\"*0ETG@+_`BD)#_49:0 +METQT`1)'2(!`D)=,X&0!<#B0ESW@_U&6Y)"73/"0`$7@1`']?T421U*0ES+@ +M8!60ES020U.0@(42*G]_@'X($B_9@`60!2+D\)`%A^!D@/"0ETC@D`6$\)"7 +M2>"0!87PD)=*X)`%AO"0ETO@D`6'\"*0`] +MX/]T`7X`J`<(@`7#,\XSSMCY_^]=<`*!V)"7O>!U\`20`=`20U_@D)=3\'5C +M`75DEW5E4W5F`7L!>I=Y5!)%"9"75.#_Q!,3$U0!D)>],.!9X'7P`I``B!)# +M7^"0EU7PD)>]X'7P`I``B1)#7^"0EU;PD)>]X'7P!)`!T1)#7^"0EU?PD)>] +MX'7P!)`!TA)#7^"0EUCPD)>]X'7P!)`!TQ)#7^"0EUGP@#/@=?`$D`'1$D-? +MX)"75?"0E[W@=?`$D`'2$D-?X)"75O"0E[W@=?`$D`'3$D-?X)"75_#O5'__ +M>P%ZEWE5D>"0EU+@_Y"7O>#^=`&H!@B``L,SV/ST7Y"74O"0E[W@_W0!J`<( +M@`+#,]C\D`',\)"7O>`$\.!4`_!AJ)`!QN!$`O`BD)=:$D.+[Q)#E%4,`545 +M`E4>`U4G!54P!E5C!U4X"55!#%5*#553#@``55R0EUH20VL":N&0EUH20VL" +M:PN0EUH20VL":Q&0EUH20VL":;60EUH20VN`+)"76A)#:P)K69"76A)#:P)X +M_Y"76A)#:P)WEI"76A)#:P)V#Y`!QN!$`?`BD``$$D(@_U0?_N]4(,035`?] +MKP:0EUWO\*/M\*,20XN0EU\20VN0``,20B!4\,14#Y"78O"0``020B!40,03 +M$U0#D)=C\)"77>#_=?`)D),E$D-?K8*L@Y"79.SPH^WP[W7P":0D(_ETDS7P +M^GL!HQ)#BY"77Q)#:Y```Q)"(%0/_Y"79A)#:^\20DV0EU\20VN0``(20B#_ +MD)=F$D-KD``![Q)"7Y"77Q)#:Y```1)"(/^0EV3@_*/@_?6"C(/O\!(IV8V" +MC(.C\)"78N#^D)==X/\DP?6"Y#22]8/N\)"77N#^=?`)[Y"3*1)#7^[P=?`) +M[Y"3*A)#7W0!\)"78^#^=?`)[Y"3*Q)#7^[PCQ+O)>`DY/6"Y#25KX+U%(\5 +MY1)U\`*D)('Y=)(U\'46`?47B1AU\`GE$I"3)1)#7Z^"A8,9CQKE$G7P":0D +M(_ETDS7P=1L!]1R)'73!)1+U@N0TDO6#X!)#E%;R`%<'`5<<`E%!E>L#%?:#5@'#E@T#P``6&CE$B7@).3U@N0TE?6#=/#PHW05@#SE$B7@ +M).3U@N0TE?6#=/#PHW00@"?E$B7@).3U@N0TE?6#=/#PHW0%@!+E$B7@).3U +M@N0TE?6#=/#PH^3PY1(EX"2!]8+D-)+U@W0/\*-TC_`"6&CE$B7@).3U@N0T +ME?6#=`_PHW3U@"?E$B7@).3U@N0TE?6#=`_PHW3P@!+E$B7@).3U@N0TE?6# +MY/"C=`WPY1(EX"2!]8+D-)+U@^3PH_`"6&B0!$?@JQ:J%ZD8$D)-D`1&X*L6 +MJA>I&)```1)"7Y`$1>"%%8*%%(/PD`1$`EA?D`1+X*L6JA>I&!)"39`$2N"K +M%JH7J1B0``$20E^0!$G@A16"A12#\)`$2(!8D`1/X*L6JA>I&!)"39`$3N"K +M%JH7J1B0``$20E^0!$W@A16"A12#\)`$3(`KD`13X*L6JA>I&!)"39`$4N"K +M%JH7J1B0``$20E^0!%'@A16"A12#\)`$4."%%8*%%(.C\*L6JA>I&,`#P`+` +M`1(IV?^K&ZH0U%_K``\`"P`$2*=G_ +MJQNJ'*D=D``!$D(@7]`!T`+0`Q)"3845@H44@\"#P(+@_X4:@H49@^#^[U[0 +M@M"#\(45@H44@Z/`@\""X/^%&H*%&8.CX/[O7M""T(/PY1(EX"2!]8+D-)+U +M@^#^H^!.8#MU$PMT`7X`J!,(@`7#,\XSSMCY_^42)>`D@?6"Y#22]8/@7OZC +MX%].8`;E$R00@%T5$^43PY0`4,J`5N42)>`DY/6"Y#25]8/@_J/@3F`]=1,/ +M=`%^`*@3"(`%PS/.,\[8^?_E$B7@).3U@N0TE?6#X%[^H^!?3F`(D)=IY1/P +M@!`5$^43PY0`4,B`!>20EVGPY1(EX"3D]8+D-)7U@^#^H^!.8#OD]1-T`7X` +MJ!,(@`7#,\XSSMCY_^42)>`DY/6"Y#25]8/@7OZCX%].8`B0EVKE$_"`6P43 +MY1.T$,J`4N42)>`D@?6"Y#22]8/@_J/@3F`YY/43=`%^`*@3"(`%PS/.,\[8 +M^?_E$B7@)('U@N0TDO6#X%[^H^!?3F`&Y1,D$(`*!1/E$[0,S(`%Y)"7:O"0 +MEVG@_W7P">42D),G$D-?[_"0EVK@_G7P">42D),H$D-?[O!TA"42]8+D-`3U +M@^#3GT`%D)=I4<)TA"42]8+D-`3U@^#_D)=JX/[OPYY0`E'"D)=IX/_3E!-` +M")"3(G0#\(`A[].4"T`(D),B=`+P@!/OTY0#0`B0DR)T`?"`!>20DR+PD),B +MX)`$L?`BX/UTA"42]8+D-);U@^WPKQ+3$*\!P\#0=(0O]8+D-`3U@^WPT-"2 +MKR+M5!_U$'0!+_6"Y#22]8/@]0^0!/W@M`$%=1$#@`-U$0'KPY410`*`*N4/ +M)0[^Y1"00=:3_.[3G'0!0`PO]8+D-)+U@^3P@*`O]8+D-)+U@^[P(JP'=?`) +M[)"3)Q)#7^#_=*4L]8+D-);U@^!4'_O3GT`"JP?K)>`DGO6"Y#1!]8/DD_YT +M`9/_ZR7@)&;U@N0T0?6#=`&3+__DDS[#$_[O$__L)>`DX?6"Y#22]8/N\*/O +M\*\$K0-1TZ\#(JH'KP5TA"KU@N0T!/6#X%1_^U0?^9"77O!U\`GJD),H$D-? +MX)"78/!U\`GJD),G$D-?X/Z0EV'PZB7@).3U@N0TE?6#X/VCX)"78LWPH^WP +MZB7@)('U@N0TDO6#X/VCX)"79,WPH^WPZ=.>0`F0EV'@D)=>\/OO<`*!Y)"7 +M7^_PZS#F"9"77N#[H^`4\)"77^!P`H'DD)=>X/_3E`!0`H'DY)"77?#O%)"7 +M7/"0EV#@^9"77.#_TYE`:N^4$$`A[R3P_W0!?@"H!PB`!<,SSC/.V/G_D)=D +MX%[^H^!?3G`GD)=##GU`, +MD)=V0DR<20U_@_Y"77/#M)>`D@?6"Y#22]8/@^Z/@ +MD)==R_"CZ_#M)>`DY/6"Y#25]8/@^Z/@D)=?R_"CZ_#L)>`D9O6"Y#1!]8/D +MD_IT`9/[[27@).'U@N0TDO6#ZO"CZ_#LPY]``L$M=*4M]8+D-);U@^SP!/N0 +MEUS@_^O3GT`"P5[KPY000"'K)/#_=`%^`*@'"(`%PS/.,\[8^?^0EUW@7OZC +MX%].<"/KPY004#ET`7X`J`,(@`7#,\XSSMCY_Y"77^!>_J/@7TY@'.MD$V`( +MZV028`.[$0F0EUW@,.`">QBL`XP=@#0+@(N0EUS@^VQP:72E+?6"Y#26]8/L +M\'7P">V0DRD20U_@M`$,Y1T@Y@?L1$#U'8`#KQTB["7@))[U@N0T0?6#Y)/^ +M=`&3_^PEX"1F]8+D-$'U@W0!DR__Y),^PQ/^[Q/_[27@).'U@N0TDO6#[O"C +M[_"`6^S3FT!6D)=4=1(#]4=/E'42`_R+`X,#PP(/`@L#0==`` +MP`#``<`"P`/`!,`%P`;`!Y`!Q'04\'1?H_!3D>^0`%'@_Y``5>!?]3WE/3#F +M&'1`\)"7.^!4`_^_`PN0ESC@8`5_`1)VY^4],.<5D`!5=(#PD)<[X%0#_[\# +M!7\"$G;GD`'$=!3P=%^C\-`'T`;0!=`$T`/0`M`!T`#0T-""T(/0\-#@,H\> +MC!^-("*/(8PBC2,BY/4FD)>8\/4GD)>5=`SPD)>3\.20EY;PD)>2\)"7D?"0 +MEY0$\)"7B?#DD)>7\)"7B_"0EY!T!_#DD)>*\)"7CO"C=`+PY)"7C?"0EXCP +M(N578`F0`;K@1`'P@%N0EY7@5`_3E`%`"9`!NN!$`O"`1Y`"A^!@"9`!NN!$ +M!/"`.)"7A."T`A"0EVO@_J/@]8*.@^!@$8`AD`&OX&`)D`&ZX$0(\(`2D)>- +MX'`)D`&ZX$00\(`#?P$BD`&[X$0"\'\`(H]LY)"7M_"C\)`!">!_`##G`G\! +M[V5L8#[#D)>XX)2(D)>WX)030`B0`<;@1(#P(I"7M^1U\`$20H%_%'X`$C=4 +MTY"7N."4,I"7M^"4`$"YD`''X##@LB*/;A)%L>]D`7`ND)>!$D?YY6Y@$'0A +M+_6"Y#3\]8/@1!#P@`YT(2_U@N0T_/6#X%3O\)`$'W0@\"+DD)=-\.4G8&[E +M)F0!<&CE)Q1@*23]8"4D`B3[4`*`(Y"7B>`4\.!@!*/@8!:0EXG@<`J0EY3@ +MD)>)\(``D)=-=`'PD)=-X&`ND)>8X$00\.20EYWPD)>0X)"7GA)$:)`!5W0% +M\)"7D^!4#\.4!%`'?0%_!!)(WR*0EY?@8`[D\*/@5/WPX%0'<"B`(Y"7BN`$ +M\)"7F.!4[_"0EXK@TY0!0`WE)K0!"Z/@<`?@!/`B$D3>(N_#E"!0.>\PX!?M +MQ%3P_>_#$_XDI/6"Y#0$]8/@5`^`$._#$_XDI/6"Y#0$]8/@5/#P=*0N]8+D +M-`3U@^!-\"+D]1)U\`GE$I"3*A)#7^!D`6`"X?7E$B7@),#U@N0TD?6#X/ZC +MX-.4`.Z4`%`"X?7E$G7P"J0D`/ETD#7P=142)>`DP/6"Y#21]8/@ +M_Z/@D)=6S_"C[_#E$B7@)&/U@N0TE/6#X/^CX)"76,_PH^_P=(0E$O6"Y#0$ +M]8/@5#^0EU+PX/Y4'Z/P=?`)Y1*0DR<20U_@D)=;\'1D)1+U@N0TEO6#X,.4 +M!4`"@<^0EUO@_Y"74^"?0!.0EUO@D)=3\.Y40/Z0EU+P[T[PD`3]X&0!<"F0 +MEU/@_Y!!2I/^=",E$O6"Y#25]8/@PYY`!N^00-J`,)"74^"00/:`)Y"74^#_ +MD$%*D_YT(R42]8+D-)7U@^##GD`&[Y!!$H`'D)=3X)!!+I.0EUKPD)=:X'7P +M!J0D4/ET0#7P=13_]16)%I"74N"00?*3_].0EUG@GY"76."4`$`)Y/VO$A); +MI^&,Y1(EX"3A]8+D-)+U@^#U&J/@]1NK%*H5J182*=G_?@"K%ZH8J1D20I?] +MK/`2*?+O)1OU&^XU&O4:JQ2J%:D6D``!$D(@_WX`JQ>J&*D9D``"$D+"_:SP +M$BGR[R4;]1ON-1KU&JL4JA6I%I```A)"(/]^`*L7JABI&9``!!)"POVL\!(I +M\N\E&_4;[C4:]1JK%*H5J1:0``,20B#_?@"K%ZH8J1F0``820L+]K/`2*?+O +M)1OU&^XU&O4:JQ2J%:D6D``$$D(@_WX`JQ>J&*D9D``($D+"_:SP$BGR[R4; +M]1ON-1KU&JL4JA6I%I``!1)"(/]^`)"75N#\H^#]$BGRT^4;G^4:GD`,Y1N? +M]1OE&I[U&H`%Y/4:]1OE$B7@).'U@N0TDO6#Y1KPH^4;\)"74N#Y)>`D9O6" +MY#1!]8/#=`&3E1ODDY4:4`>O$A)=*^%@Z27@))[U@N0T0?6#TW0!DY4;Y).5 +M&E`"X6!]`:\2$ENGX6!T9"42]8+D-);U@^#\9`5@`L%JD),BX/^T`PN0EU/@ +MPY090#V`+N^T`@N0EU/@PY010"Z`'Y"3(N#_M`$+D)=3X,.4"D`;@`SO20E4/P=$,E$O6"Y#24]8/@]1QT(R42]8+D-)7U +M@^#_PY0P4`+!%Y"50^!D`6`"P1=T1"42]8+D-)7U@^!D"F!1[R0%_^0S_G0A +M)1+U@N0TDO6#X/W3G^YD@/AT@)A0,NTD!?_D,_YT(R42]8+D-)7U@^#3G^YD +M@/AT@)A0%'2$)1+U@N0TEO6#X/^0EU/@;V`]=",E$O6"Y#25]8/@_].40D`% +M=1P%@`[OTY0Y0`5U'`.``W4<`70A)1+U@N0TDO6#[_!T1"42]8+D-)6`*71D +M)1+U@N0TEO6#Y/!T1"42]8+D-)7U@^`$\(`0Y/4<=&0E$O6"Y#26]8/D\)"7 +M4^#_=(0E$O6"Y#26]8/O\'1#)1+U@N0TE/6#Y1SP=?`)Y1*0DRL20U_@M`$0 +MY/4<=&0E$O6"Y#26]8/D\*T43<`5U'`.`.>43M`$%=1P! +M@"^`*N43U\!)"^JL7JABI&9```N3U\!)#&9``!.3U\!)#&9``!N3U\!)#&9``".3U +M\!)#&>42)>`DP/6"Y#21]8/D\*/PY1(EX"1C]8+D-)3U@^3PH_#E$B7@)*/U +M@N0TE/6#Y/"C\`42Y1+#E"!0`P)A_"*0!$1T$?"C=/#PHW0/\*/D\/UTI"WU +M@N0T!/6#Y/`-O1#PY/UU\`KMD)``$D-?Y/"C\'7P"NV0D`(20U_D\*/P=?`* +M[9"0!!)#7^3PH_!U\`KMD)`&$D-?Y/"C\'7P"NV0D`@20U_D\*/P=(0M]8+D +M-);U@W03\'1$+?6"Y#25]8/D\'1#+?6"Y#24]8/D\.TEX"3`]8+D-)'U@^3P +MH_#M)>`D8_6"Y#24]8/D\*/P[27@)./U@N0TE/6#Y/"C\.TEX"2C]8+D-)3U +M@^3PH_#M)>`D9/6"Y#25]8/D\*/P[27@)*3U@N0TE?6#Y/"C\'1$+?6"Y#26 +M]8/D\'0D+?6"Y#26]8/D\'1D+?6"Y#26]8/D\)!!Q)/^=`&3_Y!!C'0!DR__ +MY),^PQ/^[Q/_[27@).'U@N0TDO6#[O"C[_!U\`GMD),J$D-?=`'P=?`)[9"3 +M*1)#7W0!\'3!+?6"Y#22]8-T#/!U\`GMD),E$D-?=/_PH_!U\`GMD),C$D-? +MY/"C=`_P=?`)[9"3)Q)#7W03\'7P">V0DR@20U_D\'2$+?6"Y#0$]8-T$_`- +M[60@8`(!)B(2*=GU$L.4(%`5D``"$D(@_W0C)1+U@N0TE?6#[_`BY1*T(`J0 +M``(20B"0DR'P(I"73>!4\$0#\%0/1(#P>P!Z`'E8D)>H$D.+"WJ7>4W3$*\! +MP\#0D)>E$D.+D)>$X&0"8&Z0EX3@9`%P9I"7O^#_!/"0EZ420VN0``'O$D)? +M?Z]^`5&+[V!)D)>E$D-KBV.*9(EE=68">P%Z`7F@$D4)D)>H$D-KBV.*9(EE +MD)>E$D-K$BG9_\14#_5F>P%Z`7FB$D4)D`&O=/_PD`'+X&2`\-#0DJ\BTQ"O +M`QY'7P`1)"@7\*?@`2-U2`Q7\!T-"2KR+3$*\!P\#0 +MD``!$D(@D)>6\)```Q)"()"7B/`2*=EE)V`#$DINT-"2KR(2*=GU)B*0`@G@ +M_1(IV?ZO!>TND)=^\)```1)"(/_M+Y"7?_"0``(20B#_[2^0EX#PD``#$D(@ +M_^TOD)>!\)``!!)"(/^N!>TOD)>"\"+3$*\!P\#0D)==$D.+D)==$D-KD``! +M$D+"^N7P)`#_Y#K^D)==$D-KD``![H_P$D,9$BG9_V`LM6<6D)==$D-KD``! +M$D+"96EP!.5H9?!@(Y"771)#:Y```1)"PO^N\''1@!"0EUT20VL2*=EE9V`# +M$D35T-"2KR*0EV#N\*/O\'5G`8YH]6GD_7\+D13D_7\"D121WN3_$D?=Y/5K +MD`')Y6OPD)=@X/RCX/WL^XU$Y/5%?0%_8'X!`C6KTQ"O`#]=`%^`*@%"(`% +MPS/.,\[8^?^0`$3@^^3^[UNH!0B`!LZBYQ/.$]CX_X!$D)?!X"3X\.#_=`&H +M!PB``L,SV/P23]V0E\'@_70!?@"H!0B`!<,SSC/.V/G_D`!"X/OD_N];J`4( +M@`;.HN<3SA/8^/_0T)*O(I`&-'3_\.2C\*/PH_`BCA*/$XL4BA6)%N20EU+P +M[Y``,?`23^7E$E0#_Y``,N!4_$_P$D_ED``SX%1_\!)/Y9``,^`@YPZ0EU+@ +MPY1D4`7@!/"`ZY"74N##E&10$)``,."K%*H5J1820DU_`2)_`"+D]6HBY)"7 +MN?"C\)`%^.!P#Z/@<`NCX'`'H^!P`W\!(M.0E[K@E.B0E[G@E`-``W\`(G\R +M?@`2-U20E[GD=?`!$D*!@,:0EQT20U.0@(42*G]_>'X($B_9D)3]_Q(T@9"7AN"T`1&0@%D2*HL``RV5Y/U_`1(T@2)_ +M>'X($B?>D)<=$BI_?P1^#!(GWI"7(1(J?W\`?@@2)]Z0ER42*G^0EX;@D)<= +MM`$-$D-3[U3'_^U4Q_V`!Q)#4^]4Q__LD("%$BI_?WA^"!(OV9"7(1)#4^]4 +M#__LD("%$BI_?P1^#!(OV9"7)1)#4^]$`O_LD("%$BI_?P!^"!(OV7]P?@X2 +M)]Z0ERD2*G^0@(42*HL`&R6@?W!^#A(OV9"`61(JBP````#D_?\2-(&0EX;@ +MM`$1D(!9$BJ+`````.3]?P$2-($BD)>&X)"7+?`B[W`#`G%0D)D);)$BI_?VQ^#A(GWI"6S1(J?W]P?@X2)]Z0 +MEM$2*G]_='X.$B?>D);5$BI_?WA^#A(GWI"6V1(J?W]\?@X2)]Z0EMT2*G]_ +M@'X.$B?>D);A$BI_?X1^#A(GWI"6Y1(J?W^(?@X2)]Z0END2*G]_C'X.$B?> +MD);M$BI_?]!^#A(GWI"6\1(J?W_4?@X2)]Z0EO42*G]_V'X.$B?>D);Y$BI_ +M?]Q^#A(GWI"6_1(J?W_@?@X2)]Z0EP$2*G]_['X.$B?>D)<%$BI_?P1^#!(G +MWI"7"1(J?W\$?@T2)]Z0EPT2*G]_#'X)$B?>D)<1$BI_?P1^"!(GWI"7%1(J +M?W^,?@@2)]Z0E[,2*G^0E[,20U/M1,#][)"7LQ(J?Y"7LQ)#4Y"`A1(J?W^, +M?@@2+]F0@(42*HL``0``?T1^"!(OV9"`A1(JBP#;):1_7'X($B_9D("%$BJ+ +M(-LEI']L?@X2+]F0@(42*HL@VR6D?W!^#A(OV9"`A1(JBP0;):1_='X.$B_9 +MD("%$BJ+!!LEI']X?@X2+]F0@(42*HL$&R6D?WQ^#A(OV9"`A1(JBP0;):1_ +M@'X.$B_9D("%$BJ+8]LEI'^$?@X2+]F0@(42*HL$&R6D?XA^#A(OV9"`A1(J +MBR#;):1_C'X.$B_9D("%$BJ+(-LEI'_0?@X2+]F0@(42*HL@VR6D?]1^#A(O +MV9"`A1(JBR#;):1_V'X.$B_9D("%$BJ+`!LEI'_S$BI_D)>S$D-3D("%$BI_?P1^#!(OV7\$ +M?@T2)]Z0E[,2*G^0E[,20U/O5/#_[)"7LQ(J?Y"7LQ)#4^]$`?_LD)>S$BI_ +MD)>S$D-3D("%$BI_?P1^#1(OV7\,?@D2)]Z0E[,2*G^0E[,20U/D_^R0E[,2 +M*G^0E[,20U/O1!'_[)"7LQ(J?Y"7LQ)#4Y"`A1(J?W\,?@D2+]E_#'X)$B?> +MD)>S$BI_D)>S$D-3[50/_>Q4\/R0E[,2*G^0E[,20U/M1!#][$0!_)"7LQ(J +M?Y"7LQ)#4Y"`A1(J?W\,?@D2+]E_!'X($B?>D)>S$BI_D)>S$D-3[U3P_^R0 +ME[,2*G^0E[,20U/O1`'_[)"7LQ(J?Y"7LQ)#4Y"`A1(J?W\$?@@2+]GDD)\[?"0E[OO\-.4!U!EX/]T`:@'"(`"PS/8_/3_D`!'X%_P +M$D_ED)>[X/]T`:@'"(`"PS/8_/^0`$;@3_`23^60E[S@8!:0E[O@_W0!J`<( +M@`+#,]C\_Y``18!HD)>[X/]T`:@'"(`"PS/8_/3_D`!%@&V0E[O@)/CPX/]T +M`:@'"(`"PS/8_,14\!)/W9"7N^#_=`&H!PB``L,SV/S_D`!#X$_P$D_ED)>\ +MX&`;D)>[X/]T`:@'"(`"PS/8_,14\/^0`$+@3X`:D)>[X/]T`:@'"(`"PS/8 +M_,14\/3_D`!"X%_P$D_ET-"2KR*+$HH3B120``(20B"0ESOPX##@2Y"7,G0! +M\'^`?@@2)]Z0ES02*G^K$JH3J120``$20B#_Y/S]_G@:$BILJ`2I!:H&JP>0 +MES020U/L5`/\$D-&D)<^$BI_D`4BY/"`+>20ES+P?X!^"!(GWNQ4`_SL1,#\ +MD)3PH_"0ESSPD)="\)"71?"0ET/PD)=& +M\)"71/"0ET?PD)!$P/U_40)'4I"73.!D`6`(D)"0ESWPD`5@ +MX)"72/"0!6'@D)=)\)`%8N"0ETKPD`5CX)"72_"BK^0SD)==\,*OD)!4[_U_11)'4I`%A^!D@/"0ETC@D`6$\)"7 +M2>"0!87PD)=*X)`%AO"0ETO@D`6'\**OY#.0EUWPPJ^0`3S@1"#P?2#D_Q(W +M`(`MD)`/P``*2D!```````````` +M``````)TR0`````````````````````"6=`````````````````````````` +M```````````````````````````````````"`DY/6"Y#25]8/@_:/@D)=:S?"C[?#OPYY``P)#5I`!Q70@\)"75>#_ +M=*4E%_6"Y#26]8/O\.\$D)=6\)"75^#_D)=6X/[3GT`#`D.@[L.4$$`A[B3P +M_W0!?@"H!PB`!<,SSC/.V/G_D)=8X%[^H^!?3G`GD)=6X/_#E!!0670!?@"H +M!PB`!<,SSC/.V/G_D)=:X%[^H^!?3F`\D)=6X+01#9"76>`PYP:0EU9T%_"0 +MEU;@_V038`3OM!(-D)=8X##@!I"75G08\)"75N"0EU7PD)=4\(!3D)=6X`3P +M`D*RD)=7X/F0EU7@_VE@`P)#Z)`!Q71`\'2E)1?U@N0TEO6#[_#E%W7P"*0D +M:?6"Y#23]8/@M`$4ZS#F!I"75.#_(I"75>!$0)"75/"0EU7@_R7@))[U@N0T +M0?6#Y)/\=`&3_>\EX"1F]8+D-$'U@W0!DRW_Y),\PQ/^[Q/_Y/S]Y1_PD)=4\/NCX/\EX"2>]8+D-$'U@^23_'0!D_WO)>`D9O6"Y#1!]8-T +M`9,M_^23/,,3_N\3_^3\_>47)>`EX"3A]8+D-)+U@Q(=J:\#(G0!)1?U@N0T +MDO6#Y/"0EU3@1(#_=(0E%_6"Y#0$]8/O\"+O%&`@%&!+)`)P>)"7:70"\)`` +M2.!$#/"0`$?@1`CPD`!%@%ODD)=I\)"79>#\H^#]H^#^H^#_D(%6$AVI?X!^ +M"!(SV)``1>!$[_#@5._PHX`MD)=I=`'PD)=OX/RCX/VCX/ZCX/^0@582':E_ +M@'X($C/8D`!%X$0@\.!$$/"CX$00\"+D]6$B`G]I`G]P=$60`<3PHW0)\.20 +MESKPD)`D +MP/6"Y#21]8/@_*/@TY0`[)0`4`,"3C'O=?`*I"0`^720-?#Z>P&+$_44B160 +MESK@)>`DP/6"Y#21]8/@_:/@D)=&S?"C[?#O)>`D8_6"Y#24]8/@_Z/@D)=( +MS_"C[_"0``(29B#_KO`29?4O_^7P/I"73_"C[_"0``829B#_KO"0``029B`O +M_^7P/I"73?"C[_"0``@29B#_D)=+Y?#PH^_PD)!D`7`H +MD)<]X/^004J3_G0C*_6"Y#25]8/@PYY`!N^001*`,I"7/>"002Z`*9"7/>#_ +MD$%*D_Z0ESK@)"/U@N0TE?6#X,.>0`;OD$#:@`>0ESW@D$#VDY"72O"0ETK@ +M=?`&I"10^71`-?!U$/_U$8D2D)<\X)!!\I/_TY"72>"?D)=(X)0`0`V0ESK@ +M_^3]$E]M`DW'D)`DX?6"Y#22]8/@_*/@_:/@_J/@_Y"7/A(=J9"7 +M/N#XH^#YH^#ZH^#[P`#``<`"P`.K$*H1J1(2'-;_?@"K$ZH4J1429?7]K/`2 +M'1SD_/W0`]`"T`'0`.LO_^H^_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[ +MP`#``<`"P`.K$*H1J1*0``$2'.__?@"K$ZH4J160``(29B#]K/`2'1SD_/W0 +M`]`"T`'0`.LO_^H^_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[P`#``<`" +MP`.K$*H1J1*0``(2'.__?@"K$ZH4J160``029B#]K/`2'1SD_/W0`]`"T`'0 +M`.LO_^H^_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[P`#``<`"P`.K$*H1 +MJ1*0``,2'.__?@"K$ZH4J160``829B#]K/`2'1SD_/W0`]`"T`'0`.LO_^H^ +M_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[P`#``<`"P`.K$*H1J1*0``02 +M'.__?@"K$ZH4J160``@29B#]K/`2'1SD_/W0`]`"T`'0`.LO_^H^_NTY_>PX +M_)"7/A(=J:L0JA&I$I``!1(<[_]^`)"71N#\H^#]$ATR4`/R0ESX2 +M':F`!Q(=M0````"0ES[@_*/@_:/@_J/@_Y"7.N`EX"7@).'U@N0TDO6#$AVI +MD)<\X"7@)&;U@N0T0?6#Y)/^=`&3_^3\_9"7/N#XH^#YH^#ZH^#[TQ)FI$`+ +MD)`DGO6"Y#1!]8/DD_YT`9/_Y/S]D)<^X/BCX/FC +MX/JCX/O#$F:D0`,"33Z0ESK@_WT!$E]M`DT^D)20 +ME4/P=",O]8+D-)7U@^#_PY0P4`,"2RV0E4/@9`%@`P)++9"7.N`D1/6"Y#25 +M]8/@9`I@5I"7.N#^[R0%_>0S_'0A+O6"Y#22]8/@_].=[&2`^'2`F%`S[R0% +M_>0S_'0C+O6"Y#25]8/@TYWL9(#X=("84!:0ESK@)(3U@N0TEO6#X/^0ESW@ +M;V!6D)_3E#R0EU)`!70#\(`# +M=`'PD)D)=2X,14\/"0ESK@PQ/_ +M)*3U@N0T!/6#X%0/`DTAD)20EU+PD)`D8_6"Y#24]8/D\*/P[R7@)*/U@N0TE/6#Y/"C\)"7.N`$\`)% +M&"+O<`,"4*.0ERW@8`,"5.60EQG@_*/@_:/@_J/@_Y"!5A(=J7^,?@@2,]B0 +MEL7@_*/@_:/@_J/@_Y"!5A(=J7]$?@@2,]B0ELG@_*/@_:/@_J/@_Y"!5A(= +MJ7]'X.$BL3D);9$AVI +M?WQ^#A(K$Y"6W1(=J7^`?@X2*Q.0EN$2':E_A'X.$BL3D);E$AVI?XA^#A(K +M$Y"6Z1(=J7^,?@X2*Q.0ENT2':E_T'X.$BL3D);Q$AVI?]1^#A(K$Y"6]1(= +MJ7_8?@X2*Q.0EOD2':E_W'X.$BL3D);]$AVI?^!^#A(K$Y"7`1(=J7_L?@X2 +M*Q.0EP42':E_!'X,$BL3D)<)$AVI?P1^#1(K$Y"7#1(=J7\,?@D2*Q.0EQ$2 +M':E_!'X($BL3D)<5$AVI?XQ^"!(K$Y"7HQ(=J9"7H^#\H^#]H^#^H^#_[43` +M_>R0EZ,2':F0EZ/@_*/@_:/@_J/@_Y"!5A(=J7^,?@@2,]B0@582';4``0`` +M?T1^"!(SV)"!5A(=M0#;):1_7'X($C/8D(%6$AVU(-LEI']L?@X2,]B0@582 +M';4@VR6D?W!^#A(SV)"!5A(=M00;):1_='X.$C/8D(%6$AVU!!LEI']X?@X2 +M,]B0@582';4$&R6D?WQ^#A(SV)"!5A(=M00;):1_@'X.$C/8D(%6$AVU8]LE +MI'^$?@X2,]B0@582';4$&R6D?XA^#A(SV)"!5A(=M2#;):1_C'X.$C/8D(%6 +M$AVU(-LEI'_0?@X2,]B0@582';4@VR6D?]1^#A(SV)"!5A(=M2#;):1_V'X. +M$C/8D(%6$AVU`!LEI'_C$AVID)>C +MX/RCX/VCX/ZCX$01_^R0EZ,2':F0EZ/@_*/@_:/@_J/@_Y"!5A(=J7\$?@P2 +M,]A_!'X-$BL3D)>C$AVID)>CX/RCX/VCX/ZCX%3P_^R0EZ,2':F0EZ/@_*/@ +M_:/@_J/@1`'_[)"7HQ(=J9"7H^#\H^#]H^#^H^#_D(%6$AVI?P1^#1(SV'\, +M?@D2*Q.0EZ,2':F0EZ/@_*/@_:/@_N3_[)"7HQ(=J9"7H^#\H^#]H^#^H^!$ +M$?_LD)>C$AVID)>CX/RCX/VCX/ZCX/^0@582':E_#'X)$C/8?PQ^"1(K$Y"7 +MHQ(=J9"7H^#\H^#]H^#^H^#_[50/_>Q4\/R0EZ,2':F0EZ/@_*/@_:/@_J/@ +M_^U$$/WL1`'\D)>C$AVID)>CX/RCX/VCX/ZCX/^0@582':E_#'X)$C/8?P1^ +M"!(K$Y"7HQ(=J9"7H^#\H^#]H^#^H^!4\/_LD)>C$AVID)>CX/RCX/VCX/ZC +MX$0!_^R0EZ,2':F0EZ/@_*/@_:/@_J/@_Y"!5A(=J7\$?@@2,]CDD)40=?`(I"1E +M]8+D-).O@O46CQ?E$'7P"*0D8_ETDS7P=1@!]1F)&G3!)1#U@N0TDO6#X!)F +MP55G`%5\`561`E6F`U70!%7E!57Z!E8A#%9/#59\#E:I#P``5MWE$"7@).3U +M@N0TE?6#=/#PHW05@#SE$"7@).3U@N0TE?6#=/#PHW00@"?E$"7@).3U@N0T +ME?6#=/#PHW0%@!+E$"7@).3U@N0TE?6#=/#PH^3PY1`EX"2!]8+D-)+U@W0/ +M\*-TC_`"5MWE$"7@).3U@N0TE?6#=`_PHW3U@"?E$"7@).3U@N0TE?6#=`_P +MHW3P@!+E$"7@).3U@N0TE?6#Y/"C=`WPY1`EX"2!]8+D-)+U@^3PH_`"5MV0 +M!$?@JQ.J%*D5$F65D`1&X*L3JA2I%9```1)EIY`$1>"%$H*%$8/PD`1$`E;4 +MD`1+X*L3JA2I%1)EE9`$2N"K$ZH4J160``$29:>0!$G@A1*"A1&#\)`$2(!8 +MD`1/X*L3JA2I%1)EE9`$3N"K$ZH4J160``$29:>0!$W@A1*"A1&#\)`$3(`K +MD`13X*L3JA2I%1)EE9`$4N"K$ZH4J160``$29:>0!%'@A1*"A1&#\)`$4."% +M$H*%$8.C\*L3JA2I%<`#P`+``1(0U%/K``\`"P`$2'-;_JQBJ&:D:D``!$ASO7]`!T`+0`Q)EE842@H41 +M@\"#P(+@_X47@H46@^#^[U[0@M"#\(42@H41@Z/`@\""X/^%%X*%%H.CX/[O +M7M""T(/PY1`EX"2!]8+D-)+U@^#^H^!.8$R0EU%T"_"0EU'@_\.4`%`#`E@C +M=`%^`*@'"(`%PS/.,\[8^?_E$"7@)('U@N0TDO6#X%[^H^!?3F`*D)=1X"00 +MH_"`:)"74>`4\("ZY1`EX"3D]8+D-)7U@^#^H^!.8$>0EU%T#_"0EU'@_\.4 +M`$`\=`%^`*@'"(`%PS/.,\[8^?_E$"7@).3U@N0TE?6#X%[^H^!?3F`(D)=1 +MX*/P@`V0EU'@%/"`O^20EU+PY1`EX"3D]8+D-)7U@^#^H^!.8$?DD)=1\)"7 +M4>#_PY000`,"6-UT`7X`J`<(@`7#,\XSSMCY_^40)>`DY/6"Y#25]8/@7OZC +MX%].8`:0EU'@@&.0EU'@!/"`ON40)>`D@?6"Y#22]8/@_J/@3F!&Y)"74?"0 +MEU'@_\.4#%`\=`%^`*@'"(`%PS/.,\[8^?_E$"7@)('U@N0TDO6#X%[^H^!? +M3F`(D)=1X"00@`F0EU'@!/"`O^20EU/PD)=2X/_E$'7P"*0D9_6"Y#23]8/O +M\)"74^#^Y1!U\`BD)&CU@N0TD_6#[O!TA"40]8+D-`3U@^#3GT`?D)=2X/]T +MA"40]8+D-);U@^_P=(0E$/6"Y#0$]8/O\)"74N#_TY030`B0DV)T`_"`(>_3 +ME`M`")"38G0"\(`3[].4`T`(D)-B=`'P@`7DD)-B\)"38N"0!+'PY1`EX"3D +M]8+D-)7U@^#_H^"0!)S/\*/O\.40)>`D@?6"Y#22]8/@_Z/@D`2>S_"C[_#E +M$'7P"*0D:?6"Y#23]8/@Q#-4X$40D`2@\'3!)1#U@N0TDO6#X)`$H?`BP.#` +M\,"#P(+`T'70`,``P`'``L`#P`3`!<`&P`>0`<1TT/!T6:/PD`$WX%4K]2^0 +M`33@52CU+)`!-N!5*O4NY2P@X`,"6X*0`31T`?"%T4V%TDZ%TT^%U%"%U5&% +MUE*%UU.%V53E5%1`PQ/_Y5-4(&]P`P);+^54,.4#`ELOY5)4'_4(Y4U4/_4) +MY5%4'__E""7@)./U@N0TE/6#Y(_P$F7)Y5-4'__E""7@),#U@N0TD?6#Y(_P +M$F7)Y0G3E`1``W4)!'7P"N4(I"0`]8+E\#20]8-U\`+E"1)FM>#^H^#_Y5-4 +M'R__Y#[^=?`*Y0BD)`#U@N7P-)#U@W7P`N4)$F:U[O"C[_#E5"#F).535!__ +MY0@EX"1C]8+D-)3U@^2/\!)ER>5/,.5/,.<2Y4]4?_WE4U0?]0VK":\($G92Y65@3Y"7C>!@-9`! +M6^3PD`$\=`3PD`0;X%1_9']P-'5(%/5)^_U_6'X!$CCLD`%;=`7PD`:2=`'P +MD)>'\(`4D`0;X%1__[]_"I"7B^#_?0$2;MKE+##A(9`!-'0"\(715H725X73 +M6(7468756H766X777(7971)]Q.4L,.,&D`$T=`CPY2PPY`F0`31T$/!#51#E +M+##E(9`!S^`PY1K@5-_PD`$T="#PD``#X%3[\'\0?@`2.JB`_N4L,.8&D`$T +M=$#PY2XPX0F0`39T`O!#54#E+C#@"9`!-G0!\!)VT^4N,.)CD`$V=`3PY61D +M`7!7Y65@4^5E9`)P)Y`&J^"0EW_PD`:JX)"7BO"0EW_@<`>0EXK@_X`%D)=_ +MX/^0EW_O\)"7@>!@`^`4\)"7@.3PD`%7\)`!/'0"\)"7C^!4_?#@5._P$G=) +MY2XPXS&0`39T"/#E9&0!<"7E96`AD`%7Y/"0`3QT`O!U2`-U20#D^_U_5'X! +M$CCLD`%7=`7PY2XPY#J0`39T$/#E9&0!<"[E96`JD`%7Y/"0`3QT`O"0EX[D +M\)"7C^!4_?#@5`-P#I"7B?"0EXO@_WT!$F[:Y2XPY1*0`39T(/#E9+0!!^5E +M8`,2?G[E+C#F*I`!-G1`\.5D9`%P'N5E8!J0EX_@5/[PX%0#<`Z0EXGPD)>+ +MX/]]`1)NVN4O,.$)D`$W=`+P$GSH=-`$D`'$\'19H_#0!]`&T`70!-`#T`+0 +M`=``T-#0@M"#T/#0X#)T79`!Q/"C=&7PD`1$=!'PHW3P\*-T#_"CY/"0ESKP +MD)`D8_6"Y#24]8/D\*/P[R7@)./U@N0TE/6#Y/"C\.\EX"2C]8+D +M-)3U@^3PH_#O)>`D9/6"Y#25]8/D\*/P[R7@)*3U@N0TE?6#Y/"C\'1$+_6" +MY#26]8/D\'0D+_6"Y#26]8/D\'1D+_6"Y#26]8/D\)!!Q)/^=`&3_Y!!C'0! +MDR__Y),^PQ/^[Q/_Y/S]ZR7@)>`DX?6"Y#22]8,2':GK=?`(I"1J]8+D-)/U +M@W0!\.MU\`BD)&GU@N0TD_6#=`'P=,$K]8+D-)+U@W0,\.MU\`BD)&7U@N0T +MD_6#=/_PH_#K=?`(I"1C]8+D-)/U@^3PHW0/\.MU\`BD)&?U@N0TD_6#=!/P +MZW7P"*0D:/6"Y#23]8/D\'2$*_6"Y#0$]8-T$_"0ESK@!/`"7:`DY/6"Y#25]8/@^Z/@ +MD)=;R_"CZ_#E%R7@)('U@N0TDO6#X/NCX)"770`R0EUK@D)=7 +M\)"75/#M<`,"8-F0EUCM\)"75.`PY@Z0EU?@D)=4\)"76.`4\)"76.!P`P)@ +MV9"75^#_TY0`4`,"8-GDD)=6\.\4D)=5\)"76>#]D)=5X/_3G4!O[Y000"'O +M)/#_=`%^`*@'"(`%PS/.,\[8^?^0EUW@7OZCX%].<">0EU7@_\.4$%`W=`%^ +M`*@'"(`%PS/.,\[8^?^0EUO@7OZCX%].8!J0EU7@D)=4\)"75N`$\)"76.#_ +MD)=6X&]@")"75>`4\("#D)=8X/^0EU;@PY]0#Y"75>"U!0B0EUG@D)=4\)"7 +M5.#_)>`DGO6"Y#1!]8/DD_QT`9/][R7@)&;U@N0T0?6#=`&3+?_DDSS#$_[O +M$__D_/WE%R7@)>`DX?6"Y#22]8,2':F0EU3@_W2$)1?U@N0T!/6#[_`BD`'$ +M=#+P=&&C\)`!S.!4#Y"7.O"0ESK@_7`#`F+2D)>QX/]T`7X`J`<(@`7#,\XS +MSMCY_^]=<`,"8K.0E['@=?`$I"30]8+E\#0!]8/@D)<[\**OY#.C\,*O=20! +M=267=28[=2P%ZEWD]$GDGD)<\X"3_DJ^CX/_$$Q,35`&0E[$PX'#@=?`" +MI"2(]8+D-?#U@^"0ES[PD)>QX'7P`J0DB?6"Y#7P]8/@D)<_\)"7L>!U\`2D +M)-'U@N7P-`'U@^"0ET#PD)>QX'7P!*0DTO6"Y?`T`?6#X)"70?"0E['@=?`$ +MI"33]8+E\#0!]8/@D)="\(!"X'7P!*0DT?6"Y?`T`?6#X)"7/O"0E['@=?`$ +MI"32]8+E\#0!]8/@D)<_\)"7L>!U\`2D)-/U@N7P-`'U@^"0ET#P[U1__WL! +M>I=Y/A)N`I"7.N#_D)>QX/YT`:@&"(`"PS/8_/1?D)#_=`&H!PB` +M`L,SV/R0`QX`3PX%0#\`)A1L*O=#($D`'$\'1AH_"0ESK@D`'&\)"7 +ML>"0`7=`'P@`7DD)>7\)"7E^"T`1.0`/+@,.<,D)>0=/WPHW0S\(`*D)>0=/WP +MHW0O\.3U51)=91)_8!)YSA(VT1)$_W4H,^3U*74J`O4KD`$PY2CPH^4I\*/E +M*O"CY2OPD`#SX##B#9`%0700\)`%6O"CY/"0`61TH/!U2/_D]4G[?0%_4'X! +M$CCL=3`?=3$!Y/4RD`$XY3#PH^4Q\*/E,O`2>-"0ESGEV?"0`3QT__"C\*/P +MD`$T\*/PH_"C\,*OD`"`X$1`\'\0?@`2.JAUZ`-#J(72KY`!P.3PH_"C\*/P +MD`'&\*/PD)`EX)"7:O`2'-8EX"7@D)=N\)"7:^"0!)CP +MD)=JX!,35#^0!)GPD)=NX!,35#^0!)KPD`5@X)"7>?"0!6'@D)=Z\)`%8N"0 +MEWOPD`5CX)"7?/"BK^0SD)=)\,*OD)=JX/\2>7R0ETG@)/^2KY"7:^!P`P)E +M89"7:N!P`P)E89"7;N!P`P)E8:*OY#.0ETGPPJ^0EWUT`?"0ETG@)/^2KY`` +M1>!4_O"CX$0!\)"78^!@'9"7;^#\H^#]H^#^H^#_D(%6$AVI?X!^"!(SV(`& +MD`4B='_PD`!%X%3O\)`%A^!D@/"0EWG@D`6$\)"7>N"0!87PD)=[X)`%AO"0 +MEWS@D`6'\**OY#.0ETGPPJ^0`3S@1"#P?2#D_Q(Z28`KD)=KX'`MD)=]\)`` +M1>!4_O"CX%3^\)`%(N3PHJ\SD)=)\,*O?2#D_Q(YVY"72>`D_Y*O(KL!!HF" +MBH/P(E`"]R*[_@'S(OB[`0WE@BGU@N6#.O6#Z/`B4`;I)8+(]B*[_@7I)8+( +M\B+%\/BCX"CPQ?#XY8(5@G`"%8/@./`BH_C@Q?`E\/#E@A6"<`(5@^#(./#H +M(KL!"HF"BH/@]?"CX")0!H?P"><9(KO^!^/U\`GC&2*)@HJ#Y)/U\'0!DR*[ +M`1#E@BGU@N6#.O6#X/7PH^`B4`GI)8+XAO`(YB*[_@KI)8+XXO7P".(BY8,J +M]8/ID_7PH^F3(KL!"HF"BH/PY?"C\")0!O<)I_`9(KO^!O/E\`GS&2+XNP$1 +MY8(I]8+E@SKU@^CPY?"C\")0">DE@LCV"*;P(KO^">DE@LCRY?`(\B+KG_7P +MZIY"\.F=0O#HG$7P(J0E@O6"Y?`U@_6#(M"#T(+XY)-P$G0!DW`-HZ.3^'0! +MD_6"B(/D\29960ET;@^Z/@^J/@^9```A(<[_^0ET[@ +M^Z/@^J/@^9```>\29:>0ET;@^Z/@^J/@^9```1(<[_^0ETS@_*/@_?6"C(/O +M\!(0`<1T_O!T9Z/P4Y'?D`$\X%4P]32CX%4Q]36CX%4R]3;E +M-##@#Y`!/'0!\)`!4W0'\$-5@.4T,.$)D`$\=`+P$GL`Y30PXCJ0`3QT!/"0 +M!I+@,.`>=4@4=4D`Y/O]?UA^`1(X[)`!6W0%\)`&DG0!\(`/D)>'Y/"0EXO@ +M_WT!$F[:Y30PXP:0`3QT"/#E-##D"9`!/'00\!)^W^4T,.4)D`$\="#P$F^B +MY34PX!60`3UT`?"0`(/@D)>+\.#_?0$2;MKE-C#C!I`!/G0(\'3^!)`!Q/!T +M9Z/PT`?0!M`%T`30`]`"T`'0`-#0T(+0@]#PT.`RBQ"*$8D2D``"$ASOD)=L +M\."0!)3PD``!$ASOD`25\)"7;.`PX'20EV-T`?!_@'X($BL3D)=E$AVIJQ"J +M$:D2D``!$ASO_^3\_?YX&A(=EJ@$J06J!JL'D)=EX/RCX/VCX/ZCX/_L5`/\ +MZT__ZD[^Z4W]Z$S\D)=O$AVID`4BY/"0EV_@_*/@_:/@_J/@_W@8$AV#D`26 +M[_"`1>20EV/P?X!^"!(K$Y"791(=J9"79>#\H^#]H^#^H^#_[$3`_)"791(= +MJ9"79>#\H^#]H^#^H^#_D(%6$AVI?X!^"!(SV)"7;."0`$!P#9"7 +M>.!P!Y`$_>!4_O"0EW/@D`2(\)"7=."0!(GPD)=UX)`$BO"CY/"0EW;@D`2, +M\)"7=^"0!(WPD)=XX)`$CO"CY/"0EU_@D`20\)"78."0!)'PD)=AX)`$DO"0 +MEV+@D`23\.20EV3PD)=?!/#DH_"C\*/PD)=S\*/PH_"C\*/PH_"0EV3@D`27 +M\)`%8."0ESKPD`5AX)"7._"0!6+@D)<\\)`%8^"0ESWPD)=\X/^0ESW@_M.? +M4`N0EWS@PY[3E`%`$9"7:N"T`0*``Y"7;N#_$GE\(I"7L.WPD)>O[_#3E`=0 +M;>#_=`&H!PB``L,SV/ST_Y``1^!?\'\0?@`2.JB0EZ_@_W0!J`<(@`+#,]C\ +M_Y``1N!/\'\0?@`2.JB0E[#@8!:0EZ_@_W0!J`<(@`+#,]C\_Y``18!XD)>O +MX/]T`:@'"(`"PS/8_/3_D`!%@'V0EZ_@)/CPX/]T`:@'"(`"PS/8_,14\/3_ +MD`!#X%_P?Q!^`!(ZJ)"7K^#_=`&H!PB``L,SV/S_D`!#X$_P?Q!^`!(ZJ)"7 +ML.!@&Y"7K^#_=`&H!PB``L,SV/S$5/#_D`!"X$^`&I"7K^#_=`&H!PB``L,S +MV/S$5/#T_Y``0N!?\'\0?@`2.J@BD`'$=##P=&RC\']X?@@2*Q.0EQT2':E_ +M!'X,$BL3D)'X($C/8D)!4]O!_$'X``CJH +MD)=]X&0!8`F0EVO@8`,";@&0EU_@PY3_4`7@!/"`.Y"78.##E/]0!N`$\.2` +M*)"78>##E/]0"N`$\.20EV#P@!60EV+@PY3_4!#@!/#DD)=A\)"78/"0EU_P +MD`!$X%0,8';@,.(RD)=SX,.4_U`%X`3P@"20EW3@PY3_4`;@!/#D@!&0EW7@ +MPY3_4`S@!/#DD)=T\)"7<_"0`$3@,.,RD)=VX,.4_U`%X`3P@"20EW?@PY3_ +M4`;@!/#D@!&0EWC@PY3_4`S@!/#DD)=W\)"7=O"0!/W@1`'P(I"70^OPH^KP +MH^GPK0>0`<1T`O!T;J/P[1)FP6X_`6Y-`FY;`VYI!6YW!FZ%!VZ3"6ZA#&ZO +M#6Z]#@``;LN0ET/@^Z/@^J/@^0)]G9"70^#[H^#ZH^#Y`G]WD)=#X/NCX/JC +MX/D"?1>0ET/@^Z/@^J/@^0)\"Y"70^#[H^#ZH^#Y`F;GD)=#X/NCX/JCX/D" +M?RB0ET/@^Z/@^J/@^0)S%)"70^#[H^#ZH^#Y`F0TD)=#X/NCX/JCX/D"?'Z0 +MET/@^Z/@^J/@^0)I#\*O=`($D`'$\'1NH_"`_H]BC6.0`<1TVO!T;J/PY6)4 +M#_^0EXC@5`]O8'CE8C#B,)"7B.`@X@5_`1)^")"7B.`PXPKE8B#C!1)^)X!6 +MD)>(X"#C3^5B,.-*KV,2?>B`0Y"7B.!4#_^_#`[E8B#C"1)]KCO8`,2?D20EXC@ +M5`__D)>+X%0/;W`CX##F'Y"7B.!4#_^0EW[@_D^0`2_P[F2`D)=^\)"7B^!4 +MO_`BD)=KX&0!8`,"<&60`$;@1`'PD)=]X'!`D)=CX&`=D)=OX/RCX/VCX/ZC +MX/^0@582':E_@'X($C/8@`:0!2)T?_"0EVK@_Q)Y?)"7?70!\)``1>!4_O"` +M1)"7?>!D`7`\D)=NX/\2>7SDD)=]\)``1>!$`?"0EV/@8!V0EV7@_*/@_:/@ +M_J/@_Y"!5A(=J7^`?@@2,]B`!9`%(N3PD`6'X&2`\)"7>>"0!83PD)=ZX)`% +MA?"0EWO@D`6&\)"7?."0!8?P(I"7,.OPH^KPH^GPD)>6X&0"<`,"<1N0`:_@ +M8`F0`:`2>2>0ES;@)/^2KZ*OY#/PPJ^0 +MES/@^Z/@^J/@BR2*)?4FD):(2>2>0 +MES;@)/^2KY`!KW3_\)`!R^!D@/`BD`'$=!SP='&C\)``$>!$"?!_$'X`$CJH +MD)<=X/RCX/VCX/ZCX/^0@582':E_>'X($C/8D)3]_Q(XMI"7E^"T`1&0@202 +M';4``RV5Y/U_`1(XMB*0EY[O\*/M\.2C\*/PY65@!>3_$GZ9D)>>X##@"9"7 +MH.3PHW2`\)`$'>!@'9`%(N"0EZ+PX/]4D&#LD`'(=/SP[U1OD`4B\(#=D)>> +MX/_#$Y#]$/"0!"7O\)"7G^!@$*.CX"00]8+D-/SU@^!$@/"0EZ"CX/_])`CU +M@N0T_/6#Y/!T"2WU@N0T_/6#X%3P\'0A+_6"Y#3\]8/@5/?PD)>@X/ZCX/\B +MD)>U[_#3E`=02N#_=`&H!PB``L,SV/ST_Y``1N!?\'\0?@`2.JB0E[7@_70! +M?@"H!0B`!<,SSC/.V/G_D`!$X/OD_N];J`4(@`;.HN<3SA/8^/\BD)>UX"3X +M\.#_=`&H!PB``L,SV/ST_Y``0^!?\'\0?@`2.JB0E[7@_70!?@"H!0B`!<,S +MSC/.V/G_D`!"X/OD_N];J`4(@`;.HN<3SA/8^/\BD)=&Z_"CZO"CZ?"BK^0S +MH_#"KY"71N#[H^#ZH^#YD``!$F8@^N7P)`#_Y#K^D)=&H^#ZD``![H_P$F9W +M$AS6_V`WM5X;D)=&X/NCX/JCX/F0``$29B!E8'`$Y5]E\&`ND)=&X/NCX/JC +MX/F0``$29B#_KO`2?+2`%9"71N#[H^#ZH^#Y$AS695Y@`Q)_5I"72>`D_Y*O +M(L#@P/#`@\""P-!UT`#``,`!P`+``\`$P`7`!L`'D`'$=*OP='.C\%.1[Y`` +M4>#_D`!5X%_U/>4],.88=$#PD)=LX%0#_[\#"Y"7:>!@!7\!$D1[Y3TPYQ60 +M`%5T@/"0EVS@5`/_OP,%?P(21'N0`<1TJ_!T!\"("=0<"8M/DDZ/XY).C0`/V@`'R"-_T@"GDDZ/X +M5``OH\/='60`<3PHW1,\.4/=?`(I"1G]8+D-)/U@^#_=*4E +M#_6"Y#26]8/@5!_[TY]``JL'ZR7@))[U@N0T0?6#Y)/^=`&3_^LEX"1F]8+D +M-$'U@W0!DR__Y),^PQ/^[Q/_Y/S]Y0\EX"7@).'U@N0TDO6#$AVI=(0E#_6" +MY#0$]8/K\/\BD)=,[_#3E`=0,^#_=`&H!PB``L,SV/ST_Y``1^!?\'\0?@`2 +M.JB0ETS@_W0!J`<(@`+#,]C\]/^0`$:`.Y"73.`D^/#@_W0!J`<(@`+#,]C\ +MQ%3P]/^0`$/@7_!_$'X`$CJHD)=,X/]T`:@'"(`"PS/8_/3_D`!#X%_P?Q!^ +M`!(ZJ"*/"HT+K0-T=I`!Q/"C=%+PY0M4'_ET`24*]8+D-)+U@^#_D`3]X+0! +M!74.`X`#=0X![=.5#D`%KPH"=4R0`<5T(/#E#2__Z9!!UI/^[].>0"*0`<5T +M0/!T`24*]8+D-)+U@^3P=(0E"O6"Y#0$]8/E"_`B=`$E"O6"Y#22]8/O\"+D +MD)*X)"7?_"``)"7+G0!\)"7+N!@,9"7C^!$$/"0EX7@]4CD]4G[_7]4?@$2 +M..R0`5=T!?"0EXC@5`_#E`10!WT!?P02;MHBD`:IX/4*5,!P#I"7B?"0EXO@ +M_WT!`F[:Y0HPYA*0EXET`?"0EX_@1`'P$GY^@`>0EX_@5/[PY0HPYRF0EXET +M`?"0EX_@1`+P=4@#Y/5)^_U_5'X!$CCLD`%7=`7PD)>.=`'P(I"7C^!4_?`B +MD``KX$0!\'_H?@,2.JB0``C@1!#P?Q!^`!(ZJ)``">!4]_!_$'X`$CJHD``H +MX%3^\'\0?@`2.JB0`"#@5/[P?Q!^`!(ZJ)``)>!$0/!_$'X`$CJHD``)X%3O +M\'\0?@`".JB+$(H1B1(2?LVK$*H1J1(2'-;U911@#A1@#Q1@&B0#<#Q_`8`U +MY/^`,9"7BG0!\)"7?_#D_X`CJQ"J$:D2D``"$ASO_Y"7BG`%=`7P@`+O\)"7 +MBN"0EW_PY/\2=#TBD``EX%2_\'\0?@`2.JB0`"#@1`'P?Q!^`!(ZJ)``*.!$ +M`?!_$'X`$CJHD`#PX##A^9``">!$"/!_$'X`$CJHD``(X%3O\'\0?@`2.JB0 +M`"O@5/[P?^A^`P(ZJ)``1>3PD`3]\*/PD)=M\)"7<_"0EW;PD)=T\)"7=_"0 +MEW7PD)=X\)"77P3PY*/PH_"C\)"79/"0EVGPD)=K\)"7??"0EV[PD)=J\)"7 +M8_"0`%'@1,#P(HLABB*)(Y"7F.OPH^KPH^GPH^4D\*/E)?"CY2;PKR<5)^]@ +M*I"7F^#[H^1U\`$29=^I\/H2'-;_D)>8X/NCY'7P`1)EWZGP^N\2996`SZLA +MJB*I(R*0!6#@D)=Y\)`%8>"0EWKPD`5BX)"7>_"0!6/@D)=\\,-T_Y_^D)=Z +MX-.>0![@+_"CX+3_#^3PH^"T_P/D\"*0EWR``Y"7>^`$\"*0EWK@+_`BY/5D +MD)>/\/5ED)>+=`SPD)>(\.20EXWPD)>'\)"7AO"0EXH$\)"7?_#DD)>.\)"7 +MB?"0EX'PD)>%=`?PY)"7@/"0EX/PHW0"\.20EXSP(N20EZWPH_"0`<1T'?!T +M>J/PD`7XX'`/H^!P"Z/@<`>CX'`#?P$BTY"7KN"4Z)"7K>"4`T`#?P`B?S)^ +M`!(ZJ)"7KN`$\'#*D)>MX`3P@,+DD)>5\**O,Y"7._"0`(#@(.$:$CJ^$CJ^ +MD)J/P@-^0!C!T`?#"KY``@.!$@/!_$'X`$CJHD)<[ +MX"3_DJ\BD`'$=+CP='JC\.55<#>0EXO@5`_3E`%0+)`"A^!P)I"7EN"T`A"0 +MEY#@_J/@]8*.@^!@"(`/D`&OX'`)D)>,X&`#?P$B?P`BD)>.X&`2Y/"CX%3] +M\.!4`W`SD)>)\(`CD)>`X`3PD)>/X%3O\)"7@.#3E`%`#>5DM`$2H^!P#N`$ +M\"*0EXO@_WT!$F[:(N20ESKP[Y``,?#N5`/_H^!4_$_PH^!4?_"0`##@(.<. +MD)/X"#D$9"7A^!D`6`) +MD)>!X'`#?P$B?P`BCV:0`<1TS/!T>Z/PD)>4X/]]`1)QR>5F8!!T(2_U@N0T +M_/6#X$00\(`.="$O]8+D-/SU@^!4[_"0!!]T`?`B$AS6_\.4(%`5D``"$ASO +M_G0C+_6"Y#25]8/N\(`.[[0@"I```A(<[Y"38?!T(R_U@N0TE?6#X)`$LO`B +MD`$W=`+PD`4B=/_P$GH=[W`&D`'(=/WP?0)_`Q(Z+^5E8`5_`1)^F1)L,)"7 +MB.!4\/#@1`+P(I```A(<[Y"7;?#@D`2;\)"7;>!@!."T_QRBK^0S]1#"KY`` +M1^!4^_!]0'\!$CGXY1`D_Y*O(I"72N[PH^_P=5X!CE_U8'\+$G7/$GYAY/\2 +M?QN0ETK@_*/@_>S[C4CD]4E]`7]@?@$"..Q]`G\#$CF^Y65@(Y"7C>!@!GT! +M?PR`#Y"7B.!4#\.4!%`'?0%_!!)NVN3_$GZ9(I`"">#]$AS6_J\%[2Z0EY+P +MD``!$ASO_^TOD)>3\)```A(<[_^N!>TOD)>4\"*0!C3@8"8435_ +M^7X!$GM&OP$)D`8UX%0/\(`%@``"?P#DD`8T\"*0`<1T-\!(P%ZEWDN`G!FD`8$X%2_\.]@"N5DM`$%Y/\2>\R0EXC@5/#PX$0,\"*0 +ME[+O\!)Q')"7LN!@!9`%(N3PD)>(X%3P\.!$!/`BD`8$X$1`\.5DM`$%?P$2 +M>\R0EXC@5/#PX$0$\"*0EXC@5/#PX$0!\!)WM1)X=9"7B.!4\/#@1`+P(G\+ +M$G)O[V5A8!#E8;0!!>3U88`#=6$!?P$B?P`BD`'$='[P='ZC\)"7D^#_Y/T2 +M<7X+0!$.3_@`F0EY?@M`$%?P$23CLBD`!)X)"7M/#@ +M5`_PX/]$\)``2?#O1+#P(N20EX[PD)>`\)"7B?"0EX_P(N5>M`$+$GYAOP$% +M?P$2?QLBD`DH[_"C\*/PH_"C\*/P(I`&-'3_\.2C\*/PH_`B09>Q`$&7?H!! +ME[,``)`!RN5A\.]@`Q)^M"*0ET;K\*/J\*/I\"*0EZ?K\*/J\*/I\"*0EZKK +M\*/J\*/I\"*/@HZ#HZ.CY/`BY/5>?V!^`0)_3)"7E^"0ERWP(H\;C!R-'2*/ +M'HP?C2`B$AS6]60B(E())`````V`$0`H````@]O_```(```"``2`!`@```,` +M```("````/P```P(```*````$`@``(A3`!`4"```$#T,`A@(``"%`R`"'`@` +M```````@"`````$``20(```$`#D`*`@````!``$L"```!``Y`#`(```G)R-%1I5`P``)0`O$-8#``` +M'C14:5P,``"4`#Q#8`P```````!D#```BX0646@,``#_"\!';`P``#8```!P +M#```#0!_+'0,``!;$88!>`P``!\```!\#```$I:Y`(`,`````0!`A`P````` +M]B"(#`````$`0(P,`````"`@D`P``"`8$@"4#````````)@,```@&!(`G`P` +M`']_``"@#````````*0,``"`````J`P```````"L#````````+`,```````` +MM`P```````"X#````````+P,```````HP`P```````#$#````````,@,```` +M````S`P```````#0#````````-0,````````V`P``"`@```@(``!\"````````(`(``!P,`C`A`@``-4$``"( +M"````````(P(``#``,#,D`@````(``"4"```_O___Y@(```0(#!`G`@``%!@ +M<```"0````````0)```C````"`D````````,"0``$1$2@0`*``#(1]``!`H` +M``P`_X`("@```(.#C`P*```/$F@N$`H``'B[`)44"@``*$`4$1@*```7$8@` +M'`H````/%(D@"@`````;&B0*```7$PX)*`H```0"```L"@````#3`'`*```` +MOQ\0=`H```<`````#```0!T'2`0,```15J`#"`P``.0````,#```;&QL;!`, +M`````(`(%`P````!`$`8#`````"`"!P,`````0!`(`P````````D#``````` +M`"@,````````+`P````````P#```1*SI:30,``#/4I9&.`P``)19>4D\#``` +M')>7"D`,```_0'P?1`P``+<``0!(#```!P$"[$P,``!_`W\`4`P``!XT5&E4 +M#```E`"\0U@,```>-%1I7`P``)0`/$-@#````````&0,``"+A!91:`P``/\+ +MP$=L#```-@```'`,```-`'\L=`P``-L0A@%X#```'P```'P,```2%KD`@`P` +M```!`$"$#`````#V((@,`````0!`C`P`````(""0#```(!@2`)0,```````` +MF`P``"`8$@"<#```?W\``*`,````````I`P``(````"H#````````*P,```` +M````L`P```````"T#````````+@,````````O`P``````"C`#````````,0, +M````````R`P```````#,#````````-`,````````U`P```````#8#```)R2R +M9-P,```R:78`X`P``"(B(@#D#````````.@,```"0V0W[`P```S4ER\`#0`` +M0`<(``0-```!!`(`"`T``'^0```,#0```0(!(!`-```S,V.@%`T``$.\,S,8 +M#0``:UN/>BP-``!UF9?,,`T````````T#0```(!@@#@-````````/`T``)-R +M`@!`#0```````$0-````````2`T```````!,#0```````%`-```*%#=D5`T` +M``````!8#0```````%P-``!D(`,P8`T``&C>4T9D#0``/(I1!&@-```!(0`` +M;`T``!8<("IP#0``+C82&'0-```@(BPR>`T``"0\#@``#@``*BHJ*@0.```J +M*BHJ"`X``"HJD`,0#@``*BHJ*A0.```J*BHJ&`X``"HJ*BH<#@``*BHJ*B@. +M````````,`X``!_<`!`T#@``'XP`$#@.```"`10"/`X``,($%FA`#@```'P` +M`40.````2``!2`X``````/M,#@``T2@``%`.```?W``05`X``!^,`!!8#@`` +M`@$4`EP.```%#18H8`X```@```!H#@``I"4;`&P.``"@)1MC<`X``*`E&V-T +M#@``H"4;"'@.``"@)1L(?`X``*`E&PB`#@``H"4;"(0.``"@)1MCB`X``*`E +M&PB,#@``H"4;8]`.``"@)1MCU`X``*`E&V/8#@``H"4;8]P.``"@)1L`X`X` +M`*`E&P#L#@``H"4;:Q0/```#````3`\`````````#P````,````.``#_____ +M#`P)!P0.``#_____!00"`0@.````_P```````&P(````____`````!`.``#_ +M____#@P,"Q0.``#_____!@4#`1@.``#_____#@T,"QP.``#_____"04#`3`( +M``#_____#`P)!S0(``#_____!00"`3@(````____`````&P(``#_```````` +M`#P(``#_____#@T,"T@(``#_____"04#`4P(``#_____#@T,"V@(``#_____ +M"04#`0`.``#_____``````0.``#_____``````@.````_P```````&P(```` +M____`````!`.``#_____`````!0.``#_____`````!@.``#_____`````!P. +M``#_____`````#`(``#_____`````#0(``#_____`````#@(````____```` +M`&P(``#_`````````#P(``#_____`````$@(``#_____`````$P(``#_____ +M`````&@(``#_____```````.``#_____!`0$!`0.``#_____!`("``@.```` +M_P```````&P(````____`````!`.``#_____!@8&!A0.``#_____!@0"`!@. +M``#_____`````!P.``#_____`````#`(``#_____!`0$!#0(``#_____!`(" +M`#@(````____`````&P(``#_`````````#P(``#_____!@8&!D@(``#_____ +M!@0"`$P(``#_____`````&@(``#_____```````.``#_____``````0.``#_ +M____``````@.````_P```````&P(````____`````!`.``#_____`````!0. +M``#_____`````!@.``#_____`````!P.``#_____`````#`(``#_____```` +M`#0(``#_____`````#@(````____`````&P(``#_`````````#P(``#_____ +M`````$@(``#_____`````$P(``#_____`````&@(``#_____```````.``#_ +M____``````0.``#_____``````@.````_P```````&P(````____`````!`. +M``#_____`````!0.``#_____`````!@.``#_____`````!P.``#_____```` +M`#`(``#_____`````#0(``#_____`````#@(````____`````&P(``#_```` +M`````#P(``#_____`````$@(``#_____`````$P(``#_____`````&@(``#_ +M____```````.``#_____!`0$!`0.``#_____!`("``@.````_P```````&P( +M````____`````!`.``#_____`````!0.``#_____`````!@.``#_____```` +M`!P.``#_____`````#`(``#_____!`0$!#0(``#_____!`("`#@(````____ +M`````&P(``#_`````````#P(``#_____`````$@(``#_____`````$P(``#_ +M____`````&@(``#_____```````.``#_____``````0.``#_____``````@. +M````_P```````&P(````____`````!`.``#_____`````!0.``#_____```` +M`!@.``#_____`````!P.``#_____`````#`(``#_____`````#0(``#_____ +M`````#@(````____`````&P(``#_`````````#P(``#_____`````$@(``#_ +M____`````$P(``#_____`````&@(``#_____```````.``#_____#`P,"@0. +M``#_____"`8$`@@.````_P```````&P(````____`````!`.``#_____#@T, +M"A0.``#_____"`8$`A@.``#_____#@T,"AP.``#_____"`8$`C`(``#_____ +M#`P,"C0(``#_____"`8$`C@(````____`````&P(``#_`````````#P(``#_ +M____#@T,"D@(``#_____"`8$`DP(``#_____#@T,"F@(``#_____"`8$`@`. +M``#_____``````0.``#_____``````@.````_P```````&P(````____```` +M`!`.``#_____`````!0.``#_____`````!@.``#_____`````!P.``#_____ +M`````#`(``#_____`````#0(``#_____`````#@(````____`````&P(``#_ +M`````````#P(``#_____`````$@(``#_____`````$P(``#_____`````&@( +M``#_____```````.``#_____!`0$!`0.``#_____!`("``@.````_P`````` +M`&P(````____`````!`.``#_____!@8&!A0.``#_____!@0"`!@.``#_____ +M`````!P.``#_____`````#`(``#_____!`0$!#0(``#_____!`("`#@(```` +M____`````&P(``#_`````````#P(``#_____!@8&!D@(``#_____!@0"`$P( +M``#_____`````&@(``#_____```````.``#_____``````0.``#_____```` +M``@.````_P```````&P(````____`````!`.``#_____`````!0.``#_____ +M`````!@.``#_____`````!P.``#_____`````#`(``#_____`````#0(``#_ +M____`````#@(````____`````&P(``#_`````````#P(``#_____`````$@( +M``#_____`````$P(``#_____`````&@(``#_____```````.``#_____```` +M``0.``#_____``````@.````_P```````&P(````____`````!`.``#_____ +M`````!0.``#_____`````!@.``#_____`````!P.``#_____`````#`(``#_ +M____`````#0(``#_____`````#@(````____`````&P(``#_`````````#P( +M``#_____`````$@(``#_____`````$P(``#_____`````&@(``#_____```` +M```.``#_____!`0$!`0.``#_____!`("``@.````_P```````&P(````____ +M`````!`.``#_____`````!0.``#_____`````!@.``#_____`````!P.``#_ +M____`````#`(``#_____!`0$!#0(``#_____!`("`#@(````____`````&P( +M``#_`````````#P(``#_____`````$@(``#_____`````$P(``#_____```` +M`&@(``#_____```````.``#_____``````0.``#_____``````@.````_P`` +M`````&P(````____`````!`.``#_____`````!0.``#_____`````!@.``#_ +M____`````!P.``#_____`````#`(``#_____`````#0(``#_____`````#@( +M````____`````&P(``#_`````````#P(``#_____`````$@(``#_____```` +M`$P(``#_____`````&@(``#_____`````#`,``!*K.EI/`P``!B7EPHD```` +M#X`1`"@```"#V_\`0`````0`#```"``````$@`0(```!````"`@```#\```, +M"```"@```!`(``"(4P`0%`@``!`]#`(8"```A0,@`AP(````````(`@````! +M``$D"```!`(Y`"@(````````+`@````````P"````````#0(````````.`@` +M```````\"````````$`(``````$`1`@```````!("````````$P(```````` +M4`@```````!4"````````%@(``":5II67`@``*0E&P!@"```,`+F9F0(```P +M`1\&:`@```````!L"````"`@('`(`````P`#=`@```!``")X"```"`@``'P( +M``#QP_\`@`@``'`P","$"```U00``(@(````````C`@``,``P,R0"`````@` +M`)0(``#^____F`@``!`@,$"<"```4&!P```)````````!`D``",````("0`` +M``````P)```1$1*!``H``,A'T``$"@``#`#_@`@*````@X.,#`H```\2:"X0 +M"@``>+L`E10*```H0!01&`H``!<1B``<"@````\4B2`*`````!85)`H``!(/ +M"P`X``*`E&PA\#@``H"4; +M"(`.``"@)1L(A`X``*`E&V.(#@``H"4;"(P.``"@)1MCT`X``*`E&V/4#@`` +MH"4;8]@.``"@)1MCW`X``*`E&P#@#@``H"4;`.P.``"@)1MKZ`X``$A453$4 +M#P```P```$P/``````````\````#```D````#8`1`"@```"#V_\```@````` +M!(`$"````0````@(````_```#`@```H````0"```B%,`$!0(```0/0P"&`@` +M`(4#(`(<"````````"`(`````0`!)`@```0`.0`H"````````"P(```````` +M,`@````````T"````````#@(````````/`@```````!`"``````!`$0(```` +M````2`@```````!,"````````%`(````````5`@```````!8"```FE::5EP( +M``"D)1L`8`@``#`"YF9D"```,`$?!F@(````````;`@````R,C)P"`````<` +M!W0(````0``B>`@```@(``!\"````````(`(``!P,`C`A`@``-4$``"("``` +M`````(P(``#``,#,D`@````(``"4"```_O___Y@(```0(#!`G`@``%!@<``` +M"0````````0)```C````"`D````````,"0``$1$2@0`*``#(1]``!`H```P` +M_X`("@```(.#C`P*```/$F@N$`H``'B[`)44"@``*$`4$1@*```7$8@`'`H` +M```/%(D@"@`````;&B0*```7$PX)*`H```0"```L"@````#3`'`*````OQ\0 +M=`H```<`````#```0!T'2`0,```15J`#"`P``.0````,#```;&QL;!`,```` +M`(`(%`P````!`$`8#`````"`"!P,`````0!`(`P````````D#````````"@, +M````````+`P````````P#```1*SI:30,``#/4I9&.`P``)19>4D\#```')>7 +M"D`,```_0'P?1`P``+<``0!(#```!P$"[$P,``!_`W\`4`P``!XT5&E4#``` +ME`"\0U@,```>-%1I7`P``)0`/$-@#````````&0,``"+A!91:`P``/\+P$=L +M#```-@```'`,```-`'\L=`P``-L0A@%X#```'P```'P,```2%KD`@`P````! +M`$"$#`````#V((@,`````0!`C`P`````(""0#```(!@2`)0,````````F`P` +M`"`8$@"<#```?W\``*`,````````I`P``(````"H#````````*P,```````` +ML`P```````"T#````````+@,````````O`P``````"C`#````````,0,```` +M````R`P```````#,#````````-`,````````U`P```````#8#```)R2R9-P, +M```R:78`X`P``"(B(@#D#````````.@,```"0V0W[`P```S4ER\`#0``0`<( +M``0-```!!`(`"`T``'^0```,#0```0(!(!`-```S,V.@%`T``$.\,S,8#0`` +M:UN/>BP-``!UF9?,,`T````````T#0```(!@@#@-````````/`T``)-R`@!` +M#0```````$0-````````2`T```````!,#0```````%`-```*%#=D5`T````` +M``!8#0```````%P-``!D(`,P8`T``&C>4T9D#0``/(I1!&@-```!(0``;`T` +M`!8<("IP#0``+C82&'0-```@(BPR>`T``"0\#@``#@``*BHJ*@0.```J*BHJ +M"`X``"HJD`,0#@``*BHJ*A0.```J*BHJ&`X``"HJ*BH<#@``*BHJ*B@.```` +M````,`X``!_<`!`T#@``'XP`$#@.```"`10"/`X``,($%FA`#@```'P``40. +M````2``!2`X``````/M,#@``T2@``%`.```?W``05`X``!^,`!!8#@```@$4 +M`EP.```%#18H8`X```@```!H#@``I"4;`&P.``"@)1MC<`X``*`E&V-T#@`` +MH"4;"'@.``"@)1L(?`X``*`E&PB`#@``H"4;"(0.``"@)1MCB`X``*`E&PB, +M#@``H"4;8]`.``"@)1MCU`X``*`E&V/8#@``H"4;8]P.``"@)1L`X`X``*`E +M&P#L#@``H"4;:Q0/```#````3`\`````````#P````,``"0````-@!$`*``` +M`(/;_P``"````@`$@`0(```#````"`@```#\```,"```"@```!`(``"(4P`0 +M%`@``!`]#`(8"```A0,@`AP(````````(`@````!``$D"```!``Y`"@(```` +M`0`!+`@```0`.0`P"```)R+L`E10*```H0!01 +M&`H``!<1B``<"@````\4B2`*`````!L:)`H``!<3#@DH"@``!`(``"P*```` +M`-,`<`H```"_'Q!T"@``!P`````,``!`'0=(!`P``#-6H`,(#```Y`````P, +M``!L;&QL$`P`````@`@4#`````$`0!@,`````(`('`P````!`$`@#``````` +M`"0,````````*`P````````L#````````#`,``!$K.EI-`P``,]2ED8X#``` +ME%EY23P,````X``*0E&PQ\#@``I"4;#(`.``"D)1L,A`X``*0E +MVV.(#@``I"4;#(P.``"D)=MCT`X``*0EVV/4#@``I"7;8]@.``"D)=MCW`X` +M`*0E&P#@#@``I"4;`.P.``"D)=MO%`\```,```!,#P`````````/`````P`` +M``X``/____\("`@&!`X``/____\&!`0`"`X```#_````````;`@```#___\` +M````$`X``/____\(!@8$%`X``/____\$`@(`&`X``/____\(!@8$'`X``/__ +M__\$`@(`,`@``/____\("`@&-`@``/____\&!`0`.`@```#___\`````;`@` +M`/\`````````/`@``/____\(!@8$2`@``/____\$`@(`3`@``/____\(!@8$ +M:`@``/____\$`@(```X``/____\`````!`X``/____\`````"`X```#_```` +M````;`@```#___\`````$`X``/____\`````%`X``/____\`````&`X``/__ +M__\`````'`X``/____\`````,`@``/____\`````-`@``/____\`````.`@` +M``#___\`````;`@``/\`````````/`@``/____\`````2`@``/____\````` +M3`@``/____\`````:`@``/____\```````X``/____\`````!`X``/____\` +M````"`X```#_````````;`@```#___\`````$`X``/____\`````%`X``/__ +M__\`````&`X``/____\`````'`X``/____\`````,`@``/____\`````-`@` +M`/____\`````.`@```#___\`````;`@``/\`````````/`@``/____\````` +M2`@``/____\`````3`@``/____\`````:`@``/____\```````X``/____\` +M````!`X``/____\`````"`X```#_````````;`@```#___\`````$`X``/__ +M__\`````%`X``/____\`````&`X``/____\`````'`X``/____\`````,`@` +M`/____\`````-`@``/____\`````.`@```#___\`````;`@``/\````````` +M/`@``/____\`````2`@``/____\`````3`@``/____\`````:`@``/____\` +M``````X``/____\`````!`X``/____\`````"`X```#_````````;`@```#_ +M__\`````$`X``/____\`````%`X``/____\`````&`X``/____\`````'`X` +M`/____\`````,`@``/____\`````-`@``/____\`````.`@```#___\````` +M;`@``/\`````````/`@``/____\`````2`@``/____\`````3`@``/____\` +M````:`@``/____\```````X``/____\`````!`X``/____\`````"`X```#_ +M````````;`@```#___\`````$`X``/____\`````%`X``/____\`````&`X` +M`/____\`````'`X``/____\`````,`@``/____\`````-`@``/____\````` +M.`@```#___\`````;`@``/\`````````/`@``/____\`````2`@``/____\` +M````3`@``/____\`````:`@``/____\```````X``/____\`````!`X``/__ +M__\`````"`X```#_````````;`@```#___\`````$`X``/____\`````%`X` +M`/____\`````&`X``/____\`````'`X``/____\`````,`@``/____\````` +M-`@``/____\`````.`@```#___\`````;`@``/\`````````/`@``/____\` +M````2`@``/____\`````3`@``/____\`````:`@``/____\``````````%D! +M`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(`"@`` +M`+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1!``` +M&0`````````:````50(!`!L`````"@8`'````'C##P`=````4!(*`!X```!? +M1`0`'P````$`"``@````%+8``"$`````P`8`(@`````````C````6!4``"0` +M``!@````)0```(,$```F`````/`$`"<```#9QPX`*````,!W!0`I````@T<` +M`"H````!````*P```#03`@`J`````````"L```!4````*@````$````K```` +M"`@``"L````S,P4`+`````P````J`````@```"L````("```*P```#.S!0`L +M````#0```"H````#````*P````@(```K````,S,&`"P````-````*@````0` +M```K````"`@``"L````SLP8`+`````T````J````!0```"L````("```*P`` +M`#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P````-```` +M*@````<````K````"0<``"L````S,P8`+`````T````J````"````"L````* +M!@``*P```#.S!``L````#0```"H````)````*P````H&```K````,S,%`"P` +M```-````*@````H````K````"@8``"L````SLP4`+`````T````J````"P`` +M`"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H&```K```` +M,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+`````T````J +M````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X`$`````\` +M!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y`P(`$``` +M``\``P`1`````/4/`!``````````$0`````````0````#P`(`!$`````\0,` +M$`````\`"0`1`````#$"`!(`````(`,`$@`````0!P`2```````+`!(````` +MP`\`$P```+.'`@`3````MT0"`!,```"K!`(`$P```)_$`0`3````DX0!`!,` +M``";0@$`$P```)D"`0`3````G,(``!,```"@@0``$P```*Q````3````(``` +M`!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0```"3T```5```` +M)/0$`!4````D]`@`%0```"3T#``6````,`,.`!8````P`PH`%@```#`#!@`6 +M````,`,"``````!9`0$`&`````'T``#^`````````/X`````````'P````,` +M"`#^`````````/X`````````'@```%=$!``?```````(``````!9`0,````` +M`%D!`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(` +M"@```+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1 +M!```$@`````@`P`2`````!`'`!(```````L`$@````#`#P`3````KX<"`!,` +M``"W1`(`$P```*L$`@`3````G\0!`!,```"3A`$`$P```)="`0`3````E0(! +M`!,```"8P@``$P```)R!```3````J$```!,````<````%````$R4`0`4```` +M1)0%`!0```!,E`D`%````$24#0`5````)/0``!4````D]`0`%0```"3T"``5 +M````)/0,`!8````P`PX`%@```#`#"@`6````,`,&`!8````P`P(``````%D! +M`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(`"@`` +M`+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1!``` +M&0`````````:````50(!`!L`````"@8`'````'C##P`=````4!(*`!X```!? +M1`0`'P````$`"``@````%+8``"$`````P`8`(@`````````C````6!4``"0` +M``!@````)0```(,$```F`````/`$`"<```#9QPX`*````,!W!0`I````@T<` +M`"H````!````*P```#03`@`J`````````"L```!4````*@````$````K```` +M"`@``"L````S,P4`+`````P````J`````@```"L````("```*P```#.S!0`L +M````#0```"H````#````*P````@(```K````,S,&`"P````-````*@````0` +M```K````"`@``"L````SLP8`+`````T````J````!0```"L````("```*P`` +M`#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P````-```` +M*@````<````K````"0<``"L````S,P8`+`````T````J````"````"L````* +M!@``*P```#.S!``L````#0```"H````)````*P````H&```K````,S,%`"P` +M```-````*@````H````K````"@8``"L````SLP4`+`````T````J````"P`` +M`"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H&```K```` +M,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+`````T````J +M````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X`$`````\` +M!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y`P(`$``` +M``\``P`1`````/4/`!``````````$0`````````0````#P`(`!$`````\0,` +M$`````\`"0`1`````#$"`!(`````(`,`$@`````0!P`2```````+`!(````` +MP`\`$P```+.'`@`3````MT0"`!,```"K!`(`$P```)_$`0`3````DX0!`!,` +M``";0@$`$P```)D"`0`3````G,(``!,```"@@0``$P```*Q````3````(``` +M`!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0````7T```5```` +M!?0$`!4````%]`@`%0````7T#``6````,`,.`!8````P`PH`%@```#`#!@`6 +M````,`,"``````!9`0$`&`````'T``#^`````````/X`````````'P````,` +M"`#^`````````/X`````````'@```%=$!``?```````(``````!9`0,````` +M`%D!`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(` +M"@```+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1 +M!```&0`````````:````50(!`!L`````"@8`'````'C##P`=````4!(*`!X` +M``!?1`0`'P````$`"``@````%+8``"$`````P`8`(@`````````C````6!4` +M`"0```!@````)0```(,$```F`````/($`"<```#9QPX`*````,!W!0`I```` +M@T<``"H````!````*P```#03`@`J`````````"L```!4````*@````$````K +M````"`@``"L````S,P4`+`````P````J`````@```"L````("```*P```#.S +M!0`L````#0```"H````#````*P````@(```K````,S,&`"P````-````*@`` +M``0````K````"`@``"L````SLP8`+`````T````J````!0```"L````("``` +M*P```#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P````- +M````*@````<````K````"0<``"L````S,P8`+`````T````J````"````"L` +M```*!@``*P```#.S!``L````#0```"H````)````*P````H&```K````,S,% +M`"P````-````*@````H````K````"@8``"L````SLP4`+`````T````J```` +M"P```"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H&```K +M````,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+`````T` +M```J````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X`$``` +M``\`!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y`P(` +M$`````\``P`1`````/4/`!``````````$0`````````0````#P`(`!$````` +M\0,`$`````\`"0`1`````#$"`!(`````(`,`$@`````0!P`2```````+`!(` +M````P`\`$P```+.'`@`3````MT0"`!,```"K!`(`$P```)_$`0`3````DX0! +M`!,```";0@$`$P```)D"`0`3````G,(``!,```"@@0``$P```*Q````3```` +M(````!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0```"3T```5 +M````)/0$`!4````D]`@`%0```"3T#``6````,`,.`!8````P`PH`%@```#`# +M!@`6````,`,"``````!9`0$`&`````'T``#^`````````/X`````````'P`` +M``,`"`#^`````````/X`````````'@```%=$!``?```````(``````!9`0,` +M`````%D!`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/ +M!`(`"@```+"M`0`+````9T@%``P````NF0@`#0```"GE```.````YYP#``\` +M``!1!```&0`````````:````50(``!L`````"@8`'````'C##P`=````4!(* +M`!X```!?1`0`'P````$`"``@````%+8``"$`````P`8`(@```#P(```C```` +M6!4``"0```!@````)0```(,$```F`````/`$`"<```#9QPX`*````,!W"0`I +M````@T<``"H````!````*P```#03`@`J`````````"L```!4````*@````$` +M```K````"`@``"L````S,P4`+`````P````J`````@```"L````("```*P`` +M`#.S!0`L````#0```"H````#````*P````@(```K````,S,&`"P````-```` +M*@````0````K````"`@``"L````SLP8`+`````T````J````!0```"L````( +M"```*P```#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P` +M```-````*@````<````K````"0<``"L````S,P8`+`````T````J````"``` +M`"L````*!@``*P```#.S!``L````#0```"H````)````*P````H&```K```` +M,S,%`"P````-````*@````H````K````"@8``"L````SLP4`+`````T````J +M````"P```"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H& +M```K````,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+``` +M``T````J````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X` +M$`````\`!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y +M`P(`$`````\``P`1`````/4/`!``````````$0`````````0````#P`(`!$` +M````\0,`$`````\`"0`1`````#$"`!(`````@`T`$@``````"0`2`````!`% +M`!(`````(`$`$P```+2/`@`3````J$\"`!,```"D!P(`$P```)C'`0`3```` +MI(,!`!,```"80P$`$P```*0!`0`3````F,$``!,```"D@```$P```)A````3 +M`````````!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0````7T +M```5````!?0$`!4````%]`@`%0````7T#``6````,`,.`!8````P`PH`%@`` +M`#`#!@`6````,`,"``````!9`0$`&`````'T``#^`````````/X````````` +M'P````,`"`#^`````````/X`````````'@```%=$!``?```````(``````!9 +M`0,`(`0``(`````C!````````#`$````````,00````````R!````````#,$ +M```!````-`0```0````U!```!0```#8$```&````-P0```<````X!``````` +M`#D$````````.@0````````[!````0```#P$```$````/00```4````^!``` +M!@```#\$```'````0`0``%T```!!!````0```$($````````1`0``!4```!% +M!```\````$8$```/````1P0```````!8!```00```%D$``"H````6@0``'(` +M``!;!```N0```&`$``!F````800``&8```!B!```"````&,$```#````R`0` +M`/\```#)!```"````,P$``#_````S00``/\```#.!````0`````%```F```` +M`04``*(````"!0``+P````,%````````!`4``"@````%!0``HP````8%``!> +M````!P4````````(!0``*P````D%``"D````"@4``%X````+!0````````P% +M``!/````#04``*0````.!0````````\%````````$@4``!P````4!0``"@`` +M`!4%```0````%@4```H````7!0``$````!H%```6````)`4```\````E!0`` +M3P```$8%``!`````1P4```````!0!0``$````%$%```0````604```(```!: +M!0```@```%T%``#_````!08``#`````(!@``#@````D&```J````4@8``"`` +M```\!@``"@```#T&```.````/@8```H````_!@``#@```&X&```%``````<` +M`"$````!!P``0P````('``!E`````P<``(<````(!P``(0````D'``!#```` +M"@<``&4````+!P``AP```'@,```!``![>`P```$``7MX#````0`">W@,```! +M``-[>`P```$`!'MX#````0`%>W@,```!``9Z>`P```$`!WEX#````0`(>'@, +M```!``EW>`P```$`"G9X#````0`+=7@,```!``QT>`P```$`#7-X#````0`. +M`P```$`$'!X#````0`1;W@,```!`!)N>`P```$`$VUX#``` +M`0`4;'@,```!`!5K>`P```$`%FIX#````0`7:7@,```!`!AH>`P```$`&6=X +M#````0`:9G@,```!`!ME>`P```$`'&1X#````0`=8W@,```!`!YB>`P```$` +M'V%X#````0`@8'@,```!`"%)>`P```$`(DAX#````0`C1W@,```!`"1&>`P` +M``$`)45X#````0`F1'@,```!`"=#>`P```$`*$)X#````0`I07@,```!`"I` +M>`P```$`*R9X#````0`L)7@,```!`"TD>`P```$`+B-X#````0`O(G@,```! +M`#`A>`P```$`,2!X#````0`R!G@,```!`#,%>`P```$`-`1X#````0`U`W@, +M```!`#8">`P```$`-P%X#````0`X`'@,```!`#D`>`P```$`.@!X#````0`[ +M`'@,```!`#P`>`P```$`/0!X#````0`^`'@,```!`#\`>`P```$`0'MX#``` +M`0!!>W@,```!`$)[>`P```$`0WMX#````0!$>W@,```!`$5[>`P```$`1GIX +M#````0!'>7@,```!`$AX>`P```$`27=X#````0!*=G@,```!`$MU>`P```$` +M3'1X#````0!-`P```$`3W%X#````0!0<'@,```!`%%O>`P` +M``$`4FYX#````0!3;7@,```!`%1L>`P```$`56MX#````0!6:G@,```!`%=I +M>`P```$`6&AX#````0!99W@,```!`%IF>`P```$`6V5X#````0!<9'@,```! +M`%UC>`P```$`7F)X#````0!?87@,```!`&!@>`P```$`84EX#````0!B2'@, +M```!`&-'>`P```$`9$9X#````0!E17@,```!`&9$>`P```$`9T-X#````0!H +M0G@,```!`&E!>`P```$`:D!X#````0!K)G@,```!`&PE>`P```$`;21X#``` +M`0!N(W@,```!`&\B>`P```$`<"%X#````0!Q('@,```!`'(&>`P```$``P```$`=@)X#````0!W`7@,```!`'@`>`P```$` +M>0!X#````0!Z`'@,```!`'L`>`P```$`?`!X#````0!]`'@,```!`'X`>`P` +M``$`?P!X#```'@``.'@,```>``$X>`P``!X``CAX#```'@`#.'@,```>``0X +M>`P``!X`!3AX#```'@`&.'@,```>```P``!X`"#AX#```'@`)/'@,```> +M``H^>`P``!X`"T!X#```'@`,1'@,```>``U(>`P``!X`#DQX#```'@`/4'@, +M```>`!!2>`P``!X`$59X#```'@`26G@,```>`!->>`P``!X`%&!X#```'@`5 +M8'@,```>`!9@>`P``!X`%V)X#```'@`88G@,```>`!EB>`P``!X`&F)X#``` +M'@`;8G@,```>`!QB>`P``!X`'6)X#```'@`>8G@,```>`!]B>`P```$``'MX +M#````0`!>W@,```!``)[>`P```$``WMX#````0`$>W@,```!``5[>`P```$` +M!GIX#````0`'>7@,```!``AX>`P```$`"7=X#````0`*=G@,```!``MU>`P` +M``$`#'1X#````0`-`P```$`#W%X#````0`0<'@,```!`!%O +M>`P```$`$FYX#````0`3;7@,```!`!1L>`P```$`%6MX#````0`6:G@,```! +M`!=I>`P```$`&&AX#````0`99W@,```!`!IF>`P```$`&V5X#````0`<9'@, +M```!`!UC>`P```$`'F)X#````0`?87@,```!`"!@>`P```$`(4EX#````0`B +M2'@,```!`"-'>`P```$`)$9X#````0`E17@,```!`"9$>`P```$`)T-X#``` +M`0`H0G@,```!`"E!>`P```$`*D!X#````0`K)G@,```!`"PE>`P```$`+21X +M#````0`N(W@,```!`"\B>`P```$`,"%X#````0`Q('@,```!`#(&>`P```$` +M,P5X#````0`T!'@,```!`#4#>`P```$`-@)X#````0`W`7@,```!`#@`>`P` +M``$`.0!X#````0`Z`'@,```!`#L`>`P```$`/`!X#````0`]`'@,```!`#X` +M>`P```$`/P!X#````0!`>W@,```!`$%[>`P```$`0GMX#````0!#>W@,```! +M`$1[>`P```$`17MX#````0!&>G@,```!`$=Y>`P```$`2'AX#````0!)=W@, +M```!`$IV>`P```$`2W5X#````0!,='@,```!`$US>`P```$`3G)X#````0!/ +M<7@,```!`%!P>`P```$`46]X#````0!2;G@,```!`%-M>`P```$`5&QX#``` +M`0!5:W@,```!`%9J>`P```$`5VEX#````0!8:'@,```!`%EG>`P```$`6F9X +M#````0!;97@,```!`%QD>`P```$`76-X#````0!>8G@,```!`%]A>`P```$` +M8&!X#````0!A27@,```!`&)(>`P```$`8T=X#````0!D1G@,```!`&5%>`P` +M``$`9D1X#````0!G0W@,```!`&A">`P```$`:4%X#````0!J0'@,```!`&LF +M>`P```$`;"5X#````0!M)'@,```!`&XC>`P```$`;R)X#````0!P(7@,```! +M`'$@>`P```$`<@9X#````0!S!7@,```!`'0$>`P```$`=0-X#````0!V`G@, +M```!`'`P```$`>`!X#````0!Y`'@,```!`'H`>`P```$`>P!X#````0!\ +M`'@,```!`'T`>`P```$`?@!X#````0!_`'@,```>```X>`P``!X``3AX#``` +M'@`".'@,```>``,X>`P``!X`!#AX#```'@`%.'@,```>``8X>`P``!X`!SAX +M#```'@`(.'@,```>``D\>`P``!X`"CYX#```'@`+0'@,```>``Q$>`P``!X` +M#4AX#```'@`.3'@,```>``]0>`P``!X`$%)X#```'@`15G@,```>`!):>`P` +M`!X`$UYX#```'@`48'@,```>`!5@>`P``!X`%F!X#```'@`78G@,```>`!AB +M>`P``!X`&6)X#```'@`:8G@,```>`!MB>`P``!X`'&)X#```'@`=8G@,```> +M`!YB>`P``!X`'V)X#````0``>W@,```!``%[>`P```$``GMX#````0`#>W@, +M```!``1[>`P```$`!7MX#````0`&>W@,```!``=[>`P```$`"'MX#````0`) +M>G@,```!``IY>`P```$`"WAX#````0`,=W@,```!``UV>`P```$`#G5X#``` +M`0`/='@,```!`!!S>`P```$`$7)X#````0`2<7@,```!`!-P>`P```$`%&]X +M#````0`5;G@,```!`!9M>`P```$`%VQX#````0`8:W@,```!`!EJ>`P```$` +M&FEX#````0`;:'@,```!`!QG>`P```$`'69X#````0`>97@,```!`!]D>`P` +M``$`(&-X#````0`A8G@,```!`")A>`P```$`(V!X#````0`D1G@,```!`"5% +M>`P```$`)D1X#````0`G0W@,```!`"A">`P```$`*4%X#````0`J0'@,```! +M`"LF>`P```$`+"5X#````0`M)'@,```!`"XC>`P```$`+R)X#````0`P(7@, +M```!`#$@>`P```$`,@9X#````0`S!7@,```!`#0$>`P```$`-0-X#````0`V +M`G@,```!`#`P```$`.`!X#````0`Y`'@,```!`#H`>`P```$`.P!X#``` +M`0`\`'@,```!`#T`>`P```$`/@!X#````0`_`'@,```!`$![>`P```$`07MX +M#````0!">W@,```!`$-[>`P```$`1'MX#````0!%>W@,```!`$9[>`P```$` +M1WMX#````0!(>W@,```!`$EZ>`P```$`2GEX#````0!+>'@,```!`$QW>`P` +M``$`379X#````0!.=7@,```!`$]T>`P```$`4'-X#````0!1`P```$`4W!X#````0!4;W@,```!`%5N>`P```$`5FUX#````0!7;'@,```! +M`%AK>`P```$`66IX#````0!::7@,```!`%MH>`P```$`7&=X#````0!=9G@, +M```!`%YE>`P```$`7V1X#````0!@8W@,```!`&%B>`P```$`8F%X#````0!C +M8'@,```!`&1&>`P```$`945X#````0!F1'@,```!`&=#>`P```$`:$)X#``` +M`0!I07@,```!`&I`>`P```$`:R9X#````0!L)7@,```!`&TD>`P```$`;B-X +M#````0!O(G@,```!`'`A>`P```$`<2!X#````0!R!G@,```!`',%>`P```$` +M=`1X#````0!U`W@,```!`'8">`P```$`=P%X#````0!X`'@,```!`'D`>`P` +M``$`>@!X#````0![`'@,```!`'P`>`P```$`?0!X#````0!^`'@,```!`'\` +M>`P``!X``#AX#```'@`!.'@,```>``(X>`P``!X``SAX#```'@`$.'@,```> +M``4X>`P``!X`!CAX#```'@`'.'@,```>``@X>`P``!X`"3QX#```'@`*/G@, +M```>``M`>`P``!X`#$1X#```'@`-2'@,```>``Y,>`P``!X`#U!X#```'@`0 +M4G@,```>`!%6>`P``!X`$EIX#```'@`37G@,```>`!1@>`P``!X`%6!X#``` +M'@`68'@,```>`!=B>`P``!X`&&)X#```'@`98G@,```>`!IB>`P``!X`&V)X +M#```'@`<8G@,```>`!UB>`P``!X`'F)X#```'@`?8@(````!````"P````(` +M```!````*PD``"H)```!`````0````$````!````!P````<````H`````0`` +M``$````!`````0````4````3`````@````,````!`````0````(````"```` +M`@```'`P``#8,0````````````````````````````````````````````"0 +M3`$````````````````````````````````````````````````````````` +M`````````````````````````````````````````P#:"Y&!```````````` +M```````#`-H+=H$```````````````````,`V@MP@0`````````````````` +M`P#:"WZ!```````````````````#`-H+>H$```````````````````,`V@M[ +M@0```````````````````P#:"WV!```````````````````#`-H+5(<````` +M``````````````,`V@M_@0```````````````````P#:"XJ!```````````` +M```````#`-H+=X$```````````````````,`V@MX@0`````````````````` +M`P#:"WR!```````````````````#`-H+AH$```````````````````,`&2`7 +M[0```````````````````P#V#5(````````````````````#`))S$7@````` +M``````````````,`N`>)@0```````````````````P"P#G&0```````````` +M```````#`/@&,^````````````````````,`/!`I%@`````````````````` +M`P`!(`@S```````````````````#``T%`A$```````````````````,`&2`J +MJP```````````````````P#T((MD```````````````````#`%5(D``````` +M``````````````,`TQ-7,P```````````````````P#V#5P````````````` +M```````#`-H+B%````````````````````,`5DB1```````````````````` +M`P!&F$&0```````````````````#`$8(09````````````````````,`&2`" +M20```````````````````P`9("ZK```````````````````#`-,363,````` +M``````````````,`TQ-8,P```````````````````P#R!/>O```````````` +M```````#`/($^:\```````````````````,`\@3ZKP`````````````````` +M`P`9(`$2```````````````````#`/($^*\```````````````````,`\@3[ +MKP```````````````````P#R!/RO```````````````````#`!D@`1(````` +M``````````````,``2`',P```````````````````P`!(`HS```````````` +M```````#``$@"3,```````````````````,`A@4?-``````````````````` +M`P"2`&#L +M4P#`V*<`@(U;`$!4B0``&[<`@*@2`0`V;@$`424"`&S<`H#Y-P/T2```)$D` +M`&1*``!L2@``>$H``(!*``",2@``G$H``*1*```X`!P`%0```,!1`0"@4@$` +MN!\````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H +M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H +M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H +M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H +M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H +M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H +M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H +M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N +M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,`!!*@```&%E +M86)I``$@````!36UT86(` +M+G-T6UT86(`+D%232YE>'1A8@`N&ED>``N +M````"0``````````````V(0&`$`````5````"0````0````(````;`````$` +M```"`````````#`9!``8```````````````$`````````'L````!``!P@@`` +M``````!(&00`&!T```$`````````!`````````!W````"0`````````````` +M&(4&`%`>```5````#`````0````(````B@````$````#`````````&`V!``0 +M4P$````````````$`````````(8````)``````````````!HHP8`.`4``!4` +M```.````!`````@```"0````"`````,`````````<(D%`(@\```````````` +M``@`````````E0````$``````````````'")!0"L`@`````````````!```` +M`````)X````#``!P```````````,!0"^```````````````!``````````$````"```````` +M``````"@J`8`,,```!8````["```!````!`````)`````P`````````````` +MT&@'``EM``````````````$`````````R````!S&"0#L````'/8*`/P````< +M=@D`%`$``!R%"``@`0``'(4(`#0!``````<2PL` +M4!X``!SJ"P!D'@``'+`(`&P>``````< +MA0@`J!X``!R:"0"\'@``'-$(`-0>``` +M```$<``"RA``"`1P``'*8(`)1'```KH@``F$<``"RB +M``"@1P``'*8(``A(```KI```#$@``"RD```42```'*8(`%Q(```KI@``8$@` +M`"RF``!D2```'*8(`'1(```KIP``>$@``"RG``"$2```'*8(`,A(```KJ0`` +MS$@``"RI``#42```'*8(`!1)```KJP``&$D``"RK```@20``'*8(`$A)```K +MK0``3$D``"RM``!420``'*8(`'A)```KKP``?$D``"RO``"$20``'*8(`*A) +M```KL0``K$D``"RQ``"T20``'*8(``A*```KLP``#$H``"RS```42@``'*8( +M`#Q*```KM0``0$H``"RU``!(2@``'*8(`&1*```KMP``:$H``"RW``!L2@`` +M*[@``'!*```LN```=$H``!RF"`#$2@``'*8(`,Q*```"@"(5P``'+$(`+Q7```%L``!RQ"`"06P``'+$(`*A;`````````<4`H`9%X``!QV"0"(7@``',8)`,!>```< +M>@@`W%X``!Q0"@`$7P``'($)`"!?```<=`H`9%\``!SM"P"`7P``''8)`)Q? +M```K_```H%\``"S\``"L7P``'(,*`-1?```<+0H`#&```!S?"``<8```'%0( +M`#!@```K`0L`-&```"P!"P!,8```'"8*`(!@```&P``"P7`0"`;```'(,*`*1L +M```<@PH`L&P``"L8`0"T;```+!@!`+AL```<@PH`Z&P``!R#"@`8;0```@,` +M`#!M```&T``"L;`0!\;0``+!L!`(1M``````'(`*`&AX``````''8)``!Y```<)`D`2'D``!R#"@!H>0``'%@(`'!Y```"`P`` +M`'H``!S8"@`X>@``'"D+`(1Z```<)`D`W'H``!S8"@``>P``*U$!``1[```L +M40$`1'L``!S8"@"`>P``'-@(`)Q[```(D```("``"P +MB0``'/8*`,B)```)<``!R#"@"`EP``'$X* +M`)"7```<>@@`F)<``!R!"0"@EP``'%`*`.B7```K@0$`[)<``"R!`0#PEP`` +M*X(!`/27```L@@$`!)@``"N!`0`(F```+($!``R8```K@@$`$)@``"R"`0`< +MF```'(,*`"B8```<'@D`=)@``!R#"@"`F````@(``(28```"`P``B)@```(# +M``",F````@,``)B8``````<-`H` +M2)X``!S&"0"$G@``'#0*`)">``````< +MQ@D`\)X``!PM"@`DGP``'!0*`%B?```<=@D`:)\``!R%"0"4GP``')L)`.B? +M```@L`J*(``!S:"`#(H@``',T(`.RB```KN0L`\*(` +M`"RY"P``HP``'(0(``BC```+D``!PD"0"0@`!+H``!P>"P`D +MN@``'*\(`"RZ```<2@@`<+H``!SF"0!XN@``'"P+`("Z```<>0@`O+H``!SO +M"0#8N@``'#L)`/BZ```<&`H`$+L``!P8"@`DNP``'(4(`#"[```+X``!QW"@"$ +MO@```@,``(B^```"`@``J+X``!Q["@"XO@``''`)`,"^```,<``!S8"`"HQP``'/4)`+3'```"`P``N,<```("``#DQP``')4(`/C' +M```,\``!Q>"0"-```!SU"0#( +MT```'`,)`!#1```<`PD`6-$``!P#"0#0T0``'`,)`.31```<`PD`^-$``!SA +M"0`(T@``'.$)`"32```<-`L`*-(``!S&"0!,T@``'(,(`%S2```<=@D`G-(` +M`"L``@"@T@``+``"`!33```<@PH`&-,``!S&"0`PTP``'(,(`$#3```<=@D` +M3-,``!R;"0!TTP``*P$"`'C3```L`0(`C-,``!QH"P#\TP``'(,*``C4```< +M9`@`%-0``!R;"0!`U```'%D(`%#4```<"`D`;-0``!R#"@"(U```'"0)`)34 +M```<9`@`J-0``!ST"`"\U````@,``,#4```"`@``W-0``!Q9"`#LU```'`@) +M``C5```<@PH`)-4``!PD"0`PU0``'&0(`$35```<]`@`6-4```(#``!-H``"N^`0!\V@`` +M++X!`(3:```<@PH`D-H``!R5"`"DV@``'+8*`-C:``````< +M@`H`7-X``!RQ"`"`W@``'+$(`+#>```-\``!S8"@"PH`^`$!`!QP"0```@$`'*@(`!`"`0``,!`!P# +M"P"(`P$`'+$(`*P#`0`"0`` +M&`$`*YP)``08`0`LG`D`H!@!`!PA"@"L&`$``@(``+`8`0`""0``T!@!`!S- +M"``L&0$`'-$(`'`9`0``0`"4!``(!``!\ +M)0$``@$``(`E`0`"`0``A"4!``(!``"()0$``@$``(PE`0`"`0``,"8!`!S` +M"@!\)@$`',`*`)PG`0`#4!`!R# +M"@"4-0$``@,``.`U`0`<@PH`!#8!`!Q["P`T-@$`',(*`$0V`0`<@PH`B#8! +M`!Q["P"4-@$``@,``)@V`0`"`P``R#8!`!Q4"@#H-@$`'+<*`#`W`0`#`@"4.0$`+-X"`*0Y`0`<@PH`Y#D!`!QT"0#\.0$` +M'.P+``PZ`0`KW@(`$#H!`"S>`@`4.@$`*]T"`!@Z`0`LW0(`)#H!`!R#"@"P +M.@$`'(,*`,0Z`0`"`P``R#H!``("``#,.@$``@,``-`Z`0`"`P``V#H!`"OF +M`@#<.@$`+.8"`/0Z`0`KY@(`^#H!`"SF`@`@.P$`*^8"`"0[`0`LY@(`.#L! +M`"OF`@`\.P$`+.8"`'0[`0`KY@(`>#L!`"SF`@"0.P$`*^8"`)0[`0`LY@(` +MO#L!`"OF`@#`.P$`+.8"`-0[`0`KY@(`V#L!`"SF`@`4/`$`',8)`#0\`0`< +M+0H`G#P!`!QV"0"L/`$`'%@)`,0\`0`$8!``(#``"@1@$`'/$(`&!'`0`<=@D`;$`0`L`0L`1%X!`!PF"@!@7@$`''8)`(!>`0`<=@D`B%X!`!RW"P"H +M7@$`''8)``Q?`0`&`$`'"T*`#QX`0`<+0H`:'@!`!S&"0"P>`$`'/8* +M`-AX`0`<=@D`['@!`!R,"0`$>0$`',8)`#AY`0`0$` +M''8)`'QY`0`0$`'"T*``AZ`0`@$`'(`+`+1Z`0`<6@D`R'H!`!R2"`#L>@$`'+$(``![`0`P$`'+$(`%A[`0`P$`'+$(`)1[`0`'P!`!PD"0!`?0$``@$``$1]`0`"`0`` +M2'T!``(!``!,?0$``@$``(Q]`0`"`0``D'T!``(!``"4?0$``@$``)A]`0`" +M`0``Y'T!``(!``#H?0$``@$``.Q]`0`"`0``\'T!``(!``#T?0$``@$``)!^ +M`0`@L` +M%)`!`!QZ"P`)`!`!S;"0"8D`$`',T(`*"0`0`P,`!)P!`"Q[`P`,G`$`*WP#`!"<`0`L?`,`&)P!`"M]`P``0`<+PH`*)X!`!PO"@!(G@$`'!()`'">`0`<$@D`G)X!`!Q- +M"P#,G@$`'%$+`.B>`0`<+PH`^)X!`!PO"@`$GP$`'!()`!R?`0`<+PH`*)\! +M`!P2"0!`GP$`'"\*`$R?`0`<$@D`:)\!`!P2"0"PGP$`'%$+`-"?`0`<+PH` +MW)\!`!P2"0#TGP$`'"\*``"@`0`<$@D`$*`!`!PO"@`*P!`!P'"0"`K`$`'&P(`*BL`0`K/`L`K*P!`"P\ +M"P`(K0$`'$T+`#"M`0`<;`@`8*T!`!Q-"P"`K0$`*SP+`(2M`0`L/`L`Z*T! +M`!S-"`#\K0$`'!8*`""N`0`<5PD`3*X!`!R/"P",K@$`'+$)`!2O`0`<40L` +M0*\!`!RZ"0!4KP$`'$T+`)BO`0`, +M`0`K\0,`&-X!`"SQ`P`PW@$`')<*`$#>`0`<+0L`6-X!`!R7"@!DW@$`'(,* +M`'C>`0`<$@D`C-X!`!PO"@"@W@$`'"\*`+#>`0`<@PH`S-X!`"OM"@#0W@$` +M+.T*`.S>`0`<>@L`]-X!``(#``#XW@$``@,```SA`0`K_@,`$.$!`"S^`P!0 +MX0$`*_X#`%3A`0`L_@,`B.$!`!RJ"`"HX0$`'*H(`,3A`0`.8!`!SR"@",Y@$`'/(*`*#F`0`<\@H`S.8!`!PO"@#HY@$`'$$+``SG +M`0`/4!`!QN"P", +M]0$`'&X+`,#U`0`<;@L`U/4!`!QN"P#L]0$`'&X+`/SU`0`<@PH`%/8!`!QN +M"P`L]@$`'&X+`$3V`0`<;@L`9/8!`"LH!`!H]@$`+"@$`&SV`0`K*00`00`C"4"`!S& +M"0`4)@(`'`@)`"PF`@`<"`D`F"8"`!R;"0#0)@(`''8)```G`@`00`L#4"`"QY!`#`-0(` +M'/X(`#0V`@`00`6#P"`"QY!`#(/`(`'&X+`-P\`@`<;@L`]#P" +M`!QN"P`(/0(`'&X+`!P]`@`<;@L`,#T"`!QN"P!$/0(`'&X+`%P]`@`KD`0` +M8#T"`"R0!`!T/0(`'"\*`(0]`@`<+PH`F#T"`!PO"@"H/0(`'"\*`+P]`@`< +M+PH`S#T"`!PO"@#00`##\"`!QN"P`@/P(` +M'&X+`#@_`@`<;@L`3#\"`!QN"P!@/P(`'&X+`'0_`@`<;@L`B#\"`!QN"P"@ +M/P(`'*()`.P_`@`<;@L`)$`"`!QN"P!(0`(``@(``(Q``@`$$"`!SR"@#$00(`'&X+`-1!`@`<\@H`Z$$" +M`!SR"@`P0@(`'&X+`$1"`@`<;@L`6$("`!QN"P!L0@(`'&X+`-1"`@`<4@@` +M2$0"`!P2"0`T1P(`'&X+`$Q'`@`<;@L`V$<"`!S2"@",2`(`'*<*`-!(`@`< +M+PH`($D"`!R0"0#(20(`'!()`-A)`@`00`J%("`"QY +M!`"\4@(`*WD$`,!2`@`L>00`W%("`!Q!"P`(4P(`'$$+`'13`@`<$@D`H%," +M`!P2"0#H4P(`'!()``!4`@`<+PH`$%0"`!PO"@`<5`(`'!()`"Q4`@`<+PH` +M.%0"`!P2"0!(5`(`'(,*`%A4`@`"`@``7%0"``(*``!@5`(``@,``&14`@`" +M`P``:%0"``(#``!L5`(``@,``'!4`@`"`P``=%0"``(#``!X5`(``@,``'Q4 +M`@`"`P``@%0"``()``"$5`(``@,``(A4`@`"`P``C%0"``(#``"05`(``@,` +M`)14`@`"`P``F%0"``(#``"<5`(``@,``*!4`@`"`P``I%0"``(#``"H5`(` +M`@,``*Q4`@`"`P``L%0"``(#``"T5`(``@,``+A4`@`"`P``O%0"``(#``#` +M5`(``@,``,14`@`"`P``R%0"``(#``#,5`(``@,``-!4`@`"`P``U%0"``(# +M``#85`(``@,``-Q4`@`"`P``X%0"``(#``#D5`(``@,``.A4`@`"`P``[%0" +M``(#```$5@(``@$```A6`@`"`0``#%8"``(!```05@(``@$``(Q6`@`"`0`` +MD%8"``(!``"45@(``@$``)A6`@`"`0``)%H"`!S&"@!86@(`')L(`,!:`@`< +MQ@H`2%P"`!S&"@"$7`(`'+$(`)A<`@``@``@``@`<60@`W%X"`!RQ"`#P7@(`'+$(`!A?`@`&P"``(!``!\;`(``@$` +M`(!L`@`"`0``A&P"``(!``"(;`(``@$``(QL`@`"`0``Y&P"`!SY"0#P;`(` +M'(@(`#1M`@`<@PH`C&T"`!R#"@"<;0(`'!0*`-!M`@`<>`L`V&T"``(#``#< +M;0(``@,``#AN`@`<@PH`6&X"`!R#"@!L;@(`'"X*`(1N`@`&\"`"SJ!`"(;P(`*^L$`(QO`@`LZP0`E&\"`!R#"@#,;P(`'+$(`-1O`@`< +MZ`@`[&\"``(#``#P;P(``@(``/1O`@`"`P``J'$"`!RP"@#`<0(`'+$(`%!R +M`@``(`'(,*`%QX`@`"`#,>`(`',@)`-1X`@`< +MQ`@`['@"``(#``"0>0(``@$``)1Y`@`"`0``F'D"``(!``"<>0(``@$``*!Y +M`@`"`0``I'D"``(!``"H>0(``@$``*QY`@`"`0``0'L"`!P8"@!8>P(`'(,* +M`%Q[`@`KC0L`9'L"`"R-"P!L>P(`*P$*`'1[`@`L`0H`?'L"`"N>"0"$>P(` +M+)X)`(Q[`@`K"`L`E'L"`"P("P"<>P(`*[X)`*1[`@`LO@D`K'L"`"N&"@"T +M>P(`+(8*`+Q[`@`KX`D`Q'L"`"S@"0#,>P(`*^X+`-1[`@`L[@L`W'L"`"OB +M"P#D>P(`+.(+`.Q[`@`K&@H`]'L"`"P:"@#\>P(`*P8%``1\`@`L!@4`#'P" +M`"LO"P`4?`(`+"\+`!Q\`@`K"P4`)'P"`"P+!0`L?`(`*R`)`#1\`@`L(`D` +M/'P"`"ML"0!$?`(`+&P)`$Q\`@`K:P@`5'P"`"QK"`!)@"`!PJ"0"@F`(`'&8* +M`+B8`@`<$@D`R)@"`!PO"@#8F`(`'!()`.B8`@`<+PH`!)D"`!R7"@`4F0(` +M'$$+`"R9`@`<$@D`/)D"`!PO"@!,F0(`'!()`%R9`@`<+PH`A)D"`!R7"@"4 +MF0(`'$$+`*29`@``@`<+PH`Q)X"`!PO +M"@#LG@(`'-(*`/B>`@``@`K +M`0L`/-X"`"P!"P!,W@(`'"8*`(C>`@`<)@H`D-X"``(!"P#`W@(`'+<+`.C> +M`@`-\"``(!``"@ +MWP(`'+<+`-C?`@`<)@H`,.`"`!RW"P!8X`(`'+<+`+#@`@`<)@H`V.`"`!PF +M"@`,X0(`'+<+`$3A`@`<)@H`G.$"`!RW"P#\X0(`'"8*`&CB`@`0L`\/0"`!PD"0`$]0(`''D+`"#U +M`@`"@#H^@(`')X*`!3[`@`<)`D`+/L"`!P-"@!(^P(` +M')X*`&3[`@``@#`"OW!0!\"`,`+/<%`(`(`P`K^`4` +MA`@#`"SX!0"("`,`'(,*`-`(`P``D#`!RS"0"4"0,`'+<+`)P)`P`!0#`"P.!@"$ +M%`,`'&0)`)04`P`K&08`F!0#`"P9!@"<%`,`'(,*`*04`P`KS0D`J!0#`"S- +M"0"T%`,`*P\&`+@4`P`L#P8`Q!0#`!QD"0#4%`,`*QD&`-@4`P`L&08`W!0# +M`!R#"@#D%`,`*RH*`.@4`P`L*@H`]!0#`"L0!@#X%`,`+!`&``05`P`<9`D` +M%!4#`"L9!@`8%0,`+!D&`!P5`P`<@PH`)!4#`"L^"P`H%0,`+#X+`#05`P`K +M$08`.!4#`"P1!@!$%0,`'&0)`%05`P`K&08`6!4#`"P9!@!<%0,`'(,*`&05 +M`P`KR0@`:!4#`"S)"`!T%0,`*Q(&`'@5`P`L$@8`A!4#`!QD"0"4%0,`*QD& +M`)@5`P`L&08`G!4#`!R#"@"D%0,`*PX)`*@5`P`L#@D`M!4#`"L3!@"X%0,` +M+!,&`,05`P`<9`D`U!4#`"L9!@#8%0,`+!D&`-P5`P`<@PH`Y!4#`"N+"`#H +M%0,`+(L(`/05`P`KH0@`^!4#`"RA"``$%@,`*QD&``@6`P`L&08`#!8#`!R# +M"@`4%@,``@H``!@6`P`"`P``'!8#``(*```@%@,``@@*`"06`P`"`P``@!8# +M`!P]"@"X%@,`'(,*`,`6`P`<,`H`T!8#`!S!"`#X%@,`'!H+`!07`P`K`0L` +M&!<#`"P!"P`L%P,`'"8*`%P7`P`K`0L`8!<#`"P!"P"0%P,`'"8*`/`7`P`< +MG@@`#!@#`!Q."P`X&`,``@,``'@8`P``P`<2PL`-!X#`!S#"0`\'@,`'&P+`)0> +M`P``P`"`P``Y!X#``("``#X'@,`'&D( +M`#P?`P`"D#``(#``"<*0,`*]<&`*`I`P`LUP8`I"D#`!R# +M"@#0*0,`*]@&`-0I`P`LV`8`V"D#`"O9!@#<*0,`+-D&`.`I`P`KV@8`Y"D# +M`"S:!@#P*0,`'(,*`%0J`P`<@PH`8"H#`!R#"@!X*@,`'(,*`+0J`P`"`P`` +MZ"H#`"O>!@#L*@,`+-X&`/0J`P`<#@L`0"L#`!S-"`!0*P,`',T(`(@K`P`< +MXPL`K"L#`!R\"@#8*P,`'(,*``@L`P`<*`L`."P#`!SU"@!,+`,`'(,*`&`L +M`P`<0`H`<"P#`!R#"@"`+`,`',T(`(@L`P`<@PH`F"P#`!P."P"T+`,`'(,* +M`,@L`P`<@PH`W"P#`!P."P#T+`,`'(,*``@M`P`<#@L`'"T#`!R#"@`L+0,` +M'`X+`$@M`P`<@PH`7"T#`!P."P!T+0,`'(,*`(0M`P`<#@L`F"T#`!R#"@"@ +M+0,`'+4+`+@M`P`<]0H`U"T#`!Q?"P#H+0,`'(,*`/@M`P`<7PL`%"X#`!R# +M"@`X+@,`'%$+`%0N`P`<@PH`<"X#`!Q`"@"`+@,`'(,*`(PN`P`<@PH`G"X# +M`!S-"`#$+@,`'(,*`-@N`P`<#@L`X"X#`!R#"@#P+@,`'`X+``@O`P`#T#`"L'!P!\/0,`+`<'`(`]`P`<@PH` +MC#T#`"L%!P"0/0,`+`4'`)0]`P`KV@8`F#T#`"S:!@"!P"L50,`'+$(`/!5 +M`P`PD`&%T#`!S-"``P70,`',T(`$1=`P`"`0``2%T#``(!``!, +M70,``@$``%!=`P`"`0``5%T#`"MK!P!870,`+&L'`&!=`P`K<0<`9%T#`"QQ +M!P!L70,`*W('`'!=`P`L<@<`>%T#`"MS!P!\70,`+','`(Q=`P`<6@H`U%T# +M`!RQ"`#T70,`'+$(`!1>`P``P`"`0`` +M7%X#``(!``!@7@,``@$``&1>`P`"`0``:%X#``(!``!L7@,``@$``'!>`P`" +M`0``=%X#``(!``!X7@,``@$```Q?`P`<>@@`&%\#`!R#"@`@7P,`'($)`"A? +M`P`<4`H`3%\#``(#``!07P,``@(``,1?`P`<&`H`X%\#`!RQ"``$8`,`''T* +M`#A@`P`<;P@`<&`#``(!``!T8`,``@$``'A@`P`"`0``?&`#``(!``"`8`,` +M`@$``(1@`P`"`0``B&`#``(!``",8`,``@$``)!@`P`"`0``E&`#``(!``"8 +M8`,``@$``)Q@`P`"`0``H&`#``(!``"D8`,``@$``*A@`P`"`0``K&`#``(! +M``!,80,``@$``%!A`P`"`0``5&$#``(!``!880,``@$``%QA`P`"`0``8&$# +M``(!``!D80,``@$``&AA`P`"`0``;&$#``(!``!P80,``@$``'1A`P`"`0`` +M>&$#``(!``!\80,``@$``(!A`P`"`0``A&$#``(!``"(80,``@$``"1B`P`K +MSP8`*&(#`"S/!@!<8@,`'`@)`&QB`P`<@PH`F&(#`!RQ"`"L8@,`'(,*`/1B +M`P`KSP8`^&(#`"S/!@`88P,`'(4(`"!C`P`"`P``)&,#``(#``",8P,`'-@* +M`+1C`P`!P#0<`,`+)X'`.AP`P`<#@L`$'$#`!S- +M"``H<0,`'+4+`&1Q`P`<_@@`='$#`!S^"`"(<0,`'/X(`)QQ`P`!P!H<@,`+)X'`(!R`P`<#@L`J'(#`!S-"`#`<@,`'+4+`/QR`P`< +M_@@`#',#`!S^"``@`,`'!@*`"AX`P``,`*\\&`&AX`P`LSP8`@'@#`!RQ"`"D>`,`'-4*`+1X`P``,`*\\&`.!X`P`LSP8`"'D#`"O/!@`,>0,`+,\&`!QY`P`K +ML`<`('D#`"RP!P`H>0,`'(,*`%!Y`P`0,`'(,*`*!Y +M`P`0,``@,``-AY`P`"`@``''H#`!Q["0!D>@,`'.,+ +M`(!Z`P`@,`'(,*`+QZ`P`"`0``P'H#``(!``#$>@,` +M`@$``,AZ`P`"`0``S'H#``(!``#0>@,``@$``-1Z`P`"`0``V'H#``(!``#< +M>@,``@$``.!Z`P`"`0``Y'H#``(!``#H>@,``@$``.QZ`P`"`0``\'H#``(! +M``#T>@,``@$``/AZ`P`"`0``_'H#``(!````>P,``@$```1[`P`"`0``%'L# +M`!R#"@`<>P,`'`,+`"1[`P`<1PD`9'L#`!R#"@"<>P,`'"0)`,1[`P`"P`@L`V)P#``("``#`P`"`P``!)X#``("```( +MG@,``@,``!R>`P`<,`D`3)X#``(!``!0G@,``@$``%2>`P`"`0``6)X#``(! +M``"(G@,`'!`+`)R>`P`<@@D`$)\#`!RZ"``DGP,`'&4+`'"?`P`<_0D`A)\# +M`!S&"0"DGP,`'#P(`-R?`P`<>`L`^)\#`!QV"0!(H`,`')X(`%"@`P`<_0D` +M;*`#`!R,"0"PD` +MX*0#`!S-"`#HI`,`*R4(`.RD`P`L)0@`]*0#`!S^"``@I0,`*R8(`"2E`P`L +M)@@`-*4#`!P."P!4I0,`*R<(`%BE`P`L)P@`8*4#`!S^"`!TI0,`',T(`*2E +M`P`<2@H`N*4#`!R%"`#,I0,`'*H+`-BE`P`<3@L`X*4#`!PD"@#PI0,`'%P( +M`/RE`P`<;`L`#*8#`!R+"P`8I@,`'!\*`"BF`P`<;@@`+*8#`"L!"P`PI@,` +M+`$+`$2F`P`<)@H`4*8#`!QB"0!!(```+V"P"`$@```G@)`(@2```"OP@`D!(```+O"@"8$@```BP*`,`2 +M```"_@L`X!(```+R"`"$&@```AL&`(@:```"\P4`C!H```)C"`"@&@```@`& +M`*@:```"``P`O!H```+Q!0```````@(```@````"]@@`#`````*-"0`0```` +M`FL+`!0````"`@``'`````(?"P`@`````L$+`"0````"PP@`*`````("```P +M`````A\+`#0````"P0L`.`````)1"@`\`````@(``$0````"'PL`2`````+! +M"P!,`````D8(`%`````"`@``6`````(?"P!<`````L$+`&`````"K0D`9``` +M``("``!L`````A\+`'`````"P0L`=`````)""0!X`````@(``(`````"'PL` +MA`````+!"P"(`````F$*`(P````"`@``E`````(?"P"8`````L$+`)P````" +MY`L`H`````("``"H`````A\+`*P````"P0L`L`````+<"`"T`````@(``+P` +M```"'PL`P`````+!"P#$`````G\)`,@````"`@``T`````(?"P#4`````L$+ +M`-@````"\0H`W`````("``#D`````A\+`.@````"P0L`[`````*N"0#P```` +M`@(``/@````"'PL`_`````+!"P```0```J0*``0!```"`@``#`$```(?"P`0 +M`0```L$+`!0!```"&0L`&`$```("```@`0```A\+`"0!```"P0L`*`$```*; +M"@`L`0```@(``#0!```"'PL`.`$```+!"P`\`0```DP*`$`!```"`@``2`$` +M``(?"P!,`0```L$+`%`!```"X@H`5`$```("``!<`0```A\+`&`!```"P0L` +M9`$```+Y"@!H`0```@(``'`!```"'PL`=`$```+!"P!X`0```C8)`'P!```" +M`@``A`$```(?"P"(`0```L$+`(P!```"Q0H`D`$```("``"8`0```A\+`)P! +M```"P0L`H`$```)C"P"D`0```@(``*P!```"'PL`L`$```+!"P"T`0```EX* +M`+@!```"`@``P`$```(?"P#$`0```L$+`,@!```"2`H`S`$```("``#4`0`` +M`BP)`-@!```"R`H`W`$```**"P#@`0```@(``.@!```"+`D`[`$```+("@#P +M`0```L\*`/0!```"`@``_`$```(?"P```@```L$+``0"```"/0D```````(" +M"0`$`````@4```@````"M@L`#`````(%```0`````IH(`!0````"!0``&``` +M``+""0`<`````@4````````J`0````````"T"``(````*@$``!`````J`0`` +M&````"H!```@````*@$``"@````J`0``,````"H!```X````*@$``$`````J +M`0``2````"H!``!0````*@$``%@````J`0``8````"H!``!H````*@$``'`` +M```J`0``>````"H!``"`````*@$``(@````J`0``D````"H!``"8````*@$` +M`*`````J`0``J````"H!``"P````*@$``+@````J`0``P````"H!``#(```` +M*@$``-`````J`0``V````"H!``#@````*@$``.@````J`0``\````"H!``#X +M````*@$````!```J`0``"`$``"H!```0`0``*@$``!@!```J`0``(`$``"H! +M```H`0``*@$``#`!```J`0``.`$``"H!``!``0``*@$``$@!```J`0``4`$` +M`"H!``!8`0``*@$``&`!```J`0``:`$``"H!``!P`0``*@$``'@!```J`0`` +M@`$``"H!``"(`0``*@$``)`!```J`0``F`$``"H!``"@`0``*@$``*@!```J +M`0``L`$``"H!``"X`0``*@$``+@!````M`@`P`$``"H!``#(`0``*@$``-`! +M```J`0``V`$``"H!``#@`0``*@$``.@!```J`0``\`$``"H!``#X`0``*@$` +M```"```J`0``"`(``"H!```0`@``*@$``!@"```J`0``(`(``"H!```H`@`` +M*@$``#`"```J`0``.`(``"H!``!``@``*@$``$@"```J`0``4`(``"H!``!8 +M`@``*@$``&`"```J`0``:`(``"H!``!P`@``*@$``'@"```J`0``@`(``"H! +M``"(`@``*@$``)`"```J`0``F`(``"H!``"@`@``*@$``*@"```J`0``L`(` +M`"H!``"X`@``*@$``,`"```J`0``R`(``"H!``#(`@```+L+`,P"```J!P`` +MT`(``"H!``#8`@``*@$``-@"````M`@`X`(``"H!``#H`@``*@$``/`"```J +M`0``^`(``"H!`````P``*@$```@#```J`0``$`,``"H!```8`P``*@$``"`# +M```J`0``*`,``"H!```P`P``*@$``#@#```J`0``0`,``"H!``!(`P``*@$` +M`%`#```J`0``6`,``"H!``!@`P``*@$``&@#```J`0``:`,```"T"`!P`P`` +M*@$``'@#```J`0``@`,``"H!``"(`P``*@$``)`#```J`0``F`,``"H!``"@ +M`P``*@$``*@#```J`0``L`,``"H!``"X`P``*@$``,`#```J`0``R`,``"H! +M``#0`P``*@$``-@#```J`0``X`,``"H!``#H`P``*@$``/`#```J`0``^`,` +M`"H!````!```*@$````$````M`@`"`0``"H!```0!```*@$``!@$```J`0`` +M(`0``"H!```H!```*@$``#`$```J`0``.`0``"H!``!`!```*@$``$@$```J +M`0``4`0``"H!``!8!```*@$``&`$```J`0``8`0```"T"`!H!```*@$``'`$ +M```J`0``>`0``"H!``"`!```*@$``(@$```J`0``D`0``"H!``"8!```*@$` +M`*`$```J`0``J`0``"H!``"P!```*@$``+@$```J`0``P`0``"H!``#(!``` +M*@$``-`$```J`0``V`0``"H!``#@!```*@$``.@$```J`0``\`0``"H!``#X +M!```*@$````%```J`0``"`4``"H!```0!0``*@$``!@%```J`0``(`4``"H! +M```@!0```+0(`"@%```J`0``,`4``"H!```X!0``*@$``$`%```J`0``2`4` +M`"H!``!0!0``*@$``%@%```J`0``8`4``"H!``!H!0``*@$``'`%```J`0`` +M>`4``"H!``"`!0``*@$``(@%```J`0``D`4``"H!``"8!0``*@$``*`%```J +M`0``J`4``"H!``"P!0``*@$``+@%```J`0``P`4``"H!``#(!0``*@$``-`% +M```J`0``V`4``"H!``#@!0``*@$``.@%```J`0``\`4``"H!``#X!0``*@$` +M```&```J`0``"`8``"H!```0!@``*@$``!@&```J`0``(`8``"H!```H!@`` +M*@$``#`&```J`0``.`8``"H!``!`!@``*@$``$@&```J`0``4`8``"H!``!8 +M!@``*@$``&`&```J`0``:`8``"H!``!P!@``*@$``'@&```J`0``@`8``"H! +M``"(!@``*@$``)`&```J`0``F`8``"H!``"@!@``*@$``*@&```J`0``L`8` +M`"H!``"X!@``*@$``,`&```J`0``R`8``"H!``#0!@``*@$``-@&```J`0`` +MX`8``"H!``#H!@``*@$``/`&```J`0``^`8``"H!````!P``*@$```@'```J +M`0``$`<``"H!```0!P```+0(`!@'```J`0``(`<``"H!```H!P``*@$``#`' +M```J`0``.`<``"H!``!`!P``*@$``$@'```J`0``4`<``"H!``!8!P``*@$` +M`&`'```J`0``:`<``"H!``!P!P``*@$``'@'```J`0``@`<``"H!``"(!P`` +M*@$``)`'```J`0``F`<``"H!``"@!P``*@$``*@'```J`0``L`<``"H!``"X +M!P``*@$``,`'```J`0``R`<``"H!``#0!P``*@$``-@'```J`0``X`<``"H! +M``#H!P``*@$``/`'```J`0``^`<``"H!````"```*@$```@(```J`0``$`@` +M`"H!```8"```*@$``"`(```J`0``*`@``"H!```P"```*@$``#@(```J`0`` +M0`@``"H!``!("```*@$``%`(```J`0``6`@``"H!``!@"```*@$``&@(```J +M`0``<`@``"H!``!X"```*@$``(`(```J`0``B`@``"H!``"0"```*@$``)@( +M```J`0``H`@``"H!``"H"```*@$``+`(```J`0``N`@``"H!``#`"```*@$` +M`,@(```J`0``T`@``"H!``#8"```*@$``.`(```J`0``Z`@``"H!``#P"``` +M*@$``/@(```J`0````D``"H!```("0``*@$``!`)```J`0``&`D``"H!```@ +M"0``*@$``"@)```J`0``,`D``"H!```X"0``*@$``$`)```J`0``2`D``"H! +M``!0"0``*@$``%@)```J`0``8`D``"H!``!H"0``*@$``'`)```J`0``>`D` +M`"H!``"`"0``*@$``(@)```J`0``D`D``"H!``"8"0``*@$``*`)```J`0`` +MJ`D``"H!``"P"0``*@$``+@)```J`0``P`D``"H!``#("0``*@$``-`)```J +M`0``V`D``"H!``#@"0``*@$``.@)```J`0``\`D``"H!``#P"0```+0(`/@) +M```J`0````H``"H!```("@``*@$``!`*```J`0``&`H``"H!```@"@``*@$` +M`"@*```J`0``,`H``"H!```X"@``*@$``$`*```J`0``2`H``"H!``!0"@`` +M*@$``%@*```J`0``8`H``"H!``!H"@``*@$``'`*```J`0``>`H``"H!``"` +M"@``*@$``(@*```J`0``D`H``"H!``"8"@``*@$``*`*```J`0``J`H``"H! +M``"P"@``*@$``+@*```J`0``P`H``"H!``#("@``*@$``-`*```J`0``V`H` +M`"H!``#@"@``*@$``.@*```J`0``\`H``"H!``#X"@``*@$````+```J`0`` +M"`L``"H!```0"P``*@$``!@+```J`0``(`L``"H!```H"P``*@$``#`+```J +M`0``.`L``"H!``!`"P``*@$``$@+```J`0``4`L``"H!``!8"P``*@$``&`+ +M```J`0``:`L``"H!``!P"P``*@$``'@+```J`0``@`L``"H!``"("P``*@$` +M`)`+```J`0``F`L``"H!``"@"P``*@$``*@+```J`0``L`L``"H!``"X"P`` +M*@$``,`+```J`0``R`L``"H!``#("P```+0(`-`+```J`0``V`L``"H!``#@ +M"P``*@$``.@+```J`0``\`L``"H!``#X"P``*@$````,```J`0``"`P``"H! +M```0#```*@$``!@,```J`0``(`P``"H!```H#```*@$``#`,```J`0``.`P` +M`"H!``!`#```*@$``$@,```J`0``4`P``"H!``!8#```*@$``&`,```J`0`` +M:`P``"H!``!P#```*@$``'@,```J`0``@`P``"H!``"`#````+0(`(@,```J +M`0``D`P``"H!``"0#````+0(`)@,```J`0``H`P``"H!``"H#```*@$``+`, +M```J`0``N`P``"H!``#`#```*@$``,@,```J`0``T`P``"H!``#8#```*@$` +M`.`,```J`0``Z`P``"H!``#P#```*@$``/@,```J`0````T``"H!```(#0`` +M*@$``!`-```J`0``&`T``"H!```@#0``*@$``"`-````M`@`*`T``"H!```P +M#0``*@$``#@-```J`0``0`T``"H!``!(#0``*@$``%`-```J`0``6`T``"H! +M``!@#0``*@$``&@-```J`0``<`T``"H!``!X#0``*@$``(`-```J`0``B`T` +M`"H!``"0#0``*@$``)`-````M`@`F`T``"H!``"@#0``*@$``*@-```J`0`` +ML`T``"H!``"X#0``*@$``,`-```J`0``R`T``"H!``#0#0``*@$``-@-```J +M`0``X`T``"H!``#H#0``*@$``/`-```J`0``^`T``"H!````#@``*@$```@. +M```J`0``$`X``"H!```8#@``*@$``"`.```J`0``*`X``"H!```P#@``*@$` +M`#@.```J`0``0`X``"H!``!(#@``*@$``%`.```J`0``6`X``"H!``!@#@`` +M*@$``&@.```J`0``<`X``"H!``!X#@``*@$``(`.```J`0``B`X``"H!``"0 +M#@``*@$``)`.````M`@`F`X``"H!``"@#@``*@$``*@.```J`0``L`X``"H! +M``"X#@``*@$``,`.```J`0``R`X``"H!``#0#@``*@$``-@.```J`0``X`X` +M`"H!``#H#@``*@$``/`.```J`0``^`X``"H!````#P``*@$```@/```J`0`` +M$`\``"H!```8#P``*@$``"`/```J`0``*`\``"H!```P#P``*@$``#@/```J +M`0``0`\``"H!``!(#P``*@$``%`/```J`0``6`\``"H!``!@#P``*@$``&@/ +M```J`0``<`\``"H!``!P#P```+0(`'@/```J`0``@`\``"H!``"(#P``*@$` +M`)`/```J`0``F`\``"H!``"@#P``*@$``*@/```J`0``L`\``"H!``"X#P`` +M*@$``+@/````M`@`P`\``"H!``#(#P``*@$``-`/```J`0``V`\``"H!``#@ +M#P``*@$``.@/```J`0``\`\``"H!``#X#P``*@$````0```J`0``"!```"H! +M```0$```*@$``!@0```J`0``(!```"H!```H$```*@$``#`0```J`0``.!`` +M`"H!``!`$```*@$``$@0```J`0``4!```"H!``!8$```*@$``&`0```J`0`` +M:!```"H!``!P$```*@$``'@0```J`0``@!```"H!``"($```*@$``)`0```J +M`0``F!```"H!``"@$```*@$``*@0```J`0``L!```"H!``"X$```*@$``,`0 +M```J`0``R!```"H!``#0$```*@$``-@0```J`0``X!```"H!``#@$````+0( +M`.@0```J`0``\!```"H!``#X$```*@$````1```J`0``"!$``"H!```0$0`` +M*@$``!@1```J`0``(!$``"H!```H$0``*@$``#`1```J`0``.!$``"H!``!` +M$0``*@$``$@1```J`0``4!$``"H!``!8$0``*@$``&`1```J`0``:!$``"H! +M``!P$0``*@$``'@1```J`0``@!$``"H!``"($0``*@$``)`1```J`0``F!$` +M`"H!``"@$0``*@$``*@1```J`0``L!$``"H!``"X$0``*@$``,`1```J`0`` +MR!$``"H!``#0$0``*@$``-@1```J`0``X!$``"H!``#H$0``*@$``/`1```J +M`0``^!$``"H!````$@``*@$```@2```J`0``$!(``"H!```8$@``*@$``"`2 +M```J`0``*!(``"H!```P$@``*@$``#@2```J`0``0!(``"H!``!($@``*@$` +M`%`2```J`0``6!(``"H!``!8$@```+0(`&`2```J`0``:!(``"H!``!P$@`` +M*@$``'@2```J`0``@!(``"H!``"($@``*@$``)`2```J`0``F!(``"H!``"@ +M$@``*@$``*@2```J`0``L!(``"H!``"X$@``*@$``,`2```J`0``R!(``"H! +M``#0$@``*@$``-@2```J`0``V!(```"T"`#@$@``*@$``.@2```J`0``\!(` +M`"H!``#X$@``*@$````3```J`0``"!,``"H!```0$P``*@$``!@3```J`0`` +M(!,``"H!```H$P``*@$``#`3```J`0``.!,``"H!``!`$P``*@$``$@3```J +M`0``4!,``"H!``!8$P``*@$``&`3```J`0``:!,``"H!``!P$P``*@$``'@3 +M```J`0``>!,```"T"`"`$P``*@$``(@3```J`0``D!,``"H!``"0$P```+0( +M`)@3```J`0``H!,``"H!``"H$P``*@$``+`3```J`0``N!,``"H!``#`$P`` +M*@$``,@3```J`0``T!,``"H!``#8$P``*@$``.`3```J`0``Z!,``"H!``#P +M$P``*@$``/@3```J`0``^!,```"T"```%```*@$```@4```J`0``$!0``"H! +M```8%```*@$``"`4```J`0``*!0``"H!```P%```*@$``#@4```J`0``0!0` +M`"H!``!(%```*@$``%`4```J`0``6!0``"H!``!@%```*@$``&@4```J`0`` +M!8``"H!``!X%@```+0(`(`6```J`0``B!8``"H!``"0 +M%@``*@$``)@6```J`0``H!8``"H!``"H%@``*@$``*@6````M`@`L!8``"H! +M``"X%@``*@$``,`6```J`0``R!8``"H!``#0%@``*@$``-@6```J`0``X!8` +M`"H!``#H%@``*@$``/`6```J`0``^!8``"H!````%P``*@$```@7```J`0`` +M$!<``"H!```8%P``*@$``"`7```J`0``*!<``"H!```P%P``*@$``#@7```J +M`0``0!<``"H!``!(%P``*@$``%`7```J`0``6!<``"H!``!@%P``*@$``&@7 +M```J`0``!@``"H!``"`&```*@$``(@8```J`0``B!@```"T"`"0&```*@$``)@8```J +M`0``H!@``"H!``"H&```*@$``+`8```J`0``N!@``"H!``#`&```*@$``,@8 +M```J`0``T!@``"H!``#8&```*@$``.`8```J`0``Z!@``"H!``#P&```*@$` +M`/@8```J`0```!D``"H!```(&0``*@$``!`9```J`0``$!D```"T"``8&0`` +M*@$``"`9```J`0``*!D``"H!```P&0``*@$``#@9```J`0``0!D``"H!``!( +M&0``*@$``%`9```J`0``6!D``"H!``!@&0``*@$``&@9```J`0``!P``"H!``"`'```*@$``(@<```J`0``D!P``"H!``"8'```*@$``*`<```J +M`0``J!P``"H!``"P'```*@$``+@<```J`0``P!P``"H!``#`'````+0(`,@< +M```J`0``T!P``"H!``#8'```*@$``.`<```J`0``Z!P``"H!``#P'```*@$` +M`/@<```J`0```!T``"H!```('0``*@$``!`=```J`0``!`````(5"0`,```` +M`A4)`!0````"%0D`'`````(5"0`D`````A4)`"P````"%0D`=`````)J"@!\ +M`````J(+`(0````"50L`C`````)/"0"4`````OD(`)P````">@D`I`````+X +M"P"L`````DD(`&P!```",PL`O`$```))"0#$`0```JP+`,P!```"/0@`U`$` +M``*R"P#<`0```@4)`/0!```"```````` +M```!``L```"D'@```````````0`+````L!X```````````$`"P```-`>```` +M```````!``L```#<'@```````````0`+````=!\```````````$`)0`````` +M```+`````0`#``X`````````````````#@`T```````````````$`/'_0P`` +M`(`?``"$`````@`!``L```"`'P```````````0!0````!"```(`````"``$` +M"P````0@```````````!`&````"$(```5`````(``0`+````A"`````````` +M``$`<0```-@@```4`0```@`!``L```#8(````````````0!Z```````````` +M`````!``#@```.@A```````````!`(0```#L(0``,`````(``0`+````["$` +M``````````$`E````!PB```L`````@`!``L````<(@```````````0"D```` +M2"(``"`````"``$`"P```$@B```````````!``L```!H(@```````````0`+ +M````F"(```````````$`"P```"`C```````````!``L```!4(P`````````` +M`0`+````Y",```````````$`L````/`D```L`@```@`!``L```#P)``````` +M`````0`;````#`````````````,`MP```!PG``#,`@```@`!``L````<)P`` +M`````````0"^````Z"D``"P````"``$`"P```.@I```````````!`,8````4 +M*@``+`````(``0`+````%"H```````````$`S0```$`J```4`````@`!``L` +M``!`*@```````````0#2````5"H``,`````"``$`"P```%0J```````````! +M``X````0*P```````````0#;````%"L``"P````"``$`"P```!0K```````` +M```!`.0```!`*P``A`````(``0`+````0"L```````````$`[@```,0K``!D +M`0```@`!``L```#$*P```````````0#Y````*"T``%0!```"``$`"P```"@M +M```````````!``4!``!\+@``J`````(``0`+````?"X```````````$`%@$` +M`"0O``"4`````@`!``L````D+P```````````0`L`0``N"\``!0!```"``$` +M"P```+@O```````````!`$(!``#,,```O`````(``0`+````S#`````````` +M``$`6`$``(@Q```L`````@`!``L```"(,0```````````0`+````M#$````` +M``````$`"P```,0Q```````````!``L```#<,P```````````0`.````;#4` +M``````````$`9`$``'`U``!@!0```@`!``L```!P-0```````````0`+```` +MT#H```````````$`;P$``.0[```H!P```@`!``L```#D.P```````````0`. +M````"$,```````````$`"P````Q#```````````!``X```"<0P`````````` +M`0`+````H$,```````````$`"P```&1$```````````!`'P!```,``````0` +M``$``P`.````#`````````````,`@@$```P$`````0```0`#`(T!```,!0`` +M#`````$``P`.`````````````````!``F0$````````$`````0`0`*L!```$ +M``````0```$`$`"W`0``!`0````(```!`!``Q0$`````````````!`#Q_PL` +M```81@```````````0`+````+$8```````````$`T0$``)`````````````% +M`!$```"H````````````!0`+````O$<```````````$`%@```,`````````` +M```%``L````L2````````````0#6`0````$```````````4`VP$``"P!```` +M```````%``L```"@2````````````0#@`0``1`$```````````4`"P```.Q( +M```````````!`.4!``!L`0``````````!0`+````.$D```````````$`Z@$` +M`)0!```````````%``L```!H20```````````0#O`0``I`$```````````4` +M"P```)A)```````````!`/0!``"T`0``````````!0`+````R$D````````` +M``$`^0$``,P!```````````%``L````L2@```````````0#_`0``"`(````` +M``````4`"P```%Q*```````````!``4"```8`@``````````!0`+`@``'`(` +M``````````4`"P```(A*```````````!`!$"``"@`@``````````!0`7`@`` +MQ`(```````````4`'0(``.P"```````````%`","```0`P``````````!0`I +M`@``)`,```````````4`+P(``%0#```````````%``X````H30`````````` +M`0`+````.$T```````````$`-0(``(`#```````````%`#L"``"(`P`````` +M````!0!!`@``E`,```````````4`1P(``*@#```````````%`$T"``"P`P`` +M````````!0`+````2$X```````````$`4P(``.0#```````````%`'H```#` +M`P``````````#@`.````%$\```````````$`"P```!Q/```````````!`%D" +M``!8`@``````````!0!?`@``B`(```````````4`90(``&0#```````````% +M`&L"```,!```````````!0`+````+%$```````````$`<0(``%P$```````` +M```%`'<"``!T!```````````!0!]`@``C`0```````````4`@P(``*0$```` +M```````%``L```!,4@```````````0")`@``W`0```````````4`CP(```@% +M```````````%``X```!P4P```````````0"5`@``P`,```0````!``X`#@`` +M`,`#```````````.`*@"``#$`P``!`````$`#@"Z`@`````````````$`/'_ +M"P```'A3```````````!``L```"84P```````````0`+````N%,````````` +M``$`"P```-A3```````````!``L```#X4P```````````0`+````&%0````` +M``````$`"P```#A4```````````!``L```!85````````````0`+````>%0` +M``````````$`"P```)A4```````````!``L```"X5````````````0`+```` +M^%0```````````$`"P```!A5```````````!``L```!850```````````0`+ +M````?%4```````````$`"P```)Q5```````````!``L```#`50`````````` +M`0`+````Q%4```````````$`"P```,A5```````````!`,,"```````````` +M``0`\?_5`@`````````````$`/'_"P```!A6```````````!``L````L5@`` +M`````````0`+````F%8```````````$`"P```!Q7```````````!``L```#0 +M5P```````````0`+````)%T```````````$`"P```&!=```````````!``L` +M```$7@```````````0`+````<%X```````````$`"P```(Q?```````````! +M`-$!```@!0``````````!0`+````!&$```````````$`#@```%1C```````` +M```!``L```!P8P```````````0#E`@``)`X``!0````!``,`]`(````````` +M````!`#Q_PL```#T9````````````0!Z````.`X```````````,`"P```'!E +M```````````!``L```#P90```````````0`+````1&8```````````$`"P`` +M`(QF```````````!``L```#D9@```````````0`+````)&<```````````$` +M"P```$!G```````````!``L```"(9P```````````0`+````L&<````````` +M``$`"P```-1G```````````!``L````8:````````````0`+````2&@````` +M``````$`#@```)!I```````````!``L```"4:0```````````0#O`0``2`@` +M``````````4`U@$``/0&```````````%`.4!``"L!P``````````!0`6```` +MM`8```````````4`VP$``"@'```````````%`.`!``!H!P``````````!0#J +M`0``[`<```````````4`#@```!AM```````````!``L````<;0`````````` +M`0`;````R`,```````````X`#@```,QM```````````!``L```#0;0`````` +M`````0`+````+&\```````````$`"P```/QO```````````!``L```!H<``` +M`````````0`+````I'$```````````$`#@```#1R```````````!``L```!( +M<@```````````0`+````*',```````````$`#@```+AS```````````!``L` +M``#,``` +M`````````0`.````<'D```````````$`"P```'1Y```````````!``L```#H +M>@```````````0!Z````6`X```````````,`"P```&A\```````````!``X` +M``"T?````````````0`+````,'T```````````$`5P0``-1]``"X`````@`! +M``L```#4?0```````````0!G!```C'X``.0````"``$`"P```(Q^```````` +M```!``L```!P?P```````````0`+````I'\```````````$`"P```'2````` +M```````!``L```"`@````````````0`.````B((```````````$`"P```*"" +M```````````!``X```#$@P```````````0`+````V(,```````````$`"P`` +M`#R&```````````!``X```#DA@```````````0`+````^(8```````````$` +M"P```*R'```````````!``L```!4B````````````0`+````N(@````````` +M``$`#@```'2)```````````!``L```!\B0```````````0`+````Q(D````` +M``````$`"P```-")```````````!``L````@B@```````````0`+````+(H` +M``````````$`"P```%B*```````````!``L```"LB@```````````0`.```` +M@(L```````````$`"P```)"+```````````!``L```#8BP```````````0#@ +M`0``.`D```````````4`Y0$``%`)```````````%`.H!``!P"0`````````` +M!0`.````K(T```````````$`"P```+"-```````````!``L````,C@`````` +M`````0`+````7(\```````````$`&P````0,```````````0``L```!4DP`` +M`````````0`+````:)0```````````$`#@```#25```````````!``L````X +ME0```````````0!?`@``I`H```````````4`]`$``+0)```````````%`/D! +M``#<"0``````````!0!V!```?`H```````````4`"P(``'@*```````````% +M``X```"`F````````````0`+````D)@```````````$`"P````29```````` +M```!``L```!`F0```````````0`+````')L```````````$`#@```&2=```` +M```````!``L```!HG0```````````0`+````+)X```````````$`"P```#B> +M```````````!``L```"\G@```````````0`+````R)X```````````$`"P`` +M`&2?```````````!``L```!PGP```````````0`+````Y*````````````$` +M"P```'RA```````````!``L```!8H@```````````0`+````>*(````````` +M``$`"P```*2B```````````!``L```"PH@```````````0`+````J*,````` +M``````$`?`0``%@.```'`````0`#``X```!8#@```````````P"(!```8`X` +M``0````!``,`E`0``&0.```6`````0`#`*,$``!\#@``#0````$``P"R!``` +MC`X``!H````!``,`P00``*@.```G`````0`#``X````$#```````````$`#0 +M!```!`P```$````!`!``W`0`````````````!`#Q_PL```"THP`````````` +M`0`+````O*,```````````$`"P```,2C```````````!``L```#,HP`````` +M`````0`+````U*,```````````$`"P```-RC```````````!`'H`````!``` +M````````#@`+````/*0```````````$`"P```$2D```````````!``L```!8 +MI````````````0`;````T`X```````````,`"P```-"D```````````!``L` +M```$I0```````````0`+````#*4```````````$`"P```'BE```````````! +M``L```",I0```````````0`+````G*4```````````$`"P```."E```````` +M```!``L```!,I@```````````0#K!```W*8``*0!```"``$`"P```-RF```` +M```````!`-$!```<"P``````````!0`6````4`L```````````4`#@```'2H +M```````````!``L```"`J````````````0#\!```M*@``'@!```"``$`"P`` +M`+2H```````````!``X````@J@```````````0`+````+*H```````````$` +MX`$``,`+```````````%``X```!(J@```````````0`+````3*H````````` +M``$`%`4``'"J``",`````@`!``L```!PJ@```````````0`.````^*H````` +M``````$`"P```/RJ```````````!``L````8JP```````````0`+````.*L` +M``````````$`"P```,"K```````````!``L```!@K````````````0`.```` +M/+````````````$`"P```'"P```````````!``X`````M````````````0`+ +M````%+0```````````$`"P```*RT```````````!`/\!```(#0`````````` +M!0`%`@``-`T```````````4`"P(``'`-```````````%`'8$``"H#0`````` +M````!0`+````R+4```````````$`"P```"BV```````````!`%D"``#4#0`` +M````````!0!?`@``#`X```````````4`$0(``"`.```````````%`!<"```T +M#@``````````!0`=`@``4`X```````````4`(P(``%P.```````````%`"D" +M``!T#@``````````!0`O`@``B`X```````````4`90(``+`.```````````% +M`#4"``#P#@``````````!0`+````F+<```````````$`)`4```@,```````` +M```0`"X%```\N```H`````(``0`+````/+@```````````$`"P```-RX```` +M```````!``L```#DN@```````````0`.````J+L```````````$`"P```*R[ +M```````````!``X```"`O````````````0`+````A+P```````````$`"P`` +M`"B]```````````!``L```#PO0```````````0`.````A+X```````````$` +M"P```(R^```````````!``L```#8OP```````````0`.````T,(````````` +M``$`"P```-3"```````````!``L```"TPP```````````0`+````.,0````` +M``````$`/@4``)#$```L`P```@`!``L```"0Q````````````0`.````M,<` +M``````````$`"P```+S'```````````!``L```!DR@```````````0`+```` +M_,H```````````$`30(``'P/```````````%`%P%``"4#P``````````!0`+ +M````-,P```````````$`4P(``*P/```````````%`&(%``#8#P`````````` +M!0`+````+,\```````````$`"P```(#/```````````!``L```"$T``````` +M`````0`+````9-(```````````$`:P(````0```````````%`'$"```H$``` +M````````!0`+````*-0```````````$`#@```+S4```````````!``L```#$ +MU````````````0`.````6-4```````````$`"P``````````````!``X` +M``#\U0```````````0`+`````-8```````````$`"P```,C6```````````! +M``L```#HU@```````````0`+````,-<```````````$`"P```!C8```````` +M```!`'T"``!D$```````````!0`.````9-H```````````$`"P```&C:```` +M```````!``X`````0`````````!``L````\'@$````````` +M`0`+````8!X!``````````$`"P```(0>`0`````````!``L```#`'@$````` +M`````0`+````Y!X!``````````$`"P````P?`0`````````!``L````H'P$` +M`````````0`+````5"`!``````````$`"P```*0@`0`````````!``L````$ +M(0$``````````0`.````E"$!``````````$`"P```*0A`0`````````!``L` +M```4(@$``````````0`+````,",!``````````$`"P```-0C`0`````````! +M``X```#L(P$``````````0`+````D"4!``````````$`"P```/@E`0`````` +M```!``L```!,)@$``````````0`+````F"8!``````````$`"P```*PF`0`` +M```````!``L```#\)@$``````````0`+````0"@`` +M``05```````````#``L````8,P$``````````0`.````5#,!``````````$` +M"P```%@S`0`````````!`/X'``"(,P$`1`````(``0`+````B#,!```````` +M``$`#@```,@S`0`````````!``L```#,,P$``````````0`+````[#,!```` +M``````$`"P`````U`0`````````!``X```"4-0$``````````0`+````F#4! +M``````````$`#@```)0V`0`````````!``L```"<-@$``````````0`+```` +MT#8!``````````$`VP$``+P8```````````%``L```"<-P$``````````0`+ +M````,#@!``````````$`#@```%0Y`0`````````!``L```!8.0$````````` +M`0#J`0``+!D```````````4`Y0$``"09```````````%``X```#$.@$````` +M`````0`."```!!4``!(````!``,`'0@``!@5```=`````0`#`"P(```X%0`` +M$`````$``P`["```2!4``!$````!``,`2@@`````````````!`#Q_PL```#4 +M.@$``````````0!Z````J`4```````````X`"P```'`[`0`````````!``X` +M``"H!0``````````#@!3"``````````````$`/'_"P````P\`0`````````! +M``L```"H/`$``````````0`+````M#P!``````````$`7@@``$@]`0`P`@`` +M`@`!``L```!(/0$``````````0!Z````5`<```````````X`#@```&P_`0`` +M```````!`'`(``!X/P$`3`$```(``0`+````>#\!``````````$`"P```,1` +M`0`````````!``L```!800$``````````0`+````X$$!``````````$`B@@` +M`(Q"`0#P`P```@`!``L```",0@$``````````0`6````Z!D```````````4` +M#@```'1&`0`````````!`)@(``!\1@$`8`$```(``0`+````?$8!```````` +M``$`"P```-Q'`0`````````!``L```!T2`$``````````0`+````R$@!```` +M``````$`#@```!!-`0`````````!``L````@30$``````````0`.````G$T! +M``````````$`"P```*Q-`0`````````!`!L```!<%0```````````P`.```` +MX%0!``````````$`"P```/!4`0`````````!``X````P50$``````````0`+ +M````1%4!``````````$`#@```%!6`0`````````!``L```!D5@$````````` +M`0#O`0``O!H```````````4`#@```(Q;`0`````````!``L```"<6P$````` +M`````0`+````P%\!``````````$`"P```-A?`0`````````!``L`````8`$` +M`````````0`+````0&`!``````````$`"P```&A@`0`````````!`+,(``!4 +M!P``!@````$`#@`.````5`<```````````X`P@@``%P'```"`````0`.`-0( +M``!@!P```@````$`#@#Q"```9`<```8````!``X`!@D`````````````!`#Q +M_PL```"`80$``````````0`+````B&$!``````````$`>@```&05```````` +M```#``L```",8@$``````````0`.````Q&(!``````````$`"P```,AB`0`` +M```````!``L```"D90$``````````0`+````8&8!``````````$`"P```)!F +M`0`````````!``L```#`9@$``````````0`+````-&@```#@3```````````0`!L```!L!P`````` +M````#@`+````!'0!``````````$`"P```#!T`0`````````!``L```#<=`$` +M`````````0`+````D'4!``````````$`"P```*1U`0`````````!``L```#P +M=P$``````````0`+````5'@!``````````$`"P```/AX`0`````````!``L` +M``!P>0$``````````0`+````B'D!``````````$`"P```'QZ`0`````````! +M``X```!`?0$``````````0`+````4'T!``````````$`#@```(Q]`0`````` +M```!``L```"@```#P3```````````0``L```"\DP$````````` +M`0`+````%)0!``````````$`"P```"B4`0`````````!``L````\E`$````` +M`````0`+````>)0!``````````$`"P```*24`0`````````!``L```#(E`$` +M`````````0`+````W)0!``````````$`"P````"5`0`````````!``L```!4 +ME0$``````````0`+````>)4!``````````$`APD``)2>`0`0`````@`!`),) +M``"TG0$`%`````(``0`+````D)8!``````````$`"P```+B6`0`````````! +M``L```#\E@$``````````0`+````C)@```$PS```````````0`)H+``#$O`$`U`(```(``0`+ +M````Q+P!``````````$`T0$```P;```````````%``L```"8OP$````````` +M`0`+````-,(!``````````$`#@```'3"`0`````````!``L```!XP@$````` +M`````0`.````Q,,!``````````$`"P```-S#`0`````````!``X````\Q`$` +M`````````0`+````8,0!``````````$`#@```*C$`0`````````!``L```#D +MQ`$``````````0`1`@``:!T```````````4`%P(``*`=```````````%`!T" +M``#0'0``````````!0`C`@```!X```````````4`*0(``#P>```````````% +M`"\"``!T'@``````````!0!E`@``K!X```````````4`-0(``.@>```````` +M```%`#L"```@'P``````````!0!!`@``6!\```````````4`1P(``(0?```` +M```````%`$T"``"P'P``````````!0!`0`````````!``X```!, +M,P``````````$``L#```3#,```0````!`!``/PP`````````````!`#Q_U$, +M``#\W@$`.`````(``0`+````_-X!``````````$`"P```#3?`0`````````! +M``L````XWP$``````````0`+````[.`!``````````$`"P```/3@`0`````` +M```!`&<,``#\X`$`1`````(``0`+````_.`!``````````$`>@```'P5```` +M```````#``L```!`X0$``````````0`+````;.$!``````````$`"P```-CA +M`0`````````!``L```!@X@$``````````0`+````9.(!``````````$`"P`` +M`&CB`0`````````!``L```"4X@$``````````0`+````F.(!``````````$` +M>0P``*#B`0#T`0```@`!``L```"@X@$``````````0`+````E.0!```````` +M``$`D`P``)CD`0!<`````@`!``L```"8Y`$``````````0`+````].0!```` +M``````$`JPP``'#E`0!$`````@`!``L```!PY0$``````````0`+````M.4! +M``````````$`P0P``-CE`0!,`````@`!``L```#8Y0$``````````0`+```` +M).8!``````````$`V`P``*SF`0!$`````@`!``L```"LY@$``````````0`+ +M````\.8!``````````$`"P```#CG`0`````````!`/`,``#@YP$`S`````(` +M`0`+````X.@```#@7```````````#`*`.``", +M)P(`8`````(``0`+````C"<"``````````$`"P```.PG`@`````````!`*T. +M``#H*0(`6`````(``0`+````Z"D"``````````$`#@```#PJ`@`````````! +M``L```!`*@(``````````0#1`0``7",```````````4`$0```&0C```````` +M```%`!8```!L(P``````````!0`+````A"H"``````````$`"P```-`J`@`` +M```````!`,`.``!4*P(`S`8```(``0`+````5"L"``````````$`U`X``"`R +M`@`D`````@`!``L````@,@(``````````0`+````1#("``````````$`#@`` +M`!0U`@`````````!``L````8-0(``````````0`+````-#4"``````````$` +M\`X``(`U`@#,"@```@`!``L```"`-0(``````````0`;````R`<````````` +M``X`#@```$A``@`````````!``L```!,0`(``````````0`+````L$`"```` +M``````$`Y0$``+0C```````````%`.`!``"P(P``````````!0`.````6%0" +M``````````$`'`\``#@7```&`````0`#``X````X%P```````````P`H#P`` +M0!<``!@````!``,`-`\``%@7```8`````0`#`$`/``!P%P``:`````$``P!, +M#P``V!<```\````!``,`6`\``.@7``"4`````0`#`& +M`@"``````@`!``L```#\7@(``````````0`+````?%\"``````````$`>@`` +M`/08```````````#``X```"880(``````````0`+````G&$"``````````$` +M$0```/`G```````````%`!8````D*```````````!0`+````F&,"```````` +M``$`#@```.QF`@`````````!``L```#T9@(``````````0#;`0``:"@````` +M``````4`#@```$QG`@`````````!``L```!09P(``````````0`+````K&<" +M``````````$`"P````1H`@`````````!``L````@:`(``````````0`T$``` +M]!@```8````!``,`#@```/08```````````#`$`0``#\&```$0````$``P!/ +M$```$!D``!L````!``,`7A``````````````!`#Q_VX0``!(:`(`?`````(` +M`0`+````2&@"``````````$`?1```,1H`@`$`````@`!``L```#$:`(````` +M`````0"*$```R&@"``0````"``$`"P```,AH`@`````````!``L```#,:`(` +M`````````0"8$```0'$"`$`````"``$`HA```/QP`@!$`````@`!`*T0``"X +M<`(`1`````(``0"X$```Z'$"`.`!```"``$`QA```'AP`@!``````@`!`-$0 +M```X<`(`0`````(``0#=$```^&\"`$`````"``$`Z1```"AJ`@`D`@```@`! +M`/@0``#@:0(`2`````(``0`-$0``@&D"`&`````"``$`"P```(!I`@`````` +M```!``L```#@:0(``````````0`+````*&H"``````````$`#@```+AJ`@`` +M```````!``L```#4:@(``````````0`C$0``3&P"`)0!```"``$`#@```$AL +M`@`````````!``L```!,;`(``````````0`.````=&P"``````````$`"P`` +M`)!L`@`````````!``X```#8;0(``````````0`[$0``X&T"`!@"```"``$` +M"P```.!M`@`````````!`.`!```\*0``````````!0#E`0``1"D````````` +M``4`Z@$``$PI```````````%``X```#L;P(``````````0`+````^&\"```` +M``````$`"P```#AP`@`````````!``L```!X<`(``````````0`+````N'`" +M``````````$`"P```/QP`@`````````!``L```!`<0(``````````0`+```` +M@'$"``````````$`"P```.AQ`@`````````!`$T1``#(`(``````````0`+````>'D"``````````$`#@```)!Y`@`````````!``L` +M``"P>0(``````````0`+````7'H"``````````$`@1$``+AZ`@!L`````@`! +M``L```"X>@(``````````0">$0``)'L"``@````"``$`"P```"1[`@`````` +M```!``L````L>P(``````````0"P$0``U(@"`(0````"``$`#@```,A\`@`` +M```````!``L```#,?`(``````````0`.`````'X"``````````$`"P```!!^ +M`@`````````!``L```#H?@(``````````0`.````$(`"``````````$`"P`` +M`""``@`````````!`,81``#H@0(`[`8```(``0`+````Z($"``````````$` +M>@```$`9```````````#``L```#4B`(``````````0#=$0``6(D"`(`````" +M``$`"P```%B)`@`````````!`/,1``#8B0(`D`````(``0`+````V(D"```` +M``````$`"P```&B*`@`````````!``(2``#(B@(`B`````(``0`+````R(H" +M``````````$`#Q(``%"+`@",`````@`!``L```!0BP(``````````0`>$@`` +MW(L"`"@````"``$`"P```-R+`@`````````!``L````$C`(``````````0#@ +M`0``>"L```````````4`Y0$``)0K```````````%``L```"8C`(````````` +M`0`+````=(T"``````````$`#@```)B-`@`````````!``L```!$C@(````` +M`````0`V$@``_(X"`#0````"``$`"P```/R.`@`````````!``L````PCP(` +M`````````0!`$@``3)$"`)0````"``$`"P```$R1`@`````````!`$T2``#@ +MD0(`?`````(``0`+````X)$"``````````$`"P```%R2`@`````````!``X` +M``"`D@(``````````0`+````1),"``````````$`Z@$``*0K```````````% +M`.\!``"\*P``````````!0`.````K*`"``````````$`"P```+"@`@`````` +M```!`&@2``#`H`(`:`````(``0`+````P*`"``````````$`"P```"BA`@`` +M```````!`/D!``#P*P``````````!0`.````/*("``````````$`@!(``$"B +M`@#L`0```@`!``L```!`H@(``````````0`.````(*0"``````````$`F!(` +M`"RD`@"\`@```@`!``L````LI`(``````````0`.````Y*8"``````````$` +M"P```.BF`@`````````!``X```"4J`(``````````0`+````F*@"```````` +M``$`#@````"J`@`````````!``L````$J@(``````````0!9`@``I"P````` +M``````4`7P(``+@L```````````%``X````@N`(``````````0"E$@``0!D` +M``8````!``,`#@```$`9```````````#`+$2``!(&0``!@````$``P"\$@`` +M4!D```0````!``,`R!(``%09```$`````0`#`-02``!8&0``#`````$``P#C +M$@``9!D``!@````!``,`\A(``'P9```-`````0`#``$3``",&0``"`````$` +M`P`,$P``E!D```@````!``,`%Q,``)P9```(`````0`#`"(3``"D&0``%P`` +M``$``P`Q$P`````````````$`/'_01,``$2X`@`<`````@`!``L```!$N`(` +M`````````0`+````8+@"``````````$`3Q,``(2X`@!H`````@`!``L```"$ +MN`(``````````0!;$P``?.D"`#@````"``$`;A,``,R[`@#4$0```@`!``L` +M``#LN`(``````````0"$$P``0,\"`#P:```"``$`DQ,``"RY`@`<`0```@`! +M``L````LN0(``````````0";$P``2+H"`(0!```"``$`"P```$BZ`@`````` +M```!``L```#,NP(``````````0`.````#+P"``````````$`"P```"B\`@`` +M```````!``X````XO0(``````````0`+````5+T"``````````$`#@```/"^ +M`@`````````!``L````4OP(``````````0`.````Z,0"``````````$`"P`` +M``#%`@`````````!``X````0R`(``````````0`+````-,@"``````````$` +MI!,``*#-`@"@`0```@`!``L```"@S0(``````````0`.````V,T"```````` +M``$`"P```/3-`@`````````!``L```!`SP(``````````0`.````W,\"```` +M``````$`"P```/3/`@`````````!``X````DT`(``````````0`+````5-`" +M``````````$`#@```/35`@`````````!``L````@U@(``````````0`.```` +M6-H"``````````$`"P```(3:`@`````````!``X```"0W@(``````````0`+ +M````E-X"``````````$`#@```$S?`@`````````!``L```!\WP(````````` +M`0`+````?.D"``````````$`MA,`````````````!`#Q_PL```"TZ0(````` +M`````0`+````N.D"``````````$`>@```+P9```````````#``L```#@Z0(` +M`````````0`+````(.H"``````````$`"P```&#J`@`````````!``X```"( +MZ@(``````````0`+````G.H"``````````$`"P```,SJ`@`````````!``L` +M```8ZP(``````````0`+````=.L"``````````$`$0```*0M```````````% +M`-$!``!X+0``````````!0`+````B.\"``````````$`"P```&3Q`@`````` +M```!``L```!P\0(``````````0`+````8/("``````````$`QQ,``+P9``!, +M`````0`#``X```"\&0```````````P#2$P`````````````$`/'_"P```(3R +M`@`````````!``L```"T\@(``````````0`.````3/,"``````````$`"P`` +M`%SS`@`````````!``L````P]0(``````````0`.````I/4"``````````$` +M"P```*CU`@`````````!`.,3``````````````0`\?\+````&/<"```````` +M``$`"P```$#W`@`````````!``X```#L]P(``````````0`+````_/<"```` +M``````$`"P```/S[`@`````````!``L```"D_`(``````````0`.````+/T" +M``````````$`"P```##]`@`````````!`/43```(&@``(`````$``P`$%``` +M```````````$`/'_#@```-P)```````````.`!44``````````````0`\?\+ +M````8/T"``````````$`"P```&S]`@`````````!``L```"`_0(````````` +M`0`+````E/T"``````````$`"P```*3]`@`````````!``L```"H_0(````` +M`````0`+````O/T"``````````$`"P```,#]`@`````````!``L```#$_0(` +M`````````0`+````R/T"``````````$`"P```.3]`@`````````!``L````` +M_@(``````````0`+````#/X"``````````$`"P```!C^`@`````````!``L` +M```H_@(``````````0`+````./X"``````````$`"P```%3^`@`````````! +M``L```"`_@(``````````0`+````H/X"``````````$`"P```*C^`@`````` +M```!``L```"P_@(``````````0`+````T/X"``````````$`"P```/#^`@`` +M```````!``L````0_P(``````````0`+````,/\"``````````$`"P```%3_ +M`@`````````!``L```!X_P(``````````0`+````G/\"``````````$`"P`` +M`,#_`@`````````!``L```!,``,``````````0`+````V``#``````````$` +M"P```/```P`````````!``L````(`0,``````````0`+````.`$#```````` +M``$`"P```$P!`P`````````!``L```"$`0,``````````0!Z````8#<````` +M`````!``#@```.`!`P`````````!``L```#H`0,``````````0`.````1`(# +M``````````$`"P```$P"`P`````````!``X```"H`@,``````````0`+```` +ML`(#``````````$`$0```&0N```````````%``L```#0`@,``````````0`+ +M````W`(#``````````$`"P````0#`P`````````!``L````\`P,````````` +M`0`+````2`,#``````````$`"P```)0#`P`````````!``L```#$`P,````` +M`````0`+````]`,#``````````$`"P````@$`P`````````!``L````4!`,` +M`````````0`+````*`0#``````````$`"P```#P$`P`````````!``L```!( +M!`,``````````0`+````2`4#``````````$`"P```%0%`P`````````!``L` +M``!D!0,``````````0`+````E`4#``````````$`"P```*`%`P`````````! +M``L```#(!0,``````````0`+````U`4#``````````$`"P````0&`P`````` +M```!`"44```H&@``$P````$``P`T%```/!H``!$````!``,`0Q0``%`:```8 +M`````0`#``X```!@-P``````````$`!2%```8#<``$@````!`!``8Q0````` +M````````!`#Q_VX4``!P!@,`>`````(``0`+````<`8#``````````$`@!0` +M`.@&`P"@`````@`!``L```#H!@,``````````0`+````B`<#``````````$` +M"P```'`(`P`````````!`-$!``!P+@``````````!0!Z````:!H````````` +M``,`"P```-@(`P`````````!``L```"$"0,``````````0`+````X`D#```` +M``````$`"P```-0*`P`````````!``X`````#`,``````````0`+````#`P# +M``````````$`"P```$`,`P`````````!`(T4``!P#`,`-`````(``0`+```` +M<`P#``````````$`"P```*0,`P`````````!``X```!D#P,``````````0`+ +M````?`\#``````````$`"P```)@/`P`````````!`.4!````+P`````````` +M!0#J`0``#"\```````````4`[P$``!@O```````````%`/0!```@+P`````` +M````!0#Y`0``+"\```````````4`_P$``#PO```````````%``4"``!(+P`` +M````````!0`+`@``5"\```````````4`=@0``%PO```````````%`%D"``!D +M+P``````````!0!?`@``="\```````````4`$0(``(`O```````````%`!<" +M``"0+P``````````!0`=`@``H"\```````````4`&P```*@W```````````0 +M`","``"L+P``````````!0`+````!!$#``````````$`*0(``+@O```````` +M```%`"\"``#$+P``````````!0`U`@``^"\```````````4`#@```!06`P`` +M```````!`*44```H%@,`%`(```(``0`+````*!8#``````````$`#@```#@8 +M`P`````````!``L````\&`,``````````0"Q%```:!H``!,````!``,`P!0` +M`'P:``!0`````0`#``X```"$&@```````````P#/%```S!H``"`````!``,` +M\10``.P:```<`````0`#``\5```(&P``&0````$``P`J%0``)!L``!8````! +M``,`0A4``#P;```9`````0`#`%T5``!8&P``&`````$``P!W%0``@```"!,`0`````````.``L```"8&`,````````` +M`0`7&@``I!@#`(0````"``$`"P```*08`P`````````!`"8:```H&0,`F`$` +M``(``0`+````*!D#``````````$`#@```*P:`P`````````!`#(:``#`&@,` +M)`$```(``0`+````P!H#``````````$`01H``.0;`P`H`````@`!``L```#D +M&P,``````````0`+````#!P#``````````$`VP$``&`Q```````````%`.`! +M``"D,0``````````!0#E`0``K#$```````````4`Z@$``,0Q```````````% +M`.\!``#8,0``````````!0`+````:!P#``````````$`"P```'0<`P`````` +M```!`/0!``#D,0``````````!0#_`0``'#(```````````4`!0(``$PR```` +M```````%``X```!8'0,``````````0!/&@``8!T#`&P````"``$`"P```&`= +M`P`````````!``L```#,'0,``````````0`.````X!X#``````````$`"P`` +M`.@>`P`````````!``L"``!H,@``````````!0!V!```?#(```````````4` +M#@```$0@`P`````````!``L```!((`,``````````0!:&@``;"`#``P````" +M``$`"P```&P@`P`````````!`&L:``!X(`,`C`(```(``0`+````>"`#```` +M``````$`)`4``!@X```````````0`%D"``",,@``````````!0!X&@``7",# +M`)@!```"``$`#@```/PB`P`````````!``L````$(P,``````````0`.```` +M6",#``````````$`"P```%PC`P`````````!`!<"``#@,@``````````!0`= +M`@``"#,```````````4`(P(``!@S```````````%`(<:``!X'0``#`````$` +M`P"6&@``A!T``!,````!``,`I1H``)@=```.`````0`#`+0:``"H'0``#P`` +M``$``P##&@``N!T``#`````!``,`#@```+@=```````````#`-H:```````` +M&@````$`"`#^&@``&@```!H````!``@`(AL``#0````>`````0`(`$H;``!2 +M````'@````$`"`!R&P``($P!`'`````!``X`#@```"!,`0`````````.`'H; +M``"03`$`Q`0```$`#@")&P````````@````!``D`#@`````````````````) +M`*T;```(````"`````$`"0#1&P``$`````@````!``D`^1L``!@````(```` +M`0`)`"$<```8.```!`````$`$``G'``````````````$`/'_-1P``/0D`P!` +M`````@`!``L```#T)`,``````````0`_'```-"4#``@````"``$`"P```#0E +M`P`````````!`$\<```\)0,`4`````(``0`+````/"4#``````````$`7QP` +M`(PE`P!0`````@`!``L```",)0,``````````0`+````W"4#``````````$` +M;QP``"`F`P`<`````@`!``L````@)@,``````````0!^'```/"8#`%0````" +M``$`"P```#PF`P`````````!`(X<``"0)@,`'`````(``0`+````D"8#```` +M``````$`GAP``*PF`P`<`````@`!``L```"L)@,``````````0"O'```R"8# +M`!@````"``$`"P```,@F`P`````````!`,`<``#@)@,`.`````(``0`+```` +MX"8#``````````$`T!P``!@G`P`(`````@`!``L````8)P,``````````0#A +M'```("<#``@````"``$`"P```"`G`P`````````!`.<<```H)P,`"`````(` +M`0`+````*"<#``````````$``QT``#`G`P`(`````@`!``L````P)P,````` +M`````0`:'0``."<#``@````"``$`"P```#@G`P`````````!`#`=``!`)P,` +M"`````(``0`+````0"<#``````````$`/QT``$@G`P`(`````@`!``L```!( +M)P,``````````0!+'0``4"<#``@````"``$`"P```%`G`P`````````!`%<= +M``!8)P,`"`````(``0`+````6"<#``````````$`9!T``&`G`P`(`````@`! +M``L```!@)P,``````````0!M'0``:"<#`(`````"``$`"P```&@G`P`````` +M```!`(0=``#H)P,`I`````(``0`+````Z"<#``````````$`T0$``"PS```` +M```````%`'H```#L'0```````````P`1````0#,```````````4`D!T``(PH +M`P#P`````@`!``L```",*`,``````````0#;`0``X#,```````````4`X`$` +M``0T```````````%``X```!T*0,``````````0`+````?"D#``````````$` +MY0$``"`T```````````%`.\!``!,-```````````!0#Y`0``8#0````````` +M``4`]`$``%0T```````````%``X```"T*@,``````````0"B'0``N"H#`$@` +M```"``$`"P```+@J`P`````````!`/\!``!D-```````````!0"Q'0```"L# +M`$0(```"``$`"P`````K`P`````````!`(\"``#D-0``````````!0#"'0`` +M[#4```````````4`#@```+0R`P`````````!`,@=``!$,P,`1`$```(``0`+ +M````1#,#``````````$`#@```(`T`P`````````!`-8=``"(-`,`K`0```(` +M`0`+````B#0#``````````$`!0(``&PT```````````%``L"``!X-``````` +M````!0!Z!0``3#8```````````4`YQT``+0V```````````%`&@%````-@`` +M````````!0#M'0``5#8```````````4`\QT``)@V```````````%`/D=```$ +M-@``````````!0`.````"#D#``````````$`_QT``#0Y`P#L`0```@`!``L` +M```T.0,``````````0`1'@``[#8```````````4`&P```"@X```````````0 +M``X````(.P,``````````0`7'@``(#L#`(0!```"``$`"P```"`[`P`````` +M```!`"(>``!8-P``````````!0`H'@``;#<```````````4`+AX``'0W```` +M```````%`#0>``!\-P``````````!0`Z'@``C#<```````````4`0!X``(`W +M```````````%``X```"8/`,``````````0!&'@``I#P#`#0````"``$`"P`` +M`*0\`P`````````!`%0>``"@-P``````````!0`+````V#P#``````````$` +M6AX``*@W```````````%`'$"``"4-0``````````!0`+````<#T#```````` +M``$`8!X``,0W```````````%`&8>``"(/@,`&`````(``0`+````B#X#```` +M``````$`=1X``*`^`P"`#````@`!``L```"@/@,``````````0`.````U#X# +M``````````$`"P```!0_`P`````````!`((>``#@-P``````````!0"('@`` +M^#<```````````4`CAX``!`X```````````%`)0>```H.```````````!0": +M'@``0#@```````````4`H!X``%@X```````````%`*8>``!P.``````````` +M!0"L'@``B#@```````````4`LAX``*`X```````````%`+@>``#8.``````` +M````!0"^'@``$#D```````````4`Q!X``"`Y```````````%`,H>``!<.0`` +M````````!0#0'@``=#D```````````4`UAX``(0Y```````````%`-P>``"4 +M.0``````````!0#B'@``H#D```````````4`Z!X``*PY```````````%`.X> +M``"\.0``````````!0#T'@``[#D```````````4`^AX```0Z```````````% +M```?```H.@``````````!0`&'P``4#H```````````4`#!\``'0Z```````` +M```%`!(?``"(.@``````````!0`8'P``N#H```````````4`'A\``"0[```` +M```````%`"0?``!`.P``````````!0`K'P``4#L```````````4`,A\``'@[ +M```````````%`#D?``"D.P``````````!0!`'P``O#L```````````4`1Q\` +M`/0[```````````%`$X?```T/```````````!0!5'P``4#P```````````4` +M7!\``&@\```````````%`&,?``!\/```````````!0!J'P``A#P````````` +M``4`<1\``*@\```````````%`'@?```8/@``````````!0!_'P``*#X````` +M``````4`AA\``#@^```````````%`(T?``!(/@``````````!0"4'P``6#X` +M``````````4`FQ\``&P^```````````%`*(?``"`/@``````````!0"I'P`` +ME#X```````````4`L!\``*@^```````````%`+`P`````````!``L```!\ +M7@,``````````0`.````3%\#``````````$`)B$``%1?`P#4`P```@`!``L` +M``!47P,``````````0`.````<&`#``````````$`"P```+!@`P`````````! +M``X```!,80,``````````0`+````C&$#``````````$`#@```"!C`P`````` +M```!`#4A```H8P,`&`````(``0`+````*&,#``````````$`1R$``$!C`P"H +M`0```@`!``L```!`8P,``````````0!7(0``Z&0#`%0!```"``$`"P```.AD +M`P`````````!``X````X9@,``````````0!G(0``/&8#`(0!```"``$`"P`` +M`#QF`P`````````!`'$,````` +M``````4`KR$``(A#```````````%`+8A``#`9P,`0`$```(``0`+````P&<# +M``````````$`)`4``%11`0`````````.`,`,``````````0!1(@``^'@#`.0````"``$`"P```/AX`P`` +M```````!`&0B``#T0P``````````!0`.````U'D#``````````$`:R(``-QY +M`P!X%````@`!``L```#<>0,``````````0`.````O'H#``````````$`"P`` +M``A[`P`````````!``X```!HB@,``````````0`+````](H#``````````$` +M"P```%2.`P`````````!``X````DCP,``````````0`+````-(\#```````` +M``$`?2(``!Q'```````````%``L```#\D`,``````````0`.````.)$#```` +M``````$`"P```#R1`P`````````!`(0B``!`1P``````````!0`+````=)$# +M``````````$`BR(``#22`P#4`0```@`!``L````TD@,``````````0`.```` +M\),#``````````$`G"(```B4`P"\`@```@`!``L````(E`,``````````0"L +M(@``B$@```````````4`#@```*26`P`````````!`+,B``#$E@,`*`8```(` +M`0`+````Q)8#``````````$`#@```)R8`P`````````!``L```#`F`,````` +M`````0##(@``T$@```````````4`RB(``/1(```````````%`-$B``#\2``` +M````````!0#8(@```$D```````````4`WR(``"1)```````````%`.8B```L +M20``````````!0#M(@``/$D```````````4`]"(``$Q)```````````%`/LB +M``!T20``````````!0`"(P``?$D```````````4`"2,``(!)```````````% +M`!`C``"$20``````````!0`7(P``R$D```````````4`'B,``/A)```````` +M```%`"4C```,2@``````````!0`.````V)P#``````````$`+",``.R<`P`@ +M`0```@`!``L```#LG`,``````````0`.`````)X#``````````$`.R,```R> +M`P"H`````@`!``L````,G@,``````````0`.````3)X#``````````$`"P`` +M`%R>`P`````````!`$LC``#L'0``#`````$``P!:(P``^!T``!$````!``,` +M:2,```P>```.`````0`#`'@C```<'@``$0````$``P"'(P``,!X``!(````! +M``,`EB,``$0>```+`````0`#`*4C``!0'@``#P````$``P"T(P``8!X``!$` +M```!``,`PR,``'0>```0`````0`#`-(C``"$'@``!`````$``P`.````A!X` +M``````````,`WB,``(@>```-`````0`#`.HC``"8'@``#@````$``P#Y(P`` +MJ!X```4````!``,`!"0``+`>```)`````0`#``\D``"\'@``!`````$``P`; +M)```P!X``!,````!``,`*B0``-0>```2`````0`#`#DD``#H'@``%@````$` +M`P!()````!\```0````!``,`5"0```0?```&`````0`#`&`D```,'P``#P`` +M``$``P!O)```'!\``!,````!``,`?B0``#`?```7`````0`#`(TD``!('P`` +M%P````$``P"<)```8!\``!$````!``,`JR0``(0?```0`````0`#`+HD``"4 +M'P``!`````$``P#&)```F!\``!`````!``,`U20``*@?```/`````0`#`.0D +M``"X'P``^`$```$``P`.````5%$!``````````X`]20``,!1`0#@`````0`. +M``(E``"@4@$`<`````$`#@`.````*#@``````````!``%B4``"@X```0```` +M`0`0`" +M`P`````````!``L```#LG@,``````````0`+````_)X#``````````$`"P`` +M``"?`P`````````!``L```!\GP,``````````0`+`````*`#``````````$` +M"P```%B@`P`````````!``L```!\H`,``````````0`+````R*`#```````` +M``$`#@```$BA`P`````````!``L```!,H0,``````````0!Q)0`````````` +M```$`/'_"P```*BA`P`````````!``X````DH@,``````````0`+````**(# +M``````````$`#@```*2B`P`````````!``L```"HH@,``````````0`+```` +M"*,#``````````$`"P```#"C`P`````````!``L```"DHP,``````````0`+ +M````L*,#``````````$`"P```+RC`P`````````!``L```#(HP,````````` +M`0!Z````B#@``````````!``"P```+2D`P`````````!`!8````82P`````` +M````!0#6`0``+$L```````````4`VP$``#1+```````````%``L```#$I0,` +M`````````0`+````Z*4#``````````$`"P```""F`P`````````!``L```!, +MI@,``````````0`+````6*8#``````````$`#@```(@X```````````0`'XE +M``"(.`````0```$`$`".)0`````````````$`/'_"P```&2F`P`````````! +M``L```!LI@,``````````0`+````@*8#``````````$`"P```(2F`P`````` +M```!``L```"(I@,``````````0`+````L*8#``````````$`"P```+RF`P`` +M```````!``L````0IP,``````````0`+````9*@#``````````$`"P```/BH +M`P`````````!``L````HJ0,``````````0";)0``>/\"`"0````2``$`K24` +M`/!W`0!D````$@`!`,(E``#,!@``2`$``!(``0#7)0``'/L!`'0````2``$` +M[24`````````````$````/'D"`.0````2``$` +M'BD``#R4`0`\````$@`!`#8I``"$Y@``'`,``!(``0!!*0``N(@``,0````2 +M``$`8BD``$AR``#@````$@`!`'0I``#(20``9````!(``0"&*0``P/<``,0` +M```2``$`D2D`````````````$````)\I```H`0``(````!(``0"^*0``>,(! +M`&P"```2``$`X"D``(CO`@#<`0``$@`!`/,I``#`P`0````$@`!`),L``!T&`,`)````!(``0"Q+```M"0"`'P````2 +M``$`R"P``&@J`0!0````$@`!`.0L```0IP,`5`$``!(``0#Y+``````````` +M```0````"BT``("A`0`<````$@`!`"$M``#8=P``=````!(``0!#+0``.$T` +M`!`!```2``$`5BT``*1U`0!,`@``$@`!`&DM```P_P(`)````!(``0![+0`` +M@&$!``@````2``$`BRT``'R)``!(````$@`!`*0M`````````````!````"M +M+0``?*`#`$P````2``$`QRT``$QX```L````$@`!`-HM``!`]P(`O````!(` +M`0#Z+0``0.$!`"P````2``$`#"X``+3R`@!\`@``$@`!`#PN```\$P```0`` +M`!$`$`!*+@``R`,!`-P!```2``$`6"X``-@(`P"L````$@`!`&@N``#T'`$` +M3````!(``0!W+@``Q/T"``0````2``$`BBX``#P$`P`,````$@`!`)8N``"\ +MHP,`#````!(``0"H+@``R$L!``0````1``X`N"X`````````````$````,\N +M```$`P,`.````!(``0#=+@``.)X``(0````2``$`]2X``,CJ``!H````$@`! +M``4O``"*(``"P````2``$`@#$`````````````$````)0Q``#X2P$` +M!````!$`#@"B,0``:(H"`&`````2``$`N#$```P?`0`<````$@`!`,LQ``"T +M&0``;`$``!(``0#>,0``:-H``+@!```2``$`\3$``*2B```,````$@`!``0R +M``#H'0``!````!$``P`3,@``R*`#`(0````2``$`+C(``*@!``"<````$@`! +M`$XR``#`#@``G````!(``0!?,@``P&8!`'0````2``$`=3(``-`5`@`$```` +M$@`!`(XR`````````````!````"1,@``H`0``!`````1``X`G3(``"Q1```@ +M`0``$@`!`*\R```HU```G````!(``0"Z,@``X`$``.`!```1``X`RS(``%`6 +M`@!P````$@`!`.DR```$&P$`+````!(``0#],@``W"4#`$0````2``$`&C,` +M`,Q\`@!$`0``$@`!`"\S``!L_0(`%````!(``0!!,P``6'8```0````2``$` +M63,``*R*``#D````$@`!`&8S``#PO0``G````!(``0!Y,P``T(D``%`````2 +M``$`CC,`````````````$````)TS``!,-P``!````!$`$`"],P``?`4``%`! +M```2``$`T#,```SS```T`0``$@`!`.,S``!DH0$`'````!(``0#W,P`````` +M```````0````!C0``$#(`0`8````$@`!`"$T`````````````!`````P-``` +M```````````0````-S0```0,``"D````$@`!`$XT```\.```!````!$`$`!D +M-```9)\```P````2``$`=C0``)@8`P`,````$@`!`)`T``!@K```$`0``!(` +M`0">-``````````````0````I#0``("H```T````$@`!`+,T```T%@(`'``` +M`!(``0#/-````)4!`%0````2``$`Z#0``"@$`P`4````$@`!`/0T``!<\0`` +ML`$``!(``0``-0``+'L"`*`!```2``$`%C4``-2A`0`<````$@`!`"@U``"D +M90$`O````!(``0`]-0``9*@#`)0````2``$`534``"Q&``"0`0``$@`!`&LU +M``"PH@``^````!(``0!_-0``$/\"`"`````2``$`BC4``&A@`0`8`0``$@`! +M`)XU``!X4P``(````!(``0"H-0``!%X``&P````2``$`Q#4``+A4``!````` +M$@`!`-$U```$I0``"````!(``0#:-0``)&H!`-@````2``$`[34``(3X``#$ +M`@``$@`!`/HU```)0! +M`"P````2``$`8S<``.@``0#D````$@`!`((W```\'@$`)````!(``0"=-P`` +MH$,``,0````2``$`K3<`````````````$````+TW``#H>@``@`$``!(``0#3 +M-P``N*(!`!`````2``$`ZS<``'1(`0!4````$@`!``0X``!TD0,`P````!(` +M`0`5.```U$L!``0````1``X`)C@``/QO``!L````$@`!`#`X``"T&@$`4``` +M`!(``0!&.```='D``'0!```2``$`6#@``(0)`P!<````$@`!`&TX``"P-P`` +M!````!$`$`!^.```"`$#`#`````2``$`GS@``%A<`@`$````$@`!`+8X``#4 +M!0,`,````!(``0#$.```&*L``"`````2``$`UC@``+@*``"X````$@`!`.HX +M``"P_@(`(````!(``0#U.```O#<```0````1`!```CD``+R3`0!8````$@`! +M`"`Y``#8X0$`B````!(``0`Z.0``R*(!`)P"```2``$`4CD``)@F`0`4```` +M$@`!`&(Y``#L-P``!````!$`$`!P.0``Q'4"`'P````2``$`ASD``(@I`0!, +M````$@`!`)DY``"\_0(`!````!(``0"I.0``7$H``"P````2``$`OCD`` +M``"@````$@`!`,PY``"D#P(`+`8``!(``0#>.0``N/\``#`!```2``$`[#D` +M```````$````$@`!`/\Y``#T;0$`P`(``!(``0`2.@``!!8``*`````2``$` +M(SH``,0#`P`P````$@`!`#,Z``"L)@$`4````!(``0!$.@``#*4``&P````2 +M``$`4CH``(@$```$````$0`.`%HZ``#L,P$`%`$``!(``0!P.@``=(\!`/0` +M```2``$`A#H``/@E`0!4````$@`!`)8Z``!("`$`N`@``!(``0"A.@``B&<` +M`"@````2``$`KSH``)@/`P!L`0``$@`!`,,Z``!4E0$`)````!(``0#=.@`` +M##P!`)P````2``$`\3H``$@!``!0````$@`!``([``#,G@,`(````!(``0`4 +M.P``U"D!`)0````2``$`+#L``)`=`0`<````$@`!`#H[``#,,P$`(````!(` +M`0!0.P``-,P``/@"```2``$`9SL```1V```$````$@`!`(([``#\U@$`(``` +M`!(``0"5.P``U!4"`!@````2``$`ICL``'AX``!4````$@`!`+\[```H*0$` +M!````!(``0#2.P`````````````0````Y#L``*P#```X````$@`!`/T[```8 +M5@``%````!(``0`//```U#H!`)P````2``$`&SP``!A&```4````$@`!`"X\ +M``"P`@,`(````!(``0!$/```5/\"`"0````2``$`5CP`````````````$``` +M`&4\``!TC0(`B`$``!(``0!T/```E/T"`!`````2``$`@SP``!S;`0#````` +M$@`!`)X\``"X*@$`-````!(``0"M/```L"P!`.@````2``$`PCP``"QO``#0 +M````$@`!`-$\``!P"`,`:````!(``0#D/```Q*4#`"0````2``$`_SP``.@> +M`P!@`0``$@`!``X]``!`(P````0``!$`$``=/0`````````````0````+3T` +M`-`;`0!4````$@`!`#H]```,C@``4`$``!(``0!5/0``A/("`#`````2``$` +M;#T``'BE```4````$@`!`'@]``!4!0,`$````!(``0"$/0``D"L!`#@!```1 +M``X`G#T``)P%```#````$0`.`*H]```DY@$`B````!(``0#-/0``]$L!``0` +M```1``X`WCT``"Q6``!L````$@`!`/@]``!8B@``5````!(``0`0/@``T!`` +M`)0````2``$`(CX``(P%```#````$0`.`"T^`````````````!`````^/@`` +MR)X``)P````2``$`43X``'0%```$````$0`.`&<^``!,``,`C````!(``0!Q +M/@`````````````0````?3X``$@#`P!,````$@`!`),^``"4X@$`!````!(` +M`0"K/@``!&$``&P"```2``$`OSX```"@`P!8````$@`!`-,^```````````` +M`!````#B/@``;.$!`&P````2``$`^SX``"1G```<````$@`!``L_``!,0`(` +M9````!(``0`L/P`````````````0````/3\``,2)```,````$@`!`%4_``"\ +MQP``J`(``!(``0!E/P``I'\``-`````2``$`=S\``.#I`@!`````$@`!`(L_ +M```470(`=`$``!(``0"E/P``9-(``,0!```2``$`N#\``-2$`0"<````$@`! +M`,X_```P=`$`K````!(``0#@/P``5!X``%`````2``$`\S\``!C^`@`0```` +M$@`!``M````PZP``8`$``!(``0`80```R/T"`!P````2``$`)D```/1X`@"$ +M````$@`!`#M````8!0````0``!$``P`_0```"*,#`"@````2``$`5D```#@6 +M`0#8!0``$0`.`'5````(\P$`L`0``!(``0".0```4!`!`.@%```1``X`JD`` +M`&`>`0`D````$@`!`,=```!`!```;````!(``0#?0```3*(!`"P````2``$` +M[D````R"`0"P````$@`!``!!`````````````!`````,00``W-L!`"`#```2 +M``$`($$``(!Q`@!H````$@`!`"M!```0'`$`V`4``!$`#@!*00``7#<```0` +M```1`!``8T$``!!,`0`$````$0`.`')!``#L2P$`!````!$`#@"`00``R!@" +M`)0````2``$`E$$``*R'``"H````$@`!`*%!```HE`$`%````!(``0"V00`` +M@(```+P%```2``$`RD$``*`%`P`H````$@`!`-I!``"<_P(`)````!(``0#L +M00``Q)D!`'0````2``$``D(```P9``"H````$@`!`!9"``!1@``V#P#`)@````2``$`:D8``"@G`0!H!```$0`. +M`()&`````````````!````"/1@``0"L````$```1`!``HD8``$2D```4```` +M$@`!`+%&``!`8`$`*````!(``0#)1@``F%,``"`````2``$`U$8``#`Q`0!H +M!```$0`.`/)&``!L"```I````!(``0`'1P``+,\``%0````2``$`%T<``("G +M`0!(`0``$@`!`"Q'``!T'P``#````!(``0`^1P`````````````0````4$<` +M````````````$````%U'```8"0````0``!$``P!A1P``S'0``/0````2``$` +M<$<``)BH`@!L`0``$@`!`(5'``!4(P``D````!(``0"31P``<#L!`)P````2 +M``$`GT<``*BB`P!@````$@`!`+-'```P_0(`,````!(``0#.1P``<&,``(0! +M```2``$`XT<```@,```&````$0`0`.U'`````````````!````#V1P``L`0` +M``8````1``X``T@``"2$`0"P````$@`!`!E(``!`=@(`L`(``!(``0`P2``` +M#$P!``0````1``X`0T@``%P/``!T`0``$@`!`%5(``"0F```=````!(``0!J +M2``````````````0`````4```,````1``X`H4\``+`R`0`(````$@`!`+A/```` +MU@``R````!(``0#%3P``<(4!`*0)```2``$`W$\``/S[`@"H````$@`!``!0 +M```HO0``R````!(``0`04``````````````0````%U```)BW``"D````$@`! +M`#90```@B@``#````!(``0!*4```\#$!`"P````2``$`7E```.`W```$```` +M$0`0`'!0``#,%0``"`` +M```2``$`I%$``"BA`@`8`0``$@`!`+!1```4)`(`H````!(``0#+40``<+`` +M`*0#```2``$`VE$``+P.`@#<````$@`!`.I1```$=`$`+````!(``0#[40`` +M5`T``,P````2``$`#U(``)@!```0````$@`!`#!2``#,:`(`M````!(``0!' +M4@``R%4``%`````2``$`5%(``+A3```@````$@`!`%]2```,0P``E````!(` +M`0!O4@`````````````0````?5(``,15```$````$@`!`(Y2``"\2P$`!``` +M`!$`#@"E4@``5/X"`"P````2``$`O5(``$`0`0`0````$0`.`-=2```\A@`` +M<`$``!(``0#C4@``:'P``&P!```2``$`!U,``!0(``!8````$@`!`!=3``#8 +M2P$`!````!$`#@`H4P``\'@"``0````2``$`.E,``+0Q```0````$@`!`%)3 +M``#D2P$`!````!$`#@!B4P``C%\``'@!```2``$`;E,``/QJ`0!4````$@`! +M`(I3```0#@(`K````!(``0"C4P``6*`#`"0````2``$`N%,``&B4``#0```` +M$@`!`,]3``!`]```@`,``!(``0#>4P`````````````0````\%,``!Q7``"T +M````$@`!``=4``"$!```!````!$`#@`/5```@/X"`"`````2``$`*%0``!CW +M`@`H````$@`!`$14`````````````!````!+5```K.@!`#0````2``$`:%0` +M`!QM``"T````$@`!`']4``"(I@,`*````!(``0"35```&&@``#`````2``$` +MI%0``$`;`````0``$0`0`+54``!,I@``D````!(``0#-5```G#8!`#0````2 +M``$`UU0``*P%``"H`0``$0`.`.-4`````````````!````#S5``````````` +M```0````"E4``)@G`0`,````$@`!`!]5`````````````!`````I50``=.L" +M`!0$```2``$`.54``%BB```@````$@`!`%)5``!(3@``U````!(``0!D50`` +MU",!`"0"```2``$`>E4``(0!`P!D````$@`!`(U5````-0$`F````!(``0": +M50``F`4```,````1``X`IU4``)`````H````$@`!`+U5``"L-P``!````!$` +M$`#)50`````````````0````UU4``.`)`P#T````$@`!`.Y5```````````` +M`!````#^50``I/T"``0````2``$`#58``*BC```,````$@`!`"!6``"8C`(` +MW````!(``0!"5@``1`(``"0````2``$`8%8``)AS`0!L````$@`!`&U6``"8 +MX@$`"````!(``0")5@``'$P!``0````1``X`D%8``'#Q`@#P````$@`!`*U6 +M```8#0````$``!$``P"R5@``["<"`/P!```2``$`R%8``'0I`0`4````$@`! +M`-Y6`````````````!````#G5@``8/T"``P````2``$`^E8````````````` +M$`````U7```(=@``"````!(``0`M5P``C&8``%@````2``$`.%<``"AS``"D +M````$@`!`%%7``#D(P``#`$``!(``0!D5P``>*(!`!P````2``$`=%<``"0< +M`0!X````$@`!`(17```H'P$`+`$``!(``0".5P``2"`#`"0````2``$`HU<` +M`%AW```$````$@`!`,U7````"P$`0`4``!$`#@#M5P``:.(!`"P````2``$` +M`%@``,0W```$````$0`0``Q8```X_@(`'````!(``0`>6```2`0#```!```2 +M``$`,%@``!!V```\````$@`!`$%8``"$)P$`%````!(``0!16```-,(!`$0` +M```2``$`:U@``/0W```$````$0`0`'I8```(3`$`!````!$`#@"'6```H`4` +M``8````1``X`EE@``'!_```T````$@`!`*)8```@#@``H````!(``0"S6``` +MW`D``+H[```1``X`RU@``#`C`0"D````$@`!`-98``!,=@``!````!(``0#R +M6```]`,#`!0````2``$``5D``/!+`0`$````$0`.`!)9``"TY0$`)````!(` +M`0`J60``3*8#``P````2``$`1%D``%A5```D````$@`!`%59```````````` +M`!````!<60``@/T"`!0````2``$`<5D``#P#`P`,````$@`!`']9```T'``` +M$````!(``0"/60``M$L!``0````1``X`FUD``-PW```$````$0`0`*U9``#8 +MBP``V`$``!(``0#'60``$`D``+`````2``$`TED``&AP```\`0``$@`!`.%9 +M``#H`0,`9````!(``0#R60``!`````0````2``$`!%H``'`'``!8````$0`. +M`"1:`````````````!`````L6@````0``(0````1``X`.5H``&PQ`0`T```` +M$@`!`$U:``"(D`$`4````!(``0!E6@``W$`P`8````$@`!`.%;``!\GP,`A````!(``0#V6P``G&$" +M`/P!```2``$``5P``*C]`@`4````$@`!`!%<``#`2P$`!````!$`#@`>7``` +M!!$#`"0%```2``$`,%P``$!G``!(````$@`!`#U<``#DN@``R````!(``0!2 +M7```1!P``!`"```2``$`85P``*0G`0`0````$@`!`&Y<`````````````!`` +M``!\7```].`!``@````2``$`DUP`````````````$````)E<``#H_P``V`4` +M`!$`#@"R7```,*,#`'0````2``$`QEP``-PS``"4`0``$@`!`-=<``"8+0$` +MJ`$``!(``0#F7```4#<```0````1`!``_EP``#1G`0`T````$@`!`!9=```` +M`````````!`````=70``C&(!`#P````2``$`,ET``-3"``#@````$@`!`$9= +M`````````````!````!570``!"$!`!`!```2``$`8UT``-`"`P`,````$@`! +M`'%=`````````````!````"`70``Z'X"```#```2``$`GET``.3$`0!<`P`` +M$@`!`+==``!`%0````8``!$`$`#*70``:.(``!P$```2``$`V%T``&3*``"8 +M````$@`!`.-=``"`SP``!`$``!(``0#P70``L$`"`$`4```2``$`!UX``)@/ +M`@`,````$@`!`!E>``",!```!````!$`#@`A7@``Y!X!`"@````2``$`,5X` +M`$`=`0`H````$@`!`$%>``"0!```$````!$`#@!-7@`````````````0```` +M6%X``$`S```$````$0`0`&M>```X`0,`%````!(``0!U7@``+$@``'0````2 +M``$`AUX``,PC`@!(````$@`!`)Q>```\&`,`'````!(``0"K7@``&%0``"`` +M```2``$`N%X`````````````$````,)>```$C`(`E````!(``0#07@``H#$! +M`%`````2``$`W5X``(@(`@!$`0``$@`!`/!>``#`"0``^````!(``0`'7P`` +M%(\!`&`````2``$`(%\`````````````$````#)?`````````````!`````_ +M7P``<+H``*`_```1``X`6E\```@$`P`,````$@`!`&=?``#8'0(`8`4``!(` +M`0")7P``R)T!`,P````2``$`FU\`````````````$````*U?```XYP$`J``` +M`!(``0#`7P``;!L"`&P"```2``$`UU\``*24`0`D````$@`!`/!?```@:`(` +M*````!(``0`%8``````````````0````&&```*R[``#8````$@`!`"U@``#\ +M`@$`S````!(``0`[8```:&P!`(P!```2``$`6&```&AG`0`P````$@`!`&M@ +M```4M```F````!(``0!\8```^'@!`'@````2``$`E6```'Q?`@`@`@``$@`! +M`*5@`````````````!````"S8```K&<"`%@````2``$`R6```%@Y`0!\`0`` +M$@`!`-I@```XF@$`Q`(``!(``0#N8``````````````0````_6```%Q<`@"X +M````$@`!``]A`````````````!`````980``@`4```,````1``X`)V$``+!+ +M`0`$````$0`.`#-A``"H40$`&````!$`#@!$80``?'H!`.@$```2``$`36$` +M`(0%```#````$0`.`%MA``"<'`$`+````!(``0!M80``G*4``$0````2``$` +M?F$``$`=````!@``$0`0`(UA``!P!0``!````!$`#@"B80``&$P!``0````1 +M``X`N&$`````````````$````,EA``"0[```%`(``!(``0#880``\.8!`$@` +M```2``$`[F$``*`R`0`(````$@`!``5B``#0.@``%`$``!(``0`58@``"!@" +M`$0````2``$`+6(``#3?`0`$````$@`!`$1B``!LI@,`%````!(``0!?8@`` +M<"P!`$`````2``$`<6(``&1_`0"H`@``$@`!`()B``#,-P``!````!$`$`"7 +M8@`````````````0````JV(`````````````$````,%B``!(6@(`$`(``!(` +M`0#;8@``E`4#``P````2``$`YV(``!PR`0!\````$@`!`/1B```<.```#``` +M`!$`$`#[8@`````,````$@`!`+=E``"D&P$`+````!(``0#-90`` +M$/H``-@%```1``X`YF4``##7``#H````$@`!`/5E``#0:P$`:````!(``0`) +M9@``@!0``&`````2``$`'F8``*0>```,````$@`!`#!F```P%P(`9````!(` +M`0!$9@``D&8!`#`````2``$`5F8``+RC```(````$@`!`&-F``!D1```M`$` +M`!(``0!S9@``X'8#`%@````2``$`DF8``'`8``"<````$@`!`*=F```XJP`` +MB````!(``0"T9@``Q#(!``0````2``$`S68``+`\`0``!0``$0`.`.5F```` +M`````````!````#U9@`````````````0````!V<``-`V`0#,````$@`!`!UG +M``",I0``$````!(``0`I9P```$P!``0````1``X`-&<``/BH`P`P````$@`! +M`%%G`````````````!````!89P``:!P#``P````2``$` +M:0``S`$!`#`!```2``$`,&D``$@S```$````$0`0`$5I``!@70``I````!(` +M`0!D:0``J/X"``@````2``$`<&D``)3D`0`$````$@`!`))I``!`+P````0` +M`!$`$`"I:0``"`$``"`````2``$`QFD``)0#`P`P````$@`!`-EI``#0*@(` +MA````!(``0#Q:0``.-\!`+0!```2``$`#6H``/1D``!\````$@`!`"]J``#T +MY`$`?````!(``0!":@``4&<"`%P````2``$`6&H``"BI`P!4````$@`!`'9J +M``#,HP``"````!(``0"#:@``2&@``$P!```2``$`DVH``-@``P`8````$@`! +M`*)J``#LN`(`0````!(``0"W:@`````````````0````R&H``+@W```$```` +M$0`0`-=J``!(H0$`'````!(``0#K:@``P)@!``0!```2``$`_6H``/1F`@!< +M````$@`!`!AK``#<'@``F````!(``0`K:P``.&P!`#`````2``$`/&L````` +M````````$````$YK``!4"`(`-````!(``0!G:P``S!T#`!P!```2``$`=6L` +M`."E``!L````$@`!`(-K```P]0(`>````!(``0"<:P``P%\!`!@````2``$` +MKVL`````````````$````+9K```HM@``<`$``!(``0#9:P``H!D"`,P!```2 +M``$`^FL`````````````$`````1L``!8I@,`#````!(``0`=;```M#<```0` +M```1`!``*6P``"R*```L````$@`!`$1L```L*0$`+````!(``0!/;```R+4` +M`&`````2``$`6FP``.!+`0`$````$0`.`&YL``"(7@(`=````!(``0!^;``` +M?*$``-P````2``$`F&P``/A4```@````$@`!`*9L``!\50``(````!(``0"U +M;```5'8```0````2``$`SFP``)"+``!(````$@`!`-IL``!4C@,`J`(``!(` +M`0#D;``````````````0````]VP`````````````$`````!R='=?8VUD+F,` +M)&$`)&0`+DQ#,0`N3$,R`"Y,04Y#2$]2,0!?7V9U;F-?7RXS-38Q-P!R='=? +M7!T`&-R8S,R +M7W)E=F5R'1?:V5Y`&)Y=&5?&ES=%!A8VME=``N3$,R.0`N3$,S,0`N3$,T-``N3$,T-@`N3$,T-P`N3$,T +M.0!#+C8Y-BXS-S$S,0!$969A=6QT0VAA;FYE;%!L86X`7U]F=6YC7U\N,S0V +M.3``7U]F=6YC7U\N,S@W-3D`7U]F=6YC7U\N,S4W,C,`0RXT-C(N,S0X,#`` +M=VQA;F5V96YT5]S=7-P96YD`')T=U]L871E7W)EF4`6-F9RYC`'!H>5]#86QC +M=6QA=&5":713:&EF=`!P:'E?1&)M5&]4>%!W`!?4$A97U-I;75L87)I +M='E#;VUP87)E`%]02%E?34%#4V5T=&EN9T-A;&EB7!E+C,V-3$1E"YC`&9F861D`!3=TQE9$]N`%-W3&5D3V9F`%-W3&5D0V]N=')O;$UO9&4U`')T;#@Q +M.3)C=5]X;6ET+F,`0U-75$-(+C0X,@!R=&PX,3DR8W5?#)N=6U?:0!R='=?=WA?%]G971?%]G971?0!R='=?=WA?0!R='=?=WA?%]W%]G971?96YC`')T=U]W>%]G971?;FEC:P`N3$,Q-30` +M%]S971?96YC7V5X=``N3$,Q-C<`+DQ#,38X`"Y,0S$V.0!R +M='=?=WA?%]S971?%]G971?%]S971?<')I=@`N3$,R,C8`+DQ#,C(W`"Y,0S(R.``N +M3$,R,CD`+DQ#,C,P`"Y,0S(S,0`N3$,R,S(`+DQ#,C,S`"Y,0S(S-``N3$,R +M,S4`+DQ#,C,V`"Y,0S(S-P`N3$,R-#``+DQ#,C0Q`"Y,0S(T,@!R='=?=WA? +M&UI=%]L:6YU>"YC`&UL;65?;&EN=7@N +M8P!B86-K=7!034M)1$QI"YC`$%43TU)0U])3D-?4D54 +M55).`')T=U]T>&9R86UE'1R85]C;61?:&1L +M`')T;#@Q.3)C7U!(65]397121E)E9P!F:6QP7V]P96X`<')O8U]G971?:'1? +M;W!T:6]N`')T;#@Q.3)C7U!(65]3971"96%C;VY(=U)E9P!R='=?=6YR96=I +M0!R96%D1FEL90!R='=?0!R='=?5]B0!R='=?:6YD:6-A=&5?=WA?87-S;V-?979E;G0`7W!S7V-L;W-E7U)&`')T +M=U]R96-V7V5N=')Y`')T=U]R96=I5]S=7-P96YD`')T=U]C +M71E`'5S8E]F7!E`')T=U]F5]C;60`2%1/;D%S%]S=&%T0!R='=?:7-?8V-K0!?%]S:6=N86P`&9R +M86UE`$%43TU)0U]!1$1?4D5455).`')T=U]A8V-E0!?'0`5]S +M=7-P96YD`')T=U]C`!?5]D;VUA:6X`4V5T2&%L1&5F5F%R.#$Y,D-5&ET`&QI;FME9%]S=&%T=7-?8VAK`&5F=7-E7U)E861%1G5S90!M;&UE97AT +M7W-T85]A9&1?979E;G1?8V%L;&)A8VL`:7-?8VQI96YT7V%S7!T`'!A&UI=%]T87-K;&5T +M`'!R;V-E&UI=`!R='=?F4X,3DR0P!02%E?4D93:&%D;W=2 +M96%D`')T=U]S8V%N7W1I;65O=71?:&%N9&QE<@!F:7)E7W=R:71E7TU!0U]C +M;60`8W)E871E7W!R;V-?96YT0!"4D]!1$-/35]/54DS`')T;#@Q.3)C7U!(65]'971(5U)E +M9T]R:6=I;F%L5F%L=64`%!O=V5R3&5V96PX,3DR +M0P!R='=?9V5T7W=P83)?:64`&UI=',`7W)T=U]F&UI=%]P%]A;&EV90!#25-#3U]/ +M54D`&UI=&9R86UE7V5X`')T;#@Q.3)C=5]C86Q?='AD97-C +M7V-H:W-U;0!P0!?7V%E86)I7VED:78`5&0P`')T=U]G971? +M=W!A7VEE`')T;#@Q.3)C=5]H86Q?9&5I;FET`')T=U]S96-G971M:6,`FUA;&QO8P!C:%]F +M%]B +M96%C;VY?8VUD`&MI;&Q?<&ED`')T=U]U;G)E9VES=&5R7V5A`!R9E]R96=?9'5M<`!02%E?4D93:&%D +M;W=#;VUP87)E06QL`')T=U]R97-E=%]S96-U7!R:78`4$A97U-E=$)7 +M36]D93@Q.3)#`&UO9%]T:6UE<@!F0!D;W=N`%]R='=?=W)I=&4X`')T +M=U]S=&%R=%]D&UI=%]P0!R97!O0!%1E5315]3:&%D;W=296%D`')T=U]G971?8V%P86)I;&ET +M>5]F&UI=',`5]H86YD;&5R`')T=U]B=7-Y7W1H +M5]C;61R0!R=&PX,3DR8U]%9G5S95!A&UI=%]S8VAE9'5L90!&:6QL +M2#)#0VUD`%]R='=?;75T97A?:6YI=`!R='=?=F-S7W1Y<&4`0!R='=?;69R965? +M5]E=F5N=`!I;FET7W1I;65R7VME>0!734U/;D%S0!U71E4F5A9`!N971I9E]C87)R:65R7V]F +M9@!$=6UP0D)$8F=0;W)T7SDR0U4`4$A97U)&-C`U,E]#;VYF:6&UI=%]D96QI=F5R>5]E;F%B;&5D7V9R86UE7!T`'=I9FE?9&5A8W1I=F%T95]U +M5]S=&%T=7,`71E7!E`')T=U]F +M0!D:7-C;VYN96-T7VAD;`!R='=?9V5T7W-T +M85]P96YD:6YG`')T=U]C0!D979?&UI=',`8V]M<&QE=&5? +M86YD7V5X:70`%!O=V5R +M`%]?:VUA;&QO8P!R='=?:F]I;E]T:6UE;W5T7VAA;F1L97(`5]L;70`0V]N +#include +#include +#include + +#include "wifi_power.h" + +/* + * rtw_channel_plan : The initialization parameter of wifi channel, + * Allow number is "0" "2" and "5". + * 0 => 11 ( channel 1 ~ 11 is SCAN_ACTIVE ) + * 2 => 13 ( channel 1 ~ 13 is SCAN_ACTIVE ) + * 5 => 14 ( channel 1 ~ 14 is SCAN_ACTIVE ) + * default number is "2". + */ +char init_channel_plan = 2; + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +/* + * GPIO to control LDO/DCDC. + * + * 用于控制WIFI的电源,通常是3.3V和1.8V,可能1.2V也在其中。 + * + * 如果是扩展IO,请参考下面的例子: + * POWER_USE_EXT_GPIO, 0, 0, 0, PCA9554_Pin1, GPIO_HIGH + */ +struct wifi_power power_gpio = +{ + //POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 + + // RBOX + //POWER_USE_GPIO, POWER_GPIO_IOMUX, + //GPIO5D6_SDMMC1PWREN_NAME, GPIO5H_GPIO5D6, RK29_PIN5_PD6, GPIO_HIGH + + /*// YIFANG M803 + POWER_USE_GPIO, 0, + 0, 0, GPIO_WIFI_POWER, GPIO_HIGH + */ + //SDK + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * GPIO to control WIFI PowerDOWN/RESET. + * + * 控制WIFI的PowerDown脚。有些模组PowerDown脚是和Reset脚短接在一起。 + */ +struct wifi_power power_save_gpio = +{ + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * GPIO to reset WIFI. Keep this as NULL normally. + * + * 控制WIFI的Reset脚,通常WiFi模组没有用到这个引脚。 + */ +struct wifi_power power_reset_gpio = +{ + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * 在WIFI被上电前,会调用这个函数。 + */ +void wifi_turn_on_callback(void) +{ +} + +/* + * 在WIFI被下电后,会调用这个函数。 + */ +void wifi_turn_off_callback(void) +{ +} + +/* + * If external GPIO chip such as PCA9554 is being used, please + * implement the following 2 function. + * + * id: is GPIO identifier, such as GPIOPortF_Pin0, or external + * name defined in struct wifi_power. + * sens: the value should be set to GPIO, usually is GPIO_HIGH or GPIO_LOW. + * + * 如果有用扩展GPIO来控制WIFI,请实现下面的函数: + * 函数的功能是:控制指定的IO口id,使其状态切换为要求的sens状态。 + * id : 是IO的标识号,以整数的形式标识。 + * sens: 是要求的IO状态,为高或低。 + */ +void wifi_extgpio_operation(u8 id, u8 sens) +{ + //pca955x_gpio_direction_output(id, sens); +} + +/* + * 在系统中如果要调用WIFI的IO控制,将WIFI下电,可以调用如下接口: + * void rockchip_wifi_shutdown(void); + * 但注意需要在宏WIFI_GPIO_POWER_CONTROL的控制下。 + */ + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/wifi_power.h b/drivers/net/wireless/rtl8192c/wifi_power.h new file mode 100644 index 000000000000..be89742c471f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/wifi_power.h @@ -0,0 +1,87 @@ +/* + * wifi_power.h + * + * WIFI power control. + * + * Yongle Lai + */ + +#ifndef WIFI_POWER_H +#define WIFI_POWER_H + +#include + +#define DONT_SWITCH_USB 0 /* Don't switch USB automaticately. */ +#define WIFI_USE_OTG 1 /* WiFi will be connected to USB OTG. */ +#define WIFI_USE_HOST11 2 /* WiFi will be connected to USB HOST 1.1. */ + +#define WIFI_USE_IFACE WIFI_USE_HOST11 /* Select USB Controler */ +#define WIFI_GPIO_POWER_CONTROL 1 /* Enable GPIO Control Power */ + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +#include +#include +#else +#include +#include +#endif + +#define WIFI_CHIP_MV8686 0 +#define WIFI_CHIP_AR6002 1 +#define WIFI_CHIP_BCM4319 2 +#define WIFI_CHIP_NRX700 3 +#define WIFI_CHIP_RT3070 4 +#define WIFI_CHIP_RTL8192C 5 + +#define POWER_NOT_USE_GPIO 0 +#define POWER_USE_GPIO 1 +#define POWER_USE_EXT_GPIO 2 /* External GPIO chip is used, such as PCA9554. */ + +#define POWER_GPIO_NOT_IOMUX 0 +#define POWER_GPIO_IOMUX 1 + +#define GPIO_SWITCH_OFF 0 +#define GPIO_SWITCH_ON 1 + +struct wifi_power +{ + u8 use_gpio; /* If uses GPIO to control wifi power supply. 0 - no, 1 - yes. */ + u8 gpio_iomux; /* If the GPIO is iomux. 0 - no, 1 - yes. */ + char *iomux_name; /* IOMUX name */ + u8 iomux_value; /* IOMUX value - which function is choosen. */ + u8 gpio_id; /* GPIO number */ + u8 sensi_level; /* GPIO sensitive level. */ +}; + +int wifi_turn_on_card(int module); +int wifi_turn_off_card(void); +int wifi_reset_card(void); +void wifi_extgpio_operation(u8 id, u8 sens); + +void rockchip_wifi_shutdown(void); + +#endif /* WIFI_GPIO_POWER_CONTROL */ + +#define WIFI_NETWORK_BUSY 0 +#define WIFI_NETWORK_IDLE 1 + +int wifi_power_save_init(void); +int wifi_power_save_exit(void); +int wifi_power_save_stop(void); +int wifi_power_save_state(void); +void wifi_power_save_suspend(void); +void wifi_power_save_resume(void); +int wifi_power_save_register_callback(int (*callback)(int status)); + +void wifi_turn_on_callback(void); +void wifi_turn_off_callback(void); + +/* usb wifi */ +int wifi_activate_usb(void); +int wifi_deactivate_usb(void); +void wifi_usb_init(void); + +#endif /* WIFI_POWER_H */ + diff --git a/drivers/net/wireless/rtl8192c/wifi_power_ops.c b/drivers/net/wireless/rtl8192c/wifi_power_ops.c new file mode 100644 index 000000000000..4096bdac15fd --- /dev/null +++ b/drivers/net/wireless/rtl8192c/wifi_power_ops.c @@ -0,0 +1,112 @@ +/* + * wifi_power.c + * + * Yongle Lai @ Rockchip Fuzhou @ 20100303. + * + * Power control for WIFI module. + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +#include +#include +#else +#include +#include +#endif + + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +extern struct wifi_power power_gpio; +extern struct wifi_power power_save_gpio; +extern struct wifi_power power_reset_gpio; + +#define OS_IOMUX(name, value) rk29_mux_api_set((name), (value)); + +int wifi_gpio_operate(struct wifi_power *gpio, int flag) +{ + int sensitive; + + if (gpio->use_gpio == POWER_NOT_USE_GPIO) + return 0; + + if (gpio->gpio_iomux == POWER_GPIO_IOMUX) + { + OS_IOMUX(gpio->iomux_name, gpio->iomux_value); + } + + if (flag == GPIO_SWITCH_ON) + sensitive = gpio->sensi_level; + else + sensitive = 1 - gpio->sensi_level; + + if (gpio->use_gpio == POWER_USE_EXT_GPIO) + { + wifi_extgpio_operation(gpio->gpio_id, sensitive); + } + else + { + int ret; + + ret = gpio_request(gpio->gpio_id, NULL); + if (ret != 0) + printk("Request GPIO for WIFI POWER error!\n"); + + gpio_direction_output(gpio->gpio_id, sensitive); + gpio_set_value(gpio->gpio_id, sensitive); + + gpio_free(gpio->gpio_id); + } + + return 0; +} + +/* + * WiFi power up sequence + */ +int wifi_turn_on_rtl8192c_card(void) +{ + wifi_gpio_operate(&power_gpio, GPIO_SWITCH_ON); + if (power_gpio.use_gpio != POWER_NOT_USE_GPIO) + msleep(1000); + + return 0; +} + +int wifi_turn_on_card(int module) +{ + wifi_turn_on_callback(); + + wifi_turn_on_rtl8192c_card(); + + return 0; +} + +int wifi_turn_off_card(void) +{ + wifi_gpio_operate(&power_gpio, GPIO_SWITCH_OFF); + msleep(5); + + wifi_turn_off_callback(); + + return 0; +} + +void rockchip_wifi_shutdown(void) +{ + printk("rockchip_wifi_shutdown....\n"); + + wifi_turn_off_card(); +} +EXPORT_SYMBOL(rockchip_wifi_shutdown); + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/wifi_power_usb.c b/drivers/net/wireless/rtl8192c/wifi_power_usb.c new file mode 100644 index 000000000000..c979cc34958c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/wifi_power_usb.c @@ -0,0 +1,118 @@ +/* + * wifi_power.c + * + * Power control for WIFI module. + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +int wifi_change_usb_mode = 0; +int usb_wifi_status = 0; + +void wifi_usb_init(void) +{ + wifi_change_usb_mode = 0; + usb_wifi_status = 0; +} + +#if (WIFI_USE_IFACE == WIFI_USE_OTG) + +#define USB_NORMAL 0 +#define USB_FORCE_HOST 1 +#define USB_FORCE_DEVICE 2 + +extern int usb_force_usb_for_wifi(int mode); + +/* + * Change USB mode to HOST. + */ +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + + wifi_change_usb_mode = usb_force_usb_for_wifi(USB_FORCE_HOST); + msleep(1000); + + usb_wifi_status = 1; + + return 0; +} + +/* + * Change USB mode to be original. + */ +int wifi_deactivate_usb(void) +{ + if (wifi_change_usb_mode == 1) + { + usb_force_usb_for_wifi(USB_FORCE_DEVICE); + msleep(1000); + usb_force_usb_for_wifi(USB_NORMAL); + msleep(1000); + } + wifi_turn_off_card(); + + usb_wifi_status = 0; + + return 0; +} + +#elif (WIFI_USE_IFACE == WIFI_USE_HOST11) + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +extern int usb_switch_usb_host11_for_wifi(int enabled); +#endif + +int wifi_deactivate_usb(void) +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) + usb_switch_usb_host11_for_wifi(0); + msleep(1000); +#endif + + wifi_turn_off_card(); + msleep(100); + + return 0; +} + +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + msleep(100); + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) + usb_switch_usb_host11_for_wifi(1); + msleep(1000); +#endif + + return 0; +} + +#else + +int wifi_deactivate_usb(void) +{ + wifi_turn_off_card(); + msleep(1000); + return 0; +} + +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + msleep(1000); + return 0; +} +#endif + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/wifi_version.h b/drivers/net/wireless/rtl8192c/wifi_version.h new file mode 100755 index 000000000000..1c05d2a7d1cf --- /dev/null +++ b/drivers/net/wireless/rtl8192c/wifi_version.h @@ -0,0 +1,13 @@ +/* + * Yongle Lai @ Rockchip + */ +#ifndef WIFI_BCM4319_VERSION_H +#define WIFI_BCM4319_VERSION_H + +/* + * Broadcom BCM4319 driver version. + */ +#define RTL8192_DRV_VERSION "3.10" + +#endif /* WIFI_BCM4319_VERSION_H */ + From 7c557888c9f4f3edecbc5e0c6f22dab52115de0a Mon Sep 17 00:00:00 2001 From: zyw Date: Fri, 16 Sep 2011 16:57:35 +0800 Subject: [PATCH 112/150] enable ipp for scale UI when support HDMI --- drivers/video/hdmi/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/video/hdmi/Kconfig b/drivers/video/hdmi/Kconfig index 7d2cd0aefcce..2b01022ee40e 100755 --- a/drivers/video/hdmi/Kconfig +++ b/drivers/video/hdmi/Kconfig @@ -4,7 +4,8 @@ menu "HDMI" config HDMI bool "HDMI support" - + select FB_WORK_IPP + select FB_SCALING_OSD if HDMI source "drivers/video/hdmi/chips/Kconfig" From 6befb4f40fdcb1c64296cfbcda8d3526b847b2a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 19 Sep 2011 12:04:27 +0800 Subject: [PATCH 113/150] mm: add _GFP_NO_KSWAPD flag commit 32dba98e085f8b2b4345887df9abf5e0e93bfc12 upstream. --- include/linux/gfp.h | 4 +++- mm/page_alloc.c | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 557bdad320b6..64d72e58f8e0 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -59,13 +59,15 @@ struct vm_area_struct; #define __GFP_NOTRACK ((__force gfp_t)0) #endif +#define __GFP_NO_KSWAPD ((__force gfp_t)0x400000u) + /* * This may seem redundant, but it's a way of annotating false positives vs. * allocations that simply cannot be supported (e.g. page tables). */ #define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK) -#define __GFP_BITS_SHIFT 22 /* Room for 22 __GFP_FOO bits */ +#define __GFP_BITS_SHIFT 23 /* Room for 23 __GFP_FOO bits */ #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1)) /* This equals 0, but use constants in case they ever change */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e1881454831f..033218c33378 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1833,7 +1833,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, goto nopage; restart: - wake_all_kswapd(order, zonelist, high_zoneidx); + if (!(gfp_mask & __GFP_NO_KSWAPD)) + wake_all_kswapd(order, zonelist, high_zoneidx); /* * OK, we're below the kswapd watermark and have kicked background From 719b8223e92ad96553c801ba4e5bbbe3fc1bd775 Mon Sep 17 00:00:00 2001 From: chenli Date: Mon, 19 Sep 2011 18:02:56 +0800 Subject: [PATCH 114/150] rk29-ipp:fix the timeout bug caused by the driver 1.Ensure the input value of the registers are written to the memory 2.If the interrupt has come but the wait queue has not been wake up,we consider that the result is correct --- drivers/staging/rk29/ipp/rk29-ipp.c | 67 +++++++++++++---------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/drivers/staging/rk29/ipp/rk29-ipp.c b/drivers/staging/rk29/ipp/rk29-ipp.c index 05e8c652e863..455b4da9c272 100755 --- a/drivers/staging/rk29/ipp/rk29-ipp.c +++ b/drivers/staging/rk29/ipp/rk29-ipp.c @@ -139,6 +139,7 @@ struct ipp_context static inline void ipp_write( uint32_t b, uint32_t r) { __raw_writel(b, drvdata->ipp_base + r); + dsb(); } static inline uint32_t ipp_read( uint32_t r) @@ -884,10 +885,10 @@ int ipp_blit(const struct rk29_ipp_req *req) /* Start the operation */ - ipp_write(8, IPP_INT);// - dsb(); + ipp_write(8, IPP_INT); + ipp_write(1, IPP_PROCESS_ST); - + dmac_clean_range(drvdata->ipp_base,drvdata->ipp_base+0x54); #ifdef IPP_TEST hw_start = ktime_get(); #endif @@ -967,41 +968,35 @@ int ipp_blit_sync(const struct rk29_ipp_req *req) #endif if (wait_ret <= 0) { - printk("%s wait_ret=%d,wait_event_timeout \n",__FUNCTION__,wait_ret); - -#ifdef IPP_TEST - //print all register's value - printk("wait_ret: %d\n", wait_ret); - printk("wq_condition: %d\n", wq_condition); - printk("IPP_CONFIG: %x\n",ipp_read(IPP_CONFIG)); - printk("IPP_SRC_IMG_INFO: %x\n",ipp_read(IPP_SRC_IMG_INFO)); - printk("IPP_DST_IMG_INFO: %x\n",ipp_read(IPP_DST_IMG_INFO)); - printk("IPP_IMG_VIR: %x\n",ipp_read(IPP_IMG_VIR)); - printk("IPP_INT: %x\n",ipp_read(IPP_INT)); - printk("IPP_SRC0_Y_MST: %x\n",ipp_read(IPP_SRC0_Y_MST)); - printk("IPP_SRC0_CBR_MST: %x\n",ipp_read(IPP_SRC0_CBR_MST)); - printk("IPP_SRC1_Y_MST: %x\n",ipp_read(IPP_SRC1_Y_MST)); - printk("IPP_SRC1_CBR_MST: %x\n",ipp_read(IPP_SRC1_CBR_MST)); - printk("IPP_DST0_Y_MST: %x\n",ipp_read(IPP_DST0_Y_MST)); - printk("IPP_DST0_CBR_MST: %x\n",ipp_read(IPP_DST0_CBR_MST)); - printk("IPP_DST1_Y_MST: %x\n",ipp_read(IPP_DST1_Y_MST)); - printk("IPP_DST1_CBR_MST: %x\n",ipp_read(IPP_DST1_CBR_MST)); - printk("IPP_PRE_SCL_PARA: %x\n",ipp_read(IPP_PRE_SCL_PARA)); - printk("IPP_POST_SCL_PARA: %x\n",ipp_read(IPP_POST_SCL_PARA)); - printk("IPP_SWAP_CTRL: %x\n",ipp_read(IPP_SWAP_CTRL)); - printk("IPP_PRE_IMG_INFO: %x\n",ipp_read(IPP_PRE_IMG_INFO)); - printk("IPP_AXI_ID: %x\n",ipp_read(IPP_AXI_ID)); - printk("IPP_SRESET: %x\n",ipp_read(IPP_SRESET)); - printk("IPP_PROCESS_ST: %x\n",ipp_read(IPP_PROCESS_ST)); - - while(1) + printk("%s wait_ret=%d,wq_condition =%d,wait_event_timeout! \n",__FUNCTION__,wait_ret,wq_condition); + + if(wq_condition==0) { - + //print all register's value + printk("IPP_CONFIG: %x\n",ipp_read(IPP_CONFIG)); + printk("IPP_SRC_IMG_INFO: %x\n",ipp_read(IPP_SRC_IMG_INFO)); + printk("IPP_DST_IMG_INFO: %x\n",ipp_read(IPP_DST_IMG_INFO)); + printk("IPP_IMG_VIR: %x\n",ipp_read(IPP_IMG_VIR)); + printk("IPP_INT: %x\n",ipp_read(IPP_INT)); + printk("IPP_SRC0_Y_MST: %x\n",ipp_read(IPP_SRC0_Y_MST)); + printk("IPP_SRC0_CBR_MST: %x\n",ipp_read(IPP_SRC0_CBR_MST)); + printk("IPP_SRC1_Y_MST: %x\n",ipp_read(IPP_SRC1_Y_MST)); + printk("IPP_SRC1_CBR_MST: %x\n",ipp_read(IPP_SRC1_CBR_MST)); + printk("IPP_DST0_Y_MST: %x\n",ipp_read(IPP_DST0_Y_MST)); + printk("IPP_DST0_CBR_MST: %x\n",ipp_read(IPP_DST0_CBR_MST)); + printk("IPP_DST1_Y_MST: %x\n",ipp_read(IPP_DST1_Y_MST)); + printk("IPP_DST1_CBR_MST: %x\n",ipp_read(IPP_DST1_CBR_MST)); + printk("IPP_PRE_SCL_PARA: %x\n",ipp_read(IPP_PRE_SCL_PARA)); + printk("IPP_POST_SCL_PARA: %x\n",ipp_read(IPP_POST_SCL_PARA)); + printk("IPP_SWAP_CTRL: %x\n",ipp_read(IPP_SWAP_CTRL)); + printk("IPP_PRE_IMG_INFO: %x\n",ipp_read(IPP_PRE_IMG_INFO)); + printk("IPP_AXI_ID: %x\n",ipp_read(IPP_AXI_ID)); + printk("IPP_SRESET: %x\n",ipp_read(IPP_SRESET)); + printk("IPP_PROCESS_ST: %x\n",ipp_read(IPP_PROCESS_ST)); + + ipp_soft_reset(); + drvdata->ipp_result = -EAGAIN; } -#endif - - ipp_soft_reset(); - drvdata->ipp_result = -EAGAIN; } ipp_power_off(NULL); From 72ece66e12d2296998934cc55fcce0ff4f772b8b Mon Sep 17 00:00:00 2001 From: chenli Date: Mon, 19 Sep 2011 18:24:55 +0800 Subject: [PATCH 115/150] rk29-ipp:use dsb() only after we start ipp --- drivers/staging/rk29/ipp/rk29-ipp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/staging/rk29/ipp/rk29-ipp.c b/drivers/staging/rk29/ipp/rk29-ipp.c index 455b4da9c272..d8903cbdf2f1 100755 --- a/drivers/staging/rk29/ipp/rk29-ipp.c +++ b/drivers/staging/rk29/ipp/rk29-ipp.c @@ -139,7 +139,6 @@ struct ipp_context static inline void ipp_write( uint32_t b, uint32_t r) { __raw_writel(b, drvdata->ipp_base + r); - dsb(); } static inline uint32_t ipp_read( uint32_t r) @@ -888,6 +887,8 @@ int ipp_blit(const struct rk29_ipp_req *req) ipp_write(8, IPP_INT); ipp_write(1, IPP_PROCESS_ST); + + dsb(); dmac_clean_range(drvdata->ipp_base,drvdata->ipp_base+0x54); #ifdef IPP_TEST hw_start = ktime_get(); From 2af0590a3c2b0627220d666b42dc14b1b2a75740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Tue, 20 Sep 2011 09:17:04 +0800 Subject: [PATCH 116/150] gpu : Reduce the reserved memory to 16M; Set gcdPAGE_ALLOC_LIMIT to 0; --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 2 +- drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h | 2 +- drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c | 3 +++ .../rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index b385a7df0bb1..7e8c3ce90ed8 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -100,7 +100,7 @@ #else #define SDRAM_SIZE SZ_512M #endif -#define PMEM_GPU_SIZE SZ_64M +#define PMEM_GPU_SIZE SZ_16M #define PMEM_UI_SIZE (48 * SZ_1M) /* 1280x800: 64M 1024x768: 48M ... */ #define PMEM_VPU_SIZE SZ_64M #define PMEM_SKYPE_SIZE 0 diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h index be464ed867fd..d6baf688680a 100644 --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h @@ -310,7 +310,7 @@ gcdPAGE_ALLOC_LIMIT Page gcdPAGE_ALLOC_LIMIT_SIZE PageĴС,λΪM */ -#define gcdPAGE_ALLOC_LIMIT 1 +#define gcdPAGE_ALLOC_LIMIT 0 #define gcdPAGE_ALLOC_LIMIT_SIZE 0 diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c index 56d72c81126c..f76834c6d5ed 100755 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c @@ -388,12 +388,15 @@ _AllocateMemory( while ((*Pool == gcvPOOL_DEFAULT) || (*Pool == gcvPOOL_LOCAL) || (*Pool == gcvPOOL_UNIFIED) + || ((*Pool == gcvPOOL_SYSTEM) && (pool==gcvPOOL_CONTIGUOUS)) ); if (gcmIS_SUCCESS(status)) { /* Return pool used for allocation. */ *Pool = pool; + } else { + printk("_AllocateMemory fail! pool=%d, Bytes=%d, Type=%d\n", pool, (int)Bytes, Type); } /* Return status. */ diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c index 96fc28b69930..d5bf1f83cea9 100755 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -3032,7 +3032,7 @@ gceSTATUS gckOS_AllocatePagedMemoryEx( } } #else - addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA | __GFP_NOWARN, GetOrder(numPages)); + addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA | __GFP_NOWARN | __GFP_NO_KSWAPD, GetOrder(numPages)); #endif } else From 3282ee6dd3f95339799d1ba3fd62a015de70b6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=8D=AB=E5=9B=BD?= Date: Tue, 20 Sep 2011 11:58:17 +0800 Subject: [PATCH 117/150] =?UTF-8?q?i2s0=E5=86=8D=E6=AC=A1=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=9A=20=20=201)=20i2s0=E7=9A=84rx,=20tx=E4=B8=A4?= =?UTF-8?q?=E8=80=85=E9=83=BD=E4=B8=BAmaster=20=20=202)=20=E7=A1=AC?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E9=92=88=E5=AF=B9=E5=8F=AA=E6=9C=89=E4=B8=80?= =?UTF-8?q?=E8=B7=AFLRCK=E7=9A=84codec=EF=BC=8C=E4=BE=8B=E5=A6=82alc5631/5?= =?UTF-8?q?621=EF=BC=8C=E5=8F=AA=E5=B0=86I2S0=5FLRCK=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=88=B0codec=E7=9A=84LRCK,=20I2S0=5FLRCK=5FRX=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E6=96=AD=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sound/soc/rk29/rk29_i2s.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sound/soc/rk29/rk29_i2s.c b/sound/soc/rk29/rk29_i2s.c index 809efcf6d25d..62f54413b748 100755 --- a/sound/soc/rk29/rk29_i2s.c +++ b/sound/soc/rk29/rk29_i2s.c @@ -271,7 +271,7 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai, return -EINVAL; } I2S_DBG("Enter::%s----%d, I2S_TXCR=0x%X\n",__FUNCTION__,__LINE__,tx_ctl); -#if defined(CONFIG_SND_RK29_SOC_alc5631) || defined(CONFIG_SND_RK29_SOC_alc5621) +#if 0//defined(CONFIG_SND_RK29_SOC_alc5631) || defined(CONFIG_SND_RK29_SOC_alc5621) rx_ctl = tx_ctl; rx_ctl &= ~I2S_MODE_MASK; rx_ctl |= I2S_SLAVE_MODE; // set tx slave, rx master @@ -345,7 +345,7 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream, writel(dmarc, &(pheadi2s->I2S_DMACR)); I2S_DBG("Enter %s, %d I2S_TXCR=0x%08X\n", __func__, __LINE__, iismod); -#if defined(CONFIG_SND_RK29_SOC_alc5631) || defined(CONFIG_SND_RK29_SOC_alc5621) +#if 0//defined(CONFIG_SND_RK29_SOC_alc5631) || defined(CONFIG_SND_RK29_SOC_alc5621) dmarc = iismod; dmarc &= ~I2S_MODE_MASK; dmarc |= I2S_SLAVE_MODE; // set tx slave, rx master From 77923034a0af327fc71298d9ecfcf25d9c3a15bc Mon Sep 17 00:00:00 2001 From: lyx Date: Tue, 20 Sep 2011 02:38:52 -0700 Subject: [PATCH 118/150] rk29 vmac: improve vmac suspend & resume function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.解决因为以太网卡休眠唤醒概率性死锁,导致系统重启的bug --- drivers/net/rk29_vmac.c | 146 +++++++++++++++++++++------------------- drivers/net/rk29_vmac.h | 4 ++ 2 files changed, 82 insertions(+), 68 deletions(-) diff --git a/drivers/net/rk29_vmac.c b/drivers/net/rk29_vmac.c index 561b7928179f..e8b72fc8ba5e 100755 --- a/drivers/net/rk29_vmac.c +++ b/drivers/net/rk29_vmac.c @@ -173,9 +173,9 @@ static void vmac_handle_link_change(struct net_device *dev) static int __devinit vmac_mii_probe(struct net_device *dev) { struct vmac_priv *ap = netdev_priv(dev); - struct phy_device *phydev = NULL; - struct clk *sys_clk; - unsigned long clock_rate; + struct phy_device *phydev = NULL; + //struct clk *sys_clk; + //unsigned long clock_rate; int phy_addr, err; /* find the first phy */ @@ -234,9 +234,8 @@ static int __devinit vmac_mii_probe(struct net_device *dev) ap->phy_dev = phydev; return 0; - -err_disconnect: - phy_disconnect(phydev); +//err_disconnect: +// phy_disconnect(phydev); err_out: return err; } @@ -287,6 +286,7 @@ static int __devinit vmac_mii_init(struct vmac_priv *ap) kfree(ap->mii_bus->irq); err_out: mdiobus_free(ap->mii_bus); + ap->mii_bus = NULL; return err; } @@ -296,10 +296,12 @@ static void vmac_mii_exit(struct net_device *dev) if (ap->phy_dev) phy_disconnect(ap->phy_dev); - - mdiobus_unregister(ap->mii_bus); - kfree(ap->mii_bus->irq); - mdiobus_free(ap->mii_bus); + if (ap->mii_bus) { + mdiobus_unregister(ap->mii_bus); + kfree(ap->mii_bus->irq); + mdiobus_free(ap->mii_bus); + ap->mii_bus = NULL; + } } static int vmacether_get_settings(struct net_device *dev, @@ -1035,6 +1037,8 @@ int vmac_open(struct net_device *dev) if (ap == NULL) return -ENODEV; + wake_lock_timeout(&ap->resume_lock, 5*HZ); + ap->shutdown = 0; //set rmii ref clock 50MHz @@ -1113,6 +1117,9 @@ int vmac_open(struct net_device *dev) dev_info(&ap->pdev->dev, "PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n", phydev->drv->name, dev_name(&phydev->dev), phydev->irq); + ap->suspending = 0; + ap->open_flag = 1; + return 0; err_free_irq: @@ -1136,6 +1143,11 @@ int vmac_close(struct net_device *dev) struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data; printk("enter func %s...\n", __func__); + + if (ap->suspending == 1) + return 0; + + ap->open_flag = 0; netif_stop_queue(dev); napi_disable(&ap->napi); @@ -1186,68 +1198,43 @@ int vmac_close(struct net_device *dev) return 0; } -static void rk29_init_vmac(struct net_device *dev) +int vmac_shutdown(struct net_device *dev) { struct vmac_priv *ap = netdev_priv(dev); unsigned int temp; - struct clk *mac_clk = NULL; - struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data; - + printk("enter func %s...\n", __func__); - - //set rmii ref clock 50MHz - mac_clk = clk_get(NULL, "mac_ref_div"); - clk_set_rate(mac_clk, 50000000); - clk_enable(mac_clk); - clk_enable(clk_get(NULL,"mii_rx")); - clk_enable(clk_get(NULL,"mii_tx")); - clk_enable(clk_get(NULL,"hclk_mac")); - clk_enable(clk_get(NULL,"mac_ref")); - //phy power on - if (pdata && pdata->rmii_power_control) - pdata->rmii_power_control(1); + netif_stop_queue(dev); + napi_disable(&ap->napi); - //msleep(1000); - - /* IRQ mask */ - temp = RXINT_MASK | ERR_MASK | TXCH_MASK | MDIO_MASK; - vmac_writel(ap, temp, ENABLE); - - /* Set control */ - temp = (RX_BDT_LEN << 24) | (TX_BDT_LEN << 16) | TXRN_MASK | RXRN_MASK; + /* stop running transfers */ + temp = vmac_readl(ap, CONTROL); + temp &= ~(TXRN_MASK | RXRN_MASK); vmac_writel(ap, temp, CONTROL); - /* enable, after all other bits are set */ - vmac_writel(ap, temp | EN_MASK, CONTROL); + del_timer_sync(&ap->rx_timeout); -} + /* disable phy */ + phy_stop(ap->phy_dev); + vmac_mii_exit(dev); + netif_carrier_off(dev); -static void rk29_vmac_shutdown(struct net_device *dev) -{ - struct vmac_priv *ap = netdev_priv(dev); - struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data; - - printk("enter func %s...\n", __func__); - /* disable interrupts */ vmac_writel(ap, 0, ENABLE); - + free_irq(dev->irq, dev); + /* turn off vmac */ vmac_writel(ap, 0, CONTROL); - - //phy power off - if (pdata && pdata->rmii_power_control) - pdata->rmii_power_control(0); - - //clock close - clk_disable(clk_get(NULL, "mac_ref_div")); - clk_disable(clk_get(NULL,"mii_rx")); - clk_disable(clk_get(NULL,"mii_tx")); - clk_disable(clk_get(NULL,"hclk_mac")); - clk_disable(clk_get(NULL,"mac_ref")); -} + /* vmac_reset_hw(vmac) */ + ap->shutdown = 1; + wmb(); + + free_buffers(dev); + + return 0; +} void vmac_update_stats(struct vmac_priv *ap) { @@ -1475,7 +1462,6 @@ static int __devinit vmac_probe(struct platform_device *pdev) struct resource *res; unsigned int mem_base, mem_size, irq; int err; - struct clk *sys_clk; struct rk29_vmac_platform_data *pdata = pdev->dev.platform_data; dev = alloc_etherdev(sizeof(*ap)); @@ -1554,7 +1540,10 @@ static int __devinit vmac_probe(struct platform_device *pdev) dev->irq, dev->dev_addr); platform_set_drvdata(pdev, dev); + ap->suspending = 0; + ap->open_flag = 0; wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "vmac"); + wake_lock_init(&ap->resume_lock, WAKE_LOCK_SUSPEND, "vmac_resume"); //config rk29 vmac as rmii, 100MHz if (pdata && pdata->vmac_register_set) @@ -1608,19 +1597,42 @@ static int __devexit vmac_remove(struct platform_device *pdev) return 0; } +static void rk29_vmac_power_off(struct net_device *dev) +{ + struct vmac_priv *ap = netdev_priv(dev); + struct rk29_vmac_platform_data *pdata = ap->pdev->dev.platform_data; + + printk("enter func %s...\n", __func__); + + //phy power off + if (pdata && pdata->rmii_power_control) + pdata->rmii_power_control(0); + + //clock close + clk_disable(clk_get(NULL, "mac_ref_div")); + clk_disable(clk_get(NULL,"mii_rx")); + clk_disable(clk_get(NULL,"mii_tx")); + clk_disable(clk_get(NULL,"hclk_mac")); + clk_disable(clk_get(NULL,"mac_ref")); + +} + static int rk29_vmac_suspend(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct net_device *ndev = platform_get_drvdata(pdev); - + struct vmac_priv *ap = netdev_priv(ndev); + if (ndev) { - if (netif_running(ndev)) { - if (ndev->irq) - disable_irq(ndev->irq); + if (ap->open_flag == 1) { netif_stop_queue(ndev); netif_device_detach(ndev); - rk29_vmac_shutdown(ndev); + if (ap->suspending == 0) { + vmac_shutdown(ndev); + rk29_vmac_power_off(ndev); + ap->suspending = 1; + } } } return 0; @@ -1631,14 +1643,12 @@ rk29_vmac_resume(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct net_device *ndev = platform_get_drvdata(pdev); - + struct vmac_priv *ap = netdev_priv(ndev); + if (ndev) { - if (netif_running(ndev)) { - rk29_init_vmac(ndev); + if (ap->open_flag == 1) { netif_device_attach(ndev); netif_start_queue(ndev); - if (ndev->irq) - enable_irq(ndev->irq); } } return 0; diff --git a/drivers/net/rk29_vmac.h b/drivers/net/rk29_vmac.h index eb962d80b549..a1f67c07fb37 100755 --- a/drivers/net/rk29_vmac.h +++ b/drivers/net/rk29_vmac.h @@ -183,6 +183,10 @@ struct vmac_priv { int speed; int duplex; + int open_flag; + int suspending; + struct wake_lock resume_lock; + /* debug */ int shutdown; }; From 97fb7f745717fc7b0981ea5a3375576ff267ae68 Mon Sep 17 00:00:00 2001 From: zwp Date: Tue, 6 Sep 2011 19:45:22 -0700 Subject: [PATCH 119/150] TCL_Phonepad:modify ddr frequence to 456MHz. --- arch/arm/configs/rk29_phonepadsdk_defconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/arm/configs/rk29_phonepadsdk_defconfig b/arch/arm/configs/rk29_phonepadsdk_defconfig index eee1a810eb38..6540cf440bd4 100644 --- a/arch/arm/configs/rk29_phonepadsdk_defconfig +++ b/arch/arm/configs/rk29_phonepadsdk_defconfig @@ -230,8 +230,9 @@ CONFIG_MACH_RK29_PHONEPADSDK=y # CONFIG_DDR_TYPE_DDR3_2133N is not set CONFIG_DDR_TYPE_DDR3_DEFAULT=y CONFIG_RK29_MEM_SIZE_M=512 -CONFIG_DDR_SDRAM_FREQ=400 -CONFIG_DDR_FREQ=y +CONFIG_DDR_SDRAM_FREQ=456 +# CONFIG_DDR_RECONFIG is not set +CONFIG_WIFI_CONTROL_FUNC=y # # RK29 VPU (Video Processing Unit) support From 7ca158d2bb524990d3ebe874cc023ea8cb7d452c Mon Sep 17 00:00:00 2001 From: wlq Date: Thu, 8 Sep 2011 14:20:04 +0800 Subject: [PATCH 120/150] phone-pad:add ThinkWill MI900 product ID --- drivers/usb/serial/option.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index a7ab681063aa..c7bc9be950d2 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -373,6 +373,7 @@ static int option_resume(struct usb_serial *serial); /* Thinkwill products */ #define THINKWILL_VENDOR_ID 0x19f5 #define THINKWILL_PRODUCT_ID 0x9909 +#define THINKWILL_MI900_PRODUCT_ID 0x9013 /* Cinterion (formerly Siemens) products */ #define SIEMENS_VENDOR_ID 0x0681 @@ -412,6 +413,9 @@ static int option_resume(struct usb_serial *serial); static struct usb_device_id option_ids[] = { { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(THINKWILL_VENDOR_ID,THINKWILL_PRODUCT_ID)}, + + { USB_DEVICE(THINKWILL_VENDOR_ID,THINKWILL_MI900_PRODUCT_ID)}, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) }, From bc338b1f0d8e9605610022ae715408b5f9425431 Mon Sep 17 00:00:00 2001 From: zwp Date: Thu, 15 Sep 2011 01:45:28 -0700 Subject: [PATCH 121/150] tcl-phone-pad:improve tp performance. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决手指从触屏的边缘开始滑动时,可能出现触屏不响应的情况。 --- drivers/input/touchscreen/ft5x0x_i2c_ts.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 drivers/input/touchscreen/ft5x0x_i2c_ts.h diff --git a/drivers/input/touchscreen/ft5x0x_i2c_ts.h b/drivers/input/touchscreen/ft5x0x_i2c_ts.h old mode 100644 new mode 100755 index 10eb263cb55d..3b034d8d2129 --- a/drivers/input/touchscreen/ft5x0x_i2c_ts.h +++ b/drivers/input/touchscreen/ft5x0x_i2c_ts.h @@ -13,8 +13,8 @@ #define CFG_NUMOFKEYS 0x4 //number of touch keys #ifdef CONFIG_FTS_CUSTOME_ENV -#define SCREEN_MAX_X 1024 -#define SCREEN_MAX_Y 600 +#define SCREEN_MAX_X 1044//1024 +#define SCREEN_MAX_Y 620//600 #else #define SCREEN_MAX_X 800 #define SCREEN_MAX_Y 480 From da43c90c56c920a19693a1928130d7267c86ed04 Mon Sep 17 00:00:00 2001 From: zwp Date: Mon, 19 Sep 2011 00:02:04 -0700 Subject: [PATCH 122/150] TCL_Phone_pad:modify tp i2c err when device going to earlysuspend. --- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 9 +- arch/arm/mach-rk29/include/mach/board.h | 4 + drivers/input/touchscreen/ft5x0x_i2c_ts.c | 97 ++++++++++++++++++++-- drivers/input/touchscreen/ft5x0x_i2c_ts.h | 6 -- 4 files changed, 101 insertions(+), 15 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index 02e654ffb9a2..aab2422074bc 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -608,7 +608,10 @@ int laibao_init_platform_hw(void) struct laibao_platform_data laibao_info = { .model= 1003, .init_platform_hw= laibao_init_platform_hw, - + .lcd_disp_on_pin = RK29_PIN6_PD0, + .disp_on_value = GPIO_HIGH, + .lcd_cs_pin = RK29_PIN6_PD1, + .lcd_cs_value = GPIO_HIGH, }; #endif @@ -1364,7 +1367,7 @@ static int rk29_backlight_pwm_suspend(void) return -1; } gpio_direction_output(PWM_GPIO, GPIO_LOW); - #ifdef LCD_DISP_ON_PIN + #if 0//def LCD_DISP_ON_PIN gpio_direction_output(BL_EN_PIN, 0); gpio_set_value(BL_EN_PIN, !BL_EN_VALUE); #endif @@ -1376,7 +1379,7 @@ static int rk29_backlight_pwm_resume(void) gpio_free(PWM_GPIO); rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); - #ifdef LCD_DISP_ON_PIN + #if 0//def LCD_DISP_ON_PIN msleep(30); gpio_direction_output(BL_EN_PIN, 1); gpio_set_value(BL_EN_PIN, BL_EN_VALUE); diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h index c97306d4af19..e9745576374e 100644 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -306,6 +306,10 @@ struct laibao_platform_data { int (*laibao_platform_sleep)(void); int (*laibao_platform_wakeup)(void); void (*exit_platform_hw)(void); + int lcd_disp_on_pin; + int disp_on_value; + int lcd_cs_pin; + int lcd_cs_value; }; struct akm8975_platform_data { diff --git a/drivers/input/touchscreen/ft5x0x_i2c_ts.c b/drivers/input/touchscreen/ft5x0x_i2c_ts.c index 3b5ca652c035..8723ccf3a889 100755 --- a/drivers/input/touchscreen/ft5x0x_i2c_ts.c +++ b/drivers/input/touchscreen/ft5x0x_i2c_ts.c @@ -30,6 +30,17 @@ #include #include #include +#include + +struct FTS_TS_DATA_T { + struct i2c_client *client; + struct input_dev *input_dev; + struct FTS_TS_EVENT_T event; + struct work_struct pen_event_work; + struct workqueue_struct *ts_workqueue; + struct early_suspend early_suspend; +}; + /* -------------- global variable definition -----------*/ static struct i2c_client *this_client; static REPORT_FINGER_INFO_T _st_finger_infos[CFG_MAX_POINT_NUM]; @@ -54,6 +65,13 @@ char *tsp_keyname[CFG_NUMOFKEYS] ={ static bool tsp_keystatus[CFG_NUMOFKEYS]; + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ft5x0x_ts_early_suspend(struct early_suspend *h); +static void ft5x0x_ts_late_resume(struct early_suspend *h); +#endif + + /*********************************************************************** [function]: callback: read data from ctpm by i2c interface; @@ -234,7 +252,7 @@ static int fts_i2c_rxdata(u8 *rxdata, int length) ret = i2c_transfer(this_client->adapter, &msg, 1); if (ret < 0) - pr_err("msg %s i2c write error: %d\n", __func__, ret); + pr_err("msg %s line:%d i2c write error: %d\n", __func__, __LINE__,ret); msg.addr = this_client->addr; msg.flags = I2C_M_RD; @@ -242,7 +260,7 @@ static int fts_i2c_rxdata(u8 *rxdata, int length) msg.buf = rxdata; ret = i2c_transfer(this_client->adapter, &msg, 1); if (ret < 0) - pr_err("msg %s i2c write error: %d\n", __func__, ret); + pr_err("msg %s line:%d i2c write error: %d\n", __func__,__LINE__, ret); return ret; } @@ -423,11 +441,9 @@ int fts_read_data(void) _st_finger_infos[id].ui2_id = size; _si_touch_num ++; } - else - /*bad event, ignore*/ + else /*bad event, ignore*/ continue; - if ( (touch_event==1) ) { // printk("[TSP]id=%d up\n", id); @@ -436,7 +452,6 @@ int fts_read_data(void) for( i= 0; iinput_dev, ABS_MT_TRACKING_ID, _st_finger_infos[i].ui2_id); input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, _st_finger_infos[i].u2_pressure); input_report_abs(data->input_dev, ABS_MT_POSITION_X, SCREEN_MAX_X - _st_finger_infos[i].i2_x); @@ -796,6 +811,66 @@ unsigned char fts_ctpm_get_upg_ver(void) } +void ft5x0x_ts_set_standby(struct i2c_client *client, int enable) +{ + struct laibao_platform_data *mach_info = client->dev.platform_data; + unsigned display_on = mach_info->lcd_disp_on_pin; + unsigned lcd_cs = mach_info->lcd_cs_pin; + + int display_on_pol = mach_info->disp_on_value; + int lcd_cs_pol = mach_info->lcd_cs_value; + + printk("%s : %s, enable = %d", __FILE__, __FUNCTION__,enable); + if(display_on != INVALID_GPIO) + { + gpio_direction_output(display_on, 0); + gpio_set_value(display_on, enable ? display_on_pol : !display_on_pol); + } + if(lcd_cs != INVALID_GPIO) + { + gpio_direction_output(lcd_cs, 0); + gpio_set_value(lcd_cs, enable ? lcd_cs_pol : !lcd_cs_pol); + } +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ft5x0x_ts_early_suspend(struct early_suspend *h) +{ + struct FTS_TS_DATA_T *data = i2c_get_clientdata(this_client); + + + printk("enter ft5x0x_ts_early_suspend\n"); + + disable_irq_nosync(this_client->irq); + + cancel_work_sync(&data->pen_event_work); + + ft5x0x_ts_set_standby(this_client,0); + + return; +} +static void ft5x0x_ts_late_resume(struct early_suspend *h) +{ + struct FTS_TS_DATA_T *data = i2c_get_clientdata(this_client); + + ft5x0x_ts_set_standby(this_client,1); + + if(!work_pending(&data->pen_event_work)){ + PREPARE_WORK(&data->pen_event_work, fts_work_func); + queue_work(data->ts_workqueue, &data->pen_event_work); + } + else + enable_irq(this_client->irq); + + printk("ft5x0x_ts_late_resume finish\n"); + + return ; +} +#else +#define egalax_i2c_suspend NULL +#define egalax_i2c_resume NULL +#endif + static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -826,6 +901,7 @@ static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *i } this_client = client; + ft5x0x_ts->client = client; i2c_set_clientdata(client, ft5x0x_ts); INIT_WORK(&ft5x0x_ts->pen_event_work, fts_work_func); @@ -944,6 +1020,15 @@ static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *i goto exit_input_register_device_failed; } + +#ifdef CONFIG_HAS_EARLYSUSPEND + ft5x0x_ts->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; + ft5x0x_ts->early_suspend.suspend = ft5x0x_ts_early_suspend; + ft5x0x_ts->early_suspend.resume = ft5x0x_ts_late_resume; + register_early_suspend(&ft5x0x_ts->early_suspend); +#endif + + enable_irq(_sui_irq_num); printk("[TSP] file(%s), function (%s), -- end\n", __FILE__, __FUNCTION__); return 0; diff --git a/drivers/input/touchscreen/ft5x0x_i2c_ts.h b/drivers/input/touchscreen/ft5x0x_i2c_ts.h index 3b034d8d2129..d61f7a88c2d8 100755 --- a/drivers/input/touchscreen/ft5x0x_i2c_ts.h +++ b/drivers/input/touchscreen/ft5x0x_i2c_ts.h @@ -80,12 +80,6 @@ typedef enum u8 touch_point; }; -struct FTS_TS_DATA_T { - struct input_dev *input_dev; - struct FTS_TS_EVENT_T event; - struct work_struct pen_event_work; - struct workqueue_struct *ts_workqueue; -}; From e43fd37e2d32fd399805c992234e3f869eba09d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E5=B9=B3?= Date: Tue, 20 Sep 2011 16:49:47 +0800 Subject: [PATCH 123/150] phone-pad:modify wm8994 to satisfy phone pad product. --- arch/arm/mach-rk29/board-rk29-a22.c | 6 +- arch/arm/mach-rk29/board-rk29-phonesdk.c | 8 +- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 108 +--- include/linux/mfd/wm8994/pdata.h | 9 +- sound/soc/codecs/wm8994.c | 641 ++++++++++++++++++++- 5 files changed, 640 insertions(+), 132 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c index 599ce5865cc1..8b3e12b71103 100755 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -1440,7 +1440,11 @@ struct platform_device rk29_device_gps = { *****************************************************************************************/ struct wm8994_pdata wm8994_platdata = { .BB_input_diff = 0, - .phone_pad = 0, + .BB_class = NO_PCM_BB, + + .no_earpiece = 0, + .sp_hp_same_channel = 0, + .PA_control_pin = RK29_PIN6_PD3, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 47e0c7603bcb..5f8ee2921096 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -1513,9 +1513,13 @@ struct platform_device rk29_device_gps = { * author: qjb@rock-chips.com *****************************************************************************************/ struct wm8994_pdata wm8994_platdata = { - .BB_input_diff = 0, - .phone_pad = 0, + .BB_input_diff = 0, + .BB_class = NO_PCM_BB, + + .no_earpiece = 0, + .sp_hp_same_channel = 0, + .PA_control_pin = 0, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index aab2422074bc..2f343f320a01 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -384,7 +384,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 1, + .no_allocator = 0, .cached = 1, }; @@ -722,112 +722,12 @@ struct bq27510_platform_data bq27510_info = { * wm8994 codec * author: qjb@rock-chips.com *****************************************************************************************/ -//#if defined(CONFIG_MFD_WM8994) -#if defined (CONFIG_REGULATOR_WM8994) -static struct regulator_consumer_supply wm8994_ldo1_consumers[] = { - { - .supply = "DBVDD", - }, - { - .supply = "AVDD1", - }, - { - .supply = "CPVDD", - }, - { - .supply = "SPKVDD1", - } -}; -static struct regulator_consumer_supply wm8994_ldo2_consumers[] = { - { - .supply = "DCVDD", - }, - { - .supply = "AVDD2", - }, - { - .supply = "SPKVDD2", - } -}; -struct regulator_init_data regulator_init_data_ldo1 = { - .constraints = { - .name = "wm8994-ldo1", - .min_uA = 00000, - .max_uA = 18000, - .always_on = true, - .apply_uV = true, - .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_CURRENT, - }, - .num_consumer_supplies = ARRAY_SIZE(wm8994_ldo1_consumers), - .consumer_supplies = wm8994_ldo1_consumers, -}; -struct regulator_init_data regulator_init_data_ldo2 = { - .constraints = { - .name = "wm8994-ldo2", - .min_uA = 00000, - .max_uA = 18000, - .always_on = true, - .apply_uV = true, - .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_CURRENT, - }, - .num_consumer_supplies = ARRAY_SIZE(wm8994_ldo2_consumers), - .consumer_supplies = wm8994_ldo2_consumers, -}; -#endif -struct wm8994_drc_cfg wm8994_drc_cfg_pdata = { - .name = "wm8994_DRC", - .regs = {0,0,0,0,0}, -}; - -struct wm8994_retune_mobile_cfg wm8994_retune_mobile_cfg_pdata = { - .name = "wm8994_EQ", - .rate = 0, - .regs = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, -}; - struct wm8994_pdata wm8994_platdata = { -#if defined (CONFIG_GPIO_WM8994) - .gpio_base = WM8994_GPIO_EXPANDER_BASE, - //Fill value to initialize the GPIO - .gpio_defaults ={}, -#endif - //enable=0 disable ldo -#if defined (CONFIG_REGULATOR_WM8994) - .ldo = { - { - .enable = 0, - //RK29_PIN5_PA1 - .supply = NULL, - .init_data = ®ulator_init_data_ldo1, - }, - { - .enable = 0, - .supply = NULL, - .init_data = ®ulator_init_data_ldo2, - } - }, -#endif - //DRC 0--use default - .num_drc_cfgs = 0, - .drc_cfgs = &wm8994_drc_cfg_pdata, - //EQ 0--use default - .num_retune_mobile_cfgs = 0, - .retune_mobile_cfgs = &wm8994_retune_mobile_cfg_pdata, - - .lineout1_diff = 1, - .lineout2_diff = 1, - - .lineout1fb = 1, - .lineout2fb = 1, - - .micbias1_lvl = 1, - .micbias2_lvl = 1, - - .jd_scthr = 0, - .jd_thr = 0, + .no_earpiece = 1, + .sp_hp_same_channel = 1, .BB_input_diff = 1, - .phone_pad = 1, + .BB_class = PCM_BB, .PA_control_pin = RK29_PIN6_PB6, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h index 11412bed2583..f63b990b366e 100644 --- a/include/linux/mfd/wm8994/pdata.h +++ b/include/linux/mfd/wm8994/pdata.h @@ -59,6 +59,9 @@ struct wm8994_retune_mobile_cfg { u16 regs[WM8994_EQ_REGS]; }; +#define PCM_BB 1 +#define NO_PCM_BB 0 + struct wm8994_pdata { int gpio_base; @@ -94,16 +97,20 @@ struct wm8994_pdata { unsigned int jd_thr:2; //for phonepad - unsigned int phone_pad:1; // =0 is not phone_pad, =1 is phone_pad + unsigned int no_earpiece:1; // =1 don't have a earpiece, =0 has a earpiece + unsigned int sp_hp_same_channel:1; //BB input can be differential or single ended unsigned int BB_input_diff:1; // =0 single ended =1 differential + unsigned int BB_class:1;//PCM_BB= 1 NO_PCM_BB=0 //If an external amplifier speakers wm8994 enable>0 disable=0 unsigned int PA_control_pin; //wm8994 LDO1_ENA and LDO2_ENA unsigned int Power_EN_Pin; + char PowerEN_iomux_name[50]; + int PowerEN_iomux_mode; //volume int speaker_incall_vol; //max = 6, min = -21 diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 8d2bf2c325ac..65892019b8df 100755 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -51,13 +51,11 @@ char debug_write_read = 0; /* If digital BB is used,open this define. Define what kind of digital BB is used. */ -//#define PCM_BB -#ifdef PCM_BB #define TD688_MODE //#define MU301_MODE //#define CHONGY_MODE //#define THINKWILL_M800_MODE -#endif //PCM_BB + #if 1 #define DBG(x...) printk(KERN_INFO x) @@ -124,6 +122,11 @@ unsigned short BT_vol_table[16] ={0x01DB,0x01DC,0x01DD,0x01DE,0x01DF,0x01E0, 0x01E1,0x01E2,0x01E3,0x01E4,0x01E5,0x01E6, 0x01E7,0x01E8,0x01E9,0x01EA}; +void (*handsetMIC_to_baseband_to_headset)(void); +void (*mainMIC_to_baseband_to_headset)(void); +void (*mainMIC_to_baseband_to_earpiece)(void); +void (*mainMIC_to_baseband_to_speakers)(void); +void (*BT_baseband)(void); /* codec private data */ struct wm8994_priv { @@ -989,8 +992,8 @@ void AP_to_speakers(void) wm8994_write(0x01, 0x3033); } -#ifndef PCM_BB -void handsetMIC_to_baseband_to_headset(void) + +void handsetMIC_to_BB_to_headset(void) {// struct wm8994_priv *wm8994 = wm8994_codec->private_data; struct wm8994_pdata *pdata = wm8994->pdata; @@ -1044,7 +1047,7 @@ void handsetMIC_to_baseband_to_headset(void) wm8994_set_level_volume(); } -void mainMIC_to_baseband_to_headset(void) +void mainMIC_to_BB_to_headset(void) {// struct wm8994_priv *wm8994 = wm8994_codec->private_data; struct wm8994_pdata *pdata = wm8994->pdata; @@ -1099,7 +1102,7 @@ void mainMIC_to_baseband_to_headset(void) wm8994_set_level_volume(); } -void mainMIC_to_baseband_to_earpiece(void) +void mainMIC_to_BB_to_earpiece(void) {// DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1138,7 +1141,7 @@ void mainMIC_to_baseband_to_earpiece(void) wm8994_set_level_volume(); } -void mainMIC_to_baseband_to_speakers(void) +void mainMIC_to_BB_to_speakers(void) {// DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1187,7 +1190,7 @@ void mainMIC_to_baseband_to_speakers(void) wm8994_set_level_volume(); } -void BT_baseband(void) +void BT_BB(void) {// struct wm8994_priv *wm8994 = wm8994_codec->private_data; DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1322,9 +1325,9 @@ void BT_baseband(void) wm8994_write(0x04, 0x3303); wm8994_write(0x05, 0x3303); } -#else //PCM_BB + /******************PCM BB BEGIN*****************/ -void handsetMIC_to_baseband_to_headset(void) //pcmbaseband +void handsetMIC_to_PCMBB_to_headset(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1332,7 +1335,125 @@ void handsetMIC_to_baseband_to_headset(void) //pcmbaseband wm8994_current_mode=wm8994_handsetMIC_to_baseband_to_headset; wm8994_reset(); msleep(50); +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0xB51E); //0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x0119);//0x015F); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x000E);//0x000E); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + //For handset + wm8994_write(0x01, 0x0B33);//0x3833); // + wm8994_write(0x1C, 0x01F9); + wm8994_write(0x1D, 0x01F9); + wm8994_write(0x4C, 0x9F25); + wm8994_write(0x60, 0x00EE); + + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master + wm8994_set_level_volume(); + //wm8994_set_volume(wm8994_current_mode,call_vol,call_maxvol); +#endif + +#if 0 wm8994_write(0x01, 0x0003|wm8994_mic_VCC); msleep(50); wm8994_write(0x221, 0x0700); @@ -1403,11 +1524,216 @@ void handsetMIC_to_baseband_to_headset(void) //pcmbaseband wm8994_write(0x621, 0x0000); //0x0001); ///0x0000); wm8994_write(0x317, 0x0003); wm8994_write(0x312, 0x0000); /// as slave ///0x4000); //AIF2 SET AS MASTER - +#endif } -void mainMIC_to_baseband_to_earpiece(void) //pcmbaseband +void mainMIC_to_PCMBB_to_headset(void) +{ + DBG("%s::%d\n",__FUNCTION__,__LINE__); + + if(wm8994_current_mode==wm8994_mainMIC_to_baseband_to_earpiece)return; + wm8994_current_mode=wm8994_mainMIC_to_baseband_to_earpiece; + wm8994_reset(); + msleep(50); + +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0xB51E); //0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x015F); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x000E); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + + //For handset + wm8994_write(0x01, 0x0B33);//0x3833); // + wm8994_write(0x1C, 0x01F9); + wm8994_write(0x1D, 0x01F9); + wm8994_write(0x4C, 0x9F25); + wm8994_write(0x60, 0x00EE); + + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master + + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + wm8994_set_level_volume(); + //wm8994_set_volume(wm8994_current_mode,call_vol,call_maxvol); +#endif + +#if 0 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); + msleep(50); + wm8994_write(0x221, 0x0700); //MCLK=12MHz + wm8994_write(0x222, 0x3127); + wm8994_write(0x223, 0x0100); + wm8994_write(0x220, 0x0004); + msleep(50); + wm8994_write(0x220, 0x0005); + + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); ///0x0813); + wm8994_write(0x02, 0x0240); ///0x0110); + wm8994_write(0x03, 0x00F0); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x18, 0x011F); + wm8994_write(0x1F, 0x0000); + wm8994_write(0x28, 0x0030); ///0x0003); + wm8994_write(0x29, 0x0020); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + wm8994_write(0x200, 0x0001); + wm8994_write(0x204, 0x0001); + wm8994_write(0x208, 0x0007); + wm8994_write(0x520, 0x0000); + wm8994_write(0x601, 0x0004); + wm8994_write(0x602, 0x0004); + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); + wm8994_write(0x703, 0xC100); + wm8994_write(0x704, 0xC100); + wm8994_write(0x706, 0x4100); + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0x4108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + msleep(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x313, 0x00F0); + wm8994_write(0x314, 0x0020); + wm8994_write(0x315, 0x0020); + + wm8994_write(0x603, 0x018C); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0010); + wm8994_write(0x605, 0x0010); + wm8994_write(0x621, 0x0000); ///0x0001); + wm8994_write(0x317, 0x0003); + wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER +#endif + +} + +void mainMIC_to_PCMBB_to_earpiece(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1491,7 +1817,7 @@ void mainMIC_to_baseband_to_earpiece(void) //pcmbaseband } -void mainMIC_to_baseband_to_speakers(void) //pcmbaseband +void mainMIC_to_PCMBB_to_speakers(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1500,6 +1826,127 @@ void mainMIC_to_baseband_to_speakers(void) //pcmbaseband wm8994_reset(); msleep(50); +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0xB51E); //0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x0119);//0x015F); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x000E);//0x000E); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + + //For Speaker + wm8994_write(0x01, 0x3833); // + wm8994_write(0x03, 0x03F0); + wm8994_write(0x22, 0x0000); + wm8994_write(0x23, 0x0000); + wm8994_write(0x25, 0x017F); //+12DB 0x15B:4DB + //wm8994_write(0x25, 0x015B); + wm8994_write(0x36, 0x000C); + + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master + wm8994_set_level_volume(); + //wm8994_set_volume(wm8994_current_mode,call_vol,call_maxvol); +#endif + +#if 0 wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); msleep(50); wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) @@ -1573,11 +2020,11 @@ void mainMIC_to_baseband_to_speakers(void) //pcmbaseband wm8994_write(0x621, 0x0000); ///0x0001); wm8994_write(0x317, 0x0003); wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER - +#endif } -void BT_baseband(void) //pcmbaseband +void BT_PCMBB(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1586,6 +2033,131 @@ void BT_baseband(void) //pcmbaseband wm8994_reset(); msleep(50); +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x015F);//0x014B); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x0007);//0x0007); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + + wm8994_write(0x707, 0xA100); + wm8994_write(0x708, 0xA100); + wm8994_write(0x709, 0xA100); + wm8994_write(0x70A, 0xA100); + wm8994_write(0x06, 0x0014); + + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + +/* //For Speaker + wm8994_write(0x01, 0x3833); // + wm8994_write(0x03, 0x03F0); + wm8994_write(0x22, 0x0000); + wm8994_write(0x23, 0x0000); + //wm8994_write(0x25, 0x017F); //+12DB 0x15B:4DB + wm8994_write(0x36, 0x000C); +*/ + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master +#endif + +#if 0 wm8994_write(0x01 ,0x0003); msleep (50); @@ -1657,9 +2229,8 @@ void BT_baseband(void) //pcmbaseband wm8994_write(0x4C ,0x9F25); wm8994_write(0x60 ,0x00EE); ///////////end HP test - +#endif } -#endif //PCM_BB #define SOC_DOUBLE_SWITCH_WM8994CODEC(xname, route) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ @@ -1711,13 +2282,13 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, case SPEAKER_NORMAL: //AP-> 8994Codec -> Speaker case SPEAKER_RINGTONE: case EARPIECE_RINGTONE: - if(pdata->phone_pad == 1) + if(pdata->sp_hp_same_channel == 1) AP_to_headset(); else AP_to_speakers(); break; case SPEAKER_INCALL: //BB-> 8994Codec -> Speaker - if(pdata->phone_pad == 1) + if(pdata->sp_hp_same_channel == 1) mainMIC_to_baseband_to_headset(); else mainMIC_to_baseband_to_speakers(); @@ -1734,8 +2305,12 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, mainMIC_to_baseband_to_headset(); break; case EARPIECE_INCALL: //BB-> 8994Codec -> EARPIECE - if(pdata->phone_pad == 1) - mainMIC_to_baseband_to_headset(); + if(pdata->no_earpiece == 1){ + if(pdata->sp_hp_same_channel == 1) + mainMIC_to_baseband_to_headset(); + else + mainMIC_to_baseband_to_speakers(); + } else mainMIC_to_baseband_to_earpiece(); break; @@ -1747,7 +2322,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, AP_to_headset(); break; default: - if(pdata->phone_pad == 1) + if(pdata->sp_hp_same_channel == 1) AP_to_headset(); else AP_to_speakers(); @@ -1805,7 +2380,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, PA_ctrl(GPIO_HIGH); break; case EARPIECE_INCALL: - if(pdata->phone_pad == 1) + if(pdata->no_earpiece == 1) { msleep(50); PA_ctrl(GPIO_HIGH); @@ -2409,6 +2984,7 @@ static int wm8994_probe(struct platform_device *pdev) wm8994 = codec->private_data; pdata = wm8994->pdata; //disable power_EN + rk29_mux_api_set(pdata->PowerEN_iomux_name, pdata->PowerEN_iomux_mode); gpio_request(pdata->Power_EN_Pin, NULL); gpio_direction_output(pdata->Power_EN_Pin,GPIO_LOW); gpio_free(pdata->Power_EN_Pin); @@ -2429,6 +3005,23 @@ static int wm8994_probe(struct platform_device *pdev) goto card_err; } + if(pdata->BB_class == PCM_BB) + { + handsetMIC_to_baseband_to_headset = &handsetMIC_to_PCMBB_to_headset; + mainMIC_to_baseband_to_headset = &mainMIC_to_PCMBB_to_headset; + mainMIC_to_baseband_to_earpiece = &mainMIC_to_PCMBB_to_earpiece; + mainMIC_to_baseband_to_speakers = &mainMIC_to_PCMBB_to_speakers; + BT_baseband = &BT_PCMBB; + } + else + { + handsetMIC_to_baseband_to_headset = &handsetMIC_to_BB_to_headset; + mainMIC_to_baseband_to_headset = &mainMIC_to_BB_to_headset; + mainMIC_to_baseband_to_earpiece = &mainMIC_to_BB_to_earpiece; + mainMIC_to_baseband_to_speakers = &mainMIC_to_BB_to_speakers; + BT_baseband = &BT_BB; + } + PA_ctrl(GPIO_LOW); //enable power_EN msleep(50); From 5d6771f4c2262c17a7670b06a27e5ee1dbbcfa73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E5=B9=B3?= Date: Tue, 20 Sep 2011 16:52:10 +0800 Subject: [PATCH 124/150] phone-pad:add mw100 modem support. --- drivers/misc/Kconfig | 4 +- drivers/misc/MW100.c | 274 ++++++++++++++++++++++++++++++++++++++++++ drivers/misc/Makefile | 1 + 3 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 drivers/misc/MW100.c diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 0d3ad52ea80d..b5fefd612ee0 100755 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -299,7 +299,9 @@ config FM580X config MU509 bool "MU509 modem control driver" default n - +config MW100 + bool "MW100 modem control driver" + default n config RK29_NEWTON bool "RK29_NEWTON misc driver" default n diff --git a/drivers/misc/MW100.c b/drivers/misc/MW100.c new file mode 100644 index 000000000000..98b2c6859fde --- /dev/null +++ b/drivers/misc/MW100.c @@ -0,0 +1,274 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_LICENSE("GPL"); + +//#define DEBUG +#ifdef DEBUG +#define MODEMDBG(x...) printk(x) +#else +#define MODEMDBG(fmt,argss...) +#endif + +#define MW100IO 0XA1 +#define MW_IOCTL_RESET _IO(MW100IO,0X01) + +#define SLEEP 1 +#define READY 0 +#define MU509_RESET 0x01 +static struct wake_lock modem_wakelock; +#define IRQ_BB_WAKEUP_AP_TRIGGER IRQF_TRIGGER_RISING +//#define IRQ_BB_WAKEUP_AP_TRIGGER IRQF_TRIGGER_RISING +struct rk29_mu509_data *gpdata = NULL; +static int bp_wakeup_ap_irq = 0; + + +static void ap_wakeup_bp(struct platform_device *pdev, int wake) +{ + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + MODEMDBG("ap_wakeup_bp\n"); + + gpio_set_value(pdata->ap_wakeup_bp, wake); + +} +extern void rk28_send_wakeup_key(void); + +static void do_wakeup(struct work_struct *work) +{ + MODEMDBG("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + rk28_send_wakeup_key(); + enable_irq(bp_wakeup_ap_irq); +} + +static DECLARE_DELAYED_WORK(wakeup_work, do_wakeup); +static irqreturn_t detect_irq_handler(int irq, void *dev_id) +{ + disable_irq_nosync( irq); + printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + schedule_delayed_work(&wakeup_work, HZ / 10); + + return IRQ_HANDLED; +} +int modem_poweron_off(int on_off) +{ + struct rk29_mu509_data *pdata = gpdata; + if(on_off) + { + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); +/* + gpio_set_value(pdata->bp_power, GPIO_LOW); + msleep(1000); + gpio_set_value(pdata->bp_power, GPIO_HIGH); + msleep(700); + gpio_set_value(pdata->ap_wakeup_bp, GPIO_LOW); +*/ + } + else + { + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); +/* + gpio_set_value(pdata->bp_power, GPIO_LOW); + mdelay(2500); + gpio_set_value(pdata->bp_power, GPIO_HIGH); +*/ + } + return 0; +} +static int mu509_open(struct inode *inode, struct file *file) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + //modem_poweron_off(1); + return 0; +} + +static int mu509_release(struct inode *inode, struct file *file) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + //modem_poweron_off(0); + return 0; +} + +static int mu509_ioctl(struct inode *inode,struct file *file, unsigned int cmd, unsigned long arg) +{ + struct rk29_mu509_data *pdata = gpdata; + switch(cmd) + { + case MW_IOCTL_RESET: + printk("%s::%d--bruins--ioctl mw100 reset\n",__func__,__LINE__); + gpio_direction_output(pdata->bp_reset,GPIO_LOW); + mdelay(120); + gpio_set_value(pdata->bp_reset, GPIO_HIGH); + + break; + default: + break; + } + return 0; +} + +static struct file_operations mu509_fops = { + .owner = THIS_MODULE, + .open = mu509_open, + .release = mu509_release, + .ioctl = mu509_ioctl +}; + +static struct miscdevice mu509_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = "mw100", + .fops = &mu509_fops +}; + +static int mu509_probe(struct platform_device *pdev) +{ + struct rk29_mu509_data *pdata = gpdata = pdev->dev.platform_data; + struct modem_dev *mu509_data = NULL; + int result, irq = 0; + + gpio_request(pdata->bp_power,"bp_power"); + gpio_request(pdata->bp_reset,"bp_reset"); + gpio_request(pdata->bp_wakeup_ap,"bp_wakeup_ap"); + gpio_request(pdata->ap_wakeup_bp,"ap_wakeup_bp"); + + rk29_mux_api_set(GPIO6C76_CPUTRACEDATA76_NAME, GPIO4H_GPIO6C76); + + gpio_direction_output(pdata->bp_reset,GPIO_LOW); + mdelay(120); + gpio_set_value(pdata->bp_reset, GPIO_HIGH); + + gpio_set_value(pdata->ap_wakeup_bp, GPIO_HIGH); + gpio_direction_output(pdata->ap_wakeup_bp,GPIO_HIGH); + + gpio_set_value(pdata->bp_power, GPIO_HIGH); + gpio_direction_output(pdata->bp_power,GPIO_HIGH); + mdelay(120); + gpio_set_value(pdata->bp_power, GPIO_LOW); + gpio_direction_output(pdata->bp_power,GPIO_LOW); + + + // +/* gpio_set_value(pdata->bp_reset, GPIO_LOW); + gpio_direction_output(pdata->bp_reset,GPIO_LOW); + mdelay(120); + gpio_set_value(pdata->bp_reset, GPIO_HIGH); + gpio_direction_output(pdata->bp_reset,GPIO_HIGH); +*/ + mu509_data = kzalloc(sizeof(struct modem_dev), GFP_KERNEL); + if(mu509_data == NULL){ + printk("failed to request mu509_data\n"); + goto err2; + } + platform_set_drvdata(pdev, mu509_data); + + gpio_direction_input(pdata->bp_wakeup_ap); + irq = gpio_to_irq(pdata->bp_wakeup_ap); + if(irq < 0){ + gpio_free(pdata->bp_wakeup_ap); + printk("failed to request bp_wakeup_ap\n"); + } + + bp_wakeup_ap_irq = irq; + + result = request_irq(irq, detect_irq_handler, IRQ_BB_WAKEUP_AP_TRIGGER, "bp_wakeup_ap", NULL); + if (result < 0) { + printk("%s: request_irq(%d) failed\n", __func__, irq); + gpio_free(pdata->bp_wakeup_ap); + goto err0; + } + + enable_irq_wake(bp_wakeup_ap_irq); + + result = misc_register(&mu509_misc); + if(result){ + MODEMDBG("misc_register err\n"); + } + return result; +err0: + gpio_free(pdata->bp_wakeup_ap); +err1: + gpio_free(pdata->ap_wakeup_bp); +err2: + kfree(mu509_data); + return 0; +} + +int mu509_suspend(struct platform_device *pdev) +{ + + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + MODEMDBG("%s::%d--\n",__func__,__LINE__); + gpio_set_value(pdata->ap_wakeup_bp, GPIO_LOW); + return 0; +} + +int mu509_resume(struct platform_device *pdev) +{ + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + gpio_set_value(pdata->ap_wakeup_bp, GPIO_HIGH); + return 0; +} + +void mu509_shutdown(struct platform_device *pdev, pm_message_t state) +{ + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + struct modem_dev *mu509_data = platform_get_drvdata(pdev); + + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + gpio_set_value(pdata->bp_power, GPIO_HIGH); + mdelay(2010); + + gpio_free(pdata->bp_power); + gpio_free(pdata->bp_reset); + gpio_free(pdata->ap_wakeup_bp); + gpio_free(pdata->bp_wakeup_ap); + kfree(mu509_data); +} + +static struct platform_driver mu509_driver = { + .probe = mu509_probe, + .shutdown = mu509_shutdown, + .suspend = mu509_suspend, + .resume = mu509_resume, + .driver = { + .name = "MW100", + .owner = THIS_MODULE, + }, +}; + +static int __init mu509_init(void) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + return platform_driver_register(&mu509_driver); +} + +static void __exit mu509_exit(void) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + platform_driver_unregister(&mu509_driver); +} + +module_init(mu509_init); + +module_exit(mu509_exit); diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index c3dc3cf11ce2..6d98f4888a68 100755 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -31,6 +31,7 @@ obj-$(CONFIG_APANIC) += apanic.o obj-$(CONFIG_MTK23D) += mtk23d.o obj-$(CONFIG_FM580X) += fm580x.o obj-$(CONFIG_MU509) += mu509.o +obj-$(CONFIG_MW100) += MW100.o obj-$(CONFIG_STE) += ste.o obj-$(CONFIG_RK29_SUPPORT_MODEM) += rk29_modem/ obj-$(CONFIG_GPS_GNS7560) += gps/ From 5d4081964ec7cc2288f75d3cf5949bd2daa2737e Mon Sep 17 00:00:00 2001 From: xbw Date: Wed, 21 Sep 2011 14:25:53 +0800 Subject: [PATCH 125/150] add the feature of write-protect for sdcard --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 13 +++++++++ arch/arm/mach-rk29/include/mach/board.h | 1 + drivers/mmc/host/Kconfig | 13 +++++++++ drivers/mmc/host/rk29_sdmmc.c | 39 ++++++++++++++++++++++--- 4 files changed, 62 insertions(+), 4 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk29/include/mach/board.h mode change 100644 => 100755 drivers/mmc/host/Kconfig diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 7e8c3ce90ed8..6976859a2105 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -1869,6 +1869,12 @@ struct rk29_sdmmc_platform_data default_sdmmc0_data = { #endif .detect_irq = RK29_PIN2_PA2, // INVALID_GPIO .enable_sd_wakeup = 0, + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) + .write_prt = RK29_PIN6_PB0,//According to your own project to set the value of write-protect-pin. +#else + .write_prt = INVALID_GPIO, +#endif }; #endif #ifdef CONFIG_SDMMC1_RK29 @@ -1912,6 +1918,13 @@ struct rk29_sdmmc_platform_data default_sdmmc1_data = { #if 0 .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N, #endif + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + .write_prt = RK29_PIN6_PB0,//According to your own project to set the value of write-protect-pin. +#else + .write_prt = INVALID_GPIO, +#endif + }; #endif diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h old mode 100644 new mode 100755 index c97306d4af19..efd21ecc328e --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -143,6 +143,7 @@ struct rk29_sdmmc_platform_data { int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id); int detect_irq; int enable_sd_wakeup; + int write_prt; }; struct rk29_i2c_platform_data { int bus_num; diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig old mode 100644 new mode 100755 index c5886cdd7201..85df780a5e0a --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -24,6 +24,13 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC0 controller on Rk29 processors. + + config SDMMC0_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC0" + depends on SDMMC0_RK29 + help + You will add the feature of write-protect for sdmmc-card if you say Yes. + Please note that this feature requires hardware support. # config EMMC_RK29 # tristate "RK29 EMMC controller support(sdmmc)" # default y @@ -36,6 +43,12 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC1 controller on Rk29 processors. + config SDMMC1_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC1" + depends on SDMMC1_RK29 + help + You will add the feature of write-protect for sdio-card if you say Yes. + Please note that this feature requires hardware support. endif config MMC_ARMMMCI diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index c9ed1c8522cb..ca13c9553815 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -61,7 +61,7 @@ int debug_level = 7; #define xbwprintk(n, arg...) #endif -#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN /*| SDMMC_INT_RTO*/ | SDMMC_INT_HLE ) +#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN | SDMMC_INT_HLE ) #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD) #define RK29_SDMMC_INTMASK_USEIO (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD| SDMMC_INT_TXDR | SDMMC_INT_RXDR ) @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.07 The last modify date is 2011-09-09,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.08 The last modify date is 2011-09-21,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -197,10 +197,16 @@ struct rk29_sdmmc { unsigned int oldstatus; unsigned int complete_done; unsigned int retryfunc; + #ifdef CONFIG_PM int gpio_irq; int gpio_det; #endif + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int write_protect; +#endif + }; @@ -2074,10 +2080,26 @@ static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) static int rk29_sdmmc_get_ro(struct mmc_host *mmc) { - struct rk29_sdmmc *host = mmc_priv(mmc); + struct rk29_sdmmc *host = mmc_priv(mmc); + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int ret; + + if(INVALID_GPIO == host->write_protect) + ret = 0;//no write-protect + else + ret = gpio_get_value(host->write_protect)?0:1; + + xbwprintk(7,"%s..%d.. write_prt_pin=%d, get_ro=%d ===xbw[%s]===\n",\ + __FUNCTION__, __LINE__,host->write_protect, ret, host->dma_name); + + return ret; + +#else u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT); - + return (wrtprt & SDMMC_WRITE_PROTECT)?1:0; +#endif } @@ -3027,6 +3049,15 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) host->dma_addr = regs->start + SDMMC_DATA; } +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + host->write_protect = pdata->write_prt; + if(INVALID_GPIO != host->write_protect) + { + gpio_direction_input(host->write_protect); + } + +#endif + rk29_sdmmc_hw_init(host); ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host); From 5cce5b4334cb5c8b4c78913776a71a1fcbe25b93 Mon Sep 17 00:00:00 2001 From: huangdesheng Date: Wed, 21 Sep 2011 15:08:34 +0800 Subject: [PATCH 126/150] add compose_layer_count in fb --- drivers/video/rk29_fb.c | 10 +++++++++- include/linux/fb.h | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index 7eff5a019a7e..497bed843afb 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -272,7 +272,7 @@ static u32 last_yuv_phy[2] = {0,0}; #endif int fb0_first_buff_bits = 32; int fb0_second_buff_bits = 32; - +int fb_compose_layer_count = 0; static BLOCKING_NOTIFIER_HEAD(rk29fb_notifier_list); int rk29fb_register_notifier(struct notifier_block *nb) { @@ -1735,6 +1735,14 @@ static int fb0_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { return fb0_first_buff_bits; } + case FBIOSET_COMPOSE_LAYER_COUNTS: + fb_compose_layer_count = arg; + break; + + case FBIOGET_COMPOSE_LAYER_COUNTS: + + return fb_compose_layer_count; + case FBIOPUT_FBPHYADD: return info->fix.smem_start; case FBIOGET_OVERLAY_STATE: diff --git a/include/linux/fb.h b/include/linux/fb.h index 4463d75862ea..c3a17a72f8b6 100755 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -49,6 +49,8 @@ struct dentry; #define FBIOGET_SCREEN_STATE 0X4620 #define FBIOGET_16OR32 0X4621 #define FBIOGET_IDLEFBUff_16OR32 0X4622 +#define FBIOSET_COMPOSE_LAYER_COUNTS 0X4623 +#define FBIOGET_COMPOSE_LAYER_COUNTS 0X4624 #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ #define FB_TYPE_PLANES 1 /* Non interleaved planes */ From abaf233b4a5743f3979a7ad0c9b6ff07c6bab8be Mon Sep 17 00:00:00 2001 From: xbw Date: Thu, 22 Sep 2011 12:25:13 +0800 Subject: [PATCH 127/150] Revert "add the feature of write-protect for sdcard" This reverts commit 5d4081964ec7cc2288f75d3cf5949bd2daa2737e. --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 13 --------- arch/arm/mach-rk29/include/mach/board.h | 1 - drivers/mmc/host/Kconfig | 13 --------- drivers/mmc/host/rk29_sdmmc.c | 39 +++---------------------- 4 files changed, 4 insertions(+), 62 deletions(-) mode change 100755 => 100644 arch/arm/mach-rk29/include/mach/board.h mode change 100755 => 100644 drivers/mmc/host/Kconfig diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 6976859a2105..7e8c3ce90ed8 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -1869,12 +1869,6 @@ struct rk29_sdmmc_platform_data default_sdmmc0_data = { #endif .detect_irq = RK29_PIN2_PA2, // INVALID_GPIO .enable_sd_wakeup = 0, - -#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) - .write_prt = RK29_PIN6_PB0,//According to your own project to set the value of write-protect-pin. -#else - .write_prt = INVALID_GPIO, -#endif }; #endif #ifdef CONFIG_SDMMC1_RK29 @@ -1918,13 +1912,6 @@ struct rk29_sdmmc_platform_data default_sdmmc1_data = { #if 0 .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N, #endif - -#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) - .write_prt = RK29_PIN6_PB0,//According to your own project to set the value of write-protect-pin. -#else - .write_prt = INVALID_GPIO, -#endif - }; #endif diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h old mode 100755 new mode 100644 index efd21ecc328e..c97306d4af19 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -143,7 +143,6 @@ struct rk29_sdmmc_platform_data { int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id); int detect_irq; int enable_sd_wakeup; - int write_prt; }; struct rk29_i2c_platform_data { int bus_num; diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig old mode 100755 new mode 100644 index 85df780a5e0a..c5886cdd7201 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -24,13 +24,6 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC0 controller on Rk29 processors. - - config SDMMC0_RK29_WRITE_PROTECT - bool "Write-protect for SDMMC0" - depends on SDMMC0_RK29 - help - You will add the feature of write-protect for sdmmc-card if you say Yes. - Please note that this feature requires hardware support. # config EMMC_RK29 # tristate "RK29 EMMC controller support(sdmmc)" # default y @@ -43,12 +36,6 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC1 controller on Rk29 processors. - config SDMMC1_RK29_WRITE_PROTECT - bool "Write-protect for SDMMC1" - depends on SDMMC1_RK29 - help - You will add the feature of write-protect for sdio-card if you say Yes. - Please note that this feature requires hardware support. endif config MMC_ARMMMCI diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index ca13c9553815..c9ed1c8522cb 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -61,7 +61,7 @@ int debug_level = 7; #define xbwprintk(n, arg...) #endif -#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN | SDMMC_INT_HLE ) +#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN /*| SDMMC_INT_RTO*/ | SDMMC_INT_HLE ) #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD) #define RK29_SDMMC_INTMASK_USEIO (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD| SDMMC_INT_TXDR | SDMMC_INT_RXDR ) @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.08 The last modify date is 2011-09-21,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.07 The last modify date is 2011-09-09,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -197,16 +197,10 @@ struct rk29_sdmmc { unsigned int oldstatus; unsigned int complete_done; unsigned int retryfunc; - #ifdef CONFIG_PM int gpio_irq; int gpio_det; #endif - -#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) - int write_protect; -#endif - }; @@ -2080,26 +2074,10 @@ static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) static int rk29_sdmmc_get_ro(struct mmc_host *mmc) { - struct rk29_sdmmc *host = mmc_priv(mmc); - -#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) - int ret; - - if(INVALID_GPIO == host->write_protect) - ret = 0;//no write-protect - else - ret = gpio_get_value(host->write_protect)?0:1; - - xbwprintk(7,"%s..%d.. write_prt_pin=%d, get_ro=%d ===xbw[%s]===\n",\ - __FUNCTION__, __LINE__,host->write_protect, ret, host->dma_name); - - return ret; - -#else + struct rk29_sdmmc *host = mmc_priv(mmc); u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT); - + return (wrtprt & SDMMC_WRITE_PROTECT)?1:0; -#endif } @@ -3049,15 +3027,6 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) host->dma_addr = regs->start + SDMMC_DATA; } -#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) - host->write_protect = pdata->write_prt; - if(INVALID_GPIO != host->write_protect) - { - gpio_direction_input(host->write_protect); - } - -#endif - rk29_sdmmc_hw_init(host); ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host); From 879db17051889289577ca2e673d79db208c78ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E5=B9=B3?= Date: Thu, 22 Sep 2011 12:47:28 +0800 Subject: [PATCH 128/150] phone-pad: ui pmem should be no_allocator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上次的提交误操作修改了no_allocator的值,这里将其还原 --- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index 2f343f320a01..2d8f49ed3a2c 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -384,7 +384,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 0, + .no_allocator = 1, .cached = 1, }; From a9b0ef73b211797cd888b5445c3b962320bdf02e Mon Sep 17 00:00:00 2001 From: xbw Date: Thu, 22 Sep 2011 13:18:17 +0800 Subject: [PATCH 129/150] add the function of write-protec for sdmmc after you select the option --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 33 ++++++++++++++++++++++++ arch/arm/mach-rk29/include/mach/board.h | 1 + drivers/mmc/host/Kconfig | 13 ++++++++++ drivers/mmc/host/rk29_sdmmc.c | 34 ++++++++++++++++++++++--- 4 files changed, 77 insertions(+), 4 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk29/include/mach/board.h mode change 100644 => 100755 drivers/mmc/host/Kconfig diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 7e8c3ce90ed8..a739fefdf1ec 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -1823,6 +1823,15 @@ static struct platform_device rk29_device_pwm_regulator = { #endif +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) +#define SDMMC0_WRITE_PROTECT_PIN RK29_PIN6_PB0 //According to your own project to set the value of write-protect-pin. +#endif + + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) +#define SDMMC1_WRITE_PROTECT_PIN RK29_PIN6_PB0 //According to your own project to set the value of write-protect-pin. +#endif + /***************************************************************************************** * SDMMC devices *****************************************************************************************/ @@ -1851,6 +1860,12 @@ static int rk29_sdmmc0_cfg_gpio(void) #else gpio_direction_output(RK29_PIN5_PD5,GPIO_LOW); #endif + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) + gpio_request(SDMMC0_WRITE_PROTECT_PIN,"sdmmc-wp"); + gpio_direction_input(SDMMC0_WRITE_PROTECT_PIN); +#endif + return 0; } @@ -1869,6 +1884,12 @@ struct rk29_sdmmc_platform_data default_sdmmc0_data = { #endif .detect_irq = RK29_PIN2_PA2, // INVALID_GPIO .enable_sd_wakeup = 0, + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) + .write_prt = SDMMC0_WRITE_PROTECT_PIN, +#else + .write_prt = INVALID_GPIO, +#endif }; #endif #ifdef CONFIG_SDMMC1_RK29 @@ -1882,6 +1903,11 @@ static int rk29_sdmmc1_cfg_gpio(void) rk29_mux_api_set(GPIO1C5_SDMMC1DATA2_NAME, GPIO1H_SDMMC1_DATA2); rk29_mux_api_set(GPIO1C6_SDMMC1DATA3_NAME, GPIO1H_SDMMC1_DATA3); //rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_SDMMC1_DETECT_N); + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + gpio_request(SDMMC1_WRITE_PROTECT_PIN,"sdio-wp"); + gpio_direction_input(SDMMC1_WRITE_PROTECT_PIN); +#endif return 0; } @@ -1912,6 +1938,13 @@ struct rk29_sdmmc_platform_data default_sdmmc1_data = { #if 0 .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N, #endif + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + .write_prt = SDMMC1_WRITE_PROTECT_PIN, +#else + .write_prt = INVALID_GPIO, +#endif + }; #endif diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h old mode 100644 new mode 100755 index c97306d4af19..c5c222428923 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -143,6 +143,7 @@ struct rk29_sdmmc_platform_data { int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id); int detect_irq; int enable_sd_wakeup; + int write_prt; }; struct rk29_i2c_platform_data { int bus_num; diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig old mode 100644 new mode 100755 index c5886cdd7201..85df780a5e0a --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -24,6 +24,13 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC0 controller on Rk29 processors. + + config SDMMC0_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC0" + depends on SDMMC0_RK29 + help + You will add the feature of write-protect for sdmmc-card if you say Yes. + Please note that this feature requires hardware support. # config EMMC_RK29 # tristate "RK29 EMMC controller support(sdmmc)" # default y @@ -36,6 +43,12 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC1 controller on Rk29 processors. + config SDMMC1_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC1" + depends on SDMMC1_RK29 + help + You will add the feature of write-protect for sdio-card if you say Yes. + Please note that this feature requires hardware support. endif config MMC_ARMMMCI diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index c9ed1c8522cb..488149d41ba4 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -61,7 +61,7 @@ int debug_level = 7; #define xbwprintk(n, arg...) #endif -#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN /*| SDMMC_INT_RTO*/ | SDMMC_INT_HLE ) +#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN | SDMMC_INT_HLE ) #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD) #define RK29_SDMMC_INTMASK_USEIO (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD| SDMMC_INT_TXDR | SDMMC_INT_RXDR ) @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.07 The last modify date is 2011-09-09,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.08 The last modify date is 2011-09-21,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -197,10 +197,16 @@ struct rk29_sdmmc { unsigned int oldstatus; unsigned int complete_done; unsigned int retryfunc; + #ifdef CONFIG_PM int gpio_irq; int gpio_det; #endif + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int write_protect; +#endif + }; @@ -2074,10 +2080,26 @@ static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) static int rk29_sdmmc_get_ro(struct mmc_host *mmc) { - struct rk29_sdmmc *host = mmc_priv(mmc); + struct rk29_sdmmc *host = mmc_priv(mmc); + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int ret; + + if(INVALID_GPIO == host->write_protect) + ret = 0;//no write-protect + else + ret = gpio_get_value(host->write_protect)?1:0; + + xbwprintk(7,"%s..%d.. write_prt_pin=%d, get_ro=%d ===xbw[%s]===\n",\ + __FUNCTION__, __LINE__,host->write_protect, ret, host->dma_name); + + return ret; + +#else u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT); - + return (wrtprt & SDMMC_WRITE_PROTECT)?1:0; +#endif } @@ -3027,6 +3049,10 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) host->dma_addr = regs->start + SDMMC_DATA; } +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + host->write_protect = pdata->write_prt; +#endif + rk29_sdmmc_hw_init(host); ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host); From 60f96d5bc0fded2dfe3dd8a23d99105bfbc038a5 Mon Sep 17 00:00:00 2001 From: huangdesheng Date: Wed, 21 Sep 2011 15:08:34 +0800 Subject: [PATCH 130/150] add compose_layer_count in fb --- drivers/video/rk29_fb.c | 10 +++++++++- include/linux/fb.h | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/video/rk29_fb.c b/drivers/video/rk29_fb.c index 7eff5a019a7e..497bed843afb 100755 --- a/drivers/video/rk29_fb.c +++ b/drivers/video/rk29_fb.c @@ -272,7 +272,7 @@ static u32 last_yuv_phy[2] = {0,0}; #endif int fb0_first_buff_bits = 32; int fb0_second_buff_bits = 32; - +int fb_compose_layer_count = 0; static BLOCKING_NOTIFIER_HEAD(rk29fb_notifier_list); int rk29fb_register_notifier(struct notifier_block *nb) { @@ -1735,6 +1735,14 @@ static int fb0_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) { return fb0_first_buff_bits; } + case FBIOSET_COMPOSE_LAYER_COUNTS: + fb_compose_layer_count = arg; + break; + + case FBIOGET_COMPOSE_LAYER_COUNTS: + + return fb_compose_layer_count; + case FBIOPUT_FBPHYADD: return info->fix.smem_start; case FBIOGET_OVERLAY_STATE: diff --git a/include/linux/fb.h b/include/linux/fb.h index 4463d75862ea..c3a17a72f8b6 100755 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -49,6 +49,8 @@ struct dentry; #define FBIOGET_SCREEN_STATE 0X4620 #define FBIOGET_16OR32 0X4621 #define FBIOGET_IDLEFBUff_16OR32 0X4622 +#define FBIOSET_COMPOSE_LAYER_COUNTS 0X4623 +#define FBIOGET_COMPOSE_LAYER_COUNTS 0X4624 #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ #define FB_TYPE_PLANES 1 /* Non interleaved planes */ From 2149515b9620b58bedf369dce4cfc040bd01beb0 Mon Sep 17 00:00:00 2001 From: xbw Date: Thu, 22 Sep 2011 13:18:17 +0800 Subject: [PATCH 131/150] add the function of write-protect for sdmmc after you select the option --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 33 ++++++++++++++++++++++++ arch/arm/mach-rk29/include/mach/board.h | 1 + drivers/mmc/host/Kconfig | 13 ++++++++++ drivers/mmc/host/rk29_sdmmc.c | 34 ++++++++++++++++++++++--- 4 files changed, 77 insertions(+), 4 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk29/include/mach/board.h mode change 100644 => 100755 drivers/mmc/host/Kconfig diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 7e8c3ce90ed8..a739fefdf1ec 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -1823,6 +1823,15 @@ static struct platform_device rk29_device_pwm_regulator = { #endif +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) +#define SDMMC0_WRITE_PROTECT_PIN RK29_PIN6_PB0 //According to your own project to set the value of write-protect-pin. +#endif + + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) +#define SDMMC1_WRITE_PROTECT_PIN RK29_PIN6_PB0 //According to your own project to set the value of write-protect-pin. +#endif + /***************************************************************************************** * SDMMC devices *****************************************************************************************/ @@ -1851,6 +1860,12 @@ static int rk29_sdmmc0_cfg_gpio(void) #else gpio_direction_output(RK29_PIN5_PD5,GPIO_LOW); #endif + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) + gpio_request(SDMMC0_WRITE_PROTECT_PIN,"sdmmc-wp"); + gpio_direction_input(SDMMC0_WRITE_PROTECT_PIN); +#endif + return 0; } @@ -1869,6 +1884,12 @@ struct rk29_sdmmc_platform_data default_sdmmc0_data = { #endif .detect_irq = RK29_PIN2_PA2, // INVALID_GPIO .enable_sd_wakeup = 0, + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) + .write_prt = SDMMC0_WRITE_PROTECT_PIN, +#else + .write_prt = INVALID_GPIO, +#endif }; #endif #ifdef CONFIG_SDMMC1_RK29 @@ -1882,6 +1903,11 @@ static int rk29_sdmmc1_cfg_gpio(void) rk29_mux_api_set(GPIO1C5_SDMMC1DATA2_NAME, GPIO1H_SDMMC1_DATA2); rk29_mux_api_set(GPIO1C6_SDMMC1DATA3_NAME, GPIO1H_SDMMC1_DATA3); //rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_SDMMC1_DETECT_N); + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + gpio_request(SDMMC1_WRITE_PROTECT_PIN,"sdio-wp"); + gpio_direction_input(SDMMC1_WRITE_PROTECT_PIN); +#endif return 0; } @@ -1912,6 +1938,13 @@ struct rk29_sdmmc_platform_data default_sdmmc1_data = { #if 0 .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N, #endif + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + .write_prt = SDMMC1_WRITE_PROTECT_PIN, +#else + .write_prt = INVALID_GPIO, +#endif + }; #endif diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h old mode 100644 new mode 100755 index c97306d4af19..c5c222428923 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -143,6 +143,7 @@ struct rk29_sdmmc_platform_data { int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id); int detect_irq; int enable_sd_wakeup; + int write_prt; }; struct rk29_i2c_platform_data { int bus_num; diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig old mode 100644 new mode 100755 index c5886cdd7201..85df780a5e0a --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -24,6 +24,13 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC0 controller on Rk29 processors. + + config SDMMC0_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC0" + depends on SDMMC0_RK29 + help + You will add the feature of write-protect for sdmmc-card if you say Yes. + Please note that this feature requires hardware support. # config EMMC_RK29 # tristate "RK29 EMMC controller support(sdmmc)" # default y @@ -36,6 +43,12 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC1 controller on Rk29 processors. + config SDMMC1_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC1" + depends on SDMMC1_RK29 + help + You will add the feature of write-protect for sdio-card if you say Yes. + Please note that this feature requires hardware support. endif config MMC_ARMMMCI diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index c9ed1c8522cb..488149d41ba4 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -61,7 +61,7 @@ int debug_level = 7; #define xbwprintk(n, arg...) #endif -#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN /*| SDMMC_INT_RTO*/ | SDMMC_INT_HLE ) +#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN | SDMMC_INT_HLE ) #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD) #define RK29_SDMMC_INTMASK_USEIO (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD| SDMMC_INT_TXDR | SDMMC_INT_RXDR ) @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.07 The last modify date is 2011-09-09,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.08 The last modify date is 2011-09-21,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -197,10 +197,16 @@ struct rk29_sdmmc { unsigned int oldstatus; unsigned int complete_done; unsigned int retryfunc; + #ifdef CONFIG_PM int gpio_irq; int gpio_det; #endif + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int write_protect; +#endif + }; @@ -2074,10 +2080,26 @@ static void rk29_sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) static int rk29_sdmmc_get_ro(struct mmc_host *mmc) { - struct rk29_sdmmc *host = mmc_priv(mmc); + struct rk29_sdmmc *host = mmc_priv(mmc); + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int ret; + + if(INVALID_GPIO == host->write_protect) + ret = 0;//no write-protect + else + ret = gpio_get_value(host->write_protect)?1:0; + + xbwprintk(7,"%s..%d.. write_prt_pin=%d, get_ro=%d ===xbw[%s]===\n",\ + __FUNCTION__, __LINE__,host->write_protect, ret, host->dma_name); + + return ret; + +#else u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT); - + return (wrtprt & SDMMC_WRITE_PROTECT)?1:0; +#endif } @@ -3027,6 +3049,10 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) host->dma_addr = regs->start + SDMMC_DATA; } +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + host->write_protect = pdata->write_prt; +#endif + rk29_sdmmc_hw_init(host); ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host); From d411bc6acaad5caa5b0a8ca81cca395243e35953 Mon Sep 17 00:00:00 2001 From: zwp Date: Tue, 6 Sep 2011 19:45:22 -0700 Subject: [PATCH 132/150] TCL_Phonepad:modify ddr frequence to 456MHz. --- arch/arm/configs/rk29_phonepadsdk_defconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/arm/configs/rk29_phonepadsdk_defconfig b/arch/arm/configs/rk29_phonepadsdk_defconfig index eee1a810eb38..6540cf440bd4 100644 --- a/arch/arm/configs/rk29_phonepadsdk_defconfig +++ b/arch/arm/configs/rk29_phonepadsdk_defconfig @@ -230,8 +230,9 @@ CONFIG_MACH_RK29_PHONEPADSDK=y # CONFIG_DDR_TYPE_DDR3_2133N is not set CONFIG_DDR_TYPE_DDR3_DEFAULT=y CONFIG_RK29_MEM_SIZE_M=512 -CONFIG_DDR_SDRAM_FREQ=400 -CONFIG_DDR_FREQ=y +CONFIG_DDR_SDRAM_FREQ=456 +# CONFIG_DDR_RECONFIG is not set +CONFIG_WIFI_CONTROL_FUNC=y # # RK29 VPU (Video Processing Unit) support From 99156e8889a7737699b2762f1146a56fbff630b0 Mon Sep 17 00:00:00 2001 From: wlq Date: Thu, 8 Sep 2011 14:20:04 +0800 Subject: [PATCH 133/150] phone-pad:add ThinkWill MI900 product ID --- drivers/usb/serial/option.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index a7ab681063aa..c7bc9be950d2 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -373,6 +373,7 @@ static int option_resume(struct usb_serial *serial); /* Thinkwill products */ #define THINKWILL_VENDOR_ID 0x19f5 #define THINKWILL_PRODUCT_ID 0x9909 +#define THINKWILL_MI900_PRODUCT_ID 0x9013 /* Cinterion (formerly Siemens) products */ #define SIEMENS_VENDOR_ID 0x0681 @@ -412,6 +413,9 @@ static int option_resume(struct usb_serial *serial); static struct usb_device_id option_ids[] = { { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(THINKWILL_VENDOR_ID,THINKWILL_PRODUCT_ID)}, + + { USB_DEVICE(THINKWILL_VENDOR_ID,THINKWILL_MI900_PRODUCT_ID)}, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) }, From 0d4c561317057f749b2c7eb85204e4b7c75725e8 Mon Sep 17 00:00:00 2001 From: zwp Date: Thu, 15 Sep 2011 01:45:28 -0700 Subject: [PATCH 134/150] tcl-phone-pad:improve tp performance. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决手指从触屏的边缘开始滑动时,可能出现触屏不响应的情况。 --- drivers/input/touchscreen/ft5x0x_i2c_ts.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100644 => 100755 drivers/input/touchscreen/ft5x0x_i2c_ts.h diff --git a/drivers/input/touchscreen/ft5x0x_i2c_ts.h b/drivers/input/touchscreen/ft5x0x_i2c_ts.h old mode 100644 new mode 100755 index 10eb263cb55d..3b034d8d2129 --- a/drivers/input/touchscreen/ft5x0x_i2c_ts.h +++ b/drivers/input/touchscreen/ft5x0x_i2c_ts.h @@ -13,8 +13,8 @@ #define CFG_NUMOFKEYS 0x4 //number of touch keys #ifdef CONFIG_FTS_CUSTOME_ENV -#define SCREEN_MAX_X 1024 -#define SCREEN_MAX_Y 600 +#define SCREEN_MAX_X 1044//1024 +#define SCREEN_MAX_Y 620//600 #else #define SCREEN_MAX_X 800 #define SCREEN_MAX_Y 480 From 755dbceaf9e82a8cf5d744eb1fd8fb2dd7053b40 Mon Sep 17 00:00:00 2001 From: zwp Date: Mon, 19 Sep 2011 00:02:04 -0700 Subject: [PATCH 135/150] TCL_Phone_pad:modify tp i2c err when device going to earlysuspend. --- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 9 +- arch/arm/mach-rk29/include/mach/board.h | 4 + drivers/input/touchscreen/ft5x0x_i2c_ts.c | 97 ++++++++++++++++++++-- drivers/input/touchscreen/ft5x0x_i2c_ts.h | 6 -- 4 files changed, 101 insertions(+), 15 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index 02e654ffb9a2..aab2422074bc 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -608,7 +608,10 @@ int laibao_init_platform_hw(void) struct laibao_platform_data laibao_info = { .model= 1003, .init_platform_hw= laibao_init_platform_hw, - + .lcd_disp_on_pin = RK29_PIN6_PD0, + .disp_on_value = GPIO_HIGH, + .lcd_cs_pin = RK29_PIN6_PD1, + .lcd_cs_value = GPIO_HIGH, }; #endif @@ -1364,7 +1367,7 @@ static int rk29_backlight_pwm_suspend(void) return -1; } gpio_direction_output(PWM_GPIO, GPIO_LOW); - #ifdef LCD_DISP_ON_PIN + #if 0//def LCD_DISP_ON_PIN gpio_direction_output(BL_EN_PIN, 0); gpio_set_value(BL_EN_PIN, !BL_EN_VALUE); #endif @@ -1376,7 +1379,7 @@ static int rk29_backlight_pwm_resume(void) gpio_free(PWM_GPIO); rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); - #ifdef LCD_DISP_ON_PIN + #if 0//def LCD_DISP_ON_PIN msleep(30); gpio_direction_output(BL_EN_PIN, 1); gpio_set_value(BL_EN_PIN, BL_EN_VALUE); diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h index c5c222428923..039cc173cb9b 100755 --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -307,6 +307,10 @@ struct laibao_platform_data { int (*laibao_platform_sleep)(void); int (*laibao_platform_wakeup)(void); void (*exit_platform_hw)(void); + int lcd_disp_on_pin; + int disp_on_value; + int lcd_cs_pin; + int lcd_cs_value; }; struct akm8975_platform_data { diff --git a/drivers/input/touchscreen/ft5x0x_i2c_ts.c b/drivers/input/touchscreen/ft5x0x_i2c_ts.c index 3b5ca652c035..8723ccf3a889 100755 --- a/drivers/input/touchscreen/ft5x0x_i2c_ts.c +++ b/drivers/input/touchscreen/ft5x0x_i2c_ts.c @@ -30,6 +30,17 @@ #include #include #include +#include + +struct FTS_TS_DATA_T { + struct i2c_client *client; + struct input_dev *input_dev; + struct FTS_TS_EVENT_T event; + struct work_struct pen_event_work; + struct workqueue_struct *ts_workqueue; + struct early_suspend early_suspend; +}; + /* -------------- global variable definition -----------*/ static struct i2c_client *this_client; static REPORT_FINGER_INFO_T _st_finger_infos[CFG_MAX_POINT_NUM]; @@ -54,6 +65,13 @@ char *tsp_keyname[CFG_NUMOFKEYS] ={ static bool tsp_keystatus[CFG_NUMOFKEYS]; + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ft5x0x_ts_early_suspend(struct early_suspend *h); +static void ft5x0x_ts_late_resume(struct early_suspend *h); +#endif + + /*********************************************************************** [function]: callback: read data from ctpm by i2c interface; @@ -234,7 +252,7 @@ static int fts_i2c_rxdata(u8 *rxdata, int length) ret = i2c_transfer(this_client->adapter, &msg, 1); if (ret < 0) - pr_err("msg %s i2c write error: %d\n", __func__, ret); + pr_err("msg %s line:%d i2c write error: %d\n", __func__, __LINE__,ret); msg.addr = this_client->addr; msg.flags = I2C_M_RD; @@ -242,7 +260,7 @@ static int fts_i2c_rxdata(u8 *rxdata, int length) msg.buf = rxdata; ret = i2c_transfer(this_client->adapter, &msg, 1); if (ret < 0) - pr_err("msg %s i2c write error: %d\n", __func__, ret); + pr_err("msg %s line:%d i2c write error: %d\n", __func__,__LINE__, ret); return ret; } @@ -423,11 +441,9 @@ int fts_read_data(void) _st_finger_infos[id].ui2_id = size; _si_touch_num ++; } - else - /*bad event, ignore*/ + else /*bad event, ignore*/ continue; - if ( (touch_event==1) ) { // printk("[TSP]id=%d up\n", id); @@ -436,7 +452,6 @@ int fts_read_data(void) for( i= 0; iinput_dev, ABS_MT_TRACKING_ID, _st_finger_infos[i].ui2_id); input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, _st_finger_infos[i].u2_pressure); input_report_abs(data->input_dev, ABS_MT_POSITION_X, SCREEN_MAX_X - _st_finger_infos[i].i2_x); @@ -796,6 +811,66 @@ unsigned char fts_ctpm_get_upg_ver(void) } +void ft5x0x_ts_set_standby(struct i2c_client *client, int enable) +{ + struct laibao_platform_data *mach_info = client->dev.platform_data; + unsigned display_on = mach_info->lcd_disp_on_pin; + unsigned lcd_cs = mach_info->lcd_cs_pin; + + int display_on_pol = mach_info->disp_on_value; + int lcd_cs_pol = mach_info->lcd_cs_value; + + printk("%s : %s, enable = %d", __FILE__, __FUNCTION__,enable); + if(display_on != INVALID_GPIO) + { + gpio_direction_output(display_on, 0); + gpio_set_value(display_on, enable ? display_on_pol : !display_on_pol); + } + if(lcd_cs != INVALID_GPIO) + { + gpio_direction_output(lcd_cs, 0); + gpio_set_value(lcd_cs, enable ? lcd_cs_pol : !lcd_cs_pol); + } +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ft5x0x_ts_early_suspend(struct early_suspend *h) +{ + struct FTS_TS_DATA_T *data = i2c_get_clientdata(this_client); + + + printk("enter ft5x0x_ts_early_suspend\n"); + + disable_irq_nosync(this_client->irq); + + cancel_work_sync(&data->pen_event_work); + + ft5x0x_ts_set_standby(this_client,0); + + return; +} +static void ft5x0x_ts_late_resume(struct early_suspend *h) +{ + struct FTS_TS_DATA_T *data = i2c_get_clientdata(this_client); + + ft5x0x_ts_set_standby(this_client,1); + + if(!work_pending(&data->pen_event_work)){ + PREPARE_WORK(&data->pen_event_work, fts_work_func); + queue_work(data->ts_workqueue, &data->pen_event_work); + } + else + enable_irq(this_client->irq); + + printk("ft5x0x_ts_late_resume finish\n"); + + return ; +} +#else +#define egalax_i2c_suspend NULL +#define egalax_i2c_resume NULL +#endif + static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -826,6 +901,7 @@ static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *i } this_client = client; + ft5x0x_ts->client = client; i2c_set_clientdata(client, ft5x0x_ts); INIT_WORK(&ft5x0x_ts->pen_event_work, fts_work_func); @@ -944,6 +1020,15 @@ static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *i goto exit_input_register_device_failed; } + +#ifdef CONFIG_HAS_EARLYSUSPEND + ft5x0x_ts->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; + ft5x0x_ts->early_suspend.suspend = ft5x0x_ts_early_suspend; + ft5x0x_ts->early_suspend.resume = ft5x0x_ts_late_resume; + register_early_suspend(&ft5x0x_ts->early_suspend); +#endif + + enable_irq(_sui_irq_num); printk("[TSP] file(%s), function (%s), -- end\n", __FILE__, __FUNCTION__); return 0; diff --git a/drivers/input/touchscreen/ft5x0x_i2c_ts.h b/drivers/input/touchscreen/ft5x0x_i2c_ts.h index 3b034d8d2129..d61f7a88c2d8 100755 --- a/drivers/input/touchscreen/ft5x0x_i2c_ts.h +++ b/drivers/input/touchscreen/ft5x0x_i2c_ts.h @@ -80,12 +80,6 @@ typedef enum u8 touch_point; }; -struct FTS_TS_DATA_T { - struct input_dev *input_dev; - struct FTS_TS_EVENT_T event; - struct work_struct pen_event_work; - struct workqueue_struct *ts_workqueue; -}; From 75c706244cf5590ce075a1d234b0dba46fcbe0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E5=B9=B3?= Date: Tue, 20 Sep 2011 16:49:47 +0800 Subject: [PATCH 136/150] phone-pad:modify wm8994 to satisfy phone pad product. --- arch/arm/mach-rk29/board-rk29-a22.c | 6 +- arch/arm/mach-rk29/board-rk29-phonesdk.c | 8 +- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 108 +--- include/linux/mfd/wm8994/pdata.h | 9 +- sound/soc/codecs/wm8994.c | 641 ++++++++++++++++++++- 5 files changed, 640 insertions(+), 132 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-a22.c b/arch/arm/mach-rk29/board-rk29-a22.c index 599ce5865cc1..8b3e12b71103 100755 --- a/arch/arm/mach-rk29/board-rk29-a22.c +++ b/arch/arm/mach-rk29/board-rk29-a22.c @@ -1440,7 +1440,11 @@ struct platform_device rk29_device_gps = { *****************************************************************************************/ struct wm8994_pdata wm8994_platdata = { .BB_input_diff = 0, - .phone_pad = 0, + .BB_class = NO_PCM_BB, + + .no_earpiece = 0, + .sp_hp_same_channel = 0, + .PA_control_pin = RK29_PIN6_PD3, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 47e0c7603bcb..5f8ee2921096 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -1513,9 +1513,13 @@ struct platform_device rk29_device_gps = { * author: qjb@rock-chips.com *****************************************************************************************/ struct wm8994_pdata wm8994_platdata = { - .BB_input_diff = 0, - .phone_pad = 0, + .BB_input_diff = 0, + .BB_class = NO_PCM_BB, + + .no_earpiece = 0, + .sp_hp_same_channel = 0, + .PA_control_pin = 0, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index aab2422074bc..2f343f320a01 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -384,7 +384,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 1, + .no_allocator = 0, .cached = 1, }; @@ -722,112 +722,12 @@ struct bq27510_platform_data bq27510_info = { * wm8994 codec * author: qjb@rock-chips.com *****************************************************************************************/ -//#if defined(CONFIG_MFD_WM8994) -#if defined (CONFIG_REGULATOR_WM8994) -static struct regulator_consumer_supply wm8994_ldo1_consumers[] = { - { - .supply = "DBVDD", - }, - { - .supply = "AVDD1", - }, - { - .supply = "CPVDD", - }, - { - .supply = "SPKVDD1", - } -}; -static struct regulator_consumer_supply wm8994_ldo2_consumers[] = { - { - .supply = "DCVDD", - }, - { - .supply = "AVDD2", - }, - { - .supply = "SPKVDD2", - } -}; -struct regulator_init_data regulator_init_data_ldo1 = { - .constraints = { - .name = "wm8994-ldo1", - .min_uA = 00000, - .max_uA = 18000, - .always_on = true, - .apply_uV = true, - .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_CURRENT, - }, - .num_consumer_supplies = ARRAY_SIZE(wm8994_ldo1_consumers), - .consumer_supplies = wm8994_ldo1_consumers, -}; -struct regulator_init_data regulator_init_data_ldo2 = { - .constraints = { - .name = "wm8994-ldo2", - .min_uA = 00000, - .max_uA = 18000, - .always_on = true, - .apply_uV = true, - .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_CURRENT, - }, - .num_consumer_supplies = ARRAY_SIZE(wm8994_ldo2_consumers), - .consumer_supplies = wm8994_ldo2_consumers, -}; -#endif -struct wm8994_drc_cfg wm8994_drc_cfg_pdata = { - .name = "wm8994_DRC", - .regs = {0,0,0,0,0}, -}; - -struct wm8994_retune_mobile_cfg wm8994_retune_mobile_cfg_pdata = { - .name = "wm8994_EQ", - .rate = 0, - .regs = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, -}; - struct wm8994_pdata wm8994_platdata = { -#if defined (CONFIG_GPIO_WM8994) - .gpio_base = WM8994_GPIO_EXPANDER_BASE, - //Fill value to initialize the GPIO - .gpio_defaults ={}, -#endif - //enable=0 disable ldo -#if defined (CONFIG_REGULATOR_WM8994) - .ldo = { - { - .enable = 0, - //RK29_PIN5_PA1 - .supply = NULL, - .init_data = ®ulator_init_data_ldo1, - }, - { - .enable = 0, - .supply = NULL, - .init_data = ®ulator_init_data_ldo2, - } - }, -#endif - //DRC 0--use default - .num_drc_cfgs = 0, - .drc_cfgs = &wm8994_drc_cfg_pdata, - //EQ 0--use default - .num_retune_mobile_cfgs = 0, - .retune_mobile_cfgs = &wm8994_retune_mobile_cfg_pdata, - - .lineout1_diff = 1, - .lineout2_diff = 1, - - .lineout1fb = 1, - .lineout2fb = 1, - - .micbias1_lvl = 1, - .micbias2_lvl = 1, - - .jd_scthr = 0, - .jd_thr = 0, + .no_earpiece = 1, + .sp_hp_same_channel = 1, .BB_input_diff = 1, - .phone_pad = 1, + .BB_class = PCM_BB, .PA_control_pin = RK29_PIN6_PB6, .Power_EN_Pin = RK29_PIN5_PA1, diff --git a/include/linux/mfd/wm8994/pdata.h b/include/linux/mfd/wm8994/pdata.h index 11412bed2583..f63b990b366e 100644 --- a/include/linux/mfd/wm8994/pdata.h +++ b/include/linux/mfd/wm8994/pdata.h @@ -59,6 +59,9 @@ struct wm8994_retune_mobile_cfg { u16 regs[WM8994_EQ_REGS]; }; +#define PCM_BB 1 +#define NO_PCM_BB 0 + struct wm8994_pdata { int gpio_base; @@ -94,16 +97,20 @@ struct wm8994_pdata { unsigned int jd_thr:2; //for phonepad - unsigned int phone_pad:1; // =0 is not phone_pad, =1 is phone_pad + unsigned int no_earpiece:1; // =1 don't have a earpiece, =0 has a earpiece + unsigned int sp_hp_same_channel:1; //BB input can be differential or single ended unsigned int BB_input_diff:1; // =0 single ended =1 differential + unsigned int BB_class:1;//PCM_BB= 1 NO_PCM_BB=0 //If an external amplifier speakers wm8994 enable>0 disable=0 unsigned int PA_control_pin; //wm8994 LDO1_ENA and LDO2_ENA unsigned int Power_EN_Pin; + char PowerEN_iomux_name[50]; + int PowerEN_iomux_mode; //volume int speaker_incall_vol; //max = 6, min = -21 diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 8d2bf2c325ac..65892019b8df 100755 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -51,13 +51,11 @@ char debug_write_read = 0; /* If digital BB is used,open this define. Define what kind of digital BB is used. */ -//#define PCM_BB -#ifdef PCM_BB #define TD688_MODE //#define MU301_MODE //#define CHONGY_MODE //#define THINKWILL_M800_MODE -#endif //PCM_BB + #if 1 #define DBG(x...) printk(KERN_INFO x) @@ -124,6 +122,11 @@ unsigned short BT_vol_table[16] ={0x01DB,0x01DC,0x01DD,0x01DE,0x01DF,0x01E0, 0x01E1,0x01E2,0x01E3,0x01E4,0x01E5,0x01E6, 0x01E7,0x01E8,0x01E9,0x01EA}; +void (*handsetMIC_to_baseband_to_headset)(void); +void (*mainMIC_to_baseband_to_headset)(void); +void (*mainMIC_to_baseband_to_earpiece)(void); +void (*mainMIC_to_baseband_to_speakers)(void); +void (*BT_baseband)(void); /* codec private data */ struct wm8994_priv { @@ -989,8 +992,8 @@ void AP_to_speakers(void) wm8994_write(0x01, 0x3033); } -#ifndef PCM_BB -void handsetMIC_to_baseband_to_headset(void) + +void handsetMIC_to_BB_to_headset(void) {// struct wm8994_priv *wm8994 = wm8994_codec->private_data; struct wm8994_pdata *pdata = wm8994->pdata; @@ -1044,7 +1047,7 @@ void handsetMIC_to_baseband_to_headset(void) wm8994_set_level_volume(); } -void mainMIC_to_baseband_to_headset(void) +void mainMIC_to_BB_to_headset(void) {// struct wm8994_priv *wm8994 = wm8994_codec->private_data; struct wm8994_pdata *pdata = wm8994->pdata; @@ -1099,7 +1102,7 @@ void mainMIC_to_baseband_to_headset(void) wm8994_set_level_volume(); } -void mainMIC_to_baseband_to_earpiece(void) +void mainMIC_to_BB_to_earpiece(void) {// DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1138,7 +1141,7 @@ void mainMIC_to_baseband_to_earpiece(void) wm8994_set_level_volume(); } -void mainMIC_to_baseband_to_speakers(void) +void mainMIC_to_BB_to_speakers(void) {// DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1187,7 +1190,7 @@ void mainMIC_to_baseband_to_speakers(void) wm8994_set_level_volume(); } -void BT_baseband(void) +void BT_BB(void) {// struct wm8994_priv *wm8994 = wm8994_codec->private_data; DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1322,9 +1325,9 @@ void BT_baseband(void) wm8994_write(0x04, 0x3303); wm8994_write(0x05, 0x3303); } -#else //PCM_BB + /******************PCM BB BEGIN*****************/ -void handsetMIC_to_baseband_to_headset(void) //pcmbaseband +void handsetMIC_to_PCMBB_to_headset(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1332,7 +1335,125 @@ void handsetMIC_to_baseband_to_headset(void) //pcmbaseband wm8994_current_mode=wm8994_handsetMIC_to_baseband_to_headset; wm8994_reset(); msleep(50); +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0xB51E); //0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x0119);//0x015F); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x000E);//0x000E); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + //For handset + wm8994_write(0x01, 0x0B33);//0x3833); // + wm8994_write(0x1C, 0x01F9); + wm8994_write(0x1D, 0x01F9); + wm8994_write(0x4C, 0x9F25); + wm8994_write(0x60, 0x00EE); + + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master + wm8994_set_level_volume(); + //wm8994_set_volume(wm8994_current_mode,call_vol,call_maxvol); +#endif + +#if 0 wm8994_write(0x01, 0x0003|wm8994_mic_VCC); msleep(50); wm8994_write(0x221, 0x0700); @@ -1403,11 +1524,216 @@ void handsetMIC_to_baseband_to_headset(void) //pcmbaseband wm8994_write(0x621, 0x0000); //0x0001); ///0x0000); wm8994_write(0x317, 0x0003); wm8994_write(0x312, 0x0000); /// as slave ///0x4000); //AIF2 SET AS MASTER - +#endif } -void mainMIC_to_baseband_to_earpiece(void) //pcmbaseband +void mainMIC_to_PCMBB_to_headset(void) +{ + DBG("%s::%d\n",__FUNCTION__,__LINE__); + + if(wm8994_current_mode==wm8994_mainMIC_to_baseband_to_earpiece)return; + wm8994_current_mode=wm8994_mainMIC_to_baseband_to_earpiece; + wm8994_reset(); + msleep(50); + +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0xB51E); //0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x015F); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x000E); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + + //For handset + wm8994_write(0x01, 0x0B33);//0x3833); // + wm8994_write(0x1C, 0x01F9); + wm8994_write(0x1D, 0x01F9); + wm8994_write(0x4C, 0x9F25); + wm8994_write(0x60, 0x00EE); + + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master + + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + wm8994_set_level_volume(); + //wm8994_set_volume(wm8994_current_mode,call_vol,call_maxvol); +#endif + +#if 0 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); + msleep(50); + wm8994_write(0x221, 0x0700); //MCLK=12MHz + wm8994_write(0x222, 0x3127); + wm8994_write(0x223, 0x0100); + wm8994_write(0x220, 0x0004); + msleep(50); + wm8994_write(0x220, 0x0005); + + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); ///0x0813); + wm8994_write(0x02, 0x0240); ///0x0110); + wm8994_write(0x03, 0x00F0); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x18, 0x011F); + wm8994_write(0x1F, 0x0000); + wm8994_write(0x28, 0x0030); ///0x0003); + wm8994_write(0x29, 0x0020); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + wm8994_write(0x200, 0x0001); + wm8994_write(0x204, 0x0001); + wm8994_write(0x208, 0x0007); + wm8994_write(0x520, 0x0000); + wm8994_write(0x601, 0x0004); + wm8994_write(0x602, 0x0004); + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); + wm8994_write(0x703, 0xC100); + wm8994_write(0x704, 0xC100); + wm8994_write(0x706, 0x4100); + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0x4108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + msleep(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x313, 0x00F0); + wm8994_write(0x314, 0x0020); + wm8994_write(0x315, 0x0020); + + wm8994_write(0x603, 0x018C); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0010); + wm8994_write(0x605, 0x0010); + wm8994_write(0x621, 0x0000); ///0x0001); + wm8994_write(0x317, 0x0003); + wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER +#endif + +} + +void mainMIC_to_PCMBB_to_earpiece(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1491,7 +1817,7 @@ void mainMIC_to_baseband_to_earpiece(void) //pcmbaseband } -void mainMIC_to_baseband_to_speakers(void) //pcmbaseband +void mainMIC_to_PCMBB_to_speakers(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1500,6 +1826,127 @@ void mainMIC_to_baseband_to_speakers(void) //pcmbaseband wm8994_reset(); msleep(50); +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0xB51E); //0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x0119);//0x015F); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x000E);//0x000E); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + + //For Speaker + wm8994_write(0x01, 0x3833); // + wm8994_write(0x03, 0x03F0); + wm8994_write(0x22, 0x0000); + wm8994_write(0x23, 0x0000); + wm8994_write(0x25, 0x017F); //+12DB 0x15B:4DB + //wm8994_write(0x25, 0x015B); + wm8994_write(0x36, 0x000C); + + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master + wm8994_set_level_volume(); + //wm8994_set_volume(wm8994_current_mode,call_vol,call_maxvol); +#endif + +#if 0 wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); msleep(50); wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) @@ -1573,11 +2020,11 @@ void mainMIC_to_baseband_to_speakers(void) //pcmbaseband wm8994_write(0x621, 0x0000); ///0x0001); wm8994_write(0x317, 0x0003); wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER - +#endif } -void BT_baseband(void) //pcmbaseband +void BT_PCMBB(void) //pcmbaseband { DBG("%s::%d\n",__FUNCTION__,__LINE__); @@ -1586,6 +2033,131 @@ void BT_baseband(void) //pcmbaseband wm8994_reset(); msleep(50); +#if 1 + wm8994_write(0x01, 0x0003|wm8994_mic_VCC); //0x0013); + mdelay(50); + + //GPIO configuration + wm8994_write(0x0700, 0xA101); + wm8994_write(0x39, 0x006C); + + //VMID and BIAS + wm8994_write(0x01, 0x0023|wm8994_mic_VCC); //0x0013); + wm8994_write(0x200, 0x0000); + mdelay(50); + wm8994_write(0x200, 0x0001); + + wm8994_write(0x220, 0x0000); + wm8994_write(0x221, 0x0700); //MCLK=12MHz //FLL1 CONTRLO(2) + wm8994_write(0x222, 0x3126); //FLL1 CONTRLO(3) + wm8994_write(0x223, 0x0100); //FLL1 CONTRLO(4) + wm8994_write(0x220, 0x0004); //FLL1 CONTRLO(1) + //mdelay(50); + mdelay(10); + wm8994_write(0x220, 0x0005); //FLL1 CONTRLO(1) + mdelay(5); + + wm8994_write(0x200, 0x0010); + wm8994_write(0x208, 0x0008); + wm8994_write(0x208, 0x000A); + wm8994_write(0x210, 0x0083); + wm8994_write(0x302, 0x3000); + wm8994_write(0x302, 0x7000); + wm8994_write(0x303, 0x0040); + wm8994_write(0x304, 0x0040); + wm8994_write(0x305, 0x0040); + wm8994_write(0x300, 0x4010); + wm8994_write(0x200, 0x0011); + + //wm8994_write(0x01, 0x3003|wm8994_mic_VCC); + wm8994_write(0x01, 0x0803|wm8994_mic_VCC); + wm8994_write(0x02, 0x0110); + wm8994_write(0x03, 0x00F0); ///0x0330); + wm8994_write(0x04, 0x3003); + wm8994_write(0x05, 0x3003); + wm8994_write(0x1A, 0x015F);//0x014B); + wm8994_write(0x1F, 0x0000); + //wm8994_write(0x22, 0x0000); + //wm8994_write(0x23, 0x0100); ///0x0000); + //wm8994_write(0x25, 0x0152); + wm8994_write(0x28, 0x0003); + wm8994_write(0x2A, 0x0030); + wm8994_write(0x2D, 0x0001); + wm8994_write(0x2E, 0x0001); + wm8994_write(0x33, 0x0018); + //wm8994_write(0x36, 0x000C); //MIXOUTL_TO_SPKMIXL MIXOUTR_TO_SPKMIXR + wm8994_write(0x200, 0x0011); //AIF1 CLOCKING(1) + wm8994_write(0x204, 0x0011); //AIF2 CLOCKING(1) + wm8994_write(0x208, 0x0007);//0x0007); //CLOCKING(1) + wm8994_write(0x520, 0x0000); //AIF2 DAC FILTERS(1) + wm8994_write(0x601, 0x0004); //AIF2DACL_DAC1L + wm8994_write(0x602, 0x0004); //AIF2DACR_DAC1R + + wm8994_write(0x610, 0x01C0); //DAC1 Left Volume bit0~7 + wm8994_write(0x611, 0x01C0); //DAC1 Right Volume bit0~7 + wm8994_write(0x612, 0x01C0); //DAC2 Left Volume bit0~7 + wm8994_write(0x613, 0x01C0); //DAC2 Right Volume bit0~7 + + wm8994_write(0x702, 0xC100); //GPIO3 + wm8994_write(0x703, 0xC100); //GPIO4 + wm8994_write(0x704, 0xC100); //GPIO5 + wm8994_write(0x706, 0x4100); //GPIO7 + + wm8994_write(0x707, 0xA100); + wm8994_write(0x708, 0xA100); + wm8994_write(0x709, 0xA100); + wm8994_write(0x70A, 0xA100); + wm8994_write(0x06, 0x0014); + + wm8994_write(0x204, 0x0011); //AIF2 MCLK=FLL1 + wm8994_write(0x211, 0x0009); //LRCK=8KHz, Rate=MCLK/1536 + #ifdef TD688_MODE + wm8994_write(0x310, 0xc108); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef CHONGY_MODE + wm8994_write(0x310, 0xc018); ///0x4118); ///interface dsp mode 16bit + #endif + #ifdef MU301_MODE + wm8994_write(0x310, 0xc118); ///0x4118); ///interface dsp mode 16bit + wm8994_write(0x241, 0x2f04); + wm8994_write(0x242, 0x0000); + wm8994_write(0x243, 0x0300); + wm8994_write(0x240, 0x0004); + mdelay(40); + wm8994_write(0x240, 0x0005); + wm8994_write(0x204, 0x0019); + wm8994_write(0x211, 0x0003); + wm8994_write(0x244, 0x0c83); + wm8994_write(0x620, 0x0000); + #endif + #ifdef THINKWILL_M800_MODE + //wm8994_write(0x310, 0x4118); ///0x4118); ///interface dsp mode 16bit + #endif + wm8994_write(0x310, 0x4118); + wm8994_write(0x311, 0x0000); + wm8994_write(0x313, 0x0060); //AIF2BCLK + wm8994_write(0x314, 0x0020); //AIF2ADCLRCK + wm8994_write(0x315, 0x0020); //AIF2DACLRCLK + + wm8994_write(0x603, 0x0180); //Rev.D ADCL SideTone + wm8994_write(0x604, 0x0020); ///0x0010); //ADC2_TO_DAC2L + wm8994_write(0x605, 0x0020); //0x0010); //ADC2_TO_DAC2R + wm8994_write(0x621, 0x0000); ///0x0001); + //wm8994_write(0x317, 0x0003); + //wm8994_write(0x312, 0x0000); //AIF2 SET AS MASTER + +/* //For Speaker + wm8994_write(0x01, 0x3833); // + wm8994_write(0x03, 0x03F0); + wm8994_write(0x22, 0x0000); + wm8994_write(0x23, 0x0000); + //wm8994_write(0x25, 0x017F); //+12DB 0x15B:4DB + wm8994_write(0x36, 0x000C); +*/ + wm8994_write(0x422, 0x0000); ////AIF2 un-mute as master +#endif + +#if 0 wm8994_write(0x01 ,0x0003); msleep (50); @@ -1657,9 +2229,8 @@ void BT_baseband(void) //pcmbaseband wm8994_write(0x4C ,0x9F25); wm8994_write(0x60 ,0x00EE); ///////////end HP test - +#endif } -#endif //PCM_BB #define SOC_DOUBLE_SWITCH_WM8994CODEC(xname, route) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ @@ -1711,13 +2282,13 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, case SPEAKER_NORMAL: //AP-> 8994Codec -> Speaker case SPEAKER_RINGTONE: case EARPIECE_RINGTONE: - if(pdata->phone_pad == 1) + if(pdata->sp_hp_same_channel == 1) AP_to_headset(); else AP_to_speakers(); break; case SPEAKER_INCALL: //BB-> 8994Codec -> Speaker - if(pdata->phone_pad == 1) + if(pdata->sp_hp_same_channel == 1) mainMIC_to_baseband_to_headset(); else mainMIC_to_baseband_to_speakers(); @@ -1734,8 +2305,12 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, mainMIC_to_baseband_to_headset(); break; case EARPIECE_INCALL: //BB-> 8994Codec -> EARPIECE - if(pdata->phone_pad == 1) - mainMIC_to_baseband_to_headset(); + if(pdata->no_earpiece == 1){ + if(pdata->sp_hp_same_channel == 1) + mainMIC_to_baseband_to_headset(); + else + mainMIC_to_baseband_to_speakers(); + } else mainMIC_to_baseband_to_earpiece(); break; @@ -1747,7 +2322,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, AP_to_headset(); break; default: - if(pdata->phone_pad == 1) + if(pdata->sp_hp_same_channel == 1) AP_to_headset(); else AP_to_speakers(); @@ -1805,7 +2380,7 @@ int snd_soc_put_route(struct snd_kcontrol *kcontrol, PA_ctrl(GPIO_HIGH); break; case EARPIECE_INCALL: - if(pdata->phone_pad == 1) + if(pdata->no_earpiece == 1) { msleep(50); PA_ctrl(GPIO_HIGH); @@ -2409,6 +2984,7 @@ static int wm8994_probe(struct platform_device *pdev) wm8994 = codec->private_data; pdata = wm8994->pdata; //disable power_EN + rk29_mux_api_set(pdata->PowerEN_iomux_name, pdata->PowerEN_iomux_mode); gpio_request(pdata->Power_EN_Pin, NULL); gpio_direction_output(pdata->Power_EN_Pin,GPIO_LOW); gpio_free(pdata->Power_EN_Pin); @@ -2429,6 +3005,23 @@ static int wm8994_probe(struct platform_device *pdev) goto card_err; } + if(pdata->BB_class == PCM_BB) + { + handsetMIC_to_baseband_to_headset = &handsetMIC_to_PCMBB_to_headset; + mainMIC_to_baseband_to_headset = &mainMIC_to_PCMBB_to_headset; + mainMIC_to_baseband_to_earpiece = &mainMIC_to_PCMBB_to_earpiece; + mainMIC_to_baseband_to_speakers = &mainMIC_to_PCMBB_to_speakers; + BT_baseband = &BT_PCMBB; + } + else + { + handsetMIC_to_baseband_to_headset = &handsetMIC_to_BB_to_headset; + mainMIC_to_baseband_to_headset = &mainMIC_to_BB_to_headset; + mainMIC_to_baseband_to_earpiece = &mainMIC_to_BB_to_earpiece; + mainMIC_to_baseband_to_speakers = &mainMIC_to_BB_to_speakers; + BT_baseband = &BT_BB; + } + PA_ctrl(GPIO_LOW); //enable power_EN msleep(50); From 4c77b297c5303ec2ea731af9e322ac05f805732c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E5=B9=B3?= Date: Tue, 20 Sep 2011 16:52:10 +0800 Subject: [PATCH 137/150] phone-pad:add mw100 modem support. --- drivers/misc/Kconfig | 4 +- drivers/misc/MW100.c | 274 ++++++++++++++++++++++++++++++++++++++++++ drivers/misc/Makefile | 1 + 3 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 drivers/misc/MW100.c diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 0d3ad52ea80d..b5fefd612ee0 100755 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -299,7 +299,9 @@ config FM580X config MU509 bool "MU509 modem control driver" default n - +config MW100 + bool "MW100 modem control driver" + default n config RK29_NEWTON bool "RK29_NEWTON misc driver" default n diff --git a/drivers/misc/MW100.c b/drivers/misc/MW100.c new file mode 100644 index 000000000000..98b2c6859fde --- /dev/null +++ b/drivers/misc/MW100.c @@ -0,0 +1,274 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_LICENSE("GPL"); + +//#define DEBUG +#ifdef DEBUG +#define MODEMDBG(x...) printk(x) +#else +#define MODEMDBG(fmt,argss...) +#endif + +#define MW100IO 0XA1 +#define MW_IOCTL_RESET _IO(MW100IO,0X01) + +#define SLEEP 1 +#define READY 0 +#define MU509_RESET 0x01 +static struct wake_lock modem_wakelock; +#define IRQ_BB_WAKEUP_AP_TRIGGER IRQF_TRIGGER_RISING +//#define IRQ_BB_WAKEUP_AP_TRIGGER IRQF_TRIGGER_RISING +struct rk29_mu509_data *gpdata = NULL; +static int bp_wakeup_ap_irq = 0; + + +static void ap_wakeup_bp(struct platform_device *pdev, int wake) +{ + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + MODEMDBG("ap_wakeup_bp\n"); + + gpio_set_value(pdata->ap_wakeup_bp, wake); + +} +extern void rk28_send_wakeup_key(void); + +static void do_wakeup(struct work_struct *work) +{ + MODEMDBG("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + rk28_send_wakeup_key(); + enable_irq(bp_wakeup_ap_irq); +} + +static DECLARE_DELAYED_WORK(wakeup_work, do_wakeup); +static irqreturn_t detect_irq_handler(int irq, void *dev_id) +{ + disable_irq_nosync( irq); + printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + schedule_delayed_work(&wakeup_work, HZ / 10); + + return IRQ_HANDLED; +} +int modem_poweron_off(int on_off) +{ + struct rk29_mu509_data *pdata = gpdata; + if(on_off) + { + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); +/* + gpio_set_value(pdata->bp_power, GPIO_LOW); + msleep(1000); + gpio_set_value(pdata->bp_power, GPIO_HIGH); + msleep(700); + gpio_set_value(pdata->ap_wakeup_bp, GPIO_LOW); +*/ + } + else + { + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); +/* + gpio_set_value(pdata->bp_power, GPIO_LOW); + mdelay(2500); + gpio_set_value(pdata->bp_power, GPIO_HIGH); +*/ + } + return 0; +} +static int mu509_open(struct inode *inode, struct file *file) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + //modem_poweron_off(1); + return 0; +} + +static int mu509_release(struct inode *inode, struct file *file) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + //modem_poweron_off(0); + return 0; +} + +static int mu509_ioctl(struct inode *inode,struct file *file, unsigned int cmd, unsigned long arg) +{ + struct rk29_mu509_data *pdata = gpdata; + switch(cmd) + { + case MW_IOCTL_RESET: + printk("%s::%d--bruins--ioctl mw100 reset\n",__func__,__LINE__); + gpio_direction_output(pdata->bp_reset,GPIO_LOW); + mdelay(120); + gpio_set_value(pdata->bp_reset, GPIO_HIGH); + + break; + default: + break; + } + return 0; +} + +static struct file_operations mu509_fops = { + .owner = THIS_MODULE, + .open = mu509_open, + .release = mu509_release, + .ioctl = mu509_ioctl +}; + +static struct miscdevice mu509_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = "mw100", + .fops = &mu509_fops +}; + +static int mu509_probe(struct platform_device *pdev) +{ + struct rk29_mu509_data *pdata = gpdata = pdev->dev.platform_data; + struct modem_dev *mu509_data = NULL; + int result, irq = 0; + + gpio_request(pdata->bp_power,"bp_power"); + gpio_request(pdata->bp_reset,"bp_reset"); + gpio_request(pdata->bp_wakeup_ap,"bp_wakeup_ap"); + gpio_request(pdata->ap_wakeup_bp,"ap_wakeup_bp"); + + rk29_mux_api_set(GPIO6C76_CPUTRACEDATA76_NAME, GPIO4H_GPIO6C76); + + gpio_direction_output(pdata->bp_reset,GPIO_LOW); + mdelay(120); + gpio_set_value(pdata->bp_reset, GPIO_HIGH); + + gpio_set_value(pdata->ap_wakeup_bp, GPIO_HIGH); + gpio_direction_output(pdata->ap_wakeup_bp,GPIO_HIGH); + + gpio_set_value(pdata->bp_power, GPIO_HIGH); + gpio_direction_output(pdata->bp_power,GPIO_HIGH); + mdelay(120); + gpio_set_value(pdata->bp_power, GPIO_LOW); + gpio_direction_output(pdata->bp_power,GPIO_LOW); + + + // +/* gpio_set_value(pdata->bp_reset, GPIO_LOW); + gpio_direction_output(pdata->bp_reset,GPIO_LOW); + mdelay(120); + gpio_set_value(pdata->bp_reset, GPIO_HIGH); + gpio_direction_output(pdata->bp_reset,GPIO_HIGH); +*/ + mu509_data = kzalloc(sizeof(struct modem_dev), GFP_KERNEL); + if(mu509_data == NULL){ + printk("failed to request mu509_data\n"); + goto err2; + } + platform_set_drvdata(pdev, mu509_data); + + gpio_direction_input(pdata->bp_wakeup_ap); + irq = gpio_to_irq(pdata->bp_wakeup_ap); + if(irq < 0){ + gpio_free(pdata->bp_wakeup_ap); + printk("failed to request bp_wakeup_ap\n"); + } + + bp_wakeup_ap_irq = irq; + + result = request_irq(irq, detect_irq_handler, IRQ_BB_WAKEUP_AP_TRIGGER, "bp_wakeup_ap", NULL); + if (result < 0) { + printk("%s: request_irq(%d) failed\n", __func__, irq); + gpio_free(pdata->bp_wakeup_ap); + goto err0; + } + + enable_irq_wake(bp_wakeup_ap_irq); + + result = misc_register(&mu509_misc); + if(result){ + MODEMDBG("misc_register err\n"); + } + return result; +err0: + gpio_free(pdata->bp_wakeup_ap); +err1: + gpio_free(pdata->ap_wakeup_bp); +err2: + kfree(mu509_data); + return 0; +} + +int mu509_suspend(struct platform_device *pdev) +{ + + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + MODEMDBG("%s::%d--\n",__func__,__LINE__); + gpio_set_value(pdata->ap_wakeup_bp, GPIO_LOW); + return 0; +} + +int mu509_resume(struct platform_device *pdev) +{ + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + gpio_set_value(pdata->ap_wakeup_bp, GPIO_HIGH); + return 0; +} + +void mu509_shutdown(struct platform_device *pdev, pm_message_t state) +{ + struct rk29_mu509_data *pdata = pdev->dev.platform_data; + struct modem_dev *mu509_data = platform_get_drvdata(pdev); + + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + gpio_set_value(pdata->bp_power, GPIO_HIGH); + mdelay(2010); + + gpio_free(pdata->bp_power); + gpio_free(pdata->bp_reset); + gpio_free(pdata->ap_wakeup_bp); + gpio_free(pdata->bp_wakeup_ap); + kfree(mu509_data); +} + +static struct platform_driver mu509_driver = { + .probe = mu509_probe, + .shutdown = mu509_shutdown, + .suspend = mu509_suspend, + .resume = mu509_resume, + .driver = { + .name = "MW100", + .owner = THIS_MODULE, + }, +}; + +static int __init mu509_init(void) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + return platform_driver_register(&mu509_driver); +} + +static void __exit mu509_exit(void) +{ + MODEMDBG("%s::%d--bruins--\n",__func__,__LINE__); + platform_driver_unregister(&mu509_driver); +} + +module_init(mu509_init); + +module_exit(mu509_exit); diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index c3dc3cf11ce2..6d98f4888a68 100755 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -31,6 +31,7 @@ obj-$(CONFIG_APANIC) += apanic.o obj-$(CONFIG_MTK23D) += mtk23d.o obj-$(CONFIG_FM580X) += fm580x.o obj-$(CONFIG_MU509) += mu509.o +obj-$(CONFIG_MW100) += MW100.o obj-$(CONFIG_STE) += ste.o obj-$(CONFIG_RK29_SUPPORT_MODEM) += rk29_modem/ obj-$(CONFIG_GPS_GNS7560) += gps/ From 3eabd5da44d035478f31a402db9def817f3d1a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E5=B9=B3?= Date: Thu, 22 Sep 2011 12:47:28 +0800 Subject: [PATCH 138/150] phone-pad: ui pmem should be no_allocator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上次的提交误操作修改了no_allocator的值,这里将其还原 --- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index 2f343f320a01..2d8f49ed3a2c 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -384,7 +384,7 @@ static struct android_pmem_platform_data android_pmem_pdata = { .name = "pmem", .start = PMEM_UI_BASE, .size = PMEM_UI_SIZE, - .no_allocator = 0, + .no_allocator = 1, .cached = 1, }; From 92192dcc5bf03a1803327a2b59337971cb4c7ec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Thu, 22 Sep 2011 14:21:10 +0800 Subject: [PATCH 139/150] add rtl8188cu driver source(v3.11). --- drivers/net/wireless/rtl8192c/Makefile | 200 +- .../wireless/rtl8192c/core/efuse/rtw_efuse.c | 1042 + drivers/net/wireless/rtl8192c/core/rtw_cmd.c | 2352 ++ .../net/wireless/rtl8192c/core/rtw_debug.c | 604 + .../net/wireless/rtl8192c/core/rtw_eeprom.c | 424 + .../wireless/rtl8192c/core/rtw_ieee80211.c | 1202 + drivers/net/wireless/rtl8192c/core/rtw_io.c | 422 + .../wireless/rtl8192c/core/rtw_ioctl_query.c | 197 + .../wireless/rtl8192c/core/rtw_ioctl_rtl.c | 1032 + .../wireless/rtl8192c/core/rtw_ioctl_set.c | 1283 + drivers/net/wireless/rtl8192c/core/rtw_mlme.c | 3678 ++ .../net/wireless/rtl8192c/core/rtw_mlme_ext.c | 10541 ++++++ drivers/net/wireless/rtl8192c/core/rtw_mp.c | 2254 ++ .../net/wireless/rtl8192c/core/rtw_mp_ioctl.c | 2841 ++ drivers/net/wireless/rtl8192c/core/rtw_p2p.c | 1726 + .../net/wireless/rtl8192c/core/rtw_pwrctrl.c | 1128 + drivers/net/wireless/rtl8192c/core/rtw_recv.c | 4445 +++ drivers/net/wireless/rtl8192c/core/rtw_rf.c | 96 + .../net/wireless/rtl8192c/core/rtw_security.c | 2811 ++ .../net/wireless/rtl8192c/core/rtw_sta_mgt.c | 654 + .../wireless/rtl8192c/core/rtw_wlan_util.c | 1747 + drivers/net/wireless/rtl8192c/core/rtw_xmit.c | 3779 ++ drivers/net/wireless/rtl8192c/hal/hal_init.c | 122 + .../rtl8192c/hal/rtl8192c/rtl8192c_cmd.c | 1134 + .../rtl8192c/hal/rtl8192c/rtl8192c_dm.c | 4687 +++ .../rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c | 3541 ++ .../rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c | 5415 +++ .../rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c | 1047 + .../rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c | 752 + .../rtl8192c/hal/rtl8192c/rtl8192c_sreset.c | 285 + .../hal/rtl8192c/usb/Hal8192CUHWImg.c | 7346 ++++ .../rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c | 2659 ++ .../hal/rtl8192c/usb/rtl8192cu_recv.c | 380 + .../hal/rtl8192c/usb/rtl8192cu_xmit.c | 1338 + .../rtl8192c/hal/rtl8192c/usb/usb_halinit.c | 5453 +++ .../rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c | 1208 + .../rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c | 1997 + .../rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c | 1266 + .../rtl8192c/include/Hal8192CEHWImg.h | 66 + .../rtl8192c/include/Hal8192CPhyCfg.h | 451 + .../rtl8192c/include/Hal8192CPhyReg.h | 1052 + .../rtl8192c/include/Hal8192CUHWImg.h | 92 + .../rtl8192c/include/Hal8192DEHWImg.h | 66 + .../rtl8192c/include/Hal8192DETestHWImg.h | 54 + .../rtl8192c/include/Hal8192DPhyCfg.h | 545 + .../rtl8192c/include/Hal8192DPhyReg.h | 1059 + .../rtl8192c/include/Hal8192DUHWImg.h | 66 + .../rtl8192c/include/Hal8192DUTestHWImg.h | 54 + .../net/wireless/rtl8192c/include/autoconf.h | 216 + .../wireless/rtl8192c/include/basic_types.h | 276 + .../rtl8192c/include/byteorder/big_endian.h | 87 + .../rtl8192c/include/byteorder/generic.h | 209 + .../include/byteorder/little_endian.h | 89 + .../rtl8192c/include/byteorder/swab.h | 133 + .../rtl8192c/include/byteorder/swabb.h | 157 + .../net/wireless/rtl8192c/include/circ_buf.h | 27 + .../net/wireless/rtl8192c/include/cmd_osdep.h | 36 + .../net/wireless/rtl8192c/include/drv_conf.h | 57 + .../net/wireless/rtl8192c/include/drv_types.h | 432 + .../wireless/rtl8192c/include/drv_types_ce.h | 92 + .../rtl8192c/include/drv_types_linux.h | 25 + .../wireless/rtl8192c/include/drv_types_xp.h | 95 + .../net/wireless/rtl8192c/include/ethernet.h | 41 + .../net/wireless/rtl8192c/include/farray.h | 31480 ++++++++++++++++ .../net/wireless/rtl8192c/include/h2clbk.h | 35 + .../net/wireless/rtl8192c/include/hal_init.h | 272 + .../net/wireless/rtl8192c/include/ieee80211.h | 1432 + .../wireless/rtl8192c/include/ieee80211_ext.h | 477 + .../net/wireless/rtl8192c/include/if_ether.h | 112 + drivers/net/wireless/rtl8192c/include/ip.h | 138 + .../wireless/rtl8192c/include/mlme_osdep.h | 43 + .../wireless/rtl8192c/include/mp_custom_oid.h | 353 + .../net/wireless/rtl8192c/include/nic_spec.h | 47 + .../rtl8192c/include/osdep_ce_service.h | 171 + .../wireless/rtl8192c/include/osdep_intf.h | 128 + .../wireless/rtl8192c/include/osdep_service.h | 808 + .../net/wireless/rtl8192c/include/pci_hal.h | 168 + .../net/wireless/rtl8192c/include/pci_ops.h | 58 + .../wireless/rtl8192c/include/pci_osintf.h | 33 + .../wireless/rtl8192c/include/recv_osdep.h | 58 + .../wireless/rtl8192c/include/rtl8192c_cmd.h | 98 + .../wireless/rtl8192c/include/rtl8192c_dm.h | 608 + .../rtl8192c/include/rtl8192c_event.h | 29 + .../wireless/rtl8192c/include/rtl8192c_hal.h | 879 + .../wireless/rtl8192c/include/rtl8192c_led.h | 43 + .../wireless/rtl8192c/include/rtl8192c_recv.h | 182 + .../wireless/rtl8192c/include/rtl8192c_rf.h | 93 + .../wireless/rtl8192c/include/rtl8192c_spec.h | 1898 + .../rtl8192c/include/rtl8192c_sreset.h | 54 + .../wireless/rtl8192c/include/rtl8192c_xmit.h | 91 + .../wireless/rtl8192c/include/rtl8192d_cmd.h | 103 + .../wireless/rtl8192c/include/rtl8192d_dm.h | 471 + .../wireless/rtl8192c/include/rtl8192d_hal.h | 857 + .../wireless/rtl8192c/include/rtl8192d_led.h | 44 + .../wireless/rtl8192c/include/rtl8192d_recv.h | 182 + .../wireless/rtl8192c/include/rtl8192d_rf.h | 98 + .../wireless/rtl8192c/include/rtl8192d_spec.h | 1859 + .../wireless/rtl8192c/include/rtl8192d_xmit.h | 106 + .../wireless/rtl8192c/include/rtw_byteorder.h | 41 + .../net/wireless/rtl8192c/include/rtw_cmd.h | 1100 + .../net/wireless/rtl8192c/include/rtw_debug.h | 374 + .../wireless/rtl8192c/include/rtw_eeprom.h | 145 + .../net/wireless/rtl8192c/include/rtw_efuse.h | 123 + .../net/wireless/rtl8192c/include/rtw_event.h | 154 + .../net/wireless/rtl8192c/include/rtw_ht.h | 51 + .../net/wireless/rtl8192c/include/rtw_io.h | 535 + .../net/wireless/rtl8192c/include/rtw_ioctl.h | 271 + .../rtl8192c/include/rtw_ioctl_query.h | 37 + .../wireless/rtl8192c/include/rtw_ioctl_rtl.h | 84 + .../wireless/rtl8192c/include/rtw_ioctl_set.h | 74 + .../net/wireless/rtl8192c/include/rtw_led.h | 212 + .../net/wireless/rtl8192c/include/rtw_mlme.h | 573 + .../wireless/rtl8192c/include/rtw_mlme_ext.h | 759 + .../net/wireless/rtl8192c/include/rtw_mp.h | 634 + .../wireless/rtl8192c/include/rtw_mp_ioctl.h | 596 + .../rtl8192c/include/rtw_mp_phy_regdef.h | 1098 + .../net/wireless/rtl8192c/include/rtw_p2p.h | 48 + .../wireless/rtl8192c/include/rtw_pwrctrl.h | 331 + .../net/wireless/rtl8192c/include/rtw_qos.h | 41 + .../net/wireless/rtl8192c/include/rtw_recv.h | 703 + .../net/wireless/rtl8192c/include/rtw_rf.h | 138 + .../wireless/rtl8192c/include/rtw_security.h | 423 + .../wireless/rtl8192c/include/rtw_version.h | 1 + .../net/wireless/rtl8192c/include/rtw_xmit.h | 665 + .../net/wireless/rtl8192c/include/sdio_hal.h | 34 + .../net/wireless/rtl8192c/include/sdio_ops.h | 80 + .../wireless/rtl8192c/include/sdio_ops_ce.h | 56 + .../rtl8192c/include/sdio_ops_linux.h | 55 + .../wireless/rtl8192c/include/sdio_ops_xp.h | 56 + .../wireless/rtl8192c/include/sdio_osintf.h | 48 + .../net/wireless/rtl8192c/include/sta_info.h | 293 + .../net/wireless/rtl8192c/include/usb_hal.h | 30 + .../net/wireless/rtl8192c/include/usb_ops.h | 58 + .../wireless/rtl8192c/include/usb_osintf.h | 39 + .../rtl8192c/include/usb_vendor_req.h | 60 + drivers/net/wireless/rtl8192c/include/wifi.h | 1148 + .../wireless/rtl8192c/include/wlan_bssdef.h | 435 + .../wireless/rtl8192c/include/xmit_osdep.h | 90 + .../rtl8192c/os_dep/linux/ioctl_linux.uu | 1442 + .../rtl8192c/os_dep/linux/mlme_linux.c | 781 + .../wireless/rtl8192c/os_dep/linux/os_intfs.c | 1343 + .../rtl8192c/os_dep/linux/recv_linux.c | 391 + .../wireless/rtl8192c/os_dep/linux/usb_intf.c | 1472 + .../rtl8192c/os_dep/linux/wifi_power.c | 112 + .../rtl8192c/os_dep/linux/wifi_power.h | 87 + .../rtl8192c/os_dep/linux/wifi_power_ops.c | 112 + .../rtl8192c/os_dep/linux/wifi_power_usb.c | 118 + .../rtl8192c/os_dep/linux/wifi_version.h | 13 + .../rtl8192c/os_dep/linux/xmit_linux.c | 291 + .../wireless/rtl8192c/os_dep/osdep_service.c | 1346 + 150 files changed, 151263 insertions(+), 11 deletions(-) create mode 100755 drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_cmd.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_debug.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_eeprom.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_io.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mlme.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mp.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_p2p.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_recv.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_rf.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_security.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_xmit.c create mode 100755 drivers/net/wireless/rtl8192c/hal/hal_init.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/autoconf.h create mode 100755 drivers/net/wireless/rtl8192c/include/basic_types.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/generic.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/swab.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/swabb.h create mode 100755 drivers/net/wireless/rtl8192c/include/circ_buf.h create mode 100755 drivers/net/wireless/rtl8192c/include/cmd_osdep.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_conf.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_ce.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_linux.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_xp.h create mode 100755 drivers/net/wireless/rtl8192c/include/ethernet.h create mode 100755 drivers/net/wireless/rtl8192c/include/farray.h create mode 100755 drivers/net/wireless/rtl8192c/include/h2clbk.h create mode 100755 drivers/net/wireless/rtl8192c/include/hal_init.h create mode 100755 drivers/net/wireless/rtl8192c/include/ieee80211.h create mode 100755 drivers/net/wireless/rtl8192c/include/ieee80211_ext.h create mode 100755 drivers/net/wireless/rtl8192c/include/if_ether.h create mode 100755 drivers/net/wireless/rtl8192c/include/ip.h create mode 100755 drivers/net/wireless/rtl8192c/include/mlme_osdep.h create mode 100755 drivers/net/wireless/rtl8192c/include/mp_custom_oid.h create mode 100755 drivers/net/wireless/rtl8192c/include/nic_spec.h create mode 100755 drivers/net/wireless/rtl8192c/include/osdep_ce_service.h create mode 100755 drivers/net/wireless/rtl8192c/include/osdep_intf.h create mode 100755 drivers/net/wireless/rtl8192c/include/osdep_service.h create mode 100755 drivers/net/wireless/rtl8192c/include/pci_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/pci_ops.h create mode 100755 drivers/net/wireless/rtl8192c/include/pci_osintf.h create mode 100755 drivers/net/wireless/rtl8192c/include/recv_osdep.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_event.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_led.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_led.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_byteorder.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_cmd.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_debug.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_eeprom.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_efuse.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_event.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ht.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_io.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_led.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mlme.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_p2p.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_qos.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_recv.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_rf.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_security.h create mode 100644 drivers/net/wireless/rtl8192c/include/rtw_version.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_xmit.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_osintf.h create mode 100755 drivers/net/wireless/rtl8192c/include/sta_info.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_ops.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_osintf.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_vendor_req.h create mode 100755 drivers/net/wireless/rtl8192c/include/wifi.h create mode 100755 drivers/net/wireless/rtl8192c/include/wlan_bssdef.h create mode 100755 drivers/net/wireless/rtl8192c/include/xmit_osdep.h create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/osdep_service.c diff --git a/drivers/net/wireless/rtl8192c/Makefile b/drivers/net/wireless/rtl8192c/Makefile index f05be4f5503e..218c25c33d7e 100644 --- a/drivers/net/wireless/rtl8192c/Makefile +++ b/drivers/net/wireless/rtl8192c/Makefile @@ -1,21 +1,199 @@ +# +# Makefile for RTL8188/8192 USB WiFi +# -#EXTRA_CFLAGS += -I$(src)/rkcfg/include +EXTRA_CFLAGS += -O1 +#EXTRA_CFLAGS += -O3 +EXTRA_CFLAGS += -Wall +#EXTRA_CFLAGS += -Wextra +#EXTRA_CFLAGS += -Werror +#EXTRA_CFLAGS += -pedantic +#EXTRA_CFLAGS += -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes + +EXTRA_CFLAGS += -Wno-unused-variable +EXTRA_CFLAGS += -Wno-unused-value +EXTRA_CFLAGS += -Wno-unused-label +EXTRA_CFLAGS += -Wno-unused-parameter +EXTRA_CFLAGS += -Wno-unused-function +EXTRA_CFLAGS += -Wno-unused + +EXTRA_CFLAGS += -Wno-uninitialized + +EXTRA_CFLAGS += -I$(src)/include + +CONFIG_AUTOCFG_CP = n + +CONFIG_RTL8192C = y +CONFIG_RTL8192D = n + +CONFIG_USB_HCI = y +CONFIG_PCI_HCI = n +CONFIG_SDIO_HCI = n + +CONFIG_MP_INCLUDED = n +CONFIG_POWER_SAVING = n +CONFIG_USB_AUTOSUSPEND = n +CONFIG_HW_PWRP_DETECTION = n +CONFIG_WIFI_TEST = n +CONFIG_BT_COEXISTENCE = n +CONFIG_RTL8192CU_REDEFINE_1X1 = n + +CONFIG_PLATFORM_ARM_RK2918 = y + +CONFIG_DRVEXT_MODULE = n + +export TopDIR ?= $(shell pwd) + + +ifeq ($(CONFIG_RTL8192C), y) + +RTL871X = rtl8192c + +ifeq ($(CONFIG_USB_HCI), y) +MODULE_NAME = 8192cu +FW_FILES := hal/$(RTL871X)/usb/Hal8192CUHWImg.o +endif + +CHIP_FILES := hal/$(RTL871X)/$(RTL871X)_sreset.o +CHIP_FILES += $(FW_FILES) +endif + +os_dep/linux/ioctl_linux.o: os_dep/linux/ioctl_linux.uu + @echo "UUDE os_dep/linux/ioctl_linux.uu" + @uudecode os_dep/linux/ioctl_linux.uu -o os_dep/linux/ioctl_linux.o + +ifeq ($(CONFIG_USB_HCI), y) + +HCI_NAME = usb + +_OS_INTFS_FILES := os_dep/osdep_service.o \ + os_dep/linux/os_intfs.o \ + os_dep/linux/$(HCI_NAME)_intf.o \ + os_dep/linux/ioctl_linux.o \ + os_dep/linux/xmit_linux.o \ + os_dep/linux/ioctl_linux.o \ + os_dep/linux/mlme_linux.o \ + os_dep/linux/recv_linux.o + +_HAL_INTFS_FILES := hal/hal_init.o \ + hal/$(RTL871X)/$(RTL871X)_hal_init.o \ + hal/$(RTL871X)/$(RTL871X)_phycfg.o \ + hal/$(RTL871X)/$(RTL871X)_rf6052.o \ + hal/$(RTL871X)/$(RTL871X)_dm.o \ + hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ + hal/$(RTL871X)/$(RTL871X)_cmd.o \ + hal/$(RTL871X)/usb/usb_ops_linux.o \ + hal/$(RTL871X)/usb/usb_halinit.o \ + hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_led.o \ + hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_xmit.o \ + hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_recv.o + +_HAL_INTFS_FILES += $(CHIP_FILES) + +endif + +ifeq ($(CONFIG_AUTOCFG_CP), y) +$(shell cp $(TopDIR)/autoconf_$(RTL871X)_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) +endif + + +ifeq ($(CONFIG_USB_HCI), y) +ifeq ($(CONFIG_USB_AUTOSUSPEND), y) +EXTRA_CFLAGS += -DCONFIG_USB_AUTOSUSPEND +endif +endif + +ifeq ($(CONFIG_POWER_SAVING), y) +EXTRA_CFLAGS += -DCONFIG_POWER_SAVING +endif + +ifeq ($(CONFIG_HW_PWRP_DETECTION), y) +EXTRA_CFLAGS += -DCONFIG_HW_PWRP_DETECTION +endif + +ifeq ($(CONFIG_WIFI_TEST), y) +EXTRA_CFLAGS += -DCONFIG_WIFI_TEST +endif + +ifeq ($(CONFIG_BT_COEXISTENCE), y) +EXTRA_CFLAGS += -DCONFIG_BT_COEXISTENCE +endif + +ifeq ($(CONFIG_RTL8192CU_REDEFINE_1X1), y) +EXTRA_CFLAGS += -DRTL8192C_RECONFIG_TO_1T1R +endif + +ifeq ($(CONFIG_PLATFORM_ARM_RK2918), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS +ARCH := arm +CROSS_COMPILE := /opt/toolchain/arm-eabi-4.4.0/bin/arm-eabi- +KSRC := 2.6.25.1 +#MODULE_NAME := wlan0 +endif + +# +# Add minimize memory usage. +# +EXTRA_CFLAGS += -DCONFIG_MINIMAL_MEMORY_USAGE + +ifneq ($(KERNELRELEASE),) + + +rtk_core := core/rtw_cmd.o \ + core/rtw_security.o \ + core/rtw_debug.o \ + core/rtw_io.o \ + core/rtw_ioctl_query.o \ + core/rtw_ioctl_set.o \ + core/rtw_ieee80211.o \ + core/rtw_mlme.o \ + core/rtw_mlme_ext.o \ + core/rtw_wlan_util.o \ + core/rtw_pwrctrl.o \ + core/rtw_rf.o \ + core/rtw_recv.o \ + core/rtw_sta_mgt.o \ + core/rtw_xmit.o \ + core/rtw_p2p.o + +rtl$(MODULE_NAME)-y += $(rtk_core) + +rtl$(MODULE_NAME)-y += core/efuse/rtw_efuse.o + +rtl$(MODULE_NAME)-y += $(_HAL_INTFS_FILES) + +rtl$(MODULE_NAME)-y += $(_OS_INTFS_FILES) + + +rtl$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o \ + core/rtw_mp_ioctl.o \ + core/rtw_ioctl_rtl.o rk_cfg := \ - wifi_power.o \ - wifi_power_usb.o \ - wifi_power_ops.o + os_dep/linux/wifi_power.o \ + os_dep/linux/wifi_power_usb.o \ + os_dep/linux/wifi_power_ops.o rkcfg-y += $(rk_cfg) +obj-$(CONFIG_RTL8192CU) := rtl$(MODULE_NAME).o rkcfg.o -obj-$(CONFIG_RTL8192CU) += rtl8192c.o rkcfg.o +else -$(obj)/rtl8192c.o: $(obj)/rtl8192c.uu - @echo "UUDE rtl8192c.uu" - @uudecode $(obj)/rtl8192c.uu -o $(obj)/rtl8192c.o +export CONFIG_RTL8192CU = m +all: modules -.PHONY: clean +modules: + $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules + +strip: + $(CROSS_COMPILE)strip $(MODULE_NAME).ko --strip-unneeded + +config_r: + @echo "make config" + /bin/bash script/Configure script/config.in + +.PHONY: modules clean + +endif -clean: - find . -name '*.o*' -exec rm -f {} \; diff --git a/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c b/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c new file mode 100755 index 000000000000..2d90a4c5963f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c @@ -0,0 +1,1042 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_EFUSE_C_ + +#include +#include +#include + +#include + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE +extern int storeAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path); +extern int retriveAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path); +#endif + + +/*------------------------Define local variable------------------------------*/ +u8 fakeEfuseBank=0; +u32 fakeEfuseUsedBytes=0; +u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]={0}; +u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0}; +u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0}; + +u32 BTEfuseUsedBytes=0; +u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; +u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; + +u32 fakeBTEfuseUsedBytes=0; +u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; +u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; +/*------------------------Define local variable------------------------------*/ + +//------------------------------------------------------------------------------ +#define REG_EFUSE_CTRL 0x0030 +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. +//------------------------------------------------------------------------------ + +BOOLEAN +Efuse_Read1ByteFromFakeContent( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u8 *Value ) +{ + if(Offset >= EFUSE_MAX_HW_SIZE) + { + return _FALSE; + } + //DbgPrint("Read fake content, offset = %d\n", Offset); + if(fakeEfuseBank == 0) + *Value = fakeEfuseContent[Offset]; + else + *Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset]; + return _TRUE; +} +BOOLEAN +Efuse_Write1ByteToFakeContent( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u8 Value ) +{ + if(Offset >= EFUSE_MAX_HW_SIZE) + { + return _FALSE; + } + if(fakeEfuseBank == 0) + fakeEfuseContent[Offset] = Value; + else + { + fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value; + } + return _TRUE; +} + +/*----------------------------------------------------------------------------- + * Function: Efuse_PowerSwitch + * + * Overview: When we want to enable write operation, we should change to + * pwr on state. When we stop write, we should switch to 500k mode + * and disable LDO 2.5V. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/17/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +VOID +Efuse_PowerSwitch( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + pAdapter->HalFunc.EfusePowerSwitch(pAdapter, bWrite, PwrState); +} + +/*----------------------------------------------------------------------------- + * Function: efuse_GetCurrentSize + * + * Overview: Get current efuse size!!! + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/16/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +u16 +Efuse_GetCurrentSize( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest) +{ + u16 ret=0; + + ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest); + + return ret; +} + +/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */ +u8 +Efuse_CalculateWordCnts(IN u8 word_en) +{ + u8 word_cnts = 0; + if(!(word_en & BIT(0))) word_cnts++; // 0 : write enable + if(!(word_en & BIT(1))) word_cnts++; + if(!(word_en & BIT(2))) word_cnts++; + if(!(word_en & BIT(3))) word_cnts++; + return word_cnts; +} + +// +// Description: +// Execute E-Fuse read byte operation. +// Refered from SD1 Richard. +// +// Assumption: +// 1. Boot from E-Fuse and successfully auto-load. +// 2. PASSIVE_LEVEL (USB interface) +// +// Created by Roger, 2008.10.21. +// +VOID +ReadEFuseByte( + PADAPTER Adapter, + u16 _offset, + u8 *pbuf, + IN BOOLEAN bPseudoTest) +{ + u32 value32; + u8 readbyte; + u16 retry; + //u32 start=rtw_get_current_time(); + + if(bPseudoTest) + { + Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf); + return; + } + + //Write Address + rtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff)); + readbyte = rtw_read8(Adapter, EFUSE_CTRL+2); + rtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc)); + + //Write bit 32 0 + readbyte = rtw_read8(Adapter, EFUSE_CTRL+3); + rtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f)); + + //Check bit 32 read-ready + retry = 0; + value32 = rtw_read32(Adapter, EFUSE_CTRL); + //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10)) + while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000)) + { + value32 = rtw_read32(Adapter, EFUSE_CTRL); + retry++; + } + + // 20100205 Joseph: Add delay suggested by SD1 Victor. + // This fix the problem that Efuse read error in high temperature condition. + // Designer says that there shall be some delay after ready bit is set, or the + // result will always stay on last data we read. + rtw_udelay_os(50); + value32 = rtw_read32(Adapter, EFUSE_CTRL); + + *pbuf = (u8)(value32 & 0xff); + //MSG_8192C("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start)); + +} + + +// +// Description: +// 1. Execute E-Fuse read byte operation according as map offset and +// save to E-Fuse table. +// 2. Refered from SD1 Richard. +// +// Assumption: +// 1. Boot from E-Fuse and successfully auto-load. +// 2. PASSIVE_LEVEL (USB interface) +// +// Created by Roger, 2008.10.21. +// +// 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. +// 2. Add efuse utilization collect. +// 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 +// write addr must be after sec5. +// +VOID +efuse_ReadEFuse( + PADAPTER Adapter, + u8 efuseType, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest); +} + +VOID +EFUSE_GetEfuseDefinition( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u8 type, + OUT PVOID *pOut, + IN BOOLEAN bPseudoTest + ) +{ + pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest); +} + +/*----------------------------------------------------------------------------- + * Function: EFUSE_Read1Byte + * + * Overview: Copy from WMAC fot EFUSE read 1 byte. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 09/23/2008 MHC Copy from WMAC. + * + *---------------------------------------------------------------------------*/ +u8 +EFUSE_Read1Byte( + IN PADAPTER Adapter, + IN u16 Address) +{ + u8 data; + u8 Bytetemp = {0x00}; + u8 temp = {0x00}; + u32 k=0; + u16 contentLen=0; + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); + + if (Address < contentLen) //E-fuse 512Byte + { + //Write E-fuse Register address bit0~7 + temp = Address & 0xFF; + rtw_write8(Adapter, EFUSE_CTRL+1, temp); + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); + //Write E-fuse Register address bit8~9 + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); + rtw_write8(Adapter, EFUSE_CTRL+2, temp); + + //Write 0x30[31]=0 + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + temp = Bytetemp & 0x7F; + rtw_write8(Adapter, EFUSE_CTRL+3, temp); + + //Wait Write-ready (0x30[31]=1) + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + while(!(Bytetemp & 0x80)) + { + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + k++; + if(k==1000) + { + k=0; + break; + } + } + data=rtw_read8(Adapter, EFUSE_CTRL); + return data; + } + else + return 0xFF; + +}/* EFUSE_Read1Byte */ + +/*----------------------------------------------------------------------------- + * Function: EFUSE_Write1Byte + * + * Overview: Copy from WMAC fot EFUSE write 1 byte. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 09/23/2008 MHC Copy from WMAC. + * + *---------------------------------------------------------------------------*/ +void +EFUSE_Write1Byte( + IN PADAPTER Adapter, + IN u16 Address, + IN u8 Value) +{ + u8 Bytetemp = {0x00}; + u8 temp = {0x00}; + u32 k=0; + u16 contentLen=0; + + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr=%x Data =%x\n", Address, Value)); + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); + + if( Address < contentLen) //E-fuse 512Byte + { + rtw_write8(Adapter, EFUSE_CTRL, Value); + + //Write E-fuse Register address bit0~7 + temp = Address & 0xFF; + rtw_write8(Adapter, EFUSE_CTRL+1, temp); + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); + + //Write E-fuse Register address bit8~9 + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); + rtw_write8(Adapter, EFUSE_CTRL+2, temp); + + //Write 0x30[31]=1 + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + temp = Bytetemp | 0x80; + rtw_write8(Adapter, EFUSE_CTRL+3, temp); + + //Wait Write-ready (0x30[31]=0) + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + while(Bytetemp & 0x80) + { + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + k++; + if(k==100) + { + k=0; + break; + } + } + } +}/* EFUSE_Write1Byte */ + +/* 11/16/2008 MH Read one byte from real Efuse. */ +u8 +efuse_OneByteRead( + IN PADAPTER pAdapter, + IN u16 addr, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 tmpidx = 0; + u8 bResult; + + if(bPseudoTest) + { + bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data); + return bResult; + } + // -----------------e-fuse reg ctrl --------------------------------- + //address + rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff)); + rtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) | + (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )); + + rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72);//read cmd + + while(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<100)) + { + tmpidx++; + } + if(tmpidx<100) + { + *data=rtw_read8(pAdapter, EFUSE_CTRL); + bResult = _TRUE; + } + else + { + *data = 0xff; + bResult = _FALSE; + } + return bResult; +} + +/* 11/16/2008 MH Write one byte to reald Efuse. */ +u8 +efuse_OneByteWrite( + IN PADAPTER pAdapter, + IN u16 addr, + IN u8 data, + IN BOOLEAN bPseudoTest) +{ + u8 tmpidx = 0; + u8 bResult; + + if(bPseudoTest) + { + bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data); + return bResult; + } + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr = %x Data=%x\n", addr, data)); + + //return 0; + + // -----------------e-fuse reg ctrl --------------------------------- + //address + rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff)); + rtw_write8(pAdapter, EFUSE_CTRL+2, + (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )|(u8)((addr>>8)&0x03) ); + rtw_write8(pAdapter, EFUSE_CTRL, data);//data + + rtw_write8(pAdapter, EFUSE_CTRL+3, 0xF2);//write cmd + + while((0x80 & rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){ + tmpidx++; + } + + if(tmpidx<100) + { + bResult = _TRUE; + } + else + { + bResult = _FALSE; + } + + return bResult; +} + +int +Efuse_PgPacketRead( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest); + + return ret; +} + +int +Efuse_PgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret; + + ret = pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest); + + return ret; +} + +/*----------------------------------------------------------------------------- + * Function: efuse_WordEnableDataRead + * + * Overview: Read allowed word in current efuse section data. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/16/2008 MHC Create Version 0. + * 11/21/2008 MHC Fix Write bug when we only enable late word. + * + *---------------------------------------------------------------------------*/ +void +efuse_WordEnableDataRead(IN u8 word_en, + IN u8 *sourdata, + IN u8 *targetdata) +{ + if (!(word_en&BIT(0))) + { + targetdata[0] = sourdata[0]; + targetdata[1] = sourdata[1]; + } + if (!(word_en&BIT(1))) + { + targetdata[2] = sourdata[2]; + targetdata[3] = sourdata[3]; + } + if (!(word_en&BIT(2))) + { + targetdata[4] = sourdata[4]; + targetdata[5] = sourdata[5]; + } + if (!(word_en&BIT(3))) + { + targetdata[6] = sourdata[6]; + targetdata[7] = sourdata[7]; + } +} + + +u8 +Efuse_WordEnableDataWrite( IN PADAPTER pAdapter, + IN u16 efuse_addr, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 ret=0; + + ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest); + + return ret; +} + +static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value) +{ + return efuse_OneByteRead(padapter,address, value, _FALSE); +} + +static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value) +{ + return efuse_OneByteWrite(padapter,address, *value, _FALSE); +} + +/* + * read/wirte raw efuse data + */ +u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data) +{ + int i = 0; + u16 real_content_len = 0, max_available_size = 0; + u8 res = _FAIL ; + u8 (*rw8)(PADAPTER, u16, u8*); + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE); + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); + + if (start_addr > real_content_len) + return _FAIL; + + if (_TRUE == bWrite) { + if ((start_addr + cnts) > max_available_size) + return _FAIL; + rw8 = &efuse_write8; + } else + rw8 = &efuse_read8; + + Efuse_PowerSwitch(padapter, bWrite, _TRUE); + + // e-fuse one byte read / write + for (i = 0; i < cnts; i++) { + if (start_addr >= real_content_len) { + res = _FAIL; + break; + } + + res = rw8(padapter, start_addr++, data++); + if (_FAIL == res) break; + } + + Efuse_PowerSwitch(padapter, bWrite, _FALSE); + + return res; +} +//------------------------------------------------------------------------------ +u16 efuse_GetMaxSize(PADAPTER padapter) +{ + u16 max_size; + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); + return max_size; +} +//------------------------------------------------------------------------------ +u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size) +{ + Efuse_PowerSwitch(padapter, _FALSE, _TRUE); + *size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE); + Efuse_PowerSwitch(padapter, _FALSE, _FALSE); + + return _SUCCESS; +} +//------------------------------------------------------------------------------ +u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) +{ + u16 mapLen=0; + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + if ((addr + cnts) > mapLen) + return _FAIL; + + Efuse_PowerSwitch(padapter, _FALSE, _TRUE); + + efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE); + + Efuse_PowerSwitch(padapter, _FALSE, _FALSE); + + return _SUCCESS; +} +//------------------------------------------------------------------------------ +u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) +{ + u8 offset, word_en; + u8 *map; + u8 newdata[PGPKT_DATA_SIZE]; + s32 i, j, idx; + u8 ret = _SUCCESS; + u16 mapLen=0; + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + if ((addr + cnts) > mapLen) + return _FAIL; + + map = rtw_zmalloc(mapLen); + if(map == NULL){ + return _FAIL; + } + + ret = rtw_efuse_map_read(padapter, 0, mapLen, map); + if (ret == _FAIL) goto exit; + + Efuse_PowerSwitch(padapter, _TRUE, _TRUE); + + offset = (addr >> 3); + word_en = 0xF; + _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE); + i = addr & 0x7; // index of one package + j = 0; // index of new package + idx = 0; // data index + + if (i & 0x1) { + // odd start + if (data[idx] != map[addr+idx]) { + word_en &= ~BIT(i >> 1); + newdata[i-1] = map[addr+idx-1]; + newdata[i] = data[idx]; + } + i++; + idx++; + } + do { + for (; i < PGPKT_DATA_SIZE; i += 2) + { + if (cnts == idx) break; + if ((cnts - idx) == 1) { + if (data[idx] != map[addr+idx]) { + word_en &= ~BIT(i >> 1); + newdata[i] = data[idx]; + newdata[i+1] = map[addr+idx+1]; + } + idx++; + break; + } else { + if ((data[idx] != map[addr+idx]) || + (data[idx+1] != map[addr+idx+1])) + { + word_en &= ~BIT(i >> 1); + newdata[i] = data[idx]; + newdata[i+1] = data[idx + 1]; + } + idx += 2; + } + if (idx == cnts) break; + } + + if (word_en != 0xF) { + ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE); + DBG_8192C("offset=%x \n",offset); + DBG_8192C("word_en=%x \n",word_en); + + for(i=0;iefuse_eeprom_data[Offset]; + +} // EFUSE_ShadowRead1Byte + +//---------------Read Two Bytes +static VOID +efuse_ShadowRead2Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u16 *Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + *Value = pEEPROM->efuse_eeprom_data[Offset]; + *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; + +} // EFUSE_ShadowRead2Byte + +//---------------Read Four Bytes +static VOID +efuse_ShadowRead4Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u32 *Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + *Value = pEEPROM->efuse_eeprom_data[Offset]; + *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; + *Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16; + *Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24; + +} // efuse_ShadowRead4Byte + + +/*----------------------------------------------------------------------------- + * Function: efuse_ShadowWrite1Byte + * efuse_ShadowWrite2Byte + * efuse_ShadowWrite4Byte + * + * Overview: Write efuse modify map by one/two/four byte. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +efuse_ShadowWrite1Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u8 Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + pEEPROM->efuse_eeprom_data[Offset] = Value; + +} // efuse_ShadowWrite1Byte + +//---------------Write Two Bytes +static VOID +efuse_ShadowWrite2Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u16 Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + pEEPROM->efuse_eeprom_data[Offset] = Value&0x00FF; + pEEPROM->efuse_eeprom_data[Offset+1] = Value>>8; + +} // efuse_ShadowWrite1Byte + +//---------------Write Four Bytes +static VOID +efuse_ShadowWrite4Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u32 Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + pEEPROM->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF); + pEEPROM->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF); + pEEPROM->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF); + pEEPROM->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF); + +} // efuse_ShadowWrite1Byte + +/*----------------------------------------------------------------------------- + * Function: EFUSE_ShadowMapUpdate + * + * Overview: Transfer current EFUSE content to shadow init and modify map. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/13/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +void EFUSE_ShadowMapUpdate( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + u16 mapLen=0; + + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); + + if (pEEPROM->bautoload_fail_flag == _TRUE) + { + _rtw_memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen); + } + else + { + #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + if(0 != retriveAdaptorInfoFile(pEEPROM, pAdapter->registrypriv.adaptor_info_caching_file_path)) { + #endif + + Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest); + + #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + storeAdaptorInfoFile(pEEPROM, pAdapter->registrypriv.adaptor_info_caching_file_path); + } + #endif + } + + //PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], + //(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); +}// EFUSE_ShadowMapUpdate + + +/*----------------------------------------------------------------------------- + * Function: EFUSE_ShadowRead + * + * Overview: Read from efuse init map !!!!! + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +void +EFUSE_ShadowRead( + IN PADAPTER pAdapter, + IN u8 Type, + IN u16 Offset, + IN OUT u32 *Value ) +{ + if (Type == 1) + efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value); + else if (Type == 2) + efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value); + else if (Type == 4) + efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value); + +} // EFUSE_ShadowRead + +/*----------------------------------------------------------------------------- + * Function: EFUSE_ShadowWrite + * + * Overview: Write efuse modify map for later update operation to use!!!!! + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern VOID +EFUSE_ShadowWrite( + IN PADAPTER pAdapter, + IN u8 Type, + IN u16 Offset, + IN OUT u32 Value) +{ +#if (MP_DRIVER == 0) + return; +#endif + + if (Type == 1) + efuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value); + else if (Type == 2) + efuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value); + else if (Type == 4) + efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value); + +} // EFUSE_ShadowWrite + +VOID +Efuse_InitSomeVar( + IN PADAPTER pAdapter + ) +{ + u8 i; + + _rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE); + _rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN); + _rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN); + + for(i=0; i +#include +#include +#include +#include +#include +#include + +/* +Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. +No irqsave is necessary. +*/ + +sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv) +{ + sint res=_SUCCESS; + +_func_enter_; + + _rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0); + //_rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0); + _rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0); + + + _rtw_init_queue(&(pcmdpriv->cmd_queue)); + + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + + pcmdpriv->cmd_seq = 1; + + pcmdpriv->cmd_allocated_buf = rtw_zmalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ); + + if (pcmdpriv->cmd_allocated_buf == NULL){ + res= _FAIL; + goto exit; + } + + //pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ( (SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ-1)); + pcmdpriv->cmd_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pcmdpriv->cmd_allocated_buf ), CMDBUFF_ALIGN_SZ); + + pcmdpriv->rsp_allocated_buf = rtw_zmalloc(MAX_RSPSZ + 4); + + if (pcmdpriv->rsp_allocated_buf == NULL){ + res= _FAIL; + goto exit; + } + + //pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ( (SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3); + pcmdpriv->rsp_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pcmdpriv->rsp_allocated_buf ), 4); + + pcmdpriv->cmd_issued_cnt = pcmdpriv->cmd_done_cnt = pcmdpriv->rsp_cnt = 0; + +exit: + +_func_exit_; + + return res; + +} + + +sint _rtw_init_evt_priv(struct evt_priv *pevtpriv) +{ + sint res=_SUCCESS; + +_func_enter_; + +#ifdef CONFIG_H2CLBK + _rtw_init_sema(&(pevtpriv->lbkevt_done), 0); + pevtpriv->lbkevt_limit = 0; + pevtpriv->lbkevt_num = 0; + pevtpriv->cmdevt_parm = NULL; +#endif + + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + ATOMIC_SET(&pevtpriv->event_seq, 0); + pevtpriv->evt_done_cnt = 0; + +#ifdef CONFIG_EVENT_THREAD_MODE + + _rtw_init_sema(&(pevtpriv->evt_notify), 0); + _rtw_init_sema(&(pevtpriv->terminate_evtthread_sema), 0); + + pevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4); + if (pevtpriv->evt_allocated_buf == NULL){ + res= _FAIL; + goto exit; + } + //pevtpriv->evt_buf = pevtpriv->evt_allocated_buf + 4 - ((unsigned int)(pevtpriv->evt_allocated_buf) & 3); + pevtpriv->evt_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pevtpriv->evt_allocated_buf ), 4); + + +#ifdef CONFIG_SDIO_HCI + pevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ +4); + + if (pevtpriv->allocated_c2h_mem == NULL){ + res= _FAIL; + goto exit; + } + + //pevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem + 4 + //- ( (u32)(pevtpriv->allocated_c2h_mem) & 3); + pevtpriv->c2h_mem = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pevtpriv->allocated_c2h_mem ), 4); + +#ifdef PLATFORM_OS_XP + pevtpriv->pc2h_mdl= IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL); + + if(pevtpriv->pc2h_mdl == NULL){ + res= _FAIL; + goto exit; + } + MmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl); +#endif +#endif //end of CONFIG_SDIO_HCI + + _rtw_init_queue(&(pevtpriv->evt_queue)); + +exit: + +#endif //end of CONFIG_EVENT_THREAD_MODE + +_func_exit_; + + return res; +} + +void _rtw_free_evt_priv (struct evt_priv *pevtpriv) +{ +_func_enter_; + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("+_rtw_free_evt_priv \n")); + +#ifdef CONFIG_EVENT_THREAD_MODE + _rtw_free_sema(&(pevtpriv->evt_notify)); + _rtw_free_sema(&(pevtpriv->terminate_evtthread_sema)); + + + if (pevtpriv->evt_allocated_buf) + rtw_mfree(pevtpriv->evt_allocated_buf, MAX_EVTSZ + 4); +#endif + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("-_rtw_free_evt_priv \n")); + +_func_exit_; + +} + +void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) +{ +_func_enter_; + + if(pcmdpriv){ + _rtw_spinlock_free(&(pcmdpriv->cmd_queue.lock)); + _rtw_free_sema(&(pcmdpriv->cmd_queue_sema)); + //_rtw_free_sema(&(pcmdpriv->cmd_done_sema)); + _rtw_free_sema(&(pcmdpriv->terminate_cmdthread_sema)); + + if (pcmdpriv->cmd_allocated_buf) + rtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ); + + if (pcmdpriv->rsp_allocated_buf) + rtw_mfree(pcmdpriv->rsp_allocated_buf, MAX_RSPSZ + 4); + } +_func_exit_; +} + +/* +Calling Context: + +rtw_enqueue_cmd can only be called between kernel thread, +since only spin_lock is used. + +ISR/Call-Back functions can't call this sub-function. + +*/ + +sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj) +{ + _irqL irqL; + +_func_enter_; + + if (obj == NULL) + goto exit; + + _enter_critical_bh(&queue->lock, &irqL); + + rtw_list_insert_tail(&obj->list, &queue->queue); + + _exit_critical_bh(&queue->lock, &irqL); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +struct cmd_obj *_rtw_dequeue_cmd(_queue *queue) +{ + _irqL irqL; + struct cmd_obj *obj; + +_func_enter_; + + _enter_critical_bh(&(queue->lock), &irqL); + + if (rtw_is_list_empty(&(queue->queue))) + obj = NULL; + else + { + obj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list); + rtw_list_delete(&obj->list); + } + + _exit_critical_bh(&(queue->lock), &irqL); + +_func_exit_; + + return obj; +} + +u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) +{ + u32 res; +_func_enter_; + res = _rtw_init_cmd_priv (pcmdpriv); +_func_exit_; + return res; +} + +u32 rtw_init_evt_priv (struct evt_priv *pevtpriv) +{ + int res; +_func_enter_; + res = _rtw_init_evt_priv(pevtpriv); +_func_exit_; + return res; +} + +void rtw_free_evt_priv (struct evt_priv *pevtpriv) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_evt_priv\n")); + _rtw_free_evt_priv(pevtpriv); +_func_exit_; +} + +void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_cmd_priv\n")); + _rtw_free_cmd_priv(pcmdpriv); +_func_exit_; +} + +int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) +{ + u8 bAllow = _FALSE; //set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE + + #ifdef SUPPORT_HW_RFOFF_DETECTED + //To decide allow or not + if( (pcmdpriv->padapter->pwrctrlpriv.bHWPwrPindetect) + &&(!pcmdpriv->padapter->registrypriv.usbss_enable) + ) + { + if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) ) + { + struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; + if(pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID) + { + //DBG_8192C("==>enqueue POWER_SAVING_CTRL_WK_CID\n"); + bAllow = _TRUE; + } + } + } +#endif + + if( (pcmdpriv->padapter->hw_init_completed==_FALSE && bAllow == _FALSE) + || pcmdpriv->cmdthd_running== _FALSE //com_thread not running + ) + { + //DBG_871X("%s: hw_init_completed:%u, cmdthd_running:%u\n", __FUNCTION__, + // pcmdpriv->padapter->hw_init_completed, + // pcmdpriv->cmdthd_running + //); + return _FAIL; + } + return _SUCCESS; +} + + + +u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) +{ + int res = _FAIL; + +_func_enter_; + + if (cmd_obj == NULL) { + goto exit; + } + + if( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) { + rtw_free_cmd_obj(cmd_obj); + goto exit; + } + + res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj); + + if(res == _SUCCESS) + _rtw_up_sema(&pcmdpriv->cmd_queue_sema); + +exit: + +_func_exit_; + + return res; +} + +struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv) +{ + struct cmd_obj *cmd_obj; + +_func_enter_; + + cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue); + +_func_exit_; + return cmd_obj; +} + +void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv) +{ +_func_enter_; + pcmdpriv->cmd_done_cnt++; + //_rtw_up_sema(&(pcmdpriv->cmd_done_sema)); +_func_exit_; +} + +void rtw_free_cmd_obj(struct cmd_obj *pcmd) +{ +_func_enter_; + + if((pcmd->cmdcode!=_JoinBss_CMD_) &&(pcmd->cmdcode!= _CreateBss_CMD_)) + { + //free parmbuf in cmd_obj + rtw_mfree((unsigned char*)pcmd->parmbuf, pcmd->cmdsz); + } + + if(pcmd->rsp!=NULL) + { + if(pcmd->rspsz!= 0) + { + //free rsp in cmd_obj + rtw_mfree((unsigned char*)pcmd->rsp, pcmd->rspsz); + } + } + + //free cmd_obj + rtw_mfree((unsigned char*)pcmd, sizeof(struct cmd_obj)); + +_func_exit_; +} + + +thread_return rtw_cmd_thread(thread_context context) +{ + u8 ret; + struct cmd_obj *pcmd; + u8 *pcmdbuf, *prspbuf; + u8 (*cmd_hdl)(_adapter *padapter, u8* pbuf); + void (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd); + _adapter *padapter = (_adapter *)context; + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + +_func_enter_; + + thread_enter(padapter); + + pcmdbuf = pcmdpriv->cmd_buf; + prspbuf = pcmdpriv->rsp_buf; + + pcmdpriv->cmdthd_running=_TRUE; + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n")); + + while(1) + { + if ((_rtw_down_sema(&(pcmdpriv->cmd_queue_sema))) == _FAIL) + break; + + if (rtw_register_cmd_alive(padapter) != _SUCCESS) + { + continue; + } + +_next: + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) + { + //DBG_8192C("###> rtw_cmd_thread break.................\n"); + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("rtw_cmd_thread:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + break; + } + + if(!(pcmd = rtw_dequeue_cmd(pcmdpriv))) { + rtw_unregister_cmd_alive(padapter); + continue; + } + + if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) ) { + rtw_free_cmd_obj(pcmd); + continue; + } + + pcmdpriv->cmd_issued_cnt++; + + pcmd->cmdsz = _RND4((pcmd->cmdsz));//_RND4 + + _rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz); + + if(pcmd->cmdcode <= (sizeof(wlancmds) /sizeof(struct cmd_hdl))) + { + cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns; + + if (cmd_hdl) + { + ret = cmd_hdl(padapter, pcmdbuf); + pcmd->res = ret; + } + + //invoke cmd->callback function + pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback; + if(pcmd_callback == NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("mlme_cmd_hdl(): pcmd_callback=0x%p, cmdcode=0x%x\n", pcmd_callback, pcmd->cmdcode)); + rtw_free_cmd_obj(pcmd); + } + else + { + //todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL) + + pcmd_callback(padapter, pcmd);//need conider that free cmd_obj in rtw_cmd_callback + } + + pcmdpriv->cmd_seq++; + } + + cmd_hdl = NULL; + + flush_signals_thread(); + + goto _next; + + } + pcmdpriv->cmdthd_running=_FALSE; + + + // free all cmd_obj resources + do{ + pcmd = rtw_dequeue_cmd(pcmdpriv); + if(pcmd==NULL) + break; + + rtw_free_cmd_obj(pcmd); + }while(1); + + _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema); + +_func_exit_; + + thread_exit(); + +} + + +#ifdef CONFIG_EVENT_THREAD_MODE +u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj) +{ + _irqL irqL; + int res; + _queue *queue = &pevtpriv->evt_queue; + +_func_enter_; + + res = _SUCCESS; + + if (obj == NULL) { + res = _FAIL; + goto exit; + } + + _enter_critical_bh(&queue->lock, &irqL); + + rtw_list_insert_tail(&obj->list, &queue->queue); + + _exit_critical_bh(&queue->lock, &irqL); + + //rtw_evt_notify_isr(pevtpriv); + +exit: + +_func_exit_; + + return res; +} + +struct evt_obj *rtw_dequeue_evt(_queue *queue) +{ + _irqL irqL; + struct evt_obj *pevtobj; + +_func_enter_; + + _enter_critical_bh(&queue->lock, &irqL); + + if (rtw_is_list_empty(&(queue->queue))) + pevtobj = NULL; + else + { + pevtobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct evt_obj, list); + rtw_list_delete(&pevtobj->list); + } + + _exit_critical_bh(&queue->lock, &irqL); + +_func_exit_; + + return pevtobj; +} + +void rtw_free_evt_obj(struct evt_obj *pevtobj) +{ +_func_enter_; + + if(pevtobj->parmbuf) + rtw_mfree((unsigned char*)pevtobj->parmbuf, pevtobj->evtsz); + + rtw_mfree((unsigned char*)pevtobj, sizeof(struct evt_obj)); + +_func_exit_; +} + +void rtw_evt_notify_isr(struct evt_priv *pevtpriv) +{ +_func_enter_; + pevtpriv->evt_done_cnt++; + _rtw_up_sema(&(pevtpriv->evt_notify)); +_func_exit_; +} +#endif + + +/* +u8 rtw_setstandby_cmd(unsigned char *adapter) +*/ +u8 rtw_setstandby_cmd(_adapter *padapter, uint action) +{ + struct cmd_obj* ph2c; + struct usb_suspend_parm* psetusbsuspend; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + + u8 ret = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + ret = _FAIL; + goto exit; + } + + psetusbsuspend = (struct usb_suspend_parm*)rtw_zmalloc(sizeof(struct usb_suspend_parm)); + if (psetusbsuspend == NULL) { + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + ret = _FAIL; + goto exit; + } + + psetusbsuspend->action = action; + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend)); + + ret = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return ret; +} + +/* +rtw_sitesurvey_cmd(~) + ### NOTE:#### (!!!!) + MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock +*/ +u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *pssid) +{ + u8 res = _FAIL; + struct cmd_obj *ph2c; + struct sitesurvey_parm *psurveyPara; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif //CONFIG_P2P + +_func_enter_; + +#ifdef CONFIG_LPS + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){ + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1); + } +#endif + +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1); +#endif //CONFIG_P2P + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) + return _FAIL; + + psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm)); + if (psurveyPara == NULL) { + rtw_mfree((unsigned char*) ph2c, sizeof(struct cmd_obj)); + return _FAIL; + } + + rtw_free_network_queue(padapter, _FALSE); + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("\nflush network queue\n\n")); + + init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); + + psurveyPara->bsslimit = cpu_to_le32(48); + psurveyPara->scan_mode = cpu_to_le32(pmlmepriv->scan_mode); + psurveyPara->ss_ssidlen= cpu_to_le32(0);// pssid->SsidLength; + _rtw_memset(psurveyPara->ss_ssid, 0, IW_ESSID_MAX_SIZE + 1); + if ((pssid != NULL) && (pssid->SsidLength)) { + _rtw_memcpy(psurveyPara->ss_ssid, pssid->Ssid, pssid->SsidLength); + psurveyPara->ss_ssidlen = cpu_to_le32(pssid->SsidLength); + } + + set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + + if(res == _SUCCESS) { + + pmlmepriv->scan_start_time = rtw_get_current_time(); + + _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT); + + rtw_led_control(padapter, LED_CTL_SITE_SURVEY); + + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + } else { + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + } + +_func_exit_; + + return res; +} + +u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset) +{ + struct cmd_obj* ph2c; + struct setdatarate_parm* pbsetdataratepara; + struct cmd_priv* pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; + goto exit; + } + + pbsetdataratepara = (struct setdatarate_parm*)rtw_zmalloc(sizeof(struct setdatarate_parm)); + if (pbsetdataratepara == NULL) { + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate)); +#ifdef MP_FIRMWARE_OFFLOAD + pbsetdataratepara->curr_rateidx = *(u32*)rateset; +// _rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32)); +#else + pbsetdataratepara->mac_id = 5; + _rtw_memcpy(pbsetdataratepara->datarates, rateset, NumRates); +#endif + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset) +{ + struct cmd_obj* ph2c; + struct setbasicrate_parm* pssetbasicratepara; + struct cmd_priv* pcmdpriv=&padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res= _FAIL; + goto exit; + } + pssetbasicratepara = (struct setbasicrate_parm*)rtw_zmalloc(sizeof(struct setbasicrate_parm)); + + if (pssetbasicratepara == NULL) { + rtw_mfree((u8*) ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_); + + _rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: + +_func_exit_; + + return res; +} + + +/* +unsigned char rtw_setphy_cmd(unsigned char *adapter) + +1. be called only after rtw_update_registrypriv_dev_network( ~) or mp testing program +2. for AdHoc/Ap mode or mp mode? + +*/ +u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch) +{ + struct cmd_obj* ph2c; + struct setphy_parm* psetphypara; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; +// struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +// struct registry_priv* pregistry_priv = &padapter->registrypriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + psetphypara = (struct setphy_parm*)rtw_zmalloc(sizeof(struct setphy_parm)); + + if(psetphypara==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_); + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("CH=%d, modem=%d", ch, modem)); + + psetphypara->modem = modem; + psetphypara->rfchannel = ch; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_setbbreg_cmd(_adapter*padapter, u8 offset, u8 val) +{ + struct cmd_obj* ph2c; + struct writeBB_parm* pwritebbparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + pwritebbparm = (struct writeBB_parm*)rtw_zmalloc(sizeof(struct writeBB_parm)); + + if(pwritebbparm==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg)); + + pwritebbparm->offset = offset; + pwritebbparm->value = val; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_getbbreg_cmd(_adapter *padapter, u8 offset, u8 *pval) +{ + struct cmd_obj* ph2c; + struct readBB_parm* prdbbparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res=_FAIL; + goto exit; + } + prdbbparm = (struct readBB_parm*)rtw_zmalloc(sizeof(struct readBB_parm)); + + if(prdbbparm ==NULL){ + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); + return _FAIL; + } + + _rtw_init_listhead(&ph2c->list); + ph2c->cmdcode =GEN_CMD_CODE(_GetBBReg); + ph2c->parmbuf = (unsigned char *)prdbbparm; + ph2c->cmdsz = sizeof(struct readBB_parm); + ph2c->rsp = pval; + ph2c->rspsz = sizeof(struct readBB_rsp); + + prdbbparm ->offset = offset; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_setrfreg_cmd(_adapter *padapter, u8 offset, u32 val) +{ + struct cmd_obj* ph2c; + struct writeRF_parm* pwriterfparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + pwriterfparm = (struct writeRF_parm*)rtw_zmalloc(sizeof(struct writeRF_parm)); + + if(pwriterfparm==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg)); + + pwriterfparm->offset = offset; + pwriterfparm->value = val; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_getrfreg_cmd(_adapter *padapter, u8 offset, u8 *pval) +{ + struct cmd_obj* ph2c; + struct readRF_parm* prdrfparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + prdrfparm = (struct readRF_parm*)rtw_zmalloc(sizeof(struct readRF_parm)); + if(prdrfparm ==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_init_listhead(&ph2c->list); + ph2c->cmdcode =GEN_CMD_CODE(_GetRFReg); + ph2c->parmbuf = (unsigned char *)prdrfparm; + ph2c->cmdsz = sizeof(struct readRF_parm); + ph2c->rsp = pval; + ph2c->rspsz = sizeof(struct readRF_rsp); + + prdrfparm ->offset = offset; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +void rtw_getbbrfreg_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _func_enter_; + + //rtw_free_cmd_obj(pcmd); + rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); + rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); + +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.workparam.bcompleted= _TRUE; +#endif +_func_exit_; +} + +void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _func_enter_; + + rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); + rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); + +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.workparam.bcompleted= _TRUE; +#endif + +_func_exit_; +} + +u8 rtw_createbss_cmd(_adapter *padapter) +{ + struct cmd_obj* pcmd; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network; + u8 res=_SUCCESS; + +_func_enter_; + + rtw_led_control(padapter, LED_CTL_START_TO_LINK); + + if (pmlmepriv->assoc_ssid.SsidLength == 0){ + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for Any SSid:%s\n",pmlmepriv->assoc_ssid.Ssid)); + } else { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); + } + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; + goto exit; + } + + _rtw_init_listhead(&pcmd->list); + pcmd->cmdcode = _CreateBss_CMD_; + pcmd->parmbuf = (unsigned char *)pdev_network; + pcmd->cmdsz = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX*)pdev_network); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + pdev_network->Length = pcmd->cmdsz; + +#ifdef CONFIG_RTL8712 + //notes: translate IELength & Length after assign the Length to cmdsz; + pdev_network->Length = cpu_to_le32(pcmd->cmdsz); + pdev_network->IELength = cpu_to_le32(pdev_network->IELength); + pdev_network->Ssid.SsidLength = cpu_to_le32(pdev_network->Ssid.SsidLength); +#endif + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz) +{ + struct cmd_obj* pcmd; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; + goto exit; + } + + _rtw_init_listhead(&pcmd->list); + pcmd->cmdcode = GEN_CMD_CODE(_CreateBss); + pcmd->parmbuf = pbss; + pcmd->cmdsz = sz; + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork) +{ + u8 *auth, res = _SUCCESS; + uint t_len = 0; + WLAN_BSSID_EX *psecnetwork; + struct cmd_obj *pcmd; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode; + +_func_enter_; + + rtw_led_control(padapter, LED_CTL_START_TO_LINK); + + if (pmlmepriv->assoc_ssid.SsidLength == 0){ + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("+Join cmd: Any SSid\n")); + } else { + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+Join cmd: SSid=[%s]\n", pmlmepriv->assoc_ssid.Ssid)); + } + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res=_FAIL; + RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd: memory allocate for cmd_obj fail!!!\n")); + goto exit; + } + /* // for IEs is pointer + t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) + + sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + + sizeof (NDIS_802_11_CONFIGURATION) + + sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + + sizeof (NDIS_802_11_RATES_EX)+ sizeof(WLAN_PHY_INFO)+ sizeof (ULONG) + MAX_IE_SZ; + */ + //for IEs is fix buf size + t_len = sizeof(WLAN_BSSID_EX); + + + //for hidden ap to set fw_state here + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != _TRUE) + { + switch(ndis_network_mode) + { + case Ndis802_11IBSS: + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + break; + + case Ndis802_11Infrastructure: + set_fwstate(pmlmepriv, WIFI_STATION_STATE); + break; + + case Ndis802_11APMode: + case Ndis802_11AutoUnknown: + case Ndis802_11InfrastructureMax: + break; + + } + } + + psecnetwork=(WLAN_BSSID_EX *)&psecuritypriv->sec_bss; + if(psecnetwork==NULL) + { + if(pcmd !=NULL) + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + + res=_FAIL; + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd :psecnetwork==NULL!!!\n")); + + goto exit; + } + + _rtw_memset(psecnetwork, 0, t_len); + + _rtw_memcpy(psecnetwork, &pnetwork->network, get_WLAN_BSSID_EX_sz(&pnetwork->network)); + + auth=&psecuritypriv->authenticator_ie[0]; + psecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength; + + if((psecnetwork->IELength-12) < (256-1)) { + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12); + } else { + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1)); + } + + psecnetwork->IELength = 0; + // Added by Albert 2009/02/18 + // If the the driver wants to use the bssid to create the connection. + // If not, we have to copy the connecting AP's MAC address to it so that + // the driver just has the bssid information for PMKIDList searching. + + if ( pmlmepriv->assoc_by_bssid == _FALSE ) + { + _rtw_memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN ); + } + + psecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength); + + + pqospriv->qos_option = 0; + + if(pregistrypriv->wmm_enable) + { + u32 tmp_len; + + tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength); + + if (psecnetwork->IELength != tmp_len) + { + psecnetwork->IELength = tmp_len; + pqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon + } + else + { + pqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon + } + } + +#ifdef CONFIG_80211N_HT + phtpriv->ht_option = _FALSE; + if(pregistrypriv->ht_enable) + { + // Added by Albert 2010/06/23 + // For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. + // Especially for Realtek 8192u SoftAP. + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_ ) && + ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_ ) && + ( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ )) + { + //rtw_restructure_ht_ie + rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], + pnetwork->network.IELength, &psecnetwork->IELength); + } + } + +#endif + + psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength; + + if(psecnetwork->IELength < (256-1)) + { + _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength); + } + else + { + _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1)); + } + + pcmd->cmdsz = get_WLAN_BSSID_EX_sz(psecnetwork);//get cmdsz before endian conversion + +#ifdef CONFIG_RTL8712 + //wlan_network endian conversion + psecnetwork->Length = cpu_to_le32(psecnetwork->Length); + psecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength); + psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy); + psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi); + psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse); + psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow); + psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod); + psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig); + psecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime); + psecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern); + psecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet); + psecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length); + psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length); + psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode); + psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength); +#endif + + _rtw_init_listhead(&pcmd->list); + pcmd->cmdcode = _JoinBss_CMD_;//GEN_CMD_CODE(_JoinBss) + pcmd->parmbuf = (unsigned char *)psecnetwork; + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_disassoc_cmd(_adapter*padapter) // for sta_mode +{ + struct cmd_obj* pdisconnect_cmd; + struct disconnect_parm* pdisconnect; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + u8 res=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_disassoc_cmd\n")); + + //if ((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) { + + pdisconnect_cmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pdisconnect_cmd == NULL){ + res=_FAIL; + goto exit; + } + + pdisconnect = (struct disconnect_parm*)rtw_zmalloc(sizeof(struct disconnect_parm)); + if(pdisconnect == NULL) { + rtw_mfree((u8 *)pdisconnect_cmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(pdisconnect_cmd, pdisconnect, _DisConnect_CMD_); + res = rtw_enqueue_cmd(pcmdpriv, pdisconnect_cmd); + //} + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) +{ + struct cmd_obj* ph2c; + struct setopmode_parm* psetop; + + struct cmd_priv *pcmdpriv= &padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FALSE; + goto exit; + } + psetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm)); + + if(psetop==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FALSE; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_); + psetop->mode = (u8)networktype; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key) +{ + struct cmd_obj* ph2c; + struct set_stakey_parm *psetstakey_para; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct set_stakey_rsp *psetstakey_rsp = NULL; + + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct sta_info* sta = (struct sta_info* )psta; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if ( ph2c == NULL){ + res= _FAIL; + goto exit; + } + + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); + if(psetstakey_para==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FAIL; + goto exit; + } + + psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); + if(psetstakey_rsp == NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); + res=_FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); + ph2c->rsp = (u8 *) psetstakey_rsp; + ph2c->rspsz = sizeof(struct set_stakey_rsp); + + _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN); + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){ +#ifdef CONFIG_TDLS + if((sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) + psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy; + else +#endif + psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm; + }else{ + GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE); + } + + if (unicast_key == _TRUE) { +#ifdef CONFIG_TDLS + if((sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) + _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16); + else +#endif + _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); + } else { + _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); + } + + //jeff: set this becasue at least sw key is ready + padapter->securitypriv.busetkipkey=_TRUE; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table) +{ + struct cmd_obj* ph2c; + struct setratable_parm * psetrttblparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + psetrttblparm = (struct setratable_parm*)rtw_zmalloc(sizeof(struct setratable_parm)); + + if(psetrttblparm==NULL){ + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); + + _rtw_memcpy(psetrttblparm,prate_table,sizeof(struct setratable_parm)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; + +} + +u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval) +{ + struct cmd_obj* ph2c; + struct getratable_parm * pgetrttblparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + pgetrttblparm = (struct getratable_parm*)rtw_zmalloc(sizeof(struct getratable_parm)); + + if(pgetrttblparm==NULL){ + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + +// init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); + + _rtw_init_listhead(&ph2c->list); + ph2c->cmdcode =GEN_CMD_CODE(_GetRaTable); + ph2c->parmbuf = (unsigned char *)pgetrttblparm; + ph2c->cmdsz = sizeof(struct getratable_parm); + ph2c->rsp = (u8*)pval; + ph2c->rspsz = sizeof(struct getratable_rsp); + + pgetrttblparm ->rsvd = 0x0; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; + +} + +u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr) +{ + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_obj* ph2c; + struct set_assocsta_parm *psetassocsta_para; + struct set_stakey_rsp *psetassocsta_rsp = NULL; + + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + psetassocsta_para = (struct set_assocsta_parm*)rtw_zmalloc(sizeof(struct set_assocsta_parm)); + if(psetassocsta_para==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FAIL; + goto exit; + } + + psetassocsta_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_assocsta_rsp)); + if(psetassocsta_rsp==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *) psetassocsta_para, sizeof(struct set_assocsta_parm)); + return _FAIL; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_); + ph2c->rsp = (u8 *) psetassocsta_rsp; + ph2c->rspsz = sizeof(struct set_assocsta_rsp); + + _rtw_memcpy(psetassocsta_para->addr, mac_addr,ETH_ALEN); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + } + +u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr) +{ + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_obj* ph2c; + struct addBaReq_parm *paddbareq_parm; + + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + paddbareq_parm = (struct addBaReq_parm*)rtw_zmalloc(sizeof(struct addBaReq_parm)); + if(paddbareq_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + paddbareq_parm->tid = tid; + _rtw_memcpy(paddbareq_parm->addr, addr, ETH_ALEN); + + init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq)); + + //DBG_8192C("rtw_addbareq_cmd, tid=%d\n", tid); + + //rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_dynamic_chk_wk_cmd(_adapter*padapter) +{ + struct cmd_obj* ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = DYNAMIC_CHK_WK_CID; + pdrvextra_cmd_parm->type_size = 0; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + + //rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + +} + +u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan) +{ + struct cmd_obj* pcmdobj; + struct SetChannelPlan_param *setChannelPlan_param; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + u8 res=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_chplan_cmd\n")); + + pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmdobj == NULL){ + res=_FAIL; + goto exit; + } + + setChannelPlan_param = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(struct SetChannelPlan_param)); + if(setChannelPlan_param == NULL) { + rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + setChannelPlan_param->channel_plan=chplan; + + init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelPlan_param, GEN_CMD_CODE(_SetChannelPlan)); + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); + +exit: + +_func_exit_; + + return res; +} + +static void traffic_status_watchdog(_adapter *padapter) +{ +#ifdef CONFIG_LPS + u8 bEnterPS; +#endif + u8 bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE; + u8 bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + // + // Determine if our traffic is busy now + // + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) + { + + if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 100 || + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 100 ) + { + bBusyTraffic = _TRUE; + + if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) + bRxBusyTraffic = _TRUE; + else if(pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > pmlmepriv->LinkDetectInfo.NumRxOkInPeriod) + bTxBusyTraffic = _TRUE; + } + + // Higher Tx/Rx data. + if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 || + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000 ) + { + bHigherBusyTraffic = _TRUE; + + // Extremely high Rx data. + if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 5000) + bHigherBusyRxTraffic = _TRUE; + else + bHigherBusyRxTraffic = _FALSE; + } + +#ifdef CONFIG_LPS + // check traffic for powersaving. + if( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) || + (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) ) + { + //DBG_8192C("Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); + bEnterPS= _FALSE; + } + else + { + bEnterPS= _TRUE; + } + + // LeisurePS only work in infra mode. + if(bEnterPS) + { + LPS_Enter(padapter); + } + else + { + LPS_Leave(padapter); + } +#endif + } + else + { +#ifdef CONFIG_LPS + LPS_Leave(padapter); +#endif + } + + pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0; + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0; + pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0; + pmlmepriv->LinkDetectInfo.bBusyTraffic = bBusyTraffic; + pmlmepriv->LinkDetectInfo.bTxBusyTraffic = bTxBusyTraffic; + pmlmepriv->LinkDetectInfo.bRxBusyTraffic = bRxBusyTraffic; + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic; + pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic; +} + +void dynamic_chk_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + //struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + if(padapter->HalFunc.sreset_xmit_status_check) + padapter->HalFunc.sreset_xmit_status_check(padapter); + #endif + + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE) + { + //if(pmlmeext->linked_to > 0) + //{ + // pmlmeext->linked_to--; + // if(pmlmeext->linked_to==0) + linked_status_chk(padapter); + //} + + traffic_status_watchdog(padapter); + } + + padapter->HalFunc.hal_dm_watchdog(padapter); + + //check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + +} + +#ifdef CONFIG_LPS +void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 mstatus; + +_func_enter_; + + if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) + || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) + { + return; + } + + switch(lps_ctrl_type) + { + case LPS_CTRL_SCAN: + //DBG_8192C("LPS_CTRL_SCAN \n"); + LeaveAllPowerSaveMode(padapter); + break; + case LPS_CTRL_JOINBSS: + //DBG_8192C("LPS_CTRL_JOINBSS \n"); + LPS_Leave(padapter); + break; + case LPS_CTRL_CONNECT: + //DBG_8192C("LPS_CTRL_CONNECT \n"); + mstatus = 1; + // Reset LPS Setting + padapter->pwrctrlpriv.LpsIdleCount = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); + break; + case LPS_CTRL_DISCONNECT: + //DBG_8192C("LPS_CTRL_DISCONNECT \n"); + mstatus = 0; + LPS_Leave(padapter); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); + break; + case LPS_CTRL_SPECIAL_PACKET: + //DBG_8192C("LPS_CTRL_SPECIAL_PACKET \n"); + pwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time(); + LPS_Leave(padapter); + break; + + default: + break; + } + +_func_exit_; +} +#endif +u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + u8 res = _SUCCESS; + +_func_enter_; + + //if(!pwrctrlpriv->bLeisurePs) + // return res; + + if(enqueue) + { + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = LPS_CTRL_WK_CID; + pdrvextra_cmd_parm->type_size = lps_ctrl_type; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else + { + lps_ctrl_wk_hdl(padapter, lps_ctrl_type); + } + +exit: + +_func_exit_; + + return res; + +} + + +#ifdef CONFIG_ANTENNA_DIVERSITY + +void antenna_select_wk_hdl(_adapter *padapter, u8 antenna) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); +} + +u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 bSupportAntDiv = _FALSE; + u8 res = _SUCCESS; + +_func_enter_; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); + if(_FALSE == bSupportAntDiv ) return res; + + if(_TRUE == enqueue) + { + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = ANT_SELECT_WK_CID; + pdrvextra_cmd_parm->type_size = antenna; + pdrvextra_cmd_parm->pbuf = NULL; + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else{ + antenna_select_wk_hdl(padapter,antenna ); + } +exit: + +_func_exit_; + + return res; + +} +#endif + +void power_saving_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) +{ + rtw_ps_processor(padapter); +} + +#ifdef CONFIG_P2P +u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + if ( pwdinfo->p2p_state == P2P_STATE_NONE ) + { + return res; + } + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID; + pdrvextra_cmd_parm->type_size = intCmdType; // As the command tppe. + pdrvextra_cmd_parm->pbuf = NULL; // Must be NULL here + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + +} +#endif //CONFIG_P2P + +u8 rtw_ps_cmd(_adapter*padapter) +{ + struct cmd_obj *ppscmd; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + u8 res = _SUCCESS; +_func_enter_; + + ppscmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ppscmd==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ppscmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = POWER_SAVING_CTRL_WK_CID; + pdrvextra_cmd_parm->pbuf = NULL; + DBG_8192C("==> %s , enqueue CMD \n",__FUNCTION__); + init_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ppscmd); + +exit: + +_func_exit_; + + return res; + +} + +#ifdef CONFIG_AP_MODE + +static void rtw_chk_hi_queue_hdl(_adapter *padapter) +{ + int cnt=0; + struct sta_info *psta_bmc; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(!psta_bmc) + return; + + + if(psta_bmc->sleepq_len==0) + { + while((rtw_read32(padapter, 0x414)&0x00ffff00)!=0) + { + rtw_msleep_os(100); + + cnt++; + + if(cnt>10) + break; + } + + if(cnt<=10) + { + pstapriv->tim_bitmap &= ~BIT(0); + + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + } + +} + +u8 rtw_chk_hi_queue_cmd(_adapter*padapter) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = CHECK_HIQ_WK_CID; + pdrvextra_cmd_parm->type_size = 0; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + + return res; + +} +#endif + +u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct drvextra_cmd_parm *pdrvextra_cmd; + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + pdrvextra_cmd = (struct drvextra_cmd_parm*)pbuf; + + switch(pdrvextra_cmd->ec_id) + { + case DYNAMIC_CHK_WK_CID: + dynamic_chk_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + break; + case POWER_SAVING_CTRL_WK_CID: + power_saving_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + break; +#ifdef CONFIG_LPS + case LPS_CTRL_WK_CID: + lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type_size); + break; +#endif +#ifdef CONFIG_ANTENNA_DIVERSITY + case ANT_SELECT_WK_CID: + antenna_select_wk_hdl(padapter, pdrvextra_cmd->type_size); + break; +#endif +#ifdef CONFIG_P2P + case P2P_PS_WK_CID: + p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type_size); + break; + case P2P_PROTO_WK_CID: + // Commented by Albert 2011/07/01 + // I used the type_size as the type command + p2p_protocol_wk_hdl( padapter, pdrvextra_cmd->type_size ); + break; +#endif //CONFIG_P2P +#ifdef CONFIG_AP_MODE + case CHECK_HIQ_WK_CID: + rtw_chk_hi_queue_hdl(padapter); + break; +#endif //CONFIG_AP_MODE + default: + break; + + } + + + if(pdrvextra_cmd->pbuf && pdrvextra_cmd->type_size>0) + { + rtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + } + + + return H2C_SUCCESS; + +} + +void rtw_survey_cmd_callback(_adapter* padapter , struct cmd_obj *pcmd) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + if (pcmd->res != H2C_SUCCESS) { + clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY); + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nrtw_survey_cmd_callback : clr _FW_UNDER_SURVEY ")); + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: MgntActrtw_set_802_11_bssid_LIST_SCAN Fail ************\n\n.")); + } + + // free cmd + rtw_free_cmd_obj(pcmd); + +_func_exit_; +} +void rtw_disassoc_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + if (pcmd->res != H2C_SUCCESS) + { + _enter_critical_bh(&pmlmepriv->lock, &irqL); + set_fwstate(pmlmepriv, _FW_LINKED); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ***Error: disconnect_cmd_callback Fail ***\n.")); + + goto exit; + } + + // free cmd + rtw_free_cmd_obj(pcmd); + +exit: + +_func_exit_; +} + + +void rtw_joinbss_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + if((pcmd->res != H2C_SUCCESS)) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("********Error:rtw_select_and_join_from_scanned_queue Wait Sema Fail ************\n")); + _set_timer(&pmlmepriv->assoc_timer, 1); + } + + rtw_free_cmd_obj(pcmd); + +_func_exit_; +} + +void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd) +{ + _irqL irqL; + u8 timer_cancelled; + struct sta_info *psta = NULL; + struct wlan_network *pwlan = NULL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)pcmd->parmbuf; + struct wlan_network *tgt_network = &(pmlmepriv->cur_network); + +_func_enter_; + + if((pcmd->res != H2C_SUCCESS)) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: rtw_createbss_cmd_callback Fail ************\n\n.")); + _set_timer(&pmlmepriv->assoc_timer, 1 ); + } + + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); + + //endian_convert + pnetwork->Length = le32_to_cpu(pnetwork->Length); + pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); + pnetwork->Privacy =le32_to_cpu(pnetwork->Privacy); + pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); + pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); + pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); + //pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); + pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); + pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); + pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); + pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); + pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); + pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); + pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); + pnetwork->IELength = le32_to_cpu(pnetwork->IELength); + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) ) + { + psta = rtw_get_stainfo(&padapter->stapriv, pnetwork->MacAddress); + if(!psta) + { + psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); + if (psta == NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n")); + goto createbss_cmd_fail ; + } + } + + rtw_indicate_connect( padapter); + } + else + { + pwlan = _rtw_alloc_network(pmlmepriv); + + if ( pwlan == NULL) + { + pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue); + if( pwlan == NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n Error: can't get pwlan in rtw_joinbss_event_callback \n")); + goto createbss_cmd_fail; + } + pwlan->last_scanned = rtw_get_current_time(); + } + else + { + rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); + } + + pnetwork->Length = get_WLAN_BSSID_EX_sz(pnetwork); + _rtw_memcpy(&(pwlan->network), pnetwork, pnetwork->Length); + //pwlan->fixed = _TRUE; + + //rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); + + // copy pdev_network information to pmlmepriv->cur_network + _rtw_memcpy(&tgt_network->network, pnetwork, (get_WLAN_BSSID_EX_sz(pnetwork))); + + // reset DSConfig + //tgt_network->network.Configuration.DSConfig = (u32)rtw_ch2freq(pnetwork->Configuration.DSConfig); + + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + +#if 0 + if((pmlmepriv->fw_state) & WIFI_AP_STATE) + { + psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); + + if (psta == NULL) { // for AP Mode & Adhoc Master Mode + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n")); + goto createbss_cmd_fail ; + } + + rtw_indicate_connect( padapter); + } + else { + + //rtw_indicate_disconnect(dev); + } +#endif + + // we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback) + + } + +createbss_cmd_fail: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + rtw_free_cmd_obj(pcmd); + +_func_exit_; + +} + + + +void rtw_setstaKey_cmdrsp_callback(_adapter* padapter , struct cmd_obj *pcmd) +{ + + struct sta_priv * pstapriv = &padapter->stapriv; + struct set_stakey_rsp* psetstakey_rsp = (struct set_stakey_rsp*) (pcmd->rsp); + struct sta_info* psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr); + +_func_enter_; + + if(psta==NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: rtw_setstaKey_cmdrsp_callback => can't get sta_info \n\n")); + goto exit; + } + + //psta->aid = psta->mac_id = psetstakey_rsp->keyid; //CAM_ID(CAM_ENTRY) + +exit: + + rtw_free_cmd_obj(pcmd); + +_func_exit_; + +} +void rtw_setassocsta_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _irqL irqL; + struct sta_priv * pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct set_assocsta_parm* passocsta_parm = (struct set_assocsta_parm*)(pcmd->parmbuf); + struct set_assocsta_rsp* passocsta_rsp = (struct set_assocsta_rsp*) (pcmd->rsp); + struct sta_info* psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr); + +_func_enter_; + + if(psta==NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: setassocsta_cmdrsp_callbac => can't get sta_info \n\n")); + goto exit; + } + + psta->aid = psta->mac_id = passocsta_rsp->cam_id; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)) + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + + set_fwstate(pmlmepriv, _FW_LINKED); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + rtw_free_cmd_obj(pcmd); +exit: +_func_exit_; +} + +void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ +_func_enter_; + + rtw_free_cmd_obj(pcmd); +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.workparam.bcompleted=_TRUE; +#endif + +_func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_debug.c b/drivers/net/wireless/rtl8192c/core/rtw_debug.c new file mode 100755 index 000000000000..79c69670714f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_debug.c @@ -0,0 +1,604 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_DEBUG_C_ + + +#include + +#ifdef CONFIG_DEBUG_RTL871X + + u32 GlobalDebugLevel = _drv_info_; + + u64 GlobalDebugComponents = \ + _module_rtl871x_xmit_c_ | + _module_xmit_osdep_c_ | + _module_rtl871x_recv_c_ | + _module_recv_osdep_c_ | + _module_rtl871x_mlme_c_ | + _module_mlme_osdep_c_ | + _module_rtl871x_sta_mgt_c_ | + _module_rtl871x_cmd_c_ | + _module_cmd_osdep_c_ | + _module_rtl871x_io_c_ | + _module_io_osdep_c_ | + _module_os_intfs_c_| + _module_rtl871x_security_c_| + _module_rtl871x_eeprom_c_| + _module_hal_init_c_| + _module_hci_hal_init_c_| + _module_rtl871x_ioctl_c_| + _module_rtl871x_ioctl_set_c_| + _module_rtl871x_ioctl_query_c_| + _module_rtl871x_pwrctrl_c_| + _module_hci_intfs_c_| + _module_hci_ops_c_| + _module_hci_ops_os_c_| + _module_rtl871x_ioctl_os_c| + _module_rtl8712_cmd_c_| + _module_rtl8192c_xmit_c_| + _module_rtl8712_recv_c_ | + _module_mp_ | + _module_efuse_; + +#endif + +#ifdef CONFIG_PROC_DEBUG +#include + +int proc_get_drv_version(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + + int len = 0; + + len += snprintf(page + len, count - len, "%s\n", DRIVERVERSION); + + *eof = 1; + return len; +} + +int proc_get_write_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + *eof = 1; + return 0; +} + +int proc_set_write_reg(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + u32 addr, val, len; + + if (count < 3) + { + DBG_8192C("argument size is less than 3\n"); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%x %x %x", &addr, &val, &len); + + if (num != 3) { + DBG_8192C("invalid write_reg parameter!\n"); + return count; + } + + switch(len) + { + case 1: + rtw_write8(padapter, addr, (u8)val); + break; + case 2: + rtw_write16(padapter, addr, (u16)val); + break; + case 4: + rtw_write32(padapter, addr, val); + break; + default: + DBG_8192C("error write length=%d", len); + break; + } + + } + + return count; + +} + +static u32 proc_get_read_addr=0xeeeeeeee; +static u32 proc_get_read_len=0x4; + +int proc_get_read_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + + int len = 0; + + if(proc_get_read_addr==0xeeeeeeee) + { + *eof = 1; + return len; + } + + switch(proc_get_read_len) + { + case 1: + len += snprintf(page + len, count - len, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr)); + break; + case 2: + len += snprintf(page + len, count - len, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr)); + break; + case 4: + len += snprintf(page + len, count - len, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr)); + break; + default: + len += snprintf(page + len, count - len, "error read length=%d\n", proc_get_read_len); + break; + } + + *eof = 1; + return len; + +} + +int proc_set_read_reg(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[16]; + u32 addr, len; + + if (count < 2) + { + DBG_8192C("argument size is less than 2\n"); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%x %x", &addr, &len); + + if (num != 2) { + DBG_8192C("invalid read_reg parameter!\n"); + return count; + } + + proc_get_read_addr = addr; + + proc_get_read_len = len; + } + + return count; + +} + +int proc_get_fwstate(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, "fwstate=0x%x\n", get_fwstate(pmlmepriv)); + + *eof = 1; + return len; +} + +int proc_get_sec_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + int len = 0; + + len += snprintf(page + len, count - len, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", + psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, + psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus); + + *eof = 1; + return len; +} + +int proc_get_mlmext_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + int len = 0; + + len += snprintf(page + len, count - len, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state); + + *eof = 1; + return len; +} + +int proc_get_qos_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, "qos_option=%d\n", pmlmepriv->qospriv.qos_option); + + *eof = 1; + return len; + +} + +int proc_get_ht_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, "ht_option=%d\n", pmlmepriv->htpriv.ht_option); + + *eof = 1; + return len; +} + +int proc_get_rf_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + int len = 0; + + len += snprintf(page + len, count - len, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n", + pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); + + + *eof = 1; + return len; + +} + +int proc_get_ap_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct sta_info *psta; + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct sta_priv *pstapriv = &padapter->stapriv; + int len = 0; + + psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); + if(psta) + { + int i; + struct recv_reorder_ctrl *preorder_ctrl; + + len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); + len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); + len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); + len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); + len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); + len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); + len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); + + for(i=0;i<16;i++) + { + preorder_ctrl = &psta->recvreorder_ctrl[i]; + if(preorder_ctrl->enable) + { + len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq); + } + } + + } + else + { + len += snprintf(page + len, count - len, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress)); + } + + *eof = 1; + return len; + +} + +int proc_get_adapter_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + int len = 0; + + len += snprintf(page + len, count - len, "bSurpriseRemoved=%d, bDriverStopped=%d\n", + padapter->bSurpriseRemoved, padapter->bDriverStopped); + + *eof = 1; + return len; + +} + +int proc_get_trx_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct recv_priv *precvpriv = &padapter->recvpriv; + int len = 0; + + len += snprintf(page + len, count - len, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n", + pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt); +#ifdef CONFIG_USB_HCI + len += snprintf(page + len, count - len, "rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt); +#endif + + *eof = 1; + return len; + +} + + +int proc_get_rx_signal(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, + "rssi:%d\n" + "rxpwdb:%d\n" + "signal_strength:%u\n" + "signal_qual:%u\n" + "noise:%u\n", + padapter->recvpriv.rssi, + padapter->recvpriv.rxpwdb, + padapter->recvpriv.signal_strength, + padapter->recvpriv.signal_qual, + padapter->recvpriv.noise + ); + + *eof = 1; + return len; +} + +int proc_set_rx_signal(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + u32 is_signal_dbg, signal_strength; + + if (count < 1) + return -EFAULT; + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength); + + is_signal_dbg = is_signal_dbg==0?0:1; + + if(is_signal_dbg && num!=2) + return count; + + signal_strength = signal_strength>100?100:signal_strength; + signal_strength = signal_strength<0?0:signal_strength; + + padapter->recvpriv.is_signal_dbg = is_signal_dbg; + padapter->recvpriv.signal_strength_dbg=signal_strength; + + if(is_signal_dbg) + DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength); + else + DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH"); + + } + + return count; + +} + + +#ifdef CONFIG_AP_MODE + +int proc_get_all_sta_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + _irqL irqL; + struct sta_info *psta; + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct sta_priv *pstapriv = &padapter->stapriv; + int i, j; + _list *plist, *phead; + struct recv_reorder_ctrl *preorder_ctrl; + int len = 0; + + + len += snprintf(page + len, count - len, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + for(i=0; i< NUM_STA; i++) + { + phead = &(pstapriv->sta_hash[i]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + + plist = get_next(plist); + + //if(extra_arg == psta->aid) + { + len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); + len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); + len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); + len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); + len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); + len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); + len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); + len += snprintf(page + len, count - len, "sleepq_len=%d\n", psta->sleepq_len); + + for(j=0;j<16;j++) + { + preorder_ctrl = &psta->recvreorder_ctrl[j]; + if(preorder_ctrl->enable) + { + len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq); + } + } + + } + + } + + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + *eof = 1; + return len; + +} + +#endif + +#ifdef MEMORY_LEAK_DEBUG +#include +extern atomic_t _malloc_cnt;; +extern atomic_t _malloc_size;; + +int proc_get_malloc_cnt(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + + int len = 0; + + len += snprintf(page + len, count - len, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt)); + len += snprintf(page + len, count - len, "_malloc_size=%d\n", atomic_read(&_malloc_size)); + + *eof = 1; + return len; +} +#endif /* MEMORY_LEAK_DEBUG */ + +#ifdef CONFIG_FIND_BEST_CHANNEL +int proc_get_best_channel(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + int len = 0; + u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0; + + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + if ( pmlmeext->channel_set[i].ChannelNum == 1) + index_24G = i; + if ( pmlmeext->channel_set[i].ChannelNum == 36) + index_5G = i; + } + + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + // 2.4G + if ( pmlmeext->channel_set[i].ChannelNum == 6 ) { + if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) { + index_24G = i; + best_channel_24G = pmlmeext->channel_set[i].ChannelNum; + } + } + + // 5G + if ( pmlmeext->channel_set[i].ChannelNum >= 36 + && pmlmeext->channel_set[i].ChannelNum < 140 ) { + // Find primary channel + if ( (( pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0) + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) { + index_5G = i; + best_channel_5G = pmlmeext->channel_set[i].ChannelNum; + } + } + + if ( pmlmeext->channel_set[i].ChannelNum >= 149 + && pmlmeext->channel_set[i].ChannelNum < 165) { + // find primary channel + if ( (( pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0) + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) { + index_5G = i; + best_channel_5G = pmlmeext->channel_set[i].ChannelNum; + } + } +#if 0 // debug + len += snprintf(page + len, count - len, "The rx cnt of channel %3d = %d\n", + pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count); +#endif + } + + len += snprintf(page + len, count - len, "best_channel_5G = %d\n", best_channel_5G); + len += snprintf(page + len, count - len, "best_channel_24G = %d\n", best_channel_24G); + + *eof = 1; + return len; + +} +#endif /* CONFIG_FIND_BEST_CHANNEL */ + +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c b/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c new file mode 100755 index 000000000000..4a0832bcb8c9 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c @@ -0,0 +1,424 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_EEPROM_C_ + +#include +#include +#include + +void up_clk(_adapter* padapter, u16 *x) +{ +_func_enter_; + *x = *x | _EESK; + rtw_write8(padapter, EE_9346CR, (u8)*x); + rtw_udelay_os(CLOCK_RATE); + +_func_exit_; + +} + +void down_clk(_adapter * padapter, u16 *x ) +{ +_func_enter_; + *x = *x & ~_EESK; + rtw_write8(padapter, EE_9346CR, (u8)*x); + rtw_udelay_os(CLOCK_RATE); +_func_exit_; +} + +void shift_out_bits(_adapter * padapter, u16 data, u16 count) +{ + u16 x,mask; +_func_enter_; + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + mask = 0x01 << (count - 1); + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EEDO | _EEDI); + + do + { + x &= ~_EEDI; + if(data & mask) + x |= _EEDI; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + rtw_write8(padapter, EE_9346CR, (u8)x); + rtw_udelay_os(CLOCK_RATE); + up_clk(padapter, &x); + down_clk(padapter, &x); + mask = mask >> 1; + } while(mask); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x &= ~_EEDI; + rtw_write8(padapter, EE_9346CR, (u8)x); +out: +_func_exit_; +} + +u16 shift_in_bits (_adapter * padapter) +{ + u16 x,d=0,i; +_func_enter_; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x = rtw_read8(padapter, EE_9346CR); + + x &= ~( _EEDO | _EEDI); + d = 0; + + for(i=0; i<16; i++) + { + d = d << 1; + up_clk(padapter, &x); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EEDI); + if(x & _EEDO) + d |= 1; + + down_clk(padapter, &x); + } +out: +_func_exit_; + + return d; +} + +void standby(_adapter * padapter ) +{ + u8 x; +_func_enter_; + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EECS | _EESK); + rtw_write8(padapter, EE_9346CR,x); + + rtw_udelay_os(CLOCK_RATE); + x |= _EECS; + rtw_write8(padapter, EE_9346CR, x); + rtw_udelay_os(CLOCK_RATE); +_func_exit_; +} + +u16 wait_eeprom_cmd_done(_adapter* padapter) +{ + u8 x; + u16 i,res=_FALSE; +_func_enter_; + standby(padapter ); + for (i=0; i<200; i++) + { + x = rtw_read8(padapter, EE_9346CR); + if (x & _EEDO){ + res=_TRUE; + goto exit; + } + rtw_udelay_os(CLOCK_RATE); + } +exit: +_func_exit_; + return res; +} + +void eeprom_clean(_adapter * padapter) +{ + u16 x; +_func_enter_; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x = rtw_read8(padapter, EE_9346CR); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x &= ~(_EECS | _EEDI); + rtw_write8(padapter, EE_9346CR, (u8)x); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + up_clk(padapter, &x); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + down_clk(padapter, &x); +out: +_func_exit_; +} + +void eeprom_write16(_adapter * padapter, u16 reg, u16 data) +{ + u8 x; +#ifdef CONFIG_RTL8712 + u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; + tmp8_ori=rtw_read8(padapter, 0x102502f1); + tmp8_new=tmp8_ori & 0xf7; + if(tmp8_ori != tmp8_new){ + rtw_write8(padapter, 0x102502f1, tmp8_new); + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); + } + tmp8_clk_ori=rtw_read8(padapter,0x10250003); + tmp8_clk_new=tmp8_clk_ori|0x20; + if(tmp8_clk_new!=tmp8_clk_ori){ + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); + rtw_write8(padapter, 0x10250003, tmp8_clk_new); + } +#endif +_func_enter_; + + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EEDI | _EEDO | _EESK | _EEM0); + x |= _EEM1 | _EECS; + rtw_write8(padapter, EE_9346CR, x); + + shift_out_bits(padapter, EEPROM_EWEN_OPCODE, 5); + + if(padapter->EepromAddressSize==8) //CF+ and SDIO + shift_out_bits(padapter, 0, 6); + else //USB + shift_out_bits(padapter, 0, 4); + + standby( padapter); + +// Commented out by rcnjko, 2004.0 +// // Erase this particular word. Write the erase opcode and register +// // number in that order. The opcode is 3bits in length; reg is 6 bits long. +// shift_out_bits(Adapter, EEPROM_ERASE_OPCODE, 3); +// shift_out_bits(Adapter, reg, Adapter->EepromAddressSize); +// +// if (wait_eeprom_cmd_done(Adapter ) == FALSE) +// { +// return; +// } + + + standby(padapter ); + + // write the new word to the EEPROM + + // send the write opcode the EEPORM + shift_out_bits(padapter, EEPROM_WRITE_OPCODE, 3); + + // select which word in the EEPROM that we are writing to. + shift_out_bits(padapter, reg, padapter->EepromAddressSize); + + // write the data to the selected EEPROM word. + shift_out_bits(padapter, data, 16); + + if (wait_eeprom_cmd_done(padapter ) == _FALSE) + { + + goto exit; + } + + standby(padapter ); + + shift_out_bits(padapter, EEPROM_EWDS_OPCODE, 5); + shift_out_bits(padapter, reg, 4); + + eeprom_clean(padapter ); +exit: +#ifdef CONFIG_RTL8712 + if(tmp8_clk_new!=tmp8_clk_ori) + rtw_write8(padapter, 0x10250003, tmp8_clk_ori); + if(tmp8_new!=tmp8_ori) + rtw_write8(padapter, 0x102502f1, tmp8_ori); + +#endif +_func_exit_; + return; +} + +u16 eeprom_read16(_adapter * padapter, u16 reg) //ReadEEprom +{ + + u16 x; + u16 data=0; +#ifdef CONFIG_RTL8712 + u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; + tmp8_ori= rtw_read8(padapter, 0x102502f1); + tmp8_new = tmp8_ori & 0xf7; + if(tmp8_ori != tmp8_new){ + rtw_write8(padapter, 0x102502f1, tmp8_new); + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); + } + tmp8_clk_ori=rtw_read8(padapter,0x10250003); + tmp8_clk_new=tmp8_clk_ori|0x20; + if(tmp8_clk_new!=tmp8_clk_ori){ + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); + rtw_write8(padapter, 0x10250003, tmp8_clk_new); + } +#endif +_func_enter_; + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + // select EEPROM, reset bits, set _EECS + x = rtw_read8(padapter, EE_9346CR); + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + + x &= ~(_EEDI | _EEDO | _EESK | _EEM0); + x |= _EEM1 | _EECS; + rtw_write8(padapter, EE_9346CR, (unsigned char)x); + + // write the read opcode and register number in that order + // The opcode is 3bits in length, reg is 6 bits long + shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); + shift_out_bits(padapter, reg, padapter->EepromAddressSize); + + // Now read the data (16 bits) in from the selected EEPROM word + data = shift_in_bits(padapter); + + eeprom_clean(padapter); +out: +#ifdef CONFIG_RTL8712 + if(tmp8_clk_new!=tmp8_clk_ori) + rtw_write8(padapter, 0x10250003, tmp8_clk_ori); + if(tmp8_new!=tmp8_ori) + rtw_write8(padapter, 0x102502f1, tmp8_ori); + +#endif +_func_exit_; + return data; + + +} + + + + +//From even offset +void eeprom_read_sz(_adapter * padapter, u16 reg, u8* data, u32 sz) +{ + + u16 x, data16; + u32 i; +_func_enter_; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + // select EEPROM, reset bits, set _EECS + x = rtw_read8(padapter, EE_9346CR); + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + + x &= ~(_EEDI | _EEDO | _EESK | _EEM0); + x |= _EEM1 | _EECS; + rtw_write8(padapter, EE_9346CR, (unsigned char)x); + + // write the read opcode and register number in that order + // The opcode is 3bits in length, reg is 6 bits long + shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); + shift_out_bits(padapter, reg, padapter->EepromAddressSize); + + + for(i=0; i>8; + } + + eeprom_clean(padapter); +out: +_func_exit_; + + + +} + + +//addr_off : address offset of the entry in eeprom (not the tuple number of eeprom (reg); that is addr_off !=reg) +u8 eeprom_read(_adapter * padapter, u32 addr_off, u8 sz, u8* rbuf) +{ + u8 quotient, remainder, addr_2align_odd; + u16 reg, stmp , i=0, idx = 0; +_func_enter_; + reg = (u16)(addr_off >> 1); + addr_2align_odd = (u8)(addr_off & 0x1); + + if(addr_2align_odd) //read that start at high part: e.g 1,3,5,7,9,... + { + stmp = eeprom_read16(padapter, reg); + rbuf[idx++] = (u8) ((stmp>>8)&0xff); //return hogh-part of the short + reg++; sz--; + } + + quotient = sz >> 1; + remainder = sz & 0x1; + + for( i=0 ; i < quotient; i++) + { + stmp = eeprom_read16(padapter, reg+i); + rbuf[idx++] = (u8) (stmp&0xff); + rbuf[idx++] = (u8) ((stmp>>8)&0xff); + } + + reg = reg+i; + if(remainder){ //end of read at lower part of short : 0,2,4,6,... + stmp = eeprom_read16(padapter, reg); + rbuf[idx] = (u8)(stmp & 0xff); + } +_func_exit_; + return _TRUE; +} + + + +VOID read_eeprom_content(_adapter * padapter) +{ + +_func_enter_; + + +_func_exit_; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c b/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c new file mode 100755 index 000000000000..82259790ae9f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c @@ -0,0 +1,1202 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _IEEE80211_C + +#include +#include +#include +#include +#include + + +//----------------------------------------------------------- +// for adhoc-master to generate ie and provide supported-rate to fw +//----------------------------------------------------------- + +static u8 WIFI_CCKRATES[] = +{(IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK)}; + +static u8 WIFI_OFDMRATES[] = +{(IEEE80211_OFDM_RATE_6MB), + (IEEE80211_OFDM_RATE_9MB), + (IEEE80211_OFDM_RATE_12MB), + (IEEE80211_OFDM_RATE_18MB), + (IEEE80211_OFDM_RATE_24MB), + IEEE80211_OFDM_RATE_36MB, + IEEE80211_OFDM_RATE_48MB, + IEEE80211_OFDM_RATE_54MB}; + + +int rtw_get_bit_value_from_ieee_value(u8 val) +{ + unsigned char dot11_rate_table[]={2,4,11,22,12,18,24,36,48,72,96,108,0}; // last element must be zero!! + + int i=0; + while(dot11_rate_table[i] != 0) { + if (dot11_rate_table[i] == val) + return BIT(i); + i++; + } + return 0; +} + +uint rtw_is_cckrates_included(u8 *rate) +{ + u32 i = 0; + + while(rate[i]!=0) + { + if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) + return _TRUE; + i++; + } + + return _FALSE; +} + +uint rtw_is_cckratesonly_included(u8 *rate) +{ + u32 i = 0; + + + while(rate[i]!=0) + { + if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) + + return _FALSE; + + i++; + } + + return _TRUE; + +} + +int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) +{ + if (channel > 14) + { + if ((rtw_is_cckrates_included(rate)) == _TRUE) + return WIRELESS_INVALID; + else + return WIRELESS_11A; + } + else // could be pure B, pure G, or B/G + { + if ((rtw_is_cckratesonly_included(rate)) == _TRUE) + return WIRELESS_11B; + else if((rtw_is_cckrates_included(rate)) == _TRUE) + return WIRELESS_11BG; + else + return WIRELESS_11G; + } + +} + +u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, + unsigned int *frlen) +{ + _rtw_memcpy((void *)pbuf, (void *)source, len); + *frlen = *frlen + len; + return (pbuf + len); +} + +// rtw_set_ie will update frame length +u8 *rtw_set_ie +( + u8 *pbuf, + sint index, + uint len, + u8 *source, + uint *frlen //frame length +) +{ +_func_enter_; + *pbuf = (u8)index; + + *(pbuf + 1) = (u8)len; + + if (len > 0) + _rtw_memcpy((void *)(pbuf + 2), (void *)source, len); + + *frlen = *frlen + (len + 2); + + return (pbuf + len + 2); +_func_exit_; +} + + + +/*---------------------------------------------------------------------------- +index: the information element id index, limit is the limit for search +-----------------------------------------------------------------------------*/ +u8 *rtw_get_ie(u8 *pbuf, sint index, sint *len, sint limit) +{ + sint tmp,i; + u8 *p; +_func_enter_; + if (limit < 1){ + _func_exit_; + return NULL; + } + + p = pbuf; + i = 0; + *len = 0; + while(1) + { + if (*p == index) + { + *len = *(p + 1); + return (p); + } + else + { + tmp = *(p + 1); + p += (tmp + 2); + i += (tmp + 2); + } + if (i >= limit) + break; + } +_func_exit_; + return NULL; +} + +void rtw_set_supported_rate(u8* SupportedRates, uint mode) +{ +_func_enter_; + + _rtw_memset(SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); + + switch (mode) + { + case WIRELESS_11B: + _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); + break; + + case WIRELESS_11G: + case WIRELESS_11A: + case WIRELESS_11_5N: + case WIRELESS_11A_5N://Todo: no basic rate for ofdm ? + _rtw_memcpy(SupportedRates, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); + break; + + case WIRELESS_11BG: + case WIRELESS_11G_24N: + case WIRELESS_11_24N: + case WIRELESS_11BG_24N: + _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); + _rtw_memcpy(SupportedRates + IEEE80211_CCK_RATE_LEN, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); + break; + + } +_func_exit_; +} + +uint rtw_get_rateset_len(u8 *rateset) +{ + uint i = 0; +_func_enter_; + while(1) + { + if ((rateset[i]) == 0) + break; + + if (i > 12) + break; + + i++; + } +_func_exit_; + return i; +} + +int rtw_generate_ie(struct registry_priv *pregistrypriv) +{ + u8 wireless_mode; + int sz = 0, rateLen; + WLAN_BSSID_EX* pdev_network = &pregistrypriv->dev_network; + u8* ie = pdev_network->IEs; + +_func_enter_; + + //timestamp will be inserted by hardware + sz += 8; + ie += sz; + + //beacon interval : 2bytes + *(u16*)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);//BCN_INTERVAL; + sz += 2; + ie += 2; + + //capability info + *(u16*)ie = 0; + + *(u16*)ie |= cpu_to_le16(cap_IBSS); + + if(pregistrypriv->preamble == PREAMBLE_SHORT) + *(u16*)ie |= cpu_to_le16(cap_ShortPremble); + + if (pdev_network->Privacy) + *(u16*)ie |= cpu_to_le16(cap_Privacy); + + sz += 2; + ie += 2; + + //SSID + ie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz); + + //supported rates + if(pregistrypriv->wireless_mode == WIRELESS_11ABGN) + { + if(pdev_network->Configuration.DSConfig > 14) + wireless_mode = WIRELESS_11A_5N; + else + wireless_mode = WIRELESS_11BG_24N; + } + else + { + wireless_mode = pregistrypriv->wireless_mode; + } + + rtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode) ; + + rateLen = rtw_get_rateset_len(pdev_network->SupportedRates); + + if (rateLen > 8) + { + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, pdev_network->SupportedRates, &sz); + //ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); + } + else + { + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, pdev_network->SupportedRates, &sz); + } + + //DS parameter set + ie = rtw_set_ie(ie, _DSSET_IE_, 1, (u8 *)&(pdev_network->Configuration.DSConfig), &sz); + + + //IBSS Parameter Set + + ie = rtw_set_ie(ie, _IBSS_PARA_IE_, 2, (u8 *)&(pdev_network->Configuration.ATIMWindow), &sz); + + if (rateLen > 8) + { + ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); + } + + + //HT Cap. + if(((pregistrypriv->wireless_mode&WIRELESS_11_5N)||(pregistrypriv->wireless_mode&WIRELESS_11_24N)) + && (pregistrypriv->ht_enable==_TRUE)) + { + //todo: + } + + //pdev_network->IELength = sz; //update IELength + +_func_exit_; + + //return _SUCCESS; + + return sz; + +} + +unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) +{ + int len; + u16 val16; + unsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01}; + u8 *pbuf = pie; + + while(1) + { + pbuf = rtw_get_ie(pbuf, _WPA_IE_ID_, &len, limit); + + if (pbuf) { + + //check if oui matches... + if (_rtw_memcmp((pbuf + 2), wpa_oui_type, sizeof (wpa_oui_type)) == _FALSE) { + + goto check_next_ie; + } + + //check version... + _rtw_memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16)); + + val16 = le16_to_cpu(val16); + if (val16 != 0x0001) + goto check_next_ie; + + *wpa_ie_len = *(pbuf + 1); + + return pbuf; + + } + else { + + *wpa_ie_len = 0; + return NULL; + } + +check_next_ie: + + limit = limit - (pbuf - pie) - 2 - len; + + if (limit <= 0) + break; + + pbuf += (2 + len); + + } + + *wpa_ie_len = 0; + + return NULL; + +} + +unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit) +{ + + return rtw_get_ie(pie, _WPA2_IE_ID_,rsn_ie_len, limit); + +} + +int rtw_get_wpa_cipher_suite(u8 *s) +{ + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_NONE, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_NONE; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP40, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP40; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_TKIP, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_TKIP; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_CCMP, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_CCMP; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP104, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP104; + + return 0; +} + +int rtw_get_wpa2_cipher_suite(u8 *s) +{ + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_NONE, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_NONE; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP40, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP40; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_TKIP, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_TKIP; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_CCMP, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_CCMP; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP104, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP104; + + return 0; +} + + +int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher) +{ + int i, ret=_SUCCESS; + int left, count; + u8 *pos; + + if (wpa_ie_len <= 0) { + /* No WPA IE - fail silently */ + return _FAIL; + } + + + if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) || + (_rtw_memcmp(wpa_ie+2, WPA_OUI_TYPE, WPA_SELECTOR_LEN) != _TRUE) ) + { + return _FAIL; + } + + pos = wpa_ie; + + pos += 8; + left = wpa_ie_len - 8; + + + //group_cipher + if (left >= WPA_SELECTOR_LEN) { + + *group_cipher = rtw_get_wpa_cipher_suite(pos); + + pos += WPA_SELECTOR_LEN; + left -= WPA_SELECTOR_LEN; + + } + else if (left > 0) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); + + return _FAIL; + } + + + //pairwise_cipher + if (left >= 2) + { + //count = le16_to_cpu(*(u16*)pos); + count = RTW_GET_LE16(pos); + pos += 2; + left -= 2; + + if (count == 0 || left < count * WPA_SELECTOR_LEN) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " + "count %u left %u", __FUNCTION__, count, left)); + return _FAIL; + } + + for (i = 0; i < count; i++) + { + *pairwise_cipher |= rtw_get_wpa_cipher_suite(pos); + + pos += WPA_SELECTOR_LEN; + left -= WPA_SELECTOR_LEN; + } + + } + else if (left == 1) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); + return _FAIL; + } + + + return ret; + +} + +int rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher) +{ + int i, ret=_SUCCESS; + int left, count; + u8 *pos; + + if (rsn_ie_len <= 0) { + /* No RSN IE - fail silently */ + return _FAIL; + } + + + if ((*rsn_ie!= _WPA2_IE_ID_) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2))) + { + return _FAIL; + } + + pos = rsn_ie; + pos += 4; + left = rsn_ie_len - 4; + + //group_cipher + if (left >= RSN_SELECTOR_LEN) { + + *group_cipher = rtw_get_wpa2_cipher_suite(pos); + + pos += RSN_SELECTOR_LEN; + left -= RSN_SELECTOR_LEN; + + } else if (left > 0) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); + return _FAIL; + } + + //pairwise_cipher + if (left >= 2) + { + //count = le16_to_cpu(*(u16*)pos); + count = RTW_GET_LE16(pos); + pos += 2; + left -= 2; + + if (count == 0 || left < count * RSN_SELECTOR_LEN) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " + "count %u left %u", __FUNCTION__, count, left)); + return _FAIL; + } + + for (i = 0; i < count; i++) + { + *pairwise_cipher |= rtw_get_wpa2_cipher_suite(pos); + + pos += RSN_SELECTOR_LEN; + left -= RSN_SELECTOR_LEN; + } + + } + else if (left == 1) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); + + return _FAIL; + } + + + return ret; + +} + +int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len) +{ + u8 authmode, sec_idx, i; + u8 wpa_oui[4]={0x0,0x50,0xf2,0x01}; + uint cnt; + +_func_enter_; + + //Search required WPA or WPA2 IE and copy to sec_ie[ ] + + cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_); + + sec_idx=0; + + while(cnt found WPS_IE.....\n"); + *wps_ielen = ie_ptr[1]+2; + match=_TRUE; + } + return match; +} + +u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) +{ + //int match; + uint cnt; + u8 *wpsie_ptr=NULL; + u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04}; + + cnt=_FIXED_IE_LENGTH_; + //match=_FALSE; + while(cntwpa_ie = pos; + elems->wpa_ie_len = elen; + break; + case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */ + if (elen < 5) { + DBG_871X("short WME " + "information element ignored " + "(len=%lu)\n", + (unsigned long) elen); + return -1; + } + switch (pos[4]) { + case WME_OUI_SUBTYPE_INFORMATION_ELEMENT: + case WME_OUI_SUBTYPE_PARAMETER_ELEMENT: + elems->wme = pos; + elems->wme_len = elen; + break; + case WME_OUI_SUBTYPE_TSPEC_ELEMENT: + elems->wme_tspec = pos; + elems->wme_tspec_len = elen; + break; + default: + DBG_871X("unknown WME " + "information element ignored " + "(subtype=%d len=%lu)\n", + pos[4], (unsigned long) elen); + return -1; + } + break; + case 4: + /* Wi-Fi Protected Setup (WPS) IE */ + elems->wps_ie = pos; + elems->wps_ie_len = elen; + break; + default: + DBG_871X("Unknown Microsoft " + "information element ignored " + "(type=%d len=%lu)\n", + pos[3], (unsigned long) elen); + return -1; + } + break; + + case OUI_BROADCOM: + switch (pos[3]) { + case VENDOR_HT_CAPAB_OUI_TYPE: + elems->vendor_ht_cap = pos; + elems->vendor_ht_cap_len = elen; + break; + default: + DBG_871X("Unknown Broadcom " + "information element ignored " + "(type=%d len=%lu)\n", + pos[3], (unsigned long) elen); + return -1; + } + break; + + default: + DBG_871X("unknown vendor specific information " + "element ignored (vendor OUI %02x:%02x:%02x " + "len=%lu)\n", + pos[0], pos[1], pos[2], (unsigned long) elen); + return -1; + } + + return 0; + +} + +/** + * ieee802_11_parse_elems - Parse information elements in management frames + * @start: Pointer to the start of IEs + * @len: Length of IE buffer in octets + * @elems: Data structure for parsed elements + * @show_errors: Whether to show parsing errors in debug log + * Returns: Parsing result + */ +ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, + struct ieee802_11_elems *elems, + int show_errors) +{ + uint left = len; + u8 *pos = start; + int unknown = 0; + + _rtw_memset(elems, 0, sizeof(*elems)); + + while (left >= 2) { + u8 id, elen; + + id = *pos++; + elen = *pos++; + left -= 2; + + if (elen > left) { + if (show_errors) { + DBG_871X("IEEE 802.11 element " + "parse failed (id=%d elen=%d " + "left=%lu)\n", + id, elen, (unsigned long) left); + } + return ParseFailed; + } + + switch (id) { + case WLAN_EID_SSID: + elems->ssid = pos; + elems->ssid_len = elen; + break; + case WLAN_EID_SUPP_RATES: + elems->supp_rates = pos; + elems->supp_rates_len = elen; + break; + case WLAN_EID_FH_PARAMS: + elems->fh_params = pos; + elems->fh_params_len = elen; + break; + case WLAN_EID_DS_PARAMS: + elems->ds_params = pos; + elems->ds_params_len = elen; + break; + case WLAN_EID_CF_PARAMS: + elems->cf_params = pos; + elems->cf_params_len = elen; + break; + case WLAN_EID_TIM: + elems->tim = pos; + elems->tim_len = elen; + break; + case WLAN_EID_IBSS_PARAMS: + elems->ibss_params = pos; + elems->ibss_params_len = elen; + break; + case WLAN_EID_CHALLENGE: + elems->challenge = pos; + elems->challenge_len = elen; + break; + case WLAN_EID_ERP_INFO: + elems->erp_info = pos; + elems->erp_info_len = elen; + break; + case WLAN_EID_EXT_SUPP_RATES: + elems->ext_supp_rates = pos; + elems->ext_supp_rates_len = elen; + break; + case WLAN_EID_VENDOR_SPECIFIC: + if (rtw_ieee802_11_parse_vendor_specific(pos, elen, + elems, + show_errors)) + unknown++; + break; + case WLAN_EID_RSN: + elems->rsn_ie = pos; + elems->rsn_ie_len = elen; + break; + case WLAN_EID_PWR_CAPABILITY: + elems->power_cap = pos; + elems->power_cap_len = elen; + break; + case WLAN_EID_SUPPORTED_CHANNELS: + elems->supp_channels = pos; + elems->supp_channels_len = elen; + break; + case WLAN_EID_MOBILITY_DOMAIN: + elems->mdie = pos; + elems->mdie_len = elen; + break; + case WLAN_EID_FAST_BSS_TRANSITION: + elems->ftie = pos; + elems->ftie_len = elen; + break; + case WLAN_EID_TIMEOUT_INTERVAL: + elems->timeout_int = pos; + elems->timeout_int_len = elen; + break; + case WLAN_EID_HT_CAP: + elems->ht_capabilities = pos; + elems->ht_capabilities_len = elen; + break; + case WLAN_EID_HT_OPERATION: + elems->ht_operation = pos; + elems->ht_operation_len = elen; + break; + default: + unknown++; + if (!show_errors) + break; + DBG_871X("IEEE 802.11 element parse " + "ignored unknown element (id=%d elen=%d)\n", + id, elen); + break; + } + + left -= elen; + pos += elen; + } + + if (left) + return ParseFailed; + + return unknown ? ParseUnknown : ParseOK; + +} + +u8 key_char2num(u8 ch) +{ + if((ch>='0')&&(ch<='9')) + return ch - '0'; + else if ((ch>='a')&&(ch<='f')) + return ch - 'a' + 10; + else if ((ch>='A')&&(ch<='F')) + return ch - 'A' + 10; + else + return 0xff; +} + +u8 str_2char2num(u8 hch, u8 lch) +{ + return ((key_char2num(hch) * 10 ) + key_char2num(lch)); +} + +u8 key_2char2num(u8 hch, u8 lch) +{ + return ((key_char2num(hch) << 4) | key_char2num(lch)); +} + +extern char* rtw_initmac; +void rtw_macaddr_cfg(u8 *mac_addr) +{ + u8 mac[ETH_ALEN]; + if(mac_addr == NULL) return; + + if ( rtw_initmac ) + { // Users specify the mac address + int jj,kk; + + for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 ) + { + mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]); + } + _rtw_memcpy(mac_addr, mac, ETH_ALEN); + } + else + { // Use the mac address stored in the Efuse + _rtw_memcpy(mac, mac_addr, ETH_ALEN); + } + + if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) && + (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) || + ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) && + (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0))) + { + mac[0] = 0x00; + mac[1] = 0xe0; + mac[2] = 0x4c; + mac[3] = 0x87; + mac[4] = 0x00; + mac[5] = 0x00; + // use default mac addresss + _rtw_memcpy(mac_addr, mac, ETH_ALEN); + DBG_8192C("MAC Address from efuse error, assign default one !!!\n"); + } + + //DBG_8192C("rtw_macaddr_cfg MAC Address = "MAC_FMT"\n", MAC_ARG(mac_addr)); +} + +#ifdef CONFIG_P2P +// Added by Albert 20100910 +// The input buffer in_ie should be pointer to the address of any information element of management frame. +// The p2p_ie buffer will contain "whole" the P2P IE, include the Element ID, Length, P2P OUI and P2P Attributes. +// The p2p_ielen will be the length of p2p_ie buffer. +// The return value will be the offset for the next IE. + +int rtw_get_p2p_ie(u8 *in_ie, uint in_len, u8 *p2p_ie, uint *p2p_ielen) +{ + int match; + uint cnt = 0; + u8 eid, p2p_oui[4]={0x50,0x6F,0x9A,0x09}; + + + match=_FALSE; + while(cnt 1 byte for attribute ID field, 2 bytes for length field + if(attr_content) + _rtw_memcpy( attr_content, &p2p_ie[ cnt + 3 ], attrlen ); + + if(attr_contentlen) + *attr_contentlen = attrlen; + + cnt += attrlen + 3; + + match = _TRUE; + break; + } + else + { + cnt += attrlen + 3; //goto next + } + + } + + return match; + +} + +u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr) +{ + u32 a_len; + + *pbuf = attr_id; + + //*(u16*)(pbuf + 1) = cpu_to_le16(attr_len); + RTW_PUT_LE16(pbuf + 1, attr_len); + + if(pdata_attr) + _rtw_memcpy(pbuf + 3, pdata_attr, attr_len); + + a_len = attr_len + 3; + + return a_len; +} + +// Noted by Albert 20100910 +// 1. WPS uses the TLV format to store the attribute contents. +// T: Type, 2bytes length +// L: Length, 2bytes length +// V: Value, variable length +// 2. WPS uses the big endian to store the WPS attribute contents. + +// attr_content: The output buffer, contains the "value part" of WPS attribute field. +// attr_contentlen: The data length of the "value part" of WPS attribute field. + +int rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *attr_content, uint *attr_contentlen) +{ + int match; + uint cnt = 0; + u8 wps_oui[4]={0x00,0x50,0xF2,0x04}; + u16 attr_id; + + + match=_FALSE; + + if ( ( wps_ie[ 0 ] != _VENDOR_SPECIFIC_IE_ ) || + ( _rtw_memcmp( wps_ie + 2, wps_oui , 4 ) != _TRUE ) ) + { + return( match ); + } + + // 1 ( WPS IE ) + 1 ( Length ) + 4 ( WPS OUI ) + cnt = 6; + while( cnt < wps_ielen ) + { + // 2 -> the length of WPS attribute type field. + //u16 attrlen = be16_to_cpu(*(u16*)(wps_ie + cnt + 2 )); + u16 attrlen = RTW_GET_BE16(wps_ie + cnt + 2); + + //attr_id = be16_to_cpu( *(u16*) ( wps_ie + cnt ) ); + attr_id = RTW_GET_BE16(wps_ie + cnt); + if( attr_id == target_attr_id ) + { + // 3 -> 1 byte for attribute ID field, 2 bytes for length field + _rtw_memcpy( attr_content, &wps_ie[ cnt + 4 ], attrlen ); + + *attr_contentlen = attrlen; + + cnt += attrlen + 4; + + match = _TRUE; + break; + } + else + { + cnt += attrlen + 4; //goto next + } + + } + + return match; + +} + +// Commented by Albert 20110520 +// This function is only used by P2P +int rtw_get_wps_ie_p2p(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) +{ + int match; + uint cnt = 0; + u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04}; + + match=_FALSE; + while(cnt +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#error "Shall be Linux or Windows, but not both!\n" +#endif + +#ifdef CONFIG_SDIO_HCI +#include +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +#ifdef CONFIG_PCI_HCI +#include +#endif + + +u8 rtw_read8(_adapter *adapter, u32 addr) +{ + u8 r_val; + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); + _func_enter_; + _read8 = pintfhdl->io_ops._read8; + + r_val = _read8(pintfhdl, addr); + _func_exit_; + return r_val; +} + +u16 rtw_read16(_adapter *adapter, u32 addr) +{ + u16 r_val; + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); + _func_enter_; + _read16 = pintfhdl->io_ops._read16; + + r_val = _read16(pintfhdl, addr); + _func_exit_; + return r_val; +} + +u32 rtw_read32(_adapter *adapter, u32 addr) +{ + u32 r_val; + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); + _func_enter_; + _read32 = pintfhdl->io_ops._read32; + + r_val = _read32(pintfhdl, addr); + _func_exit_; + return r_val; + +} + +void _rtw_write8(_adapter *adapter, u32 addr, u8 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + _func_enter_; + _write8 = pintfhdl->io_ops._write8; + + _write8(pintfhdl, addr, val); +} +void _rtw_write16(_adapter *adapter, u32 addr, u16 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + _func_enter_; + _write16 = pintfhdl->io_ops._write16; + + _write16(pintfhdl, addr, val); + _func_exit_; + +} +void _rtw_write32(_adapter *adapter, u32 addr, u32 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + _func_enter_; + _write32 = pintfhdl->io_ops._write32; + + _write32(pintfhdl, addr, val); + _func_exit_; + +} + +void rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *pdata) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = (struct intf_hdl*)(&(pio_priv->intf)); + void (*_writeN)(struct intf_hdl *pintfhdl, u32 addr,u32 length, u8 *pdata); + _func_enter_; + _writeN = pintfhdl->io_ops._writeN; + + _writeN(pintfhdl, addr,length,pdata); + _func_exit_; + +} +void rtw_write8_async(_adapter *adapter, u32 addr, u8 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + void (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + _func_enter_; + _write8_async = pintfhdl->io_ops._write8_async; + + _write8_async(pintfhdl, addr, val); + _func_exit_; + +} +void rtw_write16_async(_adapter *adapter, u32 addr, u16 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + void (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + _func_enter_; + _write16_async = pintfhdl->io_ops._write16_async; + + _write16_async(pintfhdl, addr, val); + _func_exit_; + +} +void rtw_write32_async(_adapter *adapter, u32 addr, u32 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + void (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + _func_enter_; + _write32_async = pintfhdl->io_ops._write32_async; + + _write32_async(pintfhdl, addr, val); + _func_exit_; + +} +void rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE)) + { + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_mem:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); + return; + } + + _read_mem = pintfhdl->io_ops._read_mem; + + _read_mem(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _write_mem = pintfhdl->io_ops._write_mem; + + _write_mem(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE)) + { + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_port:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); + return; + } + + _read_port = pintfhdl->io_ops._read_port; + + _read_port(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void read_port_cancel(_adapter *adapter) +{ + void (*_read_port_cancel)(struct intf_hdl *pintfhdl); + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _read_port_cancel = pintfhdl->io_ops._read_port_cancel; + + if(_read_port_cancel) + _read_port_cancel(pintfhdl); + +} + +void rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _write_port = pintfhdl->io_ops._write_port; + + _write_port(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void write_port_cancel(_adapter *adapter) +{ + void (*_write_port_cancel)(struct intf_hdl *pintfhdl); + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _write_port_cancel = pintfhdl->io_ops._write_port_cancel; + + if(_write_port_cancel) + _write_port_cancel(pintfhdl); + +} + + +void rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem){ +#ifdef CONFIG_SDIO_HCI + void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _attrib_read= pintfhdl->io_ops._attrib_read; + + _attrib_read(pintfhdl, addr, cnt, pmem); + + _func_exit_; +#endif +} + +void rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem){ +#ifdef CONFIG_SDIO_HCI + void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _attrib_write= pintfhdl->io_ops._attrib_write; + + _attrib_write(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +#endif +} + +int init_io_priv(_adapter *padapter) +{ + void (*set_intf_ops)(struct _io_ops *pops); + struct io_priv *piopriv = &padapter->iopriv; + struct intf_hdl *pintf = &piopriv->intf; + + piopriv->padapter = padapter; + pintf->padapter = padapter; + pintf->pintf_dev = &padapter->dvobjpriv; + + +#ifdef CONFIG_SDIO_HCI + set_intf_ops = &sdio_set_intf_ops; +#endif //END OF CONFIG_SDIO_HCI + + +#ifdef CONFIG_USB_HCI + + if(padapter->chip_type == RTL8188C_8192C) + { +#ifdef CONFIG_RTL8192C + set_intf_ops = &rtl8192cu_set_intf_ops; +#endif + } + else if(padapter->chip_type == RTL8192D) + { +#ifdef CONFIG_RTL8192D + set_intf_ops = &rtl8192du_set_intf_ops; +#endif + } + else + { + set_intf_ops = NULL; + } +#endif //END OF CONFIG_USB_HCI + +#ifdef CONFIG_PCI_HCI + + if(padapter->chip_type == RTL8188C_8192C) + { +#ifdef CONFIG_RTL8192C + set_intf_ops = &rtl8192ce_set_intf_ops; +#endif + } + else if(padapter->chip_type == RTL8192D) + { +#ifdef CONFIG_RTL8192D + set_intf_ops = &rtl8192de_set_intf_ops; +#endif + } + else + { + set_intf_ops = NULL; + } +#endif //END OF CONFIG_PCI_HCI + + + + if(set_intf_ops==NULL) + return _FAIL; + + + set_intf_ops(&pintf->io_ops); + + return _SUCCESS; + +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c new file mode 100755 index 000000000000..156640cf351a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c @@ -0,0 +1,197 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_IOCTL_QUERY_C_ + +#include +#include +#include +#include +#include + + +#ifdef PLATFORM_WINDOWS +// +// Added for WPA2-PSK, by Annie, 2005-09-20. +// +u8 +query_802_11_capability( + _adapter* Adapter, + u8* pucBuf, + u32 * pulOutLen +) +{ + static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = + { + {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled}, + {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled}, + {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled}, + {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled}, + {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled} + }; + static ULONG ulNumOfPairSupported = sizeof(szAuthEnc)/sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); + NDIS_802_11_CAPABILITY * pCap = (NDIS_802_11_CAPABILITY *)pucBuf; + u8* pucAuthEncryptionSupported = (u8*) pCap->AuthenticationEncryptionSupported; + + + pCap->Length = sizeof(NDIS_802_11_CAPABILITY); + if(ulNumOfPairSupported > 1 ) + pCap->Length += (ulNumOfPairSupported-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); + + pCap->Version = 2; + pCap->NoOfPMKIDs = NUM_PMKID_CACHE; + pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported; + + if( sizeof (szAuthEnc) <= 240 ) // 240 = 256 - 4*4 // SecurityInfo.szCapability: only 256 bytes in size. + { + _rtw_memcpy( pucAuthEncryptionSupported, (u8*)szAuthEnc, sizeof (szAuthEnc) ); + *pulOutLen = pCap->Length; + return _TRUE; + } + else + { + *pulOutLen = 0; + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("_query_802_11_capability(): szAuthEnc size is too large.\n")); + return _FALSE; + } +} + +u8 query_802_11_association_information( _adapter *padapter,PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo) +{ + struct wlan_network *tgt_network; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv=&(padapter->securitypriv); + WLAN_BSSID_EX *psecnetwork=(WLAN_BSSID_EX*)&(psecuritypriv->sec_bss); + u8 * pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + unsigned char i,*auth_ie,*supp_ie; + + //NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); + _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); + //pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + + //------------------------------------------------------ + // Association Request related information + //------------------------------------------------------ + // Req_1. AvailableRequestFixedIEs + if(psecnetwork!=NULL){ + + pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES|NDIS_802_11_AI_REQFI_CURRENTAPADDRESS; + pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short)* & psecnetwork->IEs[10]; + _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress, + & psecnetwork->MacAddress, 6); + + pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + + if(check_fwstate( pmlmepriv, _FW_UNDER_LINKING|_FW_LINKED)==_TRUE) + { + + if(psecuritypriv->ndisauthtype>=Ndis802_11AuthModeWPA2) + pDest[0] =48; //RSN Information Element + else + pDest[0] =221; //WPA(SSN) Information Element + + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n Adapter->ndisauthtype==Ndis802_11AuthModeWPA)?0xdd:0x30 [%d]",pDest[0])); + supp_ie=&psecuritypriv->supplicant_ie[0]; + for(i=0;inetwork.IELength=%d\n\n", i,(int)psecnetwork->IELength)); + while((iRequestIELength += (2 + supp_ie[1+i]);// (2 + psecnetwork->IEs[1+i]+4); + + } + + + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n psecnetwork != NULL,fwstate==_FW_UNDER_LINKING \n")); + + } + + + //------------------------------------------------------ + // Association Response related information + //------------------------------------------------------ + + if(check_fwstate( pmlmepriv, _FW_LINKED)==_TRUE) + { + tgt_network =&(pmlmepriv->cur_network); + if(tgt_network!=NULL){ + pAssocInfo->AvailableResponseFixedIEs = + NDIS_802_11_AI_RESFI_CAPABILITIES + |NDIS_802_11_AI_RESFI_ASSOCIATIONID + ; + + pAssocInfo->ResponseFixedIEs.Capabilities =(unsigned short)* & tgt_network->network.IEs[10]; + pAssocInfo->ResponseFixedIEs.StatusCode = 0; + pAssocInfo->ResponseFixedIEs.AssociationId =(unsigned short) tgt_network->aid; + + pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)+pAssocInfo->RequestIELength; + auth_ie=&psecuritypriv->authenticator_ie[0]; + + for(i=0;i0){ + _rtw_memcpy((u8 *)&pDest[0],&auth_ie[1],i); + pAssocInfo->ResponseIELength =i; + } + + + pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; + + + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n tgt_network != NULL,fwstate==_FW_LINKED \n")); + } + } + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n exit query_802_11_association_information \n")); +_func_exit_; + + return _TRUE; +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c new file mode 100755 index 000000000000..87348a291b4b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c @@ -0,0 +1,1032 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_IOCTL_RTL_C_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_MP_INCLUDED +#include +#include +#endif + +struct oid_obj_priv oid_rtl_seg_01_01[] = +{ + {1, &oid_null_function}, //0x80 + {1, &oid_null_function}, //0x81 + {1, &oid_null_function}, //0x82 + {1, &oid_null_function}, //0x83//OID_RT_SET_SNIFFER_MODE + {1, &oid_rt_get_signal_quality_hdl}, //0x84 + {1, &oid_rt_get_small_packet_crc_hdl}, //0x85 + {1, &oid_rt_get_middle_packet_crc_hdl}, //0x86 + {1, &oid_rt_get_large_packet_crc_hdl}, //0x87 + {1, &oid_rt_get_tx_retry_hdl}, //0x88 + {1, &oid_rt_get_rx_retry_hdl}, //0x89 + {1, &oid_rt_pro_set_fw_dig_state_hdl}, //0x8A + {1, &oid_rt_pro_set_fw_ra_state_hdl} , //0x8B + {1, &oid_null_function}, //0x8C + {1, &oid_null_function}, //0x8D + {1, &oid_null_function}, //0x8E + {1, &oid_null_function}, //0x8F + {1, &oid_rt_get_rx_total_packet_hdl}, //0x90 + {1, &oid_rt_get_tx_beacon_ok_hdl}, //0x91 + {1, &oid_rt_get_tx_beacon_err_hdl}, //0x92 + {1, &oid_rt_get_rx_icv_err_hdl}, //0x93 + {1, &oid_rt_set_encryption_algorithm_hdl}, //0x94 + {1, &oid_null_function}, //0x95 + {1, &oid_rt_get_preamble_mode_hdl}, //0x96 + {1, &oid_null_function}, //0x97 + {1, &oid_rt_get_ap_ip_hdl}, //0x98 + {1, &oid_rt_get_channelplan_hdl}, //0x99 + {1, &oid_rt_set_preamble_mode_hdl}, //0x9A + {1, &oid_rt_set_bcn_intvl_hdl}, //0x9B + {1, &oid_null_function}, //0x9C + {1, &oid_rt_dedicate_probe_hdl}, //0x9D + {1, &oid_null_function}, //0x9E + {1, &oid_null_function}, //0x9F + {1, &oid_null_function}, //0xA0 + {1, &oid_null_function}, //0xA1 + {1, &oid_null_function}, //0xA2 + {1, &oid_null_function}, //0xA3 + {1, &oid_null_function}, //0xA4 + {1, &oid_null_function}, //0xA5 + {1, &oid_null_function}, //0xA6 + {1, &oid_rt_get_total_tx_bytes_hdl}, //0xA7 + {1, &oid_rt_get_total_rx_bytes_hdl}, //0xA8 + {1, &oid_rt_current_tx_power_level_hdl}, //0xA9 + {1, &oid_rt_get_enc_key_mismatch_count_hdl}, //0xAA + {1, &oid_rt_get_enc_key_match_count_hdl}, //0xAB + {1, &oid_rt_get_channel_hdl}, //0xAC + {1, &oid_rt_set_channelplan_hdl}, //0xAD + {1, &oid_rt_get_hardware_radio_off_hdl}, //0xAE + {1, &oid_null_function}, //0xAF + {1, &oid_null_function}, //0xB0 + {1, &oid_null_function}, //0xB1 + {1, &oid_null_function}, //0xB2 + {1, &oid_null_function}, //0xB3 + {1, &oid_rt_get_key_mismatch_hdl}, //0xB4 + {1, &oid_null_function}, //0xB5 + {1, &oid_null_function}, //0xB6 + {1, &oid_null_function}, //0xB7 + {1, &oid_null_function}, //0xB8 + {1, &oid_null_function}, //0xB9 + {1, &oid_null_function}, //0xBA + {1, &oid_rt_supported_wireless_mode_hdl}, //0xBB + {1, &oid_rt_get_channel_list_hdl}, //0xBC + {1, &oid_rt_get_scan_in_progress_hdl}, //0xBD + {1, &oid_null_function}, //0xBE + {1, &oid_null_function}, //0xBF + {1, &oid_null_function}, //0xC0 + {1, &oid_rt_forced_data_rate_hdl}, //0xC1 + {1, &oid_rt_wireless_mode_for_scan_list_hdl}, //0xC2 + {1, &oid_rt_get_bss_wireless_mode_hdl}, //0xC3 + {1, &oid_rt_scan_with_magic_packet_hdl}, //0xC4 + {1, &oid_null_function}, //0xC5 + {1, &oid_null_function}, //0xC6 + {1, &oid_null_function}, //0xC7 + {1, &oid_null_function}, //0xC8 + {1, &oid_null_function}, //0xC9 + {1, &oid_null_function}, //0xCA + {1, &oid_null_function}, //0xCB + {1, &oid_null_function}, //0xCC + {1, &oid_null_function}, //0xCD + {1, &oid_null_function}, //0xCE + {1, &oid_null_function}, //0xCF + +}; + +struct oid_obj_priv oid_rtl_seg_01_03[] = +{ + {1, &oid_rt_ap_get_associated_station_list_hdl}, //0x00 + {1, &oid_null_function}, //0x01 + {1, &oid_rt_ap_switch_into_ap_mode_hdl}, //0x02 + {1, &oid_null_function}, //0x03 + {1, &oid_rt_ap_supported_hdl}, //0x04 + {1, &oid_rt_ap_set_passphrase_hdl}, //0x05 + +}; + +struct oid_obj_priv oid_rtl_seg_01_11[] = +{ + {1, &oid_null_function}, //0xC0 OID_RT_PRO_RX_FILTER + {1, &oid_null_function}, //0xC1 OID_CE_USB_WRITE_REGISTRY + {1, &oid_null_function}, //0xC2 OID_CE_USB_READ_REGISTRY + {1, &oid_null_function}, //0xC3 OID_RT_PRO_SET_INITIAL_GAIN + {1, &oid_null_function}, //0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE + {1, &oid_null_function}, //0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE + {1, &oid_null_function}, //0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP + {1, &oid_null_function}, //0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP + {1, &oid_rt_pro_rf_write_registry_hdl}, //0xC8 + {1, &oid_rt_pro_rf_read_registry_hdl}, //0xC9 + {1, &oid_null_function} //0xCA OID_RT_PRO_QUERY_RF_TYPE + +}; + +struct oid_obj_priv oid_rtl_seg_03_00[] = +{ + {1, &oid_null_function}, //0x00 + {1, &oid_rt_get_connect_state_hdl}, //0x01 + {1, &oid_null_function}, //0x02 + {1, &oid_null_function}, //0x03 + {1, &oid_rt_set_default_key_id_hdl}, //0x04 + + +}; + + +//************** oid_rtl_seg_01_01 section start ************** + +NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + + _func_enter_; + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql,LOWER); + if(poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) + { + //DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); + if(!rtw_setfwdig_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + + } + else{ + status = NDIS_STATUS_NOT_ACCEPTED; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; +#endif + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv) +{ + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + + _func_enter_; + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + + _irqlevel_changed_(&oldirql,LOWER); + + if(poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) + { + //DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); + if(!rtw_setfwra_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + + } + else{ + status = NDIS_STATUS_NOT_ACCEPTED; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; +#endif + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + //DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl \n")); + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + +#if 0 + if(pMgntInfo->mAssoc || pMgntInfo->mIbss) + { + ulInfo = pAdapter->RxStats.SignalQuality; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + ulInfo = 0xffffffff; // It stands for -1 in 4-byte integer. + } + break; +#endif + + return status; +} + +//------------------------------------------------------------------------------ + +NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(u32)) + { + //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); + *(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG preamblemode = 0 ; + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + if(padapter->registrypriv.preamble == PREAMBLE_LONG) + preamblemode = 0; + else if (padapter->registrypriv.preamble == PREAMBLE_AUTO) + preamblemode = 1; + else if (padapter->registrypriv.preamble == PREAMBLE_SHORT) + preamblemode = 2; + + + *(ULONG *)poid_par_priv->information_buf = preamblemode ; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + +NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + struct eeprom_priv* peeprompriv = &padapter->eeprompriv; + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + *(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan ; + + return status; +} +NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + struct eeprom_priv* peeprompriv = &padapter->eeprompriv; + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf ; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG preamblemode = 0; + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + preamblemode = *(ULONG *)poid_par_priv->information_buf ; + if( preamblemode == 0) + padapter->registrypriv.preamble = PREAMBLE_LONG; + else if (preamblemode==1 ) + padapter->registrypriv.preamble = PREAMBLE_AUTO; + else if ( preamblemode==2 ) + padapter->registrypriv.preamble = PREAMBLE_SHORT; + + *(ULONG *)poid_par_priv->information_buf = preamblemode ; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); + *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + NDIS_802_11_CONFIGURATION *pnic_Config; + + ULONG channelnum; + + _func_enter_; + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) + pnic_Config = &pmlmepriv->cur_network.network.Configuration; + else + pnic_Config = &padapter->registrypriv.dev_network.Configuration; + + channelnum = pnic_Config->DSConfig; + *(ULONG *)poid_par_priv->information_buf = channelnum; + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + _func_exit_; + + + + return status; +} +NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG ulInfo = 0 ; + //DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl \n")); + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len >= sizeof(ULONG)){ + ulInfo |= 0x0100; //WIRELESS_MODE_B + ulInfo |= 0x0200; //WIRELESS_MODE_G + ulInfo |= 0x0400; //WIRELESS_MODE_A + + *(ULONG *) poid_par_priv->information_buf = ulInfo; + //DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo)); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else{ + status = NDIS_STATUS_INVALID_LENGTH; + } + + return status; +} +NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + + +NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + +NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +//************** oid_rtl_seg_01_01 section end ************** + +//************** oid_rtl_seg_01_03 section start ************** +NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + +//************** oid_rtl_seg_01_03 section end ************** + +//**************** oid_rtl_seg_01_11 section start **************** +NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + _func_enter_; + //DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl \n")); + if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql,LOWER); + if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) + { + //RegOffsetValue - The offset of RF register to write. + //RegDataWidth - The data width of RF register to write. + //RegDataValue - The value to write. + //RegOffsetValue = *((unsigned long*)InformationBuffer); + //RegDataWidth = *((unsigned long*)InformationBuffer+1); + //RegDataValue = *((unsigned long*)InformationBuffer+2); + if(!rtw_setrfreg_cmd(Adapter, + *(unsigned char*)poid_par_priv->information_buf, + (unsigned long)(*((unsigned long*)poid_par_priv->information_buf+2)))) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + + } + else{ + status = NDIS_STATUS_INVALID_LENGTH; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + _func_enter_; + + //DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl \n")); + if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql,LOWER); + if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) + { + if(Adapter->mppriv.act_in_progress == _TRUE) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + else + { + //init workparam + Adapter->mppriv.act_in_progress = _TRUE; + Adapter->mppriv.workparam.bcompleted= _FALSE; + Adapter->mppriv.workparam.act_type = MPT_READ_RF; + Adapter->mppriv.workparam.io_offset = *(unsigned long*)poid_par_priv->information_buf; + Adapter->mppriv.workparam.io_value = 0xcccccccc; + + //RegOffsetValue - The offset of RF register to read. + //RegDataWidth - The data width of RF register to read. + //RegDataValue - The value to read. + //RegOffsetValue = *((unsigned long*)InformationBuffer); + //RegDataWidth = *((unsigned long*)InformationBuffer+1); + //RegDataValue = *((unsigned long*)InformationBuffer+2); + if(!rtw_getrfreg_cmd(Adapter, + *(unsigned char*)poid_par_priv->information_buf, + (unsigned char*)&Adapter->mppriv.workparam.io_value)) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + } + + + } + else { + status = NDIS_STATUS_INVALID_LENGTH; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; +#endif + return status; +} + +//**************** oid_rtl_seg_01_11 section end**************** + + +//************** oid_rtl_seg_03_00 section start ************** +enum _CONNECT_STATE_{ + CHECKINGSTATUS, + ASSOCIATED, + ADHOCMODE, + NOTASSOCIATED +}; + +NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + ULONG ulInfo; + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + // nStatus==0 CheckingStatus + // nStatus==1 Associated + // nStatus==2 AdHocMode + // nStatus==3 NotAssociated + + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) + ulInfo = CHECKINGSTATUS; + else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + ulInfo = ASSOCIATED; + else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)== _TRUE) + ulInfo = ADHOCMODE; + else + ulInfo = NOTASSOCIATED ; + + *(ULONG *)poid_par_priv->information_buf = ulInfo; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +#if 0 + // Rearrange the order to let the UI still shows connection when scan is in progress + RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("===> Query OID_RT_GET_CONNECT_STATE.\n")); + if(pMgntInfo->mAssoc) + ulInfo = 1; + else if(pMgntInfo->mIbss) + ulInfo = 2; + else if(pMgntInfo->bScanInProgress) + ulInfo = 0; + else + ulInfo = 3; + ulInfoLen = sizeof(ULONG); + RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("<=== Query OID_RT_GET_CONNECT_STATE: %d\n", ulInfo)); +#endif + + return status; +} + +NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +//************** oid_rtl_seg_03_00 section end ************** diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c new file mode 100755 index 000000000000..e73c7159b056 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c @@ -0,0 +1,1283 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_IOCTL_SET_C_ + + +#include +#include +#include +#include +#include + +#ifdef CONFIG_USB_HCI +#include +#include +#endif +#ifdef CONFIG_SDIO_HCI +#include +#endif + +#include + +extern void indicate_wx_scan_complete_event(_adapter *padapter); + +#define IS_MAC_ADDRESS_BROADCAST(addr) \ +( \ + ( (addr[0] == 0xff) && (addr[1] == 0xff) && \ + (addr[2] == 0xff) && (addr[3] == 0xff) && \ + (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ +) + +u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid) +{ + u8 i; + u8 ret=_TRUE; + +_func_enter_; + + if (ssid->SsidLength > 32) { + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid length >32\n")); + ret= _FALSE; + goto exit; + } + + /* + * To support various locale like Chinese. + * Don't filter the SSID string. + */ +#if 0 + for(i = 0; i < ssid->SsidLength; i++) + { + //wifi, printable ascii code must be supported + if(!( (ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e) )){ + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid has nonprintabl ascii\n")); + ret= _FALSE; + break; + } + } +#endif + +exit: + +_func_exit_; + + return ret; +} + +u8 rtw_do_join(_adapter * padapter) +{ + _list *plist, *phead; + u8* pibss = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + u8 ret=_SUCCESS; + + phead = get_list_head(queue); + plist = get_next(phead); + +_func_enter_; + + printk("\n rtw_do_join: phead = %p; plist = %p \n\n\n", phead, plist); + + pmlmepriv->cur_network.join_res = -2; + + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); + + pmlmepriv->pscanned = plist; + + pmlmepriv->to_join = _TRUE; + + if(_rtw_queue_empty(queue)== _TRUE) + { + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + + //when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty + //we try to issue sitesurvey firstly + + if(pmlmepriv->LinkDetectInfo.bBusyTraffic==_FALSE + #ifdef CONFIG_LAYER2_ROAMING + || pmlmepriv->to_roaming >0 + #endif + ) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_do_join(): site survey if scanned_queue is empty\n.")); + // submit site_survey_cmd + if(_SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid)) ) { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_do_join(): site survey return error\n.")); + } + } + + goto exit; + } + else + { + int select_ret; + if((select_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv))==_SUCCESS) + { + pmlmepriv->to_join = _FALSE; + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + } +#if 0 + else if(ret == 2) + { + DBG_8712("*****UNDER_LINKED WITH SAME NETWORK, RETURN*****\n"); + + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + + } +#endif + else + { + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) + { + // submit createbss_cmd to change to a ADHOC_MASTER + + //pmlmepriv->lock has been acquired by caller... + WLAN_BSSID_EX *pdev_network = &(padapter->registrypriv.dev_network); + + pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; + + pibss = padapter->registrypriv.dev_network.MacAddress; + + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); + + rtw_update_registrypriv_dev_network(padapter); + + rtw_generate_random_ibss(pibss); + + if(rtw_createbss_cmd(padapter)!=_SUCCESS) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>do_goin: rtw_createbss_cmd status FAIL*** \n ")); + return _FALSE; + } + + pmlmepriv->to_join = _FALSE; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("***Error=> rtw_select_and_join_from_scanned_queue FAIL under STA_Mode*** \n ")); + + } + else + { + // can't associate ; reset under-linking + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + +#if 0 + if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) + { + if(_rtw_memcmp(pmlmepriv->cur_network.network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) + { + // for funk to do roaming + // funk will reconnect, but funk will not sitesurvey before reconnect + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("for funk to do roaming")); + if(pmlmepriv->sitesurveyctrl.traffic_busy==_FALSE) + rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid); + } + + } +#endif + + //when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue + //we try to issue sitesurvey firstly + if(pmlmepriv->LinkDetectInfo.bBusyTraffic==_FALSE + #ifdef CONFIG_LAYER2_ROAMING + || pmlmepriv->to_roaming >0 + #endif + ) + { + //DBG_8192C("rtw_do_join() when no desired bss in scanning queue \n"); + if( _SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid)) ){ + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("do_join(): site survey return error\n.")); + } + } + + + } + + } + + } + +exit: + +_func_exit_; + + return ret; +} + +#ifdef PLATFORM_WINDOWS +u8 rtw_pnp_set_power_wakeup(_adapter* padapter) +{ + u8 res=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_wakeup!!!\n")); + + res = rtw_setstandby_cmd(padapter, 0); + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_wakeup!!!\n")); + +_func_exit_; + + return res; +} + +u8 rtw_pnp_set_power_sleep(_adapter* padapter) +{ + u8 res=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_sleep!!!\n")); + //DbgPrint("+rtw_pnp_set_power_sleep\n"); + + res = rtw_setstandby_cmd(padapter, 1); + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_sleep!!!\n")); + +_func_exit_; + + return res; +} + +u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults) +{ +_func_enter_; + + switch( reloadDefaults) + { + case Ndis802_11ReloadWEPKeys: + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("SetInfo OID_802_11_RELOAD_DEFAULTS : Ndis802_11ReloadWEPKeys\n")); + break; + } + + // SecClearAllKeys(Adapter); + // 8711 CAM was not for En/Decrypt only + // so, we can't clear all keys. + // should we disable WPAcfg (ox0088) bit 1-2, instead of clear all CAM + + //TO DO... + +_func_exit_; + + return _TRUE; +} + +u8 set_802_11_test(_adapter* padapter, NDIS_802_11_TEST *test) +{ + u8 ret=_TRUE; + +_func_enter_; + + switch(test->Type) + { + case 1: + NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->AuthenticationEvent, test->Length - 8); + NdisMIndicateStatusComplete(padapter->hndis_adapter); + break; + + case 2: + NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->RssiTrigger, sizeof(NDIS_802_11_RSSI)); + NdisMIndicateStatusComplete(padapter->hndis_adapter); + break; + + default: + ret=_FALSE; + break; + } + +_func_exit_; + + return ret; +} + +u8 rtw_set_802_11_pmkid(_adapter* padapter, NDIS_802_11_PMKID *pmkid) +{ + u8 ret=_SUCCESS; + + return ret; +} + +#endif + +u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid) +{ + _irqL irqL; + u8 status=_TRUE; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + _queue *queue = &pmlmepriv->scanned_queue; + +_func_enter_; + + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_, + ("+rtw_set_802_11_bssid: bssid="MAC_FMT"\n", MAC_ARG(bssid) )); + + if ((bssid[0]==0x00 && bssid[1]==0x00 && bssid[2]==0x00 && bssid[3]==0x00 && bssid[4]==0x00 &&bssid[5]==0x00) || + (bssid[0]==0xFF && bssid[1]==0xFF && bssid[2]==0xFF && bssid[3]==0xFF && bssid[4]==0xFF &&bssid[5]==0xFF)) + { + status = _FALSE; + return status; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, + ("Set BSSID is not allowed under surveying || adhoc master || under linking, fw_state=0x%08x\n", + get_fwstate(pmlmepriv))); + status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); + goto _Abort_Set_BSSID; + } + + if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n")); + + if (_rtw_memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN) == _TRUE) + { + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE) + goto _Abort_Set_BSSID;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. + } else { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set BSSID not the same ssid\n")); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_bssid="MAC_FMT"\n", MAC_ARG(bssid) )); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("cur_bssid="MAC_FMT"\n", MAC_ARG(pmlmepriv->cur_network.network.MacAddress) )); + + rtw_disassoc_cmd(padapter); + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + rtw_indicate_disconnect(padapter); + + rtw_free_assoc_resources(padapter); + + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + } + } + } + + _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN); + + pmlmepriv->assoc_by_bssid=_TRUE; + + status = rtw_do_join(padapter); + + goto done; + +_Abort_Set_BSSID: + + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("rtw_set_802_11_bssid: _Abort_Set_BSSID\n")); + +done: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +_func_exit_; + + return status; +} + +u8 rtw_set_802_11_ssid(_adapter* padapter, NDIS_802_11_SSID *ssid) +{ + _irqL irqL; + u8 status = _TRUE; + int timeout = 50; + + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *pnetwork = &pmlmepriv->cur_network; + _queue *queue = &pmlmepriv->scanned_queue; + +#ifdef PLATFORM_WINDOWS + LARGE_INTEGER sys_time; + u32 diff_time,cur_time ; +#endif + + +_func_enter_; + + //printk("+rtw_set_802_11_ssid: ssid=[%s] fw_state=0x%08x\n", + // ssid->Ssid, get_fwstate(pmlmepriv)); + + if(padapter->hw_init_completed==_FALSE){ + printk("%s: set_ssid: hw_init_completed==_FALSE=>exit!!!\n", __func__); + return _FALSE; + } + + //_enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { + printk("%s: Set SSID is not allowed in _FW_UNDER_LINKING\n", __func__); + status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); + //goto _Abort_Set_SSID; + return status; + } + + while (timeout-- > 0) + { + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _FALSE) + break; + + msleep(100); + } + + if (timeout <= 0) + { + printk("%s: Set SSID is not allowed under surveying\n", __func__); + status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); + goto _Abort_Set_SSID; + } +#if 0 + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) { + printk("%s: Set SSID is not allowed under surveying || adhoc master || under linking\n", __func__); + status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); + goto _Abort_Set_SSID; + } +#endif + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, + ("set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n")); + + if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) && + (_rtw_memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength) == _TRUE)) + { + if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, + ("Set SSID is the same ssid, fw_state=0x%08x\n", + get_fwstate(pmlmepriv))); + + if(rtw_is_same_ibss(padapter, pnetwork) == _FALSE) + { + //if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again + rtw_disassoc_cmd(padapter); + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + rtw_indicate_disconnect(padapter); + + rtw_free_assoc_resources(padapter); + + if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) { + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + } + } + else + { + //printk("it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again.\n"); + goto _Abort_Set_SSID;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. + } + } +#ifdef CONFIG_LPS + else { + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1); + } +#endif + } + else + { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set SSID not the same ssid\n")); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_ssid=[%s] len=0x%x\n", ssid->Ssid, (unsigned int)ssid->SsidLength)); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("assoc_ssid=[%s] len=0x%x\n", pmlmepriv->assoc_ssid.Ssid, (unsigned int)pmlmepriv->assoc_ssid.SsidLength)); + + rtw_disassoc_cmd(padapter); + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + rtw_indicate_disconnect(padapter); + + rtw_free_assoc_resources(padapter); + + if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) { + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + } + } + } + +#ifdef PLATFORM_LINUX + if (padapter->securitypriv.btkip_countermeasure == _TRUE) { + printk("%s: btkip_countermeasure == _TRUE.\n", __func__); + status = _FALSE; + goto _Abort_Set_SSID; + } +#endif + + if (rtw_validate_ssid(ssid) == _FALSE) { + printk("%s: rtw_validate_ssid fail.\n", __func__); + status = _FALSE; + goto _Abort_Set_SSID; + } + + _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID)); + + pmlmepriv->assoc_by_bssid=_FALSE; + + status = rtw_do_join(padapter); + if (status == _FALSE) + printk("%s: rtw_do_join fail\n", __func__); + + goto done; + +_Abort_Set_SSID: + + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, + ("-rtw_set_802_11_ssid: _Abort_Set_SSID: status=%d\n", status)); + +done: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +_func_exit_; + + return status; + +} + +u8 rtw_set_802_11_infrastructure_mode(_adapter* padapter, + NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &pmlmepriv->cur_network; + NDIS_802_11_NETWORK_INFRASTRUCTURE* pold_state = &(cur_network->network.InfrastructureMode); + +_func_enter_; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_notice_, + ("+rtw_set_802_11_infrastructure_mode: old=%d new=%d fw_state=0x%08x\n", + *pold_state, networktype, get_fwstate(pmlmepriv))); + + if(*pold_state != networktype) + { + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(" change mode!")); + //DBG_871X("change mode, old_mode=%d, new_mode=%d, fw_state=0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); + + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) ||(*pold_state==Ndis802_11IBSS)) + rtw_disassoc_cmd(padapter); + + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)== _TRUE) ) + rtw_free_assoc_resources(padapter); + + + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) || (*pold_state==Ndis802_11Infrastructure) ||(*pold_state==Ndis802_11IBSS)) + { + rtw_indicate_disconnect(padapter); //will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not + } + + if(*pold_state==Ndis802_11APMode) + { + //change to other mode from Ndis802_11APMode + cur_network->join_res = -1; + +#ifdef CONFIG_NATIVEAP_MLME + stop_ap_mode(padapter); +#endif + } + + *pold_state = networktype; + + // clear WIFI_STATION_STATE; WIFI_AP_STATE; WIFI_ADHOC_STATE; WIFI_ADHOC_MASTER_STATE + //pmlmepriv->fw_state &= 0xffffff87; + _clr_fwstate_(pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE); + + switch(networktype) + { + case Ndis802_11IBSS: + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + break; + + case Ndis802_11Infrastructure: + set_fwstate(pmlmepriv, WIFI_STATION_STATE); + break; + + case Ndis802_11APMode: + set_fwstate(pmlmepriv, WIFI_AP_STATE); +#ifdef CONFIG_NATIVEAP_MLME + start_ap_mode(padapter); + //rtw_indicate_connect(padapter); +#endif + + break; + + case Ndis802_11AutoUnknown: + case Ndis802_11InfrastructureMax: + break; + } + + //SecClearAllKeys(adapter); + + //RT_TRACE(COMP_OID_SET, DBG_LOUD, ("set_infrastructure: fw_state:%x after changing mode\n", + // get_fwstate(pmlmepriv) )); + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + } + +_func_exit_; + + return _TRUE; +} + + +u8 rtw_set_802_11_disassociate(_adapter *padapter) +{ + _irqL irqL; + struct mlme_priv * pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\n")); + + rtw_disassoc_cmd(padapter); + rtw_indicate_disconnect(padapter); + rtw_free_assoc_resources(padapter); + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +_func_exit_; + + return _TRUE; +} + +u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + u8 res=_TRUE; + +_func_enter_; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("+rtw_set_802_11_bssid_list_scan(), fw_state=%x\n", get_fwstate(pmlmepriv))); + + if (padapter == NULL) { + res=_FALSE; + goto exit; + } + if (padapter->hw_init_completed==_FALSE){ + res = _FALSE; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n===rtw_set_802_11_bssid_list_scan:hw_init_completed==_FALSE===\n")); + goto exit; + } + + if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || + (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) + { + // Scan or linking is in progress, do nothing. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_bssid_list_scan fail since fw_state = %x\n", get_fwstate(pmlmepriv))); + res = _TRUE; + + if(check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE){ + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###_FW_UNDER_SURVEY|_FW_UNDER_LINKING\n\n")); + } else { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###pmlmepriv->sitesurveyctrl.traffic_busy==_TRUE\n\n")); + } + } else { + NDIS_802_11_SSID ssid; + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + if(ATOMIC_READ(&pmlmepriv->set_scan_deny)==1){ + DBG_871X("%s:%d CONFIG_SET_SCAN_DENY_TIMER deny scan\n", __FUNCTION__, __LINE__); + indicate_wx_scan_complete_event(padapter); + return _SUCCESS; + } + #endif + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + _rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID)); + + res = rtw_sitesurvey_cmd(padapter, &ssid); + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + } +exit: + +_func_exit_; + + return res; +} + +u8 rtw_set_802_11_authentication_mode(_adapter* padapter, NDIS_802_11_AUTHENTICATION_MODE authmode) +{ + struct security_priv *psecuritypriv = &padapter->securitypriv; + int res; + u8 ret; + +_func_enter_; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_802_11_auth.mode(): mode=%x\n", authmode)); + + psecuritypriv->ndisauthtype=authmode; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_authentication_mode:psecuritypriv->ndisauthtype=%d", psecuritypriv->ndisauthtype)); + + if(psecuritypriv->ndisauthtype>3) + psecuritypriv->dot11AuthAlgrthm=dot11AuthAlgrthm_8021X; + + res=rtw_set_auth(padapter,psecuritypriv); + + if(res==_SUCCESS) + ret=_TRUE; + else + ret=_FALSE; + +_func_exit_; + + return ret; +} + +u8 rtw_set_802_11_add_wep(_adapter* padapter, NDIS_802_11_WEP *wep){ + + u8 bdefaultkey; + u8 btransmitkey; + sint keyid,res; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + u8 ret=_SUCCESS; + +_func_enter_; + + bdefaultkey=(wep->KeyIndex & 0x40000000) > 0 ? _FALSE : _TRUE; //for ??? + btransmitkey= (wep->KeyIndex & 0x80000000) > 0 ? _TRUE : _FALSE; //for ??? + keyid=wep->KeyIndex & 0x3fffffff; + + if(keyid>4) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MgntActrtw_set_802_11_add_wep:keyid>4=>fail\n")); + ret=_FALSE; + goto exit; + } + + switch(wep->KeyLength) + { + case 5: + psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=5\n")); + break; + case 13: + psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=13\n")); + break; + default: + psecuritypriv->dot11PrivacyAlgrthm=_NO_PRIVACY_; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength!=5 or 13\n")); + break; + } + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:befor memcpy, wep->KeyLength=0x%x wep->KeyIndex=0x%x keyid =%x\n",wep->KeyLength,wep->KeyIndex,keyid)); + + _rtw_memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]),&(wep->KeyMaterial),wep->KeyLength); + + psecuritypriv->dot11DefKeylen[keyid]=wep->KeyLength; + + psecuritypriv->dot11PrivacyKeyIndex=keyid; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x \n", + psecuritypriv->dot11DefKey[keyid].skey[0],psecuritypriv->dot11DefKey[keyid].skey[1],psecuritypriv->dot11DefKey[keyid].skey[2], + psecuritypriv->dot11DefKey[keyid].skey[3],psecuritypriv->dot11DefKey[keyid].skey[4],psecuritypriv->dot11DefKey[keyid].skey[5], + psecuritypriv->dot11DefKey[keyid].skey[6],psecuritypriv->dot11DefKey[keyid].skey[7],psecuritypriv->dot11DefKey[keyid].skey[8], + psecuritypriv->dot11DefKey[keyid].skey[9],psecuritypriv->dot11DefKey[keyid].skey[10],psecuritypriv->dot11DefKey[keyid].skey[11], + psecuritypriv->dot11DefKey[keyid].skey[12])); + + res=rtw_set_key(padapter,psecuritypriv, keyid, 1); + + if(res==_FAIL) + ret= _FALSE; +exit: + +_func_exit_; + + return ret; + +} + +u8 rtw_set_802_11_remove_wep(_adapter* padapter, u32 keyindex){ + + u8 ret=_SUCCESS; + +_func_enter_; + + if (keyindex >= 0x80000000 || padapter == NULL){ + + ret=_FALSE; + goto exit; + + } + else + { + int res; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + if( keyindex < 4 ){ + + _rtw_memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16); + + res=rtw_set_key(padapter,psecuritypriv,keyindex, 0); + + psecuritypriv->dot11DefKeylen[keyindex]=0; + + if(res==_FAIL) + ret=_FAIL; + + } + else + { + ret=_FAIL; + } + + } + +exit: + +_func_exit_; + + return ret; + +} + +u8 rtw_set_802_11_add_key(_adapter* padapter, NDIS_802_11_KEY *key){ + + uint encryptionalgo; + u8 * pbssid; + struct sta_info *stainfo; + u8 bgroup = _FALSE; + u8 bgrouptkey = _FALSE;//can be remove later + u8 ret=_SUCCESS; + +_func_enter_; + + if (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)){ + + // It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination, + // it must fail the request and return NDIS_STATUS_INVALID_DATA. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: ((key->KeyIndex & 0x80000000) == 0)[=%d] ",(int)(key->KeyIndex & 0x80000000) == 0)); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key:((key->KeyIndex & 0x40000000) > 0)[=%d]" , (int)(key->KeyIndex & 0x40000000) > 0)); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: key->KeyIndex=%d \n" ,(int)key->KeyIndex)); + ret= _FAIL; + goto exit; + } + + if(key->KeyIndex & 0x40000000) + { + // Pairwise key + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Pairwise key +++++\n")); + + pbssid=get_bssid(&padapter->mlmepriv); + stainfo=rtw_get_stainfo(&padapter->stapriv, pbssid); + + if((stainfo!=NULL)&&(padapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)){ + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:( stainfo!=NULL)&&(Adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\n")); + encryptionalgo=stainfo->dot118021XPrivacy; + } + else{ + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: stainfo==NULL)||(Adapter->securitypriv.dot11AuthAlgrthm!=dot11AuthAlgrthm_8021X)\n")); + encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm; + } + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (encryptionalgo ==%d)!\n",encryptionalgo )); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11PrivacyAlgrthm ==%d)!\n",padapter->securitypriv.dot11PrivacyAlgrthm)); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11AuthAlgrthm ==%d)!\n",padapter->securitypriv.dot11AuthAlgrthm)); + + if((stainfo!=NULL)){ + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (stainfo->dot118021XPrivacy ==%d)!\n", stainfo->dot118021XPrivacy)); + } + + if(key->KeyIndex & 0x000000FF){ + // The key index is specified in the lower 8 bits by values of zero to 255. + // The key index should be set to zero for a Pairwise key, and the driver should fail with + // NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" key->KeyIndex & 0x000000FF.\n")); + ret= _FAIL; + goto exit; + } + + // check BSSID + if (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _TRUE){ + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MacAddr_isBcst(key->BSSID)\n")); + ret= _FALSE; + goto exit; + } + + // Check key length for TKIP. + //if(encryptionAlgorithm == RT_ENC_TKIP_ENCRYPTION && key->KeyLength != 32) + if((encryptionalgo== _TKIP_)&& (key->KeyLength != 32)){ + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("TKIP KeyLength:0x%x != 32\n", key->KeyLength)); + ret=_FAIL; + goto exit; + + } + + // Check key length for AES. + if((encryptionalgo== _AES_)&& (key->KeyLength != 16)) { + // For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case. + if(key->KeyLength == 32) { + key->KeyLength = 16; + } else { + ret= _FAIL; + goto exit; + } + } + + // Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko. + if( (encryptionalgo== _WEP40_|| encryptionalgo== _WEP104_) && (key->KeyLength != 5 || key->KeyLength != 13)) { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("WEP KeyLength:0x%x != 5 or 13\n", key->KeyLength)); + ret=_FAIL; + goto exit; + } + + bgroup = _FALSE; + + // Check the pairwise key. Added by Annie, 2005-07-06. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Pairwise Key set]\n")); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3))); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength)); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); + + } + else + { + // Group key - KeyIndex(BIT30==0) + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Group key +++++\n")); + + + // when add wep key through add key and didn't assigned encryption type before + if((padapter->securitypriv.ndisauthtype<=3)&&(padapter->securitypriv.dot118021XGrpPrivacy==0)) + { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("keylen=%d( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )padapter->securitypriv.dot118021XGrpPrivacy(%x)\n", key->KeyLength,padapter->securitypriv.dot11PrivacyAlgrthm,padapter->securitypriv.dot118021XGrpPrivacy)); + + switch(key->KeyLength) + { + case 5: + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); + break; + case 13: + padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); + break; + default: + padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u \n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); + break; + } + + encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" Adapter->securitypriv.dot11PrivacyAlgrthm=%x\n", padapter->securitypriv.dot11PrivacyAlgrthm)); + + } + else + { + encryptionalgo=padapter->securitypriv.dot118021XGrpPrivacy; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )encryptionalgo(%x)=padapter->securitypriv.dot118021XGrpPrivacy(%x)keylen=%d\n", padapter->securitypriv.dot11PrivacyAlgrthm,encryptionalgo,padapter->securitypriv.dot118021XGrpPrivacy,key->KeyLength)); + + } + + if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE) && (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _FALSE)) { + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" IBSS but BSSID is not Broadcast Address.\n")); + ret= _FAIL; + goto exit; + } + + // Check key length for TKIP + if((encryptionalgo== _TKIP_) && (key->KeyLength != 32)) { + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" TKIP GTK KeyLength:%u != 32\n", key->KeyLength)); + ret= _FAIL; + goto exit; + + } else if(encryptionalgo== _AES_ && (key->KeyLength != 16 && key->KeyLength != 32) ) { + + // Check key length for AES + // For NDTEST, we allow keylen=32 in this case. 2005.01.27, by rcnjko. + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<=== SetInfo, OID_802_11_ADD_KEY: AES GTK KeyLength:%u != 16 or 32\n", key->KeyLength)); + ret= _FAIL; + goto exit; + } + + // Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03. + if((encryptionalgo== _AES_) && (key->KeyLength == 32) ) { + key->KeyLength = 16; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("AES key length changed: %u\n", key->KeyLength) ); + } + + if(key->KeyIndex & 0x8000000) {//error ??? 0x8000_0000 + bgrouptkey = _TRUE; + } + + if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE)&&(check_fwstate(&padapter->mlmepriv, _FW_LINKED)==_TRUE)) + { + bgrouptkey = _TRUE; + } + + bgroup = _TRUE; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n") ); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Group Key set]\n") ); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")) ; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3))); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength)) ; + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); + + } + + // If WEP encryption algorithm, just call rtw_set_802_11_add_wep(). + if((padapter->securitypriv.dot11AuthAlgrthm !=dot11AuthAlgrthm_8021X)&&(encryptionalgo== _WEP40_ || encryptionalgo== _WEP104_)) + { + u8 ret; + u32 keyindex; + u32 len = FIELD_OFFSET(NDIS_802_11_KEY, KeyMaterial) + key->KeyLength; + NDIS_802_11_WEP *wep = &padapter->securitypriv.ndiswep; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ WEP key +++++\n")); + + wep->Length = len; + keyindex = key->KeyIndex&0x7fffffff; + wep->KeyIndex = keyindex ; + wep->KeyLength = key->KeyLength; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:Before memcpy \n")); + + _rtw_memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength); + _rtw_memcpy(&(padapter->securitypriv.dot11DefKey[keyindex].skey[0]), key->KeyMaterial, key->KeyLength); + + padapter->securitypriv.dot11DefKeylen[keyindex]=key->KeyLength; + padapter->securitypriv.dot11PrivacyKeyIndex=keyindex; + + ret = rtw_set_802_11_add_wep(padapter, wep); + + goto exit; + + } + + if(key->KeyIndex & 0x20000000){ + // SetRSC + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ SetRSC+++++\n")); + if(bgroup == _TRUE) + { + NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL; + _rtw_memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8); + } + else + { + NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL; + _rtw_memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8); + } + + } + + // Indicate this key idx is used for TX + // Save the key in KeyMaterial + if(bgroup == _TRUE) // Group transmit key + { + int res; + + if(bgrouptkey == _TRUE) + { + padapter->securitypriv.dot118021XGrpKeyid=(u8)key->KeyIndex; + } + + if((key->KeyIndex&0x3) == 0){ + ret = _FAIL; + goto exit; + } + + _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], 0, 16); + _rtw_memset(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); + _rtw_memset(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); + + if((key->KeyIndex & 0x10000000)) + { + _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); + _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1], + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3], + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5], + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7])); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n")); + + } + else + { + _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); + _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1], + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3], + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5], + padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7])); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n")); + + } + + //set group key by index + _rtw_memcpy(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial, key->KeyLength); + + key->KeyIndex=key->KeyIndex & 0x03; + + padapter->securitypriv.binstallGrpkey=_TRUE; + + padapter->securitypriv.bcheck_grpkey=_FALSE; + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("reset group key")); + + res=rtw_set_key(padapter,&padapter->securitypriv, key->KeyIndex, 1); + + if(res==_FAIL) + ret= _FAIL; + + goto exit; + + } + else // Pairwise Key + { + u8 res; + + pbssid=get_bssid(&padapter->mlmepriv); + stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid ); + + if(stainfo!=NULL) + { + _rtw_memset( &stainfo->dot118021x_UncstKey, 0, 16);// clear keybuffer + + _rtw_memcpy(&stainfo->dot118021x_UncstKey, key->KeyMaterial, 16); + + if(encryptionalgo== _TKIP_) + { + padapter->securitypriv.busetkipkey=_FALSE; + + //_set_timer(&padapter->securitypriv.tkip_timer, 50); + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n ==========_set_timer\n")); + + // if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255] + if((key->KeyIndex & 0x10000000)){ + _rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 16, 8); + _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 24, 8); + + } else { + _rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 24, 8); + _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 16, 8); + + } + + } + else if(encryptionalgo == _AES_) + { + + } + + + //Set key to CAM through H2C command + if(bgrouptkey)//never go to here + { + res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _FALSE); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n")); + } + else{ + res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _TRUE); + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n")); + } + + if(res ==_FALSE) + ret= _FAIL; + + } + + } + +exit: + +_func_exit_; + + return ret; +} + +u8 rtw_set_802_11_remove_key(_adapter* padapter, NDIS_802_11_REMOVE_KEY *key){ + + uint encryptionalgo; + u8 * pbssid; + struct sta_info *stainfo; + u8 bgroup = (key->KeyIndex & 0x4000000) > 0 ? _FALSE: _TRUE; + u8 keyIndex = (u8)key->KeyIndex & 0x03; + u8 ret=_SUCCESS; + +_func_enter_; + + if ((key->KeyIndex & 0xbffffffc) > 0) { + ret=_FAIL; + goto exit; + } + + if (bgroup == _TRUE) { + encryptionalgo= padapter->securitypriv.dot118021XGrpPrivacy; + // clear group key by index + //NdisZeroMemory(Adapter->MgntInfo.SecurityInfo.KeyBuf[keyIndex], MAX_WEP_KEY_LEN); + //Adapter->MgntInfo.SecurityInfo.KeyLen[keyIndex] = 0; + + _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[keyIndex], 0, 16); + + //! \todo Send a H2C Command to Firmware for removing this Key in CAM Entry. + + } else { + + pbssid=get_bssid(&padapter->mlmepriv); + stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid ); + if(stainfo !=NULL){ + encryptionalgo=stainfo->dot118021XPrivacy; + + // clear key by BSSID + _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16); + + //! \todo Send a H2C Command to Firmware for disable this Key in CAM Entry. + + } + else{ + ret= _FAIL; + goto exit; + } + } + +exit: + +_func_exit_; + + return _TRUE; + +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mlme.c b/drivers/net/wireless/rtl8192c/core/rtw_mlme.c new file mode 100755 index 000000000000..0da81194e57b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mlme.c @@ -0,0 +1,3678 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_MLME_C_ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern void indicate_wx_scan_complete_event(_adapter *padapter); +extern u8 rtw_do_join(_adapter * padapter); + +sint _rtw_init_mlme_priv (_adapter* padapter) +{ + sint i; + u8 *pbuf; + extern char init_channel_plan;// wifi_power.c (add by gwl) + struct wlan_network *pnetwork; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + sint res = _SUCCESS; + +_func_enter_; + + _rtw_memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv)); + pmlmepriv->nic_hdl = (u8 *)padapter; + + pmlmepriv->pscanned = NULL; + pmlmepriv->fw_state = 0; + pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; + pmlmepriv->scan_mode=SCAN_ACTIVE;// 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) + pmlmepriv->ChannelPlan = init_channel_plan; //initialize channel plan parameter (add by gwl) + + _rtw_spinlock_init(&(pmlmepriv->lock)); + _rtw_init_queue(&(pmlmepriv->free_bss_pool)); + _rtw_init_queue(&(pmlmepriv->scanned_queue)); + + set_scanned_network_val(pmlmepriv, 0); + + _rtw_memset(&pmlmepriv->assoc_ssid,0,sizeof(NDIS_802_11_SSID)); + + pbuf = rtw_zvmalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); + + if (pbuf == NULL){ + res=_FAIL; + goto exit; + } + pmlmepriv->free_bss_buf = pbuf; + + pnetwork = (struct wlan_network *)pbuf; + + for(i = 0; i < MAX_BSS_CNT; i++) + { + _rtw_init_listhead(&(pnetwork->list)); + + rtw_list_insert_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue)); + + pnetwork++; + } + + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + ATOMIC_SET(&pmlmepriv->set_scan_deny, 0); + #endif + + rtw_init_mlme_timer(padapter); + +exit: + +_func_exit_; + + return res; +} + +void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv) +{ + _rtw_spinlock_free(&pmlmepriv->lock); + _rtw_spinlock_free(&(pmlmepriv->free_bss_pool.lock)); + _rtw_spinlock_free(&(pmlmepriv->scanned_queue.lock)); +} + +void _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) +{ +_func_enter_; + + if(pmlmepriv){ + rtw_mfree_mlme_priv_lock (pmlmepriv); + + if (pmlmepriv->free_bss_buf) { + rtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network)); + } + } +_func_exit_; +} + +sint _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) +{ + _irqL irqL; + +_func_enter_; + + if (pnetwork == NULL) + goto exit; + + _enter_critical_bh(&queue->lock, &irqL); + + rtw_list_insert_tail(&pnetwork->list, &queue->queue); + + _exit_critical_bh(&queue->lock, &irqL); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +struct wlan_network *_rtw_dequeue_network(_queue *queue) +{ + _irqL irqL; + + struct wlan_network *pnetwork; + +_func_enter_; + + _enter_critical_bh(&queue->lock, &irqL); + + if (_rtw_queue_empty(queue) == _TRUE) + + pnetwork = NULL; + + else + { + pnetwork = LIST_CONTAINOR(get_next(&queue->queue), struct wlan_network, list); + + rtw_list_delete(&(pnetwork->list)); + } + + _exit_critical_bh(&queue->lock, &irqL); + +_func_exit_; + + return pnetwork; +} + +struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) +{ + _irqL irqL; + struct wlan_network *pnetwork; + _queue *free_queue = &pmlmepriv->free_bss_pool; + _list* plist = NULL; + +_func_enter_; + + _enter_critical_bh(&free_queue->lock, &irqL); + + if (_rtw_queue_empty(free_queue) == _TRUE) { + pnetwork=NULL; + goto exit; + } + plist = get_next(&(free_queue->queue)); + + pnetwork = LIST_CONTAINOR(plist , struct wlan_network, list); + + rtw_list_delete(&pnetwork->list); + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("_rtw_alloc_network: ptr=%p\n", plist)); + pnetwork->network_type = 0; + pnetwork->fixed = _FALSE; + pnetwork->last_scanned = rtw_get_current_time(); + pnetwork->aid=0; + pnetwork->join_res=0; + + pmlmepriv->num_of_scanned ++; + +exit: + _exit_critical_bh(&free_queue->lock, &irqL); + +_func_exit_; + + return pnetwork; +} + +void _rtw_free_network(struct mlme_priv *pmlmepriv ,struct wlan_network *pnetwork, u8 isfreeall) +{ + u32 curr_time, delta_time; + u32 lifetime = SCANQUEUE_LIFETIME; + _irqL irqL; + _queue *free_queue = &(pmlmepriv->free_bss_pool); + +_func_enter_; + + if (pnetwork == NULL) + goto exit; + + if (pnetwork->fixed == _TRUE) + goto exit; + + curr_time = rtw_get_current_time(); + + if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) + lifetime = 1; + + if(!isfreeall) + { +#ifdef PLATFORM_WINDOWS + + delta_time = (curr_time -pnetwork->last_scanned)/10; + + if(delta_time < lifetime*1000000)// unit:usec + { + goto exit; + } + +#endif + +#ifdef PLATFORM_LINUX + + delta_time = (curr_time -pnetwork->last_scanned)/HZ; + + if(delta_time < lifetime)// unit:sec + { + goto exit; + } + +#endif + } + + _enter_critical_bh(&free_queue->lock, &irqL); + + rtw_list_delete(&(pnetwork->list)); + + rtw_list_insert_tail(&(pnetwork->list),&(free_queue->queue)); + + pmlmepriv->num_of_scanned --; + + + //DBG_871X("_rtw_free_network:SSID=%s\n", pnetwork->network.Ssid.Ssid); + + _exit_critical_bh(&free_queue->lock, &irqL); + +exit: + +_func_exit_; + +} + +void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork) +{ + + _queue *free_queue = &(pmlmepriv->free_bss_pool); + +_func_enter_; + + if (pnetwork == NULL) + goto exit; + + if (pnetwork->fixed == _TRUE) + goto exit; + + //_enter_critical(&free_queue->lock, &irqL); + + rtw_list_delete(&(pnetwork->list)); + + rtw_list_insert_tail(&(pnetwork->list), get_list_head(free_queue)); + + pmlmepriv->num_of_scanned --; + + //_exit_critical(&free_queue->lock, &irqL); + +exit: + +_func_exit_; + +} + + +/* + return the wlan_network with the matching addr + + Shall be calle under atomic context... to avoid possible racing condition... +*/ +struct wlan_network *_rtw_find_network(_queue *scanned_queue, u8 *addr) +{ + + _irqL irqL; + _list *phead, *plist; + struct wlan_network *pnetwork = NULL; + u8 zero_addr[ETH_ALEN] = {0,0,0,0,0,0}; + +_func_enter_; + + if(_rtw_memcmp(zero_addr, addr, ETH_ALEN)){ + pnetwork=NULL; + goto exit; + } + + _enter_critical_bh(&scanned_queue->lock, &irqL); + + phead = get_list_head(scanned_queue); + plist = get_next(phead); + + while (plist != phead) + { + pnetwork = LIST_CONTAINOR(plist, struct wlan_network ,list); + + if (_rtw_memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE) + break; + + plist = get_next(plist); + } + + if(plist == phead) + pnetwork = NULL; + + _exit_critical_bh(&scanned_queue->lock, &irqL); + +exit: + +_func_exit_; + + return pnetwork; + +} + + +void _rtw_free_network_queue(_adapter *padapter, u8 isfreeall) +{ + _irqL irqL; + _list *phead, *plist; + struct wlan_network *pnetwork; + struct mlme_priv* pmlmepriv = &padapter->mlmepriv; + _queue *scanned_queue = &pmlmepriv->scanned_queue; + _queue *free_queue = &pmlmepriv->free_bss_pool; + u8 *mybssid = get_bssid(pmlmepriv); + +_func_enter_; + + + _enter_critical_bh(&scanned_queue->lock, &irqL); + + phead = get_list_head(scanned_queue); + plist = get_next(phead); + + while (rtw_end_of_queue_search(phead, plist) == _FALSE) + { + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + plist = get_next(plist); + + _rtw_free_network(pmlmepriv,pnetwork, isfreeall); + + } + + _exit_critical_bh(&scanned_queue->lock, &irqL); + +_func_exit_; + +} + + + + +sint rtw_if_up(_adapter *padapter) { + + sint res; +_func_enter_; + + if( padapter->bDriverStopped || padapter->bSurpriseRemoved || + (check_fwstate(&padapter->mlmepriv, _FW_LINKED)== _FALSE)){ + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_if_up:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + res=_FALSE; + } + else + res= _TRUE; + +_func_exit_; + return res; +} + + +void rtw_generate_random_ibss(u8* pibss) +{ + u32 curtime = rtw_get_current_time(); + +_func_enter_; + pibss[0] = 0x02; //in ad-hoc mode bit1 must set to 1 + pibss[1] = 0x11; + pibss[2] = 0x87; + pibss[3] = (u8)(curtime & 0xff) ;//p[0]; + pibss[4] = (u8)((curtime>>8) & 0xff) ;//p[1]; + pibss[5] = (u8)((curtime>>16) & 0xff) ;//p[2]; +_func_exit_; + return; +} + +u8 *rtw_get_capability_from_ie(u8 *ie) +{ + return (ie + 8 + 2); +} + + +u16 rtw_get_capability(WLAN_BSSID_EX *bss) +{ + u16 val; +_func_enter_; + + _rtw_memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2); + +_func_exit_; + return le16_to_cpu(val); +} + +u8 *rtw_get_timestampe_from_ie(u8 *ie) +{ + return (ie + 0); +} + +u8 *rtw_get_beacon_interval_from_ie(u8 *ie) +{ + return (ie + 8); +} + + +int rtw_init_mlme_priv (_adapter *padapter)//(struct mlme_priv *pmlmepriv) +{ + int res; +_func_enter_; + res = _rtw_init_mlme_priv(padapter);// (pmlmepriv); +_func_exit_; + return res; +} + +void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_mlme_priv\n")); + _rtw_free_mlme_priv (pmlmepriv); +_func_exit_; +} + +int rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) +{ + int res; +_func_enter_; + res = _rtw_enqueue_network(queue, pnetwork); +_func_exit_; + return res; +} + + + +static struct wlan_network *rtw_dequeue_network(_queue *queue) +{ + struct wlan_network *pnetwork; +_func_enter_; + pnetwork = _rtw_dequeue_network(queue); +_func_exit_; + return pnetwork; +} + + +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) +{ + struct wlan_network *pnetwork; +_func_enter_; + pnetwork = _rtw_alloc_network(pmlmepriv); +_func_exit_; + return pnetwork; +} + +void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall)//(struct wlan_network *pnetwork, _queue *free_queue) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); + _rtw_free_network(pmlmepriv, pnetwork, is_freeall); +_func_exit_; +} + + +void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork ) +{ +_func_enter_; + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); + _rtw_free_network_nolock(pmlmepriv, pnetwork); +_func_exit_; +} + + +void rtw_free_network_queue(_adapter* dev, u8 isfreeall) +{ +_func_enter_; + _rtw_free_network_queue(dev, isfreeall); +_func_exit_; +} + +/* + return the wlan_network with the matching addr + + Shall be calle under atomic context... to avoid possible racing condition... +*/ +struct wlan_network *rtw_find_network(_queue *scanned_queue, u8 *addr) +{ + struct wlan_network *pnetwork = _rtw_find_network(scanned_queue, addr); + + return pnetwork; +} + +int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork) +{ + int ret=_TRUE; + struct security_priv *psecuritypriv = &adapter->securitypriv; + + if ( (psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ ) && + ( pnetwork->network.Privacy == 0 ) ) + { + ret=_FALSE; + } + else if((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_ ) && + ( pnetwork->network.Privacy == 1 ) ) + { + ret=_FALSE; + } + else + { + ret=_TRUE; + } + + return ret; + +} + +inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b) +{ + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(%s,%d)(%s,%d)\n", + // a->Ssid.Ssid,a->Ssid.SsidLength,b->Ssid.Ssid,b->Ssid.SsidLength)); + return (a->Ssid.SsidLength == b->Ssid.SsidLength) + && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE; +} + +static int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst) +{ + u16 s_cap, d_cap; + +_func_enter_; + +#ifdef PLATFORM_OS_XP + if ( ((uint)dst) <= 0x7fffffff || + ((uint)src) <= 0x7fffffff || + ((uint)&s_cap) <= 0x7fffffff || + ((uint)&d_cap) <= 0x7fffffff) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n@@@@ error address of dst\n")); + + KeBugCheckEx(0x87110000, (ULONG_PTR)dst, (ULONG_PTR)src,(ULONG_PTR)&s_cap, (ULONG_PTR)&d_cap); + + return _FALSE; + } +#endif + + + _rtw_memcpy((u8 *)&s_cap, rtw_get_capability_from_ie(src->IEs), 2); + _rtw_memcpy((u8 *)&d_cap, rtw_get_capability_from_ie(dst->IEs), 2); + + + s_cap = le16_to_cpu(s_cap); + d_cap = le16_to_cpu(d_cap); + +_func_exit_; + + return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) && + (src->Configuration.DSConfig == dst->Configuration.DSConfig) && + ( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) && + ( (_rtw_memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength)) == _TRUE) && + ((s_cap & WLAN_CAPABILITY_IBSS) == + (d_cap & WLAN_CAPABILITY_IBSS)) && + ((s_cap & WLAN_CAPABILITY_BSS) == + (d_cap & WLAN_CAPABILITY_BSS))); + +} + +struct wlan_network * rtw_get_oldest_wlan_network(_queue *scanned_queue) +{ + _list *plist, *phead; + + + struct wlan_network *pwlan = NULL; + struct wlan_network *oldest = NULL; +_func_enter_; + phead = get_list_head(scanned_queue); + + plist = get_next(phead); + + while(1) + { + + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pwlan= LIST_CONTAINOR(plist, struct wlan_network, list); + + if(pwlan->fixed!=_TRUE) + { + if (oldest == NULL ||time_after(oldest->last_scanned, pwlan->last_scanned)) + oldest = pwlan; + } + + plist = get_next(plist); + } +_func_exit_; + return oldest; + +} + +static void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src,_adapter * padapter) +{ + u32 last_evm = 0, tmpVal; + +_func_enter_; + +#ifdef CONFIG_ANTENNA_DIVERSITY + padapter->HalFunc.SwAntDivCompareHandler(padapter, dst, src); +#endif + + + //Update signal strength first. Alwlays using the newest value will cause large vibration of scan result's signal strength + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) { + //Because we've process the rx phy info in rtl8192c_process_phy_info/rtl8192d_process_phy_info, + //we can just take the recvpriv's value + src->PhyInfo.SignalStrength = padapter->recvpriv.signal_strength; + src->PhyInfo.SignalQuality = padapter->recvpriv.signal_qual; + src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal_strength); + } + else { + src->PhyInfo.SignalStrength = (src->PhyInfo.SignalStrength+dst->PhyInfo.SignalStrength*4)/5; + src->PhyInfo.SignalQuality = (src->PhyInfo.SignalQuality+dst->PhyInfo.SignalQuality*4)/5; + src->Rssi=(src->Rssi+dst->Rssi*4)/5; + } + + + _rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src)); + + #if 0 + if(dst->Ssid.Ssid[0]=='j') { + DBG_871X("%s %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, rssi:%d\n", __FUNCTION__ + , dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, (int)dst->Rssi); + } + #endif + +#if 0 // old codes, may be useful one day... +// DBG_8192C("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi); + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) + { + + //DBG_8192C("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal); + if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) + { + padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; + last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; + padapter->recvpriv.signal_qual_data.total_val -= last_evm; + } + padapter->recvpriv.signal_qual_data.total_val += query_rx_pwr_percentage(src->Rssi); + + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = query_rx_pwr_percentage(src->Rssi); + if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) + padapter->recvpriv.signal_qual_data.index = 0; + + //DBG_8192C("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, src->Rssi); + + // <1> Showed on UI for user,in percentage. + tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; + padapter->recvpriv.signal=(u8)tmpVal;//Link quality + + src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal) ; + } + else{ +// DBG_8192C("ELSE:ssid=%s update_network: src->rssi=0x%d dst->rssi=%d\n",src->Ssid.Ssid,src->Rssi,dst->Rssi); + src->Rssi=(src->Rssi +dst->Rssi)/2;//dBM + } + +// DBG_8192C("a:update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Rssi,padapter->recvpriv.signal); + +#endif + +_func_exit_; +} + +static void update_current_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) +{ + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + +_func_enter_; + +#ifdef PLATFORM_OS_XP + if ((unsigned long)(&(pmlmepriv->cur_network.network)) < 0x7ffffff) + { + KeBugCheckEx(0x87111c1c, (ULONG_PTR)(&(pmlmepriv->cur_network.network)), 0, 0,0); + } +#endif + + if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork))) + { + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n"); + + //if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength) + { + update_network(&(pmlmepriv->cur_network.network), pnetwork,adapter); + rtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), + pmlmepriv->cur_network.network.IELength); + } + } + +_func_exit_; + +} + + +/* + +Caller must hold pmlmepriv->lock first. + + +*/ +void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target) +{ + _list *plist, *phead; + ULONG bssid_ex_sz; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + struct wlan_network *oldest = NULL; + +_func_enter_; + + phead = get_list_head(queue); + plist = get_next(phead); + + while(1) + { + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + if ((unsigned long)(pnetwork) < 0x7ffffff) + { +#ifdef PLATFORM_OS_XP + KeBugCheckEx(0x87111c1c, (ULONG_PTR)pnetwork, 0, 0,0); +#endif + } + + if (is_same_network(&(pnetwork->network), target)) + break; + + if ((oldest == ((struct wlan_network *)0)) || + time_after(oldest->last_scanned, pnetwork->last_scanned)) + oldest = pnetwork; + + plist = get_next(plist); + + } + + + /* If we didn't find a match, then get a new network slot to initialize + * with this beacon's information */ + if (rtw_end_of_queue_search(phead,plist)== _TRUE) { + + if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) { + /* If there are no more slots, expire the oldest */ + //list_del_init(&oldest->list); + pnetwork = oldest; + +#ifdef CONFIG_ANTENNA_DIVERSITY + //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); +#endif + _rtw_memcpy(&(pnetwork->network), target, get_WLAN_BSSID_EX_sz(target)); + pnetwork->last_scanned = rtw_get_current_time(); + //variable initialize + pnetwork->fixed = _FALSE; + pnetwork->last_scanned = rtw_get_current_time(); + + pnetwork->network_type = 0; + pnetwork->aid=0; + pnetwork->join_res=0; + } + else { + /* Otherwise just pull from the free list */ + + pnetwork = rtw_alloc_network(pmlmepriv); // will update scan_time + + if(pnetwork==NULL){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n\nsomething wrong here\n\n\n")); + goto exit; + } + + bssid_ex_sz = get_WLAN_BSSID_EX_sz(target); + target->Length = bssid_ex_sz; +#ifdef CONFIG_ANTENNA_DIVERSITY + //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna; + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); +#endif + _rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz ); + + rtw_list_insert_tail(&(pnetwork->list),&(queue->queue)); + + } + } + else { + /* we have an entry and we are going to update it. But this entry may + * be already expired. In this case we do the same as we found a new + * net and call the new_net handler + */ + + //target.Reserved[0]==1, means that scaned network is a bcn frame. + if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1)) + goto exit; + + update_network(&(pnetwork->network),target,adapter); + + pnetwork->last_scanned = rtw_get_current_time(); + + } + +exit: + +_func_exit_; + +} + + +void rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(((_adapter *)adapter)->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + +_func_enter_; + + _enter_critical_bh(&queue->lock, &irqL); + + update_current_network(adapter, pnetwork); + + rtw_update_scanned_network(adapter, pnetwork); + + _exit_critical_bh(&queue->lock, &irqL); + +_func_exit_; +} + +//select the desired network based on the capability of the (i)bss. +// check items: (1) security +// (2) network_type +// (3) WMM +// (4) HT +// (5) others +int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) +{ + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + u32 desired_encmode; + u32 privacy; + + //u8 wps_ie[512]; + uint wps_ielen; + + int bselected = _TRUE; + + desired_encmode = psecuritypriv->ndisencryptstatus; + privacy = pnetwork->network.Privacy; + + if(psecuritypriv->wps_phase == _TRUE) + { + if(rtw_get_wps_ie(pnetwork->network.IEs, pnetwork->network.IELength, NULL, &wps_ielen)!=NULL) + { + //rtw_disassoc_cmd(adapter); + //rtw_indicate_disconnect(adapter); + //rtw_free_assoc_resources(adapter); + return _TRUE; + } + else + { + return _FALSE; + } + } + if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do.... + { + if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) + bselected = _FALSE; + } + + + if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) { + DBG_871X("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy); + bselected = _FALSE; + } + + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) + { + if(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode) + bselected = _FALSE; + } + + + return bselected; +} + +/* TODO: Perry : For Power Management */ +void rtw_atimdone_event_callback(_adapter *adapter , u8 *pbuf) +{ + +_func_enter_; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("receive atimdone_evet\n")); +_func_exit_; + return; +} + + +void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL; + u32 len; + WLAN_BSSID_EX *pnetwork; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + +_func_enter_; + + pnetwork = (WLAN_BSSID_EX *)pbuf; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_survey_event_callback, ssid=%s\n", pnetwork->Ssid.Ssid)); + +#ifdef CONFIG_RTL8712 + //endian_convert + pnetwork->Length = le32_to_cpu(pnetwork->Length); + pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); + pnetwork->Privacy =le32_to_cpu( pnetwork->Privacy); + pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); + pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); + pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); + pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); + pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); + pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); + pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); + pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); + pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); + pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); + pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); + pnetwork->IELength = le32_to_cpu(pnetwork->IELength); +#endif + + len = get_WLAN_BSSID_EX_sz(pnetwork); + if(len > (sizeof(WLAN_BSSID_EX))) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n ****rtw_survey_event_callback: return a wrong bss ***\n")); + goto exit; + } + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + // update IBSS_network 's timestamp + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) + { + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"rtw_survey_event_callback : WIFI_ADHOC_MASTER_STATE \n\n"); + if(_rtw_memcmp(&(pmlmepriv->cur_network.network.MacAddress), pnetwork->MacAddress, ETH_ALEN)) + { + struct wlan_network* ibss_wlan = NULL; + + _rtw_memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8); + + ibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->MacAddress); + if(ibss_wlan) + { + _rtw_memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8); + goto exit; + } + } + } + + // lock pmlmepriv->lock when you accessing network_q + if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _FALSE) + { + if( pnetwork->Ssid.Ssid[0] == 0 ) + { + pnetwork->Ssid.SsidLength = 0; + } + rtw_add_network(adapter, pnetwork); + } + +exit: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +_func_exit_; + + return; +} + + + +void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + +#ifdef CONFIG_MLME_EXT + + mlmeext_surveydone_event_callback(adapter); + +#endif + +_func_enter_; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_surveydone_event_callback: fw_state:%x\n\n", get_fwstate(pmlmepriv))); + + if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY)) + { + u8 timer_cancelled; + + _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); + + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + } + else { + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv))); + } + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + + if(pmlmepriv->to_join == _TRUE) + { + if((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) ) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)==_FALSE) + { + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); + + if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) + { + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT ); + } + else + { + WLAN_BSSID_EX *pdev_network = &(adapter->registrypriv.dev_network); + u8 *pibss = adapter->registrypriv.dev_network.MacAddress; + + //pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;//because don't set assoc_timer + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("switching to adhoc master\n")); + + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); + + rtw_update_registrypriv_dev_network(adapter); + rtw_generate_random_ibss(pibss); + + pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; + + if(rtw_createbss_cmd(adapter)!=_SUCCESS) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error=>rtw_createbss_cmd status FAIL\n")); + } + + pmlmepriv->to_join = _FALSE; + } + } + } + else + { + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); + pmlmepriv->to_join = _FALSE; + if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) + { + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + } + else + { + #ifdef CONFIG_LAYER2_ROAMING + DBG_871X("try_to_join, but select scanning queue fail, to_roaming:%d\n", pmlmepriv->to_roaming); + #else + DBG_871X("try_to_join, but select scanning queue fail\n"); + #endif + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming!=0) { + if( --pmlmepriv->to_roaming == 0 + || _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid) + ) { + pmlmepriv->to_roaming = 0; + rtw_free_assoc_resources(adapter); + rtw_indicate_disconnect(adapter); + } else { + pmlmepriv->to_join = _TRUE; + } + } + #endif + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + } + } + //else + { + /* + * 20110324 Commented by Jeff + * indicate the scan complete event when this scan isn't caused by join + */ + indicate_wx_scan_complete_event(adapter); + + //DBG_871X("scan complete in %dms\n",rtw_get_passing_time_ms(pmlmepriv->scan_start_time)); + + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0); +#endif //CONFIG_P2P + + rtw_os_xmit_schedule(adapter); + +#ifdef CONFIG_DRVEXT_MODULE_WSC + drvext_surveydone_callback(&adapter->drvextpriv); +#endif + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + if(pmlmeext->sitesurvey_res.bss_cnt == 0){ + if(adapter->HalFunc.silentreset) + adapter->HalFunc.silentreset(adapter); + } + } + #endif +_func_exit_; + +} + +void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf) +{ + +} + +void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf) +{ + +} + +static void free_scanqueue(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + _queue *free_queue = &pmlmepriv->free_bss_pool; + _queue *scan_queue = &pmlmepriv->scanned_queue; + _list *plist, *phead, *ptemp; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+free_scanqueue\n")); + + _enter_critical_bh(&free_queue->lock, &irqL); + + phead = get_list_head(scan_queue); + plist = get_next(phead); + + while (plist != phead) + { + ptemp = get_next(plist); + rtw_list_delete(plist); + rtw_list_insert_tail(plist, &free_queue->queue); + plist =ptemp; + pmlmepriv->num_of_scanned --; + } + + _exit_critical_bh(&free_queue->lock, &irqL); + +_func_exit_; +} + +/* +*rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock +*/ +void rtw_free_assoc_resources(_adapter *adapter ) +{ + _irqL irqL; + struct wlan_network* pwlan = NULL; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct mlme_ext_info *pmlmeinfo = &adapter->mlmeextpriv.mlmext_info; + struct sta_priv *pstapriv = &adapter->stapriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_free_assoc_resources\n")); + + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("tgt_network->network.MacAddress="MAC_FMT" ssid=%s\n", + MAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.Ssid)); + + if(check_fwstate( pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE)) + { + struct sta_info* psta; + + psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + } + + if(check_fwstate( pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) + { + struct sta_info* psta; + + rtw_free_all_stainfo(adapter); + + psta = rtw_get_bcmc_stainfo(adapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + rtw_init_bcmc_stainfo(adapter); + } + + if(pwlan) + { + pwlan->fixed = _FALSE; + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_assoc_resources : pwlan== NULL \n\n")); + } + + + if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1)) + /*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/) + { + rtw_free_network_nolock(pmlmepriv, pwlan); + } + pmlmepriv->key_mask = 0; + +_func_exit_; + +} + +/* +*rtw_indicate_connect: the caller has to lock pmlmepriv->lock +*/ +void rtw_indicate_connect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_connect\n")); + + pmlmepriv->to_join = _FALSE; +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ANTENNA_DIVERSITY_LINK, 0); +#endif + set_fwstate(pmlmepriv, _FW_LINKED); + + rtw_led_control(padapter, LED_CTL_LINK); + +#ifdef CONFIG_DRVEXT_MODULE + if(padapter->drvextpriv.enable_wpa) + { + indicate_l2_connect(padapter); + } + else +#endif + { + rtw_os_indicate_connect(padapter); + } + + #ifdef CONFIG_LAYER2_ROAMING + pmlmepriv->to_roaming=0; + #endif + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + rtw_set_scan_deny(pmlmepriv, 3000); + #endif + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("-rtw_indicate_connect: fw_state=0x%08x\n", get_fwstate(pmlmepriv))); + +_func_exit_; + +} + + +/* +*rtw_indicate_connect: the caller has to lock pmlmepriv->lock +*/ +void rtw_indicate_disconnect( _adapter *padapter ) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_disconnect\n")); + + _clr_fwstate_(pmlmepriv, _FW_LINKED); + + rtw_led_control(padapter, LED_CTL_NO_LINK); + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming<=0) + #endif + rtw_os_indicate_disconnect(padapter); + +#ifdef CONFIG_LPS + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); +#endif + +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); +#endif //CONFIG_P2P + +_func_exit_; +} + +//Notes: +//pnetwork : returns from rtw_joinbss_event_callback +//ptarget_wlan: found from scanned_queue +//if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist. +//if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. +//if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan !=NULL). +// + + +//#define REJOIN +#ifdef CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP +void joinbss_event_prehandle(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL,irqL2; + int res; + static u8 retry=0; + u8 timer_cancelled; + struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; + unsigned int the_same_macaddr = _FALSE; + +_func_enter_; + +#ifdef CONFIG_RTL8712 + //endian_convert + pnetwork->join_res = le32_to_cpu(pnetwork->join_res); + pnetwork->network_type = le32_to_cpu(pnetwork->network_type); + pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length); + pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength); + pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy); + pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi); + pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; + pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow); + pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod); + pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); + pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); + pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); + pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); + pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); + pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length); + pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode); + pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength ); +#endif + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res)); + + rtw_get_encrypt_decrypt_from_registrypriv(adapter); + + + if (pmlmepriv->assoc_ssid.SsidLength == 0) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n")); + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); + } + + the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); + + pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network); + if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n")); + goto ignore_joinbss_callback; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n")); + + if(pnetwork->join_res > 0) + { + retry = 0; + if (check_fwstate(pmlmepriv,_FW_UNDER_LINKING) ) + { + //s1. find ptarget_wlan + if(check_fwstate(pmlmepriv, _FW_LINKED) ) + { + if(the_same_macaddr == _TRUE) + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + } + else + { + pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + if(pcur_wlan) pcur_wlan->fixed = _FALSE; + + pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); + if(pcur_sta){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + rtw_free_stainfo(adapter, pcur_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + } + + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + + } + else + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + + if(ptarget_wlan == NULL) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + //s2. find ptarget_sta & update ptarget_sta + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + ptarget_sta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); + if(ptarget_sta==NULL) { + ptarget_sta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); + } + + if(ptarget_sta) //update ptarget_sta + { + ptarget_sta->aid = pnetwork->join_res; + ptarget_sta->qos_option = 1;//? + ptarget_sta->mac_id=0; + + if(adapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X) + { + adapter->securitypriv.binstallGrpkey=_FALSE; + adapter->securitypriv.busetkipkey=_FALSE; + adapter->securitypriv.bgrpkey_handshake=_FALSE; + + ptarget_sta->ieee8021x_blocked=_TRUE; + ptarget_sta->dot118021XPrivacy=adapter->securitypriv.dot11PrivacyAlgrthm; + + _rtw_memset((u8 *)&ptarget_sta->dot118021x_UncstKey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11tkiprxmickey, 0, sizeof (union Keytype)); + _rtw_memset((u8 *)&ptarget_sta->dot11tkiptxmickey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11txpn, 0, sizeof (union pn48)); + _rtw_memset((u8 *)&ptarget_sta->dot11rxpn, 0, sizeof (union pn48)); + } + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't allocate stainfo when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + } + + //s3. update cur_network & indicate connect + if(ptarget_wlan) + { + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:"MAC_FMT"\n" + ,get_fwstate(pmlmepriv), MAC_ARG(pnetwork->network.MacAddress))); + + + // why not use ptarget_wlan?? + _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); + cur_network->aid = pnetwork->join_res; + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + adapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; + adapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; + //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) + adapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + + //update fw_state //will clr _FW_UNDER_LINKING here indirectly + switch(pnetwork->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + pmlmepriv->fw_state = WIFI_STATION_STATE; + break; + case Ndis802_11IBSS: + pmlmepriv->fw_state = WIFI_ADHOC_STATE; + break; + default: + pmlmepriv->fw_state = WIFI_NULL_STATE; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n")); + break; + } + + rtw_update_protection(adapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), + (cur_network->network.IELength)); + +#ifdef CONFIG_80211N_HT + //TODO: update HT_Capability + rtw_update_ht_cap(adapter, cur_network->network.IEs, cur_network->network.IELength); +#endif + + //indicate connect + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + //Set Value to 0 for prevent xmit data frame without hw setting done. + ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 0); + rtw_indicate_connect(adapter); + } + else + { + //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); + } + + + } + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer \n")); + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); + + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv))); + goto ignore_joinbss_callback; + } + + } + else if(pnetwork->join_res == -4) + { + rtw_reset_securitypriv(adapter); + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + } + else //if join_res < 0 (join fails), then try again + { + #ifdef REJOIN + res = rtw_select_and_join_from_scanned_queue(pmlmepriv); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res)); + if (res != _SUCCESS || retry>2) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n")); + #endif + + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + #ifdef REJOIN + retry = 0; + + } + else + { + //extend time of assoc_timer + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + + retry++; + } + #endif + } + +ignore_joinbss_callback: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + _func_exit_; +} + +void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf) +{ + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + +_func_enter_; + + mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); + + //Set Value to 1 to xmit data frame. + ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 1); + rtw_os_xmit_schedule(adapter); + +_func_exit_; +} + +#else //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP +void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL,irqL2; + int res; + static u8 retry=0; + u8 timer_cancelled; + struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; + unsigned int the_same_macaddr = _FALSE; + +_func_enter_; + +#ifdef CONFIG_RTL8712 + //endian_convert + pnetwork->join_res = le32_to_cpu(pnetwork->join_res); + pnetwork->network_type = le32_to_cpu(pnetwork->network_type); + pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length); + pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength); + pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy); + pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi); + pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; + pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow); + pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod); + pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); + pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); + pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); + pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); + pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); + pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length); + pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode); + pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength ); +#endif + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res)); + + rtw_get_encrypt_decrypt_from_registrypriv(adapter); + + + if (pmlmepriv->assoc_ssid.SsidLength == 0) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n")); + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); + } + + the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); + + pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network); + if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n")); + goto ignore_joinbss_callback; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n")); + + if(pnetwork->join_res > 0) + { + retry = 0; + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) ) + { + //s1. find ptarget_wlan + if(check_fwstate(pmlmepriv, _FW_LINKED) ) + { + if(the_same_macaddr == _TRUE) + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + } + else + { + pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + if(pcur_wlan) pcur_wlan->fixed = _FALSE; + + pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); + if(pcur_sta){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + rtw_free_stainfo(adapter, pcur_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + } + + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + } + else + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + + if(ptarget_wlan == NULL) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + //s2. find ptarget_sta & update ptarget_sta + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + ptarget_sta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); + if(ptarget_sta==NULL) + { + //DBG_8192C("==> %s #1, call rtw_alloc_stainfo\n",__FUNCTION__); + ptarget_sta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); + } + + if(ptarget_sta) //update ptarget_sta + { + ptarget_sta->aid = pnetwork->join_res; + ptarget_sta->qos_option = 1;//? + ptarget_sta->mac_id=0; + + if(adapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X) + { + adapter->securitypriv.binstallGrpkey=_FALSE; + adapter->securitypriv.busetkipkey=_FALSE; + adapter->securitypriv.bgrpkey_handshake=_FALSE; + + ptarget_sta->ieee8021x_blocked=_TRUE; + ptarget_sta->dot118021XPrivacy=adapter->securitypriv.dot11PrivacyAlgrthm; + + _rtw_memset((u8 *)&ptarget_sta->dot118021x_UncstKey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11tkiprxmickey, 0, sizeof (union Keytype)); + _rtw_memset((u8 *)&ptarget_sta->dot11tkiptxmickey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11txpn, 0, sizeof (union pn48)); + _rtw_memset((u8 *)&ptarget_sta->dot11rxpn, 0, sizeof (union pn48)); + } + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't allocate stainfo when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + } + + //s3. update cur_network & indicate connect + if(ptarget_wlan) + { + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:%x:%x:%x:%x:%x:%x\n",get_fwstate(pmlmepriv), + pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], + pnetwork->network.MacAddress[2], pnetwork->network.MacAddress[3], + pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5])); + + + _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); + cur_network->aid = pnetwork->join_res; + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + adapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; + adapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; + //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) + adapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + + //update fw_state //will clr _FW_UNDER_LINKING here indirectly + switch(pnetwork->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + pmlmepriv->fw_state = WIFI_STATION_STATE; + break; + case Ndis802_11IBSS: + pmlmepriv->fw_state = WIFI_ADHOC_STATE; + break; + default: + pmlmepriv->fw_state = WIFI_NULL_STATE; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n")); + break; + } + + rtw_update_protection(adapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), + (cur_network->network.IELength)); + +#ifdef CONFIG_80211N_HT + //TODO: update HT_Capability + rtw_update_ht_cap(adapter, cur_network->network.IEs, cur_network->network.IELength); +#endif + + //indicate connect + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + rtw_indicate_connect(adapter); + } + else + { + //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); + } + + + } + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer \n")); + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); + + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv))); + goto ignore_joinbss_callback; + } + + } + else if(pnetwork->join_res == -4) + { + rtw_reset_securitypriv(adapter); + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + } + else //if join_res < 0 (join fails), then try again + { + #ifdef REJOIN + res = rtw_select_and_join_from_scanned_queue(pmlmepriv); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res)); + if (res != _SUCCESS || retry>2) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n")); + + #endif + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + #ifdef REJOIN + retry = 0; + + } + else + { + //extend time of assoc_timer + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + + retry++; + } + #endif + + } + +ignore_joinbss_callback: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); + +_func_exit_; + +} +#endif //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + +void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL; + struct sta_info *psta; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct stassoc_event *pstassoc = (struct stassoc_event*)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wlan_network *ptarget_wlan = NULL; + +_func_enter_; + + // to do: + if(rtw_access_ctrl(&adapter->acl_list, pstassoc->macaddr) == _FALSE) + return; + +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); + if(psta) + { + bss_cap_update(adapter, psta); + + sta_info_update(adapter, psta); + } + + goto exit; + } +#endif + + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); + if( psta != NULL) + { + //the sta have been in sta_info_queue => do nothing + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error: rtw_stassoc_event_callback: sta has been in sta_hash_queue \n")); + + goto exit; //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) + } + + psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr); + if (psta == NULL) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't alloc sta_info when rtw_stassoc_event_callback\n")); + goto exit; + } + + //to do : init sta_info variable + psta->qos_option = 0; + psta->mac_id = le32_to_cpu((uint)pstassoc->cam_id); + //psta->aid = (uint)pstassoc->cam_id; + + if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) + psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; + + psta->ieee8021x_blocked = _FALSE; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) + { + if(adapter->stapriv.asoc_sta_count== 2) + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + + // a sta + bc/mc_stainfo (not Ibss_stainfo) + rtw_indicate_connect(adapter); + } + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + + mlmeext_sta_add_event_callback(adapter, psta); + +#ifdef CONFIG_RTL8711 + //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta + rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE); +#endif + +exit: + +_func_exit_; + +} + +void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL,irqL2; + struct sta_info *psta; + struct wlan_network* pwlan = NULL; + WLAN_BSSID_EX *pdev_network=NULL; + u8* pibss = NULL; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct stadel_event *pstadel = (struct stadel_event*)pbuf; + struct sta_priv *pstapriv = &adapter->stapriv; + struct wlan_network *tgt_network = &(pmlmepriv->cur_network); + +_func_enter_; + + mlmeext_sta_del_event_callback(adapter); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + return; + + _enter_critical_bh(&pmlmepriv->lock, &irqL2); + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) + { + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming > 0) + pmlmepriv->to_roaming--; // this stadel_event is caused by roaming, decrease to_roaming + else if(pmlmepriv->to_roaming ==0) + pmlmepriv->to_roaming= adapter->registrypriv.max_roaming_times; + + if(*((unsigned short *)(pstadel->rsvd)) !=65535 ) //if stadel_event isn't caused by no rx + pmlmepriv->to_roaming=0; // don't roam + #endif //CONFIG_LAYER2_ROAMING + + + rtw_free_assoc_resources(adapter); + rtw_indicate_disconnect(adapter); + + // remove the network entry in scanned_queue + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); + if (pwlan) { + pwlan->fixed = _FALSE; + rtw_free_network_nolock(pmlmepriv, pwlan); + } + + #ifdef CONFIG_LAYER2_ROAMING + _rtw_roaming(adapter, tgt_network); + #endif //CONFIG_LAYER2_ROAMING + + } + + if ( check_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE) || + check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) + { + psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + if(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo) + { + //rtw_indicate_disconnect(adapter);//removed@20091105 + + //free old ibss network + //pwlan = rtw_find_network(&pmlmepriv->scanned_queue, pstadel->macaddr); + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); + if(pwlan) + { + pwlan->fixed = _FALSE; + rtw_free_network_nolock(pmlmepriv, pwlan); + } + + //re-create ibss + pdev_network = &(adapter->registrypriv.dev_network); + pibss = adapter->registrypriv.dev_network.MacAddress; + + _rtw_memcpy(pdev_network, &tgt_network->network, get_WLAN_BSSID_EX_sz(&tgt_network->network)); + + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); + + rtw_update_registrypriv_dev_network(adapter); + + rtw_generate_random_ibss(pibss); + + if(check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) + { + set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE); + } + + if(rtw_createbss_cmd(adapter)!=_SUCCESS) + { + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>stadel_event_callback: rtw_createbss_cmd status FAIL*** \n ")); + + } + + + } + + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL2); + +_func_exit_; + +} + + +void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf) +{ + struct reportpwrstate_parm *preportpwrstate = (struct reportpwrstate_parm *)pbuf; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_cpwm_event_callback !!!\n")); +#ifdef CONFIG_PWRCTRL + preportpwrstate->state |= (u8)(adapter->pwrctrlpriv.cpwm_tog + 0x80); + cpwm_int_hdl(adapter, preportpwrstate); +#endif + +_func_exit_; + +} + +void _rtw_join_timeout_handler (_adapter *adapter) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + int do_join_r; + +#if 0 + if (adapter->bDriverStopped == _TRUE){ + _rtw_up_sema(&pmlmepriv->assoc_terminate); + return; + } +#endif + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n^^^rtw_join_timeout_handler ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_join_timeout_handler, fw_state=%x\n", get_fwstate(pmlmepriv))); + + if(adapter->bDriverStopped ||adapter->bSurpriseRemoved) + return; + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming>0) { // join timeout caused by roaming + while(1) { + pmlmepriv->to_roaming--; + if(pmlmepriv->to_roaming!=0) { //try another , + DBG_871X("%s try another roaming\n", __FUNCTION__); + if( _SUCCESS!=(do_join_r=rtw_do_join(adapter)) ) { + DBG_871X("%s roaming do_join return %d\n", __FUNCTION__ ,do_join_r); + continue; + } + break; + } else { + DBG_871X("%s We've try roaming but fail\n", __FUNCTION__); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + rtw_indicate_disconnect(adapter); + break; + } + } + + } else + #endif + { + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + //Jeff: Even if not linked, we still need to reset securitypriv + //if((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) + { + rtw_os_indicate_disconnect(adapter); + _clr_fwstate_(pmlmepriv, _FW_LINKED); + } + + free_scanqueue(pmlmepriv);//??? + rtw_led_control(adapter, LED_CTL_NO_LINK); + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + +#ifdef CONFIG_DRVEXT_MODULE_WSC + drvext_assoc_fail_indicate(&adapter->drvextpriv); +#endif + +_func_exit_; + +} + +void rtw_scan_timeout_handler (_adapter *adapter) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("\n^^^rtw_scan_timeout_handler ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) ) + { + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("fw status =%x, rtw_scan_timeout_handler: survey done event comes too late!\n", get_fwstate(pmlmepriv))); + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +} + +static void rtw_auto_scan_handler(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + + //auto site survey per 60sec + if(pmlmepriv->scan_interval >0) + { + pmlmepriv->scan_interval--; + if(pmlmepriv->scan_interval==0) + { + if( pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE ) + return; + +/* + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) + { + DBG_8192C("exit %s when _FW_UNDER_SURVEY|_FW_UNDER_LINKING -> \n", __FUNCTION__); + return; + } + + if(pmlmepriv->sitesurveyctrl.traffic_busy == _TRUE) + { + DBG_8192C("%s exit cause traffic_busy(%x)\n",__FUNCTION__, pmlmepriv->sitesurveyctrl.traffic_busy); + return; + } +*/ + + DBG_871X("%s\n", __FUNCTION__); + + rtw_set_802_11_bssid_list_scan(padapter); + + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + + } + + } + +} + +void rtw_dynamic_check_timer_handlder(_adapter *adapter) +{ +#ifdef CONFIG_AP_MODE + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; +#endif //CONFIG_AP_MODE + struct registry_priv *pregistrypriv = &adapter->registrypriv; + + if(adapter->hw_init_completed == _FALSE) + return; + + if ((adapter->bDriverStopped == _TRUE)||(adapter->bSurpriseRemoved== _TRUE)) + return; + + if(adapter->net_closed == _TRUE) + return; + + rtw_dynamic_chk_wk_cmd(adapter); + + if(pregistrypriv->wifi_spec==1) + { + //auto site survey + rtw_auto_scan_handler(adapter); + } + +#ifdef CONFIG_AP_MODE + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + expire_timeout_chk(adapter); + } +#endif + +} + + +#ifdef CONFIG_SET_SCAN_DENY_TIMER +void rtw_set_scan_deny_timer_hdl(_adapter *adapter) +{ + struct mlme_priv *mlmepriv = &adapter->mlmepriv; + + //allowed set scan + ATOMIC_SET(&mlmepriv->set_scan_deny, 0); +} + +void rtw_set_scan_deny(struct mlme_priv *mlmepriv, u32 ms) +{ + ATOMIC_SET(&mlmepriv->set_scan_deny, 1); + _set_timer(&mlmepriv->set_scan_deny_timer, ms); +} +#endif + + +/* +* Select a new join candidate from the original @param candidate and @param competitor +* @return _TRUE: candidate is updated +* @return _FALSE: candidate is not updated +*/ +static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv + , struct wlan_network **candidate, struct wlan_network *competitor) +{ + int updated = _FALSE; + _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv); + + if(pmlmepriv->assoc_by_bssid==_TRUE) { // associate with bssid + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) + && _rtw_memcmp(competitor->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE + ) { + *candidate = competitor; + updated = _TRUE; + } + } else if (pmlmepriv->assoc_ssid.SsidLength == 0 ) { // associate with ssid, but ssidlength is 0 + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) ) { + *candidate = competitor; + updated = _TRUE; + } + } else +#ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming) { // roaming + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) + && is_same_ess(&competitor->network, &pmlmepriv->cur_network.network) + //&&(!is_same_network(&competitor->network, &pmlmepriv->cur_network.network)) + && rtw_get_passing_time_ms((u32)competitor->last_scanned) < 5000 + && rtw_is_desired_network(adapter, competitor) + ) { + *candidate = competitor; + updated = _TRUE; + } + + } else +#endif + { // associate with ssid + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) + && (competitor->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength) + &&((_rtw_memcmp(competitor->network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE) + && rtw_is_desired_network(adapter, competitor) + ) { + *candidate = competitor; + updated = _TRUE; + } + } + + if(updated){ + DBG_871X("new candidate: %s("MAC_FMT") rssi:%d\n", + (*candidate)->network.Ssid.Ssid, + MAC_ARG((*candidate)->network.MacAddress), + (int)(*candidate)->network.Rssi + ); + } + + return updated; +} + + +/* +Calling context: +The caller of the sub-routine will be in critical section... + +The caller must hold the following spinlock + +pmlmepriv->lock + + +*/ +#if 1 +int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv ) +{ + int ret; + _list *phead; + _adapter *adapter; + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + struct wlan_network *candidate = NULL; + u8 bSupportAntDiv = _FALSE; +_func_enter_; + + phead = get_list_head(queue); + adapter = (_adapter *)pmlmepriv->nic_hdl; + + pmlmepriv->pscanned = get_next( phead ); + + while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { + + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); + if(pnetwork==NULL){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s return _FAIL:(pnetwork==NULL)\n", __FUNCTION__)); + ret = _FAIL; + goto exit; + } + + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); + + #if 0 + DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid); + #endif + + rtw_check_join_candidate(pmlmepriv, &candidate, pnetwork); + + } + + if(candidate == NULL) { + DBG_871X("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__); + ret = _FAIL; + goto exit; + } else { + DBG_871X("%s: candidate: %s("MAC_FMT")\n", __FUNCTION__, + candidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress));; + } + + + // check for situation of _FW_LINKED + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + DBG_871X("%s: _FW_LINKED while ask_for_joinbss!!!\n", __FUNCTION__); + + if(is_same_network(&pmlmepriv->cur_network.network, &candidate->network)) + { + DBG_871X("%s: _FW_LINKED and is same network, it needn't join again\n", __FUNCTION__); + + rtw_indicate_connect(adapter);//rtw_indicate_connect again + + ret = 2; + goto exit; + } + else + { + rtw_disassoc_cmd(adapter); + rtw_indicate_disconnect(adapter); + rtw_free_assoc_resources(adapter); + } + } + + #ifdef CONFIG_ANTENNA_DIVERSITY + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); + if(_TRUE == bSupportAntDiv) + { + u8 CurrentAntenna; + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); + DBG_8192C("#### Opt_Ant_(%s) , cur_Ant(%s)\n", + (2==candidate->network.PhyInfo.Optimum_antenna)?"A":"B", + (2==CurrentAntenna)?"A":"B" + ); + } + #endif + + ret = rtw_joinbss_cmd(adapter, candidate); + +exit: +_func_exit_; + + return ret; + +} +#else +int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv ) +{ + _list *phead; + u8 CurrentAntenna; + unsigned char *dst_ssid, *src_ssid; + _adapter *adapter; + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + struct wlan_network *pnetwork_max_rssi = NULL; + #ifdef CONFIG_LAYER2_ROAMING + struct wlan_network * roaming_candidate=NULL; + u32 cur_time=rtw_get_current_time(); + #endif + +_func_enter_; + + phead = get_list_head(queue); + adapter = (_adapter *)pmlmepriv->nic_hdl; + + pmlmepriv->pscanned = get_next( phead ); + + while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { + + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); + if(pnetwork==NULL){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(2)rtw_select_and_join_from_scanned_queue return _FAIL:(pnetwork==NULL)\n")); + return _FAIL; + } + + dst_ssid = pnetwork->network.Ssid.Ssid; + src_ssid = pmlmepriv->assoc_ssid.Ssid; + + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); + + #if 0 + DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid); + #endif + + if(pmlmepriv->assoc_by_bssid==_TRUE) + { + if(_rtw_memcmp(pnetwork->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE) + { + //remove the condition @ 20081125 + //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)|| + // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode) + // goto ask_for_joinbss; + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + { + //DBG_871X("select_and_join(1): _FW_LINKED and is same network, it needn't join again\n"); + + rtw_indicate_connect(adapter);//rtw_indicate_connect again + + return 2; + } + else + { + rtw_disassoc_cmd(adapter); + rtw_indicate_disconnect(adapter); + rtw_free_assoc_resources(adapter); + + goto ask_for_joinbss; + + } + } + else + { + goto ask_for_joinbss; + } + + } + + } else if (pmlmepriv->assoc_ssid.SsidLength == 0) { + goto ask_for_joinbss;//anyway, join first selected(dequeued) pnetwork if ssid_len=0 + + #ifdef CONFIG_LAYER2_ROAMING + } else if(pmlmepriv->to_roaming>0) { + + if( (roaming_candidate == NULL ||roaming_candidate->network.Rssinetwork.Rssi ) + && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network) + //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network)) + && rtw_get_time_interval_ms((u32)pnetwork->last_scanned,cur_time) < 5000 + ) { + roaming_candidate = pnetwork; + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_, + DBG_871X + ("roaming_candidate???: %s("MAC_FMT")\n", + roaming_candidate->network.Ssid.Ssid, MAC_ARG(roaming_candidate->network.MacAddress) ) + //) + ; + } + continue; + #endif + + } else if ( (pnetwork->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength) + &&((_rtw_memcmp(dst_ssid, src_ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE) + ) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("dst_ssid=%s, src_ssid=%s \n", dst_ssid, src_ssid)); +#ifdef CONFIG_ANTENNA_DIVERSITY + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); + DBG_8192C("#### dst_ssid=(%s) Opt_Ant_(%s) , cur_Ant(%s)\n", dst_ssid, + (2==pnetwork->network.PhyInfo.Optimum_antenna)?"A":"B", + (2==CurrentAntenna)?"A":"B"); +#endif + //remove the condition @ 20081125 + //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)|| + // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode) + //{ + // _rtw_memcpy(pmlmepriv->assoc_bssid, pnetwork->network.MacAddress, ETH_ALEN); + // goto ask_for_joinbss; + //} + + if(pmlmepriv->assoc_by_rssi==_TRUE)//if the ssid is the same, select the bss which has the max rssi + { + if( NULL==pnetwork_max_rssi|| pnetwork->network.Rssi > pnetwork_max_rssi->network.Rssi) + pnetwork_max_rssi = pnetwork; + } + else if(rtw_is_desired_network(adapter, pnetwork) == _TRUE) + { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { +#if 0 + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + { + DBG_871X("select_and_join(2): _FW_LINKED and is same network, it needn't join again\n"); + + rtw_indicate_connect(adapter);//rtw_indicate_connect again + + return 2; + } + else +#endif + { + rtw_disassoc_cmd(adapter); + //rtw_indicate_disconnect(adapter);// + rtw_free_assoc_resources(adapter); + + goto ask_for_joinbss; + } + } + else + { + goto ask_for_joinbss; + } + + } + + + } + + } + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming>0 && roaming_candidate ){ + pnetwork=roaming_candidate; + DBG_871X("select_and_join_from_scanned_queue: roaming_candidate: %s("MAC_FMT")\n", + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress)); + goto ask_for_joinbss; + } + #endif + + if((pmlmepriv->assoc_by_rssi==_TRUE) && (pnetwork_max_rssi!=NULL)) + { + pnetwork = pnetwork_max_rssi; + DBG_871X("select_and_join_from_scanned_queue: pnetwork_max_rssi: %s("MAC_FMT")\n", + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress)); + goto ask_for_joinbss; + } + + DBG_871X("(1)rtw_select_and_join_from_scanned_queue return _FAIL\n"); + +_func_exit_; + + return _FAIL; + +ask_for_joinbss: + +_func_exit_; + + return rtw_joinbss_cmd(adapter, pnetwork); + +} +#endif + + +sint rtw_set_auth(_adapter * adapter,struct security_priv *psecuritypriv) +{ + struct cmd_obj* pcmd; + struct setauth_parm *psetauthparm; + struct cmd_priv *pcmdpriv=&(adapter->cmdpriv); + sint res=_SUCCESS; + +_func_enter_; + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; //try again + goto exit; + } + + psetauthparm=(struct setauth_parm*)rtw_zmalloc(sizeof(struct setauth_parm)); + if(psetauthparm==NULL){ + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memset(psetauthparm, 0, sizeof(struct setauth_parm)); + psetauthparm->mode=(unsigned char)psecuritypriv->dot11AuthAlgrthm; + + pcmd->cmdcode = _SetAuth_CMD_; + pcmd->parmbuf = (unsigned char *)psetauthparm; + pcmd->cmdsz = (sizeof(struct setauth_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + + _rtw_init_listhead(&pcmd->list); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("after enqueue set_auth_cmd, auth_mode=%x\n", psecuritypriv->dot11AuthAlgrthm)); + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; + +} + + +sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx) +{ + u8 keylen; + struct cmd_obj *pcmd; + struct setkey_parm *psetkeyparm; + struct cmd_priv *pcmdpriv = &(adapter->cmdpriv); + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + sint res=_SUCCESS; + +_func_enter_; + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; //try again + goto exit; + } + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); + if(psetkeyparm==NULL){ + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); + + if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){ + psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy=%d \n", psetkeyparm->algorithm)); + } + else{ + psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm=%d \n", psetkeyparm->algorithm)); + + } + psetkeyparm->keyid = (u8)keyid;//0~3 + psetkeyparm->set_tx = set_tx; + pmlmepriv->key_mask |= BIT(psetkeyparm->keyid); +#ifdef CONFIG_AUTOSUSPEND + if( _TRUE == adapter->pwrctrlpriv.bInternalAutoSuspend) + { + adapter->pwrctrlpriv.wepkeymask = pmlmepriv->key_mask; + DBG_8192C("....AutoSuspend pwrctrlpriv.wepkeymask(%x)\n",adapter->pwrctrlpriv.wepkeymask); + } +#endif + //DBG_8192C("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid,pmlmepriv->key_mask); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid)); + + switch(psetkeyparm->algorithm){ + + case _WEP40_: + keylen=5; + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); + break; + case _WEP104_: + keylen=13; + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); + break; + case _TKIP_: + keylen=16; + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); + psetkeyparm->grpkey=1; + break; + case _AES_: + keylen=16; + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); + psetkeyparm->grpkey=1; + break; + default: + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm)); + res= _FAIL; + goto exit; + } + + + pcmd->cmdcode = _SetKey_CMD_; + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + + _rtw_init_listhead(&pcmd->list); + + //_rtw_init_sema(&(pcmd->cmd_sem), 0); + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: +_func_exit_; + return res; + +} + + +//adjust IEs for rtw_joinbss_cmd in WMM +int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len) +{ + unsigned int ielength=0; + unsigned int i, j; + + i = 12; //after the fixed IE + while(i=0 :if there is pre-auth key, and return the entry id +// +// + +static int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid) +{ + struct security_priv *psecuritypriv=&Adapter->securitypriv; + int i=0; + + do + { + if( ( psecuritypriv->PMKIDList[i].bUsed ) && + ( _rtw_memcmp( psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN ) == _TRUE ) ) + { + break; + } + else + { + i++; + //continue; + } + + }while(imlmepriv; + struct security_priv *psecuritypriv=&adapter->securitypriv; + uint ndisauthmode=psecuritypriv->ndisauthtype; + uint ndissecuritytype = psecuritypriv->ndisencryptstatus; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, + ("+rtw_restruct_sec_ie: ndisauthmode=%d ndissecuritytype=%d\n", + ndisauthmode, ndissecuritytype)); + + authmode = 0xFF;//init + + if((ndisauthmode==Ndis802_11AuthModeWPA)||(ndisauthmode==Ndis802_11AuthModeWPAPSK)) + { + authmode=_WPA_IE_ID_; + uncst_oui[0]=0x0; + uncst_oui[1]=0x50; + uncst_oui[2]=0xf2; + } + if((ndisauthmode==Ndis802_11AuthModeWPA2)||(ndisauthmode==Ndis802_11AuthModeWPA2PSK)) + { + authmode=_WPA2_IE_ID_; + uncst_oui[0]=0x0; + uncst_oui[1]=0x0f; + uncst_oui[2]=0xac; + } + + switch(ndissecuritytype) + { + case Ndis802_11Encryption1Enabled: + case Ndis802_11Encryption1KeyAbsent: + securitytype=_WEP40_; + uncst_oui[3]=0x1; + break; + case Ndis802_11Encryption2Enabled: + case Ndis802_11Encryption2KeyAbsent: + securitytype=_TKIP_; + uncst_oui[3]=0x2; + break; + case Ndis802_11Encryption3Enabled: + case Ndis802_11Encryption3KeyAbsent: + securitytype=_AES_; + uncst_oui[3]=0x4; + break; + default: + securitytype=_NO_PRIVACY_; + break; + } + + //Search required WPA or WPA2 IE and copy to sec_ie[ ] + cnt=12; + match=_FALSE; + while(cntdot118021XGrpPrivacy=_NO_PRIVACY_; + break; + case 0x1: //WEP_40 + psecuritypriv->dot118021XGrpPrivacy=_WEP40_; + break; + case 0x2: //TKIP + psecuritypriv->dot118021XGrpPrivacy=_TKIP_; + break; + case 0x3: //AESCCMP + case 0x4: + psecuritypriv->dot118021XGrpPrivacy=_AES_; + break; + case 0x5: //WEP_104 + psecuritypriv->dot118021XGrpPrivacy=_WEP104_; + break; + } + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Multicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", + sec_ie[8],sec_ie[9],sec_ie[10],sec_ie[11])); + match =_FALSE; + break; + } + + if(sec_ie[12]==0x01) + { + //check the unicast encryption type + if(_rtw_memcmp(&sec_ie[14], &uncst_oui[0], 4) !=_TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Unicast error (%.2x %.2x %.2x %.2x != 00 50 F2 %.2x )! \n", + sec_ie[14],sec_ie[15],sec_ie[16],sec_ie[17],uncst_oui[3])); + match =_FALSE; + + break; + + } //else the uncst_oui is match + } + else//mixed mode, unicast_enc_type > 1 + { + //select the uncst_oui and remove the other uncst_oui + cnt=sec_ie[12]; + remove_cnt=(cnt-1)*4; + sec_ie[12]=0x01; + _rtw_memcpy(&sec_ie[14], &uncst_oui[0], 4); + + //remove the other unicast suit + _rtw_memcpy(&sec_ie[18], &sec_ie[18+remove_cnt],(sec_ie[1]-18+2-remove_cnt)); + sec_ie[1]=sec_ie[1]-remove_cnt; + } + + break; + } + } + + if(authmode==_WPA2_IE_ID_) + { + // parsing RSN IE to select required encryption algorithm, and set the bc/mc encryption algorithm + while(_TRUE) + { + if((sec_ie[2]!=0x01)||(sec_ie[3]!= 0x0)) + { + //IE Ver error + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n RSN IE :IE version error (%.2x %.2x != 01 00 )! \n",sec_ie[2],sec_ie[3])); + match=_FALSE; + break; + } + + if(_rtw_memcmp(&sec_ie[4], &uncst_oui[0], 3) ==_TRUE) + { + //get bc/mc encryption type + switch(sec_ie[7]) + { + case 0x1: //WEP_40 + psecuritypriv->dot118021XGrpPrivacy=_WEP40_; + break; + case 0x2: //TKIP + psecuritypriv->dot118021XGrpPrivacy=_TKIP_; + break; + case 0x4: //AESWRAP + psecuritypriv->dot118021XGrpPrivacy=_AES_; + break; + case 0x5: //WEP_104 + psecuritypriv->dot118021XGrpPrivacy=_WEP104_; + break; + default: //none + psecuritypriv->dot118021XGrpPrivacy=_NO_PRIVACY_; + break; + } + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n RSN IE :Multicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", + sec_ie[4],sec_ie[5],sec_ie[6],sec_ie[7])); + match=_FALSE; + break; + } + + if(sec_ie[8]==0x01) + { + //check the unicast encryption type + if(_rtw_memcmp(&sec_ie[10], &uncst_oui[0],4) !=_TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Unicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", + sec_ie[10],sec_ie[11],sec_ie[12],sec_ie[13])); + + match =_FALSE; + break; + + } //else the uncst_oui is match + } + else //mixed mode, unicast_enc_type > 1 + { + //select the uncst_oui and remove the other uncst_oui + cnt=sec_ie[8]; + remove_cnt=(cnt-1)*4; + sec_ie[8]=0x01; + _rtw_memcpy( &sec_ie[10] , &uncst_oui[0],4 ); + + //remove the other unicast suit + _rtw_memcpy(&sec_ie[14],&sec_ie[14+remove_cnt],(sec_ie[1]-14+2-remove_cnt)); + sec_ie[1]=sec_ie[1]-remove_cnt; + } + + break; + } + } + + } + + //copy fixed ie only + _rtw_memcpy(out_ie, in_ie,12); + ielength=12; + + if(psecuritypriv->wps_phase == _TRUE) + { + //DBG_871X("wps_phase == _TRUE\n"); + + _rtw_memcpy(out_ie+ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len); + + ielength += psecuritypriv->wps_ie_len; + psecuritypriv->wps_phase = _FALSE; + + } + else if((authmode==_WPA_IE_ID_)||(authmode==_WPA2_IE_ID_)) + { + //copy RSN or SSN + if(match ==_TRUE) + { + _rtw_memcpy(&out_ie[ielength], &sec_ie[0], sec_ie[1]+2); + ielength+=sec_ie[1]+2; + + if(authmode==_WPA2_IE_ID_) + { + //the Pre-Authentication bit should be zero, john + out_ie[ielength-1]= 0; + out_ie[ielength-2]= 0; + } + + rtw_report_sec_ie(adapter, authmode, sec_ie); + +#ifdef CONFIG_DRVEXT_MODULE + drvext_report_sec_ie(&adapter->drvextpriv, authmode, sec_ie); +#endif + + } + + } + else + { + + } + + iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid); + if(iEntry<0) + { + return ielength; + } + else + { + if(authmode == _WPA2_IE_ID_) + { + out_ie[ielength]=1; + ielength++; + out_ie[ielength]=0; //PMKID count = 0x0100 + ielength++; + _rtw_memcpy( &out_ie[ielength], &psecuritypriv->PMKIDList[iEntry].PMKID, 16); + + ielength+=16; + out_ie[13]+=18;//PMKID length = 2+16 + } + } + + //report_sec_ie(adapter, authmode, sec_ie); + +_func_exit_; + + return ielength; +} + +void rtw_init_registrypriv_dev_network( _adapter* adapter) +{ + struct registry_priv* pregistrypriv = &adapter->registrypriv; + struct eeprom_priv* peepriv = &adapter->eeprompriv; + WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; + u8 *myhwaddr = myid(peepriv); + +_func_enter_; + + _rtw_memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN); + + _rtw_memcpy(&pdev_network->Ssid, &pregistrypriv->ssid, sizeof(NDIS_802_11_SSID)); + + pdev_network->Configuration.Length=sizeof(NDIS_802_11_CONFIGURATION); + pdev_network->Configuration.BeaconPeriod = 100; + pdev_network->Configuration.FHConfig.Length = 0; + pdev_network->Configuration.FHConfig.HopPattern = 0; + pdev_network->Configuration.FHConfig.HopSet = 0; + pdev_network->Configuration.FHConfig.DwellTime = 0; + + +_func_exit_; + +} + +void rtw_update_registrypriv_dev_network(_adapter* adapter) +{ + int sz=0; + struct registry_priv* pregistrypriv = &adapter->registrypriv; + WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; + struct security_priv* psecuritypriv = &adapter->securitypriv; + struct wlan_network *cur_network = &adapter->mlmepriv.cur_network; + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + +_func_enter_; + +#if 0 + pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; + pxmitpriv->vcs = pregistrypriv->vcs_type; + pxmitpriv->vcs_type = pregistrypriv->vcs_type; + //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; + pxmitpriv->frag_len = pregistrypriv->frag_thresh; + + adapter->qospriv.qos_option = pregistrypriv->wmm_enable; +#endif + + pdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; // adhoc no 802.1x + + pdev_network->Rssi = 0; + + switch(pregistrypriv->wireless_mode) + { + case WIRELESS_11B: + pdev_network->NetworkTypeInUse = (Ndis802_11DS); + break; + case WIRELESS_11G: + case WIRELESS_11BG: + case WIRELESS_11_24N: + case WIRELESS_11G_24N: + case WIRELESS_11BG_24N: + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); + break; + case WIRELESS_11A: + case WIRELESS_11A_5N: + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); + break; + case WIRELESS_11ABGN: + if(pregistrypriv->channel > 14) + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); + else + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); + break; + default : + // TODO + break; + } + + pdev_network->Configuration.DSConfig = (pregistrypriv->channel); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("pregistrypriv->channel=%d, pdev_network->Configuration.DSConfig=0x%x\n", pregistrypriv->channel, pdev_network->Configuration.DSConfig)); + + if(cur_network->network.InfrastructureMode == Ndis802_11IBSS) + pdev_network->Configuration.ATIMWindow = (0); + + pdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode); + + // 1. Supported rates + // 2. IE + + //rtw_set_supported_rate(pdev_network->SupportedRates, pregistrypriv->wireless_mode) ; // will be called in rtw_generate_ie + sz = rtw_generate_ie(pregistrypriv); + + pdev_network->IELength = sz; + + pdev_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pdev_network); + + //notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd(); + //pdev_network->IELength = cpu_to_le32(sz); + +_func_exit_; + +} + +void rtw_get_encrypt_decrypt_from_registrypriv(_adapter* adapter) +{ + u16 wpaconfig=0; + struct registry_priv* pregistrypriv = &adapter->registrypriv; + struct security_priv* psecuritypriv= &adapter->securitypriv; +_func_enter_; + + +_func_exit_; + +} + +//the fucntion is at passive_level +void rtw_joinbss_reset(_adapter *padapter) +{ + u8 threshold; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +#ifdef CONFIG_80211N_HT + struct ht_priv *phtpriv = &pmlmepriv->htpriv; +#endif + + //todo: if you want to do something io/reg/hw setting before join_bss, please add code here + + + + +#ifdef CONFIG_80211N_HT + + pmlmepriv->num_FortyMHzIntolerant = 0; + + pmlmepriv->num_sta_no_ht = 0; + + phtpriv->ampdu_enable = _FALSE;//reset to disabled + +#ifdef CONFIG_USB_HCI + if(phtpriv->ht_option) + { + //validate usb rx aggregation + //rtw_write8(padapter, 0x102500D9, 48);//TH = 48 pages, 6k + threshold = 48; + if(padapter->registrypriv.wifi_spec==1) + threshold = 1; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } + else + { + //invalidate usb rx aggregation + //rtw_write8(padapter, 0x102500D9, 1);// TH=1 => means that invalidate usb rx aggregation + threshold = 1; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } +#endif + +#endif + +} + + +#ifdef CONFIG_80211N_HT + +//the fucntion is >= passive_level +unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len) +{ + u32 ielen, out_len; + unsigned char *p, *pframe; + struct ieee80211_ht_cap ht_capie; + unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + + phtpriv->ht_option = _FALSE; + + p = rtw_get_ie(in_ie+12, _HT_CAPABILITY_IE_, &ielen, in_len-12); + + if(p && ielen>0) + { + if(pqospriv->qos_option == 0) + { + out_len = *pout_len; + pframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_, + _WMM_IE_Length_, WMM_IE, pout_len); + + pqospriv->qos_option = 1; + } + + out_len = *pout_len; + + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC | + IEEE80211_HT_CAP_DSSSCCK40; + + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) { + //DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__); + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | + (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; + + + pframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len); + + + //_rtw_memcpy(out_ie+out_len, p, ielen+2);//gtest + //*pout_len = *pout_len + (ielen+2); + + + phtpriv->ht_option = _TRUE; + + p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12); + if(p && (ielen==sizeof(struct ieee80211_ht_addt_info))) + { + out_len = *pout_len; + pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len); + } + + } + + return (phtpriv->ht_option); + +} + +//the fucntion is > passive_level (in critical_section) +void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len) +{ + u8 *p, max_ampdu_sz; + int i, len; + struct sta_info *bmc_sta, *psta; + struct ieee80211_ht_cap *pht_capie; + struct ieee80211_ht_addt_info *pht_addtinfo; + struct recv_reorder_ctrl *preorder_ctrl; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct wlan_network *pcur_network = &(pmlmepriv->cur_network); + + + if(!phtpriv->ht_option) + return; + + + //DBG_8192C("+rtw_update_ht_cap()\n"); + + //maybe needs check if ap supports rx ampdu. + if((phtpriv->ampdu_enable==_FALSE) &&(pregistrypriv->ampdu_enable==1)) + { + if(pregistrypriv->wifi_spec==1) + { + phtpriv->ampdu_enable = _FALSE; + } + else + { + phtpriv->ampdu_enable = _TRUE; + } + } + else if(pregistrypriv->ampdu_enable==2) + { + phtpriv->ampdu_enable = _TRUE; + } + + + //check Max Rx A-MPDU Size + len = 0; + p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); + if(p && len>0) + { + pht_capie = (struct ieee80211_ht_cap *)(p+2); + max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_CAP_AMPDU_FACTOR); + max_ampdu_sz = 1 << (max_ampdu_sz+3); // max_ampdu_sz (kbytes); + + //DBG_8192C("rtw_update_ht_cap(): max_ampdu_sz=%d\n", max_ampdu_sz); + phtpriv->rx_ampdu_maxlen = max_ampdu_sz; + + } + + //for A-MPDU Rx reordering buffer control for bmc_sta & sta_info + //if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff + //todo: check if AP can send A-MPDU packets + bmc_sta = rtw_get_bcmc_stainfo(padapter); + if(bmc_sta) + { + for(i=0; i < 16 ; i++) + { + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + preorder_ctrl = &bmc_sta->recvreorder_ctrl[i]; + preorder_ctrl->enable = _FALSE; + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + preorder_ctrl->wend_b= 0xffff; + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 + } + } + + psta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress); + if(psta) + { + for(i=0; i < 16 ; i++) + { + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + preorder_ctrl = &psta->recvreorder_ctrl[i]; + preorder_ctrl->enable = _FALSE; + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + preorder_ctrl->wend_b= 0xffff; + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 + } + } + + len=0; + p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_ADD_INFO_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); + if(p && len>0) + { + pht_addtinfo = (struct ieee80211_ht_addt_info *)(p+2); + } + +} + +void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + u8 issued; + int priority; + struct sta_info *psta=NULL; + struct ht_priv *phtpriv; + struct pkt_attrib *pattrib =&pxmitframe->attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + s32 bmcst = IS_MCAST(pattrib->ra); + + if(bmcst) + return; + + priority = pattrib->priority; + + if (pattrib->psta) + psta = pattrib->psta; + else + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + + if(psta==NULL) + return; + + phtpriv = &psta->htpriv; + + if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) + { + issued = (phtpriv->agg_enable_bitmap>>priority)&0x1; + issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1; + + if(0==issued) + { + DBG_871X("rtw_issue_addbareq_cmd, p=%d\n", priority); + psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); + rtw_addbareq_cmd(padapter,(u8) priority, pattrib->ra); + } + } + +} + +#endif + +#ifdef CONFIG_LAYER2_ROAMING +void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _rtw_roaming(padapter, tgt_network); + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} +void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + int do_join_r; + + struct wlan_network *pnetwork; + + if(tgt_network != NULL) + pnetwork = tgt_network; + else + pnetwork = &pmlmepriv->cur_network; + + if(0 < pmlmepriv->to_roaming) { + DBG_871X("roaming from %s("MAC_FMT"), length:%d\n", + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress), + pnetwork->network.Ssid.SsidLength); + _rtw_memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid, sizeof(NDIS_802_11_SSID)); + + pmlmepriv->assoc_by_bssid = _FALSE; + + while(1) { + if( _SUCCESS==(do_join_r=rtw_do_join(padapter)) ) { + break; + } else { + DBG_871X("roaming do_join return %d\n", do_join_r); + pmlmepriv->to_roaming--; + + if(0< pmlmepriv->to_roaming) { + continue; + } else { + DBG_871X("%s(%d) -to roaming fail, indicate_disconnect\n", __FUNCTION__,__LINE__); + rtw_indicate_disconnect(padapter); + break; + } + } + } + } + +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c b/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c new file mode 100755 index 000000000000..311a3f976041 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c @@ -0,0 +1,10541 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_MLME_EXT_C_ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct mlme_handler mlme_sta_tbl[]={ + {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, + {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, + {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, + {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, + {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, + {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, + + /*---------------------------------------------------------- + below 2 are reserved + -----------------------------------------------------------*/ + {0, "DoReserved", &DoReserved}, + {0, "DoReserved", &DoReserved}, + {WIFI_BEACON, "OnBeacon", &OnBeacon}, + {WIFI_ATIM, "OnATIM", &OnAtim}, + {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, + {WIFI_AUTH, "OnAuth", &OnAuthClient}, + {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, + {WIFI_ACTION, "OnAction", &OnAction}, +}; + +#ifdef _CONFIG_NATIVEAP_MLME_ +struct mlme_handler mlme_ap_tbl[]={ + {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, + {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, + {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, + {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, + {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, + {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, + + /*---------------------------------------------------------- + below 2 are reserved + -----------------------------------------------------------*/ + {0, "DoReserved", &DoReserved}, + {0, "DoReserved", &DoReserved}, + {WIFI_BEACON, "OnBeacon", &OnBeacon}, + {WIFI_ATIM, "OnATIM", &OnAtim}, + {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, + {WIFI_AUTH, "OnAuth", &OnAuth}, + {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, + {WIFI_ACTION, "OnAction", &OnAction}, +}; +#endif + +struct action_handler OnAction_tbl[]={ + {WLAN_CATEGORY_SPECTRUM_MGMT, "ACTION_SPECTRUM_MGMT", &DoReserved}, + {WLAN_CATEGORY_QOS, "ACTION_QOS", &OnAction_qos}, + {WLAN_CATEGORY_DLS, "ACTION_DLS", &OnAction_dls}, + {WLAN_CATEGORY_BACK, "ACTION_BACK", &OnAction_back}, + {WLAN_CATEGORY_PUBLIC, "ACTION_PUBLIC", &OnAction_public}, + {WLAN_CATEGORY_RADIO_MEASUREMENT, "ACTION_RADIO_MEASUREMENT", &DoReserved}, + {WLAN_CATEGORY_FT, "ACTION_FT", &DoReserved}, + {WLAN_CATEGORY_HT, "ACTION_HT", &OnAction_ht}, + {WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved}, + {WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm}, + {WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, +}; + + +/************************************************** +OUI definitions for the vendor specific IE +***************************************************/ +unsigned char WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01}; +unsigned char WMM_OUI[] = {0x00, 0x50, 0xf2, 0x02}; +unsigned char WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04}; + +unsigned char WMM_INFO_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; +unsigned char WMM_PARA_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + +unsigned char WPA_TKIP_CIPHER[4] = {0x00, 0x50, 0xf2, 0x02}; +unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02}; + +extern unsigned char REALTEK_96B_IE[]; + +/******************************************************** +MCS rate definitions +*********************************************************/ + +unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; +unsigned char MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + +/******************************************************** +ChannelPlan definitions +*********************************************************/ +static RT_CHANNEL_PLAN DefaultChannelPlan[RT_CHANNEL_DOMAIN_MAX] = { + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},32}, // 0x00, RT_CHANNEL_DOMAIN_FCC + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},31}, // 0x01, RT_CHANNEL_DOMAIN_IC + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x02, RT_CHANNEL_DOMAIN_ETSI + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x03, RT_CHANNEL_DOMAIN_SPAIN + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x04, RT_CHANNEL_DOMAIN_FRANCE + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x05, RT_CHANNEL_DOMAIN_MKK + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x06, RT_CHANNEL_DOMAIN_MKK1 + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x07, RT_CHANNEL_DOMAIN_ISRAEL + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x08, RT_CHANNEL_DOMAIN_TELEC +#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x09, RT_CHANNEL_DOMAIN_MIC + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x0A, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x0B, RT_CHANNEL_DOMAIN_WORLD_WIDE_13 + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x0C, RT_CHANNEL_DOMAIN_TELEC_NETGEAR + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, // 0x0D, RT_CHANNEL_DOMAIN_NCC +#endif /* Not using EEPROM_CHANNEL_PLAN directly */ + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x09, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x0A, RT_CHANNEL_DOMAIN_WORLD_WIDE_13 + {{1,2,3,4,5,6,7,8,9,10,11,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},26}, // 0x0B, RT_CHANNEL_DOMAIN_NCC + {{1,2,3,4,5,6,7,8,9,10,11,149,153,157,161,165},16}, // 0x0C, RT_CHANNEL_DOMAIN_CHINA + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, // 0x0D, RT_CHANNEL_DOMAIN__SINGAPORE_INDIA_MEXICO + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165},31}, // 0x0E, RT_CHANNEL_DOMAIN_KOREA + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, // 0x0F, RT_CHANNEL_DOMAIN_TURKEY + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x10, RT_CHANNEL_DOMAIN_JAPAN + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,149,153,157,161,165},20}, // 0x11, RT_CHANNEL_DOMAIN_FCC_NO_DFS + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48},17}, // 0x12, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS + }; + +/**************************************************************************** + +Following are the initialization functions for WiFi MLME + +*****************************************************************************/ + +extern void joinbss_event_prehandle(_adapter *adapter, u8 *pbuf); + +int init_hw_mlme_ext(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + //set_opmode_cmd(padapter, infra_client_with_mlme);//removed + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + return _SUCCESS; +} + +static void init_mlme_ext_priv_value(_adapter* padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + +#ifdef CONFIG_TDLS + u8 i; +#endif + + //unsigned char default_channel_set[NUM_CHANNELS] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; + unsigned char mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff}; + unsigned char mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, 0xff,}; + + ATOMIC_SET(&pmlmeext->event_seq, 0); + pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode + + pmlmeext->cur_channel = padapter->registrypriv.channel; + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmlmeext->retry = 0; + + pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode; + + //_rtw_memcpy(pmlmeext->channel_set, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Channel, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Len); + //_rtw_memcpy(pmlmeext->channel_set, default_channel_set, NUM_CHANNELS); + _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates); + _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates); + + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + pmlmeext->sitesurvey_res.channel_idx = 0; + pmlmeext->sitesurvey_res.bss_cnt = 0; + +#ifdef CONFIG_TDLS + _init_workitem(&pmlmeext->TDLS_restore_workitem, TDLS_restore_workitem_callback, pmlmeext); +#endif + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + pmlmeinfo->reauth_count = 0; + pmlmeinfo->reassoc_count = 0; + pmlmeinfo->link_count = 0; + pmlmeinfo->auth_seq = 0; + pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open; + pmlmeinfo->key_index = 0; + pmlmeinfo->iv = 0; + +#ifdef CONFIG_TDLS + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + pmlmeinfo->tdls_sta_cnt=0; + pmlmeinfo->tdls_dis_req=0; + pmlmeinfo->tdls_cam_entry_to_write=6; + pmlmeinfo->tdls_cam_entry_to_clear=0; + pmlmeinfo->tdls_ch_sensing=0; + pmlmeinfo->tdls_cur_channel=0; + pmlmeinfo->tdls_candidate_ch=1; //when inplement channel switching, default candidate channel is 1 + for(i=0; i<14; i++) + pmlmeinfo->tdls_collect_pkt_num[i]=0; +#endif + + pmlmeinfo->enc_algo = _NO_PRIVACY_; + pmlmeinfo->authModeToggle = 0; + + _rtw_memset(pmlmeinfo->chg_txt, 0, 128); + + pmlmeinfo->slotTime = SHORT_SLOT_TIME; + pmlmeinfo->preamble_mode = PREAMBLE_AUTO; + + pmlmeinfo->dialogToken = 0; +} + +static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set) +{ + u8 index,chanset_size = 0; + u8 b5GBand = _FALSE, b2_4GBand = _FALSE; + + _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*NUM_CHANNELS); + + printk(KERN_NOTICE "ChannelPlan = 0x%02x\n", ChannelPlan);//add by gwl + + if(ChannelPlan >= RT_CHANNEL_DOMAIN_MAX) + { + DBG_8192C("channel plan id error \n"); + return chanset_size; + } + + if(padapter->registrypriv.wireless_mode & WIRELESS_11G) + { + b2_4GBand = _TRUE; + } + + if(padapter->registrypriv.wireless_mode & WIRELESS_11A) + { + b5GBand = _TRUE; + } + + for(index=0;index= 1 && channel_set[chanset_size].ChannelNum <= 11) + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + else if((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) + channel_set[chanset_size].ScanType = SCAN_PASSIVE; + } + else if(RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == ChannelPlan)// channel 12~13, passive scan + { + if(channel_set[chanset_size].ChannelNum <= 11) + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + else + channel_set[chanset_size].ScanType = SCAN_PASSIVE; + } + else + { + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + } + + chanset_size++; + } + else if((DefaultChannelPlan[ChannelPlan].Channel[index] >= 36) && (b5GBand)) + { +#ifdef DFS + channel_set[chanset_size].ChannelNum = DefaultChannelPlan[ChannelPlan].Channel[index]; + if ( channel_set[chanset_size].ChannelNum <= 48 + || channel_set[chanset_size].ChannelNum >= 149 ) + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + else + channel_set[chanset_size].ScanType = SCAN_PASSIVE; + chanset_size++; +#else /* DFS */ + if ( DefaultChannelPlan[ChannelPlan].Channel[index] <= 48 + || DefaultChannelPlan[ChannelPlan].Channel[index] >= 149 ) { + channel_set[chanset_size].ChannelNum = DefaultChannelPlan[ChannelPlan].Channel[index]; + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + DBG_8192C("%s(): channel_set[%d].ChannelNum = %d\n", __FUNCTION__, chanset_size, channel_set[chanset_size].ChannelNum); + chanset_size++; + } +#endif /* DFS */ + } + } + + return chanset_size; +} + +int init_mlme_ext_priv(_adapter* padapter) +{ + int res = _SUCCESS; + struct registry_priv* pregistrypriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + _rtw_memset((u8 *)pmlmeext, 0, sizeof(struct mlme_ext_priv)); + pmlmeext->padapter = padapter; + + //fill_fwpriv(padapter, &(pmlmeext->fwpriv)); + + init_mlme_ext_priv_value(padapter); + pmlmeinfo->bAcceptAddbaReq = pregistrypriv->bAcceptAddbaReq; + + init_mlme_ext_timer(padapter); + +#ifdef CONFIG_AP_MODE + init_mlme_ap_info(padapter); +#endif + + pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set); + + pmlmeext->chan_scan_time = SURVEY_TO; + pmlmeext->mlmeext_init = _TRUE; + + return res; + +} + +void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext) +{ + _adapter *padapter = pmlmeext->padapter; + + if (!padapter) + return; + +#ifdef CONFIG_AP_MODE + free_mlme_ap_info(padapter); +#endif + + if (padapter->bDriverStopped == _TRUE) + { + _cancel_timer_ex(&pmlmeext->survey_timer); + _cancel_timer_ex(&pmlmeext->link_timer); + //_cancel_timer_ex(&pmlmeext->ADDBA_timer); + } + + +} + +static void UpdateBrateTbl( + IN PADAPTER Adapter, + IN u8 *mBratesOS +) +{ + u8 i; + u8 rate; + + // 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory. + for(i=0;iu.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + if(ptable->func) + { + //receive the frames that ra(a1) is my address or ra(a1) is bc address. + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) + { + return; + } + + ptable->func(padapter, precv_frame); + } + +} + +void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) +{ + int index; + struct mlme_handler *ptable; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, + ("+mgt_dispatcher: type(0x%x) subtype(0x%x)\n", + GetFrameType(pframe), GetFrameSubType(pframe))); + +#if 0 + { + u8 *pbuf; + pbuf = GetAddr1Ptr(pframe); + DBG_8192C("A1-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + pbuf = GetAddr2Ptr(pframe); + DBG_8192C("A2-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + pbuf = GetAddr3Ptr(pframe); + DBG_8192C("A3-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + } +#endif + + if (GetFrameType(pframe) != WIFI_MGT_TYPE) + { + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("mgt_dispatcher: type(0x%x) error!\n", GetFrameType(pframe))); + return; + } + + //receive the frames that ra(a1) is my address or ra(a1) is bc address. + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) + { + return; + } + + ptable = mlme_sta_tbl; + + index = GetFrameSubType(pframe) >> 4; + +#ifdef CONFIG_TDLS + if((index << 4)==WIFI_ACTION){ + //category==public (4), action==TDLS_DISCOVERY_RESPONSE + if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){ + DBG_8192C("recv tdls discovery response frame\n"); + On_TDLS_Dis_Rsp(padapter, precv_frame); + } + } +#endif + + if (index > 13) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Currently we do not support reserved sub-fr-type=%d\n", index)); + return; + } + ptable += index; + +#if 0//gtest + sa = get_sa(pframe); + psta = search_assoc_sta(sa, padapter); + // only check last cache seq number for management frame + if (psta != NULL) { + if (GetRetry(pframe)) { + if (GetTupleCache(pframe) == psta->rxcache->nonqos_seq){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n")); + return; + } + } + psta->rxcache->nonqos_seq = GetTupleCache(pframe); + } +#else + + if(GetRetry(pframe)) + { + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n")); + //return; + } +#endif + +#ifdef CONFIG_AP_MODE + switch (GetFrameSubType(pframe)) + { + case WIFI_AUTH: + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + ptable->func = &OnAuth; + else + ptable->func = &OnAuthClient; + //pass through + case WIFI_ASSOCREQ: + case WIFI_REASSOCREQ: + _mgt_dispatcher(padapter, ptable, precv_frame); +#ifdef CONFIG_HOSTAPD_MLME + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + rtw_hostapd_mlme_rx(padapter, precv_frame); +#endif + break; + case WIFI_PROBEREQ: + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#ifdef CONFIG_HOSTAPD_MLME + rtw_hostapd_mlme_rx(padapter, precv_frame); +#else + _mgt_dispatcher(padapter, ptable, precv_frame); +#endif + } + else + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + case WIFI_BEACON: + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + case WIFI_ACTION: + //if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + default: + _mgt_dispatcher(padapter, ptable, precv_frame); + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + rtw_hostapd_mlme_rx(padapter, precv_frame); + break; + } +#else + + _mgt_dispatcher(padapter, ptable, precv_frame); + +#endif + +} + +#ifdef CONFIG_P2P +u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da) +{ + issue_probersp_p2p( padapter, da); + return _SUCCESS; +} +#endif //CONFIG_P2P + + +/**************************************************************************** + +Following are the callback functions for each subtype of the management frames + +*****************************************************************************/ + +unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned int ielen; + unsigned char *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur = &(pmlmeinfo->network); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + u8 is_valid_p2p_probereq = _FALSE; + +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + + if ( ( pwdinfo->p2p_state != P2P_STATE_NONE ) && + ( pwdinfo->p2p_state != P2P_STATE_IDLE ) && + ( pwdinfo->role != P2P_ROLE_CLIENT ) && + ( pwdinfo->p2p_state != P2P_STATE_FIND_PHASE_SEARCH ) && + (pwdinfo->p2p_state != P2P_STATE_SCAN ) + ) + { + // Commented by Albert 2011/03/17 + // mcs_rate = 0 -> CCK 1M rate + // mcs_rate = 1 -> CCK 2M rate + // mcs_rate = 2 -> CCK 5.5M rate + // mcs_rate = 3 -> CCK 11M rate + // In the P2P mode, the driver should not support the CCK rate + if ( pattrib->mcs_rate > 3 ) + { + if((is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len)) == _TRUE) + { + if(pwdinfo->role == P2P_ROLE_DEVICE) + { + p2p_listen_state_process( padapter, get_sa(pframe)); + + return _SUCCESS; + } + + if(pwdinfo->role == P2P_ROLE_GO) + { + goto _continue; + } + } + } + } +#endif //CONFIG_P2P + +_continue: + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) + { + return _SUCCESS; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE && + check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)==_FALSE) + { + return _SUCCESS; + } + + + //DBG_871X("+OnProbeReq\n"); + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen, + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + + + //check (wildcard) SSID + if (p != NULL) + { + if(is_valid_p2p_probereq == _TRUE) + { + goto _issue_probersp; + } + + if ((ielen != 0) && (!_rtw_memcmp((void *)(p+2), (void *)cur->Ssid.Ssid, le32_to_cpu(cur->Ssid.SsidLength)))) + { + return _SUCCESS; + } + +_issue_probersp: + + issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq); + + } + + return _SUCCESS; + +} + +unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct sta_info *psta; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +#endif + + +#ifdef CONFIG_P2P + if (P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) + { + if ( _TRUE == pwdinfo->tx_prov_disc_info.benable ) + { + if( _rtw_memcmp( pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) + { + if ( P2P_ROLE_CLIENT == pwdinfo->role ) + { + pwdinfo->tx_prov_disc_info.benable = _FALSE; + issue_p2p_provision_request( padapter, + pwdinfo->tx_prov_disc_info.peerIFAddr, + pwdinfo->tx_prov_disc_info.ssid.Ssid, + pwdinfo->tx_prov_disc_info.ssid.SsidLength, + pwdinfo->tx_prov_disc_info.peerDevAddr ); + } + else if ( ( P2P_ROLE_DEVICE == pwdinfo->role ) || ( P2P_ROLE_GO == pwdinfo->role ) ) + { + pwdinfo->tx_prov_disc_info.benable = _FALSE; + issue_p2p_provision_request( padapter, + pwdinfo->tx_prov_disc_info.peerIFAddr, + NULL, + 0, + pwdinfo->tx_prov_disc_info.peerDevAddr ); + } + } + } + return _SUCCESS; + } + else if ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) + { + if ( _TRUE == pwdinfo->nego_req_info.benable ) + { + printk( "[%s] P2P State is GONEGO ING!\n", __FUNCTION__ ); + if( _rtw_memcmp( pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) + { + pwdinfo->nego_req_info.benable = _FALSE; + issue_p2p_GO_request( padapter, pwdinfo->nego_req_info.peerDevAddr); + } + } + } +#endif + + report_survey_event(padapter, precv_frame); + + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + return _SUCCESS; + } + + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) + { + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + { + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) + { + psta->sta_stats.rx_pkts++; + } + } + } + + return _SUCCESS; + +} + +unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) +{ + int cam_idx; + struct sta_info *psta; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + report_survey_event(padapter, precv_frame); + + return _SUCCESS; + } + + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) + { + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) + { + //check the vendor of the assoc AP + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe+sizeof(struct ieee80211_hdr_3addr), len-sizeof(struct ieee80211_hdr_3addr)); + + //update TSF Value + update_TSF(pmlmeext, pframe, len); + + //start auth + start_clnt_auth(padapter); + + return _SUCCESS; + } + + if(((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) + { + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) + { + //update WMM, ERP in the beacon + //todo: the timer is used instead of the number of the beacon received + if ((psta->sta_stats.rx_pkts & 0xf) == 0) + { + //DBG_871X("update_bcn_info\n"); + update_beacon_info(padapter, pframe, len, psta); + } +#ifdef CONFIG_P2P + process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)); +#endif //CONFIG_P2P + psta->sta_stats.rx_pkts++; + } + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) + { + //update WMM, ERP in the beacon + //todo: the timer is used instead of the number of the beacon received + if ((psta->sta_stats.rx_pkts & 0xf) == 0) + { + //DBG_871X("update_bcn_info\n"); + update_beacon_info(padapter, pframe, len, psta); + } + psta->sta_stats.rx_pkts++; + } + else + { + //allocate a new CAM entry for IBSS station + if ((cam_idx = allocate_fw_sta_entry(padapter)) == NUM_STA) + { + goto _END_ONBEACON_; + } + + //get supported rate + if (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL) + { + pmlmeinfo->FW_sta_info[cam_idx].status = 0; + goto _END_ONBEACON_; + } + + //update TSF Value + update_TSF(pmlmeext, pframe, len); + + //report sta add event + report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx); + + //pmlmeext->linked_to = LINKED_TO; + } + } + } + +_END_ONBEACON_: + + return _SUCCESS; + +} + +unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + unsigned int auth_mode, seq, ie_len; + unsigned char *sa, *p; + u16 algorithm; + int status; + static struct sta_info stat; + struct sta_info *pstat=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return _FAIL; + + DBG_871X("+OnAuth\n"); + + sa = GetAddr2Ptr(pframe); + + auth_mode = psecuritypriv->dot11AuthAlgrthm; + seq = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 2)); + algorithm = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN)); + + if (GetPrivacy(pframe)) + { +#if 0 //TODO: SW rtw_wep_decrypt + if (SWCRYPTO) + { + status = rtw_wep_decrypt(priv, pframe, pfrinfo->pktlen, + priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm); + if (status == FALSE) + { + SAVE_INT_AND_CLI(flags); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"wep-decrypt a Auth frame error!\n"); + status = _STATS_CHALLENGE_FAIL_; + goto auth_fail; + } + } + + seq = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4 + 2)); + algorithm = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4)); +#endif + } + + + DBG_871X("auth alg=%x, seq=%X\n", algorithm, seq); + + if (auth_mode == 2 && + psecuritypriv->dot11PrivacyAlgrthm != _WEP40_ && + psecuritypriv->dot11PrivacyAlgrthm != _WEP104_) + auth_mode = 0; + + if ((algorithm > 0 && auth_mode == 0) || // rx a shared-key auth but shared not enabled + (algorithm == 0 && auth_mode == 1) ) // rx a open-system auth but shared-key is enabled + { + DBG_871X("auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\n", + algorithm, auth_mode, sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]); + + status = _STATS_NO_SUPP_ALG_; + + goto auth_fail; + } + +#if 0 //TODO:ACL control + phead = &priv->wlan_acl_list; + plist = phead->next; + //check sa + if (acl_mode == 1) // 1: positive check, only those on acl_list can be connected. + res = FAIL; + else + res = SUCCESS; + + while(plist != phead) + { + paclnode = list_entry(plist, struct rtw_wlan_acl_node, list); + plist = plist->next; + if (!memcmp((void *)sa, paclnode->addr, 6)) { + if (paclnode->mode & 2) { // deny + res = FAIL; + break; + } + else { + res = SUCCESS; + break; + } + } + } + + if (res != SUCCESS) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"auth abort because ACL!\n"); + return FAIL; + } +#endif + + pstat = rtw_get_stainfo(pstapriv, sa); + if (pstat == NULL) + { + // allocate a new one + DBG_871X("going to alloc stainfo for sa=%02X%02X%02X%02X%02X%02X\n", sa[0],sa[1],sa[2],sa[3],sa[4],sa[5]); + pstat = rtw_alloc_stainfo(pstapriv, sa); + if (pstat == NULL) + { + DBG_871X(" Exceed the upper limit of supported clients...\n"); + status = _STATS_UNABLE_HANDLE_STA_; + goto auth_fail; + } + + pstat->state = WIFI_FW_AUTH_NULL; + pstat->auth_seq = 0; + + //pstat->flags = 0; + //pstat->capability = 0; + } + else + { + if(rtw_is_list_empty(&pstat->asoc_list)==_FALSE) + { + rtw_list_delete(&pstat->asoc_list); + if (pstat->expire_to > 0) + { + //TODO: STA re_auth within expire_to + } + } + if (seq==1) { + //TODO: STA re_auth and auth timeout + } + } + + if (rtw_is_list_empty(&pstat->auth_list)) + { + rtw_list_insert_tail(&pstat->auth_list, &pstapriv->auth_list); + } + + + if (pstat->auth_seq == 0) + pstat->expire_to = pstapriv->auth_to; + + if ((pstat->auth_seq + 1) != seq) + { + DBG_871X("(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq+1); + status = _STATS_OUT_OF_AUTH_SEQ_; + goto auth_fail; + } + + if (algorithm==0 && (auth_mode == 0 || auth_mode == 2)) + { + if (seq == 1) + { + pstat->state &= ~WIFI_FW_AUTH_NULL; + pstat->state |= WIFI_FW_AUTH_SUCCESS; + pstat->expire_to = pstapriv->assoc_to; + pstat->authalg = algorithm; + } + else + { + DBG_871X("(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq+1); + status = _STATS_OUT_OF_AUTH_SEQ_; + goto auth_fail; + } + } + else // shared system or auto authentication + { + if (seq == 1) + { + //prepare for the challenging txt... + + //get_random_bytes((void *)pstat->chg_txt, 128);//TODO: + + pstat->state &= ~WIFI_FW_AUTH_NULL; + pstat->state |= WIFI_FW_AUTH_STATE; + pstat->authalg = algorithm; + pstat->auth_seq = 2; + } + else if (seq == 3) + { + //checking for challenging txt... + DBG_871X("checking for challenging txt...\n"); + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_ , _CHLGETXT_IE_, (int *)&ie_len, + len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4); + + if((p==NULL) || (ie_len<=0)) + { + DBG_871X("auth rejected because challenge failure!(1)\n"); + status = _STATS_CHALLENGE_FAIL_; + goto auth_fail; + } + + if (_rtw_memcmp((void *)(p + 2), pstat->chg_txt, 128)) + { + pstat->state &= (~WIFI_FW_AUTH_STATE); + pstat->state |= WIFI_FW_AUTH_SUCCESS; + // challenging txt is correct... + pstat->expire_to = pstapriv->assoc_to; + } + else + { + DBG_871X("auth rejected because challenge failure!\n"); + status = _STATS_CHALLENGE_FAIL_; + goto auth_fail; + } + } + else + { + DBG_871X("(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq+1); + status = _STATS_OUT_OF_AUTH_SEQ_; + goto auth_fail; + } + } + + + // Now, we are going to issue_auth... + pstat->auth_seq = seq + 1; + +#ifdef CONFIG_NATIVEAP_MLME + issue_auth(padapter, pstat, (unsigned short)(_STATS_SUCCESSFUL_)); +#endif + + if (pstat->state & WIFI_FW_AUTH_SUCCESS) + pstat->auth_seq = 0; + + + return _SUCCESS; + +auth_fail: + + if (pstat) + { + pstat = &stat; + _rtw_memset((char *)pstat, '\0', sizeof(stat)); + pstat->auth_seq = 2; + _rtw_memcpy(pstat->hwaddr, sa, 6); + } + +#ifdef CONFIG_NATIVEAP_MLME + issue_auth(padapter, pstat, (unsigned short)status); +#endif + +#endif + return _FAIL; + +} + +unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned int seq, len, status, algthm, offset; + unsigned char *p; + unsigned int go2asoc = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pkt_len = precv_frame->u.hdr.len; + + //DBG_871X("%s\n", __FUNCTION__); + + //check A1 matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + return _SUCCESS; + + if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE)) + return _SUCCESS; + + offset = (GetPrivacy(pframe))? 4: 0; + + algthm = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset)); + seq = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2)); + status = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 4)); + + if (status != 0) + { + DBG_871X("clnt auth fail, status: %d\n", status); + goto authclnt_fail; + } + + if (seq == 2) + { + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) + { + // legendary shared system + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len, + pkt_len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_); + + if (p == NULL) + { + //DBG_8192C("marc: no challenge text?\n"); + goto authclnt_fail; + } + + _rtw_memcpy((void *)(pmlmeinfo->chg_txt), (void *)(p + 2), len); + pmlmeinfo->auth_seq = 3; + issue_auth(padapter, NULL, 0); + set_link_timer(pmlmeext, REAUTH_TO); + + return _SUCCESS; + } + else + { + // open system + go2asoc = 1; + } + } + else if (seq == 4) + { + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) + { + go2asoc = 1; + } + else + { + goto authclnt_fail; + } + } + else + { + // this is also illegal + //DBG_8192C("marc: clnt auth failed due to illegal seq=%x\n", seq); + goto authclnt_fail; + } + + if (go2asoc) + { + start_clnt_assoc(padapter); + return _SUCCESS; + } + +authclnt_fail: + + //pmlmeinfo->state &= ~(WIFI_FW_AUTH_STATE); + + return _FAIL; + +} + +unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + u16 capab_info, listen_interval; + struct ieee802_11_elems elems; + struct sta_info *pstat; + unsigned char reassoc, *p, *pos, *wpa_ie; + unsigned char rsnie_hdr[4]={0x00, 0x50, 0xf2, 0x01}; + unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; + int i, ie_len, wpa_ie_len, left; + unsigned long flags; + unsigned char supportRate[16]; + int supportRateNum; + unsigned short status = _STATS_SUCCESSFUL_; + unsigned short frame_type, ie_offset=0; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur = &(pmlmeinfo->network); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pkt_len = precv_frame->u.hdr.len; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 p2p_status_code = P2P_STATUS_SUCCESS; + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 p2pielen = 0; +#endif //CONFIG_P2P + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return _FAIL; + + frame_type = GetFrameSubType(pframe); + if (frame_type == WIFI_ASSOCREQ) + { + reassoc = 0; + ie_offset = _ASOCREQ_IE_OFFSET_; + } + else // WIFI_REASSOCREQ + { + reassoc = 1; + ie_offset = _REASOCREQ_IE_OFFSET_; + } + + + if (pkt_len < IEEE80211_3ADDR_LEN + ie_offset) { + DBG_871X("handle_assoc(reassoc=%d) - too short payload (len=%lu)" + "\n", reassoc, (unsigned long)pkt_len); + return _FAIL; + } + + pstat = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (pstat == (struct sta_info *)NULL) + { + status = _RSON_CLS2_; + goto asoc_class2_error; + } + + capab_info = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN); + //capab_info = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + //listen_interval = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN+2)); + listen_interval = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN+2); + + left = pkt_len - (IEEE80211_3ADDR_LEN + ie_offset); + pos = pframe + (IEEE80211_3ADDR_LEN + ie_offset); + + + DBG_871X("%s\n", __FUNCTION__); + + // check if this stat has been successfully authenticated/assocated + if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS)) + { + if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS)) + { + status = _RSON_CLS2_; + goto asoc_class2_error; + } + else + { + pstat->state &= (~WIFI_FW_ASSOC_SUCCESS); + pstat->state |= WIFI_FW_ASSOC_STATE; + } + } + else + { + pstat->state &= (~WIFI_FW_AUTH_SUCCESS); + pstat->state |= WIFI_FW_ASSOC_STATE; + } + + +#if 0// todo:tkip_countermeasures + if (hapd->tkip_countermeasures) { + resp = WLAN_REASON_MICHAEL_MIC_FAILURE; + goto fail; + } +#endif + + pstat->capability = capab_info; + +#if 0//todo: + //check listen_interval + if (listen_interval > hapd->conf->max_listen_interval) { + hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, + HOSTAPD_LEVEL_DEBUG, + "Too large Listen Interval (%d)", + listen_interval); + resp = WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE; + goto fail; + } + + pstat->listen_interval = listen_interval; +#endif + + //now parse all ieee802_11 ie to point to elems + if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed || + !elems.ssid) { + DBG_871X("STA " MAC_FMT " sent invalid association request\n", + MAC_ARG(pstat->hwaddr)); + status = _STATS_FAILURE_; + goto OnAssocReqFail; + } + + + // now we should check all the fields... + // checking SSID + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SSID_IE_, &ie_len, + pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p == NULL) + { + status = _STATS_FAILURE_; + } + + if (ie_len == 0) // broadcast ssid, however it is not allowed in assocreq + status = _STATS_FAILURE_; + else + { + // check if ssid match + if (!_rtw_memcmp((void *)(p+2), cur->Ssid.Ssid, cur->Ssid.SsidLength)) + status = _STATS_FAILURE_; + + if (ie_len != cur->Ssid.SsidLength) + status = _STATS_FAILURE_; + } + + if(_STATS_SUCCESSFUL_ != status) + goto OnAssocReqFail; + + // check if the supported rate is ok + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p == NULL) { + DBG_871X("Rx a sta assoc-req which supported rate is empty!\n"); + // use our own rate set as statoin used + //_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN); + //supportRateNum = AP_BSSRATE_LEN; + + status = _STATS_FAILURE_; + goto OnAssocReqFail; + } + else { + _rtw_memcpy(supportRate, p+2, ie_len); + supportRateNum = ie_len; + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_ , &ie_len, + pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p != NULL) { + + if(supportRateNum<=sizeof(supportRate)) + { + _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); + supportRateNum += ie_len; + } + } + } + + //todo: mask supportRate between AP & STA -> move to update raid + //get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0); + + //update station supportRate + pstat->bssratelen = supportRateNum; + _rtw_memcpy(pstat->bssrateset, supportRate, supportRateNum); + + + //check RSN/WPA/WPS + pstat->dot8021xalg = 0; + pstat->wpa_psk = 0; + pstat->wpa_group_cipher = 0; + pstat->wpa2_group_cipher = 0; + pstat->wpa_pairwise_cipher = 0; + pstat->wpa2_pairwise_cipher = 0; + _rtw_memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie)); + if((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) { + + int group_cipher=0, pairwise_cipher=0; + + wpa_ie = elems.rsn_ie; + wpa_ie_len = elems.rsn_ie_len; + + if(rtw_parse_wpa2_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) + { + pstat->dot8021xalg = 1;//psk, todo:802.1x + pstat->wpa_psk |= BIT(1); + + pstat->wpa2_group_cipher = group_cipher&psecuritypriv->wpa2_group_cipher; + pstat->wpa2_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa2_pairwise_cipher; + + if(!pstat->wpa2_group_cipher) + status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; + + if(!pstat->wpa2_pairwise_cipher) + status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; + } + else + { + status = WLAN_STATUS_INVALID_IE; + } + + } else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) { + + int group_cipher=0, pairwise_cipher=0; + + wpa_ie = elems.wpa_ie; + wpa_ie_len = elems.wpa_ie_len; + + if(rtw_parse_wpa_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) + { + pstat->dot8021xalg = 1;//psk, todo:802.1x + pstat->wpa_psk |= BIT(0); + + pstat->wpa_group_cipher = group_cipher&psecuritypriv->wpa_group_cipher; + pstat->wpa_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa_pairwise_cipher; + + if(!pstat->wpa_group_cipher) + status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; + + if(!pstat->wpa_pairwise_cipher) + status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; + + } + else + { + status = WLAN_STATUS_INVALID_IE; + } + + } else { + wpa_ie = NULL; + wpa_ie_len = 0; + } + + if(_STATS_SUCCESSFUL_ != status) + goto OnAssocReqFail; + + pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS); + //if (hapd->conf->wps_state && wpa_ie == NULL) { //todo: to check ap if supporting WPS + if(wpa_ie == NULL) { + if (elems.wps_ie) { + DBG_871X("STA included WPS IE in " + "(Re)Association Request - assume WPS is " + "used\n"); + pstat->flags |= WLAN_STA_WPS; + //wpabuf_free(sta->wps_ie); + //sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4, + // elems.wps_ie_len - 4); + } else { + DBG_871X("STA did not include WPA/RSN IE " + "in (Re)Association Request - possible WPS " + "use\n"); + pstat->flags |= WLAN_STA_MAYBE_WPS; + } + } else if (psecuritypriv->wpa_psk && wpa_ie == NULL) { + DBG_871X("STA " MAC_FMT ": No WPA/RSN IE in association " + "request\n", MAC_ARG(pstat->hwaddr)); + status = WLAN_STATUS_INVALID_IE; + goto OnAssocReqFail; + } + else + { + int copy_len; + + copy_len = ((wpa_ie_len+2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)):(wpa_ie_len+2); + + _rtw_memcpy(pstat->wpa_ie, wpa_ie-2, copy_len); + } + + + // check if there is WMM IE & support WWM-PS + pstat->flags &= ~WLAN_STA_WME; + pstat->qos_option = 0; + pstat->qos_info = 0; + pstat->has_legacy_ac = _TRUE; + pstat->uapsd_vo = 0; + pstat->uapsd_vi = 0; + pstat->uapsd_be = 0; + pstat->uapsd_bk = 0; + if (pmlmepriv->qospriv.qos_option) + { + p = pframe + WLAN_HDR_A3_LEN + ie_offset; ie_len = 0; + for (;;) + { + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p != NULL) { + if (_rtw_memcmp(p+2, WMM_IE, 6)) { + + pstat->flags |= WLAN_STA_WME; + + pstat->qos_option = 1; + pstat->qos_info = *(p+8); + + pstat->max_sp_len = (pstat->qos_info>>5)&0x3; + + if((pstat->qos_info&0xf) !=0xf) + pstat->has_legacy_ac = _TRUE; + else + pstat->has_legacy_ac = _FALSE; + + if(pstat->qos_info&0xf) + { + if(pstat->qos_info&BIT(0)) + pstat->uapsd_vo = BIT(0)|BIT(1); + else + pstat->uapsd_vo = 0; + + if(pstat->qos_info&BIT(1)) + pstat->uapsd_vi = BIT(0)|BIT(1); + else + pstat->uapsd_vi = 0; + + if(pstat->qos_info&BIT(2)) + pstat->uapsd_bk = BIT(0)|BIT(1); + else + pstat->uapsd_bk = 0; + + if(pstat->qos_info&BIT(3)) + pstat->uapsd_be = BIT(0)|BIT(1); + else + pstat->uapsd_be = 0; + + } + + break; + } + } + else { + break; + } + p = p + ie_len + 2; + } + } + + +#ifdef CONFIG_80211N_HT + /* save HT capabilities in the sta object */ + _rtw_memset(&pstat->htpriv.ht_cap, 0, sizeof(struct ieee80211_ht_cap)); + if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct ieee80211_ht_cap)) + { + pstat->flags |= WLAN_STA_HT; + + pstat->flags |= WLAN_STA_WME; + + _rtw_memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct ieee80211_ht_cap)); + + } else + pstat->flags &= ~WLAN_STA_HT; + + + if((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT)) + { + status = _STATS_FAILURE_; + goto OnAssocReqFail; + } + + + if ((pstat->flags & WLAN_STA_HT) && + ((pstat->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || + (pstat->wpa_pairwise_cipher&WPA_CIPHER_TKIP))) + { + DBG_871X("HT: " MAC_FMT " tried to " + "use TKIP with HT association\n", MAC_ARG(pstat->hwaddr)); + + //status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY; + //goto OnAssocReqFail; + } +#endif /* CONFIG_80211N_HT */ + + // + //if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)//? + pstat->flags |= WLAN_STA_NONERP; + for (i = 0; i < pstat->bssratelen; i++) { + if ((pstat->bssrateset[i] & 0x7f) > 22) { + pstat->flags &= ~WLAN_STA_NONERP; + break; + } + } + + if (pstat->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + pstat->flags |= WLAN_STA_SHORT_PREAMBLE; + else + pstat->flags &= ~WLAN_STA_SHORT_PREAMBLE; + + + + if (status != _STATS_SUCCESSFUL_) + goto OnAssocReqFail; + +#ifdef CONFIG_P2P + pstat->is_p2p_device = _FALSE; + if(pwdinfo->role == P2P_ROLE_GO) + { + if(rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , p2pie, &p2pielen)) + { + pstat->is_p2p_device = _TRUE; + if((p2p_status_code=(u8)process_assoc_req_p2p_ie(pwdinfo, p2pie, p2pielen, pstat))>0) + { + pstat->p2p_status_code = p2p_status_code; + status = _STATS_CAP_FAIL_; + goto OnAssocReqFail; + } + } + } + pstat->p2p_status_code = p2p_status_code; +#endif //CONFIG_P2P + + //TODO: identify_proprietary_vendor_ie(); + // Realtek proprietary IE + // identify if this is Broadcom sta + // identify if this is ralink sta + // Customer proprietary IE + + + + /* get a unique AID */ + if (pstat->aid > 0) { + DBG_871X(" old AID %d\n", pstat->aid); + } else { + for (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++) + if (pstapriv->sta_aid[pstat->aid - 1] == NULL) + break; + + //if (pstat->aid > NUM_STA) { + if (pstat->aid > pstapriv->max_num_sta) { + + pstat->aid = 0; + + DBG_871X(" no room for more AIDs\n"); + + status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; + + goto OnAssocReqFail; + + + } else { + pstapriv->sta_aid[pstat->aid - 1] = pstat; + DBG_871X("allocate new AID = (%d)\n", pstat->aid); + } + } + + + pstat->state &= (~WIFI_FW_ASSOC_STATE); + pstat->state |= WIFI_FW_ASSOC_SUCCESS; + + if (!rtw_is_list_empty(&pstat->auth_list)) + { + rtw_list_delete(&pstat->auth_list); + } + if (rtw_is_list_empty(&pstat->asoc_list)) + { + pstat->expire_to = pstapriv->expire_to; + rtw_list_insert_tail(&pstat->asoc_list, &pstapriv->asoc_list); + } + + + // now the station is qualified to join our BSS... + if(pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_==status)) + { +#ifdef CONFIG_NATIVEAP_MLME + //.1 bss_cap_update + //bss_cap_update(padapter, pstat); + + + //.2 - + DBG_871X("indicate_sta_join_event to upper layer - hostapd\n"); + rtw_indicate_sta_assoc_event(padapter, pstat); + + + //.3-(1) report sta add event + report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); + + //.3 -(2) + //sta_info_update(padapter, pstat); + + if (frame_type == WIFI_ASSOCREQ) + issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); + else + issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); + +#endif + } + + return _SUCCESS; + +asoc_class2_error: + +#ifdef CONFIG_NATIVEAP_MLME + issue_deauth(padapter, (void *)GetAddr2Ptr(pframe), status); +#endif + + return _FAIL; + +OnAssocReqFail: + + +#ifdef CONFIG_NATIVEAP_MLME + pstat->aid = 0; + if (frame_type == WIFI_ASSOCREQ) + issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); + else + issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); +#endif + + +#endif /* CONFIG_AP_MODE */ + + return _FAIL; + +} + +unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) +{ + uint i; + int res; + unsigned short status; + PNDIS_802_11_VARIABLE_IEs pIE; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pkt_len = precv_frame->u.hdr.len; + + //DBG_871X("%s\n", __FUNCTION__); + + //check A1 matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + return _SUCCESS; + + if (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE))) + return _SUCCESS; + + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + return _SUCCESS; + + _cancel_timer_ex(&pmlmeext->link_timer); + + //status + if ((status = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 2))) > 0) + { + DBG_871X("assoc reject, status code: %d\n", status); + pmlmeinfo->state = WIFI_FW_NULL_STATE; + res = -4; + goto report_assoc_result; + } + + //get capabilities + pmlmeinfo->capability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + + //set slot time + pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10))? 9: 20; + + //AID + res = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 4))&0x3fff); + + //following are moved to join event callback function + //to handle HT, WMM, rate adaptive, update MAC reg + //for not to handle the synchronous IO in the tasklet + for (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM + { + WMM_param_handler(padapter, pIE); + } + break; + + case _HT_CAPABILITY_IE_: //HT caps + HT_caps_handler(padapter, pIE); + break; + + case _HT_EXTRA_INFO_IE_: //HT info + HT_info_handler(padapter, pIE); + break; + + case _ERPINFO_IE_: + ERP_IE_handler(padapter, pIE); + + default: + break; + } + + i += (pIE->Length + 2); + } + + pmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE); + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; + + //Update Basic Rate Table for spec, 2010-12-28 , by thomas + UpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates); + +report_assoc_result: + + report_join_res(padapter, res); + + return _SUCCESS; +} + +unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned short reason; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pktlen = precv_frame->u.hdr.len; + + //check A3 + if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) + return _SUCCESS; + + reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + + DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); + +#ifdef CONFIG_AP_MODE + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#if 0 + _irqL irqL; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); +#endif + ap_free_sta(padapter, rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe))); + + return _SUCCESS; + } + else +#endif + { + receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason); + } + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; + return _SUCCESS; + +} + +unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned short reason; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pktlen = precv_frame->u.hdr.len; + + //check A3 + if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) + return _SUCCESS; + + reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + + DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); + +#ifdef CONFIG_AP_MODE + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#if 0 + _irqL irqL; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); +#endif + + ap_free_sta(padapter, rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe))); + + return _SUCCESS; + } + else +#endif + { + receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); + } + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; + return _SUCCESS; + +} + +unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame) +{ + DBG_871X("%s\n", __FUNCTION__); + return _SUCCESS; +} + +unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) +{ + u8 *addr; + struct sta_info *psta=NULL; + struct recv_reorder_ctrl *preorder_ctrl; + unsigned char *frame_body; + unsigned char category, action; + unsigned short tid, status, reason_code = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + struct sta_priv *pstapriv = &padapter->stapriv; + + uint len = precv_frame->u.hdr.len; + + //check RA matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode + return _SUCCESS; + +/* + //check A1 matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + return _SUCCESS; +*/ + //DBG_871X("%s\n", __FUNCTION__); + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) + return _SUCCESS; + + addr = GetAddr2Ptr(pframe); + psta = rtw_get_stainfo(pstapriv, addr); + + if(psta==NULL) + return _SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + if (category == WLAN_CATEGORY_BACK)// representing Block Ack + { + if (!pmlmeinfo->HT_enable) + { + return _SUCCESS; + } + + action = frame_body[1]; + //DBG_871X("%s, action=%d\n", __FUNCTION__, action); + switch (action) + { + case WLAN_ACTION_ADDBA_REQ: //ADDBA request + + _rtw_memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request)); + //process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), GetAddr3Ptr(pframe)); + process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), addr); + + if(pmlmeinfo->bAcceptAddbaReq == _TRUE) + { + issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 0); + } + else + { + issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 37);//reject ADDBA Req + } + + break; + + case WLAN_ACTION_ADDBA_RESP: //ADDBA response + + //status = frame_body[3] | (frame_body[4] << 8); //endian issue + status = RTW_GET_LE16(&frame_body[3]); + tid = ((frame_body[5] >> 2) & 0x7); + + if (status == 0) + { //successful + psta->htpriv.agg_enable_bitmap |= 1 << tid; + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + } + else + { + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); + } + + //DBG_8192C("marc: ADDBA RSP: %x\n", pmlmeinfo->agg_enable_bitmap); + break; + + case WLAN_ACTION_DELBA: //DELBA + if ((frame_body[3] & BIT(3)) == 0) + { + psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); + psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); + + //reason_code = frame_body[4] | (frame_body[5] << 8); + reason_code = RTW_GET_LE16(&frame_body[4]); + } + else if((frame_body[3] & BIT(3)) == BIT(3)) + { + tid = (frame_body[3] >> 4) & 0x0F; + + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + preorder_ctrl->enable = _FALSE; + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + } + + DBG_8192C("%s(): DELBA: %x(%x)\n", __FUNCTION__,pmlmeinfo->agg_enable_bitmap, reason_code); + //todo: how to notify the host while receiving DELETE BA + break; + + default: + break; + } + } + + return _SUCCESS; +} + +#ifdef CONFIG_P2P +void issue_p2p_GO_request(_adapter *padapter, u8* raddr) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_REQ; + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u8 wpsielen = 0, p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + DBG_8192C( "[%s] In\n", __FUNCTION__ ); + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pwdinfo->negotiation_dialog_token = 1; // Initialize the dialog value + pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen)); + + + + // WPS Section + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Device Password ID + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + + if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); + } + else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); + } + else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); + } + + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110306 + // According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes + // 1. P2P Capability + // 2. Group Owner Intent + // 3. Configuration Timeout + // 4. Listen Channel + // 5. Extended Listen Timing + // 6. Intended P2P Interface Address + // 7. Channel List + // 8. P2P Device Info + // 9. Operating Channel + + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Group Owner Intent + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + // Todo the tie breaker bit. + p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) ); + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + + // Listen Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listening channel number + + + // Extended Listen Timing ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + // Value: + // Availability Period + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Availability Interval + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + + // Intended P2P Interface Address + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 + + // Channel List + p2pie[ p2pielen++ ] = 0x01; + p2pie[ p2pielen++ ] = 0x02; + p2pie[ p2pielen++ ] = 0x03; + p2pie[ p2pielen++ ] = 0x04; + p2pie[ p2pielen++ ] = 0x05; + p2pie[ p2pielen++ ] = 0x06; + p2pie[ p2pielen++ ] = 0x07; + p2pie[ p2pielen++ ] = 0x08; + p2pie[ p2pielen++ ] = 0x09; + p2pie[ p2pielen++ ] = 0x0A; + p2pie[ p2pielen++ ] = 0x0B; + + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + + // Operating Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + + +void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint len, u8 result) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_RESP; + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u8 p2pielen = 0; + uint wpsielen = 0; + u16 wps_devicepassword_id = 0x0000; + uint wps_devicepassword_id_len = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pwdinfo->negotiation_dialog_token = frame_body[7]; // The Dialog Token of provisioning discovery request frame. + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); + + // Commented by Albert 20110328 + // Try to get the device password ID from the WPS IE of group negotiation request frame + // WiFi Direct test plan 5.1.15 + rtw_get_wps_ie_p2p( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); + rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); + wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); + + _rtw_memset( wpsie, 0x00, 255 ); + wpsielen = 0; + + // WPS Section + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Device Password ID + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + if ( wps_devicepassword_id == WPS_DPID_USER_SPEC ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); + } + else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); + } + else + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); + } + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20100908 + // According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes + // 1. Status + // 2. P2P Capability + // 3. Group Owner Intent + // 4. Configuration Timeout + // 5. Operating Channel + // 6. Intended P2P Interface Address + // 7. Channel List + // 8. Device Info + // 9. Group ID ( Only GO ) + + + // ToDo: + + // P2P Status + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = result; + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + + if ( pwdinfo->role == P2P_ROLE_CLIENT ) + { + // Commented by Albert 2011/03/08 + // According to the P2P specification + // if the sending device will be client, the P2P Capability should be reserved of group negotation response frame + p2pie[ p2pielen++ ] = 0; + } + else + { + // Be group owner or meet the error case + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + } + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Group Owner Intent + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + if ( pwdinfo->peer_intent & 0x01 ) + { + // Peer's tie breaker bit is 1, our tie breaker bit should be 0 + p2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 ); + } + else + { + // Peer's tie breaker bit is 0, our tie breaker bit should be 1 + p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) ); + } + + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + // Operating Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number + + // Intended P2P Interface Address + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 + + // Channel List + p2pie[ p2pielen++ ] = 0x01; + p2pie[ p2pielen++ ] = 0x02; + p2pie[ p2pielen++ ] = 0x03; + p2pie[ p2pielen++ ] = 0x04; + p2pie[ p2pielen++ ] = 0x05; + p2pie[ p2pielen++ ] = 0x06; + p2pie[ p2pielen++ ] = 0x07; + p2pie[ p2pielen++ ] = 0x08; + p2pie[ p2pielen++ ] = 0x09; + p2pie[ p2pielen++ ] = 0x0A; + p2pie[ p2pielen++ ] = 0x0B; + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + if ( pwdinfo->role == P2P_ROLE_GO ) + { + // Group ID Attribute + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); + p2pielen += 2; + + // Value: + // p2P Device Address + _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // SSID + _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); + p2pielen += pwdinfo->nego_ssidlen; + + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_CONF; + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u8 wpsielen = 0, p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); + + + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110306 + // According to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes + // 1. Status + // 2. P2P Capability + // 3. Operating Channel + // 4. Channel List + // 5. Group ID ( if this WiFi is GO ) + + // P2P Status + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = result; + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + + // Operating Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + if ( pwdinfo->role == P2P_ROLE_CLIENT ) + { + p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch; + } + else + { + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel + } + + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + pwdinfo->channel_cnt ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = pwdinfo->channel_cnt; + + // Channel List + _rtw_memcpy( p2pie + p2pielen, pwdinfo->channel_list, pwdinfo->channel_cnt ); + p2pielen += pwdinfo->channel_cnt; + + if ( pwdinfo->role == P2P_ROLE_GO ) + { + // Group ID Attribute + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); + p2pielen += 2; + + // Value: + // p2P Device Address + _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // SSID + _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); + p2pielen += pwdinfo->nego_ssidlen; + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_INVIT_REQ; + u8 p2pie[ 255 ] = { 0x00 }; + u8 p2pielen = 0; + u8 dialogToken = 3; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20101011 + // According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes + // 1. Configuration Timeout + // 2. Invitation Flags + // 3. Operating Channel ( Only GO ) + // 4. P2P Group BSSID ( Only GO ) + // 5. Channel List + // 6. P2P Group ID + // 7. P2P Device Info + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + // Invitation Flags + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INVITATION_FLAGS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = P2P_INVITATION_FLAGS_PERSISTENT; + + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 + + // Channel List + p2pie[ p2pielen++ ] = 0x01; + p2pie[ p2pielen++ ] = 0x02; + p2pie[ p2pielen++ ] = 0x03; + p2pie[ p2pielen++ ] = 0x04; + p2pie[ p2pielen++ ] = 0x05; + p2pie[ p2pielen++ ] = 0x06; + p2pie[ p2pielen++ ] = 0x07; + p2pie[ p2pielen++ ] = 0x08; + p2pie[ p2pielen++ ] = 0x09; + p2pie[ p2pielen++ ] = 0x0A; + p2pie[ p2pielen++ ] = 0x0B; + + // P2P Group ID + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 6 + pwdinfo->invitereq_info.ssidlen ); + p2pielen += 2; + + // Value: + // P2P Device Address for GO + _rtw_memcpy( p2pie + p2pielen, raddr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // SSID + _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.ssid, pwdinfo->invitereq_info.ssidlen ); + p2pielen += pwdinfo->invitereq_info.ssidlen; + + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_INVIT_RESP; + u8 p2pie[ 255 ] = { 0x00 }; + u8 p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20101005 + // According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes + // 1. Status + // 2. Configuration Timeout + // 3. Operating Channel ( Only GO ) + // 4. P2P Group BSSID ( Only GO ) + // 5. Channel List + + // P2P Status + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + if ( success ) + { + p2pie[ p2pielen++ ] = P2P_STATUS_SUCCESS; + } + else + { + // Sent the event receiving the P2P Invitation Req frame to DMP UI. + // DMP had to compare the MAC address to find out the profile. + // So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. + // If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req + // to NB to rebuild the persistent group. + p2pie[ p2pielen++ ] = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + + if ( success ) + { + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 + + // Channel List + p2pie[ p2pielen++ ] = 0x01; + p2pie[ p2pielen++ ] = 0x02; + p2pie[ p2pielen++ ] = 0x03; + p2pie[ p2pielen++ ] = 0x04; + p2pie[ p2pielen++ ] = 0x05; + p2pie[ p2pielen++ ] = 0x06; + p2pie[ p2pielen++ ] = 0x07; + p2pie[ p2pielen++ ] = 0x08; + p2pie[ p2pielen++ ] = 0x09; + p2pie[ p2pielen++ ] = 0x0A; + p2pie[ p2pielen++ ] = 0x0B; + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_provision_request(_adapter *padapter, u8* pinterface_raddr, u8* pssid, u8 ussidlen, u8* pdev_raddr ) +{ + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = 1; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_REQ; + u8 wpsie[ 100 ] = { 0x00 }; + u8 wpsielen = 0; + u32 p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + DBG_8192C( "[%s] In\n", __FUNCTION__ ); + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, pinterface_raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, pssid, ussidlen, pdev_raddr ); + + pframe += p2pielen; + pattrib->pktlen += p2pielen; + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Config Method + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +u8 is_matched_in_profilelist( u8* peermacaddr, struct profile_info* profileinfo ) +{ + u8 i, match_result = 0; + + DBG_8192C( "[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + peermacaddr[0], peermacaddr[1],peermacaddr[2],peermacaddr[3],peermacaddr[4],peermacaddr[5]); + + for( i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++ ) + { + DBG_8192C( "[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + profileinfo->peermac[0], profileinfo->peermac[1],profileinfo->peermac[2],profileinfo->peermac[3],profileinfo->peermac[4],profileinfo->peermac[5]); + if ( _rtw_memcmp( peermacaddr, profileinfo->peermac, ETH_ALEN ) ) + { + match_result = 1; + DBG_8192C( "[%s] Match!\n", __FUNCTION__ ); + break; + } + } + + return (match_result ); +} + +void issue_probersp_p2p(_adapter *padapter, unsigned char *da) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u16 beacon_interval = 100; + u16 capInfo = 0; + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 wpsie[255] = { 0x00 }; + u32 wpsielen = 0, p2pielen = 0; + + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + + // Use the device address for BSSID field. + _rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = pattrib->hdrlen; + pframe += pattrib->hdrlen; + + //timestamp will be inserted by hardware + pframe += 8; + pattrib->pktlen += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); + pframe += 2; + pattrib->pktlen += 2; + + // capability info: 2 bytes + // ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec) + capInfo |= cap_ShortPremble; + capInfo |= cap_ShortSlot; + + _rtw_memcpy(pframe, (unsigned char *) &capInfo, 2); + pframe += 2; + pattrib->pktlen += 2; + + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen); + + // supported rates... + // Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 ) + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); + + // Todo: WPS IE + // Noted by Albert 20100907 + // According to the WPS specification, all the WPS attribute is presented by Big Endian. + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // WiFi Simple Config State + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; // Not Configured. + + // Response Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X; + + // UUID-E + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + wpsielen += 0x10; + + // Manufacturer + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 ); + wpsielen += 7; + + // Model Name + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 ); + wpsielen += 6; + + // Model Number + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[ wpsielen++ ] = 0x31; // character 1 + + // Serial Number + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN ); + wpsielen += ETH_ALEN; + + // Primary Device Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + wpsielen += 2; + + // Value: + // Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + wpsielen += 2; + + // OUI + *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // Sub Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + wpsielen += 2; + + // Device Name + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + wpsielen += pwdinfo->device_name_len; + + // Config Method + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + wpsielen += 2; + + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + + p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe); + pframe += p2pielen; + pattrib->pktlen += p2pielen; + + + pattrib->last_txcmdsz = pattrib->pktlen; + + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_probereq_p2p(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac; + unsigned char bssrate[NumRates]; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + int bssrate_len = 0; + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 wpsie[255] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u16 wpsielen = 0, p2pielen = 0; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + // broadcast probe request frame + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_PROBEREQ); + + pframe += sizeof (struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + + pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen)); + + if ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) + { + pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen)); + } + // Use the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 ) + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); + + // WPS IE + // Noted by Albert 20110221 + // According to the WPS specification, all the WPS attribute is presented by Big Endian. + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Device Name + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + wpsielen += pwdinfo->device_name_len; + + // Primary Device Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + wpsielen += 2; + + // Value: + // Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + wpsielen += 2; + + // OUI + *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // Sub Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110221 + // According to the P2P Specification, the probe request frame should contain 5 P2P attributes + // 1. P2P Capability + // 2. P2P Device ID if this probe request wants to find the specific P2P device + // 3. Listen Channel + // 4. Extended Listen Timing + // 5. Operating Channel if this WiFi is working as the group owner now + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Listen Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listen channel + + + // Extended Listen Timing + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + // Value: + // Availability Period + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Availability Interval + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + if ( pwdinfo->role == P2P_ROLE_GO ) + { + // Operating Channel (if this WiFi is working as the group owner now) + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number + + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +#endif //CONFIG_P2P + +unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned char *frame_body; + unsigned char category, action; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; +#ifdef CONFIG_P2P + u8 p2p_ie[ 255 ]; + u32 p2p_ielen, wps_ielen; + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + u8 result = P2P_STATUS_SUCCESS; +#endif //CONFIG_P2P + + //check RA matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode + return _SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + if(category != WLAN_CATEGORY_PUBLIC) + return _SUCCESS; + + action = frame_body[ 1 ]; + if ( action == ACT_PUBLIC_P2P ) // IEEE 802.11 P2P Public Action usage. + { +#ifdef CONFIG_P2P + // Commented by Albert 20100908 + // Low byte -> High byte is 0x50, 0x6F, 0x9A, 0x09 for P2P OUI. + // But the P2POUT is defined as 0x506F9A09 -> should use the cpu_to_be32 + if ( cpu_to_be32( *( ( u32* ) ( frame_body + 2 ) ) ) == P2POUI ) + { + _rtw_memset( p2p_ie, 0x00, 255 ); + p2p_ielen = 0; + + switch( frame_body[ 6 ] )//OUI Subtype + { + case P2P_GO_NEGO_REQ: + { + DBG_8192C( "[%s] Got GO Nego Req Frame\n", __FUNCTION__); + + if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_FAIL ) + { + // Commented by Albert 20110526 + // In this case, this means the previous nego fail doesn't be reset yet. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + // Restore the previous p2p state + pwdinfo->p2p_state = pwdinfo->pre_p2p_state; + printk( "[%s] Restore the previous p2p state to %d\n", __FUNCTION__, pwdinfo->p2p_state ); + } + + pwdinfo->pre_p2p_state = pwdinfo->p2p_state; + + result = process_p2p_group_negotation_req( pwdinfo, frame_body, len ); + issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result ); + // Commented by Albert 20110718 + // No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); + break; + } + case P2P_GO_NEGO_RESP: + { + DBG_8192C( "[%s] Got GO Nego Resp Frame\n", __FUNCTION__); + + if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_ING ) + { + // Commented by Albert 20110425 + // The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + result = process_p2p_group_negotation_resp( pwdinfo, frame_body, len); + + issue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result); + + // Reset the dialog token for group negotiation frames. + pwdinfo->negotiation_dialog_token = 1; + + if( pwdinfo->p2p_state == P2P_STATE_GONEGO_FAIL ) + { + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); + } + } + else + { + DBG_8192C( "[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __FUNCTION__); + } + + break; + } + case P2P_GO_NEGO_CONF: + { + DBG_8192C( "[%s] Got GO Nego Confirm Frame\n", __FUNCTION__); + process_p2p_group_negotation_confirm( pwdinfo, frame_body, len); + break; + } + case P2P_INVIT_REQ: + { + // Added by Albert 2010/10/05 + // Received the P2P Invite Request frame. + + DBG_8192C( "[%s] Got invite request frame!\n", __FUNCTION__ ); + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + // Parse the necessary information from the P2P Invitation Request frame. + // For example: The MAC address of sending this P2P Invitation Request frame. + u8 groupid[ 38 ] = { 0x00 }; + u32 attr_contentlen = 0; + u8 match_result = 0; + + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen); + _rtw_memcpy( pwdinfo->p2p_peer_interface_addr, groupid, ETH_ALEN ); + pwdinfo->p2p_state = P2P_STATE_RECV_INVITE_REQ; + DBG_8192C( "[%s] peer address %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + groupid[0], groupid[1], groupid[2], groupid[3], groupid[4], groupid[5] ); + + if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) ) + { + match_result = 1; + } + else + { + match_result = 0; + } + + DBG_8192C( "[%s] match_result = %d\n", __FUNCTION__, match_result ); + + pwdinfo->inviteresp_info.token = frame_body[ 7 ]; + issue_p2p_invitation_response( padapter, pwdinfo->p2p_peer_interface_addr, pwdinfo->inviteresp_info.token, match_result ); + } + + break; + } + case P2P_INVIT_RESP: + { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + DBG_8192C( "[%s] Got invite response frame!\n", __FUNCTION__ ); + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + + if ( attr_contentlen == 1 ) + { + DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); + if ( attr_content == P2P_STATUS_SUCCESS ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + } + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + } + } + break; + } + case P2P_DEVDISC_REQ: + + process_p2p_devdisc_req(pwdinfo, pframe, len); + + break; + + case P2P_DEVDISC_RESP: + + process_p2p_devdisc_resp(pwdinfo, pframe, len); + + break; + + case P2P_PROVISION_DISC_REQ: + DBG_8192C( "[%s] Got Provisioning Discovery Request Frame\n", __FUNCTION__ ); + process_p2p_provdisc_req(pwdinfo, pframe, len); + _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); + pwdinfo->pre_p2p_state = pwdinfo->p2p_state; + pwdinfo->p2p_state = P2P_STATE_RX_PROVISION_DIS_REQ; + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); + break; + + case P2P_PROVISION_DISC_RESP: + // Commented by Albert 20110707 + // Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? + DBG_8192C( "[%s] Got Provisioning Discovery Response Frame\n", __FUNCTION__ ); + // Commented by Albert 20110426 + // The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + pwdinfo->p2p_state = P2P_STATE_RX_PROVISION_DIS_RSP; + process_p2p_provdisc_resp(pwdinfo, pframe); + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); + break; + + } + + } +#endif //CONFIG_P2P + } + + return _SUCCESS; +} + +unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_P2P + u8 *frame_body; + u8 category, OUI_Subtype, dialogToken=0; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + + + DBG_871X("%s\n", __FUNCTION__); + + //check RA matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode + return _SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + if(category != WLAN_CATEGORY_P2P) + return _SUCCESS; + + if ( cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ) != P2POUI ) + return _SUCCESS; + + OUI_Subtype = frame_body[5]; + dialogToken = frame_body[6]; + + switch(OUI_Subtype) + { + case P2P_NOTICE_OF_ABSENCE: + + break; + + case P2P_PRESENCE_REQUEST: + + process_p2p_presence_req(pwdinfo, pframe, len); + + break; + + case P2P_PRESENCE_RESPONSE: + + break; + + case P2P_GO_DISC_REQUEST: + + break; + + default: + break; + + } + +#endif //CONFIG_P2P + + return _SUCCESS; + +} + +unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame) +{ + int i; + unsigned char category; + struct action_handler *ptable; + unsigned char *frame_body; + u8 *pframe = precv_frame->u.hdr.rx_data; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + + for(i = 0; i < sizeof(OnAction_tbl)/sizeof(struct action_handler); i++) + { + ptable = &OnAction_tbl[i]; + + if(category == ptable->num) + ptable->func(padapter, precv_frame); + + } + + return _SUCCESS; + +} + +unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame) +{ + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + //DBG_871X("rcvd mgt frame(%x, %x)\n", (GetFrameSubType(pframe) >> 4), *(unsigned int *)GetAddr1Ptr(pframe)); + return _SUCCESS; +} + +struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv) +{ + struct xmit_frame *pmgntframe; + struct xmit_buf *pxmitbuf; + + if ((pmgntframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) + { + return NULL; + } + + if ((pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv)) == NULL) + { + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + return NULL; + } + + pmgntframe->frame_tag = MGNT_FRAMETAG; + + pmgntframe->pxmitbuf = pxmitbuf; + + pmgntframe->buf_addr = pxmitbuf->pbuf; + + pxmitbuf->priv_data = pmgntframe; + + return pmgntframe; + +} + + +/**************************************************************************** + +Following are some TX fuctions for WiFi MLME + +*****************************************************************************/ + +void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + _rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); + + pattrib->hdrlen = 24; + pattrib->nr_frags = 1; + pattrib->priority = 7; + pattrib->mac_id = 0; + pattrib->qsel = 0x12; + + pattrib->pktlen = 0; + + if(pmlmeext->cur_wireless_mode & WIRELESS_11B) + pattrib->raid = 6;//b mode + else + pattrib->raid = 5;//a/g mode + + pattrib->encrypt = _NO_PRIVACY_; + pattrib->bswenc = _FALSE; + + pattrib->qos_en = _FALSE; + pattrib->ht_en = _FALSE; + pattrib->bwmode = HT_CHANNEL_WIDTH_20; + pattrib->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pattrib->sgi = _FALSE; + + pattrib->seqnum = pmlmeext->mgnt_seq; + +} + +void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe) +{ + padapter->HalFunc.mgnt_xmit(padapter, pmgntframe); +} + +//Commented by Kurt +#ifdef CONFIG_TDLS +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; +// SetToDs(fctrl); + if (power_mode) + { + SetPwrMgt(fctrl); + } + + _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(pwlanhdr, pattrib->seqnum); + + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + +s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) +{ + + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + + s32 res=_SUCCESS; + sint bmcast; + + bmcast = IS_MCAST(pattrib->ra); + + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + if (psta == NULL) { + res =_FAIL; + goto exit; + } + + pattrib->mac_id = psta->mac_id; + + pattrib->psta = psta; + + pattrib->ack_policy = 0; + // get ether_hdr_len + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + + if (pqospriv->qos_option && psta->qos_option) { + if(pattrib->priority==0) + pattrib->priority = 1; //tdls management frame should be AC_BK + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; + pattrib->subtype = WIFI_QOS_DATA_TYPE; + } else { + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA_TYPE; + pattrib->priority = 0; + } + + if (psta->ieee8021x_blocked == _TRUE) + { + pattrib->encrypt = 0; + } + else + { + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); + + switch(psecuritypriv->dot11AuthAlgrthm) + { + case dot11AuthAlgrthm_Open: + case dot11AuthAlgrthm_Shared: + case dot11AuthAlgrthm_Auto: + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; + break; + case dot11AuthAlgrthm_8021X: + pattrib->key_idx = 0; + break; + default: + pattrib->key_idx = 0; + break; + } + } + + switch (pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + pattrib->iv_len = 4; + pattrib->icv_len = 4; + break; + case _TKIP_: + pattrib->iv_len = 8; + pattrib->icv_len = 4; + if(padapter->securitypriv.busetkipkey==_FAIL) + { + res =_FAIL; + goto exit; + } + break; + case _AES_: + pattrib->iv_len = 8; + pattrib->icv_len = 8; + break; + default: + pattrib->iv_len = 0; + pattrib->icv_len = 0; + break; + } + + if (pattrib->encrypt && + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) + { + pattrib->bswenc = _TRUE; + } else { + pattrib->bswenc = _FALSE; + } + + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi + pattrib->qos_en = psta->qos_option; + pattrib->ht_en = psta->htpriv.ht_option; + pattrib->raid = psta->raid; + pattrib->bwmode = psta->htpriv.bwmode; + pattrib->ch_offset = psta->htpriv.ch_offset; + pattrib->sgi= psta->htpriv.sgi; + pattrib->ampdu_en = _FALSE; + + if(pattrib->ht_en && psta->htpriv.ampdu_enable) + { + if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + pattrib->ampdu_en = _TRUE; + } + +exit: + + return res; +} + +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + static u8 dialogtoken = 0; + u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + + update_tdls_attrib(padapter, pattrib); + + //init peer sta_info + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL){ + ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr); + } + + if(ptdls_sta){ + ptdls_sta->state |= TDLS_RESPONDER_STATE; + //for tdls; ptdls_sta->aid is used to fill dialogtoken + ptdls_sta->aid = pattrib->nr_frags; + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + } + else { + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + goto exit; + } + + pattrib->qsel=pattrib->priority; + if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL){ + DBG_8192C("issue tdls teardown unsuccessful\n"); + return; + }else{ + ptdls_sta->state=UN_TDLS_STATE; + } + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + + if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ + ptdls_sta->option =3; + _set_workitem(&ptdls_sta->option_workitem); + } + + //free peer sta_info + DBG_8192C("tdls teardown, free sta_info\n"); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + //ready to clear cam + if(ptdls_sta->cam_entry!=0){ + pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; + rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); + } + _set_workitem(&pmlmeext->TDLS_restore_workitem); + rtw_free_stainfo(padapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; //tdls;kurt + +exit: + + return; +} + +void issue_tdls_dis_req(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + static u8 dialogtoken=0; + u8 mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + //for tdls; pattrib->type is used to fill status + pattrib->type = 0; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + DBG_8192C("issue tdls dis req\n"); + +exit: + + return; +} + +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = rx_pkt_pattrib->frag_num; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + //status code!=0 ; setup unsuccess + if(ptdls_sta->stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + } + +exit: + + return; + +} + +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = rx_pkt_pattrib->frag_num; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + pmlmeinfo->tdls_setup_state=TDLS_LINKED_STATE; + + rtw_dump_xframe(padapter, pmgntframe); + + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + + ptdls_sta->option=1; + _set_workitem(&ptdls_sta->option_workitem); + //status code!=0 ; setup unsuccess + if(ptdls_sta->stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + //ready to clear cam + if(ptdls_sta->cam_entry!=0){ + pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; + rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); + } + rtw_free_stainfo(padapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + } + +exit: + + return; + +} + +//TDLS Discovery Response frame is a management action frame +void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + // unicast probe request frame + _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof (struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + //tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = rx_pkt_pattrib->frag_num; + + fill_tdls_dis_rsp_frbody(padapter, pmgntframe, pframe); + + pattrib->nr_frags = 1; + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + static u8 dialogtoken=0; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, psta->hwaddr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + //for tdls; pattrib->type is used to fill status + pattrib->type = 0; + //PTI frame's priority should be AC_VO + pattrib->priority = 7; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; + if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + _irqL irqL; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; +/* + _enter_critical_bh(&pxmitpriv->lock, &irqL); + if(xmit_tdls_enqueue_for_sleeping_sta(padapter, pmgntframe)==_TRUE){ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + return _FALSE; + } +*/ + if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pmlmeinfo->tdls_dis_req==1 || pmlmeinfo->tdls_dis_req==2){ + report_survey_event(adapter, precv_frame); + } + + return _FAIL; +} + +u8 collect_tdls_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid) +{ + int FIXED_IE=5; + int i; + unsigned int len; + unsigned char *p; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint packet_len = precv_frame->u.hdr.len; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + +// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +// struct registry_priv *pregistrypriv = &padapter->registrypriv; + + //[-24]: mgt_frame hdrlen + len = packet_len - 24 ; + + if (len > MAX_IE_SZ) + { + DBG_8192C("TDLS dis rsp IE too long for survey event\n"); + return _FAIL; + } + + _rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX)); + + //represent tdls peer + bssid->Reserved[1] = 'T'; + + bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; + + //below is to copy the information element + bssid->IELength = len; + _rtw_memcpy(bssid->IEs, (pframe + 24), bssid->IELength); + + //get the signal strength + //bssid->Rssi = precv_frame->u.hdr.attrib.signal_strength; // 0-100 index. + bssid->Rssi = precv_frame->u.hdr.attrib.RecvSignalPower; // in dBM.raw data + bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.signal_qual;//in percentage + bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.signal_strength;//in percentage +#ifdef CONFIG_ANTENNA_DIVERSITY + //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); +#endif + + _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); + + //checking rate info... + i = 0; + p = rtw_get_ie(bssid->IEs + FIXED_IE, _SUPPORTEDRATES_IE_, &len, bssid->IELength - FIXED_IE); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates, (p + 2), len); + i = len; + } + + p = rtw_get_ie(bssid->IEs + FIXED_IE, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - FIXED_IE); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len); + } + + //pframe+10 would be src_addr + _rtw_memcpy(bssid->MacAddress, (pframe+10), ETH_ALEN); + return _SUCCESS; + +} + +#endif + +void issue_beacon(_adapter *padapter) +{ + _irqL irqL; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned int rate_len; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + + //DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); + return; + } + + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->qsel = 0x10; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + //DBG_871X("ie len=%d\n", cur_network->IELength); +#ifdef CONFIG_P2P + // for P2P : Primary Device Type & Device Name + u32 wpsielen=0, insert_len=0; + u8 *wpsie=NULL; + wpsie = rtw_get_wps_ie(cur_network->IEs, cur_network->IELength, NULL, &wpsielen); + + if(pwdinfo->role == P2P_ROLE_GO && wpsie && wpsielen>0) + { + uint wps_offset, remainder_ielen; + u8 *premainder_ie, *pframe_wscie; + + wps_offset = (uint)(wpsie - cur_network->IEs); + + premainder_ie = wpsie + wpsielen; + + remainder_ielen = cur_network->IELength - wps_offset - wpsielen; + + pframe_wscie = pframe + wps_offset; + _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen); + pframe += (wps_offset + wpsielen); + pattrib->pktlen += (wps_offset + wpsielen); + + //now pframe is end of wsc ie, insert Primary Device Type & Device Name + // Primary Device Type + // Type: + *(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + insert_len += 2; + + // Length: + *(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 ); + insert_len += 2; + + // Value: + // Category ID + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + insert_len += 2; + + // OUI + *(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI ); + insert_len += 4; + + // Sub Category ID + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + insert_len += 2; + + + // Device Name + // Type: + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + insert_len += 2; + + // Length: + *(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len ); + insert_len += 2; + + // Value: + _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len ); + insert_len += pwdinfo->device_name_len; + + + //update wsc ie length + *(pframe_wscie+1) = (wpsielen -2) + insert_len; + + //pframe move to end + pframe+=insert_len; + pattrib->pktlen += insert_len; + + //copy remainder_ie to pframe + _rtw_memcpy(pframe, premainder_ie, remainder_ielen); + pframe += remainder_ielen; + pattrib->pktlen += remainder_ielen; + + } + else +#endif //CONFIG_P2P + { + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pattrib->pktlen += cur_network->IELength; + } + +#ifdef CONFIG_P2P + if(pwdinfo->role == P2P_ROLE_GO) + { + u32 len; + + len = build_beacon_p2p_ie(pwdinfo, pframe); + + pframe += len; + pattrib->pktlen += len; + } +#endif //CONFIG_P2P + + goto _issue_bcn; + + } + + //below for ad-hoc mode + + //timestamp will be inserted by hardware + pframe += 8; + pattrib->pktlen += 8; + + // beacon interval: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + // capability info: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); + + //if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u8 erpinfo=0; + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); + + //ERP IE + pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); + } + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); + } + + + //todo:HT for adhoc + +_issue_bcn: + + pmlmepriv->update_bcn = _FALSE; + + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + if ((pattrib->pktlen + TXDESC_SIZE) > 512) + { + DBG_871X("beacon frame too large\n"); + return; + } + + pattrib->last_txcmdsz = pattrib->pktlen; + + //DBG_871X("issue bcn_sz=%d\n", pattrib->last_txcmdsz); + + dump_mgntframe(padapter, pmgntframe); + +} + +void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq) +{ + u8 *pwps_ie; + uint wps_ielen; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac, *bssid; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + unsigned int rate_len; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + //DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); + return; + } + + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = pattrib->hdrlen; + pframe += pattrib->hdrlen; + + + if(cur_network->IELength>MAX_IE_SZ) + return; + +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + pwps_ie = rtw_get_wps_ie(cur_network->IEs, cur_network->IELength, NULL, &wps_ielen); + + //inerset & update wps_probe_resp_ie + if((pmlmepriv->wps_probe_resp_ie!=NULL) && pwps_ie && (wps_ielen>0)) + { + uint wps_offset, remainder_ielen; + u8 *premainder_ie; + + wps_offset = (uint)(pwps_ie - cur_network->IEs); + + premainder_ie = pwps_ie + wps_ielen; + + remainder_ielen = cur_network->IELength - wps_offset - wps_ielen; + + _rtw_memcpy(pframe, cur_network->IEs, wps_offset); + pframe += wps_offset; + pattrib->pktlen += wps_offset; + + wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];//to get ie data len + if((wps_offset+wps_ielen+2)<=MAX_IE_SZ) + { + _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen+2); + pframe += wps_ielen+2; + pattrib->pktlen += wps_ielen+2; + } + + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) + { + _rtw_memcpy(pframe, premainder_ie, remainder_ielen); + pframe += remainder_ielen; + pattrib->pktlen += remainder_ielen; + } + } + else + { + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pattrib->pktlen += cur_network->IELength; + } + + } + else +#endif + { + + //timestamp will be inserted by hardware + pframe += 8; + pattrib->pktlen += 8; + + // beacon interval: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + // capability info: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + //below for ad-hoc mode + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); + + // DS parameter set + pframe =rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u8 erpinfo=0; + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); + + //ERP IE + pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); + } + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); + } + + + //todo:HT for adhoc + + } + +#ifdef CONFIG_P2P + if(pwdinfo->role == P2P_ROLE_GO && is_valid_p2p_probereq) + { + u32 len; + + len = build_probe_resp_p2p_ie(pwdinfo, pframe); + + pframe += len; + pattrib->pktlen += len; + } +#endif //CONFIG_P2P + + + pattrib->last_txcmdsz = pattrib->pktlen; + + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_probereq(_adapter *padapter, u8 blnbc) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac; + unsigned char bssrate[NumRates]; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + int bssrate_len = 0; + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+issue_probereq\n")); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + if ( 0 == blnbc ) + { + // unicast probe request frame + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + } + else + { + // broadcast probe request frame + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); + } + + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_PROBEREQ); + + pframe += sizeof (struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + + pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeext->sitesurvey_res.ss_ssidlen, pmlmeext->sitesurvey_res.ss_ssid, &(pattrib->pktlen)); + + get_rate_set(padapter, bssrate, &bssrate_len); + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + + //add wps_ie for wps2.0 + if(pmlmepriv->probereq_wpsie_len>0 && pmlmepriv->probereq_wpsie_lenprobereq_wpsie, pmlmepriv->probereq_wpsie_len); + pframe += pmlmepriv->probereq_wpsie_len; + pattrib->pktlen += pmlmepriv->probereq_wpsie_len; + //pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero + } + + + pattrib->last_txcmdsz = pattrib->pktlen; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +// if psta == NULL, indiate we are station(client) now... +void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned int val32; + unsigned short val16; + int use_shared_key = 0; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_AUTH); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + + if(psta)// for AP mode + { +#ifdef CONFIG_NATIVEAP_MLME + + _rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + + // setting auth algo number + val16 = (u16)psta->authalg; + + if(status != _STATS_SUCCESSFUL_) + val16 = 0; + + if (val16) { + val16 = cpu_to_le16(val16); + use_shared_key = 1; + } + + pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // setting auth seq number + val16 =(u16)psta->auth_seq; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // setting status code... + val16 = status; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // added challenging text... + if ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) + { + pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, psta->chg_txt, &(pattrib->pktlen)); + } +#endif + } + else + { + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); + + // setting auth algo number + val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)? 1: 0;// 0:OPEN System, 1:Shared key + if (val16) { + val16 = cpu_to_le16(val16); + use_shared_key = 1; + } + //DBG_8192C("%s auth_algo= %s auth_seq=%d\n",__FUNCTION__,(pmlmeinfo->auth_algo==0)?"OPEN":"SHARED",pmlmeinfo->auth_seq); + + //setting IV for auth seq #3 + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) + { + //DBG_8192C("==> iv(%d),key_index(%d)\n",pmlmeinfo->iv,pmlmeinfo->key_index); + val32 = ((pmlmeinfo->iv++) | (pmlmeinfo->key_index << 30)); + val32 = cpu_to_le32(val32); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&val32, &(pattrib->pktlen)); + + pattrib->iv_len = 4; + } + + pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // setting auth seq number + val16 = pmlmeinfo->auth_seq; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + + // setting status code... + val16 = status; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // then checking to see if sending challenging text... + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) + { + pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, pmlmeinfo->chg_txt, &(pattrib->pktlen)); + + SetPrivacy(fctrl); + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + + pattrib->encrypt = _WEP40_; + + pattrib->icv_len = 4; + + pattrib->pktlen += pattrib->icv_len; + + } + + } + + pattrib->last_txcmdsz = pattrib->pktlen; + + rtw_wep_encrypt(padapter, (u8 *)pmgntframe); + + dump_mgntframe(padapter, pmgntframe); + + return; +} + + +void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type) +{ +#ifdef CONFIG_AP_MODE + struct xmit_frame *pmgntframe; + struct ieee80211_hdr *pwlanhdr; + struct pkt_attrib *pattrib; + unsigned char *pbuf, *pframe; + unsigned short val; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + u8 *ie = pnetwork->IEs; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN); + _rtw_memcpy((void *)GetAddr2Ptr(pwlanhdr), myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy((void *)GetAddr3Ptr(pwlanhdr), get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + if ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP)) + SetFrameSubType(pwlanhdr, pkt_type); + else + return; + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen += pattrib->hdrlen; + pframe += pattrib->hdrlen; + + //capability + val = *(unsigned short *)rtw_get_capability_from_ie(ie); + + pframe = rtw_set_fixed_ie(pframe, _CAPABILITY_ , (unsigned char *)&val, &(pattrib->pktlen)); + + status = cpu_to_le16(status); + pframe = rtw_set_fixed_ie(pframe , _STATUS_CODE_ , (unsigned char *)&status, &(pattrib->pktlen)); + + val = cpu_to_le16(pstat->aid | BIT(14) | BIT(15)); + pframe = rtw_set_fixed_ie(pframe, _ASOC_ID_ , (unsigned char *)&val, &(pattrib->pktlen)); + + if (pstat->bssratelen <= 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, pstat->bssratelen, pstat->bssrateset, &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pstat->bssrateset, &(pattrib->pktlen)); + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (pstat->bssratelen-8), pstat->bssrateset+8, &(pattrib->pktlen)); + } + +#ifdef CONFIG_80211N_HT + if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option)) + { + uint ie_len=0; + + //FILL HT CAP INFO IE + //p = hostapd_eid_ht_capabilities_info(hapd, p); + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if(pbuf && ie_len>0) + { + _rtw_memcpy(pframe, pbuf, ie_len+2); + pframe += (ie_len+2); + pattrib->pktlen +=(ie_len+2); + } + + //FILL HT ADD INFO IE + //p = hostapd_eid_ht_operation(hapd, p); + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if(pbuf && ie_len>0) + { + _rtw_memcpy(pframe, pbuf, ie_len+2); + pframe += (ie_len+2); + pattrib->pktlen +=(ie_len+2); + } + + } +#endif + + //FILL WMM IE + if ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option)) + { + uint ie_len=0; + unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + + for (pbuf = ie + _BEACON_IE_OFFSET_; ;pbuf+= (ie_len + 2)) + { + pbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if(pbuf && _rtw_memcmp(pbuf+2, WMM_PARA_IE, 6)) + { + _rtw_memcpy(pframe, pbuf, ie_len+2); + pframe += (ie_len+2); + pattrib->pktlen +=(ie_len+2); + + break; + } + + if ((pbuf == NULL) || (ie_len == 0)) + { + break; + } + } + + } + + + if (pmlmeinfo->assoc_AP_vendor == realtekAP) + { + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); + } + + //add WPS IE ie for wps 2.0 + if(pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len>0) + { + _rtw_memcpy(pframe, pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); + + pframe += pmlmepriv->wps_assoc_resp_ie_len; + pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len; + } + +#ifdef CONFIG_P2P + if((pwdinfo->role == P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE)) + { + u32 len; + + len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code); + + pframe += len; + pattrib->pktlen += len; + } +#endif //CONFIG_P2P + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +#endif +} + +void issue_assocreq(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe, *p; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned short val16; + unsigned int i, ie_len; + unsigned char rf_type, bssrate[NumRates]; + PNDIS_802_11_VARIABLE_IEs pIE; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + int bssrate_len = 0; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 p2pie[ 255 ] = { 0x00 }; + u16 p2pielen = 0; +#endif //CONFIG_P2P + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ASSOCREQ); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //caps + + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + pframe += 2; + pattrib->pktlen += 2; + + //listen interval + //todo: listen interval for power saving + val16 = cpu_to_le16(3); + _rtw_memcpy(pframe ,(unsigned char *)&val16, 2); + pframe += 2; + pattrib->pktlen += 2; + + //SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &(pattrib->pktlen)); + + //supported rate & extended supported rate +#if 0 + get_rate_set(padapter, bssrate, &bssrate_len); +#else + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0) break; + bssrate[bssrate_len] = pmlmeinfo->network.SupportedRates[bssrate_len]; + } +#endif + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //RSN + p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _RSN_IE_2_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if (p != NULL) + { + pframe = rtw_set_ie(pframe, _RSN_IE_2_, ie_len, (p + 2), &(pattrib->pktlen)); + } + +#ifdef CONFIG_80211N_HT + //HT caps + if(padapter->mlmepriv.htpriv.ht_option==_TRUE) + { + p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_CAPABILITY_IE_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if ((p != NULL) && (!(is_ap_in_tkip(padapter)))) + { + _rtw_memcpy(&(pmlmeinfo->HT_caps), (p + 2), sizeof(struct HT_caps_element)); + + //to disable 40M Hz support while gd_bw_40MHz_en = 0 + if (pregpriv->cbw40_enable == 0) + { + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info &= (~(BIT(6) | BIT(1))); + } + else + { + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= BIT(1); + } + + //todo: disable SM power save mode + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x000c; + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + //switch (pregpriv->rf_config) + switch(rf_type) + { + case RF_1T1R: + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_2R, 16); + break; + } + #ifdef RTL8192C_RECONFIG_TO_1T1R + { + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_1R, 16); + } + #endif + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info = cpu_to_le16(pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info); + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, ie_len , (u8 *)(&(pmlmeinfo->HT_caps)), &(pattrib->pktlen)); + + } + } +#endif + + //vendor specific IE, such as WPA, WMM, WPS + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, WPA_OUI, 4)) || + (_rtw_memcmp(pIE->data, WMM_OUI, 4)) || + (_rtw_memcmp(pIE->data, WPS_OUI, 4))) + { + //Commented by Kurt 20110629 + //In some older APs, WPS handshake + //would be fail if we append vender extensions informations to AP + if(_rtw_memcmp(pIE->data, WPS_OUI, 4)){ + pIE->Length=14; + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &(pattrib->pktlen)); + } + break; + + default: + break; + } + + i += (pIE->Length + 2); + } + + if (pmlmeinfo->assoc_AP_vendor == realtekAP) + { + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); + } + +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state != P2P_STATE_NONE ) && ( pwdinfo->p2p_state != P2P_STATE_IDLE ) ) + { + // Should add the P2P IE in the association request frame. + // P2P OUI + + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20101109 + // According to the P2P Specification, the association request frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. Extended Listen Timing + // 3. Device Info + // Commented by Albert 20110516 + // 4. P2P Interface + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Extended Listen Timing + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + // Value: + // Availability Period + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Availability Interval + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + if ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) || + ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) ) + { + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); + } + else + { + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); + } + + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + // P2P Interface + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Device Address + p2pielen += ETH_ALEN; + + p2pie[ p2pielen++ ] = 1; // P2P Interface Address Count + + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Interface Address List + p2pielen += ETH_ALEN; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + } +#endif //CONFIG_P2P + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + +void issue_nulldata(_adapter *padapter, unsigned int power_mode) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s:%d\n", __FUNCTION__, power_mode); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + SetFrDs(fctrl); + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + SetToDs(fctrl); + } + + if (power_mode) + { + SetPwrMgt(fctrl); + } + + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + + +void issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl, *qc; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + pattrib->hdrlen +=2; + pattrib->qos_en = _TRUE; + pattrib->eosp = 1; + pattrib->ack_policy = 0; + pattrib->mdata = 0; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + SetFrDs(fctrl); + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + SetToDs(fctrl); + } + + if(pattrib->mdata) + SetMData(fctrl); + + qc = (unsigned short *)(pframe + pattrib->hdrlen - 2); + + SetPriority(qc, tid); + + SetEOSP(qc, pattrib->eosp); + + SetAckpolicy(qc, pattrib->ack_policy); + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr_qos); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr_qos); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + +} + +void issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_DEAUTH); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + reason = cpu_to_le16(reason); + pframe = rtw_set_fixed_ie(pframe, _RSON_CODE_ , (unsigned char *)&reason, &(pattrib->pktlen)); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); +} + +void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) +{ + u8 category = WLAN_CATEGORY_BACK; + u16 start_seq; + u16 BA_para_set; + u16 reason_code; + u16 BA_timeout_value; + u16 BA_starting_seqctrl; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + u8 *pframe; + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + + //DBG_871X("%s, category=%d, action=%d, status=%d\n", __FUNCTION__, category, action, status); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + //_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + + status = cpu_to_le16(status); + + + if (category == 3) + { + switch (action) + { + case 0: //ADDBA req + do { + pmlmeinfo->dialogToken++; + } while (pmlmeinfo->dialogToken == 0); + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->dialogToken), &(pattrib->pktlen)); + + BA_para_set = (0x1002 | ((status & 0xf) << 2)); //immediate ack & 64 buffer size + //sys_mib.BA_para_set = 0x0802; //immediate ack & 32 buffer size + BA_para_set = cpu_to_le16(BA_para_set); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + + BA_timeout_value = 0; + BA_timeout_value = cpu_to_le16(BA_timeout_value); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_timeout_value)), &(pattrib->pktlen)); + + //if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) + if ((psta = rtw_get_stainfo(pstapriv, raddr)) != NULL) + { + start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07]&0xfff) + 1; + BA_starting_seqctrl = start_seq << 4; + } + BA_starting_seqctrl = cpu_to_le16(BA_starting_seqctrl); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_starting_seqctrl)), &(pattrib->pktlen)); + break; + + case 1: //ADDBA rsp + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->ADDBA_req.dialog_token), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&status), &(pattrib->pktlen)); + BA_para_set = cpu_to_le16((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen)); + break; + case 2://DELBA + BA_para_set = (status & 0x1F) << 3; + BA_para_set = cpu_to_le16(BA_para_set); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + + reason_code = 37;//Requested from peer STA as it does not want to use the mechanism + reason_code = cpu_to_le16(reason_code); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(reason_code)), &(pattrib->pktlen)); + break; + default: + break; + } + } + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); +} + +static void issue_action_BSSCoexistPacket(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + unsigned char category, action; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct wlan_network *pnetwork = NULL; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + _queue *queue = &(pmlmepriv->scanned_queue); + u8 InfoContent[16] = {0}; + u8 ICS[8][15]; + + if((pmlmepriv->num_FortyMHzIntolerant==0) || (pmlmepriv->num_sta_no_ht==0)) + return; + + if(_TRUE == pmlmeinfo->bwmode_updated) + return; + + + DBG_871X("%s\n", __FUNCTION__); + + + category = WLAN_CATEGORY_PUBLIC; + action = ACT_PUBLIC_BSSCOEXIST; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + + + // + if(pmlmepriv->num_FortyMHzIntolerant>0) + { + u8 iedata=0; + + iedata |= BIT(2);//20 MHz BSS Width Request + + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + } + + + // + _rtw_memset(ICS, 0, sizeof(ICS)); + if(pmlmepriv->num_sta_no_ht>0) + { + int i; + + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + phead = get_list_head(queue); + plist = get_next(phead); + + while(1) + { + int len; + u8 *p; + WLAN_BSSID_EX *pbss_network; + + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + plist = get_next(plist); + + pbss_network = (WLAN_BSSID_EX *)&pnetwork->network; + + p = rtw_get_ie(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_); + if((p==NULL) || (len==0))//non-HT + { + if((pbss_network->Configuration.DSConfig<=0) || (pbss_network->Configuration.DSConfig>14)) + continue; + + ICS[0][pbss_network->Configuration.DSConfig]=1; + + if(ICS[0][0] == 0) + ICS[0][0] = 1; + } + + } + + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + + for(i= 0;i<8;i++) + { + if(ICS[i][0] == 1) + { + int j, k = 0; + + InfoContent[k] = i; + //SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent,i); + k++; + + for(j=1;j<=14;j++) + { + if(ICS[i][j]==1) + { + if(k<16) + { + InfoContent[k] = j; //channel number + //SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j); + k++; + } + } + } + + pframe = rtw_set_ie(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &(pattrib->pktlen)); + + } + + } + + + } + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta = NULL; + //struct recv_reorder_ctrl *preorder_ctrl; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u16 tid; + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) + return _SUCCESS; + + psta = rtw_get_stainfo(pstapriv, addr); + if(psta==NULL) + return _SUCCESS; + + //DBG_8192C("%s:%s\n", __FUNCTION__, (initiator==0)?"RX_DIR":"TX_DIR"); + + if(initiator==0) // recipient + { + for(tid = 0;tidrecvreorder_ctrl[tid].enable == _TRUE) + { + DBG_8192C("rx agg disable tid(%d)\n",tid); + issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F)); + psta->recvreorder_ctrl[tid].enable = _FALSE; + psta->recvreorder_ctrl[tid].indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + psta->recvreorder_ctrl[tid].indicate_seq); + #endif + } + } + } + else if(initiator == 1)// originator + { + //DBG_8192C("tx agg_enable_bitmap(0x%08x)\n", psta->htpriv.agg_enable_bitmap); + for(tid = 0;tidhtpriv.agg_enable_bitmap & BIT(tid)) + { + DBG_8192C("tx agg disable tid(%d)\n",tid); + issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F) ); + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + + } + } + } + + return _SUCCESS; + +} + +unsigned int send_beacon(_adapter *padapter) +{ + u8 bxmitok = _FALSE; + int retry=0; + +#ifdef CONFIG_PCI_HCI + + //DBG_871X("%s\n", __FUNCTION__); + + issue_beacon(padapter); + + return _SUCCESS; + +#endif + +#ifdef CONFIG_USB_HCI + do{ + + issue_beacon(padapter); + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_TX_BCN_DONE, (u8 *)(&bxmitok)); + + }while((_FALSE == bxmitok) &&((retry++)<100 )); + + if(retry == 100) + { + DBG_871X("send_beacon, fail!\n"); + return _FAIL; + } + else + { + return _SUCCESS; + } +#endif + +} + +/**************************************************************************** + +Following are some utitity fuctions for WiFi MLME + +*****************************************************************************/ + +BOOLEAN IsLegal5GChannel( + IN PADAPTER Adapter, + IN u8 channel) +{ + + int i=0; + u8 Channel_5G[45] = {36,38,40,42,44,46,48,50,52,54,56,58, + 60,62,64,100,102,104,106,108,110,112,114,116,118,120,122, + 124,126,128,130,132,134,136,138,140,149,151,153,155,157,159, + 161,163,165}; + for(i=0;imlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + static unsigned char prev_survey_channel = 0; + static unsigned int p2p_scan_count = 0; +#endif //CONFIG_P2P + +#ifdef CONFIG_TDLS + u32 v, bit_6=1<<6; + if(pmlmeinfo->tdls_dis_req==1){ + SelectChannel(padapter, pmlmeext->cur_channel); + + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + //when we already set at a direct link and also want to dicovery TDLS STAs + //it is used to avoiding RCR DATA BIT on + v = rtw_read32(padapter, 0x0608); + v &= ~(bit_6); + rtw_write32(padapter, 0x0608, v); + + issue_tdls_dis_req(padapter); + + set_survey_timer(pmlmeext, 300); + + pmlmeinfo->tdls_dis_req=2; + return; + } + else if(pmlmeinfo->tdls_dis_req==2){ + pmlmeinfo->tdls_dis_req=3; + + //config MSR + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + //turn on dynamic functions + Restore_DM_Func_Flag(padapter); + + report_surveydone_event(padapter); + + pmlmeext->chan_scan_time = SURVEY_TO; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + return; + } +#endif + +#ifdef CONFIG_P2P + if ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) + { + if ( pwdinfo->find_phase_state_exchange_cnt != 0 ) + { + // Commented by Albert 2011/06/03 + // The driver is in the find phase, it should go through the social channel. + survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx]; + ScanType = SCAN_ACTIVE; + } + else + { + // Commented by Albert 2011/06/03 + // The driver is in the scan phase, it should go through all the channel. + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; + ScanType = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ScanType; + } + } + else if ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) + { + // Commented by Albert 2011/07/06 + // The driver is trying to transmit the provision discovery request frame. + // Before that, the driver will try to send the probe request frame to make sure the peer device is available. + if ( _TRUE == pwdinfo->tx_prov_disc_info.benable) + { + survey_channel = pwdinfo->tx_prov_disc_info.peer_channel_num[ pmlmeext->sitesurvey_res.channel_idx ]; + } + else + { + survey_channel = 0; + } + ScanType = SCAN_ACTIVE; + } + else if ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) + { + // commented by Albert 20110707 + // The driver is trying to transmit the negotiation request frame. + // Before that, the driver will try to send the probe request frame to make sure the peer device is available. + if ( _TRUE == pwdinfo->nego_req_info.benable ) + { + survey_channel = pwdinfo->nego_req_info.peer_channel_num[ pmlmeext->sitesurvey_res.channel_idx ]; + } + else + { + survey_channel = 0; + } + ScanType = SCAN_ACTIVE; + } + else +#endif //CONFIG_P2P + { + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; + ScanType = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ScanType; + } + + if(survey_channel != 0) + { + + //DBG_871X("switching to channel:%d at %dms\n", + // survey_channel, rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time) + //); + //PAUSE 4-AC Queue when site_survey + //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); + //val8 |= 0x0f; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); + + if(pmlmeext->sitesurvey_res.channel_idx == 0) + { + set_channel_bwmode(padapter, survey_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + else + { + SelectChannel(padapter, survey_channel); + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1) + pmlmeinfo->tdls_cur_channel =survey_channel; +#endif + + //DBG_871X("%s scan_mode:%d, ScanType:%d\n", __FUNCTION__, pmlmeext->sitesurvey_res.scan_mode, ScanType); + if((pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) && (ScanType == SCAN_ACTIVE)) + { + +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || + ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) + ) + { + issue_probereq_p2p(padapter); + issue_probereq_p2p(padapter); + issue_probereq_p2p(padapter); + } + else if ( ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) || + ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) ) + { + issue_probereq_p2p(padapter); + } + else +#endif //CONFIG_P2P + { + //todo: to issue two probe req??? + issue_probereq(padapter, 1); + //rtw_msleep_os(SURVEY_TO>>1); + issue_probereq(padapter, 1); + } + } + + set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); + + } + else + { + + // channel number is 0 or this channel is not valid. +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) + { + DBG_8192C( "[%s] find phase exchange cnt = %d\n", __FUNCTION__, pwdinfo->find_phase_state_exchange_cnt ); + } + + if ( ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) || + ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) ) + { + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); + } + + if ( ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) && + ( pwdinfo->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_CNT ) ) + { + // Set the P2P State to the listen state of find phase and set the current channel to the listen channel + pwdinfo->p2p_state = P2P_STATE_FIND_PHASE_LISTEN; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + _set_timer( &pwdinfo->find_phase_timer, ( u32 ) ( ( u32 ) ( pwdinfo->listen_dwell ) * 100 ) ); + } + else +#endif //CONFIG_P2P + + { + +#ifdef CONFIG_ANTENNA_DIVERSITY + // 20100721:Interrupt scan operation here. + // For SW antenna diversity before link, it needs to switch to another antenna and scan again. + // It compares the scan result and select beter one to do connection. + if(padapter->HalFunc.SwAntDivBeforeLinkHandler(padapter)) + { + pmlmeext->sitesurvey_res.bss_cnt = 0; + pmlmeext->sitesurvey_res.channel_idx = -1; + pmlmeext->chan_scan_time = SURVEY_TO /2; + set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); + return; + } +#endif + +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) + { + pwdinfo->p2p_state = P2P_STATE_LISTEN; + } +#endif //CONFIG_P2P + + pmlmeext->sitesurvey_res.state = SCAN_COMPLETE; + + //switch back to the original channel + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); + +#ifdef CONFIG_P2P + if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_OK ) + { + DBG_8192C( "[%s] In P2P WPS mode, stay in the peer operating channel = %d\n", __FUNCTION__, pwdinfo->peer_operating_ch ); + set_channel_bwmode(padapter, pwdinfo->peer_operating_ch, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + } + else +#endif //CONFIG_P2P + { + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + } + + //flush 4-AC Queue after site_survey + //val8 = 0; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); + + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + //config MSR + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + //turn on dynamic functions + Restore_DM_Func_Flag(padapter); + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); + + if (is_client_associated_to_ap(padapter) == _TRUE) + { + //issue null data + issue_nulldata(padapter, 0); + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1){ + u8 i, min; + pmlmeinfo->tdls_ch_sensing=0; + pmlmeinfo->tdls_cur_channel=1; + min=pmlmeinfo->tdls_collect_pkt_num[0]; + for(i=1; i<14-1; i++){ + if(min > pmlmeinfo->tdls_collect_pkt_num[i]){ + pmlmeinfo->tdls_cur_channel=i+1; + min=pmlmeinfo->tdls_collect_pkt_num[i]; + } + pmlmeinfo->tdls_collect_pkt_num[i]=0; + } + pmlmeinfo->tdls_collect_pkt_num[0]=0; + pmlmeinfo->tdls_candidate_ch=pmlmeinfo->tdls_cur_channel; + DBG_8192C("TDLS channel sensing done, candidate channel: %02x\n", pmlmeinfo->tdls_candidate_ch); + pmlmeinfo->tdls_cur_channel=0; + + // If we support TDLS, then when we finished site survey, + // we stil turn RCR_CBSSID_DATA off, + // such we can receive all kinds of data frames. + v = rtw_read32(padapter, 0x0608); + bit_6=1<<6; + v &= ~(bit_6); + rtw_write32(padapter, 0x0608, v); + } +#else + report_surveydone_event(padapter); +#endif + pmlmeext->chan_scan_time = SURVEY_TO; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + + issue_action_BSSCoexistPacket(padapter); + issue_action_BSSCoexistPacket(padapter); + issue_action_BSSCoexistPacket(padapter); + + } + + } + + return; + +} + +//collect bss info from Beacon and Probe response frames. +u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid) +{ + int i; + u32 len; + u8 *p; + u16 val16, subtype; + u8 *pframe = precv_frame->u.hdr.rx_data; + u32 packet_len = precv_frame->u.hdr.len; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + len = packet_len - sizeof(struct ieee80211_hdr_3addr); + + if (len > MAX_IE_SZ) + { + //DBG_8192C("IE too long for survey event\n"); + return _FAIL; + } + + _rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX)); + + subtype = GetFrameSubType(pframe) >> 4; + + if(subtype==WIFI_BEACON) + bssid->Reserved[0] = 1; + + bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; + + //below is to copy the information element + bssid->IELength = len; + _rtw_memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength); + + //get the signal strength + //bssid->Rssi = precv_frame->u.hdr.attrib.signal_strength; // 0-100 index. + bssid->Rssi = precv_frame->u.hdr.attrib.RecvSignalPower; // in dBM.raw data + bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.signal_qual;//in percentage + bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.signal_strength;//in percentage +#ifdef CONFIG_ANTENNA_DIVERSITY + //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); +#endif + + // checking SSID + if ((p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_)) == NULL) + { + DBG_871X("marc: cannot find SSID for survey event\n"); + return _FAIL; + } + + if (*(p + 1)) + { + _rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); + bssid->Ssid.SsidLength = *(p + 1); + } + else + { + bssid->Ssid.SsidLength = 0; + } + + _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); + + //checking rate info... + i = 0; + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates, (p + 2), len); + i = len; + } + + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len); + } + + //todo: +#if 0 + if (judge_network_type(bssid->SupportedRates, (len + i)) == WIRELESS_11B) + { + bssid->NetworkTypeInUse = Ndis802_11DS; + } + else +#endif + { + bssid->NetworkTypeInUse = Ndis802_11OFDM24; + } + + // Checking for DSConfig + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + + bssid->Configuration.DSConfig = 0; + bssid->Configuration.Length = 0; + + if (p) + { + bssid->Configuration.DSConfig = *(p + 2); + } + else + {// In 5G, some ap do not have DSSET IE + // checking HT info for channel + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if(p) + { + struct HT_info_element *HT_info = (struct HT_info_element *)(p + 2); + bssid->Configuration.DSConfig = HT_info->primary_channel; + } + else + { // use current channel + if (padapter->mlmeextpriv.sitesurvey_res.state == SCAN_PROCESS) + bssid->Configuration.DSConfig = padapter->mlmeextpriv.channel_set[padapter->mlmeextpriv.sitesurvey_res.channel_idx].ChannelNum; + else + bssid->Configuration.DSConfig = padapter->mlmeextpriv.cur_channel; + } + } + + _rtw_memcpy(&bssid->Configuration.BeaconPeriod, rtw_get_beacon_interval_from_ie(bssid->IEs), 2); + + + bssid->Configuration.BeaconPeriod = le32_to_cpu(bssid->Configuration.BeaconPeriod); + + val16 = rtw_get_capability((WLAN_BSSID_EX *)bssid); + + if (val16 & BIT(0)) + { + bssid->InfrastructureMode = Ndis802_11Infrastructure; + _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); + } + else + { + bssid->InfrastructureMode = Ndis802_11IBSS; + _rtw_memcpy(bssid->MacAddress, GetAddr3Ptr(pframe), ETH_ALEN); + } + + if (val16 & BIT(4)) + bssid->Privacy = 1; + else + bssid->Privacy = 0; + + bssid->Configuration.ATIMWindow = 0; + + //20/40 BSS Coexistence check + if((pregistrypriv->wifi_spec==1) && (_FALSE == pmlmeinfo->bwmode_updated)) + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if(p && len>0) + { + struct HT_caps_element *pHT_caps; + pHT_caps = (struct HT_caps_element *)(p + 2); + + if(pHT_caps->HT_cap_element.HT_caps_info&BIT(14)) + { + pmlmepriv->num_FortyMHzIntolerant++; + } + } + else + { + pmlmepriv->num_sta_no_ht++; + } + + } + + return _SUCCESS; + +} + +void start_create_ibss(_adapter* padapter) +{ + unsigned short caps; + u32 val32; + u8 val8; + u8 join_type; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; + pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); + + //update wireless mode + update_wireless_mode(padapter); + + //udpate capability + caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); + update_capinfo(padapter, caps); + if(caps&cap_IBSS)//adhoc master + { + //set_opmode_cmd(padapter, adhoc);//removed + + val8 = 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //switch channel + //SelectChannel(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE); + set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + + beacon_timing_control(padapter); + + //set msr to WIFI_FW_ADHOC_STATE + pmlmeinfo->state = WIFI_FW_ADHOC_STATE; + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + //issue beacon + if(send_beacon(padapter)==_FAIL) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing beacon frame fail....\n")); + + report_join_res(padapter, -1); + pmlmeinfo->state = WIFI_FW_NULL_STATE; + } + else + { + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress); + join_type = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + report_join_res(padapter, 1); + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; + } + } + else + { + DBG_871X("start_create_ibss, invalid cap:%x\n", caps); + return; + } + +} + +void start_clnt_join(_adapter* padapter) +{ + unsigned short caps; + u8 val8; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + + + pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; + pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); + + //update wireless mode + update_wireless_mode(padapter); + + //udpate capability + caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); + update_capinfo(padapter, caps); + if (caps&cap_ESS) + { + Set_NETYPE0_MSR(padapter, WIFI_FW_STATION_STATE); + + val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //switch channel + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + //here wait for receiving the beacon to start auth + //and enable a timer + set_link_timer(pmlmeext, decide_wait_for_beacon_timeout(pmlmeinfo->bcn_interval)); + + pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE; + } + else if (caps&cap_IBSS) //adhoc client + { + Set_NETYPE0_MSR(padapter, WIFI_FW_ADHOC_STATE); + + val8 = 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //switch channel + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + beacon_timing_control(padapter); + + pmlmeinfo->state = WIFI_FW_ADHOC_STATE; + + report_join_res(padapter, 1); + } + else + { + //DBG_8192C("marc: invalid cap:%x\n", caps); + return; + } + +} + +void start_clnt_auth(_adapter* padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + _cancel_timer_ex(&pmlmeext->link_timer); + + pmlmeinfo->state &= (~WIFI_FW_AUTH_NULL); + pmlmeinfo->state |= WIFI_FW_AUTH_STATE; + + pmlmeinfo->auth_seq = 1; + pmlmeinfo->reauth_count = 0; + pmlmeinfo->reassoc_count = 0; + pmlmeinfo->link_count = 0; + + issue_auth(padapter, NULL, 0); + + set_link_timer(pmlmeext, REAUTH_TO); + +} + + +void start_clnt_assoc(_adapter* padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + _cancel_timer_ex(&pmlmeext->link_timer); + + pmlmeinfo->state &= (~(WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE)); + pmlmeinfo->state |= (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE); + + issue_assocreq(padapter); + + set_link_timer(pmlmeext, REASSOC_TO); +} + +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //check A3 + if (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) + return _SUCCESS; + + DBG_871X("%s\n", __FUNCTION__); + + if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + { + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_del_sta_event(padapter, MacAddr, reason); + } + else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) + { + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_join_res(padapter, -2); + } + } + + return _SUCCESS; +} + +/**************************************************************************** + +Following are the functions to report events + +*****************************************************************************/ + +void report_survey_event(_adapter *padapter, union recv_frame *precv_frame) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct survey_event *psurvey_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + //u8 *pframe = precv_frame->u.hdr.rx_data; + //uint len = precv_frame->u.hdr.len; +#ifdef CONFIG_TDLS + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 *pframe = get_recvframe_data(precv_frame); +#endif + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct survey_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct survey_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_Survey); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + psurvey_evt = (struct survey_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + +#ifdef CONFIG_TDLS + //when tdls_dis_req is on, it would only report STAs who respond TDLS discovery response frame + if((pmlmeinfo->tdls_dis_req==1 || pmlmeinfo->tdls_dis_req==2)){ + if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){ + if (collect_tdls_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL){ + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pevtcmd, cmdsz); + return; + } + } + }else +#endif + if (collect_bss_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pevtcmd, cmdsz); + return; + } + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + pmlmeext->sitesurvey_res.bss_cnt++; + + return; + +} + +void report_surveydone_event(_adapter *padapter) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct surveydone_event *psurveydone_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct surveydone_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct surveydone_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_SurveyDone); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + psurveydone_evt = (struct surveydone_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + psurveydone_evt->bss_cnt = pmlmeext->sitesurvey_res.bss_cnt; + + //DBG_871X("survey done event(%x)\n", psurveydone_evt->bss_cnt); + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; + +} + +void report_join_res(_adapter *padapter, int res) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct joinbss_event *pjoinbss_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct joinbss_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_JoinBss); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + pjoinbss_evt = (struct joinbss_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + _rtw_memcpy((unsigned char *)(&(pjoinbss_evt->network.network)), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); + pjoinbss_evt->network.join_res = pjoinbss_evt->network.aid = res; + + //DBG_871X("report_join_res(%d)\n", res); + + #ifdef CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network); + #endif //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; + +} + +void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct stadel_event *pdel_sta_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct stadel_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_DelSTA); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + pdel_sta_evt = (struct stadel_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + _rtw_memcpy((unsigned char *)(&(pdel_sta_evt->macaddr)), MacAddr, ETH_ALEN); + _rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd),(unsigned char *)(&reason),2); + + DBG_871X("rtl8192: delete STA\n"); + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; +} + +void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct stassoc_event *padd_sta_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct stassoc_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct stassoc_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_AddSTA); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + padd_sta_evt = (struct stassoc_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + _rtw_memcpy((unsigned char *)(&(padd_sta_evt->macaddr)), MacAddr, ETH_ALEN); + padd_sta_evt->cam_id = cam_idx; + + DBG_871X("report_add_sta_event: add STA\n"); + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; +} + + +/**************************************************************************** + +Following are the event callback functions + +*****************************************************************************/ + +//for sta/adhoc mode +static void update_sta_info(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //ERP + VCS_update(padapter, psta); + + + //HT + if(pmlmepriv->htpriv.ht_option) + { + psta->htpriv.ht_option = _TRUE; + + psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable; + + if (support_short_GI(padapter, &(pmlmeinfo->HT_caps))) + psta->htpriv.sgi = _TRUE; + + psta->qos_option = _TRUE; + + } + else + { + psta->htpriv.ht_option = _FALSE; + + psta->htpriv.ampdu_enable = _FALSE; + + psta->htpriv.sgi = _FALSE; + + psta->qos_option = _FALSE;//? + + } + + psta->htpriv.bwmode = pmlmeext->cur_bwmode; + psta->htpriv.ch_offset = pmlmeext->cur_ch_offset; + + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + + //QoS + if(pmlmepriv->qospriv.qos_option) + psta->qos_option = _TRUE; + + + psta->state = _FW_LINKED; + +} + +u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0}; + +void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) +{ + struct sta_info *psta, *psta_bmc; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 join_type, init_rts_rate; + + if(join_res < 0) + { + join_type = 1; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); + return; + } + + if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + //for bc/mc + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(psta_bmc) + { + pmlmeinfo->FW_sta_info[psta_bmc->mac_id].psta = psta_bmc; + update_bmc_sta_support_rate(padapter, psta_bmc->mac_id); + Update_RA_Entry(padapter, psta_bmc->mac_id); + } + } + + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); + if (psta)//only for infra. mode + { + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; + } + + //turn on dynamic functions + Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); + + // update IOT-releated issue + update_IOT_info(padapter); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates); + + //BCN interval + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval)); + + //udpate capability + update_capinfo(padapter, pmlmeinfo->capability); + + //WMM, Update EDCA param + WMMOnAssocRsp(padapter); + + //HT + HTOnAssocRsp(padapter); + + //update sta_info + if (psta) //only for infra. mode + { + //DBG_871X("set_sta_rate & update_sta_info\n"); + + //set per sta rate after updating HT cap. + set_sta_rate(padapter, psta); + + update_sta_info(padapter, psta); + } + + join_type = 2; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + // correcting TSF + correct_TSF(padapter, pmlmeext); + + //set_link_timer(pmlmeext, DISCONNECT_TO); + pmlmeext->linked_to = LINKED_TO; + } + +#ifdef CONFIG_LPS + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0); +#endif + + //DBG_871X("=>%s\n", __FUNCTION__); + +} + +void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 join_type; + + DBG_871X("%s\n", __FUNCTION__); + + if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + if(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)//adhoc master or sta_count>1 + { + //nothing to do + } + else//adhoc client + { + //update TSF Value + //update_TSF(pmlmeext, pframe, len); + + // correcting TSF + correct_TSF(padapter, pmlmeext); + + //start beacon + if(send_beacon(padapter)==_FAIL) + { + pmlmeinfo->FW_sta_info[psta->mac_id].status = 0; + + pmlmeinfo->state ^= WIFI_FW_ADHOC_STATE; + + return; + } + + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; + + } + + join_type = 2; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + } + + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; + + //rate radaptive + Update_RA_Entry(padapter, psta->mac_id); + + //update adhoc sta_info + update_sta_info(padapter, psta); + + pmlmeext->linked_to = LINKED_TO; + +} + +void mlmeext_sta_del_event_callback(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter)) + { + //set_opmode_cmd(padapter, infra_client_with_mlme); + + //switch to the 20M Hz mode after disconnect + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); + + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + flush_all_cam_entry(padapter); + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + //set MSR to no link state + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + pmlmeext->linked_to = 0; + _cancel_timer_ex(&pmlmeext->link_timer); + + } + +} + +/**************************************************************************** + +Following are the functions for the timer handlers + +*****************************************************************************/ + +void _linked_rx_signal_strehgth_display(_adapter *padapter) +{ + int UndecoratedSmoothedPWDB; + DBG_8192C("============ linked status check ===================\n"); + DBG_8192C("pathA Rx SNRdb:%d\n",padapter->recvpriv.RxSNRdB[0]); + DBG_8192C("pathA Rx PWDB:%d\n",padapter->recvpriv.rxpwdb); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + DBG_8192C("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB); + DBG_8192C("Rx RSSI:%d\n",padapter->recvpriv.rssi); + DBG_8192C("Rx Signal_strength:%d\n",padapter->recvpriv.signal_strength); + DBG_8192C("Rx Signal_qual:%d \n",padapter->recvpriv.signal_qual); + DBG_8192C("============ linked status check ===================\n"); + DBG_8192C(" DIG PATH-A(0x%02x), PATH-B(0x%02x)\n",rtw_read8(padapter,0xc50),rtw_read8(padapter,0xc58)); + DBG_8192C(" OFDM -Alarm DA2(0x%04x),DA4(0x%04x),DA6(0x%04x),DA8(0x%04x)\n", + rtw_read16(padapter,0xDA2),rtw_read16(padapter,0xDA4),rtw_read16(padapter,0xDA6),rtw_read16(padapter,0xDA8)); + + DBG_8192C(" CCK -Alarm A5B(0x%02x),A5C(0x%02x)\n",rtw_read8(padapter,0xA5B),rtw_read8(padapter,0xA5C)); + +} + +void linked_status_chk(_adapter *padapter) +{ + u32 i; + struct sta_info *psta; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct recv_priv *precvpriv = &(padapter->recvpriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + + if (is_client_associated_to_ap(padapter)) + { + if(padapter->bRxRSSIDisplay) + _linked_rx_signal_strehgth_display(padapter); + + //linked infrastructure client mode + if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) + { + /*to monitor whether the AP is alive or not*/ + if (psta->sta_stats.last_rx_pkts == psta->sta_stats.rx_pkts) + { + // Commented by Albert 2010/07/21 + // In this case, there is no any rx packet received by driver. + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmeext->retry<2) + #else + if(pmlmeext->retry<8)// Alter the retry limit to 8 + #endif + { + if(pmlmeext->retry==0) + { + _rtw_memcpy(pmlmeext->sitesurvey_res.ss_ssid, pmlmeinfo->network.Ssid.Ssid, pmlmeinfo->network.Ssid.SsidLength); + pmlmeext->sitesurvey_res.ss_ssidlen = pmlmeinfo->network.Ssid.SsidLength; + pmlmeext->sitesurvey_res.scan_mode = SCAN_ACTIVE; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + if(padapter->HalFunc.sreset_linked_status_check) + padapter->HalFunc.sreset_linked_status_check(padapter); + #endif + + //DBG_871X("issue_probereq to check if ap alive, retry=%d\n", pmlmeext->retry); + + // In order to know the AP's current state, try to send the probe request + // to trigger the AP to send the probe response. + issue_probereq(padapter, 0); + issue_probereq(padapter, 0); + issue_probereq(padapter, 0); + } + + pmlmeext->retry++; + pmlmeext->linked_to = LINKED_TO; + } + else + { + pmlmeext->retry = 0; + DBG_871X("no beacon to call receive_disconnect()\n"); + receive_disconnect(padapter, pmlmeinfo->network.MacAddress + , 65535// indicate disconnect caused by no rx + ); + pmlmeinfo->link_count = 0; + return; + } + } + else + { + pmlmeext->retry = 0; + psta->sta_stats.last_rx_pkts = psta->sta_stats.rx_pkts; + //set_link_timer(pmlmeext, DISCONNECT_TO); + pmlmeext->linked_to = LINKED_TO; + } + + /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ + if (pmlmeinfo->link_count++ == 0) + { + pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; + } + else if ((pmlmeinfo->link_count & 0xf) == 0) + { + if ( pxmitpriv->last_tx_pkts == pxmitpriv->tx_pkts) + { + //DBG_871X("(Interface %d)issue nulldata to keep alive\n",padapter->dvobjpriv.InterfaceNumber); + issue_nulldata(padapter, 0); + } + + pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; + } + + } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) + } + else if (is_client_associated_to_ibss(padapter)) + { + //linked IBSS mode + //for each assoc list entry to check the rx pkt counter + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) + { + if (pmlmeinfo->FW_sta_info[i].status == 1) + { + psta = pmlmeinfo->FW_sta_info[i].psta; + + if(NULL==psta) continue; + + if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) + { + + if(pmlmeinfo->FW_sta_info[i].retry<3) + { + pmlmeinfo->FW_sta_info[i].retry++; + } + else + { + pmlmeinfo->FW_sta_info[i].retry = 0; + pmlmeinfo->FW_sta_info[i].status = 0; + report_del_sta_event(padapter, psta->hwaddr + , 65535// indicate disconnect caused by no rx + ); + } + } + else + { + pmlmeinfo->FW_sta_info[i].retry = 0; + pmlmeinfo->FW_sta_info[i].rx_pkt = (u32)psta->sta_stats.rx_pkts; + } + } + } + + //set_link_timer(pmlmeext, DISCONNECT_TO); + pmlmeext->linked_to = LINKED_TO; + + } + +} + +void survey_timer_hdl(_adapter *padapter) +{ + struct cmd_obj *ph2c; + struct sitesurvey_parm *psurveyPara; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + //DBG_8192C("marc: survey timer\n"); + + //issue rtw_sitesurvey_cmd + if (pmlmeext->sitesurvey_res.state > SCAN_START) + { + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + pmlmeext->sitesurvey_res.channel_idx++; + + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + goto exit_survey_timer_hdl; + } + + if ((psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm))) == NULL) + { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + goto exit_survey_timer_hdl; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); + rtw_enqueue_cmd(pcmdpriv, ph2c); + } + + +exit_survey_timer_hdl: + + return; +} + +void link_timer_hdl(_adapter *padapter) +{ + static unsigned int rx_pkt = 0; + static u64 tx_cnt = 0; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) + { + DBG_871X("link_timer_hdl:no beacon while connecting\n"); + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_join_res(padapter, -3); + } + else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE) + { + //re-auth timer + if (++pmlmeinfo->reauth_count > REAUTH_LIMIT) + { + if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto) + { + pmlmeinfo->state = 0; + report_join_res(padapter, -1); + return; + } + else + { + pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; + pmlmeinfo->reauth_count = 0; + } + } + + DBG_871X("link_timer_hdl: auth timeout and try again\n"); + pmlmeinfo->auth_seq = 1; + issue_auth(padapter, NULL, 0); + set_link_timer(pmlmeext, REAUTH_TO); + } + else if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE) + { + //re-assoc timer + if (++pmlmeinfo->reassoc_count > REASSOC_LIMIT) + { + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_join_res(padapter, -2); + return; + } + + DBG_871X("link_timer_hdl: assoc timeout and try again\n"); + issue_assocreq(padapter); + set_link_timer(pmlmeext, REASSOC_TO); + } +#if 0 + else if (is_client_associated_to_ap(padapter)) + { + //linked infrastructure client mode + if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) + { + /*to monitor whether the AP is alive or not*/ + if (rx_pkt == psta->sta_stats.rx_pkts) + { + receive_disconnect(padapter, pmlmeinfo->network.MacAddress); + return; + } + else + { + rx_pkt = psta->sta_stats.rx_pkts; + set_link_timer(pmlmeext, DISCONNECT_TO); + } + + //update the EDCA paramter according to the Tx/RX mode + update_EDCA_param(padapter); + + /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ + if (pmlmeinfo->link_count++ == 0) + { + tx_cnt = pxmitpriv->tx_pkts; + } + else if ((pmlmeinfo->link_count & 0xf) == 0) + { + if (tx_cnt == pxmitpriv->tx_pkts) + { + issue_nulldata(padapter, 0); + } + + tx_cnt = pxmitpriv->tx_pkts; + } + } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) + } + else if (is_client_associated_to_ibss(padapter)) + { + //linked IBSS mode + //for each assoc list entry to check the rx pkt counter + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) + { + if (pmlmeinfo->FW_sta_info[i].status == 1) + { + psta = pmlmeinfo->FW_sta_info[i].psta; + + if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) + { + pmlmeinfo->FW_sta_info[i].status = 0; + report_del_sta_event(padapter, psta->hwaddr); + } + else + { + pmlmeinfo->FW_sta_info[i].rx_pkt = psta->sta_stats.rx_pkts; + } + } + } + + set_link_timer(pmlmeext, DISCONNECT_TO); + } +#endif + + return; +} + +void addba_timer_hdl(struct sta_info *psta) +{ + u8 bitmap; + u16 tid; + struct ht_priv *phtpriv; + + if(!psta) + return; + + phtpriv = &psta->htpriv; + + if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) + { + if(phtpriv->candidate_tid_bitmap) + phtpriv->candidate_tid_bitmap=0x0; + + } + +} + +u8 NULL_hdl(_adapter *padapter, u8 *pbuf) +{ + return H2C_SUCCESS; +} + +u8 setopmode_hdl(_adapter *padapter, u8 *pbuf) +{ + u8 type; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct setopmode_parm *psetop = (struct setopmode_parm *)pbuf; + + if(psetop->mode == Ndis802_11APMode) + { + pmlmeinfo->state = WIFI_FW_AP_STATE; + type = _HW_STATE_AP_; +#ifdef CONFIG_NATIVEAP_MLME + //start_ap_mode(padapter); +#endif + } + else if(psetop->mode == Ndis802_11Infrastructure) + { + type = _HW_STATE_STATION_; + } + else if(psetop->mode == Ndis802_11IBSS) + { + type = _HW_STATE_ADHOC_; + } + else + { + type = _HW_STATE_NOLINK_; + } + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); + //Set_NETYPE0_MSR(padapter, type); + + return H2C_SUCCESS; + +} + +u8 createbss_hdl(_adapter *padapter, u8 *pbuf) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; + u32 initialgain; + + + if(pparm->network.InfrastructureMode == Ndis802_11APMode) + { +#ifdef CONFIG_AP_MODE + + if(pmlmeinfo->state == WIFI_FW_AP_STATE) + { + //todo: + return H2C_SUCCESS; + } +#endif + } + + //below is for ad-hoc master + if(pparm->network.InfrastructureMode == Ndis802_11IBSS) + { + rtw_joinbss_reset(padapter); + + pmlmeext->linked_to = 0; + + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmlmeinfo->ERP_enable = 0; + pmlmeinfo->WMM_enable = 0; + pmlmeinfo->HT_enable = 0; + pmlmeinfo->HT_caps_enable = 0; + pmlmeinfo->HT_info_enable = 0; + pmlmeinfo->agg_enable_bitmap = 0; + pmlmeinfo->candidate_tid_bitmap = 0; + + //disable dynamic functions, such as high power, DIG + Save_DM_Func_Flag(padapter); + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //config the initial gain under linking, need to write the BB registers + initialgain = 0x30; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + //cancel link timer + _cancel_timer_ex(&pmlmeext->link_timer); + + //clear CAM + flush_all_cam_entry(padapter); + + _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); + pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength; + + if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength + return H2C_PARAMETERS_ERROR; + + _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); + + start_create_ibss(padapter); + + } + + return H2C_SUCCESS; + +} + +u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) +{ + u8 join_type; + PNDIS_802_11_VARIABLE_IEs pIE; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; + u32 acparm, initialgain, i; + + //check already connecting to AP or not + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + { + if (pmlmeinfo->state & WIFI_FW_STATION_STATE) + { + issue_deauth(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING); + } + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + //clear CAM + flush_all_cam_entry(padapter); + + _cancel_timer_ex(&pmlmeext->link_timer); + + //set MSR to nolink + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); + } + +#ifdef CONFIG_ANTENNA_DIVERSITY + rtw_antenna_select_cmd(padapter, pparm->network.PhyInfo.Optimum_antenna, _FALSE); +#endif + + rtw_joinbss_reset(padapter); + + pmlmeext->linked_to = 0; + + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmlmeinfo->ERP_enable = 0; + pmlmeinfo->WMM_enable = 0; + pmlmeinfo->HT_enable = 0; + pmlmeinfo->HT_caps_enable = 0; + pmlmeinfo->HT_info_enable = 0; + pmlmeinfo->agg_enable_bitmap = 0; + pmlmeinfo->candidate_tid_bitmap = 0; + pmlmeinfo->bwmode_updated = _FALSE; + //pmlmeinfo->assoc_AP_vendor = maxAP; + + _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); + pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength; + + if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength + return H2C_PARAMETERS_ERROR; + + _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); + + //Check AP vendor + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength); + + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_://Get WMM IE. + if ( _rtw_memcmp(pIE->data, WMM_OUI, 4) ) + { + pmlmeinfo->WMM_enable = 1; + } + break; + + case _HT_CAPABILITY_IE_: //Get HT Cap IE. + pmlmeinfo->HT_caps_enable = 1; + break; + + case _HT_EXTRA_INFO_IE_: //Get HT Info IE. + pmlmeinfo->HT_info_enable = 1; + + //spec case only for cisco's ap because cisco's ap issue assoc rsp using mcs rate @40MHz or @20MHz + if(pmlmeinfo->assoc_AP_vendor == ciscoAP) + { + struct HT_info_element *pht_info = (struct HT_info_element *)(pIE->data); + + if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) + { + //switch to the 40M Hz mode according to the AP + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; + switch (pht_info->infos[0] & 0x3) + { + case 1: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + DBG_871X("set ch/bw for cisco's ap before connected\n"); + } + } + break; + + default: + break; + } + + i += (pIE->Length + 2); + } +#if 0 + if (padapter->registrypriv.wifi_spec) { + // for WiFi test, follow WMM test plan spec + acparm = 0x002F431C; // VO + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E541C; // VI + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + acparm = 0x0000A525; // BE + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A549; // BK + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + + // for WiFi test, mixed mode with intel STA under bg mode throughput issue + if (padapter->mlmepriv.htpriv.ht_option == _FALSE){ + acparm = 0x00004320; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + } + } + else { + acparm = 0x002F3217; // VO + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E4317; // VI + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + acparm = 0x00105320; // BE + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A444; // BK + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + } +#endif + //disable dynamic functions, such as high power, DIG + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //config the initial gain under linking, need to write the BB registers + initialgain = 0x32; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); + join_type = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + //cancel link timer + _cancel_timer_ex(&pmlmeext->link_timer); + + start_clnt_join(padapter); + + return H2C_SUCCESS; + +} + +u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct disconnect_parm *pparm = (struct disconnect_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + u8 val8; + + if (is_client_associated_to_ap(padapter)) + { + issue_deauth(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING); + } + + //set_opmode_cmd(padapter, infra_client_with_mlme); + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + //switch to the 20M Hz mode after disconnect + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + //set MSR to no link state + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //Stop BCN + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8)); + } + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + flush_all_cam_entry(padapter); + + _cancel_timer_ex(&pmlmeext->link_timer); + pmlmeext->linked_to = 0; + + return H2C_SUCCESS; +} + +u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; + u8 val8; + u32 initialgain; + u32 i; +#ifdef CONFIG_TDLS + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; +#endif + + if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE) + { + //for first time sitesurvey_cmd + pmlmeext->sitesurvey_res.state = SCAN_START; + pmlmeext->sitesurvey_res.bss_cnt = 0; + pmlmeext->sitesurvey_res.channel_idx = 0; + + if (le32_to_cpu(pparm->ss_ssidlen)) + { + _rtw_memcpy(pmlmeext->sitesurvey_res.ss_ssid, pparm->ss_ssid, le32_to_cpu(pparm->ss_ssidlen)); + } + else + { + _rtw_memset(pmlmeext->sitesurvey_res.ss_ssid, 0, (IW_ESSID_MAX_SIZE + 1)); + } + + pmlmeext->sitesurvey_res.ss_ssidlen = le32_to_cpu(pparm->ss_ssidlen); + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1) + pmlmeext->sitesurvey_res.scan_mode=SCAN_PASSIVE; + else + pmlmeext->sitesurvey_res.scan_mode = le32_to_cpu(pparm->scan_mode); +#else + pmlmeext->sitesurvey_res.scan_mode = le32_to_cpu(pparm->scan_mode); +#endif + + //issue null data if associating to the AP + if (is_client_associated_to_ap(padapter) == _TRUE) + { + pmlmeext->sitesurvey_res.state = SCAN_TXNULL; + + issue_nulldata(padapter, 1); + issue_nulldata(padapter, 1); + + //delay 50ms to protect nulldata(1). + set_survey_timer(pmlmeext, 50); + + return H2C_SUCCESS; + } + } + + if ((pmlmeext->sitesurvey_res.state == SCAN_START) || (pmlmeext->sitesurvey_res.state == SCAN_TXNULL)) + { +#ifdef CONFIG_FIND_BEST_CHANNEL +#if 0 + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + pmlmeext->channel_set[i].rx_count = 0; + } +#endif +#endif /* CONFIG_FIND_BEST_CHANNEL */ + + //disable dynamic functions, such as high power, DIG + Save_DM_Func_Flag(padapter); + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //config the initial gain under scaning, need to write the BB registers + initialgain = 0x20; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + //set MSR to no link state + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + val8 = 1; //before site survey + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + pmlmeext->sitesurvey_res.state = SCAN_PROCESS; + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1){ + rtw_write16(padapter, 0x06A4,0xffff); + } +#endif + + site_survey(padapter); + + return H2C_SUCCESS; + +} + +u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct setauth_parm *pparm = (struct setauth_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (pparm->mode < 4) + { + pmlmeinfo->auth_algo = pparm->mode; + } + + return H2C_SUCCESS; +} + +u8 setkey_hdl(_adapter *padapter, u8 *pbuf) +{ + unsigned short ctrl; + struct setkey_parm *pparm = (struct setkey_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + //main tx key for wep. + if(pparm->set_tx) + pmlmeinfo->key_index = pparm->keyid; + + //write cam + ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid; + + write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key); + + return H2C_SUCCESS; +} + +u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf) +{ + unsigned short ctrl=0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct set_stakey_parm *pparm = (struct set_stakey_parm *)pbuf; +#ifdef CONFIG_TDLS + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; +#endif + + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + unsigned char cam_id;//cam_entry + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta = rtw_get_stainfo(pstapriv, pparm->addr); + if(psta) + { + ctrl = (BIT(15) | ((pparm->algorithm) << 2)); + + DBG_8192C("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm); + + if((psta->mac_id<1) || (psta->mac_id>(NUM_STA-4))) + { + DBG_8192C("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id); + return H2C_REJECTED; + } + + cam_id = (psta->mac_id + 3);//0~3 for default key, cmd_id=macid + 3, macid=aid+1; + + DBG_8192C("Write CAM, mac_addr=%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0], + pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4], + pparm->addr[5], cam_id); + + write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key); + + return H2C_SUCCESS_RSP; + + } + else + { + DBG_8192C("r871x_set_stakey_hdl(): sta has been free\n"); + return H2C_REJECTED; + } + + } + + //below for sta mode + + ctrl = BIT(15) | ((pparm->algorithm) << 2); + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_cam_entry_to_clear!=0){ + clear_cam_entry(padapter, pmlmeinfo->tdls_cam_entry_to_clear); + pmlmeinfo->tdls_cam_entry_to_clear=0; + + return H2C_SUCCESS; + } + + psta = rtw_get_stainfo(pstapriv, pparm->addr);//Get TDLS Peer STA + if((psta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE){ + write_cam(padapter, psta->cam_entry, ctrl, pparm->addr, pparm->key); + } + else +#endif + write_cam(padapter, 5, ctrl, pparm->addr, pparm->key); + + pmlmeinfo->enc_algo = pparm->algorithm; + + return H2C_SUCCESS; +} + +u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct addBaReq_parm *pparm = (struct addBaReq_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, pparm->addr); + + if(!psta) + return H2C_SUCCESS; + + + if (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) || + ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pmlmeinfo->ADDBA_retry_count = 0; + //pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid); + //psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid); + issue_action_BA(padapter, pparm->addr, WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); + //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO); + _set_timer(&psta->addba_retry_timer, ADDBA_TO); + } + else + { + psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid); + } + + return H2C_SUCCESS; +} + +u8 set_tx_beacon_cmd(_adapter* padapter) +{ + struct cmd_obj *ph2c; + struct Tx_Beacon_param *ptxBeacon_parm; + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 res = _SUCCESS; + +_func_enter_; + + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + res= _FAIL; + goto exit; + } + + if ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL) + { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); + init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + + +exit: + +_func_exit_; + + return res; +} + + +u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf) +{ + u8 evt_code, evt_seq; + u16 evt_sz; + uint *peventbuf; + void (*event_callback)(_adapter *dev, u8 *pbuf); + struct evt_priv *pevt_priv = &(padapter->evtpriv); + + peventbuf = (uint*)pbuf; + evt_sz = (u16)(*peventbuf&0xffff); + evt_seq = (u8)((*peventbuf>>24)&0x7f); + evt_code = (u8)((*peventbuf>>16)&0xff); + + + #ifdef CHECK_EVENT_SEQ + // checking event sequence... + if (evt_seq != (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f) ) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("Evetn Seq Error! %d vs %d\n", (evt_seq & 0x7f), (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f))); + + pevt_priv->event_seq = (evt_seq+1)&0x7f; + + goto _abort_event_; + } + #endif + + // checking if event code is valid + if (evt_code >= MAX_C2HEVT) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent Code(%d) mismatch!\n", evt_code)); + goto _abort_event_; + } + + // checking if event size match the event parm size + if ((wlanevents[evt_code].parmsize != 0) && + (wlanevents[evt_code].parmsize != evt_sz)) + { + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent(%d) Parm Size mismatch (%d vs %d)!\n", + evt_code, wlanevents[evt_code].parmsize, evt_sz)); + goto _abort_event_; + + } + + ATOMIC_INC(&pevt_priv->event_seq); + + peventbuf += 2; + + if(peventbuf) + { + event_callback = wlanevents[evt_code].event_callback; + event_callback(padapter, (u8*)peventbuf); + + pevt_priv->evt_done_cnt++; + } + + +_abort_event_: + + + return H2C_SUCCESS; + +} + +u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) +{ + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + return H2C_SUCCESS; +} + + +u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf) +{ + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + return H2C_PARAMETERS_ERROR; + } +#ifdef CONFIG_AP_MODE + else //tx bc/mc frames after update TIM + { + _irqL irqL; + struct sta_info *psta_bmc; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + //for BC/MC Frames + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(!psta_bmc) + return H2C_SUCCESS; + + if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0)) + { + + rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows + + _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta_bmc->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + psta_bmc->sleepq_len--; + if(psta_bmc->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + pxmitframe->attrib.triggered=1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + //pstapriv->tim_bitmap &= ~BIT(0); + + } + + _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + } + + } +#endif + + return H2C_SUCCESS; + +} + +#ifdef CONFIG_AP_MODE + +void init_mlme_ap_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); + + //pmlmeext->bstart_bss = _FALSE; + + start_ap_mode(padapter); +} + +void free_mlme_ap_info(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + + stop_ap_mode(padapter); +} + +static void update_BCNTIM(_adapter *padapter) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + unsigned char *src_ie = pnetwork->IEs; + unsigned int src_ielen = pnetwork->IELength; + unsigned char *dst_ie = pnetwork_mlmeext->IEs; + + + //update TIM IE + //if(pstapriv->tim_bitmap) + if(_TRUE) + { + u8 *p, ie_len; + u16 tim_bitmap_le; + u32 tmp_len, head_len=0; + + tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); + + //calucate head_len + head_len = _FIXED_IE_LENGTH_; + head_len += pnetwork->Ssid.SsidLength + 2; + + // get supported rates len + p = rtw_get_ie(src_ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + { + head_len += tmp_len+2; + } + + //DS Parameter Set IE, len=3 + head_len += 3; + + //copy head offset + _rtw_memcpy(dst_ie, src_ie, head_len); + + + //append TIM IE from head_len offset + dst_ie+=head_len; + + *dst_ie++=_TIM_IE_; + + if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fc)) + ie_len = 5; + else + ie_len = 4; + + *dst_ie++= ie_len; + + *dst_ie++=0;//DTIM count + *dst_ie++=1;//DTIM peroid + + if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames + *dst_ie++ = BIT(0);//bitmap ctrl + else + *dst_ie++ = 0; + + if(ie_len==4) + { + *dst_ie++ = *(u8*)&tim_bitmap_le; + } + else if(ie_len==5) + { + _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); + dst_ie+=2; + } + + //copy remainder IE + _rtw_memcpy(dst_ie, src_ie+head_len, src_ielen-head_len); + + //pnetwork_mlmeext->Length += ie_len+2; + //pnetwork_mlmeext->IELength += ie_len+2; + pnetwork_mlmeext->Length = pnetwork->Length+ie_len+2; + pnetwork_mlmeext->IELength = src_ielen+ie_len+2; + + } + else + { + _rtw_memcpy(dst_ie, src_ie, src_ielen); + pnetwork_mlmeext->Length = pnetwork->Length; + pnetwork_mlmeext->IELength = src_ielen; + } + +#ifdef CONFIG_USB_HCI + set_tx_beacon_cmd(padapter); +#endif + + +/* + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + } +*/ + +} + +u8 chk_sta_is_alive(struct sta_info *psta) +{ + struct stainfo_stats *pstats; + + pstats = &psta->sta_stats; + + if(pstats->rx_pkts == pstats->last_rx_pkts) + { + if(psta->state&WIFI_SLEEP_STATE) + return _TRUE; + else + return _FALSE; + } + else + { + pstats->last_rx_pkts = pstats->rx_pkts; + + return _TRUE; + } + +} + +void expire_timeout_chk(_adapter *padapter) +{ + _list *phead, *plist; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + phead = &pstapriv->auth_list; + plist = get_next(phead); + + //check auth_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); + + plist = get_next(plist); + + if(psta->expire_to>0) + { + psta->expire_to--; + if (psta->expire_to == 0) + { + _irqL irqL; + + rtw_list_delete(&psta->auth_list); + + DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", + psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + } + } + + } + + + psta = NULL; + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + if(chk_sta_is_alive(psta)) + { + psta->expire_to = pstapriv->expire_to; + } + + if(psta->expire_to>0) + { + psta->expire_to--; + if (psta->expire_to == 0) + { + _irqL irqL; + + rtw_list_delete(&psta->asoc_list); + + DBG_871X("asoc expire %02X%02X%02X%02X%02X%02X\n", + psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); +#if 0 + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); +#endif + ap_free_sta(padapter, psta); + + } + } + + } + +} + + +static void add_RATid(_adapter *padapter, struct sta_info *psta) +{ + int i; + u8 rf_type; + u32 init_rate=0; + unsigned char sta_band = 0, raid, shortGIrate = _FALSE; + unsigned char limit; + unsigned int tx_ra_bitmap=0; + struct ht_priv *psta_ht = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + + + if(psta) + psta_ht = &psta->htpriv; + else + return; + + //b/g mode ra_bitmap + for (i=0; ibssrateset); i++) + { + if (psta->bssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + //n mode ra_bitmap + if(psta_ht->ht_option) + { + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + if(rf_type == RF_2T2R) + limit=16;// 2R + else + limit=8;// 1R + + for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) + tx_ra_bitmap |= BIT(i+12); + } + + //max short GI rate + shortGIrate = psta_ht->sgi; + } + + +#if 0//gtest + if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) + { + //is this a 2r STA? + if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) + { + priv->pshare->has_2r_sta |= BIT(pstat->aid); + if(rtw_read16(padapter, 0x102501f6) != 0xffff) + { + rtw_write16(padapter, 0x102501f6, 0xffff); + reset_1r_sta_RA(priv, 0xffff); + Switch_1SS_Antenna(priv, 3); + } + } + else// bg or 1R STA? + { + if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) + { + if(rtw_read16(padapter, 0x102501f6) != 0x7777) + { // MCS7 SGI + rtw_write16(padapter, 0x102501f6,0x7777); + reset_1r_sta_RA(priv, 0x7777); + Switch_1SS_Antenna(priv, 2); + } + } + } + + } + + if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) + { + if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) + pstat->rssi_level = 1; + else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || + ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && + (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && + (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) + pstat->rssi_level = 2; + else + pstat->rssi_level = 3; + } + + // rate adaptive by rssi + if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) + { + if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x100f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x100ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x100ff005; + else + pstat->tx_ra_bitmap &= 0x100ff001; + + break; + } + } + else + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x1f0f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x1f0ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x000ff005; + else + pstat->tx_ra_bitmap &= 0x000ff001; + + break; + } + + // Don't need to mask high rates due to new rate adaptive parameters + //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta + // pstat->tx_ra_bitmap &= 0x81ffffff; + + // NIC driver will report not supporting MCS15 and MCS14 in asoc req + //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) + // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 + } + } + else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x00000f00; + break; + case 2: + pstat->tx_ra_bitmap &= 0x00000ff0; + break; + case 3: + pstat->tx_ra_bitmap &= 0x00000ff5; + break; + } + } + else + { + pstat->tx_ra_bitmap &= 0x0000000d; + } + + // disable tx short GI when station cannot rx MCS15(AP is 2T2R) + // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) + // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate + if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || + (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) + { + pstat->tx_ra_bitmap &= ~BIT(28); + } +#endif + + if ( pcur_network->Configuration.DSConfig > 14 ) { + // 5G band + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N | WIRELESS_11A; + else + sta_band |= WIRELESS_11A; + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; + else if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G |WIRELESS_11B; + else + sta_band |= WIRELESS_11B; + } + + raid = networktype_to_raid(sta_band); + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; + + if (psta->aid < NUM_STA) + { + u8 arg = 0; + + arg = psta->mac_id&0x1f; + + arg |= BIT(7); + + if (shortGIrate==_TRUE) + arg |= BIT(5); + + tx_ra_bitmap |= ((raid<<28)&0xf0000000); + + DBG_871X("update raid entry, bitmap=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); + + //bitmap[0:27] = tx_rate_bitmap + //bitmap[28:31]= Rate Adaptive id + //arg[0:4] = macid + //arg[5] = Short GI + padapter->HalFunc.Add_RateATid(padapter, tx_ra_bitmap, arg); + + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + + } + else + { + DBG_871X("station aid %d exceed the max number\n", psta->aid); + } + +} + +static void update_bmc_sta(_adapter *padapter) +{ + _irqL irqL; + u32 init_rate=0; + unsigned char network_type, raid; + unsigned short para16; + int i, supportRateNum = 0; + unsigned int tx_ra_bitmap=0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); + + if(psta) + { + psta->aid = 0;//default set to 0 + //psta->mac_id = psta->aid+4; + psta->mac_id = psta->aid + 1; + + psta->qos_option = 0; + psta->htpriv.ht_option = _FALSE; + + psta->ieee8021x_blocked = 0; + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. + + + + //prepare for add_RATid + supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); + network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1); + + _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); + psta->bssratelen = supportRateNum; + + //b/g mode ra_bitmap + for (i=0; ibssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + if ( pcur_network->Configuration.DSConfig > 14 ) { + //force to A mode. 5G doesn't support CCK rates + network_type = WIRELESS_11A; + tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps + } else { + //force to b mode + network_type = WIRELESS_11B; + tx_ra_bitmap = 0xf; + } + + //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum); + + raid = networktype_to_raid(network_type); + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; + + //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap); + + //if(pHalData->fw_ractrl == _TRUE) + { + u8 arg = 0; + + arg = psta->mac_id&0x1f; + + arg |= BIT(7); + + //if (shortGIrate==_TRUE) + // arg |= BIT(5); + + tx_ra_bitmap |= ((raid<<28)&0xf0000000); + + DBG_871X("update_bmc_sta, mask=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); + + //bitmap[0:27] = tx_rate_bitmap + //bitmap[28:31]= Rate Adaptive id + //arg[0:4] = macid + //arg[5] = Short GI + padapter->HalFunc.Add_RateATid(padapter, tx_ra_bitmap, arg); + + } + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + + _enter_critical_bh(&psta->lock, &irqL); + psta->state = _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + } + else + { + DBG_871X("add_RATid_bmc_sta error!\n"); + } + +} + +//notes: +//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode +//MAC_ID = AID+1 for sta in ap/adhoc mode +//MAC_ID = 1 for bc/mc for sta/ap/adhoc +//MAC_ID = 0 for bssid for sta/ap/adhoc +//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; + +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + struct ht_priv *phtpriv_sta = &psta->htpriv; + + //set intf_tag to if1 + //psta->intf_tag = 0; + + //psta->mac_id = psta->aid+4; + psta->mac_id = psta->aid+1; + + if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) + psta->ieee8021x_blocked = _TRUE; + else + psta->ieee8021x_blocked = _FALSE; + + + //update sta's cap + + //ERP + VCS_update(padapter, psta); + + //HT related cap + if(phtpriv_sta->ht_option) + { + //check if sta supports rx ampdu + phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; + + //check if sta support s Short GI + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) + { + phtpriv_sta->sgi = _TRUE; + } + + // bwmode + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) + { + //phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40; + phtpriv_sta->bwmode = pmlmeext->cur_bwmode; + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + + } + + psta->qos_option = _TRUE; + + } + else + { + phtpriv_sta->ampdu_enable = _FALSE; + + phtpriv_sta->sgi = _FALSE; + phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + //Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + phtpriv_sta->agg_enable_bitmap = 0x0;//reset + phtpriv_sta->candidate_tid_bitmap = 0x0;//reset + + + //todo: init other variables + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + + //add ratid + add_RATid(padapter, psta); + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state |= _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + +} + +void start_bss_network(_adapter *padapter, u8 *pbuf) +{ + u8 *p; + u8 val8, cur_channel, cur_bwmode, cur_ch_offset; + u16 bcn_interval; + u32 acparm; + int ie_len; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv* psecuritypriv=&(padapter->securitypriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + + //DBG_8192C("%s\n", __FUNCTION__); + + bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; + cur_channel = pnetwork->Configuration.DSConfig; + cur_bwmode = HT_CHANNEL_WIDTH_20;; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + + //check if there is wps ie, + //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, + //and at first time the security ie ( RSN/WPA IE) will not include in beacon. + if(NULL == rtw_get_wps_ie(pnetwork->IEs, pnetwork->IELength, NULL, &ie_len)) + { + pmlmeext->bstart_bss = _TRUE; + } + + //todo: update wmm, ht cap + //pmlmeinfo->WMM_enable; + //pmlmeinfo->HT_enable; + if(pmlmepriv->qospriv.qos_option) + pmlmeinfo->WMM_enable = _TRUE; + + if(pmlmepriv->htpriv.ht_option) + { + pmlmeinfo->WMM_enable = _TRUE; + pmlmeinfo->HT_enable = _TRUE; + } + + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + flush_all_cam_entry(padapter); //clear CAM + } + + //set MSR to AP_Mode + Set_NETYPE0_MSR(padapter, _HW_STATE_AP_); + + //Set BSSID REG + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pnetwork->MacAddress); + + //Set EDCA param reg + acparm = 0x002F3217; // VO + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E4317; // VI + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + //acparm = 0x00105320; // BE + acparm = 0x005ea42b; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A444; // BK + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + + //Set Security + val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //Beacon Control related register + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + u32 initialgain; + + //disable dynamic functions, such as high power, DIG + //Save_DM_Func_Flag(padapter); + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //turn on dynamic functions + Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); + + initialgain = 0x30; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + } + + //set channel, bwmode + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if( p && ie_len) + { + struct HT_info_element *pht_info = (struct HT_info_element *)(p+2); + + if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) + { + //switch to the 40M Hz mode + //pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; + cur_bwmode = HT_CHANNEL_WIDTH_40; + switch (pht_info->infos[0] & 0x3) + { + case 1: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + } + + } + + //TODO: need to judge the phy parameters on concurrent mode for single phy + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); + + DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); + + // + pmlmeext->cur_channel = cur_channel; + pmlmeext->cur_bwmode = cur_bwmode; + pmlmeext->cur_ch_offset = cur_ch_offset; + pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; + + //let pnetwork_mlmeext == pnetwork_mlme. + _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); + +#ifdef CONFIG_P2P + _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); + pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; +#endif //CONFIG_P2P + + + if(_TRUE == pmlmeext->bstart_bss) + { + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + + //issue beacon frame + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + } + } + + + //update bc/mc sta_info + update_bmc_sta(padapter); + + //pmlmeext->bstart_bss = _TRUE; + +} + +#ifdef CONFIG_NATIVEAP_MLME + +static void update_bcn_fixed_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_erpinfo_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_htcap_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_htinfo_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_rsn_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wpa_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wmm_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wps_ie(_adapter *padapter) +{ + int match; + u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; + uint wps_ielen=0, wps_offset, remainder_ielen; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + unsigned char *ie = pnetwork->IEs; + u32 ielen = pnetwork->IELength; + + + DBG_871X("%s\n", __FUNCTION__); + + pwps_ie = rtw_get_wps_ie(ie, ielen, NULL, &wps_ielen); + + if(pwps_ie==NULL || wps_ielen==0) + return; + + wps_offset = (uint)(pwps_ie-ie); + + premainder_ie = pwps_ie + wps_ielen; + + remainder_ielen = ielen - wps_offset - wps_ielen; + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + + pwps_ie_src = pmlmepriv->wps_beacon_ie; + if(pwps_ie_src == NULL) + return; + + + wps_ielen = (uint)pwps_ie_src[1];//to get ie data len + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) + { + _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); + pwps_ie += (wps_ielen+2); + + if(pbackup_remainder_ie) + _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); + + //update IELength + pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; + } + + if(pbackup_remainder_ie) + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + +} + +static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) +{ + DBG_871X("%s\n", __FUNCTION__); + + if(_rtw_memcmp(WPA_OUI, oui, 4)) + { + update_bcn_wpa_ie(padapter); + } + else if(_rtw_memcmp(WMM_OUI, oui, 4)) + { + update_bcn_wmm_ie(padapter); + } + else if(_rtw_memcmp(WPS_OUI, oui, 4)) + { + update_bcn_wps_ie(padapter); + } + else + { + DBG_871X("unknown OUI type!\n"); + } + + +} + +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s\n", __FUNCTION__); + + if(_FALSE == pmlmeext->bstart_bss) + return; + + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + switch(ie_id) + { + case 0xFF: + + update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability + + break; + + case _TIM_IE_: + + update_BCNTIM(padapter); + + break; + + case _ERPINFO_IE_: + + update_bcn_erpinfo_ie(padapter); + + break; + + case _HT_CAPABILITY_IE_: + + update_bcn_htcap_ie(padapter); + + break; + + case _RSN_IE_2_: + + update_bcn_rsn_ie(padapter); + + break; + + case _HT_ADD_INFO_IE_: + + update_bcn_htinfo_ie(padapter); + + break; + + case _VENDOR_SPECIFIC_IE_: + + update_bcn_vendor_spec_ie(padapter, oui); + + break; + + default: + break; + } + + pmlmepriv->update_bcn = _TRUE; + + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + +#ifdef CONFIG_USB_HCI + if(tx) + { + //send_beacon(padapter);//send_beacon must execute on TSR level + set_tx_beacon_cmd(padapter); + } +#else + { + //PCI will issue beacon when BCN interrupt occurs. + } +#endif + +} + +#ifdef CONFIG_80211N_HT + +/* +op_mode +Set to 0 (HT pure) under the followign conditions + - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or + - all STAs in the BSS are 20 MHz HT in 20 MHz BSS +Set to 1 (HT non-member protection) if there may be non-HT STAs + in both the primary and the secondary channel +Set to 2 if only HT STAs are associated in BSS, + however and at least one 20 MHz HT STA is associated +Set to 3 (HT mixed mode) when one or more non-HT STAs are associated + (currently non-GF HT station is considered as non-HT STA also) +*/ +static int rtw_ht_operation_update(_adapter *padapter) +{ + u16 cur_op_mode, new_op_mode; + int op_mode_changes = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + + if(pmlmepriv->htpriv.ht_option == _TRUE) + return 0; + + //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) + // return 0; + + DBG_871X("%s current operation mode=0x%X\n", + __FUNCTION__, pmlmepriv->ht_op_mode); + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) + && pmlmepriv->num_sta_ht_no_gf) { + pmlmepriv->ht_op_mode |= + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && + pmlmepriv->num_sta_ht_no_gf == 0) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } + + /* Note: currently we switch to the MIXED op mode if HT non-greenfield + * station is associated. Probably it's a theoretical case, since + * it looks like all known HT STAs support greenfield. + */ + new_op_mode = 0; + if (pmlmepriv->num_sta_no_ht || + (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) + new_op_mode = OP_MODE_MIXED; + else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) + && pmlmepriv->num_sta_ht_20mhz) + new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; + else if (pmlmepriv->olbc_ht) + new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; + else + new_op_mode = OP_MODE_PURE; + + cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; + if (cur_op_mode != new_op_mode) { + pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; + pmlmepriv->ht_op_mode |= new_op_mode; + op_mode_changes++; + } + + DBG_871X("%s new operation mode=0x%X changes=%d\n", + __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); + + return op_mode_changes; + +} + +#endif /* CONFIG_80211N_HT */ + + +void bss_cap_update(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + +#if 0 + if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { + psta->nonerp_set = 1; + pmlmepriv->num_sta_non_erp++; + if (pmlmepriv->num_sta_non_erp == 1) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(psta->flags & WLAN_STA_NONERP) + { + if(!psta->nonerp_set) + { + psta->nonerp_set = 1; + + pmlmepriv->num_sta_non_erp++; + + if (pmlmepriv->num_sta_non_erp == 1) + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + + } + else + { + if(psta->nonerp_set) + { + psta->nonerp_set = 0; + + pmlmepriv->num_sta_non_erp--; + + if (pmlmepriv->num_sta_non_erp == 0) + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + + } + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && + !psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 1; + pmlmepriv->num_sta_no_short_slot_time++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) + { + if(!psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 1; + + pmlmepriv->num_sta_no_short_slot_time++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + + } + } + else + { + if(psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 0; + + pmlmepriv->num_sta_no_short_slot_time--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 0)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && + !psta->no_short_preamble_set) { + psta->no_short_preamble_set = 1; + pmlmepriv->num_sta_no_short_preamble++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + + if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) + { + if(!psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 1; + + pmlmepriv->num_sta_no_short_preamble++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + + } + } + else + { + if(psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 0; + + pmlmepriv->num_sta_no_short_preamble--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 0)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + + } + } + + +#ifdef CONFIG_80211N_HT + + if (psta->flags & WLAN_STA_HT) + { + u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); + + DBG_871X("HT: STA " MAC_FMT " HT Capabilities " + "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { + if (!psta->no_ht_gf_set) { + psta->no_ht_gf_set = 1; + pmlmepriv->num_sta_ht_no_gf++; + } + DBG_871X("%s STA " MAC_FMT " - no " + "greenfield, num of non-gf stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_no_gf); + } + + if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { + if (!psta->ht_20mhz_set) { + psta->ht_20mhz_set = 1; + pmlmepriv->num_sta_ht_20mhz++; + } + DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " + "num of 20MHz HT STAs %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_20mhz); + } + + } + else + { + if (!psta->no_ht_set) { + psta->no_ht_set = 1; + pmlmepriv->num_sta_no_ht++; + } + if(pmlmepriv->htpriv.ht_option == _TRUE) { + DBG_871X("%s STA " MAC_FMT + " - no HT, num of non-HT stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_no_ht); + } + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + +} + +void ap_free_sta(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + if(!psta) + return; + + + if (psta->nonerp_set) { + psta->nonerp_set = 0; + pmlmepriv->num_sta_non_erp--; + if (pmlmepriv->num_sta_non_erp == 0) + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + + if (psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 0; + pmlmepriv->num_sta_no_short_slot_time--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_slot_time == 0) + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + if (psta->no_short_preamble_set) { + psta->no_short_preamble_set = 0; + pmlmepriv->num_sta_no_short_preamble--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_preamble == 0) + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + +#ifdef CONFIG_80211N_HT + + if (psta->no_ht_gf_set) { + psta->no_ht_gf_set = 0; + pmlmepriv->num_sta_ht_no_gf--; + } + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if (psta->ht_20mhz_set) { + psta->ht_20mhz_set = 0; + pmlmepriv->num_sta_ht_20mhz--; + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + + + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + + issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); + + //report_del_sta_event(padapter, psta->hwaddr); + + //clear key + //clear_cam_entry(padapter, (psta->mac_id + 3)); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + +} + +int rtw_sta_flush(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + int ret=0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + + //DBG_871X("%s\n", __FUNCTION__); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //free sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + rtw_list_delete(&psta->asoc_list); + + ap_free_sta(padapter, psta); + + } + + + issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); + + return ret; + +} + +void sta_info_update(_adapter *padapter, struct sta_info *psta) +{ + int flags = psta->flags; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + + //update wmm cap. + if(WLAN_STA_WME&flags) + psta->qos_option = 1; + else + psta->qos_option = 0; + + if(pmlmepriv->qospriv.qos_option == 0) + psta->qos_option = 0; + + +#ifdef CONFIG_80211N_HT + //update 802.11n ht cap. + if(WLAN_STA_HT&flags) + { + psta->htpriv.ht_option = _TRUE; + psta->qos_option = 1; + } + else + { + psta->htpriv.ht_option = _FALSE; + } + + if(pmlmepriv->htpriv.ht_option == _FALSE) + psta->htpriv.ht_option = _FALSE; +#endif + + + update_sta_info_apmode(padapter, psta); + + +} + +void start_ap_mode(_adapter *padapter) +{ + int i; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + pmlmepriv->update_bcn = _FALSE; + + //init_mlme_ap_info(padapter); + pmlmeext->bstart_bss = _FALSE; + + pmlmepriv->num_sta_non_erp = 0; + + pmlmepriv->num_sta_no_short_slot_time = 0; + + pmlmepriv->num_sta_no_short_preamble = 0; + + pmlmepriv->num_sta_ht_no_gf = 0; + + pmlmepriv->num_sta_no_ht = 0; + + pmlmepriv->num_sta_ht_20mhz = 0; + + pmlmepriv->olbc = _FALSE; + + pmlmepriv->olbc_ht = _FALSE; + +#ifdef CONFIG_80211N_HT + pmlmepriv->ht_op_mode = 0; +#endif + + for(i=0; ista_aid[i] = NULL; + + pmlmepriv->wps_beacon_ie = NULL; + pmlmepriv->wps_probe_resp_ie = NULL; + pmlmepriv->wps_assoc_resp_ie = NULL; + + +} + +void stop_ap_mode(_adapter *padapter) +{ + _irqL irqL; + _list *phead, *plist; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + pmlmepriv->update_bcn = _FALSE; + pmlmeext->bstart_bss = _FALSE; + //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + rtw_sta_flush(padapter); + +#if 0 + //free sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + rtw_list_delete(&psta->asoc_list); + + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + } +#endif + + //free_assoc_sta_resources + rtw_free_all_stainfo(padapter); + + psta = rtw_get_bcmc_stainfo(padapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + rtw_init_bcmc_stainfo(padapter); + + + if(pmlmepriv->wps_beacon_ie) + { + rtw_mfree(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len); + pmlmepriv->wps_beacon_ie = NULL; + } + + if(pmlmepriv->wps_probe_resp_ie) + { + rtw_mfree(pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len); + pmlmepriv->wps_probe_resp_ie = NULL; + } + + if(pmlmepriv->wps_assoc_resp_ie) + { + rtw_mfree(pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); + pmlmepriv->wps_assoc_resp_ie = NULL; + } + +} + + +#endif + +#endif + +u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct SetChannelPlan_param *setChannelPlan_param; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + //struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + setChannelPlan_param = (struct SetChannelPlan_param *)pbuf; + + //Jeff: We use mlmepriv->ChannelPlan to indicate channel plan, + //the setChannelPlan_param is useless now... + + pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set); + + return H2C_SUCCESS; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mp.c b/drivers/net/wireless/rtl8192c/core/rtw_mp.c new file mode 100755 index 000000000000..1fff3dd27f84 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mp.c @@ -0,0 +1,2254 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_MP_C_ + +#include + +#ifdef CONFIG_RTL8712 +#include +#endif +#ifdef CONFIG_RTL8192C +#include +#endif +#ifdef CONFIG_RTL8192D +#include +#endif + +#ifdef CONFIG_MP_INCLUDED + +u32 read_macreg(_adapter *padapter, u32 addr, u32 sz) +{ + u32 val = 0; + + switch(sz) + { + case 1: + val = rtw_read8(padapter, addr); + break; + case 2: + val = rtw_read16(padapter, addr); + break; + case 4: + val = rtw_read32(padapter, addr); + break; + default: + val = 0xffffffff; + break; + } + + return val; + +} + +void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz) +{ + switch(sz) + { + case 1: + rtw_write8(padapter, addr, (u8)val); + break; + case 2: + rtw_write16(padapter, addr, (u16)val); + break; + case 4: + rtw_write32(padapter, addr, val); + break; + default: + break; + } + +} + +u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask) +{ + return padapter->HalFunc.read_bbreg(padapter, addr, bitmask); +} + +void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val) +{ + padapter->HalFunc.write_bbreg(padapter, addr, bitmask, val); +} + +static u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask) +{ + return padapter->HalFunc.read_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bitmask); +} + +static void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val) +{ + padapter->HalFunc.write_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bitmask, val); +} + +u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr) +{ + return _read_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask); +} + +void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val) +{ + _write_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask, val); +} + +static void _init_mp_priv_(struct mp_priv *pmp_priv) +{ + WLAN_BSSID_EX *pnetwork; + + _rtw_memset(pmp_priv, 0, sizeof(struct mp_priv)); + + pmp_priv->mode = MP_OFF; + + pmp_priv->channel = 1; + pmp_priv->bandwidth = HT_CHANNEL_WIDTH_20; + pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmp_priv->rateidx = MPT_RATE_1M; + pmp_priv->txpoweridx = 0x2A; + + pmp_priv->antenna_tx = ANTENNA_A; + pmp_priv->antenna_rx = ANTENNA_AB; + + pmp_priv->check_mp_pkt = 0; + + pmp_priv->tx_pktcount = 0; + + pmp_priv->rx_pktcount = 0; + pmp_priv->rx_crcerrpktcount = 0; + + pmp_priv->network_macaddr[0] = 0x00; + pmp_priv->network_macaddr[1] = 0xE0; + pmp_priv->network_macaddr[2] = 0x4C; + pmp_priv->network_macaddr[3] = 0x87; + pmp_priv->network_macaddr[4] = 0x66; + pmp_priv->network_macaddr[5] = 0x55; + + pnetwork = &pmp_priv->mp_network.network; + _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN); + + pnetwork->Ssid.SsidLength = 8; + _rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength); +} + +#ifdef PLATFORM_WINDOWS +/* +void mp_wi_callback( + IN NDIS_WORK_ITEM* pwk_item, + IN PVOID cntx + ) +{ + _adapter* padapter =(_adapter *)cntx; + struct mp_priv *pmppriv=&padapter->mppriv; + struct mp_wi_cntx *pmp_wi_cntx=&pmppriv->wi_cntx; + + // Execute specified action. + if(pmp_wi_cntx->curractfunc != NULL) + { + LARGE_INTEGER cur_time; + ULONGLONG start_time, end_time; + NdisGetCurrentSystemTime(&cur_time); // driver version + start_time = cur_time.QuadPart/10; // The return value is in microsecond + + pmp_wi_cntx->curractfunc(padapter); + + NdisGetCurrentSystemTime(&cur_time); // driver version + end_time = cur_time.QuadPart/10; // The return value is in microsecond + + RT_TRACE(_module_mp_, _drv_info_, + ("WorkItemActType: %d, time spent: %I64d us\n", + pmp_wi_cntx->param.act_type, (end_time-start_time))); + } + + NdisAcquireSpinLock(&(pmp_wi_cntx->mp_wi_lock)); + pmp_wi_cntx->bmp_wi_progress= _FALSE; + NdisReleaseSpinLock(&(pmp_wi_cntx->mp_wi_lock)); + + if (pmp_wi_cntx->bmpdrv_unload) + { + NdisSetEvent(&(pmp_wi_cntx->mp_wi_evt)); + } + +} +*/ + +static int init_mp_priv_by_os(struct mp_priv *pmp_priv) +{ + struct mp_wi_cntx *pmp_wi_cntx; + + if (pmp_priv == NULL) return _FAIL; + + pmp_priv->rx_testcnt = 0; + pmp_priv->rx_testcnt1 = 0; + pmp_priv->rx_testcnt2 = 0; + + pmp_priv->tx_testcnt = 0; + pmp_priv->tx_testcnt1 = 0; + + pmp_wi_cntx = &pmp_priv->wi_cntx + pmp_wi_cntx->bmpdrv_unload = _FALSE; + pmp_wi_cntx->bmp_wi_progress = _FALSE; + pmp_wi_cntx->curractfunc = NULL; + + return _SUCCESS; +} +#endif + +#ifdef PLATFORM_LINUX +static int init_mp_priv_by_os(struct mp_priv *pmp_priv) +{ + int i, res; + struct mp_xmit_frame *pmp_xmitframe; + + if (pmp_priv == NULL) return _FAIL; + + _rtw_init_queue(&pmp_priv->free_mp_xmitqueue); + + pmp_priv->pallocated_mp_xmitframe_buf = NULL; + pmp_priv->pallocated_mp_xmitframe_buf = rtw_zmalloc(NR_MP_XMITFRAME * sizeof(struct mp_xmit_frame) + 4); + if (pmp_priv->pallocated_mp_xmitframe_buf == NULL) { + res = _FAIL; + goto _exit_init_mp_priv; + } + + pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((uint) (pmp_priv->pallocated_mp_xmitframe_buf) & 3); + + pmp_xmitframe = (struct mp_xmit_frame*)pmp_priv->pmp_xmtframe_buf; + + for (i = 0; i < NR_MP_XMITFRAME; i++) + { + _rtw_init_listhead(&pmp_xmitframe->list); + rtw_list_insert_tail(&pmp_xmitframe->list, &pmp_priv->free_mp_xmitqueue.queue); + + pmp_xmitframe->pkt = NULL; + pmp_xmitframe->frame_tag = MP_FRAMETAG; + pmp_xmitframe->padapter = pmp_priv->papdater; + + pmp_xmitframe++; + } + + pmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME; + + res = _SUCCESS; + +_exit_init_mp_priv: + + return res; +} +#endif + +static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter) +{ + struct pkt_attrib *pattrib; + struct tx_desc *desc; + + // init xmitframe attribute + pattrib = &pmptx->attrib; + _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib)); + desc = &pmptx->desc; + _rtw_memset(desc, 0, TXDESC_SIZE); + + pattrib->ether_type = 0x8712; + //_rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); +// _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN); +// pattrib->pctrl = 0; +// pattrib->dhcp_pkt = 0; +// pattrib->pktlen = 0; + pattrib->ack_policy = 0; +// pattrib->pkt_hdrlen = ETH_HLEN; + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA; + pattrib->priority = 0; + pattrib->qsel = pattrib->priority; +// do_queue_select(padapter, pattrib); + pattrib->nr_frags = 1; + pattrib->encrypt = 0; + pattrib->bswenc = _FALSE; + pattrib->qos_en = _FALSE; +} + +s32 init_mp_priv(PADAPTER padapter) +{ + struct mp_priv *pmppriv = &padapter->mppriv; + + _init_mp_priv_(pmppriv); + pmppriv->papdater = padapter; + + pmppriv->tx.stop = 1; + mp_init_xmit_attrib(&pmppriv->tx, padapter); + + switch (padapter->registrypriv.rf_config) { + case RF_1T1R: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_A; + break; + case RF_1T2R: + default: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T2R: + case RF_2T2R_GREEN: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T4R: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_ABCD; + break; + } + + return _SUCCESS; +} + +void free_mp_priv(struct mp_priv *pmp_priv) +{ + if (pmp_priv->pallocated_mp_xmitframe_buf) { + rtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0); + pmp_priv->pallocated_mp_xmitframe_buf = NULL; + } + pmp_priv->pmp_xmtframe_buf = NULL; +} + +#ifdef CONFIG_RTL8192C +#define PHY_IQCalibrate(a,b) rtl8192c_PHY_IQCalibrate(a,b) +#define PHY_LCCalibrate(a) rtl8192c_PHY_LCCalibrate(a) +#define dm_CheckTXPowerTracking(a) rtl8192c_dm_CheckTXPowerTracking(a) +#define PHY_SetRFPathSwitch(a,b) rtl8192c_PHY_SetRFPathSwitch(a,b) +#endif + +#ifdef CONFIG_RTL8192D +#define PHY_IQCalibrate(a) rtl8192d_PHY_IQCalibrate(a) +#define PHY_LCCalibrate(a) rtl8192d_PHY_LCCalibrate(a) +#define dm_CheckTXPowerTracking(a) rtl8192d_dm_CheckTXPowerTracking(a) +#define PHY_SetRFPathSwitch(a,b) rtl8192d_PHY_SetRFPathSwitch(a,b) +#endif + +s32 +MPT_InitializeAdapter( + IN PADAPTER pAdapter, + IN u8 Channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + s32 rtStatus = _SUCCESS; + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + u32 tmpRegA, tmpRegC, TempCCk,ledsetting; + + //------------------------------------------------------------------------- + // HW Initialization for 8190 MPT. + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + // SW Initialization for 8190 MP. + //------------------------------------------------------------------------- + pMptCtx->bMptDrvUnload = _FALSE; + pMptCtx->bMassProdTest = _FALSE; + pMptCtx->bMptIndexEven = _TRUE; //default gain index is -6.0db + + /* Init mpt event. */ +#if 0 // for Windows + NdisInitializeEvent( &(pMptCtx->MptWorkItemEvent) ); + NdisAllocateSpinLock( &(pMptCtx->MptWorkItemSpinLock) ); + + PlatformInitializeWorkItem( + Adapter, + &(pMptCtx->MptWorkItem), + (RT_WORKITEM_CALL_BACK)MPT_WorkItemCallback, + (PVOID)Adapter, + "MptWorkItem"); +#endif + pMptCtx->bMptWorkItemInProgress = _FALSE; + pMptCtx->CurrMptAct = NULL; + //------------------------------------------------------------------------- + +#if 1 + // Don't accept any packets + rtw_write32(pAdapter, REG_RCR, 0); +#else + // Accept CRC error and destination address + pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); +#endif + +#if 0 + // If EEPROM or EFUSE is empty,we assign as RF 2T2R for MP. + if (pHalData->AutoloadFailFlag == TRUE) + { + pHalData->RF_Type = RF_2T2R; + } +#endif + ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); + rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); + +#ifdef CONFIG_RTL8192C + PHY_IQCalibrate(pAdapter, _FALSE); + dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter + PHY_LCCalibrate(pAdapter); +#endif + +#ifdef CONFIG_RTL8192D + PHY_IQCalibrate(pAdapter); + dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter + PHY_LCCalibrate(pAdapter); +#endif + +#ifdef CONFIG_PCI_HCI + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //Wifi default use Main +#else + +#ifdef CONFIG_RTL8192C +#if 1 + if (pHalData->BoardType == BOARD_MINICARD) + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main +#else + if(pAdapter->HalFunc.GetInterfaceSelectionHandler(pAdapter) == INTF_SEL2_MINICARD ) + PHY_SetRFPathSwitch(Adapter, pAdapter->MgntInfo.bDefaultAntenna); //default use Main +#endif + +#endif + +#endif + + pMptCtx->backup0xc50 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0); + pMptCtx->backup0xc58 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0); + pMptCtx->backup0xc30 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_RxDetector1, bMaskByte0); + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: MPT_DeInitAdapter() + * + * Overview: Extra DeInitialization for Mass Production Test. + * + * Input: PADAPTER pAdapter + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 05/08/2007 MHC Create Version 0. + * 05/18/2007 MHC Add normal driver MPHalt code. + * + *---------------------------------------------------------------------------*/ +VOID +MPT_DeInitAdapter( + IN PADAPTER pAdapter + ) +{ + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + pMptCtx->bMptDrvUnload = _TRUE; +#if 0 // for Windows + PlatformFreeWorkItem( &(pMptCtx->MptWorkItem) ); + + while(pMptCtx->bMptWorkItemInProgress) + { + if(NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50)) + { + break; + } + } + NdisFreeSpinLock( &(pMptCtx->MptWorkItemSpinLock) ); +#endif +} + +static u8 mpt_ProStartTest(PADAPTER padapter) +{ + PMPT_CONTEXT pMptCtx = &padapter->mppriv.MptCtx; + + pMptCtx->bMassProdTest = _TRUE; + pMptCtx->bStartContTx = _FALSE; + pMptCtx->bCckContTx = _FALSE; + pMptCtx->bOfdmContTx = _FALSE; + pMptCtx->bSingleCarrier = _FALSE; + pMptCtx->bCarrierSuppression = _FALSE; + pMptCtx->bSingleTone = _FALSE; + + return _SUCCESS; +} + +/* + * General use + */ +s32 SetPowerTracking(PADAPTER padapter, u8 enable) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + if (!netif_running(padapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: interface not opened!\n")); + return _FAIL; + } + + if (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n")); + return _FAIL; + } + + if (enable) + pdmpriv->TxPowerTrackControl = _TRUE; + else + pdmpriv->TxPowerTrackControl = _FALSE; + + return _SUCCESS; +} + +void GetPowerTracking(PADAPTER padapter, u8 *enable) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + *enable = pdmpriv->TxPowerTrackControl; +} + +static void disable_dm(PADAPTER padapter) +{ + u8 v8; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + //3 1. disable firmware dynamic mechanism + // disable Power Training, Rate Adaptive + v8 = rtw_read8(padapter, REG_BCN_CTRL); + v8 &= ~EN_BCN_FUNCTION; + rtw_write8(padapter, REG_BCN_CTRL, v8); + + //3 2. disable driver dynamic mechanism + // disable Dynamic Initial Gain + // disable High Power + // disable Power Tracking + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + // enable APK, LCK and IQK but disable power tracking + pdmpriv->TxPowerTrackControl = _FALSE; + Switch_DM_Func(padapter, DYNAMIC_FUNC_SS, _TRUE); +} + +//This function initializes the DUT to the MP test mode +s32 mp_start_test(PADAPTER padapter) +{ + WLAN_BSSID_EX bssid; + struct sta_info *psta; + u32 length; + u8 val8; + + _irqL irqL; + s32 res = _SUCCESS; + + struct mp_priv *pmppriv = &padapter->mppriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + + + //3 disable dynamic mechanism + disable_dm(padapter); + + //3 0. update mp_priv +#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D) + if (padapter->registrypriv.rf_config == RF_819X_MAX_TYPE) { +// HAL_DATA_TYPE *phal = GET_HAL_DATA(padapter); +// switch (phal->rf_type) { + switch (GET_RF_TYPE(padapter)) { + case RF_1T1R: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_A; + break; + case RF_1T2R: + default: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T2R: + case RF_2T2R_GREEN: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T4R: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_ABCD; + break; + } + } +#endif + mpt_ProStartTest(padapter); + + //3 1. initialize a new WLAN_BSSID_EX +// _rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX)); + _rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN); + bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc"); + _rtw_memcpy(bssid.Ssid.Ssid, (u8*)"mp_pseudo_adhoc", bssid.Ssid.SsidLength); + bssid.InfrastructureMode = Ndis802_11IBSS; + bssid.NetworkTypeInUse = Ndis802_11DS; + bssid.IELength = 0; + + length = get_WLAN_BSSID_EX_sz(&bssid); + if (length % 4) + bssid.Length = ((length >> 2) + 1) << 2; //round up to multiple of 4 bytes. + else + bssid.Length = length; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + goto end_of_mp_start_test; + + //init mp_start_test status + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + rtw_disassoc_cmd(padapter); + rtw_indicate_disconnect(padapter); + rtw_free_assoc_resources(padapter); + } + pmppriv->prev_fw_state = get_fwstate(pmlmepriv); + pmlmepriv->fw_state = WIFI_MP_STATE; +#if 0 + if (pmppriv->mode == _LOOPBOOK_MODE_) { + set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc + RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in Lookback mode\n")); + } else { + RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in normal mode\n")); + } +#endif + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); + + //3 2. create a new psta for mp driver + //clear psta in the cur_network, if any + psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); + if (psta) rtw_free_stainfo(padapter, psta); + + psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress); + if (psta == NULL) { + RT_TRACE(_module_mp_, _drv_err_, ("mp_start_test: Can't alloc sta_info!\n")); + pmlmepriv->fw_state = pmppriv->prev_fw_state; + res = _FAIL; + goto end_of_mp_start_test; + } + + //3 3. join psudo AdHoc + tgt_network->join_res = 1; + tgt_network->aid = psta->aid = 1; + _rtw_memcpy(&tgt_network->network, &bssid, length); + + rtw_indicate_connect(padapter); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + +end_of_mp_start_test: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + if (res == _SUCCESS) + { + // set MSR to WIFI_FW_ADHOC_STATE +#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D) + val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102 + val8 |= WIFI_FW_ADHOC_STATE; + rtw_write8(padapter, MSR, val8); // Link in ad hoc network +#endif + +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D) + rtw_write8(padapter, MSR, 1); // Link in ad hoc network + rtw_write8(padapter, RCR, 0); // RCR : disable all pkt, 0x10250048 + rtw_write8(padapter, RCR+2, 0x57); // RCR disable Check BSSID, 0x1025004a + + // disable RX filter map , mgt frames will put in RX FIFO 0 + rtw_write16(padapter, RXFLTMAP0, 0x0); // 0x10250116 + + val8 = rtw_read8(padapter, EE_9346CR); // 0x1025000A + if (!(val8 & _9356SEL))//boot from EFUSE + efuse_change_max_size(padapter); +#endif + } + + return res; +} +//------------------------------------------------------------------------------ +//This function change the DUT from the MP test mode into normal mode +void mp_stop_test(PADAPTER padapter) +{ + struct mp_priv *pmppriv = &padapter->mppriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + struct sta_info *psta; + + _irqL irqL; + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE) + goto end_of_mp_stop_test; + + //3 1. disconnect psudo AdHoc + rtw_indicate_disconnect(padapter); + + //3 2. clear psta used in mp test mode. +// rtw_free_assoc_resources(padapter); + psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); + if (psta) rtw_free_stainfo(padapter, psta); + + //3 3. return to normal state (default:station mode) + pmlmepriv->fw_state = pmppriv->prev_fw_state; // WIFI_STATION_STATE; + + //flush the cur_network + _rtw_memset(tgt_network, 0, sizeof(struct wlan_network)); + + _clr_fwstate_(pmlmepriv, WIFI_MP_STATE); + +end_of_mp_stop_test: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ +#if 0 +//#ifdef CONFIG_USB_HCI +static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID) +{ + u8 eRFPath; + u32 rfReg0x26; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + if (RateIdx < MPT_RATE_6M) { // CCK rate,for 88cu + rfReg0x26 = 0xf400; + } + else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {// OFDM rate,for 88cu + if ((4 == Channel) || (8 == Channel) || (12 == Channel)) + rfReg0x26 = 0xf000; + else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel)) + rfReg0x26 = 0xf400; + else + rfReg0x26 = 0x4f200; + } + else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {// MCS 20M ,for 88cu // MCS40M rate,for 88cu + + if (HT_CHANNEL_WIDTH_20 == BandWidthID) { + if ((4 == Channel) || (8 == Channel)) + rfReg0x26 = 0xf000; + else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel)) + rfReg0x26 = 0xf400; + else + rfReg0x26 = 0x4f200; + } + else{ + if ((4 == Channel) || (8 == Channel)) + rfReg0x26 = 0xf000; + else if ((5 == Channel) || (7 == Channel)) + rfReg0x26 = 0xf400; + else + rfReg0x26 = 0x4f200; + } + } + +// RT_TRACE(COMP_CMD, DBG_LOUD, ("\n mpt_AdjustRFRegByRateByChan92CU():Chan:%d Rate=%d rfReg0x26:0x%08x\n",Channel, RateIdx,rfReg0x26)); + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) { + write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26); + } +} +#endif +/*----------------------------------------------------------------------------- + * Function: mpt_SwitchRfSetting + * + * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. + * + * Input: IN PADAPTER pAdapter + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. + * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. + * + *---------------------------------------------------------------------------*/ +static void mpt_SwitchRfSetting(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mp_priv *pmp = &pAdapter->mppriv; + u8 ChannelToSw = pmp->channel; + u8 ulRateIdx = pmp->rateidx; + u8 ulbandwidth = pmp->bandwidth; + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); +#ifdef CONFIG_USB_HCI + + if (IS_92C_SERIAL(pHalData->VersionID)) + { + //92CE-VAU (92cu mCard) + if( BOARD_MINICARD == pHalData->BoardType) + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else //OFDM~MCS rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); + } + } + else //92CU dongle + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else if (ChannelToSw & BIT0) // OFDM rate, odd number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + else if (ChannelToSw == 4) // OFDM rate, even number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200); + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe0004); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709); + rtw_msleep_os(1); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333); + } + else if(ChannelToSw == 10) // OFDM rate, even number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28000); + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000A); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709); + rtw_msleep_os(1); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x7B333); + } + else if(ChannelToSw == 12) // OFDM rate, even number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200); + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000C); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x50B); + rtw_msleep_os(1); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333); + } + else + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + } + } + else //88cu + { + + //mcard interface + + if( BOARD_MINICARD == pHalData->BoardType) + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else //OFDM~MCS rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + + if(ChannelToSw == 6 || ChannelToSw == 8) + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F); + } + else + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x20); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x20); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30); + } + } + else + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else if (ChannelToSw & BIT0) // OFDM rate, odd number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + else + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); + } + } + } + +#else //PCI_INTERFACE + + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else //OFDM~MCS rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); + } + //88CE + if(!IS_92C_SERIAL(pHalData->VersionID)) + { + if(ChannelToSw == 6 || ChannelToSw == 8) + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F); + } + else + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pMptCtx->backup0xc50); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pMptCtx->backup0xc58); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30); + } + } + +#endif +} +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ + +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ +static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) +{ + u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; + u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; + u8 i; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + // get current cck swing value and check 0xa22 & 0xa23 later to match the table. + CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); + + if (!bInCH14) + { + // Readback the current bb cck swing value and compare with the table to + // get the current swing index + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ; + + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ; + } + else + { + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + + (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ; + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + + (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + + (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ; + } + + write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); + write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); + write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); +} + +static void MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) +{ + s32 TempCCk; + u8 CCK_index, CCK_index_old; + u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even + u8 TimeOut = 100; + s32 i = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + + if (!IS_92C_SERIAL(pHalData->VersionID) || !IS_NORMAL_CHIP(pHalData->VersionID)) + return; +#if 0 + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) + { + PlatformSleepUs(100); + TimeOut--; + if(TimeOut <= 0) + { + RTPRINT(FINIT, INIT_TxPower, + ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" )); + break; + } + } +#endif + if (beven && !pMptCtx->bMptIndexEven) //odd->even + { + Action = 2; + pMptCtx->bMptIndexEven = _TRUE; + } + else if (!beven && pMptCtx->bMptIndexEven) //even->odd + { + Action = 1; + pMptCtx->bMptIndexEven = _FALSE; + } + + if (Action != 0) + { + //Query CCK default setting From 0xa24 + TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (pHalData->dmpriv.bCCKinCH14) + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + + if (Action == 1) + CCK_index = CCK_index_old - 1; + else + CCK_index = CCK_index_old + 1; + +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n", +// CCK_index)); + + //Adjust CCK according to gain index + if (!pHalData->dmpriv.bCCKinCH14) { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); + } else { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); + } + } +#if 0 + RTPRINT(FINIT, INIT_TxPower, + ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20))); + + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); +#endif +} +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ + +/* + * SetChannel + * Description + * Use H2C command to change channel, + * not only modify rf register, but also other setting need to be done. + */ +void SetChannel(PADAPTER pAdapter) +{ +#if 0 + struct mp_priv *pmp = &pAdapter->mppriv; + +// SelectChannel(pAdapter, pmp->channel); + set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth); +#else + u8 eRFPath; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mp_priv *pmp = &pAdapter->mppriv; + u8 channel = pmp->channel; + u8 bandwidth = pmp->bandwidth; + u8 rate = pmp->rateidx; + + + // set RF channel register + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) + _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel); + + mpt_SwitchRfSetting(pAdapter); + + SelectChannel(pAdapter, channel); + + if (pHalData->CurrentChannel == 14 && !pHalData->dmpriv.bCCKinCH14) { + pHalData->dmpriv.bCCKinCH14 = _TRUE; + MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + } + else if (pHalData->CurrentChannel != 14 && pHalData->dmpriv.bCCKinCH14) { + pHalData->dmpriv.bCCKinCH14 = _FALSE; + MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + } +#if 0 +//#ifdef CONFIG_USB_HCI + // Georgia add 2009-11-17, suggested by Edlu , for 8188CU ,46 PIN + if (!IS_92C_SERIAL(pHalData->VersionID) && !IS_NORMAL_CHIP(pHalData->VersionID)) { + mpt_AdjustRFRegByRateByChan92CU(pAdapter, rate, pHalData->CurrentChannel, bandwidth); + } +#endif + +#endif +} + +/* + * Notice + * Switch bandwitdth may change center frequency(channel) + */ +void SetBandwidth(PADAPTER pAdapter) +{ + struct mp_priv *pmp = &pAdapter->mppriv; + + + SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); + mpt_SwitchRfSetting(pAdapter); +} + +static void SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 tmpval = 0; + + + // rf-A cck tx power + write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); + tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A]; + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); + + // rf-B cck tx power + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); + tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B]; + write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); + + RT_TRACE(_module_mp_, _drv_notice_, + ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n", + TxPower[RF_PATH_A], TxPower[RF_PATH_B])); +} + +static void SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 TxAGC = 0; + u8 tmpval = 0; + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + // HT Tx-rf(A) + tmpval = TxPower[RF_PATH_A]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); + + if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) + { + if (tmpval > pMptCtx->APK_bound[RF_PATH_A]) + write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][0]); + else + write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][1]); + } + + // HT Tx-rf(B) + tmpval = TxPower[RF_PATH_B]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); + + if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) + { + if (tmpval > pMptCtx->APK_bound[RF_PATH_B]) + write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][0]); + else + write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][1]); + } + + RT_TRACE(_module_mp_, _drv_notice_, + ("-SetOFDMTxPower: A[0x%02x] B[0x%02x]\n", + TxPower[RF_PATH_A], TxPower[RF_PATH_B])); +} + +void SetAntennaPathPower(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 TxPowerLevel[MAX_RF_PATH_NUMS]; + u8 rfPath; + + TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; + TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + switch (pHalData->rf_chip) + { + case RF_8225: + case RF_8256: + case RF_6052: + SetCCKTxPower(pAdapter, TxPowerLevel); + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate + MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); + SetOFDMTxPower(pAdapter, TxPowerLevel); + break; + + default: + break; + } +} + +void SetTxPower(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 TxPower = pAdapter->mppriv.txpoweridx; + u8 TxPowerLevel[MAX_RF_PATH_NUMS]; + u8 rf, rfPath; + + for (rf = 0; rf < MAX_RF_PATH_NUMS; rf++) { + TxPowerLevel[rf] = TxPower; + } + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + switch (pHalData->rf_chip) + { + // 2008/09/12 MH Test only !! We enable the TX power tracking for MP!!!!! + // We should call normal driver API later!! + case RF_8225: + case RF_8256: + case RF_6052: + SetCCKTxPower(pAdapter, TxPowerLevel); + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate + MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); + SetOFDMTxPower(pAdapter, TxPowerLevel); + break; + + default: + break; + } + +// SetCCKTxPower(pAdapter, TxPower); +// SetOFDMTxPower(pAdapter, TxPower); +} + +void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) +{ + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; + + TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); + TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); + TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); + + tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); + write_bbreg(pAdapter, rFPGA0_TxGainStage, + (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); +} + +void SetDataRate(PADAPTER pAdapter) +{ + mpt_SwitchRfSetting(pAdapter); +} + +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D) +/*------------------------------Define structure----------------------------*/ +typedef struct _R_ANTENNA_SELECT_OFDM { + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK { + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; +#endif + +void SetAntenna(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */ + R_ANTENNA_SELECT_CCK *p_cck_txrx; + + u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; + u8 chgTx = 0, chgRx = 0; + u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; + + + p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val; + p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val; + + p_ofdm_tx->r_ant_ht1 = 0x1; + p_ofdm_tx->r_ant_ht2 = 0x2; // Second TX RF path is A + p_ofdm_tx->r_ant_non_ht = 0x3; // 0x1+0x2=0x3 + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + p_ofdm_tx->r_tx_antenna = 0x1; + r_ofdm_tx_en_val = 0x1; + p_ofdm_tx->r_ant_l = 0x1; + p_ofdm_tx->r_ant_ht_s1 = 0x1; + p_ofdm_tx->r_ant_non_ht_s1 = 0x1; + p_cck_txrx->r_ccktx_enable = 0x8; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF A=TX and B as standby +// if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1); + r_ofdm_tx_en_val = 0x3; + + // Power save + //cosa r_ant_select_ofdm_val = 0x11111111; + + // We need to close RFB by SW control + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 0); + } + } + break; + + case ANTENNA_B: + p_ofdm_tx->r_tx_antenna = 0x2; + r_ofdm_tx_en_val = 0x2; + p_ofdm_tx->r_ant_l = 0x2; + p_ofdm_tx->r_ant_ht_s1 = 0x2; + p_ofdm_tx->r_ant_non_ht_s1 = 0x2; + p_cck_txrx->r_ccktx_enable = 0x4; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF A as standby + //if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); +// r_ofdm_tx_en_val = 0x3; + + // Power save + //cosa r_ant_select_ofdm_val = 0x22222222; + + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table. + // 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control + if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); + } + } + break; + + case ANTENNA_AB: // For 8192S + p_ofdm_tx->r_tx_antenna = 0x3; + r_ofdm_tx_en_val = 0x3; + p_ofdm_tx->r_ant_l = 0x3; + p_ofdm_tx->r_ant_ht_s1 = 0x3; + p_ofdm_tx->r_ant_non_ht_s1 = 0x3; + p_cck_txrx->r_ccktx_enable = 0xC; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF B as standby + //if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); + + // Disable Power save + //cosa r_ant_select_ofdm_val = 0x3321333; +#if 0 + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RFA 2T table. + if ((pHalData->VersionID == VERSION_8192S_ACUT)) // For RTL8192SU A-Cut only, by Roger, 2008.11.07. + { + mpt_RFConfigFromPreParaArrary(pAdapter, 1, RF90_PATH_A); + } +#endif + // 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); + } + } + break; + + default: + break; + } + + // + // r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D + // r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D + // r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D + // + switch (pAdapter->mppriv.antenna_rx) + { + case ANTENNA_A: + r_rx_antenna_ofdm = 0x1; // A + p_cck_txrx->r_cckrx_enable = 0x0; // default: A + p_cck_txrx->r_cckrx_enable_2 = 0x0; // option: A + chgRx = 1; + break; + + case ANTENNA_B: + r_rx_antenna_ofdm = 0x2; // B + p_cck_txrx->r_cckrx_enable = 0x1; // default: B + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option: B + chgRx = 1; + break; + + case ANTENNA_AB: + r_rx_antenna_ofdm = 0x3; // AB + p_cck_txrx->r_cckrx_enable = 0x0; // default:A + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option:B + chgRx = 1; + break; + + default: + break; + } + + if (chgTx && chgRx) + { + switch(pHalData->rf_chip) + { + case RF_8225: + case RF_8256: + case RF_6052: + //r_ant_sel_cck_val = r_ant_select_cck_val; + PHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val); //OFDM Tx + PHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val); //OFDM Tx + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx + PHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx + PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val);//r_ant_sel_cck_val); //CCK TxRx + break; + + default: + break; + } + } + + RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n")); +} + +s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + if (!netif_running(pAdapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n")); + return _FAIL; + } + + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n")); + return _FAIL; + } + + target_ther &= 0xff; + if (target_ther < 0x07) + target_ther = 0x07; + else if (target_ther > 0x1d) + target_ther = 0x1d; + + pHalData->EEPROMThermalMeter = target_ther; + + return _SUCCESS; +} + +static void TriggerRFThermalMeter(PADAPTER pAdapter) +{ + write_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x60); // 0x24: RF Reg[6:5] +// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" )); +} + +static u8 ReadRFThermalMeter(PADAPTER pAdapter) +{ + u32 ThermalValue = 0; + + ThermalValue = _read_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F); // 0x24: RF Reg[4:0] +// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue)); + return (u8)ThermalValue; +} + +void GetThermalMeter(PADAPTER pAdapter, u8 *value) +{ +#if 0 + fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER); + rtw_msleep_os(1000); + fw_cmd_data(pAdapter, value, 1); + *value &= 0xFF; +#else + TriggerRFThermalMeter(pAdapter); + rtw_msleep_os(1000); + *value = ReadRFThermalMeter(pAdapter); +#endif +} + +void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) +{ + pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; + if (bStart)// Start Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + + // 4. Turn On Single Carrier Tx and turn off the other test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + + // 5. Disable TX power saving at STF & LLTF + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 1); + } + else// Stop Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n")); + + // Turn off all test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + + // Cancel disable TX power saving at STF&LLTF + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 0); + + //Delay 10 ms //delay_ms(10); + rtw_msleep_os(10); + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } +} + +void SetSingleToneTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + u8 rfPath; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + pAdapter->mppriv.MptCtx.bSingleTone = bStart; + if (bStart)// Start Single Tone. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test start\n")); + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0); + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0); + + if (is92C) { + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x01); + rtw_usleep_os(100); + if (rfPath == RF_PATH_A) + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x10000); // PAD all on. + else if (rfPath == RF_PATH_B) + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x10000); // PAD all on. + } else { + write_rfreg(pAdapter, rfPath, 0x21, 0xd4000); + rtw_usleep_os(100); + } + write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on. + rtw_usleep_os(100); + } + else// Stop Single Tone. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n")); + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); + + if (is92C) { + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00); + rtw_usleep_os(100); + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on. + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on. + rtw_usleep_os(100); + } else { + write_rfreg(pAdapter, rfPath, 0x21, 0x54000); + rtw_usleep_os(100); + write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on. + rtw_usleep_os(100); + } + } +} + +void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) +{ + pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; + if (bStart) // Start Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) { + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting + + //Set CCK Tx Test Rate + //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate); + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps + } + } + else// Stop Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) { + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + } + //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n"); +} + +void SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + u32 cckrate; + + if (bStart) + { + RT_TRACE(_module_mp_, _drv_alert_, + ("SetCCKContinuousTx: test start\n")); + + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + //Set CCK Tx Test Rate + #if 0 + switch(pAdapter->mppriv.rateidx) + { + case 2: + cckrate = 0; + break; + case 4: + cckrate = 1; + break; + case 11: + cckrate = 2; + break; + case 22: + cckrate = 3; + break; + default: + cckrate = 0; + break; + } + #else + cckrate = pAdapter->mppriv.rateidx; + #endif + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting + + // Patch for CCK 11M waveform + if (cckrate == MPT_RATE_1M) + write_bbreg(pAdapter, 0xA71, BIT(6), bDisable); + else + write_bbreg(pAdapter, 0xA71, BIT(6), bEnable); + } + else { + RT_TRACE(_module_mp_, _drv_info_, + ("SetCCKContinuousTx: test stop\n")); + + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + + pAdapter->mppriv.MptCtx.bCckContTx = bStart; + pAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE; +}/* mpt_StartCckContTx */ + +void SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + if (bStart) { + RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + + // 4. Turn On Continue Tx and turn off the other test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + } else { + RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n")); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + //Delay 10 ms + rtw_msleep_os(10); + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + + pAdapter->mppriv.MptCtx.bCckContTx = _FALSE; + pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; +}/* mpt_StartOfdmContTx */ + +void SetContinuousTx(PADAPTER pAdapter, u8 bStart) +{ +#if 0 + // ADC turn off [bit24-21] adc port0 ~ port1 + if (bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF); + rtw_usleep_os(100); + } +#endif + RT_TRACE(_module_mp_, _drv_info_, + ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx)); + + pAdapter->mppriv.MptCtx.bStartContTx = bStart; + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) + { + SetCCKContinuousTx(pAdapter, bStart); + } + else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && + (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) + { + SetOFDMContinuousTx(pAdapter, bStart); + } +#if 0 + // ADC turn on [bit24-21] adc port0 ~ port1 + if (!bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000); + } +#endif +} + +//------------------------------------------------------------------------------ +void dump_mpframe(_adapter *padapter, struct xmit_frame *pmpframe) +{ + padapter->HalFunc.mgnt_xmit(padapter, pmpframe); +} + +struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv) +{ + struct xmit_frame *pmpframe; + struct xmit_buf *pxmitbuf; + + if ((pmpframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) + { + return NULL; + } + + if ((pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL) + { + rtw_free_xmitframe_ex(pxmitpriv, pmpframe); + return NULL; + } + + pmpframe->frame_tag = MP_FRAMETAG; + + pmpframe->pxmitbuf = pxmitbuf; + + pmpframe->buf_addr = pxmitbuf->pbuf; + + pxmitbuf->priv_data = pmpframe; + + return pmpframe; + +} + +thread_return mp_xmit_packet_thread(thread_context context) +{ + struct xmit_frame *pxmitframe; + struct mp_tx *pmptx; + struct mp_priv *pmp_priv; + struct xmit_priv *pxmitpriv; + PADAPTER padapter; + + pmp_priv = (struct mp_priv *)context; + pmptx = &pmp_priv->tx; + padapter = pmp_priv->papdater; + pxmitpriv = &(padapter->xmitpriv); + + thread_enter(padapter); + + //DBG_8192C("%s:pkTx Start\n", __func__); + while (1) { + pxmitframe = alloc_mp_xmitframe(pxmitpriv); + if (pxmitframe == NULL) { + if (pmptx->stop || + padapter->bSurpriseRemoved || + padapter->bDriverStopped) { + goto exit; + } + else { + rtw_msleep_os(1); + continue; + } + } + + _rtw_memcpy((u8 *)(pxmitframe->buf_addr+TXDESC_OFFSET), pmptx->buf, pmptx->write_size); + _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib)); + + dump_mpframe(padapter, pxmitframe); + + pmptx->sended++; + pmp_priv->tx_pktcount++; + + if (pmptx->stop || + padapter->bSurpriseRemoved || + padapter->bDriverStopped) + goto exit; + if ((pmptx->count != 0) && + (pmptx->count == pmptx->sended)) + goto exit; + + flush_signals_thread(); + } + +exit: + //DBG_8192C("%s:pkTx Exit\n", __func__); + rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size); + pmptx->pallocated_buf = NULL; + pmptx->stop = 1; + + thread_exit(); +} + +void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc) +{ + struct mp_priv *pmp_priv = &padapter->mppriv; + _rtw_memcpy(ptxdesc, &(pmp_priv->tx.desc), TXDESC_SIZE); +} + +void SetPacketTx(PADAPTER padapter) +{ + u8 *ptr, *pkt_start, *pkt_end; + u32 pkt_size; + struct tx_desc *desc; + struct ieee80211_hdr *hdr; + u8 macid, payload; + s32 bmcast; + struct pkt_attrib *pattrib; + struct mp_priv *pmp_priv; + + + pmp_priv = &padapter->mppriv; + if (pmp_priv->tx.stop) return; + pmp_priv->tx.sended = 0; + pmp_priv->tx.stop = 0; + pmp_priv->tx_pktcount = 0; + + //3 1. update_attrib() + pattrib = &pmp_priv->tx.attrib; + _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + bmcast = IS_MCAST(pattrib->ra); + if (bmcast) { + pattrib->mac_id = 1; + pattrib->psta = rtw_get_bcmc_stainfo(padapter); + } else { + pattrib->mac_id = 0; + pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); + } + + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen; + + //3 2. allocate xmit buffer + pkt_size = pattrib->last_txcmdsz; + + if (pmp_priv->tx.pallocated_buf) + rtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size); + pmp_priv->tx.write_size = pkt_size; + pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ; + pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size); + if (pmp_priv->tx.pallocated_buf == NULL) { + DBG_8192C("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size); + return; + } + pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ); + ptr = pmp_priv->tx.buf; + + desc = &(pmp_priv->tx.desc); + _rtw_memset(desc, 0, TXDESC_SIZE); + pkt_start = ptr; + pkt_end = pkt_start + pkt_size; + + //3 3. init TX descriptor + // offset 0 + //desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size + //desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); + //desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc + //if (bmcast) desc->txdw0 |= cpu_to_le32(BMC); // broadcast packet + + // offset 4 + desc->txdw1 |= cpu_to_le32(BK); // don't aggregate(AMPDU) + desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x1F); //CAM_ID(MAC_ID) + desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); // Queue Select, TID + desc->txdw1 |= cpu_to_le32((pattrib->raid << Rate_ID_SHT) & 0x000F0000); // Rate Adaptive ID + + // offset 8 + // offset 12 + //desc->txdw3 |= cpu_to_le32((pattrib->seqnum << SEQ_SHT) & 0xffff0000); + + // offset 16 + //desc->txdw4 |= cpu_to_le32(QoS); + desc->txdw4 |= cpu_to_le32(HW_SEQ_EN); + desc->txdw4 |= cpu_to_le32(USERATE); + desc->txdw4 |= cpu_to_le32(DISDATAFB); + + if( pmp_priv->preamble ){ + if (pmp_priv->rateidx <= MPT_RATE_54M) + desc->txdw4 |= cpu_to_le32(DATA_SHORT); // CCK Short Preamble + } + if (pmp_priv->bandwidth == HT_CHANNEL_WIDTH_40) + desc->txdw4 |= cpu_to_le32(DATA_BW); + + // offset 20 + desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F); + + if( pmp_priv->preamble ){ + if (pmp_priv->rateidx > MPT_RATE_54M) + desc->txdw5 |= cpu_to_le32(SGI); // MCS Short Guard Interval + } + desc->txdw5 |= cpu_to_le32(0x0001FF00); // DATA/RTS Rate Fallback Limit + + //3 4. make wlan header, make_wlanhdr() + hdr = (struct ieee80211_hdr *)pkt_start; + SetFrameSubType(&hdr->frame_ctl, pattrib->subtype); + _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA + _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA + _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID + + //3 5. make payload + ptr = pkt_start + pattrib->hdrlen; + + switch (pmp_priv->tx.payload) { + case 0: + payload = 0x00; + break; + case 1: + payload = 0x5a; + break; + case 2: + payload = 0xa5; + break; + case 3: + payload = 0xff; + break; + default: + payload = 0x00; + break; + } + + _rtw_memset(ptr, payload, pkt_end - ptr); + + //3 6. start thread + pmp_priv->tx.PktTxThread = kernel_thread(mp_xmit_packet_thread, pmp_priv, CLONE_FS|CLONE_FILES); + if(pmp_priv->tx.PktTxThread < 0) + DBG_871X("Create PktTx Thread Fail !!!!!\n"); + +} + +void SetPacketRx(PADAPTER pAdapter, u8 bStartRx) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if(bStartRx) + { + // Accept CRC error and destination address + pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); + } + else + { + rtw_write32(pAdapter, REG_RCR, 0); + } +} + +void ResetPhyRxPktCount(PADAPTER pAdapter) +{ + u32 i, phyrx_set = 0; + + for (i = 0; i <= 0xF; i++) { + phyrx_set = 0; + phyrx_set |= _RXERR_RPT_SEL(i); //select + phyrx_set |= RXERR_RPT_RST; // set counter to zero + rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); + } +} + +static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit) +{ + //selection + u32 phyrx_set = 0, count = 0; + + phyrx_set = _RXERR_RPT_SEL(selbit & 0xF); + rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); + + //Read packet count + count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK; + + return count; +} + +u32 GetPhyRxPktReceived(PADAPTER pAdapter) +{ + u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; + + OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK); + CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK); + HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK); + + return OFDM_cnt + CCK_cnt + HT_cnt; +} + +u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter) +{ + u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; + + OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL); + CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL); + HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL); + + return OFDM_cnt + CCK_cnt + HT_cnt; +} + +//reg 0x808[9:0]: FFT data x +//reg 0x808[22]: 0 --> 1 to get 1 FFT data y +//reg 0x8B4[15:0]: FFT data y report +static u32 GetPSDData(PADAPTER pAdapter, u32 point) +{ + int psd_val; + + + psd_val = rtw_read32(pAdapter, 0x808); + psd_val &= 0xFFBFFC00; + psd_val |= point; + + rtw_write32(pAdapter, 0x808, psd_val); + rtw_mdelay_os(1); + psd_val |= 0x00400000; + + rtw_write32(pAdapter, 0x808, psd_val); + rtw_mdelay_os(1); + psd_val = rtw_read32(pAdapter, 0x8B4); + + psd_val &= 0x0000FFFF; + + return psd_val; +} + +/* + * pts start_point_min stop_point_max + * 128 64 64 + 128 = 192 + * 256 128 128 + 256 = 384 + * 512 256 256 + 512 = 768 + * 1024 512 512 + 1024 = 1536 + * + */ +u32 mp_query_psd(PADAPTER pAdapter, u8 *data) +{ + u8 *val; + u32 i, psd_pts=0, psd_start=0, psd_stop=0; + u32 psd_data=0; + + + if (!netif_running(pAdapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! interface not opened!\n")); + return 0; + } + + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! not in MP mode!\n")); + return 0; + } + + if (strlen(data) == 0) { //default value + psd_pts = 128; + psd_start = 64; + psd_stop = 128; + } else { + sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop); + } + + _rtw_memset(data, '\0', sizeof(data)); + + i = psd_start; + while (i < psd_stop) + { + if (i >= psd_pts) { + psd_data = GetPSDData(pAdapter, i-psd_pts); + } else { + psd_data = GetPSDData(pAdapter, i); + } + sprintf(data, "%s%x ", data, psd_data); + i++; + } + + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(100); + #else + rtw_mdelay_os(100); + #endif + + return strlen(data)+1; +} + +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c b/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c new file mode 100755 index 000000000000..1d59f13cba93 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c @@ -0,0 +1,2841 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_MP_IOCTL_C_ + +#include +#include +#include +#include + +//#include +#include + + +//**************** oid_rtl_seg_81_85 section start **************** +NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == SET_OID) { + Adapter->registrypriv.wireless_mode = *(u8*)poid_par_priv->information_buf; + } else if (poid_par_priv->type_of_oid == QUERY_OID) { + *(u8*)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + RT_TRACE(_module_mp_, _drv_info_, ("-query Wireless Mode=%d\n", Adapter->registrypriv.wireless_mode)); + } else { + status = NDIS_STATUS_NOT_ACCEPTED; + } + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_87_80 section start **************** +NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct bb_reg_param *pbbreg; + u16 offset; + u32 value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_bb_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); + + offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff + if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; + + value = pbbreg->value; + + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_write_bb_reg_hdl: offset=0x%03X value=0x%08X\n", + offset, value)); + + _irqlevel_changed_(&oldirql, LOWER); + write_bbreg(Adapter, offset, 0xFFFFFFFF, value); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct bb_reg_param *pbbreg; + u16 offset; + u32 value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_bb_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); + + offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff + if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; + + _irqlevel_changed_(&oldirql, LOWER); + value = read_bbreg(Adapter, offset, 0xFFFFFFFF); + _irqlevel_changed_(&oldirql, RAISE); + + pbbreg->value = value; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_read_bb_reg_hdl: offset=0x%03X value:0x%08X\n", + offset, value)); +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct rf_reg_param *pbbreg; + u8 path; + u8 offset; + u32 value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_rf_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); + + if (pbbreg->path >= MAX_RF_PATH_NUMS) + return NDIS_STATUS_NOT_ACCEPTED; + if (pbbreg->offset > 0xFF) + return NDIS_STATUS_NOT_ACCEPTED; + if (pbbreg->value > 0xFFFFF) + return NDIS_STATUS_NOT_ACCEPTED; + + path = (u8)pbbreg->path; + offset = (u8)pbbreg->offset; + value = pbbreg->value; + + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_write_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", + path, offset, value)); + + _irqlevel_changed_(&oldirql, LOWER); + write_rfreg(Adapter, path, offset, value); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct rf_reg_param *pbbreg; + u8 path; + u8 offset; + u32 value; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_rf_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); + + if (pbbreg->path >= MAX_RF_PATH_NUMS) + return NDIS_STATUS_NOT_ACCEPTED; + if (pbbreg->offset > 0xFF) + return NDIS_STATUS_NOT_ACCEPTED; + + path = (u8)pbbreg->path; + offset = (u8)pbbreg->offset; + + _irqlevel_changed_(&oldirql, LOWER); + value = read_rfreg(Adapter, path, offset); + _irqlevel_changed_(&oldirql, RAISE); + + pbbreg->value = value; + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_read_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", + path, offset, value)); + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_87_00 section end**************** +//------------------------------------------------------------------------------ + +//**************** oid_rtl_seg_81_80_00 section start **************** +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 ratevalue;//4 + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_set_data_rate_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + ratevalue = *((u32*)poid_par_priv->information_buf);//4 + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_set_data_rate_hdl: data rate idx=%d\n", ratevalue)); + if (ratevalue >= MPT_RATE_LAST) + return NDIS_STATUS_INVALID_DATA; + + Adapter->mppriv.rateidx = ratevalue; + + _irqlevel_changed_(&oldirql, LOWER); + SetDataRate(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 mode; + u8 val8; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_start_test_hdl\n")); + + if (Adapter->registrypriv.mp_mode == 0) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + //IQCalibrateBcut(Adapter); + + mode = *((u32*)poid_par_priv->information_buf); + Adapter->mppriv.mode = mode;// 1 for loopback + + if (mp_start_test(Adapter) == _FAIL) { + status = NDIS_STATUS_NOT_ACCEPTED; + goto exit; + } + +exit: + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_pro_start_test_hdl: mp_mode=%d\n", Adapter->mppriv.mode)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_STOP_TEST\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + mp_stop_test(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_notice_, ("-Set OID_RT_PRO_STOP_TEST\n")); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 Channel; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_channel_direct_call_hdl\n")); + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == QUERY_OID) { + *((u32*)poid_par_priv->information_buf) = Adapter->mppriv.channel; + return NDIS_STATUS_SUCCESS; + } + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + Channel = *((u32*)poid_par_priv->information_buf); + RT_TRACE(_module_mp_, _drv_notice_, ("oid_rt_pro_set_channel_direct_call_hdl: Channel=%d\n", Channel)); + if (Channel > 14) + return NDIS_STATUS_NOT_ACCEPTED; + Adapter->mppriv.channel = Channel; + + _irqlevel_changed_(&oldirql, LOWER); + SetChannel(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u16 bandwidth, channel_offset; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, + ("+oid_rt_set_bandwidth_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + bandwidth = *((u32*)poid_par_priv->information_buf);//4 + if (bandwidth != HT_CHANNEL_WIDTH_40) + bandwidth = HT_CHANNEL_WIDTH_20; + Adapter->mppriv.bandwidth = (u8)bandwidth; + + _irqlevel_changed_(&oldirql, LOWER); + SetBandwidth(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_set_bandwidth_hdl: bandwidth=%d channel_offset=%d\n", + bandwidth, channel_offset)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 antenna; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_antenna_bb_hdl\n")); + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == SET_OID) + { + antenna = *(u32*)poid_par_priv->information_buf; + + Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16); + Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF); + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_set_antenna_bb_hdl: tx_ant=0x%04x rx_ant=0x%04x\n", + Adapter->mppriv.antenna_tx, Adapter->mppriv.antenna_rx)); + + _irqlevel_changed_(&oldirql, LOWER); + SetAntenna(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + } else { + antenna = (Adapter->mppriv.antenna_tx << 16)|Adapter->mppriv.antenna_rx; + *(u32*)poid_par_priv->information_buf = antenna; + } + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 tx_pwr_idx; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_set_tx_power_control_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + tx_pwr_idx = *((u32*)poid_par_priv->information_buf); + if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE) + return NDIS_STATUS_NOT_ACCEPTED; + + Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx; + + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_set_tx_power_control_hdl: idx=0x%2x\n", + Adapter->mppriv.txpoweridx)); + + _irqlevel_changed_(&oldirql, LOWER); + SetTxPower(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +//**************** oid_rtl_seg_81_80_20 section start **************** +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid !=QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_received_hdl.\n")); + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + RT_TRACE(_module_mp_, _drv_alert_, ("recv_ok:%d \n",Adapter->mppriv.rx_pktcount)); + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_crc32_error_hdl.\n")); + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + RT_TRACE(_module_mp_, _drv_alert_, ("recv_err:%d \n",Adapter->mppriv.rx_crcerrpktcount)); + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ + +NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_reset_tx_packet_sent_hdl.\n")); + Adapter->mppriv.tx_pktcount = 0; + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + Adapter->mppriv.rx_pktcount = 0; + Adapter->mppriv.rx_crcerrpktcount = 0; + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql, LOWER); + ResetPhyRxPktCount(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_received_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len != sizeof(ULONG)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_get_phy_rx_packet_received_hdl: recv_ok=%d\n", *(ULONG*)poid_par_priv->information_buf)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_crc32_error_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + + if (poid_par_priv->information_buf_len != sizeof(ULONG)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_get_phy_rx_packet_crc32_error_hdl: recv_err=%d\n", *(ULONG*)poid_par_priv->information_buf)); + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_80_20 section end **************** +NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_continuous_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetContinuousTx(Adapter,(u8)bStartTest); + if (bStartTest) { + struct mp_priv *pmp_priv = &Adapter->mppriv; + if (pmp_priv->tx.stop == 0) { + pmp_priv->tx.stop = 1; + DBG_8192C("%s: pkt tx is running...\n", __func__); + rtw_msleep_os(5); + } + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = 1; + SetPacketTx(Adapter); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_carrier_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetSingleCarrierTx(Adapter, (u8)bStartTest); + if (bStartTest) { + struct mp_priv *pmp_priv = &Adapter->mppriv; + if (pmp_priv->tx.stop == 0) { + pmp_priv->tx.stop = 1; + DBG_8192C("%s: pkt tx is running...\n", __func__); + rtw_msleep_os(5); + } + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = 1; + SetPacketTx(Adapter); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_carrier_suppression_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetCarrierSuppressionTx(Adapter, (u8)bStartTest); + if (bStartTest) { + struct mp_priv *pmp_priv = &Adapter->mppriv; + if (pmp_priv->tx.stop == 0) { + pmp_priv->tx.stop = 1; + DBG_8192C("%s: pkt tx is running...\n", __func__); + rtw_msleep_os(5); + } + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = 1; + SetPacketTx(Adapter); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_tone_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetSingleToneTx(Adapter,(u8)bStartTest); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv) +{ + return 0; +} + +NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_TRIGGER_GPIO_0, 0); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_80_00 section end **************** +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + PNDIS_802_11_SSID pssid; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = (u32)sizeof(NDIS_802_11_SSID); + *poid_par_priv->bytes_rw = 0; + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + pssid = (PNDIS_802_11_SSID)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + + if (mp_start_joinbss(Adapter, pssid) == _FAIL) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + pRW_Reg RegRWStruct; + u32 offset, width; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, + ("+oid_rt_pro_read_register_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; + offset = RegRWStruct->offset; + width = RegRWStruct->width; + + if (offset > 0xFFF) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + switch (width) { + case 1: + RegRWStruct->value = rtw_read8(Adapter, offset); + break; + case 2: + RegRWStruct->value = rtw_read16(Adapter, offset); + break; + default: + width = 4; + RegRWStruct->value = rtw_read32(Adapter, offset); + break; + } + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_read_register_hdl: offset:0x%04X value:0x%X\n", + offset, RegRWStruct->value)); + + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = width; + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + pRW_Reg RegRWStruct; + u32 offset, width, value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, + ("+oid_rt_pro_write_register_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; + offset = RegRWStruct->offset; + width = RegRWStruct->width; + value = RegRWStruct->value; + + if (offset > 0xFFF) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + switch (RegRWStruct->width) + { + case 1: + if (value > 0xFF) { + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + rtw_write8(padapter, offset, (u8)value); + break; + case 2: + if (value > 0xFFFF) { + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + rtw_write16(padapter, offset, (u16)value); + break; + case 4: + rtw_write32(padapter, offset, value); + break; + default: + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_pro_write_register_hdl: offset=0x%08X width=%d value=0x%X\n", + offset, width, value)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pBurst_RW_Reg pBstRwReg; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_read_register_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + rtw_read_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); + _irqlevel_changed_(&oldirql,RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +#endif + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_read_register_hdl\n")); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pBurst_RW_Reg pBstRwReg; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_write_register_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + rtw_write_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); + _irqlevel_changed_(&oldirql, RAISE); +#endif + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_write_register_hdl\n")); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +/* + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + _irqL oldirql; + + TX_CMD_Desc *TxCmd_Info; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + RT_TRACE(_module_mp_, _drv_info_, ("+Set OID_RT_PRO_WRITE_TXCMD\n")); + + TxCmd_Info=(TX_CMD_Desc*)poid_par_priv->information_buf; + + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:Addr=%.8X\n", TxCmd_Info->offset)); + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:1.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[0])); + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:2.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[1])); + RT_TRACE(_module_mp_, _drv_info_, (("WRITE_TXCMD:3.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[2])); + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:4.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[3])); + + _irqlevel_changed_(&oldirql, LOWER); + + rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]); + rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]); + + _irqlevel_changed_(&oldirql, RAISE); +*/ + + RT_TRACE(_module_mp_, _drv_notice_, + ("-Set OID_RT_PRO_WRITE_TXCMD: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pEEPROM_RWParam pEEPROM; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+Query OID_RT_PRO_READ16_EEPROM\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + pEEPROM->value = eeprom_read16(Adapter, (u16)(pEEPROM->offset >> 1)); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-Query OID_RT_PRO_READ16_EEPROM: offset=0x%x value=0x%x\n", + pEEPROM->offset, pEEPROM->value)); +#endif +_func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pEEPROM_RWParam pEEPROM; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_WRITE16_EEPROM\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + eeprom_write16(Adapter, (u16)(pEEPROM->offset >> 1), pEEPROM->value); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +#endif +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct mp_wiparam *pwi_param; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam)) + return NDIS_STATUS_INVALID_LENGTH; + + if (Adapter->mppriv.workparam.bcompleted == _FALSE) + return NDIS_STATUS_NOT_ACCEPTED; + + pwi_param = (struct mp_wiparam *)poid_par_priv->information_buf; + + _rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam)); + Adapter->mppriv.act_in_progress = _FALSE; +// RT_TRACE(_module_mp_, _drv_info_, ("rf:%x\n", pwiparam->IoValue)); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro8711_pkt_loss_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(uint)*2) { + RT_TRACE(_module_mp_, _drv_err_, ("-oid_rt_pro8711_pkt_loss_hdl: buf_len=%d\n", (int)poid_par_priv->information_buf_len)); + return NDIS_STATUS_INVALID_LENGTH; + } + + if (*(uint*)poid_par_priv->information_buf == 1)//init==1 + Adapter->mppriv.rx_pktloss = 0; + + *((uint*)poid_par_priv->information_buf+1) = Adapter->mppriv.rx_pktloss; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; + struct intf_hdl *pintfhdl = &pio_queue->intf; + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +#ifdef CONFIG_SDIO_HCI + void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); +#endif + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Query OID_RT_RD_ATTRIB_MEM\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + +#ifdef CONFIG_SDIO_HCI + _irqlevel_changed_(&oldirql, LOWER); +{ + u32 *plmem = (u32*)poid_par_priv->information_buf+2; + _attrib_read = pintfhdl->io_ops._attrib_read; + _attrib_read(pintfhdl, *((u32*)poid_par_priv->information_buf), + *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +} + _irqlevel_changed_(&oldirql, RAISE); +#endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; + struct intf_hdl *pintfhdl = &pio_queue->intf; + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +#ifdef CONFIG_SDIO_HCI + void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); +#endif + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + +#ifdef CONFIG_SDIO_HCI + _irqlevel_changed_(&oldirql, LOWER); +{ + u32 *plmem = (u32*)poid_par_priv->information_buf + 2; + _attrib_write = pintfhdl->io_ops._attrib_write; + _attrib_write(pintfhdl, *(u32*)poid_par_priv->information_buf, + *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); +} + _irqlevel_changed_(&oldirql, RAISE); +#endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_RF_INTFS\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + if (rtw_setrfintfs_cmd(Adapter, *(unsigned char*)poid_par_priv->information_buf) == _FAIL) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _rtw_memcpy(poid_par_priv->information_buf, (unsigned char*)&Adapter->mppriv.rxstat, sizeof(struct recv_stat)); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + PCFG_DBG_MSG_STRUCT pdbg_msg; + +_func_enter_; + +// RT_TRACE(0xffffffffff,_drv_alert_,("===> oid_rt_pro_cfg_debug_message_hdl.\n")); + +#if 0//#ifdef CONFIG_DEBUG_RTL871X + + pdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf); + + if (poid_par_priv->type_of_oid == SET_OID) { + RT_TRACE(0xffffffffff, _drv_alert_, + ("===>Set level :0x%08x, H32:0x%08x L32:0x%08x\n", + pdbg_msg->DebugLevel, pdbg_msg->DebugComponent_H32, pdbg_msg->DebugComponent_L32)); + + GlobalDebugLevel = pdbg_msg->DebugLevel; + GlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32; + RT_TRACE(0xffffffffff, _drv_alert_, + ("===> Set level :0x%08x, component:0x%016x\n", + GlobalDebugLevel, (u32)GlobalDebugComponents)); + } else { + pdbg_msg->DebugLevel = GlobalDebugLevel; + pdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32); + pdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(0xffffffffff, _drv_alert_, + ("===>Query level:0x%08x H32:0x%08x L32:0x%08x\n", + (u32)pdbg_msg->DebugLevel, (u32)pdbg_msg->DebugComponent_H32, (u32)pdbg_msg->DebugComponent_L32)); + } + +#endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_DATA_RATE_EX\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) !=_SUCCESS) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + u8 thermal = 0; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_get_thermal_meter_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + GetThermalMeter(Adapter, &thermal); + _irqlevel_changed_(&oldirql, RAISE); + + *(u32*)poid_par_priv->information_buf = (u32)thermal; + *poid_par_priv->bytes_rw = sizeof(u32); + +_func_exit_; + + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_tssi_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (Adapter->mppriv.act_in_progress == _TRUE) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + //init workparam + Adapter->mppriv.act_in_progress = _TRUE; + Adapter->mppriv.workparam.bcompleted = _FALSE; + Adapter->mppriv.workparam.act_type = MPT_READ_TSSI; + Adapter->mppriv.workparam.io_offset = 0; + Adapter->mppriv.workparam.io_value = 0xFFFFFFFF; + + _irqlevel_changed_(&oldirql, LOWER); + + if (!rtw_gettssi_cmd(Adapter,0, (u8*)&Adapter->mppriv.workparam.io_value)) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + +_func_enter_; + +// if (poid_par_priv->type_of_oid != SET_OID) +// return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + if (poid_par_priv->type_of_oid == SET_OID) { + u8 enable; + + enable = *(u8*)poid_par_priv->information_buf; + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_set_power_tracking_hdl: enable=%d\n", enable)); + + SetPowerTracking(Adapter, enable); + } else { + GetPowerTracking(Adapter, (u8*)poid_par_priv->information_buf); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + u32 ratevalue; + u8 datarates[NumRates]; + int i; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+OID_RT_PRO_SET_BASIC_RATE\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + ratevalue = *((u32*)poid_par_priv->information_buf); + + for (i = 0; i < NumRates; i++) { + if (ratevalue == mpdatarate[i]) + datarates[i] = mpdatarate[i]; + else + datarates[i] = 0xff; + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_info_, ("basicrate_inx=%d\n", datarates[i])); + } + + _irqlevel_changed_(&oldirql, LOWER); + + if (rtw_setbasicrate_cmd(Adapter, datarates) != _SUCCESS) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); +#endif + RT_TRACE(_module_mp_, _drv_notice_, + ("-OID_RT_PRO_SET_BASIC_RATE: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < 8) + return NDIS_STATUS_INVALID_LENGTH; + + *poid_par_priv->bytes_rw = 8; + _rtw_memcpy(poid_par_priv->information_buf, &(Adapter->pwrctrlpriv.pwr_mode), 8); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_qry_pwrstate_hdl: pwr_mode=%d smart_ps=%d\n", + Adapter->pwrctrlpriv.pwr_mode, Adapter->pwrctrlpriv.smart_ps)); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + uint pwr_mode, smart_ps; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_SET_PWRSTATE\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_rw = 0; + *poid_par_priv->bytes_needed = 8; + + if (poid_par_priv->information_buf_len < 8) + return NDIS_STATUS_INVALID_LENGTH; + + pwr_mode = *(uint *)(poid_par_priv->information_buf); + smart_ps = *(uint *)((int)poid_par_priv->information_buf + 4); + + *poid_par_priv->bytes_rw = 8; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct setratable_parm *prate_table; + u8 res; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = sizeof(struct setratable_parm); + if (poid_par_priv->information_buf_len < sizeof(struct setratable_parm)) + return NDIS_STATUS_INVALID_LENGTH; + + prate_table = (struct setratable_parm*)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + res = rtw_setrttbl_cmd(Adapter, prate_table); + _irqlevel_changed_(&oldirql, RAISE); + + if (res == _FAIL) + status = NDIS_STATUS_FAILURE; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + #if 0 + struct mp_wi_cntx *pmp_wi_cntx=&(Adapter->mppriv.wi_cntx); + u8 res=_SUCCESS; + DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); + + if(pmp_wi_cntx->bmp_wi_progress ==_TRUE){ + DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n")); + Status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + else{ + pmp_wi_cntx->bmp_wi_progress=_TRUE; + pmp_wi_cntx->param.bcompleted=_FALSE; + pmp_wi_cntx->param.act_type=MPT_GET_RATE_TABLE; + pmp_wi_cntx->param.io_offset=0x0; + pmp_wi_cntx->param.bytes_cnt=sizeof(struct getratable_rsp); + pmp_wi_cntx->param.io_value=0xffffffff; + + res=rtw_getrttbl_cmd(Adapter,(struct getratable_rsp *)pmp_wi_cntx->param.data); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + if(res != _SUCCESS) + { + Status = NDIS_STATUS_NOT_ACCEPTED; + } + } + DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); + #endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} + +//**************** oid_rtl_seg_87_12_00 section start **************** +NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + struct security_priv *psecuritypriv = &Adapter->securitypriv; + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + ENCRY_CTRL_STATE encry_mode; + + + *poid_par_priv->bytes_needed = sizeof(u8); + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == SET_OID) + { + encry_mode = *((u8*)poid_par_priv->information_buf); + switch (encry_mode) + { + case HW_CONTROL: + #if 0 + Adapter->registrypriv.software_decrypt=_FALSE; + Adapter->registrypriv.software_encrypt=_FALSE; + #else + psecuritypriv->sw_decrypt = _FALSE; + psecuritypriv->sw_encrypt = _FALSE; + #endif + break; + case SW_CONTROL: + #if 0 + Adapter->registrypriv.software_decrypt=_TRUE; + Adapter->registrypriv.software_encrypt=_TRUE; + #else + psecuritypriv->sw_decrypt = _TRUE; + psecuritypriv->sw_encrypt = _TRUE; + #endif + break; + case HW_ENCRY_SW_DECRY: + #if 0 + Adapter->registrypriv.software_decrypt=_TRUE; + Adapter->registrypriv.software_encrypt=_FALSE; + #else + psecuritypriv->sw_decrypt = _TRUE; + psecuritypriv->sw_encrypt = _FALSE; + #endif + break; + case SW_ENCRY_HW_DECRY: + #if 0 + Adapter->registrypriv.software_decrypt=_FALSE; + Adapter->registrypriv.software_encrypt=_TRUE; + #else + psecuritypriv->sw_decrypt = _FALSE; + psecuritypriv->sw_encrypt = _TRUE; + #endif + break; + } + + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_notice_, + ("-oid_rt_pro_encryption_ctrl_hdl: SET encry_mode=0x%x sw_encrypt=0x%x sw_decrypt=0x%x\n", + encry_mode, psecuritypriv->sw_encrypt, psecuritypriv->sw_decrypt)); + } + else { + #if 0 + if (Adapter->registrypriv.software_encrypt == _FALSE) { + if (Adapter->registrypriv.software_decrypt == _FALSE) + encry_mode = HW_CONTROL; + else + encry_mode = HW_ENCRY_SW_DECRY; + } + else { + if (Adapter->registrypriv.software_decrypt == _FALSE) + encry_mode = SW_ENCRY_HW_DECRY; + else + encry_mode = SW_CONTROL; + } + #else + + if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE)) + encry_mode = HW_CONTROL; + else if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _TRUE)) + encry_mode = HW_ENCRY_SW_DECRY; + else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _FALSE)) + encry_mode = SW_ENCRY_HW_DECRY; + else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE)) + encry_mode = SW_CONTROL; + + #endif + + *(u8*)poid_par_priv->information_buf = encry_mode; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_encryption_ctrl_hdl: QUERY encry_mode=0x%x\n", + encry_mode)); + } + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct sta_info *psta = NULL; + UCHAR *macaddr; + + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = ETH_ALEN; + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + macaddr = (UCHAR *) poid_par_priv->information_buf ; + + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, + ("OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); + + _irqlevel_changed_(&oldirql, LOWER); + + psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); + + if (psta == NULL) { // the sta have been in sta_info_queue => do nothing + psta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr); + + if (psta == NULL) { + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("Can't alloc sta_info when OID_RT_PRO_ADD_STA_INFO\n")); + status = NDIS_STATUS_FAILURE; + } + } else { //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_err_, + ("Error: OID_RT_PRO_ADD_STA_INFO: sta has been in sta_hash_queue \n")); + } + + _irqlevel_changed_(&oldirql, RAISE); + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL irqL; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct sta_info *psta = NULL; + UCHAR *macaddr; + + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = ETH_ALEN; + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + macaddr = (UCHAR *) poid_par_priv->information_buf ; + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, + ("+OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); + + psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); + if (psta != NULL) { + _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); + rtw_free_stainfo(Adapter, psta); + _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); + } + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +#include +u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var) +{ +#if 0 +#ifdef CONFIG_SDIO_HCI + + if (offset == 1) { + u16 tmp_blk_num; + tmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM); + RT_TRACE(_module_mp_, _drv_err_, ("Query Information, mp_query_drv_var SDIO_RX0_RDYBLK_NUM=0x%x padapter->dvobjpriv.rxblknum=0x%x\n", tmp_blk_num, padapter->dvobjpriv.rxblknum)); + if (padapter->dvobjpriv.rxblknum != tmp_blk_num) { + RT_TRACE(_module_mp_,_drv_err_, ("Query Information, mp_query_drv_var call recv rx\n")); + // sd_recv_rxfifo(padapter); + } + } + +#if 0 + if(offset <=100){ //For setting data rate and query data rate + if(offset==100){ //For query data rate + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): query rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); + var=padapter->registrypriv.tx_rate; + + } + else if(offset<0x1d){ //For setting data rate + padapter->registrypriv.tx_rate=offset; + var=padapter->registrypriv.tx_rate; + padapter->registrypriv.use_rate=_TRUE; + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): set rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); + } + else{ //not use the data rate + padapter->registrypriv.use_rate=_FALSE; + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) out of rate range\n",offset)); + } + } + else if (offset<=110){ //for setting debug level + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d) for set debug level\n",offset)); + if(offset==110){ //For query data rate + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): query dbg level=0x%.2x \n",offset,padapter->registrypriv.dbg_level)); + padapter->registrypriv.dbg_level=GlobalDebugLevel; + var=padapter->registrypriv.dbg_level; + } + else if(offset<110 && offset>100){ + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): set dbg level=0x%.2x \n",offset,offset-100)); + padapter->registrypriv.dbg_level=GlobalDebugLevel=offset-100; + var=padapter->registrypriv.dbg_level; + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_alert_, (" mp_query_drv_var(_drv_alert_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_crit_, (" mp_query_drv_var(_drv_crit_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_err_, (" mp_query_drv_var(_drv_err_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_warning_, (" mp_query_drv_var(_drv_warning_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_notice_, (" mp_query_drv_var(_drv_notice_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_info_, (" mp_query_drv_var(_drv_info_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_debug_, (" mp_query_drv_var(_drv_debug_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + + } + } + else if(offset >110 &&offset <116){ + if(115==offset){ + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): query TRX access type: [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + } + else { + switch(offset){ + case 111: + padapter->dvobjpriv.tx_block_mode=1; + padapter->dvobjpriv.rx_block_mode=1; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + case 112: + padapter->dvobjpriv.tx_block_mode=1; + padapter->dvobjpriv.rx_block_mode=0; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + case 113: + padapter->dvobjpriv.tx_block_mode=0; + padapter->dvobjpriv.rx_block_mode=1; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + case 114: + padapter->dvobjpriv.tx_block_mode=0; + padapter->dvobjpriv.rx_block_mode=0; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + default : + break; + + } + + } + + } + else if(offset>=127){ + u64 prnt_dbg_comp; + u8 chg_idx; + u64 tmp_dbg_comp; + chg_idx=offset-0x80; + tmp_dbg_comp=BIT(chg_idx); + prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; + RT_TRACE(_module_mp_, _drv_emerg_, (" 1: mp_query_drv_var: offset(%d;0x%x):for dbg conpoment prnt_dbg_comp=0x%.16x GlobalDebugComponents=0x%.16x padapter->registrypriv.dbg_component=0x%.16x\n",offset,offset,prnt_dbg_comp,GlobalDebugComponents,padapter->registrypriv.dbg_component)); + if(offset==127){ + // prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; + var=(u32)(padapter->registrypriv.dbg_component); + RT_TRACE(0xffffffff, _drv_emerg_, ("2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) \n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + prnt_dbg_comp=GlobalDebugComponents; + RT_TRACE(0xffffffff, _drv_emerg_, ("2-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; + RT_TRACE(0xffffffff, _drv_emerg_, ("2-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + + } + else{ + RT_TRACE(0xffffffff, _drv_emerg_, ("3: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx)); + prnt_dbg_comp=GlobalDebugComponents; + RT_TRACE(0xffffffff, _drv_emerg_,("3-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));// ("3-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment=0x%x chg_idx=%d or0x%x BIT(chg_idx[%d]=0x%x)\n",offset,offset,prnt_dbg_comp,chg_idx,chg_idx,(chg_idx),tmp_dbg_comp) + prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; + RT_TRACE(0xffffffff, _drv_emerg_, ("3-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + + if(GlobalDebugComponents&tmp_dbg_comp){ + //this bit is already set, now clear it + GlobalDebugComponents=GlobalDebugComponents&(~tmp_dbg_comp); + } + else{ + //this bit is not set, now set it. + GlobalDebugComponents =GlobalDebugComponents|tmp_dbg_comp; + } + RT_TRACE(0xffffffff, _drv_emerg_, ("4: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); + prnt_dbg_comp=GlobalDebugComponents; + RT_TRACE(0xffffffff, _drv_emerg_, ("4-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_emerg_, ("0: mp_query_drv_var(_module_rtl871x_xmit_c_:0): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,prnt_dbg_comp)); + RT_TRACE(_module_xmit_osdep_c_, _drv_emerg_, ("1: mp_query_drv_var(_module_xmit_osdep_c_:1): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_recv_c_, _drv_emerg_, ("2: mp_query_drv_var(_module_rtl871x_recv_c_:2): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_recv_osdep_c_, _drv_emerg_, ("3: mp_query_drv_var(_module_recv_osdep_c_:3): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_mlme_c_, _drv_emerg_, ("4: mp_query_drv_var(_module_rtl871x_mlme_c_:4): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_mlme_osdep_c_, _drv_emerg_, (" 5:mp_query_drv_var(_module_mlme_osdep_c_:5): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_emerg_, ("6: mp_query_drv_var(_module_rtl871x_sta_mgt_c_:6): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_cmd_c_, _drv_emerg_, ("7: mp_query_drv_var(_module_rtl871x_cmd_c_:7): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_cmd_osdep_c_, _drv_emerg_, ("8: mp_query_drv_var(_module_cmd_osdep_c_:8): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_io_c_, _drv_emerg_, ("9: mp_query_drv_var(_module_rtl871x_io_c_:9): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_io_osdep_c_, _drv_emerg_, ("10: mp_query_drv_var(_module_io_osdep_c_:10): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_os_intfs_c_, _drv_emerg_, ("11: mp_query_drv_var(_module_os_intfs_c_:11): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_security_c_, _drv_emerg_, ("12: mp_query_drv_var(_module_rtl871x_security_c_:12): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_eeprom_c_, _drv_emerg_, ("13: mp_query_drv_var(_module_rtl871x_eeprom_c_:13): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hal_init_c_, _drv_emerg_, ("14: mp_query_drv_var(_module_hal_init_c_:14): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_hal_init_c_, _drv_emerg_, ("15: mp_query_drv_var(_module_hci_hal_init_c_:15): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_emerg_, ("16: mp_query_drv_var(_module_rtl871x_ioctl_c_:16): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_emerg_, ("17: mp_query_drv_var(_module_rtl871x_ioctl_set_c_:17): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_ioctl_query_c_, _drv_emerg_, ("18: mp_query_drv_var(_module_rtl871x_ioctl_query_c_:18): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_emerg_, ("19: mp_query_drv_var(_module_rtl871x_pwrctrl_c_:19): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_intfs_c_, _drv_emerg_, ("20: mp_query_drv_var(_module_hci_intfs_c_:20): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_ops_c_, _drv_emerg_, ("21: mp_query_drv_var(_module_hci_ops_c_:21): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_osdep_service_c_, _drv_emerg_, ("22: mp_query_drv_var(_module_osdep_service_c_:22): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_mp_, _drv_emerg_, ("23: mp_query_drv_var(_module_mp_:23): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_ops_os_c_, _drv_emerg_, ("24: mp_query_drv_var(_module_hci_ops_os_c_:24): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + var=(u32)(GlobalDebugComponents); + //GlobalDebugComponents=padapter->registrypriv.dbg_component; + RT_TRACE(0xffffffff, _drv_emerg_, (" ==mp_query_drv_var(_module_mp_): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + + } + } + else{ + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) >110\n",offset)); + } +#endif +#endif + + return var; +#else + return 0; +#endif +} + +NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + DR_VARIABLE_STRUCT *pdrv_var; + + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = sizeof(DR_VARIABLE_STRUCT); + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Query Information, OID_RT_PRO_QUERY_DR_VARIABLE\n")); + + pdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + pdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset, pdrv_var->variable); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_query_dr_variable_hdl: offset=0x%x valule=0x%x\n", + pdrv_var->offset, pdrv_var->variable)); + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + RT_TRACE(_module_mp_, _drv_err_, ("oid_rt_pro_rx_packet_type_hdl...................\n")); +#if 0 + + if (poid_par_priv->information_buf_len < sizeof (UCHAR)) { + status = NDIS_STATUS_INVALID_LENGTH; + *poid_par_priv->bytes_needed = sizeof(UCHAR); + return status; + } + + if (poid_par_priv->type_of_oid == SET_OID) { + Adapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf; + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n",\ + Adapter->mppriv.rx_with_status)); + + //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); + //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n", + Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\ + Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5])); + + } + else { + *(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n", \ + Adapter->mppriv.rx_with_status)); + + //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); + //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n", + Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\ + Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5])); + } +#endif + + return NDIS_STATUS_SUCCESS; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + PEFUSE_ACCESS_STRUCT pefuse; + u8 *data; + u16 addr = 0, cnts = 0, max_available_size = 0; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(EFUSE_ACCESS_STRUCT)) + return NDIS_STATUS_INVALID_LENGTH; + + pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; + addr = pefuse->start_addr; + cnts = pefuse->cnts; + data = pefuse->data; + + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_read_efuse_hd: buf_len=%ld addr=%d cnts=%d\n", + poid_par_priv->information_buf_len, addr, cnts)); + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); + + if ((addr + cnts) > max_available_size) { + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: parameter error!\n")); + return NDIS_STATUS_NOT_ACCEPTED; + } + + _irqlevel_changed_(&oldirql, LOWER); + if (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) { + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: rtw_efuse_access FAIL!\n")); + status = NDIS_STATUS_FAILURE; + } else + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ + + _irqL oldirql; + PEFUSE_ACCESS_STRUCT pefuse; + u8 *data; + u16 addr = 0, cnts = 0, max_available_size = 0; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; + addr = pefuse->start_addr; + cnts = pefuse->cnts; + data = pefuse->data; + + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_write_efuse_hdl: buf_len=%ld addr=0x%04x cnts=%d\n", + poid_par_priv->information_buf_len, addr, cnts)); + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); + + if ((addr + cnts) > max_available_size) { + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_write_efuse_hdl: parameter error")); + return NDIS_STATUS_NOT_ACCEPTED; + } + + _irqlevel_changed_(&oldirql, LOWER); + if (rtw_efuse_access(Adapter, _TRUE, addr, cnts, data) == _FAIL) + status = NDIS_STATUS_FAILURE; + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + PPGPKT_STRUCT ppgpkt; + u8 tmpidx; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + +// RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_rw_efuse_pgpkt_hdl\n")); + + *poid_par_priv->bytes_rw = 0; + + if (poid_par_priv->information_buf_len < sizeof(PGPKT_STRUCT)) + return NDIS_STATUS_INVALID_LENGTH; + + ppgpkt = (PPGPKT_STRUCT)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + + if (poid_par_priv->type_of_oid == QUERY_OID) + { + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_rw_efuse_pgpkt_hdl: Read offset=0x%x\n",\ + ppgpkt->offset)); + + Efuse_PowerSwitch(Adapter, _FALSE, _TRUE); + if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE) + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + else + status = NDIS_STATUS_FAILURE; + Efuse_PowerSwitch(Adapter, _FALSE, _FALSE); + } else { + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_rw_efuse_pgpkt_hdl: Write offset=0x%x word_en=0x%x\n",\ + ppgpkt->offset, ppgpkt->word_en)); + + Efuse_PowerSwitch(Adapter, _TRUE, _TRUE); + if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE) + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + else + status = NDIS_STATUS_FAILURE; + Efuse_PowerSwitch(Adapter, _TRUE, _FALSE); + } + + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_pro_rw_efuse_pgpkt_hdl: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u16 size; + u8 ret; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len information_buf = size; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else + status = NDIS_STATUS_FAILURE; + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + u16 max_size; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + *(u32*)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_get_efuse_max_size_hdl: size=%d status=0x%08X\n", + *(int*)poid_par_priv->information_buf, status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_efuse_hdl\n")); + + if (poid_par_priv->type_of_oid == QUERY_OID) + status = oid_rt_pro_read_efuse_hdl(poid_par_priv); + else + status = oid_rt_pro_write_efuse_hdl(poid_par_priv); + + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_efuse_hdl: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u8 *data; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + u16 mapLen=0; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_efuse_map_hdl\n")); + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + *poid_par_priv->bytes_rw = 0; + + if (poid_par_priv->information_buf_len < mapLen) + return NDIS_STATUS_INVALID_LENGTH; + + data = (u8*)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + + if (poid_par_priv->type_of_oid == QUERY_OID) + { + RT_TRACE(_module_mp_, _drv_info_, + ("oid_rt_pro_efuse_map_hdl: READ\n")); + + if (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS) + *poid_par_priv->bytes_rw = mapLen; + else { + RT_TRACE(_module_mp_, _drv_err_, + ("oid_rt_pro_efuse_map_hdl: READ fail\n")); + status = NDIS_STATUS_FAILURE; + } + } else { + // SET_OID + RT_TRACE(_module_mp_, _drv_info_, + ("oid_rt_pro_efuse_map_hdl: WRITE\n")); + + if (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS) + *poid_par_priv->bytes_rw = mapLen; + else { + RT_TRACE(_module_mp_, _drv_err_, + ("oid_rt_pro_efuse_map_hdl: WRITE fail\n")); + status = NDIS_STATUS_FAILURE; + } + } + + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_pro_efuse_map_hdl: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + + u32 crystal_cap = 0; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len information_buf);//4 + if (crystal_cap > 0xf) + return NDIS_STATUS_NOT_ACCEPTED; + + Adapter->mppriv.curr_crystalcap = crystal_cap; + + _irqlevel_changed_(&oldirql,LOWER); + SetCrystalCap(Adapter); + _irqlevel_changed_(&oldirql,RAISE); + +_func_exit_; + +#endif + return status; +} + +NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + u8 rx_pkt_type; + u32 rcr_val32; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_set_rx_packet_type_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + rx_pkt_type = *((u8*)poid_par_priv->information_buf);//4 + + RT_TRACE(_module_mp_, _drv_info_, ("rx_pkt_type: %x\n",rx_pkt_type )); +#if 0 + _irqlevel_changed_(&oldirql, LOWER); +#if 0 + rcr_val8 = rtw_read8(Adapter, 0x10250048);//RCR + rcr_val8 &= ~(RCR_AB|RCR_AM|RCR_APM|RCR_AAP); + + if(rx_pkt_type == RX_PKT_BROADCAST){ + rcr_val8 |= (RCR_AB | RCR_ACRC32 ); + } + else if(rx_pkt_type == RX_PKT_DEST_ADDR){ + rcr_val8 |= (RCR_AAP| RCR_AM |RCR_ACRC32); + } + else if(rx_pkt_type == RX_PKT_PHY_MATCH){ + rcr_val8 |= (RCR_APM|RCR_ACRC32); + } + else{ + rcr_val8 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); + } + rtw_write8(Adapter, 0x10250048,rcr_val8); +#else + rcr_val32 = rtw_read32(Adapter, RCR);//RCR = 0x10250048 + rcr_val32 &= ~(RCR_CBSSID|RCR_AB|RCR_AM|RCR_APM|RCR_AAP); +#if 0 + if(rx_pkt_type == RX_PKT_BROADCAST){ + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); + } + else if(rx_pkt_type == RX_PKT_DEST_ADDR){ + //rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32); + rcr_val32 |= (RCR_CBSSID|RCR_APM|RCR_ACRC32); + } + else if(rx_pkt_type == RX_PKT_PHY_MATCH){ + rcr_val32 |= (RCR_APM|RCR_ACRC32); + //rcr_val32 |= (RCR_AAP|RCR_ACRC32); + } + else{ + rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); + } +#else + switch (rx_pkt_type) + { + case RX_PKT_BROADCAST : + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); + break; + case RX_PKT_DEST_ADDR : + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); + break; + case RX_PKT_PHY_MATCH: + rcr_val32 |= (RCR_APM|RCR_ACRC32); + break; + default: + rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); + break; + } + + if (rx_pkt_type == RX_PKT_DEST_ADDR) { + Adapter->mppriv.check_mp_pkt = 1; + } else { + Adapter->mppriv.check_mp_pkt = 0; + } +#endif + rtw_write32(Adapter, RCR, rcr_val32); + +#endif + _irqlevel_changed_(&oldirql, RAISE); +#endif +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + u32 txagc; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + txagc = *(u32*)poid_par_priv->information_buf; + RT_TRACE(_module_mp_, _drv_info_, + ("oid_rt_pro_set_tx_agc_offset_hdl: 0x%08x\n", txagc)); + + _irqlevel_changed_(&oldirql, LOWER); + SetTxAGCOffset(Adapter, txagc); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} + +NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + struct mp_priv *pmppriv = &Adapter->mppriv; + u32 type; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len information_buf; + + if (_LOOPBOOK_MODE_ == type) { + pmppriv->mode = type; + set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc + RT_TRACE(_module_mp_, _drv_info_, ("test mode change to loopback mode:0x%08x.\n", get_fwstate(pmlmepriv))); + } else if (_2MAC_MODE_ == type){ + pmppriv->mode = type; + _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE); + RT_TRACE(_module_mp_, _drv_info_, ("test mode change to 2mac mode:0x%08x.\n", get_fwstate(pmlmepriv))); + } else + status = NDIS_STATUS_NOT_ACCEPTED; + +_func_exit_; + + return status; +#else + return 0; +#endif +} + +unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) +{ + PMP_XMIT_PARM pparm; + PADAPTER padapter; + struct mp_priv *pmp_priv; + struct pkt_attrib *pattrib; + + RT_TRACE(_module_mp_, _drv_notice_, ("+%s\n", __func__)); + + pparm = (PMP_XMIT_PARM)poid_par_priv->information_buf; + padapter = (PADAPTER)poid_par_priv->adapter_context; + pmp_priv = &padapter->mppriv; + + if (poid_par_priv->type_of_oid == QUERY_OID) { + pparm->enable = !pmp_priv->tx.stop; + pparm->count = pmp_priv->tx.sended; + } else { + if (pparm->enable == 0) { + pmp_priv->tx.stop = 1; + } else if (pmp_priv->tx.stop == 1) { + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = pparm->count; + pmp_priv->tx.payload = pparm->payload_type; + pattrib = &pmp_priv->tx.attrib; + pattrib->pktlen = pparm->length; + _rtw_memcpy(pattrib->dst, pparm->da, ETH_ALEN); + SetPacketTx(padapter); + } else + return NDIS_STATUS_FAILURE; + } + + return NDIS_STATUS_SUCCESS; +} + +#if 0 +unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) +{ + unsigned char *pframe, *pmp_pkt; + struct ethhdr *pethhdr; + struct pkt_attrib *pattrib; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + int llc_sz, payload_len; + struct mp_xmit_frame *pxframe= NULL; + struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet*)param; + u8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55}; + +// DBG_8192C("+mp_ioctl_xmit_packet_hdl\n"); + + pxframe = alloc_mp_xmitframe(&padapter->mppriv); + if (pxframe == NULL) + { + DEBUG_ERR(("Can't alloc pmpframe %d:%s\n", __LINE__, __FILE__)); + return -1; + } + + //mp_xmit_pkt + payload_len = pmp_xmitpkt->len - 14; + pmp_pkt = (unsigned char*)pmp_xmitpkt->mem; + pethhdr = (struct ethhdr *)pmp_pkt; + + //DBG_8192C("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem); + + //DBG_8192C("pxframe=0x%x\n", (void*)pxframe); + //DBG_8192C("pxframe->mem=0x%x\n", (void*)pxframe->mem); + + //update attribute + pattrib = &pxframe->attrib; + memset((u8 *)(pattrib), 0, sizeof (struct pkt_attrib)); + pattrib->pktlen = pmp_xmitpkt->len; + pattrib->ether_type = ntohs(pethhdr->h_proto); + pattrib->hdrlen = 24; + pattrib->nr_frags = 1; + pattrib->priority = 0; +#ifndef CONFIG_MP_LINUX + if(IS_MCAST(pethhdr->h_dest)) + pattrib->mac_id = 4; + else + pattrib->mac_id = 5; +#else + pattrib->mac_id = 5; +#endif + + // + memset(pxframe->mem, 0 , WLANHDR_OFFSET); + pframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET; + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + SetFrameSubType(pframe, WIFI_DATA); + + _rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr3, addr3, ETH_ALEN); + + pwlanhdr->seq_ctl = 0; + pframe += pattrib->hdrlen; + + llc_sz= rtw_put_snap(pframe, pattrib->ether_type); + pframe += llc_sz; + + _rtw_memcpy(pframe, (void*)(pmp_pkt+14), payload_len); + + pattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len; + + DEBUG_INFO(("issuing mp_xmit_frame, tx_len=%d, ether_type=0x%x\n", pattrib->last_txcmdsz, pattrib->ether_type)); + xmit_mp_frame(padapter, pxframe); + + return _SUCCESS; +} +#endif +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + _irqL oldirql; + u8 bpwrup; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + RT_TRACE(_module_mp_, _drv_info_, + ("\n ===> Setoid_rt_set_power_down_hdl.\n")); + + _irqlevel_changed_(&oldirql, LOWER); + + bpwrup = *(u8 *)poid_par_priv->information_buf; + //CALL the power_down function +#ifdef PLATFORM_LINUX +#ifdef CONFIG_SDIO_HCI + dev_power_down(Adapter,bpwrup); +#endif +#endif + _irqlevel_changed_(&oldirql, RAISE); + + //DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER. + // Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); +// _irqL oldirql; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if (poid_par_priv->information_buf_len < sizeof(u32)) { + status = NDIS_STATUS_INVALID_LENGTH; + return status; + } + + RT_TRACE(_module_mp_, _drv_info_, + ("\n ===> oid_rt_get_power_mode_hdl.\n")); + +// _irqlevel_changed_(&oldirql, LOWER); + *(int*)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +// _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_p2p.c b/drivers/net/wireless/rtl8192c/core/rtw_p2p.c new file mode 100755 index 000000000000..22a64470dc73 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_p2p.c @@ -0,0 +1,1726 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_P2P_C_ + +#include +#include +#include + +#ifdef CONFIG_P2P + + +static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + _list *phead, *plist; + u32 len=0; + u16 attr_len = 0; + u8 tmplen, *pdata_attr, *pstart, *pcur; + struct sta_info *psta = NULL; + _adapter *padapter = pwdinfo->padapter; + struct sta_priv *pstapriv = &padapter->stapriv; + + DBG_871X("%s\n", __FUNCTION__); + + pdata_attr = rtw_zmalloc(MAX_P2P_IE_LEN); + + pstart = pdata_attr; + pcur = pdata_attr; + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //look up sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + + if(psta->is_p2p_device) + { + tmplen = 0; + + pcur++; + + //P2P device address + _rtw_memcpy(pcur, psta->dev_addr, ETH_ALEN); + pcur += ETH_ALEN; + + //P2P interface address + _rtw_memcpy(pcur, psta->hwaddr, ETH_ALEN); + pcur += ETH_ALEN; + + *pcur = psta->dev_cap; + pcur++; + + //*(u16*)(pcur) = cpu_to_be16(psta->config_methods); + RTW_PUT_BE16(pcur, psta->config_methods); + pcur += 2; + + _rtw_memcpy(pcur, psta->primary_dev_type, 8); + pcur += 8; + + *pcur = psta->num_of_secdev_type; + pcur++; + + _rtw_memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8); + pcur += psta->num_of_secdev_type*8; + + if(psta->dev_name_len>0) + { + //*(u16*)(pcur) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + RTW_PUT_BE16(pcur, WPS_ATTR_DEVICE_NAME); + pcur += 2; + + //*(u16*)(pcur) = cpu_to_be16( psta->dev_name_len ); + RTW_PUT_BE16(pcur, psta->dev_name_len); + pcur += 2; + + _rtw_memcpy(pcur, psta->dev_name, psta->dev_name_len); + pcur += psta->dev_name_len; + } + + + tmplen = (u8)(pcur-pstart); + + *pstart = (tmplen-1); + + attr_len += tmplen; + + //pstart += tmplen; + pstart = pcur; + + } + + + } + + if(attr_len>0) + { + len = rtw_set_p2p_attr_content(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr); + } + + rtw_mfree(pdata_attr, MAX_P2P_IE_LEN); + + return len; + +} + +static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + _adapter *padapter = pwdinfo->padapter; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = WLAN_CATEGORY_P2P;//P2P action frame + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_DISC_REQUEST; + u8 dialogToken=0; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //Build P2P action frame header + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + //there is no IE in this P2P action frame + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + _adapter *padapter = pwdinfo->padapter; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_DEVDISC_RESP; + u8 p2pie[8] = { 0x00 }; + u32 p2pielen = 0; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->device_addr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //Build P2P public action frame header + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + + //Build P2P IE + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // P2P_ATTR_STATUS + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method) +{ + _adapter *padapter = pwdinfo->padapter; + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = frame_body[7]; // The Dialog Token of provisioning discovery request frame. + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_RESP; + u8 wpsie[ 100 ] = { 0x00 }; + u8 wpsielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + wpsielen = 0; + // WPS OUI + //*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(wpsie, WPSOUI); + wpsielen += 4; + +#if 0 + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 +#endif + + // Config Method + // Type: + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD); + wpsielen += 2; + + // Length: + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + RTW_PUT_BE16(wpsie + wpsielen, 0x0002); + wpsielen += 2; + + // Value: + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method ); + RTW_PUT_BE16(wpsie + wpsielen, config_method); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + _adapter *padapter = pwdinfo->padapter; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = WLAN_CATEGORY_P2P;//P2P action frame + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PRESENCE_RESPONSE; + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u8 noa_attr_content[32] = { 0x00 }; + u32 p2pielen = 0; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //Build P2P action frame header + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + + //Add P2P IE header + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + //Add Status attribute in P2P IE + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); + + //Add NoA attribute in P2P IE + noa_attr_content[0] = 0x1;//index + noa_attr_content[1] = 0x0;//CTWindow and OppPS Parameters + + //todo: Notice of Absence Descriptor(s) + + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content); + + + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &(pattrib->pktlen)); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u16 capability=0; + u32 len=0, p2pielen = 0; + + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + + // According to the P2P Specification, the beacon frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. P2P Device ID + // 3. Notice of Absence ( NOA ) + + // P2P Capability ATTR + // Type: + // Length: + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + // Group Capability Bitmap, 1 byte + capability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY; + capability |= ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8); + if(pwdinfo->p2p_state == P2P_STATE_PROVISIONING_ING) + capability |= (P2P_GRPCAP_GROUP_FORMATION<<8); + + capability = cpu_to_le16(capability); + + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability); + + + // P2P Device ID ATTR + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr); + + + // Notice of Absence ATTR + // Type: + // Length: + // Value: + + //go_add_noa_attr(pwdinfo); + + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + + return len; + +} + +u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 len=0, p2pielen = 0; + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20100907 + // According to the P2P Specification, the probe response frame should contain 5 P2P attributes + // 1. P2P Capability + // 2. Extended Listen Timing + // 3. Notice of Absence ( NOA ) ( Only GO needs this ) + // 4. Device Info + // 5. Group Info ( Only GO need this ) + + // P2P Capability ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + RTW_PUT_LE16(p2pie + p2pielen, 0x0002); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY; + + // Group Capability Bitmap, 1 byte + if(pwdinfo->role == P2P_ROLE_GO) + { + p2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS); + + if(pwdinfo->p2p_state == P2P_STATE_PROVISIONING_ING) + p2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION; + + p2pielen++; + } + else if ( pwdinfo->role == P2P_ROLE_DEVICE ) + { + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + } + + // Extended Listen Timing ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + RTW_PUT_LE16(p2pie + p2pielen, 0x0004); + p2pielen += 2; + + // Value: + // Availability Period + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); + p2pielen += 2; + + // Availability Interval + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); + p2pielen += 2; + + + // Notice of Absence ATTR + // Type: + // Length: + // Value: + if(pwdinfo->role == P2P_ROLE_GO) + { + //go_add_noa_attr(pwdinfo); + } + + // Device Info ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm); + p2pielen += 2; + + // Primary Device Type + // Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_RTK_WIDI); + p2pielen += 2; + + // OUI + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); + p2pielen += 4; + + // Sub Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_RTK_DMP); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); + p2pielen += 2; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + + // Group Info ATTR + // Type: + // Length: + // Value: + if(pwdinfo->role == P2P_ROLE_GO) + { + p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen); + } + + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + + return len; + +} + +u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr ) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 len=0, p2pielen = 0; + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110301 + // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. Device Info + // 3. Group ID ( When joining an operating P2P Group ) + + // P2P Capability ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + RTW_PUT_LE16(p2pie + p2pielen, 0x0002); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + + // Device Info ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) + { + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_PBC); + } + else + { + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_DISPLAY); + } + + p2pielen += 2; + + // Primary Device Type + // Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_RTK_WIDI); + p2pielen += 2; + + // OUI + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); + p2pielen += 4; + + // Sub Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_RTK_DMP); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); + p2pielen += 2; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + if ( pwdinfo->role == P2P_ROLE_CLIENT ) + { + // Added by Albert 2011/05/19 + // In this case, the pdev_raddr is the device address of the group owner. + + // P2P Group ID ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + ussidlen ); + RTW_PUT_LE16(p2pie + p2pielen, ETH_ALEN + ussidlen); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pdev_raddr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + _rtw_memcpy( p2pie + p2pielen, pssid, ussidlen ); + p2pielen += ussidlen; + + } + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + + return len; + +} + + +u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 len=0, p2pielen = 0; + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // According to the P2P Specification, the Association response frame should contain 2 P2P attributes + // 1. Status + // 2. Extended Listen Timing (optional) + + + // Status ATTR + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code); + + + // Extended Listen Timing ATTR + // Type: + // Length: + // Value: + + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + return len; + +} + +u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u32 len=0; + + return len; +} + +u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + u8 *p; + u32 ret=_FALSE; + u8 p2pie[ MAX_P2P_IE_LEN ] = { 0xFF }; + u32 p2pielen = 0; + int ssid_len=0, rate_cnt = 0; + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt, + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + + if ( rate_cnt <= 4 ) + { + int i, g_rate =0; + + for( i = 0; i < rate_cnt; i++ ) + { + if ( ( ( *( p + 2 + i ) & 0xff ) != 0x02 ) && + ( ( *( p + 2 + i ) & 0xff ) != 0x04 ) && + ( ( *( p + 2 + i ) & 0xff ) != 0x0B ) && + ( ( *( p + 2 + i ) & 0xff ) != 0x16 ) ) + { + g_rate = 1; + } + } + + if ( g_rate == 0 ) + { + // There is no OFDM rate included in SupportedRates IE of this probe request frame + // The driver should response this probe request. + return ret; + } + } + else + { + // rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. + // We should proceed the following check for this probe request. + } + + // Added comments by Albert 20100906 + // There are several items we should check here. + // 1. This probe request frame must contain the P2P IE. (Done) + // 2. This probe request frame must contain the wildcard SSID. (Done) + // 3. Wildcard BSSID. (Todo) + // 4. Destination Address. ( Done in mgt_dispatcher function ) + // 5. Requested Device Type in WSC IE. (Todo) + // 6. Device ID attribute in P2P IE. (Todo) + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len, + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + + if((pwdinfo->role == P2P_ROLE_DEVICE) || (pwdinfo->role == P2P_ROLE_GO)) + { + if(rtw_get_p2p_ie( pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_ , len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_ , p2pie, &p2pielen)) + { + if ( (p != NULL) && _rtw_memcmp( ( void * ) ( p+2 ), ( void * ) pwdinfo->p2p_wildcard_ssid , 7 )) + { + //todo: + //Check Requested Device Type attributes in WSC IE. + //Check Device ID attribute in P2P IE + + ret = _TRUE; + } + } + else + { + //non -p2p device + } + + } + + + return ret; + +} + +u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *p2p_ie, uint p2p_ielen, struct sta_info *psta) +{ + u8 status_code = P2P_STATUS_SUCCESS; + u8 *pbuf, *pattr_content=NULL; + u32 attr_contentlen = 0; + u16 cap_attr=0; + + if(pwdinfo->role != P2P_ROLE_GO) + return P2P_STATUS_FAIL_REQUEST_UNABLE; + + //Check P2P Capability ATTR + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen)==_FALSE) + return P2P_STATUS_FAIL_INVALID_PARAM; + + cap_attr = le16_to_cpu(cap_attr); + psta->dev_cap = cap_attr&0xff; + + + //Check Extended Listen Timing ATTR + + + //Check P2P Device Info ATTR + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen)==_TRUE) + { + pattr_content = pbuf = rtw_zmalloc(attr_contentlen); + if(pattr_content) + { + u8 num_of_secdev_type; + u16 dev_name_len; + + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO , pattr_content, (uint*)&attr_contentlen); + + _rtw_memcpy(psta->dev_addr, pattr_content, ETH_ALEN);//P2P Device Address + + pattr_content += ETH_ALEN; + + _rtw_memcpy(&psta->config_methods, pattr_content, 2);//Config Methods + psta->config_methods = be16_to_cpu(psta->config_methods); + + pattr_content += 2; + + _rtw_memcpy(psta->primary_dev_type, pattr_content, 8); + + pattr_content += 8; + + num_of_secdev_type = *pattr_content; + pattr_content += 1; + + if(num_of_secdev_type==0) + { + psta->num_of_secdev_type = 0; + } + else + { + u32 len; + + psta->num_of_secdev_type = num_of_secdev_type; + + len = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8); + + _rtw_memcpy(psta->secdev_types_list, pattr_content, len); + + pattr_content += (num_of_secdev_type*8); + } + + + //dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8); + psta->dev_name_len=0; + if(WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content)) + { + dev_name_len = be16_to_cpu(*(u16*)(pattr_content+2)); + + psta->dev_name_len = (sizeof(psta->dev_name)dev_name):dev_name_len; + + _rtw_memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len); + } + + rtw_mfree(pbuf, attr_contentlen); + + } + + } + else + { + status_code = P2P_STATUS_FAIL_INVALID_PARAM; + } + + return status_code; + +} + +u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + u8 *frame_body; + u8 status, dialogToken; + struct sta_info *psta = NULL; + _adapter *padapter = pwdinfo->padapter; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 p2p_ie[ MAX_P2P_IE_LEN ] = { 0xFF }; + u32 p2p_ielen = 0; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + dialogToken = frame_body[7]; + status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; + + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + u8 groupid[ 38 ] = { 0x00 }; + u8 dev_addr[ETH_ALEN] = { 0x00 }; + u32 attr_contentlen = 0; + + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) + { + if(_rtw_memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) && + _rtw_memcmp(pwdinfo->p2p_group_ssid, groupid+ETH_ALEN, pwdinfo->p2p_group_ssid_len)) + { + attr_contentlen=0; + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen)) + { + _list *phead, *plist; + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //look up sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + if(psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) && + _rtw_memcmp(psta->dev_addr, dev_addr, ETH_ALEN)) + { + + //issue GO Discoverability Request + issue_group_disc_req(pwdinfo, psta->hwaddr); + + status = P2P_STATUS_SUCCESS; + + break; + } + else + { + status = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + + } + + } + else + { + status = P2P_STATUS_FAIL_INVALID_PARAM; + } + + } + else + { + status = P2P_STATUS_FAIL_INVALID_PARAM; + } + + } + + } + + + //issue Device Discoverability Response + issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); + + + return (status==P2P_STATUS_SUCCESS) ? _TRUE:_FALSE; + +} + +u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + return _TRUE; +} + +u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u8 *frame_body; + u8 wpsie[255] = { 0x00 }; + uint wps_ielen = 0, attr_contentlen = 0; + u16 uconfig_method = 0; + + + frame_body = (pframe + sizeof(struct ieee80211_hdr_3addr)); + + if ( rtw_get_wps_ie_p2p( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wps_ielen) ) + { + if ( rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_CONF_METHOD , ( u8* ) &uconfig_method, &attr_contentlen) ) + { + uconfig_method = be16_to_cpu( uconfig_method ); + switch( uconfig_method ) + { + case WPS_CM_DISPLYA: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 ); + break; + } + case WPS_CM_LABEL: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "lab", 3 ); + break; + } + case WPS_CM_PUSH_BUTTON: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 ); + break; + } + case WPS_CM_KEYPAD: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 ); + break; + } + } + issue_p2p_provision_resp( pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method); + } + } + DBG_8192C( "[%s] config method = %s\n", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req ); + return _TRUE; + +} + +u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe) +{ + + return _TRUE; +} + + + +u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u8 result = P2P_STATUS_SUCCESS; + u32 p2p_ielen, wps_ielen; + u8 p2p_ie[ 255 ]; + + if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO ) + { + result = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + return( result ); + } + + if ( rtw_get_wps_ie_p2p( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen) ) + { + + } + else + { + DBG_8192C( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + return( result ); + } + + if ( rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + if ( result != P2P_STATUS_SUCCESS ) + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + else + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_ING; + } + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen); + DBG_8192C( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); + pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. + + if ( result == P2P_STATUS_SUCCESS ) + { + if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) + { + // Try to match the tie breaker value + if ( pwdinfo->intent == P2P_MAX_INTENT ) + { + pwdinfo->role = P2P_ROLE_DEVICE; + result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; + } + else + { + if ( attr_content & 0x01 ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_GO; + } + } + } + else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->role = P2P_ROLE_GO; + } + else + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + } + + attr_contentlen = 0; + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ); + + if ( attr_contentlen != ETH_ALEN ) + { + _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); + } + } + else + { + DBG_8192C( "[%s] P2P IE not Found!!\n", __FUNCTION__ ); + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + + return( result ); +} + +u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u8 result = P2P_STATUS_SUCCESS; + u32 p2p_ielen, wps_ielen; + u8 p2p_ie[ 255 ]; + + + // Be able to know which one is the P2P GO and which one is P2P client. + + if ( rtw_get_wps_ie_p2p( pframe+ _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen) ) + { + + } + else + { + DBG_8192C( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + + if ( rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + if ( attr_contentlen == 1 ) + { + uint ch_cnt = 0; + u8 ch_content[50] = { 0x00 }; + + DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); + if ( attr_content == P2P_STATUS_SUCCESS ) + { + + attr_contentlen = 0; + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ); + + if ( attr_contentlen != ETH_ALEN ) + { + _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); + } + + attr_content = 0x00; + attr_contentlen = 0; + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen); + DBG_8192C( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); + pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. + + if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) + { + // Try to match the tie breaker value + if ( pwdinfo->intent == P2P_MAX_INTENT ) + { + pwdinfo->role = P2P_ROLE_DEVICE; + result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + else + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + if ( attr_content & 0x01 ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_GO; + } + } + } + else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + pwdinfo->role = P2P_ROLE_GO; + } + else + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + pwdinfo->role = P2P_ROLE_CLIENT; + } + + if ( pwdinfo->role == P2P_ROLE_CLIENT ) + { + u8 operatingch_info[5] = { 0x00 }; + + attr_contentlen = 0; + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen); + DBG_8192C( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); + pwdinfo->peer_operating_ch = operatingch_info[4]; + } + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + result = attr_content; + } + + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt) ) + { + pwdinfo->channel_cnt = ch_content[ 4 ]; // Number of Channels + _rtw_memcpy( pwdinfo->channel_list, &ch_content[ 5 ], pwdinfo->channel_cnt ); // Channel List + DBG_8192C( "[%s] channel count = %d\n", __FUNCTION__, pwdinfo->channel_cnt ); + } + else + { + DBG_8192C( "[%s] channel list attribute not found!\n", __FUNCTION__); + } + } + else + { + // the length of P2P STATUS ATTRIBUTE is not 1, doesn't match with the P2P specification. + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + } + + return( result ); + +} + +u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u32 p2p_ielen; + u8 p2p_ie[ 255 ]; + u8 result = P2P_STATUS_SUCCESS; + + if ( rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + u8 attr_content = 0x00, operatingch_info[5] = { 0x00 }; + u8 groupid[ 38 ] = { 0x00 }; + u32 attr_contentlen = 0; + + + pwdinfo->negotiation_dialog_token = 1; + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + if ( attr_contentlen == 1 ) + { + DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); + result = attr_content; + + if ( attr_content == P2P_STATUS_SUCCESS ) + { + u8 bcancelled = 0; + + _cancel_timer( &pwdinfo->restore_p2p_state_timer, &bcancelled ); + + // Commented by Albert 20100911 + // Todo: Need to handle the case which both Intents are the same. + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + if ( ( pwdinfo->intent ) > ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->role = P2P_ROLE_GO; + } + else if ( ( pwdinfo->intent ) < ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + // Have to compare the Tie Breaker + if ( pwdinfo->peer_intent & 0x01 ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_GO; + } + } + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen); + DBG_8192C( "[%s] Ssid = %s, ssidlen = %d\n", __FUNCTION__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN]) ); + + attr_contentlen = 0; + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen); + DBG_8192C( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); + pwdinfo->peer_operating_ch = operatingch_info[4]; + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + } + } + + return( result ); +} + +u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + u8 *frame_body; + u8 dialogToken=0; + u8 status = P2P_STATUS_SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + dialogToken = frame_body[6]; + + //todo: check NoA attribute + + issue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); + + return _TRUE; +} + +void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength) +{ + u32 p2p_ielen = 0; + u32 attr_contentlen = 0; + u8 p2p_ie[ MAX_P2P_IE_LEN] = { 0x00 }; + u8 noa_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2 + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + u8 find_p2p = _FALSE, find_p2p_ps = _FALSE; + u8 noa_offset, noa_num, noa_index; + u32 offset, cnt; + +_func_enter_; + + if ( pwdinfo->p2p_state == P2P_STATE_NONE ) + { + return; + } + + cnt = _BEACON_IE_OFFSET_; + while(cnt < IELength) + { + offset = rtw_get_p2p_ie( &IEs[cnt], IELength-cnt, p2p_ie, &p2p_ielen); + + if(offset) + { + find_p2p = _TRUE; + // Get Notice of Absence IE. + if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen)) + { + find_p2p_ps = _TRUE; + noa_index = noa_attr[0]; + + if( (pwdinfo->p2p_ps_enable == _FALSE) || + (noa_index != pwdinfo->noa_index) )// if index change, driver should reconfigure related setting. + { + pwdinfo->noa_index = noa_index; + pwdinfo->opp_ps = noa_attr[1] >> 7; + pwdinfo->ctwindow = noa_attr[1] & 0x7F; + + noa_offset = 2; + noa_num = 0; + // NoA length should be n*(13) + 2 + if(attr_contentlen > 2) + { + while(noa_offset < attr_contentlen) + { + //_rtw_memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); + pwdinfo->noa_count[noa_num] = noa_attr[noa_offset]; + noa_offset += 1; + + _rtw_memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4); + noa_offset += 4; + + _rtw_memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4); + noa_offset += 4; + + _rtw_memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4); + noa_offset += 4; + + noa_num++; + } + } + pwdinfo->noa_num = noa_num; + + if( pwdinfo->opp_ps == 1 ) + { + pwdinfo->p2p_ps_enable = _TRUE; + // driver should wait LPS for entering CTWindow + if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) + { + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); + } + } + else if( pwdinfo->noa_num > 0 ) + { + pwdinfo->p2p_ps_enable = _TRUE; + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); + } + else if( pwdinfo->p2p_ps_enable == _TRUE) + { + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); + } + } + + break; // find target, just break. + } + + cnt += offset; + } + else // No p2p IE. + { + break; + } + } + + if(find_p2p == _TRUE) + { + if( (pwdinfo->p2p_ps_enable == _TRUE) && (find_p2p_ps == _FALSE) ) + { + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); + } + } + +_func_exit_; +} + +void find_phase_handler( _adapter* padapter ) +{ + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + NDIS_802_11_SSID ssid; + _irqL irqL; + u8 _status = 0; + +_func_enter_; + + _rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN ); + ssid.SsidLength = P2P_WILDCARD_SSID_LEN; + + pwdinfo->p2p_state = P2P_STATE_FIND_PHASE_SEARCH; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _status = rtw_sitesurvey_cmd(padapter, &ssid); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + +_func_exit_; +} + +void restore_p2p_state_handler( _adapter* padapter ) +{ + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + pwdinfo->p2p_state = pwdinfo->pre_p2p_state; + if ( pwdinfo->role != P2P_ROLE_CLIENT ) + { + // In the P2P client mode, the driver should not switch back to its listen channel + // because this P2P client should stay at the operating channel of P2P GO. + set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } +_func_exit_; +} + + +void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType) +{ + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + +_func_enter_; + + switch(intCmdType) + { + case P2P_FIND_PHASE_WK: + { + find_phase_handler( padapter ); + break; + } + case P2P_RESTORE_STATE_WK: + { + restore_p2p_state_handler( padapter ); + break; + } + } + +_func_exit_; +} + + + +void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + +_func_enter_; + + // Pre action for p2p state + switch(p2p_ps_state) + { + case P2P_PS_ENABLE: + if( pwdinfo->ctwindow > 0 ) + { + if(pwrpriv->smart_ps != 0) + { + pwrpriv->smart_ps = 0; + DBG_871X("%s(): Enter CTW, change SmartPS\n", __FUNCTION__); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); + } + } + break; + default: + break; + } + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + + // clear P2P SW status + if(p2p_ps_state == P2P_PS_DISABLE) + { + pwdinfo->noa_index = 0; + pwdinfo->ctwindow = 0; + pwdinfo->opp_ps = 0; + pwdinfo->noa_num = 0; + pwdinfo->p2p_ps_enable = _FALSE; + if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) + { + if(pwrpriv->smart_ps == 0) + { + pwrpriv->smart_ps = 2; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); + } + } + } + +_func_exit_; +} + +u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + if ( (pwdinfo->p2p_state == P2P_STATE_NONE) || + ( pwdinfo->p2p_ps == p2p_ps_state ) ) + { + return res; + } + + // driver only perform p2p ps when GO have Opp_Ps or NoA + if( pwdinfo->p2p_ps_enable ) + { + pwdinfo->p2p_ps = p2p_ps_state; + + if(enqueue) + { + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID; + pdrvextra_cmd_parm->type_size = p2p_ps_state; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else + { + p2p_ps_wk_hdl(padapter, p2p_ps_state); + } + } + +exit: + +_func_exit_; + + return res; + +} + +#endif //CONFIG_P2P + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c b/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c new file mode 100755 index 000000000000..5c574e309a4f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c @@ -0,0 +1,1128 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_PWRCTRL_C_ + +#include +#include +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include +#endif + +#ifdef CONFIG_IPS +void ips_enter(_adapter * padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + _enter_pwrlock(&pwrpriv->lock); + + pwrpriv->bips_processing = _TRUE; + + // syn ips_mode with request + pwrpriv->ips_mode = pwrpriv->ips_mode_req; + + pwrpriv->ips_enter_cnts++; + DBG_8192C("==>ips_enter cnts:%d\n",pwrpriv->ips_enter_cnts); + if(rf_off == pwrpriv->change_rfpwrstate ) + { + DBG_8192C("==>power_saving_ctrl_wk_hdl change rf to OFF...LED(0x%08x).... \n\n",rtw_read32(padapter,0x4c)); + + if(pwrpriv->ips_mode == IPS_LEVEL_2) { + u8 rf_type; + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + pwrpriv->bkeepfwalive = ( rf_type == RF_1T1R )? _TRUE : _FALSE;//rtl8192cu cannot support IPS_Level2 ,must debug + } + + rtw_ips_pwr_down(padapter); + pwrpriv->rf_pwrstate = rf_off; + } + pwrpriv->bips_processing = _FALSE; + _exit_pwrlock(&pwrpriv->lock); + +} + +int ips_leave(_adapter * padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + int result = _SUCCESS; + sint keyid; + _enter_pwrlock(&pwrpriv->lock); + if((pwrpriv->rf_pwrstate == rf_off) &&(!pwrpriv->bips_processing)) + { + pwrpriv->change_rfpwrstate = rf_on; + pwrpriv->ips_leave_cnts++; + DBG_8192C("==>ips_leave cnts:%d\n",pwrpriv->ips_leave_cnts); + + result = rtw_ips_pwr_up(padapter); + pwrpriv->bips_processing = _TRUE; + pwrpriv->rf_pwrstate = rf_on; + + if((_WEP40_ == psecuritypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == psecuritypriv->dot11PrivacyAlgrthm)) + { + DBG_8192C("==>%s,channel(%d),processing(%x)\n",__FUNCTION__,padapter->mlmeextpriv.cur_channel,pwrpriv->bips_processing); + set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + for(keyid=0;keyid<4;keyid++){ + if(pmlmepriv->key_mask & BIT(keyid)){ + if(keyid == psecuritypriv->dot11PrivacyKeyIndex) + result=rtw_set_key(padapter,psecuritypriv, keyid, 1); + else + result=rtw_set_key(padapter,psecuritypriv, keyid, 0); + } + } + } + + DBG_8192C("==> ips_leave.....LED(0x%08x)...\n",rtw_read32(padapter,0x4c)); + pwrpriv->bips_processing = _FALSE; + + pwrpriv->bkeepfwalive = _FALSE; + + + } + _exit_pwrlock(&pwrpriv->lock); + return result; +} + + +#endif + +#ifdef CONFIG_AUTOSUSPEND +extern void autosuspend_enter(_adapter* padapter); +extern int autoresume_enter(_adapter* padapter); +#endif +#ifdef SUPPORT_HW_RFOFF_DETECTED +int rtw_hw_suspend(_adapter *padapter ); +int rtw_hw_resume(_adapter *padapter); + +#endif + +#ifdef PLATFORM_LINUX +void rtw_ps_processor(_adapter*padapter) +{ +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); +#endif //CONFIG_P2P + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + int res; + rt_rf_power_state rfpwrstate; + +#ifdef SUPPORT_HW_RFOFF_DETECTED + if(pwrpriv->bips_processing == _TRUE) return; + + //DBG_8192C("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca)); + if(padapter->pwrctrlpriv.bHWPwrPindetect) + { + #ifdef CONFIG_AUTOSUSPEND + if(padapter->registrypriv.usbss_enable) + { + if(pwrpriv->rf_pwrstate == rf_on) + { + if(padapter->net_closed == _TRUE) + pwrpriv->ps_flag = _TRUE; + + rfpwrstate = RfOnOffDetect(padapter); + DBG_8192C("@@@@- #1 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); + if(rfpwrstate!= pwrpriv->rf_pwrstate) + { + if(rfpwrstate == rf_off) + { + pwrpriv->change_rfpwrstate = rf_off; + + pwrpriv->bkeepfwalive = _TRUE; + pwrpriv->brfoffbyhw = _TRUE; + + autosuspend_enter(padapter); + } + } + } + } + else + #endif + { + rfpwrstate = RfOnOffDetect(padapter); + DBG_8192C("@@@@- #2 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); + + if(rfpwrstate!= pwrpriv->rf_pwrstate) + { + if(rfpwrstate == rf_off) + { + pwrpriv->change_rfpwrstate = rf_off; + pwrpriv->brfoffbyhw = _TRUE; + padapter->bCardDisableWOHSM = _TRUE; + rtw_hw_suspend(padapter ); + } + else + { + pwrpriv->change_rfpwrstate = rf_on; + rtw_hw_resume(padapter ); + } + DBG_8192C("current rf_pwrstate(%s)\n",(pwrpriv->rf_pwrstate == rf_off)?"rf_off":"rf_on"); + } + } + pwrpriv->pwr_state_check_cnts ++; + } + +#endif + if( pwrpriv->power_mgnt == PS_MODE_ACTIVE ) return; + + if((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts%4)==0)) + { + if ( (check_fwstate(pmlmepriv, _FW_LINKED|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (padapter->bup == _FALSE) +#ifdef CONFIG_P2P + || (pwdinfo->p2p_state != P2P_STATE_NONE) +#endif //CONFIG_P2P + ) + { + return; + } + + DBG_8192C("==>%s .fw_state(%x)\n",__FUNCTION__,get_fwstate(pmlmepriv)); + pwrpriv->change_rfpwrstate = rf_off; + +#ifdef CONFIG_AUTOSUSPEND + if(padapter->registrypriv.usbss_enable) + { + if(padapter->pwrctrlpriv.bHWPwrPindetect) + pwrpriv->bkeepfwalive = _TRUE; + + if(padapter->net_closed == _TRUE) + pwrpriv->ps_flag = _TRUE; + + padapter->bCardDisableWOHSM = _TRUE; + autosuspend_enter(padapter); + } + else if(padapter->pwrctrlpriv.bHWPwrPindetect) + { + } + else +#endif + { +#ifdef CONFIG_IPS + ips_enter(padapter); +#endif + } + } + + +} + +void pwr_state_check_handler(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); +#endif //CONFIG_P2P + //DBG_871X("%s\n", __FUNCTION__); + +#ifdef SUPPORT_HW_RFOFF_DETECTED + //DBG_8192C("%s...bHWPwrPindetect(%d)\n",__FUNCTION__,padapter->pwrctrlpriv.bHWPwrPindetect); + if(padapter->pwrctrlpriv.bHWPwrPindetect) + { + rtw_ps_cmd(padapter); + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + } + else +#endif + { + //if(padapter->net_closed == _TRUE) return; + //DBG_8192C("==>%s .fw_state(%x)\n", __FUNCTION__, get_fwstate(pmlmepriv)); + if ( (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, _FW_LINKED|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || + (padapter->bup == _FALSE) +#ifdef CONFIG_P2P + || (pwdinfo->p2p_state != P2P_STATE_NONE) +#endif //CONFIG_P2P + ) + { + //other pwr ctrl.... + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + } + else + { + if((pwrpriv->rf_pwrstate == rf_on) &&(_FALSE == pwrpriv->bips_processing)) + { + pwrpriv->change_rfpwrstate = rf_off; + pwrctrlpriv->pwr_state_check_cnts = 0; + DBG_8192C("==>pwr_state_check_handler .fw_state(%x)\n",get_fwstate(pmlmepriv)); + rtw_ps_cmd(padapter); + } + + } + } + + + +} +#endif + + +#ifdef CONFIG_LPS +void rtw_set_rpwm(_adapter * padapter, u8 val8) +{ + u8 rpwm; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + +_func_enter_; + + if(pwrpriv->rpwm == val8){ + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("Already set rpwm [%d] ! \n", val8)); + return; + } + + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)){ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_set_rpwm=> bDriverStopped or bSurpriseRemoved \n")); + return; + } + rpwm = val8 |pwrpriv->tog; + + pwrpriv->rpwm = val8; + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_set_rpwm: value = %x\n", rpwm)); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); + + pwrpriv->tog += 0x80; + +_func_exit_; +} + +u8 PS_RDY_CHECK(_adapter * padapter) +{ + u32 curr_time, delta_time; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + curr_time = rtw_get_current_time(); + + delta_time = curr_time -pwrpriv->DelayLPSLastTimeStamp; + + if(delta_time < LPS_DELAY_TIME) + { + return _FALSE; + } + + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) || + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ) + return _FALSE; + + if(_TRUE == pwrpriv->bInSuspend ) + return _FALSE; + + if( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) ) + { + DBG_8192C("Group handshake still in progress !!!\n"); + return _FALSE; + } + + return _TRUE; +} + +void rtw_set_ps_mode(_adapter * padapter, u8 ps_mode, u8 smart_ps) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); +#endif //CONFIG_P2P + +_func_enter_; + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("========= Power Mode is :%d, Smart_PS = %d\n", ps_mode,smart_ps)); + //DBG_8192C("========= Power Mode is :%d, Smart_PS = %d\n", ps_mode,smart_ps); + + if(ps_mode > PM_Card_Disable) { + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("ps_mode:%d error\n", ps_mode)); + return; + } + + if((pwrpriv->pwr_mode == ps_mode) && + (pwrpriv->smart_ps == smart_ps)){ + return; + } + + //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) + if(ps_mode == PS_MODE_ACTIVE) + { +#ifdef CONFIG_P2P + if(pwdinfo->opp_ps == 0) +#endif //CONFIG_P2P + { + DBG_8192C("rtw_set_ps_mode(): Busy Traffic , Leave 802.11 power save..\n"); + pwrpriv->smart_ps = smart_ps; + pwrpriv->pwr_mode = ps_mode; + rtw_set_rpwm(padapter, PS_STATE_S4); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); + pwrpriv->bFwCurrentInPSMode = _FALSE; + } + } + else + { + if(PS_RDY_CHECK(padapter)) + { + DBG_8192C("rtw_set_ps_mode(): Enter 802.11 power save mode...\n"); + pwrpriv->smart_ps = smart_ps; + pwrpriv->pwr_mode = ps_mode; + pwrpriv->bFwCurrentInPSMode = _TRUE; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); +#ifdef CONFIG_P2P + // Set CTWindow after LPS + if(pwdinfo->opp_ps == 1) + //if(pwdinfo->p2p_ps_enable == _TRUE) + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0); +#endif //CONFIG_P2P + rtw_set_rpwm(padapter, PS_STATE_S2); + } + //else + //{ + // pwrpriv->pwr_mode = PS_MODE_ACTIVE; + //} + } + +_func_exit_; +} + + +// +// Description: +// Enter the leisure power save mode. +// +void LPS_Enter(PADAPTER padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +_func_enter_; + + //DBG_8192C("LeisurePSEnter()...\n"); + + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) || + (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ) + return; + + if(_TRUE == pwrpriv->bInSuspend ) + return ; + + if (pwrpriv->bLeisurePs) + { + // Idle for a while if we connect to AP a while ago. + if(pwrpriv->LpsIdleCount >= 2) // 4 Sec + { + if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) + { + rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, 2); + } + } + else + pwrpriv->LpsIdleCount++; + } + +_func_exit_; +} + + +// +// Description: +// Leave the leisure power save mode. +// +void LPS_Leave(PADAPTER padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +_func_enter_; + + //DBG_8192C("LeisurePSLeave()...\n"); + + if (pwrpriv->bLeisurePs) + { + if(pwrpriv->pwr_mode != PS_MODE_ACTIVE) + { + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0); + } + } + +_func_exit_; +} + +#endif + +// +// Description: Leave all power save mode: LPS, FwLPS, IPS if needed. +// Move code to function by tynli. 2010.03.26. +// +void LeaveAllPowerSaveMode(IN PADAPTER Adapter) +{ + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + u32 LPSLeaveTimeOut = 10000; + //u32 IPSLeaveTimeOut = 10000; + +_func_enter_; + + //DBG_8192C("%s.....\n",__FUNCTION__); + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { //connect +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, 0); +#endif //CONFIG_P2P +#ifdef CONFIG_LPS + //DBG_8192C("==> leave LPS.......\n"); + LPS_Leave(Adapter); + + if (Adapter->pwrctrlpriv.bLeisurePs) + { + BOOLEAN bAwake = _TRUE; + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); + while(!bAwake) + { + rtw_usleep_os(100); + LPSLeaveTimeOut--; + if(LPSLeaveTimeOut <= 0) + { + DBG_8192C("Wait for FW LPS leave too long!!! LPSLeaveTimeOut = %d\n", LPSLeaveTimeOut ); + break; + } + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); + } + } +#endif + } + else + { + if(Adapter->pwrctrlpriv.rf_pwrstate== rf_off) + { + #ifdef CONFIG_AUTOSUSPEND + if(Adapter->registrypriv.usbss_enable) + { + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + usb_disable_autosuspend(Adapter->dvobjpriv.pusbdev); + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) + Adapter->dvobjpriv.pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user + #endif + } + else + #endif + { + /* + #ifdef CONFIG_IPS + if(_FALSE == ips_leave(Adapter)) + { + DBG_8192C("======> ips_leave fail.............\n"); + } + #endif + */ + } + } + } + +_func_exit_; +} + +#ifdef CONFIG_PWRCTRL + +/* +Caller:ISR handler... + +This will be called when CPWM interrupt is up. + +using to update cpwn of drv; and drv willl make a decision to up or down pwr level +*/ +void cpwm_int_hdl(_adapter *padapter, struct reportpwrstate_parm *preportpwrstate) +{ + struct pwrctrl_priv *pwrpriv = &(padapter->pwrctrlpriv); + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + +_func_enter_; + + if(pwrpriv->cpwm_tog == ((preportpwrstate->state)&0x80)){ + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("cpwm_int_hdl : cpwm_tog = %x this time cpwm=0x%x toggle bit didn't change !!!\n",pwrpriv->cpwm_tog ,preportpwrstate->state)); + goto exit; + } + + _enter_pwrlock(&pwrpriv->lock); + + pwrpriv->cpwm = (preportpwrstate->state)&0xf; + + if(pwrpriv->cpwm >= PS_STATE_S2){ + if(pwrpriv->alives & CMD_ALIVE) + _rtw_up_sema(&(pcmdpriv->cmd_queue_sema)); + + if(pwrpriv->alives & XMIT_ALIVE) + _rtw_up_sema(&(pxmitpriv->xmit_sema)); + } + pwrpriv->cpwm_tog= (preportpwrstate->state)&0x80; + _exit_pwrlock(&pwrpriv->lock); +exit: + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("cpwm_int_hdl : cpwm = %x !!!\n",pwrpriv->cpwm)); + +_func_exit_; + +} + + +__inline static void register_task_alive(struct pwrctrl_priv *pwrctrl, uint tag) +{ +_func_enter_; + pwrctrl->alives |= tag; +_func_exit_; +} + +__inline static void unregister_task_alive(struct pwrctrl_priv *pwrctrl, uint tag) +{ +_func_enter_; + + if (pwrctrl->alives & tag) + pwrctrl->alives ^= tag; + +_func_exit_; +} +#endif + +#ifdef CONFIG_RESUME_IN_WORKQUEUE +static void resume_workitem_callback(struct work_struct *work); +#endif //CONFIG_RESUME_IN_WORKQUEUE + +void rtw_init_pwrctrl_priv(_adapter *padapter) +{ + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + +_func_enter_; + +#ifdef PLATFORM_WINDOWS + pwrctrlpriv->pnp_current_pwr_state=NdisDeviceStateD0; +#endif + + _init_pwrlock(&pwrctrlpriv->lock); + pwrctrlpriv->rf_pwrstate = rf_on; + pwrctrlpriv->ips_enter_cnts=0; + pwrctrlpriv->ips_leave_cnts=0; + + pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode; + pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode; + + pwrctrlpriv->pwr_state_check_inverval = 2000; + pwrctrlpriv->pwr_state_check_cnts = 0; + pwrctrlpriv->bInternalAutoSuspend = _FALSE; + pwrctrlpriv->bInSuspend = _FALSE; + pwrctrlpriv->bkeepfwalive = _FALSE; + +#ifdef CONFIG_AUTOSUSPEND +#ifdef SUPPORT_HW_RFOFF_DETECTED + pwrctrlpriv->pwr_state_check_inverval = (pwrctrlpriv->bHWPwrPindetect) ?1000:2000; +#endif +#endif + + pwrctrlpriv->LpsIdleCount = 0; + //pwrctrlpriv->FWCtrlPSMode =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; + pwrctrlpriv->power_mgnt =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; + pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE; + + pwrctrlpriv->bFwCurrentInPSMode = _FALSE; + + pwrctrlpriv->cpwm = PS_STATE_S4; + + pwrctrlpriv->pwr_mode = PS_MODE_ACTIVE; + + + pwrctrlpriv->smart_ps = 0; + + pwrctrlpriv->tog = 0x80; + +#ifdef PLATFORM_LINUX + _init_timer(&(pwrctrlpriv->pwr_state_check_timer), padapter->pnetdev, pwr_state_check_handler, (u8 *)padapter); +#endif + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + _init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL); + pwrctrlpriv->rtw_workqueue = create_singlethread_workqueue("rtw_workqueue"); + #endif //CONFIG_RESUME_IN_WORKQUEUE + + #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) + pwrctrlpriv->early_suspend.suspend = NULL; + rtw_register_early_suspend(pwrctrlpriv); + #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER + + +_func_exit_; + +} + + +void rtw_free_pwrctrl_priv(_adapter *adapter) +{ + struct pwrctrl_priv *pwrctrlpriv = &adapter->pwrctrlpriv; + +_func_enter_; + + //_rtw_memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv)); + + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + if (pwrctrlpriv->rtw_workqueue) { + flush_workqueue(pwrctrlpriv->rtw_workqueue); + destroy_workqueue(pwrctrlpriv->rtw_workqueue); + } + #endif + + + #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) + rtw_unregister_early_suspend(pwrctrlpriv); + #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER + + _free_pwrlock(&pwrctrlpriv->lock); + +_func_exit_; +} + + +/* +Caller: rtw_xmit_thread + +Check if the fw_pwrstate is okay for xmit. +If not (cpwm is less than P1 state), then the sub-routine +will raise the cpwm to be greater than or equal to P1. + +Calling Context: Passive + +Return Value: + +_SUCCESS: rtw_xmit_thread can write fifo/txcmd afterwards. +_FAIL: rtw_xmit_thread can not do anything. +*/ +sint rtw_register_tx_alive(_adapter *padapter) +{ + uint res = _SUCCESS; + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, XMIT_ALIVE); + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_tx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + if(pwrctrl->cpwm < PS_STATE_S2){ + rtw_set_rpwm(padapter, PS_STATE_S3); + res = _FAIL; + } + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /* CONFIG_PWRCTRL */ + + return res; + +} + +/* +Caller: rtw_cmd_thread + +Check if the fw_pwrstate is okay for issuing cmd. +If not (cpwm should be is less than P2 state), then the sub-routine +will raise the cpwm to be greater than or equal to P2. + +Calling Context: Passive + +Return Value: + +_SUCCESS: rtw_cmd_thread can issue cmds to firmware afterwards. +_FAIL: rtw_cmd_thread can not do anything. +*/ +sint rtw_register_cmd_alive(_adapter *padapter) +{ + uint res = _SUCCESS; + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, CMD_ALIVE); + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_cmd_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + if(pwrctrl->cpwm < PS_STATE_S2){ + rtw_set_rpwm(padapter, PS_STATE_S3); + res = _FAIL; + } + + _exit_pwrlock(&pwrctrl->lock); +_func_exit_; +#endif + + return res; +} + + +/* +Caller: rx_isr + +Calling Context: Dispatch/ISR + +Return Value: + +*/ +sint rtw_register_rx_alive(_adapter *padapter) +{ + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, RECV_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_rx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ + + return _SUCCESS; +} + + +/* +Caller: evt_isr or evt_thread + +Calling Context: Dispatch/ISR or Passive + +Return Value: +*/ +sint rtw_register_evt_alive(_adapter *padapter) +{ + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, EVT_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_info_,("rtw_register_evt_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ + + return _SUCCESS; +} + + +/* +Caller: ISR + +If ISR's txdone, +No more pkts for TX, +Then driver shall call this fun. to power down firmware again. +*/ + +void rtw_unregister_tx_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, XMIT_ALIVE); + + if((pwrctrl->cpwm > PS_STATE_S2) && (pwrctrl->pwr_mode > PS_MODE_ACTIVE)){ + if(pwrctrl->alives == 0){ + rtw_set_rpwm(padapter, PS_STATE_S0); + } + } + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_tx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ +} + +/* +Caller: ISR + +If ISR's txdone, +No more pkts for TX, +Then driver shall call this fun. to power down firmware again. +*/ + +void rtw_unregister_cmd_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, CMD_ALIVE); + + if((pwrctrl->cpwm > PS_STATE_S2) && (pwrctrl->pwr_mode > PS_MODE_ACTIVE)){ + if((pwrctrl->alives == 0)&&(check_fwstate(&padapter->mlmepriv, _FW_UNDER_LINKING)!=_TRUE)){ + rtw_set_rpwm(padapter, PS_STATE_S0); + } + } + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_cmd_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ +} + + +/* + +Caller: ISR + +*/ +void rtw_unregister_rx_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, RECV_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_rx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif +} + + +void rtw_unregister_evt_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, EVT_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_evt_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ +} + +#ifdef CONFIG_RESUME_IN_WORKQUEUE +#ifdef CONFIG_USB_HCI +extern int rtw_resume_process(struct usb_interface *pusb_intf); +#endif +static void resume_workitem_callback(struct work_struct *work) +{ + struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, resume_work); + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + + DBG_871X("%s\n",__FUNCTION__); + + #ifdef CONFIG_USB_HCI + rtw_resume_process(adapter->dvobjpriv.pusbintf); + #elif defined(CONFIG_PCI_HCI) + #endif + +} + +void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv) +{ + // accquire system's suspend lock preventing from falliing asleep while resume in workqueue + rtw_lock_suspend(); + + #if 1 + queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work); + #else + _set_workitem(&pwrpriv->resume_work); + #endif +} +#endif //CONFIG_RESUME_IN_WORKQUEUE + +#ifdef CONFIG_HAS_EARLYSUSPEND +#ifdef CONFIG_USB_HCI +extern int rtw_resume_process(struct usb_interface *pusb_intf); +#endif +static void rtw_early_suspend(struct early_suspend *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + DBG_871X("%s\n",__FUNCTION__); + + //jeff: do nothing but set do_late_resume to false + pwrpriv->do_late_resume = _FALSE; +} + +static void rtw_late_resume(struct early_suspend *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + + DBG_871X("%s\n",__FUNCTION__); + if(pwrpriv->do_late_resume) { + #ifdef CONFIG_USB_HCI + rtw_resume_process(adapter->dvobjpriv.pusbintf); + pwrpriv->do_late_resume = _FALSE; + #elif defined(CONFIG_PCI_HCI) + #endif + } +} + +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) +{ + //DBG_871X("%s\n", __FUNCTION__); + + //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit + pwrpriv->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; + pwrpriv->early_suspend.suspend = rtw_early_suspend; + pwrpriv->early_suspend.resume = rtw_late_resume; + register_early_suspend(&pwrpriv->early_suspend); + + +} + +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) +{ + DBG_871X("%s\n", __FUNCTION__); + + if (pwrpriv->early_suspend.suspend) + unregister_early_suspend(&pwrpriv->early_suspend); + + pwrpriv->early_suspend.suspend = NULL; + pwrpriv->early_suspend.resume = NULL; +} +#endif //CONFIG_HAS_EARLYSUSPEND + +#ifdef CONFIG_ANDROID_POWER +#ifdef CONFIG_USB_HCI +extern int rtw_resume_process(struct usb_interface *pusb_intf); +#endif +static void rtw_early_suspend(android_early_suspend_t *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + DBG_871X("%s\n",__FUNCTION__); + + //jeff: do nothing but set do_late_resume to false + pwrpriv->do_late_resume = _FALSE; +} + +static void rtw_late_resume(android_early_suspend_t *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + + DBG_871X("%s\n",__FUNCTION__); + if(pwrpriv->do_late_resume) { + #ifdef CONFIG_USB_HCI + rtw_resume_process(adapter->dvobjpriv.pusbintf); + pwrpriv->do_late_resume = _FALSE; + #elif defined(CONFIG_PCI_HCI) + #endif + } +} + +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) +{ +// DBG_871X("%s\n", __FUNCTION__); + + //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit + pwrpriv->early_suspend.level = ANDROID_EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; + pwrpriv->early_suspend.suspend = rtw_early_suspend; + pwrpriv->early_suspend.resume = rtw_late_resume; + android_register_early_suspend(&pwrpriv->early_suspend); +} + +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) +{ + DBG_871X("%s\n", __FUNCTION__); + + if (pwrpriv->early_suspend.suspend) + android_unregister_early_suspend(&pwrpriv->early_suspend); + + pwrpriv->early_suspend.suspend = NULL; + pwrpriv->early_suspend.resume = NULL; +} +#endif //CONFIG_ANDROID_POWER + +u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val) +{ + u8 bResult = _TRUE; + if(padapter->HalFunc.interface_ps_func) + { + bResult = padapter->HalFunc.interface_ps_func(padapter,efunc_id,val); + } + return bResult; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_recv.c b/drivers/net/wireless/rtl8192c/core/rtw_recv.c new file mode 100755 index 000000000000..4c0ad26c2003 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_recv.c @@ -0,0 +1,4445 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_RECV_C_ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_USB_HCI +#include +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include +#include + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS +static RTW_DECLARE_TIMER_HDL(signal_stat); +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + +void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv) +{ + + +_func_enter_; + + _rtw_memset((u8 *)psta_recvpriv, 0, sizeof (struct sta_recv_priv)); + + _rtw_spinlock_init(&psta_recvpriv->lock); + + //for(i=0; iblk_strms[i]); + + _rtw_init_queue(&psta_recvpriv->defrag_q); + +_func_exit_; + +} + +sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter) +{ + sint i; + + union recv_frame *precvframe; + + sint res=_SUCCESS; + +_func_enter_; + + _rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct recv_priv)); + + _rtw_spinlock_init(&precvpriv->lock); + + _rtw_init_queue(&precvpriv->free_recv_queue); + _rtw_init_queue(&precvpriv->recv_pending_queue); + + precvpriv->adapter = padapter; + + precvpriv->free_recvframe_cnt = NR_RECVFRAME; + + rtw_os_recv_resource_init(precvpriv, padapter); + + precvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); + + if(precvpriv->pallocated_frame_buf==NULL){ + res= _FAIL; + goto exit; + } + //_rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); + + precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ); + //precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ - + // ((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1)); + + precvframe = (union recv_frame*) precvpriv->precv_frame_buf; + + + for(i=0; i < NR_RECVFRAME ; i++) + { + _rtw_init_listhead(&(precvframe->u.list)); + + rtw_list_insert_tail(&(precvframe->u.list), &(precvpriv->free_recv_queue.queue)); + + res = rtw_os_recv_resource_alloc(padapter, precvframe); + + precvframe->u.hdr.adapter =padapter; + precvframe++; + + } + +#ifdef CONFIG_USB_HCI + + precvpriv->rx_pending_cnt=1; + + _rtw_init_sema(&precvpriv->allrxreturnevt, 0); + +#endif + + res = padapter->HalFunc.init_recv_priv(padapter); + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + #ifdef PLATFORM_LINUX + _init_timer(&precvpriv->signal_stat_timer, padapter->pnetdev, RTW_TIMER_HDL_NAME(signal_stat), padapter); + #elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS) + _init_timer(&precvpriv->signal_stat_timer, padapter->hndis_adapter, RTW_TIMER_HDL_NAME(signal_stat), padapter); + #endif + + precvpriv->signal_stat_sampling_interval = 1000; //ms + //precvpriv->signal_stat_converging_constant = 5000; //ms + + rtw_set_signal_stat_timer(precvpriv); +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + +exit: + +_func_exit_; + + return res; + +} + +void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv) +{ + _rtw_spinlock_free(&precvpriv->lock); +#ifdef CONFIG_RECV_THREAD_MODE + _rtw_free_sema(&precvpriv->recv_sema); + _rtw_free_sema(&precvpriv->terminate_recvthread_sema); +#endif + + _rtw_spinlock_free(&precvpriv->free_recv_queue.lock); + _rtw_spinlock_free(&precvpriv->recv_pending_queue.lock); + + _rtw_spinlock_free(&precvpriv->free_recv_buf_queue.lock); + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + _rtw_spinlock_free(&precvpriv->recv_buf_pending_queue.lock); +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX +} + +void _rtw_free_recv_priv (struct recv_priv *precvpriv) +{ + _adapter *padapter = precvpriv->adapter; + +_func_enter_; + + rtw_mfree_recv_priv_lock(precvpriv); + + rtw_os_recv_resource_free(precvpriv); + + if(precvpriv->pallocated_frame_buf) { + rtw_vmfree(precvpriv->pallocated_frame_buf, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); + } + + padapter->HalFunc.free_recv_priv(padapter); + +_func_exit_; + +} + +union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue) +{ + _irqL irqL; + union recv_frame *precvframe; + _list *plist, *phead; + _adapter *padapter; + struct recv_priv *precvpriv; +_func_enter_; + + _enter_critical_bh(&pfree_recv_queue->lock, &irqL); + + if(_rtw_queue_empty(pfree_recv_queue) == _TRUE) + { + precvframe = NULL; + } + else + { + phead = get_list_head(pfree_recv_queue); + + plist = get_next(phead); + + precvframe = LIST_CONTAINOR(plist, union recv_frame, u); + + rtw_list_delete(&precvframe->u.hdr.list); + padapter=precvframe->u.hdr.adapter; + if(padapter !=NULL){ + precvpriv=&padapter->recvpriv; + if(pfree_recv_queue == &precvpriv->free_recv_queue) + precvpriv->free_recvframe_cnt--; + } + } + + _exit_critical_bh(&pfree_recv_queue->lock, &irqL); + +_func_exit_; + + return precvframe; + +} + + +void rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpriv) +{ + struct recv_buf *precvbuf = precvframe->u.hdr.precvbuf; + + /* Perry: This can be removed */ + _rtw_init_listhead(&precvframe->u.hdr.list); + + precvframe->u.hdr.len=0; + + +} + + +int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue) +{ + _irqL irqL; + _adapter *padapter=precvframe->u.hdr.adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + +_func_enter_; + + +#ifdef PLATFORM_WINDOWS + rtw_os_read_port(padapter, precvframe->u.hdr.precvbuf); +#endif + +#ifdef PLATFORM_LINUX + + if(precvframe->u.hdr.pkt) + { + dev_kfree_skb_any(precvframe->u.hdr.pkt);//free skb by driver + precvframe->u.hdr.pkt = NULL; + } + +#ifdef CONFIG_SDIO_HCI +{ + _irqL irql; + struct recv_buf *precvbuf=precvframe->u.hdr.precvbuf; + if(precvbuf !=NULL){ + _enter_critical_bh(&precvbuf->recvbuf_lock, &irql); + + precvbuf->ref_cnt--; + if(precvbuf->ref_cnt == 0 ){ + _enter_critical_bh(&precvpriv->free_recv_buf_queue.lock, &irqL); + rtw_list_delete(&(precvbuf->list)); + rtw_list_insert_tail(&(precvbuf->list), get_list_head(&precvpriv->free_recv_buf_queue)); + precvpriv->free_recv_buf_queue_cnt++; + _exit_critical_bh(&precvpriv->free_recv_buf_queue.lock, &irqL); + RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("rtw_os_read_port: precvbuf=0x%p enqueue:precvpriv->free_recv_buf_queue_cnt=%d\n",precvbuf,precvpriv->free_recv_buf_queue_cnt)); + } + RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("rtw_os_read_port: precvbuf=0x%p enqueue:precvpriv->free_recv_buf_queue_cnt=%d\n",precvbuf,precvpriv->free_recv_buf_queue_cnt)); + _exit_critical_bh(&precvbuf->recvbuf_lock, &irql); + } +} +#endif +#endif + + _enter_critical_bh(&pfree_recv_queue->lock, &irqL); + + rtw_list_delete(&(precvframe->u.hdr.list)); + + rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(pfree_recv_queue)); + + if(padapter !=NULL){ + if(pfree_recv_queue == &precvpriv->free_recv_queue) + precvpriv->free_recvframe_cnt++; + } + + _exit_critical_bh(&pfree_recv_queue->lock, &irqL); + +_func_exit_; + + return _SUCCESS; + +} + + +union recv_frame *rtw_dequeue_recvframe (_queue *queue) +{ + return rtw_alloc_recvframe(queue); +} + + +sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) +{ + _irqL irqL; + _adapter *padapter=precvframe->u.hdr.adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + +_func_enter_; + + + //_spinlock(&pfree_recv_queue->lock); + _enter_critical_bh(&queue->lock, &irqL); + + //_rtw_init_listhead(&(precvframe->u.hdr.list)); + rtw_list_delete(&(precvframe->u.hdr.list)); + + + rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(queue)); + + if (padapter != NULL) { + if (queue == &precvpriv->free_recv_queue) + precvpriv->free_recvframe_cnt++; + } + + //_rtw_spinunlock(&pfree_recv_queue->lock); + _exit_critical_bh(&queue->lock, &irqL); + + +_func_exit_; + + return _SUCCESS; +} + +/* +sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) +{ + return rtw_free_recvframe(precvframe, queue); +} +*/ + + + + +/* +caller : defrag ; recvframe_chk_defrag in recv_thread (passive) +pframequeue: defrag_queue : will be accessed in recv_thread (passive) + +using spinlock to protect + +*/ + +void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue) +{ + union recv_frame *precvframe; + _list *plist, *phead; + +_func_enter_; + _rtw_spinlock(&pframequeue->lock); + + phead = get_list_head(pframequeue); + plist = get_next(phead); + + while(rtw_end_of_queue_search(phead, plist) == _FALSE) + { + precvframe = LIST_CONTAINOR(plist, union recv_frame, u); + + plist = get_next(plist); + + //rtw_list_delete(&precvframe->u.hdr.list); // will do this in rtw_free_recvframe() + + rtw_free_recvframe(precvframe, pfree_recv_queue); + } + + _rtw_spinunlock(&pframequeue->lock); + +_func_exit_; + +} + +sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue) +{ + _irqL irqL; + + _enter_critical(&queue->lock, &irqL); + + rtw_list_delete(&precvbuf->list); + + rtw_list_insert_tail(&precvbuf->list, get_list_head(queue)); + + _exit_critical(&queue->lock, &irqL); + + + return _SUCCESS; + +} + +struct recv_buf *rtw_dequeue_recvbuf (_queue *queue) +{ + _irqL irqL; + struct recv_buf *precvbuf; + _list *plist, *phead; + + _enter_critical(&queue->lock, &irqL); + + if(_rtw_queue_empty(queue) == _TRUE) + { + precvbuf = NULL; + } + else + { + phead = get_list_head(queue); + + plist = get_next(phead); + + precvbuf = LIST_CONTAINOR(plist, struct recv_buf, list); + + rtw_list_delete(&precvbuf->list); + + } + + _exit_critical(&queue->lock, &irqL); + + + return precvbuf; + +} + +static sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe){ + + sint i,res=_SUCCESS; + u32 datalen; + u8 miccode[8]; + u8 bmic_err=_FALSE,brpt_micerror = _TRUE; + u8 *pframe, *payload,*pframemic; + u8 *mickey,*iv,rxdata_key_idx; + struct sta_info *stainfo; + struct rx_pkt_attrib *prxattrib=&precvframe->u.hdr.attrib; + struct security_priv *psecuritypriv=&adapter->securitypriv; + + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +_func_enter_; + + stainfo=rtw_get_stainfo(&adapter->stapriv ,&prxattrib->ta[0]); + + if(prxattrib->encrypt ==_TKIP_) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:prxattrib->encrypt ==_TKIP_\n")); + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5])); + + //calculate mic code + if(stainfo!= NULL) + { + if(IS_MCAST(prxattrib->ra)) + { + //mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0]; + //iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen; + //rxdata_key_idx =( ((iv[3])>>6)&0x3) ; + mickey=&psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0]; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic: bcmc key \n")); + //DBG_8192C("\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\n", + // psecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx); + + if(psecuritypriv->binstallGrpkey==_FALSE) + { + res=_FAIL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n")); + DBG_8192C("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n"); + goto exit; + } + } + else{ + mickey=&stainfo->dot11tkiprxmickey.skey[0]; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic: unicast key \n")); + } + + datalen=precvframe->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len-prxattrib->icv_len-8;//icv_len included the mic code + pframe=precvframe->u.hdr.rx_data; + payload=pframe+prxattrib->hdrlen+prxattrib->iv_len; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n",prxattrib->iv_len,prxattrib->icv_len)); + + //rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data + + rtw_seccalctkipmic(mickey,pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data + + pframemic=payload+datalen; + + bmic_err=_FALSE; + + for(i=0;i<8;i++){ + if(miccode[i] != *(pframemic+i)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x) ",i,miccode[i],i,*(pframemic+i))); + bmic_err=_TRUE; + } + } + + + if(bmic_err==_TRUE){ + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + *(pframemic-8),*(pframemic-7),*(pframemic-6),*(pframemic-5),*(pframemic-4),*(pframemic-3),*(pframemic-2),*(pframemic-1))); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + *(pframemic-16),*(pframemic-15),*(pframemic-14),*(pframemic-13),*(pframemic-12),*(pframemic-11),*(pframemic-10),*(pframemic-9))); + + { + uint i; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet (len=%d)======\n",precvframe->u.hdr.len)); + for(i=0;iu.hdr.len;i=i+8){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x", + *(precvframe->u.hdr.rx_data+i),*(precvframe->u.hdr.rx_data+i+1), + *(precvframe->u.hdr.rx_data+i+2),*(precvframe->u.hdr.rx_data+i+3), + *(precvframe->u.hdr.rx_data+i+4),*(precvframe->u.hdr.rx_data+i+5), + *(precvframe->u.hdr.rx_data+i+6),*(precvframe->u.hdr.rx_data+i+7))); + } + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet end [len=%d]======\n",precvframe->u.hdr.len)); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n hrdlen=%d, \n",prxattrib->hdrlen)); + } + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d ", + prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2], + prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5],psecuritypriv->binstallGrpkey)); + + // double check key_index for some timing issue , + // cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue + if((IS_MCAST(prxattrib->ra)==_TRUE) && (prxattrib->key_index != pmlmeinfo->key_index )) + brpt_micerror = _FALSE; + + if((prxattrib->bdecrypted ==_TRUE)&& (brpt_micerror == _TRUE)) + { + rtw_handle_tkip_mic_err(adapter,(u8)IS_MCAST(prxattrib->ra)); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); + DBG_8192C(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); + DBG_8192C(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); + } + + res=_FAIL; + + } + else{ + //mic checked ok + if((psecuritypriv->bcheck_grpkey ==_FALSE)&&(IS_MCAST(prxattrib->ra)==_TRUE)){ + psecuritypriv->bcheck_grpkey =_TRUE; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->bcheck_grpkey =_TRUE")); + } + } + + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic: rtw_get_stainfo==NULL!!!\n")); + } + + recvframe_pull_tail(precvframe, 8); + + } + +exit: + +_func_exit_; + + return res; + +} + +//decrypt and set the ivlen,icvlen of the recv_frame +static union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame) +{ + + struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + union recv_frame *return_packet=precv_frame; + +_func_enter_; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt)); + + if(prxattrib->encrypt>0) + { + u8 *iv = precv_frame->u.hdr.rx_data+prxattrib->hdrlen; + prxattrib->key_index = ( ((iv[3])>>6)&0x3) ; + + if(prxattrib->key_index > WEP_KEYS) + { + DBG_871X("prxattrib->key_index(%d) > WEP_KEYS \n", prxattrib->key_index); + + switch(prxattrib->encrypt){ + case _WEP40_: + case _WEP104_: + prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex; + break; + case _TKIP_: + case _AES_: + default: + prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid; + break; + } + } + } + + if((prxattrib->encrypt>0) && ((prxattrib->bdecrypted==0) ||(psecuritypriv->sw_decrypt==_TRUE))) + { + psecuritypriv->hw_decrypted=_FALSE; + + #ifdef DBG_RX_DECRYPTOR + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n" + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); + #endif + + switch(prxattrib->encrypt){ + case _WEP40_: + case _WEP104_: + rtw_wep_decrypt(padapter, (u8 *)precv_frame); + break; + case _TKIP_: + rtw_tkip_decrypt(padapter, (u8 *)precv_frame); + break; + case _AES_: + rtw_aes_decrypt(padapter, (u8 * )precv_frame); + break; + default: + break; + } + } + else if(prxattrib->bdecrypted==1 + && prxattrib->encrypt >0 + && (psecuritypriv->busetkipkey==1 || prxattrib->encrypt !=_TKIP_ ) + ) + { +#if 0 + if((prxstat->icv==1)&&(prxattrib->encrypt!=_AES_)) + { + psecuritypriv->hw_decrypted=_FALSE; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->hw_decrypted=_FALSE")); + + rtw_free_recvframe(precv_frame, &padapter->recvpriv.free_recv_queue); + + return_packet=NULL; + + } + else +#endif + { + psecuritypriv->hw_decrypted=_TRUE; + #ifdef DBG_RX_DECRYPTOR + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n" + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); + #endif + + } + } + else { + #ifdef DBG_RX_DECRYPTOR + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, psecuritypriv->hw_decrypted:%d\n" + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); + #endif + } + + //recvframe_chkmic(adapter, precv_frame); //move to recvframme_defrag function + +_func_exit_; + + return return_packet; + +} +//###set the security information in the recv_frame +static union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame) +{ + u8 *psta_addr,*ptr; + uint auth_alg; + struct recv_frame_hdr *pfhdr; + struct sta_info * psta; + struct sta_priv *pstapriv ; + union recv_frame * prtnframe; + u16 ether_type=0; + u16 eapol_type = 0x888e;//for Funia BD's WPA issue + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + +_func_enter_; + + pstapriv = &adapter->stapriv; + ptr = get_recvframe_data(precv_frame); + pfhdr = &precv_frame->u.hdr; + psta_addr = pfhdr->attrib.ta; + psta = rtw_get_stainfo(pstapriv, psta_addr); + + auth_alg = adapter->securitypriv.dot11AuthAlgrthm; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:adapter->securitypriv.dot11AuthAlgrthm= 0x%d\n",adapter->securitypriv.dot11AuthAlgrthm)); + + if(auth_alg==2) + { + if ((psta!=NULL) && (psta->ieee8021x_blocked)) + { + //blocked + //only accept EAPOL frame + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==1\n")); + + prtnframe=precv_frame; + + //get ether_type + ptr=ptr+pfhdr->attrib.hdrlen+pfhdr->attrib.iv_len+LLC_HEADER_SIZE; + _rtw_memcpy(ðer_type,ptr, 2); + ether_type= ntohs((unsigned short )ether_type); + + if (ether_type == eapol_type) { + prtnframe=precv_frame; + } + else { + //free this frame + rtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue); + prtnframe=NULL; + } + } + else + { + //allowed + //check decryption status, and decrypt the frame if needed + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==0\n")); + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:precv_frame->hdr.attrib.privacy=%x\n",precv_frame->u.hdr.attrib.privacy)); + + if(pattrib->bdecrypted==0) + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:prxstat->decrypted=%x\n", pattrib->bdecrypted)); + + prtnframe=precv_frame; + //check is the EAPOL frame or not (Rekey) + if(ether_type == eapol_type){ + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type == 0x888e\n")); + //check Rekey + + prtnframe=precv_frame; + } + else{ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type = 0x%.4x\n",ether_type)); + } + } + } + else + { + prtnframe=precv_frame; + } + +_func_exit_; + + return prtnframe; + +} + +static sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache) +{ + sint tid = precv_frame->u.hdr.attrib.priority; + + u16 seq_ctrl = ( (precv_frame->u.hdr.attrib.seq_num&0xffff) << 4) | + (precv_frame->u.hdr.attrib.frag_num & 0xf); + +_func_enter_; + + if(tid>15) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, (tid>15)! seq_ctrl=0x%x, tid=0x%x\n", seq_ctrl, tid)); + + return _FAIL; + } + + if(1)//if(bretry) + { + if(seq_ctrl == prxcache->tid_rxseq[tid]) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, seq_ctrl=0x%x, tid=0x%x, tid_rxseq=0x%x\n", seq_ctrl, tid, prxcache->tid_rxseq[tid])); + + return _FAIL; + } + } + + prxcache->tid_rxseq[tid] = seq_ctrl; + +_func_exit_; + + return _SUCCESS; + +} + +static void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + unsigned char pwrbit; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta=NULL; + + psta = rtw_get_stainfo(pstapriv, pattrib->src); + + pwrbit = GetPwrMgt(ptr); + + if(psta) + { + if(pwrbit) + { + psta->state |= WIFI_SLEEP_STATE; + pstapriv->sta_dz_bitmap |= BIT(psta->aid); + //DBG_871X("to sleep, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); + } + else + { + if(psta->state & WIFI_SLEEP_STATE) + { + psta->state ^= WIFI_SLEEP_STATE; + + pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); + + //DBG_871X("to wakeup, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); + wakeup_sta_to_xmit(padapter, psta); + + } + } + + } + +#endif +} + +static void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta=NULL; + + psta = rtw_get_stainfo(pstapriv, pattrib->src); + + if(!psta) return; + + if(!psta->qos_option) + return; + + if(!(psta->qos_info&0xf)) + return; + + + if(psta->state&WIFI_SLEEP_STATE) + { + u8 wmmps_ac=0; + + switch(pattrib->priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(1); + break; + } + + if(wmmps_ac) + { + if(psta->sleepq_ac_len>0) + { + //process received triggered frame + xmit_delivery_enabled_frames(padapter, psta); + } + else + { + //issue one qos null frame with More data bit = 0 and the EOSP bit set (=1) + issue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority); + } + } + + } + + +#endif + +} + +#ifdef CONFIG_TDLS +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + u8 *psa, *pmyid; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct security_priv *psecuritypriv = &adapter->securitypriv; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *pdialog , *prsnie, *ppairwise_cipher; + u8 i, k, pairwise_count; + u8 ccmp_have=0, rsnie_have=0; + u16 j; + u8 SNonce[32]; + u32 *timeout_interval; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 5; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + pmyid=myid(&(adapter->eeprompriv)); + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + if(ptdls_sta==NULL ||(ptdls_sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) + { + if(ptdls_sta==NULL){ + ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); + }else{ + //If the direct link is already set up + //Process as re-setup after tear down + DBG_8192C("re-setup a direct link\n"); + } + + if(ptdls_sta) + { + //copy dialog token + pdialog=ptr+2; + //rx_pkt_pattrib->frag_num is used to fill dialog token + _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + rsnie_have=1; + if(prx_pkt_attrib->encrypt){ + prsnie=(u8*)pIE; + //check whether initiator STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1); + for(k=0;kstat_code=72; + } + } + break; + case _EXT_CAP_IE_: + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + if(prx_pkt_attrib->encrypt) + _rtw_memcpy(SNonce, (ptr+j+52), 32); + break; + case _TIMEOUT_ITVL_IE_: + if(prx_pkt_attrib->encrypt) + timeout_interval = (u32 *)(ptr+j+3); + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //check status code + //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject + if((rsnie_have && (prx_pkt_attrib->encrypt))|| + (rsnie_have==0 && (prx_pkt_attrib->encrypt==0))){ + ptdls_sta->stat_code=0; + }else if(rsnie_have && (prx_pkt_attrib->encrypt==0)){ + //security disabled + ptdls_sta->stat_code=5; + }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){ + //request haven't RSNIE + ptdls_sta->stat_code=38; + } + + ptdls_sta->state|= TDLS_INITIATOR_STATE; + ptdls_sta->aid=*(pdialog); + if(prx_pkt_attrib->encrypt){ + _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); + _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); + } + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + } + else + { + goto _exit_recv_tdls_frame; + } + } + //already receiving TDLS setup request + else if(ptdls_sta->state==TDLS_INITIATOR_STATE){ + DBG_8192C("receive duplicated TDLS setup request frame in handshaking\n"); + goto _exit_recv_tdls_frame; + } + //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator + //following is to check out MAC_addr + else if(ptdls_sta->state==TDLS_RESPONDER_STATE){ + DBG_8192C("receive setup_req after sending setUP_req\n"); + for (i=0;i<6;i++){ + if(*(pmyid+i)==*(psa+i)){ + } + else if(*(pmyid+i)>*(psa+i)){ + goto _exit_recv_tdls_frame; + }else if(*(pmyid+i)<*(psa+i)){ + ptdls_sta->state=TDLS_INITIATOR_STATE; + ptdls_sta->aid=*(pdialog); + break; + } + } + } + + issue_tdls_setup_rsp(adapter, precv_frame); + +_exit_recv_tdls_frame: + + return _FAIL; +} + + +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa, *pdialog; + u16 stat_code; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =7; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 pairwise_count, j, k; + u8 verify_ccmp=0; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + _rtw_memcpy(&stat_code, ptr+2, 2); + + pdialog=ptr+4; + //rx_pkt_pattrib->frag_num is used to fill dialog token + _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); + + if(stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + prsnie=(u8*)pIE; + //check whether responder STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); + for(k=0;kANonce, (ptr+j+20), 32); + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + if(prx_pkt_attrib->encrypt){ + if(verify_ccmp==1){ + wpa_tdls_generate_tpk(adapter, ptdls_sta); + ptdls_sta->stat_code=0; + } + else{ + ptdls_sta->stat_code=72; //invalide contents of RSNIE + } + }else{ + ptdls_sta->stat_code=0; + } + + if(prx_pkt_attrib->encrypt){ + if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: valid + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + rtw_free_stainfo(adapter, ptdls_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + } + DBG_8192C("issue_tdls_setup_cfm\n"); + issue_tdls_setup_cfm(adapter, precv_frame); + + if((ptdls_sta->state&TDLS_RESPONDER_STATE)==TDLS_RESPONDER_STATE) + ptdls_sta->state |= TDLS_LINKED_STATE; + + if(prx_pkt_attrib->encrypt){ + if(ptdls_sta->cam_entry==0){ + ptdls_sta->dot118021XPrivacy=_AES_; + ptdls_sta->cam_entry=pmlmeinfo->tdls_cam_entry_to_write; + if(++pmlmeinfo->tdls_cam_entry_to_write>31) + pmlmeinfo->tdls_cam_entry_to_write=6; + } + rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); + } + + return _FAIL; +} + +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *psa; + u16 stat_code; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =5; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 j, pairwise_count; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //[+1]: payload type + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + + if(prx_pkt_attrib->encrypt){ + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _RSN_IE_2_: + prsnie=(u8*)pIE; + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + pftie=(u8*)pIE; + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _HT_EXTRA_INFO_IE_: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //verify mic in FTIE MIC field + if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + rtw_free_stainfo(adapter, ptdls_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + + } + + pmlmeinfo->tdls_setup_state=TDLS_LINKED_STATE; + if((ptdls_sta->state & TDLS_INITIATOR_STATE)==TDLS_INITIATOR_STATE) + ptdls_sta->state|=TDLS_LINKED_STATE; + + ptdls_sta->option=1; //write RCR DATA BIT + _set_workitem(&ptdls_sta->option_workitem); + + //Write cam + //TDLS encryption(if needed) will always be CCMP + if(prx_pkt_attrib->encrypt){ + if(ptdls_sta->cam_entry==0){ + ptdls_sta->dot118021XPrivacy=_AES_; + ptdls_sta->cam_entry=pmlmeinfo->tdls_cam_entry_to_write; + if(++pmlmeinfo->tdls_cam_entry_to_write>31) + pmlmeinfo->tdls_cam_entry_to_write=6; + } + rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); + } + + + return _FAIL; +} + +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *ptr = precv_frame->u.hdr.rx_data; + u8 *pdialog = NULL; + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+8+1; + pdialog=ptr+2; + + //check frame contents + + //rx_pkt_pattrib->frag_num is used to fill dialog token + _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); + + issue_tdls_dis_rsp(adapter, precv_frame); + + return _FAIL; + +} + +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame) +{ + u8 *psa; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + + psa = get_sa(ptr); + + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + if(ptdls_sta!=NULL){ + + if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ + ptdls_sta->option =3; + _set_workitem(&ptdls_sta->option_workitem); + } + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + //ready to clear cam + if(ptdls_sta->cam_entry!=0){ + pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; + //it will clear cam response to ptdls_sta->cam_entry + rtw_setstakey_cmd(adapter, (u8 *)ptdls_sta, _TRUE); + } + _set_workitem(&pmlmeext->TDLS_restore_workitem); + rtw_free_stainfo(adapter, ptdls_sta); + } + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + + return _FAIL; + +} + +u8 TDLS_check_ch_state(uint state){ + if( (state & TDLS_CH_SWITCH_ON_STATE) && + (state & TDLS_AT_OFF_CH_STATE) && + (state & TDLS_PEER_AT_OFF_STATE) ){ + + if(state & TDLS_PEER_SLEEP_STATE) + return 2; //U-APSD + ch. switch + else + return 1; //ch. switch + }else + return 0; +} + +//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + //get peer sta infomation + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->state); + int i; + ptdls_sta->sta_stats.rx_pkts++; + + //receive peer traffic response frame, sleeping STA wakes up + ptdls_sta->state &= ~(TDLS_PEER_SLEEP_STATE); + + // if noticed peer STA wakes up by receiving peer traffic response + // and we want to do channel swtiching, then we will transmit channel switch request first + if(ptdls_sta->state & TDLS_APSD_CHSW_STATE){ + issue_tdls_ch_switch_req(adapter, pattrib->src); + ptdls_sta->state &= ~(TDLS_APSD_CHSW_STATE); + return _FAIL; + } + + //check 4-AC queue bit + if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) + wmmps_ac=1; + + //if it's a direct link and have buffered frame + if(ptdls_sta->state & TDLS_LINKED_STATE){ + if(wmmps_ac && state) + { + _irqL irqL; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + //transmit buffered frames + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + xmitframe_plist = get_next(xmitframe_plist); + rtw_list_delete(&pxmitframe->list); + + ptdls_sta->sleepq_len--; + if(ptdls_sta->sleepq_len>0){ + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + }else{ + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS + if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(adapter, pxmitframe); + } + + } + + if(ptdls_sta->sleepq_len==0) + { + DBG_871X("no buffered packets to xmit\n"); + //on U-APSD + CH. switch state, when there is no buffered date to xmit, + // we should go back to base channel + if(state==2){ + ptdls_sta->option = 3; + _set_workitem(&ptdls_sta->option_workitem); + }else if(ptdls_sta->state&TDLS_SW_OFF_STATE){ + ptdls_sta->state &= ~(TDLS_SW_OFF_STATE); + pmlmeinfo->tdls_candidate_ch= pmlmeext->cur_channel; + issue_tdls_ch_switch_req(adapter, pattrib->src); + DBG_8192C("issue tdls ch switch req back to base channel\n"); + } + + } + else + { + DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); + ptdls_sta->sleepq_len=0; + } + + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + } + + } + + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =3; + u16 j; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //[+1]: payload type + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + ptdls_sta->off_ch = *(ptr+2); + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _COUNTRY_IE_: + break; + case _CH_SWTICH_ANNOUNCE_: + break; + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); + default: + break; + } + + j += (pIE->Length + 2); + + } + + //todo: check status + ptdls_sta->stat_code=0; + ptdls_sta->state|=TDLS_CH_SWITCH_ON_STATE; + + issue_nulldata(adapter, 1); + + issue_tdls_ch_switch_rsp(adapter, psa); + + DBG_8192C("issue tdls channel switch response\n"); + + if((ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ + DBG_8192C("back to base channel\n"); + ptdls_sta->option=7; + _set_workitem(&ptdls_sta->option_workitem); + + }else{ + ptdls_sta->option=6; + _set_workitem(&ptdls_sta->option_workitem); + } + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =4; + u16 stat_code, j, switch_time, switch_timeout; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, + //it will go back to base channel and terminate this channel switch procedure + if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE ){ + if(pmlmeext->cur_channel==ptdls_sta->off_ch){ + DBG_8192C("back to base channel\n"); + ptdls_sta->option=7; + _set_workitem(&ptdls_sta->option_workitem); + }else{ + DBG_8192C("receive unsolicited channel switch response \n"); + ptdls_sta->option=3; + _set_workitem(&ptdls_sta->option_workitem); + } + return _FAIL; + } + + //avoiding duplicated or unconditional ch. switch. rsp + if((ptdls_sta->state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE) + return _FAIL; + + //[+1]: payload type + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + return _FAIL; + } + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&switch_time, pIE->data, 2); + if(switch_time > ptdls_sta->ch_switch_time) + _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); + + _rtw_memcpy(&switch_timeout, pIE->data+2, 2); + if(switch_timeout > ptdls_sta->ch_switch_timeout) + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); + + default: + break; + } + + j += (pIE->Length + 2); + + } + + ptdls_sta->state &= ~(TDLS_CH_SW_INITIATOR_STATE); + ptdls_sta->state |=TDLS_CH_SWITCH_ON_STATE; + + //goto set_channel_workitem_callback() + ptdls_sta->option=6; + _set_workitem(&ptdls_sta->option_workitem); + + return _FAIL; +} + +sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) +{ + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + sint ret = _SUCCESS; + u8 *paction = get_recvframe_data(precv_frame); + + //point to action field, [+8]: snap+ether_type, [+1]: payload_type, [+1]: category field + paction+=pattrib->hdrlen + pattrib->iv_len+8+1+1; + + switch(*paction){ + case TDLS_SETUP_REQUEST: + DBG_8192C("recv tdls setup request frame\n"); + ret=On_TDLS_Setup_Req(adapter, precv_frame); + break; + case TDLS_SETUP_RESPONSE: + DBG_8192C("recv tdls setup response frame\n"); + ret=On_TDLS_Setup_Rsp(adapter, precv_frame); + break; + case TDLS_SETUP_CONFIRM: + DBG_8192C("recv tdls setup confirm frame\n"); + ret=On_TDLS_Setup_Cfm(adapter, precv_frame); + break; + case TDLS_TEARDOWN: + DBG_8192C("recv tdls teardown, free sta_info\n"); + ret=On_TDLS_Teardown(adapter, precv_frame); + break; + case TDLS_DISCOVERY_REQUEST: + DBG_8192C("recv tdls discovery request frame\n"); + ret=On_TDLS_Dis_Req(adapter, precv_frame); + break; + case TDLS_PEER_TRAFFIC_RESPONSE: + DBG_8192C("recv tdls discovery response frame\n"); + ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); + break; + case TDLS_CHANNEL_SWITCH_REQUEST: + DBG_8192C("recv tdls channel switch request frame\n"); + ret=On_TDLS_Ch_Switch_Req(adapter, precv_frame); + break; + case TDLS_CHANNEL_SWITCH_RESPONSE: + DBG_8192C("recv tdls channel switch response frame\n"); + ret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame); + break; + default: + DBG_8192C("receive TDLS frame but not supported\n"); + ret=_FAIL; + break; + } + +exit: + return ret; + +} +#endif + +static sint sta2sta_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, + struct sta_info**psta +) +{ + u8 *ptr = precv_frame->u.hdr.rx_data; + sint ret = _SUCCESS; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + u8 *mybssid = get_bssid(pmlmepriv); + u8 *myhwaddr = myid(&adapter->eeprompriv); + u8 * sta_addr = NULL; + sint bmcast = IS_MCAST(pattrib->dst); + +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_info *ptdls_sta=NULL; + u8 *psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + //frame body located after [+2]: ether-type, [+1]: payload type + u8 *pframe_body = psnap_type+2+1; +#endif + +_func_enter_; + + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) + { + + // filter packets that SA is myself or multicast or broadcast + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); + ret= _FAIL; + goto exit; + } + + if( (!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast) ){ + ret= _FAIL; + goto exit; + } + + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) { + ret= _FAIL; + goto exit; + } + + sta_addr = pattrib->src; + + } + else if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { +#ifdef CONFIG_TDLS + + //direct link data transfer + if(pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE){ + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + if(ptdls_sta==NULL){ + ret=_FAIL; + goto exit; + }else if(((ptdls_sta->state&TDLS_LINKED_STATE)!=TDLS_LINKED_STATE)&&(!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)){ + ret=_FAIL; + goto exit; + }else if((ptdls_sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE){ + + //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data + if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) + { + if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) + { + ret= _FAIL; + goto exit; + } + } + // filter packets that SA is myself or multicast or broadcast + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); + ret= _FAIL; + goto exit; + } + // da should be for me + if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) + { + ret= _FAIL; + goto exit; + } + // check BSSID + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) + { + ret= _FAIL; + goto exit; + } + // if NULL-frame, check pwrbit + if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) + { + //NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA + if(GetPwrMgt(ptr)){ + ptdls_sta->state|=TDLS_PEER_SLEEP_STATE; + // it would be triggered when we are off channel and receiving NULL DATA + // we can confirm that peer STA is at off channel + }else if(ptdls_sta->state&TDLS_CH_SWITCH_ON_STATE){ + if((ptdls_sta->state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){ + issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta, 0); + ptdls_sta->state |= TDLS_PEER_AT_OFF_STATE; + On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); + } + } + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); + ret= _FAIL; + goto exit; + } + //receive some of all TDLS management frames, process it at ON_TDLS + if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))){ + ret= OnTDLS(adapter, precv_frame); + goto exit; + } + + } + } + else +#endif + // For Station mode, sa and bssid should always be BSSID, and DA is my mac-address + if(!_rtw_memcmp(pattrib->bssid, pattrib->src, ETH_ALEN) ) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("bssid != TA under STATION_MODE; drop pkt\n")); + ret= _FAIL; + goto exit; + } + + sta_addr = pattrib->bssid; + + } + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + if (bmcast) + { + // For AP mode, if DA == MCAST, then BSSID should be also MCAST + if (!IS_MCAST(pattrib->bssid)){ + ret= _FAIL; + goto exit; + } + } + else // not mc-frame + { + // For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID + if(!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) { + ret= _FAIL; + goto exit; + } + + sta_addr = pattrib->src; + } + + } + else if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + { + _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + sta_addr = mybssid; + } + else + { + ret = _FAIL; + } + + + + if(bmcast) + *psta = rtw_get_bcmc_stainfo(adapter); + else + *psta = rtw_get_stainfo(pstapriv, sta_addr); // get ap_info + + if (*psta == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under sta2sta_data_frame ; drop pkt\n")); +#ifdef CONFIG_MP_INCLUDED + if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + adapter->mppriv.rx_pktloss++; +#endif + ret= _FAIL; + goto exit; + } + +exit: +_func_exit_; + return ret; + +} + + +static sint ap2sta_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, + struct sta_info**psta ) +{ + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + sint ret = _SUCCESS; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + u8 *mybssid = get_bssid(pmlmepriv); + u8 *myhwaddr = myid(&adapter->eeprompriv); + sint bmcast = IS_MCAST(pattrib->dst); + +_func_enter_; + + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE + || check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE ) + ) + { + + // if NULL-frame, drop packet + if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s NULL frame\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data + if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) + { + if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s drop QoS-SubType Data, including QoS NULL, excluding QoS-Data\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + } + + // filter packets that SA is myself or multicast or broadcast + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s SA=%x:%x:%x:%x:%x:%x, myhwaddr= %x:%x:%x:%x:%x:%x\n", __FUNCTION__, + pattrib->src[0], pattrib->src[1], pattrib->src[2], + pattrib->src[3], pattrib->src[4], pattrib->src[5], + *(myhwaddr), *(myhwaddr+1), *(myhwaddr+2), + *(myhwaddr+3), *(myhwaddr+4), *(myhwaddr+5)); + #endif + ret= _FAIL; + goto exit; + } + + // da should be for me + if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" ap2sta_data_frame: compare DA fail; DA= %x:%x:%x:%x:%x:%x \n", + pattrib->dst[0], + pattrib->dst[1], + pattrib->dst[2], + pattrib->dst[3], + pattrib->dst[4], + pattrib->dst[5])); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s compare DA fail; DA= %x:%x:%x:%x:%x:%x \n", __FUNCTION__, + pattrib->dst[0],pattrib->dst[1],pattrib->dst[2], + pattrib->dst[3],pattrib->dst[4],pattrib->dst[5]); + #endif + + ret= _FAIL; + goto exit; + } + + + // check BSSID + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" ap2sta_data_frame: compare BSSID fail ; BSSID=%x:%x:%x:%x:%x:%x\n", + pattrib->bssid[0], + pattrib->bssid[1], + pattrib->bssid[2], + pattrib->bssid[3], + pattrib->bssid[4], + pattrib->bssid[5])); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("mybssid= %x:%x:%x:%x:%x:%x\n", + mybssid[0], + mybssid[1], + mybssid[2], + mybssid[3], + mybssid[4], + mybssid[5])); + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s compare BSSID fail ; BSSID=%x:%x:%x:%x:%x:%x, mybssid= %x:%x:%x:%x:%x:%x\n", __FUNCTION__, + pattrib->bssid[0], pattrib->bssid[1], pattrib->bssid[2], + pattrib->bssid[3], pattrib->bssid[4], pattrib->bssid[5], + mybssid[0], mybssid[1], mybssid[2], + mybssid[3], mybssid[4], mybssid[5]); + #endif + + ret= _FAIL; + goto exit; + } + + if(bmcast) + *psta = rtw_get_bcmc_stainfo(adapter); + else + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get ap_info + + if (*psta == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ap2sta: can't get psta under STATION_MODE ; drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + } + else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && + (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ) + { + _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + // + _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); + + + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info + if (*psta == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under MP_MODE ; drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + + } + else + { + ret = _FAIL; + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s fw_state:0x%x\n", __FUNCTION__, get_fwstate(pmlmepriv)); + #endif + } + +exit: + +_func_exit_; + + return ret; + +} + +static sint sta2ap_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, + struct sta_info**psta ) +{ + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + unsigned char *mybssid = get_bssid(pmlmepriv); + sint ret=_SUCCESS; + +_func_enter_; + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + //For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR + if(!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) + { + ret= _FAIL; + goto exit; + } + + *psta = rtw_get_stainfo(pstapriv, pattrib->src); + + if (*psta == NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under AP_MODE; drop pkt\n")); + ret= _FAIL; + goto exit; + } + + + process_pwrbit_data(adapter, precv_frame); + + + // if NULL-frame, drop packet + if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); + + //process_null_data(adapter, precv_frame); + //process_pwrbit_data(adapter, precv_frame); + + + ret= _FAIL; + goto exit; + } + + //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data + if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) + { + + if(GetFrameSubType(ptr)==WIFI_QOS_DATA_NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" QoS NULL frame \n")); + + //process_null_data(adapter, precv_frame); + + ret= _FAIL; + goto exit; + } + + process_wmmps_data(adapter, precv_frame); + + /* + if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) + { + process_null_data(adapter, precv_frame); + ret= _FAIL; + goto exit; + } + */ + } + + } + +exit: + +_func_exit_; + + return ret; + +} + +static sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; + //uint len = precv_frame->u.hdr.len; + + //DBG_871X("+validate_recv_ctrl_frame\n"); + + if (GetFrameType(pframe) != WIFI_CTRL_TYPE) + { + return _FAIL; + } + + //receive the frames that ra(a1) is my address + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN)) + { + return _FAIL; + } + + //only handle ps-poll + if(GetFrameSubType(pframe) == WIFI_PSPOLL) + { + u16 aid; + u8 wmmps_ac=0; + struct sta_info *psta=NULL; + + aid = GetAid(pframe); + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + + if((psta==NULL) || (psta->aid!=aid)) + { + return _FAIL; + } + + //for rx pkt statistics + psta->sta_stats.rx_pkts++; + + switch(pattrib->priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(0); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(0); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(0); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(0); + break; + } + + if(wmmps_ac) + return _FAIL; + + if((psta->state&WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap&BIT(psta->aid))) + { + _irqL irqL; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + if ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + psta->sleepq_len--; + + if(psta->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + pxmitframe->attrib.triggered = 1; + + //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if(psta->sleepq_len==0) + { + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //DBG_871X("after handling ps-poll, tim=%x\n", pstapriv->tim_bitmap); + + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + + } + else + { + //DBG_871X("no buffered packets to xmit\n"); + if(pstapriv->tim_bitmap&BIT(psta->aid)) + { + if(psta->sleepq_len==0) + { + DBG_871X("no buffered packets to xmit\n"); + } + else + { + DBG_871X("error!psta->sleepq_len=%d\n", psta->sleepq_len); + psta->sleepq_len=0; + } + + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + } + + } + +#endif + + return _FAIL; + +} + +static sint validate_recv_mgnt_frame(_adapter *adapter, union recv_frame *precv_frame) +{ + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + + if(pmlmeinfo->tdls_ch_sensing==1 && pmlmeinfo->tdls_cur_channel !=0){ + pmlmeinfo->tdls_collect_pkt_num[pmlmeinfo->tdls_cur_channel-1]++; + } +#endif + + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("+validate_recv_mgnt_frame\n")); + +#if 0 + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#ifdef CONFIG_NATIVEAP_MLME + mgt_dispatcher(adapter, precv_frame); +#else + rtw_hostapd_mlme_rx(adapter, precv_frame); +#endif + } + else + { + mgt_dispatcher(adapter, precv_frame); + } +#endif + +#ifdef CONFIG_AP_MODE + { + //for rx pkt statistics + struct sta_info *psta = rtw_get_stainfo(&adapter->stapriv, GetAddr2Ptr(precv_frame->u.hdr.rx_data)); + if(psta) + psta->sta_stats.rx_pkts++; + } +#endif + + mgt_dispatcher(adapter, precv_frame); + + return _SUCCESS; + +} + + +static sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame) +{ + int res; + u8 bretry; + u8 *psa, *pda, *pbssid; + struct sta_info *psta = NULL; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + sint ret = _SUCCESS; +#ifdef CONFIG_TDLS + struct sta_info *ptdls_sta = NULL; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#endif + +_func_enter_; + + bretry = GetRetry(ptr); + pda = get_da(ptr); + psa = get_sa(ptr); + pbssid = get_hdr_bssid(ptr); + + if(pbssid == NULL){ + ret= _FAIL; + goto exit; + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1 && pmlmeinfo->tdls_cur_channel !=0){ + pmlmeinfo->tdls_collect_pkt_num[pmlmeinfo->tdls_cur_channel-1]++; + } +#endif + + _rtw_memcpy(pattrib->dst, pda, ETH_ALEN); + _rtw_memcpy(pattrib->src, psa, ETH_ALEN); + + _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN); + + switch(pattrib->to_fr_ds) + { + case 0: + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + res= sta2sta_data_frame(adapter, precv_frame, &psta); + break; + + case 1: + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN); + res= ap2sta_data_frame(adapter, precv_frame, &psta); + break; + + case 2: + _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + res= sta2ap_data_frame(adapter, precv_frame, &psta); + break; + + case 3: + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); + res=_FAIL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n")); + break; + + default: + res=_FAIL; + break; + + } + + if(res==_FAIL){ + //RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" after to_fr_ds_chk; res = fail \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s case:%d, res:%d\n", __FUNCTION__, pattrib->to_fr_ds, res); + #endif + ret= res; + goto exit; + } + + + if(psta==NULL){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" after to_fr_ds_chk; psta==NULL \n")); + ret= _FAIL; + goto exit; + } + + //psta->rssi = prxcmd->rssi; + //psta->signal_quality= prxcmd->sq; + precv_frame->u.hdr.psta = psta; + + + pattrib->amsdu=0; + //parsing QC field + if(pattrib->qos == 1) + { + pattrib->priority = GetPriority((ptr + 24)); + pattrib->ack_policy =GetAckpolicy((ptr + 24)); + pattrib->amsdu = GetAMsdu((ptr + 24)); + pattrib->hdrlen = pattrib->to_fr_ds==3 ? 32 : 26; + + if(pattrib->priority!=0 && pattrib->priority!=3) + { + adapter->recvpriv.bIsAnyNonBEPkts = _TRUE; + } + } + else + { + pattrib->priority=0; + pattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24; + } + + + if(pattrib->order)//HT-CTRL 11n + { + pattrib->hdrlen += 4; + } + +#ifdef CONFIG_TDLS + //checking reordering per direct link + if((pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE)&&(pattrib->to_fr_ds==0)){ + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + if(ptdls_sta==NULL){ + ret= _FAIL; + goto exit; + }else{ + precv_frame->u.hdr.preorder_ctrl = &ptdls_sta->recvreorder_ctrl[pattrib->priority]; + + // decache, drop duplicate recv packets + if(recv_decache(precv_frame, bretry, &ptdls_sta->sta_recvpriv.rxcache) == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n")); + ret= _FAIL; + goto exit; + } + } + if(ptdls_sta->dot118021XPrivacy==_AES_) + pattrib->encrypt=ptdls_sta->dot118021XPrivacy; + }else +#endif + { + precv_frame->u.hdr.preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority]; + + // decache, drop duplicate recv packets + if(recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n")); + ret= _FAIL; + goto exit; + } + } + + if(pattrib->privacy){ + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("validate_recv_data_frame:pattrib->privacy=%x\n", pattrib->privacy)); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0],IS_MCAST(pattrib->ra))); + +#ifdef CONFIG_TDLS + if(ptdls_sta==NULL) +#endif + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra)); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n pattrib->encrypt=%d\n",pattrib->encrypt)); + + SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt); + } + else + { + pattrib->encrypt = 0; + pattrib->iv_len = pattrib->icv_len = 0; + } + +exit: + +_func_exit_; + + return ret; +} + +static sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) +{ + //shall check frame subtype, to / from ds, da, bssid + + //then call check if rx seq/frag. duplicated. + + u8 type; + u8 subtype; + sint retval = _SUCCESS; + + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + + u8 *ptr = precv_frame->u.hdr.rx_data; + u8 ver =(unsigned char) (*ptr)&0x3 ; +#ifdef CONFIG_FIND_BEST_CHANNEL + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; +#endif + +_func_enter_; + + +#ifdef CONFIG_FIND_BEST_CHANNEL + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { + pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].rx_count++; + } +#endif + +#if 0 +DBG_871X("\n"); +{ + int i; + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + +} +DBG_871X("\n"); +#endif + + //add version chk + if(ver!=0){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n")); + retval= _FAIL; + goto exit; + } + + type = GetFrameType(ptr); + subtype = GetFrameSubType(ptr); //bit(7)~bit(2) + + pattrib->to_fr_ds = get_tofr_ds(ptr); + + pattrib->frag_num = GetFragNum(ptr); + pattrib->seq_num = GetSequence(ptr); + + pattrib->pw_save = GetPwrMgt(ptr); + pattrib->mfrag = GetMFrag(ptr); + pattrib->mdata = GetMData(ptr); + pattrib->privacy = GetPrivacy(ptr); + pattrib->order = GetOrder(ptr); +#if 0 //for debug + +if(pHalData->bDumpRxPkt ==1){ + int i; + DBG_871X("############################# \n"); + + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + DBG_871X("############################# \n"); +} +else if(pHalData->bDumpRxPkt ==2){ + if(type== WIFI_MGT_TYPE){ + int i; + DBG_871X("############################# \n"); + + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + DBG_871X("############################# \n"); + } +} +else if(pHalData->bDumpRxPkt ==3){ + if(type== WIFI_DATA_TYPE){ + int i; + DBG_871X("############################# \n"); + + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + DBG_871X("############################# \n"); + } +} + +#endif + switch (type) + { + case WIFI_MGT_TYPE: //mgnt + retval = validate_recv_mgnt_frame(adapter, precv_frame); + if (retval == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n")); + } + retval = _FAIL; // only data frame return _SUCCESS + break; + case WIFI_CTRL_TYPE: //ctrl + retval = validate_recv_ctrl_frame(adapter, precv_frame); + if (retval == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n")); + } + retval = _FAIL; // only data frame return _SUCCESS + break; + case WIFI_DATA_TYPE: //data + rtw_led_control(adapter, LED_CTL_RX); + pattrib->qos = (subtype & BIT(7))? 1:0; + retval = validate_recv_data_frame(adapter, precv_frame); + if (retval == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n")); + } + break; + default: + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type)); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type); + #endif + retval = _FAIL; + break; + } + +exit: + +_func_exit_; + + return retval; +} + + +//remove the wlanhdr and add the eth_hdr +#if 1 +static sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) +{ + sint rmv_len; + u16 eth_type, len; + u8 bsnaphdr; + u8 *psnap_type; + struct ieee80211_snap_hdr *psnap; + + sint ret=_SUCCESS; + _adapter *adapter =precvframe->u.hdr.adapter; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + + u8 *ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field + struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; + +_func_enter_; + + if(pattrib->encrypt){ + recvframe_pull_tail(precvframe, pattrib->icv_len); + } + + psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); + psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + /* convert hdr + possible LLC headers into Ethernet header */ + //eth_type = (psnap_type[0] << 8) | psnap_type[1]; + if((_rtw_memcmp(psnap, rfc1042_header, SNAP_SIZE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )|| + //eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || + _rtw_memcmp(psnap, bridge_tunnel_header, SNAP_SIZE)){ + /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ + bsnaphdr = _TRUE; + } + else { + /* Leave Ethernet header part of hdr and full payload */ + bsnaphdr = _FALSE; + } + + rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); + len = precvframe->u.hdr.len - rmv_len; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n\n", pattrib->hdrlen, pattrib->iv_len)); + + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)) + { + ptr += rmv_len ; + *ptr = 0x87; + *(ptr+1) = 0x12; + + eth_type = 0x8712; + // append rx status for mp test packets + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24); + _rtw_memcpy(ptr, get_rxmem(precvframe), 24); + ptr+=24; + } + else { + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0))); + } + + _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); + _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); + + if(!bsnaphdr) { + len = htons(len); + _rtw_memcpy(ptr+12, &len, 2); + } + +_func_exit_; + return ret; + +} + +#else + +sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) +{ + sint rmv_len; + u16 eth_type; + u8 bsnaphdr; + u8 *psnap_type; + struct ieee80211_snap_hdr *psnap; + + sint ret=_SUCCESS; + _adapter *adapter =precvframe->u.hdr.adapter; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + + u8* ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field + struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; + struct _vlan *pvlan = NULL; + +_func_enter_; + + psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); + psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03) + { + if (_rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)) + bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; + else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) && + _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) ) + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; + else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; + else { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n")); + ret= _FAIL; + goto exit; + } + + } else + bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; + + rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n", pattrib->hdrlen, pattrib->iv_len)); + + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + { + ptr += rmv_len ; + *ptr = 0x87; + *(ptr+1) = 0x12; + + //back to original pointer + ptr -= rmv_len; + } + + ptr += rmv_len ; + + _rtw_memcpy(ð_type, ptr, 2); + eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type + ptr +=2; + + if(pattrib->encrypt){ + recvframe_pull_tail(precvframe, pattrib->icv_len); + } + + if(eth_type == 0x8100) //vlan + { + pvlan = (struct _vlan *) ptr; + + //eth_type = get_vlan_encap_proto(pvlan); + //eth_type = pvlan->h_vlan_encapsulated_proto;//? + rmv_len += 4; + ptr+=4; + } + + if(eth_type==0x0800)//ip + { + //struct iphdr* piphdr = (struct iphdr*) ptr; + //__u8 tos = (unsigned char)(pattrib->priority & 0xff); + + //piphdr->tos = tos; + + //if (piphdr->protocol == 0x06) + //{ + // RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", precvframe->u.hdr.len)); + //} + } + else if(eth_type==0x8712)// append rx status for mp test packets + { + //ptr -= 16; + //_rtw_memcpy(ptr, get_rxmem(precvframe), 16); + } + else + { +#ifdef PLATFORM_OS_XP + NDIS_PACKET_8021Q_INFO VlanPriInfo; + UINT32 UserPriority = precvframe->u.hdr.attrib.priority; + UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 ); + + VlanPriInfo.Value = // Get current value. + NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo); + + VlanPriInfo.TagHeader.UserPriority = UserPriority; + VlanPriInfo.TagHeader.VlanId = VlanID ; + + VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero. + VlanPriInfo.TagHeader.Reserved = 0; // Should be zero. + NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; +#endif + } + + if(eth_type==0x8712)// append rx status for mp test packets + { + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24); + _rtw_memcpy(ptr, get_rxmem(precvframe), 24); + ptr+=24; + } + else + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)); + + _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); + _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); + + eth_type = htons((unsigned short)eth_type) ; + _rtw_memcpy(ptr+12, ð_type, 2); + +exit: + +_func_exit_; + + return ret; +} +#endif + +static void count_rx_stats(_adapter *padapter, union recv_frame *prframe) +{ + int sz; + struct sta_info *psta = NULL; + struct stainfo_stats *pstats = NULL; + struct rx_pkt_attrib *pattrib = & prframe->u.hdr.attrib; + struct recv_priv *precvpriv = &padapter->recvpriv; + + sz = get_recvframe_len(prframe); + precvpriv->rx_bytes += sz; + + padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++; + + if( (!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst))){ + padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++; + } + + psta = prframe->u.hdr.psta; + + if(psta) + { + pstats = &psta->sta_stats; + + pstats->rx_pkts++; + pstats->rx_bytes += sz; + } + +} + + +//perform defrag +static union recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q) +{ + _list *plist, *phead; + u8 *data,wlanhdr_offset; + u8 curfragnum; + struct recv_frame_hdr *pfhdr,*pnfhdr; + union recv_frame* prframe, *pnextrframe; + _queue *pfree_recv_queue; + +_func_enter_; + + curfragnum=0; + pfree_recv_queue=&adapter->recvpriv.free_recv_queue; + + phead = get_list_head(defrag_q); + plist = get_next(phead); + prframe = LIST_CONTAINOR(plist, union recv_frame, u); + pfhdr=&prframe->u.hdr; + rtw_list_delete(&(prframe->u.list)); + + if(curfragnum!=pfhdr->attrib.frag_num) + { + //the first fragment number must be 0 + //free the whole queue + rtw_free_recvframe(prframe, pfree_recv_queue); + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); + + return NULL; + } + + curfragnum++; + + plist= get_list_head(defrag_q); + + plist = get_next(plist); + + data=get_recvframe_data(prframe); + + while(rtw_end_of_queue_search(phead, plist) == _FALSE) + { + pnextrframe = LIST_CONTAINOR(plist, union recv_frame , u); + pnfhdr=&pnextrframe->u.hdr; + + + //check the fragment sequence (2nd ~n fragment frame) + + if(curfragnum!=pnfhdr->attrib.frag_num) + { + //the fragment number must be increasing (after decache) + //release the defrag_q & prframe + rtw_free_recvframe(prframe, pfree_recv_queue); + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); + return NULL; + } + + curfragnum++; + + //copy the 2nd~n fragment frame's payload to the first fragment + //get the 2nd~last fragment frame's payload + + wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len; + + recvframe_pull(pnextrframe, wlanhdr_offset); + + //append to first fragment frame's tail (if privacy frame, pull the ICV) + recvframe_pull_tail(prframe, pfhdr->attrib.icv_len); + + //memcpy + _rtw_memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len); + + recvframe_put(prframe, pnfhdr->len); + + pfhdr->attrib.icv_len=pnfhdr->attrib.icv_len; + plist = get_next(plist); + + }; + + //free the defrag_q queue and return the prframe + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Performance defrag!!!!!\n")); + +_func_exit_; + + return prframe; +} + + +//check if need to defrag, if needed queue the frame to defrag_q +static union recv_frame * recvframe_chk_defrag(_adapter *padapter,union recv_frame* precv_frame) +{ + u8 ismfrag; + u8 fragnum; + u8 *psta_addr; + struct recv_frame_hdr *pfhdr; + struct sta_info * psta; + struct sta_priv *pstapriv ; + _list *phead; + union recv_frame* prtnframe=NULL; + _queue *pfree_recv_queue, *pdefrag_q; + +_func_enter_; + + pstapriv = &padapter->stapriv; + + pfhdr=&precv_frame->u.hdr; + + pfree_recv_queue=&padapter->recvpriv.free_recv_queue; + + //need to define struct of wlan header frame ctrl + ismfrag= pfhdr->attrib.mfrag; + fragnum=pfhdr->attrib.frag_num; + + psta_addr=pfhdr->attrib.ta; + psta=rtw_get_stainfo(pstapriv, psta_addr); + if (psta==NULL) + pdefrag_q = NULL; + else + pdefrag_q=&psta->sta_recvpriv.defrag_q; + + if ((ismfrag==0) && (fragnum==0)) + { + prtnframe = precv_frame;//isn't a fragment frame + } + + if (ismfrag==1) + { + //0~(n-1) fragment frame + //enqueue to defraf_g + if(pdefrag_q != NULL) + { + if(fragnum==0) + { + //the first fragment + if(_rtw_queue_empty(pdefrag_q) == _FALSE) + { + //free current defrag_q + rtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue); + } + } + + + //Then enqueue the 0~(n-1) fragment into the defrag_q + + //_rtw_spinlock(&pdefrag_q->lock); + phead = get_list_head(pdefrag_q); + rtw_list_insert_tail(&pfhdr->list, phead); + //_rtw_spinunlock(&pdefrag_q->lock); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Enqueuq: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); + + prtnframe=NULL; + + } + else + { + //can't find this ta's defrag_queue, so free this recv_frame + rtw_free_recvframe(precv_frame, pfree_recv_queue); + prtnframe=NULL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); + } + + } + + if((ismfrag==0)&&(fragnum!=0)) + { + //the last fragment frame + //enqueue the last fragment + if(pdefrag_q != NULL) + { + //_rtw_spinlock(&pdefrag_q->lock); + phead = get_list_head(pdefrag_q); + rtw_list_insert_tail(&pfhdr->list,phead); + //_rtw_spinunlock(&pdefrag_q->lock); + + //call recvframe_defrag to defrag + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("defrag: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); + precv_frame = recvframe_defrag(padapter, pdefrag_q); + prtnframe=precv_frame; + + } + else + { + //can't find this ta's defrag_queue, so free this recv_frame + rtw_free_recvframe(precv_frame, pfree_recv_queue); + prtnframe=NULL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); + } + + } + + + if((prtnframe!=NULL)&&(prtnframe->u.hdr.attrib.privacy)) + { + //after defrag we must check tkip mic code + if(recvframe_chkmic(padapter, prtnframe)==_FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic(padapter, prtnframe)==_FAIL\n")); + rtw_free_recvframe(prtnframe,pfree_recv_queue); + prtnframe=NULL; + } + } + +_func_exit_; + + return prtnframe; + +} + + +static int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) +{ +#ifdef PLATFORM_LINUX //for amsdu TP improvement,Creator: Thomas + int a_len, padding_len; + u16 eth_type, nSubframe_Length; + u8 nr_subframes, i; + unsigned char *data_ptr, *pdata; + struct rx_pkt_attrib *pattrib; + _pkt *sub_skb,*subframes[MAX_SUBFRAME_COUNT]; + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &(precvpriv->free_recv_queue); + int ret = _SUCCESS; + + nr_subframes = 0; + + pattrib = &prframe->u.hdr.attrib; + + recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen); + + if(prframe->u.hdr.attrib.iv_len >0) + { + recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len); + } + + a_len = prframe->u.hdr.len; + + pdata = prframe->u.hdr.rx_data; + + while(a_len > ETH_HLEN) { + + /* Offset 12 denote 2 mac address */ + //nSubframe_Length = *((u16*)(pdata + 12)); + //==m==>change the length order + //nSubframe_Length = (nSubframe_Length>>8) + (nSubframe_Length<<8); + //nSubframe_Length = ntohs(*((u16*)(pdata + 12))); + nSubframe_Length = RTW_GET_BE16(pdata + 12); + + //ntohs(nSubframe_Length); + + if( a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length) ) { + DBG_8192C("nRemain_Length is %d and nSubframe_Length is : %d\n",a_len,nSubframe_Length); + goto exit; + } + + /* move the data point to data content */ + pdata += ETH_HLEN; + a_len -= ETH_HLEN; + + /* Allocate new skb for releasing to upper layer */ +#ifdef CONFIG_SKB_COPY + sub_skb = dev_alloc_skb(nSubframe_Length + 12); + if(sub_skb) + { + skb_reserve(sub_skb, 12); + data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length); + _rtw_memcpy(data_ptr, pdata, nSubframe_Length); + } + else + { +#endif // CONFIG_SKB_COPY + sub_skb = skb_clone(prframe->u.hdr.pkt, GFP_ATOMIC); + if(sub_skb) + { + sub_skb->data = pdata; + sub_skb->len = nSubframe_Length; + sub_skb->tail = sub_skb->data + nSubframe_Length; + } + else + { + DBG_8192C("skb_clone() Fail!!! , nr_subframes = %d\n",nr_subframes); + break; + } + } + + //sub_skb->dev = padapter->pnetdev; + subframes[nr_subframes++] = sub_skb; + if(nr_subframes >= MAX_SUBFRAME_COUNT) { + DBG_8192C("ParseSubframe(): Too many Subframes! Packets dropped!\n"); + break; + } + + pdata += nSubframe_Length; + a_len -= nSubframe_Length; + if(a_len != 0) { + padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4-1)); + if(padding_len == 4) { + padding_len = 0; + } + + if(a_len < padding_len) { + goto exit; + } + pdata += padding_len; + a_len -= padding_len; + } + } + + for(i=0; idata[6] << 8) | sub_skb->data[7]; + //eth_type = ntohs(*(u16*)&sub_skb->data[6]); + eth_type = RTW_GET_BE16(&sub_skb->data[6]); + if (sub_skb->len >= 8 && + ((_rtw_memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) && + eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || + _rtw_memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) )) { + /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ + skb_pull(sub_skb, SNAP_SIZE); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); + } else { + u16 len; + /* Leave Ethernet header part of hdr and full payload */ + len = htons(sub_skb->len); + _rtw_memcpy(skb_push(sub_skb, 2), &len, 2); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); + } + + /* Indicat the packets to upper layer */ + if (sub_skb) { + //memset(sub_skb->cb, 0, sizeof(sub_skb->cb)); + + sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev); + sub_skb->dev = padapter->pnetdev; + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) { + sub_skb->ip_summed = CHECKSUM_UNNECESSARY; + } else { + sub_skb->ip_summed = CHECKSUM_NONE; + } +#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */ + sub_skb->ip_summed = CHECKSUM_NONE; +#endif + + netif_rx(sub_skb); + } + } + +exit: + + prframe->u.hdr.len=0; + rtw_free_recvframe(prframe, pfree_recv_queue);//free this recv_frame + + return ret; +#else + _irqL irql; + unsigned char *ptr, *pdata, *pbuf, *psnap_type; + union recv_frame *pnrframe, *pnrframe_new; + int a_len, mv_len, padding_len; + u16 eth_type, type_len; + u8 bsnaphdr; + struct ieee80211_snap_hdr *psnap; + struct _vlan *pvlan; + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &(precvpriv->free_recv_queue); + int ret = _SUCCESS; +#ifdef PLATFORM_WINDOWS + struct recv_buf *precvbuf = prframe->u.hdr.precvbuf; +#endif + a_len = prframe->u.hdr.len - prframe->u.hdr.attrib.hdrlen; + + recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen); + + if(prframe->u.hdr.attrib.iv_len >0) + { + recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len); + } + + pdata = prframe->u.hdr.rx_data; + + prframe->u.hdr.len=0; + + pnrframe = prframe; + + + do{ + + mv_len=0; + pnrframe->u.hdr.rx_data = pnrframe->u.hdr.rx_tail = pdata; + ptr = pdata; + + + _rtw_memcpy(pnrframe->u.hdr.attrib.dst, ptr, ETH_ALEN); + ptr+=ETH_ALEN; + _rtw_memcpy(pnrframe->u.hdr.attrib.src, ptr, ETH_ALEN); + ptr+=ETH_ALEN; + + _rtw_memcpy(&type_len, ptr, 2); + type_len= ntohs((unsigned short )type_len); + ptr +=2; + mv_len += ETH_HLEN; + + recvframe_put(pnrframe, type_len+ETH_HLEN);//update tail; + + if(pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8) + { + //panic("pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8\n"); + + rtw_free_recvframe(pnrframe, pfree_recv_queue); + + goto exit; + } + + psnap=(struct ieee80211_snap_hdr *)(ptr); + psnap_type=ptr+SNAP_SIZE; + if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03) + { + if ( _rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)) + { + bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; + } + else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) && + _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) ) + { + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; + } + else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) + { + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n")); + + //KeBugCheckEx(0x87123333, 0xe0, 0x4c, 0x87, 0xdd); + + //panic("0x87123333, 0xe0, 0x4c, 0x87, 0xdd\n"); + + rtw_free_recvframe(pnrframe, pfree_recv_queue); + + goto exit; + } + + } + else + { + bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; + } + + ptr += (bsnaphdr?SNAP_SIZE:0); + _rtw_memcpy(ð_type, ptr, 2); + eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type + + mv_len+= 2+(bsnaphdr?SNAP_SIZE:0); + ptr += 2;//now move to iphdr; + + pvlan = NULL; + if(eth_type == 0x8100) //vlan + { + pvlan = (struct _vlan *)ptr; + ptr+=4; + mv_len+=4; + } + + if(eth_type==0x0800)//ip + { + struct iphdr* piphdr = (struct iphdr*)ptr; + + + if (piphdr->protocol == 0x06) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", pnrframe->u.hdr.len)); + } + } +#ifdef PLATFORM_OS_XP + else + { + NDIS_PACKET_8021Q_INFO VlanPriInfo; + UINT32 UserPriority = pnrframe->u.hdr.attrib.priority; + UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 ); + + VlanPriInfo.Value = // Get current value. + NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo); + + VlanPriInfo.TagHeader.UserPriority = UserPriority; + VlanPriInfo.TagHeader.VlanId = VlanID; + + VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero. + VlanPriInfo.TagHeader.Reserved = 0; // Should be zero. + NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; + + } +#endif + + pbuf = recvframe_pull(pnrframe, (mv_len-sizeof(struct ethhdr))); + + _rtw_memcpy(pbuf, pnrframe->u.hdr.attrib.dst, ETH_ALEN); + _rtw_memcpy(pbuf+ETH_ALEN, pnrframe->u.hdr.attrib.src, ETH_ALEN); + + eth_type = htons((unsigned short)eth_type) ; + _rtw_memcpy(pbuf+12, ð_type, 2); + + padding_len = (4) - ((type_len + ETH_HLEN)&(4-1)); + + a_len -= (type_len + ETH_HLEN + padding_len) ; + + +#if 0 + + if(a_len > ETH_HLEN) + { + pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue); + if(pnrframe_new) + { + _pkt *pskb_copy; + unsigned int copy_len = pnrframe->u.hdr.len; + + _rtw_init_listhead(&pnrframe_new->u.hdr.list); + + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pskb_copy = dev_alloc_skb(copy_len+64); + #else + pskb_copy = netdev_alloc_skb(padapter->pnetdev, copy_len + 64); + #endif + if(pskb_copy==NULL) + { + DBG_8192C("amsdu_to_msdu:can not all(ocate memory for skb copy\n"); + } + + pnrframe_new->u.hdr.pkt = pskb_copy; + + _rtw_memcpy(pskb_copy->data, pnrframe->u.hdr.rx_data, copy_len); + + pnrframe_new->u.hdr.rx_data = pnrframe->u.hdr.rx_data; + pnrframe_new->u.hdr.rx_tail = pnrframe->u.hdr.rx_data + copy_len; + + + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) + { + rtw_recv_indicatepkt(padapter, pnrframe_new);//indicate this recv_frame + } + else + { + rtw_free_recvframe(pnrframe_new, pfree_recv_queue);//free this recv_frame + } + + } + else + { + DBG_8192C("amsdu_to_msdu:can not allocate memory for pnrframe_new\n"); + } + + } + else + { + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) + { + rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame + } + else + { + rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame + } + + pnrframe = NULL; + + } + +#else + + //padding_len = (4) - ((type_len + ETH_HLEN)&(4-1)); + + //a_len -= (type_len + ETH_HLEN + padding_len) ; + + pnrframe_new = NULL; + + + if(a_len > ETH_HLEN) + { + pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue); + + if(pnrframe_new) + { + + + //pnrframe_new->u.hdr.precvbuf = precvbuf;//precvbuf is assigned before call rtw_init_recvframe() + //rtw_init_recvframe(pnrframe_new, precvpriv); + { + _pkt *pskb = pnrframe->u.hdr.pkt; + _rtw_init_listhead(&pnrframe_new->u.hdr.list); + + pnrframe_new->u.hdr.len=0; + +#ifdef PLATFORM_LINUX + if(pskb) + { + pnrframe_new->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + } +#endif + + } + + pdata += (type_len + ETH_HLEN + padding_len); + pnrframe_new->u.hdr.rx_head = pnrframe_new->u.hdr.rx_data = pnrframe_new->u.hdr.rx_tail = pdata; + pnrframe_new->u.hdr.rx_end = pdata + a_len + padding_len;// + +#ifdef PLATFORM_WINDOWS + pnrframe_new->u.hdr.precvbuf=precvbuf; + _enter_critical_bh(&precvbuf->recvbuf_lock, &irql); + precvbuf->ref_cnt++; + _exit_critical_bh(&precvbuf->recvbuf_lock, &irql); +#endif + + } + else + { + //panic("pnrframe_new=%x\n", pnrframe_new); + } + } + + + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE) ) + { + rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame + } + else + { + rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame + } + + + pnrframe = NULL; + if(pnrframe_new) + { + pnrframe = pnrframe_new; + } + + +#endif + + }while(pnrframe); + +exit: + + return ret; +#endif +} + + +static int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num) +{ + u8 wsize = preorder_ctrl->wsize_b; + u16 wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;//% 4096; + + // Rx Reorder initialize condition. + if (preorder_ctrl->indicate_seq == 0xFFFF) + { + preorder_ctrl->indicate_seq = seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); + #endif + + //DbgPrint("check_indicate_seq, 1st->indicate_seq=%d\n", precvpriv->indicate_seq); + } + + //DbgPrint("enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + // Drop out the packet which SeqNum is smaller than WinStart + if( SN_LESS(seq_num, preorder_ctrl->indicate_seq) ) + { + //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); + //DbgPrint("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, + preorder_ctrl->indicate_seq, seq_num); + #endif + + + return _FALSE; + } + + // + // Sliding window manipulation. Conditions includes: + // 1. Incoming SeqNum is equal to WinStart =>Window shift 1 + // 2. Incoming SeqNum is larger than the WinEnd => Window shift N + // + if( SN_EQUAL(seq_num, preorder_ctrl->indicate_seq) ) + { + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); + #endif + } + else if(SN_LESS(wend, seq_num)) + { + //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); + //DbgPrint("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + // boundary situation, when seq_num cross 0xFFF + if(seq_num >= (wsize - 1)) + preorder_ctrl->indicate_seq = seq_num + 1 -wsize; + else + preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1; + + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); + #endif + } + + //DbgPrint("exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + return _TRUE; +} + + +static int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe) +{ + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + _list *phead, *plist; + union recv_frame *pnextrframe; + struct rx_pkt_attrib *pnextattrib; + + //DbgPrint("+enqueue_reorder_recvframe()\n"); + + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + + + phead = get_list_head(ppending_recvframe_queue); + plist = get_next(phead); + + while(rtw_end_of_queue_search(phead, plist) == _FALSE) + { + pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u); + pnextattrib = &pnextrframe->u.hdr.attrib; + + if(SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) + { + plist = get_next(plist); + } + else if( SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) + { + //Duplicate entry is found!! Do not insert current entry. + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); + + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + + return _FALSE; + } + else + { + break; + } + + //DbgPrint("enqueue_reorder_recvframe():while\n"); + + } + + + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + + rtw_list_delete(&(prframe->u.hdr.list)); + + rtw_list_insert_tail(&(prframe->u.hdr.list), plist); + + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + + + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); + return _TRUE; + +} + + +static int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced) +{ + _irqL irql; + //u8 bcancelled; + _list *phead, *plist; + union recv_frame *prframe; + struct rx_pkt_attrib *pattrib; + //u8 index = 0; + int bPktInBuf = _FALSE; + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + + //DbgPrint("+recv_indicatepkts_in_order\n"); + + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + + phead = get_list_head(ppending_recvframe_queue); + plist = get_next(phead); + +#if 0 + // Check if there is any other indication thread running. + if(pTS->RxIndicateState == RXTS_INDICATE_PROCESSING) + return; +#endif + + // Handling some condition for forced indicate case. + if(bforced==_TRUE) + { + if(rtw_is_list_empty(phead)) + { + // _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); + return _TRUE; + } + + prframe = LIST_CONTAINOR(plist, union recv_frame, u); + pattrib = &prframe->u.hdr.attrib; + preorder_ctrl->indicate_seq = pattrib->seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + } + + // Prepare indication list and indication. + // Check if there is any packet need indicate. + while(!rtw_is_list_empty(phead)) + { + if(plist == phead) + break; + + prframe = LIST_CONTAINOR(plist, union recv_frame, u); + pattrib = &prframe->u.hdr.attrib; + + if(!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, + ("recv_indicatepkts_in_order: indicate=%d seq=%d amsdu=%d\n", + preorder_ctrl->indicate_seq, pattrib->seq_num, pattrib->amsdu)); + +#if 0 + // This protect buffer from overflow. + if(index >= REORDER_WIN_SIZE) + { + RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!! \n")); + bPktInBuf = TRUE; + break; + } +#endif + + plist = get_next(plist); + rtw_list_delete(&(prframe->u.hdr.list)); + + if(SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) + { + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + } + +#if 0 + index++; + if(index==1) + { + //Cancel previous pending timer. + //PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer); + if(bforced!=_TRUE) + { + //DBG_8192C("_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\n"); + _cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled); + } + } +#endif + + //Set this as a lock to make sure that only one thread is indicating packet. + //pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; + + // Indicate packets + //RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!! \n")); + + + //indicate this recv_frame + //DbgPrint("recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\n", precvpriv->indicate_seq, pattrib->seq_num); + if(!pattrib->amsdu) + { + //DBG_8192C("recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\n", preorder_ctrl->indicate_seq, pattrib->seq_num); + + if ((padapter->bDriverStopped == _FALSE) && + (padapter->bSurpriseRemoved == _FALSE)) + { + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);//unlock before indicate packet + + rtw_recv_indicatepkt(padapter, prframe); //indicate this recv_frame + + _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); + + } + } + else if(pattrib->amsdu==1) + { + if(amsdu_to_msdu(padapter, prframe)!=_SUCCESS) + { + rtw_free_recvframe(prframe, &precvpriv->free_recv_queue); + } + } + else + { + //error condition; + } + + + //Update local variables. + bPktInBuf = _FALSE; + + } + else + { + bPktInBuf = _TRUE; + break; + } + + //DbgPrint("recv_indicatepkts_in_order():while\n"); + + } + + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + +/* + //Release the indication lock and set to new indication step. + if(bPktInBuf) + { + // Set new pending timer. + //pTS->RxIndicateState = RXTS_INDICATE_REORDER; + //PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime); + //DBG_8192C("_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME)\n"); + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + } + else + { + //pTS->RxIndicateState = RXTS_INDICATE_IDLE; + } +*/ + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + + //return _TRUE; + return bPktInBuf; + +} + + +static int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) +{ + _irqL irql; + int retval = _SUCCESS; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + + if(!pattrib->amsdu) + { + //s1. + wlanhdr_to_ethhdr(prframe); + + if(pattrib->qos !=1 /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/) + { + if ((padapter->bDriverStopped == _FALSE) && + (padapter->bSurpriseRemoved == _FALSE)) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n" )); + + rtw_recv_indicatepkt(padapter, prframe); + return _SUCCESS; + + } + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s pattrib->qos !=1\n", __FUNCTION__); + #endif + + return _FAIL; + + } + + if (preorder_ctrl->enable == _FALSE) + { + //indicate this recv_frame + preorder_ctrl->indicate_seq = pattrib->seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + rtw_recv_indicatepkt(padapter, prframe); + + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + return _SUCCESS; + } + +#ifndef CONFIG_RECV_REORDERING_CTRL + //indicate this recv_frame + rtw_recv_indicatepkt(padapter, prframe); + return _SUCCESS; +#endif + + } + else if(pattrib->amsdu==1) //temp filter -> means didn't support A-MSDUs in a A-MPDU + { + if (preorder_ctrl->enable == _FALSE) + { + preorder_ctrl->indicate_seq = pattrib->seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + retval = amsdu_to_msdu(padapter, prframe); + + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + if(retval != _SUCCESS){ + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); + #endif + } + + return retval; + } + } + else + { + + } + + _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); + + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, + ("recv_indicatepkt_reorder: indicate=%d seq=%d\n", + preorder_ctrl->indicate_seq, pattrib->seq_num)); + + //s2. check if winstart_b(indicate_seq) needs to been updated + if(!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) + { + //pHTInfo->RxReorderDropCounter++; + //ReturnRFDList(Adapter, pRfd); + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("RxReorderIndicatePacket() ==> Packet Drop!!\n")); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + //return _FAIL; + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s check_indicate_seq fail\n", __FUNCTION__); + #endif + goto _err_exit; + } + + + //s3. Insert all packet into Reorder Queue to maintain its ordering. + if(!enqueue_reorder_recvframe(preorder_ctrl, prframe)) + { + //DbgPrint("recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\n"); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + //return _FAIL; + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\n", __FUNCTION__); + #endif + goto _err_exit; + } + + + //s4. + // Indication process. + // After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets + // with the SeqNum smaller than latest WinStart and buffer other packets. + // + // For Rx Reorder condition: + // 1. All packets with SeqNum smaller than WinStart => Indicate + // 2. All packets with SeqNum larger than or equal to WinStart => Buffer it. + // + + //recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE); + if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE)==_TRUE) + { + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + } + else + { + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); + } + + + return _SUCCESS; + +_err_exit: + + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + + return _FAIL; +} + + +void rtw_reordering_ctrl_timeout_handler(void *pcontext) +{ + _irqL irql; + struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)pcontext; + _adapter *padapter = preorder_ctrl->padapter; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + + + if(padapter->bDriverStopped ||padapter->bSurpriseRemoved) + { + return; + } + + //DBG_8192C("+rtw_reordering_ctrl_timeout_handler()=>\n"); + + _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); + + if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE)==_TRUE) + { + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + } + + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + +} + + +static int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe) +{ + int retval = _SUCCESS; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +#ifdef CONFIG_80211N_HT + + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + if(phtpriv->ht_option==_TRUE) //B/G/N Mode + { + //prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; + + if(recv_indicatepkt_reorder(padapter, prframe)!=_SUCCESS)// including perform A-MPDU Rx Ordering Buffer Control + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\n", __FUNCTION__); + #endif + + if ((padapter->bDriverStopped == _FALSE) && + (padapter->bSurpriseRemoved == _FALSE)) + { + retval = _FAIL; + return retval; + } + } + } + else //B/G mode +#endif + { + retval=wlanhdr_to_ethhdr (prframe); + if(retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__); + #endif + return retval; + } + + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) + { + //indicate this recv_frame + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n" )); + rtw_recv_indicatepkt(padapter, prframe); + + + } + else + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n" )); + + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + retval = _FAIL; + return retval; + } + + } + + return retval; + +} + + +static int recv_func(_adapter *padapter, void *pcontext) +{ + struct rx_pkt_attrib *pattrib; + union recv_frame *prframe, *orig_prframe; + int retval = _SUCCESS; + _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TDLS + u8 *psnap_type, *pcategory; +#endif + + prframe = (union recv_frame *)pcontext; + orig_prframe = prframe; + + pattrib = &prframe->u.hdr.attrib; + +#ifdef CONFIG_MP_INCLUDED + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0)) + { + if (pattrib->crc_err == 1) + padapter->mppriv.rx_crcerrpktcount++; + else + padapter->mppriv.rx_pktcount++; + + if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n")); + retval = _FAIL; + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + } +#endif + + //check the frame crtl field and decache + retval = validate_recv_frame(padapter, prframe); + if (retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recv_func: validate_recv_frame fail! drop pkt\n")); + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + // DATA FRAME + rtw_led_control(padapter, LED_CTL_RX); + + prframe = decryptor(padapter, prframe); + if (prframe == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decryptor: drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__); + #endif + retval = _FAIL; + goto _exit_recv_func; + } + +#ifdef CONFIG_TDLS + //check TDLS frame + psnap_type = get_recvframe_data(orig_prframe); + psnap_type+=pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + //[+2]: ether_type, [+1]: payload type + pcategory = psnap_type+2+1; + if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))&&((*pcategory==0x0c))){ + retval = OnTDLS(padapter, prframe); //all of functions will return _FAIL + goto _exit_recv_func; + } +#endif + + prframe = recvframe_chk_defrag(padapter, prframe); + if(prframe==NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chk_defrag: drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__); + #endif + goto _exit_recv_func; + } + + prframe=portctrl(padapter, prframe); + if (prframe == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("portctrl: drop pkt \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__); + #endif + retval = _FAIL; + goto _exit_recv_func; + } + + count_rx_stats(padapter, prframe); + +#ifdef CONFIG_80211N_HT + + retval = process_recv_indicatepkts(padapter, prframe); + if (retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recv_func: process_recv_indicatepkts fail! \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s recv_func: process_recv_indicatepkts fail!\n", __FUNCTION__); + #endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + +#else + + if (!pattrib->amsdu) + { + retval = wlanhdr_to_ethhdr (prframe); + if (retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__); + #endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + + if ((padapter->bDriverStopped == _FALSE) && (padapter->bSurpriseRemoved == _FALSE)) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: recv_func rtw_recv_indicatepkt\n" )); + //indicate this recv_frame + retval = rtw_recv_indicatepkt(padapter, prframe); + if (retval != _SUCCESS) + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__); + #endif + goto _exit_recv_func; + } + } + else + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: rtw_free_recvframe\n" )); + RT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", __FUNCTION__, + padapter->bDriverStopped, padapter->bSurpriseRemoved); + #endif + retval = _FAIL; + rtw_free_recvframe(orig_prframe, pfree_recv_queue); //free this recv_frame + } + + } + else if(pattrib->amsdu==1) + { + + retval = amsdu_to_msdu(padapter, prframe); + if(retval != _SUCCESS) + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); + #endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue); + goto _exit_recv_func; + } + } + else + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s what is this condition??\n", __FUNCTION__); + #endif + } +#endif + + +_exit_recv_func: + + return retval; +} + + +s32 rtw_recv_entry(union recv_frame *precvframe) +{ + _adapter *padapter; + struct recv_priv *precvpriv; + //struct mlme_priv *pmlmepriv ; + //struct dvobj_priv *pdev; + //u8 *phead, *pdata, *ptail,*pend; + + //_queue *pfree_recv_queue, *ppending_recv_queue; + //u8 blk_mode = _FALSE; + s32 ret=_SUCCESS; + //struct intf_hdl * pintfhdl; + +_func_enter_; + +// RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("+rtw_recv_entry\n")); + + padapter = precvframe->u.hdr.adapter; + //pintfhdl = &padapter->iopriv.intf; + + //pdev=&padapter->dvobjpriv; + //pmlmepriv = &padapter->mlmepriv; + precvpriv = &padapter->recvpriv; + //pfree_recv_queue = &precvpriv->free_recv_queue; + //ppending_recv_queue = &precvpriv->recv_pending_queue; + + //phead = precvframe->u.hdr.rx_head; + //pdata = precvframe->u.hdr.rx_data; + //ptail = precvframe->u.hdr.rx_tail; + //pend = precvframe->u.hdr.rx_end; + + //rtw_led_control(padapter, LED_CTL_RX); + +#ifdef CONFIG_SDIO_HCI + if (precvpriv->free_recvframe_cnt <= 1) + goto _recv_entry_drop; +#endif + +#ifdef CONFIG_RECV_THREAD_MODE + if (_rtw_queue_empty(ppending_recv_queue) == _TRUE) + { + //enqueue_recvframe_usb(precvframe, ppending_recv_queue);//enqueue to recv_pending_queue + rtw_enqueue_recvframe(precvframe, ppending_recv_queue); + _rtw_up_sema(&precvpriv->recv_sema); + } + else + { + //enqueue_recvframe_usb(precvframe, ppending_recv_queue);//enqueue to recv_pending_queue + rtw_enqueue_recvframe(precvframe, ppending_recv_queue); + } +#else + if ((ret = recv_func(padapter, precvframe)) == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("rtw_recv_entry: recv_func return fail!!!\n")); + goto _recv_entry_drop; + } +#endif + + precvpriv->rx_pkts++; + +_func_exit_; + + return ret; + +_recv_entry_drop: + + + precvpriv->rx_drop++; + +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.rx_pktloss = precvpriv->rx_drop; +#endif + + //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("_recv_entry_drop\n")); + +_func_exit_; + + return ret; +} + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS +RTW_DECLARE_TIMER_HDL(signal_stat){ +//void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ + _adapter *adapter = (_adapter *)FunctionContext; + struct recv_priv *recvpriv = &adapter->recvpriv; + + u32 tmp_s, tmp_q; + u8 avg_signal_strength = 0; + u8 avg_signal_qual = 0; + u32 num_signal_strength = 0; + u32 num_signal_qual = 0; + u8 _alpha = 3; // this value is based on converging_constant = 5000 and sampling_interval = 1000 + + if(recvpriv->signal_strength_data.update_req == 0) {// update_req is clear, means we got rx + avg_signal_strength = recvpriv->signal_strength_data.avg_val; + avg_signal_qual = recvpriv->signal_qual_data.avg_val; + } + + if(recvpriv->signal_qual_data.update_req == 0) {// update_req is clear, means we got rx + num_signal_strength = recvpriv->signal_strength_data.total_num; + num_signal_qual = recvpriv->signal_qual_data.total_num; + } + + // after avg_vals are accquired, we can re-stat the signal values + recvpriv->signal_strength_data.update_req = 1; + recvpriv->signal_qual_data.update_req = 1; + + //update value of signal_strength, rssi, signal_qual + if(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _FALSE) { + tmp_s = (avg_signal_strength+(_alpha-1)*recvpriv->signal_strength); + if(tmp_s %_alpha) + tmp_s = tmp_s/_alpha + 1; + else + tmp_s = tmp_s/_alpha; + if(tmp_s>100) + tmp_s = 100; + + tmp_q = (avg_signal_qual+(_alpha-1)*recvpriv->signal_qual); + if(tmp_q %_alpha) + tmp_q = tmp_q/_alpha + 1; + else + tmp_q = tmp_q/_alpha; + if(tmp_q>100) + tmp_q = 100; + + recvpriv->signal_strength = tmp_s; + recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s); + recvpriv->signal_qual = tmp_q; + + #if 0 + DBG_871X("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u" + ", num_signal_strength:%u, num_signal_qual:%u" + "\n" + , __FUNCTION__ + , recvpriv->signal_strength + , recvpriv->rssi + , recvpriv->signal_qual + , num_signal_strength, num_signal_qual + ); + #endif + } + + rtw_set_signal_stat_timer(recvpriv); + +} +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_rf.c b/drivers/net/wireless/rtl8192c/core/rtw_rf.c new file mode 100755 index 000000000000..665c7e5b9d15 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_rf.c @@ -0,0 +1,96 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_RF_C_ + +#include +#include +#include +#include +#include + + +struct ch_freq { + u32 channel; + u32 frequency; +}; + +struct ch_freq ch_freq_map[] = { + {1, 2412},{2, 2417},{3, 2422},{4, 2427},{5, 2432}, + {6, 2437},{7, 2442},{8, 2447},{9, 2452},{10, 2457}, + {11, 2462},{12, 2467},{13, 2472},{14, 2484}, + /* UNII */ + {36, 5180},{40, 5200},{44, 5220},{48, 5240},{52, 5260}, + {56, 5280},{60, 5300},{64, 5320},{149, 5745},{153, 5765}, + {157, 5785},{161, 5805},{165, 5825},{167, 5835},{169, 5845}, + {171, 5855},{173, 5865}, + /* HiperLAN2 */ + {100, 5500},{104, 5520},{108, 5540},{112, 5560},{116, 5580}, + {120, 5600},{124, 5620},{128, 5640},{132, 5660},{136, 5680}, + {140, 5700}, + /* Japan MMAC */ + {34, 5170},{38, 5190},{42, 5210},{46, 5230}, + /* Japan */ + {184, 4920},{188, 4940},{192, 4960},{196, 4980}, + {208, 5040},/* Japan, means J08 */ + {212, 5060},/* Japan, means J12 */ + {216, 5080},/* Japan, means J16 */ +}; + +int ch_freq_map_num = (sizeof(ch_freq_map) / sizeof(struct ch_freq)); + +u32 rtw_ch2freq(u32 channel) +{ + u8 i; + u32 freq = 0; + + for (i = 0; i < ch_freq_map_num; i++) + { + if (channel == ch_freq_map[i].channel) + { + freq = ch_freq_map[i].frequency; + break; + } + } + if (i == ch_freq_map_num) + freq = 2412; + + return freq; +} + +u32 rtw_freq2ch(u32 freq) +{ + u8 i; + u32 ch = 0; + + for (i = 0; i < ch_freq_map_num; i++) + { + if (freq == ch_freq_map[i].frequency) + { + ch = ch_freq_map[i].channel; + break; + } + } + if (i == ch_freq_map_num) + ch = 1; + + return ch; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_security.c b/drivers/net/wireless/rtl8192c/core/rtw_security.c new file mode 100755 index 000000000000..ec3a98f3f43e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_security.c @@ -0,0 +1,2811 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_SECURITY_C_ + +#include +#include +#include +#include +#include + + +//=====WEP related===== + +#define CRC32_POLY 0x04c11db7 + +struct arc4context +{ + u32 x; + u32 y; + u8 state[256]; +}; + + +static void arcfour_init(struct arc4context *parc4ctx, u8 * key,u32 key_len) +{ + u32 t, u; + u32 keyindex; + u32 stateindex; + u8 * state; + u32 counter; +_func_enter_; + state = parc4ctx->state; + parc4ctx->x = 0; + parc4ctx->y = 0; + for (counter = 0; counter < 256; counter++) + state[counter] = (u8)counter; + keyindex = 0; + stateindex = 0; + for (counter = 0; counter < 256; counter++) + { + t = state[counter]; + stateindex = (stateindex + key[keyindex] + t) & 0xff; + u = state[stateindex]; + state[stateindex] = (u8)t; + state[counter] = (u8)u; + if (++keyindex >= key_len) + keyindex = 0; + } +_func_exit_; +} +static u32 arcfour_byte( struct arc4context *parc4ctx) +{ + u32 x; + u32 y; + u32 sx, sy; + u8 * state; +_func_enter_; + state = parc4ctx->state; + x = (parc4ctx->x + 1) & 0xff; + sx = state[x]; + y = (sx + parc4ctx->y) & 0xff; + sy = state[y]; + parc4ctx->x = x; + parc4ctx->y = y; + state[y] = (u8)sx; + state[x] = (u8)sy; +_func_exit_; + return state[(sx + sy) & 0xff]; +} + + +static void arcfour_encrypt( struct arc4context *parc4ctx, + u8 * dest, + u8 * src, + u32 len) +{ + u32 i; +_func_enter_; + for (i = 0; i < len; i++) + dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx); +_func_exit_; +} + +static sint bcrc32initialized = 0; +static u32 crc32_table[256]; + + +static u8 crc32_reverseBit( u8 data) +{ + return( (u8)((data<<7)&0x80) | ((data<<5)&0x40) | ((data<<3)&0x20) | ((data<<1)&0x10) | ((data>>1)&0x08) | ((data>>3)&0x04) | ((data>>5)&0x02) | ((data>>7)&0x01) ); +} + +static void crc32_init(void) +{ +_func_enter_; + if (bcrc32initialized == 1) + goto exit; + else{ + sint i, j; + u32 c; + u8 *p=(u8 *)&c, *p1; + u8 k; + + c = 0x12340000; + + for (i = 0; i < 256; ++i) + { + k = crc32_reverseBit((u8)i); + for (c = ((u32)k) << 24, j = 8; j > 0; --j){ + c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1); + } + p1 = (u8 *)&crc32_table[i]; + + p1[0] = crc32_reverseBit(p[3]); + p1[1] = crc32_reverseBit(p[2]); + p1[2] = crc32_reverseBit(p[1]); + p1[3] = crc32_reverseBit(p[0]); + } + bcrc32initialized= 1; + } +exit: +_func_exit_; +} + +static u32 getcrc32(u8 *buf, sint len) +{ + u8 *p; + u32 crc; +_func_enter_; + if (bcrc32initialized == 0) crc32_init(); + + crc = 0xffffffff; /* preload shift register, per CRC-32 spec */ + + for (p = buf; len > 0; ++p, --len) + { + crc = crc32_table[ (crc ^ *p) & 0xff] ^ (crc >> 8); + } +_func_exit_; + return ~crc; /* transmit complement, per CRC-32 spec */ +} + + +/* + Need to consider the fragment situation +*/ +void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe) +{ // exclude ICV + + unsigned char crc[4]; + struct arc4context mycontext; + + sint curfragnum,length; + u32 keylength; + + u8 *pframe, *payload,*iv; //,*wepkey + u8 wepkey[16]; + struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + +_func_enter_; + + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; +#endif + + //start to encrypt each fragment + if((pattrib->encrypt==_WEP40_)||(pattrib->encrypt==_WEP104_)) + { + keylength=psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex]; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++) + { + iv=pframe+pattrib->hdrlen; + _rtw_memcpy(&wepkey[0], iv, 3); + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); + payload=pframe+pattrib->iv_len+pattrib->hdrlen; + + if((curfragnum+1)==pattrib->nr_frags) + { //the last fragment + + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; + + *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); + + arcfour_init(&mycontext, wepkey,3+keylength); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + } + else + { + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; + *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); + arcfour_init(&mycontext, wepkey,3+keylength); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + pframe+=pxmitpriv->frag_len; + pframe=(u8 *)RND4((SIZE_PTR)(pframe)); + + } + + } + + } + +_func_exit_; + +} + +void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe) +{ + // exclude ICV + u8 crc[4]; + struct arc4context mycontext; + sint length; + u32 keylength; + u8 *pframe, *payload,*iv,wepkey[16]; + u8 keyindex; + struct rx_pkt_attrib *prxattrib = &(((union recv_frame*)precvframe)->u.hdr.attrib); + struct security_priv *psecuritypriv=&padapter->securitypriv; + +_func_enter_; + + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + + //start to decrypt recvframe + if((prxattrib->encrypt==_WEP40_)||(prxattrib->encrypt==_WEP104_)) + { + iv=pframe+prxattrib->hdrlen; + //keyindex=(iv[3]&0x3); + keyindex = prxattrib->key_index; + keylength=psecuritypriv->dot11DefKeylen[keyindex]; + _rtw_memcpy(&wepkey[0], iv, 3); + //_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0],keylength); + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + + payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; + + //decrypt payload include icv + arcfour_init(&mycontext, wepkey,3+keylength); + arcfour_encrypt(&mycontext, payload, payload, length); + + //calculate icv and compare the icv + *((unsigned long *)crc)=le32_to_cpu(getcrc32(payload,length-4)); + + if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) + { + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", + crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); + } + + } + +_func_exit_; + + return; + +} + +//3 =====TKIP related===== + +static u32 secmicgetuint32( u8 * p ) +// Convert from Byte[] to Us4Byte32 in a portable way +{ + s32 i; + u32 res = 0; +_func_enter_; + for( i=0; i<4; i++ ) + { + res |= ((u32)(*p++)) << (8*i); + } +_func_exit_; + return res; +} + +static void secmicputuint32( u8 * p, u32 val ) +// Convert from Us4Byte32 to Byte[] in a portable way +{ + long i; +_func_enter_; + for( i=0; i<4; i++ ) + { + *p++ = (u8) (val & 0xff); + val >>= 8; + } +_func_exit_; +} + +static void secmicclear(struct mic_data *pmicdata) +{ +// Reset the state to the empty message. +_func_enter_; + pmicdata->L = pmicdata->K0; + pmicdata->R = pmicdata->K1; + pmicdata->nBytesInM = 0; + pmicdata->M = 0; +_func_exit_; +} + +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ) +{ + // Set the key +_func_enter_; + pmicdata->K0 = secmicgetuint32( key ); + pmicdata->K1 = secmicgetuint32( key + 4 ); + // and reset the message + secmicclear(pmicdata); +_func_exit_; +} + +void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ) +{ +_func_enter_; + // Append the byte to our word-sized buffer + pmicdata->M |= ((unsigned long)b) << (8*pmicdata->nBytesInM); + pmicdata->nBytesInM++; + // Process the word if it is full. + if( pmicdata->nBytesInM >= 4 ) + { + pmicdata->L ^= pmicdata->M; + pmicdata->R ^= ROL32( pmicdata->L, 17 ); + pmicdata->L += pmicdata->R; + pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8); + pmicdata->L += pmicdata->R; + pmicdata->R ^= ROL32( pmicdata->L, 3 ); + pmicdata->L += pmicdata->R; + pmicdata->R ^= ROR32( pmicdata->L, 2 ); + pmicdata->L += pmicdata->R; + // Clear the buffer + pmicdata->M = 0; + pmicdata->nBytesInM = 0; + } +_func_exit_; +} + +void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes ) +{ +_func_enter_; + // This is simple + while( nbytes > 0 ) + { + rtw_secmicappendbyte(pmicdata, *src++ ); + nbytes--; + } +_func_exit_; +} + +void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ) +{ +_func_enter_; + // Append the minimum padding + rtw_secmicappendbyte(pmicdata, 0x5a ); + rtw_secmicappendbyte(pmicdata, 0 ); + rtw_secmicappendbyte(pmicdata, 0 ); + rtw_secmicappendbyte(pmicdata, 0 ); + rtw_secmicappendbyte(pmicdata, 0 ); + // and then zeroes until the length is a multiple of 4 + while( pmicdata->nBytesInM != 0 ) + { + rtw_secmicappendbyte(pmicdata, 0 ); + } + // The appendByte function has already computed the result. + secmicputuint32( dst, pmicdata->L ); + secmicputuint32( dst+4, pmicdata->R ); + // Reset to the empty message. + secmicclear(pmicdata); +_func_exit_; +} + + +void rtw_seccalctkipmic(u8 * key,u8 *header,u8 *data,u32 data_len,u8 *mic_code, u8 pri) +{ + + struct mic_data micdata; + u8 priority[4]={0x0,0x0,0x0,0x0}; +_func_enter_; + rtw_secmicsetkey(&micdata, key); + priority[0]=pri; + + /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */ + if(header[1]&1){ //ToDS==1 + rtw_secmicappend(&micdata, &header[16], 6); //DA + if(header[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &header[24], 6); + else + rtw_secmicappend(&micdata, &header[10], 6); + } + else{ //ToDS==0 + rtw_secmicappend(&micdata, &header[4], 6); //DA + if(header[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &header[16], 6); + else + rtw_secmicappend(&micdata, &header[10], 6); + + } + rtw_secmicappend(&micdata, &priority[0], 4); + + + rtw_secmicappend(&micdata, data, data_len); + + rtw_secgetmic(&micdata,mic_code); +_func_exit_; +} + + + + +/* macros for extraction/creation of unsigned char/unsigned short values */ +#define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15)) +#define Lo8(v16) ((u8)( (v16) & 0x00FF)) +#define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF)) +#define Lo16(v32) ((u16)( (v32) & 0xFFFF)) +#define Hi16(v32) ((u16)(((v32) >>16) & 0xFFFF)) +#define Mk16(hi,lo) ((lo) ^ (((u16)(hi)) << 8)) + +/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */ +#define TK16(N) Mk16(tk[2*(N)+1],tk[2*(N)]) + +/* S-box lookup: 16 bits --> 16 bits */ +#define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)]) + +/* fixed algorithm "parameters" */ +#define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */ +#define TA_SIZE 6 /* 48-bit transmitter address */ +#define TK_SIZE 16 /* 128-bit temporal key */ +#define P1K_SIZE 10 /* 80-bit Phase1 key */ +#define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */ + + +/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */ +static const unsigned short Sbox1[2][256]= /* Sbox for hash (can be in ROM) */ +{ { + 0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154, + 0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A, + 0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B, + 0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B, + 0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F, + 0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F, + 0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5, + 0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F, + 0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB, + 0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397, + 0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED, + 0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A, + 0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194, + 0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3, + 0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104, + 0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D, + 0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39, + 0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695, + 0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83, + 0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76, + 0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4, + 0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B, + 0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0, + 0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018, + 0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751, + 0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85, + 0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12, + 0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9, + 0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7, + 0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A, + 0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8, + 0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A, + }, + + + { /* second half of table is unsigned char-reversed version of first! */ + 0xA5C6,0x84F8,0x99EE,0x8DF6,0x0DFF,0xBDD6,0xB1DE,0x5491, + 0x5060,0x0302,0xA9CE,0x7D56,0x19E7,0x62B5,0xE64D,0x9AEC, + 0x458F,0x9D1F,0x4089,0x87FA,0x15EF,0xEBB2,0xC98E,0x0BFB, + 0xEC41,0x67B3,0xFD5F,0xEA45,0xBF23,0xF753,0x96E4,0x5B9B, + 0xC275,0x1CE1,0xAE3D,0x6A4C,0x5A6C,0x417E,0x02F5,0x4F83, + 0x5C68,0xF451,0x34D1,0x08F9,0x93E2,0x73AB,0x5362,0x3F2A, + 0x0C08,0x5295,0x6546,0x5E9D,0x2830,0xA137,0x0F0A,0xB52F, + 0x090E,0x3624,0x9B1B,0x3DDF,0x26CD,0x694E,0xCD7F,0x9FEA, + 0x1B12,0x9E1D,0x7458,0x2E34,0x2D36,0xB2DC,0xEEB4,0xFB5B, + 0xF6A4,0x4D76,0x61B7,0xCE7D,0x7B52,0x3EDD,0x715E,0x9713, + 0xF5A6,0x68B9,0x0000,0x2CC1,0x6040,0x1FE3,0xC879,0xEDB6, + 0xBED4,0x468D,0xD967,0x4B72,0xDE94,0xD498,0xE8B0,0x4A85, + 0x6BBB,0x2AC5,0xE54F,0x16ED,0xC586,0xD79A,0x5566,0x9411, + 0xCF8A,0x10E9,0x0604,0x81FE,0xF0A0,0x4478,0xBA25,0xE34B, + 0xF3A2,0xFE5D,0xC080,0x8A05,0xAD3F,0xBC21,0x4870,0x04F1, + 0xDF63,0xC177,0x75AF,0x6342,0x3020,0x1AE5,0x0EFD,0x6DBF, + 0x4C81,0x1418,0x3526,0x2FC3,0xE1BE,0xA235,0xCC88,0x392E, + 0x5793,0xF255,0x82FC,0x477A,0xACC8,0xE7BA,0x2B32,0x95E6, + 0xA0C0,0x9819,0xD19E,0x7FA3,0x6644,0x7E54,0xAB3B,0x830B, + 0xCA8C,0x29C7,0xD36B,0x3C28,0x79A7,0xE2BC,0x1D16,0x76AD, + 0x3BDB,0x5664,0x4E74,0x1E14,0xDB92,0x0A0C,0x6C48,0xE4B8, + 0x5D9F,0x6EBD,0xEF43,0xA6C4,0xA839,0xA431,0x37D3,0x8BF2, + 0x32D5,0x438B,0x596E,0xB7DA,0x8C01,0x64B1,0xD29C,0xE049, + 0xB4D8,0xFAAC,0x07F3,0x25CF,0xAFCA,0x8EF4,0xE947,0x1810, + 0xD56F,0x88F0,0x6F4A,0x725C,0x2438,0xF157,0xC773,0x5197, + 0x23CB,0x7CA1,0x9CE8,0x213E,0xDD96,0xDC61,0x860D,0x850F, + 0x90E0,0x427C,0xC471,0xAACC,0xD890,0x0506,0x01F7,0x121C, + 0xA3C2,0x5F6A,0xF9AE,0xD069,0x9117,0x5899,0x273A,0xB927, + 0x38D9,0x13EB,0xB32B,0x3322,0xBBD2,0x70A9,0x8907,0xA733, + 0xB62D,0x223C,0x9215,0x20C9,0x4987,0xFFAA,0x7850,0x7AA5, + 0x8F03,0xF859,0x8009,0x171A,0xDA65,0x31D7,0xC684,0xB8D0, + 0xC382,0xB029,0x775A,0x111E,0xCB7B,0xFCA8,0xD66D,0x3A2C, + } +}; + + /* +********************************************************************** +* Routine: Phase 1 -- generate P1K, given TA, TK, IV32 +* +* Inputs: +* tk[] = temporal key [128 bits] +* ta[] = transmitter's MAC address [ 48 bits] +* iv32 = upper 32 bits of IV [ 32 bits] +* Output: +* p1k[] = Phase 1 key [ 80 bits] +* +* Note: +* This function only needs to be called every 2**16 packets, +* although in theory it could be called every packet. +* +********************************************************************** +*/ +static void phase1(u16 *p1k,const u8 *tk,const u8 *ta,u32 iv32) +{ + sint i; +_func_enter_; + /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */ + p1k[0] = Lo16(iv32); + p1k[1] = Hi16(iv32); + p1k[2] = Mk16(ta[1],ta[0]); /* use TA[] as little-endian */ + p1k[3] = Mk16(ta[3],ta[2]); + p1k[4] = Mk16(ta[5],ta[4]); + + /* Now compute an unbalanced Feistel cipher with 80-bit block */ + /* size on the 80-bit block P1K[], using the 128-bit key TK[] */ + for (i=0; i < PHASE1_LOOP_CNT ;i++) + { /* Each add operation here is mod 2**16 */ + p1k[0] += _S_(p1k[4] ^ TK16((i&1)+0)); + p1k[1] += _S_(p1k[0] ^ TK16((i&1)+2)); + p1k[2] += _S_(p1k[1] ^ TK16((i&1)+4)); + p1k[3] += _S_(p1k[2] ^ TK16((i&1)+6)); + p1k[4] += _S_(p1k[3] ^ TK16((i&1)+0)); + p1k[4] += (unsigned short)i; /* avoid "slide attacks" */ + } +_func_exit_; +} + + +/* +********************************************************************** +* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16 +* +* Inputs: +* tk[] = Temporal key [128 bits] +* p1k[] = Phase 1 output key [ 80 bits] +* iv16 = low 16 bits of IV counter [ 16 bits] +* Output: +* rc4key[] = the key used to encrypt the packet [128 bits] +* +* Note: +* The value {TA,IV32,IV16} for Phase1/Phase2 must be unique +* across all packets using the same key TK value. Then, for a +* given value of TK[], this TKIP48 construction guarantees that +* the final RC4KEY value is unique across all packets. +* +* Suggested implementation optimization: if PPK[] is "overlaid" +* appropriately on RC4KEY[], there is no need for the final +* for loop below that copies the PPK[] result into RC4KEY[]. +* +********************************************************************** +*/ +static void phase2(u8 *rc4key,const u8 *tk,const u16 *p1k,u16 iv16) +{ + sint i; + u16 PPK[6]; /* temporary key for mixing */ +_func_enter_; + /* Note: all adds in the PPK[] equations below are mod 2**16 */ + for (i=0;i<5;i++) PPK[i]=p1k[i]; /* first, copy P1K to PPK */ + PPK[5] = p1k[4] +iv16; /* next, add in IV16 */ + + /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */ + PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */ + PPK[1] += _S_(PPK[0] ^ TK16(1)); + PPK[2] += _S_(PPK[1] ^ TK16(2)); + PPK[3] += _S_(PPK[2] ^ TK16(3)); + PPK[4] += _S_(PPK[3] ^ TK16(4)); + PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */ + + /* Final sweep: bijective, "linear". Rotates kill LSB correlations */ + PPK[0] += RotR1(PPK[5] ^ TK16(6)); + PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */ + PPK[2] += RotR1(PPK[1]); + PPK[3] += RotR1(PPK[2]); + PPK[4] += RotR1(PPK[3]); + PPK[5] += RotR1(PPK[4]); + /* Note: At this point, for a given key TK[0..15], the 96-bit output */ + /* value PPK[0..5] is guaranteed to be unique, as a function */ + /* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */ + /* is now a keyed permutation of {TA,IV32,IV16}. */ + + /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */ + rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */ + rc4key[1] =(Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */ + rc4key[2] = Lo8(iv16); + rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1); + + + /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */ + for (i=0;i<6;i++) + { + rc4key[4+2*i] = Lo8(PPK[i]); + rc4key[5+2*i] = Hi8(PPK[i]); + } +_func_exit_; +} + + +//The hlen isn't include the IV +u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe) +{ // exclude ICV + u16 pnl; + u32 pnh; + u8 rc4key[16]; + u8 ttkey[16]; + u8 crc[4]; + struct arc4context mycontext; + sint curfragnum,length; + u32 prwskeylen; + + u8 *pframe, *payload,*iv,*prwskey; + union pn48 dot11txpn; + struct sta_info *stainfo; + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + u32 res=_SUCCESS; +_func_enter_; + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return _FAIL; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; +#endif + + //4 start to encrypt each fragment + if(pattrib->encrypt==_TKIP_){ + + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); + } + + if (stainfo!=NULL){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo!=NULL!!!\n")); + + if(IS_MCAST(pattrib->ra)) + { + prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + } + else + { + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + } + + prwskeylen=16; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++){ + iv=pframe+pattrib->hdrlen; + payload=pframe+pattrib->iv_len+pattrib->hdrlen; + + GET_TKIP_PN(iv, dot11txpn); + + pnl=(u16)(dot11txpn.val); + pnh=(u32)(dot11txpn.val>>16); + + phase1((u16 *)&ttkey[0],prwskey,&pattrib->ta[0],pnh); + + phase2(&rc4key[0],prwskey,(u16 *)&ttkey[0],pnl); + + if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; + RT_TRACE(_module_rtl871x_security_c_,_drv_info_,("pattrib->iv_len =%x, pattrib->icv_len =%x\n", pattrib->iv_len,pattrib->icv_len)); + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ + + arcfour_init(&mycontext, rc4key,16); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + } + else{ + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ + arcfour_init(&mycontext,rc4key,16); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + pframe+=pxmitpriv->frag_len; + pframe=(u8 *)RND4((SIZE_PTR)(pframe)); + + } + } + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } +_func_exit_; + return res; + +} + + +//The hlen isn't include the IV +u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe) +{ // exclude ICV + u16 pnl; + u32 pnh; + u8 rc4key[16]; + u8 ttkey[16]; + u8 crc[4]; + struct arc4context mycontext; + sint length; + u32 prwskeylen; + + u8 *pframe, *payload,*iv,*prwskey; + union pn48 dot11txpn; + struct sta_info *stainfo; + struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; +// struct recv_priv *precvpriv=&padapter->recvpriv; + u32 res=_SUCCESS; + +_func_enter_; + + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + + //4 start to decrypt recvframe + if(prxattrib->encrypt==_TKIP_){ + + stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); + if (stainfo!=NULL){ + + if(IS_MCAST(prxattrib->ra)) + { + DBG_871X("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); + //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; + prwskeylen=16; + } + else + { + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n")); + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + prwskeylen=16; + } + + iv=pframe+prxattrib->hdrlen; + payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + + GET_TKIP_PN(iv, dot11txpn); + + pnl=(u16)(dot11txpn.val); + pnh=(u32)(dot11txpn.val>>16); + + phase1((u16 *)&ttkey[0],prwskey,&prxattrib->ta[0],pnh); + phase2(&rc4key[0],prwskey,(unsigned short *)&ttkey[0],pnl); + + //4 decrypt payload include icv + + arcfour_init(&mycontext, rc4key,16); + arcfour_encrypt(&mycontext, payload, payload, length); + + *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4)); + + if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) + { + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", + crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); + res=_FAIL; + } + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } +_func_exit_; + return res; + +} + + +//3 =====AES related===== + + + +#define MAX_MSG_SIZE 2048 +/*****************************/ +/******** SBOX Table *********/ +/*****************************/ + + static u8 sbox_table[256] = + { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + }; + +/*****************************/ +/**** Function Prototypes ****/ +/*****************************/ + +static void bitwise_xor(u8 *ina, u8 *inb, u8 *out); +static void construct_mic_iv( + u8 *mic_header1, + sint qc_exists, + sint a4_exists, + u8 *mpdu, + uint payload_length, + u8 * pn_vector); +static void construct_mic_header1( + u8 *mic_header1, + sint header_length, + u8 *mpdu); +static void construct_mic_header2( + u8 *mic_header2, + u8 *mpdu, + sint a4_exists, + sint qc_exists); +static void construct_ctr_preload( + u8 *ctr_preload, + sint a4_exists, + sint qc_exists, + u8 *mpdu, + u8 *pn_vector, + sint c); +static void xor_128(u8 *a, u8 *b, u8 *out); +static void xor_32(u8 *a, u8 *b, u8 *out); +static u8 sbox(u8 a); +static void next_key(u8 *key, sint round); +static void byte_sub(u8 *in, u8 *out); +static void shift_row(u8 *in, u8 *out); +static void mix_column(u8 *in, u8 *out); +static void add_round_key( u8 *shiftrow_in, + u8 *mcol_in, + u8 *block_in, + sint round, + u8 *out); +static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext); + + +/****************************************/ +/* aes128k128d() */ +/* Performs a 128 bit AES encrypt with */ +/* 128 bit data. */ +/****************************************/ +static void xor_128(u8 *a, u8 *b, u8 *out) +{ + sint i; +_func_enter_; + for (i=0;i<16; i++) + { + out[i] = a[i] ^ b[i]; + } +_func_exit_; +} + + +static void xor_32(u8 *a, u8 *b, u8 *out) +{ + sint i; +_func_enter_; + for (i=0;i<4; i++) + { + out[i] = a[i] ^ b[i]; + } +_func_exit_; +} + + +static u8 sbox(u8 a) +{ + return sbox_table[(sint)a]; +} + + +static void next_key(u8 *key, sint round) +{ + u8 rcon; + u8 sbox_key[4]; + u8 rcon_table[12] = + { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x1b, 0x36, 0x36, 0x36 + }; +_func_enter_; + sbox_key[0] = sbox(key[13]); + sbox_key[1] = sbox(key[14]); + sbox_key[2] = sbox(key[15]); + sbox_key[3] = sbox(key[12]); + + rcon = rcon_table[round]; + + xor_32(&key[0], sbox_key, &key[0]); + key[0] = key[0] ^ rcon; + + xor_32(&key[4], &key[0], &key[4]); + xor_32(&key[8], &key[4], &key[8]); + xor_32(&key[12], &key[8], &key[12]); +_func_exit_; +} + + +static void byte_sub(u8 *in, u8 *out) +{ + sint i; +_func_enter_; + for (i=0; i< 16; i++) + { + out[i] = sbox(in[i]); + } +_func_exit_; +} + + +static void shift_row(u8 *in, u8 *out) +{ +_func_enter_; + out[0] = in[0]; + out[1] = in[5]; + out[2] = in[10]; + out[3] = in[15]; + out[4] = in[4]; + out[5] = in[9]; + out[6] = in[14]; + out[7] = in[3]; + out[8] = in[8]; + out[9] = in[13]; + out[10] = in[2]; + out[11] = in[7]; + out[12] = in[12]; + out[13] = in[1]; + out[14] = in[6]; + out[15] = in[11]; +_func_exit_; +} + + +static void mix_column(u8 *in, u8 *out) +{ + sint i; + u8 add1b[4]; + u8 add1bf7[4]; + u8 rotl[4]; + u8 swap_halfs[4]; + u8 andf7[4]; + u8 rotr[4]; + u8 temp[4]; + u8 tempb[4]; +_func_enter_; + for (i=0 ; i<4; i++) + { + if ((in[i] & 0x80)== 0x80) + add1b[i] = 0x1b; + else + add1b[i] = 0x00; + } + + swap_halfs[0] = in[2]; /* Swap halfs */ + swap_halfs[1] = in[3]; + swap_halfs[2] = in[0]; + swap_halfs[3] = in[1]; + + rotl[0] = in[3]; /* Rotate left 8 bits */ + rotl[1] = in[0]; + rotl[2] = in[1]; + rotl[3] = in[2]; + + andf7[0] = in[0] & 0x7f; + andf7[1] = in[1] & 0x7f; + andf7[2] = in[2] & 0x7f; + andf7[3] = in[3] & 0x7f; + + for (i = 3; i>0; i--) /* logical shift left 1 bit */ + { + andf7[i] = andf7[i] << 1; + if ((andf7[i-1] & 0x80) == 0x80) + { + andf7[i] = (andf7[i] | 0x01); + } + } + andf7[0] = andf7[0] << 1; + andf7[0] = andf7[0] & 0xfe; + + xor_32(add1b, andf7, add1bf7); + + xor_32(in, add1bf7, rotr); + + temp[0] = rotr[0]; /* Rotate right 8 bits */ + rotr[0] = rotr[1]; + rotr[1] = rotr[2]; + rotr[2] = rotr[3]; + rotr[3] = temp[0]; + + xor_32(add1bf7, rotr, temp); + xor_32(swap_halfs, rotl,tempb); + xor_32(temp, tempb, out); +_func_exit_; +} + + +static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext) +{ + sint round; + sint i; + u8 intermediatea[16]; + u8 intermediateb[16]; + u8 round_key[16]; +_func_enter_; + for(i=0; i<16; i++) round_key[i] = key[i]; + + for (round = 0; round < 11; round++) + { + if (round == 0) + { + xor_128(round_key, data, ciphertext); + next_key(round_key, round); + } + else if (round == 10) + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + xor_128(intermediateb, round_key, ciphertext); + } + else /* 1 - 9 */ + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + mix_column(&intermediateb[0], &intermediatea[0]); + mix_column(&intermediateb[4], &intermediatea[4]); + mix_column(&intermediateb[8], &intermediatea[8]); + mix_column(&intermediateb[12], &intermediatea[12]); + xor_128(intermediatea, round_key, ciphertext); + next_key(round_key, round); + } + } +_func_exit_; +} + + +/************************************************/ +/* construct_mic_iv() */ +/* Builds the MIC IV from header fields and PN */ +/************************************************/ +static void construct_mic_iv( + u8 *mic_iv, + sint qc_exists, + sint a4_exists, + u8 *mpdu, + uint payload_length, + u8 *pn_vector + ) +{ + sint i; +_func_enter_; + mic_iv[0] = 0x59; + if (qc_exists && a4_exists) mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ + if (qc_exists && !a4_exists) mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ + if (!qc_exists) mic_iv[1] = 0x00; + for (i = 2; i < 8; i++) + mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ + #ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */ + #else + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ + #endif + mic_iv[14] = (unsigned char) (payload_length / 256); + mic_iv[15] = (unsigned char) (payload_length % 256); +_func_exit_; +} + + +/************************************************/ +/* construct_mic_header1() */ +/* Builds the first MIC header block from */ +/* header fields. */ +/************************************************/ +static void construct_mic_header1( + u8 *mic_header1, + sint header_length, + u8 *mpdu + ) +{ +_func_enter_; + mic_header1[0] = (u8)((header_length - 2) / 256); + mic_header1[1] = (u8)((header_length - 2) % 256); + mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ + mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ + mic_header1[4] = mpdu[4]; /* A1 */ + mic_header1[5] = mpdu[5]; + mic_header1[6] = mpdu[6]; + mic_header1[7] = mpdu[7]; + mic_header1[8] = mpdu[8]; + mic_header1[9] = mpdu[9]; + mic_header1[10] = mpdu[10]; /* A2 */ + mic_header1[11] = mpdu[11]; + mic_header1[12] = mpdu[12]; + mic_header1[13] = mpdu[13]; + mic_header1[14] = mpdu[14]; + mic_header1[15] = mpdu[15]; +_func_exit_; +} + + +/************************************************/ +/* construct_mic_header2() */ +/* Builds the last MIC header block from */ +/* header fields. */ +/************************************************/ +static void construct_mic_header2( + u8 *mic_header2, + u8 *mpdu, + sint a4_exists, + sint qc_exists + ) +{ + sint i; +_func_enter_; + for (i = 0; i<16; i++) mic_header2[i]=0x00; + + mic_header2[0] = mpdu[16]; /* A3 */ + mic_header2[1] = mpdu[17]; + mic_header2[2] = mpdu[18]; + mic_header2[3] = mpdu[19]; + mic_header2[4] = mpdu[20]; + mic_header2[5] = mpdu[21]; + + //mic_header2[6] = mpdu[22] & 0xf0; /* SC */ + mic_header2[6] = 0x00; + mic_header2[7] = 0x00; /* mpdu[23]; */ + + + if (!qc_exists && a4_exists) + { + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + + } + + if (qc_exists && !a4_exists) + { + mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ + mic_header2[9] = mpdu[25] & 0x00; + } + + if (qc_exists && a4_exists) + { + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + + mic_header2[14] = mpdu[30] & 0x0f; + mic_header2[15] = mpdu[31] & 0x00; + } + +_func_exit_; +} + + +/************************************************/ +/* construct_mic_header2() */ +/* Builds the last MIC header block from */ +/* header fields. */ +/************************************************/ +static void construct_ctr_preload( + u8 *ctr_preload, + sint a4_exists, + sint qc_exists, + u8 *mpdu, + u8 *pn_vector, + sint c + ) +{ + sint i = 0; +_func_enter_; + for (i=0; i<16; i++) ctr_preload[i] = 0x00; + i = 0; + + ctr_preload[0] = 0x01; /* flag */ + if (qc_exists && a4_exists) + ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ + if (qc_exists && !a4_exists) + ctr_preload[1] = mpdu[24] & 0x0f; + + for (i = 2; i < 8; i++) + ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ + #ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */ + #else + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ + #endif + ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */ + ctr_preload[15] = (unsigned char) (c % 256); +_func_exit_; +} + + +/************************************/ +/* bitwise_xor() */ +/* A 128 bit, bitwise exclusive or */ +/************************************/ +static void bitwise_xor(u8 *ina, u8 *inb, u8 *out) +{ + sint i; +_func_enter_; + for (i=0; i<16; i++) + { + out[i] = ina[i] ^ inb[i]; + } +_func_exit_; +} + + +static sint aes_cipher(u8 *key, uint hdrlen, + u8 *pframe, uint plen) +{ +// /*static*/ unsigned char message[MAX_MSG_SIZE]; + uint qc_exists, a4_exists, i, j, payload_remainder, + num_blocks, payload_index; + + u8 pn_vector[6]; + u8 mic_iv[16]; + u8 mic_header1[16]; + u8 mic_header2[16]; + u8 ctr_preload[16]; + + /* Intermediate Buffers */ + u8 chain_buffer[16]; + u8 aes_out[16]; + u8 padded_buffer[16]; + u8 mic[8]; +// uint offset = 0; + uint frtype = GetFrameType(pframe); + uint frsubtype = GetFrameSubType(pframe); + +_func_enter_; + frsubtype=frsubtype>>4; + + + _rtw_memset((void *)mic_iv, 0, 16); + _rtw_memset((void *)mic_header1, 0, 16); + _rtw_memset((void *)mic_header2, 0, 16); + _rtw_memset((void *)ctr_preload, 0, 16); + _rtw_memset((void *)chain_buffer, 0, 16); + _rtw_memset((void *)aes_out, 0, 16); + _rtw_memset((void *)padded_buffer, 0, 16); + + if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) + a4_exists = 0; + else + a4_exists = 1; + + if ( + (frtype == WIFI_DATA_CFACK) || + (frtype == WIFI_DATA_CFPOLL)|| + (frtype == WIFI_DATA_CFACKPOLL)) + { + qc_exists = 1; + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + } + else if ( + (frsubtype == 0x08) || + (frsubtype == 0x09)|| + (frsubtype == 0x0a)|| + (frsubtype == 0x0b)) + { + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + qc_exists = 1; + } + else + qc_exists = 0; + + pn_vector[0]=pframe[hdrlen]; + pn_vector[1]=pframe[hdrlen+1]; + pn_vector[2]=pframe[hdrlen+4]; + pn_vector[3]=pframe[hdrlen+5]; + pn_vector[4]=pframe[hdrlen+6]; + pn_vector[5]=pframe[hdrlen+7]; + + construct_mic_iv( + mic_iv, + qc_exists, + a4_exists, + pframe, //message, + plen, + pn_vector + ); + + construct_mic_header1( + mic_header1, + hdrlen, + pframe //message + ); + construct_mic_header2( + mic_header2, + pframe, //message, + a4_exists, + qc_exists + ); + + + payload_remainder = plen % 16; + num_blocks = plen / 16; + + /* Find start of payload */ + payload_index = (hdrlen + 8); + + /* Calculate MIC */ + aes128k128d(key, mic_iv, aes_out); + bitwise_xor(aes_out, mic_header1, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + bitwise_xor(aes_out, mic_header2, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + + for (i = 0; i < num_blocks; i++) + { + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); + + payload_index += 16; + aes128k128d(key, chain_buffer, aes_out); + } + + /* Add on the final payload block if it needs padding */ + if (payload_remainder > 0) + { + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = pframe[payload_index++];//padded_buffer[j] = message[payload_index++]; + } + bitwise_xor(aes_out, padded_buffer, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + + } + + for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; + + /* Insert MIC into payload */ + for (j = 0; j < 8; j++) + pframe[payload_index+j] = mic[j]; //message[payload_index+j] = mic[j]; + + payload_index = hdrlen + 8; + for (i=0; i< num_blocks; i++) + { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, //message, + pn_vector, + i+1); + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); + for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; + } + + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ + { /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, //message, + pn_vector, + num_blocks+1); + + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = pframe[payload_index+j];//padded_buffer[j] = message[payload_index+j]; + } + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, padded_buffer, chain_buffer); + for (j=0; jattrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + +// uint offset = 0; + u32 res=_SUCCESS; +_func_enter_; + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return _FAIL; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; +#endif + + //4 start to encrypt each fragment + if((pattrib->encrypt==_AES_)){ + + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); + } + + if (stainfo!=NULL){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo!=NULL!!!\n")); + + if(IS_MCAST(pattrib->ra)) + { + prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + } + else + { + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + } + + prwskeylen=16; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++){ + + if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; + + aes_cipher(prwskey,pattrib->hdrlen,pframe, length); + } + else{ + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; + + aes_cipher(prwskey,pattrib->hdrlen,pframe, length); + pframe+=pxmitpriv->frag_len; + pframe=(u8*)RND4((SIZE_PTR)(pframe)); + + } + } + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } + + + +_func_exit_; + return res; +} + +static sint aes_decipher(u8 *key, uint hdrlen, + u8 *pframe, uint plen) +{ + static u8 message[MAX_MSG_SIZE]; + uint qc_exists, a4_exists, i, j, payload_remainder, + num_blocks, payload_index; + + u8 pn_vector[6]; + u8 mic_iv[16]; + u8 mic_header1[16]; + u8 mic_header2[16]; + u8 ctr_preload[16]; + + /* Intermediate Buffers */ + u8 chain_buffer[16]; + u8 aes_out[16]; + u8 padded_buffer[16]; + u8 mic[8]; + + +// uint offset = 0; + uint frtype = GetFrameType(pframe); + uint frsubtype = GetFrameSubType(pframe); +_func_enter_; + frsubtype=frsubtype>>4; + + + _rtw_memset((void *)mic_iv, 0, 16); + _rtw_memset((void *)mic_header1, 0, 16); + _rtw_memset((void *)mic_header2, 0, 16); + _rtw_memset((void *)ctr_preload, 0, 16); + _rtw_memset((void *)chain_buffer, 0, 16); + _rtw_memset((void *)aes_out, 0, 16); + _rtw_memset((void *)padded_buffer, 0, 16); + + //start to decrypt the payload + + num_blocks = (plen-8) / 16; //(plen including llc, payload_length and mic ) + + payload_remainder = (plen-8) % 16; + + pn_vector[0] = pframe[hdrlen]; + pn_vector[1] = pframe[hdrlen+1]; + pn_vector[2] = pframe[hdrlen+4]; + pn_vector[3] = pframe[hdrlen+5]; + pn_vector[4] = pframe[hdrlen+6]; + pn_vector[5] = pframe[hdrlen+7]; + + if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) + a4_exists = 0; + else + a4_exists = 1; + + if ( + (frtype == WIFI_DATA_CFACK) || + (frtype == WIFI_DATA_CFPOLL)|| + (frtype == WIFI_DATA_CFACKPOLL)) + { + qc_exists = 1; + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + } + else if ( + (frsubtype == 0x08) || + (frsubtype == 0x09)|| + (frsubtype == 0x0a)|| + (frsubtype == 0x0b)) + { + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + qc_exists = 1; + } + else + qc_exists = 0; + + + // now, decrypt pframe with hdrlen offset and plen long + + payload_index = hdrlen + 8; // 8 is for extiv + + for (i=0; i< num_blocks; i++) + { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, + pn_vector, + i+1 + ); + + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer); + + for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j]; + } + + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ + { /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, + pn_vector, + num_blocks+1 + ); + + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = pframe[payload_index+j]; + } + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, padded_buffer, chain_buffer); + for (j=0; j 0) + { + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = message[payload_index++]; + } + bitwise_xor(aes_out, padded_buffer, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + + } + + for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; + + /* Insert MIC into payload */ + for (j = 0; j < 8; j++) + message[payload_index+j] = mic[j]; + + payload_index = hdrlen + 8; + for (i=0; i< num_blocks; i++) + { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + message, + pn_vector, + i+1); + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &message[payload_index], chain_buffer); + for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; + } + + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ + { /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + message, + pn_vector, + num_blocks+1); + + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = message[payload_index+j]; + } + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, padded_buffer, chain_buffer); + for (j=0; ju.hdr.attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; +// struct recv_priv *precvpriv=&padapter->recvpriv; + u32 res=_SUCCESS; +_func_enter_; + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + //4 start to encrypt each fragment + if((prxattrib->encrypt==_AES_)){ + + stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); + if (stainfo!=NULL){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo!=NULL!!!\n")); + + if(IS_MCAST(prxattrib->ra)) + { + DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n"); + //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; + prwskeylen=16; + } + else + { + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + prwskeylen=16; + } + + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + + aes_decipher(prwskey,prxattrib->hdrlen,pframe, length); + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } +_func_exit_; + return res; +} + +/* compress 512-bits */ +static int sha256_compress(struct sha256_state *md, unsigned char *buf) +{ + u32 S[8], W[64], t0, t1; + u32 t; + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) { + S[i] = md->state[i]; + } + + /* copy the state into 512-bits into W[0..15] */ + for (i = 0; i < 16; i++) + W[i] = WPA_GET_BE32(buf + (4 * i)); + + /* fill W[16..63] */ + for (i = 16; i < 64; i++) { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + + W[i - 16]; + } + + /* Compress */ +#define RND(a,b,c,d,e,f,g,h,i) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + + for (i = 0; i < 64; ++i) { + RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i); + t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; + S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t; + } + + /* feedback */ + for (i = 0; i < 8; i++) { + md->state[i] = md->state[i] + S[i]; + } + return 0; +} + +/* Initialize the hash state */ +static void sha256_init(struct sha256_state *md) +{ + md->curlen = 0; + md->length = 0; + md->state[0] = 0x6A09E667UL; + md->state[1] = 0xBB67AE85UL; + md->state[2] = 0x3C6EF372UL; + md->state[3] = 0xA54FF53AUL; + md->state[4] = 0x510E527FUL; + md->state[5] = 0x9B05688CUL; + md->state[6] = 0x1F83D9ABUL; + md->state[7] = 0x5BE0CD19UL; +} + +/** + Process a block of memory though the hash + @param md The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return CRYPT_OK if successful +*/ +static int sha256_process(struct sha256_state *md, unsigned char *in, + unsigned long inlen) +{ + unsigned long n; +#define block_size 64 + + if (md->curlen > sizeof(md->buf)) + return -1; + + while (inlen > 0) { + if (md->curlen == 0 && inlen >= block_size) { + if (sha256_compress(md, (unsigned char *) in) < 0) + return -1; + md->length += block_size * 8; + in += block_size; + inlen -= block_size; + } else { + n = MIN(inlen, (block_size - md->curlen)); + _rtw_memcpy(md->buf + md->curlen, in, n); + md->curlen += n; + in += n; + inlen -= n; + if (md->curlen == block_size) { + if (sha256_compress(md, md->buf) < 0) + return -1; + md->length += 8 * block_size; + md->curlen = 0; + } + } + } + + return 0; +} + + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (32 bytes) + @return CRYPT_OK if successful +*/ +static int sha256_done(struct sha256_state *md, unsigned char *out) +{ + int i; + + if (md->curlen >= sizeof(md->buf)) + return -1; + + /* increase the length of the message */ + md->length += md->curlen * 8; + + /* append the '1' bit */ + md->buf[md->curlen++] = (unsigned char) 0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md->curlen > 56) { + while (md->curlen < 64) { + md->buf[md->curlen++] = (unsigned char) 0; + } + sha256_compress(md, md->buf); + md->curlen = 0; + } + + /* pad upto 56 bytes of zeroes */ + while (md->curlen < 56) { + md->buf[md->curlen++] = (unsigned char) 0; + } + + /* store length */ + WPA_PUT_BE64(md->buf + 56, md->length); + sha256_compress(md, md->buf); + + /* copy output */ + for (i = 0; i < 8; i++) + WPA_PUT_BE32(out + (4 * i), md->state[i]); + + return 0; +} + +/** + * sha256_vector - SHA256 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 of failure + */ +static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len, + u8 *mac) +{ + struct sha256_state ctx; + size_t i; + + sha256_init(&ctx); + for (i = 0; i < num_elem; i++) + if (sha256_process(&ctx, addr[i], len[i])) + return -1; + if (sha256_done(&ctx, mac)) + return -1; + return 0; +} + +static u8 os_strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +static int os_memcmp(void *s1, void *s2, u8 n) +{ + unsigned char *p1 = s1, *p2 = s2; + + if (n == 0) + return 0; + + while (*p1 == *p2) { + p1++; + p2++; + n--; + if (n == 0) + return 0; + } + + return *p1 - *p2; +} + +/** + * hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash (32 bytes) + */ +static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem, + u8 *addr[], size_t *len, u8 *mac) +{ + unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */ + unsigned char tk[32]; + u8 *_addr[6]; + size_t _len[6], i; + + if (num_elem > 5) { + /* + * Fixed limit on the number of fragments to avoid having to + * allocate memory (which could fail). + */ + return; + } + + /* if key is longer than 64 bytes reset it to key = SHA256(key) */ + if (key_len > 64) { + sha256_vector(1, &key, &key_len, tk); + key = tk; + key_len = 32; + } + + /* the HMAC_SHA256 transform looks like: + * + * SHA256(K XOR opad, SHA256(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected */ + + /* start out by storing key in ipad */ + _rtw_memset(k_pad, 0, sizeof(k_pad)); + _rtw_memcpy(k_pad, key, key_len); + /* XOR key with ipad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x36; + + /* perform inner SHA256 */ + _addr[0] = k_pad; + _len[0] = 64; + for (i = 0; i < num_elem; i++) { + _addr[i + 1] = addr[i]; + _len[i + 1] = len[i]; + } + sha256_vector(1 + num_elem, _addr, _len, mac); + + _rtw_memset(k_pad, 0, sizeof(k_pad)); + _rtw_memcpy(k_pad, key, key_len); + /* XOR key with opad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x5c; + + /* perform outer SHA256 */ + _addr[0] = k_pad; + _len[0] = 64; + _addr[1] = mac; + _len[1] = 32; + sha256_vector(2, _addr, _len, mac); +} + +/** + * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2) + * @key: Key for PRF + * @key_len: Length of the key in bytes + * @label: A unique label for each purpose of the PRF + * @data: Extra data to bind into the key + * @data_len: Length of the data + * @buf: Buffer for the generated pseudo-random key + * @buf_len: Number of bytes of key to generate + * + * This function is used to derive new, cryptographically separate keys from a + * given key. + */ +static void sha256_prf(u8 *key, size_t key_len, char *label, + u8 *data, size_t data_len, u8 *buf, size_t buf_len) +{ + u16 counter = 1; + size_t pos, plen; + u8 hash[SHA256_MAC_LEN]; + u8 *addr[4]; + size_t len[4]; + u8 counter_le[2], length_le[2]; + + addr[0] = counter_le; + len[0] = 2; + addr[1] = (u8 *) label; + len[1] = os_strlen(label); + addr[2] = data; + len[2] = data_len; + addr[3] = length_le; + len[3] = sizeof(length_le); + + WPA_PUT_LE16(length_le, buf_len * 8); + pos = 0; + while (pos < buf_len) { + plen = buf_len - pos; + WPA_PUT_LE16(counter_le, counter); + if (plen >= SHA256_MAC_LEN) { + hmac_sha256_vector(key, key_len, 4, addr, len, + &buf[pos]); + pos += SHA256_MAC_LEN; + } else { + hmac_sha256_vector(key, key_len, 4, addr, len, hash); + _rtw_memcpy(&buf[pos], hash, plen); + break; + } + counter++; + } +} + +/* AES tables*/ +const u32 Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +const u32 Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +const u8 Td4s[256] = { + 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, + 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, + 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, + 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, + 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, + 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, + 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, + 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, + 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, + 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, + 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, + 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, + 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, + 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, + 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, + 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, + 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, + 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, + 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, + 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, + 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, + 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, + 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, + 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, + 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, + 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, + 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, + 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, + 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, + 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, + 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, + 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, +}; +const u8 rcons[] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 + /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +/** + * Expand the cipher key into the encryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ +static void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[]) +{ + int i; + u32 temp; + + rk[0] = GETU32(cipherKey ); + rk[1] = GETU32(cipherKey + 4); + rk[2] = GETU32(cipherKey + 8); + rk[3] = GETU32(cipherKey + 12); + for (i = 0; i < 10; i++) { + temp = rk[3]; + rk[4] = rk[0] ^ + TE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^ + RCON(i); + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + rk += 4; + } +} + +static void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16]) +{ + u32 s0, s1, s2, s3, t0, t1, t2, t3; + int Nr = 10; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(pt ) ^ rk[0]; + s1 = GETU32(pt + 4) ^ rk[1]; + s2 = GETU32(pt + 8) ^ rk[2]; + s3 = GETU32(pt + 12) ^ rk[3]; + +#define ROUND(i,d,s) \ +d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \ +d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \ +d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \ +d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3] + +#ifdef FULL_UNROLL + + ROUND(1,t,s); + ROUND(2,s,t); + ROUND(3,t,s); + ROUND(4,s,t); + ROUND(5,t,s); + ROUND(6,s,t); + ROUND(7,t,s); + ROUND(8,s,t); + ROUND(9,t,s); + + rk += Nr << 2; + +#else /* !FULL_UNROLL */ + + /* Nr - 1 full rounds: */ + r = Nr >> 1; + for (;;) { + ROUND(1,t,s); + rk += 8; + if (--r == 0) + break; + ROUND(0,s,t); + } + +#endif /* ?FULL_UNROLL */ + +#undef ROUND + + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0]; + PUTU32(ct , s0); + s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1]; + PUTU32(ct + 4, s1); + s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2]; + PUTU32(ct + 8, s2); + s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3]; + PUTU32(ct + 12, s3); +} + +static void * aes_encrypt_init(u8 *key, size_t len) +{ + u32 *rk; + if (len != 16) + return NULL; + rk = (u32*)rtw_malloc(AES_PRIV_SIZE); + if (rk == NULL) + return NULL; + rijndaelKeySetupEnc(rk, key); + return rk; +} + +static void aes_128_encrypt(void *ctx, u8 *plain, u8 *crypt) +{ + rijndaelEncrypt(ctx, plain, crypt); +} + + +static void gf_mulx(u8 *pad) +{ + int i, carry; + + carry = pad[0] & 0x80; + for (i = 0; i < AES_BLOCK_SIZE - 1; i++) + pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7); + pad[AES_BLOCK_SIZE - 1] <<= 1; + if (carry) + pad[AES_BLOCK_SIZE - 1] ^= 0x87; +} + +static void aes_encrypt_deinit(void *ctx) +{ + _rtw_memset(ctx, 0, AES_PRIV_SIZE); + rtw_mfree(ctx, AES_PRIV_SIZE); +} + + +/** + * omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128 + * @key: 128-bit key for the hash operation + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) + * Returns: 0 on success, -1 on failure + * + * This is a mode for using block cipher (AES in this case) for authentication. + * OMAC1 was standardized with the name CMAC by NIST in a Special Publication + * (SP) 800-38B. + */ +static int omac1_aes_128_vector(u8 *key, size_t num_elem, + u8 *addr[], size_t *len, u8 *mac) +{ + void *ctx; + u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE]; + u8 *pos, *end; + size_t i, e, left, total_len; + + ctx = aes_encrypt_init(key, 16); + if (ctx == NULL) + return -1; + _rtw_memset(cbc, 0, AES_BLOCK_SIZE); + + total_len = 0; + for (e = 0; e < num_elem; e++) + total_len += len[e]; + left = total_len; + + e = 0; + pos = addr[0]; + end = pos + len[0]; + + while (left >= AES_BLOCK_SIZE) { + for (i = 0; i < AES_BLOCK_SIZE; i++) { + cbc[i] ^= *pos++; + if (pos >= end) { + e++; + pos = addr[e]; + end = pos + len[e]; + } + } + if (left > AES_BLOCK_SIZE) + aes_128_encrypt(ctx, cbc, cbc); + left -= AES_BLOCK_SIZE; + } + + _rtw_memset(pad, 0, AES_BLOCK_SIZE); + aes_128_encrypt(ctx, pad, pad); + gf_mulx(pad); + + if (left || total_len == 0) { + for (i = 0; i < left; i++) { + cbc[i] ^= *pos++; + if (pos >= end) { + e++; + pos = addr[e]; + end = pos + len[e]; + } + } + cbc[left] ^= 0x80; + gf_mulx(pad); + } + + for (i = 0; i < AES_BLOCK_SIZE; i++) + pad[i] ^= cbc[i]; + aes_128_encrypt(ctx, pad, mac); + aes_encrypt_deinit(ctx); + return 0; +} + + +/** + * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC) + * @key: 128-bit key for the hash operation + * @data: Data buffer for which a MAC is determined + * @data_len: Length of data buffer in bytes + * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) + * Returns: 0 on success, -1 on failure + * + * This is a mode for using block cipher (AES in this case) for authentication. + * OMAC1 was standardized with the name CMAC by NIST in a Special Publication + * (SP) 800-38B. + */ +static int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac) +{ + return omac1_aes_128_vector(key, 1, &data, &data_len, mac); +} + +#ifdef CONFIG_TDLS +void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 *SNonce = psta->SNonce; + u8 *ANonce = psta->ANonce; + + u8 key_input[SHA256_MAC_LEN]; + u8 *nonce[2]; + size_t len[2]; + u8 data[3 * ETH_ALEN]; + + /* IEEE Std 802.11z-2010 8.5.9.1: + * TPK-Key-Input = SHA-256(min(SNonce, ANonce) || max(SNonce, ANonce)) + */ + len[0] = 32; + len[1] = 32; + if (os_memcmp(SNonce, ANonce, 32) < 0) { + nonce[0] = SNonce; + nonce[1] = ANonce; + } else { + nonce[0] = ANonce; + nonce[1] = SNonce; + } + + sha256_vector(2, nonce, len, key_input); + + /* + * TPK-Key-Data = KDF-N_KEY(TPK-Key-Input, "TDLS PMK", + * min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || BSSID || N_KEY) + * TODO: is N_KEY really included in KDF Context and if so, in which + * presentation format (little endian 16-bit?) is it used? It gets + * added by the KDF anyway.. + */ + + if (os_memcmp(myid(&(padapter->eeprompriv)), psta->hwaddr, ETH_ALEN) < 0) { + _rtw_memcpy(data, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(data + ETH_ALEN, psta->hwaddr, ETH_ALEN); + } else { + _rtw_memcpy(data, psta->hwaddr, ETH_ALEN); + _rtw_memcpy(data + ETH_ALEN, myid(&(padapter->eeprompriv)), ETH_ALEN); + } + _rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN); + + sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk)); + + +} + +/** + * wpa_tdls_ftie_mic - Calculate TDLS FTIE MIC + * @kck: TPK-KCK + * @lnkid: Pointer to the beginning of Link Identifier IE + * @rsnie: Pointer to the beginning of RSN IE used for handshake + * @timeoutie: Pointer to the beginning of Timeout IE used for handshake + * @ftie: Pointer to the beginning of FT IE + * @mic: Pointer for writing MIC + * + * Calculate MIC for TDLS frame. + */ +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, + u8 *mic) +{ + u8 *buf, *pos; + struct wpa_tdls_ftie *_ftie; + struct wpa_tdls_lnkid *_lnkid; + int ret; + int len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] + + 2 + timeoutie[1] + 2 + ftie[1]; + buf = rtw_zmalloc(len); + if (!buf) { + DBG_8192C("TDLS: No memory for MIC calculation\n"); + return -1; + } + + pos = buf; + _lnkid = (struct wpa_tdls_lnkid *) lnkid; + /* 1) TDLS initiator STA MAC address */ + _rtw_memcpy(pos, _lnkid->init_sta, ETH_ALEN); + pos += ETH_ALEN; + /* 2) TDLS responder STA MAC address */ + _rtw_memcpy(pos, _lnkid->resp_sta, ETH_ALEN); + pos += ETH_ALEN; + /* 3) Transaction Sequence number */ + *pos++ = trans_seq; + /* 4) Link Identifier IE */ + _rtw_memcpy(pos, lnkid, 2 + lnkid[1]); + pos += 2 + lnkid[1]; + /* 5) RSN IE */ + _rtw_memcpy(pos, rsnie, 2 + rsnie[1]); + pos += 2 + rsnie[1]; + /* 6) Timeout Interval IE */ + _rtw_memcpy(pos, timeoutie, 2 + timeoutie[1]); + pos += 2 + timeoutie[1]; + /* 7) FTIE, with the MIC field of the FTIE set to 0 */ + _rtw_memcpy(pos, ftie, 2 + ftie[1]); + _ftie = (struct wpa_tdls_ftie *) pos; + _rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN); + pos += 2 + ftie[1]; + + ret = omac1_aes_128(kck, buf, pos - buf, mic); + rtw_mfree(buf, len); + return ret; + +} + +int tdls_verify_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie) +{ + u8 *buf, *pos; + int len; + u8 mic[16]; + int ret; + u8 *rx_ftie, *tmp_ftie; + + if (lnkid == NULL || rsnie == NULL || + timeoutie == NULL || ftie == NULL){ + DBG_8192C("pointer fail\n"); + return 0; + } + + len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie+1) + 2 + *(timeoutie+1) + 2 + *(ftie+1); + + buf = rtw_zmalloc(len); + if (buf == NULL) + return 0; + + pos = buf; + /* 1) TDLS initiator STA MAC address */ + _rtw_memcpy(pos, lnkid + ETH_ALEN + 2, ETH_ALEN); + pos += ETH_ALEN; + /* 2) TDLS responder STA MAC address */ + _rtw_memcpy(pos, lnkid + 2 * ETH_ALEN + 2, ETH_ALEN); + pos += ETH_ALEN; + /* 3) Transaction Sequence number */ + *pos++ = trans_seq; + /* 4) Link Identifier IE */ + _rtw_memcpy(pos, lnkid, 2 + 18); + pos += 2 + 18; + /* 5) RSN IE */ + _rtw_memcpy(pos, rsnie, 2 + *(rsnie+1)); + pos += 2 + *(rsnie+1); + /* 6) Timeout Interval IE */ + _rtw_memcpy(pos, timeoutie, 2 + *(timeoutie+1)); + pos += 2 + *(timeoutie+1); + /* 7) FTIE, with the MIC field of the FTIE set to 0 */ + _rtw_memcpy(pos, ftie, 2 + *(ftie+1)); + pos += 2; + tmp_ftie = (u8 *) (pos+2); + _rtw_memset(tmp_ftie, 0, 16); + pos += *(ftie+1); + + ret = omac1_aes_128(kck, buf, pos - buf, mic); + rtw_mfree(buf, len); + if (ret) + return 0; + rx_ftie = ftie+4; + + if (os_memcmp(mic, rx_ftie, 16) == 0) { + //Valid MIC + DBG_8192C( "[%s] Valid MIC\n", __FUNCTION__); + return 1; + } + //Invalid MIC + DBG_8192C( "[%s] Invalid MIC\n", __FUNCTION__); + return 0; + +} +#endif + +#ifdef PLATFORM_WINDOWS +void rtw_use_tkipkey_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ) +#endif +#ifdef PLATFORM_LINUX +void rtw_use_tkipkey_handler(void *FunctionContext) +#endif +{ + _adapter *padapter = (_adapter *)FunctionContext; + + +_func_enter_; + + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler ^^^\n")); + +/* + if(padapter->bDriverStopped ||padapter->bSurpriseRemoved){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler (padapter->bDriverStopped %d)(padapter->bSurpriseRemoved %d)^^^\n",padapter->bDriverStopped,padapter->bSurpriseRemoved)); + + return; + } + */ + + padapter->securitypriv.busetkipkey=_TRUE; + + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler padapter->securitypriv.busetkipkey=%d^^^\n",padapter->securitypriv.busetkipkey)); + +_func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c b/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c new file mode 100755 index 000000000000..cf478b2fe7f4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c @@ -0,0 +1,654 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_STA_MGT_C_ + +#include +#include +#include +#include +#include +#include + + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include + + +void _rtw_init_stainfo(struct sta_info *psta) +{ + +_func_enter_; + + _rtw_memset((u8 *)psta, 0, sizeof (struct sta_info)); + + _rtw_spinlock_init(&psta->lock); + _rtw_init_listhead(&psta->list); + _rtw_init_listhead(&psta->hash_list); + //_rtw_init_listhead(&psta->asoc_list); + //_rtw_init_listhead(&psta->sleep_list); + //_rtw_init_listhead(&psta->wakeup_list); + + _rtw_init_queue(&psta->sleep_q); + psta->sleepq_len = 0; + + _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); + _rtw_init_sta_recv_priv(&psta->sta_recvpriv); + +#ifdef CONFIG_AP_MODE + + _rtw_init_listhead(&psta->asoc_list); + + _rtw_init_listhead(&psta->auth_list); + + psta->expire_to = 0; + + psta->flags = 0; + + psta->capability = 0; + + +#ifdef CONFIG_NATIVEAP_MLME + psta->nonerp_set = 0; + psta->no_short_slot_time_set = 0; + psta->no_short_preamble_set = 0; + psta->no_ht_gf_set = 0; + psta->no_ht_set = 0; + psta->ht_20mhz_set = 0; +#endif + +#endif + +_func_exit_; + +} + +u32 _rtw_init_sta_priv(struct sta_priv *pstapriv) +{ + struct sta_info *psta; + s32 i; + +_func_enter_; + + pstapriv->pallocated_stainfo_buf = rtw_zvmalloc (sizeof(struct sta_info) * NUM_STA+ 4); + + if(!pstapriv->pallocated_stainfo_buf) + return _FAIL; + + pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - + ((SIZE_PTR)(pstapriv->pallocated_stainfo_buf ) & 3); + + _rtw_init_queue(&pstapriv->free_sta_queue); + + _rtw_spinlock_init(&pstapriv->sta_hash_lock); + + //_rtw_init_queue(&pstapriv->asoc_q); + pstapriv->asoc_sta_count = 0; + _rtw_init_queue(&pstapriv->sleep_q); + _rtw_init_queue(&pstapriv->wakeup_q); + + psta = (struct sta_info *)(pstapriv->pstainfo_buf); + + + for(i = 0; i < NUM_STA; i++) + { + _rtw_init_stainfo(psta); + + _rtw_init_listhead(&(pstapriv->sta_hash[i])); + + rtw_list_insert_tail(&psta->list, get_list_head(&pstapriv->free_sta_queue)); + + psta++; + } + +#ifdef CONFIG_AP_MODE + + pstapriv->sta_dz_bitmap = 0; + pstapriv->tim_bitmap = 0; + + _rtw_init_listhead(&pstapriv->asoc_list); + _rtw_init_listhead(&pstapriv->auth_list); + pstapriv->auth_to = 3; // 3*2 = 6 sec + pstapriv->assoc_to = 3; + pstapriv->expire_to = 900;// 900*2 = 1800 sec = 30 min, expire after no any traffic. + + pstapriv->max_num_sta = NUM_STA; + +#endif + +_func_exit_; + + return _SUCCESS; + +} + +void _rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv) +{ +_func_enter_; + + _rtw_spinlock_free(&psta_xmitpriv->lock); + + _rtw_spinlock_free(&(psta_xmitpriv->be_q.sta_pending.lock)); + _rtw_spinlock_free(&(psta_xmitpriv->bk_q.sta_pending.lock)); + _rtw_spinlock_free(&(psta_xmitpriv->vi_q.sta_pending.lock)); + _rtw_spinlock_free(&(psta_xmitpriv->vo_q.sta_pending.lock)); +_func_exit_; +} + +static void _rtw_free_sta_recv_priv_lock(struct sta_recv_priv *psta_recvpriv) +{ +_func_enter_; + + _rtw_spinlock_free(&psta_recvpriv->lock); + + _rtw_spinlock_free(&(psta_recvpriv->defrag_q.lock)); + +_func_exit_; + +} + +void rtw_mfree_stainfo(struct sta_info *psta) +{ +_func_enter_; + + if(&psta->lock != NULL) + _rtw_spinlock_free(&psta->lock); + + _rtw_free_sta_xmit_priv_lock(&psta->sta_xmitpriv); + _rtw_free_sta_recv_priv_lock(&psta->sta_recvpriv); + +_func_exit_; +} + + +// this function is used to free the memory of lock || sema for all stainfos +void rtw_mfree_all_stainfo(struct sta_priv *pstapriv ) +{ + _irqL irqL; + _list *plist, *phead; + struct sta_info *psta = NULL; + +_func_enter_; + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + phead = get_list_head(&pstapriv->free_sta_queue); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info ,list); + plist = get_next(plist); + + rtw_mfree_stainfo(psta); + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + +_func_exit_; + +} + + +void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv) +{ + rtw_mfree_all_stainfo(pstapriv); //be done before free sta_hash_lock + + _rtw_spinlock_free(&pstapriv->free_sta_queue.lock); + + _rtw_spinlock_free(&pstapriv->sta_hash_lock); + _rtw_spinlock_free(&pstapriv->wakeup_q.lock); + _rtw_spinlock_free(&pstapriv->sleep_q.lock); + +} + +u32 _rtw_free_sta_priv(struct sta_priv *pstapriv) +{ +_func_enter_; + if(pstapriv){ + rtw_mfree_sta_priv_lock(pstapriv); + + if(pstapriv->pallocated_stainfo_buf) { + rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4); + } + } + +_func_exit_; + return _SUCCESS; +} + + +//struct sta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr) +struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) +{ + _irqL irqL, irqL2; + uint tmp_aid; + s32 index; + _list *phash_list; + struct sta_info *psta; + _queue *pfree_sta_queue; + struct recv_reorder_ctrl *preorder_ctrl; + int i = 0; + u16 wRxSeqInitialValue = 0xffff; + +_func_enter_; + + pfree_sta_queue = &pstapriv->free_sta_queue; + + _enter_critical_bh(&(pfree_sta_queue->lock), &irqL); + + if (_rtw_queue_empty(pfree_sta_queue) == _TRUE) + { + psta = NULL; + } + else + { + psta = LIST_CONTAINOR(get_next(&pfree_sta_queue->queue), struct sta_info, list); + + rtw_list_delete(&(psta->list)); + + tmp_aid = psta->aid; + + _rtw_init_stainfo(psta); + + _rtw_memcpy(psta->hwaddr, hwaddr, ETH_ALEN); + + index = wifi_mac_hash(hwaddr); + + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("rtw_alloc_stainfo: index = %x", index)); + + if(index >= NUM_STA){ + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("ERROR=> rtw_alloc_stainfo: index >= NUM_STA")); + psta= NULL; + goto exit; + } + phash_list = &(pstapriv->sta_hash[index]); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + + rtw_list_insert_tail(&psta->hash_list, phash_list); + + pstapriv->asoc_sta_count ++ ; + + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + +// Commented by Albert 2009/08/13 +// For the SMC router, the sequence number of first packet of WPS handshake will be 0. +// In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable. +// So, we initialize the tid_rxseq variable as the 0xffff. + + for( i = 0; i < 16; i++ ) + { + _rtw_memcpy( &psta->sta_recvpriv.rxcache.tid_rxseq[ i ], &wRxSeqInitialValue, 2 ); + } + + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("alloc number_%d stainfo with hwaddr = %x %x %x %x %x %x \n", + pstapriv->asoc_sta_count , hwaddr[0], hwaddr[1], hwaddr[2],hwaddr[3],hwaddr[4],hwaddr[5])); + + init_addba_retry_timer(pstapriv->padapter, psta); + +#ifdef CONFIG_TDLS + psta->padapter = pstapriv->padapter; + init_TPK_timer(pstapriv->padapter, psta); + _init_workitem(&psta->option_workitem, TDLS_option_workitem_callback, psta); + init_ch_switch_timer(pstapriv->padapter, psta); + init_base_ch_timer(pstapriv->padapter, psta); + _init_workitem(&psta->base_ch_workitem, base_channel_workitem_callback, psta); + init_off_ch_timer(pstapriv->padapter, psta); + _init_workitem(&psta->off_ch_workitem, off_channel_workitem_callback, psta); +#endif + + //for A-MPDU Rx reordering buffer control + for(i=0; i < 16 ; i++) + { + preorder_ctrl = &psta->recvreorder_ctrl[i]; + + preorder_ctrl->padapter = pstapriv->padapter; + + preorder_ctrl->enable = _FALSE; + + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + preorder_ctrl->wend_b= 0xffff; + //preorder_ctrl->wsize_b = (NR_RECVBUFF-2); + preorder_ctrl->wsize_b = 64;//64; + + _rtw_init_queue(&preorder_ctrl->pending_recvframe_queue); + + rtw_init_recv_timer(preorder_ctrl); + } + + } + +exit: + + _exit_critical_bh(&(pfree_sta_queue->lock), &irqL); + +_func_exit_; + + return psta; + + +} + + +// using pstapriv->sta_hash_lock to protect +u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta) +{ + int i; + _irqL irqL0; + _queue *pfree_sta_queue; + struct recv_reorder_ctrl *preorder_ctrl; + struct sta_xmit_priv *pstaxmitpriv; + struct xmit_priv *pxmitpriv= &padapter->xmitpriv; + struct sta_priv *pstapriv = &padapter->stapriv; + + +_func_enter_; + + if (psta == NULL) + goto exit; + + pfree_sta_queue = &pstapriv->free_sta_queue; + + + pstaxmitpriv = &psta->sta_xmitpriv; + + //rtw_list_delete(&psta->sleep_list); + + //rtw_list_delete(&psta->wakeup_list); + + rtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q); + psta->sleepq_len = 0; + + _enter_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vo_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); + + + _enter_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vi_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); + + + _enter_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->bk_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); + + _enter_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->be_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); + + + rtw_list_delete(&psta->hash_list); + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5])); + pstapriv->asoc_sta_count --; + + + // re-init sta_info; 20061114 + _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); + _rtw_init_sta_recv_priv(&psta->sta_recvpriv); + + _cancel_timer_ex(&psta->addba_retry_timer); + +#ifdef CONFIG_TDLS + _cancel_timer_ex(&psta->TPK_timer); + _cancel_timer_ex(&psta->option_timer); + _cancel_timer_ex(&psta->base_ch_timer); + _cancel_timer_ex(&psta->off_ch_timer); +#endif + + //for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer + for(i=0; i < 16 ; i++) + { + preorder_ctrl = &psta->recvreorder_ctrl[i]; + + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); + } + + +#ifdef CONFIG_AP_MODE + + rtw_list_delete(&psta->asoc_list); + rtw_list_delete(&psta->auth_list); + psta->expire_to = 0; + + psta->sleepq_ac_len = 0; + psta->qos_info = 0; + + psta->max_sp_len = 0; + psta->uapsd_bk = 0; + psta->uapsd_be = 0; + psta->uapsd_vi = 0; + psta->uapsd_vo = 0; + + psta->has_legacy_ac = 0; + +#ifdef CONFIG_NATIVEAP_MLME + + pstapriv->sta_dz_bitmap &=~BIT(psta->aid); + pstapriv->tim_bitmap &=~BIT(psta->aid); + + rtw_indicate_sta_disassoc_event(padapter, psta); + + if (pstapriv->sta_aid[psta->aid - 1] == psta) + { + pstapriv->sta_aid[psta->aid - 1] = NULL; + psta->aid = 0; + } + +#endif + +#endif + + _enter_critical_bh(&(pfree_sta_queue->lock), &irqL0); + rtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue)); + _exit_critical_bh(&(pfree_sta_queue->lock), &irqL0); + +exit: + +_func_exit_; + + return _SUCCESS; + +} + +// free all stainfo which in sta_hash[all] +void rtw_free_all_stainfo(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + s32 index; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter); + +_func_enter_; + + if(pstapriv->asoc_sta_count==1) + goto exit; + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + for(index=0; index< NUM_STA; index++) + { + phead = &(pstapriv->sta_hash[index]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list); + + plist = get_next(plist); + + if(pbcmc_stainfo!=psta) + rtw_free_stainfo(padapter , psta); + + } + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + +exit: + +_func_exit_; + +} + +/* any station allocated can be searched by hash list */ +struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) +{ + + _irqL irqL; + + _list *plist, *phead; + + struct sta_info *psta = NULL; + + u32 index; + + u8 *addr; + + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + +_func_enter_; + + if(hwaddr==NULL) + return NULL; + + if(IS_MCAST(hwaddr)) + { + addr = bc_addr; + } + else + { + addr = hwaddr; + } + + index = wifi_mac_hash(addr); + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + phead = &(pstapriv->sta_hash[index]); + plist = get_next(phead); + + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + + if ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN))== _TRUE) + { // if found the matched address + break; + } + psta=NULL; + plist = get_next(plist); + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); +_func_exit_; + return psta; + +} + +u32 rtw_init_bcmc_stainfo(_adapter* padapter) +{ + + struct sta_info *psta; + struct tx_servq *ptxservq; + u32 res=_SUCCESS; + NDIS_802_11_MAC_ADDRESS bcast_addr= {0xff,0xff,0xff,0xff,0xff,0xff}; + + struct sta_priv *pstapriv = &padapter->stapriv; + _queue *pstapending = &padapter->xmitpriv.bm_pending; + +_func_enter_; + + psta = rtw_alloc_stainfo(pstapriv, bcast_addr); + + if(psta==NULL){ + res=_FAIL; + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("rtw_alloc_stainfo fail")); + goto exit; + } + + // default broadcast & multicast use macid 1 + psta->mac_id = 1; + + ptxservq= &(psta->sta_xmitpriv.be_q); + +/* + _enter_critical(&pstapending->lock, &irqL0); + + if (rtw_is_list_empty(&ptxservq->tx_pending)) + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(pstapending)); + + _exit_critical(&pstapending->lock, &irqL0); +*/ + +exit: +_func_exit_; + return _SUCCESS; + +} + + +struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter) +{ + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; +_func_enter_; + psta = rtw_get_stainfo(pstapriv, bc_addr); +_func_exit_; + return psta; + +} + +u8 rtw_access_ctrl(struct wlan_acl_pool* pacl_list, u8 * mac_addr) +{ + return _TRUE; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c b/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c new file mode 100755 index 000000000000..9043a8a4a595 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c @@ -0,0 +1,1747 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_WLAN_UTIL_C_ + +#include +#include +#include +#include + + +unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f}; +unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74}; + +unsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18}; +unsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7}; +unsigned char BROADCOM_OUI3[] = {0x00, 0x05, 0xb5}; + +unsigned char CISCO_OUI[] = {0x00, 0x40, 0x96}; +unsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43}; +unsigned char RALINK_OUI[] = {0x00, 0x0c, 0x43}; +unsigned char REALTEK_OUI[] = {0x00, 0xe0, 0x4c}; +unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5}; + +unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20}; + +extern unsigned char MCS_rate_2R[16]; +extern unsigned char MCS_rate_1R[16]; +extern unsigned char WPA_OUI[]; +extern unsigned char WPA_TKIP_CIPHER[4]; +extern unsigned char RSN_TKIP_CIPHER[4]; + +#define R2T_PHY_DELAY (0) + +//#define WAIT_FOR_BCN_TO_MIN (3000) +#define WAIT_FOR_BCN_TO_MIN (6000) +#define WAIT_FOR_BCN_TO_MAX (20000) + + +int cckrates_included(unsigned char *rate, int ratelen) +{ + int i; + + for(i = 0; i < ratelen; i++) + { + if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) + return _TRUE; + } + + return _FALSE; + +} + +int cckratesonly_included(unsigned char *rate, int ratelen) +{ + int i; + + for(i = 0; i < ratelen; i++) + { + if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) + return _FALSE; + } + + return _TRUE; +} + +unsigned char networktype_to_raid(unsigned char network_type) +{ + unsigned char raid; + + switch(network_type) + { + case WIRELESS_11B: + raid = 6; + break; + case WIRELESS_11A: + case WIRELESS_11G: + raid = 5; + break; + case WIRELESS_11BG: + raid = 4; + break; + case WIRELESS_11_24N: + case WIRELESS_11_5N: + raid = 3; + break; + case WIRELESS_11A_5N: + case WIRELESS_11G_24N: + raid = 1; + break; + case WIRELESS_11BG_24N: + raid = 0; + break; + default: + raid = 4; + break; + + } + + return raid; + +} + +int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen) +{ + int network_type = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if(pmlmeext->cur_channel > 14) + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_5N; + } + + network_type |= WIRELESS_11A; + } + else + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_24N; + } + + if ((cckratesonly_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11B; + } + else if((cckrates_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11BG; + } + else + { + network_type |= WIRELESS_11G; + } + } + + return network_type; +} + +unsigned char ratetbl_val_2wifirate(unsigned char rate) +{ + unsigned char val = 0; + + switch (rate & 0x7f) + { + case 0: + val = IEEE80211_CCK_RATE_1MB; + break; + + case 1: + val = IEEE80211_CCK_RATE_2MB; + break; + + case 2: + val = IEEE80211_CCK_RATE_5MB; + break; + + case 3: + val = IEEE80211_CCK_RATE_11MB; + break; + + case 4: + val = IEEE80211_OFDM_RATE_6MB; + break; + + case 5: + val = IEEE80211_OFDM_RATE_9MB; + break; + + case 6: + val = IEEE80211_OFDM_RATE_12MB; + break; + + case 7: + val = IEEE80211_OFDM_RATE_18MB; + break; + + case 8: + val = IEEE80211_OFDM_RATE_24MB; + break; + + case 9: + val = IEEE80211_OFDM_RATE_36MB; + break; + + case 10: + val = IEEE80211_OFDM_RATE_48MB; + break; + + case 11: + val = IEEE80211_OFDM_RATE_54MB; + break; + + } + + return val; + +} + +int is_basicrate(_adapter *padapter, unsigned char rate) +{ + int i; + unsigned char val; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + for(i = 0; i < NumRates; i++) + { + val = pmlmeext->basicrate[i]; + + if ((val != 0xff) && (val != 0xfe)) + { + if (rate == ratetbl_val_2wifirate(val)) + { + return _TRUE; + } + } + } + + return _FALSE; +} + + +unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset) +{ + int i; + unsigned char rate; + unsigned int len = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + for (i = 0; i < NumRates; i++) + { + rate = pmlmeext->datarate[i]; + + switch (rate) + { + case 0xff: + return len; + + case 0xfe: + continue; + + default: + rate = ratetbl_val_2wifirate(rate); + + if (is_basicrate(padapter, rate) == _TRUE) + { + rate |= IEEE80211_BASIC_RATE_MASK; + } + + rateset[len] = rate; + len++; + break; + } + } + return len; +} + + +void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len) +{ + unsigned char supportedrates[NumRates]; + + _rtw_memset(supportedrates, 0, NumRates); + *bssrate_len = ratetbl2rateset(padapter, supportedrates); + _rtw_memcpy(pbssrate, supportedrates, *bssrate_len); +} + +void Save_DM_Func_Flag(_adapter *padapter) +{ + u8 bSaveFlag = _TRUE; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); +} + +void Restore_DM_Func_Flag(_adapter *padapter) +{ + u8 bSaveFlag = _FALSE; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); +} + +void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable) +{ + if(enable == _TRUE) + { + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode)); + } + else + { + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode)); + } + +#if 0 + u8 val8; + + val8 = rtw_read8(padapter, FW_DYNAMIC_FUN_SWITCH); + + if(enable == _TRUE) + { + rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 | mode)); + } + else + { + rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 & mode)); + } +#endif + +} + +void Set_NETYPE1_MSR(_adapter *padapter, u8 type) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MEDIA_STATUS1, (u8 *)(&type)); +} + +void Set_NETYPE0_MSR(_adapter *padapter, u8 type) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type)); +} + +void SelectChannel(_adapter *padapter, unsigned char channel) +{ + unsigned int scanMode; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + scanMode = (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE)? 1: 0;//todo: + + if(padapter->HalFunc.set_channel_handler) + padapter->HalFunc.set_channel_handler(padapter, channel); + +} + +void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset) +{ + if(padapter->HalFunc.set_bwmode_handler) + padapter->HalFunc.set_bwmode_handler(padapter, (HT_CHANNEL_WIDTH)bwmode, channel_offset); +} + +void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode) +{ + if((bwmode == HT_CHANNEL_WIDTH_20)||(channel_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)) + { + SelectChannel(padapter, channel); + } + else + { + //switch to the proper channel + if (channel_offset == HAL_PRIME_CHNL_OFFSET_LOWER) + { + SelectChannel(padapter, channel + 2); + } + else + { + SelectChannel(padapter, channel - 2); + } + } + + + SetBWMode(padapter, bwmode, channel_offset); + +} + +int get_bsstype(unsigned short capability) +{ + if (capability & BIT(0)) + { + return WIFI_FW_AP_STATE; + } + else if (capability & BIT(1)) + { + return WIFI_FW_ADHOC_STATE; + } + else + { + return 0; + } +} + +__inline u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork) +{ + return (pnetwork->MacAddress); +} + +u16 get_beacon_interval(WLAN_BSSID_EX *bss) +{ + unsigned short val; + _rtw_memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2); + + return le16_to_cpu(val); + +} + +int is_client_associated_to_ap(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)) + { + return _TRUE; + } + else + { + return _FAIL; + } +} + +int is_client_associated_to_ibss(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)) + { + return _TRUE; + } + else + { + return _FAIL; + } +} + +int is_IBSS_empty(_adapter *padapter) +{ + unsigned int i; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) + { + if (pmlmeinfo->FW_sta_info[i].status == 1) + { + return _FAIL; + } + } + + return _TRUE; + +} + +unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval) +{ + if ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN) + { + return WAIT_FOR_BCN_TO_MIN; + } + else if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX) + { + return WAIT_FOR_BCN_TO_MAX; + } + else + { + return ((bcn_interval << 2)); + } +} + +void CAM_empty_entry( + PADAPTER Adapter, + u8 ucIndex +) +{ + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex)); +} + +void invalidate_cam_all(_adapter *padapter) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_INVALID_ALL, 0); +} + +void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key) +{ + unsigned int i, val, addr, cmd; + int j; + u32 cam_val[2]; + + addr = entry << 3; + + for (j = 5; j >= 0; j--) + { + switch (j) + { + case 0: + val = (ctrl | (mac[0] << 16) | (mac[1] << 24) ); + break; + + case 1: + val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24)); + break; + + default: + i = (j - 2) << 2; + val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24)); + break; + + } + + cam_val[0] = val; + cam_val[1] = addr + (unsigned int)j; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); + + //rtw_write32(padapter, WCAMI, val); + + //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j); + //rtw_write32(padapter, RWCAM, cmd); + + //DBG_8192C("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val); + + } + +} + +void clear_cam_entry(_adapter *padapter, u8 entry) +{ +#if 0 + u32 addr, val=0; + u32 cam_val[2]; + + addr = entry << 3; + + + cam_val[0] = val; + cam_val[1] = addr + (unsigned int)0; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); + + + + cam_val[0] = val; + cam_val[1] = addr + (unsigned int)1; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); +#else + + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00}; + + write_cam(padapter, entry, 0, null_sta, null_key); + +#endif +} + +int allocate_fw_sta_entry(_adapter *padapter) +{ + unsigned int mac_id; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++) + { + if (pmlmeinfo->FW_sta_info[mac_id].status == 0) + { + pmlmeinfo->FW_sta_info[mac_id].status = 1; + pmlmeinfo->FW_sta_info[mac_id].retry = 0; + break; + } + } + + return mac_id; +} + +void flush_all_cam_entry(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#if 0 + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00}; + + for (i = 0; i < NUM_STA; i++) + { + write_cam(padapter, i, 0, null_sta, null_key); + } +#else + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_INVALID_ALL, 0); +#endif + _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info)); +} + +int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pmlmepriv->qospriv.qos_option==0) + { + pmlmeinfo->WMM_enable = 0; + return _FAIL; + } + + pmlmeinfo->WMM_enable = 1; + _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); + return _TRUE; + + /*if (pregpriv->wifi_spec == 1) + { + if (pmlmeinfo->WMM_enable == 1) + { + //todo: compare the parameter set count & decide wheher to update or not + return _FAIL; + } + else + { + pmlmeinfo->WMM_enable = 1; + _rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); + return _TRUE; + } + } + else + { + pmlmeinfo->WMM_enable = 0; + return _FAIL; + }*/ + +} + +void WMMOnAssocRsp(_adapter *padapter) +{ + unsigned char ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime; + unsigned short TXOP; + unsigned int acParm, i; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (pmlmeinfo->WMM_enable == 0) + return; + + if( pmlmeext->cur_wireless_mode == WIRELESS_11B) + aSifsTime = 10; + else + aSifsTime = 16; + + for (i = 0; i < 4; i++) + { + ACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03; + ACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01; + + //AIFS = AIFSN * slot time + SIFS - r2t phy delay + AIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime; + + ECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f); + ECWMax = (pmlmeinfo->WMM_param.ac_param[i].CW & 0xf0) >> 4; + TXOP = le16_to_cpu(pmlmeinfo->WMM_param.ac_param[i].TXOP_limit); + + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + + switch (ACI) + { + case 0x0: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); + break; + + case 0x1: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); + break; + + case 0x2: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); + break; + + case 0x3: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); + break; + } + + //DBG_871X("WMM(%x): %x, %x\n", ACI, ACM, acParm); + } + + return; +} + +static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + unsigned char new_bwmode; + unsigned char new_ch_offset; + struct HT_info_element *pHT_info; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if(!pIE) + return; + + pHT_info = (struct HT_info_element *)pIE->data; + + if(pHT_info->infos[0] & BIT(2)) + { + new_bwmode = HT_CHANNEL_WIDTH_40; + switch (pHT_info->infos[0] & 0x3) + { + case 1: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + } + else + { + new_bwmode = HT_CHANNEL_WIDTH_20; + new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + + if((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset)) + { + pmlmeinfo->bwmode_updated = _TRUE; + + pmlmeext->cur_bwmode = new_bwmode; + pmlmeext->cur_ch_offset = new_ch_offset; + } + else + { + pmlmeinfo->bwmode_updated = _FALSE; + } + + + if(_TRUE == pmlmeinfo->bwmode_updated) + { + struct sta_info *psta; + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + struct sta_priv *pstapriv = &padapter->stapriv; + + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + + //update ap's stainfo + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); + if(psta) + { + struct ht_priv *phtpriv_sta = &psta->htpriv; + + if(phtpriv_sta->ht_option) + { + // bwmode + phtpriv_sta->bwmode = pmlmeext->cur_bwmode; + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + } + else + { + phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + } + + //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it! + + } + +} + +void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + unsigned int i; + u8 rf_type; + u8 max_AMPDU_len, min_MPDU_spacing; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + if(phtpriv->ht_option == _FALSE) return; + + pmlmeinfo->HT_caps_enable = 1; + + for (i = 0; i < (pIE->Length); i++) + { + if (i != 2) + { + // Commented by Albert 2010/07/12 + // Got the endian issue here. + pmlmeinfo->HT_caps.HT_cap[i] &= (pIE->data[i]); + } + else + { + //modify from fw by Thomas 2010/11/17 + if ((pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3)) + { + max_AMPDU_len = (pIE->data[i] & 0x3); + } + else + { + max_AMPDU_len = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x3); + } + + if ((pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c)) + { + min_MPDU_spacing = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c); + } + else + { + min_MPDU_spacing = (pIE->data[i] & 0x1c); + } + + pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing; + } + } + + // Commented by Albert 2010/07/12 + // Have to handle the endian issue after copying. + // HT_ext_caps didn't be used yet. + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info = le16_to_cpu( pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info ); + pmlmeinfo->HT_caps.HT_cap_element.HT_ext_caps = le16_to_cpu( pmlmeinfo->HT_caps.HT_cap_element.HT_ext_caps ); + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + //update the MCS rates + for (i = 0; i < 16; i++) + { + if((rf_type == RF_1T1R) || (rf_type == RF_1T2R)) + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + } + else + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i]; + } + #ifdef RTL8192C_RECONFIG_TO_1T1R + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + } + #endif + } + + return; +} + +void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + if(phtpriv->ht_option == _FALSE) return; + + + if(pIE->Length > sizeof(struct HT_info_element)) + return; + + pmlmeinfo->HT_info_enable = 1; + _rtw_memcpy(&(pmlmeinfo->HT_info), pIE->data, pIE->Length); + + return; +} + +void HTOnAssocRsp(_adapter *padapter) +{ + unsigned char max_AMPDU_len; + unsigned char min_MPDU_spacing; + unsigned char FactorLevel[18] = {2, 4, 4, 7, 7, 13, 13, 13, 2, 7, 7, 13, 13, 15, 15, 15, 15, 0}; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + //DBG_871X("%s\n", __FUNCTION__); + + if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) + { + pmlmeinfo->HT_enable = 1; + } + else + { + pmlmeinfo->HT_enable = 0; + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + return; + } + + //handle A-MPDU parameter field + /* + AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k + AMPDU_para [4:2]:Min MPDU Start Spacing + */ + max_AMPDU_len = pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x03; + + min_MPDU_spacing = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c) >> 2; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); + + if ((pregpriv->cbw40_enable) && + (pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info & BIT(1)) && + (pmlmeinfo->HT_info.infos[0] & BIT(2))) + { + //switch to the 40M Hz mode accoring to the AP + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; + switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) + { + case HT_EXTCHNL_OFFSET_UPPER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case HT_EXTCHNL_OFFSET_LOWER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); + } + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + // + // Config SM Power Save setting + // + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info & 0x0C) >> 2; + if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) + { + /*u8 i; + //update the MCS rates + for (i = 0; i < 16; i++) + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + }*/ + DBG_8192C("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); + } + + // + // Config current HT Protection mode. + // + pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; + +} + +void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pIE->Length>1) + return; + + pmlmeinfo->ERP_enable = 1; + _rtw_memcpy(&(pmlmeinfo->ERP_IE), pIE->data, pIE->Length); +} + +void VCS_update(_adapter *padapter, struct sta_info *psta) +{ + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + switch (pregpriv->vrtl_carrier_sense)/* 0:off 1:on 2:auto */ + { + case 0: //off + psta->rtsen = 0; + psta->cts2self = 0; + break; + + case 1: //on + if (pregpriv->vcs_type == 1) /* 1:RTS/CTS 2:CTS to self */ + { + psta->rtsen = 1; + psta->cts2self = 0; + } + else + { + psta->rtsen = 0; + psta->cts2self = 1; + } + break; + + case 2: //auto + default: + if ((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1))) + { + if (pregpriv->vcs_type == 1) + { + psta->rtsen = 1; + psta->cts2self = 0; + } + else + { + psta->rtsen = 0; + psta->cts2self = 1; + } + } + else + { + psta->rtsen = 0; + psta->cts2self = 0; + } + break; + } +} + +void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta) +{ + unsigned int i; + unsigned int len; + PNDIS_802_11_VARIABLE_IEs pIE; + + len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN); + + for (i = 0; i < len;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i); + + switch (pIE->ElementID) + { +#if 0 + case _VENDOR_SPECIFIC_IE_: + //todo: to update WMM paramter set while receiving beacon + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM + { + (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0; + } + break; +#endif + + case _HT_EXTRA_INFO_IE_: //HT info + //HT_info_handler(padapter, pIE); + bwmode_update_check(padapter, pIE); + break; + + case _ERPINFO_IE_: + ERP_IE_handler(padapter, pIE); + VCS_update(padapter, psta); + break; + + default: + break; + } + + i += (pIE->Length + 2); + } +} + +unsigned int is_ap_in_tkip(_adapter *padapter) +{ + u32 i; + PNDIS_802_11_VARIABLE_IEs pIE; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) + { + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4))) + { + return _TRUE; + } + break; + + case _RSN_IE_2_: + if (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4)) + { + return _TRUE; + } + + default: + break; + } + + i += (pIE->Length + 2); + } + + return _FALSE; + } + else + { + return _FALSE; + } + +} + +int wifirate2_ratetbl_inx(unsigned char rate) +{ + int inx = 0; + rate = rate & 0x7f; + + switch (rate) + { + case 54*2: + inx = 11; + break; + + case 48*2: + inx = 10; + break; + + case 36*2: + inx = 9; + break; + + case 24*2: + inx = 8; + break; + + case 18*2: + inx = 7; + break; + + case 12*2: + inx = 6; + break; + + case 9*2: + inx = 5; + break; + + case 6*2: + inx = 4; + break; + + case 11*2: + inx = 3; + break; + case 11: + inx = 2; + break; + + case 2*2: + inx = 1; + break; + + case 1*2: + inx = 0; + break; + + } + return inx; +} + +unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz) +{ + unsigned int i, num_of_rate; + unsigned int mask = 0; + + num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; + + for (i = 0; i < num_of_rate; i++) + { + if ((*(ptn + i)) & 0x80) + { + mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); + } + } + return mask; +} + +unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz) +{ + unsigned int i, num_of_rate; + unsigned int mask = 0; + + num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; + + for (i = 0; i < num_of_rate; i++) + { + mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); + } + + return mask; +} + +unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps) +{ + unsigned int mask = 0; + + mask = ((pHT_caps->HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->HT_cap_element.MCS_rate[1] << 20)); + + return mask; +} + +int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps) +{ + unsigned char bit_offset; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (!(pmlmeinfo->HT_enable)) + return _FAIL; + + if ((pmlmeinfo->assoc_AP_vendor == ralinkAP)) + return _FAIL; + + bit_offset = (pmlmeext->cur_bwmode & HT_CHANNEL_WIDTH_40)? 6: 5; + + if (pHT_caps->HT_cap_element.HT_caps_info & (0x1 << bit_offset)) + { + return _SUCCESS; + } + else + { + return _FAIL; + } +} + +unsigned char get_highest_rate_idx(u32 mask) +{ + int i; + unsigned char rate_idx=0; + + for(i=27; i>=0; i--) + { + if(mask & BIT(i)) + { + rate_idx = i; + break; + } + } + + return rate_idx; +} + +unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps) +{ + int i, mcs_rate; + + mcs_rate = (pHT_caps->HT_cap_element.MCS_rate[0] | (pHT_caps->HT_cap_element.MCS_rate[1] << 8)); + + for (i = 15; i >= 0; i--) + { + if (mcs_rate & (0x1 << i)) + { + break; + } + } + + return i; +} + +void Update_RA_Entry(_adapter *padapter, u32 mac_id) +{ + padapter->HalFunc.UpdateRAMaskHandler(padapter, mac_id); +} + +void enable_rate_adaptive(_adapter *padapter, u32 mac_id) +{ + Update_RA_Entry(padapter, mac_id); +} + +void set_sta_rate(_adapter *padapter, struct sta_info *psta) +{ + //rate adaptive + enable_rate_adaptive(padapter, psta->mac_id); +} + +unsigned char check_assoc_AP(u8 *pframe, uint len) +{ + unsigned int i; + PNDIS_802_11_VARIABLE_IEs pIE; + + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3))) + { + //DBG_871X("link to Artheros AP\n"); + return atherosAP; + } + else if ((_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3)) + || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3)) + || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3))) + { + //DBG_871X("link to Broadcom AP\n"); + return broadcomAP; + } + else if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3)) + { + //DBG_871X("link to Marvell AP\n"); + return marvellAP; + } + else if (_rtw_memcmp(pIE->data, RALINK_OUI, 3)) + { + //DBG_871X("link to Ralink AP\n"); + return ralinkAP; + } + else if (_rtw_memcmp(pIE->data, CISCO_OUI, 3)) + { + //DBG_871X("link to Cisco AP\n"); + return ciscoAP; + } + else if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3)) + { + //DBG_871X("link to Realtek 96B\n"); + return realtekAP; + } + else if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI,3)) + { + //DBG_871X("link to Airgo Cap\n"); + return airgocapAP; + } + else + { + break; + } + + default: + break; + } + + i += (pIE->Length + 2); + } + + DBG_871X("link to new AP\n"); + return unknownAP; +} + +void update_IOT_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + switch (pmlmeinfo->assoc_AP_vendor) + { + case marvellAP: + pmlmeinfo->turboMode_cts2self = 1; + pmlmeinfo->turboMode_rtsen = 0; + break; + + case ralinkAP: + pmlmeinfo->turboMode_cts2self = 0; + pmlmeinfo->turboMode_rtsen = 1; + //disable high power + Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE); + break; + case realtekAP: + //rtw_write16(padapter, 0x4cc, 0xffff); + //rtw_write16(padapter, 0x546, 0x01c0); + //disable high power + Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE); + break; + default: + pmlmeinfo->turboMode_cts2self = 0; + pmlmeinfo->turboMode_rtsen = 1; + break; + } + +} + +void update_capinfo(PADAPTER Adapter, u16 updateCap) +{ + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + BOOLEAN ShortPreamble; + + // Check preamble mode, 2005.01.06, by rcnjko. + // Mark to update preamble value forever, 2008.03.18 by lanhsin + //if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO ) + { + + if(updateCap & cShortPreamble) + { // Short Preamble + if(pmlmeinfo->preamble_mode != PREAMBLE_SHORT) // PREAMBLE_LONG or PREAMBLE_AUTO + { + ShortPreamble = _TRUE; + pmlmeinfo->preamble_mode = PREAMBLE_SHORT; + Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); + } + } + else + { // Long Preamble + if(pmlmeinfo->preamble_mode != PREAMBLE_LONG) // PREAMBLE_SHORT or PREAMBLE_AUTO + { + ShortPreamble = _FALSE; + pmlmeinfo->preamble_mode = PREAMBLE_LONG; + Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); + } + } + } + + if ( updateCap & cIBSS ) { + //Filen: See 802.11-2007 p.91 + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; + } + else + { + //Filen: See 802.11-2007 p.90 + if( pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11_24N)) + { + if( (updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */) + { // Short Slot Time + if(pmlmeinfo->slotTime != SHORT_SLOT_TIME) + { + pmlmeinfo->slotTime = SHORT_SLOT_TIME; + } + } + else + { // Long Slot Time + if(pmlmeinfo->slotTime != NON_SHORT_SLOT_TIME) + { + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; + } + } + } + else if( pmlmeext->cur_wireless_mode & (WIRELESS_11A | WIRELESS_11_5N)) + { + pmlmeinfo->slotTime = SHORT_SLOT_TIME; + } + else + { + //B Mode + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; + } + } + + Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime ); + +} + +void update_wireless_mode(_adapter *padapter) +{ + int ratelen, network_type = 0; + u16 SIFS_Timer; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + unsigned char *rate = cur_network->SupportedRates; + + ratelen = rtw_get_rateset_len(cur_network->SupportedRates); + + if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) + { + pmlmeinfo->HT_enable = 1; + } + + if(pmlmeext->cur_channel > 14) + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_5N; + } + + network_type |= WIRELESS_11A; + } + else + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_24N; + } + + if ((cckratesonly_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11B; + } + else if((cckrates_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11BG; + } + else + { + network_type |= WIRELESS_11G; + } + } + + pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode; + if((pmlmeext->cur_wireless_mode==WIRELESS_11G) || + (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G) + SIFS_Timer = 0x0a0a; + else + SIFS_Timer = 0x0e0e;//pHalData->SifsTime; + padapter->HalFunc.SetHwRegHandler( padapter, HW_VAR_SIFS, (u8 *)&SIFS_Timer); + +} + + +void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value) +{ +#if 0 + struct cmd_obj *ph2c; + struct reg_rw_parm *pwriteMacPara; + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + if ((pwriteMacPara = (struct reg_rw_parm*)rtw_malloc(sizeof(struct reg_rw_parm))) == NULL) + { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + return; + } + + pwriteMacPara->rw = 1; + pwriteMacPara->addr = addr; + pwriteMacPara->value = value; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriteMacPara, GEN_CMD_CODE(_Write_MACREG)); + rtw_enqueue_cmd(pcmdpriv, ph2c); +#endif +} + +u8 bmc_support_rate_ofdm[4] = + {IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK, + IEEE80211_OFDM_RATE_18MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK}; +u8 bmc_support_rate_cck[4] = + {IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK, + IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK}; + +void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pmlmeext->cur_wireless_mode & WIRELESS_11B) + { + // Only B, B/G, and B/G/N AP could use CCK rate + _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), bmc_support_rate_cck, 4); + } + else + { + _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), bmc_support_rate_ofdm, 4); + } +} + +int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx) +{ + unsigned int ie_len; + PNDIS_802_11_VARIABLE_IEs pIE; + int supportRateNum = 0; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len); + if (pIE == NULL) + { + return _FAIL; + } + + _rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len); + supportRateNum = ie_len; + + pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len); + if (pIE) + { + _rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); + } + + return _SUCCESS; + +} + +void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) +{ + struct sta_info *psta; + u16 tid, start_seq, param; + struct recv_reorder_ctrl *preorder_ctrl; + struct sta_priv *pstapriv = &padapter->stapriv; + struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + psta = rtw_get_stainfo(pstapriv, addr); + + if(psta) + { + start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4; + + param = le16_to_cpu(preq->BA_para_set); + tid = (param>>2)&0x0f; + + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + + #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ + preorder_ctrl->indicate_seq = start_seq; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, start_seq); + #endif + #endif + + preorder_ctrl->enable =(pmlmeinfo->bAcceptAddbaReq == _TRUE)? _TRUE :_FALSE; + } + +} + +void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) +{ + u8* pIE; + u32 *pbuf; + + pIE = pframe + sizeof(struct ieee80211_hdr_3addr); + pbuf = (u32*)pIE; + + pmlmeext->TSFValue = le32_to_cpu(*(pbuf+1)); + + pmlmeext->TSFValue = pmlmeext->TSFValue << 32; + + pmlmeext->TSFValue |= le32_to_cpu(*pbuf); +} + +void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CORRECT_TSF, 0); +} + +void beacon_timing_control(_adapter *padapter) +{ + padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter); +} + +#if 0 +unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame) +{ + unsigned short ATIMWindow; + unsigned char *pframe; + struct tx_desc *ptxdesc; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned int rate_len, len = 0; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + _rtw_memset(beacon_frame, 0, 256); + + pframe = beacon_frame + TXDESC_SIZE; + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct ieee80211_hdr_3addr); + len = sizeof(struct ieee80211_hdr_3addr); + + //timestamp will be inserted by hardware + pframe += 8; + len += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + len += 2; + + // capability info: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + len += 2; + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &len); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &len); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &len); + + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &len); + + //todo: ERP IE + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len); + } + + if ((len + TXDESC_SIZE) > 256) + { + //DBG_8192C("marc: beacon frame too large\n"); + return 0; + } + + //fill the tx descriptor + ptxdesc = (struct tx_desc *)beacon_frame; + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); //default = 32 bytes for TX Desc + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32((0x10 << QSEL_SHT) & 0x00001f00); + + //offset 8 + ptxdesc->txdw2 |= cpu_to_le32(BMC); + ptxdesc->txdw2 |= cpu_to_le32(BK); + + //offset 16 + ptxdesc->txdw4 = 0x80000000; + + //offset 20 + ptxdesc->txdw5 = 0x00000000; //1M + + return (len + TXDESC_SIZE); +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_xmit.c b/drivers/net/wireless/rtl8192c/core/rtw_xmit.c new file mode 100755 index 000000000000..259d54da3fcb --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_xmit.c @@ -0,0 +1,3779 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_XMIT_C_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_TDLS +#include +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#error "Shall be Linux or Windows, but not both!\n" +#endif + +#ifdef PLATFORM_WINDOWS +#include +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + + +static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; +static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; + +#ifdef CONFIG_TDLS +extern unsigned char MCS_rate_2R[16]; +extern unsigned char MCS_rate_1R[16]; +#endif + +static void _init_txservq(struct tx_servq *ptxservq) +{ +_func_enter_; + _rtw_init_listhead(&ptxservq->tx_pending); + _rtw_init_queue(&ptxservq->sta_pending); + ptxservq->qcnt = 0; +_func_exit_; +} + + +void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv) +{ + +_func_enter_; + + _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv)); + + _rtw_spinlock_init(&psta_xmitpriv->lock); + + //for(i = 0 ; i < MAX_NUMBLKS; i++) + // _init_txservq(&(psta_xmitpriv->blk_q[i])); + + _init_txservq(&psta_xmitpriv->be_q); + _init_txservq(&psta_xmitpriv->bk_q); + _init_txservq(&psta_xmitpriv->vi_q); + _init_txservq(&psta_xmitpriv->vo_q); + _rtw_init_listhead(&psta_xmitpriv->legacy_dz); + _rtw_init_listhead(&psta_xmitpriv->apsd); + +_func_exit_; + +} + +s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter) +{ + int i; + struct xmit_buf *pxmitbuf; + struct xmit_frame *pxframe; + sint res=_SUCCESS; + +_func_enter_; + + _rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv)); + + _rtw_spinlock_init(&pxmitpriv->lock); + _rtw_init_sema(&pxmitpriv->xmit_sema, 0); + _rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0); + + ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 1); + + /* + Please insert all the queue initializaiton using _rtw_init_queue below + */ + + pxmitpriv->adapter = padapter; + + //for(i = 0 ; i < MAX_NUMBLKS; i++) + // _rtw_init_queue(&pxmitpriv->blk_strms[i]); + + _rtw_init_queue(&pxmitpriv->be_pending); + _rtw_init_queue(&pxmitpriv->bk_pending); + _rtw_init_queue(&pxmitpriv->vi_pending); + _rtw_init_queue(&pxmitpriv->vo_pending); + _rtw_init_queue(&pxmitpriv->bm_pending); + + //_rtw_init_queue(&pxmitpriv->legacy_dz_queue); + //_rtw_init_queue(&pxmitpriv->apsd_queue); + + _rtw_init_queue(&pxmitpriv->free_xmit_queue); + + + /* + Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, + and initialize free_xmit_frame below. + Please also apply free_txobj to link_up all the xmit_frames... + */ + + pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4); + + if (pxmitpriv->pallocated_frame_buf == NULL){ + pxmitpriv->pxmit_frame_buf =NULL; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_frame fail!\n")); + res= _FAIL; + goto exit; + } + pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4); + //pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - + // ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3); + + pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; + + for (i = 0; i < NR_XMITFRAME; i++) + { + _rtw_init_listhead(&(pxframe->list)); + + pxframe->padapter = padapter; + pxframe->frame_tag = NULL_FRAMETAG; + + pxframe->pkt = NULL; + + pxframe->buf_addr = NULL; + pxframe->pxmitbuf = NULL; + + rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue)); + + pxframe++; + } + + pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME; + + pxmitpriv->frag_len = MAX_FRAG_THRESHOLD; + + + //init xmit_buf + _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue); + _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue); + + pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4); + + if (pxmitpriv->pallocated_xmitbuf == NULL){ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_buf fail!\n")); + res= _FAIL; + goto exit; + } + + pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4); + //pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - + // ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3); + + pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf; + + for (i = 0; i < NR_XMITBUFF; i++) + { + _rtw_init_listhead(&pxmitbuf->list); + + pxmitbuf->priv_data = NULL; + pxmitbuf->padapter = padapter; + pxmitbuf->ext_tag = _FALSE; + +/* + pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ); + if (pxmitbuf->pallocated_buf == NULL) + { + res = _FAIL; + goto exit; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); + //pxmitbuf->pbuf = pxmitbuf->pallocated_buf + XMITBUF_ALIGN_SZ -((SIZE_PTR) (pxmitbuf->pallocated_buf) &(XMITBUF_ALIGN_SZ-1)); +*/ + + if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ))) == _FAIL) + goto exit; + + + pxmitbuf->flags = XMIT_VO_QUEUE; + + rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue)); + #ifdef DBG_XMIT_BUF + pxmitbuf->no=i; + #endif + + pxmitbuf++; + + } + + pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF; + + // Init xmit extension buff + _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue); + + pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); + + if (pxmitpriv->pallocated_xmit_extbuf == NULL){ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n")); + res= _FAIL; + goto exit; + } + + pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4); + + pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf; + + for (i = 0; i < NR_XMIT_EXTBUFF; i++) + { + _rtw_init_listhead(&pxmitbuf->list); + + pxmitbuf->priv_data = NULL; + pxmitbuf->padapter = padapter; + pxmitbuf->ext_tag = _TRUE; + +/* + pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMIT_EXTBUF_SZ); + if (pxmitbuf->pallocated_buf == NULL) + { + res = _FAIL; + goto exit; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), 4); +*/ + + if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ)) == _FAIL) + goto exit; + + rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue)); + #ifdef DBG_XMIT_BUF + pxmitbuf->no=i; + #endif + pxmitbuf++; + + } + + pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF; + + if (rtw_alloc_hwxmits(padapter) != 0) // Modified by Yongle Lai + { + res= _FAIL; + goto exit; + } + + rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); + +#ifdef CONFIG_USB_HCI + pxmitpriv->txirp_cnt=1; + + _rtw_init_sema(&(pxmitpriv->tx_retevt), 0); + + //per AC pending irp + pxmitpriv->beq_cnt = 0; + pxmitpriv->bkq_cnt = 0; + pxmitpriv->viq_cnt = 0; + pxmitpriv->voq_cnt = 0; +#endif + + if(padapter->HalFunc.init_xmit_priv != NULL) + padapter->HalFunc.init_xmit_priv(padapter); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv) +{ + _rtw_spinlock_free(&pxmitpriv->lock); + _rtw_free_sema(&pxmitpriv->xmit_sema); + _rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema); + + _rtw_spinlock_free(&pxmitpriv->be_pending.lock); + _rtw_spinlock_free(&pxmitpriv->bk_pending.lock); + _rtw_spinlock_free(&pxmitpriv->vi_pending.lock); + _rtw_spinlock_free(&pxmitpriv->vo_pending.lock); + _rtw_spinlock_free(&pxmitpriv->bm_pending.lock); + + //_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock); + //_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock); + + _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock); + _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock); + _rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock); +} + + +void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv) +{ + int i; + _adapter *padapter = pxmitpriv->adapter; + struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; + + _func_enter_; + + padapter->HalFunc.free_xmit_priv(padapter); + + rtw_mfree_xmit_priv_lock(pxmitpriv); + + if(pxmitpriv->pxmit_frame_buf==NULL) + goto out; + + for(i=0; ipallocated_buf) + // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ); + + pxmitbuf++; + } + + if(pxmitpriv->pallocated_frame_buf) { + rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4); + } + + + if(pxmitpriv->pallocated_xmitbuf) { + rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4); + } + + // free xmit extension buff + _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock); + + pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; + for(i=0; ipallocated_buf) + // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMIT_EXTBUF_SZ); + + pxmitbuf++; + } + + if(pxmitpriv->pallocated_xmit_extbuf) { + rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); + } + + rtw_free_hwxmits(padapter); + +out: + +_func_exit_; + +} + +static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + u32 sz; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *psta = pattrib->psta; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if (pattrib->nr_frags != 1) + { + sz = padapter->xmitpriv.frag_len; + } + else //no frag + { + sz = pattrib->last_txcmdsz; + } + + // (1) RTS_Threshold is compared to the MPDU, not MSDU. + // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. + // Other fragments are protected by previous fragment. + // So we only need to check the length of first fragment. + if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec) + { + if(sz > padapter->registrypriv.rts_thresh) + { + pattrib->vcs_mode = RTS_CTS; + } + else + { + if(psta->rtsen) + pattrib->vcs_mode = RTS_CTS; + else if(psta->cts2self) + pattrib->vcs_mode = CTS_TO_SELF; + else + pattrib->vcs_mode = NONE_VCS; + } + } + else + { + while (_TRUE) + { +#if 0 //Todo + //check IOT action + if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF) + { + pattrib->vcs_mode = CTS_TO_SELF; + pattrib->rts_rate = MGN_24M; + break; + } + else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE)) + { + pattrib->vcs_mode = RTS_CTS; + pattrib->rts_rate = MGN_24M; + break; + } +#endif + //check ERP protection + if(psta->rtsen || psta->cts2self) + { + if(psta->rtsen) + pattrib->vcs_mode = RTS_CTS; + else if(psta->cts2self) + pattrib->vcs_mode = CTS_TO_SELF; + + break; + } + + //check HT op mode + if(pattrib->ht_en) + { + u8 HTOpMode = pmlmeinfo->HT_protection; + if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) || + (!pmlmeext->cur_bwmode && HTOpMode == 3) ) + { + pattrib->vcs_mode = RTS_CTS; + break; + } + } + + //check rts + if(sz > padapter->registrypriv.rts_thresh) + { + pattrib->vcs_mode = RTS_CTS; + break; + } + + //to do list: check MIMO power save condition. + + //check AMPDU aggregation for TXOP + if(pattrib->ampdu_en==_TRUE) + { + pattrib->vcs_mode = RTS_CTS; + break; + } + + pattrib->vcs_mode = NONE_VCS; + break; + } + } +} + +static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta) +{ + /*if(psta->rtsen) + pattrib->vcs_mode = RTS_CTS; + else if(psta->cts2self) + pattrib->vcs_mode = CTS_TO_SELF; + else + pattrib->vcs_mode = NONE_VCS;*/ + + pattrib->mdata = 0; + pattrib->eosp = 0; + pattrib->triggered=0; + + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi + pattrib->qos_en = psta->qos_option; + pattrib->ht_en = psta->htpriv.ht_option; + pattrib->raid = psta->raid; + pattrib->bwmode = psta->htpriv.bwmode; + pattrib->ch_offset = psta->htpriv.ch_offset; + pattrib->sgi= psta->htpriv.sgi; + pattrib->ampdu_en = _FALSE; + + if(pattrib->ht_en && psta->htpriv.ampdu_enable) + { + if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + pattrib->ampdu_en = _TRUE; + } + +} + +static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib) +{ + struct ethhdr etherhdr; + struct iphdr ip_hdr; + s32 UserPriority = 0; + + + _rtw_open_pktfile(ppktfile->pkt, ppktfile); + _rtw_pktfile_read(ppktfile, (unsigned char*)ðerhdr, ETH_HLEN); + + // get UserPriority from IP hdr + if (pattrib->ether_type == 0x0800) { + _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr)); +// UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; + UserPriority = ip_hdr.tos >> 5; + } else if (pattrib->ether_type == 0x888e) { + // "When priority processing of data frames is supported, + // a STA's SME should send EAPOL-Key frames at the highest priority." + UserPriority = 7; + } + + pattrib->priority = UserPriority; + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; + pattrib->subtype = WIFI_QOS_DATA_TYPE; +} + +static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib) +{ + uint i; + struct pkt_file pktfile; + struct sta_info *psta = NULL; + struct ethhdr etherhdr; + + sint bmcast; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + sint res = _SUCCESS; + + _func_enter_; + + _rtw_open_pktfile(pkt, &pktfile); + i = _rtw_pktfile_read(&pktfile, (u8*)ðerhdr, ETH_HLEN); + + pattrib->ether_type = ntohs(etherhdr.h_proto); + + + _rtw_memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN); + _rtw_memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN); + + pattrib->pctrl = 0; + + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + } + else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + } + else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN); + } + + pattrib->pktlen = pktfile.pkt_len; // rtw_xmitframe_coalesce() overwirte this! + + if (ETH_P_IP == pattrib->ether_type) + { + // The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time + // to prevent DHCP protocol fail + u8 tmp[24]; + _rtw_pktfile_read(&pktfile, &tmp[0], 24); + pattrib->dhcp_pkt = 0; + if (pktfile.pkt_len > 282) {//MINIMUM_DHCP_PACKET_SIZE) { + if (ETH_P_IP == pattrib->ether_type) {// IP header + if (((tmp[21] == 68) && (tmp[23] == 67)) || + ((tmp[21] == 67) && (tmp[23] == 68))) { + // 68 : UDP BOOTP client + // 67 : UDP BOOTP server + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("======================update_attrib: get DHCP Packet \n")); + // Use low rate to send DHCP packet. + //if(pMgntInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom) + //{ + // tcb_desc->DataRate = MgntQuery_TxRateExcludeCCKRates(ieee);//0xc;//ofdm 6m + // tcb_desc->bTxDisableRateFallBack = false; + //} + //else + // pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate; + //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate)); + pattrib->dhcp_pkt = 1; + } + } + } + } + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + if ( (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) + { + rtw_set_scan_deny(pmlmepriv, 3000); + } + #endif + +#ifdef CONFIG_LPS + // If EAPOL , ARP , OR DHCP packet, driver must be in active mode. + if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) + { + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1); + } +#endif + + bmcast = IS_MCAST(pattrib->ra); + + // get sta_info + if (bmcast) { + psta = rtw_get_bcmc_stainfo(padapter); + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + if (psta == NULL) { // if we cannot get psta => drrp the pkt + RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra))); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); + #endif + res =_FAIL; + goto exit; + } + } + + if (psta) + { + pattrib->mac_id = psta->mac_id; + pattrib->psta = psta; + } + else + { + // if we cannot get psta => drop the pkt + RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra))); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); + #endif + res = _FAIL; + goto exit; + } + + pattrib->ack_policy = 0; + // get ether_hdr_len + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA_TYPE; + pattrib->priority = 0; + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) + { + if(psta->qos_option) + set_qos(&pktfile, pattrib); + } + else + { + if(pqospriv->qos_option) + set_qos(&pktfile, pattrib); + } + + //pattrib->priority = 5; //force to used VI queue, for testing + + if (psta->ieee8021x_blocked == _TRUE) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n")); + + pattrib->encrypt = 0; + + if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type)); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n", __FUNCTION__,pattrib->ether_type); + #endif + res = _FAIL; + goto exit; + } + } + else + { + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); + + switch(psecuritypriv->dot11AuthAlgrthm) + { + case dot11AuthAlgrthm_Open: + case dot11AuthAlgrthm_Shared: + case dot11AuthAlgrthm_Auto: + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; + break; + case dot11AuthAlgrthm_8021X: + if(bmcast) + pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid; + else + pattrib->key_idx = 0; + break; + default: + pattrib->key_idx = 0; + break; + } + + + } + + switch (pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + pattrib->iv_len = 4; + pattrib->icv_len = 4; + break; + + case _TKIP_: + pattrib->iv_len = 8; + pattrib->icv_len = 4; + + if(padapter->securitypriv.busetkipkey==_FAIL) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npadapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", padapter->securitypriv.busetkipkey)); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s padapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, padapter->securitypriv.busetkipkey); + #endif + res =_FAIL; + goto exit; + } + + break; + case _AES_: + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n pattrib->encrypt=%d (_AES_)\n",pattrib->encrypt)); + pattrib->iv_len = 8; + pattrib->icv_len = 8; + break; + + default: + pattrib->iv_len = 0; + pattrib->icv_len = 0; + break; + } + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, + ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n", + pattrib->encrypt, padapter->securitypriv.sw_encrypt)); + + if (pattrib->encrypt && + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) + { + pattrib->bswenc = _TRUE; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_, + ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n", + pattrib->encrypt, padapter->securitypriv.sw_encrypt)); + } else { + pattrib->bswenc = _FALSE; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n")); + } + + rtw_set_tx_chksum_offload(pkt, pattrib); + + update_attrib_phy_info(pattrib, psta); + +exit: + +_func_exit_; + + return res; +} + +static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){ + sint curfragnum,length; + u8 *pframe, *payload,mic[8]; + struct mic_data micdata; + struct sta_info *stainfo; + struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + u8 priority[4]={0x0,0x0,0x0,0x0}; + sint bmcst = IS_MCAST(pattrib->ra); + + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]); + } + + + +_func_enter_; + + if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_) + { + //encode mic code + if(stainfo!= NULL){ + u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = pxmitframe->buf_addr + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = pxmitframe->buf_addr + TXDESC_OFFSET; +#endif + + if(bmcst) + { + if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){ + //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); + //rtw_msleep_os(10); + return _FAIL; + } + //start to calculate the mic code + rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey); + } + else + { + if(_rtw_memcmp(&stainfo->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){ + //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); + //rtw_msleep_os(10); + return _FAIL; + } + //start to calculate the mic code + rtw_secmicsetkey(&micdata, &stainfo->dot11tkiptxmickey.skey[0]); + } + + if(pframe[1]&1){ //ToDS==1 + rtw_secmicappend(&micdata, &pframe[16], 6); //DA + if(pframe[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &pframe[24], 6); + else + rtw_secmicappend(&micdata, &pframe[10], 6); + } + else{ //ToDS==0 + rtw_secmicappend(&micdata, &pframe[4], 6); //DA + if(pframe[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &pframe[16], 6); + else + rtw_secmicappend(&micdata, &pframe[10], 6); + + } + + if(pqospriv->qos_option==1) + priority[0]=(u8)pxmitframe->attrib.priority; + + + rtw_secmicappend(&micdata, &priority[0], 4); + + payload=pframe; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++){ + payload=(u8 *)RND4((SIZE_PTR)(payload)); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n", + curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7))); + + payload=payload+pattrib->hdrlen+pattrib->iv_len; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len)); + if((curfragnum+1)==pattrib->nr_frags){ + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); + rtw_secmicappend(&micdata, payload,length); + payload=payload+length; + } + else{ + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); + rtw_secmicappend(&micdata, payload, length); + payload=payload+length+pattrib->icv_len; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len)); + } + } + rtw_secgetmic(&micdata,&(mic[0])); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n")); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz)); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \n\ + mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n", + mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7])); + //add mic code and add the mic code length in last_txcmdsz + + _rtw_memcpy(payload, &(mic[0]),8); + pattrib->last_txcmdsz+=8; + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n")); + payload=payload-pattrib->last_txcmdsz+8; + for(curfragnum=0;curfragnumlast_txcmdsz;curfragnum=curfragnum+8) + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ", + *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3), + *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7))); + } + else{ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n")); + } + } + +_func_exit_; + + return _SUCCESS; +} + +static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + +_func_enter_; + + //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc)) + if(pattrib->bswenc) + { + //DBG_8192C("start xmitframe_swencrypt\n"); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n")); + switch(pattrib->encrypt){ + case _WEP40_: + case _WEP104_: + rtw_wep_encrypt(padapter, (u8 *)pxmitframe); + break; + case _TKIP_: + rtw_tkip_encrypt(padapter, (u8 *)pxmitframe); + break; + case _AES_: + rtw_aes_encrypt(padapter, (u8 * )pxmitframe); + break; + default: + break; + } + + } else { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n")); + } + +_func_exit_; + + return _SUCCESS; +} + +s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib) +{ + u16 *qc; + + struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv = &pmlmepriv->qospriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#ifdef CONFIG_TDLS + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + u8 tdls_seq=0; +#endif + +//#ifdef CONFIG_PWRCTRL +// struct pwrctrl_priv *pwrpriv = &(padapter->pwrctrlpriv); +//#endif + + sint res = _SUCCESS; + u16 *fctrl = &pwlanhdr->frame_ctl; + +_func_enter_; + + _rtw_memset(hdr, 0, WLANHDR_OFFSET); + + SetFrameSubType(fctrl, pattrib->subtype); + + if (pattrib->subtype & WIFI_DATA_TYPE) + { + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) { + //to_ds = 1, fr_ds = 0; +#ifdef CONFIG_TDLS + if((pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE)){ + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if((ptdls_sta!=NULL)&&((ptdls_sta->state & TDLS_LINKED_STATE)==TDLS_LINKED_STATE)&&(pattrib->ether_type!=0x0806)){ + //TDLS data transfer, ToDS=0, FrDs=0 + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); + tdls_seq=1; + }else{ + // 1.usual data transfer + // 2.Arp pkt will relayed by AP + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); + } + }else +#endif + { + //usual data transfer + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); + } + } + else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) { + //to_ds = 0, fr_ds = 1; + SetFrDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN); + } + else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); + } + else { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv))); + res = _FAIL; + goto exit; + } + +/*#ifdef CONFIG_PWRCTRL + if (pwrpriv->cpwm >= FW_PWR1 && !(padapter->mlmepriv.sitesurveyctrl.traffic_busy)) + SetPwrMgt(fctrl); +#else + if ((get_fwstate(pmlmepriv)) & WIFI_SLEEP_STATE) + SetPwrMgt(fctrl); +#endif*/ + + if(pattrib->mdata) + SetMData(fctrl); + + if (pattrib->encrypt) + SetPrivacy(fctrl); + + if (pqospriv->qos_option) + { + qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); + + if (pattrib->priority) + SetPriority(qc, pattrib->priority); + + + SetEOSP(qc, pattrib->eosp); + + SetAckpolicy(qc, pattrib->ack_policy); + } + + //TODO: fill HT Control Field + + //Update Seq Num will be handled by f/w + { + struct sta_info *psta; + + sint bmcst = IS_MCAST(pattrib->ra); + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + if(bmcst) { + psta = rtw_get_bcmc_stainfo(padapter); + } else { + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } + } + +#ifdef CONFIG_TDLS + // 1. update seq_num per link by sta_info + // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len + if(tdls_seq==1){ + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + + SetSeqNum(hdr, pattrib->seqnum); + + if (pattrib->encrypt){ + pattrib->encrypt= _AES_; + pattrib->iv_len=8; + pattrib->icv_len=8; + } + }else +#endif + if(psta){ + psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + + pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; + + SetSeqNum(hdr, pattrib->seqnum); + } + } + } + else + { + + } + +exit: + +_func_exit_; + + return res; +} + +s32 rtw_txframes_pending(_adapter *padapter) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE)); +} + +s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib) +{ + struct sta_info *psta; + struct tx_servq *ptxservq; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + int priority = pattrib->priority; + + psta = pattrib->psta; + + switch(priority) + { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + break; + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + break; + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + break; + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + break; + + } + + return ptxservq->qcnt; +} + +#ifdef CONFIG_TDLS +void fill_tdls_setup_req_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ieee80211_ht_cap ht_capie; + struct sta_priv *pstapriv=&padapter->stapriv; + struct sta_info *ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_REQUEST; + unsigned char bssrate[NumRates]; + int bssrate_len = 0, i = 0 ; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch. + //RSNIE + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + u8 iedata=0; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 time; + + //SNonce + if(pattrib->encrypt){ + for(i=0;i<8;i++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pregistrypriv->dev_network.SupportedRates[bssrate_len]== 0) break; + bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; + } + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, wmm_ie, &(pattrib->pktlen)); + + //FTIE(optional) + if(pattrib->encrypt){ + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + + } + + //Sup_reg_classes(optional) + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | + (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; + + switch(pHalData->rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_setup_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ieee80211_ht_cap ht_capie; + + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_RESPONSE; + unsigned char bssrate[NumRates]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u16 *stat_code = (u16 *)&pattrib->type; + u8 *dialog_token = &pattrib->nr_frags; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch + u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + u8 iedata=0; + u8 timeout_itvl[5]; //setup response timeout interval will copy from request + u8 ANonce[32]; //maybe it can put in ontdls_req + u8 k; //for random ANonce + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + u32 time; + + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if(pattrib->encrypt){ + for(k=0;k<8;k++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + return; + + //dialog token + pframe = rtw_set_fixed_ie(pframe, 1, dialog_token, &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt ) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pregistrypriv->dev_network.SupportedRates[bssrate_len]== 0) break; + bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; + } + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + } + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, wmm_ie, &(pattrib->pktlen)); + + //FTIE(optional) + if(pattrib->encrypt){ + wpa_tdls_generate_tpk(padapter, ptdls_sta); + + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | + (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; + + switch(pHalData->rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill ftie mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +} + +void fill_tdls_setup_cfm_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_CONFIRM; + unsigned char bssrate[NumRates]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u8 *dialog_token = &pattrib->nr_frags; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, dialog_token, &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + return; + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + } + + //EDCA param set; WMM param ele. + if(pattrib->encrypt){ + //FTIE + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + ptdls_sta->TPK_count=0; + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //HT operation; todo + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill ftie mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +} + +void fill_tdls_teardown_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_TEARDOWN; + unsigned char reason = _RSON_TDLS_TEAR_UN_RSN_; + u8 link_id_addr[18] = {0}; + + struct sta_info *ptear_sta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(reason), &(pattrib->pktlen)); + + //Link identifier + ptear_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if((ptear_sta->state & TDLS_INITIATOR_STATE)==TDLS_INITIATOR_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + }else if((ptear_sta->state & TDLS_RESPONDER_STATE)==TDLS_RESPONDER_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + } + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_dis_req_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_DISCOVERY_REQUEST; + u8 link_id_addr[18] = {0}; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_dis_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ieee80211_ht_cap ht_capie; + + unsigned char category = WLAN_CATEGORY_PUBLIC; + unsigned char action = TDLS_DISCOVERY_RESPONSE; + unsigned char bssrate[NumRates]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch. + //RSNIE + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + u8 iedata=0; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 timeout_interval= TPK_RESEND_COUNT * 1000; + + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pregistrypriv->dev_network.SupportedRates[bssrate_len] == 0) break; + bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; + } + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + + //extended capability + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); + + //FTIE + if(pattrib->encrypt){ + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + pframe += 84; + pattrib->pktlen += 84; + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + + } + + //Sup_reg_classes(optional) + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | + (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; + + switch(pHalData->rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_peer_traffic_indication(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; + u8 link_id_addr[18] = {0}; + u8 AC_queue=0; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //PTI control + //PU buffer status + if(ptdls_sta->uapsd_bk&BIT(0)) + AC_queue=BIT(0); + if(ptdls_sta->uapsd_be&BIT(0)) + AC_queue=BIT(1); + if(ptdls_sta->uapsd_vi&BIT(0)) + AC_queue=BIT(2); + if(ptdls_sta->uapsd_vo&BIT(0)) + AC_queue=BIT(3); + pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); + +} + +void fill_tdls_ch_switch_req(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 ch_switch_timing[4] = {0}; + u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, target_ch + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->tdls_candidate_ch), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + + //update ch switch attrib to sta_info + ptdls_sta->off_ch=pmlmeinfo->tdls_candidate_ch; + ptdls_sta->ch_switch_time=switch_time; + ptdls_sta->ch_switch_timeout=switch_timeout; + +} + +void fill_tdls_ch_switch_rsp(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 ch_switch_timing[4] = {0}; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status_code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + +} + +int fill_tdls_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 action) +{ + int res=_SUCCESS; + + switch(action){ + case TDLS_SETUP_REQUEST: + fill_tdls_setup_req_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_SETUP_RESPONSE: + fill_tdls_setup_rsp_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_SETUP_CONFIRM: + fill_tdls_setup_cfm_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_TEARDOWN: + fill_tdls_teardown_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_DISCOVERY_REQUEST: + fill_tdls_dis_req_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_PEER_TRAFFIC_INDICATION: + fill_tdls_peer_traffic_indication(padapter, pxmitframe, pframe); + break; + case TDLS_CHANNEL_SWITCH_REQUEST: + fill_tdls_ch_switch_req(padapter, pxmitframe, pframe); + break; + case TDLS_CHANNEL_SWITCH_RESPONSE: + fill_tdls_ch_switch_rsp(padapter, pxmitframe, pframe); + break; + default: + res=_FAIL; + break; + } + + return res; +} + +s32 make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, u8 action) +{ + u16 *qc; + struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv = &pmlmepriv->qospriv; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta=NULL, *ptdls_sta=NULL; + u8 tdls_seq=0; + + sint res = _SUCCESS; + u16 *fctrl = &pwlanhdr->frame_ctl; + +_func_enter_; + + _rtw_memset(hdr, 0, WLANHDR_OFFSET); + + SetFrameSubType(fctrl, pattrib->subtype); + + switch(action){ + case TDLS_SETUP_REQUEST: + case TDLS_SETUP_RESPONSE: + case TDLS_SETUP_CONFIRM: + case TDLS_TEARDOWN: //directly to peer STA or via AP + case TDLS_PEER_TRAFFIC_INDICATION: + case TDLS_PEER_PSM_REQUEST: //directly to peer STA or via AP + case TDLS_DISCOVERY_REQUEST: //unicast: directly to peer sta, Bcast: via AP + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); + break; + case TDLS_CHANNEL_SWITCH_REQUEST: + case TDLS_CHANNEL_SWITCH_RESPONSE: + case TDLS_PEER_PSM_RESPONSE: + case TDLS_PEER_TRAFFIC_RESPONSE: + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); + tdls_seq=1; + break; + } + + if (pattrib->encrypt) + SetPrivacy(fctrl); + + if (pqospriv->qos_option) + { + qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); + if (pattrib->priority) + SetPriority(qc, pattrib->priority); + SetAckpolicy(qc, pattrib->ack_policy); + } + + psta = pattrib->psta; + + // 1. update seq_num per link by sta_info + // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len + if(tdls_seq==1){ + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + if(ptdls_sta){ + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(hdr, pattrib->seqnum); + + if (pattrib->encrypt){ + pattrib->encrypt= _AES_; + pattrib->iv_len=8; + pattrib->icv_len=8; + } + }else{ + res=_FAIL; + goto exit; + } + }else if(psta){ + psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(hdr, pattrib->seqnum); + } + + +exit: + +_func_exit_; + + return res; +} + +s32 xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, u8 action) +{ + s32 llc_sz, mem_sz; + + SIZE_PTR addr; + + u8 *pframe, *mem_start; + + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 *pbuf_start; + s32 bmcst = IS_MCAST(pattrib->ra); + s32 res = _SUCCESS; + +_func_enter_; + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + if(bmcst) { + psta = rtw_get_bcmc_stainfo(padapter); + } else { + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } + } + + if(psta==NULL) + return _FAIL; + + if (pxmitframe->buf_addr == NULL) + return _FAIL; + + pbuf_start = pxmitframe->buf_addr; + mem_start = pbuf_start + TXDESC_OFFSET; + + if (make_tdls_wlanhdr(padapter, mem_start, pattrib, action) == _FAIL) { + res = _FAIL; + goto exit; + } + + pframe = mem_start; + pframe += pattrib->hdrlen; + + //adding icv, if necessary... + if (pattrib->iv_len) + { + if (psta != NULL) + { + switch(pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + break; + case _TKIP_: + if(bmcst) + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + TKIP_IV(pattrib->iv, psta->dot11txpn, 0); + break; + case _AES_: + if(bmcst) + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + AES_IV(pattrib->iv, psta->dot11txpn, 0); + break; + } + } + + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); + pframe += pattrib->iv_len; + + } + + llc_sz = rtw_put_snap(pframe, pattrib->ether_type); + pframe += llc_sz; + + //pattrib->pktlen will be counted in fill_tdls_frbody + pattrib->pktlen = 0; + + fill_tdls_frbody(padapter, pxmitframe, pframe, action); + + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + pframe += pattrib->icv_len; + } + + pattrib->nr_frags = 1; + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz + + ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen; + + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) + { + goto exit; + } + + xmitframe_swencrypt(padapter, pxmitframe); + + update_attrib_vcs_info(padapter, pxmitframe); + +exit: + +_func_exit_; + + return res; +} +#endif + +/* + +This sub-routine will perform all the following: + +1. remove 802.3 header. +2. create wlan_header, based on the info in pxmitframe +3. append sta's iv/ext-iv +4. append LLC +5. move frag chunk from pframe to pxmitframe->mem +6. apply sw-encrypt, if necessary. + +*/ +s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe) +{ + struct pkt_file pktfile; + + s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz; + + SIZE_PTR addr; + + u8 *pframe, *mem_start; + + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + u8 *pbuf_start; + + s32 bmcst = IS_MCAST(pattrib->ra); + s32 res = _SUCCESS; + +_func_enter_; + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } + + if(psta==NULL) + return _FAIL; + + if (pxmitframe->buf_addr == NULL) + return _FAIL; + + pbuf_start = pxmitframe->buf_addr; + +#ifdef CONFIG_USB_TX_AGGREGATION + mem_start = pbuf_start + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); +#else + mem_start = pbuf_start + TXDESC_OFFSET; +#endif + + if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n")); + res = _FAIL; + goto exit; + } + + _rtw_open_pktfile(pkt, &pktfile); + _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen); + + pattrib->pktlen = pktfile.pkt_len; + + frg_inx = 0; + frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342 + + while (1) + { + llc_sz = 0; + + mpdu_len = frg_len; + + pframe = mem_start; + + SetMFrag(mem_start); + + pframe += pattrib->hdrlen; + mpdu_len -= pattrib->hdrlen; + + //adding icv, if necessary... + if (pattrib->iv_len) + { + //if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) + // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + //else + // psta = rtw_get_stainfo(pstapriv, pattrib->ra); + + if (psta != NULL) + { + switch(pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + break; + case _TKIP_: + if(bmcst) + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + TKIP_IV(pattrib->iv, psta->dot11txpn, 0); + break; + case _AES_: + if(bmcst) + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + AES_IV(pattrib->iv, psta->dot11txpn, 0); + break; + } + } + + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_, + ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n", + padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3))); + + pframe += pattrib->iv_len; + + mpdu_len -= pattrib->iv_len; + } + + if (frg_inx == 0) { + llc_sz = rtw_put_snap(pframe, pattrib->ether_type); + pframe += llc_sz; + mpdu_len -= llc_sz; + } + + if ((pattrib->icv_len >0) && (pattrib->bswenc)) { + mpdu_len -= pattrib->icv_len; + } + + + if (bmcst) { + // don't do fragment to broadcat/multicast packets + mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen); + } else { + mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len); + } + + pframe += mem_sz; + + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + pframe += pattrib->icv_len; + } + + frg_inx++; + + if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE)) + { + pattrib->nr_frags = frg_inx; + + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) + + ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz; + + ClearMFrag(mem_start); + +#ifdef CONFIG_SDIO_HCI + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("coalesce: pattrib->last_txcmdsz=%d pxmitframe->pxmitbuf->phead=0x%p pxmitframe->pxmitbuf->ptail=0x%p pxmitframe->pxmitbuf->len=%d\n", pattrib->last_txcmdsz, pxmitframe->pxmitbuf->phead, pxmitframe->pxmitbuf->ptail, pxmitframe->pxmitbuf->len)); + pxmitframe->pxmitbuf->ptail = pxmitframe->buf_addr + _RND512(pframe-pxmitframe->buf_addr); + pxmitframe->pxmitbuf->len += pxmitframe->pxmitbuf->ptail - pxmitframe->buf_addr;//(pframe-mem_start); + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("coalesce: [2] pattrib->last_txcmdsz=%d pxmitframe->pxmitbuf->ptail=0x%p pxmitframe->pxmitbuf->len=%d\n", pattrib->last_txcmdsz, pxmitframe->pxmitbuf->ptail, pxmitframe->pxmitbuf->len)); +#endif + + break; + + } else { + +#ifdef CONFIG_SDIO_HCI + pxmitframe->pxmitbuf->ptail = pxmitframe->buf_addr + _RND512(pframe-pxmitframe->buf_addr); + pxmitframe->pxmitbuf->len += pxmitframe->pxmitbuf->ptail - pxmitframe->buf_addr; + pframe=pxmitframe->pxmitbuf->ptail; +#endif + } + + addr = (SIZE_PTR)(pframe); + + mem_start = (unsigned char *)RND4(addr) + TXDESC_OFFSET; + _rtw_memcpy(mem_start, pbuf_start + TXDESC_OFFSET, pattrib->hdrlen); + } + + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) + { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n")); + res = _FAIL; + goto exit; + } + +#ifdef CONFIG_SDIO_HCI + fillin_txdesc(padapter, pxmitframe); +#endif + + xmitframe_swencrypt(padapter, pxmitframe); + + if(bmcst == _FALSE) + update_attrib_vcs_info(padapter, pxmitframe); + else + pattrib->vcs_mode = NONE_VCS; + +exit: + +_func_exit_; + + return res; +} + +/* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header + * IEEE LLC/SNAP header contains 8 octets + * First 3 octets comprise the LLC portion + * SNAP portion, 5 octets, is divided into two fields: + * Organizationally Unique Identifier(OUI), 3 octets, + * type, defined by that organization, 2 octets. + */ +s32 rtw_put_snap(u8 *data, u16 h_proto) +{ + struct ieee80211_snap_hdr *snap; + u8 *oui; + +_func_enter_; + + snap = (struct ieee80211_snap_hdr *)data; + snap->dsap = 0xaa; + snap->ssap = 0xaa; + snap->ctrl = 0x03; + + if (h_proto == 0x8137 || h_proto == 0x80f3) + oui = P802_1H_OUI; + else + oui = RFC1042_OUI; + + snap->oui[0] = oui[0]; + snap->oui[1] = oui[1]; + snap->oui[2] = oui[2]; + + *(u16 *)(data + SNAP_SIZE) = htons(h_proto); + +_func_exit_; + + return SNAP_SIZE + sizeof(u16); +} + +void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len) +{ + + uint protection; + u8 *perp; + sint erp_len; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + +_func_enter_; + + switch(pxmitpriv->vcs_setting) + { + case DISABLE_VCS: + pxmitpriv->vcs = NONE_VCS; + break; + + case ENABLE_VCS: + break; + + case AUTO_VCS: + default: + perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len); + if(perp == NULL) + { + pxmitpriv->vcs = NONE_VCS; + } + else + { + protection = (*(perp + 2)) & BIT(1); + if (protection) + { + if(pregistrypriv->vcs_type == RTS_CTS) + pxmitpriv->vcs = RTS_CTS; + else + pxmitpriv->vcs = CTS_TO_SELF; + } + else + pxmitpriv->vcs = NONE_VCS; + } + + break; + + } + +_func_exit_; + +} + +void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz) +{ + struct sta_info *psta = NULL; + struct stainfo_stats *pstats = NULL; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) + { + pxmitpriv->tx_bytes += sz; +#ifdef CONFIG_USB_TX_AGGREGATION + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pxmitframe->agg_num; +#else + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod++; +#endif + + psta = pxmitframe->attrib.psta; + + if(psta) + { + pstats = &psta->sta_stats; +#ifdef CONFIG_USB_TX_AGGREGATION + pstats->tx_pkts += pxmitframe->agg_num; +#else + pstats->tx_pkts++; +#endif + pstats->tx_bytes += sz; + } + } + +} + +struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv) +{ + _irqL irqL; + struct xmit_buf *pxmitbuf = NULL; + _list *plist, *phead; + _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; + +_func_enter_; + + _enter_critical(&pfree_queue->lock, &irqL); + + if(_rtw_queue_empty(pfree_queue) == _TRUE) { + pxmitbuf = NULL; + } else { + + phead = get_list_head(pfree_queue); + + plist = get_next(phead); + + pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list); + + rtw_list_delete(&(pxmitbuf->list)); + } + + if (pxmitbuf != NULL) + { + pxmitpriv->free_xmit_extbuf_cnt--; + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt); + #endif + + + pxmitbuf->priv_data = NULL; + +#ifdef CONFIG_SDIO_HCI + pxmitbuf->len = 0; + pxmitbuf->phead = pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->pbuf; + pxmitbuf->pend = pxmitbuf->pbuf + (MAX_XMIT_EXTBUF_SZ-4); +#endif +#ifdef CONFIG_PCI_HCI + pxmitbuf->len = 0; +#endif + } + + _exit_critical(&pfree_queue->lock, &irqL); + +_func_exit_; + + return pxmitbuf; +} + +s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + _irqL irqL; + _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; + +_func_enter_; + + if(pxmitbuf==NULL) + { + return _FAIL; + } + + _enter_critical(&pfree_queue->lock, &irqL); + + rtw_list_delete(&pxmitbuf->list); + + rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue)); + pxmitpriv->free_xmit_extbuf_cnt++; + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt); + #endif + + _exit_critical(&pfree_queue->lock, &irqL); + +_func_exit_; + + return _SUCCESS; +} + +struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv) +{ + _irqL irqL; + struct xmit_buf *pxmitbuf = NULL; + _list *plist, *phead; + _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; + +_func_enter_; + + //DBG_8192C("+rtw_alloc_xmitbuf\n"); + + _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); + + if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) { + pxmitbuf = NULL; + } else { + + phead = get_list_head(pfree_xmitbuf_queue); + + plist = get_next(phead); + + pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list); + + rtw_list_delete(&(pxmitbuf->list)); + } + + if (pxmitbuf != NULL) + { + pxmitpriv->free_xmitbuf_cnt--; + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt); + #endif + //DBG_8192C("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); + + pxmitbuf->priv_data = NULL; + +#ifdef CONFIG_SDIO_HCI + pxmitbuf->len = 0; + pxmitbuf->phead = pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->pbuf; + pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ; +#endif +#ifdef CONFIG_PCI_HCI + pxmitbuf->len = 0; +#endif + } + #ifdef DBG_XMIT_BUF + else + { + DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n"); + } + #endif + + _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); + +_func_exit_; + + return pxmitbuf; +} + +s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + _irqL irqL; + _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; + +_func_enter_; + + //DBG_8192C("+rtw_free_xmitbuf\n"); + + if(pxmitbuf==NULL) + { + return _FAIL; + } + + if(pxmitbuf->ext_tag) + { + rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf); + } + else + { + _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); + + rtw_list_delete(&pxmitbuf->list); + + rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue)); + + pxmitpriv->free_xmitbuf_cnt++; + //DBG_8192C("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt); + #endif + _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); + } + +_func_exit_; + + return _SUCCESS; +} + +/* +Calling context: +1. OS_TXENTRY +2. RXENTRY (rx_thread or RX_ISR/RX_CallBack) + +If we turn on USE_RXTHREAD, then, no need for critical section. +Otherwise, we must use _enter/_exit critical to protect free_xmit_queue... + +Must be very very cautious... + +*/ + +struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue) +{ + /* + Please remember to use all the osdep_service api, + and lock/unlock or _enter/_exit critical to protect + pfree_xmit_queue + */ + + _irqL irqL; + struct xmit_frame *pxframe = NULL; + _list *plist, *phead; + _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; + _adapter *padapter = pxmitpriv->adapter; + +_func_enter_; + + _enter_critical_bh(&pfree_xmit_queue->lock, &irqL); + + if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt)); + pxframe = NULL; + } else { + phead = get_list_head(pfree_xmit_queue); + + plist = get_next(phead); + + pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list); + + rtw_list_delete(&(pxframe->list)); + } + + if (pxframe != NULL) + { + pxmitpriv->free_xmitframe_cnt--; + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); + + pxframe->buf_addr = NULL; + pxframe->pxmitbuf = NULL; + + _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib)); + //pxframe->attrib.psta = NULL; + + pxframe->frame_tag = DATA_FRAMETAG; + +#ifdef CONFIG_USB_HCI + pxframe->pkt = NULL; + pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc + +#ifdef CONFIG_USB_TX_AGGREGATION + pxframe->agg_num = 1; +#endif + +#endif //#ifdef CONFIG_USB_HCI + +#ifdef PLATFORM_LINUX + if(pxmitpriv->free_xmitframe_cnt==1) + { + if (!netif_queue_stopped(padapter->pnetdev)) + netif_stop_queue(padapter->pnetdev); + } +#endif + + } + + _exit_critical_bh(&pfree_xmit_queue->lock, &irqL); + +_func_exit_; + + return pxframe; +} + +s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) +{ + _irqL irqL; + _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; + _adapter *padapter = pxmitpriv->adapter; + _pkt *pndis_pkt = NULL; + +_func_enter_; + + if (pxmitframe == NULL) { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n")); + goto exit; + } + + _enter_critical_bh(&pfree_xmit_queue->lock, &irqL); + + rtw_list_delete(&pxmitframe->list); + + if (pxmitframe->pkt){ + pndis_pkt = pxmitframe->pkt; + pxmitframe->pkt = NULL; + } + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(pfree_xmit_queue)); + + pxmitpriv->free_xmitframe_cnt++; + RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); + + _exit_critical_bh(&pfree_xmit_queue->lock, &irqL); + + + if(pndis_pkt) + rtw_os_pkt_complete(padapter, pndis_pkt); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +s32 rtw_free_xmitframe_ex(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) +{ + +_func_enter_; + + if(pxmitframe==NULL){ + goto exit; + } + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe_ex()\n")); + + rtw_free_xmitframe(pxmitpriv, pxmitframe); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue) +{ + _irqL irqL; + _list *plist, *phead; + struct xmit_frame *pxmitframe; + +_func_enter_; + + _enter_critical_bh(&(pframequeue->lock), &irqL); + + phead = get_list_head(pframequeue); + plist = get_next(phead); + + while (rtw_end_of_queue_search(phead, plist) == _FALSE) + { + + pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list); + + plist = get_next(plist); + + rtw_free_xmitframe(pxmitpriv,pxmitframe); + + } + _exit_critical_bh(&(pframequeue->lock), &irqL); + +_func_exit_; +} + +s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) + { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, + ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n")); +// pxmitframe->pkt = NULL; + return _FAIL; + } + + return _SUCCESS; +} + +static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue) +{ + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + _adapter *padapter = pxmitpriv->adapter; +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; +#endif + + xmitframe_phead = get_list_head(pframe_queue); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + +/*#ifdef RTK_DMP_PLATFORM +#ifdef CONFIG_USB_TX_AGGREGATION + if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2)) + { + pxmitframe = NULL; + + tasklet_schedule(&pxmitpriv->xmit_tasklet); + + break; + } +#endif +#endif*/ + rtw_list_delete(&pxmitframe->list); + + ptxservq->qcnt--; + +#ifndef CONFIG_TDLS +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)==_FALSE) +#endif + { + //rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending); + + //ptxservq->qcnt--; + + break; + } +//else CONFIG_TDLS, process as TDLS Buffer STA +#else + if((pmlmeinfo->tdls_setup_state&TDLS_LINKED_STATE)!=TDLS_LINKED_STATE) + break; + if(xmit_tdls_enqueue_for_sleeping_sta(padapter, pxmitframe)==_FALSE) + break; +#endif + + + pxmitframe = NULL; + + } + + return pxmitframe; +} + +struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry) +{ + _irqL irqL0; + _list *sta_plist, *sta_phead; + struct hw_xmit *phwxmit; + struct tx_servq *ptxservq = NULL; + _queue *pframe_queue = NULL; + struct xmit_frame *pxmitframe = NULL; + _adapter *padapter = pxmitpriv->adapter; + struct registry_priv *pregpriv = &padapter->registrypriv; + int i, inx[4]; +#ifdef CONFIG_USB_HCI +// int j, tmp, acirp_cnt[4]; +#endif + +_func_enter_; + + inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; + + if(pregpriv->wifi_spec==1) + { + int j, tmp, acirp_cnt[4]; +#if 0 + if(flagsvo, 1->vi, 2->be, 3->bk. + acirp_cnt[0] = pxmitpriv->voq_cnt; + acirp_cnt[1] = pxmitpriv->viq_cnt; + acirp_cnt[2] = pxmitpriv->beq_cnt; + acirp_cnt[3] = pxmitpriv->bkq_cnt; + + for(i=0; i<4; i++) + { + for(j=i+1; j<4; j++) + { + if(acirp_cnt[j]lock, &irqL0); + + for(i = 0; i < entry; i++) + { + phwxmit = phwxmit_i + inx[i]; + + //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + + sta_phead = get_list_head(phwxmit->sta_queue); + sta_plist = get_next(sta_phead); + + while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE) + { + + ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending); + + pframe_queue = &ptxservq->sta_pending; + + pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue); + + if(pxmitframe) + { + phwxmit->accnt--; + + //Remove sta node when there is no pending packets. + if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break + rtw_list_delete(&ptxservq->tx_pending); + + //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + + goto exit; + } + + sta_plist = get_next(sta_plist); + + } + + //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + + } + +exit: + + _exit_critical_bh(&pxmitpriv->lock, &irqL0); + +_func_exit_; + + return pxmitframe; +} + +#if 1 +struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac) +{ + struct tx_servq *ptxservq; + +_func_enter_; + + switch (up) + { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + *(ac) = 3; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + *(ac) = 1; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + *(ac) = 0; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + *(ac) = 2; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); + break; + + } + +_func_exit_; + + return ptxservq; +} +#else +__inline static struct tx_servq *rtw_get_sta_pending + (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up) +{ + struct tx_servq *ptxservq; + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; + +_func_enter_; + +#ifdef CONFIG_RTL8711 + + if(IS_MCAST(psta->hwaddr)) + { + ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo + *ppstapending = &padapter->xmitpriv.bm_pending; + } + else +#endif + { + switch (up) + { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + *ppstapending = &padapter->xmitpriv.bk_pending; + (phwxmits+3)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + *ppstapending = &padapter->xmitpriv.vi_pending; + (phwxmits+1)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + *ppstapending = &padapter->xmitpriv.vo_pending; + (phwxmits+0)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + *ppstapending = &padapter->xmitpriv.be_pending; + (phwxmits+2)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); + break; + + } + + } + +_func_exit_; + + return ptxservq; +} +#endif + +/* + * Will enqueue pxmitframe to the proper queue, + * and indicate it to xx_pending list..... + */ +s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + //_irqL irqL0; + u8 ac_index; + struct sta_info *psta; + struct tx_servq *ptxservq; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; + sint bmcst = IS_MCAST(pattrib->ra); + sint res = _SUCCESS; + +_func_enter_; + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + } + + if (psta == NULL) { + res = _FAIL; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n")); + goto exit; + } + + ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index)); + + //_enter_critical(&pstapending->lock, &irqL0); + + if (rtw_is_list_empty(&ptxservq->tx_pending)) { + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue)); + } + + //_enter_critical(&ptxservq->sta_pending.lock, &irqL1); + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending)); + ptxservq->qcnt++; + phwxmits[ac_index].accnt++; + + //_exit_critical(&ptxservq->sta_pending.lock, &irqL1); + + //_exit_critical(&pstapending->lock, &irqL0); + +exit: + +_func_exit_; + + return res; +} + +int rtw_alloc_hwxmits(_adapter *padapter) +{ + struct hw_xmit *hwxmits; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + pxmitpriv->hwxmit_entry = HWXMIT_ENTRY; + + pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry); + if (pxmitpriv->hwxmits == NULL) //Add by Yongle Lai + return -1; + + hwxmits = pxmitpriv->hwxmits; + + if(pxmitpriv->hwxmit_entry == 5) + { + //pxmitpriv->bmc_txqueue.head = 0; + //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue; + hwxmits[0] .sta_queue = &pxmitpriv->bm_pending; + + //pxmitpriv->vo_txqueue.head = 0; + //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue; + hwxmits[1] .sta_queue = &pxmitpriv->vo_pending; + + //pxmitpriv->vi_txqueue.head = 0; + //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue; + hwxmits[2] .sta_queue = &pxmitpriv->vi_pending; + + //pxmitpriv->bk_txqueue.head = 0; + //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; + hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; + + //pxmitpriv->be_txqueue.head = 0; + //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue; + hwxmits[4] .sta_queue = &pxmitpriv->be_pending; + + } + else if(pxmitpriv->hwxmit_entry == 4) + { + + //pxmitpriv->vo_txqueue.head = 0; + //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue; + hwxmits[0] .sta_queue = &pxmitpriv->vo_pending; + + //pxmitpriv->vi_txqueue.head = 0; + //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue; + hwxmits[1] .sta_queue = &pxmitpriv->vi_pending; + + //pxmitpriv->be_txqueue.head = 0; + //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue; + hwxmits[2] .sta_queue = &pxmitpriv->be_pending; + + //pxmitpriv->bk_txqueue.head = 0; + //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; + hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; + } + else + { + + + } + + return 0; +} + +void rtw_free_hwxmits(_adapter *padapter) +{ + struct hw_xmit *hwxmits; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + hwxmits = pxmitpriv->hwxmits; + if(hwxmits) + rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry)); +} + +void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry) +{ + sint i; +_func_enter_; + for(i = 0; i < entry; i++, phwxmit++) + { + //_rtw_spinlock_init(&phwxmit->xmit_lock); + //_rtw_init_listhead(&phwxmit->pending); + //phwxmit->txcmdcnt = 0; + phwxmit->accnt = 0; + } +_func_exit_; +} + +/* + * The main transmit(tx) entry + * + * Return + * 1 enqueue + * 0 success, hardware will handle this xmit frame(packet) + * <0 fail + */ +s32 rtw_xmit(_adapter *padapter, _pkt *pkt) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_frame *pxmitframe = NULL; + + s32 res; + + + pxmitframe = rtw_alloc_xmitframe(pxmitpriv); + if (pxmitframe == NULL) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n")); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe\n", __FUNCTION__); + #endif + return -1; + } + + res = update_attrib(padapter, pkt, &pxmitframe->attrib); + if (res == _FAIL) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n")); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__); + #endif + rtw_free_xmitframe(pxmitpriv, pxmitframe); + return -1; + } + pxmitframe->pkt = pkt; + + rtw_led_control(padapter, LED_CTL_TX); + + if (padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _FALSE) + return 1; + + return 0; +} + +#ifdef CONFIG_TDLS +void process_enqueue_frame(_adapter *padapter, struct xmit_frame *pxmitframe, struct sta_info *psta) +{ + _irqL irqL; + struct sta_info *ptdls_sta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + + //enqueue frame for TDLS sleeping STA + rtw_list_delete(&pxmitframe->list); + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q)); + ptdls_sta->sleepq_len++; + + //indicate 4-AC queue bit in TDLS peer traffic indication + switch(pattrib->priority) + { + case 1: + case 2: + ptdls_sta->uapsd_bk = ptdls_sta->uapsd_bk | BIT(0); + break; + case 4: + case 5: + ptdls_sta->uapsd_vi = ptdls_sta->uapsd_vi | BIT(0); + break; + case 6: + case 7: + ptdls_sta->uapsd_vo = ptdls_sta->uapsd_vo | BIT(0); + break; + case 0: + case 3: + default: + ptdls_sta->uapsd_be = ptdls_sta->uapsd_be | BIT(0); + break; + } + + ptdls_sta->sleepq_ac_len++; + + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + +} + +sint xmit_tdls_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + sint ret=_FALSE; + + _irqL irqL; + struct sta_info *ptdls_sta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + int i; + + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + if(ptdls_sta==NULL){ + if(pHalData->CurrentChannel != pmlmeext->cur_channel){ + DBG_8192C("pHalData: %02x, pmlmeext: %02x ", pHalData->CurrentChannel, pmlmeext->cur_channel); + for(i=0; i<6; i++){ + DBG_8192C("%02x ", *(pattrib->dst+i)); + } + DBG_8192C("\n"); + ret = 2; //enqueue data that want to transmit via AP + } + + return ret; + }else if(ptdls_sta->state&TDLS_LINKED_STATE){ + if(ptdls_sta->state&TDLS_PEER_SLEEP_STATE) + { + process_enqueue_frame(padapter, pxmitframe, ptdls_sta); + //when sleepq_len ==1? or >=1? transmit PTI + if(ptdls_sta->sleepq_len==1) + { + //transmit TDLS PTI via AP + ptdls_sta->option=2; + _set_workitem(&ptdls_sta->option_workitem); + } + ret = _TRUE; + } + else if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ + if(!((ptdls_sta->state & TDLS_AT_OFF_CH_STATE) && (ptdls_sta->state & TDLS_PEER_AT_OFF_STATE))){ + process_enqueue_frame(padapter, pxmitframe, ptdls_sta); + ret = _TRUE; + } + } + + } + return ret; + +} +#endif + +#ifdef CONFIG_AP_MODE + +sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + _irqL irqL; + sint ret=_FALSE; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + sint bmcst = IS_MCAST(pattrib->ra); + + if(pattrib->psta) + { + psta = pattrib->psta; + } + else + { + psta=rtw_get_stainfo(pstapriv, pattrib->ra); + } + + if(psta==NULL) + return ret; + + if(pattrib->triggered==1) + { + //DBG_871X("directly xmit pspoll_triggered packet\n"); + + //pattrib->triggered=0; + + if(bmcst) + pattrib->qsel = 0x11;//HIQ + + + return ret; + } + + + if(bmcst) + { + if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode + { + //pattrib->qsel = 0x11;//HIQ + + rtw_list_delete(&pxmitframe->list); + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); + + psta->sleepq_len++; + + pstapriv->tim_bitmap |= BIT(0);// + + //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);//tx bc/mc packets after upate bcn + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + ret = _TRUE; + + } + + return ret; + + } + + + if(psta->state&WIFI_SLEEP_STATE) + { + u8 wmmps_ac=0; + + if(pstapriv->sta_dz_bitmap&BIT(psta->aid)) + { + rtw_list_delete(&pxmitframe->list); + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); + + psta->sleepq_len++; + + switch(pattrib->priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(0); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(0); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(0); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(0); + break; + } + + if(wmmps_ac) + psta->sleepq_ac_len++; + + if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac))) + { + pstapriv->tim_bitmap |= BIT(psta->aid); + + //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + + if(psta->sleepq_len==1) + { + //DBG_871X("sleepq_len==1, update BCNTIM\n"); + //upate BCN for TIM IE + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + //if(psta->sleepq_len > (NR_XMITFRAME>>3)) + //{ + // wakeup_sta_to_xmit(padapter, psta); + //} + + ret = _TRUE; + + } + + } + + return ret; + +} + +void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + u8 update_mask=0, wmmps_ac=0; + struct sta_info *psta_bmc; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + switch(pxmitframe->attrib.priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(1); + break; + } + + psta->sleepq_len--; + if(psta->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + if(wmmps_ac) + { + psta->sleepq_ac_len--; + if(psta->sleepq_ac_len>0) + { + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + } + else + { + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + } + + pxmitframe->attrib.triggered = 1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if(psta->sleepq_len==0) + { + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_mask = BIT(0); + } + + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + + //for BC/MC Frames + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(!psta_bmc) + return; + + if(pstapriv->sta_dz_bitmap==0x0)//no any sta in ps mode + { + _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta_bmc->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + psta_bmc->sleepq_len--; + if(psta_bmc->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + + pxmitframe->attrib.triggered = 1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if(psta_bmc->sleepq_len==0) + { + pstapriv->tim_bitmap &= ~BIT(0); + + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_mask |= BIT(1); + } + + } + + _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + } + + + if(update_mask) + { + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + +} + +void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + u8 wmmps_ac=0; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + switch(pxmitframe->attrib.priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(1); + break; + } + + if(!wmmps_ac) + continue; + + rtw_list_delete(&pxmitframe->list); + + psta->sleepq_len--; + psta->sleepq_ac_len--; + + if(psta->sleepq_ac_len>0) + { + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + } + else + { + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + + pxmitframe->attrib.triggered = 1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac)) + { + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + //update_mask = BIT(0); + } + + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + +} + +#endif + diff --git a/drivers/net/wireless/rtl8192c/hal/hal_init.c b/drivers/net/wireless/rtl8192c/hal/hal_init.c new file mode 100755 index 000000000000..3e54e907f6d0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/hal_init.c @@ -0,0 +1,122 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#define _HAL_INIT_C_ +#include +#include +#include +#include + +#include + +#ifdef CONFIG_SDIO_HCI + #include +#elif defined(CONFIG_USB_HCI) + #include +#endif + +void intf_chip_configure(_adapter *padapter) +{ + if(padapter->HalFunc.intf_chip_configure) + padapter->HalFunc.intf_chip_configure(padapter); +} + +void intf_read_chip_info(_adapter *padapter) +{ + if(padapter->HalFunc.read_adapter_info) + padapter->HalFunc.read_adapter_info(padapter); +} + +void intf_read_chip_version(_adapter *padapter) +{ + if(padapter->HalFunc.read_chip_version) + padapter->HalFunc.read_chip_version(padapter); +} + +void rtw_dm_init(_adapter *padapter) +{ + if(padapter->HalFunc.dm_init) + padapter->HalFunc.dm_init(padapter); +} + +void rtw_sw_led_init(_adapter *padapter) +{ + if(padapter->HalFunc.InitSwLeds) + padapter->HalFunc.InitSwLeds(padapter); +} + +void rtw_sw_led_deinit(_adapter *padapter) +{ + if(padapter->HalFunc.DeInitSwLeds) + padapter->HalFunc.DeInitSwLeds(padapter); +} + +uint rtw_hal_init(_adapter *padapter) +{ + uint status = _SUCCESS; + + padapter->hw_init_completed=_FALSE; + + padapter->bfirst_init = _TRUE; + status = padapter->HalFunc.hal_init(padapter); + + if(status == _SUCCESS){ + padapter->hw_init_completed = _TRUE; + } + else{ + padapter->hw_init_completed = _FALSE; + RT_TRACE(_module_hal_init_c_,_drv_err_,("rtw_hal_init: hal__init fail\n")); + } + padapter->bfirst_init = _FALSE; + + RT_TRACE(_module_hal_init_c_,_drv_err_,("-rtl871x_hal_init:status=0x%x\n",status)); + + return status; + +} + +uint rtw_hal_deinit(_adapter *padapter) +{ + uint status = _SUCCESS; + +_func_enter_; + + status = padapter->HalFunc.hal_deinit(padapter); + + if(status == _SUCCESS){ + padapter->hw_init_completed = _FALSE; + } + else + { + RT_TRACE(_module_hal_init_c_,_drv_err_,("\n rtw_hal_deinit: hal_init fail\n")); + } + +_func_exit_; + + return status; + +} +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +void rtw_sreset_init(_adapter *padapter) +{ + if(padapter->HalFunc.sreset_init_value) + padapter->HalFunc.sreset_init_value(padapter); +} +#endif diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c new file mode 100755 index 000000000000..517f2444d031 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c @@ -0,0 +1,1134 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192C_CMD_C_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#if 0 +static BOOLEAN +CheckWriteMSG( + IN PADAPTER Adapter, + IN u8 BoxNum +) +{ + u8 valHMETFR; + BOOLEAN Result = _FALSE; + + valHMETFR = rtw_read8(Adapter, REG_HMETFR); + + //DbgPrint("CheckWriteH2C(): Reg[0x%2x] = %x\n",REG_HMETFR, valHMETFR); + + if(((valHMETFR>>BoxNum)&BIT0) == 1) + Result = _TRUE; + + return Result; + +} + +static BOOLEAN CheckFwReadLastMSG( + IN PADAPTER Adapter, + IN u8 BoxNum +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 valHMETFR, valMCUTST_1; + BOOLEAN Result = _FALSE; + + valHMETFR = rtw_read8(Adapter, REG_HMETFR); + valMCUTST_1 = rtw_read8(Adapter, (REG_MCUTST_1+BoxNum)); + + //DbgPrint("REG[%x] = %x, REG[%x] = %x\n", + // REG_HMETFR, valHMETFR, REG_MCUTST_1+BoxNum, valMCUTST_1 ); + + // Do not seperate to 91C and 88C, we use the same setting. Suggested by SD4 Filen. 2009.12.03. + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + if(((valHMETFR>>BoxNum)&BIT0) == 0) + Result = _TRUE; + } + else + { + if((((valHMETFR>>BoxNum)&BIT0) == 0) && (valMCUTST_1 == 0)) + { + Result = _TRUE; + } + } + + return Result; +} +#endif + + +#define RTL92C_MAX_H2C_BOX_NUMS 4 +#define RTL92C_MAX_CMD_LEN 5 +#define MESSAGE_BOX_SIZE 4 +#define EX_MESSAGE_BOX_SIZE 2 + + +static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 isvern, u8 msgbox_num) +{ + u8 read_down = _FALSE; + int retry_cnts = 100; + + u8 valid; + +// DBG_8192C(" _is_fw_read_cmd_down ,isnormal_chip(%x),reg_1cc(%x),msg_box(%d)...\n",isvern,rtw_read8(padapter,REG_HMETFR),msgbox_num); + + do{ + valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num); + if(isvern){ + if(0 == valid ){ + read_down = _TRUE; + } + } + else{ + if((0 == valid) && (0 == rtw_read8(padapter, REG_MCUTST_1+msgbox_num))){ + read_down = _TRUE; + } + } + }while( (!read_down) && (retry_cnts--)); + + return read_down; + +} + + +/***************************************** +* H2C Msg format : +*| 31 - 8 |7 | 6 - 0 | +*| h2c_msg |Ext_bit |CMD_ID | +* +******************************************/ +void FillH2CCmd(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer) +{ +#if 1 + u8 bcmd_down = _FALSE; + int retry_cnts = 100; + u8 h2c_box_num; + u32 msgbox_addr; + u32 msgbox_ex_addr; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 isnchip =IS_NORMAL_CHIP(pHalData->VersionID); + u32 h2c_cmd = 0; + u16 h2c_cmd_ex = 0; + + _func_enter_; + + if(!pCmdBuffer){ + return ; + } + if(CmdLen > RTL92C_MAX_CMD_LEN){ + return ; + } + //pay attention to if race condition happened in H2C cmd setting. + do{ + h2c_box_num = pHalData->LastHMEBoxNum; + + if(!_is_fw_read_cmd_down(padapter, isnchip, h2c_box_num)){ + DBG_8192C(" fw read cmd failed...\n"); + break; + } + + if(CmdLen<=3) + { + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); + } + else{ + _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer, EX_MESSAGE_BOX_SIZE); + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer+2,( CmdLen-EX_MESSAGE_BOX_SIZE)); + *(u8*)(&h2c_cmd) |= BIT(7); + } + + *(u8*)(&h2c_cmd) |= ElementID; + + if(h2c_cmd & BIT(7)){ + msgbox_ex_addr = REG_HMEBOX_EXT_0 + (h2c_box_num *EX_MESSAGE_BOX_SIZE); + h2c_cmd_ex = cpu_to_le16( h2c_cmd_ex ); + rtw_write16(padapter, msgbox_ex_addr, h2c_cmd_ex); + } + msgbox_addr =REG_HMEBOX_0 + (h2c_box_num *MESSAGE_BOX_SIZE); + h2c_cmd = cpu_to_le32( h2c_cmd ); + rtw_write32(padapter,msgbox_addr, h2c_cmd); + + if(!isnchip){//for Test chip + if(! (rtw_read8(padapter, REG_HMETFR) & BIT(h2c_box_num))){ + DBG_8192C("Chip test - check fw write failed, write again..\n"); + continue; + } + // Fill H2C protection register. + rtw_write8(padapter,REG_MCUTST_1+h2c_box_num, 0xFF); + } + bcmd_down = _TRUE; + + // DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" + // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); + + pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL92C_MAX_H2C_BOX_NUMS ; + + }while((!bcmd_down) && (retry_cnts--)); +/* + if(bcmd_down) + DBG_8192C("H2C Cmd exe down. \n" ); + else + DBG_8192C("H2C Cmd exe failed. \n" ); +*/ + _func_exit_; + +#else + u8 BoxNum; + u16 BOXReg, BOXExtReg; + u8 BoxContent[4], BoxExtContent[2]; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 BufIndex=0; + u8 bWriteSucess = _FALSE; + u8 IsFwRead = _FALSE; + u8 WaitH2cLimmit = 100; + + u32 h2c_cmd = 0; + u16 h2c_cmd_ex = 0; + +_func_enter_; + + //DBG_8192C("FillH2CCmd : ElementID=%d \n",ElementID); + + while(!bWriteSucess) + { + // 2. Find the last BOX number which has been writen. + BoxNum = pHalData->LastHMEBoxNum; + switch(BoxNum) + { + case 0: + BOXReg = REG_HMEBOX_0; + BOXExtReg = REG_HMEBOX_EXT_0; + break; + case 1: + BOXReg = REG_HMEBOX_1; + BOXExtReg = REG_HMEBOX_EXT_1; + break; + case 2: + BOXReg = REG_HMEBOX_2; + BOXExtReg = REG_HMEBOX_EXT_2; + break; + case 3: + BOXReg = REG_HMEBOX_3; + BOXExtReg = REG_HMEBOX_EXT_3; + break; + default: + break; + } + + // 3. Check if the box content is empty. + IsFwRead = CheckFwReadLastMSG(padapter, BoxNum); + while(!IsFwRead) + { + //wait until Fw read + WaitH2cLimmit--; + if(WaitH2cLimmit == 0) + { + DBG_8192C("FillH2CCmd92C(): Wating too long for FW read clear HMEBox(%d)!!!\n", BoxNum); + break; + } + rtw_msleep_os(10); //us + IsFwRead = CheckFwReadLastMSG(padapter, BoxNum); + //U1btmp = PlatformEFIORead1Byte(Adapter, 0x1BF); + //RT_TRACE(COMP_CMD, DBG_LOUD, ("FillH2CCmd92C(): Wating for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n", BoxNum, U1btmp)); + } + + // If Fw has not read the last H2C cmd, break and give up this H2C. + if(!IsFwRead) + { + DBG_8192C("FillH2CCmd92C(): Write H2C register BOX[%d] fail!!!!! Fw do not read. \n", BoxNum); + break; + } + + // 4. Fill the H2C cmd into box + _rtw_memset(BoxContent, 0, sizeof(BoxContent)); + _rtw_memset(BoxExtContent, 0, sizeof(BoxExtContent)); + + BoxContent[0] = ElementID; // Fill element ID + + //DBG_8192C("FillH2CCmd92C():Write ElementID BOXReg(%4x) = %2x \n", BOXReg, ElementID); + + switch(CmdLen) + { + case 1: + { + BoxContent[0] &= ~(BIT7); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 1); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + break; + } + case 2: + { + BoxContent[0] &= ~(BIT7); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 2); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + break; + } + case 3: + { + BoxContent[0] &= ~(BIT7); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 3); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + break; + } + case 4: + { + BoxContent[0] |= (BIT7); + _rtw_memcpy((u8*)(BoxExtContent), pCmdBuffer+BufIndex, 2); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex+2, 2); + rtw_write16(padapter, BOXExtReg, *((u16*)BoxExtContent)); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + h2c_cmd_ex = *((u32*)BoxExtContent); + break; + } + case 5: + { + BoxContent[0] |= (BIT7); + _rtw_memcpy((u8*)(BoxExtContent), pCmdBuffer+BufIndex, 2); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex+2, 3); + rtw_write16(padapter, BOXExtReg, *((u16*)BoxExtContent)); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + h2c_cmd_ex = *((u32*)BoxExtContent); + break; + } + default: + break; + + } + + + DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" + ,pHalData->LastHMEBoxNum ,CmdLen,BOXReg,h2c_cmd,BOXExtReg,h2c_cmd_ex); + + //DBG_8192C("FillH2CCmd(): BoxExtContent=0x%x\n", *(u16*)BoxExtContent); + //DBG_8192C("FillH2CCmd(): BoxContent=0x%x\n", *(u32*)BoxContent); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + // 5. Normal chip does not need to check if the H2C cmd has be written successfully. + bWriteSucess = _TRUE; + } + else + { + // 5. Check if the H2C cmd has be written successfully. + bWriteSucess = CheckWriteMSG(padapter, BoxNum); + if(!bWriteSucess) //If not then write again. + continue; + + //6. Fill H2C protection register. + + rtw_write8(padapter, REG_MCUTST_1+BoxNum, 0xFF); + //RT_TRACE(COMP_CMD, DBG_LOUD, ("FillH2CCmd92C():Write Reg(%4x) = 0xFF \n", REG_MCUTST_1+BoxNum)); + } + + // Record the next BoxNum + pHalData->LastHMEBoxNum = BoxNum+1; + if(pHalData->LastHMEBoxNum == 4) // loop to 0 + pHalData->LastHMEBoxNum = 0; + + //DBG_8192C("FillH2CCmd92C():pHalData->LastHMEBoxNum = %d\n", pHalData->LastHMEBoxNum); + + } + +_func_exit_; + +#endif + +} + +u8 rtl8192c_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) +{ + u8 ElementID, CmdLen; + u8 *pCmdBuffer; + struct cmd_msg_parm *pcmdmsg; + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + pcmdmsg = (struct cmd_msg_parm*)pbuf; + ElementID = pcmdmsg->eid; + CmdLen = pcmdmsg->sz; + pCmdBuffer = pcmdmsg->buf; + + FillH2CCmd(padapter, ElementID, CmdLen, pCmdBuffer); + + return H2C_SUCCESS; +} + +#if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) +u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter *padapter ,u8 bfwpoll, u16 period) +{ + u8 res=_SUCCESS; + struct H2C_SS_RFOFF_PARAM param; + DBG_8192C("==>%s bfwpoll(%x)\n",__FUNCTION__,bfwpoll); + param.gpio_period = period;//Polling GPIO_11 period time + param.ROFOn = (_TRUE == bfwpoll)?1:0; + FillH2CCmd(padapter, SELECTIVE_SUSPEND_ROF_CMD, sizeof(param), (u8*)(¶m)); + return res; +} +#endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED + +u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param) +{ + u8 res=_SUCCESS; + +_func_enter_; + + *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); + + FillH2CCmd(padapter, RSSI_SETTING_EID, 3, param); + +_func_exit_; + + return res; +} + +u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg) +{ + u8 buf[5]; + u8 res=_SUCCESS; + +_func_enter_; + + _rtw_memset(buf, 0, 5); + mask = cpu_to_le32( mask ); + _rtw_memcpy(buf, &mask, 4); + buf[4] = arg; + + FillH2CCmd(padapter, MACID_CONFIG_EID, 5, buf); + +_func_exit_; + + return res; + +} + +//bitmap[0:27] = tx_rate_bitmap +//bitmap[28:31]= Rate Adaptive id +//arg[0:4] = macid +//arg[5] = Short GI +void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if(pHalData->fw_ractrl == _TRUE) + { + rtl8192c_set_raid_cmd(pAdapter, bitmap, arg); + } + else + { + u8 macid, init_rate, shortGIrate=_FALSE; + + init_rate = get_highest_rate_idx(bitmap&0x0fffffff)&0x3f; + + macid = arg&0x1f; + + shortGIrate = (arg&BIT(5)) ? _TRUE:_FALSE; + + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + rtw_write8(pAdapter, (REG_INIDATA_RATE_SEL+macid), (u8)init_rate); + } + +} + +void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode) +{ + SETPWRMODE_PARM H2CSetPwrMode; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + +_func_enter_; + + DBG_871X("%s(): Mode = %d, SmartPS = %d\n", __FUNCTION__,Mode,pwrpriv->smart_ps); + + H2CSetPwrMode.Mode = Mode; + + H2CSetPwrMode.SmartPS = pwrpriv->smart_ps; + + H2CSetPwrMode.BcnPassTime = 1;//pPSC->RegMaxLPSAwakeIntvl; + + FillH2CCmd(padapter, SET_PWRMODE_EID, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode); + +_func_exit_; +} + +void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 rate_len, pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pktlen = sizeof (struct ieee80211_hdr_3addr); + + //timestamp will be inserted by hardware + pframe += 8; + pktlen += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + // capability info: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + //DBG_871X("ie len=%d\n", cur_network->IELength); + pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); + _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); + + goto _ConstructBeacon; + } + + //below for ad-hoc mode + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); + } + + + //todo: ERP IE + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); + } + + + //todo:HT for adhoc + +_ConstructBeacon: + + if ((pktlen + TXDESC_SIZE) > 512) + { + DBG_871X("beacon frame too large\n"); + return; + } + + *pLength = pktlen; + + //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen); + +} + +void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + // Frame control. + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + SetPwrMgt(fctrl); + SetFrameSubType(pframe, WIFI_PSPOLL); + + // AID. + SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); + + // BSSID. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + // TA. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + + *pLength = 16; +} + +void ConstructNullFunctionData(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bForcePowerSave) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &pmlmepriv->cur_network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + if (bForcePowerSave) + { + SetPwrMgt(fctrl); + } + + switch(cur_network->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); + break; + case Ndis802_11APMode: + SetFrDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + break; + case Ndis802_11IBSS: + default: + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + break; + } + + SetSeqNum(pwlanhdr, 0); + + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pktlen = sizeof(struct ieee80211_hdr_3addr); + + *pLength = pktlen; +} + +void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u8 *mac, *bssid; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, 0); + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pktlen = sizeof(struct ieee80211_hdr_3addr); + pframe += pktlen; + + if(cur_network->IELength>MAX_IE_SZ) + return; + + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pktlen += cur_network->IELength; + + *pLength = pktlen; +} + +// +// Description: In normal chip, we should send some packet to Hw which will be used by Fw +// in FW LPS mode. The function is to fill the Tx descriptor of this packets, then +// Fw can tell Hw to send these packet derectly. +// Added by tynli. 2009.10.15. +// +static VOID +FillFakeTxDescriptor92C( + IN PADAPTER Adapter, + IN u8* pDesc, + IN u32 BufferLen, + IN BOOLEAN IsPsPoll +) +{ + struct tx_desc *ptxdesc = (struct tx_desc *)pDesc; + + // Clear all status + _rtw_memset(pDesc, 0, 32); + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32( OWN | FSG | LSG); //own, bFirstSeg, bLastSeg; + + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(BufferLen&0x0000ffff); // Buffer size + command header + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT<txdw1 |= cpu_to_le32(NAVUSEHDR); + } + else + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + } + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + +#ifdef CONFIG_USB_HCI + // USB interface drop packet if the checksum of descriptor isn't correct. + // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). + rtl8192cu_cal_txdesc_chksum(ptxdesc); +#endif + + //RT_PRINT_DATA(COMP_CMD, DBG_TRACE, "TxFillCmdDesc8192C(): H2C Tx Cmd Content ----->\n", pDesc, TX_DESC_SIZE); +} + +// To check if reserved page content is destroyed by beacon beacuse beacon is too large. +// 2010.06.23. Added by tynli. +VOID +CheckFwRsvdPageContent( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); + u32 MaxBcnPageNum; + + if(pHalData->FwRsvdPageStartOffset != 0) + { + /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize); + RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset), + ("CheckFwRsvdPageContent(): The reserved page content has been"\ + "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!", + MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/ + } +} + +// +// Description: Fill the reserved packets that FW will use to RSVD page. +// Now we just send 4 types packet to rsvd page. +// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. +// Input: +// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw, +// so we need to set the packet length to total lengh. +// TRUE: At the second time, we should send the first packet (default:beacon) +// to Hw again and set the lengh in descriptor to the real beacon lengh. +// 2009.10.15 by tynli. +static void SetFwRsvdPagePkt(PADAPTER Adapter, BOOLEAN bDLFinished) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u32 BeaconLength, ProbeRspLength, PSPollLength, NullFunctionDataLength; + u8 *ReservedPagePacket; + u8 PageNum=0, U1bTmp, TxDescLen=0, TxDescOffset=0; + u16 BufIndex=0; + u32 TotalPacketLen; + RSVDPAGE_LOC RsvdPageLoc; + BOOLEAN bDLOK = _FALSE; + + //DBG_871X("%s\n", __FUNCTION__); + + ReservedPagePacket = (u8*)rtw_malloc(1000); + if(ReservedPagePacket == NULL){ + DBG_871X("%s(): alloc ReservedPagePacket fail !!!\n", __FUNCTION__); + return; + } + + _rtw_memset(ReservedPagePacket, 0, 1000); + + TxDescLen = 32;//TX_DESC_SIZE; + +#ifdef CONFIG_USB_HCI + BufIndex = TXDESC_OFFSET; + TxDescOffset = TxDescLen+8; //Shift index for 8 bytes because the dummy bytes in the first descipstor. +#else + BufIndex = 0; + TxDescOffset = 0; +#endif + + //(1) beacon + ConstructBeacon(Adapter,&ReservedPagePacket[BufIndex],&BeaconLength); + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: BCN\n", &ReservedPagePacket[BufIndex], (BeaconLength+BufIndex)); + +//-------------------------------------------------------------------- + + // When we count the first page size, we need to reserve description size for the RSVD + // packet, it will be filled in front of the packet in TXPKTBUF. + U1bTmp = (u8)PageNum_128(BeaconLength+TxDescLen); + PageNum += U1bTmp; + // To reserved 2 pages for beacon buffer. 2010.06.24. + if(PageNum == 1) + PageNum+=1; + pHalData->FwRsvdPageStartOffset = PageNum; + + BufIndex = (PageNum*128) + TxDescOffset; + + //(2) ps-poll + ConstructPSPoll(Adapter, &ReservedPagePacket[BufIndex],&PSPollLength); + + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE); + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PS-POLL\n", &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen)); + + RsvdPageLoc.LocPsPoll = PageNum; + +//------------------------------------------------------------------ + + U1bTmp = (u8)PageNum_128(PSPollLength+TxDescLen); + PageNum += U1bTmp; + + BufIndex = (PageNum*128) + TxDescOffset; + + //(3) null data + ConstructNullFunctionData( + Adapter, + &ReservedPagePacket[BufIndex], + &NullFunctionDataLength, + get_my_bssid(&(pmlmeinfo->network)), + _FALSE); + + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], NullFunctionDataLength, _FALSE); + + RsvdPageLoc.LocNullData = PageNum; + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: NULL DATA \n", &ReservedPagePacket[BufIndex-TxDescLen], (NullFunctionDataLength+TxDescLen)); +//------------------------------------------------------------------ + + U1bTmp = (u8)PageNum_128(NullFunctionDataLength+TxDescLen); + PageNum += U1bTmp; + + BufIndex = (PageNum*128) + TxDescOffset; + + //(4) probe response + ConstructProbeRsp( + Adapter, + &ReservedPagePacket[BufIndex], + &ProbeRspLength, + get_my_bssid(&(pmlmeinfo->network)), + _FALSE); + + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE); + + RsvdPageLoc.LocProbeRsp = PageNum; + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PROBE RSP \n", &ReservedPagePacket[BufIndex-TxDescLen], (ProbeRspLength-TxDescLen)); + +//------------------------------------------------------------------ + + U1bTmp = (u8)PageNum_128(ProbeRspLength+TxDescLen); + + PageNum += U1bTmp; + + TotalPacketLen = (PageNum*128); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + pattrib->qsel = 0x10; + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescLen; + _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); + + Adapter->HalFunc.mgnt_xmit(Adapter, pmgntframe); + + bDLOK = _TRUE; + + if(bDLOK) + { + //DBG_871X("Set RSVD page location to Fw.\n"); + FillH2CCmd(Adapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8 *)&RsvdPageLoc); + } + + rtw_mfree(ReservedPagePacket,1000); + +} + +void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus) +{ + JOINBSSRPT_PARM JoinBssRptParm; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + +_func_enter_; + + //DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); + + if(mstatus == 1) + { + // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. + // Suggested by filen. Added by tynli. + rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); + // Do not set TSF again here or vWiFi beacon DMA INT will not work. + //correct_TSF(padapter, pmlmeext); + // Hw sequende enable by dedault. 2010.06.23. by tynli. + //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); + //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + BOOLEAN bRecover = _FALSE; + + //set REG_CR bit 8 + //U1bTmp = rtw_read8(padapter, REG_CR+1); + rtw_write8(padapter, REG_CR+1, 0x03); + + // Disable Hw protection for a time which revserd for Hw sending beacon. + // Fix download reserved page packet fail that access collision with the protection time. + // 2010.05.11. Added by tynli. + //SetBcnCtrlReg(padapter, 0, BIT3); + //SetBcnCtrlReg(padapter, BIT4, 0); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + if(pHalData->RegFwHwTxQCtrl&BIT6) + bRecover = _TRUE; + + // To tell Hw the packet is not a real beacon frame. + //U1bTmp = rtw_read8(padapter, REG_FWHW_TXQ_CTRL+2); + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6))); + pHalData->RegFwHwTxQCtrl &= (~BIT6); + SetFwRsvdPagePkt(padapter, 0); + + // 2010.05.11. Added by tynli. + //SetBcnCtrlReg(padapter, BIT3, 0); + //SetBcnCtrlReg(padapter, 0, BIT4); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); + + // To make sure that if there exists an adapter which would like to send beacon. + // If exists, the origianl value of 0x422[6] will be 1, we should check this to + // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause + // the beacon cannot be sent by HW. + // 2010.06.23. Added by tynli. + if(bRecover) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); + pHalData->RegFwHwTxQCtrl |= BIT6; + } + + // Clear CR[8] or beacon packet will not be send to TxBuf anymore. + rtw_write8(padapter, REG_CR+1, 0x02); + } + } + + JoinBssRptParm.OpMode = mstatus; + + FillH2CCmd(padapter, JOINBSS_RPT_EID, sizeof(JoinBssRptParm), (u8 *)&JoinBssRptParm); + +_func_exit_; +} + +#ifdef CONFIG_P2P +void rtl8192c_set_p2p_ctw_period_cmd(_adapter* padapter, u8 ctwindow) +{ + struct P2P_PS_CTWPeriod_t p2p_ps_ctw; + + p2p_ps_ctw.CTWPeriod = ctwindow; + + FillH2CCmd(padapter, P2P_PS_CTW_CMD_EID, 1, (u8 *)(&p2p_ps_ctw)); + +} + +void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload; + u8 i; + u16 ctwindow; + u32 start_time, tsf_low; + +_func_enter_; + + switch(p2p_ps_state) + { + case P2P_PS_DISABLE: + DBG_8192C("P2P_PS_DISABLE \n"); + _rtw_memset(p2p_ps_offload, 0 ,1); + break; + case P2P_PS_ENABLE: + DBG_8192C("P2P_PS_ENABLE \n"); + // update CTWindow value. + if( pwdinfo->ctwindow > 0 ) + { + p2p_ps_offload->CTWindow_En = 1; + ctwindow = pwdinfo->ctwindow; + if(IS_HARDWARE_TYPE_8723(padapter)) + { + //rtw_write16(padapter, REG_ATIMWND, ctwindow); + } + else + { + rtl8192c_set_p2p_ctw_period_cmd(padapter, ctwindow); + } + } + + // hw only support 2 set of NoA + for( i=0 ; inoa_num ; i++) + { + // To control the register setting for which NOA + rtw_write8(padapter, 0x5CF, (i << 4)); + if(i == 0) + p2p_ps_offload->NoA0_En = 1; + else + p2p_ps_offload->NoA1_En = 1; + + // config P2P NoA Descriptor Register + rtw_write32(padapter, 0x5E0, pwdinfo->noa_duration[i]); + + rtw_write32(padapter, 0x5E4, pwdinfo->noa_interval[i]); + + //Get Current TSF value + tsf_low = rtw_read32(padapter, REG_TSFTR); + + start_time = pwdinfo->noa_start_time[i]; + if(pwdinfo->noa_count[i] != 1) + { + while( start_time <= (tsf_low+(50*1024) ) ) + { + start_time += pwdinfo->noa_interval[i]; + if(pwdinfo->noa_count[i] != 255) + pwdinfo->noa_count[i]--; + } + } + //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,start_time); + rtw_write32(padapter, 0x5E8, start_time); + + rtw_write8(padapter, 0x5EC, pwdinfo->noa_count[i]); + } + + if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) + { + // rst p2p circuit + rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); + + p2p_ps_offload->Offload_En = 1; + + if(pwdinfo->role == P2P_ROLE_GO) + { + p2p_ps_offload->role= 1; + p2p_ps_offload->AllStaSleep = 0; + } + else + { + p2p_ps_offload->role= 0; + } + + p2p_ps_offload->discovery = 0; + } + break; + case P2P_PS_SCAN: + DBG_8192C("P2P_PS_SCAN \n"); + p2p_ps_offload->discovery = 1; + break; + case P2P_PS_SCAN_DONE: + DBG_8192C("P2P_PS_SCAN_DONE \n"); + p2p_ps_offload->discovery = 0; + pwdinfo->p2p_ps = P2P_PS_ENABLE; + break; + default: + break; + } + + FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload); + +_func_exit_; + +} +#endif //CONFIG_P2P + + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c new file mode 100755 index 000000000000..736941c64456 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c @@ -0,0 +1,4687 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ + +//============================================================ +// include files +//============================================================ +#include +#include +#include +#include + +#include + +//============================================================ +// Global var +//============================================================ +static u32 EDCAParam[maxAP][3] = +{ // UL DL + {0x5ea322, 0x00a630, 0x00a44f}, //atheros AP + {0x5ea32b, 0x5ea42b, 0x5e4322}, //broadcom AP + {0x3ea430, 0x00a630, 0x3ea44f}, //cisco AP + {0x5ea44f, 0x00a44f, 0x5ea42b}, //marvell AP + {0x5ea422, 0x00a44f, 0x00a44f}, //ralink AP + //{0x5ea44f, 0x5ea44f, 0x5ea44f}, //realtek AP + {0xa44f, 0x5ea44f, 0x5e431c}, //realtek AP + {0x5ea42b, 0xa630, 0x5e431c}, //airgocap AP + {0x5ea42b, 0x5ea42b, 0x5ea42b}, //unknown AP +// {0x5e4322, 0x00a44f, 0x5ea44f}, //unknown AP +}; + + +/*----------------------------------------------------------------------------- + * Function: dm_DIGInit() + * + * Overview: Set DIG scheme init value. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * + *---------------------------------------------------------------------------*/ +static void dm_DIGInit( + IN PADAPTER pAdapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + + pDigTable->Dig_Enable_Flag = _TRUE; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; + + pDigTable->CurIGValue = 0x20; + pDigTable->PreIGValue = 0x0; + + pDigTable->CurSTAConnectState = pDigTable->PreSTAConnectState = DIG_STA_DISCONNECT; + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT; + + pDigTable->RssiLowThresh = DM_DIG_THRESH_LOW; + pDigTable->RssiHighThresh = DM_DIG_THRESH_HIGH; + + pDigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW; + pDigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH; + + + pDigTable->rx_gain_range_max = DM_DIG_MAX; + pDigTable->rx_gain_range_min = DM_DIG_MIN; + + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + pDigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX; + pDigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN; + + pDigTable->PreCCKPDState = CCK_PD_STAGE_MAX; + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; + + pDigTable->ForbiddenIGI = DM_DIG_MIN; + pDigTable->LargeFAHit = 0; + pDigTable->Recover_cnt = 0; + pdmpriv->DIG_Dynamic_MIN = 0x25; //for FUNAI_TV +} + + +static u8 dm_initial_gain_MinPWDB( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + int Rssi_val_min = 0; + + if((pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) && + (pDigTable->CurSTAConnectState == DIG_STA_CONNECT) ) + { + if(pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) + Rssi_val_min = (pdmpriv->EntryMinUndecoratedSmoothedPWDB > pdmpriv->UndecoratedSmoothedPWDB)? + pdmpriv->UndecoratedSmoothedPWDB:pdmpriv->EntryMinUndecoratedSmoothedPWDB; + else + Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; + } + else if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT || + pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT) + Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; + else if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) + Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + + //printk("%s CurMultiSTAConnectState(0x%02x) UndecoratedSmoothedPWDB(%d),EntryMinUndecoratedSmoothedPWDB(%d)\n" + //,__FUNCTION__,pDigTable->CurSTAConnectState, + //pdmpriv->UndecoratedSmoothedPWDB,pdmpriv->EntryMinUndecoratedSmoothedPWDB); + + return (u8)Rssi_val_min; +} + + +static VOID +dm_FalseAlarmCounterStatistics( + IN PADAPTER Adapter + ) +{ + u32 ret_value; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter1, bMaskDWord); + FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16); + + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter2, bMaskDWord); + FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff); + FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16); + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter3, bMaskDWord); + FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff); + ret_value = PHY_QueryBBReg(Adapter, rOFDM0_FrameSync, bMaskDWord); + FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff); + FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16); + + FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal + + FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail+ + FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail; + + + //hold cck counter + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, BIT(14), 1); + + ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterLower, bMaskByte0); + FalseAlmCnt->Cnt_Cck_fail = ret_value; + + ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterUpper, bMaskByte3); + FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8; + + FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Parity_Fail + + FalseAlmCnt->Cnt_Rate_Illegal + + FalseAlmCnt->Cnt_Crc8_fail + + FalseAlmCnt->Cnt_Mcs_fail + + FalseAlmCnt->Cnt_Cck_fail); + + //reset false alarm counter registers + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 1); + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 0); + //reset cck counter + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 0); + //enable cck counter + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 2); + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Parity_Fail = %ld, Cnt_Rate_Illegal = %ld, Cnt_Crc8_fail = %ld, Cnt_Mcs_fail = %ld\n", + // FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal, FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail) ); + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n", + // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) ); + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n", + // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) ); +} + + +static VOID +DM_Write_DIG( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurIGValue = 0x%lx, PreIGValue = 0x%lx, BackoffVal = %d\n", + // DM_DigTable.CurIGValue, DM_DigTable.PreIGValue, DM_DigTable.BackoffVal)); + + if (pDigTable->Dig_Enable_Flag == _FALSE) + { + //RT_TRACE( COMP_DIG, DBG_LOUD, ("DIG is disabled\n")); + pDigTable->PreIGValue = 0x17; + return; + } + + if(pDigTable->PreIGValue != pDigTable->CurIGValue) + { + // Set initial gain. + //PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pDigTable->CurIGValue); + //PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pDigTable->CurIGValue); + //printk("%s DIG(0x%02x)\n",__FUNCTION__,pDigTable->CurIGValue); + PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, 0x7f, pDigTable->CurIGValue); + PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, 0x7f, pDigTable->CurIGValue); + pDigTable->PreIGValue = pDigTable->CurIGValue; + } +} + + +static VOID +dm_CtrlInitGainByFA( + IN PADAPTER pAdapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + u8 value_IGI = pDigTable->CurIGValue; + + if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH0) + value_IGI --; + else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) + value_IGI += 0; + else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH2) + value_IGI ++; + else if(FalseAlmCnt->Cnt_all >= DM_DIG_FA_TH2) + value_IGI +=2; + + if(value_IGI > DM_DIG_FA_UPPER) + value_IGI = DM_DIG_FA_UPPER; + if(value_IGI < DM_DIG_FA_LOWER) + value_IGI = DM_DIG_FA_LOWER; + + if(FalseAlmCnt->Cnt_all > 10000) + value_IGI = 0x32; + + pDigTable->CurIGValue = value_IGI; + + DM_Write_DIG(pAdapter); + +} + +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV +VOID dm_CtrlInitGainByRssi( IN PADAPTER pAdapter) +{ + + u32 isBT; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + //modify DIG upper bound + if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX ) + pDigTable->rx_gain_range_max = DM_DIG_MAX; + else + pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20; + + //modify DIG lower bound + if((FalseAlmCnt->Cnt_all > 500)&&(pdmpriv->DIG_Dynamic_MIN < 0x25)) + pdmpriv->DIG_Dynamic_MIN++; + if((FalseAlmCnt->Cnt_all < 500)&&(pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN)) + pdmpriv->DIG_Dynamic_MIN--; + if((pDigTable->Rssi_val_min < 8) && (pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN)) + pdmpriv->DIG_Dynamic_MIN--; + + //modify DIG lower bound, deal with abnorally large false alarm + if(FalseAlmCnt->Cnt_all > 10000) + { + //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); + pDigTable->LargeFAHit++; + if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue) + { + pDigTable->ForbiddenIGI = pDigTable->CurIGValue; + pDigTable->LargeFAHit = 1; + } + if(pDigTable->LargeFAHit >= 3) + { + if((pDigTable->ForbiddenIGI+1) >pDigTable->rx_gain_range_max) + pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max; + else + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + pDigTable->Recover_cnt = 3600; //3600=2hr + } + } + else + { + //Recovery mechanism for IGI lower bound + if(pDigTable->Recover_cnt != 0){ + pDigTable->Recover_cnt --; + } + else + { + if(pDigTable->LargeFAHit == 0 ) + { + if((pDigTable->ForbiddenIGI -1) < pdmpriv->DIG_Dynamic_MIN) //DM_DIG_MIN) + { + pDigTable->ForbiddenIGI = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN; + pDigTable->rx_gain_range_min = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN; + } + else + { + pDigTable->ForbiddenIGI --; + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + } + } + else if(pDigTable->LargeFAHit == 3 ) + { + pDigTable->LargeFAHit = 0; + } + } + } + #ifdef CONFIG_USB_HCI + if(FalseAlmCnt->Cnt_all < 250) + { +#endif + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n"); + + isBT = rtw_read8(pAdapter, 0x4fd) & 0x01; + + if(!isBT){ + + if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh) + { + if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_min; + else + pDigTable->BackoffVal -= 2; + } + else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh) + { + if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_max; + else + pDigTable->BackoffVal +=2; + } + } + else + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + + pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal; + + //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal); +#ifdef CONFIG_USB_HCI + } + else + { + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n"); + //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min); + + //Adjust initial gain by false alarm + if(FalseAlmCnt->Cnt_all > 1000) + pDigTable->CurIGValue = pDigTable ->PreIGValue+2; + else if (FalseAlmCnt->Cnt_all > 750) + pDigTable->CurIGValue = pDigTable->PreIGValue+1; + else if(FalseAlmCnt->Cnt_all < 500) + pDigTable->CurIGValue = pDigTable->PreIGValue-1; + } +#endif + + //Check initial gain by upper/lower bound + if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max) + pDigTable->CurIGValue = pDigTable->rx_gain_range_max; + + if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min) + pDigTable->CurIGValue = pDigTable->rx_gain_range_min; + + //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__, + // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min); + //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue ); + + DM_Write_DIG(pAdapter); + +} +#else +static VOID dm_CtrlInitGainByRssi(IN PADAPTER pAdapter) +{ + u32 isBT; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + //modify DIG upper bound + if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX ) + pDigTable->rx_gain_range_max = DM_DIG_MAX; + else + pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20; + //printk("%s Rssi_val_min(0x%02x),rx_gain_range_max(0x%02x)\n",__FUNCTION__,pDigTable->Rssi_val_min,pDigTable->rx_gain_range_max); + + //modify DIG lower bound, deal with abnorally large false alarm + if(FalseAlmCnt->Cnt_all > 10000) + { + //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); + + pDigTable->LargeFAHit++; + if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue) + { + pDigTable->ForbiddenIGI = pDigTable->CurIGValue; + pDigTable->LargeFAHit = 1; + } + + if(pDigTable->LargeFAHit >= 3) + { + if((pDigTable->ForbiddenIGI+1) > pDigTable->rx_gain_range_max) + pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max; + else + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + pDigTable->Recover_cnt = 3600; //3600=2hr + } + } + else + { + //Recovery mechanism for IGI lower bound + if(pDigTable->Recover_cnt != 0) + pDigTable->Recover_cnt --; + else + { + if(pDigTable->LargeFAHit == 0 ) + { + if((pDigTable->ForbiddenIGI -1) < DM_DIG_MIN) + { + pDigTable->ForbiddenIGI = DM_DIG_MIN; + pDigTable->rx_gain_range_min = DM_DIG_MIN; + } + else + { + pDigTable->ForbiddenIGI --; + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + } + } + else if(pDigTable->LargeFAHit == 3 ) + { + pDigTable->LargeFAHit = 0; + } + } + } + + //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.ForbiddenIGI = 0x%x, DM_DigTable.LargeFAHit = 0x%x\n",pDigTable->ForbiddenIGI, pDigTable->LargeFAHit)); + //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.rx_gain_range_max = 0x%x, DM_DigTable.rx_gain_range_min = 0x%x\n",pDigTable->rx_gain_range_max, pDigTable->rx_gain_range_min)); + +#ifdef CONFIG_USB_HCI + if(FalseAlmCnt->Cnt_all < 250) + { +#endif + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n"); + + isBT = rtw_read8(pAdapter, 0x4fd) & 0x01; + + if(!isBT){ + + if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh) + { + if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_min; + else + pDigTable->BackoffVal -= 2; + } + else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh) + { + if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_max; + else + pDigTable->BackoffVal +=2; + } + } + else + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + + pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal; + + //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal); +#ifdef CONFIG_USB_HCI + } + else + { + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n"); + //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min); + + //Adjust initial gain by false alarm + if(FalseAlmCnt->Cnt_all > 1000) + pDigTable->CurIGValue = pDigTable ->PreIGValue+2; + else if (FalseAlmCnt->Cnt_all > 750) + pDigTable->CurIGValue = pDigTable->PreIGValue+1; + else if(FalseAlmCnt->Cnt_all < 500) + pDigTable->CurIGValue = pDigTable->PreIGValue-1; + } +#endif + + //Check initial gain by upper/lower bound + if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max) + pDigTable->CurIGValue = pDigTable->rx_gain_range_max; + + if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min) + pDigTable->CurIGValue = pDigTable->rx_gain_range_min; + + //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__, + // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min); + //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue ); + + DM_Write_DIG(pAdapter); + +} +#endif + +static VOID +dm_initial_gain_Multi_STA( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + int rssi_strength = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + BOOLEAN bMulti_STA = _FALSE; + + //ADHOC and AP Mode + if(check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + bMulti_STA = _TRUE; + } + + + if((bMulti_STA == _FALSE) + || (pDigTable->CurSTAConnectState != DIG_STA_DISCONNECT)) + { + pdmpriv->binitialized = _FALSE; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; + return; + } + else if(pdmpriv->binitialized == _FALSE) + { + pdmpriv->binitialized = _TRUE; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0; + pDigTable->CurIGValue = 0x20; + DM_Write_DIG(pAdapter); + } + + // Initial gain control by ap mode + if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) + { + if ( (rssi_strength < pDigTable->RssiLowThresh) && + (pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_1)) + { + // Set to dig value to 0x20 for Luke's opinion after disable dig + if(pDigTable->Dig_Ext_Port_Stage == DIG_EXT_PORT_STAGE_2) + { + pDigTable->CurIGValue = 0x20; + DM_Write_DIG(pAdapter); + } + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_1; + } + else if (rssi_strength > pDigTable->RssiHighThresh) + { + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_2; + dm_CtrlInitGainByFA(pAdapter); + } + } + else if(pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_0) + { + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0; + pDigTable->CurIGValue = 0x20; + DM_Write_DIG(pAdapter); + } + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurMultiSTAConnectState = %x Dig_Ext_Port_Stage %x\n", + // DM_DigTable.CurMultiSTAConnectState, DM_DigTable.Dig_Ext_Port_Stage)); +} + + +static VOID +dm_initial_gain_STA( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("PreSTAConnectState = %x, CurSTAConnectState = %x\n", + // DM_DigTable.PreSTAConnectState, DM_DigTable.CurSTAConnectState)); + + + if(pDigTable->PreSTAConnectState == pDigTable->CurSTAConnectState|| + pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT || + pDigTable->CurSTAConnectState == DIG_STA_CONNECT) + { + // beforeconnect -> beforeconnect or connect -> connect + // (dis)connect -> beforeconnect + // disconnect -> connecct or beforeconnect -> connect + if(pDigTable->CurSTAConnectState != DIG_STA_DISCONNECT) + { + pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter); + dm_CtrlInitGainByRssi(pAdapter); + } + } + else + { + // connect -> disconnect or beforeconnect -> disconnect + pDigTable->Rssi_val_min = 0; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + pDigTable->CurIGValue = 0x20; + pDigTable->PreIGValue = 0; + DM_Write_DIG(pAdapter); + } + +} + + +static void dm_CCK_PacketDetectionThresh( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT) + { + pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter); + if(pDigTable->PreCCKPDState == CCK_PD_STAGE_LowRssi) + { + if(pDigTable->Rssi_val_min <= 25) + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; + else + pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi; + } + else{ + if(pDigTable->Rssi_val_min <= 20) + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; + else + pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi; + } + } + else + pDigTable->CurCCKPDState=CCK_PD_STAGE_MAX; + + if(pDigTable->PreCCKPDState != pDigTable->CurCCKPDState) + { + if((pDigTable->CurCCKPDState == CCK_PD_STAGE_LowRssi)|| + (pDigTable->CurCCKPDState == CCK_PD_STAGE_MAX)) + { + PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0x83); + + //PHY_SetBBReg(pAdapter, rCCK0_System, bMaskByte1, 0x40); + //if(IS_92C_SERIAL(pHalData->VersionID)) + //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd7); + } + else + { + PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0xcd); + //PHY_SetBBReg(pAdapter,rCCK0_System, bMaskByte1, 0x47); + //if(IS_92C_SERIAL(pHalData->VersionID)) + //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd3); + } + + pDigTable->PreCCKPDState = pDigTable->CurCCKPDState; + } + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CCKPDStage=%x\n",pDigTable->CurCCKPDState)); + //RT_TRACE( COMP_DIG, DBG_LOUD, ("is92C=%x\n",IS_92C_SERIAL(pHalData->VersionID))); + +} + + +static void +dm_CtrlInitGainByTwoPort( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + return; + + // Decide the current status and if modify initial gain or not + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) + { + pDigTable->CurSTAConnectState = DIG_STA_BEFORE_CONNECT; + } + else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + pDigTable->CurSTAConnectState = DIG_STA_CONNECT; + } + else + { + pDigTable->CurSTAConnectState = DIG_STA_DISCONNECT; + } + + + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT; + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + if((is_IBSS_empty(pAdapter)==_FAIL) && (pAdapter->stapriv.asoc_sta_count > 2)) + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + if(pAdapter->stapriv.asoc_sta_count > 2) + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT; + } + + + dm_initial_gain_STA(pAdapter); + dm_initial_gain_Multi_STA(pAdapter); + dm_CCK_PacketDetectionThresh(pAdapter); + + pDigTable->PreSTAConnectState = pDigTable->CurSTAConnectState; + +} + + +static void dm_DIG( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() ==>\n")); + + if(pdmpriv->bDMInitialGainEnable == _FALSE) + return; + + //if(pDigTable->Dig_Enable_Flag == _FALSE) + // return; + + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG)) + return; + + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() progress \n")); + + dm_CtrlInitGainByTwoPort(pAdapter); + + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() <==\n")); +} + +static void dm_SavePowerIndex(IN PADAPTER Adapter) +{ + u8 index; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; + + for(index = 0; index< 6; index++) + pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]); +} + +static void dm_RestorePowerIndex(IN PADAPTER Adapter) +{ + u8 index; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; + + for(index = 0; index< 6; index++) + rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]); +} + +static void dm_WritePowerIndex( + IN PADAPTER Adapter, + IN u8 Value) +{ + u8 index; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; + + for(index = 0; index< 6; index++) + rtw_write8(Adapter, Power_Index_REG[index], Value); +} + +static void dm_InitDynamicTxPower(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + dm_SavePowerIndex(Adapter); + pdmpriv->bDynamicTxPowerEnable = _TRUE; + } + else +#else + pdmpriv->bDynamicTxPowerEnable = _FALSE; +#endif + + pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal; + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; +} + + +static void dm_DynamicTxPower(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + int UndecoratedSmoothedPWDB; + + if(!pdmpriv->bDynamicTxPowerEnable) + return; + + // If dynamic high power is disabled. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_HP) ) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; + return; + } + + // STA not connected and AP not connected + if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) && + (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)) + { + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("Not connected to any \n")); + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; + + //the LastDTPlvl should reset when disconnect, + //otherwise the tx power level wouldn't change when disconnect and connect again. + // Maddest 20091220. + pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal; + return; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port + { + //todo: AP Mode + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) + { + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); + } + else + { + UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); + } + } + else // associated entry pwdb + { + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); + } + + if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n")); + } + else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) && + (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) ) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n")); + } + else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5)) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n")); + } + + if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) ) + { + PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel); + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal + dm_RestorePowerIndex(Adapter); + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + dm_WritePowerIndex(Adapter, 0x14); + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + dm_WritePowerIndex(Adapter, 0x10); + } + pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl; + +} + + +static VOID +DM_ChangeDynamicInitGainThresh( + IN PADAPTER pAdapter, + IN u32 DM_Type, + IN u32 DM_Value) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + if (DM_Type == DIG_TYPE_THRESH_HIGH) + { + pDigTable->RssiHighThresh = DM_Value; + } + else if (DM_Type == DIG_TYPE_THRESH_LOW) + { + pDigTable->RssiLowThresh = DM_Value; + } + else if (DM_Type == DIG_TYPE_ENABLE) + { + pDigTable->Dig_Enable_Flag = _TRUE; + } + else if (DM_Type == DIG_TYPE_DISABLE) + { + pDigTable->Dig_Enable_Flag = _FALSE; + } + else if (DM_Type == DIG_TYPE_BACKOFF) + { + if(DM_Value > 30) + DM_Value = 30; + pDigTable->BackoffVal = (u8)DM_Value; + } + else if(DM_Type == DIG_TYPE_RX_GAIN_MIN) + { + if(DM_Value == 0) + DM_Value = 0x1; + pDigTable->rx_gain_range_min = (u8)DM_Value; + } + else if(DM_Type == DIG_TYPE_RX_GAIN_MAX) + { + if(DM_Value > 0x50) + DM_Value = 0x50; + pDigTable->rx_gain_range_max = (u8)DM_Value; + } +} /* DM_ChangeDynamicInitGainThresh */ + + +static VOID PWDB_Monitor( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + int i; + int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff; + u8 sta_cnt=0; + u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi + + if(check_fwstate(&Adapter->mlmepriv, _FW_LINKED) != _TRUE) + return; + + + if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + _irqL irqL; + _list *plist, *phead; + struct sta_info *psta; + struct sta_priv *pstapriv = &Adapter->stapriv; + u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff}; + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + for(i=0; i< NUM_STA; i++) + { + phead = &(pstapriv->sta_hash[i]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + + plist = get_next(plist); + + if(_rtw_memcmp(psta ->hwaddr, bcast_addr, ETH_ALEN) || + _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN)) + continue; + + if(psta->state & WIFI_ASOC_STATE) + { + + if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) + tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; + + if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) + tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; + + PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); + } + + } + + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + + + if(pHalData->fw_ractrl == _TRUE) + { + // Report every sta's RSSI to FW + for(i=0; i< sta_cnt; i++) + { + rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]); + } + } + + } + + + + if(tmpEntryMaxPWDB != 0) // If associated entry is found + { + pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; + } + else + { + pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; + } + + if(tmpEntryMinPWDB != 0xff) // If associated entry is found + { + pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; + } + else + { + pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; + } + + + if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) + { + + if(pHalData->fw_ractrl == _TRUE) + { + u32 param = (u32)(pdmpriv->UndecoratedSmoothedPWDB<<16); + + param |= 0;//macid=0 for sta mode; + + rtl8192c_set_rssi_cmd(Adapter, (u8*)¶m); + } + } + +} + + +static void +DM_InitEdcaTurbo( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + pHalData->bCurrentTurboEDCA = _FALSE; + Adapter->recvpriv.bIsAnyNonBEPkts = _FALSE; + +} + + +static void +dm_CheckEdcaTurbo( + IN PADAPTER Adapter + ) +{ + u32 trafficIndex; + u32 edca_param; + u64 cur_tx_bytes = 0; + u64 cur_rx_bytes = 0; + u8 bbtchange = _FALSE; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct recv_priv *precvpriv = &(Adapter->recvpriv); + struct registry_priv *pregpriv = &Adapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + + + if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)) + { + goto dm_CheckEdcaTurbo_EXIT; + } + + if (pmlmeinfo->assoc_AP_vendor >= maxAP) + { + goto dm_CheckEdcaTurbo_EXIT; + } + +#ifdef CONFIG_BT_COEXIST + if(pbtpriv->BT_Coexist) + { + if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0)) + { + bbtchange = _TRUE; + } + } +#endif + + // Check if the status needs to be changed. + if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) ) + { + cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes; + cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes; + + //traffic, TX or RX + if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP)) + { + if (cur_tx_bytes > (cur_rx_bytes << 2)) + { // Uplink TP is present. + trafficIndex = UP_LINK; + } + else + { // Balance TP is present. + trafficIndex = DOWN_LINK; + } + } + else + { + if (cur_rx_bytes > (cur_tx_bytes << 2)) + { // Downlink TP is present. + trafficIndex = DOWN_LINK; + } + else + { // Balance TP is present. + trafficIndex = UP_LINK; + } + } + + if ((pdmpriv->prv_traffic_idx != trafficIndex) || (!pHalData->bCurrentTurboEDCA)) + { +#ifdef CONFIG_BT_COEXIST + if(_TRUE == bbtchange) + { + edca_param = pbtpriv->BT_EDCA[trafficIndex]; + } + else +#endif + { +#if 0 + //adjust EDCA parameter for BE queue + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; +#else + + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) + { + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; + } + else + { + edca_param = EDCAParam[unknownAP][trafficIndex]; + } +#endif + } + +#ifdef CONFIG_PCI_HCI + if(IS_92C_SERIAL(pHalData->VersionID)) + { + edca_param = 0x60a42b; + } + else + { + edca_param = 0x6ea42b; + } +#endif + rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param); + + pdmpriv->prv_traffic_idx = trafficIndex; + } + + pHalData->bCurrentTurboEDCA = _TRUE; + } + else + { + // + // Turn Off EDCA turbo here. + // Restore original EDCA according to the declaration of AP. + // + if(pHalData->bCurrentTurboEDCA) + { + rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE); + pHalData->bCurrentTurboEDCA = _FALSE; + } + } + +dm_CheckEdcaTurbo_EXIT: + // Set variables for next time. + precvpriv->bIsAnyNonBEPkts = _FALSE; + pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes; + precvpriv->last_rx_bytes = precvpriv->rx_bytes; + +} + +#define DPK_DELTA_MAPPING_NUM 13 +#define index_mapping_HP_NUM 15 +//091212 chiyokolin +static VOID +dm_TXPowerTrackingCallback_ThermalMeter_92C( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100, ThermalValue_HP_count = 0; + u32 ThermalValue_HP = 0; + s8 delta_DPK; + int ele_A, ele_D, TempCCk, X, value32; + int Y, ele_C; + s8 OFDM_index[2], CCK_index = 0, OFDM_index_old[2], CCK_index_old = 0, delta_APK; + int i = 0, CCKSwingNeedUpdate = 0; + BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); +#if 0 +//#ifdef CONFIG_MP_INCLUDED + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; +#endif + + u8 OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur + u32 DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { + {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x03}, + {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x03, 0x03}}; + + s8 index_mapping_HP[index_mapping_HP_NUM] = { + 0, 1, 3, 4, 6, + 7, 9, 10, 12, 13, + 15, 16, 18, 19, 21 + }; + + s8 index_HP; + + pdmpriv->TXPowerTrackingCallbackCnt++; //cosa add for debug + pdmpriv->bTXPowerTrackingInit = _TRUE; + + if(pHalData->CurrentChannel == 14 && !pdmpriv->bCCKinCH14) + pdmpriv->bCCKinCH14 = _TRUE; + else if(pHalData->CurrentChannel != 14 && pdmpriv->bCCKinCH14) + pdmpriv->bCCKinCH14 = _FALSE; + + //DBG_8192C("===>dm_TXPowerTrackingCallback_ThermalMeter_92C\n"); + + ThermalValue = (u8)PHY_QueryRFReg(Adapter, RF90_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] + + //DBG_8192C("\n\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n",ThermalValue,pdmpriv->ThermalValue, pHalData->EEPROMThermalMeter); + + rtl8192c_PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + rtl8192c_PHY_DigitalPredistortion(Adapter); + + if(is2T) + rf = 2; + else + rf = 1; + + if(ThermalValue) + { +// if(!pHalData->ThermalValue) + { + //Query OFDM path A default setting + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; + for(i=0; ibCCKinCH14) + { + if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==_TRUE) + { + CCK_index_old =(u8)i; + //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14); + break; + } + } + else + { + if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==_TRUE) + { + CCK_index_old =(u8)i; + //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14); + break; + } + } + } + + if(!pdmpriv->ThermalValue) + { + pdmpriv->ThermalValue = pHalData->EEPROMThermalMeter; + pdmpriv->ThermalValue_LCK = ThermalValue; + pdmpriv->ThermalValue_IQK = ThermalValue; + pdmpriv->ThermalValue_DPK = pHalData->EEPROMThermalMeter; + +#ifdef CONFIG_USB_HCI + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index_HP[i] = pdmpriv->OFDM_index[i] = OFDM_index_old[i]; + pdmpriv->CCK_index_HP = pdmpriv->CCK_index = CCK_index_old; +#else + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index[i] = OFDM_index_old[i]; + pdmpriv->CCK_index = CCK_index_old; +#endif + } + +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + pdmpriv->ThermalValue_HP[pdmpriv->ThermalValue_HP_index] = ThermalValue; + pdmpriv->ThermalValue_HP_index++; + if(pdmpriv->ThermalValue_HP_index == HP_THERMAL_NUM) + pdmpriv->ThermalValue_HP_index = 0; + + for(i = 0; i < HP_THERMAL_NUM; i++) + { + if(pdmpriv->ThermalValue_HP[i]) + { + ThermalValue_HP += pdmpriv->ThermalValue_HP[i]; + ThermalValue_HP_count++; + } + } + + if(ThermalValue_HP_count) + ThermalValue = (u8)(ThermalValue_HP / ThermalValue_HP_count); + } +#endif + } + + delta = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + if(pdmpriv->bDoneTxpower) + delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); + else + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + } + else +#endif + { + delta_HP = 0; + } + delta_LCK = (ThermalValue > pdmpriv->ThermalValue_LCK)?(ThermalValue - pdmpriv->ThermalValue_LCK):(pdmpriv->ThermalValue_LCK - ThermalValue); + delta_IQK = (ThermalValue > pdmpriv->ThermalValue_IQK)?(ThermalValue - pdmpriv->ThermalValue_IQK):(pdmpriv->ThermalValue_IQK - ThermalValue); + delta_DPK = pdmpriv->ThermalValue_DPK - ThermalValue; + + //DBG_8192C("Readback Thermal Meter = 0x%lx pre thermal meter 0x%lx EEPROMthermalmeter 0x%lx delta 0x%lx delta_LCK 0x%lx delta_IQK 0x%lx\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK); + + if(delta_LCK > 1) + { + pdmpriv->ThermalValue_LCK = ThermalValue; + rtl8192c_PHY_LCCalibrate(Adapter); + } + + if((delta > 0 || delta_HP > 0) && pdmpriv->TxPowerTrackControl) + { +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + pdmpriv->bDoneTxpower = _TRUE; + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + + if(delta_HP > index_mapping_HP_NUM-1) + index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; + else + index_HP = index_mapping_HP[delta_HP]; + + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index_HP[i] - index_HP; + CCK_index = pdmpriv->CCK_index_HP -index_HP; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index_HP[i] + index_HP; + CCK_index = pdmpriv->CCK_index_HP + index_HP; + } + + delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); + + } + else +#endif + { + if(ThermalValue > pdmpriv->ThermalValue) + { + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index[i] -= delta; + + pdmpriv->CCK_index -= delta; + } + else + { + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index[i] += delta; + + pdmpriv->CCK_index += delta; + } + } + + /* + if(is2T) + { + DBG_8192C("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + pdmpriv->OFDM_index[0], pdmpriv->OFDM_index[1], pdmpriv->CCK_index); + } + else + { + //DBG_8192C("temp OFDM_A_index=0x%x, CCK_index=0x%x\n",pdmpriv->OFDM_index[0], pdmpriv->CCK_index); + } + */ + + //no adjust +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType != BOARD_USB_High_PA) +#endif + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index[i]+1; + CCK_index = pdmpriv->CCK_index+1; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index[i]; + CCK_index = pdmpriv->CCK_index; + } +#if 0 +//#ifdef CONFIG_MP_INCLUDED + for(i = 0; i < rf; i++) + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + OFDM_index[i] += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + OFDM_index[i] -= 1; + } + } + + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + CCK_index += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + CCK_index -= 1; + } + } +#endif + } + + for(i = 0; i < rf; i++) + { + if(OFDM_index[i] > OFDM_TABLE_SIZE-1) + OFDM_index[i] = OFDM_TABLE_SIZE-1; + else if (OFDM_index[i] < OFDM_min_index) + OFDM_index[i] = OFDM_min_index; + } + + if(CCK_index > CCK_TABLE_SIZE-1) + CCK_index = CCK_TABLE_SIZE-1; + else if (CCK_index < 0) + CCK_index = 0; + + /* + if(is2T) + { + DBG_8192C("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", OFDM_index[0], OFDM_index[1], CCK_index); + } + else + { + //DBG_8192C("new OFDM_A_index=0x%x, CCK_index=0x%x\n", OFDM_index[0], CCK_index); + } + */ + + } + + if(pdmpriv->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) + { + //Adujst OFDM Ant_A according to IQK result + ele_D = (OFDMSwingTable[(u8)OFDM_index[0]] & 0xFFC00000)>>22; + X = pdmpriv->RegE94; + Y = pdmpriv->RegE9C; + + if(X != 0) + { + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x000003FF; + + //wirte new elements A, C, D to regC80 and regC94, element B is always 0 + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); + + } + else + { + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[(u8)OFDM_index[0]]); + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); + } + + //RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + + //Adjust CCK according to IQK result + if(!pdmpriv->bCCKinCH14){ + rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][0]); + rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][1]); + rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][2]); + rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][3]); + rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][4]); + rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][5]); + rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][6]); + rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][7]); + } + else{ + rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch14[(u8)CCK_index][0]); + rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch14[(u8)CCK_index][1]); + rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch14[(u8)CCK_index][2]); + rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch14[(u8)CCK_index][3]); + rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch14[(u8)CCK_index][4]); + rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch14[(u8)CCK_index][5]); + rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch14[(u8)CCK_index][6]); + rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch14[(u8)CCK_index][7]); + } + + if(is2T) + { + ele_D = (OFDMSwingTable[(u8)OFDM_index[1]] & 0xFFC00000)>>22; + + //new element A = element D x X + X = pdmpriv->RegEB4; + Y = pdmpriv->RegEBC; + + if(X != 0){ + if ((X & 0x00000200) != 0) //consider minus + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x00003FF; + + //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 + value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); + + } + else{ + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[(u8)OFDM_index[1]]); + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); + } + + //DBG_8192C("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D); + } + + /* + DBG_8192C("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", \ + PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord),\ + PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), \ + PHY_QueryRFReg(Adapter, RF90_PATH_A, 0x24, bMaskDWord)); + */ + } + +#if MP_DRIVER == 1 + if(delta_IQK > 1) +#else + if(delta_IQK > 3) +#endif + { + pdmpriv->ThermalValue_IQK = ThermalValue; + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); + } + + if(delta_DPK != 0) + { + delta_DPK = ThermalValue - pHalData->EEPROMThermalMeter; + + //if(pdmpriv->bDPPathAOK || pdmpriv->bDPPathBOK) + // DBG_8192C("TxPwrTracking delata_DPK = %d\n", delta_DPK); + + if(pdmpriv->bDPPathAOK) + PHY_SetBBReg(Adapter, 0xb68, 0x7c00, DPK_delta_mapping[0][((delta_DPK+13)/2)]); + if(pdmpriv->bDPPathBOK) + PHY_SetBBReg(Adapter, 0xb6c, 0x7c00, DPK_delta_mapping[1][((delta_DPK+13)/2)]); + pdmpriv->ThermalValue_DPK = ThermalValue; + } + + //update thermal meter value + if(pdmpriv->TxPowerTrackControl) + pdmpriv->ThermalValue = ThermalValue; + + } + + //DBG_8192C("<===dm_TXPowerTrackingCallback_ThermalMeter_92C\n"); + + pdmpriv->TXPowercount = 0; + +} + + +static VOID +dm_InitializeTXPowerTracking_ThermalMeter( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + //pMgntInfo->bTXPowerTracking = _TRUE; + pdmpriv->TXPowercount = 0; + pdmpriv->bTXPowerTrackingInit = _FALSE; + pdmpriv->ThermalValue = 0; + +#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default + pdmpriv->TxPowerTrackControl = _TRUE; +#endif + + //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl); +} + + +static VOID +DM_InitializeTXPowerTracking( + IN PADAPTER Adapter) +{ + dm_InitializeTXPowerTracking_ThermalMeter(Adapter); +} + +// +// Description: +// - Dispatch TxPower Tracking direct call ONLY for 92s. +// - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource +// leakage under some platform. +// +// Assumption: +// PASSIVE_LEVEL when this routine is called. +// +// Added by Roger, 2009.06.18. +// +static VOID +DM_TXPowerTracking92CDirectCall( + IN PADAPTER Adapter) +{ + dm_TXPowerTrackingCallback_ThermalMeter_92C(Adapter); +} + +static VOID +dm_CheckTXPowerTracking_ThermalMeter( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + //u1Byte TxPowerCheckCnt = 5; //10 sec + + //if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/) + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_SS)) + { + return; + } + + if(!pdmpriv->TM_Trigger) //at least delay 1 sec + { + //pHalData->TxPowerCheckCnt++; //cosa add for debug + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60); + //DBG_8192C("Trigger 92C Thermal Meter!!\n"); + + pdmpriv->TM_Trigger = 1; + return; + + } + else + { + //DBG_8192C("Schedule TxPowerTracking direct call!!\n"); + DM_TXPowerTracking92CDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18. + pdmpriv->TM_Trigger = 0; + } + +} + + +VOID +rtl8192c_dm_CheckTXPowerTracking( + IN PADAPTER Adapter) +{ + dm_CheckTXPowerTracking_ThermalMeter(Adapter); +} + +#ifdef CONFIG_BT_COEXIST +static BOOLEAN BT_BTStateChange(PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + struct registry_priv *registry_par = &Adapter->registrypriv; + + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + u32 Polling, Ratio_Tx, Ratio_PRI; + u32 BT_Tx, BT_PRI; + u8 BT_State; + static u8 ServiceTypeCnt = 0; + u8 CurServiceType; + static u8 LastServiceType = BT_Idle; + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) + return _FALSE; + + BT_State = rtw_read8(Adapter, 0x4fd); +/* + temp = PlatformEFIORead4Byte(Adapter, 0x488); + BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff)); + BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff)); + + temp = PlatformEFIORead4Byte(Adapter, 0x48c); + Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) + + ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff); + +*/ + BT_Tx = rtw_read32(Adapter, 0x488); + + DBG_8192C("Ratio 0x488 =%x\n", BT_Tx); + BT_Tx =BT_Tx & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx)); + + BT_PRI = rtw_read32(Adapter, 0x48c); + + DBG_8192C("Ratio 0x48c =%x\n", BT_PRI); + BT_PRI =BT_PRI & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI)); + + + Polling = rtw_read32(Adapter, 0x490); + //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling)); + + + if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffff && BT_State==0xff) + return _FALSE; + + BT_State &= BIT0; + + if(BT_State != pbtpriv->BT_CUR_State) + { + pbtpriv->BT_CUR_State = BT_State; + + if(registry_par->bt_sco == 3) + { + ServiceTypeCnt = 0; + + pbtpriv->BT_Service = BT_Idle; + + DBG_8192C("BT_%s\n", BT_State?"ON":"OFF"); + + BT_State = BT_State | + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) |BIT2; + + rtw_write8(Adapter, 0x4fd, BT_State); + DBG_8192C("BT set 0x4fd to %x\n", BT_State); + } + + return _TRUE; + } + DBG_8192C("bRegBT_Sco = %d\n",registry_par->bt_sco); + + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pbtpriv->Ratio_Tx=Ratio_Tx; + pbtpriv->Ratio_PRI=Ratio_PRI; + + DBG_8192C("Ratio_Tx=%d\n", Ratio_Tx); + DBG_8192C("Ratio_PRI=%d\n", Ratio_PRI); + + + if(BT_State && registry_par->bt_sco==3) + { + DBG_8192C("bt_sco ==3 Follow Counter\n"); +// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff) +// { +// ServiceTypeCnt = 0; +// return FALSE; +// } +// else + { + /* + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; + + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); + + */ + if((Ratio_Tx < 30) && (Ratio_PRI < 30)) + CurServiceType = BT_Idle; + else if((Ratio_PRI > 110) && (Ratio_PRI < 250)) + CurServiceType = BT_SCO; + else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200)) + CurServiceType = BT_Busy; + else if((Ratio_Tx >=350) && (Ratio_Tx < 500)) + CurServiceType = BT_OtherBusy; + else if(Ratio_Tx >=500) + CurServiceType = BT_PAN; + else + CurServiceType=BT_OtherAction; + } + +/* if(pHalData->bt_coexist.bStopCount) + { + ServiceTypeCnt=0; + pHalData->bt_coexist.bStopCount=FALSE; + } +*/ +// if(CurServiceType == BT_OtherBusy) + { + ServiceTypeCnt=2; + LastServiceType=CurServiceType; + } +#if 0 + else if(CurServiceType == LastServiceType) + { + if(ServiceTypeCnt<3) + ServiceTypeCnt++; + } + else + { + ServiceTypeCnt = 0; + LastServiceType = CurServiceType; + } +#endif + + if(ServiceTypeCnt==2) + { + pbtpriv->BT_Service = LastServiceType; + BT_State = BT_State | + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) | + //((pbtpriv->BT_Service==BT_SCO)?0:BIT2); + ((pbtpriv->BT_Service!=BT_Idle)?0:BIT2); + + //if(pbtpriv->BT_Service==BT_Busy) + // BT_State&= ~(BIT2); + + if(pbtpriv->BT_Service==BT_SCO) + { + DBG_8192C("BT TYPE Set to ==> BT_SCO\n"); + } + else if(pbtpriv->BT_Service==BT_Idle) + { + DBG_8192C("BT TYPE Set to ==> BT_Idle\n"); + } + else if(pbtpriv->BT_Service==BT_OtherAction) + { + DBG_8192C("BT TYPE Set to ==> BT_OtherAction\n"); + } + else if(pbtpriv->BT_Service==BT_Busy) + { + DBG_8192C("BT TYPE Set to ==> BT_Busy\n"); + } + else if(pbtpriv->BT_Service==BT_PAN) + { + DBG_8192C("BT TYPE Set to ==> BT_PAN\n"); + } + else + { + DBG_8192C("BT TYPE Set to ==> BT_OtherBusy\n"); + } + + //Add interrupt migration when bt is not in idel state (no traffic). + //suggestion by Victor. + if(pbtpriv->BT_Service!=BT_Idle)//EDCA_VI_PARAM modify + { + + rtw_write16(Adapter, 0x504, 0x0ccc); + rtw_write8(Adapter, 0x506, 0x54); + rtw_write8(Adapter, 0x507, 0x54); + + } + else + { + rtw_write8(Adapter, 0x506, 0x00); + rtw_write8(Adapter, 0x507, 0x00); + } + + rtw_write8(Adapter, 0x4fd, BT_State); + DBG_8192C("BT_SCO set 0x4fd to %x\n", BT_State); + return _TRUE; + } + } + + return _FALSE; + +} + +static BOOLEAN +BT_WifiConnectChange( + IN PADAPTER Adapter + ) +{ + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); +// PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + static BOOLEAN bMediaConnect = _FALSE; + + //if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo)) + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) + { + bMediaConnect = _FALSE; + } + else + { + if(!bMediaConnect) + { + bMediaConnect = _TRUE; + return _TRUE; + } + bMediaConnect = _TRUE; + } + + return _FALSE; +} + +#define BT_RSSI_STATE_NORMAL_POWER BIT0 +#define BT_RSSI_STATE_AMDPU_OFF BIT1 +#define BT_RSSI_STATE_SPECIAL_LOW BIT2 +#define BT_RSSI_STATE_BG_EDCA_LOW BIT3 + +static s32 GET_UNDECORATED_AVERAGE_RSSI(PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + s32 average_rssi; + + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) + { + average_rssi = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + } + else + { + average_rssi = pdmpriv->UndecoratedSmoothedPWDB; + } + return average_rssi; +} + +static u8 BT_RssiStateChange( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + s32 UndecoratedSmoothedPWDB; + u8 CurrBtRssiState = 0x00; + + + + + //if(pMgntInfo->bMediaConnect) // Default port + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(Adapter); + } + else // associated entry pwdb + { + if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) + UndecoratedSmoothedPWDB = 100; // No any RSSI information. Assume to be MAX. + else + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + } + + // Check RSSI to determine HighPower/NormalPower state for BT coexistence. + if(UndecoratedSmoothedPWDB >= 67) + CurrBtRssiState &= (~BT_RSSI_STATE_NORMAL_POWER); + else if(UndecoratedSmoothedPWDB < 62) + CurrBtRssiState |= BT_RSSI_STATE_NORMAL_POWER; + + // Check RSSI to determine AMPDU setting for BT coexistence. + if(UndecoratedSmoothedPWDB >= 40) + CurrBtRssiState &= (~BT_RSSI_STATE_AMDPU_OFF); + else if(UndecoratedSmoothedPWDB <= 32) + CurrBtRssiState |= BT_RSSI_STATE_AMDPU_OFF; + + // Marked RSSI state. It will be used to determine BT coexistence setting later. + if(UndecoratedSmoothedPWDB < 35) + CurrBtRssiState |= BT_RSSI_STATE_SPECIAL_LOW; + else + CurrBtRssiState &= (~BT_RSSI_STATE_SPECIAL_LOW); + + // Check BT state related to BT_Idle in B/G mode. + if(UndecoratedSmoothedPWDB < 15) + CurrBtRssiState |= BT_RSSI_STATE_BG_EDCA_LOW; + else + CurrBtRssiState &= (~BT_RSSI_STATE_BG_EDCA_LOW); + + if(CurrBtRssiState != pbtpriv->BtRssiState) + { + pbtpriv->BtRssiState = CurrBtRssiState; + return _TRUE; + } + else + { + return _FALSE; + } +} + +static void dm_BTCoexist(PADAPTER Adapter ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct mlme_ext_info *pmlmeinfo = &Adapter->mlmeextpriv.mlmext_info; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + //PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo); + + //PRX_TS_RECORD pRxTs = NULL; + u8 BT_gpio_mux; + + BOOLEAN bWifiConnectChange, bBtStateChange,bRssiStateChange; + + if(pbtpriv->bCOBT == _FALSE) return; + + if(!( pdmpriv->DMFlag & DYNAMIC_FUNC_BT)) return; + + if( (pbtpriv->BT_Coexist) &&(pbtpriv->BT_CoexistType == BT_CSR_BC4) && (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE) ) + { + bWifiConnectChange = BT_WifiConnectChange(Adapter); + bBtStateChange = BT_BTStateChange(Adapter); + bRssiStateChange = BT_RssiStateChange(Adapter); + + DBG_8192C("bWifiConnectChange %d, bBtStateChange %d,bRssiStateChange %d\n", + bWifiConnectChange,bBtStateChange,bRssiStateChange); + + // add by hpfan for debug message + BT_gpio_mux = rtw_read8(Adapter, REG_GPIO_MUXCFG); + DBG_8192C("BTCoexit Reg_0x40 (%2x)\n", BT_gpio_mux); + + if( bWifiConnectChange ||bBtStateChange ||bRssiStateChange ) + { + if(pbtpriv->BT_CUR_State) + { + + // Do not allow receiving A-MPDU aggregation. + if(pbtpriv->BT_Ampdu)// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. + { + + if(pmlmeinfo->assoc_AP_vendor == ciscoAP) + { + if(pbtpriv->BT_Service!=BT_Idle) + { + if(pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Disallow AMPDU \n"); + pmlmeinfo->bAcceptAddbaReq = _FALSE; + send_delba(Adapter,0, get_my_bssid(&(pmlmeinfo->network))); + } + } + else + { + if(!pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Allow AMPDU RSSI >=40\n"); + pmlmeinfo->bAcceptAddbaReq = _TRUE; + } + } + } + else + { + if(!pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Allow AMPDU BT Idle\n"); + pmlmeinfo->bAcceptAddbaReq = _TRUE; + } + } + } + +#if 0 + else if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy)) + { + if(pHalData->bt_coexist.BtRssiState & BT_RSSI_STATE_AMDPU_OFF) + { + if(pMgntInfo->bBT_Ampdu && pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n")); + pHTInfo->bAcceptAddbaReq = FALSE; + if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE)) + TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR); + } + } + else + { + if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n")); + pHTInfo->bAcceptAddbaReq = TRUE; + } + } + } + else + { + if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n")); + pHTInfo->bAcceptAddbaReq = TRUE; + } + } +#endif + + if(pbtpriv->BT_Ant_isolation) + { + DBG_8192C("BT_IsolationLow\n"); + +// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3. +#if 0 + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + if(pMgntInfo->bUseRAMask) + { + // 20100407 Joseph: Fix rate adaptive modification for BT coexist. + // This fix is not complete yet. It shall also consider VWifi and Adhoc case, + // which connect with multiple STAs. + Adapter->HalFunc.UpdateHalRAMaskHandler( + Adapter, + FALSE, + 0, + NULL, + NULL, + pMgntInfo->RateAdaptive.RATRState, + RAMask_Normal); + } + else + { + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + } +#endif + + // 20100415 Joseph: Modify BT coexist mechanism suggested by Yaying. + // Now we only enable HW BT coexist when BT in "Busy" state. + if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20) + { + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && + pbtpriv->BT_Service==BT_OtherAction) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); + } + else + { + if((pbtpriv->BT_Service==BT_Busy) && + (pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER)) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); + } + else if((pbtpriv->BT_Service==BT_OtherAction) && + (pbtpriv->BtRssiState & BT_RSSI_STATE_SPECIAL_LOW)) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); + } + else if(pbtpriv->BT_Service==BT_PAN) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + } + else + { + DBG_8192C("BT_Turn OFF Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + } + } + } + else + { + DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + } + + if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20) + { + if(pbtpriv->BT_Service==BT_PAN) + { + DBG_8192C("BT_Turn ON Coexist(Reg0x44 = 0x10100)\n"); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x10100); + } + else + { + DBG_8192C("BT_Turn OFF Coexist(Reg0x44 = 0x0)\n"); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0); + } + } + else + { + DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist(Reg0x44 = 0x0)\n"); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0); + } + + // 20100430 Joseph: Integrate the BT coexistence EDCA tuning here. + if(pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER) + { + if(pbtpriv->BT_Service==BT_OtherBusy) + { + //pbtpriv->BtEdcaUL = 0x5ea72b; + //pbtpriv->BtEdcaDL = 0x5ea72b; + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72b; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72b; + + DBG_8192C("BT in BT_OtherBusy state Tx (%d) >350 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx ,REG_EDCA_BE_PARAM, 0x5ea72b); + } + else if(pbtpriv->BT_Service==BT_Busy) + { + //pbtpriv->BtEdcaUL = 0x5eb82f; + //pbtpriv->BtEdcaDL = 0x5eb82f; + + pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82f; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82f; + + DBG_8192C("BT in BT_Busy state parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82f); + } + else if(pbtpriv->BT_Service==BT_SCO) + { + if(pbtpriv->Ratio_Tx>160) + { + //pbtpriv->BtEdcaUL = 0x5ea72f; + //pbtpriv->BtEdcaDL = 0x5ea72f; + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72f; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72f; + DBG_8192C("BT in BT_SCO state Tx (%d) >160 parameter(0x%x) = 0x%x\n",pbtpriv->Ratio_Tx, REG_EDCA_BE_PARAM, 0x5ea72f); + } + else + { + //pbtpriv->BtEdcaUL = 0x5ea32b; + //pbtpriv->BtEdcaDL = 0x5ea42b; + + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea32b; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea42b; + + DBG_8192C("BT in BT_SCO state Tx (%d) <160 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx,REG_EDCA_BE_PARAM, 0x5ea32f); + } + } + else + { + // BT coexistence mechanism does not control EDCA parameter. + //pbtpriv->BtEdcaUL = 0; + //pbtpriv->BtEdcaDL = 0; + + pbtpriv->BT_EDCA[UP_LINK] = 0; + pbtpriv->BT_EDCA[DOWN_LINK] = 0; + DBG_8192C("BT in State %d and parameter(0x%x) use original setting.\n",pbtpriv->BT_Service, REG_EDCA_BE_PARAM); + } + + if((pbtpriv->BT_Service!=BT_Idle) && + (pmlmeext->cur_wireless_mode == WIRELESS_MODE_G) && + (pbtpriv->BtRssiState & BT_RSSI_STATE_BG_EDCA_LOW)) + { + //pbtpriv->BtEdcaUL = 0x5eb82b; + //pbtpriv->BtEdcaDL = 0x5eb82b; + + pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82b; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82b; + + DBG_8192C("BT set parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82b); + } + } + else + { + // BT coexistence mechanism does not control EDCA parameter. + //pbtpriv->BtEdcaUL = 0; + //pbtpriv->BtEdcaDL = 0; + + pbtpriv->BT_EDCA[UP_LINK] = 0; + pbtpriv->BT_EDCA[DOWN_LINK] = 0; + } + + // 20100415 Joseph: Set RF register 0x1E and 0x1F for BT coexist suggested by Yaying. + if(pbtpriv->BT_Service!=BT_Idle) + { + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf); + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, 0xf); + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf)); + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, 0xf); + } + else + { + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n",pbtpriv->BtRfRegOrigin1E); + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E); + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F)); + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F); + } + } + else + { + DBG_8192C("BT_IsolationHigh\n"); + // Do nothing. + } + } + else + { + + if(pbtpriv->BT_Ampdu && !pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Allow AMPDU bt is off\n"); + pmlmeinfo->bAcceptAddbaReq = _TRUE; + } + + DBG_8192C("BT_Turn OFF Coexist bt is off \n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", pbtpriv->BtRfRegOrigin1E); + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E); + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F)); + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F); + + // BT coexistence mechanism does not control EDCA parameter since BT is disabled. + //pbtpriv->BtEdcaUL = 0; + //pbtpriv->BtEdcaDL = 0; + pbtpriv->BT_EDCA[UP_LINK] = 0; + pbtpriv->BT_EDCA[DOWN_LINK] = 0; + + +// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3. +#if 0 + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + if(pMgntInfo->bUseRAMask) + { + // 20100407 Joseph: Fix rate adaptive modification for BT coexist. + // This fix is not complete yet. It shall also consider VWifi and Adhoc case, + // which connect with multiple STAs. + Adapter->HalFunc.UpdateHalRAMaskHandler( + Adapter, + FALSE, + 0, + NULL, + NULL, + pMgntInfo->RateAdaptive.RATRState, + RAMask_Normal); + } + else + { + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + } +#endif + } + } + } +} + +static void dm_InitBtCoexistDM( PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + + if( !pbtpriv->BT_Coexist ) return; + + pbtpriv->BtRfRegOrigin1E = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1e, 0xf0); + pbtpriv->BtRfRegOrigin1F = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1f, 0xf0); +} + +void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + + pbtpriv->bCOBT = bStart; + send_delba(padapter,0, get_my_bssid(&(pmlmeinfo->network))); + send_delba(padapter,1, get_my_bssid(&(pmlmeinfo->network))); + +} + +void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir) +{ + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + DBG_8192C("issue_delete_ba : %s...\n",(dir==0)?"RX_DIR":"TX_DIR"); + send_delba(padapter,dir, get_my_bssid(&(pmlmeinfo->network))); +} + +#endif + +#if 0//def CONFIG_PCI_HCI + +BOOLEAN +BT_BTStateChange( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + + u4Byte temp, Polling, Ratio_Tx, Ratio_PRI; + u4Byte BT_Tx, BT_PRI; + u1Byte BT_State; + static u1Byte ServiceTypeCnt = 0; + u1Byte CurServiceType; + static u1Byte LastServiceType = BT_Idle; + + if(!pMgntInfo->bMediaConnect) + return FALSE; + + BT_State = PlatformEFIORead1Byte(Adapter, 0x4fd); +/* + temp = PlatformEFIORead4Byte(Adapter, 0x488); + BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff)); + BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff)); + + temp = PlatformEFIORead4Byte(Adapter, 0x48c); + Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) + + ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff); + +*/ + BT_Tx = PlatformEFIORead4Byte(Adapter, 0x488); + + RTPRINT(FBT, BT_TRACE, ("Ratio 0x488 =%x\n", BT_Tx)); + BT_Tx =BT_Tx & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx)); + + BT_PRI = PlatformEFIORead4Byte(Adapter, 0x48c); + + RTPRINT(FBT, BT_TRACE, ("Ratio Ratio 0x48c =%x\n", BT_PRI)); + BT_PRI =BT_PRI & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI)); + + + Polling = PlatformEFIORead4Byte(Adapter, 0x490); + //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling)); + + + if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffffff && BT_State==0xff) + return FALSE; + + BT_State &= BIT0; + + if(BT_State != pHalData->bt_coexist.BT_CUR_State) + { + pHalData->bt_coexist.BT_CUR_State = BT_State; + + if(pMgntInfo->bRegBT_Sco == 3) + { + ServiceTypeCnt = 0; + + pHalData->bt_coexist.BT_Service = BT_Idle; + + RTPRINT(FBT, BT_TRACE, ("BT_%s\n", BT_State?"ON":"OFF")); + + BT_State = BT_State | + ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) |BIT2; + + PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State); + RTPRINT(FBT, BT_TRACE, ("BT set 0x4fd to %x\n", BT_State)); + } + + return TRUE; + } + RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco %d\n", pMgntInfo->bRegBT_Sco)); + + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; + + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); + + + if(BT_State && pMgntInfo->bRegBT_Sco==3) + { + RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco ==3 Follow Counter\n")); +// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff) +// { +// ServiceTypeCnt = 0; +// return FALSE; +// } +// else + { + /* + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; + + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); + + */ + if((Ratio_Tx <= 50) && (Ratio_PRI <= 50)) + CurServiceType = BT_Idle; + else if((Ratio_PRI > 150) && (Ratio_PRI < 200)) + CurServiceType = BT_SCO; + else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200)) + CurServiceType = BT_Busy; + else if(Ratio_Tx >= 350) + CurServiceType = BT_OtherBusy; + else + CurServiceType=BT_OtherAction; + + } +/* if(pHalData->bt_coexist.bStopCount) + { + ServiceTypeCnt=0; + pHalData->bt_coexist.bStopCount=FALSE; + } +*/ + if(CurServiceType == BT_OtherBusy) + { + ServiceTypeCnt=2; + LastServiceType=CurServiceType; + } + else if(CurServiceType == LastServiceType) + { + if(ServiceTypeCnt<3) + ServiceTypeCnt++; + } + else + { + ServiceTypeCnt = 0; + LastServiceType = CurServiceType; + } + + if(ServiceTypeCnt==2) + { + pHalData->bt_coexist.BT_Service = LastServiceType; + BT_State = BT_State | + ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) | + ((pHalData->bt_coexist.BT_Service==BT_SCO)?0:BIT2); + + if(pHalData->bt_coexist.BT_Service==BT_Busy) + BT_State&= ~(BIT2); + + if(pHalData->bt_coexist.BT_Service==BT_SCO) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_SCO\n")); + } + else if(pHalData->bt_coexist.BT_Service==BT_Idle) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Idle\n")); + } + else if(pHalData->bt_coexist.BT_Service==BT_OtherAction) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherAction\n")); + } + else if(pHalData->bt_coexist.BT_Service==BT_Busy) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Busy\n")); + } + else + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherBusy\n")); + } + + //Add interrupt migration when bt is not in idel state (no traffic). + //suggestion by Victor. + if(pHalData->bt_coexist.BT_Service!=BT_Idle) + { + + PlatformEFIOWrite2Byte(Adapter, 0x504, 0x0ccc); + PlatformEFIOWrite1Byte(Adapter, 0x506, 0x54); + PlatformEFIOWrite1Byte(Adapter, 0x507, 0x54); + + } + else + { + PlatformEFIOWrite1Byte(Adapter, 0x506, 0x00); + PlatformEFIOWrite1Byte(Adapter, 0x507, 0x00); + } + + PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State); + RTPRINT(FBT, BT_TRACE, ("BT_SCO set 0x4fd to %x\n", BT_State)); + return TRUE; + } + } + + return FALSE; + +} + +BOOLEAN +BT_WifiConnectChange( + IN PADAPTER Adapter + ) +{ + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + static BOOLEAN bMediaConnect = FALSE; + + if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo)) + { + bMediaConnect = FALSE; + } + else + { + if(!bMediaConnect) + { + bMediaConnect = TRUE; + return TRUE; + } + bMediaConnect = TRUE; + } + + return FALSE; +} + +BOOLEAN +BT_RSSIChangeWithAMPDU( + IN PADAPTER Adapter + ) +{ + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(!Adapter->pNdisCommon->bRegBT_Ampdu || !Adapter->pNdisCommon->bRegAcceptAddbaReq) + return FALSE; + + RTPRINT(FBT, BT_TRACE, ("RSSI is %d\n",pHalData->UndecoratedSmoothedPWDB)); + + if((pHalData->UndecoratedSmoothedPWDB<=32) && pMgntInfo->pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32 Need change\n")); + return TRUE; + + } + else if((pHalData->UndecoratedSmoothedPWDB>=40) && !pMgntInfo->pHTInfo->bAcceptAddbaReq ) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40, Need change\n")); + return TRUE; + } + else + return FALSE; + +} + + +VOID +dm_BTCoexist( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + static u1Byte LastTxPowerLvl = 0xff; + PRX_TS_RECORD pRxTs = NULL; + + BOOLEAN bWifiConnectChange, bBtStateChange,bRSSIChangeWithAMPDU; + + if( (pHalData->bt_coexist.BluetoothCoexist) && + (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) && + (!ACTING_AS_AP(Adapter)) ) + { + bWifiConnectChange = BT_WifiConnectChange(Adapter); + bBtStateChange = BT_BTStateChange(Adapter); + bRSSIChangeWithAMPDU = BT_RSSIChangeWithAMPDU(Adapter); + RTPRINT(FBT, BT_TRACE, ("bWifiConnectChange %d, bBtStateChange %d,LastTxPowerLvl %x, DynamicTxHighPowerLvl %x\n", + bWifiConnectChange,bBtStateChange,LastTxPowerLvl,pHalData->DynamicTxHighPowerLvl)); + if( bWifiConnectChange ||bBtStateChange || + (LastTxPowerLvl != pHalData->DynamicTxHighPowerLvl) ||bRSSIChangeWithAMPDU) + { + LastTxPowerLvl = pHalData->DynamicTxHighPowerLvl; + + if(pHalData->bt_coexist.BT_CUR_State) + { + // Do not allow receiving A-MPDU aggregation. + if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy)) + { + if(pHalData->UndecoratedSmoothedPWDB<=32) + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = FALSE; + if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE)) + TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR); + } + } + else if(pHalData->UndecoratedSmoothedPWDB>=40) + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; + } + } + } + else + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; + } + } + + if(pHalData->bt_coexist.BT_Ant_isolation) + { + RTPRINT(FBT, BT_TRACE, ("BT_IsolationLow\n")); + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + + if(pHalData->bt_coexist.BT_Service==BT_SCO) + { + + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist with SCO \n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); + } + else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) + { + RTPRINT(FBT, BT_TRACE, ("BT_Turn ON Coexist\n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0xb4); + } + else + { + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist\n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); + } + } + else + { + RTPRINT(FBT, BT_TRACE, ("BT_IsolationHigh\n")); + // Do nothing. + } + } + else + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU bt is off\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; + } + + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist bt is off \n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); + + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + } + } + } +} +#endif + + +/*----------------------------------------------------------------------------- + * Function: dm_CheckRfCtrlGPIO() + * + * Overview: Copy 8187B template for 9xseries. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/10/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +dm_CheckRfCtrlGPIO( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) + #ifdef CONFIG_USB_HCI + // 2010/08/12 MH Add for CU selective suspend. + PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(Adapter); + #else + PRT_SDIO_DEVICE pDevice = GET_RT_SDIO_DEVICE(Adapter); + #endif +#endif + + if(!Adapter->MgntInfo.PowerSaveControl.bGpioRfSw) + return; + + RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n")); + +#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) + // Walk around for DTM test, we will not enable HW - radio on/off because r/w + // page 1 register before Lextra bus is enabled cause system fails when resuming + // from S4. 20080218, Emily + if(Adapter->bInHctTest) + return; + +//#if ((HAL_CODE_BASE == RTL8192_S) ) + //Adapter->HalFunc.GPIOChangeRFHandler(Adapter, GPIORF_POLLING); +//#else + // 2010/07/27 MH Only Minicard and support selective suspend, we can not turn off all MAC power to + // stop 8051. For dongle and minicard, we both support selective suspend mode. + //if(pDevice->RegUsbSS && Adapter->HalFunc.GetInterfaceSelectionHandler(Adapter) == INTF_SEL2_MINICARD) + + // + // 2010/08/12 MH We support severl power consumption combination as below. + // + // Power consumption combination + // SS Enable: (LPS disable + IPS + SW/HW radio off) + // 1. Dongle + PDN (support HW radio off) + // 2. Dongle + Normal (No HW radio off) + // 3. MiniCard + PDN (support HW radio off) + // 4. MiniCard + Normal (support HW radio off) + // + // SS Disable: (LPS + IPS + SW/HW radio off) + // 1. Dongle + PDN (support HW radio off) + // 2. Dongle + Normal (No HW radio off) + // 3. MiniCard + PDN (support HW radio off) + // 4. MiniCard + Normal (support HW radio off) + // + // For Power down module detection. We need to read power register no matter + // dongle or minicard, we will add the item is the detection method. + // + // + //vivi add du case + if ((IS_HARDWARE_TYPE_8192CU(Adapter)||IS_HARDWARE_TYPE_8192DU(Adapter)) + && pDevice->RegUsbSS) + { + RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Enabled\n")); + if (SUPPORT_HW_RADIO_DETECT(Adapter)) + { // Support HW radio detection + RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n")); + GpioDetectTimerStart(Adapter); + } + else + { // Dongle does not support HW radio detection.?? In the fufure?? + RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n")); + } + } + else if (IS_HARDWARE_TYPE_8192CU(Adapter) || + IS_HARDWARE_TYPE_8723U(Adapter)|| + IS_HARDWARE_TYPE_8192DU(Adapter) || + IS_HARDWARE_TYPE_8723S(Adapter)) + { // Not support Selective suspend + RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Disable\n")); + if (SUPPORT_HW_RADIO_DETECT(Adapter)) + { + RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n")); + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); + } + else + { + RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n")); + } + } + else + { // CE only support noemal HW radio detection now. Support timers GPIO detection in SE/CU. + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); + } +//#endif +#else if defined CONFIG_PCI_HCI + if(Adapter->bInHctTest) + return; + + // CE only support noemal HW radio detection now. We support timers GPIO detection in SE. + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); +#endif +#endif +} /* dm_CheckRfCtrlGPIO */ + +static VOID +dm_InitRateAdaptiveMask( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pdmpriv->RateAdaptive; + + pRA->RATRState = DM_RATR_STA_INIT; + pRA->PreRATRState = DM_RATR_STA_INIT; + + if (pdmpriv->DM_Type == DM_Type_ByDriver) + pdmpriv->bUseRAMask = _TRUE; + else + pdmpriv->bUseRAMask = _FALSE; +} + +/*----------------------------------------------------------------------------- + * Function: dm_RefreshRateAdaptiveMask() + * + * Overview: Update rate table mask according to rssi + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 05/27/2009 hpfan Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +dm_RefreshRateAdaptiveMask( IN PADAPTER pAdapter) +{ +#if 0 + PADAPTER pTargetAdapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMGNT_INFO pMgntInfo = &(ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, TRUE)->MgntInfo); + PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pMgntInfo->RateAdaptive; + u4Byte LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0; + + if(pAdapter->bDriverStopped) + { + RT_TRACE(COMP_RATR, DBG_TRACE, ("<---- dm_RefreshRateAdaptiveMask(): driver is going to unload\n")); + return; + } + + if(!pMgntInfo->bUseRAMask) + { + RT_TRACE(COMP_RATR, DBG_LOUD, ("<---- dm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n")); + return; + } + + // if default port is connected, update RA table for default port (infrastructure mode only) + if(pAdapter->MgntInfo.mAssoc && (!ACTING_AS_AP(pAdapter))) + { + + // decide rastate according to rssi + switch (pRA->PreRATRState) + { + case DM_RATR_STA_HIGH: + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + break; + + case DM_RATR_STA_MIDDLE: + HighRSSIThreshForRA = 55; + LowRSSIThreshForRA = 20; + break; + + case DM_RATR_STA_LOW: + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 25; + break; + + default: + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + break; + } + + if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA) + pRA->RATRState = DM_RATR_STA_HIGH; + else if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA) + pRA->RATRState = DM_RATR_STA_MIDDLE; + else + pRA->RATRState = DM_RATR_STA_LOW; + + if(pRA->PreRATRState != pRA->RATRState) + { + RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pHalData->UndecoratedSmoothedPWDB)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pRA->RATRState)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pRA->PreRATRState, pRA->RATRState)); + pAdapter->HalFunc.UpdateHalRAMaskHandler( + pAdapter, + FALSE, + 0, + NULL, + NULL, + pRA->RATRState); + pRA->PreRATRState = pRA->RATRState; + } + } + + // + // The following part configure AP/VWifi/IBSS rate adaptive mask. + // + if(ACTING_AS_AP(pAdapter) || ACTING_AS_IBSS(pAdapter)) + { + pTargetAdapter = pAdapter; + } + else + { + pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, FALSE); + if(!ACTING_AS_AP(pTargetAdapter)) + pTargetAdapter = NULL; + } + + // if extension port (softap) is started, updaet RA table for more than one clients associate + if(pTargetAdapter != NULL) + { + int i; + PRT_WLAN_STA pEntry; + PRATE_ADAPTIVE pEntryRA; + + for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++) + { + if( pTargetAdapter->MgntInfo.AsocEntry[i].bUsed && pTargetAdapter->MgntInfo.AsocEntry[i].bAssociated) + { + pEntry = pTargetAdapter->MgntInfo.AsocEntry+i; + pEntryRA = &pEntry->RateAdaptive; + + switch (pEntryRA->PreRATRState) + { + case DM_RATR_STA_HIGH: + { + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + } + break; + + case DM_RATR_STA_MIDDLE: + { + HighRSSIThreshForRA = 55; + LowRSSIThreshForRA = 20; + } + break; + + case DM_RATR_STA_LOW: + { + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 25; + } + break; + + default: + { + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + } + } + + if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA) + pEntryRA->RATRState = DM_RATR_STA_HIGH; + else if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA) + pEntryRA->RATRState = DM_RATR_STA_MIDDLE; + else + pEntryRA->RATRState = DM_RATR_STA_LOW; + + if(pEntryRA->PreRATRState != pEntryRA->RATRState) + { + RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("AsocEntry addr : "), pEntry->MacAddr); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pEntryRA->RATRState)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pEntryRA->PreRATRState, pEntryRA->RATRState)); + pAdapter->HalFunc.UpdateHalRAMaskHandler( + pTargetAdapter, + FALSE, + pEntry->AID+1, + pEntry->MacAddr, + pEntry, + pEntryRA->RATRState); + pEntryRA->PreRATRState = pEntryRA->RATRState; + } + + } + } + } +#endif +} + +static VOID +dm_CheckProtection( + IN PADAPTER Adapter + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u1Byte CurRate, RateThreshold; + + if(pMgntInfo->pHTInfo->bCurBW40MHz) + RateThreshold = MGN_MCS1; + else + RateThreshold = MGN_MCS3; + + if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) + { + pMgntInfo->bDmDisableProtect = TRUE; + DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } + else + { + pMgntInfo->bDmDisableProtect = FALSE; + DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } +#endif +} + +static VOID +dm_CheckStatistics( + IN PADAPTER Adapter + ) +{ +#if 0 + if(!Adapter->MgntInfo.bMediaConnect) + return; + + //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly. + Adapter->HalFunc.GetHwRegHandler( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) ); + + // Calculate current Tx Rate(Successful transmited!!) + + // Calculate current Rx Rate(Successful received!!) + + //for tx tx retry count + Adapter->HalFunc.GetHwRegHandler( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) ); +#endif +} + +static void dm_CheckPbcGPIO(_adapter *padapter) +{ + u8 tmp1byte; + u8 bPbcPressed = _FALSE; + + if(!padapter->registrypriv.hw_wps_pbc) + return; + +#ifdef CONFIG_USB_HCI + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode + + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level + + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode + + tmp1byte =rtw_read8(padapter, GPIO_IN); + + if (tmp1byte == 0xff) + return ; + +#if 0 /* NO PBC button here */ + if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT) + { + bPbcPressed = _TRUE; + } +#endif + +#else + tmp1byte = rtw_read8(padapter, GPIO_IN); + //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte)); + + if (tmp1byte == 0xff || padapter->init_adpt_in_progress) + return ; + + if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0) + { + bPbcPressed = _TRUE; + } +#endif + + if( _TRUE == bPbcPressed) + { + // Here we only set bPbcPressed to true + // After trigger PBC, the variable will be set to false + DBG_8192C("CheckPbcGPIO - PBC is pressed\n"); + +#ifdef RTK_DMP_PLATFORM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC); +#else + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC); +#endif +#else + + if ( padapter->pid[0] == 0 ) + { // 0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver. + return; + } + +#ifdef PLATFORM_LINUX + rtw_signal_process(padapter->pid[0], SIGUSR1); +#endif +#endif + } +} + +#ifdef CONFIG_PCI_HCI +// +// Description: +// Perform interrupt migration dynamically to reduce CPU utilization. +// +// Assumption: +// 1. Do not enable migration under WIFI test. +// +// Created by Roger, 2010.03.05. +// +VOID +dm_InterruptMigration( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bCurrentIntMt, bCurrentACIntDisable; + BOOLEAN IntMtToSet = _FALSE; + BOOLEAN ACIntToSet = _FALSE; + + + // Retrieve current interrupt migration and Tx four ACs IMR settings first. + bCurrentIntMt = pHalData->bInterruptMigration; + bCurrentACIntDisable = pHalData->bDisableTxInt; + + // + // Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics + // when interrupt migration is set before. 2010.03.05. + // + if(!Adapter->registrypriv.wifi_spec && + (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) + { + IntMtToSet = _TRUE; + + // To check whether we should disable Tx interrupt or not. + if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic ) + ACIntToSet = _TRUE; + } + + //Update current settings. + if( bCurrentIntMt != IntMtToSet ){ + DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet); + if(IntMtToSet) + { + // + // Set interrrupt migration timer and corresponging Tx/Rx counter. + // timer 25ns*0xfa0=100us for 0xf packets. + // 2010.03.05. + // + rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx + pHalData->bInterruptMigration = IntMtToSet; + } + else + { + // Reset all interrupt migration settings. + rtw_write32(Adapter, REG_INT_MIG, 0); + pHalData->bInterruptMigration = IntMtToSet; + } + } + + /*if( bCurrentACIntDisable != ACIntToSet ){ + DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet); + if(ACIntToSet) // Disable four ACs interrupts. + { + // + // Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. + // When extremely highly Rx OK occurs, we will disable Tx interrupts. + // 2010.03.05. + // + UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS ); + pHalData->bDisableTxInt = ACIntToSet; + } + else// Enable four ACs interrupts. + { + UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 ); + pHalData->bDisableTxInt = ACIntToSet; + } + }*/ + +} + +#endif + +// +// Initialize GPIO setting registers +// +static void +dm_InitGPIOSetting( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u8 tmp1byte; + + tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); + tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); + +#ifdef CONFIG_BT_COEXIST + // UMB-B cut bug. We need to support the modification. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && + pHalData->bt_coexist.BT_Coexist) + { + tmp1byte |= (BIT5); + } +#endif + rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); + +} + +static void update_EDCA_param(_adapter *padapter) +{ + u32 trafficIndex; + u32 edca_param; + u64 cur_tx_bytes = 0; + u64 cur_rx_bytes = 0; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct recv_priv *precvpriv = &(padapter->recvpriv); + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + u8 bbtchange = _FALSE; +#endif + + + //DBG_871X("%s\n", __FUNCTION__); + + //associated AP + if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)) + { + return; + } + + if (pmlmeinfo->assoc_AP_vendor >= maxAP) + { + return; + } + + cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes; + cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes; + + //traffic, TX or RX + if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP)) + { + if (cur_tx_bytes > (cur_rx_bytes << 2)) + { // Uplink TP is present. + trafficIndex = UP_LINK; + } + else + { // Balance TP is present. + trafficIndex = DOWN_LINK; + } + } + else + { + if (cur_rx_bytes > (cur_tx_bytes << 2)) + { // Downlink TP is present. + trafficIndex = DOWN_LINK; + } + else + { // Balance TP is present. + trafficIndex = UP_LINK; + } + } + +#ifdef CONFIG_BT_COEXIST + if(pbtpriv->BT_Coexist) + { + if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0)) + { + bbtchange = _TRUE; + } + } +#endif + + if (pdmpriv->prv_traffic_idx != trafficIndex) + { +#if 0 +#ifdef CONFIG_BT_COEXIST + if(_TRUE == bbtchange) + rtw_write32(padapter, REG_EDCA_BE_PARAM, pbtpriv->BT_EDCA[trafficIndex]); + else +#endif + //adjust EDCA parameter for BE queue + //fire_write_MAC_cmd(padapter, EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]); + rtw_write32(padapter, REG_EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]); + +#else + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) + { + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; + } + else if((pmlmeinfo->assoc_AP_vendor == airgocapAP) && + ((pmlmeext->cur_wireless_mode == WIRELESS_11G) ||(pmlmeext->cur_wireless_mode == WIRELESS_11BG))) + { + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; + } + else + { + edca_param = EDCAParam[unknownAP][trafficIndex]; + } + +#ifdef CONFIG_BT_COEXIST + if(_TRUE == bbtchange) + edca_param = pbtpriv->BT_EDCA[trafficIndex]; +#endif + + rtw_write32(padapter, REG_EDCA_BE_PARAM, edca_param); +#endif + pdmpriv->prv_traffic_idx = trafficIndex; + } + +//exit_update_EDCA_param: + + pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes; + precvpriv->last_rx_bytes = precvpriv->rx_bytes; + + return; +} + +static void dm_InitDynamicBBPowerSaving( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + pPSTable->PreCCAState = CCA_MAX; + pPSTable->CurCCAState = CCA_MAX; + pPSTable->PreRFState = RF_MAX; + pPSTable->CurRFState = RF_MAX; + pPSTable->Rssi_val_min = 0; +} + +static void dm_1R_CCA( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + if(pPSTable->Rssi_val_min != 0) + { + if(pPSTable->PreCCAState == CCA_2R) + { + if(pPSTable->Rssi_val_min >= 35) + pPSTable->CurCCAState = CCA_1R; + else + pPSTable->CurCCAState = CCA_2R; + } + else{ + if(pPSTable->Rssi_val_min <= 30) + pPSTable->CurCCAState = CCA_2R; + else + pPSTable->CurCCAState = CCA_1R; + } + } + else + pPSTable->CurCCAState=CCA_MAX; + + if(pPSTable->PreCCAState != pPSTable->CurCCAState) + { + if(pPSTable->CurCCAState == CCA_1R) + { + if(pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x13); + PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20); + } + else + { + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x23); + PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100 + } + } + else + { + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x33); + PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63); + } + pPSTable->PreCCAState = pPSTable->CurCCAState; + } + //DBG_8192C("dm_1R_CCA(): CCAStage=%x\n", pPSTable->CurCCAState); +} + +void +rtl8192c_dm_RF_Saving( + IN PADAPTER pAdapter, + IN u8 bForceInNormal + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + if(pdmpriv->initialize == 0){ + pdmpriv->rf_saving_Reg874 = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord)&0x1CC000)>>14; + pdmpriv->rf_saving_RegC70 = (PHY_QueryBBReg(pAdapter, rOFDM0_AGCParameter1, bMaskDWord)&BIT3)>>3; + pdmpriv->rf_saving_Reg85C = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_SwitchControl, bMaskDWord)&0xFF000000)>>24; + pdmpriv->rf_saving_RegA74 = (PHY_QueryBBReg(pAdapter, 0xa74, bMaskDWord)&0xF000)>>12; + //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord); + pdmpriv->initialize = 1; + } + + if(!bForceInNormal) + { + if(pPSTable->Rssi_val_min != 0) + { + + if(pPSTable->PreRFState == RF_Normal) + { + #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + if(pPSTable->Rssi_val_min >= 50) + #else + if(pPSTable->Rssi_val_min >= 30) + #endif + pPSTable->CurRFState = RF_Save; + else + pPSTable->CurRFState = RF_Normal; + } + else{ + #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + if(pPSTable->Rssi_val_min <= 45) + #else + if(pPSTable->Rssi_val_min <= 25) + #endif + pPSTable->CurRFState = RF_Normal; + else + pPSTable->CurRFState = RF_Save; + } + } + else + pPSTable->CurRFState=RF_MAX; + } + else + { + pPSTable->CurRFState = RF_Normal; + } + + if(pPSTable->PreRFState != pPSTable->CurRFState) + { + if(pPSTable->CurRFState == RF_Save) + { + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1C0000, 0x2); //Reg874[20:18]=3'b010 + PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, 0); //RegC70[3]=1'b0 + PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, 0x63); //Reg85C[31:24]=0x63 + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, 0xC000, 0x2); //Reg874[15:14]=2'b10 + PHY_SetBBReg(pAdapter, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3 + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0); //Reg818[28]=1'b0 + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x1); //Reg818[28]=1'b1 + //DBG_8192C("%s(): RF_Save\n", __FUNCTION__); + } + else + { + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1CC000, pdmpriv->rf_saving_Reg874); + PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, pdmpriv->rf_saving_RegC70); + PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, pdmpriv->rf_saving_Reg85C); + PHY_SetBBReg(pAdapter, 0xa74, 0xF000, pdmpriv->rf_saving_RegA74); + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0); + //DBG_8192C("%s(): RF_Normal\n", __FUNCTION__); + } + pPSTable->PreRFState = pPSTable->CurRFState; + } +} + +static void +dm_DynamicBBPowerSaving( +IN PADAPTER pAdapter + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + //1 1.Determine the minimum RSSI + if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) && + (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)) + { + pPSTable->Rssi_val_min = 0; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n")); + } + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port + { + //if(ACTING_AS_AP(pAdapter) || pMgntInfo->mIbss) + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) //todo: AP Mode + { + pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); + } + else + { + pPSTable->Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); + } + } + else // associated entry pwdb + { + pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); + } + + //1 2.Power Saving for 92C + if(IS_92C_SERIAL(pHalData->VersionID)) + { + //dm_1R_CCA(pAdapter); + } + + // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable. + // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns to 600ns. + //1 3.Power Saving for 88C + else + { + rtl8192c_dm_RF_Saving(pAdapter, _FALSE); + } +} + + +#ifdef CONFIG_ANTENNA_DIVERSITY +// Add new function to reset the state of antenna diversity before link. +// +void SwAntDivResetBeforeLink8192C(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + pDM_SWAT_Table->SWAS_NoLink_State = 0; +} + +// Compare RSSI for deciding antenna +void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if((0 != pHalData->AntDivCfg) && (!IS_92C_SERIAL(pHalData->VersionID)) ) + { + //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi), + // src->Rssi,query_rx_pwr_percentage(src->Rssi)); + //select optimum_antenna for before linked =>For antenna diversity + if(dst->Rssi >= src->Rssi )//keep org parameter + { + src->Rssi = dst->Rssi; + src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; + } + } +} + +// Add new function to reset the state of antenna diversity before link. +u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + // Condition that does not need to use antenna diversity. + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) + { + //DBG_8192C("SwAntDivBeforeLink8192C(): No AntDiv Mechanism.\n"); + return _FALSE; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + pDM_SWAT_Table->SWAS_NoLink_State = 0; + return _FALSE; + } + // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF. +/* + if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect) + { + + + RT_TRACE(COMP_SWAS, DBG_LOUD, + ("SwAntDivCheckBeforeLink8192C(): RFChangeInProgress(%x), eRFPowerState(%x)\n", + pMgntInfo->RFChangeInProgress, + pHalData->eRFPowerState)); + + pDM_SWAT_Table->SWAS_NoLink_State = 0; + + return FALSE; + } +*/ + + if(pDM_SWAT_Table->SWAS_NoLink_State == 0){ + //switch channel + pDM_SWAT_Table->SWAS_NoLink_State = 1; + pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A; + + //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna); + rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE); + //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"); + return _TRUE; + } + else + { + pDM_SWAT_Table->SWAS_NoLink_State = 0; + return _FALSE; + } + + + +} +#endif +#ifdef CONFIG_SW_ANTENNA_DIVERSITY +// +// 20100514 Luke/Joseph: +// Add new function to reset antenna diversity state after link. +// +void +SwAntDivRestAfterLink8192C( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) + return; + + //DBG_8192C("======> SwAntDivRestAfterLink <========== \n"); + pHalData->RSSI_cnt_A= 0; + pHalData->RSSI_cnt_B= 0; + pHalData->RSSI_test = _FALSE; + + pDM_SWAT_Table->try_flag = 0xff; + pDM_SWAT_Table->RSSI_Trying = 0; + pDM_SWAT_Table->SelectAntennaMap=0xAA; + pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna; + pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna; + + pdmpriv->lastTxOkCnt=0; + pdmpriv->lastRxOkCnt=0; + + pdmpriv->TXByteCnt_A=0; + pdmpriv->TXByteCnt_B=0; + pdmpriv->RXByteCnt_A=0; + pdmpriv->RXByteCnt_B=0; + pdmpriv->DoubleComfirm=0; + pdmpriv->TrafficLoad = TRAFFIC_LOW; + +} + + +// +// 20100514 Luke/Joseph: +// Add new function for antenna diversity after link. +// This is the main function of antenna diversity after link. +// This function is called in HalDmWatchDog() and dm_SW_AntennaSwitchCallback(). +// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test. +// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing. +// After 500ms, dm_SW_AntennaSwitchCallback() calls this function to compare the signal just +// listened on the air with the RSSI of original antenna. +// It chooses the antenna with better RSSI. +// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting +// penalty to get next try. +// +static VOID +dm_SW_AntennaSwitch( + PADAPTER Adapter, + u8 Step +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + s32 curRSSI=100, RSSI_A, RSSI_B; + u64 curTxOkCnt, curRxOkCnt; + u64 CurByteCnt = 0, PreByteCnt = 0; + u8 nextAntenna = 0; + u8 Score_A=0, Score_B=0; + u8 i; + + // Condition that does not need to use antenna diversity. + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) + { + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No AntDiv Mechanism.\n")); + return; + } + // If dynamic ant_div is disabled. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_ANT_DIV) ) + { + return; + } + + if (check_fwstate(&Adapter->mlmepriv, _FW_LINKED) ==_FALSE) + return; +#if 0 //to do + // Radio off: Status reset to default and return. + if(pHalData->eRFPowerState==eRfOff) + { + SwAntDivRestAfterLink(Adapter); + return; + } +#endif + //DBG_8192C("\n............................ %s.........................\n",__FUNCTION__); + // Handling step mismatch condition. + // Peak step is not finished at last time. Recover the variable and check again. + if( Step != pDM_SWAT_Table->try_flag ) + { + SwAntDivRestAfterLink8192C(Adapter); + } + + + if(pDM_SWAT_Table->try_flag == 0xff) + { +#if 0 + // Select RSSI checking target + if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter)) + { + // Target: Infrastructure mode AP. + pHalData->RSSI_target = NULL; + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is DEF AP!\n")); + } + else + { + u8 index = 0; + PRT_WLAN_STA pEntry = NULL; + PADAPTER pTargetAdapter = NULL; + + if( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) ) + { + // Target: AP/IBSS peer. + pTargetAdapter = Adapter; + } + else if(ACTING_AS_AP(ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE))) + { + // Target: VWIFI peer. + pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE); + } + + if(pTargetAdapter != NULL) + { + for(index=0; indexbAssociated) + break; + } + } + } + + if(pEntry == NULL) + { + SwAntDivRestAfterLink(Adapter); + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No Link.\n")); + return; + } + else + { + pHalData->RSSI_target = pEntry; + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is PEER STA\n")); + } + } + + +#endif + + pHalData->RSSI_cnt_A= 0; + pHalData->RSSI_cnt_B= 0; + pDM_SWAT_Table->try_flag = 0; + // DBG_8192C("dm_SW_AntennaSwitch(): Set try_flag to 0 prepare for peak!\n"); + return; + } + else + { + curTxOkCnt = Adapter->xmitpriv.tx_bytes - pdmpriv->lastTxOkCnt; + curRxOkCnt = Adapter->recvpriv.rx_bytes - pdmpriv->lastRxOkCnt; + + pdmpriv->lastTxOkCnt = Adapter->xmitpriv.tx_bytes ; + pdmpriv->lastRxOkCnt = Adapter->recvpriv.rx_bytes ; + + if(pDM_SWAT_Table->try_flag == 1) + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + { + pdmpriv->TXByteCnt_A += curTxOkCnt; + pdmpriv->RXByteCnt_A += curRxOkCnt; + //DBG_8192C("##### TXByteCnt_A(%lld) , RXByteCnt_A(%lld) ####\n",pdmpriv->TXByteCnt_A,pdmpriv->RXByteCnt_A); + } + else + { + pdmpriv->TXByteCnt_B += curTxOkCnt; + pdmpriv->RXByteCnt_B += curRxOkCnt; + //DBG_8192C("##### TXByteCnt_B(%lld) , RXByteCnt_B(%lld) ####\n",pdmpriv->TXByteCnt_B,pdmpriv->RXByteCnt_B); + } + + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; + pDM_SWAT_Table->RSSI_Trying--; + //DBG_8192C("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying); + + if(pDM_SWAT_Table->RSSI_Trying == 0) + { + CurByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A) : (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B); + PreByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B) : (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A); + + //DBG_8192C("CurByteCnt = %lld\n", CurByteCnt); + //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt); + + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + { + PreByteCnt = PreByteCnt*9; //normalize:Cur=90ms:Pre=10ms + } + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + { + //CurByteCnt = CurByteCnt/2; + CurByteCnt = CurByteCnt>>1;//normalize:100ms:50ms + } + + + //DBG_8192C("After DIV=>CurByteCnt = %lld\n", CurByteCnt); + //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt); + + if(pHalData->RSSI_cnt_A > 0) + RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; + else + RSSI_A = 0; + if(pHalData->RSSI_cnt_B > 0) + RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; + else + RSSI_B = 0; + + curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B; + pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_B : RSSI_A; + //DBG_8192C("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI); + //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n", + //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")); + //DBG_8192C("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n", + //RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B); + } + + } + else + { + + if(pHalData->RSSI_cnt_A > 0) + RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; + else + RSSI_A = 0; + if(pHalData->RSSI_cnt_B > 0) + RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; + else + RSSI_B = 0; + curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B; + pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == Antenna_A)? RSSI_A : RSSI_B; + //DBG_8192C("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI); + //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n", + //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")); + + //DBG_8192C("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n", + // RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B); + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt)); + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt)); + } + + //1 Trying State + if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0)) + { + + if(pDM_SWAT_Table->TestMode == TP_MODE) + { + //DBG_8192C("SWAS: TestMode = TP_MODE\n"); + //DBG_8192C("TRY:CurByteCnt = %lld\n", CurByteCnt); + //DBG_8192C("TRY:PreByteCnt = %lld\n",PreByteCnt); + if(CurByteCnt < PreByteCnt) + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1; + else + pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1; + } + else + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1; + else + pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1; + } + for (i= 0; i<8; i++) + { + if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1) + Score_A++; + else + Score_B++; + } + //DBG_8192C("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap); + //DBG_8192C("Score_A=%d, Score_B=%d\n", Score_A, Score_B); + + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + { + nextAntenna = (Score_A > Score_B)?Antenna_A:Antenna_B; + } + else + { + nextAntenna = (Score_B > Score_A)?Antenna_B:Antenna_A; + } + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B")); + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n", + //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B"))); + + if(nextAntenna != pDM_SWAT_Table->CurAntenna) + { + //DBG_8192C("SWAS: Switch back to another antenna\n"); + } + else + { + //DBG_8192C("SWAS: current anntena is good\n"); + } + } + + if(pDM_SWAT_Table->TestMode == RSSI_MODE) + { + //DBG_8192C("SWAS: TestMode = RSSI_MODE\n"); + pDM_SWAT_Table->SelectAntennaMap=0xAA; + if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna + { + //DBG_8192C("SWAS: Switch back to another antenna\n"); + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; + } + else // current anntena is good + { + nextAntenna = pDM_SWAT_Table->CurAntenna; + //DBG_8192C("SWAS: current anntena is good\n"); + } + } + pDM_SWAT_Table->try_flag = 0; + pHalData->RSSI_test = _FALSE; + pHalData->RSSI_sum_A = 0; + pHalData->RSSI_cnt_A = 0; + pHalData->RSSI_sum_B = 0; + pHalData->RSSI_cnt_B = 0; + pdmpriv->TXByteCnt_A = 0; + pdmpriv->TXByteCnt_B = 0; + pdmpriv->RXByteCnt_A = 0; + pdmpriv->RXByteCnt_B = 0; + + } + + //1 Normal State + else if(pDM_SWAT_Table->try_flag == 0) + { + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + { + if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000) + pdmpriv->TrafficLoad = TRAFFIC_HIGH; + else + pdmpriv->TrafficLoad = TRAFFIC_LOW; + } + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + { + if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000) + pdmpriv->TrafficLoad = TRAFFIC_HIGH; + else + pdmpriv->TrafficLoad = TRAFFIC_LOW; + } + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + pDM_SWAT_Table->bTriggerAntennaSwitch = 0; + //DBG_8192C("Normal:TrafficLoad = %lld\n", curTxOkCnt+curRxOkCnt); + + //Prepare To Try Antenna + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; + pDM_SWAT_Table->try_flag = 1; + pHalData->RSSI_test = _TRUE; + if((curRxOkCnt+curTxOkCnt) > 1000) + { + pDM_SWAT_Table->RSSI_Trying = 4; + pDM_SWAT_Table->TestMode = TP_MODE; + } + else + { + pDM_SWAT_Table->RSSI_Trying = 2; + pDM_SWAT_Table->TestMode = RSSI_MODE; + + } + //DBG_8192C("SWAS: Normal State -> Begin Trying! TestMode=%s\n",(pDM_SWAT_Table->TestMode == TP_MODE)?"TP":"RSSI"); + + + pHalData->RSSI_sum_A = 0; + pHalData->RSSI_cnt_A = 0; + pHalData->RSSI_sum_B = 0; + pHalData->RSSI_cnt_B = 0; + } + } + + //1 4.Change TRX antenna + if(nextAntenna != pDM_SWAT_Table->CurAntenna) + { + //DBG_8192C("@@@@@@@@ SWAS: Change TX Antenna!\n "); + rtw_antenna_select_cmd(Adapter, nextAntenna, 1); + } + + //1 5.Reset Statistics + pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna; + pDM_SWAT_Table->CurAntenna = nextAntenna; + pDM_SWAT_Table->PreRSSI = curRSSI; + + + //1 6.Set next timer + + if(pDM_SWAT_Table->RSSI_Trying == 0) + return; + + if(pDM_SWAT_Table->RSSI_Trying%2 == 0) + { + if(pDM_SWAT_Table->TestMode == TP_MODE) + { + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer,10 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"); + } + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer, 50 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"); + } + } + else + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer, 500 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"); + } + } + else + { + if(pDM_SWAT_Table->TestMode == TP_MODE) + { + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + _set_timer(&pdmpriv->SwAntennaSwitchTimer,90 ); //ms + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + _set_timer(&pdmpriv->SwAntennaSwitchTimer,100 ); //ms + } + else + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer,500 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"); + } + } + +// RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: -----The End-----\n ")); + +} + +// +// 20100514 Luke/Joseph: +// Callback function for 500ms antenna test trying. +// +static void dm_SW_AntennaSwitchCallback(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + + if(padapter->net_closed == _TRUE) + return; + // Only + dm_SW_AntennaSwitch(padapter, SWAW_STEP_DETERMINE); +} + + +// +// 20100722 +// This function is used to gather the RSSI information for antenna testing. +// It selects the RSSI of the peer STA that we want to know. +// +void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) + return; + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + { + pHalData->RSSI_sum_A += RxPWDBAll; + pHalData->RSSI_cnt_A++; + } + else + { + pHalData->RSSI_sum_B+= RxPWDBAll; + pHalData->RSSI_cnt_B++; + + } + //DBG_8192C("%s Ant_(%s),RSSI_sum(%d),RSSI_cnt(%d)\n",__FUNCTION__,(2==pHalData->CurAntenna)?"A":"B",pHalData->RSSI_sum,pHalData->RSSI_cnt); + } + +} + + + +static VOID +dm_SW_AntennaSwitchInit( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + pHalData->RSSI_sum_A = 0; + pHalData->RSSI_sum_B = 0; + pHalData->RSSI_cnt_A = 0; + pHalData->RSSI_cnt_B = 0; + + pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna; + pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna; + pDM_SWAT_Table->try_flag = 0xff; + pDM_SWAT_Table->PreRSSI = 0; + pDM_SWAT_Table->bTriggerAntennaSwitch = 0; + pDM_SWAT_Table->SelectAntennaMap=0xAA; + + // Move the timer initialization to InitializeVariables function. + //PlatformInitializeTimer(Adapter, &pMgntInfo->SwAntennaSwitchTimer, (RT_TIMER_CALL_BACK)dm_SW_AntennaSwitchCallback, NULL, "SwAntennaSwitchTimer"); +} + +#endif + +//#define RSSI_CCK 0 +//#define RSSI_OFDM 1 +static void dm_RSSIMonitorInit( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + pdmpriv->OFDM_Pkt_Cnt = 0; + pdmpriv->RSSI_Select = RSSI_CCK; +} + +static void dm_RSSIMonitorCheck( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + if(pdmpriv->OFDM_Pkt_Cnt == 0) + pdmpriv->RSSI_Select = RSSI_CCK; + else + pdmpriv->RSSI_Select = RSSI_OFDM; + + pdmpriv->OFDM_Pkt_Cnt = 0; + //DBG_8192C("RSSI_Select=%s OFDM_Pkt_Cnt(%d)\n", + //(pdmpriv->RSSI_Select == RSSI_OFDM)?"RSSI_OFDM":"RSSI_CCK", + //pdmpriv->OFDM_Pkt_Cnt); +} + +//============================================================ +// functions +//============================================================ +void rtl8192c_init_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , dm_SW_AntennaSwitchCallback, Adapter); +#endif +} + +void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer); +#endif +} +#ifdef CONFIG_HW_ANTENNA_DIVERSITY +void dm_InitHybridAntDiv(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) + return; + + //Set OFDM HW RX Antenna Diversity + PHY_SetBBReg(Adapter,0xc50, BIT7, 1); //Enable Hardware antenna switch + PHY_SetBBReg(Adapter,0x870, BIT9|BIT8, 0); //Enable hardware control of "ANT_SEL" & "ANT_SELB" + PHY_SetBBReg(Adapter,0xCA4, BIT11, 0); //Switch to another antenna by checking pwdb threshold + PHY_SetBBReg(Adapter,0xCA4, 0x7FF, 0x080); //Pwdb threshold=8dB + PHY_SetBBReg(Adapter,0xC54, BIT23, 1); //Decide final antenna by comparing 2 antennas' pwdb + PHY_SetBBReg(Adapter,0x874, BIT23, 0); //No update ANTSEL during GNT_BT=1 + PHY_SetBBReg(Adapter,0x80C, BIT21, 1); //TX atenna selection from tx_info + //Set CCK HW RX Antenna Diversity + PHY_SetBBReg(Adapter,0xA00, BIT15, 1);//Enable antenna diversity + PHY_SetBBReg(Adapter,0xA0C, BIT4, 0); //Antenna diversity decision period = 32 sample + PHY_SetBBReg(Adapter,0xA0C, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4 + PHY_SetBBReg(Adapter,0xA10, BIT13, 1); //polarity ana_A=1 and ana_B=0 + PHY_SetBBReg(Adapter,0xA14, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16) + + pHalData->CCK_Ant1_Cnt = 0; + pHalData->CCK_Ant2_Cnt = 0; + pHalData->OFDM_Ant1_Cnt = 0; + pHalData->OFDM_Ant2_Cnt = 0; +} + + +#define RxDefaultAnt1 0x65a9 +#define RxDefaultAnt2 0x569a + +void dm_SelectRXDefault(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) + return; + + //DbgPrint(" Ant1_Cnt=%d, Ant2_Cnt=%d\n", pHalData->Ant1_Cnt, pHalData->Ant2_Cnt); + //DBG_8192C(" CCK_Ant1_Cnt = %d, CCK_Ant2_Cnt = %d\n", pHalData->CCK_Ant1_Cnt, pHalData->CCK_Ant2_Cnt); + //DBG_8192C(" OFDM_Ant1_Cnt = %d, OFDM_Ant2_Cnt = %d\n", pHalData->OFDM_Ant1_Cnt, pHalData->OFDM_Ant2_Cnt); + if((pHalData->OFDM_Ant1_Cnt == 0) && (pHalData->OFDM_Ant2_Cnt == 0)) + { + if((pHalData->CCK_Ant1_Cnt + pHalData->CCK_Ant2_Cnt) >=10 ) + { + if(pHalData->CCK_Ant1_Cnt > (5*pHalData->CCK_Ant2_Cnt)) + { + DBG_8192C(" RX Default = Ant1\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); + } + else if(pHalData->CCK_Ant2_Cnt > (5*pHalData->CCK_Ant1_Cnt)) + { + DBG_8192C(" RX Default = Ant2\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); + } + else if(pHalData->CCK_Ant1_Cnt > pHalData->CCK_Ant2_Cnt) + { + DBG_8192C(" RX Default = Ant2\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); + } + else + { + DBG_8192C(" RX Default = Ant1\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); + } + pHalData->CCK_Ant1_Cnt = 0; + pHalData->CCK_Ant2_Cnt = 0; + pHalData->OFDM_Ant1_Cnt = 0; + pHalData->OFDM_Ant2_Cnt = 0; + } + } + else + { + if(pHalData->OFDM_Ant1_Cnt > pHalData->OFDM_Ant2_Cnt) + { + DBG_8192C(" RX Default = Ant1\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); + } + else + { + DBG_8192C(" RX Default = Ant2\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); + } + pHalData->CCK_Ant1_Cnt = 0; + pHalData->CCK_Ant2_Cnt = 0; + pHalData->OFDM_Ant1_Cnt = 0; + pHalData->OFDM_Ant2_Cnt = 0; + } + + +} + +#endif + +void +rtl8192c_InitHalDm( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i; + +#ifdef CONFIG_USB_HCI + dm_InitGPIOSetting(Adapter); +#endif + + pdmpriv->DM_Type = DM_Type_ByDriver; + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; + pdmpriv->UndecoratedSmoothedPWDB = (-1); + + //.1 DIG INIT + pdmpriv->bDMInitialGainEnable = _TRUE; + pdmpriv->DMFlag |= DYNAMIC_FUNC_DIG; + dm_DIGInit(Adapter); + + //.2 DynamicTxPower INIT + pdmpriv->DMFlag |= DYNAMIC_FUNC_HP; + dm_InitDynamicTxPower(Adapter); + + //.3 + DM_InitEdcaTurbo(Adapter); + + //.4 RateAdaptive INIT + dm_InitRateAdaptiveMask(Adapter); + + //.5 Tx Power Tracking Init. + pdmpriv->DMFlag |= DYNAMIC_FUNC_SS; + DM_InitializeTXPowerTracking(Adapter); + +#ifdef CONFIG_BT_COEXIST + pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; + dm_InitBtCoexistDM(Adapter); +#endif + + dm_InitDynamicBBPowerSaving(Adapter); + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV; + dm_SW_AntennaSwitchInit(Adapter); +#endif + +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV; + dm_InitHybridAntDiv(Adapter); +#endif + + dm_RSSIMonitorInit(Adapter); + + pdmpriv->DMFlag_tmp = pdmpriv->DMFlag; + + // Save REG_INIDATA_RATE_SEL value for TXDESC. + for(i = 0 ; i<32 ; i++) + { + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f; + } +} + +VOID +rtl8192c_HalDmWatchDog( + IN PADAPTER Adapter + ) +{ + BOOLEAN bFwCurrentInPSMode = _FALSE; + BOOLEAN bFwPSAwake = _TRUE; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + +#ifdef CONFIG_LPS + bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode; + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); +#endif + +#ifdef CONFIG_P2P + // Fw is under p2p powersaving mode, driver should stop dynamic mechanism. + // modifed by thomas. 2011.06.11. + if(Adapter->wdinfo.p2p_ps_enable) + bFwPSAwake = _FALSE; +#endif //CONFIG_P2P + + // Stop dynamic mechanism when: + // 1. RF is OFF. (No need to do DM.) + // 2. Fw is under power saving mode for FwLPS. (Prevent from SW/FW I/O racing.) + // 3. IPS workitem is scheduled. (Prevent from IPS sequence to be swapped with DM. + // Sometimes DM execution time is longer than 100ms such that the assertion + // in MgntActSet_RF_State() called by InactivePsWorkItem will be triggered by + // wating to long for RFChangeInProgress.) + // 4. RFChangeInProgress is TRUE. (Prevent from broken by IPS/HW/SW Rf off.) + // Noted by tynli. 2010.06.01. + //if(rfState == eRfOn) + if( (Adapter->hw_init_completed == _TRUE) + && ((!bFwCurrentInPSMode) && bFwPSAwake)) + { + // + // Calculate Tx/Rx statistics. + // + dm_CheckStatistics(Adapter); + + // + // For PWDB monitor and record some value for later use. + // + PWDB_Monitor(Adapter); + + // + // Dynamic Initial Gain mechanism. + // +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + dm_RSSIMonitorCheck(Adapter); +#endif + dm_FalseAlarmCounterStatistics(Adapter); + dm_DIG(Adapter); + + // + //Dynamic BB Power Saving Mechanism + // + dm_DynamicBBPowerSaving(Adapter); + + // + // Dynamic Tx Power mechanism. + // + dm_DynamicTxPower(Adapter); + + // + // Tx Power Tracking. + // + rtl8192c_dm_CheckTXPowerTracking(Adapter); + + // + // Rate Adaptive by Rx Signal Strength mechanism. + // + dm_RefreshRateAdaptiveMask(Adapter); + +#ifdef CONFIG_BT_COEXIST + //BT-Coexist + dm_BTCoexist(Adapter); +#endif + + // EDCA turbo + //update the EDCA paramter according to the Tx/RX mode + //update_EDCA_param(Adapter); + dm_CheckEdcaTurbo(Adapter); + + // + // Dynamically switch RTS/CTS protection. + // + //dm_CheckProtection(Adapter); + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + // + // Software Antenna diversity + // + dm_SW_AntennaSwitch(Adapter, SWAW_STEP_PEAK); +#endif + +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + dm_SelectRXDefault(Adapter); +#endif + +#ifdef CONFIG_PCI_HCI + // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. + // Tx Migration settings. + //dm_InterruptMigration(Adapter); + + //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) + // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); +#endif + + // Read REG_INIDATA_RATE_SEL value for TXDESC. + if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) + { + pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f; + } + else + { + u8 i; + for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++) + { + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f; + } + } + } + + // Check GPIO to determine current RF on/off and Pbc status. + // Check Hardware Radio ON/OFF or not + //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw) + //{ + //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n")); + // dm_CheckRfCtrlGPIO(Adapter); + //} + +#ifdef CONFIG_PCI_HCI + if(pHalData->bGpioHwWpsPbc) +#endif + { + dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11 + } + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c new file mode 100755 index 000000000000..02aa4a188bd5 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c @@ -0,0 +1,3541 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + +#define _RTL8192C_HAL_INIT_C_ +#include +#include +#include +#include +#include + +#include + +#ifdef CONFIG_USB_HCI +#include +#endif + +#ifdef CONFIG_PCI_HCI +#include +#endif + +#ifdef PLATFORM_LINUX +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE +#include + + int isAdaptorInfoFileValid(void) +{ + return 1; +} + +int storeAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path) +{ + int ret =0; + mm_segment_t oldfs; + struct file *fp; + if(eeprom_priv) { + + if( 0 == (ret=openFile(&fp, path, O_CREAT|O_WRONLY, 0666)) ) { + //DBG_8192C("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp); + + oldfs = get_fs(); set_fs(get_ds()); + if( EEPROM_MAX_SIZE==(ret=writeFile(fp, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE)) ) { + //DBG_8192C("%s writeFile OK\n",__FUNCTION__); + ret = 0; + } else { + DBG_8192C("%s writeFile Fail, ret:%d\n",__FUNCTION__, ret); + } + set_fs(oldfs); + + closeFile(fp); + } else { + DBG_8192C("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret); + } + + } else { + //DBG_8192C("%s NULL pointer\n",__FUNCTION__); + ret = -EINVAL; + } + return ret; +} + +int retriveAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path) +{ + int ret =-1; + mm_segment_t oldfs; + struct file *fp; + + if(eeprom_priv) { + + if( 0 == (ret=openFile(&fp,path, O_RDONLY, 0)) ){ + //DBG_8192C("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp); + + oldfs = get_fs(); set_fs(get_ds()); + if( EEPROM_MAX_SIZE==(ret=readFile(fp, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE)) ) { + //DBG_8192C("%s readFile OK\n",__FUNCTION__); + ret = 0; + } else { + DBG_8192C("%s readFile Fai, ret:%dl\n",__FUNCTION__, ret); + } + set_fs(oldfs); + + closeFile(fp); + } else { + DBG_8192C("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret); + } + + #if 0 + if(isAdaptorInfoFileValid()) { + return 0; + } else { + return -ENODATA; + } + #endif + } else { + //DBG_8192C("%s NULL pointer\n",__FUNCTION__); + ret = -EINVAL; + } + return ret; +} +#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE +#endif //PLATFORM_LINUX + +static BOOLEAN +hal_EfusePgPacketWrite2ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest); +static BOOLEAN +hal_EfusePgPacketWrite1ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest); +static BOOLEAN +hal_EfusePgPacketWriteData( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest); +static BOOLEAN +hal_EfusePgPacketWrite_BT( + IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN BOOLEAN bPseudoTest); + +static VOID +_FWDownloadEnable( + IN PADAPTER Adapter, + IN BOOLEAN enable + ) +{ + u8 tmp; + + if(enable) + { + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + + // 8051 enable + tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|0x04); + + // MCU firmware download enable. + tmp = rtw_read8(Adapter, REG_MCUFWDL); + rtw_write8(Adapter, REG_MCUFWDL, tmp|0x01); + + // 8051 reset + tmp = rtw_read8(Adapter, REG_MCUFWDL+2); + rtw_write8(Adapter, REG_MCUFWDL+2, tmp&0xf7); + } + else + { + // MCU firmware download enable. + tmp = rtw_read8(Adapter, REG_MCUFWDL); + rtw_write8(Adapter, REG_MCUFWDL, tmp&0xfe); + + // Reserved for fw extension. + rtw_write8(Adapter, REG_MCUFWDL+1, 0x00); + } +} + + +#define MAX_REG_BOLCK_SIZE 196 +#define MIN_REG_BOLCK_SIZE 8 + +static VOID +_BlockWrite( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 size + ) +{ +#ifdef CONFIG_PCI_HCI + u32 blockSize = sizeof(u32); // Use 4-byte write to download FW + u8 *bufferPtr = (u8 *)buffer; + u32 *pu4BytePtr = (u32 *)buffer; + u32 i, offset, blockCount, remainSize; + + blockCount = size / blockSize; + remainSize = size % blockSize; + + for(i = 0 ; i < blockCount ; i++){ + offset = i * blockSize; + rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), *(pu4BytePtr + i)); + } + + if(remainSize){ + offset = blockCount * blockSize; + bufferPtr += offset; + + for(i = 0 ; i < remainSize ; i++){ + rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset + i), *(bufferPtr + i)); + } + } +#else + +#ifdef SUPPORTED_BLOCK_IO + u32 blockSize = MAX_REG_BOLCK_SIZE; // Use 196-byte write to download FW + u32 blockSize2 = MIN_REG_BOLCK_SIZE; +#else + u32 blockSize = sizeof(u32); // Use 4-byte write to download FW + u32* pu4BytePtr = (u32*)buffer; + u32 blockSize2 = sizeof(u8); +#endif + u8* bufferPtr = (u8*)buffer; + u32 i, offset = 0, offset2, blockCount, remainSize, remainSize2; + + blockCount = size / blockSize; + remainSize = size % blockSize; + + for(i = 0 ; i < blockCount ; i++){ + offset = i * blockSize; + #ifdef SUPPORTED_BLOCK_IO + rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize, (bufferPtr + offset)); + #else + rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), le32_to_cpu(*(pu4BytePtr + i))); + #endif + } + + if(remainSize){ + offset2 = blockCount * blockSize; + blockCount = remainSize / blockSize2; + remainSize2 = remainSize % blockSize2; + + for(i = 0 ; i < blockCount ; i++){ + offset = offset2 + i * blockSize2; + #ifdef SUPPORTED_BLOCK_IO + rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize2, (bufferPtr + offset)); + #else + rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset ), *(bufferPtr + offset)); + #endif + } + + if(remainSize2) + { + offset += blockSize2; + bufferPtr += offset; + + for(i = 0 ; i < remainSize2 ; i++){ + rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset + i), *(bufferPtr + i)); + } + } + } +#endif +} + +static VOID +_PageWrite( + IN PADAPTER Adapter, + IN u32 page, + IN PVOID buffer, + IN u32 size + ) +{ + u8 value8; + u8 u8Page = (u8) (page & 0x07) ; + + value8 = (rtw_read8(Adapter, REG_MCUFWDL+2)& 0xF8 ) | u8Page ; + rtw_write8(Adapter, REG_MCUFWDL+2,value8); + _BlockWrite(Adapter,buffer,size); +} + +static VOID +_FillDummy( + u8* pFwBuf, + u32* pFwLen + ) +{ + u32 FwLen = *pFwLen; + u8 remain = (u8)(FwLen%4); + remain = (remain==0)?0:(4-remain); + + while(remain>0) + { + pFwBuf[FwLen] = 0; + FwLen++; + remain--; + } + + *pFwLen = FwLen; +} + +static VOID +_WriteFW( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 size + ) +{ + // Since we need dynamic decide method of dwonload fw, so we call this function to get chip version. + // We can remove _ReadChipVersion from ReadAdapterInfo8192C later. + + BOOLEAN isNormalChip; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); + + if(isNormalChip){ + u32 pageNums,remainSize ; + u32 page,offset; + u8* bufferPtr = (u8*)buffer; + +#ifdef CONFIG_PCI_HCI + // 20100120 Joseph: Add for 88CE normal chip. + // Fill in zero to make firmware image to dword alignment. + _FillDummy(bufferPtr, &size); +#endif + + pageNums = size / MAX_PAGE_SIZE ; + //RT_ASSERT((pageNums <= 4), ("Page numbers should not greater then 4 \n")); + remainSize = size % MAX_PAGE_SIZE; + + for(page = 0; page < pageNums; page++){ + offset = page *MAX_PAGE_SIZE; + _PageWrite(Adapter,page, (bufferPtr+offset),MAX_PAGE_SIZE); + } + if(remainSize){ + offset = pageNums *MAX_PAGE_SIZE; + page = pageNums; + _PageWrite(Adapter,page, (bufferPtr+offset),remainSize); + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_WriteFW Done- for Normal chip.\n")); + } + else { + _BlockWrite(Adapter,buffer,size); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_WriteFW Done- for Test chip.\n")); + } +} + +static int _FWFreeToGo( + IN PADAPTER Adapter + ) +{ + u32 counter = 0; + u32 value32; + u32 restarted = _FALSE; + + // polling CheckSum report + do{ + value32 = rtw_read32(Adapter, REG_MCUFWDL); + }while((counter ++ < POLLING_READY_TIMEOUT_COUNT) && (!(value32 & FWDL_ChkSum_rpt))); + + if(counter >= POLLING_READY_TIMEOUT_COUNT){ + DBG_8192C("chksum report faill ! REG_MCUFWDL:0x%08x .\n",value32); + return _FAIL; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Checksum report OK ! REG_MCUFWDL:0x%08x .\n",value32)); + + + value32 = rtw_read32(Adapter, REG_MCUFWDL); + value32 |= MCUFWDL_RDY; + value32 &= ~WINTINI_RDY; + rtw_write32(Adapter, REG_MCUFWDL, value32); + + +POLLING_FW_READY: + // polling for FW ready + counter = 0; + do + { + if(rtw_read32(Adapter, REG_MCUFWDL) & WINTINI_RDY){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",PlatformIORead4Byte(Adapter, REG_MCUFWDL)) ); + return _SUCCESS; + } + rtw_udelay_os(5); + }while(counter++ < POLLING_READY_TIMEOUT_COUNT); + + DBG_8192C("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", rtw_read32(Adapter, REG_MCUFWDL)); + + if(restarted == _FALSE) { + u8 tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + //DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp & ~BIT2); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp & ~BIT2); + //DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp|BIT2); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|BIT2); + restarted = _TRUE; + goto POLLING_FW_READY; + } + + + return _FAIL; + +} + + +VOID +rtl8192c_FirmwareSelfReset( + IN PADAPTER Adapter +) +{ + u8 u1bTmp; + u8 Delay = 100; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if((pHalData->FirmwareVersion > 0x21) || + (pHalData->FirmwareVersion == 0x21 && + pHalData->FirmwareSubVersion >= 0x01)) // after 88C Fw v33.1 + { + //0x1cf=0x20. Inform 8051 to reset. 2009.12.25. tynli_test + rtw_write8(Adapter, REG_HMETFR+3, 0x20); + + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + while(u1bTmp&BIT2) + { + Delay--; + if(Delay == 0) + break; + rtw_udelay_os(50); + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + } + + if((u1bTmp&BIT2) && (Delay == 0)) + { + DBG_8192C("FirmwareDownload92C():fw reset by itself Fail!!!!!! 0x03 = %x\n", u1bTmp); + //RT_ASSERT(FALSE, ("PowerOffAdapter8192CE(): 0x03 = %x\n", u1bTmp)); + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + rtw_write8(Adapter,REG_SYS_FUNC_EN+1,(rtw_read8(Adapter, REG_SYS_FUNC_EN+1)&~BIT2)); + } + + //DBG_8192C("%s =====> 8051 reset success (%d) .\n", __FUNCTION__ ,Delay); + } +} + +// +// Description: +// Download 8192C firmware code. +// +// +int FirmwareDownload92C( + IN PADAPTER Adapter +) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + s8 R92CFwImageFileName_TSMC[] ={RTL8192C_FW_TSMC_IMG}; + s8 R92CFwImageFileName_UMC[] ={RTL8192C_FW_UMC_IMG}; + s8 R92CFwImageFileName_UMC_B[] ={RTL8192C_FW_UMC_B_IMG}; + //s8 R8723FwImageFileName_UMC[] ={RTL8723_FW_UMC_IMG}; + u8* FwImage = NULL; + u32 FwImageLen = 0; + char* pFwImageFileName; + u8* pucMappedFile = NULL; + //vivi, merge 92c and 92s into one driver, 20090817 + //vivi modify this temply, consider it later!!!!!!!! + //PRT_FIRMWARE pFirmware = GET_FIRMWARE_819X(Adapter); + //PRT_FIRMWARE_92C pFirmware = GET_FIRMWARE_8192C(Adapter); + PRT_FIRMWARE_92C pFirmware = NULL; + PRT_8192C_FIRMWARE_HDR pFwHdr = NULL; + u8 *pFirmwareBuf; + u32 FirmwareLen; + + pFirmware = (PRT_FIRMWARE_92C)rtw_zvmalloc(sizeof(RT_FIRMWARE_92C)); + + if(!pFirmware) + { + rtStatus = _FAIL; + goto Exit; + } + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID)) + { + pFwImageFileName = R92CFwImageFileName_UMC; + FwImage = Rtl819XFwUMCACutImageArray; + FwImageLen = UMCACutImgArrayLength; + //DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC\n"); + } + else if(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) + { + // The ROM code of UMC B-cut Fw is the same as TSMC. by tynli. 2011.01.14. + pFwImageFileName = R92CFwImageFileName_UMC_B; + FwImage = Rtl819XFwUMCBCutImageArray; + FwImageLen = UMCBCutImgArrayLength; + //DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC_B\n"); + } + else + { + pFwImageFileName = R92CFwImageFileName_TSMC; + FwImage = Rtl819XFwTSMCImageArray; + FwImageLen = TSMCImgArrayLength; + //DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_TSMC\n"); + } + } + else + { + #if 0 + pFwImageFileName = TestChipFwFile; + FwImage = Rtl8192CTestFwImg; + FwImageLen = Rtl8192CTestFwImgLen; + RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> FirmwareDownload91C() fw:Rtl8192CTestFwImg\n")); + #endif + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> FirmwareDownload91C() fw:%s\n", pFwImageFileName)); + +#ifdef CONFIG_EMBEDDED_FWIMG + pFirmware->eFWSource = FW_SOURCE_HEADER_FILE; +#else + pFirmware->eFWSource = FW_SOURCE_IMG_FILE; // We should decided by Reg. +#endif + + switch(pFirmware->eFWSource) + { + case FW_SOURCE_IMG_FILE: + //TODO: + //_rtw_memcpy(pFirmware->szFwBuffer, FwImage, FwImageLen); + break; + case FW_SOURCE_HEADER_FILE: + if(FwImageLen > FW_8192C_SIZE){ + rtStatus = _FAIL; + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE) ); + DBG_871X("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE); + goto Exit; + } + + pFirmware->szFwBuffer = FwImage; + pFirmware->ulFwLength = FwImageLen; + break; + } + + pFirmwareBuf = pFirmware->szFwBuffer; + FirmwareLen = pFirmware->ulFwLength; + + // To Check Fw header. Added by tynli. 2009.12.04. + pFwHdr = (PRT_8192C_FIRMWARE_HDR)pFirmware->szFwBuffer; + + pHalData->FirmwareVersion = le16_to_cpu(pFwHdr->Version); + pHalData->FirmwareSubVersion = le16_to_cpu(pFwHdr->Subversion); + + //RT_TRACE(COMP_INIT, DBG_LOUD, (" FirmwareVersion(%#x), Signature(%#x)\n", + // Adapter->MgntInfo.FirmwareVersion, pFwHdr->Signature)); + + //DBG_8192C("fw_ver=v%d, fw_subver=%d, sig=0x%x\n", + //pHalData->FirmwareVersion, pHalData->FirmwareSubVersion, le16_to_cpu(pFwHdr->Signature)&0xFFF0); + + if(IS_FW_HEADER_EXIST(pFwHdr)) + { + //RT_TRACE(COMP_INIT, DBG_LOUD,("Shift 32 bytes for FW header!!\n")); + pFirmwareBuf = pFirmwareBuf + 32; + FirmwareLen = FirmwareLen -32; + } + + // Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, + // or it will cause download Fw fail. 2010.02.01. by tynli. + if(rtw_read8(Adapter, REG_MCUFWDL)&BIT7) //8051 RAM code + { + rtl8192c_FirmwareSelfReset(Adapter); + rtw_write8(Adapter, REG_MCUFWDL, 0x00); + } + + + _FWDownloadEnable(Adapter, _TRUE); + _WriteFW(Adapter, pFirmwareBuf, FirmwareLen); + _FWDownloadEnable(Adapter, _FALSE); + + rtStatus = _FWFreeToGo(Adapter); + if(_SUCCESS != rtStatus){ + DBG_8192C("DL Firmware failed!\n"); + goto Exit; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, (" Firmware is ready to run!\n")); + +Exit: + + if(pFirmware) { + rtw_vmfree((u8*)pFirmware, sizeof(RT_FIRMWARE_92C)); + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, (" <=== FirmwareDownload91C()\n")); + return rtStatus; + +} + +VOID +InitializeFirmwareVars92C( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // Init Fw LPS related. + Adapter->pwrctrlpriv.bFwCurrentInPSMode = _FALSE; + + //Init H2C counter. by tynli. 2009.12.09. + pHalData->LastHMEBoxNum = 0; +} + +#ifdef CONFIG_BT_COEXIST +static void _update_bt_param(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + struct registry_priv *registry_par = &padapter->registrypriv; + + if(2 != registry_par->bt_iso) + pbtpriv->BT_Ant_isolation = registry_par->bt_iso;// 0:Low, 1:High, 2:From Efuse + + if(registry_par->bt_sco == 1) // 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy + pbtpriv->BT_Service = BT_OtherAction; + else if(registry_par->bt_sco==2) + pbtpriv->BT_Service = BT_SCO; + else if(registry_par->bt_sco==4) + pbtpriv->BT_Service = BT_Busy; + else if(registry_par->bt_sco==5) + pbtpriv->BT_Service = BT_OtherBusy; + else + pbtpriv->BT_Service = BT_Idle; + + pbtpriv->BT_Ampdu = registry_par->bt_ampdu; + pbtpriv->bCOBT = _TRUE; +#if 1 + //DBG_8192C("BT Coexistance = %s\n", (pbtpriv->BT_Coexist==_TRUE)?"enable":"disable"); + if(pbtpriv->BT_Coexist) + { + if(pbtpriv->BT_Ant_Num == Ant_x2) + { + DBG_8192C("BlueTooth BT_Ant_Num = Antx2\n"); + } + else if(pbtpriv->BT_Ant_Num == Ant_x1) + { + DBG_8192C("BlueTooth BT_Ant_Num = Antx1\n"); + } + switch(pbtpriv->BT_CoexistType) + { + case BT_2Wire: + DBG_8192C("BlueTooth BT_CoexistType = BT_2Wire\n"); + break; + case BT_ISSC_3Wire: + DBG_8192C("BlueTooth BT_CoexistType = BT_ISSC_3Wire\n"); + break; + case BT_Accel: + DBG_8192C("BlueTooth BT_CoexistType = BT_Accel\n"); + break; + case BT_CSR_BC4: + DBG_8192C("BlueTooth BT_CoexistType = BT_CSR_BC4\n"); + break; + case BT_RTL8756: + DBG_8192C("BlueTooth BT_CoexistType = BT_RTL8756\n"); + break; + default: + DBG_8192C("BlueTooth BT_CoexistType = Unknown\n"); + break; + } + DBG_8192C("BlueTooth BT_Ant_isolation = %d\n", pbtpriv->BT_Ant_isolation); + + + switch(pbtpriv->BT_Service) + { + case BT_OtherAction: + DBG_8192C("BlueTooth BT_Service = BT_OtherAction\n"); + break; + case BT_SCO: + DBG_8192C("BlueTooth BT_Service = BT_SCO\n"); + break; + case BT_Busy: + DBG_8192C("BlueTooth BT_Service = BT_Busy\n"); + break; + case BT_OtherBusy: + DBG_8192C("BlueTooth BT_Service = BT_OtherBusy\n"); + break; + default: + DBG_8192C("BlueTooth BT_Service = BT_Idle\n"); + break; + } + + DBG_8192C("BT_RadioSharedType = 0x%x\n", pbtpriv->BT_RadioSharedType); + } +#endif + +} + + +#define GET_BT_COEXIST(priv) (&priv->bt_coexist) + +void rtl8192c_ReadBluetoothCoexistInfo( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + u8 rf_opt4; + + if(AutoloadFail){ + pbtpriv->BT_Coexist = _FALSE; + pbtpriv->BT_CoexistType= BT_2Wire; + pbtpriv->BT_Ant_Num = Ant_x2; + pbtpriv->BT_Ant_isolation= 0; + pbtpriv->BT_RadioSharedType = BT_Radio_Shared; + return; + } + + if(isNormal) + { + pbtpriv->BT_Coexist = (((PROMContent[EEPROM_RF_OPT1]&BOARD_TYPE_NORMAL_MASK)>>5) == BOARD_USB_COMBO)?_TRUE:_FALSE; // bit [7:5] + rf_opt4 = PROMContent[EEPROM_RF_OPT4]; + pbtpriv->BT_CoexistType = ((rf_opt4&0xe)>>1); // bit [3:1] + pbtpriv->BT_Ant_Num = (rf_opt4&0x1); // bit [0] + pbtpriv->BT_Ant_isolation = ((rf_opt4&0x10)>>4); // bit [4] + pbtpriv->BT_RadioSharedType = ((rf_opt4&0x20)>>5); // bit [5] + } + else + { + pbtpriv->BT_Coexist = (PROMContent[EEPROM_RF_OPT4] >> 4) ? _TRUE : _FALSE; + } + _update_bt_param(Adapter); + +} +#endif + +VERSION_8192C +rtl8192c_ReadChipVersion( + IN PADAPTER Adapter + ) +{ + u32 value32; + //VERSION_8192C version; + u32 ChipVersion=0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + value32 = rtw_read32(Adapter, REG_SYS_CFG); + + if (value32 & TRP_VAUX_EN) + { +#if 0 + // Test chip. + if(IS_HARDWARE_TYPE_8723(Adapter)) { + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + } + else { + version = (value32 & TYPE_ID) ?VERSION_TEST_CHIP_92C :VERSION_TEST_CHIP_88C; + } +#else + // tynli_test. 2011.01.10. + if(IS_HARDWARE_TYPE_8192C(Adapter)) + { + ChipVersion = (value32 & TYPE_ID) ? VERSION_TEST_CHIP_92C : VERSION_TEST_CHIP_88C; + } + else + { + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + } +#endif + } + else + { +#if 0 + // Normal mass production chip. + ChipVersion = NORMAL_CHIP; +#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION + ChipVersion |= ((value32 & TYPE_ID) ? CHIP_92C : 0); +#endif + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + if(IS_8723_SERIES(ChipVersion)) + { + if(IS_VENDOR_UMC(ChipVersion)) + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) ? CHIP_VENDOR_UMC_B_CUT : 0); + } + else + { + // Mark out by tynli. UMC B-cut IC will not set the SYS_CFG[19] to UMC + // because we do not want the custmor to know. 2011.01.11. + //if(IS_VENDOR_UMC(ChipVersion)) + { + // To check the value of B-cut. by tynli. 2011.01.11. + u1bTmp = (u1Byte)((value32 & CHIP_VER_RTL_MASK)>>12); + if(u1bTmp == 1) + { // B-cut + ChipVersion |= CHIP_VENDOR_UMC_B_CUT; + } + } + } +#else + // Normal mass production chip. + ChipVersion = NORMAL_CHIP; +//#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION + ChipVersion |= ((value32 & TYPE_ID) ? RF_TYPE_2T2R : 0); //92c +//#endif + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + if(IS_HARDWARE_TYPE_8192C(Adapter)) + { + // 88/92C UMC B-cut IC will not set the SYS_CFG[19] to UMC + // because we do not want the custmor to know. by tynli. 2011.01.17. + //MSG_8192C("mask result = 0x%x is_UMC %d chipversion 0x%x\n", (value32 & CHIP_VER_RTL_MASK), IS_CHIP_VENDOR_UMC(ChipVersion), ChipVersion); + if((!IS_CHIP_VENDOR_UMC(ChipVersion) )&& (value32 & CHIP_VER_RTL_MASK)) + { + //MSG_8192C("chip mask result = 0x%x\n", ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC)); + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC); // IC version (CUT) + //MSG_8192C("chip version = 0x%x\n", ChipVersion); + } + } + else + { + if(IS_CHIP_VENDOR_UMC(ChipVersion)) + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK)); // IC version (CUT) + } + + if(IS_92C_SERIAL(ChipVersion)) + { + value32 = rtw_read32(Adapter, REG_HPON_FSM); + ChipVersion |= ((CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_92C_1T2R) ? RF_TYPE_1T2R : 0); + } + else if(IS_8723_SERIES(ChipVersion)) + { + //RT_ASSERT(IS_HARDWARE_TYPE_8723(Adapter), ("Incorrect chip version!!\n")); + value32 = rtw_read32(Adapter, REG_GPIO_OUTSTS); + ChipVersion |= ((value32 & RF_RL_ID)>>20); //ROM code version. + } +#endif + + } + + //version = (VERSION_8192C)ChipVersion; + + // For multi-function consideration. Added by Roger, 2010.10.06. + if(IS_8723_SERIES(ChipVersion)) + { + pHalData->MultiFunc = RT_MULTI_FUNC_NONE; + value32 = rtw_read32(Adapter, REG_MULTI_FUNC_CTRL); + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & WL_FUNC_EN) ? RT_MULTI_FUNC_WIFI : 0) ); + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & BT_FUNC_EN) ? RT_MULTI_FUNC_BT : 0) ); + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & GPS_FUNC_EN) ? RT_MULTI_FUNC_GPS : 0) ); + pHalData->PolarityCtl = ((value32 & WL_HWPDN_SL) ? RT_POLARITY_HIGH_ACT : RT_POLARITY_LOW_ACT); + //MSG_8192C("ReadChipVersion(): MultiFunc(%x), PolarityCtl(%x) \n", pHalData->MultiFunc, pHalData->PolarityCtl); + + //For regulator mode. by tynli. 2011.01.14 + pHalData->RegulatorMode = ((value32 & TRP_BT_EN) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR); + //MSG_8192C("ReadChipVersion(): RegulatorMode(%x) \n", pHalData->RegulatorMode); + } + +//#if DBG +#if 1 + switch(ChipVersion) + { + case VERSION_NORMAL_TSMC_CHIP_92C_1T2R: + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C_1T2R.\n"); + break; + case VERSION_NORMAL_TSMC_CHIP_92C: + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C.\n"); + break; + case VERSION_NORMAL_TSMC_CHIP_88C: + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_88C.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_88C_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_B_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_88C_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_B_CUT.\n"); + break; + case VERSION_TEST_CHIP_92C: + MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_92C.\n"); + break; + case VERSION_TEST_CHIP_88C: + MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_88C.\n"); + break; + case VERSION_TEST_UMC_CHIP_8723: + MSG_8192C("Chip Version ID: VERSION_TEST_UMC_CHIP_8723.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_B_CUT.\n"); + break; + default: + MSG_8192C("Chip Version ID: ???????????????.\n"); + break; + } +#endif + + pHalData->VersionID = ChipVersion; + + if(IS_1T2R(ChipVersion)) + pHalData->rf_type = RF_1T2R; + else if(IS_2T2R(ChipVersion)) + pHalData->rf_type = RF_2T2R; + else if(IS_8723_SERIES(ChipVersion)) + pHalData->rf_type = RF_1T1R; + else + pHalData->rf_type = RF_1T1R; + + //MSG_8192C("RF_Type is %x!!\n", pHalData->rf_type); + + return ChipVersion; +} + + +RT_CHANNEL_DOMAIN +_HalMapChannelPlan8192C( + IN PADAPTER Adapter, + IN u8 HalChannelPlan + ) +{ + RT_CHANNEL_DOMAIN rtChannelDomain; + + switch(HalChannelPlan) + { +#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ + case EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN: + rtChannelDomain = RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN; + break; + case EEPROM_CHANNEL_PLAN_WORLD_WIDE_13: + rtChannelDomain = RT_CHANNEL_DOMAIN_WORLD_WIDE_13; + break; +#endif /* Not using EEPROM_CHANNEL_PLAN directly */ + default: + if(HalChannelPlan == 0xFF) + rtChannelDomain = RT_CHANNEL_DOMAIN_WORLD_WIDE_13; + else + rtChannelDomain = (RT_CHANNEL_DOMAIN)HalChannelPlan; + break; + } + + return rtChannelDomain; + +} + +u8 GetEEPROMSize8192C(PADAPTER Adapter) +{ + u8 size = 0; + u32 curRCR; + + curRCR = rtw_read16(Adapter, REG_9346CR); + size = (curRCR & BOOT_FROM_EEPROM) ? 6 : 4; // 6: EEPROM used is 93C46, 4: boot from E-Fuse. + + //MSG_8192C("EEPROM type is %s\n", size==4 ? "E-FUSE" : "93C46"); + + return size; +} + +void rtl8192c_HalSetBrateCfg( + IN PADAPTER Adapter, + IN u8 *mBratesOS, + OUT u16 *pBrateCfg +) +{ + u8 is_brate; + u8 i; + u8 brate; + + for(i=0;i rtl8192c_free_hal_data =====\n"); + + if(padapter->HalData) + rtw_mfree(padapter->HalData, sizeof(HAL_DATA_TYPE)); + //DBG_8192C("<===== rtl8192c_free_hal_data =====\n"); + +_func_exit_; +} + +//=========================================================== +// Efuse related code +//=========================================================== +enum{ + VOLTAGE_V25 = 0x03, + LDOE25_SHIFT = 28 , + }; + +static VOID +hal_EfusePowerSwitch_RTL8192C( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + u8 tempval; + u16 tmpV16; + + if (PwrState == _TRUE) + { + // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL); + if( ! (tmpV16 & PWC_EV12V ) ){ + tmpV16 |= PWC_EV12V ; + rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16); + } + // Reset: 0x0000h[28], default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN); + if( !(tmpV16 & FEN_ELDR) ){ + tmpV16 |= FEN_ELDR ; + rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); + } + + // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR); + if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){ + tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; + rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); + } + + if(bWrite == _TRUE) + { + // Enable LDO 2.5V before read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + tempval &= 0x0F; + tempval |= (VOLTAGE_V25 << 4); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); + } + } + else + { + if(bWrite == _TRUE){ + // Disable LDO 2.5V after read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); + } + } +} + +static VOID +hal_EfusePowerSwitch_RTL8723( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + u8 tempval; + u16 tmpV16; + + if (PwrState == _TRUE) + { + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); + + // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL); + if( ! (tmpV16 & PWC_EV12V ) ){ + tmpV16 |= PWC_EV12V ; + rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16); + } + // Reset: 0x0000h[28], default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN); + if( !(tmpV16 & FEN_ELDR) ){ + tmpV16 |= FEN_ELDR ; + rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); + } + + // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR); + if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){ + tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; + rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); + } + + if(bWrite == _TRUE) + { + // Enable LDO 2.5V before read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + tempval &= 0x0F; + tempval |= (VOLTAGE_V25 << 4); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); + } + } + else + { + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF); + + if(bWrite == _TRUE){ + // Disable LDO 2.5V after read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); + } + } +} + +static VOID +rtl8192c_EfusePowerSwitch( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + hal_EfusePowerSwitch_RTL8192C(pAdapter, bWrite, PwrState); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + hal_EfusePowerSwitch_RTL8723(pAdapter, bWrite, PwrState); + } +} + +static VOID +ReadEFuse_RTL8192C( + PADAPTER Adapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + u8 efuseTbl[EFUSE_MAP_LEN]; + u8 rtemp8[1]; + u16 eFuse_Addr = 0; + u8 offset, wren; + u16 i, j; + u16 eFuseWord[EFUSE_MAX_SECTION][EFUSE_MAX_WORD_UNIT]; + u16 efuse_utilized = 0; + u8 efuse_usage = 0; + + // + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. + // + if((_offset + _size_byte)>EFUSE_MAP_LEN) + {// total E-Fuse table is 128bytes + //DBG_8192C("ReadEFuse_RTL8192C(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte); + return; + } + + // 0. Refresh efuse init map as all oxFF. + for (i = 0; i < EFUSE_MAX_SECTION; i++) + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) + eFuseWord[i][j] = 0xFFFF; + + + // + // 1. Read the first byte to check if efuse is empty!!! + // + // + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); + if(*rtemp8 != 0xFF) + { + efuse_utilized++; + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); + eFuse_Addr++; + } + + // + // 2. Read real efuse content. Filter PG header and every section data. + // + while((*rtemp8 != 0xFF) && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN)) + { + // Check PG header for section num. + offset = ((*rtemp8 >> 4) & 0x0f); + + if(offset < EFUSE_MAX_SECTION) + { + // Get word enable value from PG header + wren = (*rtemp8 & 0x0f); + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wren)); + + for(i=0; i= EFUSE_REAL_CONTENT_LEN) + break; + + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); eFuse_Addr++; + efuse_utilized++; + eFuseWord[offset][i] |= (((u16)*rtemp8 << 8) & 0xff00); + + if(eFuse_Addr >= EFUSE_REAL_CONTENT_LEN) + break; + } + + wren >>= 1; + + } + } + + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); + // Read next PG header + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); + if(*rtemp8 != 0xFF && (eFuse_Addr < 512)) + { + efuse_utilized++; + eFuse_Addr++; + } + } + + // + // 3. Collect 16 sections and 4 word unit into Efuse map. + // + for(i=0; i> 8) & 0xff); + } + } + + // + // 4. Copy from Efuse map to output pointer memory!!! + // + for(i=0; i<_size_byte; i++) + { + pbuf[i] = efuseTbl[_offset+i]; + } + + // + // 5. Calculate Efuse utilization. + // + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN); + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized); + //Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage); +} + +static VOID +ReadEFuse_RTL8723( + PADAPTER Adapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + u8 efuseTbl[EFUSE_MAP_LEN_8723]; + u16 eFuse_Addr = 0; + u8 offset = 0, wden = 0; + u16 i, j; + u16 eFuseWord[EFUSE_MAX_SECTION_8723][EFUSE_MAX_WORD_UNIT]; + u16 efuse_utilized = 0; + u8 efuse_usage = 0; + u8 offset_2_0=0; + u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; + // + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. + // + if((_offset + _size_byte)>EFUSE_MAP_LEN_8723) + { + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_RTL8723(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte)); + return; + } + + // 0. Refresh efuse init map as all oxFF. + for (i = 0; i < EFUSE_MAX_SECTION_8723; i++) + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) + eFuseWord[i][j] = 0xFFFF; + + // + // 1. Read the first byte to check if efuse is empty!!! + // + // + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); + + if(efuseHeader != 0xFF) + { + efuse_utilized++; + } + else + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("EFUSE is empty\n")); + return; + } + + + // + // 2. Read real efuse content. Filter PG header and every section data. + // + while((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR(eFuse_Addr)) + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseHeader)); + + // Check PG header for section num. + if(EXT_HEADER(efuseHeader)) //extended header + { + offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader); + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("extended header offset_2_0=%x\n", offset_2_0)); + + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest); + + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseExtHdr)); + + if(efuseExtHdr != 0xff) + { + efuse_utilized++; + if(ALL_WORDS_DISABLED(efuseExtHdr)) + { + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); + if(efuseHeader != 0xff) + { + efuse_utilized++; + } + continue; + } + else + { + offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0; + wden = (efuseExtHdr & 0x0F); + } + } + else + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n")); + // We should handle this condition. + } + } + else + { + offset = ((efuseHeader >> 4) & 0x0f); + wden = (efuseHeader & 0x0f); + } + + if(offset < EFUSE_MAX_SECTION_8723) + { + // Get word enable value from PG header + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden)); + + for(i=0; i> 8) & 0xff); + } + } + + // + // 4. Copy from Efuse map to output pointer memory!!! + // + for(i=0; i<_size_byte; i++) + { + pbuf[i] = efuseTbl[_offset+i]; + } + + // + // 5. Calculate Efuse utilization. + // + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN); + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized); + //Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage); +} + +static BOOLEAN +Hal_EfuseSwitchToBank( + IN PADAPTER pAdapter, + IN u8 bank, + IN BOOLEAN bPseudoTest + ) +{ + BOOLEAN bRet = _FALSE; + u32 value32=0; + + //RTPRINT(FEEPROM, EFUSE_PG, ("Efuse switch bank to %d\n", bank)); + if(bPseudoTest) + { + fakeEfuseBank = bank; + bRet = _TRUE; + } + else + { + if(IS_HARDWARE_TYPE_8723(pAdapter) && + INCLUDE_MULTI_FUNC_BT(pAdapter)) + { + value32 = rtw_read32(pAdapter, EFUSE_TEST); + bRet = _TRUE; + switch(bank) + { + case 0: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); + break; + case 1: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_0); + break; + case 2: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_1); + break; + case 3: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_2); + break; + default: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); + bRet = _FALSE; + break; + } + rtw_write32(pAdapter, EFUSE_TEST, value32); + } + else + bRet = _TRUE; + } + return bRet; +} + +static VOID +ReadEFuse_BT( + PADAPTER Adapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + u8 *efuseTbl; + u16 eFuse_Addr = 0; + u8 offset = 0, wden = 0; + u16 i, j; + u16 **eFuseWord; + u16 efuse_utilized = 0; + u8 efuse_usage = 0; + u8 offset_2_0=0; + u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; + u8 bank=0; + BOOLEAN bCheckNextBank=_FALSE; + + efuseTbl = rtw_malloc(EFUSE_BT_MAP_LEN); + if(efuseTbl == NULL){ + DBG_8192C("efuseTbl malloc fail !\n"); + return; + } + + eFuseWord = (u16 **)rtw_zmalloc(sizeof(u16 *)*EFUSE_BT_MAX_SECTION); + if(eFuseWord == NULL){ + DBG_8192C("eFuseWord malloc fail !\n"); + return; + } + else{ + for(i=0;iEFUSE_BT_MAP_LEN) + { + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_BT(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte)); + return; + } + + // 0. Refresh efuse init map as all oxFF. + for (i = 0; i < EFUSE_BT_MAX_SECTION; i++) + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) + eFuseWord[i][j] = 0xFFFF; + + for(bank=1; bank> 1) | offset_2_0; + wden = (efuseExtHdr & 0x0F); + } + } + else + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n")); + // We should handle this condition. + } + } + else + { + offset = ((efuseHeader >> 4) & 0x0f); + wden = (efuseHeader & 0x0f); + } + + if(offset < EFUSE_BT_MAX_SECTION) + { + // Get word enable value from PG header + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden)); + + for(i=0; i= EFUSE_REAL_CONTENT_LEN) + bCheckNextBank = _TRUE; + else + bCheckNextBank = _FALSE; + } + } + if(!bCheckNextBank) + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Stop to check next bank\n")); + break; + } + } + + // switch bank back to bank 0 for later BT and wifi use. + Hal_EfuseSwitchToBank(Adapter, 0, bPseudoTest); + + // + // 3. Collect 16 sections and 4 word unit into Efuse map. + // + for(i=0; i> 8) & 0xff); + } + } + + // + // 4. Copy from Efuse map to output pointer memory!!! + // + for(i=0; i<_size_byte; i++) + { + pbuf[i] = efuseTbl[_offset+i]; + } + + // + // 5. Calculate Efuse utilization. + // + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_BT_REAL_CONTENT_LEN); + if(bPseudoTest) + { + fakeBTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1; + } + else + { + BTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1; + } + + for(i=0;i>4) & 0x0F; + hworden = efuse_data & 0x0F; + word_cnts = Efuse_CalculateWordCnts(hworden); + //read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + } + else + { + bContinual = _FALSE ; + } + } + + return efuse_addr; +} + +static u16 +Hal_EfuseGetCurrentSize_BT(IN PADAPTER pAdapter, + IN BOOLEAN bPseudoTest) +{ + int bContinual = _TRUE; + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 efuse_data,word_cnts=0; + u8 bank=0, startBank=0; + u16 retU2=0; + u32 total_efuse_used=0; + + if(bPseudoTest) + { + efuse_addr = (u16)((fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN)); + startBank = (u8)(1+(fakeBTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN)); + } + else + { + efuse_addr = (u16)((BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN)); + startBank = (u8)(1+(BTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN)); + } + + if((startBank < 1) || (startBank >= EFUSE_MAX_BANK)) + DBG_8192C("Error, bank error, bank=%d\n", bank); + + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), start bank=%d, start_efuse_addr = %d\n", startBank, efuse_addr)); + + for(bank=startBank; bank> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + } + else + { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + //read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + } + else + { + bContinual = _FALSE ; + } + } + + // Check if we need to check next bank efuse + if(efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_PROTECT_BYTES_BANK)) + { + break;// don't need to check next bank. + } + } + + retU2 = ((bank-1)*EFUSE_REAL_CONTENT_LEN)+efuse_addr; + if(bPseudoTest) + { + fakeBTEfuseUsedBytes = retU2; + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", fakeBTEfuseUsedBytes)); + } + else + { + BTEfuseUsedBytes = retU2; + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", BTEfuseUsedBytes)); + } + + return retU2; +} + + +static u16 +hal_EfuseGetCurrentSize_8723(IN PADAPTER pAdapter, + IN BOOLEAN bPseudoTest) +{ + int bContinual = _TRUE; + + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 efuse_data,word_cnts=0; + + if(bPseudoTest) + { + efuse_addr = (u16)(fakeEfuseUsedBytes); + } + else + { + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); + } + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), start_efuse_addr = %d\n", efuse_addr)); + + while ( bContinual && + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) && + AVAILABLE_EFUSE_ADDR(efuse_addr)) + { + if(efuse_data!=0xFF) + { + if((efuse_data&0x1F) == 0x0F) //extended header + { + hoffset = efuse_data; + efuse_addr++; + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); + if((efuse_data & 0x0F) == 0x0F) + { + efuse_addr++; + continue; + } + else + { + hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + } + else + { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + //read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + } + else + { + bContinual = _FALSE ; + } + } + + if(bPseudoTest) + { + fakeEfuseUsedBytes = efuse_addr; + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", fakeEfuseUsedBytes)); + } + else + { + pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", efuse_addr)); + } + + return efuse_addr; +} + +static u16 +Hal_EfuseGetCurrentSize_Pseudo(IN PADAPTER pAdapter, + IN BOOLEAN bPseudoTest) +{ + u16 ret=0; + + ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest); + + return ret; +} + +static u16 +rtl8192c_EfuseGetCurrentSize( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest) +{ + u16 ret=0; + + if(efuseType == EFUSE_WIFI) + { + if(bPseudoTest) + { + ret = Hal_EfuseGetCurrentSize_Pseudo(pAdapter, bPseudoTest); + } + else + { + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + ret = hal_EfuseGetCurrentSize_8192C(pAdapter, bPseudoTest); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest); + } + } + } + else + { + ret = Hal_EfuseGetCurrentSize_BT(pAdapter, bPseudoTest); + } + + return ret; +} + +static int +hal_EfusePgPacketRead_8192C( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 ReadState = PG_STATE_HEADER; + + int bContinual = _TRUE; + int bDataEmpty = _TRUE ; + + u8 efuse_data,word_cnts=0; + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 tmpidx=0; + u8 tmpdata[8]; + + if(data==NULL) return _FALSE; + if(offset>15) return _FALSE; + + + _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // Skip dummy parts to prevent unexpected data read from Efuse. + // By pass right now. 2009.02.19. + // + while(bContinual && (efuse_addr < EFUSE_REAL_CONTENT_LEN) ) + { + //------- Header Read ------------- + if(ReadState & PG_STATE_HEADER) + { + if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)){ + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + word_cnts = Efuse_CalculateWordCnts(hworden); + bDataEmpty = _TRUE ; + + if(hoffset==offset){ + for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){ + if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ){ + tmpdata[tmpidx] = efuse_data; + if(efuse_data!=0xff){ + bDataEmpty = _FALSE; + } + } + } + if(bDataEmpty==_FALSE){ + ReadState = PG_STATE_DATA; + }else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + } + else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + else{ + bContinual = _FALSE ; + } + } + //------- Data section Read ------------- + else if(ReadState & PG_STATE_DATA) + { + efuse_WordEnableDataRead(hworden,tmpdata,data); + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + + if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && + (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) + return _FALSE; + else + return _TRUE; + +} + +static int +hal_EfusePgPacketRead_8723( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 ReadState = PG_STATE_HEADER; + + int bContinual = _TRUE; + int bDataEmpty = _TRUE ; + + u8 efuse_data,word_cnts=0; + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 tmpidx=0; + u8 tmpdata[8]; + u8 max_section=0; + u8 tmp_header = 0; + + EFUSE_GetEfuseDefinition(pAdapter, EFUSE_WIFI, TYPE_EFUSE_MAX_SECTION, (PVOID)&max_section, bPseudoTest); + + if(data==NULL) + return _FALSE; + if(offset>max_section) + return _FALSE; + + _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // Skip dummy parts to prevent unexpected data read from Efuse. + // By pass right now. 2009.02.19. + // + while(bContinual && AVAILABLE_EFUSE_ADDR(efuse_addr) ) + { + //------- Header Read ------------- + if(ReadState & PG_STATE_HEADER) + { + if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)) + { + if(EXT_HEADER(efuse_data)) + { + tmp_header = efuse_data; + efuse_addr++; + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); + if(!ALL_WORDS_DISABLED(efuse_data)) + { + hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + else + { + DBG_8192C("Error, All words disabled\n"); + efuse_addr++; + continue; + } + } + else + { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + bDataEmpty = _TRUE ; + + if(hoffset==offset) + { + for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++) + { + if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ) + { + tmpdata[tmpidx] = efuse_data; + if(efuse_data!=0xff) + { + bDataEmpty = _FALSE; + } + } + } + if(bDataEmpty==_FALSE){ + ReadState = PG_STATE_DATA; + }else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + } + else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + else{ + bContinual = _FALSE ; + } + } + //------- Data section Read ------------- + else if(ReadState & PG_STATE_DATA) + { + efuse_WordEnableDataRead(hworden,tmpdata,data); + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + + if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && + (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) + return _FALSE; + else + return _TRUE; + +} + +static int +Hal_EfusePgPacketRead( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + ret = hal_EfusePgPacketRead_8192C(pAdapter, offset, data, bPseudoTest); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest); + } + + return ret; +} + +static int +Hal_EfusePgPacketRead_Pseudo( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest); + + return ret; +} + +static int +rtl8192c_Efuse_PgPacketRead( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + if(bPseudoTest) + { + ret = Hal_EfusePgPacketRead_Pseudo(pAdapter, offset, data, bPseudoTest); + } + else + { + ret = Hal_EfusePgPacketRead(pAdapter, offset, data, bPseudoTest); + } + + return ret; +} + +static BOOLEAN +hal_EfuseFixHeaderProcess( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN PPGPKT_STRUCT pFixPkt, + IN u16 *pAddr, + IN BOOLEAN bPseudoTest +) +{ + u8 originaldata[8], badworden=0; + u16 efuse_addr=*pAddr; + u32 PgWriteSuccess=0; + + _rtw_memset((PVOID)originaldata, 0xff, 8); + + if(Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest)) + { //check if data exist + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest); + + if(badworden != 0xf) // write fail + { + if(efuseType == EFUSE_WIFI) + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); + else + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); + if(!PgWriteSuccess) + return _FALSE; + else + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); + } + else + { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + } + else + { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + *pAddr = efuse_addr; + return _TRUE; +} + +static BOOLEAN +hal_EfusePgPacketWrite2ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE, bContinual=_TRUE; + u16 efuse_addr=*pAddr, efuse_max_available_len=0; + u8 pg_header=0, tmp_header=0, pg_header_temp=0; + u8 repeatcnt=0; + + //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 2byte header\n")); + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest); + + while(efuse_addr < efuse_max_available_len) + { + pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; + //RTPRINT(FEEPROM, EFUSE_PG, ("pg_header = 0x%x\n", pg_header)); + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF) + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for pg_header!!\n")); + return _FALSE; + } + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + } + + //to write ext_header + if(tmp_header == pg_header) + { + efuse_addr++; + pg_header_temp = pg_header; + pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF) + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for ext_header!!\n")); + return _FALSE; + } + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + } + + if((tmp_header & 0x0F) == 0x0F) //word_en PG fail + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for word_en!!\n")); + return _FALSE; + } + else + { + efuse_addr++; + continue; + } + } + else if(pg_header != tmp_header) //offset PG fail + { + PGPKT_STRUCT fixPkt; + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for offset PG fail, need to cover the existed data\n")); + fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1); + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) + return _FALSE; + } + else + { + bRet = _TRUE; + break; + } + } + else if ((tmp_header & 0x1F) == 0x0F) //wrong extended header + { + efuse_addr+=2; + continue; + } + } + + *pAddr = efuse_addr; + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWrite1ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + u8 pg_header=0, tmp_header=0; + u16 efuse_addr=*pAddr; + u8 repeatcnt=0; + + //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 1byte header\n")); + pg_header = ((pTargetPkt->offset << 4) & 0xf0) |pTargetPkt->word_en; + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF) + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + return _FALSE; + } + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); + } + + if(pg_header == tmp_header) + { + bRet = _TRUE; + } + else + { + PGPKT_STRUCT fixPkt; + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for fixed PG packet, need to cover the existed data\n")); + fixPkt.offset = (tmp_header>>4) & 0x0F; + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) + return _FALSE; + } + + *pAddr = efuse_addr; + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWriteData( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + u16 efuse_addr=*pAddr; + u8 badworden=0; + u32 PgWriteSuccess=0; + + badworden = 0x0f; + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); + if(badworden == 0x0F) + { + // write ok + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData ok!!\n")); + return _TRUE; + } + else + { + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData Fail!!\n")); + //reorganize other pg packet + if(efuseType == EFUSE_WIFI) + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + else + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + if(!PgWriteSuccess) + return _FALSE; + else + return _TRUE; + } + + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWriteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + + if(pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE) + { + bRet = hal_EfusePgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + } + else + { + bRet = hal_EfusePgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + } + + return bRet; +} + +static BOOLEAN +hal_EfusePgCheckAvailableAddr( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest + ) +{ + u16 efuse_max_available_len=0; + + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&efuse_max_available_len, bPseudoTest); + //RTPRINT(FEEPROM, EFUSE_PG, ("efuse_max_available_len = %d\n", efuse_max_available_len)); + + if(Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= efuse_max_available_len) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgCheckAvailableAddr error!!\n")); + return _FALSE; + } + return _TRUE; +} + +static VOID +hal_EfuseConstructPGPkt( + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN PPGPKT_STRUCT pTargetPkt + +) +{ + _rtw_memset((PVOID)pTargetPkt->data, 0xFF, sizeof(u8)*8); + pTargetPkt->offset = offset; + pTargetPkt->word_en= word_en; + efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data); + pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); + + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseConstructPGPkt(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\n", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts)); +} + +static BOOLEAN +hal_EfuseCheckIfDatafollowed( + IN PADAPTER pAdapter, + IN u8 word_cnts, + IN u16 startAddr, + IN BOOLEAN bPseudoTest + ) +{ + BOOLEAN bRet=_FALSE; + u8 i, efuse_data; + + for(i=0; i<(word_cnts*2) ; i++) + { + if(efuse_OneByteRead(pAdapter, (startAddr+i) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)) + bRet = _TRUE; + } + + return bRet; +} + +static BOOLEAN +wordEnMatched( + IN PPGPKT_STRUCT pTargetPkt, + IN PPGPKT_STRUCT pCurPkt, + IN u8 *pWden +) +{ + u8 match_word_en = 0x0F; // default all words are disabled + u8 i; + + // check if the same words are enabled both target and current PG packet + if( ((pTargetPkt->word_en & BIT0) == 0) && + ((pCurPkt->word_en & BIT0) == 0) ) + { + match_word_en &= ~BIT0; // enable word 0 + } + if( ((pTargetPkt->word_en & BIT1) == 0) && + ((pCurPkt->word_en & BIT1) == 0) ) + { + match_word_en &= ~BIT1; // enable word 1 + } + if( ((pTargetPkt->word_en & BIT2) == 0) && + ((pCurPkt->word_en & BIT2) == 0) ) + { + match_word_en &= ~BIT2; // enable word 2 + } + if( ((pTargetPkt->word_en & BIT3) == 0) && + ((pCurPkt->word_en & BIT3) == 0) ) + { + match_word_en &= ~BIT3; // enable word 3 + } + + *pWden = match_word_en; + + if(match_word_en != 0xf) + return _TRUE; + else + return _FALSE; +} + +static BOOLEAN +hal_EfusePartialWriteCheck( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest + ) +{ + BOOLEAN bRet=_FALSE; + u8 i, efuse_data=0, cur_header=0; + u8 new_wden=0, matched_wden=0, badworden=0; + u16 startAddr=0, efuse_max_available_len=0, efuse_max=0; + PGPKT_STRUCT curPkt; + + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest); + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&efuse_max, bPseudoTest); + + if(efuseType == EFUSE_WIFI) + { + if(bPseudoTest) + { + startAddr = (u16)(fakeEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); + } + else + { + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&startAddr); + startAddr%=EFUSE_REAL_CONTENT_LEN; + } + } + else + { + if(bPseudoTest) + { + startAddr = (u16)(fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); + } + else + { + startAddr = (u16)(BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); + } + } + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePartialWriteCheck(), startAddr=%d\n", startAddr)); + + while(1) + { + if(startAddr >= efuse_max_available_len) + { + bRet = _FALSE; + break; + } + + if(efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data!=0xFF)) + { + if(EXT_HEADER(efuse_data)) + { + cur_header = efuse_data; + startAddr++; + efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); + if(ALL_WORDS_DISABLED(efuse_data)) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition, all words disabled")); + bRet = _FALSE; + break; + } + else + { + curPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + curPkt.word_en = efuse_data & 0x0F; + } + } + else + { + cur_header = efuse_data; + curPkt.offset = (cur_header>>4) & 0x0F; + curPkt.word_en = cur_header & 0x0F; + } + + curPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en); + // if same header is found but no data followed + // write some part of data followed by the header. + if( (curPkt.offset == pTargetPkt->offset) && + (!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr+1, bPseudoTest)) && + wordEnMatched(pTargetPkt, &curPkt, &matched_wden) ) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Need to partial write data by the previous wrote header\n")); + // Here to write partial data + badworden = Efuse_WordEnableDataWrite(pAdapter, startAddr+1, matched_wden, pTargetPkt->data, bPseudoTest); + if(badworden != 0x0F) + { + u32 PgWriteSuccess=0; + // if write fail on some words, write these bad words again + if(efuseType == EFUSE_WIFI) + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + else + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + + if(!PgWriteSuccess) + { + bRet = _FALSE; // write fail, return + break; + } + } + // partial write ok, update the target packet for later use + for(i=0; i<4; i++) + { + if((matched_wden & (0x1<word_en |= (0x1<word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); + } + // read from next header + startAddr = startAddr + (curPkt.word_cnts*2) +1; + } + else + { + // not used header, 0xff + *pAddr = startAddr; + //RTPRINT(FEEPROM, EFUSE_PG, ("Started from unused header offset=%d\n", startAddr)); + bRet = _TRUE; + break; + } + } + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWrite_BT( + IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN BOOLEAN bPseudoTest + ) +{ + PGPKT_STRUCT targetPkt; + u16 startAddr=0; + u8 efuseType=EFUSE_BT; + + if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest)) + return _FALSE; + + hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); + + if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + return _TRUE; +} + +static BOOLEAN +hal_EfusePgPacketWrite_8723( + IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN BOOLEAN bPseudoTest + ) +{ + PGPKT_STRUCT targetPkt; + u16 startAddr=0; + u8 efuseType=EFUSE_WIFI; + + if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest)) + return _FALSE; + + hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); + + if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + return _TRUE; +} + +static int +hal_EfusePgPacketWrite_8192C(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 WriteState = PG_STATE_HEADER; + + int bContinual = _TRUE,bDataEmpty=_TRUE, bResult = _TRUE; + u16 efuse_addr = 0; + u8 efuse_data; + + u8 pg_header = 0; + + u8 tmp_word_cnts=0,target_word_cnts=0; + u8 tmp_header,match_word_en,tmp_word_en; + + PGPKT_STRUCT target_pkt; + PGPKT_STRUCT tmp_pkt; + + u8 originaldata[sizeof(u8)*8]; + u8 tmpindex = 0,badworden = 0x0F; + + static int repeat_times = 0; + u8 efuseType=EFUSE_WIFI; + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // So we have to prevent unexpected data string connection, which will cause + // incorrect data auto-load from HW. The total size is equal or smaller than 498bytes + // (i.e., offset 0~497, and dummy 1bytes) expected after CP test. + // 2009.02.19. + // + if( Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWrite_8192C(), over size\n")); + return _FALSE; + } + + // Init the 8 bytes content as 0xff + target_pkt.offset = offset; + target_pkt.word_en= word_en; + + _rtw_memset((PVOID)target_pkt.data, 0xFF, sizeof(u8)*8); + + efuse_WordEnableDataRead(word_en,data,target_pkt.data); + target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en); + + //efuse_reg_ctrl(pAdapter,_TRUE);//power on + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE Power ON\n")); + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // So we have to prevent unexpected data string connection, which will cause + // incorrect data auto-load from HW. Dummy 1bytes is additional. + // 2009.02.19. + // + while( bContinual && (efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) ) + { + + if(WriteState==PG_STATE_HEADER) + { + bDataEmpty=_TRUE; + badworden = 0x0F; + //************ so ******************* + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER\n")); + if ( efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) && + (efuse_data!=0xFF)) + { + tmp_header = efuse_data; + + tmp_pkt.offset = (tmp_header>>4) & 0x0F; + tmp_pkt.word_en = tmp_header & 0x0F; + tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en); + + //************ so-1 ******************* + if(tmp_pkt.offset != target_pkt.offset) + { + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + #if (EFUSE_ERROE_HANDLE == 1) + WriteState = PG_STATE_HEADER; + #endif + } + else + { + //************ so-2 ******************* + for(tmpindex=0 ; tmpindex<(tmp_word_cnts*2) ; tmpindex++) + { + if(efuse_OneByteRead(pAdapter, (efuse_addr+1+tmpindex) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)){ + bDataEmpty = _FALSE; + } + } + //************ so-2-1 ******************* + if(bDataEmpty == _FALSE) + { + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + #endif + } + else + {//************ so-2-2 ******************* + match_word_en = 0x0F; + if( !( (target_pkt.word_en&BIT0)|(tmp_pkt.word_en&BIT0) )) + { + match_word_en &= (~BIT0); + } + if( !( (target_pkt.word_en&BIT1)|(tmp_pkt.word_en&BIT1) )) + { + match_word_en &= (~BIT1); + } + if( !( (target_pkt.word_en&BIT2)|(tmp_pkt.word_en&BIT2) )) + { + match_word_en &= (~BIT2); + } + if( !( (target_pkt.word_en&BIT3)|(tmp_pkt.word_en&BIT3) )) + { + match_word_en &= (~BIT3); + } + + //************ so-2-2-A ******************* + if((match_word_en&0x0F)!=0x0F) + { + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1, tmp_pkt.word_en ,target_pkt.data, bPseudoTest); + + //************ so-2-2-A-1 ******************* + //############################ + if(0x0F != (badworden&0x0F)) + { + u8 reorg_offset = offset; + u8 reorg_worden=badworden; + Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest); + } + //############################ + + tmp_word_en = 0x0F; + if( (target_pkt.word_en&BIT0)^(match_word_en&BIT0) ) + { + tmp_word_en &= (~BIT0); + } + if( (target_pkt.word_en&BIT1)^(match_word_en&BIT1) ) + { + tmp_word_en &= (~BIT1); + } + if( (target_pkt.word_en&BIT2)^(match_word_en&BIT2) ) + { + tmp_word_en &= (~BIT2); + } + if( (target_pkt.word_en&BIT3)^(match_word_en&BIT3) ) + { + tmp_word_en &=(~BIT3); + } + + //************ so-2-2-A-2 ******************* + if((tmp_word_en&0x0F)!=0x0F){ + //reorganize other pg packet + //efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); + //=========================== + target_pkt.offset = offset; + target_pkt.word_en= tmp_word_en; + //=========================== + }else{ + bContinual = _FALSE; + } + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + #endif + } + else{//************ so-2-2-B ******************* + //reorganize other pg packet + efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr + //=========================== + target_pkt.offset = offset; + target_pkt.word_en= target_pkt.word_en; + //=========================== + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + #endif + } + } + } + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-1\n")); + } + else //************ s1: header == oxff ******************* + { + pg_header = ((target_pkt.offset << 4)&0xf0) |target_pkt.word_en; + + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); + + if(tmp_header == pg_header) + { //************ s1-1******************* + WriteState = PG_STATE_DATA; + } + #if (EFUSE_ERROE_HANDLE == 1) + else if(tmp_header == 0xFF){//************ s1-3: if Write or read func doesn't work ******************* + //efuse_addr doesn't change + WriteState = PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + } + #endif + else + {//************ s1-2 : fixed the header procedure ******************* + tmp_pkt.offset = (tmp_header>>4) & 0x0F; + tmp_pkt.word_en= tmp_header & 0x0F; + tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en); + + //************ s1-2-A :cover the exist data ******************* + //memset(originaldata,0xff,sizeof(UINT8)*8); + _rtw_memset((PVOID)originaldata, 0xff, sizeof(u8)*8); + + if(Efuse_PgPacketRead( pAdapter, tmp_pkt.offset,originaldata, bPseudoTest)) + { //check if data exist + //efuse_reg_ctrl(pAdapter,_TRUE);//power on + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,tmp_pkt.word_en,originaldata, bPseudoTest); + //############################ + if(0x0F != (badworden&0x0F)) + { + u8 reorg_offset = tmp_pkt.offset; + u8 reorg_worden=badworden; + Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest); + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); + } + //############################ + else{ + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + } + } + //************ s1-2-B: wrong address******************* + else + { + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + } + + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + #endif + + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-2\n")); + } + + } + + } + //write data state + else if(WriteState==PG_STATE_DATA) + { //************ s1-1 ******************* + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_DATA\n")); + badworden = 0x0f; + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,target_pkt.word_en,target_pkt.data, bPseudoTest); + if((badworden&0x0F)==0x0F) + { //************ s1-1-A ******************* + bContinual = _FALSE; + } + else + {//reorganize other pg packet //************ s1-1-B ******************* + efuse_addr = efuse_addr + (2*target_word_cnts) +1;//next pg packet addr + + //=========================== + target_pkt.offset = offset; + target_pkt.word_en= badworden; + target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en); + //=========================== + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + #endif + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-3\n")); + } + } + } + + if(efuse_addr >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) + { + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("hal_EfusePgPacketWrite_8192C(): efuse_addr(%#x) Out of size!!\n", efuse_addr)); + } + //efuse_reg_ctrl(pAdapter,_FALSE);//power off + + return _TRUE; +} + +static int +Hal_EfusePgPacketWrite_Pseudo(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret; + + ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest); + + return ret; +} + +static int +Hal_EfusePgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + ret = hal_EfusePgPacketWrite_8192C(pAdapter, offset, word_en, data, bPseudoTest); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest); + } + + return ret; +} + +static int +rtl8192c_Efuse_PgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret; + + if(bPseudoTest) + { + ret = Hal_EfusePgPacketWrite_Pseudo(pAdapter, offset, word_en, data, bPseudoTest); + } + else + { + ret = Hal_EfusePgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest); + } + return ret; +} + +VOID +rtl8192c_EfuseParseIDCode( + IN PADAPTER pAdapter, + IN u8 *hwinfo + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u16 i,EEPROMId; + + // Checl 0x8129 again for making sure autoload status!! + EEPROMId = *((u16 *)&hwinfo[0]); + if( EEPROMId != RTL_EEPROM_ID) + { + DBG_8192C("EEPROM ID(%#x) is invalid!!\n", EEPROMId); + pEEPROM->bautoload_fail_flag = _TRUE; + } + else + { + pEEPROM->bautoload_fail_flag = _FALSE; + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("EEPROM ID = 0x%4x\n", EEPROMId)); +} + +void rtl8192c_read_chip_version(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + pHalData->VersionID = rtl8192c_ReadChipVersion(pAdapter); +} + +void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc) +{ + pHalFunc->free_hal_data = &rtl8192c_free_hal_data; + + pHalFunc->dm_init = &rtl8192c_init_dm_priv; + pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv; + pHalFunc->read_chip_version = &rtl8192c_read_chip_version; + + pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C; + pHalFunc->set_channel_handler = &PHY_SwChnl8192C; + + pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog; + + pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid; + +#ifdef CONFIG_ANTENNA_DIVERSITY + pHalFunc->SwAntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C; + pHalFunc->SwAntDivCompareHandler = &SwAntDivCompare8192C; +#endif + + pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg; + pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg; + pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg; + pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg; + + //Efuse related function + pHalFunc->EfusePowerSwitch = &rtl8192c_EfusePowerSwitch; + pHalFunc->ReadEFuse = &rtl8192c_ReadEFuse; + pHalFunc->EFUSEGetEfuseDefinition = &rtl8192c_EFUSE_GetEfuseDefinition; + pHalFunc->EfuseGetCurrentSize = &rtl8192c_EfuseGetCurrentSize; + pHalFunc->Efuse_PgPacketRead = &rtl8192c_Efuse_PgPacketRead; + pHalFunc->Efuse_PgPacketWrite = &rtl8192c_Efuse_PgPacketWrite; + pHalFunc->Efuse_WordEnableDataWrite = &rtl8192c_Efuse_WordEnableDataWrite; + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + pHalFunc->sreset_init_value = &rtl8192c_sreset_init_value; + pHalFunc->sreset_reset_value = &rtl8192c_sreset_reset_value; + pHalFunc->silentreset = &rtl8192c_silentreset_for_specific_platform; + pHalFunc->sreset_xmit_status_check = &rtl8192c_sreset_xmit_status_check; + pHalFunc->sreset_linked_status_check = &rtl8192c_sreset_linked_status_check; + pHalFunc->sreset_get_wifi_status = &rtl8192c_sreset_get_wifi_status; +#endif + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c new file mode 100755 index 000000000000..35f9c708e6a5 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c @@ -0,0 +1,5415 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + + Module: rtl8192c_phycfg.c + + Note: Merge 92SE/SU PHY config as below + 1. BB register R/W API + 2. RF register R/W API + 3. Initial BB/RF/MAC config by reading BB/MAC/RF txt. + 3. Power setting API + 4. Channel switch API + 5. Initial gain switch API. + 6. Other BB/MAC/RF API. + + Function: PHY: Extern function, phy: local function + + Export: PHY_FunctionName + + Abbrev: NONE + + History: + Data Who Remark + 08/08/2008 MHC 1. Port from 9x series phycfg.c + 2. Reorganize code arch and ad description. + 3. Collect similar function. + 4. Seperate extern/local API. + 08/12/2008 MHC We must merge or move USB PHY relative function later. + 10/07/2008 MHC Add IQ calibration for PHY.(Only 1T2R mode now!!!) + 11/06/2008 MHC Add TX Power index PG file to config in 0xExx register + area to map with EEPROM/EFUSE tx pwr index. + +******************************************************************************/ +#define _HAL_8192C_PHYCFG_C_ + +#include +#include +#include +#include + +#include + + +/*---------------------------Define Local Constant---------------------------*/ +/* Channel switch:The size of command tables for switch channel*/ +#define MAX_PRECMD_CNT 16 +#define MAX_RFDEPENDCMD_CNT 16 +#define MAX_POSTCMD_CNT 16 + +#define MAX_DOZE_WAITING_TIMES_9x 64 + +/*---------------------------Define Local Constant---------------------------*/ + + +/*------------------------Define global variable-----------------------------*/ + +/*------------------------Define local variable------------------------------*/ + + +/*--------------------Define export function prototype-----------------------*/ +// Please refer to header file +/*--------------------Define export function prototype-----------------------*/ + +/*----------------------------Function Body----------------------------------*/ +// +// 1. BB register R/W API +// + +/** +* Function: phy_CalculateBitShift +* +* OverView: Get shifted position of the BitMask +* +* Input: +* u4Byte BitMask, +* +* Output: none +* Return: u4Byte Return the shift bit bit position of the mask +*/ +static u32 +phy_CalculateBitShift( + u32 BitMask + ) +{ + u32 i; + + for(i=0; i<=31; i++) + { + if ( ((BitMask>>i) & 0x1 ) == 1) + break; + } + + return (i); +} + + +/** +* Function: PHY_QueryBBReg +* +* OverView: Read "sepcific bits" from BB register +* +* Input: +* PADAPTER Adapter, +* u4Byte RegAddr, //The target address to be readback +* u4Byte BitMask //The target bit position in the target address +* //to be readback +* Output: None +* Return: u4Byte Data //The readback register value +* Note: This function is equal to "GetRegSetting" in PHY programming guide +*/ +u32 +rtl8192c_PHY_QueryBBReg( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 ReturnValue = 0, OriginalValue, BitShift; + u16 BBWaitCounter = 0; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask)); + + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + ReturnValue = (OriginalValue & BitMask) >> BitShift; + + //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, OriginalValue)); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx), OriginalValue(%#lx)\n", RegAddr, BitMask, OriginalValue)); + + return (ReturnValue); + +} + + +/** +* Function: PHY_SetBBReg +* +* OverView: Write "Specific bits" to BB register (page 8~) +* +* Input: +* PADAPTER Adapter, +* u4Byte RegAddr, //The target address to be modified +* u4Byte BitMask //The target bit position in the target address +* //to be modified +* u4Byte Data //The new register value in the target bit position +* //of the target address +* +* Output: None +* Return: None +* Note: This function is equal to "PutRegSetting" in PHY programming guide +*/ + +VOID +rtl8192c_PHY_SetBBReg( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u16 BBWaitCounter = 0; + u32 OriginalValue, BitShift; + +#if (DISABLE_BB_RF == 1) + return; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); + + if(BitMask!= bMaskDWord){//if not "double word" write + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + Data = ((OriginalValue & (~BitMask)) | (Data << BitShift)); + } + + rtw_write32(Adapter, RegAddr, Data); + + //RTPRINT(FPHY, PHY_BBW, ("BBW MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, Data)); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); + +} + + +// +// 2. RF register R/W API +// + +/*----------------------------------------------------------------------------- + * Function: phy_FwRFSerialRead() + * + * Overview: We support firmware to execute RF-R/W. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/21/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static u32 +phy_FwRFSerialRead( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset ) +{ + u32 retValue = 0; + //RT_ASSERT(FALSE,("deprecate!\n")); + return (retValue); + +} /* phy_FwRFSerialRead */ + + +/*----------------------------------------------------------------------------- + * Function: phy_FwRFSerialWrite() + * + * Overview: We support firmware to execute RF-R/W. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/21/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +phy_FwRFSerialWrite( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data ) +{ + //RT_ASSERT(FALSE,("deprecate!\n")); +} + + +/** +* Function: phy_RFSerialRead +* +* OverView: Read regster from RF chips +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte Offset, //The target address to be read +* +* Output: None +* Return: u4Byte reback value +* Note: Threre are three types of serial operations: +* 1. Software serial write +* 2. Hardware LSSI-Low Speed Serial Interface +* 3. Hardware HSSI-High speed +* serial write. Driver need to implement (1) and (2). +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() +*/ +static u32 +phy_RFSerialRead( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset + ) +{ + u32 retValue = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + u32 NewOffset; + u32 tmplong,tmplong2; + u8 RfPiEnable=0; +#if 0 + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs + return retValue; + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs + return retValue; +#endif + // + // Make sure RF register offset is correct + // + Offset &= 0x3f; + + // + // Switch page for 8256 RF IC + // + NewOffset = Offset; + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RTPRINT(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n")); + // return 0xFFFFFFFF; + //} + + // For 92S LSSI Read RFLSSIRead + // For RF A/B write 0x824/82c(does not work in the future) + // We must use 0x824 for RF A and B to execute read trigger + tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord); + if(eRFPath == RF90_PATH_A) + tmplong2 = tmplong; + else + tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord); + + tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF + + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge)); + rtw_udelay_os(10);// PlatformStallExecution(10); + //rtw_mdelay_os(1); + + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2); + rtw_udelay_os(100);//PlatformStallExecution(100); + //rtw_mdelay_os(1); + + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge); + rtw_udelay_os(10);//PlatformStallExecution(10); + //rtw_mdelay_os(1); + + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge)); + rtw_udelay_os(10);// PlatformStallExecution(10); + + if(eRFPath == RF90_PATH_A) + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT8); + else if(eRFPath == RF90_PATH_B) + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT8); + + if(RfPiEnable) + { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData); + //DBG_8192C("Readback from RF-PI : 0x%x\n", retValue); + } + else + { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData); + //DBG_8192C("Readback from RF-SI : 0x%x\n", retValue); + } + //DBG_8192C("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue); + + return retValue; + +} + + + +/** +* Function: phy_RFSerialWrite +* +* OverView: Write data to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte Offset, //The target address to be read +* u4Byte Data //The new register Data in the target bit position +* //of the target to be read +* +* Output: None +* Return: None +* Note: Threre are three types of serial operations: +* 1. Software serial write +* 2. Hardware LSSI-Low Speed Serial Interface +* 3. Hardware HSSI-High speed +* serial write. Driver need to implement (1) and (2). +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() + * + * Note: For RF8256 only + * The total count of RTL8256(Zebra4) register is around 36 bit it only employs + * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10]) + * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration + * programming guide" for more details. + * Thus, we define a sub-finction for RTL8526 register address conversion + * =========================================================== + * Register Mode RegCTL[1] RegCTL[0] Note + * (Reg00[12]) (Reg00[10]) + * =========================================================== + * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf) + * ------------------------------------------------------------------ + * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf) + * ------------------------------------------------------------------ + * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf) + * ------------------------------------------------------------------ + * + * 2008/09/02 MH Add 92S RF definition + * + * + * +*/ +static VOID +phy_RFSerialWrite( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data + ) +{ + u32 DataAndAddr = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + u32 NewOffset; + +#if 0 + // We should check valid regs for RF_6052 case. + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs + return; + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs + return; +#endif + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); + // return; + //} + + Offset &= 0x3f; + + // + // Shadow Update + // + //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); + + // + // Switch page for 8256 RF IC + // + NewOffset = Offset; + + // + // Put write addr in [5:0] and write data in [31:16] + // + //DataAndAddr = (Data<<16) | (NewOffset&0x3f); + DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF + + // + // Write Operation + // + PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); + //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr)); + +} + + +/** +* Function: PHY_QueryRFReg +* +* OverView: Query "Specific bits" to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte RegAddr, //The target address to be read +* u4Byte BitMask //The target bit position in the target address +* //to be read +* +* Output: None +* Return: u4Byte Readback value +* Note: This function is equal to "GetRFRegSetting" in PHY programming guide +*/ +u32 +rtl8192c_PHY_QueryRFReg( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 Original_Value, Readback_Value, BitShift; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u8 RFWaitCounter = 0; + //_irqL irqL; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), BitMask(%#lx)\n", RegAddr, eRFPath,BitMask)); + +#ifdef CONFIG_USB_HCI + //PlatformAcquireMutex(&pHalData->mxRFOperate); +#else + //_enter_critical(&pHalData->rf_lock, &irqL); +#endif + + + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + + BitShift = phy_CalculateBitShift(BitMask); + Readback_Value = (Original_Value & BitMask) >> BitShift; + +#ifdef CONFIG_USB_HCI + //PlatformReleaseMutex(&pHalData->mxRFOperate); +#else + //_exit_critical(&pHalData->rf_lock, &irqL); +#endif + + + //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%lx Addr[0x%lx]=0x%lx\n", eRFPath, BitMask, RegAddr, Original_Value));//BitMask(%#lx),BitMask, + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), Original_Value(%#lx)\n", + // RegAddr, eRFPath, Original_Value)); + + return (Readback_Value); +} + +/** +* Function: PHY_SetRFReg +* +* OverView: Write "Specific bits" to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte RegAddr, //The target address to be modified +* u4Byte BitMask //The target bit position in the target address +* //to be modified +* u4Byte Data //The new register Data in the target bit position +* //of the target address +* +* Output: None +* Return: None +* Note: This function is equal to "PutRFRegSetting" in PHY programming guide +*/ +VOID +rtl8192c_PHY_SetRFReg( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u1Byte RFWaitCounter = 0; + u32 Original_Value, BitShift; + //_irqL irqL; + +#if (DISABLE_BB_RF == 1) + return; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + //RTPRINT(FINIT, INIT_RF, ("PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + + +#ifdef CONFIG_USB_HCI + //PlatformAcquireMutex(&pHalData->mxRFOperate); +#else + //_enter_critical(&pHalData->rf_lock, &irqL); +#endif + + + // RF data is 12 bits only + if (BitMask != bRFRegOffsetMask) + { + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + Data = ((Original_Value & (~BitMask)) | (Data<< BitShift)); + } + + phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); + + + +#ifdef CONFIG_USB_HCI + //PlatformReleaseMutex(&pHalData->mxRFOperate); +#else + //_exit_critical(&pHalData->rf_lock, &irqL); +#endif + + //PHY_QueryRFReg(Adapter,eRFPath,RegAddr,BitMask); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + +} + + +// +// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. +// + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigMACWithParaFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: The format of MACPHY_REG.txt is different from PHY and RF. + * [Register][Mask][Value] + *---------------------------------------------------------------------------*/ +static int +phy_ConfigMACWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigMACWithHeaderFile() + * + * Overview: This function read BB parameters from Header file we gen, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: The format of MACPHY_REG.txt is different from PHY and RF. + * [Register][Mask][Value] + *---------------------------------------------------------------------------*/ +static int +phy_ConfigMACWithHeaderFile( + IN PADAPTER Adapter +) +{ + u32 i = 0; + u32 ArrayLength = 0; + u32* ptrArray; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //2008.11.06 Modified by tynli. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read Rtl819XMACPHY_Array\n")); + ArrayLength = MAC_2T_ArrayLength; + ptrArray = Rtl819XMAC_Array; + + for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column + rtw_write8(Adapter, ptrArray[i], (u8)ptrArray[i+1]); + } + + return _SUCCESS; + +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_MACConfig8192C + * + * Overview: Condig MAC by header file or parameter file. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 08/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +int +PHY_MACConfig8192C( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + s8 *pszMACRegFile; + s8 sz88CMACRegFile[] = RTL8188C_PHY_MACREG; + s8 sz92CMACRegFile[] = RTL8192C_PHY_MACREG; + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + if(isNormal) + { + if(is92C) + pszMACRegFile = sz92CMACRegFile; + else + pszMACRegFile = sz88CMACRegFile; + } + else + { + //pszMACRegFile = TestMacRegFile; + } + + // + // Config MAC + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigMACWithHeaderFile(Adapter); +#else + + // Not make sure EEPROM, add later + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read MACREG.txt\n")); + rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); +#endif + +#ifdef CONFIG_PCI_HCI + //this switching setting cause some 8192cu hw have redownload fw fail issue + //improve 2-stream TX EVM by Jenyu + if(isNormal && is92C) + rtw_write8(Adapter, REG_SPS0_CTRL+3,0x71); +#endif + + + // 2010.07.13 AMPDU aggregation number 9 + //rtw_write16(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); + rtw_write8(Adapter, REG_MAX_AGGR_NUM, 0x0A); //By tynli. 2010.11.18. +#ifdef CONFIG_USB_HCI + if(is92C && (BOARD_USB_DONGLE == pHalData->BoardType)) + rtw_write8(Adapter, 0x40,0x04); +#endif + + return rtStatus; + +} + + +/** +* Function: phy_InitBBRFRegisterDefinition +* +* OverView: Initialize Register definition offset for Radio Path A/B/C/D +* +* Input: +* PADAPTER Adapter, +* +* Output: None +* Return: None +* Note: The initialization value is constant and it should never be changes +*/ +static VOID +phy_InitBBRFRegisterDefinition( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // RF Interface Sowrtware Control + pHalData->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 + pHalData->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) + pHalData->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874 + pHalData->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) + + // RF Interface Readback Value + pHalData->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0 + pHalData->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) + pHalData->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4 + pHalData->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) + + // RF Interface Output (and Enable) + pHalData->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 + pHalData->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 + + // RF Interface (Output and) Enable + pHalData->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) + pHalData->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) + + //Addr of LSSI. Wirte RF register by driver + pHalData->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter + pHalData->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; + + // RF parameter + pHalData->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select + pHalData->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter; + pHalData->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter; + pHalData->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter; + + // Tx AGC Gain Stage (same for all path. Should we remove this?) + pHalData->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + + // Tranceiver A~D HSSI Parameter-1 + pHalData->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1 + pHalData->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1 + + // Tranceiver A~D HSSI Parameter-2 + pHalData->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2 + pHalData->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2 + + // RF switch Control + pHalData->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control + pHalData->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl; + pHalData->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl; + pHalData->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl; + + // AGC control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1; + pHalData->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1; + pHalData->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1; + pHalData->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1; + + // AGC control 2 + pHalData->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2; + pHalData->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2; + pHalData->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2; + pHalData->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2; + + // RX AFE control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance; + + // RX AFE control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE; + pHalData->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE; + pHalData->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE; + pHalData->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE; + + // Tx AFE control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance; + + // Tx AFE control 2 + pHalData->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE; + pHalData->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE; + pHalData->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE; + pHalData->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE; + + // Tranceiver LSSI Readback SI mode + pHalData->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; + pHalData->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; + pHalData->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack; + pHalData->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack; + + // Tranceiver LSSI Readback PI mode + pHalData->PHYRegDef[RF90_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; + pHalData->PHYRegDef[RF90_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; + //pHalData->PHYRegDef[RF90_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack; + //pHalData->PHYRegDef[RF90_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack; + +} + + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithParaFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * 2008/11/06 MH For 92S we do not support silent reset now. Disable + * parameter file compare!!!!!!?? + * + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + return rtStatus; +} + + + +//**************************************** +// The following is for High Power PA +//**************************************** +VOID +phy_ConfigBBExternalPA( + IN PADAPTER Adapter +) +{ +#ifdef CONFIG_USB_HCI + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 i=0; + u32 temp=0; + + if(!pHalData->ExternalPA) + { + return; + } + + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the + // same code as SU. It is already updated in PHY_REG_1T_HP.txt. +#if 0 + PHY_SetBBReg(Adapter, 0xee8, BIT28, 1); + temp = PHY_QueryBBReg(Adapter, 0x860, bMaskDWord); + temp |= (BIT26|BIT21|BIT10|BIT5); + PHY_SetBBReg(Adapter, 0x860, bMaskDWord, temp); + PHY_SetBBReg(Adapter, 0x870, BIT10, 0); + PHY_SetBBReg(Adapter, 0xc80, bMaskDWord, 0x20000080); + PHY_SetBBReg(Adapter, 0xc88, bMaskDWord, 0x40000100); +#endif + +#endif +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithHeaderFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * u1Byte ConfigType 0 => PHY_CONFIG + * 1 =>AGC_TAB + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithHeaderFile( + IN PADAPTER Adapter, + IN u8 ConfigType +) +{ + int i; + u32* Rtl819XPHY_REGArray_Table; + u32* Rtl819XAGCTAB_Array_Table; + u16 PHY_REGArrayLen, AGCTAB_ArrayLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // + // 2009.11.24. Modified by tynli. + // + if(IS_92C_SERIAL(pHalData->VersionID)) + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + AGCTAB_ArrayLen = AGCTAB_2TArrayLength; + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_2TArray; + PHY_REGArrayLen = PHY_REG_2TArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2TArray; +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_MINICARD ) + { + PHY_REGArrayLen = PHY_REG_2T_mCardArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2T_mCardArray; + } +#endif + } + else + { + DBG_8192C(" ===> phy_ConfigBBWithHeaderFile(): do not support test chip\n"); + return _FAIL; + } + } + else + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + AGCTAB_ArrayLen = AGCTAB_1TArrayLength; + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1TArray; + PHY_REGArrayLen = PHY_REG_1TArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1TArray; +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_MINICARD ) + { + PHY_REGArrayLen = PHY_REG_1T_mCardArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_mCardArray; + } + else if(pHalData->BoardType == BOARD_USB_High_PA) + { + AGCTAB_ArrayLen = AGCTAB_1T_HPArrayLength; + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1T_HPArray; + PHY_REGArrayLen = PHY_REG_1T_HPArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_HPArray; + } +#endif + } + else + { + DBG_8192C(" ===> phy_ConfigBBWithHeaderFile(): do not support test chip\n"); + return _FAIL; + } + } + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iMCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0])); + } + if(RegAddr == rTxAGC_A_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1])); + } + if(RegAddr == rTxAGC_A_CCK1_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7])); + } + if(RegAddr == rTxAGC_A_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2])); + } + if(RegAddr == rTxAGC_A_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3])); + } + if(RegAddr == rTxAGC_A_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4])); + } + if(RegAddr == rTxAGC_A_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5])); + } + if(RegAddr == rTxAGC_B_Rate18_06) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8])); + } + if(RegAddr == rTxAGC_B_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9])); + } + if(RegAddr == rTxAGC_B_CCK1_55_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15])); + } + if(RegAddr == rTxAGC_B_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10])); + } + if(RegAddr == rTxAGC_B_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11])); + } + if(RegAddr == rTxAGC_B_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12])); + } + if(RegAddr == rTxAGC_B_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13])); + pHalData->pwrGroupCnt++; + } +} +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithPgParaFile + * + * Overview: + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/06/2008 MHC Create Version 0. + * 2009/07/29 tynli (porting from 92SE branch)2009/03/11 Add copy parameter file to buffer for silent reset + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithPgParaFile( + IN PADAPTER Adapter, + IN u8* pFileName) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + + return rtStatus; + +} /* phy_ConfigBBWithPgParaFile */ + + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithPgHeaderFile + * + * Overview: Config PHY_REG_PG array + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/06/2008 MHC Add later!!!!!!.. Please modify for new files!!!! + * 11/10/2008 tynli Modify to mew files. + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithPgHeaderFile( + IN PADAPTER Adapter, + IN u8 ConfigType) +{ + int i; + u32* Rtl819XPHY_REGArray_Table_PG; + u16 PHY_REGArrayPGLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // Default: pHalData->RF_Type = RF_2T2R. + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + PHY_REGArrayPGLen = PHY_REG_Array_PGLength; + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG; + +#ifdef CONFIG_USB_HCI +// 2010/10/19 Chiyoko According to Alex/Willson opinion, VAU/dongle can share the same PHY_REG_PG.txt +/* + if(pHalData->BoardType == BOARD_MINICARD ) + { + PHY_REGArrayPGLen = PHY_REG_Array_PG_mCardLength; + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_mCard; + } + else */if(pHalData->BoardType ==BOARD_USB_High_PA ) + { + PHY_REGArrayPGLen = PHY_REG_Array_PG_HPLength; + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_HP; + } +#endif + } + else + { + DBG_8192C(" ===> phy_ConfigBBWithPgHeaderFile(): do not support test chip\n"); + return _FAIL; + } + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iBufOfLines), + MAX_LINES_HWCONFIG_TXT, + MAX_BYTES_LINE_HWCONFIG_TXT, + &nLinesRead + ); + if(rtStatus == RT_STATUS_SUCCESS) + { + PlatformMoveMemory(pHalData->BufOfLines6, pHalData->BufOfLines, nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesRead6 = nLinesRead; + } + else + { + // Temporarily skip PHY_REG_MP.txt if file does not exist. + pHalData->nLinesRead6 = 0; + RT_TRACE(COMP_INIT, DBG_LOUD, ("No matched file \r\n")); + return RT_STATUS_SUCCESS; + } + } + else + { + PlatformMoveMemory(pHalData->BufOfLines, pHalData->BufOfLines6, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + nLinesRead = pHalData->nLinesRead6; + rtStatus = RT_STATUS_SUCCESS; + } + + + if(rtStatus == RT_STATUS_SUCCESS) + { + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName)); + + for(ithLine = 0; ithLine < nLinesRead; ithLine++) + { + szLine = pHalData->BufOfLines[ithLine]; + + if(!IsCommentString(szLine)) + { + // Get 1st hex value as register offset. + if(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) + { + if(u4bRegOffset == 0xff) + { // Ending. + break; + } + else if (u4bRegOffset == 0xfe) + delay_ms(50); + else if (u4bRegOffset == 0xfd) + delay_ms(5); + else if (u4bRegOffset == 0xfc) + delay_ms(1); + else if (u4bRegOffset == 0xfb) + PlatformStallExecution(50); + else if (u4bRegOffset == 0xfa) + PlatformStallExecution(5); + else if (u4bRegOffset == 0xf9) + PlatformStallExecution(1); + + // Get 2nd hex value as register value. + szLine += u4bMove; + if(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) + { + RT_TRACE(COMP_FPGA, DBG_TRACE, ("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue)); + PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue); + + // Add 1us delay between BB/RF register setting. + PlatformStallExecution(1); + } + } + } + } + } + else + { + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): Failed%s\n", pFileName)); + } +#endif + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithMpHeaderFile + * + * Overview: Config PHY_REG_MP array + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 02/04/2010 chiyokolin Modify to new files. + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithMpHeaderFile( + IN PADAPTER Adapter, + IN u1Byte ConfigType) +{ + int i; + u32* Rtl8192CPHY_REGArray_Table_MP; + u16 PHY_REGArrayMPLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PHY_REGArrayMPLen = PHY_REG_Array_MPLength; + Rtl8192CPHY_REGArray_Table_MP = Rtl819XPHY_REG_Array_MP; + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iphy_BB8192S_Config_ParaFile\n")); + + if(IS_92C_SERIAL(pHalData->VersionID)){ + pszBBRegFile=(u8*)&sz92CBBRegFile ; + pszAGCTableFile =(u8*)&sz92CAGCTableFile; + } + else{ + pszBBRegFile=(u8*)&sz88CBBRegFile ; + pszAGCTableFile =(u8*)&sz88CAGCTableFile; + } + + // + // 1. Read PHY_REG.TXT BB INIT!! + // We will seperate as 88C / 92C according to chip version + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile); +#endif + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } + +#if MP_DRIVER == 1 + // + // 1.1 Read PHY_REG_MP.TXT BB INIT!! + // We will seperate as 88C / 92C according to chip version + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithMpHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile); +#endif + + if(rtStatus != _SUCCESS){ +// RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg MP Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } +#endif // #if (MP_DRIVER == 1) + + // + // 20100318 Joseph: Config 2T2R to 1T2R if necessary. + // + if(pHalData->rf_type == RF_1T2R) + { + phy_BB8192C_Config_1T(Adapter); + DBG_8192C("phy_BB8192C_Config_ParaFile():Config to 1T!!\n"); + } + + // + // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt + // + if (pEEPROM->bautoload_fail_flag == _FALSE) + { + pHalData->pwrGroupCnt = 0; + +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithPgHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + rtStatus = phy_ConfigBBWithPgParaFile(Adapter, (u8*)&szBBRegPgFile); +#endif + } + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } + + // + // 3. BB AGC table Initialization + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_AGC_TAB); +#else + //RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_BB8192S_Config_ParaFile AGC_TAB.txt\n")); + rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile); +#endif + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_FPGA, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():AGC Table Fail\n")); + goto phy_BB8190_Config_ParaFile_Fail; + } + + // Check if the CCK HighPower is turned ON. + // This is used to calculate PWDB. + pHalData->bCckHighPower = (BOOLEAN)(PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, 0x200)); + +phy_BB8190_Config_ParaFile_Fail: + + return rtStatus; +} + + +int +PHY_BBConfig8192C( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 RegVal; + u8 TmpU1B=0; + u8 value8; + + phy_InitBBRFRegisterDefinition(Adapter); + + if(IS_HARDWARE_TYPE_8723(Adapter)) + { + // Suggested by Scott. tynli_test. 2010.12.30. + //1. 0x28[1] = 1 + TmpU1B = rtw_read8(Adapter, REG_AFE_PLL_CTRL); + rtw_udelay_os(2); + rtw_write8(Adapter, REG_AFE_PLL_CTRL, (TmpU1B|BIT1)); + rtw_udelay_os(2); + + //2. 0x29[7:0] = 0xFF + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xff); + rtw_udelay_os(2); + + //3. 0x02[1:0] = 2b'11 + TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN); + rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB)); + + //4. 0x25[6] = 0 + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+1); + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, (TmpU1B&(~BIT6))); + + //5. 0x24[20] = 0 //Advised by SD3 Alex Wang. 2011.02.09. + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+2); + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+2, (TmpU1B&(~BIT4))); + + //6. 0x1f[7:0] = 0x07 + rtw_write8(Adapter, REG_RF_CTRL, 0x07); + } + else + { + // Enable BB and RF + RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN); + rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1)); + + // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83); + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb); + + rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB); + +#ifdef CONFIG_USB_HCI + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB); +#else + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB); +#endif + + // 2009/10/21 by SD1 Jong. Modified by tynli. Not in Documented in V8.1. + if(!IS_NORMAL_CHIP(pHalData->VersionID)) + { +#ifdef CONFIG_USB_HCI + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x1f); +#else + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x1b); +#endif + } + else + { +#ifdef CONFIG_USB_HCI + //To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23. + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x0f); + rtw_write8(Adapter, 0x15, 0xe9); +#endif + } + + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80); + +#ifdef CONFIG_PCI_HCI + // Force use left antenna by default for 88C. + // if(!IS_92C_SERIAL(pHalData->VersionID) || IS_92C_1T2R(pHalData->VersionID)) + if(Adapter->ledpriv.LedStrategy != SW_LED_MODE10) + { + RegVal = rtw_read32(Adapter, REG_LEDCFG0); + rtw_write32(Adapter, REG_LEDCFG0, RegVal|BIT23); + } +#endif + } + + // + // Config BB and AGC + // + rtStatus = phy_BB8192C_Config_ParaFile(Adapter); +#if 0 + switch(Adapter->MgntInfo.bRegHwParaFile) + { + case 0: + phy_BB8190_Config_HardCode(Adapter); + break; + + case 1: + rtStatus = phy_BB8192C_Config_ParaFile(Adapter); + break; + + case 2: + // Partial Modify. + phy_BB8190_Config_HardCode(Adapter); + phy_BB8192C_Config_ParaFile(Adapter); + break; + + default: + phy_BB8190_Config_HardCode(Adapter); + break; + } +#endif +#ifdef CONFIG_USB_HCI + if(IS_HARDWARE_TYPE_8192CU(Adapter)&&IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) + &&(pHalData->BoardType == BOARD_USB_High_PA)) + rtw_write8(Adapter, 0xc72, 0x50); +#endif + + // For fix 8723 WL_TRSW bug. Suggested by Scott. 2011.01.24. + if(IS_HARDWARE_TYPE_8723(Adapter)) + { + if(!IS_NORMAL_CHIP(pHalData->VersionID)) + { + // 1. 0x40[2] = 1 + value8 = rtw_read8(Adapter, REG_GPIO_MUXCFG); + rtw_write8(Adapter, REG_GPIO_MUXCFG, (value8|BIT2)); + + // 2. 0x804[14] = 0 // BB disable TRSW control, enable SW control + PHY_SetBBReg(Adapter, rFPGA0_TxInfo, BIT14, 0x0); + + // 3. 0x870[6:5] = 2'b11 + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFInterfaceSW, (BIT5|BIT6), 0x3); + + // 4. 0x860[6:5] = 2'b00 // BB SW control TRSW pin output level + PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, (BIT5|BIT6), 0x0); + } + } +#if 0 + // Check BB/RF confiuration setting. + // We only need to configure RF which is turned on. + PathMap = (u1Byte)(PHY_QueryBBReg(Adapter, rFPGA0_TxInfo, 0xf) | + PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf)); + pHalData->RF_PathMap = PathMap; + for(index = 0; index<4; index++) + { + if((PathMap>>index)&0x1) + rf_num++; + } + + if((GET_RF_TYPE(Adapter) ==RF_1T1R && rf_num!=1) || + (GET_RF_TYPE(Adapter)==RF_1T2R && rf_num!=2) || + (GET_RF_TYPE(Adapter)==RF_2T2R && rf_num!=2) || + (GET_RF_TYPE(Adapter)==RF_2T2R_GREEN && rf_num!=2) || + (GET_RF_TYPE(Adapter)==RF_2T4R && rf_num!=4)) + { + RT_TRACE( + COMP_INIT, + DBG_LOUD, + ("PHY_BBConfig8192C: RF_Type(%x) does not match RF_Num(%x)!!\n", pHalData->RF_Type, rf_num)); + } +#endif + + return rtStatus; +} + + +int +PHY_RFConfig8192C( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // + // RF config + // + rtStatus = PHY_RF6052_Config8192C(Adapter); +#if 0 + switch(pHalData->rf_chip) + { + case RF_6052: + rtStatus = PHY_RF6052_Config(Adapter); + break; + case RF_8225: + rtStatus = PHY_RF8225_Config(Adapter); + break; + case RF_8256: + rtStatus = PHY_RF8256_Config(Adapter); + break; + case RF_8258: + break; + case RF_PSEUDO_11N: + rtStatus = PHY_RF8225_Config(Adapter); + break; + default: //for MacOs Warning: "RF_TYPE_MIN" not handled in switch + break; + } +#endif + return rtStatus; +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_ConfigRFWithParaFile() + * + * Overview: This function read RF parameters from general file format, and do RF 3-wire + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * RF90_RADIO_PATH_E eRFPath + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: Delay may be required for RF configuration + *---------------------------------------------------------------------------*/ +int +rtl8192c_PHY_ConfigRFWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName, + RF90_RADIO_PATH_E eRFPath +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + + return rtStatus; + +} + +//**************************************** +// The following is for High Power PA +//**************************************** +#define HighPowerRadioAArrayLen 22 +//This is for High power PA +u32 Rtl8192S_HighPower_RadioA_Array[HighPowerRadioAArrayLen] = { +0x013,0x00029ea4, +0x013,0x00025e74, +0x013,0x00020ea4, +0x013,0x0001ced0, +0x013,0x00019f40, +0x013,0x00014e70, +0x013,0x000106a0, +0x013,0x0000c670, +0x013,0x000082a0, +0x013,0x00004270, +0x013,0x00000240, +}; + +int +PHY_ConfigRFExternalPA( + IN PADAPTER Adapter, + RF90_RADIO_PATH_E eRFPath +) +{ + int rtStatus = _SUCCESS; +#ifdef CONFIG_USB_HCI + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 i=0; + + if(!pHalData->ExternalPA) + { + return rtStatus; + } + + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the + // same code as SU. It is already updated in radio_a_1T_HP.txt. +#if 0 + //add for SU High Power PA + for(i = 0;iVersionID)) + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + RadioA_ArrayLen = RadioA_2TArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_2TArray; + RadioB_ArrayLen = RadioB_2TArrayLength; + Rtl819XRadioB_Array_Table = Rtl819XRadioB_2TArray; + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + else + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + RadioA_ArrayLen = RadioA_1TArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1TArray; + RadioB_ArrayLen = RadioB_1TArrayLength; + Rtl819XRadioB_Array_Table = Rtl819XRadioB_1TArray; +#ifdef CONFIG_USB_HCI + if( BOARD_MINICARD == pHalData->BoardType ) + { + RadioA_ArrayLen = RadioA_1T_mCardArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_mCardArray; + RadioB_ArrayLen = RadioB_1T_mCardArrayLength; + Rtl819XRadioB_Array_Table = Rtl819XRadioB_1T_mCardArray; + } + else if( BOARD_USB_High_PA == pHalData->BoardType ) + { + RadioA_ArrayLen = RadioA_1T_HPArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_HPArray; + } +#endif + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + + switch(eRFPath){ + case RF90_PATH_A: + for(i = 0;i actually we call PlatformStallExecution()) to do NdisStallExecution() + // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK + // to run at Dispatch level to achive it. + //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK); + WriteData[i] &= 0xfff; + PHY_SetRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]); + // TODO: we should not delay for such a long time. Ask SD3 + rtw_mdelay_os(10); + ulRegRead = PHY_QueryRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord); + rtw_mdelay_os(10); + //cosa PlatformReleaseSpinLock(Adapter, RT_INITIAL_SPINLOCK); + break; + + default: + rtStatus = _FAIL; + break; + } + + + // + // Check whether readback data is correct + // + if(ulRegRead != WriteData[i]) + { + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("ulRegRead: %lx, WriteData: %lx \n", ulRegRead, WriteData[i])); + rtStatus = _FAIL; + break; + } + } + + return rtStatus; +} + + +VOID +rtl8192c_PHY_GetHWRegOriginalValue( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // read rx initial gain + pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0); + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n", + //pHalData->DefaultInitialGain[0], pHalData->DefaultInitialGain[1], + //pHalData->DefaultInitialGain[2], pHalData->DefaultInitialGain[3])); + + // read framesync + pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0); + pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Default framesync (0x%x) = 0x%x \n", + // rOFDM0_RxDetector3, pHalData->framesync)); +} + + +// +// Description: +// Map dBm into Tx power index according to +// current HW model, for example, RF and PA, and +// current wireless mode. +// By Bruce, 2008-01-29. +// +static u8 +phy_DbmToTxPwrIdx( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN int PowerInDbm + ) +{ + u8 TxPwrIdx = 0; + int Offset = 0; + + + // + // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to + // 3dbm, and OFDM HT equals to 0dbm repectively. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + Offset = -7; + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + break; + default: + Offset = -8; + break; + } + + if((PowerInDbm - Offset) > 0) + { + TxPwrIdx = (u8)((PowerInDbm - Offset) * 2); + } + else + { + TxPwrIdx = 0; + } + + // Tx Power Index is too large. + if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S) + TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S; + + return TxPwrIdx; +} + +// +// Description: +// Map Tx power index into dBm according to +// current HW model, for example, RF and PA, and +// current wireless mode. +// By Bruce, 2008-01-29. +// +int +phy_TxPwrIdxToDbm( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN u8 TxPwrIdx + ) +{ + int Offset = 0; + int PwrOutDbm = 0; + + // + // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + Offset = -7; + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + default: + Offset = -8; + break; + } + + PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part. + + return PwrOutDbm; +} + + +/*----------------------------------------------------------------------------- + * Function: GetTxPowerLevel8190() + * + * Overview: This function is export to "common" moudule + * + * Input: PADAPTER Adapter + * psByte Power Level + * + * Output: NONE + * + * Return: NONE + * + *---------------------------------------------------------------------------*/ +VOID +PHY_GetTxPowerLevel8192C( + IN PADAPTER Adapter, + OUT u32* powerlevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxPwrLevel = 0; + int TxPwrDbm; + + // + // Because the Tx power indexes are different, we report the maximum of them to + // meet the CCX TPC request. By Bruce, 2008-01-31. + // + + // CCK + TxPwrLevel = pHalData->CurrentCckTxPwrIdx; + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); + + // Legacy OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; + + // Compare with Legacy OFDM Tx power. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); + + // HT OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; + + // Compare with HT OFDM Tx power. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); + + *powerlevel = TxPwrDbm; +} + + +static void getTxPowerIndex( + IN PADAPTER Adapter, + IN u8 channel, + IN OUT u8* cckPowerLevel, + IN OUT u8* ofdmPowerLevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 index = (channel -1); + // 1. CCK + cckPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelCck[RF90_PATH_A][index]; //RF-A + cckPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelCck[RF90_PATH_B][index]; //RF-B + + // 2. OFDM for 1S or 2S + if (GET_RF_TYPE(Adapter) == RF_1T2R || GET_RF_TYPE(Adapter) == RF_1T1R) + { + // Read HT 40 OFDM TX power + ofdmPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelHT40_1S[RF90_PATH_A][index]; + ofdmPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelHT40_1S[RF90_PATH_B][index]; + } + else if (GET_RF_TYPE(Adapter) == RF_2T2R) + { + // Read HT 40 OFDM TX power + ofdmPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelHT40_2S[RF90_PATH_A][index]; + ofdmPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelHT40_2S[RF90_PATH_B][index]; + } + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, set tx power index !!\n", channel)); +} + +static void ccxPowerIndexCheck( + IN PADAPTER Adapter, + IN u8 channel, + IN OUT u8* cckPowerLevel, + IN OUT u8* ofdmPowerLevel + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo); + + // + // CCX 2 S31, AP control of client transmit power: + // 1. We shall not exceed Cell Power Limit as possible as we can. + // 2. Tolerance is +/- 5dB. + // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit. + // + // TODO: + // 1. 802.11h power contraint + // + // 071011, by rcnjko. + // + if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE && + pMgntInfo->mAssoc && + pCcxInfo->bUpdateCcxPwr && + pCcxInfo->bWithCcxCellPwr && + channel == pMgntInfo->dot11CurrentChannelNumber) + { + u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr); + u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr); + u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr); + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx)); + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + + // CCK + if(cckPowerLevel[0] > CckCellPwrIdx) + cckPowerLevel[0] = CckCellPwrIdx; + // Legacy OFDM, HT OFDM + if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx) + { + if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0) + { + ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff; + } + else + { + ofdmPowerLevel[0] = 0; + } + } + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + } + + pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; + pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("PHY_SetTxPowerLevel8192S(): CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); +#endif +} +/*----------------------------------------------------------------------------- + * Function: SetTxPowerLevel8190() + * + * Overview: This function is export to "HalCommon" moudule + * We must consider RF path later!!!!!!! + * + * Input: PADAPTER Adapter + * u1Byte channel + * + * Output: NONE + * + * Return: NONE + * 2008/11/04 MHC We remove EEPROM_93C56. + * We need to move CCX relative code to independet file. + * 2009/01/21 MHC Support new EEPROM format from SD3 requirement. + * + *---------------------------------------------------------------------------*/ +VOID +PHY_SetTxPowerLevel8192C( + IN PADAPTER Adapter, + IN u8 channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 cckPowerLevel[2], ofdmPowerLevel[2]; // [0]:RF-A, [1]:RF-B + +#if(MP_DRIVER == 1) + return; +#endif + + if(pHalData->bTXPowerDataReadFromEEPORM == _FALSE) + return; + + getTxPowerIndex(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x, ofdmPowerLevel (A / B) = 0x%x / 0x%x\n", + // channel, cckPowerLevel[0], cckPowerLevel[1], ofdmPowerLevel[0], ofdmPowerLevel[1])); + + ccxPowerIndexCheck(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); + + rtl8192c_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); + rtl8192c_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); + +#if 0 + switch(pHalData->rf_chip) + { + case RF_8225: + PHY_SetRF8225CckTxPower(Adapter, cckPowerLevel[0]); + PHY_SetRF8225OfdmTxPower(Adapter, ofdmPowerLevel[0]); + break; + + case RF_8256: + PHY_SetRF8256CCKTxPower(Adapter, cckPowerLevel[0]); + PHY_SetRF8256OFDMTxPower(Adapter, ofdmPowerLevel[0]); + break; + + case RF_6052: + PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); + PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); + break; + + case RF_8258: + break; + } +#endif + +} + + +// +// Description: +// Update transmit power level of all channel supported. +// +// TODO: +// A mode. +// By Bruce, 2008-02-04. +// +BOOLEAN +PHY_UpdateTxPowerDbm8192C( + IN PADAPTER Adapter, + IN int powerInDbm + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 idx; + u8 rf_path; + + // TODO: A mode Tx power. + u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm); + u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm); + + if(OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0) + OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff; + else + OfdmTxPwrIdx = 0; + + //RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_UpdateTxPowerDbm8192S(): %ld dBm , CckTxPwrIdx = %d, OfdmTxPwrIdx = %d\n", powerInDbm, CckTxPwrIdx, OfdmTxPwrIdx)); + + for(idx = 0; idx < 14; idx++) + { + for (rf_path = 0; rf_path < 2; rf_path++) + { + pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx; + pHalData->TxPwrLevelHT40_1S[rf_path][idx] = + pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx; + } + } + + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel);//gtest:todo + + return _TRUE; +} + + +/* + Description: + When beacon interval is changed, the values of the + hw registers should be modified. + By tynli, 2008.10.24. + +*/ + + +void +rtl8192c_PHY_SetBeaconHwReg( + IN PADAPTER Adapter, + IN u16 BeaconInterval + ) +{ + +} + + +VOID +PHY_ScanOperationBackup8192C( + IN PADAPTER Adapter, + IN u8 Operation + ) +{ +#if 0 + IO_TYPE IoType; + + if(!Adapter->bDriverStopped) + { + switch(Operation) + { + case SCAN_OPT_BACKUP: + IoType = IO_CMD_PAUSE_DM_BY_SCAN; + Adapter->HalFunc.SetHwRegHandler(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); + + break; + + case SCAN_OPT_RESTORE: + IoType = IO_CMD_RESUME_DM_BY_SCAN; + Adapter->HalFunc.SetHwRegHandler(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); + break; + + default: + RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n")); + break; + } + } +#endif +} + +/*----------------------------------------------------------------------------- + * Function: PHY_SetBWModeCallback8192C() + * + * Overview: Timer callback function for SetSetBWMode + * + * Input: PRT_TIMER pTimer + * + * Output: NONE + * + * Return: NONE + * + * Note: (1) We do not take j mode into consideration now + * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run + * concurrently? + *---------------------------------------------------------------------------*/ +static VOID +_PHY_SetBWMode92C( + IN PADAPTER Adapter +) +{ +// PADAPTER Adapter = (PADAPTER)pTimer->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 regBwOpMode; + u8 regRRSR_RSC; + + //return; + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //u4Byte NowL, NowH; + //u8Byte BeginTime, EndTime; + + /*RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SetBWModeCallback8192C() Switch to %s bandwidth\n", \ + pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"))*/ + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SetBWModeInProgress= _FALSE; + return; + } + + // There is no 40MHz mode in RF_8225. + if(pHalData->rf_chip==RF_8225) + return; + + if(Adapter->bDriverStopped) + return; + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //NowL = PlatformEFIORead4Byte(Adapter, TSFR); + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); + //BeginTime = ((u8Byte)NowH << 32) + NowL; + + //3// + //3//<1>Set MAC register + //3// + //Adapter->HalFunc.SetBWModeHandler(); + + regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE); + regRRSR_RSC = rtw_read8(Adapter, REG_RRSR+2); + //regBwOpMode = Adapter->HalFunc.GetHwRegHandler(Adapter,HW_VAR_BWMODE,(pu1Byte)®BwOpMode); + + switch(pHalData->CurrentChannelBW) + { + case HT_CHANNEL_WIDTH_20: + regBwOpMode |= BW_OPMODE_20MHZ; + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); + break; + + case HT_CHANNEL_WIDTH_40: + regBwOpMode &= ~BW_OPMODE_20MHZ; + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); + + regRRSR_RSC = (regRRSR_RSC&0x90) |(pHalData->nCur40MhzPrimeSC<<5); + rtw_write8(Adapter, REG_RRSR+2, regRRSR_RSC); + break; + + default: + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): + unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW));*/ + break; + } + + //3// + //3//<2>Set PHY related register + //3// + switch(pHalData->CurrentChannelBW) + { + /* 20 MHz channel*/ + case HT_CHANNEL_WIDTH_20: + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0); + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0); + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1); + + break; + + + /* 40 MHz channel*/ + case HT_CHANNEL_WIDTH_40: + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1); + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1); + + // Set Control channel to upper or lower. These settings are required only for 40MHz + PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1)); + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC); + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0); + + PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1); + + break; + + + + default: + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): unknown Bandwidth: %#X\n"\ + ,pHalData->CurrentChannelBW));*/ + break; + + } + //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315 + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //NowL = PlatformEFIORead4Byte(Adapter, TSFR); + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); + //EndTime = ((u8Byte)NowH << 32) + NowL; + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime))); + + //3<3>Set RF related register + switch(pHalData->rf_chip) + { + case RF_8225: + //PHY_SetRF8225Bandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + case RF_8256: + // Please implement this function in Hal8190PciPhy8256.c + //PHY_SetRF8256Bandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + case RF_8258: + // Please implement this function in Hal8190PciPhy8258.c + // PHY_SetRF8258Bandwidth(); + break; + + case RF_PSEUDO_11N: + // Do Nothing + break; + + case RF_6052: + rtl8192c_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + default: + //RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); + break; + } + + //pHalData->SetBWModeInProgress= FALSE; + + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SetBWModeCallback8192C() \n" )); +} + + + /*----------------------------------------------------------------------------- + * Function: SetBWMode8190Pci() + * + * Overview: This function is export to "HalCommon" moudule + * + * Input: PADAPTER Adapter + * HT_CHANNEL_WIDTH Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: We do not take j mode into consideration now + *---------------------------------------------------------------------------*/ +VOID +PHY_SetBWMode8192C( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth, // 20M or 40M + IN unsigned char Offset // Upper, Lower, or Don't care +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + HT_CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW; + // Modified it for 20/40 mhz switch by guangan 070531 + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; + + //return; + + //if(pHalData->SwChnlInProgress) +// if(pMgntInfo->bScanInProgress) +// { +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s Exit because bScanInProgress!\n", +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); +// return; +// } + +// if(pHalData->SetBWModeInProgress) +// { +// // Modified it for 20/40 mhz switch by guangan 070531 +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s cancel last timer because SetBWModeInProgress!\n", +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); +// PlatformCancelTimer(Adapter, &pHalData->SetBWModeTimer); +// //return; +// } + + //if(pHalData->SetBWModeInProgress) + // return; + + //pHalData->SetBWModeInProgress= TRUE; + + pHalData->CurrentChannelBW = Bandwidth; + +#if 0 + if(Offset==HT_EXTCHNL_OFFSET_LOWER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; + else if(Offset==HT_EXTCHNL_OFFSET_UPPER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; + else + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; +#else + pHalData->nCur40MhzPrimeSC = Offset; +#endif + + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) + { +#ifdef USE_WORKITEM + //PlatformScheduleWorkItem(&(pHalData->SetBWModeWorkItem)); +#else + #if 0 + //PlatformSetTimer(Adapter, &(pHalData->SetBWModeTimer), 0); + #else + _PHY_SetBWMode92C(Adapter); + #endif +#endif + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() SetBWModeInProgress FALSE driver sleep or unload\n")); + //pHalData->SetBWModeInProgress= FALSE; + pHalData->CurrentChannelBW = tmpBW; + } + +} + + +static void _PHY_SwChnl8192C(PADAPTER Adapter, u8 channel) +{ + u8 eRFPath; + u32 param1, param2; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //s1. pre common command - CmdID_SetTxPowerLevel + PHY_SetTxPowerLevel8192C(Adapter, channel); + + //s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel + param1 = RF_CHNLBW; + param2 = channel; + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); + } + + + //s3. post common command - CmdID_End, None + +} + +VOID +PHY_SwChnl8192C( // Call after initialization + IN PADAPTER Adapter, + IN u8 channel + ) +{ + //PADAPTER Adapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, _TRUE); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 tmpchannel = pHalData->CurrentChannel; + BOOLEAN bResult = _TRUE; + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SwChnlInProgress=FALSE; + return; //return immediately if it is peudo-phy + } + + //if(pHalData->SwChnlInProgress) + // return; + + //if(pHalData->SetBWModeInProgress) + // return; + + //-------------------------------------------- + switch(pHalData->CurrentWirelessMode) + { + case WIRELESS_MODE_A: + case WIRELESS_MODE_N_5G: + //RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14")); + break; + + case WIRELESS_MODE_B: + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_B but channel>14")); + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14")); + break; + + default: + //RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode)); + break; + } + //-------------------------------------------- + + //pHalData->SwChnlInProgress = TRUE; + if(channel == 0) + channel = 1; + + pHalData->CurrentChannel=channel; + + //pHalData->SwChnlStage=0; + //pHalData->SwChnlStep=0; + + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) + { +#ifdef USE_WORKITEM + //bResult = PlatformScheduleWorkItem(&(pHalData->SwChnlWorkItem)); +#else + #if 0 + //PlatformSetTimer(Adapter, &(pHalData->SwChnlTimer), 0); + #else + _PHY_SwChnl8192C(Adapter, channel); + #endif +#endif + if(bResult) + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress TRUE schdule workitem done\n")); + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE schdule workitem error\n")); + //if(IS_HARDWARE_TYPE_8192SU(Adapter)) + //{ + // pHalData->SwChnlInProgress = FALSE; + pHalData->CurrentChannel = tmpchannel; + //} + } + + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE driver sleep or unload\n")); + //if(IS_HARDWARE_TYPE_8192SU(Adapter)) + //{ + // pHalData->SwChnlInProgress = FALSE; + pHalData->CurrentChannel = tmpchannel; + //} + } +} + + +static BOOLEAN +phy_SwChnlStepByStep( + IN PADAPTER Adapter, + IN u8 channel, + IN u8 *stage, + IN u8 *step, + OUT u32 *delay + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PCHANNEL_ACCESS_SETTING pChnlAccessSetting; + SwChnlCmd PreCommonCmd[MAX_PRECMD_CNT]; + u4Byte PreCommonCmdCnt; + SwChnlCmd PostCommonCmd[MAX_POSTCMD_CNT]; + u4Byte PostCommonCmdCnt; + SwChnlCmd RfDependCmd[MAX_RFDEPENDCMD_CNT]; + u4Byte RfDependCmdCnt; + SwChnlCmd *CurrentCmd; + u1Byte eRFPath; + u4Byte RfTXPowerCtrl; + BOOLEAN bAdjRfTXPowerCtrl = _FALSE; + + + RT_ASSERT((Adapter != NULL), ("Adapter should not be NULL\n")); +#if(MP_DRIVER != 1) + RT_ASSERT(IsLegalChannel(Adapter, channel), ("illegal channel: %d\n", channel)); +#endif + RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n")); + + pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting; + RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n")); + + //for(eRFPath = RF90_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + //{ + // <1> Fill up pre common command. + PreCommonCmdCnt = 0; + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, + CmdID_SetTxPowerLevel, 0, 0, 0); + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, + CmdID_End, 0, 0, 0); + + // <2> Fill up post common command. + PostCommonCmdCnt = 0; + + phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT, + CmdID_End, 0, 0, 0); + + // <3> Fill up RF dependent command. + RfDependCmdCnt = 0; + switch( pHalData->RFChipID ) + { + case RF_8225: + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + // 2008/09/04 MH Change channel. + if(channel==14) channel++; + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, rZebra1_Channel, (0x10+channel-1), 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + break; + + case RF_8256: + // TEST!! This is not the table for 8256!! + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, rRfChannel, channel, 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + break; + + case RF_6052: + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, RF_CHNLBW, channel, 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + + break; + + case RF_8258: + break; + + // For FPGA two MAC verification + case RF_PSEUDO_11N: + return TRUE; + default: + RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); + return FALSE; + break; + } + + + do{ + switch(*stage) + { + case 0: + CurrentCmd=&PreCommonCmd[*step]; + break; + case 1: + CurrentCmd=&RfDependCmd[*step]; + break; + case 2: + CurrentCmd=&PostCommonCmd[*step]; + break; + } + + if(CurrentCmd->CmdID==CmdID_End) + { + if((*stage)==2) + { + return TRUE; + } + else + { + (*stage)++; + (*step)=0; + continue; + } + } + + switch(CurrentCmd->CmdID) + { + case CmdID_SetTxPowerLevel: + PHY_SetTxPowerLevel8192C(Adapter,channel); + break; + case CmdID_WritePortUlong: + PlatformEFIOWrite4Byte(Adapter, CurrentCmd->Para1, CurrentCmd->Para2); + break; + case CmdID_WritePortUshort: + PlatformEFIOWrite2Byte(Adapter, CurrentCmd->Para1, (u2Byte)CurrentCmd->Para2); + break; + case CmdID_WritePortUchar: + PlatformEFIOWrite1Byte(Adapter, CurrentCmd->Para1, (u1Byte)CurrentCmd->Para2); + break; + case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!! + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { +#if 1 + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | CurrentCmd->Para2); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); +#else + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, (CurrentCmd->Para2)); +#endif + } + break; + } + + break; + }while(TRUE); + //cosa }/*for(Number of RF paths)*/ + + (*delay)=CurrentCmd->msDelay; + (*step)++; + return FALSE; +#endif + return _TRUE; +} + + +static BOOLEAN +phy_SetSwChnlCmdArray( + SwChnlCmd* CmdTable, + u32 CmdTableIdx, + u32 CmdTableSz, + SwChnlCmdID CmdID, + u32 Para1, + u32 Para2, + u32 msDelay + ) +{ + SwChnlCmd* pCmd; + + if(CmdTable == NULL) + { + //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n")); + return _FALSE; + } + if(CmdTableIdx >= CmdTableSz) + { + //RT_ASSERT(FALSE, + // ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%ld, CmdTableSz:%ld\n", + // CmdTableIdx, CmdTableSz)); + return _FALSE; + } + + pCmd = CmdTable + CmdTableIdx; + pCmd->CmdID = CmdID; + pCmd->Para1 = Para1; + pCmd->Para2 = Para2; + pCmd->msDelay = msDelay; + + return _TRUE; +} + + +static void +phy_FinishSwChnlNow( // We should not call this function directly + IN PADAPTER Adapter, + IN u8 channel + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 delay; + + while(!phy_SwChnlStepByStep(Adapter,channel,&pHalData->SwChnlStage,&pHalData->SwChnlStep,&delay)) + { + if(delay>0) + rtw_mdelay_os(delay); + } +#endif +} + + + +// +// Description: +// Switch channel synchronously. Called by SwChnlByDelayHandler. +// +// Implemented by Bruce, 2008-02-14. +// The following procedure is operted according to SwChanlCallback8190Pci(). +// However, this procedure is performed synchronously which should be running under +// passive level. +// +VOID +PHY_SwChnlPhy8192C( // Only called during initialize + IN PADAPTER Adapter, + IN u8 channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlPhy8192S(), switch from channel %d to channel %d.\n", pHalData->CurrentChannel, channel)); + + // Cannot IO. + //if(RT_CANNOT_IO(Adapter)) + // return; + + // Channel Switching is in progress. + //if(pHalData->SwChnlInProgress) + // return; + + //return immediately if it is peudo-phy + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SwChnlInProgress=FALSE; + return; + } + + //pHalData->SwChnlInProgress = TRUE; + if( channel == 0) + channel = 1; + + pHalData->CurrentChannel=channel; + + //pHalData->SwChnlStage = 0; + //pHalData->SwChnlStep = 0; + + phy_FinishSwChnlNow(Adapter,channel); + + //pHalData->SwChnlInProgress = FALSE; +} + + +// +// Description: +// Configure H/W functionality to enable/disable Monitor mode. +// Note, because we possibly need to configure BB and RF in this function, +// so caller should in PASSIVE_LEVEL. 080118, by rcnjko. +// +VOID +PHY_SetMonitorMode8192C( + IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN bFilterOutNonAssociatedBSSID = FALSE; + + //2 Note: we may need to stop antenna diversity. + if(bEnableMonitorMode) + { + bFilterOutNonAssociatedBSSID = FALSE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): enable monitor mode\n")); + + pHalData->bInMonitorMode = TRUE; + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE); + pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); + } + else + { + bFilterOutNonAssociatedBSSID = TRUE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): disable monitor mode\n")); + + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE); + pHalData->bInMonitorMode = FALSE; + pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); + } +#endif +} + + +/*----------------------------------------------------------------------------- + * Function: PHYCheckIsLegalRfPath8190Pci() + * + * Overview: Check different RF type to execute legal judgement. If RF Path is illegal + * We will return false. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/15/2007 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +BOOLEAN +PHY_CheckIsLegalRfPath8192C( + IN PADAPTER pAdapter, + IN u32 eRFPath) +{ +// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN rtValue = _TRUE; + + // NOt check RF Path now.! +#if 0 + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF90_PATH_A) + { + rtValue = FALSE; + } + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF90_PATH_A) + { + + } +#endif + return rtValue; + +} /* PHY_CheckIsLegalRfPath8192C */ + +//------------------------------------------------------------------------- +// +// IQK +// +//------------------------------------------------------------------------- +#define MAX_TOLERANCE 5 +#define IQK_DELAY_TIME 1 //ms + +static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK +_PHY_PathA_IQK( + IN PADAPTER pAdapter, + IN BOOLEAN configPathB + ) +{ + u32 regEAC, regE94, regE9C, regEA4; + u8 result = 0x00; + + //RTPRINT(FINIT, INIT_IQK, ("Path A IQK!\n")); + + //path-A IQK setting + //RTPRINT(FINIT, INIT_IQK, ("Path-A IQK setting!\n")); + PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x10008c1f); + PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x10008c1f); + PHY_SetBBReg(pAdapter, 0xe38, bMaskDWord, 0x82140102); + + PHY_SetBBReg(pAdapter, 0xe3c, bMaskDWord, configPathB ? 0x28160202 : 0x28160502); + +#if 1 + //path-B IQK setting + if(configPathB) + { + PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe58, bMaskDWord, 0x82140102); + PHY_SetBBReg(pAdapter, 0xe5c, bMaskDWord, 0x28160202); + } +#endif + //LO calibration setting + //RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n")); + PHY_SetBBReg(pAdapter, 0xe4c, bMaskDWord, 0x001028d1); + + //One shot, path A LOK & IQK + //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n")); + PHY_SetBBReg(pAdapter, 0xe48, bMaskDWord, 0xf9000000); + PHY_SetBBReg(pAdapter, 0xe48, bMaskDWord, 0xf8000000); + + // delay x ms + //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME)); + rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000); + + // Check failed + regEAC = PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC)); + regE94 = PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xe94 = 0x%x\n", regE94)); + regE9C= PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xe9c = 0x%x\n", regE9C)); + regEA4= PHY_QueryBBReg(pAdapter, 0xea4, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regEA4)); + + if(!(regEAC & BIT28) && + (((regE94 & 0x03FF0000)>>16) != 0x142) && + (((regE9C & 0x03FF0000)>>16) != 0x42) ) + result |= 0x01; + else //if Tx not OK, ignore Rx + return result; + + if(!(regEAC & BIT27) && //if Tx is OK, check whether Rx is OK + (((regEA4 & 0x03FF0000)>>16) != 0x132) && + (((regEAC & 0x03FF0000)>>16) != 0x36)) + result |= 0x02; + else + DBG_8192C("Path A Rx IQK fail!!\n"); + + return result; + + +} + +static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK +_PHY_PathB_IQK( + IN PADAPTER pAdapter + ) +{ + u32 regEAC, regEB4, regEBC, regEC4, regECC; + u8 result = 0x00; + //RTPRINT(FINIT, INIT_IQK, ("Path B IQK!\n")); +#if 0 + //path-B IQK setting + RTPRINT(FINIT, INIT_IQK, ("Path-B IQK setting!\n")); + PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe58, bMaskDWord, 0x82140102); + PHY_SetBBReg(pAdapter, 0xe5c, bMaskDWord, 0x28160202); + + //LO calibration setting + RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n")); + PHY_SetBBReg(pAdapter, 0xe4c, bMaskDWord, 0x001028d1); +#endif + //One shot, path B LOK & IQK + //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n")); + PHY_SetBBReg(pAdapter, 0xe60, bMaskDWord, 0x00000002); + PHY_SetBBReg(pAdapter, 0xe60, bMaskDWord, 0x00000000); + + // delay x ms + //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME)); + rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000); + + // Check failed + regEAC = PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC)); + regEB4 = PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regEB4)); + regEBC= PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xebc = 0x%x\n", regEBC)); + regEC4= PHY_QueryBBReg(pAdapter, 0xec4, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regEC4)); + regECC= PHY_QueryBBReg(pAdapter, 0xecc, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xecc = 0x%x\n", regECC)); + + if(!(regEAC & BIT31) && + (((regEB4 & 0x03FF0000)>>16) != 0x142) && + (((regEBC & 0x03FF0000)>>16) != 0x42)) + result |= 0x01; + else + return result; + + if(!(regEAC & BIT30) && + (((regEC4 & 0x03FF0000)>>16) != 0x132) && + (((regECC & 0x03FF0000)>>16) != 0x36)) + result |= 0x02; + else + DBG_8192C("Path B Rx IQK fail!!\n"); + + + return result; + +} + +static VOID +_PHY_PathAFillIQKMatrix( + IN PADAPTER pAdapter, + IN BOOLEAN bIQKOK, + IN int result[][8], + IN u8 final_candidate, + IN BOOLEAN bTxOnly + ) +{ + u32 Oldval_0, X, TX0_A, reg; + int Y, TX0_C; + + //DBG_8192C("Path A IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"); + + if(final_candidate == 0xFF) + return; + else if(bIQKOK) + { + Oldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF; + + X = result[final_candidate][0]; + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + TX0_A = (X * Oldval_0) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX0_A = 0x%lx, Oldval_0 0x%lx\n", X, TX0_A, Oldval_0)); + PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X* Oldval_0>>7) & 0x1)); + + Y = result[final_candidate][1]; + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + TX0_C = (Y * Oldval_0) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX = 0x%lx\n", Y, TX0_C)); + PHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6)); + PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F)); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y* Oldval_0>>7) & 0x1)); + + if(bTxOnly) + { + DBG_8192C("_PHY_PathAFillIQKMatrix only Tx OK\n"); + return; + } + + reg = result[final_candidate][2]; + PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg); + + reg = result[final_candidate][3] & 0x3F; + PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg); + + reg = (result[final_candidate][3] >> 6) & 0xF; + PHY_SetBBReg(pAdapter, 0xca0, 0xF0000000, reg); + } +} + +static VOID +_PHY_PathBFillIQKMatrix( + IN PADAPTER pAdapter, + IN BOOLEAN bIQKOK, + IN int result[][8], + IN u8 final_candidate, + IN BOOLEAN bTxOnly //do Tx only + ) +{ + u32 Oldval_1, X, TX1_A, reg; + int Y, TX1_C; + + DBG_8192C("Path B IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"); + + if(final_candidate == 0xFF) + return; + else if(bIQKOK) + { + Oldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF; + + X = result[final_candidate][4]; + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + TX1_A = (X * Oldval_1) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX1_A = 0x%lx\n", X, TX1_A)); + PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X* Oldval_1>>7) & 0x1)); + + Y = result[final_candidate][5]; + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + TX1_C = (Y * Oldval_1) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX1_C = 0x%lx\n", Y, TX1_C)); + PHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6)); + PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F)); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y* Oldval_1>>7) & 0x1)); + + if(bTxOnly) + return; + + reg = result[final_candidate][6]; + PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg); + + reg = result[final_candidate][7] & 0x3F; + PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg); + + reg = (result[final_candidate][7] >> 6) & 0xF; + PHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg); + } +} + +static VOID +_PHY_SaveADDARegisters( + IN PADAPTER pAdapter, + IN u32* ADDAReg, + IN u32* ADDABackup, + IN u32 RegisterNum + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n")); + for( i = 0 ; i < RegisterNum ; i++){ + ADDABackup[i] = PHY_QueryBBReg(pAdapter, ADDAReg[i], bMaskDWord); + } +} + +static VOID +_PHY_SaveMACRegisters( + IN PADAPTER pAdapter, + IN u32* MACReg, + IN u32* MACBackup + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Save MAC parameters.\n")); + for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + MACBackup[i] =rtw_read8(pAdapter, MACReg[i]); + } + MACBackup[i] = rtw_read32(pAdapter, MACReg[i]); + +} + +static VOID +_PHY_ReloadADDARegisters( + IN PADAPTER pAdapter, + IN u32* ADDAReg, + IN u32* ADDABackup, + IN u32 RegiesterNum + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n")); + for(i = 0 ; i < RegiesterNum ; i++){ + PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, ADDABackup[i]); + } +} + +static VOID +_PHY_ReloadMACRegisters( + IN PADAPTER pAdapter, + IN u32* MACReg, + IN u32* MACBackup + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Reload MAC parameters !\n")); + for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + rtw_write8(pAdapter, MACReg[i], (u8)MACBackup[i]); + } + rtw_write32(pAdapter, MACReg[i], MACBackup[i]); +} + +static VOID +_PHY_PathADDAOn( + IN PADAPTER pAdapter, + IN u32* ADDAReg, + IN BOOLEAN isPathAOn, + IN BOOLEAN is2T + ) +{ + u32 pathOn; + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("ADDA ON.\n")); + + pathOn = isPathAOn ? 0x04db25a4 : 0x0b1b25a4; + if(_FALSE == is2T){ + pathOn = 0x0bdb25a0; + PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, 0x0b1b25a0); + } + else{ + PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, pathOn); + } + + for( i = 1 ; i < IQK_ADDA_REG_NUM ; i++){ + PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, pathOn); + } + +} + +static VOID +_PHY_MACSettingCalibration( + IN PADAPTER pAdapter, + IN u32* MACReg, + IN u32* MACBackup + ) +{ + u32 i = 0; + + //RTPRINT(FINIT, INIT_IQK, ("MAC settings for Calibration.\n")); + + rtw_write8(pAdapter, MACReg[i], 0x3F); + + for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){ + rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT3))); + } + rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT5))); + +} + +static VOID +_PHY_PathAStandBy( + IN PADAPTER pAdapter + ) +{ + //RTPRINT(FINIT, INIT_IQK, ("Path-A standby mode!\n")); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x0); + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80800000); +} + +static VOID +_PHY_PIModeSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN PIMode + ) +{ + u32 mode; + + //RTPRINT(FINIT, INIT_IQK, ("BB Switch to %s mode!\n", (PIMode ? "PI" : "SI"))); + + mode = PIMode ? 0x01000100 : 0x01000000; + PHY_SetBBReg(pAdapter, 0x820, bMaskDWord, mode); + PHY_SetBBReg(pAdapter, 0x828, bMaskDWord, mode); +} + +/* +return _FALSE => do IQK again +*/ +static BOOLEAN +_PHY_SimularityCompare( + IN PADAPTER pAdapter, + IN int result[][8], + IN u8 c1, + IN u8 c2 + ) +{ + u32 i, j, diff, SimularityBitMap, bound = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 final_candidate[2] = {0xFF, 0xFF}; //for path A and path B + BOOLEAN bResult = _TRUE, is2T = IS_92C_SERIAL( pHalData->VersionID); + + if(is2T) + bound = 8; + else + bound = 4; + + SimularityBitMap = 0; + + for( i = 0; i < bound; i++ ) + { + diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]); + if (diff > MAX_TOLERANCE) + { + if((i == 2 || i == 6) && !SimularityBitMap) + { + if(result[c1][i]+result[c1][i+1] == 0) + final_candidate[(i/4)] = c2; + else if (result[c2][i]+result[c2][i+1] == 0) + final_candidate[(i/4)] = c1; + else + SimularityBitMap = SimularityBitMap|(1<dmpriv; + u32 i; + u8 PathAOK, PathBOK; + u32 ADDA_REG[IQK_ADDA_REG_NUM] = { 0x85c, 0xe6c, 0xe70, 0xe74, + 0xe78, 0xe7c, 0xe80, 0xe84, + 0xe88, 0xe8c, 0xed0, 0xed4, + 0xed8, 0xedc, 0xee0, 0xeec }; + + u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {0x522, 0x550, 0x551,0x040}; + + u32 IQK_BB_REG[IQK_BB_REG_NUM] = { + 0xc04, 0xc08, 0x874, 0xb68, 0xb6c, + 0x870, 0x860, 0x864, 0x800 + }; + +#if MP_DRIVER + const u32 retryCount = 9; +#else + const u32 retryCount = 2; +#endif + + // Note: IQ calibration must be performed after loading + // PHY_REG.txt , and radio_a, radio_b.txt + + u32 bbvalue; + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + + if(t==0) + { + bbvalue = PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("PHY_IQCalibrate()==>0x%08lx\n",bbvalue)); + + //RTPRINT(FINIT, INIT_IQK, ("IQ Calibration for %s\n", (is2T ? "2T2R" : "1T1R"))); + + // Save ADDA parameters, turn Path A ADDA on + _PHY_SaveADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup,IQK_ADDA_REG_NUM); + _PHY_SaveMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); + _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM); + } + _PHY_PathADDAOn(pAdapter, ADDA_REG, _TRUE, is2T); + + if(t==0) + { + pdmpriv->bRfPiEnable = (u8)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8)); + } + + if(!pdmpriv->bRfPiEnable){ + // Switch BB to PI mode to do IQ Calibration. + _PHY_PIModeSwitch(pAdapter, _TRUE); + } + + PHY_SetBBReg(pAdapter, 0x800, BIT24, 0x00); + PHY_SetBBReg(pAdapter, 0xc04, bMaskDWord, 0x03a05600); + PHY_SetBBReg(pAdapter, 0xc08, bMaskDWord, 0x000800e4); + PHY_SetBBReg(pAdapter, 0x874, bMaskDWord, 0x22204000); + PHY_SetBBReg(pAdapter, 0x870, BIT10, 0x01); + PHY_SetBBReg(pAdapter, 0x870, BIT26, 0x01); + PHY_SetBBReg(pAdapter, 0x860, BIT10, 0x00); + PHY_SetBBReg(pAdapter, 0x864, BIT10, 0x00); + + if(is2T) + { + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000); + PHY_SetBBReg(pAdapter, 0x844, bMaskDWord, 0x00010000); + } + + //MAC settings + _PHY_MACSettingCalibration(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); + + //Page B init + if(isNormal) + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00080000); + else + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0f600000); + + if(is2T) + { + if(isNormal) + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00080000); + else + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x0f600000); + } + + // IQ calibration setting + //RTPRINT(FINIT, INIT_IQK, ("IQK setting!\n")); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80800000); + PHY_SetBBReg(pAdapter, 0xe40, bMaskDWord, 0x01007c00); + PHY_SetBBReg(pAdapter, 0xe44, bMaskDWord, 0x01004800); + + for(i = 0 ; i < retryCount ; i++){ + PathAOK = _PHY_PathA_IQK(pAdapter, is2T); + if(PathAOK == 0x03){ + //DBG_8192C("Path A IQK Success!!\n"); + result[t][0] = (PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord)&0x3FF0000)>>16; + result[t][1] = (PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord)&0x3FF0000)>>16; + result[t][2] = (PHY_QueryBBReg(pAdapter, 0xea4, bMaskDWord)&0x3FF0000)>>16; + result[t][3] = (PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord)&0x3FF0000)>>16; + break; + } + else if (i == (retryCount-1) && PathAOK == 0x01) //Tx IQK OK + { + //DBG_8192C("Path A IQK Only Tx Success!!\n"); + + result[t][0] = (PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord)&0x3FF0000)>>16; + result[t][1] = (PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord)&0x3FF0000)>>16; + } + } + + if(0x00 == PathAOK){ + DBG_8192C("Path A IQK failed!!\n"); + } + + if(is2T){ + _PHY_PathAStandBy(pAdapter); + + // Turn Path B ADDA on + _PHY_PathADDAOn(pAdapter, ADDA_REG, _FALSE, is2T); + + for(i = 0 ; i < retryCount ; i++){ + PathBOK = _PHY_PathB_IQK(pAdapter); + if(PathBOK == 0x03){ + DBG_8192C("Path B IQK Success!!\n"); + result[t][4] = (PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord)&0x3FF0000)>>16; + result[t][5] = (PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord)&0x3FF0000)>>16; + result[t][6] = (PHY_QueryBBReg(pAdapter, 0xec4, bMaskDWord)&0x3FF0000)>>16; + result[t][7] = (PHY_QueryBBReg(pAdapter, 0xecc, bMaskDWord)&0x3FF0000)>>16; + break; + } + else if (i == (retryCount - 1) && PathBOK == 0x01) //Tx IQK OK + { + DBG_8192C("Path B Only Tx IQK Success!!\n"); + result[t][4] = (PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord)&0x3FF0000)>>16; + result[t][5] = (PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord)&0x3FF0000)>>16; + } + } + + if(0x00 == PathBOK){ + DBG_8192C("Path B IQK failed!!\n"); + } + } + + //Back to BB mode, load original value + //RTPRINT(FINIT, INIT_IQK, ("IQK:Back to BB mode, load original value!\n")); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0); + + if(t!=0) + { + if(!pdmpriv->bRfPiEnable){ + // Switch back BB to SI mode after finish IQ Calibration. + _PHY_PIModeSwitch(pAdapter, _FALSE); + } + + // Reload ADDA power saving parameters + _PHY_ReloadADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup, IQK_ADDA_REG_NUM); + + // Reload MAC parameters + _PHY_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); + + // Reload BB parameters + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM); + + // Restore RX initial gain + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00032ed3); + if(is2T){ + PHY_SetBBReg(pAdapter, 0x844, bMaskDWord, 0x00032ed3); + } + + //load 0xe30 IQC default value + PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x01008c00); + PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x01008c00); + + } + //RTPRINT(FINIT, INIT_IQK, ("_PHY_IQCalibrate() <==\n")); + +} + + +static VOID +_PHY_LCCalibrate( + IN PADAPTER pAdapter, + IN BOOLEAN is2T + ) +{ + u8 tmpReg; + u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + + //Check continuous TX and Packet TX + tmpReg = rtw_read8(pAdapter, 0xd03); + + if((tmpReg&0x70) != 0) //Deal with contisuous TX case + rtw_write8(pAdapter, 0xd03, tmpReg&0x8F); //disable all continuous TX + else // Deal with Packet TX case + rtw_write8(pAdapter, REG_TXPAUSE, 0xFF); // block all queues + + if((tmpReg&0x70) != 0) + { + //1. Read original RF mode + //Path-A + RF_Amode = PHY_QueryRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits); + + //Path-B + if(is2T) + RF_Bmode = PHY_QueryRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits); + + //2. Set RF mode = standby mode + //Path-A + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000); + + //Path-B + if(is2T) + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000); + } + + //3. Read RF reg18 + LC_Cal = PHY_QueryRFReg(pAdapter, RF90_PATH_A, 0x18, bMask12Bits); + + //4. Set LC calibration begin + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x18, bMask12Bits, LC_Cal|0x08000); + + if(isNormal) { + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(100); + #else + rtw_mdelay_os(100); + #endif + } + else + rtw_mdelay_os(3); + + //Restore original situation + if((tmpReg&0x70) != 0) //Deal with contisuous TX case + { + //Path-A + rtw_write8(pAdapter, 0xd03, tmpReg); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits, RF_Amode); + + //Path-B + if(is2T) + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits, RF_Bmode); + } + else // Deal with Packet TX case + { + rtw_write8(pAdapter, REG_TXPAUSE, 0x00); + } + +} + + +//Analog Pre-distortion calibration +#define APK_BB_REG_NUM 8 +#define APK_CURVE_REG_NUM 4 +#define PATH_NUM 2 + +static VOID +_PHY_APCalibrate( + IN PADAPTER pAdapter, + IN char delta, + IN BOOLEAN is2T + ) +{ +#if 1//(PLATFORM == PLATFORM_WINDOWS)//??? + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + u32 regD[PATH_NUM]; + u32 tmpReg, index, offset, path, i, pathbound = PATH_NUM, apkbound; + + u32 BB_backup[APK_BB_REG_NUM]; + u32 BB_REG[APK_BB_REG_NUM] = { + 0x904, 0xc04, 0x800, 0xc08, 0x874, + 0x870, 0x860, 0x864 }; + u32 BB_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x00204000 }; + u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x22204000 }; + + u32 AFE_backup[IQK_ADDA_REG_NUM]; + u32 AFE_REG[IQK_ADDA_REG_NUM] = { + 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, + 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, + 0xed0, 0xed4, 0xed8, 0xedc, 0xee0, + 0xeec}; + + u32 MAC_backup[IQK_MAC_REG_NUM]; + u32 MAC_REG[IQK_MAC_REG_NUM] = { + 0x522, 0x550, 0x551, 0x040}; + + u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c}, + {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e} + }; + + u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings + {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c} + }; + + u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d}, + {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050} + }; + + u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a} + }; + + u32 APK_RF_value_A[PATH_NUM][APK_BB_REG_NUM] = { + {0x1adb0, 0x1adb0, 0x1ada0, 0x1ad90, 0x1ad80}, + {0x00fb0, 0x00fb0, 0x00fa0, 0x00f90, 0x00f80} + }; + + u32 AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u32 APK_offset[PATH_NUM] = { + 0xb68, 0xb6c}; + + u32 APK_normal_offset[PATH_NUM] = { + 0xb28, 0xb98}; + + u32 APK_value[PATH_NUM] = { + 0x92fc0000, 0x12fc0000}; + + u32 APK_normal_value[PATH_NUM] = { + 0x92680000, 0x12680000}; + + char APK_delta_mapping[APK_BB_REG_NUM][13] = { + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0} + }; + + u32 APK_normal_setting_value_1[13] = { + 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28, + 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3, + 0x12680000, 0x00880000, 0x00880000 + }; + + u32 APK_normal_setting_value_2[16] = { + 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3, + 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025, + 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008, + 0x00050006 + }; + + u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a + u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM]; + + int BB_offset, delta_V, delta_offset; + + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + +#if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + pMptCtx->APK_bound[0] = 45; + pMptCtx->APK_bound[1] = 52; +#endif + + //RTPRINT(FINIT, INIT_IQK, ("==>PHY_APCalibrate() delta %d\n", delta)); + + //RTPRINT(FINIT, INIT_IQK, ("AP Calibration for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip"))); + + if(!is2T) + pathbound = 1; + + //2 FOR NORMAL CHIP SETTINGS + if(isNormal) + { +// Temporarily do not allow normal driver to do the following settings because these offset +// and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal +// will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the +// root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31. +#if (MP_DRIVER != 1) + return; +#endif + + //settings adjust for normal chip + for(index = 0; index < PATH_NUM; index ++) + { + APK_offset[index] = APK_normal_offset[index]; + APK_value[index] = APK_normal_value[index]; + AFE_on_off[index] = 0x6fdb25a4; + } + + for(index = 0; index < APK_BB_REG_NUM; index ++) + { + for(path = 0; path < pathbound; path++) + { + APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index]; + APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index]; + } + BB_AP_MODE[index] = BB_normal_AP_MODE[index]; + } + + apkbound = 6; + } + else + { + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0fe00000); + if(is2T) + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0fe00000); + apkbound = 12; + } + + //save BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0 && isNormal) //skip + continue; + BB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord); + } + + //save MAC default value + _PHY_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup); + + //save AFE default value + _PHY_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup,16); + + for(path = 0; path < pathbound; path++) + { + //save old AP curve + if(isNormal) + { + if(path == RF90_PATH_A) + { + //path A APK + //load APK setting + //path-A + offset = 0xb00; + for(index = 0; index < 11; index ++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x12680000); + + offset = 0xb68; + for(; index < 13; index ++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + + //path A + offset = 0xb00; + for(index = 0; index < 16; index++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + } + else if(path == RF90_PATH_B) + { + //path B APK + //load APK setting + //path-B + offset = 0xb70; + for(index = 0; index < 10; index ++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x12680000); + + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x12680000); + + offset = 0xb68; + index = 11; + for(; index < 13; index ++) //offset 0xb68, 0xb6c + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + + //path B + offset = 0xb60; + for(index = 0; index < 16; index++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + } + +#if 0 + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x3, bMaskDWord); + AP_curve[path][0] = tmpReg & 0x1F; //[4:0] + + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord); + AP_curve[path][1] = (tmpReg & 0xF8000) >> 15; //[19:15] + AP_curve[path][2] = (tmpReg & 0x7C00) >> 10; //[14:10] + AP_curve[path][3] = (tmpReg & 0x3E0) >> 5; //[9:5] +#endif + } + else + { + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord); + + AP_curve[path][0] = (tmpReg & 0xF8000) >> 15; //[19:15] + AP_curve[path][1] = (tmpReg & 0x7C00) >> 10; //[14:10] + AP_curve[path][2] = (tmpReg & 0x3E0) >> 5; //[9:5] + AP_curve[path][3] = tmpReg & 0x1F; //[4:0] + } + + //save RF default value + regD[path] = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord); + + //Path A AFE all on, path B AFE All off or vise versa + for(index = 0; index < IQK_ADDA_REG_NUM ; index++) + PHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xe70 %x\n", PHY_QueryBBReg(pAdapter, 0xe70, bMaskDWord))); + + //BB to AP mode + if(path == 0) + { + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0 && isNormal) //skip + continue; + else if (index < 5) + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]); + else if (BB_REG[index] == 0x870) + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26); + else + PHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0); + } + PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x01008c00); + PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x01008c00); + } + else //path B + { + PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x01008c00); + PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x01008c00); + } + + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x800 %x\n", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord))); + + //MAC settings + _PHY_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup); + + if(path == RF90_PATH_A) //Path B to standby mode + { + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0, bMaskDWord, 0x10000); + } + else //Path A to standby mode + { + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMaskDWord, 0x10000); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x10, bMaskDWord, 0x1000f); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x11, bMaskDWord, 0x20103); + } + + delta_offset = ((delta+14)/2); + if(delta_offset < 0) + delta_offset = 0; + else if (delta_offset > 12) + delta_offset = 12; + + //AP calibration + for(index = 0; index < APK_BB_REG_NUM; index++) + { + if(index != 1 && isNormal) //only DO PA11+PAD01001, AP RF setting + continue; + + tmpReg = APK_RF_init_value[path][index]; +#if 1 + if(!pdmpriv->bAPKThermalMeterIgnore) + { + BB_offset = (tmpReg & 0xF0000) >> 16; + + if(!(tmpReg & BIT15)) //sign bit 0 + { + BB_offset = -BB_offset; + } + + delta_V = APK_delta_mapping[index][delta_offset]; + + BB_offset += delta_V; + + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() APK num %d delta_V %d delta_offset %d\n", index, delta_V, delta_offset)); + + if(BB_offset < 0) + { + tmpReg = tmpReg & (~BIT15); + BB_offset = -BB_offset; + } + else + { + tmpReg = tmpReg | BIT15; + } + tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16); + } +#endif + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xc, bMaskDWord, 0x8992e); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xc, bMaskDWord))); + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x0, bMaskDWord, APK_RF_value_0[path][index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x0, bMaskDWord))); + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord, tmpReg); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord))); + if(!isNormal) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xa, bMaskDWord, APK_RF_value_A[path][index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xa %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xa, bMaskDWord))); + } + + // PA11+PAD01111, one shot + i = 0; + do + { + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); + { + PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord))); + rtw_mdelay_os(3); + PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord))); + if(isNormal) { + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(20); + #else + rtw_mdelay_os(20); + #endif + } + else + rtw_mdelay_os(3); + } + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + if(!isNormal) + { + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xb, bMaskDWord); + tmpReg = (tmpReg & 0x3E00) >> 9; + } + else + { + if(path == RF90_PATH_A) + tmpReg = PHY_QueryBBReg(pAdapter, 0xbd8, 0x03E00000); + else + tmpReg = PHY_QueryBBReg(pAdapter, 0xbd8, 0xF8000000); + } + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xbd8[25:21] %x\n", tmpReg)); + + i++; + } + while(tmpReg > apkbound && i < 4); + + APK_result[path][index] = tmpReg; + } + } + + //reload MAC default value + _PHY_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup); + + //reload BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0 && isNormal) //skip + continue; + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]); + } + + //reload AFE default value + _PHY_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); + + //reload RF path default value + for(path = 0; path < pathbound; path++) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord, regD[path]); + if(path == RF90_PATH_B) + { + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x10, bMaskDWord, 0x1000f); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x11, bMaskDWord, 0x20101); + } +#if 1 + if(!isNormal) + { + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(APK_result[path][index] > 12) + APK_result[path][index] = AP_curve[path][index-1]; + //RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", index, APK_result[path][index])); + } + } + else + { //note no index == 0 + if (APK_result[path][1] > 6) + APK_result[path][1] = 6; + //RTPRINT(FINIT, INIT_IQK, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1])); + +#if 0 + if(APK_result[path][2] < 2) + APK_result[path][2] = 2; + else if (APK_result[path][2] > 6) + APK_result[path][2] = 6; + RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 2, APK_result[path][2])); + + if(APK_result[path][3] < 2) + APK_result[path][3] = 2; + else if (APK_result[path][3] > 6) + APK_result[path][3] = 6; + RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 3, APK_result[path][3])); + + if(APK_result[path][4] < 5) + APK_result[path][4] = 5; + else if (APK_result[path][4] > 9) + APK_result[path][4] = 9; + RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 4, APK_result[path][4])); +#endif + + } +#endif + } + + //RTPRINT(FINIT, INIT_IQK, ("\n")); + + + for(path = 0; path < pathbound; path++) + { + if(isNormal) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x3, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1])); + if(path == RF90_PATH_A) + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05)); + else + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05)); + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08)); + } + else + { + for(index = 0; index < 2; index++) + pdmpriv->APKoutput[path][index] = ((APK_result[path][index] << 15) | (APK_result[path][2] << 10) | (APK_result[path][3] << 5) | APK_result[path][4]); + +#if (MP_DRIVER == 1) + if(pMptCtx->TxPwrLevel[path] > pMptCtx->APK_bound[path]) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + pdmpriv->APKoutput[path][0]); + } + else + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + pdmpriv->APKoutput[path][1]); + } +#else + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + pdmpriv->APKoutput[path][0]); +#endif + } + } + + pdmpriv->bAPKdone = _TRUE; + + //RTPRINT(FINIT, INIT_IQK, ("<==PHY_APCalibrate()\n")); +#endif +} + + +#define DP_BB_REG_NUM 7 +#define DP_RF_REG_NUM 1 +#define DP_RETRY_LIMIT 10 +#define DP_PATH_NUM 2 +#define DP_DPK_NUM 3 +#define DP_DPK_VALUE_NUM 2 + +//digital predistortion +static VOID +_PHY_DigitalPredistortion( + IN PADAPTER pAdapter, + IN BOOLEAN is2T + ) +{ +#if 1//(PLATFORM == PLATFORM_WINDOWS) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + u32 tmpReg, tmpReg2, index, offset, path, i, pathbound = PATH_NUM; + u32 AFE_backup[IQK_ADDA_REG_NUM]; + u32 AFE_REG[IQK_ADDA_REG_NUM] = { + 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, + 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, + 0xed0, 0xed4, 0xed8, 0xedc, 0xee0, + 0xeec}; + + u32 BB_backup[DP_BB_REG_NUM]; + u32 BB_REG[DP_BB_REG_NUM] = { + 0xc04, 0x800, 0xc08, 0x874, + 0x870, 0x860, 0x864}; + u32 BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, + 0x0, 0x0, 0x0}; + + u32 RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; + u32 RF_REG[DP_RF_REG_NUM] = { + 0x0d}; + + u32 MAC_backup[IQK_MAC_REG_NUM]; + u32 MAC_REG[IQK_MAC_REG_NUM] = { + 0x522, 0x550, 0x551, 0x040}; + + u32 Tx_AGC[DP_DPK_NUM][DP_DPK_VALUE_NUM] = { + {0x1e1e1e1e, 0x03901e1e}, + {0x18181818, 0x03901818}, + {0x0e0e0e0e, 0x03900e0e} + }; + +// u32 RF_PATHA_backup[DP_RF_REG_NUM]; +// u32 RF_REG_PATHA[DP_RF_REG_NUM] = { +// 0x00, 0x10, 0x11}; + + u32 Reg800, Reg874, Regc04, Regc08, Reg040; + + u32 AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u32 RetryCount = 0; + + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + + //DBG_8192C("==>_PHY_DigitalPredistortion()\n"); + + //DBG_8192C("_PHY_DigitalPredistortion for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip")); + + if(!isNormal) + return; + + //save BB default value + for(index=0; index tx_agc 1f ~11 + // PA gain = 11 & PAD2 => tx_agc 10~0e + // PA gain = 01 => tx_agc 0b~0d + // PA gain = 00 => tx_agc 0a~00 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + PHY_SetBBReg(pAdapter, 0xbc0, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 3; index++) + PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, Tx_AGC[i][0]); + PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, Tx_AGC[i][1]); + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0xe10+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02097098); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path A + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x80047788); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x00047788); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + } + + //PA gain = 11 => tx_agc = 1a + for(index = 0; index < 3; index++) + PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, 0x34343434); + PHY_SetBBReg(pAdapter, 0xe08+index*4, bMaskDWord, 0x03903434); + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0xe10+index*4, bMaskDWord, 0x34343434); + + //==================================== + // PAGE_B for Path-A DPK setting + //==================================== + // open inner loopback @ b00[19]:10 od 0xb00 0x01097018 + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02017098); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); + + //rf_lpbk_setup + //1.rf 00:5205a, rf 0d:0e52c + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x0c, bMaskDWord, 0x8992b); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x0d, bMaskDWord, 0x0e52c); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMaskDWord, 0x5205a ); + + //----send one shot signal----// + // Path A + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + + while(RetryCount < DP_RETRY_LIMIT && !pdmpriv->bDPPathAOK) + { + //----read back measurement results----// + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x0c297018); + tmpReg = PHY_QueryBBReg(pAdapter, 0xbe0, bMaskDWord); + rtw_mdelay_os(10); + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x0c29701f); + tmpReg2 = PHY_QueryBBReg(pAdapter, 0xbe8, bMaskDWord); + rtw_mdelay_os(10); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff ) + { + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02017098); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + RetryCount++; + DBG_8192C("path A DPK RetryCount %d 0xbe0[31:16] %x 0xbe8[31:16] %x\n", RetryCount, tmpReg, tmpReg2); + } + else + { + DBG_8192C("path A DPK Sucess\n"); + pdmpriv->bDPPathAOK = _TRUE; + break; + } + } + RetryCount = 0; + + //DPP path A + if(pdmpriv->bDPPathAOK) + { + // DP settings + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x01017098); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0x776d9f84); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + + for(i=0xb00; i<=0xb3c; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x40004000); + //DBG_8192C("path A ofsset = 0x%x\n", i); + } + + //pwsf + PHY_SetBBReg(pAdapter, 0xb40, bMaskDWord, 0x40404040); + PHY_SetBBReg(pAdapter, 0xb44, bMaskDWord, 0x28324040); + PHY_SetBBReg(pAdapter, 0xb48, bMaskDWord, 0x10141920); + + for(i=0xb4c; i<=0xb5c; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x0c0c0c0c); + } + + //TX_AGC boundary + PHY_SetBBReg(pAdapter, 0xbc0, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + } + else + { + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x00000000); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0x00000000); + } + + //DPK path B + if(is2T) + { + //Path A to standby mode + PHY_SetRFReg(pAdapter, RF90_PATH_A, RF_AC, bMaskDWord, 0x10000); + + // LUTs => tx_agc + // PA gain = 11 & PAD1, => tx_agc 1f ~11 + // PA gain = 11 & PAD2, => tx_agc 10 ~0e + // PA gain = 01 => tx_agc 0b ~0d + // PA gain = 00 => tx_agc 0a ~00 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + PHY_SetBBReg(pAdapter, 0xbc4, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0x830+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x848+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x868+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02097098); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path B + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x80047788); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x00047788); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + } + + // PA gain = 11 => tx_agc = 1a + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0x830+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x848+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x868+index*4, bMaskDWord, 0x34343434); + + // PAGE_B for Path-B DPK setting + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02017098); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); + + // RF lpbk switches on + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x0101000f); + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x01120103); + + //Path-B RF lpbk + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0c, bMaskDWord, 0x8992b); + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0d, bMaskDWord, 0x0e52c); + PHY_SetRFReg(pAdapter, RF90_PATH_B, RF_AC, bMaskDWord, 0x5205a); + + //----send one shot signal----// + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + + while(RetryCount < DP_RETRY_LIMIT && !pdmpriv->bDPPathBOK) + { + //----read back measurement results----// + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x0c297018); + tmpReg = PHY_QueryBBReg(pAdapter, 0xbf0, bMaskDWord); + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x0c29701f); + tmpReg2 = PHY_QueryBBReg(pAdapter, 0xbf8, bMaskDWord); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff) + { + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02017098); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + RetryCount++; + DBG_8192C("path B DPK RetryCount %d 0xbf0[31:16] %x, 0xbf8[31:16] %x\n", RetryCount , tmpReg, tmpReg2); + } + else + { + DBG_8192C("path B DPK Success\n"); + pdmpriv->bDPPathBOK = _TRUE; + break; + } + } + + //DPP path B + if(pdmpriv->bDPPathBOK) + { + // DP setting + // LUT by SRAM + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x01017098); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0x776d9f84); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + for(i=0xb60; i<=0xb9c; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x40004000); + //DBG_8192C("path B ofsset = 0x%x\n", i); + } + + // PWSF + PHY_SetBBReg(pAdapter, 0xba0, bMaskDWord, 0x40404040); + PHY_SetBBReg(pAdapter, 0xba4, bMaskDWord, 0x28324050); + PHY_SetBBReg(pAdapter, 0xba8, bMaskDWord, 0x0c141920); + + for(i=0xbac; i<=0xbbc; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x0c0c0c0c); + } + + // tx_agc boundary + PHY_SetBBReg(pAdapter, 0xbc4, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + } + else + { + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x00000000); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0x00000000); + } + } + + //reload BB default value + for(index=0; indexbDPdone = _TRUE; + //DBG_8192C("<==_PHY_DigitalPredistortion()\n"); +#endif +} + + +static VOID _PHY_SetRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ + u8 u1bTmp; + + if(!pAdapter->hw_init_completed) + { + u1bTmp = rtw_read8(pAdapter, REG_LEDCFG2) | BIT7; + rtw_write8(pAdapter, REG_LEDCFG2, u1bTmp); + //PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) + { + if(bMain) + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A + else + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT + } + else + { + + if(bMain) + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x2); //Main + else + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x1); //Aux + } + +} + +//return value TRUE => Main; FALSE => Aux + +static BOOLEAN _PHY_QueryRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN is2T + ) +{ +// if(is2T) +// return _TRUE; + + if(!pAdapter->hw_init_completed) + { + PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) + { + if(PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) + return _TRUE; + else + return _FALSE; + } + else + { + if(PHY_QueryBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300) == 0x02) + return _TRUE; + else + return _FALSE; + } +} + + +static VOID +_PHY_DumpRFReg(IN PADAPTER pAdapter) +{ + u32 rfRegValue,rfRegOffset; + + //RTPRINT(FINIT, INIT_RF, ("PHY_DumpRFReg()====>\n")); + + for(rfRegOffset = 0x00;rfRegOffset<=0x30;rfRegOffset++){ + rfRegValue = PHY_QueryRFReg(pAdapter,RF90_PATH_A, rfRegOffset, bMaskDWord); + //RTPRINT(FINIT, INIT_RF, (" 0x%02x = 0x%08x\n",rfRegOffset,rfRegValue)); + } + //RTPRINT(FINIT, INIT_RF, ("<===== PHY_DumpRFReg()\n")); +} + + +VOID +rtl8192c_PHY_IQCalibrate( + IN PADAPTER pAdapter, + IN BOOLEAN bReCovery + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 IQK_BB_REG[9] = { + rOFDM0_XARxIQImbalance, rOFDM0_XBRxIQImbalance, rOFDM0_ECCAThreshold, rOFDM0_AGCRSSITable, + rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance, rOFDM0_XCTxAFE, rOFDM0_XDTxAFE, rOFDM0_RxIQExtAnta}; + int result[4][8]; //last is final result + u8 i, final_candidate; + BOOLEAN bPathAOK, bPathBOK; + int RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0; + BOOLEAN is12simular, is13simular, is23simular; + + +#if (MP_DRIVER == 1) + //ignore IQK when continuous Tx + if (pAdapter->mppriv.MptCtx.bStartContTx == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bCarrierSuppression == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleCarrier == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleTone == _TRUE) + return; +#endif + +#if DISABLE_BB_RF + return; +#endif + + if(bReCovery) + { + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); + return; + } + //DBG_8192C("IQK:Start!!!\n"); + + for(i = 0; i < 8; i++) + { + result[0][i] = 0; + result[1][i] = 0; + result[2][i] = 0; + result[3][i] = 0; + } + final_candidate = 0xff; + bPathAOK = _FALSE; + bPathBOK = _FALSE; + is12simular = _FALSE; + is23simular = _FALSE; + is13simular = _FALSE; + + for (i=0; i<3; i++) + { + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_IQCalibrate(pAdapter, result, i, _TRUE); + //_PHY_DumpRFReg(pAdapter); + } + else{ + // For 88C 1T1R + _PHY_IQCalibrate(pAdapter, result, i, _FALSE); + } + + if(i == 1) + { + is12simular = _PHY_SimularityCompare(pAdapter, result, 0, 1); + if(is12simular) + { + final_candidate = 0; + break; + } + } + + if(i == 2) + { + is13simular = _PHY_SimularityCompare(pAdapter, result, 0, 2); + if(is13simular) + { + final_candidate = 0; + break; + } + + is23simular = _PHY_SimularityCompare(pAdapter, result, 1, 2); + if(is23simular) + final_candidate = 1; + else + { + for(i = 0; i < 8; i++) + RegTmp += result[3][i]; + + if(RegTmp != 0) + final_candidate = 3; + else + final_candidate = 0xFF; + } + } + } + + for (i=0; i<4; i++) + { + RegE94 = result[i][0]; + RegE9C = result[i][1]; + RegEA4 = result[i][2]; + RegEAC = result[i][3]; + RegEB4 = result[i][4]; + RegEBC = result[i][5]; + RegEC4 = result[i][6]; + RegECC = result[i][7]; + //RTPRINT(FINIT, INIT_IQK, ("IQK: RegE94=%lx RegE9C=%lx RegEA4=%lx RegEAC=%lx RegEB4=%lx RegEBC=%lx RegEC4=%lx RegECC=%lx\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC)); + } + + if(final_candidate != 0xff) + { + pdmpriv->RegE94 = RegE94 = result[final_candidate][0]; + pdmpriv->RegE9C = RegE9C = result[final_candidate][1]; + RegEA4 = result[final_candidate][2]; + RegEAC = result[final_candidate][3]; + pdmpriv->RegEB4 = RegEB4 = result[final_candidate][4]; + pdmpriv->RegEBC = RegEBC = result[final_candidate][5]; + RegEC4 = result[final_candidate][6]; + RegECC = result[final_candidate][7]; + //DBG_8192C("IQK: final_candidate is %x\n", final_candidate); + //DBG_8192C("IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC); + bPathAOK = bPathBOK = _TRUE; + } + else + { + + #if 0 + DBG_871X("%s do _PHY_ReloadADDARegisters\n"); + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); + return; + #else + pdmpriv->RegE94 = pdmpriv->RegEB4 = 0x100; //X default value + pdmpriv->RegE9C = pdmpriv->RegEBC = 0x0; //Y default value + #endif + } + + if((RegE94 != 0)/*&&(RegEA4 != 0)*/) + _PHY_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0)); + + if(IS_92C_SERIAL( pHalData->VersionID)){ + if((RegEB4 != 0)/*&&(RegEC4 != 0)*/) + _PHY_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0)); + } + + _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); + +} + + +VOID +rtl8192c_PHY_LCCalibrate( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + +#if (MP_DRIVER == 1) + // ignore LCK when continuous Tx + if (pAdapter->mppriv.MptCtx.bStartContTx == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bCarrierSuppression == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleCarrier == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleTone == _TRUE) + return; +#endif + +#if DISABLE_BB_RF + return; +#endif + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_LCCalibrate(pAdapter, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_LCCalibrate(pAdapter, _FALSE); + } +} + +VOID +rtl8192c_PHY_APCalibrate( + IN PADAPTER pAdapter, + IN char delta + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#if DISABLE_BB_RF + return; +#endif + + if(pdmpriv->bAPKdone) + return; + +// if(IS_NORMAL_CHIP(pHalData->VersionID)) +// return; + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_APCalibrate(pAdapter, delta, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_APCalibrate(pAdapter, delta, _FALSE); + } +} + +VOID +rtl8192c_PHY_DigitalPredistortion( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#if DISABLE_BB_RF + return; +#endif + + return; + + if(pdmpriv->bDPdone) + return; + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_DigitalPredistortion(pAdapter, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_DigitalPredistortion(pAdapter, _FALSE); + } +} + +VOID rtl8192c_PHY_SetRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN bMain + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if DISABLE_BB_RF + return; +#endif + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_SetRFPathSwitch(pAdapter, bMain, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_SetRFPathSwitch(pAdapter, bMain, _FALSE); + } +} + +// +// Move from phycfg.c to gen.c to be code independent later +// +//-------------------------Move to other DIR later----------------------------*/ +#ifdef CONFIG_USB_HCI + +// +// Description: +// To dump all Tx FIFO LLT related link-list table. +// Added by Roger, 2009.03.10. +// +VOID +DumpBBDbgPort_92CU( + IN PADAPTER Adapter + ) +{ + + //RT_TRACE(COMP_SEND, DBG_WARNING, ("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("BaseBand Debug Ports:\n")); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0803); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0a06); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0007); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); + PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x000f0000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); + PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x00150000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x800, PHY_QueryBBReg(Adapter, 0x0800, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x900, PHY_QueryBBReg(Adapter, 0x0900, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa00, PHY_QueryBBReg(Adapter, 0x0a00, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa54, PHY_QueryBBReg(Adapter, 0x0a54, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa58, PHY_QueryBBReg(Adapter, 0x0a58, bMaskDWord))); + +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c new file mode 100755 index 000000000000..d17c23f9a720 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c @@ -0,0 +1,1047 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192c_rf6052.c ( Source C File) + * + * Note: Provide RF 6052 series relative API. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * 11/05/2008 MHC Add API for tw power setting. + * + * +******************************************************************************/ + +#define _RTL8192C_RF6052_C_ + +#include +#include +#include +#include + +#include + +/*---------------------------Define Local Constant---------------------------*/ +// Define local structure for debug!!!!! +typedef struct RF_Shadow_Compare_Map { + // Shadow register value + u32 Value; + // Compare or not flag + u8 Compare; + // Record If it had ever modified unpredicted + u8 ErrorOrNot; + // Recorver Flag + u8 Recorver; + // + u8 Driver_Write; +}RF_SHADOW_T; +/*---------------------------Define Local Constant---------------------------*/ + + +/*------------------------Define global variable-----------------------------*/ +/*------------------------Define global variable-----------------------------*/ + + +/*------------------------Define local variable------------------------------*/ +// 2008/11/20 MH For Debug only, RF +//static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG] = {0}; +static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG]; +/*------------------------Define local variable------------------------------*/ + + +/*----------------------------------------------------------------------------- + * Function: RF_ChangeTxPath + * + * Overview: For RL6052, we must change some RF settign for 1T or 2T. + * + * Input: u2Byte DataRate // 0x80-8f, 0x90-9f + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 09/25/2008 MHC Create Version 0. + * Firmwaer support the utility later. + * + *---------------------------------------------------------------------------*/ +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate) +{ +// We do not support gain table change inACUT now !!!! Delete later !!! +#if 0//(RTL92SE_FPGA_VERIFY == 0) + static u1Byte RF_Path_Type = 2; // 1 = 1T 2= 2T + static u4Byte tx_gain_tbl1[6] + = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100}; + static u4Byte tx_gain_tbl2[6] + = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030}; + u1Byte i; + + if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7) + { + // Set TX SYNC power G2G3 loop filter + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x0f000); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G3, bRFRegOffsetMask, 0xeacf1); + + // Change TX AGC gain table + for (i = 0; i < 6; i++) + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl1[i]); + + // Set PA to high value + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x01e39); + } + else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8) + { + // Set TX SYNC power G2G3 loop filter + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x04440); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G3, bRFRegOffsetMask, 0xea4f1); + + // Change TX AGC gain table + for (i = 0; i < 6; i++) + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl2[i]); + + // Set PA low gain + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x01e19); + } +#endif + +} /* RF_ChangeTxPath */ + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetBandwidth() + * + * Overview: This function is called by SetBWModeCallback8190Pci() only + * + * Input: PADAPTER Adapter + * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: For RF type 0222D + *---------------------------------------------------------------------------*/ +VOID +rtl8192c_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth) //20M or 40M +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(Bandwidth) + { + case HT_CHANNEL_WIDTH_20: + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400); + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); + break; + + case HT_CHANNEL_WIDTH_40: + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff)); + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); + break; + + default: + //RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth )); + break; + } + +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetCckTxPower + * + * Overview: + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/05/2008 MHC Simulate 8192series.. + * + *---------------------------------------------------------------------------*/ + +VOID +rtl8192c_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; + u32 TxAGC[2]={0, 0}, tmpval=0; + BOOLEAN TurboScanOff = _FALSE; + u8 idx1, idx2; + u8* ptr; + + // 2010/10/18 MH Accorsing to SD3 eechou's suggestion, we need to disable turbo scan for RU. + // Otherwise, external PA will be broken if power index > 0x20. +#ifdef CONFIG_USB_HCI + if (pHalData->EEPROMRegulatory != 0 || pHalData->ExternalPA) +#else + if (pHalData->EEPROMRegulatory != 0) +#endif + { + //DbgPrint("TurboScanOff=1 EEPROMRegulatory=%d ExternalPA=%d\n", pHalData->EEPROMRegulatory, pHalData->ExternalPA); + TurboScanOff = _TRUE; + } + + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + TxAGC[RF90_PATH_A] = 0x3f3f3f3f; + TxAGC[RF90_PATH_B] = 0x3f3f3f3f; + + TurboScanOff = _TRUE;//disable turbo scan + + if(TurboScanOff) + { + for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); +#ifdef CONFIG_USB_HCI + // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. + if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA) + TxAGC[idx1] = 0x20; +#endif + } + } + } + else + { +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + { + TxAGC[RF90_PATH_A] = 0x10101010; + TxAGC[RF90_PATH_B] = 0x10101010; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + { + TxAGC[RF90_PATH_A] = 0x00000000; + TxAGC[RF90_PATH_B] = 0x00000000; + } + else + { + for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); + } + + if(pHalData->EEPROMRegulatory==0) + { + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8); + TxAGC[RF90_PATH_A] += tmpval; + + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24); + TxAGC[RF90_PATH_B] += tmpval; + } + } + } + + for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) + { + ptr = (u8*)(&(TxAGC[idx1])); + for(idx2=0; idx2<4; idx2++) + { + if(*ptr > RF6052_MAX_TX_PWR) + *ptr = RF6052_MAX_TX_PWR; + ptr++; + } + } + + // rf-A cck tx power + tmpval = TxAGC[RF90_PATH_A]&0xff; + PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); + tmpval = TxAGC[RF90_PATH_A]>>8; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + + // rf-B cck tx power + tmpval = TxAGC[RF90_PATH_B]>>24; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + tmpval = TxAGC[RF90_PATH_B]&0x00ffffff; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", + // tmpval, rTxAGC_B_CCK1_55_Mcs32)); + +} /* PHY_RF6052SetCckTxPower */ + +// +// powerbase0 for OFDM rates +// powerbase1 for HT MCS rates +// +static void getPowerBase( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel, + IN OUT u32* OfdmBase, + IN OUT u32* MCSBase + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 powerBase0, powerBase1; + u8 Legacy_pwrdiff=0, HT20_pwrdiff=0; + u8 i, powerlevel[2]; + + for(i=0; i<2; i++) + { + powerlevel[i] = pPowerLevel[i]; + Legacy_pwrdiff = pHalData->TxPwrLegacyHtDiff[i][Channel-1]; + powerBase0 = powerlevel[i] + Legacy_pwrdiff; + + powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0; + *(OfdmBase+i) = powerBase0; + //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i))); + } + + for(i=0; i<2; i++) + { + //Check HT20 to HT40 diff + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) + { + HT20_pwrdiff = pHalData->TxPwrHt20Diff[i][Channel-1]; + powerlevel[i] += HT20_pwrdiff; + } + powerBase1 = powerlevel[i]; + powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1; + *(MCSBase+i) = powerBase1; + //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i))); + } +} + +static void getTxPowerWriteValByRegulatory( + IN PADAPTER Adapter, + IN u8 Channel, + IN u8 index, + IN u32* powerBase0, + IN u32* powerBase1, + OUT u32* pOutWriteVal + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i, chnlGroup, pwr_diff_limit[4]; + u32 writeVal, customer_limit, rf; + + // + // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate + // + for(rf=0; rf<2; rf++) + { + switch(pHalData->EEPROMRegulatory) + { + case 0: // Realtek better performance + // increase power diff defined by Realtek for large power + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 1: // Realtek regulatory + // increase power diff defined by Realtek for regulatory + { + if(pHalData->pwrGroupCnt == 1) + chnlGroup = 0; + if(pHalData->pwrGroupCnt >= 3) + { + if(Channel <= 3) + chnlGroup = 0; + else if(Channel >= 4 && Channel <= 9) + chnlGroup = 1; + else if(Channel > 9) + chnlGroup = 2; + + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) + chnlGroup++; + else + chnlGroup+=4; + } + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + } + break; + case 2: // Better regulatory + // don't increase any power diff + writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 3: // Customer defined power diff. + // increase power diff defined by customer. + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) + { + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n", + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1])); + } + else + { + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n", + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1])); + } + for (i=0; i<4; i++) + { + pwr_diff_limit[i] = (u8)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8)); + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) + { + if(pwr_diff_limit[i] > pHalData->PwrGroupHT40[rf][Channel-1]) + pwr_diff_limit[i] = pHalData->PwrGroupHT40[rf][Channel-1]; + } + else + { + if(pwr_diff_limit[i] > pHalData->PwrGroupHT20[rf][Channel-1]) + pwr_diff_limit[i] = pHalData->PwrGroupHT20[rf][Channel-1]; + } + } + customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) | + (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit)); + + writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + default: + chnlGroup = 0; + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + } + +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + writeVal = 0x14141414; + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + writeVal = 0x00000000; + + + // 20100628 Joseph: High power mode for BT-Coexist mechanism. + // This mechanism is only applied when Driver-Highpower-Mechanism is OFF. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n")); + writeVal = writeVal - 0x06060606; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n")); + writeVal = writeVal; + } + *(pOutWriteVal+rf) = writeVal; + } +} + +static void writeOFDMPowerReg( + IN PADAPTER Adapter, + IN u8 index, + IN u32* pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 RegOffset_A[6] = { rTxAGC_A_Rate18_06, rTxAGC_A_Rate54_24, + rTxAGC_A_Mcs03_Mcs00, rTxAGC_A_Mcs07_Mcs04, + rTxAGC_A_Mcs11_Mcs08, rTxAGC_A_Mcs15_Mcs12}; + u16 RegOffset_B[6] = { rTxAGC_B_Rate18_06, rTxAGC_B_Rate54_24, + rTxAGC_B_Mcs03_Mcs00, rTxAGC_B_Mcs07_Mcs04, + rTxAGC_B_Mcs11_Mcs08, rTxAGC_B_Mcs15_Mcs12}; + u8 i, rf, pwr_val[4]; + u32 writeVal; + u16 RegOffset; + + for(rf=0; rf<2; rf++) + { + writeVal = pValue[rf]; + for(i=0; i<4; i++) + { + pwr_val[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8)); + if (pwr_val[i] > RF6052_MAX_TX_PWR) + pwr_val[i] = RF6052_MAX_TX_PWR; + } + writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0]; + + if(rf == 0) + RegOffset = RegOffset_A[index]; + else + RegOffset = RegOffset_B[index]; + + PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal); + //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal)); + + // 201005115 Joseph: Set Tx Power diff for Tx power training mechanism. + if(((pHalData->rf_type == RF_2T2R) && + (RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs15_Mcs12))|| + ((pHalData->rf_type != RF_2T2R) && + (RegOffset == rTxAGC_A_Mcs07_Mcs04 || RegOffset == rTxAGC_B_Mcs07_Mcs04)) ) + { + writeVal = pwr_val[3]; + if(RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_A_Mcs07_Mcs04) + RegOffset = 0xc90; + if(RegOffset == rTxAGC_B_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs07_Mcs04) + RegOffset = 0xc98; + for(i=0; i<3; i++) + { + if(i!=2) + writeVal = (writeVal>8)?(writeVal-8):0; + else + writeVal = (writeVal>6)?(writeVal-6):0; + rtw_write8(Adapter, (u32)(RegOffset+i), (u8)writeVal); + } + } + } +} +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetOFDMTxPower + * + * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for + * different channel and read original value in TX power register area from + * 0xe00. We increase offset and original value to be correct tx pwr. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/05/2008 MHC Simulate 8192 series method. + * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to + * A/B pwr difference or legacy/HT pwr diff. + * 2. We concern with path B legacy/HT OFDM difference. + * 01/22/2009 MHC Support new EPRO format from SD3. + * + *---------------------------------------------------------------------------*/ +VOID +rtl8192c_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel) +{ + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 writeVal[2], powerBase0[2], powerBase1[2]; + u8 index = 0; + + getPowerBase(Adapter, pPowerLevel, Channel, &powerBase0[0], &powerBase1[0]); + + for(index=0; index<6; index++) + { + getTxPowerWriteValByRegulatory(Adapter, Channel, index, + &powerBase0[0], &powerBase1[0], &writeVal[0]); + + writeOFDMPowerReg(Adapter, index, &writeVal[0]); + } + +} + + +static VOID +phy_RF6052_Config_HardCode( + IN PADAPTER Adapter + ) +{ + + // Set Default Bandwidth to 20M + //Adapter->HalFunc .SetBWModeHandler(Adapter, HT_CHANNEL_WIDTH_20); + + // TODO: Set Default Channel to channel one for RTL8225 + +} + +static int +phy_RF6052_Config_ParaFile( + IN PADAPTER Adapter + ) +{ + u32 u4RegValue; + u8 eRFPath; + BB_REGISTER_DEFINITION_T *pPhyReg; + + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + static char sz88CRadioAFile[] = RTL8188C_PHY_RADIO_A; + static char sz88CRadioBFile[] = RTL8188C_PHY_RADIO_B; +#ifdef CONFIG_USB_HCI + static char sz88CRadioAFile_mCard[] = RTL8188C_PHY_RADIO_A_mCard; + static char sz88CRadioBFile_mCard[] = RTL8188C_PHY_RADIO_B_mCard; + static char sz88CRadioAFile_HP[] = RTL8188C_PHY_RADIO_A_HP; +#endif + static char sz92CRadioAFile[] = RTL8192C_PHY_RADIO_A; + static char sz92CRadioBFile[] = RTL8192C_PHY_RADIO_B; + static char sz8723RadioAFile[] = RTL8723_PHY_RADIO_A; + static char sz8723RadioBFile[] = RTL8723_PHY_RADIO_B; + char *pszRadioAFile, *pszRadioBFile; + + + if(IS_HARDWARE_TYPE_8192C(Adapter)) + { + if(IS_92C_SERIAL( pHalData->VersionID))// 88c's IPA is different from 92c's + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + pszRadioAFile = sz92CRadioAFile; + pszRadioBFile = sz92CRadioBFile; + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + else + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + pszRadioAFile = sz88CRadioAFile; + pszRadioBFile = sz88CRadioBFile; +#ifdef CONFIG_USB_HCI + if( BOARD_MINICARD == pHalData->BoardType) + { + pszRadioAFile = sz88CRadioAFile_mCard; + pszRadioBFile = sz88CRadioBFile_mCard; + } + else if( BOARD_USB_High_PA == pHalData->BoardType) + { + pszRadioAFile = sz88CRadioAFile_HP; + } +#endif + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + } + else if(IS_HARDWARE_TYPE_8723(Adapter)) + { + pszRadioAFile = sz8723RadioAFile; + pszRadioBFile = sz8723RadioBFile; + } + + //3//----------------------------------------------------------------- + //3// <2> Initialize RF + //3//----------------------------------------------------------------- + //for(eRFPath = RF90_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + + pPhyReg = &pHalData->PHYRegDef[eRFPath]; + + /*----Store original RFENV control type----*/ + switch(eRFPath) + { + case RF90_PATH_A: + case RF90_PATH_C: + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV); + break; + case RF90_PATH_B : + case RF90_PATH_D: + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16); + break; + } + + /*----Set RF_ENV enable----*/ + PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1); + rtw_udelay_os(1);//PlatformStallExecution(1); + + /*----Set RF_ENV output high----*/ + PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1); + rtw_udelay_os(1);//PlatformStallExecution(1); + + /* Set bit number of Address and Data for RF register */ + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); // Set 1 to 4 bits for 8255 + rtw_udelay_os(1);//PlatformStallExecution(1); + + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); // Set 0 to 12 bits for 8255 + rtw_udelay_os(1);//PlatformStallExecution(1); + + /*----Initialize RF fom connfiguration file----*/ + switch(eRFPath) + { + case RF90_PATH_A: +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus= rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF90_RADIO_PATH_E)eRFPath); +#else + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, (RF90_RADIO_PATH_E)eRFPath); +#endif + break; + case RF90_PATH_B: +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF90_RADIO_PATH_E)eRFPath); +#else + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, (RF90_RADIO_PATH_E)eRFPath); +#endif + break; + case RF90_PATH_C: + break; + case RF90_PATH_D: + break; + } + + /*----Restore RFENV control type----*/; + switch(eRFPath) + { + case RF90_PATH_A: + case RF90_PATH_C: + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue); + break; + case RF90_PATH_B : + case RF90_PATH_D: + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue); + break; + } + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath)); + goto phy_RF6052_Config_ParaFile_Fail; + } + + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile()\n")); + return rtStatus; + +phy_RF6052_Config_ParaFile_Fail: + return rtStatus; +} + + +int +PHY_RF6052_Config8192C( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // + // Initialize general global value + // + // TODO: Extend RF_PATH_C and RF_PATH_D in the future + if(pHalData->rf_type == RF_1T1R) + pHalData->NumTotalRFPath = 1; + else + pHalData->NumTotalRFPath = 2; + + // + // Config BB and RF + // + rtStatus = phy_RF6052_Config_ParaFile(Adapter); +#if 0 + switch( Adapter->MgntInfo.bRegHwParaFile ) + { + case 0: + phy_RF6052_Config_HardCode(Adapter); + break; + + case 1: + rtStatus = phy_RF6052_Config_ParaFile(Adapter); + break; + + case 2: + // Partial Modify. + phy_RF6052_Config_HardCode(Adapter); + phy_RF6052_Config_ParaFile(Adapter); + break; + + default: + phy_RF6052_Config_HardCode(Adapter); + break; + } +#endif + return rtStatus; + +} + + +// +// ==> RF shadow Operation API Code Section!!! +// +/*----------------------------------------------------------------------------- + * Function: PHY_RFShadowRead + * PHY_RFShadowWrite + * PHY_RFShadowCompare + * PHY_RFShadowRecorver + * PHY_RFShadowCompareAll + * PHY_RFShadowRecorverAll + * PHY_RFShadowCompareFlagSet + * PHY_RFShadowRecorverFlagSet + * + * Overview: When we set RF register, we must write shadow at first. + * When we are running, we must compare shadow abd locate error addr. + * Decide to recorver or not. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/20/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +u32 +PHY_RFShadowRead( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + return RF_Shadow[eRFPath][Offset].Value; + +} /* PHY_RFShadowRead */ + + +VOID +PHY_RFShadowWrite( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data) +{ + RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask); + RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE; + +} /* PHY_RFShadowWrite */ + + +BOOLEAN +PHY_RFShadowCompare( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + u32 reg; + // Check if we need to check the register + if (RF_Shadow[eRFPath][Offset].Compare == _TRUE) + { + reg = PHY_QueryRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask); + // Compare shadow and real rf register for 20bits!! + if (RF_Shadow[eRFPath][Offset].Value != reg) + { + // Locate error position. + RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE; + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n", + //eRFPath, Offset, reg)); + } + return RF_Shadow[eRFPath][Offset].ErrorOrNot ; + } + return _FALSE; +} /* PHY_RFShadowCompare */ + + +VOID +PHY_RFShadowRecorver( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + // Check if the address is error + if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE) + { + // Check if we need to recorver the register. + if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE) + { + PHY_SetRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask, + RF_Shadow[eRFPath][Offset].Value); + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx", + //eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value)); + } + } + +} /* PHY_RFShadowRecorver */ + + +VOID +PHY_RFShadowCompareAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + PHY_RFShadowCompare(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset); + } + } + +} /* PHY_RFShadowCompareAll */ + + +VOID +PHY_RFShadowRecorverAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + PHY_RFShadowRecorver(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset); + } + } + +} /* PHY_RFShadowRecorverAll */ + + +VOID +PHY_RFShadowCompareFlagSet( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u8 Type) +{ + // Set True or False!!! + RF_Shadow[eRFPath][Offset].Compare = Type; + +} /* PHY_RFShadowCompareFlagSet */ + + +VOID +PHY_RFShadowRecorverFlagSet( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u8 Type) +{ + // Set True or False!!! + RF_Shadow[eRFPath][Offset].Recorver= Type; + +} /* PHY_RFShadowRecorverFlagSet */ + + +VOID +PHY_RFShadowCompareFlagSetAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! + if (Offset != 0x26 && Offset != 0x27) + PHY_RFShadowCompareFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _FALSE); + else + PHY_RFShadowCompareFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _TRUE); + } + } + +} /* PHY_RFShadowCompareFlagSetAll */ + + +VOID +PHY_RFShadowRecorverFlagSetAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! + if (Offset != 0x26 && Offset != 0x27) + PHY_RFShadowRecorverFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _FALSE); + else + PHY_RFShadowRecorverFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _TRUE); + } + } + +} /* PHY_RFShadowCompareFlagSetAll */ + +VOID +PHY_RFShadowRefresh( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + RF_Shadow[eRFPath][Offset].Value = 0; + RF_Shadow[eRFPath][Offset].Compare = _FALSE; + RF_Shadow[eRFPath][Offset].Recorver = _FALSE; + RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE; + RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE; + } + } + +} /* PHY_RFShadowRead */ + +/* End of HalRf6052.c */ + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c new file mode 100755 index 000000000000..9c0f0b132cbb --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c @@ -0,0 +1,752 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192C_REDESC_C_ +#include +#include +#include +#include + +static u8 evm_db2percentage(s8 value) +{ + // + // -33dB~0dB to 0%~99% + // + s8 ret_val; + + ret_val = value; + //ret_val /= 2; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("EVMdbToPercentage92S Value=%d / %x \n", ret_val, ret_val)); + + if(ret_val >= 0) + ret_val = 0; + if(ret_val <= -33) + ret_val = -33; + + ret_val = 0 - ret_val; + ret_val*=3; + + if(ret_val == 99) + ret_val = 100; + + return(ret_val); +} + + +static s32 signal_scale_mapping(_adapter *padapter, s32 cur_sig ) +{ + s32 ret_sig; + +#ifdef CONFIG_USB_HCI + if(cur_sig >= 51 && cur_sig <= 100) + { + ret_sig = 100; + } + else if(cur_sig >= 41 && cur_sig <= 50) + { + ret_sig = 80 + ((cur_sig - 40)*2); + } + else if(cur_sig >= 31 && cur_sig <= 40) + { + ret_sig = 66 + (cur_sig - 30); + } + else if(cur_sig >= 21 && cur_sig <= 30) + { + ret_sig = 54 + (cur_sig - 20); + } + else if(cur_sig >= 10 && cur_sig <= 20) + { + ret_sig = 42 + (((cur_sig - 10) * 2) / 3); + } + else if(cur_sig >= 5 && cur_sig <= 9) + { + ret_sig = 22 + (((cur_sig - 5) * 3) / 2); + } + else if(cur_sig >= 1 && cur_sig <= 4) + { + ret_sig = 6 + (((cur_sig - 1) * 3) / 2); + } + else + { + ret_sig = cur_sig; + } +#else + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + // Step 1. Scale mapping. + // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. + // 20100426 Joseph: Modify Signal strength mapping. + // This modification makes the RSSI indication similar to Intel solution. + // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. + if(cur_sig >= 54 && cur_sig <= 100) + { + ret_sig = 100; + } + else if(cur_sig>=42 && cur_sig <= 53 ) + { + ret_sig = 95; + } + else if(cur_sig>=36 && cur_sig <= 41 ) + { + ret_sig = 74 + ((cur_sig - 36) *20)/6; + } + else if(cur_sig>=33 && cur_sig <= 35 ) + { + ret_sig = 65 + ((cur_sig - 33) *8)/2; + } + else if(cur_sig>=18 && cur_sig <= 32 ) + { + ret_sig = 62 + ((cur_sig - 18) *2)/15; + } + else if(cur_sig>=15 && cur_sig <= 17 ) + { + ret_sig = 33 + ((cur_sig - 15) *28)/2; + } + else if(cur_sig>=10 && cur_sig <= 14 ) + { + ret_sig = 39; + } + else if(cur_sig>=8 && cur_sig <= 9 ) + { + ret_sig = 33; + } + else if(cur_sig <= 8 ) + { + ret_sig = 19; + } + } + else + { + // Step 1. Scale mapping. + if(cur_sig >= 61 && cur_sig <= 100) + { + ret_sig = 90 + ((cur_sig - 60) / 4); + } + else if(cur_sig >= 41 && cur_sig <= 60) + { + ret_sig = 78 + ((cur_sig - 40) / 2); + } + else if(cur_sig >= 31 && cur_sig <= 40) + { + ret_sig = 66 + (cur_sig - 30); + } + else if(cur_sig >= 21 && cur_sig <= 30) + { + ret_sig = 54 + (cur_sig - 20); + } + else if(cur_sig >= 5 && cur_sig <= 20) + { + ret_sig = 42 + (((cur_sig - 5) * 2) / 3); + } + else if(cur_sig == 4) + { + ret_sig = 36; + } + else if(cur_sig == 3) + { + ret_sig = 27; + } + else if(cur_sig == 2) + { + ret_sig = 18; + } + else if(cur_sig == 1) + { + ret_sig = 9; + } + else + { + ret_sig = cur_sig; + } + } +#endif + + return ret_sig; +} + + +static s32 translate2dbm(u8 signal_strength_idx) +{ + s32 signal_power; // in dBm. + + + // Translate to dBm (x=0.5y-95). + signal_power = (s32)((signal_strength_idx + 1) >> 1); + signal_power -= 95; + + return signal_power; +} + +void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat) +{ + PHY_STS_OFDM_8192CD_T *pOfdm_buf; + PHY_STS_CCK_8192CD_T *pCck_buf; + u8 i, max_spatial_stream, evm; + s8 rx_pwr[4], rx_pwr_all = 0; + u8 pwdb_all; + u32 rssi,total_rssi=0; + u8 bcck_rate=0, rf_rx_num = 0, cck_highpwr = 0; + _adapter *padapter = prframe->u.hdr.adapter; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 tmp_rxsnr; + s8 rx_snrX; + +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + PHY_RX_DRIVER_INFO_8192CD *pDrvInfo = ((PHY_RX_DRIVER_INFO_8192CD *)pphy_stat); + u8 bant1_sel = (pDrvInfo->ANTSEL == 1)?_TRUE:_FALSE; +#endif + + // Record it for next packet processing + bcck_rate=(pattrib->mcs_rate<=3? 1:0); + + if(bcck_rate) //CCK + { + u8 report; +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + if(bant1_sel == _TRUE) + pHalData->CCK_Ant1_Cnt++; + else + pHalData->CCK_Ant2_Cnt++; +#endif + + // CCK Driver info Structure is not the same as OFDM packet. + pCck_buf = (PHY_STS_CCK_8192CD_T *)pphy_stat; + //Adapter->RxStats.NumQryPhyStatusCCK++; + + // + // (1)Hardware does not provide RSSI for CCK + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + + if(padapter->pwrctrlpriv.rf_pwrstate == rf_on) + cck_highpwr = (u8)pHalData->bCckHighPower; + else + cck_highpwr = _FALSE; + + if(!cck_highpwr) + { + report = pCck_buf->cck_agc_rpt&0xc0; + report = report>>6; + switch(report) + { + // 03312009 modified by cosa + // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion + // Note: different RF with the different RNA gain. + case 0x3: + rx_pwr_all = (-46) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + case 0x2: + rx_pwr_all = (-26) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + case 0x1: + rx_pwr_all = (-12) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + case 0x0: + rx_pwr_all = (16) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + } + } + else + { + report = pCck_buf->cck_agc_rpt & 0x60; + report = report>>5; + switch(report) + { + case 0x3: + rx_pwr_all = (-46) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x2: + rx_pwr_all = (-26)- ((pCck_buf->cck_agc_rpt & 0x1f)<<1); + break; + case 0x1: + rx_pwr_all = (-12) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x0: + rx_pwr_all = (16) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; + break; + } + } + + pwdb_all= query_rx_pwr_percentage(rx_pwr_all); + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + // CCK gain is smaller than OFDM/MCS gain, + // so we add gain diff by experiences, the val is 6 + pwdb_all+=6; + if(pwdb_all > 100) + pwdb_all = 100; + // modify the offset to make the same gain index with OFDM. + if(pwdb_all > 34 && pwdb_all <= 42) + pwdb_all -= 2; + else if(pwdb_all > 26 && pwdb_all <= 34) + pwdb_all -= 6; + else if(pwdb_all > 14 && pwdb_all <= 26) + pwdb_all -= 8; + else if(pwdb_all > 4 && pwdb_all <= 14) + pwdb_all -= 4; + } + + pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive + pattrib->RecvSignalPower = rx_pwr_all; //dBM + padapter->recvpriv.rxpwdb = rx_pwr_all; + // + // (3) Get Signal Quality (EVM) + // + //if(bPacketMatchBSSID) + { + u8 sq; + + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + // mapping to 5 bars for vista signal strength + // signal quality in driver will be displayed to signal strength + // in vista. + if(pwdb_all >= 50) + sq = 100; + else if(pwdb_all >= 35 && pwdb_all < 50) + sq = 80; + else if(pwdb_all >= 22 && pwdb_all < 35) + sq = 60; + else if(pwdb_all >= 18 && pwdb_all < 22) + sq = 40; + else + sq = 20; + } + else + { + if(pwdb_all> 40) + { + sq = 100; + } + else + { + sq = pCck_buf->SQ_rpt; + + if(pCck_buf->SQ_rpt > 64) + sq = 0; + else if (pCck_buf->SQ_rpt < 20) + sq= 100; + else + sq = ((64-sq) * 100) / 44; + + } + } + + pattrib->signal_qual=sq; + pattrib->rx_mimo_signal_qual[0]=sq; + pattrib->rx_mimo_signal_qual[1]=(-1); + } + + } + else //OFDM/HT + { +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + if(bant1_sel == _TRUE) + pHalData->OFDM_Ant1_Cnt++; + else + pHalData->OFDM_Ant2_Cnt++; +#endif + pdmpriv->OFDM_Pkt_Cnt++; + + pOfdm_buf = (PHY_STS_OFDM_8192CD_T *)pphy_stat; + + // + // (1)Get RSSI per-path + // + for(i=0; iNumTotalRFPath; i++) + { + // 2008/01/30 MH we will judge RF RX path now. + if (pHalData->bRFPathRxEnable[i]) + rf_rx_num++; + //else + //continue; + + rx_pwr[i] = ((pOfdm_buf->trsw_gain_X[i]&0x3F)*2) - 110; + + /* Translate DBM to percentage. */ + rssi=query_rx_pwr_percentage(rx_pwr[i]); + total_rssi += rssi; + + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], rssi)); + + //Get Rx snr value in DB + tmp_rxsnr = pOfdm_buf->rxsnr_X[i]; + rx_snrX = (s8)(tmp_rxsnr); + rx_snrX >>= 1; + padapter->recvpriv.RxSNRdB[i] = (int)rx_snrX; + + /* Record Signal Strength for next packet */ + //if(bPacketMatchBSSID) + { + //pRfd->Status.RxMIMOSignalStrength[i] =(u1Byte) RSSI; + + //The following is for lenovo signal strength in vista + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + u8 sq; + + if(i == 0) + { + // mapping to 5 bars for vista signal strength + // signal quality in driver will be displayed to signal strength + // in vista. + if(rssi >= 50) + sq = 100; + else if(rssi >= 35 && rssi < 50) + sq = 80; + else if(rssi >= 22 && rssi < 35) + sq = 60; + else if(rssi >= 18 && rssi < 22) + sq = 40; + else + sq = 20; + //DbgPrint("ofdm/mcs RSSI=%d\n", RSSI); + //pRfd->Status.SignalQuality = SQ; + //DbgPrint("ofdm/mcs SQ = %d\n", pRfd->Status.SignalQuality); + } + } + } + } + + + // + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive),average + // + rx_pwr_all = (((pOfdm_buf->pwdb_all ) >> 1 )& 0x7f) -110;//for OFDM Average RSSI + pwdb_all = query_rx_pwr_percentage(rx_pwr_all); + + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("PWDB_ALL=%d\n", pwdb_all)); + + pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive + pattrib->RecvSignalPower = rx_pwr_all;//dBM + padapter->recvpriv.rxpwdb = rx_pwr_all; + // + // (3)EVM of HT rate + // + if(pHalData->CustomerID != RT_CID_819x_Lenovo) + { + if(pattrib->rxht && pattrib->mcs_rate >=20 && pattrib->mcs_rate<=27) + max_spatial_stream = 2; //both spatial stream make sense + else + max_spatial_stream = 1; //only spatial stream 1 makes sense + + for(i=0; i>= 1" because the compilor of free build environment + // fill most significant bit to "zero" when doing shifting operation which may change a negative + // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. + evm = evm_db2percentage( (pOfdm_buf->rxevm_X[i]/*/ 2*/));//dbm + + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", + pattrib->mcs_rate, pOfdm_buf->rxevm_X[i], "%",evm)); + + //if(bPacketMatchBSSID) + { + if(i==0) // Fill value in RFD, Get the first spatial stream only + { + pattrib->signal_qual = (u8)(evm & 0xff); + } + pattrib->rx_mimo_signal_qual[i] = (u8)(evm & 0xff); + } + } + + } + + // + // 4. Record rx statistics for debug + // + + } + + + //UI BSS List signal strength(in percentage), make it good looking, from 0~100. + //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). + if(bcck_rate) + { + pattrib->signal_strength=(u8)signal_scale_mapping(padapter, pwdb_all); + } + else + { + if (rf_rx_num != 0) + { + pattrib->signal_strength= (u8)(signal_scale_mapping(padapter, total_rssi/=rf_rx_num)); + } + } + //DBG_8192C("%s,rx_pwr_all(%d),RxPWDBAll(%d)\n",__FUNCTION__,rx_pwr_all,pattrib->RxPWDBAll); + +} + + +static void process_rssi(_adapter *padapter,union recv_frame *prframe) +{ + u32 last_rssi, tmp_val; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + struct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //DBG_8192C("process_rssi=> pattrib->rssil(%d) signal_strength(%d)\n ",pattrib->RecvSignalPower,pattrib->signal_strength); + //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) + { + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + if(signal_stat->update_req) { + signal_stat->total_num = 0; + signal_stat->total_val = 0; + signal_stat->update_req = 0; + } + + signal_stat->total_num++; + signal_stat->total_val += pattrib->signal_strength; + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; + #else //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //Adapter->RxStats.RssiCalculateCnt++; //For antenna Test + if(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX) + { + padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX; + last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index]; + padapter->recvpriv.signal_strength_data.total_val -= last_rssi; + } + padapter->recvpriv.signal_strength_data.total_val +=pattrib->signal_strength; + + padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->signal_strength; + if(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX) + padapter->recvpriv.signal_strength_data.index = 0; + + + tmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num; + + if(padapter->recvpriv.is_signal_dbg) { + padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg; + padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg); + } else { + padapter->recvpriv.signal_strength= tmp_val; + padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val); + } + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num)); + #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + } + +}// Process_UI_RSSI_8192C + + +static void process_PWDB(_adapter *padapter, union recv_frame *prframe) +{ + int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedCCK; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct rx_pkt_attrib *pattrib= &prframe->u.hdr.attrib; + struct sta_info *psta = prframe->u.hdr.psta; + u8 isCCKrate=(pattrib->mcs_rate<=3? 1:0); + + + if(psta) + { + UndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; + UndecoratedSmoothedCCK = psta->rssi_stat.UndecoratedSmoothedCCK; + } + else + { + UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB; + UndecoratedSmoothedCCK = pdmpriv->UndecoratedSmoothedCCK; + } + + //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) + + if(!isCCKrate) + { + // Process OFDM RSSI + if(UndecoratedSmoothedPWDB < 0) // initialize + { + UndecoratedSmoothedPWDB = pattrib->RxPWDBAll; + } + + if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedPWDB) + { + UndecoratedSmoothedPWDB = + ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + + UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB + 1; + } + else + { + UndecoratedSmoothedPWDB = + ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + } + } + else + { + // Process CCK RSSI + if(UndecoratedSmoothedCCK < 0) // initialize + { + UndecoratedSmoothedCCK = pattrib->RxPWDBAll; + } + + if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedCCK) + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + + UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; + } + else + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + } + } + + + + if(psta) + { + //psta->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;//todo: + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + + if(pdmpriv->RSSI_Select == RSSI_OFDM) + psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + else if(pdmpriv->RSSI_Select == RSSI_CCK) + psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK; + + psta->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; + } + else + { + //pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + + if(pdmpriv->RSSI_Select == RSSI_OFDM) + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + else if(pdmpriv->RSSI_Select == RSSI_CCK) + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK; + + pdmpriv->UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; + } + + //UpdateRxSignalStatistics8192C(padapter, prframe); + +} + + +static void process_link_qual(_adapter *padapter,union recv_frame *prframe) +{ + u32 last_evm=0, tmpVal; + struct rx_pkt_attrib *pattrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + struct signal_stat * signal_stat; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + if(prframe == NULL || padapter==NULL){ + return; + } + + pattrib = &prframe->u.hdr.attrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + signal_stat = &padapter->recvpriv.signal_qual_data; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //DBG_8192C("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + if(signal_stat->update_req) { + signal_stat->total_num = 0; + signal_stat->total_val = 0; + signal_stat->update_req = 0; + } + + signal_stat->total_num++; + signal_stat->total_val += pattrib->signal_strength; + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; + +#else //CONFIG_NEW_SIGNAL_STAT_PROCESS + if(pattrib->signal_qual != 0) + { + // + // 1. Record the general EVM to the sliding window. + // + if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) + { + padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; + last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; + padapter->recvpriv.signal_qual_data.total_val -= last_evm; + } + padapter->recvpriv.signal_qual_data.total_val += pattrib->signal_qual; + + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->signal_qual; + if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) + padapter->recvpriv.signal_qual_data.index = 0; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, pattrib->signal_qual)); + + // <1> Showed on UI for user, in percentage. + tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; + padapter->recvpriv.signal_qual=(u8)tmpVal; + + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" pattrib->signal_qual =%d\n", pattrib->signal_qual)); + } +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + +}// Process_UiLinkQuality8192S + + +//void rtl8192c_process_phy_info(_adapter *padapter, union recv_frame *prframe) +void rtl8192c_process_phy_info(_adapter *padapter, void *prframe) +{ + union recv_frame *precvframe = (union recv_frame *)prframe; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + // If we switch to the antenna for testing, the signal strength + // of the packets in this time shall not be counted into total receiving power. + // This prevents error counting Rx signal strength and affecting other dynamic mechanism. + + // Select the packets to do RSSI checking for antenna switching. + SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); + + if(GET_HAL_DATA(padapter)->RSSI_test == _TRUE) + return; +#endif + // + // Check RSSI + // + process_rssi(padapter, precvframe); + // + // Check PWDB. + // + process_PWDB(padapter, precvframe); + // + // Check EVM + // + process_link_qual(padapter, precvframe); + +} diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c new file mode 100755 index 000000000000..226ed8f68406 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c @@ -0,0 +1,285 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#include +#include +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +extern void rtw_cancel_all_timer(_adapter *padapter); + +void rtl8192c_sreset_init_value(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + _rtw_mutex_init(&psrtpriv->silentreset_mutex ); + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +} +void rtl8192c_sreset_reset_value(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +} + +static void _restore_security_setting(_adapter *padapter) +{ + u8 EntryId = 0; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_priv * pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + + (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) + ? rtw_write8(padapter, REG_SECCFG, 0xcc) + : rtw_write8(padapter, REG_SECCFG, 0xcf); + + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || + ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) + { + + for(EntryId=0; EntryId<4; EntryId++) + { + if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1); + else + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0); + } + + } + else if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + { + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + if (psta == NULL) { + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); + } + else + { + //pairwise key + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); + //group key + rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0); + } + } + +} + +static void _restore_network_status(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + unsigned short caps; + u8 join_type; +#if 1 + + //======================================================= + // reset related register of Beacon control + + //set MSR to nolink + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + // reject all data frame + rtw_write16(padapter, REG_RXFLTMAP2,0x00); + //reset TSF + rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); + + //disable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); + else + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); + + //======================================================= + rtw_joinbss_reset(padapter); + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + //pmlmeinfo->assoc_AP_vendor = maxAP; + + if (padapter->registrypriv.wifi_spec) { + // for WiFi test, follow WMM test plan spec + rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F431C); + rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E541C); + rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x0000A525); + rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A549); + + // for WiFi test, mixed mode with intel STA under bg mode throughput issue + if (padapter->mlmepriv.htpriv.ht_option == 0) + rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00004320); + + } else { + rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F3217); + rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E4317); + rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00105320); + rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A444); + } + + //disable dynamic functions, such as high power, DIG + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); +#endif + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); + join_type = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + mlmeext_joinbss_event_callback(padapter, 1); + //restore Sequence No. + rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); +} +void rtl8192c_silentreset_for_specific_platform(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + _irqL irqL; + + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + if (!netif_queue_stopped(padapter->pnetdev)) + netif_stop_queue(padapter->pnetdev); + + rtw_cancel_all_timer(padapter); + tasklet_kill(&pxmitpriv->xmit_tasklet); + + _enter_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); + psrtpriv->silent_reset_inprogress = _TRUE; + pwrpriv->change_rfpwrstate = rf_off; +#ifdef CONFIG_IPS + ips_enter(padapter); + ips_leave(padapter); +#endif + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + _restore_network_status(padapter); + _restore_security_setting(padapter); + } + + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); + + psrtpriv->silent_reset_inprogress = _FALSE; + _exit_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); + + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + + if (netif_queue_stopped(padapter->pnetdev)) + netif_wake_queue(padapter->pnetdev); +} + +void rtl8192c_sreset_xmit_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + unsigned long current_time; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + unsigned int diff_time; + + if(rtw_read32(padapter, REG_TXDMA_STATUS) !=0x00){ + rtl8192c_silentreset_for_specific_platform(padapter); + } + + //total xmit irp = 4 + //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); + //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) + current_time = rtw_get_current_time(); + if(0==pxmitpriv->free_xmitbuf_cnt) + { + diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_time); + + if(diff_time > 2000){ + if(psrtpriv->last_tx_complete_time==0){ + psrtpriv->last_tx_complete_time = current_time; + } + else{ + diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_complete_time); + if(diff_time > 4000){ + //padapter->Wifi_Error_Status = WIFI_TX_HANG; + DBG_8192C("tx hang...start reset\n"); + rtl8192c_silentreset_for_specific_platform(padapter); + } + } + } + } +} +void rtl8192c_sreset_linked_status_check(_adapter *padapter) +{ + u32 regc50,regc58,reg824,reg800; + regc50 = rtw_read32(padapter,0xc50); + regc58 = rtw_read32(padapter,0xc58); + reg824 = rtw_read32(padapter,0x824); + reg800 = rtw_read32(padapter,0x800); + if( ((regc50&0xFFFFFF00)!= 0x69543400)|| + ((regc58&0xFFFFFF00)!= 0x69543400)|| + (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| + ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) + { + rtl8192c_silentreset_for_specific_platform(padapter); + } +} + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +u8 rtl8192c_sreset_get_wifi_status(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + u8 status = WIFI_STATUS_SUCCESS; + u32 val32 = 0; + _irqL irqL; + if(psrtpriv->silent_reset_inprogress == _TRUE) + { + return status; + } + val32 =rtw_read32(padapter,REG_TXDMA_STATUS); + if(val32==0xeaeaeaea){ + psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; + } + else if(val32!=0){ + DBG_8192C("txdmastatu(%x)\n",val32); + psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; + } + + if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) + { + DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); + status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); + } + DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); + + //status restore + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + return status; +} +#endif + +#endif diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c new file mode 100755 index 000000000000..a6a9bb34dbb4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c @@ -0,0 +1,7346 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +/*Created on 2011/ 6/15, 5:45*/ + +#include +#include "Hal8192CUHWImg.h" + +#ifdef CONFIG_BT_COEXISTENCE +// =================== TSMC Normal FW V75 2011-06-15 ======================= +u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = { +0xc1,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x10,0x55,0x54,0x3a,0x00,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, +0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, +0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, +0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, +0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, +0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, +0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, +0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, +0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, +0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, +0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, +0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, +0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, +0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, +0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, +0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, +0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, +0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, +0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, +0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, +0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, +0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, +0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, +0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, +0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, +0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, +0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, +0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, +0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, +0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, +0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, +0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, +0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, +0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, +0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, +0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, +0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, +0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, +0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, +0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, +0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, +0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, +0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, +0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, +0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, +0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, +0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, +0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, +0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0xab,0x22,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75, +0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, +0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, +0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, +0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, +0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, +0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, +0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, +0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, +0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, +0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, +0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, +0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, +0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, +0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, +0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, +0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, +0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, +0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6, +0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xcf,0x90,0x97,0x93,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, +0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, +0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, +0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36, +0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, +0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, +0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, +0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, +0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x29,0xd9,0xf5, +0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, +0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, +0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, +0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, +0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, +0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, +0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, +0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, +0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, +0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, +0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, +0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, +0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, +0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, +0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, +0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, +0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, +0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, +0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, +0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, +0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, +0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, +0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, +0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, +0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, +0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, +0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, +0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, +0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, +0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, +0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, +0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, +0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, +0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, +0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, +0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, +0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, +0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, +0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, +0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, +0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, +0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, +0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, +0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, +0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, +0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, +0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, +0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, +0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, +0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, +0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, +0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, +0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0xa2, +0x12,0x5f,0xb4,0x12,0x32,0x3d,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, +0x12,0x77,0xdc,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, +0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, +0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, +0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, +0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, +0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, +0x12,0x78,0x3a,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, +0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, +0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, +0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, +0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, +0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, +0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, +0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, +0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, +0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, +0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, +0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, +0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, +0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, +0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, +0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, +0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, +0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, +0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, +0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, +0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, +0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90, +0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, +0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, +0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80, +0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, +0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, +0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, +0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, +0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, +0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, +0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, +0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, +0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, +0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, +0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, +0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, +0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, +0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, +0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, +0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, +0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, +0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, +0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, +0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, +0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x79,0x12,0x90,0x97,0x5a,0x12,0x43,0x6b, +0x02,0x77,0xa9,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x22,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, +0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, +0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, +0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, +0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, +0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, +0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, +0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, +0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, +0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, +0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, +0x82,0x8c,0x83,0xef,0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, +0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, +0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, +0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, +0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, +0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, +0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, +0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, +0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, +0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, +0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, +0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, +0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, +0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, +0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, +0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, +0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, +0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x29, +0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, +0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, +0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, +0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, +0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, +0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, +0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, +0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, +0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, +0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, +0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, +0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, +0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, +0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, +0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, +0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, +0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, +0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, +0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, +0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, +0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, +0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, +0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, +0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, +0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, +0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, +0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, +0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, +0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, +0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, +0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, +0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, +0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, +0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, +0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, +0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, +0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, +0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, +0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, +0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, +0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, +0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, +0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, +0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, +0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, +0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, +0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, +0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, +0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, +0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, +0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, +0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, +0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, +0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, +0x60,0x05,0x7f,0x01,0x12,0x76,0xfa,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, +0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, +0xfa,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, +0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, +0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, +0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, +0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, +0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, +0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, +0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, +0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, +0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, +0x14,0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, +0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, +0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, +0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, +0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, +0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, +0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, +0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, +0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, +0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, +0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, +0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, +0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, +0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, +0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, +0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, +0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, +0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, +0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, +0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, +0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, +0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b, +0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, +0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, +0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29, +0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, +0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, +0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5, +0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, +0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, +0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, +0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1b,0x9f,0xe5, +0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, +0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, +0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, +0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, +0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, +0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, +0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, +0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, +0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, +0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, +0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, +0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, +0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, +0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, +0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, +0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, +0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, +0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, +0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, +0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, +0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, +0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, +0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, +0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, +0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, +0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, +0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, +0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, +0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, +0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, +0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, +0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, +0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, +0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, +0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, +0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, +0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, +0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x26,0x22,0x12,0x29,0xd9,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, +0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, +0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, +0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, +0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, +0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, +0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, +0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66, +0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, +0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, +0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, +0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, +0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, +0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x29,0xd9,0x65, +0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x29,0xd9,0xf5,0x26, +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, +0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, +0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, +0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, +0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, +0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60,0x2c, +0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, +0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, +0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, +0x43,0x6b,0x12,0x29,0xd9,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, +0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, +0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, +0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, +0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, +0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, +0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, +0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, +0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, +0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, +0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, +0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, +0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, +0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, +0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, +0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, +0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, +0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, +0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, +0x00,0x12,0x37,0x54,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, +0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f,0xe5,0x90,0x97,0x1d,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x21, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, +0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95, +0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59, +0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x7f, +0x78,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, +0x12,0x27,0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde, +0x90,0x97,0x25,0x12,0x2a,0x7f,0x90,0x97,0x86,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d, +0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53, +0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12, +0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x53, +0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12, +0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x29,0x12,0x2a,0x7f,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81, +0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00, +0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02, +0x4f,0xe5,0x90,0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71, +0x63,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x75,0x2e,0x90,0x97,0x19,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc5, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9, +0x90,0x96,0xc9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd5,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd9,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x96,0xdd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xed,0x12,0x43, +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, +0xf1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x96,0xf5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x01,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x05, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x97,0x09,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, +0x12,0x2f,0xd9,0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97,0x15,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x2d,0x74, +0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x2e,0x7f,0x8c,0x7e, +0x08,0x12,0x27,0xde,0x90,0x97,0x19,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27, +0xde,0x90,0x96,0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x96, +0xc9,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xcd,0x12,0x2a, +0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd1,0x12,0x2a,0x7f,0x7f,0x74, +0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd5,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12, +0x27,0xde,0x90,0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x96,0xdd,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe1,0x12, +0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe5,0x12,0x2a,0x7f,0x7f, +0x88,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe9,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e, +0x12,0x27,0xde,0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde, +0x90,0x96,0xf1,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf5, +0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf9,0x12,0x2a,0x7f, +0x7f,0xdc,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xfd,0x12,0x2a,0x7f,0x7f,0xe0,0x7e, +0x0e,0x12,0x27,0xde,0x90,0x97,0x01,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27, +0xde,0x90,0x97,0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97, +0x09,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0x0d,0x12,0x2a, +0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0x11,0x12,0x2a,0x7f,0x7f,0x04, +0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x15,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, +0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44, +0xc0,0xfd,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80, +0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f, +0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4, +0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25, +0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb, +0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20, +0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, +0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, +0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e, +0x0c,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, +0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef, +0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e, +0x0d,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, +0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f, +0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f, +0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x2a,0x7f, +0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97, +0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97, +0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90, +0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec, +0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3, +0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0, +0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x46,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x45,0x80,0x68,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8, +0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54, +0xf0,0x12,0x4f,0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0xbc,0xe0,0x60,0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90, +0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4, +0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92, +0xaf,0x22,0x8b,0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97, +0x3b,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08, +0x12,0x27,0xde,0x90,0x97,0x34,0x12,0x2a,0x7f,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8, +0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03, +0xfc,0x12,0x43,0x46,0x90,0x97,0x3e,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80, +0x2d,0xe4,0x90,0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03, +0xfc,0xec,0x44,0xc0,0xfc,0x90,0x97,0x34,0x12,0x2a,0x7f,0x90,0x97,0x34,0x12,0x43, +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97, +0x3b,0xe0,0x30,0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e, +0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x54,0xf3,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f, +0x46,0x12,0x47,0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60, +0x6a,0x24,0x02,0x60,0x02,0xe1,0xa8,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48, +0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd, +0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75, +0xe4,0x90,0x97,0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f, +0x45,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01, +0xf0,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e, +0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0, +0x44,0x10,0xfd,0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x97,0x3c,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12, +0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40, +0x7f,0x01,0x12,0x36,0xaf,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45, +0x12,0x47,0x52,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97, +0x42,0xf0,0x90,0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97, +0x44,0xf0,0x90,0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97, +0x4c,0xf0,0x90,0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00, +0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01, +0x60,0x08,0x90,0x97,0x3a,0xe0,0x60,0x02,0x21,0x11,0x90,0x97,0x2e,0xe0,0xc3,0x94, +0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50, +0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94, +0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90, +0x97,0x2e,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, +0x97,0x42,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43, +0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0, +0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42, +0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50, +0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, +0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, +0xf0,0xe4,0x90,0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, +0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12, +0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25, +0xe0,0x90,0x97,0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61, +0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63, +0xe0,0x90,0x97,0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90, +0x97,0x39,0xe0,0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90, +0x97,0x3a,0xe0,0x70,0x02,0x41,0x1c,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x1c,0x90, +0x97,0x3d,0xe0,0x70,0x02,0x41,0x1c,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2, +0xaf,0x90,0x97,0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12, +0x47,0x49,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90, +0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64, +0x80,0xf0,0x90,0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05, +0x85,0xf0,0x90,0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05, +0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0, +0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2d,0x90,0x97,0x3a,0xe0, +0x70,0x2f,0x90,0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f, +0x46,0x12,0x47,0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0, +0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92, +0xaf,0x22,0x6b,0xc3,}; +#else +// =================== TSMC FW P2P_PS V75 2011-06-15 ======================= +u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = { +0xc1,0x88,0x02,0x05,0x4b,0x00,0x00,0x00,0x06,0x15,0x10,0x56,0x9a,0x3b,0x00,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4a,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x58,0x29,0x00,0x00,0x00,0x00,0x00,0xa1,0x53,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04,0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05, +0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e, +0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a,0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e, +0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a, +0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00,0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04, +0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60, +0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50,0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40, +0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c,0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8, +0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c, +0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28, +0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0,0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64, +0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4,0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02, +0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c, +0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12,0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06, +0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e,0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb, +0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0, +0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0, +0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12, +0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83, +0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xeb, +0x02,0x50,0x7f,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2, +0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33, +0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf, +0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x30,0xe4,0x7e, +0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93, +0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3, +0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca, +0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe, +0x48,0x97,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x4e,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x97,0x56,0x00,0x41,0x97,0xab,0x00,0x41,0x97, +0x68,0x80,0x41,0x97,0xad,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f, +0x54,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x8a,0xeb,0xf0,0xa3, +0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf, +0x22,0xe4,0x90,0x97,0x8b,0xf0,0x90,0x05,0x58,0xe0,0xff,0x90,0x97,0x86,0xe0,0x2f, +0x24,0xfe,0x90,0x97,0x8c,0xf0,0xe4,0xfb,0xfd,0x7f,0x50,0x7e,0x01,0x91,0x63,0x90, +0x01,0x53,0x74,0x05,0xf0,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08, +0xf0,0xe4,0x90,0x97,0x8b,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e, +0x01,0x91,0x63,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90, +0x97,0x72,0x14,0xf0,0x90,0x97,0x74,0xe0,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x11,0x7d, +0x01,0x7f,0x0c,0x12,0x49,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x03,0x12,0x4f,0x22, +0x22,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0x12,0x5a,0xf7,0x02,0x57, +0x68,0x22,0x22,0x02,0x58,0x74,0x02,0x58,0x7b,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x8d,0x71,0x7e,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0x90,0x71,0x7e,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0x90, +0xe4,0x75,0xf0,0x01,0x71,0x67,0x12,0x29,0xd9,0xff,0x90,0x97,0x8d,0xe4,0x75,0xf0, +0x01,0x71,0x67,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00, +0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07, +0x90,0x01,0xc4,0x74,0x53,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c, +0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5, +0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x53,0x90,0x01,0x3c,0x74, +0x01,0xf0,0x90,0x97,0x80,0xe0,0x30,0xe0,0x20,0x13,0x13,0x54,0x3f,0x30,0xe0,0x19, +0x90,0x97,0x82,0xe4,0xf0,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xf1, +0x79,0xef,0x70,0x05,0x7f,0x02,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0xff,0x30,0xe0, +0x1e,0x13,0x13,0x54,0x3f,0x30,0xe0,0x17,0x90,0x97,0x7c,0xe4,0xf0,0x90,0x97,0x7b, +0xe0,0x64,0x04,0x60,0x0a,0xe4,0xff,0xf1,0x79,0xef,0x70,0x03,0x12,0x57,0xb9,0xe5, +0x34,0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x5d,0x59,0xe5,0x34,0x30, +0xe2,0x35,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90, +0x97,0x8b,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91, +0x63,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90, +0x97,0x73,0xe4,0xf0,0x12,0x4a,0x63,0xe5,0x34,0x30,0xe3,0x35,0x90,0x01,0x3c,0x74, +0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x8b,0xe4,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x63,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x97,0x72,0xe4,0xf0,0x12,0x4a, +0x63,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0,0x12,0x72,0x06,0xe5, +0x35,0x30,0xe0,0x11,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97, +0x76,0xf0,0x12,0x4a,0x63,0xe5,0x36,0x30,0xe1,0x46,0x90,0x01,0x3e,0x74,0x02,0xf0, +0x90,0x97,0x80,0xe0,0x30,0xe0,0x1a,0x90,0x97,0x84,0x74,0x01,0xf0,0x90,0x97,0x81, +0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xf1,0x79,0xef,0x70,0x05,0x7f,0x02,0x12,0x55, +0xcb,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x18,0x90,0x97,0x7e,0x74,0x01,0xf0,0x90,0x97, +0x7b,0xe0,0x64,0x04,0x60,0x0a,0xe4,0xff,0xf1,0x79,0xef,0x70,0x03,0x12,0x57,0xb9, +0xe5,0x36,0x30,0xe0,0x6e,0x90,0x01,0x3e,0x74,0x01,0xf0,0x90,0x97,0x80,0xe0,0x30, +0xe0,0x19,0x90,0x97,0x84,0xe4,0xf0,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0c,0x7f, +0x01,0xf1,0x79,0xef,0x60,0x05,0x7f,0x01,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0x30, +0xe0,0x41,0x90,0x97,0x7e,0xe4,0xf0,0xff,0xf1,0x79,0xef,0x60,0x36,0x12,0x74,0xad, +0x90,0x97,0x7b,0xe0,0xff,0x64,0x04,0x60,0x2a,0xef,0xb4,0x03,0x07,0xe4,0xff,0x12, +0x56,0x56,0x80,0x12,0x90,0x97,0x7b,0xe0,0xb4,0x02,0x18,0x12,0x59,0x90,0xef,0x70, +0x05,0x7f,0x01,0x12,0x56,0x56,0x90,0x97,0x76,0xe0,0xff,0x7d,0x01,0x12,0x49,0x0a, +0x12,0x4f,0x22,0x74,0x53,0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07, +0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0, +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xef,0x64,0x01,0x70,0x3d,0x90,0x97, +0x83,0xe0,0x60,0x03,0x7f,0x00,0x22,0x90,0x97,0x66,0xe0,0x60,0x03,0x7f,0x01,0x22, +0x90,0x97,0x82,0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x80,0xe0,0xff,0x13,0x13, +0x54,0x3f,0x30,0xe0,0x0b,0xef,0xc4,0x13,0x54,0x07,0x30,0xe0,0x03,0x7f,0x00,0x22, +0x90,0x97,0x84,0xe0,0x7f,0x01,0x60,0x36,0x7f,0x00,0x22,0x90,0x97,0x7d,0xe0,0x60, +0x03,0x7f,0x00,0x22,0x90,0x97,0x66,0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x7c, +0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x7a,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0, +0x03,0x7f,0x00,0x22,0x90,0x97,0x7e,0xe0,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0xe4, +0xf5,0x23,0x7f,0x60,0x7e,0x01,0x81,0xf1,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90, +0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6, +0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f, +0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,0x7d,0x01,0x90,0x97,0x99,0xef,0xf0,0xa3, +0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x6a,0x60,0x04,0xe4,0xff,0x11,0xbb,0x90, +0x97,0x99,0xe0,0x30,0xe0,0x09,0x90,0x97,0x9b,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90, +0x97,0x99,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90, +0x97,0x9a,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x44,0x80,0xf0,0x90,0x97,0x9b,0xa3,0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54, +0xf7,0xf0,0x90,0x97,0x9b,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60,0x0b,0x90,0x97, +0x67,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x67,0xe0,0xb4,0x01,0x05, +0x7f,0x01,0x12,0x75,0x21,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x74,0xd1,0xef, +0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0xe5, +0x6a,0x60,0x04,0x7f,0x01,0x11,0xbb,0x12,0x73,0x9d,0x90,0x97,0x74,0xe0,0x54,0xf0, +0xf0,0xe0,0x44,0x02,0xf0,0x22,0xe0,0xff,0x7d,0x01,0x8f,0x67,0x8d,0x68,0xe5,0x67, +0x54,0x0f,0xff,0x90,0x97,0x74,0xe0,0x54,0x0f,0x6f,0x60,0x76,0xe5,0x67,0x30,0xe2, +0x30,0x90,0x97,0x74,0xe0,0x20,0xe2,0x05,0x7f,0x01,0x12,0x5a,0xd9,0x90,0x97,0x74, +0xe0,0x30,0xe3,0x0a,0xe5,0x67,0x20,0xe3,0x05,0x12,0x5a,0xbd,0x80,0x54,0x90,0x97, +0x74,0xe0,0x20,0xe3,0x4d,0xe5,0x67,0x30,0xe3,0x48,0xaf,0x68,0x12,0x5a,0x65,0x80, +0x41,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0d,0xe5,0x67,0x20,0xe3,0x08, +0xf1,0xfb,0xef,0x60,0x2d,0x12,0x5a,0xbd,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf, +0x04,0x0d,0xe5,0x67,0x20,0xe2,0x08,0x12,0x59,0x90,0xef,0x60,0x15,0x11,0xd6,0x90, +0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x09,0x12,0x59,0xf3,0xef,0x60,0x03,0x12, +0x5b,0xec,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0x90,0x97,0x76,0xe0,0x54,0x0f,0x6f, +0x70,0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0x90,0x97,0x68, +0xe0,0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x68,0xf0,0x90,0x97, +0x76,0xe0,0x54,0xbf,0xf0,0x22,0xef,0x64,0x01,0x70,0x3b,0x7d,0x7c,0x7f,0x02,0x12, +0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01, +0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x31,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0, +0x02,0xf1,0x22,0xe4,0xff,0x11,0xbb,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06, +0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0,0xa3,0x74,0x02,0xf0, +0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0x90,0x06,0x04, +0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x97,0x6f,0xe0,0xa3, +0xe0,0x90,0x05,0x58,0xf0,0xe5,0x69,0x30,0xe0,0x23,0x90,0x97,0x6c,0xe0,0x70,0x22, +0xe0,0x04,0xf0,0x90,0x97,0x74,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01, +0x7f,0x04,0x31,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x07,0xe1,0x22,0xe4,0x90,0x97, +0x6c,0xf0,0x22,0x90,0x97,0x7a,0xe0,0x90,0x97,0x76,0x30,0xe0,0x05,0xe0,0xff,0x02, +0x74,0x87,0x21,0x06,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x74,0xf0,0x74,0x4a,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x81,0x0c,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0x61,0xc4,0xe5,0x54,0x30,0xe5,0x02,0x61,0xc4,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x52,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x52,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5e,0x41,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5d,0xfd,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x3f,0x90,0x97,0x77, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xf1,0xde, +0xef,0x64,0x01,0x70,0x27,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x73,0xf0,0x80,0x07,0xf1,0xde,0xbf,0x01,0x02,0x51,0x63,0xe5,0x2c,0x30,0xe1, +0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3,0x5a, +0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f,0x12, +0x6f,0x15,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c,0x30, +0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x24, +0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1d,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20, +0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0xf1,0x87,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0, +0xf1,0x62,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5, +0x2e,0x30,0xe1,0x4c,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90,0x01,0x02, +0xe0,0x54,0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01, +0xf0,0x90,0x97,0x56,0xe4,0xf0,0x80,0x18,0x90,0x97,0x56,0xe0,0x04,0xf0,0xe0,0xc3, +0x94,0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x50,0x4a, +0x90,0x97,0x85,0xe0,0xb4,0x01,0x09,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x85,0xf0, +0xe5,0x2e,0x20,0xe0,0x02,0xa1,0x74,0x90,0x97,0x66,0x74,0x01,0xf0,0x90,0x01,0x36, +0xf0,0x90,0x97,0x80,0xe0,0x30,0xe0,0x30,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x97, +0x80,0xe0,0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x1e,0x90,0x97,0x82,0x74,0x01,0xf0, +0x12,0x44,0x81,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0d,0x7f,0x01,0x12,0x47,0x79, +0xef,0x60,0x05,0x7f,0x01,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0xff,0x30,0xe0,0x4c, +0x13,0x13,0x54,0x3f,0x30,0xe0,0x45,0x90,0x97,0x7c,0x74,0x01,0xf0,0x12,0x44,0x81, +0xe4,0xff,0x12,0x47,0x79,0xef,0x60,0x34,0x12,0x74,0xad,0x90,0x97,0x7b,0xe0,0xff, +0x64,0x04,0x60,0x28,0xef,0xb4,0x03,0x07,0xe4,0xff,0x12,0x56,0x56,0x80,0x12,0x90, +0x97,0x7b,0xe0,0xb4,0x02,0x16,0x12,0x59,0x90,0xef,0x70,0x05,0x7f,0x01,0x12,0x56, +0x56,0x90,0x97,0x76,0xe0,0xff,0x7d,0x01,0x31,0x0a,0xf1,0x22,0x12,0x5c,0xb6,0x90, +0x97,0x66,0xe4,0xf0,0xe5,0x2e,0x20,0xe2,0x02,0xa1,0xfa,0x90,0x01,0x36,0x74,0x04, +0xf0,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x06,0xa3,0xe0,0x64,0x04,0x60,0x6c,0xe5,0x69, +0x64,0x01,0x70,0x66,0xe5,0x6a,0x60,0x62,0xe5,0x6a,0x64,0x02,0x60,0x06,0xe5,0x6a, +0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x6a,0xf0,0x90,0x06,0xaa,0xe0, +0x90,0x97,0x75,0xf0,0x90,0x97,0x6a,0xe0,0x70,0x07,0x90,0x97,0x75,0xe0,0xff,0x80, +0x05,0x90,0x97,0x6a,0xe0,0xff,0x90,0x97,0x6a,0xef,0xf0,0x90,0x97,0x6c,0xe0,0x60, +0x03,0xe0,0x14,0xf0,0x90,0x97,0x6b,0xe4,0xf0,0x90,0x01,0x57,0xf0,0x90,0x01,0x3c, +0x74,0x02,0xf0,0x90,0x97,0x79,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xef,0xf0,0xe5,0x6a, +0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x5c,0x1c,0xe5,0x2e,0x30,0xe3,0x28,0x90, +0x01,0x36,0x74,0x08,0xf0,0xe5,0x69,0x64,0x01,0x70,0x1c,0xe5,0x6a,0x60,0x18,0x90, +0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8b,0xe4,0x12,0x44, +0x57,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2e,0x90,0x01,0x36,0x74, +0x10,0xf0,0xe5,0x69,0x64,0x01,0x70,0x22,0xe5,0x6a,0x60,0x1e,0x90,0x01,0x57,0xe4, +0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x78,0xe4,0xf0,0x90,0x97,0x79,0xe0, +0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x02,0x51,0x63,0xe5,0x2e,0x30,0xe5,0x1f,0x90, +0x01,0x36,0x74,0x20,0xf0,0xe5,0x69,0xb4,0x01,0x14,0xe5,0x6a,0x60,0x10,0x90,0x97, +0x77,0xe0,0x64,0x02,0x60,0x05,0x12,0x5c,0x05,0x80,0x03,0x12,0x44,0xa6,0xe5,0x2e, +0x30,0xe6,0x1d,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x69,0xb4,0x01,0x12,0xe5,0x6a, +0x60,0x0e,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x07,0x70,0x02,0x51,0x63, +0xe5,0x2f,0x30,0xe1,0x25,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x97,0x7a,0xe0,0x30, +0xe0,0x16,0xe4,0xff,0x12,0x47,0x79,0xef,0x60,0x06,0xd1,0xf0,0xf1,0x22,0x80,0x0a, +0x90,0x97,0x7f,0x74,0x01,0xf0,0x80,0x02,0xd1,0xf0,0x74,0x74,0x04,0x90,0x01,0xc4, +0xf0,0x74,0x4a,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0, +0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32, +0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x21, +0x90,0x97,0x77,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x74,0xe0, +0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01,0x7f,0x04,0x31,0x0a,0xe4,0xff,0x11, +0xbb,0x22,0x90,0x97,0x7b,0xe0,0x64,0x04,0x60,0x2f,0x90,0x97,0x74,0xe0,0x54,0x0f, +0x14,0x60,0x1f,0x14,0x60,0x15,0x24,0xfe,0x60,0x0a,0x24,0xf8,0x70,0x1b,0xe4,0x90, +0x97,0x7b,0xf0,0x22,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0x90,0x97,0x7b,0x74,0x02, +0xf0,0x22,0x90,0x01,0xc6,0xe0,0x44,0x08,0xf0,0x22,0xf4,0xff,0x90,0x00,0x43,0xe0, +0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0,0xd0,0x92, +0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0xf1,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1, +0x72,0xe4,0xfd,0x7f,0x51,0xf1,0x72,0xe4,0xfd,0x7f,0x52,0xf1,0x72,0xe4,0xfd,0x7f, +0x53,0x80,0xbf,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1,0x72,0x7d,0xff,0x7f,0x55, +0xf1,0x72,0x7d,0xff,0x7f,0x56,0xf1,0x72,0x7d,0xff,0x7f,0x57,0x80,0x94,0x90,0x04, +0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0x90,0x97,0x7f, +0xe0,0xb4,0x01,0x06,0xe4,0xf0,0xd1,0xf0,0xf1,0x22,0x22,0xf1,0xde,0xef,0x64,0x01, +0x60,0x09,0x90,0x01,0xb8,0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x73,0xe0,0x60, +0x09,0x90,0x01,0xb8,0xe0,0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x72,0xe0,0x60,0x09, +0x90,0x01,0xb8,0xe0,0x44,0x04,0xf0,0x80,0x17,0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3, +0x94,0x04,0x40,0x09,0x90,0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22, +0x90,0x01,0xbb,0xe0,0x44,0x08,0xf0,0x7f,0x00,0x22,0x12,0x47,0xf8,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x48,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x30,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x73,0x1b,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x65,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x67,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x67,0xf0,0x90,0x97,0x67,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x4c,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x4c, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x67,0xef,0x12,0x75,0x18, +0x12,0x58,0x82,0x12,0x32,0x3d,0xf1,0xf9,0xf1,0xe7,0x11,0x61,0xe4,0x90,0x97,0x66, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0xf1,0xcf,0x12,0x45,0x01, +0x90,0x97,0x32,0xe5,0xd9,0xf0,0x12,0x4f,0xb3,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44, +0x40,0xf0,0x12,0x4f,0x62,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x97,0x30, +0xe0,0x64,0x01,0xf0,0x24,0x7f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57, +0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x31,0x8c,0xe5,0x57,0x30,0xe6, +0x0a,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x62,0x19,0x31,0x5f,0x80,0xce,0x90, +0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b,0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9, +0x7e,0x01,0x12,0x73,0x2c,0xbf,0x01,0x09,0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80, +0x05,0x80,0x00,0x02,0x73,0x0c,0xe4,0x90,0x06,0x34,0xf0,0x22,0x90,0x01,0xcc,0xe0, +0x54,0x0f,0x90,0x97,0x33,0xf0,0x90,0x97,0x33,0xe0,0xfd,0x70,0x02,0x41,0xcd,0x90, +0x97,0xab,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x41,0xc6,0x90,0x97,0xab,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x52,0xe0,0x90,0x97,0x34,0xf0,0x75,0x63,0x01, +0x75,0x64,0x97,0x75,0x65,0x34,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79,0x35,0x12, +0x45,0x09,0x90,0x97,0x35,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90,0x97,0xab, +0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x52,0xe0,0x90,0x97, +0x36,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43,0x52,0xe0, +0x90,0x97,0x37,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43, +0x52,0xe0,0x90,0x97,0x38,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2, +0x12,0x43,0x52,0xe0,0x90,0x97,0x39,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x97,0x3a,0xf0,0x80,0x33,0xe0,0x75,0xf0,0x04, +0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x97,0x36,0xf0,0x90,0x97,0xab,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90,0x97,0x37,0xf0,0x90,0x97,0xab, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x97,0x38,0xf0,0xef, +0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x36,0x51,0xce,0x90,0x97,0x33,0xe0,0xff, +0x90,0x97,0xab,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xf4,0x5f,0x90,0x97,0x33,0xf0,0x90,0x97,0xab,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xab,0xe0,0x04,0xf0, +0xe0,0x54,0x03,0xf0,0x21,0x96,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22,0x90,0x97, +0x3b,0x12,0x43,0x7e,0xef,0x12,0x43,0x87,0x52,0xf7,0x01,0x53,0x00,0x02,0x53,0x08, +0x03,0x53,0x11,0x05,0x53,0x1a,0x06,0x53,0x43,0x07,0x53,0x23,0x08,0x53,0x2b,0x09, +0x53,0x34,0x20,0x00,0x00,0x53,0x3c,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x59,0x67, +0x90,0x97,0x3b,0x12,0x43,0x5e,0xe1,0xeb,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x70, +0x12,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x6e,0xe6,0x90,0x97,0x3b,0x12,0x43,0x5e, +0x02,0x6e,0xd0,0x90,0x97,0x3b,0x12,0x43,0x5e,0x80,0x19,0x90,0x97,0x3b,0x12,0x43, +0x5e,0x02,0x70,0x5a,0x90,0x97,0x3b,0x12,0x43,0x5e,0xe1,0xf1,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x3e,0x12,0x43, +0x7e,0xe4,0x90,0x97,0x41,0xf0,0x12,0x29,0xd9,0xc3,0x13,0x20,0xe0,0x02,0x81,0x8e, +0x90,0x97,0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x54,0x02,0xfe,0x90,0x97,0x80, +0xe0,0x54,0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0, +0x12,0x29,0xd9,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x97,0x80,0xf0, +0xee,0x54,0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x29,0xd9,0xfe,0x54,0x20, +0xfd,0xef,0x54,0xdf,0x4d,0xff,0x90,0x97,0x80,0xf0,0xee,0x54,0x40,0xfe,0xef,0x54, +0xbf,0x4e,0xf0,0x20,0xe0,0x02,0x81,0x7e,0x90,0x97,0x41,0x74,0x21,0xf0,0x90,0x97, +0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x13,0x13,0x54,0x01,0xfe,0x90,0x97,0x80, +0xe0,0xfd,0x13,0x13,0x54,0x01,0x6e,0x60,0x2a,0xef,0x54,0x04,0xff,0xed,0x54,0xfb, +0x4f,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x0e,0x90,0x01,0x34,0x74,0x40,0xf0, +0xfd,0xe4,0xff,0x12,0x36,0xe6,0x80,0x0b,0xe4,0x90,0x97,0x82,0xf0,0x7d,0x40,0xff, +0x12,0x36,0x75,0x90,0x97,0x80,0xe0,0xfd,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07, +0x90,0x97,0x41,0xe0,0x44,0x12,0xf0,0xed,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x97, +0x41,0xe0,0x44,0x14,0xf0,0x90,0x97,0x80,0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07, +0x90,0x97,0x41,0xe0,0x44,0x80,0xf0,0x90,0x97,0x80,0xe0,0xc4,0x13,0x13,0x54,0x03, +0x20,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x40,0xf0,0x90,0x97,0x41,0xe0,0x90,0x05, +0x27,0xf0,0x90,0x97,0x81,0xe0,0x70,0x04,0x7f,0x01,0xb1,0xcb,0x90,0x97,0x80,0xe0, +0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x04,0x7f,0x03,0x80,0x0e,0x7f,0x01,0x12,0x47, +0x79,0xef,0x60,0x04,0x7f,0x01,0x80,0x02,0x7f,0x02,0xb1,0xcb,0xa1,0xc6,0x90,0x97, +0x41,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0,0xe4,0xff,0xb1,0xcb,0xa1,0xc4,0x90,0x97, +0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x54,0x02,0xfe,0x90,0x97,0x7a,0xe0,0x54, +0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x29, +0xd9,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x97,0x7a,0xf0,0xee,0x54, +0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x29,0xd9,0xfe,0x54,0x40,0xfd,0xef, +0x54,0xbf,0x4d,0x90,0x97,0x7a,0xf0,0x20,0xe0,0x02,0xa1,0x97,0x90,0x97,0x41,0x74, +0x31,0xf0,0xee,0x13,0x13,0x54,0x01,0xff,0x90,0x97,0x7a,0xe0,0xfe,0x13,0x13,0x54, +0x01,0x6f,0x60,0x27,0x90,0x97,0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0x54,0x04,0xff, +0xee,0x54,0xfb,0x4f,0x90,0x97,0x7a,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x20,0xe0,0x0b, +0xe4,0x90,0x97,0x7c,0xf0,0x7d,0x40,0xff,0x12,0x36,0x75,0x90,0x97,0x7a,0xe0,0xfd, +0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x02,0xf0,0xed, +0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x04,0xf0,0x90,0x97,0x41, +0xe0,0x54,0x06,0x60,0x0c,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37, +0x00,0x90,0x97,0x41,0xe0,0x90,0x05,0x27,0xf0,0x90,0x97,0x7a,0xe0,0xff,0xc4,0x13, +0x13,0x54,0x03,0x30,0xe0,0x0c,0xa3,0xe0,0x64,0x04,0x60,0x5a,0x7f,0x04,0xd1,0x56, +0x80,0x54,0x90,0x97,0x7b,0xe0,0x64,0x04,0x70,0x18,0x7f,0x01,0xd1,0x56,0xe4,0xff, +0x12,0x47,0x79,0xef,0x60,0x08,0x90,0x97,0x76,0x12,0x49,0x06,0x80,0x04,0xf1,0xb9, +0x80,0x34,0x12,0x4f,0x22,0x80,0x2f,0x90,0x97,0x41,0x74,0x01,0xf0,0x90,0x05,0x27, +0xf0,0x7d,0x03,0x7f,0x02,0x12,0x36,0x92,0x90,0x97,0x7b,0xe0,0xb4,0x04,0x04,0x7f, +0x01,0x80,0x09,0x90,0x97,0x7b,0xe0,0xb4,0x03,0x04,0xe4,0xff,0xd1,0x56,0x12,0x4f, +0xed,0x12,0x4a,0x63,0xf1,0xf9,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x97,0x81,0xe0,0xfe, +0x6f,0x60,0x60,0xef,0x14,0x60,0x1a,0x14,0x60,0x32,0x14,0x60,0x44,0x24,0x03,0x70, +0x52,0xee,0xb4,0x03,0x02,0xe1,0x75,0x90,0x97,0x81,0xe0,0x64,0x02,0x70,0x44,0xe1, +0x8b,0x90,0x97,0x81,0xe0,0xfe,0xb4,0x03,0x04,0x7f,0x01,0x80,0x37,0xee,0xb4,0x02, +0x03,0x02,0x5b,0x76,0x90,0x97,0x81,0xe0,0x70,0x29,0x80,0x37,0x90,0x97,0x81,0xe0, +0xfe,0xb4,0x03,0x06,0xe4,0xff,0xd1,0x34,0x80,0x05,0xee,0x70,0x02,0xd1,0x43,0xe1, +0xa3,0x90,0x97,0x81,0xe0,0xb4,0x02,0x03,0x02,0x44,0xfb,0x90,0x97,0x81,0xe0,0x70, +0x02,0xf1,0x95,0x22,0xef,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x81,0x74, +0x01,0xf0,0x22,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37,0x00,0x90, +0x97,0x81,0x74,0x01,0xf0,0x22,0x90,0x97,0x7b,0xe0,0xfe,0x6f,0x70,0x02,0xe1,0x20, +0xef,0x14,0x60,0x31,0x14,0x60,0x56,0x14,0x60,0x76,0x14,0x70,0x02,0xe1,0x02,0x24, +0x04,0x60,0x02,0xe1,0x20,0xee,0xb4,0x03,0x04,0x7f,0x01,0xe1,0x44,0x90,0x97,0x7b, +0xe0,0xfe,0xb4,0x04,0x06,0x7f,0x01,0xf1,0x2b,0x80,0x08,0xee,0xb4,0x02,0x04,0x7f, +0x01,0xf1,0x21,0xe1,0x5d,0x90,0x97,0x7b,0xe0,0xb4,0x03,0x04,0x7f,0x01,0xf1,0x44, +0x90,0x97,0x7b,0xe0,0x70,0x02,0xe1,0x3a,0x90,0x97,0x7b,0xe0,0xfe,0xb4,0x04,0x04, +0x7f,0x01,0x80,0x77,0xee,0x64,0x02,0x70,0x67,0x7f,0x01,0x80,0x64,0x90,0x97,0x7b, +0xe0,0xb4,0x03,0x04,0x7f,0x01,0xf1,0x44,0x90,0x97,0x7b,0xe0,0x70,0x04,0xf1,0x3a, +0x80,0x0b,0x90,0x97,0x7b,0xe0,0xb4,0x04,0x04,0xe4,0xff,0xf1,0x2b,0x02,0x74,0x70, +0x90,0x97,0x7b,0xe0,0xfe,0xb4,0x04,0x06,0xe4,0xff,0xf1,0x2b,0x80,0x08,0xee,0xb4, +0x02,0x04,0x7f,0x01,0xf1,0x21,0x90,0x97,0x7b,0xe0,0xb4,0x01,0x02,0xf1,0x5d,0x02, +0x73,0x8e,0x90,0x97,0x7b,0xe0,0xff,0x64,0x03,0x60,0x15,0xef,0x70,0x04,0xf1,0x3a, +0x80,0x0b,0x90,0x97,0x7b,0xe0,0xb4,0x02,0x04,0xe4,0xff,0xf1,0x21,0x12,0x74,0x7a, +0x22,0x12,0x5a,0xd9,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0xef,0x60,0x05,0x90,0x05, +0x22,0xe4,0xf0,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0x12,0x5a,0xbd,0x90,0x97,0x7b, +0x74,0x01,0xf0,0x22,0x90,0x97,0xaf,0xef,0xf0,0x12,0x5a,0xf7,0x90,0x97,0xaf,0xe0, +0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0xe4,0x90,0x97,0x7b,0xf0,0x22,0x7f,0x01,0x12, +0x5a,0x65,0xe4,0x90,0x97,0x7b,0xf0,0x22,0x90,0x05,0x22,0x74,0x0f,0xf0,0x90,0x97, +0x81,0x74,0x03,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x7d,0x03,0x7f,0x02,0x12,0x36, +0x92,0x90,0x05,0x27,0xe4,0xf0,0x90,0x97,0x81,0xf0,0x22,0x12,0x5a,0xf7,0x90,0x05, +0x22,0xe4,0xf0,0x80,0xe5,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37, +0x00,0x80,0xc5,0x12,0x74,0xd1,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x12, +0x73,0x9d,0x90,0x97,0x81,0x74,0x02,0xf0,0x22,0x90,0x97,0x7b,0xe0,0xb4,0x01,0x04, +0x7f,0x02,0x80,0x08,0x90,0x97,0x7b,0xe0,0x70,0x04,0x7f,0x03,0xd1,0x56,0x22,0x75, +0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5, +0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4,0xf5,0x26,0x22,0x12,0x29,0xd9,0xf5,0x69, +0x22,0x12,0x29,0xd9,0x90,0x97,0x86,0xf0,0x22,0xe4,0x90,0x97,0x86,0xf0,0x90,0x97, +0x80,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0x90,0x97,0x7a,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0, +0xd0,0x75,0xd0,0x00,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x7d,0x29,0x90,0x01,0xc4,0xed, +0xf0,0x74,0x58,0xff,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xfe,0x90,0x00, +0x55,0xe0,0x5e,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x03,0x74,0x40,0xf0,0x90,0x01,0xc4, +0xed,0xf0,0xa3,0xef,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xe0,0x32,0x8f,0x1d,0x8c,0x1e,0x8d,0x1f,0x22,0x8f,0x20,0x8c,0x21,0x8d, +0x22,0x22,0xe4,0xf5,0x69,0x90,0x97,0x79,0xf0,0xf5,0x6a,0x90,0x97,0x76,0x74,0x0c, +0xf0,0x90,0x97,0x74,0xf0,0xe4,0x90,0x97,0x77,0xf0,0x90,0x97,0x73,0xf0,0x90,0x97, +0x72,0xf0,0x90,0x97,0x75,0x04,0xf0,0x90,0x97,0x6a,0xf0,0xe4,0x90,0x97,0x78,0xf0, +0x90,0x97,0x6c,0xf0,0x90,0x97,0x71,0x74,0x07,0xf0,0xe4,0x90,0x97,0x6b,0xf0,0x90, +0x97,0x6f,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x6e,0xf0,0x90,0x97,0x69,0xf0, +0x22,0xe4,0x90,0x97,0x78,0xf0,0x90,0x97,0x6b,0xf0,0x90,0x97,0x79,0xf0,0x22,0x8b, +0x11,0x8a,0x12,0x89,0x13,0x11,0xd1,0xab,0x11,0xaa,0x12,0xa9,0x13,0x12,0x29,0xd9, +0xf5,0x6a,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x41,0x7f, +0x01,0x80,0x3a,0xab,0x11,0xaa,0x12,0xa9,0x13,0x90,0x00,0x02,0x12,0x42,0x20,0xfd, +0xe4,0xff,0x31,0x41,0x80,0x27,0xab,0x11,0xaa,0x12,0xa9,0x13,0x90,0x00,0x02,0x12, +0x42,0x20,0xfd,0x7f,0x01,0x31,0x41,0x1f,0x80,0x13,0xab,0x11,0xaa,0x12,0xa9,0x13, +0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x31,0x41,0xe4,0xff,0x12,0x49,0xc6, +0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x75,0x74,0x01,0xf0,0x80, +0x11,0xed,0x90,0x97,0x75,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97, +0x75,0xe0,0x90,0x97,0x6a,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00, +0x01,0x12,0x42,0x20,0x90,0x97,0x77,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97, +0x69,0xf0,0x12,0x29,0xd9,0x65,0x6a,0x60,0x02,0x11,0xdf,0xd0,0xd0,0x92,0xaf,0x22, +0x12,0x4f,0xde,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0,0x44,0x01,0xf0,0x80, +0x48,0x90,0x97,0x79,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9,0xe0,0x44,0x02,0xf0, +0x80,0x37,0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x79,0xe0,0x30,0xe2,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x79,0xe0,0x30,0xe4,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44,0x04,0xf0, +0x7f,0x00,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x65,0xe0,0xb4,0x02,0x10,0x90,0x97,0x4c,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x6e,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5, +0x69,0xb4,0x01,0x04,0xe4,0xff,0x51,0x84,0x90,0x97,0x74,0xe0,0x54,0xf0,0xf0,0xe0, +0x44,0x0c,0xf0,0x22,0x8f,0x6c,0x12,0x47,0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x97, +0x61,0x12,0x48,0x26,0xe5,0x6c,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0x04, +0xe0,0x44,0x40,0xf0,0xe5,0x69,0xb4,0x01,0x04,0x7f,0x01,0x51,0x84,0x90,0x97,0x74, +0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x97,0xac,0xef,0xf0,0x51,0xf7, +0x90,0x97,0xac,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x74,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f, +0x62,0x90,0x97,0x1d,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e, +0x08,0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x46,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x46, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59, +0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x67, +0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd, +0x7f,0x01,0x12,0x34,0x81,0x22,0x51,0xf7,0x90,0x97,0x85,0xe0,0x64,0x01,0x60,0x0c, +0x90,0x01,0x36,0xe0,0x20,0xe0,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x81,0x74, +0x01,0xf0,0x22,0x8f,0x6b,0xe4,0x90,0x97,0xa5,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0, +0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6b,0x60,0x3e,0xc3,0x90,0x97,0xa6, +0xe0,0x94,0x88,0x90,0x97,0xa5,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44, +0x80,0xf0,0x22,0x90,0x97,0xa5,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x14,0x7e, +0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xa6,0xe0,0x94,0x32,0x90,0x97,0xa5,0xe0,0x94, +0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x22,0x90,0x97,0x74,0xe0, +0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0,0x12,0x45,0x02,0x71,0xeb,0xe0,0x54,0xf0,0xf0, +0xe0,0x44,0x02,0xf0,0x22,0x12,0x47,0xf8,0xbf,0x01,0x10,0x90,0x97,0x60,0xe0,0xff, +0xe4,0xfd,0x12,0x48,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0xa9,0xe0, +0xf5,0x0b,0x54,0xc0,0x70,0x0e,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd, +0xf0,0x12,0x4a,0x63,0xe5,0x0b,0x30,0xe6,0x18,0x90,0x97,0x79,0xe0,0x44,0x01,0xf0, +0x90,0x97,0x77,0xe0,0x64,0x02,0x60,0x04,0x91,0x05,0x80,0x0c,0x12,0x44,0xa6,0x80, +0x07,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90,0x97,0x79,0x30,0xe7,0x18, +0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x8b,0x12,0x44,0x57,0x90,0x01,0x57,0x74,0x05, +0xf0,0x90,0x97,0x78,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0,0x22,0x8f,0x6d,0x12, +0x47,0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x62,0x12,0x48,0x26,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x2e,0xf0,0xe5,0x6a,0x70,0x02,0xa1, +0x58,0xe5,0x69,0x64,0x01,0x60,0x02,0xa1,0x58,0xe5,0x6a,0x14,0x60,0x29,0x24,0xfd, +0x60,0x25,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x6a,0xe0,0x14,0xf0, +0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x97,0x6a,0xe0,0x70,0x0a,0x90,0x97,0x75, +0xe0,0x90,0x97,0x6a,0xf0,0x80,0x00,0x90,0x97,0x2e,0x74,0x01,0xf0,0x90,0x97,0x7a, +0xe0,0x30,0xe0,0x16,0xa3,0xe0,0xb4,0x04,0x05,0xe4,0x90,0x97,0x2e,0xf0,0xe4,0xff, +0x12,0x47,0x79,0xef,0x70,0x04,0x90,0x97,0x2e,0xf0,0x90,0x97,0x2e,0xe0,0x60,0x38, +0x90,0x97,0x79,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x8b,0xf0,0x90,0x97,0x71,0xe0, +0x90,0x97,0x8c,0x12,0x44,0x5b,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x74,0xe0, +0x54,0x0f,0xc3,0x94,0x04,0x50,0x11,0x7d,0x01,0x7f,0x04,0x12,0x49,0x0a,0x90,0x97, +0x7a,0xe0,0x30,0xe0,0x03,0x12,0x4f,0x22,0x22,0x90,0x97,0x78,0xe0,0x60,0x0e,0xe4, +0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28,0x80,0x23,0x90,0x97,0x6b, +0xe0,0x04,0xf0,0x90,0x97,0x79,0xe0,0x54,0xef,0xf0,0x90,0x97,0x6b,0xe0,0xd3,0x94, +0x01,0x40,0x0d,0xe5,0x69,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22, +0x12,0x4a,0x63,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4, +0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0xe0,0x4d,0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xed,0xf0,0xaf,0x11,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f, +0xf5,0x10,0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0xeb, +0xc3,0x94,0x01,0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41, +0x9e,0x93,0xfc,0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe4,0xf0,0x80,0xaf,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0, +0x22,0xac,0x07,0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xff,0x74, +0xa5,0x2c,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40, +0x02,0xab,0x07,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4, +0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41, +0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff, +0xec,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef, +0xf0,0xaf,0x04,0xad,0x03,0xb1,0xe5,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1c,0x54,0x1f,0xfc,0x75,0xf0, +0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xff,0x90,0x97,0x3d,0xf0,0xed,0x25, +0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97, +0x3e,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x40,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25, +0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93, +0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0,0xa3, +0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xe1,0xac,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x3d,0xe0,0xff,0xeb,0xd3,0x9f,0x40, +0x02,0xe1,0xdd,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e, +0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97, +0x3e,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x39, +0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0xff,0x90,0x97,0x40,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64,0x13, +0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x3e,0xe0,0x30,0xe0, +0x02,0x7b,0x18,0xac,0x03,0x8c,0x1c,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x3d,0xe0, +0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x52,0xe0,0xb4,0x01,0x0c,0xe5,0x1c, +0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1c,0x80,0x03,0xaf,0x1c,0x22,0xec,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff, +0xec,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f, +0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5, +0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b, +0x40,0x56,0x90,0x97,0x3d,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xef,0xf0,0xac,0x07,0x8f,0x1c,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x2e,0xf5, +0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13, +0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1c,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1c,0x44,0x80,0xfd,0x12,0x5d,0xe5,0xe5,0x1c, +0x44,0x80,0xff,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x3f,0xf0,0x75,0xf0,0x09, +0xea,0x90,0x93,0x28,0x12,0x43,0x52,0xe0,0x90,0x97,0x41,0xf0,0x75,0xf0,0x09,0xea, +0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xfe,0x90,0x97,0x42,0xf0,0xea,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x43,0xcd, +0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x45,0xcd,0xf0,0xa3,0xed,0xf0,0xe9,0xd3,0x9e,0x40, +0x09,0x90,0x97,0x42,0xe0,0x90,0x97,0x3f,0xf0,0xfb,0xef,0x70,0x02,0x21,0xd1,0x90, +0x97,0x40,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x3f,0xe0,0xfb,0xa3,0xe0,0x14, +0xf0,0x90,0x97,0x40,0xe0,0x70,0x02,0x21,0xd1,0x90,0x97,0x3f,0xe0,0xff,0xd3,0x94, +0x00,0x50,0x02,0x21,0xd1,0xe4,0x90,0x97,0x3e,0xf0,0xef,0x14,0x90,0x97,0x3d,0xf0, +0x90,0x97,0x41,0xe0,0xf9,0x90,0x97,0x3d,0xe0,0xff,0xd3,0x99,0x40,0x6a,0xef,0x94, +0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x45,0xe0,0x5e,0xfe,0xa3,0xe0, +0x5f,0x4e,0x70,0x27,0x90,0x97,0x3d,0xe0,0xff,0xc3,0x94,0x10,0x50,0x32,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x43,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97,0x3d,0xe0,0xfb, +0xa3,0xe0,0x04,0xf0,0x90,0x97,0x40,0xe0,0xff,0x90,0x97,0x3e,0xe0,0x6f,0x60,0x08, +0x90,0x97,0x3d,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x40,0xe0,0xff,0x90,0x97,0x3e, +0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x3d,0xe0,0xb5,0x01,0x05,0x90,0x97,0x41,0xe0, +0xfb,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe, +0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xea,0x25, +0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf, +0x02,0xad,0x03,0x12,0x5d,0xe5,0xaf,0x03,0x22,0xe4,0xf5,0x11,0x75,0xf0,0x09,0xe5, +0x11,0x90,0x93,0x2a,0x12,0x43,0x52,0xe0,0x64,0x01,0x60,0x02,0xe1,0xe3,0xe5,0x11, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xe3,0xe5,0x11,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0xe5,0x11,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x37,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x39,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x33, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93,0x27,0x12, +0x43,0x52,0xe0,0x90,0x97,0x3c,0xf0,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xbc,0x90,0x97,0x3c,0xe0,0xff,0x90, +0x97,0x34,0xe0,0x9f,0x40,0x13,0x90,0x97,0x3c,0xe0,0x90,0x97,0x34,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x33,0xf0,0xef,0x4e,0xf0,0x90,0x97,0x34,0xe0,0xff,0x90,0x41, +0x12,0x93,0xfe,0x74,0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3, +0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80,0x07,0x90,0x97,0x34,0xe0,0x90,0x40,0xf6, +0x93,0x90,0x97,0x3b,0xf0,0x90,0x97,0x3b,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50,0xf9, +0x74,0x40,0x35,0xf0,0x75,0x13,0xff,0xf5,0x14,0x89,0x15,0x90,0x97,0x33,0xe0,0x90, +0x41,0xba,0x93,0xff,0xd3,0x90,0x97,0x3a,0xe0,0x9f,0x90,0x97,0x39,0xe0,0x94,0x00, +0x40,0x08,0xe4,0xfd,0xaf,0x11,0x11,0x94,0xe1,0x7a,0xe5,0x11,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x19,0xa3,0xe0,0xf5,0x1a,0xab,0x13, +0xaa,0x14,0xa9,0x15,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18, +0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35, +0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x42,0x20,0xff, +0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x02,0x12,0x42,0xc2,0xfd,0xac, +0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab,0x13, +0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef, +0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90, +0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee, +0x35,0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x04,0x12,0x42,0x20, +0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x08,0x12,0x42,0xc2,0xfd, +0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab, +0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00,0x90,0x97, +0x37,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1a,0x9f,0xe5,0x19,0x9e, +0x40,0x0c,0xe5,0x1a,0x9f,0xf5,0x1a,0xe5,0x19,0x9e,0xf5,0x19,0x80,0x05,0xe4,0xf5, +0x19,0xf5,0x1a,0xe5,0x11,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xe5,0x19,0xf0,0xa3,0xe5,0x1a,0xf0,0x90,0x97,0x33,0xe0,0xf9,0x25,0xe0,0x24,0x2e, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1a,0xe4,0x93,0x95, +0x19,0x50,0x07,0xaf,0x11,0x12,0x5e,0xaa,0xe1,0x4e,0xe9,0x25,0xe0,0x24,0x66,0xf5, +0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1a,0xe4,0x93,0x95,0x19, +0x50,0x02,0xe1,0x4e,0x7d,0x01,0xaf,0x11,0x11,0x94,0xe1,0x4e,0x74,0x64,0x25,0x11, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,0xc1,0x57,0x90, +0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x19,0x40,0x3d, +0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x11,0x40,0x2e,0x80, +0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x0a, +0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x34,0xe0,0xc3,0x94,0x03,0x40,0x0d, +0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0,0x74,0x43,0x25, +0x11,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1b,0x74,0x23,0x25,0x11,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,0xc1,0x04,0x90, +0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x04,0x74,0x44,0x25,0x11,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,0xe4,0x33,0xfe, +0x74,0x21,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd,0xd3,0x9f,0xee, +0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,0x33,0xfe,0x74, +0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f,0xee,0x64,0x80, +0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xe0,0xff,0x90,0x97,0x34,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25,0x11,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,0x1b,0x05,0x80, +0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1b,0x03,0x80,0x03,0x75,0x1b,0x01,0x74, +0x21,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74,0x44,0x25,0x11, +0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1b,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe4,0xf0,0x90,0x97,0x34,0xe0,0xff,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x11,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe5,0x1b,0xf0,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93,0x2b,0x12,0x43,0x52,0xe0, +0xb4,0x01,0x10,0xe4,0xf5,0x1b,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xe4,0xf0,0xad,0x1b,0xe1,0x49,0xec,0x64,0x06,0x60,0x02,0xe1,0x4e,0xf5,0x19, +0xf5,0x1a,0x90,0x41,0xdb,0x93,0xff,0x7e,0x00,0x90,0x97,0x37,0xe0,0xfc,0xa3,0xe0, +0xfd,0x12,0x29,0xf2,0x90,0x97,0x35,0xee,0xf0,0xa3,0xef,0xf0,0x74,0x43,0x25,0x11, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1b,0xe4,0xf5,0x12,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x75,0xf0,0x02,0xe5,0x12,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0xe5,0x12,0x90,0x41,0xd6,0x93,0xff,0x7e,0x00,0x12,0x29,0xf2, +0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xc3,0x90,0x97,0x36,0xe0,0x95, +0x1a,0x90,0x97,0x35,0xe0,0x95,0x19,0x40,0x07,0x05,0x12,0xe5,0x12,0xb4,0x05,0xbd, +0xe5,0x12,0xc3,0x13,0xf5,0x12,0xe5,0x1b,0xb4,0x01,0x06,0xe5,0x12,0x70,0x46,0x80, +0x13,0xe5,0x1b,0xb4,0x03,0x15,0xe5,0x12,0x70,0x05,0x75,0x1b,0x03,0x80,0x39,0xe5, +0x12,0xb4,0x01,0x05,0x75,0x1b,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1b,0xb4,0x05,0x28, +0xe5,0x12,0x70,0x05,0x75,0x1b,0x05,0x80,0x0d,0xe5,0x12,0xb4,0x01,0x05,0x75,0x1b, +0x03,0x80,0x03,0x75,0x1b,0x01,0xd3,0x90,0x97,0x3a,0xe0,0x94,0x03,0x90,0x97,0x39, +0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1b,0xd3,0x90,0x97,0x3a,0xe0,0x94,0x03,0x90, +0x97,0x39,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1b,0x74,0x43,0x25,0x11,0xf5,0x82, +0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1b,0xf0,0xfd,0xaf,0x11,0x12,0x5d,0x94,0x74,0x64, +0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74,0x64,0x50, +0x0e,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x0b,0x25, +0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18, +0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x02,0xe4, +0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00, +0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0xe5,0x11,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xe5,0x11,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0, +0xa3,0xf0,0xe5,0x11,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0x05,0x11,0xe5,0x11,0xc3,0x94,0x20,0x50,0x02,0x41,0x1c,0x22,0xe4, +0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x0d,0xbd,0x10, +0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x52,0xe4,0xf0,0xa3, +0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75, +0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a, +0xed,0x90,0x90,0x06,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90, +0x90,0x08,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xed,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x44, +0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, +0xe4,0xf0,0x90,0x41,0x8c,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x54,0x74,0x01, +0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24, +0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x52,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x52,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x52, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x52, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x52,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x03,0x22,0x8f,0x11,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xaf,0x82,0xf5,0x13,0x8f,0x14,0xe5,0x11,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9, +0x74,0x92,0x35,0xf0,0x75,0x15,0x01,0xf5,0x16,0x89,0x17,0x75,0xf0,0x09,0xe5,0x11, +0x90,0x93,0x25,0x12,0x43,0x52,0xaf,0x82,0x85,0x83,0x18,0x8f,0x19,0xe5,0x11,0x75, +0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1a,0x01,0xf5,0x1b,0x89, +0x1c,0x74,0xc1,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x87, +0x6a,0x05,0x00,0x6a,0x1a,0x01,0x6a,0x2f,0x02,0x6a,0x44,0x03,0x6a,0x6d,0x04,0x6a, +0x82,0x05,0x6a,0x97,0x06,0x6a,0xbd,0x0c,0x6a,0xea,0x0d,0x6b,0x17,0x0e,0x6b,0x44, +0x0f,0x00,0x00,0x6b,0x78,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x11,0x25,0xe0,0x24,0xe4, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5, +0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3, +0x74,0x05,0x80,0x12,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x61,0x78,0xe5,0x11,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5, +0x80,0x27,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x61,0x78,0x90,0x04,0x47, +0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x15, +0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x14, +0x82,0x85,0x13,0x83,0xf0,0x90,0x04,0x44,0x61,0x6f,0x90,0x04,0x4b,0xe0,0xab,0x15, +0xaa,0x16,0xa9,0x17,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x15,0xaa,0x16,0xa9, +0x17,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x14,0x82,0x85,0x13, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x15,0xaa,0x16,0xa9, +0x17,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x14,0x82,0x85,0x13,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x14,0x82,0x85,0x13,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x14,0x82,0x85,0x13,0x83,0xa3,0xf0,0xab,0x15,0xaa,0x16,0xa9,0x17,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1a,0xaa,0x1b,0xa9,0x1c,0x12,0x29, +0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x15,0xe5,0x17,0x24, +0x01,0xf9,0xe4,0x35,0x16,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, +0xab,0x1a,0xaa,0x1b,0xa9,0x1c,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x14,0x82,0x85,0x13,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x19,0x82,0x85,0x18,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x14,0x82,0x85,0x13,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x19, +0x82,0x85,0x18,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x11, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x12,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x12,0x24,0x10, +0x80,0x5d,0x15,0x12,0xe5,0x12,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x11,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x12,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x4a,0xe5,0x12, +0xf0,0x80,0x10,0x15,0x12,0xe5,0x12,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x4a,0xf0,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x12,0x74,0x01,0x7e,0x00,0xa8,0x12, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x4b,0xe5,0x12,0xf0,0x80,0x5b,0x05,0x12,0xe5,0x12,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x12,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x12,0x24,0x10,0x80,0x0a,0x05,0x12,0xe5,0x12,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x4b,0xf0,0x90,0x97,0x4a,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93, +0x27,0x12,0x43,0x52,0xef,0xf0,0x90,0x97,0x4b,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x11, +0x90,0x93,0x28,0x12,0x43,0x52,0xee,0xf0,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x06,0x90,0x97,0x4a,0x12,0x5d,0xd4,0x74,0x84, +0x25,0x11,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x4b,0xe0,0xfe, +0xef,0xc3,0x9e,0x50,0x03,0x12,0x5d,0xd4,0x90,0x97,0x4a,0xe0,0xff,0xd3,0x94,0x13, +0x40,0x08,0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08, +0x90,0x93,0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93, +0x22,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90, +0x04,0xb1,0xf0,0x22,0x90,0x97,0x3e,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x7e, +0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0xf0,0xc4,0x54, +0x0f,0x90,0x97,0x43,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54,0x40,0xc4,0x13,0x13, +0x54,0x03,0x90,0x97,0x44,0xf0,0x90,0x97,0x3e,0xe0,0xff,0x75,0xf0,0x09,0x90,0x93, +0x25,0x12,0x43,0x52,0xad,0x82,0xac,0x83,0x90,0x97,0x45,0xec,0xf0,0xa3,0xed,0xf0, +0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0xfa,0x7b,0x01,0xa3, +0x12,0x43,0x7e,0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x42,0x20,0x54, +0x0f,0xff,0x90,0x97,0x47,0x12,0x43,0x5e,0xef,0x12,0x42,0x4d,0x90,0x97,0x40,0x12, +0x43,0x5e,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x47,0x12,0x43,0x5e,0x90, +0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x01,0x12, +0x42,0x20,0xff,0x90,0x97,0x45,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef, +0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97,0x43,0xe0,0xfe,0x90, +0x97,0x3e,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x90, +0x97,0x3f,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12,0x43,0x52,0xee,0xf0, +0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x52,0x74,0x01,0xf0,0x90,0x97,0x44, +0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x52,0xee,0xf0,0x21,0x85, +0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54, +0x07,0xfd,0xaf,0x06,0xa1,0xd4,0x12,0x29,0xd9,0xf5,0x11,0xc3,0x94,0x20,0x50,0x15, +0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xef,0xf0,0x22,0xe5,0x11,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20, +0x90,0x93,0x21,0xf0,0x22,0x90,0x97,0x2e,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f, +0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0x96,0x12,0x43,0x7e,0x0b, +0x7a,0x97,0x79,0x2e,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x93,0x12,0x43, +0x7e,0x90,0x97,0x65,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x65,0xe0,0x64,0x01,0x70, +0x66,0x90,0x97,0xad,0xe0,0xff,0x04,0xf0,0x90,0x97,0x93,0x12,0x43,0x5e,0x90,0x00, +0x01,0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0xf1,0xbc,0xef,0x60,0x49,0x90,0x97, +0x93,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a, +0x01,0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0x96,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64, +0x89,0x65,0x90,0x97,0x93,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5, +0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0, +0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01, +0xc3,0xc0,0xd0,0x90,0x97,0x9d,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, +0x90,0x97,0x9d,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90, +0x97,0xa0,0xe0,0x94,0xe8,0x90,0x97,0x9f,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6, +0xe0,0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0x9f,0xe4,0x75,0xf0,0x01,0x12, +0x42,0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92, +0xaf,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90, +0x97,0x5f,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x60,0xf0, +0x90,0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x61,0xf0,0x90,0x00,0x03, +0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20, +0xff,0xae,0x05,0xed,0x2f,0x90,0x97,0x63,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0x3e,0x12,0x43,0x7e,0x90,0x97,0x3e,0x12,0x43,0x5e,0x90,0x00,0x01, +0x12,0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x3e,0x12, +0x43,0x5e,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60, +0x2c,0xb5,0x23,0x16,0x90,0x97,0x3e,0x12,0x43,0x5e,0x90,0x00,0x01,0x12,0x42,0xc2, +0x65,0x25,0x70,0x04,0xe5,0x24,0x65,0xf0,0x60,0x23,0x90,0x97,0x3e,0x12,0x43,0x5e, +0x90,0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x11,0xd2,0x80,0x10,0x90,0x97,0x3e, +0x12,0x43,0x5e,0x12,0x29,0xd9,0x65,0x23,0x60,0x03,0x12,0x47,0xef,0xd0,0xd0,0x92, +0xaf,0x22,0x90,0x97,0x41,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x23,0x01,0x8e,0x24,0xf5, +0x25,0xe4,0xfd,0x7f,0x0b,0x31,0x14,0xe4,0xfd,0x7f,0x02,0x31,0x14,0x31,0xea,0xe4, +0xff,0x31,0xde,0xe4,0xf5,0x27,0x90,0x01,0xc9,0xe5,0x27,0xf0,0x90,0x97,0x41,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x44,0xed,0xf0, +0x90,0x97,0x43,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0x62,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x43,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0x62,0x90,0x97, +0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0xca,0xe5,0x26,0xf0,0xef,0x60,0x02,0x51,0x4b,0x22,0x7f,0x0b,0x51,0x6b,0xef,0x65, +0x26,0x60,0x10,0xe5,0x26,0xb4,0x01,0x05,0xe4,0xf5,0x26,0x80,0x03,0x75,0x26,0x01, +0x7f,0x01,0x22,0x7f,0x00,0x22,0xe5,0x23,0x64,0x01,0x70,0x3e,0x31,0xea,0xbf,0x01, +0x04,0x7f,0x01,0x31,0xde,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0x12,0x4f, +0x72,0x90,0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x12,0x4f,0x72,0x90,0x00,0x46, +0xe0,0x54,0xfb,0xfd,0x7f,0x46,0x12,0x4f,0x72,0x7f,0x02,0x51,0x6b,0x8f,0x27,0x90, +0x01,0xc9,0xe5,0x27,0xf0,0xb4,0x01,0x02,0x51,0x4b,0x22,0x90,0x00,0x49,0xe0,0x90, +0x97,0xae,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x12,0x4f,0x72,0x90, +0x97,0xae,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0x02,0x4f,0x72,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xb0,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01, +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f, +0xf0,0x12,0x4f,0x62,0x90,0x97,0xb0,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4, +0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8, +0xff,0x80,0x44,0x90,0x97,0xb0,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0x5a,0x90,0x97,0xb0,0xe0,0xfd,0x74, +0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff, +0x90,0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2, +0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74, +0xff,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x22,0xe4,0x90,0x97,0x64,0xf0, +0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0x02,0x4f,0x72,0x8e,0x11,0x8f,0x12, +0x8b,0x13,0x8a,0x14,0x89,0x15,0xe4,0x90,0x97,0x33,0xf0,0xef,0x90,0x00,0x31,0xf0, +0x12,0x4f,0x62,0xe5,0x11,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0, +0x12,0x4f,0x62,0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0x62,0x90,0x00,0x33, +0xe0,0x20,0xe7,0x0e,0x90,0x97,0x33,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0, +0x80,0xeb,0x90,0x97,0x33,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab, +0x13,0xaa,0x14,0xa9,0x15,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x05, +0x22,0x74,0xff,0xf0,0x71,0x9d,0x90,0x97,0x7b,0x74,0x03,0xf0,0x22,0x7f,0x78,0x7e, +0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27, +0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x97, +0x25,0x12,0x2a,0x7f,0x90,0x97,0x67,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d,0x12,0x43, +0x46,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x46,0xef,0x54, +0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9, +0x90,0x97,0x21,0x12,0x43,0x46,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x46,0xef,0x44, +0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9, +0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x29,0x12,0x2a,0x7f,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, +0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97, +0x67,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4, +0xfd,0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02,0x4f,0x62, +0x12,0x48,0xd6,0x90,0x97,0x7b,0x74,0x02,0xf0,0x22,0x90,0x05,0x22,0x74,0x0f,0xf0, +0x90,0x97,0x7b,0x74,0x04,0xf0,0x22,0xae,0x07,0xe4,0xff,0x12,0x47,0x79,0xef,0x60, +0x19,0x90,0x97,0x7a,0xe0,0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x0d,0xaf,0x06,0x7d, +0x01,0x12,0x49,0x0a,0x12,0x4f,0x22,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x97,0x7a, +0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x0b,0xa3,0xe0,0x64,0x04,0x60,0x05, +0x7f,0x04,0x12,0x56,0x56,0x90,0x97,0x7b,0xe0,0x64,0x04,0x60,0x03,0x12,0x4f,0xed, +0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0xe4,0x90,0x97,0xa7,0xf0,0xa3,0xf0,0x90,0x05, +0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03, +0x7f,0x01,0x22,0xd3,0x90,0x97,0xa8,0xe0,0x94,0xe8,0x90,0x97,0xa7,0xe0,0x94,0x03, +0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x37,0x54,0x90,0x97,0xa7,0xe4, +0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6,0x90,0x97,0x67,0xe0,0x90,0x97,0x2d,0xf0, +0x22,0xef,0x70,0x02,0xc1,0xd8,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x7a,0xa4,0x90, +0x97,0x19,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, +0x2f,0xd9,0x90,0x96,0xc5,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44, +0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc9,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xcd,0x12,0x43,0x46,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43, +0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, +0xd5,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x96,0xd9,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x96,0xdd,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe1,0x12,0x43,0x46,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x46, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9, +0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x96,0xed,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x96,0xf1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf5,0x12,0x43,0x46,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf9,0x12,0x43,0x46,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12, +0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x97,0x01,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x97,0x05,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x09,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x0d,0x12,0x43,0x46,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43, +0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97, +0x15,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f, +0xd9,0x90,0x97,0x2d,0x74,0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x03, +0x02,0x7a,0xa4,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x19,0x12,0x2a,0x7f, +0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x96,0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e, +0x08,0x12,0x27,0xde,0x90,0x96,0xc9,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27, +0xde,0x90,0x96,0xcd,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96, +0xd1,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd5,0x12,0x2a, +0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c, +0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xdd,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12, +0x27,0xde,0x90,0x96,0xe1,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x96,0xe5,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe9,0x12, +0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f, +0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf1,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e, +0x12,0x27,0xde,0x90,0x96,0xf5,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde, +0x90,0x96,0xf9,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xfd, +0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x01,0x12,0x2a,0x7f, +0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e, +0x0c,0x12,0x27,0xde,0x90,0x97,0x09,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27, +0xde,0x90,0x97,0x0d,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97, +0x11,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x15,0x12,0x2a, +0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97, +0xa1,0x12,0x43,0x46,0xed,0x44,0xc0,0xfd,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90, +0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e, +0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4, +0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25, +0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b, +0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04, +0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, +0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, +0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, +0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e, +0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f, +0x90,0x97,0xa1,0x12,0x43,0x46,0xe4,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90, +0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f, +0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, +0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f, +0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a, +0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04, +0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xe4,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a, +0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c, +0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc, +0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xed,0x44,0x10,0xfd, +0xec,0x44,0x01,0xfc,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e, +0x08,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46, +0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43, +0x46,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12, +0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4, +0x90,0x97,0x2d,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xaa,0xed, +0xf0,0x90,0x97,0xa9,0xef,0xf0,0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0, +0x12,0x4f,0x62,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x12,0x4f,0x62,0x90,0x97,0xaa, +0xe0,0x60,0x16,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x68,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01, +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d, +0x90,0x97,0xa9,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x12,0x4f,0x5a,0x90,0x97,0xa9,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f, +0xf0,0x12,0x4f,0x62,0x90,0x97,0xaa,0xe0,0x60,0x1b,0x90,0x97,0xa9,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00, +0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, +0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0, +0x12,0x4f,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x0e,0x38,}; +#endif + +// =================== UMC A Cut V75 2011-06-15 ===================== +u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength] = { +0xc1,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x13,0x09,0x54,0x3a,0x01,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, +0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, +0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x30,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, +0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, +0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, +0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, +0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, +0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x24,0x62,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, +0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, +0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, +0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, +0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, +0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, +0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, +0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, +0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, +0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, +0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, +0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, +0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, +0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, +0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, +0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, +0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, +0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, +0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, +0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, +0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, +0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, +0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, +0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, +0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, +0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, +0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, +0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, +0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, +0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, +0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, +0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, +0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, +0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, +0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, +0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, +0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, +0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, +0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, +0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, +0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, +0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0xab,0x22,0x7d,0x02,0x7f,0x03,0x12,0x31,0x2c, +0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, +0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, +0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, +0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, +0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, +0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, +0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, +0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, +0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, +0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, +0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, +0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, +0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, +0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, +0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, +0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, +0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, +0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x31,0x9d, +0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xcf,0x90,0x97,0x93,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, +0x12,0x31,0x2c,0x7d,0x02,0x7f,0x03,0x12,0x31,0x2c,0x90,0x01,0x57,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, +0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, +0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x31,0x9d,0x7d,0x02,0x7f,0x03,0x12,0x31, +0x9d,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, +0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, +0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, +0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, +0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x24,0x62,0xf5, +0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, +0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, +0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, +0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, +0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, +0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, +0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, +0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, +0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, +0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, +0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, +0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, +0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, +0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, +0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, +0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, +0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, +0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x30,0x62,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, +0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, +0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, +0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, +0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, +0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, +0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, +0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, +0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, +0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, +0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, +0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, +0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, +0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, +0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, +0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, +0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, +0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, +0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, +0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, +0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, +0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, +0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, +0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, +0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, +0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, +0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, +0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, +0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, +0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, +0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, +0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, +0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, +0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, +0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, +0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0xa2, +0x12,0x5f,0xb4,0x12,0x2e,0x01,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, +0x12,0x77,0xdc,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, +0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, +0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, +0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, +0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, +0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, +0x12,0x78,0x3a,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, +0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, +0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, +0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, +0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, +0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, +0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, +0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, +0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, +0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, +0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, +0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, +0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, +0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, +0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, +0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, +0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, +0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, +0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, +0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, +0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, +0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,0x90, +0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, +0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, +0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80, +0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, +0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, +0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, +0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, +0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, +0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, +0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, +0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, +0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, +0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, +0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, +0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, +0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, +0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, +0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, +0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, +0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, +0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, +0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, +0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, +0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x79,0x12,0x90,0x97,0x5a,0x12,0x43,0x6b, +0x02,0x77,0xa9,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x22,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, +0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, +0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, +0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, +0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, +0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, +0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, +0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, +0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, +0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, +0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, +0x82,0x8c,0x83,0xef,0xf0,0x12,0x24,0x62,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, +0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, +0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, +0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, +0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, +0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, +0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, +0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, +0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, +0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, +0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, +0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, +0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, +0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, +0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, +0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, +0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, +0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x24, +0x62,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, +0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,0xff, +0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, +0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, +0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, +0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, +0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, +0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, +0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, +0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, +0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, +0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, +0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, +0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, +0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, +0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, +0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, +0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, +0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, +0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, +0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, +0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, +0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, +0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, +0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, +0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, +0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, +0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, +0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, +0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, +0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, +0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, +0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, +0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, +0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, +0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, +0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, +0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, +0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, +0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, +0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, +0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, +0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, +0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, +0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, +0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, +0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, +0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, +0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, +0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, +0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, +0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, +0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, +0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, +0x60,0x05,0x7f,0x01,0x12,0x76,0xfa,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, +0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, +0xfa,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, +0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, +0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, +0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, +0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, +0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, +0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, +0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, +0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, +0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, +0x14,0x7e,0x00,0x12,0x32,0x15,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, +0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, +0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, +0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, +0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, +0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, +0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, +0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, +0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, +0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, +0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, +0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, +0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, +0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, +0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, +0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, +0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, +0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, +0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, +0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, +0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x24,0x62,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, +0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b, +0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, +0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, +0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24, +0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, +0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, +0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5, +0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, +0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, +0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, +0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x24,0x7b,0xd3,0xe5,0x1b,0x9f,0xe5, +0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, +0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, +0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, +0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, +0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, +0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, +0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, +0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, +0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, +0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, +0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, +0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, +0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, +0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, +0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x24,0x7b,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, +0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, +0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, +0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, +0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, +0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, +0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, +0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, +0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, +0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, +0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, +0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, +0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, +0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, +0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, +0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, +0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, +0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, +0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, +0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, +0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, +0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, +0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, +0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x26,0x22,0x12,0x24,0x62,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, +0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, +0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, +0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, +0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, +0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, +0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, +0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x24,0x62,0xff,0xc4,0x54,0x0f,0xf5,0x66, +0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, +0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, +0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, +0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, +0x81,0x7f,0x0a,0x7e,0x00,0x12,0x32,0x15,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, +0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x24,0x62,0x65, +0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x24,0x62,0xf5,0x26, +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x24,0x62,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, +0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, +0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, +0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, +0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, +0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x24,0x62,0xff,0x60,0x2c, +0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, +0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, +0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, +0x43,0x6b,0x12,0x24,0x62,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, +0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, +0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, +0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x30,0x62,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, +0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, +0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, +0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, +0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, +0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, +0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, +0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, +0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, +0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, +0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, +0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, +0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, +0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, +0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, +0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, +0x00,0x12,0x32,0x15,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, +0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f,0xe5,0x90,0x97,0x1d,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97,0x21, +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08, +0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08, +0x12,0x2b,0x08,0x90,0x97,0x29,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, +0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x03,0x2d,0x95, +0xe4,0xfd,0xff,0x12,0x30,0x2c,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68, +0x12,0x25,0x14,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x22,0x7f, +0x78,0x7e,0x08,0x12,0x22,0x65,0x90,0x97,0x1d,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c, +0x12,0x22,0x65,0x90,0x97,0x21,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x22,0x65, +0x90,0x97,0x25,0x12,0x25,0x08,0x90,0x97,0x86,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d, +0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53, +0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12, +0x2b,0x08,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x96, +0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x97,0x25,0x12,0x43,0x53, +0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12, +0x2b,0x08,0x7f,0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x97,0x29,0x12,0x25,0x08,0x90, +0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08, +0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x30,0x2c, +0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00, +0x00,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02, +0x4f,0xe5,0x90,0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71, +0x63,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x75,0x2e,0x90,0x97,0x19,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x96,0xc5, +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08, +0x90,0x96,0xc9,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08, +0x12,0x2b,0x08,0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, +0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x96,0x12, +0x25,0x08,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd5,0x12,0x43,0x53,0x90, +0x80,0x96,0x12,0x25,0x08,0x7f,0x74,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd9,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12,0x2b,0x08,0x90, +0x96,0xdd,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12, +0x2b,0x08,0x90,0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80, +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25, +0x08,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80, +0x96,0x12,0x25,0x08,0x7f,0x88,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xed,0x12,0x43, +0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96, +0xf1,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x2b, +0x08,0x90,0x96,0xf5,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd4,0x7e, +0x0e,0x12,0x2b,0x08,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, +0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x96, +0x12,0x25,0x08,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x97,0x01,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x97,0x05, +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08, +0x90,0x97,0x09,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c, +0x12,0x2b,0x08,0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, +0x04,0x7e,0x0d,0x12,0x2b,0x08,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x96,0x12, +0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x90,0x97,0x15,0x12,0x43,0x53,0x90, +0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97,0x2d,0x74, +0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x2e,0x7f,0x8c,0x7e, +0x08,0x12,0x22,0x65,0x90,0x97,0x19,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x22, +0x65,0x90,0x96,0xc5,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08,0x12,0x22,0x65,0x90,0x96, +0xc9,0x12,0x25,0x08,0x7f,0x6c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xcd,0x12,0x25, +0x08,0x7f,0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xd1,0x12,0x25,0x08,0x7f,0x74, +0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xd5,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12, +0x22,0x65,0x90,0x96,0xd9,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12,0x22,0x65,0x90, +0x96,0xdd,0x12,0x25,0x08,0x7f,0x80,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe1,0x12, +0x25,0x08,0x7f,0x84,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe5,0x12,0x25,0x08,0x7f, +0x88,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe9,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e, +0x12,0x22,0x65,0x90,0x96,0xed,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x22,0x65, +0x90,0x96,0xf1,0x12,0x25,0x08,0x7f,0xd4,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xf5, +0x12,0x25,0x08,0x7f,0xd8,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xf9,0x12,0x25,0x08, +0x7f,0xdc,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xfd,0x12,0x25,0x08,0x7f,0xe0,0x7e, +0x0e,0x12,0x22,0x65,0x90,0x97,0x01,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x22, +0x65,0x90,0x97,0x05,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,0x90,0x97, +0x09,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x22,0x65,0x90,0x97,0x0d,0x12,0x25, +0x08,0x7f,0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0x11,0x12,0x25,0x08,0x7f,0x04, +0x7e,0x08,0x12,0x22,0x65,0x90,0x97,0x15,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12, +0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44, +0xc0,0xfd,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12, +0x25,0x14,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96, +0x12,0x25,0x14,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80, +0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90, +0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08, +0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2b, +0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12, +0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e, +0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e, +0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x63,0xdb,0x25,0xa4,0x7f,0x84, +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f, +0x88,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4, +0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25, +0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb, +0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20, +0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14, +0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25, +0x14,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12, +0x25,0x14,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08,0x7f,0x04,0x7e, +0x0c,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, +0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef, +0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x7f,0x04,0x7e, +0x0d,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, +0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x08,0x7f, +0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f, +0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x25,0x08, +0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97, +0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, +0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f,0x04,0x7e,0x08,0x12,0x22,0x65,0x90,0x97, +0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90, +0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec, +0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x96,0x12, +0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x2b,0x08,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3, +0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0, +0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x46,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x45,0x80,0x68,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8, +0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54, +0xf0,0x12,0x4f,0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0xbc,0xe0,0x60,0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90, +0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4, +0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92, +0xaf,0x22,0x8b,0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97, +0x3b,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08, +0x12,0x22,0x65,0x90,0x97,0x34,0x12,0x25,0x08,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x24,0xf5,0xa8, +0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03, +0xfc,0x12,0x43,0x46,0x90,0x97,0x3e,0x12,0x25,0x08,0x90,0x05,0x22,0xe4,0xf0,0x80, +0x2d,0xe4,0x90,0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x22,0x65,0xec,0x54,0x03, +0xfc,0xec,0x44,0xc0,0xfc,0x90,0x97,0x34,0x12,0x25,0x08,0x90,0x97,0x34,0x12,0x43, +0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97, +0x3b,0xe0,0x30,0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e, +0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x54,0xf3,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f, +0x46,0x12,0x47,0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60, +0x6a,0x24,0x02,0x60,0x02,0xe1,0xa8,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48, +0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd, +0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75, +0xe4,0x90,0x97,0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25, +0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f, +0x45,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01, +0xf0,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e, +0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0, +0x44,0x10,0xfd,0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x97,0x3c,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12, +0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40, +0x7f,0x01,0x12,0x31,0x66,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45, +0x12,0x47,0x52,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97, +0x42,0xf0,0x90,0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97, +0x44,0xf0,0x90,0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97, +0x4c,0xf0,0x90,0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00, +0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01, +0x60,0x08,0x90,0x97,0x3a,0xe0,0x60,0x02,0x21,0x11,0x90,0x97,0x2e,0xe0,0xc3,0x94, +0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50, +0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94, +0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90, +0x97,0x2e,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, +0x97,0x42,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43, +0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0, +0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42, +0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50, +0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, +0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, +0xf0,0xe4,0x90,0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, +0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12, +0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x24,0x62,0x25,0xe0,0x25, +0xe0,0x90,0x97,0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61, +0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63, +0xe0,0x90,0x97,0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90, +0x97,0x39,0xe0,0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90, +0x97,0x3a,0xe0,0x70,0x02,0x41,0x1c,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x1c,0x90, +0x97,0x3d,0xe0,0x70,0x02,0x41,0x1c,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2, +0xaf,0x90,0x97,0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12, +0x47,0x49,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, +0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90, +0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64, +0x80,0xf0,0x90,0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05, +0x85,0xf0,0x90,0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05, +0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0, +0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x31,0xb7,0x80,0x2d,0x90,0x97,0x3a,0xe0, +0x70,0x2f,0x90,0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f, +0x46,0x12,0x47,0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0, +0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x31,0x49,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92, +0xaf,0x22,0x46,0x58,}; + +// =================== UMC B Cut V75 2011-06-15 ===================== +u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] = { +0xc2,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x13,0x11,0x42,0x3a,0x01,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, +0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, +0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, +0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, +0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, +0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, +0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, +0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, +0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, +0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, +0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, +0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, +0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, +0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, +0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, +0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, +0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, +0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, +0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, +0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, +0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, +0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, +0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, +0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, +0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, +0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, +0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, +0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, +0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, +0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, +0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, +0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, +0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, +0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, +0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, +0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, +0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, +0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, +0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, +0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, +0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, +0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, +0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, +0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, +0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, +0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, +0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, +0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, +0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0x98,0x22,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75, +0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, +0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, +0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, +0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, +0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, +0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, +0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, +0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, +0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, +0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, +0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, +0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, +0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, +0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, +0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, +0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, +0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, +0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6, +0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xc5,0x90,0x97,0x93,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, +0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, +0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, +0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36, +0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, +0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, +0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, +0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, +0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x29,0xd9,0xf5, +0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, +0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, +0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, +0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, +0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, +0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, +0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, +0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, +0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, +0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, +0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, +0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, +0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, +0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, +0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, +0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, +0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, +0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, +0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, +0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, +0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, +0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, +0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, +0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, +0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, +0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, +0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, +0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, +0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, +0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, +0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, +0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, +0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, +0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, +0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, +0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, +0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, +0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, +0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, +0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, +0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, +0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, +0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, +0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, +0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, +0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, +0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, +0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, +0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, +0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, +0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, +0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, +0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0x8f, +0x12,0x5f,0xb4,0x12,0x32,0x3d,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, +0x12,0x77,0xc9,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, +0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, +0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, +0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, +0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, +0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, +0x12,0x78,0x27,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, +0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, +0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, +0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, +0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, +0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, +0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, +0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, +0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, +0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, +0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, +0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, +0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, +0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, +0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, +0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, +0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, +0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, +0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, +0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, +0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, +0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90, +0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, +0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, +0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80, +0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, +0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, +0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, +0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, +0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, +0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, +0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, +0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, +0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, +0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, +0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, +0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, +0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, +0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, +0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, +0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, +0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, +0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, +0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, +0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, +0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x78,0xff,0x90,0x97,0x5a,0x12,0x43,0x6b, +0x02,0x77,0x96,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x0f,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, +0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, +0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, +0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, +0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, +0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, +0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, +0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, +0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, +0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, +0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, +0x82,0x8c,0x83,0xef,0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, +0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, +0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, +0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, +0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, +0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, +0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, +0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, +0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, +0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, +0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, +0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, +0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, +0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, +0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, +0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, +0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, +0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x29, +0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, +0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, +0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, +0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, +0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, +0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, +0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, +0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, +0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, +0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, +0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, +0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, +0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, +0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, +0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, +0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, +0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, +0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, +0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, +0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, +0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, +0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, +0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, +0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, +0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, +0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, +0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, +0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, +0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, +0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, +0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, +0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, +0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, +0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, +0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, +0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, +0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, +0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, +0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, +0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, +0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, +0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, +0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, +0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, +0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, +0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, +0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, +0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, +0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, +0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, +0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, +0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, +0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, +0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, +0x60,0x05,0x7f,0x01,0x12,0x76,0xe7,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, +0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, +0xe7,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, +0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, +0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, +0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, +0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, +0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, +0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, +0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, +0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, +0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, +0x14,0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, +0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, +0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, +0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, +0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, +0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, +0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, +0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, +0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, +0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, +0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, +0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, +0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, +0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, +0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, +0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, +0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, +0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, +0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, +0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, +0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, +0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b, +0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, +0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, +0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29, +0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, +0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, +0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5, +0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, +0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, +0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, +0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1b,0x9f,0xe5, +0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, +0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, +0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, +0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, +0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, +0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, +0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, +0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, +0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, +0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, +0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, +0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, +0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, +0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, +0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, +0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, +0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, +0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, +0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, +0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, +0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, +0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, +0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, +0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, +0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, +0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, +0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, +0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, +0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, +0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, +0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, +0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, +0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, +0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, +0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, +0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, +0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, +0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x26,0x22,0x12,0x29,0xd9,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, +0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, +0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, +0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, +0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, +0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, +0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, +0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66, +0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, +0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, +0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, +0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, +0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, +0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x29,0xd9,0x65, +0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x29,0xd9,0xf5,0x26, +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, +0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, +0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, +0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, +0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, +0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60,0x2c, +0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, +0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, +0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, +0x43,0x6b,0x12,0x29,0xd9,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, +0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, +0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, +0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, +0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, +0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, +0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, +0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, +0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, +0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, +0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, +0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, +0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, +0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, +0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, +0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, +0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, +0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, +0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, +0x00,0x12,0x37,0x54,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, +0x90,0x97,0x1d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12, +0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f, +0x01,0x12,0x34,0x81,0x22,0x7f,0x78,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12, +0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f, +0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x25,0x12,0x2a,0x7f,0x90,0x97,0x86,0xe0, +0x90,0x97,0x1d,0xb4,0x01,0x0d,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7, +0xfd,0x80,0x07,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54, +0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, +0x90,0x97,0x25,0x12,0x43,0x53,0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x97,0x29,0x12,0x2a,0x7f,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00, +0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59, +0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x90, +0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71,0x50,0x90,0x97, +0x2d,0xe0,0x60,0x03,0x02,0x75,0x1b,0x90,0x97,0x19,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc5,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc9, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9, +0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd5,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd9,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xdd,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xed,0x12,0x43,0x53,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf1,0x12,0x43, +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, +0xf5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x01,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x05,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x09, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, +0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d, +0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97,0x15,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x2d,0x74,0x01,0xf0,0x22, +0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x1b,0x7f,0x8c,0x7e,0x08,0x12,0x27, +0xde,0x90,0x97,0x19,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x96, +0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x96,0xc9,0x12,0x2a, +0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xcd,0x12,0x2a,0x7f,0x7f,0x70, +0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd1,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12, +0x27,0xde,0x90,0x96,0xd5,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xdd,0x12, +0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe1,0x12,0x2a,0x7f,0x7f, +0x84,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe5,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e, +0x12,0x27,0xde,0x90,0x96,0xe9,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde, +0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf1, +0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf5,0x12,0x2a,0x7f, +0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf9,0x12,0x2a,0x7f,0x7f,0xdc,0x7e, +0x0e,0x12,0x27,0xde,0x90,0x96,0xfd,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27, +0xde,0x90,0x97,0x01,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97, +0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0x09,0x12,0x2a, +0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0x0d,0x12,0x2a,0x7f,0x7f,0x0c, +0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0x11,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12, +0x27,0xde,0x90,0x97,0x15,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90, +0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0xc0,0xfd,0xec, +0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00, +0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, +0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, +0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, +0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f, +0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4, +0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25, +0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b, +0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24, +0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27, +0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xe4,0xff,0xec, +0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x11,0xff, +0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27, +0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0, +0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44, +0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09, +0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xe4, +0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44, +0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09, +0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed, +0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3, +0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97,0xb3,0x12,0x2a, +0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e, +0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a, +0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12, +0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3, +0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3,0x10,0xaf,0x01, +0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0,0xd3,0x94,0x07, +0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4, +0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f, +0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x68, +0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8,0xf0,0xe0,0xff, +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x12,0x4f, +0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60, +0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xbb,0xe0, +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4, +0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x8b, +0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3b,0xf0,0xe0, +0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde, +0x90,0x97,0x34,0x12,0x2a,0x7f,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x01,0x12, +0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8,0x04,0xa9,0x05, +0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03,0xfc,0x12,0x43, +0x46,0x90,0x97,0x3e,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90, +0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03,0xfc,0xec,0x44, +0xc0,0xfc,0x90,0x97,0x34,0x12,0x2a,0x7f,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x3b,0xe0,0x30, +0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd, +0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e,0x90,0x00,0x47, +0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0,0x54,0xf3,0xfd, +0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f,0x46,0x12,0x47, +0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60,0x6a,0x24,0x02, +0x60,0x02,0xe1,0x95,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0,0x44,0x0c, +0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,0x47,0x12, +0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75,0xe4,0x90,0x97, +0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80, +0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x12,0x47, +0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46, +0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01,0xf0,0x90,0x97, +0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f, +0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x45, +0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd, +0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3c,0xf0, +0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12,0xc2,0xaf,0x90, +0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40,0x7f,0x01,0x12, +0x36,0xaf,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97,0x42,0xf0,0x90, +0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97,0x44,0xf0,0x90, +0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97,0x4c,0xf0,0x90, +0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00,0x51,0xe0,0x44, +0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01,0x60,0x08,0x90, +0x97,0x3a,0xe0,0x60,0x02,0x01,0xfe,0x90,0x97,0x2e,0xe0,0xc3,0x94,0xff,0x50,0x05, +0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04, +0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a,0xe0,0x04,0xf0, +0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94,0xff,0x50,0x10, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90,0x97,0x2e,0xf0, +0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90,0x97,0x42,0xe0, +0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43,0xe0,0xc3,0x94, +0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0,0xc3,0x94,0xff, +0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42,0xf0,0x90,0x00, +0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04, +0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4, +0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90, +0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01,0xf0,0x22,0x90, +0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x25, +0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25,0xe0,0x90,0x97, +0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97, +0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97, +0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x97,0x39,0xe0, +0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90,0x97,0x3a,0xe0, +0x70,0x02,0x41,0x09,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x09,0x90,0x97,0x3d,0xe0, +0x70,0x02,0x41,0x09,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x97, +0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12,0x47,0x49,0x90, +0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60, +0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e, +0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0, +0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90, +0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90, +0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0xa2, +0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0, +0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2d,0x90,0x97,0x3a,0xe0,0x70,0x2f,0x90, +0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x12,0x47, +0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x7d, +0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x22,0x00, +0xb5,0xf6,}; + + +// ===================8723========================================= +u8 Rtl8192CUFwUMC8723ImgArray[UMC8723ImgArrayLength] = { +0xc1,0x88,0x02,0x00,0x39,0x00,0x01,0x00,0x09,0x09,0x16,0x47,0x80,0x3f,0x00,0x00, +0x29,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x74,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x59,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x73,0xab,0x00,0x00,0x00,0x00,0x00,0x02,0x67,0xfe,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x05,0x05,0x05,0x05,0x05,0x05, +0x05,0x07,0x07,0x07,0x08,0x0a,0x05,0x05,0x05,0x07,0x07,0x0a,0x0d,0x0e,0x05,0x05, +0x07,0x07,0x08,0x0c,0x14,0x14,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x0c,0x0e, +0x13,0x13,0x09,0x09,0x0a,0x0b,0x0d,0x11,0x13,0x13,0x09,0x09,0x09,0x09,0x0c,0x14, +0x15,0x15,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x05, +0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05, +0x05,0x05,0x09,0x09,0x09,0x09,0x0b,0x0d,0x10,0x12,0x05,0x09,0x0a,0x0c,0x0d,0x0e, +0x10,0x12,0x09,0x09,0x0e,0x0e,0x10,0x10,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06, +0x07,0x08,0x01,0x02,0x03,0x04,0x08,0x0f,0x23,0x3c,0x05,0x06,0x07,0x0f,0x19,0x32, +0x4b,0x64,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x22,0x1f, +0x1e,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x8f,0x17,0x74,0x42,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x20,0xf0,0x74,0x84,0x25,0x17, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0x90,0x97,0x54,0xf0,0xe0,0xfb, +0x54,0x1f,0xff,0xa3,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4, +0x34,0x93,0xf5,0x83,0xe0,0xfe,0x90,0x97,0x57,0xf0,0xe5,0x17,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x58,0xcd,0xf0, +0xa3,0xed,0xf0,0xe5,0x17,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x5a,0xcd,0xf0,0xa3,0xed,0xf0,0xef,0xc3,0x9e,0x40, +0x03,0x02,0x43,0x56,0x90,0x01,0xc5,0x74,0x20,0xf0,0x90,0x97,0x55,0xe0,0xff,0x74, +0xa5,0x25,0x17,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0xef,0x04,0x90,0x97, +0x56,0xf0,0x90,0x97,0x57,0xe0,0xff,0x90,0x97,0x56,0xe0,0xfe,0xd3,0x9f,0x40,0x03, +0x02,0x43,0xa0,0xee,0xc3,0x94,0x10,0x40,0x21,0xee,0x24,0xf0,0xff,0x74,0x01,0x7e, +0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97, +0x58,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x56,0xe0,0xff,0xc3, +0x94,0x10,0x50,0x59,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x5a,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x3c,0x90,0x97,0x56,0xe0,0xb4,0x11,0x0d,0x90,0x97,0x59,0xe0,0x30,0xe7,0x06,0x90, +0x97,0x56,0x74,0x17,0xf0,0x90,0x97,0x56,0xe0,0xff,0x64,0x13,0x60,0x04,0xef,0xb4, +0x12,0x0d,0x90,0x97,0x58,0xe0,0x30,0xe0,0x06,0x90,0x97,0x56,0x74,0x18,0xf0,0x90, +0x97,0x56,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x54,0xf0,0x80,0x53,0x90,0x97,0x56, +0xe0,0x04,0xf0,0x02,0x42,0xb2,0x90,0x97,0x57,0xe0,0xf9,0x90,0x97,0x55,0xe0,0xff, +0x69,0x60,0x03,0x02,0x43,0xe8,0x90,0x01,0xc5,0x74,0x40,0xf0,0x74,0xa5,0x25,0x17, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24, +0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xb4,0x01,0x14,0xeb,0x30,0xe6,0x06, +0x90,0x97,0x54,0xe0,0xff,0x22,0x90,0x97,0x55,0xe0,0x44,0x40,0x90,0x97,0x54,0xf0, +0x90,0x97,0x55,0xe0,0xff,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2d,0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0x12,0x1d,0xa9,0x80,0x71,0x90,0x97,0x55,0xe0,0xd3,0x99,0x40,0x69, +0x90,0x01,0xc5,0x74,0x60,0xf0,0x90,0x97,0x57,0xe0,0xff,0x74,0xa5,0x25,0x17,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x90,0x97,0x55,0xef,0xf0,0x90,0x97,0x54, +0xf0,0xfb,0xa3,0xe0,0xff,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2d,0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0x12,0x1d,0xa9,0xaf,0x03,0x22,0x74,0x01,0x25,0x17,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x54,0xe0,0x44,0x80,0xff,0x74,0x84,0x25, +0x17,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xef,0xf0,0x22,0xef,0x14,0x60,0x20,0x14, +0x60,0x4b,0x24,0x02,0x70,0x78,0x90,0x97,0x69,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0, +0x44,0x0c,0xf0,0x90,0x00,0x47,0xe0,0x44,0x08,0xf0,0x90,0x00,0x45,0x80,0x5b,0xe4, +0x90,0x97,0x69,0xf0,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, +0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90, +0x00,0x45,0xe0,0x44,0xef,0xf0,0xe0,0x54,0xef,0xf0,0xa3,0x80,0x2d,0x90,0x97,0x69, +0x74,0x01,0xf0,0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90,0x00, +0x45,0xe0,0x44,0x20,0xf0,0xe0,0x44,0x10,0xf0,0xa3,0xe0,0x44,0x10,0xf0,0x22,0xe4, +0xf5,0x61,0x22,0x02,0x7f,0x69,0x02,0x7f,0x70,0x74,0x45,0x90,0x01,0xc4,0xf0,0xa3, +0x74,0x09,0xf0,0xe4,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xff,0xc3,0x94,0x20, +0x40,0x03,0x02,0x4e,0x3a,0xef,0x75,0xf0,0x08,0xa4,0x24,0x6a,0xf5,0x82,0xe4,0x34, +0x93,0xf5,0x83,0xe0,0x64,0x01,0x60,0x03,0x02,0x4e,0x31,0x90,0x97,0x3a,0xe0,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0xd3,0x94, +0x00,0xec,0x94,0x00,0x50,0x03,0x02,0x4e,0x31,0xef,0x75,0xf0,0x0a,0xa4,0x24,0x00, +0xf9,0x74,0x90,0x35,0xf0,0xfa,0x7b,0x01,0x8b,0x13,0xf5,0x14,0x89,0x15,0x90,0x97, +0x3a,0xe0,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfd,0xa3, +0xe0,0x90,0x97,0x46,0xcd,0xf0,0xa3,0xed,0xf0,0xef,0x25,0xe0,0x24,0x63,0xf5,0x82, +0xe4,0x34,0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x48,0xcf,0xf0,0xa3,0xef, +0xf0,0x90,0x00,0x02,0x12,0x66,0x20,0xff,0xae,0xf0,0x12,0x65,0xf5,0x2f,0xff,0xe5, +0xf0,0x3e,0x90,0x97,0x4f,0xf0,0xa3,0xef,0xf0,0x90,0x00,0x06,0x12,0x66,0x20,0xff, +0xae,0xf0,0x90,0x00,0x04,0x12,0x66,0x20,0x2f,0xff,0xe5,0xf0,0x3e,0x90,0x97,0x4d, +0xf0,0xa3,0xef,0xf0,0x90,0x00,0x08,0x12,0x66,0x20,0xff,0x90,0x97,0x4b,0xe5,0xf0, +0xf0,0xa3,0xef,0xf0,0x90,0x97,0x3a,0xe0,0xfe,0x24,0x84,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x3c,0xf0,0xe0,0xfd,0x54,0x1f,0xa3,0xf0,0xee, +0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0x90,0x97, +0x51,0xf0,0x90,0x97,0x3a,0xe0,0xfb,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, +0xe0,0xc3,0x94,0x05,0x40,0x03,0x02,0x49,0xc2,0x90,0x97,0x51,0xe0,0xfe,0x90,0x97, +0x3d,0xe0,0x9e,0x40,0x13,0x90,0x97,0x51,0xe0,0x90,0x97,0x3d,0xf0,0xed,0x54,0x40, +0xfd,0x90,0x97,0x3c,0xf0,0xee,0x4d,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70,0x28, +0x90,0x97,0x3d,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x2b,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x32,0x90, +0x97,0x3d,0xe0,0x90,0x41,0x2e,0x80,0x29,0x90,0x97,0x3d,0xe0,0xff,0x90,0x41,0x4a, +0x93,0xfe,0x90,0x97,0x3a,0xe0,0x24,0x23,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80,0x07,0x90,0x97,0x3d,0xe0,0x90,0x40, +0xf6,0x93,0x90,0x97,0x4a,0xf0,0x90,0x97,0x4a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x10,0xff,0xf5,0x11,0x89,0x12,0x90,0x97,0x3c,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x49,0xe0,0x9f,0x90,0x97,0x48,0xe0,0x94, +0x00,0x40,0x0d,0x90,0x97,0x3a,0xe0,0xff,0xe4,0xfd,0x12,0x5f,0x6d,0x02,0x4d,0xc7, +0x90,0x97,0x3a,0xe0,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x97,0x3e,0x12, +0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb, +0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x1c, +0xd6,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0xf5,0xfd,0xac,0xf0, +0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f, +0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9, +0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00, +0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x01,0x12, +0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x66, +0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01, +0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97, +0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3, +0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12, +0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90, +0x00,0x04,0x12,0x66,0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03, +0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec, +0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9, +0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10, +0xaa,0x11,0xa9,0x12,0x90,0x00,0x03,0x12,0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa, +0x14,0xa9,0x15,0x90,0x00,0x06,0x12,0x66,0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4, +0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe, +0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0, +0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02, +0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x04,0x12,0x1c,0xef,0xff,0x7e, +0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x08,0x12,0x66,0x20,0xfd,0xac,0xf0, +0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f, +0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9, +0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x05,0x12,0x1c,0xef,0xff,0x7e,0x00,0x90, +0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0x90,0x97,0x3e, +0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66,0xa4,0x90, +0x97,0x3e,0x40,0x50,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xc0, +0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x05, +0x12,0x1c,0xef,0xff,0x7e,0x00,0x90,0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d, +0x1c,0xab,0x07,0xaa,0x06,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xc3,0xef,0x9b, +0xff,0xee,0x9a,0xfe,0xed,0x94,0x00,0xfd,0xec,0x94,0x00,0xfc,0x90,0x97,0x3e,0x12, +0x1d,0xa9,0x80,0x07,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0x90,0x97,0x3e,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x97,0x3a,0xe0,0x25,0xe0,0x25, +0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0x90,0x97,0x3c, +0xe0,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xe4,0xfc,0xfd,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0, +0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66,0xa4,0x40,0x0b,0x90,0x97,0x3a,0xe0,0xff,0x12, +0x42,0x20,0x02,0x4d,0x3e,0x90,0x97,0x3c,0xe0,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe4,0xfc,0xfd,0x90,0x97, +0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0x12,0x66,0xa4, +0x40,0x03,0x02,0x4d,0x3e,0x90,0x97,0x3a,0xe0,0xff,0x7d,0x01,0x12,0x5f,0x6d,0x02, +0x4d,0x3e,0x90,0x97,0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, +0xe0,0x64,0x05,0x60,0x03,0x02,0x4b,0x8e,0x90,0x04,0xb3,0xe0,0x64,0x01,0x70,0x03, +0x02,0x4b,0x8e,0x90,0x93,0x62,0xe0,0xfe,0xb4,0x03,0x0b,0x90,0x97,0x3d,0xe0,0xc3, +0x94,0x19,0x40,0x3d,0x80,0x2e,0xee,0xb4,0x02,0x0b,0x90,0x97,0x3d,0xe0,0xc3,0x94, +0x11,0x40,0x2e,0x80,0x1f,0x90,0x93,0x62,0xe0,0xfe,0xb4,0x01,0x0b,0x90,0x97,0x3d, +0xe0,0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xee,0x70,0x11,0x90,0x97,0x3d,0xe0,0xc3, +0x94,0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43, +0xf0,0x74,0x23,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30, +0x50,0x03,0x02,0x4b,0x2d,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x03,0x02,0x4b,0x2d, +0x90,0x97,0x3a,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a, +0x60,0x56,0x90,0x97,0x3a,0xe0,0xfe,0xef,0x24,0x05,0xfd,0xe4,0x33,0xfc,0x74,0x21, +0x2e,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xff,0xd3,0x9d,0xec,0x64,0x80,0xf8, +0x74,0x80,0x98,0x50,0x33,0xef,0x24,0x05,0xfd,0xe4,0x33,0xfc,0x74,0x23,0x2e,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9d,0xec,0x64,0x80,0xf8,0x74,0x80,0x98, +0x50,0x16,0x90,0x97,0x3a,0xe0,0x24,0x84,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0, +0xff,0x90,0x97,0x3d,0xe0,0x6f,0x60,0x56,0x90,0x97,0x3a,0xe0,0x24,0x23,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x46,0x40,0x08,0x90,0x97,0x52,0x74, +0x05,0xf0,0x80,0x11,0xef,0xd3,0x94,0x3c,0x90,0x97,0x52,0x40,0x05,0x74,0x03,0xf0, +0x80,0x03,0x74,0x01,0xf0,0x90,0x97,0x3a,0xe0,0xff,0x24,0x23,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfe,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee, +0xf0,0x90,0x97,0x3a,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x95,0x80,0x2f,0x90,0x97, +0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44, +0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x14,0xe4,0x90,0x97, +0x52,0xf0,0x90,0x97,0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4, +0xf0,0x90,0x97,0x3d,0xe0,0xff,0x90,0x97,0x3a,0xe0,0xfe,0x24,0x84,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xef,0xf0,0xee,0x30,0xe0,0x1e,0x90,0x97,0x52,0xe0,0xc4,0x54, +0xf0,0xf0,0x90,0x97,0x3a,0xe0,0xc3,0x13,0xff,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0x0f,0x02,0x4d,0x21,0x90,0x97,0x3a,0xe0,0xc3,0x13,0xff,0x24, +0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0x02,0x4d,0x21,0x90,0x97, +0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x64,0x06,0x60,0x03, +0x02,0x4d,0x3e,0x90,0x04,0xb3,0xe0,0x64,0x01,0x70,0x03,0x02,0x4d,0x3e,0x90,0x97, +0x3e,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0x90,0x42,0x13,0xe4,0x93,0xff,0x7e,0x00, +0x90,0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0x90,0x97, +0x42,0x12,0x1d,0xa9,0xe4,0x90,0x97,0x3b,0xf0,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0, +0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab, +0x13,0xaa,0x14,0xa9,0x15,0x90,0x97,0x3b,0xe0,0xff,0x75,0xf0,0x02,0xa4,0xf5,0x82, +0x85,0xf0,0x83,0x12,0x66,0x20,0xfd,0xac,0xf0,0xef,0x90,0x42,0x0e,0x93,0xff,0x7e, +0x00,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb, +0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d, +0xa9,0x90,0x97,0x42,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, +0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66, +0xa4,0x50,0x0e,0x90,0x97,0x3b,0xe0,0x04,0xf0,0xe0,0x64,0x05,0x60,0x03,0x02,0x4b, +0xd9,0x90,0x97,0x3b,0xe0,0xc3,0x13,0xf0,0x90,0x97,0x52,0xe0,0xff,0xb4,0x01,0x0d, +0x90,0x97,0x3b,0xe0,0x70,0x5d,0x90,0x97,0x52,0x04,0xf0,0x80,0x5b,0xef,0xb4,0x03, +0x1d,0x90,0x97,0x3b,0xe0,0xff,0x70,0x08,0x90,0x97,0x52,0x74,0x03,0xf0,0x80,0x48, +0xef,0xb4,0x01,0x08,0x90,0x97,0x52,0x74,0x01,0xf0,0x80,0x3c,0x80,0x35,0x90,0x97, +0x52,0xe0,0x64,0x05,0x70,0x32,0x90,0x97,0x3b,0xe0,0xff,0x70,0x08,0x90,0x97,0x52, +0x74,0x05,0xf0,0x80,0x0f,0xef,0x90,0x97,0x52,0xb4,0x01,0x05,0x74,0x03,0xf0,0x80, +0x03,0x74,0x01,0xf0,0xd3,0x90,0x97,0x49,0xe0,0x94,0x03,0x90,0x97,0x48,0xe0,0x94, +0x00,0x40,0x05,0xe4,0x90,0x97,0x52,0xf0,0xd3,0x90,0x97,0x49,0xe0,0x94,0x03,0x90, +0x97,0x48,0xe0,0x94,0x00,0x40,0x05,0xe4,0x90,0x97,0x52,0xf0,0x90,0x97,0x3a,0xe0, +0xff,0x30,0xe0,0x1a,0x90,0x97,0x52,0xe0,0xc4,0x54,0xf0,0xf0,0xef,0xc3,0x13,0xff, +0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x13,0x90,0x97, +0x3a,0xe0,0xc3,0x13,0xff,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, +0xf0,0xf0,0x74,0xa4,0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x90,0x97,0x52,0xe0,0xfe,0xef,0x4e,0xd0,0x82,0xd0,0x83,0xf0,0x90,0x97, +0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05, +0x50,0x0f,0x74,0x64,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0f,0x90,0x97,0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0, +0x90,0x97,0x3a,0xe0,0xff,0x24,0x84,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, +0x1f,0xc3,0x94,0x09,0x50,0x05,0x90,0x92,0x00,0x80,0x11,0x74,0x84,0x2f,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x90,0x92,0x00,0x20,0xe2,0x05,0x74,0x08,0xf0,0x80, +0x03,0x74,0x04,0xf0,0x90,0x97,0x3a,0xe0,0x60,0x0d,0x90,0x96,0xa4,0xe0,0xff,0x90, +0x92,0x00,0xe0,0xc3,0x9f,0x50,0x08,0x90,0x92,0x00,0xe0,0x90,0x96,0xa4,0xf0,0x90, +0x96,0xa4,0xe0,0x90,0x04,0x80,0xf0,0xab,0x13,0xaa,0x14,0xa9,0x15,0xe4,0xf5,0xf0, +0x12,0x66,0x58,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0xe4,0xf5,0xf0,0x12, +0x66,0x77,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x66,0x77,0x90,0x00,0x06,0xe4,0xf5, +0xf0,0x12,0x66,0x77,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x66,0x77,0x90,0x97,0x3a, +0xe0,0xff,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xef,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xef,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0,0x02,0x45,0x18,0x22,0xef,0x70,0x03,0x02,0x50, +0xa3,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x54,0xe5,0x90,0x97,0x19,0xe0,0xfc,0xa3, +0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c, +0x7e,0x08,0x12,0x33,0xd8,0x90,0x96,0xc5,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x44,0x7e,0x08,0x12,0x33,0xd8, +0x90,0x96,0xc9,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, +0x56,0x12,0x1d,0xa9,0x7f,0x5c,0x7e,0x08,0x12,0x33,0xd8,0x90,0x96,0xcd,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f, +0x6c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xd1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x33, +0xd8,0x90,0x96,0xd5,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, +0x81,0x56,0x12,0x1d,0xa9,0x7f,0x74,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xd9,0xe0, +0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x78,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xdd,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x7c,0x7e,0x0e,0x12, +0x33,0xd8,0x90,0x96,0xe1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff, +0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xe5, +0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d, +0xa9,0x7f,0x84,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xe9,0xe0,0xfc,0xa3,0xe0,0xfd, +0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x88,0x7e,0x0e, +0x12,0x33,0xd8,0x90,0x96,0xed,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96, +0xf1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12, +0x1d,0xa9,0x7f,0xd0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xf5,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xd4,0x7e, +0x0e,0x12,0x33,0xd8,0x90,0x96,0xf9,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, +0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xd8,0x7e,0x0e,0x12,0x33,0xd8,0x90, +0x96,0xfd,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0xdc,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x97,0x01,0xe0,0xfc,0xa3, +0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xe0, +0x7e,0x0e,0x12,0x33,0xd8,0x90,0x97,0x05,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xec,0x7e,0x0e,0x12,0x33,0xd8, +0x90,0x97,0x09,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, +0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x0d,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f, +0x04,0x7e,0x0d,0x12,0x33,0xd8,0x90,0x97,0x11,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33, +0xd8,0x90,0x97,0x15,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, +0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x2d,0x74, +0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x03,0x02,0x54,0xe5,0x7f,0x8c, +0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x19,0x12,0x1d,0xa9,0x7f,0x44,0x7e,0x08,0x12, +0x2b,0x13,0x90,0x96,0xc5,0x12,0x1d,0xa9,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x13,0x90, +0x96,0xc9,0x12,0x1d,0xa9,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xcd,0x12, +0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xd1,0x12,0x1d,0xa9,0x7f, +0x74,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xd5,0x12,0x1d,0xa9,0x7f,0x78,0x7e,0x0e, +0x12,0x2b,0x13,0x90,0x96,0xd9,0x12,0x1d,0xa9,0x7f,0x7c,0x7e,0x0e,0x12,0x2b,0x13, +0x90,0x96,0xdd,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe1, +0x12,0x1d,0xa9,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe5,0x12,0x1d,0xa9, +0x7f,0x88,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe9,0x12,0x1d,0xa9,0x7f,0x8c,0x7e, +0x0e,0x12,0x2b,0x13,0x90,0x96,0xed,0x12,0x1d,0xa9,0x7f,0xd0,0x7e,0x0e,0x12,0x2b, +0x13,0x90,0x96,0xf1,0x12,0x1d,0xa9,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96, +0xf5,0x12,0x1d,0xa9,0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xf9,0x12,0x1d, +0xa9,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xfd,0x12,0x1d,0xa9,0x7f,0xe0, +0x7e,0x0e,0x12,0x2b,0x13,0x90,0x97,0x01,0x12,0x1d,0xa9,0x7f,0xec,0x7e,0x0e,0x12, +0x2b,0x13,0x90,0x97,0x05,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x13,0x90, +0x97,0x09,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x13,0x90,0x97,0x0d,0x12, +0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x13,0x90,0x97,0x11,0x12,0x1d,0xa9,0x7f, +0x04,0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x15,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x08, +0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xed,0x44,0xc0,0xfd,0xec,0x90,0x97,0xa3,0x12, +0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff, +0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x08,0x12,0x33,0xd8,0x90,0x81,0x56, +0x12,0x1d,0xb5,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x33,0xd8,0x90,0x81, +0x56,0x12,0x1d,0xb5,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x33,0xd8,0x90, +0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x33,0xd8, +0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x33, +0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12, +0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e, +0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e, +0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x80, +0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x63,0xdb,0x25,0xa4,0x7f, +0x84,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4, +0x7f,0x88,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25, +0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb, +0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20, +0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5, +0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d, +0xb5,0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12, +0x1d,0xb5,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56, +0x12,0x1d,0xb5,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x33,0xd8,0x7f,0x04, +0x7e,0x0c,0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xe4,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, +0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x11,0xff,0xec, +0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33, +0xd8,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97, +0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xf0,0xff,0xec,0x90, +0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0x44,0x01,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0, +0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x04,0x7e,0x0d,0x12,0x33,0xd8,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x13,0x90,0x97, +0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xe4, +0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd, +0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x11,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, +0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33,0xd8,0x7f,0x0c,0x7e,0x09,0x12,0x2b, +0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0xff,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xa3, +0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, +0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33,0xd8,0x7f,0x04,0x7e,0x08,0x12,0x2b, +0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0x54,0xf0,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97, +0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x01,0xff,0xec,0x90, +0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x08,0x12,0x33,0xd8, +0xe4,0x90,0x97,0x2d,0xf0,0x22,0x8f,0x10,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xaf,0x82,0xf5,0x11,0x8f,0x12,0xe5,0x10,0x75,0xf0,0x02,0xa4,0x24,0x81, +0xf9,0x74,0x92,0x35,0xf0,0x75,0x13,0x01,0xf5,0x14,0x89,0x15,0xe5,0x10,0x75,0xf0, +0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4,0x34,0x93,0xaf,0x82,0xf5,0x16,0x8f,0x17,0xe5, +0x10,0x75,0xf0,0x08,0xa4,0x24,0x63,0xf9,0x74,0x93,0x35,0xf0,0x75,0x18,0x01,0xf5, +0x19,0x89,0x1a,0x74,0xc1,0x25,0x10,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12, +0x66,0xc1,0x55,0x67,0x00,0x55,0x7c,0x01,0x55,0x91,0x02,0x55,0xa6,0x03,0x55,0xd0, +0x04,0x55,0xe5,0x05,0x55,0xfa,0x06,0x56,0x21,0x0c,0x56,0x4f,0x0d,0x56,0x7c,0x0e, +0x56,0xa9,0x0f,0x00,0x00,0x56,0xdd,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x10,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80, +0x27,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5, +0x82,0xe4,0x34,0x92,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x56,0xdd, +0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf5,0x80,0x27,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x10,0x25,0xe0,0x24,0xe4, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x10,0x25, +0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x56, +0xdd,0x90,0x04,0x47,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04, +0x46,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04, +0x45,0xe0,0x85,0x12,0x82,0x85,0x11,0x83,0xf0,0x90,0x04,0x44,0x02,0x56,0xd4,0x90, +0x04,0x4b,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x4a,0xe0, +0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x49,0xe0, +0x85,0x12,0x82,0x85,0x11,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0, +0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x4e,0xe0,0xab,0x13,0xaa, +0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x4d,0xe0,0x85,0x12,0x82, +0x85,0x11,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x13,0xaa, +0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x52,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15, +0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x51,0xe0,0x85,0x12,0x82,0x85,0x11,0x83, +0xf0,0x90,0x04,0x50,0xe0,0x85,0x12,0x82,0x85,0x11,0x83,0xa3,0xf0,0xab,0x13,0xaa, +0x14,0xa9,0x15,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x1c,0xd6,0xff,0xab,0x18,0xaa, +0x19,0xa9,0x1a,0x12,0x1c,0xd6,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x65,0x95, +0xab,0x13,0xe5,0x15,0x24,0x01,0xf9,0xe4,0x35,0x14,0xfa,0xc0,0x03,0xc0,0x02,0xc0, +0x01,0x12,0x1c,0xd6,0xff,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x1c, +0xef,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x65,0x95,0x85,0x12,0x82,0x85,0x11, +0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x17,0x82,0x85,0x16,0x83,0xe0,0xfe,0xef, +0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x12,0x82,0x85,0x11,0x83,0xa3,0xc0,0x83,0xc0, +0x82,0xe0,0xff,0x85,0x17,0x82,0x85,0x16,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82, +0xd0,0x83,0xf0,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x4c,0x90,0x97,0x51,0x74,0x0b,0xf0,0x90,0x97,0x51, +0xe0,0xff,0xc3,0x94,0x00,0x50,0x03,0x02,0x58,0x23,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24, +0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x0a,0x90,0x97,0x51,0xe0,0x24,0x10,0xa3,0xf0,0x80,0x68,0x90,0x97,0x51,0xe0,0x14, +0xf0,0x80,0xba,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x47,0x90,0x97,0x51,0x74,0x0f,0xf0,0x90,0x97,0x51, +0xe0,0xff,0xc3,0x94,0x00,0x40,0x3c,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97, +0x51,0xe0,0xa3,0xf0,0x80,0x0d,0x90,0x97,0x51,0xe0,0x14,0xf0,0x80,0xbf,0xe4,0x90, +0x97,0x52,0xf0,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x47,0xe4,0x90,0x97,0x51,0xf0,0x90,0x97,0x51,0xe0, +0xff,0xc3,0x94,0x10,0x40,0x03,0x02,0x58,0xdd,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0xe4, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0x90,0x97,0x51,0xe0,0x80,0x63,0x90,0x97,0x51,0xe0,0x04,0xf0,0x80,0xbe,0xe5,0x10, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x46,0xe4,0x90,0x97,0x51,0xf0,0x90,0x97,0x51,0xe0,0xff,0xc3,0x94,0x0c,0x50, +0x3c,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x51,0xe0,0x24,0x10,0x80,0x09, +0x90,0x97,0x51,0xe0,0x04,0xf0,0x80,0xbf,0xe4,0x90,0x97,0x53,0xf0,0x90,0x97,0x52, +0xe0,0xff,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34,0x93,0xf5, +0x83,0xef,0xf0,0x90,0x97,0x53,0xe0,0xfe,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x68, +0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xee,0xf0,0x74,0x84,0x25,0x10,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x1f,0x90,0x97,0x52,0xe0,0xff,0x74,0x84, +0x25,0x10,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x10,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xef,0xf0,0x90,0x97,0x52,0xe0,0xff,0xd3,0x94,0x13, +0x40,0x08,0x90,0x93,0x62,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08, +0x90,0x93,0x62,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93, +0x62,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x62,0xf0,0x90,0x93,0x62,0xe0,0x90, +0x04,0xb1,0xf0,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xff,0xa3,0xe0,0x90,0x04,0x9c,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x10,0x25,0xe0, +0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x04,0x9e, +0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x69,0xf5,0x82,0xe4, +0x34,0x93,0xf5,0x83,0xe0,0xc4,0x33,0x54,0xe0,0x45,0x10,0x90,0x04,0xa0,0xf0,0x74, +0xc1,0x25,0x10,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x90,0x04,0xa1,0xf0,0x22, +0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0, +0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4, +0x74,0xd0,0xf0,0x74,0x59,0xa3,0xf0,0x90,0x01,0x37,0xe0,0x55,0x2b,0xf5,0x2f,0x90, +0x01,0x34,0xe0,0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xe5, +0x2c,0x20,0xe0,0x03,0x02,0x5b,0x82,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1,0x4d, +0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52,0x85, +0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54,0x20, +0x6f,0x70,0x03,0x02,0x5b,0x2f,0xe5,0x54,0x30,0xe5,0x03,0x02,0x5b,0x2f,0xe5,0x52, +0x54,0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5, +0x08,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12, +0x65,0xc9,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4, +0x34,0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x65,0xc9,0xe5,0x09,0xd3,0x94,0x04,0x40, +0x03,0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0xa4,0x24,0x00,0xf5,0x82,0xe5,0xf0, +0x34,0x90,0xf5,0x83,0x75,0xf0,0x02,0xe5,0x09,0x12,0x66,0xb5,0xe0,0xfe,0xa3,0xe0, +0xff,0xe5,0x53,0x54,0x1f,0x2f,0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0xa4, +0x24,0x00,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0x75,0xf0,0x02,0xe5,0x09,0x12, +0x66,0xb5,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6,0x24,0xe5,0x53,0x54,0x1f, +0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f, +0xf0,0x12,0x65,0xc9,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08,0x12,0x75,0x4c,0x80,0x2f, +0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94, +0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x65,0xc9,0xe5,0x4f,0x30,0xe7,0x12,0xe5,0x4f,0x54, +0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0d,0xab,0x09,0xaf,0x08,0x12,0x76,0x52,0xe5, +0x65,0x60,0x4f,0x90,0x97,0x8d,0xe0,0x60,0x35,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01, +0x3c,0x74,0x04,0xf0,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x70,0x34,0x75,0x48, +0x14,0xf5,0x49,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x38,0xec,0x90,0x01,0x5b,0x74, +0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x97,0x87,0xf0,0x80,0x14,0x90,0x04, +0x1b,0xe0,0x54,0x7f,0xff,0xbf,0x7f,0x0a,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12, +0x6e,0xda,0xe5,0x2c,0x30,0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x56, +0x85,0xd2,0x57,0x85,0xd3,0x58,0x85,0xd4,0x59,0x85,0xd5,0x5a,0x85,0xd6,0x5b,0x85, +0xd7,0x5c,0x85,0xd9,0x5d,0x12,0x7d,0xc4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34, +0x74,0x08,0xf0,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x55, +0x10,0xe5,0x2c,0x30,0xe5,0x21,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1a,0xe0,0x54,0xdf, +0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74, +0x40,0xf0,0xe5,0x2e,0x30,0xe1,0x09,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x55,0x40, +0xe5,0x2e,0x30,0xe0,0x09,0x90,0x01,0x36,0x74,0x01,0xf0,0x12,0x76,0xd3,0xe5,0x2e, +0x30,0xe2,0x63,0x90,0x01,0x36,0x74,0x04,0xf0,0xe5,0x64,0x64,0x01,0x70,0x57,0xe5, +0x65,0x60,0x53,0xe5,0x65,0x64,0x02,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x7f, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x7f,0xe0,0x70,0x07,0x90, +0x97,0x8a,0xe0,0xff,0x80,0x05,0x90,0x97,0x7f,0xe0,0xff,0x90,0x97,0x7f,0xef,0xf0, +0x90,0x97,0x81,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x80,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8f,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0x12,0x77,0x49,0xe5,0x2e,0x30,0xe3,0x31,0x90,0x01,0x36,0x74,0x08, +0xf0,0xe5,0x64,0x64,0x01,0x70,0x25,0xe5,0x65,0x60,0x21,0x90,0x01,0x57,0xe4,0xf0, +0x90,0x01,0x3c,0x74,0x02,0xf0,0x75,0x48,0x03,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f, +0x54,0x7e,0x01,0x12,0x38,0xec,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x3a,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x64,0x64,0x01,0x70,0x2e,0xe5,0x65,0x60, +0x2a,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8e,0xe4, +0xf0,0x90,0x97,0x8f,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x03,0x70,0x0e,0x90,0x97,0x89, +0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x2e,0x30,0xe5,0x12, +0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x64,0xb4,0x01,0x07,0xe5,0x65,0x60,0x03,0x12, +0x7e,0x7e,0xe5,0x2e,0x30,0xe6,0x2a,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x64,0x64, +0x01,0x70,0x1e,0xe5,0x65,0x60,0x1a,0x90,0x97,0x8f,0xe0,0x54,0xfe,0xf0,0xe0,0x54, +0x03,0x70,0x0e,0x90,0x97,0x89,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e, +0xda,0xe5,0x2f,0x30,0xe1,0x09,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x7c,0xe8,0x74, +0xd0,0x04,0x90,0x01,0xc4,0xf0,0x74,0x59,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05, +0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83, +0xd0,0xf0,0xd0,0xe0,0x32,0x74,0x5d,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x65,0xf0,0x90, +0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0,0xa3,0xe4,0xf0, +0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xff,0xc3,0x94,0x10,0x50,0x14,0x74,0xa4, +0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0, +0x80,0xe2,0xe4,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xfb,0xc3,0x94,0x20,0x40, +0x03,0x02,0x5f,0x6c,0xe0,0xff,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xf5,0x82,0xe5,0xf0, +0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xef,0xa4,0x24,0x02,0xf5, +0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xef,0xa4, +0x24,0x04,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xef,0xa4,0x24,0x06,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x75,0xf0,0x0a,0xef,0xa4,0x24,0x08,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13, +0xf0,0x74,0x44,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xef,0x25,0xe0, +0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x44,0x2f, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2f,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4, +0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x8c,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xeb,0x25, +0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0xeb, +0x75,0xf0,0x08,0xa4,0x24,0x6a,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01,0xf0, +0xeb,0x75,0xf0,0x08,0xa4,0x24,0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01, +0xf0,0x74,0xc1,0x2b,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0xeb,0x75, +0xf0,0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0xff,0xf0,0xa3, +0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x63,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4, +0xf0,0xa3,0x74,0x0f,0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34, +0x93,0xf5,0x83,0x74,0x13,0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x68,0xf5,0x82,0xe4, +0x34,0x93,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x2b,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0x74,0x13,0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0,0x02,0x5d,0xa7,0x22,0x8f,0x17,0x74, +0x5f,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x6d,0xf0,0x74,0x84,0x25,0x17,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0x90,0x97,0x54,0xf0,0xe0,0x54,0x1f,0xff,0x90, +0x97,0x57,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x68,0xf5,0x82,0xe4,0x34,0x93, +0xf5,0x83,0xe0,0x90,0x97,0x59,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5, +0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0x90,0x97,0x5a,0xf0,0xe5,0x17,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5b, +0xcb,0xf0,0xa3,0xeb,0xf0,0xe5,0x17,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3, +0x9e,0x40,0x0c,0x90,0x97,0x5a,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0x54,0xf0,0xed, +0x70,0x03,0x02,0x60,0xd9,0x90,0x97,0x58,0xed,0xf0,0x90,0x97,0x54,0xe0,0x30,0xe6, +0x0e,0x90,0x97,0x57,0xe0,0x90,0x97,0x54,0xf0,0x90,0x97,0x58,0xe0,0x14,0xf0,0x90, +0x97,0x58,0xe0,0x70,0x03,0x02,0x60,0xd9,0x90,0x97,0x57,0xe0,0xff,0xd3,0x94,0x00, +0x50,0x03,0x02,0x60,0xd9,0xe4,0x90,0x97,0x56,0xf0,0xef,0x14,0x90,0x97,0x55,0xf0, +0x90,0x97,0x59,0xe0,0xfd,0x90,0x97,0x55,0xe0,0xff,0xd3,0x9d,0x40,0x6f,0xef,0x94, +0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0, +0x5f,0x4e,0x70,0x27,0x90,0x97,0x55,0xe0,0xff,0xc3,0x94,0x10,0x50,0x37,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5b,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1a,0x90,0x97,0x55,0xe0,0x90, +0x97,0x54,0xf0,0x90,0x97,0x56,0xe0,0x04,0xf0,0x90,0x97,0x58,0xe0,0xff,0x90,0x97, +0x56,0xe0,0x6f,0x60,0x08,0x90,0x97,0x55,0xe0,0x14,0xf0,0x80,0x83,0x90,0x97,0x58, +0xe0,0xff,0x90,0x97,0x56,0xe0,0xc3,0x9f,0x50,0x0f,0x90,0x97,0x55,0xe0,0xb5,0x05, +0x08,0x90,0x97,0x59,0xe0,0x90,0x97,0x54,0xf0,0x90,0x97,0x54,0xe0,0xff,0x25,0xe0, +0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd, +0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2d, +0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25, +0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0x90, +0x97,0x54,0xe0,0xff,0x74,0x84,0x25,0x17,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xef, +0xf0,0x22,0x90,0x01,0xc4,0x74,0x32,0xf0,0x74,0x61,0xa3,0xf0,0x90,0x01,0xcc,0xe0, +0x54,0x0f,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xfd,0x70,0x03,0x02,0x62,0xd2, +0x90,0x97,0xb1,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x03,0x02,0x62,0xb3,0x90,0x97,0xb1, +0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd0,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0, +0x90,0x97,0x3b,0xf0,0xa2,0xaf,0xe4,0x33,0xa3,0xf0,0xc2,0xaf,0x75,0x24,0x01,0x75, +0x25,0x97,0x75,0x26,0x3b,0x75,0x27,0x01,0x7b,0x01,0x7a,0x97,0x79,0x3d,0x12,0x79, +0x27,0x90,0x97,0x3c,0xe0,0x24,0xff,0x92,0xaf,0xa3,0xe0,0xff,0xc4,0x13,0x13,0x13, +0x54,0x01,0x90,0x97,0xb1,0x30,0xe0,0x70,0xe0,0x75,0xf0,0x02,0xa4,0x24,0x88,0xf5, +0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe0,0x90,0x97,0x3e,0xf0,0x90,0x97,0xb1,0xe0,0x75, +0xf0,0x02,0xa4,0x24,0x89,0xf5,0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe0,0x90,0x97,0x3f, +0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd1,0xf5,0x82,0xe5,0xf0,0x34, +0x01,0xf5,0x83,0xe0,0x90,0x97,0x40,0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4, +0x24,0xd2,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x41,0xf0,0x90, +0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd3,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5, +0x83,0xe0,0x90,0x97,0x42,0xf0,0x80,0x42,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd1,0xf5, +0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x3e,0xf0,0x90,0x97,0xb1,0xe0, +0x75,0xf0,0x04,0xa4,0x24,0xd2,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90, +0x97,0x3f,0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd3,0xf5,0x82,0xe5, +0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x40,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01, +0x7a,0x97,0x79,0x3e,0x12,0x6e,0x02,0x90,0x97,0x3a,0xe0,0xff,0x90,0x97,0xb1,0xe0, +0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x97, +0x3a,0xf0,0x90,0x97,0xb1,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xb1,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0, +0x02,0x61,0x46,0xc2,0xaf,0x74,0x32,0x04,0x90,0x01,0xc4,0xf0,0x74,0x61,0xa3,0xf0, +0x90,0x97,0x3a,0xe0,0x90,0x01,0xc6,0xf0,0x90,0x97,0xb1,0xe0,0x90,0x01,0xc7,0xf0, +0x80,0xfe,0x22,0xe4,0x90,0x97,0x37,0xf0,0xa3,0xf0,0x12,0x7a,0x6c,0x90,0x00,0x02, +0xe0,0x54,0xe0,0x90,0x97,0x96,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0, +0x90,0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x97,0x74,0x01,0xf0,0x80,0x05,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x97,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30, +0xe7,0x0c,0x90,0x97,0x90,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97, +0x90,0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x55,0x12,0x5d,0x65,0x12,0x7f, +0x60,0x12,0x79,0xce,0x12,0x36,0xd1,0x12,0x44,0xff,0x75,0x28,0x33,0xe4,0xf5,0x29, +0x75,0x2a,0x02,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3, +0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05, +0x41,0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0, +0xf0,0x75,0x48,0xff,0xe4,0xf5,0x49,0xfb,0x7d,0x01,0x7f,0x50,0x7e,0x01,0x12,0x38, +0xec,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0, +0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x12,0x78,0xd0,0x90,0x97,0x39,0xe5,0xd9, +0xf0,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x01,0xc0, +0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0xc6,0xf0,0xa3,0xf0,0x90,0x97, +0x37,0xe0,0x64,0x01,0xf0,0x24,0xd3,0x90,0x01,0xc4,0xf0,0x74,0x62,0xa3,0xf0,0xe5, +0x55,0x30,0xe6,0x17,0xc2,0xaf,0x53,0x55,0xbf,0xd2,0xaf,0x12,0x45,0x09,0x90,0x97, +0x6d,0xe0,0xff,0x60,0x03,0xb4,0x01,0x03,0x12,0x6a,0x1f,0xe5,0x55,0x30,0xe7,0x07, +0xc2,0xaf,0x53,0x55,0x7f,0xd2,0xaf,0xe5,0x55,0x30,0xe4,0x0a,0xc2,0xaf,0x53,0x55, +0xef,0xd2,0xaf,0x12,0x61,0x32,0x90,0x97,0x6d,0xe0,0x70,0x03,0x12,0x6d,0x29,0x12, +0x7d,0x45,0x80,0xaa,0x90,0x00,0x02,0x12,0x1c,0xef,0x90,0x97,0x6b,0xf0,0x90,0x00, +0x01,0x12,0x1c,0xef,0x25,0xe0,0x25,0xe0,0x90,0x97,0x6a,0xf0,0x12,0x1c,0xd6,0x25, +0xe0,0x25,0xe0,0x90,0x97,0x6e,0xf0,0x90,0x97,0x6b,0xe0,0x90,0x04,0x98,0xf0,0x90, +0x97,0x6a,0xe0,0x13,0x13,0x54,0x3f,0x90,0x04,0x99,0xf0,0x90,0x97,0x6e,0xe0,0x13, +0x13,0x54,0x3f,0x90,0x04,0x9a,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x79,0xf0,0x90, +0x05,0x61,0xe0,0x90,0x97,0x7a,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x7b,0xf0,0x90, +0x05,0x63,0xe0,0x90,0x97,0x7c,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x49,0xf0,0xc2, +0xaf,0x90,0x97,0x6a,0xe0,0xff,0x12,0x79,0x7c,0x90,0x97,0x49,0xe0,0x24,0xff,0x92, +0xaf,0x90,0x97,0x6b,0xe0,0x70,0x03,0x02,0x65,0x61,0x90,0x97,0x6a,0xe0,0x70,0x03, +0x02,0x65,0x61,0x90,0x97,0x6e,0xe0,0x70,0x03,0x02,0x65,0x61,0xa2,0xaf,0xe4,0x33, +0x90,0x97,0x49,0xf0,0xc2,0xaf,0x90,0x97,0x7d,0x74,0x01,0xf0,0x90,0x97,0x49,0xe0, +0x24,0xff,0x92,0xaf,0x90,0x00,0x45,0xe0,0x54,0xfe,0xf0,0xa3,0xe0,0x44,0x01,0xf0, +0x90,0x97,0x63,0xe0,0x60,0x1d,0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33, +0xd8,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,0x54,0xef,0xf0, +0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x79,0xe0,0x90,0x05,0x84,0xf0,0x90, +0x97,0x7a,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x7b,0xe0,0x90,0x05,0x86,0xf0,0x90, +0x97,0x7c,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x49,0xf0,0xc2, +0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x3a,0x49,0x80, +0x2b,0x90,0x97,0x6b,0xe0,0x70,0x2d,0x90,0x97,0x7d,0xf0,0x90,0x00,0x45,0xe0,0x54, +0xfe,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90, +0x97,0x49,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x39,0xdb,0x90,0x97,0x49,0xe0, +0x24,0xff,0x92,0xaf,0x22,0xbb,0x01,0x06,0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02, +0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22, +0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0, +0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xa3, +0xf8,0xe0,0xc5,0xf0,0x25,0xf0,0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0, +0xc8,0x38,0xf0,0xe8,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5,0xf0,0xa3, +0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3,0xf5,0xf0, +0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01,0x93,0x22, +0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0, +0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22,0xbb,0xfe, +0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83, +0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xf0, +0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb,0xfe,0x06, +0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09,0xe9,0x25, +0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8,0xf2,0xe5, +0xf0,0x08,0xf2,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0, +0xe8,0x9c,0x45,0xf0,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83, +0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3, +0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68, +0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0,0xa3, +0xe9,0xf0,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x04, +0x12,0x1c,0xef,0xff,0x54,0x1f,0x90,0x97,0x49,0xf0,0x90,0x00,0x03,0x12,0x1c,0xef, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x4a,0xf0,0xef,0x54,0x20,0xc4,0x13,0x54,0x07, +0xa3,0xf0,0x90,0x97,0x49,0xe0,0xff,0x75,0xf0,0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4, +0x34,0x93,0xad,0x82,0x90,0x97,0x4c,0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x08,0xa4, +0x24,0x63,0xf9,0x74,0x93,0x35,0xf0,0xfa,0xa3,0x74,0x01,0xf0,0xa3,0xea,0xf0,0xa3, +0xe9,0xf0,0x90,0x97,0x46,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x03,0x12,0x1c, +0xef,0x54,0x0f,0xff,0x90,0x97,0x4e,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0xef, +0x12,0x65,0x95,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00, +0x02,0x12,0x1c,0xef,0xff,0x90,0x97,0x4e,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9, +0x90,0x00,0x01,0xef,0x12,0x65,0xa7,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, +0xe0,0xf9,0x90,0x00,0x01,0x12,0x1c,0xef,0xff,0x90,0x97,0x4c,0xe0,0xfc,0xa3,0xe0, +0xfd,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x12,0x1c,0xd6,0x8d,0x82,0x8c,0x83,0xa3,0xf0, +0x90,0x97,0x4a,0xe0,0xfe,0x90,0x97,0x49,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xee,0xf0,0x90,0x97,0x4b,0xe0,0xfe,0xef,0x75,0xf0,0x08,0xa4,0x24, +0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xee,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24, +0x6a,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01,0xf0,0x02,0x54,0xe6,0xc0,0xe0, +0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0, +0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xfe, +0xf0,0x74,0x67,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34, +0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xe5,0x34,0x30,0xe0, +0x0f,0x90,0x01,0x3c,0x74,0x01,0xf0,0x90,0x01,0x53,0x74,0x07,0xf0,0x43,0x55,0x80, +0xe5,0x34,0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x7b,0x00,0xe5,0x34, +0x30,0xe2,0x3a,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x1e, +0x75,0x48,0x14,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x38,0xec, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x0f,0x90,0x97, +0x87,0xe4,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x34,0x30, +0xe3,0x06,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c, +0x74,0x10,0xf0,0x12,0x7e,0xdf,0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20, +0xf0,0x12,0x6f,0xa2,0xe5,0x35,0x30,0xe0,0x15,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90, +0x00,0x83,0xe0,0x90,0x97,0x8b,0xf0,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x36, +0x30,0xe3,0x06,0x90,0x01,0x3e,0x74,0x08,0xf0,0x74,0xfe,0x04,0x90,0x01,0xc4,0xf0, +0x74,0x67,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02, +0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8b, +0x10,0x8a,0x11,0x89,0x12,0x90,0x00,0x02,0x12,0x1c,0xef,0x90,0x97,0x6c,0xf0,0xe0, +0x90,0x04,0x94,0xf0,0x90,0x00,0x01,0x12,0x1c,0xef,0x90,0x04,0x95,0xf0,0x90,0x97, +0x6c,0xe0,0x30,0xe0,0x74,0x90,0x97,0x63,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12, +0x2b,0x13,0x90,0x97,0x65,0x12,0x1d,0xa9,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00, +0x01,0x12,0x1c,0xef,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x1d,0x96,0xa8,0x04, +0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0xec,0x54,0x03,0xfc,0xeb,0x4f,0xff,0xea,0x4e,0xfe,0xe9,0x4d, +0xfd,0xe8,0x4c,0xfc,0x90,0x97,0x6f,0x12,0x1d,0xa9,0x90,0x05,0x22,0xe4,0xf0,0x90, +0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x78,0x18,0x12, +0x1d,0x83,0x90,0x04,0x96,0xef,0xf0,0x80,0x45,0xe4,0x90,0x97,0x63,0xf0,0x7f,0x80, +0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x65,0x12,0x1d,0xa9,0x90,0x97,0x65,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xec,0x44,0xc0,0xfc,0x90,0x97,0x65, +0x12,0x1d,0xa9,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97, +0x6c,0xe0,0x90,0x00,0x47,0x30,0xe1,0x11,0x74,0x0c,0xf0,0xa3,0xe0,0x44,0x0c,0xf0, +0x90,0x00,0x46,0xe0,0x44,0x10,0xf0,0x80,0x10,0xe0,0x54,0xf3,0xf0,0xa3,0xe0,0x54, +0xf3,0xf0,0x90,0x00,0x46,0xe0,0x54,0xef,0xf0,0xe4,0x90,0x97,0x69,0xf0,0x22,0x90, +0x97,0x64,0xe0,0xc3,0x94,0x14,0x50,0x06,0xe0,0x04,0xf0,0x02,0x6a,0xd9,0x90,0x97, +0x64,0xe0,0x64,0x14,0x60,0x03,0x02,0x6a,0xd9,0x90,0x97,0x73,0xe0,0x70,0x25,0x90, +0x97,0x76,0xe0,0x70,0x1f,0x90,0x97,0x74,0xe0,0x70,0x19,0x90,0x97,0x77,0xe0,0x70, +0x13,0x90,0x97,0x75,0xe0,0x70,0x0d,0x90,0x97,0x78,0xe0,0x70,0x07,0x90,0x04,0xfd, +0xe0,0x54,0xfe,0xf0,0x90,0x97,0x73,0xe0,0x90,0x04,0x88,0xf0,0x90,0x97,0x74,0xe0, +0x90,0x04,0x89,0xf0,0x90,0x97,0x75,0xe0,0x90,0x04,0x8a,0xf0,0xa3,0xe4,0xf0,0x90, +0x97,0x76,0xe0,0x90,0x04,0x8c,0xf0,0x90,0x97,0x77,0xe0,0x90,0x04,0x8d,0xf0,0x90, +0x97,0x78,0xe0,0x90,0x04,0x8e,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x5f,0xe0,0x90,0x04, +0x90,0xf0,0x90,0x97,0x60,0xe0,0x90,0x04,0x91,0xf0,0x90,0x97,0x61,0xe0,0x90,0x04, +0x92,0xf0,0x90,0x97,0x62,0xe0,0x90,0x04,0x93,0xf0,0xe4,0x90,0x97,0x64,0xf0,0x90, +0x97,0x5f,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97,0x73,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97,0x64,0xe0,0x90,0x04,0x97, +0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x3a,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x3b, +0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x3c,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x3d, +0xf0,0x90,0x97,0x7c,0xe0,0xff,0x90,0x97,0x3d,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90, +0x97,0x7c,0xe0,0xc3,0x9e,0xd3,0x94,0x01,0x40,0x11,0x90,0x97,0x6a,0xe0,0xb4,0x01, +0x02,0x80,0x03,0x90,0x97,0x6e,0xe0,0xff,0x12,0x79,0x7c,0x22,0x90,0x97,0xb0,0xed, +0xf0,0x90,0x97,0xaf,0xef,0xf0,0xd3,0x94,0x07,0x50,0x6d,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0, +0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb0,0xe0,0x60,0x16,0x90,0x97,0xaf,0xe0,0xff, +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80, +0x78,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x7d,0x90,0x97,0xaf,0xe0,0x24,0xf8,0xf0,0xe0, +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4, +0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97, +0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90, +0x00,0x43,0xe0,0x4f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb0,0xe0, +0x60,0x1b,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xaf, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0, +0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x22, +0x90,0x01,0xc4,0x74,0x30,0xf0,0x74,0x6c,0xa3,0xf0,0x7f,0x78,0x7e,0x08,0x12,0x2b, +0x13,0x90,0x97,0x1d,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x13,0x90,0x97, +0x21,0x12,0x1d,0xa9,0x7f,0x00,0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x25,0x12,0x1d, +0xa9,0x90,0x97,0x97,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x13,0xe0,0xfc,0xa3,0xe0,0xfd, +0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x0d,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xc7,0xff,0xec,0x90,0x81,0x56,0x12, +0x1d,0xa9,0x7f,0x78,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x21,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0x0f,0xff,0xec,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x25,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0x44,0x02,0xff,0xec,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x00, +0x7e,0x08,0x12,0x33,0xd8,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x97,0x29,0x12, +0x1d,0xa9,0x90,0x81,0x56,0x12,0x1d,0xb5,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e, +0x12,0x33,0xd8,0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff, +0x12,0x38,0xb6,0x90,0x97,0x97,0xe0,0xb4,0x01,0x11,0x90,0x81,0x24,0x12,0x1d,0xb5, +0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x38,0xb6,0x90,0x00,0x11,0xe0,0x54, +0xf6,0xf0,0x7f,0x10,0x7e,0x00,0x02,0x3a,0xa8,0x90,0x97,0x7d,0xe0,0x64,0x01,0x60, +0x09,0x90,0x97,0x6b,0xe0,0x60,0x03,0x02,0x6e,0x01,0x90,0x97,0x5f,0xe0,0xc3,0x94, +0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x60,0xe0,0xc3,0x94,0xff,0x50, +0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x61,0xe0,0xc3,0x94,0xff,0x50,0x0a, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x60,0xf0,0x80,0x15,0x90,0x97,0x62,0xe0,0xc3,0x94, +0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x61,0xf0,0x90,0x97,0x60,0xf0,0x90, +0x97,0x5f,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, +0x97,0x73,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x74, +0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x75,0xe0, +0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x74,0xf0,0x90,0x97,0x73, +0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x76,0xe0,0xc3,0x94,0xff,0x50, +0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x77,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, +0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x78,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, +0xf0,0xe4,0x90,0x97,0x77,0xf0,0x90,0x97,0x76,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, +0xf0,0x22,0x90,0x97,0x43,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xad,0x07,0x90, +0x01,0xc4,0x74,0x02,0xf0,0x74,0x6e,0xa3,0xf0,0xed,0x12,0x66,0xc1,0x6e,0x3f,0x01, +0x6e,0x4d,0x02,0x6e,0x5b,0x03,0x6e,0x69,0x05,0x6e,0x77,0x06,0x6e,0x85,0x07,0x6e, +0x93,0x09,0x6e,0xa1,0x0c,0x6e,0xaf,0x0d,0x6e,0xbd,0x0e,0x00,0x00,0x6e,0xcb,0x90, +0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7d,0x9d,0x90,0x97,0x43, +0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7f,0x77,0x90,0x97,0x43,0xe0,0xfb, +0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7d,0x17,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0xf9,0x02,0x7c,0x0b,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, +0xe0,0xf9,0x02,0x66,0xe7,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9, +0x02,0x7f,0x28,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x73, +0x14,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x64,0x34,0x90, +0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7c,0x7e,0x90,0x97,0x43, +0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x69,0x0f,0xc2,0xaf,0x74,0x02,0x04, +0x90,0x01,0xc4,0xf0,0x74,0x6e,0xa3,0xf0,0x80,0xfe,0x8f,0x62,0x8d,0x63,0x90,0x01, +0xc4,0x74,0xda,0xf0,0x74,0x6e,0xa3,0xf0,0xe5,0x62,0x54,0x0f,0xff,0x90,0x97,0x88, +0xe0,0x54,0x0f,0x6f,0x60,0x78,0xe5,0x62,0x30,0xe2,0x30,0x90,0x97,0x88,0xe0,0x20, +0xe2,0x05,0x7f,0x01,0x12,0x7e,0x08,0x90,0x97,0x88,0xe0,0x30,0xe3,0x0a,0xe5,0x62, +0x20,0xe3,0x05,0x12,0x7e,0x27,0x80,0x56,0x90,0x97,0x88,0xe0,0x20,0xe3,0x4f,0xe5, +0x62,0x30,0xe3,0x4a,0xaf,0x63,0x12,0x7d,0xe8,0x80,0x43,0x90,0x97,0x88,0xe0,0x54, +0x0f,0xff,0xbf,0x0c,0x0e,0xe5,0x62,0x20,0xe3,0x09,0x12,0x7d,0x72,0xef,0x60,0x2e, +0x12,0x7e,0x27,0x90,0x97,0x88,0xe0,0x54,0x0f,0xff,0xbf,0x04,0x0e,0xe5,0x62,0x20, +0xe2,0x09,0x12,0x7b,0x8a,0xef,0x60,0x16,0x12,0x7c,0x47,0x90,0x97,0x88,0xe0,0x54, +0x0f,0xff,0xbf,0x02,0x09,0x12,0x7a,0xb8,0xef,0x60,0x03,0x12,0x7e,0x44,0x90,0x97, +0x88,0xe0,0x54,0x0f,0xff,0x90,0x97,0x8b,0xe0,0x54,0x0f,0x6f,0x70,0x23,0xe0,0x30, +0xe6,0x1f,0x90,0x97,0x88,0xe0,0x54,0x0f,0xff,0x90,0x97,0x7e,0xe0,0xfe,0x4f,0x90, +0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x7e,0xf0,0x90,0x97,0x8b,0xe0,0x54,0xbf, +0xf0,0x22,0x90,0x97,0x6b,0xe0,0x64,0x01,0x60,0x03,0x02,0x70,0x65,0x90,0x00,0x46, +0xe0,0x44,0x01,0xf0,0x90,0x97,0x7d,0xe0,0x70,0x40,0x90,0x97,0x63,0xe0,0x60,0x1d, +0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, +0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x80,0x06,0x90,0x05,0x22, +0x74,0x7f,0xf0,0x90,0x97,0x6a,0xe0,0xff,0x12,0x79,0x7c,0x90,0x97,0x7d,0x74,0x01, +0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xf0,0x80,0x44,0x90,0x97,0x7d,0xe0,0x64,0x01, +0x70,0x3c,0x90,0x97,0x6e,0xe0,0xff,0x12,0x79,0x7c,0xe4,0x90,0x97,0x7d,0xf0,0x90, +0x00,0x45,0xe0,0x44,0x01,0xf0,0x90,0x97,0x63,0xe0,0x60,0x1d,0x90,0x97,0x65,0xe0, +0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05, +0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x79,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x7a, +0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x7b,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x7c, +0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x97,0x30,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9, +0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x70,0x03,0x02,0x71,0x1b,0x90,0x01,0xaf,0xe0, +0x60,0x09,0x90,0x01,0xc7,0xe0,0x04,0xf0,0xf0,0x80,0xf1,0x90,0x97,0xb3,0xe0,0xff, +0x04,0xf0,0x90,0x97,0x30,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x01, +0xef,0x12,0x65,0xa7,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x36,0xf0,0xc2,0xaf,0x90,0x97, +0x30,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0x8b,0x24,0x8a,0x25,0xf5,0x26,0x75,0x27, +0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x12,0x79,0x27,0x90,0x97,0x36,0xe0,0x24,0xff, +0x92,0xaf,0xa2,0xaf,0xe4,0x33,0xf0,0xc2,0xaf,0x90,0x97,0x33,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0x8b,0x24,0x8a,0x25,0xf5,0x26,0x90,0x97,0x30,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0xf9,0x12,0x1c,0xd6,0xff,0xc4,0x54,0x0f,0xf5,0x27,0x7b,0x01,0x7a, +0x01,0x79,0xa2,0x12,0x79,0x27,0x90,0x97,0x36,0xe0,0x24,0xff,0x92,0xaf,0x90,0x01, +0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0x22,0x90,0x01,0xc4,0x74, +0x1c,0xf0,0x74,0x71,0xa3,0xf0,0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x7f,0x10,0x7e, +0x00,0x12,0x3a,0xa8,0x90,0x97,0x1d,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, +0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x78,0x7e,0x08,0x12,0x33,0xd8,0x90, +0x97,0x21,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x25,0xe0,0xfc,0xa3, +0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x00, +0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x29,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x33,0xd8, +0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x38,0xb6, +0x90,0x97,0x97,0xe0,0xb4,0x01,0x11,0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x03,0x2d, +0x95,0xe4,0xfd,0x7f,0x01,0x12,0x38,0xb6,0x22,0x90,0x97,0x9e,0xef,0xf0,0xa3,0xed, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x65,0x60,0x05,0xe4,0xff,0x12,0x7e,0x99,0x90, +0x97,0x9e,0xe0,0x30,0xe0,0x09,0x90,0x97,0xa0,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90, +0x04,0x1d,0xe0,0x60,0x1d,0x90,0x05,0x22,0xe0,0x90,0x97,0xa2,0xf0,0xe0,0xff,0x54, +0x90,0x60,0xec,0x90,0x01,0xc8,0x74,0xfc,0xf0,0xef,0x54,0x6f,0x90,0x05,0x22,0xf0, +0x80,0xdd,0x90,0x97,0x9e,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0x9f,0xe0,0x60,0x10,0xa3,0xa3,0xe0,0x24,0x10,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xa0,0xa3,0xe0,0xff,0xfd,0x24, +0x08,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xa0,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x90, +0x97,0xb5,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb5,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb, +0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8, +0xf8,0xff,0x22,0x90,0x97,0xb5,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f, +0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb5,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8, +0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x42,0xe0, +0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13, +0xd8,0xf8,0xff,0x22,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xa2, +0xaf,0xe4,0x33,0xa3,0xf0,0xc2,0xaf,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, +0xe0,0xf9,0x90,0x00,0x01,0x12,0x66,0x20,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a, +0xfe,0x90,0x97,0x46,0xa3,0xe0,0xfa,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x66,0x77, +0x12,0x1c,0xd6,0xff,0x60,0x37,0xb5,0x5e,0x1b,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x01,0x12,0x66,0x20,0x65,0x60,0x70,0x04,0xe5,0x5f, +0x65,0xf0,0x60,0x2e,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90, +0x00,0x01,0x12,0x66,0x20,0xff,0xae,0xf0,0x12,0x7c,0xb4,0x80,0x15,0x90,0x97,0x46, +0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x12,0x1c,0xd6,0x65,0x5e,0x60,0x03,0x12, +0x7f,0x56,0x90,0x97,0x49,0xe0,0x24,0xff,0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0, +0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03, +0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xab,0xf0,0x74,0x73, +0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5, +0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74,0x40,0xf0,0x90,0x97,0x6c,0xe0,0x54,0x03,0xff, +0xbf,0x03,0x0b,0x90,0x97,0x69,0xe0,0x60,0x05,0x7f,0x01,0x12,0x44,0x7b,0xe5,0x3d, +0x30,0xe7,0x15,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x97,0x6c,0xe0,0x54,0x03,0xff, +0xbf,0x03,0x05,0x7f,0x02,0x12,0x44,0x7b,0x90,0x01,0xc4,0x74,0xab,0xf0,0x74,0x73, +0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01, +0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xef,0x60,0x34, +0x7d,0x7d,0x7f,0x02,0x12,0x39,0xbe,0x7d,0x02,0x7f,0x03,0x12,0x39,0xbe,0x90,0x01, +0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x12,0x6e,0xda, +0xe4,0xff,0x12,0x7e,0x99,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0, +0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7d,0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x7d, +0xff,0x12,0x3a,0x2f,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x2f,0x90,0x06,0x04,0xe0,0x44, +0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x97,0x83,0xe0,0xa3,0xe0,0x90, +0x05,0x58,0xf0,0xe5,0x64,0x30,0xe0,0x1b,0x90,0x97,0x81,0xe0,0x70,0x1a,0xe0,0x04, +0xf0,0x90,0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x0c,0x7d,0x01,0x7f,0x04, +0x02,0x6e,0xda,0xe4,0x90,0x97,0x81,0xf0,0x22,0x02,0x75,0x07,0x02,0x62,0xd3,0xe4, +0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,0x80, +0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,0x44, +0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,0x01, +0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x7f,0x0e,0xe4,0x7e,0x01,0x93,0x60,0xbc, +0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,0x0e, +0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3, +0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5, +0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x8f,0x0f,0x74,0x75, +0x90,0x01,0xc4,0xf0,0xa3,0x74,0x4c,0xf0,0xe5,0x0f,0x75,0xf0,0x08,0xa4,0x24,0x67, +0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0x74,0xa5,0x25,0x0f,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07,0xeb,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xe5,0x0f, +0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9, +0x74,0x84,0x25,0x0f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xeb,0xf0,0xff,0x22,0x90, +0x97,0x4c,0xef,0xf0,0xd3,0x94,0x07,0x50,0x33,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0x4c,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, +0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x3b,0x90,0x97,0x4c,0xe0, +0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12, +0x3a,0xa8,0x90,0x97,0x4c,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, +0xa8,0x22,0x8f,0x0a,0x8d,0x0b,0xad,0x03,0x74,0x76,0x90,0x01,0xc4,0xf0,0xa3,0x74, +0x52,0xf0,0xe5,0x0b,0x54,0x1f,0xf9,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe0,0xff,0x90,0x04,0xfd,0xe0,0xb4,0x01,0x05,0x75,0x0e,0x03,0x80,0x03, +0x75,0x0e,0x01,0xed,0xd3,0x95,0x0e,0x40,0x05,0xaf,0x0a,0x02,0x75,0x4c,0x90,0x01, +0xc5,0x74,0x20,0xf0,0xe5,0x0d,0x2f,0xff,0xe9,0x90,0x41,0xd6,0x93,0xfe,0xef,0xd3, +0x9e,0x40,0x22,0x90,0x01,0xc5,0x74,0x40,0xf0,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x04,0xf5, +0x83,0xe5,0x0b,0xf0,0x22,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xef,0xf0,0x22,0xe4,0x90,0x97,0x2e,0xf0,0xe5,0x65,0x60,0x6c,0xe5,0x64,0x64,0x01, +0x70,0x66,0xe5,0x65,0x64,0x02,0x60,0x06,0xe5,0x65,0x64,0x03,0x70,0x1d,0x90,0x97, +0x7f,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x97,0x7f,0xe0,0x70, +0x0a,0x90,0x97,0x8a,0xe0,0x90,0x97,0x7f,0xf0,0x80,0x00,0x90,0x97,0x2e,0x74,0x01, +0xf0,0x90,0x97,0x2e,0xe0,0x60,0x31,0x90,0x97,0x8f,0xe0,0x44,0x10,0xf0,0x90,0x97, +0x85,0xe0,0xf5,0x48,0xe4,0xf5,0x49,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x38,0xec, +0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50, +0x07,0x7d,0x01,0x7f,0x04,0x12,0x6e,0xda,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0a,0x54, +0xc0,0x70,0x0e,0x90,0x97,0x89,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x02,0x6e, +0xda,0xe5,0x0a,0x30,0xe6,0x12,0x90,0x97,0x89,0x74,0x01,0xf0,0x90,0x97,0x8f,0xe0, +0x44,0x01,0xf0,0x12,0x7e,0x7e,0x80,0x07,0x90,0x97,0x8f,0xe0,0x54,0xfe,0xf0,0xe5, +0x0a,0x30,0xe7,0x29,0x90,0x97,0x89,0x74,0x01,0xf0,0x90,0x97,0x8f,0xe0,0x44,0x02, +0xf0,0x75,0x48,0x03,0xe4,0xf5,0x49,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x38,0xec, +0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x8e,0x74,0x01,0xf0,0x22,0x90,0x97,0x8f, +0xe0,0x54,0xfd,0xf0,0x22,0x90,0x00,0x2b,0xe0,0x44,0x01,0xf0,0x7f,0xe8,0x7e,0x03, +0x12,0x3a,0xa8,0x90,0x00,0x08,0xe0,0x44,0x10,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, +0xa8,0x90,0x00,0x09,0xe0,0x54,0xf7,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, +0x00,0x28,0xe0,0x54,0xfe,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x20, +0xe0,0x54,0xfe,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x25,0xe0,0x44, +0x40,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x09,0xe0,0x54,0xef,0xf0, +0x7f,0x10,0x7e,0x00,0x02,0x3a,0xa8,0x8b,0x10,0x8a,0x11,0x89,0x12,0x12,0x7e,0xcd, +0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x1c,0xd6,0xf5,0x65,0x14,0x60,0x0e,0x14,0x60, +0x0f,0x14,0x60,0x1a,0x24,0x03,0x70,0x3c,0x7f,0x01,0x80,0x35,0xe4,0xff,0x80,0x31, +0x90,0x97,0x8a,0x74,0x01,0xf0,0x90,0x97,0x7f,0xf0,0xe4,0xff,0x80,0x23,0xab,0x10, +0xaa,0x11,0xa9,0x12,0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0x90,0x97,0x8a,0x70,0x05, +0x74,0x05,0xf0,0x80,0x02,0xef,0xf0,0x90,0x97,0x8a,0xe0,0x90,0x97,0x7f,0xf0,0xe4, +0xff,0x12,0x74,0x3d,0x22,0x90,0x00,0x25,0xe0,0x54,0xbf,0xf0,0x7f,0x10,0x7e,0x00, +0x12,0x3a,0xa8,0x90,0x00,0x20,0xe0,0x44,0x01,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, +0xa8,0x90,0x00,0x28,0xe0,0x44,0x01,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, +0x00,0xf0,0xe0,0x30,0xe1,0xf9,0x90,0x00,0x09,0xe0,0x44,0x08,0xf0,0x7f,0x10,0x7e, +0x00,0x12,0x3a,0xa8,0x90,0x00,0x08,0xe0,0x54,0xef,0xf0,0x7f,0x10,0x7e,0x00,0x12, +0x3a,0xa8,0x90,0x00,0x2b,0xe0,0x54,0xfe,0xf0,0x7f,0xe8,0x7e,0x03,0x02,0x3a,0xa8, +0x90,0x00,0x45,0xe4,0xf0,0x90,0x04,0xfd,0xf0,0xa3,0xf0,0x90,0x97,0x6d,0xf0,0x90, +0x97,0x73,0xf0,0x90,0x97,0x76,0xf0,0x90,0x97,0x74,0xf0,0x90,0x97,0x77,0xf0,0x90, +0x97,0x75,0xf0,0x90,0x97,0x78,0xf0,0x90,0x97,0x5f,0x04,0xf0,0xe4,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0x90,0x97,0x64,0xf0,0x90,0x97,0x69,0xf0,0x90,0x97,0x6b,0xf0,0x90, +0x97,0x7d,0xf0,0x90,0x97,0x6e,0xf0,0x90,0x97,0x6a,0xf0,0x90,0x97,0x63,0xf0,0x90, +0x00,0x51,0xe0,0x44,0xc0,0xf0,0x22,0x8b,0x21,0x8a,0x22,0x89,0x23,0x90,0x97,0x98, +0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xa3,0xe5,0x24,0xf0,0xa3,0xe5,0x25,0xf0, +0xa3,0xe5,0x26,0xf0,0xaf,0x27,0x15,0x27,0xef,0x60,0x2a,0x90,0x97,0x9b,0xe0,0xfb, +0xa3,0xe4,0x75,0xf0,0x01,0x12,0x65,0xdf,0xa9,0xf0,0xfa,0x12,0x1c,0xd6,0xff,0x90, +0x97,0x98,0xe0,0xfb,0xa3,0xe4,0x75,0xf0,0x01,0x12,0x65,0xdf,0xa9,0xf0,0xfa,0xef, +0x12,0x65,0x95,0x80,0xcf,0xab,0x21,0xaa,0x22,0xa9,0x23,0x22,0x90,0x05,0x60,0xe0, +0x90,0x97,0x79,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x7a,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x7b,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x7c,0xf0,0xc3,0x74,0xff,0x9f, +0xfe,0x90,0x97,0x7a,0xe0,0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff, +0x0f,0xe4,0xf0,0xa3,0xe0,0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x7c,0x80,0x03, +0x90,0x97,0x7b,0xe0,0x04,0xf0,0x22,0x90,0x97,0x7a,0xe0,0x2f,0xf0,0x22,0xe4,0xf5, +0x64,0x90,0x97,0x8f,0xf0,0xf5,0x65,0x90,0x97,0x8b,0x74,0x0c,0xf0,0x90,0x97,0x88, +0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97,0x87,0xf0,0x90,0x97,0x86,0xf0,0x90,0x97, +0x8a,0x04,0xf0,0x90,0x97,0x7f,0xf0,0xe4,0x90,0x97,0x8e,0xf0,0x90,0x97,0x89,0xf0, +0x90,0x97,0x81,0xf0,0x90,0x97,0x85,0x74,0x07,0xf0,0xe4,0x90,0x97,0x80,0xf0,0x90, +0x97,0x83,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8c,0xf0,0x22,0xe4,0x90,0x97, +0xad,0xf0,0xa3,0xf0,0x90,0x01,0xc4,0x74,0x1d,0xf0,0x74,0x7a,0xa3,0xf0,0x90,0x05, +0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03, +0x7f,0x01,0x22,0xd3,0x90,0x97,0xae,0xe0,0x94,0xe8,0x90,0x97,0xad,0xe0,0x94,0x03, +0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xae,0xe0, +0x04,0xf0,0x70,0xca,0x90,0x97,0xad,0xe0,0x04,0xf0,0x80,0xc2,0xe4,0x90,0x97,0x95, +0xf0,0xa2,0xaf,0x33,0x90,0x97,0x3b,0xf0,0x90,0x00,0x80,0xe0,0x20,0xe1,0x1a,0x12, +0x3a,0xbe,0x12,0x3a,0xbe,0x90,0x97,0x3a,0xe0,0x64,0x01,0xf0,0xe0,0x24,0x6c,0x90, +0x01,0xc4,0xf0,0x74,0x7a,0xa3,0xf0,0x80,0xdf,0x90,0x06,0x30,0x74,0x01,0xf0,0xc2, +0xaf,0x90,0x00,0x80,0xe0,0x44,0x80,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, +0x97,0x3b,0xe0,0x24,0xff,0x92,0xaf,0x22,0x90,0x01,0xc4,0x74,0xb8,0xf0,0x74,0x7a, +0xa3,0xf0,0xe5,0x55,0x70,0x37,0x90,0x97,0x8b,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x50, +0x2c,0x90,0x02,0x87,0xe0,0x70,0x26,0x90,0x97,0x96,0xe0,0xb4,0x02,0x10,0x90,0x97, +0x90,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x08,0x80,0x0f,0x90,0x01, +0xaf,0xe0,0x70,0x09,0x90,0x97,0x8c,0xe0,0x60,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22, +0x90,0x97,0x8e,0xe0,0x60,0x12,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x03, +0x70,0x33,0x90,0x97,0x89,0xf0,0x80,0x23,0x90,0x97,0x80,0xe0,0x04,0xf0,0x90,0x97, +0x8f,0xe0,0x54,0xef,0xf0,0x90,0x97,0x80,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x64, +0xb4,0x01,0x12,0xa3,0xe0,0x70,0x0e,0xe0,0x04,0xf0,0x22,0x90,0x97,0x8b,0xe0,0xff, +0x7d,0x01,0x12,0x6e,0xda,0x22,0xe4,0x90,0x97,0x3a,0xf0,0xef,0x90,0x00,0x31,0xf0, +0xee,0x54,0x03,0xff,0xa3,0xe0,0x54,0xfc,0x4f,0xf0,0xa3,0xe0,0x54,0x7f,0xf0,0x90, +0x00,0x30,0xe0,0x20,0xe7,0x0e,0x90,0x97,0x3a,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0, +0x04,0xf0,0x80,0xeb,0x90,0x97,0x3a,0xe0,0xc3,0x94,0x64,0x50,0x0a,0x90,0x00,0x30, +0xe0,0x12,0x65,0x95,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x01,0xc4,0x74,0x8a,0xf0, +0x74,0x7b,0xa3,0xf0,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x70,0x2b,0x90,0x97, +0x89,0xe0,0x64,0x01,0x60,0x23,0x90,0x97,0x8b,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x50, +0x18,0x90,0x97,0x8f,0xe0,0x20,0xe4,0x11,0x90,0x97,0x87,0xe0,0x64,0x01,0x60,0x09, +0x90,0x97,0x81,0xe0,0x70,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22,0x8f,0x66,0x90,0x01, +0xc4,0x74,0xcc,0xf0,0x74,0x7b,0xa3,0xf0,0x90,0x97,0x94,0xe0,0xff,0x7d,0x01,0x12, +0x71,0xc9,0xe5,0x66,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x01,0xf0,0x22,0x12,0x1c,0xd6,0xff,0xc3, +0x94,0x20,0x50,0x15,0x90,0x00,0x02,0x12,0x1c,0xef,0xfe,0x74,0x23,0x2f,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x80,0x0e,0xef,0xb4,0x20,0x0a,0x90,0x00,0x02, +0x12,0x1c,0xef,0x90,0x93,0x61,0xf0,0x74,0x23,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xe0,0x90,0x04,0xb2,0xf0,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22, +0x74,0xff,0xf0,0x12,0x7a,0x1d,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d, +0x02,0x7f,0x03,0x12,0x3a,0x2f,0xe5,0x65,0x60,0x05,0x7f,0x01,0x12,0x7e,0x99,0x12, +0x6c,0x30,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90,0x00, +0x02,0x12,0x1c,0xef,0x90,0x97,0x6d,0xf0,0xe0,0x90,0x04,0x9b,0xf0,0x90,0x97,0x6d, +0xe0,0x60,0x04,0xe0,0xb4,0xff,0x1c,0xa2,0xaf,0xe4,0x33,0xf5,0x10,0xc2,0xaf,0x90, +0x00,0x47,0xe0,0x54,0xfb,0xf0,0x7d,0x40,0x7f,0x01,0x12,0x39,0xf8,0xe5,0x10,0x24, +0xff,0x92,0xaf,0x22,0x90,0x97,0x4a,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x5e,0x01,0x8e, +0x5f,0xf5,0x60,0x7f,0x0b,0x12,0x75,0xcf,0x12,0x7e,0x61,0xe4,0xff,0x12,0x7f,0x1b, +0x90,0x97,0x4a,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x48,0xe4,0xf5,0x49,0x7d, +0x01,0x7f,0x60,0x7e,0x01,0x02,0x38,0xec,0x7d,0x02,0x7f,0x03,0x12,0x39,0xbe,0xe5, +0x65,0x60,0x23,0x90,0x97,0x8d,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0f,0x90, +0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x6e, +0xda,0xe4,0xff,0x12,0x7e,0x99,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x1c,0xd6,0xfe, +0xaf,0x05,0xed,0x2e,0x90,0x97,0x92,0xf0,0x90,0x00,0x01,0x12,0x1c,0xef,0xff,0xed, +0x2f,0x90,0x97,0x93,0xf0,0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0xae,0x05,0xed,0x2f, +0x90,0x97,0x94,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b,0x7b,0x01, +0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x7b,0x46,0xbf,0x01,0x09,0x90,0x06, +0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x7f,0x00,0xe4,0x90,0x06,0x34, +0xf0,0x22,0x90,0x01,0xc4,0x74,0x72,0xf0,0x74,0x7d,0xa3,0xf0,0x90,0x04,0x1b,0xe0, +0x54,0x7f,0xff,0xbf,0x7f,0x14,0x90,0x97,0x87,0xe0,0x70,0x0e,0x90,0x97,0x8b,0xe0, +0x54,0x0f,0xd3,0x94,0x04,0x50,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x00,0x01, +0x12,0x1c,0xef,0x90,0x97,0x8d,0xf0,0x12,0x1c,0xd6,0x65,0x65,0x60,0x15,0xa2,0xaf, +0xe4,0x33,0x90,0x97,0x46,0xf0,0xc2,0xaf,0x12,0x78,0x17,0x90,0x97,0x46,0xe0,0x24, +0xff,0x92,0xaf,0x22,0x90,0x97,0x2e,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x90,0x97,0x33,0xe4,0xf0,0xa3,0x74,0x00,0xf0,0xa3,0x74,0x56,0xf0,0x7b, +0x01,0x7a,0x97,0x79,0x2e,0x02,0x70,0x66,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef, +0x60,0x0a,0xe5,0x64,0xb4,0x01,0x05,0xe4,0xff,0x12,0x7b,0xcc,0x90,0x97,0x88,0xe0, +0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x90,0x97,0xb2,0xef,0xf0,0x12,0x71,0x1c, +0x90,0x97,0xb2,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x88,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x64, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x7b,0xcc,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0, +0x44,0x04,0xf0,0x22,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0,0x12, +0x77,0xb5,0x12,0x78,0x75,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0, +0x22,0x7f,0x0b,0x12,0x72,0x6f,0xef,0x65,0x61,0x60,0x10,0xe5,0x61,0xb4,0x01,0x05, +0xe4,0xf5,0x61,0x80,0x03,0x75,0x61,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x01, +0xc4,0x74,0x7e,0xf0,0x74,0x7e,0xa3,0xf0,0x90,0x97,0x93,0xe0,0xff,0xe4,0xfd,0x12, +0x71,0xc9,0x90,0x04,0x1f,0x74,0x01,0xf0,0x22,0xef,0x60,0x0b,0x90,0x97,0x97,0xe0, +0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x97,0xe0,0xb4,0x01,0x05,0x7f,0x01, +0x12,0x4e,0x3b,0x22,0x90,0x00,0x49,0xe0,0x90,0x97,0xb4,0xf0,0xe0,0x54,0x0f,0xf0, +0xe0,0xff,0x44,0xf0,0x90,0x00,0x49,0xf0,0xef,0x44,0xb0,0xf0,0x22,0xe4,0x90,0x97, +0x8e,0xf0,0x90,0x97,0x80,0xf0,0x90,0x97,0x89,0xf0,0x90,0x97,0x8f,0xf0,0x22,0xe5, +0x5e,0xb4,0x01,0x0b,0x12,0x7e,0x61,0xbf,0x01,0x05,0x7f,0x01,0x12,0x7f,0x1b,0x22, +0x90,0x09,0x28,0xef,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22, +0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x41,0x97, +0xb1,0x00,0x41,0x97,0x7e,0x80,0x41,0x97,0xb3,0x00,0x00,0x90,0x01,0xca,0xe5,0x61, +0xf0,0xef,0x60,0x03,0x12,0x7e,0xb4,0x22,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0x90,0x97,0xa7,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22, +0x90,0x97,0xaa,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0x8f,0x82,0x8e,0x83, +0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x5e,0x7f,0x60,0x7e,0x01,0x02,0x7f,0x4c, +0x90,0x97,0x97,0xe0,0x90,0x97,0x2d,0xf0,0x22,0x8f,0x1b,0x8c,0x1c,0x8d,0x1d,0x22, +0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x12,0x1c,0xd6,0xf5,0x64,0x22,0x22,0x52,0x09, +}; + +u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040002, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x01000100, +0x82c,0x00390004, +0x830,0x27272727, +0x834,0x27272727, +0x838,0x27272727, +0x83c,0x27272727, +0x840,0x00010000, +0x844,0x00010000, +0x848,0x27272727, +0x84c,0x27272727, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x0c1b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x27272727, +0x86c,0x2b2b2b27, +0x870,0x07000700, +0x874,0x22184000, +0x878,0x08080808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xcc0000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121313, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05633, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x0186115b, +0xc78,0x0000001f, +0xc7c,0x00b99612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020403, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000010, +0xe68,0x001b25a4, +0xe6c,0x63db25a4, +0xe70,0x63db25a4, +0xe74,0x0c1b25a4, +0xe78,0x0c1b25a4, +0xe7c,0x0c1b25a4, +0xe80,0x0c1b25a4, +0xe84,0x63db25a4, +0xe88,0x0c1b25a4, +0xe8c,0x63db25a4, +0xed0,0x63db25a4, +0xed4,0x63db25a4, +0xed8,0x63db25a4, +0xedc,0x001b25a4, +0xee0,0x001b25a4, +0xeec,0x6fdb25a4, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000700, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength] = { +0x0, }; + +u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength] = { +0x0, }; + +u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength] = { +0x0, }; + +u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength] = { +0xe00,0xffffffff,0x07090c0c, +0xe04,0xffffffff,0x01020405, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0b0c0c0e, +0xe14,0xffffffff,0x01030506, +0xe18,0xffffffff,0x0b0c0d0e, +0xe1c,0xffffffff,0x01030509, +0x830,0xffffffff,0x07090c0c, +0x834,0xffffffff,0x01020405, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0b0c0d0e, +0x848,0xffffffff,0x01030509, +0x84c,0xffffffff,0x0b0c0d0e, +0x868,0xffffffff,0x01030509, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength] = { +0xe00,0xffffffff,0x0a0c0c0c, +0xe04,0xffffffff,0x02040608, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0a0c0d0e, +0xe14,0xffffffff,0x02040608, +0xe18,0xffffffff,0x0a0c0d0e, +0xe1c,0xffffffff,0x02040608, +0x830,0xffffffff,0x0a0c0c0c, +0x834,0xffffffff,0x02040608, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0a0c0d0e, +0x848,0xffffffff,0x02040608, +0x84c,0xffffffff,0x0a0c0d0e, +0x868,0xffffffff,0x02040608, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength] = { +0xc30,0x69e9ac4a, +0xc3c,0x0a979718, +}; + +u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength] = { +0x024,0x0011800f, +0x028,0x00ffdb83, +0x040,0x000c0004, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390204, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x20202000, +0x870,0x03000300, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00ffc3f1, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x15160000, +0xa24,0x070b0f12, +0xa28,0x00000104, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954342e, +0xc54,0x43bc0094, +0xc58,0x6954342f, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c46000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x24000090, +0xc84,0x20f60000, +0xc88,0x24000090, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x24242424, +0xe04,0x24242424, +0xe08,0x03902024, +0xe10,0x24242424, +0xe14,0x24242424, +0xe18,0x24242424, +0xe1c,0x24242424, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xee8,0x31555448, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000700, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040002, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x01000100, +0x82c,0x00390004, +0x830,0x27272727, +0x834,0x27272727, +0x838,0x27272727, +0x83c,0x27272727, +0x840,0x00010000, +0x844,0x00010000, +0x848,0x27272727, +0x84c,0x27272727, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x0c1b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x27272727, +0x86c,0x2b2b2b27, +0x870,0x07000700, +0x874,0x22184000, +0x878,0x08080808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xcc0000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121313, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05633, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020403, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000010, +0xe68,0x001b25a4, +0xe6c,0x63db25a4, +0xe70,0x63db25a4, +0xe74,0x0c1b25a4, +0xe78,0x0c1b25a4, +0xe7c,0x0c1b25a4, +0xe80,0x0c1b25a4, +0xe84,0x63db25a4, +0xe88,0x0c1b25a4, +0xe8c,0x63db25a4, +0xed0,0x63db25a4, +0xed4,0x63db25a4, +0xed8,0x63db25a4, +0xedc,0x001b25a4, +0xee0,0x001b25a4, +0xeec,0x6fdb25a4, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength] = { +0xe00,0xffffffff,0x06080808, +0xe04,0xffffffff,0x00040406, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x04060608, +0xe14,0xffffffff,0x00020204, +0xe18,0xffffffff,0x04060608, +0xe1c,0xffffffff,0x00020204, +0x830,0xffffffff,0x06080808, +0x834,0xffffffff,0x00040406, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x04060608, +0x848,0xffffffff,0x00020204, +0x84c,0xffffffff,0x04060608, +0x868,0xffffffff,0x00020204, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287af, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x00014297, +0x013,0x00010295, +0x013,0x0000c298, +0x013,0x0000819c, +0x013,0x000040a8, +0x013,0x0000001c, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +}; + +u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f405, +0x015,0x0004f405, +0x015,0x0008f405, +0x015,0x000cf405, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength] = { +0x0, }; + + +u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f200, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength] = { +0x0, }; + +u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb0, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e529, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00000255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x0000083c, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000977c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x000d8000, +0x012,0x00090000, +0x012,0x00051000, +0x012,0x00012000, +0x013,0x00028fb4, +0x013,0x00024fa8, +0x013,0x000207a4, +0x013,0x0001c798, +0x013,0x000183a4, +0x013,0x00014398, +0x013,0x000101a4, +0x013,0x0000c198, +0x013,0x000080a4, +0x013,0x00004098, +0x013,0x00000000, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f405, +0x015,0x0004f405, +0x015,0x0008f405, +0x015,0x000cf405, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength] = { +0x0, }; + +// MAC reg V13 - 2010-12-07 +u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength] = { +0x420,0x00000080, +0x423,0x00000000, +0x430,0x00000000, +0x431,0x00000000, +0x432,0x00000000, +0x433,0x00000001, +0x434,0x00000004, +0x435,0x00000005, +0x436,0x00000006, +0x437,0x00000007, +0x438,0x00000000, +0x439,0x00000000, +0x43a,0x00000000, +0x43b,0x00000001, +0x43c,0x00000004, +0x43d,0x00000005, +0x43e,0x00000006, +0x43f,0x00000007, +0x440,0x0000005d, +0x441,0x00000001, +0x442,0x00000000, +0x444,0x00000015, +0x445,0x000000f0, +0x446,0x0000000f, +0x447,0x00000000, +0x458,0x00000041, +0x459,0x000000a8, +0x45a,0x00000072, +0x45b,0x000000b9, +0x460,0x00000066, +0x461,0x00000066, +0x462,0x00000008, +0x463,0x00000003, +0x4c8,0x000000ff, +0x4c9,0x00000008, +0x4cc,0x000000ff, +0x4cd,0x000000ff, +0x4ce,0x00000001, +0x500,0x00000026, +0x501,0x000000a2, +0x502,0x0000002f, +0x503,0x00000000, +0x504,0x00000028, +0x505,0x000000a3, +0x506,0x0000005e, +0x507,0x00000000, +0x508,0x0000002b, +0x509,0x000000a4, +0x50a,0x0000005e, +0x50b,0x00000000, +0x50c,0x0000004f, +0x50d,0x000000a4, +0x50e,0x00000000, +0x50f,0x00000000, +0x512,0x0000001c, +0x514,0x0000000a, +0x515,0x00000010, +0x516,0x0000000a, +0x517,0x00000010, +0x51a,0x00000016, +0x524,0x0000000f, +0x525,0x0000004f, +0x546,0x00000040, +0x547,0x00000000, +0x550,0x00000010, +0x551,0x00000010, +0x559,0x00000002, +0x55a,0x00000002, +0x55d,0x000000ff, +0x605,0x00000030, +0x608,0x0000000e, +0x609,0x0000002a, +0x652,0x00000020, +0x63c,0x0000000a, +0x63d,0x0000000e, +0x63e,0x0000000a, +0x63f,0x0000000e, +0x66e,0x00000005, +0x700,0x00000021, +0x701,0x00000043, +0x702,0x00000065, +0x703,0x00000087, +0x708,0x00000021, +0x709,0x00000043, +0x70a,0x00000065, +0x70b,0x00000087, +}; + +u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength] = { +0x0, }; + +u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7b060001, +0xc78,0x7b070001, +0xc78,0x7b080001, +0xc78,0x7a090001, +0xc78,0x790a0001, +0xc78,0x780b0001, +0xc78,0x770c0001, +0xc78,0x760d0001, +0xc78,0x750e0001, +0xc78,0x740f0001, +0xc78,0x73100001, +0xc78,0x72110001, +0xc78,0x71120001, +0xc78,0x70130001, +0xc78,0x6f140001, +0xc78,0x6e150001, +0xc78,0x6d160001, +0xc78,0x6c170001, +0xc78,0x6b180001, +0xc78,0x6a190001, +0xc78,0x691a0001, +0xc78,0x681b0001, +0xc78,0x671c0001, +0xc78,0x661d0001, +0xc78,0x651e0001, +0xc78,0x641f0001, +0xc78,0x63200001, +0xc78,0x62210001, +0xc78,0x61220001, +0xc78,0x60230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7b460001, +0xc78,0x7b470001, +0xc78,0x7b480001, +0xc78,0x7a490001, +0xc78,0x794a0001, +0xc78,0x784b0001, +0xc78,0x774c0001, +0xc78,0x764d0001, +0xc78,0x754e0001, +0xc78,0x744f0001, +0xc78,0x73500001, +0xc78,0x72510001, +0xc78,0x71520001, +0xc78,0x70530001, +0xc78,0x6f540001, +0xc78,0x6e550001, +0xc78,0x6d560001, +0xc78,0x6c570001, +0xc78,0x6b580001, +0xc78,0x6a590001, +0xc78,0x695a0001, +0xc78,0x685b0001, +0xc78,0x675c0001, +0xc78,0x665d0001, +0xc78,0x655e0001, +0xc78,0x645f0001, +0xc78,0x63600001, +0xc78,0x62610001, +0xc78,0x61620001, +0xc78,0x60630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c new file mode 100755 index 000000000000..7102231b99ff --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c @@ -0,0 +1,2659 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + +#include "drv_types.h" +#include "rtl8192c_hal.h" + +//================================================================================ +// Constant. +//================================================================================ + +// +// Default LED behavior. +// +#define LED_BLINK_NORMAL_INTERVAL 100 +#define LED_BLINK_SLOWLY_INTERVAL 200 +#define LED_BLINK_LONG_INTERVAL 400 + +#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000 +#define LED_BLINK_LINK_INTERVAL_ALPHA 500 //500 +#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 //150 +#define LED_BLINK_FASTER_INTERVAL_ALPHA 50 +#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000 + +//================================================================================ +// LED object. +//================================================================================ + + +//================================================================================ +// Prototype of protected function. +//================================================================================ + + +static void +BlinkTimerCallback( + unsigned long data + ); + +static void +BlinkWorkItemCallback( + struct work_struct *work + ); + +//================================================================================ +// LED_819xUsb routines. +//================================================================================ + +// +// Description: +// Initialize an LED_871x object. +// +static void +InitLed871x( + _adapter *padapter, + PLED_871x pLed, + LED_PIN_871x LedPin + ) +{ + pLed->padapter = padapter; + + pLed->LedPin = LedPin; + + pLed->CurrLedState = LED_OFF; + pLed->bLedOn = _FALSE; + + pLed->bLedBlinkInProgress = _FALSE; + pLed->BlinkTimes = 0; + pLed->BlinkingLedState = LED_UNKNOWN; + + _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); + + _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); +} + + +// +// Description: +// DeInitialize an LED_871x object. +// +static void +DeInitLed871x( + PLED_871x pLed + ) +{ + _cancel_timer_ex(&(pLed->BlinkTimer)); + + // We should reset bLedBlinkInProgress if we cancel the LedControlTimer, 2005.03.10, by rcnjko. + pLed->bLedBlinkInProgress = _FALSE; +} + + +// +// Description: +// Turn on LED according to LedPin specified. +// +static void +SwLedOn( + _adapter *padapter, + PLED_871x pLed +) +{ + u8 LedCfg; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + if( (BOARD_MINICARD == pHalData->BoardType )|| + (BOARD_USB_SOLO == pHalData->BoardType)|| + (BOARD_USB_COMBO == pHalData->BoardType)) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2); + switch(pLed->LedPin) + { + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xf0)|BIT5|BIT6); // SW control led0 on. + break; + + case LED_PIN_LED1: + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0x0f)|BIT5); // SW control led1 on. + break; + + default: + break; + + } + } + else + { + switch(pLed->LedPin) + { + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + if(pHalData->AntDivCfg) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2); + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xe0)|BIT7|BIT6|BIT5); // SW control led0 on. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2))); + } + else +#endif + { + LedCfg = rtw_read8(padapter, REG_LEDCFG0); + rtw_write8(padapter,REG_LEDCFG0, LedCfg&0x70); // SW control led0 on. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + } + break; + + case LED_PIN_LED1: + LedCfg = rtw_read8(padapter,(REG_LEDCFG1)); + rtw_write8(padapter,(REG_LEDCFG1), LedCfg&0x70); // SW control led1 on. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + + break; + + default: + break; + } + } + pLed->bLedOn = _TRUE; + +} + + +// +// Description: +// Turn off LED according to LedPin specified. +// +static void +SwLedOff( + _adapter *padapter, + PLED_871x pLed +) +{ + u8 LedCfg; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if((padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + if( (BOARD_MINICARD == pHalData->BoardType )|| + (BOARD_USB_SOLO == pHalData->BoardType)|| + (BOARD_USB_COMBO == pHalData->BoardType)) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2);//0x4E + + switch(pLed->LedPin) + { + + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: + if(BOARD_USB_COMBO == pHalData->BoardType) + { + LedCfg &= 0x90; // Set to software control. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3)); + LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG); + LedCfg &= 0xFE; + rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg); + } + else + { + LedCfg &= 0xf0; // Set to software control. + if(pHalData->bLedOpenDrain == _TRUE) // Open-drain arrangement for controlling the LED + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT1|BIT5|BIT6)); + else + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT5|BIT6)); + } + break; + + case LED_PIN_LED1: + LedCfg &= 0x0f; // Set to software control. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3)); + break; + + default: + break; + } + } + else + { + switch(pLed->LedPin) + { + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + if(pHalData->AntDivCfg) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2); + LedCfg &= 0xe0; // Set to software control. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT7|BIT6|BIT5)); + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2))); + } + else +#endif + { + LedCfg = rtw_read8(padapter, REG_LEDCFG0); + LedCfg &= 0x70; // Set to software control. + rtw_write8(padapter, REG_LEDCFG0, (LedCfg|BIT3)); + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + } + break; + + case LED_PIN_LED1: + LedCfg = rtw_read8(padapter, (REG_LEDCFG1)); + LedCfg &= 0x70; // Set to software control. + rtw_write8(padapter, (REG_LEDCFG1), (LedCfg|BIT3)); + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + break; + + default: + break; + } + } + + pLed->bLedOn = _FALSE; + +} + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ + + +// +// Description: +// Implementation of LED blinking behavior. +// It toggle off LED and schedule corresponding timer if necessary. +// +static void +SwLedBlink( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + // Determine if we shall change LED state again. + pLed->BlinkTimes--; + switch(pLed->CurrLedState) + { + + case LED_BLINK_NORMAL: + if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_StartToBlink: + if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) + { + bStopBlinking = _TRUE; + } + if( check_fwstate(pmlmepriv, _FW_LINKED) && + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) ) + { + bStopBlinking = _TRUE; + } + else if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_WPS: + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + break; + + + default: + bStopBlinking = _TRUE; + break; + + } + + if(bStopBlinking) + { + //if( padapter->pwrctrlpriv.cpwm >= PS_STATE_S2) + if(0) + { + SwLedOff(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE)) + { + SwLedOn(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && pLed->bLedOn == _TRUE) + { + SwLedOff(padapter, pLed); + } + + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + // Assign LED state to toggle. + if( pLed->BlinkingLedState == LED_ON ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + + // Schedule a timer to toggle LED state. + switch( pLed->CurrLedState ) + { + case LED_BLINK_NORMAL: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_SLOWLY: + case LED_BLINK_StartToBlink: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + + case LED_BLINK_WPS: + { + if( pLed->BlinkingLedState == LED_ON ) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + else + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + break; + + default: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + } + } +} + + +static void +SwLedBlink1( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_871x pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + + if(pHalData->EEPROMCustomerID == RT_CID_DEFAULT) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + if(!pLed1->bSWLedCtrl) + { + SwLedOn(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(!pLed1->bLedOn) + SwLedOn(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n")); + } + else + { + if(!pLed1->bSWLedCtrl) + { + SwLedOff(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(pLed1->bLedOn) + SwLedOff(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n")); + } + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_NORMAL: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + break; + + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == LED_ON) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + default: + break; + } + +} + +static void +SwLedBlink2( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + +} + +static void +SwLedBlink3( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + if(pLed->CurrLedState != LED_BLINK_WPS_STOP) + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == LED_ON) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + +} + + +static void +SwLedBlink4( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_871x pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) + { + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + SwLedOff(padapter, pLed1); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_StartToBlink: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _FALSE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_WPS_STOP: //WPS authentication fail + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap + pLed->BlinkTimes--; + if(pLed->BlinkTimes == 0) + { + if(pLed->bLedOn) + { + pLed->BlinkTimes = 1; + } + else + { + bStopBlinking = _TRUE; + } + } + + if(bStopBlinking) + { + pLed->BlinkTimes = 10; + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +static void +SwLedBlink5( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +static void +SwLedBlink6( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n")); +} + + +// +// Description: +// Callback function of LED BlinkTimer, +// it just schedules to corresponding BlinkWorkItem. +// +static void +BlinkTimerCallback( + unsigned long data + ) +{ + PLED_871x pLed = (PLED_871x)data; + _adapter *padapter = pLed->padapter; + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + _set_workitem(&(pLed->BlinkWorkItem)); +} + + +// +// Description: +// Callback function of LED BlinkWorkItem. +// We dispatch acture LED blink action according to LedStrategy. +// +static void BlinkWorkItemCallback(struct work_struct *work) +{ + PLED_871x pLed = container_of(work, LED_871x, BlinkWorkItem); + struct led_priv *ledpriv = &(pLed->padapter->ledpriv); + _adapter *padapter = pLed->padapter; + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + SwLedBlink(pLed); + break; + + case SW_LED_MODE1: + SwLedBlink1(pLed); + break; + + case SW_LED_MODE2: + SwLedBlink2(pLed); + break; + + case SW_LED_MODE3: + SwLedBlink3(pLed); + break; + + case SW_LED_MODE4: + SwLedBlink4(pLed); + break; + + case SW_LED_MODE5: + SwLedBlink5(pLed); + break; + + case SW_LED_MODE6: + SwLedBlink6(pLed); + break; + + default: + //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy)); + //SwLedBlink(pLed); + break; + } +} + + + +//================================================================================ +// Default LED behavior. +//================================================================================ + +// +// Description: +// Implement each led action for SW_LED_MODE0. +// This is default strategy. +// +static void +SwLedControlMode0( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_871x pLed = &(ledpriv->SwLed1); + + // Decide led state + switch(LedAction) + { + case LED_CTL_TX: + case LED_CTL_RX: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_NORMAL; + pLed->BlinkTimes = 2; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_CTL_START_TO_LINK: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_StartToBlink; + pLed->BlinkTimes = 24; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->CurrLedState = LED_BLINK_StartToBlink; + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = LED_ON; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + SwLedOn(padapter, pLed); + } + break; + + case LED_CTL_NO_LINK: + pLed->CurrLedState = LED_OFF; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + SwLedOff(padapter, pLed); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + if(pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + SwLedOff(padapter, pLed); + break; + + case LED_CTL_START_WPS: + if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == LED_ON) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_WPS; + pLed->BlinkTimes = 20; + + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedBlinkInProgress) + { + pLed->CurrLedState = LED_OFF; + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); + +} + + //ALPHA, added by chiyoko, 20090106 +static void +SwLedControlMode1( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_871x pLed = &(ledpriv->SwLed0); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + if( pLed->bLedLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + + case LED_CTL_STOP_WPS: + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //Arcadyan/Sitecom , added by chiyoko, 20090216 +static void +SwLedControlMode2( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS: + pLed->bLedWPSBlinkInProgress = _FALSE; + if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + pLed->bLedWPSBlinkInProgress = _FALSE; + if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + //COREGA, added by chiyoko, 20090316 + static void + SwLedControlMode3( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + if(IS_LED_WPS_BLINKING(pLed)) + return; + + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + + //Edimax-Belkin, added by chiyoko, 20090413 +static void +SwLedControlMode4( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + PLED_871x pLed1 = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_START_TO_LINK: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if( pLed->bLedStartToLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedNoLinkBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + + pLed->bLedStartToLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_StartToBlink; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + //LED1 settings + if(LedAction == LED_CTL_LINK) + { + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + } + + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: //WPS connect success + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + break; + + case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = LED_OFF; + else + pLed1->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; + pLed1->BlinkTimes = 10; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = LED_OFF; + else + pLed1->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedStartToLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + } + + if( pLed1->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedWPSBlinkInProgress = _FALSE; + } + + pLed1->BlinkingLedState = LED_UNKNOWN; + SwLedOff(padapter, pLed); + SwLedOff(padapter, pLed1); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + + + //Sercomm-Belkin, added by chiyoko, 20090415 +static void +SwLedControlMode5( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_NO_LINK: + case LED_CTL_LINK: //solid blue + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_SCAN_BLINK) + { + return; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //WNC-Corega, added by chiyoko, 20090902 +static void +SwLedControlMode6( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed0 = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + _cancel_timer_ex(&(pLed0->BlinkTimer)); + pLed0->CurrLedState = LED_ON; + pLed0->BlinkingLedState = LED_ON; + _set_timer(&(pLed0->BlinkTimer), 0); + break; + + case LED_CTL_POWER_OFF: + SwLedOff(padapter, pLed0); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed->CurrLedState)); +} + + +// +// Description: +// Dispatch LED action according to pHalData->LedStrategy. +// +static void +LedControl871x( + _adapter *padapter, + LED_CTL_MODE LedAction + ) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) + ||(padapter->hw_init_completed == _FALSE) ) + { + return; + } + + + if( ledpriv->bRegUseLed == _FALSE) + return; + + //if (!priv->up) + // return; + + //if(priv->bInHctTest) + // return; + + if( (padapter->pwrctrlpriv.rf_pwrstate != rf_on && + padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && + (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || + LedAction == LED_CTL_SITE_SURVEY || + LedAction == LED_CTL_LINK || + LedAction == LED_CTL_NO_LINK || + LedAction == LED_CTL_POWER_ON) ) + { + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + //SwLedControlMode0(padapter, LedAction); + break; + + case SW_LED_MODE1: + SwLedControlMode1(padapter, LedAction); + break; + case SW_LED_MODE2: + SwLedControlMode2(padapter, LedAction); + break; + + case SW_LED_MODE3: + SwLedControlMode3(padapter, LedAction); + break; + + case SW_LED_MODE4: + SwLedControlMode4(padapter, LedAction); + break; + + case SW_LED_MODE5: + SwLedControlMode5(padapter, LedAction); + break; + + case SW_LED_MODE6: + SwLedControlMode6(padapter, LedAction); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction)); +} + +// +// Description: +// Initialize all LED_871x objects. +// +void +rtl8192cu_InitSwLeds( + _adapter *padapter + ) +{ + struct led_priv *pledpriv = &(padapter->ledpriv); + + pledpriv->LedControlHandler = LedControl871x; + + InitLed871x(padapter, &(pledpriv->SwLed0), LED_PIN_LED0); + + InitLed871x(padapter,&(pledpriv->SwLed1), LED_PIN_LED1); +} + + +// +// Description: +// DeInitialize all LED_819xUsb objects. +// +void +rtl8192cu_DeInitSwLeds( + _adapter *padapter + ) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + + DeInitLed871x( &(ledpriv->SwLed0) ); + DeInitLed871x( &(ledpriv->SwLed1) ); +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c new file mode 100755 index 000000000000..ee0713dad913 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c @@ -0,0 +1,380 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192CU_RECV_C_ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include +#include + +#include + + +void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf) +{ + + precvbuf->transfer_len = 0; + + precvbuf->len = 0; + + precvbuf->ref_cnt = 0; + + if(precvbuf->pbuf) + { + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf; + precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ; + } + +} + +int rtl8192cu_init_recv_priv(_adapter *padapter) +{ + struct recv_priv *precvpriv = &padapter->recvpriv; + int i, res = _SUCCESS; + struct recv_buf *precvbuf; + +#ifdef CONFIG_RECV_THREAD_MODE + _rtw_init_sema(&precvpriv->recv_sema, 0);//will be removed + _rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);//will be removed +#endif + +#ifdef PLATFORM_LINUX + tasklet_init(&precvpriv->recv_tasklet, + (void(*)(unsigned long))rtl8192cu_recv_tasklet, + (unsigned long)padapter); +#endif + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +#ifdef PLATFORM_LINUX + precvpriv->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); + if(precvpriv->int_in_urb == NULL){ + DBG_8192C("alloc_urb for interrupt in endpoint fail !!!!\n"); + } +#endif + precvpriv->int_in_buf = rtw_zmalloc(sizeof(INTERRUPT_MSG_FORMAT_EX)); + if(precvpriv->int_in_buf == NULL){ + DBG_8192C("alloc_mem for interrupt in endpoint fail !!!!\n"); + } +#endif + + //init recv_buf + _rtw_init_queue(&precvpriv->free_recv_buf_queue); + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + _rtw_init_queue(&precvpriv->recv_buf_pending_queue); +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX + + precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4); + if(precvpriv->pallocated_recv_buf==NULL){ + res= _FAIL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("alloc recv_buf fail!\n")); + goto exit; + } + _rtw_memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF *sizeof(struct recv_buf) + 4); + + precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_recv_buf), 4); + //precvpriv->precv_buf = precvpriv->pallocated_recv_buf + 4 - + // ((uint) (precvpriv->pallocated_recv_buf) &(4-1)); + + + precvbuf = (struct recv_buf*)precvpriv->precv_buf; + + for(i=0; i < NR_RECVBUFF ; i++) + { + _rtw_init_listhead(&precvbuf->list); + + _rtw_spinlock_init(&precvbuf->recvbuf_lock); + + precvbuf->alloc_sz = MAX_RECVBUF_SZ; + + res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf); + if(res==_FAIL) + break; + + precvbuf->ref_cnt = 0; + precvbuf->adapter =padapter; + + + //rtw_list_insert_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue)); + + precvbuf++; + + } + + precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF; + +#ifdef PLATFORM_LINUX + + skb_queue_head_init(&precvpriv->rx_skb_queue); + +#ifdef CONFIG_PREALLOC_RECV_SKB + { + int i; + SIZE_PTR tmpaddr=0; + SIZE_PTR alignment=0; + struct sk_buff *pskb=NULL; + + skb_queue_head_init(&precvpriv->free_recv_skb_queue); + + for(i=0; ipnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); + #endif + + if(pskb) + { + pskb->dev = padapter->pnetdev; + + tmpaddr = (SIZE_PTR)pskb->data; + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); + skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); + + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); + } + + pskb=NULL; + + } + } +#endif + +#endif + +exit: + + return res; + +} + +void rtl8192cu_free_recv_priv (_adapter *padapter) +{ + int i; + struct recv_buf *precvbuf; + struct recv_priv *precvpriv = &padapter->recvpriv; + + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + + for(i=0; i < NR_RECVBUFF ; i++) + { + rtw_os_recvbuf_resource_free(padapter, precvbuf); + precvbuf++; + } + + if(precvpriv->pallocated_recv_buf) + rtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4); + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +#ifdef PLATFORM_LINUX + if(precvpriv->int_in_urb) + { + usb_free_urb(precvpriv->int_in_urb); + } +#endif + if(precvpriv->int_in_buf) + rtw_mfree(precvpriv->int_in_buf, sizeof(INTERRUPT_MSG_FORMAT_EX)); +#endif + +#ifdef PLATFORM_LINUX + + if (skb_queue_len(&precvpriv->rx_skb_queue)) { + DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n"); + } + + skb_queue_purge(&precvpriv->rx_skb_queue); + +#ifdef CONFIG_PREALLOC_RECV_SKB + + if (skb_queue_len(&precvpriv->free_recv_skb_queue)) { + //DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); + } + + skb_queue_purge(&precvpriv->free_recv_skb_queue); + +#endif + +#endif + +} + +void rtl8192cu_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat) +{ + u8 physt, qos, shift, icverr, htc, crcerr; + u16 drvinfo_sz=0; + struct phy_stat *pphy_info; + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; + _adapter *padapter = precvframe->u.hdr.adapter; + u8 bPacketMatchBSSID =_FALSE; + u8 bPacketToSelf = _FALSE; + u8 bPacketBeacon = _FALSE; + + + //Offset 0 + drvinfo_sz = (le32_to_cpu(prxstat->rxdw0)&0x000f0000)>>16; + drvinfo_sz = drvinfo_sz<<3; + + pattrib->bdecrypted = ((le32_to_cpu(prxstat->rxdw0) & BIT(27)) >> 27)? 0:1; + + physt = ((le32_to_cpu(prxstat->rxdw0) & BIT(26)) >> 26)? 1:0; + + shift = (le32_to_cpu(prxstat->rxdw0)&0x03000000)>>24; + + qos = ((le32_to_cpu(prxstat->rxdw0) & BIT(23)) >> 23)? 1:0; + + icverr = ((le32_to_cpu(prxstat->rxdw0) & BIT(15)) >> 15)? 1:0; + + pattrib->crc_err = crcerr = ((le32_to_cpu(prxstat->rxdw0) & BIT(14)) >> 14 )? 1:0; + + + //Offset 4 + + //Offset 8 + + //Offset 12 +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + if ( le32_to_cpu(prxstat->rxdw3) & BIT(13)) { + pattrib->tcpchk_valid = 1; // valid + if ( le32_to_cpu(prxstat->rxdw3) & BIT(11) ) { + pattrib->tcp_chkrpt = 1; // correct + //DBG_8192C("tcp csum ok\n"); + } else + pattrib->tcp_chkrpt = 0; // incorrect + + if ( le32_to_cpu(prxstat->rxdw3) & BIT(12) ) + pattrib->ip_chkrpt = 1; // correct + else + pattrib->ip_chkrpt = 0; // incorrect + + } else { + pattrib->tcpchk_valid = 0; // invalid + } + +#endif + + pattrib->mcs_rate=(u8)((le32_to_cpu(prxstat->rxdw3))&0x3f); + pattrib->rxht=(u8)((le32_to_cpu(prxstat->rxdw3) >>6)&0x1); + + htc = (u8)((le32_to_cpu(prxstat->rxdw3) >>10)&0x1); + + //Offset 16 + //Offset 20 + + +#if 0 //dump rxdesc for debug + DBG_8192C("drvinfo_sz=%d\n", drvinfo_sz); + DBG_8192C("physt=%d\n", physt); + DBG_8192C("shift=%d\n", shift); + DBG_8192C("qos=%d\n", qos); + DBG_8192C("icverr=%d\n", icverr); + DBG_8192C("htc=%d\n", htc); + DBG_8192C("bdecrypted=%d\n", pattrib->bdecrypted); + DBG_8192C("mcs_rate=%d\n", pattrib->mcs_rate); + DBG_8192C("rxht=%d\n", pattrib->rxht); +#endif + + //phy_info + if(drvinfo_sz && physt) + { + bPacketMatchBSSID = ((!IsFrameTypeCtrl(precvframe->u.hdr.rx_data)) && !icverr && !crcerr && + _rtw_memcmp(get_hdr_bssid(precvframe->u.hdr.rx_data), get_bssid(&padapter->mlmepriv), ETH_ALEN)); + + bPacketToSelf = bPacketMatchBSSID && (_rtw_memcmp(get_da(precvframe->u.hdr.rx_data), myid(&padapter->eeprompriv), ETH_ALEN)); + + bPacketBeacon = (GetFrameSubType(precvframe->u.hdr.rx_data) == WIFI_BEACON); + + + pphy_info = (struct phy_stat *)(prxstat+1); + + //DBG_8192C("pphy_info, of0=0x%08x\n", *pphy_info); + //DBG_8192C("pphy_info, of1=0x%08x\n", *(pphy_info+1)); + //DBG_8192C("pphy_info, of2=0x%08x\n", *(pphy_info+2)); + //DBG_8192C("pphy_info, of3=0x%08x\n", *(pphy_info+3)); + //DBG_8192C("pphy_info, of4=0x%08x\n", *(pphy_info+4)); + //DBG_8192C("pphy_info, of5=0x%08x\n", *(pphy_info+5)); + //DBG_8192C("pphy_info, of6=0x%08x\n", *(pphy_info+6)); + //DBG_8192C("pphy_info, of7=0x%08x\n", *(pphy_info+7)); + + rtl8192c_query_rx_phy_status(precvframe, pphy_info); + + precvframe->u.hdr.psta = NULL; + if(bPacketMatchBSSID && check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) + { + u8 *sa; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + sa = get_sa(precvframe->u.hdr.rx_data); + + psta = rtw_get_stainfo(pstapriv, sa); + if(psta) + { + precvframe->u.hdr.psta = psta; + rtl8192c_process_phy_info(padapter, precvframe); + } + } + else if( bPacketToSelf || (bPacketBeacon && bPacketMatchBSSID) ) + { + if(check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + u8 *sa; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + sa = get_sa(precvframe->u.hdr.rx_data); + + psta = rtw_get_stainfo(pstapriv, sa); + if(psta) + { + precvframe->u.hdr.psta = psta; + } + } + + rtl8192c_process_phy_info(padapter, precvframe); + } + +#if 0 //dump phy_status for debug + + DBG_8192C("signal_qual=%d\n", pattrib->signal_qual); + DBG_8192C("signal_strength=%d\n", pattrib->signal_strength); +#endif + + } + + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c new file mode 100755 index 000000000000..679fc9e6e826 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c @@ -0,0 +1,1338 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192C_XMIT_C_ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#error "Shall be Linux or Windows, but not both!\n" +#endif + + +s32 rtl8192cu_init_xmit_priv(_adapter *padapter) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + +#ifdef PLATFORM_LINUX + tasklet_init(&pxmitpriv->xmit_tasklet, + (void(*)(unsigned long))rtl8192cu_xmit_tasklet, + (unsigned long)padapter); +#endif + return _SUCCESS; +} + +void rtl8192cu_free_xmit_priv(_adapter *padapter) +{ +} + +u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe) +{ + u32 addr; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + switch(pattrib->qsel) + { + case 0: + case 3: + addr = BE_QUEUE_INX; + break; + case 1: + case 2: + addr = BK_QUEUE_INX; + break; + case 4: + case 5: + addr = VI_QUEUE_INX; + break; + case 6: + case 7: + addr = VO_QUEUE_INX; + break; + case 0x10: + addr = BCN_QUEUE_INX; + break; + case 0x11://BC/MC in PS (HIQ) + addr = HIGH_QUEUE_INX; + break; + case 0x12: + addr = MGT_QUEUE_INX; + break; + default: + addr = BE_QUEUE_INX; + break; + + } + + return addr; + +} + +static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib) +{ + u8 qsel; + + qsel = pattrib->priority; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel)); + pattrib->qsel = qsel; +} + +int urb_zero_packet_chk(_adapter *padapter, int sz) +{ + int blnSetTxDescOffset; + struct dvobj_priv *pdvobj = (struct dvobj_priv*)&padapter->dvobjpriv; + + if ( pdvobj->ishighspeed ) + { + if ( ( (sz + TXDESC_SIZE) % 512 ) == 0 ) { + blnSetTxDescOffset = 1; + } else { + blnSetTxDescOffset = 0; + } + } + else + { + if ( ( (sz + TXDESC_SIZE) % 64 ) == 0 ) { + blnSetTxDescOffset = 1; + } else { + blnSetTxDescOffset = 0; + } + } + + return blnSetTxDescOffset; + +} + +void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc) +{ + u16 *usPtr = (u16*)ptxdesc; + u32 count = 16; // (32 bytes / 2 bytes per XOR) => 16 times + u32 index; + u16 checksum = 0; + + //Clear first + ptxdesc->txdw7 &= cpu_to_le32(0xffff0000); + + for(index = 0 ; index < count ; index++){ + checksum = checksum ^ le16_to_cpu(*(usPtr + index)); + } + + ptxdesc->txdw7 |= cpu_to_le32(0x0000ffff&checksum); + +} + +void fill_txdesc_sectype(struct pkt_attrib *pattrib, struct tx_desc *ptxdesc) +{ + if ((pattrib->encrypt > 0) && !pattrib->bswenc) + { + switch (pattrib->encrypt) + { + //SEC_TYPE + case _WEP40_: + case _WEP104_: + ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000); + break; + case _TKIP_: + case _TKIP_WTMIC_: + //ptxdesc->txdw1 |= cpu_to_le32((0x02<<22)&0x00c00000); + ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000); + break; + case _AES_: + ptxdesc->txdw1 |= cpu_to_le32((0x03<<22)&0x00c00000); + break; + case _NO_PRIVACY_: + default: + break; + + } + + } + +} + +void fill_txdesc_vcs(struct pkt_attrib *pattrib, u32 *pdw) +{ + //DBG_8192C("cvs_mode=%d\n", pattrib->vcs_mode); + + switch(pattrib->vcs_mode) + { + case RTS_CTS: + *pdw |= cpu_to_le32(BIT(12)); + break; + case CTS_TO_SELF: + *pdw |= cpu_to_le32(BIT(11)); + break; + case NONE_VCS: + default: + break; + } + + if(pattrib->vcs_mode) + { + *pdw |= cpu_to_le32(BIT(13));//ENABLE HW RTS + } + +} + +void fill_txdesc_phy(struct pkt_attrib *pattrib, u32 *pdw) +{ + //DBG_8192C("bwmode=%d, ch_off=%d\n", pattrib->bwmode, pattrib->ch_offset); + + if(pattrib->ht_en) + { + *pdw |= (pattrib->bwmode&HT_CHANNEL_WIDTH_40)? cpu_to_le32(BIT(25)):0; + + if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) + *pdw |= cpu_to_le32((0x01<<20)&0x003f0000); + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) + *pdw |= cpu_to_le32((0x02<<20)&0x003f0000); + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) + *pdw |= 0; + else + *pdw |= cpu_to_le32((0x03<<20)&0x003f0000); + } +} + +#ifdef CONFIG_USB_TX_AGGREGATION +static void _update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, int sz) +{ + uint qsel; + _adapter *padapter = pxmitframe->padapter; + struct ht_priv *phtpriv = &padapter->mlmepriv.htpriv; + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + sint bmcst = IS_MCAST(pattrib->ra); + struct tx_desc *ptxdesc = (struct tx_desc*)pmem; + + + _rtw_memset(ptxdesc, 0, sizeof(struct tx_desc)); + + //4 offset 0 + ptxdesc->txdw0 |= cpu_to_le32(sz & 0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000);//32 bytes for TX Desc + + if (bmcst) ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, + ("update_txdesc: offset0=0x%08x\n", ptxdesc->txdw0)); + + //4 offset 4 + // pkt_offset, unit:8 bytes padding + if (pxmitframe->pkt_offset > 0) + ptxdesc->txdw1 |= cpu_to_le32((pxmitframe->pkt_offset << 26) & 0x7c000000); + +#ifdef CONFIG_USB_TX_AGGREGATION + if (pxmitframe->agg_num > 1) + ptxdesc->txdw5 |= cpu_to_le32((pxmitframe->agg_num << 24) & 0xff000000); +#endif + + if (pxmitframe->frame_tag == DATA_FRAMETAG) + { + //4 offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel & 0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); + + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid << 16) & 0x000f0000); + + fill_txdesc_sectype(pattrib, ptxdesc); + + if(pattrib->ampdu_en==_TRUE) + ptxdesc->txdw1 |= cpu_to_le32(BIT(5));//AGG EN + else + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + + + //4 offset 8 + + + //4 offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0xffff0000); + + + //4 offset 16 , offset 20 + if (pattrib->qos_en) + ptxdesc->txdw4 |= cpu_to_le32(BIT(6));//QoS + + if ((pattrib->ether_type != 0x888e) && + (pattrib->ether_type != 0x0806) && + (pattrib->dhcp_pkt != 1)) + { + //Non EAP & ARP & DHCP type data packet + + fill_txdesc_vcs(pattrib, &ptxdesc->txdw4); + fill_txdesc_phy(pattrib, &ptxdesc->txdw4); + + ptxdesc->txdw4 |= cpu_to_le32(0x00000008);//RTS Rate=24M + ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00); + //ptxdesc->txdw5 |= cpu_to_le32(0x0000000b);//DataRate - 54M + + //use REG_INIDATA_RATE_SEL value + ptxdesc->txdw5 |= cpu_to_le32(pdmpriv->INIDATA_RATE[pattrib->mac_id]); + + if (0)//for driver dbg + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + if (pattrib->ht_en) + ptxdesc->txdw5 |= cpu_to_le32(BIT(6));//SGI + + ptxdesc->txdw5 |= cpu_to_le32(0x00000013);//init rate - mcs7 + } + } + else + { + // EAP data packet and ARP packet. + // Use the 1M data rate to send the EAP/ARP packet. + // This will maybe make the handshake smooth. + + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + } + + + //4 offset 24 +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + if (pattrib->hw_tcp_csum == 1) { + // ptxdesc->txdw6 = 0; // clear TCP_CHECKSUM and IP_CHECKSUM. It's zero already!! + u8 ip_hdr_offset = 32 + pattrib->hdrlen + pattrib->iv_len + 8; + ptxdesc->txdw7 = (1 << 31) | (ip_hdr_offset << 16); + DBG_8192C("ptxdesc->txdw7 = %08x\n", ptxdesc->txdw7); + } +#endif + } + else if(pxmitframe->frame_tag == MGNT_FRAMETAG) + { + //DBG_8192C("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); + + //4 offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel&0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); + + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); + + //fill_txdesc_sectype(pattrib, ptxdesc); + + + //4 offset 8 + + + //4 offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + + //4 offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + + //4 offset 20 + } + else if(pxmitframe->frame_tag == TXAGG_FRAMETAG) + { + DBG_8192C("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); + } + else + { + DBG_8192C("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); + + //4 offset 4 + ptxdesc->txdw1 |= cpu_to_le32((4)&0x1f);//CAM_ID(MAC_ID) + + ptxdesc->txdw1 |= cpu_to_le32((6<< 16) & 0x000f0000);//raid + + + //4 offset 8 + + + //4 offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0xffff0000); + + + //4 offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + + //4 offset 20 + } + + // 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS. + // (1) The sequence number of each non-Qos frame / broadcast / multicast / + // mgnt frame should be controled by Hw because Fw will also send null data + // which we cannot control when Fw LPS enable. + // --> default enable non-Qos data sequense number. 2010.06.23. by tynli. + // (2) Enable HW SEQ control for beacon packet, because we use Hw beacon. + // (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets. + // 2010.06.23. Added by tynli. + if(!pattrib->qos_en) + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + } + + rtl8192cu_cal_txdesc_chksum(ptxdesc); +} +#endif + +static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz) +{ + int pull=0; + uint qsel; + _adapter *padapter = pxmitframe->padapter; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct tx_desc *ptxdesc = (struct tx_desc *)pmem; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + sint bmcst = IS_MCAST(pattrib->ra); +#ifdef CONFIG_P2P + struct wifidirect_info* pwdinfo = &padapter->wdinfo; +#endif //CONFIG_P2P + +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX + if(urb_zero_packet_chk(padapter, sz)==0) + { + ptxdesc = (struct tx_desc *)(pmem+PACKET_OFFSET_SZ); + pull = 1; + } +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + + _rtw_memset(ptxdesc, 0, sizeof(struct tx_desc)); + + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) + { + //DBG_8192C("pxmitframe->frame_tag == DATA_FRAMETAG\n"); + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel & 0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); + + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); + + fill_txdesc_sectype(pattrib, ptxdesc); + + + if(pattrib->ampdu_en==_TRUE) + ptxdesc->txdw1 |= cpu_to_le32(BIT(5));//AGG EN + else + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + + //offset 8 + + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + + //offset 16 , offset 20 + if (pattrib->qos_en) + ptxdesc->txdw4 |= cpu_to_le32(BIT(6));//QoS + + if ((pattrib->ether_type != 0x888e) && (pattrib->ether_type != 0x0806) && (pattrib->dhcp_pkt != 1)) + { + //Non EAP & ARP & DHCP type data packet + + fill_txdesc_vcs(pattrib, &ptxdesc->txdw4); + fill_txdesc_phy(pattrib, &ptxdesc->txdw4); + + ptxdesc->txdw4 |= cpu_to_le32(0x00000008);//RTS Rate=24M + ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00);// + //ptxdesc->txdw5 |= cpu_to_le32(0x0000000b);//DataRate - 54M + + //use REG_INIDATA_RATE_SEL value + ptxdesc->txdw5 |= cpu_to_le32(pdmpriv->INIDATA_RATE[pattrib->mac_id]); + + if(0)//for driver dbg + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + if(pattrib->ht_en) + ptxdesc->txdw5 |= cpu_to_le32(BIT(6));//SGI + + ptxdesc->txdw5 |= cpu_to_le32(0x00000013);//init rate - mcs7 + } + + } + else + { + // EAP data packet and ARP packet. + // Use the 1M data rate to send the EAP/ARP packet. + // This will maybe make the handshake smooth. + + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + +#ifdef CONFIG_P2P + // Added by Albert 2011/03/22 + // In the P2P mode, the driver should not support the b mode. + // So, the Tx packet shouldn't use the CCK rate + if ( pwdinfo->p2p_state != P2P_STATE_NONE ) + { + ptxdesc->txdw5 |= cpu_to_le32( 0x04 ); // Use the 6M data rate. + } +#endif //CONFIG_P2P + + } + + //offset 24 + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + if ( pattrib->hw_tcp_csum == 1 ) { + // ptxdesc->txdw6 = 0; // clear TCP_CHECKSUM and IP_CHECKSUM. It's zero already!! + u8 ip_hdr_offset = 32 + pattrib->hdrlen + pattrib->iv_len + 8; + ptxdesc->txdw7 = (1 << 31) | (ip_hdr_offset << 16); + DBG_8192C("ptxdesc->txdw7 = %08x\n", ptxdesc->txdw7); + } +#endif + } + else if((pxmitframe->frame_tag&0x0f)== MGNT_FRAMETAG) + { + //DBG_8192C("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel&0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel<txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); + + //fill_txdesc_sectype(pattrib, ptxdesc); + + //offset 8 + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + //offset 20 + ptxdesc->txdw5 |= cpu_to_le32(BIT(17));//retry limit enable + ptxdesc->txdw5 |= cpu_to_le32(0x00180000);//retry limit = 6 +#ifdef CONFIG_P2P + // Added by Albert 2011/03/17 + // In the P2P mode, the driver should not support the b mode. + // So, the Tx packet shouldn't use the CCK rate + if ( pwdinfo->p2p_state != P2P_STATE_NONE ) + { + ptxdesc->txdw5 |= cpu_to_le32( 0x04 ); // Use the 6M data rate. + } +#endif //CONFIG_P2P + + } + else if((pxmitframe->frame_tag&0x0f) == TXAGG_FRAMETAG) + { + DBG_8192C("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); + } +#ifdef CONFIG_MP_INCLUDED + else if((pxmitframe->frame_tag&0x0f) == MP_FRAMETAG) + { + fill_txdesc_for_mp(padapter, ptxdesc); + } +#endif + else + { + DBG_8192C("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32((4)&0x1f);//CAM_ID(MAC_ID) + + ptxdesc->txdw1 |= cpu_to_le32((6<< 16) & 0x000f0000);//raid + + //offset 8 + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + //offset 20 + } + + // 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS. + // (1) The sequence number of each non-Qos frame / broadcast / multicast / + // mgnt frame should be controled by Hw because Fw will also send null data + // which we cannot control when Fw LPS enable. + // --> default enable non-Qos data sequense number. 2010.06.23. by tynli. + // (2) Enable HW SEQ control for beacon packet, because we use Hw beacon. + // (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets. + // 2010.06.23. Added by tynli. + if(!pattrib->qos_en) + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + } + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32(sz&0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(BIT(24)); + } + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("offset0-txdesc=0x%x\n", ptxdesc->txdw0)); + + //offset 4 + if(!pull) ptxdesc->txdw1 |= cpu_to_le32((0x01<<26)&0xff000000);//pkt_offset, unit:8 bytes padding + + rtl8192cu_cal_txdesc_chksum(ptxdesc); + + return pull; + +} + +void rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + int t, sz, w_sz, pull=0; + u8 *mem_addr; + u32 ff_hwaddr; + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + if ((pxmitframe->frame_tag == DATA_FRAMETAG) && + (pxmitframe->attrib.ether_type != 0x0806) && + (pxmitframe->attrib.ether_type != 0x888e) && + (pxmitframe->attrib.dhcp_pkt != 1)) + { + if(padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE) + rtw_issue_addbareq_cmd(padapter, pxmitframe); + } + + mem_addr = pxmitframe->buf_addr; + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_dump_xframe()\n")); + + for (t = 0; t < pattrib->nr_frags; t++) + { + if (t != (pattrib->nr_frags - 1)) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("pattrib->nr_frags=%d\n", pattrib->nr_frags)); + + sz = pxmitpriv->frag_len; + sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len); + } + else //no frag + { + sz = pattrib->last_txcmdsz; + } + + pull = update_txdesc(pxmitframe, mem_addr, sz); + + if(pull) + { + mem_addr += PACKET_OFFSET_SZ; //pull txdesc head + + //pxmitbuf ->pbuf = mem_addr; + pxmitframe->buf_addr = mem_addr; + + w_sz = sz + TXDESC_SIZE; + } + else + { + w_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ; + } + + ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe); + + rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf); + + rtw_count_tx_stats(padapter, pxmitframe, sz); + + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_write_port, w_sz=%d\n", w_sz)); + //DBG_8192C("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority); + + mem_addr += w_sz; + + mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr))); + + } + + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + +} + + +#ifdef CONFIG_USB_TX_AGGREGATION +static u32 xmitframe_need_length(struct xmit_frame *pxmitframe) +{ + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + u32 len = 0; + + // no consider fragement + len = pattrib->hdrlen + pattrib->iv_len + + SNAP_SIZE + sizeof(u16) + + pattrib->pktlen + + ((pattrib->bswenc) ? pattrib->icv_len : 0); + + if(pattrib->encrypt ==_TKIP_) + len += 8; + + return len; +} + +#define IDEA_CONDITION 1 // check all packets before enqueue +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct xmit_frame *pxmitframe = NULL; + struct xmit_frame *pfirstframe = NULL; + + // aggregate variable +// struct hw_xmit *phwxmit; + struct sta_info *psta = NULL; + struct tx_servq *ptxservq = NULL; + + _irqL irqL; + _list *xmitframe_plist = NULL, *xmitframe_phead = NULL; + + u32 pbuf; // next pkt address + u32 pbuf_tail; // last pkt tail + u32 len; // packet length, except TXDESC_SIZE and PKT_OFFSET + + u32 bulkSize = pHalData->UsbBulkOutSize; + u8 descCount; + u32 bulkPtr; + + // dump frame variable + u32 ff_hwaddr; + +#ifndef IDEA_CONDITION + int res = _SUCCESS; +#endif + + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_info_, ("+xmitframe_complete\n")); + + + // check xmitbuffer is ok + if (pxmitbuf == NULL) { + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL) return _FALSE; + } + + + //3 1. pick up first frame + do { + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + pxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); + if (pxmitframe == NULL) { + // no more xmit frame, release xmit buffer + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + return _FALSE; + } + + +#ifndef IDEA_CONDITION + if (pxmitframe->frame_tag != DATA_FRAMETAG) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", + pxmitframe->frame_tag, DATA_FRAMETAG)); +// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } + + // TID 0~15 + if ((pxmitframe->attrib.priority < 0) || + (pxmitframe->attrib.priority > 15)) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: TID(%d) should be 0~15!\n", + pxmitframe->attrib.priority)); +// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + + pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf; + pxmitbuf->priv_data = pxmitframe; + + //pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1. + pxmitframe->pkt_offset = 1; // first frame of aggregation, reserve offset + +#ifdef IDEA_CONDITION + rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); +#else + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + if (res == _FALSE) { +// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + + // always return ndis_packet after rtw_xmitframe_coalesce + rtw_os_xmit_complete(padapter, pxmitframe); + + break; + } while (1); + + //3 2. aggregate same priority and same DA(AP or STA) frames + pfirstframe = pxmitframe; + len = xmitframe_need_length(pfirstframe) + TXDESC_OFFSET; + pbuf_tail = len; + pbuf = _RND8(pbuf_tail); + + // check pkt amount in one bluk + descCount = 0; + bulkPtr = bulkSize; + if (pbuf < bulkPtr) + descCount++; + else { + descCount = 0; + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; // round to next bulkSize + } + + // dequeue same priority packet from station tx queue + psta = pfirstframe->attrib.psta; + switch (pfirstframe->attrib.priority) { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); +// phwxmit = pxmitpriv->hwxmits + 3; + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); +// phwxmit = pxmitpriv->hwxmits + 1; + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); +// phwxmit = pxmitpriv->hwxmits; + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); +// phwxmit = pxmitpriv->hwxmits + 2; + break; + } + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + + xmitframe_phead = get_list_head(&ptxservq->sta_pending); + xmitframe_plist = get_next(xmitframe_phead); + while (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + xmitframe_plist = get_next(xmitframe_plist); + +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)==_TRUE) + { + //rtw_list_delete(&pxmitframe->list); + + ptxservq->qcnt--; + + continue; + } +#endif + + len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE; // no offset + if (pbuf + len > MAX_XMITBUF_SZ) break; + + rtw_list_delete(&pxmitframe->list); + ptxservq->qcnt--; + +#ifndef IDEA_CONDITION + // suppose only data frames would be in queue + if (pxmitframe->frame_tag != DATA_FRAMETAG) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", + pxmitframe->frame_tag, DATA_FRAMETAG)); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } + + // TID 0~15 + if ((pxmitframe->attrib.priority < 0) || + (pxmitframe->attrib.priority > 15)) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: TID(%d) should be 0~15!\n", + pxmitframe->attrib.priority)); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + +// pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf + pbuf; + + pxmitframe->agg_num = 0; // not first frame of aggregation + pxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset + +#ifdef IDEA_CONDITION + rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); +#else + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + if (res == _FALSE) { + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + + // always return ndis_packet after rtw_xmitframe_coalesce + rtw_os_xmit_complete(padapter, pxmitframe); + + // (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz + _update_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz); + + // don't need xmitframe any more + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + // handle pointer and stop condition + pbuf_tail = pbuf + len; + pbuf = _RND8(pbuf_tail); + + pfirstframe->agg_num++; + if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num) + break; + + if (pbuf < bulkPtr) { + descCount++; + if (descCount == pHalData->UsbTxAggDescNum) + break; + } else { + descCount = 0; + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; + } + } + if (_rtw_queue_empty(&ptxservq->sta_pending) == _TRUE) + rtw_list_delete(&ptxservq->tx_pending); + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + if ((pfirstframe->attrib.ether_type != 0x0806) && + (pfirstframe->attrib.ether_type != 0x888e) && + (pfirstframe->attrib.dhcp_pkt != 1)) + { + if(padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE) + rtw_issue_addbareq_cmd(padapter, pfirstframe); + } + +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX + //3 3. update first frame txdesc + if ((pbuf_tail % bulkSize) == 0) { + // remove pkt_offset + pbuf_tail -= PACKET_OFFSET_SZ; + pfirstframe->buf_addr += PACKET_OFFSET_SZ; + pfirstframe->pkt_offset = 0; + } +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + _update_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz); + + //3 4. write xmit buffer to USB FIFO + ff_hwaddr = rtw_get_ff_hwaddr(pfirstframe); + + // xmit address == ((xmit_frame*)pxmitbuf->priv_data)->buf_addr + rtw_write_port(padapter, ff_hwaddr, pbuf_tail, (u8*)pxmitbuf); + + + //3 5. update statisitc + pbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE); + if (pfirstframe->pkt_offset == 1) pbuf_tail -= PACKET_OFFSET_SZ; + + rtw_count_tx_stats(padapter, pfirstframe, pbuf_tail); + + rtw_free_xmitframe_ex(pxmitpriv, pfirstframe); + + return _TRUE; +} + +#else + +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + + struct hw_xmit *phwxmits; + sint hwentry; + struct xmit_frame *pxmitframe=NULL; + int res=_SUCCESS, xcnt = 0; + + phwxmits = pxmitpriv->hwxmits; + hwentry = pxmitpriv->hwxmit_entry; + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete()\n")); + + if(pxmitbuf==NULL) + { + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if(!pxmitbuf) + { + return _FALSE; + } + } + + + do + { + pxmitframe = rtw_dequeue_xframe(pxmitpriv, phwxmits, hwentry); + + if(pxmitframe) + { + pxmitframe->pxmitbuf = pxmitbuf; + + pxmitframe->buf_addr = pxmitbuf->pbuf; + + pxmitbuf->priv_data = pxmitframe; + + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) + { + if(pxmitframe->attrib.priority<=15)//TID0~15 + { + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + } + + rtw_os_xmit_complete(padapter, pxmitframe);//always return ndis_packet after rtw_xmitframe_coalesce + } + + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete(): rtw_dump_xframe\n")); + + + if(res == _SUCCESS) + { + rtw_dump_xframe(padapter, pxmitframe); + } + else + { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + } + + xcnt++; + + } + else + { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + return _FALSE; + } + + break; + + }while(0/*xcnt < (NR_XMITFRAME >> 3)*/); + + return _TRUE; + +} +#endif + + + +static s32 xmitframe_direct(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + s32 res = _SUCCESS; + + + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + if (res == _SUCCESS) { + rtw_dump_xframe(padapter, pxmitframe); + } + + return res; +} + +/* + * Return + * _TRUE dump packet directly + * _FALSE enqueue packet + */ +static s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + _irqL irqL; + s32 res; + struct xmit_buf *pxmitbuf = NULL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif + + do_queue_select(padapter, pattrib); + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + +#ifndef CONFIG_TDLS +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) + { + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + if(pattrib->psta) + { + psta = pattrib->psta; + } + else + { + psta=rtw_get_stainfo(pstapriv, pattrib->ra); + } + + if(psta) + { + if(psta->sleepq_len > (NR_XMITFRAME>>3)) + { + wakeup_sta_to_xmit(padapter, psta); + } + } + + return _FALSE; + } +#endif +//else CONFIG_TDLS, process as TDLS Buffer STA +#else + if(pmlmeinfo->tdls_setup_state&TDLS_LINKED_STATE ){ //&& pattrib->ether_type!=0x0806) + res = xmit_tdls_enqueue_for_sleeping_sta(padapter, pxmitframe); + if(res==_TRUE){ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + return _FALSE; + }else if(res==2){ + goto enqueue; + } + } +#endif + + if (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0) + goto enqueue; + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + goto enqueue; + + + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL) + goto enqueue; + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf; + pxmitbuf->priv_data = pxmitframe; + + if (xmitframe_direct(padapter, pxmitframe) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + } + + return _TRUE; + +enqueue: + res = rtw_xmitframe_enqueue(padapter, pxmitframe); + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + if (res != _SUCCESS) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("pre_xmitframe: enqueue xmitframe fail\n")); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + // Trick, make the statistics correct + pxmitpriv->tx_pkts--; + pxmitpriv->tx_drop++; + return _TRUE; + } + + return _FALSE; +} + +void rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe) +{ + rtw_dump_xframe(padapter, pmgntframe); +} + +/* + * Return + * _TRUE dump packet directly ok + * _FALSE temporary can't transmit packets to hardware + */ +s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + return pre_xmitframe(padapter, pxmitframe); +} + +#ifdef CONFIG_HOSTAPD_MLME + +static void rtl8192cu_hostap_mgnt_xmit_cb(struct urb *urb) +{ +#ifdef PLATFORM_LINUX + struct sk_buff *skb = (struct sk_buff *)urb->context; + + //DBG_8192C("%s\n", __FUNCTION__); + + dev_kfree_skb_any(skb); +#endif +} + +s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) +{ +#ifdef PLATFORM_LINUX + u16 fc; + int rc, len, pipe; + unsigned int bmcst, tid, qsel; + struct sk_buff *skb, *pxmit_skb; + struct urb *urb; + unsigned char *pxmitbuf; + struct tx_desc *ptxdesc; + struct ieee80211_hdr *tx_hdr; + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; + struct net_device *pnetdev = padapter->pnetdev; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dvobj_priv *pdvobj = &padapter->dvobjpriv; + + + //DBG_8192C("%s\n", __FUNCTION__); + + skb = pkt; + + len = skb->len; + tx_hdr = (struct ieee80211_hdr *)(skb->data); + fc = le16_to_cpu(tx_hdr->frame_ctl); + bmcst = IS_MCAST(tx_hdr->addr1); + + if ((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT) + goto _exit; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pxmit_skb = dev_alloc_skb(len + TXDESC_SIZE); +#else + pxmit_skb = netdev_alloc_skb(pnetdev, len + TXDESC_SIZE); +#endif + + if(!pxmit_skb) + goto _exit; + + pxmitbuf = pxmit_skb->data; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + goto _exit; + } + + // ----- fill tx desc ----- + ptxdesc = (struct tx_desc *)pxmitbuf; + _rtw_memset(ptxdesc, 0, sizeof(*ptxdesc)); + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32(len&0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(OWN | FSG | LSG); + + if(bmcst) + { + ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); + } + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32(0x00);//MAC_ID + + ptxdesc->txdw1 |= cpu_to_le32((0x12<txdw1 |= cpu_to_le32((0x06<< 16) & 0x000f0000);//b mode + + //offset 8 + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((le16_to_cpu(tx_hdr->seq_ctl)<<16)&0xffff0000); + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + //offset 20 + + + //HW append seq + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + + + rtl8192cu_cal_txdesc_chksum(ptxdesc); + // ----- end of fill tx desc ----- + + // + skb_put(pxmit_skb, len + TXDESC_SIZE); + pxmitbuf = pxmitbuf + TXDESC_SIZE; + _rtw_memcpy(pxmitbuf, skb->data, len); + + //DBG_8192C("mgnt_xmit, len=%x\n", pxmit_skb->len); + + + // ----- prepare urb for submit ----- + + //translate DMA FIFO addr to pipehandle + //pipe = ffaddr2pipehdl(pdvobj, MGT_QUEUE_INX); + pipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f); + + usb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe, + pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb); + + urb->transfer_flags |= URB_ZERO_PACKET; + usb_anchor_urb(urb, &phostapdpriv->anchored); + rc = usb_submit_urb(urb, GFP_ATOMIC); + if (rc < 0) { + usb_unanchor_urb(urb); + kfree_skb(skb); + } + usb_free_urb(urb); + + +_exit: + + dev_kfree_skb_any(skb); + +#endif + + return 0; + +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c new file mode 100755 index 000000000000..145902a3d5c0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c @@ -0,0 +1,5453 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_HAL_INIT_C_ + +#include +#include +#include +#include + +#include +#include + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +#include "rtl8192c_sreset.h" +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#ifndef CONFIG_USB_HCI + +#error "CONFIG_USB_HCI shall be on!\n" + +#endif + +#include +#include +#include + +#if DISABLE_BB_RF + #define HAL_MAC_ENABLE 0 + #define HAL_BB_ENABLE 0 + #define HAL_RF_ENABLE 0 +#else + #define HAL_MAC_ENABLE 1 + #define HAL_BB_ENABLE 1 + #define HAL_RF_ENABLE 1 +#endif + +//endpoint number 1,2,3,4,5 +// bult in : 1 +// bult out: 2 (High) +// bult out: 3 (Normal) for 3 out_ep, (Low) for 2 out_ep +// interrupt in: 4 +// bult out: 5 (Low) for 3 out_ep + + +static VOID +_OneOutEpMapping( + IN HAL_DATA_TYPE *pHalData + ) +{ + //only endpoint number 0x02 + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[0];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD +} + + +static VOID +_TwoOutEpMapping( + IN BOOLEAN IsTestChip, + IN HAL_DATA_TYPE *pHalData, + IN BOOLEAN bWIFICfg + ) +{ + +/* +#define VO_QUEUE_INX 0 +#define VI_QUEUE_INX 1 +#define BE_QUEUE_INX 2 +#define BK_QUEUE_INX 3 +#define BCN_QUEUE_INX 4 +#define MGT_QUEUE_INX 5 +#define HIGH_QUEUE_INX 6 +#define TXCMD_QUEUE_INX 7 +*/ + + if(IsTestChip && bWIFICfg){ // test chip && wmm + + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 1, 0, 1, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:L (end_number=0x03) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[0];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + else if(!IsTestChip && bWIFICfg){ // Normal chip && wmm + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 0, 1, 0, 1, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:L (end_number=0x03) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[1];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + else{//typical setting + + //BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:L (end_number=0x03) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + +} + + +static VOID _ThreeOutEpMapping( + IN HAL_DATA_TYPE *pHalData, + IN BOOLEAN bWIFICfg + ) +{ + if(bWIFICfg){//for WMM + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 1, 2, 1, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + else{//typical setting + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 2, 2, 1, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05) + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[2];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + +} + +static BOOLEAN +_MappingOutEP( + IN PADAPTER pAdapter, + IN u8 NumOutPipe, + IN BOOLEAN IsTestChip + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct registry_priv *pregistrypriv = &pAdapter->registrypriv; + + BOOLEAN bWIFICfg = (pregistrypriv->wifi_spec) ?_TRUE:_FALSE; + + BOOLEAN result = _TRUE; + + switch(NumOutPipe) + { + case 2: + _TwoOutEpMapping(IsTestChip, pHalData, bWIFICfg); + break; + case 3: + // Test chip doesn't support three out EPs. + if(IsTestChip){ + return _FALSE; + } + _ThreeOutEpMapping(pHalData, bWIFICfg); + break; + case 1: + _OneOutEpMapping(pHalData); + break; + default: + result = _FALSE; + break; + } + + return result; + +} + +static VOID +_ConfigTestChipOutEP( + IN PADAPTER pAdapter, + IN u8 NumOutPipe + ) +{ + u8 value8,txqsele; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + pHalData->OutEpQueueSel = 0; + pHalData->OutEpNumber = 0; + + value8 = rtw_read8(pAdapter, REG_TEST_SIE_OPTIONAL); + value8 = (value8 & USB_TEST_EP_MASK) >> USB_TEST_EP_SHIFT; + + switch(value8) + { + case 0: // 2 bulk OUT, 1 bulk IN + case 3: + pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ; + pHalData->OutEpNumber = 2; + //RT_TRACE(COMP_INIT, DBG_LOUD, ("EP Config: 2 bulk OUT, 1 bulk IN\n")); + break; + case 1: // 1 bulk IN/OUT => map all endpoint to Low queue + case 2: // 1 bulk IN, 1 bulk OUT => map all endpoint to High queue + txqsele = rtw_read8(pAdapter, REG_TEST_USB_TXQS); + if(txqsele & 0x0F){//map all endpoint to High queue + pHalData->OutEpQueueSel = TX_SELE_HQ; + } + else if(txqsele&0xF0){//map all endpoint to Low queue + pHalData->OutEpQueueSel = TX_SELE_LQ; + } + pHalData->OutEpNumber = 1; + //RT_TRACE(COMP_INIT, DBG_LOUD, ("%s\n", ((1 == value8) ? "1 bulk IN/OUT" : "1 bulk IN, 1 bulk OUT"))); + break; + default: + break; + } + + // TODO: Error recovery for this case + //RT_ASSERT((NumOutPipe == pHalData->OutEpNumber), ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n", (u4Byte)NumOutPipe, (u4Byte)pHalData->OutEpNumber)); + +} + + + +static VOID +_ConfigNormalChipOutEP( + IN PADAPTER pAdapter, + IN u8 NumOutPipe + ) +{ + u8 value8; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + pHalData->OutEpQueueSel = 0; + pHalData->OutEpNumber = 0; + + // Normal and High queue + value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 1)); + + if(value8 & USB_NORMAL_SIE_EP_MASK){ + pHalData->OutEpQueueSel |= TX_SELE_HQ; + pHalData->OutEpNumber++; + } + + if((value8 >> USB_NORMAL_SIE_EP_SHIFT) & USB_NORMAL_SIE_EP_MASK){ + pHalData->OutEpQueueSel |= TX_SELE_NQ; + pHalData->OutEpNumber++; + } + + // Low queue + value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 2)); + if(value8 & USB_NORMAL_SIE_EP_MASK){ + pHalData->OutEpQueueSel |= TX_SELE_LQ; + pHalData->OutEpNumber++; + } + + // TODO: Error recovery for this case + //RT_ASSERT((NumOutPipe == pHalData->OutEpNumber), ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n", (u4Byte)NumOutPipe, (u4Byte)pHalData->OutEpNumber)); + +} + +static BOOLEAN HalUsbSetQueuePipeMapping8192CUsb( + IN PADAPTER pAdapter, + IN u8 NumInPipe, + IN u8 NumOutPipe + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN result = _FALSE; + BOOLEAN isNormalChip; + + //may be update UPHY Parameter == georgia + + + // ReadAdapterInfo8192C also call _ReadChipVersion too. + // Since we need dynamic config EP mapping, so we call this function to get chip version. + // We can remove _ReadChipVersion from ReadAdapterInfo8192C later. + //pHalData->VersionID = rtl8192c_ReadChipVersion(pAdapter); + + isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); + + if(isNormalChip){ + _ConfigNormalChipOutEP(pAdapter, NumOutPipe); + } + else{ + _ConfigTestChipOutEP(pAdapter, NumOutPipe); + } + + // Normal chip with one IN and one OUT doesn't have interrupt IN EP. + if(isNormalChip && (1 == pHalData->OutEpNumber)){ + if(1 != NumInPipe){ + return result; + } + } + + // All config other than above support one Bulk IN and one Interrupt IN. + //if(2 != NumInPipe){ + // return result; + //} + + result = _MappingOutEP(pAdapter, NumOutPipe, !isNormalChip); + + return result; + +} + +void rtl8192cu_interface_configure(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + + if (pdvobjpriv->ishighspeed == _TRUE) + { + pHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes + } + else + { + pHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes + } + + pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber; + pHalData->RtBulkInPipe = pdvobjpriv->ep_num[0]; + pHalData->RtBulkOutPipe[0] = pdvobjpriv->ep_num[1]; + pHalData->RtBulkOutPipe[1] = pdvobjpriv->ep_num[2]; + pHalData->RtIntInPipe = pdvobjpriv->ep_num[3]; + pHalData->RtBulkOutPipe[2] = pdvobjpriv->ep_num[4]; + +#ifdef CONFIG_USB_TX_AGGREGATION + pHalData->UsbTxAggMode = 1; + pHalData->UsbTxAggDescNum = 0x6; // only 4 bits +#endif + +#ifdef CONFIG_USB_RX_AGGREGATION + pHalData->UsbRxAggMode = USB_RX_AGG_DMA;// USB_RX_AGG_DMA; + pHalData->UsbRxAggBlockCount = 8; //unit : 512b + pHalData->UsbRxAggBlockTimeout = 0x6; + pHalData->UsbRxAggPageCount = 48; //uint :128 b //0x0A; // 10 = MAX_RX_DMA_BUFFER_SIZE/2/pHalData->UsbBulkOutSize + pHalData->UsbRxAggPageTimeout = 0x4; //6, absolute time = 34ms/(2^6) +#endif + + HalUsbSetQueuePipeMapping8192CUsb(padapter, + pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); + +} + +static u8 _InitPowerOn(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 ret = _SUCCESS; + u16 value16=0; + u8 value8 = 0; + u32 value32 = 0; + + // polling autoload done. + u32 pollingCount = 0; + + do + { + if(rtw_read8(padapter, REG_APS_FSMCO) & PFM_ALDN){ + //RT_TRACE(COMP_INIT,DBG_LOUD,("Autoload Done!\n")); + break; + } + + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[PFM_ALDN] done!\n")); + return _FAIL; + } + + }while(_TRUE); + + +// For hardware power on sequence. + + //0. RSV_CTRL 0x1C[7:0] = 0x00 // unlock ISO/CLK/Power control register + rtw_write8(padapter, REG_RSV_CTRL, 0x0); + // Power on when re-enter from IPS/Radio off/card disable + rtw_write8(padapter, REG_SPS0_CTRL, 0x2b);//enable SPS into PWM mode +/* + value16 = PlatformIORead2Byte(Adapter, REG_AFE_XTAL_CTRL);//enable AFE clock + value16 &= (~XTAL_GATE_AFE); + PlatformIOWrite2Byte(Adapter,REG_AFE_XTAL_CTRL, value16 ); +*/ + + rtw_udelay_os(100);//PlatformSleepUs(150);//this is not necessary when initially power on + + value8 = rtw_read8(padapter, REG_LDOV12D_CTRL); + if(0== (value8 & LDV12_EN) ){ + value8 |= LDV12_EN; + rtw_write8(padapter, REG_LDOV12D_CTRL, value8); + //RT_TRACE(COMP_INIT, DBG_LOUD, (" power-on :REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8)); + rtw_udelay_os(100);//PlatformSleepUs(100);//this is not necessary when initially power on + value8 = rtw_read8(padapter, REG_SYS_ISO_CTRL); + value8 &= ~ISO_MD2PP; + rtw_write8(padapter, REG_SYS_ISO_CTRL, value8); + } + + // auto enable WLAN + pollingCount = 0; + value16 = rtw_read16(padapter, REG_APS_FSMCO); + value16 |= APFM_ONMAC; + rtw_write16(padapter, REG_APS_FSMCO, value16); + + do + { + if(0 == (rtw_read16(padapter, REG_APS_FSMCO) & APFM_ONMAC)){ + //RT_TRACE(COMP_INIT,DBG_LOUD,("MAC auto ON okay!\n")); + break; + } + + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[APFM_ONMAC] done!\n")); + return _FAIL; + } + + }while(_TRUE); + + //Enable Radio ,GPIO ,and LED function + rtw_write16(padapter,REG_APS_FSMCO,0x0812); + +#ifdef CONFIG_AUTOSUSPEND + //for usb Combo card ,BT + if((BOARD_USB_COMBO == pHalData->BoardType)&&(padapter->registrypriv.usbss_enable)) + { + value32 = rtw_read32(padapter, REG_APS_FSMCO); + value32 |= (SOP_ABG|SOP_AMB|XOP_BTCK); + rtw_write32(padapter, REG_APS_FSMCO, value32); + } +#endif + + // release RF digital isolation + value16 = rtw_read16(padapter, REG_SYS_ISO_CTRL); + value16 &= ~ISO_DIOR; + rtw_write16(padapter, REG_SYS_ISO_CTRL, value16); + + // Enable MAC DMA/WMAC/SCHEDULE/SEC block + value16 = rtw_read16(padapter, REG_CR); + value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN + | PROTOCOL_EN | SCHEDULE_EN | MACTXEN | MACRXEN | ENSEC); + rtw_write16(padapter, REG_CR, value16); + + //tynli_test for suspend mode. + { + rtw_write8(padapter, 0xfe10, 0x19); + } + + // 2010/11/22 MH For slim combo debug mode check. + if (pHalData->BoardType == BOARD_USB_COMBO) + { + if (pHalData->SlimComboDbg == _TRUE) + { + DBG_8192C("SlimComboDbg == TRUE\n"); + + // 1. SIC?Test Mode , Debug Ports |۰ Enable, ҥH Driver Wӫ, + // nг]w 0x 00[7] -> "1", N Disable. effect if not: power consumption increase + rtw_write8(padapter, REG_SYS_ISO_CTRL, rtw_read8(padapter, REG_SYS_ISO_CTRL)|BIT7); + + // 2. SIC?Test Mode , GPIO-8?| report Power State ҥH Driver Wӫ, г]w? 0x04[6] -> "1" N Disable + // effect if not: GPIO-8 could not be GPIO or LED function + rtw_write8(padapter, REG_APS_FSMCO, rtw_read8(padapter, REG_APS_FSMCO)|BIT6); + + // 3. SIC Test Mode , EESK, EECS | report?Host Clock status, ҥH Driver Wӫ, г]w? 0x40[4] -> "1" N EEPROM ϥ Pin (autoload still from Efuse) + // effect if not:power consumption increase + value8 = rtw_read8(padapter, REG_GPIO_MUXCFG)|BIT4 ; + #ifdef CONFIG_BT_COEXIST + // 2011/01/26 MH UMB-B cut bug. We need to support the modification. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && + pHalData->bt_coexist.BT_Coexist) + { + value8 |= (BIT5); + } + #endif + rtw_write8(padapter, REG_GPIO_MUXCFG,value8 ); + + + // 4. SIC Test Mode ,?SIC Debug ports |۰ Enable , ҥH Driver WӫᰨW, г]w? 0x40[15:11] -> 0x00, NDisable + // 4.1Two Steps setting for safety: 0x40[15,13,12, 11] -> "0", then ?0x40[14] -> "0" + // effect if not: Host could not transfer packets, and GPIO-3,2 will occupied by SIC then Co-exist could not work. + rtw_write16(padapter, REG_GPIO_MUXCFG, (rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF)|BIT14); + rtw_write16(padapter, REG_GPIO_MUXCFG, rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF); + } + } + + + // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in + // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all + // IC. According to Johnny's opinion, only RU will meet the condition. + if (IS_HARDWARE_TYPE_8192C(padapter) && (pHalData->BoardType == BOARD_USB_High_PA)) + rtw_write32(padapter, rFPGA0_XCD_RFParameter, rtw_read32(padapter, rFPGA0_XCD_RFParameter)&(~BIT1)); + return ret; + +} + + +static void _dbg_dump_macreg(_adapter *padapter) +{ + u32 offset = 0; + u32 val32 = 0; + u32 index =0 ; + for(index=0;index<64;index++) + { + offset = index*4; + val32 = rtw_read32(padapter,offset); + DBG_8192C("offset : 0x%02x ,val:0x%08x\n",offset,val32); + } +} + + +static void _InitPABias(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 pa_setting; + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + //FIXED PA current issue + //efuse_one_byte_read(padapter, 0x1FA, &pa_setting); + pa_setting = EFUSE_Read1Byte(padapter, 0x1FA); + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_InitPABias 0x1FA 0x%x \n",pa_setting)); + + if(!(pa_setting & BIT0)) + { + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x0F406); + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x4F406); + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x8F406); + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0xCF406); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path A\n")); + } + + if(!(pa_setting & BIT1) && isNormal && is92C) + { + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x0F406); + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x4F406); + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x8F406); + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0xCF406); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path B\n")); + } + + if(!(pa_setting & BIT4)) + { + pa_setting = rtw_read8(padapter, 0x16); + pa_setting &= 0x0F; + rtw_write8(padapter, 0x16, pa_setting | 0x90); + } +} +#ifdef CONFIG_BT_COEXIST +static void _InitBTCoexist(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + u8 u1Tmp; + + if(pbtpriv->BT_Coexist && pbtpriv->BT_CoexistType == BT_CSR_BC4) + { + +#if MP_DRIVER != 1 + if(pbtpriv->BT_Ant_isolation) + { + rtw_write8( padapter,REG_GPIO_MUXCFG, 0xa0); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_GPIO_MUXCFG, 0xa0); + } +#endif + + u1Tmp = rtw_read8(padapter, 0x4fd) & BIT0; + u1Tmp = u1Tmp | + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) | + ((pbtpriv->BT_Service==BT_SCO)?0:BIT2); + rtw_write8( padapter, 0x4fd, u1Tmp); + DBG_8192C("BT write 0x%x = 0x%x for non-isolation\n", 0x4fd, u1Tmp); + + + rtw_write32(padapter, REG_BT_COEX_TABLE+4, 0xaaaa9aaa); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+4, 0xaaaa9aaa); + + rtw_write32(padapter, REG_BT_COEX_TABLE+8, 0xffbd0040); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+8, 0xffbd0040); + + rtw_write32(padapter, REG_BT_COEX_TABLE+0xc, 0x40000010); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+0xc, 0x40000010); + + //Config to 1T1R + u1Tmp = rtw_read8(padapter,rOFDM0_TRxPathEnable); + u1Tmp &= ~(BIT1); + rtw_write8( padapter, rOFDM0_TRxPathEnable, u1Tmp); + DBG_8192C("BT write 0xC04 = 0x%x\n", u1Tmp); + + u1Tmp = rtw_read8(padapter, rOFDM1_TRxPathEnable); + u1Tmp &= ~(BIT1); + rtw_write8( padapter, rOFDM1_TRxPathEnable, u1Tmp); + DBG_8192C("BT write 0xD04 = 0x%x\n", u1Tmp); + + } +} +#endif + +//------------------------------------------------------------------------- +// +// LLT R/W/Init function +// +//------------------------------------------------------------------------- +static u8 _LLTWrite( + IN PADAPTER Adapter, + IN u32 address, + IN u32 data + ) +{ + u8 status = _SUCCESS; + int count = 0; + u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS); + + rtw_write32(Adapter, REG_LLT_INIT, value); + + //polling + do{ + + value = rtw_read32(Adapter, REG_LLT_INIT); + if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){ + break; + } + + if(count > POLLING_LLT_THRESHOLD){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling write LLT done at address %d!\n", address)); + status = _FAIL; + break; + } + }while(count++); + + return status; + +} + + +static u8 _LLTRead( + IN PADAPTER Adapter, + IN u32 address + ) +{ + int count = 0; + u32 value = _LLT_INIT_ADDR(address) | _LLT_OP(_LLT_READ_ACCESS); + + rtw_write32(Adapter, REG_LLT_INIT, value); + + //polling and get value + do{ + + value = rtw_read32(Adapter, REG_LLT_INIT); + if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){ + return (u8)value; + } + + if(count > POLLING_LLT_THRESHOLD){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling read LLT done at address %d!\n", address)); + break; + } + }while(count++); + + return 0xFF; + +} + + +static u8 InitLLTTable( + IN PADAPTER Adapter, + IN u32 boundary + ) +{ + u8 status = _SUCCESS; + u32 i; + + for(i = 0 ; i < (boundary - 1) ; i++){ + status = _LLTWrite(Adapter, i , i + 1); + if(_SUCCESS != status){ + return status; + } + } + + // end of list + status = _LLTWrite(Adapter, (boundary - 1), 0xFF); + if(_SUCCESS != status){ + return status; + } + + // Make the other pages as ring buffer + // This ring buffer is used as beacon buffer if we config this MAC as two MAC transfer. + // Otherwise used as local loopback buffer. + for(i = boundary ; i < LAST_ENTRY_OF_TX_PKT_BUFFER ; i++){ + status = _LLTWrite(Adapter, i, (i + 1)); + if(_SUCCESS != status){ + return status; + } + } + + // Let last entry point to the start entry of ring buffer + status = _LLTWrite(Adapter, LAST_ENTRY_OF_TX_PKT_BUFFER, boundary); + if(_SUCCESS != status){ + return status; + } + + return status; + +} + + +//--------------------------------------------------------------- +// +// MAC init functions +// +//--------------------------------------------------------------- +static VOID +_SetMacID( + IN PADAPTER Adapter, u8* MacID + ) +{ + u32 i; + for(i=0 ; i< MAC_ADDR_LEN ; i++){ + rtw_write32(Adapter, REG_MACID+i, MacID[i]); + } +} + +static VOID +_SetBSSID( + IN PADAPTER Adapter, u8* BSSID + ) +{ + u32 i; + for(i=0 ; i< MAC_ADDR_LEN ; i++){ + rtw_write32(Adapter, REG_BSSID+i, BSSID[i]); + } +} + + +// Shall USB interface init this? +static VOID +_InitInterrupt( + IN PADAPTER Adapter + ) +{ + u32 value32; + + // HISR - turn all on + value32 = 0xFFFFFFFF; + rtw_write32(Adapter, REG_HISR, value32); + + // HIMR - turn all on + rtw_write32(Adapter, REG_HIMR, value32); +} + + +static VOID +_InitQueueReservedPage( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + BOOLEAN isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); + + u32 outEPNum = (u32)pHalData->OutEpNumber; + u32 numHQ = 0; + u32 numLQ = 0; + u32 numNQ = 0; + u32 numPubQ; + u32 value32; + u8 value8; + BOOLEAN bWiFiConfig = pregistrypriv->wifi_spec; + //u32 txQPageNum, txQPageUnit,txQRemainPage; + +#if 0 + if(!pregistrypriv->wifi_spec){ + numPubQ = (isNormalChip) ? NORMAL_PAGE_NUM_PUBQ : TEST_PAGE_NUM_PUBQ; + //RT_ASSERT((numPubQ < TX_TOTAL_PAGE_NUMBER), ("Public queue page number is great than total tx page number.\n")); + txQPageNum = TX_TOTAL_PAGE_NUMBER - numPubQ; + + //RT_ASSERT((0 == txQPageNum%txQPageNum), ("Total tx page number is not dividable!\n")); + + txQPageUnit = txQPageNum/outEPNum; + txQRemainPage = txQPageNum % outEPNum; + + if(pHalData->OutEpQueueSel & TX_SELE_HQ){ + numHQ = txQPageUnit; + } + if(pHalData->OutEpQueueSel & TX_SELE_LQ){ + numLQ = txQPageUnit; + } + // HIGH priority queue always present in the configuration of 2 or 3 out-ep + // so ,remainder pages have assigned to High queue + if((outEPNum>1) && (txQRemainPage)){ + numHQ += txQRemainPage; + } + + // NOTE: This step shall be proceed before writting REG_RQPN. + if(isNormalChip){ + if(pHalData->OutEpQueueSel & TX_SELE_NQ){ + numNQ = txQPageUnit; + } + value8 = (u8)_NPQ(numNQ); + rtw_write8(Adapter, REG_RQPN_NPQ, value8); + } + //RT_ASSERT(((numHQ + numLQ + numNQ + numPubQ) < TX_PAGE_BOUNDARY), ("Total tx page number is greater than tx boundary!\n")); + } + else +#endif + { //for WMM + //RT_ASSERT((outEPNum>=2), ("for WMM ,number of out-ep must more than or equal to 2!\n")); + + numPubQ = (isNormalChip) ? ((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_PUBQ:NORMAL_PAGE_NUM_PUBQ) + :WMM_TEST_PAGE_NUM_PUBQ; + + if(pHalData->OutEpQueueSel & TX_SELE_HQ){ + numHQ = (isNormalChip)?((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_HPQ:NORMAL_PAGE_NUM_HPQ) + :WMM_TEST_PAGE_NUM_HPQ; + } + + if(pHalData->OutEpQueueSel & TX_SELE_LQ){ + numLQ = (isNormalChip)?((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_LPQ:NORMAL_PAGE_NUM_LPQ) + :WMM_TEST_PAGE_NUM_LPQ; + } + // NOTE: This step shall be proceed before writting REG_RQPN. + if(isNormalChip){ + if(pHalData->OutEpQueueSel & TX_SELE_NQ){ + numNQ = (bWiFiConfig)?WMM_NORMAL_PAGE_NUM_NPQ:NORMAL_PAGE_NUM_NPQ; + } + value8 = (u8)_NPQ(numNQ); + rtw_write8(Adapter, REG_RQPN_NPQ, value8); + } + } + + // TX DMA + value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN; + rtw_write32(Adapter, REG_RQPN, value32); +} + +static void _InitID(IN PADAPTER Adapter) +{ + int i; + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + + for(i=0; i<6; i++) + { + rtw_write8(Adapter, (REG_MACID+i), pEEPROM->mac_addr[i]); + } + +/* + NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); + //Ziv test +#if 1 + { + u1Byte sMacAddr[6] = {0}; + u4Byte i; + + for(i = 0 ; i < MAC_ADDR_LEN ; i++){ + sMacAddr[i] = PlatformIORead1Byte(Adapter, (REG_MACID + i)); + } + RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "Read back MAC Addr: ", sMacAddr); + } +#endif + +#if 0 + u4Byte nMAR = 0xFFFFFFFF; + u8 m_MacID[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; + u8 m_BSSID[] = {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; + int i; + + _SetMacID(Adapter, Adapter->PermanentAddress); + _SetBSSID(Adapter, m_BSSID); + + //set MAR + PlatformIOWrite4Byte(Adapter, REG_MAR, nMAR); + PlatformIOWrite4Byte(Adapter, REG_MAR+4, nMAR); +#endif +*/ +} + + +static VOID +_InitTxBufferBoundary( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + u8 txpktbuf_bndy; + + if(!pregistrypriv->wifi_spec){ + txpktbuf_bndy = TX_PAGE_BOUNDARY; + } + else{//for WMM + txpktbuf_bndy = ( IS_NORMAL_CHIP( pHalData->VersionID))?WMM_NORMAL_TX_PAGE_BOUNDARY + :WMM_TEST_TX_PAGE_BOUNDARY; + } + + rtw_write8(Adapter, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy); + rtw_write8(Adapter, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy); + rtw_write8(Adapter, REG_TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy); + rtw_write8(Adapter, REG_TRXFF_BNDY, txpktbuf_bndy); +#if 1 + rtw_write8(Adapter, REG_TDECTRL+1, txpktbuf_bndy); +#else + txdmactrl = PlatformIORead2Byte(Adapter, REG_TDECTRL); + txdmactrl &= ~BCN_HEAD_MASK; + txdmactrl |= BCN_HEAD(txpktbuf_bndy); + PlatformIOWrite2Byte(Adapter, REG_TDECTRL, txdmactrl); +#endif +} + +static VOID +_InitPageBoundary( + IN PADAPTER Adapter + ) +{ + // RX Page Boundary + //srand(static_cast(time(NULL)) ); + u16 rxff_bndy = 0x27FF;//(rand() % 1) ? 0x27FF : 0x23FF; + + rtw_write16(Adapter, (REG_TRXFF_BNDY + 2), rxff_bndy); + + // TODO: ?? shall we set tx boundary? +} + + +static VOID +_InitNormalChipRegPriority( + IN PADAPTER Adapter, + IN u16 beQ, + IN u16 bkQ, + IN u16 viQ, + IN u16 voQ, + IN u16 mgtQ, + IN u16 hiQ + ) +{ + u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7); + + value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | + _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | + _TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ); + + rtw_write16(Adapter, REG_TRXDMA_CTRL, value16); +} + +static VOID +_InitNormalChipOneOutEpPriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + u16 value = 0; + switch(pHalData->OutEpQueueSel) + { + case TX_SELE_HQ: + value = QUEUE_HIGH; + break; + case TX_SELE_LQ: + value = QUEUE_LOW; + break; + case TX_SELE_NQ: + value = QUEUE_NORMAL; + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + + _InitNormalChipRegPriority(Adapter, + value, + value, + value, + value, + value, + value + ); + +} + +static VOID +_InitNormalChipTwoOutEpPriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; + + + u16 valueHi = 0; + u16 valueLow = 0; + + switch(pHalData->OutEpQueueSel) + { + case (TX_SELE_HQ | TX_SELE_LQ): + valueHi = QUEUE_HIGH; + valueLow = QUEUE_LOW; + break; + case (TX_SELE_NQ | TX_SELE_LQ): + valueHi = QUEUE_NORMAL; + valueLow = QUEUE_LOW; + break; + case (TX_SELE_HQ | TX_SELE_NQ): + valueHi = QUEUE_HIGH; + valueLow = QUEUE_NORMAL; + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + + if(!pregistrypriv->wifi_spec ){ + beQ = valueLow; + bkQ = valueLow; + viQ = valueHi; + voQ = valueHi; + mgtQ = valueHi; + hiQ = valueHi; + } + else{//for WMM ,CONFIG_OUT_EP_WIFI_MODE + beQ = valueLow; + bkQ = valueHi; + viQ = valueHi; + voQ = valueLow; + mgtQ = valueHi; + hiQ = valueHi; + } + + _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); + +} + +static VOID +_InitNormalChipThreeOutEpPriority( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; + + if(!pregistrypriv->wifi_spec ){// typical setting + beQ = QUEUE_LOW; + bkQ = QUEUE_LOW; + viQ = QUEUE_NORMAL; + voQ = QUEUE_HIGH; + mgtQ = QUEUE_HIGH; + hiQ = QUEUE_HIGH; + } + else{// for WMM + beQ = QUEUE_LOW; + bkQ = QUEUE_NORMAL; + viQ = QUEUE_NORMAL; + voQ = QUEUE_HIGH; + mgtQ = QUEUE_HIGH; + hiQ = QUEUE_HIGH; + } + _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); +} + +static VOID +_InitNormalChipQueuePriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(pHalData->OutEpNumber) + { + case 1: + _InitNormalChipOneOutEpPriority(Adapter); + break; + case 2: + _InitNormalChipTwoOutEpPriority(Adapter); + break; + case 3: + _InitNormalChipThreeOutEpPriority(Adapter); + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + + +} + +static VOID +_InitTestChipQueuePriority( + IN PADAPTER Adapter + ) +{ + u8 hq_sele ; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + + switch(pHalData->OutEpNumber) + { + case 2: // (TX_SELE_HQ|TX_SELE_LQ) + if(!pregistrypriv->wifi_spec)//typical setting + hq_sele = HQSEL_VOQ | HQSEL_VIQ | HQSEL_MGTQ | HQSEL_HIQ ; + else //for WMM + hq_sele = HQSEL_VOQ | HQSEL_BEQ | HQSEL_MGTQ | HQSEL_HIQ ; + break; + case 1: + if(TX_SELE_LQ == pHalData->OutEpQueueSel ){//map all endpoint to Low queue + hq_sele = 0; + } + else if(TX_SELE_HQ == pHalData->OutEpQueueSel){//map all endpoint to High queue + hq_sele = HQSEL_VOQ | HQSEL_VIQ | HQSEL_BEQ | HQSEL_BKQ | HQSEL_MGTQ | HQSEL_HIQ ; + } + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + rtw_write8(Adapter, (REG_TRXDMA_CTRL+1), hq_sele); +} + + +static VOID +_InitQueuePriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(IS_NORMAL_CHIP( pHalData->VersionID)){ + _InitNormalChipQueuePriority(Adapter); + } + else{ + _InitTestChipQueuePriority(Adapter); + } +} + +static VOID +_InitHardwareDropIncorrectBulkOut( + IN PADAPTER Adapter + ) +{ + u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK); + value32 |= DROP_DATA_EN; + rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32); +} + +static VOID +_InitNetworkType( + IN PADAPTER Adapter + ) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_CR); + + // TODO: use the other function to set network type +#if RTL8191C_FPGA_NETWORKTYPE_ADHOC + value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AD_HOC); +#else + value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); +#endif + rtw_write32(Adapter, REG_CR, value32); +// RASSERT(pIoBase->rtw_read8(REG_CR + 2) == 0x2); +} + +static VOID +_InitTransferPageSize( + IN PADAPTER Adapter + ) +{ + // Tx page size is always 128. + + u8 value8; + value8 = _PSRX(PBP_128) | _PSTX(PBP_128); + rtw_write8(Adapter, REG_PBP, value8); +} + +static VOID +_InitDriverInfoSize( + IN PADAPTER Adapter, + IN u8 drvInfoSize + ) +{ + rtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize); +} + +static VOID +_InitWMACSetting( + IN PADAPTER Adapter + ) +{ + //u4Byte value32; + //u16 value16; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; + pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYSTS; +#if (0 == RTL8192C_RX_PACKET_NO_INCLUDE_CRC) + pHalData->ReceiveConfig |= ACRC32; +#endif + + // some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile() + rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); + + // Accept all multicast address + rtw_write32(Adapter, REG_MAR, 0xFFFFFFFF); + rtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF); + + + // Accept all data frames + //value16 = 0xFFFF; + //rtw_write16(Adapter, REG_RXFLTMAP2, value16); + + // 2010.09.08 hpfan + // Since ADF is removed from RCR, ps-poll will not be indicate to driver, + // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. + //value16 = 0x400; + //rtw_write16(Adapter, REG_RXFLTMAP1, value16); + + // Accept all management frames + //value16 = 0xFFFF; + //rtw_write16(Adapter, REG_RXFLTMAP0, value16); + + //enable RX_SHIFT bits + //rtw_write8(Adapter, REG_TRXDMA_CTRL, rtw_read8(Adapter, REG_TRXDMA_CTRL)|BIT(1)); + +} + +static VOID +_InitAdaptiveCtrl( + IN PADAPTER Adapter + ) +{ + u16 value16; + u32 value32; + + // Response Rate Set + value32 = rtw_read32(Adapter, REG_RRSR); + value32 &= ~RATE_BITMAP_ALL; + value32 |= RATE_RRSR_CCK_ONLY_1M; + rtw_write32(Adapter, REG_RRSR, value32); + + // CF-END Threshold + //m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1); + + // SIFS (used in NAV) + value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10); + rtw_write16(Adapter, REG_SPEC_SIFS, value16); + + // Retry Limit + value16 = _LRL(0x30) | _SRL(0x30); + rtw_write16(Adapter, REG_RL, value16); + +} + +static VOID +_InitRateFallback( + IN PADAPTER Adapter + ) +{ + // Set Data Auto Rate Fallback Retry Count register. + rtw_write32(Adapter, REG_DARFRC, 0x00000000); + rtw_write32(Adapter, REG_DARFRC+4, 0x10080404); + rtw_write32(Adapter, REG_RARFRC, 0x04030201); + rtw_write32(Adapter, REG_RARFRC+4, 0x08070605); + +} + + +static VOID +_InitEDCA( + IN PADAPTER Adapter + ) +{ + // Set Spec SIFS (used in NAV) + rtw_write16(Adapter,REG_SPEC_SIFS, 0x100a); + rtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a); + + // Set SIFS for CCK + rtw_write16(Adapter,REG_SIFS_CTX, 0x100a); + + // Set SIFS for OFDM + rtw_write16(Adapter,REG_SIFS_TRX, 0x100a); + + // TXOP + rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B); + rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F); + rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324); + rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226); +} + + +static VOID +_InitBeaconMaxError( + IN PADAPTER Adapter, + IN BOOLEAN InfraMode + ) +{ +#ifdef RTL8192CU_ADHOC_WORKAROUND_SETTING + rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); +#else + //rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10)); +#endif +} + + +#ifdef CONFIG_LED +static void _InitHWLed(PADAPTER Adapter) +{ + struct led_priv *pledpriv = &(Adapter->ledpriv); + + if( pledpriv->LedStrategy != HW_LED) + return; + +// HW led control +// to do .... +//must consider the situation which case of antenna diversity/ commbo card/solo card/mini card + +} +#endif //CONFIG_LED + +static VOID +_InitRDGSetting( + IN PADAPTER Adapter + ) +{ + rtw_write8(Adapter,REG_RD_CTRL,0xFF); + rtw_write16(Adapter, REG_RD_NAV_NXT, 0x200); + rtw_write8(Adapter,REG_RD_RESP_PKT_TH,0x05); +} + +static VOID +_InitRxSetting( + IN PADAPTER Adapter + ) +{ + rtw_write32(Adapter, REG_MACID, 0x87654321); + rtw_write32(Adapter, 0x0700, 0x87654321); +} + +static VOID +_InitRetryFunction( + IN PADAPTER Adapter + ) +{ + u8 value8; + + value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); + value8 |= EN_AMPDU_RTY_NEW; + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); + + // Set ACK timeout + rtw_write8(Adapter, REG_ACKTO, 0x40); +} + +/*----------------------------------------------------------------------------- + * Function: usb_AggSettingTxUpdate() + * + * Overview: Seperate TX/RX parameters update independent for TP detection and + * dynamic TX/RX aggreagtion parameters update. + * + * Input: PADAPTER + * + * Output/Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Seperate to smaller function. + * + *---------------------------------------------------------------------------*/ +static VOID +usb_AggSettingTxUpdate( + IN PADAPTER Adapter + ) +{ +#ifdef CONFIG_USB_TX_AGGREGATION + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u32 value32; + + if(Adapter->registrypriv.wifi_spec) + pHalData->UsbTxAggMode = _FALSE; + + if(pHalData->UsbTxAggMode){ + value32 = rtw_read32(Adapter, REG_TDECTRL); + value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); + value32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT); + + rtw_write32(Adapter, REG_TDECTRL, value32); + } + +#endif +} // usb_AggSettingTxUpdate + + +/*----------------------------------------------------------------------------- + * Function: usb_AggSettingRxUpdate() + * + * Overview: Seperate TX/RX parameters update independent for TP detection and + * dynamic TX/RX aggreagtion parameters update. + * + * Input: PADAPTER + * + * Output/Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Seperate to smaller function. + * + *---------------------------------------------------------------------------*/ +static VOID +usb_AggSettingRxUpdate( + IN PADAPTER Adapter + ) +{ +#ifdef CONFIG_USB_RX_AGGREGATION + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u8 valueDMA; + u8 valueUSB; + + valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL); + valueUSB = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); + + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + valueDMA |= RXDMA_AGG_EN; + valueUSB &= ~USB_AGG_EN; + break; + case USB_RX_AGG_USB: + valueDMA &= ~RXDMA_AGG_EN; + valueUSB |= USB_AGG_EN; + break; + case USB_RX_AGG_MIX: + valueDMA |= RXDMA_AGG_EN; + valueUSB |= USB_AGG_EN; + break; + case USB_RX_AGG_DISABLE: + default: + valueDMA &= ~RXDMA_AGG_EN; + valueUSB &= ~USB_AGG_EN; + break; + } + + rtw_write8(Adapter, REG_TRXDMA_CTRL, valueDMA); + rtw_write8(Adapter, REG_USB_SPECIAL_OPTION, valueUSB); + + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount); + rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout); + break; + case USB_RX_AGG_USB: + rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount); + rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout); + break; + case USB_RX_AGG_MIX: + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount); + rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout); + rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount); + rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout); + break; + case USB_RX_AGG_DISABLE: + default: + // TODO: + break; + } + + switch(PBP_128) + { + case PBP_128: + pHalData->HwRxPageSize = 128; + break; + case PBP_64: + pHalData->HwRxPageSize = 64; + break; + case PBP_256: + pHalData->HwRxPageSize = 256; + break; + case PBP_512: + pHalData->HwRxPageSize = 512; + break; + case PBP_1024: + pHalData->HwRxPageSize = 1024; + break; + default: + //RT_ASSERT(FALSE, ("RX_PAGE_SIZE_REG_VALUE definition is incorrect!\n")); + break; + } +#endif +} // usb_AggSettingRxUpdate + +static VOID +InitUsbAggregationSetting( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // Tx aggregation setting + usb_AggSettingTxUpdate(Adapter); + + // Rx aggregation setting + usb_AggSettingRxUpdate(Adapter); + + // 201/12/10 MH Add for USB agg mode dynamic switch. + pHalData->UsbRxHighSpeedMode = _FALSE; +} + +/*----------------------------------------------------------------------------- + * Function: USB_AggModeSwitch() + * + * Overview: When RX traffic is more than 40M, we need to adjust some parameters to increase + * RX speed by increasing batch indication size. This will decrease TCP ACK speed, we + * need to monitor the influence of FTP/network share. + * For TX mode, we are still ubder investigation. + * + * Input: PADAPTER + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +VOID +USB_AggModeSwitch( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + //pHalData->UsbRxHighSpeedMode = FALSE; + // How to measure the RX speed? We assume that when traffic is more than + if (pMgntInfo->bRegAggDMEnable == _FALSE) + { + return; // Inf not support. + } + + + if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _TRUE && + pHalData->UsbRxHighSpeedMode == _FALSE) + { + pHalData->UsbRxHighSpeedMode = _TRUE; + DBG_8192C("UsbAggModeSwitchCheck to HIGH\n"); + } + else if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _FALSE && + pHalData->UsbRxHighSpeedMode == _TRUE) + { + pHalData->UsbRxHighSpeedMode = _FALSE; + DBG_8192C("UsbAggModeSwitchCheck to LOW\n"); + } + else + { + return; + } + + // 2010/12/10 MH Add for USB Aggregation judgement we need to + //if( pMgntInfo->LinkDetectInfo.NumRxOkInPeriod > 4000 || + // pMgntInfo->LinkDetectInfo.NumTxOkInPeriod > 4000 ) + +#ifdef CONFIG_USB_TX_AGGREGATION + //usb_AggSettingTxUpdate(Adapter); +#endif + +#ifdef CONFIG_USB_RX_AGGREGATION + if (pHalData->UsbRxHighSpeedMode == _TRUE) + { + // 2010/12/10 MH The parameter is tested by SD1 engineer and SD3 channel emulator. + // USB mode + pHalData->UsbRxAggBlockCount = 40; + pHalData->UsbRxAggBlockTimeout = 5; + // Mix mode + pHalData->UsbRxAggPageCount = 72; + pHalData->UsbRxAggPageTimeout = 6; + } + else + { + // USB mode + pHalData->UsbRxAggBlockCount = pMgntInfo->RegUsbRxAggBlockCount; + pHalData->UsbRxAggBlockTimeout = pMgntInfo->RegUsbRxAggBlockTimeout; + // Mix mode + pHalData->UsbRxAggPageCount = pMgntInfo->RegUsbRxAggPageCount; + pHalData->UsbRxAggPageTimeout = pMgntInfo->RegUsbRxAggPageTimeout; + } +#endif +#endif +} // USB_AggModeSwitch + +static VOID +_InitOperationMode( + IN PADAPTER Adapter + ) +{ +#if 0//gtest + PHAL_DATA_8192CUSB pHalData = GetHalData8192CUsb(Adapter); + u1Byte regBwOpMode = 0; + u4Byte regRATR = 0, regRRSR = 0; + + + //1 This part need to modified according to the rate set we filtered!! + // + // Set RRSR, RATR, and REG_BWOPMODE registers + // + switch(Adapter->RegWirelessMode) + { + case WIRELESS_MODE_B: + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK; + regRRSR = RATE_ALL_CCK; + break; + case WIRELESS_MODE_A: + ASSERT(FALSE); +#if 0 + regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ; + regRATR = RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_OFDM_AG; +#endif + break; + case WIRELESS_MODE_G: + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + break; + case WIRELESS_MODE_AUTO: + if (Adapter->bInHctTest) + { + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + } + else + { + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + } + break; + case WIRELESS_MODE_N_24G: + // It support CCK rate by default. + // CCK rate will be filtered out only when associated AP does not support it. + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + break; + case WIRELESS_MODE_N_5G: + ASSERT(FALSE); +#if 0 + regBwOpMode = BW_OPMODE_5G; + regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_OFDM_AG; +#endif + break; + } + + // Ziv ???????? + //PlatformEFIOWrite4Byte(Adapter, REG_INIRTS_RATE_SEL, regRRSR); + PlatformEFIOWrite1Byte(Adapter, REG_BWOPMODE, regBwOpMode); + + // For Min Spacing configuration. + switch(pHalData->RF_Type) + { + case RF_1T2R: + case RF_1T1R: + RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter: RF_Type%s\n", (pHalData->RF_Type==RF_1T1R? "(1T1R)":"(1T2R)"))); + Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3); + break; + case RF_2T2R: + case RF_2T2R_GREEN: + RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter:RF_Type(2T2R)\n")); + Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3); + break; + } + + PlatformEFIOWrite1Byte(Adapter, REG_AMPDU_MIN_SPACE, Adapter->MgntInfo.MinSpaceCfg); +#endif +} + + + static VOID +_InitBeaconParameters( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); + + // TODO: Remove these magic number + rtw_write16(Adapter, REG_TBTT_PROHIBIT,0x6404);// ms + rtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME);// 5ms + rtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME); // 2ms + + // Suggested by designer timchen. Change beacon AIFS to the largest number + // beacause test chip does not contension before sending beacon. by tynli. 2009.11.03 + if(IS_NORMAL_CHIP( pHalData->VersionID)){ + rtw_write16(Adapter, REG_BCNTCFG, 0x660F); + } + else{ + rtw_write16(Adapter, REG_BCNTCFG, 0x66FF); + } + +} + +static VOID +_InitRFType( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregpriv = &Adapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN is92CU = IS_92C_SERIAL(pHalData->VersionID); + +#if DISABLE_BB_RF + pHalData->rf_chip = RF_PSEUDO_11N; + return; +#endif + + pHalData->rf_chip = RF_6052; + + if(_FALSE == is92CU){ + pHalData->rf_type = RF_1T1R; + //DBG_8192C("Set RF Chip ID to RF_6052 and RF type to 1T1R.\n"); + return; + } + + // TODO: Consider that EEPROM set 92CU to 1T1R later. + // Force to overwrite setting according to chip version. Ignore EEPROM setting. + //pHalData->RF_Type = is92CU ? RF_2T2R : RF_1T1R; + //MSG_8192C("Set RF Chip ID to RF_6052 and RF type to %d.\n", pHalData->rf_type); + +} + +static VOID _InitAdhocWorkaroundParams(IN PADAPTER Adapter) +{ +#if RTL8192CU_ADHOC_WORKAROUND_SETTING + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL); + pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); + pHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); + pHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2); +#endif +} + +static VOID +_BeaconFunctionEnable( + IN PADAPTER Adapter, + IN BOOLEAN Enable, + IN BOOLEAN Linked + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 value8 = 0; + + //value8 = Enable ? (EN_BCN_FUNCTION | EN_TXBCN_RPT) : EN_BCN_FUNCTION; + + if(_FALSE == Linked){ + if(IS_NORMAL_CHIP( pHalData->VersionID)){ + value8 |= DIS_TSF_UDT0_NORMAL_CHIP; + } + else{ + value8 |= DIS_TSF_UDT0_TEST_CHIP; + } + } + + rtw_write8(Adapter, REG_BCN_CTRL, value8); +#else + rtw_write8(Adapter, REG_BCN_CTRL, (BIT4 | BIT3 | BIT1)); + //SetBcnCtrlReg(Adapter, (BIT4 | BIT3 | BIT1), 0x00); + //RT_TRACE(COMP_BEACON, DBG_LOUD, ("_BeaconFunctionEnable 0x550 0x%x\n", PlatformEFIORead1Byte(Adapter, 0x550))); + + rtw_write8(Adapter, REG_RD_CTRL+1, 0x6F); +#endif +} + + +// Set CCK and OFDM Block "ON" +static VOID _BBTurnOnBlock( + IN PADAPTER Adapter + ) +{ +#if (DISABLE_BB_RF) + return; +#endif + + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1); + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1); +} + +static VOID _RfPowerSave( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u1Byte eRFPath; + +#if (DISABLE_BB_RF) + return; +#endif + + if(pMgntInfo->RegRfOff == TRUE){ // User disable RF via registry. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\n")); + MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW); + // Those action will be discard in MgntActSet_RF_State because off the same state + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0); + } + else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS){ // H/W or S/W RF OFF before sleep. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\n", pMgntInfo->RfOffReason)); + MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason); + } + else{ + pHalData->eRFPowerState = eRfOn; + pMgntInfo->RfOffReason = 0; + if(Adapter->bInSetPower || Adapter->bResetInProgress) + PlatformUsbEnableInPipes(Adapter); + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): RF is on.\n")); + } +#endif +} + +enum { + Antenna_Lfet = 1, + Antenna_Right = 2, +}; + +static VOID +_InitAntenna_Selection(IN PADAPTER Adapter) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(pHalData->AntDivCfg==0) + return; + DBG_8192C("==> %s ....\n",__FUNCTION__); + + if((RF_1T1R == pHalData->rf_type)) + { + rtw_write32(Adapter, REG_LEDCFG0, rtw_read32(Adapter, REG_LEDCFG0)|BIT23); + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + + if(PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == Antenna_A) + pHalData->CurAntenna = Antenna_A; + else + pHalData->CurAntenna = Antenna_B; + DBG_8192C("%s,Cur_ant:(%x)%s\n",__FUNCTION__,pHalData->CurAntenna,(pHalData->CurAntenna == Antenna_A)?"Antenna_A":"Antenna_B"); + +} + + +} +// +// 2010/08/09 MH Add for power down check. +// +static BOOLEAN +HalDetectPwrDownMode( + IN PADAPTER Adapter + ) +{ + u8 tmpvalue; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + + EFUSE_ShadowRead(Adapter, 1, EEPROM_RF_OPT3, (u32 *)&tmpvalue); + + // 2010/08/25 MH INF priority > PDN Efuse value. + if(tmpvalue & BIT4 && pwrctrlpriv->reg_pdnmode) + { + pHalData->pwrdown = _TRUE; + } + else + { + pHalData->pwrdown = _FALSE; + } + + DBG_8192C("HalDetectPwrDownMode(): PDN=%d\n", pHalData->pwrdown); + return pHalData->pwrdown; + +} // HalDetectPwrDownMode + + +// +// 2010/08/26 MH Add for selective suspend mode check. +// If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and +// slim card. +// +static VOID +HalDetectSelectiveSuspendMode( + IN PADAPTER Adapter + ) +{ + u8 tmpvalue; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dvobj_priv *pdvobjpriv = &Adapter->dvobjpriv; + + // If support HW radio detect, we need to enable WOL ability, otherwise, we + // can not use FW to notify host the power state switch. + + EFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue); + + DBG_8192C("HalDetectSelectiveSuspendMode(): SS "); + if(tmpvalue & BIT1) + { + DBG_8192C("Enable\n"); + } + else + { + DBG_8192C("Disable\n"); + pdvobjpriv->RegUsbSS = _FALSE; + } + + // 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode. + if (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData)) + { + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + + //if (!pMgntInfo->bRegDongleSS) + //{ + // RT_TRACE(COMP_INIT, DBG_LOUD, ("Dongle disable SS\n")); + pdvobjpriv->RegUsbSS = _FALSE; + //} + } +} // HalDetectSelectiveSuspendMode +/*----------------------------------------------------------------------------- + * Function: HwSuspendModeEnable92Cu() + * + * Overview: HW suspend mode switch. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 08/23/2010 MHC HW suspend mode switch test.. + *---------------------------------------------------------------------------*/ +static VOID +HwSuspendModeEnable92Cu( + IN PADAPTER pAdapter, + IN u8 Type + ) +{ + //PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(pAdapter); + u16 reg = rtw_read16(pAdapter, REG_GPIO_MUXCFG); + + //if (!pDevice->RegUsbSS) + { + return; + } + + // + // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW + // to enter suspend mode automatically. Otherwise, it will shut down major power + // domain and 8051 will stop. When we try to enter selective suspend mode, we + // need to prevent HW to enter D2 mode aumotmatically. Another way, Host will + // issue a S10 signal to power domain. Then it will cleat SIC setting(from Yngli). + // We need to enable HW suspend mode when enter S3/S4 or disable. We need + // to disable HW suspend mode for IPS/radio_off. + // + //RT_TRACE(COMP_RF, DBG_LOUD, ("HwSuspendModeEnable92Cu = %d\n", Type)); + if (Type == _FALSE) + { + reg |= BIT14; + //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg)); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + reg |= BIT12; + //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg)); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + } + else + { + reg &= (~BIT12); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + reg &= (~BIT14); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + } + +} // HwSuspendModeEnable92Cu +rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 val8; + rt_rf_power_state rfpowerstate = rf_off; + + if(pAdapter->pwrctrlpriv.bHWPowerdown) + { + val8 = rtw_read8(pAdapter, REG_HSISR); + DBG_8192C("pwrdown, 0x5c(BIT7)=%02x\n", val8); + rfpowerstate = (val8 & BIT7) ? rf_off: rf_on; + } + else // rf on/off + { + rtw_write8( pAdapter, REG_MAC_PINMUX_CFG,rtw_read8(pAdapter, REG_MAC_PINMUX_CFG)&~(BIT3)); + val8 = rtw_read8(pAdapter, REG_GPIO_IO_SEL); + DBG_8192C("GPIO_IN=%02x\n", val8); + rfpowerstate = (val8 & BIT3) ? rf_on : rf_off; + } + return rfpowerstate; +} // HalDetectPwrDownMode +#ifdef SUPPORT_HW_RFOFF_DETECTED +void _ps_open_RF(_adapter *padapter); +#endif + +u32 rtl8192cu_hal_init(PADAPTER Adapter) +{ + u8 val8 = 0; + u32 boundary, status = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u8 isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + u8 is92C = IS_92C_SERIAL(pHalData->VersionID); + rt_rf_power_state eRfPowerStateToSet; +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + + u32 init_start_time = rtw_get_current_time(); + +_func_enter_; + +#ifdef SUPPORT_HW_RFOFF_DETECTED + if(Adapter->pwrctrlpriv.bkeepfwalive) + { + _ps_open_RF(Adapter); + + if(pHalData->bIQKInitialized ){ + rtl8192c_PHY_IQCalibrate(Adapter,_TRUE); + } + else{ + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); + pHalData->bIQKInitialized = _TRUE; + } + rtl8192c_dm_CheckTXPowerTracking(Adapter); + rtl8192c_PHY_LCCalibrate(Adapter); + + goto exit; + } +#endif + + status = _InitPowerOn(Adapter); + if(status == _FAIL){ + RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init power on!\n")); + goto exit; + } + + if(!pregistrypriv->wifi_spec){ + boundary = TX_PAGE_BOUNDARY; + } + else{// for WMM + boundary = (IS_NORMAL_CHIP(pHalData->VersionID)) ?WMM_NORMAL_TX_PAGE_BOUNDARY + :WMM_TEST_TX_PAGE_BOUNDARY; + } + + status = InitLLTTable(Adapter, boundary); + if(status == _FAIL){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to init power on!\n")); + goto exit; + } + + _InitQueueReservedPage(Adapter); + _InitTxBufferBoundary(Adapter); + _InitQueuePriority(Adapter); + _InitPageBoundary(Adapter); + _InitTransferPageSize(Adapter); + + +#if ENABLE_USB_DROP_INCORRECT_OUT + _InitHardwareDropIncorrectBulkOut(Adapter); +#endif + + if(pHalData->bRDGEnable){ + _InitRDGSetting(Adapter); + } + +#if (1 == MP_DRIVER) + _InitRxSetting(Adapter); + // Don't Download Firmware + Adapter->bFWReady = _FALSE; +#elif RTL8192CU_FW_DOWNLOAD_ENABLE + status = FirmwareDownload92C(Adapter); + if(status == _FAIL) + { + + Adapter->bFWReady = _FALSE; + + pHalData->fw_ractrl = _FALSE; + + DBG_8192C("fw download fail!\n"); + + goto exit; + } + else + { + + Adapter->bFWReady = _TRUE; + + pHalData->fw_ractrl = _TRUE; + + DBG_8192C("fw download ok!\n"); + } +#endif + + InitializeFirmwareVars92C(Adapter); + + if(pwrctrlpriv->reg_rfoff == _TRUE){ + pwrctrlpriv->rf_pwrstate = rf_off; + } + + // 2010/08/09 MH We need to check if we need to turnon or off RF after detecting + // HW GPIO pin. Before PHY_RFConfig8192C. + //HalDetectPwrDownMode(Adapter); + // 2010/08/26 MH If Efuse does not support sective suspend then disable the function. + //HalDetectSelectiveSuspendMode(Adapter); + + + // Set RF type for BB/RF configuration + _InitRFType(Adapter);//->_ReadRFType() + + // Save target channel + // Current Channel will be updated again later. + pHalData->CurrentChannel = 6;//default set to 6 + +#if (HAL_MAC_ENABLE == 1) + status = PHY_MACConfig8192C(Adapter); + if(status == _FAIL) + { + goto exit; + } +#endif + // Get Rx PHY status in order to report RSSI and others. + _InitDriverInfoSize(Adapter, DRVINFO_SZ); + + _InitInterrupt(Adapter); + _InitID(Adapter);//set mac_address + _InitNetworkType(Adapter);//set msr + _InitWMACSetting(Adapter); + _InitAdaptiveCtrl(Adapter); + _InitEDCA(Adapter); + _InitRateFallback(Adapter); + _InitRetryFunction(Adapter); + InitUsbAggregationSetting(Adapter); + _InitOperationMode(Adapter);//todo + _InitBeaconParameters(Adapter); + _InitBeaconMaxError(Adapter, _TRUE); + +#ifdef CONFIG_LED + _InitHWLed(Adapter); +#endif //CONFIG_LED + + // + //d. Initialize BB related configurations. + // +#if (HAL_BB_ENABLE == 1) + status = PHY_BBConfig8192C(Adapter); + if(status == _FAIL) + { + goto exit; + } +#endif + + // 92CU use 3-wire to r/w RF + //pHalData->Rf_Mode = RF_OP_By_SW_3wire; + +#if (HAL_RF_ENABLE == 1) + status = PHY_RFConfig8192C(Adapter); + if(status == _FAIL) + { + goto exit; + } + + if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID)) + { + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_RX_G1, bMaskDWord, 0x30255); + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_RX_G2, bMaskDWord, 0x50a00); + } +#endif + + // + // Joseph Note: Keep RfRegChnlVal for later use. + // + pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(Adapter, (RF90_RADIO_PATH_E)0, RF_CHNLBW, bRFRegOffsetMask); + pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(Adapter, (RF90_RADIO_PATH_E)1, RF_CHNLBW, bRFRegOffsetMask); + + _BBTurnOnBlock(Adapter); + //NicIFSetMacAddress(padapter, padapter->PermanentAddress); + + invalidate_cam_all(Adapter); + + // 2010/12/17 MH We need to set TX power according to EFUSE content at first. + PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel); + +// Move by Neo for USB SS to below setp +//_RfPowerSave(Adapter); + + if (!IS_92C_SERIAL( pHalData->VersionID) && (pHalData->AntDivCfg!=0)) + { //for 88CU ,1T1R + _InitAntenna_Selection(Adapter); + } + + + // + // Disable BAR, suggested by Scott + // 2010.04.09 add by hpfan + // + rtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff); + + // HW SEQ CTRL + //set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. + rtw_write8(Adapter,REG_HWSEQ_CTRL, 0xFF); + + if(pregistrypriv->wifi_spec) + rtw_write16(Adapter,REG_FAST_EDCA_CTRL ,0); + +#if (MP_DRIVER == 1) + Adapter->mppriv.channel = pHalData->CurrentChannel; + MPT_InitializeAdapter(Adapter, Adapter->mppriv.channel); +#else + + + // + // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status + // and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not + // call init_adapter. May cause some problem?? + // + // Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed + // in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState + // is the same as eRfOff, we should change it to eRfOn after we config RF parameters. + // Added by tynli. 2010.03.30. + pwrctrlpriv->rf_pwrstate = rf_on; + +#if 0 //to do + RT_CLEAR_PS_LEVEL(pwrctrlpriv, RT_RF_OFF_LEVL_HALT_NIC); +#if 1 //Todo + // 20100326 Joseph: Copy from GPIOChangeRFWorkItemCallBack() function to check HW radio on/off. + // 20100329 Joseph: Revise and integrate the HW/SW radio off code in initialization. + + eRfPowerStateToSet = (rt_rf_power_state) RfOnOffDetect(Adapter); + pwrctrlpriv->rfoff_reason |= eRfPowerStateToSet==rf_on ? RF_CHANGE_BY_INIT : RF_CHANGE_BY_HW; + pwrctrlpriv->rfoff_reason |= (pwrctrlpriv->reg_rfoff) ? RF_CHANGE_BY_SW : 0; + + if(pwrctrlpriv->rfoff_reason&RF_CHANGE_BY_HW) + pwrctrlpriv->b_hw_radio_off = _TRUE; + + DBG_8192C("eRfPowerStateToSet=%d\n", eRfPowerStateToSet); + + if(pwrctrlpriv->reg_rfoff == _TRUE) + { // User disable RF via registry. + DBG_8192C("InitializeAdapter8192CU(): Turn off RF for RegRfOff.\n"); + //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_SW, _TRUE); + + // Those action will be discard in MgntActSet_RF_State because off the same state + //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0); + } + else if(pwrctrlpriv->rfoff_reason > RF_CHANGE_BY_PS) + { // H/W or S/W RF OFF before sleep. + DBG_8192C(" Turn off RF for RfOffReason(%x) ----------\n", pwrctrlpriv->rfoff_reason); + //pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; + pwrctrlpriv->rf_pwrstate = rf_on; + //MgntActSet_RF_State(Adapter, rf_off, pwrctrlpriv->rfoff_reason, _TRUE); + } + else + { + // Perform GPIO polling to find out current RF state. added by Roger, 2010.04.09. + if(pHalData->BoardType == BOARD_MINICARD /*&& (Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)*/) + { + DBG_8192C("InitializeAdapter8192CU(): RF=%d \n", eRfPowerStateToSet); + if (eRfPowerStateToSet == rf_off) + { + //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_HW, _TRUE); + pwrctrlpriv->b_hw_radio_off = _TRUE; + } + else + { + pwrctrlpriv->rf_pwrstate = rf_off; + pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; + pwrctrlpriv->b_hw_radio_off = _FALSE; + //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE); + } + } + else + { + pwrctrlpriv->rf_pwrstate = rf_off; + pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; + //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE); + } + + pwrctrlpriv->rfoff_reason = 0; + pwrctrlpriv->b_hw_radio_off = _FALSE; + pwrctrlpriv->rf_pwrstate = rf_on; + rtw_led_control(Adapter, LED_CTL_POWER_ON); + + } + + // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. + // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. + if(pHalData->pwrdown && eRfPowerStateToSet == rf_off) + { + // Enable register area 0x0-0xc. + rtw_write8(Adapter, REG_RSV_CTRL, 0x0); + + // + // We should configure HW PDn source for WiFi ONLY, and then + // our HW will be set in power-down mode if PDn source from all functions are configured. + // 2010.10.06. + // + //if(IS_HARDWARE_TYPE_8723U(Adapter)) + //{ + // u1bTmp = rtw_read8(Adapter, REG_MULTI_FUNC_CTRL); + // rtw_write8(Adapter, REG_MULTI_FUNC_CTRL, (u1bTmp|WL_HWPDN_EN)); + //} + //else + //{ + rtw_write16(Adapter, REG_APS_FSMCO, 0x8812); + //} + } + //DrvIFIndicateCurrentPhyStatus(Adapter); // 2010/08/17 MH Disable to prevent BSOD. +#endif +#endif + // 2010/08/26 MH Merge from 8192CE. + if(pwrctrlpriv->rf_pwrstate == rf_on) + { + if(pHalData->bIQKInitialized ){ + rtl8192c_PHY_IQCalibrate(Adapter,_TRUE); + } + else + { + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); + pHalData->bIQKInitialized = _TRUE; + } + rtl8192c_dm_CheckTXPowerTracking(Adapter); + rtl8192c_PHY_LCCalibrate(Adapter); + } + +#endif /* #if (MP_DRIVER == 1) */ + +#if RTL8192CU_ADHOC_WORKAROUND_SETTING + _InitAdhocWorkaroundParams(Adapter); +#endif + + +#ifdef USB_INTERFERENCE_ISSUE + //fixed USB interface interference issue + rtw_write8(Adapter, 0xfe40, 0xe0); + rtw_write8(Adapter, 0xfe41, 0x8d); + rtw_write8(Adapter, 0xfe42, 0x80); + rtw_write32(Adapter,0x20c,0xfd0320); +#if 1 + //2011/01/07 ,suggest by Johnny,for solved the problem that too many protocol error on USB bus + if(!IS_VENDOR_UMC_A_CUT(pHalData->VersionID) )//&& !IS_92C_SERIAL(pHalData->VersionID))// TSMC , 8188 + { + // 0xE6=0x94 + rtw_write8(Adapter, 0xFE40, 0xE6); + rtw_write8(Adapter, 0xFE41, 0x94); + rtw_write8(Adapter, 0xFE42, 0x80); + + // 0xE0=0x19 + rtw_write8(Adapter, 0xFE40, 0xE0); + rtw_write8(Adapter, 0xFE41, 0x19); + rtw_write8(Adapter, 0xFE42, 0x80); + + // 0xE5=0x91 + rtw_write8(Adapter, 0xFE40, 0xE5); + rtw_write8(Adapter, 0xFE41, 0x91); + rtw_write8(Adapter, 0xFE42, 0x80); + + // 0xE2=0x81 + rtw_write8(Adapter, 0xFE40, 0xE2); + rtw_write8(Adapter, 0xFE41, 0x81); + rtw_write8(Adapter, 0xFE42, 0x80); + + } + +#endif +#endif //USB_INTERFERENCE_ISSUE + + _InitPABias(Adapter); + +#ifdef CONFIG_BT_COEXIST + _InitBTCoexist(Adapter); +#endif + + rtl8192c_InitHalDm(Adapter); + + // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter + // suspend mode automatically. + //HwSuspendModeEnable92Cu(Adapter, _FALSE); + + rtw_write8(Adapter, 0x15, 0xe9);//suggest by Johnny for lower temperature + //_dbg_dump_macreg(padapter); + + //misc + { + int i; + u8 mac_addr[6]; + for(i=0; i<6; i++) + { + mac_addr[i] = rtw_read8(Adapter, REG_MACID+i); + } + + //DBG_8192C("MAC Address from REG_MACID = "MAC_FMT"\n", MAC_ARG(mac_addr)); + } + +exit: + + //DBG_871X("%s in %dms\n", __FUNCTION__, rtw_get_passing_time_ms(init_start_time)); + +_func_exit_; + + return status; +} + + + + +#ifdef SUPPORT_HW_RFOFF_DETECTED +// 1 = original SS power ver 2 = Improved pwr version. +// We will provide several power consumption type for user to use. +#define CU_SS_MODE 1 + +void _ps_open_RF(_adapter *padapter) +{ + + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + DBG_8192C("==> %s \n",__FUNCTION__); +#if (CU_SS_MODE == 1) + // 1. Enable MAC Clock + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); + //delay_us(WAIT_US_WRITE_POWERON); + + // 2. Force PWM, Enable SPS18_LDO_Marco_Block + rtw_write8(padapter, REG_SPS0_CTRL, rtw_read8(padapter,REG_SPS0_CTRL) | (BIT(0)|BIT(3))); + //delay_us(WAIT_US_WRITE_POWERON); + + // 3. restore BB, AFE control register. + //RF + //PHY_SetBBReg(padapter,rFPGA0_XAB_RFParameter,bMaskDWord, pwrpriv->PS_BBRegBackup[PSBBREG_RF0]); + //PHY_SetBBReg(padapter,rOFDM0_TRxPathEnable, bMaskDWord,pwrpriv->PS_BBRegBackup[PSBBREG_RF1]); + //PHY_SetBBReg(padapter,rFPGA0_RFMOD, bMaskDWord,pwrpriv->PS_BBRegBackup[PSBBREG_RF2]); + + if (pHalData->rf_type== RF_2T2R) + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 1); + else + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 1); + + PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 1); + PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1, 0); + + + //AFE + //PHY_SetBBReg(padapter,0x0e70, bMaskDWord,pwrpriv->PS_BBRegBackup[PSBBREG_AFE0]); + PHY_SetBBReg(padapter, 0x0e70, bMaskDWord ,0x631B25A0 ); + + // 4. issue 3-wire command that RF set to Rx idle mode. + // We can only prvide a usual value instead and then HW will modify the value by itself. + PHY_SetRFReg(padapter,RF90_PATH_A, 0,bMaskDWord, 0x32D95); + if ( pHalData->rf_type == RF_2T2R ) + PHY_SetRFReg(padapter,RF90_PATH_B, 0, bMaskDWord,0x32D95); + +#elif (CU_SS_MODE == 2) + + //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL + rtw_write8(padapter, REG_AFE_PLL_CTRL, 0x81); + + // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK + rtw_write16(padapter, REG_AFE_XTAL_CTRL, 0x800F); + rtw_mdelay_os(1); + + // 1. Enable MAC Clock. Can not be enabled now. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); + + // 2. Force PWM, Enable SPS18_LDO_Marco_Block + rtw_write8(padapter, REG_SPS0_CTRL,rtw_read8(padapter, REG_SPS0_CTRL) | (BIT0|BIT3)); + + // 3. restore BB, AFE control register. + //RF + if (pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 1); + else + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 1); + + PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 1); + PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1, 0); + + //AFE + PHY_SetBBReg(padapter, 0x0e70, bMaskDWord ,0x631B25A0 ); + + // 4. issue 3-wire command that RF set to Rx idle mode. This is used to re-write the RX idle mode. + // We can only prvide a usual value instead and then HW will modify the value by itself. + PHY_SetRFReg(padapter,RF90_PATH_A, 0, bRFRegOffsetMask,0x32D95); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetRFReg(padapter,RF90_PATH_B, 0, bRFRegOffsetMask,0x32D95); + } + + // 5. gated MAC Clock + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); + //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)|(BIT3)); + + { + u8 eRFPath = RF90_PATH_A,value8 = 0, u1bTmp, bytetmp, retry = 0; + + //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); + // 2010/08/12 MH Add for B path under SS test. + //if (pHalData->rf_type == RF_2T2R) + //PHY_SetRFReg(Adapter, RF90_PATH_B, 0x0, bMaskByte0, 0x0); + + bytetmp = rtw_read8(padapter, REG_APSD_CTRL); + rtw_write8(padapter, REG_APSD_CTRL, bytetmp & ~BIT6); + + rtw_mdelay_os(10); + + // Set BB reset at first + rtw_write8(padapter, REG_SYS_FUNC_EN, 0x17 );//0x16 + + // Enable TX + rtw_write8(padapter, REG_TXPAUSE, 0x0); + } + //Adapter->HalFunc.InitializeAdapterHandler(Adapter, Adapter->MgntInfo.dot11CurrentChannelNumber); + //CardSelectiveSuspendLeave(Adapter); +#endif + +} + + + +void _ps_close_RF(_adapter *padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 value8; + DBG_8192C("==> %s \n",__FUNCTION__); + +#if (CU_SS_MODE == 1) + // 1. Set BB/RF to shutdown. + // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving + // (2) Reg878[21:19]= 0 //Turn off RF-B + // (3) RegC04[7:4]= 0 // turn off all paths for packet detection + // (4) Reg800[1] = 1 // enable preamble power saving + pwrpriv->PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(padapter,rFPGA0_XAB_RFParameter, bMaskDWord); + pwrpriv->PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(padapter,rOFDM0_TRxPathEnable, bMaskDWord); + pwrpriv->PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(padapter,rFPGA0_RFMOD, bMaskDWord); + + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 0); + } + else if (pHalData->rf_type == RF_1T1R) + { + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 0); + } + PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 0); + PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1,1); + + // 2 .AFE control register to power down. bit[30:22] + pwrpriv->PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(padapter,0x0e70, bMaskDWord); + PHY_SetBBReg(padapter,0x0e70,bMaskDWord,0x001B25A0); + + // 3. issue 3-wire command that RF set to power down. + PHY_SetRFReg(padapter,RF90_PATH_A, 0, bMaskDWord, 0); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetRFReg(padapter,RF90_PATH_B, 0, bRFRegOffsetMask,0); + } + + // 4. Force PFM , disable SPS18_LDO_Marco_Block + //rtw_write8(padapter,REG_SPS0_CTRL,rtw_read8(padapter,REG_SPS0_CTRL) & ~(BIT(0)|BIT(3))); + value8 = rtw_read8(padapter,REG_SPS0_CTRL) ; + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) + value8 &= ~(BIT0);//PWM + else + value8 &= ~(BIT0|BIT3);//PFM + + rtw_write8(padapter, REG_SPS0_CTRL, value8 ); + + + + // 5. gated MAC Clock + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); + //delay_us(WAIT_US_WRITE_POWERON); + + // 6. Because Alfred said that USB SS mode will cause the power domain to being shut down. All the + // 8051 function will be turned off. So we need to prevent the situation. Designer provide three ways + // for us to test. But only one WOL can work now. + // Solution A: Enable WOL + rtw_write8(padapter, 0x690, rtw_read8(padapter, 0x690)|BIT1); + +#elif (CU_SS_MODE == 2) + { + u8 eRFPath = RF90_PATH_A,value8 = 0, u1bTmp; + rtw_write8(padapter, REG_TXPAUSE, 0xFF); + PHY_SetRFReg(padapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); + // 2010/08/12 MH Add for B path under SS test. + //if (pHalData->rf_type == RF_2T2R) + //PHY_SetRFReg(Adapter, RF90_PATH_B, 0x0, bMaskByte0, 0x0); + + value8 |= APSDOFF; + rtw_write8(padapter,REG_APSD_CTRL, value8);//0x40 + + // After switch APSD, we need to delay for stability + rtw_mdelay_os(10); + + // Set BB reset at first + value8 = 0 ; + value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn); + rtw_write8(padapter, REG_SYS_FUNC_EN,value8 );//0x16 + } + + // Disable RF and BB only for SelectSuspend. + + // 1. Set BB/RF to shutdown. + // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving + // (2)Reg878[21:19]= 0 //Turn off RF-B + // (3) RegC04[7:4]= 0 // turn off all paths for packet detection + // (4) Reg800[1] = 1 // enable preamble power saving + + pwrpriv->PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(padapter, rFPGA0_XAB_RFParameter, bMaskDWord); + pwrpriv->PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(padapter, rOFDM0_TRxPathEnable, bMaskDWord); + pwrpriv->PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(padapter, rFPGA0_RFMOD, bMaskDWord); + + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 0); + } + else if (pHalData->rf_type == RF_1T1R) + { + PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 0); + } + + PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 0); + PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1,1); + + // 2 .AFE control register to power down. bit[30:22] + pwrpriv->PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(padapter, 0xe70, bMaskDWord); + PHY_SetBBReg(padapter, 0x0e70, bMaskDWord ,0x001B25A0); + + // 3. issue 3-wire command that RF set to power down. + PHY_SetRFReg(padapter,RF90_PATH_A, 0, bRFRegOffsetMask,0); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetRFReg(padapter,RF90_PATH_B, 0, bRFRegOffsetMask,0); + } + + // 4. Force PFM , disable SPS18_LDO_Marco_Block + //rtw_write8(padapter, REG_SPS0_CTRL, rtw_read8(padapter,REG_SPS0_CTRL) & ~(BIT0|BIT3)); + value8 = rtw_read8(padapter,REG_SPS0_CTRL) ; + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) + value8 &= ~(BIT0);//PWM + else + value8 &= ~(BIT0|BIT3);//PFM + + rtw_write8(padapter, REG_SPS0_CTRL, value8 ); + + //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL + rtw_write8(padapter, REG_AFE_PLL_CTRL, 0x80); + rtw_mdelay_os(1); + + // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK + rtw_write16(padapter, REG_AFE_XTAL_CTRL, 0xA80F); + + + // 5. gated MAC Clock + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); + //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)& ~(BIT3)) + + // 6. Because Alfred said that USB SS mode will cause the power domain to being shut down. All the + // 8051 function will be turned off. So we need to prevent the situation. Designer provide three ways + // for us to test. But only one WOL can work now. + // Solution A: Enable WOL + rtw_write8(padapter, 0x690,rtw_read8(padapter, 0x690)|BIT1); + +#endif +} +#endif + + + +static VOID +_DisableGPIO( + IN PADAPTER Adapter + ) +{ +/*************************************** +j. GPIO_PIN_CTRL 0x44[31:0]=0x000 // +k. Value = GPIO_PIN_CTRL[7:0] +l. GPIO_PIN_CTRL 0x44[31:0] = 0x00FF0000 | (value <<8); //write external PIN level +m. GPIO_MUXCFG 0x42 [15:0] = 0x0780 +n. LEDCFG 0x4C[15:0] = 0x8080 +***************************************/ + u8 value8; + u16 value16; + u32 value32; + + //1. Disable GPIO[7:0] + rtw_write16(Adapter, REG_GPIO_PIN_CTRL+2, 0x0000); + value32 = rtw_read32(Adapter, REG_GPIO_PIN_CTRL) & 0xFFFF00FF; + value8 = (u8) (value32&0x000000FF); + value32 |= ((value8<<8) | 0x00FF0000); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, value32); + + //2. Disable GPIO[10:8] + rtw_write8(Adapter, REG_GPIO_MUXCFG+3, 0x00); + value16 = rtw_read16(Adapter, REG_GPIO_MUXCFG+2) & 0xFF0F; + value8 = (u8) (value16&0x000F); + value16 |= ((value8<<4) | 0x0780); + rtw_write16(Adapter, REG_GPIO_MUXCFG+2, value16); + + //3. Disable LED0 & 1 + rtw_write16(Adapter, REG_LEDCFG0, 0x8080); + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable GPIO and LED.\n")); + +} //end of _DisableGPIO() + +static VOID +_ResetFWDownloadRegister( + IN PADAPTER Adapter + ) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_MCUFWDL); + value32 &= ~(MCUFWDL_EN | MCUFWDL_RDY); + rtw_write32(Adapter, REG_MCUFWDL, value32); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset FW download register.\n")); +} + + +static int +_DisableRF_AFE( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + u32 pollingCount = 0; + u8 value8; + + //disable RF/ AFE AD/DA + value8 = APSDOFF; + rtw_write8(Adapter, REG_APSD_CTRL, value8); + + +#if (RTL8192CU_ASIC_VERIFICATION) + + do + { + if(rtw_read8(Adapter, REG_APSD_CTRL) & APSDOFF_STATUS){ + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE, AD, DA Done!\n")); + break; + } + + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Failed to polling APSDOFF_STATUS done!\n")); + return _FAIL; + } + + }while(_TRUE); + +#endif + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE,AD, DA.\n")); + return rtStatus; + +} + +static VOID +_ResetBB( + IN PADAPTER Adapter + ) +{ + u16 value16; + + //reset BB + value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + value16 &= ~(FEN_BBRSTB | FEN_BB_GLB_RSTn); + rtw_write16(Adapter, REG_SYS_FUNC_EN, value16); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset BB.\n")); +} + +static VOID +_ResetMCU( + IN PADAPTER Adapter + ) +{ + u16 value16; + + // reset MCU + value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + value16 &= ~FEN_CPUEN; + rtw_write16(Adapter, REG_SYS_FUNC_EN, value16); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset MCU.\n")); +} + +static VOID +_DisableMAC_AFE_PLL( + IN PADAPTER Adapter + ) +{ + u32 value32; + + //disable MAC/ AFE PLL + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + value32 |= APDM_MAC; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + + value32 |= APFM_OFF; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable MAC, AFE PLL.\n")); +} + +static VOID +_AutoPowerDownToHostOff( + IN PADAPTER Adapter + ) +{ + u32 value32; + rtw_write8(Adapter, REG_SPS0_CTRL, 0x22); + + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + + value32 |= APDM_HOST;//card disable + rtw_write32(Adapter, REG_APS_FSMCO, value32); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Auto Power Down to Host-off state.\n")); + + // set USB suspend + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + value32 &= ~AFSM_PCIE; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + +} + +static VOID +_SetUsbSuspend( + IN PADAPTER Adapter + ) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + + // set USB suspend + value32 |= AFSM_HSUS; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + + //RT_ASSERT(0 == (rtw_read32(Adapter, REG_APS_FSMCO) & BIT(12)),("")); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Set USB suspend.\n")); + +} + +static VOID +_DisableRFAFEAndResetBB( + IN PADAPTER Adapter + ) +{ +/************************************** +a. TXPAUSE 0x522[7:0] = 0xFF //Pause MAC TX queue +b. RF path 0 offset 0x00 = 0x00 // disable RF +c. APSD_CTRL 0x600[7:0] = 0x40 +d. SYS_FUNC_EN 0x02[7:0] = 0x16 //reset BB state machine +e. SYS_FUNC_EN 0x02[7:0] = 0x14 //reset BB state machine +***************************************/ + u8 eRFPath = 0,value8 = 0; + rtw_write8(Adapter, REG_TXPAUSE, 0xFF); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); + + value8 |= APSDOFF; + rtw_write8(Adapter, REG_APSD_CTRL, value8);//0x40 + + value8 = 0 ; + value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn); + rtw_write8(Adapter, REG_SYS_FUNC_EN,value8 );//0x16 + + value8 &=( ~FEN_BB_GLB_RSTn ); + rtw_write8(Adapter, REG_SYS_FUNC_EN, value8); //0x14 + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> RF off and reset BB.\n")); +} + +static VOID +_ResetDigitalProcedure1( + IN PADAPTER Adapter, + IN BOOLEAN bWithoutHWSM + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(pHalData->FirmwareVersion <= 0x20){ + #if 0 + /***************************** + f. SYS_FUNC_EN 0x03[7:0]=0x54 // reset MAC register, DCORE + g. MCUFWDL 0x80[7:0]=0 // reset MCU ready status + ******************************/ + u4Byte value32 = 0; + PlatformIOWrite1Byte(Adapter, REG_SYS_FUNC_EN+1, 0x54); + PlatformIOWrite1Byte(Adapter, REG_MCUFWDL, 0); + #else + /***************************** + f. MCUFWDL 0x80[7:0]=0 // reset MCU ready status + g. SYS_FUNC_EN 0x02[10]= 0 // reset MCU register, (8051 reset) + h. SYS_FUNC_EN 0x02[15-12]= 5 // reset MAC register, DCORE + i. SYS_FUNC_EN 0x02[10]= 1 // enable MCU register, (8051 enable) + ******************************/ + u16 valu16 = 0; + rtw_write8(Adapter, REG_MCUFWDL, 0); + + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 & (~FEN_CPUEN)));//reset MCU ,8051 + + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN)&0x0FFF; + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 |(FEN_HWPDN|FEN_ELDR)));//reset MAC + + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + + + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 | FEN_CPUEN));//enable MCU ,8051 + + + #endif + } + else{ + u8 retry_cnts = 0; + + if(rtw_read8(Adapter, REG_MCUFWDL) & BIT1) + { //IF fw in RAM code, do reset + + rtw_write8(Adapter, REG_MCUFWDL, 0); + if(Adapter->bFWReady){ + // 2010/08/25 MH Accordign to RD alfred's suggestion, we need to disable other + // HRCV INT to influence 8051 reset. + rtw_write8(Adapter, REG_FWIMR, 0x20); + + rtw_write8(Adapter, REG_HMETFR+3, 0x20);//8051 reset by self + + while( (retry_cnts++ <100) && (FEN_CPUEN &rtw_read16(Adapter, REG_SYS_FUNC_EN))) + { + rtw_udelay_os(50);//PlatformStallExecution(50);//us + } + + if(retry_cnts >= 100){ + DBG_8192C("%s #####=> 8051 reset failed!.........................\n", __FUNCTION__); + // if 8051 reset fail we trigger GPIO 0 for LA + //PlatformEFIOWrite4Byte( Adapter, + // REG_GPIO_PIN_CTRL, + // 0x00010100); + // 2010/08/31 MH According to Filen's info, if 8051 reset fail, reset MAC directly. + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x50); //Reset MAC and Enable 8051 + rtw_mdelay_os(10); + } + else { + //DBG_871X("%s =====> 8051 reset success (%d) .\n", __FUNCTION__, retry_cnts); + } + } + else { + DBG_871X("%s =====> 8051 in RAM but !Adapter->bFWReady\n", __FUNCTION__); + } + } + else{ + //DBG_871X("%s =====> 8051 in ROM.\n", __FUNCTION__); + } + + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x54); //Reset MAC and Enable 8051 + } + + // Clear rpwm value for initial toggle bit trigger. + rtw_write8(Adapter, REG_USB_HRPWM, 0x00); + + if(bWithoutHWSM){ + /***************************** + Without HW auto state machine + g. SYS_CLKR 0x08[15:0] = 0x30A3 //disable MAC clock + h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL + i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK + j. SYS_ISO_CTRL 0x00[7:0] = 0xF9 // isolated digital to PON + ******************************/ + //rtw_write16(Adapter, REG_SYS_CLKR, 0x30A3); + rtw_write16(Adapter, REG_SYS_CLKR, 0x70A3);//modify to 0x70A3 by Scott. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x80); + rtw_write16(Adapter, REG_AFE_XTAL_CTRL, 0x880F); + rtw_write8(Adapter, REG_SYS_ISO_CTRL, 0xF9); + } + else + { + // Disable all RF/BB power + rtw_write8(Adapter, REG_RF_CTRL, 0x00); + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Reset Digital.\n")); + +} + +static VOID +_ResetDigitalProcedure2( + IN PADAPTER Adapter +) +{ +/***************************** +k. SYS_FUNC_EN 0x03[7:0] = 0x44 // disable ELDR runction +l. SYS_CLKR 0x08[15:0] = 0x3083 // disable ELDR clock +m. SYS_ISO_CTRL 0x01[7:0] = 0x83 // isolated ELDR to PON +******************************/ + //rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x44);//marked by Scott. + //rtw_write16(Adapter, REG_SYS_CLKR, 0x3083); + //rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x83); + + rtw_write16(Adapter, REG_SYS_CLKR, 0x70a3); //modify to 0x70a3 by Scott. + rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x82); //modify to 0x82 by Scott. +} + +static VOID +_DisableAnalog( + IN PADAPTER Adapter, + IN BOOLEAN bWithoutHWSM + ) +{ + u16 value16 = 0; + u8 value8=0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(bWithoutHWSM){ + /***************************** + n. LDOA15_CTRL 0x20[7:0] = 0x04 // disable A15 power + o. LDOV12D_CTRL 0x21[7:0] = 0x54 // disable digital core power + r. When driver call disable, the ASIC will turn off remaining clock automatically + ******************************/ + + rtw_write8(Adapter, REG_LDOA15_CTRL, 0x04); + //PlatformIOWrite1Byte(Adapter, REG_LDOV12D_CTRL, 0x54); + + value8 = rtw_read8(Adapter, REG_LDOV12D_CTRL); + value8 &= (~LDV12_EN); + rtw_write8(Adapter, REG_LDOV12D_CTRL, value8); + //RT_TRACE(COMP_INIT, DBG_LOUD, (" REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8)); + } + +/***************************** +h. SPS0_CTRL 0x11[7:0] = 0x23 //enter PFM mode +i. APS_FSMCO 0x04[15:0] = 0x4802 // set USB suspend +******************************/ + + + value8 = 0x23; + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) + value8 |= BIT3; + + rtw_write8(Adapter, REG_SPS0_CTRL, value8); + + + if(bWithoutHWSM) + { + //value16 |= (APDM_HOST | /*AFSM_HSUS |*/PFM_ALDN); + // 2010/08/31 According to Filen description, we need to use HW to shut down 8051 automatically. + // Becasue suspend operatione need the asistance of 8051 to wait for 3ms. + value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN); + } + else + { + value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN); + } + + rtw_write16(Adapter, REG_APS_FSMCO,value16 );//0x4802 + + rtw_write8(Adapter, REG_RSV_CTRL, 0x0e); + + #if 0 + //tynli_test for suspend mode. + if(!bWithoutHWSM){ + rtw_write8(Adapter, 0xfe10, 0x19); + } +#endif + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable Analog Reg0x04:0x%04x.\n",value16)); +} + +static int +CardDisableHWSM( // HW Auto state machine + IN PADAPTER Adapter, + IN BOOLEAN resetMCU + ) +{ + int rtStatus = _SUCCESS; + if(Adapter->bSurpriseRemoved){ + return rtStatus; + } +#if 1 + //==== RF Off Sequence ==== + _DisableRFAFEAndResetBB(Adapter); + + // ==== Reset digital sequence ====== + _ResetDigitalProcedure1(Adapter, _FALSE); + + // ==== Pull GPIO PIN to balance level and LED control ====== + _DisableGPIO(Adapter); + + // ==== Disable analog sequence === + _DisableAnalog(Adapter, _FALSE); + + RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("======> Card disable finished.\n")); +#else + _DisableGPIO(Adapter); + + //reset FW download register + _ResetFWDownloadRegister(Adapter); + + + //disable RF/ AFE AD/DA + rtStatus = _DisableRF_AFE(Adapter); + if(RT_STATUS_SUCCESS != rtStatus){ + RT_TRACE(COMP_INIT, DBG_SERIOUS, ("_DisableRF_AFE failed!\n")); + goto Exit; + } + _ResetBB(Adapter); + + if(resetMCU){ + _ResetMCU(Adapter); + } + + _AutoPowerDownToHostOff(Adapter); + //_DisableMAC_AFE_PLL(Adapter); + + _SetUsbSuspend(Adapter); +Exit: +#endif + return rtStatus; + +} + +static int +CardDisableWithoutHWSM( // without HW Auto state machine + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + + if(Adapter->bSurpriseRemoved){ + return rtStatus; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Card Disable Without HWSM .\n")); + //==== RF Off Sequence ==== + _DisableRFAFEAndResetBB(Adapter); + + // ==== Reset digital sequence ====== + _ResetDigitalProcedure1(Adapter, _TRUE); + + // ==== Pull GPIO PIN to balance level and LED control ====== + _DisableGPIO(Adapter); + + // ==== Reset digital sequence ====== + _ResetDigitalProcedure2(Adapter); + + // ==== Disable analog sequence === + _DisableAnalog(Adapter, _TRUE); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<====== Card Disable Without HWSM .\n")); + return rtStatus; +} + +static void rtl8192cu_hw_power_down(_adapter *padapter) +{ + // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. + // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. + + // Enable register area 0x0-0xc. + rtw_write8(padapter,REG_RSV_CTRL, 0x0); + rtw_write16(padapter, REG_APS_FSMCO, 0x8812); +} + +u32 rtl8192cu_hal_deinit(PADAPTER Adapter) + { + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //DBG_8192C("==> %s \n",__FUNCTION__); + // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in + // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all + // IC. Accord to johnny's opinion, only RU need the support. + if (IS_HARDWARE_TYPE_8192C(Adapter) && (pHalData->BoardType == BOARD_USB_High_PA)) + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)|BIT1); + + #ifdef SUPPORT_HW_RFOFF_DETECTED + //DBG_8192C("bkeepfwalive(%x)\n",Adapter->pwrctrlpriv.bkeepfwalive); + if(Adapter->pwrctrlpriv.bkeepfwalive) + { + _ps_close_RF(Adapter); + if((Adapter->pwrctrlpriv.bHWPwrPindetect) && (Adapter->pwrctrlpriv.bHWPowerdown)) + rtl8192cu_hw_power_down(Adapter); + } + else +#endif + { + if( Adapter->bCardDisableWOHSM == _FALSE) + { + //DBG_8192C("card disble HWSM...........\n"); + CardDisableHWSM(Adapter, _FALSE); + } + else + { + DBG_8192C("card disble without HWSM...........\n"); + CardDisableWithoutHWSM(Adapter); // without HW Auto state machine + + if((Adapter->pwrctrlpriv.bHWPwrPindetect ) && (Adapter->pwrctrlpriv.bHWPowerdown)) + rtl8192cu_hw_power_down(Adapter); + } + } + + return _SUCCESS; + } + + +unsigned int rtl8192cu_inirp_init(PADAPTER Adapter) +{ + u8 i; + struct recv_buf *precvbuf; + uint status; + struct dvobj_priv *pdev=&Adapter->dvobjpriv; + struct intf_hdl * pintfhdl=&Adapter->iopriv.intf; + struct recv_priv *precvpriv = &(Adapter->recvpriv); + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); +#endif + +_func_enter_; + + _read_port = pintfhdl->io_ops._read_port; + + status = _SUCCESS; + + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("===> usb_inirp_init \n")); + + precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR; + + //issue Rx irp to receive data + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + for(i=0; iff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE ) + { + RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_port error \n")); + status = _FAIL; + goto exit; + } + + precvbuf++; + precvpriv->free_recv_buf_queue_cnt--; + } + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + _read_interrupt = pintfhdl->io_ops._read_interrupt; + if(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE ) + { + RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_interrupt error \n")); + status = _FAIL; + } +#endif + +exit: + + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("<=== usb_inirp_init \n")); + +_func_exit_; + + return status; + +} + +unsigned int rtl8192cu_inirp_deinit(PADAPTER Adapter) +{ + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n ===> usb_rx_deinit \n")); + + read_port_cancel(Adapter); + + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n <=== usb_rx_deinit \n")); + + return _SUCCESS; +} + +//------------------------------------------------------------------------- +// +// Channel Plan +// +//------------------------------------------------------------------------- + +static VOID +ReadChannelPlan( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + +#define EEPROM_TEST_CHANNEL_PLAN (0x7D) +#define EEPROM_NORMAL_CHANNEL_PLAN (0x75) + + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u8 channelPlan; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(AutoLoadFail){ + channelPlan = CHPL_FCC; + } + else{ + if(IS_NORMAL_CHIP(pHalData->VersionID)) + channelPlan = PROMContent[EEPROM_NORMAL_CHANNEL_PLAN]; + else + channelPlan = PROMContent[EEPROM_TEST_CHANNEL_PLAN]; + } + + if((pregistrypriv->channel_plan>= RT_CHANNEL_DOMAIN_MAX) || (channelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)) + { + pmlmepriv->ChannelPlan = _HalMapChannelPlan8192C(Adapter, (channelPlan & (~(EEPROM_CHANNEL_PLAN_BY_HW_MASK)))); + //pMgntInfo->bChnlPlanFromHW = (channelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) ? _TRUE : _FALSE; // User cannot change channel plan. + } + else + { + pmlmepriv->ChannelPlan = (RT_CHANNEL_DOMAIN)pregistrypriv->channel_plan; + } + +#if 0 //todo: + switch(pMgntInfo->ChannelPlan) + { + case RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN: + { + PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo); + + pDot11dInfo->bEnabled = _TRUE; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Enable dot11d when RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN!\n")); + break; + } +#endif + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegChannelPlan(%d) EEPROMChannelPlan(%ld)", pMgntInfo->RegChannelPlan, (u4Byte)channelPlan)); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("ChannelPlan = %d\n" , pMgntInfo->ChannelPlan)); + + //MSG_8192C("RT_ChannelPlan: 0x%02x\n", pmlmepriv->ChannelPlan); + +} + + +//------------------------------------------------------------------------- +// +// EEPROM Power index mapping +// +//------------------------------------------------------------------------- + + static VOID +_ReadPowerValueFromPROM( + IN PTxPowerInfo pwrInfo, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + u32 rfPath, eeAddr, group; + + _rtw_memset(pwrInfo, 0, sizeof(TxPowerInfo)); + + if(AutoLoadFail){ + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + pwrInfo->CCKIndex[rfPath][group] = EEPROM_Default_TxPowerLevel; + pwrInfo->HT40_1SIndex[rfPath][group] = EEPROM_Default_TxPowerLevel; + pwrInfo->HT40_2SIndexDiff[rfPath][group]= EEPROM_Default_HT40_2SDiff; + pwrInfo->HT20IndexDiff[rfPath][group] = EEPROM_Default_HT20_Diff; + pwrInfo->OFDMIndexDiff[rfPath][group] = EEPROM_Default_LegacyHTTxPowerDiff; + pwrInfo->HT40MaxOffset[rfPath][group] = EEPROM_Default_HT40_PwrMaxOffset; + pwrInfo->HT20MaxOffset[rfPath][group] = EEPROM_Default_HT20_PwrMaxOffset; + } + } + + pwrInfo->TSSI_A = EEPROM_Default_TSSI; + pwrInfo->TSSI_B = EEPROM_Default_TSSI; + + return; + } + + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ + eeAddr = EEPROM_CCK_TX_PWR_INX + (rfPath * 3) + group; + pwrInfo->CCKIndex[rfPath][group] = PROMContent[eeAddr]; + + eeAddr = EEPROM_HT40_1S_TX_PWR_INX + (rfPath * 3) + group; + pwrInfo->HT40_1SIndex[rfPath][group] = PROMContent[eeAddr]; + } + } + + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + pwrInfo->HT40_2SIndexDiff[rfPath][group] = + (PROMContent[EEPROM_HT40_2S_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; + +#if 1 + pwrInfo->HT20IndexDiff[rfPath][group] = + (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; + if(pwrInfo->HT20IndexDiff[rfPath][group] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo->HT20IndexDiff[rfPath][group] |= 0xF0; +#else + pwrInfo->HT20IndexDiff[rfPath][group] = + (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; +#endif + + pwrInfo->OFDMIndexDiff[rfPath][group] = + (PROMContent[EEPROM_OFDM_TX_PWR_INX_DIFF+ group] >> (rfPath * 4)) & 0xF; + + pwrInfo->HT40MaxOffset[rfPath][group] = + (PROMContent[EEPROM_HT40_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF; + + pwrInfo->HT20MaxOffset[rfPath][group] = + (PROMContent[EEPROM_HT20_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF; + } + } + + pwrInfo->TSSI_A = PROMContent[EEPROM_TSSI_A]; + pwrInfo->TSSI_B = PROMContent[EEPROM_TSSI_B]; + +} + + +static u32 +_GetChannelGroup( + IN u32 channel + ) +{ + //RT_ASSERT((channel < 14), ("Channel %d no is supported!\n")); + + if(channel < 3){ // Channel 1~3 + return 0; + } + else if(channel < 9){ // Channel 4~9 + return 1; + } + + return 2; // Channel 10~14 +} + + +static VOID +ReadTxPowerInfo( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + TxPowerInfo pwrInfo; + u32 rfPath, ch, group; + u8 pwr, diff; + + _ReadPowerValueFromPROM(&pwrInfo, PROMContent, AutoLoadFail); + + if(!AutoLoadFail) + pHalData->bTXPowerDataReadFromEEPORM = _TRUE; + + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + group = _GetChannelGroup(ch); + + pHalData->TxPwrLevelCck[rfPath][ch] = pwrInfo.CCKIndex[rfPath][group]; + pHalData->TxPwrLevelHT40_1S[rfPath][ch] = pwrInfo.HT40_1SIndex[rfPath][group]; + + pHalData->TxPwrHt20Diff[rfPath][ch] = pwrInfo.HT20IndexDiff[rfPath][group]; + pHalData->TxPwrLegacyHtDiff[rfPath][ch] = pwrInfo.OFDMIndexDiff[rfPath][group]; + pHalData->PwrGroupHT20[rfPath][ch] = pwrInfo.HT20MaxOffset[rfPath][group]; + pHalData->PwrGroupHT40[rfPath][ch] = pwrInfo.HT40MaxOffset[rfPath][group]; + + pwr = pwrInfo.HT40_1SIndex[rfPath][group]; + diff = pwrInfo.HT40_2SIndexDiff[rfPath][group]; + + pHalData->TxPwrLevelHT40_2S[rfPath][ch] = (pwr > diff) ? (pwr - diff) : 0; + } + } + +#if DBG + + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, + ("RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n", + rfPath, ch, pHalData->TxPwrLevelCck[rfPath][ch], + pHalData->TxPwrLevelHT40_1S[rfPath][ch], + pHalData->TxPwrLevelHT40_2S[rfPath][ch])); + + } + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF90_PATH_A][ch])); + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF90_PATH_A][ch])); + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF90_PATH_B][ch])); + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-B Legacy to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF90_PATH_B][ch])); + } + +#endif + // 2010/10/19 MH Add Regulator recognize for CU. + if(!AutoLoadFail) + { + pHalData->EEPROMRegulatory = (PROMContent[RF_OPTION1]&0x7); //bit0~2 + } + else + { + pHalData->EEPROMRegulatory = 0; + } + //DBG_8192C("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); + +} + + +//------------------------------------------------------------------- +// +// EEPROM/EFUSE Content Parsing +// +//------------------------------------------------------------------- +static void +_ReadIDs( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(_FALSE == AutoloadFail){ + // VID, PID + pHalData->EEPROMVID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_VID]); + pHalData->EEPROMPID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_PID]); + + // Customer ID, 0x00 and 0xff are reserved for Realtek. + pHalData->EEPROMCustomerID = *(u8 *)&PROMContent[EEPROM_CUSTOMER_ID]; + pHalData->EEPROMSubCustomerID = *(u8 *)&PROMContent[EEPROM_SUBCUSTOMER_ID]; + + } + else{ + pHalData->EEPROMVID = EEPROM_Default_VID; + pHalData->EEPROMPID = EEPROM_Default_PID; + + // Customer ID, 0x00 and 0xff are reserved for Realtek. + pHalData->EEPROMCustomerID = EEPROM_Default_CustomerID; + pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; + + } + + // For customized behavior. + if((pHalData->EEPROMVID == 0x103C) && (pHalData->EEPROMVID == 0x1629))// HP Lite-On for RTL8188CUS Slim Combo. + pHalData->CustomerID = RT_CID_819x_HP; + + // Decide CustomerID according to VID/DID or EEPROM + switch(pHalData->EEPROMCustomerID) + { + case EEPROM_CID_DEFAULT: + if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308)) + pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309)) + pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a)) + pHalData->CustomerID = RT_CID_DLINK; + break; + case EEPROM_CID_WHQL: +/* + Adapter->bInHctTest = TRUE; + + pMgntInfo->bSupportTurboMode = FALSE; + pMgntInfo->bAutoTurboBy8186 = FALSE; + + pMgntInfo->PowerSaveControl.bInactivePs = FALSE; + pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE; + pMgntInfo->PowerSaveControl.bLeisurePs = FALSE; + + pMgntInfo->keepAliveLevel = 0; + + Adapter->bUnloadDriverwhenS3S4 = FALSE; +*/ + break; + default: + pHalData->CustomerID = RT_CID_DEFAULT; + break; + + } + + //MSG_8192C("EEPROMVID = 0x%04x\n", pHalData->EEPROMVID); + //MSG_8192C("EEPROMPID = 0x%04x\n", pHalData->EEPROMPID); + //MSG_8192C("EEPROMCustomerID : 0x%02x\n", pHalData->EEPROMCustomerID); + //MSG_8192C("EEPROMSubCustomerID: 0x%02x\n", pHalData->EEPROMSubCustomerID); + + //MSG_8192C("RT_CustomerID: 0x%02x\n", pHalData->CustomerID); + +} + + +static VOID +_ReadMACAddress( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + + if(_FALSE == AutoloadFail){ + //Read Permanent MAC address and set value to hardware + _rtw_memcpy(pEEPROM->mac_addr, &PROMContent[EEPROM_MAC_ADDR], ETH_ALEN); + } + else{ + //Random assigh MAC address + u8 sMacAddr[MAC_ADDR_LEN] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00}; + //sMacAddr[5] = (u8)GetRandomNumber(1, 254); + _rtw_memcpy(pEEPROM->mac_addr, sMacAddr, ETH_ALEN); + } + //DBG_8192C("%s MAC Address from EFUSE = "MAC_FMT"\n",__FUNCTION__, MAC_ARG(pEEPROM->mac_addr)); + //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); + //RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "MAC Addr: %s", Adapter->PermanentAddress); + +} + +static VOID +_ReadBoardType( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + u32 value32; + u8 boardType = BOARD_USB_DONGLE; +#if 0 + if(isNormal) + { + value32 = rtw_read32(Adapter, REG_HPON_FSM); + + DBG_8192C("first value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); + + if(!IS_92C_SERIAL(pHalData->VersionID)) + { + if(CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_88C_USB_MCARD) + { + pHalData->BoardType = BOARD_MINICARD; + DBG_8192C("value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); + } + else if(CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_88C_USB_HP) + { + pHalData->BoardType = BOARD_USB_High_PA; + DBG_8192C("value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); + } + } + } +#endif + + if(AutoloadFail){ + if(IS_8723_SERIES(pHalData->VersionID)) + pHalData->rf_type = RF_1T1R; + else + pHalData->rf_type = RF_2T2R; + + pHalData->BluetoothCoexist = _FALSE; + pHalData->BoardType = boardType; + return; + } + + if(isNormal) + { + boardType = PROMContent[EEPROM_NORMAL_BoardType]; + boardType &= BOARD_TYPE_NORMAL_MASK;//bit[7:5] + boardType >>= 5; + } + else + { + boardType = PROMContent[EEPROM_RF_OPT4]; + boardType &= BOARD_TYPE_TEST_MASK; + } + + pHalData->BoardType = boardType; + //MSG_8192C("_ReadBoardType(%x)\n",pHalData->BoardType); + + if (boardType == BOARD_USB_High_PA) + pHalData->ExternalPA = 1; +} + + +static VOID +_ReadLEDSetting( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + struct led_priv *pledpriv = &(Adapter->ledpriv); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#ifdef CONFIG_SW_LED + pledpriv->bRegUseLed = _TRUE; + + // + // Led mode + // + switch(pHalData->CustomerID) + { + case RT_CID_DEFAULT: + pledpriv->LedStrategy = SW_LED_MODE1; + pledpriv->bRegUseLed = _TRUE; + break; + + case RT_CID_819x_HP: + pledpriv->LedStrategy = SW_LED_MODE6; + break; + + default: + pledpriv->LedStrategy = SW_LED_MODE1; + break; + } + + if( BOARD_MINICARD == pHalData->BoardType ) + { + pledpriv->LedStrategy = SW_LED_MODE6; + } + pHalData->bLedOpenDrain = _TRUE;// Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. +#else // HW LED + pledpriv->LedStrategy = HW_LED; +#endif //CONFIG_SW_LED +} + +static VOID +_ReadThermalMeter( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 tempval; + + // + // ThermalMeter from EEPROM + // + if(!AutoloadFail) + tempval = PROMContent[EEPROM_THERMAL_METER]; + else + tempval = EEPROM_Default_ThermalMeter; + + pHalData->EEPROMThermalMeter = (tempval&0x1f); //[4:0] + + if(pHalData->EEPROMThermalMeter == 0x1f || AutoloadFail) + pdmpriv->bAPKThermalMeterIgnore = _TRUE; + +#if 0 + if(pHalData->EEPROMThermalMeter < 0x06 || pHalData->EEPROMThermalMeter > 0x1c) + pHalData->EEPROMThermalMeter = 0x12; +#endif + + pdmpriv->ThermalMeter[0] = pHalData->EEPROMThermalMeter; + + //RTPRINT(FINIT, INIT_TxPower, ("ThermalMeter = 0x%x\n", pHalData->EEPROMThermalMeter)); + +} + +static VOID +_ReadRFSetting( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ +} + +static void +_ReadPROMVersion( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(AutoloadFail){ + pHalData->EEPROMVersion = EEPROM_Default_Version; + } + else{ + pHalData->EEPROMVersion = *(u8 *)&PROMContent[EEPROM_VERSION]; + } +} + +static VOID +readAntennaDiversity( + IN PADAPTER pAdapter, + IN u8 *hwinfo, + IN BOOLEAN AutoLoadFail + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct registry_priv *registry_par = &pAdapter->registrypriv; + + if(!AutoLoadFail) + { + // Antenna Diversity setting. + if(registry_par->antdiv_cfg == 2) // 2: From Efuse + pHalData->AntDivCfg = (hwinfo[EEPROM_RF_OPT1]&0x18)>>3; + else + pHalData->AntDivCfg = registry_par->antdiv_cfg ; // 0:OFF , 1:ON, + + //DBG_8192C("### AntDivCfg(%x)\n",pHalData->AntDivCfg); + + //if(pHalData->EEPROMBluetoothCoexist!=0 && pHalData->EEPROMBluetoothAntNum==Ant_x1) + // pHalData->AntDivCfg = 0; + } + else + { + pHalData->AntDivCfg = 0; + } + +} + +static VOID +hal_InitPGData( + IN PADAPTER pAdapter, + IN OUT u8 *PROMContent + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u32 i; + u16 value16; + + if(_FALSE == pEEPROM->bautoload_fail_flag) + { // autoload OK. + if (_TRUE == pEEPROM->EepromOrEfuse) + { + // Read all Content from EEPROM or EFUSE. + for(i = 0; i < HWSET_MAX_SIZE; i += 2) + { + //value16 = EF2Byte(ReadEEprom(pAdapter, (u2Byte) (i>>1))); + //*((u16 *)(&PROMContent[i])) = value16; + } + } + else + { + // Read EFUSE real map to shadow. + EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE); + _rtw_memcpy((void*)PROMContent, (void*)pEEPROM->efuse_eeprom_data, HWSET_MAX_SIZE); + } + } + else + {//autoload fail + //RT_TRACE(COMP_INIT, DBG_LOUD, ("AutoLoad Fail reported from CR9346!!\n")); + pEEPROM->bautoload_fail_flag = _TRUE; + //update to default value 0xFF + if (_FALSE == pEEPROM->EepromOrEfuse) + EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE); + } +} +// Read HW power down mode selection +static void _ReadPSSetting(IN PADAPTER Adapter,IN u8*PROMContent,IN u8 AutoloadFail) +{ + if(AutoloadFail){ + Adapter->pwrctrlpriv.bHWPowerdown = _FALSE; + Adapter->pwrctrlpriv.bSupportRemoteWakeup = _FALSE; + } + else { + //if(SUPPORT_HW_RADIO_DETECT(Adapter)) + Adapter->pwrctrlpriv.bHWPwrPindetect = Adapter->registrypriv.hwpwrp_detect; + //else + //Adapter->pwrctrlpriv.bHWPwrPindetect = _FALSE;//dongle not support new + + + //hw power down mode selection , 0:rf-off / 1:power down + + if(Adapter->registrypriv.hwpdn_mode==2) + Adapter->pwrctrlpriv.bHWPowerdown = (PROMContent[EEPROM_RF_OPT3] & BIT4); + else + Adapter->pwrctrlpriv.bHWPowerdown = Adapter->registrypriv.hwpdn_mode; + + // decide hw if support remote wakeup function + // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume + Adapter->pwrctrlpriv.bSupportRemoteWakeup = (PROMContent[EEPROM_TEST_USB_OPT] & BIT1)?_TRUE :_FALSE; + + //if(SUPPORT_HW_RADIO_DETECT(Adapter)) + //Adapter->registrypriv.usbss_enable = Adapter->pwrctrlpriv.bSupportRemoteWakeup ; + + //DBG_8192C("%s...bHWPwrPindetect(%x)-bHWPowerdown(%x) ,bSupportRemoteWakeup(%x)\n",__FUNCTION__, + //Adapter->pwrctrlpriv.bHWPwrPindetect,Adapter->pwrctrlpriv.bHWPowerdown ,Adapter->pwrctrlpriv.bSupportRemoteWakeup); + + //DBG_8192C("### PS params=> power_mgnt(%x),usbss_enable(%x) ###\n",Adapter->registrypriv.power_mgnt,Adapter->registrypriv.usbss_enable); + + } + +} + +static VOID +readAdapterInfo_8192CU( + IN PADAPTER Adapter + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 PROMContent[HWSET_MAX_SIZE]={0}; + + hal_InitPGData(Adapter, PROMContent); + rtl8192c_EfuseParseIDCode(Adapter, PROMContent); + + _ReadPROMVersion(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadIDs(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadMACAddress(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + ReadTxPowerInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadBoardType(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + +#ifdef CONFIG_BT_COEXIST + // + // Read Bluetooth co-exist and initialize + // + rtl8192c_ReadBluetoothCoexistInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); +#endif + + ReadChannelPlan(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadThermalMeter(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadLEDSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadRFSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadPSSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + readAntennaDiversity(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + + //hal_CustomizedBehavior_8723U(Adapter); + + Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1; + //DBG_8192C("%s(): REPLACEMENT = %x\n",__FUNCTION__,Adapter->bDongle); +} + +static void _ReadPROMContent( + IN PADAPTER Adapter + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 PROMContent[HWSET_MAX_SIZE]={0}; + u8 eeValue; + u32 i; + u16 value16; + + eeValue = rtw_read8(Adapter, REG_9346CR); + // To check system boot selection. + pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; + pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE; + + + //DBG_8192C("Boot from %s, Autoload %s !\n", (pEEPROM->EepromOrEfuse ? "EEPROM" : "EFUSE"), + //(pEEPROM->bautoload_fail_flag ? "Fail" : "OK") ); + + //pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE; + + //if(IS_HARDWARE_TYPE_8723(Adapter)) + // readAdapterInfo_8723U(Adapter); + //else + readAdapterInfo_8192CU(Adapter); +} + + +static VOID +_InitOtherVariable( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + //if(Adapter->bInHctTest){ + // pMgntInfo->PowerSaveControl.bInactivePs = FALSE; + // pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE; + // pMgntInfo->PowerSaveControl.bLeisurePs = FALSE; + // pMgntInfo->keepAliveLevel = 0; + //} + + // 2009/06/10 MH For 92S 1*1=1R/ 1*2&2*2 use 2R. We default set 1*1 use radio A + // So if you want to use radio B. Please modify RF path enable bit for correct signal + // strength calculate. + if (pHalData->rf_type == RF_1T1R){ + pHalData->bRFPathRxEnable[0] = _TRUE; + } + else{ + pHalData->bRFPathRxEnable[0] = pHalData->bRFPathRxEnable[1] = _TRUE; + } + +} + +static VOID +_ReadRFType( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + +#if DISABLE_BB_RF + pHalData->rf_chip = RF_PSEUDO_11N; +#else + pHalData->rf_chip = RF_6052; +#endif +} + +void _ReadSilmComboMode(PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + pHalData->SlimComboDbg = _FALSE; // Default is not debug mode. + + // 2010/11/22 MH We need to enter debug mode for TSMA and UMC A cut + if ((Adapter->chip_type == RTL8188C_8192C) && + (pHalData->BoardType == BOARD_USB_COMBO)) + { + switch (pHalData->VersionID) + { + case VERSION_NORMAL_TSMC_CHIP_88C: + case VERSION_NORMAL_TSMC_CHIP_92C: + case VERSION_NORMAL_TSMC_CHIP_92C_1T2R: + case VERSION_NORMAL_UMC_CHIP_88C_A_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_A_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT: + if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20) + pHalData->SlimComboDbg = _TRUE; + + break; + + case VERSION_NORMAL_UMC_CHIP_88C_B_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_B_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT: + // 2011/02/15 MH UNC-B cut ECO fail, we need to support slim combo debug mode. + if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20) + pHalData->SlimComboDbg = _TRUE; + break; + + default: + break; + } + + } + +} +static int _ReadAdapterInfo8192CU(PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 start=rtw_get_current_time(); + + //MSG_8192C("====> ReadAdapterInfo8192C\n"); + + //Efuse_InitSomeVar(Adapter); + + //if(IS_HARDWARE_TYPE_8723(Adapter)) + // _EfuseCellSel(Adapter); + + _ReadRFType(Adapter);//rf_chip -> _InitRFType() + _ReadPROMContent(Adapter); + + // 2010/10/25 MH THe function must be called after borad_type & IC-Version recognize. + _ReadSilmComboMode(Adapter); + + _InitOtherVariable(Adapter); + + //MSG_8192C("%s()(done), rf_chip=0x%x, rf_type=0x%x\n", __FUNCTION__, pHalData->rf_chip, pHalData->rf_type); + + //MSG_8192C("<==== ReadAdapterInfo8192C in %d ms\n", rtw_get_passing_time_ms(start)); + + return _SUCCESS; +} + + +static void ReadAdapterInfo8192CU(PADAPTER Adapter) +{ + // Read EEPROM size before call any EEPROM function + //Adapter->EepromAddressSize=Adapter->HalFunc.GetEEPROMSizeHandler(Adapter); + Adapter->EepromAddressSize = GetEEPROMSize8192C(Adapter); + + _ReadAdapterInfo8192CU(Adapter); +} + + +#define GPIO_DEBUG_PORT_NUM 0 +static void rtl8192cu_trigger_gpio_0(_adapter *padapter) +{ + + u32 gpioctrl; + DBG_8192C("==> trigger_gpio_0...\n"); + rtw_write16_async(padapter,REG_GPIO_PIN_CTRL,0); + rtw_write8_async(padapter,REG_GPIO_PIN_CTRL+2,0xFF); + gpioctrl = (BIT(GPIO_DEBUG_PORT_NUM)<<24 )|(BIT(GPIO_DEBUG_PORT_NUM)<<16); + rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl); + gpioctrl |= (BIT(GPIO_DEBUG_PORT_NUM)<<8); + rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl); + DBG_8192C("<=== trigger_gpio_0...\n"); + +} + +static void ResumeTxBeacon(_adapter *padapter) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter); + + // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value + // which should be read from register to a global variable. + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6); + pHalData->RegFwHwTxQCtrl |= BIT6; + rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0xff); + pHalData->RegReg542 |= BIT0; + rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542); + } + else + { + pHalData->RegTxPause = rtw_read8(padapter, REG_TXPAUSE); + rtw_write8(padapter, REG_TXPAUSE, pHalData->RegTxPause & (~BIT6)); + } + +} + +static void StopTxBeacon(_adapter *padapter) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter); + + // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value + // which should be read from register to a global variable. + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6)); + pHalData->RegFwHwTxQCtrl &= (~BIT6); + rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0x64); + pHalData->RegReg542 &= ~(BIT0); + rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542); + } + else + { + pHalData->RegTxPause = rtw_read8(padapter, REG_TXPAUSE); + rtw_write8(padapter, REG_TXPAUSE, pHalData->RegTxPause | BIT6); + } + + //todo: CheckFwRsvdPageContent(Adapter); // 2010.06.23. Added by tynli. + +} + + +void SetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +_func_enter_; + + switch(variable) + { + case HW_VAR_MEDIA_STATUS: + { + u8 val8; + + val8 = rtw_read8(Adapter, MSR)&0x0c; + val8 |= *((u8 *)val); + rtw_write8(Adapter, MSR, val8); + } + break; + case HW_VAR_MEDIA_STATUS1: + { + u8 val8; + + val8 = rtw_read8(Adapter, MSR)&0x03; + val8 |= *((u8 *)val) <<2; + rtw_write8(Adapter, MSR, val8); + } + break; + case HW_VAR_SET_OPMODE: + { + u8 val8; + u8 mode = *((u8 *)val); + + if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) + { + StopTxBeacon(Adapter); + rtw_write8(Adapter,REG_BCN_CTRL, 0x18); + } + else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/) + { + ResumeTxBeacon(Adapter); + rtw_write8(Adapter,REG_BCN_CTRL, 0x1a); + } + else if(mode == _HW_STATE_AP_) + { + ResumeTxBeacon(Adapter); + + rtw_write8(Adapter, REG_BCN_CTRL, 0x12); + + + //Set RCR + //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0 + rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0 + //enable to rx data frame + rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); + //enable to rx ps-poll + rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400); + + //Beacon Control related register for first time + rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms + rtw_write8(Adapter, REG_DRVERLYINT, 0x05);// 5ms + //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); + rtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms + rtw_write16(Adapter, REG_BCNTCFG, 0x00); + rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0x6404); + + //reset TSF + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); + + //enable TSF Function for if1 + rtw_write8(Adapter, REG_BCN_CTRL, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); + + //enable update TSF for if1 + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + + } + + val8 = rtw_read8(Adapter, MSR)&0x0c; + val8 |= mode; + rtw_write8(Adapter, MSR, val8); + } + break; + case HW_VAR_BSSID: + { + u8 idx = 0; + for(idx = 0 ; idx < 6; idx++) + { + rtw_write8(Adapter, (REG_BSSID+idx), val[idx]); + } + } + break; + case HW_VAR_BASIC_RATE: + { + u16 BrateCfg = 0; + u8 RateIndex = 0; + + // 2007.01.16, by Emily + // Select RRSR (in Legacy-OFDM and CCK) + // For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate. + // We do not use other rates. + rtl8192c_HalSetBrateCfg( Adapter, val, &BrateCfg ); + + //2011.03.30 add by Luke Lee + //CCK 2M ACK should be disabled for some BCM and Atheros AP IOT + //because CCK 2M has poor TXEVM + //CCK 5.5M & 11M ACK should be enabled for better performance + + pHalData->BasicRateSet = BrateCfg = (BrateCfg |0xd) & 0x15d; + + BrateCfg |= 0x01; // default enable 1M ACK rate + + //DBG_8192C("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg); + + // Set RRSR rate table. + rtw_write8(Adapter, REG_RRSR, BrateCfg&0xff); + rtw_write8(Adapter, REG_RRSR+1, (BrateCfg>>8)&0xff); + + // Set RTS initial rate + while(BrateCfg > 0x1) + { + BrateCfg = (BrateCfg>> 1); + RateIndex++; + } + // Ziv - Check + rtw_write8(Adapter, REG_INIRTS_RATE_SEL, RateIndex); + } + break; + case HW_VAR_TXPAUSE: + rtw_write8(Adapter, REG_TXPAUSE, *((u8 *)val)); + break; + case HW_VAR_BCN_FUNC: + if(*((u8 *)val)) + { + rtw_write8(Adapter, REG_BCN_CTRL, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(EN_BCN_FUNCTION | EN_TXBCN_RPT))); + } + break; + case HW_VAR_CORRECT_TSF: + { + u64 tsf; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us + tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause |= STOP_BCNQ;BIT(6) + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6))); + StopTxBeacon(Adapter); + } + + //disable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3))); + + rtw_write32(Adapter, REG_TSFTR, tsf); + rtw_write32(Adapter, REG_TSFTR+4, tsf>>32); + + //enable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3)); + + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause &= (~STOP_BCNQ); + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6)))); + ResumeTxBeacon(Adapter); + } + } + break; + case HW_VAR_CHECK_BSSID: + if(*((u8 *)val)) + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); + } + else + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); + } + } + else + { + u32 val32; + + val32 = rtw_read32(Adapter, REG_RCR); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + val32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN); + } + else + { + val32 &= 0xfffff7bf; + } + + rtw_write32(Adapter, REG_RCR, val32); + } + break; + case HW_VAR_MLME_DISCONNECT: + { + //Set RCR to not to receive data frame when NO LINK state + //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR) & ~RCR_ADF); + //reject all data frames + rtw_write16(Adapter, REG_RXFLTMAP2,0x00); + + //reset TSF + rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); + + //disable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); + } + } + break; + case HW_VAR_MLME_SITESURVEY: + if(*((u8 *)val))//under sitesurvey + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + //config RCR to receive different BSSID & not to receive data frame + //pHalData->ReceiveConfig &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); + u32 v = rtw_read32(Adapter, REG_RCR); + v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF + rtw_write32(Adapter, REG_RCR, v); + //reject all data frame + rtw_write16(Adapter, REG_RXFLTMAP2,0x00); + + //disable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); + } + else + { + //config RCR to receive different BSSID & not to receive data frame + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) & 0xfffff7bf); + + + //disable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); + } + } + else//sitesurvey done + { + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((is_client_associated_to_ap(Adapter) == _TRUE) || + ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) ) + { + //enable to rx data frame + //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); + + //enable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_ADF); + + //enable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + else + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN); + else + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); + } + else + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); + } + } + break; + case HW_VAR_MLME_JOIN: + { + u8 RetryLimit = 0x30; + u8 type = *((u8 *)val); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + + if(type == 0) // prepare to join + { + //enable to rx data frame.Accept all data frame + //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); + } + else + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); + } + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; + } + else // Ad-hoc Mode + { + RetryLimit = 0x7; + } + } + else if(type == 1) //joinbss_event call back when join res < 0 + { + //if(IS_NORMAL_CHIP(pHalData->VersionID)) + //{ + //config RCR to receive different BSSID & not to receive data frame during linking + // u32 v = rtw_read32(Adapter, REG_RCR); + // v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF + // rtw_write32(Adapter, REG_RCR, v); + //} + //else + //{ + //config RCR to receive different BSSID & not to receive data frame during linking + // rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) & 0xfffff7bf); + //} + + rtw_write16(Adapter, REG_RXFLTMAP2,0x00); + } + else if(type == 2) //sta add event call back + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + //enable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + } + else + { + //enable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) + { + //fixed beacon issue for 8191su........... + rtw_write8(Adapter,0x542 ,0x02); + RetryLimit = 0x7; + } + } + + rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT); + } + break; + case HW_VAR_BEACON_INTERVAL: + rtw_write16(Adapter, REG_BCN_INTERVAL, *((u16 *)val)); + break; + case HW_VAR_SLOT_TIME: + { + u8 u1bAIFS, aSifsTime; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + rtw_write8(Adapter, REG_SLOT, val[0]); + + if(pmlmeinfo->WMM_enable == 0) + { + if( pmlmeext->cur_wireless_mode == WIRELESS_11B) + aSifsTime = 10; + else + aSifsTime = 16; + + u1bAIFS = aSifsTime + (2 * pmlmeinfo->slotTime); + + // Temporary removed, 2008.06.20. + rtw_write8(Adapter, REG_EDCA_VO_PARAM, u1bAIFS); + rtw_write8(Adapter, REG_EDCA_VI_PARAM, u1bAIFS); + rtw_write8(Adapter, REG_EDCA_BE_PARAM, u1bAIFS); + rtw_write8(Adapter, REG_EDCA_BK_PARAM, u1bAIFS); + } + } + break; + case HW_VAR_SIFS: + { + // SIFS for OFDM Data ACK + rtw_write8(Adapter, REG_SIFS_CTX+1, val[0]); + // SIFS for OFDM consecutive tx like CTS data! + rtw_write8(Adapter, REG_SIFS_TRX+1, val[1]); + + rtw_write8(Adapter,REG_SPEC_SIFS+1, val[0]); + rtw_write8(Adapter,REG_MAC_SPEC_SIFS+1, val[0]); + + // 20100719 Joseph: Revise SIFS setting due to Hardware register definition change. + rtw_write8(Adapter, REG_R2T_SIFS+1, val[0]); + rtw_write8(Adapter, REG_T2T_SIFS+1, val[0]); + } + break; + case HW_VAR_ACK_PREAMBLE: + { + u8 regTmp; + u8 bShortPreamble = *( (PBOOLEAN)val ); + // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) + //regTmp = (pHalData->nCur40MhzPrimeSC)<<5; + regTmp = 0; + if(bShortPreamble) + regTmp |= 0x80; + + rtw_write8(Adapter, REG_RRSR+2, regTmp); + } + break; + case HW_VAR_SEC_CFG: + rtw_write8(Adapter, REG_SECCFG, *((u8 *)val)); + break; + case HW_VAR_DM_FLAG: + pdmpriv->DMFlag = *((u8 *)val); + break; + case HW_VAR_DM_FUNC_OP: + if(val[0]) + {// save dm flag + pdmpriv->DMFlag_tmp = pdmpriv->DMFlag; + } + else + {// restore dm flag + pdmpriv->DMFlag = pdmpriv->DMFlag_tmp; + } + break; + case HW_VAR_DM_FUNC_SET: + pdmpriv->DMFlag |= *((u8 *)val); + break; + case HW_VAR_DM_FUNC_CLR: + pdmpriv->DMFlag &= *((u8 *)val); + break; + case HW_VAR_CAM_EMPTY_ENTRY: + { + u8 ucIndex = *((u8 *)val); + u8 i; + u32 ulCommand=0; + u32 ulContent=0; + u32 ulEncAlgo=CAM_AES; + + for(i=0;iAcParam_BE = ((u32 *)(val))[0]; + rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]); + break; + case HW_VAR_AC_PARAM_BK: + rtw_write32(Adapter, REG_EDCA_BK_PARAM, ((u32 *)(val))[0]); + break; + case HW_VAR_AMPDU_MIN_SPACE: + { + u8 MinSpacingToSet; + u8 SecMinSpace; + + MinSpacingToSet = *((u8 *)val); + if(MinSpacingToSet <= 7) + { + switch(Adapter->securitypriv.dot11PrivacyAlgrthm) + { + case _NO_PRIVACY_: + case _AES_: + SecMinSpace = 0; + break; + + case _WEP40_: + case _WEP104_: + case _TKIP_: + case _TKIP_WTMIC_: + SecMinSpace = 6; + break; + default: + SecMinSpace = 7; + break; + } + + if(MinSpacingToSet < SecMinSpace){ + MinSpacingToSet = SecMinSpace; + } + + //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", Adapter->MgntInfo.MinSpaceCfg)); + rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet); + } + } + break; + case HW_VAR_AMPDU_FACTOR: + { + u8 RegToSet_Normal[4]={0x41,0xa8,0x72, 0xb9}; + u8 RegToSet_BT[4]={0x31,0x74,0x42, 0x97}; + u8 FactorToSet; + u8 *pRegToSet; + u8 index = 0; + +#ifdef CONFIG_BT_COEXIST + if( (pHalData->bt_coexist.BT_Coexist) && + (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) ) + pRegToSet = RegToSet_BT; // 0x97427431; + else +#endif + pRegToSet = RegToSet_Normal; // 0xb972a841; + + FactorToSet = *((u8 *)val); + if(FactorToSet <= 3) + { + FactorToSet = (1<<(FactorToSet + 2)); + if(FactorToSet>0xf) + FactorToSet = 0xf; + + for(index=0; index<4; index++) + { + if((pRegToSet[index] & 0xf0) > (FactorToSet<<4)) + pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet<<4); + + if((pRegToSet[index] & 0x0f) > FactorToSet) + pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet); + + rtw_write8(Adapter, (REG_AGGLEN_LMT+index), pRegToSet[index]); + } + + //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_FACTOR: %#x\n", FactorToSet)); + } + } + break; + case HW_VAR_RXDMA_AGG_PG_TH: + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, *((u8 *)val)); + break; + case HW_VAR_SET_RPWM: + rtw_write8(Adapter, REG_USB_HRPWM, *((u8 *)val)); + break; + case HW_VAR_H2C_FW_PWRMODE: + { + u8 psmode = (*(u8 *)val); + + // Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power + // saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang. + if( (psmode != PS_MODE_ACTIVE) && (!IS_92C_SERIAL(pHalData->VersionID))) + { + rtl8192c_dm_RF_Saving(Adapter, _TRUE); + } + rtl8192c_set_FwPwrMode_cmd(Adapter, psmode); + } + break; + case HW_VAR_H2C_FW_JOINBSSRPT: + { + u8 mstatus = (*(u8 *)val); + rtl8192c_set_FwJoinBssReport_cmd(Adapter, mstatus); + } + break; +#ifdef CONFIG_P2P + case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: + { + u8 p2p_ps_state = (*(u8 *)val); + rtl8192c_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state); + } + break; +#endif //CONFIG_P2P + case HW_VAR_INITIAL_GAIN: + PHY_SetBBReg(Adapter, rOFDM0_XAAGCCore1, 0x7f, ((u32 *)(val))[0]); + PHY_SetBBReg(Adapter, rOFDM0_XBAGCCore1, 0x7f, ((u32 *)(val))[0]); + break; + case HW_VAR_TRIGGER_GPIO_0: + rtl8192cu_trigger_gpio_0(Adapter); + break; +#ifdef CONFIG_BT_COEXIST + case HW_VAR_BT_SET_COEXIST: + { + u8 bStart = (*(u8 *)val); + rtl8192c_set_dm_bt_coexist(Adapter, bStart); + } + break; + case HW_VAR_BT_ISSUE_DELBA: + { + u8 dir = (*(u8 *)val); + rtl8192c_issue_delete_ba(Adapter, dir); + } + break; +#endif +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + + case HW_VAR_ANTENNA_DIVERSITY_LINK: + SwAntDivRestAfterLink8192C(Adapter); + break; + case HW_VAR_ANTENNA_DIVERSITY_SELECT: + { + u8 Optimum_antenna = (*(u8 *)val); + //switch antenna to Optimum_antenna + // DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); + if(pHalData->CurAntenna != Optimum_antenna) + { + PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, Optimum_antenna); + pHalData->CurAntenna = Optimum_antenna ; + //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); + } + } + break; +#endif + case HW_VAR_EFUSE_BYTES: // To set EFUE total used bytes, added by Roger, 2008.12.22. + pHalData->EfuseUsedBytes = *((u16 *)val); + break; + case HW_VAR_FIFO_CLEARN_UP: + { + #define RW_RELEASE_EN BIT18 + #define RXDMA_IDLE BIT17 + + struct pwrctrl_priv *pwrpriv = &Adapter->pwrctrlpriv; + u8 trycnt = 100; + + //pause tx + rtw_write8(Adapter,REG_TXPAUSE,0xff); + + //keep sn + Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter,REG_NQOS_SEQ); + + if(pwrpriv->bkeepfwalive != _TRUE) + { + //RX DMA stop + rtw_write32(Adapter,REG_RXPKT_NUM,(rtw_read32(Adapter,REG_RXPKT_NUM)|RW_RELEASE_EN)); + do{ + if(!(rtw_read32(Adapter,REG_RXPKT_NUM)&RXDMA_IDLE)) + break; + }while(trycnt--); + if(trycnt ==0) + DBG_8192C("Stop RX DMA failed...... \n"); + + //RQPN Load 0 + rtw_write16(Adapter,REG_RQPN_NPQ,0x0); + rtw_write32(Adapter,REG_RQPN,0x80000000); + rtw_mdelay_os(10); + } + } + break; + default: + break; + } + +_func_exit_; +} + +void GetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + +_func_enter_; + + switch(variable) + { + case HW_VAR_BASIC_RATE: + *((u16 *)(val)) = pHalData->BasicRateSet; + case HW_VAR_TXPAUSE: + val[0] = rtw_read8(Adapter, REG_TXPAUSE); + break; + case HW_VAR_TX_BCN_DONE: + { + u32 xmitbcnDown; + xmitbcnDown= rtw_read32(Adapter, REG_TDECTRL); + if(xmitbcnDown & BCN_VALID ){ + rtw_write32(Adapter,REG_TDECTRL, xmitbcnDown | BCN_VALID ); // write 1 to clear, Clear by sw + val[0] = _TRUE; + } + } + break; + case HW_VAR_DM_FLAG: + val[0] = pHalData->dmpriv.DMFlag; + break; + case HW_VAR_RF_TYPE: + val[0] = pHalData->rf_type; + break; + case HW_VAR_FWLPS_RF_ON: + { + //When we halt NIC, we should check if FW LPS is leave. + u32 valRCR; + + if(Adapter->pwrctrlpriv.rf_pwrstate == rf_off) + { + // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, + // because Fw is unload. + val[0] = _TRUE; + } + else + { + valRCR = rtw_read32(Adapter, REG_RCR); + valRCR &= 0x00070000; + if(valRCR) + val[0] = _FALSE; + else + val[0] = _TRUE; + } + } + break; +#ifdef CONFIG_ANTENNA_DIVERSITY + case HW_VAR_CURRENT_ANTENNA: + val[0] = pHalData->CurAntenna; + break; +#endif + case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22. + *((u16 *)(val)) = pHalData->EfuseUsedBytes; + break; + default: + break; + } + +_func_exit_; +} + +// +// Description: +// Query setting of specified variable. +// +u8 +GetHalDefVar8192CUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 bResult = _TRUE; + + switch(eVariable) + { + case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB: + *((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB; + break; + case HAL_DEF_IS_SUPPORT_ANT_DIV: + #ifdef CONFIG_ANTENNA_DIVERSITY + *((u8 *)pValue) = (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))?_FALSE:_TRUE; + #endif + break; + case HAL_DEF_CURRENT_ANTENNA: + #ifdef CONFIG_ANTENNA_DIVERSITY + *(( u8*)pValue) = pHalData->CurAntenna; + #endif + break; + case HAL_DEF_DRVINFO_SZ: + *(( u32*)pValue) = DRVINFO_SZ; + break; + case HAL_DEF_MAX_RECVBUF_SZ: + *(( u32*)pValue) = MAX_RECVBUF_SZ; + break; + case HAL_DEF_RX_PACKET_OFFSET: + *(( u32*)pValue) = RXDESC_SIZE + DRVINFO_SZ; + break; + case HAL_DEF_DBG_DUMP_RXPKT: + *(( u8*)pValue) = pHalData->bDumpRxPkt; + break; + case HAL_DEF_DBG_DM_FUNC: + *(( u8*)pValue) = pHalData->dmpriv.DMFlag; + break; + default: + //RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8192CUsb(): Unkown variable: %d!\n", eVariable)); + bResult = _FALSE; + break; + } + + return bResult; +} + + + + +// +// Description: +// Change default setting of specified variable. +// +u8 +SetHalDefVar8192CUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 bResult = _TRUE; + + switch(eVariable) + { + case HAL_DEF_DBG_DUMP_RXPKT: + pHalData->bDumpRxPkt = *(( u8*)pValue); + break; + case HAL_DEF_DBG_DM_FUNC: + { + u8 dm_func = *(( u8*)pValue); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + if(dm_func == 0){ //disable all dynamic func + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; + DBG_8192C("==> Disable all dynamic function...\n"); + } + else if(dm_func == 1){//disable DIG + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_DIG); + DBG_8192C("==> Disable DIG...\n"); + } + else if(dm_func == 2){//disable High power + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_HP); + } + else if(dm_func == 3){//disable tx power tracking + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_SS); + DBG_8192C("==> Disable tx power tracking...\n"); + } + else if(dm_func == 4){//disable BT coexistence + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_BT); + } + else if(dm_func == 5){//disable antenna diversity + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_ANT_DIV); + } + else if(dm_func == 6){//turn on all dynamic func + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG)) + { + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + pDigTable->PreIGValue = rtw_read8(Adapter,0xc50); + } + + pdmpriv->DMFlag |= (DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS| + DYNAMIC_FUNC_BT|DYNAMIC_FUNC_ANT_DIV) ; + DBG_8192C("==> Turn on all dynamic function...\n"); + } + } + break; + default: + //RT_TRACE(COMP_INIT, DBG_TRACE, ("SetHalDefVar819xUsb(): Unkown variable: %d!\n", eVariable)); + bResult = _FALSE; + break; + } + + return bResult; +} + +u32 _update_92cu_basic_rate(_adapter *padapter, unsigned int mask) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + unsigned int BrateCfg = 0; + +#ifdef CONFIG_BT_COEXIST + if( (pbtpriv->BT_Coexist) && (pbtpriv->BT_CoexistType == BT_CSR_BC4) ) + { + BrateCfg = mask & 0x151; + //DBG_8192C("BT temp disable cck 2/5.5/11M, (0x%x = 0x%x)\n", REG_RRSR, BrateCfg & 0x151); + } + else +#endif + { + if(pHalData->VersionID != VERSION_TEST_CHIP_88C) + BrateCfg = mask & 0x15F; + else //for 88CU 46PING setting, Disable CCK 2M, 5.5M, Others must tuning + BrateCfg = mask & 0x159; + } + + BrateCfg |= 0x01; // default enable 1M ACK rate + + return BrateCfg; +} + +void _update_response_rate(_adapter *padapter,unsigned int mask) +{ + u8 RateIndex = 0; + // Set RRSR rate table. + rtw_write8(padapter, REG_RRSR, mask&0xff); + rtw_write8(padapter,REG_RRSR+1, (mask>>8)&0xff); + + // Set RTS initial rate + while(mask > 0x1) + { + mask = (mask>> 1); + RateIndex++; + } + rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex); +} + +void UpdateHalRAMask8192CUsb(PADAPTER padapter, u32 mac_id) +{ + //volatile unsigned int result; + u8 init_rate=0; + u8 networkType, raid; + u32 mask; + u8 shortGIrate = _FALSE; + int supportRateNum = 0; + struct sta_info *psta; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + + if (mac_id >= NUM_STA) //CAM_SIZE + { + return; + } + + psta = pmlmeinfo->FW_sta_info[mac_id].psta; + if(psta == NULL) + { + return; + } + + switch (mac_id) + { + case 0:// for infra mode + supportRateNum = rtw_get_rateset_len(cur_network->SupportedRates); + networkType = judge_network_type(padapter, cur_network->SupportedRates, supportRateNum) & 0xf; + //pmlmeext->cur_wireless_mode = networkType; + raid = networktype_to_raid(networkType); + + mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); + mask |= (pmlmeinfo->HT_enable)? update_MSC_rate(&(pmlmeinfo->HT_caps)): 0; + mask |= ((raid<<28)&0xf0000000); + + if (support_short_GI(padapter, &(pmlmeinfo->HT_caps))) + { + shortGIrate = _TRUE; + } + + break; + + case 1://for broadcast/multicast + supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); + if(pmlmeext->cur_wireless_mode & WIRELESS_11B) + networkType = WIRELESS_11B; + else + networkType = WIRELESS_11G; + raid = networktype_to_raid(networkType); + + mask = update_basic_rate(cur_network->SupportedRates, supportRateNum); + mask |= ((raid<<28)&0xf0000000); + + break; + + default: //for each sta in IBSS + supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); + networkType = judge_network_type(padapter, pmlmeinfo->FW_sta_info[mac_id].SupportedRates, supportRateNum) & 0xf; + //pmlmeext->cur_wireless_mode = networkType; + raid = networktype_to_raid(networkType); + + mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); + mask |= ((raid<<28)&0xf0000000); + + //todo: support HT in IBSS + + break; + } + +#ifdef CONFIG_BT_COEXIST + if( (pbtpriv->BT_Coexist) && + (pbtpriv->BT_CoexistType == BT_CSR_BC4) && + (pbtpriv->BT_CUR_State) && + (pbtpriv->BT_Ant_isolation) && + ((pbtpriv->BT_Service==BT_SCO)|| + (pbtpriv->BT_Service==BT_Busy)) ) + mask &= 0xffffcfc0; + else +#endif + mask &=0xffffffff; + + + init_rate = get_highest_rate_idx(mask)&0x3f; + + if(pHalData->fw_ractrl == _TRUE) + { + u8 arg = 0; + + //arg = (cam_idx-4)&0x1f;//MACID + arg = mac_id&0x1f;//MACID + + arg |= BIT(7); + + if (shortGIrate==_TRUE) + arg |= BIT(5); + + //DBG_871X("update raid entry, mask=0x%x, arg=0x%x\n", mask, arg); + + rtl8192c_set_raid_cmd(padapter, mask, arg); + + } + else + { + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + rtw_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id), init_rate); + } + + + //set ra_id + psta->raid = raid; + psta->init_rate = init_rate; + + //set correct initial date rate for each mac_id + pdmpriv->INIDATA_RATE[mac_id] = init_rate; +} + +void SetBeaconRelatedRegisters8192CUsb(PADAPTER padapter) +{ + u32 value32; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //reset TSF, enable update TSF, correcting TSF On Beacon + + //REG_BCN_INTERVAL + //REG_BCNDMATIM + //REG_ATIMWND + //REG_TBTT_PROHIBIT + //REG_DRVERLYINT + //REG_BCN_MAX_ERR + //REG_BCNTCFG //(0x510) + //REG_DUAL_TSF_RST + //REG_BCN_CTRL //(0x550) + + //BCN interval + rtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval); + rtw_write8(padapter, REG_ATIMWND, 0x02);// 2ms + + _InitBeaconParameters(padapter); + + rtw_write8(padapter, REG_SLOT, 0x09); + + value32 =rtw_read32(padapter, REG_TCR); + value32 &= ~TSFRST; + rtw_write32(padapter, REG_TCR, value32); + + value32 |= TSFRST; + rtw_write32(padapter, REG_TCR, value32); + + // NOTE: Fix test chip's bug (about contention windows's randomness) + rtw_write8(padapter, REG_RXTSF_OFFSET_CCK, 0x50); + rtw_write8(padapter, REG_RXTSF_OFFSET_OFDM, 0x50); + + _BeaconFunctionEnable(padapter, _TRUE, _TRUE); + + ResumeTxBeacon(padapter); + + //rtw_write8(padapter, 0x422, rtw_read8(padapter, 0x422)|BIT(6)); + + //rtw_write8(padapter, 0x541, 0xff); + + //rtw_write8(padapter, 0x542, rtw_read8(padapter, 0x541)|BIT(0)); + + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(1)); + +} + +static void rtl8192cu_init_default_value(_adapter * padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i; + + //init default value + pHalData->fw_ractrl = _FALSE; + pHalData->bIQKInitialized = _FALSE; + if(!pwrctrlpriv->bkeepfwalive) + pHalData->LastHMEBoxNum = 0; + + pHalData->bIQKInitialized = _FALSE; + //init dm default value + pdmpriv->TM_Trigger = 0; + pdmpriv->binitialized = _FALSE; + pdmpriv->prv_traffic_idx = 3; + pdmpriv->initialize = 0; + + pdmpriv->ThermalValue_HP_index = 0; + for(i = 0; i < HP_THERMAL_NUM; i++) + pdmpriv->ThermalValue_HP[i] = 0; +} +static u8 rtl8192cu_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val) +{ + u8 bResult = _TRUE; + switch(efunc_id){ + + #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) + case HAL_USB_SELECT_SUSPEND: + { + u8 bfwpoll = *(( u8*)val); + rtl8192c_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect + } + break; + #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED + + default: + break; + } + return bResult; +} +void rtl8192cu_set_hal_ops(_adapter * padapter) +{ + struct hal_ops *pHalFunc = &padapter->HalFunc; + +_func_enter_; + + padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE)); + if(padapter->HalData == NULL){ + DBG_8192C("cant not alloc memory for HAL DATA \n"); + } + //_rtw_memset(padapter->HalData, 0, sizeof(HAL_DATA_TYPE)); + + pHalFunc->hal_init = &rtl8192cu_hal_init; + pHalFunc->hal_deinit = &rtl8192cu_hal_deinit; + + //pHalFunc->free_hal_data = &rtl8192c_free_hal_data; + + pHalFunc->inirp_init = &rtl8192cu_inirp_init; + pHalFunc->inirp_deinit = &rtl8192cu_inirp_deinit; + + pHalFunc->init_xmit_priv = &rtl8192cu_init_xmit_priv; + pHalFunc->free_xmit_priv = &rtl8192cu_free_xmit_priv; + + pHalFunc->init_recv_priv = &rtl8192cu_init_recv_priv; + pHalFunc->free_recv_priv = &rtl8192cu_free_recv_priv; +#ifdef CONFIG_SW_LED + pHalFunc->InitSwLeds = &rtl8192cu_InitSwLeds; + pHalFunc->DeInitSwLeds = &rtl8192cu_DeInitSwLeds; +#else //case of hw led or no led + pHalFunc->InitSwLeds = NULL; + pHalFunc->DeInitSwLeds = NULL; +#endif//CONFIG_SW_LED + + //pHalFunc->dm_init = &rtl8192c_init_dm_priv; + //pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv; + + pHalFunc->init_default_value = &rtl8192cu_init_default_value; + pHalFunc->intf_chip_configure = &rtl8192cu_interface_configure; + pHalFunc->read_adapter_info = &ReadAdapterInfo8192CU; + + //pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C; + //pHalFunc->set_channel_handler = &PHY_SwChnl8192C; + + //pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog; + + pHalFunc->SetHwRegHandler = &SetHwReg8192CU; + pHalFunc->GetHwRegHandler = &GetHwReg8192CU; + pHalFunc->GetHalDefVarHandler = &GetHalDefVar8192CUsb; + pHalFunc->SetHalDefVarHandler = &SetHalDefVar8192CUsb; + + pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8192CUsb; + pHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8192CUsb; + + //pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid; + +//#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //pHalFunc->SwAntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C; + //pHalFunc->SwAntDivCompareHandler = &SwAntDivCompare8192C; +//#endif + + pHalFunc->hal_xmit = &rtl8192cu_hal_xmit; + pHalFunc->mgnt_xmit = &rtl8192cu_mgnt_xmit; + + //pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg; + //pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg; + //pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg; + //pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg; + +#ifdef CONFIG_HOSTAPD_MLME + pHalFunc->hostap_mgnt_xmit_entry = &rtl8192cu_hostap_mgnt_xmit_entry; +#endif + pHalFunc->interface_ps_func = &rtl8192cu_ps_func; + + rtl8192c_set_hal_ops(pHalFunc); +_func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c new file mode 100755 index 000000000000..4d01b3cd38ca --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c @@ -0,0 +1,1208 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_OPS_OS_C_ + +#include +#include +#include +#include + +#ifndef PLATFORM_OS_CE + #error "PLATFORM_OS_CE shall be set \n" +#endif + +#ifndef CONFIG_USB_HCI + #error "CONFIG_USB_HCI shall be on!\n" +#endif + +#include +#include + +#include + + +struct zero_bulkout_context +{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + + + +#define PUSB_ERROR LPDWORD +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) + + +USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr); + + +static NTSTATUS usb_async_interrupt_in_complete( LPVOID Context ); +static NTSTATUS usb_async_interrupt_out_complete( LPVOID Context ); + +DWORD usb_write_port_complete( LPVOID Context ); +DWORD usb_read_port_complete( LPVOID Context ); + +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); +_func_exit_; +} + + + +BOOL +CloseTransferHandle( + LPCUSB_FUNCS pUsbFuncs, + USB_TRANSFER hTransfer + ) +{ + BOOL bRc = TRUE; + + // This assert may fail on suprise remove, + // but should pass during normal I/O. + // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) ); + + // CloseTransfer aborts any pending transfers + if ( !pUsbFuncs->lpCloseTransfer(hTransfer) ) { + + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError())); + bRc = FALSE; + } + + return bRc; +} + + +BOOL +GetTransferStatus( + LPCUSB_FUNCS pUsbFuncs, + USB_TRANSFER hTransfer, + LPDWORD pBytesTransferred , // OPTIONAL returns number of bytes transferred + PUSB_ERROR pUsbError // returns USB error code + ) +{ + + BOOL bRc = TRUE; + + if ( pUsbFuncs->lpGetTransferStatus(hTransfer, pBytesTransferred, pUsbError) ) { + if ( USB_NO_ERROR != *pUsbError ) { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError())); + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("GetTransferStatus (BytesTransferred:%d, UsbError:0x%x)\n", pBytesTransferred?*pBytesTransferred:-1, pUsbError?*pUsbError:-1 )); + } + } else { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_,("*** GetTransferStatus ERROR:%d ***\n", GetLastError())); + *pUsbError = USB_CANCELED_ERROR; + bRc = FALSE; + } + + return bRc; +} + + +// The driver should never read RxCmd register. We have to set +// RCR CMDHAT0 (bit6) to append Rx status before the Rx frame. +// +// |<-------- pBulkUrb->TransferBufferLength ------------>| +// +------------------+-------------------+------------+ +// | Rx status (16 bytes) | Rx frame ..... | CRC(4 bytes) | +// +------------------+-------------------+------------+ +// ^ +// ^pRfd->Buffer.VirtualAddress +// +/*! \brief USB RX IRP Complete Routine. + @param Context pointer of RT_RFD +*/ +u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + _adapter *adapter = (_adapter *)pdvobj_priv->padapter; + + struct recv_priv *precvpriv = &adapter->recvpriv; + + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + DWORD dwErr = ERROR_SUCCESS ; + DWORD dwBytesTransferred = 0 ; + USB_TRANSFER hTransfer = NULL; + USB_PIPE hPipe; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__)); + +#if (CONFIG_PWRCTRL == 1) + if (adapter->pwrctrlpriv.pnp_bstop_trx) + { + return _FALSE; + } +#endif + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved) + { + RT_TRACE(_module_hci_ops_os_c_, _drv_info_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved)!!!\n")); + return _FALSE; + } + + if(precvbuf !=NULL) + { + + // get a recv buffer + rtl8192cu_init_recvbuf(adapter, precvbuf); + + + + _rtw_spinlock(&precvpriv->lock); + precvpriv->rx_pending_cnt++; + precvbuf->irp_pending = _TRUE; + _rtw_spinunlock(&precvpriv->lock); + + + //translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj_priv, addr); + + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__)); + + precvbuf->usb_transfer_read_port = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, + usb_read_port_complete, + precvbuf, + USB_IN_TRANSFER|USB_SHORT_TRANSFER_OK, + MAX_RECVBUF_SZ, + precvbuf->pbuf, + 0); + + + if(precvbuf->usb_transfer_read_port) + { + + // GetTransferStatus(usb_funcs_vp, hTransfer, &dwBytesTransferred,&UsbRc); + + // CloseTransferHandle(usb_funcs_vp, hTransfer); + + } + else + { + + dwErr = GetLastError(); + //RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr)); + + } + +// if ( USB_NO_ERROR != UsbRc && ERROR_SUCCESS == dwErr) { +// dwErr = ERROR_GEN_FAILURE; +// } + + + if ( ERROR_SUCCESS != dwErr ) { + + SetLastError(dwErr); + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr)); + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port(%u)\n", __LINE__)); + + } + else // if(precvbuf !=NULL) + { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n")); + } + + return _TRUE; + +} + +DWORD usb_read_port_complete( PVOID context ) +{ + struct recv_buf *precvbuf = (struct recv_buf *)context; + _adapter *adapter = (_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + + + struct intf_hdl *pintfhdl = &adapter->pio_queue->intf; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + + + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + uint isevt, *pbuf; + int fComplete =_FALSE; + + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_complete(%u)\n", __LINE__)); + +_func_enter_; + + + _rtw_spinlock_ex(&precvpriv->lock); + precvbuf->irp_pending=_FALSE; + precvpriv->rx_pending_cnt --; + _rtw_spinunlock_ex(&precvpriv->lock); + + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(precvbuf->usb_transfer_read_port, &dwBytesTransferred, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(precvbuf->usb_transfer_read_port); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(precvbuf->usb_transfer_read_port); + + +#endif + + + if(USB_NO_ERROR != dwErr) + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete Fail :%d\n",dwErr)); + + { + + if ( dwBytesTransferred > MAX_RECVBUF_SZ || dwBytesTransferred < RXDESC_SIZE ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_, + ("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE): %d\n",dwBytesTransferred)); + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + + //usb_read_port(pintfhdl, 0, 0, (unsigned char *)precvframe); + } + else + { + precvbuf->transfer_len = dwBytesTransferred; + + pbuf = (uint*)precvbuf->pbuf; + + if((isevt = *(pbuf+1)&0x1ff) == 0x1ff) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_info_, + ("\n usb_read_port_complete: get a event\n")); + rxcmd_event_hdl(adapter, pbuf);//rx c2h events + + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets + { + //precvbuf->reuse = _TRUE; + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + } + } + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port_complete(%u)\n", __LINE__)); + +_func_exit_; + return ERROR_SUCCESS; +// return STATUS_MORE_PROCESSING_REQUIRED; +} + +void usb_read_port_cancel(_adapter *padapter){ + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_cancel(%u)\n",__FUNCTION__, __LINE__)); +} + +DWORD usb_write_mem_complete( LPVOID Context ) +{ + int fComplete =_FALSE; + DWORD dwBytes = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + _irqL irqL; + _list *head; + _list *plist; + struct io_req *pio_req; + struct io_queue *pio_q = (struct io_queue *) Context; + struct intf_hdl *pintf = &(pio_q->intf); + struct intf_priv *pintfpriv = pintf->pintfpriv; + _adapter *padapter = (_adapter *)pintf->adapter; + NTSTATUS status = STATUS_SUCCESS; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + + USB_HANDLE usbHandle = pdvobj_priv->usb_extension._hDevice; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + // get the head from the processing io_queue + head = &(pio_q->processing); + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_mem_complete %p\n", Context)); + +#if 1 + _enter_critical_bh(&(pio_q->lock), &irqL); + + + //free irp in processing list... + while(rtw_is_list_empty(head) != _TRUE) + { + plist = get_next(head); + rtw_list_delete(plist); + pio_req = LIST_CONTAINOR(plist, struct io_req, list); + _rtw_up_sema(&pio_req->sema); + } + + _exit_critical_bh(&(pio_q->lock), &irqL); +#endif + + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem ); + +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem_complete\n")); + +_func_exit_; + + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + + +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + + NTSTATUS NtStatus = STATUS_SUCCESS; + USB_PIPE hPipe; + _irqL irqL; + + int fComplete = _FALSE; + DWORD dwBytes = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + + struct io_req *pio_req; + + _adapter *adapter = (_adapter *)pintfhdl->adapter; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + + + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_mem(%u) pintfhdl %p wmem %p\n", __LINE__, pintfhdl, wmem)); + + // fetch a io_request from the io_queue + pio_req = alloc_ioreq(pio_queue); + + if ((pio_req == NULL)||(adapter->bSurpriseRemoved)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved )); + goto exit; + } + + _enter_critical_bh(&(pio_queue->lock), &irqL); + + + // insert the io_request into processing io_queue + rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing)); + + + if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); + goto exit; + } + + //translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj_priv, addr); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_,("usb_write_mem(%u)\n",__LINE__)); + + pio_req->usb_transfer_write_mem = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, + usb_write_mem_complete, + pio_queue, + USB_OUT_TRANSFER, + cnt, + wmem, + 0); + +#if 0 + + (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr); + + while( fComplete != _TRUE) + { + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem); + if(fComplete==_TRUE) + { + (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem ); + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem finished\n")); + break; + } + else + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, + ("usb_write_mem not yet finished %X\n", + pio_req->usb_transfer_write_mem)); + rtw_msleep_os(10); + } + + } + +#endif + + +// _rtw_down_sema(&pio_req->sema); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem(%X)\n",pio_req->usb_transfer_write_mem)); + + _exit_critical_bh(&(pio_queue->lock), &irqL); + + _rtw_down_sema(&pio_req->sema); + free_ioreq(pio_req, pio_queue); + +exit: +_func_exit_; + return; +} + +u32 usb_write_cnt=0; +u32 usb_complete_cnt=0; + +USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr) +{ + USB_PIPE PipeHandle = NULL; + _adapter *padapter = pNdisCEDvice->padapter; + + + if(pNdisCEDvice->nr_endpoint == 11) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3] ; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_BCNQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[6]; + break; + case RTL8712_DMA_BMCQ: //HI Queue + PipeHandle= padapter->halpriv.pipehdls_r8712[7]; + break; + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[8]; + break; + case RTL8712_DMA_RX0FF: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + case RTL8712_DMA_H2CCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[9]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 6) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 4) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VIQ: + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + } + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint)); + } + + return PipeHandle; + +} + +DWORD usb_bulkout_zero_complete( LPVOID pZeroContext ) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext; + _adapter * padapter = pcontext->padapter; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + + int fComplete =_FALSE; + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + +_func_enter_; + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_bulkout_zero_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); + +#endif + + if(pcontext) + { + if(pcontext->pbuf) + { + rtw_mfree(pcontext->pbuf, sizeof(int)); + } + + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); + } + +_func_exit_; + + return ERROR_SUCCESS; + + +} + +u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + struct zero_bulkout_context *pcontext; + unsigned char *pbuf; + u8 len = 0 ; + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + + + LPCUSB_FUNCS usb_funcs_vp = pdvobj->usb_extension._lpUsbFuncs; + + USB_PIPE hPipe; + +_func_enter_; + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + return _FAIL; + } + + + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); + + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); + + len = 0; + + pcontext->pbuf = pbuf; + pcontext->purb = NULL; + pcontext->pirp = NULL; + pcontext->padapter = padapter; + + +//translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj, addr); + + + + + pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, usb_bulkout_zero_complete, + pcontext, USB_OUT_TRANSFER, + len, pbuf, 0); + + +_func_exit_; + + return _SUCCESS; + +} + +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + + u32 i, bwritezero = _FALSE; + u32 ac_tag = addr; + + u8* ptr; + + struct intf_priv * pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + _adapter * padapter = pdvobj_priv->padapter; + + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + struct xmit_frame * pxmitframe = (struct xmit_frame *)wmem; + + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + USB_PIPE hPipe; + + u32 bResult = _FALSE; + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_port\n")); + +#if (CONFIG_PWRCTRL == 1) + if(padapter->pwrctrlpriv.pnp_bstop_trx==_TRUE){ + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); + + } +#endif + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + bResult = _FALSE; + goto exit; + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port(%u)\n", __LINE__)); + + for(i=0; i<8; i++) + { + if(pxmitframe->bpending[i] == _FALSE) + { + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt++; + pxmitframe->bpending[i] = _TRUE; + _rtw_spinunlock(&pxmitpriv->lock); + + pxmitframe->sz[i] = cnt; + pxmitframe->ac_tag[i] = ac_tag; + + break; + } + } + + + //TODO: + if (pdvobj_priv->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt)); + // cnt=cnt+1; + bwritezero = _TRUE; + + } + } + else + { + if(cnt > 0 && cnt%64 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("cnt=%d\n", cnt)); + // cnt=cnt+1; + bwritezero = _TRUE; + + } + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port: pipe handle convert\n")); + + //translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj_priv, addr); + + +#if 0 + // for tx fifo, the maximum payload number is 8, + // we workaround this issue here by separate whole fifo into 8 segments. + if (cnt <= 500) + cnt = 500; +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, + ("usb_write_port(%u): pxmitframe %X pxmitframe->padapter %X\n",__LINE__, pxmitframe, pxmitframe->padapter)); + + pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, usb_write_port_complete, + pxmitframe, USB_OUT_TRANSFER, + cnt, pxmitframe->mem_addr, 0); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + + ptr=(u8 *)&pxmitframe->mem; + +#if 0 + if (pdvobj_priv->ishighspeed) + { + ptr=ptr+512; + } + else + { + ptr=ptr+64; + + } +#endif + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } + +// if (!pxmitframe->usb_transfer_xmit) +// padapter->bSurpriseRemoved=_TRUE; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + bResult = _SUCCESS; + +exit: +_func_exit_; + return bResult; +} + +DWORD usb_write_port_complete( LPVOID Context ) +{ + +// u8 *ptr; + + struct xmit_frame * pxmitframe = (struct xmit_frame *) Context; + _adapter * padapter = pxmitframe->padapter; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + int fComplete =_FALSE; + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u), pxmitframe %X\n",__FUNCTION__, __LINE__, Context)); + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("+usb_write_port_complete\n")); + + _rtw_spinlock_ex(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; + _rtw_spinunlock_ex(&pxmitpriv->lock); + + if(pxmitpriv->txirp_cnt==0){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } + + + //not to consider tx fragment + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_port_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); + +#else + + if((*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port)) + { + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); + } + +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, + ("%s(%u): pxmitpriv %X pxmitpriv->free_xmitframe_cnt %X pxmitframe->padapter %X pxmitframe->padapter %X\n", + __LINE__, pxmitpriv, pxmitpriv->free_xmitframe_cnt, pxmitframe->padapter)); + + rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf); + +_func_exit_; + + return STATUS_SUCCESS; +} + +DWORD usb_write_scsi_complete(LPVOID pTxContext) +{ +#ifndef PLATFORM_OS_CE + struct SCSI_BUFFER_ENTRY *psb_entry = (struct SCSI_BUFFER_ENTRY *)pTxContext; + _adapter *padapter = psb_entry->padapter; + struct SCSI_BUFFER *psb = padapter->pscsi_buf; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; + LPCUSB_FUNCS lpUsbFuncs = pdvobj_priv->pUsbExtension->_lpUsbFuncs; + + int fComplete =_FALSE; + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u): circ_space = %d\n",__FUNCTION__, __LINE__, CIRC_SPACE( psb->head,psb->tail, SCSI_BUFFER_NUMBER))); + +#if 1 + + (*lpUsbFuncs->lpGetTransferStatus)(psb_entry->usb_transfer_scsi_txcmd, &dwBytesTransferred, &dwErr); + fComplete = (*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_scsi_complete CloseTransfer before complete\n")); + } + (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd); + +#else + + if((*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd)) + (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd); +#endif + + memset(psb_entry->entry_memory, 0, 8); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + if((psb->tail+1)==SCSI_BUFFER_NUMBER) + psb->tail=0; + else + psb->tail++; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + if(CIRC_CNT(psb->head,psb->tail,SCSI_BUFFER_NUMBER)==0){ + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("write_txcmd_scsififo_callback: up_sema\n")); + _rtw_up_sema(&pxmitpriv->xmit_sema); + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + if(padapter->bSurpriseRemoved) { + return STATUS_MORE_PROCESSING_REQUIRED; + } + +_func_exit_; +#endif + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +uint usb_write_scsi(struct intf_hdl *pintfhdl, u32 cnt, u8 *wmem) +{ + +#ifndef PLATFORM_OS_CE + + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pdev = (struct dvobj_priv*)&padapter->dvobjpriv; + + struct SCSI_BUFFER *psb =padapter->pscsi_buf; + struct SCSI_BUFFER_ENTRY *psb_entry=LIST_CONTAINOR(wmem,struct SCSI_BUFFER_ENTRY,entry_memory); + +_func_enter_; + if(padapter->bSurpriseRemoved||padapter->bDriverStopped) + return 0; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + psb_entry->usb_transfer_scsi_txcmd=pdev->pUsbExtension->_lpUsbFuncs->lpIssueBulkTransfer( + pdev->scsi_out_pipehandle, + usb_write_scsi_complete, + psb_entry, + USB_OUT_TRANSFER, + cnt, + wmem, + 0); + +_func_exit_; +#endif + + return _SUCCESS; +} + + +/* + */ +uint usb_init_intf_priv(struct intf_priv *pintfpriv) +{ + // get the dvobj_priv object + struct dvobj_priv * pNdisCEDvice = (struct dvobj_priv *) pintfpriv->intf_dev; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + // set init intf_priv init status as _IOREADY + pintfpriv->intf_status = _IOREADY; + + // determine the max io size by dvobj_priv.ishighspeed + if(pNdisCEDvice->ishighspeed) + pintfpriv->max_iosz = 128; + else + pintfpriv->max_iosz = 64; + + // read/write size set as 0 + pintfpriv->io_wsz = 0; + pintfpriv->io_rsz = 0; + + // init io_rwmem buffer + pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4); + if (pintfpriv->allocated_io_rwmem == NULL) + { + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4); + return _FAIL; + } + else + { + // word align the io_rwmem + pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 - ( (u32)(pintfpriv->allocated_io_rwmem) & 3); + } + +#ifndef PLATFORM_OS_CE + + // init io_r_mem buffer + pintfpriv->allocated_io_r_mem = rtw_zmalloc(pintfpriv->max_iosz +4); + if (pintfpriv->allocated_io_r_mem == NULL) + { + rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz +4); + return _FAIL; + } + else + { + // word align the io_rwmem + pintfpriv->io_r_mem = pintfpriv->allocated_io_r_mem + 4 - ( (u32)(pintfpriv->allocated_io_r_mem) & 3); + } +#endif + + return _SUCCESS; +} + +void usb_unload_intf_priv(struct intf_priv *pintfpriv) +{ +#ifndef PLATFORM_OS_CE + + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4); + rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz+4); +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); +} + + + +void usb_write_port_cancel(_adapter *padapter) +{ + + sint i,j; + struct dvobj_priv *pdev = &padapter->dvobjpriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + struct xmit_frame *pxmitframe; + + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++ + _rtw_spinunlock(&pxmitpriv->lock); + + if (pxmitpriv->txirp_cnt) + { + // Canceling Pending Recv Irp + pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; + + for( i = 0; i < NR_XMITFRAME; i++ ) + { + for(j=0;j<8;j++) + { + if (pxmitframe->bpending[j]==_TRUE) + { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n")); + + } + } + + pxmitframe++; + } + + _rtw_down_sema(&(pxmitpriv->tx_retevt)); + + } + +} + +DWORD usbctrl_vendorreq_complete(LPVOID lpvNotifyParameter) +{ + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv*)lpvNotifyParameter; + + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq_complete\n")); + + return STATUS_SUCCESS; +} + + +int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + u8 ret=_TRUE; +// NTSTATUS ntstatus; +// int fComplete; +// LPCUSB_DEVICE lpDeviceInfo; + + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev; + + USB_TRANSFER usbTrans; + USB_DEVICE_REQUEST usb_device_req; + USB_HANDLE usbHandle = pdvobjpriv->usb_extension._hDevice; + LPCUSB_FUNCS usbFuncs = pdvobjpriv->usb_extension._lpUsbFuncs; + + u32 transfer_flags = 0; + + _func_enter_; + + memset( &usb_device_req, 0, sizeof( USB_DEVICE_REQUEST ) ); + + if( 0x01 == requesttype ) + { + usb_device_req.bmRequestType = USB_REQUEST_DEVICE_TO_HOST | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE; + } + else + { + usb_device_req.bmRequestType = USB_REQUEST_HOST_TO_DEVICE | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE; + } + + usb_device_req.bRequest = request; + usb_device_req.wValue = value; + usb_device_req.wIndex = index; + usb_device_req.wLength = len; + + if (requesttype == 0x01) + { + transfer_flags = USB_IN_TRANSFER;//read_in + } + else + { + transfer_flags= USB_OUT_TRANSFER;//write_out + } + + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq\n",__FUNCTION__,__LINE__)); + +#if 0 + // Remember to add callback for sync + usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle, + usbctrl_vendorreq_complete, pdvobjpriv, + transfer_flags, &usb_device_req, pdata, 0); +#else + // Remember to add callback for sync + usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle, + NULL, 0, + transfer_flags, &usb_device_req, pdata, 0); +#endif + +// rtw_usleep_os(10); + + if ( usbTrans ) + { + DWORD dwBytes = 0; + DWORD dwErr = USB_CANCELED_ERROR; + int fComplete; + + (*usbFuncs->lpGetTransferStatus)(usbTrans, &dwBytes, &dwErr); + + fComplete = (*usbFuncs->lpIsTransferComplete)(usbTrans); + + if (fComplete== _TRUE) + { + (*usbFuncs->lpCloseTransfer)(usbTrans); + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("usbctrl_vendorreq lpCloseTransfer\n")); + } + + if ( dwErr != USB_NO_ERROR || fComplete != _TRUE) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq lpCloseTransfer without complete\n")); + ret = _FALSE; + goto exit; + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq without usbTrans\n")); + ret = _FALSE; + goto exit; + + } + +exit: + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("-usbctrl_vendorreq\n")); +_func_exit_; + + return ret; + +} + + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c new file mode 100755 index 000000000000..bcb79c79f9ab --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c @@ -0,0 +1,1997 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_OPS_OS_C_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +struct zero_bulkout_context{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + +#define REALTEK_USB_VENQT_MAX_BUF_SIZE 254 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)) +//#define USB_CONTROL_MSG_TIMEOUT 500 //ms +#define USB_CONTROL_MSG_TIMEOUT 5000 //ms +#else +//#define USB_CONTROL_MSG_TIMEOUT HZ/2 //jiffies +#define USB_CONTROL_MSG_TIMEOUT 5*HZ //jiffies +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) +#define _usbctrl_vendorreq_async_callback(urb, regs) _usbctrl_vendorreq_async_callback(urb) +#define usb_bulkout_zero_complete(purb, regs) usb_bulkout_zero_complete(purb) +#define usb_write_mem_complete(purb, regs) usb_write_mem_complete(purb) +#define usb_write_port_complete(purb, regs) usb_write_port_complete(purb) +#define usb_read_port_complete(purb, regs) usb_read_port_complete(purb) +#define usb_read_interrupt_complete(purb, regs) usb_read_interrupt_complete(purb) +#endif + +#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC +static int usbctrl_vendorreq(struct dvobj_priv *pdvobjpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + unsigned int pipe; + int status = 0; + u32 tmp_buflen=0; + u8 reqtype; + u8 *pIo_buf; + _adapter *padapter = pdvobjpriv->padapter ; + struct usb_device *udev=pdvobjpriv->pusbdev; + + if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + if(len>MAX_VENDOR_REQ_CMD_SIZE) + { + DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ ); + return(-1); + } + + if ( pdvobjpriv->usb_vendor_req_buf== NULL) + { + DBG_8192C( "[%s] usb_vendor_req_buf == NULL \n", __FUNCTION__ ); + return(-1); + } + + _enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); + + pIo_buf = pdvobjpriv->usb_vendor_req_buf; + _rtw_memset(pIo_buf, 0, MAX_VENDOR_REQ_CMD_SIZE); + + if (requesttype == 0x01) + { + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else + { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + _rtw_memcpy( pIo_buf, pdata, len); + } + + status = usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, USB_CONTROL_MSG_TIMEOUT); + + if (status < 0) + { + if(status == (-ESHUTDOWN) || status == (-ENODEV)) + { + DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); + padapter->bDriverStopped=_TRUE; + padapter->bSurpriseRemoved=_TRUE; + } + else{ + DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + _adapter *padapter = pdvobjpriv->padapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL; + } +#endif + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value, status, *(u32*)pdata)); + } + } + else if ( status > 0 ) // Success this control transfer. + { + if ( requesttype == 0x01 ) + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. + _rtw_memcpy( pdata, pIo_buf, status ); + } + } + _exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); + return status; + +} +#else // CONFIG_USB_VENDOR_REQ_PREALLOC + +static int usbctrl_vendorreq(struct dvobj_priv *pdvobjpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + unsigned int pipe; + int status = 0; + u32 tmp_buflen=0; + u8 reqtype; + + +#ifndef CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD + + u8 tmp_buf[MAX_USB_IO_CTL_SIZE]; +#endif + + struct usb_device *udev=pdvobjpriv->pusbdev; + + // Added by Albert 2010/02/09 + // For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment. + // Trying to fix it here. + + u8 *palloc_buf, *pIo_buf; + + _adapter *padapter = pdvobjpriv->padapter ; + if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + + if(len>MAX_VENDOR_REQ_CMD_SIZE) + { + DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ ); + return(-1); + } + +#ifdef CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD + palloc_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT); + tmp_buflen = (u32)len + ALIGNMENT_UNIT; +#else + palloc_buf = tmp_buf; + tmp_buflen = MAX_USB_IO_CTL_SIZE; +#endif + + if ( palloc_buf== NULL) + { + DBG_8192C( "[%s] Can't alloc memory for vendor request\n", __FUNCTION__ ); + return(-1); + } + + _rtw_memset(palloc_buf, 0, tmp_buflen); + + pIo_buf = palloc_buf + ALIGNMENT_UNIT -((SIZE_PTR)(palloc_buf) & 0x0f ); + + + if (requesttype == 0x01) + { + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else + { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + _rtw_memcpy( pIo_buf, pdata, len); + } + + status = usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, USB_CONTROL_MSG_TIMEOUT); + + if (status < 0) + { + if(status == (-ESHUTDOWN) + || status == -ENODEV ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); + DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); + padapter->bDriverStopped=_TRUE; + } + else{ + DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + _adapter *padapter = pdvobjpriv->padapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL; + } +#endif + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value, status, *(u32*)pdata)); + } + } + else if ( status > 0 ) // Success this control transfer. + { + if ( requesttype == 0x01 ) + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. + _rtw_memcpy( pdata, pIo_buf, status ); + } + } + +#ifdef CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD + rtw_mfree( palloc_buf,tmp_buflen); +#endif + + return status; + +} +#endif // CONFIG_USB_VENDOR_REQ_PREALLOC + +static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data=0; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x01;//read_in + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 1; + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return (u8)(le32_to_cpu(data)&0x0ff); + +} + +static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data=0; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x01;//read_in + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 2; + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return (u16)(le32_to_cpu(data)&0xffff); + +} + +static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data=0; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x01;//read_in + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 4; + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return le32_to_cpu(data); + +} + +static void usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 1; + + data = val; + data = cpu_to_le32(data&0x000000ff); + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + +} + +static void usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 2; + + data = val; + data = cpu_to_le32(data&0x0000ffff); + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + +} + +static void usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 4; + data = cpu_to_le32(val); + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + +} +#define VENDOR_CMD_MAX_DATA_LEN 254 +void usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u8 buf[VENDOR_CMD_MAX_DATA_LEN]={0}; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = length; + _rtw_memcpy(buf, pdata, len ); + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, buf, len, requesttype); + + _func_exit_; + +} + +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ +static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs) +{ + if(urb){ + if(urb->context){ + kfree(urb->context); + } + usb_free_urb(urb); + } +} + +static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + + int rc; + unsigned int pipe; + u8 reqtype; + struct usb_ctrlrequest *dr; + struct urb *urb; + struct rtl819x_async_write_data { + u8 data[REALTEK_USB_VENQT_MAX_BUF_SIZE]; + struct usb_ctrlrequest dr; + } *buf; + + if (requesttype == VENDOR_READ){ + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + } + + //buf = kmalloc(sizeof(*buf), GFP_ATOMIC); + buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf)); + if (!buf) + return -ENOMEM; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + rtw_mfree((u8*)buf,sizeof(*buf)); + return -ENOMEM; + } + + dr = &buf->dr; + + dr->bRequestType = reqtype; + dr->bRequest = request; + dr->wValue = cpu_to_le16(value); + dr->wIndex = cpu_to_le16(index); + dr->wLength = cpu_to_le16(len); + + _rtw_memcpy(buf, pdata, len); + + usb_fill_control_urb(urb, udev, pipe, + (unsigned char *)dr, buf, len, + _usbctrl_vendorreq_async_callback, buf); + + rc = usb_submit_urb(urb, GFP_ATOMIC); + if (rc < 0) { + rtw_mfree((u8*)buf,sizeof(*buf)); + usb_free_urb(urb); + } + return rc; + +} + +static void usb_write_async(struct usb_device *udev, u32 addr, u32 val, u16 len) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u32 data; + + requesttype = VENDOR_WRITE;//write_out + request = REALTEK_USB_VENQT_CMD_REQ; + index = REALTEK_USB_VENQT_CMD_IDX;//n/a + + wvalue = (u16)(addr&0x0000ffff); + data = val & (0xffffffff >> ((4 - len) * 8)); + data = cpu_to_le32(data); + + _usbctrl_vendorreq_async_write(udev, request, wvalue, index, &data, len, requesttype); +} +static void usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) +{ + u32 data; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = cpu_to_le32(val & 0xFF); + usb_write_async(udev, addr, val, 1); + _func_exit_; +} + +static void usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) +{ + u32 data; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = cpu_to_le32(val & 0xFFFF); + usb_write_async(udev, addr, val, 2); + _func_exit_; +} +static void usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) +{ + u32 data; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = cpu_to_le32(val); + usb_write_async(udev, addr, val, 4); + _func_exit_; +} +#endif + +static int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) +{ + int pipe=0, ep_num=0; + _adapter *padapter = pdvobj->padapter; + struct usb_device *pusbd = pdvobj->pusbdev; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if(addr == RECV_BULK_IN_ADDR) + { + pipe=usb_rcvbulkpipe(pusbd, 0x01); + + return pipe; + } + + if(addr == RECV_INT_IN_ADDR) + { + pipe=usb_rcvbulkpipe(pusbd, 0x04); + + return pipe; + } + + if(addr < HW_QUEUE_ENTRY) + { + ep_num = (pHalData->Queue2EPNum[(u8)addr] & 0x0f); + + pipe = usb_sndbulkpipe(pusbd, ep_num); + + return pipe; + } + + return pipe; + +} + +static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context; + + //DBG_8192C("+usb_bulkout_zero_complete\n"); + + if(pcontext) + { + if(pcontext->pbuf) + { + rtw_mfree(pcontext->pbuf, sizeof(int)); + } + + if(pcontext->purb && (pcontext->purb==purb)) + { + usb_free_urb(pcontext->purb); + } + + + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); + } + + +} + +static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + int pipe, status, len; + u32 ret; + unsigned char *pbuf; + struct zero_bulkout_context *pcontext; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + + //DBG_8192C("+usb_bulkout_zero\n"); + + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + return _FAIL; + } + + + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); + + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); + purb = usb_alloc_urb(0, GFP_ATOMIC); + + len = 0; + pcontext->pbuf = pbuf; + pcontext->purb = purb; + pcontext->pirp = NULL; + pcontext->padapter = padapter; + + + //translate DMA FIFO addr to pipehandle + //pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + pbuf, + len, + usb_bulkout_zero_complete, + pcontext);//context is pcontext + + status = usb_submit_urb(purb, GFP_ATOMIC); + + if (!status) + { + ret= _SUCCESS; + } + else + { + ret= _FAIL; + } + + + return _SUCCESS; + +} + +static void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + +} + +static void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + +} + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +static void usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs) +{ + int err; + _adapter *padapter = (_adapter *)purb->context; + + if(purb->status==0)//SUCCESS + { + if (purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX)) + { + DBG_8192C("usb_read_interrupt_complete: purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX) \n"); + } + + err = usb_submit_urb(purb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, purb->status); + } + } + else + { + DBG_8192C("###=> usb_read_interrupt_complete => urb status(%d)\n", purb->status); + + switch(purb->status) { + case -EINVAL: + case -EPIPE: + case -ENODEV: + case -ESHUTDOWN: + //padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); + case -ENOENT: + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); + break; + case -EPROTO: + break; + case -EINPROGRESS: + DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); + break; + default: + break; + } + } + +} + +static u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr) +{ + int err, pipe; + u32 ret = _SUCCESS; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; + _adapter *adapter = (_adapter *)pdvobj->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + +_func_enter_; + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe, + precvpriv->int_in_buf, + sizeof(INTERRUPT_MSG_FORMAT_EX), + usb_read_interrupt_complete, + adapter, + 1); + + err = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, precvpriv->int_in_urb->status); + ret = _FAIL; + } + +_func_exit_; + + return ret; +} +#endif + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX +static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf) +{ + u8 *pbuf; + u8 frag, mf, shift_sz = 0; + u16 pkt_cnt, drvinfo_sz; + u32 pkt_len, pkt_offset, skb_len, alloc_sz; + s32 transfer_len; + struct recv_stat *prxstat; + _pkt *pkt_copy = NULL; + union recv_frame *precvframe = NULL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &precvpriv->free_recv_queue; + + + transfer_len = (s32)precvbuf->transfer_len; + pbuf = precvbuf->pbuf; + + prxstat = (struct recv_stat *)pbuf; + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + +#if 0 //temp remove when disable usb rx aggregation + if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_lenrxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4)); + + prxstat = (struct recv_stat *)pbuf; + pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff; + + + mf = (le32_to_cpu(prxstat->rxdw1) >> 27) & 0x1;//more fragment bit + frag = (le32_to_cpu(prxstat->rxdw2) >> 12) & 0xf;//fragmentation number + + drvinfo_sz = (le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16; + drvinfo_sz = drvinfo_sz << 3;//uint (2^3) = 8 bytes; REG_RX_DRVINFO_SZ + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: DRV_INFO_SIZE=%d\n", drvinfo_sz)); + + pkt_offset = pkt_len + drvinfo_sz + RXDESC_SIZE; + + if((pkt_len<=0) || (pkt_offset>transfer_len)) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n")); + goto _exit_recvbuf2recvframe; + } + + // Modified by Albert 20101213 + // For 8 bytes IP header alignment. + if ( ( le32_to_cpu( prxstat->rxdw0 ) >> 23 ) & 0x01 ) // Qos data, wireless lan header length is 26 + { + shift_sz = 6; + } + else + { + shift_sz = 0; + } + + precvframe = rtw_alloc_recvframe(pfree_recv_queue); + if(precvframe==NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n")); + goto _exit_recvbuf2recvframe; + } + + _rtw_init_listhead(&precvframe->u.hdr.list); + precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch. + precvframe->u.hdr.len=0; + + //skb_len = pkt_offset; + skb_len = pkt_len; + + // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. + // modify alloc_sz for recvive crc error packet by thomas 2011-06-02 + if((mf ==1)&&(frag == 0)){ + //alloc_sz = 1664; //1664 is 128 alignment. + if(skb_len <= 1650) + alloc_sz = 1664; + else + alloc_sz = skb_len + 14; + } + else { + alloc_sz = skb_len; + // 6 is for IP header 8 bytes alignment in QoS packet case. + // 8 is for skb->data 4 bytes alignment. + alloc_sz += 14; + } + + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pkt_copy = dev_alloc_skb(alloc_sz); +#else + pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); +#endif + if(pkt_copy) + { + pkt_copy->dev = padapter->pnetdev; + precvframe->u.hdr.pkt = pkt_copy; + skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address + skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz. + _rtw_memcpy(pkt_copy->data, (pbuf + drvinfo_sz + RXDESC_SIZE), skb_len); + precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data; + precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz; + } + else + { + DBG_8192C("recvbuf2recvframe:can not allocate memory for skb copy\n"); + //precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + //precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf; + //precvframe->u.hdr.rx_end = pbuf + (pkt_offset>1612?pkt_offset:1612); + + precvframe->u.hdr.pkt = NULL; + rtw_free_recvframe(precvframe, pfree_recv_queue); + + goto _exit_recvbuf2recvframe; + } + + recvframe_put(precvframe, skb_len); + //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); + +#ifdef CONFIG_USB_RX_AGGREGATION + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + case USB_RX_AGG_MIX: + pkt_offset = (u16)_RND128(pkt_offset); + break; + case USB_RX_AGG_USB: + pkt_offset = (u16)_RND4(pkt_offset); + break; + case USB_RX_AGG_DISABLE: + default: + break; + } +#endif + + //because the endian issue, driver avoid reference to the rxstat after calling update_recvframe_attrib_from_recvstat(); + rtl8192cu_update_recvframe_attrib_from_recvstat(precvframe, prxstat); + + if(rtw_recv_entry(precvframe) != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); + } + + pkt_cnt--; + transfer_len -= pkt_offset; + pbuf += pkt_offset; + precvframe = NULL; + pkt_copy = NULL; + + if(transfer_len>0 && pkt_cnt==0) + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + + }while((transfer_len>0) && (pkt_cnt>0)); + +_exit_recvbuf2recvframe: + + return _SUCCESS; +} + +void rtl8192cu_recv_tasklet(void *priv) +{ + struct recv_buf *precvbuf = NULL; + _adapter *padapter = (_adapter*)priv; + struct recv_priv *precvpriv = &padapter->recvpriv; + + while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) + { + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) + { + DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); + + break; + } + + + recvbuf2recvframe(padapter, precvbuf); + + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + +} + +static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) +{ + struct recv_buf *precvbuf = (struct recv_buf *)purb->context; + _adapter *padapter =(_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); + + precvpriv->rx_pending_cnt --; + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + + goto exit; + } + + if(purb->status==0)//SUCCESS + { + if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n")); + + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + ATOMIC_SET(&padapter->dvobjpriv.continual_urb_error, 0); + + precvbuf->transfer_len = purb->actual_length; + + //rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf); + rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue); + + tasklet_schedule(&precvpriv->recv_tasklet); + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status)); + + DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); + + switch(purb->status) { + case -EINVAL: + case -EPIPE: + case -ENODEV: + case -ESHUTDOWN: + //padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); + case -ENOENT: + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); + break; + case -EPROTO: + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL; + } + #endif + + if(ATOMIC_INC_RETURN(&padapter->dvobjpriv.continual_urb_error) > MAX_CONTINUAL_URB_ERR) { + DBG_871X("continual_urb_error > %d\n", MAX_CONTINUAL_URB_ERR); + break; + } + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + break; + case -EINPROGRESS: + DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); + break; + default: + break; + } + + } + +exit: + +_func_exit_; + +} + +static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + int err, pipe; + u32 ret = _SUCCESS; + PURB purb = NULL; + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; + _adapter *adapter = (_adapter *)pdvobj->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + +_func_enter_; + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + if(precvbuf !=NULL) + { + rtl8192cu_init_recvbuf(adapter, precvbuf); + + if(precvbuf->pbuf) + { + precvpriv->rx_pending_cnt++; + + purb = precvbuf->purb; + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + precvbuf->pbuf, + MAX_RECVBUF_SZ, + usb_read_port_complete, + precvbuf);//context is precvbuf + + purb->transfer_dma = precvbuf->dma_transfer_addr; + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + err = usb_submit_urb(purb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status)); + DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status); + ret = _FAIL; + } + + } + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n")); + ret = _FAIL; + } + +_func_exit_; + + return ret; +} +#else // CONFIG_USE_USB_BUFFER_ALLOC_RX +static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb) +{ + u8 *pbuf; + u8 frag, mf, shift_sz = 0; + u16 pkt_cnt, drvinfo_sz; + u32 pkt_len, pkt_offset, skb_len, alloc_sz; + s32 transfer_len; + struct recv_stat *prxstat; + _pkt *pkt_copy = NULL; + union recv_frame *precvframe = NULL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &precvpriv->free_recv_queue; + + + transfer_len = (s32)pskb->len; + pbuf = pskb->data; + + prxstat = (struct recv_stat *)pbuf; + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + +#if 0 //temp remove when disable usb rx aggregation + if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_lenrxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4)); + + prxstat = (struct recv_stat *)pbuf; + pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff; + + mf = (le32_to_cpu(prxstat->rxdw1) >> 27) & 0x1;//more fragment bit + frag = (le32_to_cpu(prxstat->rxdw2) >> 12) & 0xf;//fragmentation number + + drvinfo_sz = (le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16; + drvinfo_sz = drvinfo_sz << 3;//uint (2^3) = 8 bytes; REG_RX_DRVINFO_SZ + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: DRV_INFO_SIZE=%d\n", drvinfo_sz)); + + pkt_offset = pkt_len + drvinfo_sz + RXDESC_SIZE; + + if((pkt_len<=0) || (pkt_offset>transfer_len)) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n")); + goto _exit_recvbuf2recvframe; + } + + // Modified by Albert 20101213 + // For 8 bytes IP header alignment. + if ( ( le32_to_cpu( prxstat->rxdw0 ) >> 23 ) & 0x01 ) // Qos data, wireless lan header length is 26 + { + shift_sz = 6; + } + else + { + shift_sz = 0; + } + + precvframe = rtw_alloc_recvframe(pfree_recv_queue); + if(precvframe==NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n")); + goto _exit_recvbuf2recvframe; + } + + _rtw_init_listhead(&precvframe->u.hdr.list); + precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch. + precvframe->u.hdr.len=0; + + //skb_len = pkt_offset; + skb_len = pkt_len; + + // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. + // modify alloc_sz for recvive crc error packet by thomas 2011-06-02 + if((mf ==1)&&(frag == 0)){ + //alloc_sz = 1664; //1664 is 128 alignment. + if(skb_len <= 1650) + alloc_sz = 1664; + else + alloc_sz = skb_len + 14; + } + else { + alloc_sz = skb_len; + // 6 is for IP header 8 bytes alignment in QoS packet case. + // 8 is for skb->data 4 bytes alignment. + alloc_sz += 14; + } + + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pkt_copy = dev_alloc_skb(alloc_sz); +#else + pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); +#endif + if(pkt_copy) + { + pkt_copy->dev = padapter->pnetdev; + precvframe->u.hdr.pkt = pkt_copy; + skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address + skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz. + _rtw_memcpy(pkt_copy->data, (pbuf + drvinfo_sz + RXDESC_SIZE), skb_len); + precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data; + precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz; + } + else + { + precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + if(pkt_copy) + { + precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf; + precvframe->u.hdr.rx_end = pbuf + alloc_sz; + } + else + { + DBG_8192C("recvbuf2recvframe: skb_clone fail\n"); + goto _exit_recvbuf2recvframe; + } + } + + recvframe_put(precvframe, skb_len); + //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); + +#ifdef CONFIG_USB_RX_AGGREGATION + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + case USB_RX_AGG_MIX: + pkt_offset = (u16)_RND128(pkt_offset); + break; + case USB_RX_AGG_USB: + pkt_offset = (u16)_RND4(pkt_offset); + break; + case USB_RX_AGG_DISABLE: + default: + break; + } +#endif + + //because the endian issue, driver avoid reference to the rxstat after calling update_recvframe_attrib_from_recvstat(); + rtl8192cu_update_recvframe_attrib_from_recvstat(precvframe, prxstat); + + if(rtw_recv_entry(precvframe) != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); + } + + pkt_cnt--; + transfer_len -= pkt_offset; + pbuf += pkt_offset; + precvframe = NULL; + pkt_copy = NULL; + + if(transfer_len>0 && pkt_cnt==0) + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + + }while((transfer_len>0) && (pkt_cnt>0)); + +_exit_recvbuf2recvframe: + + return _SUCCESS; +} + +void rtl8192cu_recv_tasklet(void *priv) +{ + _pkt *pskb; + _adapter *padapter = (_adapter*)priv; + struct recv_priv *precvpriv = &padapter->recvpriv; + + while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) + { + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) + { + DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); + dev_kfree_skb_any(pskb); + break; + } + + recvbuf2recvframe(padapter, pskb); + +#ifdef CONFIG_PREALLOC_RECV_SKB + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + skb_reset_tail_pointer(pskb); +#else + pskb->tail = pskb->data; +#endif + pskb->len = 0; + + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); + +#else + dev_kfree_skb_any(pskb); +#endif + + } + +} + + +static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) +{ + _irqL irqL; + uint isevt, *pbuf; + struct recv_buf *precvbuf = (struct recv_buf *)purb->context; + _adapter *padapter =(_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); + + //_enter_critical(&precvpriv->lock, &irqL); + //precvbuf->irp_pending=_FALSE; + //precvpriv->rx_pending_cnt --; + //_exit_critical(&precvpriv->lock, &irqL); + + precvpriv->rx_pending_cnt --; + + //if(precvpriv->rx_pending_cnt== 0) + //{ + // RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n")); + // _rtw_up_sema(&precvpriv->allrxreturnevt); + //} + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + + #ifdef CONFIG_PREALLOC_RECV_SKB + precvbuf->reuse = _TRUE; + #else + if(precvbuf->pskb){ + DBG_8192C("==> free skb(%p)\n",precvbuf->pskb); + dev_kfree_skb_any(precvbuf->pskb); + } + #endif + + goto exit; + } + + if(purb->status==0)//SUCCESS + { + if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n")); + precvbuf->reuse = _TRUE; + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + ATOMIC_SET(&padapter->dvobjpriv.continual_urb_error, 0); + + precvbuf->transfer_len = purb->actual_length; + + skb_put(precvbuf->pskb, purb->actual_length); + skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb); + + if (skb_queue_len(&precvpriv->rx_skb_queue)<=1) + tasklet_schedule(&precvpriv->recv_tasklet); + + precvbuf->pskb = NULL; + precvbuf->reuse = _FALSE; + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status)); + + DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); + + switch(purb->status) { + case -EINVAL: + case -EPIPE: + case -ENODEV: + case -ESHUTDOWN: + //padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); + case -ENOENT: + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); + break; + case -EPROTO: + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL; + } + #endif + + if(ATOMIC_INC_RETURN(&padapter->dvobjpriv.continual_urb_error) > MAX_CONTINUAL_URB_ERR) { + DBG_871X("continual_urb_error > %d\n", MAX_CONTINUAL_URB_ERR); + break; + } + + precvbuf->reuse = _TRUE; + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + break; + case -EINPROGRESS: + DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); + break; + default: + break; + } + + } + +exit: + +_func_exit_; + +} + +static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + _irqL irqL; + int err, pipe; + SIZE_PTR tmpaddr=0; + SIZE_PTR alignment=0; + u32 ret = _SUCCESS; + PURB purb = NULL; + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; + _adapter *adapter = (_adapter *)pdvobj->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + + +_func_enter_; + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + +#ifdef CONFIG_PREALLOC_RECV_SKB + if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) + { + if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue))) + { + precvbuf->reuse = _TRUE; + } + } +#endif + + + if(precvbuf !=NULL) + { + rtl8192cu_init_recvbuf(adapter, precvbuf); + + //re-assign for linux based on skb + if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) + { + //precvbuf->pskb = alloc_skb(MAX_RECVBUF_SZ, GFP_ATOMIC);//don't use this after v2.6.25 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + precvbuf->pskb = dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#else + precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#endif + if(precvbuf->pskb == NULL) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("init_recvbuf(): alloc_skb fail!\n")); + return _FAIL; + } + + tmpaddr = (SIZE_PTR)precvbuf->pskb->data; + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); + skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); + + precvbuf->phead = precvbuf->pskb->head; + precvbuf->pdata = precvbuf->pskb->data; + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + precvbuf->ptail = precvbuf->pskb->head + precvbuf->pskb->tail; + precvbuf->pend = precvbuf->ptail + (MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#else + precvbuf->ptail = precvbuf->pskb->tail; + precvbuf->pend = precvbuf->pskb->end; +#endif + precvbuf->pbuf = precvbuf->pskb->data; + } + else//reuse skb + { + precvbuf->phead = precvbuf->pskb->head; + precvbuf->pdata = precvbuf->pskb->data; + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + precvbuf->ptail = precvbuf->pskb->head + precvbuf->pskb->tail; + precvbuf->pend = precvbuf->ptail + (MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#else + precvbuf->ptail = precvbuf->pskb->tail; + precvbuf->pend = precvbuf->pskb->end; +#endif + precvbuf->pbuf = precvbuf->pskb->data; + + precvbuf->reuse = _FALSE; + } + + //_enter_critical(&precvpriv->lock, &irqL); + //precvpriv->rx_pending_cnt++; + //precvbuf->irp_pending = _TRUE; + //_exit_critical(&precvpriv->lock, &irqL); + + precvpriv->rx_pending_cnt++; + + purb = precvbuf->purb; + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + precvbuf->pbuf, + MAX_RECVBUF_SZ, + usb_read_port_complete, + precvbuf);//context is precvbuf + + err = usb_submit_urb(purb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status)); + DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status); + ret = _FAIL; + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n")); + ret = _FAIL; + } + +_func_exit_; + + return ret; +} +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX + +static void usb_read_port_cancel(struct intf_hdl *pintfhdl) +{ + int i; + struct recv_buf *precvbuf; + _adapter *padapter = pintfhdl->padapter; + precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; + + //DBG_8192C("usb_read_port_cancel \n"); + + padapter->bReadPortCancel = _TRUE; + + for(i=0; i < NR_RECVBUFF ; i++) + { + precvbuf->reuse = _TRUE; + if(precvbuf->purb) + { + //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); + usb_kill_urb(precvbuf->purb); + } + + precvbuf++; + } + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + usb_kill_urb(padapter->recvpriv.int_in_urb); +#endif +} + +void rtl8192cu_xmit_tasklet(void *priv) +{ + int ret = _FALSE; + _adapter *padapter = (_adapter*)priv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if(check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE) + return; + + while(1) + { + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE) || (padapter->bWritePortCancel == _TRUE)) + { + DBG_8192C("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n"); + break; + } + + ret = rtl8192cu_xmitframe_complete(padapter, pxmitpriv, NULL); + + if(ret==_FALSE) + break; + + } + +} + +static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) +{ + _irqL irqL; + int i; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; + //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + //_adapter *padapter = pxmitframe->padapter; + _adapter *padapter = pxmitbuf->padapter; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + //struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port_complete\n")); + + + switch(pxmitbuf->flags) + { + case XMIT_VO_QUEUE: + pxmitpriv->voq_cnt--; + break; + case XMIT_VI_QUEUE: + pxmitpriv->viq_cnt--; + break; + case XMIT_BE_QUEUE: + pxmitpriv->beq_cnt--; + break; + case XMIT_BK_QUEUE: + pxmitpriv->bkq_cnt--; + break; + case HIGH_QUEUE_INX: +#ifdef CONFIG_AP_MODE + rtw_chk_hi_queue_cmd(padapter); +#endif + break; + default: + break; + } + + +/* + _enter_critical(&pxmitpriv->lock, &irqL); + + pxmitpriv->txirp_cnt--; + + switch(pattrib->priority) + { + case 1: + case 2: + pxmitpriv->bkq_cnt--; + //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt); + break; + case 4: + case 5: + pxmitpriv->viq_cnt--; + //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt); + break; + case 6: + case 7: + pxmitpriv->voq_cnt--; + //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt); + break; + case 0: + case 3: + default: + pxmitpriv->beq_cnt--; + //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt); + break; + + } + + _exit_critical(&pxmitpriv->lock, &irqL); + + + if(pxmitpriv->txirp_cnt==0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } +*/ + //rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + goto exit; + } + + + if(purb->status==0) + { + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status)); + DBG_8192C("###=> urb_write_port_complete status(%d)\n",purb->status); + if((purb->status==-EPIPE)||(purb->status==-EPROTO)) + { + //usb_clear_halt(pusbdev, purb->pipe); + //msleep(10); + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_WRITE_PORT_FAIL; + } + #endif + } + else if(purb->status == -EINPROGRESS) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n")); + } + else if(purb->status == (-ESHUTDOWN)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); + + padapter->bDriverStopped=_TRUE; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n")); + + goto exit; + } + else + { + padapter->bSurpriseRemoved=_TRUE; + DBG_8192C("bSurpriseRemoved=TRUE\n"); + //rtl8192cu_trigger_gpio_0(padapter); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); + + goto exit; + } + + + + } + + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time(); + } + #endif + + //if(rtw_txframes_pending(padapter)) + { + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + } + + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port_complete\n")); + +exit: + +_func_exit_; + +} + +static u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + _irqL irqL; + int pipe, status; + u32 ret, bwritezero = _FALSE; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; + struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + struct usb_device *pusbd = pdvobj->pusbdev; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n")); + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + #ifdef DBG_TX + DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__ + ,padapter->bDriverStopped, padapter->bSurpriseRemoved, padapter->pwrctrlpriv.pnp_bstop_trx ); + #endif + + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + _enter_critical(&pxmitpriv->lock, &irqL); + + switch(addr) + { + case VO_QUEUE_INX: + pxmitpriv->voq_cnt++; + pxmitbuf->flags = XMIT_VO_QUEUE; + break; + case VI_QUEUE_INX: + pxmitpriv->viq_cnt++; + pxmitbuf->flags = XMIT_VI_QUEUE; + break; + case BE_QUEUE_INX: + pxmitpriv->beq_cnt++; + pxmitbuf->flags = XMIT_BE_QUEUE; + break; + case BK_QUEUE_INX: + pxmitpriv->bkq_cnt++; + pxmitbuf->flags = XMIT_BK_QUEUE; + break; + case HIGH_QUEUE_INX: + pxmitbuf->flags = HIGH_QUEUE_INX; + break; + default: + pxmitbuf->flags = XMIT_VO_QUEUE; + break; + } + + _exit_critical(&pxmitpriv->lock, &irqL); + +/* + _enter_critical(&pxmitpriv->lock, &irqL); + + //total irp + pxmitpriv->txirp_cnt++; + + //per ac irp + switch(pattrib->priority) + { + case 1: + case 2: + pxmitpriv->bkq_cnt++; + break; + case 4: + case 5: + pxmitpriv->viq_cnt++; + break; + case 6: + case 7: + pxmitpriv->voq_cnt++; + break; + case 0: + case 3: + default: + pxmitpriv->beq_cnt++; + break; + } + + + _exit_critical(&pxmitpriv->lock, &irqL); +*/ + + purb = pxmitbuf->pxmit_urb[0]; + +#if 0 + if(pdvobj->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + { + //DBG_8192C("ishighspeed, cnt=%d\n", cnt); + bwritezero = _TRUE; + } + } + else + { + if(cnt > 0 && cnt%64 == 0) + { + //DBG_8192C("cnt=%d\n", cnt); + bwritezero = _TRUE; + } + } +#endif + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + +#ifdef CONFIG_REDUCE_USB_TX_INT + if ( pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0 + || pxmitbuf->ext_tag ) + { + purb->transfer_flags &= (~URB_NO_INTERRUPT); + } else { + purb->transfer_flags |= URB_NO_INTERRUPT; + //DBG_8192C("URB_NO_INTERRUPT "); + } +#endif + + + usb_fill_bulk_urb(purb, pusbd, pipe, + pxmitframe->buf_addr, //= pxmitbuf->pbuf + cnt, + usb_write_port_complete, + pxmitbuf);//context is pxmitbuf + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + purb->transfer_dma = pxmitbuf->dma_transfer_addr; + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + purb->transfer_flags |= URB_ZERO_PACKET; +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + +#if 0 + if (bwritezero) + { + purb->transfer_flags |= URB_ZERO_PACKET; + } +#endif + + status = usb_submit_urb(purb, GFP_ATOMIC); + + if (!status) + { + ret= _SUCCESS; + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_time = rtw_get_current_time(); + } + #endif + } + else + { + DBG_8192C("usb_write_port, status=%d\n", status); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status)); + ret= _FAIL; + } + +// Commented by Albert 2009/10/13 +// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. +/* + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } +*/ + +_func_exit_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n")); + + return ret; + +} + +static void usb_write_port_cancel(struct intf_hdl *pintfhdl) +{ + int i, j; + _adapter *padapter = pintfhdl->padapter; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; + + //DBG_8192C("usb_write_port_cancel \n"); + + padapter->bWritePortCancel = _TRUE; + + for(i=0; ipxmit_urb[j]) + { + usb_kill_urb(pxmitbuf->pxmit_urb[j]); + } + } + + pxmitbuf++; + } + +} + +void rtl8192cu_set_intf_ops(struct _io_ops *pops) +{ + _func_enter_; + + _rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops)); + + pops->_read8 = &usb_read8; + pops->_read16 = &usb_read16; + pops->_read32 = &usb_read32; + pops->_read_mem = &usb_read_mem; + pops->_read_port = &usb_read_port; + + pops->_write8 = &usb_write8; + pops->_write16 = &usb_write16; + pops->_write32 = &usb_write32; + pops->_writeN = &usb_writeN; + +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ + pops->_write8_async= &usb_async_write8; + pops->_write16_async = &usb_async_write16; + pops->_write32_async = &usb_async_write32; +#endif + pops->_write_mem = &usb_write_mem; + pops->_write_port = &usb_write_port; + + pops->_read_port_cancel = &usb_read_port_cancel; + pops->_write_port_cancel = &usb_write_port_cancel; + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + pops->_read_interrupt = &usb_read_interrupt; +#endif + + _func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c new file mode 100755 index 000000000000..82adeffd07ec --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c @@ -0,0 +1,1266 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_OPS_OS_C_ + +#include +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + #error "Shall be Linux or Windows, but not both!\n" +#endif + +#ifndef CONFIG_USB_HCI + #error "CONFIG_USB_HCI shall be on!\n" +#endif + + +#include +#include +#include + +#include +#include + +#include + + +struct zero_bulkout_context +{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + +#define usb_write_cmd usb_write_mem +#define usb_read_cmd usb_read_mem +#define usb_write_cmd_complete usb_write_mem_complete +//#define usb_read_cmd_complete usb_read_mem_complete + + + +uint usb_init_intf_priv(struct intf_priv *pintfpriv) +{ + + PURB piorw_urb; + u8 NextDeviceStackSize; + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; + _adapter * padapter=pdev->padapter; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n +usb_init_intf_priv\n")); + + pintfpriv->intf_status = _IOREADY; + + if(pdev->ishighspeed) pintfpriv->max_iosz = 128; + else pintfpriv->max_iosz = 64; + + + _init_timer(&pintfpriv->io_timer, padapter->hndis_adapter, io_irp_timeout_handler, pintfpriv); + + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("usb_init_intf_priv:pintfpriv->max_iosz:%d\n",pintfpriv->max_iosz)); + + pintfpriv->io_wsz = 0; + pintfpriv->io_rsz = 0; + + pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4); + + if (pintfpriv->allocated_io_rwmem == NULL){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_init_intf_priv:pintfpriv->allocated_io_rwmem == NULL\n")); + goto usb_init_intf_priv_fail; + } + + pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 \ + -( (u32)(pintfpriv->allocated_io_rwmem) & 3); + + + + NextDeviceStackSize = (u8)pdev->nextdevstacksz;//pintfpriv->pUsbDevObj->StackSize + 1; + + piorw_urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB) ); + if(piorw_urb == NULL) + goto usb_init_intf_priv_fail; + + pintfpriv->piorw_urb = piorw_urb; + + pintfpriv->piorw_irp = IoAllocateIrp(NextDeviceStackSize , FALSE); + + + pintfpriv->io_irp_cnt=1; + pintfpriv->bio_irp_pending=_FALSE; + + _rtw_init_sema(&(pintfpriv->io_retevt), 0);//NdisInitializeEvent(&pintfpriv->io_irp_return_evt); + +_func_exit_; + return _SUCCESS; + +usb_init_intf_priv_fail: + + if (pintfpriv->allocated_io_rwmem) + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4); + + if(piorw_urb) + ExFreePool(piorw_urb); + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n -usb_init_intf_priv(usb_init_intf_priv_fail)\n")); + +_func_exit_; + return _FAIL; + +} + +void usb_unload_intf_priv(struct intf_priv *pintfpriv) +{ + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n+usb_unload_intf_priv\n")); + + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4); + +#ifdef PLATFORM_WINDOWS + if(pintfpriv->piorw_urb) + ExFreePool(pintfpriv->piorw_urb); + + if(pintfpriv->piorw_irp) + IoFreeIrp(pintfpriv->piorw_irp); +#endif + + +#ifdef PLATFORM_LINUX + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npintfpriv->io_irp_cnt=%d\n",pintfpriv->io_irp_cnt)); + pintfpriv->io_irp_cnt--; + if(pintfpriv->io_irp_cnt){ + if(pintfpriv->bio_irp_pending==_TRUE){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\nkill iorw_urb\n")); + usb_kill_urb(pintfpriv->piorw_urb); + } + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n wait io_retevt\n")); + _rtw_down_sema(&(pintfpriv->io_retevt)); + } + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n cancel io_urb ok\n")); +#endif + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n-usb_unload_intf_priv\n")); + +_func_exit_; + +} + +void *ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr) +{ + HANDLE PipeHandle = NULL; + _adapter *padapter = pNdisCEDvice->padapter; + + + if(pNdisCEDvice->nr_endpoint == 11) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3] ; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_BCNQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[6]; + break; + case RTL8712_DMA_BMCQ: //HI Queue + PipeHandle= padapter->halpriv.pipehdls_r8712[7]; + break; + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[8]; + break; + case RTL8712_DMA_RX0FF: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + case RTL8712_DMA_H2CCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[9]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 6) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 4) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + //case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + //case RTL8712_DMA_VIQ: + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + } + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint)); + } + + return PipeHandle; + +} + + +NTSTATUS usb_bulkout_zero_complete( + PDEVICE_OBJECT pUsbDevObj, + PIRP pIrp, void* pZeroContext) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext; + +_func_enter_; + + if(pcontext) + { + if(pcontext->pbuf) + { + ExFreePool(pcontext->pbuf); + } + + if(pcontext->purb) + { + ExFreePool(pcontext->purb); + } + + if(pcontext->pirp && (pIrp ==pcontext->pirp)) + { + IoFreeIrp(pIrp); + } + + ExFreePool(pcontext); + } + +_func_exit_; + + return STATUS_MORE_PROCESSING_REQUIRED; + + +} + +u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + struct zero_bulkout_context *pcontext; + unsigned char *pbuf; + char NextDeviceStackSize, len; + PIO_STACK_LOCATION nextStack; + USBD_STATUS usbdstatus; + HANDLE PipeHandle; + PIRP pirp = NULL; + PURB purb = NULL; + NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + + +_func_enter_; + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + return _FAIL; + } + + len = 0; + NextDeviceStackSize = (char)pdvobj->nextdevstacksz; + + pcontext = (struct zero_bulkout_context *)ExAllocatePool(NonPagedPool, sizeof(struct zero_bulkout_context)); + pbuf = (unsigned char *)ExAllocatePool(NonPagedPool, sizeof(int)); + purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB)); + pirp = IoAllocateIrp(NextDeviceStackSize, FALSE); + + pcontext->pbuf = pbuf; + pcontext->purb = purb; + pcontext->pirp = pirp; + pcontext->padapter = padapter; + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pdvobj, addr); + + + // Build our URB for USBD + UsbBuildInterruptOrBulkTransferRequest( + purb, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + PipeHandle, + pbuf, + NULL, + len, + 0, + NULL); + + // + // call the calss driver to perform the operation + // pass the URB to the USB driver stack + // + nextStack = IoGetNextIrpStackLocation(pirp); + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + nextStack->Parameters.Others.Argument1 = purb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + + //Set Completion Routine + IoSetCompletionRoutine(pirp, // irp to use + usb_bulkout_zero_complete, // callback routine + pcontext, // context + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + + // Call IoCallDriver to send the irp to the usb bus driver + // + ndisStatus = IoCallDriver(pdvobj->pnextdevobj, pirp); + usbdstatus = URB_STATUS(purb); + + if( USBD_HALTED(usbdstatus) ) + { + padapter->bDriverStopped=_TRUE; + padapter->bSurpriseRemoved=_TRUE; + } + + // + // The usb bus driver should always return STATUS_PENDING when bulk out irp async + // + if ( ndisStatus != STATUS_PENDING ) + { + return _FAIL; + } + +_func_exit_; + + return _SUCCESS; + +} + +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + _func_enter_; + + + + _func_exit_; +} + +NTSTATUS usb_write_mem_complete(PDEVICE_OBJECT pUsbDevObj, PIRP piowrite_irp, PVOID pusb_cnxt) +{ + + _irqL irqL; + _list *head, *plist; + struct io_req *pio_req; + struct io_queue *pio_q = (struct io_queue *) pusb_cnxt; + struct intf_hdl *pintf = &(pio_q->intf); + struct intf_priv *pintfpriv = pintf->pintfpriv; + _adapter *padapter = (_adapter *)pintf->adapter; + NTSTATUS status = STATUS_SUCCESS; + + head = &(pio_q->processing); + + _func_enter_; + + _enter_critical_bh(&(pio_q->lock), &irqL); + + pintfpriv->io_irp_cnt--; + if(pintfpriv->io_irp_cnt ==0){ + _rtw_up_sema(&(pintfpriv->io_retevt)); + } + + pintfpriv->bio_irp_pending=_FALSE; + + switch(piowrite_irp->IoStatus.Status) + { + case STATUS_SUCCESS: + break; + + default: + padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usbAsynIntOutComplete:pioread_irp->IoStatus.Status !=STATUS_SUCCESS\n")); + break; + } + + //free irp in processing list... + while(rtw_is_list_empty(head) != _TRUE) + { + plist = get_next(head); + rtw_list_delete(plist); + pio_req = LIST_CONTAINOR(plist, struct io_req, list); + _rtw_up_sema(&pio_req->sema); + } + + _exit_critical_bh(&(pio_q->lock), &irqL); + + _func_exit_; + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + u32 bwritezero; + _irqL irqL; + USBD_STATUS usbdstatus; + PIO_STACK_LOCATION nextStack; + HANDLE PipeHandle; + struct io_req *pio_req; + + _adapter *adapter = (_adapter *)pintfhdl->adapter; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; + PURB piorw_urb = pintfpriv->piorw_urb; + PIRP piorw_irp = pintfpriv->piorw_irp; + struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + NTSTATUS NtStatus = STATUS_SUCCESS; + + _func_enter_; + + pio_req = alloc_ioreq(pio_queue); + + if ((pio_req == NULL)||(adapter->bSurpriseRemoved)){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved )); + goto exit; + } + + _enter_critical_bh(&(pio_queue->lock), &irqL); + + rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing)); + + +#ifdef NDIS51_MINIPORT + IoReuseIrp(piorw_irp, STATUS_SUCCESS); +#else + piorw_irp->Cancel = _FALSE; +#endif + + if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); + _func_exit_; + return; + } + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pdev, addr); + + + pintfpriv->io_irp_cnt++; + pintfpriv->bio_irp_pending=_TRUE; + // Build our URB for USBD + UsbBuildInterruptOrBulkTransferRequest( + piorw_urb, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + PipeHandle, + (PVOID)wmem, + NULL, + cnt, + 0, + NULL); + + // + // call the calss driver to perform the operation + // pass the URB to the USB driver stack + // + nextStack = IoGetNextIrpStackLocation(piorw_irp); + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + nextStack->Parameters.Others.Argument1 = (PURB)piorw_urb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + + IoSetCompletionRoutine( + piorw_irp, // irp to use + usb_write_mem_complete, // routine to call when irp is done + pio_queue, // context to pass routine + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + // + // Call IoCallDriver to send the irp to the usb port + // + NtStatus = IoCallDriver(pdev->pnextdevobj, piorw_irp); + usbdstatus = URB_STATUS(piorw_urb); + + // + // The USB driver should always return STATUS_PENDING when + // it receives a write irp + // + if ((NtStatus != STATUS_PENDING) || USBD_HALTED(usbdstatus) ) { + + if( USBD_HALTED(usbdstatus) ) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_mem():USBD_HALTED(usbdstatus)=%X!\n",USBD_HALTED(usbdstatus)) ); + } + _func_exit_; + return;//STATUS_UNSUCCESSFUL; + } + + _exit_critical_bh(&(pio_queue->lock), &irqL); + + _rtw_down_sema(&pio_req->sema); + free_ioreq(pio_req, pio_queue); + + + bwritezero = _FALSE; + if (pdev->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + bwritezero = _TRUE; + + } + else + { + if(cnt > 0 && cnt%64 == 0) + bwritezero = _TRUE; + } + + + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } + +exit: + + _func_exit_; + +} + +NTSTATUS usb_read_port_complete(PDEVICE_OBJECT pUsbDevObj, PIRP pIrp, PVOID context) +{ + uint isevt, *pbuf; + struct _URB_BULK_OR_INTERRUPT_TRANSFER *pbulkurb; + USBD_STATUS usbdstatus; + struct recv_buf *precvbuf = (struct recv_buf *)context; + _adapter *adapter =(_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct dvobj_priv *dev = (struct dvobj_priv *)&adapter->dvobjpriv; + PURB purb = precvbuf->purb; + struct intf_hdl *pintfhdl = &adapter->pio_queue->intf; + + //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); + + usbdstatus = URB_STATUS(purb); + + _rtw_spinlock_ex(&precvpriv->lock); + precvbuf->irp_pending=_FALSE; + precvpriv->rx_pending_cnt --; + _rtw_spinunlock_ex(&precvpriv->lock); + + if(precvpriv->rx_pending_cnt== 0) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&precvpriv->allrxreturnevt); + } + + + if( pIrp->Cancel == _TRUE ) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: One IRP has been cancelled succesfully\n")); + return STATUS_MORE_PROCESSING_REQUIRED; + } + if(adapter->bSurpriseRemoved) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); + return STATUS_MORE_PROCESSING_REQUIRED; + } + + switch(pIrp->IoStatus.Status) + { + case STATUS_SUCCESS: + + pbulkurb = &(precvbuf->purb)->UrbBulkOrInterruptTransfer; + if((pbulkurb->TransferBufferLength >(MAX_RECVBUF_SZ)) || (pbulkurb->TransferBufferLength < RXDESC_SIZE) ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE)\n")); + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + precvbuf->transfer_len = pbulkurb->TransferBufferLength; + + pbuf = (uint*)precvbuf->pbuf; + + if((isevt = *(pbuf+1)&0x1ff) == 0x1ff) + { + rxcmd_event_hdl(adapter, pbuf);//rx c2h events + + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets + { + //precvbuf->reuse = _TRUE; + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + } + + } + + break; + + default: + + if( !USBD_HALTED(usbdstatus) ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete():USBD_HALTED(usbdstatus)=%x (need to handle ) \n",USBD_HALTED(usbdstatus))); + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus)) ); + adapter->bDriverStopped = _TRUE; + adapter->bSurpriseRemoved = _TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus))) ; + } + + break; + + } + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + +u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + u8 *pdata; + u16 size; + PURB purb; + PIRP pirp; + PIO_STACK_LOCATION nextStack; + NTSTATUS ntstatus; + USBD_STATUS usbdstatus; + HANDLE PipeHandle; + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; + _adapter *adapter = (_adapter *)pdev->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + u32 bResult = _FALSE; + +_func_enter_; + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return bResult; + } + + if(precvbuf !=NULL) + { + + rtl8192cu_init_recvbuf(adapter, precvbuf); + + _rtw_spinlock(&precvpriv->lock); + precvpriv->rx_pending_cnt++; + precvbuf->irp_pending = _TRUE; + _rtw_spinunlock(&precvpriv->lock); + + pdata = (u8*)precvbuf->pbuf; + + size = sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ); + purb = precvbuf->purb; + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pdev, addr); + + UsbBuildInterruptOrBulkTransferRequest( + purb, + (USHORT)size, + PipeHandle, + pdata, + NULL, + MAX_RECVBUF_SZ, + USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK, + NULL + ); + + pirp = precvbuf->pirp; + +#if NDIS51_MINIPORT + IoReuseIrp(pirp, STATUS_SUCCESS); +#else + pirp->Cancel = _FALSE; +#endif + + // call the class driver to perform the operation + // and pass the URB to the USB driver stack + nextStack = IoGetNextIrpStackLocation(pirp); + nextStack->Parameters.Others.Argument1 = purb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + + IoSetCompletionRoutine( + pirp, // irp to use + usb_read_port_complete, // routine to call when irp is done + precvbuf, // context to pass routine + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + // + // The IoCallDriver routine + // sends an IRP to the driver associated with a specified device object. + // + ntstatus = IoCallDriver(pdev->pnextdevobj, pirp); + usbdstatus = URB_STATUS(purb); + + if( USBD_HALTED(usbdstatus) ) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port(): USBD_HALTED(usbdstatus=0x%.8x)=%.8x \n\n", usbdstatus, USBD_HALTED(usbdstatus))); + pdev->padapter->bDriverStopped=_TRUE; + pdev->padapter->bSurpriseRemoved=_TRUE; + } + + if( ntstatus == STATUS_PENDING ) + { + bResult = _TRUE;// The IRP is pended in USBD as we expected. + } + else { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! IRP STATUS: %X\n", ntstatus)); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! USB STATUS: %X\n", usbdstatus)); + } + + } + else{ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n")); + } + +_func_exit_; + + return bResult; + +} + +void usb_read_port_cancel(_adapter *padapter) +{ + struct recv_buf *precvbuf; + sint i; + struct dvobj_priv *pdev = &padapter->dvobjpriv; + struct recv_priv *precvpriv=&padapter->recvpriv; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n ==>usb_read_port_cancel\n")); + + _rtw_spinlock(&precvpriv->lock); + precvpriv->rx_pending_cnt--; //decrease 1 for Initialize ++ + _rtw_spinunlock(&precvpriv->lock); + + if (precvpriv->rx_pending_cnt) + { + // Canceling Pending Recv Irp + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + + for( i = 0; i < NR_RECVBUFF; i++ ) + { + if (precvbuf->irp_pending == _TRUE) + { + IoCancelIrp(precvbuf->pirp); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel() :IoCancelIrp\n")); + } + + precvbuf++; + } + + _rtw_down_sema(&precvpriv->allrxreturnevt); + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel:down sema\n")); + + } + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("<==usb_read_port_cancel\n")); + +} + +NTSTATUS usb_write_port_complete( + PDEVICE_OBJECT pUsbDevObj, + PIRP pIrp, + PVOID pTxContext +) +{ + u32 i, bIrpSuccess, sz; + NTSTATUS status = STATUS_SUCCESS; + u8 *ptr; + struct xmit_frame *pxmitframe = (struct xmit_frame *) pTxContext; + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; + _adapter *padapter = pxmitframe->padapter; + struct dvobj_priv *pdev = (struct dvobj_priv *)&padapter->dvobjpriv; + struct io_queue *pio_queue = (struct io_queue *)padapter->pio_queue; + struct intf_hdl *pintfhdl = &(pio_queue->intf); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port_complete\n")); + + _rtw_spinlock_ex(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; + _rtw_spinunlock_ex(&pxmitpriv->lock); + + if(pxmitpriv->txirp_cnt==0){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } + + status = pIrp->IoStatus.Status; + + if( status == STATUS_SUCCESS ) + bIrpSuccess = _TRUE; + else + bIrpSuccess = _FALSE; + + if( pIrp->Cancel == _TRUE ) + { + if(pxmitframe !=NULL) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pIrp->Cancel == _TRUE,(pxmitframe !=NULL\n")); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + } + + return STATUS_MORE_PROCESSING_REQUIRED; + } + + if(padapter->bSurpriseRemoved) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + return STATUS_MORE_PROCESSING_REQUIRED; + } + + + // + // Send 0-byte here if necessary. + // + // + // 1. We MUST keep at most one IRP pending in each endpoint, otherwise USB host controler driver will hang. + // Besides, even 0-byte IRP shall be count into #IRP sent down, so, we send 0-byte here instead of TxFillDescriptor8187(). + // 2. If we don't count 0-byte IRP into an #IRP sent down, Tx will stuck when we download files via BT and + // play online video on XP SP1 EHCU. + // 2005.12.26, by rcnjko. + // + + + for(i=0; i< 8; i++) + { + if(pIrp == pxmitframe->pxmit_irp[i]) + { + pxmitframe->bpending[i] = _FALSE;// + //ac_tag = pxmitframe->ac_tag[i]; + sz = pxmitframe->sz[i]; + break; + } + } + +#if 0 + pxmitframe->fragcnt--; + if(pxmitframe->fragcnt == 0)// if((pxmitframe->fragcnt == 0) && (pxmitframe->irpcnt == 8)){ + { + //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pxmitframe->fragcnt == 0\n")); + rtw_free_xmitframe(pxmitpriv,pxmitframe); + } +#else + + //not to consider tx fragment + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + +#endif + + rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf); + +_func_exit_; + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + u32 i, bwritezero; + u8 *ptr; + PIO_STACK_LOCATION nextStack; + USBD_STATUS usbdstatus; + HANDLE PipeHandle; + PIRP pirp = NULL; + PURB purb = NULL; + NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pNdisCEDvice = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_frame *pxmitframe = (struct xmit_frame *)wmem; + +_func_enter_; + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + + for(i=0; i<8; i++) + { + if(pxmitframe->bpending[i] == _FALSE) + { + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt++; + pxmitframe->bpending[i] = _TRUE; + _rtw_spinunlock(&pxmitpriv->lock); + + pxmitframe->sz[i] = cnt; + purb = pxmitframe->pxmit_urb[i]; + pirp = pxmitframe->pxmit_irp[i]; + + //pxmitframe->ac_tag[i] = ac_tag; + + break; + } + } + + bwritezero = _FALSE; + if (pNdisCEDvice->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt)); + //cnt=cnt+1; + bwritezero = _TRUE; + } + } + else + { + if(cnt > 0 && cnt%64 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cnt=%d\n", cnt)); + //cnt=cnt+1; + bwritezero = _TRUE; + } + } + + +#ifdef NDIS51_MINIPORT + IoReuseIrp(pirp, STATUS_SUCCESS); +#else + pirp->Cancel = _FALSE; +#endif + + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pNdisCEDvice, addr); + + + // Build our URB for USBD + UsbBuildInterruptOrBulkTransferRequest( + purb, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + PipeHandle, + pxmitframe->mem_addr, + NULL, + cnt, + 0, + NULL); + + // + // call the calss driver to perform the operation + // pass the URB to the USB driver stack + // + nextStack = IoGetNextIrpStackLocation(pirp); + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + nextStack->Parameters.Others.Argument1 = purb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + + //Set Completion Routine + IoSetCompletionRoutine(pirp, // irp to use + usb_write_port_complete, // callback routine + pxmitframe, // context + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + + // Call IoCallDriver to send the irp to the usb bus driver + // + ndisStatus = IoCallDriver(pNdisCEDvice->pnextdevobj, pirp); + usbdstatus = URB_STATUS(purb); + + if( USBD_HALTED(usbdstatus) ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): USBD_HALTED(usbdstatus)=%x set bDriverStopped TRUE!\n\n",USBD_HALTED(usbdstatus)) ); + padapter->bDriverStopped=_TRUE; + padapter->bSurpriseRemoved=_TRUE; + } + + // + // The usb bus driver should always return STATUS_PENDING when bulk out irp async + // + if ( ndisStatus != STATUS_PENDING ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): ndisStatus(%x) != STATUS_PENDING!\n\n", ndisStatus)); + + _func_exit_; + + return _FAIL; + } + + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } + + +_func_exit_; + + return _SUCCESS; + +} + + +void usb_write_port_cancel(_adapter *padapter) +{ + + sint i,j; + struct dvobj_priv *pdev = &padapter->dvobjpriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + struct xmit_frame *pxmitframe; + + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++ + _rtw_spinunlock(&pxmitpriv->lock); + + if (pxmitpriv->txirp_cnt) + { + // Canceling Pending Recv Irp + pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; + + for( i = 0; i < NR_XMITFRAME; i++ ) + { + for(j=0;j<8;j++) + { + if (pxmitframe->bpending[j]==_TRUE) + { + IoCancelIrp(pxmitframe->pxmit_irp[j]); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n")); + + } + } + + pxmitframe++; + } + + _rtw_down_sema(&(pxmitpriv->tx_retevt)); + + } + +} + + +/*! \brief Wrap the pUrb to an IRP and send this IRP to Bus Driver. Then wait for this IRP completion. + The Caller shall be at Passive Level. +*/ +NTSTATUS sync_callusbd(struct dvobj_priv *pdvobjpriv, PURB purb) +{ + + KEVENT kevent; + PIRP irp; + IO_STATUS_BLOCK iostatusblock; + PIO_STACK_LOCATION nextstack; + USBD_STATUS usbdstatus; + LARGE_INTEGER waittime; + NTSTATUS ntstatus = STATUS_SUCCESS; + _adapter *padapter = pdvobjpriv->padapter; + + + _func_enter_; + +// if(padapter->bDriverStopped) { +// goto exit; +// } + + KeInitializeEvent(&kevent, NotificationEvent, _FALSE); + irp = IoBuildDeviceIoControlRequest( + IOCTL_INTERNAL_USB_SUBMIT_URB, + pdvobjpriv->pphysdevobj,//CEdevice->pUsbDevObj, + NULL, + 0, + NULL, + 0, + _TRUE, + &kevent, + &iostatusblock); + + if(irp == NULL) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: memory alloc for irp failed\n")); + ntstatus=STATUS_INSUFFICIENT_RESOURCES; + goto exit; + } + + nextstack = IoGetNextIrpStackLocation(irp); + if(nextstack == NULL) + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("IoGetNextIrpStackLocation fail\n")); + + nextstack->Parameters.Others.Argument1 = purb; + + // Issue an IRP for Sync IO. + ntstatus = IoCallDriver(pdvobjpriv->pphysdevobj, irp); + usbdstatus = URB_STATUS(purb); + + if(ntstatus == STATUS_PENDING) + { + // Method 1 + waittime.QuadPart = -10000 * 50000; + ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, &waittime); //8150 code + + // Method 2 + //ntStatus = KeWaitForSingleObject(&Kevent, Executive, KernelMode, FALSE, NULL); //DDK sample + + usbdstatus = URB_STATUS(purb); + + if(ntstatus == STATUS_TIMEOUT) + { + //usbdevice->nIoStuckCnt++; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: TIMEOUT....5000ms\n")); + + // Method 2 + IoCancelIrp(irp); + ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, NULL); //DDK sample + usbdstatus = URB_STATUS(purb); + + usbdstatus = USBD_STATUS_SUCCESS; + } + + } + +exit: + + _func_exit_; + + return ntstatus; + +} +int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + PURB purb; + u8 ret; + unsigned long transferflags; + NTSTATUS ntstatus; + + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev; + + _func_enter_; + + ret=_TRUE; + purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST) ); + if(purb == NULL) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq(): Failed to allocate urb !!!\n")); + ret =_FALSE; + goto exit; + } + + if (requesttype == 0x01) { + transferflags = USBD_TRANSFER_DIRECTION_IN;//read_in + } else { + transferflags= 0;//write_out + } + + UsbBuildVendorRequest( + purb, //Pointer to an URB that is to be formatted as a vendor or class request. + URB_FUNCTION_VENDOR_DEVICE, //Indicates the URB is a vendor-defined request for a USB device. + sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), //Specifies the length, in bytes, of the URB. + transferflags, //TransferFlags + 0, //ReservedBits + request, //Request + value, //Value + index, //Index + pdata, //TransferBuffer + NULL, //TransferBufferMDL + len, //TransferBufferLength + NULL //Link + ); + + ntstatus = sync_callusbd(pdvobjpriv, purb); + if(!NT_SUCCESS(ntstatus)) + { + ExFreePool(purb); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usbctrl_vendorreq() : SOMETHING WRONG\n") ); + ret = _FALSE; + goto exit; + } + + ExFreePool(purb); + +exit: + _func_exit_; + + return ret; + +} + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h new file mode 100755 index 000000000000..c3e7f9e8a885 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192CE_FW_IMG_H +#define __INC_HAL8192CE_FW_IMG_H + +#include + +/*Created on 2011/ 6/15, 5:45*/ + +#define TSMCImgArrayLength 14964 //v75 2011-06-15 +extern u8 Rtl8192CEFwTSMCImgArray[TSMCImgArrayLength]; +#define UMCACutImgArrayLength 14964 //v75 2011-06-15 +extern u8 Rtl8192CEFwUMCACutImgArray[UMCACutImgArrayLength]; +#define UMCBCutImgArrayLength 14946 //v75 2011-06-15 +extern u8 Rtl8192CEFwUMCBCutImgArray[UMCBCutImgArrayLength]; +#define PHY_REG_2TArrayLength 374 +extern u32 Rtl8192CEPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 374 +extern u32 Rtl8192CEPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_ChangeTo_1T1RArrayLength 1 +extern u32 Rtl8192CEPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength]; +#define PHY_ChangeTo_1T2RArrayLength 1 +extern u32 Rtl8192CEPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength]; +#define PHY_ChangeTo_2T2RArrayLength 1 +extern u32 Rtl8192CEPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength]; +#define PHY_REG_Array_PGLength 336 +extern u32 Rtl8192CEPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_MPLength 4 +extern u32 Rtl8192CEPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define RadioA_2TArrayLength 282 +extern u32 Rtl8192CERadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 78 +extern u32 Rtl8192CERadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 282 +extern u32 Rtl8192CERadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192CERadioB_1TArray[RadioB_1TArrayLength]; +#define RadioB_GM_ArrayLength 1 +extern u32 Rtl8192CERadioB_GM_Array[RadioB_GM_ArrayLength]; +#define MAC_2T_ArrayLength 172 +extern u32 Rtl8192CEMAC_2T_Array[MAC_2T_ArrayLength]; +#define MACPHY_Array_PGLength 1 +extern u32 Rtl8192CEMACPHY_Array_PG[MACPHY_Array_PGLength]; +#define AGCTAB_2TArrayLength 320 +extern u32 Rtl8192CEAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 320 +extern u32 Rtl8192CEAGCTAB_1TArray[AGCTAB_1TArrayLength]; + +#endif //__INC_HAL8192CE_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h new file mode 100755 index 000000000000..2e76d2ab4367 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h @@ -0,0 +1,451 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * Module: __INC_HAL8192CPHYCFG_H + * + * + * Note: + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * + *****************************************************************************/ + /* Check to see if the file has been included already. */ +#ifndef __INC_HAL8192CPHYCFG_H +#define __INC_HAL8192CPHYCFG_H + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + +#define IQK_MAC_REG_NUM 4 +#define IQK_ADDA_REG_NUM 16 +#define IQK_BB_REG_NUM 9 +#define HP_THERMAL_NUM 8 + +#ifdef CONFIG_PCI_HCI +#define MAX_AGGR_NUM 0x0A0A +#else +#define MAX_AGGR_NUM 0x0909 +#endif + +#ifdef CONFIG_PCI_HCI +#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \ +{ \ + u1Byte u1bTmp; \ + u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \ + u1bTmp |= BIT0; \ + PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \ + PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \ + PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ + delay_us(100); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ +} +#endif + + +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ +typedef enum _SwChnlCmdID{ + CmdID_End, + CmdID_SetTxPowerLevel, + CmdID_BBRegWrite10, + CmdID_WritePortUlong, + CmdID_WritePortUshort, + CmdID_WritePortUchar, + CmdID_RF_WriteReg, +}SwChnlCmdID; + + +/* 1. Switch channel related */ +typedef struct _SwChnlCmd{ + SwChnlCmdID CmdID; + u32 Para1; + u32 Para2; + u32 msDelay; +}SwChnlCmd; + +typedef enum _HW90_BLOCK{ + HW90_BLOCK_MAC = 0, + HW90_BLOCK_PHY0 = 1, + HW90_BLOCK_PHY1 = 2, + HW90_BLOCK_RF = 3, + HW90_BLOCK_MAXIMUM = 4, // Never use this +}HW90_BLOCK_E, *PHW90_BLOCK_E; + +typedef enum _RF90_RADIO_PATH{ + RF90_PATH_A = 0, //Radio Path A + RF90_PATH_B = 1, //Radio Path B + RF90_PATH_C = 2, //Radio Path C + RF90_PATH_D = 3, //Radio Path D + //RF90_PATH_MAX //Max RF number 90 support +}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E; + +#define RF90_PATH_MAX 2 + +#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number +#define CHANNEL_GROUP_MAX 3 // ch1~3, ch4~9, ch10~14 total three groups + +typedef enum _WIRELESS_MODE { + WIRELESS_MODE_UNKNOWN = 0x00, + WIRELESS_MODE_A = 0x01, + WIRELESS_MODE_B = 0x02, + WIRELESS_MODE_G = 0x04, + WIRELESS_MODE_AUTO = 0x08, + WIRELESS_MODE_N_24G = 0x10, + WIRELESS_MODE_N_5G = 0x20 +} WIRELESS_MODE; + +typedef enum _BaseBand_Config_Type{ + BaseBand_Config_PHY_REG = 0, //Radio Path A + BaseBand_Config_AGC_TAB = 1, //Radio Path B +}BaseBand_Config_Type, *PBaseBand_Config_Type; + + +typedef enum _PHY_Rate_Tx_Power_Offset_Area{ + RA_OFFSET_LEGACY_OFDM1, + RA_OFFSET_LEGACY_OFDM2, + RA_OFFSET_HT_OFDM1, + RA_OFFSET_HT_OFDM2, + RA_OFFSET_HT_OFDM3, + RA_OFFSET_HT_OFDM4, + RA_OFFSET_HT_CCK, +}RA_OFFSET_AREA,*PRA_OFFSET_AREA; + + +/* BB/RF related */ +typedef enum _RF_TYPE_8190P{ + RF_TYPE_MIN, // 0 + RF_8225=1, // 1 11b/g RF for verification only + RF_8256=2, // 2 11b/g/n + RF_8258=3, // 3 11a/b/g/n RF + RF_6052=4, // 4 11b/g/n RF + //RF_6052=5, // 4 11b/g/n RF + // TODO: We sholud remove this psudo PHY RF after we get new RF. + RF_PSEUDO_11N=5, // 5, It is a temporality RF. +}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; + + +typedef enum _RATR_TABLE_MODE_8192C{ + RATR_INX_WIRELESS_NGB = 0, + RATR_INX_WIRELESS_NG = 1, + RATR_INX_WIRELESS_NB = 2, + RATR_INX_WIRELESS_N = 3, + RATR_INX_WIRELESS_GB = 4, + RATR_INX_WIRELESS_G = 5, + RATR_INX_WIRELESS_B = 6, + RATR_INX_WIRELESS_MC = 7, + RATR_INX_WIRELESS_A = 8, +}RATR_TABLE_MODE_8192C, *PRATR_TABLE_MODE_8192C; + +typedef struct _BB_REGISTER_DEFINITION{ + u32 rfintfs; // set software control: + // 0x870~0x877[8 bytes] + + u32 rfintfi; // readback data: + // 0x8e0~0x8e7[8 bytes] + + u32 rfintfo; // output data: + // 0x860~0x86f [16 bytes] + + u32 rfintfe; // output enable: + // 0x860~0x86f [16 bytes] + + u32 rf3wireOffset; // LSSI data: + // 0x840~0x84f [16 bytes] + + u32 rfLSSI_Select; // BB Band Select: + // 0x878~0x87f [8 bytes] + + u32 rfTxGainStage; // Tx gain stage: + // 0x80c~0x80f [4 bytes] + + u32 rfHSSIPara1; // wire parameter control1 : + // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] + + u32 rfHSSIPara2; // wire parameter control2 : + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] + + u32 rfSwitchControl; //Tx Rx antenna control : + // 0x858~0x85f [16 bytes] + + u32 rfAGCControl1; //AGC parameter control1 : + // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] + + u32 rfAGCControl2; //AGC parameter control2 : + // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] + + u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : + // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] + + u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : + // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] + + u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix + // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] + + u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type + // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] + + u32 rfLSSIReadBack; //LSSI RF readback data SI mode + // 0x8a0~0x8af [16 bytes] + + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B + +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; + +#ifdef CONFIG_MP_INCLUDED +typedef enum _ANTENNA_PATH{ + ANTENNA_NONE = 0x00, + ANTENNA_D , + ANTENNA_C , + ANTENNA_CD , + ANTENNA_B , + ANTENNA_BD , + ANTENNA_BC , + ANTENNA_BCD , + ANTENNA_A , + ANTENNA_AD , + ANTENNA_AC , + ANTENNA_ACD , + ANTENNA_AB , + ANTENNA_ABD , + ANTENNA_ABC , + ANTENNA_ABCD +} ANTENNA_PATH; +#endif + +typedef struct _R_ANTENNA_SELECT_OFDM{ + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK{ + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +u32 rtl8192c_PHY_QueryBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192c_PHY_SetBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 rtl8192c_PHY_QueryRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192c_PHY_SetRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +int PHY_MACConfig8192C( IN PADAPTER Adapter ); +int PHY_BBConfig8192C( IN PADAPTER Adapter ); +int PHY_RFConfig8192C( IN PADAPTER Adapter ); +/* RF config */ +int rtl8192c_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter, + IN u8* pFileName, + IN RF90_RADIO_PATH_E eRFPath); +int rtl8192c_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath); + +/* BB/RF readback check for making sure init OK */ +int rtl8192c_PHY_CheckBBAndRFOK( IN PADAPTER Adapter, + IN HW90_BLOCK_E CheckBlock, + IN RF90_RADIO_PATH_E eRFPath ); +/* Read initi reg value for tx power setting. */ +void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); + +// +// RF Power setting +// +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, +// IN RT_RF_POWER_STATE eRFPowerState); + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8192C( IN PADAPTER Adapter, + OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8192C( IN PADAPTER Adapter, + IN u8 channel ); +BOOLEAN PHY_UpdateTxPowerDbm8192C( IN PADAPTER Adapter, + IN int powerInDbm ); + +// +VOID +PHY_ScanOperationBackup8192C(IN PADAPTER Adapter, + IN u8 Operation ); + +// +// Switch bandwidth for 8192S +// +//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SetBWMode8192C( IN PADAPTER pAdapter, + IN HT_CHANNEL_WIDTH ChnlWidth, + IN unsigned char Offset ); + +// +// Set FW CMD IO for 8192S. +// +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, +// IN IO_TYPE IOType); + +// +// Set A2 entry to fw for 8192S +// +extern void FillA2Entry8192C( IN PADAPTER Adapter, + IN u8 index, + IN u8* val); + + +// +// channel switch related funciton +// +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SwChnl8192C( IN PADAPTER pAdapter, + IN u8 channel ); + // Call after initialization +void PHY_SwChnlPhy8192C( IN PADAPTER pAdapter, + IN u8 channel ); + +void ChkFwCmdIoDone( IN PADAPTER Adapter); + +#ifdef USE_WORKITEM +//extern void SetIOWorkItemCallback( IN PVOID pContext ); +#else +//extern void SetIOTimerCallback( IN PRT_TIMER pTimer); +#endif + +// +// BB/MAC/RF other monitor API +// +void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode ); + +BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter, + IN u32 eRFPath ); + +// +// IQ calibrate +// +VOID rtl8192c_PHY_IQCalibrate( IN PADAPTER pAdapter , IN BOOLEAN bReCovery); + +// +// LC calibrate +// +VOID rtl8192c_PHY_LCCalibrate(IN PADAPTER pAdapter); + +// +// AP calibrate +// +VOID rtl8192c_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta); + +VOID rtl8192c_PHY_DigitalPredistortion(IN PADAPTER pAdapter); + +VOID rtl8192c_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain); + +// +// Modify the value of the hw register when beacon interval be changed. +// +void +rtl8192c_PHY_SetBeaconHwReg( IN PADAPTER Adapter, + IN u16 BeaconInterval ); + + +extern VOID +PHY_SwitchEphyParameter( + IN PADAPTER Adapter + ); + +extern VOID +PHY_EnableHostClkReq( + IN PADAPTER Adapter + ); + +BOOLEAN +SetAntennaConfig92C( + IN PADAPTER Adapter, + IN u8 DefaultAnt + ); + + +/*--------------------------Exported Function prototype---------------------*/ + +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192c_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192c_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192c_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192c_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) + +#define PHY_SetMacReg PHY_SetBBReg + +#endif // __INC_HAL8192CPHYCFG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h new file mode 100755 index 000000000000..295f587efc08 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h @@ -0,0 +1,1052 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192CPHYREG_H + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __INC_HAL8192CPHYREG_H +#define __INC_HAL8192CPHYREG_H + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 // Useless now +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x24 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h new file mode 100755 index 000000000000..97b1c2fa429d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h @@ -0,0 +1,92 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192CU_FW_IMG_H +#define __INC_HAL8192CU_FW_IMG_H + +/*Created on 2011/ 6/15, 5:45*/ + +#ifdef CONFIG_BT_COEXISTENCE +#define TSMCImgArrayLength 14964 //Normal v75 2011-06-15 +#else +#define TSMCImgArrayLength 15290 //P2P_PS v75 2011-06-15 +#endif + +extern u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength]; + +#define UMCACutImgArrayLength 14964 //v75 2011-06-15 +extern u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength]; + +#define UMCBCutImgArrayLength 14946 //v75 2011-06-15 +extern u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] ; + +#define UMC8723ImgArrayLength 16288 +extern u8 Rtl8192CUFwUMC8723ImgArray[UMC8723ImgArrayLength]; +#define PHY_REG_2TArrayLength 374 +extern u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 374 +extern u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_ChangeTo_1T1RArrayLength 1 +extern u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength]; +#define PHY_ChangeTo_1T2RArrayLength 1 +extern u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength]; +#define PHY_ChangeTo_2T2RArrayLength 1 +extern u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength]; +#define PHY_REG_Array_PGLength 336 +extern u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_PG_mCardLength 336 +extern u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength]; +#define PHY_REG_Array_MPLength 4 +extern u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define PHY_REG_1T_HPArrayLength 378 +extern u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength]; +#define PHY_REG_1T_mCardArrayLength 374 +extern u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength]; +#define PHY_REG_2T_mCardArrayLength 374 +extern u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength]; +#define PHY_REG_Array_PG_HPLength 336 +extern u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength]; +#define RadioA_2TArrayLength 282 +extern u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 78 +extern u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 282 +extern u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength]; +#define RadioA_1T_mCardArrayLength 282 +extern u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength]; +#define RadioB_1T_mCardArrayLength 1 +extern u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength]; +#define RadioA_1T_HPArrayLength 282 +extern u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength]; +#define RadioB_GM_ArrayLength 1 +extern u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength]; +#define MAC_2T_ArrayLength 172 +extern u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength]; +#define MACPHY_Array_PGLength 1 +extern u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength]; +#define AGCTAB_2TArrayLength 320 +extern u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 320 +extern u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength]; +#define AGCTAB_1T_HPArrayLength 320 +extern u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h new file mode 100755 index 000000000000..e376143a326f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DU_FW_IMG_H +#define __INC_HAL8192DU_FW_IMG_H + +#include + +/*Created on 2011/ 6/22, 2:27*/ + +#define ImgArrayLength 29642 +extern u8 Rtl8192DEFwImgArray[ImgArrayLength]; +#define MainArrayLength 1 +extern u8 Rtl8192DEFwMainArray[MainArrayLength]; +#define DataArrayLength 1 +extern u8 Rtl8192DEFwDataArray[DataArrayLength]; +#define PHY_REG_2TArrayLength 380 +extern u32 Rtl8192DEPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 1 +extern u32 Rtl8192DEPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_REG_Array_PGLength 624 +extern u32 Rtl8192DEPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_MPLength 10 +extern u32 Rtl8192DEPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define RadioA_2TArrayLength 378 +extern u32 Rtl8192DERadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 384 +extern u32 Rtl8192DERadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 1 +extern u32 Rtl8192DERadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192DERadioB_1TArray[RadioB_1TArrayLength]; +#define RadioA_2T_intPAArrayLength 378 +extern u32 Rtl8192DERadioA_2T_intPAArray[RadioA_2T_intPAArrayLength]; +#define RadioB_2T_intPAArrayLength 384 +extern u32 Rtl8192DERadioB_2T_intPAArray[RadioB_2T_intPAArrayLength]; +#define MAC_2TArrayLength 160 +extern u32 Rtl8192DEMAC_2TArray[MAC_2TArrayLength]; +#define AGCTAB_ArrayLength 386 +extern u32 Rtl8192DEAGCTAB_Array[AGCTAB_ArrayLength]; +#define AGCTAB_5GArrayLength 194 +extern u32 Rtl8192DEAGCTAB_5GArray[AGCTAB_5GArrayLength]; +#define AGCTAB_2GArrayLength 194 +extern u32 Rtl8192DEAGCTAB_2GArray[AGCTAB_2GArrayLength]; +#define AGCTAB_2TArrayLength 1 +extern u32 Rtl8192DEAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 1 +extern u32 Rtl8192DEAGCTAB_1TArray[AGCTAB_1TArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h new file mode 100755 index 000000000000..0cb96e51d648 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DETEST_FW_IMG_H +#define __INC_HAL8192DETEST_FW_IMG_H + +#include + +/*Created on 2010/ 5/27, 8: 6*/ + +#define Rtl8192DTestImgArrayLength 15054 +extern u8 Rtl8192DTestFwImgArray[Rtl8192DTestImgArrayLength]; +#define Rtl8192DTestMainArrayLength 1 +extern u8 Rtl8192DTestFwMainArray[Rtl8192DTestMainArrayLength]; +#define Rtl8192DTestDataArrayLength 1 +extern u8 Rtl8192DTestFwDataArray[Rtl8192DTestDataArrayLength]; +#define Rtl8192DTestPHY_REG_2TArrayLength 376 +extern u32 Rtl8192DTestPHY_REG_2TArray[Rtl8192DTestPHY_REG_2TArrayLength]; +#define Rtl8192DTestPHY_REG_1TArrayLength 1 +extern u32 Rtl8192DTestPHY_REG_1TArray[Rtl8192DTestPHY_REG_1TArrayLength]; +#define Rtl8192DTestPHY_REG_Array_PGLength 1 +extern u32 Rtl8192DTestPHY_REG_Array_PG[Rtl8192DTestPHY_REG_Array_PGLength]; +#define Rtl8192DTestRadioA_2TArrayLength 340 +extern u32 Rtl8192DTestRadioA_2TArray[Rtl8192DTestRadioA_2TArrayLength]; +#define Rtl8192DTestRadioB_2TArrayLength 340 +extern u32 Rtl8192DTestRadioB_2TArray[Rtl8192DTestRadioB_2TArrayLength]; +#define Rtl8192DTestRadioA_1TArrayLength 1 +extern u32 Rtl8192DTestRadioA_1TArray[Rtl8192DTestRadioA_1TArrayLength]; +#define Rtl8192DTestRadioB_1TArrayLength 1 +extern u32 Rtl8192DTestRadioB_1TArray[Rtl8192DTestRadioB_1TArrayLength]; +#define Rtl8192DTestMAC_2TArrayLength 174 +extern u32 Rtl8192DTestMAC_2TArray[Rtl8192DTestMAC_2TArrayLength]; +#define Rtl8192DTestAGCTAB_5GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_5GArray[Rtl8192DTestAGCTAB_5GArrayLength]; +#define Rtl8192DTestAGCTAB_2GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_2GArray[Rtl8192DTestAGCTAB_2GArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h new file mode 100755 index 000000000000..736189ed1bdf --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h @@ -0,0 +1,545 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192DPHYCFG_H + * + * + * Note: + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * + *****************************************************************************/ + /* Check to see if the file has been included already. */ +#ifndef __INC_HAL8192DPHYCFG_H +#define __INC_HAL8192DPHYCFG_H + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + + +#define IQK_MAC_REG_NUM 4 +#define IQK_ADDA_REG_NUM 16 +#define IQK_BB_REG_NUM 10 +#define IQK_BB_REG_NUM_test 6 +#define index_mapping_NUM 13 +#define Rx_index_mapping_NUM 15 +#define AVG_THERMAL_NUM 8 +#define IQK_Matrix_REG_NUM 8 +#define IQK_Matrix_Settings_NUM 1+24+21 + +#ifdef CONFIG_PCI_HCI +#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \ +{ \ + u1Byte u1bTmp; \ + u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \ + u1bTmp |= BIT0; \ + PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \ + PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \ + PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ + delay_us(100); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ +} +#endif + + +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ +typedef enum _SwChnlCmdID{ + CmdID_End, + CmdID_SetTxPowerLevel, + CmdID_BBRegWrite10, + CmdID_WritePortUlong, + CmdID_WritePortUshort, + CmdID_WritePortUchar, + CmdID_RF_WriteReg, +}SwChnlCmdID; + + +/* 1. Switch channel related */ +typedef struct _SwChnlCmd{ + SwChnlCmdID CmdID; + u32 Para1; + u32 Para2; + u32 msDelay; +}SwChnlCmd; + +typedef enum _HW90_BLOCK{ + HW90_BLOCK_MAC = 0, + HW90_BLOCK_PHY0 = 1, + HW90_BLOCK_PHY1 = 2, + HW90_BLOCK_RF = 3, + HW90_BLOCK_MAXIMUM = 4, // Never use this +}HW90_BLOCK_E, *PHW90_BLOCK_E; + +//vivi added this for read parameter from header, 20100908 +typedef enum _RF_CONTENT{ + radioa_txt = 0x1000, + radiob_txt = 0x1001, + radioc_txt = 0x1002, + radiod_txt = 0x1003 +} RF_CONTENT; + +typedef enum _RF90_RADIO_PATH{ + RF90_PATH_A = 0, //Radio Path A + RF90_PATH_B = 1, //Radio Path B + RF90_PATH_C = 2, //Radio Path C + RF90_PATH_D = 3, //Radio Path D + //RF90_PATH_MAX //Max RF number 90 support +}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E; + +#define RF90_PATH_MAX 2 + + +typedef enum _WIRELESS_MODE { + WIRELESS_MODE_UNKNOWN = 0x00, + WIRELESS_MODE_A = 0x01, + WIRELESS_MODE_B = 0x02, + WIRELESS_MODE_G = 0x04, + WIRELESS_MODE_AUTO = 0x08, + WIRELESS_MODE_N_24G = 0x10, + WIRELESS_MODE_N_5G = 0x20 +} WIRELESS_MODE; + + +#if(TX_POWER_FOR_5G_BAND == 1) +#define CHANNEL_MAX_NUMBER 14+24+21 // 14 is the max channel number +#define CHANNEL_GROUP_MAX 3+9 // ch1~3, ch4~9, ch10~14 total three groups +#define MAX_PG_GROUP 13 +#else +#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number +#define CHANNEL_GROUP_MAX 3 // ch1~3, ch4~9, ch10~14 total three groups +#define MAX_PG_GROUP 7 +#endif +#define CHANNEL_GROUP_MAX_2G 3 +#define CHANNEL_GROUP_IDX_5GL 3 +#define CHANNEL_GROUP_IDX_5GM 6 +#define CHANNEL_GROUP_IDX_5GH 9 +#define CHANNEL_GROUP_MAX_5G 9 +#define CHANNEL_MAX_NUMBER_2G 14 + +#if (RTL8192D_DUAL_MAC_MODE_SWITCH == 1) +typedef enum _BaseBand_Config_Type{ + BaseBand_Config_PHY_REG = 0, + BaseBand_Config_AGC_TAB = 1, + BaseBand_Config_AGC_TAB_2G = 2, + BaseBand_Config_AGC_TAB_5G = 3, +}BaseBand_Config_Type, *PBaseBand_Config_Type; +#else +typedef enum _BaseBand_Config_Type{ + BaseBand_Config_PHY_REG = 0, //Radio Path A + BaseBand_Config_AGC_TAB = 1, //Radio Path B +}BaseBand_Config_Type, *PBaseBand_Config_Type; +#endif + + +typedef enum _MACPHY_MODE_8192D{ + DUALMAC_DUALPHY, + DUALMAC_SINGLEPHY, + SINGLEMAC_SINGLEPHY +}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; + +typedef enum _BAND_TYPE{ + BAND_ON_2_4G = 0, + BAND_ON_5G, + BAND_ON_BOTH, + BANDMAX +}BAND_TYPE,*PBAND_TYPE; + +typedef enum _PHY_Rate_Tx_Power_Offset_Area{ + RA_OFFSET_LEGACY_OFDM1, + RA_OFFSET_LEGACY_OFDM2, + RA_OFFSET_HT_OFDM1, + RA_OFFSET_HT_OFDM2, + RA_OFFSET_HT_OFDM3, + RA_OFFSET_HT_OFDM4, + RA_OFFSET_HT_CCK, +}RA_OFFSET_AREA,*PRA_OFFSET_AREA; + + +/* BB/RF related */ +typedef enum _RF_TYPE_8190P{ + RF_TYPE_MIN, // 0 + RF_8225=1, // 1 11b/g RF for verification only + RF_8256=2, // 2 11b/g/n + RF_8258=3, // 3 11a/b/g/n RF + RF_6052=4, // 4 11b/g/n RF + //RF_6052=5, // 4 11b/g/n RF + // TODO: We sholud remove this psudo PHY RF after we get new RF. + RF_PSEUDO_11N=5, // 5, It is a temporality RF. +}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; + + +typedef enum _RATR_TABLE_MODE_8192C{ + RATR_INX_WIRELESS_NGB = 0, + RATR_INX_WIRELESS_NG = 1, + RATR_INX_WIRELESS_NB = 2, + RATR_INX_WIRELESS_N = 3, + RATR_INX_WIRELESS_GB = 4, + RATR_INX_WIRELESS_G = 5, + RATR_INX_WIRELESS_B = 6, + RATR_INX_WIRELESS_MC = 7, + RATR_INX_WIRELESS_A = 8, +}RATR_TABLE_MODE_8192C, *PRATR_TABLE_MODE_8192C; + +typedef struct _BB_REGISTER_DEFINITION{ + u32 rfintfs; // set software control: + // 0x870~0x877[8 bytes] + + u32 rfintfi; // readback data: + // 0x8e0~0x8e7[8 bytes] + + u32 rfintfo; // output data: + // 0x860~0x86f [16 bytes] + + u32 rfintfe; // output enable: + // 0x860~0x86f [16 bytes] + + u32 rf3wireOffset; // LSSI data: + // 0x840~0x84f [16 bytes] + + u32 rfLSSI_Select; // BB Band Select: + // 0x878~0x87f [8 bytes] + + u32 rfTxGainStage; // Tx gain stage: + // 0x80c~0x80f [4 bytes] + + u32 rfHSSIPara1; // wire parameter control1 : + // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] + + u32 rfHSSIPara2; // wire parameter control2 : + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] + + u32 rfSwitchControl; //Tx Rx antenna control : + // 0x858~0x85f [16 bytes] + + u32 rfAGCControl1; //AGC parameter control1 : + // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] + + u32 rfAGCControl2; //AGC parameter control2 : + // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] + + u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : + // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] + + u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : + // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] + + u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix + // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] + + u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type + // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] + + u32 rfLSSIReadBack; //LSSI RF readback data SI mode + // 0x8a0~0x8af [16 bytes] + + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B + +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; + +#ifdef CONFIG_MP_INCLUDED +typedef enum _ANTENNA_PATH{ + ANTENNA_NONE = 0x00, + ANTENNA_D , + ANTENNA_C , + ANTENNA_CD , + ANTENNA_B , + ANTENNA_BD , + ANTENNA_BC , + ANTENNA_BCD , + ANTENNA_A , + ANTENNA_AD , + ANTENNA_AC , + ANTENNA_ACD , + ANTENNA_AB , + ANTENNA_ABD , + ANTENNA_ABC , + ANTENNA_ABCD +} ANTENNA_PATH; +#endif + +typedef struct _R_ANTENNA_SELECT_OFDM{ + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK{ + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + +//Added for TX Power +//u8 GetRightChnlPlace(u8 chnl); +u8 rtl8192d_GetRightChnlPlaceforIQK(u8 chnl); +u8 rtl8192d_getChnlGroupfromArray(u8 chnl); +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +void rtl8192d_PHY_SetBBReg1Byte( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 rtl8192d_PHY_QueryBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192d_PHY_SetBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 rtl8192d_PHY_QueryRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192d_PHY_SetRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +extern int PHY_MACConfig8192D( IN PADAPTER Adapter ); +extern int PHY_BBConfig8192D( IN PADAPTER Adapter ); +extern int PHY_RFConfig8192D( IN PADAPTER Adapter ); +/* RF config */ +int rtl8192d_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter, + IN u8* pFileName, + IN RF90_RADIO_PATH_E eRFPath); +int rtl8192d_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, + IN RF_CONTENT Content, + IN RF90_RADIO_PATH_E eRFPath); +/* BB/RF readback check for making sure init OK */ +int rtl8192d_PHY_CheckBBAndRFOK( IN PADAPTER Adapter, + IN HW90_BLOCK_E CheckBlock, + IN RF90_RADIO_PATH_E eRFPath ); +/* Read initi reg value for tx power setting. */ +void rtl8192d_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); + +// +// RF Power setting +// +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, +// IN RT_RF_POWER_STATE eRFPowerState); + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8192D( IN PADAPTER Adapter, + OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8192D( IN PADAPTER Adapter, + IN u8 channel ); +BOOLEAN PHY_UpdateTxPowerDbm8192D( IN PADAPTER Adapter, + IN int powerInDbm ); + +// +VOID +PHY_ScanOperationBackup8192D(IN PADAPTER Adapter, + IN u8 Operation ); + +// +// Switch bandwidth for 8192S +// +//void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SetBWMode8192D( IN PADAPTER pAdapter, + IN HT_CHANNEL_WIDTH ChnlWidth, + IN unsigned char Offset ); + +// +// Set FW CMD IO for 8192S. +// +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, +// IN IO_TYPE IOType); + +// +// Set A2 entry to fw for 8192S +// +extern void FillA2Entry8192C( IN PADAPTER Adapter, + IN u8 index, + IN u8* val); + + +// +// channel switch related funciton +// +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SwChnl8192D( IN PADAPTER pAdapter, + IN u8 channel ); + // Call after initialization +void PHY_SwChnlPhy8192D( IN PADAPTER pAdapter, + IN u8 channel ); + +extern void ChkFwCmdIoDone( IN PADAPTER Adapter); + +#ifdef USE_WORKITEM +//extern void SetIOWorkItemCallback( IN PVOID pContext ); +#else +//extern void SetIOTimerCallback( IN PRT_TIMER pTimer); +#endif + +// +// BB/MAC/RF other monitor API +// +void PHY_SetMonitorMode8192D(IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode ); + +BOOLEAN PHY_CheckIsLegalRfPath8192D(IN PADAPTER pAdapter, + IN u32 eRFPath ); + +// +// IQ calibrate +// +void rtl8192d_PHY_IQCalibrate( IN PADAPTER pAdapter); + + +// +// LC calibrate +// +void rtl8192d_PHY_LCCalibrate(IN PADAPTER pAdapter); + +// +// AP calibrate +// +void rtl8192d_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta); + + +// +// Modify the value of the hw register when beacon interval be changed. +// +void +rtl8192d_PHY_SetBeaconHwReg( IN PADAPTER Adapter, + IN u16 BeaconInterval ); + + +extern VOID +PHY_SwitchEphyParameter( + IN PADAPTER Adapter + ); + +extern VOID +PHY_EnableHostClkReq( + IN PADAPTER Adapter + ); + +BOOLEAN +SetAntennaConfig92C( + IN PADAPTER Adapter, + IN u8 DefaultAnt + ); + +VOID +PHY_UpdateBBRFConfiguration8192D( + IN PADAPTER Adapter, + IN BOOLEAN bisBandSwitch +); + +VOID PHY_ReadMacPhyMode92D( + IN PADAPTER Adapter, + IN BOOLEAN AutoloadFail +); + +VOID PHY_ConfigMacPhyMode92D( + IN PADAPTER Adapter +); + +VOID PHY_ConfigMacPhyModeInfo92D( + IN PADAPTER Adapter +); + +VOID PHY_ConfigMacCoexist_RFPage92D( + IN PADAPTER Adapter +); + +VOID +rtl8192d_PHY_InitRxSetting( + IN PADAPTER Adapter +); + +VOID +rtl8192d_PHY_ResetIQKResult( + IN PADAPTER Adapter +); + + +VOID +rtl8192d_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain); + +VOID +HalChangeCCKStatus8192D( + IN PADAPTER Adapter, + IN BOOLEAN bCCKDisable +); + +/*--------------------------Exported Function prototype---------------------*/ + +#define PHY_SetBBReg1Byte(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg1Byte((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192d_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192d_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192d_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) + +#define PHY_SetMacReg PHY_SetBBReg + +#endif // __INC_HAL8192SPHYCFG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h new file mode 100755 index 000000000000..d07bc1ff0579 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h @@ -0,0 +1,1059 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192DPHYREG_H + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __INC_HAL8192DPHYREG_H +#define __INC_HAL8192DPHYREG_H + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 + + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x42 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff +//#define bRFRegOffsetMask 0xfff + +//MAC0 will wirte PHY1 +#define MAC0_ACCESS_PHY1 0x4000 +//MAC1 will wirte PHY0 +#define MAC1_ACCESS_PHY0 0x2000 + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h new file mode 100755 index 000000000000..a6e1db2784c1 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DU_FW_IMG_H +#define __INC_HAL8192DU_FW_IMG_H + +#include + +/*Created on 2011/ 6/22, 2:27*/ + +#define ImgArrayLength 29642 +extern u8 Rtl8192DUFwImgArray[ImgArrayLength]; +#define MainArrayLength 1 +extern u8 Rtl8192DUFwMainArray[MainArrayLength]; +#define DataArrayLength 1 +extern u8 Rtl8192DUFwDataArray[DataArrayLength]; +#define PHY_REG_2TArrayLength 380 +extern u32 Rtl8192DUPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 1 +extern u32 Rtl8192DUPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_REG_Array_PGLength 624 +extern u32 Rtl8192DUPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_MPLength 10 +extern u32 Rtl8192DUPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define RadioA_2TArrayLength 378 +extern u32 Rtl8192DURadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 384 +extern u32 Rtl8192DURadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 1 +extern u32 Rtl8192DURadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192DURadioB_1TArray[RadioB_1TArrayLength]; +#define RadioA_2T_intPAArrayLength 378 +extern u32 Rtl8192DURadioA_2T_intPAArray[RadioA_2T_intPAArrayLength]; +#define RadioB_2T_intPAArrayLength 384 +extern u32 Rtl8192DURadioB_2T_intPAArray[RadioB_2T_intPAArrayLength]; +#define MAC_2TArrayLength 160 +extern u32 Rtl8192DUMAC_2TArray[MAC_2TArrayLength]; +#define AGCTAB_ArrayLength 386 +extern u32 Rtl8192DUAGCTAB_Array[AGCTAB_ArrayLength]; +#define AGCTAB_5GArrayLength 194 +extern u32 Rtl8192DUAGCTAB_5GArray[AGCTAB_5GArrayLength]; +#define AGCTAB_2GArrayLength 194 +extern u32 Rtl8192DUAGCTAB_2GArray[AGCTAB_2GArrayLength]; +#define AGCTAB_2TArrayLength 1 +extern u32 Rtl8192DUAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 1 +extern u32 Rtl8192DUAGCTAB_1TArray[AGCTAB_1TArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h new file mode 100755 index 000000000000..3ce7a3d80983 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DUTEST_FW_IMG_H +#define __INC_HAL8192DUTEST_FW_IMG_H + +#include + +/*Created on 2010/ 5/27, 9:49*/ + +#define Rtl8192DTestImgArrayLength 15054 +extern u8 Rtl8192DTestFwImgArray[Rtl8192DTestImgArrayLength]; +#define Rtl8192DTestMainArrayLength 1 +extern u8 Rtl8192DTestFwMainArray[Rtl8192DTestMainArrayLength]; +#define Rtl8192DTestDataArrayLength 1 +extern u8 Rtl8192DTestFwDataArray[Rtl8192DTestDataArrayLength]; +#define Rtl8192DTestPHY_REG_2TArrayLength 376 +extern u32 Rtl8192DTestPHY_REG_2TArray[Rtl8192DTestPHY_REG_2TArrayLength]; +#define Rtl8192DTestPHY_REG_1TArrayLength 1 +extern u32 Rtl8192DTestPHY_REG_1TArray[Rtl8192DTestPHY_REG_1TArrayLength]; +#define Rtl8192DTestPHY_REG_Array_PGLength 1 +extern u32 Rtl8192DTestPHY_REG_Array_PG[Rtl8192DTestPHY_REG_Array_PGLength]; +#define Rtl8192DTestRadioA_2TArrayLength 340 +extern u32 Rtl8192DTestRadioA_2TArray[Rtl8192DTestRadioA_2TArrayLength]; +#define Rtl8192DTestRadioB_2TArrayLength 340 +extern u32 Rtl8192DTestRadioB_2TArray[Rtl8192DTestRadioB_2TArrayLength]; +#define Rtl8192DTestRadioA_1TArrayLength 1 +extern u32 Rtl8192DTestRadioA_1TArray[Rtl8192DTestRadioA_1TArrayLength]; +#define Rtl8192DTestRadioB_1TArrayLength 1 +extern u32 Rtl8192DTestRadioB_1TArray[Rtl8192DTestRadioB_1TArrayLength]; +#define Rtl8192DTestMAC_2TArrayLength 174 +extern u32 Rtl8192DTestMAC_2TArray[Rtl8192DTestMAC_2TArrayLength]; +#define Rtl8192DTestAGCTAB_5GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_5GArray[Rtl8192DTestAGCTAB_5GArrayLength]; +#define Rtl8192DTestAGCTAB_2GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_2GArray[Rtl8192DTestAGCTAB_2GArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/autoconf.h b/drivers/net/wireless/rtl8192c/include/autoconf.h new file mode 100755 index 000000000000..d58240b12116 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/autoconf.h @@ -0,0 +1,216 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +/* + * Public General Config + */ +#define AUTOCONF_INCLUDED +#define RTL871X_MODULE_NAME "92CU" +#define DRV_NAME "rtl8192cu" + +#define CONFIG_USB_HCI 1 + +#define CONFIG_RTL8192C 1 + +#define PLATFORM_LINUX 1 + + +/* + * Internal General Config + */ +//#define CONFIG_PWRCTRL +//#define CONFIG_H2CLBK + +#define CONFIG_EMBEDDED_FWIMG 1 + +#define CONFIG_R871X_TEST 1 + +#define CONFIG_80211N_HT 1 + +#define CONFIG_RECV_REORDERING_CTRL 1 + +//#define CONFIG_TCP_CSUM_OFFLOAD_RX 1 + +//#define CONFIG_DRVEXT_MODULE 1 + +#ifndef CONFIG_MP_INCLUDED +//#define CONFIG_IPS 1 /* modified by gwl, we'd better comment out the IPS function if we use lower speed IO interface. */ +#ifdef CONFIG_IPS + //#define CONFIG_IPS_LEVEL_2 1 //enable this to set default IPS mode to IPS_LEVEL_2 (added by gwl) +#endif +#define SUPPORT_HW_RFOFF_DETECTED 1 + +#define CONFIG_LPS 1 +#define CONFIG_BT_COEXIST 1 +//befor link +#define CONFIG_ANTENNA_DIVERSITY +//after link +#ifdef CONFIG_ANTENNA_DIVERSITY +#define CONFIG_SW_ANTENNA_DIVERSITY +//#define CONFIG_HW_ANTENNA_DIVERSITY +#endif + +#else +#define CONFIG_MP_IWPRIV_SUPPORT 1 +#endif + +#define CONFIG_AP_MODE 1 +#define CONFIG_NATIVEAP_MLME 1 + +// Added by Albert 20110314 +//#define CONFIG_P2P 1 + +// Added by Kurt 20110511 +//#define CONFIG_TDLS 1 + +#ifdef CONFIG_AP_MODE + #ifndef CONFIG_NATIVEAP_MLME + #define CONFIG_HOSTAPD_MLME 1 + #endif + #define CONFIG_FIND_BEST_CHANNEL 1//added by gwl +#endif + +#define CONFIG_SKB_COPY 1//for amsdu + +#define CONFIG_LED +#ifdef CONFIG_LED + #define CONFIG_SW_LED +#endif //CONFIG_LED + +#define CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + +#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface +#define CONFIG_GLOBAL_UI_PID + +#define CONFIG_LAYER2_ROAMING +#define CONFIG_LAYER2_ROAMING_RESUME +//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general... +//#define CONFIG_RESUME_IN_WORKQUEUE +//#define CONFIG_SET_SCAN_DENY_TIMER +#define CONFIG_LONG_DELAY_ISSUE +#define CONFIG_NEW_SIGNAL_STAT_PROCESS + +/* + * Interface Related Config + */ +//#define CONFIG_USB_INTERRUPT_IN_PIPE 1 + +#ifndef CONFIG_MINIMAL_MEMORY_USAGE + #define CONFIG_USB_TX_AGGREGATION 1 + #define CONFIG_USB_RX_AGGREGATION 1 +#endif + +#define CONFIG_PREALLOC_RECV_SKB 1 +#define CONFIG_REDUCE_USB_TX_INT 1 +//#define CONFIG_EASY_REPLACEMENT 1 + +/* + * CONFIG_USE_USB_BUFFER_ALLOC_XX uses Linux USB Buffer alloc API and is for Linux platform only now! + */ +//#define CONFIG_USE_USB_BUFFER_ALLOC_TX 1 // For TX path +//#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1 // For RX path + +#define CONFIG_USB_VENDOR_REQ_PREALLOC 1 + +//#define CONFIG_USB_SUPPORT_ASYNC_VDN_REQ 1 + + +/* + * HAL Related Config + */ + +#define RTL8192C_RX_PACKET_NO_INCLUDE_CRC 1 + +#define SUPPORTED_BLOCK_IO + + + +#define RTL8192CU_FW_DOWNLOAD_ENABLE 1 + +#define CONFIG_ONLY_ONE_OUT_EP_TO_LOW 0 + +#define CONFIG_OUT_EP_WIFI_MODE 0 + +#define ENABLE_USB_DROP_INCORRECT_OUT 0 + +#define RTL8192CU_ASIC_VERIFICATION 0 // For ASIC verification. + +#define RTL8192CU_ADHOC_WORKAROUND_SETTING 1 + +#define DISABLE_BB_RF 0 + +#define RTL8191C_FPGA_NETWORKTYPE_ADHOC 0 + +#ifdef CONFIG_MP_INCLUDED + #define MP_DRIVER 1 + #undef CONFIG_USB_TX_AGGREGATION + #undef CONFIG_USB_RX_AGGREGATION +#else + #define MP_DRIVER 0 +#endif + + +/* + * Platform Related Config + */ +#ifdef CONFIG_PLATFORM_MN10300 +#define CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + +#if defined (CONFIG_SW_ANTENNA_DIVERSITY) + #undef CONFIG_SW_ANTENNA_DIVERSITY + #define CONFIG_HW_ANTENNA_DIVERSITY +#endif + +#endif + +#ifndef CONFIG_WISTRON_PLATFORM +//#define CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD 1 +#define SILENT_RESET_FOR_SPECIFIC_PLATFOM 1 +#endif + +#ifdef CONFIG_PLATFORM_TI_DM365 +#define CONFIG_SPECIFIC_URB_NUM +#endif + + +/* + * Debug Related Config + */ +//#define CONFIG_DEBUG_RTL871X + +#define DBG 0 +#define CONFIG_DEBUG_RTL819X + +#define CONFIG_PROC_DEBUG 1 + +//#define DBG_IO +//#define DBG_DELAY_OS +//#define DBG_MEM_ALLOC +//#define DBG_IOCTL + +//#define DBG_TX +//#define DBG_XMIT_BUF +//#define DBG_TX_DROP_FRAME + +//#define DBG_RX_DROP_FRAME +//#define DBG_RX_SEQ + +//#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + diff --git a/drivers/net/wireless/rtl8192c/include/basic_types.h b/drivers/net/wireless/rtl8192c/include/basic_types.h new file mode 100755 index 000000000000..f8802240f509 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/basic_types.h @@ -0,0 +1,276 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __BASIC_TYPES_H__ +#define __BASIC_TYPES_H__ + +#include + + +#define SUCCESS 0 +#define FAIL (-1) + +#ifndef TRUE + #define _TRUE 1 +#else + #define _TRUE TRUE +#endif + +#ifndef FALSE + #define _FALSE 0 +#else + #define _FALSE FALSE +#endif + +#ifdef PLATFORM_WINDOWS + + typedef signed char s8; + typedef unsigned char u8; + + typedef signed short s16; + typedef unsigned short u16; + + typedef signed long s32; + typedef unsigned long u32; + + typedef unsigned int uint; + typedef signed int sint; + + + typedef signed long long s64; + typedef unsigned long long u64; + + #ifdef NDIS50_MINIPORT + + #define NDIS_MAJOR_VERSION 5 + #define NDIS_MINOR_VERSION 0 + + #endif + + #ifdef NDIS51_MINIPORT + + #define NDIS_MAJOR_VERSION 5 + #define NDIS_MINOR_VERSION 1 + + #endif + + typedef NDIS_PROC proc_t; + + typedef LONG atomic_t; + +#endif + + +#ifdef PLATFORM_LINUX + + #include + #define IN + #define OUT + #define VOID void + #define NDIS_OID uint + #define NDIS_STATUS uint + + typedef signed int sint; + + #ifndef PVOID + typedef void * PVOID; + //#define PVOID (void *) + #endif + + #define UCHAR u8 + #define USHORT u16 + #define UINT u32 + #define ULONG u32 + + typedef void (*proc_t)(void*); + + typedef __kernel_size_t SIZE_T; + typedef __kernel_ssize_t SSIZE_T; + #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +#endif + +#define MEM_ALIGNMENT_OFFSET (sizeof (SIZE_T)) +#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1) + +#define SIZE_PTR SIZE_T +#define SSIZE_PTR SSIZE_T + +//port from fw by thomas +// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness + +/* + * Call endian free function when + * 1. Read/write packet content. + * 2. Before write integer to IO. + * 3. After read integer from IO. +*/ + +// +// Byte Swapping routine. +// +#define EF1Byte +#define EF2Byte le16_to_cpu +#define EF4Byte le32_to_cpu + +// +// Read LE format data from memory +// +#define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr))) +#define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr))) +#define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr))) + +// +// Write LE data to memory +// +#define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr)))=EF1Byte(_val) +#define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr)))=EF2Byte(_val) +#define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr)))=EF4Byte(_val) + +// +// Example: +// BIT_LEN_MASK_32(0) => 0x00000000 +// BIT_LEN_MASK_32(1) => 0x00000001 +// BIT_LEN_MASK_32(2) => 0x00000003 +// BIT_LEN_MASK_32(32) => 0xFFFFFFFF +// +#define BIT_LEN_MASK_32(__BitLen) \ + (0xFFFFFFFF >> (32 - (__BitLen))) +// +// Example: +// BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 +// BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 +// +#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_32(__BitLen) << (__BitOffset)) + +// +// Description: +// Return 4-byte value in host byte ordering from +// 4-byte pointer in litten-endian system. +// +#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + (EF4Byte(*((u32 *)(__pStart)))) + +// +// Description: +// Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to +// 4-byte value in host byte ordering. +// +#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_32(__BitLen) \ + ) + +// +// Description: +// Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering +// and return the result in 4-byte value in host byte ordering. +// +#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \ + ) + +// +// Description: +// Set subfield of little-endian 4-byte value to specified value. +// +#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u32 *)(__pStart)) = \ + EF4Byte( \ + LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \ + ); + + +#define BIT_LEN_MASK_16(__BitLen) \ + (0xFFFF >> (16 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_16(__BitLen) << (__BitOffset)) + +#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + (EF2Byte(*((u16 *)(__pStart)))) + +#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_16(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u16 *)(__pStart)) = \ + EF2Byte( \ + LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \ + ); + +#define BIT_LEN_MASK_8(__BitLen) \ + (0xFF >> (8 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_8(__BitLen) << (__BitOffset)) + +#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + (EF1Byte(*((u8 *)(__pStart)))) + +#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_8(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u8 *)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \ + ); + +// Get the N-bytes aligment offset from the current length +#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment)) + +typedef unsigned char BOOLEAN,*PBOOLEAN; + +#endif //__BASIC_TYPES_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h b/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h new file mode 100755 index 000000000000..eca68a6569f6 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h @@ -0,0 +1,87 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_BIG_ENDIAN_H +#define _LINUX_BYTEORDER_BIG_ENDIAN_H + +#ifndef __BIG_ENDIAN +#define __BIG_ENDIAN 4321 +#endif +#ifndef __BIG_ENDIAN_BITFIELD +#define __BIG_ENDIAN_BITFIELD +#endif + +#include + +#define __constant_htonl(x) ((__u32)(x)) +#define __constant_ntohl(x) ((__u32)(x)) +#define __constant_htons(x) ((__u16)(x)) +#define __constant_ntohs(x) ((__u16)(x)) +#define __constant_cpu_to_le64(x) ___constant_swab64((x)) +#define __constant_le64_to_cpu(x) ___constant_swab64((x)) +#define __constant_cpu_to_le32(x) ___constant_swab32((x)) +#define __constant_le32_to_cpu(x) ___constant_swab32((x)) +#define __constant_cpu_to_le16(x) ___constant_swab16((x)) +#define __constant_le16_to_cpu(x) ___constant_swab16((x)) +#define __constant_cpu_to_be64(x) ((__u64)(x)) +#define __constant_be64_to_cpu(x) ((__u64)(x)) +#define __constant_cpu_to_be32(x) ((__u32)(x)) +#define __constant_be32_to_cpu(x) ((__u32)(x)) +#define __constant_cpu_to_be16(x) ((__u16)(x)) +#define __constant_be16_to_cpu(x) ((__u16)(x)) +#define __cpu_to_le64(x) __swab64((x)) +#define __le64_to_cpu(x) __swab64((x)) +#define __cpu_to_le32(x) __swab32((x)) +#define __le32_to_cpu(x) __swab32((x)) +#define __cpu_to_le16(x) __swab16((x)) +#define __le16_to_cpu(x) __swab16((x)) +#define __cpu_to_be64(x) ((__u64)(x)) +#define __be64_to_cpu(x) ((__u64)(x)) +#define __cpu_to_be32(x) ((__u32)(x)) +#define __be32_to_cpu(x) ((__u32)(x)) +#define __cpu_to_be16(x) ((__u16)(x)) +#define __be16_to_cpu(x) ((__u16)(x)) +#define __cpu_to_le64p(x) __swab64p((x)) +#define __le64_to_cpup(x) __swab64p((x)) +#define __cpu_to_le32p(x) __swab32p((x)) +#define __le32_to_cpup(x) __swab32p((x)) +#define __cpu_to_le16p(x) __swab16p((x)) +#define __le16_to_cpup(x) __swab16p((x)) +#define __cpu_to_be64p(x) (*(__u64*)(x)) +#define __be64_to_cpup(x) (*(__u64*)(x)) +#define __cpu_to_be32p(x) (*(__u32*)(x)) +#define __be32_to_cpup(x) (*(__u32*)(x)) +#define __cpu_to_be16p(x) (*(__u16*)(x)) +#define __be16_to_cpup(x) (*(__u16*)(x)) +#define __cpu_to_le64s(x) __swab64s((x)) +#define __le64_to_cpus(x) __swab64s((x)) +#define __cpu_to_le32s(x) __swab32s((x)) +#define __le32_to_cpus(x) __swab32s((x)) +#define __cpu_to_le16s(x) __swab16s((x)) +#define __le16_to_cpus(x) __swab16s((x)) +#define __cpu_to_be64s(x) do {} while (0) +#define __be64_to_cpus(x) do {} while (0) +#define __cpu_to_be32s(x) do {} while (0) +#define __be32_to_cpus(x) do {} while (0) +#define __cpu_to_be16s(x) do {} while (0) +#define __be16_to_cpus(x) do {} while (0) + +#include + +#endif /* _LINUX_BYTEORDER_BIG_ENDIAN_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/generic.h b/drivers/net/wireless/rtl8192c/include/byteorder/generic.h new file mode 100755 index 000000000000..246ba892906d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/generic.h @@ -0,0 +1,209 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_GENERIC_H +#define _LINUX_BYTEORDER_GENERIC_H + +/* + * linux/byteorder_generic.h + * Generic Byte-reordering support + * + * Francois-Rene Rideau 19970707 + * gathered all the good ideas from all asm-foo/byteorder.h into one file, + * cleaned them up. + * I hope it is compliant with non-GCC compilers. + * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h, + * because I wasn't sure it would be ok to put it in types.h + * Upgraded it to 2.1.43 + * Francois-Rene Rideau 19971012 + * Upgraded it to 2.1.57 + * to please Linus T., replaced huge #ifdef's between little/big endian + * by nestedly #include'd files. + * Francois-Rene Rideau 19971205 + * Made it to 2.1.71; now a facelift: + * Put files under include/linux/byteorder/ + * Split swab from generic support. + * + * TODO: + * = Regular kernel maintainers could also replace all these manual + * byteswap macros that remain, disseminated among drivers, + * after some grep or the sources... + * = Linus might want to rename all these macros and files to fit his taste, + * to fit his personal naming scheme. + * = it seems that a few drivers would also appreciate + * nybble swapping support... + * = every architecture could add their byteswap macro in asm/byteorder.h + * see how some architectures already do (i386, alpha, ppc, etc) + * = cpu_to_beXX and beXX_to_cpu might some day need to be well + * distinguished throughout the kernel. This is not the case currently, + * since little endian, big endian, and pdp endian machines needn't it. + * But this might be the case for, say, a port of Linux to 20/21 bit + * architectures (and F21 Linux addict around?). + */ + +/* + * The following macros are to be defined by : + * + * Conversion of long and short int between network and host format + * ntohl(__u32 x) + * ntohs(__u16 x) + * htonl(__u32 x) + * htons(__u16 x) + * It seems that some programs (which? where? or perhaps a standard? POSIX?) + * might like the above to be functions, not macros (why?). + * if that's true, then detect them, and take measures. + * Anyway, the measure is: define only ___ntohl as a macro instead, + * and in a separate file, have + * unsigned long inline ntohl(x){return ___ntohl(x);} + * + * The same for constant arguments + * __constant_ntohl(__u32 x) + * __constant_ntohs(__u16 x) + * __constant_htonl(__u32 x) + * __constant_htons(__u16 x) + * + * Conversion of XX-bit integers (16- 32- or 64-) + * between native CPU format and little/big endian format + * 64-bit stuff only defined for proper architectures + * cpu_to_[bl]eXX(__uXX x) + * [bl]eXX_to_cpu(__uXX x) + * + * The same, but takes a pointer to the value to convert + * cpu_to_[bl]eXXp(__uXX x) + * [bl]eXX_to_cpup(__uXX x) + * + * The same, but change in situ + * cpu_to_[bl]eXXs(__uXX x) + * [bl]eXX_to_cpus(__uXX x) + * + * See asm-foo/byteorder.h for examples of how to provide + * architecture-optimized versions + * + */ + + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) +/* + * inside the kernel, we can use nicknames; + * outside of it, we must avoid POSIX namespace pollution... + */ +#define cpu_to_le64 __cpu_to_le64 +#define le64_to_cpu __le64_to_cpu +#define cpu_to_le32 __cpu_to_le32 +#define le32_to_cpu __le32_to_cpu +#define cpu_to_le16 __cpu_to_le16 +#define le16_to_cpu __le16_to_cpu +#define cpu_to_be64 __cpu_to_be64 +#define be64_to_cpu __be64_to_cpu +#define cpu_to_be32 __cpu_to_be32 +#define be32_to_cpu __be32_to_cpu +#define cpu_to_be16 __cpu_to_be16 +#define be16_to_cpu __be16_to_cpu +#define cpu_to_le64p __cpu_to_le64p +#define le64_to_cpup __le64_to_cpup +#define cpu_to_le32p __cpu_to_le32p +#define le32_to_cpup __le32_to_cpup +#define cpu_to_le16p __cpu_to_le16p +#define le16_to_cpup __le16_to_cpup +#define cpu_to_be64p __cpu_to_be64p +#define be64_to_cpup __be64_to_cpup +#define cpu_to_be32p __cpu_to_be32p +#define be32_to_cpup __be32_to_cpup +#define cpu_to_be16p __cpu_to_be16p +#define be16_to_cpup __be16_to_cpup +#define cpu_to_le64s __cpu_to_le64s +#define le64_to_cpus __le64_to_cpus +#define cpu_to_le32s __cpu_to_le32s +#define le32_to_cpus __le32_to_cpus +#define cpu_to_le16s __cpu_to_le16s +#define le16_to_cpus __le16_to_cpus +#define cpu_to_be64s __cpu_to_be64s +#define be64_to_cpus __be64_to_cpus +#define cpu_to_be32s __cpu_to_be32s +#define be32_to_cpus __be32_to_cpus +#define cpu_to_be16s __cpu_to_be16s +#define be16_to_cpus __be16_to_cpus +#endif + + +/* + * Handle ntohl and suches. These have various compatibility + * issues - like we want to give the prototype even though we + * also have a macro for them in case some strange program + * wants to take the address of the thing or something.. + * + * Note that these used to return a "long" in libc5, even though + * long is often 64-bit these days.. Thus the casts. + * + * They have to be macros in order to do the constant folding + * correctly - if the argument passed into a inline function + * it is no longer constant according to gcc.. + */ + +#undef ntohl +#undef ntohs +#undef htonl +#undef htons + +/* + * Do the prototypes. Somebody might want to take the + * address or some such sick thing.. + */ +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) +extern __u32 ntohl(__u32); +extern __u32 htonl(__u32); +#else +extern unsigned long int ntohl(unsigned long int); +extern unsigned long int htonl(unsigned long int); +#endif +extern unsigned short int ntohs(unsigned short int); +extern unsigned short int htons(unsigned short int); + + +#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) || defined(PLATFORM_MPIXEL) + +#define ___htonl(x) __cpu_to_be32(x) +#define ___htons(x) __cpu_to_be16(x) +#define ___ntohl(x) __be32_to_cpu(x) +#define ___ntohs(x) __be16_to_cpu(x) + +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) +#define htonl(x) ___htonl(x) +#define ntohl(x) ___ntohl(x) +#else +#define htonl(x) ((unsigned long)___htonl(x)) +#define ntohl(x) ((unsigned long)___ntohl(x)) +#endif +#define htons(x) ___htons(x) +#define ntohs(x) ___ntohs(x) + +#endif /* OPTIMIZE */ + + +#if defined (PLATFORM_WINDOWS) + +#define htonl(x) __cpu_to_be32(x) +#define ntohl(x) __be32_to_cpu(x) +#define htons(x) __cpu_to_be16(x) +#define ntohs(x) __be16_to_cpu(x) + + +#endif + +#endif /* _LINUX_BYTEORDER_GENERIC_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h b/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h new file mode 100755 index 000000000000..433045e46939 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h @@ -0,0 +1,89 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_LITTLE_ENDIAN_H +#define _LINUX_BYTEORDER_LITTLE_ENDIAN_H + +#ifndef __LITTLE_ENDIAN +#define __LITTLE_ENDIAN 1234 +#endif +#ifndef __LITTLE_ENDIAN_BITFIELD +#define __LITTLE_ENDIAN_BITFIELD +#endif + +#include + +#ifndef __constant_htonl +#define __constant_htonl(x) ___constant_swab32((x)) +#define __constant_ntohl(x) ___constant_swab32((x)) +#define __constant_htons(x) ___constant_swab16((x)) +#define __constant_ntohs(x) ___constant_swab16((x)) +#define __constant_cpu_to_le64(x) ((__u64)(x)) +#define __constant_le64_to_cpu(x) ((__u64)(x)) +#define __constant_cpu_to_le32(x) ((__u32)(x)) +#define __constant_le32_to_cpu(x) ((__u32)(x)) +#define __constant_cpu_to_le16(x) ((__u16)(x)) +#define __constant_le16_to_cpu(x) ((__u16)(x)) +#define __constant_cpu_to_be64(x) ___constant_swab64((x)) +#define __constant_be64_to_cpu(x) ___constant_swab64((x)) +#define __constant_cpu_to_be32(x) ___constant_swab32((x)) +#define __constant_be32_to_cpu(x) ___constant_swab32((x)) +#define __constant_cpu_to_be16(x) ___constant_swab16((x)) +#define __constant_be16_to_cpu(x) ___constant_swab16((x)) +#define __cpu_to_le64(x) ((__u64)(x)) +#define __le64_to_cpu(x) ((__u64)(x)) +#define __cpu_to_le32(x) ((__u32)(x)) +#define __le32_to_cpu(x) ((__u32)(x)) +#define __cpu_to_le16(x) ((__u16)(x)) +#define __le16_to_cpu(x) ((__u16)(x)) +#define __cpu_to_be64(x) __swab64((x)) +#define __be64_to_cpu(x) __swab64((x)) +#define __cpu_to_be32(x) __swab32((x)) +#define __be32_to_cpu(x) __swab32((x)) +#define __cpu_to_be16(x) __swab16((x)) +#define __be16_to_cpu(x) __swab16((x)) +#define __cpu_to_le64p(x) (*(__u64*)(x)) +#define __le64_to_cpup(x) (*(__u64*)(x)) +#define __cpu_to_le32p(x) (*(__u32*)(x)) +#define __le32_to_cpup(x) (*(__u32*)(x)) +#define __cpu_to_le16p(x) (*(__u16*)(x)) +#define __le16_to_cpup(x) (*(__u16*)(x)) +#define __cpu_to_be64p(x) __swab64p((x)) +#define __be64_to_cpup(x) __swab64p((x)) +#define __cpu_to_be32p(x) __swab32p((x)) +#define __be32_to_cpup(x) __swab32p((x)) +#define __cpu_to_be16p(x) __swab16p((x)) +#define __be16_to_cpup(x) __swab16p((x)) +#define __cpu_to_le64s(x) do {} while (0) +#define __le64_to_cpus(x) do {} while (0) +#define __cpu_to_le32s(x) do {} while (0) +#define __le32_to_cpus(x) do {} while (0) +#define __cpu_to_le16s(x) do {} while (0) +#define __le16_to_cpus(x) do {} while (0) +#define __cpu_to_be64s(x) __swab64s((x)) +#define __be64_to_cpus(x) __swab64s((x)) +#define __cpu_to_be32s(x) __swab32s((x)) +#define __be32_to_cpus(x) __swab32s((x)) +#define __cpu_to_be16s(x) __swab16s((x)) +#define __be16_to_cpus(x) __swab16s((x)) +#endif // __constant_htonl + +#include + +#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/swab.h b/drivers/net/wireless/rtl8192c/include/byteorder/swab.h new file mode 100755 index 000000000000..117c84deea5e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/swab.h @@ -0,0 +1,133 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _LINUX_BYTEORDER_SWAB_H +#define _LINUX_BYTEORDER_SWAB_H + +#if !defined(CONFIG_PLATFORM_MSTAR_TITANIA12) +#ifndef __u16 +typedef unsigned short __u16; +#endif + +#ifndef __u32 +typedef unsigned int __u32; +#endif + +#ifndef __u8 +typedef unsigned char __u8; +#endif + +#ifndef __u64 +typedef unsigned long long __u64; +#endif + + +__inline static __u16 ___swab16(__u16 x) +{ + __u16 __x = x; + return + ((__u16)( + (((__u16)(__x) & (__u16)0x00ffU) << 8) | + (((__u16)(__x) & (__u16)0xff00U) >> 8) )); + +} + +__inline static __u32 ___swab32(__u32 x) +{ + __u32 __x = (x); + return ((__u32)( + (((__u32)(__x) & (__u32)0x000000ffUL) << 24) | + (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) | + (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) | + (((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); +} + +__inline static __u64 ___swab64(__u64 x) +{ + __u64 __x = (x); + + return + ((__u64)( \ + (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \ + (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \ + (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \ + (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \ + (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \ + (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ + (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \ + (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \ +} +#endif // CONFIG_PLATFORM_MSTAR_TITANIA12 + +#ifndef __arch__swab16 +__inline static __u16 __arch__swab16(__u16 x) +{ + return ___swab16(x); +} + +#endif + +#ifndef __arch__swab32 +__inline static __u32 __arch__swab32(__u32 x) +{ + __u32 __tmp = (x) ; + return ___swab32(__tmp); +} +#endif + +#ifndef __arch__swab64 + +__inline static __u64 __arch__swab64(__u64 x) +{ + __u64 __tmp = (x) ; + return ___swab64(__tmp); +} + + +#endif + +#ifndef __swab16 +#define __swab16(x) __fswab16(x) +#define __swab32(x) __fswab32(x) +#define __swab64(x) __fswab64(x) +#endif // __swab16 + +__inline static const __u16 __fswab16(__u16 x) +{ + return __arch__swab16(x); +} +__inline static const __u32 __fswab32(__u32 x) +{ + return __arch__swab32(x); +} + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) +#define swab16 __swab16 +#define swab32 __swab32 +#define swab64 __swab64 +#define swab16p __swab16p +#define swab32p __swab32p +#define swab64p __swab64p +#define swab16s __swab16s +#define swab32s __swab32s +#define swab64s __swab64s +#endif + +#endif /* _LINUX_BYTEORDER_SWAB_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h b/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h new file mode 100755 index 000000000000..1735349f82ca --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h @@ -0,0 +1,157 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _LINUX_BYTEORDER_SWABB_H +#define _LINUX_BYTEORDER_SWABB_H + +/* + * linux/byteorder/swabb.h + * SWAp Bytes Bizarrely + * swaHHXX[ps]?(foo) + * + * Support for obNUXIous pdp-endian and other bizarre architectures. + * Will Linux ever run on such ancient beasts? if not, this file + * will be but a programming pearl. Still, it's a reminder that we + * shouldn't be making too many assumptions when trying to be portable. + * + */ + +/* + * Meaning of the names I chose (vaxlinux people feel free to correct them): + * swahw32 swap 16-bit half-words in a 32-bit word + * swahb32 swap 8-bit halves of each 16-bit half-word in a 32-bit word + * + * No 64-bit support yet. I don't know NUXI conventions for long longs. + * I guarantee it will be a mess when it's there, though :-> + * It will be even worse if there are conflicting 64-bit conventions. + * Hopefully, no one ever used 64-bit objects on NUXI machines. + * + */ + +#define ___swahw32(x) \ +({ \ + __u32 __x = (x); \ + ((__u32)( \ + (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \ + (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \ +}) +#define ___swahb32(x) \ +({ \ + __u32 __x = (x); \ + ((__u32)( \ + (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \ + (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \ +}) + +#define ___constant_swahw32(x) \ + ((__u32)( \ + (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ + (((__u32)(x) & (__u32)0xffff0000UL) >> 16) )) +#define ___constant_swahb32(x) \ + ((__u32)( \ + (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ + (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) )) + +/* + * provide defaults when no architecture-specific optimization is detected + */ +#ifndef __arch__swahw32 +# define __arch__swahw32(x) ___swahw32(x) +#endif +#ifndef __arch__swahb32 +# define __arch__swahb32(x) ___swahb32(x) +#endif + +#ifndef __arch__swahw32p +# define __arch__swahw32p(x) __swahw32(*(x)) +#endif +#ifndef __arch__swahb32p +# define __arch__swahb32p(x) __swahb32(*(x)) +#endif + +#ifndef __arch__swahw32s +# define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0) +#endif +#ifndef __arch__swahb32s +# define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0) +#endif + + +/* + * Allow constant folding + */ +#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) +# define __swahw32(x) \ +(__builtin_constant_p((__u32)(x)) ? \ + ___swahw32((x)) : \ + __fswahw32((x))) +# define __swahb32(x) \ +(__builtin_constant_p((__u32)(x)) ? \ + ___swahb32((x)) : \ + __fswahb32((x))) +#else +# define __swahw32(x) __fswahw32(x) +# define __swahb32(x) __fswahb32(x) +#endif /* OPTIMIZE */ + + +__inline static__ __const__ __u32 __fswahw32(__u32 x) +{ + return __arch__swahw32(x); +} +__inline static__ __u32 __swahw32p(__u32 *x) +{ + return __arch__swahw32p(x); +} +__inline static__ void __swahw32s(__u32 *addr) +{ + __arch__swahw32s(addr); +} + + +__inline static__ __const__ __u32 __fswahb32(__u32 x) +{ + return __arch__swahb32(x); +} +__inline static__ __u32 __swahb32p(__u32 *x) +{ + return __arch__swahb32p(x); +} +__inline static__ void __swahb32s(__u32 *addr) +{ + __arch__swahb32s(addr); +} + +#ifdef __BYTEORDER_HAS_U64__ +/* + * Not supported yet + */ +#endif /* __BYTEORDER_HAS_U64__ */ + +#if defined(PLATFORM_LINUX) +#define swahw32 __swahw32 +#define swahb32 __swahb32 +#define swahw32p __swahw32p +#define swahb32p __swahb32p +#define swahw32s __swahw32s +#define swahb32s __swahb32s +#endif + +#endif /* _LINUX_BYTEORDER_SWABB_H */ diff --git a/drivers/net/wireless/rtl8192c/include/circ_buf.h b/drivers/net/wireless/rtl8192c/include/circ_buf.h new file mode 100755 index 000000000000..1bd4704a7c33 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/circ_buf.h @@ -0,0 +1,27 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __CIRC_BUF_H_ +#define __CIRC_BUF_H_ 1 + +#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1)) + +#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size)) + +#endif //_CIRC_BUF_H_ diff --git a/drivers/net/wireless/rtl8192c/include/cmd_osdep.h b/drivers/net/wireless/rtl8192c/include/cmd_osdep.h new file mode 100755 index 000000000000..077efa731f9a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/cmd_osdep.h @@ -0,0 +1,36 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __CMD_OSDEP_H_ +#define __CMD_OSDEP_H_ + + +#include +#include +#include + +extern sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); +extern sint _rtw_init_evt_priv(struct evt_priv *pevtpriv); +extern void _rtw_free_evt_priv (struct evt_priv *pevtpriv); +extern void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv); +extern sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj); +extern struct cmd_obj *_rtw_dequeue_cmd(_queue *queue); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/drv_conf.h b/drivers/net/wireless/rtl8192c/include/drv_conf.h new file mode 100755 index 000000000000..b6d2acdc8afe --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_conf.h @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_CONF_H__ +#define __DRV_CONF_H__ +#include "autoconf.h" + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +//Rockchips' android kernel doesn't has CONFIG_ANDROID defined, +//add this to force CONFIG_ANDROID defined +#ifdef CONFIG_PLATFORM_ANDROID +//#define CONFIG_ANDROID +#endif + +#if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE) + #warning "You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically.\n" + #undef CONFIG_RESUME_IN_WORKQUEUE +#endif + +#if defined(CONFIG_ANDROID_POWER) && defined (CONFIG_RESUME_IN_WORKQUEUE) + #warning "You have CONFIG_ANDROID_POWER enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically.\n" + #undef CONFIG_RESUME_IN_WORKQUEUE +#endif + +#ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this... + #if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER) + #error "enable CONFIG_RESUME_IN_WORKQUEUE without CONFIG_WAKELOCK or CONFIG_ANDROID_POWER will suffer from the danger of wifi's unfunctionality...\n" + #error "If you still want to enable CONFIG_RESUME_IN_WORKQUEUE in this case, mask this preprossor checking and GOOD LUCK...\n" + #endif +#endif + + +//#include + +#endif // __DRV_CONF_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/drv_types.h b/drivers/net/wireless/rtl8192c/include/drv_types.h new file mode 100755 index 000000000000..2a6757d18630 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types.h @@ -0,0 +1,432 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*------------------------------------------------------------------------------- + + For type defines and data structure defines + +--------------------------------------------------------------------------------*/ + + +#ifndef __DRV_TYPES_H__ +#define __DRV_TYPES_H__ + +#include +#include +#include + + +#ifdef PLATFORM_OS_XP +#include +#endif + +#ifdef PLATFORM_OS_CE +#include +#endif + +#ifdef PLATFORM_LINUX +#include +#endif + +enum _NIC_VERSION { + + RTL8711_NIC, + RTL8712_NIC, + RTL8713_NIC, + RTL8716_NIC + +}; + +enum{ + UP_LINK, + DOWN_LINK, +}; +typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER; + +#ifdef CONFIG_80211N_HT +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_DRVEXT_MODULE +#include +#endif + +#ifdef CONFIG_MP_INCLUDED +#include +#endif + +#define SPEC_DEV_ID_NONE BIT(0) +#define SPEC_DEV_ID_DISABLE_HT BIT(1) +#define SPEC_DEV_ID_ENABLE_PS BIT(2) +#define SPEC_DEV_ID_RF_CONFIG_1T1R BIT(3) +#define SPEC_DEV_ID_RF_CONFIG_2T2R BIT(4) +#define SPEC_DEV_ID_ASSIGN_IFNAME BIT(5) + +struct specific_device_id{ + + u32 flags; + + u16 idVendor; + u16 idProduct; + +}; + +struct registry_priv +{ + u8 chip_version; + u8 rfintfs; + u8 lbkmode; + u8 hci; + NDIS_802_11_SSID ssid; + u8 network_mode; //infra, ad-hoc, auto + u8 channel;//ad-hoc support requirement + u8 wireless_mode;//A, B, G, auto + u8 scan_mode;//active, passive + u8 radio_enable; + u8 preamble;//long, short, auto + u8 vrtl_carrier_sense;//Enable, Disable, Auto + u8 vcs_type;//RTS/CTS, CTS-to-self + u16 rts_thresh; + u16 frag_thresh; + u8 adhoc_tx_pwr; + u8 soft_ap; + u8 power_mgnt; + u8 ips_mode; + u8 smart_ps; + u8 long_retry_lmt; + u8 short_retry_lmt; + u16 busy_thresh; + u8 ack_policy; + u8 mp_mode; + u8 software_encrypt; + u8 software_decrypt; + + //UAPSD + u8 wmm_enable; + u8 uapsd_enable; + u8 uapsd_max_sp; + u8 uapsd_acbk_en; + u8 uapsd_acbe_en; + u8 uapsd_acvi_en; + u8 uapsd_acvo_en; + + WLAN_BSSID_EX dev_network; + +#ifdef CONFIG_80211N_HT + u8 ht_enable; + u8 cbw40_enable; + u8 ampdu_enable;//for tx +#endif + u8 rf_config ; + u8 low_power ; + + u8 wifi_spec;// !turbo_mode + + u8 channel_plan; +#ifdef CONFIG_BT_COEXIST + u8 bt_iso; + u8 bt_sco; + u8 bt_ampdu; +#endif + BOOLEAN bAcceptAddbaReq; + + u8 antdiv_cfg; + + u8 usbss_enable;//0:disable,1:enable + u8 hwpdn_mode;//0:disable,1:enable,2:deside by EFUSE config + u8 hwpwrp_detect;//0:disable,1:enable + + u8 hw_wps_pbc;//0:disable,1:enable + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + char adaptor_info_caching_file_path[PATH_LENGTH_MAX]; +#endif + +#ifdef CONFIG_LAYER2_ROAMING + u8 max_roaming_times; // the max number driver will try to roaming +#endif +}; + + +//For registry parameters +#define RGTRY_OFT(field) ((ULONG)FIELD_OFFSET(struct registry_priv,field)) +#define RGTRY_SZ(field) sizeof(((struct registry_priv*) 0)->field) +#define BSSID_OFT(field) ((ULONG)FIELD_OFFSET(WLAN_BSSID_EX,field)) +#define BSSID_SZ(field) sizeof(((PWLAN_BSSID_EX) 0)->field) + +#define MAX_CONTINUAL_URB_ERR 4 + +struct dvobj_priv { + + _adapter * padapter; + + //For 92D, DMDP have 2 interface. + u8 InterfaceNumber; + u8 NumInterfaces; + +/*-------- below is for SDIO INTERFACE --------*/ + +#ifdef CONFIG_SDIO_HCI + +#ifdef PLATFORM_OS_XP + PDEVICE_OBJECT pphysdevobj;//pPhysDevObj; + PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj; + PDEVICE_OBJECT pnextdevobj;//pNextDevObj; + SDBUS_INTERFACE_STANDARD sdbusinft;//SdBusInterface; + u8 nextdevstacksz;//unsigned char NextDeviceStackSize; +#endif//PLATFORM_OS_XP + +#ifdef PLATFORM_OS_CE + SD_DEVICE_HANDLE hDevice; + SD_CARD_RCA sd_rca; + SD_CARD_INTERFACE card_intf; + BOOLEAN enableIsarWithStatus; + WCHAR active_path[MAX_ACTIVE_REG_PATH]; + SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; +#endif//PLATFORM_OS_CE + +#ifdef PLATFORM_LINUX + struct sdio_func *func; +#endif//PLATFORM_LINUX + + u8 func_number;//unsigned char FunctionNumber; + u32 block_transfer_len;//unsigned long BLOCK_TRANSFER_LEN; + u32 blk_shiftbits; + u16 driver_version; + u16 rxblknum; + u16 rxblknum_rd; + u16 c2hblknum; + u8 tx_block_mode; + u8 rx_block_mode; + u8 cmdfifo_cnt; + u8 rxfifo_cnt; + u16 sdio_hisr; + u16 sdio_himr; +#endif// CONFIG_SDIO_HCI + +/*-------- below is for USB INTERFACE --------*/ + +#ifdef CONFIG_USB_HCI + + u8 nr_endpoint; + u8 ishighspeed; + u8 RtNumInPipes; + u8 RtNumOutPipes; + int ep_num[5]; //endpoint number + + int RegUsbSS; + + _sema usb_suspend_sema; +#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC + _mutex usb_vendor_req_mutex; + u8 * usb_alloc_vendor_req_buf; + u8 * usb_vendor_req_buf; +#endif +#ifdef PLATFORM_WINDOWS + //related device objects + PDEVICE_OBJECT pphysdevobj;//pPhysDevObj; + PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj; + PDEVICE_OBJECT pnextdevobj;//pNextDevObj; + + u8 nextdevstacksz;//unsigned char NextDeviceStackSize; //= (CHAR)CEdevice->pUsbDevObj->StackSize + 1; + + //urb for control diescriptor request + +#ifdef PLATFORM_OS_XP + struct _URB_CONTROL_DESCRIPTOR_REQUEST descriptor_urb; + PUSB_CONFIGURATION_DESCRIPTOR pconfig_descriptor;//UsbConfigurationDescriptor; +#endif + +#ifdef PLATFORM_OS_CE + WCHAR active_path[MAX_ACTIVE_REG_PATH]; // adapter regpath + USB_EXTENSION usb_extension; + + _nic_hdl pipehdls_r8192c[0x10]; +#endif + + u32 config_descriptor_len;//ULONG UsbConfigurationDescriptorLength; +#endif//PLATFORM_WINDOWS + +#ifdef PLATFORM_LINUX + struct usb_interface *pusbintf; + struct usb_device *pusbdev; +#endif//PLATFORM_LINUX + + ATOMIC_T continual_urb_error; +#endif//CONFIG_USB_HCI + +/*-------- below is for PCIE INTERFACE --------*/ + +#ifdef CONFIG_PCI_HCI + +#ifdef PLATFORM_LINUX + struct pci_dev *ppcidev; + + //PCI MEM map + unsigned long pci_mem_end; /* shared mem end */ + unsigned long pci_mem_start; /* shared mem start */ + + //PCI IO map + unsigned long pci_base_addr; /* device I/O address */ + + //PciBridge + struct pci_priv pcipriv; + + u16 irqline; + u8 irq_enabled; + u8 irq_alloc; + RT_ISR_CONTENT isr_content; + _lock irq_th_lock; + + //ASPM + u8 const_pci_aspm; + u8 const_amdpci_aspm; + u8 const_hwsw_rfoff_d3; + u8 const_support_pciaspm; + // pci-e bridge */ + u8 const_hostpci_aspm_setting; + // pci-e device */ + u8 const_devicepci_aspm_setting; + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. + u8 b_support_backdoor; +#endif//PLATFORM_LINUX + +#endif//CONFIG_PCI_HCI +}; + +typedef enum _DRIVER_STATE{ + DRIVER_NORMAL = 0, + DRIVER_DISAPPEAR = 1, + DRIVER_REPLACE_DONGLE = 2, +}DRIVER_STATE; + +struct _ADAPTER{ + int DriverState;// for disable driver using module, use dongle to replace module. + int pid[3];//process id from UI, 0:wpa_supplicant, 1:hostapd, 2:dhcpcd + int bDongle;//build-in module or external dongle + u16 chip_type; + u16 HardwareType; + u16 interface_type;//USB,SDIO,PCI + + struct dvobj_priv dvobjpriv; + struct mlme_priv mlmepriv; + struct mlme_ext_priv mlmeextpriv; + struct cmd_priv cmdpriv; + struct evt_priv evtpriv; + //struct io_queue *pio_queue; + struct io_priv iopriv; + struct xmit_priv xmitpriv; + struct recv_priv recvpriv; + struct sta_priv stapriv; + struct security_priv securitypriv; + struct registry_priv registrypriv; + struct wlan_acl_pool acl_list; + struct pwrctrl_priv pwrctrlpriv; + struct eeprom_priv eeprompriv; + struct led_priv ledpriv; + +#ifdef CONFIG_DRVEXT_MODULE + struct drvext_priv drvextpriv; +#endif + +#ifdef CONFIG_AP_MODE + struct hostapd_priv *phostapdpriv; +#endif + +#ifdef CONFIG_P2P + struct wifidirect_info wdinfo; +#endif //CONFIG_P2P + + PVOID HalData; + struct hal_ops HalFunc; + +#ifdef CONFIG_BT_COEXIST + //struct btcoexist_priv bt_coexist; +#endif + s32 bDriverStopped; + s32 bSurpriseRemoved; + s32 bCardDisableWOHSM; + + u32 IsrContent; + u32 ImrContent; + + u8 EepromAddressSize; + u8 hw_init_completed; + u8 init_adpt_in_progress; + u8 bfirst_init; + + _thread_hdl_ cmdThread; + _thread_hdl_ evtThread; + _thread_hdl_ xmitThread; + _thread_hdl_ recvThread; + + + NDIS_STATUS (*dvobj_init)(_adapter * adapter); + void (*dvobj_deinit)(_adapter * adapter); + + void (*intf_start)(_adapter * adapter); + void (*intf_stop)(_adapter * adapter); + +#ifdef PLATFORM_LINUX + _nic_hdl pnetdev; + _nic_hdl old_pnetdev; // used for rtw_change_ifname + int bup; + struct net_device_stats stats; + struct iw_statistics iwstats; + struct proc_dir_entry *dir_dev;// for proc directory +#endif //end of PLATFORM_LINUX + + int net_closed; + + u8 bFWReady; + u8 bReadPortCancel; + u8 bWritePortCancel; + u8 bRxRSSIDisplay; +#ifdef CONFIG_AUTOSUSPEND + u8 bDisableAutosuspend; +#endif +}; + +__inline static u8 *myid(struct eeprom_priv *peepriv) +{ + return (peepriv->mac_addr); +} + + +#endif //__DRV_TYPES_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_ce.h b/drivers/net/wireless/rtl8192c/include/drv_types_ce.h new file mode 100755 index 000000000000..be0459dcb219 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types_ce.h @@ -0,0 +1,92 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_CE_H__ +#define __DRV_TYPES_CE_H__ + +#include +#include + +#include + +#define MAX_ACTIVE_REG_PATH 256 + +#define MAX_MCAST_LIST_NUM 32 + + + +//for ioctl +#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer) + +#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h +#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h +#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h + +typedef struct _MP_REG_ENTRY +{ + + NDIS_STRING RegName; // variable name text + BOOLEAN bRequired; // 1 -> required, 0 -> optional + + u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString + uint FieldOffset; // offset to MP_ADAPTER field + uint FieldSize; // size (in bytes) of the field + +#ifdef UNDER_AMD64 + u64 Default; +#else + u32 Default; // default value to use +#endif + + u32 Min; // minimum value allowed + u32 Max; // maximum value allowed +} MP_REG_ENTRY, *PMP_REG_ENTRY; + +#ifdef CONFIG_USB_HCI +typedef struct _USB_EXTENSION { + LPCUSB_FUNCS _lpUsbFuncs; + USB_HANDLE _hDevice; + PVOID pAdapter; + +#if 0 + USB_ENDPOINT_DESCRIPTOR _endpACLIn; + USB_ENDPOINT_DESCRIPTOR _endpACLOutHigh; + USB_ENDPOINT_DESCRIPTOR _endpACLOutNormal; + + USB_PIPE pPipeIn; + USB_PIPE pPipeOutNormal; + USB_PIPE pPipeOutHigh; +#endif + +} USB_EXTENSION, *PUSB_EXTENSION; +#endif + + +typedef struct _OCTET_STRING{ + u8 *Octet; + u16 Length; +} OCTET_STRING, *POCTET_STRING; + + + + + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_linux.h b/drivers/net/wireless/rtl8192c/include/drv_types_linux.h new file mode 100755 index 000000000000..db1c585690ff --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types_linux.h @@ -0,0 +1,25 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_LINUX_H__ +#define __DRV_TYPES_LINUX_H__ + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_xp.h b/drivers/net/wireless/rtl8192c/include/drv_types_xp.h new file mode 100755 index 000000000000..2d51b1db13b0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types_xp.h @@ -0,0 +1,95 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_XP_H__ +#define __DRV_TYPES_XP_H__ + +#include +#include + + + +#define MAX_MCAST_LIST_NUM 32 + + + +//for ioctl +#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer) + +#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h +#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h +#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h + + +#undef ON_VISTA +//added by Jackson +#ifndef ON_VISTA +// +// Bus driver versions +// + +#define SDBUS_DRIVER_VERSION_1 0x100 +#define SDBUS_DRIVER_VERSION_2 0x200 + +#define SDP_FUNCTION_TYPE 4 +#define SDP_BUS_DRIVER_VERSION 5 +#define SDP_BUS_WIDTH 6 +#define SDP_BUS_CLOCK 7 +#define SDP_BUS_INTERFACE_CONTROL 8 +#define SDP_HOST_BLOCK_LENGTH 9 +#define SDP_FUNCTION_BLOCK_LENGTH 10 +#define SDP_FN0_BLOCK_LENGTH 11 +#define SDP_FUNCTION_INT_ENABLE 12 +#endif + + +typedef struct _MP_REG_ENTRY +{ + + NDIS_STRING RegName; // variable name text + BOOLEAN bRequired; // 1 -> required, 0 -> optional + + u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString + uint FieldOffset; // offset to MP_ADAPTER field + uint FieldSize; // size (in bytes) of the field + +#ifdef UNDER_AMD64 + u64 Default; +#else + u32 Default; // default value to use +#endif + + u32 Min; // minimum value allowed + u32 Max; // maximum value allowed +} MP_REG_ENTRY, *PMP_REG_ENTRY; + + +typedef struct _OCTET_STRING{ + u8 *Octet; + u16 Length; +} OCTET_STRING, *POCTET_STRING; + + + + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/ethernet.h b/drivers/net/wireless/rtl8192c/include/ethernet.h new file mode 100755 index 000000000000..36e29c060d3f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ethernet.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*! \file */ +#ifndef __INC_ETHERNET_H +#define __INC_ETHERNET_H + +#define ETHERNET_ADDRESS_LENGTH 6 //!< Ethernet Address Length +#define ETHERNET_HEADER_SIZE 14 //!< Ethernet Header Length +#define LLC_HEADER_SIZE 6 //!< LLC Header Length +#define TYPE_LENGTH_FIELD_SIZE 2 //!< Type/Length Size +#define MINIMUM_ETHERNET_PACKET_SIZE 60 //!< Minimum Ethernet Packet Size +#define MAXIMUM_ETHERNET_PACKET_SIZE 1514 //!< Maximum Ethernet Packet Size + +#define RT_ETH_IS_MULTICAST(_pAddr) ((((UCHAR *)(_pAddr))[0]&0x01)!=0) //!< Is Multicast Address? +#define RT_ETH_IS_BROADCAST(_pAddr) ( \ + ((UCHAR *)(_pAddr))[0]==0xff && \ + ((UCHAR *)(_pAddr))[1]==0xff && \ + ((UCHAR *)(_pAddr))[2]==0xff && \ + ((UCHAR *)(_pAddr))[3]==0xff && \ + ((UCHAR *)(_pAddr))[4]==0xff && \ + ((UCHAR *)(_pAddr))[5]==0xff ) //!< Is Broadcast Address? + + +#endif // #ifndef __INC_ETHERNET_H diff --git a/drivers/net/wireless/rtl8192c/include/farray.h b/drivers/net/wireless/rtl8192c/include/farray.h new file mode 100755 index 000000000000..79d2a4284598 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/farray.h @@ -0,0 +1,31480 @@ +unsigned char f_array[125912] = { +0x12,0x87,0x09,0x10, +0x30,0x00,0x00,0x00, +0x08,0xF8,0x00,0x00, +0x50,0xF3,0x00,0x00, +0x30,0x00,0x00,0x00, +0xB8,0xF1,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x27,0x17,0x41, +0x87,0x12,0x12,0x01, +0x00,0x00,0x12,0x06, +0x00,0x00,0x00,0x00, +0x00,0x07,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x01,0x01,0x00,0x01, +0x01,0x01,0x00,0x00, +0x01,0x00,0x01,0x00, +0x00,0x00,0x01,0x01, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x7F,0x00,0x00,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x00,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x1A,0x3C, +0x80,0x03,0x5A,0x37, +0x00,0x80,0x1B,0x3C, +0x80,0x00,0x7B,0x37, +0x00,0x00,0x5B,0xAF, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x37, +0x00,0x80,0x1B,0x3C, +0x80,0x00,0x7B,0x37, +0x00,0x00,0x5B,0xAF, +0x01,0x80,0x1A,0x3C, +0x90,0xEE,0x5A,0x27, +0x08,0x00,0x40,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x04,0x00,0xA1,0xAF, +0x08,0x00,0xA2,0xAF, +0x0C,0x00,0xA3,0xAF, +0x10,0x00,0xA4,0xAF, +0x14,0x00,0xA5,0xAF, +0x18,0x00,0xA6,0xAF, +0x1C,0x00,0xA7,0xAF, +0x20,0x00,0xA8,0xAF, +0x24,0x00,0xA9,0xAF, +0x28,0x00,0xAA,0xAF, +0x2C,0x00,0xAB,0xAF, +0x30,0x00,0xAC,0xAF, +0x34,0x00,0xAD,0xAF, +0x38,0x00,0xAE,0xAF, +0x3C,0x00,0xAF,0xAF, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x70,0x0A,0x40, +0x40,0x00,0xB0,0xAF, +0x44,0x00,0xB1,0xAF, +0x48,0x00,0xB2,0xAF, +0x4C,0x00,0xB3,0xAF, +0x50,0x00,0xB4,0xAF, +0x54,0x00,0xB5,0xAF, +0x58,0x00,0xB6,0xAF, +0x5C,0x00,0xB7,0xAF, +0x60,0x00,0xB8,0xAF, +0x64,0x00,0xB9,0xAF, +0x68,0x00,0xBC,0xAF, +0x6C,0x00,0xBD,0xAF, +0x70,0x00,0xBE,0xAF, +0x74,0x00,0xBF,0xAF, +0x78,0x00,0xA8,0xAF, +0x7C,0x00,0xA9,0xAF, +0x80,0x00,0xAA,0xAF, +0x32,0x3B,0x00,0x08, +0x21,0x20,0xA0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0x00,0x80,0x02,0x3C, +0xE0,0xFF,0xBD,0x27, +0x18,0x03,0xA3,0x34, +0x00,0x03,0x42,0x24, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x42,0xB0,0x02,0x3C, +0x03,0x00,0x46,0x34, +0x00,0x00,0xC3,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x70,0x30, +0x10,0x00,0x02,0x32, +0x18,0x00,0x40,0x10, +0x02,0x80,0x11,0x3C, +0x30,0x1F,0x27,0x26, +0x78,0x36,0xE4,0x94, +0x10,0x00,0x02,0x24, +0x00,0x00,0xC2,0xA0, +0x08,0x00,0x80,0x10, +0x1C,0x03,0xA3,0x34, +0x7C,0x36,0xE2,0x94, +0xB0,0x03,0xA4,0x34, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x80,0xAC, +0x78,0x36,0xE0,0xA4, +0x7C,0x36,0xE0,0xA4, +0x00,0x00,0x04,0x24, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x06,0x3C, +0x14,0x5E,0xA2,0x8C, +0x18,0x5F,0xC3,0x8C, +0x01,0x00,0x84,0x24, +0x01,0x00,0x42,0x24, +0x01,0x00,0x63,0x24, +0x78,0x36,0xE4,0xA4, +0x14,0x5E,0xA2,0xAC, +0x18,0x5F,0xC3,0xAC, +0x00,0x16,0x10,0x00, +0x03,0x16,0x02,0x00, +0x7B,0x00,0x40,0x04, +0x42,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x40,0x00,0x02,0x32, +0x16,0x00,0x40,0x10, +0x30,0x1F,0x24,0x26, +0x42,0xB0,0x0B,0x3C, +0x03,0x00,0x62,0x35, +0x40,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x02,0x80,0x03,0x3C, +0x12,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x1A,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x12,0x5F,0x60,0xA0, +0x02,0x80,0x04,0x3C, +0x0E,0x5F,0x83,0x90, +0xFD,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0x0E,0x5F,0x83,0xA0, +0x0E,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0x5D,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x24,0x26, +0xE0,0x1B,0x83,0x94, +0xDC,0x1B,0x85,0x94, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x80,0x00,0x63,0x30, +0x41,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0x08,0x00,0x42,0x34, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA4, +0x08,0x00,0xE0,0x03, +0xDC,0x1B,0x83,0xA4, +0xFA,0x5E,0x82,0x90, +0x02,0x80,0x05,0x3C, +0x01,0x00,0x42,0x24, +0xFA,0x5E,0x82,0xA0, +0x0E,0x5F,0xA3,0x90, +0xEF,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0x0E,0x5F,0xA3,0xA0, +0xFA,0x5E,0x82,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x2C, +0x32,0x00,0x40,0x10, +0x30,0x1F,0x23,0x26, +0x25,0xB0,0x06,0x3C, +0x84,0x00,0xC4,0x34, +0x80,0x00,0xC6,0x34, +0x00,0x00,0x82,0x8C, +0x00,0x00,0xC4,0x8C, +0x02,0x80,0x08,0x3C, +0x21,0x10,0x00,0x00, +0x1C,0x5F,0x06,0x8D, +0x25,0x10,0x44,0x00, +0x02,0x80,0x04,0x3C, +0x20,0x5F,0x88,0x8C, +0x24,0x5F,0x89,0x8C, +0x00,0x00,0x65,0x91, +0x21,0x10,0x46,0x00, +0xFB,0xFF,0x04,0x24, +0x24,0x28,0xA4,0x00, +0x23,0x40,0x02,0x01, +0x00,0x00,0x65,0xA1, +0x04,0x00,0x00,0x11, +0x01,0x00,0x06,0x24, +0x80,0x10,0x08,0x00, +0x21,0x10,0x48,0x00, +0x80,0x30,0x02,0x00, +0x01,0x00,0x04,0x24, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x04,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x30,0x1F,0x24,0x26, +0xE0,0x1B,0x83,0x94, +0xDC,0x1B,0x85,0x94, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x80,0x00,0x63,0x30, +0x41,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0x08,0x00,0x42,0x34, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA4, +0x08,0x00,0xE0,0x03, +0xDC,0x1B,0x83,0xA4, +0xB0,0x1B,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x16,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0xAB,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA0, +0x0B,0x01,0x00,0x08, +0x30,0x1F,0x24,0x26, +0x0C,0x5F,0x40,0xA0, +0x44,0x01,0x00,0x08, +0x02,0x80,0x03,0x3C, +0x80,0xFF,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x9E,0x25,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0x00,0x00,0x08, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x40,0xA0, +0x0B,0x01,0x00,0x08, +0x30,0x1F,0x24,0x26, +0xFF,0x00,0x84,0x30, +0x0B,0x00,0x82,0x2C, +0xFF,0xFF,0xE7,0x30, +0x10,0x00,0xA8,0x93, +0x19,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0xD8,0xE9,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x43,0xB0,0x02,0x3C, +0x78,0x00,0x44,0x34, +0x07,0x00,0xE2,0x30, +0x00,0x00,0x85,0xAC, +0x04,0x00,0x86,0xAC, +0x04,0x00,0x40,0x18, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0xE2,0x30, +0x08,0x00,0x42,0x24, +0xFF,0xFF,0x47,0x30, +0x21,0x10,0xE8,0x00, +0x00,0x80,0x03,0x3C, +0x08,0x00,0x82,0xAC, +0x25,0x10,0x43,0x00, +0x08,0x00,0x82,0xAC, +0x01,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x6C,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x60,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x54,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x48,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x3C,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x30,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x24,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x18,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x0C,0x00,0x44,0x34, +0x83,0x01,0x00,0x08, +0x43,0xB0,0x04,0x3C, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0xC0,0x06,0x63,0x24, +0x00,0x00,0x43,0xAC, +0x01,0x00,0x05,0x24, +0x43,0xB0,0x02,0x3C, +0x04,0x28,0x85,0x00, +0x88,0x00,0x44,0x34, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0x05,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x00,0x00,0x82,0x94, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x30, +0x24,0x10,0x45,0x00, +0xF5,0xFF,0x40,0x1C, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x00,0x80,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0x18,0x03,0x03,0x35, +0x1C,0x07,0x42,0x24, +0x00,0x00,0x62,0xAC, +0x30,0x00,0xB6,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x0C,0x00,0xF2,0x84, +0x08,0x00,0xF5,0x8C, +0xFF,0x00,0xC6,0x30, +0x00,0x01,0x02,0x24, +0x23,0x10,0x46,0x00, +0xFF,0xFF,0x51,0x30, +0xD0,0x03,0x08,0x35, +0xFF,0x00,0x96,0x30, +0x00,0x00,0x12,0xAD, +0x21,0xA0,0xA0,0x00, +0x21,0x30,0xC5,0x00, +0x00,0x00,0x15,0xAD, +0x21,0x20,0xC0,0x02, +0x21,0x28,0xA0,0x02, +0x21,0x38,0x20,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x23,0x18,0x51,0x02, +0xFF,0xFF,0x82,0x32, +0x00,0x94,0x03,0x00, +0x03,0x94,0x12,0x00, +0x09,0x02,0x00,0x08, +0x02,0x9A,0x02,0x00, +0x28,0xB0,0x03,0x3C, +0xC0,0x10,0x13,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x25,0xB0,0x10,0x3C, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x93,0x30, +0x00,0x22,0x13,0x00, +0xFF,0xFF,0x43,0x32, +0x01,0x01,0x45,0x2A, +0x21,0xA0,0x82,0x00, +0x21,0xA8,0xB1,0x02, +0xD0,0x03,0x02,0x36, +0x00,0x01,0x11,0x24, +0x0B,0x88,0x65,0x00, +0x21,0x20,0xC0,0x02, +0x00,0x00,0x53,0xAC, +0xB0,0x01,0x00,0x0C, +0xB0,0x03,0x10,0x36, +0x21,0x30,0x80,0x02, +0x21,0x20,0xC0,0x02, +0x21,0x28,0xA0,0x02, +0x21,0x38,0x20,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x23,0x18,0x51,0x02, +0x00,0x94,0x03,0x00, +0x03,0x94,0x12,0x00, +0x00,0x00,0x12,0xAE, +0xE2,0xFF,0x40,0x1E, +0x00,0x00,0x00,0x00, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x1C,0x00,0xB1,0xAF, +0x04,0x00,0x8B,0x8C, +0x21,0x80,0x80,0x00, +0x08,0x00,0x84,0x8C, +0x0E,0x00,0x07,0x96, +0xFF,0xE0,0x02,0x3C, +0x10,0x00,0x08,0x8E, +0x1F,0x00,0x6A,0x31, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x82,0x00, +0x00,0x1E,0x0A,0x00, +0x25,0x48,0x83,0x00, +0x21,0x90,0xA0,0x00, +0x21,0x60,0xC0,0x00, +0x10,0x01,0x00,0x05, +0x07,0x00,0xE7,0x30, +0x00,0x00,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFD,0x0F,0x42,0x28, +0xC0,0x00,0x40,0x14, +0x02,0x80,0x11,0x3C, +0xFF,0xDF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x48,0x22,0x01, +0x1C,0x00,0x02,0x8E, +0x00,0x40,0x03,0x3C, +0x25,0x48,0x23,0x01, +0x02,0x80,0x11,0x3C, +0xC5,0x00,0x40,0x04, +0x08,0x00,0x09,0xAE, +0xC0,0x30,0x0A,0x00, +0x21,0x10,0xCA,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x4A,0x00, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x27,0x26, +0x21,0x28,0x47,0x00, +0x1C,0x24,0xA3,0x8C, +0x01,0x00,0x0A,0x24, +0x02,0x13,0x03,0x00, +0x01,0x00,0x42,0x30, +0xDB,0x00,0x4A,0x10, +0x42,0x18,0x03,0x00, +0x82,0x11,0x09,0x00, +0x01,0x00,0x42,0x30, +0x06,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xC0,0xFF,0x02,0x24, +0x24,0x10,0x22,0x01, +0x04,0x00,0x49,0x34, +0x08,0x00,0x09,0xAE, +0x02,0x80,0x02,0x3C, +0xE9,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x6C,0x00,0x60,0x14, +0x21,0x28,0xC7,0x00, +0xE8,0x22,0xA4,0x8C, +0x10,0x00,0x02,0x8E, +0xBF,0xFF,0x03,0x24, +0x40,0x00,0x84,0x30, +0x24,0x10,0x43,0x00, +0x25,0x40,0x44,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0xA3,0x8C, +0x7F,0xF8,0x02,0x24, +0x24,0x10,0x02,0x01, +0x80,0x07,0x63,0x30, +0x42,0x27,0x09,0x00, +0x25,0x40,0x43,0x00, +0x01,0x00,0x84,0x30, +0xE1,0x00,0x8A,0x10, +0x10,0x00,0x08,0xAE, +0x30,0x1F,0x24,0x26, +0x21,0x20,0xC4,0x00, +0xE8,0x22,0x83,0x8C, +0xFF,0xF7,0x02,0x24, +0x24,0x10,0x02,0x01, +0x00,0x08,0x63,0x30, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0x83,0x8C, +0xFF,0xEF,0x02,0x24, +0x24,0x10,0x02,0x01, +0x00,0x10,0x63,0x30, +0x30,0x1F,0x25,0x26, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0x21,0x30,0xC5,0x00, +0xE8,0x22,0xC4,0x8C, +0xFD,0xFF,0x02,0x3C, +0x02,0x00,0x03,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x83,0x00, +0x24,0x10,0x02,0x01, +0x25,0x40,0x44,0x00, +0x10,0x00,0x08,0xAE, +0xB0,0x1B,0xA3,0x94, +0xFB,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC2,0x1B,0x03,0x00, +0x24,0x10,0x02,0x01, +0x80,0x1C,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0x8F,0x3E,0xA3,0x90, +0xE7,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x03,0x00,0x63,0x30, +0x24,0x10,0x02,0x01, +0xC0,0x1C,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0xC4,0x8C, +0xFF,0xFD,0x02,0x3C, +0x00,0x02,0x03,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x83,0x00, +0x24,0x10,0x02,0x01, +0x25,0x40,0x44,0x00, +0x10,0x00,0x08,0xAE, +0xB0,0x1B,0xA3,0x94, +0xFF,0xFB,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC2,0x1B,0x03,0x00, +0x24,0x10,0x02,0x01, +0x80,0x1E,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0x8F,0x3E,0xA3,0x90, +0xFF,0xE7,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x03,0x00,0x63,0x30, +0x24,0x10,0x02,0x01, +0xC0,0x1E,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0xC3,0x8C, +0xC0,0xFF,0x02,0x24, +0x24,0x10,0x02,0x01, +0x3F,0x00,0x63,0x30, +0x25,0x10,0x43,0x00, +0x10,0x00,0x02,0xAE, +0xEC,0x22,0xC5,0x8C, +0x14,0x00,0x03,0x8E, +0xFF,0xFF,0x04,0x3C, +0xFF,0x7F,0x84,0x34, +0x24,0x18,0x64,0x00, +0x00,0x80,0xA5,0x30, +0x25,0x18,0x65,0x00, +0x14,0x00,0x03,0xAE, +0xEC,0x22,0xC2,0x8C, +0x24,0x18,0x64,0x00, +0x00,0x80,0x42,0x30, +0x25,0x18,0x62,0x00, +0x14,0x00,0x03,0xAE, +0xEE,0x22,0xC4,0x94, +0xE0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x1F,0x00,0x84,0x30, +0x24,0x18,0x62,0x00, +0x00,0x24,0x04,0x00, +0x25,0x18,0x64,0x00, +0x14,0x00,0x03,0xAE, +0x02,0x00,0x02,0x92, +0x02,0x24,0x0B,0x00, +0x02,0x80,0x03,0x3C, +0x21,0x10,0x4C,0x00, +0xFF,0xFF,0x42,0x30, +0x01,0x00,0x84,0x30, +0x6A,0x00,0x80,0x10, +0x25,0x30,0x43,0x00, +0x30,0x1F,0x23,0x26, +0xF8,0x1D,0x62,0x94, +0x00,0x00,0x00,0x00, +0xFF,0x0F,0x45,0x30, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x62,0xA4, +0x0C,0x00,0x03,0x8E, +0x00,0xF0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x00,0x24,0x05,0x00, +0x24,0x18,0x62,0x00, +0x25,0x18,0x64,0x00, +0x0C,0x00,0x03,0xAE, +0x16,0x00,0xC2,0x94, +0x00,0x19,0x05,0x00, +0x02,0x00,0x04,0x24, +0x0F,0x00,0x42,0x30, +0x25,0x10,0x43,0x00, +0x16,0x00,0xC2,0xA4, +0x21,0x28,0x80,0x01, +0x21,0x30,0x40,0x02, +0x80,0x00,0x07,0x24, +0x01,0x00,0x02,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x52,0xAC, +0xB0,0x01,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x30,0x1F,0x24,0x26, +0x00,0x00,0x03,0x96, +0x94,0x3E,0x82,0x8C, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x43,0x00, +0x28,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x94,0x3E,0x82,0xAC, +0x08,0x00,0x09,0xAE, +0x30,0x1F,0x22,0x26, +0x1A,0x3E,0x43,0x90, +0xFF,0xDF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x07,0x18,0xE3,0x00, +0x01,0x00,0x63,0x30, +0x24,0x10,0x22,0x01, +0x40,0x1F,0x03,0x00, +0x25,0x48,0x43,0x00, +0x1C,0x00,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x3D,0xFF,0x41,0x04, +0x08,0x00,0x09,0xAE, +0x1E,0x00,0x02,0x92, +0x04,0x00,0x03,0x24, +0x21,0x30,0x50,0x00, +0x00,0x00,0xC4,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x82,0x30, +0x02,0x29,0x02,0x00, +0x50,0x00,0xA3,0x10, +0x06,0x00,0x02,0x24, +0x32,0xFF,0xA2,0x14, +0x00,0x00,0x00,0x00, +0x1A,0x00,0x02,0x96, +0x00,0x00,0x00,0x00, +0x39,0x00,0xC2,0xA0, +0x1E,0x00,0x03,0x92, +0x1A,0x00,0x02,0x96, +0x21,0x18,0x70,0x00, +0x03,0x12,0x02,0x00, +0x38,0x00,0x62,0xA0, +0x04,0x00,0x0B,0x8E, +0x08,0x00,0x09,0x8E, +0xC0,0x30,0x0A,0x00, +0x21,0x10,0xCA,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x4A,0x00, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x27,0x26, +0x21,0x28,0x47,0x00, +0x1C,0x24,0xA3,0x8C, +0x01,0x00,0x0A,0x24, +0x02,0x13,0x03,0x00, +0x01,0x00,0x42,0x30, +0x29,0xFF,0x4A,0x14, +0x82,0x11,0x09,0x00, +0x42,0x18,0x03,0x00, +0x7F,0xFF,0x02,0x24, +0x24,0x10,0x22,0x01, +0x80,0x00,0x63,0x30, +0x25,0x48,0x43,0x00, +0x08,0x00,0x09,0xAE, +0x1C,0x24,0xA3,0x8C, +0x10,0x00,0x04,0x8E, +0xFF,0xFF,0x02,0x3C, +0x07,0x00,0x63,0x30, +0xFF,0x1F,0x42,0x34, +0x24,0x20,0x82,0x00, +0x40,0x1B,0x03,0x00, +0x25,0x40,0x83,0x00, +0x44,0x02,0x00,0x08, +0x10,0x00,0x08,0xAE, +0x0E,0x00,0x02,0x96, +0x30,0x1F,0x23,0x26, +0x07,0x00,0x42,0x30, +0x40,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0xE8,0x1D,0x44,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x83,0x24, +0xFF,0x0F,0x85,0x30, +0xCA,0x02,0x00,0x08, +0xE8,0x1D,0x43,0xA4, +0x14,0x00,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x42,0x12,0x02,0x00, +0x3F,0x00,0x42,0x30, +0x0C,0x00,0x42,0x28, +0xF1,0xFE,0x40,0x14, +0xFF,0xDF,0x02,0x3C, +0x29,0x02,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x1D,0xFF,0x64,0x14, +0x30,0x1F,0x24,0x26, +0x90,0x3E,0xE2,0x90, +0xFF,0xF7,0x03,0x24, +0x24,0x18,0x03,0x01, +0x01,0x00,0x42,0x30, +0xC0,0x12,0x02,0x00, +0x25,0x40,0x62,0x00, +0x10,0x00,0x08,0xAE, +0x91,0x3E,0xE2,0x90, +0xFF,0xEF,0x03,0x24, +0x24,0x18,0x03,0x01, +0x01,0x00,0x42,0x30, +0x6D,0x02,0x00,0x08, +0x00,0x13,0x02,0x00, +0x1A,0x00,0x05,0x96, +0x0F,0x00,0x84,0x30, +0x80,0x20,0x04,0x00, +0x21,0x18,0xC4,0x00, +0x11,0x00,0x65,0xA0, +0x1E,0x00,0x02,0x92, +0x1A,0x00,0x03,0x96, +0x21,0x10,0x50,0x00, +0x21,0x10,0x44,0x00, +0x03,0x1A,0x03,0x00, +0x10,0x00,0x43,0xA0, +0x04,0x00,0x0B,0x8E, +0x08,0x00,0x09,0x8E, +0x11,0x03,0x00,0x08, +0xC0,0x30,0x0A,0x00, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x88,0x0D,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x00,0x80,0x02,0x3C, +0xC0,0xFF,0xBD,0x27, +0x18,0x03,0x83,0x34, +0xA4,0x0D,0x42,0x24, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0xB0,0x03,0x9E,0x34, +0x98,0x03,0x00,0x08, +0x30,0x1F,0x55,0x24, +0x08,0x00,0x04,0xAE, +0x14,0x37,0x46,0x8E, +0x21,0x28,0x60,0x02, +0x80,0x00,0x07,0x24, +0x01,0x00,0x04,0x24, +0x01,0x00,0x14,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB4,0xAF, +0x14,0x37,0x43,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x00,0xC3,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0x1C,0x42,0x92, +0x00,0x00,0x00,0x00, +0x5F,0x00,0x40,0x10, +0x2A,0xB0,0x02,0x3C, +0x09,0x00,0x42,0x34, +0x02,0x00,0x03,0x24, +0x00,0x00,0x54,0xA0, +0x00,0x00,0x43,0xA0, +0xFF,0x00,0x03,0x24, +0x74,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0x10,0x37,0xA2,0x8E, +0x7C,0x37,0xB3,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x00,0xC2,0xAF, +0x14,0x37,0xA2,0xAE, +0x00,0x00,0xD3,0xAF, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x7C,0x37,0xA4,0x8E, +0x80,0x37,0xA3,0x8E, +0x02,0x80,0x02,0x3C, +0x04,0xEA,0x42,0x24, +0x00,0x00,0x52,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x7C,0x37,0xA3,0xAE, +0x02,0x80,0x03,0x3C, +0x08,0xEA,0x63,0x24, +0x7C,0x37,0x42,0x8E, +0x00,0x00,0x76,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xAE, +0x02,0x80,0x17,0x3C, +0xFF,0xFF,0x62,0x32, +0x25,0x80,0x57,0x00, +0x00,0x00,0xD0,0xAE, +0x0C,0x00,0x02,0x92, +0x21,0x28,0x00,0x00, +0x00,0x00,0xC2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x93,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x97,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0x01,0x00,0x04,0x24, +0x00,0x1A,0x11,0x00, +0x21,0x18,0x62,0x00, +0xFF,0x00,0x02,0x24, +0x21,0x30,0x60,0x00, +0x06,0x00,0x22,0x12, +0x80,0x00,0x07,0x24, +0x7C,0x37,0x45,0x8E, +0x10,0x37,0x43,0xAE, +0xB4,0x36,0x51,0xA2, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x04,0x00,0x04,0x8E, +0x08,0x00,0x03,0x8E, +0xFF,0xE0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x1F,0x00,0x84,0x30, +0x24,0x18,0x62,0x00, +0x00,0x26,0x04,0x00, +0xFF,0xDF,0x02,0x3C, +0x25,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x40,0x04,0x3C, +0x25,0x18,0x64,0x00, +0xC0,0xFF,0x05,0x24, +0x82,0x11,0x03,0x00, +0x24,0x20,0x65,0x00, +0x01,0x00,0x42,0x30, +0xA3,0xFF,0x40,0x10, +0x04,0x00,0x84,0x34, +0x08,0x00,0x03,0xAE, +0x14,0x37,0x46,0x8E, +0x21,0x28,0x60,0x02, +0x80,0x00,0x07,0x24, +0x01,0x00,0x04,0x24, +0x01,0x00,0x14,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB4,0xAF, +0x14,0x37,0x43,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x00,0xC3,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0x1C,0x42,0x92, +0x00,0x00,0x00,0x00, +0xA3,0xFF,0x40,0x14, +0x2A,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x2A,0x1C,0x54,0xA2, +0x02,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x21,0x10,0x53,0x00, +0xFF,0xFF,0x42,0x30, +0x25,0x10,0x57,0x00, +0x02,0x00,0x43,0x94, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x64,0x30, +0x00,0xC0,0x84,0x24, +0xFF,0xFF,0x84,0x30, +0xC2,0x34,0x00,0x0C, +0x2B,0x1C,0x43,0xA2, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2A,0xB0,0x02,0x3C, +0x09,0x00,0x42,0x34, +0x02,0x00,0x03,0x24, +0x00,0x00,0x54,0xA0, +0x00,0x00,0x43,0xA0, +0xFF,0x00,0x03,0x24, +0x8E,0xFF,0x23,0x16, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0xD0,0x1B,0x43,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x38,0x63,0x34, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x83,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0x43,0xAC, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x88,0x10,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0xA4,0x10,0x63,0x24, +0x40,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0x7F,0x00,0xA2,0x30, +0xBF,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xD3,0x27, +0xB0,0x03,0x55,0x34, +0x6A,0x04,0x00,0x08, +0x02,0x80,0x16,0x3C, +0x90,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xC8,0x36,0x46,0x8C, +0x34,0x37,0x45,0x8C, +0x03,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xCC,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x0D,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xC8,0x36,0x62,0x8E, +0x34,0x37,0x72,0x8E, +0x03,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xCC,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x34,0x37,0x64,0x8E, +0x38,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x0C,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x34,0x37,0x63,0xAE, +0x34,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x01,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xC8,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x4C,0x04,0x00,0x08, +0x8C,0x36,0x51,0xA0, +0x21,0x00,0xE0,0x12, +0x40,0x00,0xE4,0x34, +0x90,0x36,0x83,0x92, +0x41,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA4,0x8C, +0x01,0x00,0x02,0x3C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x80,0x42,0x34, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x8C,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA4,0x8C, +0x01,0x00,0x02,0x3C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x80,0x42,0x34, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x64,0x13,0x63,0x24, +0x10,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0xDF,0x00,0xA2,0x30, +0xEF,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0xCC,0x5E,0xC3,0x90, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x30,0x1F,0xD3,0x27, +0x21,0xA8,0x40,0x00, +0x1E,0x05,0x00,0x08, +0x02,0x80,0x16,0x3C, +0x98,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xD4,0x36,0x46,0x8C, +0x40,0x37,0x45,0x8C, +0x04,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xD8,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x15,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xD4,0x36,0x62,0x8E, +0x40,0x37,0x72,0x8E, +0x04,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xD8,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x40,0x37,0x64,0x8E, +0x44,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x10,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x40,0x37,0x63,0xAE, +0x40,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x02,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xD4,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x00,0x05,0x00,0x08, +0x94,0x36,0x51,0xA0, +0x20,0x00,0xE0,0x12, +0x42,0x00,0xE4,0x34, +0x98,0x36,0x83,0x92, +0x43,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x06,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x94,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x06,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x2C,0x16,0x63,0x24, +0x01,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0xF7,0x00,0xA2,0x30, +0xFE,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0xCC,0x5E,0xC3,0x90, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x30,0x1F,0xD3,0x27, +0x21,0xA8,0x40,0x00, +0xCF,0x05,0x00,0x08, +0x02,0x80,0x16,0x3C, +0xA8,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xE0,0x36,0x46,0x8C, +0x4C,0x37,0x45,0x8C, +0x05,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xE4,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x1D,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xE0,0x36,0x62,0x8E, +0x4C,0x37,0x72,0x8E, +0x05,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xE4,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4C,0x37,0x64,0x8E, +0x50,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x14,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x4C,0x37,0x63,0xAE, +0x4C,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x08,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xE0,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xB1,0x05,0x00,0x08, +0x9C,0x36,0x51,0xA0, +0x20,0x00,0xE0,0x12, +0x44,0x00,0xE4,0x34, +0xA8,0x36,0x83,0x92, +0x45,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x18,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x9C,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x18,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0xF0,0x18,0x63,0x24, +0x02,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0xFB,0x00,0xA2,0x30, +0xFD,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0xCC,0x5E,0xC3,0x90, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x30,0x1F,0xD3,0x27, +0x21,0xA8,0x40,0x00, +0x80,0x06,0x00,0x08, +0x02,0x80,0x16,0x3C, +0xA4,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xEC,0x36,0x46,0x8C, +0x58,0x37,0x45,0x8C, +0x06,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xF0,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x25,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xEC,0x36,0x62,0x8E, +0x58,0x37,0x72,0x8E, +0x06,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xF0,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x58,0x37,0x64,0x8E, +0x5C,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x18,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x58,0x37,0x63,0xAE, +0x58,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x04,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xEC,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x62,0x06,0x00,0x08, +0xA0,0x36,0x51,0xA0, +0x20,0x00,0xE0,0x12, +0x46,0x00,0xE4,0x34, +0xA4,0x36,0x83,0x92, +0x47,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x60,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0xA0,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x60,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xB4,0x1B,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD8,0x1B,0xA2,0x8C, +0xD0,0x1B,0xA4,0x8C, +0x00,0x08,0x03,0x3C, +0x24,0x10,0x43,0x00, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x25,0xB0,0x04,0x3C, +0x00,0x80,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0x18,0x03,0x83,0x34, +0x10,0x1C,0x42,0x24, +0x30,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x14,0x3C, +0x30,0x1F,0x93,0x26, +0xFC,0x00,0x82,0x34, +0x00,0x00,0x45,0x8C, +0xAC,0x1B,0x66,0x96, +0xD8,0x37,0x63,0x96, +0xD0,0x37,0x67,0x8E, +0x23,0x28,0xA6,0x00, +0x21,0x10,0xA3,0x00, +0x23,0x88,0x47,0x00, +0xB0,0x03,0x84,0x34, +0x23,0x30,0x23,0x02, +0x2B,0x10,0x71,0x00, +0x00,0x00,0x83,0xAC, +0x00,0x00,0x91,0xAC, +0x0B,0x88,0xC2,0x00, +0x21,0x20,0x20,0x02, +0x25,0x24,0x00,0x0C, +0xD4,0x37,0x65,0xAE, +0x4B,0x00,0x40,0x10, +0x21,0x90,0x40,0x00, +0x0C,0x00,0x51,0xAC, +0xD0,0x37,0x68,0x8E, +0xD4,0x37,0x62,0x8E, +0x08,0x00,0x45,0x8E, +0x20,0xBD,0x03,0x3C, +0x88,0x03,0x63,0x34, +0x2B,0x10,0x48,0x00, +0x40,0x10,0x15,0x3C, +0x21,0x20,0x00,0x00, +0xFF,0xFF,0x27,0x32, +0x00,0x00,0x65,0xAC, +0x28,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xAC,0x1B,0x66,0x96, +0x08,0x00,0x42,0x96, +0x40,0x10,0x05,0x3C, +0x21,0x20,0x00,0x00, +0x21,0x30,0x06,0x01, +0x25,0x28,0x45,0x00, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x02,0x3C, +0x64,0x57,0x42,0x24, +0x30,0x1F,0x84,0x26, +0xD4,0x37,0x83,0x8C, +0x04,0x00,0x45,0x8C, +0xD0,0x37,0x83,0xAC, +0x00,0x00,0x42,0xAE, +0x04,0x00,0x52,0xAC, +0x00,0x00,0xB2,0xAC, +0x04,0x00,0x45,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0x85,0x26, +0xD8,0x1B,0xA2,0x8C, +0xD0,0x1B,0xA3,0x8C, +0x30,0x00,0xBF,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x04,0x00,0x42,0x30, +0x25,0x18,0x62,0x00, +0x41,0xB0,0x04,0x3C, +0x38,0x00,0xBD,0x27, +0x00,0x00,0x83,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA3,0xAC, +0xD8,0x37,0x70,0x8E, +0x08,0x00,0x45,0x96, +0xAC,0x1B,0x66,0x96, +0x23,0x80,0x08,0x02, +0xFF,0xFF,0x10,0x32, +0x21,0x30,0x06,0x01, +0x25,0x28,0xB5,0x00, +0x21,0x38,0x00,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xB0,0x01,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x08,0x00,0x45,0x96, +0xAC,0x1B,0x62,0x96, +0x23,0x38,0x30,0x02, +0x25,0x28,0xB5,0x00, +0x21,0x10,0x06,0x3C, +0x21,0x28,0xB0,0x00, +0x21,0x30,0x46,0x00, +0xFF,0xFF,0xE7,0x30, +0x3C,0x07,0x00,0x08, +0x21,0x20,0x00,0x00, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x04,0x3C, +0xD0,0x5E,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x10,0x63,0x34, +0xD0,0x5E,0x83,0xAC, +0x00,0x60,0x82,0x40, +0x48,0x07,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x00,0x80,0x02,0x3C, +0xC0,0xFF,0xBD,0x27, +0x18,0x03,0x83,0x34, +0xFC,0x1D,0x42,0x24, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x02,0x80,0x02,0x3C, +0x2A,0xB0,0x03,0x3C, +0xB0,0x03,0x96,0x34, +0x80,0xD5,0x57,0x24, +0x2C,0x00,0x73,0x34, +0x30,0x1F,0xD1,0x27, +0x02,0x80,0x15,0x3C, +0xD1,0x07,0x00,0x08, +0x02,0x80,0x14,0x3C, +0x54,0xF3,0x90,0xAE, +0x02,0x80,0x04,0x3C, +0x03,0x00,0xC3,0x90, +0x7C,0xD5,0x82,0x90, +0x7F,0x00,0x63,0x30, +0xFF,0x00,0x42,0x30, +0x6B,0x00,0x62,0x10, +0x08,0x00,0x10,0x26, +0x02,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x37,0x00,0x42,0x28, +0x5E,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0xC5,0x90, +0x03,0x00,0xC3,0x90, +0xFF,0x00,0xA5,0x30, +0x7F,0x00,0x63,0x30, +0x7C,0xD5,0x83,0xA0, +0x02,0x00,0xC2,0x90, +0x0E,0x00,0xA5,0x38, +0x0A,0x80,0xE5,0x00, +0xFF,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x10,0x57,0x00, +0x04,0x00,0x43,0x8C, +0x02,0x80,0x04,0x3C, +0x8C,0xD7,0x84,0x24, +0x4C,0xF3,0xA3,0xAE, +0x02,0x00,0xC5,0x90, +0x2F,0x55,0x00,0x0C, +0xFF,0x00,0xA5,0x30, +0x4C,0xF3,0xA2,0x8E, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x40,0x00, +0x21,0x20,0x00,0x02, +0x01,0x00,0x02,0x24, +0x02,0x00,0x03,0x24, +0x01,0x00,0x62,0xA2, +0x01,0x00,0x63,0xA2, +0x2B,0x00,0x40,0x12, +0x00,0x00,0x00,0x00, +0xB8,0x36,0x22,0x92, +0x20,0x10,0x03,0x3C, +0x88,0x37,0x25,0x8E, +0x00,0x12,0x02,0x00, +0x21,0x10,0x43,0x00, +0x21,0x30,0x40,0x00, +0x0A,0x00,0x04,0x24, +0x00,0x01,0x07,0x24, +0x1C,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x88,0x37,0x30,0x8E, +0xB0,0x01,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0xFF,0xFF,0x10,0x32, +0x02,0x80,0x02,0x3C, +0x25,0x80,0x02,0x02, +0x0C,0x00,0x04,0x92, +0xFF,0x00,0x02,0x24, +0x21,0x38,0x00,0x02, +0xFF,0x00,0x83,0x30, +0x20,0x00,0x10,0x26, +0x04,0x00,0x62,0x10, +0x21,0x90,0x00,0x00, +0xB8,0x36,0x24,0xA2, +0x01,0x00,0x12,0x24, +0x00,0x00,0xC3,0xAE, +0x04,0x00,0xE2,0x8C, +0x13,0x00,0x03,0x24, +0x02,0x12,0x02,0x00, +0x1F,0x00,0x45,0x30, +0xB6,0xFF,0xA3,0x10, +0x21,0x30,0x00,0x02, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x38,0xD7,0x84,0x24, +0x01,0x00,0x02,0x24, +0x02,0x00,0x03,0x24, +0x01,0x00,0x62,0xA2, +0x01,0x00,0x63,0xA2, +0xD7,0xFF,0x40,0x16, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x04,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x02,0x00,0xC5,0x90, +0x02,0x80,0x04,0x3C, +0x78,0xD7,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xFF,0x00,0xA5,0x30, +0xEB,0x07,0x00,0x08, +0x01,0x00,0x02,0x24, +0x02,0x00,0xC5,0x90, +0x02,0x00,0xC6,0x90, +0x7C,0xD5,0x87,0x90, +0x02,0x80,0x04,0x3C, +0x48,0xD7,0x84,0x24, +0xFF,0x00,0xA5,0x30, +0xFF,0x00,0xC6,0x30, +0x2F,0x55,0x00,0x0C, +0xFF,0x00,0xE7,0x30, +0xC1,0x07,0x00,0x08, +0x01,0x00,0x02,0x24, +0xC8,0xFF,0xBD,0x27, +0xFF,0xFF,0xA8,0x30, +0x02,0x80,0x02,0x3C, +0x25,0x40,0x02,0x01, +0x30,0x00,0xB6,0xAF, +0x20,0x00,0xB2,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x03,0x8D, +0xFF,0xFF,0xD2,0x30, +0x21,0xB0,0xA0,0x00, +0x00,0xC0,0x02,0x24, +0x08,0x00,0x45,0x26, +0x04,0x00,0x06,0x8D, +0x24,0x18,0x62,0x00, +0xFF,0x3F,0xA5,0x30, +0xF0,0xFF,0x02,0x3C, +0x25,0x18,0x65,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x80,0x05,0x3C, +0x25,0x18,0x65,0x00, +0xFF,0x01,0xC6,0x34, +0x00,0x00,0x03,0xAD, +0x04,0x00,0x06,0xAD, +0x21,0x48,0x80,0x00, +0xFF,0xFF,0xE7,0x30, +0x18,0x00,0x12,0xA5, +0x1A,0x00,0x07,0xA1, +0x18,0x00,0x03,0x8D, +0xFF,0x7F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x02,0x80,0x15,0x3C, +0x18,0x00,0x03,0xAD, +0x30,0x1F,0xA5,0x26, +0x7A,0x36,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x24, +0x7A,0x36,0xA2,0xA0, +0x18,0x00,0x04,0x8D, +0xFF,0x80,0x02,0x3C, +0x20,0x00,0x45,0x26, +0xFF,0xFF,0x42,0x34, +0x7F,0x00,0x63,0x30, +0xFF,0xFF,0xB2,0x30, +0x24,0x20,0x82,0x00, +0x00,0x1E,0x03,0x00, +0x25,0xB0,0x02,0x3C, +0xC0,0x00,0x42,0x34, +0x25,0x20,0x83,0x00, +0x07,0x00,0x45,0x32, +0x18,0x00,0x04,0xAD, +0x00,0x00,0x52,0xA4, +0x03,0x00,0xA0,0x10, +0xFF,0xFF,0x42,0x32, +0x08,0x00,0x42,0x26, +0xFF,0xFF,0x42,0x30, +0x30,0x1F,0xB4,0x26, +0xF8,0x37,0x86,0x8E, +0xFC,0x37,0x90,0x8E, +0xF8,0xFF,0x52,0x30, +0x21,0x10,0xD2,0x00, +0x2B,0x10,0x02,0x02, +0x31,0x00,0x40,0x10, +0xFF,0x00,0x33,0x31, +0x23,0x80,0x06,0x02, +0x21,0x28,0xC0,0x02, +0xFF,0xFF,0x07,0x32, +0x01,0x00,0x11,0x24, +0x21,0x20,0x60,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB1,0xAF, +0x23,0x18,0x50,0x02, +0xFF,0xFF,0x72,0x30, +0x22,0x10,0x02,0x3C, +0x21,0x10,0x42,0x02, +0x21,0x20,0x60,0x02, +0xB0,0x01,0x00,0x0C, +0xF8,0x37,0x82,0xAE, +0x21,0x28,0xD0,0x02, +0x21,0x38,0x40,0x02, +0x21,0x20,0x60,0x02, +0x10,0x00,0xB1,0xAF, +0x22,0x10,0x06,0x3C, +0x73,0x01,0x00,0x0C, +0x30,0x1F,0xB1,0x26, +0xF8,0x37,0x23,0x8E, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x02,0x36, +0x21,0x20,0x60,0x02, +0x00,0x00,0x43,0xAC, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF8,0x37,0x25,0x8E, +0xEC,0x00,0x02,0x36, +0xBD,0x00,0x04,0x36, +0x00,0x00,0x45,0xAC, +0x00,0x00,0x83,0x90, +0xC2,0x00,0x10,0x36, +0x34,0x00,0xBF,0x8F, +0x10,0x00,0x63,0x34, +0x00,0x00,0x83,0xA0, +0x30,0x00,0xB6,0x8F, +0x00,0x00,0x05,0xA6, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x21,0x28,0xC0,0x02, +0x21,0x20,0x60,0x02, +0x21,0x38,0x40,0x02, +0x01,0x00,0x02,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xF8,0x37,0x83,0x8E, +0x30,0x1F,0xB1,0x26, +0x25,0xB0,0x10,0x3C, +0x21,0x18,0x72,0x00, +0xF8,0x37,0x83,0xAE, +0xF8,0x37,0x23,0x8E, +0xB0,0x03,0x02,0x36, +0x21,0x20,0x60,0x02, +0x00,0x00,0x43,0xAC, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF8,0x37,0x25,0x8E, +0xEC,0x00,0x02,0x36, +0xBD,0x00,0x04,0x36, +0x00,0x00,0x45,0xAC, +0x00,0x00,0x83,0x90, +0xC2,0x00,0x10,0x36, +0x34,0x00,0xBF,0x8F, +0x10,0x00,0x63,0x34, +0x00,0x00,0x83,0xA0, +0x30,0x00,0xB6,0x8F, +0x00,0x00,0x05,0xA6, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x21,0x80,0x80,0x00, +0x00,0x60,0x14,0x40, +0x01,0x00,0x81,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x14,0x00,0x83,0x8C, +0x02,0x80,0x15,0x3C, +0x16,0x00,0x02,0x24, +0x30,0x1F,0xB3,0x26, +0x21,0x28,0x00,0x00, +0x1D,0x00,0x62,0x10, +0x08,0x00,0x06,0x24, +0x08,0x00,0x82,0x94, +0x02,0x80,0x04,0x3C, +0x08,0x52,0x00,0x0C, +0x25,0x20,0x44,0x00, +0x08,0x00,0x05,0x8E, +0x0C,0x00,0x06,0x96, +0x14,0x00,0x07,0x96, +0x19,0x08,0x00,0x0C, +0x09,0x00,0x04,0x24, +0x04,0x00,0x02,0x8E, +0x00,0x00,0x03,0x8E, +0x21,0x20,0x00,0x02, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x62,0xAC, +0x00,0x00,0x10,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x10,0xAE, +0x00,0x60,0x94,0x40, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xF8,0x37,0x68,0x8E, +0x0C,0x00,0x11,0x8E, +0xFC,0x37,0x62,0x8E, +0x25,0xB0,0x03,0x3C, +0x21,0x28,0x11,0x01, +0xC0,0x00,0x63,0x34, +0x23,0x90,0x48,0x00, +0x2B,0x10,0x45,0x00, +0x01,0x00,0x16,0x24, +0x09,0x00,0x04,0x24, +0xFF,0xFF,0x27,0x32, +0x21,0x30,0x00,0x01, +0x00,0x00,0x71,0xA4, +0x33,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0x08,0x00,0x05,0x8E, +0xFF,0xFF,0x47,0x32, +0x23,0x88,0x32,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB6,0xAF, +0x22,0x10,0x03,0x3C, +0x21,0x18,0x23,0x02, +0x09,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0xF8,0x37,0x63,0xAE, +0x08,0x00,0x05,0x8E, +0xFF,0xFF,0x27,0x32, +0x09,0x00,0x04,0x24, +0x21,0x28,0xB2,0x00, +0x22,0x10,0x06,0x3C, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB6,0xAF, +0xB0,0x01,0x00,0x0C, +0x09,0x00,0x04,0x24, +0x30,0x1F,0xA2,0x26, +0xF8,0x37,0x46,0x8C, +0x25,0xB0,0x03,0x3C, +0xEC,0x00,0x64,0x34, +0x00,0x00,0x86,0xAC, +0xBD,0x00,0x65,0x34, +0x00,0x00,0xA2,0x90, +0xC2,0x00,0x63,0x34, +0x21,0x20,0x00,0x02, +0x10,0x00,0x42,0x34, +0x00,0x00,0xA2,0xA0, +0x00,0x00,0x66,0xA4, +0x04,0x00,0x02,0x8E, +0x00,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x62,0xAC, +0x00,0x00,0x10,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x10,0xAE, +0x00,0x60,0x94,0x40, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x08,0x00,0x05,0x8E, +0x21,0x30,0x00,0x01, +0x09,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xF8,0x37,0x63,0x8E, +0x00,0x00,0x00,0x00, +0x21,0x18,0x71,0x00, +0x05,0x09,0x00,0x08, +0xF8,0x37,0x63,0xAE, +0xE8,0xFF,0xBD,0x27, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x28,0x80,0x00, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x02,0x3C, +0xBF,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x63,0x2C, +0x05,0x00,0x60,0x10, +0x02,0x80,0x06,0x3C, +0x6C,0x57,0xC3,0x8C, +0x6C,0x57,0xC2,0x24, +0x0C,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x57,0xC2,0x24, +0x04,0x00,0x43,0x8C, +0x00,0x00,0xA2,0xAC, +0x04,0x00,0x45,0xAC, +0x00,0x00,0x65,0xAC, +0x04,0x00,0xA3,0xAC, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xB4,0x08,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x98,0xD7,0x84,0x24, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x2F,0x55,0x00,0x0C, +0x14,0x00,0xB1,0xAF, +0x00,0x00,0x04,0x96, +0x00,0x00,0x00,0x00, +0x20,0x00,0x83,0x24, +0x07,0x00,0x62,0x30, +0x49,0x00,0x40,0x10, +0xC2,0x10,0x03,0x00, +0x28,0x00,0x82,0x24, +0xC2,0x10,0x02,0x00, +0x25,0x24,0x00,0x0C, +0xC0,0x20,0x02,0x00, +0x47,0x00,0x40,0x10, +0x21,0x88,0x40,0x00, +0x02,0x80,0x12,0x3C, +0x30,0x1F,0x50,0x26, +0x1C,0x37,0x05,0x8E, +0x0A,0x00,0x04,0x24, +0x28,0x00,0x06,0x24, +0xC7,0x01,0x00,0x0C, +0x21,0x38,0x40,0x00, +0xB0,0x1B,0x03,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x62,0x30, +0x47,0x00,0x40,0x14, +0x01,0x00,0x62,0x30, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x48,0x90, +0x25,0xB0,0x04,0x3C, +0x2F,0x00,0x02,0x3C, +0xD0,0x01,0x85,0x34, +0x17,0x32,0x42,0x34, +0x00,0x00,0xA2,0xAC, +0x5E,0x00,0x03,0x3C, +0x10,0x00,0x02,0x3C, +0xDC,0x01,0x87,0x34, +0xD4,0x01,0x86,0x34, +0x17,0x43,0x63,0x34, +0x20,0x53,0x42,0x34, +0xD8,0x01,0x84,0x34, +0x00,0x00,0xC3,0xAC, +0x30,0x1F,0x49,0x26, +0x00,0x00,0x82,0xAC, +0x44,0xA4,0x03,0x34, +0x01,0x00,0x02,0x24, +0x00,0x00,0xE3,0xAC, +0xEC,0x38,0x20,0xAD, +0x08,0x39,0x20,0xAD, +0x50,0x3E,0x20,0xAD, +0x10,0x3E,0x20,0xAD, +0x51,0x00,0x02,0x11, +0x1A,0x3E,0x20,0xA1, +0x10,0x23,0x22,0x8D, +0xFF,0xF7,0x03,0x24, +0xFF,0xEF,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x10,0x23,0x22,0xAD, +0xB0,0x01,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0x08,0x00,0x22,0x96, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x04,0x3C, +0x25,0x28,0x45,0x00, +0xDC,0x01,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x84,0x58,0x84,0x24, +0x3D,0x24,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x30,0x1F,0x43,0x26, +0x9C,0x39,0x62,0x8C, +0xD1,0x11,0x00,0x0C, +0x30,0x3B,0x62,0xA0, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x25,0x24,0x00,0x0C, +0xC0,0x20,0x02,0x00, +0xBB,0xFF,0x40,0x14, +0x21,0x88,0x40,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xA8,0xD7,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x1C,0xEA,0xA5,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x32,0x00,0x40,0x14, +0x02,0x80,0x04,0x3C, +0xA3,0x51,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x02,0x96, +0x25,0xB0,0x03,0x3C, +0x4C,0x00,0x63,0x34, +0xFF,0xFE,0x42,0x30, +0xB0,0x1B,0x02,0xA6, +0x00,0x00,0x60,0xA0, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x48,0x90, +0x25,0xB0,0x04,0x3C, +0x2F,0x00,0x02,0x3C, +0xD0,0x01,0x85,0x34, +0x17,0x32,0x42,0x34, +0x00,0x00,0xA2,0xAC, +0x5E,0x00,0x03,0x3C, +0x10,0x00,0x02,0x3C, +0xDC,0x01,0x87,0x34, +0xD4,0x01,0x86,0x34, +0x17,0x43,0x63,0x34, +0x20,0x53,0x42,0x34, +0xD8,0x01,0x84,0x34, +0x00,0x00,0xC3,0xAC, +0x30,0x1F,0x49,0x26, +0x00,0x00,0x82,0xAC, +0x44,0xA4,0x03,0x34, +0x01,0x00,0x02,0x24, +0x00,0x00,0xE3,0xAC, +0xEC,0x38,0x20,0xAD, +0x08,0x39,0x20,0xAD, +0x50,0x3E,0x20,0xAD, +0x10,0x3E,0x20,0xAD, +0xB1,0xFF,0x02,0x15, +0x1A,0x3E,0x20,0xA1, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x44,0x90, +0x02,0x00,0x03,0x24, +0x06,0x00,0x83,0x10, +0xFF,0xF7,0x03,0x24, +0x10,0x23,0x22,0x8D, +0x00,0x00,0x00,0x00, +0x24,0x10,0x43,0x00, +0x95,0x09,0x00,0x08, +0x00,0x10,0x42,0x34, +0x10,0x23,0x22,0x8D, +0xFF,0xEF,0x03,0x24, +0x00,0x08,0x42,0x34, +0x95,0x09,0x00,0x08, +0x24,0x10,0x43,0x00, +0x88,0x58,0x84,0x24, +0x6C,0x4C,0x00,0x0C, +0x03,0x00,0x05,0x24, +0xBE,0x09,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x1C,0x00,0xB3,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x43,0x26, +0xB0,0x1B,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x30, +0x76,0x00,0x40,0x14, +0x21,0x98,0x80,0x00, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x14,0x3C, +0xF6,0x5E,0x82,0x92, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x74,0x00,0x40,0x14, +0x04,0x00,0x04,0x24, +0x00,0x60,0x90,0x40, +0x30,0x1F,0x42,0x8E, +0xFF,0xF0,0x03,0x24, +0x0F,0xFF,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x25,0xB0,0x05,0x3C, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x64,0x03,0xA4,0x34, +0x17,0x00,0x03,0x24, +0x00,0x00,0x80,0xA0, +0x50,0x0C,0xA3,0xA0, +0x30,0x1F,0x42,0xAE, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x17,0x00,0x03,0x24, +0x58,0x0C,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x51,0x26, +0xB0,0x1B,0x22,0x96, +0x02,0x80,0x04,0x3C, +0xB4,0xD7,0x84,0x24, +0x00,0x10,0x42,0x34, +0x2F,0x55,0x00,0x0C, +0xB0,0x1B,0x22,0xA6, +0x01,0x00,0x02,0x24, +0x25,0xB0,0x03,0x3C, +0x6C,0x3B,0x22,0xAE, +0x4C,0x00,0x63,0x34, +0x08,0x00,0x66,0x8E, +0x00,0x00,0x67,0x90, +0xB0,0x1B,0x22,0x96, +0x30,0x3B,0x28,0x92, +0x31,0x3B,0x29,0x92, +0x8F,0x3E,0x2A,0x92, +0x38,0x3B,0x2B,0x92, +0x67,0x3B,0x2C,0x92, +0x74,0x3B,0x26,0xAE, +0x00,0x80,0x42,0x30, +0xA1,0x3B,0x27,0xA2, +0x21,0x20,0x00,0x00, +0x00,0x00,0x60,0xA0, +0x21,0x28,0x00,0x00, +0x99,0x3B,0x28,0xA2, +0x9A,0x3B,0x29,0xA2, +0x9E,0x3B,0x22,0xA6, +0xA0,0x3B,0x2A,0xA2, +0x30,0x3B,0x2B,0xA2, +0x31,0x3B,0x2C,0xA2, +0xA4,0x3B,0x20,0xAE, +0xA8,0x3B,0x20,0xAE, +0x9C,0x3B,0x20,0xA2, +0x12,0x0D,0x00,0x0C, +0x9B,0x3B,0x20,0xA2, +0x08,0x00,0x66,0x8E, +0x00,0x00,0x00,0x00, +0x33,0x00,0xC0,0x14, +0x0C,0x00,0x70,0x26, +0x00,0x00,0x62,0x8E, +0x21,0x20,0x20,0x02, +0xAC,0x3B,0x23,0x26, +0x70,0x3B,0x22,0xAE, +0x3F,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0x00,0x00,0x60,0xA0, +0xFD,0xFF,0x41,0x04, +0x07,0x00,0x63,0x24, +0xB0,0x1B,0x83,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x62,0x30, +0x09,0x00,0x40,0x10, +0x30,0x1F,0x50,0x26, +0x01,0x00,0x62,0x30, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x82,0x92, +0x0C,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0x2C,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x48,0x00,0x84,0x34, +0x00,0x00,0x83,0x8C, +0x70,0x3B,0x05,0x8E, +0x7B,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x01,0x00,0x02,0x24, +0x00,0x00,0x83,0xAC, +0x19,0x00,0xA2,0x10, +0x3C,0x00,0x02,0x24, +0x98,0x38,0x02,0xAE, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x0F,0x0A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x00,0x02, +0x10,0x52,0x00,0x0C, +0xA8,0x5A,0x84,0x24, +0x02,0x80,0x04,0x3C, +0xC4,0xD7,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x28,0x00,0x02, +0x54,0x0A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x13,0x0F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x3C,0x00,0x02,0x24, +0x79,0x0A,0x00,0x08, +0x98,0x38,0x02,0xAE, +0xCD,0x4E,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x6A,0x0A,0x00,0x08, +0x30,0x1F,0x50,0x26, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x00,0x00,0x02,0x92, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x40,0x00, +0x03,0x00,0x42,0x2C, +0x06,0x00,0x40,0x14, +0xD0,0xD7,0x84,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0x92, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x80,0x02,0x3C, +0xA8,0x5C,0x43,0xAC, +0x18,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xD0,0xFF,0xBD,0x27, +0x18,0x03,0x42,0x34, +0xC8,0x2A,0x63,0x24, +0x24,0x00,0xB3,0xAF, +0x28,0x00,0xBF,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x04,0x3C, +0xF4,0x5E,0x82,0x90, +0x00,0x00,0x00,0x00, +0x12,0x00,0x40,0x10, +0x02,0x80,0x13,0x3C, +0x02,0x80,0x02,0x3C, +0x0D,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x66,0x00,0x60,0x14, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x16,0x5F,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x43,0x8C, +0x74,0x57,0x42,0x24, +0xA7,0x00,0x62,0x10, +0x02,0x80,0x13,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2A,0xB0,0x02,0x3C, +0x36,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x30,0x1F,0x66,0x26, +0x00,0x38,0xC5,0x8C, +0xC0,0x18,0x03,0x00, +0x23,0xB0,0x04,0x3C, +0xF0,0x07,0x63,0x30, +0xFF,0x1F,0x02,0x3C, +0x21,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x62,0x00, +0x23,0x88,0x85,0x00, +0x00,0x04,0x22,0x26, +0x2B,0x28,0x85,0x00, +0xA4,0x37,0xC3,0x8C, +0x0B,0x88,0x45,0x00, +0xE1,0x01,0x22,0x2E, +0xA0,0x37,0xC3,0xAC, +0x04,0x38,0xC4,0xAC, +0xAA,0x37,0xC0,0xA4, +0x14,0x00,0x40,0x14, +0xA9,0x37,0xC0,0xA0, +0x20,0xFE,0x82,0x24, +0x20,0x02,0x83,0x24, +0x0A,0x18,0x45,0x00, +0x23,0x10,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x2B,0x10,0x43,0x00, +0x21,0x28,0x60,0x00, +0x34,0x00,0x40,0x14, +0x00,0x38,0xC3,0xAC, +0x04,0x38,0xC2,0x8C, +0x00,0x00,0x00,0x00, +0x2B,0x18,0x45,0x00, +0x23,0x88,0x45,0x00, +0x03,0x00,0x60,0x10, +0xE1,0x01,0x22,0x2E, +0x00,0x04,0x31,0x26, +0xE1,0x01,0x22,0x2E, +0x0E,0x00,0x40,0x10, +0x30,0x1F,0x70,0x26, +0x30,0x1F,0x70,0x26, +0x04,0x38,0x03,0x8E, +0x00,0x38,0x04,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x83,0x00, +0x2E,0x00,0x40,0x14, +0x2B,0x10,0x64,0x00, +0x5A,0x00,0x40,0x14, +0x25,0xB0,0x02,0x3C, +0x80,0x00,0x03,0x24, +0xD0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x30,0x1F,0x70,0x26, +0x00,0x38,0x03,0x96, +0x2A,0xB0,0x02,0x3C, +0x35,0x00,0x42,0x34, +0xC2,0x88,0x03,0x00, +0x00,0x00,0x51,0xA0, +0x5D,0x27,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xAA,0x37,0x03,0x96, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD0,0x1B,0x02,0x8E, +0x80,0x00,0x03,0x3C, +0x41,0xB0,0x04,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0x82,0xAC, +0x28,0x00,0xBF,0x8F, +0xD0,0x1B,0x02,0xAE, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x00,0xFC,0xA5,0x24, +0xF6,0x0A,0x00,0x08, +0x00,0x38,0xC5,0xAC, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9F,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x0D,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xCF,0x0A,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xA0,0x37,0x05,0x8E, +0x21,0x30,0x80,0x00, +0xFF,0xFF,0x27,0x32, +0x09,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xA0,0x37,0x03,0x8E, +0xAA,0x37,0x05,0x96, +0x00,0x38,0x02,0x8E, +0x21,0x18,0x71,0x00, +0x21,0x28,0x25,0x02, +0x21,0x10,0x51,0x00, +0x09,0x00,0x04,0x24, +0x00,0x38,0x02,0xAE, +0xA0,0x37,0x03,0xAE, +0xB0,0x01,0x00,0x0C, +0xAA,0x37,0x05,0xA6, +0x30,0x1F,0x70,0x26, +0x00,0x38,0x03,0x96, +0x2A,0xB0,0x02,0x3C, +0x35,0x00,0x42,0x34, +0xC2,0x88,0x03,0x00, +0x00,0x00,0x51,0xA0, +0x5D,0x27,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xAA,0x37,0x03,0x96, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD0,0x1B,0x02,0x8E, +0x80,0x00,0x03,0x3C, +0x41,0xB0,0x04,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0x82,0xAC, +0x28,0x00,0xBF,0x8F, +0xD0,0x1B,0x02,0xAE, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x08,0x38,0x02,0x8E, +0xA0,0x37,0x05,0x8E, +0x21,0x30,0x80,0x00, +0x23,0x88,0x44,0x00, +0xFF,0xFF,0x27,0x32, +0x09,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xA0,0x37,0x03,0x8E, +0xAA,0x37,0x02,0x96, +0x04,0x38,0x12,0x96, +0x21,0x18,0x71,0x00, +0x21,0x10,0x22,0x02, +0x23,0x10,0x11,0x3C, +0xA0,0x37,0x03,0xAE, +0xAA,0x37,0x02,0xA6, +0x15,0x00,0x40,0x16, +0x00,0x38,0x11,0xAE, +0x09,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0x30,0x1F,0x70,0x26, +0x46,0x0B,0x00,0x08, +0x00,0x00,0x00,0x00, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x57,0xFF,0x40,0x10, +0x30,0x1F,0x63,0x26, +0x2A,0x1C,0x62,0x90, +0x00,0x00,0x00,0x00, +0x53,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x50,0x39,0x64,0x94, +0x2A,0x1C,0x60,0xA0, +0x00,0xC0,0x84,0x24, +0xC2,0x34,0x00,0x0C, +0xFF,0xFF,0x84,0x30, +0xD3,0x0A,0x00,0x08, +0x00,0x00,0x00,0x00, +0xB0,0x01,0x00,0x0C, +0x09,0x00,0x04,0x24, +0xA0,0x37,0x05,0x8E, +0x09,0x00,0x04,0x24, +0x23,0x10,0x06,0x3C, +0x21,0x38,0x40,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xA0,0x37,0x03,0x8E, +0xAA,0x37,0x02,0x96, +0x21,0x20,0x51,0x02, +0x21,0x18,0x72,0x00, +0x21,0x10,0x42,0x02, +0x00,0x38,0x04,0xAE, +0x09,0x00,0x04,0x24, +0xA0,0x37,0x03,0xAE, +0x75,0x0B,0x00,0x08, +0xAA,0x37,0x02,0xA6, +0xFF,0x00,0x86,0x30, +0x02,0x80,0x02,0x3C, +0x40,0x00,0xC3,0x2C, +0x4A,0xF3,0x47,0x90, +0x00,0x00,0x63,0x38, +0x3F,0x00,0x02,0x24, +0x0A,0x30,0x43,0x00, +0x01,0x00,0x02,0x24, +0x08,0x0E,0x04,0x24, +0x00,0x7F,0x05,0x24, +0x03,0x00,0xE2,0x10, +0x31,0x00,0xC3,0x2C, +0xA9,0x45,0x00,0x08, +0x00,0x00,0x00,0x00, +0x30,0x00,0x02,0x24, +0xA9,0x45,0x00,0x08, +0x0A,0x30,0x43,0x00, +0xC0,0xFF,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x38,0x00,0xB4,0xAF, +0x34,0x00,0xB3,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x28,0x00,0xB0,0xAF, +0x28,0xEA,0x62,0x24, +0x3C,0x00,0xBF,0xAF, +0x0A,0x00,0x4A,0x94, +0x02,0x00,0x48,0x94, +0x06,0x00,0x49,0x94, +0xFF,0x00,0x84,0x30, +0xFF,0x00,0xA5,0x30, +0x28,0xEA,0x6B,0x94, +0x04,0x00,0x4C,0x94, +0x08,0x00,0x4D,0x94, +0x00,0x1C,0x05,0x00, +0x00,0x14,0x04,0x00, +0x00,0x3E,0x05,0x00, +0x00,0x36,0x04,0x00, +0x25,0x38,0xE3,0x00, +0x25,0x30,0xC2,0x00, +0x00,0x44,0x08,0x00, +0x00,0x12,0x05,0x00, +0x00,0x4C,0x09,0x00, +0x00,0x54,0x0A,0x00, +0x00,0x1A,0x04,0x00, +0x25,0x38,0xE2,0x00, +0x25,0x40,0x0B,0x01, +0x25,0x48,0x2C,0x01, +0x25,0x50,0x4D,0x01, +0x25,0x30,0xC3,0x00, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA8,0xAF, +0x14,0x00,0xA9,0xAF, +0x18,0x00,0xAA,0xAF, +0x25,0x98,0xE5,0x00, +0x25,0x90,0xC4,0x00, +0x30,0x1F,0x54,0x24, +0x21,0x80,0x00,0x00, +0x10,0x00,0xB1,0x27, +0x02,0x00,0x02,0x2E, +0x32,0x00,0x40,0x10, +0x80,0x10,0x10,0x00, +0x21,0x10,0x54,0x00, +0xF0,0x1C,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x40,0x73,0x00, +0x21,0x38,0x00,0x00, +0x7F,0x00,0x09,0x24, +0xC0,0x20,0x07,0x00, +0x04,0x10,0x89,0x00, +0x24,0x10,0x48,0x00, +0x06,0x10,0x82,0x00, +0x01,0x00,0xE5,0x24, +0xFF,0x00,0x43,0x30, +0x21,0x30,0x27,0x02, +0x40,0x00,0x63,0x2C, +0xFF,0x00,0xA7,0x30, +0x02,0x00,0x60,0x14, +0x04,0x00,0xE4,0x2C, +0x3F,0x00,0x02,0x24, +0xF3,0xFF,0x80,0x14, +0x10,0x00,0xC2,0xA0, +0x23,0x00,0xA6,0x93, +0x22,0x00,0xA2,0x93, +0x21,0x00,0xA5,0x93, +0x40,0x18,0x10,0x00, +0x00,0x14,0x02,0x00, +0x21,0x18,0x71,0x00, +0x20,0x00,0xA7,0x93, +0x00,0x36,0x06,0x00, +0x25,0x30,0xC2,0x00, +0x00,0x2A,0x05,0x00, +0x00,0x00,0x64,0x94, +0x25,0x30,0xC5,0x00, +0x7F,0x7F,0x05,0x3C, +0x25,0x30,0xC7,0x00, +0xA9,0x45,0x00,0x0C, +0x7F,0x7F,0xA5,0x34, +0x01,0x00,0x02,0x26, +0xFF,0x00,0x50,0x30, +0x06,0x00,0x03,0x2E, +0xD5,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x21,0x10,0x54,0x00, +0xF0,0x1C,0x43,0x8C, +0xDC,0x0B,0x00,0x08, +0x21,0x40,0x72,0x00, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x09,0x3C, +0x1C,0x00,0xB3,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x30,0x1F,0x27,0x25, +0x02,0x80,0x02,0x3C, +0xB0,0x1B,0xE3,0x94, +0xDE,0x5D,0x46,0x90, +0xFF,0x00,0x90,0x30, +0x00,0x10,0x63,0x30, +0x20,0x00,0xC5,0x30, +0x21,0x20,0x07,0x02, +0x10,0x00,0xC6,0x30, +0x02,0x00,0x60,0x14, +0x3F,0x00,0x13,0x24, +0x63,0x1D,0x93,0x90, +0x28,0x00,0xC0,0x10, +0x30,0x1F,0x22,0x25, +0x8D,0x1D,0x82,0x90, +0x7F,0x1D,0x83,0x90, +0x00,0x00,0x00,0x00, +0x23,0x10,0x43,0x00, +0x00,0x46,0x02,0x00, +0x03,0x46,0x08,0x00, +0xFF,0x00,0x71,0x30, +0x30,0x1F,0x27,0x25, +0x0F,0x00,0x08,0x31, +0x21,0x30,0x00,0x01, +0x21,0x40,0x07,0x02, +0xB7,0x1D,0x02,0x91, +0xB0,0x1B,0xE3,0x84, +0x0F,0x00,0x05,0x3C, +0x0F,0x00,0x42,0x30, +0x21,0x10,0x51,0x00, +0x0C,0x08,0x04,0x24, +0x00,0xFF,0xA5,0x34, +0x06,0x00,0x60,0x04, +0xFF,0x00,0x52,0x30, +0xC5,0x1D,0x02,0x91, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x21,0x10,0x51,0x00, +0xFF,0x00,0x51,0x30, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9A,0x0B,0x00,0x0C, +0x21,0x20,0x60,0x02, +0x21,0x20,0x20,0x02, +0x21,0x28,0x40,0x02, +0x21,0x30,0x00,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xAB,0x0B,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xDF,0xFF,0xA0,0x10, +0x21,0x18,0x02,0x02, +0xA9,0x1D,0x62,0x90, +0x9B,0x1D,0x63,0x90, +0x26,0x0C,0x00,0x08, +0x23,0x10,0x43,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x02,0x3C, +0x18,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0xE9,0x5D,0x43,0x90, +0x01,0x00,0x02,0x24, +0x0D,0x00,0x62,0x10, +0xFF,0x00,0x91,0x30, +0x0D,0x0C,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x30,0x20,0x02, +0x18,0x00,0x04,0x24, +0x5F,0x47,0x00,0x0C, +0xFF,0x03,0x05,0x24, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x0A,0x00,0x04,0x24, +0x25,0x22,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x1A,0x00,0x23,0x12, +0x0B,0x00,0x02,0x24, +0x1D,0x00,0x22,0x12, +0x0F,0x00,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x15,0x00,0x04,0x24, +0xF4,0xF8,0x06,0x34, +0x5F,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x48,0xF3,0x44,0x90, +0xFE,0x00,0x03,0x24, +0xE9,0xFF,0x83,0x14, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x8A,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0xFF,0x00,0x46,0x30, +0x00,0xFF,0x03,0x36, +0x24,0x10,0x43,0x00, +0x01,0x00,0xC6,0x24, +0x25,0x30,0x46,0x00, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0x5B,0x0C,0x00,0x08, +0x21,0x30,0x20,0x02, +0x0F,0x00,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x15,0x00,0x04,0x24, +0x6B,0x0C,0x00,0x08, +0xF4,0xA8,0x06,0x34, +0xFF,0xFF,0xA5,0x34, +0x15,0x00,0x04,0x24, +0x6B,0x0C,0x00,0x08, +0xF5,0xF8,0x06,0x34, +0xFC,0x00,0x84,0x30, +0x50,0x00,0x02,0x24, +0x11,0x00,0x82,0x10, +0x05,0x00,0x03,0x24, +0x51,0x00,0x82,0x28, +0x10,0x00,0x40,0x10, +0xA0,0x00,0x02,0x24, +0x20,0x00,0x02,0x24, +0x0B,0x00,0x82,0x10, +0x02,0x00,0x03,0x24, +0x21,0x00,0x82,0x28, +0x15,0x00,0x40,0x14, +0x30,0x00,0x02,0x24, +0x06,0x00,0x82,0x10, +0x03,0x00,0x03,0x24, +0x04,0x00,0x03,0x24, +0x40,0x00,0x02,0x24, +0x02,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xFD,0xFF,0x82,0x10, +0x08,0x00,0x03,0x24, +0xA1,0x00,0x82,0x28, +0x0C,0x00,0x40,0x10, +0xC0,0x00,0x02,0x24, +0x80,0x00,0x02,0x24, +0xF7,0xFF,0x82,0x10, +0x06,0x00,0x03,0x24, +0x07,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0x90,0x00,0x02,0x24, +0xF2,0xFF,0x80,0x10, +0x21,0x18,0x00,0x00, +0x01,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0x10,0x00,0x02,0x24, +0xED,0xFF,0x82,0x10, +0x0A,0x00,0x03,0x24, +0xC1,0x00,0x82,0x28, +0x04,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x09,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0xB0,0x00,0x02,0x24, +0x0B,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0xD0,0x00,0x02,0x24, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x08,0x00,0x83,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0x90,0x94, +0x02,0x80,0x02,0x3C, +0x21,0x98,0x80,0x00, +0x25,0x80,0x02,0x02, +0x21,0x20,0x00,0x02, +0xFF,0x00,0xB2,0x30, +0xFF,0x00,0xD1,0x30, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x08,0x00,0x06,0x24, +0x08,0x00,0x04,0x8E, +0x04,0x00,0x05,0x8E, +0xFF,0xDF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xFF,0xE0,0x03,0x24, +0x24,0x20,0x82,0x00, +0x00,0x40,0x02,0x3C, +0x10,0x00,0x06,0x8E, +0x24,0x28,0xA3,0x00, +0x25,0x20,0x82,0x00, +0x3F,0xFF,0x02,0x3C, +0x0C,0x00,0x67,0x8E, +0x7F,0xFF,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x00,0x12,0xA5,0x34, +0x01,0x00,0x52,0x32, +0x03,0x00,0x31,0x32, +0x24,0x20,0x83,0x00, +0x24,0x28,0xA2,0x00, +0xC0,0x91,0x12,0x00, +0x80,0x8D,0x11,0x00, +0x00,0x80,0x02,0x3C, +0x25,0x30,0xC2,0x00, +0x25,0x20,0x92,0x00, +0x25,0x28,0xB1,0x00, +0x20,0x00,0x02,0x24, +0x10,0x00,0x06,0xAE, +0x02,0x00,0x02,0xA2, +0x08,0x00,0x04,0xAE, +0x04,0x00,0x05,0xAE, +0x00,0x00,0x07,0xA6, +0x02,0x80,0x02,0x3C, +0xE0,0x3A,0x43,0x94, +0xFB,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC2,0x1B,0x03,0x00, +0x24,0x30,0xC2,0x00, +0x80,0x1C,0x03,0x00, +0x25,0x30,0xC3,0x00, +0x14,0x00,0x05,0x8E, +0x82,0x24,0x06,0x00, +0x01,0x00,0x84,0x30, +0x0C,0x00,0x02,0x24, +0x0A,0x10,0x04,0x00, +0xFF,0x81,0x03,0x24, +0x24,0x28,0xA3,0x00, +0x40,0x12,0x02,0x00, +0x25,0x28,0xA2,0x00, +0x14,0x00,0x05,0xAE, +0x10,0x00,0x06,0xAE, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x42,0x24, +0x04,0x00,0x44,0x8C, +0x00,0x00,0x62,0xAE, +0x04,0x00,0x53,0xAC, +0x00,0x00,0x93,0xAC, +0x04,0x00,0x64,0xAE, +0x00,0x60,0x83,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0xFF,0xFF,0x83,0x30, +0xFF,0x00,0xB1,0x30, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x13,0x3C, +0x30,0x1F,0x70,0x26, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x80,0x42,0x30, +0x2F,0x00,0x43,0x10, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x02,0x34, +0x50,0xDF,0x84,0x24, +0x33,0x00,0x62,0x10, +0x21,0x30,0x20,0x02, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x03,0x02,0x63,0x34, +0x00,0x00,0x62,0x90, +0x00,0x08,0x04,0x24, +0x01,0x00,0x05,0x24, +0x04,0x00,0x42,0x30, +0x00,0x00,0x62,0xA0, +0x1B,0x47,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x58,0x00,0x06,0x24, +0x00,0x0C,0x05,0x24, +0x01,0x00,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x18,0x00,0x04,0x24, +0xB0,0x1B,0x02,0x96, +0x8F,0x3E,0x11,0xA2, +0xFF,0x7F,0x42,0x30, +0xB0,0x1B,0x02,0xA6, +0x30,0x1F,0x62,0x26, +0x30,0x3B,0x44,0x90, +0x0D,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x30,0x3B,0x05,0x92, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x30,0xDF,0x84,0x24, +0x01,0x00,0x02,0x24, +0x2C,0x00,0x22,0x12, +0x00,0x00,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x00,0x00,0x00,0x00, +0xFE,0xFF,0x84,0x24, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x07,0x3C, +0x03,0x02,0xE7,0x34, +0x00,0x00,0xE2,0x90, +0xFB,0xFF,0x03,0x24, +0x00,0x08,0x04,0x24, +0x24,0x10,0x43,0x00, +0x00,0x00,0xE2,0xA0, +0x01,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x03,0x00,0x30,0x32, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x10,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x42,0x30,0x10,0x00, +0x21,0x30,0x00,0x02, +0x00,0x0D,0x04,0x24, +0x1B,0x47,0x00,0x0C, +0x00,0x0C,0x05,0x24, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x18,0x00,0x06,0x24, +0x18,0x00,0x04,0x24, +0x00,0x0C,0x05,0x24, +0x5F,0x47,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x30,0x1F,0x64,0x26, +0xB0,0x1B,0x82,0x94, +0x00,0x80,0x03,0x24, +0x8F,0x3E,0x91,0xA0, +0x25,0x10,0x43,0x00, +0x47,0x0D,0x00,0x08, +0xB0,0x1B,0x82,0xA4, +0x30,0x3B,0x04,0x92, +0x65,0x0D,0x00,0x08, +0x02,0x00,0x84,0x24, +0xC8,0xFF,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x28,0x00,0xB0,0xAF, +0x34,0xEA,0x62,0x24, +0x01,0x00,0x44,0x90, +0x05,0x00,0x45,0x90, +0x09,0x00,0x46,0x90, +0x0D,0x00,0x47,0x90, +0x04,0x00,0x51,0x90, +0x08,0x00,0x50,0x90, +0x34,0xEA,0x72,0x90, +0x02,0x00,0x4F,0x90, +0x0C,0x00,0x43,0x90, +0x06,0x00,0x4E,0x90, +0x0A,0x00,0x4D,0x90, +0x0E,0x00,0x48,0x90, +0x03,0x00,0x49,0x90, +0x07,0x00,0x4A,0x90, +0x0B,0x00,0x4B,0x90, +0x0F,0x00,0x4C,0x90, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x00,0x32,0x06,0x00, +0x00,0x3A,0x07,0x00, +0x02,0x80,0x18,0x3C, +0x25,0x28,0xB1,0x00, +0x25,0x30,0xD0,0x00, +0x25,0x38,0xE3,0x00, +0x25,0x20,0x92,0x00, +0x11,0x00,0x51,0x90, +0x10,0x00,0x50,0x90, +0x30,0x1F,0x03,0x27, +0x00,0x7C,0x0F,0x00, +0x00,0x74,0x0E,0x00, +0x00,0x6C,0x0D,0x00, +0x00,0x44,0x08,0x00, +0x25,0x78,0xE4,0x01, +0x25,0x70,0xC5,0x01, +0x25,0x68,0xA6,0x01, +0x25,0x40,0x07,0x01, +0x5A,0x3E,0x66,0x90, +0x00,0x4E,0x09,0x00, +0x00,0x56,0x0A,0x00, +0x00,0x5E,0x0B,0x00, +0x00,0x66,0x0C,0x00, +0x25,0x48,0x2F,0x01, +0x25,0x50,0x4E,0x01, +0x25,0x58,0x6D,0x01, +0x25,0x60,0x88,0x01, +0x25,0xB0,0x05,0x3C, +0x37,0x02,0xA5,0x34, +0x10,0x00,0xA9,0xAF, +0x14,0x00,0xAA,0xAF, +0x18,0x00,0xAB,0xAF, +0x1C,0x00,0xAC,0xAF, +0x20,0x00,0xB0,0xA3, +0x21,0x00,0xB1,0xA3, +0x03,0x00,0xC7,0x30, +0x00,0x00,0xA4,0x90, +0x02,0x00,0xE2,0x24, +0x01,0x00,0x03,0x24, +0x04,0x18,0x43,0x00, +0x1C,0x00,0xC6,0x30, +0xF8,0xFF,0x02,0x24, +0x24,0x20,0x82,0x00, +0xFF,0x00,0x67,0x30, +0x82,0x30,0x06,0x00, +0x10,0x00,0xE3,0x2C, +0x25,0x20,0x86,0x00, +0x0F,0x00,0x02,0x24, +0x00,0x00,0xA4,0xA0, +0x0A,0x38,0x43,0x00, +0x21,0x28,0x00,0x00, +0x10,0x00,0xA3,0x27, +0x21,0x30,0x65,0x00, +0x00,0x00,0xC2,0x90, +0x01,0x00,0xA5,0x24, +0x2B,0x10,0xE2,0x00, +0x02,0x00,0x40,0x10, +0x11,0x00,0xA4,0x2C, +0x00,0x00,0xC7,0xA0, +0xF8,0xFF,0x80,0x14, +0x21,0x30,0x60,0x00, +0x21,0x28,0x00,0x00, +0x25,0xB0,0x07,0x3C, +0x01,0x00,0xC2,0x90, +0x00,0x00,0xC3,0x90, +0x21,0x20,0xA7,0x00, +0x00,0x11,0x02,0x00, +0x25,0x10,0x43,0x00, +0x01,0x00,0xA5,0x24, +0xFF,0x00,0x42,0x30, +0x08,0x00,0xA3,0x2C, +0xA8,0x01,0x82,0xA0, +0xF6,0xFF,0x60,0x14, +0x02,0x00,0xC6,0x24, +0x21,0x00,0xA2,0x93, +0x20,0x00,0xA4,0x93, +0x02,0x80,0x03,0x3C, +0x00,0x11,0x02,0x00, +0xF1,0x5D,0x65,0x90, +0x25,0x10,0x44,0x00, +0xFF,0x00,0x42,0x30, +0xA7,0x01,0xE3,0x34, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x02,0x24, +0x07,0x00,0xA2,0x10, +0x30,0x1F,0x03,0x27, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x58,0x3E,0x62,0x94, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0xF6,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x79,0x3E,0x63,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x62,0x30, +0xF1,0xFF,0x40,0x10, +0x03,0x00,0x63,0x30, +0x0C,0x00,0x65,0x10, +0x03,0x00,0x02,0x24, +0x05,0x00,0x62,0x10, +0x21,0x20,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xFF,0x0D,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x80,0x04,0x34, +0x12,0x0D,0x00,0x0C, +0x02,0x00,0x05,0x24, +0xFF,0x0D,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x80,0x04,0x34, +0x12,0x0D,0x00,0x0C, +0x01,0x00,0x05,0x24, +0xFF,0x0D,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x06,0x3C, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x88,0x58,0xC2,0x24, +0x01,0x00,0x44,0x90, +0x88,0x58,0xC3,0x90, +0x02,0x00,0x45,0x90, +0x03,0x00,0x46,0x90, +0x05,0x00,0x47,0x90, +0x04,0x00,0x48,0x90, +0x00,0x22,0x04,0x00, +0x25,0x18,0x64,0x00, +0x00,0x2C,0x05,0x00, +0x25,0xB0,0x10,0x3C, +0x25,0x18,0x65,0x00, +0x00,0x36,0x06,0x00, +0x00,0x3A,0x07,0x00, +0x25,0x18,0x66,0x00, +0x58,0x00,0x02,0x36, +0x5C,0x00,0x05,0x36, +0x25,0x40,0x07,0x01, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x43,0xAC, +0x84,0x58,0x84,0x24, +0x00,0x00,0xA8,0xAC, +0x19,0x4F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x94,0x00,0x03,0x36, +0x00,0x00,0x62,0xA4, +0x48,0x00,0x10,0x36, +0x00,0x00,0x02,0x8E, +0x04,0x00,0x03,0x3C, +0x14,0x00,0xBF,0x8F, +0x25,0x10,0x43,0x00, +0x00,0x00,0x02,0xAE, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x21,0x90,0x80,0x00, +0x18,0x02,0x04,0x24, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x84,0x58,0xA5,0x24, +0xDC,0x01,0x06,0x24, +0x18,0x00,0x40,0x10, +0x98,0xDF,0x84,0x24, +0x08,0x00,0x50,0x94, +0xF8,0x01,0x02,0x24, +0x0C,0x00,0x22,0xAE, +0x02,0x80,0x02,0x3C, +0x0A,0x00,0x03,0x24, +0x25,0x80,0x02,0x02, +0x14,0x00,0x23,0xAE, +0x3C,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x10,0x26, +0x18,0x00,0x12,0xAE, +0x21,0x20,0x20,0x02, +0x30,0x09,0x00,0x0C, +0x14,0x00,0x12,0xAE, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xA4,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x05,0x3C, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x5C,0xEA,0xA5,0x24, +0x2F,0x55,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x28,0x00,0x04,0x24, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x28,0x00,0x02, +0x06,0x00,0x06,0x24, +0x15,0x00,0x40,0x10, +0xB4,0xDF,0x84,0x24, +0x08,0x00,0x44,0x94, +0x08,0x00,0x02,0x24, +0x0C,0x00,0x22,0xAE, +0x02,0x80,0x02,0x3C, +0x0C,0x00,0x03,0x24, +0x25,0x20,0x82,0x00, +0x14,0x00,0x23,0xAE, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x84,0x24, +0x30,0x09,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xC0,0xDF,0x84,0x24, +0x21,0x10,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x05,0x3C, +0x2F,0x55,0x00,0x0C, +0x6C,0xEA,0xA5,0x24, +0x92,0x0E,0x00,0x08, +0xFF,0xFF,0x02,0x24, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x21,0x98,0x80,0x00, +0x2C,0x00,0x04,0x24, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x21,0x90,0xA0,0x00, +0x20,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x21,0x88,0x40,0x00, +0xD8,0xDF,0x84,0x24, +0x21,0x30,0x40,0x02, +0x19,0x00,0x40,0x10, +0x84,0xEA,0xA5,0x24, +0x05,0x00,0x65,0x92, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x0B,0x00,0x03,0x24, +0x25,0x80,0x02,0x02, +0x20,0x00,0x10,0x26, +0x0C,0x00,0x02,0x24, +0x21,0x20,0x00,0x02, +0x0C,0x00,0x22,0xAE, +0x14,0x00,0x23,0xAE, +0x21,0x28,0x60,0x02, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x08,0x00,0x12,0xAE, +0x21,0x20,0x20,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x30,0x09,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xCC,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x02,0x80,0x11,0x3C, +0x04,0x00,0x04,0x24, +0x0F,0x00,0x63,0x30, +0x04,0x00,0x63,0x28, +0x36,0x00,0x60,0x14, +0x01,0x00,0x05,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x2C,0xE0,0x22,0x8E, +0x0F,0x00,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x24,0x00,0x04,0x24, +0x12,0x00,0x40,0x14, +0x60,0x00,0x06,0x24, +0x0F,0x00,0x05,0x3C, +0x5F,0x47,0x00,0x0C, +0xFF,0xFF,0xA5,0x34, +0x01,0x00,0x02,0x24, +0x2C,0xE0,0x22,0xAE, +0xD0,0x07,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x70,0x58,0x43,0xAC, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x44,0x90, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x8A,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9C,0x3E,0x04,0x92, +0xFF,0x00,0x43,0x30, +0x00,0x2C,0x03,0x00, +0x0A,0x00,0x64,0x10, +0x9D,0x3E,0x02,0xA2, +0x02,0x80,0x02,0x3C, +0x49,0xF3,0x44,0x90, +0x00,0x00,0x00,0x00, +0x00,0x22,0x04,0x00, +0x6B,0x1E,0x00,0x0C, +0x25,0x20,0xA4,0x00, +0x9D,0x3E,0x03,0x92, +0x00,0x00,0x00,0x00, +0x9C,0x3E,0x03,0xA2, +0x10,0x27,0x02,0x24, +0x40,0x39,0x02,0xAE, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x44,0x90, +0x2C,0xE0,0x20,0xAE, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x64,0x31,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xDB,0x0E,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xB8,0xFF,0xBD,0x27, +0x00,0x01,0x04,0x24, +0x3C,0x00,0xB3,0xAF, +0x38,0x00,0xB2,0xAF, +0x34,0x00,0xB1,0xAF, +0x40,0x00,0xBF,0xAF, +0x30,0x00,0xB0,0xAF, +0x25,0x24,0x00,0x0C, +0x02,0x80,0x13,0x3C, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0xF0,0xDD,0x65,0x26, +0x06,0x00,0x06,0x24, +0x0C,0x00,0x52,0x24, +0x4C,0x00,0x40,0x10, +0x30,0xE0,0x84,0x24, +0x08,0x00,0x50,0x94, +0x02,0x80,0x02,0x3C, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x00,0xA6, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x30,0x00,0x04,0x26, +0xF0,0xDD,0x65,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x04,0x3C, +0x03,0xFF,0x63,0x30, +0x40,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0x84,0x24, +0x0C,0x00,0x22,0xAE, +0xF8,0x1D,0x82,0x94, +0x20,0x00,0x06,0x26, +0x02,0x80,0x07,0x3C, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x2A,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x82,0xA4, +0x16,0x00,0xC3,0xA0, +0x17,0x00,0xC5,0xA0, +0x74,0x3B,0x86,0x8C, +0xA8,0x5A,0xE7,0x24, +0x38,0x00,0x04,0x26, +0x21,0x28,0x00,0x00, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB2,0xAF, +0x18,0x00,0xA4,0x27, +0x28,0x00,0xA5,0x27, +0x21,0x50,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x28,0x00,0xA3,0x8F, +0x21,0x20,0x00,0x02, +0x18,0x00,0xA7,0x27, +0x09,0x00,0x62,0x28, +0x01,0x00,0x05,0x24, +0x12,0x00,0x40,0x10, +0x08,0x00,0x06,0x24, +0x21,0x20,0x00,0x02, +0x21,0x30,0x60,0x00, +0x01,0x00,0x05,0x24, +0x18,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB2,0xAF, +0x21,0x20,0x20,0x02, +0x01,0x00,0x05,0x24, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB2,0xAF, +0x28,0x00,0xA6,0x8F, +0x21,0x20,0x40,0x00, +0x32,0x00,0x05,0x24, +0xF8,0xFF,0xC6,0x24, +0x59,0x0F,0x00,0x08, +0x20,0x00,0xA7,0x27, +0x02,0x80,0x05,0x3C, +0x2F,0x55,0x00,0x0C, +0x9C,0xEA,0xA5,0x24, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x21,0x80,0x80,0x00, +0x45,0x00,0xA0,0x14, +0x21,0x90,0x00,0x00, +0x08,0x00,0x82,0x90, +0x02,0x80,0x13,0x3C, +0x30,0x1F,0x63,0x26, +0x0F,0x00,0x42,0x30, +0x14,0x3E,0x62,0xAC, +0x25,0xB0,0x02,0x3C, +0x0A,0x00,0x10,0x26, +0xD0,0x01,0x57,0x34, +0x02,0x80,0x14,0x3C, +0xD8,0x01,0x5E,0x34, +0xDC,0x01,0x55,0x34, +0xD4,0x01,0x56,0x34, +0x03,0x00,0x11,0x24, +0x00,0x00,0x06,0x92, +0x30,0x1F,0x62,0x26, +0x0C,0x3E,0x47,0x90, +0x0F,0x00,0xC3,0x30, +0x01,0x00,0x05,0x92, +0x18,0x00,0x67,0x00, +0x03,0x00,0x04,0x92, +0x02,0x00,0x02,0x92, +0x0F,0x00,0xA7,0x30, +0x00,0x3A,0x07,0x00, +0x02,0x29,0x05,0x00, +0x00,0x22,0x04,0x00, +0x25,0x20,0x82,0x00, +0x00,0x2B,0x05,0x00, +0x42,0x11,0x06,0x00, +0x00,0x24,0x04,0x00, +0x03,0x00,0x49,0x30, +0x02,0x31,0x06,0x00, +0x01,0x00,0x02,0x24, +0x01,0x00,0xC6,0x30, +0x12,0x18,0x00,0x00, +0x0A,0x00,0x63,0x24, +0xFF,0x00,0x63,0x30, +0x25,0x18,0x67,0x00, +0x25,0x18,0x65,0x00, +0x30,0x00,0x22,0x11, +0x25,0x38,0x64,0x00, +0x02,0x00,0x22,0x29, +0x3E,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x38,0x00,0x22,0x11, +0x03,0x00,0x02,0x24, +0x40,0x00,0x22,0x11, +0x00,0x00,0x00,0x00, +0x21,0x28,0x20,0x01, +0x3C,0xE0,0x84,0x26, +0x2F,0x55,0x00,0x0C, +0xFF,0xFF,0x31,0x26, +0xD9,0xFF,0x21,0x06, +0x04,0x00,0x10,0x26, +0x25,0xB0,0x02,0x3C, +0xE7,0x01,0x42,0x34, +0x00,0x00,0x52,0xA0, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x13,0x3C, +0x08,0x00,0x83,0x90, +0x30,0x1F,0x62,0x26, +0x14,0x3E,0x44,0x8C, +0x0F,0x00,0x63,0x30, +0xBB,0xFF,0x83,0x14, +0x00,0x00,0x00,0x00, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x00,0x00,0xA7,0xAE, +0x21,0x20,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x07,0x10,0x92,0x00, +0x01,0x00,0x42,0x30, +0x01,0x00,0x84,0x24, +0x02,0x00,0x40,0x10, +0x03,0x00,0x85,0x2C, +0xD0,0x01,0x07,0xAD, +0xF9,0xFF,0xA0,0x14, +0x04,0x00,0x08,0x25, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0x0D,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0xB5,0x0F,0x00,0x08, +0x02,0x00,0x52,0x36, +0xC7,0xFF,0x20,0x15, +0x21,0x28,0x20,0x01, +0x0D,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0xB6,0x0F,0x00,0x08, +0x04,0x00,0x52,0x36, +0x06,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0xB5,0x0F,0x00,0x08, +0x01,0x00,0x52,0x36, +0x00,0x00,0xC7,0xAE, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0x00,0x00,0xE7,0xAE, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0x00,0x00,0xC7,0xAF, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0xC8,0xFF,0xBD,0x27, +0x1C,0x00,0xB1,0xAF, +0x02,0x80,0x02,0x3C, +0x21,0x88,0x80,0x00, +0x00,0x01,0x04,0x24, +0x30,0x00,0xB6,0xAF, +0x24,0x00,0xB3,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x25,0x24,0x00,0x0C, +0x84,0x58,0x56,0x24, +0x74,0x00,0x40,0x10, +0x21,0x98,0x40,0x00, +0x08,0x00,0x50,0x94, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x20,0x02, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x06,0x00,0x06,0x24, +0x30,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x88,0x58,0xA5,0x24, +0x20,0x00,0x03,0x96, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0x03,0xFF,0x63,0x30, +0x50,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0xF8,0x1D,0x82,0x94, +0x20,0x00,0x12,0x26, +0x74,0x00,0xD1,0x26, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x82,0xA4, +0x02,0x2A,0x03,0x00, +0x20,0x00,0x02,0x24, +0x16,0x00,0x43,0xA2, +0x17,0x00,0x45,0xA2, +0x21,0x20,0x20,0x02, +0x17,0x4F,0x00,0x0C, +0x0C,0x00,0x62,0xAE, +0x40,0x00,0x12,0x26, +0x21,0x20,0x40,0x02, +0x21,0x28,0x40,0x00, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x0C,0x00,0x63,0x8E, +0x21,0x20,0x20,0x02, +0x42,0x00,0x12,0x26, +0x02,0x00,0x63,0x24, +0x32,0x4F,0x00,0x0C, +0x0C,0x00,0x63,0xAE, +0x21,0x28,0x40,0x00, +0x21,0x20,0x40,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x0C,0x00,0x63,0x8E, +0x44,0x00,0x04,0x26, +0x0C,0x00,0x75,0x26, +0x02,0x00,0x63,0x24, +0x0C,0x00,0x63,0xAE, +0x0C,0x00,0xC6,0x8E, +0x21,0x28,0x00,0x00, +0x10,0x00,0xC7,0x26, +0x60,0x00,0xD0,0x26, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x21,0x20,0x00,0x02, +0x37,0x50,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x09,0x00,0x51,0x2C, +0x08,0x00,0x06,0x24, +0x21,0x20,0x40,0x02, +0x0B,0x30,0x51,0x00, +0x21,0x38,0x00,0x02, +0x01,0x00,0x05,0x24, +0x21,0xA0,0x40,0x00, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x21,0x20,0x40,0x00, +0x03,0x00,0x05,0x24, +0x01,0x00,0x06,0x24, +0x48,0x00,0xC7,0x26, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x0D,0x00,0x20,0x12, +0x21,0x20,0x60,0x02, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0x21,0x30,0x00,0x00, +0xB9,0x0C,0x00,0x08, +0x38,0x00,0xBD,0x27, +0xF8,0xFF,0x86,0x26, +0x21,0x20,0x40,0x00, +0x68,0x00,0xC7,0x26, +0x32,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x21,0x20,0x60,0x02, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0x21,0x30,0x00,0x00, +0xB9,0x0C,0x00,0x08, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x98,0xE0,0x84,0x24, +0xAC,0xEA,0xA5,0x24, +0x2F,0x55,0x00,0x08, +0x38,0x00,0xBD,0x27, +0xB0,0xFF,0xBD,0x27, +0x50,0x00,0xA4,0xAF, +0xFC,0x01,0x04,0x24, +0x4C,0x00,0xBF,0xAF, +0x48,0x00,0xBE,0xAF, +0x44,0x00,0xB7,0xAF, +0x40,0x00,0xB6,0xAF, +0x3C,0x00,0xB5,0xAF, +0x38,0x00,0xB4,0xAF, +0x34,0x00,0xB3,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x25,0x24,0x00,0x0C, +0x28,0x00,0xB0,0xAF, +0xE3,0x00,0x40,0x10, +0x1C,0x00,0xA2,0xAF, +0x50,0x00,0xA6,0x8F, +0x02,0x80,0x03,0x3C, +0xD0,0xEA,0x62,0x24, +0xD0,0xEA,0x68,0x90, +0x01,0x00,0x44,0x90, +0x02,0x00,0xC3,0x90, +0x02,0x00,0x45,0x90, +0x03,0x00,0x46,0x90, +0x1C,0x00,0xA2,0x8F, +0x00,0x22,0x04,0x00, +0x25,0x20,0x88,0x00, +0x08,0x00,0x47,0x94, +0x50,0x00,0xA2,0x8F, +0x00,0x2C,0x05,0x00, +0x0F,0x00,0x63,0x30, +0x00,0x00,0x48,0x8C, +0x02,0x80,0x02,0x3C, +0x25,0x38,0xE2,0x00, +0x50,0x00,0xA2,0x8F, +0x25,0x28,0xA4,0x00, +0x00,0x36,0x06,0x00, +0xC0,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x25,0x30,0xC5,0x00, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA6,0xAF, +0xDD,0x5A,0x55,0x24, +0x22,0x00,0x66,0x24, +0x18,0x00,0x62,0x24, +0x28,0x00,0x76,0x24, +0x02,0x80,0x03,0x3C, +0x20,0x00,0xF7,0x24, +0xFF,0x3F,0x1E,0x31, +0x21,0x90,0x00,0x00, +0x30,0x1F,0x73,0x24, +0x01,0x00,0x14,0x24, +0x21,0x80,0x00,0x00, +0x24,0x00,0xA6,0xAF, +0xD0,0x10,0x00,0x08, +0x20,0x00,0xA2,0xAF, +0x39,0x52,0x00,0x0C, +0x07,0x00,0x10,0x26, +0x19,0x00,0x40,0x10, +0x40,0x00,0x43,0x2A, +0x0E,0x00,0x60,0x10, +0xE8,0xFF,0xC2,0x27, +0x21,0x88,0x13,0x02, +0xAC,0x3B,0x22,0x92, +0x01,0x00,0x52,0x26, +0x21,0x20,0x15,0x02, +0x21,0x28,0xC0,0x02, +0xF4,0xFF,0x54,0x10, +0x06,0x00,0x06,0x24, +0x21,0x20,0x15,0x02, +0x21,0x28,0xC0,0x02, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xAC,0x3B,0x34,0xA2, +0xE8,0xFF,0xC2,0x27, +0x69,0x01,0x43,0x28, +0x16,0x00,0x60,0x14, +0x18,0x00,0xA2,0xAF, +0x02,0x80,0x06,0x3C, +0x30,0x1F,0xC3,0x24, +0xA8,0x3B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xA8,0x3B,0x62,0xAC, +0x1C,0x00,0xA4,0x8F, +0x3D,0x24,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4C,0x00,0xBF,0x8F, +0x48,0x00,0xBE,0x8F, +0x44,0x00,0xB7,0x8F, +0x40,0x00,0xB6,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x50,0x00,0xBD,0x27, +0x21,0x20,0xE0,0x02, +0x21,0x28,0x00,0x00, +0xFF,0x51,0x00,0x0C, +0xDC,0x01,0x06,0x24, +0x20,0x00,0xA2,0x8F, +0x74,0x00,0xF4,0x26, +0x21,0x20,0x80,0x02, +0x18,0x00,0x45,0x24, +0x18,0x00,0xA2,0x8F, +0x80,0x00,0xF1,0x26, +0x74,0x00,0x42,0x24, +0x00,0x00,0xE2,0xAE, +0x18,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x30,0x60,0x00, +0x10,0x52,0x00,0x0C, +0x70,0x00,0xE3,0xAE, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x21,0x28,0x00,0x00, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0xD9,0xFF,0x40,0x10, +0x21,0x80,0x40,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0x74,0x3B,0x46,0x8C, +0x00,0x00,0x00,0x00, +0x0A,0x00,0xC0,0x18, +0x00,0x00,0x00,0x00, +0x18,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0xCF,0xFF,0xC2,0x14, +0x02,0x80,0x04,0x3C, +0xA8,0x5A,0x84,0x24, +0x39,0x52,0x00,0x0C, +0x02,0x00,0x05,0x26, +0xCA,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x06,0x92, +0x00,0x00,0x00,0x00, +0x77,0x00,0xC0,0x14, +0x10,0x00,0xE4,0x26, +0x0C,0x00,0xE0,0xAE, +0x50,0x00,0xA6,0x8F, +0x00,0x00,0x00,0x00, +0x02,0x00,0xC2,0x94, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x68,0x00,0x40,0x10, +0x21,0x20,0xC0,0x00, +0x34,0x00,0xE0,0xAE, +0x60,0x00,0xF3,0x26, +0x21,0x20,0x60,0x02, +0x21,0x28,0x00,0x00, +0xFF,0x51,0x00,0x0C, +0x10,0x00,0x06,0x24, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x01,0x00,0x05,0x24, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0x06,0x00,0x40,0x10, +0x21,0x90,0x00,0x00, +0x18,0x00,0xA6,0x8F, +0x02,0x00,0x45,0x24, +0x10,0x52,0x00,0x0C, +0x21,0x20,0x60,0x02, +0x18,0x00,0xB2,0x8F, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x32,0x00,0x05,0x24, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0x05,0x00,0x40,0x10, +0x21,0x20,0xF2,0x02, +0x18,0x00,0xA6,0x8F, +0x60,0x00,0x84,0x24, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x18,0x00,0xA5,0x8F, +0x21,0x20,0x60,0x02, +0x7D,0x50,0x00,0x0C, +0x21,0x28,0xB2,0x00, +0x21,0x18,0x40,0x00, +0x01,0x00,0x02,0x24, +0x3F,0x00,0x62,0x10, +0x03,0x00,0x02,0x24, +0x38,0x00,0xE2,0xAE, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x03,0x00,0x05,0x24, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0x48,0x00,0xE0,0xAE, +0x04,0x00,0x40,0x10, +0x3C,0x00,0xE0,0xAE, +0x02,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0x48,0x00,0xE2,0xAE, +0x17,0x4F,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x21,0x28,0x40,0x00, +0x40,0x00,0xE4,0x26, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x34,0x4F,0x00,0x0C, +0x21,0x20,0xE0,0x02, +0xFF,0xFF,0x50,0x30, +0x01,0x00,0x02,0x32, +0x22,0x00,0x40,0x10, +0x21,0x28,0xC0,0x02, +0x01,0x00,0x02,0x24, +0x5C,0x00,0xE2,0xAE, +0x24,0x00,0xA5,0x8F, +0x04,0x00,0xE4,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x10,0x00,0x02,0x32, +0x1B,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0x30,0x00,0xE2,0xAE, +0x02,0x80,0x02,0x3C, +0x44,0x00,0xE0,0xAE, +0x30,0x1F,0x44,0x24, +0xA4,0x3B,0x82,0x8C, +0x1C,0x00,0xA6,0x8F, +0xDC,0x01,0x03,0x24, +0x01,0x00,0x42,0x24, +0xA4,0x3B,0x82,0xAC, +0x08,0x00,0x02,0x24, +0x0C,0x00,0xC3,0xAC, +0x14,0x00,0xC2,0xAC, +0x1C,0x00,0xA4,0x8F, +0x30,0x09,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE9,0x10,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xA4,0xE0,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xBC,0xEA,0xA5,0x24, +0xE9,0x10,0x00,0x08, +0x00,0x00,0x00,0x00, +0x6D,0x11,0x00,0x08, +0x5C,0x00,0xE0,0xAE, +0x74,0x11,0x00,0x08, +0x30,0x00,0xE0,0xAE, +0x52,0x11,0x00,0x08, +0x38,0x00,0xE3,0xAE, +0xF7,0x19,0x00,0x0C, +0x18,0x00,0xC5,0x24, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x2B,0x11,0x00,0x08, +0x34,0x00,0xE2,0xAE, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x05,0x26, +0x01,0x00,0x03,0x92, +0x22,0x11,0x00,0x08, +0x0C,0x00,0xE3,0xAE, +0x02,0x80,0x04,0x3C, +0x84,0x58,0x84,0x24, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x17,0x4F,0x00,0x0C, +0x74,0x00,0x84,0x24, +0x21,0x28,0x40,0x00, +0x10,0x00,0xA4,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA2,0x97, +0x25,0xB0,0x04,0x3C, +0x94,0x00,0x85,0x34, +0x9A,0x00,0x87,0x34, +0x26,0xB0,0x06,0x3C, +0x00,0x08,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x0A,0x00,0x0B,0x24, +0x00,0x00,0xE3,0xA4, +0x98,0x00,0x88,0x34, +0x96,0x00,0x89,0x34, +0x7A,0x00,0xCA,0x34, +0x50,0x00,0x02,0x24, +0x04,0x00,0x03,0x24, +0x00,0x00,0x02,0xA5, +0x00,0x00,0x2B,0xA5, +0x00,0x00,0x43,0xA1, +0x10,0x00,0xA2,0x97, +0x89,0x00,0x83,0x34, +0x14,0x00,0x07,0x24, +0x40,0x11,0x02,0x00, +0xA0,0xFF,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0x9C,0x00,0x85,0x34, +0x7C,0x00,0xC6,0x34, +0x00,0x00,0xC2,0xA4, +0x44,0x00,0x84,0x34, +0x00,0x00,0x67,0xA0, +0x00,0x00,0xAB,0xA0, +0x00,0x00,0x82,0x94, +0xFF,0xFD,0x03,0x24, +0x18,0x00,0xBF,0x8F, +0x24,0x10,0x43,0x00, +0x00,0x00,0x82,0xA4, +0x00,0x00,0x83,0x94, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x00,0x02,0x63,0x34, +0x20,0x00,0xBD,0x27, +0x8E,0x3E,0x40,0xA0, +0x00,0x00,0x83,0xA4, +0x08,0x00,0xE0,0x03, +0x0C,0x3E,0x47,0xA0, +0xD8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x10,0x3C, +0x84,0x58,0x04,0x26, +0x24,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x34,0x4F,0x00,0x0C, +0x18,0x00,0xB2,0xAF, +0xFF,0xFF,0x51,0x30, +0x84,0x58,0x04,0x26, +0x19,0x4F,0x00,0x0C, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x03,0x26, +0x01,0x00,0x24,0x32, +0x08,0x3E,0x62,0xA4, +0x03,0x00,0x80,0x14, +0x02,0x00,0x05,0x24, +0x40,0x10,0x11,0x00, +0x04,0x00,0x45,0x30, +0x02,0x00,0x02,0x24, +0x59,0x00,0xA2,0x10, +0x30,0x1F,0x02,0x26, +0x0F,0x00,0x80,0x10, +0x02,0x00,0x03,0x24, +0x04,0x00,0x02,0x24, +0x11,0x00,0x62,0x10, +0x30,0x1F,0x13,0x26, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x20,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x18,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x40,0x10,0x11,0x00, +0x04,0x00,0x43,0x30, +0x04,0x00,0x02,0x24, +0xF1,0xFF,0x62,0x14, +0x30,0x1F,0x13,0x26, +0x08,0x3E,0x66,0x96, +0x30,0x3B,0x65,0x92, +0x02,0x80,0x04,0x3C, +0xB0,0x1B,0x63,0xA6, +0xD4,0xE0,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x25,0xB0,0x10,0x3C, +0x50,0x02,0x03,0x36, +0x0F,0x00,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x21,0x28,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x30,0x3B,0x64,0x92, +0x01,0x00,0x14,0x24, +0x4F,0x0C,0x00,0x0C, +0x4C,0x00,0x10,0x36, +0x02,0x80,0x11,0x3C, +0x00,0x00,0x14,0xA2, +0x21,0x0E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x37,0x50,0x00,0x0C, +0xE4,0x58,0x24,0x26, +0x21,0x28,0x40,0x00, +0xE4,0x58,0x24,0x26, +0x7D,0x50,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x0F,0x00,0x50,0x30, +0xE4,0x58,0x24,0x26, +0x96,0x50,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x40,0x02,0x10,0x36, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x30,0x40,0x00, +0x21,0x28,0x00,0x02, +0x2F,0x55,0x00,0x0C, +0x04,0xE1,0x84,0x24, +0x21,0x20,0x00,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xF3,0x3D,0x84,0x24, +0x88,0x58,0xA5,0x24, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0xC2,0x1E,0x74,0xA2, +0x0F,0x48,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9C,0x11,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x62,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x34, +0x53,0x1E,0x00,0x0C, +0xB0,0x1B,0x62,0xA6, +0xEC,0x38,0x62,0xAE, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x04,0x24, +0x48,0x0E,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x78,0x3D,0x44,0x8C, +0x01,0x20,0x03,0x24, +0xB0,0x1B,0x43,0xA4, +0x02,0x00,0x85,0x10, +0x0C,0x00,0x03,0x24, +0x0F,0x00,0x03,0x24, +0x25,0xB0,0x02,0x3C, +0x50,0x02,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x30,0x1F,0x10,0x26, +0xB0,0x1B,0x02,0x96, +0x08,0x3E,0x06,0x96, +0x30,0x3B,0x05,0x92, +0x10,0x00,0x42,0x34, +0x02,0x80,0x04,0x3C, +0xB0,0x1B,0x02,0xA6, +0x2F,0x55,0x00,0x0C, +0xB0,0xE0,0x84,0x24, +0x21,0x28,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x53,0x1E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEC,0x38,0x02,0xAE, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x65,0x24, +0x50,0x3E,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x0A,0x3E,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x2C, +0x1A,0x00,0x40,0x10, +0x21,0x38,0xA0,0x00, +0x98,0x3E,0xA4,0x8C, +0x94,0x3E,0xA5,0x8C, +0x21,0x30,0x00,0x00, +0x80,0x10,0x04,0x00, +0x80,0x18,0x05,0x00, +0x2B,0x10,0x45,0x00, +0x04,0x00,0x40,0x14, +0x2B,0x18,0x64,0x00, +0x01,0x00,0x06,0x24, +0x02,0x00,0x02,0x24, +0x0A,0x30,0x43,0x00, +0x0A,0x3E,0xE2,0x90, +0x94,0x3E,0xE0,0xAC, +0x98,0x3E,0xE0,0xAC, +0x40,0x18,0x02,0x00, +0x21,0x18,0x62,0x00, +0x21,0x18,0x66,0x00, +0x02,0x80,0x02,0x3C, +0x48,0xDD,0x42,0x24, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0x64,0x8C, +0x25,0xB0,0x02,0x3C, +0xD8,0x01,0x42,0x34, +0x00,0x00,0x44,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x00,0x84,0x90, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x0F,0x00,0x84,0x30, +0xC0,0x20,0x04,0x00, +0x21,0x20,0x90,0x00, +0x1C,0x00,0x84,0x24, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x06,0x00,0x40,0x10, +0x21,0x20,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x92,0x10,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x80,0xFF,0xBD,0x27, +0x02,0x80,0x06,0x3C, +0x02,0x80,0x08,0x3C, +0x78,0x00,0xBE,0xAF, +0x7C,0x00,0xBF,0xAF, +0x74,0x00,0xB7,0xAF, +0x70,0x00,0xB6,0xAF, +0x6C,0x00,0xB5,0xAF, +0x68,0x00,0xB4,0xAF, +0x64,0x00,0xB3,0xAF, +0x60,0x00,0xB2,0xAF, +0x5C,0x00,0xB1,0xAF, +0x58,0x00,0xB0,0xAF, +0xD0,0xEA,0xC2,0x24, +0xE4,0xEA,0x03,0x25, +0x01,0x00,0x44,0x90, +0x01,0x00,0x65,0x90, +0xD0,0xEA,0xCB,0x90, +0xE4,0xEA,0x0A,0x91, +0x02,0x00,0x47,0x90, +0x02,0x00,0x66,0x90, +0x03,0x00,0x48,0x90, +0x03,0x00,0x69,0x90, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x25,0x20,0x8B,0x00, +0x25,0x28,0xAA,0x00, +0x00,0x3C,0x07,0x00, +0x00,0x34,0x06,0x00, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x00,0x46,0x08,0x00, +0x00,0x4E,0x09,0x00, +0x25,0x40,0x07,0x01, +0x25,0x48,0x26,0x01, +0x00,0x02,0x04,0x24, +0x40,0x00,0xA8,0xAF, +0x25,0x24,0x00,0x0C, +0x48,0x00,0xA9,0xAF, +0xB0,0x01,0x40,0x10, +0x21,0xF0,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x52,0x24, +0xC4,0x39,0x45,0x8E, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x34,0xE1,0x84,0x24, +0x08,0x00,0xD1,0x97, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x10,0x3C, +0x25,0x88,0x22,0x02, +0x88,0x58,0x10,0x26, +0x24,0x00,0x24,0x26, +0x21,0x28,0x00,0x02, +0x20,0x00,0x20,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x24,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x21,0x28,0x00,0x02, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x30,0x00,0x24,0x26, +0x18,0x00,0x03,0x24, +0x0C,0x00,0xC3,0xAF, +0xF8,0x1D,0x42,0x96, +0x20,0x00,0x25,0x26, +0x38,0x00,0x37,0x26, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x22,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x42,0xA6, +0x17,0x00,0xA4,0xA0, +0x02,0x80,0x04,0x3C, +0x16,0x00,0xA3,0xA0, +0x32,0x4F,0x00,0x0C, +0xF8,0x58,0x84,0x24, +0x21,0x28,0x40,0x00, +0x21,0x20,0xE0,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x3A,0x00,0x24,0x26, +0x18,0x00,0xA5,0x27, +0x02,0x00,0x06,0x24, +0x03,0x00,0x02,0x24, +0x10,0x52,0x00,0x0C, +0x18,0x00,0xA2,0xA7, +0x0C,0x00,0xC3,0x8F, +0x02,0x80,0x07,0x3C, +0x3C,0x00,0x24,0x26, +0x04,0x00,0x63,0x24, +0x0C,0x00,0xC3,0xAF, +0x60,0x39,0x46,0x8E, +0x0C,0x00,0xC2,0x27, +0x94,0x58,0xE7,0x24, +0x21,0x28,0x00,0x00, +0x54,0x00,0xA2,0xAF, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x20,0x00,0xA4,0x27, +0x50,0x00,0xA5,0x27, +0x21,0x50,0x00,0x0C, +0x21,0xB8,0x40,0x00, +0x50,0x00,0xA8,0x8F, +0x21,0x88,0x00,0x00, +0x52,0x00,0x00,0x11, +0x21,0x80,0x00,0x00, +0x21,0x38,0x40,0x02, +0x18,0x00,0xA9,0x27, +0x21,0x10,0x31,0x01, +0x08,0x00,0x46,0x90, +0x21,0x20,0x00,0x00, +0x7F,0x00,0xC5,0x30, +0x21,0x10,0x87,0x00, +0xB4,0x39,0x43,0x90, +0x01,0x00,0x84,0x24, +0x7F,0x00,0x63,0x30, +0x3D,0x00,0xA3,0x10, +0x0D,0x00,0x82,0x2C, +0xFA,0xFF,0x40,0x14, +0x21,0x10,0x87,0x00, +0x01,0x00,0x31,0x26, +0x2B,0x10,0x28,0x02, +0xF2,0xFF,0x40,0x14, +0x21,0x10,0x31,0x01, +0x09,0x00,0x02,0x2E, +0x3D,0x00,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x54,0x00,0xA2,0x8F, +0x01,0x00,0x05,0x24, +0x08,0x00,0x06,0x24, +0x30,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0x20,0x40,0x00, +0x54,0x00,0xA2,0x8F, +0xF8,0xFF,0x06,0x26, +0x32,0x00,0x05,0x24, +0x38,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x78,0x3D,0x83,0x8C, +0x02,0x00,0x02,0x24, +0x37,0x00,0x62,0x14, +0x00,0x00,0x00,0x00, +0xC4,0x39,0x83,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x23,0x02, +0x32,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x46,0x24, +0x21,0x20,0x60,0x00, +0x4D,0x13,0x00,0x08, +0x30,0x00,0x05,0x24, +0x01,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x24,0x02, +0x27,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x18,0x26,0x02, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x45,0x14, +0x02,0x80,0x07,0x3C, +0x01,0x00,0x66,0x90, +0x54,0x00,0xA2,0x8F, +0xFA,0x58,0xE7,0x24, +0x21,0x20,0xE0,0x02, +0x21,0x38,0x27,0x02, +0x30,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x73,0x13,0x00,0x08, +0x21,0xB8,0x40,0x00, +0x21,0x10,0x30,0x01, +0x18,0x00,0x46,0xA0, +0x50,0x00,0xA8,0x8F, +0x01,0x00,0x31,0x26, +0x2B,0x10,0x28,0x02, +0xB4,0xFF,0x40,0x14, +0x01,0x00,0x10,0x26, +0x27,0x13,0x00,0x08, +0x09,0x00,0x02,0x2E, +0x54,0x00,0xA2,0x8F, +0x21,0x20,0xE0,0x02, +0x21,0x30,0x00,0x02, +0x01,0x00,0x05,0x24, +0x30,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x78,0x3D,0x83,0x8C, +0x02,0x00,0x02,0x24, +0xCB,0xFF,0x62,0x10, +0x00,0x00,0x00,0x00, +0xD5,0x1D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x16,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0xC4,0x39,0x62,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x22,0x02, +0x10,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x52,0x24, +0x21,0x80,0x60,0x00, +0x02,0x80,0x13,0x3C, +0x21,0x20,0x32,0x02, +0x00,0x00,0x83,0x90, +0x2D,0x00,0x02,0x24, +0xCB,0x00,0x62,0x10, +0x02,0x80,0x05,0x3C, +0x01,0x00,0x82,0x90, +0xC4,0x39,0x03,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0xF6,0xFF,0x60,0x14, +0x21,0x20,0x32,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x78,0x3D,0x83,0x8C, +0x02,0x00,0x02,0x24, +0x82,0x00,0x62,0x10, +0x0C,0x00,0x11,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0xC4,0x39,0x62,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x22,0x02, +0x26,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x56,0x24, +0x21,0xA8,0x60,0x00, +0xDD,0x00,0x14,0x24, +0xA5,0x13,0x00,0x08, +0x02,0x80,0x13,0x3C, +0x01,0x00,0x02,0x92, +0xC4,0x39,0xA3,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0x1B,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x36,0x02, +0x00,0x00,0x02,0x92, +0x02,0x00,0x12,0x26, +0x21,0x20,0x40,0x02, +0xD0,0xDD,0x65,0x26, +0xF3,0xFF,0x54,0x14, +0x06,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x54,0x00,0xA2,0x8F, +0xDD,0x00,0x05,0x24, +0x21,0x38,0x40,0x02, +0x07,0x00,0x06,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x08,0x00,0x04,0x92, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x45,0x24, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x0F,0x5F,0x44,0xA0, +0x10,0x3E,0xA3,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0xC4,0x39,0x82,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x22,0x02, +0x20,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x58,0x56,0x24, +0xFA,0x58,0x75,0x24, +0x21,0xA0,0x80,0x00, +0xD2,0x13,0x00,0x08, +0xDD,0x00,0x13,0x24, +0x01,0x00,0x02,0x92, +0xC4,0x39,0x83,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0x14,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x36,0x02, +0x00,0x00,0x02,0x92, +0x21,0x90,0x35,0x02, +0x21,0x20,0x40,0x02, +0x48,0x00,0xA5,0x27, +0xF3,0xFF,0x53,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x01,0x00,0x06,0x92, +0x54,0x00,0xA2,0x8F, +0x21,0x38,0x40,0x02, +0xDD,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x0A,0x3E,0x02,0x92, +0x50,0x3E,0x03,0x8E, +0x05,0x00,0x42,0x38, +0x01,0x00,0x63,0x38, +0x01,0x00,0x42,0x2C, +0x01,0x00,0x63,0x2C, +0x24,0x10,0x43,0x00, +0x58,0x00,0x40,0x14, +0x02,0x80,0x07,0x3C, +0xC4,0x39,0x05,0x8E, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x25,0x02, +0x0F,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x46,0x24, +0x44,0x00,0x04,0x24, +0x21,0x80,0x26,0x02, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x3E,0x00,0x44,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x25,0x02, +0xF6,0xFF,0x60,0x14, +0x21,0x80,0x26,0x02, +0x21,0x20,0xC0,0x03, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x21,0x10,0x00,0x00, +0x7C,0x00,0xBF,0x8F, +0x78,0x00,0xBE,0x8F, +0x74,0x00,0xB7,0x8F, +0x70,0x00,0xB6,0x8F, +0x6C,0x00,0xB5,0x8F, +0x68,0x00,0xB4,0x8F, +0x64,0x00,0xB3,0x8F, +0x60,0x00,0xB2,0x8F, +0x5C,0x00,0xB1,0x8F, +0x58,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x80,0x00,0xBD,0x27, +0xC4,0x39,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x22,0x02, +0x7B,0xFF,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x58,0x56,0x24, +0xFA,0x58,0x75,0x24, +0x21,0xA0,0x80,0x00, +0x25,0x14,0x00,0x08, +0xDD,0x00,0x13,0x24, +0x01,0x00,0x02,0x92, +0xC4,0x39,0x83,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0x6F,0xFF,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x36,0x02, +0x00,0x00,0x02,0x92, +0x21,0x90,0x35,0x02, +0x21,0x20,0x40,0x02, +0x40,0x00,0xA5,0x27, +0xF3,0xFF,0x53,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x01,0x00,0x06,0x92, +0x54,0x00,0xA2,0x8F, +0x21,0x38,0x40,0x02, +0xDD,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x92,0x13,0x00,0x08, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x48,0xE1,0x84,0x24, +0x01,0x00,0x06,0x92, +0x54,0x00,0xA2,0x8F, +0x02,0x80,0x07,0x3C, +0xFA,0x58,0xE7,0x24, +0x21,0x38,0x27,0x02, +0x21,0x20,0xE0,0x02, +0x44,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x03,0x14,0x00,0x08, +0x21,0x20,0xC0,0x03, +0x54,0x00,0xA2,0x8F, +0x21,0x20,0xE0,0x02, +0x9C,0xDD,0xE7,0x24, +0xDD,0x00,0x05,0x24, +0x06,0x00,0x06,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xEF,0x13,0x00,0x08, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x14,0x3C, +0xFA,0x58,0xA5,0x24, +0x21,0x28,0x25,0x02, +0x88,0x5D,0x84,0x26, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x06,0x24, +0x02,0x80,0x03,0x3C, +0xF1,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x1D,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x58,0x3E,0x02,0x96, +0x00,0x00,0x00,0x00, +0xBD,0xFF,0x42,0x30, +0x58,0x3E,0x02,0xA6, +0x02,0x80,0x02,0x3C, +0x58,0x3E,0x03,0x96, +0xDE,0x5D,0x44,0x90, +0x0C,0x00,0x63,0x34, +0x01,0x00,0x84,0x30, +0x15,0x00,0x80,0x10, +0x58,0x3E,0x03,0xA6, +0x02,0x80,0x05,0x3C, +0x8B,0x5D,0x64,0x26, +0x3C,0xE3,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x10,0x00,0x06,0x24, +0x21,0x10,0x32,0x02, +0x01,0x00,0x46,0x90, +0x54,0x00,0xA2,0x8F, +0x21,0x20,0xE0,0x02, +0x88,0x5D,0x87,0x26, +0x2D,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x01,0x00,0x02,0x24, +0x8C,0x13,0x00,0x08, +0x50,0x3E,0x02,0xAE, +0x58,0x3E,0x02,0x96, +0x5D,0x14,0x00,0x08, +0x02,0x00,0x42,0x34, +0x02,0x80,0x05,0x3C, +0x8B,0x5D,0x64,0x26, +0x68,0x14,0x00,0x08, +0x4C,0xE3,0xA5,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x28,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xD4,0xEA,0xA5,0x24, +0x07,0x14,0x00,0x08, +0xFF,0xFF,0x02,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xB0,0x1B,0x43,0x94, +0xC8,0x00,0x04,0x24, +0xD0,0x38,0x44,0xAC, +0x9F,0xFE,0x63,0x30, +0x80,0x00,0x63,0x34, +0xB0,0x1B,0x43,0xA4, +0x6C,0x3D,0x40,0xAC, +0x70,0x3D,0x40,0xAC, +0xA5,0x12,0x00,0x08, +0xB4,0x38,0x40,0xAC, +0xD8,0xFF,0xBD,0x27, +0x28,0x00,0xA4,0xA3, +0x00,0x01,0x04,0x24, +0x18,0x00,0xB2,0xAF, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x2C,0x00,0xA5,0xA3, +0x25,0x24,0x00,0x0C, +0x30,0x00,0xA6,0xA7, +0x94,0x00,0x40,0x10, +0x21,0x90,0x40,0x00, +0x30,0x00,0xA7,0x97, +0x28,0x00,0xA5,0x93, +0x2C,0x00,0xA6,0x93, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x68,0xE1,0x84,0x24, +0x08,0x00,0x50,0x96, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x11,0x3C, +0x25,0x80,0x02,0x02, +0x88,0x58,0x31,0x26, +0x21,0x28,0x20,0x02, +0x24,0x00,0x04,0x26, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x00,0xA6, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x21,0x28,0x20,0x02, +0x30,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x20,0x00,0x05,0x26, +0x03,0xFF,0x63,0x30, +0xD0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x02,0x80,0x03,0x3C, +0x0C,0x00,0x42,0xAE, +0x30,0x1F,0x73,0x24, +0xF8,0x1D,0x62,0x96, +0x0C,0x00,0x51,0x26, +0x28,0x00,0xA6,0x27, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x22,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x62,0xA6, +0x21,0x38,0x20,0x02, +0x16,0x00,0xA3,0xA0, +0x17,0x00,0xA4,0xA0, +0x38,0x00,0x04,0x26, +0x68,0x4F,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x21,0x20,0x40,0x00, +0x01,0x00,0x05,0x24, +0x2C,0x00,0xA6,0x27, +0x68,0x4F,0x00,0x0C, +0x21,0x38,0x20,0x02, +0x28,0x00,0xA3,0x93, +0x21,0x20,0x40,0x00, +0x03,0x00,0x02,0x24, +0x0C,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x21,0x20,0x40,0x02, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x2C,0x00,0xA3,0x93, +0x00,0x00,0x00,0x00, +0x2E,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x19,0x3E,0x63,0x92, +0x21,0x80,0x60,0x02, +0x01,0x00,0x68,0x24, +0xFF,0x00,0x02,0x31, +0xFD,0xFF,0x40,0x10, +0x21,0x18,0x00,0x01, +0x02,0x80,0x06,0x3C, +0x19,0x3E,0x08,0xA2, +0x21,0x38,0x20,0x02, +0x49,0x5D,0xC6,0x24, +0x68,0x4F,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x30,0x00,0xA3,0x97, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x0F,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x02,0x08,0x63,0x34, +0x1C,0x3E,0x03,0xA6, +0x4C,0x5D,0xC6,0x24, +0x21,0x20,0x40,0x00, +0x68,0x4F,0x00,0x0C, +0x02,0x00,0x05,0x24, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x4E,0x5D,0xC6,0x24, +0x21,0x20,0x40,0x00, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x1E,0x3E,0x00,0xA6, +0x30,0x00,0xA3,0x97, +0x21,0x20,0x40,0x00, +0x02,0x80,0x06,0x3C, +0x07,0x00,0x63,0x30, +0x40,0x18,0x03,0x00, +0x21,0x18,0x70,0x00, +0xE8,0x1D,0x62,0x94, +0x50,0x5D,0xC6,0x24, +0x21,0x38,0x20,0x02, +0x00,0x11,0x02,0x00, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x20,0x3E,0x02,0xA6, +0xD8,0x14,0x00,0x08, +0x21,0x20,0x40,0x02, +0xC3,0xFF,0x62,0x14, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x48,0x5D,0xC6,0x24, +0x68,0x4F,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x21,0x20,0x40,0x00, +0x30,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x02,0x00,0x05,0x24, +0x1C,0x3E,0x63,0x96, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x3F,0x00,0x63,0x30, +0x00,0x08,0x63,0x34, +0x21,0x20,0x40,0x00, +0x4C,0x5D,0xC6,0x24, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x1C,0x3E,0x63,0xA6, +0x02,0x80,0x06,0x3C, +0x21,0x20,0x40,0x00, +0x4E,0x5D,0xC6,0x24, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x02,0x00,0x05,0x24, +0xD8,0x14,0x00,0x08, +0x21,0x20,0x40,0x02, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x5C,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xE8,0xEA,0xA5,0x24, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xE0,0xFF,0xBD,0x27, +0x18,0x03,0x42,0x34, +0xF0,0x54,0x63,0x24, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x00,0x00,0x43,0xAC, +0x02,0x00,0x82,0x90, +0x02,0x80,0x05,0x3C, +0x88,0x58,0xA5,0x24, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x28,0x00,0x04,0x26, +0x06,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x18,0x00,0x11,0x26, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x55,0x50,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xF1,0xFF,0x40,0x14, +0x03,0x00,0x02,0x24, +0x30,0x00,0x03,0x92, +0x00,0x00,0x00,0x00, +0xED,0xFF,0x62,0x14, +0x30,0x00,0x07,0x26, +0x02,0x80,0x06,0x3C, +0x30,0x1F,0xC8,0x24, +0x50,0x3E,0x02,0x8D, +0x00,0x00,0x00,0x00, +0xE7,0xFF,0x40,0x10, +0x01,0x00,0x05,0x24, +0x01,0x00,0xE3,0x90, +0x00,0x00,0x00,0x00, +0x1A,0x00,0x65,0x10, +0x02,0x00,0x62,0x28, +0x2E,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0xDF,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x03,0x00,0xE3,0x90, +0x00,0x00,0x00,0x00, +0x08,0x00,0x62,0x30, +0x0A,0x00,0x40,0x14, +0x02,0x11,0x03,0x00, +0x1A,0x3E,0x03,0x91, +0x04,0x10,0x45,0x00, +0x27,0x10,0x02,0x00, +0x24,0x10,0x43,0x00, +0x1A,0x3E,0x02,0xA1, +0x05,0x00,0xE3,0x90, +0x04,0x00,0xE2,0x90, +0x00,0x1A,0x03,0x00, +0x25,0x90,0x62,0x00, +0x1A,0x3E,0x05,0x91, +0x02,0x80,0x04,0x3C, +0x94,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x52,0x15,0x00,0x08, +0x00,0x00,0x00,0x00, +0x04,0x00,0xE2,0x90, +0x03,0x00,0xE4,0x90, +0x05,0x00,0xE3,0x90, +0x00,0x12,0x02,0x00, +0x25,0x10,0x44,0x00, +0x82,0x18,0x03,0x00, +0x27,0x00,0x40,0x14, +0x07,0x00,0x64,0x30, +0x1A,0x3E,0x03,0x91, +0x04,0x10,0x85,0x00, +0x25,0x10,0x43,0x00, +0x1A,0x3E,0x02,0xA1, +0x30,0x1F,0xC2,0x24, +0x4C,0x3E,0x43,0x90, +0x1A,0x3E,0x45,0x90, +0x02,0x80,0x04,0x3C, +0x21,0x18,0x62,0x00, +0x84,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x44,0x3E,0x60,0xA0, +0x52,0x15,0x00,0x08, +0x00,0x00,0x00,0x00, +0xB2,0xFF,0x60,0x14, +0x03,0x00,0x04,0x24, +0x02,0x00,0xE2,0x90, +0x01,0x00,0x05,0x24, +0x18,0x3E,0x02,0xA1, +0x04,0x00,0xE3,0x90, +0x03,0x00,0xE2,0x90, +0x21,0x30,0x00,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x18,0x62,0x00, +0x1C,0x3E,0x03,0xA5, +0x06,0x00,0xE2,0x90, +0x05,0x00,0xE3,0x90, +0x00,0x12,0x02,0x00, +0x25,0x10,0x43,0x00, +0x1E,0x3E,0x02,0xA5, +0x08,0x00,0xE3,0x90, +0x07,0x00,0xE2,0x90, +0x00,0x1A,0x03,0x00, +0x25,0x18,0x62,0x00, +0x90,0x14,0x00,0x0C, +0x20,0x3E,0x03,0xA5, +0x52,0x15,0x00,0x08, +0x00,0x00,0x00,0x00, +0x1A,0x3E,0x03,0x91, +0x04,0x10,0x85,0x00, +0x27,0x10,0x02,0x00, +0x94,0x15,0x00,0x08, +0x24,0x10,0x43,0x00, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB5,0xAF, +0xFF,0xFF,0x95,0x30, +0x00,0x01,0x04,0x24, +0x38,0x00,0xB6,0xAF, +0x28,0x00,0xB2,0xAF, +0x3C,0x00,0xBF,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x24,0x00,0xB1,0xAF, +0x25,0x24,0x00,0x0C, +0x20,0x00,0xB0,0xAF, +0x21,0x90,0x40,0x00, +0x7A,0x00,0x40,0x10, +0x21,0xB0,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xB0,0xE1,0x84,0x24, +0x08,0x00,0x50,0x96, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x11,0x3C, +0x25,0x80,0x02,0x02, +0x88,0x58,0x31,0x26, +0x24,0x00,0x04,0x26, +0x21,0x28,0x20,0x02, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x30,0x00,0x04,0x26, +0x21,0x28,0x20,0x02, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x13,0x3C, +0x03,0xFF,0x63,0x30, +0xB0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0x68,0x26, +0x0C,0x00,0x42,0xAE, +0xF8,0x1D,0x02,0x95, +0x20,0x00,0x14,0x26, +0x0C,0x00,0x51,0x26, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x22,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x02,0xA5, +0x17,0x00,0x84,0xA2, +0x16,0x00,0x83,0xA2, +0x74,0x3D,0x04,0x8D, +0x03,0x00,0x02,0x24, +0x3C,0x00,0x82,0x10, +0x38,0x00,0x10,0x26, +0x30,0x1F,0x73,0x26, +0x78,0x3D,0x62,0x8E, +0x21,0x20,0x00,0x02, +0x02,0x00,0x05,0x24, +0x01,0x00,0x42,0x38, +0x01,0x00,0x42,0x2C, +0x18,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x18,0x00,0xA2,0xA7, +0x74,0x3D,0x63,0x8E, +0x21,0x20,0x40,0x00, +0x02,0x00,0x05,0x24, +0x18,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x18,0x00,0xA3,0xA7, +0x21,0x20,0x40,0x00, +0x02,0x00,0x05,0x24, +0x18,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x18,0x00,0xB5,0xA7, +0x74,0x3D,0x63,0x8E, +0x21,0x80,0x40,0x00, +0x03,0x00,0x02,0x24, +0x0F,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x21,0x20,0x40,0x02, +0x21,0x30,0xC0,0x02, +0xB9,0x0C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0xB0,0x1B,0x62,0x96, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0xEF,0xFF,0x40,0x10, +0x21,0x20,0x40,0x02, +0x02,0x80,0x07,0x3C, +0x21,0x20,0x00,0x02, +0xB8,0x5C,0xE7,0x24, +0x10,0x00,0x05,0x24, +0x80,0x00,0x06,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB1,0xAF, +0x00,0x00,0x83,0x96, +0x01,0x00,0x16,0x24, +0x00,0x40,0x63,0x34, +0x13,0x16,0x00,0x08, +0x00,0x00,0x83,0xA6, +0xB0,0x1B,0x02,0x95, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0xC1,0xFF,0x40,0x10, +0x21,0x20,0x00,0x02, +0x80,0x3D,0x03,0x8D, +0x84,0x3D,0x02,0x8D, +0x80,0x1F,0x03,0x00, +0x25,0x18,0x43,0x00, +0x04,0x00,0x05,0x24, +0x01,0x00,0x42,0x24, +0x1C,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x84,0x3D,0x02,0xAD, +0x68,0x4F,0x00,0x0C, +0x1C,0x00,0xA3,0xAF, +0xF7,0x15,0x00,0x08, +0x21,0x80,0x40,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xA4,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xF8,0xEA,0xA5,0x24, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xB0,0x1B,0x62,0x94, +0x01,0x00,0x05,0x24, +0x21,0x20,0x00,0x00, +0xEF,0xFF,0x42,0x30, +0x20,0x00,0x42,0x34, +0xB0,0x1B,0x62,0xA4, +0xC8,0x00,0x02,0x24, +0x74,0x3D,0x65,0xAC, +0xB4,0x38,0x62,0xAC, +0xD0,0x38,0x60,0xAC, +0x6C,0x3D,0x60,0xAC, +0xBC,0x15,0x00,0x08, +0x70,0x3D,0x60,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xA8,0xFF,0xBD,0x27, +0x50,0x00,0xBE,0xAF, +0x40,0x00,0xB4,0xAF, +0x3C,0x00,0xB3,0xAF, +0x54,0x00,0xBF,0xAF, +0x4C,0x00,0xB7,0xAF, +0x48,0x00,0xB6,0xAF, +0x44,0x00,0xB5,0xAF, +0x38,0x00,0xB2,0xAF, +0x34,0x00,0xB1,0xAF, +0x30,0x00,0xB0,0xAF, +0x21,0xA0,0x80,0x00, +0x02,0x00,0x84,0x90, +0x21,0xF0,0x00,0x00, +0x24,0x00,0xA0,0xAF, +0x0F,0x00,0x84,0x30, +0xC0,0x20,0x04,0x00, +0x21,0x20,0x94,0x00, +0x18,0x00,0x93,0x24, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x15,0x3C, +0x28,0x00,0x84,0x24, +0x88,0x58,0xA5,0x26, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x0F,0x00,0x40,0x14, +0x02,0x80,0x16,0x3C, +0xF4,0x5E,0xC2,0x92, +0x00,0x00,0x00,0x00, +0x29,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0xC2,0x92, +0x00,0x00,0x00,0x00, +0x07,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x3C,0x01,0x40,0x14, +0x05,0x00,0x05,0x24, +0x00,0x60,0x92,0x40, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0xB0,0x1B,0x03,0x96, +0x00,0x00,0x00,0x00, +0x00,0x10,0x62,0x30, +0x24,0x01,0x40,0x14, +0x10,0x00,0x62,0x30, +0xCB,0x00,0x40,0x14, +0x10,0x00,0x64,0x26, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x92,0x24, +0xB0,0x1B,0x42,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x4E,0x01,0x40,0x14, +0x21,0x18,0x00,0x00, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x30,0x1F,0x43,0x24, +0xB0,0x1B,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0xD3,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x3B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0xCF,0xFF,0x40,0x14, +0x02,0x80,0x0B,0x3C, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0x55,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xFA,0x5E,0x40,0xA0, +0x1C,0x5F,0x60,0xAC, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0xFD,0xFF,0x03,0x24, +0x02,0x80,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x82,0xA0, +0x42,0xB0,0x17,0x3C, +0x00,0x00,0xE3,0x92, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xE4,0x36, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xE3,0xA2, +0x00,0x00,0x82,0xA0, +0x02,0x80,0x04,0x3C, +0xFC,0x5E,0x82,0x94, +0x20,0x00,0x63,0x96, +0xFF,0xFF,0x42,0x30, +0x0A,0x00,0x43,0x10, +0x02,0x80,0x07,0x3C, +0x25,0xB0,0x02,0x3C, +0x94,0x00,0x42,0x34, +0xFC,0x5E,0x83,0xA4, +0x00,0x00,0x43,0xA4, +0xFC,0x5E,0x83,0x94, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x63,0x30, +0x80,0x1A,0x03,0x00, +0x00,0x5F,0xE3,0xAC, +0x25,0xB0,0x04,0x3C, +0x84,0x00,0x82,0x34, +0x00,0x00,0x50,0x8C, +0x80,0x00,0x84,0x34, +0x00,0x00,0x82,0x8C, +0x21,0x18,0x00,0x00, +0x00,0x5F,0xE6,0x8C, +0x00,0x88,0x10,0x00, +0x21,0x80,0x00,0x00, +0x25,0x80,0x02,0x02, +0x25,0x88,0x23,0x02, +0x21,0x20,0x00,0x02, +0x21,0x28,0x20,0x02, +0x28,0x00,0xA7,0xAF, +0xBA,0x34,0x00,0x0C, +0x2C,0x00,0xAB,0xAF, +0x28,0x00,0xA7,0x8F, +0x02,0x80,0x0A,0x3C, +0x21,0x28,0x00,0x00, +0x00,0x5F,0xE8,0x8C, +0x04,0x5F,0x43,0x95, +0x21,0x28,0xB1,0x00, +0x23,0x48,0x02,0x01, +0x21,0x20,0x30,0x01, +0x2B,0x10,0x90,0x00, +0xFF,0xFF,0x63,0x30, +0x80,0x1A,0x03,0x00, +0x21,0x28,0xA2,0x00, +0x21,0x38,0x00,0x00, +0x2B,0x40,0x83,0x00, +0x23,0x28,0xA7,0x00, +0x23,0x20,0x83,0x00, +0x23,0x28,0xA8,0x00, +0x02,0x80,0x03,0x3C, +0x20,0x5F,0x64,0xAC, +0x24,0x5F,0x65,0xAC, +0x04,0x5F,0x42,0x95, +0x2C,0x00,0xAB,0x8F, +0xFF,0xFF,0x42,0x30, +0x80,0x12,0x02,0x00, +0x2B,0x10,0x49,0x00, +0x31,0x01,0x40,0x10, +0x00,0x00,0x00,0x00, +0x04,0x5F,0x42,0x95, +0x00,0x00,0xE4,0x92, +0xFB,0xFF,0x03,0x24, +0xFF,0xFF,0x42,0x30, +0x80,0x12,0x02,0x00, +0x24,0x20,0x83,0x00, +0x23,0x48,0x22,0x01, +0x00,0x00,0xE4,0xA2, +0x01,0x00,0x06,0x24, +0x04,0x00,0x20,0x11, +0x01,0x00,0x04,0x24, +0x80,0x10,0x09,0x00, +0x21,0x10,0x49,0x00, +0x80,0x30,0x02,0x00, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x00,0x00,0x87,0x8E, +0x05,0x00,0x05,0x24, +0x24,0x00,0x64,0x26, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0x2E,0x00,0x40,0x10, +0x21,0x28,0x40,0x00, +0xF4,0x5E,0xC2,0x92, +0x02,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x45,0x01,0x43,0x10, +0x02,0x80,0x07,0x3C, +0x02,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x08,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x04,0x00,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x30, +0x04,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x1E,0x24, +0x12,0x5F,0x5E,0xA0, +0x04,0x00,0xA3,0x90, +0x20,0x00,0xA7,0x8F, +0x00,0x00,0x00,0x00, +0x04,0x00,0xE2,0x28, +0x18,0x00,0x40,0x14, +0xFE,0x00,0x66,0x30, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0x50,0x39,0x64,0x94, +0xC0,0x10,0x06,0x00, +0x2A,0x10,0x82,0x00, +0x12,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x21,0x10,0xC7,0x00, +0xFD,0xFF,0x42,0x24, +0xC0,0x10,0x02,0x00, +0x2A,0x10,0x44,0x00, +0x0C,0x00,0x40,0x14, +0xC2,0x10,0x04,0x00, +0x23,0x30,0x46,0x00, +0x21,0x18,0xA6,0x00, +0x05,0x00,0x62,0x90, +0x07,0x00,0x84,0x30, +0x01,0x00,0x03,0x24, +0x07,0x10,0x82,0x00, +0x24,0x00,0xA4,0x8F, +0x01,0x00,0x42,0x30, +0x0B,0x20,0x62,0x00, +0x24,0x00,0xA4,0xAF, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0xEF,0xFF,0x03,0x24, +0x02,0x80,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x82,0xA0, +0xF4,0x5E,0xC3,0x92, +0x02,0x80,0x02,0x3C, +0x24,0xE9,0x42,0x24, +0xFF,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0x66,0x8C, +0x24,0x00,0xA5,0x8F, +0x09,0xF8,0xC0,0x00, +0x21,0x20,0xC0,0x03, +0x90,0x16,0x00,0x08, +0x00,0x00,0x00,0x00, +0x88,0x58,0xA5,0x26, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x33,0xFF,0x40,0x14, +0x02,0x80,0x04,0x3C, +0x06,0x00,0x02,0x24, +0x0A,0x3E,0x02,0xA2, +0xEC,0x38,0x00,0xAE, +0x00,0x00,0x84,0x8E, +0x0C,0x00,0x12,0x24, +0xFF,0x3F,0x82,0x30, +0xE8,0xFF,0x42,0x24, +0x2A,0x10,0x42,0x02, +0xA4,0x00,0x40,0x10, +0x21,0xA8,0x00,0x02, +0x7D,0x17,0x00,0x08, +0x21,0x80,0x72,0x02, +0x19,0x00,0x03,0x92, +0xFF,0x3F,0x82,0x30, +0xE8,0xFF,0x42,0x24, +0x21,0x18,0x72,0x00, +0x02,0x00,0x72,0x24, +0x2A,0x10,0x42,0x02, +0x9A,0x00,0x40,0x10, +0x21,0x80,0x72,0x02, +0x18,0x00,0x03,0x92, +0xDD,0x00,0x02,0x24, +0xF5,0xFF,0x62,0x14, +0x1A,0x00,0x11,0x26, +0x02,0x80,0x05,0x3C, +0xC4,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x20,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xC0,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x1A,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xBC,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x0F,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xB8,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x09,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xB4,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x03,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xAC,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x64,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xA8,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x57,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xB0,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x4A,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0x21,0x20,0x20,0x02, +0x9C,0xDD,0xA5,0x24, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x3E,0x01,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x84,0x8E, +0x75,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x92,0x10,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x21,0x18,0x00,0x00, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x00,0x00,0x87,0x8E, +0x24,0x00,0x64,0x26, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0xBE,0xFE,0x40,0x10, +0x21,0x28,0x40,0x00, +0x20,0x00,0xA7,0x8F, +0x04,0x00,0x42,0x90, +0x04,0x00,0xE3,0x28, +0xB9,0xFE,0x60,0x14, +0xFE,0x00,0x46,0x30, +0x50,0x39,0x04,0x96, +0xC0,0x10,0x06,0x00, +0x2A,0x10,0x82,0x00, +0xB4,0xFE,0x40,0x14, +0x21,0x10,0xC7,0x00, +0xFD,0xFF,0x42,0x24, +0xC0,0x10,0x02,0x00, +0x2A,0x10,0x44,0x00, +0xAF,0xFE,0x40,0x14, +0xC2,0x10,0x04,0x00, +0x23,0x30,0x46,0x00, +0x21,0x18,0xA6,0x00, +0x05,0x00,0x62,0x90, +0x07,0x00,0x84,0x30, +0x07,0x10,0x82,0x00, +0x01,0x00,0x42,0x30, +0xA7,0xFE,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x4E,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x90,0x16,0x00,0x08, +0x00,0x00,0x00,0x00, +0x88,0x58,0xA5,0x26, +0x10,0x00,0x64,0x26, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xCB,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0xB0,0x1B,0x43,0x96, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x30, +0x0D,0x00,0x40,0x14, +0x04,0x00,0x62,0x30, +0x83,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0x0B,0x3E,0x02,0x92, +0x00,0x00,0x00,0x00, +0x01,0x00,0x44,0x24, +0xFF,0x00,0x83,0x30, +0x0B,0x00,0x02,0x24, +0x45,0x00,0x62,0x10, +0x21,0x18,0x00,0x00, +0xA1,0x16,0x00,0x08, +0x0B,0x3E,0x04,0xA2, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD4,0x1E,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD4,0x1E,0x42,0xAE, +0x00,0x60,0x83,0x40, +0xFB,0x17,0x00,0x08, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x24, +0x15,0x5F,0x62,0xA1, +0xBD,0x16,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0xFC,0xE2,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x46,0x90, +0x01,0x00,0x03,0x24, +0x10,0x00,0xC3,0x10, +0x02,0x80,0x03,0x3C, +0x53,0x16,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x30,0x1F,0x64,0x24, +0x0A,0x3E,0x83,0x90, +0x03,0x00,0x02,0x24, +0x62,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x91,0x3E,0x86,0xA0, +0x53,0x16,0x00,0x0C, +0x90,0x3E,0x80,0xA0, +0x21,0x18,0x00,0x08, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA1, +0x00,0x00,0xE2,0x92, +0xFB,0xFF,0x03,0x24, +0x01,0x00,0x06,0x24, +0x24,0x10,0x43,0x00, +0x00,0x00,0xE2,0xA2, +0x11,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x43,0x90, +0x01,0x00,0x11,0x24, +0x53,0x00,0x71,0x10, +0x0B,0x3E,0x00,0xA2, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x44,0x90, +0x02,0x00,0x03,0x24, +0x6E,0xFF,0x83,0x14, +0x21,0x18,0x00,0x00, +0x00,0x00,0x87,0x8E, +0x24,0x00,0x64,0x26, +0x2A,0x00,0x05,0x24, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0x65,0xFF,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x62,0x30, +0x4D,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x01,0x00,0x62,0x30, +0x4B,0x00,0x40,0x14, +0x30,0x1F,0x85,0x24, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0xAA,0x00,0x71,0x10, +0x00,0x00,0x00,0x00, +0x10,0x23,0x02,0x8E, +0xFF,0xEF,0x03,0x24, +0x00,0x08,0x42,0x34, +0x24,0x10,0x43,0x00, +0x10,0x23,0x02,0xAE, +0xBE,0x17,0x00,0x08, +0x21,0x18,0x00,0x00, +0x03,0x00,0xA2,0x90, +0x02,0x80,0x04,0x3C, +0x10,0x5F,0xE2,0xA0, +0x02,0x00,0xA3,0x90, +0x21,0x30,0x80,0x00, +0x11,0x5F,0x83,0xA0, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x22,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x10,0x5F,0xE2,0x90, +0x00,0x00,0x00,0x00, +0x11,0x5F,0xC2,0xA0, +0x2A,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x76,0x26, +0x3B,0x51,0x00,0x0C, +0x21,0x20,0xC0,0x02, +0x20,0x00,0x10,0x24, +0x32,0x00,0x50,0x10, +0x21,0xA8,0x40,0x00, +0x00,0x60,0x05,0x40, +0x01,0x00,0xA1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x80,0x18,0x15,0x00, +0x21,0x18,0x75,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0xC0,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x0C,0x1E,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x0C,0x1E,0x62,0xAC, +0x00,0x60,0x85,0x40, +0xBE,0x17,0x00,0x08, +0x21,0x18,0x00,0x00, +0x90,0x3E,0x86,0xA0, +0x53,0x16,0x00,0x0C, +0x91,0x3E,0x80,0xA0, +0x21,0x18,0x00,0x08, +0x00,0x00,0x00,0x00, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x11,0x5F,0xC2,0xA0, +0x2A,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x64,0x12,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4D,0x18,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x01,0x00,0x02,0x24, +0x90,0xE2,0x84,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0xA2,0xA2, +0x02,0x80,0x04,0x3C, +0x78,0xE2,0x84,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0xA0,0xA2, +0x30,0x1F,0x85,0x24, +0x10,0x23,0xA2,0x8C, +0xFF,0xEF,0x03,0x24, +0xFF,0xF7,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x21,0x18,0x00,0x00, +0xBE,0x17,0x00,0x08, +0x10,0x23,0xA2,0xAC, +0xFF,0xFF,0x04,0x24, +0xE3,0x50,0x00,0x0C, +0x21,0x28,0xC0,0x02, +0xCB,0xFF,0x50,0x10, +0x21,0xA8,0x40,0x00, +0x00,0x00,0x87,0x8E, +0x24,0x00,0x70,0x26, +0x21,0x20,0x00,0x02, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x01,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0xDF,0xFD,0x40,0x10, +0x21,0x18,0x00,0x00, +0x20,0x00,0xA6,0x8F, +0x02,0x00,0x45,0x24, +0x10,0x52,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x00,0x00,0x87,0x8E, +0x21,0x20,0x00,0x02, +0x32,0x00,0x05,0x24, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x20,0x00,0xB1,0x8F, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0x09,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x20,0x00,0xA6,0x8F, +0x10,0x00,0xA4,0x27, +0x21,0x20,0x91,0x00, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x20,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x88,0x23,0x02, +0x10,0x00,0xA4,0x27, +0x7D,0x50,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x0F,0x00,0x42,0x30, +0x00,0x81,0x15,0x00, +0x21,0x28,0x20,0x02, +0x10,0x00,0xA4,0x27, +0x25,0x80,0x02,0x02, +0xC2,0x50,0x00,0x0C, +0xFF,0xFF,0x10,0x32, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x38,0x40,0x00, +0x21,0x28,0xA0,0x02, +0x21,0x30,0x00,0x02, +0x2F,0x55,0x00,0x0C, +0x10,0xE3,0x84,0x24, +0x21,0x20,0x00,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x8E,0x3E,0x42,0x92, +0x21,0x20,0xC0,0x02, +0x21,0x28,0xA0,0x02, +0x01,0x00,0x42,0x24, +0x9C,0x0E,0x00,0x0C, +0x8E,0x3E,0x42,0xA2, +0x83,0x18,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xE4,0xE2,0x84,0x24, +0x05,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xD0,0xE2,0x84,0x24, +0x02,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xBC,0xE2,0x84,0x24, +0x04,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xA8,0xE2,0x84,0x24, +0x03,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x10,0x23,0x02,0x8E, +0xFF,0xF7,0x03,0x24, +0x24,0x10,0x43,0x00, +0x00,0x10,0x42,0x34, +0x6C,0x18,0x00,0x08, +0x10,0x23,0x02,0xAE, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x02,0x26, +0x14,0x00,0xBF,0xAF, +0xB0,0x1B,0x43,0x94, +0x21,0x28,0x00,0x00, +0x00,0x01,0x62,0x30, +0x03,0x00,0x40,0x10, +0x01,0x00,0x64,0x30, +0x06,0x00,0x80,0x14, +0x00,0x10,0x62,0x30, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x08,0x00,0x40,0x14, +0x02,0x00,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x0C,0x00,0x02,0x24, +0x0F,0x00,0x63,0x30, +0x0A,0x00,0x62,0x10, +0x21,0x20,0x00,0x00, +0x02,0x00,0x03,0x3C, +0x30,0x1F,0x04,0x26, +0x20,0xBF,0x63,0x34, +0x08,0x39,0x83,0xAC, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xCD,0x4E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x00,0x03,0x3C, +0x30,0x1F,0x04,0x26, +0x20,0xBF,0x63,0x34, +0x33,0x19,0x00,0x08, +0x08,0x39,0x83,0xAC, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x25,0x26, +0x6C,0x3B,0xA2,0x8C, +0x00,0x10,0x03,0x3C, +0x24,0x10,0x43,0x00, +0x21,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x9B,0x3B,0xA6,0x90, +0x9C,0x3B,0xA4,0x90, +0xFF,0x00,0xC3,0x30, +0x40,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x01,0x00,0x84,0x24, +0x80,0x10,0x02,0x00, +0xFF,0x00,0x83,0x30, +0x21,0x10,0x45,0x00, +0x21,0x10,0x43,0x00, +0x9C,0x3B,0xA4,0xA0, +0x38,0x3B,0x43,0x90, +0x00,0x00,0x00,0x00, +0x21,0x00,0x60,0x10, +0x01,0x00,0xC2,0x24, +0xFF,0x00,0xC2,0x30, +0x22,0x00,0x40,0x14, +0x30,0x1F,0x30,0x26, +0x9C,0x3B,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x21,0x10,0x45,0x00, +0x38,0x3B,0x43,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x64,0x30, +0x1A,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x67,0x3B,0xA2,0x90, +0x30,0x3B,0xA3,0xA0, +0x4F,0x0C,0x00,0x0C, +0x31,0x3B,0xA2,0xA0, +0x30,0x1F,0x30,0x26, +0x70,0x3B,0x03,0x8E, +0x01,0x00,0x02,0x24, +0x7C,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x3B,0x03,0x8E, +0x00,0x10,0x02,0x3C, +0x3C,0x00,0x04,0x24, +0x26,0x18,0x62,0x00, +0x98,0x38,0x04,0xAE, +0x6C,0x3B,0x03,0xAE, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x21,0x30,0x40,0x00, +0x9B,0x3B,0xA2,0xA0, +0x5C,0x19,0x00,0x08, +0x9C,0x3B,0xA0,0xA0, +0x99,0x3B,0x03,0x92, +0x9A,0x3B,0x02,0x92, +0xFF,0x00,0x64,0x30, +0x30,0x3B,0x03,0xA2, +0x4F,0x0C,0x00,0x0C, +0x31,0x3B,0x02,0xA2, +0xB0,0x1B,0x03,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x62,0x30, +0x09,0x00,0x40,0x10, +0x01,0x00,0x62,0x30, +0x08,0x00,0x40,0x10, +0x30,0x1F,0x30,0x26, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x0C,0x00,0x02,0x24, +0x0F,0x00,0x63,0x30, +0x61,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x30,0x26, +0x9E,0x3B,0x04,0x96, +0xA0,0x3B,0x05,0x92, +0x12,0x0D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xC1,0x48,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x6C,0x3B,0x00,0xAE, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x3F,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x3C,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x41,0x00,0x40,0x14, +0x04,0x00,0x04,0x24, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA0, +0x00,0x60,0x92,0x40, +0x25,0xB0,0x07,0x3C, +0x30,0x1F,0x30,0x26, +0xB0,0x1B,0x04,0x96, +0x48,0x00,0xE6,0x34, +0x00,0x00,0xC3,0x8C, +0xFF,0xEF,0x84,0x30, +0x80,0x00,0x02,0x3C, +0x25,0x18,0x62,0x00, +0x00,0x01,0x85,0x30, +0x00,0x00,0xC3,0xAC, +0x02,0x80,0x08,0x3C, +0x05,0x00,0xA0,0x10, +0xB0,0x1B,0x04,0xA6, +0x00,0x00,0xC2,0x8C, +0x04,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0xC2,0xAC, +0x30,0x1F,0x02,0x8D, +0xFF,0xF0,0x03,0x24, +0xA1,0x3B,0x05,0x92, +0x24,0x10,0x43,0x00, +0x00,0x01,0x42,0x34, +0x0F,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x10,0x00,0x42,0x34, +0xF0,0xFF,0x03,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x24,0x10,0x43,0x00, +0x4C,0x00,0xE3,0x34, +0x01,0x00,0x42,0x34, +0x00,0x00,0x65,0xA0, +0x64,0x03,0xE4,0x34, +0x07,0x00,0x03,0x24, +0x20,0x00,0xBD,0x27, +0x30,0x1F,0x02,0xAD, +0x00,0x00,0x83,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x15,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0xB8,0x19,0x00,0x08, +0x00,0x00,0x00,0x00, +0x13,0x0F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x70,0x19,0x00,0x08, +0x00,0x00,0x00,0x00, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0xB0,0x19,0x00,0x08, +0x02,0x80,0x03,0x3C, +0xCD,0x4E,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x94,0x19,0x00,0x08, +0x30,0x1F,0x30,0x26, +0x0C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x17,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x24,0x08,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x02,0x63,0x30, +0x15,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x05,0x00,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x82,0x21,0x03,0x00, +0x28,0x00,0x82,0x10, +0xF5,0xFF,0x02,0x24, +0x02,0x00,0x82,0x28, +0x3B,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x2F,0x00,0x82,0x10, +0xE9,0xFF,0x02,0x24, +0x03,0x00,0x02,0x24, +0x24,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x05,0x00,0xC2,0x24, +0x04,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x42,0x10,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x96,0xFF,0x42,0x24, +0x05,0x00,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x60,0x00,0x64,0x30, +0x42,0x21,0x04,0x00, +0x0F,0x00,0x82,0x10, +0x1F,0x00,0x62,0x30, +0x02,0x00,0x82,0x28, +0x1F,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x16,0x00,0x82,0x10, +0x1F,0x00,0x62,0x30, +0x03,0x00,0x02,0x24, +0xEC,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x62,0x30, +0x40,0x10,0x02,0x00, +0xDD,0xFF,0x03,0x24, +0x23,0x30,0x62,0x00, +0x08,0x00,0xE0,0x03, +0x05,0x00,0xC2,0x24, +0x40,0x10,0x02,0x00, +0xF5,0xFF,0x03,0x24, +0x2A,0x1A,0x00,0x08, +0x23,0x30,0x62,0x00, +0x3E,0x00,0x63,0x30, +0x23,0x30,0x43,0x00, +0x08,0x00,0xE0,0x03, +0x05,0x00,0xC2,0x24, +0x3E,0x00,0x63,0x30, +0xDD,0xFF,0x02,0x24, +0x32,0x1A,0x00,0x08, +0x23,0x30,0x43,0x00, +0x40,0x10,0x02,0x00, +0xE9,0xFF,0x03,0x24, +0x2A,0x1A,0x00,0x08, +0x23,0x30,0x62,0x00, +0x3E,0x00,0x63,0x30, +0x32,0x1A,0x00,0x08, +0x23,0x30,0x43,0x00, +0xD1,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x62,0x30, +0x40,0x10,0x02,0x00, +0xF8,0xFF,0x03,0x24, +0x2A,0x1A,0x00,0x08, +0x23,0x30,0x62,0x00, +0xCA,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x3E,0x00,0x63,0x30, +0xF8,0xFF,0x02,0x24, +0x32,0x1A,0x00,0x08, +0x23,0x30,0x43,0x00, +0x63,0x00,0x82,0x24, +0x77,0x00,0x42,0x2C, +0x00,0x00,0x85,0x28, +0x04,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x64,0x00,0x82,0x24, +0x64,0x00,0x03,0x24, +0x0B,0x18,0x45,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x80,0x09,0x3C, +0x30,0x1F,0x28,0x25, +0x80,0x36,0x06,0x8D, +0xFF,0xFF,0x02,0x34, +0x3F,0x00,0xC2,0x10, +0x21,0x38,0x80,0x00, +0x2B,0x10,0xC7,0x00, +0x30,0x00,0x40,0x10, +0x02,0x19,0x06,0x00, +0x21,0x10,0xC7,0x00, +0x23,0x10,0x43,0x00, +0x10,0x00,0x46,0x24, +0x80,0x36,0x06,0xAD, +0x30,0x1F,0x26,0x25, +0x04,0x00,0xC4,0x8C, +0x84,0x36,0x02,0xAD, +0xFF,0xFF,0x02,0x34, +0x2F,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x87,0x00, +0x1F,0x00,0x40,0x10, +0x02,0x19,0x04,0x00, +0x21,0x10,0x87,0x00, +0x23,0x10,0x43,0x00, +0x10,0x00,0x44,0x24, +0x04,0x00,0xC4,0xAC, +0x84,0x36,0xC2,0xAC, +0xC0,0x10,0x05,0x00, +0x21,0x10,0x45,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0x30,0x1F,0x23,0x25, +0x80,0x10,0x02,0x00, +0x21,0x28,0x43,0x00, +0x0C,0x24,0xA6,0x8C, +0x00,0x21,0x07,0x00, +0xFF,0xFF,0xC2,0x38, +0x0A,0x30,0x82,0x00, +0x2B,0x18,0xC7,0x00, +0x07,0x00,0x60,0x10, +0x21,0x10,0xC7,0x00, +0x02,0x19,0x06,0x00, +0x23,0x10,0x43,0x00, +0x10,0x00,0x46,0x24, +0x0C,0x24,0xA6,0xAC, +0x08,0x00,0xE0,0x03, +0x10,0x24,0xA2,0xAC, +0x02,0x19,0x06,0x00, +0x23,0x10,0x43,0x00, +0x0C,0x24,0xA2,0xAC, +0x08,0x00,0xE0,0x03, +0x10,0x24,0xA2,0xAC, +0x21,0x10,0x87,0x00, +0x23,0x10,0x43,0x00, +0x70,0x1A,0x00,0x08, +0x04,0x00,0xC2,0xAC, +0x21,0x10,0xC7,0x00, +0x30,0x1F,0x26,0x25, +0x04,0x00,0xC4,0x8C, +0x23,0x10,0x43,0x00, +0x80,0x36,0x02,0xAD, +0x84,0x36,0x02,0xAD, +0xFF,0xFF,0x02,0x34, +0xD4,0xFF,0x82,0x14, +0x2B,0x10,0x87,0x00, +0x00,0x21,0x07,0x00, +0x69,0x1A,0x00,0x08, +0x04,0x00,0xC4,0xAC, +0x00,0x31,0x04,0x00, +0x5C,0x1A,0x00,0x08, +0x80,0x36,0x06,0xAD, +0xA0,0xFF,0xBD,0x27, +0x54,0x00,0xB7,0xAF, +0x5C,0x00,0xBF,0xAF, +0x58,0x00,0xBE,0xAF, +0x50,0x00,0xB6,0xAF, +0x4C,0x00,0xB5,0xAF, +0x48,0x00,0xB4,0xAF, +0x44,0x00,0xB3,0xAF, +0x40,0x00,0xB2,0xAF, +0x3C,0x00,0xB1,0xAF, +0x38,0x00,0xB0,0xAF, +0x02,0x80,0x17,0x3C, +0x02,0x80,0x02,0x3C, +0x64,0x57,0x45,0x8C, +0x00,0x80,0x04,0x3C, +0x74,0x6A,0x83,0x24, +0x64,0x57,0x44,0x24, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x7F,0x00,0xA4,0x10, +0x02,0x80,0x09,0x3C, +0x02,0x80,0x02,0x3C, +0x40,0xEB,0x29,0x25, +0x44,0xEB,0x42,0x24, +0x00,0x00,0x35,0x8D, +0x00,0x00,0x53,0x8C, +0x02,0x80,0x03,0x3C, +0x48,0xEB,0x63,0x24, +0x00,0x00,0x7E,0x8C, +0x34,0x38,0xB4,0x8E, +0x21,0x20,0x00,0x00, +0x21,0xB0,0x00,0x00, +0x08,0x00,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xAE, +0x08,0x00,0x83,0x96, +0x02,0x80,0x02,0x3C, +0xB0,0x01,0x00,0x0C, +0x25,0x90,0x62,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xAC,0x1B,0xA3,0x96, +0xD0,0x37,0xA2,0x8E, +0x00,0x00,0x00,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0xC2,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0xF4,0x1A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x17,0x00,0xC7,0x90, +0x16,0x00,0xC8,0x90, +0x32,0x3B,0xA2,0x96, +0xFF,0x00,0xE3,0x30, +0x00,0x1A,0x03,0x00, +0xFF,0x00,0x05,0x31, +0x25,0x18,0x65,0x00, +0xB7,0x00,0x43,0x10, +0x24,0xE3,0x24,0x25, +0xFF,0x00,0xE2,0x30, +0xFF,0x00,0x03,0x31, +0x00,0x12,0x02,0x00, +0x25,0x10,0x43,0x00, +0x32,0x3B,0xA2,0xA6, +0x01,0x00,0xC4,0x90, +0x00,0x00,0xC2,0x90, +0x00,0x22,0x04,0x00, +0x88,0x0C,0x00,0x0C, +0x25,0x20,0x82,0x00, +0x40,0x18,0x02,0x00, +0x21,0x18,0x62,0x00, +0x80,0x18,0x03,0x00, +0x94,0xDE,0xE2,0x26, +0x21,0x18,0x62,0x00, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x40,0x00, +0x21,0x20,0x20,0x02, +0x0C,0x00,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xC2,0x02, +0x2C,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x42,0x8E, +0x21,0x88,0x40,0x02, +0x42,0x1B,0x02,0x00, +0x78,0x00,0x63,0x30, +0x02,0x26,0x02,0x00, +0xFF,0x3F,0x42,0x30, +0x21,0x10,0x43,0x00, +0x03,0x00,0x84,0x30, +0x21,0x10,0x44,0x00, +0x18,0x00,0x42,0x24, +0xFF,0xFF,0x50,0x30, +0x7F,0x00,0x02,0x32, +0x80,0x00,0x03,0x26, +0x00,0x00,0x70,0xAE, +0x02,0x00,0x40,0x10, +0x80,0xFF,0x05,0x32, +0x80,0xFF,0x65,0x30, +0x00,0x00,0x65,0xAE, +0x02,0x00,0x22,0x96, +0x21,0x18,0xC5,0x02, +0xFF,0xFF,0x76,0x30, +0x0F,0x00,0x42,0x30, +0x00,0x00,0x62,0xAE, +0x00,0x00,0x23,0x8E, +0x21,0x90,0x45,0x02, +0x42,0x13,0x03,0x00, +0x78,0x00,0x42,0x30, +0x02,0x1E,0x03,0x00, +0x21,0x10,0x51,0x00, +0x03,0x00,0x63,0x30, +0x21,0x10,0x43,0x00, +0x18,0x00,0x46,0x24, +0x00,0x00,0x66,0xAE, +0x01,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x00,0x12,0x02,0x00, +0x00,0x08,0x42,0x30, +0xB9,0xFF,0x40,0x14, +0x02,0x80,0x09,0x3C, +0x16,0x00,0xC8,0x90, +0x17,0x00,0xC7,0x90, +0xDD,0x1A,0x00,0x08, +0xFF,0x00,0xE2,0x30, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x04,0x00,0x83,0x8E, +0x00,0x00,0x82,0x8E, +0x21,0x20,0x80,0x02, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x00,0x00,0x94,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x94,0xAE, +0x00,0x60,0x90,0x40, +0x02,0x80,0x02,0x3C, +0x64,0x57,0x43,0x8C, +0x64,0x57,0x42,0x24, +0x8B,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x40,0xEB,0x63,0x24, +0x00,0x00,0x71,0x8C, +0x25,0xB0,0x10,0x3C, +0x04,0x01,0x02,0x36, +0x00,0x00,0x43,0x8C, +0xE8,0x37,0x27,0x8E, +0x00,0x00,0x00,0x00, +0xC8,0x00,0xE3,0x10, +0xEC,0x37,0x23,0xAE, +0x2B,0x10,0x67,0x00, +0xD2,0x00,0x40,0x14, +0x2B,0x10,0xE3,0x00, +0x08,0x01,0x40,0x14, +0x02,0x80,0x09,0x3C, +0x30,0x1F,0x24,0x25, +0xBC,0x37,0x83,0x94, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x00,0x00, +0x2F,0x00,0xC0,0x1A, +0x25,0xA8,0x62,0x00, +0x21,0x98,0x80,0x00, +0x21,0x90,0x00,0x00, +0x01,0x00,0x1E,0x24, +0x21,0x88,0x55,0x02, +0x00,0x00,0x22,0x8E, +0x98,0x3E,0x63,0x8E, +0xFF,0x3F,0x42,0x30, +0x21,0x18,0x62,0x00, +0x98,0x3E,0x63,0xAE, +0x00,0x60,0x04,0x40, +0x01,0x00,0x81,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD4,0x1E,0x62,0x8E, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD4,0x1E,0x62,0xAE, +0x00,0x60,0x84,0x40, +0x04,0x00,0x22,0x8E, +0x02,0x00,0x03,0x24, +0x02,0x17,0x02,0x00, +0x03,0x00,0x42,0x30, +0x39,0x00,0x43,0x10, +0x02,0x80,0x03,0x3C, +0x21,0x10,0x55,0x02, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x60,0x10, +0x01,0x00,0x02,0x26, +0x04,0x00,0x22,0x8E, +0x00,0xF0,0x03,0x3C, +0x00,0x20,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x10,0x00,0x44,0x10, +0x02,0x80,0x09,0x3C, +0x06,0x00,0x02,0x26, +0x00,0x00,0x23,0x8E, +0xFF,0xFF,0x50,0x30, +0x82,0x16,0x03,0x00, +0x01,0x00,0x42,0x30, +0x52,0x00,0x5E,0x10, +0x02,0x80,0x04,0x3C, +0x80,0x90,0x10,0x00, +0x2A,0x10,0x56,0x02, +0xD7,0xFF,0x40,0x14, +0x21,0x88,0x55,0x02, +0x3D,0x24,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x08,0x1C,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x40,0xEB,0x29,0x25, +0x00,0x00,0x25,0x8D, +0x00,0x00,0x00,0x00, +0xD4,0x1D,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD4,0x1D,0xA2,0xAC, +0x0C,0x00,0x24,0x8E, +0x0C,0x00,0x02,0x24, +0x3F,0x00,0x83,0x30, +0xBD,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x02,0x24, +0xB3,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x83,0x30, +0x0E,0x00,0x02,0x24, +0xE0,0xFF,0x62,0x14, +0x06,0x00,0x02,0x26, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xE0,0x1D,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x69,0x1B,0x00,0x08, +0xE0,0x1D,0x62,0xAC, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0x1A,0x00,0x08, +0x00,0x00,0x00,0x00, +0xF4,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0xC6,0xFF,0x40,0x10, +0x21,0x10,0x55,0x02, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xF4,0x5E,0x62,0x90, +0x02,0x80,0x04,0x3C, +0xF8,0xE8,0x85,0x24, +0xFF,0x00,0x42,0x30, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x24,0x8E, +0x04,0x00,0x25,0x8E, +0x09,0xF8,0x60,0x00, +0x00,0x00,0x00,0x00, +0x02,0x80,0x09,0x3C, +0xF6,0x5E,0x22,0x91, +0x0C,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x10, +0x02,0x80,0x03,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x5F,0x1B,0x00,0x08, +0x21,0x10,0x55,0x02, +0x0D,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x13,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x13,0x5F,0x82,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x5F,0x1B,0x00,0x08, +0x21,0x10,0x55,0x02, +0x30,0x1F,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x0F,0x00,0x42,0x30, +0x05,0x00,0x5E,0x10, +0xC2,0x13,0x03,0x00, +0x1E,0x00,0x42,0x30, +0x21,0x10,0x50,0x00, +0x70,0x1B,0x00,0x08, +0xFF,0xFF,0x50,0x30, +0x02,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0x1C,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x14,0x03,0x00, +0x0F,0x00,0x42,0x30, +0x14,0x00,0x40,0x14, +0x02,0x17,0x03,0x00, +0x03,0x00,0x44,0x30, +0x08,0x00,0x80,0x10, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0x62,0x00, +0x0E,0x00,0x40,0x14, +0x03,0x00,0x02,0x24, +0x0C,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x80,0x28,0x10,0x00, +0x21,0x28,0xB5,0x00, +0xF7,0x19,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x21,0x20,0x40,0x00, +0x56,0x1A,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x02,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0x8B,0x00,0x5E,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x63,0x92, +0x02,0x00,0x02,0x24, +0x71,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0x08,0x00,0x7E,0x10, +0xD0,0x02,0x02,0x24, +0x00,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0xC2,0x13,0x03,0x00, +0x1E,0x00,0x42,0x30, +0x21,0x10,0x50,0x00, +0x70,0x1B,0x00,0x08, +0xFF,0xFF,0x50,0x30, +0x80,0x36,0x62,0xAE, +0x00,0x00,0x23,0x8E, +0xFA,0x1B,0x00,0x08, +0xC2,0x13,0x03,0x00, +0x02,0x80,0x09,0x3C, +0x00,0x01,0x02,0x36, +0x30,0x1F,0x29,0x25, +0x00,0x00,0x47,0xAC, +0xE8,0x37,0x27,0xAD, +0x02,0x80,0x02,0x3C, +0x08,0x04,0x44,0x24, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xAA,0x1A,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xF0,0x37,0x22,0x8E, +0xFF,0xFF,0x73,0x30, +0x23,0x10,0x47,0x00, +0xFF,0xFF,0x52,0x30, +0x21,0x18,0x53,0x02, +0xFF,0xFF,0x76,0x30, +0x25,0x24,0x00,0x0C, +0x21,0x20,0xC0,0x02, +0xEF,0xFF,0x40,0x10, +0x21,0xA0,0x40,0x00, +0x08,0x00,0x42,0x8C, +0xE8,0x37,0x26,0x8E, +0x21,0x38,0x40,0x02, +0x21,0x18,0x56,0x00, +0xB8,0x37,0x23,0xAE, +0x21,0x28,0x40,0x00, +0x08,0x00,0x04,0x24, +0xBC,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xB0,0x01,0x00,0x0C, +0x08,0x00,0x04,0x24, +0xBC,0x37,0x25,0x8E, +0x24,0x10,0x02,0x3C, +0x00,0x01,0x10,0x36, +0x00,0x00,0x02,0xAE, +0x21,0x38,0x60,0x02, +0x21,0x28,0xB2,0x00, +0x08,0x00,0x04,0x24, +0x24,0x10,0x06,0x3C, +0xE8,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xEC,0x37,0x23,0x8E, +0x08,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0xE8,0x37,0x23,0xAE, +0xE8,0x37,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0xAE, +0x40,0x1B,0x00,0x08, +0x02,0x80,0x09,0x3C, +0xDC,0x1D,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xDC,0x1D,0xA2,0xAC, +0x0C,0x00,0x24,0x8E, +0x88,0x1B,0x00,0x08, +0x3F,0x00,0x83,0x30, +0xD8,0x1D,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD8,0x1D,0xA2,0xAC, +0x0C,0x00,0x24,0x8E, +0x84,0x1B,0x00,0x08, +0x3F,0x00,0x83,0x30, +0x23,0x10,0x67,0x00, +0xFF,0xFF,0x56,0x30, +0x25,0x24,0x00,0x0C, +0x21,0x20,0xC0,0x02, +0x4A,0x00,0x40,0x10, +0x21,0xA0,0x40,0x00, +0x08,0x00,0x42,0x8C, +0xE8,0x37,0x26,0x8E, +0x08,0x00,0x04,0x24, +0x21,0x18,0x56,0x00, +0xB8,0x37,0x23,0xAE, +0x21,0x28,0x40,0x00, +0x21,0x38,0xC0,0x02, +0xBC,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xEC,0x37,0x23,0x8E, +0x08,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0xE8,0x37,0x23,0xAE, +0xE8,0x37,0x23,0x8E, +0x00,0x01,0x02,0x36, +0x00,0x00,0x43,0xAC, +0x40,0x1B,0x00,0x08, +0x02,0x80,0x09,0x3C, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x14,0x03,0x00, +0x0F,0x00,0x42,0x30, +0x08,0x00,0x42,0x28, +0x8B,0xFF,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x02,0x17,0x03,0x00, +0x03,0x00,0x42,0x30, +0x86,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x80,0x28,0x10,0x00, +0x21,0x28,0xB5,0x00, +0xF7,0x19,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x21,0x20,0x40,0x00, +0x56,0x1A,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xF1,0x1B,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x14,0x03,0x00, +0x0F,0x00,0x42,0x30, +0x08,0x00,0x42,0x28, +0x06,0x00,0x40,0x10, +0x00,0xC0,0x02,0x3C, +0x02,0x17,0x03,0x00, +0x03,0x00,0x42,0x30, +0x0C,0x00,0x40,0x10, +0x80,0x28,0x10,0x00, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0x62,0x00, +0x68,0xFF,0x40,0x14, +0x02,0x17,0x03,0x00, +0x03,0x00,0x42,0x30, +0x03,0x00,0x03,0x24, +0x64,0xFF,0x43,0x10, +0x00,0x00,0x00,0x00, +0x62,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x80,0x28,0x10,0x00, +0x21,0x28,0xB5,0x00, +0xF7,0x19,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x21,0x20,0x40,0x00, +0x56,0x1A,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xEC,0x1B,0x00,0x08, +0x00,0x00,0x00,0x00, +0xEC,0x37,0x23,0x8E, +0x00,0x01,0x02,0x36, +0x00,0x00,0x43,0xAC, +0x07,0x1C,0x00,0x08, +0xE8,0x37,0x23,0xAE, +0xB8,0xFF,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x28,0x00,0xB2,0xAF, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x44,0x00,0x63,0x34, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x0E,0x00,0x40,0x04, +0x18,0x00,0xA0,0xAF, +0x21,0x20,0x60,0x00, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0x64,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0xF6,0xFF,0x41,0x04, +0x21,0x10,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x43,0x8C, +0x00,0x80,0x06,0x3C, +0x6C,0x72,0xC2,0x24, +0x25,0xB0,0x05,0x3C, +0x02,0x80,0x06,0x3C, +0x18,0x03,0xA4,0x34, +0x74,0x57,0xD2,0x24, +0x00,0x00,0x82,0xAC, +0x67,0x00,0x72,0x10, +0x01,0x00,0x16,0x24, +0x11,0x11,0x02,0x3C, +0x2A,0xB0,0x03,0x3C, +0x22,0x22,0x5E,0x34, +0x02,0x80,0x02,0x3C, +0x21,0xB8,0x80,0x00, +0x05,0x00,0x74,0x34, +0x30,0x1F,0x55,0x24, +0x01,0x00,0x13,0x24, +0x00,0x00,0xFE,0xAE, +0x21,0x00,0xC0,0x12, +0x2A,0xB0,0x03,0x3C, +0x02,0x80,0x03,0x3C, +0xF4,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x40,0x10, +0x21,0xB0,0x00,0x00, +0x01,0x00,0x06,0x24, +0x18,0x00,0xA6,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x5F,0x00,0x40,0x14, +0x04,0x00,0x04,0x24, +0x02,0x80,0x06,0x3C, +0xDE,0x5D,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x55,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2A,0xB0,0x03,0x3C, +0x06,0x00,0x63,0x34, +0x00,0x00,0x62,0x94, +0x44,0x38,0xB1,0x8E, +0x25,0xB0,0x06,0x3C, +0xB0,0x03,0xC6,0x34, +0x00,0xFF,0x42,0x30, +0x00,0x00,0xD1,0xAC, +0x0F,0x00,0x40,0x18, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x4C,0xEB,0x42,0x24, +0x50,0xEB,0x63,0x24, +0x00,0x00,0x45,0x8C, +0x00,0x00,0x64,0x8C, +0x02,0x80,0x06,0x3C, +0x54,0xEB,0xC6,0x24, +0x00,0x00,0xC3,0x8C, +0x00,0x00,0xA4,0xAC, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x42,0x30, +0xFB,0xFF,0x40,0x1C, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x07,0x00,0x62,0x30, +0x47,0x00,0x40,0x14, +0x08,0x00,0x62,0x24, +0xC2,0x10,0x03,0x00, +0x08,0x00,0x25,0x8E, +0x04,0x37,0xA6,0x8E, +0xC0,0x10,0x02,0x00, +0x20,0x00,0x42,0x24, +0xFF,0xFF,0x47,0x30, +0x01,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB3,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x02,0x00,0x02,0x24, +0x00,0x00,0x93,0xA2, +0x00,0x00,0x82,0xA2, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x22,0x8E, +0x21,0x20,0x20,0x02, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x00,0x00,0x31,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x31,0xAE, +0x00,0x60,0x90,0x40, +0x00,0x00,0x42,0x8E, +0x00,0x00,0x00,0x00, +0xA3,0xFF,0x52,0x14, +0x00,0x00,0x00,0x00, +0x18,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x07,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF4,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x11,0x00,0x40,0x14, +0x18,0x00,0xA0,0xAF, +0x02,0x80,0x02,0x3C, +0x08,0x08,0x44,0x24, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xBC,0x1C,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x9B,0x30,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xEA,0x1C,0x00,0x08, +0x00,0x08,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0xE4,0x1C,0x00,0x08, +0x02,0x80,0x06,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x06,0x3C, +0xF5,0x5E,0xC4,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x36,0x1D,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x0E,0x1D,0x00,0x08, +0xC2,0x10,0x02,0x00, +0x10,0x00,0xE0,0x18, +0x21,0x18,0x00,0x00, +0x00,0x00,0xC0,0xAC, +0x21,0x40,0x00,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x45,0x10, +0x21,0x18,0x80,0x00, +0x01,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x21,0x18,0x48,0x00, +0x02,0x00,0x68,0x24, +0x21,0x10,0x82,0x00, +0x2B,0x18,0x07,0x01, +0xF5,0xFF,0x60,0x14, +0x02,0x00,0x44,0x24, +0x21,0x18,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x01,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x80,0x07,0x3C, +0x30,0x1F,0xE5,0x24, +0x22,0x3E,0xA3,0x90, +0xFF,0x00,0x84,0x30, +0x80,0x10,0x04,0x00, +0x0C,0x00,0x60,0x14, +0x21,0x30,0x45,0x00, +0xC8,0x00,0x02,0x24, +0x24,0x39,0xA2,0xAC, +0x01,0x00,0x03,0x24, +0x30,0x1F,0xE2,0x24, +0x04,0x18,0x83,0x00, +0x4C,0x3E,0xA4,0xA0, +0x22,0x3E,0x44,0x90, +0x00,0x00,0x00,0x00, +0x25,0x18,0x64,0x00, +0x08,0x00,0xE0,0x03, +0x22,0x3E,0x43,0xA0, +0x24,0x39,0xA3,0x8C, +0xC8,0x00,0x02,0x24, +0x23,0x10,0x43,0x00, +0x24,0x3E,0xC2,0xAC, +0x01,0x00,0x03,0x24, +0x30,0x1F,0xE2,0x24, +0x04,0x18,0x83,0x00, +0x22,0x3E,0x44,0x90, +0x00,0x00,0x00,0x00, +0x25,0x18,0x64,0x00, +0x08,0x00,0xE0,0x03, +0x22,0x3E,0x43,0xA0, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xBF,0xAF, +0x30,0x1F,0x25,0x26, +0x4C,0x3E,0xA6,0x90, +0x01,0x00,0x02,0x24, +0x04,0x10,0xC2,0x00, +0x06,0x00,0x40,0x14, +0xC9,0x00,0x10,0x24, +0x1A,0x3E,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x23,0x00,0x40,0x14, +0x21,0x20,0xC5,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x46,0x24, +0x21,0x20,0x00,0x00, +0x24,0x3E,0xC5,0x24, +0x00,0x00,0xA2,0x8C, +0x04,0x00,0xA5,0x24, +0x05,0x00,0x40,0x10, +0x2B,0x18,0x50,0x00, +0x03,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x80,0x40,0x00, +0x4C,0x3E,0xC4,0xA0, +0x01,0x00,0x84,0x24, +0x08,0x00,0x82,0x2C, +0xF5,0xFF,0x40,0x14, +0xC9,0x00,0x02,0x24, +0x21,0x00,0x02,0x12, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x45,0x24, +0x07,0x00,0x04,0x24, +0x24,0x3E,0xA2,0x8C, +0xFF,0xFF,0x84,0x24, +0x02,0x00,0x40,0x10, +0x23,0x18,0x50,0x00, +0x24,0x3E,0xA3,0xAC, +0xFA,0xFF,0x81,0x04, +0x04,0x00,0xA5,0x24, +0x30,0x1F,0x22,0x26, +0x24,0x39,0x50,0xAC, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x44,0x3E,0x83,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x63,0x24, +0xFF,0x00,0x62,0x30, +0x03,0x00,0x42,0x2C, +0xD8,0xFF,0x40,0x10, +0x44,0x3E,0x83,0xA0, +0x80,0x18,0x06,0x00, +0x21,0x18,0x65,0x00, +0xC8,0x00,0x02,0x24, +0x03,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x90,0x14,0x00,0x0C, +0x24,0x3E,0x62,0xAC, +0x9C,0x1D,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x22,0x26, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x20,0x00,0xBD,0x27, +0x22,0x3E,0x40,0xA0, +0x08,0x00,0xE0,0x03, +0x24,0x39,0x40,0xAC, +0xB8,0xFF,0xBD,0x27, +0x02,0x80,0x08,0x3C, +0x02,0x80,0x0B,0x3C, +0x02,0x80,0x0C,0x3C, +0x40,0x00,0xBF,0xAF, +0x3C,0x00,0xB5,0xAF, +0x38,0x00,0xB4,0xAF, +0x34,0x00,0xB3,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x28,0x00,0xB0,0xAF, +0x40,0xED,0x63,0x25, +0x3C,0xED,0x02,0x25, +0x44,0xED,0x84,0x25, +0x01,0x00,0x45,0x90, +0x01,0x00,0x66,0x90, +0x01,0x00,0x87,0x90, +0x3C,0xED,0x0F,0x91, +0x02,0x00,0x4A,0x90, +0x40,0xED,0x6E,0x91, +0x02,0x00,0x69,0x90, +0x44,0xED,0x8D,0x91, +0x02,0x00,0x88,0x90, +0x03,0x00,0x4B,0x90, +0x03,0x00,0x6C,0x90, +0x03,0x00,0x82,0x90, +0x00,0x2A,0x05,0x00, +0x00,0x32,0x06,0x00, +0x00,0x3A,0x07,0x00, +0x25,0x28,0xAF,0x00, +0x25,0x30,0xCE,0x00, +0x25,0x38,0xED,0x00, +0x00,0x54,0x0A,0x00, +0x00,0x4C,0x09,0x00, +0x00,0x44,0x08,0x00, +0x25,0x50,0x45,0x01, +0x25,0x48,0x26,0x01, +0x25,0x40,0x07,0x01, +0x00,0x5E,0x0B,0x00, +0x00,0x66,0x0C,0x00, +0x00,0x16,0x02,0x00, +0x02,0x80,0x04,0x3C, +0x25,0x58,0x6A,0x01, +0x25,0x60,0x89,0x01, +0x25,0x10,0x48,0x00, +0x84,0x58,0x84,0x24, +0x10,0x00,0xAB,0xAF, +0x18,0x00,0xAC,0xAF, +0x34,0x4F,0x00,0x0C, +0x20,0x00,0xA2,0xAF, +0x10,0x00,0x42,0x30, +0x29,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x13,0x3C, +0x30,0x1F,0x63,0x26, +0xC4,0x39,0x62,0x8C, +0x0C,0x00,0x10,0x24, +0x2B,0x10,0x02,0x02, +0x2C,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x58,0x51,0x24, +0x02,0x59,0x72,0x24, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xFA,0x58,0x54,0x24, +0x26,0x1E,0x00,0x08, +0x06,0x59,0x75,0x24, +0xDD,0x00,0x02,0x24, +0x21,0x20,0x14,0x02, +0x2B,0x00,0x62,0x10, +0x10,0x00,0xA5,0x27, +0x21,0x10,0x11,0x02, +0x01,0x00,0x43,0x90, +0x30,0x1F,0x64,0x26, +0xC4,0x39,0x82,0x8C, +0x21,0x18,0x70,0x00, +0x02,0x00,0x70,0x24, +0x2B,0x10,0x02,0x02, +0x17,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x10,0x11,0x02, +0x00,0x00,0x43,0x90, +0x30,0x00,0x02,0x24, +0x21,0x20,0x12,0x02, +0x20,0x00,0xA5,0x27, +0xED,0xFF,0x62,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEE,0xFF,0x40,0x14, +0x21,0x10,0x11,0x02, +0x01,0x00,0x03,0x24, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x21,0x18,0x00,0x00, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x20,0x15,0x02, +0x18,0x00,0xA5,0x27, +0xD1,0xFF,0x40,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xCE,0xFF,0x40,0x14, +0x21,0x10,0x11,0x02, +0x32,0x1E,0x00,0x08, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x38,0x5D,0x43,0x94, +0x00,0x00,0x00,0x00, +0x80,0x18,0x03,0x00, +0xB8,0x0B,0x62,0x28, +0x04,0x00,0x40,0x14, +0xB8,0x0B,0x04,0x24, +0x21,0x4E,0x62,0x28, +0x20,0x4E,0x04,0x24, +0x0B,0x20,0x62,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x21,0x38,0x80,0x00, +0x08,0x00,0xC0,0x10, +0xFF,0xFF,0xC3,0x24, +0xFF,0xFF,0x06,0x24, +0x00,0x00,0xA2,0x8C, +0xFF,0xFF,0x63,0x24, +0x04,0x00,0xA5,0x24, +0x00,0x00,0xE2,0xAC, +0xFB,0xFF,0x66,0x14, +0x04,0x00,0xE7,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x25,0xB0,0x03,0x3C, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x94,0x0E,0x65,0x34, +0x9C,0x0E,0x66,0x34, +0xA4,0x0E,0x67,0x34, +0xAC,0x0E,0x68,0x34, +0x02,0x80,0x02,0x3C, +0x00,0x00,0xA9,0x8C, +0x30,0x1F,0x58,0x24, +0x00,0x00,0xCC,0x8C, +0x00,0x00,0xF1,0x8C, +0x00,0x00,0x05,0x8D, +0x0C,0x00,0x07,0x8F, +0x10,0x00,0x08,0x8F, +0xFF,0x03,0x0A,0x3C, +0xB4,0x0E,0x62,0x34, +0x00,0x00,0x4B,0x8C, +0x24,0x48,0x2A,0x01, +0x00,0xFC,0x02,0x24, +0x24,0x28,0xAA,0x00, +0xBC,0x0E,0x66,0x34, +0x24,0x40,0x02,0x01, +0x02,0x4C,0x09,0x00, +0x24,0x38,0xE2,0x00, +0x02,0x2C,0x05,0x00, +0xF0,0xFF,0x02,0x3C, +0x00,0x00,0xD0,0x8C, +0xFF,0x03,0x42,0x34, +0xCC,0x0E,0x66,0x34, +0x25,0x38,0xE9,0x00, +0xC4,0x0E,0x63,0x34, +0x25,0x40,0x05,0x01, +0x08,0x00,0x0D,0x8F, +0x00,0x00,0x6F,0x8C, +0x24,0x40,0x02,0x01, +0x00,0x00,0xCE,0x8C, +0x24,0x38,0xE2,0x00, +0x24,0x60,0x8A,0x01, +0x24,0x58,0x6A,0x01, +0xFF,0x9F,0x02,0x3C, +0x82,0x61,0x0C,0x00, +0x82,0x59,0x0B,0x00, +0xFF,0xFF,0x42,0x34, +0x0F,0xC0,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x25,0x38,0xEC,0x00, +0x25,0x40,0x0B,0x01, +0x24,0x68,0xA2,0x01, +0xFF,0x00,0x0B,0x3C, +0x00,0xFF,0x82,0x30, +0x24,0x88,0x2A,0x02, +0x24,0x80,0x0A,0x02, +0x24,0x18,0x8B,0x00, +0x24,0x40,0x05,0x01, +0x21,0x48,0x80,0x00, +0x02,0x62,0x02,0x00, +0x24,0x38,0xE5,0x00, +0x00,0x20,0x02,0x3C, +0x24,0x70,0xCA,0x01, +0x00,0x89,0x11,0x00, +0x00,0x81,0x10,0x00, +0x24,0x78,0xEA,0x01, +0x00,0xFF,0x6B,0x35, +0x25,0x68,0xA2,0x01, +0x02,0x1C,0x03,0x00, +0x02,0x80,0x04,0x3C, +0x25,0x38,0xF1,0x00, +0x25,0x40,0x10,0x01, +0x02,0x7C,0x0F,0x00, +0x02,0x74,0x0E,0x00, +0x24,0x48,0x2B,0x01, +0xDC,0xE3,0x84,0x24, +0x21,0x28,0x80,0x01, +0x21,0x30,0x60,0x00, +0x12,0x00,0x02,0x24, +0x08,0x00,0x0D,0xAF, +0x0C,0x00,0x07,0xAF, +0x10,0x00,0x08,0xAF, +0x14,0x00,0x0F,0xA7, +0x0A,0x00,0x20,0x15, +0x16,0x00,0x0E,0xA7, +0x10,0x00,0xA4,0x27, +0xC7,0x02,0x02,0xA3, +0xC8,0x5C,0x00,0x0C, +0xC3,0x02,0x02,0xA3, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xC7,0x02,0x03,0xA3, +0x2F,0x55,0x00,0x0C, +0xC3,0x02,0x0C,0xA3, +0xC8,0x5C,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x28,0x00,0xB6,0xAF, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x16,0x3C, +0x48,0x7B,0xC3,0x26, +0x18,0x03,0x42,0x34, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x34,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x43,0xAC, +0x21,0x98,0x00,0x00, +0x02,0x80,0x15,0x3C, +0x00,0x80,0x1E,0x3C, +0x02,0x80,0x14,0x3C, +0x02,0x80,0x17,0x3C, +0x25,0xB0,0x10,0x3C, +0x18,0x03,0x02,0x36, +0x48,0x7B,0xC3,0x26, +0x00,0x00,0x43,0xAC, +0x30,0x1F,0xB1,0x26, +0x7C,0x36,0x24,0x96, +0x70,0x03,0x05,0x36, +0x00,0x00,0xB2,0x8C, +0x01,0x00,0x84,0x24, +0x03,0x00,0x40,0x12, +0x7C,0x36,0x24,0xA6, +0x01,0x00,0x62,0x26, +0xFF,0xFF,0x53,0x30, +0xFF,0x00,0x04,0x3C, +0xFF,0xFF,0x82,0x34, +0x2B,0x10,0x52,0x00, +0x47,0x00,0x40,0x10, +0x00,0x50,0x62,0x2E, +0x00,0xFF,0x06,0x3C, +0xFF,0x00,0xC2,0x34, +0x00,0xFD,0x05,0x3C, +0x24,0x18,0x42,0x02, +0x29,0x00,0xA2,0x34, +0xA7,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x46,0x00,0x40,0x14, +0xAC,0x00,0xA2,0x34, +0x00,0xF2,0x06,0x3C, +0x01,0x00,0xC2,0x34, +0xB8,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x7D,0x00,0x40,0x14, +0x07,0x00,0xA2,0x34, +0x00,0xF0,0x05,0x3C, +0x03,0x00,0xA2,0x34, +0xD5,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0xC8,0x00,0x40,0x14, +0x00,0xF1,0x07,0x3C, +0x21,0x02,0x65,0x10, +0x00,0xFF,0x82,0x34, +0x2B,0x10,0xA3,0x00, +0x48,0x01,0x40,0x14, +0x01,0x00,0xA2,0x34, +0x00,0xE0,0x02,0x3C, +0x73,0x01,0x62,0x10, +0x00,0xFF,0x48,0x32, +0x25,0xB0,0x02,0x3C, +0x70,0x03,0x42,0x34, +0x21,0x98,0x00,0x00, +0x00,0x00,0x40,0xAC, +0x25,0xB0,0x04,0x3C, +0x18,0x03,0x82,0x34, +0x48,0x7C,0xC3,0x27, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x6C,0x57,0x82,0x8E, +0x6C,0x57,0x83,0x26, +0x10,0x00,0x43,0x10, +0x02,0x80,0x02,0x3C, +0xBF,0x00,0x92,0x34, +0x30,0x1F,0x51,0x24, +0x21,0x80,0x60,0x00, +0x00,0x00,0x42,0x92, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x2C, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x3C,0x38,0x24,0x8E, +0xB4,0x08,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x6C,0x57,0x83,0x8E, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x70,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x21,0x28,0x00,0x00, +0x08,0x10,0xE4,0x26, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xE8,0x1E,0x00,0x08, +0x25,0xB0,0x10,0x3C, +0xDA,0xFF,0x40,0x14, +0x74,0x03,0x03,0x36, +0xFF,0xFF,0x02,0x24, +0x21,0x98,0x00,0x00, +0x00,0x00,0xA0,0xAC, +0x00,0x00,0x62,0xAC, +0x1B,0x1F,0x00,0x08, +0x25,0xB0,0x04,0x3C, +0x84,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x1E,0x00,0x40,0x14, +0x00,0xFE,0x07,0x3C, +0xA4,0x00,0xA2,0x34, +0x8F,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x47,0x00,0x40,0x14, +0xA7,0x00,0xA2,0x34, +0xA1,0x00,0xA2,0x34, +0xEA,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0xAD,0x00,0x40,0x14, +0xA2,0x00,0xA2,0x34, +0xA0,0x00,0xA2,0x34, +0xBE,0xFF,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x00,0x0F,0x42,0x32, +0x02,0x22,0x02,0x00, +0x01,0x00,0x03,0x24, +0x96,0x02,0x83,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x02,0x24, +0x8F,0x02,0x82,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x02,0x24, +0x88,0x02,0x82,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x5A,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x12,0x00,0xE2,0x34, +0x65,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x37,0x00,0x40,0x14, +0x1A,0x00,0xE2,0x34, +0xAF,0x00,0xA2,0x34, +0xC8,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x97,0x00,0x40,0x14, +0x10,0x00,0xE2,0x34, +0xAD,0x00,0xA2,0x34, +0x44,0x02,0x62,0x10, +0x00,0x00,0x00,0x00, +0xAE,0x00,0xA2,0x34, +0x9C,0xFF,0x62,0x14, +0x02,0x24,0x12,0x00, +0x00,0xFF,0x45,0x32, +0xFF,0x00,0x84,0x30, +0x58,0x5A,0x00,0x0C, +0x02,0x2A,0x05,0x00, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x62,0xA0, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x73,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x35,0x00,0x40,0x14, +0x18,0x00,0xA2,0x34, +0x00,0xF8,0x04,0x3C, +0x16,0x00,0x82,0x34, +0xB6,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x90,0x00,0x40,0x14, +0x17,0x00,0x82,0x34, +0x15,0x00,0x82,0x34, +0x84,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0xA7,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x6A,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0xB7,0x00,0x40,0x14, +0xAA,0x00,0xA2,0x34, +0xA5,0x00,0xA2,0x34, +0x35,0x02,0x62,0x10, +0x24,0x20,0x44,0x02, +0xA6,0x00,0xA2,0x34, +0x76,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0xF7,0x5B,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x75,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x80,0x00,0x40,0x14, +0x0F,0x00,0xC2,0x34, +0x18,0x00,0xE2,0x34, +0xC1,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x19,0x00,0xE2,0x34, +0x68,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xA2,0x26, +0x2A,0x1C,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x64,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x3E,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x74,0x00,0x40,0x14, +0x19,0x00,0xA2,0x34, +0x14,0x00,0xA2,0x34, +0x96,0x01,0x62,0x10, +0x17,0x00,0xA2,0x34, +0x51,0xFF,0x62,0x14, +0x25,0xB0,0x04,0x3C, +0x68,0x03,0x85,0x34, +0x00,0x00,0xA3,0x8C, +0x00,0xFF,0x42,0x32, +0x00,0x12,0x02,0x00, +0xFF,0xFF,0x73,0x30, +0x25,0x10,0x53,0x00, +0x00,0x00,0xA2,0xAC, +0x64,0x03,0x84,0x34, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x53,0x30, +0x40,0x00,0x63,0x36, +0x00,0x00,0x83,0xA0, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x02,0x00,0xE2,0x34, +0x3F,0xFF,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x9B,0x00,0x40,0x14, +0x04,0x00,0xE2,0x34, +0x08,0x00,0xA2,0x34, +0xA3,0x01,0x62,0x10, +0x00,0xFF,0x42,0x32, +0x38,0xFF,0x67,0x14, +0x25,0xB0,0x04,0x3C, +0xFF,0x00,0x05,0x3C, +0x00,0xFF,0xA5,0x34, +0x24,0x28,0x45,0x02, +0x02,0x2A,0x05,0x00, +0x94,0x00,0x83,0x34, +0x40,0x11,0x05,0x00, +0x26,0xB0,0x06,0x3C, +0x00,0x00,0x65,0xA4, +0xC0,0xFF,0x53,0x24, +0x7C,0x00,0xCC,0x34, +0x04,0x00,0x07,0x24, +0x9A,0x00,0x88,0x34, +0x98,0x00,0x89,0x34, +0x96,0x00,0x8A,0x34, +0x7A,0x00,0xC6,0x34, +0xB0,0x03,0x8B,0x34, +0x00,0x04,0x02,0x24, +0xA0,0x00,0x03,0x24, +0x00,0x00,0x02,0xA5, +0x44,0x00,0x84,0x34, +0x00,0x00,0x23,0xA5, +0x00,0x00,0x47,0xA5, +0x00,0x00,0xC7,0xA0, +0x00,0x00,0x73,0xAD, +0x00,0x00,0x93,0xA5, +0x00,0x00,0x83,0x94, +0xFF,0xFD,0x02,0x24, +0x30,0x1F,0xA6,0x26, +0x24,0x18,0x62,0x00, +0x00,0x00,0x83,0xA4, +0x00,0x00,0x82,0x94, +0xBA,0x1B,0xC5,0xA4, +0x00,0x02,0x42,0x34, +0x00,0x00,0x82,0xA4, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xBF,0x01,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0xA3,0x00,0xA2,0x34, +0x10,0xFF,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xA2,0x26, +0x16,0x1F,0x00,0x08, +0x30,0x38,0x40,0xAC, +0x3A,0x01,0x62,0x10, +0x11,0x00,0xE2,0x34, +0x08,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xFF,0x00,0x04,0x3C, +0x00,0xFF,0x84,0x34, +0x24,0x20,0x44,0x02, +0x30,0x1F,0xA2,0x26, +0x02,0x22,0x04,0x00, +0xC2,0x34,0x00,0x0C, +0x2A,0x1C,0x40,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x9F,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x18,0x00,0x82,0x34, +0xF3,0xFE,0x62,0x14, +0x00,0x00,0x00,0x00, +0x0A,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x4E,0x01,0x62,0x10, +0x10,0x00,0xC2,0x34, +0xEC,0xFE,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x00,0xFF,0x43,0x32, +0x00,0xFF,0x02,0x34, +0xDA,0xFF,0x62,0x14, +0x30,0x1F,0xA2,0x26, +0x30,0x1F,0xA3,0x26, +0xFF,0xFF,0x02,0x34, +0x16,0x1F,0x00,0x08, +0x30,0x38,0x62,0xAC, +0x96,0x01,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0x28,0x00,0xA2,0x34, +0xDE,0xFE,0x62,0x14, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x60,0x00,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0xE8,0x03,0x04,0x24, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x24,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x36, +0x1F,0x00,0x53,0x30, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x53,0xA0, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x84,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0xAB,0x00,0xA2,0x34, +0xC1,0xFE,0x62,0x14, +0x00,0x00,0x00,0x00, +0xE6,0x5F,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x4C,0x01,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0x02,0x00,0xA2,0x34, +0xB9,0xFE,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x02,0x14,0x12,0x00, +0x00,0xFF,0x43,0x32, +0xFF,0x00,0x45,0x30, +0x04,0x00,0xA0,0x10, +0x02,0x92,0x03,0x00, +0x01,0x00,0x02,0x24, +0x02,0x00,0xA2,0x10, +0x01,0x00,0x04,0x24, +0x21,0x20,0x00,0x00, +0xE6,0x44,0x00,0x0C, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x8A,0x47,0x00,0x0C, +0x21,0x20,0x40,0x02, +0xFF,0xFF,0x10,0x36, +0x24,0x98,0x50,0x00, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x53,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x15,0x01,0x62,0x10, +0x24,0x10,0x44,0x02, +0xA0,0xFE,0x66,0x14, +0x25,0xB0,0x02,0x3C, +0x25,0xB0,0x05,0x3C, +0x74,0x03,0xA3,0x34, +0x00,0x00,0x64,0x8C, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x90,0x82,0x00, +0x01,0x00,0x03,0x3C, +0x2B,0x18,0x72,0x00, +0x95,0xFE,0x60,0x10, +0x00,0xB0,0x02,0x3C, +0x25,0x90,0x42,0x02, +0x00,0x00,0x53,0x8E, +0x78,0x03,0xA2,0x34, +0x00,0x00,0x53,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x02,0x1A,0x08,0x00, +0xFF,0x00,0x02,0x24, +0x56,0x01,0x62,0x10, +0x25,0xB0,0x05,0x3C, +0x0E,0x00,0x60,0x14, +0x00,0xCC,0x02,0x34, +0x25,0xB0,0x04,0x3C, +0x64,0x03,0x84,0x34, +0x30,0x1F,0xA7,0x26, +0x00,0x00,0x85,0x94, +0xE4,0x02,0xE6,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFE,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x24,0x28,0xA3,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x00,0x85,0xA4, +0xE4,0x02,0xE6,0xAC, +0x00,0xCC,0x02,0x34, +0x7B,0xFE,0x02,0x15, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xA5,0x26, +0xE4,0x02,0xA3,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x10,0x04,0x3C, +0x25,0x18,0x64,0x00, +0x16,0x1F,0x00,0x08, +0xE4,0x02,0xA3,0xAC, +0x02,0x14,0x12,0x00, +0x00,0x1F,0x43,0x32, +0x02,0x9A,0x03,0x00, +0x3F,0x00,0x42,0x30, +0xC1,0x02,0x22,0xA2, +0xBC,0x02,0x33,0xA2, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x76,0x2C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x98,0x40,0x00, +0x74,0x03,0x02,0x36, +0x00,0x00,0x53,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x03,0x00,0x22,0x92, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x16,0x1F,0x00,0x08, +0x03,0x00,0x22,0xA2, +0x74,0x03,0x03,0x36, +0x00,0x00,0x64,0x8C, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x90,0x82,0x00, +0x01,0x00,0x03,0x3C, +0x2B,0x18,0x72,0x00, +0x51,0xFE,0x60,0x10, +0x78,0x03,0x02,0x36, +0x00,0x00,0x53,0x8C, +0x00,0xB0,0x03,0x3C, +0x25,0x90,0x43,0x02, +0x00,0x00,0x53,0xAE, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xBE,0x59,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0x02,0x2A,0x02,0x00, +0x2B,0x1C,0x25,0xA2, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xFF,0xFF,0x02,0x34, +0x16,0x1F,0x00,0x08, +0x30,0x38,0x22,0xAE, +0x24,0x10,0x44,0x02, +0x00,0xFF,0x43,0x32, +0x02,0x2C,0x02,0x00, +0x04,0x00,0xA0,0x10, +0x02,0x92,0x03,0x00, +0x01,0x00,0x02,0x24, +0x02,0x00,0xA2,0x10, +0x01,0x00,0x04,0x24, +0x21,0x20,0x00,0x00, +0x25,0xB0,0x10,0x3C, +0xE6,0x44,0x00,0x0C, +0x74,0x03,0x10,0x36, +0x00,0x00,0x13,0x8E, +0x0F,0x00,0x11,0x3C, +0x21,0x20,0x40,0x02, +0x21,0x30,0x60,0x02, +0x5F,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x21,0x20,0x40,0x02, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x00,0x00,0x02,0xAE, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x85,0x5F,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x08,0x00,0x23,0x8E, +0xFF,0x9F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x16,0x1F,0x00,0x08, +0x08,0x00,0x23,0xAE, +0x00,0xFF,0x42,0x32, +0x24,0x18,0x44,0x02, +0x02,0x9A,0x02,0x00, +0x01,0x00,0x02,0x24, +0x95,0x00,0x62,0x12, +0x02,0x1C,0x03,0x00, +0x02,0x00,0x02,0x24, +0xA9,0x00,0x62,0x12, +0xC0,0x10,0x03,0x00, +0x03,0x00,0x02,0x24, +0x09,0xFE,0x62,0x16, +0xC0,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x02,0x80,0x04,0x3C, +0x4C,0x43,0x83,0x24, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x64,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0x02,0x2A,0x02,0x00, +0x01,0x00,0x03,0x24, +0x77,0x00,0xA3,0x10, +0x74,0x03,0x02,0x36, +0x02,0x00,0xA2,0x28, +0xB7,0x00,0x40,0x14, +0x03,0x00,0x02,0x24, +0x06,0x00,0xA2,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0xA2,0x26, +0x24,0x1C,0x44,0x94, +0x25,0xB0,0x03,0x3C, +0x18,0x21,0x00,0x08, +0x74,0x03,0x63,0x34, +0x30,0x1F,0xA2,0x26, +0x26,0x1C,0x44,0x94, +0x25,0xB0,0x03,0x3C, +0x18,0x21,0x00,0x08, +0x74,0x03,0x63,0x34, +0x24,0x10,0x42,0x02, +0x02,0x92,0x02,0x00, +0x21,0x18,0x50,0x02, +0x00,0x00,0x73,0x8C, +0x74,0x03,0x02,0x36, +0x00,0x00,0x53,0xAC, +0x00,0x00,0x73,0x8C, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xA6,0x5A,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x24,0x20,0x44,0x02, +0x56,0x25,0x00,0x0C, +0x02,0x24,0x04,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xD7,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xA3,0x26, +0x2A,0x1C,0x62,0x90, +0x00,0x00,0x00,0x00, +0x6A,0xFE,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0x02,0x2A,0x02,0x00, +0x01,0x00,0x02,0x24, +0x21,0x20,0xA0,0x00, +0x2A,0x1C,0x62,0xA0, +0xC2,0x34,0x00,0x0C, +0x2B,0x1C,0x65,0xA0, +0x1A,0x20,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0xBB,0xFD,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xA3,0x26, +0x04,0x03,0x66,0x90, +0x24,0x20,0x44,0x02, +0x00,0xFF,0x45,0x32, +0x02,0x24,0x04,0x00, +0x02,0x2A,0x05,0x00, +0x00,0x01,0xC6,0x34, +0xFB,0xFF,0x87,0x24, +0xFB,0xFF,0xA2,0x24, +0x1F,0x03,0x62,0xA0, +0x04,0x03,0x66,0xAC, +0x1D,0x03,0x67,0xA0, +0x1C,0x03,0x64,0xA0, +0x16,0x1F,0x00,0x08, +0x1E,0x03,0x65,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xA2,0x26, +0x2B,0x1C,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x64,0xAC, +0xB8,0x1F,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xFF,0x00,0x02,0x24, +0x56,0x01,0x63,0x34, +0x00,0x00,0x62,0xA4, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x16,0x1F,0x00,0x08, +0x08,0x5E,0x44,0xA0, +0x02,0x92,0x02,0x00, +0x05,0x00,0x40,0x12, +0x21,0x20,0x00,0x00, +0x01,0x00,0x02,0x24, +0x02,0x00,0x42,0x12, +0x01,0x00,0x04,0x24, +0x21,0x20,0x00,0x00, +0xE6,0x44,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x02,0x9C,0x02,0x00, +0x00,0xFF,0x43,0x32, +0x07,0x00,0x62,0x2E, +0x88,0xFD,0x40,0x10, +0x02,0x2A,0x03,0x00, +0x02,0x80,0x04,0x3C, +0x50,0xED,0x83,0x24, +0x80,0x10,0x13,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x22,0x1C,0x23,0x96, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xC0,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x51,0x00, +0x14,0x24,0x44,0x8C, +0x74,0x03,0x03,0x36, +0x00,0x00,0x64,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0xFF,0x83,0x34, +0x74,0x03,0x44,0x34, +0x00,0x00,0x93,0x8C, +0x24,0x18,0x43,0x02, +0x02,0x92,0x03,0x00, +0x21,0x10,0x42,0x02, +0x00,0x00,0x53,0xAC, +0x00,0x00,0x53,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x93,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x51,0x00, +0x18,0x24,0x44,0x8C, +0xA4,0x21,0x00,0x08, +0x74,0x03,0x03,0x36, +0xCD,0x59,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x3D,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x45,0x8C, +0x00,0xFF,0x84,0x34, +0x24,0x20,0x44,0x02, +0xC1,0x5B,0x00,0x0C, +0x02,0x22,0x04,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x70,0x03,0x42,0x34, +0x21,0x20,0x40,0x02, +0x00,0x00,0x40,0xAC, +0x6B,0x1E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xF5,0x5B,0x00,0x0C, +0x02,0x24,0x04,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x4B,0xFF,0xA0,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0xA2,0x26, +0x20,0x1C,0x44,0x94, +0x25,0xB0,0x03,0x3C, +0x18,0x21,0x00,0x08, +0x74,0x03,0x63,0x34, +0x64,0x03,0xA5,0x34, +0x30,0x1F,0xA6,0x26, +0x00,0x00,0xA3,0x94, +0xE4,0x02,0xC4,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x82,0x00, +0x00,0x01,0x63,0x34, +0x00,0x00,0xA3,0xA4, +0x9A,0x20,0x00,0x08, +0xE4,0x02,0xC4,0xAC, +0xCD,0x5A,0x00,0x0C, +0x03,0x00,0x04,0x24, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xCD,0x5A,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xCD,0x5A,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x36,0x03,0x64,0x94, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x44,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x35,0x03,0x64,0x90, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x34,0x03,0x64,0x90, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x32,0x03,0x64,0x94, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x30,0x03,0x64,0x94, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x11,0x05,0x00, +0x30,0x1F,0xA3,0x26, +0x21,0x10,0x43,0x00, +0x2C,0x03,0x44,0x8C, +0xFC,0x21,0x00,0x08, +0x42,0x26,0x04,0x00, +0x00,0x11,0x05,0x00, +0x30,0x1F,0xA3,0x26, +0x21,0x10,0x43,0x00, +0x2F,0x03,0x44,0x90, +0xFC,0x21,0x00,0x08, +0x01,0x00,0x84,0x30, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x94,0x88,0x63,0x24, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x05,0x3C, +0xD4,0x5E,0xA5,0x8C, +0x04,0x00,0x02,0x24, +0x1E,0x00,0xA2,0x10, +0x05,0x00,0xA2,0x2C, +0x10,0x00,0x40,0x10, +0x05,0x00,0x02,0x24, +0x03,0x00,0x02,0x24, +0x08,0x00,0xA2,0x10, +0x00,0x19,0x04,0x00, +0x80,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0xC0,0x10,0x02,0x00, +0x23,0x10,0x44,0x00, +0x00,0x11,0x02,0x00, +0x21,0x10,0x44,0x00, +0x40,0x19,0x02,0x00, +0xFF,0xFF,0x63,0x24, +0xFE,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0xA2,0x10, +0x06,0x00,0x02,0x24, +0xF2,0xFF,0xA2,0x14, +0x80,0x10,0x04,0x00, +0x40,0x11,0x04,0x00, +0x23,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x00,0x19,0x02,0x00, +0x23,0x18,0x62,0x00, +0x3B,0x22,0x00,0x08, +0x00,0x19,0x03,0x00, +0x80,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0xC0,0x10,0x02,0x00, +0x23,0x10,0x44,0x00, +0x00,0x11,0x02,0x00, +0x21,0x10,0x44,0x00, +0x3B,0x22,0x00,0x08, +0x00,0x19,0x02,0x00, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x50,0x89,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x05,0x3C, +0xD4,0x5E,0xA3,0x8C, +0x05,0x00,0x02,0x24, +0x06,0x00,0x62,0x10, +0x06,0x00,0x62,0x2C, +0x0C,0x00,0x40,0x10, +0x06,0x00,0x02,0x24, +0x04,0x00,0x02,0x24, +0x0E,0x00,0x62,0x10, +0x80,0x10,0x04,0x00, +0x80,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0xFF,0xFF,0x42,0x24, +0xFE,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xF7,0xFF,0x62,0x14, +0x00,0x11,0x04,0x00, +0x23,0x10,0x44,0x00, +0x66,0x22,0x00,0x08, +0x40,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x66,0x22,0x00,0x08, +0x40,0x10,0x02,0x00, +0xFF,0xFF,0x85,0x30, +0x21,0x30,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x2A,0xB0,0x04,0x3C, +0xB4,0x00,0x63,0x34, +0x01,0x00,0xA2,0x24, +0x31,0x00,0x84,0x34, +0x00,0x00,0x65,0xA0, +0x00,0x00,0x85,0xA0, +0xFF,0xFF,0x45,0x30, +0x12,0x00,0xA0,0x10, +0x01,0x00,0x03,0x24, +0x28,0xB0,0x07,0x3C, +0x88,0x22,0x00,0x08, +0xFF,0xFF,0x08,0x24, +0x00,0x00,0x83,0xA0, +0x01,0x00,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x2B,0x10,0xA3,0x00, +0x09,0x00,0x40,0x14, +0x08,0x00,0xC6,0x24, +0xF9,0xFF,0x65,0x14, +0x21,0x20,0xC7,0x00, +0x01,0x00,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x2B,0x10,0xA3,0x00, +0x00,0x00,0x88,0xA0, +0xF9,0xFF,0x40,0x10, +0x08,0x00,0xC6,0x24, +0x00,0x01,0xA2,0x2C, +0x13,0x00,0x40,0x10, +0x21,0x18,0xA0,0x00, +0xFF,0x00,0x08,0x24, +0x28,0xB0,0x07,0x3C, +0x9C,0x22,0x00,0x08, +0xFF,0xFF,0x09,0x24, +0xFF,0xFF,0x43,0x30, +0x00,0x00,0xA2,0xA0, +0x00,0x01,0x62,0x2C, +0x0A,0x00,0x40,0x10, +0x08,0x00,0xC6,0x24, +0x01,0x00,0x62,0x24, +0xF9,0xFF,0x68,0x14, +0x21,0x28,0xC7,0x00, +0x00,0x01,0x02,0x24, +0xFF,0xFF,0x43,0x30, +0x00,0x01,0x62,0x2C, +0x00,0x00,0xA9,0xA0, +0xF8,0xFF,0x40,0x14, +0x08,0x00,0xC6,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD0,0xFF,0xBD,0x27, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x03,0x36, +0x00,0x00,0x60,0xA4, +0xA8,0x00,0x13,0x36, +0xA0,0x00,0x12,0x36, +0xA4,0x00,0x10,0x36, +0x00,0x00,0x55,0x8E, +0x00,0x00,0x16,0x8E, +0x00,0x00,0x71,0x8E, +0x00,0x80,0x14,0x3C, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x40,0xAE, +0xFD,0x00,0x04,0x24, +0x00,0x00,0x00,0xAE, +0x21,0x88,0x34,0x02, +0x00,0x00,0x74,0xAE, +0x00,0x00,0x62,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x55,0xAE, +0x00,0x00,0x16,0xAE, +0x00,0x00,0x71,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x05,0x36, +0x00,0x00,0xA2,0x94, +0x24,0xFA,0x03,0x24, +0xA8,0x00,0x13,0x36, +0x24,0x10,0x43,0x00, +0x00,0x00,0xA2,0xA4, +0xA0,0x00,0x12,0x36, +0xA4,0x00,0x10,0x36, +0x00,0x00,0x55,0x8E, +0x00,0x00,0x16,0x8E, +0x00,0x00,0x71,0x8E, +0x00,0x80,0x14,0x3C, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x40,0xAE, +0xFD,0x00,0x04,0x24, +0x00,0x00,0x00,0xAE, +0x21,0x88,0x34,0x02, +0x00,0x00,0x74,0xAE, +0x00,0x00,0xA2,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x55,0xAE, +0x00,0x00,0x16,0xAE, +0x00,0x00,0x71,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x05,0x36, +0x00,0x00,0xA2,0x94, +0xAF,0xFF,0x03,0x24, +0xA8,0x00,0x13,0x36, +0x24,0x10,0x43,0x00, +0x00,0x00,0xA2,0xA4, +0xA0,0x00,0x12,0x36, +0xA4,0x00,0x10,0x36, +0x00,0x00,0x55,0x8E, +0x00,0x00,0x16,0x8E, +0x00,0x00,0x71,0x8E, +0x00,0x80,0x14,0x3C, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x40,0xAE, +0xFD,0x00,0x04,0x24, +0x00,0x00,0x00,0xAE, +0x21,0x88,0x34,0x02, +0x00,0x00,0x74,0xAE, +0x00,0x00,0xA2,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x55,0xAE, +0x00,0x00,0x16,0xAE, +0x00,0x00,0x71,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x04,0x3C, +0x40,0x00,0x84,0x34, +0x00,0x00,0x82,0x94, +0xD8,0xFD,0x03,0x24, +0x24,0x10,0x43,0x00, +0xFC,0x37,0x03,0x24, +0x00,0x00,0x82,0xA4, +0x00,0x00,0x83,0xA4, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x84,0x30, +0xFF,0xFF,0xAC,0x30, +0xC0,0x48,0x04,0x00, +0x00,0x60,0x0E,0x40, +0x01,0x00,0xC1,0x35, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x02,0x3C, +0x40,0x02,0x4D,0x34, +0xF8,0xFF,0xE7,0x24, +0x21,0x40,0x00,0x00, +0x01,0x00,0x0F,0x24, +0x44,0x02,0x4B,0x34, +0x72,0x23,0x00,0x08, +0x01,0x80,0x0A,0x3C, +0x28,0x00,0x0F,0x11, +0x00,0x00,0x00,0x00, +0x01,0x00,0xE2,0x90, +0x00,0x00,0xE4,0x90, +0x02,0x00,0xE3,0x90, +0x03,0x00,0xE5,0x90, +0x00,0x12,0x02,0x00, +0x25,0x20,0x82,0x00, +0x00,0x1C,0x03,0x00, +0x25,0x20,0x83,0x00, +0x21,0x10,0x28,0x01, +0x00,0x2E,0x05,0x00, +0x01,0x00,0x08,0x25, +0x25,0x20,0x85,0x00, +0x25,0x10,0x4A,0x00, +0x06,0x00,0x03,0x2D, +0x00,0x00,0x64,0xAD, +0x04,0x00,0xE7,0x24, +0x00,0x00,0xA2,0xAD, +0x12,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0xEA,0xFF,0x00,0x15, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0x90, +0x01,0x00,0xC3,0x90, +0x04,0x00,0xE7,0x24, +0x00,0x14,0x02,0x00, +0x25,0x10,0x82,0x01, +0x00,0x1E,0x03,0x00, +0x25,0x20,0x43,0x00, +0x21,0x10,0x28,0x01, +0x01,0x00,0x08,0x25, +0x25,0x10,0x4A,0x00, +0x06,0x00,0x03,0x2D, +0x00,0x00,0x64,0xAD, +0x00,0x00,0xA2,0xAD, +0xF0,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x8E,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x03,0x00,0xC2,0x90, +0x02,0x00,0xC4,0x90, +0x04,0x00,0xC3,0x90, +0x05,0x00,0xC5,0x90, +0x64,0x23,0x00,0x08, +0x00,0x12,0x02,0x00, +0xFF,0xFF,0x84,0x30, +0x42,0xB0,0x08,0x3C, +0x80,0x10,0x04,0x00, +0x21,0x10,0x48,0x00, +0x04,0x00,0x46,0xAC, +0x00,0x00,0x07,0x91, +0x40,0x18,0x04,0x00, +0x03,0x00,0x06,0x24, +0xFF,0x00,0xE7,0x30, +0x04,0x30,0x66,0x00, +0x01,0x00,0x02,0x24, +0x04,0x10,0x62,0x00, +0x25,0x30,0xC7,0x00, +0xFF,0xFF,0xA5,0x30, +0x25,0x10,0x47,0x00, +0x02,0x00,0xA0,0x14, +0xFF,0x00,0xC7,0x30, +0xFF,0x00,0x47,0x30, +0x42,0xB0,0x02,0x3C, +0x00,0x00,0x47,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x14,0x00,0x83,0x90, +0x01,0x00,0x02,0x24, +0x08,0x00,0x86,0xAC, +0x18,0x00,0x85,0xAC, +0x00,0x00,0x84,0xAC, +0x03,0x00,0x62,0x10, +0x04,0x00,0x84,0xAC, +0x99,0x59,0x00,0x08, +0x0C,0x00,0x80,0xAC, +0x0C,0x00,0x82,0x8C, +0x99,0x59,0x00,0x08, +0x10,0x00,0x82,0xAC, +0xC8,0xFF,0xBD,0x27, +0x28,0x00,0xB6,0xAF, +0x25,0xB0,0x02,0x3C, +0x02,0x80,0x16,0x3C, +0x2C,0x00,0xB7,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x30,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x18,0x03,0x55,0x34, +0x01,0x80,0x17,0x3C, +0x02,0x80,0x13,0x3C, +0x02,0x80,0x14,0x3C, +0x08,0xE4,0xD2,0x26, +0xB8,0x8E,0xE2,0x26, +0x00,0x00,0xA2,0xAE, +0x08,0xE4,0xD0,0x8E, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x14,0x5E,0x71,0x8E, +0x00,0x00,0x00,0x00, +0x25,0x00,0x20,0x12, +0x00,0x00,0x00,0x00, +0x14,0x5E,0x60,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x23,0x00,0x12,0x12, +0x08,0x0C,0x84,0x26, +0x14,0x00,0x03,0x92, +0x01,0x00,0x02,0x24, +0x2B,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x60,0x14, +0x02,0x00,0x02,0x24, +0x0C,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x23,0x02, +0x1E,0x00,0x40,0x10, +0x23,0x10,0x71,0x00, +0x0C,0x00,0x02,0xAE, +0x00,0x00,0x10,0x8E, +0xCE,0x23,0x00,0x08, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x60,0x10, +0x2B,0x10,0x23,0x02, +0xF5,0xFF,0x40,0x14, +0x23,0x10,0x71,0x00, +0x08,0x00,0x02,0x8E, +0x18,0x00,0x04,0x8E, +0x09,0xF8,0x40,0x00, +0x0C,0x00,0x00,0xAE, +0x00,0x00,0x10,0x8E, +0xCE,0x23,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x08,0x0C,0x84,0x26, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xC0,0x23,0x00,0x08, +0xB8,0x8E,0xE2,0x26, +0x08,0x00,0x02,0x8E, +0x18,0x00,0x04,0x8E, +0x09,0xF8,0x40,0x00, +0x00,0x00,0x00,0x00, +0xDC,0x23,0x00,0x08, +0x0C,0x00,0x02,0xAE, +0x0C,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x23,0x02, +0xD9,0xFF,0x40,0x14, +0x23,0x10,0x71,0x00, +0x08,0x00,0x02,0x8E, +0x18,0x00,0x04,0x8E, +0x09,0xF8,0x40,0x00, +0x00,0x00,0x00,0x00, +0x10,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x03,0xAE, +0x00,0x00,0x10,0x8E, +0xCE,0x23,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x9C,0x57,0x42,0x24, +0xC0,0x20,0x04,0x00, +0x21,0x20,0x82,0x00, +0x21,0x28,0x00,0x00, +0x00,0x60,0x06,0x40, +0x01,0x00,0xC1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x00,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x09,0x00,0x44,0x10, +0x00,0x00,0x00,0x00, +0x04,0x00,0x43,0x8C, +0x21,0x28,0x40,0x00, +0x00,0x00,0x42,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x00,0x00,0xA5,0xAC, +0x04,0x00,0xA5,0xAC, +0x00,0x60,0x86,0x40, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x21,0x18,0x80,0x00, +0xE8,0xFF,0xBD,0x27, +0x01,0x01,0x62,0x2C, +0x10,0x00,0xBF,0xAF, +0x01,0x00,0x04,0x24, +0x01,0x02,0x65,0x2C, +0x0A,0x00,0x40,0x14, +0x21,0x30,0x00,0x00, +0x02,0x00,0x04,0x24, +0x07,0x00,0xA0,0x14, +0x01,0x08,0x62,0x2C, +0x05,0x00,0x40,0x14, +0x03,0x00,0x04,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0xC0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x0D,0x24,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x21,0x30,0x40,0x00, +0x21,0x10,0xC0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x00,0x60,0x06,0x40, +0x01,0x00,0xC1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x10,0x00,0x83,0x8C, +0x02,0x80,0x02,0x3C, +0x9C,0x57,0x42,0x24, +0xC0,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0x65,0x8C, +0x02,0x80,0x07,0x3C, +0x02,0x80,0x08,0x3C, +0x00,0x00,0x85,0xAC, +0x04,0x00,0xA4,0xAC, +0x04,0x00,0x83,0xAC, +0xD0,0x5E,0xE5,0x8C, +0x00,0x00,0x00,0x00, +0x05,0x00,0xA0,0x10, +0x00,0x00,0x64,0xAC, +0xBC,0x5E,0x02,0x8D, +0xD0,0x5E,0xE0,0xAC, +0x25,0x10,0x45,0x00, +0xBC,0x5E,0x02,0xAD, +0x00,0x60,0x86,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xA5,0x30, +0x25,0xB0,0x02,0x3C, +0x21,0x28,0xA2,0x00, +0xFF,0x00,0x84,0x30, +0x60,0x01,0xA4,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x84,0x30, +0x01,0x00,0x03,0x24, +0x10,0x00,0x02,0x3C, +0x04,0x18,0x83,0x00, +0xF0,0x70,0x42,0x34, +0x15,0x00,0x84,0x2C, +0x06,0x00,0x80,0x10, +0x24,0x28,0x62,0x00, +0x0F,0x00,0x63,0x30, +0x04,0x00,0xA0,0x14, +0x01,0x00,0x02,0x24, +0x02,0x00,0x60,0x14, +0x02,0x00,0x02,0x24, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xA5,0x30, +0x04,0x00,0xA2,0x2C, +0x14,0x00,0x40,0x10, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x2C, +0x0E,0x00,0x40,0x10, +0x02,0x00,0x03,0x24, +0x24,0x00,0x83,0x10, +0x0F,0x10,0x02,0x3C, +0x03,0x00,0x82,0x28, +0x14,0x00,0x40,0x10, +0x03,0x00,0x02,0x24, +0x01,0x00,0x02,0x24, +0x2F,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0xFF,0x1F,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0xFF,0xFF,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x35,0x00,0x83,0x10, +0x0F,0x1F,0x02,0x3C, +0x03,0x00,0x82,0x28, +0x16,0x00,0x40,0x10, +0x03,0x00,0x02,0x24, +0x01,0x00,0x02,0x24, +0xF4,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x1F,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0x80,0x42,0x34, +0xF0,0xFF,0x82,0x14, +0xFF,0x1F,0x02,0x3C, +0x01,0x00,0x02,0x24, +0x29,0x00,0xA2,0x10, +0x0F,0x10,0x02,0x3C, +0x02,0x00,0xA2,0x28, +0x1F,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x28,0x00,0xA3,0x10, +0x00,0x00,0x00,0x00, +0xE5,0xFF,0xA4,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0xF0,0x42,0x34, +0xE1,0xFF,0x82,0x14, +0xFF,0x1F,0x02,0x3C, +0x01,0x00,0x02,0x24, +0x1C,0x00,0xA2,0x10, +0x0F,0x00,0x02,0x3C, +0x02,0x00,0xA2,0x28, +0x0B,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xA3,0x10, +0x00,0x00,0x00,0x00, +0xD6,0xFF,0xA4,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0xF0,0x42,0x34, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0x80,0x42,0x34, +0xCE,0xFF,0xA0,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x15,0xF0,0x42,0x34, +0xC9,0xFF,0xA0,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x15,0xF0,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x00,0xF0,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x10,0xF0,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x10,0xF0,0x42,0x34, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x05,0xF0,0x42,0x34, +0x0F,0x00,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x05,0xF0,0x42,0x34, +0xC0,0x40,0x04,0x00, +0x21,0x18,0x04,0x01, +0x80,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x02,0x80,0x02,0x3C, +0x80,0x18,0x03,0x00, +0x30,0x1F,0x42,0x24, +0x21,0x18,0x62,0x00, +0x18,0x24,0x66,0x8C, +0x21,0x38,0x60,0x00, +0x1E,0x24,0x60,0xA0, +0x1F,0x24,0x60,0xA0, +0x1C,0x00,0x05,0x24, +0xDA,0x24,0x00,0x08, +0x01,0x00,0x03,0x24, +0x08,0x00,0xA0,0x04, +0x21,0x10,0x04,0x01, +0x04,0x10,0xA3,0x00, +0x24,0x10,0xC2,0x00, +0xFB,0xFF,0x40,0x10, +0xFF,0xFF,0xA5,0x24, +0x01,0x00,0xA5,0x24, +0x1E,0x24,0xE5,0xA0, +0x21,0x10,0x04,0x01, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x63,0x24, +0x21,0x18,0x43,0x00, +0x18,0x24,0x66,0x8C, +0x21,0x28,0x00,0x00, +0xEE,0x24,0x00,0x08, +0x01,0x00,0x07,0x24, +0x1D,0x00,0xA2,0x28, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x04,0x10,0xA7,0x00, +0x24,0x10,0xC2,0x00, +0xFA,0xFF,0x40,0x10, +0x01,0x00,0xA5,0x24, +0xFF,0xFF,0xA5,0x24, +0x08,0x00,0xE0,0x03, +0x1F,0x24,0x65,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x88,0x00,0x00, +0x30,0x1F,0x50,0x24, +0xFF,0xF1,0x14,0x24, +0x25,0xB0,0x13,0x3C, +0x24,0x00,0xBF,0xAF, +0x08,0x25,0x00,0x08, +0x18,0x00,0xB2,0xAF, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2E, +0x2A,0x00,0x40,0x10, +0x94,0x00,0x10,0x26, +0x1C,0x24,0x06,0x8E, +0x01,0x00,0x03,0x24, +0x02,0x13,0x06,0x00, +0x01,0x00,0x45,0x30, +0xF7,0xFF,0xA3,0x14, +0x42,0x1A,0x06,0x00, +0x0C,0x24,0x02,0x8E, +0x07,0x00,0x64,0x30, +0x02,0x11,0x02,0x00, +0x7F,0x00,0x43,0x30, +0x27,0x00,0x85,0x10, +0x07,0x00,0xD2,0x30, +0x02,0x00,0x82,0x28, +0x31,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x28,0x00,0x82,0x10, +0x03,0x00,0x02,0x24, +0x31,0x00,0x82,0x10, +0x1A,0x00,0x62,0x2C, +0x1C,0x24,0x02,0x8E, +0x04,0x00,0x43,0x2E, +0x42,0x12,0x02,0x00, +0x0A,0x00,0x60,0x10, +0x07,0x00,0x44,0x30, +0x6E,0x24,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x80,0x18,0x12,0x00, +0x21,0x18,0x73,0x00, +0x14,0x24,0x04,0x8E, +0x84,0x01,0x65,0x8C, +0x24,0x20,0x82,0x00, +0x24,0x28,0xA4,0x00, +0x18,0x24,0x05,0xAE, +0xC9,0x24,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x10,0x33,0x02, +0x01,0x00,0x31,0x26, +0x60,0x01,0x43,0x90, +0x20,0x00,0x22,0x2E, +0xD8,0xFF,0x40,0x14, +0x94,0x00,0x10,0x26, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x32,0x00,0x62,0x2C, +0xDF,0xFF,0x40,0x10, +0x24,0x10,0xD4,0x00, +0x00,0x04,0x42,0x34, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0x38,0x00,0x62,0x2C, +0x0D,0x00,0x40,0x14, +0x14,0x00,0x62,0x2C, +0x24,0x10,0xD4,0x00, +0x00,0x02,0x42,0x34, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0xD3,0xFF,0x80,0x14, +0x24,0x10,0xD4,0x00, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0xCF,0xFF,0x40,0x14, +0x24,0x10,0xD4,0x00, +0x3E,0x25,0x00,0x08, +0x00,0x04,0x42,0x34, +0xCB,0xFF,0x40,0x10, +0x24,0x10,0xD4,0x00, +0x00,0x06,0x42,0x34, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0xC0,0x80,0x04,0x00, +0x21,0x80,0x04,0x02, +0x80,0x80,0x10,0x00, +0x21,0x80,0x04,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x80,0x10,0x00, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x21,0x80,0x02,0x02, +0x1C,0x24,0x03,0x8E, +0x25,0xB0,0x02,0x3C, +0x80,0x01,0x45,0x34, +0x07,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0xA6,0x90, +0x14,0x24,0x05,0x8E, +0x84,0x01,0x62,0x8C, +0x21,0x88,0x80,0x00, +0x24,0x10,0x45,0x00, +0xC9,0x24,0x00,0x0C, +0x18,0x24,0x02,0xAE, +0x1E,0x24,0x04,0x92, +0xFF,0x00,0x25,0x32, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x57,0x24,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xFF,0xFF,0x84,0x30, +0x00,0x02,0x82,0x30, +0x07,0x00,0x03,0x24, +0x0D,0x00,0x40,0x14, +0x0B,0x00,0x84,0x30, +0x0C,0x00,0x82,0x2C, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0x74,0xED,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x07,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x06,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x05,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x04,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x03,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x01,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x21,0x18,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xA8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x50,0x00,0xBE,0xAF, +0x4C,0x00,0xB7,0xAF, +0x48,0x00,0xB6,0xAF, +0x44,0x00,0xB5,0xAF, +0x3C,0x00,0xB3,0xAF, +0x38,0x00,0xB2,0xAF, +0x54,0x00,0xBF,0xAF, +0x40,0x00,0xB4,0xAF, +0x34,0x00,0xB1,0xAF, +0x30,0x00,0xB0,0xAF, +0xA4,0xED,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x21,0x98,0x00,0x00, +0x21,0xA8,0x00,0x00, +0x21,0xB0,0x00,0x00, +0x10,0x00,0xA0,0xAF, +0x21,0xB8,0x00,0x00, +0x14,0x00,0xA0,0xAF, +0x21,0xF0,0x00,0x00, +0x18,0x00,0xA0,0xAF, +0x1C,0x00,0xA0,0xAF, +0x20,0x00,0xA0,0xAF, +0x24,0x00,0xA0,0xAF, +0x28,0x00,0xA0,0xAF, +0x2C,0x00,0xA0,0xAF, +0x21,0x90,0x80,0x02, +0x1C,0x24,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x13,0x02,0x00, +0x01,0x00,0x42,0x30, +0x68,0x00,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x21,0x10,0x62,0x02, +0x60,0x01,0x44,0x90, +0x04,0x24,0x43,0x8E, +0x00,0x24,0x46,0x8E, +0xFF,0x00,0x8B,0x30, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0x21,0x10,0x64,0x01, +0xE7,0x04,0x44,0x90, +0xCA,0x04,0x45,0x90, +0xE8,0x23,0x47,0x8E, +0x18,0x00,0x64,0x00, +0x12,0x18,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x18,0x00,0xC5,0x00, +0x12,0x30,0x00,0x00, +0x21,0x30,0xC3,0x00, +0x2B,0x10,0xE6,0x00, +0x02,0x01,0x40,0x14, +0x23,0x10,0xE6,0x00, +0xE8,0x23,0x42,0xAE, +0x04,0x24,0x44,0x8E, +0x00,0x24,0x47,0x8E, +0xEC,0x23,0x48,0x8E, +0xF0,0x23,0x45,0x8E, +0xF8,0x23,0x46,0x8E, +0xFC,0x23,0x43,0x8E, +0x21,0x38,0xE4,0x00, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0x21,0x10,0x64,0x01, +0x21,0x40,0x05,0x01, +0x21,0x30,0xC3,0x00, +0x3E,0x05,0x42,0x90, +0xE8,0x23,0x4A,0x8E, +0x0C,0x00,0xE0,0x10, +0x21,0x48,0x00,0x00, +0x2B,0x48,0x47,0x00, +0x0B,0x00,0x20,0x15, +0x02,0x80,0x02,0x3C, +0x07,0x00,0x62,0x2D, +0x4B,0x01,0x40,0x14, +0xC0,0x10,0x07,0x00, +0x0C,0x00,0x02,0x24, +0x47,0x01,0x62,0x11, +0x0D,0x00,0x02,0x24, +0x46,0x01,0x62,0x11, +0xC0,0x10,0x07,0x00, +0x6C,0x00,0x20,0x11, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x0B,0x00, +0x21,0x18,0x62,0x00, +0x21,0x20,0x4B,0x02, +0x5A,0x24,0x85,0x90, +0x60,0x05,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x04,0x10,0xA2,0x00, +0x2B,0x10,0x4A,0x00, +0x61,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x78,0x24,0x42,0x8E, +0x01,0x00,0x07,0x24, +0x04,0x18,0x67,0x01, +0x24,0x10,0x43,0x00, +0xE1,0x00,0x40,0x10, +0x1C,0x00,0x62,0x2D, +0x21,0x28,0x4B,0x02, +0x20,0x24,0xA6,0x90, +0x5A,0x24,0xA2,0x90, +0x0A,0x00,0x04,0x24, +0xFF,0x00,0xC3,0x30, +0x04,0x20,0x44,0x00, +0x2A,0x18,0x64,0x00, +0xD8,0x00,0x60,0x10, +0x1C,0x00,0x62,0x2D, +0x01,0x00,0xC2,0x24, +0xFF,0x00,0x43,0x30, +0x37,0x01,0x64,0x10, +0x20,0x24,0xA2,0xA0, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x85,0x24, +0x80,0x10,0x0B,0x00, +0x21,0x10,0x45,0x00, +0xD4,0x05,0x44,0x8C, +0x60,0x05,0x43,0x8C, +0x18,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x30,0x45,0x00, +0x40,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x21,0x18,0x62,0x00, +0x82,0x50,0x03,0x00, +0xE8,0x23,0xCA,0xAC, +0x30,0x38,0xA3,0x8C, +0xFF,0xFF,0x02,0x34, +0x03,0x00,0x62,0x10, +0x21,0x20,0x60,0x01, +0x57,0x24,0x00,0x0C, +0xFF,0x00,0x65,0x32, +0x9E,0x00,0x60,0x12, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x82,0x24, +0x21,0x10,0xA2,0x02, +0xFC,0x23,0x40,0xAC, +0x00,0x24,0x40,0xAC, +0x04,0x24,0x40,0xAC, +0xEC,0x23,0x40,0xAC, +0xF0,0x23,0x40,0xAC, +0xF4,0x23,0x40,0xAC, +0xF8,0x23,0x40,0xAC, +0x2C,0x00,0xA2,0x8F, +0x28,0x00,0xA4,0x8F, +0x01,0x00,0x73,0x26, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x2C,0x00,0xA2,0xAF, +0x28,0x00,0xA4,0xAF, +0x24,0x00,0xA2,0x8F, +0x20,0x00,0xA4,0x8F, +0x20,0x00,0x63,0x2A, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x24,0x00,0xA2,0xAF, +0x20,0x00,0xA4,0xAF, +0x1C,0x00,0xA2,0x8F, +0x18,0x00,0xA4,0x8F, +0x94,0x00,0x52,0x26, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x1C,0x00,0xA2,0xAF, +0x18,0x00,0xA4,0xAF, +0x14,0x00,0xA2,0x8F, +0x10,0x00,0xA4,0x8F, +0x94,0x00,0xDE,0x27, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x14,0x00,0xA2,0xAF, +0x94,0x00,0xF7,0x26, +0x10,0x00,0xA4,0xAF, +0x94,0x00,0x94,0x26, +0x94,0x00,0xD6,0x26, +0x69,0xFF,0x60,0x14, +0x94,0x00,0xB5,0x26, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x79,0x00,0xE0,0x10, +0x00,0x00,0x00,0x00, +0x79,0x00,0x20,0x15, +0x02,0x80,0x03,0x3C, +0x40,0x10,0x07,0x00, +0x21,0x10,0x47,0x00, +0x82,0x10,0x02,0x00, +0x2B,0x10,0x46,0x00, +0xBE,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x88,0x24, +0x21,0x20,0xC8,0x03, +0x21,0x30,0x8B,0x00, +0x78,0x24,0x83,0x8C, +0x01,0x00,0x05,0x24, +0x04,0x10,0x65,0x01, +0x3D,0x24,0xC7,0x90, +0x27,0x10,0x02,0x00, +0x24,0x18,0x62,0x00, +0x78,0x24,0x83,0xAC, +0x09,0x00,0xE5,0x10, +0x20,0x24,0xC0,0xA0, +0x14,0x00,0xA2,0x8F, +0x21,0x38,0x00,0x00, +0x21,0x20,0x48,0x00, +0x21,0x18,0x87,0x00, +0x01,0x00,0xE7,0x24, +0x1D,0x00,0xE2,0x28, +0xFC,0xFF,0x40,0x14, +0x5A,0x24,0x60,0xA0, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x83,0x24, +0x21,0x10,0xE3,0x02, +0x21,0x10,0x4B,0x00, +0x3D,0x24,0x40,0xA0, +0x21,0x50,0x60,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x78,0xE8,0x49,0x24, +0x04,0xE8,0x68,0x24, +0x21,0x38,0x00,0x00, +0x80,0x18,0x07,0x00, +0x21,0x10,0x69,0x00, +0x21,0x20,0x68,0x00, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x85,0x8C, +0x01,0x00,0xE7,0x24, +0x21,0x18,0x6A,0x00, +0x1D,0x00,0xE2,0x28, +0x60,0x05,0x65,0xAC, +0xF6,0xFF,0x40,0x14, +0xD4,0x05,0x66,0xAC, +0x15,0x00,0x60,0x11, +0x02,0x80,0x04,0x3C, +0x1F,0x24,0x82,0x92, +0xFF,0xFF,0x67,0x25, +0x2A,0x10,0xE2,0x00, +0x10,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x10,0x00,0xA4,0x8F, +0x30,0x1F,0x62,0x24, +0x21,0x10,0x82,0x00, +0x1F,0x24,0x45,0x90, +0x18,0x24,0x44,0x8C, +0x01,0x00,0x06,0x24, +0x04,0x18,0xE6,0x00, +0x24,0x10,0x83,0x00, +0xB9,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0xE7,0x24, +0x2A,0x10,0xE5,0x00, +0xFA,0xFF,0x40,0x10, +0x04,0x18,0xE6,0x00, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x83,0x24, +0x80,0x10,0x0B,0x00, +0x21,0x10,0x43,0x00, +0xD4,0x05,0x45,0x8C, +0x60,0x05,0x44,0x8C, +0x02,0x80,0x03,0x3C, +0x40,0x10,0x05,0x00, +0xDE,0x5D,0x66,0x90, +0x21,0x10,0x45,0x00, +0x21,0x20,0x82,0x00, +0x22,0x00,0x02,0x24, +0x9D,0x00,0xC2,0x10, +0x82,0x50,0x04,0x00, +0x78,0x24,0x83,0x8E, +0x01,0x00,0x02,0x24, +0x04,0x10,0x62,0x01, +0x25,0x18,0x62,0x00, +0x78,0x24,0x83,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0x21,0x10,0xC3,0x02, +0xE8,0x23,0x4A,0xAC, +0x30,0x38,0x64,0x8C, +0xFF,0xFF,0x02,0x34, +0x62,0xFF,0x82,0x14, +0x21,0x20,0x60,0x01, +0x64,0xFF,0x60,0x16, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0xF0,0x23,0x05,0x96, +0xEC,0x23,0x02,0x96, +0x25,0xB0,0x11,0x3C, +0x00,0x2C,0x05,0x00, +0x21,0x28,0x45,0x00, +0xB5,0x59,0x00,0x0C, +0x68,0x0C,0x24,0x36, +0xFC,0x23,0x02,0x8E, +0xF8,0x23,0x05,0x8E, +0xF4,0x23,0x03,0x96, +0x6C,0x0C,0x24,0x36, +0x21,0x28,0xA2,0x00, +0x00,0x2C,0x05,0x00, +0xB5,0x59,0x00,0x0C, +0x21,0x28,0x65,0x00, +0x28,0x26,0x00,0x08, +0x02,0x80,0x04,0x3C, +0xD6,0x25,0x00,0x08, +0xE8,0x23,0x40,0xAE, +0x4C,0xFF,0x20,0x11, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0x80,0x18,0x0B,0x00, +0x21,0x18,0x62,0x00, +0xD4,0x05,0x64,0x8C, +0x00,0x00,0x00,0x00, +0x2B,0x20,0x44,0x01, +0x44,0xFF,0x80,0x10, +0x02,0x80,0x04,0x3C, +0x69,0x26,0x00,0x08, +0x30,0x1F,0x88,0x24, +0x2D,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x21,0x20,0x4B,0x02, +0x3D,0x24,0x83,0x90, +0x01,0x00,0x02,0x24, +0x53,0x00,0x62,0x10, +0x02,0x80,0x02,0x3C, +0x2C,0x00,0xA3,0x8F, +0x30,0x1F,0x42,0x24, +0x21,0x38,0x00,0x00, +0x21,0x20,0x62,0x00, +0x21,0x18,0x87,0x00, +0x01,0x00,0xE7,0x24, +0x1D,0x00,0xE2,0x28, +0xFC,0xFF,0x40,0x14, +0x5A,0x24,0x60,0xA0, +0x28,0x00,0xA4,0x8F, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x65,0x24, +0x21,0x30,0x85,0x00, +0x78,0x24,0xC2,0x8C, +0x01,0x00,0x03,0x24, +0x04,0x18,0x63,0x01, +0x27,0x18,0x03,0x00, +0x21,0x20,0xCB,0x00, +0x24,0x10,0x43,0x00, +0x3D,0x24,0x80,0xA0, +0x78,0x24,0xC2,0xAC, +0x12,0x00,0x60,0x15, +0x20,0x24,0x80,0xA0, +0x1E,0x24,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x0E,0x00,0x40,0x10, +0x01,0x00,0x07,0x24, +0x24,0x00,0xA3,0x8F, +0x01,0x00,0x06,0x24, +0x21,0x10,0x65,0x00, +0x1E,0x24,0x44,0x90, +0x18,0x24,0x45,0x8C, +0x04,0x18,0xE6,0x00, +0x24,0x10,0xA3,0x00, +0x4B,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0xE7,0x24, +0x2A,0x10,0x87,0x00, +0xFA,0xFF,0x40,0x10, +0x04,0x18,0xE6,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x20,0x00,0xA2,0x8F, +0x01,0x00,0x67,0x25, +0x21,0x18,0x44,0x00, +0x1E,0x24,0x62,0x90, +0x00,0x00,0x00,0x00, +0x2A,0x10,0x47,0x00, +0x0E,0x00,0x40,0x14, +0x01,0x00,0x06,0x24, +0x1C,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x10,0x64,0x00, +0x1E,0x24,0x45,0x90, +0x18,0x24,0x44,0x8C, +0x04,0x18,0xE6,0x00, +0x24,0x10,0x83,0x00, +0x31,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0xE7,0x24, +0x2A,0x10,0xA7,0x00, +0xFA,0xFF,0x40,0x10, +0x04,0x18,0xE6,0x00, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x22,0x00,0x03,0x24, +0xE4,0xFE,0x83,0x14, +0x02,0x80,0x04,0x3C, +0xEE,0xFF,0x62,0x25, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x2C, +0x18,0x00,0x03,0x24, +0x12,0x26,0x00,0x08, +0x0B,0x58,0x62,0x00, +0xC0,0x10,0x07,0x00, +0x23,0x10,0x47,0x00, +0xC2,0x10,0x02,0x00, +0x2B,0x10,0x48,0x00, +0xC4,0xFE,0x40,0x14, +0x00,0x00,0x00,0x00, +0xF1,0x25,0x00,0x08, +0x00,0x00,0x00,0x00, +0x18,0x00,0x62,0x2D, +0x0A,0x00,0x40,0x14, +0x05,0x00,0x62,0x2D, +0x5A,0x24,0x83,0x90, +0x00,0x00,0x00,0x00, +0x05,0x00,0x62,0x2C, +0xB0,0xFF,0x40,0x10, +0x01,0x00,0x62,0x24, +0xF4,0x26,0x00,0x08, +0x5A,0x24,0x82,0xA0, +0x11,0x26,0x00,0x08, +0x3D,0x24,0xA7,0xA0, +0x04,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x5A,0x24,0x83,0x90, +0x43,0x27,0x00,0x08, +0x03,0x00,0x62,0x2C, +0x5A,0x24,0x83,0x90, +0x43,0x27,0x00,0x08, +0x04,0x00,0x62,0x2C, +0x13,0x00,0x02,0x24, +0x62,0xFF,0x62,0x15, +0x02,0x80,0x02,0x3C, +0xBC,0x26,0x00,0x08, +0x30,0x1F,0x43,0x24, +0xFF,0x00,0xEB,0x30, +0x2B,0x27,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x13,0x27,0x00,0x08, +0xFF,0x00,0xEB,0x30, +0xA7,0x26,0x00,0x08, +0xFF,0x00,0xEB,0x30, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x14,0x00,0xB1,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x45,0x24, +0xA9,0x37,0xA4,0x90, +0xA4,0x37,0xA3,0x8C, +0xA0,0x37,0xA2,0x8C, +0x21,0x88,0x64,0x00, +0x2B,0x10,0x22,0x02, +0x60,0x00,0x40,0x10, +0x21,0x80,0xA0,0x00, +0x02,0x80,0x14,0x3C, +0x21,0x98,0xA0,0x00, +0x76,0x27,0x00,0x08, +0x21,0x90,0xA0,0x00, +0xA0,0x37,0x42,0x8E, +0x10,0x00,0x31,0x26, +0x2B,0x10,0x22,0x02, +0x57,0x00,0x40,0x10, +0x21,0x80,0x40,0x02, +0xA9,0x37,0x02,0x92, +0xFF,0xFF,0x23,0x32, +0x02,0x80,0x05,0x3C, +0x10,0x00,0x42,0x24, +0x25,0x28,0x65,0x00, +0x98,0x55,0x84,0x26, +0x10,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0xA9,0x37,0x02,0xA2, +0x6C,0x36,0x06,0x8E, +0x00,0x00,0x00,0x00, +0x42,0x24,0x06,0x00, +0x1F,0x00,0x84,0x30, +0xC0,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x38,0x50,0x00, +0x1C,0x24,0xE3,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x1B,0x03,0x00, +0x01,0x00,0x63,0x30, +0xE3,0xFF,0x60,0x10, +0x25,0xB0,0x02,0x3C, +0x68,0x36,0x05,0x8E, +0x21,0x10,0x82,0x00, +0x60,0x01,0x44,0x90, +0x82,0x1D,0x05,0x00, +0x3F,0x00,0x63,0x30, +0x04,0x00,0x0A,0x24, +0x05,0x00,0x62,0x28, +0x21,0x40,0x40,0x01, +0x0B,0x40,0x62,0x00, +0x07,0x00,0xA0,0x04, +0xFF,0x00,0x89,0x30, +0x08,0x24,0xE2,0x8C, +0x04,0x00,0x08,0x24, +0x01,0x00,0x42,0x24, +0x08,0x24,0xE2,0xAC, +0x6C,0x36,0x66,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x13,0x06,0x00, +0x1F,0x00,0x42,0x30, +0x08,0x00,0x42,0x28, +0xCD,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x68,0x36,0x62,0x8E, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x42,0x30, +0xC8,0xFF,0x49,0x14, +0x00,0x00,0x00,0x00, +0x29,0x00,0x00,0x11, +0x01,0x00,0x02,0x24, +0x2E,0x00,0x02,0x11, +0x02,0x00,0x02,0x24, +0x33,0x00,0x02,0x11, +0x03,0x00,0x02,0x24, +0x38,0x00,0x02,0x11, +0x00,0x00,0x00,0x00, +0x3B,0x00,0x0A,0x11, +0x00,0x00,0x00,0x00, +0x0C,0x24,0xE2,0x8C, +0x21,0x18,0x33,0x01, +0x04,0x05,0x64,0x90, +0x02,0x11,0x02,0x00, +0x2B,0x10,0x44,0x00, +0x3E,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x24,0xE3,0x8C, +0x80,0x10,0x09,0x00, +0x21,0x10,0x49,0x00, +0x01,0x00,0x63,0x24, +0x21,0x10,0x53,0x00, +0x00,0x24,0xE3,0xAC, +0x21,0x10,0x48,0x00, +0xA8,0x03,0x44,0x90, +0xE8,0x23,0xE3,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x64,0x00, +0xE8,0x23,0xE3,0xAC, +0xA0,0x37,0x42,0x8E, +0x10,0x00,0x31,0x26, +0x2B,0x10,0x22,0x02, +0xAB,0xFF,0x40,0x14, +0x21,0x80,0x40,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xEC,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xEC,0x23,0xE2,0xAC, +0x01,0x00,0x02,0x24, +0xD4,0xFF,0x02,0x15, +0x02,0x00,0x02,0x24, +0xF0,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xF0,0x23,0xE2,0xAC, +0x02,0x00,0x02,0x24, +0xCF,0xFF,0x02,0x15, +0x03,0x00,0x02,0x24, +0xF4,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xF4,0x23,0xE2,0xAC, +0x03,0x00,0x02,0x24, +0xCA,0xFF,0x02,0x15, +0x00,0x00,0x00,0x00, +0xF8,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xC7,0xFF,0x0A,0x15, +0xF8,0x23,0xE2,0xAC, +0xFC,0x23,0xE2,0x8C, +0x21,0x18,0x33,0x01, +0x01,0x00,0x42,0x24, +0xFC,0x23,0xE2,0xAC, +0x0C,0x24,0xE2,0x8C, +0x04,0x05,0x64,0x90, +0x02,0x11,0x02,0x00, +0x2B,0x10,0x44,0x00, +0xC4,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x04,0x24,0xE3,0x8C, +0x80,0x10,0x09,0x00, +0x21,0x10,0x49,0x00, +0x01,0x00,0x63,0x24, +0x21,0x10,0x53,0x00, +0x04,0x24,0xE3,0xAC, +0x21,0x10,0x48,0x00, +0x39,0x04,0x44,0x90, +0xE8,0x23,0xE3,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x64,0x00, +0xC7,0x27,0x00,0x08, +0xE8,0x23,0xE3,0xAC, +0x23,0x10,0xA4,0x00, +0x2B,0x18,0xA4,0x00, +0x23,0x20,0x85,0x00, +0x08,0x00,0xE0,0x03, +0x0B,0x10,0x83,0x00, +0x20,0xFF,0xBD,0x27, +0xCC,0x00,0xB5,0xAF, +0xDC,0x00,0xBF,0xAF, +0xD8,0x00,0xBE,0xAF, +0xD4,0x00,0xB7,0xAF, +0xD0,0x00,0xB6,0xAF, +0xC8,0x00,0xB4,0xAF, +0xC4,0x00,0xB3,0xAF, +0xC0,0x00,0xB2,0xAF, +0xBC,0x00,0xB1,0xAF, +0xB8,0x00,0xB0,0xAF, +0x21,0xA8,0x00,0x00, +0x40,0x11,0x15,0x00, +0x10,0x00,0xA3,0x27, +0x21,0x10,0x43,0x00, +0x07,0x00,0x16,0x24, +0xFF,0xFF,0xD6,0x26, +0x00,0x00,0x40,0xAC, +0xFD,0xFF,0xC1,0x06, +0x04,0x00,0x42,0x24, +0x01,0x00,0xB5,0x26, +0x03,0x00,0xA2,0x2E, +0xF6,0xFF,0x40,0x14, +0x40,0x11,0x15,0x00, +0x25,0xB0,0x10,0x3C, +0xC4,0x02,0x02,0x36, +0x00,0x00,0x40,0xAC, +0x04,0x00,0x03,0x36, +0x00,0x00,0x62,0x8C, +0x04,0x0C,0x03,0x36, +0x00,0x00,0x63,0x8C, +0x08,0x0C,0x04,0x36, +0x0F,0x00,0x11,0x3C, +0xAC,0x00,0xA3,0xAF, +0x00,0x00,0x84,0x8C, +0x24,0x10,0x51,0x00, +0x02,0xF4,0x02,0x00, +0xB0,0x00,0xA4,0xAF, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x70,0x00,0xA2,0xAF, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x74,0x00,0xA2,0xAF, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0xE0,0x0E,0x02,0x36, +0x21,0x20,0x40,0x00, +0x00,0x00,0x42,0x8C, +0xDC,0x0E,0x12,0x36, +0x70,0x0E,0x13,0x36, +0x78,0x00,0xA2,0xAF, +0x00,0x00,0x42,0x8E, +0x74,0x0E,0x14,0x36, +0x78,0x0E,0x15,0x36, +0x7C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8E, +0x7C,0x0E,0x16,0x36, +0x80,0x0E,0x17,0x36, +0x80,0x00,0xA3,0xAF, +0x00,0x00,0x82,0x8E, +0xD4,0x0E,0x10,0x36, +0xED,0x3F,0x11,0x3C, +0x84,0x00,0xA2,0xAF, +0x00,0x00,0xA3,0x8E, +0xFB,0x92,0x25,0x36, +0x88,0x00,0xA3,0xAF, +0x00,0x00,0xC2,0x8E, +0x00,0x00,0x00,0x00, +0x8C,0x00,0xA2,0xAF, +0x00,0x00,0xE3,0x8E, +0x25,0xB0,0x02,0x3C, +0x84,0x0E,0x42,0x34, +0x90,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0x88,0x0E,0x63,0x34, +0x94,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x25,0xB0,0x02,0x3C, +0x8C,0x0E,0x42,0x34, +0x98,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0xD0,0x0E,0x63,0x34, +0x9C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x00,0x00,0x00,0x00, +0xA0,0x00,0xA3,0xAF, +0x00,0x00,0x02,0x8E, +0x25,0xB0,0x03,0x3C, +0xD8,0x0E,0x63,0x34, +0xA4,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x02,0x5C,0x00,0x0C, +0xA8,0x00,0xA3,0xAF, +0x21,0x20,0x40,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x60,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x80,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0xA0,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0xC0,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0xE0,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x02,0x3C, +0xA8,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x25,0xB0,0x13,0x3C, +0x02,0x80,0x03,0x3C, +0xAC,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0xB0,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xB0,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0xFF,0x03,0x14,0x3C, +0x02,0x80,0x03,0x3C, +0xB4,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xB7,0x27, +0x21,0x20,0x00,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x02,0x3C, +0xB8,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0xE4,0x28,0x00,0x08, +0x21,0xA8,0x00,0x00, +0x6E,0x00,0xC2,0x13, +0x02,0x80,0x02,0x3C, +0xAC,0x0E,0x62,0x36, +0x94,0x0E,0x63,0x36, +0x00,0x00,0x48,0x8C, +0x00,0x00,0x64,0x8C, +0xB4,0x0E,0x62,0x36, +0x9C,0x0E,0x63,0x36, +0x00,0x00,0x45,0x8C, +0x00,0x00,0x66,0x8C, +0x25,0xB0,0x03,0x3C, +0xBC,0x0E,0x63,0x34, +0x00,0x00,0x67,0x8C, +0x24,0x20,0x94,0x00, +0x00,0xD8,0x02,0x3C, +0x24,0x10,0x02,0x01, +0x24,0x28,0xB4,0x00, +0x24,0x30,0xD4,0x00, +0x24,0x38,0xF4,0x00, +0x02,0x24,0x04,0x00, +0x20,0x01,0x03,0x24, +0x01,0x00,0x42,0x2C, +0x02,0x2C,0x05,0x00, +0x02,0x34,0x06,0x00, +0xE8,0x00,0x83,0x10, +0x02,0x3C,0x07,0x00, +0xE6,0x00,0xA3,0x10, +0x20,0x00,0x03,0x24, +0xE4,0x00,0xC3,0x10, +0x00,0x00,0x00,0x00, +0xE2,0x00,0xE3,0x10, +0x01,0x00,0x08,0x24, +0x80,0x00,0x03,0x24, +0x08,0x00,0x83,0x10, +0x21,0x20,0x00,0x00, +0x06,0x00,0xA3,0x10, +0x21,0x20,0x00,0x00, +0xE0,0x03,0x03,0x24, +0x03,0x00,0xC3,0x10, +0x00,0x00,0x00,0x00, +0xDB,0x00,0xE3,0x10, +0x01,0x00,0x04,0x24, +0x05,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x00,0x11, +0x00,0x00,0x00,0x00, +0xD7,0x00,0x80,0x14, +0x94,0x0E,0x63,0x36, +0x01,0x00,0xB5,0x26, +0x0A,0x00,0xA2,0x2E, +0x01,0x01,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCB,0xFF,0xC0,0x17, +0x01,0x00,0x02,0x24, +0xA0,0x00,0x03,0x3C, +0x30,0x54,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0x64,0x36, +0x08,0x00,0x05,0x3C, +0xE4,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0x64,0x36, +0x28,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0x80,0x80,0x05,0x3C, +0x14,0x02,0x02,0x3C, +0x48,0x01,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x40,0x0E,0x64,0x36, +0x16,0x68,0x05,0x3C, +0xA2,0x04,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x44,0x0E,0x64,0x36, +0x4C,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x14,0x02,0x03,0x3C, +0x4D,0x01,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x60,0x0E,0x64,0x36, +0x16,0x28,0x05,0x3C, +0xBA,0x08,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x64,0x0E,0x64,0x36, +0x6C,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x00,0xFB,0x05,0x3C, +0x01,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x64,0x36, +0x00,0xF8,0x05,0x3C, +0x01,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x64,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xA0,0x00,0x02,0x3C, +0x33,0x54,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0x64,0x36, +0x08,0x0C,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0xE4,0x00,0x05,0x24, +0x28,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x01,0x00,0x02,0x24, +0x96,0xFF,0xC2,0x17, +0xAC,0x0E,0x62,0x36, +0x02,0x80,0x02,0x3C, +0xBC,0xED,0x42,0x24, +0x25,0xB0,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x20,0x08,0x63,0x34, +0x00,0x00,0x71,0x8C, +0x00,0x01,0x03,0x3C, +0x00,0x01,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x25,0xB0,0x12,0x3C, +0x00,0x01,0x02,0x3C, +0x00,0x01,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x28,0x08,0x44,0x36, +0xA0,0x00,0x03,0x3C, +0x30,0x54,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0x44,0x36, +0x08,0x00,0x05,0x3C, +0xE4,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0x44,0x36, +0x28,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x80,0x80,0x05,0x3C, +0x00,0x01,0x02,0x3C, +0x00,0x7C,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x30,0x0E,0x44,0x36, +0x00,0x01,0x03,0x3C, +0x00,0x48,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x34,0x0E,0x44,0x36, +0x00,0x10,0x02,0x3C, +0x1F,0xDC,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x38,0x0E,0x44,0x36, +0x00,0x10,0x03,0x3C, +0x1F,0x8C,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x3C,0x0E,0x44,0x36, +0x14,0x02,0x02,0x3C, +0x02,0x01,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x40,0x0E,0x44,0x36, +0x16,0x68,0x05,0x3C, +0xC7,0x04,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x44,0x0E,0x44,0x36, +0x4C,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x6C,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x00,0x01,0x03,0x3C, +0x00,0x7C,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x50,0x0E,0x44,0x36, +0x00,0x01,0x02,0x3C, +0x00,0x48,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x54,0x0E,0x44,0x36, +0x00,0x10,0x03,0x3C, +0x23,0xDC,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x58,0x0E,0x44,0x36, +0x00,0x10,0x02,0x3C, +0x23,0x8C,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x5C,0x0E,0x44,0x36, +0x14,0x02,0x03,0x3C, +0x02,0x01,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x60,0x0E,0x44,0x36, +0x16,0x28,0x05,0x3C, +0x07,0x0D,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x64,0x0E,0x44,0x36, +0x48,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0xFB,0x05,0x3C, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x44,0x36, +0x00,0x02,0x10,0x3C, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0x4C,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x36, +0xD1,0x28,0x05,0x36, +0x02,0x5C,0x00,0x0C, +0x6C,0x0E,0x44,0x36, +0x48,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0xFB,0x05,0x3C, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x44,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xAC,0x00,0xA5,0x8F, +0x04,0x0C,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x31,0x32, +0xB0,0x00,0xA5,0x8F, +0x08,0x0C,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x2B,0x88,0x11,0x00, +0x28,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x23,0xFF,0x20,0x16, +0xAC,0x0E,0x62,0x36, +0x02,0x80,0x02,0x3C, +0xBC,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x28,0x08,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0xAC,0x0E,0x62,0x36, +0x94,0x0E,0x63,0x36, +0x00,0x00,0x48,0x8C, +0x00,0x00,0x64,0x8C, +0xB4,0x0E,0x62,0x36, +0x9C,0x0E,0x63,0x36, +0x00,0x00,0x45,0x8C, +0x00,0x00,0x66,0x8C, +0x25,0xB0,0x03,0x3C, +0xBC,0x0E,0x63,0x34, +0x00,0x00,0x67,0x8C, +0x24,0x20,0x94,0x00, +0x00,0xD8,0x02,0x3C, +0x24,0x10,0x02,0x01, +0x24,0x28,0xB4,0x00, +0x24,0x30,0xD4,0x00, +0x24,0x38,0xF4,0x00, +0x02,0x24,0x04,0x00, +0x20,0x01,0x03,0x24, +0x01,0x00,0x42,0x2C, +0x02,0x2C,0x05,0x00, +0x02,0x34,0x06,0x00, +0x1A,0xFF,0x83,0x14, +0x02,0x3C,0x07,0x00, +0x80,0x00,0x03,0x24, +0x20,0xFF,0x83,0x14, +0x21,0x40,0x00,0x00, +0xDA,0x28,0x00,0x08, +0x21,0x20,0x00,0x00, +0x00,0x00,0x62,0x8C, +0x9C,0x0E,0x65,0x36, +0xA4,0x0E,0x66,0x36, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x00,0x00,0xE2,0xAE, +0x00,0x00,0xA4,0x8C, +0xAC,0x0E,0x67,0x36, +0xB4,0x0E,0x65,0x36, +0x24,0x20,0x94,0x00, +0x02,0x24,0x04,0x00, +0x04,0x00,0xE4,0xAE, +0x00,0x00,0xC3,0x8C, +0xC4,0x0E,0x64,0x36, +0x24,0x18,0x74,0x00, +0x02,0x1C,0x03,0x00, +0x08,0x00,0xE3,0xAE, +0x00,0x00,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x0C,0x00,0xE2,0xAE, +0x00,0x00,0xA3,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x18,0x74,0x00, +0x02,0x1C,0x03,0x00, +0x10,0x00,0xE3,0xAE, +0x25,0xB0,0x03,0x3C, +0xBC,0x0E,0x63,0x34, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x14,0x00,0xE2,0xAE, +0x00,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x18,0x74,0x00, +0x02,0x1C,0x03,0x00, +0x18,0x00,0xE3,0xAE, +0x25,0xB0,0x03,0x3C, +0xCC,0x0E,0x63,0x34, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x1C,0x00,0xE2,0xAE, +0x01,0x00,0xD6,0x26, +0x03,0x00,0xC2,0x2E, +0xC7,0xFE,0x40,0x14, +0x20,0x00,0xF7,0x26, +0x10,0x00,0xB0,0x8F, +0x00,0x00,0x00,0x00, +0x49,0x01,0x00,0x16, +0x00,0x00,0x00,0x00, +0x30,0x00,0xB1,0x8F, +0x00,0x00,0x00,0x00, +0x06,0x00,0x20,0x16, +0x21,0x20,0x00,0x02, +0x50,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x29,0x00,0x40,0x10, +0xFF,0x00,0x05,0x24, +0x21,0x20,0x00,0x02, +0x05,0x28,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x03,0x00,0x42,0x2C, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x34,0x00,0xA5,0x8F, +0x14,0x00,0xA4,0x8F, +0x05,0x28,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x2C, +0x1C,0x00,0x40,0x14, +0x21,0x28,0x00,0x00, +0x50,0x00,0xB2,0x8F, +0x21,0x20,0x00,0x02, +0x05,0x28,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x03,0x00,0x42,0x2C, +0x09,0x00,0x40,0x10, +0x21,0x20,0x20,0x02, +0x54,0x00,0xA5,0x8F, +0x14,0x00,0xA4,0x8F, +0x05,0x28,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x2C, +0x0E,0x00,0x40,0x14, +0x21,0x28,0x00,0x00, +0x21,0x20,0x20,0x02, +0x05,0x28,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x03,0x00,0x42,0x2C, +0xE0,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x54,0x00,0xA5,0x8F, +0x34,0x00,0xA4,0x8F, +0x05,0x28,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x2C, +0xD9,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x02,0x24, +0xDB,0x00,0xA2,0x10, +0x25,0xB0,0x03,0x3C, +0x10,0x00,0xA2,0x27, +0x40,0x29,0x05,0x00, +0x02,0x80,0x0F,0x3C, +0x21,0x28,0xA2,0x00, +0x30,0x1F,0xEC,0x25, +0x00,0x00,0xA6,0x8C, +0x0C,0x00,0xA7,0x8C, +0x0C,0x00,0x83,0x8D, +0x10,0x00,0x84,0x8D, +0x04,0x00,0xA8,0x8C, +0x10,0x00,0xA9,0x8C, +0x00,0xFC,0x02,0x24, +0x08,0x00,0xAA,0x8C, +0x14,0x00,0xAB,0x8C, +0x24,0x20,0x82,0x00, +0xFF,0x03,0xC6,0x30, +0x24,0x18,0x62,0x00, +0xFF,0x03,0xE7,0x30, +0xF0,0xFF,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x25,0x18,0x66,0x00, +0x25,0x20,0x87,0x00, +0xFF,0x03,0x08,0x31, +0xFF,0x03,0x29,0x31, +0x24,0x20,0x82,0x00, +0x24,0x18,0x62,0x00, +0x80,0x42,0x08,0x00, +0x80,0x4A,0x09,0x00, +0x0F,0xC0,0x02,0x3C, +0x1C,0x00,0xA6,0x8C, +0x18,0x00,0xA7,0x8C, +0xFF,0xFF,0x42,0x34, +0x25,0x18,0x68,0x00, +0x25,0x20,0x89,0x00, +0xFF,0x03,0x4A,0x31, +0xFF,0x03,0x6B,0x31, +0x24,0x20,0x82,0x00, +0x00,0x55,0x0A,0x00, +0x24,0x18,0x62,0x00, +0x00,0x5D,0x0B,0x00, +0x25,0x18,0x6A,0x00, +0x25,0x20,0x8B,0x00, +0x16,0x00,0x86,0xA5, +0x0C,0x00,0x83,0xAD, +0x10,0x00,0x84,0xAD, +0x14,0x00,0x87,0xA5, +0x30,0x1F,0xF1,0x25, +0x10,0x00,0x22,0x8E, +0x01,0x00,0x03,0x24, +0x82,0x17,0x02,0x00, +0x4D,0x00,0x43,0x10, +0x25,0xB0,0x12,0x3C, +0x0C,0x00,0x23,0x8E, +0x80,0x0C,0x44,0x36, +0x00,0x00,0x88,0x8C, +0x00,0x02,0x62,0x30, +0xC0,0xFF,0x13,0x3C, +0x82,0x6D,0x08,0x00, +0x03,0x00,0x40,0x10, +0xFF,0x03,0x65,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x28,0xA2,0x00, +0x18,0x00,0xAD,0x00, +0x82,0x62,0x03,0x00, +0xFF,0x03,0x8C,0x31, +0x00,0x02,0x83,0x31, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x46,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x60,0x82,0x01, +0x18,0x00,0x8D,0x01, +0x00,0xFC,0x74,0x36, +0x24,0x28,0x14,0x01, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x28,0xA2,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xA6,0x00, +0x94,0x0C,0x44,0x36, +0x00,0x00,0x85,0x8C, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x55,0x34, +0xC0,0x03,0x10,0x32, +0x24,0x28,0xB5,0x00, +0x80,0x85,0x10,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xB0,0x00, +0x10,0x00,0x2C,0x8E, +0x88,0x0C,0x44,0x36, +0x00,0x00,0x88,0x8C, +0x82,0x2A,0x0C,0x00, +0xFF,0x03,0xA5,0x30, +0x24,0x10,0x13,0x01, +0x00,0x02,0xA3,0x30, +0x03,0x00,0x60,0x10, +0x82,0x6D,0x02,0x00, +0x00,0xFC,0x02,0x24, +0x25,0x28,0xA2,0x00, +0x18,0x00,0xAD,0x00, +0x02,0x65,0x0C,0x00, +0xFF,0x03,0x8C,0x31, +0x00,0x02,0x83,0x31, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x46,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x60,0x82,0x01, +0x18,0x00,0x8D,0x01, +0x24,0x28,0x14,0x01, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x28,0xA2,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xA6,0x00, +0x9C,0x0C,0x44,0x36, +0x00,0x00,0x85,0x8C, +0xC0,0x03,0x10,0x32, +0x80,0x85,0x10,0x00, +0x24,0x28,0xB5,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xB0,0x00, +0x78,0x00,0xA5,0x8F, +0x25,0xB0,0x10,0x3C, +0x02,0x5C,0x00,0x0C, +0xE0,0x0E,0x04,0x36, +0x7C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xDC,0x0E,0x04,0x36, +0x80,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x70,0x0E,0x04,0x36, +0x84,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x74,0x0E,0x04,0x36, +0x88,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x78,0x0E,0x04,0x36, +0x8C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x7C,0x0E,0x04,0x36, +0x90,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x80,0x0E,0x04,0x36, +0x94,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x84,0x0E,0x04,0x36, +0x98,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x88,0x0E,0x04,0x36, +0x9C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x8C,0x0E,0x04,0x36, +0xA0,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD0,0x0E,0x04,0x36, +0xA4,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD4,0x0E,0x04,0x36, +0xA8,0x00,0xA5,0x8F, +0x88,0x0E,0x04,0x36, +0x02,0x5C,0x00,0x0C, +0x0F,0x00,0x10,0x3C, +0x70,0x00,0xA6,0x8F, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x74,0x00,0xA6,0x8F, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0xFF,0xFF,0x05,0x36, +0x8A,0x47,0x00,0x0C, +0x1E,0x00,0x04,0x24, +0x21,0x88,0x40,0x00, +0xFD,0xFF,0x06,0x24, +0x01,0x00,0x42,0x34, +0x24,0x30,0x46,0x00, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x1E,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x03,0x00,0x26,0x36, +0x5F,0x47,0x00,0x0C, +0x1E,0x00,0x04,0x24, +0xDC,0x00,0xBF,0x8F, +0xD8,0x00,0xBE,0x8F, +0xD4,0x00,0xB7,0x8F, +0xD0,0x00,0xB6,0x8F, +0xCC,0x00,0xB5,0x8F, +0xC8,0x00,0xB4,0x8F, +0xC4,0x00,0xB3,0x8F, +0xC0,0x00,0xB2,0x8F, +0xBC,0x00,0xB1,0x8F, +0xB8,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0xE0,0x00,0xBD,0x27, +0xFF,0x00,0x05,0x24, +0xFF,0x00,0x02,0x24, +0x29,0xFF,0xA2,0x14, +0x10,0x00,0xA2,0x27, +0x25,0xB0,0x03,0x3C, +0x94,0x0E,0x62,0x34, +0x9C,0x0E,0x64,0x34, +0xA4,0x0E,0x65,0x34, +0xAC,0x0E,0x66,0x34, +0x02,0x80,0x0F,0x3C, +0x00,0x00,0x49,0x8C, +0x30,0x1F,0xED,0x25, +0x00,0x00,0x8C,0x8C, +0x00,0x00,0xAE,0x8C, +0x00,0x00,0xC7,0x8C, +0xB4,0x0E,0x62,0x34, +0x0C,0x00,0xA4,0x8D, +0x10,0x00,0xA5,0x8D, +0x00,0x00,0x4A,0x8C, +0xFF,0x03,0x06,0x3C, +0x00,0xFC,0x08,0x24, +0xBC,0x0E,0x62,0x34, +0x24,0x48,0x26,0x01, +0x24,0x38,0xE6,0x00, +0x00,0x00,0x4B,0x8C, +0x24,0x28,0xA8,0x00, +0x24,0x20,0x88,0x00, +0x02,0x3C,0x07,0x00, +0xCC,0x0E,0x68,0x34, +0x02,0x4C,0x09,0x00, +0xC4,0x0E,0x63,0x34, +0xF0,0xFF,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x25,0x28,0xA7,0x00, +0x25,0x20,0x89,0x00, +0x00,0x00,0x67,0x8C, +0x24,0x60,0x86,0x01, +0x00,0x00,0x03,0x8D, +0x24,0x50,0x46,0x01, +0x24,0x28,0xA2,0x00, +0x24,0x20,0x82,0x00, +0x82,0x61,0x0C,0x00, +0x82,0x51,0x0A,0x00, +0x0F,0xC0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x25,0x20,0x8C,0x00, +0x25,0x28,0xAA,0x00, +0x24,0x70,0xC6,0x01, +0x24,0x58,0x66,0x01, +0x24,0x28,0xA2,0x00, +0x24,0x18,0x66,0x00, +0x00,0x71,0x0E,0x00, +0x24,0x20,0x82,0x00, +0x00,0x59,0x0B,0x00, +0x24,0x38,0xE6,0x00, +0x25,0x20,0x8E,0x00, +0x25,0x28,0xAB,0x00, +0x02,0x3C,0x07,0x00, +0x02,0x1C,0x03,0x00, +0x16,0x00,0xA3,0xA5, +0x0C,0x00,0xA4,0xAD, +0x10,0x00,0xA5,0xAD, +0x4D,0x2A,0x00,0x08, +0x14,0x00,0xA7,0xA5, +0x30,0x00,0xB1,0x8F, +0xF5,0x29,0x00,0x08, +0x21,0x20,0x00,0x02, +0x25,0xB0,0x05,0x3C, +0x4C,0x00,0xA2,0x34, +0x02,0x80,0x07,0x3C, +0x00,0x00,0x43,0x90, +0x30,0x1F,0xE4,0x24, +0xC1,0x1B,0x82,0x90, +0x03,0x00,0x66,0x30, +0x24,0x00,0x46,0x10, +0x00,0x00,0x00,0x00, +0x18,0x00,0xC0,0x14, +0x25,0xB0,0x03,0x3C, +0xE6,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x15,0x00,0x40,0x14, +0x58,0x00,0x62,0x34, +0x1C,0x00,0x02,0x24, +0x50,0x0C,0xA3,0x34, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x58,0x0C,0x42,0x34, +0x1C,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x25,0xB0,0x03,0x3C, +0x58,0x00,0x62,0x34, +0x00,0x00,0x45,0x8C, +0x29,0xB0,0x04,0x3C, +0x5C,0x00,0x63,0x34, +0x00,0x00,0x85,0xAC, +0x00,0x00,0x65,0x8C, +0x30,0x1F,0xE2,0x24, +0x04,0x00,0x84,0x34, +0xC1,0x1B,0x46,0xA0, +0x00,0x00,0x85,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x2D,0x0A,0x46,0x34, +0xA2,0x0D,0x43,0x34, +0xA4,0x0D,0x44,0x34, +0xA6,0x0D,0x45,0x34, +0xA8,0x0D,0x42,0x34, +0x00,0x00,0x67,0x94, +0x00,0x00,0x88,0x94, +0x00,0x00,0xA9,0x94, +0x00,0x00,0x44,0x94, +0x00,0x00,0xC3,0x90, +0x02,0x80,0x0A,0x3C, +0x30,0x1F,0x42,0x25, +0x40,0x00,0x63,0x34, +0xFF,0x00,0x63,0x30, +0xDE,0x02,0x44,0xA4, +0x00,0x00,0xC3,0xA0, +0xD8,0x02,0x47,0xA4, +0xDA,0x02,0x48,0xA4, +0xDC,0x02,0x49,0xA4, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x07,0x3C, +0x5B,0x0A,0xE2,0x34, +0x00,0x00,0x44,0x90, +0x30,0x1F,0x46,0x25, +0x5C,0x0A,0xE2,0x34, +0x00,0x00,0x45,0x90, +0xD8,0x02,0xC3,0x94, +0xDA,0x02,0xC2,0x94, +0xDC,0x02,0xC9,0x94, +0xDE,0x02,0xC8,0x94, +0xFF,0x00,0x84,0x30, +0x21,0x18,0x62,0x00, +0x00,0x22,0x04,0x00, +0xFF,0x00,0xA5,0x30, +0x21,0x20,0x85,0x00, +0x21,0x18,0x69,0x00, +0xFF,0xFF,0x82,0x30, +0x21,0x18,0x68,0x00, +0x21,0x18,0x62,0x00, +0x64,0x0C,0xE7,0x34, +0xFF,0xFF,0x42,0x30, +0xE0,0x02,0xC3,0xAC, +0x00,0x00,0xE2,0xA4, +0xE4,0x02,0xC4,0xA4, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x42,0x8D, +0x01,0x00,0x03,0x24, +0x0F,0x00,0x44,0x30, +0x07,0x00,0x83,0x10, +0x30,0x1F,0x45,0x25, +0xB6,0x5F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE4,0x02,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x17,0x02,0x00, +0x03,0x00,0x42,0x30, +0xF5,0xFF,0x40,0x14, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0x3F,0x00,0x64,0x10, +0x30,0x1F,0x44,0x25, +0xE6,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x40,0x14, +0x01,0x00,0x03,0x24, +0x30,0x1F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x0F,0x00,0x42,0x30, +0x3C,0x00,0x43,0x10, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0x45,0x25, +0xE6,0x02,0xA3,0x90, +0xFF,0x00,0x02,0x24, +0xE0,0xFF,0x62,0x14, +0x25,0xB0,0x03,0x3C, +0xC8,0x02,0xA2,0x94, +0xE0,0x02,0xA6,0x8C, +0x50,0x0C,0x63,0x34, +0x00,0x00,0x64,0x90, +0x2B,0x10,0xC2,0x00, +0x85,0x00,0x40,0x10, +0x7F,0x00,0x84,0x30, +0xFF,0xFF,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x30,0x1F,0x45,0x25, +0xD0,0x02,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x64,0x00, +0x78,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x20,0x60,0x00, +0x30,0x1F,0x43,0x25, +0xE0,0x02,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x11,0x27,0x42,0x2C, +0x6D,0x00,0x40,0x14, +0x3A,0x00,0x82,0x2C, +0x32,0x00,0x04,0x24, +0x44,0x00,0x03,0x24, +0x25,0xB0,0x02,0x3C, +0x30,0x0C,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x25,0xB0,0x02,0x3C, +0x50,0x0C,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x58,0x0C,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0xA4,0x2B,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE6,0x02,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xBF,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x02,0x24, +0xB6,0x2B,0x00,0x08, +0xE6,0x02,0xA2,0xA0, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0xA4,0xFF,0x60,0x10, +0xFF,0xFF,0x02,0x34, +0x80,0x36,0x83,0x8C, +0x00,0x00,0x00,0x00, +0xA0,0xFF,0x62,0x10, +0x00,0x00,0x00,0x00, +0xE0,0x02,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x65,0x00,0x62,0x2C, +0x59,0x00,0x40,0x14, +0x28,0x00,0x62,0x2C, +0xD2,0x02,0x83,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x03,0x00, +0x03,0x16,0x02,0x00, +0xFE,0xFF,0x42,0x24, +0xFC,0xFF,0x42,0x28, +0x02,0x00,0x40,0x10, +0xFE,0xFF,0x62,0x24, +0xFC,0xFF,0x02,0x24, +0xD2,0x02,0x82,0xA0, +0x30,0x1F,0x45,0x25, +0x80,0x36,0xA2,0x8C, +0xD2,0x02,0xA3,0x90, +0xCE,0x02,0xA6,0x90, +0x02,0x11,0x02,0x00, +0x7F,0x00,0x42,0x30, +0x0A,0x00,0x44,0x24, +0x23,0x18,0x83,0x00, +0x00,0x26,0x03,0x00, +0x03,0x26,0x04,0x00, +0xFF,0x00,0xC2,0x30, +0x2A,0x10,0x44,0x00, +0x4D,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x00,0x26,0x06,0x00, +0x03,0x26,0x04,0x00, +0x30,0x1F,0x43,0x25, +0xE0,0x02,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x11,0x27,0x42,0x2C, +0x33,0x00,0x40,0x14, +0x3A,0x00,0x82,0x28, +0x32,0x00,0x82,0x28, +0x30,0x00,0x40,0x10, +0x3A,0x00,0x82,0x28, +0x32,0x00,0x04,0x24, +0x44,0x00,0x03,0x24, +0x25,0xB0,0x02,0x3C, +0x30,0x0C,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x25,0xB0,0x02,0x3C, +0x50,0x0C,0x42,0x34, +0xFF,0x00,0x84,0x30, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x58,0x0C,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0xA4,0x2B,0x00,0x08, +0x00,0x00,0x00,0x00, +0x95,0xFF,0x40,0x10, +0x48,0x00,0x03,0x24, +0xDD,0x2B,0x00,0x08, +0x44,0x00,0x03,0x24, +0xD1,0x02,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x83,0x00, +0xD5,0x2B,0x00,0x08, +0x0B,0x20,0x62,0x00, +0xCA,0x02,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xC2,0x00, +0x7A,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0xCC,0x02,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xC2,0x00, +0x07,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x2B,0x00,0x08, +0x01,0x00,0x82,0x24, +0xD2,0xFF,0x40,0x10, +0x48,0x00,0x03,0x24, +0x2F,0x2C,0x00,0x08, +0x44,0x00,0x03,0x24, +0xCD,0x2B,0x00,0x08, +0x02,0x00,0x82,0x24, +0xB2,0xFF,0x40,0x10, +0x30,0x1F,0x45,0x25, +0xD2,0x02,0x83,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x03,0x00, +0x03,0x16,0x02,0x00, +0x02,0x00,0x42,0x24, +0x0D,0x00,0x42,0x28, +0x09,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x13,0x2C,0x00,0x08, +0x0C,0x00,0x02,0x24, +0xCF,0x02,0xA3,0x80, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x62,0x30, +0x2A,0x10,0x82,0x00, +0x24,0x2C,0x00,0x08, +0x0B,0x20,0x62,0x00, +0x13,0x2C,0x00,0x08, +0x02,0x00,0x62,0x24, +0xC0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x25,0xB0,0x14,0x3C, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x24,0x00,0xB3,0xAF, +0xD8,0x00,0x86,0x36, +0x00,0x00,0xC3,0x90, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x51,0x24, +0x2A,0xB0,0x10,0x3C, +0xA0,0xFF,0x02,0x24, +0x25,0x18,0x62,0x00, +0x34,0x00,0x05,0x36, +0xFE,0xFF,0x02,0x24, +0xBC,0x02,0x33,0x92, +0x40,0x00,0x04,0x24, +0x00,0x00,0xC3,0xA0, +0x00,0x00,0xA2,0xA0, +0x25,0x24,0x00,0x0C, +0x00,0x9E,0x13,0x00, +0x21,0x90,0x40,0x00, +0x8A,0x00,0x40,0x12, +0x00,0x40,0x02,0x3C, +0x08,0x00,0x43,0x8E, +0xB0,0x03,0x82,0x36, +0x25,0xB0,0x1E,0x3C, +0x21,0x20,0x40,0x02, +0x00,0x00,0x43,0xAC, +0x0C,0x4D,0x00,0x0C, +0x21,0xB8,0x20,0x02, +0x42,0x00,0xD5,0x37, +0x03,0x0C,0xD1,0x37, +0x17,0x0E,0xD6,0x37, +0x04,0x00,0x14,0x24, +0x2A,0xB0,0x03,0x3C, +0x06,0x00,0x63,0x34, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x42,0x30, +0x0A,0x00,0x40,0x18, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x8C,0xF0,0x84,0x24, +0x00,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x42,0x30, +0xFC,0xFF,0x40,0x1C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x45,0x8E, +0x20,0x10,0x06,0x3C, +0x01,0x00,0x04,0x24, +0x00,0xFE,0xC6,0x34, +0x40,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA4,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x90,0xF0,0x42,0x24, +0x00,0x00,0x45,0x8C, +0x01,0x00,0x03,0x24, +0x21,0x20,0x00,0x00, +0x00,0x00,0xA3,0xA0, +0xFF,0xFF,0x03,0x24, +0x00,0x00,0xA3,0xA2, +0x00,0x00,0x22,0x92, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x40,0x00,0x42,0x34, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x02,0x00,0x02,0x24, +0x02,0x80,0x04,0x3C, +0x00,0x00,0xA2,0xA0, +0x30,0x1F,0x83,0x24, +0xC1,0x02,0x62,0x90, +0x00,0x00,0xC4,0x92, +0x21,0x28,0x00,0x00, +0x00,0x00,0xC2,0xA2, +0xFF,0x00,0x90,0x30, +0x01,0x00,0xA2,0x24, +0xFF,0x00,0x45,0x30, +0x06,0x00,0xA3,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0xA2,0x24, +0xEF,0xFF,0x02,0x24, +0x64,0x00,0x04,0x24, +0x00,0x00,0xA2,0xA2, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x22,0x92, +0x21,0x20,0x00,0x00, +0xBF,0x00,0x42,0x30, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x54,0x22,0x00,0x0C, +0x84,0x03,0x04,0x24, +0xF4,0x08,0xC2,0x37, +0x00,0x00,0x43,0x8C, +0x00,0x80,0x04,0x3C, +0xDF,0x07,0x84,0x34, +0x00,0x00,0xD0,0xA2, +0x21,0x10,0x00,0x00, +0x24,0x28,0x64,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x00,0x00,0xA0,0xA2, +0x00,0x00,0x22,0x92, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x40,0x00,0x42,0x34, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0xBE,0x02,0xE2,0x92, +0x1F,0x00,0xA3,0x30, +0x2B,0x10,0x62,0x00, +0x0A,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xBF,0x02,0xE2,0x92, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x05,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x02,0x3C, +0x25,0x10,0x62,0x00, +0x21,0x98,0x62,0x02, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x43,0x90, +0x22,0x00,0x02,0x24, +0x19,0x00,0x62,0x10, +0x92,0x00,0x02,0x24, +0x18,0x00,0x62,0x10, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x94,0x26, +0x54,0x22,0x00,0x0C, +0xF4,0x01,0x04,0x24, +0x89,0xFF,0x81,0x06, +0x2A,0xB0,0x03,0x3C, +0x04,0x00,0x40,0x12, +0x21,0x10,0x60,0x02, +0x3D,0x24,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x21,0x10,0x60,0x02, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xBE,0x02,0x62,0x90, +0xC0,0x07,0xA3,0x30, +0x82,0x19,0x03,0x00, +0x2B,0x10,0x62,0x00, +0xE3,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0xBF,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0xDD,0xFF,0x40,0x10, +0x00,0x12,0x03,0x00, +0x10,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x13,0x2D,0x00,0x08, +0x21,0x98,0x62,0x02, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0xF0,0xF8,0x06,0x34, +0x15,0x00,0x04,0x24, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x5F,0x47,0x00,0x0C, +0x14,0x00,0xB1,0xAF, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x02,0x80,0x12,0x3C, +0xFF,0xFF,0x05,0x36, +0x56,0x30,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x30,0x1F,0x51,0x26, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x04,0x03,0x23,0x92, +0x04,0x00,0x02,0x24, +0x20,0x00,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0x14,0x03,0x25,0x8E, +0x25,0xB0,0x10,0x3C, +0x43,0x60,0x00,0x0C, +0x00,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x04,0x0E,0x04,0x36, +0x18,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x08,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x10,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x14,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x18,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x1C,0x0E,0x04,0x36, +0x30,0x1F,0x43,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x04,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0x00,0x0E,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x14,0x03,0x25,0x8E, +0x00,0x00,0x00,0x00, +0xDE,0xFF,0x65,0x14, +0x25,0xB0,0x10,0x3C, +0x6A,0x2D,0x00,0x08, +0x30,0x1F,0x43,0x26, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0xF0,0xF8,0x06,0x34, +0x15,0x00,0x04,0x24, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x5F,0x47,0x00,0x0C, +0x14,0x00,0xB1,0xAF, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x56,0x30,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x02,0x80,0x10,0x3C, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x30,0x1F,0x02,0x26, +0x04,0x03,0x46,0x90, +0x25,0xB0,0x11,0x3C, +0x10,0x10,0x12,0x3C, +0x01,0x00,0x03,0x24, +0x00,0x0E,0x24,0x36, +0x1E,0x00,0xC3,0x10, +0x10,0x10,0x45,0x36, +0x43,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x08,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x05,0x24, +0x10,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x14,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x18,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x1C,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x30,0x1F,0x03,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0x00,0x00,0x86,0x8C, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xC5,0x14, +0x30,0x1F,0x03,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x02,0x80,0x13,0x3C, +0x14,0x00,0xB1,0xAF, +0x30,0x1F,0x71,0x26, +0x0C,0x03,0x26,0x8E, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x15,0x00,0x04,0x24, +0x20,0x00,0xBF,0xAF, +0x5F,0x47,0x00,0x0C, +0x18,0x00,0xB2,0xAF, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x10,0x03,0x26,0x8E, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x04,0x03,0x22,0x92, +0x25,0xB0,0x12,0x3C, +0x08,0x00,0x40,0x14, +0x08,0x0E,0x44,0x36, +0x25,0xB0,0x02,0x3C, +0x00,0x0E,0x42,0x34, +0x00,0x00,0x45,0x8C, +0xEC,0x02,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x17,0x00,0xA3,0x10, +0x30,0x1F,0x62,0x26, +0xE8,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEC,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x00,0x0E,0x44,0x36, +0xF0,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x04,0x0E,0x44,0x36, +0xF4,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x10,0x0E,0x44,0x36, +0xF8,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x14,0x0E,0x44,0x36, +0xFC,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x18,0x0E,0x44,0x36, +0x00,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x1C,0x0E,0x44,0x36, +0x30,0x1F,0x62,0x26, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x28,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x40,0xA0, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x14,0x00,0xB1,0xAF, +0x30,0x1F,0x51,0x26, +0x0C,0x03,0x26,0x8E, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x1C,0x00,0xBF,0xAF, +0x5F,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x10,0x03,0x26,0x8E, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x04,0x03,0x23,0x92, +0x03,0x00,0x02,0x24, +0x2C,0x00,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0xEC,0x02,0x25,0x8E, +0x25,0xB0,0x10,0x3C, +0x43,0x60,0x00,0x0C, +0x00,0x0E,0x04,0x36, +0xF0,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x04,0x0E,0x04,0x36, +0xF4,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x10,0x0E,0x04,0x36, +0xF8,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x14,0x0E,0x04,0x36, +0xFC,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x18,0x0E,0x04,0x36, +0x00,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x1C,0x0E,0x04,0x36, +0x08,0x03,0x24,0x8E, +0xE8,0x02,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x21,0x28,0x44,0x00, +0x00,0xFF,0xA3,0x30, +0xFF,0xFF,0x02,0x3C, +0xFF,0x00,0x42,0x34, +0x01,0x3F,0x63,0x2C, +0x24,0x10,0xA2,0x00, +0x0C,0x00,0x60,0x10, +0x08,0x0E,0x04,0x36, +0x43,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x43,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x03,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0x32,0x2E,0x00,0x08, +0x00,0x3F,0x45,0x34, +0x00,0x0E,0x42,0x34, +0x00,0x00,0x43,0x8C, +0xEC,0x02,0x25,0x8E, +0x00,0x00,0x00,0x00, +0xD2,0xFF,0x65,0x14, +0x25,0xB0,0x10,0x3C, +0x35,0x2E,0x00,0x08, +0x30,0x1F,0x43,0x26, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x20,0x00,0xB4,0xAF, +0x24,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x44,0x26, +0x0C,0x24,0x82,0x8C, +0x30,0x1F,0x43,0x8E, +0x04,0x03,0x93,0x90, +0x02,0x11,0x02,0x00, +0x7F,0x00,0x54,0x30, +0xF0,0xF0,0x63,0x30, +0x00,0x10,0x02,0x24, +0x6A,0x00,0x62,0x10, +0x01,0x00,0x02,0x24, +0x25,0xB0,0x08,0x3C, +0x4C,0x00,0x03,0x35, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x30, +0x08,0x00,0x40,0x10, +0x30,0x1F,0x45,0x26, +0x30,0x1F,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x13,0x02,0x00, +0x0F,0x00,0x42,0x30, +0x2F,0x00,0x40,0x10, +0x00,0x0E,0x05,0x35, +0x30,0x1F,0x45,0x26, +0x04,0x03,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x0F,0x00,0x40,0x14, +0x30,0x1F,0x42,0x26, +0x25,0xB0,0x02,0x3C, +0x84,0x01,0x42,0x34, +0x00,0x00,0x44,0x8C, +0x0D,0x00,0x03,0x24, +0x7C,0x00,0x83,0x10, +0x3E,0x00,0x02,0x24, +0x4A,0x00,0x03,0x24, +0x1F,0x03,0xA2,0xA0, +0x1C,0x03,0xA3,0xA0, +0x45,0x00,0x02,0x24, +0x43,0x00,0x03,0x24, +0x1D,0x03,0xA2,0xA0, +0x1E,0x03,0xA3,0xA0, +0x30,0x1F,0x42,0x26, +0x0C,0x24,0x43,0x8C, +0x25,0xB0,0x02,0x3C, +0x60,0x0C,0x42,0x34, +0x02,0x19,0x03,0x00, +0xFF,0x00,0x63,0x30, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x45,0x8E, +0x10,0x10,0x02,0x24, +0xF0,0xF0,0xA3,0x30, +0x3F,0x00,0x62,0x10, +0x30,0x1F,0x44,0x26, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x5F,0x00,0x40,0x10, +0x10,0x0E,0x07,0x35, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x08,0x0E,0x02,0x35, +0x04,0x0E,0x03,0x35, +0x00,0x00,0x44,0x8C, +0x00,0x00,0xA5,0x8C, +0x00,0x00,0x66,0x8C, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x49,0x24, +0xE8,0x02,0x24,0xAD, +0xEC,0x02,0x25,0xAD, +0xF0,0x02,0x26,0xAD, +0x14,0x0E,0x04,0x35, +0x02,0x80,0x02,0x3C, +0x18,0x0E,0x05,0x35, +0x00,0x00,0xE7,0x8C, +0x1C,0x0E,0x06,0x35, +0x00,0x00,0x83,0x8C, +0xDE,0x5D,0x4A,0x90, +0x00,0x00,0xA2,0x8C, +0x00,0x00,0xC4,0x8C, +0xF4,0x02,0x27,0xAD, +0xFC,0x02,0x22,0xAD, +0x22,0x00,0x02,0x24, +0xF8,0x02,0x23,0xAD, +0x5B,0x00,0x42,0x11, +0x00,0x03,0x24,0xAD, +0x92,0x00,0x02,0x24, +0x59,0x00,0x42,0x11, +0x0D,0x08,0x02,0x35, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x30,0x1F,0x43,0x8E, +0xFF,0xFF,0x02,0x3C, +0xFF,0x0F,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x10,0x63,0x34, +0x66,0x2E,0x00,0x08, +0x30,0x1F,0x43,0xAE, +0x3A,0x00,0x62,0x12, +0x04,0x00,0x02,0x24, +0x38,0x00,0x62,0x12, +0x30,0x1F,0x43,0x26, +0xFF,0xFF,0x02,0x24, +0x59,0x2E,0x00,0x08, +0x04,0x03,0x62,0xA0, +0x0C,0x24,0x83,0x8C, +0xFF,0xFF,0x02,0x34, +0xBF,0xFF,0x62,0x10, +0x02,0x12,0x05,0x00, +0x0F,0x00,0x45,0x30, +0x01,0x00,0x03,0x24, +0xBB,0xFF,0xA3,0x14, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0xB5,0xFF,0x60,0x10, +0x03,0x00,0x02,0x24, +0x65,0x00,0x62,0x12, +0x04,0x00,0x62,0x2A, +0x47,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x6A,0x00,0x60,0x12, +0x00,0x00,0x00,0x00, +0xAD,0xFF,0x65,0x16, +0x00,0x00,0x00,0x00, +0x1C,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0x56,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x1F,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x54,0x00, +0x48,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xBE,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x3B,0x00,0x02,0x24, +0x46,0x00,0x03,0x24, +0x1F,0x03,0xA2,0xA0, +0x1C,0x03,0xA3,0xA0, +0x41,0x00,0x02,0x24, +0x40,0x00,0x03,0x24, +0x1D,0x03,0xA2,0xA0, +0x79,0x2E,0x00,0x08, +0x1E,0x03,0xA3,0xA0, +0x00,0x00,0xE3,0x8C, +0x3F,0x3F,0x02,0x3C, +0x3F,0x3F,0x42,0x34, +0x9E,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x67,0x2E,0x00,0x08, +0x30,0x1F,0x45,0x26, +0x0F,0x00,0x10,0x3C, +0x01,0x00,0x11,0x3C, +0xFF,0xFF,0x05,0x36, +0xF4,0x98,0x26,0x36, +0x5F,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x56,0x30,0x26,0x36, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x30,0x1F,0x43,0x26, +0xFF,0xFF,0x02,0x24, +0x59,0x2E,0x00,0x08, +0x04,0x03,0x62,0xA0, +0x0D,0x08,0x02,0x35, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x63,0x30, +0x08,0x00,0x62,0x2C, +0x0F,0x00,0x63,0x38, +0xA2,0xFF,0x40,0x14, +0x01,0x00,0x65,0x24, +0x00,0x16,0x05,0x00, +0x00,0x24,0x05,0x00, +0x00,0x1A,0x05,0x00, +0x25,0x10,0x44,0x00, +0x25,0x10,0x43,0x00, +0x25,0x10,0x45,0x00, +0x25,0x18,0x65,0x00, +0x18,0x03,0x23,0xAD, +0xB8,0x2E,0x00,0x08, +0x14,0x03,0x22,0xAD, +0x04,0x00,0x02,0x24, +0x11,0x00,0x62,0x12, +0xFF,0x00,0x02,0x24, +0x66,0xFF,0x62,0x16, +0x00,0x00,0x00,0x00, +0x1E,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0x21,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x7A,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x1D,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x54,0x00, +0xF8,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x3B,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x20,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0xA8,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFC,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x1E,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0xE6,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x54,0x00, +0x9A,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0xFC,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x08,0x3C, +0x30,0x1F,0x05,0x25, +0x80,0x36,0xA4,0x8C, +0xE6,0x02,0xA3,0x90, +0x02,0x11,0x04,0x00, +0x26,0x00,0x60,0x14, +0x7F,0x00,0x46,0x30, +0x25,0xB0,0x07,0x3C, +0x4C,0x00,0xE2,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x20,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x02,0x34, +0x1D,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x00,0x08,0xE3,0x34, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x19,0x00,0x40,0x10, +0x4B,0x00,0xC2,0x2C, +0x3E,0x00,0x40,0x10, +0x01,0x00,0x04,0x24, +0xD8,0xFF,0xC2,0x24, +0x1E,0x00,0x42,0x2C, +0x49,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x44,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x25,0xB0,0x02,0x3C, +0x87,0x0C,0x42,0x34, +0x20,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0xD3,0x02,0x80,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x17,0x00,0x40,0x10, +0x01,0x00,0x04,0x24, +0xD8,0xFF,0xC2,0x24, +0x1E,0x00,0x42,0x2C, +0x44,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x25,0xB0,0x02,0x3C, +0x30,0x0C,0x42,0x34, +0x44,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0xD3,0x02,0x80,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xD3,0x02,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xE7,0xFF,0x44,0x10, +0x43,0x00,0x02,0x24, +0x30,0x0C,0xE3,0x34, +0xD3,0x02,0xA4,0xA0, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xD3,0x02,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xC0,0xFF,0x44,0x10, +0x10,0x00,0x02,0x24, +0x87,0x0C,0xE3,0x34, +0xD3,0x02,0xA4,0xA0, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xC7,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x02,0x00,0x03,0x24, +0xC2,0xFF,0x43,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x87,0x0C,0x42,0x34, +0xD3,0x02,0x83,0xA0, +0x00,0x00,0x40,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xB4,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x02,0x00,0x03,0x24, +0xAF,0xFF,0x43,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xD3,0x02,0x83,0xA0, +0x30,0x0C,0x42,0x34, +0x42,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x01,0x80,0x02,0x3C, +0x18,0x03,0x64,0x34, +0x7C,0xBF,0x42,0x24, +0x00,0x00,0x82,0xAC, +0x00,0x60,0x07,0x40, +0x01,0x00,0xE1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x20,0x80,0x02,0x3C, +0x30,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x25,0xB0,0x06,0x3C, +0x01,0x80,0x02,0x3C, +0x7D,0xBF,0x45,0x24, +0x33,0x03,0xC3,0x34, +0x00,0x00,0x85,0xAC, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0xFB,0xFF,0x40,0x10, +0x30,0x03,0xC2,0x34, +0x00,0x00,0x45,0x8C, +0x0F,0x00,0x03,0x3C, +0xFF,0xFF,0x63,0x34, +0x24,0x28,0xA3,0x00, +0x40,0x11,0x05,0x00, +0x23,0x10,0x45,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0xAF,0x0F,0x04,0x3C, +0xC0,0x10,0x02,0x00, +0x00,0xA0,0x84,0x34, +0x1B,0x00,0x82,0x00, +0x02,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xC2,0x28,0x05,0x00, +0xA0,0x3E,0x65,0xAC, +0x12,0x20,0x00,0x00, +0xA4,0x3E,0x64,0xAC, +0x00,0x60,0x87,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x14,0x5F,0x43,0xA0, +0xD0,0x07,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xE4,0x5E,0x44,0xAC, +0x13,0x5F,0x60,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x04,0x3C, +0x28,0x00,0x85,0x34, +0x02,0x00,0x82,0x94, +0x04,0x00,0x84,0x24, +0x05,0x00,0x40,0x14, +0x2B,0x18,0xA4,0x00, +0xFB,0xFF,0x60,0x10, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xBE,0x00,0x63,0x34, +0x00,0x00,0x62,0x94, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x42,0x2C, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x19,0x00,0x40,0x10, +0x74,0x57,0x64,0x24, +0x74,0x57,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x15,0x00,0x44,0x14, +0x02,0x80,0x02,0x3C, +0x14,0x5F,0x43,0x90, +0x01,0x00,0x02,0x24, +0xFF,0x00,0x63,0x30, +0x10,0x00,0x62,0x10, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x05,0x00,0x42,0x28, +0x0A,0x00,0x40,0x10, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x5A,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x60,0x14, +0x21,0x10,0x80,0x00, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x10,0x00,0xBF,0x8F, +0x21,0x20,0x00,0x00, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2C,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x43,0x8C, +0x74,0x57,0x42,0x24, +0x28,0x00,0x62,0x14, +0x02,0x80,0x03,0x3C, +0x0C,0x5F,0x62,0x90, +0x01,0x00,0x04,0x24, +0xFF,0x00,0x42,0x30, +0x23,0x00,0x44,0x10, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x03,0x00,0x42,0x28, +0x1D,0x00,0x40,0x10, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x30, +0x18,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x0E,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x10,0x00,0x42,0x30, +0x13,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x14,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x0E,0x00,0x44,0x10, +0x02,0x80,0x02,0x3C, +0x15,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x60,0x14, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x6C,0x3B,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x60,0x14, +0x21,0x18,0x00,0x00, +0x40,0x39,0x42,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x00,0x40,0x14, +0x01,0x00,0x03,0x24, +0x21,0x18,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x23,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x0E,0x00,0x40,0x10, +0x6C,0x57,0x65,0x24, +0x6C,0x57,0x62,0x8C, +0x02,0x80,0x04,0x3C, +0x64,0x57,0x86,0x24, +0x09,0x00,0x45,0x14, +0x01,0x00,0x03,0x24, +0x64,0x57,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x46,0x14, +0x21,0x10,0x60,0x00, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x10,0x00,0xBF,0x8F, +0x21,0x18,0x00,0x00, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0xFF,0x00,0x84,0x30, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0E,0x00,0x80,0x10, +0x02,0x80,0x13,0x3C, +0x44,0x5F,0x62,0x92, +0x01,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x39,0x00,0x43,0x10, +0x25,0xB0,0x03,0x3C, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x44,0x5F,0x62,0x92, +0x02,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0xF4,0xFF,0x43,0x14, +0x44,0x08,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x04,0x0C,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFD,0x00,0x42,0x30, +0x04,0x0C,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x04,0x0D,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFD,0x00,0x42,0x30, +0x04,0x0D,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x11,0x3C, +0x70,0x0E,0x25,0x8E, +0x7F,0xFE,0x10,0x3C, +0xFF,0xFF,0x10,0x36, +0x24,0x28,0xB0,0x00, +0x94,0x60,0x00,0x0C, +0x70,0x0E,0x04,0x24, +0x8C,0x0E,0x25,0x8E, +0x8C,0x0E,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x24,0x28,0xB0,0x00, +0x01,0x00,0x02,0x24, +0x44,0x5F,0x62,0xA2, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x04,0x0C,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x34, +0x04,0x0C,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x04,0x0D,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x34, +0x04,0x0D,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x10,0x3C, +0x70,0x0E,0x05,0x8E, +0x80,0x01,0x11,0x3C, +0x70,0x0E,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x25,0x28,0xB1,0x00, +0x8C,0x0E,0x05,0x8E, +0x8C,0x0E,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x25,0x28,0xB1,0x00, +0x03,0x00,0x05,0x3C, +0x59,0x01,0xA5,0x34, +0x94,0x60,0x00,0x0C, +0x44,0x08,0x04,0x24, +0x02,0x00,0x02,0x24, +0x44,0x5F,0x62,0xA2, +0xDD,0x30,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xFC,0x37,0x02,0x24, +0x40,0x00,0x64,0x34, +0x00,0x00,0x82,0xA4, +0x42,0x00,0x65,0x34, +0x03,0x00,0x02,0x24, +0x00,0x00,0xA0,0xA0, +0x03,0x08,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0B,0x00,0x60,0x10, +0x25,0xB0,0x10,0x3C, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x32,0x00,0x40,0x14, +0x00,0x02,0x05,0x3C, +0x00,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x25,0xB0,0x10,0x3C, +0x21,0x00,0x06,0x36, +0x00,0x00,0xC2,0x90, +0x18,0x00,0x03,0x36, +0x42,0x00,0x05,0x36, +0x01,0x00,0x42,0x34, +0x00,0x00,0xC2,0xA0, +0x40,0x00,0x11,0x36, +0x00,0x00,0x60,0xA0, +0xFF,0xFF,0x02,0x24, +0xFC,0x57,0x03,0x24, +0x00,0x00,0xA2,0xA0, +0x64,0x00,0x04,0x24, +0x00,0x00,0x23,0xA6, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFC,0x77,0x02,0x24, +0x00,0x00,0x22,0xA6, +0x54,0x22,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0x03,0x08,0x00,0xA2, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x0A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x10,0x36, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x02,0xA6, +0x54,0x22,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0xFC,0x77,0x02,0x24, +0x00,0x00,0x02,0xA6, +0x54,0x22,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0xFC,0x57,0x02,0x24, +0x00,0x00,0x02,0xA6, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x9B,0x30,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x2F,0x31,0x00,0x08, +0x25,0xB0,0x10,0x3C, +0xC0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0xFF,0x00,0x90,0x30, +0xFF,0x00,0xB2,0x30, +0x21,0xA0,0x00,0x00, +0x00,0x60,0x16,0x40, +0x01,0x00,0xC1,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x13,0x3C, +0xF6,0x5E,0x62,0x92, +0x0F,0x00,0x11,0x32, +0x0F,0x00,0x42,0x30, +0x12,0x00,0x51,0x10, +0x04,0x00,0x02,0x32, +0x40,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0x0C,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0x8F,0x00,0x43,0x10, +0x08,0x00,0x02,0x32, +0xF6,0x5E,0x62,0x92, +0x04,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0xD2,0x01,0x43,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0x02,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0x9B,0x00,0x43,0x10, +0x06,0x00,0x02,0x32, +0x02,0x80,0x10,0x3C, +0xF5,0x5E,0x03,0x92, +0xF6,0x5E,0x62,0x92, +0x0F,0x00,0x63,0x30, +0x0F,0x00,0x42,0x30, +0x2A,0x10,0x43,0x00, +0x1C,0x00,0x40,0x14, +0x02,0x80,0x12,0x3C, +0xF5,0x5E,0x02,0x92, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0x17,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xDA,0x5D,0x42,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x43,0x30, +0x52,0x00,0x60,0x14, +0x04,0x00,0x42,0x30, +0x10,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x43,0x92, +0x02,0x80,0x06,0x3C, +0x5C,0xE9,0xC5,0x90, +0x0F,0x00,0x63,0x30, +0x25,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0xDD,0x02,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xF5,0x5E,0x04,0x92, +0x80,0xFF,0x02,0x24, +0xBF,0xFF,0x03,0x24, +0x26,0x28,0xA2,0x00, +0x24,0x20,0x83,0x00, +0x5C,0xE9,0xC5,0xA0, +0xF5,0x5E,0x04,0xA2, +0x00,0x60,0x96,0x40, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0xF6,0x5E,0x62,0x92, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x30, +0x4C,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x30, +0x03,0x00,0x40,0x10, +0x08,0x00,0x02,0x32, +0x1B,0x00,0x40,0x10, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x92, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x30, +0x0C,0x00,0x40,0x14, +0x08,0x00,0x02,0x32, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0x40,0x12, +0x02,0x80,0x03,0x3C, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x03,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x4E,0x00,0x0C, +0x21,0x20,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0xF6,0x5E,0x63,0x92, +0x00,0x00,0x00,0x00, +0x25,0x18,0x23,0x02, +0xF6,0x5E,0x63,0xA2, +0x8E,0x31,0x00,0x08, +0x02,0x80,0x10,0x3C, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0xF2,0xFF,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x14,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0xA2,0xFF,0x60,0x14, +0x01,0x00,0x04,0x24, +0xCD,0x4E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xD9,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0x24,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x76,0x01,0x40,0x10, +0x21,0x88,0x40,0x00, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x45,0x90, +0xF6,0x5E,0x44,0x92, +0xF5,0x5E,0x02,0x92, +0xBF,0xFF,0x03,0x24, +0x0F,0x00,0x84,0x30, +0x24,0x10,0x43,0x00, +0xF5,0x5E,0x02,0xA2, +0x10,0x00,0xA5,0xA3, +0x11,0x00,0xA4,0xA3, +0x08,0x00,0x24,0x96, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA5,0x27, +0x25,0x20,0x82,0x00, +0x20,0x00,0x84,0x24, +0x5F,0x1E,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x04,0x00,0x03,0x24, +0x17,0x00,0x02,0x24, +0x0C,0x00,0x23,0xAE, +0x14,0x00,0x22,0xAE, +0x30,0x09,0x00,0x0C, +0x21,0x20,0x20,0x02, +0xB0,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0C,0x31,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xC2,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x71,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x28,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x77,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x92, +0xE0,0x3A,0x64,0x94, +0x04,0x00,0x42,0x34, +0x00,0x01,0x84,0x30, +0xF6,0x5E,0x62,0xA2, +0x61,0xFF,0x80,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x4E,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x83,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x65,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x82,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x61,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x41,0xB0,0x04,0x3C, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0xF6,0x5E,0x63,0x92, +0x08,0x00,0x85,0x34, +0x82,0x00,0x02,0x24, +0x01,0x00,0x63,0x34, +0x02,0x80,0x1E,0x3C, +0xF6,0x5E,0x63,0xA2, +0x00,0x00,0x80,0xAC, +0x00,0x00,0xA2,0xA4, +0x42,0xB0,0x04,0x3C, +0x30,0x1F,0xC2,0x27, +0xB0,0x1B,0x45,0x94, +0x00,0x00,0x83,0x90, +0xBE,0xFF,0x02,0x24, +0x03,0x00,0x86,0x34, +0x24,0x18,0x62,0x00, +0x00,0x01,0xA5,0x30, +0x90,0xFF,0x02,0x24, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xC2,0xA0, +0x38,0x00,0xA0,0x10, +0x25,0xB0,0x06,0x3C, +0x25,0xB0,0x04,0x3C, +0x84,0x00,0x82,0x34, +0x00,0x00,0x46,0x8C, +0x80,0x00,0x84,0x34, +0x00,0x00,0x82,0x8C, +0x02,0x80,0x0B,0x3C, +0x1C,0x5F,0x64,0x8D, +0x00,0x38,0x06,0x00, +0x21,0x30,0x00,0x00, +0x25,0xA0,0xC2,0x00, +0x21,0x18,0x00,0x00, +0x02,0x80,0x0A,0x3C, +0x25,0xA8,0xE3,0x00, +0x21,0x28,0x00,0x00, +0x24,0x5F,0x42,0x8D, +0x21,0x20,0x94,0x00, +0x2B,0x18,0x94,0x00, +0x21,0x28,0xB5,0x00, +0x21,0x28,0xA3,0x00, +0x2B,0x10,0xA2,0x00, +0x24,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x24,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x10,0x01,0x45,0x10, +0x01,0x00,0x05,0x24, +0x30,0x1F,0xC2,0x27, +0xA4,0x3E,0x43,0x8C, +0x42,0xB0,0x07,0x3C, +0x00,0x00,0xE6,0x90, +0x18,0x00,0x65,0x00, +0xFB,0xFF,0x02,0x24, +0x24,0x30,0xC2,0x00, +0x00,0x00,0xE6,0xA0, +0x67,0x46,0x06,0x3C, +0xCF,0xAC,0xC6,0x34, +0x01,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x12,0x18,0x00,0x00, +0x82,0x1A,0x03,0x00, +0x40,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0xC0,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x19,0x00,0x46,0x00, +0x10,0x30,0x00,0x00, +0x23,0x10,0x46,0x00, +0x42,0x10,0x02,0x00, +0x21,0x30,0xC2,0x00, +0x02,0x33,0x06,0x00, +0x01,0x00,0x02,0x24, +0x8C,0x23,0x00,0x0C, +0x0A,0x30,0x46,0x00, +0x25,0xB0,0x06,0x3C, +0xF2,0x02,0xC3,0x34, +0x88,0xFF,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x11,0x00,0xC7,0x34, +0x00,0x00,0xE2,0x90, +0x08,0x00,0xC5,0x34, +0x30,0x1F,0xC4,0x27, +0x01,0x00,0x42,0x34, +0x00,0x00,0xE2,0xA0, +0x00,0x00,0xA3,0x94, +0xB0,0x1B,0x82,0x94, +0xFF,0xFF,0x64,0x30, +0x10,0x00,0x84,0x34, +0x00,0x00,0xA4,0xA4, +0xFB,0xFF,0x84,0x30, +0x00,0x00,0xA4,0xA4, +0x00,0x01,0x42,0x30, +0x02,0x00,0x84,0x34, +0x00,0x00,0xA4,0xA4, +0x04,0x00,0x40,0x10, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xFF,0xF7,0x84,0x30, +0x00,0x00,0xA4,0xA4, +0x28,0x00,0xC4,0x34, +0x00,0x00,0x83,0x94, +0xEF,0xFE,0x02,0x24, +0xFE,0xFF,0x08,0x24, +0x24,0x18,0x62,0x00, +0x00,0x00,0x83,0xA4, +0x00,0x00,0x82,0x94, +0x26,0x00,0xC5,0x34, +0x02,0x80,0x03,0x3C, +0x24,0x10,0x48,0x00, +0x00,0x00,0x82,0xA4, +0xDA,0x5D,0x64,0x90, +0x00,0x00,0xA2,0x94, +0x04,0x00,0x84,0x30, +0x00,0x24,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x09,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x24,0x10,0x48,0x00, +0x00,0x00,0xA2,0xA4, +0x00,0x00,0xE3,0x90, +0xFD,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0x00,0x00,0xE3,0xA0, +0x00,0x68,0x02,0x40, +0x00,0x08,0x42,0x30, +0xFD,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x12,0x3C, +0x11,0x00,0x43,0x36, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x26,0x00,0x44,0x36, +0x00,0x00,0x82,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x34, +0x00,0x00,0x82,0xA4, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x83,0x94, +0xFF,0xDB,0x02,0x24, +0x28,0x00,0x45,0x36, +0x24,0x18,0x62,0x00, +0x00,0x00,0x83,0xA4, +0x00,0x00,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x10,0x01,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x08,0x00,0x51,0x36, +0x00,0x00,0x23,0x96, +0x30,0x1F,0xD7,0x27, +0xB0,0x1B,0xE2,0x96, +0xFF,0xFF,0x70,0x30, +0x00,0x18,0x10,0x36, +0x00,0x00,0x30,0xA6, +0x00,0x01,0x42,0x30, +0xFD,0xFF,0x10,0x32, +0x00,0x00,0x30,0xA6, +0x05,0x00,0x40,0x10, +0x42,0xB0,0x02,0x3C, +0x00,0x00,0x43,0x90, +0xFB,0xFF,0x04,0x24, +0x24,0x18,0x64,0x00, +0x00,0x00,0x43,0xA0, +0x04,0x00,0x10,0x36, +0x54,0x22,0x00,0x0C, +0x32,0x00,0x04,0x24, +0x00,0x00,0x30,0xA6, +0x22,0x00,0x02,0x24, +0xF2,0x02,0x43,0x36, +0xEF,0xFF,0x10,0x32, +0x00,0x00,0x30,0xA6, +0xC8,0x00,0x04,0x24, +0x00,0x00,0x62,0xA0, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0xE2,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x41,0x00,0x40,0x10, +0x42,0xB0,0x06,0x3C, +0x84,0x00,0x42,0x36, +0x00,0x00,0x44,0x8C, +0x80,0x00,0x46,0x36, +0x00,0x00,0xC2,0x8C, +0x00,0x28,0x04,0x00, +0x21,0x18,0x00,0x00, +0x21,0x20,0x00,0x00, +0x25,0x30,0x82,0x00, +0x25,0x38,0xA3,0x00, +0xA4,0x3E,0xE3,0x8E, +0x23,0x28,0xD4,0x00, +0x80,0x12,0x05,0x00, +0x1B,0x00,0x43,0x00, +0x02,0x00,0x60,0x14, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x02,0x80,0x0B,0x3C, +0x1C,0x5F,0x63,0x8D, +0x12,0x10,0x00,0x00, +0x23,0x10,0x45,0x00, +0x21,0x10,0x43,0x00, +0x1C,0x5F,0x62,0xAD, +0x1C,0x5F,0x63,0x8D, +0x42,0xB0,0x02,0x3C, +0x03,0x00,0x42,0x34, +0xC4,0x09,0x63,0x24, +0x1C,0x5F,0x63,0xAD, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x20,0x00,0x63,0x30, +0x20,0x00,0x60,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x5F,0x62,0x8D, +0x02,0x80,0x0A,0x3C, +0x24,0x5F,0x44,0x8D, +0x21,0x40,0x46,0x00, +0x2B,0x28,0x06,0x01, +0x21,0x48,0x67,0x00, +0x21,0x48,0x25,0x01, +0x2B,0x20,0x24,0x01, +0x59,0x00,0x80,0x14, +0x00,0x00,0x00,0x00, +0x24,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x47,0x00,0x49,0x10, +0x01,0x00,0x05,0x24, +0x42,0xB0,0x02,0x3C, +0x00,0x00,0x43,0x90, +0xFB,0xFF,0x04,0x24, +0x01,0x00,0x06,0x24, +0x24,0x18,0x64,0x00, +0x00,0x00,0x43,0xA0, +0x04,0x00,0xA0,0x10, +0x01,0x00,0x04,0x24, +0x80,0x10,0x05,0x00, +0x21,0x10,0x45,0x00, +0x80,0x30,0x02,0x00, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x42,0xB0,0x06,0x3C, +0x00,0x00,0xC2,0x90, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA8,0x8C, +0xDC,0x1B,0xA7,0x94, +0x41,0xB0,0x03,0x3C, +0x41,0x00,0x42,0x34, +0x08,0x00,0x64,0x34, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0x68,0xAC, +0x00,0x00,0x87,0xA4, +0xF6,0x5E,0x63,0x92, +0xF0,0xFF,0x02,0x24, +0xDC,0x1B,0xA7,0xA4, +0x24,0x18,0x62,0x00, +0xF6,0x5E,0x63,0xA2, +0xF6,0x5E,0x62,0x92, +0xD0,0x1B,0xA8,0xAC, +0x02,0x00,0x42,0x34, +0xF6,0x5E,0x62,0xA2, +0x8E,0x31,0x00,0x08, +0x02,0x80,0x10,0x3C, +0x4C,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x31,0xFE,0x40,0x10, +0x00,0x00,0x00,0x00, +0x1C,0x31,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0xF6,0x5E,0x63,0x92, +0x00,0x00,0x00,0x00, +0x02,0x00,0x63,0x34, +0xF6,0x5E,0x63,0xA2, +0x88,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x99,0x99,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x97,0x99,0x63,0x34, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xB0,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x20,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x00, +0x0C,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x20,0x5F,0x42,0x8D, +0x61,0x32,0x00,0x08, +0x01,0x00,0x05,0x24, +0x20,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x02,0x01, +0x0A,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x20,0x5F,0x42,0x8D, +0x32,0x33,0x00,0x08, +0x01,0x00,0x05,0x24, +0x20,0x5F,0x42,0x8D, +0x24,0x5F,0x43,0x8D, +0x1C,0x5F,0x64,0x8D, +0x23,0x10,0x54,0x00, +0x61,0x32,0x00,0x08, +0x23,0x28,0x44,0x00, +0x20,0x5F,0x42,0x8D, +0x24,0x5F,0x43,0x8D, +0x1C,0x5F,0x64,0x8D, +0x23,0x10,0x46,0x00, +0x32,0x33,0x00,0x08, +0x23,0x28,0x44,0x00, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x04,0x00,0x04,0x24, +0x0F,0x00,0x63,0x30, +0x04,0x00,0x63,0x28, +0x03,0x00,0x60,0x14, +0x01,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x64,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xE8,0xFF,0xBD,0x27, +0x6C,0xCE,0x42,0x24, +0x18,0x03,0x63,0x34, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x04,0x3C, +0x13,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x0B,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0xD0,0x07,0x03,0x24, +0x02,0x80,0x02,0x3C, +0xE4,0x5E,0x43,0xAC, +0x13,0x5F,0x80,0xA0, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x16,0x5F,0x44,0xA0, +0x14,0x5F,0x60,0xA0, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x44,0x90, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x42,0x11,0x05,0x00, +0x0F,0x00,0x46,0x30, +0xE8,0xFF,0xBD,0x27, +0x09,0x00,0xC3,0x28, +0x14,0x00,0xBF,0xAF, +0x15,0x00,0x60,0x10, +0x10,0x00,0xB0,0xAF, +0x82,0x16,0x05,0x00, +0x01,0x00,0x42,0x30, +0x15,0x00,0x40,0x10, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0xA2,0x00, +0x48,0x00,0x40,0x14, +0xC2,0x15,0x04,0x00, +0x01,0x00,0x42,0x30, +0x55,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x50,0xE9,0x63,0x24, +0x21,0x18,0xC3,0x00, +0x02,0x80,0x04,0x3C, +0x0F,0x5F,0x85,0x90, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0x4B,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x24,0x10,0xA2,0x00, +0x20,0x00,0x40,0x14, +0xC2,0x15,0x04,0x00, +0x01,0x00,0x42,0x30, +0x0B,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x03,0x3C, +0x50,0xE9,0x63,0x24, +0x21,0x18,0xC3,0x00, +0x02,0x80,0x04,0x3C, +0x0F,0x5F,0x85,0x90, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0x3C,0x00,0x40,0x14, +0x02,0x80,0x04,0x3C, +0x0E,0x5F,0x82,0x90, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x82,0xA0, +0x0E,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0xE4,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x0E,0x5F,0x82,0x90, +0xFD,0xFF,0x03,0x24, +0x14,0x00,0xBF,0x8F, +0x24,0x10,0x43,0x00, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x82,0xA0, +0x12,0x5F,0x60,0xA0, +0x42,0xB0,0x04,0x3C, +0x00,0x00,0x82,0x90, +0x10,0x00,0xB0,0x8F, +0xEF,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x03,0x00,0x85,0x34, +0x40,0x00,0x03,0x24, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x82,0xA0, +0x00,0x00,0xA3,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x42,0xB0,0x07,0x3C, +0x00,0x00,0xE3,0x90, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xF0,0x34, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xE3,0xA0, +0x02,0x00,0x04,0x24, +0x00,0x00,0x02,0xA2, +0x21,0x28,0x00,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0xF0,0x06,0x34, +0x44,0x00,0x02,0x24, +0x00,0x00,0x02,0xA2, +0xE0,0x33,0x00,0x08, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x04,0x24, +0xFE,0x4E,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x0E,0x5F,0x82,0x90, +0xF6,0x33,0x00,0x08, +0xFB,0xFF,0x03,0x24, +0x82,0x16,0x05,0x00, +0xE8,0xFF,0xBD,0x27, +0x01,0x00,0x42,0x30, +0x14,0x00,0xBF,0xAF, +0x0E,0x00,0x40,0x10, +0x10,0x00,0xB0,0xAF, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0xA2,0x00, +0x37,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x0D,0x5F,0x43,0x90, +0x02,0x00,0x02,0x24, +0xFF,0x00,0x63,0x30, +0x44,0x00,0x62,0x10, +0x01,0x00,0x04,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0xFE,0x4E,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0xA2,0x00, +0x0E,0x00,0x40,0x14, +0x02,0x80,0x06,0x3C, +0x0E,0x5F,0xC2,0x90, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0xC2,0xA0, +0x0E,0x5F,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0x18,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x0E,0x5F,0xC2,0x90, +0xFD,0xFF,0x03,0x24, +0x42,0xB0,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0xC2,0xA0, +0x12,0x5F,0x60,0xA0, +0x00,0x00,0x82,0x90, +0xEF,0xFF,0x03,0x24, +0x03,0x00,0x85,0x34, +0x24,0x10,0x43,0x00, +0x40,0x00,0x03,0x24, +0x00,0x00,0x82,0xA0, +0x00,0x00,0xA3,0xA0, +0x0E,0x5F,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0xEA,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x42,0xB0,0x07,0x3C, +0x00,0x00,0xE3,0x90, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xF0,0x34, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xE3,0xA0, +0x02,0x00,0x04,0x24, +0x00,0x00,0x02,0xA2, +0x21,0x28,0x00,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0xF0,0x06,0x34, +0x44,0x00,0x02,0x24, +0x00,0x00,0x02,0xA2, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x0D,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x0C,0x00,0x04,0x24, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xE8,0xFF,0xBD,0x27, +0x30,0xD2,0x42,0x24, +0x18,0x03,0x63,0x34, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x02,0x80,0x10,0x3C, +0xF5,0x5E,0x02,0x92, +0x14,0x00,0xBF,0xAF, +0x0F,0x00,0x42,0x30, +0x03,0x00,0x42,0x28, +0x05,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0x4C,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0xF5,0x5E,0x04,0x92, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0xE0,0x1B,0x83,0x94, +0xDC,0x1B,0x85,0x94, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x00,0x63,0x30, +0x41,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0x08,0x00,0x42,0x34, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA4, +0x08,0x00,0xE0,0x03, +0xDC,0x1B,0x83,0xA4, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x02,0x80,0x10,0x3C, +0x08,0x14,0x04,0x26, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xB4,0x34,0x00,0x08, +0x08,0x14,0x04,0x26, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xCF,0x61,0x00,0x0C, +0x21,0x38,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xFF,0xFF,0x8D,0x30, +0x00,0x60,0x0F,0x40, +0x01,0x00,0xE1,0x35, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x06,0x3C, +0x30,0x1F,0xCE,0x24, +0x2A,0x1C,0xC2,0x91, +0x00,0x00,0x00,0x00, +0x1D,0x00,0x40,0x10, +0x25,0xB0,0x03,0x3C, +0x38,0x02,0x64,0x34, +0x80,0xFF,0x02,0x24, +0x00,0x00,0x82,0xA0, +0x34,0x02,0x6A,0x34, +0xD2,0x01,0x65,0x34, +0xD6,0x01,0x66,0x34, +0xDA,0x01,0x67,0x34, +0xDE,0x01,0x63,0x34, +0x00,0x00,0xA8,0x94, +0x00,0x00,0xC9,0x94, +0x00,0x00,0xEB,0x94, +0x00,0x00,0x6C,0x94, +0x00,0x00,0x44,0x95, +0xB0,0xFE,0xA2,0x25, +0xFF,0xFF,0x4D,0x30, +0x28,0x1C,0xC4,0xA5, +0x00,0x00,0xA0,0xA4, +0x20,0x1C,0xC8,0xA5, +0x00,0x00,0xC0,0xA4, +0x22,0x1C,0xC9,0xA5, +0x00,0x00,0xE0,0xA4, +0x24,0x1C,0xCB,0xA5, +0x00,0x00,0x60,0xA4, +0x00,0x00,0x4D,0xA5, +0x26,0x1C,0xCC,0xA5, +0x00,0x60,0x8F,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x02,0x3C, +0x0A,0x00,0x45,0x34, +0x63,0x00,0x03,0x24, +0xFF,0xFF,0x04,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x40,0x10, +0x30,0x1F,0xC2,0x24, +0x64,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0xFE,0xFF,0x40,0x14, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x62,0x24, +0xFF,0xFF,0x43,0x30, +0xF4,0xFF,0x64,0x14, +0x30,0x1F,0xC2,0x24, +0x28,0x1C,0x48,0x94, +0x26,0x1C,0x47,0x94, +0x20,0x1C,0x49,0x94, +0x22,0x1C,0x4A,0x94, +0x24,0x1C,0x4B,0x94, +0x25,0xB0,0x03,0x3C, +0x38,0x02,0x6C,0x34, +0x34,0x02,0x62,0x34, +0xD2,0x01,0x64,0x34, +0xD6,0x01,0x65,0x34, +0xDA,0x01,0x66,0x34, +0xDE,0x01,0x63,0x34, +0x00,0x00,0x48,0xA4, +0x00,0x00,0x89,0xA4, +0x00,0x00,0xAA,0xA4, +0x00,0x00,0xCB,0xA4, +0x00,0x00,0x67,0xA4, +0x00,0x00,0x80,0xA1, +0x00,0x60,0x8F,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x2C,0x00,0xBF,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0xFF,0xFF,0x14,0x24, +0x02,0x80,0x13,0x3C, +0x41,0xB0,0x02,0x3C, +0x30,0x1F,0x63,0x26, +0x04,0x00,0x42,0x34, +0x00,0x00,0x45,0x8C, +0xD4,0x1B,0x64,0x8C, +0xD0,0x1B,0x66,0x8C, +0x02,0x80,0x02,0x3C, +0x08,0x5E,0x47,0x90, +0x25,0xB0,0x08,0x3C, +0xB0,0x03,0x02,0x35, +0x25,0x90,0x85,0x00, +0x00,0x00,0x52,0xAC, +0x00,0x00,0x46,0xAC, +0x01,0x00,0x02,0x24, +0x8D,0x03,0xE2,0x10, +0xD4,0x1B,0x72,0xAC, +0x30,0x1F,0x64,0x26, +0xD0,0x1B,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x52,0x00, +0x01,0x00,0x42,0x30, +0x0E,0x00,0x40,0x10, +0x30,0x1F,0x67,0x26, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x02,0x36, +0x01,0x00,0x05,0x24, +0x00,0x00,0x45,0xAC, +0x04,0x00,0x0B,0x36, +0xD4,0x1B,0x83,0x8C, +0x00,0x00,0x69,0x8D, +0x40,0x00,0x02,0x3C, +0x01,0x00,0x63,0x38, +0x24,0x10,0x22,0x01, +0x2A,0x01,0x40,0x10, +0xD4,0x1B,0x83,0xAC, +0x30,0x1F,0x67,0x26, +0xD0,0x1B,0xE8,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x12,0x01, +0x04,0x00,0x42,0x30, +0x18,0x00,0x40,0x10, +0x30,0x1F,0x71,0x26, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x64,0x34, +0x04,0x00,0x02,0x24, +0x00,0x00,0x82,0xAC, +0xD4,0x1B,0xE2,0x8C, +0xFC,0x00,0x63,0x34, +0xAC,0x1B,0xE5,0x94, +0xD0,0x37,0xE4,0x8C, +0x00,0x00,0x66,0x8C, +0x04,0x00,0x42,0x38, +0x21,0x48,0x85,0x00, +0x0A,0x00,0xC9,0x10, +0xD4,0x1B,0xE2,0xAC, +0x02,0x80,0x05,0x3C, +0xBC,0x5E,0xA2,0x8C, +0xFB,0xFF,0x04,0x24, +0x24,0x20,0x04,0x01, +0x00,0x10,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0xBC,0x5E,0xA2,0xAC, +0x00,0x00,0x64,0xAC, +0xD0,0x1B,0xE4,0xAC, +0x30,0x1F,0x71,0x26, +0xD0,0x1B,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x10,0x52,0x00, +0x08,0x00,0x42,0x30, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x22,0x96, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x30, +0x5D,0x03,0x40,0x14, +0x00,0x80,0x02,0x3C, +0xD4,0x1B,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x38, +0xD4,0x1B,0x22,0xAE, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x20,0x52,0x00, +0x00,0x08,0x83,0x30, +0x06,0x00,0x60,0x10, +0x00,0x10,0x82,0x30, +0xD4,0x1B,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x08,0x42,0x38, +0xD4,0x1B,0x02,0xAE, +0x00,0x10,0x82,0x30, +0x05,0x03,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x10,0x72,0x00, +0x00,0x20,0x42,0x30, +0xF7,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x24,0x10,0x72,0x00, +0x00,0x80,0x42,0x30, +0xB9,0x01,0x40,0x14, +0x01,0x00,0x03,0x3C, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0xF1,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0xD0,0x1B,0x02,0x8E, +0x02,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x28,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x04,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0x62,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x08,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x9B,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x10,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0x5A,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x20,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x18,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x40,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0xD6,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x65,0x26, +0xD0,0x1B,0xA2,0x8C, +0x00,0x04,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x3D,0x00,0x40,0x10, +0x30,0x1F,0x66,0x26, +0x2A,0xB0,0x02,0x3C, +0x2C,0x00,0x43,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x02,0x24, +0xFF,0x00,0x24,0x31, +0x29,0x03,0x82,0x10, +0x00,0x80,0x22,0x31, +0xF9,0x02,0x40,0x14, +0x00,0x80,0x02,0x3C, +0x00,0xFF,0x02,0x3C, +0x24,0x10,0x22,0x01, +0x0B,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0xB8,0x36,0xA2,0x90, +0x20,0xB0,0x03,0x3C, +0x00,0x12,0x02,0x00, +0x21,0x10,0x43,0x00, +0x0C,0x00,0x49,0x8C, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x63,0x34, +0x00,0x00,0x69,0xAC, +0xFF,0x00,0x24,0x31, +0xFF,0x00,0x02,0x24, +0x1B,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x88,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x1C,0x37,0x03,0xAE, +0x0A,0x00,0x04,0x24, +0xB8,0x36,0x09,0xA2, +0x00,0x01,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xD0,0x1B,0x05,0x8E, +0x02,0x80,0x06,0x3C, +0xBC,0x5E,0xC4,0x8C, +0x00,0x04,0x02,0x3C, +0x27,0x10,0x02,0x00, +0x24,0x28,0xA2,0x00, +0x25,0xB0,0x02,0x3C, +0x00,0x40,0x84,0x34, +0xB0,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x65,0xAC, +0xBC,0x5E,0xC4,0xAC, +0xD0,0x1B,0x05,0xAE, +0x30,0x1F,0x65,0x26, +0xD4,0x1B,0xA4,0x8C, +0x00,0x04,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x26,0x20,0x83,0x00, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x44,0xAC, +0xD4,0x1B,0xA4,0xAC, +0x30,0x1F,0x66,0x26, +0xD0,0x1B,0xC7,0x8C, +0x00,0x08,0x04,0x3C, +0x24,0x28,0xF2,0x00, +0x24,0x10,0xA4,0x00, +0x08,0x00,0x40,0x10, +0x80,0x00,0x08,0x3C, +0xD4,0x1B,0xC3,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x26,0x18,0x64,0x00, +0x00,0x00,0x44,0xAC, +0xD4,0x1B,0xC3,0xAC, +0x80,0x00,0x08,0x3C, +0x24,0x10,0xA8,0x00, +0x21,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xD4,0x1B,0xC3,0x8C, +0x25,0xB0,0x09,0x3C, +0xB0,0x03,0x2A,0x35, +0x2A,0xB0,0x02,0x3C, +0x00,0x00,0x43,0xAD, +0x36,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x23,0xB0,0x04,0x3C, +0xFF,0x1F,0x02,0x3C, +0xC0,0x18,0x03,0x00, +0xF0,0x07,0x63,0x30, +0x00,0x38,0xC5,0x8C, +0x21,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xCE,0x02,0x65,0x10, +0x04,0x38,0xC3,0xAC, +0x02,0x80,0x05,0x3C, +0xBC,0x5E,0xA3,0x8C, +0x27,0x20,0x08,0x00, +0x24,0x20,0xE4,0x00, +0x00,0x08,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x43,0xAD, +0x00,0x00,0x44,0xAC, +0xBC,0x5E,0xA3,0xAC, +0xD0,0x1B,0xC4,0xAC, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x80,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0x30,0x1F,0x66,0x26, +0xD0,0x1B,0xC3,0x8C, +0x00,0x01,0x05,0x3C, +0x24,0x20,0x72,0x00, +0x24,0x10,0x85,0x00, +0x06,0x00,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0xD4,0x1B,0xC3,0x8C, +0xB0,0x03,0x42,0x34, +0x26,0x18,0x65,0x00, +0x00,0x00,0x45,0xAC, +0xD4,0x1B,0xC3,0xAC, +0x00,0x02,0x05,0x3C, +0x24,0x10,0x85,0x00, +0x06,0x00,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0xD4,0x1B,0xC3,0x8C, +0xB0,0x03,0x42,0x34, +0x26,0x18,0x65,0x00, +0x00,0x00,0x45,0xAC, +0xD4,0x1B,0xC3,0xAC, +0x00,0x10,0x05,0x3C, +0x24,0x10,0x85,0x00, +0x0C,0x00,0x40,0x10, +0x30,0x1F,0x63,0x26, +0xB0,0x1B,0xC3,0x94, +0x00,0x00,0x00,0x00, +0x04,0x00,0x62,0x30, +0x02,0x00,0x40,0x10, +0x00,0x08,0x62,0x34, +0xB0,0x1B,0xC2,0xA4, +0xD4,0x1B,0xC2,0x8C, +0x00,0x00,0x00,0x00, +0x26,0x10,0x45,0x00, +0xD4,0x1B,0xC2,0xAC, +0x30,0x1F,0x63,0x26, +0xD0,0x1B,0x62,0x8C, +0x00,0x20,0x05,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x45,0x00, +0x0B,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x64,0x94, +0x00,0x00,0x00,0x00, +0x04,0x00,0x82,0x30, +0x02,0x00,0x40,0x10, +0xFF,0xF7,0x82,0x30, +0xB0,0x1B,0x62,0xA4, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x26,0x10,0x45,0x00, +0xD4,0x1B,0x62,0xAC, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x20,0xBD,0x02,0x3C, +0xEC,0x02,0x03,0x36, +0x4D,0x00,0x07,0x36, +0xF1,0x02,0x08,0x36, +0x08,0x00,0x06,0x24, +0x78,0x02,0x42,0x34, +0x00,0x00,0x45,0xA4, +0x00,0x00,0xE0,0xA0, +0x00,0x00,0x06,0xA1, +0x00,0x00,0x60,0xAC, +0x00,0x00,0x62,0x8C, +0xFF,0x00,0x04,0x3C, +0x00,0x00,0xE0,0xA0, +0xFF,0x00,0x49,0x30, +0x25,0x48,0x24,0x01, +0x00,0x00,0x06,0xA1, +0xF2,0x02,0x05,0x36, +0x00,0x00,0x64,0xAC, +0x0A,0x00,0x0A,0x36, +0x00,0x00,0x69,0xAC, +0x80,0xFF,0x03,0x24, +0x00,0x00,0xA0,0xA0, +0x00,0x00,0x43,0xA1, +0x00,0x00,0x62,0x8D, +0x80,0x00,0x03,0x3C, +0x24,0x10,0x43,0x00, +0x02,0x00,0x40,0x10, +0x84,0xFF,0x02,0x24, +0x00,0x00,0x42,0xA1, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x02,0x00,0x02,0x36, +0x00,0x00,0x43,0x94, +0xFF,0xBF,0x04,0x24, +0x24,0x18,0x64,0x00, +0x00,0x00,0x43,0xA4, +0x3C,0x35,0x00,0x08, +0x30,0x1F,0x67,0x26, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x2A,0xB0,0x06,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x54,0xAC, +0x28,0x00,0xC3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x05,0x24, +0xFF,0x00,0x24,0x31, +0x6D,0x03,0x85,0x10, +0x25,0xBD,0x02,0x3C, +0x00,0x80,0x22,0x31, +0x59,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x82,0x10, +0xFF,0x00,0x23,0x31, +0x30,0x1F,0x70,0x26, +0x58,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0xA4,0x36,0x09,0xA2, +0xEC,0x36,0x03,0xAE, +0x06,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x60,0x00,0x02,0x3C, +0x02,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x04,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x40,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xB5,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x24,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x48,0x03,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0x64,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x25,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x58,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0xA0,0x36,0x09,0xA2, +0xEC,0x36,0x03,0xAE, +0x06,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x60,0x00,0x02,0x3C, +0x04,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x04,0xA5,0x34, +0x25,0xB0,0x03,0x3C, +0x40,0x00,0x02,0x3C, +0x00,0x26,0x07,0x00, +0x26,0xA0,0x82,0x02, +0xB0,0x03,0x68,0x34, +0x25,0x20,0x85,0x00, +0x80,0x03,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x64,0xAC, +0x00,0x00,0x46,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x00,0x00,0x14,0xAD, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x20,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xAD,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0xB0,0x03,0xA2,0x34, +0x2A,0xB0,0x07,0x3C, +0x00,0x00,0x54,0xAC, +0x20,0x00,0xE3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x07,0x03,0x86,0x10, +0x90,0x03,0xA2,0x34, +0x00,0x80,0x22,0x31, +0x05,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x4C,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0xA8,0x36,0x09,0xA2, +0xE0,0x36,0x03,0xAE, +0x05,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x18,0x00,0x02,0x3C, +0x01,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x02,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x10,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xA6,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x0C,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0xC6,0x02,0x86,0x10, +0x00,0x80,0x22,0x31, +0x54,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x24,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x34,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x8C,0x36,0x09,0xA2, +0xC8,0x36,0x03,0xAE, +0x03,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x01,0x00,0x08,0x3C, +0x80,0xFF,0x02,0x24, +0x25,0x38,0xE2,0x00, +0x00,0x80,0x03,0x35, +0x80,0x00,0xA5,0x34, +0x27,0x18,0x03,0x00, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x24,0x30,0xC3,0x00, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x27,0xA0,0x08,0x00, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x63,0x26, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x80,0x42,0x38, +0xD4,0x1B,0x62,0xAC, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x01,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0x11,0xFE,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x10,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x7C,0x02,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0xD0,0x01,0x40,0x10, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x22,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x34,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x90,0x36,0x09,0xA2, +0xC8,0x36,0x03,0xAE, +0x03,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x01,0x00,0x02,0x3C, +0x00,0x80,0x42,0x34, +0x40,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x80,0x00,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x01,0x00,0x04,0x3C, +0x30,0x1F,0x70,0x26, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0xD0,0x1B,0x02,0x8E, +0x02,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0xDB,0xFD,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x14,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x64,0x02,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0xFA,0x01,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x25,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x40,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x94,0x36,0x09,0xA2, +0xD4,0x36,0x03,0xAE, +0x04,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x06,0x00,0x02,0x3C, +0x20,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x01,0xA5,0x34, +0x25,0xB0,0x03,0x3C, +0x04,0x00,0x02,0x3C, +0x00,0x26,0x07,0x00, +0x26,0xA0,0x82,0x02, +0xB0,0x03,0x68,0x34, +0x25,0x20,0x85,0x00, +0x80,0x03,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x64,0xAC, +0x00,0x00,0x46,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x00,0x00,0x14,0xAD, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x02,0x00,0x04,0x3C, +0x30,0x1F,0x70,0x26, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0xD0,0x1B,0x02,0x8E, +0x04,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0xA1,0xFD,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x62,0x34, +0x2A,0xB0,0x07,0x3C, +0x00,0x00,0x54,0xAC, +0x18,0x00,0xE5,0x34, +0x00,0x00,0xA9,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x16,0x02,0x86,0x10, +0x04,0x00,0x02,0x24, +0x00,0x80,0x22,0x31, +0xD6,0x01,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0xA2,0xAC, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x40,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x98,0x36,0x09,0xA2, +0xD4,0x36,0x03,0xAE, +0x04,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x06,0x00,0x02,0x3C, +0x10,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x01,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x04,0x00,0x04,0x3C, +0x30,0x1F,0x70,0x26, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0xD0,0x1B,0x02,0x8E, +0x08,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x68,0xFD,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x1C,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0xDD,0x01,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0x33,0x01,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x25,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x4C,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x9C,0x36,0x09,0xA2, +0xE0,0x36,0x03,0xAE, +0x05,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x18,0x00,0x02,0x3C, +0x08,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x02,0xA5,0x34, +0x25,0xB0,0x03,0x3C, +0x10,0x00,0x02,0x3C, +0x00,0x26,0x07,0x00, +0x26,0xA0,0x82,0x02, +0xB0,0x03,0x68,0x34, +0x25,0x20,0x85,0x00, +0x80,0x03,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x64,0xAC, +0x00,0x00,0x46,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x00,0x00,0x14,0xAD, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x08,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0x9E,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xD4,0x1B,0x02,0x8E, +0xD0,0x1B,0x03,0x8E, +0x00,0x20,0x42,0x38, +0x7D,0x35,0x00,0x08, +0xD4,0x1B,0x02,0xAE, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x02,0x3C, +0x08,0x00,0x43,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x02,0x24, +0xFF,0x00,0x24,0x31, +0x2C,0x00,0x82,0x10, +0x00,0x80,0x22,0x31, +0x34,0x01,0x40,0x14, +0x00,0x80,0x02,0x3C, +0x00,0xFF,0x02,0x3C, +0x24,0x10,0x22,0x01, +0x0B,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0xB4,0x36,0x02,0x92, +0x20,0xB0,0x03,0x3C, +0x00,0x12,0x02,0x00, +0x21,0x10,0x43,0x00, +0x0C,0x00,0x49,0x8C, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x63,0x34, +0x00,0x00,0x69,0xAC, +0xFF,0x00,0x24,0x31, +0xFF,0x00,0x02,0x24, +0x1A,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x7C,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x10,0x37,0x03,0xAE, +0x01,0x00,0x04,0x24, +0xB4,0x36,0x09,0xA2, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xD0,0x1B,0x05,0x8E, +0x02,0x80,0x06,0x3C, +0xBC,0x5E,0xC4,0x8C, +0xFF,0xC7,0x02,0x24, +0x24,0x28,0xA2,0x00, +0x25,0xB0,0x02,0x3C, +0x10,0x00,0x84,0x34, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x65,0xAC, +0xBC,0x5E,0xC4,0xAC, +0xD0,0x1B,0x05,0xAE, +0x30,0x1F,0x63,0x26, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x38, +0x76,0x35,0x00,0x08, +0xD4,0x1B,0x62,0xAC, +0x56,0x01,0x02,0x35, +0x00,0x00,0x43,0x94, +0x00,0x00,0x00,0x00, +0x70,0xFC,0x60,0x10, +0x00,0x00,0x00,0x00, +0x93,0x55,0x00,0x0C, +0x07,0x00,0x04,0x24, +0x29,0x35,0x00,0x08, +0x30,0x1F,0x64,0x26, +0x00,0x00,0x62,0xAC, +0xD3,0x35,0x00,0x08, +0xFF,0x00,0x02,0x24, +0xF8,0x1D,0x24,0x96, +0x64,0x37,0x25,0x8E, +0xFF,0x0F,0x83,0x30, +0x25,0x28,0xA2,0x00, +0x00,0x19,0x03,0x00, +0x20,0x00,0xA6,0x24, +0x02,0x12,0x03,0x00, +0x01,0x00,0x84,0x24, +0xF8,0x1D,0x24,0xA6, +0x17,0x00,0xC2,0xA0, +0x16,0x00,0xC3,0xA0, +0x0C,0x00,0xA4,0x8C, +0x00,0xF0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xFF,0x0F,0x63,0x30, +0x00,0x1C,0x03,0x00, +0x24,0x20,0x82,0x00, +0x25,0x20,0x83,0x00, +0x0C,0x00,0xA4,0xAC, +0x64,0x37,0x25,0x8E, +0x01,0x00,0x10,0x24, +0x01,0x00,0x04,0x24, +0x31,0x10,0x06,0x3C, +0x00,0x01,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x2A,0xB0,0x02,0x3C, +0x01,0x00,0x42,0x34, +0x02,0x00,0x03,0x24, +0x00,0x00,0x50,0xA0, +0x00,0x00,0x43,0xA0, +0xD4,0x1B,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x38, +0x68,0x35,0x00,0x08, +0xD4,0x1B,0x22,0xAE, +0xD0,0x03,0x23,0x35, +0x80,0x00,0x02,0x24, +0x00,0x00,0x62,0xAC, +0x24,0x36,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x25,0xB0,0x02,0x3C, +0x01,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xF0,0x35,0x00,0x08, +0x30,0x1F,0x65,0x26, +0x24,0x10,0x22,0x01, +0xA9,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x47,0x00,0xC6,0x34, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x85,0x10, +0x30,0x1F,0x62,0x26, +0xA4,0x36,0x04,0xA2, +0x00,0x00,0xC2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x07,0x00,0x83,0x10, +0x21,0x38,0x00,0x02, +0x21,0x28,0xC0,0x00, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0xA4,0x36,0xE3,0xA0, +0x30,0x1F,0x62,0x26, +0xA4,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x9C,0x36,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0xFD,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x45,0x00,0xE5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0xA8,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0xA8,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0xA8,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x11,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0x9E,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x46,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0xA0,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0xA0,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0xA0,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0xD3,0x36,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x00,0xFF,0x02,0x3C, +0x24,0x10,0x22,0x01, +0x30,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x41,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x90,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x90,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x90,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x87,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0xCF,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x44,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x9C,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x9C,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x9C,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x47,0x38,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0xAE,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x40,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x8C,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x8C,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x8C,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x47,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x00,0x00,0x62,0xAC, +0x93,0x38,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0x08,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x42,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x94,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x94,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x94,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0xC5,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0x2C,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x43,0x00,0xE5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x98,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x98,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x98,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x0A,0x38,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x06,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xAB,0x37,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x01,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xBF,0x36,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x25,0xB0,0x02,0x3C, +0x07,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x30,0x1F,0x63,0x26, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x80,0x42,0x38, +0x71,0x37,0x00,0x08, +0xD4,0x1B,0x62,0xAC, +0x00,0x00,0x40,0xAC, +0x34,0x37,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x02,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xFA,0x36,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x90,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x2D,0x38,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x03,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x6E,0x38,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x05,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xEC,0x37,0x00,0x08, +0x30,0x1F,0x62,0x26, +0xE0,0xFF,0xBD,0x27, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x25,0xB0,0x0C,0x3C, +0x01,0x80,0x02,0x3C, +0x18,0x03,0x83,0x35, +0x9C,0xE8,0x42,0x24, +0x02,0x80,0x12,0x3C, +0x41,0xB0,0x0B,0x3C, +0x00,0x00,0x62,0xAC, +0x30,0x1F,0x4A,0x26, +0x0A,0x00,0x62,0x35, +0x00,0x00,0x44,0x94, +0xDE,0x1B,0x43,0x95, +0xDC,0x1B,0x49,0x95, +0x25,0x30,0x64,0x00, +0xFF,0xFF,0xD0,0x30, +0x24,0x10,0x09,0x02, +0x02,0x00,0x42,0x30, +0xC2,0x00,0x40,0x10, +0xC0,0x03,0x83,0x35, +0x02,0x00,0x02,0x24, +0x00,0x00,0x62,0xAC, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x04,0x8D, +0xDC,0x02,0x82,0x35, +0x00,0x00,0x47,0x90, +0xFD,0xFF,0x03,0x24, +0x00,0x80,0x02,0x3C, +0x24,0x18,0x23,0x01, +0x25,0x20,0x82,0x00, +0x02,0x00,0xC6,0x38, +0x08,0x00,0x65,0x35, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x47,0xA0, +0xBC,0x5E,0x04,0xAD, +0xDE,0x1B,0x46,0xA5, +0x21,0x48,0x60,0x00, +0x00,0x00,0xA3,0xA4, +0xDC,0x1B,0x43,0xA5, +0x24,0x38,0x09,0x02, +0x04,0x00,0xE2,0x30, +0x0A,0x00,0x40,0x10, +0x08,0x00,0xE2,0x30, +0xDE,0x1B,0x43,0x95, +0x0C,0x00,0x64,0x35, +0xC0,0x03,0x85,0x35, +0x04,0x00,0x63,0x38, +0x04,0x00,0x02,0x24, +0x00,0x00,0x86,0x8C, +0x00,0x00,0xA2,0xAC, +0xDE,0x1B,0x43,0xA5, +0x08,0x00,0xE2,0x30, +0x08,0x00,0x40,0x10, +0x10,0x00,0xE2,0x30, +0xDE,0x1B,0x42,0x95, +0xC0,0x03,0x84,0x35, +0x08,0x00,0x03,0x24, +0x08,0x00,0x42,0x38, +0x00,0x00,0x83,0xAC, +0xDE,0x1B,0x42,0xA5, +0x10,0x00,0xE2,0x30, +0x08,0x00,0x40,0x10, +0x20,0x00,0xE2,0x30, +0xDE,0x1B,0x42,0x95, +0xC0,0x03,0x84,0x35, +0x10,0x00,0x03,0x24, +0x10,0x00,0x42,0x38, +0x00,0x00,0x83,0xAC, +0xDE,0x1B,0x42,0xA5, +0x20,0x00,0xE2,0x30, +0x08,0x00,0x40,0x10, +0x80,0x00,0xE2,0x30, +0xDE,0x1B,0x42,0x95, +0xC0,0x03,0x84,0x35, +0x20,0x00,0x03,0x24, +0x20,0x00,0x42,0x38, +0x00,0x00,0x83,0xAC, +0xDE,0x1B,0x42,0xA5, +0x80,0x00,0xE2,0x30, +0x74,0x00,0x40,0x10, +0x30,0x1F,0x47,0x26, +0xC0,0x03,0x83,0x35, +0x80,0x00,0x02,0x24, +0x42,0xB0,0x0B,0x3C, +0x00,0x00,0x62,0xAC, +0x03,0x00,0x71,0x35, +0xDE,0x1B,0x42,0x95, +0x00,0x00,0x23,0x92, +0x80,0x00,0x42,0x38, +0x20,0x00,0x63,0x30, +0x59,0x00,0x60,0x10, +0xDE,0x1B,0x42,0xA5, +0x20,0x00,0x02,0x24, +0x00,0x00,0x22,0xA2, +0x02,0x80,0x03,0x3C, +0x16,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x75,0x00,0x40,0x14, +0x21,0x40,0x00,0x00, +0xB0,0x1B,0x42,0x95, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x4E,0x00,0x40,0x10, +0x02,0x80,0x06,0x3C, +0x02,0x80,0x07,0x3C, +0xF4,0x5E,0xE2,0x90, +0x00,0x00,0x00,0x00, +0x49,0x00,0x40,0x10, +0x02,0x80,0x09,0x3C, +0x02,0x80,0x04,0x3C, +0x00,0x5F,0x82,0x8C, +0x20,0x5F,0x24,0x8D, +0x24,0x5F,0x25,0x8D, +0x21,0x18,0x00,0x00, +0x21,0x10,0x44,0x00, +0x2B,0x30,0x44,0x00, +0x21,0x18,0x65,0x00, +0x21,0x18,0x66,0x00, +0x20,0x5F,0x22,0xAD, +0x24,0x5F,0x23,0xAD, +0xF4,0x5E,0xE4,0x90, +0x02,0x00,0x02,0x24, +0xFF,0x00,0x84,0x30, +0x07,0x00,0x82,0x10, +0x02,0x80,0x04,0x3C, +0xF4,0x5E,0xE2,0x90, +0x03,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x5A,0x00,0x43,0x14, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x04,0x3C, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x24, +0x11,0x5F,0x82,0xA0, +0x11,0x5F,0x83,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0xFA,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x60,0x14, +0x00,0x00,0x00,0x00, +0x5B,0x00,0x00,0x11, +0x80,0x00,0x86,0x35, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x06,0x00,0x40,0x14, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x02,0x3C, +0x10,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x11,0x5F,0x83,0xA0, +0x02,0x80,0x05,0x3C, +0x0E,0x5F,0xA2,0x90, +0x02,0x80,0x03,0x3C, +0x02,0x00,0x04,0x24, +0x10,0x00,0x42,0x34, +0x0E,0x5F,0xA2,0xA0, +0xF9,0x5E,0x62,0x90, +0x21,0x28,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x80,0x30,0x02,0x00, +0x21,0x30,0xC2,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0x33,0x06,0x00, +0x42,0xB0,0x02,0x3C, +0x44,0x00,0x04,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x05,0x00,0x40,0x10, +0x02,0x80,0x06,0x3C, +0x04,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x02,0x80,0x06,0x3C, +0xBC,0x5E,0xC4,0x8C, +0x30,0x1F,0x47,0x26, +0xDC,0x1B,0xE5,0x94, +0x08,0x00,0x02,0x3C, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x7F,0xFF,0xA5,0x30, +0xB0,0x03,0x42,0x34, +0x08,0x00,0x63,0x34, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x65,0xA4, +0xBC,0x5E,0xC4,0xAC, +0xDC,0x1B,0xE5,0xA4, +0x30,0x1F,0x47,0x26, +0xDC,0x1B,0xE2,0x94, +0x00,0x00,0x00,0x00, +0x24,0x10,0x50,0x00, +0x00,0x30,0x42,0x30, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xDE,0x1B,0xE2,0x94, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x38, +0x00,0x20,0x42,0x34, +0xDE,0x1B,0xE2,0xA4, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x51,0x3A,0x00,0x08, +0xDE,0x1B,0x46,0xA5, +0x01,0x00,0x08,0x24, +0x16,0x5F,0x60,0xA0, +0x8D,0x3A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0E,0x5F,0xA2,0x90, +0x02,0x80,0x03,0x3C, +0x02,0x00,0x04,0x24, +0x10,0x00,0x42,0x34, +0x0E,0x5F,0xA2,0xA0, +0xF9,0x5E,0x62,0x90, +0x21,0x28,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x80,0x30,0x02,0x00, +0x21,0x30,0xC2,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0x33,0x06,0x00, +0x44,0x00,0x02,0x24, +0x00,0x00,0x22,0xA2, +0xD5,0x3A,0x00,0x08, +0x02,0x80,0x03,0x3C, +0x84,0x00,0x84,0x35, +0x00,0x00,0x82,0x8C, +0x02,0x80,0x08,0x3C, +0x00,0x00,0xC4,0x8C, +0x1C,0x5F,0x06,0x8D, +0x21,0x10,0x00,0x00, +0x20,0x5F,0x28,0x8D, +0x24,0x5F,0x29,0x8D, +0x00,0x00,0x65,0x91, +0x25,0x10,0x44,0x00, +0x21,0x10,0x46,0x00, +0xFB,0xFF,0x04,0x24, +0x24,0x28,0xA4,0x00, +0x23,0x40,0x02,0x01, +0x00,0x00,0x65,0xA1, +0x04,0x00,0x00,0x11, +0x01,0x00,0x06,0x24, +0x80,0x10,0x08,0x00, +0x21,0x10,0x48,0x00, +0x80,0x30,0x02,0x00, +0x01,0x00,0x04,0x24, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xDF,0x3A,0x00,0x08, +0x02,0x80,0x06,0x3C, +0xF0,0xFF,0xBD,0x27, +0x08,0x00,0xB2,0xAF, +0x04,0x00,0xB1,0xAF, +0x00,0x00,0xB0,0xAF, +0x00,0x40,0x09,0x40, +0x00,0x68,0x0A,0x40, +0x00,0x70,0x02,0x40, +0x00,0x60,0x0B,0x40, +0x25,0xB0,0x05,0x3C, +0x18,0x03,0xA7,0x34, +0x00,0x00,0xE6,0x8C, +0x01,0x80,0x02,0x3C, +0x1C,0x03,0xA3,0x34, +0xC8,0xEC,0x42,0x24, +0x00,0x00,0x66,0xAC, +0x00,0x00,0xE2,0xAC, +0x80,0x00,0x83,0x8C, +0x7C,0x02,0xA2,0x34, +0x80,0x02,0xA6,0x34, +0x84,0x02,0xA7,0x34, +0x88,0x02,0xA8,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x00,0xC9,0xAC, +0x00,0x00,0xEA,0xAC, +0x00,0x00,0x0B,0xAD, +0x74,0x00,0x83,0x8C, +0x8C,0x02,0xA2,0x34, +0x90,0x02,0xA7,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0x86,0x8C, +0x94,0x02,0xA8,0x34, +0x98,0x02,0xA9,0x34, +0x00,0x00,0xE6,0xAC, +0x0C,0x00,0x82,0x8C, +0x9C,0x02,0xA6,0x34, +0xA0,0x02,0xA7,0x34, +0x00,0x00,0x02,0xAD, +0x10,0x00,0x83,0x8C, +0xA4,0x02,0xA8,0x34, +0xA8,0x02,0xAA,0x34, +0x00,0x00,0x23,0xAD, +0x14,0x00,0x82,0x8C, +0xAC,0x02,0xA9,0x34, +0xB0,0x02,0xAB,0x34, +0x00,0x00,0xC2,0xAC, +0x18,0x00,0x83,0x8C, +0xB4,0x02,0xAC,0x34, +0xB8,0x02,0xAD,0x34, +0x00,0x00,0xE3,0xAC, +0x1C,0x00,0x82,0x8C, +0xBC,0x02,0xA7,0x34, +0xC0,0x02,0xAE,0x34, +0x00,0x00,0x02,0xAD, +0x20,0x00,0x83,0x8C, +0xC4,0x02,0xA8,0x34, +0xC8,0x02,0xAF,0x34, +0x00,0x00,0x43,0xAD, +0x24,0x00,0x82,0x8C, +0xCC,0x02,0xAA,0x34, +0xD0,0x02,0xB0,0x34, +0x00,0x00,0x22,0xAD, +0x28,0x00,0x83,0x8C, +0xD4,0x02,0xA9,0x34, +0xD8,0x02,0xB1,0x34, +0x00,0x00,0x63,0xAD, +0x2C,0x00,0x86,0x8C, +0x70,0x02,0xAB,0x34, +0x74,0x02,0xB2,0x34, +0x00,0x00,0x86,0xAD, +0x30,0x00,0x82,0x8C, +0x78,0x02,0xA6,0x34, +0x6C,0x03,0xAC,0x34, +0x00,0x00,0xA2,0xAD, +0x34,0x00,0x83,0x8C, +0x02,0x80,0x02,0x3C, +0x00,0x00,0xE3,0xAC, +0x38,0x00,0x85,0x8C, +0x28,0xC7,0x47,0x8C, +0x00,0x00,0xC5,0xAD, +0x3C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0xAD, +0x40,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE3,0xAD, +0x44,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x42,0xAD, +0x48,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0xAE, +0x4C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x22,0xAD, +0x50,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x23,0xAE, +0x54,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xAD, +0x58,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0xAE, +0x5C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xAC, +0x21,0x10,0xE0,0x00, +0x00,0x00,0x82,0xAD, +0x01,0x00,0xE7,0x24, +0x21,0x10,0xE0,0x00, +0x01,0x00,0xE7,0x24, +0x00,0x00,0x82,0xAD, +0x9D,0x3B,0x00,0x08, +0x21,0x10,0xE0,0x00, +0x01,0x80,0x1B,0x3C, +0x90,0xEE,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x21,0xD8,0xA0,0x03, +0x82,0xDA,0x1B,0x00, +0x80,0xDA,0x1B,0x00, +0x08,0x00,0x7B,0x27, +0x04,0x00,0x61,0xAF, +0x08,0x00,0x62,0xAF, +0x0C,0x00,0x63,0xAF, +0x10,0x00,0x64,0xAF, +0x14,0x00,0x65,0xAF, +0x18,0x00,0x66,0xAF, +0x1C,0x00,0x67,0xAF, +0x20,0x00,0x68,0xAF, +0x24,0x00,0x69,0xAF, +0x28,0x00,0x6A,0xAF, +0x2C,0x00,0x6B,0xAF, +0x30,0x00,0x6C,0xAF, +0x34,0x00,0x6D,0xAF, +0x38,0x00,0x6E,0xAF, +0x3C,0x00,0x6F,0xAF, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x70,0x0A,0x40, +0x40,0x00,0x70,0xAF, +0x44,0x00,0x71,0xAF, +0x48,0x00,0x72,0xAF, +0x4C,0x00,0x73,0xAF, +0x50,0x00,0x74,0xAF, +0x54,0x00,0x75,0xAF, +0x58,0x00,0x76,0xAF, +0x5C,0x00,0x77,0xAF, +0x60,0x00,0x78,0xAF, +0x64,0x00,0x79,0xAF, +0x68,0x00,0x7C,0xAF, +0x6C,0x00,0x7D,0xAF, +0x70,0x00,0x7E,0xAF, +0x74,0x00,0x7F,0xAF, +0x78,0x00,0x68,0xAF, +0x7C,0x00,0x69,0xAF, +0x80,0x00,0x6A,0xAF, +0x00,0x68,0x1A,0x40, +0x25,0xB0,0x1B,0x3C, +0x1C,0x03,0x7B,0x37, +0x00,0x00,0x00,0x00, +0x00,0x00,0x7A,0xAF, +0x7F,0x00,0x5B,0x33, +0x30,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x1B,0x3C, +0x30,0x03,0x7B,0x37, +0x00,0x00,0x00,0x00, +0x00,0x00,0x7A,0xAF, +0x00,0x00,0x00,0x00, +0x21,0xD8,0xA0,0x03, +0x82,0xDA,0x1B,0x00, +0x80,0xDA,0x1B,0x00, +0x08,0x00,0x7B,0x27, +0x04,0x00,0x61,0xAF, +0x08,0x00,0x62,0xAF, +0x0C,0x00,0x63,0xAF, +0x10,0x00,0x64,0xAF, +0x14,0x00,0x65,0xAF, +0x18,0x00,0x66,0xAF, +0x1C,0x00,0x67,0xAF, +0x20,0x00,0x68,0xAF, +0x24,0x00,0x69,0xAF, +0x28,0x00,0x6A,0xAF, +0x2C,0x00,0x6B,0xAF, +0x30,0x00,0x6C,0xAF, +0x34,0x00,0x6D,0xAF, +0x38,0x00,0x6E,0xAF, +0x3C,0x00,0x6F,0xAF, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x70,0x0A,0x40, +0x40,0x00,0x70,0xAF, +0x44,0x00,0x71,0xAF, +0x48,0x00,0x72,0xAF, +0x4C,0x00,0x73,0xAF, +0x50,0x00,0x74,0xAF, +0x54,0x00,0x75,0xAF, +0x58,0x00,0x76,0xAF, +0x5C,0x00,0x77,0xAF, +0x60,0x00,0x78,0xAF, +0x64,0x00,0x79,0xAF, +0x68,0x00,0x7C,0xAF, +0x6C,0x00,0x7D,0xAF, +0x70,0x00,0x7E,0xAF, +0x74,0x00,0x7F,0xAF, +0x78,0x00,0x68,0xAF, +0x7C,0x00,0x69,0xAF, +0x80,0x00,0x6A,0xAF, +0x32,0x3B,0x00,0x08, +0x21,0x20,0x60,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x20,0x03,0x08,0x35, +0x00,0x00,0x00,0x00, +0x00,0x00,0x1A,0xAD, +0x00,0x04,0x5B,0x33, +0x0A,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x01,0x80,0x08,0x3C, +0x3C,0xD4,0x08,0x25, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x1B,0x3C, +0x24,0x03,0x7B,0x37, +0x00,0x00,0x00,0x00, +0x00,0x00,0x68,0xAF, +0x09,0xF8,0x00,0x01, +0x00,0x00,0x00,0x00, +0x00,0x08,0x5B,0x33, +0x25,0xB0,0x08,0x3C, +0x28,0x03,0x08,0x35, +0x00,0x00,0x00,0x00, +0x00,0x00,0x1B,0xAD, +0x06,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x01,0x80,0x08,0x3C, +0x9C,0xE8,0x08,0x25, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x00,0x01, +0x00,0x00,0x00,0x00, +0x02,0x80,0x1A,0x3C, +0xBC,0x5E,0x5A,0x27, +0x04,0x00,0x5B,0x97, +0x25,0xB0,0x08,0x3C, +0x30,0x03,0x08,0x35, +0x00,0x00,0x00,0x00, +0x00,0x00,0x1B,0xAD, +0x18,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x08,0xE4,0x9B,0x27, +0x00,0x00,0x00,0x00, +0x04,0x00,0x61,0x8F, +0xFC,0x03,0x70,0x7B, +0x7C,0x00,0x62,0x7B, +0xBC,0x00,0x64,0x7B, +0xFC,0x00,0x66,0x7B, +0x3C,0x01,0x68,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x6A,0x7B, +0xBC,0x01,0x6C,0x7B, +0xFC,0x01,0x6E,0x7B, +0x3C,0x02,0x70,0x7B, +0x7C,0x02,0x72,0x7B, +0xBC,0x02,0x74,0x7B, +0xFC,0x02,0x76,0x7B, +0x3C,0x03,0x78,0x7B, +0x7C,0x03,0x7C,0x7B, +0xBC,0x03,0x7E,0x7B, +0x80,0x00,0x7B,0x8F, +0x8F,0x3C,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0xD8,0xA0,0x03, +0x82,0xDA,0x1B,0x00, +0x80,0xDA,0x1B,0x00, +0x08,0x00,0x7B,0x27, +0x08,0x00,0x5B,0xAF, +0xFC,0xE7,0x9D,0x27, +0x00,0x00,0x4A,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x00,0x40,0x11, +0x00,0x00,0x00,0x00, +0x02,0x80,0x08,0x3C, +0x1C,0x5E,0x08,0x25, +0x21,0x48,0x00,0x00, +0x21,0x58,0x00,0x00, +0x01,0x00,0x6B,0x25, +0x1A,0x00,0x40,0x11, +0x24,0x70,0x4B,0x01, +0x14,0x00,0xC0,0x11, +0x01,0x00,0x04,0x24, +0x00,0x00,0x00,0x00, +0x04,0x00,0x44,0xA3, +0x26,0x50,0x4B,0x01, +0x00,0x00,0x4A,0xAF, +0x80,0x80,0x09,0x00, +0x21,0x80,0x08,0x02, +0x00,0x00,0x10,0x8E, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x00,0x02, +0x00,0x00,0x00,0x00, +0x01,0x80,0x1B,0x3C, +0x68,0xF1,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x02,0x80,0x1A,0x3C, +0xBC,0x5E,0x5A,0x27, +0xE1,0xFF,0x00,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x29,0x25, +0x40,0x58,0x0B,0x00, +0x52,0x3C,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x1B,0x3C, +0xBC,0x5E,0x7B,0x27, +0x21,0x60,0x00,0x00, +0x04,0x00,0x6C,0xA7, +0x08,0x00,0x7A,0x8F, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x5A,0x27, +0x00,0x00,0x5A,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x5A,0x27, +0x84,0x00,0x44,0x8F, +0x00,0x00,0x00,0x00, +0xF9,0xFF,0x80,0x10, +0x00,0x00,0x00,0x00, +0x04,0x00,0x41,0x8F, +0xFC,0x03,0x50,0x7B, +0x7C,0x00,0x42,0x7B, +0xBC,0x00,0x44,0x7B, +0xFC,0x00,0x46,0x7B, +0x3C,0x01,0x48,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x4A,0x7B, +0xBC,0x01,0x4C,0x7B, +0xFC,0x01,0x4E,0x7B, +0x3C,0x02,0x50,0x7B, +0x7C,0x02,0x52,0x7B, +0xBC,0x02,0x54,0x7B, +0xFC,0x02,0x56,0x7B, +0x3C,0x03,0x58,0x7B, +0x7C,0x03,0x5C,0x7B, +0xBC,0x03,0x5E,0x7B, +0x80,0x00,0x5B,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x60,0x03, +0x10,0x00,0x00,0x42, +0x00,0x60,0x05,0x40, +0x42,0x28,0x05,0x00, +0x40,0x28,0x05,0x00, +0x00,0x60,0x85,0x40, +0x04,0x00,0x81,0xAC, +0x08,0x00,0x82,0xAC, +0x0C,0x00,0x83,0xAC, +0x20,0x00,0x88,0xAC, +0x24,0x00,0x89,0xAC, +0x28,0x00,0x8A,0xAC, +0x2C,0x00,0x8B,0xAC, +0x30,0x00,0x8C,0xAC, +0x34,0x00,0x8D,0xAC, +0x38,0x00,0x8E,0xAC, +0x3C,0x00,0x8F,0xAC, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x40,0x00,0x90,0xAC, +0x44,0x00,0x91,0xAC, +0x48,0x00,0x92,0xAC, +0x4C,0x00,0x93,0xAC, +0x50,0x00,0x94,0xAC, +0x54,0x00,0x95,0xAC, +0x58,0x00,0x96,0xAC, +0x5C,0x00,0x97,0xAC, +0x60,0x00,0x98,0xAC, +0x64,0x00,0x99,0xAC, +0x68,0x00,0x9C,0xAC, +0x6C,0x00,0x9D,0xAC, +0x70,0x00,0x9E,0xAC, +0x74,0x00,0x9F,0xAC, +0x78,0x00,0x88,0xAC, +0x7C,0x00,0x89,0xAC, +0x80,0x00,0x9F,0xAC, +0xF8,0xFF,0x84,0x24, +0x00,0x00,0x84,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x84,0x24, +0x84,0x00,0x86,0x8C, +0x00,0x00,0x00,0x00, +0xF9,0xFF,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x21,0xD8,0x80,0x00, +0x01,0x00,0xBA,0x34, +0x04,0x00,0x61,0x8F, +0xFC,0x03,0x70,0x7B, +0x7C,0x00,0x62,0x7B, +0xBC,0x00,0x64,0x7B, +0xFC,0x00,0x66,0x7B, +0x3C,0x01,0x68,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x6A,0x7B, +0xBC,0x01,0x6C,0x7B, +0xFC,0x01,0x6E,0x7B, +0x3C,0x02,0x70,0x7B, +0x7C,0x02,0x72,0x7B, +0xBC,0x02,0x74,0x7B, +0xFC,0x02,0x76,0x7B, +0x3C,0x03,0x78,0x7B, +0x7C,0x03,0x7C,0x7B, +0xBC,0x03,0x7E,0x7B, +0x80,0x00,0x7B,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x60,0x03, +0x00,0x60,0x9A,0x40, +0x00,0x60,0x05,0x40, +0x42,0x28,0x05,0x00, +0x40,0x28,0x05,0x00, +0x00,0x60,0x85,0x40, +0x04,0x00,0x81,0xAC, +0x08,0x00,0x82,0xAC, +0x0C,0x00,0x83,0xAC, +0x20,0x00,0x88,0xAC, +0x24,0x00,0x89,0xAC, +0x28,0x00,0x8A,0xAC, +0x2C,0x00,0x8B,0xAC, +0x30,0x00,0x8C,0xAC, +0x34,0x00,0x8D,0xAC, +0x38,0x00,0x8E,0xAC, +0x3C,0x00,0x8F,0xAC, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x40,0x00,0x90,0xAC, +0x44,0x00,0x91,0xAC, +0x48,0x00,0x92,0xAC, +0x4C,0x00,0x93,0xAC, +0x50,0x00,0x94,0xAC, +0x54,0x00,0x94,0xAC, +0x58,0x00,0x96,0xAC, +0x5C,0x00,0x96,0xAC, +0x60,0x00,0x98,0xAC, +0x64,0x00,0x99,0xAC, +0x68,0x00,0x9C,0xAC, +0x6C,0x00,0x9D,0xAC, +0x70,0x00,0x9E,0xAC, +0x78,0x00,0x88,0xAC, +0x7C,0x00,0x89,0xAC, +0x80,0x00,0x9F,0xAC, +0x84,0x00,0x80,0xAC, +0xF8,0xFF,0x84,0x24, +0x00,0x00,0x84,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x84,0x24, +0x84,0x00,0x86,0x8C, +0xFA,0xFF,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x21,0xD8,0x80,0x00, +0x01,0x00,0xBA,0x24, +0x04,0x00,0x61,0x8F, +0xFC,0x03,0x70,0x7B, +0x7C,0x00,0x62,0x7B, +0xBC,0x00,0x64,0x7B, +0xFC,0x00,0x66,0x7B, +0x3C,0x01,0x68,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x6A,0x7B, +0xBC,0x01,0x6C,0x7B, +0xFC,0x01,0x6E,0x7B, +0x3C,0x02,0x70,0x7B, +0x7C,0x02,0x72,0x7B, +0xBC,0x02,0x74,0x7B, +0xFC,0x02,0x76,0x7B, +0x3C,0x03,0x78,0x7B, +0x7C,0x03,0x7C,0x7B, +0xBC,0x03,0x7E,0x7B, +0x80,0x00,0x7B,0x8F, +0x08,0x00,0x60,0x03, +0x00,0x60,0x9A,0x40, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x83,0x4E,0x00,0x00, +0x00,0x00,0x00,0x00, +0x01,0x80,0x1B,0x3C, +0x00,0x00,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x00,0x00,0x05,0x24, +0x03,0x00,0xA4,0x24, +0x00,0xA0,0x80,0x40, +0x00,0xA0,0x84,0x40, +0x01,0x80,0x04,0x3C, +0x40,0x00,0x84,0x24, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x01,0x80,0x1B,0x3C, +0x40,0x00,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x02,0x80,0x1A,0x3C, +0x00,0x00,0x5A,0x27, +0xFC,0x03,0x5D,0x27, +0x02,0x80,0x1C,0x3C, +0x00,0x1C,0x9C,0x27, +0x00,0xF0,0x08,0x3C, +0x00,0x0C,0x08,0x35, +0x00,0x60,0x88,0x40, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x84,0x24, +0xFF,0x7F,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x24,0x20,0x85,0x00, +0x00,0x20,0x84,0x4C, +0xFF,0xFF,0x05,0x34, +0x21,0x28,0xA4,0x00, +0x00,0x28,0x85,0x4C, +0x02,0x80,0x08,0x3C, +0x00,0x00,0x08,0x25, +0x00,0x00,0x00,0xAD, +0x03,0x80,0x09,0x3C, +0xFC,0xCC,0x29,0x25, +0x04,0x00,0x08,0x25, +0xFE,0xFF,0x09,0x15, +0x00,0x00,0x00,0xAD, +0x00,0x80,0x04,0x3C, +0x00,0x00,0x84,0x24, +0xFF,0x7F,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x24,0x20,0x85,0x00, +0x00,0x00,0x84,0x4C, +0xFF,0xFF,0x06,0x34, +0x21,0x30,0xC4,0x00, +0x24,0x30,0xC5,0x00, +0x00,0x08,0x86,0x4C, +0x00,0xA0,0x04,0x40, +0x10,0x00,0x84,0x34, +0x00,0xA0,0x84,0x40, +0x01,0x80,0x1B,0x3C, +0xEC,0x00,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x44,0x00,0x84,0x34, +0x00,0x00,0x85,0x84, +0x20,0x00,0x06,0x24, +0x25,0x28,0xA6,0x00, +0x00,0x00,0x85,0xA4, +0x01,0x80,0x1B,0x3C, +0x1C,0x01,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x25,0xB0,0x04,0x3C, +0x44,0x00,0x84,0x34, +0x00,0x00,0x85,0x8C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xA5,0x30, +0xFC,0xFF,0xA0,0x10, +0x00,0x00,0x00,0x00, +0xFF,0x1F,0x07,0x3C, +0xFF,0xFF,0xE7,0x34, +0x02,0x80,0x05,0x3C, +0xD8,0x5D,0xA5,0x24, +0xFF,0xFF,0xA5,0x30, +0x40,0xB0,0x04,0x3C, +0x25,0x28,0xA4,0x00, +0x24,0x28,0xA7,0x00, +0x21,0x30,0x00,0x00, +0x43,0xB0,0x02,0x3C, +0x00,0x80,0x04,0x3C, +0x40,0x00,0x84,0x34, +0x00,0x00,0x45,0xAC, +0x04,0x00,0x46,0xAC, +0x08,0x00,0x44,0xAC, +0xEA,0x65,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x09,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x42,0x24, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x82,0xAC, +0x00,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x40,0x00, +0x00,0x60,0x83,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x82,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x0C,0x02,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x85,0x8C, +0x00,0xA0,0x03,0x3C, +0x01,0x00,0x02,0x24, +0x25,0x28,0xA3,0x00, +0x00,0x00,0xA4,0x8C, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x3C,0x02,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x82,0x8C, +0x02,0x00,0x83,0x94, +0x00,0xA0,0x07,0x3C, +0x25,0x28,0x47,0x00, +0x00,0x00,0xA2,0x8C, +0x10,0x00,0x02,0x24, +0x13,0x00,0x62,0x10, +0x11,0x00,0x66,0x28, +0x06,0x00,0xC0,0x10, +0x20,0x00,0x02,0x24, +0x08,0x00,0x02,0x24, +0x17,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0xFD,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA3,0xAC, +0x04,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x25,0x10,0x47,0x00, +0x00,0x00,0x42,0x8C, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xA4, +0x04,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x25,0x18,0x67,0x00, +0x00,0x00,0x62,0x94, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xA0, +0x04,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x25,0x18,0x67,0x00, +0x00,0x00,0x62,0x90, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x47,0x24, +0x30,0x37,0xE3,0x90, +0xFF,0xFF,0xA5,0x30, +0x09,0x00,0xA3,0x10, +0x21,0x20,0xC0,0x00, +0xA0,0x37,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0xC2,0xAC, +0xAA,0x37,0xE3,0x94, +0x0E,0x00,0x02,0x24, +0x14,0x00,0xC2,0xAC, +0x30,0x09,0x00,0x08, +0x0C,0x00,0xC3,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x31,0x26, +0x88,0x37,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x01,0x80,0x03,0x3C, +0x25,0x80,0x02,0x02, +0x25,0xB0,0x02,0x3C, +0x40,0x03,0x63,0x24, +0x18,0x03,0x42,0x34, +0x60,0x00,0x04,0x26, +0x80,0x00,0x05,0x26, +0x00,0x00,0x43,0xAC, +0x5F,0x1E,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x21,0x20,0x00,0x02, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x08,0x00,0x06,0x24, +0x88,0x37,0x22,0x8E, +0x0C,0x00,0x03,0x24, +0x0C,0x00,0x43,0xAE, +0x08,0x00,0x42,0xAE, +0x12,0x00,0x02,0x24, +0x14,0x00,0x42,0xAE, +0x21,0x20,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x30,0x09,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x1C,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x30,0x80,0x00, +0x21,0x90,0x00,0x00, +0x00,0x60,0x11,0x40, +0x01,0x00,0x21,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0D,0x00,0x83,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x60,0x14, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x03,0x24, +0xF8,0x5E,0x43,0xA0, +0x0C,0x00,0xC2,0x90, +0x02,0x80,0x05,0x3C, +0x0D,0x5F,0xA2,0xA0, +0x00,0x00,0xC4,0x90, +0x05,0x00,0x02,0x24, +0xFF,0x00,0x83,0x30, +0x41,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x02,0x24, +0x31,0x00,0x62,0x10, +0xFF,0x00,0x84,0x30, +0x09,0x00,0x82,0x2C, +0x25,0x00,0x40,0x10, +0x02,0x80,0x10,0x3C, +0xF4,0x5E,0x02,0x92, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x21,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0xB6,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF4,0x5E,0x02,0x92, +0x00,0x00,0x00,0x00, +0x34,0x00,0x40,0x10, +0x02,0x80,0x03,0x3C, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x51,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x11,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA0, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x06,0x00,0x40,0x10, +0x04,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x40,0x41,0x00,0x08, +0x00,0x00,0x00,0x00, +0x04,0x00,0x12,0x24, +0x00,0x60,0x91,0x40, +0x21,0x10,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x0B,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x02,0x24, +0x10,0x5F,0x62,0xA0, +0x10,0x5F,0x63,0x90, +0x02,0x80,0x02,0x3C, +0x11,0x5F,0x43,0xA0, +0x00,0x00,0xC4,0x90, +0x18,0x41,0x00,0x08, +0xFF,0x00,0x84,0x30, +0x0D,0x5F,0xA0,0xA0, +0x00,0x00,0xC4,0x90, +0x15,0x41,0x00,0x08, +0xFF,0x00,0x83,0x30, +0x42,0xB0,0x06,0x3C, +0x00,0x00,0xC3,0x90, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xC7,0x34, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xC3,0xA0, +0x0C,0x00,0x04,0x24, +0x00,0x00,0xE2,0xA0, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x15,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x2A,0x1C,0x43,0x90, +0x00,0x00,0x00,0x00, +0xCD,0xFF,0x60,0x10, +0x00,0x00,0x00,0x00, +0x50,0x39,0x44,0x94, +0x2A,0x1C,0x40,0xA0, +0x00,0xC0,0x84,0x24, +0xC2,0x34,0x00,0x0C, +0xFF,0xFF,0x84,0x30, +0x40,0x41,0x00,0x08, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x40,0xA0, +0x40,0x41,0x00,0x08, +0x00,0x00,0x00,0x00, +0x9B,0x30,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x6B,0x41,0x00,0x08, +0x00,0x08,0x04,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x30,0x26, +0xB0,0x1B,0x07,0x96, +0x18,0x00,0xBF,0xAF, +0xFF,0xFF,0xE3,0x30, +0x00,0x01,0x62,0x30, +0x0E,0x00,0x40,0x10, +0x01,0x00,0x66,0x30, +0x02,0x80,0x04,0x3C, +0x88,0x58,0x84,0x24, +0x03,0x00,0x05,0x24, +0x17,0x00,0xC0,0x14, +0x04,0x00,0x62,0x30, +0x02,0x00,0x40,0x10, +0xFB,0xF6,0xE3,0x30, +0xB0,0x1B,0x03,0xA6, +0xA3,0x51,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x40,0xA0, +0x21,0x20,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x30,0x1F,0x23,0x26, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x20,0x00,0xBD,0x27, +0x10,0x3E,0x60,0xAC, +0xEC,0x38,0x60,0xAC, +0x08,0x39,0x60,0xAC, +0x08,0x00,0xE0,0x03, +0x50,0x3E,0x60,0xAC, +0x6C,0x4C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFE,0xFE,0x42,0x30, +0xA3,0x51,0x00,0x0C, +0xB0,0x1B,0x02,0xA6, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x40,0xA0, +0x9D,0x41,0x00,0x08, +0x21,0x20,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x01,0x00,0x83,0x90, +0x02,0x80,0x02,0x3C, +0x21,0x38,0x80,0x00, +0xB0,0x5C,0x43,0xAC, +0x01,0x00,0x84,0x90, +0x00,0x00,0xE2,0x90, +0x02,0x80,0x06,0x3C, +0xFF,0x00,0x85,0x30, +0x80,0x10,0x02,0x00, +0x25,0x28,0xA2,0x00, +0xE8,0xDD,0xC6,0x24, +0xFF,0x00,0x84,0x30, +0x00,0x80,0xA5,0x34, +0x4E,0x23,0x00,0x0C, +0x03,0x00,0xE7,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x03,0x3C, +0x1C,0x00,0xBF,0xAF, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x43,0x30, +0x00,0x01,0x42,0x30, +0x04,0x00,0x40,0x10, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x06,0x00,0x60,0x14, +0xE0,0xD7,0x84,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x07,0x92, +0x07,0x00,0x02,0x26, +0x21,0x20,0x00,0x02, +0x80,0x38,0x07,0x00, +0x00,0x80,0xE7,0x34, +0x05,0x00,0x05,0x24, +0x21,0x30,0x00,0x00, +0x1E,0x51,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x30,0x1F,0x45,0x24, +0x50,0x3E,0xA3,0x8C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x60,0x14, +0x21,0x80,0x80,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x4C,0x3E,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x21,0x10,0x45,0x00, +0x44,0x3E,0x40,0xA0, +0x00,0x00,0x84,0x8C, +0x6D,0x1D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x8E, +0x03,0x00,0x04,0x24, +0x90,0x14,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x84,0x90, +0x4F,0x0C,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x86,0x90, +0x21,0x80,0x80,0x00, +0x00,0x7F,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x08,0x0E,0x04,0x24, +0x00,0x00,0x05,0x92, +0x7F,0x7F,0x11,0x3C, +0x00,0x0E,0x04,0x24, +0x00,0x14,0x05,0x00, +0x00,0x86,0x05,0x00, +0x00,0x1A,0x05,0x00, +0x25,0x80,0x02,0x02, +0x25,0x80,0x03,0x02, +0x25,0x80,0x05,0x02, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x7F,0x7F,0x25,0x36, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x04,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x10,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x14,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x18,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x1C,0x0E,0x04,0x24, +0xA9,0x45,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x28,0x00,0xBF,0xAF, +0x00,0x00,0x85,0x94, +0x02,0x00,0x02,0x24, +0x21,0x98,0x80,0x00, +0x10,0x00,0xA0,0xA3, +0x21,0x80,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x88,0x00,0x00, +0x66,0x00,0xA2,0x10, +0x10,0x00,0xB2,0x27, +0x03,0x00,0xA2,0x28, +0x26,0x00,0x40,0x14, +0x01,0x00,0x02,0x24, +0x03,0x00,0x02,0x24, +0x75,0x00,0xA2,0x10, +0x24,0x08,0x04,0x24, +0x0C,0x09,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x04,0x08,0x04,0x24, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x02,0x00,0x64,0x96, +0x02,0x00,0x02,0x24, +0x35,0x00,0x82,0x10, +0x03,0x00,0x82,0x28, +0x4B,0x00,0x40,0x10, +0x03,0x00,0x02,0x24, +0x01,0x00,0x02,0x24, +0x60,0x00,0x82,0x10, +0x21,0x30,0x20,0x02, +0x04,0x0C,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x21,0x30,0x20,0x02, +0x04,0x0D,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x10,0x00,0xA6,0x93, +0x04,0x0A,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0xFF,0x05,0x3C, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xDE,0xFF,0xA2,0x14, +0x0C,0x09,0x04,0x24, +0x24,0x08,0x04,0x24, +0x0E,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x2C,0x08,0x04,0x24, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x0E,0x00,0x05,0x24, +0x10,0x00,0xA2,0x93, +0x80,0xFF,0x03,0x24, +0x11,0x11,0x04,0x3C, +0x0F,0x00,0x42,0x30, +0x25,0x10,0x43,0x00, +0x11,0x11,0x86,0x34, +0x03,0x00,0x10,0x24, +0x10,0x00,0xA2,0xA3, +0x0C,0x09,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x04,0x08,0x04,0x24, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x02,0x00,0x64,0x96, +0x02,0x00,0x02,0x24, +0xCD,0xFF,0x82,0x14, +0x03,0x00,0x82,0x28, +0x00,0x00,0x42,0x92, +0x02,0x00,0x11,0x24, +0xF5,0x00,0x42,0x30, +0x05,0x00,0x42,0x34, +0x00,0x00,0x42,0xA2, +0x21,0x30,0x20,0x02, +0x04,0x0C,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x21,0x30,0x20,0x02, +0x04,0x0D,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x10,0x00,0xA6,0x93, +0x04,0x0A,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0xFF,0x05,0x3C, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xB8,0xFF,0x82,0x14, +0x21,0x30,0x20,0x02, +0x00,0x00,0x42,0x92, +0x03,0x00,0x11,0x24, +0xF0,0x00,0x42,0x30, +0x01,0x00,0x42,0x34, +0xD4,0x42,0x00,0x08, +0x00,0x00,0x42,0xA2, +0x24,0x08,0x04,0x24, +0x0E,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x02,0x00,0x06,0x24, +0x2C,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0E,0x00,0x05,0x24, +0x10,0x00,0xA2,0x93, +0x22,0x22,0x03,0x3C, +0x22,0x22,0x66,0x34, +0x0F,0x00,0x42,0x30, +0x40,0x00,0x42,0x34, +0x03,0x00,0x10,0x24, +0xC4,0x42,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0x00,0x00,0x42,0x92, +0x01,0x00,0x11,0x24, +0xF0,0x00,0x42,0x30, +0xD4,0x42,0x00,0x08, +0x00,0x00,0x42,0xA2, +0x0E,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x02,0x00,0x06,0x24, +0x2C,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0E,0x00,0x05,0x24, +0x10,0x00,0xA2,0x93, +0xC0,0xFF,0x03,0x24, +0x03,0x00,0x10,0x24, +0x0F,0x00,0x42,0x30, +0x25,0x10,0x43,0x00, +0x32,0x03,0x03,0x3C, +0x33,0x13,0x66,0x34, +0x90,0x42,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0x00,0x00,0x86,0x8C, +0x00,0x0F,0x05,0x3C, +0xA9,0x45,0x00,0x08, +0x80,0x08,0x04,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0xF0,0xD7,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0x21,0x00,0x40,0x10, +0x21,0x30,0x00,0x00, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0x00,0x02,0x05,0x3C, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0x32,0x00,0x40,0x10, +0x01,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x40,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x0D,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x10,0x27,0x04,0x24, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0x3E,0x43,0x00,0x08, +0x21,0x30,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x08,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x0F,0x00,0x12,0x3C, +0x0F,0x00,0x11,0x3C, +0x00,0x08,0x04,0x24, +0x00,0x01,0x05,0x3C, +0x20,0x00,0x40,0x10, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x02,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x08,0x04,0x24, +0x01,0x00,0x04,0x92, +0xE6,0x44,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x06,0x3C, +0xFF,0xFF,0x45,0x36, +0x00,0x40,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x21,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x02,0x00,0x06,0x3C, +0xFF,0xFF,0x45,0x36, +0x1F,0x00,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x02,0x05,0x3C, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0x08,0x04,0x24, +0x01,0x00,0x04,0x92, +0xE6,0x44,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x06,0x3C, +0xFF,0xFF,0x25,0x36, +0x00,0x40,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x21,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xFF,0xFF,0x25,0x36, +0x21,0x20,0x00,0x00, +0x5F,0x47,0x00,0x0C, +0x03,0x00,0x06,0x3C, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x20,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x40,0x10, +0x00,0x0A,0x04,0x24, +0x04,0x00,0x02,0x8E, +0x00,0x08,0x04,0x24, +0x04,0x00,0x42,0x2C, +0x1C,0x00,0x40,0x14, +0x00,0x01,0x05,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x04,0x00,0x02,0x8E, +0x03,0x00,0x05,0x24, +0x04,0x00,0x42,0x2C, +0xF8,0xFF,0x40,0x10, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xCB,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x01,0x05,0x3C, +0x1B,0x00,0x40,0x10, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x00,0x30,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0xE4,0x43,0x00,0x08, +0x00,0x00,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0x43,0x00,0x08, +0x00,0x0D,0x04,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x40,0xD8,0x84,0x24, +0x04,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x04,0x00,0x62,0x2C, +0x2C,0x00,0x40,0x14, +0xFC,0xFF,0x62,0x24, +0x18,0x00,0x42,0x2C, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x6C,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x54,0x00,0x40,0x10, +0x00,0x0D,0x04,0x24, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0x00,0x02,0x05,0x3C, +0x63,0x00,0x40,0x10, +0x00,0x08,0x04,0x24, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x58,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x21,0x00,0x40,0x10, +0x00,0x0A,0x04,0x24, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x3A,0x00,0x40,0x10, +0x00,0x08,0x04,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x04,0x00,0x06,0x8E, +0x00,0x0A,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0x30,0x05,0x24, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x3F,0x44,0x00,0x08, +0x00,0x00,0x00,0x00, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0x66,0x44,0x00,0x08, +0x01,0x00,0x06,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x40,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x0D,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x10,0x27,0x04,0x24, +0x72,0x44,0x00,0x08, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x50,0x44,0x00,0x08, +0x00,0x0D,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x2C,0x44,0x00,0x08, +0x00,0x0A,0x04,0x24, +0xE8,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x03,0x02,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x90,0x90, +0x25,0xB0,0x02,0x3C, +0xFF,0x00,0x63,0x30, +0xFB,0x00,0x65,0x30, +0x00,0x00,0x04,0x3A, +0x04,0x00,0x63,0x34, +0x0B,0x18,0xA4,0x00, +0x03,0x02,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x12,0x00,0x00,0x12, +0x01,0x00,0x02,0x24, +0x22,0x00,0x02,0x12, +0x00,0x08,0x04,0x24, +0x1A,0x00,0x00,0x12, +0x01,0x00,0x02,0x24, +0x08,0x00,0x02,0x16, +0x00,0x00,0x00,0x00, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x18,0x00,0x04,0x24, +0x00,0x0C,0x05,0x24, +0x21,0x30,0x00,0x00, +0x5F,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x00,0x08,0x04,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x58,0x00,0x06,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x18,0x00,0x04,0x24, +0x00,0x0C,0x05,0x24, +0xAE,0x44,0x00,0x08, +0x01,0x00,0x06,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x0C,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x18,0x00,0x06,0x24, +0xA5,0x44,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x21,0x20,0x82,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0x01,0x80,0x03,0x3C, +0x21,0x38,0x80,0x00, +0x18,0x03,0xA2,0x34, +0x98,0x13,0x63,0x24, +0x01,0x00,0x04,0x24, +0x00,0x00,0x43,0xAC, +0x35,0x00,0xE4,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x10, +0x20,0x08,0xA2,0x34, +0x02,0x00,0x02,0x24, +0x83,0x00,0xE2,0x10, +0x03,0x00,0x02,0x24, +0x5A,0x00,0xE2,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x30,0x1F,0x66,0x24, +0x70,0x08,0x02,0x24, +0xE0,0x08,0x03,0x24, +0x34,0x1C,0xC2,0xAC, +0x40,0x08,0x02,0x24, +0x38,0x1C,0xC3,0xAC, +0x44,0x1C,0xC2,0xAC, +0x78,0x08,0x03,0x24, +0x0C,0x08,0x02,0x24, +0x48,0x1C,0xC3,0xAC, +0x4C,0x1C,0xC2,0xAC, +0x10,0x08,0x03,0x24, +0x20,0x08,0x02,0x24, +0x50,0x1C,0xC3,0xAC, +0x54,0x1C,0xC2,0xAC, +0x24,0x08,0x03,0x24, +0x58,0x08,0x02,0x24, +0x58,0x1C,0xC3,0xAC, +0x5C,0x1C,0xC2,0xAC, +0x50,0x0C,0x03,0x24, +0x54,0x0C,0x02,0x24, +0x60,0x1C,0xC3,0xAC, +0x64,0x1C,0xC2,0xAC, +0x14,0x0C,0x03,0x24, +0x10,0x0C,0x02,0x24, +0x60,0x08,0x05,0x24, +0x68,0x1C,0xC3,0xAC, +0x6C,0x1C,0xC2,0xAC, +0x80,0x0C,0x03,0x24, +0x84,0x0C,0x02,0x24, +0x00,0x01,0x84,0x30, +0x74,0x1C,0xC2,0xAC, +0x40,0x1C,0xC5,0xAC, +0x70,0x1C,0xC3,0xAC, +0x31,0x1C,0xC0,0xA0, +0x3C,0x1C,0xC5,0xAC, +0x02,0x00,0x80,0x10, +0xA0,0x08,0x02,0x24, +0xB8,0x08,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x78,0x1C,0xC2,0xAC, +0x28,0x08,0xA2,0x34, +0x02,0x80,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x30,0x1F,0x66,0x24, +0x70,0x08,0x02,0x24, +0xE0,0x08,0x03,0x24, +0x34,0x1C,0xC2,0xAC, +0x44,0x08,0x02,0x24, +0x38,0x1C,0xC3,0xAC, +0x44,0x1C,0xC2,0xAC, +0x78,0x08,0x03,0x24, +0x0C,0x08,0x02,0x24, +0x48,0x1C,0xC3,0xAC, +0x4C,0x1C,0xC2,0xAC, +0x14,0x08,0x03,0x24, +0x28,0x08,0x02,0x24, +0x50,0x1C,0xC3,0xAC, +0x54,0x1C,0xC2,0xAC, +0x2C,0x08,0x03,0x24, +0x58,0x08,0x02,0x24, +0x58,0x1C,0xC3,0xAC, +0x5C,0x1C,0xC2,0xAC, +0x58,0x0C,0x03,0x24, +0x5C,0x0C,0x02,0x24, +0x60,0x1C,0xC3,0xAC, +0x64,0x1C,0xC2,0xAC, +0x1C,0x0C,0x03,0x24, +0x18,0x0C,0x02,0x24, +0x64,0x08,0x05,0x24, +0x68,0x1C,0xC3,0xAC, +0x6C,0x1C,0xC2,0xAC, +0x88,0x0C,0x03,0x24, +0x8C,0x0C,0x02,0x24, +0x00,0x01,0x84,0x30, +0x74,0x1C,0xC2,0xAC, +0x31,0x1C,0xC7,0xA0, +0x40,0x1C,0xC5,0xAC, +0x70,0x1C,0xC3,0xAC, +0x3C,0x1C,0xC5,0xAC, +0xD6,0xFF,0x80,0x10, +0xA4,0x08,0x02,0x24, +0xBC,0x08,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x78,0x1C,0xC2,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xAC,0x08,0x03,0x24, +0x78,0x1C,0x43,0xAC, +0x74,0x08,0x03,0x24, +0xE4,0x08,0x04,0x24, +0x34,0x1C,0x43,0xAC, +0x4C,0x08,0x03,0x24, +0x38,0x1C,0x44,0xAC, +0x44,0x1C,0x43,0xAC, +0x7C,0x08,0x04,0x24, +0x0C,0x08,0x03,0x24, +0x48,0x1C,0x44,0xAC, +0x4C,0x1C,0x43,0xAC, +0x1C,0x08,0x04,0x24, +0x38,0x08,0x03,0x24, +0x50,0x1C,0x44,0xAC, +0x54,0x1C,0x43,0xAC, +0x3C,0x08,0x04,0x24, +0x5C,0x08,0x03,0x24, +0x58,0x1C,0x44,0xAC, +0x5C,0x1C,0x43,0xAC, +0x68,0x0C,0x04,0x24, +0x6C,0x0C,0x03,0x24, +0x60,0x1C,0x44,0xAC, +0x64,0x1C,0x43,0xAC, +0x2C,0x0C,0x04,0x24, +0x28,0x0C,0x03,0x24, +0x6C,0x08,0x05,0x24, +0x68,0x1C,0x44,0xAC, +0x6C,0x1C,0x43,0xAC, +0x98,0x0C,0x04,0x24, +0x9C,0x0C,0x03,0x24, +0x31,0x1C,0x47,0xA0, +0x40,0x1C,0x45,0xAC, +0x70,0x1C,0x44,0xAC, +0x74,0x1C,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x3C,0x1C,0x45,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xA8,0x08,0x03,0x24, +0x78,0x1C,0x43,0xAC, +0x74,0x08,0x03,0x24, +0xE4,0x08,0x04,0x24, +0x34,0x1C,0x43,0xAC, +0x48,0x08,0x03,0x24, +0x38,0x1C,0x44,0xAC, +0x44,0x1C,0x43,0xAC, +0x7C,0x08,0x04,0x24, +0x0C,0x08,0x03,0x24, +0x48,0x1C,0x44,0xAC, +0x4C,0x1C,0x43,0xAC, +0x18,0x08,0x04,0x24, +0x30,0x08,0x03,0x24, +0x50,0x1C,0x44,0xAC, +0x54,0x1C,0x43,0xAC, +0x34,0x08,0x04,0x24, +0x5C,0x08,0x03,0x24, +0x58,0x1C,0x44,0xAC, +0x5C,0x1C,0x43,0xAC, +0x60,0x0C,0x04,0x24, +0x64,0x0C,0x03,0x24, +0x60,0x1C,0x44,0xAC, +0x64,0x1C,0x43,0xAC, +0x24,0x0C,0x04,0x24, +0x20,0x0C,0x03,0x24, +0x68,0x08,0x05,0x24, +0x68,0x1C,0x44,0xAC, +0x6C,0x1C,0x43,0xAC, +0x90,0x0C,0x04,0x24, +0x94,0x0C,0x03,0x24, +0x31,0x1C,0x47,0xA0, +0x40,0x1C,0x45,0xAC, +0x70,0x1C,0x44,0xAC, +0x74,0x1C,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x3C,0x1C,0x45,0xAC, +0xA2,0x45,0x00,0x08, +0x21,0x18,0x00,0x00, +0x20,0x00,0x62,0x2C, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x06,0x10,0x64,0x00, +0x01,0x00,0x42,0x30, +0xFA,0xFF,0x40,0x10, +0x01,0x00,0x63,0x24, +0xFF,0xFF,0x63,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x25,0xB0,0x02,0x3C, +0x21,0x88,0xA0,0x00, +0xFF,0xFF,0x03,0x24, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x21,0x98,0xC0,0x00, +0x21,0x28,0xC0,0x00, +0x21,0x90,0x80,0x00, +0x09,0x00,0x23,0x12, +0x21,0x80,0x82,0x00, +0x00,0x00,0x10,0x8E, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x27,0x28,0x11,0x00, +0x24,0x28,0xB0,0x00, +0x04,0x10,0x53,0x00, +0x25,0x28,0xA2,0x00, +0x21,0x20,0x40,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xDB,0x44,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x21,0x30,0x80,0x00, +0x74,0x3B,0x44,0x8C, +0xA9,0x45,0x00,0x08, +0xFF,0xFF,0x05,0x24, +0xE0,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x82,0x00, +0x00,0x00,0x90,0x8C, +0x21,0x88,0xA0,0x00, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0xA0,0x00, +0x24,0x80,0x11,0x02, +0x06,0x10,0x50,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x20,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x1C,0x00,0xB3,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x31,0x26, +0x58,0x1C,0x23,0x8E, +0x25,0xB0,0x02,0x3C, +0x24,0x08,0x53,0x8C, +0x21,0x18,0x62,0x00, +0x00,0x00,0x70,0x8C, +0x7F,0x80,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xFF,0x7F,0x05,0x3C, +0x24,0x80,0x02,0x02, +0xC0,0x25,0x04,0x00, +0xFF,0xFF,0xA5,0x34, +0x24,0x28,0x65,0x02, +0x25,0x80,0x04,0x02, +0xDB,0x44,0x00,0x0C, +0x24,0x08,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x00,0x80,0x12,0x3C, +0x58,0x1C,0x24,0x8E, +0x25,0x80,0x12,0x02, +0xDB,0x44,0x00,0x0C, +0x21,0x28,0x00,0x02, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x25,0x28,0x72,0x02, +0xDB,0x44,0x00,0x0C, +0x24,0x08,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x78,0x1C,0x24,0x8E, +0x0F,0x00,0x05,0x3C, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0xFF,0xA5,0x34, +0xCB,0x45,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xBF,0xAF, +0x30,0x1F,0x27,0x26, +0x33,0x1C,0xE5,0x90, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x2C,0x18,0x63,0x24, +0x18,0x03,0x42,0x34, +0x02,0x00,0x06,0x24, +0x00,0x00,0x43,0xAC, +0x34,0x00,0xA6,0x10, +0x21,0x80,0x80,0x00, +0x03,0x00,0x03,0x24, +0x3A,0x00,0xA3,0x10, +0x2E,0x00,0x02,0x2E, +0x10,0x00,0x02,0x2E, +0x07,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x04,0x32, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xDC,0x45,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xFA,0xFF,0xA6,0x14, +0xFF,0x00,0x04,0x32, +0x31,0x1C,0xE4,0x90, +0x01,0x00,0x02,0x24, +0x33,0x00,0x82,0x10, +0x02,0x00,0x82,0x28, +0x38,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x38,0x00,0x85,0x10, +0x30,0x1F,0x22,0x26, +0x2E,0x00,0x83,0x10, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0xFF,0xFC,0x06,0x3C, +0xFF,0xFF,0xC6,0x34, +0x24,0x30,0x46,0x00, +0x00,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x30,0x1F,0x22,0x26, +0x31,0x1C,0x44,0x90, +0x01,0x00,0x03,0x24, +0x07,0x00,0x83,0x10, +0x02,0x00,0x82,0x28, +0x2C,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x2C,0x00,0x82,0x10, +0x03,0x00,0x02,0x24, +0xDB,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x21,0x46,0x00,0x08, +0xFF,0x00,0x04,0x32, +0x25,0x00,0x82,0x2C, +0xCC,0xFF,0x40,0x14, +0x03,0x00,0x03,0x24, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xC7,0xFF,0x40,0x14, +0x10,0x00,0x02,0x2E, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0x33,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xCC,0xFF,0x80,0x14, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0x33,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xB2,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x21,0x46,0x00,0x08, +0xFF,0x00,0x04,0x32, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x30,0x1F,0x28,0x26, +0x33,0x1C,0x06,0x91, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xD8,0x19,0x63,0x24, +0x18,0x03,0x42,0x34, +0x02,0x00,0x07,0x24, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0x00,0x00,0x43,0xAC, +0x21,0x90,0xA0,0x00, +0x39,0x00,0xC7,0x10, +0xFF,0x00,0x90,0x30, +0x03,0x00,0x03,0x24, +0x3F,0x00,0xC3,0x10, +0x2E,0x00,0x02,0x2E, +0x10,0x00,0x02,0x2E, +0x0C,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x04,0x3C, +0xFF,0xFF,0x84,0x34, +0x24,0x20,0x44,0x02, +0x00,0x15,0x10,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x25,0x20,0x44,0x00, +0xC6,0x45,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xF5,0xFF,0xC7,0x14, +0x0F,0x00,0x04,0x3C, +0x31,0x1C,0x04,0x91, +0x01,0x00,0x02,0x24, +0x33,0x00,0x82,0x10, +0x02,0x00,0x82,0x28, +0x38,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x38,0x00,0x86,0x10, +0x30,0x1F,0x22,0x26, +0x2E,0x00,0x83,0x10, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0xFF,0xFC,0x06,0x3C, +0xFF,0xFF,0xC6,0x34, +0x24,0x30,0x46,0x00, +0x00,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x30,0x1F,0x22,0x26, +0x31,0x1C,0x44,0x90, +0x01,0x00,0x03,0x24, +0x07,0x00,0x83,0x10, +0x02,0x00,0x82,0x28, +0x2C,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x2C,0x00,0x82,0x10, +0x03,0x00,0x02,0x24, +0xD6,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x8E,0x46,0x00,0x08, +0x0F,0x00,0x04,0x3C, +0x25,0x00,0x02,0x2E, +0xC7,0xFF,0x40,0x14, +0x03,0x00,0x03,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xC1,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0xA5,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xCC,0xFF,0x80,0x14, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0xA5,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xAD,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x8E,0x46,0x00,0x08, +0x0F,0x00,0x04,0x3C, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x14,0x00,0xBF,0xAF, +0xDC,0x45,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x40,0x01,0x44,0x34, +0x21,0x18,0x40,0x00, +0x1F,0x00,0x02,0x2E, +0x00,0x23,0x04,0x00, +0x10,0x00,0x40,0x10, +0x10,0x00,0x05,0x2E, +0x00,0x01,0x64,0x34, +0x06,0x00,0xA0,0x10, +0x00,0x23,0x04,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xC6,0x45,0x00,0x0C, +0xF1,0xFF,0x10,0x26, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xC6,0x45,0x00,0x0C, +0xE2,0xFF,0x10,0x26, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x82,0x00, +0x00,0x00,0x90,0x8C, +0x21,0x88,0xA0,0x00, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0xA0,0x00, +0x24,0x80,0x11,0x02, +0x06,0x10,0x50,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xB2,0xAF, +0x21,0x90,0x82,0x00, +0xFF,0xFF,0x02,0x24, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x88,0xA0,0x00, +0x21,0x20,0xA0,0x00, +0x21,0x18,0x40,0x02, +0x10,0x00,0xA2,0x10, +0x21,0x98,0xC0,0x00, +0x00,0x00,0x50,0x8E, +0x9D,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x27,0x18,0x11,0x00, +0x24,0x18,0x70,0x00, +0x04,0x10,0x53,0x00, +0x25,0x18,0x62,0x00, +0x00,0x00,0x43,0xAE, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x28,0x00,0xBD,0x27, +0x00,0x00,0x66,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x21,0x38,0x82,0x00, +0xFF,0xFF,0x02,0x24, +0x27,0x40,0x05,0x00, +0x08,0x00,0xA2,0x10, +0x24,0x18,0xC5,0x00, +0x00,0x00,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x02,0x01, +0x25,0x10,0x43,0x00, +0x00,0x00,0xE2,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x38,0xA0,0x00, +0x25,0xB0,0x02,0x3C, +0xFF,0xFF,0x03,0x24, +0x27,0x48,0x05,0x00, +0x24,0x40,0xC7,0x00, +0x21,0x28,0xC0,0x00, +0x05,0x00,0xE3,0x10, +0x21,0x30,0x82,0x00, +0x00,0x00,0xC5,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x28,0x25,0x01, +0x25,0x28,0xA8,0x00, +0xDB,0x44,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xD8,0xFF,0xBD,0x27, +0x7C,0x1D,0x42,0x24, +0x18,0x03,0x63,0x34, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x24,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x21,0x88,0xA0,0x00, +0x21,0x98,0xC0,0x00, +0x21,0xA0,0x80,0x00, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x0A,0x00,0x22,0x12, +0x21,0x28,0xC0,0x00, +0x0B,0x46,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x20,0x20,0x02, +0x9D,0x45,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x27,0x28,0x11,0x00, +0x24,0x28,0xB0,0x00, +0x04,0x10,0x53,0x00, +0x25,0x28,0xA2,0x00, +0x76,0x46,0x00,0x0C, +0xFF,0x00,0x84,0x32, +0x00,0x60,0x92,0x40, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x28,0x1E,0x63,0x24, +0x18,0x03,0x42,0x34, +0xE0,0xFF,0xBD,0x27, +0x00,0x00,0x43,0xAC, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x0B,0x46,0x00,0x0C, +0x21,0x88,0xA0,0x00, +0x21,0x80,0x40,0x00, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x24,0x80,0x11,0x02, +0x06,0x10,0x50,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x24,0x00,0xB5,0xAF, +0xFF,0x00,0x84,0x30, +0x21,0xA8,0xC0,0x00, +0x28,0x00,0xB6,0xAF, +0x1C,0x00,0xB3,0xAF, +0x2C,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0xB0,0xA0,0x00, +0xE6,0x44,0x00,0x0C, +0x21,0x98,0x00,0x00, +0x21,0x00,0xA0,0x16, +0x80,0x10,0x13,0x00, +0xDD,0x47,0x00,0x08, +0x00,0x00,0x00,0x00, +0xFD,0x00,0x02,0x24, +0x23,0x00,0x02,0x12, +0x05,0x00,0x04,0x24, +0xFC,0x00,0x02,0x24, +0x37,0x00,0x02,0x12, +0x00,0x00,0x00,0x00, +0xFB,0x00,0x02,0x24, +0x30,0x00,0x02,0x12, +0x32,0x00,0x04,0x24, +0xFA,0x00,0x02,0x24, +0x2D,0x00,0x02,0x12, +0x05,0x00,0x04,0x24, +0xF9,0x00,0x02,0x24, +0x29,0x00,0x02,0x12, +0x0F,0x00,0x05,0x3C, +0x04,0x00,0xD1,0x8C, +0xFF,0xFF,0xA5,0x34, +0x21,0x20,0x00,0x02, +0x5F,0x47,0x00,0x0C, +0x21,0x30,0x20,0x02, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x19,0x00,0x02,0x24, +0x28,0x00,0x02,0x12, +0x21,0x90,0x00,0x00, +0x02,0x00,0x62,0x26, +0xFF,0x00,0x53,0x30, +0x2B,0x18,0x75,0x02, +0x0F,0x00,0x60,0x10, +0x80,0x10,0x13,0x00, +0x21,0x30,0x56,0x00, +0x00,0x00,0xD0,0x8C, +0xFF,0x00,0x02,0x24, +0x0A,0x00,0x02,0x12, +0xFE,0x00,0x02,0x24, +0xDC,0xFF,0x02,0x16, +0x32,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x00,0x62,0x26, +0xFF,0x00,0x53,0x30, +0x2B,0x18,0x75,0x02, +0xF3,0xFF,0x60,0x14, +0x80,0x10,0x13,0x00, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x01,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xCB,0x47,0x00,0x08, +0x02,0x00,0x62,0x26, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xD9,0x47,0x00,0x08, +0x02,0x00,0x62,0x26, +0x0F,0x00,0x14,0x3C, +0x21,0x20,0x00,0x02, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x85,0x36, +0x21,0x20,0x00,0x02, +0xFF,0xFF,0x85,0x36, +0xD2,0xFF,0x51,0x10, +0x21,0x30,0x20,0x02, +0x5F,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x01,0x00,0x42,0x26, +0xFF,0x00,0x52,0x30, +0x0A,0x00,0x43,0x2E, +0xF2,0xFF,0x60,0x14, +0x21,0x20,0x00,0x02, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xB8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x28,0x00,0xB2,0xAF, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x30,0x1F,0x57,0x24, +0x64,0x37,0xE3,0x96, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x05,0x3C, +0x25,0xA0,0x62,0x00, +0xF0,0xDD,0xA5,0x24, +0x24,0x00,0x84,0x26, +0x06,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0x20,0x00,0x80,0xA6, +0x10,0x52,0x00,0x0C, +0x84,0x58,0x56,0x24, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x84,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x88,0x58,0xA5,0x24, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x30,0x00,0x84,0x26, +0x20,0x00,0x83,0x96, +0x74,0x00,0xD0,0x26, +0x21,0x20,0x00,0x02, +0x03,0xFF,0x63,0x30, +0x80,0x00,0x63,0x34, +0x20,0x00,0x83,0xA6, +0x20,0x00,0x1E,0x24, +0x40,0x00,0x93,0x26, +0x17,0x4F,0x00,0x0C, +0x1C,0x00,0xBE,0xAF, +0x21,0x28,0x40,0x00, +0x21,0x20,0x60,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x1C,0x00,0xA2,0x8F, +0x21,0x20,0x00,0x02, +0x42,0x00,0x93,0x26, +0x02,0x00,0x42,0x24, +0x32,0x4F,0x00,0x0C, +0x1C,0x00,0xA2,0xAF, +0x21,0x28,0x40,0x00, +0x21,0x20,0x60,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x1C,0x00,0xA2,0x8F, +0x0C,0x00,0xC6,0x8E, +0x1C,0x00,0xB0,0x27, +0x21,0x28,0x00,0x00, +0x10,0x00,0xC7,0x26, +0x02,0x00,0x42,0x24, +0x44,0x00,0x84,0x26, +0x60,0x00,0xD1,0x26, +0x1C,0x00,0xA2,0xAF, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x20,0x02, +0x37,0x50,0x00,0x0C, +0x21,0x98,0x40,0x00, +0x09,0x00,0x52,0x2C, +0x08,0x00,0x06,0x24, +0x21,0x20,0x60,0x02, +0x0B,0x30,0x52,0x00, +0x21,0x38,0x20,0x02, +0x01,0x00,0x05,0x24, +0x21,0xA8,0x40,0x00, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x40,0x00, +0x03,0x00,0x05,0x24, +0x01,0x00,0x06,0x24, +0x48,0x00,0xC7,0x26, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x40,0x00, +0x06,0x00,0x05,0x24, +0x02,0x00,0x06,0x24, +0x18,0x00,0xA7,0x27, +0x18,0x00,0xA0,0xA7, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xA5,0x97, +0x02,0x80,0x04,0x3C, +0x68,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x98,0x40,0x00, +0x13,0x00,0x40,0x12, +0x21,0x20,0x60,0x02, +0x1C,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x20,0x00,0x42,0x24, +0x01,0x01,0x42,0x2C, +0x18,0x00,0x40,0x14, +0x21,0x20,0x80,0x02, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xF8,0xFF,0xA6,0x26, +0x68,0x00,0xC7,0x26, +0x32,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x20,0x00,0x42,0x24, +0x01,0x01,0x42,0x2C, +0xEA,0xFF,0x40,0x10, +0x21,0x20,0x80,0x02, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x08,0x00,0x06,0x24, +0x08,0x00,0x84,0x8E, +0x04,0x00,0x85,0x8E, +0xFF,0xDF,0x02,0x3C, +0x10,0x00,0x86,0x8E, +0x14,0x00,0x87,0x8E, +0xFF,0xFF,0x42,0x34, +0x1C,0x00,0xA8,0x8F, +0x24,0x20,0x82,0x00, +0x00,0x40,0x03,0x3C, +0xFF,0xE0,0x02,0x24, +0x24,0x28,0xA2,0x00, +0x25,0x20,0x83,0x00, +0x00,0x80,0x02,0x3C, +0xFF,0x81,0x03,0x24, +0x24,0x38,0xE3,0x00, +0x25,0x30,0xC2,0x00, +0x00,0x10,0xA5,0x34, +0x80,0x00,0x84,0x34, +0x08,0x00,0x84,0xAE, +0x00,0x00,0x88,0xA6, +0x02,0x00,0x9E,0xA2, +0x14,0x00,0x87,0xAE, +0x04,0x00,0x85,0xAE, +0x10,0x00,0x86,0xAE, +0xF8,0x36,0xE6,0x8E, +0x64,0x37,0xE5,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x01,0x07,0x24, +0x01,0x00,0x02,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x21,0x30,0x40,0x00, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x21,0x20,0xC0,0x00, +0x13,0x00,0xC0,0x10, +0x48,0xEA,0xA5,0x24, +0x04,0x00,0x02,0x24, +0x09,0x00,0x03,0x24, +0x0C,0x00,0xC2,0xAC, +0x14,0x00,0xC3,0xAC, +0x08,0x00,0xC5,0x94, +0xA4,0x3B,0x03,0x8E, +0x02,0x80,0x02,0x3C, +0x25,0x28,0xA2,0x00, +0x30,0x09,0x00,0x0C, +0x20,0x00,0xA3,0xAC, +0xA8,0x3B,0x06,0x8E, +0xA4,0x3B,0x05,0x8E, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x80,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x74,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x02,0x00,0x82,0x90, +0x02,0x80,0x12,0x3C, +0x30,0x1F,0x51,0x26, +0xB0,0x1B,0x25,0x96, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x00,0x01,0xA3,0x30, +0x04,0x00,0x60,0x10, +0x18,0x00,0x04,0x26, +0x00,0x10,0xA2,0x30, +0x0B,0x00,0x40,0x10, +0x04,0x00,0xA2,0x30, +0x21,0x18,0x00,0x00, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xF5,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x55,0x50,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xED,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x88,0x58,0x53,0x24, +0x22,0x00,0x14,0x26, +0x21,0x20,0x80,0x02, +0x21,0x28,0x60,0x02, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xE4,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x28,0x00,0x04,0x26, +0x21,0x28,0x60,0x02, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xDE,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xE8,0xDF,0x84,0x24, +0xB0,0x1B,0x24,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x83,0x30, +0x01,0x00,0x62,0x30, +0x08,0x00,0x40,0x10, +0x00,0x20,0x62,0x30, +0x15,0x00,0x40,0x10, +0xFF,0xDE,0x82,0x30, +0xFE,0xFF,0x04,0x24, +0xB0,0x1B,0x22,0xA6, +0xD0,0x38,0x20,0xAE, +0x48,0x0E,0x00,0x0C, +0xB4,0x38,0x20,0xAE, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0x50,0x26, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x40,0xA0, +0x21,0x20,0x00,0x00, +0x21,0x28,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0xA1,0x3B,0x00,0xA2, +0x10,0x3E,0x00,0xAE, +0xEC,0x38,0x00,0xAE, +0x08,0x39,0x00,0xAE, +0xA3,0x51,0x00,0x0C, +0x50,0x3E,0x00,0xAE, +0xFA,0x48,0x00,0x08, +0x21,0x18,0x00,0x00, +0x76,0x0E,0x00,0x0C, +0x21,0x20,0x80,0x02, +0xBB,0xFF,0x40,0x14, +0xFF,0xFF,0x03,0x24, +0xB0,0x1B,0x22,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xFE,0x42,0x30, +0x2D,0x49,0x00,0x08, +0xB0,0x1B,0x22,0xA6, +0xD0,0xFF,0xBD,0x27, +0x20,0x00,0xB4,0xAF, +0x02,0x80,0x14,0x3C, +0x14,0x00,0xB1,0xAF, +0x28,0x00,0xBF,0xAF, +0x24,0x00,0xB5,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x91,0x26, +0xB0,0x1B,0x23,0x96, +0x00,0x00,0x00,0x00, +0x10,0x00,0x62,0x30, +0x3A,0x00,0x40,0x14, +0x00,0x01,0x62,0x30, +0x2E,0x00,0x40,0x10, +0x00,0x10,0x62,0x30, +0x29,0x00,0x40,0x14, +0x01,0x00,0x62,0x30, +0x1D,0x00,0x40,0x14, +0x04,0x00,0x62,0x30, +0x25,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x90,0x20,0x02, +0x2B,0x3D,0x55,0x24, +0x01,0x00,0x13,0x24, +0xF0,0x00,0x10,0x24, +0x65,0x49,0x00,0x08, +0x19,0x00,0x11,0x24, +0xFF,0xFF,0x31,0x26, +0x1C,0x00,0x20,0x06, +0x28,0x00,0x10,0x26, +0x21,0x18,0x12,0x02, +0xFA,0x1D,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF9,0xFF,0x53,0x14, +0x00,0x00,0x00,0x00, +0x0C,0x1E,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x33,0x00,0x40,0x10, +0x21,0x20,0x15,0x02, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0C,0x1E,0x60,0xAC, +0x00,0x60,0x82,0x40, +0x63,0x49,0x00,0x08, +0xFF,0xFF,0x31,0x26, +0xD4,0x1E,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x2F,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD4,0x1E,0x20,0xAE, +0x00,0x60,0x82,0x40, +0x53,0x1E,0x00,0x0C, +0x30,0x1F,0x90,0x26, +0xEC,0x38,0x02,0xAE, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xF8,0xDF,0x84,0x24, +0xB0,0x1B,0x22,0x96, +0xEC,0x38,0x20,0xAE, +0xFD,0xFF,0x04,0x24, +0xEF,0xDF,0x42,0x30, +0x48,0x0E,0x00,0x0C, +0xB0,0x1B,0x22,0xA6, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x8E,0x3E,0x42,0x92, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x24, +0x8E,0x3E,0x42,0xA2, +0x76,0x0E,0x00,0x0C, +0xFA,0x1D,0x60,0xA0, +0x63,0x49,0x00,0x08, +0xFF,0xFF,0x31,0x26, +0x2F,0x55,0x00,0x0C, +0x18,0xE0,0x84,0x24, +0xB0,0x1B,0x23,0x96, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0xFE,0xFE,0x63,0x30, +0xB0,0x1B,0x23,0xA6, +0x21,0x20,0x00,0x00, +0x00,0x00,0x40,0xA0, +0x21,0x28,0x00,0x00, +0xA1,0x3B,0x20,0xA2, +0x12,0x0D,0x00,0x0C, +0xC2,0x1E,0x20,0xA2, +0x02,0x80,0x04,0x3C, +0x76,0x0E,0x00,0x0C, +0x88,0x58,0x84,0x24, +0x83,0x49,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xA8,0xFF,0xBD,0x27, +0x48,0x00,0xB6,0xAF, +0x3C,0x00,0xB3,0xAF, +0x38,0x00,0xB2,0xAF, +0x30,0x00,0xB0,0xAF, +0x54,0x00,0xBF,0xAF, +0x50,0x00,0xBE,0xAF, +0x4C,0x00,0xB7,0xAF, +0x44,0x00,0xB5,0xAF, +0x40,0x00,0xB4,0xAF, +0x34,0x00,0xB1,0xAF, +0x02,0x00,0x82,0x90, +0x00,0x00,0x83,0x8C, +0x21,0xB0,0x00,0x00, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x18,0x00,0x12,0x26, +0x21,0x20,0x40,0x02, +0x55,0x50,0x00,0x0C, +0xFF,0x3F,0x73,0x30, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x0B,0x00,0x40,0x14, +0x02,0x80,0x15,0x3C, +0x30,0x1F,0xB1,0x26, +0xB0,0x1B,0x23,0x96, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x30, +0x05,0x00,0x40,0x10, +0x00,0x10,0x62,0x30, +0x03,0x00,0x40,0x14, +0x00,0x01,0x62,0x30, +0x0E,0x00,0x40,0x10, +0x20,0x00,0xB4,0x27, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x32,0x00,0x05,0x26, +0x21,0x20,0x80,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x20,0x00,0xA5,0x97, +0x00,0x00,0x00,0x00, +0xC2,0x00,0xA0,0x14, +0x02,0x80,0x04,0x3C, +0x21,0x20,0x80,0x02, +0x34,0x00,0x05,0x26, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x20,0x00,0xA2,0x97, +0x21,0x20,0x80,0x02, +0x30,0x00,0x05,0x26, +0xFF,0x3F,0x42,0x30, +0x02,0x00,0x06,0x24, +0x50,0x39,0x22,0xA6, +0x10,0x52,0x00,0x0C, +0x28,0x00,0xA2,0xAF, +0x20,0x00,0xA3,0x97, +0x21,0x40,0x20,0x02, +0x00,0x04,0x63,0x30, +0x02,0x00,0x60,0x14, +0x09,0x00,0x02,0x24, +0x14,0x00,0x02,0x24, +0x1E,0x00,0x5E,0x26, +0xE2,0xFF,0x74,0x26, +0x21,0x20,0xC0,0x03, +0x01,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x21,0x38,0x80,0x02, +0x55,0x1D,0x00,0x0C, +0x0C,0x3E,0x02,0xA1, +0xA8,0x00,0x40,0x10, +0x02,0x00,0x45,0x24, +0x24,0x00,0xA6,0x8F, +0x10,0x52,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x21,0x20,0xC0,0x03, +0x32,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x24,0x00,0xB7,0x8F, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x08,0x00,0x40,0x10, +0x10,0x00,0xA4,0x27, +0x24,0x00,0xA6,0x8F, +0x21,0x20,0x97,0x00, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x24,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0xB8,0xE3,0x02, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x44,0x90, +0x02,0x00,0x03,0x24, +0xE5,0x00,0x83,0x10, +0x21,0x20,0xC0,0x03, +0x30,0x1F,0xA4,0x26, +0x10,0x3E,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x22,0x00,0x40,0x10, +0x30,0x1F,0xB1,0x26, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x1D,0x00,0x60,0x14, +0x23,0x10,0xD2,0x03, +0x2B,0x10,0x53,0x00, +0x1A,0x00,0x40,0x10, +0x21,0x80,0xC0,0x03, +0x02,0x80,0x11,0x3C, +0x21,0x20,0x00,0x02, +0xDD,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x21,0x80,0x40,0x00, +0x02,0x00,0x44,0x24, +0xC8,0xDD,0x25,0x26, +0x0E,0x01,0x40,0x10, +0x06,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x01,0x40,0x10, +0x00,0x00,0x00,0x00, +0x24,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x18,0x02,0x02, +0x02,0x00,0x70,0x24, +0x23,0x20,0x12,0x02, +0x03,0x01,0x40,0x10, +0x2B,0x20,0x93,0x00, +0xEB,0xFF,0x80,0x14, +0x21,0x20,0x00,0x02, +0x30,0x1F,0xB1,0x26, +0x50,0x3E,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x6A,0x00,0x40,0x14, +0x24,0x00,0xA6,0x27, +0x53,0x1E,0x00,0x0C, +0x30,0x1F,0xB2,0x26, +0x25,0xB0,0x14,0x3C, +0xB0,0x1B,0x45,0x96, +0x02,0x00,0x03,0x24, +0x4C,0x00,0x84,0x36, +0x00,0x00,0x83,0xA0, +0xEC,0x38,0x42,0xAE, +0x02,0x00,0x02,0x3C, +0x00,0x01,0xA5,0x34, +0x20,0xBF,0x42,0x34, +0x08,0x39,0x42,0xAE, +0x21,0x0E,0x00,0x0C, +0xB0,0x1B,0x45,0xA6, +0x10,0x00,0xA4,0x27, +0x7D,0x50,0x00,0x0C, +0x21,0x28,0xE0,0x02, +0x0F,0x00,0x50,0x30, +0x10,0x00,0xA4,0x27, +0x96,0x50,0x00,0x0C, +0x21,0x28,0xE0,0x02, +0x40,0x02,0x13,0x36, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x30,0x40,0x00, +0x21,0x28,0x60,0x02, +0x2F,0x55,0x00,0x0C, +0x6C,0xE0,0x84,0x24, +0x21,0x20,0x60,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x21,0x28,0xE0,0x02, +0xC2,0x50,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x21,0x88,0x40,0x00, +0x50,0x3E,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x16,0x00,0x40,0x10, +0x50,0x00,0x13,0x36, +0x5B,0x3E,0x42,0x92, +0x5C,0x3E,0x43,0x92, +0x0A,0x3E,0x44,0x92, +0x00,0x13,0x02,0x00, +0x00,0x1D,0x03,0x00, +0x25,0x10,0x43,0x00, +0x04,0x00,0x03,0x24, +0xA0,0x00,0x83,0x10, +0x25,0x88,0x22,0x02, +0x54,0x3E,0x43,0x8E, +0x00,0x00,0x00,0x00, +0x07,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x58,0x3E,0x42,0x96, +0x00,0x00,0x00,0x00, +0x20,0x00,0x42,0x30, +0xA1,0x00,0x40,0x14, +0x00,0x10,0x02,0x3C, +0x01,0x00,0x02,0x24, +0x98,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x80,0xE0,0x84,0x24, +0x21,0x28,0x60,0x02, +0x21,0x38,0xC0,0x02, +0x2F,0x55,0x00,0x0C, +0x21,0x30,0x20,0x02, +0x21,0x20,0x60,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x30,0x1F,0xA2,0x26, +0xB0,0x1B,0x43,0x94, +0x0A,0x3E,0x44,0x90, +0xB4,0x38,0x40,0xAC, +0xFF,0xDF,0x63,0x30, +0xB0,0x1B,0x43,0xA4, +0x04,0x00,0x03,0x24, +0xD0,0x38,0x40,0xAC, +0x94,0x3E,0x40,0xAC, +0x06,0x00,0x83,0x10, +0x98,0x3E,0x40,0xAC, +0x28,0x00,0xA4,0x8F, +0x48,0x0E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE2,0x49,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x06,0x3C, +0x64,0x03,0xC6,0x34, +0x30,0x1F,0xA4,0x8E, +0x00,0x00,0xC5,0x90, +0x0F,0xFF,0x02,0x24, +0xFD,0xFF,0x03,0x24, +0x24,0x20,0x82,0x00, +0x24,0x28,0xA3,0x00, +0x30,0x1F,0xA4,0xAE, +0x00,0x00,0xC5,0xA0, +0x28,0x00,0xA4,0x8F, +0x48,0x0E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE2,0x49,0x00,0x08, +0x00,0x00,0x00,0x00, +0x2F,0x55,0x00,0x0C, +0x50,0xE0,0x84,0x24, +0xFF,0xFF,0x02,0x24, +0x99,0x4A,0x00,0x08, +0x28,0x00,0xA2,0xAF, +0x21,0x20,0xC0,0x03, +0x2D,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x91,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x24,0x00,0xAB,0x8F, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x60,0x19, +0x21,0x40,0x00,0x00, +0x02,0x00,0x49,0x24, +0x21,0x50,0x20,0x02, +0x02,0x00,0x0C,0x24, +0xD5,0x4A,0x00,0x08, +0x21,0x68,0x20,0x01, +0x58,0x3E,0x82,0x90, +0x00,0x00,0x23,0x91, +0x00,0x00,0x00,0x00, +0x24,0x10,0x43,0x00, +0x58,0x3E,0x82,0xA0, +0x01,0x00,0x08,0x25, +0x2A,0x10,0x0B,0x01, +0x11,0x00,0x40,0x10, +0x01,0x00,0x29,0x25, +0xF6,0xFF,0x0C,0x15, +0x21,0x20,0x0A,0x01, +0x5A,0x3E,0x43,0x91, +0x00,0x00,0x25,0x91, +0x02,0x00,0xA2,0x91, +0x1C,0x00,0x64,0x30, +0x1C,0x00,0xA5,0x30, +0x03,0x00,0x42,0x30, +0x03,0x00,0x63,0x30, +0x2A,0x30,0x43,0x00, +0x2A,0x38,0xA4,0x00, +0x0A,0x10,0x66,0x00, +0x0A,0x20,0xA7,0x00, +0x25,0x10,0x44,0x00, +0xD1,0x4A,0x00,0x08, +0x5A,0x3E,0x42,0xA1, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x43,0x90, +0x02,0x80,0x02,0x3C, +0x3C,0xE3,0x47,0x24, +0x10,0x00,0x65,0x30, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x4C,0xE3,0x66,0x24, +0x30,0x1F,0x44,0x24, +0xF8,0x4A,0x00,0x08, +0x21,0x40,0x00,0x00, +0x00,0x00,0x43,0x90, +0x5B,0x3E,0x82,0x90, +0x01,0x00,0x08,0x25, +0x24,0x10,0x43,0x00, +0x5B,0x3E,0x82,0xA0, +0x10,0x00,0x02,0x29, +0x07,0x00,0x40,0x10, +0x01,0x00,0x84,0x24, +0x21,0x10,0x07,0x01, +0xF6,0xFF,0xA0,0x14, +0x21,0x18,0x06,0x01, +0x00,0x00,0x63,0x90, +0xF1,0x4A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x20,0xC0,0x03, +0x21,0x38,0x80,0x02, +0x3D,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x24,0x00,0xA6,0x27, +0x48,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x24,0x00,0xA6,0x8F, +0x02,0x80,0x04,0x3C, +0xA8,0x5D,0x84,0x24, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x90,0x0D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x54,0x4A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x2A,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x30,0x00,0x40,0x10, +0x30,0x1F,0xA5,0x26, +0x02,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x2B,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x44,0x90, +0x01,0x00,0x03,0x24, +0x3E,0x00,0x83,0x10, +0x30,0x1F,0xA2,0x26, +0x10,0x23,0x43,0x8C, +0xFF,0xEF,0x04,0x24, +0x00,0x08,0x63,0x34, +0x24,0x18,0x64,0x00, +0x2A,0x4A,0x00,0x08, +0x10,0x23,0x43,0xAC, +0xF6,0x01,0x82,0x36, +0x00,0x00,0x40,0xA4, +0x91,0x4A,0x00,0x08, +0x02,0x80,0x04,0x3C, +0x58,0x3E,0x42,0x96, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0x66,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x00,0x10,0x02,0x3C, +0x25,0x88,0x22,0x02, +0x0F,0x00,0x08,0x24, +0x01,0x00,0x03,0x24, +0x0C,0x00,0x02,0x25, +0x04,0x10,0x43,0x00, +0x24,0x10,0x51,0x00, +0x16,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x08,0x25, +0xFA,0xFF,0x01,0x05, +0x0C,0x00,0x02,0x25, +0x00,0x12,0x16,0x00, +0x00,0x1B,0x16,0x00, +0x25,0x18,0x62,0x00, +0x00,0x21,0x16,0x00, +0x25,0x18,0x64,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x18,0x76,0x00, +0xF6,0x01,0x42,0x34, +0x00,0x00,0x43,0xA4, +0x91,0x4A,0x00,0x08, +0x02,0x80,0x04,0x3C, +0x10,0x23,0xA2,0x8C, +0xFF,0xF7,0x03,0x24, +0xFF,0xEF,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x2A,0x4A,0x00,0x08, +0x10,0x23,0xA2,0xAC, +0x38,0x4B,0x00,0x08, +0xFF,0x00,0x16,0x31, +0x30,0x1F,0xA2,0x26, +0x54,0x4A,0x00,0x08, +0x50,0x3E,0x40,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x4F,0x4A,0x00,0x08, +0x10,0x3E,0x40,0xAC, +0x54,0x4A,0x00,0x08, +0x50,0x3E,0x20,0xAE, +0x21,0x20,0x00,0x02, +0x78,0x0F,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x50,0x4A,0x00,0x08, +0x30,0x1F,0xB1,0x26, +0x10,0x23,0x43,0x8C, +0xFF,0xF7,0x04,0x24, +0x24,0x18,0x64,0x00, +0x00,0x10,0x63,0x34, +0x2A,0x4A,0x00,0x08, +0x10,0x23,0x43,0xAC, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x02,0x00,0x82,0x90, +0x02,0x80,0x03,0x3C, +0xE0,0x3A,0x65,0x94, +0x0F,0x00,0x42,0x30, +0x00,0x00,0x83,0x8C, +0xC0,0x10,0x02,0x00, +0x21,0x20,0x44,0x00, +0x00,0x10,0xA8,0x30, +0x02,0x80,0x02,0x3C, +0x00,0x08,0xA5,0x30, +0x84,0x58,0x51,0x24, +0xFF,0x3F,0x63,0x30, +0x06,0x00,0xA0,0x10, +0x18,0x00,0x90,0x24, +0xE8,0xFF,0x67,0x24, +0x30,0x00,0x84,0x24, +0x21,0x28,0x00,0x00, +0x07,0x00,0x00,0x11, +0x10,0x00,0xA6,0x27, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x55,0x1D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF7,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x44,0x24, +0x10,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x06,0x00,0x40,0x10, +0x10,0x00,0x25,0x26, +0x0C,0x00,0x26,0x8E, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xED,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x42,0x50,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x01,0x10,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x77,0x4B,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xE5,0x48,0x00,0x0C, +0xFE,0xFF,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xE5,0x48,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x01,0x80,0x02,0x3C, +0xB0,0x03,0x65,0x34, +0x8C,0x2E,0x42,0x24, +0x18,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x00,0x00,0xA4,0xAC, +0x00,0x00,0x83,0x8C, +0x21,0x10,0x00,0x00, +0xFF,0x3F,0x63,0x30, +0x00,0x00,0xA3,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x30,0x1F,0x50,0x24, +0x70,0x3D,0x03,0x8E, +0xFE,0xFF,0x04,0x24, +0x01,0x00,0x63,0x24, +0x05,0x00,0x62,0x2C, +0x12,0x00,0x40,0x10, +0x70,0x3D,0x03,0xAE, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x05,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xA5,0x12,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xC8,0x00,0x03,0x24, +0xD0,0x38,0x03,0xAE, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xDF,0x42,0x30, +0x48,0x0E,0x00,0x0C, +0xB0,0x1B,0x02,0xA6, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x2C,0x00,0xBF,0xAF, +0x02,0x00,0x82,0x90, +0x02,0x80,0x14,0x3C, +0x30,0x1F,0x92,0x26, +0xB0,0x1B,0x43,0x96, +0x00,0x00,0x85,0x8C, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x01,0x00,0x63,0x30, +0xFF,0x3F,0xB3,0x30, +0x18,0x00,0x11,0x26, +0x0A,0x00,0x60,0x14, +0x21,0x20,0x00,0x00, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x55,0x50,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0xB0,0x1B,0x42,0x96, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x30, +0xEA,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x18,0x00,0x03,0x96, +0x04,0x00,0x04,0x24, +0x21,0x10,0x80,0x00, +0x00,0x40,0x63,0x30, +0x0A,0x10,0x03,0x00, +0x21,0x10,0x22,0x02, +0x1C,0x00,0x43,0x94, +0x1A,0x00,0x45,0x94, +0x2F,0x00,0x60,0x14, +0x02,0x00,0x02,0x24, +0x14,0x00,0xA2,0x10, +0x01,0x00,0x02,0x24, +0x0E,0x00,0xA4,0x14, +0x02,0x80,0x04,0x3C, +0x78,0x3D,0x43,0x8E, +0x00,0x00,0x00,0x00, +0x06,0x00,0x62,0x10, +0x30,0x1F,0x83,0x26, +0xB0,0x1B,0x62,0x94, +0xFF,0xFF,0x04,0x24, +0xFF,0xDF,0x42,0x30, +0xE9,0x4B,0x00,0x08, +0xB0,0x1B,0x62,0xA4, +0x84,0x14,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE9,0x4B,0x00,0x08, +0x21,0x20,0x00,0x00, +0x2F,0x55,0x00,0x0C, +0xEC,0xE1,0x84,0x24, +0x12,0x4C,0x00,0x08, +0x30,0x1F,0x83,0x26, +0x78,0x3D,0x43,0x8E, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x62,0x14, +0xE2,0xFF,0x67,0x26, +0x36,0x00,0x04,0x26, +0x10,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x10,0x00,0xA6,0x27, +0x16,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0xA6,0x8F, +0x02,0x80,0x04,0x3C, +0xB8,0x5C,0x84,0x24, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0xB0,0x1B,0x43,0x96, +0x21,0x20,0x00,0x00, +0x03,0x00,0x02,0x24, +0xDF,0xFF,0x63,0x30, +0x40,0x00,0x63,0x34, +0xB0,0x1B,0x43,0xA6, +0xBC,0x15,0x00,0x0C, +0x74,0x3D,0x42,0xAE, +0xE9,0x4B,0x00,0x08, +0x21,0x20,0x00,0x00, +0x02,0x80,0x04,0x3C, +0xBC,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x28,0x60,0x00, +0x12,0x4C,0x00,0x08, +0x30,0x1F,0x83,0x26, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xD8,0xE1,0x84,0x24, +0x12,0x4C,0x00,0x08, +0x30,0x1F,0x83,0x26, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x30,0x1F,0x50,0x24, +0x6C,0x3D,0x03,0x8E, +0xFF,0xFF,0x04,0x24, +0x01,0x00,0x63,0x24, +0x05,0x00,0x62,0x2C, +0x16,0x00,0x40,0x10, +0x6C,0x3D,0x03,0xAE, +0xB0,0x1B,0x03,0x96, +0xBF,0xFF,0x02,0x24, +0x21,0x20,0x00,0x00, +0x24,0x10,0x62,0x00, +0x80,0x00,0x63,0x30, +0x05,0x00,0x60,0x10, +0x20,0x00,0x45,0x34, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x01,0x00,0x02,0x24, +0x74,0x3D,0x02,0xAE, +0xBC,0x15,0x00,0x0C, +0xB0,0x1B,0x05,0xA6, +0xC8,0x00,0x03,0x24, +0xB4,0x38,0x03,0xAE, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xDF,0x42,0x30, +0x48,0x0E,0x00,0x0C, +0xB0,0x1B,0x02,0xA6, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x21,0x90,0x80,0x00, +0x00,0x01,0x04,0x24, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x21,0x98,0xA0,0x00, +0x28,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x21,0x88,0x40,0x00, +0x20,0xE2,0x84,0x24, +0x37,0x00,0x40,0x10, +0x04,0xEB,0xA5,0x24, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x40,0x02, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x04,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x05,0x3C, +0x03,0xFF,0x63,0x30, +0xC0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0xA5,0x24, +0x0C,0x00,0x22,0xAE, +0xF8,0x1D,0xA3,0x94, +0x20,0x00,0x07,0x26, +0x38,0x00,0x04,0x26, +0xFF,0x0F,0x62,0x30, +0x00,0x11,0x02,0x00, +0x02,0x32,0x02,0x00, +0x01,0x00,0x63,0x24, +0xF8,0x1D,0xA3,0xA4, +0x17,0x00,0xE6,0xA0, +0x16,0x00,0xE2,0xA0, +0x10,0x00,0xA6,0x27, +0x0C,0x00,0x27,0x26, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x10,0x00,0xB3,0xA7, +0x21,0x20,0x20,0x02, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x14,0xE2,0x84,0x24, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x21,0x90,0x80,0x00, +0x00,0x01,0x04,0x24, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x21,0x98,0xA0,0x00, +0x28,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x21,0x88,0x40,0x00, +0x3C,0xE2,0x84,0x24, +0x37,0x00,0x40,0x10, +0x14,0xEB,0xA5,0x24, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x40,0x02, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x04,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x05,0x3C, +0x03,0xFF,0x63,0x30, +0xA0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0xA5,0x24, +0x0C,0x00,0x22,0xAE, +0xF8,0x1D,0xA3,0x94, +0x20,0x00,0x07,0x26, +0x38,0x00,0x04,0x26, +0xFF,0x0F,0x62,0x30, +0x00,0x11,0x02,0x00, +0x02,0x32,0x02,0x00, +0x01,0x00,0x63,0x24, +0xF8,0x1D,0xA3,0xA4, +0x17,0x00,0xE6,0xA0, +0x16,0x00,0xE2,0xA0, +0x10,0x00,0xA6,0x27, +0x0C,0x00,0x27,0x26, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x10,0x00,0xB3,0xA7, +0x21,0x20,0x20,0x02, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x30,0xE2,0x84,0x24, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x2C,0x00,0xB1,0xAF, +0xFF,0xFF,0x05,0x24, +0x21,0x88,0x80,0x00, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA4,0x27, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB2,0xAF, +0x08,0x52,0x00,0x0C, +0x28,0x00,0xB0,0xAF, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x00,0x00, +0x25,0x80,0x02,0x02, +0x21,0x20,0x00,0x02, +0x08,0x52,0x00,0x0C, +0x10,0x00,0x06,0x24, +0x20,0x00,0x02,0x96, +0x24,0x00,0x04,0x26, +0x10,0x00,0xA5,0x27, +0x03,0xFF,0x42,0x30, +0xC8,0x00,0x42,0x34, +0x20,0x00,0x02,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x25,0xB0,0x03,0x3C, +0x50,0x00,0x62,0x34, +0x00,0x00,0x44,0x8C, +0x54,0x00,0x65,0x34, +0x58,0x00,0x66,0x34, +0x18,0x00,0xA4,0xAF, +0x00,0x00,0xA2,0x8C, +0x5C,0x00,0x63,0x34, +0x2A,0x00,0x04,0x26, +0x1C,0x00,0xA2,0xAF, +0x00,0x00,0xC7,0x8C, +0x18,0x00,0xA5,0x27, +0x06,0x00,0x06,0x24, +0x20,0x00,0xA7,0xAF, +0x00,0x00,0x62,0x8C, +0x1A,0x00,0x12,0x24, +0x10,0x52,0x00,0x0C, +0x24,0x00,0xA2,0xAF, +0x30,0x00,0x04,0x26, +0x20,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x13,0x00,0x03,0x24, +0x14,0x00,0x23,0xAE, +0x0C,0x00,0x32,0xAE, +0x08,0x00,0x05,0x8E, +0x04,0x00,0x04,0x8E, +0xFF,0xDF,0x02,0x3C, +0x14,0x00,0x06,0x8E, +0xFF,0xFF,0x42,0x34, +0x10,0x00,0x07,0x8E, +0xFF,0xE0,0x03,0x24, +0x24,0x28,0xA2,0x00, +0x00,0x40,0x02,0x3C, +0x24,0x20,0x83,0x00, +0x25,0x28,0xA2,0x00, +0xFF,0x81,0x03,0x24, +0xFE,0xFF,0x02,0x3C, +0x24,0x30,0xC3,0x00, +0xFF,0xFF,0x42,0x34, +0x00,0x12,0x84,0x34, +0x00,0x80,0x03,0x3C, +0x24,0x20,0x82,0x00, +0x25,0x38,0xE3,0x00, +0x00,0x26,0xC6,0x34, +0x80,0x00,0xA5,0x34, +0x20,0x00,0x02,0x24, +0x00,0x00,0x12,0xA6, +0x10,0x00,0x07,0xAE, +0x02,0x00,0x02,0xA2, +0x14,0x00,0x06,0xAE, +0x04,0x00,0x04,0xAE, +0x08,0x00,0x05,0xAE, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x1C,0x00,0xB1,0xAF, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x11,0x3C, +0x18,0x03,0x23,0x36, +0x80,0x35,0x42,0x24, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x21,0xA0,0x80,0x00, +0x48,0x00,0xB2,0x93, +0xFF,0x00,0xE4,0x30, +0x00,0x00,0x62,0xAC, +0x24,0x00,0xB3,0xAF, +0x18,0x00,0xB0,0xAF, +0x30,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0xFF,0x00,0xB3,0x30, +0x0D,0x24,0x00,0x0C, +0xFF,0x00,0xD0,0x30, +0x66,0x00,0x40,0x10, +0x10,0x00,0xA2,0xAF, +0x08,0x00,0x44,0x8C, +0xB0,0x03,0x22,0x36, +0x00,0x00,0x44,0xAC, +0x10,0x00,0xA3,0x8F, +0x02,0x80,0x02,0x3C, +0x08,0x00,0x64,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x82,0x00, +0x41,0x00,0x40,0x16, +0x20,0x00,0x24,0x26, +0x48,0x00,0x02,0x24, +0x43,0x00,0x02,0x12, +0x20,0x00,0x30,0xA6, +0x04,0x00,0x02,0x24, +0x47,0x00,0x62,0x16, +0x21,0x28,0x80,0x02, +0xA4,0x00,0x02,0x24, +0x61,0x00,0x02,0x12, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA2,0x8F, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x10,0x36, +0x0C,0x00,0x55,0xAC, +0x10,0x00,0xA2,0x8F, +0x12,0x00,0x03,0x24, +0x21,0x28,0x00,0x00, +0x14,0x00,0x43,0xAC, +0x00,0x00,0x15,0xAE, +0x10,0x00,0xA2,0x8F, +0x08,0x00,0x06,0x24, +0x08,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0xAE, +0x10,0x00,0xA2,0x8F, +0x02,0x80,0x03,0x3C, +0x08,0x00,0x44,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x83,0x00, +0x08,0x52,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x14,0x00,0x25,0x8E, +0x08,0x00,0x24,0x8E, +0xFF,0xDF,0x02,0x3C, +0xFF,0x81,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x24,0x28,0xA3,0x00, +0x24,0x20,0x82,0x00, +0x00,0x40,0x03,0x3C, +0x25,0x20,0x83,0x00, +0x20,0x00,0x02,0x24, +0x00,0x24,0xA5,0x34, +0x00,0x00,0x35,0xA6, +0x02,0x00,0x22,0xA2, +0x08,0x00,0x24,0xAE, +0x14,0x00,0x25,0xAE, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA3,0x8F, +0x74,0x57,0x42,0x24, +0x04,0x00,0x44,0x8C, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x10,0x00,0xA2,0x27, +0x00,0x00,0x83,0xAC, +0x04,0x00,0x64,0xAC, +0x30,0x00,0xBF,0x8F, +0x00,0x00,0x02,0xAE, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x00,0x10,0x02,0x36, +0x20,0x00,0x22,0xA6, +0x48,0x00,0x02,0x24, +0xC0,0xFF,0x02,0x16, +0x04,0x00,0x02,0x24, +0x20,0x00,0x22,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x34, +0x20,0x00,0x22,0xA6, +0x04,0x00,0x02,0x24, +0xBB,0xFF,0x62,0x12, +0x21,0x28,0x80,0x02, +0x24,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x24,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x88,0x4D,0x00,0x08, +0x18,0x00,0x15,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x4C,0xE2,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x24,0xEB,0xA5,0x24, +0x30,0x00,0xBF,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x80,0x58,0x43,0x94, +0x02,0x80,0x05,0x3C, +0x88,0x58,0xA5,0x24, +0x00,0xC0,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x02,0x12,0x03,0x00, +0x02,0x00,0x83,0xA0, +0x03,0x00,0x82,0xA0, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x24,0x00,0x24,0x26, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x24,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x88,0x4D,0x00,0x08, +0x18,0x00,0x15,0x24, +0xB0,0xFF,0xBD,0x27, +0x3C,0x00,0xB5,0xAF, +0x38,0x00,0xB4,0xAF, +0xFF,0xFF,0xF5,0x30, +0x25,0xB0,0x14,0x3C, +0x01,0x80,0x02,0x3C, +0x2C,0x00,0xB1,0xAF, +0x18,0x03,0x83,0x36, +0xE8,0x37,0x42,0x24, +0x20,0x00,0xB1,0x26, +0x44,0x00,0xB7,0xAF, +0x34,0x00,0xB3,0xAF, +0x21,0xB8,0x80,0x00, +0x60,0x00,0xB3,0x93, +0x21,0x20,0x20,0x02, +0x00,0x00,0x62,0xAC, +0x40,0x00,0xB6,0xAF, +0x30,0x00,0xB2,0xAF, +0x48,0x00,0xBF,0xAF, +0x28,0x00,0xB0,0xAF, +0xFF,0x00,0xB6,0x30, +0x25,0x24,0x00,0x0C, +0xFF,0x00,0xD2,0x30, +0x11,0x00,0x40,0x14, +0x20,0x00,0xA2,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x58,0xE2,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x30,0xEB,0xA5,0x24, +0x48,0x00,0xBF,0x8F, +0x44,0x00,0xB7,0x8F, +0x40,0x00,0xB6,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x50,0x00,0xBD,0x27, +0x08,0x00,0x43,0x8C, +0xB0,0x03,0x82,0x36, +0x02,0x80,0x10,0x3C, +0x00,0x00,0x43,0xAC, +0x20,0x00,0xA2,0x8F, +0x21,0x30,0x20,0x02, +0x21,0x28,0x00,0x00, +0x08,0x00,0x44,0x94, +0xFF,0x51,0x00,0x0C, +0x25,0x20,0x90,0x00, +0x20,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x50,0x00, +0x51,0x00,0x60,0x16, +0x20,0x00,0x30,0x26, +0x20,0x00,0x32,0xA6, +0x48,0x00,0x02,0x24, +0x6C,0x00,0x42,0x12, +0x50,0x00,0x82,0x36, +0x04,0x00,0x02,0x24, +0x4D,0x00,0xC2,0x16, +0x21,0x28,0xE0,0x02, +0xA4,0x00,0x02,0x24, +0x7E,0x00,0x42,0x12, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xA2,0x8F, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x10,0x36, +0x0C,0x00,0x55,0xAC, +0x20,0x00,0xA2,0x8F, +0x12,0x00,0x03,0x24, +0x21,0x28,0x00,0x00, +0x14,0x00,0x43,0xAC, +0x00,0x00,0x15,0xAE, +0x20,0x00,0xA2,0x8F, +0x08,0x00,0x06,0x24, +0x08,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0xAE, +0x20,0x00,0xA2,0x8F, +0x02,0x80,0x03,0x3C, +0x08,0x00,0x44,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x83,0x00, +0x08,0x52,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x04,0x00,0x25,0x8E, +0x08,0x00,0x26,0x8E, +0x14,0x00,0x27,0x8E, +0x10,0x00,0x24,0x8E, +0xFF,0xE0,0x03,0x24, +0xFF,0xDF,0x02,0x3C, +0x24,0x28,0xA3,0x00, +0xFF,0xFF,0x42,0x34, +0xFF,0x81,0x03,0x24, +0x24,0x38,0xE3,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x80,0x03,0x3C, +0x00,0x40,0x02,0x3C, +0x25,0x30,0xC2,0x00, +0x25,0x20,0x83,0x00, +0x00,0x12,0xA5,0x34, +0x20,0x00,0x02,0x24, +0x10,0x00,0x24,0xAE, +0x00,0x00,0x35,0xA6, +0x02,0x00,0x22,0xA2, +0x04,0x00,0x25,0xAE, +0x14,0x00,0x27,0xAE, +0x08,0x00,0x26,0xAE, +0x00,0x60,0x05,0x40, +0x01,0x00,0xA1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xA3,0x8F, +0x74,0x57,0x42,0x24, +0x04,0x00,0x44,0x8C, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x20,0x00,0xA2,0x27, +0x00,0x00,0x83,0xAC, +0x04,0x00,0x64,0xAC, +0x00,0x00,0x02,0xAE, +0x00,0x60,0x85,0x40, +0x48,0x00,0xBF,0x8F, +0x44,0x00,0xB7,0x8F, +0x40,0x00,0xB6,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x50,0x00,0xBD,0x27, +0x00,0x10,0x42,0x36, +0x35,0x4E,0x00,0x08, +0x20,0x00,0x22,0xA6, +0x24,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x24,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xF8,0x1D,0xA6,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0xC2,0x24, +0x00,0x21,0x06,0x00, +0xFF,0xFF,0x46,0x30, +0xFF,0xFF,0x84,0x30, +0x00,0x10,0xC2,0x2C, +0x0A,0x30,0x02,0x00, +0x02,0x1A,0x04,0x00, +0x17,0x00,0x03,0xA2, +0x16,0x00,0x04,0xA2, +0x3E,0x4E,0x00,0x08, +0xF8,0x1D,0xA6,0xA4, +0x00,0x00,0x43,0x8C, +0x54,0x00,0x84,0x36, +0x58,0x00,0x85,0x36, +0x10,0x00,0xA3,0xAF, +0x00,0x00,0x82,0x8C, +0x5C,0x00,0x87,0x36, +0x2A,0x00,0x24,0x26, +0x14,0x00,0xA2,0xAF, +0x00,0x00,0xA3,0x8C, +0x06,0x00,0x06,0x24, +0x10,0x00,0xA5,0x27, +0x18,0x00,0xA3,0xAF, +0x00,0x00,0xE2,0x8C, +0x10,0x52,0x00,0x0C, +0x1C,0x00,0xA2,0xAF, +0x30,0x00,0x24,0x26, +0x18,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x23,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x63,0x34, +0x38,0x4E,0x00,0x08, +0x20,0x00,0x23,0xA6, +0x80,0x58,0x43,0x94, +0x02,0x80,0x05,0x3C, +0x24,0x00,0x24,0x26, +0x00,0xC0,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x02,0x12,0x03,0x00, +0x88,0x58,0xA5,0x24, +0x03,0x00,0x02,0xA2, +0x02,0x00,0x03,0xA2, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x24,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x3E,0x4E,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0xFF,0x00,0x90,0x30, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x00,0x02, +0x1C,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x64,0xE2,0x84,0x24, +0x02,0x80,0x04,0x3C, +0x88,0x58,0x84,0x24, +0x08,0x00,0x05,0x24, +0x48,0x00,0x06,0x24, +0x18,0x00,0x07,0x24, +0xFA,0x4D,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x01,0x00,0x02,0x24, +0x21,0x28,0x00,0x00, +0x90,0x00,0x06,0x24, +0x21,0x38,0x00,0x00, +0x18,0x00,0xBF,0xAF, +0x60,0x4D,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xB0,0xAF, +0xFF,0xFF,0x05,0x24, +0xFF,0x00,0x90,0x30, +0x02,0x00,0x06,0x24, +0x24,0x00,0xBF,0xAF, +0x08,0x52,0x00,0x0C, +0x18,0x00,0xA4,0x27, +0x18,0x00,0xA4,0x27, +0x08,0x00,0x05,0x24, +0xC8,0x00,0x06,0x24, +0x21,0x38,0x00,0x00, +0x60,0x4D,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x05,0x3C, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB0,0xAF, +0x30,0x1F,0xA5,0x24, +0x50,0x39,0xA2,0x94, +0x01,0x00,0x03,0x24, +0xFF,0x00,0x90,0x30, +0x00,0xC0,0x42,0x24, +0xFF,0xFF,0x44,0x30, +0xC2,0x34,0x00,0x0C, +0x2A,0x1C,0xA3,0xA0, +0x02,0x80,0x04,0x3C, +0x88,0x58,0x84,0x24, +0x04,0x00,0x05,0x24, +0xA4,0x00,0x06,0x24, +0x10,0x00,0x07,0x24, +0xFA,0x4D,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x08,0x00,0x82,0x24, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x17,0x4F,0x00,0x0C, +0x74,0x00,0x84,0x24, +0x21,0x28,0x40,0x00, +0x10,0x00,0xA4,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA2,0x97, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x17,0x4F,0x00,0x0C, +0x10,0x00,0xA5,0xA7, +0x21,0x20,0x40,0x00, +0x10,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x0A,0x00,0x82,0x24, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x32,0x4F,0x00,0x0C, +0x74,0x00,0x84,0x24, +0x21,0x28,0x40,0x00, +0x10,0x00,0xA4,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA2,0x97, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x00,0x00,0x05,0xA2, +0x01,0x00,0x06,0xA2, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x88,0xC0,0x00, +0x02,0x00,0x84,0x24, +0x30,0x00,0xB2,0x8F, +0x0D,0x00,0xC0,0x14, +0x21,0x28,0xE0,0x00, +0x00,0x00,0x43,0x8E, +0x21,0x10,0x11,0x02, +0x1C,0x00,0xBF,0x8F, +0x21,0x18,0x71,0x00, +0x02,0x00,0x63,0x24, +0x00,0x00,0x43,0xAE, +0x14,0x00,0xB1,0x8F, +0x18,0x00,0xB2,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x00,0x42,0x24, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x10,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0x8E, +0x21,0x10,0x11,0x02, +0x1C,0x00,0xBF,0x8F, +0x21,0x18,0x71,0x00, +0x02,0x00,0x63,0x24, +0x00,0x00,0x43,0xAE, +0x14,0x00,0xB1,0x8F, +0x18,0x00,0xB2,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x00,0x42,0x24, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0xA0,0x00, +0x18,0x00,0xB2,0xAF, +0x21,0x28,0xC0,0x00, +0x21,0x90,0xE0,0x00, +0x21,0x30,0x00,0x02, +0x1C,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x52,0x00,0x0C, +0x21,0x88,0x80,0x00, +0x00,0x00,0x43,0x8E, +0x21,0x10,0x30,0x02, +0x1C,0x00,0xBF,0x8F, +0x21,0x18,0x70,0x00, +0x00,0x00,0x43,0xAE, +0x14,0x00,0xB1,0x8F, +0x18,0x00,0xB2,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x7F,0x00,0x84,0x30, +0x6D,0x00,0x82,0x2C, +0x0A,0x00,0x40,0x10, +0x21,0x28,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0x58,0xEB,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x21,0x28,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x0B,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x0A,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x09,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x08,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x07,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x06,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x03,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x05,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x04,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x02,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x01,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x7F,0x00,0x84,0x30, +0x0C,0x00,0x82,0x2C, +0x0A,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0x0C,0xED,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x6C,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x60,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x48,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x30,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x24,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x18,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x12,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x0C,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x16,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x0B,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x04,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xC8,0xFF,0xBD,0x27, +0x24,0x00,0xB5,0xAF, +0x02,0x80,0x15,0x3C, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x30,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0xB8,0x80,0x00, +0x21,0xA0,0x00,0x00, +0x21,0x98,0x00,0x00, +0x30,0x1F,0xB6,0x26, +0x30,0x1F,0xA2,0x26, +0x21,0x10,0x62,0x02, +0xFB,0x1B,0x51,0x90, +0xFE,0x00,0x03,0x24, +0x1E,0x00,0x23,0x12, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x22,0x12, +0x21,0x10,0x80,0x02, +0xAD,0x4F,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x88,0x40,0x00, +0x21,0x80,0x00,0x00, +0x21,0x90,0xC0,0x02, +0x21,0x10,0x12,0x02, +0xEE,0x1B,0x44,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x82,0x24, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x2C, +0x05,0x00,0x40,0x14, +0x01,0x00,0x10,0x26, +0xAD,0x4F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x51,0x10, +0x01,0x00,0x03,0x24, +0x0D,0x00,0x02,0x2A, +0xF3,0xFF,0x40,0x14, +0x21,0x10,0x12,0x02, +0x21,0x18,0x00,0x00, +0x01,0x00,0x02,0x24, +0x14,0x00,0x62,0x10, +0xFF,0x00,0x22,0x32, +0x21,0x10,0xF4,0x02, +0x00,0x00,0x51,0xA0, +0x01,0x00,0x94,0x26, +0x01,0x00,0x73,0x26, +0x0D,0x00,0x62,0x2A, +0xDB,0xFF,0x40,0x14, +0x30,0x1F,0xA2,0x26, +0x21,0x10,0x80,0x02, +0x30,0x00,0xBF,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x0C,0x50,0x00,0x08, +0x80,0x00,0x51,0x34, +0xD0,0xFF,0xBD,0x27, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x21,0x88,0x80,0x00, +0x21,0x80,0xA0,0x00, +0x0D,0x00,0x06,0x24, +0x21,0x28,0x00,0x00, +0x28,0x00,0xBF,0xAF, +0xFF,0x51,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0xDD,0x4F,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x00,0x00,0x02,0xAE, +0x21,0x20,0x20,0x02, +0x10,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x21,0x30,0x40,0x00, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x21,0x28,0x00,0x00, +0x21,0x10,0x85,0x00, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x60,0x10, +0x0D,0x00,0xA2,0x2C, +0xFA,0xFF,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xFF,0xFF,0xA5,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x00,0x00,0x82,0x94, +0x21,0x30,0x80,0x00, +0x10,0x00,0x85,0x24, +0x42,0x1A,0x02,0x00, +0xC2,0x11,0x02,0x00, +0x02,0x00,0x42,0x30, +0x01,0x00,0x63,0x30, +0x25,0x18,0x43,0x00, +0x01,0x00,0x04,0x24, +0x07,0x00,0x64,0x10, +0x00,0x00,0x00,0x00, +0x05,0x00,0x60,0x10, +0x0A,0x00,0xC5,0x24, +0x02,0x00,0x02,0x24, +0x02,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x18,0x00,0xC5,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x00,0x00,0x82,0x94, +0x21,0x30,0x80,0x00, +0x04,0x00,0x85,0x24, +0x42,0x1A,0x02,0x00, +0xC2,0x11,0x02,0x00, +0x02,0x00,0x42,0x30, +0x01,0x00,0x63,0x30, +0x25,0x18,0x43,0x00, +0x01,0x00,0x04,0x24, +0x04,0x00,0x64,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0xC5,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x13,0x00,0xA0,0x18, +0x21,0x30,0x00,0x00, +0x02,0x00,0x07,0x24, +0x04,0x00,0x08,0x24, +0x0B,0x00,0x09,0x24, +0x16,0x00,0x0A,0x24, +0x21,0x10,0x86,0x00, +0x00,0x00,0x43,0x90, +0x01,0x00,0xC6,0x24, +0x7F,0x00,0x63,0x30, +0x07,0x00,0x67,0x10, +0x2A,0x10,0xC5,0x00, +0x05,0x00,0x68,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x69,0x10, +0x00,0x00,0x00,0x00, +0x05,0x00,0x6A,0x14, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x02,0x80,0x02,0x3C, +0x80,0x5D,0x43,0x8C, +0x08,0x00,0x10,0x24, +0x06,0x00,0xA0,0x14, +0x0A,0x80,0x03,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x65,0x50,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x36, +0x01,0x00,0x42,0x38, +0x03,0x00,0x04,0x36, +0x21,0x80,0x60,0x00, +0x0B,0x80,0x82,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x0E,0x00,0xA3,0x2C, +0x21,0x88,0xA0,0x00, +0x0D,0x00,0x02,0x24, +0x0A,0x88,0x43,0x00, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x21,0x98,0x80,0x00, +0x21,0x90,0x00,0x00, +0x15,0x00,0x20,0x12, +0x21,0x80,0x00,0x00, +0xAA,0x50,0x00,0x08, +0x01,0x00,0x14,0x24, +0x2B,0x10,0x11,0x02, +0x11,0x00,0x40,0x10, +0x21,0x10,0x40,0x02, +0x21,0x18,0x70,0x02, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0xF6,0xFF,0x41,0x04, +0x01,0x00,0x10,0x26, +0x7D,0x4F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x10,0x54,0x00, +0x25,0x90,0x42,0x02, +0x2B,0x10,0x11,0x02, +0xF3,0xFF,0x40,0x14, +0x21,0x18,0x70,0x02, +0x21,0x10,0x40,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x0E,0x00,0xA3,0x2C, +0x21,0x88,0xA0,0x00, +0x0D,0x00,0x02,0x24, +0x0A,0x88,0x43,0x00, +0x20,0x00,0xB4,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x21,0xA0,0x80,0x00, +0x21,0x90,0x00,0x00, +0x0A,0x00,0x20,0x12, +0x21,0x80,0x00,0x00, +0x01,0x00,0x13,0x24, +0x21,0x10,0x90,0x02, +0x00,0x00,0x44,0x90, +0x7D,0x4F,0x00,0x0C, +0x01,0x00,0x10,0x26, +0x04,0x10,0x53,0x00, +0x2B,0x18,0x11,0x02, +0xF9,0xFF,0x60,0x14, +0x25,0x90,0x42,0x02, +0x21,0x10,0x40,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0xFF,0xFF,0x02,0x24, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x21,0x30,0xA0,0x00, +0x1B,0x00,0x82,0x10, +0x20,0x00,0x10,0x24, +0x20,0x00,0x82,0x28, +0x06,0x00,0x40,0x14, +0x80,0x18,0x04,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x21,0x18,0x64,0x00, +0x21,0x80,0x80,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0xC0,0x18,0x03,0x00, +0x30,0x1F,0x42,0x24, +0x2B,0x3D,0x84,0x24, +0x21,0x20,0x64,0x00, +0x21,0x18,0x62,0x00, +0x01,0x00,0x02,0x24, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0xFA,0x1D,0x62,0xA0, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xC8,0x00,0x47,0x24, +0x05,0x00,0x10,0x24, +0xC2,0x1E,0x43,0x24, +0x10,0x51,0x00,0x08, +0xC8,0x00,0x05,0x24, +0x01,0x00,0x10,0x26, +0x20,0x00,0x02,0x2E, +0x28,0x00,0xA5,0x24, +0xDE,0xFF,0x40,0x10, +0x28,0x00,0xE7,0x24, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x40,0x14, +0x28,0x00,0x63,0x24, +0x02,0x80,0x04,0x3C, +0x2B,0x3D,0x84,0x24, +0x01,0x00,0x02,0x24, +0x21,0x20,0xA4,0x00, +0xFA,0x1D,0xE2,0xA0, +0x21,0x28,0xC0,0x00, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x00,0x51,0x00,0x08, +0x21,0x10,0x00,0x02, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x30,0x00,0xB2,0x8F, +0x21,0x88,0x80,0x00, +0x21,0x20,0xA0,0x00, +0x21,0x28,0x20,0x02, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0xE3,0x50,0x00,0x0C, +0xFF,0xFF,0xF0,0x30, +0x20,0x00,0x03,0x24, +0x21,0x20,0x40,0x00, +0x21,0x28,0x00,0x02, +0x21,0x30,0x20,0x02, +0x07,0x00,0x43,0x10, +0x21,0x38,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x4E,0x23,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0xA8,0x80,0x00, +0x30,0x1F,0x54,0x24, +0x2B,0x3D,0x73,0x24, +0x05,0x00,0x11,0x24, +0x01,0x00,0x12,0x24, +0xC8,0x00,0x10,0x24, +0x50,0x51,0x00,0x08, +0x28,0x00,0xBF,0xAF, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x0E,0x00,0x40,0x10, +0x21,0x10,0x20,0x02, +0x21,0x10,0x14,0x02, +0xFA,0x1D,0x43,0x90, +0x21,0x20,0x13,0x02, +0x21,0x28,0xA0,0x02, +0x06,0x00,0x06,0x24, +0xF6,0xFF,0x72,0x14, +0x28,0x00,0x10,0x26, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x40,0x14, +0x01,0x00,0x31,0x26, +0xFF,0xFF,0x31,0x26, +0x21,0x10,0x20,0x02, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x98,0x80,0x00, +0x30,0x1F,0x56,0x24, +0x2B,0x3D,0x75,0x24, +0x21,0x88,0x00,0x00, +0x01,0x00,0x14,0x24, +0x21,0x80,0x00,0x00, +0x2C,0x00,0xBF,0xAF, +0x7C,0x51,0x00,0x08, +0x18,0x00,0xB2,0xAF, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x1E,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x90,0x16,0x02, +0xFA,0x1D,0x42,0x92, +0x21,0x20,0x15,0x02, +0x21,0x28,0x60,0x02, +0x06,0x00,0x06,0x24, +0xF6,0xFF,0x54,0x14, +0x28,0x00,0x10,0x26, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x40,0x14, +0x01,0x00,0x31,0x26, +0xFF,0xFF,0x31,0x26, +0x02,0x80,0x06,0x3C, +0x02,0x80,0x07,0x3C, +0x21,0x20,0x20,0x02, +0xFA,0x1D,0x40,0xA2, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xE8,0xDD,0xC6,0x24, +0xD8,0xDD,0xE7,0x24, +0x21,0x28,0x00,0x00, +0x4E,0x23,0x00,0x08, +0x30,0x00,0xBD,0x27, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x18,0x00,0xB2,0xAF, +0x30,0x1F,0x52,0x24, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x21,0x80,0x00,0x00, +0x02,0x80,0x1E,0x3C, +0x02,0x80,0x17,0x3C, +0x02,0x80,0x16,0x3C, +0x01,0x00,0x13,0x24, +0xFF,0xF7,0x15,0x24, +0xFF,0xEF,0x14,0x24, +0x21,0x88,0x40,0x02, +0xFA,0x1D,0x22,0x92, +0xC0,0x48,0x10,0x00, +0xEA,0x5D,0xC7,0x93, +0x41,0x00,0x53,0x10, +0x21,0x30,0x32,0x01, +0xE8,0x22,0xC2,0x8C, +0xBF,0xFF,0x03,0x24, +0x24,0x28,0x43,0x00, +0x80,0x07,0xA3,0x34, +0x24,0x10,0x75,0x00, +0x31,0x00,0xF3,0x10, +0x24,0x10,0x54,0x00, +0xE8,0x22,0xC2,0xAC, +0x21,0x48,0x32,0x01, +0xE8,0x22,0x23,0x8D, +0xFD,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xFB,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xE7,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xFF,0xFD,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xEC,0x22,0x28,0x8D, +0x24,0x18,0x62,0x00, +0xFF,0xFB,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xFF,0xE7,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x1F,0x00,0x06,0x3C, +0x00,0x80,0x08,0x35, +0x24,0x18,0x62,0x00, +0x25,0x40,0x06,0x01, +0x21,0x20,0x00,0x02, +0xE8,0x22,0x23,0xAD, +0x01,0x00,0x10,0x26, +0x21,0x28,0x00,0x00, +0xE8,0xDD,0xE6,0x26, +0xD8,0xDD,0xC7,0x26, +0x4E,0x23,0x00,0x0C, +0xEC,0x22,0x28,0xAD, +0x20,0x00,0x03,0x2A, +0xD1,0xFF,0x60,0x14, +0x28,0x00,0x31,0x26, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x44,0x90, +0x24,0x18,0x75,0x00, +0x80,0x0F,0xA2,0x34, +0x00,0x10,0x63,0x34, +0xCA,0xFF,0x87,0x14, +0x24,0x10,0x54,0x00, +0xC5,0x51,0x00,0x08, +0xE8,0x22,0xC3,0xAC, +0xBD,0x51,0x00,0x08, +0xFA,0x1D,0x20,0xA2, +0x04,0x52,0x00,0x08, +0xFF,0x00,0xA5,0x30, +0x00,0x00,0x85,0xA0, +0xFF,0xFF,0xC6,0x24, +0x01,0x00,0x84,0x24, +0xFC,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x05,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0xFF,0xFF,0xC6,0x24, +0xFD,0xFF,0xC0,0x14, +0x04,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x38,0x80,0x00, +0x08,0x00,0xC0,0x10, +0xFF,0xFF,0xC3,0x24, +0xFF,0xFF,0x06,0x24, +0x00,0x00,0xA2,0x90, +0xFF,0xFF,0x63,0x24, +0x01,0x00,0xA5,0x24, +0x00,0x00,0xE2,0xA0, +0xFB,0xFF,0x66,0x14, +0x01,0x00,0xE7,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x2B,0x10,0xA4,0x00, +0x0D,0x00,0x40,0x14, +0xFF,0xFF,0x02,0x24, +0xFF,0xFF,0xC6,0x24, +0x08,0x00,0xC2,0x10, +0x21,0x18,0x80,0x00, +0xFF,0xFF,0x07,0x24, +0x00,0x00,0xA2,0x90, +0xFF,0xFF,0xC6,0x24, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x62,0xA0, +0xFB,0xFF,0xC7,0x14, +0x01,0x00,0x63,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x21,0x28,0xA6,0x00, +0x21,0x18,0x86,0x00, +0xFF,0xFF,0xC6,0x24, +0xFA,0xFF,0xC2,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x07,0x24, +0xFF,0xFF,0xA5,0x24, +0x00,0x00,0xA2,0x90, +0xFF,0xFF,0x63,0x24, +0xFF,0xFF,0xC6,0x24, +0xFB,0xFF,0xC7,0x14, +0x00,0x00,0x62,0xA0, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x0C,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0xA3,0x90, +0x01,0x00,0x84,0x24, +0x23,0x10,0x43,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x04,0x00,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xFF,0xFF,0xC6,0x24, +0xF6,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xC0,0x00, +0x4F,0x52,0x00,0x08, +0x21,0x18,0x86,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x45,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x84,0x24, +0xFA,0xFF,0x83,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x09,0x00,0xC0,0x10, +0xFF,0xFF,0xC3,0x24, +0xFF,0x00,0xA5,0x30, +0xFF,0xFF,0x06,0x24, +0x00,0x00,0x82,0x90, +0xFF,0xFF,0x63,0x24, +0x05,0x00,0x45,0x10, +0x01,0x00,0x84,0x24, +0xFB,0xFF,0x66,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0xFF,0xFF,0x82,0x24, +0x21,0x38,0x00,0x00, +0x1F,0x00,0xC0,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x40,0xF2,0x4B,0x24, +0x00,0x00,0x87,0x90, +0x00,0x00,0xA3,0x90, +0xFF,0xFF,0xC6,0x24, +0x01,0x00,0x84,0x24, +0x21,0x10,0xEB,0x00, +0x16,0x00,0xE0,0x10, +0x01,0x00,0xA5,0x24, +0x14,0x00,0x60,0x10, +0x21,0x48,0x6B,0x00, +0x10,0x00,0xE3,0x10, +0x20,0x00,0xE8,0x24, +0x00,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x02,0x00,0x40,0x10, +0x20,0x00,0x6A,0x24, +0xFF,0x00,0x07,0x31, +0x00,0x00,0x22,0x91, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x02,0x00,0x40,0x10, +0xFF,0x00,0xE7,0x30, +0xFF,0x00,0x43,0x31, +0xFF,0x00,0x63,0x30, +0x03,0x00,0xE3,0x14, +0x00,0x00,0x00,0x00, +0xE5,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0xE3,0x00, +0x21,0x18,0x80,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x21,0x38,0x80,0x00, +0xFF,0xFF,0x03,0x24, +0xFF,0xFF,0xC6,0x24, +0x06,0x00,0xC3,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0xF9,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xE0,0x00, +0x00,0x00,0x82,0x80, +0x9E,0x52,0x00,0x08, +0x21,0x18,0x80,0x00, +0x01,0x00,0x84,0x24, +0x00,0x00,0x82,0x80, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x12,0x00,0xC0,0x10, +0x21,0x18,0x80,0x00, +0x00,0x00,0x82,0x80, +0xAF,0x52,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x00,0x84,0x24, +0x00,0x00,0x82,0x80, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0x05,0x00,0x40,0x10, +0x01,0x00,0x84,0x24, +0xFF,0xFF,0xC6,0x24, +0xF9,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0x80,0xA0, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x00,0x00,0x83,0x90, +0x00,0x00,0xA2,0x90, +0x01,0x00,0x84,0x24, +0x23,0x10,0x62,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x03,0x00,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xF7,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x10,0x00,0x00, +0x0B,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x83,0x90, +0xFF,0xFF,0xC6,0x24, +0x23,0x10,0x62,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x03,0x00,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xF5,0xFF,0x60,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x83,0x80, +0x00,0x2E,0x05,0x00, +0x21,0x10,0x80,0x00, +0xE0,0x52,0x00,0x08, +0x03,0x2E,0x05,0x00, +0x07,0x00,0x60,0x10, +0x01,0x00,0x42,0x24, +0x00,0x00,0x43,0x80, +0x00,0x00,0x00,0x00, +0xFB,0xFF,0x65,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x00,0x00,0x82,0x80, +0xEC,0x52,0x00,0x08, +0x21,0x18,0x80,0x00, +0x01,0x00,0x63,0x24, +0x00,0x00,0x62,0x80, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x23,0x10,0x64,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0xA0,0x00, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x21,0x88,0x80,0x00, +0xE6,0x52,0x00,0x0C, +0x00,0x86,0x10,0x00, +0x21,0x18,0x51,0x00, +0x03,0x86,0x10,0x00, +0x00,0x00,0x62,0x80, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x50,0x10, +0x21,0x10,0x60,0x00, +0xFF,0xFF,0x63,0x24, +0x2B,0x10,0x71,0x00, +0xF9,0xFF,0x40,0x10, +0x21,0x10,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x21,0x30,0x80,0x00, +0x0D,0x00,0xA0,0x10, +0xFF,0xFF,0xA3,0x24, +0x00,0x00,0x82,0x80, +0x00,0x00,0x00,0x00, +0x09,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x05,0x24, +0xFF,0xFF,0x63,0x24, +0x05,0x00,0x65,0x10, +0x01,0x00,0xC6,0x24, +0x00,0x00,0xC2,0x80, +0x00,0x00,0x00,0x00, +0xFA,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0xC4,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x19,0x00,0x40,0x10, +0x21,0x40,0x00,0x00, +0x00,0x00,0xA9,0x80, +0x00,0x00,0x00,0x00, +0x17,0x00,0x20,0x11, +0x21,0x30,0xA0,0x00, +0x00,0x3E,0x02,0x00, +0x03,0x3E,0x07,0x00, +0x21,0x18,0x20,0x01, +0x15,0x00,0xE3,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0xC6,0x24, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x00,0x1E,0x02,0x00, +0x03,0x1E,0x03,0x00, +0xF8,0xFF,0x60,0x14, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x84,0x24, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xEB,0xFF,0x40,0x14, +0x01,0x00,0x08,0x25, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x01, +0x00,0x00,0xA2,0x90, +0x31,0x53,0x00,0x08, +0x00,0x16,0x02,0x00, +0x00,0x00,0xC2,0x90, +0x31,0x53,0x00,0x08, +0x00,0x16,0x02,0x00, +0x00,0x00,0x87,0x90, +0x00,0x00,0x00,0x00, +0x14,0x00,0xE0,0x10, +0x21,0x10,0x80,0x00, +0x00,0x00,0xA4,0x90, +0x00,0x00,0x00,0x00, +0x00,0x1E,0x04,0x00, +0x03,0x1E,0x03,0x00, +0x09,0x00,0x60,0x10, +0x21,0x30,0xA0,0x00, +0x00,0x3E,0x07,0x00, +0x03,0x3E,0x07,0x00, +0x0B,0x00,0xE3,0x10, +0x01,0x00,0xC6,0x24, +0x00,0x00,0xC3,0x80, +0x00,0x00,0x00,0x00, +0xFB,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x00,0x00,0x47,0x90, +0x00,0x00,0x00,0x00, +0xF0,0xFF,0xE0,0x14, +0x00,0x00,0x00,0x00, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x1D,0x00,0x80,0x10, +0x21,0x88,0xA0,0x00, +0x1D,0x53,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x21,0x80,0x02,0x02, +0x00,0x00,0x02,0x82, +0x21,0x28,0x20,0x02, +0x21,0x20,0x00,0x02, +0x22,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x41,0x53,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x40,0x10, +0x21,0x18,0x40,0x00, +0x00,0x00,0x42,0x80, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x5C,0xF3,0x43,0xAC, +0x21,0x18,0x00,0x02, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x60,0xA0, +0x72,0x53,0x00,0x08, +0x01,0x00,0x63,0x24, +0x02,0x80,0x02,0x3C, +0x5C,0xF3,0x50,0x8C, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x00,0x12, +0x21,0x18,0x00,0x00, +0x1D,0x53,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x21,0x80,0x02,0x02, +0x00,0x00,0x02,0x82, +0x21,0x28,0x20,0x02, +0x21,0x20,0x00,0x02, +0xE0,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x80,0x02,0x3C, +0x5C,0xF3,0x40,0xAC, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x90,0x8C, +0x21,0x90,0x80,0x00, +0x21,0x88,0xA0,0x00, +0x21,0x18,0x00,0x00, +0x0F,0x00,0x00,0x12, +0x21,0x20,0x00,0x02, +0x1D,0x53,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x80,0x02,0x02, +0x00,0x00,0x02,0x82, +0x21,0x28,0x20,0x02, +0x21,0x20,0x00,0x02, +0x07,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x41,0x53,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x40,0x00, +0x09,0x00,0x40,0x14, +0x00,0x00,0x42,0xAE, +0x21,0x18,0x00,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x42,0x80, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x40,0x10, +0x01,0x00,0x64,0x24, +0x00,0x00,0x60,0xA0, +0xAB,0x53,0x00,0x08, +0x00,0x00,0x44,0xAE, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x21,0x88,0x80,0x00, +0x21,0x20,0xA0,0x00, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x20,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0xE6,0x52,0x00,0x0C, +0x21,0x98,0xA0,0x00, +0x21,0x90,0x40,0x00, +0x08,0x00,0x40,0x16, +0x21,0x10,0x20,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE6,0x52,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x80,0x40,0x00, +0x2A,0x10,0x52,0x00, +0x0A,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x02, +0x21,0x30,0x40,0x02, +0x39,0x52,0x00,0x0C, +0xFF,0xFF,0x10,0x26, +0x0B,0x00,0x40,0x10, +0x2A,0x18,0x12,0x02, +0xF8,0xFF,0x60,0x10, +0x01,0x00,0x31,0x26, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xC7,0x53,0x00,0x08, +0x21,0x10,0x20,0x02, +0x00,0x00,0x87,0x90, +0x00,0x00,0x00,0x00, +0x27,0x00,0xE0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA6,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0xC0,0x10, +0xDF,0xFF,0x02,0x24, +0x24,0x18,0xC2,0x00, +0x24,0x10,0xE2,0x00, +0x00,0x16,0x02,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x16,0x02,0x00, +0x03,0x1E,0x03,0x00, +0x0A,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0xDF,0xFF,0x02,0x24, +0x24,0x18,0xC2,0x00, +0x24,0x10,0xE2,0x00, +0x00,0x16,0x02,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0x03,0x16,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0x43,0x00, +0x0A,0x54,0x00,0x08, +0xDF,0xFF,0x08,0x24, +0x00,0x00,0xA6,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x06,0x01, +0x00,0x16,0x02,0x00, +0xF0,0xFF,0xC0,0x10, +0x03,0x16,0x02,0x00, +0xEF,0xFF,0x62,0x14, +0xDF,0xFF,0x02,0x24, +0x01,0x00,0x84,0x24, +0x00,0x00,0x87,0x90, +0x01,0x00,0xA5,0x24, +0x24,0x10,0x07,0x01, +0x00,0x1E,0x02,0x00, +0xF2,0xFF,0xE0,0x14, +0x03,0x1E,0x03,0x00, +0x00,0x00,0xA6,0x90, +0xDF,0xFF,0x02,0x24, +0x24,0x18,0xC2,0x00, +0x24,0x10,0xE2,0x00, +0x00,0x16,0x02,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0x03,0x16,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0x43,0x00, +0xA8,0xFF,0xBD,0x27, +0x44,0x00,0xB5,0xAF, +0x40,0x00,0xB4,0xAF, +0x38,0x00,0xB2,0xAF, +0x34,0x00,0xB1,0xAF, +0x54,0x00,0xBF,0xAF, +0x50,0x00,0xBE,0xAF, +0x4C,0x00,0xB7,0xAF, +0x48,0x00,0xB6,0xAF, +0x3C,0x00,0xB3,0xAF, +0x30,0x00,0xB0,0xAF, +0x21,0x90,0xA0,0x00, +0x00,0x00,0xA5,0x90, +0x21,0xA0,0x80,0x00, +0x21,0xA8,0xC0,0x00, +0x00,0x26,0x05,0x00, +0x03,0x26,0x04,0x00, +0x11,0x00,0x80,0x10, +0x21,0x88,0x80,0x02, +0x25,0x00,0x02,0x24, +0x29,0x00,0x82,0x10, +0x0A,0x00,0x02,0x24, +0x1B,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x1E,0x00,0x80,0x12, +0x00,0x00,0x00,0x00, +0x00,0x00,0x25,0xA2, +0x01,0x00,0x31,0x26, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x00,0x00,0x00,0x00, +0x00,0x26,0x05,0x00, +0x03,0x26,0x04,0x00, +0xF2,0xFF,0x80,0x14, +0x25,0x00,0x02,0x24, +0x02,0x00,0x80,0x12, +0x23,0x10,0x34,0x02, +0x00,0x00,0x20,0xA2, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0xE7,0xFF,0x80,0x16, +0x00,0x00,0x00,0x00, +0x77,0x55,0x00,0x0C, +0x0D,0x00,0x04,0x24, +0x0A,0x00,0x04,0x24, +0x77,0x55,0x00,0x0C, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x00,0x00,0x00,0x00, +0x00,0x26,0x05,0x00, +0x3C,0x54,0x00,0x08, +0x03,0x26,0x04,0x00, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x73,0x00,0x02,0x24, +0x00,0x1E,0x05,0x00, +0x03,0x1E,0x03,0x00, +0x2C,0x00,0x62,0x10, +0x10,0x00,0xB3,0x27, +0x23,0x00,0x02,0x24, +0x21,0xF0,0x60,0x02, +0x21,0x38,0x00,0x00, +0x34,0x00,0x62,0x10, +0x1C,0x00,0x04,0x24, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0x68,0x00,0x03,0x24, +0x36,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0x39,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x20,0x00,0xA2,0x34, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x78,0x00,0x03,0x24, +0x3C,0x00,0x43,0x10, +0x20,0x00,0xA6,0x30, +0x00,0x1E,0x05,0x00, +0x03,0x1E,0x03,0x00, +0x64,0x00,0x02,0x24, +0x49,0x00,0x62,0x10, +0x40,0x00,0x02,0x24, +0x81,0x00,0x62,0x10, +0x21,0x00,0x02,0x24, +0x92,0x00,0x62,0x10, +0x63,0x00,0x02,0x24, +0xA2,0x00,0x62,0x10, +0x11,0x00,0xB3,0x27, +0x10,0x00,0xA5,0xA3, +0x21,0x80,0xC0,0x03, +0x2B,0x10,0x13,0x02, +0xB4,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x00,0x80,0x12, +0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0x92, +0x01,0x00,0x10,0x26, +0x00,0x00,0x22,0xA2, +0x81,0x54,0x00,0x08, +0x01,0x00,0x31,0x26, +0x00,0x00,0xA2,0x8E, +0x04,0x00,0xB5,0x26, +0x21,0x80,0x40,0x00, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0xA6,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x63,0x00,0x80,0x12, +0x00,0x00,0x00,0x00, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x10,0x26, +0x8E,0x54,0x00,0x08, +0x01,0x00,0x31,0x26, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x68,0x00,0x03,0x24, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0xCC,0xFF,0x43,0x14, +0x01,0x00,0x07,0x24, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x00,0x00,0x00,0x00, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0xC9,0xFF,0x43,0x14, +0x0C,0x00,0x04,0x24, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x78,0x00,0x03,0x24, +0x20,0x00,0xA2,0x34, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0xC7,0xFF,0x43,0x14, +0x04,0x00,0x04,0x24, +0x20,0x00,0xA6,0x30, +0x00,0x00,0xA5,0x8E, +0x35,0x00,0xE0,0x14, +0x04,0x00,0xB5,0x26, +0xCD,0xFF,0x80,0x04, +0x02,0x80,0x02,0x3C, +0x48,0xED,0x42,0x24, +0x00,0x00,0x47,0x8C, +0x07,0x10,0x85,0x00, +0x0F,0x00,0x42,0x30, +0x21,0x10,0x47,0x00, +0x00,0x00,0x43,0x90, +0xFC,0xFF,0x84,0x24, +0x25,0x18,0xC3,0x00, +0x00,0x00,0x63,0xA2, +0xF8,0xFF,0x81,0x04, +0x01,0x00,0x73,0x26, +0x81,0x54,0x00,0x08, +0x21,0x80,0xC0,0x03, +0x00,0x00,0xA2,0x8E, +0x04,0x00,0xB5,0x26, +0x28,0x00,0x40,0x04, +0x21,0x28,0x40,0x00, +0x21,0x80,0x60,0x02, +0x02,0x80,0x02,0x3C, +0x4C,0xED,0x42,0x24, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x00,0x00, +0x18,0x00,0xA6,0x00, +0xC3,0x27,0x05,0x00, +0x10,0x10,0x00,0x00, +0x83,0x10,0x02,0x00, +0x23,0x10,0x44,0x00, +0x80,0x18,0x02,0x00, +0x21,0x18,0x62,0x00, +0x40,0x18,0x03,0x00, +0x23,0x18,0xA3,0x00, +0x30,0x00,0x63,0x24, +0x00,0x00,0x63,0xA2, +0x21,0x28,0x40,0x00, +0xF3,0xFF,0x40,0x14, +0x01,0x00,0x73,0x26, +0xE1,0x54,0x00,0x08, +0xFF,0xFF,0x63,0x26, +0x00,0x00,0x65,0x80, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xA0, +0x00,0x00,0x05,0xA2, +0xFF,0xFF,0x63,0x24, +0x01,0x00,0x10,0x26, +0x2B,0x10,0x03,0x02, +0xF7,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x81,0x54,0x00,0x08, +0x21,0x80,0xC0,0x03, +0x58,0x00,0xC3,0x34, +0x30,0x00,0x02,0x24, +0x12,0x00,0xB3,0x27, +0x10,0x00,0xA2,0xA3, +0xB2,0x54,0x00,0x08, +0x11,0x00,0xA3,0xA3, +0x2D,0x00,0x02,0x24, +0x23,0x28,0x05,0x00, +0x11,0x00,0xB3,0x27, +0xC5,0x54,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0x00,0x00,0x04,0x82, +0x77,0x55,0x00,0x0C, +0x01,0x00,0x10,0x26, +0x82,0x54,0x00,0x08, +0x2B,0x10,0x13,0x02, +0x00,0x00,0x04,0x82, +0x77,0x55,0x00,0x0C, +0x01,0x00,0x10,0x26, +0x8E,0x54,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA3,0x8E, +0x28,0x00,0xB0,0x27, +0x2C,0x00,0xA4,0x27, +0x2B,0x10,0x04,0x02, +0x28,0x00,0xA3,0xAF, +0x0B,0x00,0x40,0x10, +0x04,0x00,0xB5,0x26, +0x21,0xB8,0x80,0x00, +0x02,0x80,0x16,0x3C, +0x00,0x00,0x06,0x92, +0x21,0x20,0x60,0x02, +0x01,0x00,0x10,0x26, +0x24,0x55,0x00,0x0C, +0xD0,0xE3,0xC5,0x26, +0x2B,0x18,0x17,0x02, +0xF9,0xFF,0x60,0x14, +0x21,0x98,0x62,0x02, +0x80,0x54,0x00,0x08, +0xFF,0xFF,0x73,0x26, +0x00,0x00,0xA2,0x8E, +0x00,0x00,0x00,0x00, +0x06,0x00,0x56,0x24, +0x21,0x80,0x40,0x00, +0x2B,0x10,0x56,0x00, +0xF8,0xFF,0x40,0x10, +0x04,0x00,0xB5,0x26, +0x02,0x80,0x17,0x3C, +0x00,0x00,0x06,0x82, +0x21,0x20,0x60,0x02, +0x01,0x00,0x10,0x26, +0x24,0x55,0x00,0x0C, +0xD4,0xE3,0xE5,0x26, +0x2B,0x18,0x16,0x02, +0xF9,0xFF,0x60,0x14, +0x21,0x98,0x62,0x02, +0x80,0x54,0x00,0x08, +0xFF,0xFF,0x73,0x26, +0x00,0x00,0xA2,0x8E, +0x04,0x00,0xB5,0x26, +0x80,0x54,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0xE8,0xFF,0xBD,0x27, +0x20,0x00,0xA6,0xAF, +0x20,0x00,0xA6,0x27, +0x10,0x00,0xBF,0xAF, +0x24,0x00,0xA7,0xAF, +0x1B,0x54,0x00,0x0C, +0x1C,0x00,0xA5,0xAF, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xA5,0xAF, +0x28,0x00,0xA6,0xAF, +0x2C,0x00,0xA7,0xAF, +0x20,0x00,0xA4,0xAF, +0x00,0x60,0x11,0x40, +0x01,0x00,0x21,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0x24,0x00,0x0C, +0xA0,0x00,0x04,0x24, +0x19,0x00,0x40,0x10, +0x21,0x80,0x40,0x00, +0x08,0x00,0x44,0x94, +0x20,0x00,0xA5,0x8F, +0x02,0x80,0x02,0x3C, +0x25,0x20,0x82,0x00, +0x20,0x00,0x84,0x24, +0x1B,0x54,0x00,0x0C, +0x24,0x00,0xA6,0x27, +0x01,0x00,0x42,0x24, +0x13,0x00,0x03,0x24, +0x81,0x00,0x44,0x2C, +0x14,0x00,0x03,0xAE, +0x17,0x00,0x80,0x14, +0x0C,0x00,0x02,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x88,0x88,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x88,0x88,0x63,0x34, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x55,0x55,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x60,0x91,0x40, +0x99,0x99,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x99,0x99,0x63,0x34, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x30,0x09,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x00,0x60,0x91,0x40, +0x5D,0x55,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x02,0x80,0x06,0x3C, +0x60,0xF3,0xC5,0x8C, +0x02,0x80,0x02,0x3C, +0x40,0xF3,0x42,0x24, +0x03,0x00,0xA3,0x30, +0x21,0x18,0x62,0x00, +0x00,0x00,0x64,0x80, +0x01,0x00,0xA5,0x24, +0x77,0x55,0x00,0x0C, +0x60,0xF3,0xC5,0xAC, +0x10,0x00,0xBF,0x8F, +0x08,0x00,0x04,0x24, +0x77,0x55,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x00,0x26,0x04,0x00, +0x03,0x26,0x04,0x00, +0x00,0x00,0x84,0x48, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x26,0x04,0x00, +0x03,0x26,0x04,0x00, +0xF7,0xFF,0x82,0x24, +0x05,0x00,0x42,0x2C, +0x06,0x00,0x40,0x14, +0x21,0x18,0x00,0x00, +0x20,0x00,0x02,0x24, +0x03,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x01,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x03,0x3C, +0xD4,0x5E,0x64,0xAC, +0x00,0x60,0x82,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0x01,0x00,0x06,0x24, +0x01,0x80,0x02,0x3C, +0x04,0x30,0x86,0x00, +0xF1,0x02,0xA7,0x34, +0xED,0x02,0xA4,0x34, +0x4C,0x56,0x42,0x24, +0x18,0x03,0xA5,0x34, +0x08,0x00,0x03,0x24, +0x00,0x00,0xA2,0xAC, +0x00,0x00,0xE3,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0xE0,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x82,0x8C, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0xC6,0x30, +0x10,0x00,0x02,0x24, +0x0C,0x00,0xC2,0x10, +0x11,0x00,0xC3,0x28, +0x06,0x00,0x60,0x10, +0x20,0x00,0x02,0x24, +0x08,0x00,0x02,0x24, +0x0D,0x00,0xC2,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x06,0x00,0xC2,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xA4, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x0A,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0xFF,0xFF,0xA5,0x24, +0x00,0x2C,0x05,0x00, +0xFD,0x00,0x63,0x30, +0x03,0x2C,0x05,0x00, +0xFF,0xFF,0x87,0x30, +0x00,0x00,0x43,0xA0, +0x1A,0x00,0xA0,0x04, +0x00,0x00,0x00,0x00, +0x21,0x30,0x40,0x00, +0x07,0x10,0xA7,0x00, +0x01,0x00,0x42,0x30, +0xFD,0x00,0x64,0x30, +0x00,0x00,0x42,0x38, +0x02,0x00,0x63,0x34, +0x0A,0x18,0x82,0x00, +0x00,0x00,0xC3,0xA0, +0x04,0x00,0x63,0x34, +0x00,0x00,0xC3,0xA0, +0x09,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFB,0x00,0x63,0x30, +0x00,0x00,0xC3,0xA0, +0x04,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0xA2,0x24, +0x00,0x2C,0x02,0x00, +0x03,0x2C,0x05,0x00, +0xEA,0xFF,0xA1,0x04, +0x07,0x10,0xA7,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x0A,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0xFF,0xFF,0x84,0x24, +0x00,0x24,0x04,0x00, +0x03,0x24,0x04,0x00, +0xFF,0x00,0x65,0x30, +0x1D,0x00,0x80,0x04, +0x21,0x38,0x00,0x00, +0x21,0x30,0x40,0x00, +0x01,0x00,0x08,0x24, +0x04,0x00,0xA5,0x34, +0x00,0x00,0xC5,0xA0, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x45,0x30, +0x01,0x00,0xA3,0x30, +0x05,0x00,0x60,0x10, +0x04,0x00,0x02,0x24, +0x04,0x10,0x88,0x00, +0x25,0x10,0x47,0x00, +0xFF,0xFF,0x47,0x30, +0x04,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFB,0x00,0xA5,0x30, +0x00,0x00,0xC5,0xA0, +0x09,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x82,0x24, +0x00,0x24,0x02,0x00, +0x03,0x24,0x04,0x00, +0xE7,0xFF,0x81,0x04, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xE0,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x25,0xB0,0x10,0x3C, +0x0A,0x00,0x10,0x36, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x00,0x00,0x02,0x92, +0xFF,0xFF,0x91,0x30, +0x03,0x00,0x05,0x24, +0xC0,0x00,0x42,0x30, +0x80,0x00,0x43,0x34, +0x00,0x00,0x03,0xA2, +0x04,0x00,0x63,0x34, +0x00,0x00,0x03,0xA2, +0xFB,0x00,0x63,0x30, +0x00,0x00,0x03,0xA2, +0x08,0x00,0x63,0x34, +0x00,0x00,0x03,0xA2, +0x04,0x00,0x63,0x34, +0x00,0x00,0x03,0xA2, +0xFB,0x00,0x63,0x30, +0x00,0x00,0x03,0xA2, +0xC9,0x55,0x00,0x0C, +0x06,0x00,0x04,0x24, +0x42,0x20,0x11,0x00, +0xC9,0x55,0x00,0x0C, +0x06,0x00,0x05,0x24, +0xEF,0x55,0x00,0x0C, +0x10,0x00,0x04,0x24, +0x00,0x00,0x03,0x92, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0xC0,0x00,0x63,0x30, +0x00,0x00,0x03,0xA2, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0xFF,0xFF,0xB1,0x30, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x90,0xC0,0x00, +0x0A,0x00,0x20,0x12, +0xFF,0xFF,0x90,0x30, +0x16,0x56,0x00,0x0C, +0x21,0x20,0x00,0x02, +0xFE,0xFF,0x23,0x26, +0x02,0x00,0x04,0x26, +0x00,0x00,0x42,0xA6, +0xFF,0xFF,0x71,0x30, +0xFF,0xFF,0x90,0x30, +0xF8,0xFF,0x20,0x16, +0x02,0x00,0x52,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x0A,0x00,0x67,0x34, +0x00,0x00,0xE2,0x90, +0xFF,0xFF,0xB2,0x30, +0x21,0x98,0xC0,0x00, +0xFF,0x00,0x91,0x30, +0x20,0x00,0x40,0x12, +0xFF,0x00,0x50,0x30, +0x21,0xA0,0xE0,0x00, +0x0C,0x00,0x77,0x34, +0x0B,0x00,0x76,0x34, +0x21,0xF0,0xE0,0x00, +0xC0,0xFF,0x15,0x24, +0x25,0x10,0x15,0x02, +0xFF,0x00,0x50,0x30, +0x00,0x00,0xD1,0xA2, +0x00,0x00,0x90,0xA2, +0x00,0x00,0x82,0x92, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x50,0x30, +0xC0,0x00,0x03,0x32, +0x07,0x00,0x60,0x10, +0x21,0x20,0xC0,0x03, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x50,0x30, +0xC0,0x00,0x03,0x32, +0xFB,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE2,0x8E, +0x04,0x00,0x23,0x26, +0x64,0x00,0x04,0x24, +0x00,0x00,0x62,0xAE, +0x25,0x22,0x00,0x0C, +0xFF,0x00,0x71,0x30, +0xFC,0xFF,0x42,0x26, +0xFF,0xFF,0x52,0x30, +0xE7,0xFF,0x40,0x16, +0x04,0x00,0x73,0x26, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x25,0xB0,0x06,0x3C, +0x31,0x00,0xC2,0x34, +0xFF,0xFF,0x84,0x30, +0x00,0x00,0x44,0xA0, +0x32,0x00,0xC7,0x34, +0x00,0x00,0xE3,0x90, +0xFC,0xFF,0x02,0x24, +0x02,0x22,0x04,0x00, +0x24,0x18,0x62,0x00, +0x03,0x00,0x84,0x30, +0x25,0x20,0x83,0x00, +0x33,0x00,0xC6,0x34, +0x72,0x00,0x02,0x24, +0x00,0x00,0xE4,0xA0, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0xC3,0x90, +0x00,0x00,0x00,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0x05,0x00,0x61,0x04, +0x21,0x10,0x00,0x00, +0xB5,0x56,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x11,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC3,0x90, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0xF8,0xFF,0x61,0x04, +0x64,0x00,0x44,0x2C, +0x64,0x00,0x44,0x2C, +0x07,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x30,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0xA3,0xA0, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0xA2,0xA0, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x06,0x3C, +0x31,0x00,0xC2,0x34, +0xFF,0xFF,0x84,0x30, +0x00,0x00,0x44,0xA0, +0x32,0x00,0xC3,0x34, +0x00,0x00,0x62,0x90, +0x02,0x22,0x04,0x00, +0x03,0x00,0x84,0x30, +0x25,0x20,0x82,0x00, +0x00,0x00,0x64,0xA0, +0x33,0x00,0xC7,0x34, +0xFF,0x00,0xA5,0x30, +0x30,0x00,0xC6,0x34, +0xF2,0xFF,0x03,0x24, +0x00,0x00,0xC5,0xA0, +0x00,0x00,0xE3,0xA0, +0x00,0x00,0xE2,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x03,0x00,0x40,0x04, +0x21,0x20,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0xDA,0x56,0x00,0x08, +0x21,0x30,0xE0,0x00, +0x0B,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC3,0x90, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0xF8,0xFF,0x60,0x04, +0x64,0x00,0x82,0x2C, +0x64,0x00,0x82,0x2C, +0xF1,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xB0,0xAF, +0xF8,0x02,0x45,0x34, +0x25,0xB0,0x10,0x3C, +0xFF,0x00,0x83,0x30, +0x01,0x00,0x02,0x24, +0x1C,0x00,0xBF,0xAF, +0x03,0x00,0x06,0x36, +0x0A,0x00,0x62,0x10, +0x0A,0x00,0x04,0x24, +0x00,0x00,0xA2,0x90, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x20,0x00,0xBD,0x27, +0x00,0x00,0xA2,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x20,0x00,0x43,0x34, +0x20,0x00,0x42,0x30, +0x02,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC3,0xA0, +0x25,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x04,0x36, +0x00,0x00,0x82,0x90, +0xFE,0xFF,0x03,0x24, +0xF8,0x02,0x06,0x36, +0x24,0x10,0x43,0x00, +0x00,0x00,0x82,0xA0, +0x00,0x00,0xC3,0x90, +0x10,0x00,0xA5,0x27, +0x21,0x20,0x00,0x00, +0x03,0x00,0x63,0x34, +0x00,0x00,0xC3,0xA0, +0x91,0x56,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xFF,0x00,0x84,0x30, +0x21,0x38,0x00,0x00, +0x21,0x28,0x00,0x00, +0x01,0x00,0xA3,0x24, +0x07,0x10,0xA4,0x00, +0x01,0x00,0x42,0x30, +0xFF,0x00,0x65,0x30, +0x01,0x00,0xE6,0x24, +0x02,0x00,0x40,0x14, +0x04,0x00,0xA3,0x2C, +0xFF,0x00,0xC7,0x30, +0xF7,0xFF,0x60,0x14, +0x21,0x10,0xE0,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x8C,0x30, +0x21,0x48,0x00,0x00, +0x21,0x38,0x00,0x00, +0x40,0x10,0x07,0x00, +0xFF,0x00,0x42,0x30, +0x21,0x50,0x46,0x00, +0x01,0x00,0xE3,0x24, +0x07,0x10,0xEC,0x00, +0x01,0x00,0x42,0x30, +0xFF,0x00,0x67,0x30, +0x21,0x58,0x25,0x01, +0x01,0x00,0x24,0x25, +0x09,0x00,0x40,0x14, +0x04,0x00,0xE8,0x2C, +0x00,0x00,0x63,0x91, +0xFF,0x00,0x89,0x30, +0x21,0x20,0x25,0x01, +0x00,0x00,0x43,0xA1, +0x00,0x00,0x83,0x90, +0x01,0x00,0x22,0x25, +0xFF,0x00,0x49,0x30, +0x01,0x00,0x43,0xA1, +0xED,0xFF,0x00,0x15, +0x40,0x10,0x07,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x01,0x00,0x12,0x24, +0x21,0x80,0x00,0x00, +0x57,0x57,0x00,0x08, +0xFF,0x00,0x11,0x24, +0x91,0x56,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0x40,0x10, +0x00,0x02,0x03,0x2E, +0x0F,0x00,0x60,0x10, +0x21,0x10,0x00,0x02, +0x10,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x51,0x10, +0x0F,0x00,0x44,0x30, +0x15,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x40,0x10,0x02,0x00, +0x21,0x10,0x50,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x50,0x30, +0x21,0x20,0x00,0x02, +0xEE,0xFF,0x40,0x16, +0x10,0x00,0xA5,0x27, +0x21,0x10,0x00,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xB8,0xFF,0xBD,0x27, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x28,0x00,0xB2,0xAF, +0x21,0x98,0xA0,0x00, +0xFF,0x00,0x96,0x30, +0x01,0x00,0x10,0x24, +0x01,0x00,0x17,0x24, +0x21,0xA0,0x00,0x00, +0x21,0x88,0x00,0x00, +0x21,0xA8,0x00,0x00, +0x04,0x00,0xA0,0x10, +0x21,0x18,0x00,0x00, +0x10,0x00,0xC2,0x2E, +0x0E,0x00,0x40,0x14, +0x21,0x20,0xA0,0x00, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x08,0x00,0x06,0x24, +0xFF,0x51,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x18,0x00,0xA4,0x27, +0xFF,0x00,0x05,0x24, +0xFF,0x51,0x00,0x0C, +0x08,0x00,0x06,0x24, +0xE6,0x56,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x96,0x57,0x00,0x08, +0x10,0x00,0xBE,0x27, +0x1C,0x00,0x40,0x14, +0x21,0x20,0xA0,0x02, +0x37,0x00,0xE0,0x12, +0x00,0x02,0x22,0x2E, +0x35,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x02,0x32, +0xF8,0xFF,0x40,0x10, +0x20,0x00,0x02,0x32, +0x21,0x20,0x20,0x02, +0x91,0x56,0x00,0x0C, +0x10,0x00,0xA5,0x27, +0x2D,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x10,0x00,0xB0,0x93, +0x00,0x00,0x00,0x00, +0x29,0x00,0x02,0x12, +0x0F,0x00,0x15,0x32, +0x15,0x57,0x00,0x0C, +0x21,0x20,0xA0,0x02, +0x02,0x81,0x10,0x00, +0x10,0x00,0x16,0x12, +0x21,0xA0,0x40,0x00, +0x40,0x10,0x14,0x00, +0x21,0x10,0x51,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x51,0x30, +0x92,0x57,0x00,0x08, +0x01,0x00,0x10,0x24, +0x18,0x00,0xA5,0x27, +0x24,0x57,0x00,0x0C, +0x21,0x30,0x60,0x02, +0x40,0x10,0x14,0x00, +0x21,0x10,0x51,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x51,0x30, +0x92,0x57,0x00,0x08, +0x01,0x00,0x10,0x24, +0x40,0x90,0x02,0x00, +0x10,0x00,0x40,0x1A, +0x21,0x80,0x00,0x00, +0x21,0x20,0x30,0x02, +0x01,0x00,0x84,0x24, +0xFF,0xFF,0x84,0x30, +0x91,0x56,0x00,0x0C, +0x10,0x00,0xA5,0x27, +0x01,0x00,0x03,0x26, +0x21,0x20,0xD0,0x03, +0xFF,0x00,0x70,0x30, +0x04,0x00,0x40,0x10, +0x2A,0x18,0x12,0x02, +0x10,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x08,0x00,0x82,0xA0, +0xF3,0xFF,0x60,0x14, +0x21,0x20,0x30,0x02, +0x92,0x57,0x00,0x08, +0x20,0x00,0x10,0x24, +0xE6,0x56,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x00,0x00,0x63,0x92, +0xFF,0x00,0x02,0x24, +0x0F,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x01,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0xF0,0xFF,0x43,0x14, +0x01,0x00,0x03,0x24, +0x02,0x00,0x63,0x92, +0x00,0x00,0x00,0x00, +0xEB,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x03,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0x43,0x14, +0x01,0x00,0x03,0x24, +0x04,0x00,0x63,0x92, +0x00,0x00,0x00,0x00, +0xE3,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x05,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0xDF,0xFF,0x43,0x14, +0x00,0x00,0x00,0x00, +0x06,0x00,0x67,0x92, +0x00,0x00,0x00,0x00, +0xDC,0xFF,0xE2,0x14, +0x01,0x00,0x03,0x24, +0x07,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0x7F,0xFF,0x47,0x10, +0x21,0x18,0x00,0x00, +0xD1,0x57,0x00,0x08, +0x01,0x00,0x03,0x24, +0xC0,0xFF,0xBD,0x27, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x21,0xF0,0xC0,0x00, +0xFF,0x00,0xB6,0x30, +0xFF,0xFF,0x95,0x30, +0xFF,0x00,0x05,0x24, +0x10,0x00,0xA4,0x27, +0x08,0x00,0x06,0x24, +0x34,0x00,0xB7,0xAF, +0x24,0x00,0xB3,0xAF, +0x3C,0x00,0xBF,0xAF, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0xFF,0x51,0x00,0x0C, +0x0F,0x00,0x17,0x24, +0x21,0x98,0x00,0x00, +0x40,0x10,0x13,0x00, +0xFF,0x00,0x52,0x30, +0x07,0x10,0x76,0x02, +0x01,0x00,0x42,0x30, +0x21,0xA0,0x5E,0x02, +0x21,0x88,0xA0,0x02, +0x21,0x20,0xA0,0x02, +0x13,0x00,0x40,0x10, +0x01,0x00,0xA3,0x26, +0x01,0x00,0x62,0x26, +0xFF,0x00,0x53,0x30, +0x04,0x00,0x63,0x2E, +0xF4,0xFF,0x60,0x14, +0x40,0x10,0x13,0x00, +0x21,0x10,0xE0,0x02, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x85,0x92, +0xFF,0xFF,0x75,0x30, +0xBE,0x56,0x00,0x0C, +0x21,0x80,0xA0,0x02, +0x01,0x00,0x85,0x92, +0x21,0x20,0xA0,0x02, +0x01,0x00,0xA2,0x26, +0xBE,0x56,0x00,0x0C, +0xFF,0xFF,0x55,0x30, +0x10,0x00,0xA3,0x27, +0x21,0x90,0x72,0x00, +0x21,0x20,0x20,0x02, +0x91,0x56,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x21,0x20,0x00,0x02, +0x91,0x56,0x00,0x0C, +0x01,0x00,0x45,0x26, +0x00,0x00,0x84,0x92, +0x00,0x00,0x42,0x92, +0x01,0x00,0x03,0x24, +0x04,0x18,0x63,0x02, +0x03,0x00,0x82,0x10, +0x27,0x30,0x03,0x00, +0x19,0x58,0x00,0x08, +0x24,0xB8,0xD7,0x00, +0x01,0x00,0x83,0x92, +0x01,0x00,0x42,0x92, +0x00,0x00,0x00,0x00, +0xD2,0xFF,0x62,0x10, +0x01,0x00,0x62,0x26, +0x1A,0x58,0x00,0x08, +0x24,0xB8,0xD7,0x00, +0x98,0xFF,0xBD,0x27, +0x50,0x00,0xB4,0xAF, +0xFF,0x00,0x94,0x30, +0x01,0x00,0x04,0x24, +0x64,0x00,0xBF,0xAF, +0x60,0x00,0xBE,0xAF, +0x5C,0x00,0xB7,0xAF, +0x58,0x00,0xB6,0xAF, +0x4C,0x00,0xB3,0xAF, +0x48,0x00,0xB2,0xAF, +0x44,0x00,0xB1,0xAF, +0x21,0x98,0xC0,0x00, +0xFF,0x00,0xB1,0x30, +0x54,0x00,0xB5,0xAF, +0xE6,0x56,0x00,0x0C, +0x40,0x00,0xB0,0xAF, +0x3E,0x57,0x00,0x0C, +0x01,0x00,0x16,0x24, +0x21,0x18,0x40,0x00, +0xFF,0x01,0x42,0x2C, +0x01,0x00,0x17,0x24, +0x01,0x00,0x1E,0x24, +0x21,0x90,0x00,0x00, +0x0E,0x00,0x40,0x14, +0x21,0x20,0x00,0x00, +0x64,0x00,0xBF,0x8F, +0x60,0x00,0xBE,0x8F, +0x5C,0x00,0xB7,0x8F, +0x58,0x00,0xB6,0x8F, +0x54,0x00,0xB5,0x8F, +0x50,0x00,0xB4,0x8F, +0x4C,0x00,0xB3,0x8F, +0x48,0x00,0xB2,0x8F, +0x44,0x00,0xB1,0x8F, +0x40,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x68,0x00,0xBD,0x27, +0xFF,0x01,0x02,0x24, +0x23,0x10,0x43,0x00, +0x1A,0x00,0xA4,0x27, +0xFF,0x00,0x05,0x24, +0x08,0x00,0x06,0x24, +0xFF,0xFF,0x50,0x30, +0x18,0x00,0xB4,0xA3, +0xFF,0x51,0x00,0x0C, +0x19,0x00,0xB1,0xA3, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x02, +0x24,0x57,0x00,0x0C, +0x1A,0x00,0xA6,0x27, +0x19,0x00,0xA4,0x93, +0x15,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0xA8,0x40,0x00, +0xFF,0xFF,0x42,0x30, +0x2B,0x10,0x02,0x02, +0xDF,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0x01,0x00,0x02,0x24, +0x09,0x00,0xC2,0x12, +0x20,0x00,0x02,0x24, +0x22,0x00,0xC2,0x12, +0x00,0x00,0x00,0x00, +0x3B,0x00,0xE0,0x12, +0x00,0x02,0x42,0x2E, +0x39,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0xF9,0xFF,0xC2,0x16, +0x20,0x00,0x02,0x24, +0x21,0x20,0x40,0x02, +0x10,0x00,0xA5,0x27, +0x91,0x56,0x00,0x0C, +0x01,0x00,0x13,0x24, +0x41,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x10,0x00,0xA5,0x93, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xA4,0x30, +0x3C,0x00,0x82,0x10, +0x0F,0x00,0xA3,0x30, +0x02,0x11,0x04,0x00, +0x21,0x20,0x60,0x00, +0x29,0x00,0xA3,0xA3, +0x28,0x00,0xA2,0xA3, +0x15,0x57,0x00,0x0C, +0x11,0x00,0xA5,0xA3, +0x21,0x80,0x40,0x00, +0x28,0x00,0xA3,0x93, +0x18,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x5F,0x00,0x62,0x10, +0x40,0x10,0x10,0x00, +0x21,0x10,0x52,0x00, +0x01,0x00,0x42,0x24, +0x8B,0x58,0x00,0x08, +0xFF,0xFF,0x52,0x30, +0x19,0x00,0xA5,0x93, +0x01,0x00,0x44,0x26, +0xFF,0xFF,0x84,0x30, +0xFC,0x57,0x00,0x0C, +0x1A,0x00,0xA6,0x27, +0x21,0x28,0x40,0x00, +0x0F,0x00,0x43,0x30, +0x0F,0x00,0x02,0x24, +0x12,0x00,0x62,0x10, +0x40,0x10,0x15,0x00, +0x21,0x10,0x52,0x00, +0x01,0x00,0x42,0x24, +0x21,0x20,0xA0,0x00, +0xFF,0xFF,0x52,0x30, +0x18,0x00,0xB4,0xA3, +0x15,0x57,0x00,0x0C, +0x19,0x00,0xA5,0xA3, +0x21,0xA8,0x40,0x00, +0x02,0x80,0x03,0x3C, +0x04,0xE4,0x62,0x8C, +0x02,0x80,0x04,0x3C, +0x01,0x00,0x16,0x24, +0x01,0x00,0x42,0x24, +0x04,0x00,0x43,0x28, +0xC6,0xFF,0x60,0x14, +0x04,0xE4,0x82,0xAC, +0x21,0xF0,0x00,0x00, +0xE6,0x56,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x21,0x20,0xC0,0x03, +0x64,0x00,0xBF,0x8F, +0x60,0x00,0xBE,0x8F, +0x5C,0x00,0xB7,0x8F, +0x58,0x00,0xB6,0x8F, +0x54,0x00,0xB5,0x8F, +0x50,0x00,0xB4,0x8F, +0x4C,0x00,0xB3,0x8F, +0x48,0x00,0xB2,0x8F, +0x44,0x00,0xB1,0x8F, +0x40,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x68,0x00,0xBD,0x27, +0x3E,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFF,0x01,0x03,0x24, +0x23,0x18,0x62,0x00, +0xFF,0xFF,0x70,0x30, +0xFF,0xFF,0xA2,0x32, +0x2B,0x10,0x02,0x02, +0xE7,0xFF,0x40,0x14, +0x21,0x20,0x40,0x02, +0x18,0x00,0xB0,0x93, +0x19,0x00,0xA2,0x93, +0x00,0x81,0x10,0x00, +0x25,0x80,0x02,0x02, +0xFF,0x00,0x10,0x32, +0xBE,0x56,0x00,0x0C, +0x21,0x28,0x00,0x02, +0x21,0x20,0x40,0x02, +0x91,0x56,0x00,0x0C, +0x11,0x00,0xA5,0x27, +0x11,0x00,0xA3,0x93, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x64,0x30, +0x9D,0xFF,0x90,0x10, +0x20,0x00,0x16,0x24, +0xFF,0x00,0x02,0x24, +0xCD,0xFF,0x82,0x10, +0x0F,0x00,0x63,0x30, +0x02,0x11,0x04,0x00, +0x21,0x20,0x60,0x00, +0x29,0x00,0xA3,0xA3, +0x15,0x57,0x00,0x0C, +0x28,0x00,0xA2,0xA3, +0x38,0x00,0xA4,0x27, +0xFF,0x00,0x05,0x24, +0x08,0x00,0x06,0x24, +0xFF,0x51,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x28,0x00,0xA4,0x93, +0x61,0x57,0x00,0x0C, +0x38,0x00,0xA5,0x27, +0x1F,0x00,0x40,0x14, +0x01,0x00,0x44,0x26, +0x40,0x10,0x10,0x00, +0x21,0x10,0x52,0x00, +0x01,0x00,0x42,0x24, +0xBE,0x58,0x00,0x08, +0xFF,0xFF,0x52,0x30, +0x40,0x88,0x10,0x00, +0x27,0x00,0x20,0x1A, +0x21,0x80,0x00,0x00, +0xFF,0x00,0x16,0x24, +0x21,0x20,0x50,0x02, +0x01,0x00,0x84,0x24, +0xFF,0xFF,0x84,0x30, +0x91,0x56,0x00,0x0C, +0x10,0x00,0xA5,0x27, +0x01,0x00,0x03,0x26, +0xFF,0x00,0x70,0x30, +0x05,0x00,0x40,0x10, +0x2A,0x18,0x11,0x02, +0x10,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x26,0x10,0x56,0x00, +0x0B,0x98,0x02,0x00, +0xF3,0xFF,0x60,0x14, +0x21,0x20,0x50,0x02, +0x15,0x00,0x60,0x16, +0x21,0x10,0x32,0x02, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x52,0x30, +0x8B,0x58,0x00,0x08, +0x01,0x00,0x16,0x24, +0x29,0x00,0xA5,0x93, +0xFF,0xFF,0x84,0x30, +0xFC,0x57,0x00,0x0C, +0x38,0x00,0xA6,0x27, +0x21,0x28,0x40,0x00, +0x0F,0x00,0x43,0x30, +0x0F,0x00,0x02,0x24, +0xDB,0xFF,0x62,0x10, +0x40,0x10,0x10,0x00, +0x28,0x00,0xA4,0x93, +0x4B,0x58,0x00,0x0C, +0x38,0x00,0xA6,0x27, +0x3E,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xBE,0x58,0x00,0x08, +0x21,0x90,0x40,0x00, +0x19,0x00,0xA3,0x93, +0x29,0x00,0xA6,0x93, +0x0F,0x00,0x13,0x24, +0x0E,0x00,0x10,0x24, +0x25,0x18,0x66,0x00, +0x01,0x00,0x62,0x30, +0x0A,0x98,0x02,0x02, +0x02,0x00,0x64,0x30, +0xFD,0x00,0x62,0x32, +0x0A,0x98,0x44,0x00, +0x04,0x00,0x65,0x30, +0xFB,0x00,0x62,0x32, +0x0A,0x98,0x45,0x00, +0x08,0x00,0x63,0x30, +0xF7,0x00,0x62,0x32, +0x0A,0x98,0x43,0x00, +0x0F,0x00,0x64,0x32, +0x0F,0x00,0x16,0x24, +0x25,0x00,0x96,0x10, +0x21,0x28,0xC0,0x00, +0x01,0x00,0x44,0x26, +0xFF,0xFF,0x84,0x30, +0xFC,0x57,0x00,0x0C, +0x1A,0x00,0xA6,0x27, +0x21,0x28,0x40,0x00, +0x0F,0x00,0x42,0x30, +0x03,0x00,0x56,0x10, +0x21,0x20,0x80,0x02, +0x4B,0x58,0x00,0x0C, +0x38,0x00,0xA6,0x27, +0x19,0x00,0xA5,0x93, +0x00,0x00,0x00,0x00, +0x26,0x10,0x65,0x02, +0x01,0x00,0x42,0x30, +0x0A,0x80,0xC2,0x02, +0x26,0x18,0x65,0x02, +0x02,0x00,0x63,0x30, +0xFD,0x00,0x04,0x32, +0x0B,0x80,0x83,0x00, +0x26,0x10,0x65,0x02, +0x04,0x00,0x42,0x30, +0xFB,0x00,0x03,0x32, +0x0B,0x80,0x62,0x00, +0x26,0x28,0x65,0x02, +0x08,0x00,0xA5,0x30, +0xF7,0x00,0x02,0x32, +0x0B,0x80,0x45,0x00, +0x0F,0x00,0x03,0x32, +0x0D,0x00,0x76,0x10, +0x00,0x00,0x00,0x00, +0x3E,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x90,0x40,0x00, +0x19,0x00,0xB0,0xA3, +0xBE,0x58,0x00,0x08, +0x18,0x00,0xB4,0xA3, +0x21,0x10,0x32,0x02, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x52,0x30, +0x01,0x00,0x16,0x24, +0x8B,0x58,0x00,0x08, +0x18,0x00,0xB4,0xA3, +0xBE,0x58,0x00,0x08, +0x21,0xB8,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xBC,0x65,0x42,0x24, +0x18,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x83,0x90, +0x30,0x00,0x02,0x24, +0x05,0x00,0x62,0x10, +0x21,0x20,0x00,0x00, +0x31,0x00,0x02,0x24, +0x02,0x00,0x62,0x10, +0x01,0x00,0x04,0x24, +0x07,0x00,0x04,0x24, +0x93,0x55,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xF8,0x65,0x42,0x24, +0x18,0x03,0x63,0x34, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x62,0xAC, +0x08,0x00,0xE0,0x03, +0x14,0x5E,0x80,0xAC, +0x42,0xB0,0x02,0x3C, +0x03,0x00,0x47,0x34, +0x00,0x00,0xE3,0x90, +0xFF,0x00,0x84,0x30, +0x04,0x00,0x84,0x24, +0xFF,0x00,0x65,0x30, +0x01,0x00,0x02,0x24, +0x04,0x30,0x82,0x00, +0x07,0x18,0x85,0x00, +0x25,0xB0,0x02,0x3C, +0xE8,0x03,0x42,0x34, +0x01,0x00,0x63,0x30, +0x21,0x20,0xC0,0x00, +0x00,0x00,0x45,0xA0, +0x02,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0xA0, +0x08,0x00,0xE0,0x03, +0x24,0x10,0x85,0x00, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0x08,0xE4,0x42,0x24, +0x04,0x00,0x45,0x8C, +0x00,0x00,0x82,0xAC, +0x04,0x00,0x44,0xAC, +0x00,0x00,0xA4,0xAC, +0x04,0x00,0x85,0xAC, +0x00,0x60,0x83,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x04,0x00,0x85,0x8C, +0x00,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAC, +0x04,0x00,0x45,0xAC, +0x00,0x00,0x84,0xAC, +0x04,0x00,0x84,0xAC, +0x00,0x60,0x83,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x24,0x04,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x18,0x04,0x00, +0x21,0x18,0x64,0x00, +0x80,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x1C,0x24,0x64,0x8C, +0xFF,0xF1,0x02,0x24, +0x24,0x20,0x82,0x00, +0x08,0x00,0xE0,0x03, +0x1C,0x24,0x64,0xAC, +0x02,0x24,0x04,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x18,0x04,0x00, +0x21,0x18,0x64,0x00, +0x80,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x1C,0x24,0x64,0x8C, +0xFF,0xF1,0x02,0x24, +0x24,0x20,0x82,0x00, +0x00,0x02,0x84,0x34, +0x08,0x00,0xE0,0x03, +0x1C,0x24,0x64,0xAC, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0xC0,0x80,0x04,0x00, +0x21,0x80,0x04,0x02, +0x80,0x80,0x10,0x00, +0x21,0x80,0x04,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x80,0x10,0x00, +0x21,0x80,0x02,0x02, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x24,0x05,0x8E, +0xFF,0x1F,0x02,0x3C, +0x25,0xB0,0x12,0x3C, +0xFF,0xFF,0x42,0x34, +0x14,0x24,0x02,0xAE, +0x84,0x01,0x43,0x36, +0xF8,0xFF,0x02,0x24, +0x00,0x00,0x66,0x8C, +0x24,0x28,0xA2,0x00, +0xFF,0xFE,0x02,0x24, +0x24,0x28,0xA2,0x00, +0xFF,0xEF,0x03,0x24, +0x24,0x28,0xA3,0x00, +0x18,0x24,0x06,0xAE, +0x1C,0x24,0x05,0xAE, +0xC9,0x24,0x00,0x0C, +0x21,0x88,0x80,0x00, +0x1E,0x24,0x02,0x92, +0x21,0x88,0x32,0x02, +0x1C,0x00,0xBF,0x8F, +0x60,0x01,0x22,0xA2, +0x18,0x00,0xB2,0x8F, +0x08,0x24,0x00,0xAE, +0xEC,0x23,0x00,0xAE, +0xF0,0x23,0x00,0xAE, +0xF4,0x23,0x00,0xAE, +0xF8,0x23,0x00,0xAE, +0xFC,0x23,0x00,0xAE, +0x00,0x24,0x00,0xAE, +0x04,0x24,0x00,0xAE, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xFF,0x00,0xA5,0x30, +0xC0,0x10,0x05,0x00, +0x21,0x10,0x45,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x1C,0x24,0x43,0x8C, +0x25,0xB0,0x05,0x3C, +0xFF,0x00,0xC6,0x30, +0x21,0x30,0xC5,0x00, +0xAF,0x01,0xC2,0x90, +0x07,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x65,0x00, +0xFF,0x00,0x88,0x30, +0xFF,0x00,0x49,0x30, +0x84,0x01,0x66,0x8C, +0x21,0x50,0x00,0x00, +0x21,0x58,0x00,0x00, +0x2B,0x00,0x20,0x11, +0x21,0x20,0x00,0x01, +0x2B,0x00,0xC0,0x10, +0x2B,0x10,0x09,0x01, +0x21,0x28,0x00,0x00, +0x2D,0x5A,0x00,0x08, +0x01,0x00,0x07,0x24, +0xFF,0x00,0x65,0x30, +0x1D,0x00,0xA2,0x2C, +0x07,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x25, +0x04,0x10,0xA7,0x00, +0x24,0x10,0x46,0x00, +0xF9,0xFF,0x40,0x10, +0x01,0x00,0xA3,0x24, +0x21,0x58,0xA0,0x00, +0xFF,0xFF,0x02,0x25, +0xFF,0x00,0x45,0x30, +0x2B,0x18,0xAB,0x00, +0x0F,0x00,0x60,0x14, +0x2B,0x10,0x49,0x01, +0x01,0x00,0x04,0x24, +0x04,0x10,0xA4,0x00, +0x24,0x10,0x46,0x00, +0xFF,0xFF,0xA7,0x24, +0x04,0x00,0x40,0x10, +0x01,0x00,0x43,0x25, +0x17,0x00,0x49,0x11, +0xFF,0x00,0x6A,0x30, +0x21,0x40,0xA0,0x00, +0xFF,0x00,0xE5,0x30, +0x2B,0x10,0xAB,0x00, +0xF6,0xFF,0x40,0x10, +0x04,0x10,0xA4,0x00, +0x2B,0x10,0x49,0x01, +0x08,0x00,0x40,0x10, +0x21,0x20,0x00,0x01, +0x23,0x10,0x2A,0x01, +0x2A,0x10,0x62,0x01, +0x04,0x00,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x69,0x01, +0x21,0x10,0x4A,0x00, +0xFF,0x00,0x44,0x30, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xFD,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x09,0x01, +0x4E,0x5A,0x00,0x08, +0xFF,0x00,0x44,0x30, +0x21,0x20,0x00,0x01, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x25,0xB0,0x06,0x3C, +0x1C,0x24,0x43,0x8C, +0xFF,0x00,0xA5,0x30, +0x21,0x20,0x86,0x00, +0x21,0x28,0xA6,0x00, +0x60,0x01,0x82,0x90, +0xAF,0x01,0xA4,0x90, +0x07,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x66,0x00, +0xFF,0x00,0x48,0x30, +0xFF,0x00,0x89,0x30, +0x84,0x01,0x66,0x8C, +0x21,0x50,0x00,0x00, +0x21,0x58,0x00,0x00, +0x2B,0x00,0x20,0x11, +0x21,0x20,0x00,0x01, +0x2B,0x00,0xC0,0x10, +0x2B,0x10,0x09,0x01, +0x21,0x28,0x00,0x00, +0x7B,0x5A,0x00,0x08, +0x01,0x00,0x07,0x24, +0xFF,0x00,0x65,0x30, +0x1D,0x00,0xA2,0x2C, +0x07,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x25, +0x04,0x10,0xA7,0x00, +0x24,0x10,0x46,0x00, +0xF9,0xFF,0x40,0x10, +0x01,0x00,0xA3,0x24, +0x21,0x58,0xA0,0x00, +0xFF,0xFF,0x02,0x25, +0xFF,0x00,0x45,0x30, +0x2B,0x18,0xAB,0x00, +0x0F,0x00,0x60,0x14, +0x2B,0x10,0x49,0x01, +0x01,0x00,0x04,0x24, +0x04,0x10,0xA4,0x00, +0x24,0x10,0x46,0x00, +0xFF,0xFF,0xA7,0x24, +0x04,0x00,0x40,0x10, +0x01,0x00,0x43,0x25, +0x17,0x00,0x49,0x11, +0xFF,0x00,0x6A,0x30, +0x21,0x40,0xA0,0x00, +0xFF,0x00,0xE5,0x30, +0x2B,0x10,0xAB,0x00, +0xF6,0xFF,0x40,0x10, +0x04,0x10,0xA4,0x00, +0x2B,0x10,0x49,0x01, +0x08,0x00,0x40,0x10, +0x21,0x20,0x00,0x01, +0x23,0x10,0x2A,0x01, +0x2A,0x10,0x62,0x01, +0x04,0x00,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x69,0x01, +0x21,0x10,0x4A,0x00, +0xFF,0x00,0x44,0x30, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xFD,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x09,0x01, +0x9C,0x5A,0x00,0x08, +0xFF,0x00,0x44,0x30, +0x21,0x20,0x00,0x01, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x50,0x24, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x88,0x00,0x00, +0x21,0x90,0x00,0x02, +0xDD,0x59,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x1E,0x24,0x02,0x92, +0x21,0x28,0x00,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x52,0x00, +0x60,0x05,0x44,0x8C, +0xD4,0x05,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x64,0x00, +0x42,0x18,0x03,0x00, +0xE8,0x23,0x03,0xAE, +0x21,0x10,0x05,0x02, +0x01,0x00,0xA5,0x24, +0x1D,0x00,0xA3,0x28, +0x5A,0x24,0x40,0xA0, +0x20,0x24,0x40,0xA0, +0xFA,0xFF,0x60,0x14, +0x3D,0x24,0x40,0xA0, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x78,0x24,0x00,0xAE, +0xE9,0xFF,0x40,0x14, +0x94,0x00,0x10,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x28,0x00,0xB6,0xAF, +0x02,0x80,0x16,0x3C, +0x24,0x00,0xB5,0xAF, +0x30,0x1F,0xC6,0x26, +0x2C,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x38,0xC2,0x8C, +0xFF,0x00,0x8D,0x30, +0xFF,0x00,0x03,0x24, +0xFF,0xFF,0x42,0x38, +0x21,0xA8,0x00,0x00, +0xFF,0xFF,0x04,0x34, +0x0A,0xA8,0x62,0x00, +0xA4,0x00,0xA0,0x11, +0x30,0x38,0xC4,0xAC, +0x02,0x80,0x02,0x3C, +0xE4,0xE7,0x45,0x24, +0x04,0x05,0xC4,0x24, +0xEB,0x5A,0x00,0x08, +0x21,0x80,0x00,0x00, +0x01,0x00,0x10,0x26, +0x00,0x00,0x82,0xA0, +0x1D,0x00,0x02,0x2A, +0x0B,0x00,0x40,0x10, +0x01,0x00,0x84,0x24, +0x21,0x10,0x05,0x02, +0x00,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0xF7,0xFF,0x40,0x10, +0xFD,0xFF,0x43,0x24, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0x00,0x00,0x83,0xA0, +0xF7,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4A,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x7C,0xE5,0x6C,0x24, +0x04,0xE5,0x4B,0x24, +0x21,0x80,0x00,0x00, +0x21,0x48,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x40,0x2A,0x01, +0x21,0x38,0x2C,0x01, +0x21,0x10,0xE6,0x00, +0x91,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x06,0x01, +0x01,0x00,0xC6,0x24, +0x05,0x00,0xC2,0x28, +0x39,0x04,0x64,0xA0, +0xF8,0xFF,0x40,0x14, +0xA8,0x03,0x65,0xA0, +0x21,0x10,0x0B,0x02, +0x1D,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x0A,0x02, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0xE7,0x04,0x64,0xA0, +0xCA,0x04,0x65,0xA0, +0xEB,0xFF,0x40,0x14, +0x05,0x00,0x29,0x25, +0x9A,0x00,0xA0,0x11, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x48,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x69,0x24, +0x04,0xE8,0x47,0x24, +0x21,0x80,0x00,0x00, +0x80,0x18,0x10,0x00, +0x21,0x10,0x69,0x00, +0x21,0x20,0x67,0x00, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x85,0x8C, +0x01,0x00,0x10,0x26, +0x21,0x18,0x68,0x00, +0x04,0x00,0x02,0x2A, +0x60,0x05,0x65,0xAC, +0xF6,0xFF,0x40,0x14, +0xD4,0x05,0x66,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x49,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x68,0x24, +0x04,0xE8,0x47,0x24, +0x04,0x00,0x10,0x24, +0x80,0x20,0x10,0x00, +0x21,0x10,0x88,0x00, +0x21,0x30,0x87,0x00, +0x00,0x00,0x45,0x8C, +0x00,0x00,0xC3,0x8C, +0x01,0x00,0x10,0x26, +0x21,0x20,0x89,0x00, +0x82,0x28,0x05,0x00, +0x82,0x18,0x03,0x00, +0x1D,0x00,0x02,0x2A, +0x60,0x05,0x83,0xAC, +0xF4,0xFF,0x40,0x14, +0xD4,0x05,0x85,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x53,0x24, +0x21,0x80,0x00,0x00, +0x21,0xA0,0x60,0x02, +0x21,0x90,0x00,0x00, +0x46,0x5B,0x00,0x08, +0x21,0x88,0x60,0x02, +0x01,0x00,0x10,0x26, +0x20,0x00,0x02,0x2A, +0x94,0x00,0x31,0x26, +0x32,0x00,0x40,0x10, +0x94,0x00,0x52,0x26, +0x1C,0x24,0x24,0x8E, +0x01,0x00,0x03,0x24, +0x02,0x13,0x04,0x00, +0x01,0x00,0x42,0x30, +0xF6,0xFF,0x43,0x14, +0x07,0x00,0x82,0x30, +0x25,0xB0,0x03,0x3C, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x84,0x01,0x45,0x8C, +0x14,0x24,0x23,0x8E, +0x21,0x20,0x00,0x02, +0x24,0x28,0xA3,0x00, +0xC9,0x24,0x00,0x0C, +0x18,0x24,0x25,0xAE, +0x1E,0x24,0x24,0x92, +0x57,0x24,0x00,0x0C, +0xFF,0x00,0x05,0x32, +0x1E,0x24,0x23,0x92, +0xEC,0x23,0x20,0xAE, +0xF0,0x23,0x20,0xAE, +0x80,0x18,0x03,0x00, +0xF4,0x23,0x20,0xAE, +0xF8,0x23,0x20,0xAE, +0xFC,0x23,0x20,0xAE, +0x00,0x24,0x20,0xAE, +0x04,0x24,0x20,0xAE, +0x08,0x24,0x20,0xAE, +0x21,0x18,0x74,0x00, +0x60,0x05,0x64,0x8C, +0xD4,0x05,0x62,0x8C, +0x21,0x30,0x00,0x00, +0x21,0x28,0x53,0x02, +0x21,0x10,0x44,0x00, +0x42,0x10,0x02,0x00, +0xE8,0x23,0x22,0xAE, +0x21,0x10,0xA6,0x00, +0x01,0x00,0xC6,0x24, +0x1D,0x00,0xC3,0x28, +0x5A,0x24,0x40,0xA0, +0x20,0x24,0x40,0xA0, +0xFA,0xFF,0x60,0x14, +0x3D,0x24,0x40,0xA0, +0x01,0x00,0x10,0x26, +0x20,0x00,0x02,0x2A, +0x78,0x24,0xA0,0xAC, +0x94,0x00,0x31,0x26, +0xD0,0xFF,0x40,0x14, +0x94,0x00,0x52,0x26, +0x02,0x00,0xA0,0x16, +0x30,0x1F,0xC2,0x26, +0x30,0x38,0x40,0xAC, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0xE4,0xE7,0x45,0x24, +0x04,0x05,0xC4,0x24, +0x21,0x80,0x00,0x00, +0x21,0x10,0x05,0x02, +0x00,0x00,0x43,0x90, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0x00,0x00,0x83,0xA0, +0xFA,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4A,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xA0,0xE6,0x6C,0x24, +0x40,0xE5,0x4B,0x24, +0x21,0x80,0x00,0x00, +0x21,0x48,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x40,0x2A,0x01, +0x21,0x38,0x2C,0x01, +0x21,0x10,0xE6,0x00, +0x91,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x06,0x01, +0x01,0x00,0xC6,0x24, +0x05,0x00,0xC2,0x28, +0x39,0x04,0x64,0xA0, +0xF8,0xFF,0x40,0x14, +0xA8,0x03,0x65,0xA0, +0x21,0x10,0x0B,0x02, +0x1D,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x0A,0x02, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0xE7,0x04,0x64,0xA0, +0xCA,0x04,0x65,0xA0, +0xEB,0xFF,0x40,0x14, +0x05,0x00,0x29,0x25, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x49,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x68,0x24, +0x04,0xE8,0x47,0x24, +0x21,0x80,0x00,0x00, +0x80,0x18,0x10,0x00, +0x21,0x10,0x68,0x00, +0x21,0x20,0x67,0x00, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x85,0x8C, +0x01,0x00,0x10,0x26, +0x21,0x18,0x69,0x00, +0x1D,0x00,0x02,0x2A, +0x60,0x05,0x65,0xAC, +0xF6,0xFF,0x40,0x14, +0xD4,0x05,0x66,0xAC, +0x3B,0x5B,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xD8,0xFF,0xBD,0x27, +0xFF,0xFF,0x84,0x30, +0x18,0x00,0xB2,0xAF, +0xF0,0x01,0x92,0x30, +0x02,0x91,0x12,0x00, +0x14,0x00,0xB1,0xAF, +0xC0,0x88,0x12,0x00, +0x21,0x88,0x32,0x02, +0x80,0x88,0x11,0x00, +0x21,0x88,0x32,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x88,0x11,0x00, +0x21,0x88,0x22,0x02, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x24,0x30,0x8E, +0x00,0x02,0x82,0x30, +0xFF,0xFE,0x03,0x24, +0x2B,0x10,0x02,0x00, +0x00,0x10,0x10,0x36, +0x24,0x80,0x03,0x02, +0x00,0x12,0x02,0x00, +0x25,0x80,0x02,0x02, +0x14,0x24,0x25,0xAE, +0x1C,0x24,0x30,0xAE, +0x76,0x25,0x00,0x0C, +0x21,0x98,0xA0,0x00, +0xF8,0xFF,0x03,0x24, +0x24,0x80,0x03,0x02, +0x07,0x00,0x42,0x30, +0x25,0x80,0x02,0x02, +0x07,0x00,0x03,0x32, +0x25,0xB0,0x02,0x3C, +0x80,0x18,0x03,0x00, +0x1C,0x24,0x30,0xAE, +0x21,0x18,0x62,0x00, +0x84,0x01,0x62,0x8C, +0x21,0x20,0x40,0x02, +0x24,0x10,0x53,0x00, +0xC9,0x24,0x00,0x0C, +0x18,0x24,0x22,0xAE, +0x1E,0x24,0x24,0x92, +0x21,0x28,0x40,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x57,0x24,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xDD,0x59,0x00,0x08, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0x1F,0x00,0x04,0x24, +0x1C,0x24,0x62,0x8C, +0xFF,0xFF,0x84,0x24, +0x00,0x10,0x42,0x34, +0x1C,0x24,0x62,0xAC, +0xFB,0xFF,0x81,0x04, +0x94,0x00,0x63,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x44,0x00,0x02,0x24, +0x10,0x00,0xA2,0xA3, +0x49,0x00,0x03,0x24, +0x47,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0xD4,0xF3,0xE7,0x24, +0x11,0x00,0xA3,0xA3, +0x12,0x00,0xA2,0xA3, +0x10,0x27,0x03,0x24, +0x01,0x00,0x02,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x20,0x73,0xC6,0x24, +0x0C,0x00,0xE3,0xAC, +0x14,0x00,0xE2,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x03,0x0D,0x64,0x34, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x54,0x30, +0x70,0x00,0x93,0x32, +0x5D,0x00,0x60,0x12, +0x42,0x00,0x63,0x34, +0x8F,0x00,0x82,0x32, +0x00,0x00,0x82,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x55,0x00,0x60,0x12, +0x00,0x00,0x00,0x00, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x11,0x3C, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x21,0xA8,0x40,0x00, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x21,0xB0,0x40,0x00, +0x00,0x60,0x92,0x40, +0x64,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x08,0x00,0x10,0x3C, +0xFF,0xFF,0x10,0x36, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x01,0x00,0x12,0x3C, +0x24,0x30,0xB0,0x02, +0x25,0x30,0xD2,0x00, +0xFF,0xFF,0x25,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x24,0x80,0xD0,0x02, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x25,0x30,0x12,0x02, +0xFF,0xFF,0x25,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x10,0x3C, +0x18,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x36, +0x21,0x88,0x40,0x00, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x18,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x00,0x80,0x26,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0x25,0x00,0x60,0x16, +0x25,0xB0,0x02,0x3C, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x25,0xB0,0x02,0x3C, +0x42,0x00,0x42,0x34, +0x30,0x00,0xBD,0x27, +0x00,0x00,0x40,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x10,0x3C, +0x18,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x36, +0x21,0x88,0x40,0x00, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x18,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x00,0x80,0x26,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xDD,0xFF,0x60,0x12, +0x25,0xB0,0x02,0x3C, +0x03,0x0D,0x42,0x34, +0x00,0x00,0x54,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x0F,0x00,0x10,0x3C, +0x21,0x30,0xA0,0x02, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x21,0x30,0xC0,0x02, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x20,0x00,0x00, +0xE6,0x44,0x00,0x08, +0x30,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x02,0x80,0x14,0x3C, +0x30,0x00,0xB6,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x30,0x1F,0x85,0x26, +0x0C,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x17,0x02,0x00, +0x01,0x00,0x42,0x30, +0x08,0x00,0x40,0x14, +0x06,0x00,0x16,0x24, +0x08,0x00,0xA2,0x8C, +0x01,0x00,0x03,0x24, +0x42,0x17,0x02,0x00, +0x03,0x00,0x42,0x30, +0x57,0x00,0x43,0x10, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0x85,0x26, +0x0C,0x00,0xA2,0x8C, +0x01,0x00,0x03,0x24, +0x82,0x17,0x02,0x00, +0x01,0x00,0x44,0x30, +0x0B,0x00,0x83,0x10, +0x21,0x10,0x00,0x00, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x08,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x42,0x17,0x02,0x00, +0x03,0x00,0x43,0x30, +0xF1,0xFF,0x64,0x14, +0x21,0x10,0x00,0x00, +0x10,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x17,0x02,0x00, +0x50,0x02,0x43,0x10, +0x25,0xB0,0x02,0x3C, +0xC7,0x02,0xB3,0x90, +0x62,0x0C,0x42,0x34, +0xFF,0x00,0x63,0x32, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x90,0x26, +0xC6,0x02,0x02,0x92, +0x00,0x00,0x00,0x00, +0x83,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0x25,0xB0,0x11,0x3C, +0x03,0x0D,0x23,0x36, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x70,0x00,0x42,0x30, +0xA9,0x00,0x40,0x14, +0xCC,0x00,0x02,0x24, +0xC4,0x02,0x02,0x96, +0x00,0x00,0x00,0x00, +0x23,0x20,0x53,0x00, +0x2B,0x18,0x53,0x00, +0x23,0x10,0x62,0x02, +0x0A,0x10,0x83,0x00, +0x03,0x00,0x42,0x2C, +0x76,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xC4,0x02,0x03,0x92, +0x63,0x0C,0x22,0x36, +0x21,0x20,0x00,0x00, +0x00,0x00,0x43,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x30,0x1F,0x83,0x26, +0xC3,0x02,0x62,0x90, +0x08,0x00,0x66,0x8C, +0xC2,0x02,0x73,0xA0, +0x23,0x20,0x53,0x00, +0x02,0x2C,0x06,0x00, +0x2B,0x40,0x62,0x02, +0x23,0x90,0x62,0x02, +0x0B,0x90,0x88,0x00, +0x3F,0x00,0xA7,0x30, +0x3F,0x00,0xC6,0x30, +0x24,0x00,0x02,0x24, +0x20,0x00,0x03,0x24, +0x23,0x10,0x46,0x00, +0x91,0x00,0x40,0x16, +0x23,0x20,0x67,0x00, +0xE6,0x5C,0x00,0x08, +0x00,0x00,0x00,0x00, +0x80,0x0C,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x21,0x30,0xA0,0x00, +0xC0,0xFF,0x02,0x3C, +0x24,0x20,0x62,0x00, +0x21,0x88,0x00,0x00, +0xC0,0xFF,0x05,0x3C, +0x42,0x5D,0x00,0x08, +0x18,0x00,0xC3,0x24, +0x01,0x00,0x31,0x26, +0x25,0x00,0x22,0x2E, +0x0D,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0xF8,0xFF,0x44,0x14, +0x04,0x00,0x63,0x24, +0x08,0x00,0xC2,0x8C, +0xC0,0xFF,0x03,0x24, +0x3F,0x00,0x24,0x32, +0x24,0x10,0x43,0x00, +0x25,0x10,0x44,0x00, +0x08,0x00,0xC2,0xAC, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x22,0x00,0x03,0x24, +0x42,0x00,0x83,0x10, +0x92,0x00,0x02,0x24, +0x41,0x00,0x82,0x10, +0x25,0xB0,0x02,0x3C, +0x25,0xB0,0x02,0x3C, +0x24,0x0A,0x42,0x34, +0x00,0x00,0x44,0x8C, +0x3F,0x3F,0x03,0x3C, +0x3F,0x3F,0x63,0x34, +0x24,0x20,0x83,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xDE,0x1F,0x53,0x24, +0xE6,0x20,0x72,0x24, +0x21,0x88,0x00,0x00, +0x69,0x5D,0x00,0x08, +0x10,0x00,0xA4,0xAF, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4B,0x00,0x40,0x10, +0x30,0x1F,0x85,0x26, +0x01,0x00,0x31,0x26, +0x21,0x00,0x22,0x2E, +0x17,0x00,0x40,0x10, +0x30,0x1F,0x82,0x26, +0xC0,0x80,0x11,0x00, +0x10,0x00,0xA4,0x27, +0x21,0x28,0x13,0x02, +0x39,0x52,0x00,0x0C, +0x04,0x00,0x06,0x24, +0x21,0x28,0x12,0x02, +0x10,0x00,0xA4,0x27, +0xF0,0xFF,0x40,0x14, +0x04,0x00,0x06,0x24, +0x30,0x1F,0x85,0x26, +0x08,0x00,0xA3,0x8C, +0xC0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x3F,0x00,0x24,0x32, +0x24,0x18,0x62,0x00, +0x00,0x24,0x04,0x00, +0xFF,0x7F,0x02,0x3C, +0x25,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x08,0x00,0xA3,0xAC, +0x30,0x1F,0x82,0x26, +0x0C,0x00,0x43,0x8C, +0x00,0x40,0x04,0x3C, +0x30,0x1F,0x85,0x26, +0x25,0x18,0x64,0x00, +0x0C,0x00,0x43,0xAC, +0x0C,0x00,0xA2,0x8C, +0x01,0x00,0x03,0x24, +0x82,0x17,0x02,0x00, +0x01,0x00,0x44,0x30, +0x5D,0xFF,0x83,0x14, +0x21,0x10,0x00,0x00, +0xF0,0x5C,0x00,0x08, +0x00,0x00,0x00,0x00, +0xC6,0x02,0x02,0xA2, +0x0A,0x5D,0x00,0x08, +0xC4,0x02,0x13,0xA6, +0x23,0x5C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x1A,0x5D,0x00,0x08, +0xC4,0x02,0x13,0xA6, +0x25,0xB0,0x02,0x3C, +0x88,0x0C,0x42,0x34, +0x00,0x00,0x44,0x8C, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x66,0x24, +0xC0,0xFF,0x02,0x3C, +0x24,0x20,0x82,0x00, +0x21,0x88,0x00,0x00, +0xC0,0xFF,0x05,0x3C, +0xA2,0x5D,0x00,0x08, +0x18,0x00,0xC3,0x24, +0x01,0x00,0x31,0x26, +0x25,0x00,0x22,0x2E, +0xB4,0xFF,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0xF8,0xFF,0x44,0x14, +0x04,0x00,0x63,0x24, +0x08,0x00,0xC2,0x8C, +0x3F,0x00,0x23,0x32, +0xFF,0xC0,0x04,0x24, +0x24,0x10,0x44,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x10,0x43,0x00, +0x54,0x5D,0x00,0x08, +0x08,0x00,0xC2,0xAC, +0x08,0x00,0xA3,0x8C, +0xC0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x3F,0x00,0x24,0x32, +0x24,0x18,0x62,0x00, +0x00,0x24,0x04,0x00, +0x25,0x18,0x64,0x00, +0x00,0x80,0x02,0x3C, +0x7D,0x5D,0x00,0x08, +0x25,0x18,0x62,0x00, +0x63,0x0C,0x23,0x36, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x24,0x5D,0x00,0x08, +0x30,0x1F,0x83,0x26, +0x71,0x01,0x00,0x11, +0x23,0x28,0xF2,0x00, +0x2B,0x10,0x42,0x02, +0x21,0x18,0xD2,0x00, +0x00,0x00,0x42,0x38, +0x24,0x00,0x08,0x24, +0x2B,0x20,0x44,0x02, +0x0B,0x40,0x62,0x00, +0x06,0x00,0x80,0x10, +0x20,0x00,0x15,0x24, +0x30,0x1F,0x83,0x26, +0x0A,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x42,0x30, +0x21,0xA8,0x52,0x00, +0x2B,0x28,0xC8,0x02, +0x5E,0x01,0xA0,0x10, +0x30,0x1F,0x82,0x26, +0x80,0x10,0x08,0x00, +0x30,0x1F,0x83,0x26, +0x21,0x10,0x43,0x00, +0x18,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x25,0x04,0x00, +0x30,0x1F,0x86,0x26, +0x0C,0x00,0xC3,0x8C, +0x00,0x00,0x00,0x00, +0xFF,0x03,0x67,0x30, +0x47,0x01,0xE0,0x10, +0x00,0x02,0x62,0x30, +0x04,0x00,0x40,0x10, +0x18,0x00,0xE4,0x00, +0x00,0xFC,0x02,0x24, +0x25,0x38,0xE2,0x00, +0x18,0x00,0xE4,0x00, +0x82,0x82,0x03,0x00, +0xFF,0x03,0x10,0x32, +0x00,0x02,0x03,0x32, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x45,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x80,0x02,0x02, +0x18,0x00,0x04,0x02, +0x80,0x1D,0x04,0x00, +0x25,0xB0,0x11,0x3C, +0x80,0x0C,0x24,0x36, +0x94,0x0C,0x31,0x36, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x18,0x62,0x00, +0x25,0x18,0x65,0x00, +0x21,0x28,0x60,0x00, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xA3,0xAF, +0x00,0x00,0x23,0x8E, +0xFF,0x0F,0x02,0x3C, +0xC0,0x03,0x10,0x32, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x80,0x85,0x10,0x00, +0x25,0x18,0x70,0x00, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x00, +0x10,0x00,0xA3,0xAF, +0x02,0x5C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x83,0x26, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0xB9,0x00,0x40,0x04, +0xC0,0x28,0x15,0x00, +0x21,0x10,0xA3,0x00, +0xAC,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x22,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xAD,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x23,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xAE,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x24,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xAF,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x25,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB0,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x26,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB1,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x27,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB2,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x28,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB3,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x29,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x22,0x00,0x03,0x24, +0x03,0x00,0x83,0x10, +0x92,0x00,0x02,0x24, +0x73,0xFE,0x82,0x14, +0x21,0x10,0x00,0x00, +0x30,0x1F,0x82,0x26, +0x08,0x00,0x43,0x8C, +0x01,0x00,0x44,0x3A, +0x24,0x00,0x02,0x24, +0x02,0x1A,0x03,0x00, +0x3F,0x00,0x63,0x30, +0x01,0x00,0x84,0x30, +0xF3,0x00,0x80,0x10, +0x23,0x28,0x43,0x00, +0x42,0x18,0x12,0x00, +0x40,0x10,0x03,0x00, +0x21,0x90,0x43,0x00, +0x30,0x1F,0x83,0x26, +0xC3,0x02,0x62,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x62,0x02, +0xB8,0x00,0x40,0x10, +0x2B,0x10,0x45,0x02, +0x06,0x00,0x40,0x10, +0x24,0x00,0x06,0x24, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x3F,0x00,0x42,0x30, +0x21,0x30,0x52,0x00, +0x2B,0x28,0xC6,0x02, +0xB8,0x00,0xA0,0x10, +0x30,0x1F,0x82,0x26, +0x80,0x10,0x06,0x00, +0x30,0x1F,0x83,0x26, +0x21,0x10,0x43,0x00, +0x18,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x25,0x04,0x00, +0x30,0x1F,0x83,0x26, +0x10,0x00,0x70,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x3A,0x10,0x00, +0xFF,0x03,0xE7,0x30, +0xC5,0x00,0xE0,0x10, +0x00,0x02,0xE2,0x30, +0x04,0x00,0x40,0x10, +0x18,0x00,0xE4,0x00, +0x00,0xFC,0x02,0x24, +0x25,0x38,0xE2,0x00, +0x18,0x00,0xE4,0x00, +0x02,0x85,0x10,0x00, +0xFF,0x03,0x10,0x32, +0x00,0x02,0x03,0x32, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x45,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x80,0x02,0x02, +0x18,0x00,0x04,0x02, +0x80,0x1D,0x04,0x00, +0x25,0xB0,0x11,0x3C, +0x88,0x0C,0x24,0x36, +0x9C,0x0C,0x31,0x36, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x18,0x62,0x00, +0x25,0x18,0x65,0x00, +0x21,0x28,0x60,0x00, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xA3,0xAF, +0x00,0x00,0x23,0x8E, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC0,0x03,0x10,0x32, +0x24,0x18,0x62,0x00, +0x80,0x85,0x10,0x00, +0x25,0x18,0x70,0x00, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x00, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xA3,0xAF, +0xE6,0x5C,0x00,0x08, +0x21,0x10,0x00,0x00, +0x21,0x10,0xA3,0x00, +0xB4,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x22,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB5,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x23,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB6,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x24,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB7,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x25,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB8,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x26,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB9,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x27,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xBA,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x28,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xBB,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x29,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x6E,0x5E,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x36,0x00,0xA0,0x10, +0x80,0x10,0x08,0x00, +0x21,0x10,0x46,0x00, +0x18,0x00,0x45,0x8C, +0x25,0xB0,0x04,0x3C, +0x02,0x5C,0x00,0x0C, +0x80,0x0C,0x84,0x34, +0x25,0xB0,0x04,0x3C, +0x94,0x0C,0x84,0x34, +0x07,0x5E,0x00,0x08, +0x21,0x28,0x00,0x00, +0x30,0x00,0x43,0x8C, +0xDB,0x5D,0x00,0x08, +0x82,0x25,0x03,0x00, +0x23,0x20,0xD2,0x00, +0x2B,0x10,0x46,0x02, +0x2B,0x18,0x47,0x02, +0x21,0x40,0x00,0x00, +0x21,0xA8,0x00,0x00, +0x0B,0x40,0x82,0x00, +0xD2,0x5D,0x00,0x08, +0x0B,0xA8,0xA3,0x00, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x3F,0x00,0x42,0x30, +0x2B,0x18,0x42,0x02, +0x4A,0xFF,0x60,0x14, +0x23,0x30,0x52,0x00, +0x21,0x30,0x00,0x00, +0x21,0x28,0x00,0x00, +0x30,0x1F,0x82,0x26, +0x30,0x00,0x43,0x8C, +0x96,0x5E,0x00,0x08, +0x82,0x25,0x03,0x00, +0x0F,0x00,0x11,0x3C, +0xFF,0xFF,0x25,0x36, +0x60,0x00,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0xE8,0x03,0x04,0x24, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x24,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x1F,0x00,0x53,0x30, +0x00,0x60,0x90,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x06,0x5D,0x00,0x08, +0x30,0x1F,0x90,0x26, +0x30,0x00,0xC5,0x8C, +0x2C,0x5F,0x00,0x08, +0x25,0xB0,0x04,0x3C, +0x13,0x00,0xA0,0x10, +0x00,0x00,0x00,0x00, +0x80,0x10,0x06,0x00, +0x21,0x10,0x43,0x00, +0x18,0x00,0x45,0x8C, +0x25,0xB0,0x04,0x3C, +0x02,0x5C,0x00,0x0C, +0x88,0x0C,0x84,0x34, +0x25,0xB0,0x04,0x3C, +0x9C,0x0C,0x84,0x34, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xE6,0x5C,0x00,0x08, +0x21,0x10,0x00,0x00, +0xFF,0xFF,0x43,0x26, +0x42,0x18,0x03,0x00, +0x40,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x5E,0x00,0x08, +0x01,0x00,0x52,0x24, +0x30,0x00,0x65,0x8C, +0x67,0x5F,0x00,0x08, +0x25,0xB0,0x04,0x3C, +0x00,0xFF,0x84,0x30, +0x02,0x22,0x04,0x00, +0x08,0x00,0x80,0x10, +0x02,0x80,0x02,0x3C, +0xFF,0x00,0x02,0x24, +0x04,0x00,0x82,0x10, +0xCC,0xFF,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x16,0x22,0x43,0xA0, +0x02,0x80,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x16,0x22,0x44,0xA0, +0x02,0x24,0x04,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x63,0x24, +0x20,0x00,0x84,0x2C, +0x09,0x00,0x80,0x10, +0x21,0x10,0x43,0x00, +0x0C,0x24,0x43,0x8C, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x02,0x19,0x03,0x00, +0x7F,0x00,0x63,0x30, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xB0,0x55,0x43,0x8C, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x02,0x19,0x03,0x00, +0x7F,0x00,0x63,0x30, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x85,0x30, +0xD2,0xFF,0xA3,0x24, +0xFE,0xFF,0xA2,0x24, +0xDA,0xFF,0xA4,0x24, +0x04,0x00,0x63,0x2C, +0x08,0x00,0x84,0x2C, +0x06,0x00,0x60,0x14, +0xFF,0x00,0x42,0x30, +0xF0,0xFF,0xA2,0x24, +0xFC,0xFF,0xA3,0x24, +0x16,0x00,0x46,0x2C, +0x03,0x00,0x80,0x10, +0xFF,0x00,0x62,0x30, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFA,0xFF,0xA3,0x24, +0xFC,0xFF,0xC0,0x10, +0x21,0x10,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0xFF,0x00,0x62,0x30, +0x25,0xB0,0x03,0x3C, +0x03,0x0D,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x08,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x03,0x0D,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0xF7,0x00,0x42,0x30, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x2D,0x0A,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0x3F,0x00,0x42,0x30, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x2D,0x0A,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x80,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xFF,0x00,0x03,0x3C, +0x82,0x01,0x49,0x34, +0x81,0x01,0x48,0x34, +0x24,0x10,0x83,0x00, +0x02,0x3C,0x02,0x00, +0x00,0xFF,0x63,0x34, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x45,0x24, +0x02,0x32,0x04,0x00, +0x01,0x00,0x02,0x24, +0x24,0x20,0x83,0x00, +0xE6,0x1D,0xA2,0xA0, +0xD4,0x1D,0xA0,0xAC, +0xD8,0x1D,0xA0,0xAC, +0xDC,0x1D,0xA0,0xAC, +0x06,0x00,0x80,0x14, +0xE0,0x1D,0xA0,0xAC, +0x00,0x00,0x02,0x91, +0x00,0x00,0x23,0x91, +0xE4,0x1D,0xA2,0xA0, +0x08,0x00,0xE0,0x03, +0xE5,0x1D,0xA3,0xA0, +0xE5,0x1D,0xA7,0xA0, +0x08,0x00,0xE0,0x03, +0xE4,0x1D,0xA6,0xA0, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xE5,0x1D,0x66,0x90, +0xE4,0x1D,0x65,0x90, +0x25,0xB0,0x02,0x3C, +0x82,0x01,0x44,0x34, +0x81,0x01,0x42,0x34, +0x00,0x00,0x45,0xA0, +0x00,0x00,0x86,0xA0, +0x08,0x00,0xE0,0x03, +0xE6,0x1D,0x60,0xA0, +0x02,0x80,0x08,0x3C, +0x30,0x1F,0x04,0x25, +0xE6,0x1D,0x82,0x90, +0x00,0x00,0x00,0x00, +0x15,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0xD8,0x1D,0x82,0x8C, +0xD4,0x1D,0x85,0x8C, +0x25,0xB0,0x03,0x3C, +0x40,0x11,0x02,0x00, +0x2B,0x10,0xA2,0x00, +0x82,0x01,0x67,0x34, +0x0F,0x00,0x40,0x10, +0x81,0x01,0x66,0x34, +0xE5,0x1D,0x83,0x90, +0xE4,0x1D,0x82,0x90, +0xF0,0x00,0x63,0x30, +0x1F,0x00,0x42,0x30, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0xE3,0xA0, +0x30,0x1F,0x02,0x25, +0x01,0x00,0x03,0x24, +0xE0,0x1D,0x40,0xAC, +0xD4,0x1D,0x40,0xAC, +0xD8,0x1D,0x40,0xAC, +0xDC,0x1D,0x40,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xDC,0x1D,0x82,0x8C, +0x25,0xB0,0x03,0x3C, +0x82,0x01,0x69,0x34, +0x40,0x11,0x02,0x00, +0x2B,0x10,0xA2,0x00, +0x0E,0x00,0x40,0x14, +0x81,0x01,0x66,0x34, +0xE0,0x1D,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x40,0x11,0x02,0x00, +0x2B,0x10,0xA2,0x00, +0x08,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xE5,0x1D,0x83,0x90, +0xE4,0x1D,0x82,0x90, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0x23,0xA1, +0x20,0x60,0x00,0x08, +0x30,0x1F,0x02,0x25, +0xE5,0x1D,0x83,0x90, +0xE4,0x1D,0x82,0x90, +0xF0,0x00,0x63,0x30, +0x7F,0x00,0x42,0x30, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0x23,0xA1, +0x20,0x60,0x00,0x08, +0x30,0x1F,0x02,0x25, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x33,0x02,0x65,0x34, +0x00,0x11,0x04,0x00, +0x00,0x00,0xA2,0xA0, +0x30,0x02,0x63,0x34, +0x00,0x00,0x65,0x8C, +0x0F,0x00,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x28,0xA2,0x00, +0x01,0x00,0x03,0x24, +0x04,0x18,0x83,0x00, +0x02,0x00,0xA0,0x10, +0x21,0x10,0x00,0x00, +0xFF,0xFF,0x62,0x30, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x25,0xB0,0x11,0x3C, +0x18,0x00,0xB2,0xAF, +0x4C,0x00,0x22,0x36, +0x1C,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x44,0x90, +0x02,0x80,0x03,0x3C, +0x02,0x00,0x02,0x24, +0xFF,0x00,0x84,0x30, +0x07,0x00,0x82,0x10, +0x30,0x1F,0x72,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x8A,0x36,0x43,0x96, +0x01,0x00,0x02,0x24, +0xF7,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0xF2,0xFF,0x60,0x14, +0x21,0x20,0x00,0x00, +0x4C,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x00,0x04,0x24, +0x4C,0x60,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x25,0x80,0x02,0x02, +0x02,0x80,0x04,0x3C, +0x33,0x02,0x23,0x36, +0x08,0x00,0x02,0x24, +0xFF,0xFF,0x10,0x32, +0x40,0x00,0x27,0x36, +0xEC,0xE8,0x84,0x24, +0x00,0x00,0x62,0xA0, +0xE3,0xFF,0x00,0x16, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE2,0x94, +0x88,0x36,0x43,0x96, +0xFF,0xDF,0x42,0x30, +0x01,0x00,0x63,0x24, +0x00,0x20,0x46,0x34, +0x88,0x36,0x43,0xA6, +0xFF,0xFF,0x65,0x30, +0x00,0x00,0xE2,0xA4, +0x00,0x00,0xE6,0xA4, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x69,0x60,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x21,0x20,0x82,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xDF,0x2F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x02,0x80,0x02,0x3C, +0xE8,0x03,0x03,0x24, +0x34,0x5F,0x43,0xAC, +0x18,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xFA,0x5E,0x40,0xA0, +0xFF,0x00,0x85,0x30, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x60,0xA0, +0x08,0x00,0xA4,0x2C, +0x0E,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x16,0x5F,0x60,0xA0, +0xF4,0x5E,0x45,0xA0, +0x2C,0x00,0x80,0x10, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x05,0x00, +0x94,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x02,0x00,0x42,0x34, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x02,0x00,0x42,0x34, +0x27,0x10,0x02,0x00, +0x24,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x27,0x10,0x02,0x00, +0x24,0x20,0x82,0x00, +0x02,0x80,0x07,0x3C, +0x41,0xB0,0x02,0x3C, +0x01,0x00,0x03,0x24, +0x00,0x00,0x44,0xAC, +0x10,0x5F,0xE3,0xA0, +0x10,0x5F,0xE6,0x90, +0x02,0x80,0x02,0x3C, +0xD0,0x1B,0xA4,0xAC, +0x11,0x5F,0x46,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x27,0x10,0x02,0x00, +0x24,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x10,0x3C, +0xF4,0x5E,0x02,0x92, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x90,0x80,0x00, +0x1C,0x00,0x40,0x10, +0xFF,0x00,0xB1,0x30, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x1C,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x0C,0x00,0x42,0x28, +0x06,0x00,0x40,0x10, +0x08,0x00,0x02,0x24, +0x00,0x00,0x44,0x96, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x83,0x30, +0x1B,0x00,0x62,0x10, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x02,0x92, +0x05,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x0B,0x00,0x43,0x10, +0x02,0x80,0x03,0x3C, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x9B,0x30,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x0C,0x61,0x00,0x08, +0x00,0x08,0x04,0x24, +0x0F,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x22,0x02, +0xF2,0xFF,0x40,0x10, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x34, +0x0E,0x5F,0x62,0xA0, +0x20,0x61,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0D,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x60,0x14, +0x00,0x10,0x82,0x34, +0x1B,0x61,0x00,0x08, +0x00,0x00,0x42,0xA6, +0x0C,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x1B,0x61,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0xFF,0x00,0xA5,0x30, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x18,0x00,0xA0,0x14, +0xFF,0x00,0x90,0x30, +0x2C,0x00,0x00,0x12, +0x01,0x00,0x05,0x24, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x07,0x24, +0x0C,0x5F,0x67,0xA0, +0x02,0x80,0x08,0x3C, +0x0E,0x5F,0x02,0x91, +0x02,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x02,0x00,0x42,0x34, +0x00,0xF0,0x06,0x34, +0x0E,0x5F,0x02,0xA1, +0x8C,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x42,0xB0,0x02,0x3C, +0x44,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x43,0xA0, +0x02,0x80,0x02,0x3C, +0x0F,0x5F,0x43,0x90, +0x0F,0x00,0x02,0x24, +0x02,0x80,0x05,0x3C, +0x0F,0x00,0x63,0x30, +0x07,0x00,0x62,0x10, +0x01,0x00,0x04,0x24, +0x0E,0x5F,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x34, +0x0E,0x5F,0xA2,0xA0, +0xFE,0x4E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xDB,0xFF,0x00,0x16, +0x02,0x80,0x03,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0xFF,0x00,0xA5,0x30, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x03,0x00,0xA0,0x14, +0xFF,0x00,0x91,0x30, +0x3A,0x00,0x20,0x12, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x10,0x3C, +0x0E,0x5F,0x02,0x92, +0xFB,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x02,0xA2, +0x10,0x00,0xA0,0x14, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x02,0x92, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x02,0xA2, +0x19,0x00,0x20,0x16, +0x02,0x80,0x02,0x3C, +0x0E,0x5F,0x02,0x92, +0xFD,0xFF,0x03,0x24, +0x18,0x00,0xBF,0x8F, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x02,0xA2, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x01,0x00,0x04,0x24, +0x0C,0x5F,0x64,0xA0, +0x0E,0x5F,0x02,0x92, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x42,0x34, +0x0E,0x5F,0x02,0xA2, +0x0D,0x5F,0x62,0x90, +0x02,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x23,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0xFE,0x4E,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xE9,0xFF,0x20,0x12, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x04,0x24, +0x0C,0x5F,0x44,0xA0, +0x0E,0x5F,0x03,0x92, +0x02,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x02,0x00,0x63,0x34, +0x00,0xF0,0x06,0x34, +0x0E,0x5F,0x03,0xA2, +0x8C,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x42,0xB0,0x02,0x3C, +0x44,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x0D,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x90,0x61,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB2,0xAF, +0x0C,0x00,0xB1,0xAF, +0x08,0x00,0xB0,0xAF, +0x21,0x40,0xE0,0x00, +0x21,0x90,0xA0,0x03, +0x21,0x60,0xC0,0x00, +0x21,0x78,0x80,0x00, +0x45,0x00,0xE0,0x14, +0x21,0x50,0xA0,0x00, +0x2B,0x10,0xA6,0x00, +0x78,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x34, +0x2B,0x10,0x46,0x00, +0x8F,0x01,0x40,0x10, +0x21,0x28,0xC0,0x00, +0xFF,0x00,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x10,0x00,0x03,0x24, +0x2B,0x10,0x46,0x00, +0x18,0x00,0x04,0x24, +0x21,0x30,0x60,0x00, +0x0B,0x30,0x82,0x00, +0x02,0x80,0x03,0x3C, +0x06,0x10,0xC5,0x00, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x86,0x00, +0x23,0x30,0x44,0x00, +0x08,0x00,0xC0,0x10, +0x02,0x4C,0x0C,0x00, +0x23,0x10,0x46,0x00, +0x06,0x10,0x4F,0x00, +0x04,0x18,0xCA,0x00, +0x25,0x50,0x62,0x00, +0x04,0x60,0xCC,0x00, +0x04,0x78,0xCF,0x00, +0x02,0x4C,0x0C,0x00, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x87,0x31, +0x02,0x24,0x0F,0x00, +0x12,0x18,0x00,0x00, +0x10,0x28,0x00,0x00, +0x00,0x14,0x05,0x00, +0x25,0x28,0x44,0x00, +0x18,0x00,0x67,0x00, +0x12,0x58,0x00,0x00, +0x2B,0x18,0xAB,0x00, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x08,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x28,0xAC,0x00, +0x2B,0x10,0xAC,0x00, +0x04,0x00,0x40,0x14, +0x2B,0x10,0xAB,0x00, +0x00,0x00,0x42,0x38, +0x21,0x18,0xAC,0x00, +0x0B,0x28,0x62,0x00, +0x23,0x28,0xAB,0x00, +0x1B,0x00,0xA9,0x00, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0xE4,0x31, +0x12,0x18,0x00,0x00, +0x10,0x40,0x00,0x00, +0x00,0x00,0x00,0x00, +0x8F,0x62,0x00,0x08, +0x18,0x00,0x67,0x00, +0x2B,0x10,0xA7,0x00, +0x0A,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x34, +0x10,0x00,0xB2,0x8F, +0x0C,0x00,0xB1,0x8F, +0x08,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x21,0x18,0xA0,0x00, +0x00,0x00,0xA4,0xAF, +0x04,0x00,0xA5,0xAF, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x2B,0x10,0x47,0x00, +0xD2,0x00,0x40,0x10, +0x00,0x01,0xE3,0x2C, +0xFF,0x00,0x02,0x3C, +0x10,0x00,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x2B,0x10,0x47,0x00, +0x18,0x00,0x04,0x24, +0x21,0x28,0x60,0x00, +0x0B,0x28,0x82,0x00, +0x06,0x10,0xA8,0x00, +0x02,0x80,0x03,0x3C, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0xCE,0x00,0xC0,0x14, +0x23,0x38,0x46,0x00, +0x2B,0x10,0x0A,0x01, +0x04,0x00,0x40,0x14, +0x23,0x20,0xEC,0x01, +0x2B,0x10,0xEC,0x01, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xE4,0x01, +0x23,0x18,0x48,0x01, +0x23,0x50,0x62,0x00, +0x21,0x78,0x80,0x00, +0x04,0x00,0x40,0x12, +0x21,0xC0,0xE0,0x01, +0x21,0xC8,0x40,0x01, +0x00,0x00,0x58,0xAE, +0x04,0x00,0x59,0xAE, +0x00,0x00,0xA2,0x8F, +0x04,0x00,0xA3,0x8F, +0x10,0x00,0xB2,0x8F, +0x0C,0x00,0xB1,0x8F, +0x08,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x53,0x00,0xC0,0x10, +0x01,0x00,0x02,0x24, +0xFF,0xFF,0x02,0x34, +0x2B,0x10,0x4C,0x00, +0x59,0x00,0x40,0x14, +0xFF,0x00,0x02,0x3C, +0x00,0x01,0x83,0x2D, +0x08,0x00,0x02,0x24, +0x21,0x28,0x00,0x00, +0x0A,0x28,0x43,0x00, +0x06,0x10,0xAC,0x00, +0x02,0x80,0x03,0x3C, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0x5B,0x00,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x23,0x50,0x4C,0x01, +0x02,0x4C,0x0C,0x00, +0xFF,0xFF,0x8D,0x31, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x02,0x24,0x0F,0x00, +0x12,0x18,0x00,0x00, +0x10,0x28,0x00,0x00, +0x00,0x14,0x05,0x00, +0x25,0x28,0x44,0x00, +0x18,0x00,0x6D,0x00, +0x12,0x58,0x00,0x00, +0x2B,0x18,0xAB,0x00, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x08,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x28,0xAC,0x00, +0x2B,0x10,0xAC,0x00, +0x04,0x00,0x40,0x14, +0x2B,0x10,0xAB,0x00, +0x00,0x00,0x42,0x38, +0x21,0x18,0xAC,0x00, +0x0B,0x28,0x62,0x00, +0x23,0x28,0xAB,0x00, +0x1B,0x00,0xA9,0x00, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0xE4,0x31, +0x12,0x18,0x00,0x00, +0x10,0x40,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x18,0x00,0x6D,0x00, +0x00,0x14,0x08,0x00, +0x12,0x58,0x00,0x00, +0x25,0x40,0x44,0x00, +0x2B,0x18,0x0B,0x01, +0x1B,0x00,0xA9,0x00, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x08,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x40,0x0C,0x01, +0x2B,0x10,0x0C,0x01, +0x04,0x00,0x40,0x14, +0x2B,0x10,0x0B,0x01, +0x21,0x18,0x0C,0x01, +0x00,0x00,0x42,0x38, +0x0B,0x40,0x62,0x00, +0xAB,0xFF,0x40,0x12, +0x23,0x78,0x0B,0x01, +0x06,0xC0,0xCF,0x00, +0x21,0xC8,0x00,0x00, +0x00,0x00,0x58,0xAE, +0x4C,0x62,0x00,0x08, +0x04,0x00,0x59,0xAE, +0x1B,0x00,0x47,0x00, +0x02,0x00,0xE0,0x14, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x02,0x34, +0x12,0x60,0x00,0x00, +0x2B,0x10,0x4C,0x00, +0xAB,0xFF,0x40,0x10, +0x00,0x01,0x83,0x2D, +0xFF,0x00,0x02,0x3C, +0x10,0x00,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x2B,0x10,0x4C,0x00, +0x18,0x00,0x04,0x24, +0x21,0x28,0x60,0x00, +0x0B,0x28,0x82,0x00, +0x02,0x80,0x03,0x3C, +0x06,0x10,0xAC,0x00, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0xA7,0xFF,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x23,0x38,0x46,0x00, +0x04,0x60,0xCC,0x00, +0x06,0x58,0xEA,0x00, +0x02,0x4C,0x0C,0x00, +0x1B,0x00,0x69,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x8D,0x31, +0x06,0x18,0xEF,0x00, +0x04,0x10,0xCA,0x00, +0x25,0x50,0x43,0x00, +0x02,0x24,0x0A,0x00, +0x12,0x28,0x00,0x00, +0x10,0x40,0x00,0x00, +0x00,0x14,0x08,0x00, +0x25,0x40,0x44,0x00, +0x18,0x00,0xAD,0x00, +0x12,0x28,0x00,0x00, +0x2B,0x18,0x05,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x69,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x05,0x00,0x60,0x10, +0x04,0x78,0xCF,0x00, +0x21,0x40,0x0C,0x01, +0x2B,0x10,0x0C,0x01, +0x93,0x00,0x40,0x10, +0x2B,0x10,0x05,0x01, +0x23,0x40,0x05,0x01, +0x1B,0x00,0x09,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x44,0x31, +0x12,0x18,0x00,0x00, +0x10,0x58,0x00,0x00, +0x00,0x14,0x0B,0x00, +0x25,0x58,0x44,0x00, +0x18,0x00,0x6D,0x00, +0x12,0x28,0x00,0x00, +0x2B,0x18,0x65,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x09,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x77,0xFF,0x60,0x10, +0x23,0x50,0x65,0x01, +0x21,0x58,0x6C,0x01, +0x2B,0x10,0x6C,0x01, +0x04,0x00,0x40,0x14, +0x2B,0x10,0x65,0x01, +0x00,0x00,0x42,0x38, +0x21,0x18,0x6C,0x01, +0x0B,0x58,0x62,0x00, +0x6A,0x62,0x00,0x08, +0x23,0x50,0x65,0x01, +0x08,0x00,0x02,0x24, +0x21,0x28,0x00,0x00, +0x0A,0x28,0x43,0x00, +0x02,0x80,0x03,0x3C, +0x06,0x10,0xA8,0x00, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0x34,0xFF,0xC0,0x10, +0x23,0x38,0x46,0x00, +0x06,0x10,0xEC,0x00, +0x04,0x18,0xC8,0x00, +0x25,0x40,0x62,0x00, +0x06,0x58,0xEA,0x00, +0x02,0x6C,0x08,0x00, +0x1B,0x00,0x6D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x11,0x31, +0x06,0x10,0xEF,0x00, +0x04,0x18,0xCA,0x00, +0x25,0x50,0x62,0x00, +0x02,0x24,0x0A,0x00, +0x04,0x60,0xCC,0x00, +0x12,0x80,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x14,0x09,0x00, +0x25,0x48,0x44,0x00, +0x12,0x28,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x18,0x00,0x11,0x02, +0x12,0x70,0x00,0x00, +0x2B,0x18,0x2E,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x6D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x0A,0x00,0x60,0x10, +0x04,0x78,0xCF,0x00, +0x21,0x48,0x28,0x01, +0x2B,0x10,0x28,0x01, +0x06,0x00,0x40,0x14, +0xFF,0xFF,0xB0,0x24, +0x2B,0x10,0x2E,0x01, +0x03,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x10,0x26, +0x21,0x48,0x28,0x01, +0x23,0x48,0x2E,0x01, +0x1B,0x00,0x2D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x44,0x31, +0x12,0x28,0x00,0x00, +0x10,0x58,0x00,0x00, +0x00,0x14,0x0B,0x00, +0x25,0x58,0x44,0x00, +0x18,0x00,0xB1,0x00, +0x12,0x70,0x00,0x00, +0x2B,0x18,0x6E,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x2D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x0B,0x00,0x60,0x10, +0x00,0x14,0x10,0x00, +0x21,0x58,0x68,0x01, +0x2B,0x10,0x68,0x01, +0x06,0x00,0x40,0x14, +0xFF,0xFF,0xA5,0x24, +0x2B,0x10,0x6E,0x01, +0x04,0x00,0x40,0x10, +0x00,0x14,0x10,0x00, +0xFF,0xFF,0xA5,0x24, +0x21,0x58,0x68,0x01, +0x00,0x14,0x10,0x00, +0x25,0x10,0x45,0x00, +0x23,0x58,0x6E,0x01, +0x19,0x00,0x4C,0x00, +0x10,0x28,0x00,0x00, +0x2B,0x18,0x65,0x01, +0x12,0x48,0x00,0x00, +0x05,0x00,0x60,0x14, +0x23,0x20,0x2C,0x01, +0x07,0x00,0xAB,0x14, +0x2B,0x10,0xE9,0x01, +0x05,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x24,0x01, +0x23,0x18,0xA8,0x00, +0x23,0x28,0x62,0x00, +0x21,0x48,0x80,0x00, +0xEA,0xFE,0x40,0x12, +0x23,0x18,0xE9,0x01, +0x23,0x20,0x65,0x01, +0x2B,0x10,0xE3,0x01, +0x23,0x50,0x82,0x00, +0x04,0x28,0xEA,0x00, +0x06,0x18,0xC3,0x00, +0x25,0xC0,0xA3,0x00, +0x06,0xC8,0xCA,0x00, +0x00,0x00,0x58,0xAE, +0x4C,0x62,0x00,0x08, +0x04,0x00,0x59,0xAE, +0x00,0x01,0xC3,0x2C, +0x08,0x00,0x02,0x24, +0x21,0x30,0x00,0x00, +0xE6,0x61,0x00,0x08, +0x0A,0x30,0x43,0x00, +0x00,0x00,0x42,0x38, +0x21,0x18,0x0C,0x01, +0xE0,0x62,0x00,0x08, +0x0B,0x40,0x62,0x00, +0x25,0xB0,0x02,0x3C, +0xFF,0x00,0x03,0x3C, +0xEC,0x02,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xF0,0x8D,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x7F,0x00,0x02,0x3C, +0x0D,0xB8,0x44,0x34, +0x80,0x04,0x03,0x3C, +0x25,0x20,0x83,0x00, +0x00,0x08,0x02,0x3C, +0x25,0x20,0x82,0x00, +0x00,0x30,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x25,0x20,0x83,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0xD8,0x1B,0x44,0xAC, +0xD0,0x1B,0x44,0xAC, +0x08,0x00,0x63,0x34, +0x86,0x00,0x04,0x24, +0x00,0x00,0x64,0xA4, +0xDC,0x1B,0x44,0xA4, +0xD4,0x1B,0x40,0xAC, +0xDE,0x1B,0x40,0xA4, +0x08,0x00,0xE0,0x03, +0xE0,0x1B,0x44,0xA4, +0x99,0x63,0x00,0x08, +0x00,0x00,0x00,0x00, +0x42,0xB0,0x03,0x3C, +0x01,0x00,0x63,0x34, +0x02,0x00,0x02,0x24, +0xE8,0xFF,0xBD,0x27, +0x00,0x00,0x62,0xA0, +0x10,0x00,0xBF,0xAF, +0xDF,0x2F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x20,0x00,0x00, +0x01,0x00,0x05,0x24, +0x8C,0x23,0x00,0x0C, +0x00,0x50,0x06,0x24, +0x1F,0x00,0x06,0x3C, +0x10,0x00,0xBF,0x8F, +0x00,0x40,0xC6,0x34, +0x03,0x00,0x04,0x24, +0x01,0x00,0x05,0x24, +0x8C,0x23,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0x18,0x03,0x64,0x34, +0xB8,0x8E,0x42,0x24, +0x00,0x00,0x82,0xAC, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0xB6,0x00,0x63,0x34, +0x00,0x00,0x62,0x90, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0xAB,0x1B,0x02,0xA2, +0x28,0x6B,0x00,0x0C, +0x7A,0x36,0x00,0xA2, +0x48,0x01,0x03,0x24, +0x84,0x36,0x03,0xAE, +0x80,0x36,0x03,0xAE, +0xFD,0xFF,0x02,0x3C, +0xFB,0xFF,0x03,0x3C, +0x21,0x98,0x00,0x02, +0x21,0xA0,0x00,0x02, +0xFF,0xFF,0x55,0x34, +0xFF,0xFF,0x76,0x34, +0x21,0x88,0x00,0x00, +0x02,0x80,0x1E,0x3C, +0x02,0x80,0x17,0x3C, +0x21,0x90,0x00,0x02, +0x80,0x10,0x11,0x00, +0x21,0x10,0x51,0x00, +0xC0,0x10,0x02,0x00, +0x21,0x10,0x53,0x00, +0xE8,0x1D,0x42,0x24, +0x07,0x00,0x03,0x24, +0xFF,0xFF,0x63,0x24, +0x00,0x00,0x40,0xA4, +0xFD,0xFF,0x61,0x04, +0x02,0x00,0x42,0x24, +0xC0,0x80,0x11,0x00, +0x18,0x42,0xC4,0x27, +0x21,0x20,0x04,0x02, +0x21,0x28,0x00,0x00, +0x02,0x00,0x06,0x24, +0xF8,0x1D,0x40,0xA6, +0x08,0x52,0x00,0x0C, +0xFA,0x1D,0x40,0xA2, +0x21,0x20,0x13,0x02, +0xE8,0x22,0x83,0x8C, +0xEA,0x5D,0xE7,0x92, +0xBF,0xFF,0x02,0x24, +0x24,0x28,0x62,0x00, +0x01,0x00,0x02,0x24, +0x63,0x00,0xE2,0x10, +0x80,0x07,0xA6,0x34, +0xFF,0xF7,0x03,0x24, +0x24,0x10,0xC3,0x00, +0xFF,0xEF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xE8,0x22,0x82,0xAC, +0x21,0x30,0x14,0x02, +0xE8,0x22,0xC4,0x8C, +0xE7,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x95,0x00, +0x24,0x20,0x96,0x00, +0xFF,0xFD,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0xFF,0xFB,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xEC,0x22,0xC5,0x8C, +0xFF,0xFF,0x42,0x34, +0xFF,0xE7,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0xFF,0xFF,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xFF,0x7F,0x42,0x34, +0xC0,0xFF,0x03,0x24, +0x24,0x28,0xA2,0x00, +0x24,0x20,0x83,0x00, +0x1F,0x00,0x02,0x3C, +0x01,0x00,0x31,0x26, +0x25,0x28,0xA2,0x00, +0x08,0x00,0x84,0x34, +0x20,0x00,0x22,0x2A, +0xE8,0x22,0xC4,0xAC, +0xEC,0x22,0xC5,0xAC, +0xC3,0xFF,0x40,0x14, +0x28,0x00,0x52,0x26, +0x25,0xB0,0x02,0x3C, +0x10,0x00,0x03,0x24, +0xB0,0x03,0x42,0x34, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x43,0xAC, +0x58,0x22,0x84,0x24, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x20,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0xE9,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x3A,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x24,0x03,0x00,0xA2, +0x38,0x70,0x00,0x0C, +0x25,0x03,0x00,0xA2, +0x02,0x80,0x09,0x3C, +0x64,0x57,0x22,0x25, +0x02,0x80,0x0A,0x3C, +0x02,0x80,0x0B,0x3C, +0x02,0x80,0x0C,0x3C, +0x02,0x80,0x0D,0x3C, +0x02,0x80,0x0E,0x3C, +0x02,0x80,0x0F,0x3C, +0x04,0x00,0x42,0xAC, +0x64,0x57,0x22,0xAD, +0x6C,0x57,0x43,0x25, +0x74,0x57,0x64,0x25, +0x7C,0x57,0x85,0x25, +0x84,0x57,0xA6,0x25, +0x8C,0x57,0xC7,0x25, +0x94,0x57,0xE8,0x25, +0x09,0x00,0x02,0x24, +0x04,0x00,0x63,0xAC, +0x6C,0x57,0x43,0xAD, +0x04,0x00,0x84,0xAC, +0x74,0x57,0x64,0xAD, +0x04,0x00,0xA5,0xAC, +0x7C,0x57,0x85,0xAD, +0x04,0x00,0xC6,0xAC, +0x84,0x57,0xA6,0xAD, +0x04,0x00,0xE7,0xAC, +0x8C,0x57,0xC7,0xAD, +0x94,0x57,0xE8,0xAD, +0x04,0x00,0x08,0xAD, +0x34,0x00,0xBF,0x8F, +0x0C,0x3E,0x02,0xA2, +0x32,0x3B,0x00,0xA6, +0x8E,0x3E,0x00,0xA2, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x9C,0xFF,0x67,0x14, +0x80,0x0F,0xA2,0x34, +0xFF,0xF7,0x03,0x24, +0x24,0x10,0xC3,0x00, +0xF0,0x63,0x00,0x08, +0x00,0x10,0x42,0x34, +0xFA,0x6B,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x50,0x6E,0x00,0x0C, +0x30,0x38,0x80,0xAE, +0x6E,0x6F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x64,0x90, +0x92,0x00,0x02,0x24, +0x03,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0xCA,0x6F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x6F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x6A,0x6E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x8A,0x36,0x83,0xA6, +0x1E,0x70,0x00,0x0C, +0x88,0x36,0x80,0xA6, +0x1E,0x64,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0xB8,0x91,0x63,0x24, +0x18,0x03,0x42,0x34, +0x18,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x00,0x00,0x43,0xAC, +0x21,0x80,0x00,0x00, +0x01,0x00,0x02,0x26, +0xFF,0xFF,0x50,0x30, +0x64,0x00,0x03,0x2E, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x02,0x26, +0x02,0x80,0x03,0x3C, +0xDB,0x5D,0x68,0x90, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xD8,0x5D,0x4B,0x94, +0xF3,0x5D,0x6A,0x90, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x14,0x3C, +0xFA,0x5D,0x67,0x90, +0xE8,0x5D,0x49,0x90, +0xDA,0x5D,0x83,0x92, +0x02,0x80,0x0C,0x3C, +0x02,0x80,0x02,0x3C, +0xF5,0x5D,0x46,0x90, +0xF8,0x5D,0x85,0x91, +0x25,0xB0,0x04,0x3C, +0xB0,0x03,0x82,0x34, +0x00,0x00,0x4B,0xAC, +0x00,0x00,0x48,0xAC, +0x00,0x00,0x49,0xAC, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x03,0x3C, +0x00,0x00,0x4A,0xAC, +0x0A,0x00,0x88,0x34, +0x00,0x00,0x46,0xAC, +0x00,0x00,0x45,0xAC, +0x00,0x00,0x47,0xAC, +0x1A,0x5E,0x60,0xA4, +0x00,0x00,0x06,0x91, +0x02,0x80,0x02,0x3C, +0x0B,0x00,0x04,0x24, +0x02,0x80,0x16,0x3C, +0xE5,0x5D,0x44,0xA0, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0xC5,0x26, +0x00,0x78,0x03,0x24, +0x08,0x5E,0x40,0xA0, +0xF0,0xFF,0x02,0x24, +0x01,0x00,0x07,0x24, +0x02,0x80,0x15,0x3C, +0xAC,0x1B,0xA3,0xA4, +0xAA,0x1B,0xA2,0xA0, +0xFF,0x07,0x03,0x24, +0xFF,0xFF,0x02,0x24, +0x20,0x00,0xC6,0x30, +0xF8,0x5D,0x87,0xA1, +0xA8,0x1B,0xA7,0xA0, +0xAE,0x1B,0xA3,0xA4, +0x48,0xF3,0xA2,0xA2, +0xB1,0x00,0xC0,0x10, +0xB0,0x1B,0xA0,0xA4, +0x00,0x00,0x02,0x91, +0x00,0x00,0x00,0x00, +0x10,0x00,0x42,0x30, +0xFB,0x00,0x40,0x14, +0x02,0x80,0x13,0x3C, +0x21,0x80,0x00,0x00, +0x21,0x88,0x00,0x00, +0xB8,0xF1,0x72,0x26, +0xFF,0x00,0x24,0x32, +0x61,0x57,0x00,0x0C, +0x21,0x28,0x12,0x02, +0x08,0x00,0x03,0x26, +0xFF,0xFF,0x70,0x30, +0x01,0x00,0x22,0x26, +0x80,0x00,0x03,0x2E, +0xF8,0xFF,0x60,0x14, +0xFF,0xFF,0x51,0x30, +0xDA,0x5D,0x83,0x92, +0x00,0x00,0x00,0x00, +0x02,0x00,0x62,0x30, +0xC1,0x00,0x40,0x14, +0x04,0x00,0x62,0x30, +0x9A,0x00,0x40,0x10, +0x25,0xB0,0x03,0x3C, +0x25,0xB0,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x06,0x00,0x06,0x24, +0x50,0x00,0x84,0x34, +0x10,0x52,0x00,0x0C, +0x07,0xF2,0xA5,0x24, +0xB8,0xF1,0x63,0x26, +0x7B,0x00,0x66,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0xC2,0x2C, +0x04,0x00,0x40,0x14, +0x02,0x00,0x0B,0x24, +0x79,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x4B,0x30, +0x04,0x00,0xC2,0x2C, +0xDC,0x00,0x40,0x10, +0xB8,0xF1,0x62,0x26, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x40,0xA0, +0x02,0x80,0x02,0x3C, +0xE7,0x5D,0x43,0x90, +0x01,0x00,0x02,0x24, +0x02,0x00,0x62,0x10, +0xFC,0xFF,0x08,0x24, +0x21,0x40,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xB8,0xF1,0x4A,0x24, +0x30,0x1F,0x69,0x24, +0x21,0x60,0x00,0x00, +0x21,0x80,0x00,0x00, +0x01,0x00,0x02,0x26, +0x21,0x30,0x30,0x01, +0x03,0x00,0x03,0x2E, +0x08,0x00,0x04,0x2E, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x07,0x2E, +0x04,0x00,0x60,0x14, +0x21,0x88,0x00,0x00, +0x01,0x00,0x11,0x24, +0x02,0x00,0x02,0x24, +0x0A,0x88,0x44,0x00, +0x21,0x10,0x51,0x01, +0x61,0x00,0x43,0x90, +0x55,0x00,0x44,0x90, +0x5B,0x00,0x45,0x90, +0x21,0x18,0x03,0x01, +0x21,0x20,0x04,0x01, +0x21,0x28,0x05,0x01, +0x9C,0x1D,0xC3,0xA0, +0x64,0x1D,0xC4,0xA0, +0xEB,0xFF,0xE0,0x14, +0x80,0x1D,0xC5,0xA0, +0x01,0x00,0x8C,0x25, +0x02,0x00,0x82,0x2D, +0x0E,0x00,0x29,0x25, +0xE5,0xFF,0x40,0x14, +0x03,0x00,0x4A,0x25, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x47,0x24, +0xB8,0xF1,0x66,0x24, +0x21,0x80,0x00,0x00, +0x03,0x00,0x02,0x2E, +0x21,0x20,0x07,0x02, +0xB9,0x00,0x40,0x10, +0x08,0x00,0x03,0x2E, +0x71,0x00,0xC3,0x90, +0x6E,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xC6,0x1D,0x82,0xA0, +0xB8,0x1D,0x83,0xA0, +0x01,0x00,0x02,0x26, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x03,0x2E, +0xF4,0xFF,0x60,0x14, +0x03,0x00,0x02,0x2E, +0x03,0x00,0x02,0x24, +0x2A,0x00,0x62,0x15, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xB8,0xF1,0x4E,0x24, +0x34,0xD9,0x6F,0x24, +0x21,0x60,0x00,0x00, +0x21,0x68,0x00,0x00, +0x21,0x10,0xAE,0x01, +0x74,0x00,0x43,0x90, +0x21,0x80,0x00,0x00, +0x0F,0x00,0x6A,0x30, +0x02,0x49,0x03,0x00, +0x21,0x10,0xB0,0x01, +0x00,0x11,0x02,0x00, +0x21,0x58,0x4F,0x00, +0x21,0x38,0x00,0x00, +0x21,0x40,0x67,0x01, +0x00,0x00,0x03,0x91, +0x00,0x31,0x09,0x00, +0x01,0x00,0xE7,0x24, +0x02,0x11,0x03,0x00, +0x00,0x21,0x02,0x00, +0x0F,0x00,0x63,0x30, +0x2B,0x10,0x49,0x00, +0x0A,0x20,0xC2,0x00, +0x2B,0x28,0x6A,0x00, +0x00,0x00,0xA5,0x38, +0x25,0x18,0x83,0x00, +0xFF,0xFF,0xE7,0x30, +0x25,0x20,0x8A,0x00, +0x0A,0x18,0x85,0x00, +0x10,0x00,0xE2,0x2C, +0xEF,0xFF,0x40,0x14, +0x00,0x00,0x03,0xA1, +0x01,0x00,0x02,0x26, +0xFF,0xFF,0x50,0x30, +0x03,0x00,0x03,0x2E, +0xE7,0xFF,0x60,0x14, +0x21,0x10,0xB0,0x01, +0x01,0x00,0x8C,0x25, +0x02,0x00,0x82,0x2D, +0xDD,0xFF,0x40,0x14, +0x03,0x00,0xAD,0x25, +0xE6,0x56,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x48,0xF3,0xA5,0x26, +0x91,0x56,0x00,0x0C, +0xFA,0x01,0x04,0x24, +0xE6,0x56,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x25,0xB0,0x05,0x3C, +0x18,0x3B,0x84,0x24, +0x50,0x00,0xA5,0x34, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x30,0x1F,0xC5,0x26, +0x01,0x00,0x02,0x24, +0x06,0x00,0x03,0x24, +0x05,0x00,0x04,0x24, +0x33,0x1C,0xA2,0xA0, +0x8A,0x55,0x00,0x0C, +0x30,0x3B,0xA3,0xA0, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x4C,0x87,0x02,0x3C, +0x54,0x00,0x65,0x34, +0x00,0xE0,0x42,0x34, +0x50,0x00,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x12,0x01,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x00,0x00,0xA4,0xAC, +0x30,0x1F,0x46,0x24, +0x21,0x60,0x00,0x00, +0x10,0x00,0x05,0x24, +0x21,0x80,0x00,0x00, +0x01,0x00,0x02,0x26, +0x21,0x18,0xD0,0x00, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x04,0x2E, +0x80,0x1D,0x65,0xA0, +0x64,0x1D,0x65,0xA0, +0xF9,0xFF,0x80,0x14, +0x9C,0x1D,0x65,0xA0, +0x01,0x00,0x8C,0x25, +0x02,0x00,0x82,0x2D, +0xF4,0xFF,0x40,0x14, +0x0E,0x00,0xC6,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x46,0x24, +0x21,0x80,0x00,0x00, +0x04,0x00,0x05,0x24, +0x01,0x00,0x02,0x26, +0x21,0x18,0x06,0x02, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x04,0x2E, +0xC6,0x1D,0x60,0xA0, +0xFA,0xFF,0x80,0x14, +0xB8,0x1D,0x65,0xA0, +0x48,0x65,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x50,0x00,0x84,0x34, +0xCA,0xF1,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xB8,0xF1,0x62,0x92, +0xB8,0xF1,0x64,0x26, +0x01,0x00,0x85,0x90, +0x21,0x18,0x40,0x00, +0x10,0x00,0xA2,0xA3, +0x29,0x00,0x02,0x24, +0x11,0x00,0xA5,0xA3, +0x50,0x00,0x86,0x90, +0x3B,0x00,0x62,0x10, +0xFF,0x00,0xA3,0x30, +0xB8,0xF1,0x65,0x26, +0x68,0x00,0xA2,0x90, +0x02,0x80,0x03,0x3C, +0x04,0x00,0xC4,0x2C, +0x1F,0x00,0x42,0x30, +0x24,0x00,0x80,0x14, +0x49,0xF3,0x62,0xA0, +0x7A,0x00,0xA2,0x90, +0x79,0x00,0xA4,0x90, +0x02,0x80,0x03,0x3C, +0x04,0x00,0x42,0x30, +0x83,0x10,0x02,0x00, +0x03,0x00,0x8B,0x30, +0x4A,0xF3,0x62,0xA0, +0x06,0x00,0xC2,0x2C, +0x37,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xB8,0xF1,0x63,0x26, +0x69,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x31,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xE8,0x64,0x00,0x08, +0x21,0x40,0x00,0x00, +0x21,0x20,0x00,0x00, +0x80,0x00,0x05,0x24, +0x53,0x56,0x00,0x0C, +0xB8,0xF1,0x66,0x26, +0xC7,0x64,0x00,0x08, +0x00,0x00,0x00,0x00, +0x7D,0x00,0x43,0x90, +0x69,0x00,0x44,0x90, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x63,0x30, +0x01,0x00,0x84,0x30, +0x83,0x18,0x03,0x00, +0x01,0x00,0x84,0x2C, +0x1F,0xFF,0x80,0x10, +0x4A,0xF3,0x43,0xA0, +0xE8,0x64,0x00,0x08, +0x21,0x40,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x00,0x0B,0x24, +0xAA,0x65,0x00,0x08, +0x4A,0xF3,0x40,0xA0, +0x21,0x28,0x07,0x02, +0x06,0x00,0x60,0x10, +0x21,0x20,0xA0,0x00, +0x67,0x00,0xC3,0x90, +0x6F,0x00,0xC2,0x90, +0xB8,0x1D,0xA3,0xA0, +0x17,0x65,0x00,0x08, +0xC6,0x1D,0xA2,0xA0, +0x72,0x00,0xC3,0x90, +0x70,0x00,0xC2,0x90, +0x16,0x65,0x00,0x08, +0xC6,0x1D,0x82,0xA0, +0x81,0x00,0x02,0x24, +0xC4,0xFF,0x62,0x14, +0x01,0x00,0x02,0x24, +0x54,0x00,0x83,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x62,0x10, +0x02,0x00,0x02,0x24, +0x04,0x00,0x62,0x10, +0x11,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x65,0x00,0x08, +0xDE,0x5D,0x43,0xA0, +0x22,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x65,0x00,0x08, +0xDE,0x5D,0x43,0xA0, +0x12,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x65,0x00,0x08, +0xDE,0x5D,0x43,0xA0, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0x25,0xB0,0x10,0x3C, +0x18,0x03,0x03,0x36, +0xA8,0x97,0x42,0x24, +0x00,0x00,0x62,0xAC, +0x20,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x24,0x00,0xBF,0xAF, +0x6E,0x64,0x00,0x0C, +0x1C,0x00,0xB1,0xAF, +0x9C,0x66,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x36,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x1A,0x6A,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x7C,0x6C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x82,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x43,0x26, +0x30,0x3B,0x64,0x90, +0x0D,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x76,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x64,0x40,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x44,0x00,0x03,0x36, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x34, +0x00,0x00,0x62,0xA4, +0xAE,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x7C,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9B,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE6,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xA3,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x80,0x04,0x3C, +0x74,0x6A,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x00,0x80,0x04,0x3C, +0x6C,0x72,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x02,0x00,0x05,0x24, +0x00,0x80,0x04,0x3C, +0x48,0x7B,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x04,0x00,0x05,0x24, +0x7E,0x59,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x80,0x04,0x3C, +0xB8,0x8E,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x03,0x00,0x05,0x24, +0x02,0x80,0x03,0x3C, +0xE8,0x5D,0x63,0x90, +0x00,0x00,0x00,0x00, +0x60,0x00,0x60,0x10, +0x43,0x00,0x02,0x36, +0x07,0x00,0x02,0x24, +0x0C,0x00,0x62,0x10, +0x03,0x00,0x02,0x24, +0x25,0xB0,0x04,0x3C, +0x43,0x00,0x85,0x34, +0x10,0x02,0x86,0x34, +0x10,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA0, +0xD8,0x00,0x84,0x34, +0x00,0x00,0xC3,0xA0, +0x00,0x00,0x82,0x90, +0x80,0xFF,0x03,0x24, +0x25,0x10,0x43,0x00, +0x00,0x00,0x82,0xA0, +0xE0,0x6A,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x42,0xB0,0x03,0x3C, +0x00,0x00,0x62,0x90, +0x25,0xB0,0x10,0x3C, +0x02,0x80,0x11,0x3C, +0x01,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x83,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x44,0x00,0x05,0x36, +0x00,0x00,0xA2,0x94, +0x02,0x80,0x03,0x3C, +0x8C,0xC6,0x64,0x8C, +0xC0,0x00,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x2F,0x55,0x00,0x0C, +0x80,0x0C,0x10,0x36, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xDA,0x5D,0x45,0x90, +0xDF,0x5D,0x66,0x90, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x90,0xC6,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x45,0x90, +0x48,0xF3,0x66,0x90, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xE7,0x5D,0x47,0x90, +0x4A,0xF3,0x62,0x90, +0x02,0x80,0x04,0x3C, +0xA4,0xC6,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x07,0x8E, +0xE6,0x5D,0x46,0x90, +0xE9,0x5D,0x25,0x92, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xC0,0xC6,0x84,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x66,0x90, +0xEA,0x5D,0x45,0x90, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x50,0x26, +0x2F,0x55,0x00,0x0C, +0xDC,0xC6,0x84,0x24, +0xA0,0x3E,0x06,0x8E, +0xA4,0x3E,0x05,0x8E, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xF0,0xC6,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x49,0xF3,0x45,0x90, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x10,0xC7,0x84,0x24, +0xE9,0x5D,0x23,0x92, +0x10,0x27,0x02,0x24, +0x02,0x80,0x04,0x3C, +0x0B,0x10,0x03,0x00, +0x40,0x39,0x02,0xAE, +0x08,0x00,0x84,0x24, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0x99,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xD8,0x00,0x04,0x36, +0x00,0x00,0x40,0xA0, +0x38,0x66,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x20,0x00,0x00, +0x20,0xB0,0x06,0x3C, +0xFF,0xFF,0x05,0x34, +0x21,0x18,0x86,0x00, +0x04,0x00,0x84,0x24, +0x2A,0x10,0xA4,0x00, +0x00,0x00,0x60,0xAC, +0xFB,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xB8,0xFF,0xBD,0x27, +0x24,0x00,0xB1,0xAF, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x28,0x00,0xB2,0xAF, +0x20,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0xDA,0x5D,0x42,0x90, +0x25,0xB0,0x11,0x3C, +0x58,0x00,0x25,0x36, +0x10,0x00,0xA2,0xAF, +0x4C,0x81,0x02,0x3C, +0x00,0xE0,0x42,0x34, +0x00,0x00,0xA2,0xAC, +0xFF,0xFF,0x04,0x24, +0x96,0x01,0x03,0x24, +0x28,0x28,0x02,0x24, +0x5C,0x00,0x26,0x36, +0x60,0x00,0x27,0x36, +0x64,0x00,0x28,0x36, +0x8A,0x00,0x29,0x36, +0x00,0x00,0xC3,0xAC, +0x00,0x00,0xE4,0xAC, +0x00,0x00,0x04,0xAD, +0x00,0x00,0x22,0xA5, +0x0E,0x0E,0x02,0x3C, +0x09,0x00,0x03,0x24, +0x0A,0x0A,0x42,0x34, +0x89,0x00,0x2A,0x36, +0x8C,0x00,0x2B,0x36, +0x00,0x00,0x43,0xA1, +0x90,0x00,0x2C,0x36, +0x00,0x00,0x62,0xAD, +0x13,0x00,0x03,0x24, +0x30,0x00,0x02,0x24, +0x91,0x00,0x2D,0x36, +0x00,0x00,0x83,0xA1, +0x92,0x00,0x2E,0x36, +0x00,0x00,0xA2,0xA1, +0x3A,0x01,0x03,0x24, +0x21,0x00,0x02,0x24, +0xB5,0x00,0x2F,0x36, +0x00,0x00,0xC3,0xA5, +0x00,0x00,0xE2,0xA1, +0x10,0x00,0xA2,0x8F, +0x12,0x00,0x03,0x24, +0x89,0x01,0x43,0x10, +0x07,0x07,0x02,0x3C, +0x07,0x07,0x42,0x34, +0xA0,0x00,0x24,0x36, +0x00,0x00,0x82,0xAC, +0xA4,0x00,0x25,0x36, +0x00,0x07,0x03,0x24, +0x00,0xC0,0x02,0x3C, +0xA8,0x00,0x26,0x36, +0x00,0x00,0xA3,0xAC, +0x00,0xC4,0x42,0x34, +0x00,0x00,0xC2,0xAC, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0xAC,0x1B,0x45,0x94, +0xAE,0x1B,0x46,0x94, +0xAA,0x1B,0x42,0x90, +0x02,0x80,0x03,0x3C, +0x21,0xB0,0x07,0x3C, +0x14,0x00,0xA2,0xA3, +0xE9,0x5D,0x63,0x90, +0x20,0xB0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x18,0x00,0xA3,0xAF, +0x23,0xB0,0x03,0x3C, +0xFF,0xFF,0x63,0x34, +0x24,0xB0,0x08,0x3C, +0xFF,0x1F,0x04,0x3C, +0x25,0xB0,0x1E,0x3C, +0xFF,0xFF,0x84,0x34, +0x21,0x38,0xA7,0x00, +0x21,0x40,0xC8,0x00, +0x21,0x28,0xA2,0x00, +0x21,0x30,0xC3,0x00, +0x24,0x40,0x04,0x01, +0x24,0x28,0xA4,0x00, +0x24,0x38,0xE4,0x00, +0x24,0x30,0xC4,0x00, +0x35,0x00,0x02,0x24, +0x20,0x00,0xC4,0x37, +0x00,0x00,0x82,0xA0, +0x22,0x00,0x03,0x24, +0x09,0x00,0x02,0x24, +0x03,0x05,0xC9,0x37, +0x60,0x05,0xCA,0x37, +0xAC,0x00,0xCB,0x37, +0xF8,0x00,0xCC,0x37, +0xB0,0x00,0xCD,0x37, +0x08,0x01,0xCE,0x37, +0xD8,0x00,0xCF,0x37, +0x00,0x00,0x23,0xA1, +0x00,0x00,0x42,0xA1, +0x00,0x00,0x65,0xAD, +0x00,0x00,0x87,0xAD, +0x00,0x00,0xA6,0xAD, +0x00,0x00,0xC8,0xAD, +0x00,0x00,0xE0,0xA1, +0x14,0x00,0xA3,0x93, +0x25,0xB0,0x02,0x3C, +0xB4,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xB6,0x00,0xD1,0x37, +0x04,0x00,0x02,0x24, +0x25,0xB0,0x03,0x3C, +0x00,0x00,0x22,0xA2, +0xB9,0x00,0x63,0x34, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x25,0xB0,0x03,0x3C, +0x0F,0x00,0x02,0x24, +0xBA,0x00,0x63,0x34, +0x00,0x00,0x62,0xA4, +0x16,0x01,0xD4,0x37, +0x3F,0x3F,0x03,0x24, +0x2F,0x00,0x02,0x3C, +0x00,0x00,0x83,0xA6, +0x17,0x32,0x42,0x34, +0xFF,0xCF,0x03,0x24, +0x18,0x01,0xD5,0x37, +0x1A,0x01,0xD6,0x37, +0xDC,0x00,0xD7,0x37, +0xD0,0x01,0xD8,0x37, +0x00,0x00,0xA0,0xA6, +0x00,0x00,0xC0,0xA6, +0x00,0x00,0xE3,0xAE, +0x00,0x00,0x02,0xAF, +0x5E,0x00,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x17,0x43,0x63,0x34, +0xD4,0x01,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x10,0x00,0x02,0x3C, +0x20,0x53,0x42,0x34, +0xD8,0x01,0xDF,0x37, +0x00,0x00,0xE2,0xAF, +0x25,0xB0,0x02,0x3C, +0x44,0xA4,0x03,0x34, +0xDC,0x01,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x25,0xB0,0x03,0x3C, +0x1A,0x06,0x02,0x24, +0xE0,0x01,0x63,0x34, +0x00,0x00,0x62,0xA4, +0xC2,0x00,0x02,0x3C, +0x30,0x30,0x03,0x24, +0x51,0x10,0x42,0x34, +0xF4,0x01,0xD0,0x37, +0xF8,0x01,0xD3,0x37, +0x00,0x00,0x03,0xA6, +0x00,0x02,0xD2,0x37, +0x00,0x00,0x62,0xAE, +0x26,0x00,0x03,0x24, +0x03,0x02,0xD9,0x37, +0x04,0x00,0x02,0x24, +0x00,0x00,0x43,0xA6, +0x00,0x00,0x22,0xA3, +0x18,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0xE5,0x00,0x60,0x14, +0x36,0x02,0xC2,0x37, +0x04,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x02,0x80,0x0B,0x3C, +0xDE,0x5D,0x66,0x91, +0x25,0xB0,0x09,0x3C, +0x80,0x00,0x02,0x24, +0x34,0x02,0x24,0x35, +0x00,0x00,0x82,0xA4, +0x37,0x02,0x25,0x35, +0x53,0x00,0x03,0x24, +0x22,0x00,0x02,0x24, +0x00,0x00,0xA3,0xA0, +0xE6,0x00,0xC2,0x10, +0x1B,0x1B,0x02,0x3C, +0x13,0x13,0x02,0x3C, +0x13,0x13,0x42,0x34, +0x60,0x01,0x23,0x35, +0x64,0x01,0x24,0x35, +0x68,0x01,0x25,0x35, +0x7C,0x01,0x2A,0x35, +0x6C,0x01,0x26,0x35, +0x70,0x01,0x27,0x35, +0x74,0x01,0x28,0x35, +0x78,0x01,0x29,0x35, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x82,0xAC, +0x00,0x00,0xA2,0xAC, +0x00,0x00,0xC2,0xAC, +0x00,0x00,0xE2,0xAC, +0x00,0x00,0x02,0xAD, +0x00,0x00,0x22,0xAD, +0x00,0x00,0x42,0xAD, +0xDE,0x5D,0x65,0x91, +0x25,0xB0,0x0C,0x3C, +0x01,0x00,0x03,0x3C, +0x80,0x01,0x82,0x35, +0x08,0x5F,0x63,0x34, +0x22,0x00,0x04,0x24, +0x00,0x00,0x43,0xAC, +0xE5,0x00,0xA4,0x10, +0x0F,0x1F,0x02,0x3C, +0x92,0x00,0x02,0x24, +0xE2,0x00,0xA2,0x10, +0x0F,0x1F,0x02,0x3C, +0x0F,0x10,0x02,0x3C, +0x00,0xF0,0x4F,0x34, +0xF7,0x01,0x91,0x35, +0x15,0xF0,0x4D,0x34, +0x77,0x00,0x0E,0x24, +0x84,0x01,0x87,0x35, +0x88,0x01,0x88,0x35, +0x10,0xF0,0x44,0x34, +0x8C,0x01,0x85,0x35, +0x05,0xF0,0x42,0x34, +0x00,0x00,0xED,0xAC, +0x90,0x01,0x83,0x35, +0x00,0x00,0x04,0xAD, +0x94,0x01,0x86,0x35, +0x00,0x00,0xA2,0xAC, +0xF5,0x0F,0x02,0x24, +0x00,0x00,0x6F,0xAC, +0x98,0x01,0x89,0x35, +0x00,0x00,0xC2,0xAC, +0x9C,0x01,0x8A,0x35, +0xA0,0x01,0x8B,0x35, +0xF0,0x0F,0x03,0x24, +0xF6,0x01,0x8C,0x35, +0x0D,0x00,0x02,0x24, +0x00,0x00,0x23,0xAD, +0x00,0x00,0x42,0xAD, +0x00,0x00,0x6D,0xAD, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x8E,0xA1, +0x00,0x00,0x2E,0xA2, +0xFB,0x5D,0x42,0x90, +0x25,0xB0,0x1F,0x3C, +0xA7,0x01,0xE7,0x37, +0x1C,0x00,0xA2,0xAF, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0xE2,0xA0, +0x05,0x06,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x03,0x04,0x63,0x34, +0x0C,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0x01,0x02,0x06,0x3C, +0xC2,0x01,0x42,0x34, +0xA8,0x01,0xE8,0x37, +0xAC,0x01,0xE9,0x37, +0xB0,0x01,0xEA,0x37, +0xB4,0x01,0xEB,0x37, +0xB8,0x01,0xEC,0x37, +0xBC,0x01,0xED,0x37, +0xC0,0x01,0xEE,0x37, +0xC1,0x01,0xEF,0x37, +0x00,0x00,0x05,0xAD, +0x00,0x00,0x25,0xAD, +0x00,0x00,0x46,0xAD, +0x00,0x00,0x63,0xAD, +0x00,0x00,0x86,0xAD, +0x00,0x00,0xA3,0xAD, +0x00,0x00,0xC4,0xA1, +0x25,0xB0,0x03,0x3C, +0x00,0x00,0xE4,0xA1, +0x00,0x00,0x44,0xA0, +0x25,0xB0,0x02,0x3C, +0x0D,0x00,0x17,0x24, +0x0E,0x00,0x18,0x24, +0xC4,0x01,0x63,0x34, +0xC5,0x01,0x42,0x34, +0xC3,0x01,0xF1,0x37, +0x00,0x00,0x37,0xA2, +0xC6,0x01,0xF4,0x37, +0x00,0x00,0x77,0xA0, +0xC7,0x01,0xF5,0x37, +0x00,0x00,0x58,0xA0, +0x0F,0x00,0x02,0x24, +0x00,0x00,0x98,0xA2, +0x00,0x00,0xA2,0xA2, +0xD3,0x01,0x02,0x3C, +0x46,0x00,0xF6,0x37, +0x48,0x00,0xFE,0x37, +0x0E,0xF0,0x42,0x34, +0x00,0x00,0xC0,0xA6, +0x00,0x00,0xC2,0xAF, +0x1C,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x09,0x00,0x60,0x10, +0x44,0x00,0xF7,0x37, +0x00,0x00,0xE2,0x8E, +0x00,0x02,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0xE2,0xAE, +0x00,0x00,0xC3,0x8F, +0x00,0x04,0x02,0x3C, +0x25,0x18,0x62,0x00, +0x00,0x00,0xC3,0xAF, +0x4C,0x00,0xE2,0x37, +0x00,0x00,0x40,0xA0, +0x4D,0x00,0xE3,0x37, +0xF1,0x02,0xE4,0x37, +0x08,0x00,0x02,0x24, +0x00,0x00,0x60,0xA0, +0x40,0x00,0xE6,0x37, +0x00,0x00,0x82,0xA0, +0x64,0x03,0xE5,0x37, +0xBC,0x00,0x03,0x24, +0xFC,0x37,0x02,0x24, +0x00,0x00,0xC3,0xA4, +0x00,0x00,0xA0,0xA0, +0x00,0x00,0xC2,0xA4, +0x02,0x80,0x02,0x3C, +0xD8,0x00,0xE9,0x37, +0x30,0x1F,0x43,0x24, +0x00,0x00,0x26,0x91, +0xAA,0x1B,0x64,0x90, +0x2A,0xB0,0x05,0x3C, +0xA0,0xFF,0x02,0x24, +0x26,0xB0,0x07,0x3C, +0x25,0x30,0xC2,0x00, +0x30,0x00,0xAD,0x34, +0x34,0x00,0xA8,0x34, +0x01,0x00,0x83,0x24, +0x38,0x00,0xA5,0x34, +0x20,0x20,0x02,0x24, +0x00,0x00,0x26,0xA1, +0x79,0x00,0xEA,0x34, +0x00,0x00,0x03,0xA1, +0x00,0x00,0xA2,0xA4, +0x40,0x00,0x03,0x24, +0x16,0x00,0x02,0x24, +0x00,0x00,0xA3,0xA1, +0x94,0x00,0xEB,0x37, +0x00,0x00,0x42,0xA1, +0x98,0x00,0xEC,0x37, +0x64,0x00,0x03,0x24, +0x22,0x00,0x02,0x24, +0x00,0x00,0x63,0xA5, +0x7C,0x00,0xF4,0x34, +0x00,0x00,0x82,0xA5, +0x7A,0x00,0xE7,0x34, +0x04,0x00,0x03,0x24, +0x20,0x0C,0x02,0x24, +0x00,0x00,0xE3,0xA0, +0x9C,0x00,0xEE,0x37, +0x00,0x00,0x82,0xA6, +0x9A,0x00,0xEF,0x37, +0x0A,0x00,0x03,0x24, +0xFF,0x03,0x02,0x24, +0x00,0x00,0xC3,0xA1, +0x00,0x00,0xE2,0xA5, +0x25,0xB0,0x02,0x3C, +0x02,0x00,0x03,0x24, +0x96,0x00,0x42,0x34, +0x00,0x00,0x43,0xA4, +0x89,0x00,0xF5,0x37, +0xB7,0x00,0xF1,0x37, +0x20,0x00,0x02,0x24, +0x09,0x00,0x03,0x24, +0x00,0x00,0x22,0xA2, +0x00,0x00,0xA3,0xA2, +0x00,0x00,0xE2,0x96, +0xFF,0xFD,0x03,0x24, +0x04,0x02,0x05,0x24, +0x24,0x10,0x43,0x00, +0x00,0x00,0xE2,0xA6, +0x00,0x00,0xE3,0x96, +0x29,0xB0,0x02,0x3C, +0x40,0x00,0x42,0x34, +0x00,0x02,0x63,0x34, +0x00,0x00,0xE3,0xA6, +0xFF,0x00,0x84,0x30, +0x00,0x00,0x45,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xFF,0xFF,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x02,0x80,0x0B,0x3C, +0xDE,0x5D,0x66,0x91, +0x25,0xB0,0x09,0x3C, +0x80,0x00,0x02,0x24, +0x34,0x02,0x24,0x35, +0x00,0x00,0x82,0xA4, +0x37,0x02,0x25,0x35, +0x53,0x00,0x03,0x24, +0x22,0x00,0x02,0x24, +0x00,0x00,0xA3,0xA0, +0x1E,0xFF,0xC2,0x14, +0x13,0x13,0x02,0x3C, +0x1B,0x1B,0x02,0x3C, +0x1B,0x1B,0x42,0x34, +0x60,0x01,0x23,0x35, +0x64,0x01,0x24,0x35, +0x68,0x01,0x25,0x35, +0x7C,0x01,0x2A,0x35, +0x6C,0x01,0x26,0x35, +0x70,0x01,0x27,0x35, +0x74,0x01,0x28,0x35, +0x78,0x01,0x29,0x35, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x82,0xAC, +0x00,0x00,0xA2,0xAC, +0x00,0x00,0xC2,0xAC, +0x00,0x00,0xE2,0xAC, +0x00,0x00,0x02,0xAD, +0x00,0x00,0x22,0xAD, +0x00,0x00,0x42,0xAD, +0xDE,0x5D,0x65,0x91, +0x25,0xB0,0x0C,0x3C, +0x01,0x00,0x03,0x3C, +0x80,0x01,0x82,0x35, +0x08,0x5F,0x63,0x34, +0x22,0x00,0x04,0x24, +0x00,0x00,0x43,0xAC, +0x1D,0xFF,0xA4,0x14, +0x0F,0x1F,0x02,0x3C, +0x00,0xF0,0x4F,0x34, +0xF7,0x01,0x91,0x35, +0x15,0xF0,0x4D,0x34, +0x78,0x67,0x00,0x08, +0xFF,0xFF,0x0E,0x24, +0x02,0x80,0x02,0x3C, +0xDF,0x5D,0x44,0x90, +0x06,0x00,0x03,0x24, +0x0C,0x00,0x83,0x10, +0x00,0x1C,0x02,0x3C, +0x00,0x1C,0x42,0x34, +0xA0,0x00,0x24,0x36, +0x00,0x00,0x82,0xAC, +0x00,0xE0,0x02,0x3C, +0xA4,0x00,0x25,0x36, +0x00,0x04,0x03,0x24, +0xA8,0x00,0x26,0x36, +0x00,0xB0,0x42,0x34, +0x00,0x00,0xA3,0xAC, +0xDA,0x66,0x00,0x08, +0x00,0x00,0x00,0x00, +0x16,0x16,0x02,0x3C, +0x07,0x07,0x42,0x34, +0xA0,0x00,0x23,0x36, +0x00,0x00,0x62,0xAC, +0x00,0xC0,0x02,0x3C, +0xA8,0x00,0x25,0x36, +0xA4,0x00,0x24,0x36, +0x00,0xB4,0x42,0x34, +0x00,0x00,0x80,0xAC, +0x00,0x00,0xA2,0xAC, +0xDC,0x66,0x00,0x08, +0x02,0x80,0x03,0x3C, +0xE8,0xFF,0xBD,0x27, +0x01,0x00,0x06,0x24, +0xE8,0x0E,0x04,0x24, +0x10,0x00,0xBF,0xAF, +0xA9,0x45,0x00,0x0C, +0x00,0x10,0x05,0x3C, +0x60,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x20,0x04,0x06,0x3C, +0x20,0x04,0xC6,0x34, +0x25,0x30,0x46,0x00, +0x60,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x70,0x08,0x04,0x24, +0x00,0x04,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x20,0x06,0x3C, +0x80,0x00,0xC6,0x34, +0x80,0x0C,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x00,0x40,0x06,0x3C, +0x10,0x00,0xBF,0x8F, +0x00,0x01,0xC6,0x34, +0x88,0x0C,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0xA9,0x45,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x10,0x00,0xA0,0x10, +0x21,0x38,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x00,0x00,0x82,0x8C, +0x04,0x00,0x83,0x8C, +0x21,0x30,0x00,0x00, +0x21,0x10,0x48,0x00, +0x00,0x00,0x43,0xAC, +0x01,0x00,0xC2,0x24, +0xFF,0x00,0x46,0x30, +0x06,0x00,0xC3,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0xC2,0x24, +0x02,0x00,0xE7,0x24, +0x2B,0x10,0xE5,0x00, +0xF3,0xFF,0x40,0x14, +0x08,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x90,0xA0,0x00, +0x0B,0x00,0xA0,0x10, +0x21,0x88,0x00,0x00, +0x21,0x80,0x80,0x00, +0x00,0x00,0x04,0x8E, +0x04,0x00,0x05,0x8E, +0x08,0x00,0x06,0x8E, +0x03,0x00,0x31,0x26, +0xA9,0x45,0x00,0x0C, +0x0C,0x00,0x10,0x26, +0x2B,0x10,0x32,0x02, +0xF8,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x21,0x40,0x80,0x00, +0x21,0x48,0x00,0x00, +0x1E,0x00,0xA0,0x10, +0x21,0x38,0x00,0x00, +0x80,0x30,0x07,0x00, +0x21,0x10,0xC8,0x00, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0xF2,0x63,0x24, +0x1D,0x00,0x62,0x2C, +0x12,0x00,0x40,0x10, +0x80,0x10,0x03,0x00, +0x02,0x80,0x03,0x3C, +0x64,0xE9,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x23,0x18,0x69,0x00, +0x08,0x00,0x44,0x8C, +0x02,0x80,0x02,0x3C, +0x80,0x18,0x03,0x00, +0x30,0x1F,0x42,0x24, +0x21,0x18,0x62,0x00, +0x04,0x1D,0x64,0xAC, +0x01,0x00,0x29,0x25, +0x03,0x00,0xE7,0x24, +0x2B,0x10,0xE5,0x00, +0xE5,0xFF,0x40,0x14, +0x80,0x30,0x07,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xD6,0xFF,0x40,0x14, +0x00,0x1D,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xC8,0xFF,0x40,0x14, +0xFC,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xBA,0xFF,0x40,0x14, +0xF8,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xAC,0xFF,0x40,0x14, +0x08,0x1D,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0x9E,0xFF,0x40,0x14, +0xF4,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0x90,0xFF,0x40,0x14, +0xF0,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xFC,0x37,0x03,0x24, +0x40,0x00,0x42,0x34, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x43,0xA4, +0xE8,0xFF,0xBD,0x27, +0xA4,0xCF,0x84,0x24, +0x10,0x00,0xBF,0xAF, +0x94,0x68,0x00,0x0C, +0x74,0x01,0x05,0x24, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x12,0x00,0x03,0x24, +0x34,0x00,0x83,0x10, +0x13,0x00,0x82,0x28, +0x17,0x00,0x40,0x14, +0x11,0x00,0x02,0x24, +0x22,0x00,0x02,0x24, +0x36,0x00,0x82,0x10, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x04,0x3C, +0x2C,0xCC,0x84,0x24, +0xBF,0x68,0x00,0x0C, +0x54,0x00,0x05,0x24, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x44,0x90, +0x01,0x00,0x03,0x24, +0x1A,0x00,0x83,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2C,0xC7,0x84,0x24, +0x94,0x68,0x00,0x0C, +0x40,0x01,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x84,0x08,0x04,0x24, +0xFF,0x00,0x05,0x24, +0x58,0x00,0x06,0x24, +0x1B,0x47,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xED,0xFF,0x82,0x14, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x04,0x3C, +0xE4,0xCE,0x84,0x24, +0xA7,0x68,0x00,0x0C, +0x30,0x00,0x05,0x24, +0x02,0x80,0x04,0x3C, +0x2C,0xCC,0x84,0x24, +0xBF,0x68,0x00,0x0C, +0x54,0x00,0x05,0x24, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x44,0x90, +0x01,0x00,0x03,0x24, +0xE8,0xFF,0x83,0x14, +0x00,0x00,0x00,0x00, +0x75,0x68,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2C,0xC7,0x84,0x24, +0x94,0x68,0x00,0x0C, +0x40,0x01,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x84,0x08,0x04,0x24, +0xFF,0x00,0x05,0x24, +0x58,0x00,0x06,0x24, +0x1B,0x47,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x30,0xCE,0x84,0x24, +0x2D,0x00,0x05,0x24, +0xA7,0x68,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x64,0x69,0x00,0x08, +0x02,0x80,0x04,0x3C, +0x7C,0xCD,0x84,0x24, +0x7B,0x69,0x00,0x08, +0x2D,0x00,0x05,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x50,0x0C,0x04,0x24, +0xFF,0x00,0x05,0x24, +0x02,0x80,0x10,0x3C, +0x14,0x00,0xBF,0xAF, +0x0A,0x47,0x00,0x0C, +0x30,0x1F,0x10,0x26, +0x60,0x1D,0x02,0xA2, +0x58,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x61,0x1D,0x02,0xA2, +0x60,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x62,0x1D,0x02,0xA2, +0x68,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x63,0x1D,0x02,0xA2, +0x38,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0xE8,0x1C,0x02,0xA2, +0x34,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0xEC,0x1C,0x02,0xAE, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x03,0x3C, +0x84,0xA7,0x42,0x24, +0xBC,0x5E,0x60,0xAC, +0x1C,0x5E,0xA2,0xAC, +0x02,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0xC0,0x5E,0x60,0xA4, +0x1C,0x5E,0xA4,0x24, +0x88,0x0D,0x42,0x24, +0x02,0x80,0x03,0x3C, +0xC2,0x5E,0x60,0xA4, +0x08,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x02,0x80,0x06,0x3C, +0x88,0x10,0x42,0x24, +0xA4,0x0D,0x63,0x24, +0xC4,0x5E,0xC7,0x24, +0x14,0x00,0x82,0xAC, +0x10,0x00,0x83,0xAC, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xC4,0x5E,0xC0,0xAC, +0x04,0x00,0xE0,0xAC, +0xCC,0x5E,0x40,0xA0, +0xD0,0x5E,0x60,0xAC, +0x01,0x80,0x02,0x3C, +0x30,0xD2,0x42,0x24, +0x7C,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0xA4,0x10,0x63,0x24, +0x64,0x13,0x42,0x24, +0x1C,0x00,0x83,0xAC, +0x20,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x2C,0x16,0x63,0x24, +0xF0,0x18,0x42,0x24, +0x24,0x00,0x83,0xAC, +0x28,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x01,0x80,0x02,0x3C, +0xC8,0x2A,0x63,0x24, +0x98,0x01,0x42,0x24, +0x2C,0x00,0x83,0xAC, +0x50,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x10,0x1C,0x63,0x24, +0xFC,0x1D,0x42,0x24, +0x30,0x00,0x83,0xAC, +0x38,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x03,0x63,0x24, +0xB4,0x1B,0x42,0x24, +0x4C,0x00,0x83,0xAC, +0x08,0x00,0xE0,0x03, +0x3C,0x00,0x82,0xAC, +0x25,0xB0,0x02,0x3C, +0x08,0x00,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x0E,0x3C, +0x02,0x80,0x08,0x3C, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x03,0x4D,0x24, +0x00,0x1C,0x6C,0x24, +0x01,0x00,0x07,0x24, +0x00,0x00,0xCB,0x25, +0xFF,0xFF,0x0A,0x24, +0x00,0x04,0x09,0x25, +0x80,0x1A,0x07,0x00, +0x21,0x10,0x6B,0x00, +0x00,0x00,0x42,0xAC, +0x90,0x00,0x4A,0xAC, +0x00,0x04,0x04,0x8D, +0x01,0x00,0xE7,0x24, +0x08,0x00,0x45,0x24, +0x21,0x18,0x6D,0x00, +0x07,0x00,0xE6,0x28, +0x04,0x00,0x82,0xAC, +0x00,0x00,0x44,0xAC, +0x04,0x00,0x49,0xAC, +0x00,0x04,0x02,0xAD, +0x8C,0x00,0x40,0xAC, +0x6C,0x00,0xA3,0xAC, +0xF0,0xFF,0xC0,0x14, +0x68,0x00,0xAC,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0xC9,0xAD, +0x07,0x00,0xA2,0x2C, +0x13,0x00,0x40,0x10, +0xFF,0xFF,0x07,0x24, +0x02,0x80,0x02,0x3C, +0x80,0x1A,0x05,0x00, +0x00,0x00,0x42,0x24, +0x0E,0x00,0xA0,0x10, +0x21,0x30,0x62,0x00, +0x90,0x00,0xC3,0x8C, +0xFF,0xFF,0x02,0x24, +0x0A,0x00,0x62,0x14, +0x00,0x00,0x00,0x00, +0x8C,0x00,0xC2,0x8C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x02,0x24, +0x88,0x00,0xC4,0xAC, +0x8C,0x00,0xC2,0xAC, +0x90,0x00,0xC5,0xAC, +0x21,0x38,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xE0,0x00, +0x25,0xB0,0x06,0x3C, +0x02,0x80,0x02,0x3C, +0xE0,0xFF,0xBD,0x27, +0x68,0xA8,0x42,0x24, +0xDB,0xFF,0x03,0x24, +0x18,0x03,0xC4,0x34, +0x27,0x00,0xC5,0x34, +0x00,0x00,0x82,0xAC, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0xA3,0xA0, +0x06,0x00,0xC2,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x63,0x30, +0x5A,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x1B,0x00,0xC3,0x34, +0x07,0x00,0x02,0x24, +0x00,0x00,0x62,0xA0, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x34,0x1C,0x04,0x8E, +0xCB,0x45,0x00,0x0C, +0x10,0x00,0x05,0x24, +0x40,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x3C, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x3C,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x58,0x1C,0x04,0x8E, +0x00,0x04,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x58,0x1C,0x04,0x8E, +0x00,0x08,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x02,0x80,0x05,0x3C, +0xEC,0xD9,0xA5,0x24, +0x21,0x20,0x00,0x00, +0x9F,0x47,0x00,0x0C, +0xCA,0x00,0x06,0x24, +0x31,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE7,0x5D,0x43,0x90, +0x01,0x00,0x11,0x24, +0x57,0x00,0x71,0x10, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x43,0x90, +0x00,0x00,0x00,0x00, +0x58,0x00,0x71,0x10, +0x02,0x80,0x05,0x3C, +0x34,0x1C,0x04,0x8E, +0x21,0x30,0x40,0x02, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x80,0x11,0x3C, +0xDE,0x5D,0x23,0x92, +0x11,0x00,0x02,0x24, +0x2E,0x00,0x62,0x10, +0x00,0x08,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x34,0x1C,0x04,0x8E, +0xCB,0x45,0x00,0x0C, +0x10,0x00,0x05,0x3C, +0x40,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x3C, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x3C,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x58,0x1C,0x04,0x8E, +0x00,0x04,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x58,0x1C,0x04,0x8E, +0x00,0x08,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x02,0x80,0x05,0x3C, +0x94,0xD9,0xA5,0x24, +0x01,0x00,0x04,0x24, +0x9F,0x47,0x00,0x0C, +0x16,0x00,0x06,0x24, +0x0C,0x00,0x40,0x14, +0x21,0x18,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xA9,0xFF,0x62,0x14, +0x1F,0x00,0xC3,0x34, +0x2F,0x6A,0x00,0x08, +0x07,0x00,0x02,0x24, +0x34,0x1C,0x04,0x8E, +0x21,0x30,0x40,0x02, +0xA9,0x45,0x00,0x0C, +0x10,0x00,0x05,0x3C, +0x00,0x08,0x04,0x24, +0x00,0x01,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0xDE,0x5D,0x23,0x92, +0x11,0x00,0x02,0x24, +0x1D,0x00,0x62,0x10, +0x00,0x08,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x0F,0x00,0x05,0x3C, +0x0C,0x00,0x06,0x3C, +0xFF,0xFF,0xA5,0x34, +0x00,0xB4,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x08,0x00,0x04,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x03,0x24, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x84,0xD8,0xA5,0x24, +0x21,0x20,0x00,0x00, +0x9F,0x47,0x00,0x0C, +0x16,0x00,0x06,0x24, +0x55,0x6A,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xDC,0xD8,0xA5,0x24, +0x21,0x20,0x00,0x00, +0x9F,0x47,0x00,0x0C, +0x16,0x00,0x06,0x24, +0x59,0x6A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x9A,0x6A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x02,0x80,0x02,0x3C, +0x61,0x5A,0x47,0x90, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x03,0x00,0x03,0x24, +0x1E,0x3B,0x84,0x24, +0xAC,0xE3,0xA5,0x24, +0x0F,0x00,0xE3,0x10, +0x0D,0x00,0x06,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x1E,0x3B,0x84,0x24, +0x5C,0xE3,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x0D,0x00,0x06,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x10,0x00,0xBF,0x8F, +0x2B,0x3B,0x84,0x24, +0x6C,0xE3,0xA5,0x24, +0x0D,0x00,0x06,0x24, +0x10,0x52,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x10,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x10,0x00,0xBF,0x8F, +0x2B,0x3B,0x84,0x24, +0x9C,0xE3,0xA5,0x24, +0x0D,0x00,0x06,0x24, +0x10,0x52,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x11,0x3C, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x10,0x26, +0x64,0x5A,0x24,0x26, +0x14,0xDD,0xA5,0x24, +0x34,0x00,0x06,0x24, +0x18,0x00,0xBF,0xAF, +0x10,0x52,0x00,0x0C, +0x64,0x5A,0x31,0x26, +0xBD,0x6A,0x00,0x0C, +0x68,0x3B,0x11,0xAE, +0x02,0x00,0x11,0x24, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x06,0x3C, +0xA0,0x38,0x11,0xA2, +0xBC,0x57,0x84,0x24, +0xFC,0x64,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0x98,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x01,0x80,0x06,0x3C, +0xBC,0x38,0x11,0xA2, +0xD8,0x57,0x84,0x24, +0x0C,0x31,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0xB4,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x01,0x80,0x06,0x3C, +0xD8,0x38,0x11,0xA2, +0xF4,0x57,0x84,0x24, +0xC0,0x2E,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0xD0,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x01,0x80,0x06,0x3C, +0xF4,0x38,0x11,0xA2, +0x10,0x58,0x84,0x24, +0x14,0x25,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0xEC,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x06,0x3C, +0x10,0x39,0x11,0xA2, +0x2C,0x58,0x84,0x24, +0x58,0x64,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0x08,0x39,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x06,0x3C, +0x48,0x39,0x11,0xA2, +0x40,0x39,0x00,0xAE, +0x64,0x58,0x84,0x24, +0x38,0x3B,0xC6,0x24, +0xA2,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x49,0xF3,0x43,0x90, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x9C,0x3E,0x03,0xA2, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x03,0x80,0x05,0x3C, +0x00,0x80,0xA5,0x24, +0x40,0x10,0x0D,0x3C, +0xFF,0xFF,0xA5,0x30, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x25,0xC8,0xAD,0x00, +0x38,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0xE0,0xFF,0xBD,0x27, +0x44,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0x1C,0x00,0xB7,0xAF, +0x18,0x00,0xB6,0xAF, +0x14,0x00,0xB5,0xAF, +0x10,0x00,0xB4,0xAF, +0x0C,0x00,0xB3,0xAF, +0x08,0x00,0xB2,0xAF, +0x04,0x00,0xB1,0xAF, +0x00,0x00,0xB0,0xAF, +0x50,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0x5C,0x37,0x59,0xAC, +0xAA,0x1B,0x44,0x90, +0x00,0x01,0x39,0x27, +0x68,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0x74,0x37,0x59,0xAC, +0x20,0xB0,0x06,0x3C, +0x44,0x37,0x48,0x8C, +0x50,0x37,0x49,0x8C, +0x5C,0x37,0x4A,0x8C, +0x68,0x37,0x4B,0x8C, +0x74,0x37,0x4C,0x8C, +0x00,0x22,0x04,0x00, +0x00,0x01,0xC7,0x34, +0xFF,0x1F,0x03,0x3C, +0x00,0x01,0x39,0x27, +0xFF,0xFF,0x63,0x34, +0x21,0x38,0x87,0x00, +0x21,0x20,0x86,0x00, +0x24,0x38,0xE3,0x00, +0x20,0x10,0x06,0x3C, +0x24,0x20,0x83,0x00, +0x80,0x37,0x59,0xAC, +0x21,0x78,0x20,0x03, +0x25,0x28,0xAD,0x00, +0x25,0xB0,0x0E,0x3C, +0x00,0x01,0x39,0x27, +0x34,0x37,0x45,0xAC, +0x40,0x37,0x48,0xAC, +0x4C,0x37,0x49,0xAC, +0x58,0x37,0x4A,0xAC, +0xF8,0x36,0x44,0xAC, +0x64,0x37,0x4B,0xAC, +0x04,0x37,0x47,0xAC, +0x70,0x37,0x4C,0xAC, +0xAC,0x00,0xC3,0x35, +0xCC,0x36,0x46,0xAC, +0xC8,0x36,0x46,0xAC, +0xD8,0x36,0x46,0xAC, +0xD4,0x36,0x46,0xAC, +0xE4,0x36,0x46,0xAC, +0x8C,0x37,0x59,0xAC, +0xFC,0x36,0x44,0xAC, +0x08,0x37,0x47,0xAC, +0x7C,0x37,0x4F,0xAC, +0xE0,0x36,0x46,0xAC, +0xF0,0x36,0x46,0xAC, +0xEC,0x36,0x46,0xAC, +0x14,0x37,0x46,0xAC, +0x10,0x37,0x46,0xAC, +0x00,0x02,0x39,0x27, +0x00,0x00,0x68,0x8C, +0xAC,0x1B,0x47,0x94, +0xA4,0x37,0x59,0xAC, +0xB0,0x00,0xC3,0x35, +0x00,0x00,0x75,0x8C, +0x21,0x10,0x05,0x3C, +0x8C,0x37,0x52,0x8C, +0x23,0x10,0x0B,0x3C, +0x22,0x10,0x0F,0x3C, +0x02,0x80,0x14,0x3C, +0x02,0x80,0x16,0x3C, +0x02,0x80,0x17,0x3C, +0x02,0x80,0x18,0x3C, +0x00,0x80,0xA4,0x34, +0x21,0x98,0x20,0x03, +0x23,0x20,0x87,0x00, +0x00,0x04,0x39,0x27, +0x24,0x10,0x07,0x3C, +0x9C,0x57,0x8A,0x26, +0xA4,0x57,0xC9,0x26, +0xAC,0x57,0xEC,0x26, +0xB4,0x57,0x0D,0x27, +0x00,0x04,0x70,0x35, +0x01,0x00,0x08,0x25, +0x00,0x40,0xF1,0x35, +0x00,0x01,0xCE,0x35, +0x01,0x00,0x03,0x24, +0x88,0x37,0x52,0xAC, +0x91,0x37,0x43,0xA0, +0xA0,0x37,0x53,0xAC, +0x08,0x38,0x50,0xAC, +0xCC,0x37,0x48,0xAC, +0xD8,0x37,0x44,0xAC, +0xFC,0x37,0x51,0xAC, +0xF0,0x37,0x55,0xAC, +0x00,0x00,0xC7,0xAD, +0xEC,0x37,0x47,0xAC, +0x0C,0x38,0x46,0xAC, +0x20,0x37,0x46,0xAC, +0x1C,0x37,0x46,0xAC, +0xAA,0x37,0x40,0xA4, +0xA9,0x37,0x40,0xA0, +0xA8,0x37,0x40,0xA0, +0x00,0x38,0x4B,0xAC, +0x04,0x38,0x4B,0xAC, +0xC4,0x37,0x45,0xAC, +0xC8,0x37,0x45,0xAC, +0xD0,0x37,0x45,0xAC, +0xD4,0x37,0x45,0xAC, +0xF4,0x37,0x4F,0xAC, +0xF8,0x37,0x4F,0xAC, +0xE8,0x37,0x47,0xAC, +0x10,0x38,0x46,0xAC, +0x1C,0x38,0x59,0xAC, +0x18,0x38,0x59,0xAC, +0x04,0x00,0x4A,0xAD, +0x9C,0x57,0x8A,0xAE, +0x04,0x00,0x8C,0xAD, +0xA4,0x57,0xC9,0xAE, +0x04,0x00,0xAD,0xAD, +0xAC,0x57,0xEC,0xAE, +0xB4,0x57,0x0D,0xAF, +0x04,0x00,0x29,0xAD, +0x02,0x80,0x02,0x3C, +0x00,0x1C,0x43,0x24, +0x01,0x00,0x05,0x24, +0x21,0x20,0x20,0x01, +0x0F,0x00,0x06,0x24, +0x21,0x10,0x80,0x00, +0xFF,0xFF,0xC6,0x24, +0x08,0x00,0x79,0xAC, +0x00,0x00,0x63,0xAC, +0x10,0x00,0x65,0xAC, +0x00,0x00,0x69,0xAC, +0x21,0x20,0x60,0x00, +0x04,0x00,0x62,0xAC, +0x00,0x00,0x43,0xAC, +0x00,0x01,0x39,0x27, +0xF5,0xFF,0xC1,0x04, +0x18,0x00,0x63,0x24, +0x02,0x80,0x02,0x3C, +0xAC,0x57,0x48,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x07,0x8D, +0x80,0x1D,0x4B,0x24, +0x04,0x00,0x24,0xAD, +0x00,0x1C,0x6A,0x24, +0x02,0x00,0x09,0x24, +0x21,0x28,0x00,0x00, +0x0F,0x00,0x06,0x24, +0x21,0x20,0xAB,0x00, +0x21,0x10,0xAA,0x00, +0xFF,0xFF,0xC6,0x24, +0x88,0x01,0x59,0xAC, +0x90,0x01,0x49,0xAC, +0x18,0x00,0xA5,0x24, +0x00,0x00,0x88,0xAC, +0x04,0x00,0x87,0xAC, +0x00,0x00,0xE4,0xAC, +0x00,0x02,0x39,0x27, +0xF5,0xFF,0xC1,0x04, +0x21,0x38,0x80,0x00, +0x02,0x80,0x02,0x3C, +0xB4,0x57,0x49,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x27,0x8D, +0x00,0x1F,0x4B,0x24, +0x04,0x00,0x04,0xAD, +0x00,0x1C,0x6A,0x24, +0x03,0x00,0x08,0x24, +0x21,0x28,0x00,0x00, +0x01,0x00,0x06,0x24, +0x21,0x20,0xAB,0x00, +0x21,0x10,0xAA,0x00, +0xFF,0xFF,0xC6,0x24, +0x08,0x03,0x59,0xAC, +0x10,0x03,0x48,0xAC, +0x18,0x00,0xA5,0x24, +0x00,0x00,0x89,0xAC, +0x04,0x00,0x87,0xAC, +0x00,0x00,0xE4,0xAC, +0x00,0x08,0x39,0x27, +0xF5,0xFF,0xC1,0x04, +0x21,0x38,0x80,0x00, +0x1C,0x00,0xB7,0x8F, +0x18,0x00,0xB6,0x8F, +0x14,0x00,0xB5,0x8F, +0x10,0x00,0xB4,0x8F, +0x0C,0x00,0xB3,0x8F, +0x08,0x00,0xB2,0x8F, +0x04,0x00,0xB1,0x8F, +0x00,0x00,0xB0,0x8F, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x00,0x24,0xAD, +0xD0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xB2,0xAF, +0x02,0x80,0x03,0x3C, +0x78,0xE8,0x52,0x24, +0x02,0x80,0x02,0x3C, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x2C,0x00,0xBF,0xAF, +0x04,0xE8,0x73,0x24, +0x30,0x1F,0x50,0x24, +0x21,0x88,0x00,0x00, +0x02,0x80,0x14,0x3C, +0xDD,0x59,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x1C,0x24,0x05,0x8E, +0x6C,0x00,0x66,0x8E, +0xE4,0xE7,0x82,0x26, +0x6C,0x00,0x43,0x8E, +0x1B,0x00,0x44,0x90, +0xFF,0xF1,0x02,0x24, +0x21,0x18,0x66,0x00, +0x24,0x28,0xA2,0x00, +0x00,0x21,0x04,0x00, +0x42,0x18,0x03,0x00, +0x00,0x02,0xA5,0x34, +0xE8,0x23,0x03,0xAE, +0x0C,0x24,0x04,0xAE, +0x1C,0x24,0x05,0xAE, +0x10,0x24,0x04,0xAE, +0x21,0x30,0x00,0x00, +0x21,0x10,0x06,0x02, +0x01,0x00,0xC6,0x24, +0x1D,0x00,0xC3,0x28, +0x3D,0x24,0x40,0xA0, +0x20,0x24,0x40,0xA0, +0xFA,0xFF,0x60,0x14, +0x5A,0x24,0x40,0xA0, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x78,0x24,0x00,0xAE, +0xE3,0xFF,0x40,0x14, +0x94,0x00,0x10,0x26, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x4B,0x24, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x6F,0x24, +0x04,0xE8,0x4D,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xE4,0xE7,0x6E,0x24, +0xC4,0xE7,0x4C,0x24, +0x21,0x88,0x00,0x00, +0x80,0x18,0x11,0x00, +0x21,0x20,0x6D,0x00, +0x21,0x10,0x6F,0x00, +0x21,0x28,0x2E,0x02, +0x21,0x30,0x2C,0x02, +0x00,0x00,0x88,0x8C, +0x00,0x00,0xA9,0x90, +0x00,0x00,0xC7,0x90, +0x00,0x00,0x4A,0x8C, +0x21,0x10,0x2B,0x02, +0x01,0x00,0x31,0x26, +0x21,0x18,0x6B,0x00, +0x1D,0x00,0x24,0x2A, +0x60,0x05,0x68,0xAC, +0x3E,0x05,0x47,0xA0, +0xD4,0x05,0x6A,0xAC, +0xEF,0xFF,0x80,0x14, +0x04,0x05,0x49,0xA0, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4A,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xA0,0xE6,0x6B,0x24, +0x40,0xE5,0x4C,0x24, +0x21,0x88,0x00,0x00, +0x21,0x48,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x40,0x2A,0x01, +0x21,0x38,0x2B,0x01, +0x21,0x10,0xE6,0x00, +0x91,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x06,0x01, +0x01,0x00,0xC6,0x24, +0x05,0x00,0xC2,0x28, +0x39,0x04,0x64,0xA0, +0xF8,0xFF,0x40,0x14, +0xA8,0x03,0x65,0xA0, +0x21,0x10,0x2C,0x02, +0x1D,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x2A,0x02, +0x01,0x00,0x31,0x26, +0x1D,0x00,0x22,0x2A, +0xE7,0x04,0x64,0xA0, +0xCA,0x04,0x65,0xA0, +0xEB,0xFF,0x40,0x14, +0x05,0x00,0x29,0x25, +0x52,0x00,0x02,0x24, +0x10,0x00,0xA2,0xA3, +0x41,0x00,0x03,0x24, +0x4D,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x64,0xF3,0xE7,0x24, +0x11,0x00,0xA3,0xA3, +0x12,0x00,0xA2,0xA3, +0xE8,0x03,0x03,0x24, +0x01,0x00,0x02,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0xDC,0x93,0xC6,0x24, +0x0C,0x00,0xE3,0xAC, +0x14,0x00,0xE2,0xA0, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x90,0xFF,0xBD,0x27, +0x48,0x00,0xB0,0xAF, +0x25,0xB0,0x10,0x3C, +0x6C,0x00,0xBF,0xAF, +0x68,0x00,0xBE,0xAF, +0x64,0x00,0xB7,0xAF, +0x58,0x00,0xB4,0xAF, +0x54,0x00,0xB3,0xAF, +0x50,0x00,0xB2,0xAF, +0x4C,0x00,0xB1,0xAF, +0x60,0x00,0xB6,0xAF, +0x5C,0x00,0xB5,0xAF, +0xE0,0x0E,0x02,0x36, +0x21,0x20,0x40,0x00, +0x00,0x00,0x42,0x8C, +0xDC,0x0E,0x12,0x36, +0x70,0x0E,0x13,0x36, +0x10,0x00,0xA2,0xAF, +0x00,0x00,0x42,0x8E, +0x78,0x0E,0x1E,0x36, +0x7C,0x0E,0x14,0x36, +0x14,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8E, +0x25,0xB0,0x02,0x3C, +0x74,0x0E,0x42,0x34, +0x18,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0xD4,0x0E,0x10,0x36, +0xED,0x3F,0x11,0x3C, +0x1C,0x00,0xA2,0xAF, +0x00,0x00,0xC3,0x8F, +0xFB,0x92,0x25,0x36, +0x25,0xB0,0x17,0x3C, +0x20,0x00,0xA3,0xAF, +0x00,0x00,0x82,0x8E, +0x25,0xB0,0x03,0x3C, +0x80,0x0E,0x63,0x34, +0x24,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x25,0xB0,0x02,0x3C, +0x84,0x0E,0x42,0x34, +0x28,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0x88,0x0E,0x63,0x34, +0x2C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x25,0xB0,0x02,0x3C, +0x8C,0x0E,0x42,0x34, +0x30,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0xD0,0x0E,0x63,0x34, +0x34,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x00,0x00,0x00,0x00, +0x38,0x00,0xA3,0xAF, +0x00,0x00,0x02,0x8E, +0x25,0xB0,0x03,0x3C, +0xD8,0x0E,0x63,0x34, +0x3C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x02,0x5C,0x00,0x0C, +0x40,0x00,0xA3,0xAF, +0x21,0x20,0x40,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x60,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x05,0x3C, +0xC0,0xED,0xA5,0x24, +0x00,0x00,0xA4,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x13,0x3C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x20,0xC0,0x03, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x02,0x80,0x02,0x3C, +0xC4,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0xA0,0x00,0x12,0x3C, +0x02,0x80,0x03,0x3C, +0xC8,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x05,0x3C, +0xCC,0xED,0xA5,0x24, +0x00,0x00,0xA4,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x02,0x3C, +0xD0,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x03,0x3C, +0xD4,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x00,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x05,0x3C, +0xD8,0xED,0xA5,0x24, +0x00,0x00,0xA4,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x80,0x00,0x00, +0x14,0x02,0x11,0x3C, +0x20,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x65,0x36, +0x28,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x65,0x36, +0x30,0x54,0x45,0x36, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x08,0x00,0x05,0x3C, +0xE4,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x80,0x80,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x28,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x02,0x01,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x40,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x16,0x68,0x05,0x3C, +0xC2,0x04,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x44,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0xD1,0x28,0x05,0x24, +0x02,0x5C,0x00,0x0C, +0x4C,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x02,0x01,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x60,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x16,0x28,0x05,0x3C, +0x05,0x0D,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x64,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xFB,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xD1,0x28,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x6C,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xFB,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x25,0x22,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x33,0x54,0x45,0x36, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0xE4,0x00,0x05,0x24, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x28,0x0E,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x20,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x28,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x25,0xB0,0x02,0x3C, +0xAC,0x0E,0x42,0x34, +0x00,0x00,0x5E,0x8C, +0x00,0xD8,0x02,0x3C, +0x24,0x10,0xC2,0x03, +0x37,0x00,0x40,0x10, +0x01,0x00,0x10,0x26, +0x0A,0x00,0x02,0x2E, +0x97,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x10,0x00,0xA5,0x8F, +0x25,0xB0,0x10,0x3C, +0x02,0x5C,0x00,0x0C, +0xE0,0x0E,0x04,0x36, +0x14,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xDC,0x0E,0x04,0x36, +0x18,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x70,0x0E,0x04,0x36, +0x1C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x74,0x0E,0x04,0x36, +0x20,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x78,0x0E,0x04,0x36, +0x24,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x7C,0x0E,0x04,0x36, +0x28,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x80,0x0E,0x04,0x36, +0x2C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x84,0x0E,0x04,0x36, +0x30,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x88,0x0E,0x04,0x36, +0x34,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x8C,0x0E,0x04,0x36, +0x38,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD0,0x0E,0x04,0x36, +0x3C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD4,0x0E,0x04,0x36, +0x40,0x00,0xA5,0x8F, +0x88,0x0E,0x04,0x36, +0x6C,0x00,0xBF,0x8F, +0x68,0x00,0xBE,0x8F, +0x64,0x00,0xB7,0x8F, +0x60,0x00,0xB6,0x8F, +0x5C,0x00,0xB5,0x8F, +0x58,0x00,0xB4,0x8F, +0x54,0x00,0xB3,0x8F, +0x50,0x00,0xB2,0x8F, +0x4C,0x00,0xB1,0x8F, +0x48,0x00,0xB0,0x8F, +0x02,0x5C,0x00,0x08, +0x70,0x00,0xBD,0x27, +0x80,0x0C,0xF1,0x36, +0x94,0x0E,0xE3,0x36, +0x00,0x00,0x24,0x8E, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x03,0x3C, +0xFF,0x03,0x95,0x30, +0x24,0x10,0x43,0x00, +0x02,0x14,0x02,0x00, +0x18,0x00,0x55,0x00, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x10,0x26, +0x0C,0x00,0x02,0x8E, +0x00,0xFC,0x12,0x24, +0x00,0x00,0x3E,0x8E, +0x24,0x10,0x52,0x00, +0x21,0x20,0x20,0x02, +0x24,0x30,0xD2,0x03, +0xFF,0xFF,0x13,0x3C, +0xFF,0x03,0x73,0x36, +0x12,0x18,0x00,0x00, +0x02,0x1A,0x03,0x00, +0xFF,0x03,0x63,0x30, +0x25,0x10,0x43,0x00, +0xFF,0x03,0x45,0x30, +0x25,0x28,0xC5,0x00, +0x02,0x5C,0x00,0x0C, +0x0C,0x00,0x02,0xAE, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x9C,0x0E,0xE3,0x36, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x03,0x3C, +0x0C,0x00,0x06,0x8E, +0x24,0x10,0x43,0x00, +0x02,0xB4,0x02,0x00, +0x18,0x00,0xD5,0x02, +0xF0,0xFF,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x24,0x30,0xC2,0x00, +0x00,0x00,0x3E,0x8E, +0xC0,0xFF,0x04,0x3C, +0xFF,0xFF,0x84,0x34, +0x24,0x10,0xC4,0x03, +0x21,0x20,0x20,0x02, +0xFF,0x0F,0x11,0x3C, +0xFF,0xFF,0x31,0x36, +0x12,0x18,0x00,0x00, +0x02,0x1A,0x03,0x00, +0xFF,0x03,0x63,0x30, +0x80,0x1A,0x03,0x00, +0x25,0x30,0xC3,0x00, +0x82,0x2A,0x06,0x00, +0x3F,0x00,0xA5,0x30, +0x00,0x2C,0x05,0x00, +0x0C,0x00,0x06,0xAE, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x45,0x00, +0x94,0x0C,0xE4,0x36, +0x00,0x00,0x9E,0x8C, +0x82,0x29,0x16,0x00, +0x00,0x2F,0x05,0x00, +0x24,0x10,0xD1,0x03, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x45,0x00, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0xB0,0x05,0x3C, +0xA4,0x0E,0xE3,0x36, +0x14,0x0C,0xA5,0x34, +0x00,0x00,0xBE,0x8C, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x05,0x3C, +0x02,0x80,0x03,0x3C, +0xDC,0xED,0x63,0x24, +0x24,0x10,0x45,0x00, +0x00,0x00,0x64,0x8C, +0x02,0x14,0x02,0x00, +0x24,0x18,0xD2,0x03, +0x25,0xF0,0x62,0x00, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0xC0,0x03, +0x25,0xB0,0x02,0x3C, +0xAC,0x0E,0x42,0x34, +0x00,0x00,0x45,0x8C, +0x3F,0x00,0x03,0x3C, +0x24,0x10,0xD3,0x03, +0x24,0x28,0xA3,0x00, +0x82,0x29,0x05,0x00, +0x25,0x28,0x45,0x00, +0x02,0x80,0x02,0x3C, +0xDC,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0xB0,0x05,0x3C, +0xB4,0x0E,0xE3,0x36, +0x88,0x0C,0xA5,0x34, +0x00,0x00,0xA4,0x8C, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x03,0x3C, +0xFF,0x03,0x95,0x30, +0x24,0x10,0x43,0x00, +0x02,0x14,0x02,0x00, +0x18,0x00,0x55,0x00, +0x0C,0x00,0x06,0x8E, +0x00,0x00,0xBE,0x8C, +0x02,0x80,0x02,0x3C, +0x24,0x30,0xD2,0x00, +0xE0,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x24,0x10,0xD2,0x03, +0x12,0x18,0x00,0x00, +0x02,0x1A,0x03,0x00, +0xFF,0x03,0x63,0x30, +0x25,0x30,0xC3,0x00, +0xFF,0x03,0xC5,0x30, +0x25,0x28,0x45,0x00, +0x02,0x5C,0x00,0x0C, +0x0C,0x00,0x06,0xAE, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0xBC,0x0E,0xE2,0x36, +0x00,0x00,0x43,0x8C, +0xFF,0x03,0x05,0x3C, +0x0C,0x00,0x06,0x8E, +0x24,0x18,0x65,0x00, +0x02,0xB4,0x03,0x00, +0x18,0x00,0xD5,0x02, +0x25,0xB0,0x04,0x3C, +0x88,0x0C,0x84,0x34, +0xF0,0xFF,0x03,0x3C, +0x00,0x00,0x9E,0x8C, +0xFF,0x03,0x63,0x34, +0x24,0x30,0xC3,0x00, +0xC0,0xFF,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xFF,0xFF,0x84,0x34, +0xE0,0xED,0xA5,0x24, +0x24,0xF0,0xC4,0x03, +0x00,0x00,0xA4,0x8C, +0x44,0x00,0xBE,0xAF, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0xFF,0x03,0x42,0x30, +0x80,0x12,0x02,0x00, +0x25,0x30,0xC2,0x00, +0x82,0x2A,0x06,0x00, +0x3F,0x00,0xA5,0x30, +0x00,0x2C,0x05,0x00, +0x0C,0x00,0x06,0xAE, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xC5,0x03, +0x9C,0x0C,0xE4,0x36, +0x00,0x00,0x9E,0x8C, +0x82,0x29,0x16,0x00, +0x00,0x2F,0x05,0x00, +0x24,0x88,0xD1,0x03, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x25,0x02, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0xB0,0x02,0x3C, +0xC4,0x0E,0xE3,0x36, +0x1C,0x0C,0x42,0x34, +0x00,0x00,0x5E,0x8C, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x05,0x3C, +0x02,0x80,0x03,0x3C, +0xE4,0xED,0x63,0x24, +0x24,0x10,0x45,0x00, +0x00,0x00,0x64,0x8C, +0x02,0x14,0x02,0x00, +0x24,0x90,0xD2,0x03, +0x25,0xF0,0x42,0x02, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0xC0,0x03, +0xCC,0x0E,0xE2,0x36, +0x00,0x00,0x45,0x8C, +0x02,0x80,0x02,0x3C, +0xE4,0xED,0x42,0x24, +0x3F,0x00,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x24,0x28,0xA3,0x00, +0x24,0x98,0xD3,0x03, +0x82,0x29,0x05,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x65,0x02, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x5C,0x6D,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x42,0x00,0x03,0x24, +0x10,0x00,0xA3,0xA3, +0xF1,0x3A,0x40,0xA0, +0x4E,0x00,0x03,0x24, +0x43,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x9C,0xF3,0xE7,0x24, +0x11,0x00,0xA2,0xA3, +0x12,0x00,0xA3,0xA3, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0xDC,0xAC,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x48,0xFD,0xBD,0x27, +0xE8,0xED,0x46,0x24, +0x02,0x80,0x03,0x3C, +0xB0,0x02,0xB2,0xAF, +0xAC,0x02,0xB1,0xAF, +0xA8,0x02,0xB0,0xAF, +0x33,0x1F,0x60,0xA0, +0x21,0x38,0xA0,0x03, +0x90,0x00,0xC8,0x24, +0x00,0x00,0xC2,0x8C, +0x04,0x00,0xC3,0x8C, +0x08,0x00,0xC4,0x8C, +0x0C,0x00,0xC5,0x8C, +0x10,0x00,0xC6,0x24, +0x00,0x00,0xE2,0xAC, +0x04,0x00,0xE3,0xAC, +0x08,0x00,0xE4,0xAC, +0x0C,0x00,0xE5,0xAC, +0xF6,0xFF,0xC8,0x14, +0x10,0x00,0xE7,0x24, +0x00,0x00,0xC3,0x8C, +0x02,0x80,0x02,0x3C, +0x7C,0xEE,0x58,0x24, +0x00,0x00,0xE3,0xAC, +0x98,0x00,0xB9,0x27, +0x00,0x01,0x12,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x09,0x00,0x04,0x93, +0x0D,0x00,0x05,0x93, +0x00,0x00,0x11,0x93, +0x02,0x00,0x0D,0x93, +0x04,0x00,0x10,0x93, +0x06,0x00,0x0C,0x93, +0x08,0x00,0x0F,0x93, +0x0A,0x00,0x07,0x93, +0x0C,0x00,0x0E,0x93, +0x0E,0x00,0x06,0x93, +0x03,0x00,0x08,0x93, +0x07,0x00,0x09,0x93, +0x0B,0x00,0x0A,0x93, +0x0F,0x00,0x0B,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x25,0x10,0x51,0x00, +0x25,0x18,0x70,0x00, +0x25,0x20,0x8F,0x00, +0x25,0x28,0xAE,0x00, +0x00,0x6C,0x0D,0x00, +0x00,0x64,0x0C,0x00, +0x00,0x3C,0x07,0x00, +0x00,0x34,0x06,0x00, +0x25,0x68,0xA2,0x01, +0x25,0x60,0x83,0x01, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x00,0x46,0x08,0x00, +0x00,0x4E,0x09,0x00, +0x00,0x56,0x0A,0x00, +0x00,0x5E,0x0B,0x00, +0x25,0x40,0x0D,0x01, +0x25,0x48,0x2C,0x01, +0x25,0x50,0x47,0x01, +0x25,0x58,0x66,0x01, +0x10,0x00,0x18,0x27, +0x00,0x00,0x28,0xAF, +0x04,0x00,0x29,0xAF, +0x08,0x00,0x2A,0xAF, +0x0C,0x00,0x2B,0xAF, +0xD2,0xFF,0x12,0x17, +0x10,0x00,0x39,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x00,0x00,0x09,0x93, +0x02,0x00,0x04,0x93, +0x04,0x00,0x08,0x93, +0x06,0x00,0x05,0x93, +0x07,0x00,0x06,0x93, +0x03,0x00,0x07,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x10,0x49,0x00, +0x25,0x18,0x68,0x00, +0x00,0x24,0x04,0x00, +0x00,0x2C,0x05,0x00, +0x25,0x20,0x82,0x00, +0x25,0x28,0xA3,0x00, +0x00,0x3E,0x07,0x00, +0x00,0x36,0x06,0x00, +0x02,0x80,0x02,0x3C, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x84,0xEF,0x58,0x24, +0x04,0x00,0x26,0xAF, +0x00,0x00,0x27,0xAF, +0x00,0x01,0x12,0x27, +0xA0,0x01,0xB9,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x09,0x00,0x04,0x93, +0x0D,0x00,0x05,0x93, +0x00,0x00,0x11,0x93, +0x02,0x00,0x0D,0x93, +0x04,0x00,0x10,0x93, +0x06,0x00,0x0C,0x93, +0x08,0x00,0x0F,0x93, +0x0A,0x00,0x07,0x93, +0x0C,0x00,0x0E,0x93, +0x0E,0x00,0x06,0x93, +0x03,0x00,0x08,0x93, +0x07,0x00,0x09,0x93, +0x0B,0x00,0x0A,0x93, +0x0F,0x00,0x0B,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x25,0x10,0x51,0x00, +0x25,0x18,0x70,0x00, +0x25,0x20,0x8F,0x00, +0x25,0x28,0xAE,0x00, +0x00,0x6C,0x0D,0x00, +0x00,0x64,0x0C,0x00, +0x00,0x3C,0x07,0x00, +0x00,0x34,0x06,0x00, +0x25,0x68,0xA2,0x01, +0x25,0x60,0x83,0x01, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x00,0x46,0x08,0x00, +0x00,0x4E,0x09,0x00, +0x00,0x56,0x0A,0x00, +0x00,0x5E,0x0B,0x00, +0x25,0x40,0x0D,0x01, +0x25,0x48,0x2C,0x01, +0x25,0x50,0x47,0x01, +0x25,0x58,0x66,0x01, +0x10,0x00,0x18,0x27, +0x00,0x00,0x28,0xAF, +0x04,0x00,0x29,0xAF, +0x08,0x00,0x2A,0xAF, +0x0C,0x00,0x2B,0xAF, +0xD2,0xFF,0x12,0x17, +0x10,0x00,0x39,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x00,0x00,0x09,0x93, +0x02,0x00,0x04,0x93, +0x04,0x00,0x08,0x93, +0x06,0x00,0x05,0x93, +0x07,0x00,0x06,0x93, +0x03,0x00,0x07,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x10,0x49,0x00, +0x25,0x18,0x68,0x00, +0x00,0x24,0x04,0x00, +0x00,0x2C,0x05,0x00, +0x25,0x20,0x82,0x00, +0x25,0x28,0xA3,0x00, +0x00,0x3E,0x07,0x00, +0x00,0x36,0x06,0x00, +0x25,0x30,0xC5,0x00, +0x25,0x38,0xE4,0x00, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x26,0xAF, +0x00,0x00,0x27,0xAF, +0x30,0x1F,0x46,0x24, +0x21,0x50,0x00,0x00, +0x80,0x20,0x0A,0x00, +0x21,0x10,0x9D,0x00, +0x00,0x00,0x45,0x8C, +0x01,0x00,0x43,0x25, +0xFF,0x00,0x6A,0x30, +0x21,0x20,0x86,0x00, +0x25,0x00,0x42,0x2D, +0xF8,0xFF,0x40,0x14, +0x18,0x00,0x85,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4B,0x24, +0x21,0x50,0x00,0x00, +0xC0,0x10,0x0A,0x00, +0x21,0x48,0x5D,0x00, +0x21,0x38,0x00,0x00, +0x21,0x40,0x4B,0x00, +0x21,0x10,0x27,0x01, +0xA0,0x01,0x46,0x90, +0x98,0x00,0x45,0x90, +0x01,0x00,0xE4,0x24, +0x21,0x18,0x07,0x01, +0xFF,0x00,0x87,0x30, +0x08,0x00,0xE2,0x2C, +0xB4,0x01,0x66,0xA0, +0xF7,0xFF,0x40,0x14, +0xAC,0x00,0x65,0xA0, +0x01,0x00,0x42,0x25, +0xFF,0x00,0x4A,0x30, +0x21,0x00,0x43,0x2D, +0xEF,0xFF,0x60,0x14, +0xC0,0x10,0x0A,0x00, +0x08,0x00,0x64,0x8D, +0xFF,0x7F,0x07,0x3C, +0xFF,0xFF,0xE7,0x34, +0xC0,0xFF,0x02,0x24, +0x24,0x20,0x87,0x00, +0x24,0x20,0x82,0x00, +0x0C,0x00,0x84,0x34, +0xFF,0xC0,0x02,0x24, +0x24,0x20,0x82,0x00, +0xC0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x00,0x18,0x84,0x34, +0xBF,0xFF,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0x7F,0xFF,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x82,0x00, +0x0C,0x00,0x65,0x8D, +0x7F,0xFF,0x03,0x24, +0x40,0x40,0x84,0x34, +0xFF,0xFF,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xFF,0x7F,0x42,0x34, +0xFF,0xBF,0x03,0x3C, +0x10,0x00,0x66,0x8D, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0xFF,0x9F,0x02,0x3C, +0x24,0x28,0xA3,0x00, +0xFF,0xFF,0x42,0x34, +0xFF,0x3F,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0x12,0x00,0x02,0x24, +0xB0,0x02,0xB2,0x8F, +0xAC,0x02,0xB1,0x8F, +0xA8,0x02,0xB0,0x8F, +0x24,0x30,0xC3,0x00, +0xC7,0x02,0x62,0xA1, +0x1F,0x00,0x03,0x24, +0x01,0x00,0x02,0x24, +0x24,0x28,0xA7,0x00, +0xBE,0x02,0x63,0xA1, +0xC0,0x02,0x62,0xA1, +0xFF,0x00,0x03,0x24, +0xFF,0xFF,0x02,0x24, +0xB8,0x02,0xBD,0x27, +0x08,0x00,0x64,0xAD, +0x10,0x00,0x66,0xAD, +0x0C,0x00,0x65,0xAD, +0xC2,0x02,0x62,0xA1, +0xC4,0x02,0x63,0xA5, +0xBF,0x02,0x60,0xA1, +0x08,0x00,0xE0,0x03, +0xC6,0x02,0x60,0xA1, +0x02,0x80,0x0B,0x3C, +0x30,0x1F,0x67,0x25, +0xE0,0xFF,0xBD,0x27, +0xE6,0x02,0xE0,0xA0, +0x18,0x00,0xBF,0xAF, +0xE4,0x02,0xE8,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x30,0x1F,0x69,0x8D, +0x24,0x40,0x02,0x01, +0xFF,0xBF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xF0,0xFF,0x03,0x24, +0x24,0x40,0x02,0x01, +0xFF,0x7F,0x02,0x3C, +0x24,0x48,0x23,0x01, +0xFF,0xFF,0x42,0x34, +0xFF,0xF0,0x03,0x24, +0x24,0x48,0x23,0x01, +0x24,0x40,0x02,0x01, +0x20,0x00,0x03,0x24, +0x0A,0x00,0x02,0x24, +0x30,0x1F,0x69,0xAD, +0xD2,0x02,0xE2,0xA0, +0xD7,0x02,0xE3,0xA0, +0x20,0x00,0x02,0x24, +0x00,0x01,0x03,0x24, +0xC8,0x02,0xE2,0xA4, +0xCA,0x02,0xE3,0xA4, +0x00,0x02,0x02,0x24, +0x49,0x00,0x03,0x24, +0x02,0x80,0x0A,0x3C, +0xE4,0x02,0xE8,0xAC, +0x80,0xF3,0x4A,0x25, +0xFF,0xFF,0x0D,0x34, +0x3E,0x00,0x0E,0x24, +0x1C,0x00,0x0F,0x24, +0x01,0x00,0x0C,0x24, +0x11,0x00,0xA3,0xA3, +0xCC,0x02,0xE2,0xA4, +0xD0,0x07,0x03,0x24, +0x44,0x00,0x02,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA2,0xA3, +0x10,0x00,0xA5,0x27, +0x47,0x00,0x02,0x24, +0x21,0x20,0x40,0x01, +0x94,0xAD,0xC6,0x24, +0x04,0x00,0xED,0xAC, +0xD0,0x02,0xEE,0xA0, +0xD1,0x02,0xEF,0xA0, +0x02,0x00,0xEC,0xA0, +0x0C,0x00,0x43,0xAD, +0x14,0x00,0x4C,0xA1, +0x80,0x36,0xED,0xAC, +0xCE,0x02,0xEE,0xA0, +0xCF,0x02,0xEF,0xA0, +0xD6,0x02,0xE0,0xA0, +0xD4,0x02,0xE0,0xA0, +0x12,0x00,0xA2,0xA3, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x50,0x00,0x03,0x24, +0x10,0x00,0xA3,0xA3, +0x16,0x3D,0x40,0xA0, +0x41,0x00,0x03,0x24, +0x52,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x0C,0xF4,0xE7,0x24, +0x11,0x00,0xA2,0xA3, +0x12,0x00,0xA3,0xA3, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x02,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x2C,0x80,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x09,0x3C, +0x30,0x1F,0x23,0x8D, +0xFF,0xFF,0x02,0x24, +0xFF,0x00,0x4B,0x30, +0x0F,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0xFF,0xFF,0x02,0x3C, +0xFF,0x0F,0x42,0x34, +0x24,0x18,0x62,0x00, +0xD8,0xFF,0xBD,0x27, +0x30,0x1F,0x23,0xAD, +0x47,0x00,0x02,0x24, +0x3B,0x00,0x03,0x24, +0x02,0x80,0x08,0x3C, +0x28,0xF4,0x08,0x25, +0x18,0x00,0xB0,0xAF, +0x10,0x00,0xA2,0xA3, +0x30,0x1F,0x30,0x25, +0x11,0x00,0xA3,0xA3, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x01,0x00,0x07,0x3C, +0x01,0x80,0x06,0x3C, +0x04,0x03,0x0B,0xAE, +0x1C,0x00,0xB1,0xAF, +0x56,0x30,0xEA,0x34, +0x43,0x00,0x11,0x24, +0xF4,0x98,0xE7,0x34, +0x10,0x00,0xA5,0x27, +0x0C,0x00,0x02,0xAD, +0x14,0x00,0x03,0xA1, +0x21,0x20,0x00,0x01, +0x1C,0xB9,0xC6,0x24, +0x20,0x00,0xBF,0xAF, +0x12,0x00,0xB1,0xA3, +0x0C,0x03,0x07,0xAE, +0x10,0x03,0x0A,0xAE, +0x13,0x00,0xA0,0xA3, +0x08,0x03,0x00,0xAE, +0x14,0x03,0x00,0xAE, +0xA2,0x23,0x00,0x0C, +0x18,0x03,0x00,0xAE, +0x1E,0x00,0x02,0x24, +0x21,0x03,0x02,0xA2, +0x4A,0x00,0x03,0x24, +0x45,0x00,0x02,0x24, +0x1C,0x03,0x03,0xA2, +0x1D,0x03,0x02,0xA2, +0x23,0x00,0x03,0x24, +0x3E,0x00,0x02,0x24, +0x1E,0x03,0x11,0xA2, +0x1F,0x03,0x02,0xA2, +0x20,0x03,0x03,0xA2, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x3B,0x00,0x02,0x24, +0x43,0x00,0x03,0x24, +0x10,0x00,0xA2,0xA3, +0x11,0x00,0xA3,0xA3, +0x36,0x00,0x02,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x07,0x3C, +0x44,0xF4,0xE7,0x24, +0x12,0x00,0xA2,0xA3, +0x03,0x22,0x60,0xA0, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x50,0xBD,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x52,0x00,0x03,0x24, +0x10,0x00,0xA3,0xA3, +0xB8,0x55,0x40,0xA4, +0x54,0x00,0x03,0x24, +0x53,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x7C,0xF4,0xE7,0x24, +0x11,0x00,0xA2,0xA3, +0x12,0x00,0xA3,0xA3, +0xF4,0x01,0x02,0x24, +0x01,0x00,0x03,0x24, +0x02,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x70,0x81,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x58,0xE9,0x62,0x24, +0x58,0xE9,0x67,0x94, +0x02,0x00,0x48,0x90, +0x02,0x80,0x02,0x3C, +0xD8,0x5E,0x42,0x24, +0x02,0x00,0x11,0x24, +0x01,0x80,0x06,0x3C, +0x21,0x20,0x40,0x00, +0x14,0x00,0x51,0xA0, +0x10,0x00,0xA5,0x27, +0x6C,0xCE,0xC6,0x24, +0x02,0x80,0x10,0x3C, +0x10,0x00,0xA7,0xA7, +0x28,0x5F,0x10,0x26, +0x12,0x00,0xA8,0xA3, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x02,0x80,0x06,0x3C, +0x21,0x20,0x00,0x02, +0x10,0x00,0xA5,0x27, +0x14,0x00,0x11,0xA2, +0xA2,0x23,0x00,0x0C, +0x7C,0x82,0xC6,0x24, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x02,0x00,0x07,0x24, +0x0C,0x00,0x04,0x24, +0x02,0x00,0x42,0x30, +0x01,0x00,0x42,0x2C, +0x23,0x38,0xE2,0x00, +0xE8,0x03,0x02,0x24, +0x0C,0x00,0x02,0xAE, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x60,0xA0, +0xF5,0x5E,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x64,0xA0, +0x0D,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x13,0x5F,0x60,0xA0, +0x01,0x00,0x06,0x24, +0x14,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF8,0x5E,0x66,0xA0, +0x0F,0x00,0x04,0x24, +0x15,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF7,0x5E,0x66,0xA0, +0xF9,0x5E,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0x08,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0xFA,0x5E,0x60,0xA0, +0x64,0x00,0x05,0x24, +0x04,0x5F,0x44,0xA4, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x02,0x3C, +0xFC,0x5E,0x65,0xA4, +0x00,0x90,0x42,0x34, +0x02,0x80,0x03,0x3C, +0x00,0x5F,0x62,0xAC, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x02,0x3C, +0x08,0x5F,0x80,0xAC, +0x02,0x80,0x03,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x02,0x3C, +0x0E,0x5F,0x60,0xA0, +0x16,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x44,0x5F,0x67,0xA0, +0x20,0x00,0xBF,0x8F, +0x0F,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x10,0x5F,0x66,0xA0, +0x11,0x5F,0x46,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x12,0x5F,0x60,0xA0, +0x21,0x20,0x00,0x00, +0x18,0x5F,0x40,0xAC, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x00,0x00, +0x28,0x00,0xBD,0x27, +0x1C,0x5F,0x60,0xAC, +0x20,0x5F,0x44,0xAC, +0x24,0x5F,0x45,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x21,0x98,0xA0,0x00, +0x21,0x88,0xC0,0x00, +0x21,0x90,0x00,0x00, +0x00,0x00,0x04,0x82, +0x7C,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x10,0x26, +0xFF,0xFF,0x10,0x26, +0x00,0x00,0x04,0x92, +0x2B,0x00,0x02,0x24, +0x00,0x1E,0x04,0x00, +0x03,0x1E,0x03,0x00, +0x41,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0x02,0x24, +0x30,0x00,0x22,0x12, +0x00,0x1E,0x04,0x00, +0x07,0x00,0x20,0x16, +0x21,0x18,0x80,0x00, +0x00,0x1E,0x04,0x00, +0x03,0x1E,0x03,0x00, +0x30,0x00,0x02,0x24, +0x3B,0x00,0x62,0x10, +0x0A,0x00,0x11,0x24, +0x21,0x18,0x80,0x00, +0x00,0x16,0x03,0x00, +0x03,0x16,0x02,0x00, +0x1A,0x00,0x40,0x10, +0xFF,0x00,0x64,0x30, +0xA9,0xFF,0x82,0x24, +0x61,0x00,0x83,0x2C, +0xFF,0x00,0x45,0x30, +0x09,0x00,0x60,0x10, +0x41,0x00,0x86,0x2C, +0xC9,0xFF,0x82,0x24, +0xFF,0x00,0x45,0x30, +0x05,0x00,0xC0,0x10, +0x3A,0x00,0x87,0x2C, +0xD0,0xFF,0x82,0x24, +0x02,0x00,0xE0,0x10, +0xFF,0x00,0x05,0x24, +0xFF,0x00,0x45,0x30, +0x2A,0x10,0xB1,0x00, +0x0A,0x00,0x40,0x10, +0x18,0x00,0x51,0x02, +0x01,0x00,0x10,0x26, +0x12,0x10,0x00,0x00, +0x2B,0x18,0x52,0x00, +0x23,0x00,0x60,0x14, +0x21,0x90,0xA2,0x00, +0x00,0x00,0x03,0x92, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0x60,0x14, +0xFF,0x00,0x64,0x30, +0x02,0x00,0x60,0x12, +0x21,0x10,0x40,0x02, +0x00,0x00,0x70,0xAE, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x03,0x1E,0x03,0x00, +0x30,0x00,0x02,0x24, +0xCE,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x82, +0x78,0x00,0x02,0x24, +0x03,0x00,0x62,0x10, +0x58,0x00,0x02,0x24, +0xD0,0xFF,0x62,0x14, +0x21,0x18,0x80,0x00, +0x02,0x00,0x10,0x26, +0x00,0x00,0x04,0x92, +0xC0,0x70,0x00,0x08, +0x10,0x00,0x11,0x24, +0x01,0x00,0x10,0x26, +0x00,0x00,0x04,0x92, +0xB7,0x70,0x00,0x08, +0x10,0x00,0x02,0x24, +0xEC,0x70,0x00,0x08, +0x08,0x00,0x11,0x24, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0xFF,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x21,0x48,0x80,0x00, +0x31,0x00,0xC0,0x14, +0x21,0x50,0x00,0x00, +0x00,0x00,0x87,0x90, +0x30,0x00,0x02,0x24, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0x2E,0x00,0x62,0x10, +0x0A,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0x40,0xF2,0x4B,0x24, +0xFF,0x00,0xE8,0x30, +0x21,0x10,0x0B,0x01, +0x00,0x00,0x44,0x90, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0x44,0x00,0x82,0x30, +0x02,0x00,0x87,0x30, +0xD0,0xFF,0x63,0x24, +0x1A,0x00,0x40,0x10, +0x04,0x00,0x84,0x30, +0x07,0x00,0x80,0x14, +0x2B,0x10,0x66,0x00, +0x21,0x10,0x00,0x01, +0x02,0x00,0xE0,0x10, +0xE0,0xFF,0x03,0x25, +0xFF,0x00,0x62,0x30, +0xC9,0xFF,0x43,0x24, +0x2B,0x10,0x66,0x00, +0x10,0x00,0x40,0x10, +0x18,0x00,0x46,0x01, +0x01,0x00,0x29,0x25, +0x00,0x00,0x27,0x91, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xE8,0x30, +0x12,0x10,0x00,0x00, +0x21,0x50,0x43,0x00, +0x21,0x10,0x0B,0x01, +0x00,0x00,0x44,0x90, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0x44,0x00,0x82,0x30, +0x02,0x00,0x87,0x30, +0xD0,0xFF,0x63,0x24, +0xE8,0xFF,0x40,0x14, +0x04,0x00,0x84,0x30, +0x02,0x00,0xA0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA9,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x40,0x01, +0x00,0x00,0x87,0x90, +0x0E,0x71,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x89,0x24, +0x00,0x00,0x27,0x91, +0x78,0x00,0x02,0x24, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0xCD,0xFF,0x62,0x14, +0x08,0x00,0x06,0x24, +0x01,0x00,0x22,0x91, +0x02,0x80,0x03,0x3C, +0x40,0xF2,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x00,0x00,0x00,0x00, +0x44,0x00,0x84,0x30, +0xC5,0xFF,0x80,0x10, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x29,0x25, +0x00,0x00,0x27,0x91, +0x0E,0x71,0x00,0x08, +0x10,0x00,0x06,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x00,0x00,0x83,0x80, +0x2D,0x00,0x02,0x24, +0x04,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x04,0x71,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x04,0x71,0x00,0x0C, +0x01,0x00,0x84,0x24, +0x10,0x00,0xBF,0x8F, +0x23,0x10,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x21,0x90,0xA0,0x00, +0x21,0x98,0xC0,0x00, +0x21,0x88,0x00,0x00, +0x00,0x00,0x04,0x82, +0x7C,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x10,0x26, +0xFF,0xFF,0x10,0x26, +0x00,0x00,0x03,0x82, +0x2D,0x00,0x02,0x24, +0x0F,0x00,0x62,0x10, +0x21,0x20,0x00,0x02, +0x21,0x28,0x40,0x02, +0xA0,0x70,0x00,0x0C, +0x21,0x30,0x60,0x02, +0x12,0x00,0x40,0x04, +0x21,0x18,0x40,0x00, +0x23,0x10,0x02,0x00, +0x0A,0x10,0x71,0x00, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x01,0x00,0x10,0x26, +0x21,0x20,0x00,0x02, +0x21,0x28,0x40,0x02, +0xA0,0x70,0x00,0x0C, +0x21,0x30,0x60,0x02, +0xFF,0xFF,0x11,0x24, +0xF0,0xFF,0x41,0x04, +0x21,0x18,0x40,0x00, +0xF0,0xFF,0x20,0x16, +0x00,0x80,0x02,0x3C, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0x7F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x52,0x54,0x4C,0x38, +0x37,0x31,0x32,0x20, +0x46,0x57,0x20,0x76, +0x65,0x72,0x73,0x69, +0x6F,0x6E,0x20,0x30, +0x2E,0x30,0x2E,0x31, +0x23,0x20,0xE4,0xB8, +0x89,0x20,0x31,0x30, +0xE6,0x9C,0x88,0x20, +0x32,0x38,0x20,0x31, +0x37,0x3A,0x34,0x31, +0x3A,0x34,0x37,0x20, +0x43,0x53,0x54,0x20, +0x32,0x30,0x30,0x39, +0x0A,0x00,0x00,0x00, +0x50,0xC6,0x01,0x80, +0x48,0x43,0x49,0x20, +0x74,0x79,0x70,0x65, +0x3A,0x20,0x25,0x78, +0x28,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x72,0x66,0x5F,0x63, +0x6F,0x66,0x69,0x67, +0x3A,0x20,0x25,0x78, +0x28,0x25,0x78,0x2C, +0x20,0x25,0x78,0x2C, +0x20,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x6D,0x70,0x5F,0x6D, +0x6F,0x64,0x65,0x3A, +0x20,0x25,0x78,0x28, +0x25,0x78,0x29,0x2C, +0x20,0x49,0x51,0x4B, +0x3A,0x20,0x25,0x78, +0x0A,0x00,0x00,0x00, +0x76,0x63,0x73,0x20, +0x74,0x79,0x70,0x65, +0x3A,0x20,0x25,0x78, +0x28,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x33,0x32,0x6B,0x20, +0x63,0x61,0x6C,0x69, +0x62,0x72,0x61,0x3A, +0x20,0x25,0x64,0x2C, +0x20,0x33,0x32,0x4B, +0x20,0x54,0x53,0x46, +0x3A,0x20,0x25,0x78, +0x00,0x00,0x00,0x00, +0x74,0x61,0x72,0x67, +0x65,0x74,0x20,0x74, +0x68,0x65,0x72,0x6D, +0x61,0x6C,0x3A,0x20, +0x25,0x78,0x0A,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x00,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x01,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x02,0x7E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x03,0x7D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x04,0x7C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x05,0x7B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x06,0x7A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x07,0x79, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x08,0x78, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x09,0x77, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0A,0x76, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0B,0x75, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0C,0x74, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0D,0x73, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0E,0x72, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0F,0x71, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x10,0x70, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x11,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x12,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x13,0x6E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x14,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x15,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x16,0x6C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x17,0x6B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x18,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x19,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1A,0x69, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1B,0x68, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1C,0x67, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1D,0x66, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1E,0x65, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1F,0x64, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x20,0x63, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x21,0x4C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x22,0x4B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x23,0x4A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x24,0x49, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x25,0x48, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x26,0x47, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x27,0x46, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x28,0x45, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x29,0x44, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2A,0x2C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2B,0x2B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2C,0x2A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2D,0x29, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2E,0x28, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2F,0x27, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x30,0x26, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x31,0x25, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x32,0x24, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x33,0x23, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x34,0x22, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x35,0x09, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x36,0x08, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x37,0x07, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x38,0x06, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x39,0x05, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3A,0x04, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3B,0x03, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3C,0x02, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3D,0x01, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3E,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3F,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x40,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x41,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x42,0x7E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x43,0x7D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x44,0x7C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x45,0x7B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x46,0x7A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x47,0x79, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x48,0x78, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x49,0x77, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4A,0x76, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4B,0x75, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4C,0x74, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4D,0x73, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4E,0x72, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4F,0x71, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x50,0x70, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x51,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x52,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x53,0x6E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x54,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x55,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x56,0x6C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x57,0x6B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x58,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x59,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5A,0x69, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5B,0x68, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5C,0x67, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5D,0x66, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5E,0x65, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5F,0x64, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x60,0x63, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x61,0x4C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x62,0x4B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x63,0x4A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x64,0x49, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x65,0x48, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x66,0x47, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x67,0x46, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x68,0x45, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x69,0x44, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6A,0x2C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6B,0x2B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6C,0x2A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6D,0x29, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6E,0x28, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6F,0x27, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x70,0x26, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x71,0x25, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x72,0x24, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x73,0x23, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x74,0x22, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x75,0x09, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x76,0x08, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x77,0x07, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x78,0x06, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x79,0x05, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7A,0x04, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7B,0x03, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7C,0x02, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7D,0x01, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7E,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7F,0x00, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x00,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x01,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x02,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x03,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x04,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x05,0x34, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x06,0x38, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x07,0x3E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x08,0x3E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x09,0x44, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0A,0x46, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0B,0x48, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0C,0x48, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0D,0x4E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0E,0x56, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0F,0x5A, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x10,0x5E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x11,0x62, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x12,0x6C, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x13,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x14,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x15,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x16,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x17,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x18,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x19,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1A,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1B,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1C,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1D,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1E,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1F,0x72, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x06,0x06,0x06,0x04, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x04,0x02,0x02,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x0A,0x08,0x08,0x04, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x04,0x02,0x02,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x0A,0x08,0x08,0x04, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x04,0x02,0x02,0x00, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x08,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0x24,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x2C,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x70,0x08,0x00,0x00, +0x00,0x00,0x00,0x04, +0x01,0x00,0x00,0x00, +0x64,0x08,0x00,0x00, +0x00,0x04,0x00,0x00, +0x01,0x00,0x00,0x00, +0x78,0x08,0x00,0x00, +0x0F,0x00,0x0F,0x00, +0x02,0x00,0x02,0x00, +0x74,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x78,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x7C,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x80,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x33,0x00,0x00,0x00, +0x04,0x0C,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x33,0x00,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0xF4,0x01,0x00,0x00, +0x00,0x00,0xFF,0xFF, +0xFF,0xFF,0x00,0x00, +0x34,0x02,0x00,0x00, +0x00,0x00,0x00,0xF8, +0x13,0x00,0x00,0x00, +0x04,0x08,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0x24,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x2C,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x02,0x00,0x30,0x00, +0x70,0x08,0x00,0x00, +0x00,0x00,0x00,0x04, +0x01,0x00,0x00,0x00, +0x64,0x08,0x00,0x00, +0x00,0x04,0x00,0x00, +0x00,0x00,0x00,0x00, +0x78,0x08,0x00,0x00, +0x0F,0x00,0x0F,0x00, +0x02,0x00,0x00,0x00, +0x74,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x78,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x7C,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x80,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x11,0x00,0x00,0x00, +0x04,0x0C,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x33,0x00,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0xF4,0x01,0x00,0x00, +0x00,0x00,0xFF,0xFF, +0x77,0x77,0x00,0x00, +0x34,0x02,0x00,0x00, +0x00,0x00,0x00,0xF8, +0x0A,0x00,0x00,0x00, +0x44,0x08,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x01,0x00, +0x04,0x08,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x24,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x2C,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x02,0x00,0x10,0x00, +0x70,0x08,0x00,0x00, +0x00,0x00,0x00,0x04, +0x01,0x00,0x00,0x00, +0x64,0x08,0x00,0x00, +0x00,0x04,0x00,0x00, +0x00,0x00,0x00,0x00, +0x78,0x08,0x00,0x00, +0x0F,0x00,0x0F,0x00, +0x02,0x00,0x00,0x00, +0x74,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x78,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x7C,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x80,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x11,0x00,0x00,0x00, +0x04,0x0C,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x11,0x00,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0xF4,0x01,0x00,0x00, +0x00,0x00,0xFF,0xFF, +0x77,0x77,0x00,0x00, +0x34,0x02,0x00,0x00, +0x00,0x00,0x00,0xF8, +0x0A,0x00,0x00,0x00, +0x1C,0x00,0x00,0x00, +0x00,0x00,0x00,0x07, +0x00,0x08,0x00,0x00, +0x00,0x00,0x04,0x00, +0x04,0x08,0x00,0x00, +0x03,0x80,0x00,0x00, +0x08,0x08,0x00,0x00, +0x00,0xFC,0x00,0x00, +0x0C,0x08,0x00,0x00, +0x0A,0x00,0x00,0x00, +0x10,0x08,0x00,0x00, +0x88,0x50,0x00,0x10, +0x14,0x08,0x00,0x00, +0x10,0x3D,0x0C,0x02, +0x18,0x08,0x00,0x00, +0x85,0x01,0x20,0x00, +0x1C,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x20,0x08,0x00,0x00, +0x00,0x00,0x00,0x01, +0x24,0x08,0x00,0x00, +0x04,0x00,0x39,0x00, +0x28,0x08,0x00,0x00, +0x00,0x00,0x00,0x01, +0x2C,0x08,0x00,0x00, +0x04,0x00,0x39,0x00, +0x30,0x08,0x00,0x00, +0x04,0x00,0x00,0x00, +0x34,0x08,0x00,0x00, +0x00,0x02,0x69,0x00, +0x38,0x08,0x00,0x00, +0x04,0x00,0x00,0x00, +0x3C,0x08,0x00,0x00, +0x00,0x02,0x69,0x00, +0x40,0x08,0x00,0x00, +0x00,0x00,0x01,0x00, +0x44,0x08,0x00,0x00, +0x00,0x00,0x01,0x00, +0x48,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x4C,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x50,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x54,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x58,0x08,0x00,0x00, +0x48,0x48,0x48,0x48, +0x5C,0x08,0x00,0x00, +0xA9,0x65,0xA9,0x65, +0x60,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x64,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x68,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x6C,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x70,0x08,0x00,0x00, +0x00,0x07,0x00,0x03, +0x74,0x08,0x00,0x00, +0x00,0x03,0x00,0x03, +0x78,0x08,0x00,0x00, +0x02,0x00,0x02,0x00, +0x7C,0x08,0x00,0x00, +0x01,0x02,0x4F,0x00, +0x80,0x08,0x00,0x00, +0xC1,0x0A,0x30,0xA8, +0x84,0x08,0x00,0x00, +0x58,0x00,0x00,0x00, +0x88,0x08,0x00,0x00, +0x08,0x00,0x00,0x00, +0x8C,0x08,0x00,0x00, +0x04,0x00,0x00,0x00, +0x90,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x94,0x08,0x00,0x00, +0xFE,0xFF,0xFF,0xFF, +0x98,0x08,0x00,0x00, +0x10,0x20,0x30,0x40, +0x9C,0x08,0x00,0x00, +0x50,0x60,0x70,0x00, +0xB0,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0xE0,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0xE4,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x0E,0x00,0x00, +0x33,0x33,0x33,0x30, +0x04,0x0E,0x00,0x00, +0x2F,0x2E,0x2D,0x2A, +0x08,0x0E,0x00,0x00, +0x32,0x32,0x00,0x00, +0x10,0x0E,0x00,0x00, +0x33,0x33,0x33,0x30, +0x14,0x0E,0x00,0x00, +0x2F,0x2E,0x2D,0x2A, +0x18,0x0E,0x00,0x00, +0x33,0x33,0x33,0x30, +0x1C,0x0E,0x00,0x00, +0x2F,0x2E,0x2D,0x2A, +0x30,0x0E,0x00,0x00, +0x00,0x7C,0x00,0x01, +0x34,0x0E,0x00,0x00, +0x00,0x48,0x00,0x01, +0x38,0x0E,0x00,0x00, +0x1F,0xDC,0x00,0x10, +0x3C,0x0E,0x00,0x00, +0x1F,0x8C,0x00,0x10, +0x40,0x0E,0x00,0x00, +0xA0,0x00,0x14,0x02, +0x44,0x0E,0x00,0x00, +0xA0,0x00,0x16,0x28, +0x48,0x0E,0x00,0x00, +0x01,0x00,0x00,0xF8, +0x4C,0x0E,0x00,0x00, +0x10,0x29,0x00,0x00, +0x50,0x0E,0x00,0x00, +0x00,0x7C,0x00,0x01, +0x54,0x0E,0x00,0x00, +0x00,0x48,0x00,0x01, +0x58,0x0E,0x00,0x00, +0x1F,0xDC,0x00,0x10, +0x5C,0x0E,0x00,0x00, +0x1F,0x8C,0x00,0x10, +0x60,0x0E,0x00,0x00, +0xA0,0x00,0x14,0x02, +0x64,0x0E,0x00,0x00, +0xA0,0x00,0x16,0x28, +0x6C,0x0E,0x00,0x00, +0x10,0x29,0x00,0x00, +0x70,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0x74,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x78,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x7C,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x80,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x84,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0x88,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0x8C,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0xD0,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0xD4,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0xD8,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0xDC,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0xE0,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0xE4,0x0E,0x00,0x00, +0x48,0x54,0x5E,0x01, +0xE8,0x0E,0x00,0x00, +0x48,0x54,0x55,0x21, +0x00,0x09,0x00,0x00, +0x00,0x00,0x00,0x00, +0x04,0x09,0x00,0x00, +0x23,0x00,0x00,0x00, +0x08,0x09,0x00,0x00, +0x00,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0x13,0x13,0x12,0x01, +0x00,0x0A,0x00,0x00, +0xC8,0x47,0xD0,0x00, +0x04,0x0A,0x00,0x00, +0x08,0x00,0xFF,0x80, +0x08,0x0A,0x00,0x00, +0x00,0x83,0xCD,0x88, +0x0C,0x0A,0x00,0x00, +0x0F,0x12,0x62,0x2E, +0x10,0x0A,0x00,0x00, +0x78,0xBB,0x00,0x95, +0x14,0x0A,0x00,0x00, +0x28,0x40,0x14,0x11, +0x18,0x0A,0x00,0x00, +0x17,0x11,0x88,0x00, +0x1C,0x0A,0x00,0x00, +0x00,0x0F,0x14,0x89, +0x20,0x0A,0x00,0x00, +0x00,0x00,0x1B,0x1A, +0x24,0x0A,0x00,0x00, +0x17,0x13,0x0E,0x09, +0x28,0x0A,0x00,0x00, +0x04,0x02,0x00,0x00, +0x2C,0x0A,0x00,0x00, +0x00,0x00,0xD3,0x10, +0x00,0x0C,0x00,0x00, +0x40,0x1D,0x07,0x40, +0x04,0x0C,0x00,0x00, +0x33,0x56,0xA0,0x00, +0x08,0x0C,0x00,0x00, +0xE4,0x00,0x00,0x00, +0x0C,0x0C,0x00,0x00, +0x6C,0x6C,0x6C,0x6C, +0x10,0x0C,0x00,0x00, +0x00,0x00,0x80,0x08, +0x14,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x18,0x0C,0x00,0x00, +0x00,0x00,0x00,0x08, +0x1C,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x20,0x0C,0x00,0x00, +0x00,0x00,0x00,0x08, +0x24,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x28,0x0C,0x00,0x00, +0x00,0x00,0x00,0x08, +0x2C,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x30,0x0C,0x00,0x00, +0x44,0xAC,0xE9,0x6D, +0x34,0x0C,0x00,0x00, +0xCF,0x52,0x96,0x46, +0x38,0x0C,0x00,0x00, +0x94,0x59,0x79,0x49, +0x3C,0x0C,0x00,0x00, +0x64,0x97,0x97,0x0A, +0x40,0x0C,0x00,0x00, +0x3F,0x40,0x7C,0x1F, +0x44,0x0C,0x00,0x00, +0xB7,0x00,0x01,0x00, +0x48,0x0C,0x00,0x00, +0x00,0x00,0x02,0xEC, +0x4C,0x0C,0x00,0x00, +0x7F,0x03,0x7F,0x00, +0x50,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x54,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x58,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x5C,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x60,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x64,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x68,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x6C,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x70,0x0C,0x00,0x00, +0x0D,0x00,0x7F,0x2C, +0x74,0x0C,0x00,0x00, +0x5B,0x17,0x86,0x01, +0x78,0x0C,0x00,0x00, +0x1F,0x00,0x00,0x00, +0x7C,0x0C,0x00,0x00, +0x12,0x16,0xB9,0x00, +0x80,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x84,0x0C,0x00,0x00, +0x00,0x00,0xF6,0x20, +0x88,0x0C,0x00,0x00, +0x80,0x00,0x00,0x20, +0x8C,0x0C,0x00,0x00, +0x00,0x00,0x20,0x20, +0x90,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x94,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0x98,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x9C,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA0,0x0C,0x00,0x00, +0x92,0x24,0x49,0x00, +0xA4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA8,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xAC,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xB0,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xB4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xB8,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xBC,0x0C,0x00,0x00, +0x00,0x00,0x00,0x28, +0xC0,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xC4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xC8,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xCC,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xD0,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xD4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xD8,0x0C,0x00,0x00, +0x27,0x24,0xB2,0x64, +0xDC,0x0C,0x00,0x00, +0x32,0x69,0x76,0x00, +0xE0,0x0C,0x00,0x00, +0x22,0x22,0x22,0x00, +0xE4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xE8,0x0C,0x00,0x00, +0x02,0x43,0x64,0x37, +0xEC,0x0C,0x00,0x00, +0x0C,0xD4,0x97,0x2F, +0x00,0x0D,0x00,0x00, +0x50,0x07,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x03,0x04,0x00,0x00, +0x08,0x0D,0x00,0x00, +0x7F,0x90,0x00,0x00, +0x0C,0x0D,0x00,0x00, +0x01,0x00,0x00,0x00, +0x10,0x0D,0x00,0x00, +0x33,0x33,0x63,0xA0, +0x14,0x0D,0x00,0x00, +0x63,0x3C,0x33,0x33, +0x18,0x0D,0x00,0x00, +0x6B,0x5B,0x8F,0x6A, +0x1C,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x20,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x24,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x28,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x2C,0x0D,0x00,0x00, +0x75,0x99,0x97,0xCC, +0x30,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x34,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x38,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x3C,0x0D,0x00,0x00, +0x93,0x72,0x02,0x00, +0x40,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x44,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x48,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x50,0x0D,0x00,0x00, +0x0A,0x14,0x37,0x64, +0x54,0x0D,0x00,0x00, +0x02,0xBD,0x4D,0x02, +0x58,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x5C,0x0D,0x00,0x00, +0x64,0x20,0x03,0x30, +0x60,0x0D,0x00,0x00, +0x68,0xDE,0x53,0x46, +0x64,0x0D,0x00,0x00, +0x3C,0x8A,0x51,0x00, +0x68,0x0D,0x00,0x00, +0x01,0x21,0x00,0x00, +0x14,0x0F,0x00,0x00, +0x03,0x00,0x00,0x00, +0x4C,0x0F,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x0F,0x00,0x00, +0x00,0x03,0x00,0x00, +0x40,0x01,0x00,0x00, +0x04,0x00,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x10,0x00,0x00,0x00, +0x0C,0x02,0x01,0x80, +0x10,0x00,0x00,0x00, +0x3C,0x02,0x01,0x80, +0x10,0x00,0x00,0x00, +0x2C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x34,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x3C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x44,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x1C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x24,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x7C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x84,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0xE0,0x03,0x01,0x80, +0x10,0x00,0x00,0x00, +0xD8,0x03,0x01,0x80, +0x10,0x00,0x00,0x00, +0x8C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x94,0x08,0x01,0x80, +0xDC,0x01,0x00,0x00, +0x54,0x25,0x00,0x80, +0x04,0x00,0x00,0x00, +0x10,0x06,0x01,0x80, +0xDC,0x01,0x00,0x00, +0x54,0x25,0x00,0x80, +0x04,0x00,0x00,0x00, +0xD0,0x27,0x00,0x80, +0x30,0x00,0x00,0x00, +0xD8,0x27,0x00,0x80, +0x04,0x00,0x00,0x00, +0x64,0x2A,0x00,0x80, +0x13,0x00,0x00,0x00, +0xE8,0x06,0x01,0x80, +0x17,0x00,0x00,0x00, +0x3C,0x07,0x01,0x80, +0x06,0x00,0x00,0x00, +0xC4,0x07,0x01,0x80, +0x06,0x00,0x00,0x00, +0xCC,0x07,0x01,0x80, +0x08,0x00,0x00,0x00, +0xD4,0x07,0x01,0x80, +0x0C,0x00,0x00,0x00, +0xDC,0x07,0x01,0x80, +0x04,0x00,0x00,0x00, +0xE4,0x07,0x01,0x80, +0x0E,0x00,0x00,0x00, +0xEC,0x07,0x01,0x80, +0x01,0x00,0x00,0x00, +0xF4,0x07,0x01,0x80, +0x38,0x00,0x00,0x00, +0xFC,0x07,0x01,0x80, +0x04,0x00,0x00,0x00, +0x04,0x08,0x01,0x80, +0x02,0x00,0x00,0x00, +0x0C,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x14,0x08,0x01,0x80, +0x01,0x00,0x00,0x00, +0x54,0x08,0x01,0x80, +0x01,0x00,0x00,0x00, +0x5C,0x08,0x01,0x80, +0x0C,0x00,0x00,0x00, +0xE8,0x03,0x01,0x80, +0x0E,0x00,0x00,0x00, +0xF0,0x03,0x01,0x80, +0x0C,0x00,0x00,0x00, +0x08,0x06,0x01,0x80, +0x34,0x00,0x00,0x00, +0x64,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x6C,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x9C,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0xA4,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0xAC,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x74,0x08,0x01,0x80, +0x08,0x00,0x00,0x00, +0x40,0x03,0x01,0x80, +0x04,0x00,0x00,0x00, +0xB4,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x2C,0x09,0x01,0x80, +0x04,0x00,0x00,0x00, +0x38,0x09,0x01,0x80, +0x04,0x00,0x00,0x00, +0xEC,0x09,0x01,0x80, +0x04,0x00,0x00,0x00, +0x50,0x0C,0x01,0x80, +0x04,0x00,0x00,0x00, +0x60,0x0C,0x01,0x80, +0x04,0x00,0x00,0x00, +0xC8,0x0D,0x01,0x80, +0x04,0x00,0x00,0x00, +0xF4,0x0E,0x01,0x80, +0x04,0x00,0x00,0x00, +0x30,0x10,0x01,0x80, +0x04,0x00,0x00,0x00, +0x48,0x12,0x01,0x80, +0x51,0x73,0x65,0x6C, +0x20,0x45,0x72,0x72, +0x6F,0x72,0x2C,0x20, +0x25,0x78,0x00,0x00, +0x72,0x65,0x70,0x65, +0x61,0x74,0x65,0x64, +0x20,0x65,0x6C,0x65, +0x6D,0x65,0x6E,0x74, +0x20,0x49,0x44,0x3A, +0x20,0x25,0x78,0x2C, +0x20,0x63,0x6D,0x64, +0x20,0x73,0x65,0x71, +0x3D,0x25,0x78,0x2C, +0x20,0x68,0x32,0x64, +0x73,0x65,0x71,0x3D, +0x25,0x78,0x0A,0x00, +0x69,0x6E,0x76,0x61, +0x6C,0x69,0x64,0x20, +0x63,0x6D,0x64,0x20, +0x69,0x64,0x3A,0x20, +0x25,0x78,0x0A,0x00, +0x48,0x32,0x43,0x3A, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x67,0x65,0x74,0x20, +0x6A,0x6F,0x69,0x6E, +0x20,0x63,0x6D,0x64, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x67,0x65,0x74,0x20, +0x73,0x75,0x72,0x76, +0x65,0x79,0x20,0x63, +0x6D,0x64,0x0A,0x00, +0x53,0x53,0x49,0x44, +0x3A,0x20,0x25,0x73, +0x0A,0x00,0x00,0x00, +0x73,0x65,0x74,0x41, +0x75,0x74,0x68,0x3A, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x72,0x63,0x76,0x20, +0x73,0x65,0x74,0x5F, +0x73,0x74,0x61,0x6B, +0x65,0x79,0x0A,0x00, +0x53,0x65,0x74,0x53, +0x69,0x6E,0x67,0x6C, +0x65,0x43,0x61,0x72, +0x72,0x69,0x65,0x72, +0x54,0x78,0x5F,0x68, +0x64,0x6C,0x0A,0x00, +0x53,0x65,0x74,0x53, +0x69,0x6E,0x67,0x6C, +0x65,0x54,0x6F,0x6E, +0x65,0x54,0x78,0x5F, +0x68,0x64,0x6C,0x0A, +0x00,0x00,0x00,0x00, +0x53,0x65,0x74,0x43, +0x61,0x72,0x72,0x69, +0x65,0x72,0x53,0x75, +0x70,0x70,0x72,0x65, +0x73,0x73,0x69,0x6F, +0x6E,0x54,0x78,0x5F, +0x68,0x64,0x6C,0x0A, +0x00,0x00,0x00,0x00, +0x53,0x65,0x74,0x43, +0x6F,0x6E,0x74,0x69, +0x6E,0x75,0x6F,0x75, +0x73,0x54,0x78,0x5F, +0x68,0x64,0x6C,0x0A, +0x00,0x00,0x00,0x00, +0x53,0x65,0x74,0x43, +0x43,0x4B,0x43,0x6F, +0x6E,0x74,0x69,0x6E, +0x75,0x6F,0x75,0x73, +0x54,0x78,0x0A,0x00, +0x53,0x65,0x74,0x4F, +0x46,0x44,0x4D,0x43, +0x6F,0x6E,0x74,0x69, +0x6E,0x75,0x6F,0x75, +0x73,0x54,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x13,0x00,0x00,0x00, +0xF8,0x9E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xC8,0x5E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xF8,0x0E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xC8,0xCE,0x01,0x00, +0x13,0x00,0x00,0x00, +0xD4,0x8E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xA4,0x4E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xD0,0x0E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xA0,0xCE,0x00,0x00, +0x13,0x00,0x00,0x00, +0xD0,0x86,0x00,0x00, +0x13,0x00,0x00,0x00, +0xA0,0x46,0x00,0x00, +0x13,0x00,0x00,0x00, +0x70,0x06,0x00,0x00, +0x13,0x00,0x00,0x00, +0xA4,0x9E,0x02,0x00, +0x13,0x00,0x00,0x00, +0x74,0x5E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xA4,0x0E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xD0,0xCE,0x01,0x00, +0x13,0x00,0x00,0x00, +0x40,0x9F,0x01,0x00, +0x13,0x00,0x00,0x00, +0x70,0x4E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xA0,0x06,0x01,0x00, +0x13,0x00,0x00,0x00, +0x70,0xC6,0x00,0x00, +0x13,0x00,0x00,0x00, +0xA0,0x82,0x00,0x00, +0x13,0x00,0x00,0x00, +0x70,0x42,0x00,0x00, +0x13,0x00,0x00,0x00, +0x40,0x02,0x00,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x03,0x00, +0x01,0x00,0x00,0x00, +0x41,0x10,0x00,0x00, +0x02,0x00,0x00,0x00, +0x00,0x10,0x01,0x00, +0x05,0x00,0x00,0x00, +0xC0,0x0F,0x08,0x00, +0x07,0x00,0x00,0x00, +0x03,0xC8,0x0F,0x00, +0x13,0x00,0x00,0x00, +0xB0,0x7C,0x01,0x00, +0x13,0x00,0x00,0x00, +0xC0,0x1C,0x01,0x00, +0x13,0x00,0x00,0x00, +0x60,0xDC,0x00,0x00, +0x13,0x00,0x00,0x00, +0x60,0x8C,0x00,0x00, +0x13,0x00,0x00,0x00, +0x50,0x44,0x00,0x00, +0x13,0x00,0x00,0x00, +0x20,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x03,0x00, +0x01,0x00,0x00,0x00, +0x50,0x02,0x03,0x00, +0x02,0x00,0x00,0x00, +0x00,0x00,0x01,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x08,0x00, +0x11,0x00,0x00,0x00, +0xFC,0x31,0x02,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x0C,0x00, +0x11,0x00,0x00,0x00, +0xF8,0xF9,0x03,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x02,0x00, +0x11,0x00,0x00,0x00, +0x01,0x01,0x02,0x00, +0x14,0x00,0x00,0x00, +0x3E,0x09,0x01,0x00, +0x14,0x00,0x00,0x00, +0x3E,0x09,0x09,0x00, +0x15,0x00,0x00,0x00, +0xF4,0x98,0x01,0x00, +0x17,0x00,0x00,0x00, +0x00,0x65,0x0F,0x00, +0x1A,0x00,0x00,0x00, +0x56,0x30,0x01,0x00, +0x1B,0x00,0x00,0x00, +0x00,0x00,0x06,0x00, +0x1C,0x00,0x00,0x00, +0x00,0x03,0x00,0x00, +0x1E,0x00,0x00,0x00, +0x59,0x10,0x03,0x00, +0x21,0x00,0x00,0x00, +0x00,0x40,0x05,0x00, +0x22,0x00,0x00,0x00, +0x3C,0x08,0x00,0x00, +0x23,0x00,0x00,0x00, +0x58,0x15,0x00,0x00, +0x24,0x00,0x00,0x00, +0x60,0x00,0x00,0x00, +0x25,0x00,0x00,0x00, +0x83,0x25,0x02,0x00, +0x26,0x00,0x00,0x00, +0x00,0xF2,0x00,0x00, +0x27,0x00,0x00,0x00, +0xF1,0xAC,0x0E,0x00, +0x28,0x00,0x00,0x00, +0x54,0xBD,0x09,0x00, +0x29,0x00,0x00,0x00, +0x82,0x45,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x34,0x13,0x02,0x00, +0x2A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0C,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x02,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x05,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x06,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x07,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x08,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x09,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0A,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0B,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0C,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0B,0x05,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0E,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0B,0x05,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x23,0x66,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x1A,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x00,0x40,0x0E,0x00, +0x30,0x00,0x00,0x00, +0x00,0x00,0x02,0x00, +0x31,0x00,0x00,0x00, +0x31,0x96,0x0B,0x00, +0x32,0x00,0x00,0x00, +0x0D,0x13,0x00,0x00, +0x33,0x00,0x00,0x00, +0x87,0x01,0x00,0x00, +0x13,0x00,0x00,0x00, +0x6C,0x9E,0x01,0x00, +0x13,0x00,0x00,0x00, +0x94,0x5E,0x01,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x01,0x00, +0x18,0x00,0x00,0x00, +0x01,0xF4,0x00,0x00, +0xFE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x1E,0x00,0x00,0x00, +0x5B,0x10,0x03,0x00, +0xFE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x03,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x04,0x00, +0x11,0x00,0x00,0x00, +0xF9,0x03,0x02,0x00, +0x6C,0x09,0x00,0x00, +0x01,0x02,0x03,0x04, +0x05,0x06,0x07,0x08, +0x09,0x0A,0x0B,0x00, +0x00,0x00,0x00,0x12, +0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12, +0x12,0x12,0x00,0x00, +0x00,0x00,0x0F,0x0F, +0x0F,0x0F,0x0F,0x0F, +0x0F,0x0F,0x0F,0x0F, +0x0F,0x00,0x00,0x00, +0x00,0x17,0x05,0x03, +0x22,0x43,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x00,0x00, +0x22,0x43,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x22,0x43,0x5E,0x00, +0x4F,0xA4,0x3E,0x00, +0x30,0xA6,0x00,0x00, +0x4F,0xA4,0x3E,0x00, +0x2B,0xA4,0x5E,0x00, +0x2B,0xA4,0x00,0x00, +0x2B,0xA4,0x5E,0x00, +0x22,0xA4,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x5E,0x00, +0x00,0xE0,0x4C,0x02, +0x01,0x20,0x00,0x00, +0x00,0xE0,0x4C,0x00, +0x00,0x0C,0x43,0x00, +0x00,0x50,0x43,0x00, +0x00,0x40,0x96,0x00, +0x00,0x05,0xB5,0x00, +0x00,0x0A,0xF7,0x00, +0x00,0x10,0x18,0x00, +0x00,0x13,0x74,0x00, +0x00,0x03,0x7F,0x00, +0x00,0x50,0xF2,0x02, +0x01,0x01,0x00,0x00, +0x00,0x50,0xF2,0x02, +0x00,0x01,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0x00,0x00, +0x4F,0x6E,0x41,0x73, +0x73,0x6F,0x63,0x52, +0x65,0x71,0x00,0x00, +0x4F,0x6E,0x41,0x73, +0x73,0x6F,0x63,0x52, +0x73,0x70,0x00,0x00, +0x4F,0x6E,0x52,0x65, +0x41,0x73,0x73,0x6F, +0x63,0x52,0x65,0x71, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x52,0x65, +0x41,0x73,0x73,0x6F, +0x63,0x52,0x73,0x70, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x50,0x72, +0x6F,0x62,0x65,0x52, +0x65,0x71,0x00,0x00, +0x4F,0x6E,0x50,0x72, +0x6F,0x62,0x65,0x52, +0x73,0x70,0x00,0x00, +0x4F,0x6E,0x42,0x65, +0x61,0x63,0x6F,0x6E, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x41,0x54, +0x49,0x4D,0x00,0x00, +0x4F,0x6E,0x44,0x69, +0x73,0x61,0x73,0x73, +0x6F,0x63,0x00,0x00, +0x4F,0x6E,0x41,0x75, +0x74,0x68,0x00,0x00, +0x4F,0x6E,0x44,0x65, +0x41,0x75,0x74,0x68, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x41,0x63, +0x74,0x69,0x6F,0x6E, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x45,0x78, +0x63,0x65,0x70,0x74, +0x69,0x6F,0x6E,0x00, +0x00,0x00,0x00,0x00, +0xF8,0xDD,0x01,0x80, +0xE8,0x26,0x01,0x80, +0x10,0x00,0x00,0x00, +0x04,0xDE,0x01,0x80, +0xF0,0x26,0x01,0x80, +0x20,0x00,0x00,0x00, +0x10,0xDE,0x01,0x80, +0xE8,0x26,0x01,0x80, +0x30,0x00,0x00,0x00, +0x20,0xDE,0x01,0x80, +0xF0,0x26,0x01,0x80, +0x40,0x00,0x00,0x00, +0x30,0xDE,0x01,0x80, +0x80,0x2D,0x01,0x80, +0x50,0x00,0x00,0x00, +0x3C,0xDE,0x01,0x80, +0x28,0x4A,0x00,0x80, +0x80,0x00,0x00,0x00, +0x48,0xDE,0x01,0x80, +0x90,0x59,0x00,0x80, +0x90,0x00,0x00,0x00, +0x54,0xDE,0x01,0x80, +0x44,0x2E,0x01,0x80, +0xA0,0x00,0x00,0x00, +0x5C,0xDE,0x01,0x80, +0x4C,0x2E,0x01,0x80, +0xB0,0x00,0x00,0x00, +0x68,0xDE,0x01,0x80, +0x54,0x2F,0x01,0x80, +0xC0,0x00,0x00,0x00, +0x70,0xDE,0x01,0x80, +0x6C,0x2E,0x01,0x80, +0xD0,0x00,0x00,0x00, +0x7C,0xDE,0x01,0x80, +0xF0,0x54,0x00,0x80, +0x0C,0x00,0x00,0x00, +0x88,0xDE,0x01,0x80, +0x8C,0x2E,0x01,0x80, +0x73,0x77,0x69,0x74, +0x63,0x68,0x20,0x74, +0x6F,0x20,0x34,0x30, +0x4D,0x20,0x48,0x7A, +0x20,0x6D,0x6F,0x64, +0x65,0x28,0x25,0x78, +0x2C,0x20,0x25,0x78, +0x29,0x0A,0x00,0x00, +0x73,0x77,0x69,0x74, +0x63,0x68,0x20,0x74, +0x6F,0x20,0x32,0x30, +0x4D,0x20,0x48,0x7A, +0x20,0x6D,0x6F,0x64, +0x65,0x0A,0x00,0x00, +0x41,0x54,0x49,0x4D, +0x3A,0x20,0x25,0x78, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x73,0x75,0x72,0x76, +0x65,0x79,0x20,0x64, +0x6F,0x6E,0x65,0x28, +0x25,0x78,0x2C,0x20, +0x25,0x78,0x29,0x0A, +0x00,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x6A,0x6F,0x69,0x6E, +0x20,0x72,0x65,0x73, +0x28,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x64,0x65,0x6C,0x20, +0x73,0x74,0x61,0x0A, +0x00,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x61,0x64,0x64,0x20, +0x73,0x74,0x61,0x3A, +0x25,0x78,0x2C,0x20, +0x25,0x78,0x0A,0x00, +0x72,0x63,0x76,0x20, +0x64,0x69,0x73,0x63, +0x6F,0x6E,0x6E,0x65, +0x63,0x74,0x0A,0x00, +0x64,0x69,0x73,0x63, +0x6F,0x6E,0x6E,0x65, +0x63,0x74,0x20,0x74, +0x69,0x6D,0x65,0x72, +0x3A,0x20,0x6E,0x6F, +0x20,0x62,0x65,0x61, +0x63,0x6F,0x6E,0x0A, +0x00,0x00,0x00,0x00, +0x64,0x69,0x73,0x63, +0x6F,0x6E,0x6E,0x65, +0x63,0x74,0x20,0x74, +0x69,0x6D,0x65,0x72, +0x0A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x40, +0x25,0x73,0x0A,0x00, +0x57,0x4D,0x4D,0x28, +0x25,0x78,0x29,0x3A, +0x20,0x25,0x78,0x2C, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x61,0x73,0x73,0x6F, +0x63,0x20,0x72,0x65, +0x6A,0x65,0x63,0x74, +0x2C,0x20,0x73,0x74, +0x61,0x74,0x75,0x73, +0x3A,0x20,0x25,0x64, +0x0A,0x00,0x00,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x34,0x3A,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x35,0x3A,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x40, +0x25,0x73,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x63,0x75,0x72,0x20, +0x63,0x68,0x61,0x6E, +0x6E,0x65,0x6C,0x3A, +0x20,0x25,0x78,0x2C, +0x20,0x62,0x63,0x6E, +0x20,0x69,0x6E,0x74, +0x65,0x72,0x76,0x61, +0x6C,0x3A,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x49,0x42,0x53,0x53, +0x20,0x6D,0x6F,0x64, +0x65,0x2C,0x20,0x63, +0x75,0x72,0x20,0x63, +0x68,0x61,0x6E,0x6E, +0x65,0x6C,0x3A,0x20, +0x25,0x78,0x2C,0x20, +0x62,0x63,0x6E,0x20, +0x69,0x6E,0x74,0x65, +0x72,0x76,0x61,0x6C, +0x3A,0x20,0x25,0x78, +0x0A,0x00,0x00,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x34,0x3A,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x69,0x6E,0x76,0x61, +0x6C,0x69,0x64,0x20, +0x63,0x61,0x70,0x3A, +0x25,0x78,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x61,0x73, +0x73,0x6F,0x63,0x72, +0x65,0x71,0x28,0x25, +0x78,0x29,0x0A,0x00, +0x5B,0x57,0x41,0x50, +0x49,0x5D,0x20,0x67, +0x65,0x74,0x20,0x77, +0x61,0x70,0x69,0x20, +0x49,0x45,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x61,0x63, +0x74,0x69,0x6F,0x6E, +0x3A,0x20,0x25,0x78, +0x2C,0x20,0x25,0x78, +0x2C,0x20,0x25,0x78, +0x20,0x0A,0x00,0x00, +0x41,0x44,0x44,0x42, +0x41,0x20,0x52,0x53, +0x50,0x3A,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x44,0x45,0x4C,0x42, +0x41,0x3A,0x20,0x25, +0x78,0x28,0x25,0x78, +0x29,0x0A,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x61,0x75, +0x74,0x68,0x0A,0x00, +0x63,0x6C,0x6E,0x74, +0x20,0x61,0x75,0x74, +0x68,0x20,0x66,0x61, +0x69,0x6C,0x2C,0x20, +0x73,0x74,0x61,0x74, +0x75,0x73,0x3A,0x20, +0x25,0x64,0x0A,0x00, +0x6E,0x6F,0x20,0x63, +0x68,0x61,0x6C,0x6C, +0x65,0x6E,0x67,0x65, +0x20,0x74,0x65,0x78, +0x74,0x3F,0x0A,0x00, +0x63,0x6C,0x6E,0x74, +0x20,0x61,0x75,0x74, +0x68,0x20,0x66,0x61, +0x69,0x6C,0x65,0x64, +0x20,0x64,0x75,0x65, +0x20,0x74,0x6F,0x20, +0x69,0x6C,0x6C,0x65, +0x67,0x61,0x6C,0x20, +0x73,0x65,0x71,0x3D, +0x25,0x78,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x65, +0x61,0x75,0x74,0x68, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x69, +0x73,0x61,0x73,0x73, +0x6F,0x63,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x6E,0x75, +0x6C,0x6C,0x20,0x64, +0x61,0x74,0x61,0x28, +0x25,0x64,0x29,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x41,0x72,0x74,0x68, +0x65,0x72,0x6F,0x73, +0x20,0x41,0x50,0x0A, +0x00,0x00,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x42,0x72,0x6F,0x61, +0x64,0x63,0x6F,0x6D, +0x20,0x41,0x50,0x0A, +0x00,0x00,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x4D,0x61,0x72,0x76, +0x65,0x6C,0x6C,0x20, +0x41,0x50,0x0A,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x52,0x61,0x6C,0x69, +0x6E,0x6B,0x20,0x41, +0x50,0x0A,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x43,0x69,0x73,0x63, +0x6F,0x20,0x41,0x50, +0x0A,0x00,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x52,0x65,0x61,0x6C, +0x74,0x65,0x6B,0x20, +0x39,0x36,0x42,0x20, +0x41,0x50,0x0A,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x75,0x6E,0x6B,0x6E, +0x6F,0x77,0x6E,0x20, +0x41,0x50,0x0A,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x25,0x78,0x3A,0x20, +0x25,0x78,0x2C,0x20, +0x25,0x78,0x0A,0x00, +0x64,0x72,0x6F,0x70, +0x20,0x64,0x75,0x65, +0x20,0x74,0x6F,0x20, +0x64,0x65,0x63,0x61, +0x63,0x68,0x65,0x0A, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x00,0x00, +0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x02,0x03, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07, +0x08,0x09,0x0A,0x0B, +0xFF,0x00,0x00,0x00, +0x04,0x05,0x06,0x07, +0x08,0x09,0x0A,0x0B, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x04,0x05,0x06,0x07, +0x08,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x02,0x03, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x01,0x03, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x30,0x31,0x32,0x33, +0x34,0x35,0x36,0x37, +0x38,0x39,0x41,0x42, +0x43,0x44,0x45,0x46, +0x00,0x00,0x00,0x00, +0x25,0x64,0x2E,0x00, +0x25,0x68,0x68,0x58, +0x3A,0x00,0x00,0x00, +0x74,0x61,0x72,0x67, +0x65,0x74,0x20,0x74, +0x68,0x65,0x72,0x6D, +0x61,0x6C,0x3A,0x20, +0x25,0x78,0x2C,0x20, +0x63,0x75,0x72,0x20, +0x74,0x68,0x65,0x72, +0x6D,0x61,0x6C,0x3A, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0xE4,0x01,0x80, +0x08,0xE4,0x01,0x80, +0x31,0x10,0x10,0x00, +0x00,0x30,0x00,0x00, +0x31,0x20,0x10,0x00, +0x00,0x30,0x00,0x00, +0x31,0x28,0x10,0x00, +0x00,0x30,0x00,0x00, +0x31,0x2C,0x10,0x10, +0x00,0x30,0x00,0x00, +0x31,0x2F,0x10,0x10, +0x00,0x30,0x00,0x00, +0x31,0x30,0x18,0x00, +0x00,0x30,0x00,0x00, +0x31,0x30,0x20,0x10, +0x00,0x30,0x00,0x00, +0x22,0x20,0x18,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x14,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x1C,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x20,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x20,0x10, +0x00,0x20,0x00,0x00, +0x22,0x21,0x20,0x18, +0x00,0x20,0x00,0x00, +0x1A,0x19,0x18,0x10, +0x00,0x18,0x00,0x00, +0x12,0x11,0x10,0x08, +0x00,0x10,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x08,0x00,0x00, +0x0A,0x09,0x08,0x02, +0x00,0x08,0x00,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x08,0x00,0x00, +0x0A,0x09,0x08,0x06, +0x00,0x08,0x00,0x00, +0x08,0x07,0x06,0x04, +0x00,0x06,0x00,0x00, +0x06,0x05,0x04,0x02, +0x00,0x04,0x00,0x00, +0x06,0x05,0x04,0x03, +0x00,0x04,0x00,0x00, +0x05,0x04,0x03,0x02, +0x00,0x03,0x00,0x00, +0x09,0x08,0x07,0x06, +0x07,0x06,0x06,0x05, +0x05,0x04,0x04,0x03, +0x06,0x05,0x05,0x04, +0x04,0x03,0x03,0x03, +0x05,0x04,0x04,0x03, +0x03,0x02,0x02,0x02, +0x00,0x09,0x08,0x07, +0x06,0x07,0x06,0x06, +0x05,0x05,0x04,0x04, +0x03,0x05,0x04,0x04, +0x03,0x03,0x02,0x02, +0x02,0x04,0x03,0x03, +0x02,0x02,0x01,0x01, +0x01,0x00,0x00,0x00, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x10,0x10,0x20, +0x08,0x08,0x08,0x08, +0x20,0x20,0x20,0x20, +0x08,0x08,0x08,0x08, +0x08,0x20,0x20,0x20, +0x30,0x08,0x08,0x08, +0x08,0x18,0x18,0x18, +0x18,0x18,0x20,0x30, +0x30,0x10,0x20,0x20, +0x20,0x20,0x20,0x30, +0x30,0x08,0x10,0x20, +0x30,0x30,0x30,0x30, +0x30,0x30,0x00,0x00, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x10,0x10,0x20, +0x08,0x08,0x08,0x08, +0x08,0x20,0x20,0x20, +0x08,0x08,0x08,0x08, +0x08,0x20,0x20,0x20, +0x20,0x08,0x08,0x08, +0x08,0x18,0x18,0x18, +0x18,0x18,0x20,0x30, +0x30,0x10,0x20,0x20, +0x20,0x20,0x20,0x30, +0x30,0x08,0x10,0x20, +0x30,0x30,0x30,0x30, +0x30,0x30,0x00,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x0A,0x09, +0x08,0x00,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x0A,0x09, +0x08,0x00,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x22,0x21,0x20,0x18, +0x00,0x22,0x21,0x20, +0x18,0x00,0x22,0x21, +0x1C,0x08,0x00,0x22, +0x20,0x18,0x08,0x00, +0x0A,0x09,0x08,0x02, +0x00,0x0A,0x09,0x08, +0x02,0x00,0x0A,0x09, +0x08,0x02,0x00,0x0A, +0x09,0x08,0x02,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x22,0x21,0x20, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x22, +0x21,0x1C,0x08,0x00, +0x31,0x30,0x18,0x00, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x1A,0x19, +0x18,0x10,0x00,0x1A, +0x19,0x18,0x10,0x00, +0x1A,0x19,0x18,0x10, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x31, +0x2C,0x10,0x10,0x00, +0x31,0x28,0x10,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x22,0x21, +0x20,0x18,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x08, +0x00,0x22,0x21,0x14, +0x08,0x00,0x22,0x20, +0x18,0x08,0x00,0x31, +0x30,0x20,0x10,0x00, +0x31,0x2C,0x10,0x10, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x18, +0x00,0x31,0x30,0x20, +0x10,0x00,0x31,0x2F, +0x10,0x10,0x00,0x31, +0x2F,0x10,0x10,0x00, +0x31,0x10,0x10,0x00, +0x00,0x31,0x2C,0x10, +0x10,0x00,0x00,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x0A,0x09, +0x08,0x00,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x02,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x22,0x21,0x20, +0x18,0x00,0x22,0x21, +0x1C,0x08,0x00,0x22, +0x21,0x14,0x08,0x00, +0x0A,0x09,0x08,0x02, +0x00,0x0A,0x09,0x08, +0x02,0x00,0x0A,0x09, +0x08,0x02,0x00,0x0A, +0x09,0x08,0x02,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x22,0x21,0x20, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x22, +0x21,0x14,0x08,0x00, +0x22,0x21,0x14,0x08, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x1A,0x19, +0x18,0x10,0x00,0x1A, +0x19,0x18,0x10,0x00, +0x1A,0x19,0x18,0x10, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x31, +0x2C,0x10,0x10,0x00, +0x31,0x28,0x10,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x22,0x21, +0x20,0x18,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x08, +0x00,0x22,0x21,0x14, +0x08,0x00,0x22,0x20, +0x18,0x08,0x00,0x31, +0x30,0x20,0x10,0x00, +0x31,0x2C,0x10,0x10, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x18, +0x00,0x31,0x30,0x20, +0x10,0x00,0x31,0x2F, +0x10,0x10,0x00,0x31, +0x2F,0x10,0x10,0x00, +0x31,0x10,0x10,0x00, +0x00,0x31,0x2C,0x10, +0x10,0x00,0x00,0x00, +0x01,0x02,0x04,0x08, +0x02,0x04,0x08,0x0C, +0x10,0x18,0x20,0x30, +0x02,0x04,0x08,0x0C, +0x10,0x18,0x20,0x30, +0x06,0x0C,0x10,0x18, +0x24,0x30,0x3C,0x48, +0x48,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x25,0x27,0x2C, +0x19,0x1B,0x1E,0x20, +0x23,0x29,0x2A,0x2B, +0x00,0x00,0x00,0x00, +0x25,0x29,0x2B,0x2E, +0x2E,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x08,0x00,0x00,0x00, +0x10,0x00,0x00,0x00, +0x18,0x00,0x00,0x00, +0x24,0x00,0x00,0x00, +0x30,0x00,0x00,0x00, +0x48,0x00,0x00,0x00, +0x60,0x00,0x00,0x00, +0x90,0x00,0x00,0x00, +0xC0,0x00,0x00,0x00, +0xD8,0x00,0x00,0x00, +0x50,0x00,0x00,0x00, +0x78,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00, +0xC8,0x00,0x00,0x00, +0x40,0x01,0x00,0x00, +0x90,0x01,0x00,0x00, +0xE0,0x01,0x00,0x00, +0x30,0x02,0x00,0x00, +0x2C,0x01,0x00,0x00, +0x40,0x01,0x00,0x00, +0xE0,0x01,0x00,0x00, +0xD0,0x02,0x00,0x00, +0x80,0x0C,0x00,0x00, +0x80,0x0C,0x00,0x00, +0x80,0x0C,0x00,0x00, +0xA0,0x0F,0x00,0x00, +0xA0,0x0F,0x00,0x00, +0x02,0x00,0x00,0x00, +0x02,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x08,0x00,0x00,0x00, +0x0C,0x00,0x00,0x00, +0x12,0x00,0x00,0x00, +0x18,0x00,0x00,0x00, +0x24,0x00,0x00,0x00, +0x30,0x00,0x00,0x00, +0x48,0x00,0x00,0x00, +0x60,0x00,0x00,0x00, +0x6C,0x00,0x00,0x00, +0x28,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00, +0x50,0x00,0x00,0x00, +0x64,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00, +0xC8,0x00,0x00,0x00, +0xF0,0x00,0x00,0x00, +0x18,0x01,0x00,0x00, +0x64,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00, +0xF0,0x00,0x00,0x00, +0x68,0x01,0x00,0x00, +0x40,0x06,0x00,0x00, +0x40,0x06,0x00,0x00, +0x40,0x06,0x00,0x00, +0xD0,0x07,0x00,0x00, +0xD0,0x07,0x00,0x00, +0x72,0x65,0x73,0x65, +0x74,0x28,0x25,0x78, +0x29,0x0A,0x00,0x00, +0xC8,0x82,0x01,0x80, +0xC8,0xD0,0x00,0x80, +0xC8,0xD0,0x00,0x80, +0xC8,0xD0,0x00,0x80, +0xC8,0xD0,0x00,0x80, +0x14,0xCF,0x00,0x80, +0xD0,0x82,0x01,0x80, +0xC8,0x82,0x01,0x80, +0xC8,0x82,0x01,0x80, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xF0,0x85,0x01,0x80, +0xF0,0x85,0x01,0x80, +0xF0,0x85,0x01,0x80, +0xF0,0x85,0x01,0x80, +0xA8,0x82,0x01,0x80, +0x00,0x85,0x01,0x80, +0xB0,0x82,0x01,0x80, +0xB8,0x82,0x01,0x80, +0xC0,0x82,0x01,0x80, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0x04,0x04,0x08, +0x02,0x02,0x01,0x01, +0x50,0x53,0x00,0x00, +0x80,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA0,0xA4,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x68,0xA4,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x30,0xA4,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0xF8,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0xC0,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x88,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x48,0xA3,0x01,0x80, +0xB8,0x06,0x00,0x80, +0xAC,0x06,0x00,0x80, +0xA0,0x06,0x00,0x80, +0x94,0x06,0x00,0x80, +0x88,0x06,0x00,0x80, +0x7C,0x06,0x00,0x80, +0x70,0x06,0x00,0x80, +0x64,0x06,0x00,0x80, +0x58,0x06,0x00,0x80, +0x4C,0x06,0x00,0x80, +0x04,0x06,0x00,0x80, +0x30,0x1F,0x02,0x80, +0xB0,0x03,0x25,0xB0, +0x30,0x1F,0x02,0x80, +0x30,0x1F,0x02,0x80, +0x30,0x1F,0x02,0x80, +0x30,0x1F,0x02,0x80, +0x6A,0x6F,0x69,0x6E, +0x62,0x73,0x73,0x5F, +0x68,0x64,0x6C,0x00, +0x00,0x0E,0x04,0x0E, +0x10,0x0E,0x14,0x0E, +0x18,0x0E,0x1C,0x0E, +0x02,0x04,0x04,0x07, +0x07,0x0D,0x0D,0x0D, +0x02,0x07,0x07,0x0D, +0x0D,0x0F,0x0F,0x0F, +0x0F,0x00,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x73, +0x75,0x72,0x76,0x65, +0x79,0x5F,0x64,0x6F, +0x6E,0x65,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x6A, +0x6F,0x69,0x6E,0x5F, +0x72,0x65,0x73,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x64, +0x65,0x6C,0x5F,0x73, +0x74,0x61,0x5F,0x65, +0x76,0x65,0x6E,0x74, +0x00,0x00,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x61, +0x64,0x64,0x5F,0x73, +0x74,0x61,0x5F,0x65, +0x76,0x65,0x6E,0x74, +0x00,0x00,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x70,0x72, +0x6F,0x62,0x65,0x72, +0x65,0x71,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x70,0x72, +0x6F,0x62,0x65,0x72, +0x73,0x70,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x42, +0x53,0x53,0x49,0x44, +0x5F,0x69,0x6E,0x66, +0x6F,0x00,0x00,0x00, +0x00,0x50,0xF2,0x01, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x61,0x73, +0x73,0x6F,0x63,0x72, +0x65,0x71,0x00,0x00, +0x00,0x50,0xF2,0x04, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x61,0x63, +0x74,0x69,0x6F,0x6E, +0x00,0x00,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x61,0x75, +0x74,0x68,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x65, +0x61,0x75,0x74,0x68, +0x00,0x00,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x69, +0x73,0x61,0x73,0x73, +0x6F,0x63,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x66,0x72, +0x61,0x6D,0x65,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x66,0x72, +0x61,0x6D,0x65,0x5F, +0x6C,0x65,0x6E,0x00, +0x30,0x1F,0x02,0x80, +0xB0,0x03,0x25,0xB0, +0xF8,0x00,0x25,0xB0, +0x18,0x03,0x25,0xB0, +0x44,0x44,0x33,0x33, +0x06,0x00,0x2A,0xB0, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x24,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0xA8,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x9C,0x3E,0x01,0x80, +0x90,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x84,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x78,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x6C,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x60,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x54,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x48,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x3C,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x30,0x3E,0x01,0x80, +0x68,0x3F,0x01,0x80, +0x5C,0x3F,0x01,0x80, +0x50,0x3F,0x01,0x80, +0x44,0x3F,0x01,0x80, +0x38,0x3F,0x01,0x80, +0x2C,0x3F,0x01,0x80, +0x20,0x3F,0x01,0x80, +0x14,0x3F,0x01,0x80, +0x08,0x3F,0x01,0x80, +0xFC,0x3E,0x01,0x80, +0xF0,0x3E,0x01,0x80, +0xE4,0x3E,0x01,0x80, +0x00,0x50,0xF2,0x01, +0x00,0x50,0xF2,0x02, +0x00,0x0F,0xAC,0x02, +0xBC,0xE3,0x01,0x80, +0x67,0x66,0x66,0x66, +0x7C,0x88,0x00,0x80, +0x64,0x88,0x00,0x80, +0x4C,0x88,0x00,0x80, +0x34,0x88,0x00,0x80, +0x1C,0x88,0x00,0x80, +0x04,0x88,0x00,0x80, +0xE0,0x87,0x00,0x80, +0x00,0x02,0x00,0x00, +0x08,0x09,0x00,0x00, +0x18,0x96,0x00,0x80, +0x24,0x96,0x00,0x80, +0x30,0x96,0x00,0x80, +0x3C,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x48,0x96,0x00,0x80, +0x54,0x96,0x00,0x80, +0x60,0x96,0x00,0x80, +0x6C,0x96,0x00,0x80, +0x30,0x1F,0x02,0x80, +0x84,0x0E,0x25,0xB0, +0x88,0x0E,0x25,0xB0, +0x8C,0x0E,0x25,0xB0, +0xD0,0x0E,0x25,0xB0, +0xD8,0x0E,0x25,0xB0, +0x20,0x08,0x25,0xB0, +0x74,0x0E,0x25,0xB0, +0x80,0x0E,0x25,0xB0, +0x84,0x0E,0x25,0xB0, +0x88,0x0E,0x25,0xB0, +0x8C,0x0E,0x25,0xB0, +0xD0,0x0E,0x25,0xB0, +0xD8,0x0E,0x25,0xB0, +0x14,0x0C,0x25,0xB0, +0x88,0x0C,0x25,0xB0, +0x1C,0x0C,0x25,0xB0, +0xFE,0x01,0x80,0x7F, +0xE2,0x01,0x80,0x78, +0xC7,0x01,0xC0,0x71, +0xAE,0x01,0x80,0x6B, +0x95,0x01,0x40,0x65, +0x7F,0x01,0xC0,0x5F, +0x69,0x01,0x40,0x5A, +0x55,0x01,0x40,0x55, +0x42,0x01,0x80,0x50, +0x30,0x01,0x00,0x4C, +0x1F,0x01,0xC0,0x47, +0x0F,0x01,0xC0,0x43, +0x00,0x01,0x00,0x40, +0xF2,0x00,0x80,0x3C, +0xE4,0x00,0x00,0x39, +0xD7,0x00,0xC0,0x35, +0xCB,0x00,0xC0,0x32, +0xC0,0x00,0x00,0x30, +0xB5,0x00,0x40,0x2D, +0xAB,0x00,0xC0,0x2A, +0xA2,0x00,0x80,0x28, +0x98,0x00,0x00,0x26, +0x90,0x00,0x00,0x24, +0x88,0x00,0x00,0x22, +0x80,0x00,0x00,0x20, +0x79,0x00,0x40,0x1E, +0x72,0x00,0x80,0x1C, +0x6C,0x00,0x00,0x1B, +0x66,0x00,0x80,0x19, +0x60,0x00,0x00,0x18, +0x5B,0x00,0xC0,0x16, +0x56,0x00,0x80,0x15, +0x51,0x00,0x40,0x14, +0x4C,0x00,0x00,0x13, +0x48,0x00,0x00,0x12, +0x44,0x00,0x00,0x11, +0x40,0x00,0x00,0x10, +0x36,0x35,0x2E,0x25, +0x1C,0x12,0x09,0x04, +0x33,0x32,0x2B,0x23, +0x1A,0x11,0x08,0x04, +0x30,0x2F,0x29,0x21, +0x19,0x10,0x08,0x03, +0x2D,0x2D,0x27,0x1F, +0x18,0x0F,0x08,0x03, +0x2B,0x2A,0x25,0x1E, +0x16,0x0E,0x07,0x03, +0x28,0x28,0x22,0x1C, +0x15,0x0D,0x07,0x03, +0x26,0x25,0x21,0x1B, +0x14,0x0D,0x06,0x03, +0x24,0x23,0x1F,0x19, +0x13,0x0C,0x06,0x03, +0x22,0x21,0x1D,0x18, +0x11,0x0B,0x06,0x02, +0x20,0x20,0x1B,0x16, +0x11,0x08,0x05,0x02, +0x1F,0x1E,0x1A,0x15, +0x10,0x0A,0x05,0x02, +0x1D,0x1C,0x18,0x14, +0x0F,0x0A,0x05,0x02, +0x1B,0x1A,0x17,0x13, +0x0E,0x09,0x04,0x02, +0x1A,0x19,0x16,0x12, +0x0D,0x09,0x04,0x02, +0x18,0x17,0x15,0x11, +0x0C,0x08,0x04,0x02, +0x17,0x16,0x13,0x10, +0x0C,0x08,0x04,0x02, +0x16,0x15,0x12,0x0F, +0x0B,0x07,0x04,0x01, +0x14,0x14,0x11,0x0E, +0x0B,0x07,0x03,0x02, +0x13,0x13,0x10,0x0D, +0x0A,0x06,0x03,0x01, +0x12,0x12,0x0F,0x0C, +0x09,0x06,0x03,0x01, +0x11,0x11,0x0F,0x0C, +0x09,0x06,0x03,0x01, +0x10,0x10,0x0E,0x0B, +0x08,0x05,0x03,0x01, +0x0F,0x0F,0x0D,0x0B, +0x08,0x05,0x03,0x01, +0x0E,0x0E,0x0C,0x0A, +0x08,0x05,0x02,0x01, +0x0D,0x0D,0x0C,0x0A, +0x07,0x05,0x02,0x01, +0x0D,0x0C,0x0B,0x09, +0x07,0x04,0x02,0x01, +0x0C,0x0C,0x0A,0x09, +0x06,0x04,0x02,0x01, +0x0B,0x0B,0x0A,0x08, +0x06,0x04,0x02,0x01, +0x0B,0x0A,0x09,0x08, +0x06,0x04,0x02,0x01, +0x0A,0x0A,0x09,0x07, +0x05,0x03,0x02,0x01, +0x0A,0x09,0x08,0x07, +0x05,0x03,0x02,0x01, +0x09,0x09,0x08,0x06, +0x05,0x03,0x01,0x01, +0x09,0x08,0x07,0x06, +0x04,0x03,0x01,0x01, +0x36,0x35,0x2E,0x1B, +0x00,0x00,0x00,0x00, +0x33,0x32,0x2B,0x19, +0x00,0x00,0x00,0x00, +0x30,0x2F,0x29,0x18, +0x00,0x00,0x00,0x00, +0x2D,0x2D,0x17,0x17, +0x00,0x00,0x00,0x00, +0x2B,0x2A,0x25,0x15, +0x00,0x00,0x00,0x00, +0x28,0x28,0x24,0x14, +0x00,0x00,0x00,0x00, +0x26,0x25,0x21,0x13, +0x00,0x00,0x00,0x00, +0x24,0x23,0x1F,0x12, +0x00,0x00,0x00,0x00, +0x22,0x21,0x1D,0x11, +0x00,0x00,0x00,0x00, +0x20,0x20,0x1B,0x10, +0x00,0x00,0x00,0x00, +0x1F,0x1E,0x1A,0x0F, +0x00,0x00,0x00,0x00, +0x1D,0x1C,0x18,0x0E, +0x00,0x00,0x00,0x00, +0x1B,0x1A,0x17,0x0E, +0x00,0x00,0x00,0x00, +0x1A,0x19,0x16,0x0D, +0x00,0x00,0x00,0x00, +0x18,0x17,0x15,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x16,0x13,0x0B, +0x00,0x00,0x00,0x00, +0x16,0x15,0x12,0x0B, +0x00,0x00,0x00,0x00, +0x14,0x14,0x11,0x0A, +0x00,0x00,0x00,0x00, +0x13,0x13,0x10,0x0A, +0x00,0x00,0x00,0x00, +0x12,0x12,0x0F,0x09, +0x00,0x00,0x00,0x00, +0x11,0x11,0x0F,0x09, +0x00,0x00,0x00,0x00, +0x10,0x10,0x0E,0x08, +0x00,0x00,0x00,0x00, +0x0F,0x0F,0x0D,0x08, +0x00,0x00,0x00,0x00, +0x0E,0x0E,0x0C,0x07, +0x00,0x00,0x00,0x00, +0x0D,0x0D,0x0C,0x07, +0x00,0x00,0x00,0x00, +0x0D,0x0C,0x0B,0x06, +0x00,0x00,0x00,0x00, +0x0C,0x0C,0x0A,0x06, +0x00,0x00,0x00,0x00, +0x0B,0x0B,0x0A,0x06, +0x00,0x00,0x00,0x00, +0x0B,0x0A,0x09,0x05, +0x00,0x00,0x00,0x00, +0x0A,0x0A,0x09,0x05, +0x00,0x00,0x00,0x00, +0x0A,0x09,0x08,0x05, +0x00,0x00,0x00,0x00, +0x09,0x09,0x08,0x05, +0x00,0x00,0x00,0x00, +0x09,0x08,0x07,0x04, +0x00,0x00,0x00,0x00, +0x06,0x00,0x2A,0xB0, +0x05,0x00,0x2A,0xB0, +0x54,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0x80,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0x2C,0x83,0x01,0x80, +0x00,0x01,0x02,0x02, +0x03,0x03,0x03,0x03, +0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04, +0x05,0x05,0x05,0x05, +0x05,0x05,0x05,0x05, +0x05,0x05,0x05,0x05, +0x05,0x05,0x05,0x05, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x28,0x28,0x28, +0x28,0x28,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0xA0,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04, +0x04,0x04,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x41,0x41,0x41, +0x41,0x41,0x41,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x10, +0x10,0x10,0x10,0x10, +0x10,0x42,0x42,0x42, +0x42,0x42,0x42,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x10, +0x10,0x10,0x10,0x08, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA0,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x10, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x10, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x00, +0x2D,0x5C,0x7C,0x2F, +0x00,0x00,0x00,0x00, +0xFD,0xFA,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x45,0xC4,0xF0, +0x00,0x45,0xC4,0xF0, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x45,0xB5,0x60, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x02, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0xFB,0x90,0xB8, +0xFF,0xFF,0xFF,0xFF, +}; diff --git a/drivers/net/wireless/rtl8192c/include/h2clbk.h b/drivers/net/wireless/rtl8192c/include/h2clbk.h new file mode 100755 index 000000000000..359c9e7a8f24 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/h2clbk.h @@ -0,0 +1,35 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#define _H2CLBK_H_ + + +#include +#include + + +void _lbk_cmd(PADAPTER Adapter); + +void _lbk_rsp(PADAPTER Adapter); + +void _lbk_evt(IN PADAPTER Adapter); + +void h2c_event_callback(unsigned char *dev, unsigned char *pbuf); diff --git a/drivers/net/wireless/rtl8192c/include/hal_init.h b/drivers/net/wireless/rtl8192c/include/hal_init.h new file mode 100755 index 000000000000..c05e6bfb2424 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/hal_init.h @@ -0,0 +1,272 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HAL_INIT_H__ +#define __HAL_INIT_H__ + +#include +#include +#include + +#ifdef CONFIG_PCI_HCI +#include +#endif + + +enum RTL871X_HCI_TYPE { + + RTW_SDIO, + RTW_USB, + RTW_PCIE +}; + +enum _CHIP_TYPE { + + NULL_CHIP_TYPE, + RTL8712_8188S_8191S_8192S, + RTL8188C_8192C, + RTL8192D, + MAX_CHIP_TYPE +}; + + +typedef enum _HW_VARIABLES{ + HW_VAR_MEDIA_STATUS, + HW_VAR_MEDIA_STATUS1, + HW_VAR_SET_OPMODE, + HW_VAR_BSSID, + HW_VAR_INIT_RTS_RATE, + HW_VAR_BASIC_RATE, + HW_VAR_TXPAUSE, + HW_VAR_BCN_FUNC, + HW_VAR_CORRECT_TSF, + HW_VAR_CHECK_BSSID, + HW_VAR_MLME_DISCONNECT, + HW_VAR_MLME_SITESURVEY, + HW_VAR_MLME_JOIN, + HW_VAR_BEACON_INTERVAL, + HW_VAR_SLOT_TIME, + HW_VAR_SIFS, + HW_VAR_ACK_PREAMBLE, + HW_VAR_SEC_CFG, + HW_VAR_TX_BCN_DONE, + HW_VAR_RF_TYPE, + HW_VAR_DM_FLAG, + HW_VAR_DM_FUNC_OP, + HW_VAR_DM_FUNC_SET, + HW_VAR_DM_FUNC_CLR, + HW_VAR_CAM_EMPTY_ENTRY, + HW_VAR_CAM_INVALID_ALL, + HW_VAR_CAM_WRITE, + HW_VAR_AC_PARAM_VO, + HW_VAR_AC_PARAM_VI, + HW_VAR_AC_PARAM_BE, + HW_VAR_AC_PARAM_BK, + HW_VAR_AMPDU_MIN_SPACE, + HW_VAR_AMPDU_FACTOR, + HW_VAR_RXDMA_AGG_PG_TH, + HW_VAR_SET_RPWM, + HW_VAR_H2C_FW_PWRMODE, + HW_VAR_H2C_FW_JOINBSSRPT, + HW_VAR_FWLPS_RF_ON, + HW_VAR_H2C_FW_P2P_PS_OFFLOAD, + HW_VAR_INITIAL_GAIN, + HW_VAR_TRIGGER_GPIO_0, + HW_VAR_BT_SET_COEXIST, + HW_VAR_BT_ISSUE_DELBA, + HW_VAR_CURRENT_ANTENNA, + HW_VAR_ANTENNA_DIVERSITY_LINK, + HW_VAR_ANTENNA_DIVERSITY_SELECT, + HW_VAR_SWITCH_EPHY_WoWLAN, + HW_VAR_EFUSE_BYTES, + HW_VAR_FIFO_CLEARN_UP, +}HW_VARIABLES; + +typedef enum _HAL_DEF_VARIABLE{ + HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, + HAL_DEF_IS_SUPPORT_ANT_DIV, + HAL_DEF_CURRENT_ANTENNA, + HAL_DEF_DRVINFO_SZ, + HAL_DEF_MAX_RECVBUF_SZ, + HAL_DEF_RX_PACKET_OFFSET, + HAL_DEF_DBG_DUMP_RXPKT,//for dbg + HAL_DEF_DBG_DM_FUNC,//for dbg +}HAL_DEF_VARIABLE; + +typedef enum _HAL_INTF_PS_FUNC{ + HAL_USB_SELECT_SUSPEND, + HAL_MAX_ID, +}HAL_INTF_PS_FUNC; + +struct hal_ops { + u32 (*hal_init)(PADAPTER Adapter); + u32 (*hal_deinit)(PADAPTER Adapter); + + void (*free_hal_data)(PADAPTER Adapter); + + u32 (*inirp_init)(PADAPTER Adapter); + u32 (*inirp_deinit)(PADAPTER Adapter); + + s32 (*init_xmit_priv)(PADAPTER Adapter); + void (*free_xmit_priv)(PADAPTER Adapter); + + s32 (*init_recv_priv)(PADAPTER Adapter); + void (*free_recv_priv)(PADAPTER Adapter); + + void (*InitSwLeds)(PADAPTER Adapter); + void (*DeInitSwLeds)(PADAPTER Adapter); + + void (*dm_init)(PADAPTER Adapter); + void (*dm_deinit)(PADAPTER Adapter); + void (*read_chip_version)(PADAPTER Adapter); + + void (*init_default_value)(PADAPTER Adapter); + + void (*intf_chip_configure)(PADAPTER Adapter); + + void (*read_adapter_info)(PADAPTER Adapter); + + void (*enable_interrupt)(PADAPTER Adapter); + void (*disable_interrupt)(PADAPTER Adapter); + s32 (*interrupt_handler)(PADAPTER Adapter); + + void (*set_bwmode_handler)(PADAPTER Adapter, HT_CHANNEL_WIDTH Bandwidth, u8 Offset); + void (*set_channel_handler)(PADAPTER Adapter, u8 channel); + + void (*hal_dm_watchdog)(PADAPTER Adapter); + + void (*SetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val); + void (*GetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val); + + u8 (*GetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); + u8 (*SetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); + + void (*UpdateRAMaskHandler)(PADAPTER Adapter, u32 mac_id); + void (*SetBeaconRelatedRegistersHandler)(PADAPTER Adapter); + + void (*Add_RateATid)(PADAPTER Adapter, u32 bitmap, u8 arg); + +#ifdef CONFIG_ANTENNA_DIVERSITY + u8 (*SwAntDivBeforeLinkHandler)(PADAPTER Adapter); + void (*SwAntDivCompareHandler)(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); +#endif + u8 (*interface_ps_func)(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8* val); + + s32 (*hal_xmit)(PADAPTER Adapter, struct xmit_frame *pxmitframe); + void (*mgnt_xmit)(PADAPTER Adapter, struct xmit_frame *pmgntframe); + + u32 (*read_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask); + void (*write_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask, u32 Data); + u32 (*read_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask); + void (*write_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data); + +#ifdef CONFIG_HOSTAPD_MLME + s32 (*hostap_mgnt_xmit_entry)(PADAPTER Adapter, _pkt *pkt); +#endif + void (*EfusePowerSwitch)(PADAPTER pAdapter, u8 bWrite, u8 PwrState); + void (*ReadEFuse)(PADAPTER Adapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, BOOLEAN bPseudoTest); + void (*EFUSEGetEfuseDefinition)(PADAPTER pAdapter, u8 efuseType, u8 type, PVOID *pOut, BOOLEAN bPseudoTest); + u16 (*EfuseGetCurrentSize)(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); + int (*Efuse_PgPacketRead)(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest); + int (*Efuse_PgPacketWrite)(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest); + u8 (*Efuse_WordEnableDataWrite)(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest); + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + void (*sreset_init_value)(_adapter *padapter); + void (*sreset_reset_value)(_adapter *padapter); + void (*silentreset)(_adapter *padapter); + void (*sreset_xmit_status_check)(_adapter *padapter); + void (*sreset_linked_status_check) (_adapter *padapter); + u8 (*sreset_get_wifi_status)(_adapter *padapter); +#endif +}; + +typedef enum _RT_EEPROM_TYPE{ + EEPROM_93C46, + EEPROM_93C56, + EEPROM_BOOT_EFUSE, +}RT_EEPROM_TYPE,*PRT_EEPROM_TYPE; + +#define USB_HIGH_SPEED_BULK_SIZE 512 +#define USB_FULL_SPEED_BULK_SIZE 64 + +#define RF_CHANGE_BY_INIT 0 +#define RF_CHANGE_BY_IPS BIT28 +#define RF_CHANGE_BY_PS BIT29 +#define RF_CHANGE_BY_HW BIT30 +#define RF_CHANGE_BY_SW BIT31 + +typedef enum _HARDWARE_TYPE{ + HARDWARE_TYPE_RTL8180, + HARDWARE_TYPE_RTL8185, + HARDWARE_TYPE_RTL8187, + HARDWARE_TYPE_RTL8188, + HARDWARE_TYPE_RTL8190P, + HARDWARE_TYPE_RTL8192E, + HARDWARE_TYPE_RTL819xU, + HARDWARE_TYPE_RTL8192SE, + HARDWARE_TYPE_RTL8192SU, + HARDWARE_TYPE_RTL8192CE, + HARDWARE_TYPE_RTL8192CU, + HARDWARE_TYPE_RTL8192DE, + HARDWARE_TYPE_RTL8192DU, + HARDWARE_TYPE_RTL8723E, + HARDWARE_TYPE_RTL8723U, +}HARDWARE_TYPE; + +#define IS_HARDWARE_TYPE_8192CE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CE) +#define IS_HARDWARE_TYPE_8192CU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CU) + +#define IS_HARDWARE_TYPE_8192DE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DE) +#define IS_HARDWARE_TYPE_8192DU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DU) + +#define IS_HARDWARE_TYPE_8723E(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723E) +#define IS_HARDWARE_TYPE_8723U(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723U) + +#define IS_HARDWARE_TYPE_8192C(_Adapter) \ +(IS_HARDWARE_TYPE_8192CE(_Adapter) || IS_HARDWARE_TYPE_8192CU(_Adapter)) + +#define IS_HARDWARE_TYPE_8192D(_Adapter) \ +(IS_HARDWARE_TYPE_8192DE(_Adapter) || IS_HARDWARE_TYPE_8192DU(_Adapter)) + +#define IS_HARDWARE_TYPE_8723(_Adapter) \ +(IS_HARDWARE_TYPE_8723E(_Adapter) || IS_HARDWARE_TYPE_8723U(_Adapter)) + + +typedef struct eeprom_priv EEPROM_EFUSE_PRIV, *PEEPROM_EFUSE_PRIV; +#define GET_EEPROM_EFUSE_PRIV(priv) (&priv->eeprompriv) + + +void rtw_dm_init(_adapter *padapter); +void rtw_sw_led_init(_adapter *padapter); +void rtw_sw_led_deinit(_adapter *padapter); + +uint rtw_hal_init(_adapter *padapter); +uint rtw_hal_deinit(_adapter *padapter); +void rtw_hal_stop(_adapter *padapter); + +void intf_chip_configure(_adapter *padapter); +void intf_read_chip_info(_adapter *padapter); +void intf_read_chip_version(_adapter *padapter); +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +void rtw_sreset_init(_adapter *padapter); +#endif + +#endif //__HAL_INIT_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/ieee80211.h b/drivers/net/wireless/rtl8192c/include/ieee80211.h new file mode 100755 index 000000000000..885bc276daea --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ieee80211.h @@ -0,0 +1,1432 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __IEEE80211_H +#define __IEEE80211_H + + +#ifndef CONFIG_RTL8711FW + + #include + #include + #include + #include "wifi.h" + + #if defined PLATFORM_OS_XP + #include + #endif + #if defined PLATFORM_LINUX + #include + #endif +#else + + #include + +#endif + +#define MGMT_QUEUE_NUM 5 + +#define ETH_ALEN 6 + +#ifdef CONFIG_AP_MODE + +#define RTL_IOCTL_HOSTAPD (SIOCIWFIRSTPRIV + 28) + +/* RTL871X_IOCTL_HOSTAPD ioctl() cmd: */ +enum { + RTL871X_HOSTAPD_FLUSH = 1, + RTL871X_HOSTAPD_ADD_STA = 2, + RTL871X_HOSTAPD_REMOVE_STA = 3, + RTL871X_HOSTAPD_GET_INFO_STA = 4, + /* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */ + RTL871X_HOSTAPD_GET_WPAIE_STA = 5, + RTL871X_SET_ENCRYPTION = 6, + RTL871X_GET_ENCRYPTION = 7, + RTL871X_HOSTAPD_SET_FLAGS_STA = 8, + RTL871X_HOSTAPD_GET_RID = 9, + RTL871X_HOSTAPD_SET_RID = 10, + RTL871X_HOSTAPD_SET_ASSOC_AP_ADDR = 11, + RTL871X_HOSTAPD_SET_GENERIC_ELEMENT = 12, + RTL871X_HOSTAPD_MLME = 13, + RTL871X_HOSTAPD_SCAN_REQ = 14, + RTL871X_HOSTAPD_STA_CLEAR_STATS = 15, + RTL871X_HOSTAPD_SET_BEACON=16, + RTL871X_HOSTAPD_SET_WPS_BEACON = 17, + RTL871X_HOSTAPD_SET_WPS_PROBE_RESP = 18, + RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP = 19, +}; + +/* STA flags */ +#define WLAN_STA_AUTH BIT(0) +#define WLAN_STA_ASSOC BIT(1) +#define WLAN_STA_PS BIT(2) +#define WLAN_STA_TIM BIT(3) +#define WLAN_STA_PERM BIT(4) +#define WLAN_STA_AUTHORIZED BIT(5) +#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */ +#define WLAN_STA_SHORT_PREAMBLE BIT(7) +#define WLAN_STA_PREAUTH BIT(8) +#define WLAN_STA_WME BIT(9) +#define WLAN_STA_MFP BIT(10) +#define WLAN_STA_HT BIT(11) +#define WLAN_STA_WPS BIT(12) +#define WLAN_STA_MAYBE_WPS BIT(13) +#define WLAN_STA_NONERP BIT(31) + +#endif + +#define IEEE_CMD_SET_WPA_PARAM 1 +#define IEEE_CMD_SET_WPA_IE 2 +#define IEEE_CMD_SET_ENCRYPTION 3 +#define IEEE_CMD_MLME 4 + +#define IEEE_PARAM_WPA_ENABLED 1 +#define IEEE_PARAM_TKIP_COUNTERMEASURES 2 +#define IEEE_PARAM_DROP_UNENCRYPTED 3 +#define IEEE_PARAM_PRIVACY_INVOKED 4 +#define IEEE_PARAM_AUTH_ALGS 5 +#define IEEE_PARAM_IEEE_802_1X 6 +#define IEEE_PARAM_WPAX_SELECT 7 + +#define AUTH_ALG_OPEN_SYSTEM 0x1 +#define AUTH_ALG_SHARED_KEY 0x2 +#define AUTH_ALG_LEAP 0x00000004 + +#define IEEE_MLME_STA_DEAUTH 1 +#define IEEE_MLME_STA_DISASSOC 2 + +#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2 +#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3 +#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4 +#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5 +#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6 +#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7 + + +#define IEEE_CRYPT_ALG_NAME_LEN 16 + +#define WPA_CIPHER_NONE BIT(0) +#define WPA_CIPHER_WEP40 BIT(1) +#define WPA_CIPHER_WEP104 BIT(2) +#define WPA_CIPHER_TKIP BIT(3) +#define WPA_CIPHER_CCMP BIT(4) + + + +#define WPA_SELECTOR_LEN 4 +static u8 WPA_OUI_TYPE[] = { 0x00, 0x50, 0xf2, 1 }; +static u16 WPA_VERSION = 1; +static u8 WPA_AUTH_KEY_MGMT_NONE[] = { 0x00, 0x50, 0xf2, 0 }; +static u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x50, 0xf2, 1 }; +static u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x50, 0xf2, 2 }; +static u8 WPA_CIPHER_SUITE_NONE[] = { 0x00, 0x50, 0xf2, 0 }; +static u8 WPA_CIPHER_SUITE_WEP40[] = { 0x00, 0x50, 0xf2, 1 }; +static u8 WPA_CIPHER_SUITE_TKIP[] = { 0x00, 0x50, 0xf2, 2 }; +//static u8 WPA_CIPHER_SUITE_WRAP[] = { 0x00, 0x50, 0xf2, 3 }; +static u8 WPA_CIPHER_SUITE_CCMP[] = { 0x00, 0x50, 0xf2, 4 }; +static u8 WPA_CIPHER_SUITE_WEP104[] = { 0x00, 0x50, 0xf2, 5 }; + + +#define RSN_HEADER_LEN 4 +#define RSN_SELECTOR_LEN 4 +static u16 RSN_VERSION = 1; +static u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x0f, 0xac, 1 }; +static u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x0f, 0xac, 2 }; +static u8 RSN_CIPHER_SUITE_NONE[] = { 0x00, 0x0f, 0xac, 0 }; +static u8 RSN_CIPHER_SUITE_WEP40[] = { 0x00, 0x0f, 0xac, 1 }; +static u8 RSN_CIPHER_SUITE_TKIP[] = { 0x00, 0x0f, 0xac, 2 }; +//static u8 RSN_CIPHER_SUITE_WRAP[] = { 0x00, 0x0f, 0xac, 3 }; +static u8 RSN_CIPHER_SUITE_CCMP[] = { 0x00, 0x0f, 0xac, 4 }; +static u8 RSN_CIPHER_SUITE_WEP104[] = { 0x00, 0x0f, 0xac, 5 }; + + +enum NETWORK_TYPE +{ + WIRELESS_INVALID = 0, + //Sub-Element + WIRELESS_11B = BIT(0), // tx: cck only , rx: cck only, hw: cck + WIRELESS_11G = BIT(1), // tx: ofdm only, rx: ofdm & cck, hw: cck & ofdm + WIRELESS_11A = BIT(2), // tx: ofdm only, rx: ofdm only, hw: ofdm only + WIRELESS_11_24N = BIT(3), // tx: MCS only, rx: MCS & cck, hw: MCS & cck + WIRELESS_11_5N = BIT(4), // tx: MCS only, rx: MCS & ofdm, hw: ofdm only + + //Combination + WIRELESS_11BG = (WIRELESS_11B|WIRELESS_11G), // tx: cck & ofdm, rx: cck & ofdm & MCS, hw: cck & ofdm + WIRELESS_11G_24N = (WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & MCS, rx: ofdm & cck & MCS, hw: cck & ofdm + WIRELESS_11A_5N = (WIRELESS_11A|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only + WIRELESS_11BG_24N = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck + WIRELESS_11ABGN = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), +}; + +#define SUPPORTED_24G_NETTYPE_MSK (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N) +#define SUPPORTED_5G_NETTYPE_MSK (WIRELESS_11A | WIRELESS_11_5N) + +#define IsSupported24G(NetType) ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? _TRUE : _FALSE) +#define IsSupported5G(NetType) ((NetType) & SUPPORTED_5G_NETTYPE_MSK ? _TRUE : _FALSE) + +#define IsEnableHWCCK(NetType) IsSupported24G(NetType) +#define IsEnableHWOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11_24N|SUPPORTED_5G_NETTYPE_MSK) ? _TRUE : _FALSE) + +#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType) +#define IsSupportedRxOFDM(NetType) IsEnableHWOFDM(NetType) +#define IsSupportedRxMCS(NetType) IsEnableHWOFDM(NetType) + +#define IsSupportedTxCCK(NetType) ((NetType) & (WIRELESS_11B) ? _TRUE : _FALSE) +#define IsSupportedTxOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11A) ? _TRUE : _FALSE) +#define IsSupportedTxMCS(NetType) ((NetType) & (WIRELESS_11_24N|WIRELESS_11_5N) ? _TRUE : _FALSE) + + +typedef struct ieee_param { + u32 cmd; + u8 sta_addr[ETH_ALEN]; + union { + struct { + u8 name; + u32 value; + } wpa_param; + struct { + u32 len; + u8 reserved[32]; + u8 data[0]; + } wpa_ie; + struct{ + int command; + int reason_code; + } mlme; + struct { + u8 alg[IEEE_CRYPT_ALG_NAME_LEN]; + u8 set_tx; + u32 err; + u8 idx; + u8 seq[8]; /* sequence counter (set: RX, get: TX) */ + u16 key_len; + u8 key[0]; + } crypt; +#ifdef CONFIG_AP_MODE + struct { + u16 aid; + u16 capability; + int flags; + u8 tx_supp_rates[16]; + struct ieee80211_ht_cap ht_cap; + } add_sta; + struct { + u8 reserved[2];//for set max_num_sta + u8 buf[0]; + } bcn_ie; +#endif + + } u; +}ieee_param; + + +#if WIRELESS_EXT < 17 +#define IW_QUAL_QUAL_INVALID 0x10 +#define IW_QUAL_LEVEL_INVALID 0x20 +#define IW_QUAL_NOISE_INVALID 0x40 +#define IW_QUAL_QUAL_UPDATED 0x1 +#define IW_QUAL_LEVEL_UPDATED 0x2 +#define IW_QUAL_NOISE_UPDATED 0x4 +#endif + +#define IEEE80211_DATA_LEN 2304 +/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section + 6.2.1.1.2. + + The figure in section 7.1.2 suggests a body size of up to 2312 + bytes is allowed, which is a bit confusing, I suspect this + represents the 2304 bytes of real data, plus a possible 8 bytes of + WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ + + +#define IEEE80211_HLEN 30 +#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) + + +/* this is stolen from ipw2200 driver */ +#define IEEE_IBSS_MAC_HASH_SIZE 31 + +struct ieee_ibss_seq { + u8 mac[ETH_ALEN]; + u16 seq_num; + u16 frag_num; + unsigned long packet_time; + _list list; +}; + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_hdr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; +} __attribute__ ((packed)); + + +struct ieee80211_hdr_qos { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; + u16 qc; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addr_qos { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u16 qc; +} __attribute__ ((packed)); + +struct eapol { + u8 snap[6]; + u16 ethertype; + u8 version; + u8 type; + u16 length; +} __attribute__ ((packed)); + +#endif + + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_hdr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; +}; + +struct ieee80211_hdr_3addr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; +}; + + +struct ieee80211_hdr_qos { + struct ieee80211_hdr wlan_hdr; + u16 qc; +}; + +struct ieee80211_hdr_3addr_qos { + struct ieee80211_hdr_3addr wlan_hdr; + u16 qc; +}; + +struct eapol { + u8 snap[6]; + u16 ethertype; + u8 version; + u8 type; + u16 length; +}; +#pragma pack() + +#endif + + + +enum eap_type { + EAP_PACKET = 0, + EAPOL_START, + EAPOL_LOGOFF, + EAPOL_KEY, + EAPOL_ENCAP_ASF_ALERT +}; + +#define IEEE80211_3ADDR_LEN 24 +#define IEEE80211_4ADDR_LEN 30 +#define IEEE80211_FCS_LEN 4 + +#define MIN_FRAG_THRESHOLD 256U +#define MAX_FRAG_THRESHOLD 2346U + +/* Frame control field constants */ +#define IEEE80211_FCTL_VERS 0x0002 +#define IEEE80211_FCTL_FTYPE 0x000c +#define IEEE80211_FCTL_STYPE 0x00f0 +#define IEEE80211_FCTL_TODS 0x0100 +#define IEEE80211_FCTL_FROMDS 0x0200 +#define IEEE80211_FCTL_MOREFRAGS 0x0400 +#define IEEE80211_FCTL_RETRY 0x0800 +#define IEEE80211_FCTL_PM 0x1000 +#define IEEE80211_FCTL_MOREDATA 0x2000 +#define IEEE80211_FCTL_WEP 0x4000 +#define IEEE80211_FCTL_ORDER 0x8000 + +#define IEEE80211_FTYPE_MGMT 0x0000 +#define IEEE80211_FTYPE_CTL 0x0004 +#define IEEE80211_FTYPE_DATA 0x0008 + +/* management */ +#define IEEE80211_STYPE_ASSOC_REQ 0x0000 +#define IEEE80211_STYPE_ASSOC_RESP 0x0010 +#define IEEE80211_STYPE_REASSOC_REQ 0x0020 +#define IEEE80211_STYPE_REASSOC_RESP 0x0030 +#define IEEE80211_STYPE_PROBE_REQ 0x0040 +#define IEEE80211_STYPE_PROBE_RESP 0x0050 +#define IEEE80211_STYPE_BEACON 0x0080 +#define IEEE80211_STYPE_ATIM 0x0090 +#define IEEE80211_STYPE_DISASSOC 0x00A0 +#define IEEE80211_STYPE_AUTH 0x00B0 +#define IEEE80211_STYPE_DEAUTH 0x00C0 + +/* control */ +#define IEEE80211_STYPE_PSPOLL 0x00A0 +#define IEEE80211_STYPE_RTS 0x00B0 +#define IEEE80211_STYPE_CTS 0x00C0 +#define IEEE80211_STYPE_ACK 0x00D0 +#define IEEE80211_STYPE_CFEND 0x00E0 +#define IEEE80211_STYPE_CFENDACK 0x00F0 + +/* data */ +#define IEEE80211_STYPE_DATA 0x0000 +#define IEEE80211_STYPE_DATA_CFACK 0x0010 +#define IEEE80211_STYPE_DATA_CFPOLL 0x0020 +#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030 +#define IEEE80211_STYPE_NULLFUNC 0x0040 +#define IEEE80211_STYPE_CFACK 0x0050 +#define IEEE80211_STYPE_CFPOLL 0x0060 +#define IEEE80211_STYPE_CFACKPOLL 0x0070 +#define IEEE80211_QOS_DATAGRP 0x0080 +#define IEEE80211_QoS_DATAGRP IEEE80211_QOS_DATAGRP + +#define IEEE80211_SCTL_FRAG 0x000F +#define IEEE80211_SCTL_SEQ 0xFFF0 + +/* QoS,QOS */ +#define NORMAL_ACK 0 +#define NO_ACK 1 +#define NON_EXPLICIT_ACK 2 +#define BLOCK_ACK 3 + +#ifndef ETH_P_PAE +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +#endif /* ETH_P_PAE */ + +#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ + +#define ETH_P_ECONET 0x0018 + +#ifndef ETH_P_80211_RAW +#define ETH_P_80211_RAW (ETH_P_ECONET + 1) +#endif + +/* IEEE 802.11 defines */ + +#define P80211_OUI_LEN 3 + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_snap_hdr { + + u8 dsap; /* always 0xAA */ + u8 ssap; /* always 0xAA */ + u8 ctrl; /* always 0x03 */ + u8 oui[P80211_OUI_LEN]; /* organizational universal id */ + +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_snap_hdr { + + u8 dsap; /* always 0xAA */ + u8 ssap; /* always 0xAA */ + u8 ctrl; /* always 0x03 */ + u8 oui[P80211_OUI_LEN]; /* organizational universal id */ + +}; +#pragma pack() + +#endif + + +#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) + +#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) +#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE) + +#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f) + +#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG) +#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE80211_SCTL_SEQ) + +/* Authentication algorithms */ +#define WLAN_AUTH_OPEN 0 +#define WLAN_AUTH_SHARED_KEY 1 + +#define WLAN_AUTH_CHALLENGE_LEN 128 + +#define WLAN_CAPABILITY_BSS (1<<0) +#define WLAN_CAPABILITY_IBSS (1<<1) +#define WLAN_CAPABILITY_CF_POLLABLE (1<<2) +#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) +#define WLAN_CAPABILITY_PRIVACY (1<<4) +#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) +#define WLAN_CAPABILITY_PBCC (1<<6) +#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7) +#define WLAN_CAPABILITY_SHORT_SLOT (1<<10) + +/* Status codes */ +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_CAPS_UNSUPPORTED 10 +#define WLAN_STATUS_REASSOC_NO_ASSOC 11 +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 +#define WLAN_STATUS_CHALLENGE_FAIL 15 +#define WLAN_STATUS_AUTH_TIMEOUT 16 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 +#define WLAN_STATUS_ASSOC_DENIED_RATES 18 +/* 802.11b */ +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 + +/* Reason codes */ +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 + + +/* Information Element IDs */ +#define WLAN_EID_SSID 0 +#define WLAN_EID_SUPP_RATES 1 +#define WLAN_EID_FH_PARAMS 2 +#define WLAN_EID_DS_PARAMS 3 +#define WLAN_EID_CF_PARAMS 4 +#define WLAN_EID_TIM 5 +#define WLAN_EID_IBSS_PARAMS 6 +#define WLAN_EID_CHALLENGE 16 +/* EIDs defined by IEEE 802.11h - START */ +#define WLAN_EID_PWR_CONSTRAINT 32 +#define WLAN_EID_PWR_CAPABILITY 33 +#define WLAN_EID_TPC_REQUEST 34 +#define WLAN_EID_TPC_REPORT 35 +#define WLAN_EID_SUPPORTED_CHANNELS 36 +#define WLAN_EID_CHANNEL_SWITCH 37 +#define WLAN_EID_MEASURE_REQUEST 38 +#define WLAN_EID_MEASURE_REPORT 39 +#define WLAN_EID_QUITE 40 +#define WLAN_EID_IBSS_DFS 41 +/* EIDs defined by IEEE 802.11h - END */ +#define WLAN_EID_ERP_INFO 42 +#define WLAN_EID_HT_CAP 45 +#define WLAN_EID_RSN 48 +#define WLAN_EID_EXT_SUPP_RATES 50 +#define WLAN_EID_MOBILITY_DOMAIN 54 +#define WLAN_EID_FAST_BSS_TRANSITION 55 +#define WLAN_EID_TIMEOUT_INTERVAL 56 +#define WLAN_EID_RIC_DATA 57 +#define WLAN_EID_HT_OPERATION 61 +#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62 +#define WLAN_EID_20_40_BSS_COEXISTENCE 72 +#define WLAN_EID_20_40_BSS_INTOLERANT 73 +#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74 +#define WLAN_EID_MMIE 76 +#define WLAN_EID_VENDOR_SPECIFIC 221 +#define WLAN_EID_GENERIC (WLAN_EID_VENDOR_SPECIFIC) + +#define IEEE80211_MGMT_HDR_LEN 24 +#define IEEE80211_DATA_HDR3_LEN 24 +#define IEEE80211_DATA_HDR4_LEN 30 + + +#define IEEE80211_STATMASK_SIGNAL (1<<0) +#define IEEE80211_STATMASK_RSSI (1<<1) +#define IEEE80211_STATMASK_NOISE (1<<2) +#define IEEE80211_STATMASK_RATE (1<<3) +#define IEEE80211_STATMASK_WEMASK 0x7 + + +#define IEEE80211_CCK_MODULATION (1<<0) +#define IEEE80211_OFDM_MODULATION (1<<1) + +#define IEEE80211_24GHZ_BAND (1<<0) +#define IEEE80211_52GHZ_BAND (1<<1) + +#define IEEE80211_CCK_RATE_LEN 4 +#define IEEE80211_NUM_OFDM_RATESLEN 8 + + +#define IEEE80211_CCK_RATE_1MB 0x02 +#define IEEE80211_CCK_RATE_2MB 0x04 +#define IEEE80211_CCK_RATE_5MB 0x0B +#define IEEE80211_CCK_RATE_11MB 0x16 +#define IEEE80211_OFDM_RATE_LEN 8 +#define IEEE80211_OFDM_RATE_6MB 0x0C +#define IEEE80211_OFDM_RATE_9MB 0x12 +#define IEEE80211_OFDM_RATE_12MB 0x18 +#define IEEE80211_OFDM_RATE_18MB 0x24 +#define IEEE80211_OFDM_RATE_24MB 0x30 +#define IEEE80211_OFDM_RATE_36MB 0x48 +#define IEEE80211_OFDM_RATE_48MB 0x60 +#define IEEE80211_OFDM_RATE_54MB 0x6C +#define IEEE80211_BASIC_RATE_MASK 0x80 + +#define IEEE80211_CCK_RATE_1MB_MASK (1<<0) +#define IEEE80211_CCK_RATE_2MB_MASK (1<<1) +#define IEEE80211_CCK_RATE_5MB_MASK (1<<2) +#define IEEE80211_CCK_RATE_11MB_MASK (1<<3) +#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) +#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) +#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) +#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) +#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) +#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) +#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) +#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) + +#define IEEE80211_CCK_RATES_MASK 0x0000000F +#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ + IEEE80211_CCK_RATE_2MB_MASK) +#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ + IEEE80211_CCK_RATE_5MB_MASK | \ + IEEE80211_CCK_RATE_11MB_MASK) + +#define IEEE80211_OFDM_RATES_MASK 0x00000FF0 +#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ + IEEE80211_OFDM_RATE_12MB_MASK | \ + IEEE80211_OFDM_RATE_24MB_MASK) +#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ + IEEE80211_OFDM_RATE_9MB_MASK | \ + IEEE80211_OFDM_RATE_18MB_MASK | \ + IEEE80211_OFDM_RATE_36MB_MASK | \ + IEEE80211_OFDM_RATE_48MB_MASK | \ + IEEE80211_OFDM_RATE_54MB_MASK) +#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ + IEEE80211_CCK_DEFAULT_RATES_MASK) + +#define IEEE80211_NUM_OFDM_RATES 8 +#define IEEE80211_NUM_CCK_RATES 4 +#define IEEE80211_OFDM_SHIFT_MASK_A 4 + + + + +/* NOTE: This data is for statistical purposes; not all hardware provides this + * information for frames received. Not setting these will not cause + * any adverse affects. */ +struct ieee80211_rx_stats { + //u32 mac_time[2]; + s8 rssi; + u8 signal; + u8 noise; + u8 received_channel; + u16 rate; /* in 100 kbps */ + //u8 control; + u8 mask; + u8 freq; + u16 len; +}; + +/* IEEE 802.11 requires that STA supports concurrent reception of at least + * three fragmented frames. This define can be increased to support more + * concurrent frames, but it should be noted that each entry can consume about + * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ +#define IEEE80211_FRAG_CACHE_LEN 4 + +struct ieee80211_frag_entry { + u32 first_frag_time; + uint seq; + uint last_frag; + uint qos; //jackson + uint tid; //jackson + struct sk_buff *skb; + u8 src_addr[ETH_ALEN]; + u8 dst_addr[ETH_ALEN]; +}; + +struct ieee80211_stats { + uint tx_unicast_frames; + uint tx_multicast_frames; + uint tx_fragments; + uint tx_unicast_octets; + uint tx_multicast_octets; + uint tx_deferred_transmissions; + uint tx_single_retry_frames; + uint tx_multiple_retry_frames; + uint tx_retry_limit_exceeded; + uint tx_discards; + uint rx_unicast_frames; + uint rx_multicast_frames; + uint rx_fragments; + uint rx_unicast_octets; + uint rx_multicast_octets; + uint rx_fcs_errors; + uint rx_discards_no_buffer; + uint tx_discards_wrong_sa; + uint rx_discards_undecryptable; + uint rx_message_in_msg_fragments; + uint rx_message_in_bad_msg_fragments; +}; + +struct ieee80211_softmac_stats{ + uint rx_ass_ok; + uint rx_ass_err; + uint rx_probe_rq; + uint tx_probe_rs; + uint tx_beacons; + uint rx_auth_rq; + uint rx_auth_rs_ok; + uint rx_auth_rs_err; + uint tx_auth_rq; + uint no_auth_rs; + uint no_ass_rs; + uint tx_ass_rq; + uint rx_ass_rq; + uint tx_probe_rq; + uint reassoc; + uint swtxstop; + uint swtxawake; +}; + +#define SEC_KEY_1 (1<<0) +#define SEC_KEY_2 (1<<1) +#define SEC_KEY_3 (1<<2) +#define SEC_KEY_4 (1<<3) +#define SEC_ACTIVE_KEY (1<<4) +#define SEC_AUTH_MODE (1<<5) +#define SEC_UNICAST_GROUP (1<<6) +#define SEC_LEVEL (1<<7) +#define SEC_ENABLED (1<<8) + +#define SEC_LEVEL_0 0 /* None */ +#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ +#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ +#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ +#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ + +#define WEP_KEYS 4 +#define WEP_KEY_LEN 13 + + + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_security { + u16 active_key:2, + enabled:1, + auth_mode:2, + auth_algo:4, + unicast_uses_group:1; + u8 key_sizes[WEP_KEYS]; + u8 keys[WEP_KEYS][WEP_KEY_LEN]; + u8 level; + u16 flags; +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_security { + u16 active_key:2, + enabled:1, + auth_mode:2, + auth_algo:4, + unicast_uses_group:1; + u8 key_sizes[WEP_KEYS]; + u8 keys[WEP_KEYS][WEP_KEY_LEN]; + u8 level; + u16 flags; +} ; +#pragma pack() + +#endif + +/* + + 802.11 data frame from AP + + ,-------------------------------------------------------------------. +Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | + |------|------|---------|---------|---------|------|---------|------| +Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | + | | tion | (BSSID) | | | ence | data | | + `-------------------------------------------------------------------' + +Total: 28-2340 bytes + +*/ + +struct ieee80211_header_data { + u16 frame_ctl; + u16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + u16 seq_ctrl; +}; + +#define BEACON_PROBE_SSID_ID_POSITION 12 + +/* Management Frame Information Element Types */ +#define MFIE_TYPE_SSID 0 +#define MFIE_TYPE_RATES 1 +#define MFIE_TYPE_FH_SET 2 +#define MFIE_TYPE_DS_SET 3 +#define MFIE_TYPE_CF_SET 4 +#define MFIE_TYPE_TIM 5 +#define MFIE_TYPE_IBSS_SET 6 +#define MFIE_TYPE_CHALLENGE 16 +#define MFIE_TYPE_ERP 42 +#define MFIE_TYPE_RSN 48 +#define MFIE_TYPE_RATES_EX 50 +#define MFIE_TYPE_GENERIC 221 + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_info_element_hdr { + u8 id; + u8 len; +} __attribute__ ((packed)); + +struct ieee80211_info_element { + u8 id; + u8 len; + u8 data[0]; +} __attribute__ ((packed)); +#endif + +#ifdef CONFIG_TDLS +/* TDLS */ +#define TDLS_MIC_LEN 16 +#define WPA_NONCE_LEN 32 +#define TDLS_TIMEOUT_LEN 4 + +struct wpa_tdls_ftie { + u8 ie_type; /* FTIE */ + u8 ie_len; + u8 mic_ctrl[2]; + u8 mic[TDLS_MIC_LEN]; + u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ + u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ + /* followed by optional elements */ +} ; + +struct wpa_tdls_timeoutie { + u8 ie_type; /* Timeout IE */ + u8 ie_len; + u8 interval_type; + u8 value[TDLS_TIMEOUT_LEN]; +} ; + +struct wpa_tdls_lnkid { + u8 ie_type; /* Link Identifier IE */ + u8 ie_len; + u8 bssid[ETH_ALEN]; + u8 init_sta[ETH_ALEN]; + u8 resp_sta[ETH_ALEN]; +} ; +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_info_element_hdr { + u8 id; + u8 len; +} ; + +struct ieee80211_info_element { + u8 id; + u8 len; + u8 data[0]; +} ; +#pragma pack() + +#endif + + +/* + * These are the data types that can make up management packets + * + u16 auth_algorithm; + u16 auth_sequence; + u16 beacon_interval; + u16 capability; + u8 current_ap[ETH_ALEN]; + u16 listen_interval; + struct { + u16 association_id:14, reserved:2; + } __attribute__ ((packed)); + u32 time_stamp[2]; + u16 reason; + u16 status; +*/ + +#define IEEE80211_DEFAULT_TX_ESSID "Penguin" +#define IEEE80211_DEFAULT_BASIC_RATE 10 + + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + + +struct ieee80211_authentication { + struct ieee80211_header_data header; + u16 algorithm; + u16 transaction; + u16 status; + //struct ieee80211_info_element_hdr info_element; +} __attribute__ ((packed)); + + +struct ieee80211_probe_response { + struct ieee80211_header_data header; + u32 time_stamp[2]; + u16 beacon_interval; + u16 capability; + struct ieee80211_info_element info_element; +} __attribute__ ((packed)); + +struct ieee80211_probe_request { + struct ieee80211_header_data header; + /*struct ieee80211_info_element info_element;*/ +} __attribute__ ((packed)); + +struct ieee80211_assoc_request_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 listen_interval; + //u8 current_ap[ETH_ALEN]; + struct ieee80211_info_element_hdr info_element; +} __attribute__ ((packed)); + +struct ieee80211_assoc_response_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 status; + u16 aid; +// struct ieee80211_info_element info_element; /* supported rates */ +} __attribute__ ((packed)); +#endif + + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_authentication { + struct ieee80211_header_data header; + u16 algorithm; + u16 transaction; + u16 status; + //struct ieee80211_info_element_hdr info_element; +} ; + + +struct ieee80211_probe_response { + struct ieee80211_header_data header; + u32 time_stamp[2]; + u16 beacon_interval; + u16 capability; + struct ieee80211_info_element info_element; +} ; + +struct ieee80211_probe_request { + struct ieee80211_header_data header; + /*struct ieee80211_info_element info_element;*/ +} ; + +struct ieee80211_assoc_request_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 listen_interval; + //u8 current_ap[ETH_ALEN]; + struct ieee80211_info_element_hdr info_element; +} ; + +struct ieee80211_assoc_response_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 status; + u16 aid; +// struct ieee80211_info_element info_element; /* supported rates */ +}; + +#pragma pack() + +#endif + + + + +struct ieee80211_txb { + u8 nr_frags; + u8 encrypted; + u16 reserved; + u16 frag_size; + u16 payload_size; + struct sk_buff *fragments[0]; +}; + + +/* SWEEP TABLE ENTRIES NUMBER*/ +#define MAX_SWEEP_TAB_ENTRIES 42 +#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 +/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs + * only use 8, and then use extended rates for the remaining supported + * rates. Other APs, however, stick all of their supported rates on the + * main rates information element... */ +#define MAX_RATES_LENGTH ((u8)12) +#define MAX_RATES_EX_LENGTH ((u8)16) +#define MAX_NETWORK_COUNT 128 +#define MAX_CHANNEL_NUMBER 161 +#define IEEE80211_SOFTMAC_SCAN_TIME 400 +//(HZ / 2) +#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) + +#define CRC_LENGTH 4U + +#define MAX_WPA_IE_LEN (128) +#define MAX_WPS_IE_LEN (512) +#define MAX_P2P_IE_LEN (256) + +#define NETWORK_EMPTY_ESSID (1<<0) +#define NETWORK_HAS_OFDM (1<<1) +#define NETWORK_HAS_CCK (1<<2) + +#define IEEE80211_DTIM_MBCAST 4 +#define IEEE80211_DTIM_UCAST 2 +#define IEEE80211_DTIM_VALID 1 +#define IEEE80211_DTIM_INVALID 0 + +#define IEEE80211_PS_DISABLED 0 +#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST +#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST +#define IW_ESSID_MAX_SIZE 32 +#if 0 +struct ieee80211_network { + /* These entries are used to identify a unique network */ + u8 bssid[ETH_ALEN]; + u8 channel; + /* Ensure null-terminated for any debug msgs */ + u8 ssid[IW_ESSID_MAX_SIZE + 1]; + u8 ssid_len; + u8 rssi; //relative signal strength + u8 sq; //signal quality + + /* These are network statistics */ + //struct ieee80211_rx_stats stats; + u16 capability; + u16 aid; + u8 rates[MAX_RATES_LENGTH]; + u8 rates_len; + u8 rates_ex[MAX_RATES_EX_LENGTH]; + u8 rates_ex_len; + + u8 edca_parmsets[18]; + + u8 mode; + u8 flags; + u8 time_stamp[8]; + u16 beacon_interval; + u16 listen_interval; + u16 atim_window; + u8 wpa_ie[MAX_WPA_IE_LEN]; + size_t wpa_ie_len; + u8 rsn_ie[MAX_WPA_IE_LEN]; + size_t rsn_ie_len; + u8 country[6]; + u8 dtim_period; + u8 dtim_data; + u8 power_constraint; + u8 qosinfo; + u8 qbssload[5]; + u8 network_type; + int join_res; + unsigned long last_scanned; +}; +#endif +/* +join_res: +-1: authentication fail +-2: association fail +> 0: TID +*/ + +enum ieee80211_state { + + /* the card is not linked at all */ + IEEE80211_NOLINK = 0, + + /* IEEE80211_ASSOCIATING* are for BSS client mode + * the driver shall not perform RX filtering unless + * the state is LINKED. + * The driver shall just check for the state LINKED and + * defaults to NOLINK for ALL the other states (including + * LINKED_SCANNING) + */ + + /* the association procedure will start (wq scheduling)*/ + IEEE80211_ASSOCIATING, + IEEE80211_ASSOCIATING_RETRY, + + /* the association procedure is sending AUTH request*/ + IEEE80211_ASSOCIATING_AUTHENTICATING, + + /* the association procedure has successfully authentcated + * and is sending association request + */ + IEEE80211_ASSOCIATING_AUTHENTICATED, + + /* the link is ok. the card associated to a BSS or linked + * to a ibss cell or acting as an AP and creating the bss + */ + IEEE80211_LINKED, + + /* same as LINKED, but the driver shall apply RX filter + * rules as we are in NO_LINK mode. As the card is still + * logically linked, but it is doing a syncro site survey + * then it will be back to LINKED state. + */ + IEEE80211_LINKED_SCANNING, + +}; + +#define DEFAULT_MAX_SCAN_AGE (15 * HZ) +#define DEFAULT_FTS 2346 +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] + +extern __inline int is_multicast_mac_addr(const u8 *addr) +{ + return ((addr[0] != 0xff) && (0x01 & addr[0])); +} + +extern __inline int is_broadcast_mac_addr(const u8 *addr) +{ + return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ + (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); +} + +#define CFG_IEEE80211_RESERVE_FCS (1<<0) +#define CFG_IEEE80211_COMPUTE_FCS (1<<1) + +typedef struct tx_pending_t{ + int frag; + struct ieee80211_txb *txb; +}tx_pending_t; + + + +#define MAXTID 16 + +#define IEEE_A (1<<0) +#define IEEE_B (1<<1) +#define IEEE_G (1<<2) +#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) + +extern __inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +{ + /* Single white space is for Linksys APs */ + if (essid_len == 1 && essid[0] == ' ') + return 1; + + /* Otherwise, if the entire essid is 0, we assume it is hidden */ + while (essid_len) { + essid_len--; + if (essid[essid_len] != '\0') + return 0; + } + + return 1; +} + +extern __inline int ieee80211_get_hdrlen(u16 fc) +{ + int hdrlen = 24; + + switch (WLAN_FC_GET_TYPE(fc)) { + case IEEE80211_FTYPE_DATA: + if (fc & IEEE80211_QOS_DATAGRP) + hdrlen += 2; + if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) + hdrlen += 6; /* Addr4 */ + break; + case IEEE80211_FTYPE_CTL: + switch (WLAN_FC_GET_STYPE(fc)) { + case IEEE80211_STYPE_CTS: + case IEEE80211_STYPE_ACK: + hdrlen = 10; + break; + default: + hdrlen = 16; + break; + } + break; + } + + return hdrlen; +} + +#if 0 +/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */ +#define WLAN_ACTION_SPECTRUM_MGMT 0 +#define WLAN_ACTION_QOS 1 +#define WLAN_ACTION_DLS 2 +#define WLAN_ACTION_BLOCK_ACK 3 +#define WLAN_ACTION_RADIO_MEASUREMENT 5 +#define WLAN_ACTION_FT 6 +#define WLAN_ACTION_SA_QUERY 8 +#define WLAN_ACTION_WMM 17 +#endif + + +/* Action category code */ +enum ieee80211_category { + WLAN_CATEGORY_SPECTRUM_MGMT = 0, + WLAN_CATEGORY_QOS = 1, + WLAN_CATEGORY_DLS = 2, + WLAN_CATEGORY_BACK = 3, + WLAN_CATEGORY_PUBLIC = 4, //IEEE 802.11 public action frames + WLAN_CATEGORY_RADIO_MEASUREMENT = 5, + WLAN_CATEGORY_FT = 6, + WLAN_CATEGORY_HT = 7, + WLAN_CATEGORY_SA_QUERY = 8, + WLAN_CATEGORY_TDLS = 12, + WLAN_CATEGORY_WMM = 17, + WLAN_CATEGORY_P2P = 0x7f,//P2P action frames +}; + +/* SPECTRUM_MGMT action code */ +enum ieee80211_spectrum_mgmt_actioncode { + WLAN_ACTION_SPCT_MSR_REQ = 0, + WLAN_ACTION_SPCT_MSR_RPRT = 1, + WLAN_ACTION_SPCT_TPC_REQ = 2, + WLAN_ACTION_SPCT_TPC_RPRT = 3, + WLAN_ACTION_SPCT_CHL_SWITCH = 4, + WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, +}; + +enum _PUBLIC_ACTION{ + ACT_PUBLIC_BSSCOEXIST = 0, // 20/40 BSS Coexistence + ACT_PUBLIC_MP = 7, // Measurement Pilot + ACT_PUBLIC_P2P = 9, // WIFI_DIRECT +}; + +#ifdef CONFIG_TDLS +enum TDLS_ACTION_FIELD{ + TDLS_SETUP_REQUEST = 0, + TDLS_SETUP_RESPONSE = 1, + TDLS_SETUP_CONFIRM = 2, + TDLS_TEARDOWN = 3, + TDLS_PEER_TRAFFIC_INDICATION = 4, + TDLS_CHANNEL_SWITCH_REQUEST = 5, + TDLS_CHANNEL_SWITCH_RESPONSE = 6, + TDLS_PEER_PSM_REQUEST = 7, + TDLS_PEER_PSM_RESPONSE = 8, + TDLS_PEER_TRAFFIC_RESPONSE = 9, + TDLS_DISCOVERY_REQUEST = 10, + TDLS_DISCOVERY_RESPONSE = 14, //it's used in public action frame +}; +#endif + +/* BACK action code */ +enum ieee80211_back_actioncode { + WLAN_ACTION_ADDBA_REQ = 0, + WLAN_ACTION_ADDBA_RESP = 1, + WLAN_ACTION_DELBA = 2, +}; + +/* HT features action code */ +enum ieee80211_ht_actioncode { + WLAN_ACTION_NOTIFY_CH_WIDTH = 0, + WLAN_ACTION_SM_PS = 1, + WLAN_ACTION_PSPM = 2, + WLAN_ACTION_PCO_PHASE = 3, + WLAN_ACTION_MIMO_CSI_MX = 4, + WLAN_ACTION_MIMO_NONCP_BF = 5, + WLAN_ACTION_MIMP_CP_BF = 6, + WLAN_ACTION_ASEL_INDICATES_FB = 7, + WLAN_ACTION_HI_INFO_EXCHG = 8, +}; + +/* BACK (block-ack) parties */ +enum ieee80211_back_parties { + WLAN_BACK_RECIPIENT = 0, + WLAN_BACK_INITIATOR = 1, + WLAN_BACK_TIMER = 2, +}; + + +#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs) + * 00:50:F2 */ + +#define WME_OUI_TYPE 2 +#define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WME_VERSION 1 + +#define WME_ACTION_CODE_SETUP_REQUEST 0 +#define WME_ACTION_CODE_SETUP_RESPONSE 1 +#define WME_ACTION_CODE_TEARDOWN 2 + +#define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0 +#define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1 +#define WME_SETUP_RESPONSE_STATUS_REFUSED 3 + +#define WME_TSPEC_DIRECTION_UPLINK 0 +#define WME_TSPEC_DIRECTION_DOWNLINK 1 +#define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3 + + +#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */ + +#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */ + +/* Parsed Information Elements */ +struct ieee802_11_elems { + u8 *ssid; + u8 ssid_len; + u8 *supp_rates; + u8 supp_rates_len; + u8 *fh_params; + u8 fh_params_len; + u8 *ds_params; + u8 ds_params_len; + u8 *cf_params; + u8 cf_params_len; + u8 *tim; + u8 tim_len; + u8 *ibss_params; + u8 ibss_params_len; + u8 *challenge; + u8 challenge_len; + u8 *erp_info; + u8 erp_info_len; + u8 *ext_supp_rates; + u8 ext_supp_rates_len; + u8 *wpa_ie; + u8 wpa_ie_len; + u8 *rsn_ie; + u8 rsn_ie_len; + u8 *wme; + u8 wme_len; + u8 *wme_tspec; + u8 wme_tspec_len; + u8 *wps_ie; + u8 wps_ie_len; + u8 *power_cap; + u8 power_cap_len; + u8 *supp_channels; + u8 supp_channels_len; + u8 *mdie; + u8 mdie_len; + u8 *ftie; + u8 ftie_len; + u8 *timeout_int; + u8 timeout_int_len; + u8 *ht_capabilities; + u8 ht_capabilities_len; + u8 *ht_operation; + u8 ht_operation_len; + u8 *vendor_ht_cap; + u8 vendor_ht_cap_len; +}; + +typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes; + +ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, + struct ieee802_11_elems *elems, + int show_errors); + +u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, unsigned int *frlen); +u8 *rtw_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen); +u8 *rtw_get_ie(u8*pbuf, sint index, sint *len, sint limit); +void rtw_set_supported_rate(u8* SupportedRates, uint mode) ; + +unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit); +unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit); +int rtw_get_wpa_cipher_suite(u8 *s); +int rtw_get_wpa2_cipher_suite(u8 *s); +int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher); +int rtw_parse_wpa2_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher); + +int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len); +u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); +u8 is_wps_ie(u8 *ie_ptr, uint *wps_ielen); + +int rtw_get_p2p_ie(u8 *in_ie, uint in_len, u8 *p2p_ie, uint *p2p_ielen); +int rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen); +u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr); +int rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *attr_content, uint *attr_contentlen); +int rtw_get_wps_ie_p2p(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); + +uint rtw_get_rateset_len(u8 *rateset); + +struct registry_priv; +int rtw_generate_ie(struct registry_priv *pregistrypriv); + + +int rtw_get_bit_value_from_ieee_value(u8 val); + +uint rtw_is_cckrates_included(u8 *rate); + +uint rtw_is_cckratesonly_included(u8 *rate); + +int rtw_check_network_type(unsigned char *rate, int ratelen, int channel); + +void rtw_macaddr_cfg(u8 *mac_addr); +#endif /* IEEE80211_H */ + diff --git a/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h b/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h new file mode 100755 index 000000000000..0a966fa5d03a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h @@ -0,0 +1,477 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __IEEE80211_EXT_H +#define __IEEE80211_EXT_H + +#include +#include +#include + +#define WMM_OUI_TYPE 2 +#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WMM_VERSION 1 + +#define WPA_PROTO_WPA BIT(0) +#define WPA_PROTO_RSN BIT(1) + +#define WPA_KEY_MGMT_IEEE8021X BIT(0) +#define WPA_KEY_MGMT_PSK BIT(1) +#define WPA_KEY_MGMT_NONE BIT(2) +#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) +#define WPA_KEY_MGMT_WPA_NONE BIT(4) + + +#define WPA_CAPABILITY_PREAUTH BIT(0) +#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) +#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) + + +#define PMKID_LEN 16 + + +#ifdef PLATFORM_LINUX +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct wme_ac_parameter { +#if defined(CONFIG_LITTLE_ENDIAN) + /* byte 1 */ + u8 aifsn:4, + acm:1, + aci:2, + reserved:1; + + /* byte 2 */ + u8 eCWmin:4, + eCWmax:4; +#elif defined(CONFIG_BIG_ENDIAN) + /* byte 1 */ + u8 reserved:1, + aci:2, + acm:1, + aifsn:4; + + /* byte 2 */ + u8 eCWmax:4, + eCWmin:4; +#else +#error "Please fix " +#endif + + /* bytes 3 & 4 */ + u16 txopLimit; +} __attribute__ ((packed)); + +struct wme_parameter_element { + /* required fields for WME version 1 */ + u8 oui[3]; + u8 oui_type; + u8 oui_subtype; + u8 version; + u8 acInfo; + u8 reserved; + struct wme_ac_parameter ac[4]; + +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}; + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}; + +#pragma pack() + +#endif + +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) +//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) + + + +/* Action category code */ +enum ieee80211_category { + WLAN_CATEGORY_SPECTRUM_MGMT = 0, + WLAN_CATEGORY_QOS = 1, + WLAN_CATEGORY_DLS = 2, + WLAN_CATEGORY_BACK = 3, + WLAN_CATEGORY_HT = 7, + WLAN_CATEGORY_WMM = 17, +}; + +/* SPECTRUM_MGMT action code */ +enum ieee80211_spectrum_mgmt_actioncode { + WLAN_ACTION_SPCT_MSR_REQ = 0, + WLAN_ACTION_SPCT_MSR_RPRT = 1, + WLAN_ACTION_SPCT_TPC_REQ = 2, + WLAN_ACTION_SPCT_TPC_RPRT = 3, + WLAN_ACTION_SPCT_CHL_SWITCH = 4, + WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, +}; + +/* BACK action code */ +enum ieee80211_back_actioncode { + WLAN_ACTION_ADDBA_REQ = 0, + WLAN_ACTION_ADDBA_RESP = 1, + WLAN_ACTION_DELBA = 2, +}; + +/* HT features action code */ +enum ieee80211_ht_actioncode { + WLAN_ACTION_NOTIFY_CH_WIDTH = 0, + WLAN_ACTION_SM_PS = 1, + WLAN_ACTION_PSPM = 2, + WLAN_ACTION_PCO_PHASE = 3, + WLAN_ACTION_MIMO_CSI_MX = 4, + WLAN_ACTION_MIMO_NONCP_BF = 5, + WLAN_ACTION_MIMP_CP_BF = 6, + WLAN_ACTION_ASEL_INDICATES_FB = 7, + WLAN_ACTION_HI_INFO_EXCHG = 8, +}; + +/* BACK (block-ack) parties */ +enum ieee80211_back_parties { + WLAN_BACK_RECIPIENT = 0, + WLAN_BACK_INITIATOR = 1, + WLAN_BACK_TIMER = 2, +}; + +#ifdef PLATFORM_LINUX + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } __attribute__ ((packed)) auth; + struct { + u16 reason_code; + } __attribute__ ((packed)) deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) reassoc_req; + struct { + u16 reason_code; + } __attribute__ ((packed)) disassoc; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } __attribute__ ((packed)) beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) probe_req; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } __attribute__ ((packed)) probe_resp; + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } __attribute__ ((packed)) wme_action; +#if 0 + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } __attribute__ ((packed)) chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } __attribute__ ((packed)) measurement; +#endif + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } __attribute__ ((packed)) addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } __attribute__ ((packed)) addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } __attribute__ ((packed)) delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } __attribute__ ((packed)) plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } __attribute__ ((packed)) mesh_action; + } __attribute__ ((packed)) u; + } __attribute__ ((packed)) action; + } __attribute__ ((packed)) u; +}__attribute__ ((packed)); + +#endif + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } auth; + struct { + u16 reason_code; + } deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } reassoc_req; + struct { + u16 reason_code; + } disassoc; +#if 0 + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } probe_req; + + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } probe_resp; +#endif + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } wme_action; +/* + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } measurement; +*/ + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } mesh_action; + } u; + } action; + } u; +} ; + +#pragma pack() + +#endif + +/* mgmt header + 1 byte category code */ +#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) + + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/if_ether.h b/drivers/net/wireless/rtl8192c/include/if_ether.h new file mode 100755 index 000000000000..045c06775823 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/if_ether.h @@ -0,0 +1,112 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Global definitions for the Ethernet IEEE 802.3 interface. + * + * Version: @(#)if_ether.h 1.0.1a 02/08/94 + * + * Author: Fred N. van Kempen, + * Donald Becker, + * Alan Cox, + * Steve Whitehouse, + * + * 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. + */ + +#ifndef _LINUX_IF_ETHER_H +#define _LINUX_IF_ETHER_H + +/* + * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble + * and FCS/CRC (frame check sequence). + */ + +#define ETH_ALEN 6 /* Octets in one ethernet addr */ +#define ETH_HLEN 14 /* Total octets in header. */ +#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */ +#define ETH_DATA_LEN 1500 /* Max. octets in payload */ +#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */ + +/* + * These are the defined Ethernet Protocol ID's. + */ + +#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */ +#define ETH_P_PUP 0x0200 /* Xerox PUP packet */ +#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */ +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_P_X25 0x0805 /* CCITT X.25 */ +#define ETH_P_ARP 0x0806 /* Address Resolution packet */ +#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */ +#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */ +#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */ +#define ETH_P_DEC 0x6000 /* DEC Assigned proto */ +#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */ +#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */ +#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */ +#define ETH_P_LAT 0x6004 /* DEC LAT */ +#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */ +#define ETH_P_CUST 0x6006 /* DEC Customer use */ +#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */ +#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */ +#define ETH_P_ATALK 0x809B /* Appletalk DDP */ +#define ETH_P_AARP 0x80F3 /* Appletalk AARP */ +#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */ +#define ETH_P_IPX 0x8137 /* IPX over DIX */ +#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */ +#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */ +#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */ +#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */ +#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport + * over Ethernet + */ + +/* + * Non DIX types. Won't clash for 1500 types. + */ + +#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */ +#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */ +#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */ +#define ETH_P_802_2 0x0004 /* 802.2 frames */ +#define ETH_P_SNAP 0x0005 /* Internal only */ +#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */ +#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ +#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ +#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ +#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ +#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ +#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ +#define ETH_P_CONTROL 0x0016 /* Card specific control frames */ +#define ETH_P_IRDA 0x0017 /* Linux-IrDA */ +#define ETH_P_ECONET 0x0018 /* Acorn Econet */ + +/* + * This is an Ethernet frame header. + */ + +struct ethhdr +{ + unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ + unsigned char h_source[ETH_ALEN]; /* source ether addr */ + unsigned short h_proto; /* packet type ID field */ +}; + +struct _vlan { + unsigned short h_vlan_TCI; // Encapsulates priority and VLAN ID + unsigned short h_vlan_encapsulated_proto; +}; + + + +#define get_vlan_id(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI)) & 0xfff) +#define get_vlan_priority(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI))>>13) +#define get_vlan_encap_proto(pvlan) (ntohs((unsigned short )pvlan->h_vlan_encapsulated_proto)) + + +#endif /* _LINUX_IF_ETHER_H */ diff --git a/drivers/net/wireless/rtl8192c/include/ip.h b/drivers/net/wireless/rtl8192c/include/ip.h new file mode 100755 index 000000000000..5846347a07d2 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ip.h @@ -0,0 +1,138 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Definitions for the IP protocol. + * + * Version: @(#)ip.h 1.0.2 04/28/93 + * + * Authors: Fred N. van Kempen, + * + * 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. + */ +#ifndef _LINUX_IP_H +#define _LINUX_IP_H +#include + +/* SOL_IP socket options */ + +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_MINCOST 0x02 + +#define IPTOS_PREC_MASK 0xE0 +#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + + +/* IP options */ +#define IPOPT_COPY 0x80 +#define IPOPT_CLASS_MASK 0x60 +#define IPOPT_NUMBER_MASK 0x1f + +#define IPOPT_COPIED(o) ((o)&IPOPT_COPY) +#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) +#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_MEASUREMENT 0x40 +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_END (0 |IPOPT_CONTROL) +#define IPOPT_NOOP (1 |IPOPT_CONTROL) +#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) +#define IPOPT_RR (7 |IPOPT_CONTROL) +#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) + +#define IPVERSION 4 +#define MAXTTL 255 +#define IPDEFTTL 64 + +/* struct timestamp, struct route and MAX_ROUTES are removed. + + REASONS: it is clear that nobody used them because: + - MAX_ROUTES value was wrong. + - "struct route" was wrong. + - "struct timestamp" had fatally misaligned bitfields and was completely unusable. + */ + +#define IPOPT_OPTVAL 0 +#define IPOPT_OLEN 1 +#define IPOPT_OFFSET 2 +#define IPOPT_MINOFF 4 +#define MAX_IPOPTLEN 40 +#define IPOPT_NOP IPOPT_NOOP +#define IPOPT_EOL IPOPT_END +#define IPOPT_TS IPOPT_TIMESTAMP + +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +#ifdef PLATFORM_LINUX + +struct ip_options { + __u32 faddr; /* Saved first hop address */ + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_setbyuser:1, /* Set by setsockopt? */ + is_data:1, /* Options in __data, rather than skb */ + is_strictroute:1, /* Strict source route */ + srr_is_hit:1, /* Packet destination addr was our one */ + is_changed:1, /* IP checksum more not valid */ + rr_needaddr:1, /* Need to record addr of outgoing dev */ + ts_needtime:1, /* Need to record timestamp */ + ts_needaddr:1; /* Need to record addr of outgoing dev */ + unsigned char router_alert; + unsigned char __pad1; + unsigned char __pad2; + unsigned char __data[0]; +}; + +#define optlength(opt) (sizeof(struct ip_options) + opt->optlen) +#endif + +struct iphdr { +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u8 ihl:4, + version:4; +#elif defined (__BIG_ENDIAN_BITFIELD) + __u8 version:4, + ihl:4; +#else +#error "Please fix " +#endif + __u8 tos; + __u16 tot_len; + __u16 id; + __u16 frag_off; + __u8 ttl; + __u8 protocol; + __u16 check; + __u32 saddr; + __u32 daddr; + /*The options start here. */ +}; + +#endif /* _LINUX_IP_H */ diff --git a/drivers/net/wireless/rtl8192c/include/mlme_osdep.h b/drivers/net/wireless/rtl8192c/include/mlme_osdep.h new file mode 100755 index 000000000000..28912f0e7ed2 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/mlme_osdep.h @@ -0,0 +1,43 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __MLME_OSDEP_H_ +#define __MLME_OSDEP_H_ + +#include +#include +#include + +#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) +extern int time_after(u32 now, u32 old); +#endif + +extern void rtw_init_mlme_timer(_adapter *padapter); +extern void rtw_os_indicate_disconnect( _adapter *adapter ); +extern void rtw_os_indicate_connect( _adapter *adapter ); +extern void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie); + +#ifdef CONFIG_AP_MODE +void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); +void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); +#endif +void rtw_reset_securitypriv( _adapter *adapter ); + +#endif //_MLME_OSDEP_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h b/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h new file mode 100755 index 000000000000..5f8673811fb5 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h @@ -0,0 +1,353 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __CUSTOM_OID_H +#define __CUSTOM_OID_H + +// by Owen +// 0xFF818000 - 0xFF81802F RTL8180 Mass Production Kit +// 0xFF818500 - 0xFF81850F RTL8185 Setup Utility +// 0xFF818580 - 0xFF81858F RTL8185 Phy Status Utility + +// + +// by Owen for Production Kit +// For Production Kit with Agilent Equipments +// in order to make our custom oids hopefully somewhat unique +// we will use 0xFF (indicating implementation specific OID) +// 81(first byte of non zero Realtek unique identifier) +// 80 (second byte of non zero Realtek unique identifier) +// XX (the custom OID number - providing 255 possible custom oids) + +#define OID_RT_PRO_RESET_DUT 0xFF818000 +#define OID_RT_PRO_SET_DATA_RATE 0xFF818001 +#define OID_RT_PRO_START_TEST 0xFF818002 +#define OID_RT_PRO_STOP_TEST 0xFF818003 +#define OID_RT_PRO_SET_PREAMBLE 0xFF818004 +#define OID_RT_PRO_SET_SCRAMBLER 0xFF818005 +#define OID_RT_PRO_SET_FILTER_BB 0xFF818006 +#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB 0xFF818007 +#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL 0xFF818008 +#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL 0xFF818009 +#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL 0xFF81800A + +#define OID_RT_PRO_SET_TX_ANTENNA_BB 0xFF81800D +#define OID_RT_PRO_SET_ANTENNA_BB 0xFF81800E +#define OID_RT_PRO_SET_CR_SCRAMBLER 0xFF81800F +#define OID_RT_PRO_SET_CR_NEW_FILTER 0xFF818010 +#define OID_RT_PRO_SET_TX_POWER_CONTROL 0xFF818011 +#define OID_RT_PRO_SET_CR_TX_CONFIG 0xFF818012 +#define OID_RT_PRO_GET_TX_POWER_CONTROL 0xFF818013 +#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY 0xFF818014 +#define OID_RT_PRO_SET_CR_SETPOINT 0xFF818015 +#define OID_RT_PRO_SET_INTEGRATOR 0xFF818016 +#define OID_RT_PRO_SET_SIGNAL_QUALITY 0xFF818017 +#define OID_RT_PRO_GET_INTEGRATOR 0xFF818018 +#define OID_RT_PRO_GET_SIGNAL_QUALITY 0xFF818019 +#define OID_RT_PRO_QUERY_EEPROM_TYPE 0xFF81801A +#define OID_RT_PRO_WRITE_MAC_ADDRESS 0xFF81801B +#define OID_RT_PRO_READ_MAC_ADDRESS 0xFF81801C +#define OID_RT_PRO_WRITE_CIS_DATA 0xFF81801D +#define OID_RT_PRO_READ_CIS_DATA 0xFF81801E +#define OID_RT_PRO_WRITE_POWER_CONTROL 0xFF81801F +#define OID_RT_PRO_READ_POWER_CONTROL 0xFF818020 +#define OID_RT_PRO_WRITE_EEPROM 0xFF818021 +#define OID_RT_PRO_READ_EEPROM 0xFF818022 +#define OID_RT_PRO_RESET_TX_PACKET_SENT 0xFF818023 +#define OID_RT_PRO_QUERY_TX_PACKET_SENT 0xFF818024 +#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED 0xFF818025 +#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED 0xFF818026 +#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR 0xFF818027 +#define OID_RT_PRO_QUERY_CURRENT_ADDRESS 0xFF818028 +#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS 0xFF818029 +#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS 0xFF81802A +#define OID_RT_PRO_RECEIVE_PACKET 0xFF81802C +// added by Owen on 04/08/03 for Cameo's request +#define OID_RT_PRO_WRITE_EEPROM_BYTE 0xFF81802D +#define OID_RT_PRO_READ_EEPROM_BYTE 0xFF81802E +#define OID_RT_PRO_SET_MODULATION 0xFF81802F +// + +//Sean +#define OID_RT_DRIVER_OPTION 0xFF818080 +#define OID_RT_RF_OFF 0xFF818081 +#define OID_RT_AUTH_STATUS 0xFF818082 + +//======================================================================== +#define OID_RT_PRO_SET_CONTINUOUS_TX 0xFF81800B +#define OID_RT_PRO_SET_SINGLE_CARRIER_TX 0xFF81800C +#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX 0xFF81802B +#define OID_RT_PRO_SET_SINGLE_TONE_TX 0xFF818043 +//======================================================================== + + +// by Owen for RTL8185 Phy Status Report Utility +#define OID_RT_UTILITY_FALSE_ALARM_COUNTERS 0xFF818580 +#define OID_RT_UTILITY_SELECT_DEBUG_MODE 0xFF818581 +#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER 0xFF818582 +#define OID_RT_UTILITY_GET_RSSI_STATUS 0xFF818583 +#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS 0xFF818584 +#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS 0xFF818585 +#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS 0xFF818586 +// + +// by Owen on 03/09/19-03/09/22 for RTL8185 +#define OID_RT_WIRELESS_MODE 0xFF818500 +#define OID_RT_SUPPORTED_RATES 0xFF818501 +#define OID_RT_DESIRED_RATES 0xFF818502 +#define OID_RT_WIRELESS_MODE_STARTING_ADHOC 0xFF818503 +// + +#define OID_RT_GET_CONNECT_STATE 0xFF030001 +#define OID_RT_RESCAN 0xFF030002 +#define OID_RT_SET_KEY_LENGTH 0xFF030003 +#define OID_RT_SET_DEFAULT_KEY_ID 0xFF030004 + +#define OID_RT_SET_CHANNEL 0xFF010182 +#define OID_RT_SET_SNIFFER_MODE 0xFF010183 +#define OID_RT_GET_SIGNAL_QUALITY 0xFF010184 +#define OID_RT_GET_SMALL_PACKET_CRC 0xFF010185 +#define OID_RT_GET_MIDDLE_PACKET_CRC 0xFF010186 +#define OID_RT_GET_LARGE_PACKET_CRC 0xFF010187 +#define OID_RT_GET_TX_RETRY 0xFF010188 +#define OID_RT_GET_RX_RETRY 0xFF010189 +#define OID_RT_PRO_SET_FW_DIG_STATE 0xFF01018A//S +#define OID_RT_PRO_SET_FW_RA_STATE 0xFF01018B//S + +#define OID_RT_GET_RX_TOTAL_PACKET 0xFF010190 +#define OID_RT_GET_TX_BEACON_OK 0xFF010191 +#define OID_RT_GET_TX_BEACON_ERR 0xFF010192 +#define OID_RT_GET_RX_ICV_ERR 0xFF010193 +#define OID_RT_SET_ENCRYPTION_ALGORITHM 0xFF010194 +#define OID_RT_SET_NO_AUTO_RESCAN 0xFF010195 +#define OID_RT_GET_PREAMBLE_MODE 0xFF010196 +#define OID_RT_GET_DRIVER_UP_DELTA_TIME 0xFF010197 +#define OID_RT_GET_AP_IP 0xFF010198 +#define OID_RT_GET_CHANNELPLAN 0xFF010199 +#define OID_RT_SET_PREAMBLE_MODE 0xFF01019A +#define OID_RT_SET_BCN_INTVL 0xFF01019B +#define OID_RT_GET_RF_VENDER 0xFF01019C +#define OID_RT_DEDICATE_PROBE 0xFF01019D +#define OID_RT_PRO_RX_FILTER_PATTERN 0xFF01019E + +#define OID_RT_GET_DCST_CURRENT_THRESHOLD 0xFF01019F + +#define OID_RT_GET_CCA_ERR 0xFF0101A0 +#define OID_RT_GET_CCA_UPGRADE_THRESHOLD 0xFF0101A1 +#define OID_RT_GET_CCA_FALLBACK_THRESHOLD 0xFF0101A2 + +#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES 0xFF0101A3 +#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES 0xFF0101A4 + +// by Owen on 03/31/03 for Cameo's request +#define OID_RT_SET_RATE_ADAPTIVE 0xFF0101A5 +// +#define OID_RT_GET_DCST_EVALUATE_PERIOD 0xFF0101A5 +#define OID_RT_GET_DCST_TIME_UNIT_INDEX 0xFF0101A6 +#define OID_RT_GET_TOTAL_TX_BYTES 0xFF0101A7 +#define OID_RT_GET_TOTAL_RX_BYTES 0xFF0101A8 +#define OID_RT_CURRENT_TX_POWER_LEVEL 0xFF0101A9 +#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT 0xFF0101AA +#define OID_RT_GET_ENC_KEY_MATCH_COUNT 0xFF0101AB +#define OID_RT_GET_CHANNEL 0xFF0101AC + +#define OID_RT_SET_CHANNELPLAN 0xFF0101AD +#define OID_RT_GET_HARDWARE_RADIO_OFF 0xFF0101AE +#define OID_RT_CHANNELPLAN_BY_COUNTRY 0xFF0101AF +#define OID_RT_SCAN_AVAILABLE_BSSID 0xFF0101B0 +#define OID_RT_GET_HARDWARE_VERSION 0xFF0101B1 +#define OID_RT_GET_IS_ROAMING 0xFF0101B2 +#define OID_RT_GET_IS_PRIVACY 0xFF0101B3 +#define OID_RT_GET_KEY_MISMATCH 0xFF0101B4 +#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH 0xFF0101B5 +#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH 0xFF0101B6 +#define OID_RT_RESET_LOG 0xFF0101B7 +#define OID_RT_GET_LOG 0xFF0101B8 +#define OID_RT_SET_INDICATE_HIDDEN_AP 0xFF0101B9 +#define OID_RT_GET_HEADER_FAIL 0xFF0101BA +#define OID_RT_SUPPORTED_WIRELESS_MODE 0xFF0101BB +#define OID_RT_GET_CHANNEL_LIST 0xFF0101BC +#define OID_RT_GET_SCAN_IN_PROGRESS 0xFF0101BD +#define OID_RT_GET_TX_INFO 0xFF0101BE +#define OID_RT_RF_READ_WRITE_OFFSET 0xFF0101BF +#define OID_RT_RF_READ_WRITE 0xFF0101C0 + +// For Netgear request. 2005.01.13, by rcnjko. +#define OID_RT_FORCED_DATA_RATE 0xFF0101C1 +#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST 0xFF0101C2 +// For Netgear request. 2005.02.17, by rcnjko. +#define OID_RT_GET_BSS_WIRELESS_MODE 0xFF0101C3 +// For AZ project. 2005.06.27, by rcnjko. +#define OID_RT_SCAN_WITH_MAGIC_PACKET 0xFF0101C4 + +// Vincent 8185MP +#define OID_RT_PRO_RX_FILTER 0xFF0111C0 + +//Andy TEST +//#define OID_RT_PRO_WRITE_REGISTRY 0xFF0111C1 +//#define OID_RT_PRO_READ_REGISTRY 0xFF0111C2 +#define OID_CE_USB_WRITE_REGISTRY 0xFF0111C1 +#define OID_CE_USB_READ_REGISTRY 0xFF0111C2 + + +#define OID_RT_PRO_SET_INITIAL_GAIN 0xFF0111C3 +#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE 0xFF0111C4 +#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE 0xFF0111C5 +#define OID_RT_PRO_SET_TX_CHARGE_PUMP 0xFF0111C6 +#define OID_RT_PRO_SET_RX_CHARGE_PUMP 0xFF0111C7 +#define OID_RT_PRO_RF_WRITE_REGISTRY 0xFF0111C8 +#define OID_RT_PRO_RF_READ_REGISTRY 0xFF0111C9 +#define OID_RT_PRO_QUERY_RF_TYPE 0xFF0111CA + +// AP OID +#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST 0xFF010300 +#define OID_RT_AP_GET_CURRENT_TIME_STAMP 0xFF010301 +#define OID_RT_AP_SWITCH_INTO_AP_MODE 0xFF010302 +#define OID_RT_AP_SET_DTIM_PERIOD 0xFF010303 +#define OID_RT_AP_SUPPORTED 0xFF010304 // Determine if driver supports AP mode. 2004.08.27, by rcnjko. +#define OID_RT_AP_SET_PASSPHRASE 0xFF010305 // Set WPA-PSK passphrase into authenticator. 2005.07.08, byrcnjko. + +// 8187MP. 2004.09.06, by rcnjko. +#define OID_RT_PRO8187_WI_POLL 0xFF818780 +#define OID_RT_PRO_WRITE_BB_REG 0xFF818781 +#define OID_RT_PRO_READ_BB_REG 0xFF818782 +#define OID_RT_PRO_WRITE_RF_REG 0xFF818783 +#define OID_RT_PRO_READ_RF_REG 0xFF818784 + +// Meeting House. added by Annie, 2005-07-20. +#define OID_RT_MH_VENDER_ID 0xFFEDC100 + +//8711 MP OID added 20051230. +#define OID_RT_PRO8711_JOIN_BSS 0xFF871100//S + +#define OID_RT_PRO_READ_REGISTER 0xFF871101 //Q +#define OID_RT_PRO_WRITE_REGISTER 0xFF871102 //S + +#define OID_RT_PRO_BURST_READ_REGISTER 0xFF871103 //Q +#define OID_RT_PRO_BURST_WRITE_REGISTER 0xFF871104 //S + +#define OID_RT_PRO_WRITE_TXCMD 0xFF871105 //S + +#define OID_RT_PRO_READ16_EEPROM 0xFF871106 //Q +#define OID_RT_PRO_WRITE16_EEPROM 0xFF871107 //S + +#define OID_RT_PRO_H2C_SET_COMMAND 0xFF871108 //S +#define OID_RT_PRO_H2C_QUERY_RESULT 0xFF871109 //Q + +#define OID_RT_PRO8711_WI_POLL 0xFF87110A //Q +#define OID_RT_PRO8711_PKT_LOSS 0xFF87110B //Q +#define OID_RT_RD_ATTRIB_MEM 0xFF87110C//Q +#define OID_RT_WR_ATTRIB_MEM 0xFF87110D//S + + +//Method 2 for H2C/C2H +#define OID_RT_PRO_H2C_CMD_MODE 0xFF871110 //S +#define OID_RT_PRO_H2C_CMD_RSP_MODE 0xFF871111 //Q +#define OID_RT_PRO_H2C_CMD_EVENT_MODE 0xFF871112 //S +#define OID_RT_PRO_WAIT_C2H_EVENT 0xFF871113 //Q +#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST 0xFF871114//Q + +#define OID_RT_PRO_SCSI_ACCESS_TEST 0xFF871115 //Q, S + +#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT 0xFF871116 //S +#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN 0xFF871117 //Q,S +#define OID_RT_RRO_RX_PKT_VIA_IOCTRL 0xFF871118 //Q +#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL 0xFF871119 //Q + +#define OID_RT_RPO_SET_PWRMGT_TEST 0xFF87111A //S +#define OID_RT_PRO_QRY_PWRMGT_TEST 0XFF87111B //Q +#define OID_RT_RPO_ASYNC_RWIO_TEST 0xFF87111C //S +#define OID_RT_RPO_ASYNC_RWIO_POLL 0xFF87111D //Q +#define OID_RT_PRO_SET_RF_INTFS 0xFF87111E //S +#define OID_RT_POLL_RX_STATUS 0xFF87111F //Q + +#define OID_RT_PRO_CFG_DEBUG_MESSAGE 0xFF871120 //Q,S +#define OID_RT_PRO_SET_DATA_RATE_EX 0xFF871121//S +#define OID_RT_PRO_SET_BASIC_RATE 0xFF871122//S +#define OID_RT_PRO_READ_TSSI 0xFF871123//S +#define OID_RT_PRO_SET_POWER_TRACKING 0xFF871124//S + + +#define OID_RT_PRO_QRY_PWRSTATE 0xFF871150 //Q +#define OID_RT_PRO_SET_PWRSTATE 0xFF871151 //S + +//Method 2 , using workitem +#define OID_RT_SET_READ_REG 0xFF871181 //S +#define OID_RT_SET_WRITE_REG 0xFF871182 //S +#define OID_RT_SET_BURST_READ_REG 0xFF871183 //S +#define OID_RT_SET_BURST_WRITE_REG 0xFF871184 //S +#define OID_RT_SET_WRITE_TXCMD 0xFF871185 //S +#define OID_RT_SET_READ16_EEPROM 0xFF871186 //S +#define OID_RT_SET_WRITE16_EEPROM 0xFF871187 //S +#define OID_RT_QRY_POLL_WKITEM 0xFF871188 //Q + +//For SDIO INTERFACE only +#define OID_RT_PRO_SYNCPAGERW_SRAM 0xFF8711A0 //Q, S +#define OID_RT_PRO_871X_DRV_EXT 0xFF8711A1 + +//For USB INTERFACE only +#define OID_RT_PRO_USB_VENDOR_REQ 0xFF8711B0 //Q, S +#define OID_RT_PRO_SCSI_AUTO_TEST 0xFF8711B1 //S +#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE 0xFF8711B2 //S +#define OID_RT_PRO_USB_MAC_RX_FIFO_READ 0xFF8711B3 //Q +#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING 0xFF8711B4 //Q + +#define OID_RT_PRO_H2C_SET_RATE_TABLE 0xFF8711FB //S +#define OID_RT_PRO_H2C_GET_RATE_TABLE 0xFF8711FC //S +#define OID_RT_PRO_H2C_C2H_LBK_TEST 0xFF8711FE + +#define OID_RT_PRO_ENCRYPTION_CTRL 0xFF871200 //Q, S +#define OID_RT_PRO_ADD_STA_INFO 0xFF871201 //S +#define OID_RT_PRO_DELE_STA_INFO 0xFF871202 //S +#define OID_RT_PRO_QUERY_DR_VARIABLE 0xFF871203 //Q + +#define OID_RT_PRO_RX_PACKET_TYPE 0xFF871204 //Q, S + +#define OID_RT_PRO_READ_EFUSE 0xFF871205 //Q +#define OID_RT_PRO_WRITE_EFUSE 0xFF871206 //S +#define OID_RT_PRO_RW_EFUSE_PGPKT 0xFF871207 //Q, S +#define OID_RT_GET_EFUSE_CURRENT_SIZE 0xFF871208 //Q + +#define OID_RT_SET_BANDWIDTH 0xFF871209 //S +#define OID_RT_SET_CRYSTAL_CAP 0xFF87120A //S + +#define OID_RT_SET_RX_PACKET_TYPE 0xFF87120B //S + +#define OID_RT_GET_EFUSE_MAX_SIZE 0xFF87120C //Q + +#define OID_RT_PRO_SET_TX_AGC_OFFSET 0xFF87120D //S + +#define OID_RT_PRO_SET_PKT_TEST_MODE 0xFF87120E //S + +#define OID_RT_PRO_FOR_EVM_TEST_SETTING 0xFF87120F //S + +#define OID_RT_PRO_GET_THERMAL_METER 0xFF871210 //Q + +#define OID_RT_RESET_PHY_RX_PACKET_COUNT 0xFF871211 //S +#define OID_RT_GET_PHY_RX_PACKET_RECEIVED 0xFF871212 //Q +#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR 0xFF871213 //Q + +#define OID_RT_SET_POWER_DOWN 0xFF871214 //S + +#define OID_RT_GET_POWER_MODE 0xFF871215 //Q + +#define OID_RT_PRO_EFUSE 0xFF871216 //Q, S +#define OID_RT_PRO_EFUSE_MAP 0xFF871217 //Q, S + +#endif //#ifndef __CUSTOM_OID_H diff --git a/drivers/net/wireless/rtl8192c/include/nic_spec.h b/drivers/net/wireless/rtl8192c/include/nic_spec.h new file mode 100755 index 000000000000..18e7b2c09671 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/nic_spec.h @@ -0,0 +1,47 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __NIC_SPEC_H__ +#define __NIC_SPEC_H__ + +#include + +#define RTL8711_MCTRL_ (0x20000) +#define RTL8711_UART_ (0x30000) +#define RTL8711_TIMER_ (0x40000) +#define RTL8711_FINT_ (0x50000) +#define RTL8711_HINT_ (0x50000) +#define RTL8711_GPIO_ (0x60000) +#define RTL8711_WLANCTRL_ (0x200000) +#define RTL8711_WLANFF_ (0xe00000) +#define RTL8711_HCICTRL_ (0x600000) +#define RTL8711_SYSCFG_ (0x620000) +#define RTL8711_SYSCTRL_ (0x620000) +#define RTL8711_MCCTRL_ (0x020000) + + +#include + +#include + + +#endif // __RTL8711_SPEC_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h b/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h new file mode 100755 index 000000000000..5f7c3e65103a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h @@ -0,0 +1,171 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __OSDEP_CE_SERVICE_H_ +#define __OSDEP_CE_SERVICE_H_ + + +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include "SDCardDDK.h" +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +typedef HANDLE _sema; +typedef LIST_ENTRY _list; +typedef NDIS_STATUS _OS_STATUS; + +typedef NDIS_SPIN_LOCK _lock; + +typedef HANDLE _rwlock; //Mutex + +typedef u32 _irqL; + +typedef NDIS_HANDLE _nic_hdl; + + +typedef NDIS_MINIPORT_TIMER _timer; + +struct __queue { + LIST_ENTRY queue; + _lock lock; +}; + +typedef NDIS_PACKET _pkt; +typedef NDIS_BUFFER _buffer; +typedef struct __queue _queue; + +typedef HANDLE _thread_hdl_; +typedef DWORD thread_return; +typedef void* thread_context; +typedef NDIS_WORK_ITEM _workitem; + +#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; + + +#define SEMA_UPBND (0x7FFFFFFF) //8192 + +__inline static _list *get_prev(_list *list) +{ + return list->Blink; +} + +__inline static _list *get_next(_list *list) +{ + return list->Flink; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + NdisAcquireSpinLock(plock); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + NdisReleaseSpinLock(plock); +} + +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + + +__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + WaitForSingleObject(*prwlock, INFINITE ); + +} + +__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + ReleaseMutex(*prwlock); +} + +__inline static void rtw_list_delete(_list *plist) +{ + RemoveEntryList(plist); + InitializeListHead(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) +{ + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + NdisMSetTimer(ptimer,delay_time); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + NdisMCancelTimer(ptimer,bcancelled); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + + NdisInitializeWorkItem(pwork, pfunc, cntx); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + NdisScheduleWorkItem(pwork); +} + +#define ATOMIC_INIT(i) { (i) } + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ + { \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ + NdisMSleep(10000); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/osdep_intf.h b/drivers/net/wireless/rtl8192c/include/osdep_intf.h new file mode 100755 index 000000000000..86b3f1fd93fe --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/osdep_intf.h @@ -0,0 +1,128 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __OSDEP_INTF_H_ +#define __OSDEP_INTF_H_ + +#include +#include +#include + +#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2) + + +struct intf_priv { + + u8 *intf_dev; + u32 max_iosz; //USB2.0: 128, USB1.1: 64, SDIO:64 + u32 max_xmitsz; //USB2.0: unlimited, SDIO:512 + u32 max_recvsz; //USB2.0: unlimited, SDIO:512 + + volatile u8 *io_rwmem; + volatile u8 *allocated_io_rwmem; + u32 io_wsz; //unit: 4bytes + u32 io_rsz;//unit: 4bytes + u8 intf_status; + + void (*_bus_io)(u8 *priv); + +/* +Under Sync. IRP (SDIO/USB) +A protection mechanism is necessary for the io_rwmem(read/write protocol) + +Under Async. IRP (SDIO/USB) +The protection mechanism is through the pending queue. +*/ + + _mutex ioctl_mutex; + + +#ifdef PLATFORM_LINUX + #ifdef CONFIG_USB_HCI + // when in USB, IO is through interrupt in/out endpoints + struct usb_device *udev; + PURB piorw_urb; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + _timer io_timer; + u8 bio_irp_timeout; + u8 bio_timer_cancel; + #endif +#endif + +#ifdef PLATFORM_OS_XP + #ifdef CONFIG_SDIO_HCI + // below is for io_rwmem... + PMDL pmdl; + PSDBUS_REQUEST_PACKET sdrp; + PSDBUS_REQUEST_PACKET recv_sdrp; + PSDBUS_REQUEST_PACKET xmit_sdrp; + + PIRP piorw_irp; + + #endif + #ifdef CONFIG_USB_HCI + PURB piorw_urb; + PIRP piorw_irp; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + #endif +#endif + +}; + + +#ifdef CONFIG_R871X_TEST +int rtw_start_pseudo_adhoc(_adapter *padapter); +int rtw_stop_pseudo_adhoc(_adapter *padapter); +#endif + +u8 rtw_init_drv_sw(_adapter *padapter); +u8 rtw_free_drv_sw(_adapter *padapter); +u8 rtw_reset_drv_sw(_adapter *padapter); + +u32 rtw_start_drv_threads(_adapter *padapter); +void rtw_stop_drv_threads (_adapter *padapter); +void rtw_cancel_all_timer(_adapter *padapter); + +#ifdef PLATFORM_LINUX +int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); + +int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname); +struct net_device *rtw_init_netdev(_adapter *padapter); + +#ifdef CONFIG_PROC_DEBUG +void rtw_proc_init_one(struct net_device *dev); +void rtw_proc_remove_one(struct net_device *dev); +#endif +#endif + + +void rtw_ips_dev_unload(_adapter *padapter); +#ifdef CONFIG_IPS +int rtw_ips_pwr_up(_adapter *padapter); +void rtw_ips_pwr_down(_adapter *padapter); +#endif + + +#endif //_OSDEP_INTF_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/osdep_service.h b/drivers/net/wireless/rtl8192c/include/osdep_service.h new file mode 100755 index 000000000000..4aa6478e3a59 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/osdep_service.h @@ -0,0 +1,808 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __OSDEP_SERVICE_H_ +#define __OSDEP_SERVICE_H_ + +#include +#include +//#include + +#define _SUCCESS 1 +#define _FAIL 0 + +#undef _TRUE +#define _TRUE 1 + +#undef _FALSE +#define _FALSE 0 + + +#ifdef PLATFORM_LINUX + #include + #include + #include + #include + #include + #include + #include + #include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5)) + #include +#endif + #include + #include + #include + #include + #include + #include + #include + #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) + #include +#else + #include +#endif + #include + #include + #include + #include + #include + #include + #include + #include + #include // Necessary because we use the proc fs + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + #include + #include + #include +#endif + +#ifdef CONFIG_USB_HCI + #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) + #include +#else + #include +#endif +#endif + +#ifdef CONFIG_SDIO_HCI + #include + #include +#endif + +#ifdef CONFIG_PCI_HCI + #include +#endif + + +#ifdef CONFIG_USB_HCI + typedef struct urb * PURB; +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) +#ifdef CONFIG_USB_SUSPEND +#define CONFIG_AUTOSUSPEND 1 +#endif +#endif +#endif + + typedef struct semaphore _sema; + typedef spinlock_t _lock; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + typedef struct mutex _mutex; +#else + typedef struct semaphore _mutex; +#endif + typedef struct timer_list _timer; + + struct __queue { + struct list_head queue; + _lock lock; + }; + + typedef struct sk_buff _pkt; + typedef unsigned char _buffer; + + typedef struct __queue _queue; + typedef struct list_head _list; + typedef int _OS_STATUS; + //typedef u32 _irqL; + typedef unsigned long _irqL; + typedef struct net_device * _nic_hdl; + + typedef pid_t _thread_hdl_; + typedef int thread_return; + typedef void* thread_context; + + #define thread_exit() complete_and_exit(NULL, 0) + + typedef void timer_hdl_return; + typedef void* timer_hdl_context; + typedef struct work_struct _workitem; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) + #define skb_tail_pointer(skb) skb->tail +#endif + +__inline static _list *get_next(_list *list) +{ + return list->next; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + + +#define LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) + + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_lock_bh(plock); +} + +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_unlock_bh(plock); +} + +__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_lock(pmutex); +#else + down(pmutex); +#endif +} + + +__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_unlock(pmutex); +#else + up(pmutex); +#endif +} + +__inline static void rtw_list_delete(_list *plist) +{ + list_del_init(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,void* cntx) +{ + //setup_timer(ptimer, pfunc,(u32)cntx); + ptimer->function = pfunc; + ptimer->data = (unsigned long)cntx; + init_timer(ptimer); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + del_timer_sync(ptimer); + *bcancelled= _TRUE;//TRUE ==1; FALSE==0 +} + +#ifdef PLATFORM_LINUX +#define RTW_TIMER_HDL_ARGS void *FunctionContext +#elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS) +#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 +#endif + +#define RTW_TIMER_HDL_NAME(name) rtw_##name##_timer_hdl +#define RTW_DECLARE_TIMER_HDL(name) void RTW_TIMER_HDL_NAME(name)(RTW_TIMER_HDL_ARGS) + + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + INIT_WORK(pwork, pfunc); +#else + INIT_WORK(pwork, pfunc,pwork); +#endif +} + +__inline static void _set_workitem(_workitem *pwork) +{ + schedule_work(pwork); +} + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\ + { \ + atomic_dec((atomic_t *)&(_MutexCounter)); \ + msleep(10); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + atomic_dec((atomic_t *)&(_MutexCounter)); \ +} + +#endif // PLATFORM_LINUX + + +#ifdef PLATFORM_OS_XP + + #include + #include + #include + #include + #include + +#ifdef CONFIG_USB_HCI + #include + #include + #include +#endif + + typedef KSEMAPHORE _sema; + typedef LIST_ENTRY _list; + typedef NDIS_STATUS _OS_STATUS; + + + typedef NDIS_SPIN_LOCK _lock; + + typedef KMUTEX _mutex; + + typedef KIRQL _irqL; + + // USB_PIPE for WINCE , but handle can be use just integer under windows + typedef NDIS_HANDLE _nic_hdl; + + + typedef NDIS_MINIPORT_TIMER _timer; + + struct __queue { + LIST_ENTRY queue; + _lock lock; + }; + + typedef NDIS_PACKET _pkt; + typedef NDIS_BUFFER _buffer; + typedef struct __queue _queue; + + typedef PKTHREAD _thread_hdl_; + typedef void thread_return; + typedef void* thread_context; + + typedef NDIS_WORK_ITEM _workitem; + + #define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS); + + #define HZ 10000000 + #define SEMA_UPBND (0x7FFFFFFF) //8192 + +__inline static _list *get_next(_list *list) +{ + return list->Flink; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + + +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) + + +__inline static _enter_critical(_lock *plock, _irqL *pirqL) +{ + NdisAcquireSpinLock(plock); +} + +__inline static _exit_critical(_lock *plock, _irqL *pirqL) +{ + NdisReleaseSpinLock(plock); +} + + +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + +__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + KeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL); +} + + +__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + KeReleaseMutex(pmutex, FALSE); +} + + +__inline static void rtw_list_delete(_list *plist) +{ + RemoveEntryList(plist); + InitializeListHead(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) +{ + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + NdisMSetTimer(ptimer,delay_time); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + NdisMCancelTimer(ptimer,bcancelled); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + + NdisInitializeWorkItem(pwork, pfunc, cntx); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + NdisScheduleWorkItem(pwork); +} + + +#define ATOMIC_INIT(i) { (i) } + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ + { \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ + NdisMSleep(10000); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ +} + +#endif // PLATFORM_OS_XP + + +#ifdef PLATFORM_OS_CE +#include +#endif + +#include + +#ifndef BIT + #define BIT(x) ( 1 << (x)) +#endif + +#ifdef DBG_MEM_ALLOC +void rtw_dump_mem_stat (void); +extern u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line); +extern u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line); +extern void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line); +extern u8* dbg_rtw_malloc(u32 sz, const char *func, int line); +extern u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line); +extern void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line); +#define rtw_vmalloc(sz) dbg_rtw_vmalloc((sz), __FUNCTION__, __LINE__) +#define rtw_zvmalloc(sz) dbg_rtw_zvmalloc((sz), __FUNCTION__, __LINE__) +#define rtw_vmfree(pbuf, sz) dbg_rtw_vmfree((pbuf), (sz), __FUNCTION__, __LINE__) +#define rtw_malloc(sz) dbg_rtw_malloc((sz), __FUNCTION__, __LINE__) +#define rtw_zmalloc(sz) dbg_rtw_zmalloc((sz), __FUNCTION__, __LINE__) +#define rtw_mfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), __FUNCTION__, __LINE__) +#else +extern u8* _rtw_vmalloc(u32 sz); +extern u8* _rtw_zvmalloc(u32 sz); +extern void _rtw_vmfree(u8 *pbuf, u32 sz); +extern u8* _rtw_zmalloc(u32 sz); +extern u8* _rtw_malloc(u32 sz); +extern void _rtw_mfree(u8 *pbuf, u32 sz); +#define rtw_vmalloc(sz) _rtw_vmalloc((sz)) +#define rtw_zvmalloc(sz) _rtw_zvmalloc((sz)) +#define rtw_vmfree(pbuf, sz) _rtw_vmfree((pbuf), (sz)) +#define rtw_malloc(sz) _rtw_malloc((sz)) +#define rtw_zmalloc(sz) _rtw_zmalloc((sz)) +#define rtw_mfree(pbuf, sz) _rtw_mfree((pbuf), (sz)) +#endif + +extern void _rtw_memcpy(void* dec, void* sour, u32 sz); +extern int _rtw_memcmp(void *dst, void *src, u32 sz); +extern void _rtw_memset(void *pbuf, int c, u32 sz); + +extern void _rtw_init_listhead(_list *list); +extern u32 rtw_is_list_empty(_list *phead); +extern void rtw_list_insert_tail(_list *plist, _list *phead); +extern void rtw_list_delete(_list *plist); + +extern void _rtw_init_sema(_sema *sema, int init_val); +extern void _rtw_free_sema(_sema *sema); +extern void _rtw_up_sema(_sema *sema); +extern u32 _rtw_down_sema(_sema *sema); +extern void _rtw_mutex_init(_mutex *pmutex); +extern void _rtw_spinlock_init(_lock *plock); +extern void _rtw_spinlock_free(_lock *plock); +extern void _rtw_spinlock(_lock *plock); +extern void _rtw_spinunlock(_lock *plock); +extern void _rtw_spinlock_ex(_lock *plock); +extern void _rtw_spinunlock_ex(_lock *plock); + +extern void _rtw_init_queue(_queue *pqueue); +extern u32 _rtw_queue_empty(_queue *pqueue); +extern u32 rtw_end_of_queue_search(_list *queue, _list *pelement); + +extern u32 rtw_get_current_time(void); +extern u32 rtw_systime_to_ms(u32 systime); +extern s32 rtw_get_passing_time_ms(u32 start); +extern s32 rtw_get_time_interval_ms(u32 start, u32 end); + +extern void rtw_sleep_schedulable(int ms); + +extern void rtw_msleep_os(int ms); +extern void rtw_usleep_os(int us); + +#ifdef DBG_DELAY_OS +#define rtw_mdelay_os(ms) _rtw_mdelay_os((ms), __FUNCTION__, __LINE__) +#define rtw_udelay_os(ms) _rtw_udelay_os((ms), __FUNCTION__, __LINE__) +extern void _rtw_mdelay_os(int ms, const char *func, const int line); +extern void _rtw_udelay_os(int us, const char *func, const int line); +#else +extern void rtw_mdelay_os(int ms); +extern void rtw_udelay_os(int us); +#endif + + + +__inline static unsigned char _cancel_timer_ex(_timer *ptimer) +{ +#ifdef PLATFORM_LINUX + return del_timer_sync(ptimer); +#endif + +#ifdef PLATFORM_WINDOWS + u8 bcancelled; + + _cancel_timer(ptimer, &bcancelled); + + return bcancelled; +#endif +} + +__inline static void thread_enter(void *context) +{ +#ifdef PLATFORM_LINUX + //struct net_device *pnetdev = (struct net_device *)context; + //daemonize("%s", pnetdev->name); + daemonize("%s", "RTKTHREAD"); + allow_signal(SIGTERM); +#endif +} + +__inline static void flush_signals_thread(void) +{ +#ifdef PLATFORM_LINUX + if (signal_pending (current)) + { + flush_signals(current); + } +#endif +} + +__inline static _OS_STATUS res_to_status(sint res) +{ + + +#if defined (PLATFORM_LINUX) || defined (PLATFORM_MPIXEL) + return res; +#endif + +#ifdef PLATFORM_WINDOWS + + if (res == _SUCCESS) + return NDIS_STATUS_SUCCESS; + else + return NDIS_STATUS_FAILURE; + +#endif + +} + +__inline static u32 _RND4(u32 sz) +{ + + u32 val; + + val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2; + + return val; + +} + +__inline static u32 _RND8(u32 sz) +{ + + u32 val; + + val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3; + + return val; + +} + +__inline static u32 _RND128(u32 sz) +{ + + u32 val; + + val = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7; + + return val; + +} + +__inline static u32 _RND256(u32 sz) +{ + + u32 val; + + val = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8; + + return val; + +} + +__inline static u32 _RND512(u32 sz) +{ + + u32 val; + + val = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9; + + return val; + +} + +__inline static u32 bitshift(u32 bitmask) +{ + u32 i; + + for (i = 0; i <= 31; i++) + if (((bitmask>>i) & 0x1) == 1) break; + + return i; +} + +#ifndef MAC_FMT +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#endif +#ifndef MAC_ARG +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] +#endif + +//#ifdef __GNUC__ +#ifdef PLATFORM_LINUX +#define STRUCT_PACKED __attribute__ ((packed)) +#else +#define STRUCT_PACKED +#endif + + +// limitation of path length +#ifdef PLATFORM_LINUX + #define PATH_LENGTH_MAX PATH_MAX +#elif defined(PLATFORM_WINDOWS) + #define PATH_LENGTH_MAX MAX_PATH +#endif + + +// Suspend lock prevent system from going suspend +#ifdef CONFIG_WAKELOCK +#include +#elif defined(CONFIG_ANDROID_POWER) +#include +#endif + +extern void rtw_suspend_lock_init(void); +extern void rtw_suspend_lock_uninit(void); +extern void rtw_lock_suspend(void); +extern void rtw_unlock_suspend(void); + + +//Atomic integer operations +#ifdef PLATFORM_LINUX + #define ATOMIC_T atomic_t +#elif defined(PLATFORM_WINDOWS) + #define ATOMIC_T LONG +#endif + +extern void ATOMIC_SET(ATOMIC_T *v, int i); +extern int ATOMIC_READ(ATOMIC_T *v); +extern void ATOMIC_ADD(ATOMIC_T *v, int i); +extern void ATOMIC_SUB(ATOMIC_T *v, int i); +extern void ATOMIC_INC(ATOMIC_T *v); +extern void ATOMIC_DEC(ATOMIC_T *v); +extern int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i); +extern int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i); +extern int ATOMIC_INC_RETURN(ATOMIC_T *v); +extern int ATOMIC_DEC_RETURN(ATOMIC_T *v); + +//File operation APIs, just for linux now +#ifdef PLATFORM_LINUX +extern int openFile(struct file **fpp, char *path,int flag,int mode); +extern int closeFile(struct file *fp); +extern int readFile(struct file *fp,char *buf,int len); +extern int writeFile(struct file *fp,char *buf,int len); +#endif + + +#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR +struct rtw_netdev_priv_indicator { + void *priv; + u32 sizeof_priv; +}; +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv); +extern struct net_device * rtw_alloc_etherdev(int sizeof_priv); +#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv ) +extern void rtw_free_netdev(struct net_device * netdev); +#else +#define rtw_alloc_etherdev(sizeof_priv) alloc_etherdev((sizeof_priv)) +#define rtw_netdev_priv(netdev) netdev_priv((netdev)) +#define rtw_free_netdev(netdev) free_netdev((netdev)) +#endif + +#ifdef PLATFORM_LINUX +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) +#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1) +#else +#define rtw_signal_process(pid, sig) kill_proc((pid), (sig), 1) +#endif +#endif //PLATFORM_LINUX + +extern u64 rtw_modular64(u64 x, u64 y); +extern u64 rtw_division64(u64 x, u64 y); + + +/* Macros for handling unaligned memory accesses */ + +#define RTW_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) +#define RTW_PUT_BE16(a, val) \ + do { \ + (a)[0] = ((u16) (val)) >> 8; \ + (a)[1] = ((u16) (val)) & 0xff; \ + } while (0) + +#define RTW_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0])) +#define RTW_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ + ((u32) (a)[2])) +#define RTW_PUT_BE24(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[2] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ + (((u32) (a)[2]) << 8) | ((u32) (a)[3])) +#define RTW_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \ + (((u32) (a)[1]) << 8) | ((u32) (a)[0])) +#define RTW_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \ + (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \ + (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \ + (((u64) (a)[6]) << 8) | ((u64) (a)[7])) +#define RTW_PUT_BE64(a, val) \ + do { \ + (a)[0] = (u8) (((u64) (val)) >> 56); \ + (a)[1] = (u8) (((u64) (val)) >> 48); \ + (a)[2] = (u8) (((u64) (val)) >> 40); \ + (a)[3] = (u8) (((u64) (val)) >> 32); \ + (a)[4] = (u8) (((u64) (val)) >> 24); \ + (a)[5] = (u8) (((u64) (val)) >> 16); \ + (a)[6] = (u8) (((u64) (val)) >> 8); \ + (a)[7] = (u8) (((u64) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \ + (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \ + (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \ + (((u64) (a)[1]) << 8) | ((u64) (a)[0])) + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/pci_hal.h b/drivers/net/wireless/rtl8192c/include/pci_hal.h new file mode 100755 index 000000000000..1ee0ee2c226b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/pci_hal.h @@ -0,0 +1,168 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __PCI_HAL_H__ +#define __PCI_HAL_H__ + + +#define INTEL_VENDOR_ID 0x8086 +#define SIS_VENDOR_ID 0x1039 +#define ATI_VENDOR_ID 0x1002 +#define ATI_DEVICE_ID 0x7914 +#define AMD_VENDOR_ID 0x1022 + +#define PCI_MAX_BRIDGE_NUMBER 255 +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 + +#define PCI_CONF_ADDRESS 0x0CF8 // PCI Configuration Space Address +#define PCI_CONF_DATA 0x0CFC // PCI Configuration Space Data + +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 + +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 + +#define U1DONTCARE 0xFF +#define U2DONTCARE 0xFFFF +#define U4DONTCARE 0xFFFFFFFF + +#define PCI_VENDER_ID_REALTEK 0x10ec + +#define HAL_HW_PCI_8180_DEVICE_ID 0x8180 +#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 //8185 or 8185b +#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 //8185b +#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 //8185b +#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 //8190 +#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 //8723E +#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 //8192 PCI-E +#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 //8192 SE +#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 //8192 SE +#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 //8191 SE Crab +#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 //8191 SE RE +#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 //8191 SE Unicron +#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 //8190 PCI for Ceraga +#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 //8190 Cardbus for Ceraga +#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 //8192e PCIE for Ceraga +#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 //8192e Express Card for Ceraga +#define HAL_HW_PCI_700F_DEVICE_ID 0x700F +#define HAL_HW_PCI_701F_DEVICE_ID 0x701F +#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304 +#define HAL_HW_PCI_8192CET_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192CE_DEVICE_ID 0x8178 //8192ce +#define HAL_HW_PCI_8191CE_DEVICE_ID 0x8177 //8192ce +#define HAL_HW_PCI_8188CE_DEVICE_ID 0x8176 //8192ce +#define HAL_HW_PCI_8192CU_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192DE_DEVICE_ID 0x8193 //8192de +#define HAL_HW_PCI_002B_DEVICE_ID 0x002B //8192de, provided by HW SD + +#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 //8190 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192SE 0x10 +#define HAL_HW_PCI_REVISION_ID_8192CE 0x1 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192DE 0x0 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 //8192 support 16 pages of IO registers + +enum pci_bridge_vendor { + PCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001 + PCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010 + PCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100 + PCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000 + PCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000 + PCI_BRIDGE_VENDOR_MAX ,//= 0x80 +} ; + +struct rt_pci_capabilities_header { + u8 capability_id; + u8 next; +}; + +struct pci_priv{ + u8 linkctrl_reg; + + u8 busnumber; + u8 devnumber; + u8 funcnumber; + + u8 pcibridge_busnum; + u8 pcibridge_devnum; + u8 pcibridge_funcnum; + u8 pcibridge_vendor; + u16 pcibridge_vendorid; + u16 pcibridge_deviceid; + u8 pcibridge_pciehdr_offset; + u8 pcibridge_linkctrlreg; + + u8 amd_l1_patch; +}; + +typedef struct _RT_ISR_CONTENT +{ + union{ + u32 IntArray[2]; + u32 IntReg4Byte; + u16 IntReg2Byte; + }; +}RT_ISR_CONTENT, *PRT_ISR_CONTENT; + +//#define RegAddr(addr) (addr + 0xB2000000UL) +//some platform macros will def here +static inline void NdisRawWritePortUlong(u32 port, u32 val) +{ + outl(val, port); + //writel(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawWritePortUchar(u32 port, u8 val) +{ + outb(val, port); + //writeb(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUchar(u32 port, u8 *pval) +{ + *pval = inb(port); + //*pval = readb((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUshort(u32 port, u16 *pval) +{ + *pval = inw(port); + //*pval = readw((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUlong(u32 port, u32 *pval) +{ + *pval = inl(port); + //*pval = readl((u8 *)RegAddr(port)); +} + +#ifdef CONFIG_RTL8192C +void rtl8192ce_set_hal_ops(_adapter * padapter); +#endif +#ifdef CONFIG_RTL8192D +void rtl8192de_set_hal_ops(_adapter * padapter); +#endif + +#endif //__PCIE_HAL_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/pci_ops.h b/drivers/net/wireless/rtl8192c/include/pci_ops.h new file mode 100755 index 000000000000..dd63f5f87d43 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/pci_ops.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __PCI_OPS_H_ +#define __PCI_OPS_H_ + +#include +#include +#include +#include + +#ifdef CONFIG_RTL8192C +u32 rtl8192ce_init_desc_ring(_adapter * padapter); +u32 rtl8192ce_free_desc_ring(_adapter * padapter); +void rtl8192ce_reset_desc_ring(_adapter * padapter); +#ifdef CONFIG_64BIT_DMA +u8 PlatformEnable92CEDMA64(PADAPTER Adapter); +#endif +int rtl8192ce_interrupt(PADAPTER Adapter); +void rtl8192ce_xmit_tasklet(void *priv); +void rtl8192ce_recv_tasklet(void *priv); +void rtl8192ce_prepare_bcn_tasklet(void *priv); +void rtl8192ce_set_intf_ops(struct _io_ops *pops); +#endif + +#ifdef CONFIG_RTL8192D +u32 rtl8192de_init_desc_ring(_adapter * padapter); +u32 rtl8192de_free_desc_ring(_adapter * padapter); +void rtl8192de_reset_desc_ring(_adapter * padapter); +#ifdef CONFIG_64BIT_DMA +u8 PlatformEnable92DEDMA64(PADAPTER Adapter); +#endif +int rtl8192de_interrupt(PADAPTER Adapter); +void rtl8192de_xmit_tasklet(void *priv); +void rtl8192de_recv_tasklet(void *priv); +void rtl8192de_prepare_bcn_tasklet(void *priv); +void rtl8192de_set_intf_ops(struct _io_ops *pops); +u32 MpReadPCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u8 Direct); +void MpWritePCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u32 Value, IN u8 Direct); +#endif + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/pci_osintf.h b/drivers/net/wireless/rtl8192c/include/pci_osintf.h new file mode 100755 index 000000000000..09715af43781 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/pci_osintf.h @@ -0,0 +1,33 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __PCI_OSINTF_H +#define __PCI_OSINTF_H + +#include +#include +#include + + +void rtw_pci_disable_aspm(_adapter *padapter); +void rtw_pci_enable_aspm(_adapter *padapter); + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/recv_osdep.h b/drivers/net/wireless/rtl8192c/include/recv_osdep.h new file mode 100755 index 000000000000..536ed3100ae2 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/recv_osdep.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RECV_OSDEP_H_ +#define __RECV_OSDEP_H_ + +#include +#include +#include + + +extern sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); +extern void _rtw_free_recv_priv (struct recv_priv *precvpriv); + + +extern s32 rtw_recv_entry(union recv_frame *precv_frame); +extern int rtw_recv_indicatepkt(_adapter *adapter, union recv_frame *precv_frame); +extern void rtw_recv_returnpacket(IN _nic_hdl cnxt, IN _pkt *preturnedpkt); + +extern void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame); +extern void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup); + + +int rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); +void rtw_free_recv_priv (struct recv_priv *precvpriv); + + +int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter); +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe); +void rtw_os_recv_resource_free(struct recv_priv *precvpriv); + + +int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf); +int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf); + +void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf); + +void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl); + + +#endif // + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h new file mode 100755 index 000000000000..c6f177348b5b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h @@ -0,0 +1,98 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_CMD_H_ +#define __RTL8192C_CMD_H_ + + +enum cmd_msg_element_id +{ + NONE_CMDMSG_EID, + AP_OFFLOAD_EID=0, + SET_PWRMODE_EID=1, + JOINBSS_RPT_EID=2, + RSVD_PAGE_EID=3, + RSSI_4_EID = 4, + RSSI_SETTING_EID=5, + MACID_CONFIG_EID=6, + MACID_PS_MODE_EID=7, + P2P_PS_OFFLOAD_EID=8, + SELECTIVE_SUSPEND_ROF_CMD=9, + P2P_PS_CTW_CMD_EID=32, + MAX_CMDMSG_EID +}; + +struct cmd_msg_parm { + u8 eid; //element id + u8 sz; // sz + u8 buf[6]; +}; + +typedef struct _SETPWRMODE_PARM{ + u8 Mode; + u8 SmartPS; + u8 BcnPassTime; // unit: 100ms +}SETPWRMODE_PARM, *PSETPWRMODE_PARM; + +struct H2C_SS_RFOFF_PARAM{ + u8 ROFOn; // 1: on, 0:off + u16 gpio_period; // unit: 1024 us +}__attribute__ ((packed)); + + +typedef struct JOINBSSRPT_PARM{ + u8 OpMode; // RT_MEDIA_STATUS +}JOINBSSRPT_PARM, *PJOINBSSRPT_PARM; + +typedef struct _RSVDPAGE_LOC{ + u8 LocProbeRsp; + u8 LocPsPoll; + u8 LocNullData; +}RSVDPAGE_LOC, *PRSVDPAGE_LOC; + +struct P2P_PS_Offload_t { + unsigned char Offload_En:1; + unsigned char role:1; // 1: Owner, 0: Client + unsigned char CTWindow_En:1; + unsigned char NoA0_En:1; + unsigned char NoA1_En:1; + unsigned char AllStaSleep:1; // Only valid in Owner + unsigned char discovery:1; + unsigned char rsvd:1; +}; + +struct P2P_PS_CTWPeriod_t { + unsigned char CTWPeriod; //TU +}; + +// host message to firmware cmd +void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode); +void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus); +u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param); +u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg); +void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg); +u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter*padapter,u8 bfwpoll, u16 period); +#ifdef CONFIG_P2P +void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state); +#endif //CONFIG_P2P + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h new file mode 100755 index 000000000000..2e208adb9694 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h @@ -0,0 +1,608 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_DM_H__ +#define __RTL8192C_DM_H__ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ + +#define RSSI_CCK 0 +#define RSSI_OFDM 1 + +#define OFDM_TABLE_SIZE 37 +#define CCK_TABLE_SIZE 33 + +static u32 OFDMSwingTable[OFDM_TABLE_SIZE] = { + 0x7f8001fe, // 0, +6.0dB + 0x788001e2, // 1, +5.5dB + 0x71c001c7, // 2, +5.0dB + 0x6b8001ae, // 3, +4.5dB + 0x65400195, // 4, +4.0dB + 0x5fc0017f, // 5, +3.5dB + 0x5a400169, // 6, +3.0dB + 0x55400155, // 7, +2.5dB + 0x50800142, // 8, +2.0dB + 0x4c000130, // 9, +1.5dB + 0x47c0011f, // 10, +1.0dB + 0x43c0010f, // 11, +0.5dB + 0x40000100, // 12, +0dB + 0x3c8000f2, // 13, -0.5dB + 0x390000e4, // 14, -1.0dB + 0x35c000d7, // 15, -1.5dB + 0x32c000cb, // 16, -2.0dB + 0x300000c0, // 17, -2.5dB + 0x2d4000b5, // 18, -3.0dB + 0x2ac000ab, // 19, -3.5dB + 0x288000a2, // 20, -4.0dB + 0x26000098, // 21, -4.5dB + 0x24000090, // 22, -5.0dB + 0x22000088, // 23, -5.5dB + 0x20000080, // 24, -6.0dB + 0x1e400079, // 25, -6.5dB + 0x1c800072, // 26, -7.0dB + 0x1b00006c, // 27. -7.5dB + 0x19800066, // 28, -8.0dB + 0x18000060, // 29, -8.5dB + 0x16c0005b, // 30, -9.0dB + 0x15800056, // 31, -9.5dB + 0x14400051, // 32, -10.0dB + 0x1300004c, // 33, -10.5dB + 0x12000048, // 34, -11.0dB + 0x11000044, // 35, -11.5dB + 0x10000040, // 36, -12.0dB +}; + +static u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = { +{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB +{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB +{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB +{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB +{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB +{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB +{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB +{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB +{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB +{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB +{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB +{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB +{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB +{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB +{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB +{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB +{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB +{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB +{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB +{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB +{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB +{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB +{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB +{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB +{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB +{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB +{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB +{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB +{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB +{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB +{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB +{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB +{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB +}; + +static u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= { +{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB +{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB +{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB +{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB +{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB +{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB +{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB +{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB +{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB +{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB +{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB +{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB +{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB +{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB +{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB +{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB +{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB +{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB +{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB +{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB +{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB +{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB +{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB +{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB +{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB +{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB +{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB +{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB +{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB +{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB +{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB +{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB +{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB +}; + +//============================================================ +// structure and define +//============================================================ + +typedef struct _FALSE_ALARM_STATISTICS{ + u32 Cnt_Parity_Fail; + u32 Cnt_Rate_Illegal; + u32 Cnt_Crc8_fail; + u32 Cnt_Mcs_fail; + u32 Cnt_Ofdm_fail; + u32 Cnt_Cck_fail; + u32 Cnt_all; + u32 Cnt_Fast_Fsync; + u32 Cnt_SB_Search_fail; +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; + +typedef struct _Dynamic_Power_Saving_ +{ + u8 PreCCAState; + u8 CurCCAState; + + u8 PreRFState; + u8 CurRFState; + + s32 Rssi_val_min; + +}PS_T; + +typedef struct _Dynamic_Initial_Gain_Threshold_ +{ + u8 Dig_Enable_Flag; + u8 Dig_Ext_Port_Stage; + + int RssiLowThresh; + int RssiHighThresh; + + u32 FALowThresh; + u32 FAHighThresh; + + u8 CurSTAConnectState; + u8 PreSTAConnectState; + u8 CurMultiSTAConnectState; + + u8 PreIGValue; + u8 CurIGValue; + + char BackoffVal; + char BackoffVal_range_max; + char BackoffVal_range_min; + u8 rx_gain_range_max; + u8 rx_gain_range_min; + u8 Rssi_val_min; + + u8 PreCCKPDState; + u8 CurCCKPDState; + u8 PreCCKFAState; + u8 CurCCKFAState; + u8 PreCCAState; + u8 CurCCAState; + + u8 LargeFAHit; + u8 ForbiddenIGI; + u32 Recover_cnt; + +}DIG_T; + +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition +{ + DIG_TYPE_THRESH_HIGH = 0, + DIG_TYPE_THRESH_LOW = 1, + DIG_TYPE_BACKOFF = 2, + DIG_TYPE_RX_GAIN_MIN = 3, + DIG_TYPE_RX_GAIN_MAX = 4, + DIG_TYPE_ENABLE = 5, + DIG_TYPE_DISABLE = 6, + DIG_OP_TYPE_MAX +}DM_DIG_OP_E; + +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition +{ + CCK_PD_STAGE_LowRssi = 0, + CCK_PD_STAGE_HighRssi = 1, + CCK_PD_STAGE_MAX = 3, +}DM_CCK_PDTH_E; + +typedef enum tag_1R_CCA_Type_Definition +{ + CCA_1R =0, + CCA_2R = 1, + CCA_MAX = 2, +}DM_1R_CCA_E; + +typedef enum tag_RF_Type_Definition +{ + RF_Save =0, + RF_Normal = 1, + RF_MAX = 2, +}DM_RF_E; + +typedef enum tag_DIG_EXT_PORT_ALGO_Definition +{ + DIG_EXT_PORT_STAGE_0 = 0, + DIG_EXT_PORT_STAGE_1 = 1, + DIG_EXT_PORT_STAGE_2 = 2, + DIG_EXT_PORT_STAGE_3 = 3, + DIG_EXT_PORT_STAGE_MAX = 4, +}DM_DIG_EXT_PORT_ALG_E; + + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + + +typedef enum _BT_Ant_NUM{ + Ant_x2 = 0, + Ant_x1 = 1 +} BT_Ant_NUM, *PBT_Ant_NUM; + +typedef enum _BT_CoType{ + BT_2Wire = 0, + BT_ISSC_3Wire = 1, + BT_Accel = 2, + BT_CSR_BC4 = 3, + BT_CSR_BC8 = 4, + BT_RTL8756 = 5, +} BT_CoType, *PBT_CoType; + +typedef enum _BT_CurState{ + BT_OFF = 0, + BT_ON = 1, +} BT_CurState, *PBT_CurState; + +typedef enum _BT_ServiceType{ + BT_SCO = 0, + BT_A2DP = 1, + BT_HID = 2, + BT_HID_Idle = 3, + BT_Scan = 4, + BT_Idle = 5, + BT_OtherAction = 6, + BT_Busy = 7, + BT_OtherBusy = 8, + BT_PAN = 9, +} BT_ServiceType, *PBT_ServiceType; + +typedef enum _BT_RadioShared{ + BT_Radio_Shared = 0, + BT_Radio_Individual = 1, +} BT_RadioShared, *PBT_RadioShared; + +struct btcoexist_priv { + u8 BT_Coexist; + u8 BT_Ant_Num; + u8 BT_CoexistType; + u8 BT_State; + u8 BT_CUR_State; //0:on, 1:off + u8 BT_Ant_isolation; //0:good, 1:bad + u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic + u8 BT_Service; + u8 BT_Ampdu; // 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. + u8 BT_RadioSharedType; + u32 Ratio_Tx; + u32 Ratio_PRI; + u8 BtRfRegOrigin1E; + u8 BtRfRegOrigin1F; + u8 BtRssiState; + u32 BtEdcaUL; + u32 BtEdcaDL; + u32 BT_EDCA[2]; + u8 bCOBT; + + u8 bInitSet; + u8 bBTBusyTraffic; + u8 bBTTrafficModeSet; + u8 bBTNonTrafficModeSet; + //BTTraffic BT21TrafficStatistics; + u32 CurrentState; + u32 PreviousState; + u8 BtPreRssiState; + u8 bFWCoexistAllOff; + u8 bSWCoexistAllOff; +}; + +#define BW_AUTO_SWITCH_HIGH_LOW 25 +#define BW_AUTO_SWITCH_LOW_HIGH 30 + +#define DM_DIG_THRESH_HIGH 40 +#define DM_DIG_THRESH_LOW 35 + +#define DM_FALSEALARM_THRESH_LOW 400 +#define DM_FALSEALARM_THRESH_HIGH 1000 + +#define DM_DIG_MAX 0x3e +#define DM_DIG_MIN 0x1e //0x22//0x1c + +#define DM_DIG_FA_UPPER 0x32 +#define DM_DIG_FA_LOWER 0x20 +#define DM_DIG_FA_TH0 0x20 +#define DM_DIG_FA_TH1 0x100 +#define DM_DIG_FA_TH2 0x200 + +#define DM_DIG_BACKOFF_MAX 12 +#define DM_DIG_BACKOFF_MIN (-4) +#define DM_DIG_BACKOFF_DEFAULT 10 + +#define RxPathSelection_SS_TH_low 30 +#define RxPathSelection_diff_TH 18 + +#define DM_RATR_STA_INIT 0 +#define DM_RATR_STA_HIGH 1 +#define DM_RATR_STA_MIDDLE 2 +#define DM_RATR_STA_LOW 3 + +#define CTSToSelfTHVal 30 +#define RegC38_TH 20 + +#define WAIotTHVal 25 + +//Dynamic Tx Power Control Threshold +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 + +#define TxHighPwrLevel_Normal 0 +#define TxHighPwrLevel_Level1 1 +#define TxHighPwrLevel_Level2 2 +#define TxHighPwrLevel_BT1 3 +#define TxHighPwrLevel_BT2 4 + +#define DM_Type_ByFW 0 +#define DM_Type_ByDriver 1 + + +typedef struct _RATE_ADAPTIVE +{ + u8 RateAdaptiveDisabled; + u8 RATRState; + u16 reserve; + + u32 HighRSSIThreshForRA; + u32 High2LowRSSIThreshForRA; + u8 Low2HighRSSIThreshForRA40M; + u32 LowRSSIThreshForRA40M; + u8 Low2HighRSSIThreshForRA20M; + u32 LowRSSIThreshForRA20M; + u32 UpperRSSIThresholdRATR; + u32 MiddleRSSIThresholdRATR; + u32 LowRSSIThresholdRATR; + u32 LowRSSIThresholdRATR40M; + u32 LowRSSIThresholdRATR20M; + u8 PingRSSIEnable; //cosa add for Netcore long range ping issue + u32 PingRSSIRATR; //cosa add for Netcore long range ping issue + u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue + u32 LastRATR; + u8 PreRATRState; + +} RATE_ADAPTIVE, *PRATE_ADAPTIVE; + +typedef enum tag_SW_Antenna_Switch_Definition +{ + Antenna_B = 1, + Antenna_A = 2, + Antenna_MAX = 3, +}DM_SWAS_E; + +#ifdef CONFIG_ANTENNA_DIVERSITY +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + +typedef struct _SW_Antenna_Switch_ +{ + u8 try_flag; + s32 PreRSSI; + u8 CurAntenna; + u8 PreAntenna; + u8 RSSI_Trying; + u8 TestMode; + u8 bTriggerAntennaSwitch; + u8 SelectAntennaMap; + // Before link Antenna Switch check + u8 SWAS_NoLink_State; + +}SWAT_T; + + +#endif + + +struct dm_priv +{ + u8 DM_Type; + u8 DMFlag, DMFlag_tmp; + + + //for DIG + u8 bDMInitialGainEnable; + u8 binitialized; // for dm_initial_gain_Multi_STA use. + DIG_T DM_DigTable; + + PS_T DM_PSTable; + + FALSE_ALARM_STATISTICS FalseAlmCnt; + + //for rate adaptive, in fact, 88c/92c fw will handle this + u8 bUseRAMask; + RATE_ADAPTIVE RateAdaptive; + + //* Upper and Lower Signal threshold for Rate Adaptive*/ + int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedCCK; + int EntryMinUndecoratedSmoothedPWDB; + int EntryMaxUndecoratedSmoothedPWDB; + + + //for High Power + u8 bDynamicTxPowerEnable; + u8 LastDTPLvl; + u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 + + //for tx power tracking + //u8 bTXPowerTracking; + u8 TXPowercount; + u8 bTXPowerTrackingInit; + u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default + u8 TM_Trigger; + + u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 + u8 ThermalValue; + u8 ThermalValue_LCK; + u8 ThermalValue_IQK; + u8 ThermalValue_DPK; + + u8 bRfPiEnable; + + //for APK + u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a + u8 bAPKdone; + u8 bAPKThermalMeterIgnore; + u8 bDPdone; + u8 bDPPathAOK; + u8 bDPPathBOK; + + //for IQK + u32 RegC04; + u32 Reg874; + u32 RegC08; + u32 RegB68; + u32 RegB6C; + u32 Reg870; + u32 Reg860; + u32 Reg864; + u32 ADDA_backup[IQK_ADDA_REG_NUM]; + u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; + u32 IQK_BB_backup_recover[9]; + u32 IQK_BB_backup[IQK_BB_REG_NUM]; + u8 PowerIndex_backup[6]; + + u8 bCCKinCH14; + + char CCK_index; + char OFDM_index[2]; + + BOOLEAN bDoneTxpower; + char CCK_index_HP; + char OFDM_index_HP[2]; + u8 ThermalValue_HP[HP_THERMAL_NUM]; + u8 ThermalValue_HP_index; + + //for TxPwrTracking + int RegE94; + int RegE9C; + int RegEB4; + int RegEBC; + + u32 TXPowerTrackingCallbackCnt; //cosa add for debug + + u32 prv_traffic_idx; // edca turbo + + // for dm_RF_Saving + u8 initialize; + u32 rf_saving_Reg874; + u32 rf_saving_RegC70; + u32 rf_saving_Reg85C; + u32 rf_saving_RegA74; + + //for Antenna diversity +#ifdef CONFIG_ANTENNA_DIVERSITY + SWAT_T DM_SWAT_Table; +#endif +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _timer SwAntennaSwitchTimer; + + u64 lastTxOkCnt; + u64 lastRxOkCnt; + u64 TXByteCnt_A; + u64 TXByteCnt_B; + u64 RXByteCnt_A; + u64 RXByteCnt_B; + u8 DoubleComfirm; + u8 TrafficLoad; +#endif + + s32 OFDM_Pkt_Cnt; + u8 RSSI_Select; + u8 DIG_Dynamic_MIN ; + + // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas + u8 INIDATA_RATE[32]; +}; + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ +//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} + + +//============================================================ +// function prototype +//============================================================ +void rtl8192c_init_dm_priv(IN PADAPTER Adapter); +void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter); +void rtl8192c_InitHalDm(IN PADAPTER Adapter); +void rtl8192c_HalDmWatchDog(IN PADAPTER Adapter); + +VOID rtl8192c_dm_CheckTXPowerTracking(IN PADAPTER Adapter); + +void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal); + +#ifdef CONFIG_BT_COEXIST +void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart); +void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir); +#endif + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY +void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll); +void SwAntDivRestAfterLink8192C(IN PADAPTER Adapter); +#endif +#ifdef CONFIG_ANTENNA_DIVERSITY +void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); +u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter); +#endif + +#endif //__HAL8190PCIDM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h new file mode 100755 index 000000000000..a43f99f2d2a9 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h @@ -0,0 +1,29 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_EVENT_H_ +#define _RTL8192C_EVENT_H_ + + + + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h new file mode 100755 index 000000000000..85ce86e8d229 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h @@ -0,0 +1,879 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_HAL_H__ +#define __RTL8192C_HAL_H__ + +#include "rtl8192c_spec.h" +#include "Hal8192CPhyReg.h" +#include "Hal8192CPhyCfg.h" +#include "rtl8192c_rf.h" +#include "rtl8192c_dm.h" +#include "rtl8192c_recv.h" +#include "rtl8192c_xmit.h" +#include "rtl8192c_cmd.h" +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +#include "rtl8192c_sreset.h" +#endif + +#ifdef CONFIG_PCI_HCI + + #include "Hal8192CEHWImg.h" + + #define RTL819X_DEFAULT_RF_TYPE RF_2T2R + //#define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //2TODO: The following need to check!! + #define RTL8192C_FW_TSMC_IMG "rtl8192CE\\rtl8192cfwT.bin" + #define RTL8192C_FW_UMC_IMG "rtl8192CE\\rtl8192cfwU.bin" + #define RTL8192C_FW_UMC_B_IMG "rtl8192CE\\rtl8192cfwU_B.bin" + + #define RTL8188C_PHY_REG "rtl8192CE\\PHY_REG_1T.txt" + #define RTL8188C_PHY_RADIO_A "rtl8192CE\\radio_a_1T.txt" + #define RTL8188C_PHY_RADIO_B "rtl8192CE\\radio_b_1T.txt" + #define RTL8188C_AGC_TAB "rtl8192CE\\AGC_TAB_1T.txt" + #define RTL8188C_PHY_MACREG "rtl8192CE\\MACREG_1T.txt" + + #define RTL8192C_PHY_REG "rtl8192CE\\PHY_REG_2T.txt" + #define RTL8192C_PHY_RADIO_A "rtl8192CE\\radio_a_2T.txt" + #define RTL8192C_PHY_RADIO_B "rtl8192CE\\radio_b_2T.txt" + #define RTL8192C_AGC_TAB "rtl8192CE\\AGC_TAB_2T.txt" + #define RTL8192C_PHY_MACREG "rtl8192CE\\MACREG_2T.txt" + + #define RTL819X_PHY_MACPHY_REG "rtl8192CE\\MACPHY_reg.txt" + #define RTL819X_PHY_MACPHY_REG_PG "rtl8192CE\\MACPHY_reg_PG.txt" + #define RTL819X_PHY_MACREG "rtl8192CE\\MAC_REG.txt" + #define RTL819X_PHY_REG "rtl8192CE\\PHY_REG.txt" + #define RTL819X_PHY_REG_1T2R "rtl8192CE\\PHY_REG_1T2R.txt" + #define RTL819X_PHY_REG_to1T1R "rtl8192CE\\phy_to1T1R_a.txt" + #define RTL819X_PHY_REG_to1T2R "rtl8192CE\\phy_to1T2R.txt" + #define RTL819X_PHY_REG_to2T2R "rtl8192CE\\phy_to2T2R.txt" + #define RTL819X_PHY_REG_PG "rtl8192CE\\PHY_REG_PG.txt" + #define RTL819X_AGC_TAB "rtl8192CE\\AGC_TAB.txt" + #define RTL819X_PHY_RADIO_A "rtl8192CE\\radio_a.txt" + #define RTL819X_PHY_RADIO_A_1T "rtl8192CE\\radio_a_1t.txt" + #define RTL819X_PHY_RADIO_A_2T "rtl8192CE\\radio_a_2t.txt" + #define RTL819X_PHY_RADIO_B "rtl8192CE\\radio_b.txt" + #define RTL819X_PHY_RADIO_B_GM "rtl8192CE\\radio_b_gm.txt" + #define RTL819X_PHY_RADIO_C "rtl8192CE\\radio_c.txt" + #define RTL819X_PHY_RADIO_D "rtl8192CE\\radio_d.txt" + #define RTL819X_EEPROM_MAP "rtl8192CE\\8192ce.map" + #define RTL819X_EFUSE_MAP "rtl8192CE\\8192ce.map" + +//--------------------------------------------------------------------- +// RTL8723E From file +//--------------------------------------------------------------------- + #define RTL8723_FW_UMC_IMG "rtl8723E\\rtl8723fw.bin" + #define RTL8723_PHY_REG "rtl8723E\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723E\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723E\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723E\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt" + #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723E\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723E\\PHY_REG_MP.txt" + + // The file name "_2T" is for 92CE, "_1T" is for 88CE. Modified by tynli. 2009.11.24. + #define Rtl819XFwTSMCImageArray Rtl8192CEFwTSMCImgArray + #define Rtl819XFwUMCACutImageArray Rtl8192CEFwUMCACutImgArray + #define Rtl819XFwUMCBCutImageArray Rtl8192CEFwUMCBCutImgArray + + #define Rtl8723FwUMCImageArray Rtl8192CEFwUMC8723ImgArray + #define Rtl819XMAC_Array Rtl8192CEMAC_2T_Array + #define Rtl819XAGCTAB_2TArray Rtl8192CEAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192CEAGCTAB_1TArray + #define Rtl819XPHY_REG_2TArray Rtl8192CEPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192CEPHY_REG_1TArray + #define Rtl819XRadioA_2TArray Rtl8192CERadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192CERadioA_1TArray + #define Rtl819XRadioB_2TArray Rtl8192CERadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192CERadioB_1TArray + #define Rtl819XPHY_REG_Array_PG Rtl8192CEPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_MP Rtl8192CEPHY_REG_Array_MP + +#elif defined(CONFIG_USB_HCI) + + #include "Hal8192CUHWImg.h" + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //TODO: The following need to check!! + #define RTL8192C_FW_TSMC_IMG "rtl8192CU\\rtl8192cfwT.bin" + #define RTL8192C_FW_UMC_IMG "rtl8192CU\\rtl8192cfwU.bin" + #define RTL8192C_FW_UMC_B_IMG "rtl8192CU\\rtl8192cfwU_B.bin" + + //#define RTL819X_FW_BOOT_IMG "rtl8192CU\\boot.img" + //#define RTL819X_FW_MAIN_IMG "rtl8192CU\\main.img" + //#define RTL819X_FW_DATA_IMG "rtl8192CU\\data.img" + + #define RTL8188C_PHY_REG "rtl8188CU\\PHY_REG.txt" + #define RTL8188C_PHY_RADIO_A "rtl8188CU\\radio_a.txt" + #define RTL8188C_PHY_RADIO_B "rtl8188CU\\radio_b.txt" + #define RTL8188C_PHY_RADIO_A_mCard "rtl8192CU\\radio_a_1T_mCard.txt" + #define RTL8188C_PHY_RADIO_B_mCard "rtl8192CU\\radio_b_1T_mCard.txt" + #define RTL8188C_PHY_RADIO_A_HP "rtl8192CU\\radio_a_1T_HP.txt" + #define RTL8188C_AGC_TAB "rtl8188CU\\AGC_TAB.txt" + #define RTL8188C_PHY_MACREG "rtl8188CU\\MACREG.txt" + + #define RTL8192C_PHY_REG "rtl8192CU\\PHY_REG.txt" + #define RTL8192C_PHY_RADIO_A "rtl8192CU\\radio_a.txt" + #define RTL8192C_PHY_RADIO_B "rtl8192CU\\radio_b.txt" + #define RTL8192C_AGC_TAB "rtl8192CU\\AGC_TAB.txt" + #define RTL8192C_PHY_MACREG "rtl8192CU\\MACREG.txt" + + #define RTL819X_PHY_REG_PG "rtl8192CU\\PHY_REG_PG.txt" + +//--------------------------------------------------------------------- +// RTL8723U From file +//--------------------------------------------------------------------- + #define RTL8723_FW_UMC_IMG "rtl8723U\\rtl8723fw.bin" + #define RTL8723_PHY_REG "rtl8723U\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723U\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723U\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723U\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt" + #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723U\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723U\\PHY_REG_MP.txt" + + // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24. + #define Rtl819XFwImageArray Rtl8192CUFwTSMCImgArray + #define Rtl819XFwTSMCImageArray Rtl8192CUFwTSMCImgArray + #define Rtl819XFwUMCACutImageArray Rtl8192CUFwUMCACutImgArray + #define Rtl819XFwUMCBCutImageArray Rtl8192CUFwUMCBCutImgArray + + #define Rtl819XMAC_Array Rtl8192CUMAC_2T_Array + #define Rtl819XAGCTAB_2TArray Rtl8192CUAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192CUAGCTAB_1TArray + #define Rtl819XAGCTAB_1T_HPArray Rtl8192CUAGCTAB_1T_HPArray + #define Rtl819XPHY_REG_2TArray Rtl8192CUPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192CUPHY_REG_1TArray + #define Rtl819XPHY_REG_1T_mCardArray Rtl8192CUPHY_REG_1T_mCardArray + #define Rtl819XPHY_REG_2T_mCardArray Rtl8192CUPHY_REG_2T_mCardArray + #define Rtl819XPHY_REG_1T_HPArray Rtl8192CUPHY_REG_1T_HPArray + #define Rtl819XRadioA_2TArray Rtl8192CURadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192CURadioA_1TArray + #define Rtl819XRadioA_1T_mCardArray Rtl8192CURadioA_1T_mCardArray + #define Rtl819XRadioB_2TArray Rtl8192CURadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192CURadioB_1TArray + #define Rtl819XRadioB_1T_mCardArray Rtl8192CURadioB_1T_mCardArray + #define Rtl819XRadioA_1T_HPArray Rtl8192CURadioA_1T_HPArray + #define Rtl819XPHY_REG_Array_PG Rtl8192CUPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_PG_mCard Rtl8192CUPHY_REG_Array_PG_mCard + #define Rtl819XPHY_REG_Array_PG_HP Rtl8192CUPHY_REG_Array_PG_HP + #define Rtl819XPHY_REG_Array_MP Rtl8192CUPHY_REG_Array_MP +#endif + +#define DRVINFO_SZ 4 // unit is 8bytes +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) + +#define FW_8192C_SIZE 16384+32//16k +#define FW_8192C_START_ADDRESS 0x1000 +#define FW_8192C_END_ADDRESS 0x3FFF + +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes + +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300) + +typedef enum _FIRMWARE_SOURCE{ + FW_SOURCE_IMG_FILE = 0, + FW_SOURCE_HEADER_FILE = 1, //from header file +}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; + +typedef struct _RT_FIRMWARE{ + FIRMWARE_SOURCE eFWSource; + #ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; + #else + u8 szFwBuffer[FW_8192C_SIZE]; + #endif + u32 ulFwLength; +}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92C, *PRT_FIRMWARE_92C; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8192C_FIRMWARE_HDR {//8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; + +}RT_8192C_FIRMWARE_HDR, *PRT_8192C_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME 0x05 +#define BCN_DMA_ATIME_INT_TIME 0x02 + +#ifdef CONFIG_USB_RX_AGGREGATION + +typedef enum _USB_RX_AGG_MODE{ + USB_RX_AGG_DISABLE, + USB_RX_AGG_DMA, + USB_RX_AGG_USB, + USB_RX_AGG_MIX +}USB_RX_AGG_MODE; + +#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer + +#endif + + +#define TX_SELE_HQ BIT(0) // High Queue +#define TX_SELE_LQ BIT(1) // Low Queue +#define TX_SELE_NQ BIT(2) // Normal Queue + + +// Note: We will divide number of page equally for each queue other than public queue! + +#define TX_TOTAL_PAGE_NUMBER 0xF8 +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define NORMAL_PAGE_NUM_PUBQ 0xE7 +#define NORMAL_PAGE_NUM_HPQ 0x0C +#define NORMAL_PAGE_NUM_LPQ 0x02 +#define NORMAL_PAGE_NUM_NPQ 0x02 + + +// For Test Chip Setting +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define TEST_PAGE_NUM_PUBQ 0x7E + + +// For Test Chip Setting +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 +#define WMM_TEST_PAGE_NUM_HPQ 0x29 +#define WMM_TEST_PAGE_NUM_LPQ 0x29 + + +//Note: For Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 +#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) +#define CHIP_BONDING_92C_1T2R 0x1 +#define CHIP_BONDING_88C_USB_MCARD 0x2 +#define CHIP_BONDING_88C_USB_HP 0x1 + +// +// 2011.01.06. Define new structure of chip version for RTL8723 and so on. Added by tynli. +// +/* + | BIT15:12 | BIT11:8 | BIT 7 | BIT6:4 | BIT3 | BIT2:0 | + |-------------+-----------+-----------+-------+-----------+-------| + | IC version(CUT) | ROM version | Manufacturer | RF type | Chip type | IC Type | + | | | TSMC/UMC | | TEST/NORMAL| | +*/ +// [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3 +// [7] Manufacturer: TSMC=0, UMC=1 +// [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2 +// [3] Chip type: TEST=0, NORMAL=1 +// [2:0] IC type: 81xxC=0, 8723=1, 92D=2 + +#define CHIP_8723 BIT(0) +#define CHIP_92D BIT(1) +#define NORMAL_CHIP BIT(3) +#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6))) +#define RF_TYPE_1T2R BIT(4) +#define RF_TYPE_2T2R BIT(5) +#define CHIP_VENDOR_UMC BIT(7) +#define B_CUT_VERSION BIT(12) +#define C_CUT_VERSION BIT(13) +#define D_CUT_VERSION ((BIT(13)|BIT(14))) + + +// MASK +#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2)) +#define CHIP_TYPE_MASK BIT(3) +#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6)) +#define MANUFACTUER_MASK BIT(7) +#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8)) +#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12)) + +// Get element +#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK) +#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK) +#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK) +#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK) +#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK) +#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK) + +#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0)? _TRUE : _FALSE) +#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723)? _TRUE : _FALSE) +#define IS_92D(version) ((GET_CVID_IC_TYPE(version) == CHIP_92D)? _TRUE : _FALSE) +#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version))? _FALSE : _TRUE) +#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? _TRUE : _FALSE) +#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? _TRUE : _FALSE) +#define IS_NORMAL_CHIP(version) ((GET_CVID_CHIP_TYPE(version))? _TRUE: _FALSE) +#define IS_CHIP_VENDOR_UMC(version) ((GET_CVID_MANUFACTUER(version))? _TRUE: _FALSE) + +#define IS_81XXC_TEST_CHIP(version) ((IS_81XXC(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE) +#define IS_92D_TEST_CHIP(version) ((IS_92D(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE) +#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ? _TRUE : _FALSE) +#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE) +#define IS_VENDOR_8723_A_CUT(version) ((IS_8723_SERIES(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE) +// 88/92C UMC B-cut vendor is set to TSMC so we need to check CHIP_VENDOR_UMC bit is not 1. +#define IS_81xxC_VENDOR_UMC_B_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? _TRUE : _FALSE):_FALSE) +#define IS_92D_SINGLEPHY(version) ((IS_92D(version)) ? (IS_2T2R(version) ? _TRUE: _FALSE) : _FALSE) +#define IS_92D_C_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x2) ? _TRUE : _FALSE) : _FALSE) +#define IS_92D_D_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x3) ? _TRUE : _FALSE) : _FALSE) + +typedef enum _VERSION_8192C{ + VERSION_TEST_CHIP_88C = 0x0000, + VERSION_TEST_CHIP_92C = 0x0020, + VERSION_TEST_UMC_CHIP_8723 = 0x0081, + VERSION_NORMAL_TSMC_CHIP_88C = 0x0008, + VERSION_NORMAL_TSMC_CHIP_92C = 0x0028, + VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x0018, + VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x0088, + VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x00a8, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x0098, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x0089, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x1089, + VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x1088, + VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x10a8, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x1090, + VERSION_TEST_CHIP_92D_SINGLEPHY= 0x0022, + VERSION_TEST_CHIP_92D_DUALPHY = 0x0002, + VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x002a, + VERSION_NORMAL_CHIP_92D_DUALPHY = 0x000a, + VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x202a, + VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x200a, + VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0x302a, + VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x300a, +}VERSION_8192C,*PVERSION_8192C; + + + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- +enum ChannelPlan{ + CHPL_FCC = 0, + CHPL_IC = 1, + CHPL_ETSI = 2, + CHPL_SPAIN = 3, + CHPL_FRANCE = 4, + CHPL_MKK = 5, + CHPL_MKK1 = 6, + CHPL_ISRAEL = 7, + CHPL_TELEC = 8, + CHPL_GLOBAL = 9, + CHPL_WORLD = 10, +}; + +typedef struct _TxPowerInfo{ + u8 CCKIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_1SIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_2SIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20IndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 OFDMIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 TSSI_A; + u8 TSSI_B; +}TxPowerInfo, *PTxPowerInfo; + +#define EFUSE_REAL_CONTENT_LEN 512 +#define EFUSE_MAP_LEN 128 +#define EFUSE_MAX_SECTION 16 +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) +// +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 1byte|----8bytes----|1byte|--5bytes--| +// | | Reserved(14bytes) | +// +#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. + + +#define EFUSE_MAP_LEN_8723 256 +#define EFUSE_MAX_SECTION_8723 32 + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +// +// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. +// +typedef enum _RT_MULTI_FUNC{ + RT_MULTI_FUNC_NONE = 0x00, + RT_MULTI_FUNC_WIFI = 0x01, + RT_MULTI_FUNC_BT = 0x02, + RT_MULTI_FUNC_GPS = 0x04, +}RT_MULTI_FUNC,*PRT_MULTI_FUNC; + +// +// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. +// +typedef enum _RT_POLARITY_CTL{ + RT_POLARITY_LOW_ACT = 0, + RT_POLARITY_HIGH_ACT = 1, +}RT_POLARITY_CTL,*PRT_POLARITY_CTL; + +// For RTL8723 regulator mode. by tynli. 2011.01.14. +typedef enum _RT_REGULATOR_MODE{ + RT_SWITCHING_REGULATOR = 0, + RT_LDO_REGULATOR = 1, +}RT_REGULATOR_MODE,*PRT_REGULATOR_MODE; + +#ifdef CONFIG_PCI_HCI +struct hal_data_8192ce +{ + VERSION_8192C VersionID; + RT_MULTI_FUNC MultiFunc; // For multi-function consideration. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + u32 IntrMask[2]; + u32 IntrMaskToSet[2]; + + u32 DisabledFunctions; + + //current WIFI_PHY values + u32 ReceiveConfig; + u32 TransmitConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + + u16 BasicRateSet; + + //rf_ctrl + _lock rf_lock; + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + INTERFACE_SELECT_8192CPCIe InterfaceSel; + + // + // EEPROM setting. + // + u16 EEPROMVID; + u16 EEPROMDID; + u16 EEPROMSVID; + u16 EEPROMSMID; + u16 EEPROMChannelPlan; + u16 EEPROMVersion; + + u8 EEPROMChnlAreaTxPwrCCK[2][3]; + u8 EEPROMChnlAreaTxPwrHT40_1S[2][3]; + u8 EEPROMChnlAreaTxPwrHT40_2SDiff[2][3]; + u8 EEPROMPwrLimitHT20[3]; + u8 EEPROMPwrLimitHT40[3]; + + u8 bTXPowerDataReadFromEEPORM; + u8 EEPROMThermalMeter; + u8 EEPROMTSSI[2]; + + u8 EEPROMCustomerID; + u8 EEPROMBoardType; + u8 EEPROMRegulatory; + + u8 bDefaultAntenna; + u8 bIQKInitialized; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[7][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + + //u32 LedControlNum; + //u32 LedControlMode; + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + //RDG enable + BOOLEAN bRDGEnable; + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + u8 CurAntenna; + u8 AntDivCfg; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //SW Antenna Switch + s32 RSSI_sum_A; + s32 RSSI_sum_B; + s32 RSSI_cnt_A; + s32 RSSI_cnt_B; + BOOLEAN RSSI_test; +#endif +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + u32 CCK_Ant1_Cnt; + u32 CCK_Ant2_Cnt; + u32 OFDM_Ant1_Cnt; + u32 OFDM_Ant2_Cnt; +#endif + + struct dm_priv dmpriv; + u8 bDumpRxPkt;//for debug +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + struct sreset_priv srestpriv; +#endif + u8 bInterruptMigration; + u8 bDisableTxInt; + u8 bGpioHwWpsPbc; + + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + u16 EfuseUsedBytes; + +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192ce HAL_DATA_TYPE, *PHAL_DATA_TYPE; + +// +// Function disabled. +// +#define DF_TX_BIT BIT0 +#define DF_RX_BIT BIT1 +#define DF_IO_BIT BIT2 +#define DF_IO_D3_BIT BIT3 + +#define RT_DF_TYPE u32 +#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits))) +#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits)))) +#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) +#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) + +void InterruptRecognized8192CE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); +VOID UpdateInterruptMask8192CE(PADAPTER Adapter, u32 AddMSR, u32 RemoveMSR); +#endif + +#ifdef CONFIG_USB_HCI +struct hal_data_8192cu +{ + VERSION_8192C VersionID; + RT_MULTI_FUNC MultiFunc; // For multi-function consideration. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + //current WIFI_PHY values + u32 ReceiveConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + + u16 BasicRateSet; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + u8 BoardType; + //INTERFACE_SELECT_8192CUSB InterfaceSel; + + // + // EEPROM setting. + // + u16 EEPROMVID; + u16 EEPROMPID; + u16 EEPROMSVID; + u16 EEPROMSDID; + u8 EEPROMCustomerID; + u8 EEPROMSubCustomerID; + u8 EEPROMVersion; + u8 EEPROMRegulatory; + + u8 bTXPowerDataReadFromEEPORM; + u8 EEPROMThermalMeter; + + u8 bIQKInitialized; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[7][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + //RDG enable + BOOLEAN bRDGEnable; + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + + struct dm_priv dmpriv; +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + struct sreset_priv srestpriv; +#endif + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + u8 CurAntenna; + u8 AntDivCfg; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //SW Antenna Switch + s32 RSSI_sum_A; + s32 RSSI_sum_B; + s32 RSSI_cnt_A; + s32 RSSI_cnt_B; + BOOLEAN RSSI_test; +#endif +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + u32 CCK_Ant1_Cnt; + u32 CCK_Ant2_Cnt; + u32 OFDM_Ant1_Cnt; + u32 OFDM_Ant2_Cnt; +#endif + + u8 bDumpRxPkt;//for debug + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + // 2010/08/09 MH Add CU power down mode. + BOOLEAN pwrdown; + + // For 92C USB endpoint setting + // + + u32 UsbBulkOutSize; + + int RtBulkOutPipe[3]; + int RtBulkInPipe; + int RtIntInPipe; + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u8 OutEpQueueSel; + u8 OutEpNumber; + + u8 Queue2EPNum[8];//for out endpoint number mapping + +#ifdef CONFIG_USB_TX_AGGREGATION + u8 UsbTxAggMode; + u8 UsbTxAggDescNum; +#endif +#ifdef CONFIG_USB_RX_AGGREGATION + u16 HwRxPageSize; // Hardware setting + u32 MaxUsbRxAggBlock; + + USB_RX_AGG_MODE UsbRxAggMode; + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed + u8 UsbRxAggBlockTimeout; + u8 UsbRxAggPageCount; // 8192C DMA page count + u8 UsbRxAggPageTimeout; +#endif + + // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. + BOOLEAN UsbRxHighSpeedMode; + + // 2010/11/22 MH Add for slim combo debug mode selective. + // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. + BOOLEAN SlimComboDbg; + + u16 EfuseUsedBytes; + +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192cu HAL_DATA_TYPE, *PHAL_DATA_TYPE; +#endif + +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +VOID rtl8192c_FirmwareSelfReset(IN PADAPTER Adapter); +int FirmwareDownload92C(IN PADAPTER Adapter); +VOID InitializeFirmwareVars92C(PADAPTER Adapter); +u8 GetEEPROMSize8192C(PADAPTER Adapter); +RT_CHANNEL_DOMAIN _HalMapChannelPlan8192C(PADAPTER Adapter, u8 HalChannelPlan); +VERSION_8192C rtl8192c_ReadChipVersion(IN PADAPTER Adapter); +void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail); +void rtl8192c_HalSetBrateCfg(PADAPTER Adapter, u8 *mBratesOS, u16 *pBrateCfg); +//void rtl8192c_free_hal_data(_adapter * padapter); +VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo); +void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h new file mode 100755 index 000000000000..4ddd9c855d58 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h @@ -0,0 +1,43 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_LED_H_ +#define __RTL8192C_LED_H_ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8192cu_InitSwLeds(_adapter *padapter); +void rtl8192cu_DeInitSwLeds(_adapter *padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8192ce_gen_RefreshLedState(PADAPTER Adapter); +void rtl8192ce_InitSwLeds(_adapter *padapter); +void rtl8192ce_DeInitSwLeds(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h new file mode 100755 index 000000000000..99805f455fae --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h @@ -0,0 +1,182 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_RECV_H_ +#define _RTL8192C_RECV_H_ + +#include +#include +#include + + +#ifdef PLATFORM_OS_XP + #define NR_RECVBUFF (16) +#elif defined(PLATFORM_OS_CE) + #define NR_RECVBUFF (4) +#else +#ifdef CONFIG_SPECIFIC_URB_NUM + #define NR_RECVBUFF (1) +#else + #define NR_RECVBUFF (4) +#endif + #define NR_PREALLOC_RECV_SKB (8) +#endif + + +#define RECV_BLK_SZ 512 +#define RECV_BLK_CNT 16 +#define RECV_BLK_TH RECV_BLK_CNT + +#if defined(CONFIG_USB_HCI) + +#ifdef PLATFORM_OS_CE +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k +#else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + //#define MAX_RECVBUF_SZ (32768) // 32k + //#define MAX_RECVBUF_SZ (16384) //16K + //#define MAX_RECVBUF_SZ (10240) //10K + #define MAX_RECVBUF_SZ (15360) // 15k < 16k + //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k + #else + #define MAX_RECVBUF_SZ (4000) // about 4K + #endif +#endif + +#elif defined(CONFIG_PCI_HCI) +#ifndef CONFIG_MINIMAL_MEMORY_USAGE + #define MAX_RECVBUF_SZ (9100) +#else + #define MAX_RECVBUF_SZ (4000) // about 4K +#endif + +#define RX_MPDU_QUEUE 0 +#define RX_CMD_QUEUE 1 +#define RX_MAX_QUEUE 2 +#endif + + +#define RECV_BULK_IN_ADDR 0x80 +#define RECV_INT_IN_ADDR 0x81 + +#define PHY_RSSI_SLID_WIN_MAX 100 +#define PHY_LINKQUALITY_SLID_WIN_MAX 20 + + +struct phy_stat +{ + unsigned int phydw0; + + unsigned int phydw1; + + unsigned int phydw2; + + unsigned int phydw3; + + unsigned int phydw4; + + unsigned int phydw5; + + unsigned int phydw6; + + unsigned int phydw7; +}; + +typedef struct _Phy_OFDM_Rx_Status_Report_8192cd +{ + unsigned char trsw_gain_X[4]; + unsigned char pwdb_all; + unsigned char cfosho_X[4]; + unsigned char cfotail_X[4]; + unsigned char rxevm_X[2]; + unsigned char rxsnr_X[4]; + unsigned char pdsnr_X[2]; + unsigned char csi_current_X[2]; + unsigned char csi_target_X[2]; + unsigned char sigevm; + unsigned char max_ex_pwr; +//#ifdef RTL8192SE +#ifdef CONFIG_LITTLE_ENDIAN + unsigned char ex_intf_flg:1; + unsigned char sgi_en:1; + unsigned char rxsc:2; + //unsigned char rsvd:4; + unsigned char idle_long:1; + unsigned char r_ant_train_en:1; + unsigned char ANTSELB:1; + unsigned char ANTSEL:1; +#else // _BIG_ENDIAN_ + //unsigned char rsvd:4; + unsigned char ANTSEL:1; + unsigned char ANTSELB:1; + unsigned char r_ant_train_en:1; + unsigned char idle_long:1; + unsigned char rxsc:2; + unsigned char sgi_en:1; + unsigned char ex_intf_flg:1; +#endif +//#else // RTL8190, RTL8192E +// unsigned char sgi_en; +// unsigned char rxsc_sgien_exflg; +//#endif +} __attribute__ ((packed))PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD; + +typedef struct _Phy_CCK_Rx_Status_Report_8192cd +{ + /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend + 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */ + u8 adc_pwdb_X[4]; + u8 SQ_rpt; + u8 cck_agc_rpt; +} PHY_STS_CCK_8192CD_T; + + +// Rx smooth factor +#define Rx_Smooth_Factor (20) + + +#ifdef CONFIG_USB_HCI +typedef struct _INTERRUPT_MSG_FORMAT_EX{ + unsigned int C2H_MSG0; + unsigned int C2H_MSG1; + unsigned int C2H_MSG2; + unsigned int C2H_MSG3; + unsigned int HISR; // from HISR Reg0x124, read to clear + unsigned int HISRE;// from HISRE Reg0x12c, read to clear + unsigned int MSG_EX; +}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX; + +void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +int rtl8192cu_init_recv_priv(_adapter * padapter); +void rtl8192cu_free_recv_priv(_adapter * padapter); +void rtl8192cu_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +#ifdef CONFIG_PCI_HCI +int rtl8192ce_init_recv_priv(_adapter * padapter); +void rtl8192ce_free_recv_priv(_adapter * padapter); +void rtl8192ce_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); +void rtl8192c_process_phy_info(_adapter *padapter, void *prframe); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h new file mode 100755 index 000000000000..76c8a7880ac7 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h @@ -0,0 +1,93 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192c_rf.h ( Header File) + * + * Note: Collect every HAL RF type exter API or constant. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * + * +******************************************************************************/ +#ifndef _RTL8192C_RF_H_ +#define _RTL8192C_RF_H_ +/* Check to see if the file has been included already. */ + + +/*--------------------------Define Parameters-------------------------------*/ + +// +// For RF 6052 Series +// +#define RF6052_MAX_TX_PWR 0x3F +#define RF6052_MAX_REG 0x3F +#define RF6052_MAX_PATH 2 +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ + +// +// RF RL6052 Series API +// +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate); +void rtl8192c_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth); +VOID rtl8192c_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel); +VOID rtl8192c_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel); +int PHY_RF6052_Config8192C( IN PADAPTER Adapter ); + +/*--------------------------Exported Function prototype---------------------*/ + + +#endif/* End of HalRf.h */ + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h new file mode 100755 index 000000000000..cabd8b8f7851 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h @@ -0,0 +1,1898 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_SPEC_H__ +#define __RTL8192C_SPEC_H__ + +#include + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + + +//============================================================ +// 8192C Regsiter offset definition +//============================================================ + + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_SYS_ISO_CTRL 0x0000 +#define REG_SYS_FUNC_EN 0x0002 +#define REG_APS_FSMCO 0x0004 +#define REG_SYS_CLKR 0x0008 +#define REG_9346CR 0x000A +#define REG_EE_VPD 0x000C +#define REG_AFE_MISC 0x0010 +#define REG_SPS0_CTRL 0x0011 +#define REG_SPS_OCP_CFG 0x0018 +#define REG_RSV_CTRL 0x001C +#define REG_RF_CTRL 0x001F +#define REG_LDOA15_CTRL 0x0020 +#define REG_LDOV12D_CTRL 0x0021 +#define REG_LDOHCI12_CTRL 0x0022 +#define REG_LPLDO_CTRL 0x0023 +#define REG_AFE_XTAL_CTRL 0x0024 +#define REG_AFE_PLL_CTRL 0x0028 +#define REG_EFUSE_CTRL 0x0030 +#define REG_EFUSE_TEST 0x0034 +#define REG_PWR_DATA 0x0038 +#define REG_CAL_TIMER 0x003C +#define REG_ACLK_MON 0x003E +#define REG_GPIO_MUXCFG 0x0040 +#define REG_GPIO_IO_SEL 0x0042 +#define REG_MAC_PINMUX_CFG 0x0043 +#define REG_GPIO_PIN_CTRL 0x0044 +#define REG_GPIO_INTM 0x0048 +#define REG_LEDCFG0 0x004C +#define REG_LEDCFG1 0x004D +#define REG_LEDCFG2 0x004E +#define REG_LEDCFG3 0x004F +#define REG_LEDCFG REG_LEDCFG2 +#define REG_FSIMR 0x0050 +#define REG_FSISR 0x0054 +#define REG_HSIMR 0x0058 +#define REG_HSISR 0x005c +#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control. +#define REG_GPIO_IO_SEL_2 0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select. +#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source. +#define REG_MCUFWDL 0x0080 +#define REG_HMEBOX_EXT_0 0x0088 +#define REG_HMEBOX_EXT_1 0x008A +#define REG_HMEBOX_EXT_2 0x008C +#define REG_HMEBOX_EXT_3 0x008E +#define REG_HOST_SUSP_CNT 0x00BC // Host suspend counter on FPGA platform +#define REG_EFUSE_ACCESS 0x00CF // Efuse access protection for RTL8723 +#define REG_BIST_SCAN 0x00D0 +#define REG_BIST_RPT 0x00D4 +#define REG_BIST_ROM_RPT 0x00D8 +#define REG_USB_SIE_INTF 0x00E0 +#define REG_PCIE_MIO_INTF 0x00E4 +#define REG_PCIE_MIO_INTD 0x00E8 +#define REG_HPON_FSM 0x00EC +#define REG_SYS_CFG 0x00F0 +#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only. + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_CR 0x0100 +#define REG_PBP 0x0104 +#define REG_TRXDMA_CTRL 0x010C +#define REG_TRXFF_BNDY 0x0114 +#define REG_TRXFF_STATUS 0x0118 +#define REG_RXFF_PTR 0x011C +#define REG_HIMR 0x0120 +#define REG_HISR 0x0124 +#define REG_HIMRE 0x0128 +#define REG_HISRE 0x012C +#define REG_CPWM 0x012F +#define REG_FWIMR 0x0130 +#define REG_FWISR 0x0134 +#define REG_PKTBUF_DBG_CTRL 0x0140 +#define REG_PKTBUF_DBG_DATA_L 0x0144 +#define REG_PKTBUF_DBG_DATA_H 0x0148 + +#define REG_TC0_CTRL 0x0150 +#define REG_TC1_CTRL 0x0154 +#define REG_TC2_CTRL 0x0158 +#define REG_TC3_CTRL 0x015C +#define REG_TC4_CTRL 0x0160 +#define REG_TCUNIT_BASE 0x0164 +#define REG_MBIST_START 0x0174 +#define REG_MBIST_DONE 0x0178 +#define REG_MBIST_FAIL 0x017C +#define REG_C2HEVT_MSG_NORMAL 0x01A0 +#define REG_C2HEVT_CLEAR 0x01AF +#define REG_C2HEVT_MSG_TEST 0x01B8 +#define REG_MCUTST_1 0x01c0 +#define REG_FMETHR 0x01C8 +#define REG_HMETFR 0x01CC +#define REG_HMEBOX_0 0x01D0 +#define REG_HMEBOX_1 0x01D4 +#define REG_HMEBOX_2 0x01D8 +#define REG_HMEBOX_3 0x01DC + +#define REG_LLT_INIT 0x01E0 +#define REG_BB_ACCEESS_CTRL 0x01E8 +#define REG_BB_ACCESS_DATA 0x01EC + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_RQPN 0x0200 +#define REG_FIFOPAGE 0x0204 +#define REG_TDECTRL 0x0208 +#define REG_TXDMA_OFFSET_CHK 0x020C +#define REG_TXDMA_STATUS 0x0210 +#define REG_RQPN_NPQ 0x0214 + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_AGG_PG_TH 0x0280 +#define REG_RXPKT_NUM 0x0284 +#define REG_RXDMA_STATUS 0x0288 + + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_CTRL_REG 0x0300 +#define REG_INT_MIG 0x0304 // Interrupt Migration +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address +#define REG_DBI 0x0348 // Backdoor REG for Access Configuration +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_DBG_SEL 0x0360 // Debug Selection Register +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM +#define REG_UART_CTRL 0x0364 // UART Control +#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address +#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address + + +// spec version 11 +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_VOQ_INFORMATION 0x0400 +#define REG_VIQ_INFORMATION 0x0404 +#define REG_BEQ_INFORMATION 0x0408 +#define REG_BKQ_INFORMATION 0x040C +#define REG_MGQ_INFORMATION 0x0410 +#define REG_HGQ_INFORMATION 0x0414 +#define REG_BCNQ_INFORMATION 0x0418 + + +#define REG_CPU_MGQ_INFORMATION 0x041C +#define REG_FWHW_TXQ_CTRL 0x0420 +#define REG_HWSEQ_CTRL 0x0423 +#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY 0x0425 +#define REG_MULTI_BCNQ_EN 0x0426 +#define REG_MULTI_BCNQ_OFFSET 0x0427 +#define REG_SPEC_SIFS 0x0428 +#define REG_RL 0x042A +#define REG_DARFRC 0x0430 +#define REG_RARFRC 0x0438 +#define REG_RRSR 0x0440 +#define REG_ARFR0 0x0444 +#define REG_ARFR1 0x0448 +#define REG_ARFR2 0x044C +#define REG_ARFR3 0x0450 +#define REG_AGGLEN_LMT 0x0458 +#define REG_AMPDU_MIN_SPACE 0x045C +#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D +#define REG_FAST_EDCA_CTRL 0x0460 +#define REG_RD_RESP_PKT_TH 0x0463 +#define REG_INIRTS_RATE_SEL 0x0480 +#define REG_INIDATA_RATE_SEL 0x0484 +#define REG_POWER_STATUS 0x04A4 +#define REG_POWER_STAGE1 0x04B4 +#define REG_POWER_STAGE2 0x04B8 +#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 +#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 +#define REG_STBC_SETTING 0x04C4 +#define REG_PROT_MODE_CTRL 0x04C8 +#define REG_MAX_AGGR_NUM 0x04CA +#define REG_RTS_MAX_AGGR_NUM 0x04CB +#define REG_BAR_MODE_CTRL 0x04CC +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF +#define REG_NQOS_SEQ 0x04DC +#define REG_QOS_SEQ 0x04DE +#define REG_NEED_CPU_HANDLE 0x04E0 +#define REG_PKT_LOSE_RPT 0x04E1 +#define REG_PTCL_ERR_STATUS 0x04E2 +#define REG_DUMMY 0x04FC + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_EDCA_VO_PARAM 0x0500 +#define REG_EDCA_VI_PARAM 0x0504 +#define REG_EDCA_BE_PARAM 0x0508 +#define REG_EDCA_BK_PARAM 0x050C +#define REG_BCNTCFG 0x0510 +#define REG_PIFS 0x0512 +#define REG_RDG_PIFS 0x0513 +#define REG_SIFS_CCK 0x0514 +#define REG_SIFS_OFDM 0x0516 +#define REG_SIFS_CTX 0x0514 +#define REG_SIFS_TRX 0x0516 +#define REG_AGGR_BREAK_TIME 0x051A +#define REG_SLOT 0x051B +#define REG_TX_PTCL_CTRL 0x0520 +#define REG_TXPAUSE 0x0522 +#define REG_DIS_TXREQ_CLR 0x0523 +#define REG_RD_CTRL 0x0524 +#define REG_TBTT_PROHIBIT 0x0540 +#define REG_RD_NAV_NXT 0x0544 +#define REG_NAV_PROT_LEN 0x0546 +#define REG_BCN_CTRL 0x0550 +#define REG_BCN_CTRL_1 0x0551 +#define REG_MBID_NUM 0x0552 +#define REG_DUAL_TSF_RST 0x0553 +#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE +#define REG_MBSSID_BCN_SPACE 0x0554 +#define REG_DRVERLYINT 0x0558 +#define REG_BCNDMATIM 0x0559 +#define REG_ATIMWND 0x055A +#define REG_BCN_MAX_ERR 0x055D +#define REG_RXTSF_OFFSET_CCK 0x055E +#define REG_RXTSF_OFFSET_OFDM 0x055F +#define REG_TSFTR 0x0560 +#define REG_INIT_TSFTR 0x0564 +#define REG_PSTIMER 0x0580 +#define REG_TIMER0 0x0584 +#define REG_TIMER1 0x0588 +#define REG_ACMHWCTRL 0x05C0 +#define REG_ACMRSTCTRL 0x05C1 +#define REG_ACMAVG 0x05C2 +#define REG_VO_ADMTIME 0x05C4 +#define REG_VI_ADMTIME 0x05C6 +#define REG_BE_ADMTIME 0x05C8 +#define REG_EDCA_RANDOM_GEN 0x05CC +#define REG_SCH_TXCMD 0x05D0 + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_APSD_CTRL 0x0600 +#define REG_BWOPMODE 0x0603 +#define REG_TCR 0x0604 +#define REG_RCR 0x0608 +#define REG_RX_PKT_LIMIT 0x060C +#define REG_RX_DLK_TIME 0x060D +#define REG_RX_DRVINFO_SZ 0x060F + +#define REG_MACID 0x0610 +#define REG_BSSID 0x0618 +#define REG_MAR 0x0620 +#define REG_MBIDCAMCFG 0x0628 + +#define REG_USTIME_EDCA 0x0638 +#define REG_MAC_SPEC_SIFS 0x063A + +// 20100719 Joseph: Hardware register definition change. (HW datasheet v54) +#define REG_R2T_SIFS 0x063C // [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK +#define REG_T2T_SIFS 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK +#define REG_ACKTO 0x0640 +#define REG_CTS2TO 0x0641 +#define REG_EIFS 0x0642 + +//WMA, BA, CCX +#define REG_NAV_CTRL 0x0650 +#define REG_BACAMCMD 0x0654 +#define REG_BACAMCONTENT 0x0658 +#define REG_LBDLY 0x0660 +#define REG_FWDLY 0x0661 +#define REG_RXERR_RPT 0x0664 +#define REG_WMAC_TRXPTCL_CTL 0x0668 + + +// Security +#define REG_CAMCMD 0x0670 +#define REG_CAMWRITE 0x0674 +#define REG_CAMREAD 0x0678 +#define REG_CAMDBG 0x067C +#define REG_SECCFG 0x0680 + +// Power +#define REG_WOW_CTRL 0x0690 +#define REG_PSSTATUS 0x0691 +#define REG_PS_RX_INFO 0x0692 +#define REG_LPNAV_CTRL 0x0694 +#define REG_WKFMCAM_CMD 0x0698 +#define REG_WKFMCAM_RWD 0x069C +#define REG_RXFLTMAP0 0x06A0 +#define REG_RXFLTMAP1 0x06A2 +#define REG_RXFLTMAP2 0x06A4 +#define REG_BCN_PSR_RPT 0x06A8 +#define REG_CALB32K_CTRL 0x06AC +#define REG_PKT_MON_CTRL 0x06B4 +#define REG_BT_COEX_TABLE 0x06C0 +#define REG_WMAC_RESP_TXINFO 0x06D8 + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +// For test chip +#define REG_TEST_USB_TXQS 0xFE48 +#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_TEST_SIE_OPTIONAL 0xFE64 +#define REG_TEST_SIE_CHIRP_K 0xFE65 +#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B +#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 + + +// For normal chip +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_NORMAL_SIE_OPTIONAL 0xFE64 +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B +#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C +#define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only. +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF + + +//----------------------------------------------------- +// +// Redifine 8192C register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. + +#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control. +#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable. +#define SYS_CLK REG_SYS_CLKR +#define CR9346 REG_9346CR // 93C46/93C56 Command Register. +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. +#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. +#define MSR (REG_CR + 2) // Media Status register +#define ISR REG_HISR +#define TSFR REG_TSFTR // Timing Sync Function Timer Register. + +#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 +#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 + +#define PBP REG_PBP + +// Redifine MACID register, to compatible prior ICs. +#define IDR0 MACIDR0 +#define IDR4 MACIDR4 + + +// +// 9. Security Control Registers (Offset: ) +// +#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd +#define WCAMI REG_CAMWRITE // Software write CAM input content +#define RCAMO REG_CAMREAD // Software read/write CAM config +#define CAMDBG REG_CAMDBG +#define SECR REG_SECCFG //Security Configuration Register + +// Unused register +#define UnusedRegister 0x1BF +#define DCAM UnusedRegister +#define PSR UnusedRegister +#define BBAddr UnusedRegister +#define PhyDataR UnusedRegister + +#define InvalidBBRFValue 0x12345678 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A + +//---------------------------------------------------------------------------- +// 8192C Cmd9346CR bits (Offset 0xA, 16bit) +//---------------------------------------------------------------------------- +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 +#define Cmd9346CR_9356SEL BIT4 +#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL) +#define AutoLoadEFUSE CmdEEPROM_En + +//---------------------------------------------------------------------------- +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO 0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) + +//---------------------------------------------------------------------------- +// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +/* +Network Type +00: No link +01: Link in ad hoc network +10: Link in infrastructure network +11: AP mode +Default: 00b. +*/ +#define MSR_NOLINK 0x00 +#define MSR_ADHOC 0x01 +#define MSR_INFRA 0x02 +#define MSR_AP 0x03 + +// +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) +// +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x181, 24bits) +//---------------------------------------------------------------------------- +#define RRSR_RSC_OFFSET 21 +#define RRSR_SHORT_OFFSET 23 +#define RRSR_RSC_BW_40M 0x600000 +#define RRSR_RSC_UPSUBCHNL 0x400000 +#define RRSR_RSC_LOWSUBCHNL 0x200000 +#define RRSR_SHORT 0x800000 +#define RRSR_1M BIT0 +#define RRSR_2M BIT1 +#define RRSR_5_5M BIT2 +#define RRSR_11M BIT3 +#define RRSR_6M BIT4 +#define RRSR_9M BIT5 +#define RRSR_12M BIT6 +#define RRSR_18M BIT7 +#define RRSR_24M BIT8 +#define RRSR_36M BIT9 +#define RRSR_48M BIT10 +#define RRSR_54M BIT11 +#define RRSR_MCS0 BIT12 +#define RRSR_MCS1 BIT13 +#define RRSR_MCS2 BIT14 +#define RRSR_MCS3 BIT15 +#define RRSR_MCS4 BIT16 +#define RRSR_MCS5 BIT17 +#define RRSR_MCS6 BIT18 +#define RRSR_MCS7 BIT19 +#define BRSR_AckShortPmb BIT23 +// CCK ACK: use Short Preamble or not + + +//---------------------------------------------------------------------------- +// 8192C Rate Definition +//---------------------------------------------------------------------------- +//CCK +#define RATR_1M 0x00000001 +#define RATR_2M 0x00000002 +#define RATR_55M 0x00000004 +#define RATR_11M 0x00000008 +//OFDM +#define RATR_6M 0x00000010 +#define RATR_9M 0x00000020 +#define RATR_12M 0x00000040 +#define RATR_18M 0x00000080 +#define RATR_24M 0x00000100 +#define RATR_36M 0x00000200 +#define RATR_48M 0x00000400 +#define RATR_54M 0x00000800 +//MCS 1 Spatial Stream +#define RATR_MCS0 0x00001000 +#define RATR_MCS1 0x00002000 +#define RATR_MCS2 0x00004000 +#define RATR_MCS3 0x00008000 +#define RATR_MCS4 0x00010000 +#define RATR_MCS5 0x00020000 +#define RATR_MCS6 0x00040000 +#define RATR_MCS7 0x00080000 +//MCS 2 Spatial Stream +#define RATR_MCS8 0x00100000 +#define RATR_MCS9 0x00200000 +#define RATR_MCS10 0x00400000 +#define RATR_MCS11 0x00800000 +#define RATR_MCS12 0x01000000 +#define RATR_MCS13 0x02000000 +#define RATR_MCS14 0x04000000 +#define RATR_MCS15 0x08000000 + + +// NOTE: For 92CU - Ziv +//CCK +#define RATE_1M BIT(0) +#define RATE_2M BIT(1) +#define RATE_5_5M BIT(2) +#define RATE_11M BIT(3) +//OFDM +#define RATE_6M BIT(4) +#define RATE_9M BIT(5) +#define RATE_12M BIT(6) +#define RATE_18M BIT(7) +#define RATE_24M BIT(8) +#define RATE_36M BIT(9) +#define RATE_48M BIT(10) +#define RATE_54M BIT(11) +//MCS 1 Spatial Stream +#define RATE_MCS0 BIT(12) +#define RATE_MCS1 BIT(13) +#define RATE_MCS2 BIT(14) +#define RATE_MCS3 BIT(15) +#define RATE_MCS4 BIT(16) +#define RATE_MCS5 BIT(17) +#define RATE_MCS6 BIT(18) +#define RATE_MCS7 BIT(19) +//MCS 2 Spatial Stream +#define RATE_MCS8 BIT(20) +#define RATE_MCS9 BIT(21) +#define RATE_MCS10 BIT(22) +#define RATE_MCS11 BIT(23) +#define RATE_MCS12 BIT(24) +#define RATE_MCS13 BIT(25) +#define RATE_MCS14 BIT(26) +#define RATE_MCS15 BIT(27) + + + + +// ALL CCK Rate +#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M +#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ + RATR_36M|RATR_48M|RATR_54M +#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ + RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7 +#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9 |RATR_MCS10|RATR_MCS11|\ + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 + +//---------------------------------------------------------------------------- +// 8192C BW_OPMODE bits (Offset 0x203, 8bit) +//---------------------------------------------------------------------------- +#define BW_OPMODE_20MHZ BIT2 +#define BW_OPMODE_5G BIT1 +#define BW_OPMODE_11J BIT0 + + +//---------------------------------------------------------------------------- +// 8192C CAM Config Setting (offset 0x250, 1 byte) +//---------------------------------------------------------------------------- +#define CAM_VALID BIT15 +#define CAM_NOTVALID 0x0000 +#define CAM_USEDK BIT5 + +#define CAM_CONTENT_COUNT 8 + +#define CAM_NONE 0x0 +#define CAM_WEP40 0x01 +#define CAM_TKIP 0x02 +#define CAM_AES 0x04 +#define CAM_WEP104 0x05 + +#define TOTAL_CAM_ENTRY 32 +#define HALF_CAM_ENTRY 16 + +#define CAM_CONFIG_USEDK _TRUE +#define CAM_CONFIG_NO_USEDK _FALSE + +#define CAM_WRITE BIT16 +#define CAM_READ 0x00000000 +#define CAM_POLLINIG BIT31 + +#define SCR_UseDK 0x01 +#define SCR_TxSecEnable 0x02 +#define SCR_RxSecEnable 0x04 + + +// +// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) +// +//---------------------------------------------------------------------------- +// 8190 IMR/ISR bits (offset 0xfd, 8bits) +//---------------------------------------------------------------------------- +#define IMR8190_DISABLED 0x0 +// IMR DW0 Bit 0-31 +#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8 +#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1 +#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2 +#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1 +#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow +#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt +#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0 +#define IMR_RXFOVW BIT12 // Receive FIFO Overflow +#define IMR_RDU BIT11 // Receive Descriptor Unavailable +#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt +#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup +#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt +#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup +#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt +#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt +#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt +#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt +#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt +#define IMR_VODOK BIT1 // AC_VO DMA Interrupt +#define IMR_ROK BIT0 // Receive DMA OK Interrupt + +#define IMR_RX_MASK (IMR_ROK|IMR_RDU|IMR_RXFOVW) +#define IMR_TX_MASK (IMR_VODOK|IMR_VIDOK|IMR_BEDOK|IMR_BKDOK|IMR_MGNTDOK|IMR_HIGHDOK|IMR_BDOK) + +// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh) +#define IMR_TXERR BIT11 +#define IMR_RXERR BIT10 +#define IMR_C2HCMD BIT9 +#define IMR_CPWM BIT8 +//RSVD [2-7] +#define IMR_OCPINT BIT1 +#define IMR_WLANOFF BIT0 + + + +//---------------------------------------------------------------------------- +// 8192C EFUSE +//---------------------------------------------------------------------------- +#define HWSET_MAX_SIZE 128 + + +//---------------------------------------------------------------------------- +// 8192C EEPROM/EFUSE share register definition. +//---------------------------------------------------------------------------- + +// +// Default Value for EEPROM or EFUSE!!! +// +#define EEPROM_Default_TSSI 0x0 +#define EEPROM_Default_TxPowerDiff 0x0 +#define EEPROM_Default_CrystalCap 0x5 +#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) +#define EEPROM_Default_TxPower 0x1010 +#define EEPROM_Default_HT2T_TxPwr 0x10 + +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_ThermalMeter 0x12 + +#define EEPROM_Default_AntTxPowerDiff 0x0 +#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 +#define EEPROM_Default_TxPowerLevel 0x22 +#define EEPROM_Default_HT40_2SDiff 0x0 +#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_HT40_PwrMaxOffset 0 +#define EEPROM_Default_HT20_PwrMaxOffset 0 + +// For debug +#define EEPROM_Default_PID 0x1234 +#define EEPROM_Default_VID 0x5678 +#define EEPROM_Default_CustomerID 0xAB +#define EEPROM_Default_SubCustomerID 0xCD +#define EEPROM_Default_Version 0 + +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_NCC 0xB +#define EEPROM_USB_OPTIONAL1 0xE +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_TOSHIBA 0x4 +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. +#define EEPROM_CID_QMI 0x0D +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define RTL_EEPROM_ID 0x8129 + + +#ifdef CONFIG_PCI_HCI +#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER) +#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) + +// +// Interface type. +// +typedef enum _INTERFACE_SELECT_8192CPCIe{ + INTF_SEL0_SOLO_MINICARD = 0, // WiFi solo-mCard + INTF_SEL1_BT_COMBO_MINICARD = 1, // WiFi+BT combo-mCard + INTF_SEL2_PCIe = 2, // PCIe Card +} INTERFACE_SELECT_8192CPCIe, *PINTERFACE_SELECT_8192CPCIe; + +#define RTL8190_EEPROM_ID 0x8129 // 0-1 +#define EEPROM_HPON 0x02 // LDO settings.2-5 +#define EEPROM_CLK 0x06 // Clock settings.6-7 +#define EEPROM_TESTR 0x08 // SE Test mode.8 + +#define EEPROM_VID 0x0A // SE Vendor ID.A-B +#define EEPROM_DID 0x0C // SE Device ID. C-D +#define EEPROM_SVID 0x0E // SE Vendor ID.E-F +#define EEPROM_SMID 0x10 // SE PCI Subsystem ID. 10-11 + +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 + +//---------------------------------------------------------------- +// Ziv - Let PCIe and USB use the same define. Modify address mapping later. +#define EEPROM_CCK_TX_PWR_INX 0x5A +#define EEPROM_HT40_1S_TX_PWR_INX 0x60 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 +#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 +#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C +#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F +#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 + +#define EEPROM_CHANNEL_PLAN 0x75 +#define EEPROM_TSSI_A 0x76 +#define EEPROM_TSSI_B 0x77 +#define EEPROM_THERMAL_METER 0x78 +#define EEPROM_RF_OPT1 0x79 +#define EEPROM_RF_OPT2 0x7A +#define EEPROM_RF_OPT3 0x7B +#define EEPROM_RF_OPT4 0x7C +#define EEPROM_VERSION 0x7E +#define EEPROM_CUSTOMER_ID 0x7F + +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] + +#endif + +#ifdef CONFIG_USB_HCI + +//should be renamed and moved to another file +typedef enum _BOARD_TYPE_8192CUSB{ + BOARD_USB_DONGLE = 0, // USB dongle + BOARD_USB_High_PA = 1, // USB dongle with high power PA + BOARD_MINICARD = 2, // Minicard + BOARD_USB_SOLO = 3, // USB solo-Slim module + BOARD_USB_COMBO = 4, // USB Combo-Slim module +} BOARD_TYPE_8192CUSB, *PBOARD_TYPE_8192CUSB; + +#define SUPPORT_HW_RADIO_DETECT(pHalData) (pHalData->BoardType == BOARD_MINICARD||\ + pHalData->BoardType == BOARD_USB_SOLO||\ + pHalData->BoardType == BOARD_USB_COMBO) + +//--------------------------------------------------------------- +// EEPROM address for Test chip +//--------------------------------------------------------------- +#define EEPROM_TEST_USB_OPT 0x0E +#define EEPROM_TEST_CHIRP_K 0x0F +#define EEPROM_TEST_EP_SETTING 0x0E +#define EEPROM_TEST_USB_PHY 0x10 + + +//--------------------------------------------------------------- +// EEPROM address for Normal chip +//--------------------------------------------------------------- +#define EEPROM_NORMAL_USB_OPT 0x0E +#define EEPROM_NORMAL_CHIRP_K 0x0E // Changed +#define EEPROM_NORMAL_EP_SETTING 0x0F // Changed +#define EEPROM_NORMAL_USB_PHY 0x12 // Changed + + +// Test chip and normal chip common define +//--------------------------------------------------------------- +// EEPROM address for both +//--------------------------------------------------------------- +#define EEPROM_ID0 0x00 +#define EEPROM_ID1 0x01 +#define EEPROM_RTK_RSV1 0x02 +#define EEPROM_RTK_RSV2 0x03 +#define EEPROM_RTK_RSV3 0x04 +#define EEPROM_RTK_RSV4 0x05 +#define EEPROM_RTK_RSV5 0x06 +#define EEPROM_DBG_SEL 0x07 +#define EEPROM_RTK_RSV6 0x08 +#define EEPROM_VID 0x0A +#define EEPROM_PID 0x0C + +#define EEPROM_MAC_ADDR 0x16 +#define EEPROM_STRING 0x1C +#define EEPROM_SUBCUSTOMER_ID 0x59 +#define EEPROM_CCK_TX_PWR_INX 0x5A +#define EEPROM_HT40_1S_TX_PWR_INX 0x60 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 +#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 +#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C +#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F +#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 + +#define EEPROM_CHANNEL_PLAN 0x75 +#define EEPROM_TSSI_A 0x76 +#define EEPROM_TSSI_B 0x77 +#define EEPROM_THERMAL_METER 0x78 +#define EEPROM_RF_OPT1 0x79 +#define EEPROM_RF_OPT2 0x7A +#define EEPROM_RF_OPT3 0x7B +#define EEPROM_RF_OPT4 0x7C +#define EEPROM_VERSION 0x7E +#define EEPROM_CUSTOMER_ID 0x7F + +#define EEPROM_BoardType 0x54 //0x0: RTL8188SU, 0x1: RTL8191SU, 0x2: RTL8192SU, 0x3: RTL8191GU +#define EEPROM_TxPwIndex 0x5C //0x5C-0x76, Tx Power index. +#define EEPROM_PwDiff 0x67 // Difference of gain index between legacy and high throughput OFDM. + +#define EEPROM_TxPowerCCK 0x5A // CCK Tx Power + +// 2009/02/09 Cosa Add for SD3 requirement +#define EEPROM_TX_PWR_HT20_DIFF 0x6e// HT20 Tx Power Index Difference +#define DEFAULT_HT20_TXPWR_DIFF 2 // HT20<->40 default Tx Power Index Difference +#define EEPROM_TX_PWR_OFDM_DIFF 0x71// OFDM Tx Power Index Difference + +#define EEPROM_TxPWRGroup 0x73// Power diff for channel group +#define EEPROM_Regulatory 0x79// Check if power safety is need + +#define EEPROM_BLUETOOTH_COEXIST 0x7E // 92cu, 0x7E[4] +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] +#define BOARD_TYPE_NORMAL_MASK 0xE0 +#define BOARD_TYPE_TEST_MASK 0x0F +#define EEPROM_EASY_REPLACEMENT 0x50//BIT0 1 for build-in module, 0 for external dongle +//------------------------------------------------------------- +// EEPROM content definitions +//------------------------------------------------------------- +#define OS_LINK_SPEED BIT(5) + +#define BOARD_TYPE_MASK 0xF + +#define BT_COEXISTENCE BIT(4) +#define BT_CO_SHIFT 4 + +#define EP_NUMBER_MASK 0x30 //bit 4:5 0Eh +#define EP_NUMBER_SHIFT 4 + + +#define USB_PHY_PARA_SIZE 5 + + +//------------------------------------------------------------- +// EEPROM default value definitions +//------------------------------------------------------------- +// Use 0xABCD instead of 0x8192 for debug +#define EEPROM_DEF_ID_0 0xCD // Byte 0x00 +#define EEPROM_DEF_ID_1 0xAB // Byte 0x01 + +#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03 +#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04 +#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08 + +#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A +#define EEPROM_DEF_VID_1 0x0B + +#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C +#define EEPROM_DEF_PID_1 0x81 + + +#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E +#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E + +#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F + +#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10 +#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11 +#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12 +#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13 + +#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78 +#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79 + + +#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A + +#define RF_OPTION1 0x79// Check if power safety spec is need +#define RF_OPTION2 0x7A +#define RF_OPTION3 0x7B +#define RF_OPTION4 0x7C + + +#define EEPROM_USB_SN BIT(0) +#define EEPROM_USB_REMOTE_WAKEUP BIT(1) +#define EEPROM_USB_DEVICE_PWR BIT(2) +#define EEPROM_EP_NUMBER (BIT(3)|BIT(4)) + +#if 0 +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + +#define EEPROM_CID_DEFAULT 0x0 + +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. +#endif + +#endif + + +/*=================================================================== +===================================================================== +Here the register defines are for 92C. When the define is as same with 92C, +we will use the 92C's define for the consistency +So the following defines for 92C is not entire!!!!!! +===================================================================== +=====================================================================*/ +/* +Based on Datasheet V33---090401 +Register Summary +Current IOREG MAP +0x0000h ~ 0x00FFh System Configuration (256 Bytes) +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) +*/ + +//---------------------------------------------------------------------------- +// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) +//---------------------------------------------------------------------------- +#define RCR_APPFCS BIT31 //WMAC append FCS after pauload +#define RCR_APP_MIC BIT30 // +#define RCR_APP_PHYSTS BIT28// +#define RCR_APP_ICV BIT29 // +#define RCR_APP_PHYST_RXFF BIT28 // +#define RCR_APP_BA_SSN BIT27 //Accept BA SSN +#define RCR_ENMBID BIT24 //Enable Multiple BssId. +#define RCR_LSIGEN BIT23 +#define RCR_MFBEN BIT22 +#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 +#define RCR_AMF BIT13 //Accept management type frame +#define RCR_ACF BIT12 //Accept control type frame +#define RCR_ADF BIT11 //Accept data type frame +#define RCR_AICV BIT9 //Accept ICV error packet +#define RCR_ACRC32 BIT8 //Accept CRC32 error packet +#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) +#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) +#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet +#define RCR_APWRMGT BIT5 //Accept power management packet +#define RCR_ADD3 BIT4 //Accept address 3 match packet +#define RCR_AB BIT3 //Accept broadcast packet +#define RCR_AM BIT2 //Accept multicast packet +#define RCR_APM BIT1 //Accept physical match packet +#define RCR_AAP BIT0 //Accept all unicast packet +#define RCR_MXDMA_OFFSET 8 +#define RCR_FIFO_OFFSET 13 + + + +//============================================================================ +// 8192c USB specific Regsiter Offset and Content definition, +// 2009.08.18, added by vivi. for merge 92c and 92C into one driver +//============================================================================ +//#define APS_FSMCO 0x0004 same with 92Ce +#define RSV_CTRL 0x001C +#define RD_CTRL 0x0524 + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +#define REG_USB_VID 0xFE60 +#define REG_USB_PID 0xFE62 +#define REG_USB_OPTIONAL 0xFE64 +#define REG_USB_CHIRP_K 0xFE65 +#define REG_USB_PHY 0xFE66 +#define REG_USB_MAC_ADDR 0xFE70 + +#define REG_USB_HRPWM 0xFE58 +#define REG_USB_HCPWM 0xFE57 + +#define InvalidBBRFValue 0x12345678 + +//============================================================================ +// 8192C Regsiter Bit and Content definition +//============================================================================ +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +//2 SPS0_CTRL +#define SW18_FPWM BIT(3) + + +//2 SYS_ISO_CTRL +#define ISO_MD2PP BIT(0) +#define ISO_UA2USB BIT(1) +#define ISO_UD2CORE BIT(2) +#define ISO_PA2PCIE BIT(3) +#define ISO_PD2CORE BIT(4) +#define ISO_IP2MAC BIT(5) +#define ISO_DIOP BIT(6) +#define ISO_DIOE BIT(7) +#define ISO_EB2CORE BIT(8) +#define ISO_DIOR BIT(9) + +#define PWC_EV25V BIT(14) +#define PWC_EV12V BIT(15) + + +//2 SYS_FUNC_EN +#define FEN_BBRSTB BIT(0) +#define FEN_BB_GLB_RSTn BIT(1) +#define FEN_USBA BIT(2) +#define FEN_UPLL BIT(3) +#define FEN_USBD BIT(4) +#define FEN_DIO_PCIE BIT(5) +#define FEN_PCIEA BIT(6) +#define FEN_PPLL BIT(7) +#define FEN_PCIED BIT(8) +#define FEN_DIOE BIT(9) +#define FEN_CPUEN BIT(10) +#define FEN_DCORE BIT(11) +#define FEN_ELDR BIT(12) +#define FEN_DIO_RF BIT(13) +#define FEN_HWPDN BIT(14) +#define FEN_MREGEN BIT(15) + +//2 APS_FSMCO +#define PFM_LDALL BIT(0) +#define PFM_ALDN BIT(1) +#define PFM_LDKP BIT(2) +#define PFM_WOWL BIT(3) +#define EnPDN BIT(4) +#define PDN_PL BIT(5) +#define APFM_ONMAC BIT(8) +#define APFM_OFF BIT(9) +#define APFM_RSM BIT(10) +#define AFSM_HSUS BIT(11) +#define AFSM_PCIE BIT(12) +#define APDM_MAC BIT(13) +#define APDM_HOST BIT(14) +#define APDM_HPDN BIT(15) +#define RDY_MACON BIT(16) +#define SUS_HOST BIT(17) +#define ROP_ALD BIT(20) +#define ROP_PWR BIT(21) +#define ROP_SPS BIT(22) +#define SOP_MRST BIT(25) +#define SOP_FUSE BIT(26) +#define SOP_ABG BIT(27) +#define SOP_AMB BIT(28) +#define SOP_RCK BIT(29) +#define SOP_A8M BIT(30) +#define XOP_BTCK BIT(31) + +//2 SYS_CLKR +#define ANAD16V_EN BIT(0) +#define ANA8M BIT(1) +#define MACSLP BIT(4) +#define LOADER_CLK_EN BIT(5) +#define _80M_SSC_DIS BIT(7) +#define _80M_SSC_EN_HO BIT(8) +#define PHY_SSC_RSTB BIT(9) +#define SEC_CLK_EN BIT(10) +#define MAC_CLK_EN BIT(11) +#define SYS_CLK_EN BIT(12) +#define RING_CLK_EN BIT(13) + + +//2 9346CR + + +#define EEDO BIT(0) +#define EEDI BIT(1) +#define EESK BIT(2) +#define EECS BIT(3) +//#define EERPROMSEL BIT(4) +//#define EEPROM_EN BIT(5) +#define BOOT_FROM_EEPROM BIT(4) +#define EEPROM_EN BIT(5) +#define EEM0 BIT(6) +#define EEM1 BIT(7) + + +//2 AFE_MISC +#define AFE_BGEN BIT(0) +#define AFE_MBEN BIT(1) +#define MAC_ID_EN BIT(7) + + +//2 SPS0_CTRL + + +//2 SPS_OCP_CFG + + +//2 RSV_CTRL +#define WLOCK_ALL BIT(0) +#define WLOCK_00 BIT(1) +#define WLOCK_04 BIT(2) +#define WLOCK_08 BIT(3) +#define WLOCK_40 BIT(4) +#define R_DIS_PRST_0 BIT(5) +#define R_DIS_PRST_1 BIT(6) +#define LOCK_ALL_EN BIT(7) + +//2 RF_CTRL +#define RF_EN BIT(0) +#define RF_RSTB BIT(1) +#define RF_SDMRSTB BIT(2) + + + +//2 LDOA15_CTRL +#define LDA15_EN BIT(0) +#define LDA15_STBY BIT(1) +#define LDA15_OBUF BIT(2) +#define LDA15_REG_VOS BIT(3) +#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) + + + +//2 LDOV12D_CTRL +#define LDV12_EN BIT(0) +#define LDV12_SDBY BIT(1) +#define LPLDO_HSM BIT(2) +#define LPLDO_LSM_DIS BIT(3) +#define _LDV12_VADJ(x) (((x) & 0xF) << 4) + + +//2 AFE_XTAL_CTRL +#define XTAL_EN BIT(0) +#define XTAL_BSEL BIT(1) +#define _XTAL_BOSC(x) (((x) & 0x3) << 2) +#define _XTAL_CADJ(x) (((x) & 0xF) << 4) +#define XTAL_GATE_USB BIT(8) +#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9) +#define XTAL_GATE_AFE BIT(11) +#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12) +#define XTAL_RF_GATE BIT(14) +#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15) +#define XTAL_GATE_DIG BIT(17) +#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18) +#define XTAL_BT_GATE BIT(20) +#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) +#define _XTAL_GPIO(x) (((x) & 0x7) << 23) + + +#define CKDLY_AFE BIT(26) +#define CKDLY_USB BIT(27) +#define CKDLY_DIG BIT(28) +#define CKDLY_BT BIT(29) + + +//2 AFE_PLL_CTRL +#define APLL_EN BIT(0) +#define APLL_320_EN BIT(1) +#define APLL_FREF_SEL BIT(2) +#define APLL_EDGE_SEL BIT(3) +#define APLL_WDOGB BIT(4) +#define APLL_LPFEN BIT(5) + +#define APLL_REF_CLK_13MHZ 0x1 +#define APLL_REF_CLK_19_2MHZ 0x2 +#define APLL_REF_CLK_20MHZ 0x3 +#define APLL_REF_CLK_25MHZ 0x4 +#define APLL_REF_CLK_26MHZ 0x5 +#define APLL_REF_CLK_38_4MHZ 0x6 +#define APLL_REF_CLK_40MHZ 0x7 + +#define APLL_320EN BIT(14) +#define APLL_80EN BIT(15) +#define APLL_1MEN BIT(24) + + +//2 EFUSE_CTRL +#define ALD_EN BIT(18) +#define EF_PD BIT(19) +#define EF_FLAG BIT(31) + +//2 EFUSE_TEST (For RTL8723 partially) +#define EF_TRPT BIT(7) +#define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 +#define LDOE25_EN BIT(31) +#define EFUSE_SEL(x) (((x) & 0x3) << 8) +#define EFUSE_SEL_MASK 0x300 +#define EFUSE_WIFI_SEL_0 0x0 +#define EFUSE_BT_SEL_0 0x1 +#define EFUSE_BT_SEL_1 0x2 +#define EFUSE_BT_SEL_2 0x3 + +#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. +#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. + +//2 PWR_DATA + +//2 CAL_TIMER + +//2 ACLK_MON +#define RSM_EN BIT(0) +#define Timer_EN BIT(4) + + +//2 GPIO_MUXCFG +#define TRSW0EN BIT(2) +#define TRSW1EN BIT(3) +#define EROM_EN BIT(4) +#define EnBT BIT(5) +#define EnUart BIT(8) +#define Uart_910 BIT(9) +#define EnPMAC BIT(10) +#define SIC_SWRST BIT(11) +#define EnSIC BIT(12) +#define SIC_23 BIT(13) +#define EnHDP BIT(14) +#define SIC_LBK BIT(15) + +//2 GPIO_PIN_CTRL + +// GPIO BIT +#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2) + +//2 GPIO_INTM + +//2 LEDCFG +#define LED0PL BIT(4) +#define LED0DIS BIT(7) +#define LED1DIS BIT(15) +#define LED1PL BIT(12) + +#define SECCAM_CLR BIT(30) + + +//2 FSIMR + +//2 FSISR + + +//2 8051FWDL +//2 MCUFWDL +#define MCUFWDL_EN BIT(0) +#define MCUFWDL_RDY BIT(1) +#define FWDL_ChkSum_rpt BIT(2) +#define MACINI_RDY BIT(3) +#define BBINI_RDY BIT(4) +#define RFINI_RDY BIT(5) +#define WINTINI_RDY BIT(6) +#define CPRST BIT(23) + +//2REG_HPON_FSM +#define BOND92CE_1T2R_CFG BIT(22) + + +//2 REG_SYS_CFG +#define XCLK_VLD BIT(0) +#define ACLK_VLD BIT(1) +#define UCLK_VLD BIT(2) +#define PCLK_VLD BIT(3) +#define PCIRSTB BIT(4) +#define V15_VLD BIT(5) +#define TRP_B15V_EN BIT(7) +#define SIC_IDLE BIT(8) +#define BD_MAC2 BIT(9) +#define BD_MAC1 BIT(10) +#define IC_MACPHY_MODE BIT(11) +#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define BT_FUNC BIT(16) +#define VENDOR_ID BIT(19) +#define PAD_HWPD_IDN BIT(22) +#define TRP_VAUX_EN BIT(23) +#define TRP_BT_EN BIT(24) +#define BD_PKG_SEL BIT(25) +#define BD_HCI_SEL BIT(26) +#define TYPE_ID BIT(27) + +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 +#define CHIP_VER_RTL_SHIFT 12 + +//2REG_GPIO_OUTSTS (For RTL8723 only) +#define EFS_HCI_SEL (BIT(0)|BIT(1)) +#define PAD_HCI_SEL (BIT(2)|BIT(3)) +#define HCI_SEL (BIT(4)|BIT(5)) +#define PKG_SEL_HCI BIT(6) +#define FEN_GPS BIT(7) +#define FEN_BT BIT(8) +#define FEN_WL BIT(9) +#define FEN_PCI BIT(10) +#define FEN_USB BIT(11) +#define BTRF_HWPDN_N BIT(12) +#define WLRF_HWPDN_N BIT(13) +#define PDN_BT_N BIT(14) +#define PDN_GPS_N BIT(15) +#define BT_CTL_HWPDN BIT(16) +#define GPS_CTL_HWPDN BIT(17) +#define PPHY_SUSB BIT(20) +#define UPHY_SUSB BIT(21) +#define PCI_SUSEN BIT(22) +#define USB_SUSEN BIT(23) +#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + + +//2 Function Enable Registers +//2 CR + +#define REG_LBMODE (REG_CR + 3) + + +#define HCI_TXDMA_EN BIT(0) +#define HCI_RXDMA_EN BIT(1) +#define TXDMA_EN BIT(2) +#define RXDMA_EN BIT(3) +#define PROTOCOL_EN BIT(4) +#define SCHEDULE_EN BIT(5) +#define MACTXEN BIT(6) +#define MACRXEN BIT(7) +#define ENSWBCN BIT(8) +#define ENSEC BIT(9) + +// Network type +#define _NETTYPE(x) (((x) & 0x3) << 16) +#define MASK_NETTYPE 0x30000 +#define NT_NO_LINK 0x0 +#define NT_LINK_AD_HOC 0x1 +#define NT_LINK_AP 0x2 +#define NT_AS_AP 0x3 + +#define _LBMODE(x) (((x) & 0xF) << 24) +#define MASK_LBMODE 0xF000000 +#define LOOPBACK_NORMAL 0x0 +#define LOOPBACK_IMMEDIATELY 0xB +#define LOOPBACK_MAC_DELAY 0x3 +#define LOOPBACK_PHY 0x1 +#define LOOPBACK_DMA 0x7 + + +//2 PBP - Page Size Register +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) +#define _PSRX_MASK 0xF +#define _PSTX_MASK 0xF0 +#define _PSRX(x) (x) +#define _PSTX(x) ((x) << 4) + +#define PBP_64 0x0 +#define PBP_128 0x1 +#define PBP_256 0x2 +#define PBP_512 0x3 +#define PBP_1024 0x4 + + +//2 TX/RXDMA +#define RXDMA_ARBBW_EN BIT(0) +#define RXSHFT_EN BIT(1) +#define RXDMA_AGG_EN BIT(2) +#define QS_VO_QUEUE BIT(8) +#define QS_VI_QUEUE BIT(9) +#define QS_BE_QUEUE BIT(10) +#define QS_BK_QUEUE BIT(11) +#define QS_MANAGER_QUEUE BIT(12) +#define QS_HIGH_QUEUE BIT(13) + +#define HQSEL_VOQ BIT(0) +#define HQSEL_VIQ BIT(1) +#define HQSEL_BEQ BIT(2) +#define HQSEL_BKQ BIT(3) +#define HQSEL_MGTQ BIT(4) +#define HQSEL_HIQ BIT(5) + +// For normal driver, 0x10C +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) + +#define QUEUE_LOW 1 +#define QUEUE_NORMAL 2 +#define QUEUE_HIGH 3 + + + +//2 TRXFF_BNDY + + +//2 LLT_INIT +#define _LLT_NO_ACTIVE 0x0 +#define _LLT_WRITE_ACCESS 0x1 +#define _LLT_READ_ACCESS 0x2 + +#define _LLT_INIT_DATA(x) ((x) & 0xFF) +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) +#define _LLT_OP(x) (((x) & 0x3) << 30) +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) + + +//2 BB_ACCESS_CTRL +#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) +#define BB_WRITE_EN BIT(30) +#define BB_READ_EN BIT(31) +//#define BB_ADDR_MASK 0xFFF +//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK) + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +//2 RQPN +#define _HPQ(x) ((x) & 0xFF) +#define _LPQ(x) (((x) & 0xFF) << 8) +#define _PUBQ(x) (((x) & 0xFF) << 16) +#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register + + +#define HPQ_PUBLIC_DIS BIT(24) +#define LPQ_PUBLIC_DIS BIT(25) +#define LD_RQPN BIT(31) + + +//2 TDECTRL +#define BCN_VALID BIT(16) +#define BCN_HEAD(x) (((x) & 0xFF) << 8) +#define BCN_HEAD_MASK 0xFF00 + +//2 TDECTL +#define BLK_DESC_NUM_SHIFT 4 +#define BLK_DESC_NUM_MASK 0xF + + +//2 TXDMA_OFFSET_CHK +#define DROP_DATA_EN BIT(9) + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +//2 FWHW_TXQ_CTRL +#define EN_AMPDU_RTY_NEW BIT(7) + +//2 INIRTSMCS_SEL +#define _INIRTSMCS_SEL(x) ((x) & 0x3F) + + +//2 SPEC SIFS +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) + + +//2 RRSR + +#define RATE_REG_BITMAP_ALL 0xFFFFF + +#define _RRSC_BITMAP(x) ((x) & 0xFFFFF) + +#define _RRSR_RSC(x) (((x) & 0x3) << 21) +#define RRSR_RSC_RESERVED 0x0 +#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 +#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 +#define RRSR_RSC_DUPLICATE_MODE 0x3 + + +//2 ARFR +#define USE_SHORT_G1 BIT(20) + +//2 AGGLEN_LMT_L +#define _AGGLMT_MCS0(x) ((x) & 0xF) +#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4) +#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8) +#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12) +#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16) +#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20) +#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) +#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) + + +//2 RL +#define RETRY_LIMIT_SHORT_SHIFT 8 +#define RETRY_LIMIT_LONG_SHIFT 0 + + +//2 DARFRC +#define _DARF_RC1(x) ((x) & 0x1F) +#define _DARF_RC2(x) (((x) & 0x1F) << 8) +#define _DARF_RC3(x) (((x) & 0x1F) << 16) +#define _DARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (DARFRC + 4) +#define _DARF_RC5(x) ((x) & 0x1F) +#define _DARF_RC6(x) (((x) & 0x1F) << 8) +#define _DARF_RC7(x) (((x) & 0x1F) << 16) +#define _DARF_RC8(x) (((x) & 0x1F) << 24) + + +//2 RARFRC +#define _RARF_RC1(x) ((x) & 0x1F) +#define _RARF_RC2(x) (((x) & 0x1F) << 8) +#define _RARF_RC3(x) (((x) & 0x1F) << 16) +#define _RARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (RARFRC + 4) +#define _RARF_RC5(x) ((x) & 0x1F) +#define _RARF_RC6(x) (((x) & 0x1F) << 8) +#define _RARF_RC7(x) (((x) & 0x1F) << 16) +#define _RARF_RC8(x) (((x) & 0x1F) << 24) + + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + + + +//2 EDCA setting +#define AC_PARAM_TXOP_LIMIT_OFFSET 16 +#define AC_PARAM_ECW_MAX_OFFSET 12 +#define AC_PARAM_ECW_MIN_OFFSET 8 +#define AC_PARAM_AIFS_OFFSET 0 + + +//2 EDCA_VO_PARAM +#define _AIFS(x) (x) +#define _ECW_MAX_MIN(x) ((x) << 8) +#define _TXOP_LIMIT(x) ((x) << 16) + + +#define _BCNIFS(x) ((x) & 0xFF) +#define _BCNECW(x) (((x) & 0xF))<< 8) + + +#define _LRL(x) ((x) & 0x3F) +#define _SRL(x) (((x) & 0x3F) << 8) + + +//2 SIFS_CCK +#define _SIFS_CCK_CTX(x) ((x) & 0xFF) +#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); + + +//2 SIFS_OFDM +#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) +#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); + + +//2 TBTT PROHIBIT +#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) + + +//2 REG_RD_CTRL +#define DIS_EDCA_CNT_DWN BIT(11) + + +//2 BCN_CTRL +#define EN_MBSSID BIT(1) +#define EN_TXBCN_RPT BIT(2) +#define EN_BCN_FUNCTION BIT(3) + +// The same function but different bit field. +#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) +#define DIS_TSF_UDT0_TEST_CHIP BIT(5) + +//2 ACMHWCTRL +#define AcmHw_HwEn BIT(0) +#define AcmHw_BeqEn BIT(1) +#define AcmHw_ViqEn BIT(2) +#define AcmHw_VoqEn BIT(3) +#define AcmHw_BeqStatus BIT(4) +#define AcmHw_ViqStatus BIT(5) +#define AcmHw_VoqStatus BIT(6) + + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +//2 APSD_CTRL +#define APSDOFF BIT(6) +#define APSDOFF_STATUS BIT(7) + + +//2 BWOPMODE +#define BW_20MHZ BIT(2) +//#define BW_OPMODE_20MHZ BIT(2) // For compability + + +#define RATE_BITMAP_ALL 0xFFFFF + +// Only use CCK 1M rate for ACK +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 + +//2 TCR +#define TSFRST BIT(0) +#define DIS_GCLK BIT(1) +#define PAD_SEL BIT(2) +#define PWR_ST BIT(6) +#define PWRBIT_OW_EN BIT(7) +#define ACRC BIT(8) +#define CFENDFORM BIT(9) +#define ICV BIT(10) + + + +//2 RCR +#define AAP BIT(0) +#define APM BIT(1) +#define AM BIT(2) +#define AB BIT(3) +#define ADD3 BIT(4) +#define APWRMGT BIT(5) +#define CBSSID BIT(6) +#define CBSSID_BCN BIT(7) +#define ACRC32 BIT(8) +#define AICV BIT(9) +#define ADF BIT(11) +#define ACF BIT(12) +#define AMF BIT(13) +#define HTC_LOC_CTRL BIT(14) +#define UC_DATA_EN BIT(16) +#define BM_DATA_EN BIT(17) +#define MFBEN BIT(22) +#define LSIGEN BIT(23) +#define EnMBID BIT(24) +#define APP_BASSN BIT(27) +#define APP_PHYSTS BIT(28) +#define APP_ICV BIT(29) +#define APP_MIC BIT(30) +#define APP_FCS BIT(31) + +//2 RX_PKT_LIMIT + +//2 RX_DLK_TIME + +//2 MBIDCAMCFG + + + +//2 AMPDU_MIN_SPACE +#define _MIN_SPACE(x) ((x) & 0x7) +#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) + + +//2 RXERR_RPT +#define RXERR_TYPE_OFDM_PPDU 0 +#define RXERR_TYPE_OFDM_FALSE_ALARM 1 +#define RXERR_TYPE_OFDM_MPDU_OK 2 +#define RXERR_TYPE_OFDM_MPDU_FAIL 3 +#define RXERR_TYPE_CCK_PPDU 4 +#define RXERR_TYPE_CCK_FALSE_ALARM 5 +#define RXERR_TYPE_CCK_MPDU_OK 6 +#define RXERR_TYPE_CCK_MPDU_FAIL 7 +#define RXERR_TYPE_HT_PPDU 8 +#define RXERR_TYPE_HT_FALSE_ALARM 9 +#define RXERR_TYPE_HT_MPDU_TOTAL 10 +#define RXERR_TYPE_HT_MPDU_OK 11 +#define RXERR_TYPE_HT_MPDU_FAIL 12 +#define RXERR_TYPE_RX_FULL_DROP 15 + +#define RXERR_COUNTER_MASK 0xFFFFF +#define RXERR_RPT_RST BIT(27) +#define _RXERR_RPT_SEL(type) ((type) << 28) + + +//2 SECCFG +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption +#define SCR_SKByA2 BIT(4) //Search kEY BY A2 +#define SCR_NoSKMC BIT(5) //No Key Search Multicast + + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- + +//2 USB Information (0xFE17) +#define USB_IS_HIGH_SPEED 0 +#define USB_IS_FULL_SPEED 1 +#define USB_SPEED_MASK BIT(5) + +#define USB_NORMAL_SIE_EP_MASK 0xF +#define USB_NORMAL_SIE_EP_SHIFT 4 + +#define USB_TEST_EP_MASK 0x30 +#define USB_TEST_EP_SHIFT 4 + +//2 Special Option +#define USB_AGG_EN BIT(3) + + +//2REG_C2HEVT_CLEAR +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. + + +//2REG_MULTI_FUNC_CTRL(For RTL8723 Only) +#define WL_HWPDN_EN BIT0 // Enable GPIO[9] as WiFi HW PDn source +#define WL_HWPDN_SL BIT1 // WiFi HW PDn polarity control +#define WL_FUNC_EN BIT2 // WiFi function enable +#define WL_HWROF_EN BIT3 // Enable GPIO[9] as WiFi RF HW PDn source +#define BT_HWPDN_EN BIT16 // Enable GPIO[11] as BT HW PDn source +#define BT_HWPDN_SL BIT17 // BT HW PDn polarity control +#define BT_FUNC_EN BIT18 // BT function enable +#define BT_HWROF_EN BIT19 // Enable GPIO[11] as BT/GPS RF HW PDn source +#define GPS_HWPDN_EN BIT20 // Enable GPIO[10] as GPS HW PDn source +#define GPS_HWPDN_SL BIT21 // GPS HW PDn polarity control +#define GPS_FUNC_EN BIT22 // GPS function enable + +//3 REG_LIFECTRL_CTRL +#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3 +#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2 +#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1 +#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0 + +#define HAL92C_MSDU_LIFE_TIME_UNIT 128 // in us, said by Tim. + +//======================================================== +// General definitions +//======================================================== + +#define MAC_ADDR_LEN 6 +#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 + +#define POLLING_LLT_THRESHOLD 20 +#define POLLING_READY_TIMEOUT_COUNT 1000 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A + +//---------------------------------------------------------------------------- +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO 0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) + + + +#include "basic_types.h" + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h new file mode 100755 index 000000000000..e74fe69685fc --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_SRESET_C_ +#define _RTL8192C_SRESET_C_ + +#include +#include +#include + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +#define WIFI_STATUS_SUCCESS 0 +#define USB_VEN_REQ_CMD_FAIL BIT0 +#define USB_READ_PORT_FAIL BIT1 +#define USB_WRITE_PORT_FAIL BIT2 +#define WIFI_MAC_TXDMA_ERROR BIT3 +#define WIFI_TX_HANG BIT4 +#define WIFI_RX_HANG BIT5 +#define WIFI_IF_NOT_EXIST BIT6 + +struct sreset_priv { + _mutex silentreset_mutex; + u8 silent_reset_inprogress; + u8 Wifi_Error_Status; + unsigned long last_tx_time; + unsigned long last_tx_complete_time; +}; + + +extern void rtl8192c_sreset_init_value(_adapter *padapter); +extern void rtl8192c_sreset_reset_value(_adapter *padapter); +extern void rtl8192c_silentreset_for_specific_platform(_adapter *padapter); +extern void rtl8192c_sreset_xmit_status_check(_adapter *padapter); +extern void rtl8192c_sreset_linked_status_check(_adapter *padapter); +extern u8 rtl8192c_sreset_get_wifi_status(_adapter *padapter); +#endif +#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h new file mode 100755 index 000000000000..f4428afd636a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h @@ -0,0 +1,91 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_XMIT_H_ +#define _RTL8192C_XMIT_H_ + +#define VO_QUEUE_INX 0 +#define VI_QUEUE_INX 1 +#define BE_QUEUE_INX 2 +#define BK_QUEUE_INX 3 +#define BCN_QUEUE_INX 4 +#define MGT_QUEUE_INX 5 +#define HIGH_QUEUE_INX 6 +#define TXCMD_QUEUE_INX 7 + +#define HW_QUEUE_ENTRY 8 + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +#ifdef CONFIG_USB_HCI + +#ifdef CONFIG_USB_TX_AGGREGATION +#define MAX_TX_AGG_PACKET_NUMBER 0xFF +#endif + +s32 rtl8192cu_init_xmit_priv(_adapter * padapter); + +void rtl8192cu_free_xmit_priv(_adapter * padapter); + +void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc); + +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +void rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8192ce_init_xmit_priv(_adapter * padapter); +void rtl8192ce_free_xmit_priv(_adapter * padapter); + +s32 rtl8192ce_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf); +struct xmit_buf *rtl8192ce_dequeue_xmitbuf(struct rtw_tx_ring *ring); + +void rtl8192ce_xmitframe_resume(_adapter *padapter); + +void rtl8192ce_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192ce_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192ce_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h new file mode 100755 index 000000000000..9f9a9303e5a4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h @@ -0,0 +1,103 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_CMD_H_ +#define __RTL8192D_CMD_H_ + + +//-------------------------------------------- +//3 Host Message Box +//-------------------------------------------- + +// User Define Message [31:8] + +//_SETPWRMODE_PARM +#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) +#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) + +//JOINBSSRPT_PARM +#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) + +//_RSVDPAGE_LOC +#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) +#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) + +//P2P_PS_OFFLOAD + +struct P2P_PS_Offload_t { + unsigned char Offload_En:1; + unsigned char role:1; // 1: Owner, 0: Client + unsigned char CTWindow_En:1; + unsigned char NoA0_En:1; + unsigned char NoA1_En:1; + unsigned char AllStaSleep:1; // Only valid in Owner + unsigned char discovery:1; + unsigned char rsvd:1; +}; + +#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value) + +// Description: Determine the types of H2C commands that are the same in driver and Fw. +// Fisrt constructed by tynli. 2009.10.09. +typedef enum _RTL8192D_H2C_CMD +{ + H2C_AP_OFFLOAD = 0, /*0*/ + H2C_SETPWRMODE = 1, /*1*/ + H2C_JOINBSSRPT = 2, /*2*/ + H2C_RSVDPAGE = 3, + H2C_RSSI_REPORT = 5, + H2C_RA_MASK = 6, + H2C_P2P_PS_OFFLOAD = 8, + H2C_MAC_MODE_SEL = 9, + H2C_PWRM=15, + H2C_P2P_PS_CTW_CMD = 24, + H2C_CMD_MAX +}RTL8192D_H2C_CMD; + +struct cmd_msg_parm { + u8 eid; //element id + u8 sz; // sz + u8 buf[6]; +}; + + +void FillH2CCmd92D(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer); + +// host message to firmware cmd +void rtl8192d_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode); +void rtl8192d_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus); +u8 rtl8192d_set_rssi_cmd(_adapter*padapter, u8 *param); +u8 rtl8192d_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg); +void rtl8192d_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg); +#ifdef CONFIG_P2P +void rtl8192d_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state); +#endif //CONFIG_P2P + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h new file mode 100755 index 000000000000..560f9578fd77 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h @@ -0,0 +1,471 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_DM_H__ +#define __RTL8192D_DM_H__ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ +//============================================================ +// Global var +//============================================================ +static u32 EDCAParam[maxAP][3] = +{ // UL DL + {0x5ea322, 0x00a630, 0x00a44f}, //atheros AP + {0x5ea32b, 0x5ea42b, 0x5e4322}, //broadcom AP + {0x5ea430, 0x5ea630, 0xa430}, //cisco AP + {0x5ea44f, 0x00a44f, 0x5ea42b}, //marvell AP + {0x5ea422, 0x00a44f, 0x00a44f}, //ralink AP + //{0x5ea44f, 0x5ea44f, 0x5ea44f}, //realtek AP + {0xa44f, 0x5ea44f, 0x5e431c}, //realtek AP + {0x5ea42b, 0xa630, 0x5e431c}, //airgocap AP + {0x5ea42b, 0x5ea42b, 0x5ea42b}, //unknown AP +// {0x5e4322, 0x00a44f, 0x5ea44f}, //unknown AP +}; + +#define OFDM_TABLE_SIZE 37 +#define OFDM_TABLE_SIZE_92D 43 +#define CCK_TABLE_SIZE 33 + +static u32 OFDMSwingTable[OFDM_TABLE_SIZE_92D] = { + 0x7f8001fe, // 0, +6.0dB + 0x788001e2, // 1, +5.5dB + 0x71c001c7, // 2, +5.0dB + 0x6b8001ae, // 3, +4.5dB + 0x65400195, // 4, +4.0dB + 0x5fc0017f, // 5, +3.5dB + 0x5a400169, // 6, +3.0dB + 0x55400155, // 7, +2.5dB + 0x50800142, // 8, +2.0dB + 0x4c000130, // 9, +1.5dB + 0x47c0011f, // 10, +1.0dB + 0x43c0010f, // 11, +0.5dB + 0x40000100, // 12, +0dB + 0x3c8000f2, // 13, -0.5dB + 0x390000e4, // 14, -1.0dB + 0x35c000d7, // 15, -1.5dB + 0x32c000cb, // 16, -2.0dB + 0x300000c0, // 17, -2.5dB + 0x2d4000b5, // 18, -3.0dB + 0x2ac000ab, // 19, -3.5dB + 0x288000a2, // 20, -4.0dB + 0x26000098, // 21, -4.5dB + 0x24000090, // 22, -5.0dB + 0x22000088, // 23, -5.5dB + 0x20000080, // 24, -6.0dB + 0x1e400079, // 25, -6.5dB + 0x1c800072, // 26, -7.0dB + 0x1b00006c, // 27. -7.5dB + 0x19800066, // 28, -8.0dB + 0x18000060, // 29, -8.5dB + 0x16c0005b, // 30, -9.0dB + 0x15800056, // 31, -9.5dB + 0x14400051, // 32, -10.0dB + 0x1300004c, // 33, -10.5dB + 0x12000048, // 34, -11.0dB + 0x11000044, // 35, -11.5dB + 0x10000040, // 36, -12.0dB + 0x0f00003c,// 37, -12.5dB + 0x0e400039,// 38, -13.0dB + 0x0d800036,// 39, -13.5dB + 0x0cc00033,// 40, -14.0dB + 0x0c000030,// 41, -14.5dB + 0x0b40002d,// 42, -15.0dB +}; + +static u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = { +{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB +{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB +{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB +{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB +{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB +{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB +{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB +{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB +{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB +{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB +{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB +{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB +{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB +{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB +{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB +{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB +{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB +{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB +{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB +{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB +{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB +{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB +{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB +{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB +{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB +{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB +{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB +{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB +{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB +{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB +{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB +{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB +{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB +}; + +static u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= { +{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB +{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB +{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB +{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB +{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB +{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB +{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB +{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB +{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB +{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB +{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB +{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB +{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB +{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB +{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB +{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB +{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB +{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB +{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB +{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB +{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB +{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB +{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB +{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB +{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB +{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB +{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB +{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB +{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB +{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB +{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB +{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB +{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB +}; + +//============================================================ +// structure and define +//============================================================ + +typedef struct _FALSE_ALARM_STATISTICS{ + u32 Cnt_Parity_Fail; + u32 Cnt_Rate_Illegal; + u32 Cnt_Crc8_fail; + u32 Cnt_Mcs_fail; + u32 Cnt_Fast_Fsync_fail; + u32 Cnt_SB_Search_fail; + u32 Cnt_Ofdm_fail; + u32 Cnt_Cck_fail; + u32 Cnt_all; +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; + +typedef struct _Dynamic_Power_Saving_ +{ + u8 PreCCAState; + u8 CurCCAState; + + u8 PreRFState; + u8 CurRFState; + + //int Rssi_val_min; + +}PS_T,*pPS_T; + +typedef struct _Dynamic_Initial_Gain_Threshold_ +{ + u8 Dig_Enable_Flag; + u8 Dig_Ext_Port_Stage; + + int RssiLowThresh; + int RssiHighThresh; + + u32 FALowThresh; + u32 FAHighThresh; + + u8 CurSTAConnectState; + u8 PreSTAConnectState; + u8 CurMultiSTAConnectState; + + u8 PreIGValue; + u8 CurIGValue; + + char BackoffVal; + char BackoffVal_range_max; + char BackoffVal_range_min; + u8 rx_gain_range_max; + u8 rx_gain_range_min; + u8 Rssi_val_min; + + u8 PreCCKPDState; + u8 CurCCKPDState; + + u8 LargeFAHit; + u8 ForbiddenIGI; + u32 Recover_cnt; + + //u8 PreCCAState; + //u8 CurCCAState; +}DIG_T; + +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition +{ + DIG_TYPE_THRESH_HIGH = 0, + DIG_TYPE_THRESH_LOW = 1, + DIG_TYPE_BACKOFF = 2, + DIG_TYPE_RX_GAIN_MIN = 3, + DIG_TYPE_RX_GAIN_MAX = 4, + DIG_TYPE_ENABLE = 5, + DIG_TYPE_DISABLE = 6, + DIG_OP_TYPE_MAX +}DM_DIG_OP_E; + +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition +{ + CCK_PD_STAGE_LowRssi = 0, + CCK_PD_STAGE_HighRssi = 1, + CCK_PD_STAGE_MAX = 2, +}DM_CCK_PDTH_E; + +typedef enum tag_1R_CCA_Type_Definition +{ + CCA_MIN = 0, + CCA_1R =1, + CCA_2R = 2, + CCA_MAX = 3, +}DM_1R_CCA_E; + +typedef enum tag_RF_Type_Definition +{ + RF_Save =0, + RF_Normal = 1, + RF_MAX = 2, +}DM_RF_E; + +typedef enum tag_DIG_EXT_PORT_ALGO_Definition +{ + DIG_EXT_PORT_STAGE_0 = 0, + DIG_EXT_PORT_STAGE_1 = 1, + DIG_EXT_PORT_STAGE_2 = 2, + DIG_EXT_PORT_STAGE_3 = 3, + DIG_EXT_PORT_STAGE_MAX = 4, +}DM_DIG_EXT_PORT_ALG_E; + + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + + +#define BW_AUTO_SWITCH_HIGH_LOW 25 +#define BW_AUTO_SWITCH_LOW_HIGH 30 + +#define DM_DIG_THRESH_HIGH 40 +#define DM_DIG_THRESH_LOW 35 + +#define DM_FALSEALARM_THRESH_LOW 400 +#define DM_FALSEALARM_THRESH_HIGH 1000 + +#define DM_DIG_MAX 0x3e +#define DM_DIG_MIN 0x1c + +#define DM_DIG_FA_UPPER 0x32 +#define DM_DIG_FA_LOWER 0x20 +#define DM_DIG_FA_TH0 0x100//0x20 +#define DM_DIG_FA_TH1 0x400//0x100 +#define DM_DIG_FA_TH2 0x600//0x200 + +#define DM_DIG_BACKOFF_MAX 12 +#define DM_DIG_BACKOFF_MIN (-4) +#define DM_DIG_BACKOFF_DEFAULT 10 + +#define RxPathSelection_SS_TH_low 30 +#define RxPathSelection_diff_TH 18 + +#define DM_RATR_STA_INIT 0 +#define DM_RATR_STA_HIGH 1 +#define DM_RATR_STA_MIDDLE 2 +#define DM_RATR_STA_LOW 3 + +#define CTSToSelfTHVal 30 +#define RegC38_TH 20 + +#define WAIotTHVal 25 + +//Dynamic Tx Power Control Threshold +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 + +#define TxHighPwrLevel_Normal 0 +#define TxHighPwrLevel_Level1 1 +#define TxHighPwrLevel_Level2 2 + +#define DM_Type_ByFW 0 +#define DM_Type_ByDriver 1 + +typedef struct _RATE_ADAPTIVE +{ + u8 RateAdaptiveDisabled; + u8 RATRState; + u16 reserve; + + u32 HighRSSIThreshForRA; + u32 High2LowRSSIThreshForRA; + u8 Low2HighRSSIThreshForRA40M; + u32 LowRSSIThreshForRA40M; + u8 Low2HighRSSIThreshForRA20M; + u32 LowRSSIThreshForRA20M; + u32 UpperRSSIThresholdRATR; + u32 MiddleRSSIThresholdRATR; + u32 LowRSSIThresholdRATR; + u32 LowRSSIThresholdRATR40M; + u32 LowRSSIThresholdRATR20M; + u8 PingRSSIEnable; //cosa add for Netcore long range ping issue + u32 PingRSSIRATR; //cosa add for Netcore long range ping issue + u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue + u32 LastRATR; + u8 PreRATRState; + +} RATE_ADAPTIVE, *PRATE_ADAPTIVE; + +struct dm_priv +{ + u8 DM_Type; + u8 DMFlag, DMFlag_tmp; + + //for DIG + u8 bDMInitialGainEnable; + //u8 binitialized; // for dm_initial_gain_Multi_STA use. + DIG_T DM_DigTable; + + PS_T DM_PSTable; + + FALSE_ALARM_STATISTICS FalseAlmCnt; + + //for rate adaptive, in fact, 88c/92c fw will handle this + u8 bUseRAMask; + RATE_ADAPTIVE RateAdaptive; + + //* Upper and Lower Signal threshold for Rate Adaptive*/ + int UndecoratedSmoothedPWDB; + int EntryMinUndecoratedSmoothedPWDB; + int EntryMaxUndecoratedSmoothedPWDB; + int MinUndecoratedPWDBForDM; + int LastMinUndecoratedPWDBForDM; + + //for High Power + u8 bDynamicTxPowerEnable; + u8 LastDTPLvl; + u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 + + //for tx power tracking + u8 bTXPowerTracking; + u8 TXPowercount; + u8 bTXPowerTrackingInit; + u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default + u8 TM_Trigger; + + u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 + u8 ThermalValue; + u8 ThermalValue_LCK; + u8 ThermalValue_IQK; + u8 ThermalValue_AVG[AVG_THERMAL_NUM]; + u8 ThermalValue_AVG_index; + u8 ThermalValue_RxGain; + u8 ThermalValue_Crystal; + u8 Delta_IQK; + u8 Delta_LCK; + u8 bRfPiEnable; + u8 bReloadtxpowerindex; + u8 bDoneTxpower; + + //for APK + u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a + u8 bAPKdone; + u8 bAPKThermalMeterIgnore; + + //for IQK + u32 Reg874; + u32 RegC08; + u32 Reg88C; + u8 Reg522; + u8 Reg550; + u8 Reg551; + u32 Reg870; + u32 ADDA_backup[IQK_ADDA_REG_NUM]; + u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; + u32 IQK_BB_backup[IQK_BB_REG_NUM]; + + u8 bCCKinCH14; + + char CCK_index; + //u8 Record_CCK_20Mindex; + //u8 Record_CCK_40Mindex; + char OFDM_index[2]; + + //for TxPwrTracking + int RegE94; + int RegE9C; + int RegEB4; + int RegEBC; +#if MP_DRIVER == 1 + u8 RegC04_MP; + u32 RegD04_MP; +#endif + u32 TXPowerTrackingCallbackCnt; //cosa add for debug + + u32 prv_traffic_idx; // edca turbo + + u32 RegRF3C[2]; //pathA / pathB + + // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas + u8 INIDATA_RATE[32]; +}; + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ +//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} + + +//============================================================ +// function prototype +//============================================================ +void rtl8192d_init_dm_priv(IN PADAPTER Adapter); +void rtl8192d_deinit_dm_priv(IN PADAPTER Adapter); +void rtl8192d_InitHalDm(IN PADAPTER Adapter); +void rtl8192d_HalDmWatchDog(IN PADAPTER Adapter); + +VOID rtl8192d_dm_CheckTXPowerTracking(IN PADAPTER Adapter); + +#endif //__HAL8190PCIDM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h new file mode 100755 index 000000000000..0996a5c2fb73 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h @@ -0,0 +1,857 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_HAL_H__ +#define __RTL8192D_HAL_H__ + +#include "rtl8192d_spec.h" +#include "Hal8192DPhyReg.h" +#include "Hal8192DPhyCfg.h" +#include "rtl8192d_rf.h" +#include "rtl8192d_dm.h" +#include "rtl8192d_recv.h" +#include "rtl8192d_xmit.h" +#include "rtl8192d_cmd.h" + +#ifdef CONFIG_PCI_HCI + #include + #include "Hal8192DEHWImg.h" + #include "Hal8192DETestHWImg.h" + + #define RTL819X_DEFAULT_RF_TYPE RF_2T2R + //#define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //2TODO: The following need to check!! + #define RTL8192D_FW_IMG "rtl8192DE\\rtl8192dfw.bin" + + //For 92DE + #define RTL8192D_PHY_REG "rtl8192DE\\PHY_REG.txt" + #define RTL8192D_PHY_REG_PG "rtl8192DE\\PHY_REG_PG.txt" + #define RTL8192D_PHY_REG_MP "rtl8192DE\\PHY_REG_MP.txt" + + #define RTL8192D_AGC_TAB "rtl8192DE\\AGC_TAB.txt" + #define RTL8192D_AGC_TAB_2G "rtl8192DE\\AGC_TAB_2G.txt" + #define RTL8192D_AGC_TAB_5G "rtl8192DE\\AGC_TAB_5G.txt" + #define RTL8192D_PHY_RADIO_A "rtl8192DE\\radio_a.txt" + #define RTL8192D_PHY_RADIO_B "rtl8192DE\\radio_b.txt" + #define RTL8192D_PHY_MACREG "rtl8192DE\\MAC_REG.txt" + #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DE\\radio_a_intPA.txt" + #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DE\\radio_b_intPA.txt" + + #define RTL8192D_TEST_FW_IMG_FILE "rtl8192DE\\rtl8192dfw_test.bin" + #define RTL8192D_TEST_PHY_REG_PG_FILE "rtl8192DE\\PHY_REG_PG_test.txt" + + #define RTL8192D_TEST_PHY_REG_FILE "rtl8192DE\\PHY_REG_test.txt" + #define RTL8192D_TEST_PHY_RADIO_A_FILE "rtl8192DE\\radio_a_test.txt" + #define RTL8192D_TEST_PHY_RADIO_B_FILE "rtl8192DE\\radio_b_test.txt" + #define RTL8192D_TEST_AGC_TAB_2G "rtl8192DE\\AGC_TAB_2G_test.txt" + #define RTL8192D_TEST_AGC_TAB_5G "rtl8192DE\\AGC_TAB_5G_test.txt" + #define RTL8192D_TEST_MAC_REG_FILE "rtl8192DE\\MAC_REG_test.txt" + + // The file name "_2T" is for 92CE, "_1T" is for 88CE. Modified by tynli. 2009.11.24. + #define Rtl819XFwImageArray Rtl8192DEFwImgArray + #define Rtl819XMAC_Array Rtl8192DEMAC_2TArray + #define Rtl819XAGCTAB_Array Rtl8192DEAGCTAB_Array + #define Rtl819XAGCTAB_5GArray Rtl8192DEAGCTAB_5GArray + #define Rtl819XAGCTAB_2GArray Rtl8192DEAGCTAB_2GArray + #define Rtl819XPHY_REG_2TArray Rtl8192DEPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192DEPHY_REG_1TArray + #define Rtl819XRadioA_2TArray Rtl8192DERadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192DERadioA_1TArray + #define Rtl819XRadioA_2T_intPAArray Rtl8192DERadioA_2T_intPAArray + #define Rtl819XRadioB_2TArray Rtl8192DERadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192DERadioB_1TArray + #define Rtl819XRadioB_2T_intPAArray Rtl8192DERadioB_2T_intPAArray + #define Rtl819XPHY_REG_Array_PG Rtl8192DEPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_MP Rtl8192DEPHY_REG_Array_MP + #define Rtl819XAGCTAB_2TArray Rtl8192DEAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192DEAGCTAB_1TArray + +#elif defined(CONFIG_USB_HCI) + + #include "Hal8192DUHWImg.h" + #include "Hal8192DUTestHWImg.h" + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //2TODO: The following need to check!! + #define RTL8192D_FW_IMG "rtl8192DU\\rtl8192dfw.bin" + + //For 92DU + #define RTL8192D_PHY_REG "rtl8192DU\\PHY_REG.txt" + #define RTL8192D_PHY_REG_PG "rtl8192DU\\PHY_REG_PG.txt" + #define RTL8192D_PHY_REG_MP "rtl8192DU\\PHY_REG_MP.txt" + + #define RTL8192D_AGC_TAB "rtl8192DU\\AGC_TAB.txt" + #define RTL8192D_AGC_TAB_2G "rtl8192DU\\AGC_TAB_2G.txt" + #define RTL8192D_AGC_TAB_5G "rtl8192DU\\AGC_TAB_5G.txt" + #define RTL8192D_PHY_RADIO_A "rtl8192DU\\radio_a.txt" + #define RTL8192D_PHY_RADIO_B "rtl8192DU\\radio_b.txt" + #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DU\\radio_a_intPA.txt" + #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DU\\radio_b_intPA.txt" + #define RTL8192D_PHY_MACREG "rtl8192DU\\MAC_REG.txt" + + #define RTL8192D_TEST_FW_IMG_FILE "rtl8192DU\\rtl8192dfw_test.bin" + #define RTL8192D_TEST_PHY_REG_PG_FILE "rtl8192DU\\PHY_REG_PG_test.txt" + + #define RTL8192D_TEST_PHY_REG_FILE "rtl8192DU\\PHY_REG_test.txt" + #define RTL8192D_TEST_PHY_RADIO_A_FILE "rtl8192DU\\radio_a_test.txt" + #define RTL8192D_TEST_PHY_RADIO_B_FILE "rtl8192DU\\radio_b_test.txt" + #define RTL8192D_TEST_AGC_TAB_2G "rtl8192DU\\AGC_TAB_2G_test.txt" + #define RTL8192D_TEST_AGC_TAB_5G "rtl8192DU\\AGC_TAB_5G_test.txt" + #define RTL8192D_TEST_MAC_REG_FILE "rtl8192DU\\MAC_REG_test.txt" + + // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24. + #define Rtl819XFwImageArray Rtl8192DUFwImgArray + #define Rtl819XMAC_Array Rtl8192DUMAC_2TArray + #define Rtl819XAGCTAB_Array Rtl8192DUAGCTAB_Array + #define Rtl819XAGCTAB_5GArray Rtl8192DUAGCTAB_5GArray + #define Rtl819XAGCTAB_2GArray Rtl8192DUAGCTAB_2GArray + #define Rtl819XPHY_REG_2TArray Rtl8192DUPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192DUPHY_REG_1TArray + #define Rtl819XRadioA_2TArray Rtl8192DURadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192DURadioA_1TArray + #define Rtl819XRadioA_2T_intPAArray Rtl8192DURadioA_2T_intPAArray + #define Rtl819XRadioB_2TArray Rtl8192DURadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192DURadioB_1TArray + #define Rtl819XRadioB_2T_intPAArray Rtl8192DURadioB_2T_intPAArray + #define Rtl819XPHY_REG_Array_PG Rtl8192DUPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_MP Rtl8192DUPHY_REG_Array_MP + + #define Rtl819XAGCTAB_2TArray Rtl8192DUAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192DUAGCTAB_1TArray + +#endif + +#define DRVINFO_SZ 4 // unit is 8bytes +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) + +// +// Check if FW header exists. We do not consider the lower 4 bits in this case. +// By tynli. 2009.12.04. +// +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D1 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D2 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D3 ) + +#define FW_8192D_SIZE 0x8000 +#define FW_8192D_START_ADDRESS 0x1000 + +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes + +typedef enum _FIRMWARE_SOURCE{ + FW_SOURCE_IMG_FILE = 0, + FW_SOURCE_HEADER_FILE = 1, //from header file +}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; + +typedef struct _RT_FIRMWARE{ + FIRMWARE_SOURCE eFWSource; + #ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; + #else + u8 szFwBuffer[FW_8192D_SIZE]; + #endif + u32 ulFwLength; +}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92D, *PRT_FIRMWARE_92D; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8192D_FIRMWARE_HDR {//8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u8 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; + +}RT_8192D_FIRMWARE_HDR, *PRT_8192D_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME 0x05 +#define BCN_DMA_ATIME_INT_TIME 0x02 + +typedef enum _BT_CoType{ + BT_2Wire = 0, + BT_ISSC_3Wire = 1, + BT_Accel = 2, + BT_CSR = 3, + BT_CSR_ENHAN = 4, + BT_RTL8756 = 5, +} BT_CoType, *PBT_CoType; + +typedef enum _BT_CurState{ + BT_OFF = 0, + BT_ON = 1, +} BT_CurState, *PBT_CurState; + +typedef enum _BT_ServiceType{ + BT_SCO = 0, + BT_A2DP = 1, + BT_HID = 2, + BT_HID_Idle = 3, + BT_Scan = 4, + BT_Idle = 5, + BT_OtherAction = 6, + BT_Busy = 7, + BT_OtherBusy = 8, +} BT_ServiceType, *PBT_ServiceType; + +typedef enum _BT_RadioShared{ + BT_Radio_Shared = 0, + BT_Radio_Individual = 1, +} BT_RadioShared, *PBT_RadioShared; + +typedef struct _BT_COEXIST_STR{ + u8 BluetoothCoexist; + u8 BT_Ant_Num; + u8 BT_CoexistType; + u8 BT_State; + u8 BT_CUR_State; //0:on, 1:off + u8 BT_Ant_isolation; //0:good, 1:bad + u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic + u8 BT_Service; + u8 BT_RadioSharedType; + u8 Ratio_Tx; + u8 Ratio_PRI; +}BT_COEXIST_STR, *PBT_COEXIST_STR; + +//Added for 92D IQK setting. +typedef struct _IQK_MATRIX_REGS_SETTING{ + BOOLEAN bIQKDone; +#if 1 + int Value[1][IQK_Matrix_REG_NUM]; +#else + u32 Mark[IQK_Matrix_REG_NUM]; + u32 Value[IQK_Matrix_REG_NUM]; +#endif +}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING; + +#ifdef CONFIG_USB_RX_AGGREGATION + +typedef enum _USB_RX_AGG_MODE{ + USB_RX_AGG_DISABLE, + USB_RX_AGG_DMA, + USB_RX_AGG_USB, + USB_RX_AGG_DMA_USB +}USB_RX_AGG_MODE; + +#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer + +#endif + + +#define TX_SELE_HQ BIT(0) // High Queue +#define TX_SELE_LQ BIT(1) // Low Queue +#define TX_SELE_NQ BIT(2) // Normal Queue + + +// Note: We will divide number of page equally for each queue other than public queue! + +#define TX_TOTAL_PAGE_NUMBER 0xF8 +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define NORMAL_PAGE_NUM_PUBQ 0x56 + + +// For Test Chip Setting +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define TEST_PAGE_NUM_PUBQ 0x89 +#define TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC 0x7A +#define NORMAL_PAGE_NUM_PUBQ_92D_DUAL_MAC 0x5A +#define NORMAL_PAGE_NUM_HPQ_92D_DUAL_MAC 0x10 +#define NORMAL_PAGE_NUM_LPQ_92D_DUAL_MAC 0x10 +#define NORMAL_PAGE_NUM_NORMALQ_92D_DUAL_MAC 0 + +#define TX_PAGE_BOUNDARY_DUAL_MAC (TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC + 1) + +// For Test Chip Setting +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 +#define WMM_TEST_PAGE_NUM_HPQ 0x29 +#define WMM_TEST_PAGE_NUM_LPQ 0x29 + + +//Note: For Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 +#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C + +#define WMM_NORMAL_PAGE_NUM_PUBQ_92D 0X65//0x82 +#define WMM_NORMAL_PAGE_NUM_HPQ_92D 0X30//0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ_92D 0X30 +#define WMM_NORMAL_PAGE_NUM_NPQ_92D 0X30 + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_92C BIT(0) +#define CHIP_92C_1T2R BIT(1) +#define CHIP_8723 BIT(2) // RTL8723 With BT feature +#define CHIP_8723_DRV_REV BIT(3) // RTL8723 Driver Revised +#define NORMAL_CHIP BIT(4) +#define CHIP_VENDOR_UMC BIT(5) +#define CHIP_VENDOR_UMC_B_CUT BIT(6) // Chip version for ECO + +//for 92D +#define CHIP_92D BIT(8) +#define CHIP_92D_SINGLEPHY BIT(9) +#define CHIP_92D_C_CUT BIT(10) +#define CHIP_92D_D_CUT BIT(11) +#define CHIP_92D_E_CUT BIT(12) + +#define IS_NORMAL_CHIP(version) (((version) & NORMAL_CHIP) ? _TRUE : _FALSE) +#define IS_92C_SERIAL(version) (((version) & CHIP_92C) ? _TRUE : _FALSE) +#define IS_8723_SERIES(version) (((version) & CHIP_8723) ? _TRUE : _FALSE) +#define IS_92C_1T2R(version) (((version) & CHIP_92C) && ((version) & CHIP_92C_1T2R)) +#define IS_VENDOR_UMC(version) (((version) & CHIP_VENDOR_UMC) ? _TRUE : _FALSE) +#define IS_VENDOR_UMC_A_CUT(version) (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT6|BIT7)) ? _FALSE : _TRUE) : _FALSE) +#define IS_VENDOR_8723_A_CUT(version) (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT6)) ? _FALSE : _TRUE) : _FALSE) + +#define IS_92D_SINGLEPHY(version) ((version & CHIP_92D_SINGLEPHY) ? _TRUE : _FALSE) +#define IS_92D_C_CUT(version) ((version & CHIP_92D_C_CUT) ? _TRUE : _FALSE) +#define IS_92D_D_CUT(version) ((version & CHIP_92D_D_CUT) ? _TRUE : _FALSE) +#define IS_92D_E_CUT(version) ((version & CHIP_92D_E_CUT) ? _TRUE : _FALSE) + +// 20100707 Joseph: Add vendor information into chip version definition. +// 20100902 Roger: Add UMC B-Cut and RTL8723 chip info definition. +/* +| BIT 7 | BIT6 | BIT 5 | BIT 4 | BIT 3 | BIT 2 | BIT 1 | BIT 0 | ++--------+---------+---------------------- +------------ +----------- +------ +-----------------+ +|Reserved | UMC BCut |Manufacturer(TSMC/UMC) | TEST/NORMAL | 8723 Version | 8723? | 1T2R? | 88C/92C | +*/ +/* +92D chip ver: +BIT8: IS 92D +BIT9: single phy +BIT10: C-cut +BIT11: D-cut +BIT12: E-cut +*/ +typedef enum _VERSION_8192D{ + VERSION_TEST_CHIP_88C = 0x00, + VERSION_TEST_CHIP_92C = 0x01, + VERSION_NORMAL_TSMC_CHIP_88C = 0x10, + VERSION_NORMAL_TSMC_CHIP_92C = 0x11, + VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x13, + VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x30, + VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x31, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x33, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x34, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x3c, + VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x70, + VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x71, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x73, + VERSION_TEST_CHIP_92D_SINGLEPHY= 0x300, + VERSION_TEST_CHIP_92D_DUALPHY = 0x100, + VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x310, + VERSION_NORMAL_CHIP_92D_DUALPHY = 0x110, + VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x710, + VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x510, + VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0xB10, + VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x910, + VERSION_NORMAL_CHIP_92D_E_CUT_SINGLEPHY = 0x1310, + VERSION_NORMAL_CHIP_92D_E_CUT_DUALPHY = 0x1110, +}VERSION_8192D,*PVERSION_8192D; + + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- +enum ChannelPlan{ + CHPL_FCC = 0, + CHPL_IC = 1, + CHPL_ETSI = 2, + CHPL_SPAIN = 3, + CHPL_FRANCE = 4, + CHPL_MKK = 5, + CHPL_MKK1 = 6, + CHPL_ISRAEL = 7, + CHPL_TELEC = 8, + CHPL_GLOBAL = 9, + CHPL_WORLD = 10, +}; + +typedef struct _TxPowerInfo{ + u8 CCKIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_1SIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_2SIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20IndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 OFDMIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 TSSI_A[3]; + u8 TSSI_B[3]; +}TxPowerInfo, *PTxPowerInfo; + +#define EFUSE_REAL_CONTENT_LEN 1024 +#define EFUSE_MAP_LEN 256 +#define EFUSE_MAX_SECTION 32 +#define EFUSE_MAX_SECTION_BASE 16 +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 2byte|----8bytes----|1byte|--7bytes--| //92D +#define EFUSE_OOB_PROTECT_BYTES 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. + +#ifdef CONFIG_PCI_HCI +struct hal_data_8192de +{ + VERSION_8192D VersionID; + + // add for 92D Phy mode/mac/Band mode + MACPHY_MODE_8192D MacPhyMode92D; + BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G + BAND_TYPE BandSet92D; + BOOLEAN bIsVS; + BOOLEAN bSupportRemoteWakeUp; + u8 AutoLoadStatusFor8192D; + + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + u32 IntrMask[2]; + u32 IntrMaskToSet[2]; + + u32 DisabledFunctions; + + //current WIFI_PHY values + u32 ReceiveConfig; + u32 TransmitConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + u16 BasicRateSet; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + // + // EEPROM setting. + // + u16 EEPROMVID; + u16 EEPROMDID; + u16 EEPROMSVID; + u16 EEPROMSMID; + u16 EEPROMChannelPlan; + u16 EEPROMVersion; + + u8 EEPROMCustomerID; + u8 EEPROMBoardType; + u8 EEPROMRegulatory; + + u8 EEPROMThermalMeter; + + u8 EEPROMC9; + u8 EEPROMCC; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER_2G]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + + u8 CrystalCap; // CrystalCap. + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + u8 InternalPA5G[2]; //pathA / pathB + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + BOOLEAN bPhyValueInitReady; + + BOOLEAN bTXPowerDataReadFromEEPORM; + + BOOLEAN bInSetPower; + + //RDG enable + BOOLEAN bRDGEnable; + + BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress + BOOLEAN bNeedIQK; + + BOOLEAN bLCKInProgress; + + BOOLEAN bEarlyModeEnable; + +#if 1 + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; +#else + //regc80regc94regc4cregc88regc9cregc14regca0regc1cregc78 + u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM]; + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel. +#endif + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + + struct dm_priv dmpriv; + + u8 bInterruptMigration; + + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u16 RegRRSR; + + u16 EfuseUsedBytes; + u8 RTSInitRate; // 2010.11.24.by tynli. +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192de HAL_DATA_TYPE, *PHAL_DATA_TYPE; + +// +// Function disabled. +// +#define DF_TX_BIT BIT0 +#define DF_RX_BIT BIT1 +#define DF_IO_BIT BIT2 +#define DF_IO_D3_BIT BIT3 + +#define RT_DF_TYPE u32 +#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits))) +#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits)))) +#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) + +void InterruptRecognized8192DE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); +VOID UpdateInterruptMask8192DE(PADAPTER Adapter, u32 AddMSR, u32 RemoveMSR); +#endif + +#ifdef CONFIG_USB_HCI + +//should be renamed and moved to another file +typedef enum _INTERFACE_SELECT_8192DUSB{ + INTF_SEL0_USB = 0, // USB + INTF_SEL1_MINICARD = 1, // Minicard + INTF_SEL2_EKB_PRO = 2, // Eee keyboard proprietary + INTF_SEL3_PRO = 3, // Customized proprietary +} INTERFACE_SELECT_8192DUSB, *PINTERFACE_SELECT_8192DUSB; + +typedef INTERFACE_SELECT_8192DUSB INTERFACE_SELECT_USB; + +struct hal_data_8192du +{ + VERSION_8192D VersionID; + + // add for 92D Phy mode/mac/Band mode + MACPHY_MODE_8192D MacPhyMode92D; + BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G + BAND_TYPE BandSet92D; + BOOLEAN bIsVS; + + BOOLEAN bSupportRemoteWakeUp; + +#if (RTL8192D_DUAL_MAC_MODE_SWITCH == 1) + BOOLEAN bMasterOfDMSP; + BOOLEAN bSlaveOfDMSP; + + PADAPTER BuddyAdapter; +#endif + + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + //current WIFI_PHY values + u32 ReceiveConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + u16 BasicRateSet; + + INTERFACE_SELECT_8192DUSB InterfaceSel; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + // + // EEPROM setting. + // + u8 EEPROMVersion; + u16 EEPROMVID; + u16 EEPROMPID; + u16 EEPROMSVID; + u16 EEPROMSDID; + u8 EEPROMCustomerID; + u8 EEPROMSubCustomerID; + u8 EEPROMRegulatory; + + u8 EEPROMThermalMeter; + + u8 EEPROMC9; + u8 EEPROMCC; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER_2G]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + + u8 CrystalCap; // CrystalCap. + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + u8 InternalPA5G[2]; //pathA / pathB + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + BOOLEAN bPhyValueInitReady; + + BOOLEAN bTXPowerDataReadFromEEPORM; + + BOOLEAN bInSetPower; + + //RDG enable + BOOLEAN bRDGEnable; + + BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress + BOOLEAN bNeedIQK; + + BOOLEAN bLCKInProgress; + + BOOLEAN bEarlyModeEnable; + +#if 1 + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; +#else + //regc80regc94regc4cregc88regc9cregc14regca0regc1cregc78 + u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM]; + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel. +#endif + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + + struct dm_priv dmpriv; + + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + //Query RF by FW + BOOLEAN bReadRFbyFW; + + // For 92C USB endpoint setting + // + + u32 UsbBulkOutSize; + + int RtBulkOutPipe[3]; + int RtBulkInPipe; + int RtIntInPipe; + + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u8 OutEpQueueSel; + u8 OutEpNumber; + + u8 Queue2EPNum[8];//for out endpoint number mapping + +#ifdef CONFIG_USB_TX_AGGREGATION + u8 UsbTxAggMode; + u8 UsbTxAggDescNum; +#endif +#ifdef CONFIG_USB_RX_AGGREGATION + u16 HwRxPageSize; // Hardware setting + u32 MaxUsbRxAggBlock; + + USB_RX_AGG_MODE UsbRxAggMode; + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed + u8 UsbRxAggBlockTimeout; + u8 UsbRxAggPageCount; // 8192C DMA page count + u8 UsbRxAggPageTimeout; +#endif + + u16 RegRRSR; + + u16 EfuseUsedBytes; + u8 RTSInitRate; // 2010.11.24.by tynli. +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192du HAL_DATA_TYPE, *PHAL_DATA_TYPE; +#endif + +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +int FirmwareDownload92D(IN PADAPTER Adapter); +VOID rtl8192d_FirmwareSelfReset(IN PADAPTER Adapter); +void rtl8192d_ReadChipVersion(IN PADAPTER Adapter); +VOID rtl8192d_ReadChannelPlan(PADAPTER Adapter, u8* PROMContent, BOOLEAN AutoLoadFail); +VOID rtl8192d_ReadTxPowerInfo(PADAPTER Adapter, u8* PROMContent, BOOLEAN AutoLoadFail); +VOID rtl8192d_ResetDualMacSwitchVariables(IN PADAPTER Adapter); +u8 GetEEPROMSize8192D(PADAPTER Adapter); +void rtl8192d_HalSetBrateCfg(PADAPTER Adapter, u8 *mBratesOS, u16 *pBrateCfg); +BOOLEAN PHY_CheckPowerOffFor8192D(PADAPTER Adapter); +VOID PHY_SetPowerOnFor8192D(PADAPTER Adapter); +void PHY_ConfigMacPhyMode92D(PADAPTER Adapter); +void rtl8192d_free_hal_data(_adapter * padapter); +void rtl8192d_set_hal_ops(struct hal_ops *pHalFunc); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h new file mode 100755 index 000000000000..95e20ac8f8a6 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h @@ -0,0 +1,44 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_LED_H_ +#define __RTL8192D_LED_H_ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8192du_InitSwLeds(_adapter *padapter); +void rtl8192du_DeInitSwLeds(_adapter *padapter); +#endif + +#ifdef CONFIG_PCI_HCI +void rtl8192de_gen_RefreshLedState(PADAPTER Adapter); +void rtl8192de_InitSwLeds(_adapter *padapter); +void rtl8192de_DeInitSwLeds(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h new file mode 100755 index 000000000000..8641ddcdbcd7 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h @@ -0,0 +1,182 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192D_RECV_H_ +#define _RTL8192D_RECV_H_ + +#include +#include +#include + + +#ifdef PLATFORM_OS_XP + #ifdef CONFIG_SDIO_HCI + #define NR_RECVBUFF 1024//512//128 + #else + #define NR_RECVBUFF (16) + #endif +#elif defined(PLATFORM_OS_CE) + #ifdef CONFIG_SDIO_HCI + #define NR_RECVBUFF (128) + #else + #define NR_RECVBUFF (4) + #endif +#else + #define NR_RECVBUFF (4) + #define NR_PREALLOC_RECV_SKB (8) +#endif + + + +#define RECV_BLK_SZ 512 +#define RECV_BLK_CNT 16 +#define RECV_BLK_TH RECV_BLK_CNT + +#if defined(CONFIG_USB_HCI) + +#ifdef PLATFORM_OS_CE +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k +#else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + //#define MAX_RECVBUF_SZ (32768) // 32k + //#define MAX_RECVBUF_SZ (16384) //16K + //#define MAX_RECVBUF_SZ (10240) //10K + #define MAX_RECVBUF_SZ (15360) // 15k < 16k + #else + #define MAX_RECVBUF_SZ (4000) // about 4K + #endif +#endif + +#elif defined(CONFIG_PCI_HCI) +#ifndef CONFIG_MINIMAL_MEMORY_USAGE + #define MAX_RECVBUF_SZ (9100) +#else + #define MAX_RECVBUF_SZ (4000) // about 4K +#endif + +#define RX_MPDU_QUEUE 0 +#define RX_CMD_QUEUE 1 +#define RX_MAX_QUEUE 2 +#endif + +#define RECV_BULK_IN_ADDR 0x80 +#define RECV_INT_IN_ADDR 0x81 + +#define PHY_RSSI_SLID_WIN_MAX 100 +#define PHY_LINKQUALITY_SLID_WIN_MAX 20 + +struct phy_stat +{ + unsigned int phydw0; + + unsigned int phydw1; + + unsigned int phydw2; + + unsigned int phydw3; + + unsigned int phydw4; + + unsigned int phydw5; + + unsigned int phydw6; + + unsigned int phydw7; +}; + +typedef struct _Phy_OFDM_Rx_Status_Report_8192cd +{ + unsigned char trsw_gain_X[4]; + unsigned char pwdb_all; + unsigned char cfosho_X[4]; + unsigned char cfotail_X[4]; + unsigned char rxevm_X[2]; + unsigned char rxsnr_X[4]; + unsigned char pdsnr_X[2]; + unsigned char csi_current_X[2]; + unsigned char csi_target_X[2]; + unsigned char sigevm; + unsigned char max_ex_pwr; +//#ifdef RTL8192SE +#ifdef CONFIG_LITTLE_ENDIAN + unsigned char ex_intf_flg:1; + unsigned char sgi_en:1; + unsigned char rxsc:2; + //unsigned char rsvd:4; + unsigned char idle_long:1; + unsigned char r_ant_train_en:1; + unsigned char ANTSELB:1; + unsigned char ANTSEL:1; +#else // _BIG_ENDIAN_ + //unsigned char rsvd:4; + unsigned char ANTSEL:1; + unsigned char ANTSELB:1; + unsigned char r_ant_train_en:1; + unsigned char idle_long:1; + unsigned char rxsc:2; + unsigned char sgi_en:1; + unsigned char ex_intf_flg:1; +#endif +//#else // RTL8190, RTL8192E +// unsigned char sgi_en; +// unsigned char rxsc_sgien_exflg; +//#endif +}__attribute__ ((packed)) PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD; + +typedef struct _Phy_CCK_Rx_Status_Report_8192cd +{ + /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend + 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */ + u8 adc_pwdb_X[4]; + u8 SQ_rpt; + u8 cck_agc_rpt; +} PHY_STS_CCK_8192CD_T; + +// Rx smooth factor +#define Rx_Smooth_Factor (20) + +#ifdef CONFIG_USB_HCI +typedef struct _INTERRUPT_MSG_FORMAT_EX{ + unsigned int C2H_MSG0; + unsigned int C2H_MSG1; + unsigned int C2H_MSG2; + unsigned int C2H_MSG3; + unsigned int HISR; // from HISR Reg0x124, read to clear + unsigned int HISRE;// from HISRE Reg0x12c, read to clear + unsigned int MSG_EX; +}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX; + +void rtl8192du_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +int rtl8192du_init_recv_priv(_adapter * padapter); +void rtl8192du_free_recv_priv(_adapter * padapter); +void rtl8192du_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +#ifdef CONFIG_PCI_HCI +int rtl8192de_init_recv_priv(_adapter * padapter); +void rtl8192de_free_recv_priv(_adapter * padapter); +void rtl8192de_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +void rtl8192d_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat, BOOLEAN bPacketMatchBSSID); +void rtl8192d_process_phy_info(_adapter *padapter, void *prframe); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h new file mode 100755 index 000000000000..eea18b94087b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h @@ -0,0 +1,98 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192d_rf.h ( Header File) + * + * Note: Collect every HAL RF type exter API or constant. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * + * +******************************************************************************/ +#ifndef _RTL8192D_RF_H_ +#define _RTL8192D_RF_H_ +/* Check to see if the file has been included already. */ + + +/*--------------------------Define Parameters-------------------------------*/ + +// +// For RF 6052 Series +// +#define RF6052_MAX_TX_PWR 0x3F +#define RF6052_MAX_REG 0x3F +#define RF6052_MAX_PATH 2 +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ + +// +// RF RL6052 Series API +// +void rtl8192d_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate); +void rtl8192d_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth); +VOID rtl8192d_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel); +VOID rtl8192d_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel); +int PHY_RF6052_Config8192D( IN PADAPTER Adapter ); + +BOOLEAN rtl8192d_PHY_EnableAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); + +void rtl8192d_PHY_PowerDownAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); + + +/*--------------------------Exported Function prototype---------------------*/ + + +#endif/* End of HalRf.h */ + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h new file mode 100755 index 000000000000..4e69b281ee13 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h @@ -0,0 +1,1859 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + +#ifndef __RTL8192D_SPEC_H__ +#define __RTL8192D_SPEC_H__ + +#include + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + + +//============================================================ +// 8192D Regsiter offset definition +//============================================================ + + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_SYS_ISO_CTRL 0x0000 +#define REG_SYS_FUNC_EN 0x0002 +#define REG_APS_FSMCO 0x0004 +#define REG_SYS_CLKR 0x0008 +#define REG_9346CR 0x000A +#define REG_EE_VPD 0x000C +#define REG_AFE_MISC 0x0010 +#define REG_SPS0_CTRL 0x0011 +#define REG_POWER_OFF_IN_PROCESS 0x0017 +#define REG_SPS_OCP_CFG 0x0018 +#define REG_RSV_CTRL 0x001C +#define REG_RF_CTRL 0x001F +#define REG_LDOA15_CTRL 0x0020 +#define REG_LDOV12D_CTRL 0x0021 +#define REG_LDOHCI12_CTRL 0x0022 +#define REG_LPLDO_CTRL 0x0023 +#define REG_AFE_XTAL_CTRL 0x0024 +#define REG_AFE_PLL_CTRL 0x0028 +#define REG_MAC_PHY_CTRL 0x002c //for 92d, DMDP,SMSP,DMSP contrl +#define REG_EFUSE_CTRL 0x0030 +#define REG_EFUSE_TEST 0x0034 +#define REG_PWR_DATA 0x0038 +#define REG_CAL_TIMER 0x003C +#define REG_ACLK_MON 0x003E +#define REG_GPIO_MUXCFG 0x0040 +//#define REG_GPIO_MUXCFG 0x0041 +#define REG_GPIO_IO_SEL 0x0042 +#define REG_MAC_PINMUX_CFG 0x0043 +#define REG_GPIO_PIN_CTRL 0x0044 +#define REG_GPIO_INTM 0x0048 +#define REG_LEDCFG0 0x004C +#define REG_LEDCFG1 0x004D +#define REG_LEDCFG2 0x004E +#define REG_LEDCFG3 0x004F +#define REG_FSIMR 0x0050 +#define REG_FSISR 0x0054 + +#define REG_MCUFWDL 0x0080 + +#define REG_HMEBOX_EXT_0 0x0088 +#define REG_HMEBOX_EXT_1 0x008A +#define REG_HMEBOX_EXT_2 0x008C +#define REG_HMEBOX_EXT_3 0x008E + +#define REG_BIST_SCAN 0x00D0 +#define REG_BIST_RPT 0x00D4 +#define REG_BIST_ROM_RPT 0x00D8 +#define REG_USB_SIE_INTF 0x00E0 +#define REG_PCIE_MIO_INTF 0x00E4 +#define REG_PCIE_MIO_INTD 0x00E8 +#define REG_HPON_FSM 0x00EC +#define REG_SYS_CFG 0x00F0 +#define REG_MAC_PHY_CTRL_NORMAL 0x00f8 + +#define REG_MAC0 0x0081 +#define REG_MAC1 0x0053 +#define FW_MAC0_ready 0x18 +#define FW_MAC1_ready 0x1A +#define MAC0_ON BIT7 +#define MAC1_ON BIT0 +#define mac0_ready BIT0 +#define mac1_ready BIT0 + + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_CR 0x0100 +#define REG_PBP 0x0104 +#define REG_TRXDMA_CTRL 0x010C +#define REG_TRXFF_BNDY 0x0114 +#define REG_TRXFF_STATUS 0x0118 +#define REG_RXFF_PTR 0x011C +#define REG_HIMR 0x0120 +#define REG_HISR 0x0124 +#define REG_HIMRE 0x0128 +#define REG_HISRE 0x012C +#define REG_CPWM 0x012F +#define REG_FWIMR 0x0130 +#define REG_FWISR 0x0134 +#define REG_FTIMR 0x0138 +#define REG_PKTBUF_DBG_CTRL 0x0140 +#define REG_PKTBUF_DBG_DATA_L 0x0144 +#define REG_PKTBUF_DBG_DATA_H 0x0148 + +#define REG_TC0_CTRL 0x0150 +#define REG_TC1_CTRL 0x0154 +#define REG_TC2_CTRL 0x0158 +#define REG_TC3_CTRL 0x015C +#define REG_TC4_CTRL 0x0160 +#define REG_TCUNIT_BASE 0x0164 +#define REG_MBIST_START 0x0174 +#define REG_MBIST_DONE 0x0178 +#define REG_MBIST_FAIL 0x017C +#define REG_C2HEVT_MSG_NORMAL 0x01A0 +#define REG_C2HEVT_CLEAR 0x01AF +#define REG_C2HEVT_MSG_TEST 0x01B8 +#define REG_MCUTST_1 0x01c0 +#define REG_FMETHR 0x01C8 +#define REG_HMETFR 0x01CC +#define REG_HMEBOX_0 0x01D0 +#define REG_HMEBOX_1 0x01D4 +#define REG_HMEBOX_2 0x01D8 +#define REG_HMEBOX_3 0x01DC + +#define REG_LLT_INIT 0x01E0 +#define REG_BB_ACCEESS_CTRL 0x01E8 +#define REG_BB_ACCESS_DATA 0x01EC + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_RQPN 0x0200 +#define REG_FIFOPAGE 0x0204 +#define REG_TDECTRL 0x0208 +#define REG_TXDMA_OFFSET_CHK 0x020C +#define REG_TXDMA_STATUS 0x0210 +#define REG_RQPN_NPQ 0x0214 + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_AGG_PG_TH 0x0280 +#define REG_RXPKT_NUM 0x0284 +#define REG_RXDMA_STATUS 0x0288 + + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_CTRL_REG 0x0300 +#define REG_INT_MIG 0x0304 // Interrupt Migration +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address +#define REG_DBI 0x0348 // Backdoor REG for Access Configuration +//sherry added for DBI Read/Write 20091126 +#define REG_DBI_WDATA 0x0348 // Backdoor REG for Access Configuration +#define REG_DBI_RDATA 0x034C //Backdoor REG for Access Configuration +#define REG_DBI_CTRL 0x0350 //Backdoor REG for Access Configuration +#define REG_DBI_FLAG 0x0352 //Backdoor REG for Access Configuration#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_DBG_SEL 0x0360 // Debug Selection Register +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM +#define REG_UART_CTRL 0x0364 // UART Control +#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address +#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address + + +// spec version 11 +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_VOQ_INFORMATION 0x0400 +#define REG_VIQ_INFORMATION 0x0404 +#define REG_BEQ_INFORMATION 0x0408 +#define REG_BKQ_INFORMATION 0x040C +#define REG_MGQ_INFORMATION 0x0410 +#define REG_HGQ_INFORMATION 0x0414 +#define REG_BCNQ_INFORMATION 0x0418 + + +#define REG_CPU_MGQ_INFORMATION 0x041C +#define REG_FWHW_TXQ_CTRL 0x0420 +#define REG_HWSEQ_CTRL 0x0423 +#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY 0x0425 +#define REG_MULTI_BCNQ_EN 0x0426 +#define REG_MULTI_BCNQ_OFFSET 0x0427 +#define REG_SPEC_SIFS 0x0428 +#define REG_RL 0x042A +#define REG_DARFRC 0x0430 +#define REG_RARFRC 0x0438 +#define REG_RRSR 0x0440 +#define REG_ARFR0 0x0444 +#define REG_ARFR1 0x0448 +#define REG_ARFR2 0x044C +#define REG_ARFR3 0x0450 +#define REG_AGGLEN_LMT 0x0458 +#define REG_AMPDU_MIN_SPACE 0x045C +#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D +#define REG_FAST_EDCA_CTRL 0x0460 +#define REG_RD_RESP_PKT_TH 0x0463 +#define REG_INIRTS_RATE_SEL 0x0480 +#define REG_INIDATA_RATE_SEL 0x0484 +#define REG_POWER_STATUS 0x04A4 +#define REG_POWER_STAGE1 0x04B4 +#define REG_POWER_STAGE2 0x04B8 +#define REG_PKT_LIFE_TIME 0x04C0 +#define REG_STBC_SETTING 0x04C4 +#define REG_PROT_MODE_CTRL 0x04C8 +#define REG_MAX_AGGR_NUM 0x04CA +#define REG_RTS_MAX_AGGR_NUM 0x04CB +#define REG_BAR_MODE_CTRL 0x04CC +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF +#define REG_EARLY_MODE_CONTROL 0x04D0 +#define REG_NQOS_SEQ 0x04DC +#define REG_QOS_SEQ 0x04DE +#define REG_NEED_CPU_HANDLE 0x04E0 +#define REG_PKT_LOSE_RPT 0x04E1 +#define REG_PTCL_ERR_STATUS 0x04E2 +#define REG_DUMMY 0x04FC + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_EDCA_VO_PARAM 0x0500 +#define REG_EDCA_VI_PARAM 0x0504 +#define REG_EDCA_BE_PARAM 0x0508 +#define REG_EDCA_BK_PARAM 0x050C +#define REG_BCNTCFG 0x0510 +#define REG_PIFS 0x0512 +#define REG_RDG_PIFS 0x0513 +#define REG_SIFS_CTX 0x0514 +#define REG_SIFS_TRX 0x0516 +#define REG_AGGR_BREAK_TIME 0x051A +#define REG_SLOT 0x051B +#define REG_TX_PTCL_CTRL 0x0520 +#define REG_TXPAUSE 0x0522 +#define REG_DIS_TXREQ_CLR 0x0523 +#define REG_RD_CTRL 0x0524 +#define REG_TBTT_PROHIBIT 0x0540 +#define REG_RD_NAV_NXT 0x0544 +#define REG_NAV_PROT_LEN 0x0546 +#define REG_BCN_CTRL 0x0550 +#define REG_USTIME_TSF 0x0551 +#define REG_MBID_NUM 0x0552 +#define REG_DUAL_TSF_RST 0x0553 +#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE +#define REG_MBSSID_BCN_SPACE 0x0554 +#define REG_DRVERLYINT 0x0558 +#define REG_BCNDMATIM 0x0559 +#define REG_ATIMWND 0x055A +#define REG_BCN_MAX_ERR 0x055D +#define REG_RXTSF_OFFSET_CCK 0x055E +#define REG_RXTSF_OFFSET_OFDM 0x055F +#define REG_TSFTR 0x0560 +#define REG_INIT_TSFTR 0x0564 +#define REG_PSTIMER 0x0580 +#define REG_TIMER0 0x0584 +#define REG_TIMER1 0x0588 +#define REG_ACMHWCTRL 0x05C0 +#define REG_ACMRSTCTRL 0x05C1 +#define REG_ACMAVG 0x05C2 +#define REG_VO_ADMTIME 0x05C4 +#define REG_VI_ADMTIME 0x05C6 +#define REG_BE_ADMTIME 0x05C8 +#define REG_EDCA_RANDOM_GEN 0x05CC +#define REG_SCH_TXCMD 0x05D0 + +#define REG_DMC 0x05F0 //Dual MAC Co-Existence Register + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_APSD_CTRL 0x0600 +#define REG_BWOPMODE 0x0603 +#define REG_TCR 0x0604 +#define REG_RCR 0x0608 +#define REG_RX_PKT_LIMIT 0x060C +#define REG_RX_DLK_TIME 0x060D +#define REG_RX_DRVINFO_SZ 0x060F + +#define REG_MACID 0x0610 +#define REG_BSSID 0x0618 +#define REG_MAR 0x0620 +#define REG_MBIDCAMCFG 0x0628 + +#define REG_USTIME_EDCA 0x0638 +#define REG_MAC_SPEC_SIFS 0x063A +#define REG_RESP_SIFS_CCK 0x063C +#define REG_RESP_SIFS_OFDM 0x063E +#define REG_ACKTO 0x0640 +#define REG_CTS2TO 0x0641 +#define REG_EIFS 0x0642 + + +//WMA, BA, CCX +#define REG_NAV_CTRL 0x0650 +#define REG_BACAMCMD 0x0654 +#define REG_BACAMCONTENT 0x0658 +#define REG_LBDLY 0x0660 +#define REG_FWDLY 0x0661 +#define REG_RXERR_RPT 0x0664 +#define REG_WMAC_TRXPTCL_CTL 0x0668 + + +// Security +#define REG_CAMCMD 0x0670 +#define REG_CAMWRITE 0x0674 +#define REG_CAMREAD 0x0678 +#define REG_CAMDBG 0x067C +#define REG_SECCFG 0x0680 + +// Power +#define REG_WOW_CTRL 0x0690 +#define REG_PSSTATUS 0x0691 +#define REG_PS_RX_INFO 0x0692 +#define REG_LPNAV_CTRL 0x0694 +#define REG_WKFMCAM_CMD 0x0698 +#define REG_WKFMCAM_RWD 0x069C +#define REG_RXFLTMAP0 0x06A0 +#define REG_RXFLTMAP1 0x06A2 +#define REG_RXFLTMAP2 0x06A4 +#define REG_BCN_PSR_RPT 0x06A8 +#define REG_CALB32K_CTRL 0x06AC +#define REG_PKT_MON_CTRL 0x06B4 +#define REG_BT_COEX_TABLE 0x06C0 +#define REG_WMAC_RESP_TXINFO 0x06D8 + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +// for 92DU high_Queue low_Queue Normal_Queue select +#define REG_USB_High_NORMAL_Queue_Select_MAC0 0xFE44 +//#define REG_USB_LOW_Queue_Select_MAC0 0xFE45 +#define REG_USB_High_NORMAL_Queue_Select_MAC1 0xFE47 +//#define REG_USB_LOW_Queue_Select_MAC1 0xFE48 + +// For test chip +#define REG_TEST_USB_TXQS 0xFE48 +#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_TEST_SIE_OPTIONAL 0xFE64 +#define REG_TEST_SIE_CHIRP_K 0xFE65 +#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B +#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 + + +// For normal chip +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_NORMAL_SIE_OPTIONAL 0xFE64 +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF + + +//----------------------------------------------------- +// +// Redifine 8192C register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. + +#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control. +#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable. +#define SYS_CLK REG_SYS_CLKR +#define CR9346 REG_9346CR // 93C46/93C56 Command Register. +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. +#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. +#define MSR (REG_CR + 2) // Media Status register +#define ISR REG_HISR +#define TSFR REG_TSFTR // Timing Sync Function Timer Register. + +#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 +#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 + +#define PBP REG_PBP + +// Redifine MACID register, to compatible prior ICs. +#define IDR0 MACIDR0 +#define IDR4 MACIDR4 + + +// +// 9. Security Control Registers (Offset: ) +// +#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd +#define WCAMI REG_CAMWRITE // Software write CAM input content +#define RCAMO REG_CAMREAD // Software read/write CAM config +#define CAMDBG REG_CAMDBG +#define SECR REG_SECCFG //Security Configuration Register + +// Unused register +#define UnusedRegister 0x1BF +#define DCAM UnusedRegister +#define PSR UnusedRegister +#define BBAddr UnusedRegister +#define PhyDataR UnusedRegister + +#define InvalidBBRFValue 0x12345678 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A + +//---------------------------------------------------------------------------- +// 8192C Cmd9346CR bits (Offset 0xA, 16bit) +//---------------------------------------------------------------------------- +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 +#define Cmd9346CR_9356SEL BIT4 +#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL) +#define AutoLoadEFUSE CmdEEPROM_En + +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO 0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) + + +//---------------------------------------------------------------------------- +// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +/* +Network Type +00: No link +01: Link in ad hoc network +10: Link in infrastructure network +11: AP mode +Default: 00b. +*/ +#define MSR_NOLINK 0x00 +#define MSR_ADHOC 0x01 +#define MSR_INFRA 0x02 +#define MSR_AP 0x03 + +// +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) +// +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x181, 24bits) +//---------------------------------------------------------------------------- +#define RRSR_RSC_OFFSET 21 +#define RRSR_SHORT_OFFSET 23 +#define RRSR_RSC_BW_40M 0x600000 +#define RRSR_RSC_UPSUBCHNL 0x400000 +#define RRSR_RSC_LOWSUBCHNL 0x200000 +#define RRSR_SHORT 0x800000 +#define RRSR_1M BIT0 +#define RRSR_2M BIT1 +#define RRSR_5_5M BIT2 +#define RRSR_11M BIT3 +#define RRSR_6M BIT4 +#define RRSR_9M BIT5 +#define RRSR_12M BIT6 +#define RRSR_18M BIT7 +#define RRSR_24M BIT8 +#define RRSR_36M BIT9 +#define RRSR_48M BIT10 +#define RRSR_54M BIT11 +#define RRSR_MCS0 BIT12 +#define RRSR_MCS1 BIT13 +#define RRSR_MCS2 BIT14 +#define RRSR_MCS3 BIT15 +#define RRSR_MCS4 BIT16 +#define RRSR_MCS5 BIT17 +#define RRSR_MCS6 BIT18 +#define RRSR_MCS7 BIT19 +#define BRSR_AckShortPmb BIT23 +// CCK ACK: use Short Preamble or not + + +//---------------------------------------------------------------------------- +// 8192C Rate Definition +//---------------------------------------------------------------------------- +//CCK +#define RATR_1M 0x00000001 +#define RATR_2M 0x00000002 +#define RATR_55M 0x00000004 +#define RATR_11M 0x00000008 +//OFDM +#define RATR_6M 0x00000010 +#define RATR_9M 0x00000020 +#define RATR_12M 0x00000040 +#define RATR_18M 0x00000080 +#define RATR_24M 0x00000100 +#define RATR_36M 0x00000200 +#define RATR_48M 0x00000400 +#define RATR_54M 0x00000800 +//MCS 1 Spatial Stream +#define RATR_MCS0 0x00001000 +#define RATR_MCS1 0x00002000 +#define RATR_MCS2 0x00004000 +#define RATR_MCS3 0x00008000 +#define RATR_MCS4 0x00010000 +#define RATR_MCS5 0x00020000 +#define RATR_MCS6 0x00040000 +#define RATR_MCS7 0x00080000 +//MCS 2 Spatial Stream +#define RATR_MCS8 0x00100000 +#define RATR_MCS9 0x00200000 +#define RATR_MCS10 0x00400000 +#define RATR_MCS11 0x00800000 +#define RATR_MCS12 0x01000000 +#define RATR_MCS13 0x02000000 +#define RATR_MCS14 0x04000000 +#define RATR_MCS15 0x08000000 + + +// NOTE: For 92CU - Ziv +//CCK +#define RATE_1M BIT(0) +#define RATE_2M BIT(1) +#define RATE_5_5M BIT(2) +#define RATE_11M BIT(3) +//OFDM +#define RATE_6M BIT(4) +#define RATE_9M BIT(5) +#define RATE_12M BIT(6) +#define RATE_18M BIT(7) +#define RATE_24M BIT(8) +#define RATE_36M BIT(9) +#define RATE_48M BIT(10) +#define RATE_54M BIT(11) +//MCS 1 Spatial Stream +#define RATE_MCS0 BIT(12) +#define RATE_MCS1 BIT(13) +#define RATE_MCS2 BIT(14) +#define RATE_MCS3 BIT(15) +#define RATE_MCS4 BIT(16) +#define RATE_MCS5 BIT(17) +#define RATE_MCS6 BIT(18) +#define RATE_MCS7 BIT(19) +//MCS 2 Spatial Stream +#define RATE_MCS8 BIT(20) +#define RATE_MCS9 BIT(21) +#define RATE_MCS10 BIT(22) +#define RATE_MCS11 BIT(23) +#define RATE_MCS12 BIT(24) +#define RATE_MCS13 BIT(25) +#define RATE_MCS14 BIT(26) +#define RATE_MCS15 BIT(27) + + + + +// ALL CCK Rate +#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M +#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ + RATR_36M|RATR_48M|RATR_54M +#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ + RATR_MCS4|RATR_MCS5|RATR_MCS6|RATR_MCS7 +#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9|RATR_MCS10|RATR_MCS11|\ + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 + +//---------------------------------------------------------------------------- +// 8192C BW_OPMODE bits (Offset 0x203, 8bit) +//---------------------------------------------------------------------------- +#define BW_OPMODE_20MHZ BIT2 +#define BW_OPMODE_5G BIT1 +#define BW_OPMODE_11J BIT0 + + +//---------------------------------------------------------------------------- +// 8192C CAM Config Setting (offset 0x250, 1 byte) +//---------------------------------------------------------------------------- +#define CAM_VALID BIT15 +#define CAM_NOTVALID 0x0000 +#define CAM_USEDK BIT5 + +#define CAM_CONTENT_COUNT 8 + +#define CAM_NONE 0x0 +#define CAM_WEP40 0x01 +#define CAM_TKIP 0x02 +#define CAM_AES 0x04 +#define CAM_WEP104 0x05 +#define CAM_SMS4 0x6 + + +#define TOTAL_CAM_ENTRY 32 +#define HALF_CAM_ENTRY 16 + +#define CAM_CONFIG_USEDK _TRUE +#define CAM_CONFIG_NO_USEDK _FALSE + +#define CAM_WRITE BIT16 +#define CAM_READ 0x00000000 +#define CAM_POLLINIG BIT31 + +#define SCR_UseDK 0x01 +#define SCR_TxSecEnable 0x02 +#define SCR_RxSecEnable 0x04 + + +// +// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) +// +//---------------------------------------------------------------------------- +// 8190 IMR/ISR bits (offset 0xfd, 8bits) +//---------------------------------------------------------------------------- +#define IMR8190_DISABLED 0x0 +// IMR DW0 Bit 0-31 +#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8 +#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1 +#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2 +#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1 +#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow +#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt +#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0 +#define IMR_RXFOVW BIT12 // Receive FIFO Overflow +#define IMR_RDU BIT11 // Receive Descriptor Unavailable +#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt +#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup +#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt +#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup +#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt +#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt +#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt +#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt +#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt +#define IMR_VODOK BIT1 // AC_VO DMA Interrupt +#define IMR_ROK BIT0 // Receive DMA OK Interrupt + +// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh) +#define IMR_TXERR BIT11 +#define IMR_RXERR BIT10 +#define IMR_C2HCMD BIT9 +#define IMR_CPWM BIT8 +//RSVD [2-7] +#define IMR_OCPINT BIT1 +#define IMR_WLANOFF BIT0 + + + +//---------------------------------------------------------------------------- +// 8192D EFUSE +//---------------------------------------------------------------------------- +#define HWSET_MAX_SIZE 256 + +//---------------------------------------------------------------------------- +// 8192C EEPROM/EFUSE share register definition. +//---------------------------------------------------------------------------- + +// +// Default Value for EEPROM or EFUSE!!! +// +#define EEPROM_Default_TSSI 0x0 +#define EEPROM_Default_TxPowerDiff 0x0 +#define EEPROM_Default_CrystalCap 0x0 //92D default 0x0 +#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) +#define EEPROM_Default_TxPower 0x1010 +#define EEPROM_Default_HT2T_TxPwr 0x10 + +#define EEPROM_Default_LegacyHTTxPowerDiff 0x4 +#define EEPROM_Default_ThermalMeter 0x12 + +#define EEPROM_Default_AntTxPowerDiff 0x0 +//#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 +#define EEPROM_Default_TxPowerLevel_2G 0x2C +#define EEPROM_Default_TxPowerLevel_5G 0x22 + +#define EEPROM_Default_HT40_2SDiff 0x0 +#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference +#define EEPROM_Default_LegacyHTTxPowerDiff 0x4 //OFDM Tx Power index diff +#define EEPROM_Default_HT40_PwrMaxOffset 0 +#define EEPROM_Default_HT20_PwrMaxOffset 0 + +// For debug +#define EEPROM_Default_PID 0x1234 +#define EEPROM_Default_VID 0x5678 +#define EEPROM_Default_CustomerID 0xAB +#define EEPROM_Default_SubCustomerID 0xCD +#define EEPROM_Default_Version 0 + +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_NCC 0xB +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_TOSHIBA 0x4 +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. +#define EEPROM_CID_QMI 0x0D +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define RTL8192_EEPROM_ID 0x8129 +#define EEPROM_WAPI_SUPPORT 0x78 + + +#ifdef CONFIG_PCI_HCI +#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER) +#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) + +#define RTL8190_EEPROM_ID 0x8129 // 0-1 +#define EEPROM_HPON 0x02 // LDO settings.2-5 +#define EEPROM_CLK 0x06 // Clock settings.6-7 +#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 + +#define EEPROM_VID 0x28 // SE Vendor ID.A-B +#define EEPROM_DID 0x2A // SE Device ID. C-D +#define EEPROM_SVID 0x2C // SE Vendor ID.E-F +#define EEPROM_SMID 0x2E // SE PCI Subsystem ID. 10-11 + +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 +#define EEPROM_MAC_ADDR_MAC0_92D 0x55 +#define EEPROM_MAC_ADDR_MAC1_92D 0x5B +//---------------------------------------------------------------- +// 2.4G band Tx power index setting +#define EEPROM_CCK_TX_PWR_INX_2G 0x61 +#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D +#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73 +#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76 +#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79 + +//5GL channel 32-64 +#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B +#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E + +//5GM channel 100-140 +#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D +#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3 + +//5GH channel 149-165 +#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8 + +#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels. +#define EEPROM_IQK_DELTA 0xBC +#define EEPROM_LCK_DELTA 0xBC +#define EEPROM_XTAL_K 0xBD //[7:5] +#define EEPROM_TSSI_A_5G 0xBE +#define EEPROM_TSSI_B_5G 0xBF +#define EEPROM_TSSI_AB_5G 0xC0 +#define EEPROM_THERMAL_METER 0xC3 //[4:0] +#define EEPROM_RF_OPT1 0xC4 +#define EEPROM_RF_OPT2 0xC5 +#define EEPROM_RF_OPT3 0xC6 +#define EEPROM_RF_OPT4 0xC7 +#define EEPROM_RF_OPT5 0xC8 +#define EEPROM_RF_OPT6 0xC9 +#define EEPROM_VERSION 0xCA +#define EEPROM_CUSTOMER_ID 0xCB +#define EEPROM_RF_OPT7 0xCC + +#define EEPROM_WIDIPAIRING_ADDR 0xF0 +#define EEPROM_WIDIPAIRING_KEY 0xF6 + +#define EEPROM_DEF_PART_NO 0x3FD //Byte +#define EEPROME_CHIP_VERSION_L 0x3FF +#define EEPROME_CHIP_VERSION_H 0x3FE +#endif + +#ifdef CONFIG_USB_HCI +#define RTL8190_EEPROM_ID 0x8129 // 0-1 +#define EEPROM_HPON 0x02 // LDO settings.2-5 +#define EEPROM_CLK 0x06 // Clock settings.6-7 +#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 + +#define EEPROM_VID 0xC // SE Vendor ID.A-B +#define EEPROM_PID 0xE // SE Device ID. C-D +#define EEPROM_ENDPOINT_SETTING 0x10 +#define EEPROM_CHIRP_K 0x12 // Changed +#define EEPROM_USB_PHY 0x13 // Changed +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 +#define EEPROM_STRING 0x1F +#define EEPROM_SUBCUSTOMER_ID 0x59 + +#define EEPROM_MAC_ADDR_MAC0_92D 0x19 +#define EEPROM_MAC_ADDR_MAC1_92D 0x5B +//---------------------------------------------------------------- +// 2.4G band Tx power index setting +#define EEPROM_CCK_TX_PWR_INX_2G 0x61 +#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D +#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73 +#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76 +#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79 + +//5GL channel 32-64 +#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B +#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E + +//5GM channel 100-140 +#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D +#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3 + +//5GH channel 149-165 +#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8 + +#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels. +#define EEPROM_TEST_CHANNEL_PLAN 0xBB +#define EEPROM_IQK_DELTA 0xBC +#define EEPROM_LCK_DELTA 0xBC +#define EEPROM_XTAL_K 0xBD //[7:5] +#define EEPROM_TSSI_A_5G 0xBE +#define EEPROM_TSSI_B_5G 0xBF +#define EEPROM_TSSI_AB_5G 0xC0 +#define EEPROM_THERMAL_METER 0xC3 //[4:0] +#define EEPROM_RF_OPT1 0xC4 +#define EEPROM_RF_OPT2 0xC5 +#define EEPROM_RF_OPT3 0xC6 +#define EEPROM_RF_OPT4 0xC7 +#define EEPROM_RF_OPT5 0xC8 +#define EEPROM_RF_OPT6 0xC9 +#define EEPROM_VERSION 0xCA +#define EEPROM_CUSTOMER_ID 0xCB +#define EEPROM_RF_OPT7 0xCC + +#define EEPROM_DEF_PART_NO 0x3FD //Byte +#define EEPROME_CHIP_VERSION_L 0x3FF +#define EEPROME_CHIP_VERSION_H 0x3FE + +//------------------------------------------------------------- +// EEPROM content definitions +//------------------------------------------------------------- +#define OS_LINK_SPEED_NORMAL_MASK BIT3 | BIT2 +#define OS_LINK_SPEED_TEST_MASK BIT3 | BIT4 + +#define BOARD_TYPE_NORMAL_MASK 0xE0 +#define BOARD_TYPE_TEST_MASK 0xF + +#define BT_COEXISTENCE_TEST BIT4 +#define BT_COEXISTENCE_NORMAL BIT5 + +#define BT_CO_SHIFT_TEST 4 +#define BT_CO_SHIFT_NORMAL 5 + +#define EP_NUMBER_MASK_TEST 0x30 //bit 4:5 0Eh +#define EP_NUMBER_SHIFT_TEST 4 + +#define USB_PHY_PARA_SIZE_TEST 6 +#define USB_PHY_PARA_SIZE_NORMAL 4 + +//------------------------------------------------------------- +// EEPROM default value definitions +//------------------------------------------------------------- +// Use 0xABCD instead of 0x8192 for debug +#define EEPROM_DEF_ID_0 0xCD // Byte 0x00 +#define EEPROM_DEF_ID_1 0xAB // Byte 0x01 + +#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03 +#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04 +#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08 + +#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A +#define EEPROM_DEF_VID_1 0x0B + +#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C +#define EEPROM_DEF_PID_1 0x81 + + +#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E +#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E + +#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F + +#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10 +#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11 +#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12 +#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13 + +#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78 +#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79 + + +#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A + + +#define EEPROM_USB_SN BIT(0) +#define EEPROM_USB_REMOTE_WAKEUP BIT(1) +#define EEPROM_USB_DEVICE_PWR BIT(2) +#define EEPROM_EP_NUMBER (BIT(3)|BIT(4)) + +#if 0 +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + +#define EEPROM_CID_DEFAULT 0x0 + +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. + +#endif +#endif + + +/*=================================================================== +===================================================================== +Here the register defines are for 92C. When the define is as same with 92C, +we will use the 92C's define for the consistency +So the following defines for 92C is not entire!!!!!! +===================================================================== +=====================================================================*/ +/* +Based on Datasheet V33---090401 +Register Summary +Current IOREG MAP +0x0000h ~ 0x00FFh System Configuration (256 Bytes) +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) +*/ + +//---------------------------------------------------------------------------- +// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) +//---------------------------------------------------------------------------- +#define RCR_APPFCS BIT31 //WMAC append FCS after pauload +#define RCR_APP_MIC BIT30 // +#define RCR_APP_ICV BIT29 // +#define RCR_APP_PHYST_RXFF BIT28 // +#define RCR_APP_BA_SSN BIT27 //Accept BA SSN +#define RCR_ENMBID BIT24 //Enable Multiple BssId. +#define RCR_LSIGEN BIT23 +#define RCR_MFBEN BIT22 +#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 +#define RCR_AMF BIT13 //Accept management type frame +#define RCR_ACF BIT12 //Accept control type frame +#define RCR_ADF BIT11 //Accept data type frame +#define RCR_AICV BIT9 //Accept ICV error packet +#define RCR_ACRC32 BIT8 //Accept CRC32 error packet +#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) +#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) +#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet +#define RCR_APWRMGT BIT5 //Accept power management packet +#define RCR_ADD3 BIT4 //Accept address 3 match packet +#define RCR_AB BIT3 //Accept broadcast packet +#define RCR_AM BIT2 //Accept multicast packet +#define RCR_APM BIT1 //Accept physical match packet +#define RCR_AAP BIT0 //Accept all unicast packet +#define RCR_MXDMA_OFFSET 8 +#define RCR_FIFO_OFFSET 13 + + + +//============================================================================ +// 8192c USB specific Regsiter Offset and Content definition, +// 2009.08.18, added by vivi. for merge 92c and 92C into one driver +//============================================================================ +//#define APS_FSMCO 0x0004 same with 92Ce +#define RSV_CTRL 0x001C +#define RD_CTRL 0x0524 + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +#define REG_USB_VID 0xFE60 +#define REG_USB_PID 0xFE62 +#define REG_USB_OPTIONAL 0xFE64 +#define REG_USB_CHIRP_K 0xFE65 +#define REG_USB_PHY 0xFE66 +#define REG_USB_MAC_ADDR 0xFE70 + +#define REG_USB_HRPWM 0xFE58 +#define REG_USB_HCPWM 0xFE57 + +#define InvalidBBRFValue 0x12345678 + +//============================================================================ +// 8192C Regsiter Bit and Content definition +//============================================================================ +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +//2 SPS0_CTRL +#define SW18_FPWM BIT(3) + + +//2 SYS_ISO_CTRL +#define ISO_MD2PP BIT(0) +#define ISO_UA2USB BIT(1) +#define ISO_UD2CORE BIT(2) +#define ISO_PA2PCIE BIT(3) +#define ISO_PD2CORE BIT(4) +#define ISO_IP2MAC BIT(5) +#define ISO_DIOP BIT(6) +#define ISO_DIOE BIT(7) +#define ISO_EB2CORE BIT(8) +#define ISO_DIOR BIT(9) + +#define PWC_EV25V BIT(14) +#define PWC_EV12V BIT(15) + + +//2 SYS_FUNC_EN +#define FEN_BBRSTB BIT(0) +#define FEN_BB_GLB_RSTn BIT(1) +#define FEN_USBA BIT(2) +#define FEN_UPLL BIT(3) +#define FEN_USBD BIT(4) +#define FEN_DIO_PCIE BIT(5) +#define FEN_PCIEA BIT(6) +#define FEN_PPLL BIT(7) +#define FEN_PCIED BIT(8) +#define FEN_DIOE BIT(9) +#define FEN_CPUEN BIT(10) +#define FEN_DCORE BIT(11) +#define FEN_ELDR BIT(12) +#define FEN_DIO_RF BIT(13) +#define FEN_HWPDN BIT(14) +#define FEN_MREGEN BIT(15) + +//2 APS_FSMCO +#define PFM_LDALL BIT(0) +#define PFM_ALDN BIT(1) +#define PFM_LDKP BIT(2) +#define PFM_WOWL BIT(3) +#define EnPDN BIT(4) +#define PDN_PL BIT(5) +#define APFM_ONMAC BIT(8) +#define APFM_OFF BIT(9) +#define APFM_RSM BIT(10) +#define AFSM_HSUS BIT(11) +#define AFSM_PCIE BIT(12) +#define APDM_MAC BIT(13) +#define APDM_HOST BIT(14) +#define APDM_HPDN BIT(15) +#define RDY_MACON BIT(16) +#define SUS_HOST BIT(17) +#define ROP_ALD BIT(20) +#define ROP_PWR BIT(21) +#define ROP_SPS BIT(22) +#define SOP_MRST BIT(25) +#define SOP_FUSE BIT(26) +#define SOP_ABG BIT(27) +#define SOP_AMB BIT(28) +#define SOP_RCK BIT(29) +#define SOP_A8M BIT(30) +#define XOP_BTCK BIT(31) + +//2 SYS_CLKR +#define ANAD16V_EN BIT(0) +#define ANA8M BIT(1) +#define MACSLP BIT(4) +#define LOADER_CLK_EN BIT(5) +#define _80M_SSC_DIS BIT(7) +#define _80M_SSC_EN_HO BIT(8) +#define PHY_SSC_RSTB BIT(9) +#define SEC_CLK_EN BIT(10) +#define MAC_CLK_EN BIT(11) +#define SYS_CLK_EN BIT(12) +#define RING_CLK_EN BIT(13) + + +//2 9346CR + +#define BOOT_FROM_EEPROM BIT(4) +#define EEPROM_EN BIT(5) + + +//2 AFE_MISC +#define AFE_BGEN BIT(0) +#define AFE_MBEN BIT(1) +#define MAC_ID_EN BIT(7) + + +//2 SPS0_CTRL + + +//2 SPS_OCP_CFG + + +//2 RSV_CTRL +#define WLOCK_ALL BIT(0) +#define WLOCK_00 BIT(1) +#define WLOCK_04 BIT(2) +#define WLOCK_08 BIT(3) +#define WLOCK_40 BIT(4) +#define R_DIS_PRST_0 BIT(5) +#define R_DIS_PRST_1 BIT(6) +#define LOCK_ALL_EN BIT(7) + +//2 RF_CTRL +#define RF_EN BIT(0) +#define RF_RSTB BIT(1) +#define RF_SDMRSTB BIT(2) + + + +//2 LDOA15_CTRL +#define LDA15_EN BIT(0) +#define LDA15_STBY BIT(1) +#define LDA15_OBUF BIT(2) +#define LDA15_REG_VOS BIT(3) +#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) + + + +//2 LDOV12D_CTRL +#define LDV12_EN BIT(0) +#define LDV12_SDBY BIT(1) +#define LPLDO_HSM BIT(2) +#define LPLDO_LSM_DIS BIT(3) +#define _LDV12_VADJ(x) (((x) & 0xF) << 4) + + +//2 AFE_XTAL_CTRL +#define XTAL_EN BIT(0) +#define XTAL_BSEL BIT(1) +#define _XTAL_BOSC(x) (((x) & 0x3) << 2) +#define _XTAL_CADJ(x) (((x) & 0xF) << 4) +#define XTAL_GATE_USB BIT(8) +#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9) +#define XTAL_GATE_AFE BIT(11) +#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12) +#define XTAL_RF_GATE BIT(14) +#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15) +#define XTAL_GATE_DIG BIT(17) +#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18) +#define XTAL_BT_GATE BIT(20) +#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) +#define _XTAL_GPIO(x) (((x) & 0x7) << 23) + + +#define CKDLY_AFE BIT(26) +#define CKDLY_USB BIT(27) +#define CKDLY_DIG BIT(28) +#define CKDLY_BT BIT(29) + + +//2 AFE_PLL_CTRL +#define APLL_EN BIT(0) +#define APLL_320_EN BIT(1) +#define APLL_FREF_SEL BIT(2) +#define APLL_EDGE_SEL BIT(3) +#define APLL_WDOGB BIT(4) +#define APLL_LPFEN BIT(5) + +#define APLL_REF_CLK_13MHZ 0x1 +#define APLL_REF_CLK_19_2MHZ 0x2 +#define APLL_REF_CLK_20MHZ 0x3 +#define APLL_REF_CLK_25MHZ 0x4 +#define APLL_REF_CLK_26MHZ 0x5 +#define APLL_REF_CLK_38_4MHZ 0x6 +#define APLL_REF_CLK_40MHZ 0x7 + +#define APLL_320EN BIT(14) +#define APLL_80EN BIT(15) +#define APLL_1MEN BIT(24) + + +//2 EFUSE_CTRL +#define ALD_EN BIT(18) +#define EF_PD BIT(19) +#define EF_FLAG BIT(31) + +//2 EFUSE_TEST +#define EF_TRPT BIT(7) +#define LDOE25_EN BIT(31) + +//2 PWR_DATA + +//2 CAL_TIMER + +//2 ACLK_MON +#define RSM_EN BIT(0) +#define Timer_EN BIT(4) + + +//2 GPIO_MUXCFG +#define TRSW0EN BIT(2) +#define TRSW1EN BIT(3) +#define EROM_EN BIT(4) +#define EnBT BIT(5) +#define EnUart BIT(8) +#define Uart_910 BIT(9) +#define EnPMAC BIT(10) +#define SIC_SWRST BIT(11) +#define EnSIC BIT(12) +#define SIC_23 BIT(13) +#define EnHDP BIT(14) +#define SIC_LBK BIT(15) + +//2 GPIO_PIN_CTRL + + + +//2 GPIO_INTM + +//2 LEDCFG +#define LED0PL BIT(4) +#define LED1PL BIT(12) +#define LED0DIS BIT(7) + +#define SECCAM_CLR BIT(30) + +//2 FSIMR + +//2 FSISR + + +//2 8051FWDL +//2 MCUFWDL +#define MCUFWDL_EN BIT(0) +#define MCUFWDL_RDY BIT(1) +#define FWDL_ChkSum_rpt BIT(2) +#define MACINI_RDY BIT(3) +#define BBINI_RDY BIT(4) +#define RFINI_RDY BIT(5) +#define WINTINI_RDY BIT(6) +#define MAC1_WINTINI_RDY BIT(11)// 0X81 BIT3 +#define CPRST BIT(23) + + + + +//2 REG_SYS_CFG +#define XCLK_VLD BIT(0) +#define ACLK_VLD BIT(1) +#define UCLK_VLD BIT(2) +#define PCLK_VLD BIT(3) +#define PCIRSTB BIT(4) +#define V15_VLD BIT(5) +#define TRP_B15V_EN BIT(7) +#define SIC_IDLE BIT(8) +#define BD_MAC2 BIT(9) +#define BD_MAC1 BIT(10) +#define IC_MACPHY_MODE BIT(11) +#define PAD_HWPD_IDN BIT(22) +#define TRP_VAUX_EN BIT(23) +#define TRP_BT_EN BIT(24) +#define BD_PKG_SEL BIT(25) +#define BD_HCI_SEL BIT(26) +#define TYPE_ID BIT(27) + +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 +#define CHIP_VER_RTL_SHIFT 12 + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + + +//2 Function Enable Registers +//2 CR + +#define REG_LBMODE (REG_CR + 3) + + +#define HCI_TXDMA_EN BIT(0) +#define HCI_RXDMA_EN BIT(1) +#define TXDMA_EN BIT(2) +#define RXDMA_EN BIT(3) +#define PROTOCOL_EN BIT(4) +#define SCHEDULE_EN BIT(5) +#define MACTXEN BIT(6) +#define MACRXEN BIT(7) +#define ENSWBCN BIT(8) +#define ENSEC BIT(9) + +// Network type +#define _NETTYPE(x) (((x) & 0x3) << 16) +#define MASK_NETTYPE 0x30000 +#define NT_NO_LINK 0x0 +#define NT_LINK_AD_HOC 0x1 +#define NT_LINK_AP 0x2 +#define NT_AS_AP 0x3 + +#define _LBMODE(x) (((x) & 0xF) << 24) +#define MASK_LBMODE 0xF000000 +#define LOOPBACK_NORMAL 0x0 +#define LOOPBACK_IMMEDIATELY 0xB +#define LOOPBACK_MAC_DELAY 0x3 +#define LOOPBACK_PHY 0x1 +#define LOOPBACK_DMA 0x7 + + +//2 PBP - Page Size Register +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) +#define _PSRX_MASK 0xF +#define _PSTX_MASK 0xF0 +#define _PSRX(x) (x) +#define _PSTX(x) ((x) << 4) + +#define PBP_64 0x0 +#define PBP_128 0x1 +#define PBP_256 0x2 +#define PBP_512 0x3 +#define PBP_1024 0x4 + + +//2 TX/RXDMA +#define RXDMA_ARBBW_EN BIT(0) +#define RXSHFT_EN BIT(1) +#define RXDMA_AGG_EN BIT(2) +#define QS_VO_QUEUE BIT(8) +#define QS_VI_QUEUE BIT(9) +#define QS_BE_QUEUE BIT(10) +#define QS_BK_QUEUE BIT(11) +#define QS_MANAGER_QUEUE BIT(12) +#define QS_HIGH_QUEUE BIT(13) + +#define HQSEL_VOQ BIT(0) +#define HQSEL_VIQ BIT(1) +#define HQSEL_BEQ BIT(2) +#define HQSEL_BKQ BIT(3) +#define HQSEL_MGTQ BIT(4) +#define HQSEL_HIQ BIT(5) + +// For normal driver, 0x10C +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) + +#define QUEUE_LOW 1 +#define QUEUE_NORMAL 2 +#define QUEUE_HIGH 3 + + + +//2 TRXFF_BNDY + + +//2 LLT_INIT +#define _LLT_NO_ACTIVE 0x0 +#define _LLT_WRITE_ACCESS 0x1 +#define _LLT_READ_ACCESS 0x2 + +#define _LLT_INIT_DATA(x) ((x) & 0xFF) +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) +#define _LLT_OP(x) (((x) & 0x3) << 30) +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) + + +//2 BB_ACCESS_CTRL +#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) +#define BB_WRITE_EN BIT(30) +#define BB_READ_EN BIT(31) +//#define BB_ADDR_MASK 0xFFF +//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK) + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +//2 RQPN +#define _HPQ(x) ((x) & 0xFF) +#define _LPQ(x) (((x) & 0xFF) << 8) +#define _PUBQ(x) (((x) & 0xFF) << 16) +#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register + + +#define HPQ_PUBLIC_DIS BIT(24) +#define LPQ_PUBLIC_DIS BIT(25) +#define LD_RQPN BIT(31) + + +//2 TDECTRL +#define BCN_VALID BIT(16) +#define BCN_HEAD(x) (((x) & 0xFF) << 8) +#define BCN_HEAD_MASK 0xFF00 + +//2 TDECTL +#define BLK_DESC_NUM_SHIFT 4 +#define BLK_DESC_NUM_MASK 0xF + + +//2 TXDMA_OFFSET_CHK +#define DROP_DATA_EN BIT(9) + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +//2 FWHW_TXQ_CTRL +#define EN_AMPDU_RTY_NEW BIT(7) + +//2 INIRTSMCS_SEL +#define _INIRTSMCS_SEL(x) ((x) & 0x3F) + + +//2 SPEC SIFS +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) + + +//2 RRSR + +#define RATE_REG_BITMAP_ALL 0xFFFFF + +#define _RRSC_BITMAP(x) ((x) & 0xFFFFF) + +#define _RRSR_RSC(x) (((x) & 0x3) << 21) +#define RRSR_RSC_RESERVED 0x0 +#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 +#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 +#define RRSR_RSC_DUPLICATE_MODE 0x3 + + +//2 ARFR +#define USE_SHORT_G1 BIT(20) + +//2 AGGLEN_LMT_L +#define _AGGLMT_MCS0(x) ((x) & 0xF) +#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4) +#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8) +#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12) +#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16) +#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20) +#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) +#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) + + +//2 RL +#define RETRY_LIMIT_SHORT_SHIFT 8 +#define RETRY_LIMIT_LONG_SHIFT 0 + + +//2 DARFRC +#define _DARF_RC1(x) ((x) & 0x1F) +#define _DARF_RC2(x) (((x) & 0x1F) << 8) +#define _DARF_RC3(x) (((x) & 0x1F) << 16) +#define _DARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (DARFRC + 4) +#define _DARF_RC5(x) ((x) & 0x1F) +#define _DARF_RC6(x) (((x) & 0x1F) << 8) +#define _DARF_RC7(x) (((x) & 0x1F) << 16) +#define _DARF_RC8(x) (((x) & 0x1F) << 24) + + +//2 RARFRC +#define _RARF_RC1(x) ((x) & 0x1F) +#define _RARF_RC2(x) (((x) & 0x1F) << 8) +#define _RARF_RC3(x) (((x) & 0x1F) << 16) +#define _RARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (RARFRC + 4) +#define _RARF_RC5(x) ((x) & 0x1F) +#define _RARF_RC6(x) (((x) & 0x1F) << 8) +#define _RARF_RC7(x) (((x) & 0x1F) << 16) +#define _RARF_RC8(x) (((x) & 0x1F) << 24) + + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + + + +//2 EDCA setting +#define AC_PARAM_TXOP_LIMIT_OFFSET 16 +#define AC_PARAM_ECW_MAX_OFFSET 12 +#define AC_PARAM_ECW_MIN_OFFSET 8 +#define AC_PARAM_AIFS_OFFSET 0 + + +//2 EDCA_VO_PARAM +#define _AIFS(x) (x) +#define _ECW_MAX_MIN(x) ((x) << 8) +#define _TXOP_LIMIT(x) ((x) << 16) + + +#define _BCNIFS(x) ((x) & 0xFF) +#define _BCNECW(x) (((x) & 0xF))<< 8) + + +#define _LRL(x) ((x) & 0x3F) +#define _SRL(x) (((x) & 0x3F) << 8) + + +//2 SIFS_CCK +#define _SIFS_CCK_CTX(x) ((x) & 0xFF) +#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); + + +//2 SIFS_OFDM +#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) +#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); + + +//2 TBTT PROHIBIT +#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) + + +//2 REG_RD_CTRL +#define DIS_EDCA_CNT_DWN BIT(11) + + +//2 BCN_CTRL +#define EN_MBSSID BIT(1) +#define EN_TXBCN_RPT BIT(2) +#define EN_BCN_FUNCTION BIT(3) + +// The same function but different bit field. +#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) +#define DIS_TSF_UDT0_TEST_CHIP BIT(5) + +//2 ACMHWCTRL +#define AcmHw_HwEn BIT(0) +#define AcmHw_BeqEn BIT(1) +#define AcmHw_ViqEn BIT(2) +#define AcmHw_VoqEn BIT(3) +#define AcmHw_BeqStatus BIT(4) +#define AcmHw_ViqStatus BIT(5) +#define AcmHw_VoqStatus BIT(6) + + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +//2 APSD_CTRL +#define APSDOFF BIT(6) +#define APSDOFF_STATUS BIT(7) + + +//2 BWOPMODE +#define BW_20MHZ BIT(2) +//#define BW_OPMODE_20MHZ BIT(2) // For compability + + +#define RATE_BITMAP_ALL 0xFFFFF + +// Only use CCK 1M rate for ACK +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 + +//2 TCR +#define TSFRST BIT(0) +#define DIS_GCLK BIT(1) +#define PAD_SEL BIT(2) +#define PWR_ST BIT(6) +#define PWRBIT_OW_EN BIT(7) +#define ACRC BIT(8) +#define CFENDFORM BIT(9) +#define ICV BIT(10) + + + +//2 RCR +#define AAP BIT(0) +#define APM BIT(1) +#define AM BIT(2) +#define AB BIT(3) +#define ADD3 BIT(4) +#define APWRMGT BIT(5) +#define CBSSID BIT(6) +#define CBSSID_BCN BIT(7) +#define ACRC32 BIT(8) +#define AICV BIT(9) +#define ADF BIT(11) +#define ACF BIT(12) +#define AMF BIT(13) +#define HTC_LOC_CTRL BIT(14) +#define UC_DATA_EN BIT(16) +#define BM_DATA_EN BIT(17) +#define MFBEN BIT(22) +#define LSIGEN BIT(23) +#define EnMBID BIT(24) +#define APP_BASSN BIT(27) +#define APP_PHYSTS BIT(28) +#define APP_ICV BIT(29) +#define APP_MIC BIT(30) +#define APP_FCS BIT(31) + +//2 RX_PKT_LIMIT + +//2 RX_DLK_TIME + +//2 MBIDCAMCFG + + + +//2 AMPDU_MIN_SPACE +#define _MIN_SPACE(x) ((x) & 0x7) +#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) + + +//2 RXERR_RPT +#define RXERR_TYPE_OFDM_PPDU 0 +#define RXERR_TYPE_OFDM_FALSE_ALARM 1 +#define RXERR_TYPE_OFDM_MPDU_OK 2 +#define RXERR_TYPE_OFDM_MPDU_FAIL 3 +#define RXERR_TYPE_CCK_PPDU 4 +#define RXERR_TYPE_CCK_FALSE_ALARM 5 +#define RXERR_TYPE_CCK_MPDU_OK 6 +#define RXERR_TYPE_CCK_MPDU_FAIL 7 +#define RXERR_TYPE_HT_PPDU 8 +#define RXERR_TYPE_HT_FALSE_ALARM 9 +#define RXERR_TYPE_HT_MPDU_TOTAL 10 +#define RXERR_TYPE_HT_MPDU_OK 11 +#define RXERR_TYPE_HT_MPDU_FAIL 12 +#define RXERR_TYPE_RX_FULL_DROP 15 + +#define RXERR_COUNTER_MASK 0xFFFFF +#define RXERR_RPT_RST BIT(27) +#define _RXERR_RPT_SEL(type) ((type) << 28) + + +//2 SECCFG +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption +#define SCR_SKByA2 BIT(4) //Search kEY BY A2 +#define SCR_NoSKMC BIT(5) //No Key Search Multicast +#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key +#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key + +//vivi added for new cam search flow, 20091028 +#ifdef HW_EN_DE_CRYPTION_FOR_NEW_CAM_SEARCH_FLOW +#define SCR_TxUseBroadcastDK BIT6 //Force Tx Use Broadcast Default Key +#define SCR_RxUseBroadcastDK BIT7 //Force Rx Use Broadcast Default Key +#endif + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- + +//2 USB Information (0xFE17) +#define USB_IS_HIGH_SPEED 0 +#define USB_IS_FULL_SPEED 1 +#define USB_SPEED_MASK BIT(5) + +#define USB_NORMAL_SIE_EP_MASK 0xF +#define USB_NORMAL_SIE_EP_SHIFT 4 + +#define USB_TEST_EP_MASK 0x30 +#define USB_TEST_EP_SHIFT 4 + +//2 Special Option +#define USB_AGG_EN BIT(3) + + +//2REG_C2HEVT_CLEAR +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. + +//2 8192D PartNo. +#define PARTNO_92D_NIC (BIT7|BIT6) +#define PARTNO_92D_NIC_REMARK (BIT5|BIT4) +#define PARTNO_SINGLE_BAND_VS BIT3 +#define PARTNO_SINGLE_BAND_VS_REMARK BIT1 +#define PARTNO_CONCURRENT_BAND_VC (BIT3|BIT2) +#define PARTNO_CONCURRENT_BAND_VC_REMARK (BIT1|BIT0) +//======================================================== +// General definitions +//======================================================== + +#define MAC_ADDR_LEN 6 +#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 +#define LAST_ENTRY_OF_TX_PKT_BUFFER_DUAL_MAC 127 + +#define POLLING_LLT_THRESHOLD 20 +#define POLLING_READY_TIMEOUT_COUNT 1000 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A +// GPIO BIT +#define HAL_8192C_HW_GPIO_WPS_BIT BIT2 + + +#include "basic_types.h" + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h new file mode 100755 index 000000000000..2b1580ff2402 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h @@ -0,0 +1,106 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192D_XMIT_H_ +#define _RTL8192D_XMIT_H_ + +#define VO_QUEUE_INX 0 +#define VI_QUEUE_INX 1 +#define BE_QUEUE_INX 2 +#define BK_QUEUE_INX 3 +#define BCN_QUEUE_INX 4 +#define MGT_QUEUE_INX 5 +#define HIGH_QUEUE_INX 6 +#define TXCMD_QUEUE_INX 7 + +#define HW_QUEUE_ENTRY 8 + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +//Because we open EM for normal case, we just always insert 2*8 bytes.by wl +#define USB_92D_DUMMY_OFFSET 2 +#define USB_92D_DUMMY_LENGTH (USB_92D_DUMMY_OFFSET * PACKET_OFFSET_SZ) +#define USB_HWDESC_HEADER_LEN (TXDESC_SIZE + USB_92D_DUMMY_LENGTH) + +//For 92D early mode +#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) +#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) +#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) +#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) +#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) +#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) +#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) + +#ifdef CONFIG_USB_HCI + +#ifdef CONFIG_USB_TX_AGGREGATION +#define MAX_TX_AGG_PACKET_NUMBER 0xFF +#endif + +s32 rtl8192du_init_xmit_priv(_adapter * padapter); + +void rtl8192du_free_xmit_priv(_adapter * padapter); + +void rtl8192du_cal_txdesc_chksum(struct tx_desc *ptxdesc); + +s32 rtl8192du_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +void rtl8192du_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192du_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192du_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8192de_init_xmit_priv(_adapter * padapter); +void rtl8192de_free_xmit_priv(_adapter * padapter); + +s32 rtl8192de_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf); +struct xmit_buf *rtl8192de_dequeue_xmitbuf(struct rtw_tx_ring *ring); + +void rtl8192de_xmitframe_resume(_adapter *padapter); + +void rtl8192de_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192de_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192de_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h b/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h new file mode 100755 index 000000000000..1313a255fb93 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL871X_BYTEORDER_H_ +#define _RTL871X_BYTEORDER_H_ + +#include + +#if defined (CONFIG_LITTLE_ENDIAN) && defined (CONFIG_BIG_ENDIAN) +#error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n" +#endif + +#if defined (CONFIG_LITTLE_ENDIAN) +#ifndef CONFIG_PLATFORM_MSTAR389 +# include +#endif +#elif defined (CONFIG_BIG_ENDIAN) +# include +#else +# error "Must be LITTLE/BIG Endian Host" +#endif + +#endif /* _RTL871X_BYTEORDER_H_ */ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_cmd.h b/drivers/net/wireless/rtl8192c/include/rtw_cmd.h new file mode 100755 index 000000000000..58a54f50989b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_cmd.h @@ -0,0 +1,1100 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_CMD_H_ +#define __RTW_CMD_H_ + +#include +#include +#include + +#define C2H_MEM_SZ (16*1024) + +#ifndef CONFIG_RTL8711FW + + #include + #include // + + + #define FREE_CMDOBJ_SZ 128 + + #define MAX_CMDSZ 1024 + #define MAX_RSPSZ 512 + #define MAX_EVTSZ 1024 + +#ifdef PLATFORM_OS_CE + #define CMDBUFF_ALIGN_SZ 4 +#else + #define CMDBUFF_ALIGN_SZ 512 +#endif + + struct cmd_obj { + u16 cmdcode; + u8 res; + u8 *parmbuf; + u32 cmdsz; + u8 *rsp; + u32 rspsz; + //_sema cmd_sem; + _list list; + }; + + struct cmd_priv { + _sema cmd_queue_sema; + //_sema cmd_done_sema; + _sema terminate_cmdthread_sema; + _queue cmd_queue; + u8 cmd_seq; + u8 *cmd_buf; //shall be non-paged, and 4 bytes aligned + u8 *cmd_allocated_buf; + u8 *rsp_buf; //shall be non-paged, and 4 bytes aligned + u8 *rsp_allocated_buf; + u32 cmd_issued_cnt; + u32 cmd_done_cnt; + u32 rsp_cnt; + u8 cmdthd_running; + _adapter *padapter; + }; + +#ifdef CONFIG_EVENT_THREAD_MODE + struct evt_obj { + u16 evtcode; + u8 res; + u8 *parmbuf; + u32 evtsz; + _list list; + }; +#endif + + struct evt_priv { +#ifdef CONFIG_EVENT_THREAD_MODE + _sema evt_notify; + _sema terminate_evtthread_sema; + _queue evt_queue; +#endif + +#ifdef CONFIG_H2CLBK + _sema lbkevt_done; + u8 lbkevt_limit; + u8 lbkevt_num; + u8 *cmdevt_parm; +#endif + ATOMIC_T event_seq; + u8 *evt_buf; //shall be non-paged, and 4 bytes aligned + u8 *evt_allocated_buf; + u32 evt_done_cnt; +#ifdef CONFIG_SDIO_HCI + u8 *c2h_mem; + u8 *allocated_c2h_mem; +#ifdef PLATFORM_OS_XP + PMDL pc2h_mdl; +#endif +#endif + + }; + +#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \ +do {\ + _rtw_init_listhead(&pcmd->list);\ + pcmd->cmdcode = code;\ + pcmd->parmbuf = (u8 *)(pparm);\ + pcmd->cmdsz = sizeof (*pparm);\ + pcmd->rsp = NULL;\ + pcmd->rspsz = 0;\ +} while(0) + +extern u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj); +extern struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv); +extern void rtw_free_cmd_obj(struct cmd_obj *pcmd); + +#ifdef CONFIG_EVENT_THREAD_MODE +extern u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj); +extern struct evt_obj *rtw_dequeue_evt(_queue *queue); +extern void rtw_free_evt_obj(struct evt_obj *pcmd); +#endif + +thread_return rtw_cmd_thread(thread_context context); + +extern u32 rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); +extern void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv); + +extern u32 rtw_init_evt_priv (struct evt_priv *pevtpriv); +extern void rtw_free_evt_priv (struct evt_priv *pevtpriv); +extern void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv); +extern void rtw_evt_notify_isr(struct evt_priv *pevtpriv); +#ifdef CONFIG_P2P +u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ); +#endif //CONFIG_P2P + +#else + #include +#endif /* CONFIG_RTL8711FW */ + +enum rtw_drvextra_cmd_id +{ + NONE_WK_CID, + DYNAMIC_CHK_WK_CID, + DM_CTRL_WK_CID, + PBC_POLLING_WK_CID, + POWER_SAVING_CTRL_WK_CID,//IPS,AUTOSuspend + LPS_CTRL_WK_CID, + ANT_SELECT_WK_CID, + P2P_PS_WK_CID, + P2P_PROTO_WK_CID, + CHECK_HIQ_WK_CID,//for softap mode, check hi queue if empty + MAX_WK_CID +}; + +enum LPS_CTRL_TYPE +{ + LPS_CTRL_SCAN=0, + LPS_CTRL_JOINBSS=1, + LPS_CTRL_CONNECT=2, + LPS_CTRL_DISCONNECT=3, + LPS_CTRL_SPECIAL_PACKET=4, +}; + +enum RFINTFS { + SWSI, + HWSI, + HWPI, +}; + +/* +Caller Mode: Infra, Ad-HoC(C) + +Notes: To enter USB suspend mode + +Command Mode + +*/ +struct usb_suspend_parm { + u32 action;// 1: sleep, 0:resume +}; + +/* +Caller Mode: Infra, Ad-HoC + +Notes: To join a known BSS. + +Command-Event Mode + +*/ + +/* +Caller Mode: Infra, Ad-Hoc + +Notes: To join the specified bss + +Command Event Mode + +*/ +struct joinbss_parm { + WLAN_BSSID_EX network; +}; + +/* +Caller Mode: Infra, Ad-HoC(C) + +Notes: To disconnect the current associated BSS + +Command Mode + +*/ +struct disconnect_parm { + u32 rsvd; +}; + +/* +Caller Mode: AP, Ad-HoC(M) + +Notes: To create a BSS + +Command Mode +*/ +struct createbss_parm { + WLAN_BSSID_EX network; +}; + +/* +Caller Mode: AP, Ad-HoC, Infra + +Notes: To set the NIC mode of RTL8711 + +Command Mode + +The definition of mode: + +#define IW_MODE_AUTO 0 // Let the driver decides which AP to join +#define IW_MODE_ADHOC 1 // Single cell network (Ad-Hoc Clients) +#define IW_MODE_INFRA 2 // Multi cell network, roaming, .. +#define IW_MODE_MASTER 3 // Synchronisation master or Access Point +#define IW_MODE_REPEAT 4 // Wireless Repeater (forwarder) +#define IW_MODE_SECOND 5 // Secondary master/repeater (backup) +#define IW_MODE_MONITOR 6 // Passive monitor (listen only) + +*/ +struct setopmode_parm { + u8 mode; + u8 rsvd[3]; +}; + +/* +Caller Mode: AP, Ad-HoC, Infra + +Notes: To ask RTL8711 performing site-survey + +Command-Event Mode + +*/ +struct sitesurvey_parm { + sint scan_mode; //active: 1, passive: 0 + sint bsslimit; // 1 ~ 48 + sint ss_ssidlen; + u8 ss_ssid[IW_ESSID_MAX_SIZE + 1]; +}; + +/* +Caller Mode: Any + +Notes: To set the auth type of RTL8711. open/shared/802.1x + +Command Mode + +*/ +struct setauth_parm { + u8 mode; //0: legacy open, 1: legacy shared 2: 802.1x + u8 _1x; //0: PSK, 1: TLS + u8 rsvd[2]; +}; + +/* +Caller Mode: Infra + +a. algorithm: wep40, wep104, tkip & aes +b. keytype: grp key/unicast key +c. key contents + +when shared key ==> keyid is the camid +when 802.1x ==> keyid [0:1] ==> grp key +when 802.1x ==> keyid > 2 ==> unicast key + +*/ +struct setkey_parm { + u8 algorithm; // encryption algorithm, could be none, wep40, TKIP, CCMP, wep104 + u8 keyid; + u8 grpkey; // 1: this is the grpkey for 802.1x. 0: this is the unicast key for 802.1x + u8 set_tx; // 1: main tx key for wep. 0: other key. + u8 key[16]; // this could be 40 or 104 +}; + +/* +When in AP or Ad-Hoc mode, this is used to +allocate an sw/hw entry for a newly associated sta. + +Command + +when shared key ==> algorithm/keyid + +*/ +struct set_stakey_parm { + u8 addr[ETH_ALEN]; + u8 algorithm; + u8 key[16]; +}; + +struct set_stakey_rsp { + u8 addr[ETH_ALEN]; + u8 keyid; + u8 rsvd; +}; + +/* +Caller Ad-Hoc/AP + +Command -Rsp(AID == CAMID) mode + +This is to force fw to add an sta_data entry per driver's request. + +FW will write an cam entry associated with it. + +*/ +struct set_assocsta_parm { + u8 addr[ETH_ALEN]; +}; + +struct set_assocsta_rsp { + u8 cam_id; + u8 rsvd[3]; +}; + +/* + Caller Ad-Hoc/AP + + Command mode + + This is to force fw to del an sta_data entry per driver's request + + FW will invalidate the cam entry associated with it. + +*/ +struct del_assocsta_parm { + u8 addr[ETH_ALEN]; +}; + +/* +Caller Mode: AP/Ad-HoC(M) + +Notes: To notify fw that given staid has changed its power state + +Command Mode + +*/ +struct setstapwrstate_parm { + u8 staid; + u8 status; + u8 hwaddr[6]; +}; + +/* +Caller Mode: Any + +Notes: To setup the basic rate of RTL8711 + +Command Mode + +*/ +struct setbasicrate_parm { + u8 basicrates[NumRates]; +}; + +/* +Caller Mode: Any + +Notes: To read the current basic rate + +Command-Rsp Mode + +*/ +struct getbasicrate_parm { + u32 rsvd; +}; + +struct getbasicrate_rsp { + u8 basicrates[NumRates]; +}; + +/* +Caller Mode: Any + +Notes: To setup the data rate of RTL8711 + +Command Mode + +*/ +struct setdatarate_parm { +#ifdef MP_FIRMWARE_OFFLOAD + u32 curr_rateidx; +#else + u8 mac_id; + u8 datarates[NumRates]; +#endif +}; + +/* +Caller Mode: Any + +Notes: To read the current data rate + +Command-Rsp Mode + +*/ +struct getdatarate_parm { + u32 rsvd; + +}; +struct getdatarate_rsp { + u8 datarates[NumRates]; +}; + + +/* +Caller Mode: Any +AP: AP can use the info for the contents of beacon frame +Infra: STA can use the info when sitesurveying +Ad-HoC(M): Like AP +Ad-HoC(C): Like STA + + +Notes: To set the phy capability of the NIC + +Command Mode + +*/ + +struct setphyinfo_parm { + struct regulatory_class class_sets[NUM_REGULATORYS]; + u8 status; +}; + +struct getphyinfo_parm { + u32 rsvd; +}; + +struct getphyinfo_rsp { + struct regulatory_class class_sets[NUM_REGULATORYS]; + u8 status; +}; + +/* +Caller Mode: Any + +Notes: To set the channel/modem/band +This command will be used when channel/modem/band is changed. + +Command Mode + +*/ +struct setphy_parm { + u8 rfchannel; + u8 modem; +}; + +/* +Caller Mode: Any + +Notes: To get the current setting of channel/modem/band + +Command-Rsp Mode + +*/ +struct getphy_parm { + u32 rsvd; + +}; +struct getphy_rsp { + u8 rfchannel; + u8 modem; +}; + +struct readBB_parm { + u8 offset; +}; +struct readBB_rsp { + u8 value; +}; + +struct readTSSI_parm { + u8 offset; +}; +struct readTSSI_rsp { + u8 value; +}; + +struct writeBB_parm { + u8 offset; + u8 value; +}; + +struct readRF_parm { + u8 offset; +}; +struct readRF_rsp { + u32 value; +}; + +struct writeRF_parm { + u32 offset; + u32 value; +}; + +struct getrfintfs_parm { + u8 rfintfs; +}; + + +struct Tx_Beacon_param +{ + WLAN_BSSID_EX network; +}; + +/* + Notes: This command is used for H2C/C2H loopback testing + + mac[0] == 0 + ==> CMD mode, return H2C_SUCCESS. + The following condition must be ture under CMD mode + mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0; + s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7; + s2 == (b1 << 8 | b0); + + mac[0] == 1 + ==> CMD_RSP mode, return H2C_SUCCESS_RSP + + The rsp layout shall be: + rsp: parm: + mac[0] = mac[5]; + mac[1] = mac[4]; + mac[2] = mac[3]; + mac[3] = mac[2]; + mac[4] = mac[1]; + mac[5] = mac[0]; + s0 = s1; + s1 = swap16(s0); + w0 = swap32(w1); + b0 = b1 + s2 = s0 + s1 + b1 = b0 + w1 = w0 + + mac[0] == 2 + ==> CMD_EVENT mode, return H2C_SUCCESS + The event layout shall be: + event: parm: + mac[0] = mac[5]; + mac[1] = mac[4]; + mac[2] = event's sequence number, starting from 1 to parm's marc[3] + mac[3] = mac[2]; + mac[4] = mac[1]; + mac[5] = mac[0]; + s0 = swap16(s0) - event.mac[2]; + s1 = s1 + event.mac[2]; + w0 = swap32(w0); + b0 = b1 + s2 = s0 + event.mac[2] + b1 = b0 + w1 = swap32(w1) - event.mac[2]; + + parm->mac[3] is the total event counts that host requested. + + + event will be the same with the cmd's param. + +*/ + +#ifdef CONFIG_H2CLBK + +struct seth2clbk_parm { + u8 mac[6]; + u16 s0; + u16 s1; + u32 w0; + u8 b0; + u16 s2; + u8 b1; + u32 w1; +}; + +struct geth2clbk_parm { + u32 rsv; +}; + +struct geth2clbk_rsp { + u8 mac[6]; + u16 s0; + u16 s1; + u32 w0; + u8 b0; + u16 s2; + u8 b1; + u32 w1; +}; + +#endif /* CONFIG_H2CLBK */ + +// CMD param Formart for driver extra cmd handler +struct drvextra_cmd_parm { + int ec_id; //extra cmd id + int type_size; // Can use this field as the type id or command size + unsigned char *pbuf; +}; + +/*------------------- Below are used for RF/BB tunning ---------------------*/ + +struct setantenna_parm { + u8 tx_antset; + u8 rx_antset; + u8 tx_antenna; + u8 rx_antenna; +}; + +struct enrateadaptive_parm { + u32 en; +}; + +struct settxagctbl_parm { + u32 txagc[MAX_RATES_LENGTH]; +}; + +struct gettxagctbl_parm { + u32 rsvd; +}; +struct gettxagctbl_rsp { + u32 txagc[MAX_RATES_LENGTH]; +}; + +struct setagcctrl_parm { + u32 agcctrl; // 0: pure hw, 1: fw +}; + + +struct setssup_parm { + u32 ss_ForceUp[MAX_RATES_LENGTH]; +}; + +struct getssup_parm { + u32 rsvd; +}; +struct getssup_rsp { + u8 ss_ForceUp[MAX_RATES_LENGTH]; +}; + + +struct setssdlevel_parm { + u8 ss_DLevel[MAX_RATES_LENGTH]; +}; + +struct getssdlevel_parm { + u32 rsvd; +}; +struct getssdlevel_rsp { + u8 ss_DLevel[MAX_RATES_LENGTH]; +}; + +struct setssulevel_parm { + u8 ss_ULevel[MAX_RATES_LENGTH]; +}; + +struct getssulevel_parm { + u32 rsvd; +}; +struct getssulevel_rsp { + u8 ss_ULevel[MAX_RATES_LENGTH]; +}; + + +struct setcountjudge_parm { + u8 count_judge[MAX_RATES_LENGTH]; +}; + +struct getcountjudge_parm { + u32 rsvd; +}; +struct getcountjudge_rsp { + u8 count_judge[MAX_RATES_LENGTH]; +}; + + +struct setratable_parm { + u8 ss_ForceUp[NumRates]; + u8 ss_ULevel[NumRates]; + u8 ss_DLevel[NumRates]; + u8 count_judge[NumRates]; +}; + +struct getratable_parm { + uint rsvd; +}; +struct getratable_rsp { + u8 ss_ForceUp[NumRates]; + u8 ss_ULevel[NumRates]; + u8 ss_DLevel[NumRates]; + u8 count_judge[NumRates]; +}; + + +//to get TX,RX retry count +struct gettxretrycnt_parm{ + unsigned int rsvd; +}; +struct gettxretrycnt_rsp{ + unsigned long tx_retrycnt; +}; + +struct getrxretrycnt_parm{ + unsigned int rsvd; +}; +struct getrxretrycnt_rsp{ + unsigned long rx_retrycnt; +}; + +//to get BCNOK,BCNERR count +struct getbcnokcnt_parm{ + unsigned int rsvd; +}; +struct getbcnokcnt_rsp{ + unsigned long bcnokcnt; +}; + +struct getbcnerrcnt_parm{ + unsigned int rsvd; +}; +struct getbcnerrcnt_rsp{ + unsigned long bcnerrcnt; +}; + +// to get current TX power level +struct getcurtxpwrlevel_parm{ + unsigned int rsvd; +}; +struct getcurtxpwrlevel_rsp{ + unsigned short tx_power; +}; + +struct setprobereqextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setassocreqextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setproberspextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setassocrspextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + + +struct addBaReq_parm +{ + unsigned int tid; + u8 addr[ETH_ALEN]; +}; + +/*H2C Handler index: 46 */ +struct SetChannel_parm +{ + u32 curr_ch; +}; + +#ifdef MP_FIRMWARE_OFFLOAD +/*H2C Handler index: 47 */ +struct SetTxPower_parm +{ + u8 TxPower; +}; + +/*H2C Handler index: 48 */ +struct SwitchAntenna_parm +{ + u16 antenna_tx; + u16 antenna_rx; +// R_ANTENNA_SELECT_CCK cck_txrx; + u8 cck_txrx; +}; + +/*H2C Handler index: 49 */ +struct SetCrystalCap_parm +{ + u32 curr_crystalcap; +}; + +/*H2C Handler index: 50 */ +struct SetSingleCarrierTx_parm +{ + u8 bStart; +}; + +/*H2C Handler index: 51 */ +struct SetSingleToneTx_parm +{ + u8 bStart; + u8 curr_rfpath; +}; + +/*H2C Handler index: 52 */ +struct SetCarrierSuppressionTx_parm +{ + u8 bStart; + u32 curr_rateidx; +}; + +/*H2C Handler index: 53 */ +struct SetContinuousTx_parm +{ + u8 bStart; + u8 CCK_flag; /*1:CCK 2:OFDM*/ + u32 curr_rateidx; +}; + +/*H2C Handler index: 54 */ +struct SwitchBandwidth_parm +{ + u8 curr_bandwidth; +}; + +#endif /* MP_FIRMWARE_OFFLOAD */ + +/*H2C Handler index: 59 */ +struct SetChannelPlan_param +{ + u8 channel_plan; +}; + +#define GEN_CMD_CODE(cmd) cmd ## _CMD_ + + +/* + +Result: +0x00: success +0x01: sucess, and check Response. +0x02: cmd ignored due to duplicated sequcne number +0x03: cmd dropped due to invalid cmd code +0x04: reserved. + +*/ + +#define H2C_RSP_OFFSET 512 + +#define H2C_SUCCESS 0x00 +#define H2C_SUCCESS_RSP 0x01 +#define H2C_DUPLICATED 0x02 +#define H2C_DROPPED 0x03 +#define H2C_PARAMETERS_ERROR 0x04 +#define H2C_REJECTED 0x05 +#define H2C_CMD_OVERFLOW 0x06 +#define H2C_RESERVED 0x07 + +extern u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr); +extern u8 rtw_setstandby_cmd(_adapter *padapter, uint action); +extern u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *pssid); +extern u8 rtw_createbss_cmd(_adapter *padapter); +extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz); +extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch); +extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key); +extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork); +extern u8 rtw_disassoc_cmd(_adapter *padapter); +extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +extern u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset); +extern u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset); +extern u8 rtw_setbbreg_cmd(_adapter * padapter, u8 offset, u8 val); +extern u8 rtw_setrfreg_cmd(_adapter * padapter, u8 offset, u32 val); +extern u8 rtw_getbbreg_cmd(_adapter * padapter, u8 offset, u8 * pval); +extern u8 rtw_getrfreg_cmd(_adapter * padapter, u8 offset, u8 * pval); +extern u8 rtw_setrfintfs_cmd(_adapter *padapter, u8 mode); +extern u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table); +extern u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval); + +extern u8 rtw_gettssi_cmd(_adapter *padapter, u8 offset,u8 *pval); +extern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type); +extern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type); + +extern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr); + +extern u8 rtw_dynamic_chk_wk_cmd(_adapter *adapter); + +u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue); + +#ifdef CONFIG_ANTENNA_DIVERSITY +extern u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue); +#endif + +extern u8 rtw_ps_cmd(_adapter*padapter); + + +#ifdef CONFIG_AP_MODE +u8 rtw_chk_hi_queue_cmd(_adapter*padapter); +#endif + +extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan); + +u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf); + +extern void rtw_survey_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_disassoc_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_joinbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_getbbrfreg_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd); + +extern void rtw_setstaKey_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_setassocsta_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_getrttbl_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); + + +struct _cmd_callback { + u32 cmd_code; + void (*callback)(_adapter *padapter, struct cmd_obj *cmd); +}; + +enum rtw_h2c_cmd +{ + GEN_CMD_CODE(_Read_MACREG) , /*0*/ + GEN_CMD_CODE(_Write_MACREG) , + GEN_CMD_CODE(_Read_BBREG) , + GEN_CMD_CODE(_Write_BBREG) , + GEN_CMD_CODE(_Read_RFREG) , + GEN_CMD_CODE(_Write_RFREG) , /*5*/ + GEN_CMD_CODE(_Read_EEPROM) , + GEN_CMD_CODE(_Write_EEPROM) , + GEN_CMD_CODE(_Read_EFUSE) , + GEN_CMD_CODE(_Write_EFUSE) , + + GEN_CMD_CODE(_Read_CAM) , /*10*/ + GEN_CMD_CODE(_Write_CAM) , + GEN_CMD_CODE(_setBCNITV), + GEN_CMD_CODE(_setMBIDCFG), + GEN_CMD_CODE(_JoinBss), /*14*/ + GEN_CMD_CODE(_DisConnect) , /*15*/ + GEN_CMD_CODE(_CreateBss) , + GEN_CMD_CODE(_SetOpMode) , + GEN_CMD_CODE(_SiteSurvey), /*18*/ + GEN_CMD_CODE(_SetAuth) , + + GEN_CMD_CODE(_SetKey) , /*20*/ + GEN_CMD_CODE(_SetStaKey) , + GEN_CMD_CODE(_SetAssocSta) , + GEN_CMD_CODE(_DelAssocSta) , + GEN_CMD_CODE(_SetStaPwrState) , + GEN_CMD_CODE(_SetBasicRate) , /*25*/ + GEN_CMD_CODE(_GetBasicRate) , + GEN_CMD_CODE(_SetDataRate) , + GEN_CMD_CODE(_GetDataRate) , + GEN_CMD_CODE(_SetPhyInfo) , + + GEN_CMD_CODE(_GetPhyInfo) , /*30*/ + GEN_CMD_CODE(_SetPhy) , + GEN_CMD_CODE(_GetPhy) , + GEN_CMD_CODE(_readRssi) , + GEN_CMD_CODE(_readGain) , + GEN_CMD_CODE(_SetAtim) , /*35*/ + GEN_CMD_CODE(_SetPwrMode) , + GEN_CMD_CODE(_JoinbssRpt), + GEN_CMD_CODE(_SetRaTable) , + GEN_CMD_CODE(_GetRaTable) , + + GEN_CMD_CODE(_GetCCXReport), /*40*/ + GEN_CMD_CODE(_GetDTMReport), + GEN_CMD_CODE(_GetTXRateStatistics), + GEN_CMD_CODE(_SetUsbSuspend), + GEN_CMD_CODE(_SetH2cLbk), + GEN_CMD_CODE(_AddBAReq) , /*45*/ + GEN_CMD_CODE(_SetChannel), /*46*/ + GEN_CMD_CODE(_SetTxPower), + GEN_CMD_CODE(_SwitchAntenna), + GEN_CMD_CODE(_SetCrystalCap), + GEN_CMD_CODE(_SetSingleCarrierTx), /*50*/ + + GEN_CMD_CODE(_SetSingleToneTx),/*51*/ + GEN_CMD_CODE(_SetCarrierSuppressionTx), + GEN_CMD_CODE(_SetContinuousTx), + GEN_CMD_CODE(_SwitchBandwidth), /*54*/ + GEN_CMD_CODE(_TX_Beacon), /*55*/ + + GEN_CMD_CODE(_Set_MLME_EVT), /*56*/ + GEN_CMD_CODE(_Set_Drv_Extra), /*57*/ + GEN_CMD_CODE(_Set_H2C_MSG), /*58*/ + + GEN_CMD_CODE(_SetChannelPlan), /*59*/ + + MAX_H2CCMD +}; + +#define _GetBBReg_CMD_ _Read_BBREG_CMD_ +#define _SetBBReg_CMD_ _Write_BBREG_CMD_ +#define _GetRFReg_CMD_ _Read_RFREG_CMD_ +#define _SetRFReg_CMD_ _Write_RFREG_CMD_ + +#ifdef _RTW_CMD_C_ +struct _cmd_callback rtw_cmd_callback[] = +{ + {GEN_CMD_CODE(_Read_MACREG), NULL}, /*0*/ + {GEN_CMD_CODE(_Write_MACREG), NULL}, + {GEN_CMD_CODE(_Read_BBREG), &rtw_getbbrfreg_cmdrsp_callback}, + {GEN_CMD_CODE(_Write_BBREG), NULL}, + {GEN_CMD_CODE(_Read_RFREG), &rtw_getbbrfreg_cmdrsp_callback}, + {GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/ + {GEN_CMD_CODE(_Read_EEPROM), NULL}, + {GEN_CMD_CODE(_Write_EEPROM), NULL}, + {GEN_CMD_CODE(_Read_EFUSE), NULL}, + {GEN_CMD_CODE(_Write_EFUSE), NULL}, + + {GEN_CMD_CODE(_Read_CAM), NULL}, /*10*/ + {GEN_CMD_CODE(_Write_CAM), NULL}, + {GEN_CMD_CODE(_setBCNITV), NULL}, + {GEN_CMD_CODE(_setMBIDCFG), NULL}, + {GEN_CMD_CODE(_JoinBss), &rtw_joinbss_cmd_callback}, /*14*/ + {GEN_CMD_CODE(_DisConnect), &rtw_disassoc_cmd_callback}, /*15*/ + {GEN_CMD_CODE(_CreateBss), &rtw_createbss_cmd_callback}, + {GEN_CMD_CODE(_SetOpMode), NULL}, + {GEN_CMD_CODE(_SiteSurvey), &rtw_survey_cmd_callback}, /*18*/ + {GEN_CMD_CODE(_SetAuth), NULL}, + + {GEN_CMD_CODE(_SetKey), NULL}, /*20*/ + {GEN_CMD_CODE(_SetStaKey), &rtw_setstaKey_cmdrsp_callback}, + {GEN_CMD_CODE(_SetAssocSta), &rtw_setassocsta_cmdrsp_callback}, + {GEN_CMD_CODE(_DelAssocSta), NULL}, + {GEN_CMD_CODE(_SetStaPwrState), NULL}, + {GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/ + {GEN_CMD_CODE(_GetBasicRate), NULL}, + {GEN_CMD_CODE(_SetDataRate), NULL}, + {GEN_CMD_CODE(_GetDataRate), NULL}, + {GEN_CMD_CODE(_SetPhyInfo), NULL}, + + {GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/ + {GEN_CMD_CODE(_SetPhy), NULL}, + {GEN_CMD_CODE(_GetPhy), NULL}, + {GEN_CMD_CODE(_readRssi), NULL}, + {GEN_CMD_CODE(_readGain), NULL}, + {GEN_CMD_CODE(_SetAtim), NULL}, /*35*/ + {GEN_CMD_CODE(_SetPwrMode), NULL}, + {GEN_CMD_CODE(_JoinbssRpt), NULL}, + {GEN_CMD_CODE(_SetRaTable), NULL}, + {GEN_CMD_CODE(_GetRaTable) , NULL}, + + {GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/ + {GEN_CMD_CODE(_GetDTMReport), NULL}, + {GEN_CMD_CODE(_GetTXRateStatistics), NULL}, + {GEN_CMD_CODE(_SetUsbSuspend), NULL}, + {GEN_CMD_CODE(_SetH2cLbk), NULL}, + {GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/ + {GEN_CMD_CODE(_SetChannel), NULL}, /*46*/ + {GEN_CMD_CODE(_SetTxPower), NULL}, + {GEN_CMD_CODE(_SwitchAntenna), NULL}, + {GEN_CMD_CODE(_SetCrystalCap), NULL}, + {GEN_CMD_CODE(_SetSingleCarrierTx), NULL}, /*50*/ + + {GEN_CMD_CODE(_SetSingleToneTx), NULL}, /*51*/ + {GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL}, + {GEN_CMD_CODE(_SetContinuousTx), NULL}, + {GEN_CMD_CODE(_SwitchBandwidth), NULL}, /*54*/ + {GEN_CMD_CODE(_TX_Beacon), NULL},/*55*/ + + {GEN_CMD_CODE(_Set_MLME_EVT), NULL},/*56*/ + {GEN_CMD_CODE(_Set_Drv_Extra), NULL},/*57*/ + {GEN_CMD_CODE(_Set_H2C_MSG), NULL},/*58*/ + {GEN_CMD_CODE(_SetChannelPlan), NULL},/*59*/ +}; +#endif + +#endif // _CMD_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_debug.h b/drivers/net/wireless/rtl8192c/include/rtw_debug.h new file mode 100755 index 000000000000..bd3541f240ec --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_debug.h @@ -0,0 +1,374 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_DEBUG_H__ +#define __RTW_DEBUG_H__ + +#include +#include +#include + + +#define _drv_emerg_ 1 +#define _drv_alert_ 2 +#define _drv_crit_ 3 +#define _drv_err_ 4 +#define _drv_warning_ 5 +#define _drv_notice_ 6 +#define _drv_info_ 7 +#define _drv_dump_ 8 +#define _drv_debug_ 9 + + +#define _module_rtl871x_xmit_c_ BIT(0) +#define _module_xmit_osdep_c_ BIT(1) +#define _module_rtl871x_recv_c_ BIT(2) +#define _module_recv_osdep_c_ BIT(3) +#define _module_rtl871x_mlme_c_ BIT(4) +#define _module_mlme_osdep_c_ BIT(5) +#define _module_rtl871x_sta_mgt_c_ BIT(6) +#define _module_rtl871x_cmd_c_ BIT(7) +#define _module_cmd_osdep_c_ BIT(8) +#define _module_rtl871x_io_c_ BIT(9) +#define _module_io_osdep_c_ BIT(10) +#define _module_os_intfs_c_ BIT(11) +#define _module_rtl871x_security_c_ BIT(12) +#define _module_rtl871x_eeprom_c_ BIT(13) +#define _module_hal_init_c_ BIT(14) +#define _module_hci_hal_init_c_ BIT(15) +#define _module_rtl871x_ioctl_c_ BIT(16) +#define _module_rtl871x_ioctl_set_c_ BIT(17) +#define _module_rtl871x_ioctl_query_c_ BIT(18) +#define _module_rtl871x_pwrctrl_c_ BIT(19) +#define _module_hci_intfs_c_ BIT(20) +#define _module_hci_ops_c_ BIT(21) +#define _module_osdep_service_c_ BIT(22) +#define _module_mp_ BIT(23) +#define _module_hci_ops_os_c_ BIT(24) +#define _module_rtl871x_ioctl_os_c BIT(25) +#define _module_rtl8712_cmd_c_ BIT(26) +//#define _module_efuse_ BIT(27) +#define _module_rtl8192c_xmit_c_ BIT(28) +#define _module_efuse_ BIT(29) +#define _module_rtl8712_recv_c_ BIT(30) +#define _module_rtl8712_led_c_ BIT(31) + +#undef _MODULE_DEFINE_ + +#if defined _RTL871X_XMIT_C_ + #define _MODULE_DEFINE_ _module_rtl871x_xmit_c_ +#elif defined _XMIT_OSDEP_C_ + #define _MODULE_DEFINE_ _module_xmit_osdep_c_ +#elif defined _RTL871X_RECV_C_ + #define _MODULE_DEFINE_ _module_rtl871x_recv_c_ +#elif defined _RECV_OSDEP_C_ + #define _MODULE_DEFINE_ _module_recv_osdep_c_ +#elif defined _RTL871X_MLME_C_ + #define _MODULE_DEFINE_ _module_rtl871x_mlme_c_ +#elif defined _MLME_OSDEP_C_ + #define _MODULE_DEFINE_ _module_mlme_osdep_c_ +#elif defined _RTL871X_STA_MGT_C_ + #define _MODULE_DEFINE_ _module_rtl871x_sta_mgt_c_ +#elif defined _RTL871X_CMD_C_ + #define _MODULE_DEFINE_ _module_rtl871x_cmd_c_ +#elif defined _CMD_OSDEP_C_ + #define _MODULE_DEFINE_ _module_cmd_osdep_c_ +#elif defined _RTL871X_IO_C_ + #define _MODULE_DEFINE_ _module_rtl871x_io_c_ +#elif defined _IO_OSDEP_C_ + #define _MODULE_DEFINE_ _module_io_osdep_c_ +#elif defined _OS_INTFS_C_ + #define _MODULE_DEFINE_ _module_os_intfs_c_ +#elif defined _RTL871X_SECURITY_C_ + #define _MODULE_DEFINE_ _module_rtl871x_security_c_ +#elif defined _RTL871X_EEPROM_C_ + #define _MODULE_DEFINE_ _module_rtl871x_eeprom_c_ +#elif defined _HAL_INIT_C_ + #define _MODULE_DEFINE_ _module_hal_init_c_ +#elif defined _HCI_HAL_INIT_C_ + #define _MODULE_DEFINE_ _module_hci_hal_init_c_ +#elif defined _RTL871X_IOCTL_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_c_ +#elif defined _RTL871X_IOCTL_SET_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_set_c_ +#elif defined _RTL871X_IOCTL_QUERY_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_query_c_ +#elif defined _RTL871X_PWRCTRL_C_ + #define _MODULE_DEFINE_ _module_rtl871x_pwrctrl_c_ +#elif defined _HCI_INTF_C_ + #define _MODULE_DEFINE_ _module_hci_intfs_c_ +#elif defined _HCI_OPS_C_ + #define _MODULE_DEFINE_ _module_hci_ops_c_ +#elif defined _OSDEP_HCI_INTF_C_ + #define _MODULE_DEFINE_ _module_hci_intfs_c_ +#elif defined _OSDEP_SERVICE_C_ + #define _MODULE_DEFINE_ _module_osdep_service_c_ +#elif defined _HCI_OPS_OS_C_ + #define _MODULE_DEFINE_ _module_hci_ops_os_c_ +#elif defined _RTL871X_IOCTL_LINUX_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_os_c +#elif defined _RTL8712_CMD_C_ + #define _MODULE_DEFINE_ _module_rtl8712_cmd_c_ +#elif defined _RTL8192C_XMIT_C_ + #define _MODULE_DEFINE_ _module_rtl8192c_xmit_c_ +#elif defined _RTL8712_RECV_C_ + #define _MODULE_DEFINE_ _module_rtl8712_recv_c_ +#elif defined _RTL8192CU_RECV_C_ + #define _MODULE_DEFINE_ _module_rtl8712_recv_c_ +#elif defined _RTL871X_MLME_EXT_C_ + #define _MODULE_DEFINE_ _module_mlme_osdep_c_ +#elif defined _RTW_MP_C_ + #define _MODULE_DEFINE_ _module_mp_ +#elif defined _RTW_MP_IOCTL_C_ + #define _MODULE_DEFINE_ _module_mp_ +#elif defined _RTW_EFUSE_C_ + #define _MODULE_DEFINE_ _module_efuse_ +#endif + +#ifdef PLATFORM_OS_CE +extern void rtl871x_cedbg(const char *fmt, ...); +#endif + +#define RT_TRACE(_Comp, _Level, Fmt) do{}while(0) +#define _func_enter_ {} +#define _func_exit_ {} +#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) {} + +#undef _dbgdump + +#ifdef CONFIG_DEBUG_RTL871X + +#ifndef _RTL871X_DEBUG_C_ + extern u32 GlobalDebugLevel; + extern u64 GlobalDebugComponents; +#endif + +#ifdef PLATFORM_WINDOWS + + #ifdef PLATFORM_OS_XP + + #define _dbgdump DbgPrint + + #elif defined PLATFORM_OS_CE + + #define _dbgdump rtl871x_cedbg + + #endif + + #elif defined PLATFORM_LINUX + + #define _dbgdump printk + +#endif + +#endif /* CONFIG_DEBUG_RTL871X */ + + +#if defined (_dbgdump) && defined (_MODULE_DEFINE_) + + #undef RT_TRACE + #define RT_TRACE(_Comp, _Level, Fmt)\ + do {\ + if((_Comp & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) {\ + _dbgdump("%s [0x%08x,%d]", RTL871X_MODULE_NAME, (unsigned int)_Comp, _Level);\ + _dbgdump Fmt; \ + }\ + }while(0) + +#endif + + +#if defined (_dbgdump) + + #undef _func_enter_ + #define _func_enter_ \ + do { \ + if (GlobalDebugLevel >= _drv_debug_) \ + { \ + _dbgdump("\n %s : %s enters at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__);\ + } \ + } while(0) + + #undef _func_exit_ + #define _func_exit_ \ + do { \ + if (GlobalDebugLevel >= _drv_debug_) \ + { \ + _dbgdump("\n %s : %s exits at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__); \ + } \ + } while(0) + + #undef RT_PRINT_DATA + #define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) \ + if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \ + { \ + int __i; \ + u8 *ptr = (u8 *)_HexData; \ + _dbgdump("Rtl871x: "); \ + _dbgdump(_TitleString); \ + for( __i=0; __i<(int)_HexDataLen; __i++ ) \ + { \ + _dbgdump("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" "); \ + if (((__i + 1) % 16) == 0) _dbgdump("\n"); \ + } \ + _dbgdump("\n"); \ + } +#endif + + +#ifdef CONFIG_DEBUG_RTL819X + #ifdef PLATFORM_WINDOWS + + #ifdef PLATFORM_OS_XP + #define _dbgdump DbgPrint + + #elif defined PLATFORM_OS_CE + #define _dbgdump rtl871x_cedbg + + #endif + + #elif defined PLATFORM_LINUX + #define _dbgdump printk + #endif +#endif + +#ifdef PLATFORM_WINDOWS + #define DBG_871X {} + #define MSG_8192C {} + #define DBG_8192C {} + #define WRN_8192C {} + #define ERR_8192C {} +#endif + +#ifdef PLATFORM_LINUX + #define DBG_871X(x, ...) {} + #define MSG_8192C(x, ...) {} + #define DBG_8192C(x,...) {} + #define WRN_8192C(x,...) {} + #define ERR_8192C(x,...) {} +#endif + +#if defined (_dbgdump) + #undef DBG_871X + #define DBG_871X _dbgdump + + #undef MSG_8192C + #define MSG_8192C _dbgdump + + #undef DBG_8192C + #define DBG_8192C _dbgdump + + #undef WRN_8192C + #define WRN_8192C _dbgdump + + #undef ERR_8192C + #define ERR_8192C _dbgdump +#endif + + + +#ifdef CONFIG_PROC_DEBUG + + int proc_get_drv_version(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_write_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_set_write_reg(struct file *file, const char *buffer, + unsigned long count, void *data); + + int proc_get_read_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_set_read_reg(struct file *file, const char *buffer, + unsigned long count, void *data); + + + int proc_get_fwstate(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_sec_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_mlmext_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_qos_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_ht_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_rf_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_ap_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_adapter_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_trx_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + +#ifdef CONFIG_AP_MODE + + int proc_get_all_sta_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + +#endif + +#ifdef MEMORY_LEAK_DEBUG + int proc_get_malloc_cnt(char *page, char **start, + off_t offset, int count, + int *eof, void *data); +#endif + +#ifdef CONFIG_FIND_BEST_CHANNEL + int proc_get_best_channel(char *page, char **start, + off_t offset, int count, + int *eof, void *data); +#endif + + int proc_get_rx_signal(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_set_rx_signal(struct file *file, const char *buffer, + unsigned long count, void *data); + +#endif //CONFIG_PROC_DEBUG + +#endif //__RTW_DEBUG_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h b/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h new file mode 100755 index 000000000000..14450d2722f8 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h @@ -0,0 +1,145 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_EEPROM_H__ +#define __RTW_EEPROM_H__ + +#include +#include +#include + +#define RTL8712_EEPROM_ID 0x8712 +#define EEPROM_MAX_SIZE 256 +#define CLOCK_RATE 50 //100us + +//- EEPROM opcodes +#define EEPROM_READ_OPCODE 06 +#define EEPROM_WRITE_OPCODE 05 +#define EEPROM_ERASE_OPCODE 07 +#define EEPROM_EWEN_OPCODE 19 // Erase/write enable +#define EEPROM_EWDS_OPCODE 16 // Erase/write disable + +//Country codes +#define USA 0x555320 +#define EUROPE 0x1 //temp, should be provided later +#define JAPAN 0x2 //temp, should be provided later + +#ifdef CONFIG_SDIO_HCI +#define eeprom_cis0_sz 17 +#define eeprom_cis1_sz 50 +#endif + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_ALPHA 0x1 +#define EEPROM_CID_Senao 0x3 +#define EEPROM_CID_NetCore 0x5 +#define EEPROM_CID_CAMEO 0X8 +#define EEPROM_CID_SITECOM 0x9 +#define EEPROM_CID_COREGA 0xB +#define EEPROM_CID_EDIMAX_BELKIN 0xC +#define EEPROM_CID_SERCOMM_BELKIN 0xE +#define EEPROM_CID_CAMEO1 0xF +#define EEPROM_CID_WNC_COREGA 0x12 +#define EEPROM_CID_CLEVO 0x13 +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + +// +// Customer ID, note that: +// This variable is initiailzed through EEPROM or registry, +// however, its definition may be different with that in EEPROM for +// EEPROM size consideration. So, we have to perform proper translation between them. +// Besides, CustomerID of registry has precedence of that of EEPROM. +// defined below. 060703, by rcnjko. +// +typedef enum _RT_CUSTOMER_ID +{ + RT_CID_DEFAULT = 0, + RT_CID_8187_ALPHA0 = 1, + RT_CID_8187_SERCOMM_PS = 2, + RT_CID_8187_HW_LED = 3, + RT_CID_8187_NETGEAR = 4, + RT_CID_WHQL = 5, + RT_CID_819x_CAMEO = 6, + RT_CID_819x_RUNTOP = 7, + RT_CID_819x_Senao = 8, + RT_CID_TOSHIBA = 9, // Merge by Jacken, 2008/01/31. + RT_CID_819x_Netcore = 10, + RT_CID_Nettronix = 11, + RT_CID_DLINK = 12, + RT_CID_PRONET = 13, + RT_CID_COREGA = 14, + RT_CID_CHINA_MOBILE = 15, + RT_CID_819x_ALPHA = 16, + RT_CID_819x_Sitecom = 17, + RT_CID_CCX = 18, // It's set under CCX logo test and isn't demanded for CCX functions, but for test behavior like retry limit and tx report. By Bruce, 2009-02-17. + RT_CID_819x_Lenovo = 19, + RT_CID_819x_QMI = 20, + RT_CID_819x_Edimax_Belkin = 21, + RT_CID_819x_Sercomm_Belkin = 22, + RT_CID_819x_CAMEO1 = 23, + RT_CID_819x_MSI = 24, + RT_CID_819x_Acer = 25, + RT_CID_819x_AzWave_ASUS = 26, + RT_CID_819x_AzWave = 27, // For AzWave in PCIe, The ID is AzWave use and not only Asus + RT_CID_819x_HP = 28, + RT_CID_819x_WNC_COREGA = 29, + RT_CID_819x_Arcadyan_Belkin = 30, + RT_CID_819x_SAMSUNG = 31, + RT_CID_819x_CLEVO = 32, + RT_CID_819x_DELL = 33, + RT_CID_819x_PRONETS = 34, + RT_CID_819x_Edimax_ASUS = 35, + RT_CID_819x_CAMEO_NETGEAR = 36, +}RT_CUSTOMER_ID, *PRT_CUSTOMER_ID; + +struct eeprom_priv +{ + u8 bautoload_fail_flag; + //u8 bempty; + //u8 sys_config; + u8 mac_addr[6]; //PermanentAddress + //u8 config0; + u16 channel_plan; + //u8 country_string[3]; + //u8 tx_power_b[15]; + //u8 tx_power_g[15]; + //u8 tx_power_a[201]; + + u8 EepromOrEfuse; + + u8 efuse_eeprom_data[EEPROM_MAX_SIZE]; + +#ifdef CONFIG_SDIO_HCI + u8 sdio_setting; + u32 ocr; + u8 cis0[eeprom_cis0_sz]; + u8 cis1[eeprom_cis1_sz]; +#endif +}; + + +extern void eeprom_write16(_adapter *padapter, u16 reg, u16 data); +extern u16 eeprom_read16(_adapter *padapter, u16 reg); +extern void read_eeprom_content(_adapter *padapter); +extern void eeprom_read_sz(_adapter * padapter, u16 reg,u8* data, u32 sz); + +extern void read_eeprom_content_by_attrib(_adapter * padapter ); + +#endif //__RTL871X_EEPROM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_efuse.h b/drivers/net/wireless/rtl8192c/include/rtw_efuse.h new file mode 100755 index 000000000000..66be910ebc9c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_efuse.h @@ -0,0 +1,123 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_EFUSE_H__ +#define __RTW_EFUSE_H__ + +#include +#include + +#define EFUSE_ERROE_HANDLE 1 + +#define PG_STATE_HEADER 0x01 +#define PG_STATE_WORD_0 0x02 +#define PG_STATE_WORD_1 0x04 +#define PG_STATE_WORD_2 0x08 +#define PG_STATE_WORD_3 0x10 +#define PG_STATE_DATA 0x20 + +#define PG_SWBYTE_H 0x01 +#define PG_SWBYTE_L 0x02 + +#define PGPKT_DATA_SIZE 8 + +#define EFUSE_WIFI 0 +#define EFUSE_BT 1 + +enum _EFUSE_DEF_TYPE { + TYPE_EFUSE_MAX_SECTION = 0, + TYPE_EFUSE_REAL_CONTENT_LEN = 1, + TYPE_AVAILABLE_EFUSE_BYTES_BANK = 2, + TYPE_AVAILABLE_EFUSE_BYTES_TOTAL = 3, + TYPE_EFUSE_MAP_LEN = 4, + TYPE_EFUSE_PROTECT_BYTES_BANK = 5, +}; + +#define EFUSE_MAX_MAP_LEN 256 +#define EFUSE_MAX_HW_SIZE 512 +#define EFUSE_MAX_SECTION_BASE 16 + +#define EXT_HEADER(header) ((header & 0x1F ) == 0x0F) +#define ALL_WORDS_DISABLED(wde) ((wde & 0x0F) == 0x0F) +#define GET_HDR_OFFSET_2_0(header) ( (header & 0xE0) >> 5) + +#define EFUSE_REPEAT_THRESHOLD_ 3 + +//============================================= +// The following is for BT Efuse definition +//============================================= +#define EFUSE_BT_MAX_MAP_LEN 1024 +#define EFUSE_MAX_BANK 4 +#define EFUSE_MAX_BT_BANK (EFUSE_MAX_BANK-1) +//============================================= +/*--------------------------Define Parameters-------------------------------*/ +#define EFUSE_MAX_WORD_UNIT 4 + +/*------------------------------Define structure----------------------------*/ +typedef struct PG_PKT_STRUCT_A{ + u8 offset; + u8 word_en; + u8 data[8]; + u8 word_cnts; +}PGPKT_STRUCT,*PPGPKT_STRUCT; +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +extern u8 fakeEfuseBank; +extern u32 fakeEfuseUsedBytes; +extern u8 fakeEfuseContent[]; +extern u8 fakeEfuseInitMap[]; +extern u8 fakeEfuseModifiedMap[]; + +extern u32 BTEfuseUsedBytes; +extern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +extern u8 BTEfuseInitMap[]; +extern u8 BTEfuseModifiedMap[]; + +extern u32 fakeBTEfuseUsedBytes; +extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +extern u8 fakeBTEfuseInitMap[]; +extern u8 fakeBTEfuseModifiedMap[]; +/*------------------------Export global variable----------------------------*/ + +u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size); +u16 efuse_GetMaxSize(PADAPTER padapter); +u8 rtw_efuse_access(PADAPTER padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data); +u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); + +u16 Efuse_GetCurrentSize(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); +u8 Efuse_CalculateWordCnts(u8 word_en); +void ReadEFuseByte(PADAPTER Adapter, u16 _offset, u8 *pbuf, BOOLEAN bPseudoTest) ; +void EFUSE_GetEfuseDefinition(PADAPTER pAdapter, u8 efuseType, u8 type, PVOID *pOut, BOOLEAN bPseudoTest); +u8 efuse_OneByteRead(PADAPTER pAdapter, u16 addr, u8 *data, BOOLEAN bPseudoTest); +u8 efuse_OneByteWrite(PADAPTER pAdapter, u16 addr, u8 data, BOOLEAN bPseudoTest); + +void Efuse_PowerSwitch(PADAPTER pAdapter,u8 bWrite,u8 PwrState); +int Efuse_PgPacketRead(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest); +int Efuse_PgPacketWrite(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest); +void efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata); +u8 Efuse_WordEnableDataWrite(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest); + +u8 EFUSE_Read1Byte(PADAPTER pAdapter, u16 Address); +void EFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); +void EFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value); + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtw_event.h b/drivers/net/wireless/rtl8192c/include/rtw_event.h new file mode 100755 index 000000000000..dd9f097815ee --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_event.h @@ -0,0 +1,154 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_EVENT_H_ +#define _RTW_EVENT_H_ +#include +#include + +#ifndef CONFIG_RTL8711FW +#ifdef PLATFORM_LINUX +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) +#include +#else +#include +#endif +#include +#endif +#else +#include +#endif//CONFIG_RTL8711FW + + + +#ifdef CONFIG_H2CLBK +#include +#endif + +/* +Used to report a bss has been scanned + +*/ +struct survey_event { + WLAN_BSSID_EX bss; +}; + +/* +Used to report that the requested site survey has been done. + +bss_cnt indicates the number of bss that has been reported. + + +*/ +struct surveydone_event { + unsigned int bss_cnt; + +}; + +/* +Used to report the link result of joinning the given bss + + +join_res: +-1: authentication fail +-2: association fail +> 0: TID + +*/ +struct joinbss_event { + struct wlan_network network; +}; + +/* +Used to report a given STA has joinned the created BSS. +It is used in AP/Ad-HoC(M) mode. + + +*/ +struct stassoc_event { + unsigned char macaddr[6]; + unsigned char rsvd[2]; + int cam_id; + +}; + +struct stadel_event { + unsigned char macaddr[6]; + unsigned char rsvd[2]; +}; + +struct addba_event +{ + unsigned int tid; +}; + + +#ifdef CONFIG_H2CLBK +struct c2hlbk_event{ + unsigned char mac[6]; + unsigned short s0; + unsigned short s1; + unsigned int w0; + unsigned char b0; + unsigned short s2; + unsigned char b1; + unsigned int w1; +}; +#endif//CONFIG_H2CLBK + +#define GEN_EVT_CODE(event) event ## _EVT_ + + + +struct fwevent { + u32 parmsize; + void (*event_callback)(_adapter *dev, u8 *pbuf); +}; + + +#define C2HEVENT_SZ 32 + +struct event_node{ + unsigned char *node; + unsigned char evt_code; + unsigned short evt_sz; + volatile int *caller_ff_tail; + int caller_ff_sz; +}; + +struct c2hevent_queue { + volatile int head; + volatile int tail; + struct event_node nodes[C2HEVENT_SZ]; + unsigned char seq; +}; + +#define NETWORK_QUEUE_SZ 4 + +struct network_queue { + volatile int head; + volatile int tail; + WLAN_BSSID_EX networks[NETWORK_QUEUE_SZ]; +}; + + +#endif // _WLANEVENT_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ht.h b/drivers/net/wireless/rtl8192c/include/rtw_ht.h new file mode 100755 index 000000000000..239c42245440 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ht.h @@ -0,0 +1,51 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_HT_H_ +#define _RTW_HT_H_ + +#include +#include +#include "wifi.h" + +struct ht_priv +{ + u32 ht_option; + u32 ampdu_enable;//for enable Tx A-MPDU + //u8 baddbareq_issued[16]; + u32 tx_amsdu_enable;//for enable Tx A-MSDU + u32 tx_amdsu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx + u32 rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback. + + u8 bwmode;// + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + + //for processing Tx A-MPDU + u8 agg_enable_bitmap; + //u8 ADDBA_retry_count; + u8 candidate_tid_bitmap; + + struct ieee80211_ht_cap ht_cap; + +}; + +#endif //_RTL871X_HT_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_io.h b/drivers/net/wireless/rtl8192c/include/rtw_io.h new file mode 100755 index 000000000000..15065c6cbf90 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_io.h @@ -0,0 +1,535 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IO_H_ +#define _RTW_IO_H_ + +#include +#include +#include + +#ifdef PLATFORM_LINUX +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) +#include +#else +#include +#endif +#include +#include +#include +#include + +#ifdef CONFIG_USB_HCI +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) +#include +#else +#include +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) +#define rtw_usb_buffer_alloc(dev, size, mem_flags, dma) usb_alloc_coherent((dev), (size), (mem_flags), (dma)) +#define rtw_usb_buffer_free(dev, size, addr, dma) usb_free_coherent((dev), (size), (addr), (dma)) +#else +#define rtw_usb_buffer_alloc(dev, size, mem_flags, dma) usb_buffer_alloc((dev), (size), (mem_flags), (dma)) +#define rtw_usb_buffer_free(dev, size, addr, dma) usb_buffer_free((dev), (size), (addr), (dma)) +#endif + + +#endif //CONFIG_USB_HCI + +#endif //PLATFORM_LINUX + + +#define NUM_IOREQ 8 + +#ifdef PLATFORM_WINDOWS +#define MAX_PROT_SZ 64 +#endif +#ifdef PLATFORM_LINUX +#define MAX_PROT_SZ (64-16) +#endif + +#define _IOREADY 0 +#define _IO_WAIT_COMPLETE 1 +#define _IO_WAIT_RSP 2 + +// IO COMMAND TYPE +#define _IOSZ_MASK_ (0x7F) +#define _IO_WRITE_ BIT(7) +#define _IO_FIXED_ BIT(8) +#define _IO_BURST_ BIT(9) +#define _IO_BYTE_ BIT(10) +#define _IO_HW_ BIT(11) +#define _IO_WORD_ BIT(12) +#define _IO_SYNC_ BIT(13) +#define _IO_CMDMASK_ (0x1F80) + + +/* + For prompt mode accessing, caller shall free io_req + Otherwise, io_handler will free io_req +*/ + + + +// IO STATUS TYPE +#define _IO_ERR_ BIT(2) +#define _IO_SUCCESS_ BIT(1) +#define _IO_DONE_ BIT(0) + + +#define IO_RD32 (_IO_SYNC_ | _IO_WORD_) +#define IO_RD16 (_IO_SYNC_ | _IO_HW_) +#define IO_RD8 (_IO_SYNC_ | _IO_BYTE_) + +#define IO_RD32_ASYNC (_IO_WORD_) +#define IO_RD16_ASYNC (_IO_HW_) +#define IO_RD8_ASYNC (_IO_BYTE_) + +#define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_) +#define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_) +#define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_) + +#define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_) +#define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_) +#define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_) + +/* + + Only Sync. burst accessing is provided. + +*/ + +#define IO_WR_BURST(x) (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_)) +#define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_)) + + + +//below is for the intf_option bit defition... + +#define _INTF_ASYNC_ BIT(0) //support async io + +struct intf_priv; +struct intf_hdl; +struct io_queue; + +struct _io_ops { + + + uint (*_sdbus_read_bytes_to_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + uint (*_sdbus_read_blocks_to_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); + + u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); + + u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); + + + uint (*_sdbus_write_blocks_from_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + + uint (*_sdbus_write_bytes_from_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + u8 (*_cmd52r)(struct intf_priv *pintfpriv, u32 addr); + void (*_cmd52w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); + u8 (*_cmdfunc152r)(struct intf_priv *pintfpriv, u32 addr); + void (*_cmdfunc152w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); + + + void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + + void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + + void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + + void (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata); + + void (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + + void (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + + void (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + + + void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + void (*_sync_irp_protocol_rw)(struct io_queue *pio_q); + + + u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); + + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + u32 (*_write_scsi)(struct intf_hdl *pintfhdl,u32 cnt, u8 *pmem); + + + void (*_read_port_cancel)(struct intf_hdl *pintfhdl); + + void (*_write_port_cancel)(struct intf_hdl *pintfhdl); + + + + u8 (*_async_read8)(struct intf_hdl *pintfhdl, u32 addr); + + u16 (*_async_read16)(struct intf_hdl *pintfhdl, u32 addr); + + u32 (*_async_read32)(struct intf_hdl *pintfhdl, u32 addr); + + void (*_async_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + + void (*_async_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + + void (*_async_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + + + + +}; + +struct io_req { + _list list; + u32 addr; + volatile u32 val; + u32 command; + u32 status; + u8 *pbuf; + _sema sema; + +#ifdef PLATFORM_OS_CE +#ifdef CONFIG_USB_HCI + // URB handler for rtw_write_mem + USB_TRANSFER usb_transfer_write_mem; +#endif +#endif + + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt); + u8 *cnxt; + +#ifdef PLATFORM_OS_XP + PMDL pmdl; + PIRP pirp; + +#ifdef CONFIG_SDIO_HCI + PSDBUS_REQUEST_PACKET sdrp; +#endif + +#endif + + +}; + +struct intf_hdl { + +/* + u32 intf_option; + u32 bus_status; + u32 do_flush; + u8 *adapter; + u8 *intf_dev; + struct intf_priv *pintfpriv; + u8 cnt; + void (*intf_hdl_init)(u8 *priv); + void (*intf_hdl_unload)(u8 *priv); + void (*intf_hdl_open)(u8 *priv); + void (*intf_hdl_close)(u8 *priv); + struct _io_ops io_ops; + //u8 intf_status;//moved to struct intf_priv + u16 len; + u16 done_len; +*/ + _adapter *padapter; + struct dvobj_priv *pintf_dev;// pointer to &(padapter->dvobjpriv); + + struct _io_ops io_ops; + +}; + +struct reg_protocol_rd { + +#ifdef CONFIG_LITTLE_ENDIAN + + //DW1 + u32 NumOfTrans:4; + u32 Reserved1:4; + u32 Reserved2:24; + //DW2 + u32 ByteCount:7; + u32 WriteEnable:1; //0:read, 1:write + u32 FixOrContinuous:1; //0:continuous, 1: Fix + u32 BurstMode:1; + u32 Byte1Access:1; + u32 Byte2Access:1; + u32 Byte4Access:1; + u32 Reserved3:3; + u32 Reserved4:16; + //DW3 + u32 BusAddress; + //DW4 + //u32 Value; +#else + + +//DW1 + u32 Reserved1 :4; + u32 NumOfTrans :4; + + u32 Reserved2 :24; + + //DW2 + u32 WriteEnable : 1; + u32 ByteCount :7; + + + u32 Reserved3 : 3; + u32 Byte4Access : 1; + + u32 Byte2Access : 1; + u32 Byte1Access : 1; + u32 BurstMode :1 ; + u32 FixOrContinuous : 1; + + u32 Reserved4 : 16; + + //DW3 + u32 BusAddress; + + //DW4 + //u32 Value; + +#endif + +}; + + +struct reg_protocol_wt { + + +#ifdef CONFIG_LITTLE_ENDIAN + + //DW1 + u32 NumOfTrans:4; + u32 Reserved1:4; + u32 Reserved2:24; + //DW2 + u32 ByteCount:7; + u32 WriteEnable:1; //0:read, 1:write + u32 FixOrContinuous:1; //0:continuous, 1: Fix + u32 BurstMode:1; + u32 Byte1Access:1; + u32 Byte2Access:1; + u32 Byte4Access:1; + u32 Reserved3:3; + u32 Reserved4:16; + //DW3 + u32 BusAddress; + //DW4 + u32 Value; + +#else + //DW1 + u32 Reserved1 :4; + u32 NumOfTrans :4; + + u32 Reserved2 :24; + + //DW2 + u32 WriteEnable : 1; + u32 ByteCount :7; + + u32 Reserved3 : 3; + u32 Byte4Access : 1; + + u32 Byte2Access : 1; + u32 Byte1Access : 1; + u32 BurstMode :1 ; + u32 FixOrContinuous : 1; + + u32 Reserved4 : 16; + + //DW3 + u32 BusAddress; + + //DW4 + u32 Value; + +#endif + +}; + + + +/* +Below is the data structure used by _io_handler + +*/ + +struct io_queue { + _lock lock; + _list free_ioreqs; + _list pending; //The io_req list that will be served in the single protocol read/write. + _list processing; + u8 *free_ioreqs_buf; // 4-byte aligned + u8 *pallocated_free_ioreqs_buf; + struct intf_hdl intf; +}; + +struct io_priv{ + + _adapter *padapter; + + struct intf_hdl intf; + +}; + +extern uint ioreq_flush(_adapter *adapter, struct io_queue *ioqueue); +extern void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue); +extern uint sync_ioreq_flush(_adapter *adapter, struct io_queue *ioqueue); + + +extern uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue); +extern struct io_req *alloc_ioreq(struct io_queue *pio_q); + +extern uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl); +extern void unregister_intf_hdl(struct intf_hdl *pintfhdl); + +extern void rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); + +extern u8 rtw_read8(_adapter *adapter, u32 addr); +extern u16 rtw_read16(_adapter *adapter, u32 addr); +extern u32 rtw_read32(_adapter *adapter, u32 addr); +extern void rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); + +#ifdef DBG_IO +#define DBG_IO_WRITE_SNIFF_ADDR_START 0x80 //0x4c //0x4c // the starting address to sniff +#define DBG_IO_WRITE_SNIFF_ADDR_END 0x80 //0x4c+ 1 // the ending address to sniff +extern void _rtw_write8(_adapter *adapter, u32 addr, u8 val); +extern void _rtw_write16(_adapter *adapter, u32 addr, u16 val); +extern void _rtw_write32(_adapter *adapter, u32 addr, u32 val); +#define rtw_write8(adapter, addr, val) \ + do { \ + if((u32)(addr) + 1 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ + DBG_871X("DBG_IO %s:%d rtw_write8(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u8)(val)); \ + } \ + _rtw_write8((adapter), (addr), (val)); \ + } while(0) +#define rtw_write16(adapter, addr, val) \ + do { \ + if((u32)(addr) + 2 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ + DBG_871X("DBG_IO %s:%d rtw_write16(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u16)(val)); \ + } \ + _rtw_write16((adapter), (addr), (val)); \ + } while(0) +#define rtw_write32(adapter, addr, val) \ + do { \ + if((u32)(addr) + 4 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ + DBG_871X("DBG_IO %s:%d rtw_write32(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u32)(val)); \ + } \ + _rtw_write32((adapter), (addr), (val)); \ + } while(0) +#else //DBG_IO +extern void _rtw_write8(_adapter *adapter, u32 addr, u8 val); +extern void _rtw_write16(_adapter *adapter, u32 addr, u16 val); +extern void _rtw_write32(_adapter *adapter, u32 addr, u32 val); +#define rtw_write8(adapter, addr, val) _rtw_write8((adapter), (addr), (val)) +#define rtw_write16(adapter, addr, val) _rtw_write16((adapter), (addr), (val)) +#define rtw_write32(adapter, addr, val) _rtw_write32((adapter), (addr), (val)) +#endif //DBG_IO + +extern void rtw_writeN(_adapter *adapter, u32 addr, u32 length, u8 *pdata); + +extern void rtw_write8_async(_adapter *adapter, u32 addr, u8 val); +extern void rtw_write16_async(_adapter *adapter, u32 addr, u16 val); +extern void rtw_write32_async(_adapter *adapter, u32 addr, u32 val); + +extern void rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void rtw_write_scsi(_adapter *adapter, u32 cnt, u8 *pmem); + +void write_port_cancel(_adapter *adapter); +void read_port_cancel(_adapter *adapter); + +//ioreq +extern void ioreq_read8(_adapter *adapter, u32 addr, u8 *pval); +extern void ioreq_read16(_adapter *adapter, u32 addr, u16 *pval); +extern void ioreq_read32(_adapter *adapter, u32 addr, u32 *pval); +extern void ioreq_write8(_adapter *adapter, u32 addr, u8 val); +extern void ioreq_write16(_adapter *adapter, u32 addr, u16 val); +extern void ioreq_write32(_adapter *adapter, u32 addr, u32 val); + + +extern uint async_read8(_adapter *adapter, u32 addr, u8 *pbuff, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern uint async_read16(_adapter *adapter, u32 addr, u8 *pbuff, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern uint async_read32(_adapter *adapter, u32 addr, u8 *pbuff, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); + +extern void async_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void async_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); + +extern void async_write8(_adapter *adapter, u32 addr, u8 val, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern void async_write16(_adapter *adapter, u32 addr, u16 val, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern void async_write32(_adapter *adapter, u32 addr, u32 val, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); + +extern void async_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void async_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); + + +int init_io_priv(_adapter *padapter); +extern uint alloc_io_queue(_adapter *adapter); +extern void free_io_queue(_adapter *adapter); +extern void async_bus_io(struct io_queue *pio_q); +extern void bus_sync_io(struct io_queue *pio_q); +extern u32 _ioreq2rwmem(struct io_queue *pio_q); +extern void dev_power_down(_adapter * Adapter, u8 bpwrup); + + + +#define RTL_R8(reg) rtw_read8(padapter, reg) +#define RTL_R16(reg) rtw_read16(padapter, reg) +#define RTL_R32(reg) rtw_read32(padapter, reg) +#define RTL_W8(reg, val8) rtw_write8(padapter, reg, val8) +#define RTL_W16(reg, val16) rtw_write16(padapter, reg, val16) +#define RTL_W32(reg, val32) rtw_write32(padapter, reg, val32) + +/* +#define RTL_W8_ASYNC(reg, val8) rtw_write32_async(padapter, reg, val8) +#define RTL_W16_ASYNC(reg, val16) rtw_write32_async(padapter, reg, val16) +#define RTL_W32_ASYNC(reg, val32) rtw_write32_async(padapter, reg, val32) + +#define RTL_WRITE_BB(reg, val32) phy_SetUsbBBReg(padapter, reg, val32) +#define RTL_READ_BB(reg) phy_QueryUsbBBReg(padapter, reg) +*/ + +#endif //_RTL8711_IO_H_ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h new file mode 100755 index 000000000000..012e4bcd5bbd --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h @@ -0,0 +1,271 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IOCTL_H_ +#define _RTW_IOCTL_H_ + +#include +#include +#include + +#ifndef OID_802_11_CAPABILITY + #define OID_802_11_CAPABILITY 0x0d010122 +#endif + +#ifndef OID_802_11_PMKID + #define OID_802_11_PMKID 0x0d010123 +#endif + + +// For DDK-defined OIDs +#define OID_NDIS_SEG1 0x00010100 +#define OID_NDIS_SEG2 0x00010200 +#define OID_NDIS_SEG3 0x00020100 +#define OID_NDIS_SEG4 0x01010100 +#define OID_NDIS_SEG5 0x01020100 +#define OID_NDIS_SEG6 0x01020200 +#define OID_NDIS_SEG7 0xFD010100 +#define OID_NDIS_SEG8 0x0D010100 +#define OID_NDIS_SEG9 0x0D010200 +#define OID_NDIS_SEG10 0x0D020200 + +#define SZ_OID_NDIS_SEG1 23 +#define SZ_OID_NDIS_SEG2 3 +#define SZ_OID_NDIS_SEG3 6 +#define SZ_OID_NDIS_SEG4 6 +#define SZ_OID_NDIS_SEG5 4 +#define SZ_OID_NDIS_SEG6 8 +#define SZ_OID_NDIS_SEG7 7 +#define SZ_OID_NDIS_SEG8 36 +#define SZ_OID_NDIS_SEG9 24 +#define SZ_OID_NDIS_SEG10 19 + +// For Realtek-defined OIDs +#define OID_MP_SEG1 0xFF871100 +#define OID_MP_SEG2 0xFF818000 + +#define OID_MP_SEG3 0xFF818700 +#define OID_MP_SEG4 0xFF011100 + +#define DEBUG_OID(dbg, str) \ + if((!dbg)) \ + { \ + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_info_,("%s(%d): %s", __FUNCTION__, __LINE__, str)); \ + } + + +enum oid_type +{ + QUERY_OID, + SET_OID +}; + +struct oid_funs_node { + unsigned int oid_start; //the starting number for OID + unsigned int oid_end; //the ending number for OID + struct oid_obj_priv *node_array; + unsigned int array_sz; //the size of node_array + int query_counter; //count the number of query hits for this segment + int set_counter; //count the number of set hits for this segment +}; + +struct oid_par_priv +{ + void *adapter_context; + NDIS_OID oid; + void* information_buf; + unsigned long information_buf_len; + unsigned long* bytes_rw; + unsigned long* bytes_needed; + enum oid_type type_of_oid; + unsigned int dbg; +}; + +struct oid_obj_priv { + unsigned char dbg; // 0: without OID debug message 1: with OID debug message + NDIS_STATUS (*oidfuns)(struct oid_par_priv *poid_par_priv); +}; + +#ifdef CONFIG_MP_INCLUDED +static NDIS_STATUS oid_null_function(struct oid_par_priv* poid_par_priv) +{ + _func_enter_; + _func_exit_; + return NDIS_STATUS_SUCCESS; +} +#endif + +#ifdef PLATFORM_WINDOWS + +int TranslateNdisPsToRtPs(IN NDIS_802_11_POWER_MODE ndisPsMode); + +//OID Handler for Segment 1 +NDIS_STATUS oid_gen_supported_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_hardware_status_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_media_supported_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_media_in_use_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_lookahead_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_frame_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_link_speed_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_transmit_buffer_space_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_receive_buffer_space_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_transmit_block_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_receive_block_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_vendor_id_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_vendor_description_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_current_packet_filter_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_current_lookahead_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_driver_version_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_total_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_protocol_options_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_mac_options_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_media_connect_status_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_send_packets_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_vendor_driver_version_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 2 +NDIS_STATUS oid_gen_physical_medium_hdl(struct oid_par_priv* poid_par_priv); + +//OID Handler for Segment 3 +NDIS_STATUS oid_gen_xmit_ok_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_rcv_ok_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_xmit_error_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_rcv_error_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_rcv_no_buffer_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 4 +NDIS_STATUS oid_802_3_permanent_address_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_current_address_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_multicast_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_maximum_list_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_mac_options_hdl(struct oid_par_priv* poid_par_priv); + + + +//OID Handler for Segment 5 +NDIS_STATUS oid_802_3_rcv_error_alignment_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_one_collision_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_more_collisions_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 6 +NDIS_STATUS oid_802_3_xmit_deferred_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_max_collisions_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_rcv_overrun_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_underrun_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_heartbeat_failure_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_times_crs_lost_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_late_collisions_hdl(struct oid_par_priv* poid_par_priv); + + + +//OID Handler for Segment 7 +NDIS_STATUS oid_pnp_capabilities_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_set_power_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_query_power_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_add_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_remove_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_wake_up_pattern_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_enable_wake_up_hdl(struct oid_par_priv* poid_par_priv); + + + +//OID Handler for Segment 8 +NDIS_STATUS oid_802_11_bssid_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_ssid_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_infrastructure_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_add_wep_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_remove_wep_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_disassociate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_authentication_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_privacy_filter_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_bssid_list_scan_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_encryption_status_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_reload_defaults_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_add_key_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_remove_key_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_association_information_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_test_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_media_stream_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_capability_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_pmkid_hdl(struct oid_par_priv* poid_par_priv); + + + + + +//OID Handler for Segment 9 +NDIS_STATUS oid_802_11_network_types_supported_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_network_type_in_use_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_tx_power_level_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rssi_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rssi_trigger_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_fragmentation_threshold_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rts_threshold_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_number_of_antennas_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_tx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_supported_rates_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_desired_rates_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_configuration_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_power_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_bssid_list_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 10 +NDIS_STATUS oid_802_11_statistics_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment ED +NDIS_STATUS oid_rt_mh_vender_id_hdl(struct oid_par_priv* poid_par_priv); + +void Set_802_3_MULTICAST_LIST(ADAPTER *pAdapter, UCHAR *MCListbuf, ULONG MCListlen, BOOLEAN bAcceptAllMulticast); + +#endif// end of PLATFORM_WINDOWS + + +#ifdef PLATFORM_LINUX + +extern struct iw_handler_def rtw_handlers_def; + +#endif + +extern NDIS_STATUS drv_query_info( + IN _nic_hdl MiniportAdapterContext, + IN NDIS_OID Oid, + IN void * InformationBuffer, + IN u32 InformationBufferLength, + OUT u32* BytesWritten, + OUT u32* BytesNeeded + ); + +extern NDIS_STATUS drv_set_info( + IN _nic_hdl MiniportAdapterContext, + IN NDIS_OID Oid, + IN void * InformationBuffer, + IN u32 InformationBufferLength, + OUT u32* BytesRead, + OUT u32* BytesNeeded + ); + +#endif // #ifndef __INC_CEINFO_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h new file mode 100755 index 000000000000..e9ad16f172fb --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IOCTL_QUERY_H_ +#define _RTW_IOCTL_QUERY_H_ + +#include +#include + + +#ifdef PLATFORM_WINDOWS + +u8 query_802_11_capability(_adapter* padapter,u8* pucBuf,u32 * pulOutLen); +u8 query_802_11_association_information (_adapter * padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo); + +#endif + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h new file mode 100755 index 000000000000..1ea8f21b02c4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h @@ -0,0 +1,84 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IOCTL_RTL_H_ +#define _RTW_IOCTL_RTL_H_ + +#include +#include +#include + +//************** oid_rtl_seg_01_01 ************** +NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv);//84 +NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv); //8a +NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv); //8b + +NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv);//93 +NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv); + +//************** oid_rtl_seg_01_03 section start ************** +NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv); + +// oid_rtl_seg_01_11 +NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv); + +//************** oid_rtl_seg_03_00 section start ************** +NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv); + + + + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h new file mode 100755 index 000000000000..15e156ac6a17 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h @@ -0,0 +1,74 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_IOCTL_SET_H_ +#define __RTW_IOCTL_SET_H_ + +#include +#include + + +typedef u8 NDIS_802_11_PMKID_VALUE[16]; + +typedef struct _BSSIDInfo { + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_PMKID_VALUE PMKID; +} BSSIDInfo, *PBSSIDInfo; + + +#ifdef PLATFORM_OS_XP +typedef struct _NDIS_802_11_PMKID { + u32 Length; + u32 BSSIDInfoCount; + BSSIDInfo BSSIDInfo[1]; +} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID; +#endif + + +#ifdef PLATFORM_WINDOWS +u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults); +u8 rtw_set_802_11_test(_adapter * padapter, NDIS_802_11_TEST * test); +u8 rtw_set_802_11_pmkid(_adapter *pdapter, NDIS_802_11_PMKID *pmkid); + +u8 rtw_pnp_set_power_sleep(_adapter* padapter); +u8 rtw_pnp_set_power_wakeup(_adapter* padapter); + +void rtw_pnp_resume_wk(void *context); +void rtw_pnp_sleep_wk(void * context); + +#endif + +u8 rtw_set_802_11_add_key(_adapter * padapter, NDIS_802_11_KEY * key); +u8 rtw_set_802_11_authentication_mode(_adapter *pdapter, NDIS_802_11_AUTHENTICATION_MODE authmode); +u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid); +u8 rtw_set_802_11_add_wep(_adapter * padapter, NDIS_802_11_WEP * wep); +u8 rtw_set_802_11_disassociate(_adapter * padapter); +u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter); +u8 rtw_set_802_11_infrastructure_mode(_adapter * padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +u8 rtw_set_802_11_remove_wep(_adapter * padapter, u32 keyindex); +u8 rtw_set_802_11_ssid(_adapter * padapter, NDIS_802_11_SSID * ssid); +u8 rtw_set_802_11_remove_key(_adapter * padapter, NDIS_802_11_REMOVE_KEY * key); + + +u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid); + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_led.h b/drivers/net/wireless/rtl8192c/include/rtw_led.h new file mode 100755 index 000000000000..665cc4117fc3 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_led.h @@ -0,0 +1,212 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_LED_H_ +#define __RTW_LED_H_ + +#include +#include +#include + +#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000) + +typedef enum _LED_CTL_MODE{ + LED_CTL_POWER_ON = 1, + LED_CTL_LINK = 2, + LED_CTL_NO_LINK = 3, + LED_CTL_TX = 4, + LED_CTL_RX = 5, + LED_CTL_SITE_SURVEY = 6, + LED_CTL_POWER_OFF = 7, + LED_CTL_START_TO_LINK = 8, + LED_CTL_START_WPS = 9, + LED_CTL_STOP_WPS = 10, + LED_CTL_START_WPS_BOTTON = 11, //added for runtop + LED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA + LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN +}LED_CTL_MODE; + + +#ifdef CONFIG_USB_HCI +//================================================================================ +// LED object. +//================================================================================ + +typedef enum _LED_STATE_871x{ + LED_UNKNOWN = 0, + LED_ON = 1, + LED_OFF = 2, + LED_BLINK_NORMAL = 3, + LED_BLINK_SLOWLY = 4, + LED_POWER_ON_BLINK = 5, + LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. + LED_NO_LINK_BLINK = 7, // LED is blinking during no link state. + LED_BLINK_StartToBlink = 8,// Customzied for Sercomm Printer Server case + LED_BLINK_WPS = 9, // LED is blinkg during WPS communication + LED_TXRX_BLINK = 10, + LED_BLINK_WPS_STOP = 11, //for ALPHA + LED_BLINK_WPS_STOP_OVERLAP = 12, //for BELKIN +}LED_STATE_871x; + +#define IS_LED_WPS_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS \ + || ((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS_STOP \ + || ((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress) + +#define IS_LED_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress \ + ||((PLED_871x)_LED_871x)->bLedScanBlinkInProgress) + +typedef enum _LED_PIN_871x{ + LED_PIN_GPIO0, + LED_PIN_LED0, + LED_PIN_LED1 +}LED_PIN_871x; + +typedef struct _LED_871x{ + _adapter *padapter; + LED_PIN_871x LedPin; // Identify how to implement this SW led. + LED_STATE_871x CurrLedState; // Current LED state. + u8 bLedOn; // true if LED is ON, false if LED is OFF. + + u8 bSWLedCtrl; + + u8 bLedBlinkInProgress; // true if it is blinking, false o.w.. + // ALPHA, added by chiyoko, 20090106 + u8 bLedNoLinkBlinkInProgress; + u8 bLedLinkBlinkInProgress; + u8 bLedStartToLinkBlinkInProgress; + u8 bLedScanBlinkInProgress; + u8 bLedWPSBlinkInProgress; + + u32 BlinkTimes; // Number of times to toggle led state for blinking. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are. + + _timer BlinkTimer; // Timer object for led blinking. +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) + _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED. +#endif +} LED_871x, *PLED_871x; + + +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1, // 2 LEDs, through LED0 and LED1. For ALPHA. + SW_LED_MODE2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. + SW_LED_MODE3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. + SW_LED_MODE4, //for Edimax / Belkin + SW_LED_MODE5, //for Sercomm / Belkin + SW_LED_MODE6, //for 88CU minicard, porting from ce SW_LED_MODE7 + HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.) +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; +#endif //CONFIG_USB_HCI + +#ifdef CONFIG_PCI_HCI +//================================================================================ +// LED object. +//================================================================================ + +typedef enum _LED_STATE_871x{ + LED_UNKNOWN = 0, + LED_ON = 1, + LED_OFF = 2, + LED_BLINK_NORMAL = 3, + LED_BLINK_SLOWLY = 4, + LED_POWER_ON_BLINK = 5, + LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. + LED_NO_LINK_BLINK = 7, // LED is blinking during no link state. + LED_BLINK_StartToBlink = 8, + LED_BLINK_TXRX = 9, + LED_BLINK_RUNTOP = 10, // Customized for RunTop + LED_BLINK_CAMEO = 11, +}LED_STATE_871x; + +typedef enum _LED_PIN_871x{ + LED_PIN_GPIO0, + LED_PIN_LED0, + LED_PIN_LED1, + LED_PIN_LED2 +}LED_PIN_871x; + +typedef struct _LED_871x{ + _adapter *padapter; + + LED_PIN_871x LedPin; // Identify how to implement this SW led. + + LED_STATE_871x CurrLedState; // Current LED state. + u8 bLedOn; // TRUE if LED is ON, FALSE if LED is OFF. + + u8 bLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w.. + u8 bLedWPSBlinkInProgress; // TRUE if it is blinking, FALSE o.w.. + + u8 bLedSlowBlinkInProgress;//added by vivi, for led new mode + u32 BlinkTimes; // Number of times to toggle led state for blinking. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are. + + _timer BlinkTimer; // Timer object for led blinking. +} LED_871x, *PLED_871x; + + +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1, // SW control for PCI Express + SW_LED_MODE2, // SW control for Cameo. + SW_LED_MODE3, // SW contorl for RunTop. + SW_LED_MODE4, // SW control for Netcore + SW_LED_MODE5, //added by vivi, for led new mode, DLINK + SW_LED_MODE6, //added by vivi, for led new mode, PRONET + SW_LED_MODE7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec + SW_LED_MODE8, //added by chiyokolin, for QMI + SW_LED_MODE9, //added by chiyokolin, for BITLAND, PCI Express Minicard Spec Rev.1.1 + SW_LED_MODE10, //added by chiyokolin, for Edimax-ASUS + HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes) +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; + +#define LED_CM8_BLINK_INTERVAL 500 //for QMI +#endif //CONFIG_PCI_HCI + +struct led_priv{ + /* add for led controll */ + LED_871x SwLed0; + LED_871x SwLed1; + LED_STRATEGY_871x LedStrategy; + u8 bRegUseLed; + void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction); + /* add for led controll */ +}; + +#ifdef CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) \ + do { \ + if((adapter)->ledpriv.LedControlHandler) \ + (adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \ + } while(0) +#else //CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) +#endif //CONFIG_SW_LED + +#endif //__RTW_LED_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mlme.h b/drivers/net/wireless/rtl8192c/include/rtw_mlme.h new file mode 100755 index 000000000000..41a6c496a16b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mlme.h @@ -0,0 +1,573 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_MLME_H_ +#define __RTW_MLME_H_ + +#include +#include +#include +#include + + +#define MAX_BSS_CNT 64 +//#define MAX_JOIN_TIMEOUT 2000 +//#define MAX_JOIN_TIMEOUT 2500 +#define MAX_JOIN_TIMEOUT 6500 + +// Commented by Albert 20101105 +// Increase the scanning timeout because of increasing the SURVEY_TO value. + +#define SCANNING_TIMEOUT 8000 + +#define SCAN_INTERVAL (30) // unit:2sec, 30*2=60sec + +#ifdef PALTFORM_OS_WINCE +#define SCANQUEUE_LIFETIME 12000000 // unit:us +#else +#define SCANQUEUE_LIFETIME 20 // unit:sec +#endif + +#define WIFI_NULL_STATE 0x00000000 +#define WIFI_ASOC_STATE 0x00000001 // Under Linked state... +#define WIFI_REASOC_STATE 0x00000002 +#define WIFI_SLEEP_STATE 0x00000004 +#define WIFI_STATION_STATE 0x00000008 +#define WIFI_AP_STATE 0x00000010 +#define WIFI_ADHOC_STATE 0x00000020 +#define WIFI_ADHOC_MASTER_STATE 0x00000040 +#define WIFI_UNDER_LINKING 0x00000080 +//#define WIFI_UNDER_CMD 0x00000200 +// ========== P2P Section Start =============== +#define WIFI_P2P_LISTEN_STATE 0x00010000 +#define WIFI_P2P_GROUP_FORMATION_STATE 0x00020000 +// ========== P2P Section End =============== +#define WIFI_SITE_MONITOR 0x00000800 //to indicate the station is under site surveying + +#ifdef WDS +#define WIFI_WDS 0x00001000 +#define WIFI_WDS_RX_BEACON 0x00002000 // already rx WDS AP beacon +#endif +#ifdef AUTO_CONFIG +#define WIFI_AUTOCONF 0x00004000 +#define WIFI_AUTOCONF_IND 0x00008000 +#endif + +//#ifdef UNDER_MPTEST +#define WIFI_MP_STATE 0x00010000 +#define WIFI_MP_CTX_BACKGROUND 0x00020000 // in continous tx background +#define WIFI_MP_CTX_ST 0x00040000 // in continous tx with single-tone +#define WIFI_MP_CTX_BACKGROUND_PENDING 0x00080000 // pending in continous tx background due to out of skb +#define WIFI_MP_CTX_CCK_HW 0x00100000 // in continous tx +#define WIFI_MP_CTX_CCK_CS 0x00200000 // in continous tx with carrier suppression +#define WIFI_MP_LPBK_STATE 0x00400000 +//#endif + +//#define _FW_UNDER_CMD WIFI_UNDER_CMD +#define _FW_UNDER_LINKING WIFI_UNDER_LINKING +#define _FW_LINKED WIFI_ASOC_STATE +#define _FW_UNDER_SURVEY WIFI_SITE_MONITOR + +enum dot11AuthAlgrthmNum { + dot11AuthAlgrthm_Open = 0, + dot11AuthAlgrthm_Shared, + dot11AuthAlgrthm_8021X, + dot11AuthAlgrthm_Auto, + dot11AuthAlgrthm_MaxNum +}; + +// Scan type including active and passive scan. +typedef enum _RT_SCAN_TYPE +{ + SCAN_PASSIVE, + SCAN_ACTIVE, + SCAN_MIX, +}RT_SCAN_TYPE, *PRT_SCAN_TYPE; + +/* + +there are several "locks" in mlme_priv, +since mlme_priv is a shared resource between many threads, +like ISR/Call-Back functions, the OID handlers, and even timer functions. + + +Each _queue has its own locks, already. +Other items are protected by mlme_priv.lock. + +To avoid possible dead lock, any thread trying to modifiying mlme_priv +SHALL not lock up more than one locks at a time! + +*/ + + +#define traffic_threshold 10 +#define traffic_scan_period 500 + +struct sitesurvey_ctrl { + u64 last_tx_pkts; + uint last_rx_pkts; + sint traffic_busy; + _timer sitesurvey_ctrl_timer; +}; + +typedef struct _RT_LINK_DETECT_T{ + u32 NumTxOkInPeriod; + u32 NumRxOkInPeriod; + u32 NumRxUnicastOkInPeriod; + BOOLEAN bBusyTraffic; + BOOLEAN bTxBusyTraffic; + BOOLEAN bRxBusyTraffic; + BOOLEAN bHigherBusyTraffic; // For interrupt migration purpose. + BOOLEAN bHigherBusyRxTraffic; // We may disable Tx interrupt according as Rx traffic. +}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T; + +struct profile_info { + u8 ssidlen; + u8 ssid[ WLAN_SSID_MAXLEN ]; + u8 peermac[ ETH_ALEN ]; +}; + +struct tx_invite_req_info{ + u8 token; + u8 ssid[ WLAN_SSID_MAXLEN ]; + u8 ssidlen; + u8 peer_operation_ch; +}; + +struct tx_invite_resp_info{ + u8 token; // Used to record the dialog token of p2p invitation request frame. +}; + +struct tx_provdisc_req_info{ + u16 wps_config_method_request; // Used when sending the provisioning request frame + u16 peer_channel_num[2]; // The channel number which the receiver stands. + NDIS_802_11_SSID ssid; + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 peerIFAddr[ ETH_ALEN ]; // Peer interface address + u8 benable; // This provision discovery request frame is trigger to send or not +}; + +struct rx_provdisc_req_info{ //When peer device issue prov_disc_req first, we should store the following informations + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 strconfig_method_desc_of_prov_disc_req[4]; // description for the config method located in the provisioning discovery request frame. + // The UI must know this information to know which config method the remote p2p device is requiring. +}; + +struct tx_nego_req_info{ + u16 peer_channel_num[2]; // The channel number which the receiver stands. + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 benable; // This negoitation request frame is trigger to send or not +}; + +struct wifidirect_info{ + _adapter* padapter; + _timer find_phase_timer; + _timer restore_p2p_state_timer; + + // Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer. + _timer pre_tx_scan_timer; + struct tx_provdisc_req_info tx_prov_disc_info; + struct rx_provdisc_req_info rx_prov_disc_info; + struct tx_invite_req_info invitereq_info; + struct profile_info profileinfo[ P2P_MAX_PERSISTENT_GROUP_NUM ]; // Store the profile information of persistent group + struct tx_invite_resp_info inviteresp_info; + struct tx_nego_req_info nego_req_info; + enum P2P_ROLE role; + enum P2P_STATE pre_p2p_state; + enum P2P_STATE p2p_state; + u8 device_addr[ETH_ALEN]; // The device address should be the mac address of this device. + u8 interface_addr[ETH_ALEN]; + u8 social_chan[4]; + u8 listen_channel; + u8 operating_channel; + u8 listen_dwell; // This value should be between 1 and 3 + u8 support_rate[8]; + u8 p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN]; + u8 intent; // should only include the intent value. + u8 p2p_peer_interface_addr[ ETH_ALEN ]; + u8 peer_intent; // Included the intent value and tie breaker value. + u8 device_name[ WPS_MAX_DEVICE_NAME_LEN ]; // Device name for displaying on searching device screen + u8 device_name_len; + u8 profileindex; // Used to point to the index of profileinfo array + u8 peer_operating_ch; + u8 find_phase_state_exchange_cnt; + u16 device_password_id_for_nego; // The device password ID for group negotation + u8 negotiation_dialog_token; + u8 nego_ssid[ WLAN_SSID_MAXLEN ]; // SSID information for group negotitation + u8 nego_ssidlen; + u8 p2p_group_ssid[WLAN_SSID_MAXLEN]; + u8 p2p_group_ssid_len; + + enum P2P_WPSINFO ui_got_wps_info; // This field will store the WPS value (PIN value or PBC) that UI had got from the user. + u16 supported_wps_cm; // This field describes the WPS config method which this driver supported. + // The value should be the combination of config method defined in page104 of WPS v2.0 spec. + u8 channel_cnt; // This field is the count number for P2P Channel List attribute of group negotitation response frame. + u8 channel_list[13]; // This field will contain the channel number of P2P Channel List attribute of group negotitation response frame. + // We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. + u8 p2p_ps_enable; + enum P2P_PS p2p_ps; // indicate p2p ps state + u8 noa_index; // Identifies and instance of Notice of Absence timing. + u8 ctwindow; // Client traffic window. A period of time in TU after TBTT. + u8 opp_ps; // opportunistic power save. + u8 noa_num; // number of NoA descriptor in P2P IE. + u8 noa_count[P2P_MAX_NOA_NUM]; // Count for owner, Type of client. + u32 noa_duration[P2P_MAX_NOA_NUM]; // Max duration for owner, preferred or min acceptable duration for client. + u32 noa_interval[P2P_MAX_NOA_NUM]; // Length of interval for owner, preferred or max acceptable interval of client. + u32 noa_start_time[P2P_MAX_NOA_NUM]; // schedule expressed in terms of the lower 4 bytes of the TSF timer. +}; + + +struct mlme_priv { + + _lock lock; + sint fw_state; //shall we protect this variable? maybe not necessarily... + + u8 to_join; //flag + #ifdef CONFIG_LAYER2_ROAMING + u8 to_roaming; // roaming trying times + #endif + + u8 *nic_hdl; + + _list *pscanned; + _queue free_bss_pool; + _queue scanned_queue; + u8 *free_bss_buf; + u32 num_of_scanned; + + NDIS_802_11_SSID assoc_ssid; + u8 assoc_bssid[6]; + + struct wlan_network cur_network; + + //uint wireless_mode; no used, remove it + + u32 scan_interval; + + _timer assoc_timer; + + uint assoc_by_bssid; + + _timer scan_to_timer; // driver itself handles scan_timeout status. + u32 scan_start_time; // used to evaluate the time spent in scanning + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + _timer set_scan_deny_timer; + ATOMIC_T set_scan_deny; //0: allowed, 1: deny + #endif + + struct qos_priv qospriv; + +#ifdef CONFIG_80211N_HT + + /* Number of non-HT AP/stations */ + int num_sta_no_ht; + + /* Number of HT AP/stations 20 MHz */ + //int num_sta_ht_20mhz; + + + int num_FortyMHzIntolerant; + + struct ht_priv htpriv; + +#endif + + RT_LINK_DETECT_T LinkDetectInfo; + _timer dynamic_chk_timer; //dynamic/periodic check timer + + u8 key_mask; //use for ips to set wep key after ips_leave + u8 ChannelPlan; + u8 scan_mode; // active: 1, passive: 0 + + + u8 probereq_wpsie[MAX_WPS_IE_LEN];//added in probe req + int probereq_wpsie_len; + +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + /* Number of associated Non-ERP stations (i.e., stations using 802.11b + * in 802.11g BSS) */ + int num_sta_non_erp; + + /* Number of associated stations that do not support Short Slot Time */ + int num_sta_no_short_slot_time; + + /* Number of associated stations that do not support Short Preamble */ + int num_sta_no_short_preamble; + + int olbc; /* Overlapping Legacy BSS Condition */ + + /* Number of HT associated stations that do not support greenfield */ + int num_sta_ht_no_gf; + + /* Number of associated non-HT stations */ + //int num_sta_no_ht; + + /* Number of HT associated stations 20 MHz */ + int num_sta_ht_20mhz; + + /* Overlapping BSS information */ + int olbc_ht; + +#ifdef CONFIG_80211N_HT + u16 ht_op_mode; +#endif /* CONFIG_80211N_HT */ + + u8 *wps_beacon_ie; + u8 *wps_probe_resp_ie; + u8 *wps_assoc_resp_ie; + u32 wps_beacon_ie_len; + u32 wps_probe_resp_ie_len; + u32 wps_assoc_resp_ie_len; + + + _lock bcn_update_lock; + u8 update_bcn; + + +#endif + +#ifdef RTK_DMP_PLATFORM + // DMP kobject_hotplug function signal need in passive level + _workitem Linkup_workitem; + _workitem Linkdown_workitem; +#endif + +}; + +#ifdef CONFIG_AP_MODE + +struct hostapd_priv +{ + _adapter *padapter; + +#ifdef CONFIG_HOSTAPD_MLME + struct net_device *pmgnt_netdev; + struct usb_anchor anchored; +#endif + +}; + +extern int hostapd_mode_init(_adapter *padapter); +extern void hostapd_mode_unload(_adapter *padapter); +#endif + +extern void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf); + +#ifdef PLATFORM_WINDOWS +extern thread_return event_thread(void *context); + +extern void rtw_join_timeout_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +extern void _rtw_scan_timeout_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +#endif + +#ifdef PLATFORM_LINUX +extern int event_thread(void *context); +extern void rtw_join_timeout_handler(void* FunctionContext); +extern void _rtw_scan_timeout_handler(void* FunctionContext); +#endif + +extern void rtw_free_network_queue(_adapter *adapter,u8 isfreeall); +extern int rtw_init_mlme_priv(_adapter *adapter);// (struct mlme_priv *pmlmepriv); + +extern void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv); + + +extern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv); +extern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx); +extern sint rtw_set_auth(_adapter *adapter,struct security_priv *psecuritypriv); + +__inline static u8 *get_bssid(struct mlme_priv *pmlmepriv) +{ //if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid + // if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address + return pmlmepriv->cur_network.network.MacAddress; +} + +__inline static sint check_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + if (pmlmepriv->fw_state & state) + return _TRUE; + + return _FALSE; +} + +__inline static sint get_fwstate(struct mlme_priv *pmlmepriv) +{ + return pmlmepriv->fw_state; +} + +/* + * No Limit on the calling context, + * therefore set it to be the critical section... + * + * ### NOTE:#### (!!!!) + * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock + */ +__inline static void set_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + pmlmepriv->fw_state |= state; +} + +__inline static void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state) +{ + pmlmepriv->fw_state &= ~state; +} + +/* + * No Limit on the calling context, + * therefore set it to be the critical section... + */ +__inline static void clr_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + if (check_fwstate(pmlmepriv, state) == _TRUE) + pmlmepriv->fw_state ^= state; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void clr_fwstate_ex(struct mlme_priv *pmlmepriv, sint state) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _clr_fwstate_(pmlmepriv, state); + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void up_scanned_network(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned++; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void down_scanned_network(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned--; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void set_scanned_network_val(struct mlme_priv *pmlmepriv, sint val) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned = val; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +extern u16 rtw_get_capability(WLAN_BSSID_EX *bss); +extern void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target); +extern void rtw_disconnect_hdl_under_linked(_adapter* adapter, struct sta_info *psta, u8 free_assoc); +extern void rtw_generate_random_ibss(u8 *pibss); +extern struct wlan_network* rtw_find_network(_queue *scanned_queue, u8 *addr); +extern struct wlan_network* rtw_get_oldest_wlan_network(_queue *scanned_queue); + +extern void rtw_free_assoc_resources(_adapter* adapter); +extern void rtw_indicate_disconnect(_adapter* adapter); +extern void rtw_indicate_connect(_adapter* adapter); + +extern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len); +extern int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len); +extern void rtw_init_registrypriv_dev_network(_adapter *adapter); + +extern void rtw_update_registrypriv_dev_network(_adapter *adapter); + +extern void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter); + +extern void _rtw_join_timeout_handler(_adapter *adapter); +extern void rtw_scan_timeout_handler(_adapter *adapter); + +extern void rtw_dynamic_check_timer_handlder(_adapter *adapter); +#ifdef CONFIG_SET_SCAN_DENY_TIMER +extern void rtw_set_scan_deny_timer_hdl(_adapter *adapter); +void rtw_set_scan_deny(struct mlme_priv *mlmepriv, u32 ms); +#endif + + +extern int _rtw_init_mlme_priv(_adapter *padapter); + +extern void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv); + +extern int _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork); + +extern struct wlan_network* _rtw_dequeue_network(_queue *queue); + +extern struct wlan_network* _rtw_alloc_network(struct mlme_priv *pmlmepriv); + + +extern void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall); +extern void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork); + + +extern struct wlan_network* _rtw_find_network(_queue *scanned_queue, u8 *addr); + +extern void _rtw_free_network_queue(_adapter* padapter, u8 isfreeall); + +extern sint rtw_if_up(_adapter *padapter); + + +u8 *rtw_get_capability_from_ie(u8 *ie); +u8 *rtw_get_timestampe_from_ie(u8 *ie); +u8 *rtw_get_beacon_interval_from_ie(u8 *ie); + + +void rtw_joinbss_reset(_adapter *padapter); + +#ifdef CONFIG_80211N_HT +unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len); +void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len); +void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif + +int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork); + +#ifdef CONFIG_LAYER2_ROAMING +void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); +void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); +#endif + +#endif //__RTL871X_MLME_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h b/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h new file mode 100755 index 000000000000..d8d3c52cc8a4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h @@ -0,0 +1,759 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_MLME_EXT_H_ +#define __RTW_MLME_EXT_H_ + +#include +#include +#include +#include + + +// Commented by Albert 20101105 +// Increase the SURVEY_TO value from 100 to 150 ( 100ms to 150ms ) +// The Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request. +// So, this driver tried to extend the dwell time for each scanning channel. +// This will increase the chance to receive the probe response from SoftAP. + +#define SURVEY_TO (100) +#define REAUTH_TO (300) //(50) +#define REASSOC_TO (300) //(50) +//#define DISCONNECT_TO (3000) +#define ADDBA_TO (2000) + +#define LINKED_TO (1) //unit:2 sec, 1x2=2 sec + +#define REAUTH_LIMIT (2) +#define REASSOC_LIMIT (2) +#define READDBA_LIMIT (2) + +//#define IOCMD_REG0 0x10250370 +//#define IOCMD_REG1 0x10250374 +//#define IOCMD_REG2 0x10250378 + +//#define FW_DYNAMIC_FUN_SWITCH 0x10250364 + +//#define WRITE_BB_CMD 0xF0000001 +//#define SET_CHANNEL_CMD 0xF3000000 +//#define UPDATE_RA_CMD 0xFD0000A2 + +#define DYNAMIC_FUNC_DISABLE (0x0) +#define DYNAMIC_FUNC_DIG BIT(0) +#define DYNAMIC_FUNC_HP BIT(1) +#define DYNAMIC_FUNC_SS BIT(2) //Tx Power Tracking +#define DYNAMIC_FUNC_BT BIT(3) +#define DYNAMIC_FUNC_ANT_DIV BIT(4) + +#define _HW_STATE_NOLINK_ 0x00 +#define _HW_STATE_ADHOC_ 0x01 +#define _HW_STATE_STATION_ 0x02 +#define _HW_STATE_AP_ 0x03 + + +#define _1M_RATE_ 0 +#define _2M_RATE_ 1 +#define _5M_RATE_ 2 +#define _11M_RATE_ 3 +#define _6M_RATE_ 4 +#define _9M_RATE_ 5 +#define _12M_RATE_ 6 +#define _18M_RATE_ 7 +#define _24M_RATE_ 8 +#define _36M_RATE_ 9 +#define _48M_RATE_ 10 +#define _54M_RATE_ 11 + + +// +// Channel Plan Type. +// Note: +// We just add new channel plan when the new channel plan is different from any of the following +// channel plan. +// If you just wnat to customize the acitions(scan period or join actions) about one of the channel plan, +// customize them in RT_CHANNEL_INFO in the RT_CHANNEL_LIST. +// +typedef enum _RT_CHANNEL_DOMAIN +{ + RT_CHANNEL_DOMAIN_FCC = 0, + RT_CHANNEL_DOMAIN_IC = 1, + RT_CHANNEL_DOMAIN_ETSI = 2, + RT_CHANNEL_DOMAIN_SPAIN = 3, + RT_CHANNEL_DOMAIN_FRANCE = 4, + RT_CHANNEL_DOMAIN_MKK = 5, + RT_CHANNEL_DOMAIN_MKK1 = 6, + RT_CHANNEL_DOMAIN_ISRAEL = 7, + RT_CHANNEL_DOMAIN_TELEC = 8, +#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ + RT_CHANNEL_DOMAIN_MIC = 9, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 10, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 11, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_TELEC_NETGEAR = 12, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_NCC = 13, +#endif /* Not using EEPROM_CHANNEL_PLAN directly */ + RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 0x09, + RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 0x0A, + RT_CHANNEL_DOMAIN_NCC = 0x0B, + RT_CHANNEL_DOMAIN_CHINA = 0x0C, + RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO = 0x0D, + RT_CHANNEL_DOMAIN_KOREA = 0x0E, + RT_CHANNEL_DOMAIN_TURKEY = 0x0F, + RT_CHANNEL_DOMAIN_JAPAN = 0x10, + RT_CHANNEL_DOMAIN_FCC_NO_DFS = 0x11, + RT_CHANNEL_DOMAIN_JAPAN_NO_DFS = 0x12, + //===== Add new channel plan above this line===============// + RT_CHANNEL_DOMAIN_MAX, +}RT_CHANNEL_DOMAIN, *PRT_CHANNEL_DOMAIN; + +// +// We now define the following channels as the max channels in each channel plan. +// 2G, total 14 chnls +// {1,2,3,4,5,6,7,8,9,10,11,12,13,14} +// 5G, total 24 chnls +// {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165} +#define MAX_CHANNEL_NUM 38//14+24 +#define MAX_SCAN_CHANNEL_NUM 54 + +typedef struct _RT_CHANNEL_PLAN +{ + unsigned char Channel[MAX_CHANNEL_NUM]; + unsigned char Len; +}RT_CHANNEL_PLAN, *PRT_CHANNEL_PLAN; + +enum Associated_AP +{ + atherosAP = 0, + broadcomAP = 1, + ciscoAP = 2, + marvellAP = 3, + ralinkAP = 4, + realtekAP = 5, + airgocapAP = 6, + unknownAP = 7, + maxAP, +}; + +enum SCAN_STATE +{ + SCAN_DISABLE = 0, + SCAN_START = 1, + SCAN_TXNULL = 2, + SCAN_PROCESS = 3, + SCAN_COMPLETE = 4, + SCAN_STATE_MAX, +}; + +struct mlme_handler { + unsigned int num; + char* str; + unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame); +}; + +struct action_handler { + unsigned int num; + char* str; + unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame); +}; + +struct ss_res +{ + int state; + int bss_cnt; + int channel_idx; + int scan_mode; + int ss_ssidlen; + unsigned char ss_ssid[IW_ESSID_MAX_SIZE + 1]; +}; + +//#define AP_MODE 0x0C +//#define STATION_MODE 0x08 +//#define AD_HOC_MODE 0x04 +//#define NO_LINK_MODE 0x00 + +#define WIFI_FW_NULL_STATE _HW_STATE_NOLINK_ +#define WIFI_FW_STATION_STATE _HW_STATE_STATION_ +#define WIFI_FW_AP_STATE _HW_STATE_AP_ +#define WIFI_FW_ADHOC_STATE _HW_STATE_ADHOC_ + +#define WIFI_FW_AUTH_NULL 0x00000100 +#define WIFI_FW_AUTH_STATE 0x00000200 +#define WIFI_FW_AUTH_SUCCESS 0x00000400 + +#define WIFI_FW_ASSOC_STATE 0x00002000 +#define WIFI_FW_ASSOC_SUCCESS 0x00004000 + +#define WIFI_FW_LINKING_STATE (WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE | WIFI_FW_AUTH_SUCCESS |WIFI_FW_ASSOC_STATE) + +#ifdef CONFIG_TDLS +/* TDLS STA state */ +#define UN_TDLS_STATE 0x00000000 //default state +#define TDLS_INITIATOR_STATE 0x10000000 +#define TDLS_RESPONDER_STATE 0x20000000 +#define TDLS_LINKED_STATE 0x40000000 +#define TDLS_CH_SWITCH_ON_STATE 0x01000000 +#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch +#define TDLS_AT_OFF_CH_STATE 0x04000000 +#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. +#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch +#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping +#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing +#define TPK_RESEND_COUNT 301 +#define CH_SWITCH_TIME 10 +#define CH_SWITCH_TIMEOUT 30 +#endif + +struct FW_Sta_Info +{ + struct sta_info *psta; + u32 status; + u32 rx_pkt; + u32 retry; + NDIS_802_11_RATES_EX SupportedRates; +}; + +struct mlme_ext_info +{ + u32 state; + u32 reauth_count; + u32 reassoc_count; + u32 link_count; + u32 auth_seq; + u32 auth_algo; // 802.11 auth, could be open, shared, auto + u32 authModeToggle; + u32 enc_algo;//encrypt algorithm; + u32 key_index; // this is only valid for legendary wep, 0~3 for key id. + u32 iv; + u8 chg_txt[128]; + u16 aid; + u16 bcn_interval; + u16 capability; + u8 assoc_AP_vendor; + u8 slotTime; + u8 preamble_mode; + u8 WMM_enable; + u8 ERP_enable; + u8 ERP_IE; + u8 HT_enable; + u8 HT_caps_enable; + u8 HT_info_enable; + u8 HT_protection; + u8 turboMode_cts2self; + u8 turboMode_rtsen; + u8 SM_PS; + u8 agg_enable_bitmap; + u8 ADDBA_retry_count; + u8 candidate_tid_bitmap; + u8 dialogToken; + // Accept ADDBA Request + BOOLEAN bAcceptAddbaReq; + u8 bwmode_updated; + +#ifdef CONFIG_TDLS + uint tdls_setup_state; + u8 tdls_sta_cnt; + u8 tdls_dis_req; + u8 tdls_cam_entry_to_write; //cam entry that is empty to write + u8 tdls_cam_entry_to_clear; //cam entry that is trying to clear, using in direct link teardown + u8 tdls_ch_sensing; + u8 tdls_cur_channel; + u8 tdls_candidate_ch; + u8 tdls_collect_pkt_num[14]; +#endif + + struct ADDBA_request ADDBA_req; + struct WMM_para_element WMM_param; + struct HT_caps_element HT_caps; + struct HT_info_element HT_info; + WLAN_BSSID_EX network;//join network or bss_network, if in ap mode, it is the same to cur_network.network + struct FW_Sta_Info FW_sta_info[NUM_STA]; +}; + +// The channel information about this channel including joining, scanning, and power constraints. +typedef struct _RT_CHANNEL_INFO +{ + u8 ChannelNum; // The channel number. + RT_SCAN_TYPE ScanType; // Scan type such as passive or active scan. + //u16 ScanPeriod; // Listen time in millisecond in this channel. + //s32 MaxTxPwrDbm; // Max allowed tx power. + //u32 ExInfo; // Extended Information for this channel. +#ifdef CONFIG_FIND_BEST_CHANNEL + u32 rx_count; +#endif +}RT_CHANNEL_INFO, *PRT_CHANNEL_INFO; + +struct mlme_ext_priv +{ + _adapter *padapter; + u8 mlmeext_init; + ATOMIC_T event_seq; + u16 mgnt_seq; + + //struct fw_priv fwpriv; + + unsigned char cur_channel; + unsigned char cur_bwmode; + unsigned char cur_ch_offset;//PRIME_CHNL_OFFSET + unsigned char cur_wireless_mode; + //unsigned char channel_set[NUM_CHANNELS]; + unsigned char max_chan_nums; + RT_CHANNEL_INFO channel_set[MAX_CHANNEL_NUM]; + unsigned char basicrate[NumRates]; + unsigned char datarate[NumRates]; + + struct ss_res sitesurvey_res; + struct mlme_ext_info mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info. + //for ap mode, network includes ap's cap_info + _timer survey_timer; + _timer link_timer; + //_timer ADDBA_timer; + u16 chan_scan_time; + + u32 linked_to;//linked timeout + u32 retry; //retry for issue probereq + + u64 TSFValue; + +#ifdef CONFIG_TDLS + _workitem TDLS_restore_workitem; +#endif + +#ifdef CONFIG_AP_MODE + unsigned char bstart_bss; +#endif + +}; + +int init_mlme_ext_priv(_adapter* padapter); +int init_hw_mlme_ext(_adapter *padapter); +void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext); +extern void init_mlme_ext_timer(_adapter *padapter); +extern void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta); + +extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv); + +//void fill_fwpriv(_adapter * padapter, struct fw_priv *pfwpriv); + +unsigned char networktype_to_raid(unsigned char network_type); +int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen); +void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len); + +void Save_DM_Func_Flag(_adapter *padapter); +void Restore_DM_Func_Flag(_adapter *padapter); +void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable); + +void Set_NETYPE1_MSR(_adapter *padapter, u8 type); +void Set_NETYPE0_MSR(_adapter *padapter, u8 type); + +void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode); +void SelectChannel(_adapter *padapter, unsigned char channel); +void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset); + +unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval); + +void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key); +void clear_cam_entry(_adapter *padapter, u8 entry); + +void invalidate_cam_all(_adapter *padapter); +void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex); + + +int allocate_fw_sta_entry(_adapter *padapter); +void flush_all_cam_entry(_adapter *padapter); + +BOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel); + +void site_survey(_adapter *padapter); +u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid); + +int get_bsstype(unsigned short capability); +u8* get_my_bssid(WLAN_BSSID_EX *pnetwork); +u16 get_beacon_interval(WLAN_BSSID_EX *bss); + +int is_client_associated_to_ap(_adapter *padapter); +int is_client_associated_to_ibss(_adapter *padapter); +int is_IBSS_empty(_adapter *padapter); + +unsigned char check_assoc_AP(u8 *pframe, uint len); + +int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void WMMOnAssocRsp(_adapter *padapter); + +void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void HTOnAssocRsp(_adapter *padapter); + +void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void VCS_update(_adapter *padapter, struct sta_info *psta); + +void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta); + +void update_IOT_info(_adapter *padapter); +void update_capinfo(PADAPTER Adapter, u16 updateCap); +void update_wireless_mode(_adapter * padapter); +void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id); +int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx); + +unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz); +unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz); +unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps); +void Update_RA_Entry(_adapter *padapter, u32 mac_id); +void set_sta_rate(_adapter *padapter, struct sta_info *psta); + +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason); + +unsigned char get_highest_rate_idx(u32 mask); +int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps); +unsigned int is_ap_in_tkip(_adapter *padapter); + + +void report_join_res(_adapter *padapter, int res); +void report_survey_event(_adapter *padapter, union recv_frame *precv_frame); +void report_surveydone_event(_adapter *padapter); +void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason); +void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx); + +void beacon_timing_control(_adapter *padapter); +extern u8 set_tx_beacon_cmd(_adapter*padapter); +unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame); +void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib); +void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe); + +#ifdef CONFIG_P2P +void issue_probersp_p2p(_adapter *padapter, unsigned char *da); +void issue_p2p_provision_request( _adapter *padapter, u8* pinterface_raddr, u8* pssid, u8 ussidlen, u8* pdev_raddr); +void issue_p2p_GO_request(_adapter *padapter, u8* raddr); +void issue_probereq_p2p(_adapter *padapter); +void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success); +void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ); +#endif //CONFIG_P2P +#ifdef CONFIG_TDLS +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode); +extern void TDLS_restore_workitem_callback(struct work_struct *work); +void init_TPK_timer(_adapter *padapter, struct sta_info *psta); +extern void TDLS_option_workitem_callback(struct work_struct *work); +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta); +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta); +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta); +extern void base_channel_workitem_callback(struct work_struct *work); +extern void off_channel_workitem_callback(struct work_struct *work); +void issue_tdls_dis_req(_adapter *padapter); +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame); +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr); +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); +#endif +void issue_beacon(_adapter *padapter); +void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq); +void issue_assocreq(_adapter *padapter); +void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type); +void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status); +// Added by Albert 2010/07/26 +// blnbc: 1 -> broadcast probe request +// blnbc: 0 -> unicast probe request. The address 1 will be the BSSID. +void issue_probereq(_adapter *padapter, u8 blnbc); +void issue_nulldata(_adapter *padapter, unsigned int power_mode); +void issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid); +void issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason); +void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status); +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr); +unsigned int send_beacon(_adapter *padapter); + +void start_clnt_assoc(_adapter *padapter); +void start_clnt_auth(_adapter* padapter); +void start_clnt_join(_adapter* padapter); +void start_create_ibss(_adapter* padapter); + +unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame); +unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame); + +unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame); + + +void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res); +void mlmeext_sta_del_event_callback(_adapter *padapter); +void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta); + +void linked_status_chk(_adapter *padapter); + +void survey_timer_hdl (_adapter *padapter); +void link_timer_hdl (_adapter *padapter); +void addba_timer_hdl(struct sta_info *psta); +//void reauth_timer_hdl(_adapter *padapter); +//void reassoc_timer_hdl(_adapter *padapter); + +#define set_survey_timer(mlmeext, ms) \ + do { \ + /*DBG_871X("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ + _set_timer(&(mlmeext)->survey_timer, (ms)); \ + } while(0) + +#define set_link_timer(mlmeext, ms) \ + do { \ + /*DBG_871X("%s set_link_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ + _set_timer(&(mlmeext)->link_timer, (ms)); \ + } while(0) + +extern int cckrates_included(unsigned char *rate, int ratelen); +extern int cckratesonly_included(unsigned char *rate, int ratelen); + +extern void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr); + +extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len); +extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext); + +#ifdef CONFIG_AP_MODE +void init_mlme_ap_info(_adapter *padapter); +void free_mlme_ap_info(_adapter *padapter); +//void update_BCNTIM(_adapter *padapter); +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); +void expire_timeout_chk(_adapter *padapter); +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); +void start_bss_network(_adapter *padapter, u8 *pbuf); +#ifdef CONFIG_NATIVEAP_MLME +void bss_cap_update(_adapter *padapter, struct sta_info *psta); +void sta_info_update(_adapter *padapter, struct sta_info *psta); +void ap_free_sta(_adapter *padapter, struct sta_info *psta); +int rtw_sta_flush(_adapter *padapter); +void start_ap_mode(_adapter *padapter); +void stop_ap_mode(_adapter *padapter); +#endif +#endif //end of CONFIG_AP_MODE + +struct cmd_hdl { + uint parmsize; + u8 (*h2cfuns)(struct _ADAPTER *padapter, u8 *pbuf); +}; + + +u8 read_macreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_macreg_hdl(_adapter *padapter, u8 *pbuf); +u8 read_bbreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_bbreg_hdl(_adapter *padapter, u8 *pbuf); +u8 read_rfreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_rfreg_hdl(_adapter *padapter, u8 *pbuf); + + +u8 NULL_hdl(_adapter *padapter, u8 *pbuf); +u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf); +u8 disconnect_hdl(_adapter *padapter, u8 *pbuf); +u8 createbss_hdl(_adapter *padapter, u8 *pbuf); +u8 setopmode_hdl(_adapter *padapter, u8 *pbuf); +u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf); +u8 setauth_hdl(_adapter *padapter, u8 *pbuf); +u8 setkey_hdl(_adapter *padapter, u8 *pbuf); +u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf); +u8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf); +u8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf); +u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf); + +u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf); +u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf); +u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf); +u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf); + +#define GEN_DRV_CMD_HANDLER(size, cmd) {size, &cmd ## _hdl}, +#define GEN_MLME_EXT_HANDLER(size, cmd) {size, cmd}, + +#ifdef _RTW_CMD_C_ + +struct cmd_hdl wlancmds[] = +{ + GEN_DRV_CMD_HANDLER(0, NULL) /*0*/ + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*10*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct joinbss_parm), join_cmd_hdl) /*14*/ + GEN_MLME_EXT_HANDLER(sizeof (struct disconnect_parm), disconnect_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), createbss_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct setopmode_parm), setopmode_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct sitesurvey_parm), sitesurvey_cmd_hdl) /*18*/ + GEN_MLME_EXT_HANDLER(sizeof (struct setauth_parm), setauth_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct setkey_parm), setkey_hdl) /*20*/ + GEN_MLME_EXT_HANDLER(sizeof (struct set_stakey_parm), set_stakey_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct set_assocsta_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct del_assocsta_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setstapwrstate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setbasicrate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getbasicrate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setdatarate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getdatarate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setphyinfo_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getphyinfo_parm), NULL) /*30*/ + GEN_MLME_EXT_HANDLER(sizeof (struct setphy_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getphy_parm), NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*40*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), add_ba_hdl) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*50*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof(struct Tx_Beacon_param), tx_beacon_hdl) /*55*/ + + GEN_MLME_EXT_HANDLER(0, mlme_evt_hdl) /*56*/ + GEN_MLME_EXT_HANDLER(0, rtw_drvextra_cmd_hdl) /*57*/ + + GEN_MLME_EXT_HANDLER(0, h2c_msg_hdl) /*58*/ + GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), set_chplan_hdl) /*59*/ +}; + +#endif + +struct C2HEvent_Header +{ + +#ifdef CONFIG_LITTLE_ENDIAN + + unsigned int len:16; + unsigned int ID:8; + unsigned int seq:8; + +#elif defined(CONFIG_BIG_ENDIAN) + + unsigned int seq:8; + unsigned int ID:8; + unsigned int len:16; + +#else + +# error "Must be LITTLE or BIG Endian" + +#endif + + unsigned int rsvd; + +}; + +void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf); +void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf); + +enum rtw_c2h_event +{ + GEN_EVT_CODE(_Read_MACREG)=0, /*0*/ + GEN_EVT_CODE(_Read_BBREG), + GEN_EVT_CODE(_Read_RFREG), + GEN_EVT_CODE(_Read_EEPROM), + GEN_EVT_CODE(_Read_EFUSE), + GEN_EVT_CODE(_Read_CAM), /*5*/ + GEN_EVT_CODE(_Get_BasicRate), + GEN_EVT_CODE(_Get_DataRate), + GEN_EVT_CODE(_Survey), /*8*/ + GEN_EVT_CODE(_SurveyDone), /*9*/ + + GEN_EVT_CODE(_JoinBss) , /*10*/ + GEN_EVT_CODE(_AddSTA), + GEN_EVT_CODE(_DelSTA), + GEN_EVT_CODE(_AtimDone) , + GEN_EVT_CODE(_TX_Report), + GEN_EVT_CODE(_CCX_Report), /*15*/ + GEN_EVT_CODE(_DTM_Report), + GEN_EVT_CODE(_TX_Rate_Statistics), + GEN_EVT_CODE(_C2HLBK), + GEN_EVT_CODE(_FWDBG), + GEN_EVT_CODE(_C2HFEEDBACK), /*20*/ + GEN_EVT_CODE(_ADDBA), + GEN_EVT_CODE(_C2HBCN), + GEN_EVT_CODE(_ReportPwrState), //filen: only for PCIE, USB + GEN_EVT_CODE(_CloseRF), //filen: only for PCIE, work around ASPM + MAX_C2HEVT +}; + + +#ifdef _RTW_MLME_EXT_C_ + +static struct fwevent wlanevents[] = +{ + {0, rtw_dummy_event_callback}, /*0*/ + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, &rtw_survey_event_callback}, /*8*/ + {sizeof (struct surveydone_event), &rtw_surveydone_event_callback}, /*9*/ + + {0, &rtw_joinbss_event_callback}, /*10*/ + {sizeof(struct stassoc_event), &rtw_stassoc_event_callback}, + {sizeof(struct stadel_event), &rtw_stadel_event_callback}, + {0, &rtw_atimdone_event_callback}, + {0, rtw_dummy_event_callback}, + {0, NULL}, /*15*/ + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, rtw_fwdbg_event_callback}, + {0, NULL}, /*20*/ + {0, NULL}, + {0, NULL}, + {0, &rtw_cpwm_event_callback}, +}; + +#endif//_RTL8192C_CMD_C_ + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp.h b/drivers/net/wireless/rtl8192c/include/rtw_mp.h new file mode 100755 index 000000000000..c1e7c5a6e81a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mp.h @@ -0,0 +1,634 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_MP_H_ +#define _RTW_MP_H_ + +#ifndef PLATFORM_WINDOWS +// 00 - Success +// 11 - Error +#define STATUS_SUCCESS (0x00000000L) +#define STATUS_PENDING (0x00000103L) + +#define STATUS_UNSUCCESSFUL (0xC0000001L) +#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) +#define STATUS_NOT_SUPPORTED (0xC00000BBL) + +#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS) +#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING) +#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L) +#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) +#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L) +#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L) + +#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) +#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES) +#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) +#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) +#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) +#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) +#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) +#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) +#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) +#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) +#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) +#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) +#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) +#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) +#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) +#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL) +#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L) +#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L) +#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L) +#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L) +#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) +#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) +#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) +#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) +#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) +#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) +#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) +#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) +#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL) +#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL) +#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) +#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL) + +#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) +#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L) +#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L) +#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L) +#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) // cause 27 +#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) // cause 35,45 +#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) // cause 37 +#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) // cause 49 +#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) // cause 93 +#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) // cause 3 +#endif /* #ifndef PLATFORM_WINDOWS */ + +#if 0 +#define MPT_NOOP 0 +#define MPT_READ_MAC_1BYTE 1 +#define MPT_READ_MAC_2BYTE 2 +#define MPT_READ_MAC_4BYTE 3 +#define MPT_WRITE_MAC_1BYTE 4 +#define MPT_WRITE_MAC_2BYTE 5 +#define MPT_WRITE_MAC_4BYTE 6 +#define MPT_READ_BB_CCK 7 +#define MPT_WRITE_BB_CCK 8 +#define MPT_READ_BB_OFDM 9 +#define MPT_WRITE_BB_OFDM 10 +#define MPT_READ_RF 11 +#define MPT_WRITE_RF 12 +#define MPT_READ_EEPROM_1BYTE 13 +#define MPT_WRITE_EEPROM_1BYTE 14 +#define MPT_READ_EEPROM_2BYTE 15 +#define MPT_WRITE_EEPROM_2BYTE 16 +#define MPT_SET_CSTHRESHOLD 21 +#define MPT_SET_INITGAIN 22 +#define MPT_SWITCH_BAND 23 +#define MPT_SWITCH_CHANNEL 24 +#define MPT_SET_DATARATE 25 +#define MPT_SWITCH_ANTENNA 26 +#define MPT_SET_TX_POWER 27 +#define MPT_SET_CONT_TX 28 +#define MPT_SET_SINGLE_CARRIER 29 +#define MPT_SET_CARRIER_SUPPRESSION 30 +#define MPT_GET_RATE_TABLE 31 +#define MPT_READ_TSSI 32 +#define MPT_GET_THERMAL_METER 33 +#endif + +#define MAX_MP_XMITBUF_SZ 2048 +#define NR_MP_XMITFRAME 8 + +struct mp_xmit_frame +{ + _list list; + + struct pkt_attrib attrib; + + _pkt *pkt; + + int frame_tag; + + _adapter *padapter; + +#ifdef CONFIG_USB_HCI + + //insert urb, irp, and irpcnt info below... + //max frag_cnt = 8 + + u8 *mem_addr; + u32 sz[8]; + +#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) + PURB pxmit_urb[8]; +#endif + +#ifdef PLATFORM_OS_XP + PIRP pxmit_irp[8]; +#endif + + u8 bpending[8]; + sint ac_tag[8]; + sint last[8]; + uint irpcnt; + uint fragcnt; +#endif /* CONFIG_USB_HCI */ + + uint mem[(MAX_MP_XMITBUF_SZ >> 2)]; +}; + +struct mp_wiparam +{ + u32 bcompleted; + u32 act_type; + u32 io_offset; + u32 io_value; +}; + +typedef void(*wi_act_func)(void* padapter); + +#ifdef PLATFORM_WINDOWS +struct mp_wi_cntx +{ + u8 bmpdrv_unload; + + // Work Item + NDIS_WORK_ITEM mp_wi; + NDIS_EVENT mp_wi_evt; + _lock mp_wi_lock; + u8 bmp_wi_progress; + wi_act_func curractfunc; + // Variable needed in each implementation of CurrActFunc. + struct mp_wiparam param; +}; +#endif + +struct mp_tx +{ + u8 stop; + u32 count, sended; + u8 payload; + struct pkt_attrib attrib; + struct tx_desc desc; + u8 *pallocated_buf; + u8 *buf; + u32 buf_size, write_size; + _thread_hdl_ PktTxThread; +}; + +//#if (MP_DRIVER == 1) +#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) +#ifdef CONFIG_RTL8192C +#include +#endif +#ifdef CONFIG_RTL8192D +#include +#endif +#define MP_MAX_LINES 1000 +#define MP_MAX_LINES_BYTES 256 +#define u1Byte u8 +#define s1Byte s8 +#define u4Byte u32 +#define s4Byte s32 +typedef VOID (*MPT_WORK_ITEM_HANDLER)(IN PVOID Adapter); +typedef struct _MPT_CONTEXT +{ + // Indicate if we have started Mass Production Test. + BOOLEAN bMassProdTest; + + // Indicate if the driver is unloading or unloaded. + BOOLEAN bMptDrvUnload; + + /* 8190 PCI does not support NDIS_WORK_ITEM. */ + // Work Item for Mass Production Test. + //NDIS_WORK_ITEM MptWorkItem; +// RT_WORK_ITEM MptWorkItem; + // Event used to sync the case unloading driver and MptWorkItem is still in progress. +// NDIS_EVENT MptWorkItemEvent; + // To protect the following variables. +// NDIS_SPIN_LOCK MptWorkItemSpinLock; + // Indicate a MptWorkItem is scheduled and not yet finished. + BOOLEAN bMptWorkItemInProgress; + // An instance which implements function and context of MptWorkItem. + MPT_WORK_ITEM_HANDLER CurrMptAct; + + // 1=Start, 0=Stop from UI. + ULONG MptTestStart; + // _TEST_MODE, defined in MPT_Req2.h + ULONG MptTestItem; + // Variable needed in each implementation of CurrMptAct. + ULONG MptActType; // Type of action performed in CurrMptAct. + // The Offset of IO operation is depend of MptActType. + ULONG MptIoOffset; + // The Value of IO operation is depend of MptActType. + ULONG MptIoValue; + // The RfPath of IO operation is depend of MptActType. + ULONG MptRfPath; + + WIRELESS_MODE MptWirelessModeToSw; // Wireless mode to switch. + u1Byte MptChannelToSw; // Channel to switch. + u1Byte MptInitGainToSet; // Initial gain to set. + //ULONG bMptAntennaA; // TRUE if we want to use antenna A. + ULONG MptBandWidth; // bandwidth to switch. + ULONG MptRateIndex; // rate index. + // Register value kept for Single Carrier Tx test. + u1Byte btMpCckTxPower; + // Register value kept for Single Carrier Tx test. + u1Byte btMpOfdmTxPower; + // For MP Tx Power index + u1Byte TxPwrLevel[2]; // rf-A, rf-B + + // Content of RCR Regsiter for Mass Production Test. + ULONG MptRCR; + // TRUE if we only receive packets with specific pattern. + BOOLEAN bMptFilterPattern; + // Rx OK count, statistics used in Mass Production Test. + ULONG MptRxOkCnt; + // Rx CRC32 error count, statistics used in Mass Production Test. + ULONG MptRxCrcErrCnt; + + BOOLEAN bCckContTx; // TRUE if we are in CCK Continuous Tx test. + BOOLEAN bOfdmContTx; // TRUE if we are in OFDM Continuous Tx test. + BOOLEAN bStartContTx; // TRUE if we have start Continuous Tx test. + // TRUE if we are in Single Carrier Tx test. + BOOLEAN bSingleCarrier; + // TRUE if we are in Carrier Suppression Tx Test. + BOOLEAN bCarrierSuppression; + //TRUE if we are in Single Tone Tx test. + BOOLEAN bSingleTone; + + // ACK counter asked by K.Y.. + BOOLEAN bMptEnableAckCounter; + ULONG MptAckCounter; + + // SD3 Willis For 8192S to save 1T/2T RF table for ACUT Only fro ACUT delete later ~~~! + //s1Byte BufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT]; + //s1Byte BufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES]; + //s4Byte RfReadLine[2]; + + u1Byte APK_bound[2]; //for APK path A/path B + BOOLEAN bMptIndexEven; + + u1Byte backup0xc50; + u1Byte backup0xc58; + u1Byte backup0xc30; +}MPT_CONTEXT, *PMPT_CONTEXT; +#endif +//#endif + +/* E-Fuse */ +#ifdef CONFIG_RTL8192D +#define EFUSE_MAP_SIZE 255 +#endif +#ifdef CONFIG_RTL8192C +#define EFUSE_MAP_SIZE 128 +#endif +#define EFUSE_MAX_SIZE 512 + +/* end of E-Fuse */ + +struct mp_priv +{ + _adapter *papdater; + + //Testing Flag + u32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD) + + u32 prev_fw_state; + + //OID cmd handler + struct mp_wiparam workparam; +// u8 act_in_progress; + + //Tx Section + u8 TID; + u32 tx_pktcount; + struct mp_tx tx; + + //Rx Section + u32 rx_pktcount; + u32 rx_crcerrpktcount; + u32 rx_pktloss; + + struct recv_stat rxstat; + + //RF/BB relative + u8 channel; + u8 bandwidth; + u8 prime_channel_offset; + u8 txpoweridx; + u8 txpoweridx_b; + u8 rateidx; + u32 preamble; +// u8 modem; + +// u32 curr_crystalcap; + + u16 antenna_tx; + u16 antenna_rx; +// u8 curr_rfpath; + + u8 check_mp_pkt; + +// uint ForcedDataRate; + + struct wlan_network mp_network; + NDIS_802_11_MAC_ADDRESS network_macaddr; + +#ifdef PLATFORM_WINDOWS + u32 rx_testcnt; + u32 rx_testcnt1; + u32 rx_testcnt2; + u32 tx_testcnt; + u32 tx_testcnt1; + + struct mp_wi_cntx wi_cntx; + + u8 h2c_result; + u8 h2c_seqnum; + u16 h2c_cmdcode; + u8 h2c_resp_parambuf[512]; + _lock h2c_lock; + _lock wkitm_lock; + u32 h2c_cmdcnt; + NDIS_EVENT h2c_cmd_evt; + NDIS_EVENT c2h_set; + NDIS_EVENT h2c_clr; + NDIS_EVENT cpwm_int; + + NDIS_EVENT scsir_full_evt; + NDIS_EVENT scsiw_empty_evt; +#endif + + u8 *pallocated_mp_xmitframe_buf; + u8 *pmp_xmtframe_buf; + _queue free_mp_xmitqueue; + u32 free_mp_xmitframe_cnt; + + MPT_CONTEXT MptCtx; +}; + +typedef struct _IOCMD_STRUCT_ { + u8 cmdclass; + u16 value; + u8 index; +}IOCMD_STRUCT; + +struct rf_reg_param { + u32 path; + u32 offset; + u32 value; +}; + +struct bb_reg_param { + u32 offset; + u32 value; +}; +//======================================================================= + +#define LOWER _TRUE +#define RAISE _FALSE + +/* Hardware Registers */ +#if 0 +#if 0 +#define IOCMD_CTRL_REG 0x102502C0 +#define IOCMD_DATA_REG 0x102502C4 +#else +#define IOCMD_CTRL_REG 0x10250370 +#define IOCMD_DATA_REG 0x10250374 +#endif + +#define IOCMD_GET_THERMAL_METER 0xFD000028 + +#define IOCMD_CLASS_BB_RF 0xF0 +#define IOCMD_BB_READ_IDX 0x00 +#define IOCMD_BB_WRITE_IDX 0x01 +#define IOCMD_RF_READ_IDX 0x02 +#define IOCMD_RF_WRIT_IDX 0x03 +#endif +#define BB_REG_BASE_ADDR 0x800 + +/* MP variables */ +#if 0 +#define _2MAC_MODE_ 0 +#define _LOOPBOOK_MODE_ 1 +#endif +typedef enum _MP_MODE_ { + MP_OFF, + MP_ON, + MP_ERR, + MP_CONTINUOUS_TX, + MP_SINGLE_CARRIER_TX, + MP_CARRIER_SUPPRISSION_TX, + MP_SINGLE_TONE_TX, + MP_PACKET_TX, + MP_PACKET_RX +} MP_MODE; + +#ifdef CONFIG_RTL8192C +#define RF_PATH_A RF90_PATH_A +#define RF_PATH_B RF90_PATH_B +#define RF_PATH_C RF90_PATH_C +#define RF_PATH_D RF90_PATH_D + +#define MAX_RF_PATH_NUMS RF90_PATH_MAX +#else +#define RF_PATH_A 0 +#define RF_PATH_B 1 +#define RF_PATH_C 2 +#define RF_PATH_D 3 + +#define MAX_RF_PATH_NUMS 2 +#endif + +static u8 mpdatarate[NumRates] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff}; + +/* MP set force data rate base on the definition. */ +typedef enum _MPT_RATE_INDEX +{ + /* CCK rate. */ + MPT_RATE_1M, /* 0 */ + MPT_RATE_2M, + MPT_RATE_55M, + MPT_RATE_11M, /* 3 */ + + /* OFDM rate. */ + MPT_RATE_6M, /* 4 */ + MPT_RATE_9M, + MPT_RATE_12M, + MPT_RATE_18M, + MPT_RATE_24M, + MPT_RATE_36M, + MPT_RATE_48M, + MPT_RATE_54M, /* 11 */ + + /* HT rate. */ + MPT_RATE_MCS0, /* 12 */ + MPT_RATE_MCS1, + MPT_RATE_MCS2, + MPT_RATE_MCS3, + MPT_RATE_MCS4, + MPT_RATE_MCS5, + MPT_RATE_MCS6, + MPT_RATE_MCS7, /* 19 */ + MPT_RATE_MCS8, + MPT_RATE_MCS9, + MPT_RATE_MCS10, + MPT_RATE_MCS11, + MPT_RATE_MCS12, + MPT_RATE_MCS13, + MPT_RATE_MCS14, + MPT_RATE_MCS15, /* 27 */ + MPT_RATE_LAST +}MPT_RATE_E, *PMPT_RATE_E; + +#if 0 +// Represent Channel Width in HT Capabilities +typedef enum _HT_CHANNEL_WIDTH { + HT_CHANNEL_WIDTH_20 = 0, + HT_CHANNEL_WIDTH_40 = 1, +}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH; +#endif + + +#define MAX_TX_PWR_INDEX_N_MODE 64 // 0x3F + +typedef enum _POWER_MODE_ { + POWER_LOW = 0, + POWER_NORMAL +}POWER_MODE; + + +#define RX_PKT_BROADCAST 1 +#define RX_PKT_DEST_ADDR 2 +#define RX_PKT_PHY_MATCH 3 + +#if 0 +#define RPTMaxCount 0x000FFFFF; + +// parameter 1 : BitMask +// bit 0 : OFDM PPDU +// bit 1 : OFDM False Alarm +// bit 2 : OFDM MPDU OK +// bit 3 : OFDM MPDU Fail +// bit 4 : CCK PPDU +// bit 5 : CCK False Alarm +// bit 6 : CCK MPDU ok +// bit 7 : CCK MPDU fail +// bit 8 : HT PPDU counter +// bit 9 : HT false alarm +// bit 10 : HT MPDU total +// bit 11 : HT MPDU OK +// bit 12 : HT MPDU fail +// bit 15 : RX full drop +typedef enum _RXPHY_BITMASK_ +{ + OFDM_PPDU_BIT = 0, + OFDM_FALSE_BIT, + OFDM_MPDU_OK_BIT, + OFDM_MPDU_FAIL_BIT, + CCK_PPDU_BIT, + CCK_FALSE_BIT, + CCK_MPDU_OK_BIT, + CCK_MPDU_FAIL_BIT, + HT_PPDU_BIT, + HT_FALSE_BIT, + HT_MPDU_BIT, + HT_MPDU_OK_BIT, + HT_MPDU_FAIL_BIT, +} RXPHY_BITMASK; +#endif + +typedef enum _ENCRY_CTRL_STATE_ { + HW_CONTROL, //hw encryption& decryption + SW_CONTROL, //sw encryption& decryption + HW_ENCRY_SW_DECRY, //hw encryption & sw decryption + SW_ENCRY_HW_DECRY //sw encryption & hw decryption +}ENCRY_CTRL_STATE; + + +//======================================================================= +//extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv); +//extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe); + +extern s32 init_mp_priv(PADAPTER padapter); +extern void free_mp_priv(struct mp_priv *pmp_priv); +extern s32 MPT_InitializeAdapter(PADAPTER padapter, u8 Channel); +extern void MPT_DeInitAdapter(PADAPTER padapter); +extern s32 mp_start_test(PADAPTER padapter); +extern void mp_stop_test(PADAPTER padapter); + +//======================================================================= +//extern void IQCalibrateBcut(PADAPTER pAdapter); + +//extern u32 bb_reg_read(PADAPTER Adapter, u16 offset); +//extern u8 bb_reg_write(PADAPTER Adapter, u16 offset, u32 value); +//extern u32 rf_reg_read(PADAPTER Adapter, u8 path, u8 offset); +//extern u8 rf_reg_write(PADAPTER Adapter, u8 path, u8 offset, u32 value); + +//extern u32 get_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask); +//extern u8 set_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask, u32 value); +//extern u32 get_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask); +//extern u8 set_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask, u32 value); + +extern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz); +extern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz); +extern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask); +extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val); +extern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr); +extern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val); + +extern void SetChannel(PADAPTER pAdapter); +extern void SetBandwidth(PADAPTER pAdapter); +extern void SetTxPower(PADAPTER pAdapter); +extern void SetAntennaPathPower(PADAPTER pAdapter); +//extern void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset); +extern void SetDataRate(PADAPTER pAdapter); + +extern void SetAntenna(PADAPTER pAdapter); + +//extern void SetCrystalCap(PADAPTER pAdapter); + +extern s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther); +extern void GetThermalMeter(PADAPTER pAdapter, u8 *value); + +extern void SetContinuousTx(PADAPTER pAdapter, u8 bStart); +extern void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart); +extern void SetSingleToneTx(PADAPTER pAdapter, u8 bStart); +extern void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); + +extern void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc); +extern void SetPacketTx(PADAPTER padapter); +extern void SetPacketRx(PADAPTER pAdapter, u8 bStartRx); + +extern void ResetPhyRxPktCount(PADAPTER pAdapter); +extern u32 GetPhyRxPktReceived(PADAPTER pAdapter); +extern u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter); + +extern s32 SetPowerTracking(PADAPTER padapter, u8 enable); +extern void GetPowerTracking(PADAPTER padapter, u8 *enable); + +extern u32 mp_query_psd(PADAPTER pAdapter, u8 *data); + +#endif //_RTW_MP_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h b/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h new file mode 100755 index 000000000000..e16df404bf90 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h @@ -0,0 +1,596 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_MP_IOCTL_H_ +#define _RTW_MP_IOCTL_H_ + +//#include +//#include +#include +#include +#include +#include +#include +#include + +#if 0 +#define TESTFWCMDNUMBER 1000000 +#define TEST_H2CINT_WAIT_TIME 500 +#define TEST_C2HINT_WAIT_TIME 500 +#define HCI_TEST_SYSCFG_HWMASK 1 +#define _BUSCLK_40M (4 << 2) +#endif +//------------------------------------------------------------------------------ +typedef struct CFG_DBG_MSG_STRUCT { + u32 DebugLevel; + u32 DebugComponent_H32; + u32 DebugComponent_L32; +}CFG_DBG_MSG_STRUCT,*PCFG_DBG_MSG_STRUCT; + +typedef struct _RW_REG { + u32 offset; + u32 width; + u32 value; +}mp_rw_reg,RW_Reg, *pRW_Reg; + +//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM +typedef struct _EEPROM_RW_PARAM { + u32 offset; + u16 value; +}eeprom_rw_param,EEPROM_RWParam, *pEEPROM_RWParam; + +typedef struct _EFUSE_ACCESS_STRUCT_ { + u16 start_addr; + u16 cnts; + u8 data[0]; +}EFUSE_ACCESS_STRUCT, *PEFUSE_ACCESS_STRUCT; + +typedef struct _BURST_RW_REG { + u32 offset; + u32 len; + u8 Data[256]; +}burst_rw_reg,Burst_RW_Reg, *pBurst_RW_Reg; + +typedef struct _USB_VendorReq{ + u8 bRequest; + u16 wValue; + u16 wIndex; + u16 wLength; + u8 u8Dir;//0:OUT, 1:IN + u8 u8InData; +}usb_vendor_req, USB_VendorReq, *pUSB_VendorReq; + +typedef struct _DR_VARIABLE_STRUCT_ { + u8 offset; + u32 variable; +}DR_VARIABLE_STRUCT; + +//int mp_start_joinbss(_adapter *padapter, NDIS_802_11_SSID *pssid); + +//void _irqlevel_changed_(_irqL *irqlevel, /*BOOLEAN*/unsigned char bLower); +#ifdef PLATFORM_OS_XP +static void _irqlevel_changed_(_irqL *irqlevel, u8 bLower) +{ + + if (bLower == LOWER) { + *irqlevel = KeGetCurrentIrql(); + + if (*irqlevel > PASSIVE_LEVEL) { + KeLowerIrql(PASSIVE_LEVEL); + } + } else { + if (KeGetCurrentIrql() == PASSIVE_LEVEL) { + KeRaiseIrql(DISPATCH_LEVEL, irqlevel); + } + } + +} +#else +#define _irqlevel_changed_(a,b) +#endif + +//oid_rtl_seg_81_80_00 +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv* poid_par_priv); +//oid_rtl_seg_81_80_20 +NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv* poid_par_priv); + + +//oid_rtl_seg_81_87 +NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv* poid_par_priv); + + +//oid_rtl_seg_81_85 +NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); + + +// oid_rtl_seg_87_11_00 +NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv* poid_par_priv); +// oid_rtl_seg_87_11_20 +NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv* poid_par_priv); +//oid_rtl_seg_87_11_50 +NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv* poid_par_priv); +//oid_rtl_seg_87_11_F0 +NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv* poid_par_priv); + + +//oid_rtl_seg_87_12_00 +NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv); + +NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv); + +#ifdef _RTW_MP_IOCTL_C_ + +const struct oid_obj_priv oid_rtl_seg_81_80_00[] = +{ + {1, &oid_null_function}, //0x00 OID_RT_PRO_RESET_DUT + {1, &oid_rt_pro_set_data_rate_hdl}, //0x01 + {1, &oid_rt_pro_start_test_hdl}, //0x02 + {1, &oid_rt_pro_stop_test_hdl}, //0x03 + {1, &oid_null_function}, //0x04 OID_RT_PRO_SET_PREAMBLE + {1, &oid_null_function}, //0x05 OID_RT_PRO_SET_SCRAMBLER + {1, &oid_null_function}, //0x06 OID_RT_PRO_SET_FILTER_BB + {1, &oid_null_function}, //0x07 OID_RT_PRO_SET_MANUAL_DIVERSITY_BB + {1, &oid_rt_pro_set_channel_direct_call_hdl}, //0x08 + {1, &oid_null_function}, //0x09 OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL + {1, &oid_null_function}, //0x0A OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL + {1, &oid_rt_pro_set_continuous_tx_hdl}, //0x0B OID_RT_PRO_SET_TX_CONTINUOUS_DIRECT_CALL + {1, &oid_rt_pro_set_single_carrier_tx_hdl}, //0x0C OID_RT_PRO_SET_SINGLE_CARRIER_TX_CONTINUOUS + {1, &oid_null_function}, //0x0D OID_RT_PRO_SET_TX_ANTENNA_BB + {1, &oid_rt_pro_set_antenna_bb_hdl}, //0x0E + {1, &oid_null_function}, //0x0F OID_RT_PRO_SET_CR_SCRAMBLER + {1, &oid_null_function}, //0x10 OID_RT_PRO_SET_CR_NEW_FILTER + {1, &oid_rt_pro_set_tx_power_control_hdl}, //0x11 OID_RT_PRO_SET_TX_POWER_CONTROL + {1, &oid_null_function}, //0x12 OID_RT_PRO_SET_CR_TX_CONFIG + {1, &oid_null_function}, //0x13 OID_RT_PRO_GET_TX_POWER_CONTROL + {1, &oid_null_function}, //0x14 OID_RT_PRO_GET_CR_SIGNAL_QUALITY + {1, &oid_null_function}, //0x15 OID_RT_PRO_SET_CR_SETPOINT + {1, &oid_null_function}, //0x16 OID_RT_PRO_SET_INTEGRATOR + {1, &oid_null_function}, //0x17 OID_RT_PRO_SET_SIGNAL_QUALITY + {1, &oid_null_function}, //0x18 OID_RT_PRO_GET_INTEGRATOR + {1, &oid_null_function}, //0x19 OID_RT_PRO_GET_SIGNAL_QUALITY + {1, &oid_null_function}, //0x1A OID_RT_PRO_QUERY_EEPROM_TYPE + {1, &oid_null_function}, //0x1B OID_RT_PRO_WRITE_MAC_ADDRESS + {1, &oid_null_function}, //0x1C OID_RT_PRO_READ_MAC_ADDRESS + {1, &oid_null_function}, //0x1D OID_RT_PRO_WRITE_CIS_DATA + {1, &oid_null_function}, //0x1E OID_RT_PRO_READ_CIS_DATA + {1, &oid_null_function} //0x1F OID_RT_PRO_WRITE_POWER_CONTROL + +}; + +const struct oid_obj_priv oid_rtl_seg_81_80_20[] = +{ + {1, &oid_null_function}, //0x20 OID_RT_PRO_READ_POWER_CONTROL + {1, &oid_null_function}, //0x21 OID_RT_PRO_WRITE_EEPROM + {1, &oid_null_function}, //0x22 OID_RT_PRO_READ_EEPROM + {1, &oid_rt_pro_reset_tx_packet_sent_hdl}, //0x23 + {1, &oid_rt_pro_query_tx_packet_sent_hdl}, //0x24 + {1, &oid_rt_pro_reset_rx_packet_received_hdl}, //0x25 + {1, &oid_rt_pro_query_rx_packet_received_hdl}, //0x26 + {1, &oid_rt_pro_query_rx_packet_crc32_error_hdl}, //0x27 + {1, &oid_null_function}, //0x28 OID_RT_PRO_QUERY_CURRENT_ADDRESS + {1, &oid_null_function}, //0x29 OID_RT_PRO_QUERY_PERMANENT_ADDRESS + {1, &oid_null_function}, //0x2A OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS + {1, &oid_rt_pro_set_carrier_suppression_tx_hdl},//0x2B OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX + {1, &oid_null_function}, //0x2C OID_RT_PRO_RECEIVE_PACKET + {1, &oid_null_function}, //0x2D OID_RT_PRO_WRITE_EEPROM_BYTE + {1, &oid_null_function}, //0x2E OID_RT_PRO_READ_EEPROM_BYTE + {1, &oid_rt_pro_set_modulation_hdl} //0x2F + +}; + +const struct oid_obj_priv oid_rtl_seg_81_80_40[] = +{ + {1, &oid_null_function}, //0x40 + {1, &oid_null_function}, //0x41 + {1, &oid_null_function}, //0x42 + {1, &oid_rt_pro_set_single_tone_tx_hdl}, //0x43 + {1, &oid_null_function}, //0x44 + {1, &oid_null_function} //0x45 +}; + +const struct oid_obj_priv oid_rtl_seg_81_80_80[] = +{ + {1, &oid_null_function}, //0x80 OID_RT_DRIVER_OPTION + {1, &oid_null_function}, //0x81 OID_RT_RF_OFF + {1, &oid_null_function} //0x82 OID_RT_AUTH_STATUS + +}; + +const struct oid_obj_priv oid_rtl_seg_81_85[] = +{ + {1, &oid_rt_wireless_mode_hdl} //0x00 OID_RT_WIRELESS_MODE +}; + +struct oid_obj_priv oid_rtl_seg_81_87[] = +{ + {1, &oid_null_function}, //0x80 OID_RT_PRO8187_WI_POLL + {1, &oid_rt_pro_write_bb_reg_hdl}, //0x81 + {1, &oid_rt_pro_read_bb_reg_hdl}, //0x82 + {1, &oid_rt_pro_write_rf_reg_hdl}, //0x82 + {1, &oid_rt_pro_read_rf_reg_hdl} //0x83 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_00[] = +{ + {1, &oid_rt_pro8711_join_bss_hdl}, //0x00 //S + {1, &oid_rt_pro_read_register_hdl}, //0x01 + {1, &oid_rt_pro_write_register_hdl}, //0x02 + {1, &oid_rt_pro_burst_read_register_hdl}, //0x03 + {1, &oid_rt_pro_burst_write_register_hdl}, //0x04 + {1, &oid_rt_pro_write_txcmd_hdl}, //0x05 + {1, &oid_rt_pro_read16_eeprom_hdl}, //0x06 + {1, &oid_rt_pro_write16_eeprom_hdl}, //0x07 + {1, &oid_null_function}, //0x08 OID_RT_PRO_H2C_SET_COMMAND + {1, &oid_null_function}, //0x09 OID_RT_PRO_H2C_QUERY_RESULT + {1, &oid_rt_pro8711_wi_poll_hdl}, //0x0A + {1, &oid_rt_pro8711_pkt_loss_hdl}, //0x0B + {1, &oid_rt_rd_attrib_mem_hdl}, //0x0C + {1, &oid_rt_wr_attrib_mem_hdl}, //0x0D + {1, &oid_null_function}, //0x0E + {1, &oid_null_function}, //0x0F + {1, &oid_null_function}, //0x10 OID_RT_PRO_H2C_CMD_MODE + {1, &oid_null_function}, //0x11 OID_RT_PRO_H2C_CMD_RSP_MODE + {1, &oid_null_function}, //0X12 OID_RT_PRO_WAIT_C2H_EVENT + {1, &oid_null_function}, //0X13 OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST + {1, &oid_null_function}, //0X14 OID_RT_PRO_SCSI_ACCESS_TEST + {1, &oid_null_function}, //0X15 OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT + {1, &oid_null_function}, //0X16 OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN + {1, &oid_null_function}, //0X17 OID_RT_RRO_RX_PKT_VIA_IOCTRL + {1, &oid_null_function}, //0X18 OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL + {1, &oid_null_function}, //0X19 OID_RT_RPO_SET_PWRMGT_TEST + {1, &oid_null_function}, //0X1A + {1, &oid_null_function}, //0X1B OID_RT_PRO_QRY_PWRMGT_TEST + {1, &oid_null_function}, //0X1C OID_RT_RPO_ASYNC_RWIO_TEST + {1, &oid_null_function}, //0X1D OID_RT_RPO_ASYNC_RWIO_POLL + {1, &oid_rt_pro_set_rf_intfs_hdl}, //0X1E + {1, &oid_rt_poll_rx_status_hdl} //0X1F +}; + +struct oid_obj_priv oid_rtl_seg_87_11_20[] = +{ + {1, &oid_rt_pro_cfg_debug_message_hdl}, //0x20 + {1, &oid_rt_pro_set_data_rate_ex_hdl}, //0x21 + {1, &oid_rt_pro_set_basic_rate_hdl}, //0x22 + {1, &oid_rt_pro_read_tssi_hdl}, //0x23 + {1, &oid_rt_pro_set_power_tracking_hdl} //0x24 +}; + + +struct oid_obj_priv oid_rtl_seg_87_11_50[] = +{ + {1, &oid_rt_pro_qry_pwrstate_hdl}, //0x50 + {1, &oid_rt_pro_set_pwrstate_hdl} //0x51 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_80[] = +{ + {1, &oid_null_function} //0x80 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_B0[] = +{ + {1, &oid_null_function} //0xB0 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_F0[] = +{ + {1, &oid_null_function}, //0xF0 + {1, &oid_null_function}, //0xF1 + {1, &oid_null_function}, //0xF2 + {1, &oid_null_function}, //0xF3 + {1, &oid_null_function}, //0xF4 + {1, &oid_null_function}, //0xF5 + {1, &oid_null_function}, //0xF6 + {1, &oid_null_function}, //0xF7 + {1, &oid_null_function}, //0xF8 + {1, &oid_null_function}, //0xF9 + {1, &oid_null_function}, //0xFA + {1, &oid_rt_pro_h2c_set_rate_table_hdl}, //0xFB + {1, &oid_rt_pro_h2c_get_rate_table_hdl}, //0xFC + {1, &oid_null_function}, //0xFD + {1, &oid_null_function}, //0xFE OID_RT_PRO_H2C_C2H_LBK_TEST + {1, &oid_null_function} //0xFF + +}; + +struct oid_obj_priv oid_rtl_seg_87_12_00[]= +{ + {1, &oid_rt_pro_encryption_ctrl_hdl}, //0x00 Q&S + {1, &oid_rt_pro_add_sta_info_hdl}, //0x01 S + {1, &oid_rt_pro_dele_sta_info_hdl}, //0x02 S + {1, &oid_rt_pro_query_dr_variable_hdl}, //0x03 Q + {1, &oid_rt_pro_rx_packet_type_hdl}, //0x04 Q,S + {1, &oid_rt_pro_read_efuse_hdl}, //0x05 Q OID_RT_PRO_READ_EFUSE + {1, &oid_rt_pro_write_efuse_hdl}, //0x06 S OID_RT_PRO_WRITE_EFUSE + {1, &oid_rt_pro_rw_efuse_pgpkt_hdl}, //0x07 Q,S + {1, &oid_rt_get_efuse_current_size_hdl}, //0x08 Q + {1, &oid_rt_set_bandwidth_hdl}, //0x09 + {1, &oid_rt_set_crystal_cap_hdl}, //0x0a + {1, &oid_rt_set_rx_packet_type_hdl}, //0x0b S + {1, &oid_rt_get_efuse_max_size_hdl}, //0x0c + {1, &oid_rt_pro_set_tx_agc_offset_hdl}, //0x0d + {1, &oid_rt_pro_set_pkt_test_mode_hdl}, //0x0e + {1, &oid_null_function}, //0x0f OID_RT_PRO_FOR_EVM_TEST_SETTING + {1, &oid_rt_get_thermal_meter_hdl}, //0x10 Q OID_RT_PRO_GET_THERMAL_METER + {1, &oid_rt_reset_phy_rx_packet_count_hdl}, //0x11 S OID_RT_RESET_PHY_RX_PACKET_COUNT + {1, &oid_rt_get_phy_rx_packet_received_hdl}, //0x12 Q OID_RT_GET_PHY_RX_PACKET_RECEIVED + {1, &oid_rt_get_phy_rx_packet_crc32_error_hdl}, //0x13 Q OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR + {1, &oid_rt_set_power_down_hdl}, //0x14 Q OID_RT_SET_POWER_DOWN + {1, &oid_rt_get_power_mode_hdl} //0x15 Q OID_RT_GET_POWER_MODE +}; + +#else /* _RTL871X_MP_IOCTL_C_ */ + +extern struct oid_obj_priv oid_rtl_seg_81_80_00[32]; +extern struct oid_obj_priv oid_rtl_seg_81_80_20[16]; +extern struct oid_obj_priv oid_rtl_seg_81_80_40[6]; +extern struct oid_obj_priv oid_rtl_seg_81_80_80[3]; + +extern struct oid_obj_priv oid_rtl_seg_81_85[1]; +extern struct oid_obj_priv oid_rtl_seg_81_87[5]; + +extern struct oid_obj_priv oid_rtl_seg_87_11_00[32]; +extern struct oid_obj_priv oid_rtl_seg_87_11_20[5]; +extern struct oid_obj_priv oid_rtl_seg_87_11_50[2]; +extern struct oid_obj_priv oid_rtl_seg_87_11_80[1]; +extern struct oid_obj_priv oid_rtl_seg_87_11_B0[1]; +extern struct oid_obj_priv oid_rtl_seg_87_11_F0[16]; + +extern struct oid_obj_priv oid_rtl_seg_87_12_00[32]; + +#endif /* _RTL871X_MP_IOCTL_C_ */ + +struct rwreg_param{ + u32 offset; + u32 width; + u32 value; +}; + +struct bbreg_param{ + u32 offset; + u32 phymask; + u32 value; +}; +/* +struct rfchannel_param{ + u32 ch; + u32 modem; +}; +*/ +struct txpower_param{ + u32 pwr_index; +}; + + +struct datarate_param{ + u32 rate_index; +}; + + +struct rfintfs_parm { + u32 rfintfs; +}; + +typedef struct _mp_xmit_parm_ { + u8 enable; + u32 count; + u16 length; + u8 payload_type; + u8 da[ETH_ALEN]; +}MP_XMIT_PARM, *PMP_XMIT_PARM; + +struct mp_xmit_packet { + u32 len; + u32 mem[MAX_MP_XMITBUF_SZ >> 2]; +}; + +struct psmode_param { + u32 ps_mode; + u32 smart_ps; +}; + +//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM +struct eeprom_rw_param { + u32 offset; + u16 value; +}; + +struct mp_ioctl_handler { + u32 paramsize; + u32 (*handler)(struct oid_par_priv* poid_par_priv); + u32 oid; +}; + +struct mp_ioctl_param{ + u32 subcode; + u32 len; + u8 data[0]; +}; + +#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_ + +enum RTL871X_MP_IOCTL_SUBCODE { + GEN_MP_IOCTL_SUBCODE(MP_START), /*0*/ + GEN_MP_IOCTL_SUBCODE(MP_STOP), + GEN_MP_IOCTL_SUBCODE(READ_REG), + GEN_MP_IOCTL_SUBCODE(WRITE_REG), + GEN_MP_IOCTL_SUBCODE(READ_BB_REG), + GEN_MP_IOCTL_SUBCODE(WRITE_BB_REG), /*5*/ + GEN_MP_IOCTL_SUBCODE(READ_RF_REG), + GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG), + GEN_MP_IOCTL_SUBCODE(SET_CHANNEL), + GEN_MP_IOCTL_SUBCODE(SET_TXPOWER), + GEN_MP_IOCTL_SUBCODE(SET_DATARATE), /*10*/ + GEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH), + GEN_MP_IOCTL_SUBCODE(SET_ANTENNA), + GEN_MP_IOCTL_SUBCODE(CNTU_TX), + GEN_MP_IOCTL_SUBCODE(SC_TX), + GEN_MP_IOCTL_SUBCODE(CS_TX), /*15*/ + GEN_MP_IOCTL_SUBCODE(ST_TX), + GEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET), + GEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE), + GEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT), + GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV), /*20*/ + GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR), + GEN_MP_IOCTL_SUBCODE(READ16_EEPROM), + GEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM), + GEN_MP_IOCTL_SUBCODE(EFUSE), + GEN_MP_IOCTL_SUBCODE(EFUSE_MAP), /*25*/ + GEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE), + GEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE), + GEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER), + GEN_MP_IOCTL_SUBCODE(SET_PTM), + GEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN), /*30*/ + GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO), + GEN_MP_IOCTL_SUBCODE(SET_DM_BT), /*35*/ + GEN_MP_IOCTL_SUBCODE(DEL_BA), /*36*/ + GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS), /*37*/ + MAX_MP_IOCTL_SUBCODE, +}; + +u32 mp_ioctl_xmit_packet_hdl(struct oid_par_priv* poid_par_priv); + +#ifdef _RTW_MP_IOCTL_C_ + +#define GEN_MP_IOCTL_HANDLER(sz, hdl, oid) {sz, hdl, oid}, + +#define EXT_MP_IOCTL_HANDLER(sz, subcode, oid) {sz, mp_ioctl_ ## subcode ## _hdl, oid}, + + +struct mp_ioctl_handler mp_ioctl_hdl[] = { + +/*0*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_start_test_hdl, OID_RT_PRO_START_TEST) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_stop_test_hdl, OID_RT_PRO_STOP_TEST) + + GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_read_register_hdl, OID_RT_PRO_READ_REGISTER) + GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_write_register_hdl, OID_RT_PRO_WRITE_REGISTER) + GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_read_bb_reg_hdl, OID_RT_PRO_READ_BB_REG) +/*5*/ GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_write_bb_reg_hdl, OID_RT_PRO_WRITE_BB_REG) + GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_read_rf_reg_hdl, OID_RT_PRO_RF_READ_REGISTRY) + GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_write_rf_reg_hdl, OID_RT_PRO_RF_WRITE_REGISTRY) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_channel_direct_call_hdl, OID_RT_PRO_SET_CHANNEL_DIRECT_CALL) + GEN_MP_IOCTL_HANDLER(sizeof(struct txpower_param), oid_rt_pro_set_tx_power_control_hdl, OID_RT_PRO_SET_TX_POWER_CONTROL) +/*10*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_data_rate_hdl, OID_RT_PRO_SET_DATA_RATE) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_bandwidth_hdl, OID_RT_SET_BANDWIDTH) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_antenna_bb_hdl, OID_RT_PRO_SET_ANTENNA_BB) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_continuous_tx_hdl, OID_RT_PRO_SET_CONTINUOUS_TX) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_carrier_tx_hdl, OID_RT_PRO_SET_SINGLE_CARRIER_TX) +/*15*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_carrier_suppression_tx_hdl, OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_tone_tx_hdl, OID_RT_PRO_SET_SINGLE_TONE_TX) + + EXT_MP_IOCTL_HANDLER(0, xmit_packet, 0) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_rx_packet_type_hdl, OID_RT_SET_RX_PACKET_TYPE) + GEN_MP_IOCTL_HANDLER(0, oid_rt_reset_phy_rx_packet_count_hdl, OID_RT_RESET_PHY_RX_PACKET_COUNT) +/*20*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_received_hdl, OID_RT_GET_PHY_RX_PACKET_RECEIVED) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_crc32_error_hdl, OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR) + + GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) + GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) + GEN_MP_IOCTL_HANDLER(sizeof(EFUSE_ACCESS_STRUCT), oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE) +/*25*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_efuse_map_hdl, OID_RT_PRO_EFUSE_MAP) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_max_size_hdl, OID_RT_GET_EFUSE_MAX_SIZE) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_current_size_hdl, OID_RT_GET_EFUSE_CURRENT_SIZE) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_thermal_meter_hdl, OID_RT_PRO_GET_THERMAL_METER) + GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_pro_set_power_tracking_hdl, OID_RT_PRO_SET_POWER_TRACKING) +/*30*/ GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_set_power_down_hdl, OID_RT_SET_POWER_DOWN) +/*31*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_trigger_gpio_hdl, 0) + + +}; + +#else /* _RTW_MP_IOCTL_C_ */ + +extern struct mp_ioctl_handler mp_ioctl_hdl[]; + +#endif /* _RTW_MP_IOCTL_C_ */ + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h b/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h new file mode 100755 index 000000000000..4906005ede93 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h @@ -0,0 +1,1098 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/***************************************************************************** + * + * Module: __RTW_MP_PHY_REGDEF_H_ + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __RTW_MP_PHY_REGDEF_H_ +#define __RTW_MP_PHY_REGDEF_H_ + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +//#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +//#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 +//#define rFPGA0_XC_RFTiming 0x818 +//#define rFPGA0_XD_RFTiming 0x81c + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c +#define rFPGA0_XC_HSSIParameter1 0x830 +#define rFPGA0_XC_HSSIParameter2 0x834 +#define rFPGA0_XD_HSSIParameter1 0x838 +#define rFPGA0_XD_HSSIParameter2 0x83c +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 +#define rFPGA0_XC_LSSIParameter 0x848 +#define rFPGA0_XD_LSSIParameter 0x84c + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 +#define rFPGA0_XC_RFInterfaceOE 0x868 +#define rFPGA0_XD_RFInterfaceOE 0x86c + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 // Useless now +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c +#define rOFDM0_RxIQExtAnta 0xca0 + +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 + + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_Rate18_06 0xe00 +#define rTxAGC_Rate54_24 0xe04 +#define rTxAGC_CCK_Mcs32 0xe08 +#define rTxAGC_Mcs03_Mcs00 0xe10 +#define rTxAGC_Mcs07_Mcs04 0xe14 +#define rTxAGC_Mcs11_Mcs08 0xe18 +#define rTxAGC_Mcs15_Mcs12 0xe1c + +// Analog- control in RX_WAIT_CCA : REG: EE0 [Analog- Power & Control Register] +#define rRx_Wait_CCCA 0xe70 +#define rAnapar_Ctrl_BB 0xee0 + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define RTL92SE_FPGA_VERIFY 0 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +//#if (RTL92SE_FPGA_VERIFY == 1) +#define rZebra1_Channel 0x7 // RF channel switch +//#else + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x24 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 +#if (RTL92SE_FPGA_VERIFY == 1) +#define bLSSIReadAddress 0x3f000000 //LSSI "Read" Address // Reg 0x824 rFPGA0_XA_HSSIParameter2 +#else +#define bLSSIReadAddress 0x7f800000 // T65 RF +#endif +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal +#if (RTL92SE_FPGA_VERIFY == 1) +#define bLSSIReadBackData 0xfff // Reg 0x8a0 rFPGA0_XA_LSSIReadBack +#else +#define bLSSIReadBackData 0xfffff // T65 RF +#endif +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +#define bTxAGCRate18_06 0x7f7f7f7f // Useless +#define bTxAGCRate54_24 0x7f7f7f7f +#define bTxAGCRateMCS32 0x7f +#define bTxAGCRateCCK 0x7f00 +#define bTxAGCRateMCS3_MCS0 0x7f7f7f7f +#define bTxAGCRateMCS7_MCS4 0x7f7f7f7f +#define bTxAGCRateMCS11_MCS8 0x7f7f7f7f +#define bTxAGCRateMCS15_MCS12 0x7f7f7f7f + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f +#define bMask12Bits 0xfff + +//for PutRFRegsetting & GetRFRegSetting BitMask +#if (RTL92SE_FPGA_VERIFY == 1) +//#define bMask12Bits 0xfff // RF Reg mask bits +//#define bMask20Bits 0xfff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfff +#else +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff +#endif +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#if 0 +#define ANTENNA_A 0x1 // Useless +#define ANTENNA_B 0x2 +#define ANTENNA_AB 0x3 // ANTENNA_A|ANTENNA_B + +#define ANTENNA_C 0x4 +#define ANTENNA_D 0x8 +#endif + +#define RCR_AAP BIT(0) // accept all physical address +#define RCR_APM BIT(1) // accept physical match +#define RCR_AM BIT(2) // accept multicast +#define RCR_AB BIT(3) // accept broadcast +#define RCR_ACRC32 BIT(5) // accept error packet +#define RCR_9356SEL BIT(6) +#define RCR_AICV BIT(12) // Accept ICV error packet +#define RCR_RXFTH0 (BIT(13)|BIT(14)|BIT(15)) // Rx FIFO threshold +#define RCR_ADF BIT(18) // Accept Data(frame type) frame +#define RCR_ACF BIT(19) // Accept control frame +#define RCR_AMF BIT(20) // Accept management frame +#define RCR_ADD3 BIT(21) +#define RCR_APWRMGT BIT(22) // Accept power management packet +#define RCR_CBSSID BIT(23) // Accept BSSID match packet +#define RCR_ENMARP BIT(28) // enable mac auto reset phy +#define RCR_EnCS1 BIT(29) // enable carrier sense method 1 +#define RCR_EnCS2 BIT(30) // enable carrier sense method 2 +#define RCR_OnlyErlPkt BIT(31) // Rx Early mode is performed for packet size greater than 1536 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_p2p.h b/drivers/net/wireless/rtl8192c/include/rtw_p2p.h new file mode 100755 index 000000000000..96993dbe6d6a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_p2p.h @@ -0,0 +1,48 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_P2P_H_ +#define __RTW_P2P_H_ + +#include + +u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr ); +u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code); +u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); + +u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *p2p_ie, uint p2p_ielen, struct sta_info *psta); +u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe); +u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); +u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); +u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); +u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); + +void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength); +void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state); +void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType); +u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h b/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h new file mode 100755 index 000000000000..6ee62d6b3847 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h @@ -0,0 +1,331 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_PWRCTRL_H_ +#define __RTW_PWRCTRL_H_ + +#include +#include +#include + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif //CONFIG_HAS_EARLYSUSPEND + + +#define FW_PWR0 0 +#define FW_PWR1 1 +#define FW_PWR2 2 +#define FW_PWR3 3 + + +#define HW_PWR0 7 +#define HW_PWR1 6 +#define HW_PWR2 2 +#define HW_PWR3 0 +#define HW_PWR4 8 + +#define FW_PWRMSK 0x7 + + +#define XMIT_ALIVE BIT(0) +#define RECV_ALIVE BIT(1) +#define CMD_ALIVE BIT(2) +#define EVT_ALIVE BIT(3) + + +enum Power_Mgnt +{ + PS_MODE_ACTIVE = 0 , + PS_MODE_MIN , + PS_MODE_MAX , + PS_MODE_DTIM , + PS_MODE_VOIP , + PS_MODE_UAPSD_WMM , + PS_MODE_UAPSD , + PS_MODE_IBSS , + PS_MODE_WWLAN , + PM_Radio_Off , + PM_Card_Disable , + PS_MODE_NUM +}; + + +/* + BIT[2:0] = HW state + BIT[3] = Protocol PS state, 0: register active state , 1: register sleep state + BIT[4] = sub-state +*/ + +#define PS_DPS BIT(0) +#define PS_LCLK (PS_DPS) +#define PS_RF_OFF BIT(1) +#define PS_ALL_ON BIT(2) +#define PS_ST_ACTIVE BIT(3) +#define PS_LP BIT(4) // low performance + +#define PS_STATE_MASK (0x0F) +#define PS_STATE_HW_MASK (0x07) +#define PS_SEQ_MASK (0xc0) + +#define PS_STATE(x) (PS_STATE_MASK & (x)) +#define PS_STATE_HW(x) (PS_STATE_HW_MASK & (x)) +#define PS_SEQ(x) (PS_SEQ_MASK & (x)) + +#define PS_STATE_S0 (PS_DPS) +#define PS_STATE_S1 (PS_LCLK) +#define PS_STATE_S2 (PS_RF_OFF) +#define PS_STATE_S3 (PS_ALL_ON) +#define PS_STATE_S4 ((PS_ST_ACTIVE) | (PS_ALL_ON)) + + +#define PS_IS_RF_ON(x) ((x) & (PS_ALL_ON)) +#define PS_IS_ACTIVE(x) ((x) & (PS_ST_ACTIVE)) +#define CLR_PS_STATE(x) ((x) = ((x) & (0xF0))) + + +struct reportpwrstate_parm { + unsigned char mode; + unsigned char state; //the CPWM value + unsigned short rsvd; +}; + + +typedef _sema _pwrlock; + + +__inline static void _init_pwrlock(_pwrlock *plock) +{ + _rtw_init_sema(plock, 1); +} + +__inline static void _free_pwrlock(_pwrlock *plock) +{ + _rtw_free_sema(plock); +} + + +__inline static void _enter_pwrlock(_pwrlock *plock) +{ + _rtw_down_sema(plock); +} + + +__inline static void _exit_pwrlock(_pwrlock *plock) +{ + _rtw_up_sema(plock); +} + +#define LPS_DELAY_TIME 1*HZ // 1 sec + +#define EXE_PWR_NONE 0x01 +#define EXE_PWR_IPS 0x02 +#define EXE_PWR_LPS 0x04 + +// RF state. +typedef enum _rt_rf_power_state +{ + rf_on, // RF is on after RFSleep or RFOff + rf_sleep, // 802.11 Power Save mode + rf_off, // HW/SW Radio OFF or Inactive Power Save + //=====Add the new RF state above this line=====// + rf_max +}rt_rf_power_state; + +// RF Off Level for IPS or HW/SW radio off +#define RT_RF_OFF_LEVL_ASPM BIT(0) // PCI ASPM +#define RT_RF_OFF_LEVL_CLK_REQ BIT(1) // PCI clock request +#define RT_RF_OFF_LEVL_PCI_D3 BIT(2) // PCI D3 mode +#define RT_RF_OFF_LEVL_HALT_NIC BIT(3) // NIC halt, re-initialize hw parameters +#define RT_RF_OFF_LEVL_FREE_FW BIT(4) // FW free, re-download the FW +#define RT_RF_OFF_LEVL_FW_32K BIT(5) // FW in 32k +#define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6) // Always enable ASPM and Clock Req in initialization. +#define RT_RF_LPS_DISALBE_2R BIT(30) // When LPS is on, disable 2R if no packet is received or transmittd. +#define RT_RF_LPS_LEVEL_ASPM BIT(31) // LPS with ASPM + +#define RT_IN_PS_LEVEL(ppsc, _PS_FLAG) ((ppsc->cur_ps_level & _PS_FLAG) ? _TRUE : _FALSE) +#define RT_CLEAR_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level &= (~(_PS_FLAG))) +#define RT_SET_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level |= _PS_FLAG) + + +enum _PS_BBRegBackup_ { + PSBBREG_RF0 = 0, + PSBBREG_RF1, + PSBBREG_RF2, + PSBBREG_AFE0, + PSBBREG_TOTALCNT +}; + +enum { // for ips_mode + IPS_NORMAL = 0, + IPS_LEVEL_2 +}; + +struct pwrctrl_priv { + _pwrlock lock; + volatile u8 rpwm; // requested power state for fw + volatile u8 cpwm; // fw current power state. updated when 1. read from HCPWM 2. driver lowers power level + volatile u8 tog; // toggling + volatile u8 cpwm_tog; // toggling + u8 pwr_mode; + u8 smart_ps; + uint alives; + + u8 b_hw_radio_off; + u8 reg_rfoff; + u8 reg_pdnmode; //powerdown mode + u32 rfoff_reason; + + //RF OFF Level + u32 cur_ps_level; + u32 reg_rfps_level; + + + +#ifdef CONFIG_PCI_HCI + //just for PCIE ASPM + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. + u8 b_support_backdoor; + + //just for PCIE ASPM + u8 const_amdpci_aspm; +#endif + + //u8 ips_enable;//for dbg + //u8 lps_enable;//for dbg + + uint ips_enter_cnts; + uint ips_leave_cnts; + + _timer ips_check_timer; + + u8 ips_mode; + u8 ips_mode_req; // used to accept the mode setting request, will update to ipsmode later + + u8 bLeisurePs; + u8 LpsIdleCount; + u8 power_mgnt; + u8 bFwCurrentInPSMode; + u32 DelayLPSLastTimeStamp; + + s32 pnp_current_pwr_state; + u8 pnp_bstop_trx; + + + u8 bInternalAutoSuspend; + u8 bInSuspend; + u8 bSupportRemoteWakeup; + _timer pwr_state_check_timer; + int pwr_state_check_inverval; + u8 pwr_state_check_cnts; + uint bips_processing; + + int ps_flag; + + rt_rf_power_state rf_pwrstate;//cur power state + //rt_rf_power_state current_rfpwrstate; + rt_rf_power_state change_rfpwrstate; + + u8 wepkeymask; + u8 bHWPowerdown;//if support hw power down + u8 bHWPwrPindetect; + u8 bkeepfwalive; + u8 brfoffbyhw; + unsigned long PS_BBRegBackup[PSBBREG_TOTALCNT]; + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + struct workqueue_struct *rtw_workqueue; + _workitem resume_work; + #endif + + #ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; + u8 do_late_resume; + #endif //CONFIG_HAS_EARLYSUSPEND + + #ifdef CONFIG_ANDROID_POWER + android_early_suspend_t early_suspend; + u8 do_late_resume; + #endif + +}; + +#define rtw_get_ips_mode_req(pwrctrlpriv) \ + (pwrctrlpriv)->ips_mode_req + +#define rtw_ips_mode_req(pwrctrlpriv, ips_mode) \ + (pwrctrlpriv)->ips_mode_req = (ips_mode) + +#define _rtw_set_pwr_state_check_timer(pwrctrlpriv, ms) \ + do { \ + /*DBG_871X("%s _rtw_set_pwr_state_check_timer(%p, %d)\n", __FUNCTION__, (pwrctrlpriv), (ms));*/ \ + _set_timer(&(pwrctrlpriv)->pwr_state_check_timer, (ms)); \ + } while(0) + +#define rtw_set_pwr_state_check_timer(pwrctrlpriv) \ + _rtw_set_pwr_state_check_timer((pwrctrlpriv), (pwrctrlpriv)->pwr_state_check_inverval) + +extern void rtw_init_pwrctrl_priv(_adapter *adapter); +extern void rtw_free_pwrctrl_priv(_adapter * adapter); +extern sint rtw_register_tx_alive(_adapter *padapter); +extern void rtw_unregister_tx_alive(_adapter *padapter); +extern sint rtw_register_rx_alive(_adapter *padapter); +extern void rtw_unregister_rx_alive(_adapter *padapter); +extern sint rtw_register_cmd_alive(_adapter *padapter); +extern void rtw_unregister_cmd_alive(_adapter *padapter); +extern sint rtw_register_evt_alive(_adapter *padapter); +extern void rtw_unregister_evt_alive(_adapter *padapter); +extern void cpwm_int_hdl(_adapter *padapter, struct reportpwrstate_parm *preportpwrstate); +extern void rtw_set_ps_mode(_adapter * padapter, u8 ps_mode, u8 smart_ps); +extern void rtw_set_rpwm(_adapter * padapter, u8 val8); +extern void LeaveAllPowerSaveMode(PADAPTER Adapter); +#ifdef CONFIG_IPS +void ips_enter(_adapter * padapter); +int ips_leave(_adapter * padapter); +#endif + +void rtw_ps_processor(_adapter*padapter); + +#ifdef CONFIG_AUTOSUSPEND +int autoresume_enter(_adapter* padapter); +#endif +#ifdef SUPPORT_HW_RFOFF_DETECTED +rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ); +#endif + + +#ifdef CONFIG_LPS +void LPS_Enter(PADAPTER padapter); +void LPS_Leave(PADAPTER padapter); +#endif + +#ifdef CONFIG_RESUME_IN_WORKQUEUE +void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv); +#endif //CONFIG_RESUME_IN_WORKQUEUE + +#if defined(CONFIG_HAS_EARLYSUSPEND ) || defined(CONFIG_ANDROID_POWER) +#define rtw_is_earlysuspend_registered(pwrpriv) (pwrpriv)->early_suspend.suspend +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv); +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv); +#endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER + +u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val); + +#endif //__RTL871X_PWRCTRL_H_ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_qos.h b/drivers/net/wireless/rtl8192c/include/rtw_qos.h new file mode 100755 index 000000000000..e35b77f4f9c1 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_qos.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + + +#ifndef _RTW_QOS_H_ +#define _RTW_QOS_H_ +#include +#include + + + + + + +struct qos_priv { + + unsigned int qos_option; //bit mask option: u-apsd, s-apsd, ts, block ack... + +}; + + +#endif //_RTL871X_QOS_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_recv.h b/drivers/net/wireless/rtl8192c/include/rtw_recv.h new file mode 100755 index 000000000000..0562e59331ab --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_recv.h @@ -0,0 +1,703 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_RECV_H_ +#define _RTW_RECV_H_ + +#include +#include +#include + + +#define NR_RECVFRAME 256 + +#define RXFRAME_ALIGN 8 +#define RXFRAME_ALIGN_SZ (1<signal_stat_timer, (recvpriv)->signal_stat_sampling_interval) +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + +struct sta_recv_priv { + + _lock lock; + sint option; + + //_queue blk_strms[MAX_RX_NUMBLKS]; + _queue defrag_q; //keeping the fragment frame until defrag + + struct stainfo_rxcache rxcache; + + //uint sta_rx_bytes; + //uint sta_rx_pkts; + //uint sta_rx_fail; + +}; + + +struct recv_buf{ + + _list list; + + _lock recvbuf_lock; + + u32 ref_cnt; + + _adapter *adapter; + +#ifdef CONFIG_SDIO_HCI +#ifdef PLATFORM_OS_XP + PMDL mdl_ptr; +#endif + u8 cmd_fail; +#endif + +#ifdef CONFIG_USB_HCI + + #if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) + PURB purb; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ + u32 alloc_sz; + #endif + + #ifdef PLATFORM_OS_XP + PIRP pirp; + #endif + + #ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_read_port; + #endif + + u8 irp_pending; + int transfer_len; + +#endif + +#ifdef PLATFORM_LINUX + _pkt *pskb; + u8 reuse; +#endif + + uint len; + u8 *phead; + u8 *pdata; + u8 *ptail; + u8 *pend; + + u8 *pbuf; + u8 *pallocated_buf; + +}; + + +/* + head -----> + + data -----> + + payload + + tail -----> + + + end -----> + + len = (unsigned int )(tail - data); + +*/ +struct recv_frame_hdr{ + + _list list; + _pkt *pkt; + _pkt *pkt_newalloc; + + _adapter *adapter; + + u8 fragcnt; + + int frame_tag; + + struct rx_pkt_attrib attrib; + + uint len; + u8 *rx_head; + u8 *rx_data; + u8 *rx_tail; + u8 *rx_end; + + void *precvbuf; + + + // + struct sta_info *psta; + + //for A-MPDU Rx reordering buffer control + struct recv_reorder_ctrl *preorder_ctrl; + +}; + + +union recv_frame{ + + union{ + _list list; + struct recv_frame_hdr hdr; + uint mem[RECVFRAME_HDR_ALIGN>>2]; + }u; + + //uint mem[MAX_RXSZ>>2]; + +}; + + +extern union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue +extern void rtw_init_recvframe(union recv_frame *precvframe ,struct recv_priv *precvpriv); +extern int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue); +extern union recv_frame *rtw_dequeue_recvframe (_queue *queue); +extern int rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); +extern void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue); + +sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue); +struct recv_buf *rtw_dequeue_recvbuf (_queue *queue); + +void rtw_reordering_ctrl_timeout_handler(void *pcontext); + +__inline static u8 *get_rxmem(union recv_frame *precvframe) +{ + //always return rx_head... + if(precvframe==NULL) + return NULL; + + return precvframe->u.hdr.rx_head; +} + +__inline static u8 *get_rx_status(union recv_frame *precvframe) +{ + + return get_rxmem(precvframe); + +} + +__inline static u8 *get_recvframe_data(union recv_frame *precvframe) +{ + + //alwasy return rx_data + if(precvframe==NULL) + return NULL; + + return precvframe->u.hdr.rx_data; + +} + +__inline static u8 *recvframe_push(union recv_frame *precvframe, sint sz) +{ + // append data before rx_data + + /* add data to the start of recv_frame + * + * This function extends the used data area of the recv_frame at the buffer + * start. rx_data must be still larger than rx_head, after pushing. + */ + + if(precvframe==NULL) + return NULL; + + + precvframe->u.hdr.rx_data -= sz ; + if( precvframe->u.hdr.rx_data < precvframe->u.hdr.rx_head ) + { + precvframe->u.hdr.rx_data += sz ; + return NULL; + } + + precvframe->u.hdr.len +=sz; + + return precvframe->u.hdr.rx_data; + +} + + +__inline static u8 *recvframe_pull(union recv_frame *precvframe, sint sz) +{ + // rx_data += sz; move rx_data sz bytes hereafter + + //used for extract sz bytes from rx_data, update rx_data and return the updated rx_data to the caller + + + if(precvframe==NULL) + return NULL; + + + precvframe->u.hdr.rx_data += sz; + + if(precvframe->u.hdr.rx_data > precvframe->u.hdr.rx_tail) + { + precvframe->u.hdr.rx_data -= sz; + return NULL; + } + + precvframe->u.hdr.len -=sz; + + return precvframe->u.hdr.rx_data; + +} + +__inline static u8 *recvframe_put(union recv_frame *precvframe, sint sz) +{ + // rx_tai += sz; move rx_tail sz bytes hereafter + + //used for append sz bytes from ptr to rx_tail, update rx_tail and return the updated rx_tail to the caller + //after putting, rx_tail must be still larger than rx_end. + unsigned char * prev_rx_tail; + + if(precvframe==NULL) + return NULL; + + prev_rx_tail = precvframe->u.hdr.rx_tail; + + precvframe->u.hdr.rx_tail += sz; + + if(precvframe->u.hdr.rx_tail > precvframe->u.hdr.rx_end) + { + precvframe->u.hdr.rx_tail -= sz; + return NULL; + } + + precvframe->u.hdr.len +=sz; + + return precvframe->u.hdr.rx_tail; + +} + + + +__inline static u8 *recvframe_pull_tail(union recv_frame *precvframe, sint sz) +{ + // rmv data from rx_tail (by yitsen) + + //used for extract sz bytes from rx_end, update rx_end and return the updated rx_end to the caller + //after pulling, rx_end must be still larger than rx_data. + + if(precvframe==NULL) + return NULL; + + precvframe->u.hdr.rx_tail -= sz; + + if(precvframe->u.hdr.rx_tail < precvframe->u.hdr.rx_data) + { + precvframe->u.hdr.rx_tail += sz; + return NULL; + } + + precvframe->u.hdr.len -=sz; + + return precvframe->u.hdr.rx_tail; + +} + + + +__inline static _buffer * get_rxbuf_desc(union recv_frame *precvframe) +{ + _buffer * buf_desc; + + if(precvframe==NULL) + return NULL; +#ifdef PLATFORM_WINDOWS + NdisQueryPacket(precvframe->u.hdr.pkt, NULL, NULL, &buf_desc, NULL); +#endif + + return buf_desc; +} + + +__inline static union recv_frame *rxmem_to_recvframe(u8 *rxmem) +{ + //due to the design of 2048 bytes alignment of recv_frame, we can reference the union recv_frame + //from any given member of recv_frame. + // rxmem indicates the any member/address in recv_frame + + return (union recv_frame*)(((uint)rxmem>>RXFRAME_ALIGN) <u.hdr.rx_head; + +} + +__inline static u8 *pkt_to_recvdata(_pkt *pkt) +{ + // return the rx_data + + union recv_frame * precv_frame =pkt_to_recvframe(pkt); + + return precv_frame->u.hdr.rx_data; + +} + + +__inline static sint get_recvframe_len(union recv_frame *precvframe) +{ + return precvframe->u.hdr.len; +} + +__inline static u8 query_rx_pwr_percentage(s8 antpower ) +{ + if ((antpower <= -100) || (antpower >= 20)) + { + return 0; + } + else if (antpower >= 0) + { + return 100; + } + else + { + return (100+antpower); + } +} +__inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex) +{ + s32 SignalPower; // in dBm. + + // Translate to dBm (x=0.5y-95). + SignalPower = (s32)((SignalStrengthIndex + 1) >> 1); + SignalPower -= 95; + + return SignalPower; +} + + +struct sta_info; + +extern void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv); + +extern void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_rf.h b/drivers/net/wireless/rtl8192c/include/rtw_rf.h new file mode 100755 index 000000000000..0b139633015b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_rf.h @@ -0,0 +1,138 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_RF_H_ +#define __RTW_RF_H_ + +#include +#include + +#define OFDM_PHY 1 +#define MIXED_PHY 2 +#define CCK_PHY 3 + +#define NumRates (13) + +// slot time for 11g +#define SHORT_SLOT_TIME 9 +#define NON_SHORT_SLOT_TIME 20 + +#define RTL8711_RF_MAX_SENS 6 +#define RTL8711_RF_DEF_SENS 4 + + +#define NUM_CHANNELS 32 +//#define NUM_REGULATORYS 21 +#define NUM_REGULATORYS 1 + +//Country codes +#define USA 0x555320 +#define EUROPE 0x1 //temp, should be provided later +#define JAPAN 0x2 //temp, should be provided later + +struct regulatory_class { + u32 starting_freq; //MHz, + u8 channel_set[NUM_CHANNELS]; + u8 channel_cck_power[NUM_CHANNELS];//dbm + u8 channel_ofdm_power[NUM_CHANNELS];//dbm + u8 txpower_limit; //dbm + u8 channel_spacing; //MHz + u8 modem; +}; + +typedef enum _CAPABILITY{ + cESS = 0x0001, + cIBSS = 0x0002, + cPollable = 0x0004, + cPollReq = 0x0008, + cPrivacy = 0x0010, + cShortPreamble = 0x0020, + cPBCC = 0x0040, + cChannelAgility = 0x0080, + cSpectrumMgnt = 0x0100, + cQos = 0x0200, // For HCCA, use with CF-Pollable and CF-PollReq + cShortSlotTime = 0x0400, + cAPSD = 0x0800, + cRM = 0x1000, // RRM (Radio Request Measurement) + cDSSS_OFDM = 0x2000, + cDelayedBA = 0x4000, + cImmediateBA = 0x8000, +}CAPABILITY, *PCAPABILITY; + +enum _REG_PREAMBLE_MODE{ + PREAMBLE_LONG = 1, + PREAMBLE_AUTO = 2, + PREAMBLE_SHORT = 3, +}; + + +enum _RTL8712_RF_MIMO_CONFIG_{ + RTL8712_RFCONFIG_1T=0x10, + RTL8712_RFCONFIG_2T=0x20, + RTL8712_RFCONFIG_1R=0x01, + RTL8712_RFCONFIG_2R=0x02, + RTL8712_RFCONFIG_1T1R=0x11, + RTL8712_RFCONFIG_1T2R=0x12, + RTL8712_RFCONFIG_TURBO=0x92, + RTL8712_RFCONFIG_2T2R=0x22 +}; + + +// Bandwidth Offset +#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 +#define HAL_PRIME_CHNL_OFFSET_LOWER 1 +#define HAL_PRIME_CHNL_OFFSET_UPPER 2 + +// Represent Channel Width in HT Capabilities +// +typedef enum _HT_CHANNEL_WIDTH { + HT_CHANNEL_WIDTH_20 = 0, + HT_CHANNEL_WIDTH_40 = 1, +}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH; + +// +// Represent Extention Channel Offset in HT Capabilities +// This is available only in 40Mhz mode. +// +typedef enum _HT_EXTCHNL_OFFSET{ + HT_EXTCHNL_OFFSET_NO_EXT = 0, + HT_EXTCHNL_OFFSET_UPPER = 1, + HT_EXTCHNL_OFFSET_NO_DEF = 2, + HT_EXTCHNL_OFFSET_LOWER = 3, +}HT_EXTCHNL_OFFSET, *PHT_EXTCHNL_OFFSET; + +/* 2007/11/15 MH Define different RF type. */ +typedef enum _RT_RF_TYPE_DEFINITION +{ + RF_1T2R = 0, + RF_2T4R = 1, + RF_2T2R = 2, + RF_1T1R = 3, + RF_2T2R_GREEN = 4, + RF_819X_MAX_TYPE = 5, +}RT_RF_TYPE_DEF_E; + + +u32 rtw_ch2freq(u32 ch); +u32 rtw_freq2ch(u32 freq); + + +#endif //_RTL8711_RF_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_security.h b/drivers/net/wireless/rtl8192c/include/rtw_security.h new file mode 100755 index 000000000000..02ef9b011b45 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_security.h @@ -0,0 +1,423 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_SECURITY_H_ +#define __RTW_SECURITY_H_ + + +#include +#include +#include + + +#define _NO_PRIVACY_ 0x0 +#define _WEP40_ 0x1 +#define _TKIP_ 0x2 +#define _TKIP_WTMIC_ 0x3 +#define _AES_ 0x4 +#define _WEP104_ 0x5 + +#define _WPA_IE_ID_ 0xdd +#define _WPA2_IE_ID_ 0x30 + +#define SHA256_MAC_LEN 32 +#define AES_BLOCK_SIZE 16 +#define AES_PRIV_SIZE (4 * 44) + +#ifndef Ndis802_11AuthModeWPA2 +#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1) +#endif + +#ifndef Ndis802_11AuthModeWPA2PSK +#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2) +#endif + +union pn48 { + + u64 val; + +#ifdef CONFIG_LITTLE_ENDIAN + +struct { + u8 TSC0; + u8 TSC1; + u8 TSC2; + u8 TSC3; + u8 TSC4; + u8 TSC5; + u8 TSC6; + u8 TSC7; +} _byte_; + +#elif defined(CONFIG_BIG_ENDIAN) + +struct { + u8 TSC7; + u8 TSC6; + u8 TSC5; + u8 TSC4; + u8 TSC3; + u8 TSC2; + u8 TSC1; + u8 TSC0; +} _byte_; + +#endif + +}; + +union Keytype { + u8 skey[16]; + u32 lkey[4]; +}; + + +typedef struct _RT_PMKID_LIST +{ + u8 bUsed; + u8 Bssid[6]; + u8 PMKID[16]; + u8 SsidBuf[33]; + u8* ssid_octet; + u16 ssid_length; +} RT_PMKID_LIST, *PRT_PMKID_LIST; + + +struct security_priv +{ + u32 dot11AuthAlgrthm; // 802.11 auth, could be open, shared, 8021x and authswitch + u32 dot11PrivacyAlgrthm; // This specify the privacy for shared auth. algorithm. + + /* WEP */ + u32 dot11PrivacyKeyIndex; // this is only valid for legendary wep, 0~3 for key id. (tx key index) + union Keytype dot11DefKey[4]; // this is only valid for def. key + u32 dot11DefKeylen[4]; + + u32 dot118021XGrpPrivacy; // This specify the privacy algthm. used for Grp key + u32 dot118021XGrpKeyid; // key id used for Grp Key ( tx key index) + union Keytype dot118021XGrpKey[4]; // 802.1x Group Key, for inx0 and inx1 + union Keytype dot118021XGrptxmickey[4]; + union Keytype dot118021XGrprxmickey[4]; + union pn48 dot11Grptxpn; // PN48 used for Grp Key xmit. + union pn48 dot11Grprxpn; // PN48 used for Grp Key recv. + +#ifdef CONFIG_AP_MODE + //extend security capabilities for AP_MODE + unsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x + unsigned int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 + unsigned int wpa_group_cipher; + unsigned int wpa2_group_cipher; + unsigned int wpa_pairwise_cipher; + unsigned int wpa2_pairwise_cipher; +#endif + + u8 wps_phase;//for wps + u8 wps_ie[MAX_WPS_IE_LEN];//added in assoc req + int wps_ie_len; + + + u8 binstallGrpkey; + u8 busetkipkey; + //_timer tkip_timer; + u8 bcheck_grpkey; + u8 bgrpkey_handshake; + + //u8 packet_cnt;//unused, removed + + s32 sw_encrypt;//from registry_priv + s32 sw_decrypt;//from registry_priv + + s32 hw_decrypted;//if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready. + + + //keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc) + u32 ndisauthtype; // NDIS_802_11_AUTHENTICATION_MODE + u32 ndisencryptstatus; // NDIS_802_11_ENCRYPTION_STATUS + + WLAN_BSSID_EX sec_bss; //for joinbss (h2c buffer) usage + + NDIS_802_11_WEP ndiswep; +#ifdef PLATFORM_WINDOWS + u8 KeyMaterial[16];// variable length depending on above field. +#endif + + u8 assoc_info[600]; + u8 szofcapability[256]; //for wpa2 usage + u8 oidassociation[512]; //for wpa/wpa2 usage + u8 authenticator_ie[256]; //store ap security information element + u8 supplicant_ie[256]; //store sta security information element + + + //for tkip countermeasure + u32 last_mic_err_time; + u8 btkip_countermeasure; + u8 btkip_wait_report; + u32 btkip_countermeasure_time; + + //--------------------------------------------------------------------------- + // For WPA2 Pre-Authentication. + //--------------------------------------------------------------------------- + //u8 RegEnablePreAuth; // Default value: Pre-Authentication enabled or not, from registry "EnablePreAuth". Added by Annie, 2005-11-01. + //u8 EnablePreAuthentication; // Current Value: Pre-Authentication enabled or not. + RT_PMKID_LIST PMKIDList[NUM_PMKID_CACHE]; // Renamed from PreAuthKey[NUM_PRE_AUTH_KEY]. Annie, 2006-10-13. + u8 PMKIDIndex; + //u32 PMKIDCount; // Added by Annie, 2006-10-13. + //u8 szCapability[256]; // For WPA2-PSK using zero-config, by Annie, 2005-09-20. + +}; + +struct sha256_state { + u64 length; + u32 state[8], curlen; + u8 buf[64]; +}; + +#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\ +do{\ + switch(psecuritypriv->dot11AuthAlgrthm)\ + {\ + case dot11AuthAlgrthm_Open:\ + case dot11AuthAlgrthm_Shared:\ + case dot11AuthAlgrthm_Auto:\ + encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\ + break;\ + case dot11AuthAlgrthm_8021X:\ + if(bmcst)\ + encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\ + else\ + encry_algo =(u8) psta->dot118021XPrivacy;\ + break;\ + }\ +}while(0) + + +#define SET_ICE_IV_LEN( iv_len, icv_len, encrypt)\ +do{\ + switch(encrypt)\ + {\ + case _WEP40_:\ + case _WEP104_:\ + iv_len = 4;\ + icv_len = 4;\ + break;\ + case _TKIP_:\ + iv_len = 8;\ + icv_len = 4;\ + break;\ + case _AES_:\ + iv_len = 8;\ + icv_len = 8;\ + break;\ + default:\ + iv_len = 0;\ + icv_len = 0;\ + break;\ + }\ +}while(0) + + +#define GET_TKIP_PN(iv,dot11txpn)\ +do{\ + dot11txpn._byte_.TSC0=iv[2];\ + dot11txpn._byte_.TSC1=iv[0];\ + dot11txpn._byte_.TSC2=iv[4];\ + dot11txpn._byte_.TSC3=iv[5];\ + dot11txpn._byte_.TSC4=iv[6];\ + dot11txpn._byte_.TSC5=iv[7];\ +}while(0) + + +#define ROL32( A, n ) ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) +#define ROR32( A, n ) ROL32( (A), 32-(n) ) + +struct mic_data +{ + u32 K0, K1; // Key + u32 L, R; // Current state + u32 M; // Message accumulator (single word) + u32 nBytesInM; // # bytes in M +}; + +extern const u32 Te0[256]; +extern const u32 Te1[256]; +extern const u32 Te2[256]; +extern const u32 Te3[256]; +extern const u32 Te4[256]; +extern const u32 Td0[256]; +extern const u32 Td1[256]; +extern const u32 Td2[256]; +extern const u32 Td3[256]; +extern const u32 Td4[256]; +extern const u32 rcon[10]; +extern const u8 Td4s[256]; +extern const u8 rcons[10]; + +#define RCON(i) (rcons[(i)] << 24) + +static inline u32 rotr(u32 val, int bits) +{ + return (val >> bits) | (val << (32 - bits)); +} + +#define TE0(i) Te0[((i) >> 24) & 0xff] +#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8) +#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16) +#define TE3(i) rotr(Te0[(i) & 0xff], 24) +#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000) +#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000) +#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00) +#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff) +#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000) +#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000) +#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00) +#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff) +#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff) + +#define TD0(i) Td0[((i) >> 24) & 0xff] +#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8) +#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16) +#define TD3(i) rotr(Td0[(i) & 0xff], 24) +#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24) +#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16) +#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8) +#define TD44(i) (Td4s[(i) & 0xff]) +#define TD0_(i) Td0[(i) & 0xff] +#define TD1_(i) rotr(Td0[(i) & 0xff], 8) +#define TD2_(i) rotr(Td0[(i) & 0xff], 16) +#define TD3_(i) rotr(Td0[(i) & 0xff], 24) + +#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \ + ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) + +#define PUTU32(ct, st) { \ +(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \ +(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } + +#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ + (((u32) (a)[2]) << 8) | ((u32) (a)[3])) + +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_PUT_BE64(a, val) \ + do { \ + (a)[0] = (u8) (((u64) (val)) >> 56); \ + (a)[1] = (u8) (((u64) (val)) >> 48); \ + (a)[2] = (u8) (((u64) (val)) >> 40); \ + (a)[3] = (u8) (((u64) (val)) >> 32); \ + (a)[4] = (u8) (((u64) (val)) >> 24); \ + (a)[5] = (u8) (((u64) (val)) >> 16); \ + (a)[6] = (u8) (((u64) (val)) >> 8); \ + (a)[7] = (u8) (((u64) (val)) & 0xff); \ + } while (0) + +/* ===== start - public domain SHA256 implementation ===== */ + +/* This is based on SHA256 implementation in LibTomCrypt that was released into + * public domain by Tom St Denis. */ + +/* the K array */ +static const unsigned long K[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; + + +/* Various logical functions */ +#define RORc(x, y) \ +( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \ + ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL) +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) RORc((x), (n)) +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) +#ifndef MIN +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#endif + +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ); +void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ); +void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes ); +void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ); + +void rtw_seccalctkipmic( + u8 * key, + u8 *header, + u8 *data, + u32 data_len, + u8 *Miccode, + u8 priority); + +u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe); +u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe); +void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe); + +u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe); +u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe); +void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe); + +#ifdef CONFIG_TDLS +void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta); +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, + u8 *mic); +int tdls_verify_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie); +#endif + +#ifdef PLATFORM_WINDOWS +void rtw_use_tkipkey_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); +#endif +#ifdef PLATFORM_LINUX +void rtw_use_tkipkey_handler(void* FunctionContext); +#endif +#endif //__RTL871X_SECURITY_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_version.h b/drivers/net/wireless/rtl8192c/include/rtw_version.h new file mode 100644 index 000000000000..4ac0ef84d93e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_version.h @@ -0,0 +1 @@ +#define DRIVERVERSION "v3.0.2230.20110728" diff --git a/drivers/net/wireless/rtl8192c/include/rtw_xmit.h b/drivers/net/wireless/rtl8192c/include/rtw_xmit.h new file mode 100755 index 000000000000..38676b302075 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_xmit.h @@ -0,0 +1,665 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_XMIT_H_ +#define _RTW_XMIT_H_ + +#include +#include +#include +#include + +#ifdef CONFIG_SDIO_HCI +#define MAX_XMITBUF_SZ (30720)// (2048) +#define NR_XMITBUFF (16) + +#elif defined (CONFIG_USB_HCI) +#ifdef CONFIG_USB_TX_AGGREGATION +#define MAX_XMITBUF_SZ 20480 // 20k +#else +#define MAX_XMITBUF_SZ (2048) +#endif + +#ifdef CONFIG_SPECIFIC_URB_NUM +#define NR_XMITBUFF (1) +#else +#define NR_XMITBUFF (4) +#endif + +#elif defined (CONFIG_PCI_HCI) +#define MAX_XMITBUF_SZ (1664) +#define NR_XMITBUFF (128) +#endif + +#ifdef PLATFORM_OS_CE +#define XMITBUF_ALIGN_SZ 4 +#else +#ifdef CONFIG_PCI_HCI +#define XMITBUF_ALIGN_SZ 4 +#else +#define XMITBUF_ALIGN_SZ 512 +#endif +#endif + +// xmit extension buff defination +#define MAX_XMIT_EXTBUF_SZ (2048) + +#ifdef CONFIG_SPECIFIC_URB_NUM +#define NR_XMIT_EXTBUFF (1) +#else +#define NR_XMIT_EXTBUFF (4) +#endif + +#define MAX_NUMBLKS (1) + +#define XMIT_VO_QUEUE (0) +#define XMIT_VI_QUEUE (1) +#define XMIT_BE_QUEUE (2) +#define XMIT_BK_QUEUE (3) + +#ifdef CONFIG_PCI_HCI +#define TXDESC_NUM 64 +//#define TXDESC_NUM 128 +#define TXDESC_NUM_BE_QUEUE 128 +#endif + +#define WEP_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC0;\ + pattrib_iv[1] = dot11txpn._byte_.TSC1;\ + pattrib_iv[2] = dot11txpn._byte_.TSC2;\ + pattrib_iv[3] = ((keyidx & 0x3)<<6);\ + dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\ +}while(0) + + +#define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC1;\ + pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\ + pattrib_iv[2] = dot11txpn._byte_.TSC0;\ + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ + pattrib_iv[4] = dot11txpn._byte_.TSC2;\ + pattrib_iv[5] = dot11txpn._byte_.TSC3;\ + pattrib_iv[6] = dot11txpn._byte_.TSC4;\ + pattrib_iv[7] = dot11txpn._byte_.TSC5;\ + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ +}while(0) + +#define AES_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC0;\ + pattrib_iv[1] = dot11txpn._byte_.TSC1;\ + pattrib_iv[2] = 0;\ + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ + pattrib_iv[4] = dot11txpn._byte_.TSC2;\ + pattrib_iv[5] = dot11txpn._byte_.TSC3;\ + pattrib_iv[6] = dot11txpn._byte_.TSC4;\ + pattrib_iv[7] = dot11txpn._byte_.TSC5;\ + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ +}while(0) + + +#define HWXMIT_ENTRY 4 + +#define TXDESC_SIZE 32 +#define PACKET_OFFSET_SZ (8) + +#ifdef CONFIG_USB_HCI +#define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ) +#endif + +#ifdef CONFIG_PCI_HCI +#define TXDESC_OFFSET 0 +#define TX_DESC_NEXT_DESC_OFFSET 40 +#endif + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define BK BIT(6) +#define QSEL_SHT 8 +#define Rate_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define PKT_OFFSET_SHT 26 +#define HWPC BIT(31) + +//OFFSET 8 +#define AGG_EN BIT(29) + +//OFFSET 12 +#define SEQ_SHT 16 + +//OFFSET 16 +#define QoS BIT(6) +#define HW_SEQ_EN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define DATA_SHORT BIT(24) +#define DATA_BW BIT(25) + +//OFFSET 20 +#define SGI BIT(6) + +struct tx_desc{ + + //DWORD 0 + unsigned int txdw0; + + unsigned int txdw1; + + unsigned int txdw2; + + unsigned int txdw3; + + unsigned int txdw4; + + unsigned int txdw5; + + unsigned int txdw6; + + unsigned int txdw7; +#ifdef CONFIG_PCI_HCI + unsigned int txdw8; + + unsigned int txdw9; + + unsigned int txdw10; + + unsigned int txdw11; + + // 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now, our descriptor + // size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute + // memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor + // number or enlarge descriptor size as 64 bytes. + unsigned int txdw12; + + unsigned int txdw13; + + unsigned int txdw14; + + unsigned int txdw15; +#endif +}; + + +union txdesc { + struct tx_desc txdesc; + unsigned int value[TXDESC_SIZE>>2]; +}; + +#ifdef CONFIG_PCI_HCI +#define PCI_MAX_TX_QUEUE_COUNT 8 + +struct rtw_tx_ring { + struct tx_desc *desc; + dma_addr_t dma; + unsigned int idx; + unsigned int entries; + _queue queue; + u32 qlen; +}; +#endif + +struct hw_xmit { + //_lock xmit_lock; + //_list pending; + _queue *sta_queue; + //struct hw_txqueue *phwtxqueue; + //sint txcmdcnt; + int accnt; +}; + +#if 0 +struct pkt_attrib +{ + u8 type; + u8 subtype; + u8 bswenc; + u8 dhcp_pkt; + u16 ether_type; + int pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) + int pkt_hdrlen; //the original 802.3 pkt header len + int hdrlen; //the WLAN Header Len + int nr_frags; + int last_txcmdsz; + int encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith + u8 iv[8]; + int iv_len; + u8 icv[8]; + int icv_len; + int priority; + int ack_policy; + int mac_id; + int vcs_mode; //virtual carrier sense method + + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; + u8 ta[ETH_ALEN]; + u8 ra[ETH_ALEN]; + + u8 key_idx; + + u8 qos_en; + u8 ht_en; + u8 raid;//rate adpative id + u8 bwmode; + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + u8 ampdu_en;//tx ampdu enable + u8 mdata;//more data bit + u8 eosp; + + u8 pctrl;//per packet txdesc control enable + u8 triggered;//for ap mode handling Power Saving sta + + u32 qsel; + u16 seqnum; + + struct sta_info * psta; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + u8 hw_tcp_csum; +#endif +}; +#else +//reduce size +struct pkt_attrib +{ + u8 type; + u8 subtype; + u8 bswenc; + u8 dhcp_pkt; + u16 ether_type; + u16 seqnum; + u16 pkt_hdrlen; //the original 802.3 pkt header len + u16 hdrlen; //the WLAN Header Len + u32 pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) + u32 last_txcmdsz; + u8 nr_frags; + u8 encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith + u8 iv_len; + u8 icv_len; + u8 iv[8]; + u8 icv[8]; + u8 priority; + u8 ack_policy; + u8 mac_id; + u8 vcs_mode; //virtual carrier sense method + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; + u8 ta[ETH_ALEN]; + u8 ra[ETH_ALEN]; + u8 key_idx; + u8 qos_en; + u8 ht_en; + u8 raid;//rate adpative id + u8 bwmode; + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + u8 ampdu_en;//tx ampdu enable + u8 mdata;//more data bit + u8 pctrl;//per packet txdesc control enable + u8 triggered;//for ap mode handling Power Saving sta + u8 qsel; + u8 eosp; + + struct sta_info * psta; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + u8 hw_tcp_csum; +#endif +}; +#endif + + +#define WLANHDR_OFFSET 64 + +#define NULL_FRAMETAG (0x0) +#define DATA_FRAMETAG 0x01 +#define L2_FRAMETAG 0x02 +#define MGNT_FRAMETAG 0x03 +#define AMSDU_FRAMETAG 0x04 + +#define EII_FRAMETAG 0x05 +#define IEEE8023_FRAMETAG 0x06 + +#define MP_FRAMETAG 0x07 + +#define TXAGG_FRAMETAG 0x08 + + +struct xmit_buf +{ + _list list; + + _adapter *padapter; + + u8 *pallocated_buf; + + u8 *pbuf; + + void *priv_data; + + u16 ext_tag; // 0: Normal xmitbuf, 1: extension xmitbuf. + u16 flags; + u32 alloc_sz; + +#ifdef CONFIG_USB_HCI + + u32 sz[8]; + +#if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) + PURB pxmit_urb[8]; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ +#endif + +#ifdef PLATFORM_OS_XP + PIRP pxmit_irp[8]; +#endif + +#ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_write_port; +#endif + + u8 bpending[8]; + + sint last[8]; + +#endif + +#ifdef CONFIG_SDIO_HCI + u32 len; + u8 *phead; + u8 *pdata; + u8 *ptail; + u8 *pend; + u32 ff_hwaddr; +#ifdef PLATFORM_OS_XP + PMDL pxmitbuf_mdl; + PIRP pxmitbuf_irp; + PSDBUS_REQUEST_PACKET pxmitbuf_sdrp; +#endif +#endif + +#ifdef CONFIG_PCI_HCI + u32 len; +#endif + +#ifdef DBG_XMIT_BUF + u8 no; +#endif + +}; + +struct xmit_frame +{ + _list list; + + struct pkt_attrib attrib; + + _pkt *pkt; + + int frame_tag; + + _adapter *padapter; + + u8 *buf_addr; + + struct xmit_buf *pxmitbuf; + +#ifdef CONFIG_SDIO_HCI + u8 pg_num; +#endif + +#ifdef CONFIG_USB_HCI +#ifdef CONFIG_USB_TX_AGGREGATION + u8 agg_num; +#endif + u8 pkt_offset; +#ifdef CONFIG_RTL8192D + u8 EMPktNum; + u16 EMPktLen[5];//The max value by HW +#endif +#endif +}; + +struct tx_servq { + _list tx_pending; + _queue sta_pending; + int qcnt; +}; + + + +struct sta_xmit_priv +{ + _lock lock; + sint option; + sint apsd_setting; //When bit mask is on, the associated edca queue supports APSD. + + + //struct tx_servq blk_q[MAX_NUMBLKS]; + struct tx_servq be_q; //priority == 0,3 + struct tx_servq bk_q; //priority == 1,2 + struct tx_servq vi_q; //priority == 4,5 + struct tx_servq vo_q; //priority == 6,7 + _list legacy_dz; + _list apsd; + + u16 txseq_tid[16]; + + //uint sta_tx_bytes; + //u64 sta_tx_pkts; + //uint sta_tx_fail; + +}; + + +struct hw_txqueue { + volatile sint head; + volatile sint tail; + volatile sint free_sz; //in units of 64 bytes + volatile sint free_cmdsz; + volatile sint txsz[8]; + uint ff_hwaddr; + uint cmd_hwaddr; + sint ac_tag; +}; + + +struct xmit_priv { + + _lock lock; + + _sema xmit_sema; + _sema terminate_xmitthread_sema; + + //_queue blk_strms[MAX_NUMBLKS]; + _queue be_pending; + _queue bk_pending; + _queue vi_pending; + _queue vo_pending; + _queue bm_pending; + + //_queue legacy_dz_queue; + //_queue apsd_queue; + + u8 *pallocated_frame_buf; + u8 *pxmit_frame_buf; + uint free_xmitframe_cnt; + + //uint mapping_addr; + //uint pkt_sz; + + _queue free_xmit_queue; + + //struct hw_txqueue be_txqueue; + //struct hw_txqueue bk_txqueue; + //struct hw_txqueue vi_txqueue; + //struct hw_txqueue vo_txqueue; + //struct hw_txqueue bmc_txqueue; + + uint frag_len; + + _adapter *adapter; + + u8 vcs_setting; + u8 vcs; + u8 vcs_type; + //u16 rts_thresh; + + u64 tx_bytes; + u64 tx_pkts; + u64 tx_drop; + u64 last_tx_bytes; + u64 last_tx_pkts; + + struct hw_xmit *hwxmits; + u8 hwxmit_entry; + +#ifdef CONFIG_USB_HCI + _sema tx_retevt;//all tx return event; + u8 txirp_cnt;// + +#ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_write_port; +// USB_TRANSFER usb_transfer_write_mem; +#endif +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#endif + //per AC pending irp + int beq_cnt; + int bkq_cnt; + int viq_cnt; + int voq_cnt; + +#endif + +#ifdef CONFIG_SDIO_HCI + u8 free_pg[8]; + u8 public_pgsz; + u8 required_pgsz; + u8 used_pgsz; + u8 init_pgsz; +#ifdef PLATFORM_OS_XP + PMDL prd_freesz_mdl[2]; + u8 brd_freesz_pending[2]; + PIRP prd_freesz_irp[2]; + PSDBUS_REQUEST_PACKET prd_freesz_sdrp[2]; + u8 rd_freesz_irp_idx; +#endif + +#endif + +#ifdef CONFIG_PCI_HCI + // Tx + struct rtw_tx_ring tx_ring[PCI_MAX_TX_QUEUE_COUNT]; + int txringcount[PCI_MAX_TX_QUEUE_COUNT]; +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#endif +#endif + + _queue free_xmitbuf_queue; + _queue pending_xmitbuf_queue; // unused?? + u8 *pallocated_xmitbuf; + u8 *pxmitbuf; + uint free_xmitbuf_cnt; + + _queue free_xmit_extbuf_queue; + u8 *pallocated_xmit_extbuf; + u8 *pxmit_extbuf; + uint free_xmit_extbuf_cnt; + + u16 nqos_ssn; + ATOMIC_T HwRdyXmitData; // driver should wait hw setting done for join event callback, only for Data Frame. 1:done 0:not yet. +}; + +extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +extern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz); +extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len); +extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib); +extern s32 rtw_put_snap(u8 *data, u16 h_proto); + +extern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); +extern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue); +struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac); +extern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +extern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry); + +extern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe); +extern thread_return rtw_xmit_thread(thread_context context); +extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe); +#ifdef CONFIG_TDLS +extern void fill_tdls_dis_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +extern s32 xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, u8 action); +void rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif +s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag); +void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv); + + +s32 rtw_txframes_pending(_adapter *padapter); +s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib); +void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry); + + +s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter); +void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv); + + +int rtw_alloc_hwxmits(_adapter *padapter); +void rtw_free_hwxmits(_adapter *padapter); + +s32 rtw_free_xmitframe_ex(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); + +s32 rtw_xmit(_adapter *padapter, _pkt *pkt); + +#ifdef CONFIG_TDLS +sint xmit_tdls_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif + +#ifdef CONFIG_AP_MODE +sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe); +void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta); +void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta); +#endif + +#endif //_RTL871X_XMIT_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_hal.h b/drivers/net/wireless/rtl8192c/include/sdio_hal.h new file mode 100755 index 000000000000..51139bb30f5c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_hal.h @@ -0,0 +1,34 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __SDIO_HAL_H__ + +#define __SDIO_HAL_H__ + +extern u8 sd_hal_bus_init(_adapter * adapter); +extern u8 sd_hal_bus_deinit(_adapter * adapter); + + +u8 sd_int_isr (IN PADAPTER padapter); +void sd_int_dpc(PADAPTER padapter); + + +#endif //__SDIO_HAL_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops.h b/drivers/net/wireless/rtl8192c/include/sdio_ops.h new file mode 100755 index 000000000000..b1e9b63e4d5e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops.h @@ -0,0 +1,80 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __SDIO_OPS_H_ +#define __SDIO_OPS_H_ + +#include +#include +#include +#include + +#ifdef PLATFORM_LINUX +#include +#endif + + + +#ifdef PLATFORM_WINDOWS + +#ifdef PLATFORM_OS_XP +#include +struct async_context +{ + PMDL pmdl; + PSDBUS_REQUEST_PACKET sdrp; + unsigned char* r_buf; + unsigned char* padapter; +}; +#endif +#ifdef PLATFORM_OS_CE +#include +#endif +#endif + + + +extern void sdio_set_intf_option(u32 *poption); + +extern void sdio_set_intf_funs(struct intf_hdl *pintf_hdl); + +extern uint sdio_init_intf_priv(struct intf_priv *pintfpriv); + +extern void sdio_unload_intf_priv(struct intf_priv *pintfpriv); + +extern void sdio_intf_hdl_init(u8 *priv); + +extern void sdio_intf_hdl_unload(u8 *priv); + +extern void sdio_intf_hdl_open(u8 *priv); + +extern void sdio_intf_hdl_close(u8 *priv); + +extern void sdio_set_intf_ops(struct _io_ops *pops); + +//extern void sdio_set_intf_callbacks(struct _io_callbacks *pcallbacks); +extern void sdio_func1cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem); +extern void sdio_func1cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem); + +extern uint __inline _cvrt2ftaddr(const u32 addr, u32 *pftaddr) ; + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h new file mode 100755 index 000000000000..6b0c1a29f3ee --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _SDIO_OPS_WINCE_H_ +#define _SDIO_OPS_WINCE_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_OS_CE + + +extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8); + + +uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + +extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); + +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h new file mode 100755 index 000000000000..c58ab080c0f3 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h @@ -0,0 +1,55 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _SDIO_OPS_LINUX_H_ +#define _SDIO_OPS_LINUX_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_LINUX + + +extern u8 sdbus_cmd52r(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w(struct intf_priv *pintfpriv, u32 addr,u8 val8); +extern u8 sdbus_direct_read8(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_direct_write8(struct intf_priv *pintfpriv, u32 addr, u8 val8); + +extern uint sdbus_read_bytes_to_recvbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern uint sdbus_read_blocks_to_recvbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_xmitbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_xmitbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h new file mode 100755 index 000000000000..3569611a49e0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _SDIO_OPS_XP_H_ +#define _SDIO_OPS_XP_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_OS_XP + + +extern u8 sdbus_cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w_xp(struct intf_priv *pintfpriv, u32 addr,u8 val8); + + +uint sdbus_read_blocks_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + +extern uint sdbus_read_bytes_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern u8 sdbus_func1cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_func1cmd52w_xp(struct intf_priv *pintfpriv, u32 addr, u8 val8); +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); + +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_osintf.h b/drivers/net/wireless/rtl8192c/include/sdio_osintf.h new file mode 100755 index 000000000000..099262b3e47d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_osintf.h @@ -0,0 +1,48 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __SDIO_OSINTF_H +#define __SDIO_OSINTF_H + + +#include +#include +#include + + +extern unsigned int sd_dvobj_init(_adapter * adapter); +extern void sd_dvobj_deinit(_adapter * adapter); + +void rtl871x_intf_stop(_adapter *padapter); + +u8 sd_hal_bus_init(_adapter * padapter); +u8 sd_hal_bus_deinit(_adapter * padapter); +void update_xmit_hw_res(_adapter * padapter); +void sd_c2h_hdl( PADAPTER padapter); + +#ifdef PLATFORM_OS_CE +extern NDIS_STATUS ce_sd_get_dev_hdl(_adapter *padapter ); +SD_API_STATUS +ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, _adapter* padapter); +extern void sd_setup_irs(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sta_info.h b/drivers/net/wireless/rtl8192c/include/sta_info.h new file mode 100755 index 000000000000..c71bdc44b9b3 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sta_info.h @@ -0,0 +1,293 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __STA_INFO_H_ +#define __STA_INFO_H_ + +#include +#include +#include +#include + +#define IBSS_START_MAC_ID 2 +#define NUM_STA 32 +#define NUM_ACL 64 + + +//if mode ==0, then the sta is allowed once the addr is hit. +//if mode ==1, then the sta is rejected once the addr is non-hit. +struct rtw_wlan_acl_node { + _list list; + u8 addr[ETH_ALEN]; + u8 mode; +}; + +struct wlan_acl_pool { + struct rtw_wlan_acl_node aclnode[NUM_ACL]; +}; + +typedef struct _RSSI_STA{ + int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedCCK; +}RSSI_STA, *PRSSI_STA; + +struct stainfo_stats { + + u64 rx_pkts; + u64 rx_bytes; + u64 rx_drops; + u64 last_rx_pkts; + + u64 tx_pkts; + u64 tx_bytes; + u64 tx_drops; + +}; + +#ifdef CONFIG_TDLS +struct TDLS_PeerKey { + u8 kck[16]; /* TPK-KCK */ + u8 tk[16]; /* TPK-TK; only CCMP will be used */ +} ; +#endif + +struct sta_info { + + _lock lock; + _list list; //free_sta_queue + _list hash_list; //sta_hash + //_list asoc_list; //20061114 + //_list sleep_list;//sleep_q + //_list wakeup_list;//wakeup_q + + struct sta_xmit_priv sta_xmitpriv; + struct sta_recv_priv sta_recvpriv; + + _queue sleep_q; + unsigned int sleepq_len; + + uint state; + uint aid; + uint mac_id; + uint qos_option; + u8 hwaddr[ETH_ALEN]; + + uint ieee8021x_blocked; //0: allowed, 1:blocked + uint dot118021XPrivacy; //aes, tkip... + union Keytype dot11tkiptxmickey; + union Keytype dot11tkiprxmickey; + union Keytype dot118021x_UncstKey; + union pn48 dot11txpn; // PN48 used for Unicast xmit. + union pn48 dot11rxpn; // PN48 used for Unicast recv. + + + u8 bssrateset[16]; + u32 bssratelen; + s32 rssi; + s32 signal_quality; + + u8 cts2self; + u8 rtsen; + + u8 raid; + u8 init_rate; + + struct stainfo_stats sta_stats; + +#ifdef CONFIG_TDLS + u8 SNonce[32]; + u8 ANonce[32]; + u32 TDLS_PeerKey_Lifetime; + u16 TPK_count; + _timer TPK_timer; + struct TDLS_PeerKey tpk; + _adapter *padapter; + u8 cam_entry; + u16 stat_code; + u8 off_ch; + u16 ch_switch_time; + u16 ch_switch_timeout; + u8 option; + _workitem option_workitem; + _timer option_timer; + _workitem base_ch_workitem; + _timer base_ch_timer; + _workitem off_ch_workitem; + _timer off_ch_timer; +#endif + + //for A-MPDU TX, ADDBA timeout check + _timer addba_retry_timer; + + //for A-MPDU Rx reordering buffer control + struct recv_reorder_ctrl recvreorder_ctrl[16]; + + //for A-MPDU Tx + //unsigned char ampdu_txen_bitmap; + +#ifdef CONFIG_80211N_HT + struct ht_priv htpriv; +#endif + + //Notes: + //STA_Mode: + //curr_network(mlme_priv/security_priv/qos/ht) + sta_info: (STA & AP) CAP/INFO + //scan_q: AP CAP/INFO + + //AP_Mode: + //curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO + //sta_info: (AP & STA) CAP/INFO + +#ifdef CONFIG_AP_MODE + + _list asoc_list; + _list auth_list; + + unsigned int expire_to; + unsigned int auth_seq; + unsigned int authalg; + unsigned char chg_txt[128]; + + u16 capability; + int flags; + + int dot8021xalg;//0:disable, 1:psk, 2:802.1x + int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 + int wpa_group_cipher; + int wpa2_group_cipher; + int wpa_pairwise_cipher; + int wpa2_pairwise_cipher; + +#ifdef CONFIG_NATIVEAP_MLME + u8 wpa_ie[32]; + + u8 nonerp_set; + u8 no_short_slot_time_set; + u8 no_short_preamble_set; + u8 no_ht_gf_set; + u8 no_ht_set; + u8 ht_20mhz_set; +#endif + + unsigned int tx_ra_bitmap; + u8 qos_info; + + u8 max_sp_len; + u8 uapsd_bk;//BIT(0): Delivery enabled, BIT(1): Trigger enabled + u8 uapsd_be; + u8 uapsd_vi; + u8 uapsd_vo; + + u8 has_legacy_ac; + unsigned int sleepq_ac_len; + +#ifdef CONFIG_P2P + //p2p priv data + u8 is_p2p_device; + u8 p2p_status_code; + + //p2p client info + u8 dev_addr[ETH_ALEN]; + //u8 iface_addr[ETH_ALEN];//= hwaddr[ETH_ALEN] + u8 dev_cap; + u16 config_methods; + u8 primary_dev_type[8]; + u8 num_of_secdev_type; + u8 secdev_types_list[32];// 32/8 == 4; + u16 dev_name_len; + u8 dev_name[32]; +#endif //CONFIG_P2P +#endif + + //for DM + RSSI_STA rssi_stat; + + +}; + + + +struct sta_priv { + + u8 *pallocated_stainfo_buf; + u8 *pstainfo_buf; + _queue free_sta_queue; + + _lock sta_hash_lock; + _list sta_hash[NUM_STA]; + int asoc_sta_count; + _queue sleep_q; + _queue wakeup_q; + + _adapter *padapter; + + +#ifdef CONFIG_AP_MODE + _list asoc_list; + _list auth_list; + + unsigned int auth_to; //sec, time to expire in authenticating. + unsigned int assoc_to; //sec, time to expire before associating. + unsigned int expire_to; //sec , time to expire after associated. + + /* pointers to STA info; based on allocated AID or NULL if AID free + * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1 + * and so on + */ + struct sta_info *sta_aid[NUM_STA]; + + u16 sta_dz_bitmap;//only support 15 stations, staion aid bitmap for sleeping sta. + u16 tim_bitmap;//only support 15 stations, aid=0~15 mapping bit0~bit15 + + u16 max_num_sta; +#endif + +}; + + +__inline static u32 wifi_mac_hash(u8 *mac) +{ + u32 x; + + x = mac[0]; + x = (x << 2) ^ mac[1]; + x = (x << 2) ^ mac[2]; + x = (x << 2) ^ mac[3]; + x = (x << 2) ^ mac[4]; + x = (x << 2) ^ mac[5]; + + x ^= x >> 8; + x = x & (NUM_STA - 1); + + return x; +} + + +extern u32 _rtw_init_sta_priv(struct sta_priv *pstapriv); +extern u32 _rtw_free_sta_priv(struct sta_priv *pstapriv); +extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta); +extern void rtw_free_all_stainfo(_adapter *padapter); +extern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern u32 rtw_init_bcmc_stainfo(_adapter* padapter); +extern struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter); +extern u8 rtw_access_ctrl(struct wlan_acl_pool* pacl_list, u8 * mac_addr); + +#endif //_STA_INFO_H_ diff --git a/drivers/net/wireless/rtl8192c/include/usb_hal.h b/drivers/net/wireless/rtl8192c/include/usb_hal.h new file mode 100755 index 000000000000..1b15d52c8f35 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_hal.h @@ -0,0 +1,30 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __USB_HAL_H__ +#define __USB_HAL_H__ + + +void rtl8192cu_set_hal_ops(_adapter * padapter); + +void rtl8192du_set_hal_ops(_adapter * padapter); + +#endif //__USB_HAL_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/usb_ops.h b/drivers/net/wireless/rtl8192c/include/usb_ops.h new file mode 100755 index 000000000000..8253bb72c57d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_ops.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __USB_OPS_H_ +#define __USB_OPS_H_ + +#include +#include +#include +#include + +#define REALTEK_USB_VENQT_READ 0xC0 +#define REALTEK_USB_VENQT_WRITE 0x40 +#define REALTEK_USB_VENQT_CMD_REQ 0x05 +#define REALTEK_USB_VENQT_CMD_IDX 0x00 + +enum{ + VENDOR_WRITE = 0x00, + VENDOR_READ = 0x01, +}; +#define ALIGNMENT_UNIT 16 +#define MAX_VENDOR_REQ_CMD_SIZE 254 //8188cu SIE Support +#define MAX_USB_IO_CTL_SIZE (MAX_VENDOR_REQ_CMD_SIZE +ALIGNMENT_UNIT) + +#ifdef CONFIG_RTL8192C +void rtl8192cu_set_intf_ops(struct _io_ops *pops); + +void rtl8192cu_recv_tasklet(void *priv); + +void rtl8192cu_xmit_tasklet(void *priv); +#endif + +#ifdef CONFIG_RTL8192D +void rtl8192du_set_intf_ops(struct _io_ops *pops); + +void rtl8192du_recv_tasklet(void *priv); + +void rtl8192du_xmit_tasklet(void *priv); +#endif + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/usb_osintf.h b/drivers/net/wireless/rtl8192c/include/usb_osintf.h new file mode 100755 index 000000000000..8642aa26e794 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_osintf.h @@ -0,0 +1,39 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __USB_OSINTF_H +#define __USB_OSINTF_H + +#include +#include +#include +#include + +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) + + +//uint usb_dvobj_init(_adapter * adapter); +//void usb_dvobj_deinit(_adapter * adapter); + +u8 usbvendorrequest(struct dvobj_priv *pdvobjpriv, RT_USB_BREQUEST brequest, RT_USB_WVALUE wvalue, u8 windex, void* data, u8 datalen, u8 isdirectionin); + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h b/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h new file mode 100755 index 000000000000..72864de53bd4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h @@ -0,0 +1,60 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _USB_VENDOR_REQUEST_H_ +#define _USB_VENDOR_REQUEST_H_ + +//4 Set/Get Register related wIndex/Data +#define RT_USB_RESET_MASK_OFF 0 +#define RT_USB_RESET_MASK_ON 1 +#define RT_USB_SLEEP_MASK_OFF 0 +#define RT_USB_SLEEP_MASK_ON 1 +#define RT_USB_LDO_ON 1 +#define RT_USB_LDO_OFF 0 + +//4 Set/Get SYSCLK related wValue or Data +#define RT_USB_SYSCLK_32KHZ 0 +#define RT_USB_SYSCLK_40MHZ 1 +#define RT_USB_SYSCLK_60MHZ 2 + + +typedef enum _RT_USB_BREQUEST { + RT_USB_SET_REGISTER = 1, + RT_USB_SET_SYSCLK = 2, + RT_USB_GET_SYSCLK = 3, + RT_USB_GET_REGISTER = 4 +} RT_USB_BREQUEST; + + +typedef enum _RT_USB_WVALUE { + RT_USB_RESET_MASK = 1, + RT_USB_SLEEP_MASK = 2, + RT_USB_USB_HRCPWM = 3, + RT_USB_LDO = 4, + RT_USB_BOOT_TYPE = 5 +} RT_USB_WVALUE; + + +//BOOLEAN usbvendorrequest(PCE_USB_DEVICE CEdevice, RT_USB_BREQUEST bRequest, RT_USB_WVALUE wValue, UCHAR wIndex, PVOID Data, UCHAR DataLength, BOOLEAN isDirectionIn); +//BOOLEAN CEusbGetStatusRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT Index, PVOID Data); +//BOOLEAN CEusbFeatureRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT FeatureSelector, IN USHORT Index); +//BOOLEAN CEusbGetDescriptorRequest(PCE_USB_DEVICE CEdevice, IN short urbLength, IN UCHAR DescriptorType, IN UCHAR Index, IN USHORT LanguageId, IN PVOID TransferBuffer, IN ULONG TransferBufferLength); + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/wifi.h b/drivers/net/wireless/rtl8192c/include/wifi.h new file mode 100755 index 000000000000..80875ac6fddf --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/wifi.h @@ -0,0 +1,1148 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _WIFI_H_ +#define _WIFI_H_ + +#include + +#ifdef BIT +//#error "BIT define occurred earlier elsewhere!\n" +#undef BIT +#endif +#define BIT(x) (1 << (x)) + + +#define WLAN_ETHHDR_LEN 14 +#define WLAN_ETHADDR_LEN 6 +#define WLAN_IEEE_OUI_LEN 3 +#define WLAN_ADDR_LEN 6 +#define WLAN_CRC_LEN 4 +#define WLAN_BSSID_LEN 6 +#define WLAN_BSS_TS_LEN 8 +#define WLAN_HDR_A3_LEN 24 +#define WLAN_HDR_A4_LEN 30 +#define WLAN_HDR_A3_QOS_LEN 26 +#define WLAN_HDR_A4_QOS_LEN 32 +#define WLAN_SSID_MAXLEN 32 +#define WLAN_DATA_MAXLEN 2312 + +#define WLAN_A3_PN_OFFSET 24 +#define WLAN_A4_PN_OFFSET 30 + +#define WLAN_MIN_ETHFRM_LEN 60 +#define WLAN_MAX_ETHFRM_LEN 1514 +#define WLAN_ETHHDR_LEN 14 + +#define P80211CAPTURE_VERSION 0x80211001 + +#ifdef GREEN_HILL +#pragma pack(1) +#endif + +enum WIFI_FRAME_TYPE { + WIFI_MGT_TYPE = (0), + WIFI_CTRL_TYPE = (BIT(2)), + WIFI_DATA_TYPE = (BIT(3)), + WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), //!< QoS Data +}; + +enum WIFI_FRAME_SUBTYPE { + + // below is for mgt frame + WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE), + WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE), + WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE), + WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE), + WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE), + WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE), + WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE), + WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE), + WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE), + WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE), + WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE), + WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE), + + // below is for control frame + WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE), + WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), + WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE), + WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE), + WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE), + WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), + + // below is for data frame + WIFI_DATA = (0 | WIFI_DATA_TYPE), + WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE), + WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE), + WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE), + WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE), + WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE), + WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE), + WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE), + WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE), +}; + +enum WIFI_REASON_CODE { + _RSON_RESERVED_ = 0, + _RSON_UNSPECIFIED_ = 1, + _RSON_AUTH_NO_LONGER_VALID_ = 2, + _RSON_DEAUTH_STA_LEAVING_ = 3, + _RSON_INACTIVITY_ = 4, + _RSON_UNABLE_HANDLE_ = 5, + _RSON_CLS2_ = 6, + _RSON_CLS3_ = 7, + _RSON_DISAOC_STA_LEAVING_ = 8, + _RSON_ASOC_NOT_AUTH_ = 9, + + // WPA reason + _RSON_INVALID_IE_ = 13, + _RSON_MIC_FAILURE_ = 14, + _RSON_4WAY_HNDSHK_TIMEOUT_ = 15, + _RSON_GROUP_KEY_UPDATE_TIMEOUT_ = 16, + _RSON_DIFF_IE_ = 17, + _RSON_MLTCST_CIPHER_NOT_VALID_ = 18, + _RSON_UNICST_CIPHER_NOT_VALID_ = 19, + _RSON_AKMP_NOT_VALID_ = 20, + _RSON_UNSUPPORT_RSNE_VER_ = 21, + _RSON_INVALID_RSNE_CAP_ = 22, + _RSON_IEEE_802DOT1X_AUTH_FAIL_ = 23, + + //belowing are Realtek definition + _RSON_PMK_NOT_AVAILABLE_ = 24, + _RSON_TDLS_TEAR_TOOFAR_ = 25, + _RSON_TDLS_TEAR_UN_RSN_ = 26, +}; + +/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */ +#if 0 +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 +#endif +/* IEEE 802.11h */ +#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10 +#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11 +#if 0 +/* IEEE 802.11i */ +#define WLAN_REASON_INVALID_IE 13 +#define WLAN_REASON_MICHAEL_MIC_FAILURE 14 +#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15 +#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16 +#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17 +#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18 +#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19 +#define WLAN_REASON_AKMP_NOT_VALID 20 +#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21 +#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22 +#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23 +#define WLAN_REASON_CIPHER_SUITE_REJECTED 24 +#endif + +enum WIFI_STATUS_CODE { + _STATS_SUCCESSFUL_ = 0, + _STATS_FAILURE_ = 1, + _STATS_CAP_FAIL_ = 10, + _STATS_NO_ASOC_ = 11, + _STATS_OTHER_ = 12, + _STATS_NO_SUPP_ALG_ = 13, + _STATS_OUT_OF_AUTH_SEQ_ = 14, + _STATS_CHALLENGE_FAIL_ = 15, + _STATS_AUTH_TIMEOUT_ = 16, + _STATS_UNABLE_HANDLE_STA_ = 17, + _STATS_RATE_FAIL_ = 18, +}; + +/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */ +#if 0 +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_CAPS_UNSUPPORTED 10 +#define WLAN_STATUS_REASSOC_NO_ASSOC 11 +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 +#define WLAN_STATUS_CHALLENGE_FAIL 15 +#define WLAN_STATUS_AUTH_TIMEOUT 16 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 +#define WLAN_STATUS_ASSOC_DENIED_RATES 18 +#endif +//entended +/* IEEE 802.11b */ +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 +/* IEEE 802.11h */ +#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22 +#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23 +#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24 +/* IEEE 802.11g */ +#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25 +#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26 +#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27 +/* IEEE 802.11w */ +#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30 +#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31 +/* IEEE 802.11i */ +#define WLAN_STATUS_INVALID_IE 40 +#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41 +#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42 +#define WLAN_STATUS_AKMP_NOT_VALID 43 +#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44 +#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45 +#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46 +#define WLAN_STATUS_TS_NOT_CREATED 47 +#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48 +#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49 +#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50 +#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51 +/* IEEE 802.11r */ +#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52 +#define WLAN_STATUS_INVALID_PMKID 53 +#define WLAN_STATUS_INVALID_MDIE 54 +#define WLAN_STATUS_INVALID_FTIE 55 + + +enum WIFI_REG_DOMAIN { + DOMAIN_FCC = 1, + DOMAIN_IC = 2, + DOMAIN_ETSI = 3, + DOMAIN_SPAIN = 4, + DOMAIN_FRANCE = 5, + DOMAIN_MKK = 6, + DOMAIN_ISRAEL = 7, + DOMAIN_MKK1 = 8, + DOMAIN_MKK2 = 9, + DOMAIN_MKK3 = 10, + DOMAIN_MAX +}; + +#define _TO_DS_ BIT(8) +#define _FROM_DS_ BIT(9) +#define _MORE_FRAG_ BIT(10) +#define _RETRY_ BIT(11) +#define _PWRMGT_ BIT(12) +#define _MORE_DATA_ BIT(13) +#define _PRIVACY_ BIT(14) +#define _ORDER_ BIT(15) + +#define SetToDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_TO_DS_); \ + } while(0) + +#define GetToDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_TO_DS_)) != 0) + +#define ClearToDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_TO_DS_)); \ + } while(0) + +#define SetFrDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_FROM_DS_); \ + } while(0) + +#define GetFrDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_FROM_DS_)) != 0) + +#define ClearFrDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)); \ + } while(0) + +#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe)) + + +#define SetMFrag(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_FRAG_); \ + } while(0) + +#define GetMFrag(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_FRAG_)) != 0) + +#define ClearMFrag(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)); \ + } while(0) + +#define SetRetry(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_RETRY_); \ + } while(0) + +#define GetRetry(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_RETRY_)) != 0) + +#define ClearRetry(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_RETRY_)); \ + } while(0) + +#define SetPwrMgt(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_PWRMGT_); \ + } while(0) + +#define GetPwrMgt(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PWRMGT_)) != 0) + +#define ClearPwrMgt(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)); \ + } while(0) + +#define SetMData(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_DATA_); \ + } while(0) + +#define GetMData(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_DATA_)) != 0) + +#define ClearMData(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)); \ + } while(0) + +#define SetPrivacy(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_PRIVACY_); \ + } while(0) + +#define GetPrivacy(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PRIVACY_)) != 0) + +#define ClearPrivacy(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)); \ + } while(0) + + +#define GetOrder(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) + +#define GetFrameType(pbuf) (le16_to_cpu(*(unsigned short *)(pbuf)) & (BIT(3) | BIT(2))) + +#define SetFrameType(pbuf,type) \ + do { \ + *(unsigned short *)(pbuf) &= __constant_cpu_to_le16(~(BIT(3) | BIT(2))); \ + *(unsigned short *)(pbuf) |= __constant_cpu_to_le16(type); \ + } while(0) + +#define GetFrameSubType(pbuf) (cpu_to_le16(*(unsigned short *)(pbuf)) & (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))) + +#define SetFrameSubType(pbuf,type) \ + do { \ + *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))); \ + *(unsigned short *)(pbuf) |= cpu_to_le16(type); \ + } while(0) + +#define GetSequence(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) >> 4) + +#define GetFragNum(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & 0x0f) + +#define GetTupleCache(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22))) + +#define SetFragNum(pbuf, num) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu(~(0x000f))) | \ + cpu_to_le16(0x0f & (num)); \ + } while(0) + +#define SetSeqNum(pbuf, num) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu((unsigned short)~0xfff0)) | \ + le16_to_cpu((unsigned short)(0xfff0 & (num << 4))); \ + } while(0) + +#define SetDuration(pbuf, dur) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)); \ + } while(0) + + +#define SetPriority(pbuf, tid) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(tid & 0xf); \ + } while(0) + +#define GetPriority(pbuf) ((le16_to_cpu(*(unsigned short *)(pbuf))) & 0xf) + +#define SetEOSP(pbuf, eosp) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (eosp & 1) << 4); \ + } while(0) + +#define SetAckpolicy(pbuf, ack) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (ack & 3) << 5); \ + } while(0) + +#define GetAckpolicy(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 5) & 0x3) + +#define GetAMsdu(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 7) & 0x1) + +#define SetAMsdu(pbuf, amsdu) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (amsdu & 1) << 7); \ + } while(0) + +#define GetAid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 2)) & 0x3fff) + +#define GetTid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + (((GetToDs(pbuf)<<1)|GetFrDs(pbuf))==3?30:24))) & 0x000f) + +#define GetAddr1Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 4)) + +#define GetAddr2Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 10)) + +#define GetAddr3Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 16)) + +#define GetAddr4Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 24)) + +#define MacAddr_isBcst(addr) \ +( \ + ( (addr[0] == 0xff) && (addr[1] == 0xff) && \ + (addr[2] == 0xff) && (addr[3] == 0xff) && \ + (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ +) + +__inline static int IS_MCAST(unsigned char *da) +{ + if ((*da) & 0x01) + return _TRUE; + else + return _FALSE; +} + + +__inline static unsigned char * get_da(unsigned char *pframe) +{ + unsigned char *da; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + da = GetAddr1Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + da = GetAddr1Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + da = GetAddr3Ptr(pframe); + break; + default: // ToDs=1, FromDs=1 + da = GetAddr3Ptr(pframe); + break; + } + + return da; +} + + +__inline static unsigned char * get_sa(unsigned char *pframe) +{ + unsigned char *sa; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + sa = GetAddr2Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + sa = GetAddr3Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + sa = GetAddr2Ptr(pframe); + break; + default: // ToDs=1, FromDs=1 + sa = GetAddr4Ptr(pframe); + break; + } + + return sa; +} + +__inline static unsigned char * get_hdr_bssid(unsigned char *pframe) +{ + unsigned char *sa; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + sa = GetAddr3Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + sa = GetAddr2Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + sa = GetAddr1Ptr(pframe); + break; + case 0x03: // ToDs=1, FromDs=1 + sa = GetAddr1Ptr(pframe); + break; + default: + sa =NULL; //??????? + break; + } + + return sa; +} + + +__inline static int IsFrameTypeCtrl(unsigned char *pframe) +{ + if(WIFI_CTRL_TYPE == GetFrameType(pframe)) + return _TRUE; + else + return _FALSE; +} +/*----------------------------------------------------------------------------- + Below is for the security related definition +------------------------------------------------------------------------------*/ +#define _RESERVED_FRAME_TYPE_ 0 +#define _SKB_FRAME_TYPE_ 2 +#define _PRE_ALLOCMEM_ 1 +#define _PRE_ALLOCHDR_ 3 +#define _PRE_ALLOCLLCHDR_ 4 +#define _PRE_ALLOCICVHDR_ 5 +#define _PRE_ALLOCMICHDR_ 6 + +#define _SIFSTIME_ ((priv->pmib->dot11BssType.net_work_type&WIRELESS_11A)?16:10) +#define _ACKCTSLNG_ 14 //14 bytes long, including crclng +#define _CRCLNG_ 4 + +#define _ASOCREQ_IE_OFFSET_ 4 // excluding wlan_hdr +#define _ASOCRSP_IE_OFFSET_ 6 +#define _REASOCREQ_IE_OFFSET_ 10 +#define _REASOCRSP_IE_OFFSET_ 6 +#define _PROBEREQ_IE_OFFSET_ 0 +#define _PROBERSP_IE_OFFSET_ 12 +#define _AUTH_IE_OFFSET_ 6 +#define _DEAUTH_IE_OFFSET_ 0 +#define _BEACON_IE_OFFSET_ 12 +#define _PUBLIC_ACTION_IE_OFFSET_ 8 + +#define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_ + +#define _SSID_IE_ 0 +#define _SUPPORTEDRATES_IE_ 1 +#define _DSSET_IE_ 3 +#define _TIM_IE_ 5 +#define _IBSS_PARA_IE_ 6 +#define _COUNTRY_IE_ 7 +#define _CHLGETXT_IE_ 16 +#define _SUPPORTED_CH_IE_ 36 +#define _CH_SWTICH_ANNOUNCE_ 37 //Secondary Channel Offset +#define _RSN_IE_2_ 48 +#define _SSN_IE_1_ 221 +#define _ERPINFO_IE_ 42 +#define _EXT_SUPPORTEDRATES_IE_ 50 + +#define _HT_CAPABILITY_IE_ 45 +#define _FTIE_ 55 +#define _TIMEOUT_ITVL_IE_ 56 +#define _HT_EXTRA_INFO_IE_ 61 +#define _HT_ADD_INFO_IE_ 61 //_HT_EXTRA_INFO_IE_ + +#define EID_BSSCoexistence 72 // 20/40 BSS Coexistence +#define EID_BSSIntolerantChlReport 73 +#define _RIC_Descriptor_IE_ 75 + +#define _LINK_ID_IE_ 101 +#define _CH_SWITCH_TIMING_ 104 +#define _PTI_BUFFER_STATUS_ 106 +#define _EXT_CAP_IE_ 127 +#define _VENDOR_SPECIFIC_IE_ 221 + +#define _RESERVED47_ 47 + +/* --------------------------------------------------------------------------- + Below is the fixed elements... +-----------------------------------------------------------------------------*/ +#define _AUTH_ALGM_NUM_ 2 +#define _AUTH_SEQ_NUM_ 2 +#define _BEACON_ITERVAL_ 2 +#define _CAPABILITY_ 2 +#define _CURRENT_APADDR_ 6 +#define _LISTEN_INTERVAL_ 2 +#define _RSON_CODE_ 2 +#define _ASOC_ID_ 2 +#define _STATUS_CODE_ 2 +#define _TIMESTAMP_ 8 + +#define AUTH_ODD_TO 0 +#define AUTH_EVEN_TO 1 + +#define WLAN_ETHCONV_ENCAP 1 +#define WLAN_ETHCONV_RFC1042 2 +#define WLAN_ETHCONV_8021h 3 + +#define cap_ESS BIT(0) +#define cap_IBSS BIT(1) +#define cap_CFPollable BIT(2) +#define cap_CFRequest BIT(3) +#define cap_Privacy BIT(4) +#define cap_ShortPremble BIT(5) +#define cap_PBCC BIT(6) +#define cap_ChAgility BIT(7) +#define cap_SpecMgmt BIT(8) +#define cap_QoS BIT(9) +#define cap_ShortSlot BIT(10) + +/*----------------------------------------------------------------------------- + Below is the definition for 802.11i / 802.1x +------------------------------------------------------------------------------*/ +#define _IEEE8021X_MGT_ 1 // WPA +#define _IEEE8021X_PSK_ 2 // WPA with pre-shared key + +/* +#define _NO_PRIVACY_ 0 +#define _WEP_40_PRIVACY_ 1 +#define _TKIP_PRIVACY_ 2 +#define _WRAP_PRIVACY_ 3 +#define _CCMP_PRIVACY_ 4 +#define _WEP_104_PRIVACY_ 5 +#define _WEP_WPA_MIXED_PRIVACY_ 6 // WEP + WPA +*/ + +/*----------------------------------------------------------------------------- + Below is the definition for WMM +------------------------------------------------------------------------------*/ +#define _WMM_IE_Length_ 7 // for WMM STA +#define _WMM_Para_Element_Length_ 24 + + +/*----------------------------------------------------------------------------- + Below is the definition for 802.11n +------------------------------------------------------------------------------*/ + +/* block-ack parameters */ +#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 +#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 +#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 + +//#ifdef CONFIG_80211N_HT + +#define SetOrderBit(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \ + } while(0) + +#define GetOrderBit(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) + + +/** + * struct ieee80211_bar - HT Block Ack Request + * + * This structure refers to "HT BlockAckReq" as + * described in 802.11n draft section 7.2.1.7.1 + */ + #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) +struct ieee80211_bar { + unsigned short frame_control; + unsigned short duration; + unsigned char ra[6]; + unsigned char ta[6]; + unsigned short control; + unsigned short start_seq_num; +} __attribute__((packed)); + #endif + +/* 802.11 BAR control masks */ +#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000 +#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004 + + + #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) + + /** + * struct ieee80211_ht_cap - HT capabilities + * + * This structure refers to "HT capabilities element" as + * described in 802.11n draft section 7.3.2.52 + */ + +struct ieee80211_ht_cap { + unsigned short cap_info; + unsigned char ampdu_params_info; + unsigned char supp_mcs_set[16]; + unsigned short extended_ht_cap_info; + unsigned int tx_BF_cap_info; + unsigned char antenna_selection_info; +} __attribute__ ((packed)); + +/** + * struct ieee80211_ht_cap - HT additional information + * + * This structure refers to "HT information element" as + * described in 802.11n draft section 7.3.2.53 + */ +struct ieee80211_ht_addt_info { + unsigned char control_chan; + unsigned char ht_param; + unsigned short operation_mode; + unsigned short stbc_param; + unsigned char basic_set[16]; +} __attribute__ ((packed)); + + +struct HT_caps_element +{ + union + { + struct + { + unsigned short HT_caps_info; + unsigned char AMPDU_para; + unsigned char MCS_rate[16]; + unsigned short HT_ext_caps; + unsigned int Beamforming_caps; + unsigned char ASEL_caps; + } HT_cap_element; + unsigned char HT_cap[26]; + }; +} __attribute__ ((packed)); + +struct HT_info_element +{ + unsigned char primary_channel; + unsigned char infos[5]; + unsigned char MCS_rate[16]; +} __attribute__ ((packed)); + +struct AC_param +{ + unsigned char ACI_AIFSN; + unsigned char CW; + unsigned short TXOP_limit; +} __attribute__ ((packed)); + +struct WMM_para_element +{ + unsigned char QoS_info; + unsigned char reserved; + struct AC_param ac_param[4]; +} __attribute__ ((packed)); + +struct ADDBA_request +{ + unsigned char dialog_token; + unsigned short BA_para_set; + unsigned short BA_timeout_value; + unsigned short BA_starting_seqctrl; +} __attribute__ ((packed)); + + + +#endif + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_ht_cap { + unsigned short cap_info; + unsigned char ampdu_params_info; + unsigned char supp_mcs_set[16]; + unsigned short extended_ht_cap_info; + unsigned int tx_BF_cap_info; + unsigned char antenna_selection_info; +}; + + +struct ieee80211_ht_addt_info { + unsigned char control_chan; + unsigned char ht_param; + unsigned short operation_mode; + unsigned short stbc_param; + unsigned char basic_set[16]; +}; + +struct HT_caps_element +{ + union + { + struct + { + unsigned short HT_caps_info; + unsigned char AMPDU_para; + unsigned char MCS_rate[16]; + unsigned short HT_ext_caps; + unsigned int Beamforming_caps; + unsigned char ASEL_caps; + } HT_cap_element; + unsigned char HT_cap[26]; + }; +}; + +struct HT_info_element +{ + unsigned char primary_channel; + unsigned char infos[5]; + unsigned char MCS_rate[16]; +}; + +struct AC_param +{ + unsigned char ACI_AIFSN; + unsigned char CW; + unsigned short TXOP_limit; +}; + +struct WMM_para_element +{ + unsigned char QoS_info; + unsigned char reserved; + struct AC_param ac_param[4]; +}; + +struct ADDBA_request +{ + unsigned char dialog_token; + unsigned short BA_para_set; + unsigned short BA_timeout_value; + unsigned short BA_starting_seqctrl; +}; + + +#pragma pack() + +#endif + + +/* 802.11n HT capabilities masks */ +#define IEEE80211_HT_CAP_SUP_WIDTH 0x0002 +#define IEEE80211_HT_CAP_SM_PS 0x000C +#define IEEE80211_HT_CAP_GRN_FLD 0x0010 +#define IEEE80211_HT_CAP_SGI_20 0x0020 +#define IEEE80211_HT_CAP_SGI_40 0x0040 +#define IEEE80211_HT_CAP_TX_STBC 0x0080 +#define IEEE80211_HT_CAP_RX_STBC 0x0300 +#define IEEE80211_HT_CAP_DELAY_BA 0x0400 +#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 +#define IEEE80211_HT_CAP_DSSSCCK40 0x1000 +/* 802.11n HT capability AMPDU settings */ +#define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03 +#define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C +/* 802.11n HT capability MSC set */ +#define IEEE80211_SUPP_MCS_SET_UEQM 4 +#define IEEE80211_HT_CAP_MAX_STREAMS 4 +#define IEEE80211_SUPP_MCS_SET_LEN 10 +/* maximum streams the spec allows */ +#define IEEE80211_HT_CAP_MCS_TX_DEFINED 0x01 +#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF 0x02 +#define IEEE80211_HT_CAP_MCS_TX_STREAMS 0x0C +#define IEEE80211_HT_CAP_MCS_TX_UEQM 0x10 +/* 802.11n HT IE masks */ +#define IEEE80211_HT_IE_CHA_SEC_OFFSET 0x03 +#define IEEE80211_HT_IE_CHA_SEC_NONE 0x00 +#define IEEE80211_HT_IE_CHA_SEC_ABOVE 0x01 +#define IEEE80211_HT_IE_CHA_SEC_BELOW 0x03 +#define IEEE80211_HT_IE_CHA_WIDTH 0x04 +#define IEEE80211_HT_IE_HT_PROTECTION 0x0003 +#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004 +#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 + +/* block-ack parameters */ +#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 +#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 +#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 + +/* + * A-PMDU buffer sizes + * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) + */ +#define IEEE80211_MIN_AMPDU_BUF 0x8 +#define IEEE80211_MAX_AMPDU_BUF 0x40 + + +/* Spatial Multiplexing Power Save Modes */ +#define WLAN_HT_CAP_SM_PS_STATIC 0 +#define WLAN_HT_CAP_SM_PS_DYNAMIC 1 +#define WLAN_HT_CAP_SM_PS_INVALID 2 +#define WLAN_HT_CAP_SM_PS_DISABLED 3 + +#ifdef CONFIG_AP_MODE +#define OP_MODE_PURE 0 +#define OP_MODE_MAY_BE_LEGACY_STAS 1 +#define OP_MODE_20MHZ_HT_STA_ASSOCED 2 +#define OP_MODE_MIXED 3 + +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2)) +#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3)) +#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4)) +#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5)) + +#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \ + ((u16) (0x0001 | 0x0002)) +#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0 +#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2)) +#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3)) +#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4)) + +#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6)) +#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7)) +#define HT_INFO_STBC_PARAM_SECONDARY_BCN ((u16) BIT(8)) +#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9)) +#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10)) +#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11)) +#endif + + +//#endif + +// ===============WPS Section=============== +// For WPSv1.0 +#define WPSOUI 0x0050f204 +// WPS attribute ID +#define WPS_ATTR_VER1 0x104A +#define WPS_ATTR_SIMPLE_CONF_STATE 0x1044 +#define WPS_ATTR_RESP_TYPE 0x103B +#define WPS_ATTR_UUID_E 0x1047 +#define WPS_ATTR_MANUFACTURER 0x1021 +#define WPS_ATTR_MODEL_NAME 0x1023 +#define WPS_ATTR_MODEL_NUMBER 0x1024 +#define WPS_ATTR_SERIAL_NUMBER 0x1042 +#define WPS_ATTR_PRIMARY_DEV_TYPE 0x1054 +#define WPS_ATTR_DEVICE_NAME 0x1011 +#define WPS_ATTR_CONF_METHOD 0x1008 +#define WPS_ATTR_RF_BANDS 0x103C +#define WPS_ATTR_DEVICE_PWID 0x1012 + +// Value of WPS attribute "WPS_ATTR_DEVICE_NAME +#define WPS_MAX_DEVICE_NAME_LEN 32 + +// Value of WPS Response Type Attribute +#define WPS_RESPONSE_TYPE_INFO_ONLY 0x00 +#define WPS_RESPONSE_TYPE_8021X 0x01 +#define WPS_RESPONSE_TYPE_REGISTRAR 0x02 +#define WPS_RESPONSE_TYPE_AP 0x03 + +// Value of WPS WiFi Simple Configuration State Attribute +#define WPS_WSC_STATE_NOT_CONFIG 0x01 +#define WPS_WSC_STATE_CONFIG 0x02 + +// Value of WPS Version Attribute +#define WPS_VERSION_1 0x10 + +// Value of WPS Configuration Method Attribute +#define WPS_CONFIG_METHOD_FLASH 0x0001 +#define WPS_CONFIG_METHOD_ETHERNET 0x0002 +#define WPS_CONFIG_METHOD_LABEL 0x0004 +#define WPS_CONFIG_METHOD_DISPLAY 0x0008 +#define WPS_CONFIG_METHOD_E_NFC 0x0010 +#define WPS_CONFIG_METHOD_I_NFC 0x0020 +#define WPS_CONFIG_METHOD_NFC 0x0040 +#define WPS_CONFIG_METHOD_PBC 0x0080 +#define WPS_CONFIG_METHOD_KEYPAD 0x0100 +#define WPS_CONFIG_METHOD_VPBC 0x0280 +#define WPS_CONFIG_METHOD_PPBC 0x0480 +#define WPS_CONFIG_METHOD_VDISPLAY 0x2008 +#define WPS_CONFIG_METHOD_PDISPLAY 0x4008 + +// Value of Category ID of WPS Primary Device Type Attribute +#define WPS_PDT_CID_MULIT_MEDIA 0x0008 +#define WPS_PDT_CID_RTK_WIDI 0x001E + +// Value of Sub Category ID of WPS Primary Device Type Attribute +#define WPS_PDT_SCID_MEDIA_SERVER 0x0005 +#define WPS_PDT_SCID_RTK_DMP 0x0001 + +// Value of Device Password ID +#define WPS_DPID_PIN 0x0000 +#define WPS_DPID_USER_SPEC 0x0001 +#define WPS_DPID_MACHINE_SPEC 0x0002 +#define WPS_DPID_REKEY 0x0003 +#define WPS_DPID_PBC 0x0004 +#define WPS_DPID_REGISTRAR_SPEC 0x0005 + + +// =====================P2P Section===================== +// For P2P +#define P2POUI 0x506F9A09 + +// P2P Attribute ID +#define P2P_ATTR_STATUS 0x00 +#define P2P_ATTR_MINOR_REASON_CODE 0x01 +#define P2P_ATTR_CAPABILITY 0x02 +#define P2P_ATTR_DEVICE_ID 0x03 +#define P2P_ATTR_GO_INTENT 0x04 +#define P2P_ATTR_CONF_TIMEOUT 0x05 +#define P2P_ATTR_LISTEN_CH 0x06 +#define P2P_ATTR_GROUP_BSSID 0x07 +#define P2P_ATTR_EX_LISTEN_TIMING 0x08 +#define P2P_ATTR_INTENTED_IF_ADDR 0x09 +#define P2P_ATTR_MANAGEABILITY 0x0A +#define P2P_ATTR_CH_LIST 0x0B +#define P2P_ATTR_NOA 0x0C +#define P2P_ATTR_DEVICE_INFO 0x0D +#define P2P_ATTR_GROUP_INFO 0x0E +#define P2P_ATTR_GROUP_ID 0x0F +#define P2P_ATTR_INTERFACE 0x10 +#define P2P_ATTR_OPERATING_CH 0x11 +#define P2P_ATTR_INVITATION_FLAGS 0x12 + +// Value of Status Attribute +#define P2P_STATUS_SUCCESS 0x00 +#define P2P_STATUS_FAIL_INFO_UNAVAILABLE 0x01 +#define P2P_STATUS_FAIL_INCOMPATIBLE_PARAM 0x02 +#define P2P_STATUS_FAIL_LIMIT_REACHED 0x03 +#define P2P_STATUS_FAIL_INVALID_PARAM 0x04 +#define P2P_STATUS_FAIL_REQUEST_UNABLE 0x05 +#define P2P_STATUS_FAIL_PREVOUS_PROTO_ERR 0x06 +#define P2P_STATUS_FAIL_NO_COMMON_CH 0x07 +#define P2P_STATUS_FAIL_UNKNOWN_P2PGROUP 0x08 +#define P2P_STATUS_FAIL_BOTH_GOINTENT_15 0x09 +#define P2P_STATUS_FAIL_INCOMPATIBLE_PROVSION 0x0A +#define P2P_STATUS_FAIL_USER_REJECT 0x0B + +// Value of Inviation Flags Attribute +#define P2P_INVITATION_FLAGS_PERSISTENT BIT(0) + + +// Value of Device Capability Bitmap +#define P2P_DEVCAP_SERVICE_DISCOVERY BIT(0) +#define P2P_DEVCAP_CLIENT_DISCOVERABILITY BIT(1) +#define P2P_DEVCAP_CONCURRENT_OPERATION BIT(2) +#define P2P_DEVCAP_INFRA_MANAGED BIT(3) +#define P2P_DEVCAP_DEVICE_LIMIT BIT(4) +#define P2P_DEVCAP_INVITATION_PROC BIT(5) + +// Value of Group Capability Bitmap +#define P2P_GRPCAP_GO BIT(0) +#define P2P_GRPCAP_PERSISTENT_GROUP BIT(1) +#define P2P_GRPCAP_GROUP_LIMIT BIT(2) +#define P2P_GRPCAP_INTRABSS BIT(3) +#define P2P_GRPCAP_CROSS_CONN BIT(4) +#define P2P_GRPCAP_PERSISTENT_RECONN BIT(5) +#define P2P_GRPCAP_GROUP_FORMATION BIT(6) + +// P2P Public Action Frame ( Management Frame ) +#define P2P_PUB_ACTION_ACTION 0x09 + +// P2P Public Action Frame Type +#define P2P_GO_NEGO_REQ 0 +#define P2P_GO_NEGO_RESP 1 +#define P2P_GO_NEGO_CONF 2 +#define P2P_INVIT_REQ 3 +#define P2P_INVIT_RESP 4 +#define P2P_DEVDISC_REQ 5 +#define P2P_DEVDISC_RESP 6 +#define P2P_PROVISION_DISC_REQ 7 +#define P2P_PROVISION_DISC_RESP 8 + +// P2P Action Frame Type +#define P2P_NOTICE_OF_ABSENCE 0 +#define P2P_PRESENCE_REQUEST 1 +#define P2P_PRESENCE_RESPONSE 2 +#define P2P_GO_DISC_REQUEST 3 + + +#define P2P_MAX_PERSISTENT_GROUP_NUM 10 + +#define P2P_PROVISIONING_SCAN_CNT 3 + +#define P2P_WILDCARD_SSID_LEN 7 +#define P2P_FINDPHASE_EX_CNT 3 + +#define P2P_PROVISION_TIMEOUT 5000 // 5 seconds timeout for sending the provision discovery request +#define P2P_GO_NEGO_TIMEOUT 5000 // 5 seconds timeout for receiving the group negotation response +#define P2P_TX_PRESCAN_TIMEOUT 100 // 100ms + +#define P2P_MAX_INTENT 15 + +#define P2P_MAX_NOA_NUM 2 + +// WPS Configuration Method +#define WPS_CM_NONE 0x0000 +#define WPS_CM_LABEL 0x0004 +#define WPS_CM_DISPLYA 0x0008 +#define WPS_CM_EXTERNAL_NFC_TOKEN 0x0010 +#define WPS_CM_INTEGRATED_NFC_TOKEN 0x0020 +#define WPS_CM_NFC_INTERFACE 0x0040 +#define WPS_CM_PUSH_BUTTON 0x0080 +#define WPS_CM_KEYPAD 0x0100 +#define WPS_CM_SW_PUHS_BUTTON 0x0280 +#define WPS_CM_HW_PUHS_BUTTON 0x0480 +#define WPS_CM_SW_DISPLAY_PIN 0x2008 +#define WPS_CM_LCD_DISPLAY_PIN 0x4008 + +enum P2P_ROLE { + P2P_ROLE_DISABLE = 0, + P2P_ROLE_DEVICE = 1, + P2P_ROLE_CLIENT = 2, + P2P_ROLE_GO = 3 +}; + +enum P2P_STATE { + P2P_STATE_NONE = 0, // P2P disable + P2P_STATE_IDLE = 1, // P2P had enabled and do nothing + P2P_STATE_LISTEN = 2, // In pure listen state + P2P_STATE_SCAN = 3, // In scan phase + P2P_STATE_FIND_PHASE_LISTEN = 4, // In the listen state of find phase + P2P_STATE_FIND_PHASE_SEARCH = 5, // In the search state of find phase + P2P_STATE_TX_PROVISION_DIS_REQ = 6, // In P2P provisioning discovery + P2P_STATE_RX_PROVISION_DIS_RSP = 7, + P2P_STATE_RX_PROVISION_DIS_REQ = 8, + P2P_STATE_GONEGO_ING = 9, // Doing the group owner negoitation handshake + P2P_STATE_GONEGO_OK = 10, // finish the group negoitation handshake with success + P2P_STATE_GONEGO_FAIL = 11, // finish the group negoitation handshake with failure + P2P_STATE_RECV_INVITE_REQ = 12, // receiving the P2P Inviation request + P2P_STATE_PROVISIONING_ING = 13, // Doing the P2P WPS + P2P_STATE_PROVISIONING_DONE = 14, // Finish the P2P WPS +}; + +enum P2P_WPSINFO { + P2P_NO_WPSINFO = 0, + P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1, + P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2, + P2P_GOT_WPSINFO_PBC = 3, +}; + +#define P2P_PRIVATE_IOCTL_SET_LEN 64 + +enum P2P_PROTO_WK_ID +{ + P2P_FIND_PHASE_WK = 0, + P2P_RESTORE_STATE_WK = 1, +}; + +enum P2P_PS +{ + P2P_PS_DISABLE=0, + P2P_PS_ENABLE=1, + P2P_PS_SCAN=2, + P2P_PS_SCAN_DONE=3, + P2P_PS_ALLSTASLEEP=4, // for owner +}; + +#endif // _WIFI_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h b/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h new file mode 100755 index 000000000000..3c6f9b3ac7dc --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h @@ -0,0 +1,435 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __WLAN_BSSDEF_H__ +#define __WLAN_BSSDEF_H__ + + +#define MAX_IE_SZ 768 + + +#ifdef PLATFORM_LINUX + +#define NDIS_802_11_LENGTH_SSID 32 +#define NDIS_802_11_LENGTH_RATES 8 +#define NDIS_802_11_LENGTH_RATES_EX 16 + +typedef unsigned char NDIS_802_11_MAC_ADDRESS[6]; +typedef long NDIS_802_11_RSSI; // in dBm +typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates +typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates + + +typedef ULONG NDIS_802_11_KEY_INDEX; +typedef unsigned long long NDIS_802_11_KEY_RSC; + + +typedef struct _NDIS_802_11_SSID +{ + ULONG SsidLength; + UCHAR Ssid[32]; +} NDIS_802_11_SSID, *PNDIS_802_11_SSID; + +typedef enum _NDIS_802_11_NETWORK_TYPE +{ + Ndis802_11FH, + Ndis802_11DS, + Ndis802_11OFDM5, + Ndis802_11OFDM24, + Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; + +typedef struct _NDIS_802_11_CONFIGURATION_FH +{ + ULONG Length; // Length of structure + ULONG HopPattern; // As defined by 802.11, MSB set + ULONG HopSet; // to one if non-802.11 + ULONG DwellTime; // units are Kusec +} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; + + +/* + FW will only save the channel number in DSConfig. + ODI Handler will convert the channel number to freq. number. +*/ +typedef struct _NDIS_802_11_CONFIGURATION +{ + ULONG Length; // Length of structure + ULONG BeaconPeriod; // units are Kusec + ULONG ATIMWindow; // units are Kusec + ULONG DSConfig; // Frequency, units are kHz + NDIS_802_11_CONFIGURATION_FH FHConfig; +} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; + + + +typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE +{ + Ndis802_11IBSS, + Ndis802_11Infrastructure, + Ndis802_11AutoUnknown, + Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound + Ndis802_11APMode +} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; + + + + + +typedef struct _NDIS_802_11_FIXED_IEs +{ + UCHAR Timestamp[8]; + USHORT BeaconInterval; + USHORT Capabilities; +} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; + + + +typedef struct _NDIS_802_11_VARIABLE_IEs +{ + UCHAR ElementID; + UCHAR Length; + UCHAR data[1]; +} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; + + + +/* + + + +Length is the 4 bytes multiples of the sume of + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) ++ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) ++ sizeof (NDIS_802_11_RATES_EX) + IELength + +Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the +partial sum. + +*/ +#if 0 +typedef struct _NDIS_WLAN_BSSID_EX +{ + ULONG Length; + NDIS_802_11_MAC_ADDRESS MacAddress; + UCHAR Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity; + NDIS_802_11_SSID Ssid; + ULONG Privacy; + NDIS_802_11_RSSI Rssi; + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + ULONG IELength; + UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) +} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; + + +typedef struct _NDIS_802_11_BSSID_LIST_EX +{ + ULONG NumberOfItems; + NDIS_WLAN_BSSID_EX Bssid[1]; +} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; +#endif + +typedef enum _NDIS_802_11_AUTHENTICATION_MODE +{ + Ndis802_11AuthModeOpen, + Ndis802_11AuthModeShared, + Ndis802_11AuthModeAutoSwitch, + Ndis802_11AuthModeWPA, + Ndis802_11AuthModeWPAPSK, + Ndis802_11AuthModeWPANone, + Ndis802_11AuthModeMax // Not a real mode, defined as upper bound +} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; + +typedef enum _NDIS_802_11_WEP_STATUS +{ + Ndis802_11WEPEnabled, + Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, + Ndis802_11WEPDisabled, + Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, + Ndis802_11WEPKeyAbsent, + Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, + Ndis802_11WEPNotSupported, + Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, + Ndis802_11Encryption2Enabled, + Ndis802_11Encryption2KeyAbsent, + Ndis802_11Encryption3Enabled, + Ndis802_11Encryption3KeyAbsent +} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, + NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; + + +#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 +#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 +#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 + +#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 +#define NDIS_802_11_AI_RESFI_STATUSCODE 2 +#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 + +typedef struct _NDIS_802_11_AI_REQFI +{ + USHORT Capabilities; + USHORT ListenInterval; + NDIS_802_11_MAC_ADDRESS CurrentAPAddress; +} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; + +typedef struct _NDIS_802_11_AI_RESFI +{ + USHORT Capabilities; + USHORT StatusCode; + USHORT AssociationId; +} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; + +typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION +{ + ULONG Length; + USHORT AvailableRequestFixedIEs; + NDIS_802_11_AI_REQFI RequestFixedIEs; + ULONG RequestIELength; + ULONG OffsetRequestIEs; + USHORT AvailableResponseFixedIEs; + NDIS_802_11_AI_RESFI ResponseFixedIEs; + ULONG ResponseIELength; + ULONG OffsetResponseIEs; +} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; + +typedef enum _NDIS_802_11_RELOAD_DEFAULTS +{ + Ndis802_11ReloadWEPKeys +} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; + + +// Key mapping keys require a BSSID +typedef struct _NDIS_802_11_KEY +{ + ULONG Length; // Length of this structure + ULONG KeyIndex; + ULONG KeyLength; // length of key in bytes + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_KEY_RSC KeyRSC; + UCHAR KeyMaterial[32]; // variable length depending on above field +} NDIS_802_11_KEY, *PNDIS_802_11_KEY; + +typedef struct _NDIS_802_11_REMOVE_KEY +{ + ULONG Length; // Length of this structure + ULONG KeyIndex; + NDIS_802_11_MAC_ADDRESS BSSID; +} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; + +typedef struct _NDIS_802_11_WEP +{ + ULONG Length; // Length of this structure + ULONG KeyIndex; // 0 is the per-client key, 1-N are the global keys + ULONG KeyLength; // length of key in bytes + UCHAR KeyMaterial[16];// variable length depending on above field +} NDIS_802_11_WEP, *PNDIS_802_11_WEP; + +typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST +{ + ULONG Length; // Length of structure + NDIS_802_11_MAC_ADDRESS Bssid; + ULONG Flags; +} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; + +typedef enum _NDIS_802_11_STATUS_TYPE +{ + Ndis802_11StatusType_Authentication, + Ndis802_11StatusType_MediaStreamMode, + Ndis802_11StatusType_PMKID_CandidateList, + Ndis802_11StatusTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; + +typedef struct _NDIS_802_11_STATUS_INDICATION +{ + NDIS_802_11_STATUS_TYPE StatusType; +} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; + +// mask for authentication/integrity fields +#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f +#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 +#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 +#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 +#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E + +// MIC check time, 60 seconds. +#define MIC_CHECK_TIME 60000000 + +typedef struct _NDIS_802_11_AUTHENTICATION_EVENT +{ + NDIS_802_11_STATUS_INDICATION Status; + NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; +} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; + +typedef struct _NDIS_802_11_TEST +{ + ULONG Length; + ULONG Type; + union + { + NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; + NDIS_802_11_RSSI RssiTrigger; + }tt; +} NDIS_802_11_TEST, *PNDIS_802_11_TEST; + + +#endif //end of #ifdef PLATFORM_LINUX + +#ifndef Ndis802_11APMode +#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1) +#endif + +typedef struct _WLAN_PHY_INFO +{ + u8 SignalStrength;//(in percentage) + u8 SignalQuality;//(in percentage) + u8 Optimum_antenna; //for Antenna diversity + u8 Reserved_0; +}WLAN_PHY_INFO,*PWLAN_PHY_INFO; + +typedef struct _WLAN_BSSID_EX +{ + ULONG Length; + NDIS_802_11_MAC_ADDRESS MacAddress; + UCHAR Reserved[2];//[0]: IS beacon frame + NDIS_802_11_SSID Ssid; + ULONG Privacy; + NDIS_802_11_RSSI Rssi;//(in dBM,raw data ,get from PHY) + NDIS_802_11_RSSI Rssi_prev; + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + WLAN_PHY_INFO PhyInfo; + ULONG IELength; + UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) +} WLAN_BSSID_EX, *PWLAN_BSSID_EX; + +__inline static uint get_WLAN_BSSID_EX_sz(WLAN_BSSID_EX *bss) +{ + uint t_len; + + t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) + + sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + + sizeof (NDIS_802_11_CONFIGURATION) + + sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + + sizeof (NDIS_802_11_RATES_EX)+ + //all new member add here + sizeof(WLAN_PHY_INFO)+ + //all new member add here + sizeof (ULONG) + bss->IELength; + return t_len; + +} + +struct wlan_network { + _list list; + int network_type; //refer to ieee80211.h for WIRELESS_11A/B/G + int fixed; // set to fixed when not to be removed as site-surveying + unsigned long last_scanned; //timestamp for the network + int aid; //will only be valid when a BSS is joinned. + int join_res; + WLAN_BSSID_EX network; //must be the last item +#ifdef PLATFORM_WINDOWS + unsigned char iebuf[MAX_IE_SZ]; +#endif + +}; + +enum VRTL_CARRIER_SENSE +{ + DISABLE_VCS, + ENABLE_VCS, + AUTO_VCS +}; + +enum VCS_TYPE +{ + NONE_VCS, + RTS_CTS, + CTS_TO_SELF +}; + + + + +#define PWR_CAM 0 +#define PWR_MINPS 1 +#define PWR_MAXPS 2 +#define PWR_UAPSD 3 +#define PWR_VOIP 4 + + +enum UAPSD_MAX_SP +{ + NO_LIMIT, + TWO_MSDU, + FOUR_MSDU, + SIX_MSDU +}; + + +//john +#define NUM_PRE_AUTH_KEY 16 +#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY + +/* +* WPA2 +*/ + +#ifndef PLATFORM_OS_CE +typedef struct _PMKID_CANDIDATE { + NDIS_802_11_MAC_ADDRESS BSSID; + ULONG Flags; +} PMKID_CANDIDATE, *PPMKID_CANDIDATE; + +typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST +{ + ULONG Version; // Version of the structure + ULONG NumCandidates; // No. of pmkid candidates + PMKID_CANDIDATE CandidateList[1]; +} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST; + + +typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION +{ + NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; + NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported; + +} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION; + +typedef struct _NDIS_802_11_CAPABILITY +{ + ULONG Length; + ULONG Version; + ULONG NoOfPMKIDs; + ULONG NoOfAuthEncryptPairsSupported; + NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1]; + +} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY; +#endif + + +#endif //#ifndef WLAN_BSSDEF_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/xmit_osdep.h b/drivers/net/wireless/rtl8192c/include/xmit_osdep.h new file mode 100755 index 000000000000..7d28d43a5378 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/xmit_osdep.h @@ -0,0 +1,90 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __XMIT_OSDEP_H_ +#define __XMIT_OSDEP_H_ + +#include +#include +#include + +struct pkt_file { + _pkt *pkt; + SIZE_T pkt_len; //the remainder length of the open_file + _buffer *cur_buffer; + u8 *buf_start; + u8 *cur_addr; + SIZE_T buf_len; +}; + +#ifdef PLATFORM_WINDOWS + +#ifdef PLATFORM_OS_XP +#ifdef CONFIG_USB_HCI +#include +#include +#include +#endif +#endif + +#define NR_XMITFRAME 128 + +#define ETH_ALEN 6 + +extern NDIS_STATUS rtw_xmit_entry( +IN _nic_hdl cnxt, +IN NDIS_PACKET *pkt, +IN UINT flags +); + +#endif + + +#ifdef PLATFORM_LINUX + +#define NR_XMITFRAME 256 + +struct xmit_priv; +struct pkt_attrib; +struct sta_xmit_priv; +struct xmit_frame; +struct xmit_buf; + +extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); + +#endif + +void rtw_os_xmit_schedule(_adapter *padapter); + +int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz); +void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz); + +extern void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib); + +extern uint rtw_remainder_len(struct pkt_file *pfile); +extern void _rtw_open_pktfile(_pkt *pkt, struct pkt_file *pfile); +extern uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen); +extern sint rtw_endofpktfile (struct pkt_file *pfile); + +extern void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt); +extern void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe); + +#endif // + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu b/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu new file mode 100644 index 000000000000..67a571925367 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu @@ -0,0 +1,1442 @@ +begin 644 os_dep/linux/ioctl_linux.o +M?T5,1@$!`0````````````$`*``!```````````````DF@``````!30````` +M`"@`$0`.`#`P0.)S,._F"0!3XS``0)(>_R^183!`XG,P[^8%`%/C5P!`DA[_ +M+Y%!,$#B`RD.5L,)/E"``3 +MXP(PH!,`,((5"P``&D``$^,!```:(``3XP(```H!,*#C`#""Y00``.H0`!/C +M`S"@$P`P@A4`,*`#`#""!0``H.,>_R_A!$`MY>!"D.5L,)3E`0`3XP8```IZ +M-0'CTS"4X0`P8^(`,(+E`#"@XP0PPN4$``#J`#"@XP`P@N4$,,+E`3"@XP4P +MPN4``*#C$`"]Z![_+^$`,-#E``!3XP@```H!`%/A`P``&@@``.H,`(#B`0!3 +MX04```H,,-#E``!3X_G__QH``%/B`0"@$Q[_+^$!`*#C'O\OX>`2D.5(.@+C +MLS"1X0`P@N4``*#C!`#"Y1[_+^$$0"WEX$*0Y04PTN4``%/C!```"BHI`.,, +M-`'C`R"$YP``H.,(``#J`#"2Y0$<0^(J*`#C`@!1X14`X(,!,,.3#"0!DP(P +MA)<``*"3$`"]Z![_+^'@$I#E##0!XP,PD><`,(+E``"@XP0`PN4>_R_A!S"@ +MXP`P@N4``*#C!`#"Y0$PH.,%,,+E'O\OX0``H.,``(+E!`#"Y0$PH.,%,,+E +M'O\OX1!`+>D(T$WBX$*0Y0X`D^@`,(WE!`"@X?\_#^,/,$#C4,4#XP_@H.$, +M\)3G``"@XPC0C>(0@+WH``#@XQ[_+^$``.#C'O\OX0``H.,>_R_A``"@XQ[_ +M+^$``*#C'O\OX0``H.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A``"@ +MXQ[_+^$$0"WEX$*0Y6PPE.4!`!/C!P``&@`PH.,J)@/C`C#$YRLF`^,",,3G +M+"8#XP(PQ.<+``#J?#4!XP,0U.=^-0'C`R#4YWHU`>/3`)3A*S8#XP,`Q.G@4I#E`F"@X8@U`^,#$)7G`3!RX@`PH#,``%'C`3"#$P``4^,50.`3&@`` +M&@!`DN4"`%3C$```B@11A>`$4(7B!#"VY0`PA>4`,`#C`#!`XP`@EN4$(8/G +M````XP``0.,`$`#C`!!`XP0@H.$`,)7E_O__ZP!`H.,&``#J````XP``0.,` +M$`#C`!!`XP0@H.'^___K`$"@XP0`H.%P@+WH$$`MZ>!"D.4#,`'B`P!3XPP` +M`!K,`)_E_O__ZP`PH.,4*P'C`C"$YP(0H.,$($+B`A"$YP$0@>+:+T+B`A"$ +MYP-`H.$E``#J`@`1XPL```J4`)_E_O__ZP`PH.,4*P'C`C"$YP$@H.,0&P'C +M`2"$Y]H?0>(!((3G`T"@X1<``.H!`!'C"@``"A`[`>,#,)3G`P!3XP!`H(,` +M,*"3$"L!DP(PA)>H)P&3`C"$EP-`H)$*``#J!``1XP0```H```#C``!`X_[_ +M_^L`0*#C`P``Z@```.,``$#C_O__ZQ5`X.,$`*#A$("]Z"P```!\````\$\M +MZ1S03>(`0*#A$Q"@XQ<@C>(8-0/C#^"@X0/PD.<```#C``!`X_[__^L7@-WE +M`P!8XP``6!,`@*`3`8"@`P``6.,!@*`3`H"@`P!0H.,!<*#C`*``XP"@0.,` +MD`#C`)!`XP!@`.,`8$#CQ`"?Y040H.'^___K!["@X0`PH..(`8WI!8"@X09P +MH.$$8*#A`T"@X08`H.$($*#A!""@X0`PX.-,Q0/C#^"@X0SPEN<`4*#ARS^@ +MX2,_H.$#((O@`R`"X@(P8^`!`%/C`@``&@H`H.$$$*#A_O__ZP<`H.$%$*#A +M_O__ZP,P"^(!L(OB``!3XP$``!H)`*#A_O__ZP%`A.(!#%3CX?__&@A0H.$, +M@)WE!D"@X0=@H.$(<)WE`7R'X@%0A>((`%7ASO__NAS0C>+PC[WH$`$``'!` +M+>D#0*#AX%*0Y04`H.$&`)/H_S\/XP\P0.-,Q0/C#^"@X0SPE><`4*#A!`"@ +MX0`0`.,`$$#C!2"@X?[__^L``*#C<("]Z/!/+>FKWTWB`G"@X0.`H.'@HI#E +M:CT/X_\_3^,`0*#CJB^-XK-`@N%H/0_C_S]/X[-`@N&*#XWB!!"@X8`@H./^ +M___K*`"-X@00H.$"+*#C_O__ZP`0E^6T8-?A#<"@X7\]S.,_,,/C"$"3Y090 +MD>`$4-4P`$"@,P``5.,&```:"`"@X08@H.'^___K``!0XPT`X!/$`0`:!@`` +MZ@``5N,$```*"`"@X080H.'^___K#0#@X[P!`.H`0*#C%$"-Y1A`C>4<0(WE +M)("-Y>`&G^7@%I_E"""@X?[__^L$4*#A)&"-XM"6G^44L(WB`P``Z@P`5>,& +M```*!4"+YP10A>(&`*#A"1"@X?[__^L`0%#B]O__&AA0G>4``%7CH0$`"AR0 +MG>4``%GCG@$`"A1`G>4$`*#AA!:?Y?[__^L``%#C6@``&G@&G^4$$*#A_O__ +MZPH`H.$`$*#C@""@XXH_C>+^___K`0!0XQ```!I4!I_E_O__ZP@`H.$`$*#C +M!""@X_[__^M`!I_E_O__ZP@`H.$X%I_E"""@X?[__^L`4*#C++:?Y2RFG^4L +MEI_E`P``ZB@&G^7^___K#0#@XWH!`.H+`*#A!1"@X?[__^L(`*#A#!:?Y0@@ +MH.$%,*#A_O__ZXI/C>(%0(3@`&"@XPH`H.$`$-3E_O__ZP@`H.$)$*#A"""@ +MX0$PU.3^___K`6"&X@@`5N/T__\:R`6?Y?[__^L(`*#AP!6?Y0@@H.'^___K +MJB^-X@5`@N!X0$3B"```Z@H`H.$!$%3E_O__ZP@`H.$)$*#A"""@X0$P5.7^ +M___K`6"&X@%`A.(0`%;C\___&G@%G^7^___K"`"@X7`5G^4((*#A_O__ZQ!0 +MA>*``%7CRO__&E0%G^7^___K"`"@X?[__^NT`,?A``"@XSX!`.H$`*#A/!6? +MY?[__^L``%#C6```&B!`C>(%`*#A!!"@X1`@H./^___K<&#_Y@:PH.$4!9_E +M!A"@X?[__^L)`*#A!!"@X0H@H./^___K<%#_Y@``5>,G`0`*#%"-Y>P$G^4% +M$*#A_O__ZVI-#^/_3T_C`!"@XP`0C>4*`*#A`R"@XZK/C>($,(S@_O__ZP:P +MA>"J+XWBM$"2X00`6^$#``#:K`2?Y?[__^L-`.#C$@$`Z@H`H.$&$*#A!2"@ +MX8H_C>+^___K``!0XP(``!J$!)_E_O__ZP$``.I\!)_E_O__ZP@`H.$`$*#C +M!""@X_[__^L`0*#C9&2?Y8I?C>)@I)_E8)2?Y6"TG^4.``#J!@"@X000U>?^ +M___K"`"@X0H0H.$((*#A!##5Y_[__^L)`*#A_O__ZP@`H.$+$*#A"""@X?[_ +M_^L!0(3B##"=Y0,`5.'M__^Z"`"@X?[__^L!`(#BM`#'X00$G^4($*#A_O__ +MZP``H./@``#J!`"@X?`3G^7^___K``!0XST``!HH,(WB`#"-Y0H`H.$`$*#C +M`2"@X0(\H./^___K``!0XP,``!IX`Y_E_O__ZPT`X./.``#JL`.?Y?[__^L( +M`*#A`!"@XP0@H./^___K`$"@XRA0C>)08Y_E4*.?Y8R3G^6,LY_E````XP`` +M0.,$$-7G_O__ZP@`H.$`$`#C`!!`XP@@H.$$,-7G_O__ZP\P!.(/`%/C!@`` +M&@D`H.'^___K"`"@X0L0H.$((*#A_O__ZP@``.H',`3B!P!3XP4``!H&`*#A +M_O__ZP@`H.$*$*#A"""@X?[__^L!0(3B`@Q4X]___QH(`*#A_O__Z[0`Q^$` +M`*#CG0``Z@0`H.'T$I_E_O__ZP``4.,\```::DT/X_]/3^,`$*#C`!"-Y0H` +MH.$#(*#CJL^-X@0PC.#^___KJB^-XK1`DN$5`%3C`P``RH`"G^7^___K#0#@ +MXX<``.H*`*#A%A"@XP8@H..*/XWB_O__ZP``4.,"```:6`*?Y?[__^L!``#J +M4`*?Y?[__^L(`*#A`!"@XP0@H./^___K`$"@XSABG^6*7XWB-**?Y322G^4T +MLI_E!@"@X000U>?^___K"`"@X0H0H.$((*#A!##5Y_[__^L)`*#A_O__ZP@` +MH.$+$*#A"""@X?[__^L!0(3B!@!4X^[__QH(`*#A_O__Z[0`Q^$``*#C6P`` +MZ@0`H.'P$9_E_O__ZP``4.,\```::DT/X_]/3^,`$*#C`!"-Y0H`H.$#(*#C +MJL^-X@0PC.#^___KJB^-XK1`DN$)`%3C`P``RG@!G^7^___K#0#@XT4``.H* +M`*#A"A"@XP0@H..*/XWB_O__ZP``4.,"```:4`&?Y?[__^L!``#J2`&?Y?[_ +M_^L(`*#A`!"@XP0@H./^___K`$"@XS!AG^6*7XWB+*&?Y2R1G^4LL9_E!@"@ +MX000U>?^___K"`"@X0H0H.$((*#A!##5Y_[__^L)`*#A_O__ZP@`H.$+$*#A +M"""@X?[__^L!0(3B!`!4X^[__QH(`*#A_O__Z[0`Q^$``*#C&0``Z@0`H.'L +M$)_E_O__ZP``4.,``*`3$P``&@H`H.$0$(WB_O__ZPH`H.'^___K:#T/X_\_ +M3^.JSXWBLT"A``0``#````$P!``!0`0``6`$``&P!``"$`0`` +MF`$``,`!``#8`0``X`$``*`!``#,`0``Z`$``.P!```T`0``\`$``/0!``#\ +M`0``"`(``!0"```T`@``4`(``&@"``!P`@``?`(``(`"``"$`@``D`(``)@" +M``#(`@``S`(``-0"``#8`@``X`(``.@"``#P02WI"-!-X@.`H.'@($(*#C_O__ZP(``.H$`(WB!!"@X_[__^N(-0/C`S"7YP%@=N(` +M8*`S``!3XP%@AA,``%;C%4#@$RH``!H$0)WE``!4XP`PV`4$,(T%H`"?Y:`0 +MG^4$()WE_O__ZP0PG>4!`%/C"```&JPT`^,#,)?G``!3XQH```H'`*#A"1"@ +MXS/_+^$`0*#C%@``Z@(`4^,(```:K#0#XP,PE^<``%/C#P``"@<`H.$*$*#C +M,_\OX0!`H.,+``#J`P!3XP@``!JL-`/C`S"7YP``4^,$```*!P"@X0P0H.,S +M_R_A`$"@XP```.H`0*#C!`"@X0C0C>+P@;WH"`,``"````#P12WIJ=]-XN"B +MD.4`0*#C#$"-Y1!`C>440(WE:BT/X_\O3^,J'HWBLD"!X1PPC>4```#C``!` +MXT`4G^4#(*#A_O__ZQQ@C>(`<`#C`'!`XPR`C>(#``#J#`!4XP8```H$4(CG +M!$"$X@8`H.$'$*#A_O__ZP!04.+V__\:$$"=Y0``5./X```*%&"=Y0``5N/U +M```*#%"=Y04`H.$`$`#C`!!`X_[__^L``%#C/0``&@0`H.$8$(WB$""@X_[_ +M_^MP@._FN`.?Y0@0H.'^___K!@"@X?[__^N@<+#AY```"J`#G^4'$*#A_O__ +MZY@#G^4&$*#A_O__ZP!0H.,B3HWB!```Z@(`5N4!$%;E_O__ZP4`Q.'W__\Z:DT/X_]/3^,`$*#C`!"-Y0H`H.$#(*#C*LZ-X@0PC.#^ +M___K!S"(X"H>C>*T0)'A!`!3X0,``)HL`Y_E_O__ZPT`X./"``#J"@"@X0@0 +MH.%W(/_F(CZ-XO[__^L``%#C`P``&@0#G^7^___K#0#@X[<``.KX`I_E_O__ +MZP``H..S``#J!0"@X0`0`.,`$$#C_O__ZP``4.,M```:!`"@X1@0C>(0(*#C +M_O__ZW"`[^:H`I_E"!"@X?[__^L&`*#A_O__ZZ!PL.&@```*I`*?Y0<0H.'^ +M___KB`*?Y080H.'^___K`%"@XR!`C>($``#J`@!6Y0$05N7^___K!0#$YP%0 +MA>("8(;B!P!5X??__SH@,(WB`#"-Y0H`H.$!$*#C"""@X74!$-7E_O__ZP8`Q.C>*T0)'A!`!3X0,``)I8`9_E +M_O__ZPT`X.--``#J"@"@X180H.-W(/_F(CZ-XO[__^L``%#C`P``&C`!G^7^ +M___K#0#@XT(``.H```#C``!`X_[__^L``*#C/0``Z@4`H.$`$`#C`!!`X_[_ +M_^L``%#C``"@$S8``!H$`*#A_O__ZZ!PL.$Q```*V`"?Y000H.'^___K!%"@ +MX0!@H.,B3HWB!```Z@(`5>4!$%7E_O__ZP8`Q.C>*T +M0)'A!`!3X0,``)IH`)_E_O__ZPT`X.,1``#J"@"@X0H0H.-W(/_F(CZ-XO[_ +M_^L``%#C`P``&D``G^7^___K#0#@XP8``.HT`)_E_O__ZP``H.,"``#J%0#@ +MXP```.H-`.#CJ=^-XO"%O>@P````_`$```@"```H`P``/`,``%`#``!L`P`` +MD`,``*`!``"8`@``H`,``/!`+>D4T$WB`D"@X>!BD.4```#C``!`X[01G^7^ +M___K`#``XP`P0.,`4-/E``!5XP@``!H#4*#A`#``XP`P0.,%`*#A`!"3Y1`@ +MH./^___K`#"@XP\PQ>6T,-3A$`!3XU<``(H`$)3E#2"@X7\]PN,_,,/C"%"3 +MY1!`D>(%0-0P`%"@,P``5>,%```:#0"@X1`@H./^___K``!0XT@``!H$``#J +M#0"@X1`0H./^___K#4#@XT,``.H8`9_E$!&?Y10AG^4-,*#A_O__ZP8`H.$- +M$*#A_O__ZP!`4.(Y```:^`"?Y?[__^OL`)_E\!"?Y0D@H./^___K`0!0XP@` +M`!K44)_E$'#5Y:@T`^,#<,;G!@"@X?[__^L14-7E53(#XP-0QN>P4)_E#7"@ +MX04`H.$-$*#A$""@X_[__^L`,*#C#S#%Y0T`H.&4$)_E"2"@X_[__^L!`%#C +M&@``&H0`G^5L$)_E_O__ZP8`H.$!$*#C_O__ZZPT`^,#,);G``!3XP(```H& +M`*#A!Q"@XS/_+^%$4)_EJ#0#XP,@UN<0(,7E`'"@XP-PQN<&`*#A_O__ZU4R +M`^,#(-;G$2#%Y0-PQN<```#J#4#@XP0`H.$4T(WB\("]Z$0```#4`P`````` +M`/@#```4!```(`0``'!`+>D(T$WB`&"@X0)0H.$#0*#A````XP``0.-4$9_E +M`R"@X?[__^L$`*#A`!``XP`00.,$(*#C_O__ZP``4.,H```*M##5X00P0^)S +M,/_FM##%X01`A.+@4I;E`3!#X@$`4^,#```*`@!3XP!`H!,(```:`P``Z@!` +MU.4P0$3B=$#OY@,``.H``-3E`1#4Y?[__^L`0*#A"@!4XS(``(I8,@/C`S#5 +MYP0`4^$N```*``!4XP(@H!-7,@,3`R#%%P$``!H%`*#A_O__ZU@R`^,#0,7G +M`$!4X@%`H!-6,@/C`T#%YR```.H$`*#A`!``XP`00.,$(*#C_O__ZP``4.,9 +M```*M##5X00P0^*T,,7AX%*6Y0@@C>(`,*#C!#`BY00`A.(`$`#C`!!`X_[_ +M_^L$,)WE`0!3XPL``(I5(@/C`C#%YP1`G>4``%3C`"``XP`@0.,`,`#C`#!` +MXP,@H!$4`)_E%!"?Y?[__^L``*#C"-"-XG"`O>A8````;`0``&0```!P0"WI +M`T"@X>`"D.4`$)/E_O__ZP!0H.$$`*#A`!``XP`00.,%(*#A_O__ZP``H.-P +M@+WH\$+!`%3CYO__&@%;H.,`@`#C +M`(!`XP!P`.,`<$#C`*``XP"@0./$/Z#A(S^@X0,@A.`#(`+B`C!CX`$`4^," +M```:"`"@X040H.'^___K!@"@X040H.'^___K`!"@X0<`H.'^___K`P`4XP$` +M`!H*`*#A_O__ZP10A>('#53C\(>]"`%`A.+F___J$$`MZ>`"D.4&`)/H_O__ +MZP``H.,0@+WH\$\MZ2S03>+@4D3*#A +M<$!$X@\`5.,$\9^7_0(`ZB`:``"D&@``6!L``(@;``#0&P``"!P``&`<``#8 +M)0``V"4``-@E``#8)0``V"4``-@E``#8)0``V"4``*`<```"`%7C#```"@0` +M5>,3```*`0!5X^H"`!H'`*#A!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__ +MZ^$"`.H'`*#A!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__Z]@"`.H'`*#A +M!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__Z\\"`.H"`%7C$```"@0`5>,; +M```*`0!5X\D"`!H'`*#A!A"@X7,@[^;^___K!P"@X080H.'^___K`""@X0`` +M`.,``$#C!A"@X?[__^N\`@#J!P"@X080H.%S(/_F_O__ZP<`H.$&$*#A_O__ +MZP`@H.$```#C``!`XP80H.'^___KKP(`Z@<`H.$&$*#A`R"@X?[__^L'`*#A +M!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__ZZ("`.H'`*#A!A"@X0`@X.-$ +M-0/C#^"@X0/PE^<`(*#A````XP``0.,&$*#A_O__ZY8"`.H'`*#A!A"@X0`@ +MX.-(Q0/C#^"@X0SPE^<'`*#A!A"@X0`@X.-$-0/C#^"@X0/PE^<`(*#A```` +MXP``0.,&$*#A_O__ZX0"`.H'`*#A!1"@X08@H.$`,.#C3,4#XP_@H.$,\)?G +M`#"@X0```.,``$#C!1"@X08@H.'^___K=@(`Z@`PC>4'`*#A!1"@X08@H.$` +M,.#C4,4#XP_@H.$,\)?G!P"@X040H.$&(*#A`##@XTS%`^,/X*#A#/"7YP`P +MH.$```#C``!`XP40H.$&(*#A_O__ZV`"`.H``%7C`""@`W@U`0,#(,<'6P(` +M"@$`5>-9`@`:`2"@XW@U`>,#(,?G)$"=Y60`5.-D0*`C>34!XP-`Q^=0`@#J +M"0!5X]<```H2``"*!`!5XTL```H'``"*`0!5XRT```HG```Z`@!5XS<```H# +M`%7C0P(`&CD``.H&`%7CG```"DP``#H'`%7CL0``"@@`5>,[`@`:M@``ZA(` +M5>-)`0`*"@``B@\`5>,[`0`*`@``B@P`5>,R`@`:+`$`ZA``5>-&`0`*$0!5 +MXRT"`!I)`0#J_0!5XXP!``H$``"*W0!5XT\!``KN`%7C)0(`&EL!`.K^`%7C +MG`$`"O\`5>,@`@`:J`$`Z@```.,``$#C;!"7Y?[__^L:`@#JJ#L +M-P'C`R"7YQ`[`>,#,)?G%`L!XP``E^<``(WE````XP``0./^___K#0(`Z@`` +M`.,``$#CP!F7Y?[__^L(`@#J````XP``0./$%)?E_O__ZP```.,``$#CT!27 +MY?[__^O_`0#J````XP``0..>%]?E_O__ZP```.,``$#CGQ?7Y?[__^L```#C +M``!`XZ`7U^7^___K\@$`ZE<-A^(8`(#BX!"'XO[__^L`4%#B/```"N`0U>7A +M(-7EXC#5Y>,`U>4``(WEY`#5Y00`C>7E`-7E"`"-Y0```.,``$#C_O__ZP`` +M`.,``$#C31'5Y4PAU>7^___K````XP``0./<$)7E^"65Y4\QU>7^___KT!"% +MX@X`D>A.`=7E``"-Y0```.,``$#C_O__ZP```.,``$#C#!;5Y0TFU>4.-M7E +M_O__ZP```.,``$#C_!65Y?[__^L```#C``!`XP\6U>40)M7E_O__ZV]?A>(` +M0*#C`&``XP!@0.,`,-7E``!3XP,```H&`*#A!!"@X;(@U>'^___K`4"$XD10 +MA>(0`%3C]/__&J\!`.K@$-?EX2#7Y>(PU^7C`-?E``"-Y>0`U^4$`(WEY0#7 +MY0@`C>6@!I_E_O__ZZ,!`.HC0(WB!P"@X100H.,$(*#A#XP_@H.$#\)?G +M````XP``0.,C$-WE!B"@X?[__^L/$`;B(Q#-Y0```.,``$#C_O__ZP<`H.$4 +M$*#C!""@X10U`^,/X*#A`_"7YXL!`.H```#C``!`XXPU`^,#$)?GB#4#XP,@ +ME^?^___K@P$`Z@```.,``$#CE#0!XP,0E^<%.Z#C`R"7Y_[__^L```#C``!` +MXR`U`>,#$-?G_O__ZW8!`.H```#C``!`XYPW`>.S$)?AGC=A^(HD(GB`*"@XP`P`.,` +M,$#C%#"-Y0`P`.,`,$#C&#"-Y0`P`.,`,$#C'#"-Y0>`H.&O?XKB`7"'XH=Q +MB.``0)GE`+``XP"P0.,`,`#C`#!`XQ`PC>4[``#J"&!$X@!`E.74,);E)%"= +MY04`4^$U```:X!#6Y>$@UN7B,-;EXP#6Y0``C>7D`-;E!`"-Y>4`UN4(`(WE +M%`"=Y?[__^L+`*#A31'6Y4PAUN7^___K$`"=Y=P0EN7X)9;E3S'6Y?[__^M. +M,=;E`#"-Y1@`G>70$(;B#@"1Z/[__^O0!)_E#!;6Y0TFUN4.-M;E_O__Z\`$ +MG^7\%9;E_O__Z[@$G^4/%M;E$";6Y?[__^NL!)_ES!"6Y?[__^MO;X;B`%"@ +MXP`PUN4``%/C`P``"AP`G>4%$*#ALB#6X?[__^L!4(7B1&"&XA``5>/T__\: +M!P"@X000H.'^___K``!0X[[__PH!H(KB")")XB``6N.P__\:#2"@X7\]PN,_ +M,,/C!""3Y0$@0N($((/E_O__ZP0!`.H```#C``!`XP,0H.'^___K!P"@X080 +MH.,D((WB(#4#XP_@H.$#\)?G^0``Z@``4^/W```:^`.?Y?[__^MX-0/C`S"7 +MYP``4^/Q```*!P"@X3/_+^'N``#J````XP``0.,<,@/C`Q"7Y_[__^OH``#J +M````XP``0.,`$`#C`!!`X_[__^OB``#J`0!3XP`0`!,`$$`3G!.?!0```.,` +M`$#C_O__ZR1`G>53-@/C`T#'Y]<``.H``%/C`@``&@<`H.'^___KT@``Z@$` +M4^,"```:!P"@X?[__^O-``#J`@!3X\L``!H'`*#A_O__Z\@``.H/`%/C%P`` +M&@<`H.$'$*#C(R"-XAPU`^,/X*#A`_"7YR0#G^4C$-WE_O__ZQP#G^7^___K +M&`.?Y?[__^L4`Y_E_O__ZQ`#G^7^___K#`.?Y?[__^L(`Y_E_O__ZP0#G^7^ +M___KK@``Z@<`H.$'$*#C)""-XB`U`^,/X*#A`_"7YP<`H.$'$*#C(R"-XAPU +M`^,/X*#A`_"7YP```.,``$#C(Q#=Y?[__^N=``#J=F#OY@<`H.'%'J#C!B"@ +MX?[__^L'`*#AQ1Z@X_[__^L`$*#A````XP``0./^___K!P"@X5@<`.,&(*#A +M_O__ZP<`H.%8'`#C_O__ZP`0H.$```#C``!`X_[__^N%``#J!P"@X<4>H./^ +M___K`!"@X0```.,``$#C_O__ZP<`H.%8'`#C_O__ZP`0H.$```#C``!`X_[_ +M_^MV``#J!P"@X2$>H./^___K`!"@X0```.,``$#C_O__ZP<`H.$(%@#C_O__ +MZP`0H.$```#C``!`X_[__^L'`*#A"AV@X_[__^L`$*#A````XP``0./^___K +M!P"@X:$?H./^___K`!"@X0```.,``$#C_O__ZP<`H.&B'Z#C_O__ZP`0H.$` +M``#C``!`X_[__^L'`*#A9!8`X_[__^L`$*#A````XP``0./^___K````XP`` +M0./^___K!P"@X4,>H./^___K`!"@X0```.,``$#C_O__ZP<`H.$X%`#C_O__ +MZP`0H.$```#C``!`X_[__^L'`*#A$1V@X_[__^L`$*#A````XP``0./^___K +M!P"@X5@4`./^___K`!"@X0```.,``$#C_O__ZP<`H.&$%`#C_O__ZP`0H.$` +M``#C``!`X_[__^L'`*#AB!0`X_[__^L`$*#A````XP``0./^___K!P"@X404 +M`./^___K`!"@X0```.,``$#C_O__ZP<`H.%(%`#C_O__ZP`0H.$```#C``!` +MX_[__^L'`*#A3!0`X_[__^L`$*#A````XP``0./^___K!P"@X44>H./^___K +M`!"@X0```.,``$#C_O__ZP(``.H```#C``!`X_[__^L``*#C+-"-XO"/O>BH +M!P``)`<``$@'``!(4((WEX%*0Y0```.,``$#C_O__ZX@U`^,#()7G +M%!"=Y0$P<>(`,*`S``!2XP$P@Q,``%/C`$"@`QY@H`,%```*I```Z@8`H.'^ +M___K`4"$XF4`5.,"```*;#"5Y2(-$^/W__\:`""@XQ0PG>6V(,/A%!"=Y;0P +MT>$?`%/CE0``F@`0D>4-(*#A?SW"XS\PP^,(8)/E($"1X@9`U#``8*`S``!6 +MXP4``!HL`(WB(""@X_[__^L``%#C!0``"H4``.HL`(WB(!"@X_[__^L50.#C +M@P``ZO[__^L-$*#A?SW!XS\PP^,$()/E`2""X@0@@^6$((7B&""-Y82@E>4` +MD*#C++"-XDR`C>(<@(WE`#``XP`P0.,@,(WE&`"=Y0H0H.'^___K`0!0XT\` +M``H)0*#A"U"@X0``U>49]O_K`'!0XA```+H!`/7E%?;_ZP!@4.(,``"Z`5"% +MX@=BAN$$8,CG!`!4XP,``,H`,-7E.@!3XP0``!H!4(7B`4"$X@8`5./K__\: +M60``Z@```.,``$#C+!"-XO[__^L-$*#A?SW!XS\PP^,$()/E`2!"X@0@@^7^ +M___K%4#@XTD``.I,8-WE37#=Y4X@W>4D((WE3T#=Y0!`C>500-WE!$"-Y5%` +MW>4(0(WE(`"=Y080H.$'(*#A)#"=Y?[__^ND8(7BE""5Y08`H.%4$(WB#"!" +MXO[__^L``%#C!0``"E1`G>4``%3C`3"@$Q00G16V,,$1#@``&I0@E>4&`*#A +M5!"-X@P@0N+^___K``!0XP4```I40)WE``!4XP(@H!,4,)T5MB##$0$``!H` +MH)KEJO__Z@T0H.%_/<'C/S##XP0@D^4!($+B!""#Y?[__^L4()WEM##2X2$` +M4^,1``":``"2Y2``@.(-$*#A?SW!XS\PP^,(4)/E`4"0X@5`U#``4*`S``!5 +MXP0``!H&$(+B`2"@X_[__^L``%#C`0``"A5`X.,```#J`$"@XP0`H.%(" +M0*#AX&*0Y;10TN$``%7CO0``"@`PDN4``%/CN@``"K:PTN$%<*#A!0"@X?[_ +M_^L`H%#B"T#@`[0```H`$)3E#2"@X7\]PN,_,,/C"("3Y0=0D>`(4-4P`("@ +M,P``6.,%```:"@"@X0<@H.'^___K``!0XZ@``!H&``#J``!7XP0```H*`*#A +M!Q"@X?[__^L-0.#CHP``Z@J0H.$`4)KE(@!5XQ5`X(.>``"*"("*XH`"G^6` +M$I_E_O__ZP<`5>-.```*"@``B@(`5>,6```*`@``B@``5>,0```*=0``Z@,` +M5>,F```*!@!5XW$``!HY``#J(`!5XU,```H"``"*'P!5XVL``!I&``#J(0!5 +MXU<```HB`%7C9@``&EX``.H8`I_E_O__ZV(``.H$,)CE`@!3XP@```H$`%/C +M"P``"@$`4^-;```:!@"@X0`0F.7^___K"`"(Y58``.H&`*#A`!"8Y?[__^L( +M`(CE40``Z@8`H.$`$)CE_O__ZP@`B.5,``#J!#"8Y0(`4^,(```*!`!3XPL` +M``H!`%/C10``&@8`H.$`$)CE""#8Y?[__^M```#J!@"@X0`0F.6X(-CA_O__ +MZSL``.H&`*#A`!"8Y0@@F.7^___K-@``Z@8`H.$`$-CE!"#8Y0`PX.-,Q0/C +M#^"@X0SPEN<(`(CE+0``Z@`0V.4$(-CE"#"8Y0`PC>4&`*#A`##@XU#%`^,/ +MX*#A#/"6YR,``.H4`9_E_O__ZP8`H.$H$*#C`""@XQ0U`^,/X*#A`_"6YQH` +M`.KT`)_E"!#:Y?[__^L&`*#A*1"@XP@@H.$4-0/C#^"@X0/PEN<0``#JT`"? +MY0@0VN7^___K!@"@X2H0H.,((*#A%#4#XP_@H.$#\);G!@``ZH0U`^,#,);G +M``!3XP(```H&`*#A,_\OX0@`RN5[L._F``!;XQ<``!H``)3E#2"@X7\]PN,_ +M,,/C"%"3Y0=`D.`%0-0P`%"@,P``5>,'0*`1`P``&@H0H.$'(*#A_O__ZP!` +MH.$``%3C!@``"@,``.H50.#C!`"@X0S0C>+PC[WH#4#@XP```.H`0*#C"@"@ +MX0<0H.'^___K]?__ZO`!``!T````U`P``!`-```D#0``0`T``/!'+>D0T$WB +MX%*0Y0-`H.$`,*#C"#"-Y;PPS>$`,(WEM##-X0T`H.$&$(3B!B"@X_[__^L` +M,)3E`0!3XR\``!H$`I_E_O__ZPT`H.$($(WB!B"@X_[__^L!`%#C50``"@!@ +MH.,-<*#A!H"@XW:0[^8&H*#A!@.%X"8,@.(5`(#B#1"@X0@@H.'^___K`0!0 +MXQ$``!JT`9_E_O__ZP:CH.$09@+C!@"*X```A>`+`(#B%!"$XA`@H./^___K +M"J"%X`9@BN`!0*#C!$#&Y020B>`4.@+C`Y#%YSD``.H!8(;B$`!6X^#__QHX +M``#J`""@XQ0Z`N,#(,7G`4"@XS```.H"`%/C'P``&D0!G^7^___K`$"@XPU@ +MH.$&<*#C!("@X00#A>`F#(#B%0"`X@T0H.$'(*#A_O__ZP$`4.,-```:!(.@ +MX1!&`N,$`(C@``"%X`4`@.(`$*#C!B"@X_[__^L(4(7@!$"%X``PH.,$,,3E +M`4"@XQ(``.H!0(3B$`!4X^7__QH-``#J`P!3XPD``!HF#(7B%`"`X@`0H.,! +M*Z#C_O__ZP`@H.,4.@+C`R#%YP%`H.,"``#J`$"@XP```.H!0*#C!`"@X1#0 +MC>+PA[WH%&H"XWP`G^4&$-7G_O__ZP8`U><0=@+C``.'X```A>`%`(#B#1"@ +MX08@H./^___K!@#5YP`#A^```(7@"P"`XA00A.(0(*#C_O__ZP8PU><#,X7@ +M!W"#X`$PH.,$,,?E!C#5YP$P@^)S,._F!C#%YQ``4^/=__\:I___ZE0-``!X +M#0``K`T``-0-``!P0"WI`D"@X>!BD.5L();E`0`2XP<``!I``!+C!0``&@`` +MH..T`,3AMC#4X0(Y@^.V,,3A<("]Z`90U.4``%7C!```"@0`5>,5`."#`5!% +MD@(``)IP@+WHL".V +M$,3A<("]Z%\NA>(,((+B`B&&X+0@TN&T(,3A``!2XQ@```I>'X7B`Q"!X@$2 +MAN!?7H7B#%"%X@51AN`#`*#A!!"!X@0@E>7^___KMB#4X;8@Q.$0.P'C`S"6 +MYP``4^,"*H(#MB#$`0``H`-P@+T(`0!3XP``H!,!*8(#MB#$`0``H`-P@+WH +M``"@X[0`Q.$"&8'CMA#$X7"`O>@0,*#CM##$X0H;@>.V$,3A``"@XW"`O>@` +M`*#CM`#$X0(9@>.V$,3A<("]Z!!`+>D``%/B!P``"@[`H..TP,+A`3"@X[8P +MPN$`$`#C`!!`XPP@H.'^___K``"@XQ"`O>AP0"WI`E"@X>!"D.5L()3E`0`2 +MXP(``!I``!+C`$#@`P@```KH8)3EM&#%X0,`H.'L$(3B!B"@X?[__^L!,*#C +MMC#%X0!`H.,$`*#A<("]Z'!`+>G@4I#E`D"@X0$PH..R,,3@!`"@X0`0H.,& +M(*#C_O__ZVPPE>4!`!/C`P``&D``$^,!```:$``3XP0```H$`*#AX!"%X@8@ +MH./^___K`P``Z@0`H.$`$*#C!B"@X_[__^L``*#C<("]Z/!!+>D@T$WB`F"@ +MX0-PH.'@0I#E````XP``0..V$-+A_O__ZP0`C>(`$*#C'""@X_[__^NV4-;A +M`@D5XP\```I``I_E_O__ZP$@H.,4.P'C`R"$YP`PH..L)P'C`C"$YU@@@N(" +M,(3G7"!"X@(PA.?:+X+B`C"$YP-`H.%^``#J_U`5X@4```H$`%7C%0#@@P&` +M19(!4*"3!@``FG<``.JP-P'C`X"4Y]P!G^4($*#A_O__ZP!0H..V$-;A`@H1 +MXPT```K$`9_E_O__ZP`PH.,4*P'C`C"$Y]LO0N(",(3G!"""X@(PA.=8((+B +M`C"$Y\,O@N(",(3G'P``Z@$)$>,/```*````XP``0./^___K`""@XQ0[`>,# +M((3G`3"@XZ@G`>,",(3GK",",(3G#0``Z@`` +M`.,``$#C_O__ZP`PH.,4*P'C`C"$YZ@G`>,",(3GK",",(3G"("-Y;0PUN$``%/C!@``"@4`4^,%,*"3#3"@@PPPC>4,,(/B +M!#"-Y2$``.H`,*#C##"-Y0$`5>,=```:L#7^___K`#"5Y04`4^,"```*#0!3XPH``!H$``#J`2"@XZPW +M`>,#((3G`$"@XQP``.H%(*#CK#('$*#A#""=Y?[__^L$`*#A +M!1"@X?[__^L``%#C!```&J@R`^,#,)3G``!3XUY`X`,````*`$"@XP0`H.$@ +MT(WB\(&]Z$@.``!<#@``=`X``.0.``#P1RWI`4"@X>!BD.4`,*#C(#"!Y1LP +MP>6^,M'A,#"#X@(`4^'8``"*!#"1Y0$`<^/5```:N"#1X?\_#^,#`%+AT0`` +M&B0PT>4#`%/CS@``BEY]AN(H<(?B#%"!X@4`H.$`$`#C`!!`X_[__^L``%#C +M4```&D`#G^7^___K`""@XQ0[`>,#((;G`3"@XZPG`>,",(;G6"""X@(PAN.Q```*!0!5XP6@ +MH),-H*"##)"*X@D`H.'^___K`%!0XJL```H%`*#A`!"@XQP@H./^___K"*"% +MY0"0A>4-`%KC!3"@`ZPG`0,",(8'6"""`@(PA@<",8CC!#"%Y0R@A>(*`*#A +M,!"$X@@@E>7^___K'##4Y0``4^,'```*@`*?Y?[__^L&`*#A!1"@X?[__^L` +M`%#CDP``"I```.ID`I_E_O__ZP,`6...``"*7C^(X@,P@^(#,H;@!`"#X@H0 +MH.$(()7E_O__ZU\^B.(,,(/B`S&&X`@@E>4$((/E!@"@X0<0H.$((*#A`#"@ +MX_[__^L`0*#C?```ZJ@W`>,#,);G`@!3XW(``!IL();E"#``XP$P0.,#,`+@ +M``!3XVP```I7#8;B&`"`XN`0AN+^___K`(!0XE````H%`*#AR!&?Y?[__^L` +M`%#C`#"@$^@PB!44.P'C`S"6YP8`4^,$`%,3K#,``HK@``"&X`0` +M@.(0$(CB"""@X_[__^LD`-3E#@"`X@`"BN```(;@!`"`XA@0B.(((*#C_O__ +MZP$PH.,;+*#C`C#&YR00U.6^+T+B`A"&YP8`H.$'$*#A)"#4Y?[__^L&`*#A +M_O__ZP!`4.(1```*!0"@X700G^7^___K``!0XP`PH!/H,(05%#L!XP,PEN<& +M`%/C!`!3$P8``!JL-P'C`S"6Y^PPA.4`0*#C`@``ZA5`X.,```#J`$"@XP0` +MH.'PA[WH`$"@XP```.I>0.#C!0"@X0D0H.'^___K]O__ZA@/``!`#P``5`\` +M`&0/``!T#P``?`\``/!'+>D`D*#A`J"@X0-@H.&VAP0"WI`%"@X0)`H.'@8I#EMC#2 +MX0,ZH.$C.J#A"@!3XP/QGY<*``#J3#H``$PZ``!,.@``3#H``)`Y``"X.0`` +M"#H``$PZ``!,.@``B#D``$PZ``!>0.#C+P``Z@`PDN4``%/C`2"@$PPV`A,# +M(,87`$"@$P!`H`,,-@(#`T#&!R4``.H4.P'C`S"6YP``4^,@```*`#"2Y0`` +M4^,=```*`2"@XQ0[`>,#((;G`$"@XZPW`>,#0(;G!#@!XP-`AN>H-P'C`T"& +MYQ`[`>,#0(;G$0``ZFPPEN4!`!/C"```"@8`H.'^___K-`"?Y300G^7^___K +M!@"@X?[__^L&`*#A_O__ZP4`H.$`$)3E5/+_ZP!`H.$```#J`$"@XP0`H.%P +M@+WHC`\``(@```#P3RWI%-!-X@!PH.$"0*#A`#"@XPPPC>4(,(WE`5"@X0,` +M4>$`$*`3`1"@`X``4N,!,*"1`3"!@P``4^,&```*`""@X_@X`>,#(,#G`@!1 +MX0)`H!$50.`#R@``Z@``4N,`0*`#QP``"@2PH.$$`*#A_O__ZP!@4.(+0.`# +MP0``"@8`H.$%$*#A"R"@X?[__^L#`%3C`$#@D\<``)H$4*#A!@"@X000H.$, +M((WB"#"-XO[__^L!`%#C!0``&@(@H..H-P'C`R"'YP0@H.,0.P'C`R"'YP8` +MH.$%$*#A#""-X@@PC>+^___K`0!0XP4``!H"(*#CJ#,%\9^7,0``ZKP[``#8.P``1#P``"P\``!$/``` +M1#P``$0\``#T.P``1#P``$0\``!$/```1#P``$0\``!$/```1#P``!`\```` +M(*#C!#@!XP,@A^,#((?G`""@XQ0[ +M`>,#((?G$P``Z@(@H.,$.`'C`R"'YP0@H.,4.P'C`R"'YPP``.H$(*#C!#@! +MXP,@A^<&(*#C%#L!XP,@A^<%``#J!2"@XP0X`>,#((?G`""@XQ0[`>,#((?G +M"%"=Y0%01>(/`%7C!?&?ES(``.J8/```M#P``"0]```(/0``)#T``"0]```D +M/0``T#P``"0]```D/0``)#T``"0]```D/0``)#T``"0]``#L/````""@XZPW +M`>,#((?G`2"@XQ0[`>,#((?G3P``Z@$@H..L-P'C`R"'YP`@H.,4.P'C`R"' +MYT@``.H"(*#CK#,#((?G +M!B"@XQ0[`>,#((?G.@``Z@4@H..L-P'C`R"'YP`@H.,4.P'C`R"'YS,``.H` +M(*#C^#@!XP,@Q^<`,`#C`#!`XY@PD^4$,(WE,@``Z@6`H.$%H(;@`##:Y=T` +M4^,:```:`@"%X@``AN`$$(WB!""@X_[__^L!`%#C$P``&K``G^7^___K"H"@ +MX0$@VN4"((+B`@Q2XP(LH*/\.@'C`R"'YV,-A^(Y`(#B"A"@X?[__^OX.`'C +M`2"@XP,@Q^=T`)_E_O__ZP!`H.,5``#J"("&X`DPV.<",(/B`U"%X'50_^8% +M`%3AV/__B@!`H.,,``#J!`"@X130C>+PC[WH`""@X_@X`>,#(,?G`#``XP`P +M0..8,)/E!#"-Y0!0H.,!D*#CR?__Z@8`H.$+$*#A_O__Z^[__^JP#P``O`\` +M`!!`+>G@`I#E`Q"@X;0@TN$%___K$("]Z/!%+>D,T$WB`E"@X0`PH.,$,(WE +MX&*0Y;(PS>$!,,WE;#"6Y0$`$^,"```:0``3XP``X`-9```*5#&6Y5D/AN(M +M$*#C!""-X@PP0^+^___K`'!0XA````H$0)WE``!4XPT```H'0*#A`@"-X@40 +MA^("(*#C_O__ZP(P].4!(-3E`C2#X=.@X.=@`!/C`'"@`P%PH!,!@*#C`@`` +MZ@!PH.,'H*#A!X"@X4`QUN4!($/B5!,=+E`2""X@$00^)Q$._F_0!1X_7__YH! +M`%CC(P``&@8`H.$3$*#C`2"-XA@U`^,/X*#A`_"6YP%`W>4#`%3C"0``&@`` +M6N,#```*``!7XY9PH!.'<*`##0``Z@``5^-(<*`307"@`PD``.H``%KC!``` +M"@XQ`.,``%?C`W"@`4M_H!,"``#J``!7XY!PH!."<*`#AW"@X2`Q"N,',$#C +MDP<#X``PA>4``*#C!```ZB`Q"N,',$#CDP0#X``PA>4``*#C#-"-XO"%O>AP +M0"WI(-!-XN!BD.4`0)+E!.#2Y0W`H.$P,9_E#P"3Z`<`K.@`,,SE`0!TXS`` +M``JD0J#AQ3H%XWPZ0..3)(/@HS.@X6X`4^,%4*`#*0``"@\``(HW`%/C`E"@ +M`R4```H%``"*"@!3XP!0H`,A```*%`!3XQX``!H5``#J/`!3XP-0H`,;```* +M6@!3XQ@``!H1``#J\`!3XPA0H`,5```*!0``BG@`4^,&4*`#$0``"K0`4^,. +M```:"0``ZEH/4^,)4*`#"P``"AX.4^,(```:!0``Z@%0H.,&``#J!%"@XP0` +M`.H'4*#C`@``Z@I0H.,```#J"U"@XP!`H.,-`*#A$!"-X@#`X.,$,-#G!0!3 +MX03`P1<"```:!##!YP``7N,"```*`4"$X@T`5./U__\:!@"@X1`0C>+^___K +M`0!0XP``H`,``.`3(-"-XG"`O>B<````\$`MZ0S03>("8*#AX$*0Y0`PH.,$ +M,(WE;#"4Y4$`$^-/```*5#&4Y5D/A.(M$*#C!""-X@PP0^+^___K``!0XP!P +MH`,"```*!%"=Y0!P5>(!<*`3!5V$X@4`H.'^___K`0!0XPT``!H!`%?C!0`` +M&@8`H.$0$*#C`"``XP`@0./^___K.P``Z@8`H.$0$*#C`"``XP`@0./^___K +M-0``Z@4`H.'^___K`0!0XPT``!H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^ +M___K*0``Z@8`H.$0$*#C`"``XP`@0./^___K(P``ZB@QE.4.`%/C#0``F@$` +M5^,%```:!@"@X1`0H.,`(`#C`"!`X_[__^L8``#J!@"@X1`0H.,`(`#C`"!` +MX_[__^L2``#J`0!7XP4``!H&`*#A$!"@XP`@`.,`($#C_O__ZPH``.H&`*#A +M$!"@XP`@`.,`($#C_O__ZP0``.H"`*#A$!"@XP`@`.,`($#C_O__ZP``H.,, +MT(WB\("]Z/A/+>D#8*#AX$*0Y8X_H..T,,+A!@"@X0`0H.,#(*#A_O__ZT`[ +M!.-,,$#C`#"&Y60PH.,L,,;E+3#&Y2XPQN4',*#C+S#&Y5P@H.,P(,;E32#@ +MXS$@QN4`4*#C,E#&Y3,PQN4$,*#C-##&Y0`P`.,`,$#C`'"3Y3APAN4$<)/E +M/'"&Y0APD^5`<(;E#'"3Y41PAN4!/*#CP#"&Y2HY`./$,(;EO%W&X18PH.,8 +M,<;E$#"@XQDQQN4%<*#A"J"@XP20H..@M@CC`;!`XZ0WU.4``%/C"@``"B:` +MA^*(@8;@"C#(YZ0'U.7^___KFP``X`D`B./K__\:$SZ@X[-PAN$R<<;E#S"@XS0RAN4_,*#C +M#S#&Y0``H./XC[WH<$`MZ0)0H.'@0I#E;#"4Y0$`$^,*```**`&4Y?[__^N@ +M-@CC`3!`XY,``^``,(7E`3"@X[0PQ>$H,93E!C#%Y0D``.J>!]3E_O__ZZ`V +M".,!,$#CDP`#X``PA>4!,*#CM##%X9XWU.4&,,7E``"@XW"`O>CP3RWIQ=]- +MX@*PH.$#0*#A`#"@X_0RC>4"+(WBLCO"X14["./_/T_COC_"X0$PH.,#+(WB +ML##"X0,,C>("`(#B(!"+X@8@H./^___K%&"$XC@SG>4&`%/A"P``FC%>C>(4 +M(*#CM"%EX00`H.$%$*#A!""@X_[__^L$`(3B!!"%XA`@H./^___K!D"@X2@` +MB^+^___K``!0XR````H;.PCC_S]/XP(LC>*^/\+A`3"@XP,LC>*V,,+AN'+; +MX2``5^,@<*`CM'#"X0APA^('4(3@.#.=Y04`4^$0``":,6Z-XK1Q9N$$<*#C +M!`"@X080H.$'(*#A_O__ZP<`A.`($(;B!R"@X?[__^L(`(3B+!"+X@,\C>*T +M(-/A_O__ZP```.H$4*#AI""+XA@@C>64,)OE`@"@X2T0H..]+XWB##!#XO[_ +M_^L`8%#B%```"O1"G>4``%3C$0``"@9`H.$K#HWB`@"`X@40AN("(*#C_O__ +MZP(P].4!(-3E`C2#X=,@X.4!.PCC_S]/XP(LC>*^/\+A@$"+X@0`H.'^ +M___K`0!0XPX``!H,,)WE`0!3XP4``!H##(WB$!"@XP`@`.,`($#C_O__ZS@` +M`.H##(WB$!"@XP`@`.,`($#C_O__ZS(``.H$`*#A_O__ZP$`4.,.```:#""= +MY0$`4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^LE``#J`PR-XA`0H.,`(`#C +M`"!`X_[__^L?``#J:#";Y0X`4^,.``":##"=Y0$`4^,%```:`PR-XA`0H.,` +M(`#C`"!`X_[__^L3``#J`PR-XA`0H.,`(`#C`"!`X_[__^L-``#J#""=Y0$` +M4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^L$``#J`PR-XA`0H.,`(`#C`"!` +MX_[__^L48(7B.#.=Y08`4^$+``":,4Z-XA0@H..T(63A!0"@X000H.$$(*#C +M_O__ZP0`A>($$(3B$""@X_[__^L&4*#A!SL(X_\_3^,"+(WBOC_"X9@PB^(( +M,(WE`P"@X?[__^L`$*#AO@^-X@(`@.("(*#C_O__ZP(LC>*Z/]+A`P`3XQ4` +M``H!`!/C`S"@$P`SC14!,*`#`#.-!0B@A>(X,YWE"@!3X0P``)HQ3HWB"""@ +MX[0A9.$$8*#C!0"@X000H.$&(*#A_O__ZP8`A>`&$(3@!B"@X?[__^L```#J +M!:"@X6@PF^4``%/C`3"@`V@PBP4%.PCC_S]/XP(LC>*^/\+A:`";Y?[__^N@ +M-@CC`3!`XY,``^``,XWE`3"@XP,LC>*T,,+A:#";Y08SS>4,4(KB.#.=Y04` +M4^$+``":,4Z-X@P@H..T(63A"@"@X000H.$$(*#C_O__ZP0`BN($$(3B"""@ +MX_[__^L%H*#A*SL(X_\_3^,"+(WBOC_"X;I/TN$0`!3C`CN@$P,LC1*V,,(1 +M`CF@`P,LC0*V,,(!`#"@XP,LC>*T,,+A"%"*XC@SG>4%`%/A$0``FC%.C>(( +M(*#CM"%DX01@H.,*`*#A!!"@X08@H.'^___K!@"*X`@0A.(&(*#A_O__ZP4` +MH.$L$(OB`SR-XK0@T^'^___K!:"@X:V/C>((`*#A0!"@XP`@`.,`($#C_O__ +MZX`@V^4``%+C`'"@`R,```JM3XWB`$"$X`M0H.$`<*#C0("(X@`P`.,`,$#C +M%#"-Y0`P`.,#8*#A`&!`XP"0`.,`D$#C'*"-Y2"PC>44L)WE!J"@X7]@`N(' +M`%;A!G"@(0@09."F,*#A`0`2XPH@H`$+(*`1`""-Y00`H.$)(*#A_O__ZX$@ +MU>4!4(7B``!2XP!`A!#N__\:'*"=Y2"PG>4,()WE`0!2XS$``!H"/(WBLAO3 +MX0()$>,,```*)""=Y0``4N,$```*#G$`XQ`PG>4``%/C2W^@$R0``.H0()WE +M``!2XY!PH!."<*`#'P``ZH``$>,*```*)#"=Y0``4^,#```*$""=Y0``4N,6 +M```:$0``ZA`PG>4``%/C$```&@L``.JX!9_E_O__ZR0@G>4``%+C`P``"A`P +MG>4``%/C"0``&@0``.H0()WE``!2XP,``!I!<*#C!```ZH=PH.,"``#J2'"@ +MXP```.J6<*#CAW"@X2$["./_/T_C`BR-XKX_PN$`,*#C!3/-Y00SS>4@,0KC +M!S!`XY,'`^``,XWE#%"*XC@SG>4%`%/A"P``FC%.C>(,(*#CM"%DX0H`H.$$ +M$*#A!""@X_[__^L$`(KB!!"$X@@@H./^___K!:"@X0`PH.,"+(WBL#O"X;PZ +MPN&4$)OE2S^-X@`PC>4K/HWB!#"-Y0@`G>4L((WBJS^-XO[__^L"/(WBL$O3 +MX0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@#`(3H +M`BR-XK!+TN$``%3C$```"B-NC>(#8(;B`$"@XP!P`.,`<$#C2X^-X@10H.$& +M`*#A!Q"@X04@V.?^___K`&"&X`%0A>("/(WBL$O3X04`5.'U__^*OP^-X@`0 +MH.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WBM`## +MX0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$%(*#A +M_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^-X@,\C>*T(-/A_O__ZP:@H.&_ +M#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_"X;!;TN$#/(WBM%##X0A0 +MA>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$%(*#A_O__ +MZP4`BN`($(3B!2"@X?[__^L(`(KB2Q^-X@,\C>*T(-/A_O__ZP:@H.$"+(WB +MO$K2X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@# +M`(3H`CR-XKQ*T^$``%3C$```"B-NC>(#8(;B`$"@XP!P`.,`<$#C+("-X@10 +MH.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("+(WBO$K2X04`5.'U__^*OP^- +MX@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WB +MM`##X0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$% +M(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^-X@,\C>*T(-/A_O__ZP:@ +MH.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_"X;Q:TN$#/(WBM%## +MX0A0A>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$%(*#A +M_O__ZP4`BN`($(3B!2"@X?[__^L(`(KB+!"-X@,\C>*T(-/A_O__ZP:@H.$` +M,*#CK#*-Y91PF^4,<%?B.0``"@-`H.&KCXWB!2P(X_\O3^,,((WEOS^-X@@P +M@^(0,(WE`9"@XP10H.$4L(WE!["@X1APG>4%8(?@!@"@X0@0H.'^___K``!0 +MXQ\```JL0IWE`@!4XQP``)H,()WE`CR-XKXOP^&\.M/A`RR-XK0PPN$(,(/B +M"#"-Y0-`BN`X,YWE!`!3X1```)H(()WE`CR-XKPOP^$*`*#AOQ^-X@0@H./^ +M___K!`"*XA`0G>4$(*#C_O__ZP@`BN(&$*#A`SR-XK0@T^'^___K!*"@X04P +MA^`),-/G`C"#X@-0A>`%`%OAT___BA2PG>4!/`CC_S]/XP(LC>*^/\+A2S"@ +MXP,SS>54,)OE``!3XU`PVP54,(L%5##;Y8,@@^!0,-OE`R""X$(AH.$!(\WE +M5#"+Y9`PV^4`,\WE8S#@XP(SS>4(8(KB.#.=Y08`4^$,``":,4Z-X@@@H..T +M(63A!%"@XPH`H.$$$*#A!2"@X?[__^L%`(K@!1"$X`4@H.'^___K!J"@X0H` +MH.'%WXWB\(^]Z(P0``#P3RWI'-!-XA00C>4,((WE$#"-Y>"2D.6T<-+A!W"# +MX+0R`^,#,-GG``!3XP0```J(-0/C`S"9YP``4^,50.`3-@``&O[__^L-(*#A +M?SW"XS\PP^,$()/E`2""X@0@@^6$@(GBA$"9Y7J^B>($L(OB$&"=Y?^B`.,( +M`*#A!!"@X?[__^L!`%#C%@``"@6T8,+A`#"@X[8PPN$$`*#A'-"-XO"/O>AP +M0"WIX%*0Y0!`4^(/```*L##4X0``4^,#```*`0!3XUY`X!,,```:!```Z@4` +MH.'^___K``!0XP0```H%``#J!0"@X?[__^L``%#C`0``&@!`X.,```#J`$"@ +MXP0`H.%P@+WH,$`MZ1303>(`4*#A#4"@X0T`H.$`$*#C$""@X_[__^L!,*#C +ML##-X0(`C>(`$*#C!B"@X_[__^O7/:#C`P"5YQ4;".,-(*#A`#"@X_[__^L4 +MT(WB,("]Z#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@XQ`@H./^___K`3"@X[`P +MS>$"`(WBX!"%X@8@H./^___KUSV@XP,`E><5&PCC#2"@X0`PH./^___K%-"- +MXC"`O>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0(*#C_O__Z]<]H.,#`)7G +M&1L(XPT@H.$`,*#C_O__ZQ30C>(P@+WH\$]Z*P` +M```00"WI!2!"XG(@[^8(`%+C`$"@@P#``),`P$"3`B",D,1`TI4$(*#AMO__ +MZQ"`O>AP0"WI"-!-X@%@H.$"4*#A`!``XP`00./0,)'E!#"-Y>!"D.4```#C +M``!`X]00@>+^___K;#"4Y1``$^,50.`#(@``"@Y01>)P!Y3E``!0XP,```I\ +M%Y3E_O__ZP`PH.-P-X3E``!5XP!`H-,7``#:!0"@X?[__^MP!X3E?%>$Y0`` +M4.,%```:3`"?Y4P0G^51*@'C_O__ZQ5`X.,+``#J#A"&X@4@H.'^___K!`"@ +MX=T0H.,$((WB`3"@X_[__^L!(*#C2SV@XP,@Q.<`0*#C!`"@X0C0C>)P@+WH +MU!```-0```#P3RWI3-!-X@!@H.$!<*#A`$"@X>`BM.6=-0/C`S#2YP``4^,` +M0.`#^P0`"@`PD>4``%/C%4#@`_<$``JT`-'A_O__ZQ``C>4`@*#A``!0XPM` +MX`/P!``*`!"7Y;20U^$-(*#A?SW"XS\PP^,(H)/E"5"1X`I0U3``H*`S``!: +MXP0``!H)(*#A_O__ZP``4.,$```:"```Z@``6>,&```*"1"@X?[__^L0`)WE +MM!#7X?[__^L-0.#CUP0`ZL@/G^7('Y_E`""8Y?[__^L`$)CE`3!!XA(`4^,# +M\9^7M`0`ZA16```\5@``3%<``)QH``",9@``%%X``)QH``"<:```G&@``)QH +M``"<:```G&@``)QH``"<:```G&@``.A7``!49P``;&<```1H````0)3E7`^? +MY5P?G^7^___K!`"@X?[__^L$`*#A_O__ZP!`H.&;!`#J`%"4Y;P0V.$$(-CE +M!3#8Y08`V.4``(WE!P#8Y00`C>4(`-CE"`"-Y0D`V.4,`(WE$`^?Y?[__^ML +M,)7E$0`3XS````H$,)CE`0!SXP,``!JX(-CA`3B#X@,`4N$I```*5PV%XA@` +M@.($$(CB_O__ZP!`4.(+0.`#?`0`"A!@F.6\,-CAU#"$Y1,.A.(4$(CB$""@ +MX_[__^L"#!;C`3"@$]PPA!4`,*`#W#"$!<0TE>4``%/CW#"$!0(+%N,`,*`# +M^#6$!0<```H!,*#C^#6$Y=PPA.5A#H3B`P"`X"00B.(:(*#C_O__Z]`TE>4` +M`%/C^#6$!04`H.$$$*#A_O__ZP!`H.-9!`#J%4#@XU<$`.H`4)3E!!#8Y04@ +MV.4&,-CE!P#8Y0``C>4(`-CE!`"-Y0D`V.4(`(WE#`Z?Y?[__^ML,)7E$0`3 +MXQ4```H$,)CE`0!SXP,``!JX(-CA`3B#X@,`4N$.```*5PV%XA@`@.($$(CB +M_O__ZP!`4.($```*!0"@X000H.'^___K`$"@XS8$`.JT#9_E_O__ZP!`H.,R +M!`#J%4#@XS`$`.JT8-?A`#"@XT`PC>64/9_E%"&3Y30@C>4L((WB1A^#X@,` +MD>@$`(+DL!#"X0!0E.7,#9_E$AZ#X@8@H.'^___K;#"5Y1``$^-U`0`*H$`,$(CB`B"@X_[__^NT,)7A`3!#XG,P_^8?`%/C!#"@@2`@H(.S((6! +M#F!&XE1AA>4##%;C"T#@@PP$`(I63X7B!`"@X0`0H.,#+*#C_O__ZP0`H.$. +M$(CB5"&5Y?[__^L\,97E!`!3XU@!`!H`D*#C$)&%Y>``A>++'87B(1"!X@8@ +MH./^___K!`"@X?[__^L!(-#E`##0Y0(T@^$@,87E`2#4Y5@QU>4"-(/A%#"- +MY0Q@A.)`H(WB5#&5Y08`H.$)$*#A"B"@X0PP0^+^___K`)!0X@P```I`0)WE +M``!4XPD```KH`(7B`!"@XR0@H./^___K[`"%X@(0B>)`()WE_O__ZT!`G>7H +M0(7E`#"@XQPQA>54,97E!@"@X0,0H.,*(*#A##!#XO[__^L`D%#B`P``"D!` +MG>4``%3C`K#9%0```!H`L*#C*+&%Y1P`C>(`$*#C$""@X_[__^M4,97E!@"@ +MX0$0H.,*(*#A##!#XO[__^L`0%#B`)"@`P0```H<`(WB`A"$XD`@G>7^___K +M0)"=Y50QE>4&`*#A,A"@XPH@H.$,,$/B_O__ZP!`4.(&```*'`"-X@D`@.`" +M$(3B0""=Y?[__^M`0)WE!)")X!P`C>()$*#A"R"@X?[__^MPD._F!0V%X@D0 +MH.'^___K5#&5Y08`H.$J$*#C"B"@X0PP0^+^___K`+!0X@4```I`0)WE``!4 +MXP(```H%`*#A"Q"@X?[__^M4,97E!@"@X2T0H.,*(*#A##!#XO[__^L`L%#B +M%P``"D!`G>4``%3C%```"@B0B>,%`*#A$Q"@XT<@C>(8-0/C#^"@X0/PE>=' +M0-WE`P!4XP)`BP(`,.`#`S#$!0$P@P($,,0%3@Z%X@D`@.("$(OB0""=Y?[_ +M_^L!L*#C````Z@"PH.,+`%GC$0``BGE`K^8!,*#C$T2@X0P\`.,`,$#C`S`$ +MX```4^,#,*`3&#&%%0D``!H0`!3C`C"@$Q@QA14%```:`@`4XP$P@Q(8,845 +M`0``&@,PH.,8,87ER)"%Y10PG>40`!/C`3"@$PPQA14`,*`###&%!0`PH./D +M*`'C`C"%YSPPC>4X,(WE""""X@(PA><(((+B`C"%YU0QE>4&`*#A,!"@XPH@ +MH.$,,$/B_O__ZP!`4.(9```*0!"=Y0``4>,6```*!`"@X0(0@>(\((WB.#"- +MXO[__^L!`%#C#P``&@(@H..H-P'C`R"%YP$@H.-./X/B`R"%YP0P@^(#()7G +M`B""XP,@A><\0)WE"#"#X@-`A><`,*#C0#"-Y3PPC>4X +M,(WEZ"@!XP(PA><(((+B`C"%YP9`H.'=D*#C5#&5Y0XP0^($`*#A"1"@X0H@ +MH.%`0)WE`S!DX/[__^L`0%#B(0``"@(`A.(T$(WB!""@X_[__^L``%#C)P,` +M"@0`H.%`0)WE`A"$XCP@C>(X,(WB_O__ZP$`4.,3```:`B"@XZ@W`>,#((7G +M`2"@XTX_@^(#((7G!#"#X@,@E>4$,(/B`T"%YSA`G>4( +M,(/B`T"%YP(``.H",(/B`T"$X-/__^H`,*#C0#"-Y<0TA>5:.@+C`S#5YP`` +M4^,:```*W9"@XU0QE>4.,$/B!@"@X0D0H.$*(*#A0$"=Y0,P9.#^___K`$!0 +MX@\```H"`(3B+!"-X@8@H./^___K``!0X_<"``H!,*#CQ#2%Y0@P].6#/.#A +MHSS@X0`PQ.4"``#J`C"#X@-@A.#E___J`#"@X]`TA>7@/0+C`S#5YP``4^,` +ML*`#`;`+$@``6^,&```*`3"@X]`TA>7$-(7EXCT"XP,PU>5X,(/B!1"@X=PPH>4%`*#A_O__ZU=MA>(88(;BX$"%X@8`H.$$$*#A_O__ +MZP``4.,$```:!@"@X000H.'^___K``!0XP4```H%`*#A_O__ZP$PH./8,(7E +M`$"@XZ<"`.H50.#CI0(`ZK10U^$`0)3E6`>?Y6P7G^7^___K`#"@XR`PB.4; +M,,CEOC+8X4`P@^(#`%7AQ`(`&@10H.$$,)CE`0!SXP<``!JX(-CA`3B#X@,` +M4N$#```:)Y0,`5N.Y`@"*"0``ZE<-A>(8`(#B!!"(XO[__^L`8%#BJ`(` +M&@0'G^7^___K`$"@XX,"`.H,0(CB!`"@X?`6G^7^___K``!0XP0``!KD!I_E +M!A"@X?[__^L`0*#C>`(`Z@0`H.$H%Y_E_O__ZP$`<.(``*`S``!0XP!@H`,! +M,*`#9```"K`&G^7^___K)Y;ZBV.&D!I_E!A"@X0H@H.'^___K`3!ZX@`P +MH#,#`%;C`3"#@P``4^.,`@`:``!:XP!`H`,1```*!0!:XP6@H),-H*"##)"* +MX@D`H.'^___K`$!0X@,``!I4!I_E_O__ZP!`H.-2`@#J!`"@X0`0H.,<(*#C +M_O__ZPB@A.4`D(3E!&"$Y0R0A.()`*#A,!"(X@@@E.7^___K'##8Y0``4^,D +M```*#`:?Y?[__^L`(*#C%#L!XP,@A>=8((+B`C"%YP@P +ME.4-`%/C!3"@`U@@0@(",(4'6"""`@(PA0>P-P'C`V"%YUX_AN(#,(/B`S*% +MX`0`@^()$*#A"""4Y?[__^M?/H;B##"#X@,QA>`(()3E!""#Y04`H.$,$(3B +M""#4Y08PH.'I_/_KCP$`ZGP%G^7^___K7C^&X@,P@^(#,H7@!`"#X@D0H.$( +M()3E_O__ZU\^AN(,,(/B`S&%X`@@E.4$((/E!0"@X0P0A.(((-3E!C"@X=7\ +M_^M[`0#J``!3XWH```IL,)7E$``3XW<```H<,-CE`0!3XRL"`!H``%#C%``` +M"@@%G^7@%)_E_O__ZR0`V.4``H7@OB+8X08+@.(,`(#B,!"(XA``4N,0(*`C +M_O__ZP$@H.,$.`'C`R"%Y[XRV.$-`%/C!"""`@0X`0,#((4'1```Z@0`H.&T +M%)_E_O__ZP``4.,D```:J`2?Y7@4G^7^___K`B"@XP0X`>,#((7G)`#8Y0`" +MA>`P0(CBOB+8X08+@.(,`(#B!!"@X1``4N,0(*`C_O__ZR0`V.4*`(#BJ&`$`(#B +M&!"$X@@@H./^___K`2"@XP$[`>,#(,7G&@``Z@0`H.$4%)_E_O__ZP``4.,/ +M```:"`2?Y=`3G^7^___K!""@XP0X`>,#((7G)`#8Y0`"A>"^(MCA!@N`X@P` +M@.(P$(CB$`!2XQ`@H"/^___K!0``ZLP#G^60$Y_E_O__ZP`@H.,$.`'C`R"% +MYR0@V.4(.`'C`R"%YP$@H..^/X/B`R#%Y[\_0^(#()7G6#!#X@,@A><%`*#A +M,!"(XG(@[^8D,-CE(_S_ZP4`H.'^___K`&!0XKP!``H`0*#CZ$"&Y00X`>,# +M,)7G[#"&Y8T!`.JH-P'C`S"5YP(`4^,`,*`3`3"@`P``5N,`,*`#``!3XZT! +M``IL,)7E$``3XZH!``H<,-CE`0!3XV,``!HPH(CBOB+8X1$.AN(*$*#A$`!2 +MXQ`@H"/^___K!`"@X203G^7^___K``!0XPD``!KH`I_EJ!*?Y?[__^L!,*#C +M[#"&Y;XRV.$-`%/C!3"@`^PPA@4E``#J!`"@X:@2G^7^___K``!0XQ```!JP +M`I_E;!*?Y?[__^L",*#C[#"&Y?``AN(0$(KB"""@X_[__^L!#(;B&!"*X@@@ +MH./^___K`2"@XP$[`>,#(,7G#P``Z@0`H.%8$I_E_O__ZP``4.,%```:7`*? +MY102G^7^___K!#"@X^PPAN4$``#J2`*?Y?P1G^7^___K`#"@X^PPAN4<`*#C +M_O__ZP"0H.$``%#C'P``"A<`H./^___K`*!0X@,``!H)`*#A'!"@X_[__^L7 +M``#J%`")XO[__^L5(*#CL"#)X02@B>47,*#C"#")Y0`PH.,,,(GE$#")Y>PP +MEN4&,,KE"@"@X>`0AN(&(*#C_O__ZP<`BN(1'H;B$""@X_[__^M+#87B"`"` +MX@D0H.'^___K`$"@X^A`AN4:`0#J``!0XQ$```HD`-CE``*%X+XBV.$&"X#B +M#`"`XC`0B.(0`%+C$""@(_[__^L!(*#C!#@!XP,@A>>^,MCA#0!3XP0@@@($ +M.`$#`R"%!UX``.H$`*#A(!&?Y?[__^L``%#C(0``&@(@H.,$.`'C`R"%YR0` +MV.4``H7@,$"(XKXBV.$&"X#B#`"`X@00H.$0`%+C$""@(_[__^LD`-CE"@"` +MXJAG`>,``H;@``"%X`0`@.(0$(3B"""@X_[__^LD`-CE#@"`X@`"AN```(7@ +M!`"`XA@0A.(((*#C_O__ZP$@H.,!.P'C`R#%YS<``.H$`*#AC!"?Y?[__^L` +M`%#C+P``&@0@H.,$.`'C`R"%YR0`V.4``H7@OB+8X08+@.(,`(#B,!"(XA`` +M4N,0(*`C_O__ZR4``.KT$```Z````/`!``#\`````!$``#01``!@$0`````` +M`#`!``"D$0``=`\``.P1```8$@``0!(``'`2``!4#P``9`\``*`2``!\#P`` +MN!(``(0/``#4$@``\!(```P3```H$P``1!,``&`3``!\$P``N!,``$0!``#( +M$```U!```%P!``#0$P``%`\````@H.,$.`'C`R"%YR0@V.4(.`'C`R"%YP$@ +MH..^/X/B`R#%Y[\_0^(#()7G6#!#X@,@A><%`*#A,!"(XG(@[^8D,-CE)/O_ +MZP4`H.'^___K`&!0XKT```H`0*#CZ$"&Y00X`>,#,)7G[#"&Y8X``.H``%3C +MC```"@0`H.$,$(KB_O__ZP!`H..'``#J`$"4Y000V.4%(-CE!C#8Y0<`V.4` +M`(WE"`#8Y00`C>4)`-CE"`"-Y=P`'^7^___K;#"4Y1$`$^,@```*!#"8Y0$` +M<^,#```:N"#8X0$X@^(#`%+A&0``"E<-A.(8`(#B!!"(XO[__^L`0%#B`$#@ +M`VH```KH-M3EW0!3XS``4Q,*```:Z2;4Y0(@@N(@`%+C(""@(PP@B.40`(CB +M;AZ$X@@0@>+^___K`$"@XUL``.I@`1_E_O__ZP!`H.-7``#J%4#@XU4``.H& +M`*#A"!"@X;0@U^$G^__K`$"@X4\``.JT4-?A`$"4Y9`!'^68$1_E!2"@X?[_ +M_^ML,)3E$``3XQ5`X`-%```*#E!%XG0'E.4``%#C`P``"H`7E.7^___K`#"@ +MXW0WA.4``%7C`$"@TSH``-H%`*#A_O__ZW0'A.6`5X3E``!0XP4``!KP`1_E +M_!$?Y7PJ`>/^___K%4#@XRX``.H.$(CB!2"@X?[__^L`0*#C*0``ZK10U^$` +M0)3E*`(?Y202'^4%(*#A_O__ZVPPE.40`!/C%4#@`Q\```H.4$7B>`>4Y0`` +M4.,#```*A!>4Y?[__^L`,*#C>#>$Y0``5>,`0*#3%```V@4`H.'^___K>`>$ +MY817A.4``%#C!0``&H@"'^6($A_EH2H!X_[__^L50.#C"```Z@X0B.(%(*#A +M_O__ZP!`H.,#``#JK`(?Y?[__^M>0.#C$@``Z@``5.,0```:``"7Y;1@U^$- +M(*#A?SW"XS\PP^,(H)/E!E"0X`I0U3``H*`S``!:XP,``!H($*#A!B"@X?[_ +M_^L`8*#A``!6XPU`X!,0`)WEM!#7X?[__^L$`*#A3-"-XO"/O>A`,)WE``!3 +MX^W\_QKO_/_J0#"=Y0``4^,+_?\:#?W_Z@Q`B.($`*#A1!,?Y?[__^L!`'#B +M``"@,P`PH./+_?_J`$"@X]3__^H50.#CTO__ZO!'+>D`8*#A`4"@X?P[".,# +M`%+AG@``"OX[".,#`%+A7F#@$YT``!JT`='A/P!0XY4``)H0,)'E``!3XY(` +M``K^___K`("@X0"0H.$``%#C"V#@`Y$```H0$)3EM*'4X0T@H.%_/<+C/S## +MXPAPD^4*4)'@!U#5,`!PH#,``%?C!```&@H@H.'^___K``!0XPD```H#``#J +M``!:XP8```H*$*#A_O__ZP@`H.&T$=3A_O__ZPU@X.-X``#J`!"9Y0$P0>(# +M`%/C`_&?EU(``.I`:@``^&H``!!K```H:P``$!"9Y>!2EN4,,-GE!P!3XP@` +M`(K<,-GA`2"@XQ(SH.'<`!/C(0``&B``$^,;```:`@`3XP$``!I>8.#C0P`` +MZ@(@H..H-P'C`R"%Y_\0`>(!`%'C`@``"@(`4>$3```:!@``Z@0PH.,0*P'C +M`C"%YQ0K`>,",(7G`&"@XS,``.H'(*#C$#L!XP,@A><&(*#C%#L!XP,@A><` +M8*#C*P``Z@8`H.$KYO_K`&"@X2<``.H`8*#C)0``ZN`"EN4P$(GBO"#9X=7S +M_^L`8*#A'P``Z@8`H.$)$*#AM"'4X3WR_^L`8*#A&0``ZN!2EN4,,)GE`0!3 +MXP,```H"`%/C7F#@$Q(``!H$``#J!0"@X?[__^L``%#C!```&@4``.H%`*#A +M_O__ZP``4.,!```*`&"@XP8``.H`8.#C!```Z@```.,``$#C_O__ZUY@X.,2 +M``#J``!6XQ```!H0`)3EM*'4X0T@H.%_/<+C/S##XPAPD^4*4)#@!U#5,`!P +MH#,``%?C`P``&@D0H.$*(*#A_O__ZP"@H.$``%KC#6#@$P@`H.&T$=3A_O__ +MZP0``.H58.#C`@``ZA`0@>(Z^O_K`&"@X08`H.'PA[WH$$`MZ0!``.,`0$#C +M`#"@XQ0PA.5D`*#C_O__ZQ1`E.4"`%3C`0``&@P`G^7^___K!`"?Y?[__^L0 +M@+WH&````'!`+>D`0`#C`$!`XQA0A.(%`*#A`!"@XP`@`.,`($#C_O__ZP4` +MH.'^___K`C"@XQ0PA.5P@+WH$$`MZ60R`^,#,)#G_S3#X_\PP^,!"%/C(P`` +M"E@R`^,#,-#G``!3XR$```IE,@/C`S#0YP$`4^,#```:3#8#XP,PD.("4*#A`V"@ +MX>!"D.4$`*#A_O__ZP``4.,$```:D`&?Y9`1G^7^___K`$#@XUT``.K(-0/C +M`S"4YP``4^,$```:=`&?Y6P1G^7^___K`$#@XU0``.JT@-7A(`!8XP0``)I8 +M`9_E3!&?Y?[__^L&0.#C3```ZFPPE.40`!/C!```"CP!G^4L$9_E_O__ZP!` +MX.-$``#J$#L!XP.@E.>V,-7A``!3XSX```H``%CC/```"B``6.,@@*`C!%"- +MX@4`H.$`$*#C)""@X_[__^LH<(WB)(`GY00`A>(&$*#A"""@X?[__^N$8(3B +MA#"4Y7@PA.4$<(?B!@"@X7@0E.7^___K`0!0XQT```IX4)3E!0"@X2PPD.1X +M,(3E!Q"@X00@G>7^___K`0!0X_'__QHH()7E!#"=Y0,`4N'M__\:;#"4Y2`` +M$^,#```*?""5Y3PQE.4#`%+AYO__&@0`H.%\$)7E_O__ZP``4.,$```:5`"? +MY4`0G^7^___K`$#@XPD``.H$`*#A"A"@X?[__^L$`*#A!!"-XO[__^L``%#C +M`$#@`P````H`0*#C!`"@X2S0C>+PA;WH+!0``'0!``!(%```9!0``(@4``"T +M%```\$\MZ2S03>("4*#A`V"@X>!"D.4$`*#A_O__ZP``4..9```*B#4#XP,0 +ME.<``%'C`P``"F`"G^7^___K`$#@XY(``.K(-0/C`S"4YP``4^.-```*G34# +MXP,PU.<``%/CB0``"A`UU.4!`%/C`P``&@0`H.'^___K`$"@XX,``.IL,)3E +M(@T3XP,```H$`*#A_O__ZP!`H.-\``#JM##5X4\/4^,K```:MC#5X0(`$^,A +M```*`7#6Y2``5^,@<*"C!("-X@@`H.$`$*#C)""@X_[__^L44(;B!`"(X@40 +MH.$'(*#A_O__ZP1PC>6L`9_E!1"@X0$@UN7^___K_O__ZPTPH.%_74!,(/B!#"%Y00`H.$($*#A_O__ZP!`H.$$,)7E`3!#X@0PA>7^___K +M4```Z@`PUN4!`%/C4```&E0!G^7^___K`$#@XTT``.H+`%/C1```F@8`H.$\ +M$9_E#""@X_[__^L!`%#C/@``&K1PU>$,<$?B#&"&X@0`C>(`$*#C)""@X_[_ +M_^L0H9_E"("-X@R1G^4,L9_E(```Z@8`H.$`$`#C`!!`XP,@C>+^___K`U#= +MY5,`5>,:```:`6"&X@H`H.'^___K`7!'XL=?Q^$&`*#AT!"?Y0(@C>+^___K +M`6"&X@%01>("(-WE`@!5X0<``+H$((WE"`"@X080H.'^___K"0"@X0L0H.$( +M(*#A_O__ZP)PW>4'8(;@!7!GX```5^/<___*_O__ZPTPH.%_74!,(/B!#"%Y00`H.$$$(WB_O__ZP!`H.$$,)7E`3!#X@0PA>7^___K`@`` +MZ@0`H.'^___K`$"@X0``5.,`0*`3````&@!`X.,$`*#A+-"-XO"/O>CD%``` +M^!0``"`5``"(`0``8!4``'P5``"8`0``7!4``/!/+>E9WTWB`+"@X1`0C>4" +M@*#A%#"-Y>"2D.6T8-+A!J"@X08`H.'^___K`%!0X@M`X`-S`0`*`!"8Y0T` +MH.%_/<#C/S##XPAPD^4&0)'@!T#4,`!PH#,``%?C!0``&@4`H.$&(*#A_O__ +MZP``4.,*```*!```Z@``5N,'```*!0"@X080H.'^___K!0"@X0H0H.'^___K +M#4#@XUD!`.JV(-CA9C<(XP,`4N$`,*`3`3"@`P@`5N,`,*#3``!3XQ8```H` +M,`#C`#!`XZ@QD^4\,(WE`##5Y=T`4^-%`0`:`@"%XCP0C>($(*#C_O__ZP$` +M4.,_`0`:`@Q6XP)LH*,5#8GB"P"`X@40H.$&(*#A_O__ZTQGB>4`0*#C-@$` +MZ@L`5N,#``#*``!6XP!`H,,-``#*%0``Z@4`H.'0%)_E#""@X_[__^L!`%#C +M]?__&@L`H.$0$)WE"""@X04PH.'W_O_K`$"@X2,!`.H$,-7G82!#XG(@[^89 +M`%+C(#!#D@0PQ9*R$(#A"P"@X0(<".-,((WB_O__ZP4`H.$`$`#C`!!`XP,@H./^___KP@`` +MZ@```.,``$#C_O__ZUPPC>(`(`#C`"!`XP,`DN@#(*#A!`""Y``0PN7P+@_C +M_R]/XP00H.,6#HWBLA"`X0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`00.,# +M(*#C_O__ZP`P`.,`,$#C%$"3Y0(`5..E```:`T"@X1@`@^+^___K`3"@XQ0P +MA.6?``#J;#"9Y0$`$^,&```*!0"@X0`0`.,`$$#C>C4!X],@F>'^___KE0`` +MZ@4`H.$`$`#C`!!`XP,@H./^___KCP``Z@L`H.$0$)WE+""-XA0PG>5$\O_K +M``!0XP!`H!,L()T%@SX-`QLS1`.3$L,`PB^@`4-)8@`%`*#A`!``XP`00.,$ +M(*#A_O__ZWP``.I`$9OE`"#1Y0$PT>4"`-'E``"-Y0,`T>4$`(WE!`#1Y0@` +MC>4%$-'E#!"-Y04`H.$`$`#C`!!`X_[__^ML``#J`3"@XTHUR>4%`*#A`!`` +MXP`00.,#(*#C_O__ZV0``.H`,*#C2C7)Y04`H.$`$`#C`!!`XP,@H./^___K +M7```ZCQ`C>(%`*#A`!``XP`00.,$(*#A_O__ZP0`H.$`$`#C`!!`X_[__^L` +M`%#C`#"@`T@PC043```*/`"-X@`0`.,`$$#C_O__ZP``4.,",*`#2#"-!0L` +M``H\`(WB`!``XP`00./^___K``!0XP4PH`-(,(T%`P``"GP!G^5\$9_E/""- +MXO[__^L`,`#C`#!`XTA`G>4`0,/E'$"-X@0`H.%($(WB!""@X_[__^L+`*#A +M$!"=Y00@H.$4,)WEWNO_ZP``4.,"```*-`&?Y2P1G^7^___K````XP``0.-( +M$)WE_O__ZP4`H.$`$`#C`!!`XP,@H./^___K'0``Z@`P`.,`,$#C`##3Y0`` +M4^,%```*`@!3XPU`H`,#```*!0!3XPY`H`,````*"T"@XP4`H.$`$`#C`!!` +MXP0@H.'^___K`#``XP`P0.,```#C``!`XP00H.$`(-/E_O__ZP0``.H%`*#A +M`!``XP`00.,#(*#C_O__ZP"0F.6T0-CA!0"@X?[__^L!<(#B=W#_Y@<`5.$$ +M<*`Q#2"@X7\]PN,_,,/C"&"3Y0=`F>`&0-0P`&"@,P``5N,$```:"0"@X040 +MH.$'(*#A_O__ZP!PH.$``%?C#4#@$P```!H`0*#C!0"@X0H0H.'^___K!`"@ +MX5G?C>+PC[WHB`$``#````!<%@``K`$``'@6``#P1RWI`F"@X>!"D.4$`*#A +M_O__ZP``4.,$```:\`"?Y?`0G^7^___K`$#@XS8``.K(-0/C`S"4YP``4^,O +M```*L##6X0$`4^,$```*R`"?Y<`0G^7^___K%4#@XRH``.H0.P'C`Z"4YX1P +MA.*$,)3E>#"$Y0)@AN(&@*#C!P"@X7@0E.7^___K`0!0XP4``!H$`*#A!A"@ +MX?[__^L``%#C%@``"A<``.IX4)3E!0"@X2`PD.1X,(3E!A"@X0@@H.'^___K +M`0!0X^O__QH$`*#A?!"5Y?[__^L``%#C!P``"@0`H.$*$*#A_O__ZP0`H.$& +M$*#A_O__ZP``4.,!```:`$#@XP```.H`0*#C!`"@X?"'O>@L%```O`$``!`7 +M``!P0"WI`E"@X>!"D.4$`*#A_O__ZP``4.,`0*`#'P``"ITU`^,#,-3G``!3 +MXQH```H`,)7E`P!3XP/QGY<#``#J>'D``'!Y``"(>0``@'D``!5`X.,1``#J +M`%"@XP0``.H"4*#C`@``Z@10H.,```#J`5"@XP0`H.$%$*#A_O__ZP``4.,$ +M```*!`"@X040H.'^___K`$"@XP```.H`0.#C!`"@X7"`O>A`0@\`@(0>`&#L +M4P#`V*<`@(U;`$!4B0``&[<`@*@2`0`V;@$`424"`&S<`H#Y-P/(%0``^!4` +M`#@7``!`%P``3!<``%07``!@%P``%]S971?875T:```4/($"PH)"`<&!00#`@$`_P```'-E=%]G +M+```!2```9V5T7W-E;G-I=&EV:71Y`.B+```!2```=W!S7W!R;V)?J+```!2```8VAA;FYE;%]P +M;&%N`````.N+```"2```9&)G`````````````````.R+```#2```%T*``!W<&%?"``(#!X)3`X>"``````"@```#!X)3`U>```)7,Z(&EN/25S"@``+````')E +M86QM87``"D*`"5S(`H`````"2`@"4P,G@``"5S(#!X)3`R6````"`````E``*"0``)7,*"0````!M86,`=FED<&ED``!A8FQEF5=(#T@)60`6R5S72!W<'-?``` +M"CT]/3T]/3T@0D(@4D5'(#T]/3T]/3T*``````H]/3T]/3T]($U!0R!214<@ +M/3T]/3T]/0H```!R='=?"D],'@E>`H```!R='=?"5X*3TP>"5X"@!R='=? +M=W)I=&4S,B@P>"5X*3TP>"5X"@!R96%D7V)B"5X*3TP>"5X"@!R96%D(%)&7W)E9R!P871H*#!X)3`R +M>"DL;V9F"D*`````'=R:71E(%)&7W)E +M9R!P871H*#!X)3`R>"DL;V9F"D*```` +M9G=S=&%T93TP>"5X"@```&%U=&A?86QG/3!X)7@L(&5N8U]A;&<],'@E>"P@ +M875T:%]T>7!E/3!X)7@L(&5N8U]T>7!E/3!X)7@*`'!M;&UE:6YF;RT^`H``'%O#HE,#)X.B4P,G@Z)3`R>#HE,#)X.B4P,G@*`````')T`H``'1I9#TE9"P@:6YD:6-A=&5?"5X+"!A`H````H02E$349L86<],'@E>`H`8E-U&UI=&)U9E]C +M;G0])60L(&9R965?>&UI=&9R86UE7V-N=#TE9`H`"5X+"!T:6U?8FET;6%P/3!X)7@* +M`````'-L965P<5]L96X])60*``!D=6UP(')X('!A8VME="`H)60I"@`````C +M(R,C(R,@2!F=6YC=&EO;@H````@/3T]($1-1FQA9R@P>"4P,G@I(#T]/2`* +M````97AT6YA;6EC(&9U;F,@ +M"@!E>'1R85]A'1R85]A&ES +M=&5N8V4@+2!"250H,RD*````97AT'1R85]A"5X"@!W +M&,U."D],'@E>`H`"5X +M"@!D8F#8P."D],'@E>`H`````9&)G +M*#!X,C@P*3TP>"5X"@````!D8F#(X +M."D],'@E>`H`````9&)G*#!X-C8T*3TP>"5X"@````!D8F#0S."D],'@E>`H`````9&)G*#!X-#0P*3TP>"5X"@`` +M``!D8F#0X-"D],'@E>`H`````9&)G +M*#!X-#@X*3TP>"5X"@````!D8F#0T +M."D],'@E>`H`````9&)G*#!X-#1C*3TP>"5X"@````!D8F#HE,#)X.B4P,G@Z)3`R>`H`````.#%]D2!F;W(@ +M;F]R;6%L(&UO9&4L(&-A;B=T(&5N=&5R(&UP(&UO9&4*````/3T^('1R:6=G +M97(@9W!I;R`P"@`]/3X@`H```!;%]S971?<&UK:61=($E77U!-2U-!7U)%34]6 +M12$*`````%MR='=?=WA?2!I +M;F1E>"`]("5D(&9O`H`````16YC#TE9`H``'=E<"P@#TP"@``;F]N90````!42TE0`````$-#35``````)7,N +M+BYC86QL(')T=U]I;F1I8V%T95]D:7-C;VYN96-T"B``4T54(%=04U])10H` +M4T54(%=04U])12P@=W!S7W!H87-E/3U?5%)510H```!)145%(#@P,BXQ,6)N +M````245%12`X,#(N,3%B`````$E%144@.#`R+C$Q8F=N``!)145%(#@P,BXQ +M,6)G````245%12`X,#(N,3%A;@```$E%144@.#`R+C$Q80````!)145%(#@P +M,BXQ,6=N````245%12`X,#(N,3%G`````'5N87-S;V-I871E9``````@4F%T +M97,@*$UB+W,I.B```````"XU```E9"5S(````'=X7V=E=%]S8V%N+"!M8W-? +M`H``'=P85]I93T`)3`R>`````!R#HE +M,#)X.B4P,G@Z)3`R>`H``')T=U]D96Q?#HE,#)X.B4P +M,G@Z)3`R>#HE,#)X"@``7!T:6]N+"!C2P@5T50"@`E +M2P@5$M)4`H`````)7,L('-E="!G2P@5T50"@``)7,L('-E="!P86ER=VES92!K97DL(%1+ +M25`*`"5S+"!S970@<&%I2P@;F]N90H`#HE,#)X.B4P,G@Z)3`R>`H`#HE,#)X +M.B4P,G@Z)3`R>``E*G,@)7,``%53``!%50``2E```"5S('5N:VYO=VX@8V]U +M;G1R>5]C;V1E.B5S"@`E'0`+G)E;"YD871A`"YB'1A8@`N&ED>``N0`` +MO`$`````````````!``````````E````"0``````````````Z/<``(@"```/ +M`````P````0````(````+P````@````#`````````+![``!@```````````` +M```(`````````#0````!`````@````````"P>P``#```````````````!``` +M``````!#`````0``<((`````````O'L``%`"```!``````````0````````` +M/P````D``````````````'#Z``!H`@``#P````<````$````"````$X````! +M`````@`````````,?@``Q`,`````````````!`````````!6`````0```#(` +M````````T($``(@7``````````````0````!````90````$````````````` +M`%B9```2```````````````!`````````&X````!``````````````!JF0`` +M`````````````````0````````!^`````P``<```````````:ID``"L````` +M``````````$`````````$0````,``````````````)69``".```````````` +M```!``````````$````"``````````````#,G```H!X``!````!U`0``!``` +M`!`````)`````P``````````````;+L``'01``````````````$````````` +M``````````````````````$```````````````0`\?\````````````````# +M``$``````````````````P`#``````````````````,`!0`/`````````$`` +M```"``$`&0`````````````````!``````````````````,`!@`````````` +M```````#``<`'````$`````(`````@`!`!D```!``````````````0`L```` +M2````%`````"``$`&0```$@````````````!`#P```"8````4`````(``0`9 +M````F`````````````$`&0```.@````````````!`$P````L`0``'`````(` +M`0`9````+`$```````````$`6P```$@!``!4`````@`!`!D```!(`0`````` +M`````0!K````G`$``!P````"``$`&0```)P!```````````!`'L```"X`0`` +M'`````(``0`9````N`$```````````$`C````-0!```8`````@`!`!D```#4 +M`0```````````0"=````[`$``#@````"``$`&0```.P!```````````!`*T` +M```D`@``"`````(``0`9````)`(```````````$`O@```"P"```(`````@`! +M`!D````L`@```````````0#$````-`(```@````"``$`&0```#0"```````` +M```!`.`````\`@``"`````(``0`9````/`(```````````$`]P```$0"```( +M`````@`!`!D```!$`@```````````0`-`0``3`(```@````"``$`&0```$P" +M```````````!`!P!``!4`@``"`````(``0`9````5`(```````````$`*`$` +M`%P"```(`````@`!`!D```!<`@```````````0`T`0``9`(```@````"``$` +M&0```&0"```````````!`$$!``!L`@``"`````(``0`9````;`(````````` +M``$`2@$``'0"``"``````@`!`!D```!T`@```````````0!A`0``]`(``*0` +M```"``$`&0```/0"```````````!`&T!````````````````"@!R`0`````` +M``````````D`?`$``!0````````````*`($!``"8`P``\`````(``0`9```` +MF`,```````````$`DP$``+0````````````*`)@!``#8````````````"@"= +M`0``@`0```````````$`&0```(@$```````````!`*`!``#T```````````` +M"@"E`0``(`$```````````H`J@$``#0!```````````*`+`!```H`0`````` +M````"@"=`0``P`4```````````$`M0$``,0%``!(`````@`!`!D```#$!0`` +M`````````0#$`0``.`$```````````H`R@$```P&``!$"````@`!`!D````, +M!@```````````0#;`0``N`(```````````H`X0$``,`"```````````*`)T! +M``#`#0```````````0#G`0``4`X``$0!```"``$`&0```%`.```````````! +M`)T!``",#P```````````0#U`0``E`\``*P$```"``$`&0```)0/```````` +M```!``8"``!``0``````````"@`,`@``3`$```````````H`$@(``"`#```` +M```````*`!@"``"(`P``````````"@`>`@``U`(```````````H`)`(``"@# +M```````````*`"H"``!L`P``````````"@`P`@``V`(```````````H`G0$` +M`!04```````````!`#8"``!`%```[`$```(``0`9````0!0```````````$` +M2`(``,`#```````````*`$X"````````````````!0"=`0``%!8````````` +M``$`6`(``"P6``"$`0```@`!`!D````L%@```````````0!C`@``+`0````` +M``````H`:0(``$`$```````````*`&\"``!(!```````````"@!U`@``4`0` +M``````````H`>P(``&`$```````````*`($"``!4!```````````"@"=`0`` +MI!<```````````$`AP(``+`7```T`````@`!`!D```"P%P```````````0"5 +M`@``=`0```````````H`&0```.07```````````!`)L"``!\!``````````` +M"@"A`@``:`(```````````H`&0```'P8```````````!`*<"``"8!``````` +M````"@"M`@``E!D``!@````"``$`&0```)09```````````!`+P"``"L&0`` +M@`P```(``0`9````K!D```````````$`G0$``.`9```````````!`!D````@ +M&@```````````0#)`@``M`0```````````H`SP(``,P$```````````*`-4" +M``#D!```````````"@#;`@``_`0```````````H`X0(``!0%```````````* +M`.<"```L!0``````````"@#M`@``1`4```````````H`\P(``%P%```````` +M```*`/D"``!T!0``````````"@#_`@``K`4```````````H`!0,``.0%```` +M```````*``L#``#T!0``````````"@`1`P``,`8```````````H`%P,``$@& +M```````````*`!T#``!8!@``````````"@`C`P``:`8```````````H`*0,` +M`'0&```````````*`"\#``"`!@``````````"@`U`P``D`8```````````H` +M.P,``,`&```````````*`$$#``#8!@``````````"@!'`P``_`8````````` +M``H`30,``"0'```````````*`%,#``!(!P``````````"@!9`P``7`<````` +M``````H`7P,``(P'```````````*`&4#``#X!P``````````"@!K`P``%`@` +M``````````H`<@,``"0(```````````*`'D#``!,"```````````"@"``P`` +M>`@```````````H`AP,``)`(```````````*`(X#``#("```````````"@"5 +M`P``"`D```````````H`G`,``"0)```````````*`*,#```\"0`````````` +M"@"J`P``4`D```````````H`L0,``%@)```````````*`+@#``!\"0`````` +M````"@"_`P``[`H```````````H`Q@,``/P*```````````*`,T#```,"P`` +M````````"@#4`P``'`L```````````H`VP,``"P+```````````*`.(#``!` +M"P``````````"@#I`P``5`L```````````H`\`,``&@+```````````*`/<# +M``!\"P``````````"@#^`P``D`L```````````H`!00``*0+```````````* +M``P$``"X"P``````````"@`3!```S`L```````````H`&@0``.`+```````` +M```*`"$$``#T"P``````````"@`H!```"`P```````````H`+P0``!P,```` +M```````*`#8$```P#```````````"@`]!```1`P```````````H`1`0``%@, +M```````````*`$L$``!L#```````````"@"=`0``\"4```````````$`4@0` +M`"PF```H`````@`!`!D````L)@```````````0!J!```5"8``!@#```"``$` +M&0```%0F```````````!`'H$``!\#```````````"@"!!```K`P````````` +M``H`B`0``)0,```````````*`(\$``!L*0``6`,```(``0`9````;"D````` +M``````$`G0$``*PL```````````!`*`$``#$+```7`(```(``0`9````Q"P` +M``````````$`G0$``!`O```````````!`+$$```@+P``<`$```(``0`9```` +M("\```````````$`G0$``*`O```````````!`!D```"\+P```````````0#` +M!```D#```#0````"``$`&0```)`P```````````!`-`$```8#@`````````` +M"@#7!```Q#```%`````"``$`&0```,0P```````````!`.@$```4,0``;``` +M``(``0`9````%#$```````````$`]P0``(`Q``"8`@```@`!`!D```"`,0`` +M`````````0`&!0``*`X```````````H`#04``)@.```````````*`!0%``#` +M#@``````````"@"=`0``"#0```````````$`&P4``!@T``#4`P```@`!`!D` +M```8-````````````0`N!0``%`\```````````H`G0$``-0W```````````! +M`#4%``#L-P``2`$```(``0`9````[#<```````````$`G0$``%`X```````` +M```!`!D```!@.````````````0!(!0``=`\```````````H`3P4``'P/```` +M```````*`%8%``"$#P``````````"@!=!0``-#D``"P!```"``$`&0```#0Y +M```````````!`)T!``!<.0```````````0`9````B#D```````````$`G0$` +M`%@Z```````````!`&T%``!@.@``U`,```(``0`9````8#H```````````$` +MG0$``'P[```````````!`!D```"\.P```````````0"=`0``6#P````````` +M``$`&0```)@\```````````!`)T!```L/@```````````0!\!0``-#X``!@` +M```"``$`&0```#0^```````````!`(X%``!,/@``J`$```(``0`9````3#X` +M``````````$`G@4``/0_``!4`0```@`!`!D```#T/P```````````0"=`0`` +M1$$```````````$`K@4``$A!``"$`0```@`!`!D```!(00```````````0"^ +M!0``W`\```````````H`Q04``.P/```````````*`,P%``#\#P`````````` +M"@#3!0``#!````````````H`V@4``!P0```````````*`.$%```L$``````` +M````"@#H!0``/!````````````H`[P4``$P0```````````*`/8%``!<$``` +M````````"@#]!0``S$(``$`!```"``$`&0```,Q"```````````!``X&```` +M`````````````P`8!@``#$0``'0````"``$`&0````Q$```````````!`"@& +M``"`1```W`L```(``0`9````@$0```````````$`-P8``&P0```````````* +M`#X&``"`$```````````"@!%!@``?!````````````H`3`8``(00```````` +M```*`%,&``"P$```````````"@!:!@``N!````````````H`808``,`0```` +M```````*`)T!``!84````````````0!H!@``7%```"P!```"``$`&0```%Q0 +M```````````!`'@&``"(40``9`````(``0`9````B%$```````````$`&0`` +M`.Q1```````````!`!D```!$4@```````````0`9````G%(```````````$` +MB`8``-Q2``#X`````@`!`!D```#<4@```````````0"6!@``\`$````````` +M``H`G0$``-!3```````````!`)P&``#44P``,`````(``0`9````U%,````` +M``````$`J`8```14``#D`````@`!`!D````$5````````````0"[!@``R!`` +M``````````H`G0$``.!4```````````!`,(&``#H5```>!0```(``0`9```` +MZ%0```````````$`G0$``,A5```````````!`!D````45@```````````0"= +M`0``=&4```````````$`&0````!F```````````!`!D```!@:0`````````` +M`0"=`0``,&H```````````$`&0```$!J```````````!`-0&``#P$P`````` +M````"@`9````"&P```````````$`G0$``$1L```````````!`!D```!(;``` +M`````````0#;!@``%!0```````````H`&0```(!L```````````!`.(&``!` +M;0``U`$```(``0`9````0&T```````````$`G0$``/QN```````````!`/,& +M```4;P``O`(```(``0`9````%&\```````````$``P<``%P5```````````* +M`)T!``"P<0```````````0`*!P``T'$``"@&```"``$`&0```-!Q```````` +M```!`)T!``"H0``J`````(``0`9```` +M&'D```````````$`G0$``%AY```````````!`!D```!H>0```````````0`` +M```````````````#``D`H@<````````,`````0`)`+$'```,````$0````$` +M"0#`!P``(`````X````!``D`SP<``#`````1`````0`)`-X'``!$````$@`` +M``$`"0#M!P``6`````L````!``D`_`<``&0````/`````0`)``L(``!T```` +M$0````$`"0`:"```B````!`````!``D`*0@``)@````$`````0`)`)T!``"8 +M````````````"0`U"```G`````T````!``D`00@``*P````.`````0`)`%`( +M``"\````!0````$`"0!;"```Q`````D````!``D`9@@``-`````$`````0`) +M`'((``#4````$P````$`"0"!"```Z````!(````!``D`D`@``/P````6```` +M`0`)`)\(```4`0``!`````$`"0"K"```&`$```8````!``D`MP@``"`!```/ +M`````0`)`,8(```P`0``$P````$`"0#5"```1`$``!<````!``D`Y`@``%P! +M```7`````0`)`/,(``!T`0``$0````$`"0`""0``F`$``!`````!``D`$0D` +M`*@!```$`````0`)`!T)``"L`0``$`````$`"0`L"0``O`$```\````!``D` +M.PD``,P!``#X`0```0`)`)T!`````````````````P!,"0``;````.`````! +M``,`60D``$P!``!P`````0`#``````````````````,`"@"=`0`````````` +M``````4`;0D````````0`````0`%`'X)```0`````0````$`!0"3"0``$0`` +M``$````!``4`I@D``!@```!(`````0`%``````````````````,`#``````` +M```````````#``L``````````````````P`-`+L)`````````````!````#2 +M"0``Z````$0````2``$`[PD`````````````$````/8)`````````````!`` +M``#]"0``B`0``#P!```2``$`"0H`````````````$````!$*```````````` +M`!`````="@`````````````0````+@H`````````````$````#@*```````` +M`````!`````_"@`````````````0````1@H`````````````$````%D*```` +M`````````!````!@"@`````````````0````;PH`````````````$````(@* +M`````````````!````"9"@`````````````0````K@H`````````````$``` +M`+\*`````````````!````#-"@`````````````0````X0H````````````` +M$````/@*`````````````!````#_"@`````````````0````!PL````````` +M````$````!D+`````````````!`````E"P`````````````0````-0L````` +M````````$````$P+`````````````!````!>"P`````````````0````;`L` +M````````````$````((+`````````````!````")"P`````````````0```` +ME`L``.07``"8````$@`!`*`+``!\&```&`$``!(``0"M"P`````````````0 +M````N@L`````````````$````,0+`````````````!````#/"P`````````` +M```0````VPL`````````````$````.@+`````````````!````#X"P`````` +M```````0````"0P`````````````$````"$,`````````````!`````Q#``` +M```````````0````1`P`````````````$````%(,`````````````!````!A +M#``````````````0````<0P`````````````$````(`,`````````````!`` +M``",#``````````````0````EPP`````````````$````*,,```````````` +M`!````"Z#``````````````0````Q@P`````````````$````-@,```````` +M`````!````#M#``````````````0````_@P`````````````$````!8-```` +M`````````!`````O#0`````````````0````/`T`````````````$````$T- +M`````````````!````!?#0`````````````0````:@T`````````````$``` +M`'X-`````````````!````";#0`````````````0````I`T````````````` +M$````+T-`````````````!````#)#0`````````````0````T`T````````` +M````$````.(-`````````````!````#]#0`````````````0````#`X````` +M````````$````!8.`````````````!`````R#@``[%$``%@````2``$`40X` +M````````````$````&4.``!$4@``6````!(``0"!#@``G%(``$`````2``$` +MH0X`````````````$````+0.`````````````!````#$#@`````````````0 +M````T@X`````````````$````.8.`````````````!````#T#@`````````` +M```0````"P\`````````````$````!"YC`&AE>#)N=6U?:0`D80!R='=?=WA? +M%]G971?%]G971?0!R='=?=WA?0!R='=?=WA?%]G971? +M97-S:60`7!T:6]N`"Y,0S$V,@!R='=?=WA? +M'0`+DQ#,38W`"Y,0S$V.``N3$,Q-CD`%]S971?9V5N7VEE`')T=U]W>%]G +M971?%]G971?%]G971?9G)E<0!T%]S971?;6QM90!S971?9W)O=7!?:V5Y`"Y,0S(V`'-E=%]W97!? +M:V5Y`')T=U]S971?=W!S7V)E86-O;@`N3$,Q.3``%]S971? +M%]S971?=V%P`')T=U]W>%]S971?;6]D90!?7V9U;F-?7RXS-S8Y,@!? +M7V9U;F-?7RXS.3,U,P!?7V9U;F-?7RXS-S5]D;VUA:6X`=6E?<&ED`'!R:6YT +M:P!R9E]R96=?9'5M<`!S<')I;G1F`%]R='=?;65M5]F5\R8VAA0!R='=?0!R +M='=?7!E`')T=U]S971?&ET`&US;&5E<`!W86ME7W5N;&]C:P!W86ME7VQO8VM?9&5S=')O>0!R +M=&PX,3@X7W!O=V5R7W-A=F5?:6YI=`!W86ME7VQO8VM?:6YI=`!W86ME7VQO +M8VL`5]C;60``,` +M`"PV``!\`P``*S4``(`#```L-0``B`,``!QX`0"P`P``''@!`.P#```<>`$` +M5`0``"LY``!8!```+#D``%P$```<>`$`:`0``"LZ``!L!```+#H``'`$```< +M>`$`@`0```)L`0"$!````FP!`*@$```K/0``K`0``"P]``"P!```''@!`-P$ +M```K/@``X`0``"P^``#D!```*S\``.@$```L/P``[`0``"M```#P!```+$`` +M`/P$```<>`$`8`4``!QX`0!L!0``''@!`(0%```<>`$`P`4```)L`0#T!0`` +M*T0``/@%```L1`````8``!QZ`0!,!@``''L!`%P&```<>P$`E`8``!Q\`0"X +M!@``''T!`.0&```<>`$`%`<``!Q^`0!$!P``''\!`%@'```<>`$`;`<``!R` +M`0!\!P``''@!`(P'```<>P$`E`<``!QX`0"D!P``''H!`,`'```<>`$`U`<` +M`!QX`0#H!P``''H!```(```<>`$`%`@``!QZ`0`H"```''@!`#@(```<>@$` +M5`@``!QX`0!H"```''H!`(`(```<>`$`D`@``!QZ`0"D"```''@!`*P(```< +M@0$`Q`@``!Q_`0#@"```'((!`/0(```<>`$`!`D``!R"`0`@"0``''@!`$0) +M```<@P$`8`D``!QX`0!\"0``'(`!`(P)```<>`$`F`D``!QX`0"H"0``''L! +M`-`)```<>`$`Y`D``!QZ`0#L"0``''@!`/P)```<>@$`%`H``!R!`0`H"@`` +M''@!`#P*````$`D`H``!Q[`0"L +M"@``*T<``+`*```L1P``N`H``!QX`0#`"@``*T@``,0*```L2```T`H``!QZ +M`0#D"@``''@!`/0*```<>@$`#`L``!QX`0`<"P``''H!`#`+```<@0$`2`L` +M`!Q_`0!T"P``'(,!`(P+```<>`$`J`L``!R``0"X"P``''@!`,0+```<>`$` +MU`L``!Q[`0#X"P``''@!``P,```<>@$`%`P``!QX`0`D#```''H!`#@,```< +M@0$`4`P``!Q_`0!\#```'(,!`)0,```<>`$`L`P``!R``0#`#```''@!`,P, +M```<>`$`W`P``!Q[`0``#0``''@!`!0-```<>@$`'`T``!QX`0`L#0``''H! +M`$`-```<@0$`6`T``!Q_`0!P#0``'(4!`'@-````$`:!```!R!`0!\$```''@!`(@0```<>`$`H!```!R' +M`0#8$```'(,!`/00```<>`$`$!$``!R(`0`@$0``''@!`#`1```<>`$`0!$` +M`"M2``!$$0``+%(``$@1````$`$!(``"M3```4$@``+%,``!@2````$`9!,``!R'`0"< +M$P``'(,!`+@3```<>`$`U!,``!R(`0#D$P``''@!`/03```<>`$`%!0```)) +M`0`8%````FP!`!P4```";`$`(!0```)L`0`D%````FP!`"@4```";`$`+!0` +M``)L`0`P%````FP!`#04```";`$`.!0```)L`0`\%````FP!`%`4```K6@`` +M5!0``"Q:``!<%```''@!`&`4```K6P``9!0``"Q;``!X%```*XH!`'P4```L +MB@$`C!0``!R+`0#4%```''P!`.P4````$`-!4``!R-`0!4%0``'(X!`'@5```!<` +M`"MC``!\%P``+&,``(`7```K9```A!<``"QD``"4%P``''@!`*07```"20$` +MJ!<```)L`0"L%P```DD!`,`7```@$`[!<``"MJ``#P%P``+&H``/07```<>`$``!@``"MK```$&```+&L```@8 +M```K0```#!@``"Q````0&```*S\``!08```L/P``/!@``!QX`0!(&```')0! +M`%08```<>`$`9!@``!QX`0"$&```*VT``(@8```L;0``C!@``!QX`0"8&``` +M*VL``)P8```L:P``H!@``"M```"D&```+$```*@8```K/P``K!@``"P_``#4 +M&```''@!`.`8````$`8!D` +M`!R4`0!L&0``''@!`'P9```<>`$`H!D``!R7`0#@&0```@(``.09```"`@`` +MZ!D```("``#L&0```@(``/`9```"`@``]!D```("``#X&0```@(``/P9```" +M`@```!H```("```$&@```@(```@:```"`@``#!H```("```0&@```@(``!0: +M```"`@``&!H```("```<&@```@(``$`:````$`9!H``!R9`0!L&@``*W4``'`:```L=0``>!H``!QX`0"(&@`` +M')0!`)`:```K=@``E!H``"QV``"<&@``''@!`,@:````$`,!L``!R7`0`\&P``')0!`$0;```K>0``2!L` +M`"QY``!0&P``''@!`'0;```K>@``>!L``"QZ``"`&P``''@!`+P;```K>P`` +MP!L``"Q[``#(&P``''@!`/`;```K?```]!L``"Q\````'```''@!`$@<```K +M?0``3!P``"Q]``!8'```''@!`&0=```K?@``:!T``"Q^``!P'0``''@!`)P= +M```K?P``H!T``"Q_``"D'0``''@!`*P=```K@```L!T``"R```"X'0``''@! +M`,`=```K@0``Q!T``"R!``#,'0``''@!`-`=```K@@``U!T``"R"``#<'0`` +M''@!`.0=```K@P``Z!T``"R#``#P'0``''@!`/0=```KA```^!T``"R$```` +M'@``''@!``0>```KA0``"!X``"R%```0'@``''@!`"0>``````<>`$`8!X``"N'``!D'@``+(<``'`>```<>`$`=!X` +M`"N(``!X'@``+(@``(@>```<>`$`G!X``"N)``"@'@``+(D``*0>```<>`$` +MJ!X``"N*``"L'@``+(H``+P>```<>`$`P!X``"N+``#$'@``+(L``,P>```< +M>`$`T!X``"N,``#4'@``+(P``.`>```<>`$`[!X``"N-``#P'@``+(T```P? +M```<>`$`3!\``!QX`0!P'P``*XX``'0?```LC@``@!\``!QX`0",'P``*X\` +M`)`?```LCP``E!\``!QX`0"T'P``*Y```+@?```LD```S!\``!QX`0#4'P`` +M*Y$``-@?```LD0``[!\``!QX`0#P'P``*Y(``/0?```LD@```"```!QX`0`( +M(```*Y,```P@```LDP``("```!QX`0`D(```')T!`$P@```KA@``4"```"R& +M``!8(```*XD``%P@```LB0``9"```"N-``!H(```+(T``(0@```KAP``B"`` +M`"R'``",(```*X@``)`@```LB```W"```!QX`0#L(```''@!```A```<>`$` +M&"$``!QX`0`L(0``''@!`#@A```<>`$`2"$``!QX`0!4(0``''@!`'@A```< +M>`$`E"$``!R>`0#((0``')\!`-`A```KE```U"$``"R4``#<(0``''@!``@B +M```<>`$`*"(``"N5```L(@``+)4``#@B```<>`$`0"(``"N6``!$(@``+)8` +M`$@B```KEP``3"(``"R7``!0(@``''@!`%PB```KF```8"(``"R8``!H(@`` +M*YD``&PB```LF0``<"(``!QX`0"0(@``')8!`*0B````$`^"(``!QX`0``(P``''@!``@C```<>`$`$",``!QX +M`0`8(P``''@!`"`C```<>`$`6",``"N:``!<(P``+)H``&0C```<>`$`?",` +M`!R:`0"((P``')@!`)`C```KFP``E",``"R;``"8(P``''@!`*@C`````#\(P``+)X````D +M```<>`$`$"0``!R4`0`8)```*Y\``!PD```LGP``("0``!QX`0`L)```')0! +M`#0D```KH```."0``"R@```\)```''@!`$@D````$`9"0``!R4`0!L)```*Z(``'`D```LH@``="0``!QX`0"` +M)```')0!`(@D```KHP``C"0``"RC``"0)```''@!`)PD````$`L"0``"L_``"T)```+#\``+@D```<>`$`Q"0` +M`!R4`0#,)```*Z4``-`D```LI0``U"0``!QX`0#@)```')0!`.@D```KI@`` +M["0``"RF``#P)```''@!`/PD````$`&"4``!R4`0`@)0``*Z@``"0E```LJ```*"4``!QX`0`T)0``')0!`#PE +M```KJ0``0"4``"RI``!$)0``''@!`%`E````$`;"4``!R4`0!T)0``*ZL``'@E```LJP``?"4``!QX`0"()0`` +M')0!`)`E```KK```E"4``"RL``"8)0``''@!`*0E````$`P"4``!R4`0#()0``*ZX``,PE```LK@``T"4``!QX +M`0#8)0``*Z\``-PE```LKP``X"4``!QX`0#P)0```FP!`/0E```";`$`^"4` +M``)L`0#\)0```FP!```F```";`$`!"8```)L`0`()@```FP!``PF```";`$` +M$"8```)L`0`4)@```FP!`!@F```";`$`'"8```)L`0`@)@```FP!`"0F```" +M;`$`*"8```)L`0!`)@``'*`!`&0F```KM0``:"8``"RU``!L)@``''@!`*0F +M````$`#"@``!R?`0!0*``` +M''@!`&@H````$`Q"H``!R8 +M`0#8*@``')D!`.PJ````$`;"P``!RD`0"D+```'*8!`*PL```";`$` +ML"P```))`0"T+````FP!`+@L```";`$`O"P```)L`0#`+````FP!`/0L```< +MIP$`""T``!QX`0`8+0``'(T!`$PM````$`^"T``!R-`0`@+@``''L!`&0N```<>P$`H"X``!QX`0#`+@``'*`$`,#(``!QX`0!(,@``''@!`(0R```KS``` +MB#(``"S,``",,@``''@!`,0R```KS0``R#(``"S-``#,,@``''@!`%@S```< +M>`$`S#,``!RG`0#8,P``'*@!``@T```";`$`##0```)L`0`0-````FP!`!0T +M```";`$`>#0``"O1``!\-```+-$``(`T````$`9#4``!RH`0!X-0`` +M''@!`)PU```P$`4#@```("``!4.````@(``%@X```" +M`@``7#@```("``!@.```*]$``&0X```LT0``;#@``"O7``!P.```+-<``'@X +M```KV```?#@``"S8``"$.```*]D``(@X```LV0``F#@``!R+`0#@.```'*#T``!QX`0"D/0``'*`$``#X``"LU +M```$/@``+#4``"0^````0`440``''8!`&!1```P$`(%(``!Q[`0`X4@``'+\!`&!2```< +M>P$`>%(``!RG`0"04@``'+\!`+A2```<>P$`T%(``!R_`0#P4@``*Q`!`/12 +M```L$`$`_%(``!QX`0`$4P``'*\!`"!3````$`7%0``!RF`0!X5```'*4!`)A4```<>`$`K%0``!RG +M`0#`5```',0!`.!4```";`$`Y%0```))`0`H50``'*4!`'!5````$`R%4```("``#,50```@(``-!5```"`@`` +MU%4```("``#850```@(``-Q5```"`@``X%4```("``#D50```@(``.A5```" +M`@``[%4```("``#P50```@(``/15```"`@``^%4```("``#\50```@(```!6 +M```"`@``!%8```("```(5@```@(```Q6```"`@``$%8```("```@5@``''@! +M`"A6```%<``!QX`0"P5P``')P!`,17```P$`/%D``!RG`0!D60``'+(!`)19```<>P$`K%D` +M`!RR`0#(60``'*```<>`$`J%X``!Q_`0"\7@``''@!`-!>````$`4&```!RG`0"P8```''@!`-1@````$`4&(``!RK`0#(8@``'*`$`/&,``!RG`0!,8P``'*`$`\&8``!R<`0`P9P``'*`$`@&<``!QX`0"H9P``'*8!`,1G````$`0&@``!RF`0!<:```'*4!`'QH```<>`$`D&@``!RG`0"@ +M:```''@!`.AH````$` +MS&L``!RD`0#D:P``'*8!``QL```K6P``$&P``"Q;```@;```'-(!`#1L```< +MTP$`/&P``!S4`0!$;````@0``$QL```K6P``4&P``"Q;``!@;```*R4!`&1L +M```L)0$`:&P``!S6`0!P;```'-`$`T&T``!QX`0`0;@`` +M''L!`"AN````0!H;@``'(T!`*AN````0"`<0``')\!`(QQ````$`Q'8``"L^`0#(=@``+#X!`-!V```<>`$`V'8``"LT`0#<=@``+#0! +M`.1V``````''@!`$QX```<>`$`?'@``!R>`0"0>```'.0!`+AX``````'-P!`.QX```0```DD!`!1Y```" +M;`$`*'D``!S8`0!8>0```@(``%QY```"`@``8'D```("``!D>0```@(``)1Y +M`````!X +M`````AX``'P````""0``@`````+[``"$`````D4!`(@````""P``C`````(> +M``"0`````@T``)@````"^```G`````(N`0"L`````AX``+`````"'@``O``` +M``)"`0#``````L<``,0````""0$`R`````(>``#,`````BH!`-`````"!P$` +MU`````(G`0#8`````L4``-P````"'@``X`````+"``#L`````NH``/`````" +MZ```]`````(>``#X`````A```/P````"$@````$```(4```$`0```AX```@! +M```"'@``#`$```(>```0`0```A8``!0!```"R0``&`$```*^```<`0```AX` +M`"`!```"&```+`$```+F```T`0```MH``#P!```"TP``1`$```*[``!,`0`` +M`FX``%`!```"9@``5`$```(F``!8`0```K@``%P!```"LP``8`$```(R``!D +M`0```DH``&@!```"(@``;`$```(@``!P`0```B0``'0!```"L0``>`$```)P +M``!\`0```AH``(`!```"0@``A`$```(<``"(`0```AP``(P!```"*```D`$` +M``(J``"4`0```BP``)P!```"+@``H`$```(<``"D`0```ET``*@!```"'``` +MK`$```)8``"P`0```AP``+0!```"30``N`$```)%````````*@(````````` +M=0$`"````"H"```0````*@(``!@````J`@``(````"H"```H````*@(``#`` +M```J`@``.````"H"``!`````*@(``$@````J`@``4````"H"``!8````*@(` +M`&`````J`@``:````"H"``!P````*@(``'@````J`@``@````"H"``"(```` +M*@(``)`````J`@``F````"H"``"@````*@(``*@````J`@``L````"H"``"X +M````*@(``,`````J`@``R````"H"``#0````*@(``-@````J`@``X````"H" +M``#@`````(D!`.0````J!P``Z````"H"``#P````*@(``/@````J`@````$` +M`"H"```(`0``*@(``!`!```J`@``&`$``"H"```@`0``*@(``"@!```J`@`` +M,`$``"H"```X`0``*@(``$`!```J`@``2`$``"H"``!0`0``*@(``%@!```J +M`@``8`$``"H"``!H`0``*@(``'`!```J`@``>`$``"H"``"``0``*@(``(@! +M```J`@``D`$``"H"``"8`0``*@(``*`!```J`@``J`$``"H"``"P`0``*@(` +M`+@!```J`@``P`$``"H"``#(`0``*@(``-`!```J`@``V`$``"H"``#@`0`` +M*@(``.@!```J`@``\`$``"H"``#X`0``*@(````"```J`@``"`(``"H"```0 +M`@``*@(``!@"```J`@``(`(``"H"```H`@``*@(``#`"```J`@``.`(``"H" +2``!``@``*@(``$@"```J`@`` +` +end diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c new file mode 100755 index 000000000000..9f4f3fef874f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c @@ -0,0 +1,781 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#define _MLME_OSDEP_C_ + +#include +#include +#include +#include + + +#ifdef RTK_DMP_PLATFORM +void Linkup_workitem_callback(struct work_struct *work) +{ + struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkup_workitem); + _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv); + +_func_enter_; + + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkup_workitem_callback\n")); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKUP); +#else + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKUP); +#endif + +_func_exit_; +} + +void Linkdown_workitem_callback(struct work_struct *work) +{ + struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkdown_workitem); + _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv); + +_func_enter_; + + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkdown_workitem_callback\n")); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKDOWN); +#else + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKDOWN); +#endif + +_func_exit_; +} +#endif + + +/* +void sitesurvey_ctrl_handler(void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + + _sitesurvey_ctrl_handler(adapter); + + _set_timer(&adapter->mlmepriv.sitesurveyctrl.sitesurvey_ctrl_timer, 3000); +} +*/ + +void rtw_join_timeout_handler (void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + _rtw_join_timeout_handler(adapter); +} + + +void _rtw_scan_timeout_handler (void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + rtw_scan_timeout_handler(adapter); +} + + +void _dynamic_check_timer_handlder (void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + + rtw_dynamic_check_timer_handlder(adapter); + + _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); +} + +#ifdef CONFIG_SET_SCAN_DENY_TIMER +void _rtw_set_scan_deny_timer_hdl(void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + rtw_set_scan_deny_timer_hdl(adapter); +} +#endif + + +void rtw_init_mlme_timer(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + _init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev, rtw_join_timeout_handler, padapter); + //_init_timer(&(pmlmepriv->sitesurveyctrl.sitesurvey_ctrl_timer), padapter->pnetdev, sitesurvey_ctrl_handler, padapter); + _init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev, _rtw_scan_timeout_handler, padapter); + + _init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, _dynamic_check_timer_handlder, padapter); + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + _init_timer(&(pmlmepriv->set_scan_deny_timer), padapter->pnetdev, _rtw_set_scan_deny_timer_hdl, padapter); + #endif + +#ifdef RTK_DMP_PLATFORM + _init_workitem(&(pmlmepriv->Linkup_workitem), Linkup_workitem_callback, padapter); + _init_workitem(&(pmlmepriv->Linkdown_workitem), Linkdown_workitem_callback, padapter); +#endif + +} + +extern void rtw_indicate_wx_assoc_event(_adapter *padapter); +extern void rtw_indicate_wx_disassoc_event(_adapter *padapter); + +void rtw_os_indicate_connect(_adapter *adapter) +{ + +_func_enter_; + + rtw_indicate_wx_assoc_event(adapter); + netif_carrier_on(adapter->pnetdev); + + if(adapter->pid[2] !=0) + rtw_signal_process(adapter->pid[2], SIGALRM); + +#ifdef RTK_DMP_PLATFORM + _set_workitem(&adapter->mlmepriv.Linkup_workitem); +#endif + +_func_exit_; + +} + +static RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ]; +void rtw_reset_securitypriv( _adapter *adapter ) +{ + u8 backupPMKIDIndex = 0; + u8 backupTKIPCountermeasure = 0x00; + + if(adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)//802.1x + { + // Added by Albert 2009/02/18 + // We have to backup the PMK information for WiFi PMK Caching test item. + // + // Backup the btkip_countermeasure information. + // When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. + + _rtw_memset( &backupPMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + + _rtw_memcpy( &backupPMKIDList[ 0 ], &adapter->securitypriv.PMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + backupPMKIDIndex = adapter->securitypriv.PMKIDIndex; + backupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure; + + _rtw_memset((unsigned char *)&adapter->securitypriv, 0, sizeof (struct security_priv)); + //_init_timer(&(adapter->securitypriv.tkip_timer),adapter->pnetdev, rtw_use_tkipkey_handler, adapter); + + // Added by Albert 2009/02/18 + // Restore the PMK information to securitypriv structure for the following connection. + _rtw_memcpy( &adapter->securitypriv.PMKIDList[ 0 ], &backupPMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + adapter->securitypriv.PMKIDIndex = backupPMKIDIndex; + adapter->securitypriv.btkip_countermeasure = backupTKIPCountermeasure; + + adapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; + adapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; + + } + else //reset values in securitypriv + { + //if(adapter->mlmepriv.fw_state & WIFI_STATION_STATE) + //{ + struct security_priv *psec_priv=&adapter->securitypriv; + + psec_priv->dot11AuthAlgrthm =dot11AuthAlgrthm_Open; //open system + psec_priv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + psec_priv->dot11PrivacyKeyIndex = 0; + + psec_priv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psec_priv->dot118021XGrpKeyid = 1; + + psec_priv->ndisauthtype = Ndis802_11AuthModeOpen; + psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled; + psec_priv->wps_phase = _FALSE; + //} + } +} + +void rtw_os_indicate_disconnect( _adapter *adapter ) +{ + //RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ]; + +_func_enter_; + + rtw_indicate_wx_disassoc_event(adapter); + netif_carrier_off(adapter->pnetdev); + +#ifdef RTK_DMP_PLATFORM + _set_workitem(&adapter->mlmepriv.Linkdown_workitem); +#endif + rtw_reset_securitypriv( adapter ); + +_func_exit_; + +} + +void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie) +{ + uint len; + u8 *buff,*p,i; + union iwreq_data wrqu; + +_func_enter_; + + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+rtw_report_sec_ie, authmode=%d\n", authmode)); + + buff = NULL; + if(authmode==_WPA_IE_ID_) + { + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("rtw_report_sec_ie, authmode=%d\n", authmode)); + + buff = rtw_malloc(IW_CUSTOM_MAX); + + _rtw_memset(buff,0,IW_CUSTOM_MAX); + + p=buff; + + p+=sprintf(p,"ASSOCINFO(ReqIEs="); + + len = sec_ie[1]+2; + len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX; + + for(i=0;ipnetdev,IWEVCUSTOM,&wrqu,buff); + + if(buff) + rtw_mfree(buff, IW_CUSTOM_MAX); + + } + +_func_exit_; + +} + +void _survey_timer_hdl (void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + + survey_timer_hdl(padapter); +} + +void _link_timer_hdl (void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + link_timer_hdl(padapter); +} + +void _addba_timer_hdl(void *FunctionContext) +{ + struct sta_info *psta = (struct sta_info *)FunctionContext; + addba_timer_hdl(psta); +} + +void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta) +{ + + _init_timer(&psta->addba_retry_timer, padapter->pnetdev, _addba_timer_hdl, psta); +} + +#ifdef CONFIG_TDLS +void TDLS_restore_workitem_callback(struct work_struct *work) +{ + struct mlme_ext_priv*pmlmeext = container_of(work, struct mlme_ext_priv, TDLS_restore_workitem); + _adapter *padapter = pmlmeext->padapter; + u32 bit_6=1<<6; + + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)|(bit_6)); + DBG_8192C("wirte 0x0608, set bit6 on\n"); +} + + +void _TPK_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + ptdls_sta->TPK_count++; + //TPK_timer set 1000 as default + //retry timer should set at least 301 sec. + if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ + ptdls_sta->TPK_count=0; + issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr); + } + + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); +} + +void init_TPK_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + + _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta); +} + +// 1: write RCR DATA BIT +// 2: issue peer traffic indication +// 3: go back to the channel linked with AP, terminating channel switch procedure +// 4: init channel sensing, receive all data and mgnt frame +// 5: channel sensing and report candidate channel +// 6: first time set channel to off channel +// 7: go back tp the channel linked with AP when set base channel as target channel +void TDLS_option_workitem_callback(struct work_struct *work) +{ + struct sta_info *ptdls_sta = container_of(work, struct sta_info, option_workitem); + _adapter *padapter = ptdls_sta->padapter; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u32 bit_6=1<<6, bit_7=1<<7, bit_4=1<<4; + u8 survey_channel, i, min; + + switch(ptdls_sta->option){ + case 1: + //As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0 + //such we can receive all kinds of data frames. + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)&(~bit_6)); + DBG_8192C("wirte 0x0608, set bit6 off\n"); + break; + case 2: + issue_tdls_peer_traffic_indication(padapter, ptdls_sta); + break; + case 3: + _cancel_timer_ex(&ptdls_sta->base_ch_timer); + _cancel_timer_ex(&ptdls_sta->off_ch_timer); + SelectChannel(padapter, pmlmeext->cur_channel); + ptdls_sta->state &= ~(TDLS_CH_SWITCH_ON_STATE | + TDLS_PEER_AT_OFF_STATE | + TDLS_AT_OFF_CH_STATE); + DBG_8192C("go back to base channel\n "); + issue_nulldata(padapter, 0); + break; + case 4: + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)&(~bit_6)&(~bit_7)); + rtw_write16(padapter, 0x06A4,0xffff); //maybe don't need to write here + + //disable update TSF + rtw_write8(padapter, 0x0550, rtw_read8(padapter, 0x0550)|bit_4); + + pmlmeext->sitesurvey_res.channel_idx = 0; + ptdls_sta->option = 5; + _set_workitem(&ptdls_sta->option_workitem); + break; + case 5: + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; + if(survey_channel){ + SelectChannel(padapter, survey_channel); + pmlmeinfo->tdls_cur_channel = survey_channel; + pmlmeext->sitesurvey_res.channel_idx++; + _set_timer(&ptdls_sta->option_timer, SURVEY_TO); + }else{ + SelectChannel(padapter, pmlmeext->cur_channel); + + //enable update TSF + rtw_write8(padapter, 0x0550, rtw_read8(padapter, 0x0550)&(~bit_4)); + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)|(bit_7)); + + if(pmlmeinfo->tdls_ch_sensing==1){ + pmlmeinfo->tdls_ch_sensing=0; + pmlmeinfo->tdls_cur_channel=1; + min=pmlmeinfo->tdls_collect_pkt_num[0]; + for(i=1; i<14-1; i++){ + if(min > pmlmeinfo->tdls_collect_pkt_num[i]){ + pmlmeinfo->tdls_cur_channel=i+1; + min=pmlmeinfo->tdls_collect_pkt_num[i]; + } + pmlmeinfo->tdls_collect_pkt_num[i]=0; + } + pmlmeinfo->tdls_collect_pkt_num[0]=0; + pmlmeinfo->tdls_candidate_ch=pmlmeinfo->tdls_cur_channel; + DBG_8192C("TDLS channel sensing done, candidate channel: %02x\n", pmlmeinfo->tdls_candidate_ch); + pmlmeinfo->tdls_cur_channel=0; + + } + + if(ptdls_sta->state & TDLS_PEER_SLEEP_STATE){ + ptdls_sta->state |= TDLS_APSD_CHSW_STATE; + }else{ + //send null data with pwrbit==1 before send ch_switching_req to peer STA. + issue_nulldata(padapter, 1); + + ptdls_sta->state |= TDLS_CH_SW_INITIATOR_STATE; + + issue_tdls_ch_switch_req(padapter, ptdls_sta->hwaddr); + DBG_8192C("issue tdls ch switch req\n"); + } + } + break; + case 6: + issue_nulldata(padapter, 1); + SelectChannel(padapter, ptdls_sta->off_ch); + + DBG_8192C("change channel to tar ch:%02x\n", ptdls_sta->off_ch); + ptdls_sta->state |= TDLS_AT_OFF_CH_STATE; + ptdls_sta->state &= ~(TDLS_PEER_AT_OFF_STATE); + _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); + break; + case 7: + _cancel_timer_ex(&ptdls_sta->base_ch_timer); + _cancel_timer_ex(&ptdls_sta->off_ch_timer); + SelectChannel(padapter, pmlmeext->cur_channel); + ptdls_sta->state &= ~(TDLS_CH_SWITCH_ON_STATE | + TDLS_PEER_AT_OFF_STATE | + TDLS_AT_OFF_CH_STATE); + DBG_8192C("go back to base channel\n "); + issue_nulldata(padapter, 0); + _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); + break; + } + +} + +// 5: channel sensing and report candidate channel +// 6: first time set channel to off channel +// 7: whab go back tp the channel linked with AP, send null data to peer STA as an indication +void _ch_switch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + if(ptdls_sta->option==5){ + _set_workitem(&ptdls_sta->option_workitem); + }else if(ptdls_sta->option==6){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + _set_timer(&ptdls_sta->base_ch_timer, 500); + }else if(ptdls_sta->option==7){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + } +} + +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta); +} + +//Set channel back to base channel +void base_channel_workitem_callback(struct work_struct *work) +{ + struct sta_info *ptdls_sta = container_of(work, struct sta_info, base_ch_workitem); + _adapter *padapter = ptdls_sta->padapter; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + SelectChannel(ptdls_sta->padapter, pmlmeext->cur_channel); + issue_nulldata(ptdls_sta->padapter, 0); + + DBG_8192C("change channel to base ch:%02x\n", pmlmeext->cur_channel); + + ptdls_sta->state &= ~(TDLS_PEER_AT_OFF_STATE| TDLS_AT_OFF_CH_STATE); + + _set_timer(&ptdls_sta->off_ch_timer, 500); + +} + +void _base_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _set_workitem(&ptdls_sta->base_ch_workitem); +} + +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta); +} + +//Set channel back to off channel +void off_channel_workitem_callback(struct work_struct *work) +{ + struct sta_info *ptdls_sta = container_of(work, struct sta_info, off_ch_workitem); + _adapter *padapter = ptdls_sta->padapter; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + issue_nulldata(ptdls_sta->padapter, 1); + + SelectChannel(ptdls_sta->padapter, ptdls_sta->off_ch); + + DBG_8192C("change channel to off ch:%02x\n", ptdls_sta->off_ch); + ptdls_sta->state |= TDLS_AT_OFF_CH_STATE; + + if((ptdls_sta->state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + } + + _set_timer(&ptdls_sta->base_ch_timer, 500); +} + +void _off_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _set_workitem(&ptdls_sta->off_ch_workitem); +} + +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta); +} +#endif + +/* +void _reauth_timer_hdl(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + reauth_timer_hdl(padapter); +} + +void _reassoc_timer_hdl(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + reassoc_timer_hdl(padapter); +} +*/ + +void init_mlme_ext_timer(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + _init_timer(&pmlmeext->survey_timer, padapter->pnetdev, _survey_timer_hdl, padapter); + _init_timer(&pmlmeext->link_timer, padapter->pnetdev, _link_timer_hdl, padapter); + //_init_timer(&pmlmeext->ADDBA_timer, padapter->pnetdev, _addba_timer_hdl, padapter); + + //_init_timer(&pmlmeext->reauth_timer, padapter->pnetdev, _reauth_timer_hdl, padapter); + //_init_timer(&pmlmeext->reassoc_timer, padapter->pnetdev, _reassoc_timer_hdl, padapter); +} + +#ifdef CONFIG_AP_MODE + +void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta) +{ + union iwreq_data wrqu; + struct sta_priv *pstapriv = &padapter->stapriv; + + if(psta==NULL) + return; + + if(psta->aid > NUM_STA) + return; + + if(pstapriv->sta_aid[psta->aid - 1] != psta) + return; + + + wrqu.addr.sa_family = ARPHRD_ETHER; + + _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); + + DBG_871X("+rtw_indicate_sta_assoc_event\n"); + + wireless_send_event(padapter->pnetdev, IWEVREGISTERED, &wrqu, NULL); + +} + +void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta) +{ + union iwreq_data wrqu; + struct sta_priv *pstapriv = &padapter->stapriv; + + if(psta==NULL) + return; + + if(psta->aid > NUM_STA) + return; + + if(pstapriv->sta_aid[psta->aid - 1] != psta) + return; + + + wrqu.addr.sa_family = ARPHRD_ETHER; + + _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); + + DBG_871X("+rtw_indicate_sta_disassoc_event\n"); + + wireless_send_event(padapter->pnetdev, IWEVEXPIRED, &wrqu, NULL); + +} + + +#ifdef CONFIG_HOSTAPD_MLME + +static int mgnt_xmit_entry(struct sk_buff *skb, struct net_device *pnetdev) +{ + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); + _adapter *padapter = (_adapter *)phostapdpriv->padapter; + + //DBG_8192C("%s\n", __FUNCTION__); + + return padapter->HalFunc.hostap_mgnt_xmit_entry(padapter, skb); +} + +static int mgnt_netdev_open(struct net_device *pnetdev) +{ + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); + + DBG_8192C("mgnt_netdev_open: MAC Address:" MAC_FMT "\n", MAC_ARG(pnetdev->dev_addr)); + + + init_usb_anchor(&phostapdpriv->anchored); + + if(!netif_queue_stopped(pnetdev)) + netif_start_queue(pnetdev); + else + netif_wake_queue(pnetdev); + + + netif_carrier_on(pnetdev); + + //rtw_write16(phostapdpriv->padapter, 0x0116, 0x0100);//only excluding beacon + + return 0; +} +static int mgnt_netdev_close(struct net_device *pnetdev) +{ + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); + + DBG_8192C("%s\n", __FUNCTION__); + + usb_kill_anchored_urbs(&phostapdpriv->anchored); + + netif_carrier_off(pnetdev); + + if (!netif_queue_stopped(pnetdev)) + netif_stop_queue(pnetdev); + + //rtw_write16(phostapdpriv->padapter, 0x0116, 0x3f3f); + + return 0; +} + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) +static const struct net_device_ops rtl871x_mgnt_netdev_ops = { + .ndo_open = mgnt_netdev_open, + .ndo_stop = mgnt_netdev_close, + .ndo_start_xmit = mgnt_xmit_entry, + //.ndo_set_mac_address = r871x_net_set_mac_address, + //.ndo_get_stats = r871x_net_get_stats, + //.ndo_do_ioctl = r871x_mp_ioctl, +}; +#endif + +int hostapd_mode_init(_adapter *padapter) +{ + unsigned char mac[ETH_ALEN]; + struct hostapd_priv *phostapdpriv; + struct net_device *pnetdev; + + pnetdev = rtw_alloc_etherdev(sizeof(struct hostapd_priv)); + if (!pnetdev) + return -ENOMEM; + + //SET_MODULE_OWNER(pnetdev); + ether_setup(pnetdev); + + //pnetdev->type = ARPHRD_IEEE80211; + + phostapdpriv = rtw_netdev_priv(pnetdev); + phostapdpriv->pmgnt_netdev = pnetdev; + phostapdpriv->padapter= padapter; + padapter->phostapdpriv = phostapdpriv; + + //pnetdev->init = NULL; + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) + + DBG_8192C("register rtl871x_mgnt_netdev_ops to netdev_ops\n"); + + pnetdev->netdev_ops = &rtl871x_mgnt_netdev_ops; + +#else + + pnetdev->open = mgnt_netdev_open; + + pnetdev->stop = mgnt_netdev_close; + + pnetdev->hard_start_xmit = mgnt_xmit_entry; + + //pnetdev->set_mac_address = r871x_net_set_mac_address; + + //pnetdev->get_stats = r871x_net_get_stats; + + //pnetdev->do_ioctl = r871x_mp_ioctl; + +#endif + + pnetdev->watchdog_timeo = HZ; /* 1 second timeout */ + + //pnetdev->wireless_handlers = NULL; + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + pnetdev->features |= NETIF_F_IP_CSUM; +#endif + + + + if(dev_alloc_name(pnetdev,"mgnt.wlan%d") < 0) + { + DBG_8192C("hostapd_mode_init(): dev_alloc_name, fail! \n"); + } + + + //SET_NETDEV_DEV(pnetdev, pintfpriv->udev); + + + mac[0]=0x00; + mac[1]=0xe0; + mac[2]=0x4c; + mac[3]=0x87; + mac[4]=0x11; + mac[5]=0x12; + + _rtw_memcpy(pnetdev->dev_addr, mac, ETH_ALEN); + + + netif_carrier_off(pnetdev); + + + /* Tell the network stack we exist */ + if (register_netdev(pnetdev) != 0) + { + DBG_8192C("hostapd_mode_init(): register_netdev fail!\n"); + + if(pnetdev) + { + rtw_free_netdev(pnetdev); + } + } + + return 0; + +} + +void hostapd_mode_unload(_adapter *padapter) +{ + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; + struct net_device *pnetdev = phostapdpriv->pmgnt_netdev; + + unregister_netdev(pnetdev); + rtw_free_netdev(pnetdev); + +} + +#endif +#endif + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c b/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c new file mode 100755 index 000000000000..a0f522b7359f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c @@ -0,0 +1,1343 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _OS_INTFS_C_ + +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +#ifdef CONFIG_PCI_HCI +#include +#endif + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); +MODULE_AUTHOR("Realtek Semiconductor Corp."); +MODULE_VERSION(DRIVERVERSION); + +/* module param defaults */ +int rtw_chip_version = 0x00; +int rtw_rfintfs = HWPI; +int rtw_lbkmode = 0;//RTL8712_AIR_TRX; + + +int rtw_network_mode = Ndis802_11IBSS;//Ndis802_11Infrastructure;//infra, ad-hoc, auto +//NDIS_802_11_SSID ssid; +int rtw_channel = 1;//ad-hoc support requirement +int rtw_wireless_mode = WIRELESS_11BG_24N; +int rtw_vrtl_carrier_sense = AUTO_VCS; +int rtw_vcs_type = RTS_CTS;//* +int rtw_rts_thresh = 2347;//* +int rtw_frag_thresh = 2346;//* +int rtw_preamble = PREAMBLE_LONG;//long, short, auto +int rtw_scan_mode = 1;//active, passive +int rtw_adhoc_tx_pwr = 1; +int rtw_soft_ap = 0; +//int smart_ps = 1; +#ifdef CONFIG_POWER_SAVING +int rtw_power_mgnt = 1; +#else +int rtw_power_mgnt = PS_MODE_ACTIVE; +#endif + +#ifdef CONFIG_IPS_LEVEL_2 +int rtw_ips_mode = IPS_LEVEL_2; +#else +int rtw_ips_mode = IPS_NORMAL; +#endif +module_param(rtw_ips_mode, int, 0644); + +int rtw_radio_enable = 1; +int rtw_long_retry_lmt = 7; +int rtw_short_retry_lmt = 7; +int rtw_busy_thresh = 40; +//int qos_enable = 0; //* +int rtw_ack_policy = NORMAL_ACK; +#ifdef CONFIG_MP_INCLUDED +int rtw_mp_mode = 1; +#else +int rtw_mp_mode = 0; +#endif +int rtw_software_encrypt = 0; +int rtw_software_decrypt = 0; + +int rtw_wmm_enable = 1;// default is set to enable the wmm. +int rtw_uapsd_enable = 0; +int rtw_uapsd_max_sp = NO_LIMIT; +int rtw_uapsd_acbk_en = 0; +int rtw_uapsd_acbe_en = 0; +int rtw_uapsd_acvi_en = 0; +int rtw_uapsd_acvo_en = 0; + +#ifdef CONFIG_80211N_HT +int rtw_ht_enable = 1; +int rtw_cbw40_enable = 1; +int rtw_ampdu_enable = 1;//for enable tx_ampdu +#endif +//int rf_config = RF_1T2R; // 1T2R +int rtw_rf_config = RF_819X_MAX_TYPE; //auto +int rtw_low_power = 0; +#ifdef CONFIG_WIFI_TEST +int rtw_wifi_spec = 1;//for wifi test +#else +int rtw_wifi_spec = 0; +#endif +int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX; + +#ifdef CONFIG_BT_COEXIST +int rtw_bt_iso = 2;// 0:Low, 1:High, 2:From Efuse +int rtw_bt_sco = 3;// 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy +int rtw_bt_ampdu =1 ;// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. +#endif +int rtw_AcceptAddbaReq = _TRUE;// 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. + +int rtw_antdiv_cfg = 2; // 0:OFF , 1:ON, 2:decide by Efuse config + +#ifdef CONFIG_USB_AUTOSUSPEND +int rtw_enusbss = 1;//0:disable,1:enable +#else +int rtw_enusbss = 0;//0:disable,1:enable +#endif + +int rtw_hwpdn_mode=2;//0:disable,1:enable,2: by EFUSE config + +#ifdef CONFIG_HW_PWRP_DETECTION +int rtw_hwpwrp_detect = 1; +#else +int rtw_hwpwrp_detect = 0; //HW power ping detect 0:disable , 1:enable +#endif + +#ifdef CONFIG_USB_HCI +int rtw_hw_wps_pbc = 0; //There is no PBC hardware +#else +int rtw_hw_wps_pbc = 0; +#endif + +char* ifname = "wlan%d"; + +char* rtw_initmac = 0; // temp mac address if users want to use instead of the mac address in Efuse + +module_param(ifname, charp, 0644); +module_param(rtw_initmac, charp, 0644); +module_param(rtw_channel_plan, int, 0644); +module_param(rtw_chip_version, int, 0644); +module_param(rtw_rfintfs, int, 0644); +module_param(rtw_lbkmode, int, 0644); +module_param(rtw_network_mode, int, 0644); +module_param(rtw_channel, int, 0644); +module_param(rtw_mp_mode, int, 0644); +module_param(rtw_wmm_enable, int, 0644); +module_param(rtw_vrtl_carrier_sense, int, 0644); +module_param(rtw_vcs_type, int, 0644); +module_param(rtw_busy_thresh, int, 0644); +#ifdef CONFIG_80211N_HT +module_param(rtw_ht_enable, int, 0644); +module_param(rtw_cbw40_enable, int, 0644); +module_param(rtw_ampdu_enable, int, 0644); +#endif +module_param(rtw_rf_config, int, 0644); +module_param(rtw_power_mgnt, int, 0644); +module_param(rtw_low_power, int, 0644); +module_param(rtw_wifi_spec, int, 0644); + +module_param(rtw_antdiv_cfg, int, 0644); + + +module_param(rtw_enusbss, int, 0644); +module_param(rtw_hwpdn_mode, int, 0644); +module_param(rtw_hwpwrp_detect, int, 0644); + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE +char *rtw_adaptor_info_caching_file_path= "/data/misc/wifi/rtw_cache"; +module_param(rtw_adaptor_info_caching_file_path, charp, 0644); +#endif + +#ifdef CONFIG_LAYER2_ROAMING +uint rtw_max_roaming_times=2; +module_param(rtw_max_roaming_times, uint, 0644); +#endif + +static uint loadparam( _adapter *padapter, _nic_hdl pnetdev); +static int netdev_open (struct net_device *pnetdev); +static int netdev_close (struct net_device *pnetdev); + +//#ifdef RTK_DMP_PLATFORM +#ifdef CONFIG_PROC_DEBUG +#define RTL8192C_PROC_NAME "rtl819xC" +#define RTL8192D_PROC_NAME "rtl819xD" +static char rtw_proc_name[IFNAMSIZ]; +static struct proc_dir_entry *rtw_proc = NULL; +static int rtw_proc_cnt = 0; + +void rtw_proc_init_one(struct net_device *dev) +{ + struct proc_dir_entry *dir_dev = NULL; + struct proc_dir_entry *entry=NULL; + _adapter *padapter = rtw_netdev_priv(dev); + + if(rtw_proc == NULL) + { + if(padapter->chip_type == RTL8188C_8192C) + { + _rtw_memcpy(rtw_proc_name, RTL8192C_PROC_NAME, sizeof(RTL8192C_PROC_NAME)); + } + else if(padapter->chip_type == RTL8192D) + { + _rtw_memcpy(rtw_proc_name, RTL8192D_PROC_NAME, sizeof(RTL8192D_PROC_NAME)); + } + +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, proc_net); +#else + rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net); +#endif + if (rtw_proc == NULL) { + DBG_8192C(KERN_ERR "Unable to create rtw_proc directory\n"); + return; + } + + entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + } + + + + if(padapter->dir_dev == NULL) + { + padapter->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, + rtw_proc); + + dir_dev = padapter->dir_dev; + + if(dir_dev==NULL) + { + if(rtw_proc_cnt == 0) + { + if(rtw_proc){ +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + remove_proc_entry(rtw_proc_name, proc_net); +#else + remove_proc_entry(rtw_proc_name, init_net.proc_net); +#endif + rtw_proc = NULL; + } + } + + DBG_8192C("Unable to create dir_dev directory\n"); + return; + } + } + else + { + return; + } + + rtw_proc_cnt++; + + entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO, + dir_dev, proc_get_write_reg, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + entry->write_proc = proc_set_write_reg; + + entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO, + dir_dev, proc_get_read_reg, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + entry->write_proc = proc_set_read_reg; + + + entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO, + dir_dev, proc_get_fwstate, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + + entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_sec_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + + entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO, + dir_dev, proc_get_mlmext_state, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + + entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO, + dir_dev, proc_get_qos_option, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO, + dir_dev, proc_get_ht_option, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_rf_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_ap_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO, + dir_dev, proc_get_adapter_state, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_trx_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + +#ifdef CONFIG_AP_MODE + + entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_all_sta_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } +#endif + +#ifdef MEMORY_LEAK_DEBUG + entry = create_proc_read_entry("_malloc_cnt", S_IFREG | S_IRUGO, + dir_dev, proc_get_malloc_cnt, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } +#endif + +#ifdef CONFIG_FIND_BEST_CHANNEL + entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO, + dir_dev, proc_get_best_channel, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } +#endif + + entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO, + dir_dev, proc_get_rx_signal, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + entry->write_proc = proc_set_rx_signal; + +} + +void rtw_proc_remove_one(struct net_device *dev) +{ + struct proc_dir_entry *dir_dev = NULL; + _adapter *padapter = rtw_netdev_priv(dev); + + + dir_dev = padapter->dir_dev; + padapter->dir_dev = NULL; + + if (dir_dev) { + + remove_proc_entry("write_reg", dir_dev); + remove_proc_entry("read_reg", dir_dev); + remove_proc_entry("fwstate", dir_dev); + remove_proc_entry("sec_info", dir_dev); + remove_proc_entry("mlmext_state", dir_dev); + remove_proc_entry("qos_option", dir_dev); + remove_proc_entry("ht_option", dir_dev); + remove_proc_entry("rf_info", dir_dev); + remove_proc_entry("ap_info", dir_dev); + remove_proc_entry("adapter_state", dir_dev); + remove_proc_entry("trx_info", dir_dev); + +#ifdef CONFIG_AP_MODE + remove_proc_entry("all_sta_info", dir_dev); +#endif + +#ifdef MEMORY_LEAK_DEBUG + remove_proc_entry("_malloc_cnt", dir_dev); +#endif + +#ifdef CONFIG_FIND_BEST_CHANNEL + remove_proc_entry("best_channel", dir_dev); +#endif + remove_proc_entry("rx_signal", dir_dev); + + remove_proc_entry(dev->name, rtw_proc); + dir_dev = NULL; + + } + else + { + return; + } + + rtw_proc_cnt--; + + if(rtw_proc_cnt == 0) + { + if(rtw_proc){ + remove_proc_entry("ver_info", rtw_proc); + +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + remove_proc_entry(rtw_proc_name, proc_net); +#else + remove_proc_entry(rtw_proc_name, init_net.proc_net); +#endif + rtw_proc = NULL; + } + } +} +#endif + +uint loadparam( _adapter *padapter, _nic_hdl pnetdev) +{ + + uint status = _SUCCESS; + struct registry_priv *registry_par = &padapter->registrypriv; + +_func_enter_; + + registry_par->chip_version = (u8)rtw_chip_version; + registry_par->rfintfs = (u8)rtw_rfintfs; + registry_par->lbkmode = (u8)rtw_lbkmode; + //registry_par->hci = (u8)hci; + registry_par->network_mode = (u8)rtw_network_mode; + + _rtw_memcpy(registry_par->ssid.Ssid, "ANY", 3); + registry_par->ssid.SsidLength = 3; + + registry_par->channel = (u8)rtw_channel; + registry_par->wireless_mode = (u8)rtw_wireless_mode; + registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ; + registry_par->vcs_type = (u8)rtw_vcs_type; + registry_par->rts_thresh=(u16)rtw_rts_thresh; + registry_par->frag_thresh=(u16)rtw_frag_thresh; + registry_par->preamble = (u8)rtw_preamble; + registry_par->scan_mode = (u8)rtw_scan_mode; + registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr; + registry_par->soft_ap= (u8)rtw_soft_ap; + //registry_par->smart_ps = (u8)rtw_smart_ps; + registry_par->power_mgnt = (u8)rtw_power_mgnt; + registry_par->ips_mode = (u8)rtw_ips_mode; + registry_par->radio_enable = (u8)rtw_radio_enable; + registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt; + registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt; + registry_par->busy_thresh = (u16)rtw_busy_thresh; + //registry_par->qos_enable = (u8)rtw_qos_enable; + registry_par->ack_policy = (u8)rtw_ack_policy; + registry_par->mp_mode = (u8)rtw_mp_mode; + registry_par->software_encrypt = (u8)rtw_software_encrypt; + registry_par->software_decrypt = (u8)rtw_software_decrypt; + + //UAPSD + registry_par->wmm_enable = (u8)rtw_wmm_enable; + registry_par->uapsd_enable = (u8)rtw_uapsd_enable; + registry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp; + registry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en; + registry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en; + registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en; + registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en; + +#ifdef CONFIG_80211N_HT + registry_par->ht_enable = (u8)rtw_ht_enable; + registry_par->cbw40_enable = (u8)rtw_cbw40_enable; + registry_par->ampdu_enable = (u8)rtw_ampdu_enable; +#endif + + registry_par->rf_config = (u8)rtw_rf_config; + registry_par->low_power = (u8)rtw_low_power; + + + registry_par->wifi_spec = (u8)rtw_wifi_spec; + + registry_par->channel_plan = (u8)rtw_channel_plan; + +#ifdef CONFIG_BT_COEXIST + registry_par->bt_iso = (u8)rtw_bt_iso; + registry_par->bt_sco = (u8)rtw_bt_sco; + registry_par->bt_ampdu = (u8)rtw_bt_ampdu; +#endif + registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq; + + registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg; + +#ifdef CONFIG_AUTOSUSPEND + registry_par->usbss_enable = (u8)rtw_enusbss;//0:disable,1:enable +#endif +#ifdef SUPPORT_HW_RFOFF_DETECTED + registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;//0:disable,1:enable,2:by EFUSE config + registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;//0:disable,1:enable +#endif + + registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc; + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + snprintf(registry_par->adaptor_info_caching_file_path, PATH_LENGTH_MAX, "%s",rtw_adaptor_info_caching_file_path); + registry_par->adaptor_info_caching_file_path[PATH_LENGTH_MAX-1]=0; +#endif + +#ifdef CONFIG_LAYER2_ROAMING + registry_par->max_roaming_times = (u8)rtw_max_roaming_times; +#endif + +_func_exit_; + + return status; + +} + +static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct sockaddr *addr = p; + + if(padapter->bup == _FALSE) + { + //DBG_8192C("r8711_net_set_mac_address(), MAC=%x:%x:%x:%x:%x:%x\n", addr->sa_data[0], addr->sa_data[1], addr->sa_data[2], addr->sa_data[3], + //addr->sa_data[4], addr->sa_data[5]); + _rtw_memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN); + //_rtw_memcpy(pnetdev->dev_addr, addr->sa_data, ETH_ALEN); + //padapter->bset_hwaddr = _TRUE; + } + + return 0; +} + +static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct recv_priv *precvpriv = &(padapter->recvpriv); + + padapter->stats.tx_packets = pxmitpriv->tx_pkts;//pxmitpriv->tx_pkts++; + padapter->stats.rx_packets = precvpriv->rx_pkts;//precvpriv->rx_pkts++; + padapter->stats.tx_dropped = pxmitpriv->tx_drop; + padapter->stats.rx_dropped = precvpriv->rx_drop; + padapter->stats.tx_bytes = pxmitpriv->tx_bytes; + padapter->stats.rx_bytes = precvpriv->rx_bytes; + + return &padapter->stats; +} + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) +static const struct net_device_ops rtw_netdev_ops = { + .ndo_open = netdev_open, + .ndo_stop = netdev_close, + .ndo_start_xmit = rtw_xmit_entry, + .ndo_set_mac_address = rtw_net_set_mac_address, + .ndo_get_stats = rtw_net_get_stats, + .ndo_do_ioctl = rtw_ioctl, +}; +#endif + +int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname) +{ + _adapter *padapter = rtw_netdev_priv(pnetdev); + +#ifdef CONFIG_EASY_REPLACEMENT + struct net_device *TargetNetdev = NULL; + _adapter *TargetAdapter = NULL; + struct net *devnet = NULL; + + if(padapter->bDongle == 1) + { +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + TargetNetdev = dev_get_by_name("wlan0"); +#else + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) + devnet = pnetdev->nd_net; + #else + devnet = dev_net(pnetdev); + #endif + TargetNetdev = dev_get_by_name(devnet, "wlan0"); +#endif + if(TargetNetdev) { + DBG_8192C("Force onboard module driver disappear !!!\n"); + TargetAdapter = rtw_netdev_priv(TargetNetdev); + TargetAdapter->DriverState = DRIVER_DISAPPEAR; + + padapter->pid[0] = TargetAdapter->pid[0]; + padapter->pid[1] = TargetAdapter->pid[1]; + padapter->pid[2] = TargetAdapter->pid[2]; + + dev_put(TargetNetdev); + unregister_netdev(TargetNetdev); +#ifdef CONFIG_PROC_DEBUG + if(TargetAdapter->chip_type == padapter->chip_type) + rtw_proc_remove_one(TargetNetdev); +#endif + padapter->DriverState = DRIVER_REPLACE_DONGLE; + } + } +#endif + + if(dev_alloc_name(pnetdev, ifname) < 0) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("dev_alloc_name, fail! \n")); + } + + netif_carrier_off(pnetdev); + //netif_stop_queue(pnetdev); + + return 0; +} + +struct net_device *rtw_init_netdev(_adapter *old_padapter) +{ + _adapter *padapter; + struct net_device *pnetdev; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+init_net_dev\n")); + + if(old_padapter != NULL) + pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(_adapter), (void *)old_padapter); + else + pnetdev = rtw_alloc_etherdev(sizeof(_adapter)); + + if (!pnetdev) + return NULL; + + padapter = rtw_netdev_priv(pnetdev); + padapter->pnetdev = pnetdev; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + SET_MODULE_OWNER(pnetdev); +#endif + + //pnetdev->init = NULL; +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) + + DBG_8192C("register rtw_netdev_ops to netdev_ops\n"); + pnetdev->netdev_ops = &rtw_netdev_ops; + +#else + pnetdev->open = netdev_open; + pnetdev->stop = netdev_close; + + pnetdev->hard_start_xmit = rtw_xmit_entry; + + pnetdev->set_mac_address = rtw_net_set_mac_address; + pnetdev->get_stats = rtw_net_get_stats; + + pnetdev->do_ioctl = rtw_ioctl; + +#endif + + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + pnetdev->features |= NETIF_F_IP_CSUM; +#endif + //pnetdev->tx_timeout = NULL; + pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */ + + pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def; + +#ifdef WIRELESS_SPY + //priv->wireless_data.spy_data = &priv->spy_data; + //pnetdev->wireless_data = &priv->wireless_data; +#endif + + //step 2. + loadparam(padapter, pnetdev); + + return pnetdev; + +} + +u32 rtw_start_drv_threads(_adapter *padapter) +{ + + u32 _status = _SUCCESS; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_start_drv_threads\n")); + +#ifdef CONFIG_SDIO_HCI + padapter->xmitThread = kernel_thread(rtw_xmit_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->xmitThread < 0) + _status = _FAIL; +#endif + +#ifdef CONFIG_RECV_THREAD_MODE + padapter->recvThread = kernel_thread(recv_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->recvThread < 0) + _status = _FAIL; +#endif + + padapter->cmdThread = kernel_thread(rtw_cmd_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->cmdThread < 0) + _status = _FAIL; + +#ifdef CONFIG_EVENT_THREAD_MODE + padapter->evtThread = kernel_thread(event_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->evtThread < 0) + _status = _FAIL; +#endif + + return _status; + +} + +void rtw_stop_drv_threads (_adapter *padapter) +{ + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_stop_drv_threads\n")); + + //Below is to termindate rtw_cmd_thread & event_thread... + _rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema); + //_rtw_up_sema(&padapter->cmdpriv.cmd_done_sema); + if(padapter->cmdThread){ + _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); + } + +#ifdef CONFIG_EVENT_THREAD_MODE + _rtw_up_sema(&padapter->evtpriv.evt_notify); + if(padapter->evtThread){ + _rtw_down_sema(&padapter->evtpriv.terminate_evtthread_sema); + } +#endif + +#ifdef CONFIG_XMIT_THREAD_MODE + // Below is to termindate tx_thread... + _rtw_up_sema(&padapter->xmitpriv.xmit_sema); + _rtw_down_sema(&padapter->xmitpriv.terminate_xmitthread_sema); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt: rtw_xmit_thread can be terminated ! \n")); +#endif + +#ifdef CONFIG_RECV_THREAD_MODE + // Below is to termindate rx_thread... + _rtw_up_sema(&padapter->recvpriv.recv_sema); + _rtw_down_sema(&padapter->recvpriv.terminate_recvthread_sema); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt:recv_thread can be terminated! \n")); +#endif + + +} + +u8 rtw_init_default_value(_adapter *padapter) +{ + u8 ret = _SUCCESS; + struct registry_priv* pregistrypriv = &padapter->registrypriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + //xmit_priv + pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; + pxmitpriv->vcs = pregistrypriv->vcs_type; + pxmitpriv->vcs_type = pregistrypriv->vcs_type; + //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; + pxmitpriv->frag_len = pregistrypriv->frag_thresh; + + + + //recv_priv + + + //mlme_priv + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + pmlmepriv->scan_mode = SCAN_ACTIVE; + + //qos_priv + //pmlmepriv->qospriv.qos_option = pregistrypriv->wmm_enable; + + //ht_priv +#ifdef CONFIG_80211N_HT + pmlmepriv->htpriv.ampdu_enable = _FALSE;//set to disabled +#endif + + //security_priv + //rtw_get_encrypt_decrypt_from_registrypriv(padapter); + psecuritypriv->binstallGrpkey = _FAIL; + psecuritypriv->sw_encrypt=pregistrypriv->software_encrypt; + psecuritypriv->sw_decrypt=pregistrypriv->software_decrypt; + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + + psecuritypriv->dot11PrivacyKeyIndex = 0; + + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot118021XGrpKeyid = 1; + + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled; + + + //pwrctrl_priv + + + //registry_priv + rtw_init_registrypriv_dev_network(padapter); + rtw_update_registrypriv_dev_network(padapter); + + + //hal_priv + padapter->HalFunc.init_default_value(padapter); + + //misc. + padapter->bReadPortCancel = _FALSE; + padapter->bWritePortCancel = _FALSE; + padapter->bRxRSSIDisplay = 0; + + return ret; +} + +u8 rtw_reset_drv_sw(_adapter *padapter) +{ + u8 ret8=_SUCCESS; + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + + //hal_priv + padapter->HalFunc.init_default_value(padapter); + padapter->bReadPortCancel = _FALSE; + padapter->bWritePortCancel = _FALSE; + padapter->bRxRSSIDisplay = 0; + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + pmlmepriv->scan_mode = SCAN_ACTIVE; // 1: active scan ,0 passive scan + + pwrctrlpriv->bips_processing = _FALSE; + pwrctrlpriv->rf_pwrstate = rf_on; + pwrctrlpriv->bInSuspend = _FALSE; + + padapter->xmitpriv.tx_pkts = 0; + padapter->recvpriv.rx_pkts = 0; + + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; + + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY |_FW_UNDER_LINKING); + +#ifdef CONFIG_AUTOSUSPEND + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) + padapter->dvobjpriv.pusbdev->autosuspend_disabled = 1;//autosuspend disabled by the user + #endif +#endif + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + if(padapter->HalFunc.sreset_reset_value) + padapter->HalFunc.sreset_reset_value(padapter); +#endif + pwrctrlpriv->pwr_state_check_cnts = 0; + + //mlmeextpriv + padapter->mlmeextpriv.sitesurvey_res.state= SCAN_DISABLE; + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&padapter->recvpriv); +#endif + + return ret8; +} + + +u8 rtw_init_drv_sw(_adapter *padapter) +{ + + u8 ret8=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_init_drv_sw\n")); + + if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init cmd_priv\n")); + ret8=_FAIL; + goto exit; + } + + padapter->cmdpriv.padapter=padapter; + + if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init evt_priv\n")); + ret8=_FAIL; + goto exit; + } + + + if (rtw_init_mlme_priv(padapter) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_priv\n")); + ret8=_FAIL; + goto exit; + } + + if(init_mlme_ext_priv(padapter) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_ext_priv\n")); + ret8=_FAIL; + goto exit; + } + + if(_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) + { + DBG_871X("Can't _rtw_init_xmit_priv\n"); + ret8=_FAIL; + goto exit; + } + + if(_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) + { + DBG_871X("Can't _rtw_init_recv_priv\n"); + ret8=_FAIL; + goto exit; + } + + _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); + //_init_timer(&(padapter->securitypriv.tkip_timer), padapter->pnetdev, rtw_use_tkipkey_handler, padapter); + + if(_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) + { + DBG_871X("Can't _rtw_init_sta_priv\n"); + ret8=_FAIL; + goto exit; + } + + padapter->stapriv.padapter = padapter; + + rtw_init_bcmc_stainfo(padapter); + + rtw_init_pwrctrl_priv(padapter); + + //_rtw_memset((u8 *)&padapter->qospriv, 0, sizeof (struct qos_priv));//move to mlme_priv + +#ifdef CONFIG_MP_INCLUDED + if (init_mp_priv(padapter) == _FAIL) { + ERR_8192C("%s: initialize MP private data Fail!\n", __func__); + } +#endif + + ret8 = rtw_init_default_value(padapter); + + rtw_dm_init(padapter); + rtw_sw_led_init(padapter); + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + rtw_sreset_init(padapter); +#endif//SILENT_RESET_FOR_SPECIFIC_PLATFOM + +exit: + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_init_drv_sw\n")); + + _func_exit_; + + return ret8; + +} + +void rtw_cancel_all_timer(_adapter *padapter) +{ + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_cancel_all_timer\n")); + + _cancel_timer_ex(&padapter->mlmepriv.assoc_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel association timer complete! \n")); + + //_cancel_timer_ex(&padapter->securitypriv.tkip_timer); + //RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel tkip_timer! \n")); + + _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel scan_to_timer! \n")); + + _cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel dynamic_chk_timer! \n")); + + // cancel sw led timer + rtw_sw_led_deinit(padapter); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel DeInitSwLeds! \n")); + + _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer); + + +#ifdef CONFIG_SET_SCAN_DENY_TIMER + _cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel set_scan_deny_timer! \n")); +#endif + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer); +#endif + + // cancel dm timer + padapter->HalFunc.dm_deinit(padapter); + +} + +u8 rtw_free_drv_sw(_adapter *padapter) +{ + + + struct net_device *pnetdev = (struct net_device*)padapter->pnetdev; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("==>rtw_free_drv_sw")); + + free_mlme_ext_priv(&padapter->mlmeextpriv); + + rtw_free_cmd_priv(&padapter->cmdpriv); + + rtw_free_evt_priv(&padapter->evtpriv); + + rtw_free_mlme_priv(&padapter->mlmepriv); + + //free_io_queue(padapter); + + _rtw_free_xmit_priv(&padapter->xmitpriv); + + _rtw_free_sta_priv(&padapter->stapriv); //will free bcmc_stainfo here + + _rtw_free_recv_priv(&padapter->recvpriv); + + rtw_free_pwrctrl_priv(padapter); + + //rtw_mfree((void *)padapter, sizeof (padapter)); + +#ifdef CONFIG_DRVEXT_MODULE + free_drvext(&padapter->drvextpriv); +#endif + + padapter->HalFunc.free_hal_data(padapter); + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("<==rtw_free_drv_sw\n")); + + //free the old_pnetdev + if(padapter->old_pnetdev) { + free_netdev(padapter->old_pnetdev); + padapter->old_pnetdev = NULL; + } + + if(pnetdev) + { + rtw_free_netdev(pnetdev); + } + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_free_drv_sw\n")); + + return _SUCCESS; + +} + +static int netdev_open(struct net_device *pnetdev) +{ + uint status; + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - dev_open\n")); + //DBG_8192C("+871x_drv - drv_open, bup=%d\n", padapter->bup); + + if(pwrctrlpriv->ps_flag == _TRUE){ + padapter->net_closed = _FALSE; + goto netdev_open_normal_process; + } + + if(padapter->bup == _FALSE) + { + padapter->bDriverStopped = _FALSE; + padapter->bSurpriseRemoved = _FALSE; + padapter->bCardDisableWOHSM = _FALSE; + + status = rtw_hal_init(padapter); + if (status ==_FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("rtl871x_hal_init(): Can't init h/w!\n")); + goto netdev_open_error; + } + + DBG_8192C("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr)); + + + status=rtw_start_drv_threads(padapter); + if(status ==_FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n")); + goto netdev_open_error; + } + + + if (init_hw_mlme_ext(padapter) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("can't init mlme_ext_priv\n")); + goto netdev_open_error; + } + + +#ifdef CONFIG_DRVEXT_MODULE + init_drvext(padapter); +#endif + + if(padapter->intf_start) + { + padapter->intf_start(padapter); + } + +#ifdef CONFIG_PROC_DEBUG +#ifndef RTK_DMP_PLATFORM + rtw_proc_init_one(pnetdev); +#endif +#endif + padapter->bup = _TRUE; + } + padapter->net_closed = _FALSE; + + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + + if(( pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE ) ||(padapter->pwrctrlpriv.bHWPwrPindetect)) + { + padapter->pwrctrlpriv.bips_processing = _FALSE; + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + } + + //netif_carrier_on(pnetdev);//call this func when rtw_joinbss_event_callback return success + if(!netif_queue_stopped(pnetdev)) + netif_start_queue(pnetdev); + else + netif_wake_queue(pnetdev); + +netdev_open_normal_process: + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - dev_open\n")); + //DBG_8192C("-871x_drv - drv_open, bup=%d\n", padapter->bup); + + return 0; + +netdev_open_error: + + padapter->bup = _FALSE; + + netif_carrier_off(pnetdev); + netif_stop_queue(pnetdev); + + RT_TRACE(_module_os_intfs_c_,_drv_err_,("-871x_drv - dev_open, fail!\n")); + //DBG_8192C("-871x_drv - drv_open fail, bup=%d\n", padapter->bup); + + return (-1); + +} + + + +#ifdef CONFIG_IPS +int ips_netdrv_open(_adapter *padapter) +{ + int status = _SUCCESS; + padapter->net_closed = _FALSE; + DBG_8192C("===> %s.........\n",__FUNCTION__); + + + padapter->bDriverStopped = _FALSE; + padapter->bSurpriseRemoved = _FALSE; + padapter->bCardDisableWOHSM = _FALSE; + padapter->bup = _TRUE; + + status = rtw_hal_init(padapter); + if (status ==_FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("ips_netdrv_open(): Can't init h/w!\n")); + goto netdev_open_error; + } + + if(padapter->intf_start) + { + padapter->intf_start(padapter); + } + + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + _set_timer(&padapter->mlmepriv.dynamic_chk_timer,5000); + + return _SUCCESS; + +netdev_open_error: + padapter->bup = _FALSE; + DBG_8192C("-ips_netdrv_open - drv_open failure, bup=%d\n", padapter->bup); + + return _FAIL; +} + + +int rtw_ips_pwr_up(_adapter *padapter) +{ + int result; + u32 start_time = rtw_get_current_time(); + DBG_8192C("===> rtw_ips_pwr_up..............\n"); + rtw_reset_drv_sw(padapter); + result = ips_netdrv_open(padapter); + DBG_8192C("<=== rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time)); + return result; + +} + +void rtw_ips_pwr_down(_adapter *padapter) +{ + u32 start_time = rtw_get_current_time(); + DBG_8192C("===> rtw_ips_pwr_down...................\n"); + + padapter->bCardDisableWOHSM = _TRUE; + padapter->net_closed = _TRUE; + + rtw_led_control(padapter, LED_CTL_NO_LINK); + + rtw_ips_dev_unload(padapter); + padapter->bCardDisableWOHSM = _FALSE; + DBG_8192C("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time)); +} +#endif +void rtw_ips_dev_unload(_adapter *padapter) +{ + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + DBG_8192C("====> %s...\n",__FUNCTION__); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_FIFO_CLEARN_UP, 0); + + if(padapter->intf_stop) + { + padapter->intf_stop(padapter); + } + + //s5. + if(padapter->bSurpriseRemoved == _FALSE) + { + rtw_hal_deinit(padapter); + } + +} + +int pm_netdev_open(struct net_device *pnetdev,u8 bnormal) +{ + int status; + if(bnormal) + status = netdev_open(pnetdev); +#ifdef CONFIG_IPS + else + status = (_SUCCESS == ips_netdrv_open((_adapter *)rtw_netdev_priv(pnetdev)))?(0):(-1); +#endif + + return status; +} +//extern int rfpwrstate_check(_adapter *padapter); +static int netdev_close(struct net_device *pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - drv_close\n")); + + if(padapter->pwrctrlpriv.bInternalAutoSuspend == _TRUE) + { + //rfpwrstate_check(padapter); + if(padapter->pwrctrlpriv.rf_pwrstate == rf_off) + padapter->pwrctrlpriv.ps_flag = _TRUE; + } + padapter->net_closed = _TRUE; + +/* if(!padapter->hw_init_completed) + { + DBG_8192C("(1)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed); + + padapter->bDriverStopped = _TRUE; + + rtw_dev_unload(padapter); + } + else*/ + if(padapter->pwrctrlpriv.rf_pwrstate == rf_on){ + //DBG_8192C("(2)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed); + + //s1. + if(pnetdev) + { + if (!netif_queue_stopped(pnetdev)) + netif_stop_queue(pnetdev); + } + +#ifndef CONFIG_ANDROID + //s2. + //s2-1. issue rtw_disassoc_cmd to fw + rtw_disassoc_cmd(padapter); + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter); + //s2-4. + rtw_free_network_queue(padapter,_TRUE); +#endif + // Close LED + rtw_led_control(padapter, LED_CTL_POWER_OFF); + } + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - drv_close\n")); + //DBG_8192C("-871x_drv - drv_close, bup=%d\n", padapter->bup); + + return 0; + +} + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c new file mode 100755 index 000000000000..02bceb48a96e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c @@ -0,0 +1,391 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RECV_OSDEP_C_ + +#include +#include +#include + +#include +#include + +#include +#include + +#ifdef CONFIG_USB_HCI +#include +#endif + +//init os related resource in struct recv_priv +int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter) +{ + int res=_SUCCESS; + + return res; +} + +//alloc os related resource in union recv_frame +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe) +{ + int res=_SUCCESS; + + precvframe->u.hdr.pkt_newalloc = precvframe->u.hdr.pkt = NULL; + + return res; + +} + +//free os related resource in union recv_frame +void rtw_os_recv_resource_free(struct recv_priv *precvpriv) +{ + +} + + +//alloc os related resource in struct recv_buf +int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf) +{ + int res=_SUCCESS; + +#ifdef CONFIG_USB_HCI + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + + precvbuf->irp_pending = _FALSE; + precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL); + if(precvbuf->purb == NULL){ + res = _FAIL; + } + + precvbuf->pskb = NULL; + + precvbuf->reuse = _FALSE; + + precvbuf->pallocated_buf = precvbuf->pbuf = NULL; + + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL; + + precvbuf->transfer_len = 0; + + precvbuf->len = 0; + + #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + precvbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)precvbuf->alloc_sz, GFP_ATOMIC, &precvbuf->dma_transfer_addr); + precvbuf->pbuf = precvbuf->pallocated_buf; + if(precvbuf->pallocated_buf == NULL) + return _FAIL; + #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX + +#endif //CONFIG_USB_HCI + + +#ifdef CONFIG_SDIO_HCI + precvbuf->pskb = NULL; + + precvbuf->pallocated_buf = precvbuf->pbuf = NULL; + + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL; + + precvbuf->len = 0; +#endif + return res; + +} + +//free os related resource in struct recv_buf +int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf) +{ + int ret = _SUCCESS; + +#ifdef CONFIG_USB_HCI + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + + rtw_usb_buffer_free(pusbd, (size_t)precvbuf->alloc_sz, precvbuf->pallocated_buf, precvbuf->dma_transfer_addr); + precvbuf->pallocated_buf = NULL; + precvbuf->dma_transfer_addr = 0; + +#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX + + if(precvbuf->purb) + { + //usb_kill_urb(precvbuf->purb); + usb_free_urb(precvbuf->purb); + } + +#endif + + + if(precvbuf->pskb) + dev_kfree_skb_any(precvbuf->pskb); + + + return ret; + +} + +void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup) +{ + union iwreq_data wrqu; + struct iw_michaelmicfailure ev; + struct mlme_priv* pmlmepriv = &padapter->mlmepriv; + + + _rtw_memset( &ev, 0x00, sizeof( ev ) ); + if ( bgroup ) + { + ev.flags |= IW_MICFAILURE_GROUP; + } + else + { + ev.flags |= IW_MICFAILURE_PAIRWISE; + } + + ev.src_addr.sa_family = ARPHRD_ETHER; + _rtw_memcpy( ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); + + _rtw_memset( &wrqu, 0x00, sizeof( wrqu ) ); + wrqu.data.length = sizeof( ev ); + + wireless_send_event( padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu, (char*) &ev ); +} + +void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_HOSTAPD_MLME + _pkt *skb; + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; + struct net_device *pmgnt_netdev = phostapdpriv->pmgnt_netdev; + + RT_TRACE(_module_recv_osdep_c_, _drv_info_, ("+rtw_hostapd_mlme_rx\n")); + + skb = precv_frame->u.hdr.pkt; + + if (skb == NULL) + return; + + skb->data = precv_frame->u.hdr.rx_data; + skb->tail = precv_frame->u.hdr.rx_tail; + skb->len = precv_frame->u.hdr.len; + + //pskb_copy = skb_copy(skb, GFP_ATOMIC); +// if(skb == NULL) goto _exit; + + skb->dev = pmgnt_netdev; + skb->ip_summed = CHECKSUM_NONE; + skb->pkt_type = PACKET_OTHERHOST; + //skb->protocol = __constant_htons(0x0019); /*ETH_P_80211_RAW*/ + skb->protocol = __constant_htons(0x0003); /*ETH_P_80211_RAW*/ + + //DBG_8192C("(1)data=0x%x, head=0x%x, tail=0x%x, mac_header=0x%x, len=%d\n", skb->data, skb->head, skb->tail, skb->mac_header, skb->len); + + //skb->mac.raw = skb->data; + skb_reset_mac_header(skb); + + //skb_pull(skb, 24); + _rtw_memset(skb->cb, 0, sizeof(skb->cb)); + + netif_rx(skb); + + precv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call netif_rx() +#endif +} + +int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame) +{ + struct recv_priv *precvpriv; + _queue *pfree_recv_queue; + _pkt *skb; + struct mlme_priv*pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; +#endif + +_func_enter_; + + precvpriv = &(padapter->recvpriv); + pfree_recv_queue = &(precvpriv->free_recv_queue); + +#ifdef CONFIG_DRVEXT_MODULE + if (drvext_rx_handler(padapter, precv_frame->u.hdr.rx_data, precv_frame->u.hdr.len) == _SUCCESS) + { + goto _recv_indicatepkt_drop; + } +#endif + + skb = precv_frame->u.hdr.pkt; + if(skb == NULL) + { + RT_TRACE(_module_recv_osdep_c_,_drv_err_,("rtw_recv_indicatepkt():skb==NULL something wrong!!!!\n")); + goto _recv_indicatepkt_drop; + } + + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():skb != NULL !!!\n")); + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():precv_frame->u.hdr.rx_head=%p precv_frame->hdr.rx_data=%p\n", precv_frame->u.hdr.rx_head, precv_frame->u.hdr.rx_data)); + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("precv_frame->hdr.rx_tail=%p precv_frame->u.hdr.rx_end=%p precv_frame->hdr.len=%d \n", precv_frame->u.hdr.rx_tail, precv_frame->u.hdr.rx_end, precv_frame->u.hdr.len)); + + skb->data = precv_frame->u.hdr.rx_data; + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + skb_set_tail_pointer(skb, precv_frame->u.hdr.len); +#else + skb->tail = precv_frame->u.hdr.rx_tail; +#endif + + skb->len = precv_frame->u.hdr.len; + + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n skb->head=%p skb->data=%p skb->tail=%p skb->end=%p skb->len=%d\n", skb->head, skb->data, skb->tail, skb->end, skb->len)); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + _pkt *pskb2=NULL; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + int bmcast = IS_MCAST(pattrib->dst); + + //DBG_871X("bmcast=%d\n", bmcast); + + if(_rtw_memcmp(pattrib->dst, myid(&padapter->eeprompriv), ETH_ALEN)==_FALSE) + { + //DBG_871X("not ap psta=%p, addr=%pM\n", psta, pattrib->dst); + + if(bmcast) + { + psta = rtw_get_bcmc_stainfo(padapter); + pskb2 = skb_clone(skb, GFP_ATOMIC); + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->dst); + } + + if(psta) + { + //DBG_871X("directly forwarding to the rtw_xmit_entry\n"); + + //skb->ip_summed = CHECKSUM_NONE; + //skb->protocol = eth_type_trans(skb, pnetdev); + + skb->dev = padapter->pnetdev; + rtw_xmit_entry(skb, padapter->pnetdev); + + if(bmcast) + skb = pskb2; + else + goto _recv_indicatepkt_end; + } + + + } + else// to APself + { + //DBG_871X("to APSelf\n"); + } + } + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) { + skb->ip_summed = CHECKSUM_UNNECESSARY; + //DBG_8192C("CHECKSUM_UNNECESSARY \n"); + } else { + skb->ip_summed = CHECKSUM_NONE; + //DBG_8192C("CHECKSUM_NONE(%d, %d) \n", pattrib->tcpchk_valid, pattrib->tcp_chkrpt); + } +#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */ + + skb->ip_summed = CHECKSUM_NONE; + +#endif + + skb->dev = padapter->pnetdev; + skb->protocol = eth_type_trans(skb, padapter->pnetdev); + + netif_rx(skb); + +_recv_indicatepkt_end: + + precv_frame->u.hdr.pkt = NULL; // pointers to NULL before rtw_free_recvframe() + + rtw_free_recvframe(precv_frame, pfree_recv_queue); + + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after netif_rx!!!!\n")); + +_func_exit_; + + return _SUCCESS; + +_recv_indicatepkt_drop: + + //enqueue back to free_recv_queue + if(precv_frame) + rtw_free_recvframe(precv_frame, pfree_recv_queue); + + + precvpriv->rx_drop++; + + return _FAIL; + +_func_exit_; + +} + +void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf) +{ + struct recv_priv *precvpriv = &padapter->recvpriv; + +#ifdef CONFIG_USB_HCI + + precvbuf->ref_cnt--; + + //free skb in recv_buf + dev_kfree_skb_any(precvbuf->pskb); + + precvbuf->pskb = NULL; + precvbuf->reuse = _FALSE; + + if(precvbuf->irp_pending == _FALSE) + { + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + + +#endif +#ifdef CONFIG_SDIO_HCI + precvbuf->pskb = NULL; +#endif + +} +void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext); +void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext) +{ + struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)FunctionContext; + rtw_reordering_ctrl_timeout_handler(preorder_ctrl); +} + +void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl) +{ + _adapter *padapter = preorder_ctrl->padapter; + + _init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, _rtw_reordering_ctrl_timeout_handler, preorder_ctrl); + +} + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c new file mode 100755 index 000000000000..fb0bb699b08d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c @@ -0,0 +1,1472 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_INTF_C_ + +#include +#include +#include +#include +#include +#include +#include + +#ifndef CONFIG_USB_HCI + +#error "CONFIG_USB_HCI shall be on!\n" + +#endif + +#include "wifi_power.h" +#include +#include +#include +#include +#ifdef CONFIG_PLATFORM_RTK_DMP +#include +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#ifdef CONFIG_80211N_HT +extern int rtw_ht_enable; +extern int rtw_cbw40_enable; +extern int rtw_ampdu_enable;//for enable tx_ampdu +#endif + +static struct usb_interface *pintf; + +#ifdef CONFIG_GLOBAL_UI_PID +int ui_pid[3] = {0, 0, 0}; +#endif + +extern void rtl8188_power_save_exit(void); +extern void rtl8188_power_save_init(void); + +extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal); +static int rtw_suspend(struct usb_interface *intf, pm_message_t message); +static int rtw_resume(struct usb_interface *intf); +int rtw_resume_process(struct usb_interface *pusb_intf); + + +static int rtw_drv_init(struct usb_interface *pusb_intf,const struct usb_device_id *pdid); +static void rtw_dev_remove(struct usb_interface *pusb_intf); + +#define USB_VENDER_ID_REALTEK 0x0BDA + +//DID_USB_V77_20110721 +static struct usb_device_id rtw_usb_id_tbl[] ={ +#ifdef CONFIG_RTL8192C + /*=== Realtek demoboard ===*/ + {USB_DEVICE(0x0BDA, 0x8191)},//Default ID + + /****** 8188CUS ********/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8176)},//8188cu 1*1 dongole + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8170)},//8188CE-VAU USB minCard + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817E)},//8188CE-VAU USB minCard + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817A)},//8188cu Slim Solo + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817B)},//8188cu Slim Combo + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817D)},//8188RU High-power USB Dongle + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8754)},//8188 Combo for BC4 + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817F)},//8188RU + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x818A)},//8188CUS-VL + + /****** 8192CUS ********/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8177)},//8191cu 1*2 + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8178)},//8192cu 2*2 + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817C)},//8192CE-VAU USB minCard + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8186)},//8192CE-VAU USB minCard + + /*=== Customer ID ===*/ + /****** 8188CUS Dongle ********/ + {USB_DEVICE(0x2019, 0xED17)},//PCI - Edimax + {USB_DEVICE(0x0DF6, 0x0052)},//Sitecom - Edimax + {USB_DEVICE(0x7392, 0x7811)},//Edimax - Edimax + {USB_DEVICE(0x07B8, 0x8189)},//Abocom - Abocom + {USB_DEVICE(0x0EB0, 0x9071)},//NO Brand - Etop + {USB_DEVICE(0x06F8, 0xE033)},//Hercules - Edimax + {USB_DEVICE(0x103C, 0x1629)},//HP - Lite-On ,8188CUS Slim Combo + {USB_DEVICE(0x2001, 0x3308)},//D-Link - Alpha + {USB_DEVICE(0x050D, 0x1102)},//Belkin - Edimax + {USB_DEVICE(0x2019, 0xAB2A)},//Planex - Abocom + {USB_DEVICE(0x20F4, 0x648B)},//TRENDnet - Cameo + {USB_DEVICE(0x4855, 0x0090)},// - Feixun + {USB_DEVICE(0x13D3, 0x3357)},// - AzureWave + {USB_DEVICE(0x0DF6, 0x005C)},//Sitecom - Edimax + {USB_DEVICE(0x0BDA, 0x5088)},//Thinkware - CC&C + {USB_DEVICE(0x4856, 0x0091)},//NetweeN - Feixun + {USB_DEVICE(0x9846, 0x9041)},//Netgear - Cameo + {USB_DEVICE(0x0846, 0x9041)},//Netgear - Cameo + {USB_DEVICE(0x2019, 0x4902)},//Planex - Etop + {USB_DEVICE(0x2019, 0xAB2E)},//SW-WF02-AD15 -Abocom + + /****** 8188CE-VAU ********/ + {USB_DEVICE(0x13D3, 0x3359)},// - Azwave + {USB_DEVICE(0x13D3, 0x3358)},// - Azwave + + /****** 8188CUS Slim Solo********/ + {USB_DEVICE(0x04F2, 0xAFF7)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFF9)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFFA)},//XAVI - XAVI + {USB_DEVICE(0x2019, 0x1201)},//Planex - Vencer + + /****** 8188CUS Slim Combo ********/ + {USB_DEVICE(0x04F2, 0xAFF8)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFFB)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFFC)},//XAVI - XAVI + {USB_DEVICE(0x2019, 0x1201)},//Planex - Vencer + + /****** 8192CUS Dongle ********/ + {USB_DEVICE(0x2001, 0x3307)},//D-Link - Cameo + {USB_DEVICE(0x2001, 0x330A)},//D-Link - Alpha + {USB_DEVICE(0x2001, 0x3309)},//D-Link - Alpha + {USB_DEVICE(0x0586, 0x341F)},//Zyxel - Abocom + {USB_DEVICE(0x7392, 0x7822)},//Edimax - Edimax + {USB_DEVICE(0x2019, 0xAB2B)},//Planex - Abocom + {USB_DEVICE(0x07B8, 0x8178)},//Abocom - Abocom + {USB_DEVICE(0x07AA, 0x0056)},//ATKK - Gemtek + {USB_DEVICE(0x4855, 0x0091)},// - Feixun + {USB_DEVICE(0x050D, 0x2102)},//Belkin - Sercomm + {USB_DEVICE(0x050D, 0x2102)},//Belkin - Sercomm + {USB_DEVICE(0x050D, 0x2103)},//Belkin - Edimax + {USB_DEVICE(0x20F4, 0x624D)},//TRENDnet + {USB_DEVICE(0x0DF6, 0x0061)},//Sitecom - Edimax + {USB_DEVICE(0x0B05, 0x17AB)},//ASUS - Edimax + {USB_DEVICE(0x0846, 0x9021)},//Netgear - Sercomm +#endif +#ifdef CONFIG_RTL8192D + /*=== Realtek demoboard ===*/ + /****** 8192DU ********/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8193)},//8192DU-VC + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8194)},//8192DU-VS + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8111)},//Realtek 5G dongle for WiFi Display + + /*=== Customer ID ===*/ + /****** 8192DU-VC ********/ + {USB_DEVICE(0x2019, 0xAB2C)},//PCI - Abocm + {USB_DEVICE(0x2019, 0x4903)},//PCI - ETOP + {USB_DEVICE(0x2019, 0x4904)},//PCI - ETOP + {USB_DEVICE(0x07B8, 0x8193)},//Abocom - Abocom + + /****** 8192DU-VS ********/ + {USB_DEVICE(0x20F4, 0x664B)},//TRENDnet + + /****** 8192DU-WiFi Display Dongle ********/ + {USB_DEVICE(0x2019, 0xAB2D)},//Planex - Abocom ,5G dongle for WiFi Display +#endif + {} /* Terminating entry */ +}; + +int const rtw_usb_id_len = sizeof(rtw_usb_id_tbl) / sizeof(struct usb_device_id); + +static struct specific_device_id specific_device_id_tbl[] = { + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8177, .flags=SPEC_DEV_ID_DISABLE_HT},//8188cu 1*1 dongole, (b/g mode only) + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x817E, .flags=SPEC_DEV_ID_DISABLE_HT},//8188CE-VAU USB minCard (b/g mode only) + {.idVendor=0x0b05, .idProduct=0x1791, .flags=SPEC_DEV_ID_DISABLE_HT}, + {.idVendor=0x13D3, .idProduct=0x3311, .flags=SPEC_DEV_ID_DISABLE_HT}, + {.idVendor=0x13D3, .idProduct=0x3359, .flags=SPEC_DEV_ID_DISABLE_HT},//Russian customer -Azwave (8188CE-VAU g mode) +#ifdef RTK_DMP_PLATFORM + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8111, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // Realtek 5G dongle for WiFi Display + {.idVendor=0x2019, .idProduct=0xAB2D, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // PCI-Abocom 5G dongle for WiFi Display +#endif /* RTK_DMP_PLATFORM */ + {} +}; + +typedef struct _driver_priv{ + + struct usb_driver rtw_usb_drv; + int drv_registered; + +}drv_priv, *pdrv_priv; + + +static drv_priv drvpriv = { + .rtw_usb_drv.name = (char*)DRV_NAME, + .rtw_usb_drv.probe = rtw_drv_init, + .rtw_usb_drv.disconnect = rtw_dev_remove, + .rtw_usb_drv.id_table = rtw_usb_id_tbl, + .rtw_usb_drv.suspend = rtw_suspend, + .rtw_usb_drv.resume = rtw_resume, +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22)) + .rtw_usb_drv.reset_resume = rtw_resume, +#endif +#ifdef CONFIG_AUTOSUSPEND + .rtw_usb_drv.supports_autosuspend = 1, +#endif +}; + +MODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl); + + +static inline int RT_usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); +} + +static inline int RT_usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); +} + +static inline int RT_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT); +} + +static inline int RT_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK); +} + +static inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd) +{ + return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_in(epd)); +} + +static inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd) +{ + return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_out(epd)); +} + +static inline int RT_usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd) +{ + return (RT_usb_endpoint_xfer_int(epd) && RT_usb_endpoint_dir_in(epd)); +} + +static inline int RT_usb_endpoint_num(const struct usb_endpoint_descriptor *epd) +{ + return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; +} + +#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC +u8 rtw_init_intf_priv(_adapter * padapter) +{ + u8 rst = _SUCCESS; + + _rtw_mutex_init(&padapter->dvobjpriv.usb_vendor_req_mutex); + + padapter->dvobjpriv.usb_alloc_vendor_req_buf = rtw_zmalloc(MAX_USB_IO_CTL_SIZE); + + if (padapter->dvobjpriv.usb_alloc_vendor_req_buf == NULL){ + padapter->dvobjpriv.usb_alloc_vendor_req_buf =NULL; + printk("alloc usb_vendor_req_buf failed... /n"); + rst = _FAIL; + goto exit; + } + padapter->dvobjpriv.usb_vendor_req_buf = + (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(padapter->dvobjpriv.usb_alloc_vendor_req_buf ), ALIGNMENT_UNIT); +exit: + return rst; + +} + +u8 rtw_deinit_intf_priv(_adapter * padapter) +{ + u8 rst = _SUCCESS; + + if(padapter->dvobjpriv.usb_vendor_req_buf) + { + rtw_mfree(padapter->dvobjpriv.usb_alloc_vendor_req_buf,MAX_USB_IO_CTL_SIZE); + } + + return rst; + +} +#endif +static u32 usb_dvobj_init(_adapter *padapter) +{ + int i; + u8 val8; + int status = _SUCCESS; + struct usb_device_descriptor *pdev_desc; + struct usb_host_config *phost_conf; + struct usb_config_descriptor *pconf_desc; + struct usb_host_interface *phost_iface; + struct usb_interface_descriptor *piface_desc; + struct usb_host_endpoint *phost_endp; + struct usb_endpoint_descriptor *pendp_desc; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + +_func_enter_; + + pdvobjpriv->padapter = padapter; + + pdvobjpriv->RtNumInPipes = 0; + pdvobjpriv->RtNumOutPipes = 0; + + //padapter->EepromAddressSize = 6; + //pdvobjpriv->nr_endpoint = 6; + + pdev_desc = &pusbd->descriptor; + +#if 0 + DBG_8192C("\n8712_usb_device_descriptor:\n"); + DBG_8192C("bLength=%x\n", pdev_desc->bLength); + DBG_8192C("bDescriptorType=%x\n", pdev_desc->bDescriptorType); + DBG_8192C("bcdUSB=%x\n", pdev_desc->bcdUSB); + DBG_8192C("bDeviceClass=%x\n", pdev_desc->bDeviceClass); + DBG_8192C("bDeviceSubClass=%x\n", pdev_desc->bDeviceSubClass); + DBG_8192C("bDeviceProtocol=%x\n", pdev_desc->bDeviceProtocol); + DBG_8192C("bMaxPacketSize0=%x\n", pdev_desc->bMaxPacketSize0); + DBG_8192C("idVendor=%x\n", pdev_desc->idVendor); + DBG_8192C("idProduct=%x\n", pdev_desc->idProduct); + DBG_8192C("bcdDevice=%x\n", pdev_desc->bcdDevice); + DBG_8192C("iManufacturer=%x\n", pdev_desc->iManufacturer); + DBG_8192C("iProduct=%x\n", pdev_desc->iProduct); + DBG_8192C("iSerialNumber=%x\n", pdev_desc->iSerialNumber); + DBG_8192C("bNumConfigurations=%x\n", pdev_desc->bNumConfigurations); +#endif + + phost_conf = pusbd->actconfig; + pconf_desc = &phost_conf->desc; + +#if 0 + DBG_8192C("\n8712_usb_configuration_descriptor:\n"); + DBG_8192C("bLength=%x\n", pconf_desc->bLength); + DBG_8192C("bDescriptorType=%x\n", pconf_desc->bDescriptorType); + DBG_8192C("wTotalLength=%x\n", pconf_desc->wTotalLength); + DBG_8192C("bNumInterfaces=%x\n", pconf_desc->bNumInterfaces); + DBG_8192C("bConfigurationValue=%x\n", pconf_desc->bConfigurationValue); + DBG_8192C("iConfiguration=%x\n", pconf_desc->iConfiguration); + DBG_8192C("bmAttributes=%x\n", pconf_desc->bmAttributes); + DBG_8192C("bMaxPower=%x\n", pconf_desc->bMaxPower); +#endif + + //DBG_8192C("\n/****** num of altsetting = (%d) ******/\n", pintf->num_altsetting); + + phost_iface = &pintf->altsetting[0]; + piface_desc = &phost_iface->desc; + +#if 0 + DBG_8192C("\n8712_usb_interface_descriptor:\n"); + DBG_8192C("bLength=%x\n", piface_desc->bLength); + DBG_8192C("bDescriptorType=%x\n", piface_desc->bDescriptorType); + DBG_8192C("bInterfaceNumber=%x\n", piface_desc->bInterfaceNumber); + DBG_8192C("bAlternateSetting=%x\n", piface_desc->bAlternateSetting); + DBG_8192C("bNumEndpoints=%x\n", piface_desc->bNumEndpoints); + DBG_8192C("bInterfaceClass=%x\n", piface_desc->bInterfaceClass); + DBG_8192C("bInterfaceSubClass=%x\n", piface_desc->bInterfaceSubClass); + DBG_8192C("bInterfaceProtocol=%x\n", piface_desc->bInterfaceProtocol); + DBG_8192C("iInterface=%x\n", piface_desc->iInterface); +#endif + + pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces; + pdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber; + pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints; + + //DBG_8192C("\ndump usb_endpoint_descriptor:\n"); + + for (i = 0; i < pdvobjpriv->nr_endpoint; i++) + { + phost_endp = phost_iface->endpoint + i; + if (phost_endp) + { + pendp_desc = &phost_endp->desc; + + //DBG_8192C("\nusb_endpoint_descriptor(%d):\n", i); + //DBG_8192C("bLength=%x\n",pendp_desc->bLength); + //DBG_8192C("bDescriptorType=%x\n",pendp_desc->bDescriptorType); + //DBG_8192C("bEndpointAddress=%x\n",pendp_desc->bEndpointAddress); + //DBG_8192C("bmAttributes=%x\n",pendp_desc->bmAttributes); + //DBG_8192C("wMaxPacketSize=%x\n",pendp_desc->wMaxPacketSize); + //DBG_8192C("wMaxPacketSize=%x\n",le16_to_cpu(pendp_desc->wMaxPacketSize)); + //DBG_8192C("bInterval=%x\n",pendp_desc->bInterval); + //DBG_8192C("bRefresh=%x\n",pendp_desc->bRefresh); + //DBG_8192C("bSynchAddress=%x\n",pendp_desc->bSynchAddress); + + if (RT_usb_endpoint_is_bulk_in(pendp_desc)) + { + //DBG_8192C("RT_usb_endpoint_is_bulk_in = %x\n", RT_usb_endpoint_num(pendp_desc)); + pdvobjpriv->RtNumInPipes++; + } + else if (RT_usb_endpoint_is_int_in(pendp_desc)) + { + //DBG_8192C("RT_usb_endpoint_is_int_in = %x, Interval = %x\n", RT_usb_endpoint_num(pendp_desc),pendp_desc->bInterval); + pdvobjpriv->RtNumInPipes++; + } + else if (RT_usb_endpoint_is_bulk_out(pendp_desc)) + { + //DBG_8192C("RT_usb_endpoint_is_bulk_out = %x\n", RT_usb_endpoint_num(pendp_desc)); + pdvobjpriv->RtNumOutPipes++; + } + pdvobjpriv->ep_num[i] = RT_usb_endpoint_num(pendp_desc); + } + } + + DBG_8192C("nr_endpoint=%d, in_num=%d, out_num=%d\n", pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); + + if (pusbd->speed == USB_SPEED_HIGH) + { + pdvobjpriv->ishighspeed = _TRUE; + DBG_8192C("USB_SPEED_HIGH\n"); + } + else + { + pdvobjpriv->ishighspeed = _FALSE; + DBG_8192C("NON USB_SPEED_HIGH\n"); + } + + //.2 + if ((init_io_priv(padapter)) == _FAIL) + { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n")); + status = _FAIL; + } +#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC + if((rtw_init_intf_priv(padapter) )== _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't INIT rtw_init_intf_priv\n")); + status = _FAIL; + } +#endif + //.3 misc + _rtw_init_sema(&(padapter->dvobjpriv.usb_suspend_sema), 0); + + intf_read_chip_version(padapter); + + //.4 usb endpoint mapping + intf_chip_configure(padapter); + + ATOMIC_SET(&pdvobjpriv->continual_urb_error, 0); + +_func_exit_; + + return status; +} + +static void usb_dvobj_deinit(_adapter * padapter){ + + struct dvobj_priv *pdvobjpriv=&padapter->dvobjpriv; + + _func_enter_; +#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC + rtw_deinit_intf_priv(padapter); +#endif + _func_exit_; +} + +static void decide_chip_type_by_usb_device_id(_adapter *padapter, const struct usb_device_id *pdid) +{ + //u32 i; + //u16 vid, pid; + + padapter->chip_type = NULL_CHIP_TYPE; + + //vid = pdid->idVendor; + //pid = pdid->idProduct; + + //TODO: dynamic judge 92c or 92d according to usb vid and pid. +#ifdef CONFIG_RTL8192C + padapter->chip_type = RTL8188C_8192C; + padapter->HardwareType = HARDWARE_TYPE_RTL8192CU; + DBG_8192C("CHIP TYPE: RTL8188C_8192C\n"); +#endif + +#ifdef CONFIG_RTL8192D + padapter->chip_type = RTL8192D; + padapter->HardwareType = HARDWARE_TYPE_RTL8192DU; + DBG_8192C("CHIP TYPE: RTL8192D\n"); +#endif + +} + +static void usb_intf_start(_adapter *padapter) +{ + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_start\n")); + + if(padapter->HalFunc.inirp_init == NULL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("Initialize dvobjpriv.inirp_init error!!!\n")); + } + else + { + padapter->HalFunc.inirp_init(padapter); + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_start\n")); + +} + +static void usb_intf_stop(_adapter *padapter) +{ + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_stop\n")); + + //disabel_hw_interrupt + if(padapter->bSurpriseRemoved == _FALSE) + { + //device still exists, so driver can do i/o operation + //TODO: + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("SurpriseRemoved==_FALSE\n")); + } + + //cancel in irp + if(padapter->HalFunc.inirp_deinit !=NULL) + { + padapter->HalFunc.inirp_deinit(padapter); + } + + //cancel out irp + write_port_cancel(padapter); + + //todo:cancel other irps + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_stop\n")); + +} + +static void rtw_dev_unload(_adapter *padapter) +{ + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; + u8 val8; + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_dev_unload\n")); + + if(padapter->bup == _TRUE) + { + //DBG_8192C("===> rtw_dev_unload\n"); + + padapter->bDriverStopped = _TRUE; + + //s3. + if(padapter->intf_stop) + { + padapter->intf_stop(padapter); + } + + //s4. + if(!padapter->pwrctrlpriv.bInternalAutoSuspend ) + rtw_stop_drv_threads(padapter); + + + //s5. + if(padapter->bSurpriseRemoved == _FALSE) + { + //DBG_8192C("r871x_dev_unload()->rtl871x_hal_deinit()\n"); + #ifdef CONFIG_WOWLAN + if(padapter->pwrctrlpriv.bSupportWakeOnWlan==_TRUE){ + //DBG_8192C("%s bSupportWakeOnWlan==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__); + } + else + #endif + { + rtw_hal_deinit(padapter); + } + padapter->bSurpriseRemoved = _TRUE; + } + + padapter->bup = _FALSE; + + } + else + { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("r871x_dev_unload():padapter->bup == _FALSE\n" )); + } + + //DBG_8192C("<=== rtw_dev_unload\n"); + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-rtw_dev_unload\n")); + +} + +static void process_spec_devid(const struct usb_device_id *pdid) +{ + u16 vid, pid; + u32 flags; + int i; + int num = sizeof(specific_device_id_tbl)/sizeof(struct specific_device_id); + + for(i=0; iidVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_DISABLE_HT)) + { + rtw_ht_enable = 0; + rtw_cbw40_enable = 0; + rtw_ampdu_enable = 0; + } +#endif + +#ifdef RTK_DMP_PLATFORM + // Change the ifname to wlan10 when PC side WFD dongle plugin on DMP platform. + // It is used to distinguish between normal and PC-side wifi dongle/module. + if((pdid->idVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_ASSIGN_IFNAME)) + { + extern char* ifname; + strncpy(ifname, "wlan10", 6); + //DBG_8192C("%s()-%d: ifname=%s, vid=%04X, pid=%04X\n", __FUNCTION__, __LINE__, ifname, vid, pid); + } +#endif /* RTK_DMP_PLATFORM */ + + } +} + +#ifdef SUPPORT_HW_RFOFF_DETECTED +extern u8 disconnect_hdl(_adapter *padapter, u8 *pbuf); +extern void rtw_os_indicate_disconnect( _adapter *adapter ); + +int rtw_hw_suspend(_adapter *padapter ) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct usb_interface *pusb_intf = padapter->dvobjpriv.pusbintf; + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + + _func_enter_; + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + //DBG_8192C("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", + //padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + goto error_exit; + } + + if(padapter)//system suspend + { + LeaveAllPowerSaveMode(padapter); + + DBG_8192C("==> rtw_hw_suspend\n"); + _enter_pwrlock(&pwrpriv->lock); + pwrpriv->bips_processing = _TRUE; + //padapter->net_closed = _TRUE; + //s1. + if(pnetdev) + { + netif_carrier_off(pnetdev); + netif_stop_queue(pnetdev); + } + + //s2. + //s2-1. issue rtw_disassoc_cmd to fw + //rtw_disassoc_cmd(padapter);//donnot enqueue cmd + disconnect_hdl(padapter, NULL); + + //s2-2. indicate disconnect to os + //rtw_indicate_disconnect(padapter); + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + if(check_fwstate(pmlmepriv, _FW_LINKED)) + { + _clr_fwstate_(pmlmepriv, _FW_LINKED); + + rtw_led_control(padapter, LED_CTL_NO_LINK); + + rtw_os_indicate_disconnect(padapter); + + //donnot enqueue cmd + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 0); + + } + + } + //s2-3. + rtw_free_assoc_resources(padapter); + + //s2-4. + rtw_free_network_queue(padapter,_TRUE); + + rtw_ips_dev_unload(padapter); + + pwrpriv->rf_pwrstate = rf_off; + pwrpriv->bips_processing = _FALSE; + + _exit_pwrlock(&pwrpriv->lock); + } + else + goto error_exit; + + _func_exit_; + return 0; + +error_exit: + DBG_8192C("%s, failed \n",__FUNCTION__); + return (-1); + +} + +int rtw_hw_resume(_adapter *padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct usb_interface *pusb_intf = padapter->dvobjpriv.pusbintf; + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + + _func_enter_; + + if(padapter)//system resume + { + //DBG_8192C("==> rtw_hw_resume\n"); + _enter_pwrlock(&pwrpriv->lock); + pwrpriv->bips_processing = _TRUE; + rtw_reset_drv_sw(padapter); + + if(pm_netdev_open(pnetdev,_FALSE) != 0) + { + _exit_pwrlock(&pwrpriv->lock); + goto error_exit; + } + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + + if(!netif_queue_stopped(pnetdev)) + netif_start_queue(pnetdev); + else + netif_wake_queue(pnetdev); + + pwrpriv->bkeepfwalive = _FALSE; + pwrpriv->brfoffbyhw = _FALSE; + + pwrpriv->rf_pwrstate = rf_on; + pwrpriv->bips_processing = _FALSE; + + _exit_pwrlock(&pwrpriv->lock); + } + else + { + goto error_exit; + } + + _func_exit_; + + return 0; +error_exit: + DBG_8192C("%s, Open net dev failed \n",__FUNCTION__); + return (-1); +} +#endif + +static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) +{ + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct usb_device *usb_dev = interface_to_usbdev(pusb_intf); + + _func_enter_; + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + //DBG_8192C("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", + //padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + return 0; + } + + DBG_8192C("########### rtw_suspend #################\n"); + + if(padapter)//system suspend + { + if(pwrpriv->bInternalAutoSuspend ) + { + #ifdef CONFIG_AUTOSUSPEND + #ifdef SUPPORT_HW_RFOFF_DETECTED + // The FW command register update must after MAC and FW init ready. + if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) + { + u8 bOpen = _TRUE; + rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); + //rtl8192c_set_FwSelectSuspend_cmd(padapter,_TRUE ,500);//note fw to support hw power down ping detect + } + #endif + #endif + } + pwrpriv->bInSuspend = _TRUE; + rtw_cancel_all_timer(padapter); + LeaveAllPowerSaveMode(padapter); + + _enter_pwrlock(&pwrpriv->lock); + //padapter->net_closed = _TRUE; + //s1. + if(pnetdev) + { + netif_carrier_off(pnetdev); + netif_stop_queue(pnetdev); + } +#ifdef CONFIG_WOWLAN + padapter->pwrctrlpriv.bSupportWakeOnWlan=_TRUE; +#else + //s2. + //s2-1. issue rtw_disassoc_cmd to fw + disconnect_hdl(padapter, NULL); + //rtw_disassoc_cmd(padapter); +#endif + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) ) + { + //printk("%s:%d assoc_ssid:%s\n", __FUNCTION__, __LINE__, pmlmepriv->assoc_ssid.Ssid); + DBG_871X("%s:%d %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, __LINE__, + pmlmepriv->cur_network.network.Ssid.Ssid, + MAC_ARG(pmlmepriv->cur_network.network.MacAddress), + pmlmepriv->cur_network.network.Ssid.SsidLength, + pmlmepriv->assoc_ssid.SsidLength); + + pmlmepriv->to_roaming = 1; + } +#endif + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter); +#ifdef CONFIG_AUTOSUSPEND + if(!pwrpriv->bInternalAutoSuspend ) +#endif + //s2-4. + rtw_free_network_queue(padapter, _TRUE); + + rtw_dev_unload(padapter); +#ifdef CONFIG_AUTOSUSPEND + pwrpriv->rf_pwrstate = rf_off; + pwrpriv->bips_processing = _FALSE; +#endif + _exit_pwrlock(&pwrpriv->lock); + } + else + goto error_exit; + + DBG_871X("########### rtw_suspend done #################\n"); + + _func_exit_; + return 0; + +error_exit: + DBG_871X("########### rtw_suspend fail !! #################\n"); + return (-1); + +} + +static int rtw_resume(struct usb_interface *pusb_intf) +{ + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + int ret = 0; + + if(pwrpriv->bInternalAutoSuspend ){ + ret = rtw_resume_process(pusb_intf); + } else { +#ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_resume_in_workqueue(pwrpriv); +#elif defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) + if(rtw_is_earlysuspend_registered(pwrpriv)) { + //jeff: bypass resume here, do in late_resume + pwrpriv->do_late_resume = _TRUE; + } else { + ret = rtw_resume_process(pusb_intf); + } +#else // Normal resume process + ret = rtw_resume_process(pusb_intf); +#endif //CONFIG_RESUME_IN_WORKQUEUE + } + + return ret; + +} + + +int rtw_resume_process(struct usb_interface *pusb_intf) +{ + struct net_device *pnetdev; + struct usb_device *usb_dev; + _adapter *padapter; + struct pwrctrl_priv *pwrpriv; + + _func_enter_; + + DBG_8192C("########### rtw_resume #################\n"); + + if(pusb_intf) { + pnetdev=usb_get_intfdata(pusb_intf); + usb_dev = interface_to_usbdev(pusb_intf); + } else { + goto error_exit; + } + + padapter = (_adapter*)rtw_netdev_priv(pnetdev); + pwrpriv = &padapter->pwrctrlpriv; + + if(padapter)//system resume + { + _enter_pwrlock(&pwrpriv->lock); + rtw_reset_drv_sw(padapter); + pwrpriv->bkeepfwalive = _FALSE; + + //DBG_8192C("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); + if(pm_netdev_open(pnetdev,_TRUE) != 0) + goto error_exit; + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + +#ifdef CONFIG_AUTOSUSPEND + if(pwrpriv->bInternalAutoSuspend ) + { + #ifdef CONFIG_AUTOSUSPEND + #ifdef SUPPORT_HW_RFOFF_DETECTED + // The FW command register update must after MAC and FW init ready. + if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) + { + //rtl8192c_set_FwSelectSuspend_cmd(padapter,_FALSE ,500);//note fw to support hw power down ping detect + u8 bOpen = _FALSE; + rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); + } + #endif + #endif + + pwrpriv->bInternalAutoSuspend = _FALSE; + pwrpriv->brfoffbyhw = _FALSE; + { + //DBG_8192C("enc_algorithm(%x),wepkeymask(%x)\n", + padapter->securitypriv.dot11PrivacyAlgrthm,pwrpriv->wepkeymask); + if( (_WEP40_ == padapter->securitypriv.dot11PrivacyAlgrthm) || + (_WEP104_ == padapter->securitypriv.dot11PrivacyAlgrthm)) + { + sint keyid; + + for(keyid=0;keyid<4;keyid++){ + if(pwrpriv->wepkeymask & BIT(keyid)) { + if(keyid == padapter->securitypriv.dot11PrivacyKeyIndex) + rtw_set_key(padapter,&padapter->securitypriv, keyid, 1); + else + rtw_set_key(padapter,&padapter->securitypriv, keyid, 0); + } + } + } + } + } +#endif + _exit_pwrlock(&pwrpriv->lock); + } + else + { + goto error_exit; + } + + if( padapter->pid[1]!=0) { + DBG_871X("pid[1]:%d\n",padapter->pid[1]); + rtw_signal_process(padapter->pid[1], SIGUSR2); + } + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + rtw_roaming(padapter, NULL); +#endif + + DBG_871X("########### rtw_resume done#################\n"); + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_unlock_suspend(); + #endif //CONFIG_RESUME_IN_WORKQUEUE + + _func_exit_; + + return 0; +error_exit: + DBG_8192C("%s, Open net dev failed \n",__FUNCTION__); + + //DBG_871X("########### rtw_resume done with error#################\n"); + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_unlock_suspend(); + #endif //CONFIG_RESUME_IN_WORKQUEUE + + _func_exit_; + + return (-1); +} + +#ifdef CONFIG_AUTOSUSPEND +void autosuspend_enter(_adapter* padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + pwrpriv->bInternalAutoSuspend = _TRUE; + pwrpriv->bips_processing = _TRUE; + + //DBG_8192C("==>autosuspend_enter...........\n"); + + if(rf_off == pwrpriv->change_rfpwrstate ) + { + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + usb_enable_autosuspend(padapter->dvobjpriv.pusbdev); + #else + padapter->dvobjpriv.pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user + #endif + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) + usb_autopm_put_interface(padapter->dvobjpriv.pusbintf); + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) + usb_autopm_enable(padapter->dvobjpriv.pusbintf); + #else + usb_autosuspend_device(padapter->dvobjpriv.pusbdev, 1); + #endif + } + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) + DBG_8192C("...pm_usage_cnt(%d).....\n",atomic_read(&(padapter->dvobjpriv.pusbintf->pm_usage_cnt))); + #else + DBG_8192C("...pm_usage_cnt(%d).....\n",padapter->dvobjpriv.pusbintf->pm_usage_cnt); + #endif + +} +int autoresume_enter(_adapter* padapter) +{ + int result = _SUCCESS; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + //DBG_8192C("====> autoresume_enter \n"); + + if(rf_off == pwrpriv->rf_pwrstate ) + { + pwrpriv->ps_flag = _FALSE; + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) + if (usb_autopm_get_interface( padapter->dvobjpriv.pusbintf) < 0) + { + DBG_8192C( "can't get autopm: %d\n", result); + result = _FAIL; + goto error_exit; + } + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) + usb_autopm_disable(padapter->dvobjpriv.pusbintf); + #else + usb_autoresume_device(padapter->dvobjpriv.pusbdev, 1); + #endif + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) + //DBG_8192C("...pm_usage_cnt(%d).....\n",atomic_read(&(padapter->dvobjpriv.pusbintf->pm_usage_cnt))); + #else + //DBG_8192C("...pm_usage_cnt(%d).....\n",padapter->dvobjpriv.pusbintf->pm_usage_cnt); + #endif + } + //DBG_8192C("<==== autoresume_enter \n"); +error_exit: + + return result; +} +#endif + +extern char* ifname; +/* + * drv_init() - a device potentially for us + * + * notes: drv_init() is called when the bus driver has located a card for us to support. + * We accept the new device by returning 0. +*/ +static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid) +{ + int i; + + uint status; + _adapter *padapter = NULL; + struct dvobj_priv *pdvobjpriv; + struct net_device *pnetdev; + + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n")); + //DBG_8192C("+rtw_drv_init\n"); + + //2009.8.13, by Thomas + // In this probe function, O.S. will provide the usb interface pointer to driver. + // We have to increase the reference count of the usb device structure by using the usb_get_dev function. + usb_get_dev(interface_to_usbdev(pusb_intf)); + + pintf = pusb_intf; + + //step 0. + process_spec_devid(pdid); + + //step 1. set USB interface data + // init data + pnetdev = rtw_init_netdev(NULL); + if (!pnetdev) + goto error; + + SET_NETDEV_DEV(pnetdev, &pusb_intf->dev); + + padapter = rtw_netdev_priv(pnetdev); + padapter->bDriverStopped=_TRUE; + pdvobjpriv = &padapter->dvobjpriv; + pdvobjpriv->padapter = padapter; + pdvobjpriv->pusbintf = pusb_intf ; + pdvobjpriv->pusbdev = interface_to_usbdev(pusb_intf); + + // set data + usb_set_intfdata(pusb_intf, pnetdev); + + //set interface_type to usb + padapter->interface_type = RTW_USB; + + //step 1-1., decide the chip_type via vid/pid + decide_chip_type_by_usb_device_id(padapter, pdid); + + //step 2. + if(padapter->chip_type == RTL8188C_8192C) + { +#ifdef CONFIG_RTL8192C + rtl8192cu_set_hal_ops(padapter); +#endif + } + else if(padapter->chip_type == RTL8192D) + { +#ifdef CONFIG_RTL8192D + rtl8192du_set_hal_ops(padapter); +#endif + } + else + { + //DBG_8192C("Detect NULL_CHIP_TYPE\n"); + status = _FAIL; + goto error; + } + + //step 3. initialize the dvobj_priv + padapter->dvobj_init=&usb_dvobj_init; + padapter->dvobj_deinit=&usb_dvobj_deinit; + padapter->intf_start=&usb_intf_start; + padapter->intf_stop=&usb_intf_stop; + + //step 3. + //initialize the dvobj_priv ,include Chip version + if (padapter->dvobj_init == NULL){ + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("\n Initialize dvobjpriv.dvobj_init error!!!\n")); + goto error; + } + + status = padapter->dvobj_init(padapter); + if (status != _SUCCESS) { + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("initialize device object priv Failed!\n")); + goto error; + } + + //step 4. read efuse/eeprom data and get mac_addr + intf_read_chip_info(padapter); + + //step 5. + status = rtw_init_drv_sw(padapter); + if(status ==_FAIL){ + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n")); + goto error; + } + +#ifdef CONFIG_PM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) + if(padapter->pwrctrlpriv.bSupportRemoteWakeup) + { + pdvobjpriv->pusbdev->do_remote_wakeup=1; + pusb_intf->needs_remote_wakeup = 1; + device_init_wakeup(&pusb_intf->dev, 1); + //DBG_8192C("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); + //DBG_8192C("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev)); + } +#endif +#endif + +#ifdef CONFIG_AUTOSUSPEND + if( padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE ) + { + if(padapter->registrypriv.usbss_enable ){ /* autosuspend (2s delay) */ + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,38)) + pdvobjpriv->pusbdev->dev.power.autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time + #else + pdvobjpriv->pusbdev->autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time + #endif + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + usb_enable_autosuspend(padapter->dvobjpriv.pusbdev); + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) + padapter->bDisableAutosuspend = padapter->dvobjpriv.pusbdev->autosuspend_disabled ; + padapter->dvobjpriv.pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user + #endif + + usb_autopm_get_interface(padapter->dvobjpriv.pusbintf );//init pm_usage_cnt ,let it start from 1 + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) + //DBG_8192C("%s...pm_usage_cnt(%d).....\n",__FUNCTION__,atomic_read(&(pdvobjpriv->pusbintf ->pm_usage_cnt))); + #else + //DBG_8192C("%s...pm_usage_cnt(%d).....\n",__FUNCTION__,pdvobjpriv->pusbintf ->pm_usage_cnt); + #endif + } + } +#endif + // alloc dev name after read efuse. + rtw_init_netdev_name(pnetdev, ifname); + + rtw_macaddr_cfg(padapter->eeprompriv.mac_addr); + + _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); + //DBG_8192C("MAC Address from pnetdev->dev_addr= " MAC_FMT "\n", MAC_ARG(pnetdev->dev_addr)); + + + //step 6. + /* Tell the network stack we exist */ + if (register_netdev(pnetdev) != 0) { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n")); + goto error; + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-drv_init - Adapter->bDriverStopped=%d, Adapter->bSurpriseRemoved=%d\n",padapter->bDriverStopped, padapter->bSurpriseRemoved)); + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_drv - drv_init, success!\n")); + //DBG_8192C("-871x_drv - drv_init, success!\n"); + +#ifdef CONFIG_PROC_DEBUG +#ifdef RTK_DMP_PLATFORM + rtw_proc_init_one(pnetdev); +#endif +#endif + +#ifdef CONFIG_HOSTAPD_MLME + hostapd_mode_init(padapter); +#endif + +#ifdef CONFIG_PLATFORM_RTD2880B + //DBG_8192C("wlan link up\n"); + rtd2885_wlan_netlink_sendMsg("linkup", "8712"); +#endif + + +#ifdef CONFIG_GLOBAL_UI_PID + if(ui_pid[1]!=0) { + DBG_871X("ui_pid[1]:%d\n",ui_pid[1]); +// rtw_signal_process(ui_pid[1], SIGUSR2); + } +#endif + + //DBG_8192C("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n" + //,padapter->bDriverStopped + //,padapter->bSurpriseRemoved + //,padapter->bup + //,padapter->hw_init_completed + //); + rtl8188_power_save_init(); + + return 0; + +error: + + usb_put_dev(interface_to_usbdev(pusb_intf));//decrease the reference count of the usb device structure if driver fail on initialzation + + usb_set_intfdata(pusb_intf, NULL); + + usb_dvobj_deinit(padapter); + + if (pnetdev) + { + //unregister_netdev(pnetdev); + rtw_free_netdev(pnetdev); + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_usb - drv_init, fail!\n")); + //DBG_8192C("-871x_usb - drv_init, fail!\n"); + + return -ENODEV; +} + +/* + * dev_remove() - our device is being removed +*/ +//rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both +static void rtw_dev_remove(struct usb_interface *pusb_intf) +{ + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + u8 bResetDevice = _FALSE; + +_func_exit_; + + usb_set_intfdata(pusb_intf, NULL); + + if(padapter) + { + //DBG_8192C("+rtw_dev_remove\n"); + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+dev_remove()\n")); + +#ifdef CONFIG_HOSTAPD_MLME + hostapd_mode_unload(padapter); +#endif + LeaveAllPowerSaveMode(padapter); + + if(check_fwstate(pmlmepriv, _FW_LINKED)) + disconnect_hdl(padapter, NULL); + + if(drvpriv.drv_registered == _TRUE) + { + //DBG_8192C("r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\n"); + padapter->bSurpriseRemoved = _TRUE; + } + /*else + { + //DBG_8192C("r871xu_dev_remove():module removed\n"); + padapter->hw_init_completed = _FALSE; + }*/ + + if(padapter->DriverState != DRIVER_DISAPPEAR) + { + if(pnetdev) { + unregister_netdev(pnetdev); //will call netdev_close() +#ifdef CONFIG_PROC_DEBUG + rtw_proc_remove_one(pnetdev); +#endif + } + } + + rtw_cancel_all_timer(padapter); + + rtw_dev_unload(padapter); + + //DBG_8192C("+r871xu_dev_remove, hw_init_completed=%d\n", padapter->hw_init_completed); + + //Modify condition for 92DU DMDP 2010.11.18, by Thomas + //move code to here, avoid access null pointer. 2011.05.25. + if((pdvobjpriv->NumInterfaces != 2) || (pdvobjpriv->InterfaceNumber == 1)) + bResetDevice = _TRUE; + + //s6. + if(padapter->dvobj_deinit) + { + padapter->dvobj_deinit(padapter); + } + else + { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize hcipriv.hci_priv_init error!!!\n")); + } + + //after rtw_free_drv_sw(), padapter has beed freed, don't refer to it. + rtw_free_drv_sw(padapter); + + } + + usb_put_dev(interface_to_usbdev(pusb_intf));//decrease the reference count of the usb device structure when disconnect + + //If we didn't unplug usb dongle and remove/insert modlue, driver fails on sitesurvey for the first time when device is up . + //Reset usb port for sitesurvey fail issue. 2009.8.13, by Thomas + if(_TRUE == bResetDevice) + { + if(interface_to_usbdev(pusb_intf)->state != USB_STATE_NOTATTACHED) + { + //DBG_8192C("usb attached..., try to reset usb device\n"); + usb_reset_device(interface_to_usbdev(pusb_intf)); + } + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-dev_remove()\n")); + //DBG_8192C("-r871xu_dev_remove, done\n"); + +#ifdef CONFIG_PLATFORM_RTD2880B + DBG_8192C("wlan link down\n"); + rtd2885_wlan_netlink_sendMsg("linkdown", "8712"); +#endif + + #ifdef DBG_MEM_ALLOC + rtw_dump_mem_stat (); + #endif +_func_exit_; + rtl8188_power_save_exit(); + + return; + +} +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) +extern int console_suspend_enabled; +#endif + +static int rtw_drv_entry(void) +{ +#ifdef CONFIG_PLATFORM_RTK_DMP + u32 tmp; + tmp=readl((volatile unsigned int*)0xb801a608); + tmp &= 0xffffff00; + tmp |= 0x55; + writel(tmp,(volatile unsigned int*)0xb801a608);//write dummy register for 1055 +#endif + + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n")); + + DBG_8192C("rtw driver version=%s\n", DRIVERVERSION); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + //console_suspend_enabled=0; +#endif + + rtw_suspend_lock_init(); + + drvpriv.drv_registered = _TRUE; + return usb_register(&drvpriv.rtw_usb_drv); +} + +static void rtw_drv_halt(void) +{ + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n")); + //DBG_8192C("+rtw_drv_halt\n"); + + rtw_suspend_lock_uninit(); + + drvpriv.drv_registered = _FALSE; + usb_deregister(&drvpriv.rtw_usb_drv); + //DBG_8192C("-rtw_drv_halt\n"); +} + + +//module_init(rtw_drv_entry); +//module_exit(rtw_drv_halt); + +#include "wifi_version.h" + +int mv88w8686_if_sdio_init_module(void) +{ + printk("RTL8192/RTL8188 USB WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8192_DRV_VERSION); + + wifi_usb_init(); + wifi_activate_usb(); + + return rtw_drv_entry(); +} + +void mv88w8686_if_sdio_exit_module(void) +{ + rtw_drv_halt(); + wifi_deactivate_usb(); +} + +EXPORT_SYMBOL(mv88w8686_if_sdio_init_module); +EXPORT_SYMBOL(mv88w8686_if_sdio_exit_module); + +int rockchip_wifi_init_module(void) +{ + return mv88w8686_if_sdio_init_module(); +} + +void rockchip_wifi_exit_module(void) +{ + mv88w8686_if_sdio_exit_module(); +} + +EXPORT_SYMBOL(rockchip_wifi_init_module); +EXPORT_SYMBOL(rockchip_wifi_exit_module); diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c new file mode 100644 index 000000000000..58d277a10e5f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c @@ -0,0 +1,112 @@ +/* + * wifi_power.c + * + * Power control for WIFI module. + * + * Yongle Lai @ Rockchip + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +/* + * rtw_channel_plan : The initialization parameter of wifi channel, + * Allow number is "0" "2" and "5". + * 0 => 11 ( channel 1 ~ 11 is SCAN_ACTIVE ) + * 2 => 13 ( channel 1 ~ 13 is SCAN_ACTIVE ) + * 5 => 14 ( channel 1 ~ 14 is SCAN_ACTIVE ) + * default number is "2". + */ +char init_channel_plan = 2; + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +/* + * GPIO to control LDO/DCDC. + * + * 用于控制WIFI的电源,通常是3.3V和1.8V,可能1.2V也在其中。 + * + * 如果是扩展IO,请参考下面的例子: + * POWER_USE_EXT_GPIO, 0, 0, 0, PCA9554_Pin1, GPIO_HIGH + */ +struct wifi_power power_gpio = +{ + //POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 + + // RBOX + //POWER_USE_GPIO, POWER_GPIO_IOMUX, + //GPIO5D6_SDMMC1PWREN_NAME, GPIO5H_GPIO5D6, RK29_PIN5_PD6, GPIO_HIGH + + /*// YIFANG M803 + POWER_USE_GPIO, 0, + 0, 0, GPIO_WIFI_POWER, GPIO_HIGH + */ + //SDK + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * GPIO to control WIFI PowerDOWN/RESET. + * + * 控制WIFI的PowerDown脚。有些模组PowerDown脚是和Reset脚短接在一起。 + */ +struct wifi_power power_save_gpio = +{ + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * GPIO to reset WIFI. Keep this as NULL normally. + * + * 控制WIFI的Reset脚,通常WiFi模组没有用到这个引脚。 + */ +struct wifi_power power_reset_gpio = +{ + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * 在WIFI被上电前,会调用这个函数。 + */ +void wifi_turn_on_callback(void) +{ +} + +/* + * 在WIFI被下电后,会调用这个函数。 + */ +void wifi_turn_off_callback(void) +{ +} + +/* + * If external GPIO chip such as PCA9554 is being used, please + * implement the following 2 function. + * + * id: is GPIO identifier, such as GPIOPortF_Pin0, or external + * name defined in struct wifi_power. + * sens: the value should be set to GPIO, usually is GPIO_HIGH or GPIO_LOW. + * + * 如果有用扩展GPIO来控制WIFI,请实现下面的函数: + * 函数的功能是:控制指定的IO口id,使其状态切换为要求的sens状态。 + * id : 是IO的标识号,以整数的形式标识。 + * sens: 是要求的IO状态,为高或低。 + */ +void wifi_extgpio_operation(u8 id, u8 sens) +{ + //pca955x_gpio_direction_output(id, sens); +} + +/* + * 在系统中如果要调用WIFI的IO控制,将WIFI下电,可以调用如下接口: + * void rockchip_wifi_shutdown(void); + * 但注意需要在宏WIFI_GPIO_POWER_CONTROL的控制下。 + */ + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h new file mode 100644 index 000000000000..be89742c471f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h @@ -0,0 +1,87 @@ +/* + * wifi_power.h + * + * WIFI power control. + * + * Yongle Lai + */ + +#ifndef WIFI_POWER_H +#define WIFI_POWER_H + +#include + +#define DONT_SWITCH_USB 0 /* Don't switch USB automaticately. */ +#define WIFI_USE_OTG 1 /* WiFi will be connected to USB OTG. */ +#define WIFI_USE_HOST11 2 /* WiFi will be connected to USB HOST 1.1. */ + +#define WIFI_USE_IFACE WIFI_USE_HOST11 /* Select USB Controler */ +#define WIFI_GPIO_POWER_CONTROL 1 /* Enable GPIO Control Power */ + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +#include +#include +#else +#include +#include +#endif + +#define WIFI_CHIP_MV8686 0 +#define WIFI_CHIP_AR6002 1 +#define WIFI_CHIP_BCM4319 2 +#define WIFI_CHIP_NRX700 3 +#define WIFI_CHIP_RT3070 4 +#define WIFI_CHIP_RTL8192C 5 + +#define POWER_NOT_USE_GPIO 0 +#define POWER_USE_GPIO 1 +#define POWER_USE_EXT_GPIO 2 /* External GPIO chip is used, such as PCA9554. */ + +#define POWER_GPIO_NOT_IOMUX 0 +#define POWER_GPIO_IOMUX 1 + +#define GPIO_SWITCH_OFF 0 +#define GPIO_SWITCH_ON 1 + +struct wifi_power +{ + u8 use_gpio; /* If uses GPIO to control wifi power supply. 0 - no, 1 - yes. */ + u8 gpio_iomux; /* If the GPIO is iomux. 0 - no, 1 - yes. */ + char *iomux_name; /* IOMUX name */ + u8 iomux_value; /* IOMUX value - which function is choosen. */ + u8 gpio_id; /* GPIO number */ + u8 sensi_level; /* GPIO sensitive level. */ +}; + +int wifi_turn_on_card(int module); +int wifi_turn_off_card(void); +int wifi_reset_card(void); +void wifi_extgpio_operation(u8 id, u8 sens); + +void rockchip_wifi_shutdown(void); + +#endif /* WIFI_GPIO_POWER_CONTROL */ + +#define WIFI_NETWORK_BUSY 0 +#define WIFI_NETWORK_IDLE 1 + +int wifi_power_save_init(void); +int wifi_power_save_exit(void); +int wifi_power_save_stop(void); +int wifi_power_save_state(void); +void wifi_power_save_suspend(void); +void wifi_power_save_resume(void); +int wifi_power_save_register_callback(int (*callback)(int status)); + +void wifi_turn_on_callback(void); +void wifi_turn_off_callback(void); + +/* usb wifi */ +int wifi_activate_usb(void); +int wifi_deactivate_usb(void); +void wifi_usb_init(void); + +#endif /* WIFI_POWER_H */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c new file mode 100644 index 000000000000..4096bdac15fd --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c @@ -0,0 +1,112 @@ +/* + * wifi_power.c + * + * Yongle Lai @ Rockchip Fuzhou @ 20100303. + * + * Power control for WIFI module. + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +#include +#include +#else +#include +#include +#endif + + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +extern struct wifi_power power_gpio; +extern struct wifi_power power_save_gpio; +extern struct wifi_power power_reset_gpio; + +#define OS_IOMUX(name, value) rk29_mux_api_set((name), (value)); + +int wifi_gpio_operate(struct wifi_power *gpio, int flag) +{ + int sensitive; + + if (gpio->use_gpio == POWER_NOT_USE_GPIO) + return 0; + + if (gpio->gpio_iomux == POWER_GPIO_IOMUX) + { + OS_IOMUX(gpio->iomux_name, gpio->iomux_value); + } + + if (flag == GPIO_SWITCH_ON) + sensitive = gpio->sensi_level; + else + sensitive = 1 - gpio->sensi_level; + + if (gpio->use_gpio == POWER_USE_EXT_GPIO) + { + wifi_extgpio_operation(gpio->gpio_id, sensitive); + } + else + { + int ret; + + ret = gpio_request(gpio->gpio_id, NULL); + if (ret != 0) + printk("Request GPIO for WIFI POWER error!\n"); + + gpio_direction_output(gpio->gpio_id, sensitive); + gpio_set_value(gpio->gpio_id, sensitive); + + gpio_free(gpio->gpio_id); + } + + return 0; +} + +/* + * WiFi power up sequence + */ +int wifi_turn_on_rtl8192c_card(void) +{ + wifi_gpio_operate(&power_gpio, GPIO_SWITCH_ON); + if (power_gpio.use_gpio != POWER_NOT_USE_GPIO) + msleep(1000); + + return 0; +} + +int wifi_turn_on_card(int module) +{ + wifi_turn_on_callback(); + + wifi_turn_on_rtl8192c_card(); + + return 0; +} + +int wifi_turn_off_card(void) +{ + wifi_gpio_operate(&power_gpio, GPIO_SWITCH_OFF); + msleep(5); + + wifi_turn_off_callback(); + + return 0; +} + +void rockchip_wifi_shutdown(void) +{ + printk("rockchip_wifi_shutdown....\n"); + + wifi_turn_off_card(); +} +EXPORT_SYMBOL(rockchip_wifi_shutdown); + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c new file mode 100644 index 000000000000..c979cc34958c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c @@ -0,0 +1,118 @@ +/* + * wifi_power.c + * + * Power control for WIFI module. + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +int wifi_change_usb_mode = 0; +int usb_wifi_status = 0; + +void wifi_usb_init(void) +{ + wifi_change_usb_mode = 0; + usb_wifi_status = 0; +} + +#if (WIFI_USE_IFACE == WIFI_USE_OTG) + +#define USB_NORMAL 0 +#define USB_FORCE_HOST 1 +#define USB_FORCE_DEVICE 2 + +extern int usb_force_usb_for_wifi(int mode); + +/* + * Change USB mode to HOST. + */ +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + + wifi_change_usb_mode = usb_force_usb_for_wifi(USB_FORCE_HOST); + msleep(1000); + + usb_wifi_status = 1; + + return 0; +} + +/* + * Change USB mode to be original. + */ +int wifi_deactivate_usb(void) +{ + if (wifi_change_usb_mode == 1) + { + usb_force_usb_for_wifi(USB_FORCE_DEVICE); + msleep(1000); + usb_force_usb_for_wifi(USB_NORMAL); + msleep(1000); + } + wifi_turn_off_card(); + + usb_wifi_status = 0; + + return 0; +} + +#elif (WIFI_USE_IFACE == WIFI_USE_HOST11) + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +extern int usb_switch_usb_host11_for_wifi(int enabled); +#endif + +int wifi_deactivate_usb(void) +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) + usb_switch_usb_host11_for_wifi(0); + msleep(1000); +#endif + + wifi_turn_off_card(); + msleep(100); + + return 0; +} + +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + msleep(100); + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) + usb_switch_usb_host11_for_wifi(1); + msleep(1000); +#endif + + return 0; +} + +#else + +int wifi_deactivate_usb(void) +{ + wifi_turn_off_card(); + msleep(1000); + return 0; +} + +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + msleep(1000); + return 0; +} +#endif + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h new file mode 100755 index 000000000000..1b07896e2f33 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h @@ -0,0 +1,13 @@ +/* + * Yongle Lai @ Rockchip + */ +#ifndef WIFI_BCM4319_VERSION_H +#define WIFI_BCM4319_VERSION_H + +/* + * Broadcom BCM4319 driver version. + */ +#define RTL8192_DRV_VERSION "3.11" + +#endif /* WIFI_BCM4319_VERSION_H */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c new file mode 100755 index 000000000000..9ca715116aaf --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c @@ -0,0 +1,291 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _XMIT_OSDEP_C_ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +uint rtw_remainder_len(struct pkt_file *pfile) +{ + return (pfile->buf_len - ((SIZE_PTR)(pfile->cur_addr) - (SIZE_PTR)(pfile->buf_start))); +} + +void _rtw_open_pktfile (_pkt *pktptr, struct pkt_file *pfile) +{ +_func_enter_; + + pfile->pkt = pktptr; + pfile->cur_addr = pfile->buf_start = pktptr->data; + pfile->pkt_len = pfile->buf_len = pktptr->len; + + pfile->cur_buffer = pfile->buf_start ; + +_func_exit_; +} + +uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen) +{ + uint len = 0; + +_func_enter_; + + len = rtw_remainder_len(pfile); + len = (rlen > len)? len: rlen; + + if(rmem) + skb_copy_bits(pfile->pkt, pfile->buf_len-pfile->pkt_len, rmem, len); + + pfile->cur_addr += len; + pfile->pkt_len -= len; + +_func_exit_; + + return len; +} + +sint rtw_endofpktfile(struct pkt_file *pfile) +{ +_func_enter_; + + if (pfile->pkt_len == 0) { +_func_exit_; + return _TRUE; + } + +_func_exit_; + + return _FALSE; +} + +void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib) +{ + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + struct sk_buff *skb = (struct sk_buff *)pkt; + pattrib->hw_tcp_csum = 0; + + if (skb->ip_summed == CHECKSUM_PARTIAL) { + if (skb_shinfo(skb)->nr_frags == 0) + { + const struct iphdr *ip = ip_hdr(skb); + if (ip->protocol == IPPROTO_TCP) { + // TCP checksum offload by HW + DBG_8192C("CHECKSUM_PARTIAL TCP\n"); + pattrib->hw_tcp_csum = 1; + //skb_checksum_help(skb); + } else if (ip->protocol == IPPROTO_UDP) { + //DBG_8192C("CHECKSUM_PARTIAL UDP\n"); +#if 1 + skb_checksum_help(skb); +#else + // Set UDP checksum = 0 to skip checksum check + struct udphdr *udp = skb_transport_header(skb); + udp->check = 0; +#endif + } else { + DBG_8192C("%s-%d TCP CSUM offload Error!!\n", __FUNCTION__, __LINE__); + WARN_ON(1); /* we need a WARN() */ + } + } + else { // IP fragmentation case + DBG_8192C("%s-%d nr_frags != 0, using skb_checksum_help(skb);!!\n", __FUNCTION__, __LINE__); + skb_checksum_help(skb); + } + } +#endif + +} + +int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz) +{ +#ifdef CONFIG_USB_HCI + int i; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + pxmitbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)alloc_sz, GFP_ATOMIC, &pxmitbuf->dma_transfer_addr); + pxmitbuf->pbuf = pxmitbuf->pallocated_buf; + if(pxmitbuf->pallocated_buf == NULL) + return _FAIL; +#else // CONFIG_USE_USB_BUFFER_ALLOC_TX + + pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz); + if (pxmitbuf->pallocated_buf == NULL) + { + return _FAIL; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); + pxmitbuf->dma_transfer_addr = 0; + +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + + for(i=0; i<8; i++) + { + pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL); + if(pxmitbuf->pxmit_urb[i] == NULL) + { + DBG_8192C("pxmitbuf->pxmit_urb[i]==NULL"); + return _FAIL; + } + + } +#endif +#ifdef CONFIG_PCI_HCI + pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz); + if (pxmitbuf->pallocated_buf == NULL) + { + return _FAIL; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); +#endif + + return _SUCCESS; +} + +void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz) +{ +#ifdef CONFIG_USB_HCI + int i; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + + + for(i=0; i<8; i++) + { + if(pxmitbuf->pxmit_urb[i]) + { + //usb_kill_urb(pxmitbuf->pxmit_urb[i]); + usb_free_urb(pxmitbuf->pxmit_urb[i]); + } + } + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + rtw_usb_buffer_free(pusbd, (size_t)free_sz, pxmitbuf->pallocated_buf, pxmitbuf->dma_transfer_addr); + pxmitbuf->pallocated_buf = NULL; + pxmitbuf->dma_transfer_addr = 0; +#else // CONFIG_USE_USB_BUFFER_ALLOC_TX + if(pxmitbuf->pallocated_buf) + rtw_mfree(pxmitbuf->pallocated_buf, free_sz); +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + +#endif +#ifdef CONFIG_PCI_HCI + if(pxmitbuf->pallocated_buf) + rtw_mfree(pxmitbuf->pallocated_buf, free_sz); +#endif +} + +void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt) +{ + if (netif_queue_stopped(padapter->pnetdev)) + netif_wake_queue(padapter->pnetdev); + + dev_kfree_skb_any(pkt); +} + +void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe) +{ + if(pxframe->pkt) + { + //RT_TRACE(_module_xmit_osdep_c_,_drv_err_,("linux : rtw_os_xmit_complete, dev_kfree_skb()\n")); + + //dev_kfree_skb_any(pxframe->pkt); + rtw_os_pkt_complete(padapter, pxframe->pkt); + + } + + pxframe->pkt = NULL; +} + +void rtw_os_xmit_schedule(_adapter *padapter) +{ + _irqL irqL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + + if(rtw_txframes_pending(padapter)) + { + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + } + + _exit_critical_bh(&pxmitpriv->lock, &irqL); +} + + +int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + s32 res = 0; + int ret = 0; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n")); + + if (rtw_if_up(padapter) == _FALSE) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n")); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__); + #endif + goto drop_packet; + } + + res = rtw_xmit(padapter, pkt); + if (res < 0) { + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s rtw_xmit fail\n", __FUNCTION__); + #endif + goto drop_packet; + } + + pxmitpriv->tx_pkts++; + RT_TRACE(_module_xmit_osdep_c_, _drv_info_, ("rtw_xmit_entry: tx_pkts=%d\n", (u32)pxmitpriv->tx_pkts)); + goto exit; + +drop_packet: + pxmitpriv->tx_drop++; + dev_kfree_skb_any(pkt); + RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, ("rtw_xmit_entry: drop, tx_drop=%d\n", (u32)pxmitpriv->tx_drop)); + +exit: + +_func_exit_; + + return 0; +} + diff --git a/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c b/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c new file mode 100755 index 000000000000..84fb20b18029 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c @@ -0,0 +1,1346 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#define _OSDEP_SERVICE_C_ + +#include +#include +#include +#include +#include + +#ifdef RTK_DMP_PLATFORM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) +#include +#endif +#endif + +#define RT_TAG '1178' + +#ifdef MEMORY_LEAK_DEBUG +#ifdef PLATFORM_LINUX +#include +atomic_t _malloc_cnt = ATOMIC_INIT(0); +atomic_t _malloc_size = ATOMIC_INIT(0); +#endif +#endif /* MEMORY_LEAK_DEBUG */ + + +inline u8* _rtw_vmalloc(u32 sz) +{ + u8 *pbuf; +#ifdef PLATFORM_LINUX + pbuf = vmalloc(sz); +#endif + +#ifdef PLATFORM_WINDOWS + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); +#endif + + return pbuf; +} + +inline u8* _rtw_zvmalloc(u32 sz) +{ + u8 *pbuf; +#ifdef PLATFORM_LINUX + pbuf = _rtw_vmalloc(sz); + if (pbuf != NULL) + memset(pbuf, 0, sz); +#endif + +#ifdef PLATFORM_WINDOWS + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); + if (pbuf != NULL) + NdisFillMemory(pbuf, sz, 0); +#endif + + return pbuf; +} + +inline void _rtw_vmfree(u8 *pbuf, u32 sz) +{ +#ifdef PLATFORM_LINUX + vfree(pbuf); +#endif + +#ifdef PLATFORM_WINDOWS + NdisFreeMemory(pbuf,sz, 0); +#endif +} + +u8* _rtw_malloc(u32 sz) +{ + + u8 *pbuf=NULL; + +#ifdef PLATFORM_LINUX +#ifdef RTK_DMP_PLATFORM + if(sz > 0x4000) + pbuf = (u8 *)dvr_malloc(sz); + else +#endif + pbuf = kmalloc(sz, /*GFP_KERNEL*/GFP_ATOMIC); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); + +#endif + +#ifdef MEMORY_LEAK_DEBUG +#ifdef PLATFORM_LINUX + if ( pbuf != NULL) { + atomic_inc(&_malloc_cnt); + atomic_add(sz, &_malloc_size); + } +#endif +#endif /* MEMORY_LEAK_DEBUG */ + + return pbuf; + +} + + +u8* _rtw_zmalloc(u32 sz) +{ + u8 *pbuf = _rtw_malloc(sz); + + if (pbuf != NULL) { + +#ifdef PLATFORM_LINUX + memset(pbuf, 0, sz); +#endif + +#ifdef PLATFORM_WINDOWS + NdisFillMemory(pbuf, sz, 0); +#endif + + } + + return pbuf; + +} + +void _rtw_mfree(u8 *pbuf, u32 sz) +{ + +#ifdef PLATFORM_LINUX +#ifdef RTK_DMP_PLATFORM + if(sz > 0x4000) + dvr_free(pbuf); + else +#endif + kfree(pbuf); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisFreeMemory(pbuf,sz, 0); + +#endif + +#ifdef MEMORY_LEAK_DEBUG +#ifdef PLATFORM_LINUX + atomic_dec(&_malloc_cnt); + atomic_sub(sz, &_malloc_size); +#endif +#endif /* MEMORY_LEAK_DEBUG */ + +} + + +#ifdef DBG_MEM_ALLOC + +struct rtw_dbg_mem_stat { + ATOMIC_T vir_alloc; // the memory bytes we allocate now + ATOMIC_T vir_peak; // the peak memory bytes we allocate + ATOMIC_T vir_alloc_err; // the error times we fail to allocate memory + + ATOMIC_T phy_alloc; + ATOMIC_T phy_peak; + ATOMIC_T phy_alloc_err; +} rtw_dbg_mem_stat; + +enum { + MEM_STAT_VIR_ALLOC_SUCCESS, + MEM_STAT_VIR_ALLOC_FAIL, + MEM_STAT_VIR_FREE, + MEM_STAT_PHY_ALLOC_SUCCESS, + MEM_STAT_PHY_ALLOC_FAIL, + MEM_STAT_PHY_FREE +}; + +void rtw_dump_mem_stat (void) +{ + int vir_alloc, vir_peak, vir_alloc_err, phy_alloc, phy_peak, phy_alloc_err; + + vir_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc); + vir_peak=ATOMIC_READ(&rtw_dbg_mem_stat.vir_peak); + vir_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc_err); + + phy_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc); + phy_peak=ATOMIC_READ(&rtw_dbg_mem_stat.phy_peak); + phy_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc_err); + + DBG_871X("vir_alloc:%d, vir_peak:%d,vir_alloc_err:%d, phy_alloc:%d, phy_peak:%d, phy_alloc_err:%d\n" + , vir_alloc, vir_peak, vir_alloc_err + , phy_alloc, phy_peak, phy_alloc_err + ); +} + +void rtw_update_mem_stat(u8 flag, u32 sz) +{ + static u32 update_time = 0; + int peak, alloc; + + if(!update_time) { + ATOMIC_SET(&rtw_dbg_mem_stat.vir_alloc,0); + ATOMIC_SET(&rtw_dbg_mem_stat.vir_peak,0); + ATOMIC_SET(&rtw_dbg_mem_stat.vir_alloc_err,0); + ATOMIC_SET(&rtw_dbg_mem_stat.phy_alloc,0); + ATOMIC_SET(&rtw_dbg_mem_stat.phy_peak,0); + ATOMIC_SET(&rtw_dbg_mem_stat.phy_alloc_err,0); + } + + switch(flag) { + case MEM_STAT_VIR_ALLOC_SUCCESS: + alloc = ATOMIC_ADD_RETURN(&rtw_dbg_mem_stat.vir_alloc, sz); + peak=ATOMIC_READ(&rtw_dbg_mem_stat.vir_peak); + if (peak 5000) { + rtw_dump_mem_stat(); + update_time=rtw_get_current_time(); + } + + +} + + +inline u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line) +{ + u8 *p; + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p=_rtw_vmalloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL + , sz + ); + + return p; +} + +inline u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line) +{ + u8 *p; + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p=_rtw_zvmalloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL + , sz + ); + + return p; +} + +inline void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line) +{ + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); + + _rtw_vmfree((pbuf), (sz)); + + rtw_update_mem_stat( + MEM_STAT_VIR_FREE + , sz + ); + +} + +inline u8* dbg_rtw_malloc(u32 sz, const char *func, int line) +{ + u8 *p; + + if((sz)>4096) + DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p=_rtw_malloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL + , sz + ); + + return p; +} + +inline u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line) +{ + u8 *p; + + if((sz)>4096) + DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p = _rtw_zmalloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL + , sz + ); + + return p; + +} + +inline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line) +{ + if((sz)>4096) + DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); + + _rtw_mfree((pbuf), (sz)); + + rtw_update_mem_stat( + MEM_STAT_PHY_FREE + , sz + ); +} +#endif + + +void _rtw_memcpy(void* dst, void* src, u32 sz) +{ + +#ifdef PLATFORM_LINUX + + memcpy(dst, src, sz); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMoveMemory(dst, src, sz); + +#endif + +} + +int _rtw_memcmp(void *dst, void *src, u32 sz) +{ + +#ifdef PLATFORM_LINUX +//under Linux/GNU/GLibc, the return value of memcmp for two same mem. chunk is 0 + + if (!(memcmp(dst, src, sz))) + return _TRUE; + else + return _FALSE; +#endif + + +#ifdef PLATFORM_WINDOWS +//under Windows, the return value of NdisEqualMemory for two same mem. chunk is 1 + + if (NdisEqualMemory (dst, src, sz)) + return _TRUE; + else + return _FALSE; + +#endif + + + +} + +void _rtw_memset(void *pbuf, int c, u32 sz) +{ + +#ifdef PLATFORM_LINUX + + memset(pbuf, c, sz); + +#endif + +#ifdef PLATFORM_WINDOWS +#if 0 + NdisZeroMemory(pbuf, sz); + if (c != 0) memset(pbuf, c, sz); +#else + NdisFillMemory(pbuf, sz, c); +#endif +#endif + +} + +void _rtw_init_listhead(_list *list) +{ + +#ifdef PLATFORM_LINUX + + INIT_LIST_HEAD(list); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisInitializeListHead(list); + +#endif + +} + + +/* +For the following list_xxx operations, +caller must guarantee the atomic context. +Otherwise, there will be racing condition. +*/ +u32 rtw_is_list_empty(_list *phead) +{ + +#ifdef PLATFORM_LINUX + + if (list_empty(phead)) + return _TRUE; + else + return _FALSE; + +#endif + + +#ifdef PLATFORM_WINDOWS + + if (IsListEmpty(phead)) + return _TRUE; + else + return _FALSE; + +#endif + + +} + + +void rtw_list_insert_tail(_list *plist, _list *phead) +{ + +#ifdef PLATFORM_LINUX + + list_add_tail(plist, phead); + +#endif + +#ifdef PLATFORM_WINDOWS + + InsertTailList(phead, plist); + +#endif + +} + + +/* + +Caller must check if the list is empty before calling rtw_list_delete + +*/ + + +void _rtw_init_sema(_sema *sema, int init_val) +{ + +#ifdef PLATFORM_LINUX + + sema_init(sema, init_val); + +#endif + +#ifdef PLATFORM_OS_XP + + KeInitializeSemaphore(sema, init_val, SEMA_UPBND); // count=0; + +#endif + +#ifdef PLATFORM_OS_CE + if(*sema == NULL) + *sema = CreateSemaphore(NULL, init_val, SEMA_UPBND, NULL); +#endif + +} + +void _rtw_free_sema(_sema *sema) +{ + +#ifdef PLATFORM_OS_CE + CloseHandle(*sema); +#endif + +} + +void _rtw_up_sema(_sema *sema) +{ + +#ifdef PLATFORM_LINUX + + up(sema); + +#endif + +#ifdef PLATFORM_OS_XP + + KeReleaseSemaphore(sema, IO_NETWORK_INCREMENT, 1, FALSE ); + +#endif + +#ifdef PLATFORM_OS_CE + ReleaseSemaphore(*sema, 1, NULL ); +#endif +} + +u32 _rtw_down_sema(_sema *sema) +{ + +#ifdef PLATFORM_LINUX + + if (down_interruptible(sema)) + return _FAIL; + else + return _SUCCESS; + +#endif + +#ifdef PLATFORM_OS_XP + + if(STATUS_SUCCESS == KeWaitForSingleObject(sema, Executive, KernelMode, TRUE, NULL)) + return _SUCCESS; + else + return _FAIL; +#endif + +#ifdef PLATFORM_OS_CE + if(WAIT_OBJECT_0 == WaitForSingleObject(*sema, INFINITE )) + return _SUCCESS; + else + return _FAIL; +#endif +} + + + +void _rtw_mutex_init(_mutex *pmutex) +{ +#ifdef PLATFORM_LINUX + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_init(pmutex); +#else + init_MUTEX(pmutex); +#endif + +#endif + +#ifdef PLATFORM_OS_XP + + KeInitializeMutex(pmutex, 0); + +#endif + +#ifdef PLATFORM_OS_CE + *pmutex = CreateMutex( NULL, _FALSE, NULL); +#endif +} + + +void _rtw_mutex_free(_mutex *pmutex) +{ +#ifdef PLATFORM_LINUX + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_destroy(pmutex); +#else +#endif + +#endif + +#ifdef PLATFORM_OS_XP + +#endif + +#ifdef PLATFORM_OS_CE + +#endif +} + +void _rtw_spinlock_init(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_lock_init(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisAllocateSpinLock(plock); + +#endif + +} + +void _rtw_spinlock_free(_lock *plock) +{ + + +#ifdef PLATFORM_WINDOWS + + NdisFreeSpinLock(plock); + +#endif + +} + + +void _rtw_spinlock(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_lock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisAcquireSpinLock(plock); + +#endif + +} + +void _rtw_spinunlock(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_unlock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisReleaseSpinLock(plock); + +#endif +} + + +void _rtw_spinlock_ex(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_lock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisDprAcquireSpinLock(plock); + +#endif + +} + +void _rtw_spinunlock_ex(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_unlock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisDprReleaseSpinLock(plock); + +#endif +} + + + +void _rtw_init_queue(_queue *pqueue) +{ + + _rtw_init_listhead(&(pqueue->queue)); + + _rtw_spinlock_init(&(pqueue->lock)); + +} + +u32 _rtw_queue_empty(_queue *pqueue) +{ + return (rtw_is_list_empty(&(pqueue->queue))); +} + + +u32 rtw_end_of_queue_search(_list *head, _list *plist) +{ + if (head == plist) + return _TRUE; + else + return _FALSE; +} + + +u32 rtw_get_current_time(void) +{ + +#ifdef PLATFORM_LINUX + return jiffies; +#endif + +#ifdef PLATFORM_WINDOWS + LARGE_INTEGER SystemTime; + NdisGetCurrentSystemTime(&SystemTime); + return (u32)(SystemTime.LowPart);// count of 100-nanosecond intervals +#endif +} + +inline u32 rtw_systime_to_ms(u32 systime) +{ +#ifdef PLATFORM_LINUX + return systime*1000/HZ; +#endif + +#ifdef PLATFORM_WINDOWS + return systime /10000 ; +#endif +} + +// the input parameter start use the same unit as returned by rtw_get_current_time +inline s32 rtw_get_passing_time_ms(u32 start) +{ +#ifdef PLATFORM_LINUX + return rtw_systime_to_ms(jiffies-start); +#endif + +#ifdef PLATFORM_WINDOWS + LARGE_INTEGER SystemTime; + NdisGetCurrentSystemTime(&SystemTime); + return rtw_systime_to_ms((u32)(SystemTime.LowPart) - start) ; +#endif +} + +inline s32 rtw_get_time_interval_ms(u32 start, u32 end) +{ +#ifdef PLATFORM_LINUX + return rtw_systime_to_ms(end-start); +#endif + +#ifdef PLATFORM_WINDOWS + return rtw_systime_to_ms(end-start); +#endif +} + + +void rtw_sleep_schedulable(int ms) +{ + +#ifdef PLATFORM_LINUX + + u32 delta; + + delta = (ms * HZ)/1000;//(ms) + if (delta == 0) { + delta = 1;// 1 ms + } + set_current_state(TASK_INTERRUPTIBLE); + if (schedule_timeout(delta) != 0) { + return ; + } + return; + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMSleep(ms*1000); //(us)*1000=(ms) + +#endif + +} + + +void rtw_msleep_os(int ms) +{ + +#ifdef PLATFORM_LINUX + + msleep((unsigned int)ms); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMSleep(ms*1000); //(us)*1000=(ms) + +#endif + + +} +void rtw_usleep_os(int us) +{ + +#ifdef PLATFORM_LINUX + + // msleep((unsigned int)us); + if ( 1 < (us/1000) ) + msleep(1); + else + msleep( (us/1000) + 1); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMSleep(us); //(us) + +#endif + + +} + + +#ifdef DBG_DELAY_OS +void _rtw_mdelay_os(int ms, const char *func, const int line) +{ + if(ms>10) + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms); + rtw_msleep_os(ms); + return; + + + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms); + +#if defined(PLATFORM_LINUX) + + mdelay((unsigned long)ms); + +#elif defined(PLATFORM_WINDOWS) + + NdisStallExecution(ms*1000); //(us)*1000=(ms) + +#endif + + +} +void _rtw_udelay_os(int us, const char *func, const int line) +{ + + if(us > 1000) { + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); + rtw_usleep_os(us); + return; + } + + + //DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); + + +#if defined(PLATFORM_LINUX) + + udelay((unsigned long)us); + +#elif defined(PLATFORM_WINDOWS) + + NdisStallExecution(us); //(us) + +#endif + +} +#else +void rtw_mdelay_os(int ms) +{ + +#ifdef PLATFORM_LINUX + + mdelay((unsigned long)ms); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisStallExecution(ms*1000); //(us)*1000=(ms) + +#endif + + +} +void rtw_udelay_os(int us) +{ + +#ifdef PLATFORM_LINUX + + udelay((unsigned long)us); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisStallExecution(us); //(us) + +#endif + +} +#endif + +#define RTW_SUSPEND_LOCK_NAME "rtw_wifi" + +#ifdef CONFIG_WAKELOCK +static struct wake_lock rtw_suspend_lock; +#elif defined(CONFIG_ANDROID_POWER) +static android_suspend_lock_t rtw_suspend_lock ={ + .name = RTW_SUSPEND_LOCK_NAME +}; +#endif + +inline void rtw_suspend_lock_init() +{ + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + //DBG_871X("##########%s ###########\n", __FUNCTION__); + #endif + + #ifdef CONFIG_WAKELOCK + wake_lock_init(&rtw_suspend_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_LOCK_NAME); + #elif defined(CONFIG_ANDROID_POWER) + android_init_suspend_lock(&rtw_suspend_lock); + #endif + +} + +inline void rtw_suspend_lock_uninit() +{ + + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + //DBG_871X("##########%s###########\n", __FUNCTION__); + if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { + DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); + return; + } + #endif + + #ifdef CONFIG_WAKELOCK + wake_lock_destroy(&rtw_suspend_lock); + #elif defined(CONFIG_ANDROID_POWER) + android_uninit_suspend_lock(&rtw_suspend_lock); + #endif +} + + +inline void rtw_lock_suspend() +{ + + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + //DBG_871X("##########%s###########\n", __FUNCTION__); + if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { + DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); + return; + } + #endif + + #ifdef CONFIG_WAKELOCK + wake_lock(&rtw_suspend_lock); + #elif defined(CONFIG_ANDROID_POWER) + android_lock_suspend(&rtw_suspend_lock); + #endif +} + +inline void rtw_unlock_suspend() +{ + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + //DBG_871X("##########%s###########\n", __FUNCTION__); + if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { + DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); + return; + } + #endif + + #ifdef CONFIG_WAKELOCK + wake_unlock(&rtw_suspend_lock); + #elif defined(CONFIG_ANDROID_POWER) + android_unlock_suspend(&rtw_suspend_lock); + #endif +} + + +inline void ATOMIC_SET(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + atomic_set(v,i); + #elif defined(PLATFORM_WINDOWS) + *v=i;// other choice???? + #endif +} + +inline int ATOMIC_READ(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + return atomic_read(v); + #elif defined(PLATFORM_WINDOWS) + return *v; // other choice???? + #endif +} + +inline void ATOMIC_ADD(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + atomic_add(i,v); + #elif defined(PLATFORM_WINDOWS) + InterlockedAdd(v,i); + #endif +} +inline void ATOMIC_SUB(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + atomic_sub(i,v); + #elif defined(PLATFORM_WINDOWS) + InterlockedAdd(v,-i); + #endif +} + +inline void ATOMIC_INC(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + atomic_inc(v); + #elif defined(PLATFORM_WINDOWS) + InterlockedIncrement(v); + #endif +} + +inline void ATOMIC_DEC(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + atomic_dec(v); + #elif defined(PLATFORM_WINDOWS) + InterlockedDecrement(v); + #endif +} + +inline int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + return atomic_add_return(i,v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedAdd(v,i); + #endif +} + +inline int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + return atomic_sub_return(i,v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedAdd(v,-i); + #endif +} + +inline int ATOMIC_INC_RETURN(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + return atomic_inc_return(v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedIncrement(v); + #endif +} + +inline int ATOMIC_DEC_RETURN(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + return atomic_dec_return(v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedDecrement(v); + #endif +} + + +#ifdef PLATFORM_LINUX +int openFile(struct file **fpp, char *path,int flag,int mode) +{ + struct file *fp; + + fp=filp_open(path, flag, mode); + if(IS_ERR(fp)) { + *fpp=NULL; + return PTR_ERR(fp); + } + else { + *fpp=fp; + return 0; + } +} + +int closeFile(struct file *fp) +{ + filp_close(fp,NULL); + return 0; +} + +int readFile(struct file *fp,char *buf,int len) +{ + int rlen=0, sum=0; + + if (!fp->f_op || !fp->f_op->read) + return -EPERM; + + while(sumf_op->read(fp,buf+sum,len-sum, &fp->f_pos); + if(rlen>0) + sum+=rlen; + else if(0 != rlen) + return rlen; + else + break; + } + + return sum; + +} + +int writeFile(struct file *fp,char *buf,int len) +{ + int wlen=0, sum=0; + + if (!fp->f_op || !fp->f_op->write) + return -EPERM; + + while(sumf_op->write(fp,buf+sum,len-sum, &fp->f_pos); + if(wlen>0) + sum+=wlen; + else if(0 != wlen) + return wlen; + else + break; + } + + return sum; + +} +#endif + +#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR +#ifdef PLATFORM_LINUX +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv) +{ + struct net_device *pnetdev; + struct rtw_netdev_priv_indicator *pnpi; + + pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); + if (!pnetdev) + goto RETURN; + + pnpi = netdev_priv(pnetdev); + pnpi->priv=old_priv; + pnpi->sizeof_priv=sizeof_priv; + +RETURN: + return pnetdev; +} + +struct net_device *rtw_alloc_etherdev(int sizeof_priv) +{ + struct net_device *pnetdev; + struct rtw_netdev_priv_indicator *pnpi; + + pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); + if (!pnetdev) + goto RETURN; + + pnpi = netdev_priv(pnetdev); + + pnpi->priv = rtw_zvmalloc(sizeof_priv); + if (!pnpi->priv) { + free_netdev(pnetdev); + pnetdev = NULL; + goto RETURN; + } + + pnpi->sizeof_priv=sizeof_priv; +RETURN: + return pnetdev; +} + +void rtw_free_netdev(struct net_device * netdev) +{ + struct rtw_netdev_priv_indicator *pnpi; + + if(!netdev) + goto RETURN; + + pnpi = netdev_priv(netdev); + + if(!pnpi->priv) + goto RETURN; + + rtw_vmfree(pnpi->priv, pnpi->sizeof_priv); + free_netdev(netdev); + +RETURN: + return; +} + +/* +* Jeff: this function should be called under ioctl (rtnl_lock is accquired) while +* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) +*/ +int rtw_change_ifname(_adapter *padapter, const char *ifname) +{ + struct net_device *pnetdev; + struct net_device *cur_pnetdev = padapter->pnetdev; + int ret; + + if(!padapter) + goto error; + + //free the old_pnetdev + if(padapter->old_pnetdev) { + free_netdev(padapter->old_pnetdev); + padapter->old_pnetdev = NULL; + } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) + if(!rtnl_is_locked()) + unregister_netdev(cur_pnetdev); + else +#endif + unregister_netdevice(cur_pnetdev); + + #ifdef CONFIG_PROC_DEBUG + rtw_proc_remove_one(cur_pnetdev); + #endif //CONFIG_PROC_DEBUG + + padapter->old_pnetdev=cur_pnetdev; + + pnetdev = rtw_init_netdev(padapter); + if (!pnetdev) { + ret = -1; + goto error; + } + +#ifdef CONFIG_USB_HCI + + SET_NETDEV_DEV(pnetdev, &padapter->dvobjpriv.pusbintf->dev); + + usb_set_intfdata(padapter->dvobjpriv.pusbintf, pnetdev); + +#elif defined(CONFIG_PCI_HCI) + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) + SET_NETDEV_DEV(pnetdev, &padapter->dvobjpriv.ppcidev->dev); +#endif + + pci_set_drvdata(padapter->dvobjpriv.ppcidev, pnetdev); + +#endif + + rtw_init_netdev_name(pnetdev, ifname); + + _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) + if(!rtnl_is_locked()) + ret = register_netdev(pnetdev); + else +#endif + ret = register_netdevice(pnetdev); + + if ( ret != 0) { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n")); + goto error; + } + + #ifdef CONFIG_PROC_DEBUG + rtw_proc_init_one(pnetdev); + #endif //CONFIG_PROC_DEBUG + + return 0; + +error: + + return -1; + +} +#endif +#endif //MEM_ALLOC_REFINE_ADAPTOR + +u64 rtw_modular64(u64 x, u64 y) +{ +#ifdef PLATFORM_LINUX + return do_div(x, y); +#elif defined(PLATFORM_WINDOWS) + return (x % y); +#endif +} + +u64 rtw_division64(u64 x, u64 y) +{ +#ifdef PLATFORM_LINUX + do_div(x, y); + return x; +#elif defined(PLATFORM_WINDOWS) + return (x / y); +#endif +} + From 53b803632c4acf8f9e983c04618bc040f00ac5f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Thu, 22 Sep 2011 15:23:21 +0800 Subject: [PATCH 140/150] delete the none used files of rtl8188cu driver --- drivers/net/wireless/rtl8192c/rtl8192c.uu | 11415 ---------------- drivers/net/wireless/rtl8192c/wifi_power.c | 112 - drivers/net/wireless/rtl8192c/wifi_power.h | 87 - .../net/wireless/rtl8192c/wifi_power_ops.c | 112 - .../net/wireless/rtl8192c/wifi_power_usb.c | 118 - drivers/net/wireless/rtl8192c/wifi_version.h | 13 - 6 files changed, 11857 deletions(-) delete mode 100644 drivers/net/wireless/rtl8192c/rtl8192c.uu delete mode 100644 drivers/net/wireless/rtl8192c/wifi_power.c delete mode 100644 drivers/net/wireless/rtl8192c/wifi_power.h delete mode 100644 drivers/net/wireless/rtl8192c/wifi_power_ops.c delete mode 100644 drivers/net/wireless/rtl8192c/wifi_power_usb.c delete mode 100755 drivers/net/wireless/rtl8192c/wifi_version.h diff --git a/drivers/net/wireless/rtl8192c/rtl8192c.uu b/drivers/net/wireless/rtl8192c/rtl8192c.uu deleted file mode 100644 index 2bbd985e5b69..000000000000 --- a/drivers/net/wireless/rtl8192c/rtl8192c.uu +++ /dev/null @@ -1,11415 +0,0 @@ -begin 644 rtl8192cu.o -M?T5,1@$!`0````````````$`*``!```````````````(C04`````!30````` -M`"@`%P`4`![_+^$>_R_A!$`MY40PD.6R(@/C`B#3YP``4N,,```*["T"XP(@ -MT^<``%+C"```&K`@T>$Y`%+C!0``&@0@D>4`0)+E!`!4XP!`H!,!0*`#```` -MZ@!`H..=)0/C`C#3YP,PE.$``*`#`@``"D``T.4``%#B`0"@$Q``O>@>_R_A -M.#"0Y0$P@^(X,(#E'O\OX03@+>4,T$WB"""-X@$08N4M$*#C%#4#XP_@H.$# -M\)#G#-"-X@"`O>AP0"WI`&"@X0!04>(-```*_O__ZPTPH.%_3(&$*#A_O__ZP0PE.4!,$/B!#"$Y?[__^L!`*#C<("] -MZ!!`+>D!0*#A`P"1Z?[__^L$`*#A'!"@X_[__^L0@+WH$$`MZ0%`H.$#`)'I -M_O__ZP0`H.$<$*#C_O__ZQ"`O>@00"WI`$"@X;`PT.$.`%/C$`!3$P(```H$ -M`)#E"!"4Y?[__^L,`)3E``!0XP,```H0$)3E``!1XP````K^___K!`"@X1P0 -MH./^___K$("]Z!!`+>D!`*#A_O__ZQ"`O>CP02WI`$"@X0%0H.$,<)'E5PV` -MXA@`@.($$)'E_O__ZP!@4.+P@;T(`##7Y=@PAN74,(;E_O__ZPT@H.%_/<+C -M/S##XP0@D^4!((+B!""#Y6PPE.4!"!/C`@``"H``$^.`,,,3;#"$%6PPE.4! -M,(/C;#"$Y0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L%`*#A_O__Z_"! -MO>@00"WI`4"@X5<-@.(8`(#B#!"1Y?[__^L$`*#A_O__ZQ"`O>CP02WI`$"@ -MX0%PH.$$8)'E`C#1Y0``4^,%```*`#``XP`P0.,`$)/E10Z`X@P`@.+^___K -M10Z$X@P`@.+^___K_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y6PPE.40 -M`!/C#P``"E==A.(84(7B!&"&X@4`H.$&$*#A_O__ZP``4.,$```:!0"@X080 -MH.'^___K``!0XQ\```H$`*#A_O__ZQP``.IL`(3B_O__ZP"`4.(&```:A`"$ -MXO[__^L`@%#B%```"O[__^L0`(CE`@``Z@@`H.&$$(3B_O__ZWA0EN5X4(7B -M`%"&Y1P`B.(&$*#A!2"@X?[__^MX();EW`"$X@80H.%X((+B_O__ZVPPE.6` -M,,/C;#"$Y0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L'`*#A_O__Z_"! -MO>@00"WI`4"@X0(PT>4``%/C!0``"@`P`.,`,$#C`!"3Y44.@.(,`(#B_O__ -MZP0`H.'^___K$("]Z!!`+>D`0*#A`C#1Y0``4^,.```*_O__ZPT@H.%_/<+C -M/S##XP0@D^4!((+B!""#Y6P@E.4!((+C;""$Y00@D^4!($+B!""#Y?[__^L0 -M@+WH`0"@X?[__^L0@+WH<$`MZ0!0H.$!0*#A`C#1Y0``4^,1```*_O__ZPT@ -MH.%_/<+C/S##XP0@D^4!((+B!""#Y6PPE>4""Q/C`CLC$FPPA14-(*#A?SW" -MXS\PP^,$()/E`2!"X@0@@^7^___K!`"@X?[__^MP@+WH$$`MZ?[__^L0@+WH -M,$`MZ0S03>(`0*#A;#"0Y4``$^,H```:(``3XR8``!H$`%'C`?&?ER,``.KX -M!`````4```@%```T!0``8`4``/[__^L<``#J_O__ZQH``.H(((WB`3"@XP$P -M8N4`$*#C5S(#XP,0P.(`,*#C`3!E -MY?[__^L$`*#A)!"@XP4@H.$4-0/C#^"@X0/PE.<$``#J_O__ZUPR`^,#`(3G -M!`"@X?[__^L,T(WB,("]Z/!'+>D`0*#A?#4#XP,PD.<``%/C````"C/_+^%L -M,)3E(@T3XT0``!H$`*#A_O__ZVPPE.4!`!/C+P``"@@UE.5D`%/C!0``B@0E -ME.5D`%+C`&"@DP9PH)$&H*"1#```F@0EE.4"`%/A`6"@@P!PH(,&H*"!!@`` -MB@(`4^$`8*`S`7"@,P>@H#$`8*`C!G"@(0&@H"/Z#E/C!```B@0EE.7Z#E+C -M`%"@DP6`H)$%``":B",!XP(`4^$`4*"3`8"@DP%0H(,%@*"!##64Y00EE.4" -M((/@"`!2XP0``(H"`%/C`@``B@0`H.'^___K"0``Z@0`H.'^___K!@``Z@0` -MH.'^___K`%"@XP6`H.$%8*#A!7"@X06@H.$`,*#C"#6$Y00UA.4,-83E$*7$ -MY1%UQ.429<3E$X7$Y115Q.4$`*#A$#4#XP_@H.$#\)3G\(>]Z/!'+>D`8*#A -M`$!1X@0`H`/PA[T(`#"4Y0$P0^((`%/C`_&?ESP``.H8!P``Z`<``.@'```L -M!P``0`<``%`'``#H!P``Z`<``&`'```&`*#A"!"4Y00@E.7^___K+@``Z@8` -MH.$($)3E!""4Y?[__^LI``#J!@"@X000U.7^___K)0``Z@8`H.$$$-3E_O__ -MZR$``.H&`*#A_O__ZP!04.(=```*S#"5Y0``4^,:```:`%"@XQ2$`.,`?P_C -M_W!`XV2@H.,$``#J"@"@X?[__^L!4(7B"P!5XP\```H&`*#A"!"@X?[__^L' -M`!#A]?__&@H`5>,(``#*GC,"``#:_O__ZP``H./PA[WH``"@ -MX_"'O>AP0"WI`&"@X0!04>(`0*`##@``"@40H.'^___K`$!0X@(``!H%`*#A -M_O__ZP<``.H8`(;B!1"@X?[__^L`0*#A`0!0XP$``!H&`*#A_O__ZP0`H.%P -M@+WH\$$MZ0"`H.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,=```*#`"@X_[_ -M_^L`8*#A`'"@X0``4.,$```:!0"@X1P0H./^___K`$"@XQ(``.H),*#C`#"` -MY0!0H.,$4(#E"%"`Y10`A.+^___K.3"@X[`PQ.$$8(3E##"@XP@PA.4,4(3E -M$%"$Y4L-B.((`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP02WI`'"@X1P`H./^ -M___K`$"@X0!@H.$``%#C'P``"@P`H./^___K`%"@X0"`H.$``%#C!```&@0` -MH.$<$*#C_O__ZP!`H.,4``#J!#"@XP`P@.4`0*#C"$"`Y40`G^5$$)_E_O__ -MZQ0`AN+^___K.3"@X[`PQN$$4(;E##"@XP@PAN4,0(;E$$"&Y4L-A^((`(#B -M!A"@X?[__^MP0._F!`"@X?"!O>@``````````/!%+>D,T$WB`$"@X0%PH.$" -M8*#A"""-X@`PH.,!,&+E`1"@XQPU`^,/X*#A`_"0YP=0W>4``%7C`4"@`RH` -M``H!`%;C)```&AP`H./^___K`&"@X0!0H.$``%#C`$"@`R$```H,`*#C_O__ -MZP"`H.$`H*#A``!0XP0``!H&`*#A'!"@X_[__^L`0*#C%@``Z@8PH..(`(#H -M`&"@XPA@@.44`(7B_O__ZSDPH..P,,7A!("%Y0PPH.,(,(7E#&"%Y1!@A>5+ -M#83B"`"`X@40H.'^___K<$#OY@,``.H$`*#A!Q"@X?[__^L!0*#C!`"@X0S0 -MC>+PA;WH\$]Z/!!+>D`@*#A`7"@X1P`H./^___K`&"@X0!`H.$``%#C`$"@ -M`Q@```H!`*#C_O__ZP!04.($```:!@"@X1P0H./^___K`$"@XP\``.H`<,7E -M%`"$XO[__^L[,*#CL##$X010A.4!,*#C"#"$Y0`PH.,,,(3E$#"$Y4L-B.(( -M`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP02WI`("@X1P`H./^___K`%"@X0!` -MH.$``%#C`$"@`QT```H,`*#C_O__ZP!@H.$`<*#A``!0XP0``!H%`*#A'!"@ -MX_[__^L`0*#C$@``Z@$PH.,`,(#E`%"@XP10@.4(4(#E%`"$XO[__^LY,*#C -ML##$X01@A.4,,*#C"#"$Y0Q0A.404(3E2PV(X@@`@.($$*#A_O__ZW!`[^8$ -M`*#A\(&]Z/!'+>D`H*#A`7"@X0*`H.$<`*#C_O__ZP!0H.$`0*#A``!0XP!` -MH`,=```*#`"@X_[__^L`8*#A`)"@X0``4.,$```:!0"@X1P0H./^___K`$"@ -MXQ(``.H$<(#D"!"@X08@H./^___K%`"$XO[__^LM,*#CL##$X01@A.4,,*#C -M"#"$Y0`PH.,,,(3E$#"$Y4L-BN((`(#B!!"@X?[__^MP0._F!`"@X?"'O>CP -M1RWI`("@X0%PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,F```*!@"@X_[_ -M_^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,=``#J!`"@X_[__^L`H%#B!P`` -M&@4`H.$<$*#C_O__ZP8`H.$&$*#C_O__ZP!`H.,1``#J%`"$XO[__^L6,*#C -ML##$X01@A.4&(*#C"""$Y0R@A.4$,*#C$#"$Y08`H.$'$*#A_O__ZTL-B.(( -M`(#B!!"@X?[__^MP0._F!`"@X?"'O>CP1RWI`("@X0%PH.$<`*#C_O__ZP!0 -MH.$`0*#A``!0XP!`H`,;```*!`"@X_[__^L`8*#A`*"@X0``4.,$```:!0"@ -MX1P0H./^___K`$"@XQ```.H4`(3B_O__ZR(,$('B$""@X_[__^L!(*#C -M`3L!XP,@Q>=+#87B"`"`X@00H.'^___K<$#OY@0`H.'PA[WH\$$MZ0"`H.$! -M<*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#&```"@0`H./^___K`&!0X@0` -M`!H%`*#A'!"@X_[__^L`0*#C#P``ZA0`A.+^___K$3"@X[`PQ.$$8(3E!#"@ -MXP@PA.4`,*#C##"$Y1`PA.4`<,;E2PV(X@@`@.($$*#A_O__ZW!`[^8$`*#A -M\(&]Z/!!+>D`<*#A'`"@X_[__^L`8*#A`$"@X0``4.,`0*`#%P``"@0`H./^ -M___K`%!0X@0``!H&`*#A'!"@X_[__^L`0*#C#@``ZA0`A.+^___K#S"@X[`P -MQ.$$4(3E!#"@XP@PA.4`,*#C##"$Y1`PA.5+#8?B"`"`X@00H.'^___K<$#O -MY@0`H.'P@;WH\$(`0*#A`5"@X7Q@D>6L-`/C`S"0YP``4^,!```* -M"!"@XS/_+^$<`*#C_O__ZP!PH.$``%#C`$"@`X\```IL,)3E*``3XP8``!H` -M`%;C(#"#`VPPA`4"```*`0!6XP@P@P-L,(0%&VR$XAA@AN(``%;C`P``&AP0 -MH./^___K`$"@XWT``.H&`*#A`!"@X]\OH./^___KE""5Y08`H.$<$(7B>""" -MXO[__^N0.P'C`R"4YP@T`N,#(,3G#"!"XOX`4N,%``"*"0N$X@D`@.)N'83B -M(!"!XO[__^L%``#J"0N$X@D`@.)N'83B(!"!XO\@H./^___K`""@XY`[`>,# -M((3GC#24Y0(`4^$#```:N`"$XB`0A>(&(*#C_O__ZYB@A>)NC83B%("(X@0` -MH.$*$*#A"""@X90PE>7^___KD#L!XP,`A.<`,*#CQ#2$Y5HZ`N,#,-3G``!3 -MXP\```J4,)7E``"-Y00`H.$*$*#A"""@X?[__^L`D*#AD#L!XP,PE.<``%/A -MD#L!$P,`A!5N+83B$"""X@`@ -MC>4$`*#A"A"@X0@@H.'^___KD#L!XP,@E.<(-0+C`R#$Y_X`4N,%``"*)0R$ -MX@D`@.)N'83B%!"!XO[__^L%``#J)0R$X@D`@.)N'83B%!"!XO\@H./^___K -MD#L!XP,PE.=X,(/B"#"'Y10`A^+^___K#C"@X[`PQ^$$8(?E`#"@XPPPA^40 -M,(?E2PV$X@@`@.('$*#A_O__ZW!`[^8$`*#A"-"-XO"'O>CP02WI`'"@X0%0 -MH.$"8*#A'`"@X_[__^L`0%#B`$"@`PP```H4`(3B_O__ZQ`PH..P,,3A8`"$ -MZ0`PH.,,,(3E$#"$Y4L-A^((`(#B!!"@X?[__^MP0._F!`"@X?"!O>AP0"WI -M`%"@X:PT`^,#,)#G``!3XP$```H($*#C,_\OX1P`H./^___K`$!0X@!`H`,4 -M```*%`"$XO[__^L0,*#CL##$X:D]A>(D,(/B!#"$Y=PZ`N,#8)7G>&"&X@A@ -MA.4`,*#C##"$Y1`PA.5D.@+C`V"%YTL-A>((`(#B!!"@X?[__^MP0._F!`"@ -MX7"`O>CP1RWI`*"@X0&`H.$"<*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`# -M%P``"@$`H./^___K`&!0X@0``!H%`*#A'!"@X_[__^L`0*#C#@``ZA0`A.+^ -M___K!#"@X[`PQ.$$8(3E`2"@XP@@A.4,<(3E$#"$Y0"`QN5+#8KB"`"`X@00 -MH.'^___K<$#OY@0`H.'PA[WH\$]Z/!' -M+>D`H*#A`8"@X0)PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,7```*`0"@ -MX_[__^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,.``#J%`"$XO[__^L",*#C -ML##$X01@A.4!,*#C"#"$Y0QPA.40,(3E`(#&Y4L-BN((`(#B!!"@X?[__^MP -M0._F!`"@X?"'O>CP1RWI`*"@X0%PH.$"@*#A'`"@X_[__^L`4*#A`$"@X0`` -M4.,`0*`#&0``"@(`H./^___K`&!0X@0``!H%`*#A'!"@X_[__^L`0*#C$``` -MZA0`A.+^___K`S"@X[`PQ.$$8(3E`C"@XP@PA.4`,*#C##"$Y1`PA.4`<,;E -M`8#&Y4L-BN((`(#B!!"@X?[__^MP0._F!`"@X?"'O>CP1RWI`*"@X0%PH.$" -M@*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#&0``"@(`H./^___K`&!0X@0` -M`!H%`*#A'!"@X_[__^L`0*#C$```ZA0`A.+^___K'S"@X[`PQ.$$8(3E`C"@ -MXP@PA.4`,*#C##"$Y1`PA.4!<,;E`(#&Y4L-BN((`(#B!!"@X?[__^MP0._F -M!`"@X?"'O>CP02WI`("@X0%PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,: -M```*#0"@X_[__^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,1``#J%`"$XO[_ -M_^L9,*#CL##$X01@A.4-(*#C"""$Y0`PH.,,,(3E$#"$Y08`H.$'$*#A_O__ -MZTL-B.((`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP02WI`("@X0%PH.$<`*#C -M_O__ZP!0H.$`0*#A``!0XP!`H`,=```*#@"@X_[__^L`8%#B!```&@4`H.$< -M$*#C_O__ZP!`H.,4``#J%`"$XO[__^L;,*#CL##$X01@A.4.,*#C"#"$Y0`P -MH.,,,(3E$#"$Y08`H.$%,*#C`3#`Y`<0H.$-(*#C_O__ZTL-B.((`(#B!!"@ -MX?[__^MP0._F!`"@X?"!O>CP1RWI`$"@X0&@H.%L,)#E`0`3XP(```H`$*#C -M`2"@X_[__^L<`*#C_O__ZP!PH.$`4*#A``!0XP!0H`-(```*,`"@X_[__^L` -M@*#A`&"@X0``4.,$```:!P"@X1P0H./^___K`%"@XST``.H$`*#A`!"@X_[_ -M_^L4`(7B_O__ZQ(PH..P,,7A!("%Y3`PH.,(,(7E`!"@XPP0A>40$(7E!#"( -MY4HUU.4`,(CE"!"(Y0QPB.('`*#A(2"@X_[__^L``%KC!P``"@`@FN4``%+C -M!```"@<`H.$$$(KB_O__ZP`PFN4(,(CE;#"4Y0([@^-L,(3E2PV$X@@`@.(% -M$*#A_O__ZW!0[^8!`%7C$0``&O[__^O`!(3E`#``XP`P0.,`$)/E20Z$XC(> -M@>+^___KK#0#XP,PE.<``%/C`@``"@0`H.$&$*#C,_\OX1XPH.-8-(3E`@`` -MZFPPE.4".\/C;#"$Y04`H.'PA[WH\$D4T$WB`$"@X4M]@.((<(?B````XP``0.,`$`#C`!!`X_[__^L/`*#C_O__ -MZ^PR`>,#,)3G"#"-Y0$@H.,(,P'C`R#$YP>`H.$-(*#A?RW"XS\@PN,$((WE -M#""-Y8BE`^.,E0/C_+(!XP10H.$(`*#A_O__ZP``4.--```*!0"@X?[__^L! -M`%#C]___&@HPE>4$$);E -M!""@X?[__^NP,-;A/`!3XQH``(H`(`#C`"!`XX,Q@N`$0)/E``!4XP,```H% -M`*#A"!"=Y33_+^$"`,;EL##6X0`@`.,`($#C@S&"X.1!D^4``%3C`@``&@8` -MH.'^___K`@``Z@4`H.$&$*#A-/\OX>@B`>,",-7G`3"#X@(PQ><$()WE##"2 -MY00PD^4`,)/E`0`3X[G__PH,,)WE#`"3Y?[__^NU___J!4"@X0(``.H%0*#A -M````Z@5`H.$`(*#C"#,!XP,@Q.<$4*#A!P"@X?[__^L`0%#B`@``"@0`H.'^ -M___K^/__ZDL-A>(4`(#B_O__ZP``H.,`$*#A_O__ZQ!`+>D`0%#B$("]""`` -MA.+^___K!`"@X?[__^L,`(3B_O__ZR@`E.4``%#C`0``"@8@00"WI_O__ZQ"`O>@00"WI`$"@X0`0H./^ -M___K#`"$X@`0H./^___K&`"$XO[__^L!,*#C(##$Y08,H./^___K*`"$Y0`` -M4.,2```*?P^`X@,`@.*@!*#A@`2@X20`A.6!#Z#C_O__ZS``A.4``%#C"``` -M"@,`@.(#`,#C+`"$Y0`PH.,\,(3E.#"$Y30PA.4!0*#C````Z@!`H.,$`*#A -M$("]Z!!`+>G^___K$("]Z/`%+>D`0*#C`$"`Y01`@.4`,*#A`,"@X0A`S.4! -M0(3B`<",X@$,5./Z__\:`:R#X@!0H.,%0*#A"("@XPA@T^4&4(7@!,#1YPQ0 -MA>#_4`7B!<"`X`C`C.``<-SE`&#,Y0APP^4!0(3B`@!4X0!`H",!,(/B"@!3 -MX>___QKP!;WH'O\OX?`/+>D!L*#A``!3XQD```H`0*#C","@XP20TN<`4)#E -M`5"%XO]0!>(%@(#@#("(X``0V.4$8)#E!F"!X/]@!N(&H(#@#*"*X`!PVN5@ -M`(#H`!#*Y0!PR.4!$(?@<1#@Y@P0T>@>_R_AH!"@X0@0`>*`$X'AH#&@X:`3@>$$,`/BH"*@X0,P@>$"(`+B@!*@ -MX0(P@^%`$`'B@"&@X0$P@^$@(`+B@`"@X0(P@^$0``#B``"#X7``[^8>_R_A -M\$\MZ1303>(`L*#A!!"-Y0`P`.,`,$#C`$"3Y0``5.,D```:Y%"?Y0!@H.,( -MD*#CMWT!X\%T0.-V`._FVO__ZP`,H.$)0*#A``!0XX``)["``*"A`4!4XOK_ -M_QH@2*#A((2@X0"@H.$@#*#ASO__ZP``Q>5T`._FR___ZP$`Q>5X`._FR/__ -MZP(`Q>5Z`._FQ?__ZP,`Q>4!8(;B!%"%X@$,5N/C__\:`#``XP`P0.,!(*#C -M`""#Y00PG>4``%/C`$#@TPX``-H$P)WE`#"@XP!`X.,```#C``!`XP00H.,# -M(-OG`B`DX/\@`N("(8#@`2"2YR1$(N`!,(/B#`!3X?;__QH$`.#A%-"-XO"/ -MO>@$````,``MZ0!0H.,%0*#A!"#0YX0QH.$24X7A`4"$X@0`5./Y__\:!0"@ -MX3``O>@>_R_A,``MZ0`0P.4`0*#A(52@X0%0Y.4A6*#A`5#DY2$D` -M0*#A`5"@X0$`H.';___K``"$Y00`A>+8___K!`"$Y00`H.'L___K<("]Z`1` -M+>44,)#E@\&@X1`@D.41+(+A$""`Y0$P@^(4,(#E`P!3XQ4``)H(P)#E#"`B -MX`Q`D.7B1R3@`B"$X/\TPN/_/,/C_QC"X_\0P>,A%*#A`S2!X00P(^`"((/@ -MXCXCX`(@@^!B,2/@##"`Y0(@@^`(((#E`#"@XQ`P@.44,(#E$`"]Z![_+^'P -M02WI`'"@X0%@H.$`4%+B\(&]"`!`H.,'`*#A!!#6Y_[__^L!0(3B!0!4X?G_ -M_QKP@;WH<$`MZ0!`H.$!8*#A6A"@X_[__^L$`*#A`!"@X_[__^L$`*#A`!"@ -MX_[__^L$`*#A`!"@X_[__^L$`*#A`!"@X_[__^L4,)3E``!3XP8```H`4*#C -M!`"@X040H.'^___K%#"4Y0``4^/Y__\:!@"@X0@0E.63___K!`"&X@P0E.60 -M___K!`"@X9G__^MP@+WH\$`MZ2303>(`P*#A`4"@X0)@H.$#<*#A/%#=Y0`P -MH.,$,,WE!3#-Y08PS>4',,WE"`"-X@P0H.'^___K!%#-Y010H.$!,/7E`0`3 -MXQ````H(`(WB$!"$X@8@H./^___K`##5Y0(`$^,$```*"`"-XA@0A.(&(*#C -M_O__ZQ0``.H(`(WB"A"$X@8@H./^___K#P``Z@@`C>($$(3B!B"@X_[__^L` -M,-7E`@`3XP0```H(`(WB$!"$X@8@H./^___K`P``Z@@`C>(*$(3B!B"@X_[_ -M_^L(0(WB!`"@X000C>($(*#C_O__ZP0`H.$&$*#A!R"@X?[__^L$`*#A.!"= -MY?[__^LDT(WB\("]Z/`/+>D(T$WBL##`X0"@H.$C.*#ALC#JX0"`H.$!P-+E -M`##2Y0PT@^&T,.CA`'"@X0/`TN4",-+E##2#X;8PY^$`P*#A!4#2Y00PTN4$ -M-(/AN##LX0!`H.,`,`#C`#!`X[!0W.$!(`3B@I"@X0E@@>`$8(WE`Y0&0 -MB>()D('@`)"-Y0"PV>4+M*#A!9`FX`N0*>`IE*#A`9R)XHF0@^`%8";@=F#O -MYH9@@^"P4-GALX090)>"P8-#A!E"%X'50_^:P4,#A`I""XHF0H.$!8*#A -M"9#VYP%@UN4&9*#A"6`FX`5@)N`F9*#A`6R&XH9@@^`%D"G@>9#OYHF0@^"P -M4-;AL X090)>"P8-KA!E"%X'50_^:P4,KA!)""XHF0H.$!8*#A"9#VYP%@ -MUN4&9*#A"6`FX`5@)N`F9*#A`6R&XH9@@^`%D"G@>9#OYHF0@^"P4-;AL -MX090)>"P8-CA!E"%X'50_^:P4,CA!B""XH(@H.$!8*#A`B#VYP%@UN4&9*#A -M`F`FX`5@)N`F9*#A`6R&XH9@@^`%4"+@=5#OYH50@^"P(-;AL%#5X04@(N"P -M4-?A!2""X'(@_^:P(,?A!)"=Y0!0V>4`L)WE`&#;Y09DH.&PD-SA!6`FX`)@ -M)N`F9*#A`6R&XH9@@^`"4"7@=5#OYH50@^"P(-;ALX0E0A.`&("+@`B"% -MX+`@S.$!0(3B"`!4XX___QH(T(WB\`^]Z![_+^'P#RWI$-!-X@#`H.,$0(WB -MO%"2X;Q0A.$"P(SB"@!&P0-3A!'`GX+1`W>$$0(?@='#_Y@)`T>4#4-'E!52@X010)>`'4"7@)52@ -MX0%*%4(+@!T`DX'1`[^:$0(+@L(#5X;!`U.$$@"C@MD#=X01`B.!T@/_F -M!$#1Y050T>4%5*#A!%`EX`A0)>`E5*#A`5R%XH50@N`(0"3@=$#OYH1`@N"P -MH-7AL$#4X02@*N"X0-WA!$"*X'2@_^8&0-'E!U#1Y054H.$$4"7@"E`EX"54 -MH.$!7(7BA5""X`I`).!T0._FA$""X+"0U>&P0-3A!)`IX+I`W>$$0(G@=)#_ -MY@A`T>4)4-'E!52@X010)>`)4"7@)52@X0%*%4(+@";`DX'NP[^:+L(+@ -ML$#5X;!0V^$%4"3@O$#=X01`A>!T4/_F"K#1Y0M`T>4$1*#A"T`DX`5`).`D -M1*#A`4R$XH1`@N`%L"O@>[#OYHNP@N"P(-3AL$#;X00@(N`"8(;@=F#_Y@U` -MT>4,(-'E!"2"X08@(N""1Z#AHB"$X0)PA^!W(/_FM"#-X0]PT>4.0-'E!W2$ -MX0)P)^"')Z#AIW""X0>`B.!X@/_FMH#-X:@@H.&(AR+@"*"*X'J@_^:XH,WA -MJB"@X8JG(N`*D(G@>9#_YKJ0S>&I(*#AB9!U4/_FO%#-X:4@H.&% -M5R+@!6"&X'9@_^:^8,WA(R2@X0`@P.5?(`+B("""XP$@P.4",,#E`"#4"-(/A!F`CX,9@H.$#8,#E`#"@XP00C>*S()'A!"#`Y2(DH.$%(,#E`C"# -MX@(`@.(,`%/C]___&A#0C>+P#[WH'O\OX01`+>4`0*#C!,#1YP0PT.<#,"S@ -M!##"YP%`A.(0`%3C^/__&A``O>@>_R_A!$`MY0!`H.,$P-'G!##0YP,P+.`$ -M,,+G`4"$X@0`5./X__\:$`"]Z![_+^$`,`#C`#!`XP`P@^``!-/E'O\OX7!` -M+>D0T$WB`$"@X0%0H.$-,*#AH""?Y0<`DN@'`(/H#0#4Y?#__^L,`,WE#@#4 -MY>W__^L-`,WE#P#4Y>K__^L.`,WE!&"@X0P`]N7F___K#P#-Y1`PC>(%4(/@ -M$%!5Y00`H.$,$(WB!""@X=/__^L`,-3E`S`EX`10H.$$,,7D!0"@X000H.$% -M(*#AR___ZPA`A.($`*#A!1"@X00@H.'&___K!@"@X000H.$&(*#APO__ZQ#0 -MC>)P@+WH#`4``'!`+>D`4*#A`6"@X0!`H.,$`-7GQ/__ZP0`QN4%,-#E`3#!Y0HPT.4",,'E#S#0Y0,PP>4$,-#E -M!##!Y0DPT.4%,,'E#C#0Y08PP>4#,-#E!S#!Y0@PT.4(,,'E#3#0Y0DPP>4" -M,-#E"C#!Y04!,-#E#3#!Y08PT.4.,,'E"S#0Y0\P -MP>4>_R_A\$`MZ2303>(`0*#A`7"@X0!0H.,<$(WB!0"@X1O`H./5()3A``!2 -MXP7`P;<%`,&G`5"%X@0`5>/X__\:`B#4Y1`@S>4#,-3E$3#-Y000H.$!`-'D -M$@#-Y0`0T>43$,WE%##-Y14`S>46$,WE%R#-Y7\``.(,`,WE?Q`!X@T0S>5_ -M(`+B#B#-Y7\P`^(/,,WE`R"@XP)0H.$,,(WB!1#3YX$0H.%Q$._F!1##YP%0 -M1>+5`)/A``!0XP$0@;,"$,.W`2!"X@``5>/S__\:#%#=Y850H.$,4,WE&%"- -MXAP`C>(,$(WB!2"@X5C__^L(8(WB!`"@X040H.$&(*#A4___ZP@PW>4$,,WE -M"4#=Y0A`S>4*0-WE"4#-Y0M`W>4*0,WE"S#-Y01`C>(%`*#A!A"@X00@H.%% -M___K#5"@X1``C>(4$(WB#2"@X4#__^L$`*#A#1"@X0<@H.$\___K)-"-XO"` -MO>CP3RWI3-!-XA00C>4"@*#A`$"@XQ@@C>($,-#G!##"YP%`A.(0`%3C^O__ -M&@%@H.,`0*#C.'"-XBB0C>($L(GB!#"'X@`PC>4(,(GB!#"-Y0@PA^((,(WE -M##")X@PPC>4,,(?B$#"-Y1B@C>($4*#A`0``Z@%0A>(!8(;B!4"@X0``5>,' -M```:"@"@X100G>4((*#A"?__ZPH`H.$`$*#C(?__Z_+__^H*`%7C#```&CA0 -MC>((`*#A!1"@X4K__^LH0(WB!0"@X000H.%1___K!`"@X1@0C>(((*#A]_[_ -MZQD``.H(`*#A!Q"@X3[__^L'`*#A"1"@X4;__^L)`*#A!Q"@X63__^L+`*#A -M`!"=Y6'__^L#`)WI7___ZPP`G>40$)WE7/__ZP<`H.$*$*#A"""@X>'^_^L* -M`*#A!1"@X?G^_^L*`%;CR?__VDS0C>+PC[WH\``MZ1!0G>44P)WE64"@XP!` -MP.4"<*#A`&!1X@%@H!,``%+C``!1$QX@TQ4/(`(2`2#`%0``5^,`8*`3`6`& -M`@``5N,8(-,5#R`"$@$@P!4``%'C`""@`P$@P`4"0*#C"B#3Y00@P.@>_R_A`C!1XOT0@4(#$*!1012@X0`0P.4!,,#E`##2Y3`P -MP^,",,#E`3#2Y3@PP^,#,,#E!##2Y00PP.4%,-+E!3#`Y08PTN4&,,#E!S#2 -MY0D`0*#C!,"@X03`P.4!P,#E$L#1Y0+`P.43P-'E`\#`Y13` -MT>4$P,#E%<#1Y07`P.4`P*#C!L#`Y0?`P.4,<%+@`7"@$PP`4^$`P*`3`<`' -M`@``7.,)```*`5"@X0#`H.$`0*#C&Y0A@S.4!0(3B`5"%X@'`C.(&`%3C -M^/__&@`P4^(!,*`3``!2XP`@H!,!(`,"``!2XQ@@T14/(`(2""#`%0`@H!,) -M(,`5`P`7X0X```H!(*#A`#"@X0!`H.,8P-+E",##Y0%`A.(!((+B`3"#X@8` -M5./X__\:'C#1Y0\P`^(.,,#E`#"@XP\PP.7P`+WH'O\OX7``+>D,4)WE$&"= -MY0!`H.,$P*#A!,#`YP%`A.(0`%3C^___&@'`H.,`P,#E`,!2X@'`H!,``%'C -M``!2$QX@TQ4/(`(2`2#`%0``4>,`$*`3`1`,`@``4>,8(-,5#R`"$@$@P!4" -M0*#C"B#3Y00@P.<$(,#G`4"$X@$P -M0^(.`%3C^?__&O\PAN(``%;C!C"@H4,TH.$.,,#E#V#`Y7``O>@>_R_A!$`M -MY0!`H.,$P-'G!##0YP,P+.`$,,+G`4"$XA``5./X__\:$`"]Z![_+^$!(*#C -M`3L!XP,@P.<>_R_A\$\MZ4_?3>(`L*#A`6"@X6R0D>4``%GC>```"ATPT>4" -M`%/C=P``&EQ0D>4``%7C!0``&E<-@.(8`(#B1A"!XO[__^L`4%#B;```"D8P -MUN4!`!/C"#@!$P,PFQ<#,HL0!CN#$@PP@Q(`,(T5$5Z%`@!0C04HD(GB0""& -MX@0@C>4`H*#C60``ZK(QUN$#4(G@'H#6Y0.`B.`(@(G@`C#5Y1-`Q^<`,-7E -M$T3/YP0PU>432-?G!3#5Y1-,W^<&,-7E$W#'YP43=,_G)#B@X48/C>(& -M`)WH!SB#X9+\_^M*#XWB`!"=Y48OC>)T,/_F&/W_ZP&@BN(<,-;E`P!:X1D` -M`!JR,=;A&%"6Y0508^`>,-;E!5!CX!\PUN4%4&/@"`"@X040H.%Y^__K%`&- -MY0P`C>)*'XWB$""@XQ[[_^L,`(WB"!"@X0@@H.$%,*#A.OO_ZPP`C>(%$(C@ -M12^-X@0PH.,U^__K(```ZK(QUN$,)`'C`E";YP508^`>,-;E!5!CX!\PUN4% -M4&/@"`"@X040H.%>^__K%`&-Y0P`C>)*'XWB$""@XP/[_^L,`(WB"!"@X0@@ -MH.$%,*#A'_O_ZPP`C>(%$(C@12^-X@0PH.,:^__K#"0!XP(PF^<#D(G@`S`9 -MX@$PH!,ID8/@"9&@X1PPUN4#`%KAHO__N@$``.H`0*#C````Z@%`H.,$`*#A -M3]^-XO"/O>CP1RWI$]Y-X@!@H.$!0*#A<%"1Y30PT>4"`%/C`4"@$U<``!I$ -MH(3B5PV`XA@`@.(*$*#A_O__ZP!P4.)/```*2C#4Y0$`$^,1GH<"!0``"C@! -MG^7^___K5C#4Y0-BAN`&FX;B#)")XB@PE.4#8(7@+""4Y0-P@N`'<(7@:("4 -MY0B`8^`(@&+@`C#6Y0!`H.,30,?G`##6Y1-$S^<$,-;E$TC7YP4PUN433-_G -M!C#6Y0!0H.,34,?G!S#6Y1-4S^<1;HWB)#B@X08`H.$)$*#A"B"@X04X@^$- -M_/_K$EZ-X@4`H.$)$*#A!B"@X70P_^:2_/_K!$"-X@0`H.$%$*#A$""@XZ;Z -M_^L$`*#A!Q"@X0<@H.$(,*#APOK_ZP<`H.$$$$CB]/K_ZPP!C>4(,(?@`3!3 -MY2`,4^$0```:"#"'X`Y!W>4",%/E`P!4X0L``!H(,(?@#4'=Y0,P4^4#`%3A -M!@``&@APA^`,0=WE!#!7Y0,`5.$`0*`3`4"@`P```.H`0*#C!`"@X1/>C>+P -MA[WH*````/!/+>FLT$WB`+"@X1P0C>4(((WE(#"-Y;!`TN'\0`3BD`"-X@`0 -MH.,0(*#C_O__ZX``C>(`$*#C$""@X_[__^MP`(WB`!"@XQ`@H./^___K8`"- -MX@`0H.,0(*#C_O__ZU``C>(`$*#C$""@X_[__^M``(WB`!"@XQ`@H./^___K -M,`"-X@`0H.,0(*#C_O__ZQP`G>4:`%#C&`!0$P`@H!,!(*`#`2`BXG(@[^8D -M,J#A"#!#X@,`4^,`0*"#!@``BAP0G>4:`%'C`4"@`QPPG14",(,2'#"-%0%` -MH!,(,)WE'`"=Y0`0\^>@$,WE`1#3Y:$0S>4$$-/EHA#-Y040T^6C$,WE!A#3 -MY:00S>4',-/EI3#-Y11`C>40((WED$"-XB`0G>4`$(WEH#"-X@0PC>4$`*#A -M%!"=Y0@PG>7R_?_K@&"-X@8`H.$<$)WE"""=Y1?^_^MP<(WB!P"@X0@0G>40 -M()WE%#"=Y3;^_^L@()WE#R`"XB0@C>4@,)WE(S*@X0PPC>4<`)WE"`"`XA@` -MC>5`4(WB"P"@X000H.$%(*#AA/W_ZU!`C>(%`*#A!A"@X00@H.&7_O_K"P"@ -MX000H.$%(*#A>_W_ZP4`H.$'$*#A!""@X8_^_^L+`*#A!!"@X04@H.%S_?_K -M#!"=Y0``4>,84)T%%0``"@@@G>48,)WE`U""X`!`H.-`8(WB4'"-X@R`G>4& -M`*#A!1"@X0<@H.%\_O_K"P"@X0<0H.$&(*#A8/W_ZP%`A.(04(7B!`!8X?/_ -M_XH8`)WE#!"=Y0%2@.`D()WE``!2XQT```H`0*#C,""-X@0PH.$$,,+G`4"$ -MXA``5./[__\:`$"@XS`0C>((,)WE!2"#X`5@H.$D4)WE!##2YP0PP>)00(WB!@"@X3`0C>($(*#A5/[_ZPL`H.$$ -M$*#A!B"@X3C]_^L`0*#C*!"-XD`@C>($,-+G!##!YP%`A.((`%3C^O__&@!` -MH.,($)WE!5"!X"@@C>($,-+G!##%YP%`A.((`%3C^O__&AX``.H!@(CBH""- -MX@0!C>@*`*#A$!"=Y10@G>4(,)WE!_[_ZPL`H.$*$*#A"2"@X1K]_^L'8*#A -M"0"@X0<0H.$%(*#A+?[_ZP!`H.,$,-7G!##&YP%`A.(0`%3C^O__&A!PA^(, -M,)WE"`!3X>3__XH8`)WE`P*`X!@`C>4*``#J#!"=Y0``4>,'```*"""=Y1@P -MG>4#<(+@`("@XV"@C>)`D(WB4%"-XM7__^HD`)WE``!0XS$```J@,(WB`#"- -MY0P0G>4!,('B!#"-Y6``C>(0$)WE%""=Y0@PG>78_?_K`$"@XS`@C>($,*#A -M!##"YP%`A.(0`%3C^___&@!`H.,(()WE&`"=Y0`P@N`P$(WB)&"=Y0-0H.$$ -M(-/G!"#!YP%`A.(&`%3A^?__&D!`C>(+`*#A8!"-X@0@H.'7_/_K!`"@X3`0 -MC>)0((WBZ_W_ZP!`H.-0((WB)&"=Y00PTN<$,,7G`4"$X@8`5.'Z__\:&!"= -MY20@G>4"$('@&!"-Y:`PC>(`,(WE`$"@XP1`C>5@`(WB$!"=Y10@G>4(,)WE -MI_W_ZS`@C>($,*#A!##"YP%`A.(0`%3C^___&AP`G>4@$)WE`3"`X`@@G>4# -M,(+@`$"@XS`0C>(((-/E!"#!YP%`A.(!,(/B"`!4X_G__QI`0(WB"P"@X6`0 -MC>($(*#AIOS_ZP0`H.$P$(WB4""-XKK]_^L`0*#C"#"=Y1@`G>4`$(/@4""- -MX@0PTN<$,,'G`4"$X@@`5./Z__\:`0"@XZS0C>+PC[WH\$,=``#J`5"%X@4`4^$*```:LA'4X1C`E.4,P&'@'C#4 -MY0S`8^`?,-3E"@"@X0@@H.$,,&/@?/[_ZP\``.JR$=3A!\"6YPS`8>`>,-3E -M#,!CX!\PU.4*`*#A"""@X0PP8^!Q_O_K!S"6YP.`B.`#,!CB`3"@$RB!@^`( -M@:#A'##4Y0,`5>'>__^Z`0``Z@!`H.,```#J`4"@XP0`H.'PA[WH\$\MZ;30 -M3>(4`(WE)!"-Y0*PH.$L,(WEL$#2X?Q`!.*8`(WB`!"@XQ`@H./^___KB`"- -MX@`0H.,0(*#C_O__ZW@`C>(`$*#C$""@X_[__^MH`(WB`!"@XQ`@H./^___K -M6`"-X@`0H.,0(*#C_O__ZT@`C>(`$*#C$""@X_[__^LX`(WB`!"@XQ`@H./^ -M___K+!"=Y0@00>(H$(WE(2*@X1`@C>4/,`'B(#"-Y0LPH.$D$)WE`2#SYZ@@ -MS>4!(-/EJ2#-Y00@T^6J(,WE!2#3Y:L@S>4&(-/EK"#-Y04:`%/C`1"@`PP0C04D()T5`B""$B0@C14!,*`3##"-%200G>4( -M$('B'!"-Y1`@G>4``%+C`5"@`2(```H<,)WE`W"+X`"`H.-HH(WB2)"-XEA0 -MC>(!@(CBJ!"-X@(!C>@*`*#A&!"=Y0P@G>4+,*#AU?S_ZQ0`G>4*$*#A"2"@ -MX>C[_^L'8*#A"0"@X0<0H.$%(*#A^_S_ZP!`H.,$,-7G!##&YP%`A.(0`%3C -M^O__&A!PA^(0()WE"`!2X>3__XH<,)WE`E*#X"`0G>4``%'C*P``"J@PC>(` -M,(WE$""=Y0$P@N($,(WE:`"-XA@0G>4,()WE"S"@X;/\_^L`0*#C.""-X@0P -MH.$$,,+G`4"$XA``5./[__\:`$"@XP4PB^`X$(WB(&"=Y0-0H.$$(-/G!"#! -MYP%`A.(&`%3A^?__&DA`C>(4`)WE:!"-X@0@H.&T^__K!`"@X3@0C>)8((WB -MR/S_ZP!`H.-8((WB(&"=Y00PTN<$,,7G`4"$X@8`5.'Z__\:?$2?Y2PPG>4( -M((/B!`"@X0L0H.$D,)WE`R""X/[__^LD$)WE`3#[YZ@PS>4!,-OEJ3#-Y00P -MV^6J,,WE!3#;Y:LPS>4&,-OEK##-Y0(H$)WE`!"- -MY:@PC>($,(WE!@"@X0(0H.$8()WE!#"@X=W[_^N(<(WB!P"@X200G>4$(*#A -M`OS_ZWB`C>((`*#A!!"@X1@@G>4,,)WE(?S_ZTA0C>(4`)WE!A"@X04@H.%X -M^__K6$"-X@4`H.$'$*#A!""@X8O\_^L4`)WE!!"@X04@H.%O^__K!0"@X0@0 -MH.$$(*#A@_S_ZQ0`G>4$$*#A!2"@X6?[_^L0()WE``!2XQQ0G046```*:$.? -MY1PPG>4#0(3@`%"@XTA@C>)8<(WB$("=Y12@G>4&`*#A!!"@X0<@H.%O_/_K -M"@"@X0<0H.$&(*#A4_O_ZP%0A>(00(3B!0!8X?/__XH<$)WE$""=Y0)2@>`@ -M,)WE``!3XQP```H`0*#C.""-X@0PH.$$,,+G`4"$XA``5./[__\:Y#*?Y04P -M@^``0*#C.!"-XB!@G>4!(-/D!"#!YP%`A.(&`%3A^O__&B`0G>4!4(7@2&"- -MXEA`C>(&`*#A.!"-X@0@H.%(_/_K%`"=Y000H.$&(*#A+/O_ZP!`H.,P$(WB -M2""-X@0PTN<$,,'G`4"$X@@`5./Z__\:;#*?Y050@^``0*#C,""-X@0PTN/__XH<$)WE -M`Q*!X!P0C>4,``#J$""=Y0``4N,)```*N'&?Y1PPG>4#<(?@`X"@X0!@H.-H -MH(WBH)&?Y4BPC>)84(WBTO__ZB`0G>4``%'C,0``"J@PC>(`,(WE$""=Y0$P -M@N($,(WE:`"-XA@0G>4,()WE9#&?Y4#4(7@!3"@X0!`H.,X$(WB(&"=Y0$@T^0$(,'G -M`4"$X@8`5.'Z__\:2$"-XA0`G>5H$(WB!""@X+< -M^__K`$"@XU@@C>(@8)WE!##2YP$PQ>0!0(3B!@!4X?K__QH<$)WE(""=Y0(0 -M@>`<$(WEJ#"-X@`PC>4`0*#C!$"-Y6@`C>(8$)WE#""=Y:`PG^68^__K.""- -MX@0PH.$$,,+G`4"$XA``5./[__\:)!"=Y2P@G>4",('@=""?Y0,P@N``0*#C -M.!"-X@$@T^0$(,'G`4"$X@@`5./Z__\:2$"-XA0`G>5H$(WB!""@X9CZ_^L$ -M`*#A.!"-XE@@C>*L^__K+#"?Y1P0G>4!,(/@`$"@XU@0C>($(-'G`2##Y`%` -MA.((`%3C^O__&@$`H..TT(WB\(^]Z`0$``#P02WI`%"@X0%`H.%P8)'E-##1 -MY00`4^,!0*`3&0``&E<-@.(8`(#B1!"$XO[__^L`<%#B`$"@`Q(```I*,-3E -M`0`3XQ%>AP(%```*/`"?Y?[__^M6,-3E`U*%X`9;A>(,4(7B*!"4Y6C`E.4, -MP&'@+#"4Y04`H.$&(*#A##!CX!3^_^L!0*#C!`"@X?"!O>A<````\$4MZ4?? -M3>(`4*#A`4"@X7!@D>4T,-'E!0!3XP$`4Q,E```:5H#1Y5\^B.(,,(/B`S&` -MX`2@D^4-<*#A*!"1Y0T`H.$!$(;@`R"@X_[__^M>CXCB`X"(X@A2A>`#`(WB -M!!"%X@H@H.'^___K*#"4Y2P@E.5H4)3E!5!CX`508N`#,(+@`V"&X!!`C>($ -M`*#A#1"@X0,@BN+0]O_K!`"@X080H.$&(*#A!3"@X>SV_^L&`*#A!!!%XA[W -M_^M'WXWB\(6]Z/!/+>E+WTWB`&"@X0%`H.%LH)'E``!:XV,```H=,-'E!0!3 -MXP$`4Q-?```:**"*XK`W`>,#,)#G7SZ#X@PP@^(#,8#@!#"3Y0`PC>4`@*#C -M##"-X@,P@^($,(WE')"-X@%0H.%-``#JLA'5X0P`C>(!$(K@`R"@X_[__^NP -M-P'C`Q"6YUX?@>(#$('B`1*&X`0`G>4$$('B`""=Y?[__^L>,-7ELB'5X0-P -M@N`'<(K@`8"(XAP0U>4!`%CA&```&AA`E>4$0&+@!$!CX!\0U>4$0&'@!P"@ -MX000H.'D]O_K)`&-Y0D`H.$,$(WB`#"=Y0,@@^*(]O_K"0"@X0<0H.$'(*#A -M!#"@X:3V_^L)`*#A!!"'X$DOC>($,*#CG_;_ZQX``.H,M`'C"T"6YP1`8N`$ -M0&/@'Q#5Y01`8>`'`*#A!!"@X(`,)WE`R"#XF[V -M_^L)`*#A!Q"@X0<@H.$$,*#ABO;_ZPD`H.$$$(?@22^-X@0PH..%]O_K"S"6 -MYP.@BN`#,!KB`3"@$RJA@^`*H:#A'##5Y0,`6.&N__^Z2]^-XO"/O>@!(*#C -M`#"=Y0`@@^4``*#C'O\OX?!/+>D,T$WB`+"@X00PC>4T,)WEX(*3Y:0WV.4` -M`%/C)&"@`P&@H`-$```*"""@X0@`H.$#$*#A`%"@XP5`H.$%<*#A`0!1XP5P -MH`$!```*)`!1XP5`H`$!4(7BL!?0Y0P`@.(``%'C]?__&@!0H.,D8*#C`:"@ -MXZ@'`.,&D*#C!@!3XP@``!J'$(?@`1&(X``0@>"LQY+E!!"1Y0$`7.$%<*`Q -M":"@,1\``#HD$$/B<1#OYF<`4>,+``"*)!!#X@<`$>,(```:A!"$X`$1B.`` -M$('@K,>2Y000D>4!`%SA`V"@,0$`7.$%0*`Q:Q"#XG$0[^8/`%'C"P``BI40 -M0^('`!'C"```&H00A.`!$8C@`!"!X*S'DN4$$)'E`0!*P-]+E#"""X@``4^//__\:"P"@X000G>4`(`#C`"!`XP8PH.'^___K -M`$"@X0``B^`$,)WE`Q!DX``@`.,`($#C"C"@X?[__^L!(*#C,#"=Y0`@@^4$ -M`(#@#-"-XO"/O>@00"WI$-!-XAP@G>7@0I+E>B4!X]+`E.%[)0'CTB"4X0`@ -MC>5\)0'C`B#4YP0@C>5])0'C`B#4YP@@C>5^)0'C`B#4YPP@C>4#$*#A`"`` -MXP`@0.,,,*#A_O__ZP$@H.,8,)WE`""#Y1#0C>(0@+WH\$`MZ0S03>(`<*#A -M`V"@X20PG>7@4I/EE#0!XP,PE><%*Z#C`B"5YP`@C>4&$*#A`"``XP`@0./^ -M___K`$"@X0``A^`&$&3@`"``XP`@0.,@-0'C`S#5Y_[__^L!(*#C(#"=Y0`@ -M@^4$`(#@#-"-XO"`O>@00"WI"-!-XA0@G>7@0I+EC"4#XP+`E.>()0/C`B"4 -MYP`@C>4#$*#A`"``XP`@0.,,,*#A_O__ZP$@H.,0,)WE`""#Y0C0C>(0@+WH -M$$`MZ0C03>(4()WEX$*2Y9['U.6?)]3E`""-Y:`GU.4$((WE`Q"@X0`@`.,` -M($#C##"@X?[__^L!(*#C$#"=Y0`@@^4(T(WB$("]Z!!`+>D,()WEX,*2Y0,0 -MH.$`(`#C`"!`X]`TG.7^___K`2"@XP@PG>4`((/E$("]Z!!`+>D,()WEX,*2 -MY0,0H.$`(`#C`"!`X\0TG.7^___K`2"@XP@PG>4`((/E$("]Z!!`+>D,()WE -MX,*2Y0,0H.$`(`#C`"!`X\`YG.7^___K`2"@XP@PG>4`((/E$("]Z!!`+>D0 -MT$WB'""=Y>!"DN6H)P'C`L"4YZPG`>,"()3G`""-Y1`K`>,"()3G!""-Y10K -M`>,"()3G"""-Y0,0H.$`(`#C`"!`XPPPH.'^___K`2"@XQ@PG>4`((/E$-"- -MXA"`O>@00"WI#""=Y>#"DN4#$*#A`"``XP`@0.-L,)SE_O__ZP$@H.,(,)WE -M`""#Y1"`O>@00"WI`Q"@X0`@`.,`($#C`#``XP`P0./^___K`2"@XP@PG>4` -M((/E$("]Z/!/+>DLT$WB`("@X0-PH.%4,)WEX#*3Y20PC>6<-P'C)!"=Y;,P -MD>&>)P'CLB"1X0`@C>4'$*#A8"*?Y?[__^L`8*#A_O__ZPT@H.%_/<+C/S## -MXP0@D^4!((+B!""#Y20PG>57/8/B*#"#XB`PC>4`$*#C'!"-Y22BG^4<()WE -MK[^"X@&PB^(D,)WEB[&#X"`0G>4`D)'E`#``XP`P0.,8,(WE8P``Z@A`2>(` -MD)GEX##4Y>$@U.4`((WEXB#4Y00@C>7C(-3E"""-Y>0@U.4,((WEY2#4Y1`@ -MC>4&`(C@!Q!FX+PAG^7^___K!F"`X$TQU.5,(=3E`""-Y08`B.`'$&;@H"&? -MY?[__^L`8(;@W#"4Y?@EE.4`((WE3R'4Y00@C>4&`(C@!Q!FX!@@G>7^___K -M`&"&X-`PE.74()3E`""-Y=@@E.4$((WE3B'4Y0@@C>4&`(C@!Q!FX``@`.,` -M($#C_O__ZP!@AN`,-M3E#2;4Y0`@C>4.)M3E!""-Y08`B.`'$&;@`"``XP`@ -M0./^___K`&"&X`8`B.`'$&;@`"``XP`@0./\-93E_O__ZP!@AN`/-M3E$";4 -MY0`@C>4&`(C@!Q!FX``@`.,`($#C_O__ZP!@AN`&`(C@!Q!FX``@`.,`($#C -MS#"4Y?[__^L`8(;@;T^$X@!0H.,`,-3E``!3XP<```JR,-3A`#"-Y08`B.`' -M$&;@"B"@X04PH.'^___K`&"&X`%0A>)$0(3B$`!5X_#__QH+`*#A"1"@X?[_ -M_^L``%#CEO__"AP@G>4!((+B'""-Y2`PG>4(,(/B(#"-Y2``4N.#__\:#1"@ -MX7\]P>,_,,/C!""3Y0$@0N($((/E_O__ZP$@H.-0,)WE`""#Y08`H.$LT(WB -M\(^]Z#`"``!D`P``6`(``(@"``#P0"WI+-!-XN!RD^4`8%+B#0#@`SL```H` -M`%'C.```"@T@H.%_/<+C/S##XPA`D^4@4)'B!%#5,`!`H#,``%3C!0``&@@` -MC>(@(*#C_O__ZP``4.,$```**0``Z@@`C>(@$*#C_O__ZR4``.H(`(WB`!`` -MXP`00.,$((WB#3"@X?[__^L$0)WE`#!4X@$PH!,"`%#C``!4$P8`H!$9```: -M`$"=Y60`5.-D0*`C`$"-Y00PC>5X)0'C`C#'YP!`G>5Y-0'C`T#'YP1`G>4` -M`%3C!@``"@```.,``$#C`!``XP`00.,`()WE_O__ZP0``.H```#C``!`XP`0 -M`.,`$$#C_O__ZP8`H.$LT(WB\("]Z'!`+>D8T$WB`F"@X0$`4N,#``"*L`"? -MY?[__^L-`.#C)P``Z@``4>,D```*#2"@X7\]PN,_,,/C"$"3Y1!0D>($4-4P -M`$"@,P``5.,%```:"`"-XA`@H./^___K``!0XP0```H5``#J"`"-XA`0H./^ -M___K$0``Z@@`C>(`$`#C`!!`XP0@C>(-,*#A_O__ZP(`4.,#```*,`"?Y?[_ -M_^L&`*#A!@``Z@`P`.,`,$#C!$"=Y0!`@^4`0)WE!$"#Y08`H.$8T(WB<("] -MZ,0#``#L`P``\$4MZ1S03>(`<*#A`X"@X3PPG>7@0I/E5PV$XA@`@.+@$(3B -M_O__ZP!04.)@```*X##5Y>$@U>4`((WEXB#5Y00@C>7C(-7E"""-Y>0@U>4, -M((WEY2#5Y1`@C>4'`*#A"!"@X0`@`.,`($#C_O__ZP!`H.%-,=7E3"'5Y0`@ -MC>4``(?@"!!DX``@`.,`($#C_O__ZP1`@.#<,)7E^"65Y0`@C>5/(=7E!""- -MY00`A^`($&3@`"``XP`@0./^___K`$"$X-`PE>74()7E`""-Y=@@E>4$((WE -M3B'5Y0@@C>4$`(?@"!!DX``@`.,`($#C_O__ZP!`A.`,-M7E#2;5Y0`@C>4. -M)M7E!""-Y00`A^`($&3@`"``XP`@0./^___K`$"$X`0`A^`($&3@`"``XP`@ -M0./\-97E_O__ZP!`A.`/-M7E$";5Y0`@C>4$`(?@"!!DX``@`.,`($#C_O__ -MZP!@A.!O7X7B`$"@XP"@`.,`H$#C`##5Y0``4^,'```*LC#5X0`PC>4&`(?@ -M"!!FX`H@H.$$,*#A_O__ZP!@AN`!0(3B1%"%XA``5./P__\:$```ZN`PU.7A -M(-3E`""-Y>(@U.4$((WEXR#4Y0@@C>7D(-3E#""-Y>4@U.40((WE!P"@X0@0 -MH.$`(`#C`"!`X_[__^L`8*#A`2"@XS@PG>4`((/E!@"@X1S0C>+PA;WH\$$M -MZ0C03>(`4*#A`V"@X2"`G>4D,)WEX'*3Y0`P`.,`,$#C`$"3Y>X^#N/N/D[C -M`P!4X0$PH`,`,(@%`$"@`S,```H`,`#C`#!`XP0PD^4"`%/C#P``"@0`4^,9 -M```*`0!3XR,``!H'`*#A!!"@X?[__^L``(WE!0"@X080H.$`(`#C`"!`XP0P -MH.'^___K`$"@X1P``.H'`*#A!!"@X?[__^L``(WE!0"@X080H.$`(`#C`"!` -MXP0PH.'^___K`$"@X1```.H'`*#A!!"@X?[__^L``(WE!0"@X080H.$`(`#C -M`"!`XP0PH.'^___K`$"@X00``.H&$*#A`"``XP`@0./^___K`$"@X0$PH.,` -M,(CE!`"@X0C0C>+P@;WH\$`MZ3S03>("8*#AX'*3Y0(`4N,#``"*!`&?Y?[_ -M_^L-`.#C/```Z@``4>,Y```*#2"@X7\]PN,_,,/C"$"3Y2!0D>($4-4P`$"@ -M,P``5.,%```:&`"-XB`@H./^___K``!0XP0```HJ``#J&`"-XB`0H./^___K -M)@``Z@PPC>(`,(WE&`"-X@`0`.,`$$#C%""-XA`PC>+^___K`P!0XP,```I\ -M`)_E_O__ZP8`H.$9``#J#!"=Y0(`4>,(```*!`!1XPL```H!`%'C#@``&@<` -MH.$4$)WE$"#=Y?[__^L,``#J!P"@X100G>6P(=WA_O__ZP<``.H'`*#A%!"= -MY1`@G>7^___K`@``Z@```.,``$#C_O__ZP8`H.$\T(WB\("]Z+P$``#H!``` -M$$`MZ0`PH.$3#(#B)`"`XC@C`>,/X*#A`O"3YQ"`O>@00"WI`#"@X1,,@.(D -M`(#B/",!XP_@H.$"\)/G$("]Z!!`+>D`,*#A$PR`XB0`@.)-+:#C#^"@X0+P -MD^<0@+WH$$`MZ0`PH.$3#(#B)`"`XF##`>,/X*#A#/"3YQ"`O>@00"WI`#"@ -MX1,,@.(D`(#B9,,!XP_@H.$,\)/G$("]Z!!`+>D`,*#A$PR`XB0`@.)HPP'C -M#^"@X0SPD^<0@+WH$$`MZ0#`H.$3#(#B)`"`XFQ#`>,/X*#A!/"@0 -M0"WI`#"@X1,,@.(D`(#B<,,!XP_@H.$,\)/G$("]Z!!`+>D`,*#A$PR`XB0` -M@.)TPP'C#^"@X0SPD^<0@+WH$$`MZ0`PH.$3#(#B)`"`XGC#`>,/X*#A#/"3 -MYQ"`O>@00"WI`,"@X8@%`^,``)SG`0!0XQ"`O0B,!0/C``"@00"WI`,"@X8@%`^,``)SG`0!0XQ"`O0B,!0/C``",#0)#G``!4 -MXQ"`O0@3#(#B)`"`XC3_+^$0@+WH$$`MZ0#`H.$3#(#B)`"`XI!#`>,/X*#A -M!/"@00"WIG#,!XP-`D.<``%3C$("]"!,,@.(D`(#B-/\OX1"`O>@> -M_R_A'O\OX1!`+>D@,P'C`P"`YR0S`>,#`(#G'""`XB@S`>,#((#GM#'0X0(` -M4^,!```*`P!3XP0``!H3#(#B+`"`XO[__^L!`*#C$("]Z```H.,0@+WH``"0 -MY2``4.,``*"#`0"@DQ[_+^$00"WI`#"@X00@D>4-$=+C$P``&@$#$N,'```: -M!CN`X@PP@^(#(`+B`@*#X``0H.,0(*#C_O__ZPD``.I7#8#B&`"`XN`0@^+^ -M___K`$!0X@,```H1#H3B`!"@XQ`@H./^___K`0"@XQ"`O>CP02WI`4"@X0%@ -MH.$`4*#A`0!PX@``H#.A#Y#A%0``&@,`4>,3``"*7GV%XC0`A^(!`H#@`!"@ -MXQ`@H./^___K!0"@X2@0A^($(*#A`#"@X_[__^M?3H3B#$"$X@1!A>`$0(3B -M`#"@XP`PA.4#0%#@`4"@$P```.H`0*#C!`"@X?"!O>AP0"WI`$"@X0%0H.$$ -M8)'E`V'&XP0`5N,`0*##(@``R@@PD>4%`%/C`2"@`ZPW`0,#((0'!@``"@T` -M4^,`(*`3K##X;B`P"`X@`"A.`$`(#B#!"% -MX@@@E>7^___K7SZ&X@PP@^(#,83@"""5Y00@@^6P-P'C`V"$YP0`H.%>'83B -M*!"!X@8@H.$!,*#C_O__ZP!`4.(!0*`3!`"@X7"`O>CP1RWI"-!-X@!`H.$! -M4*#A!#"1Y0``4^,"``"Z`0$3XRX```I#`0#J`0$3XRL```I7#8#B&`"`XN`0 -MA.+^___K`&!0X@0```JH-P'C`S"4YP(`4^/L8)8%`0``"JPW`>,#8)3G!##5 -MY0``4^,Q`0`:##"5Y0$`<^,R`0`:L"'5X?\_#^,#`%+A+@$`&BD!`.H(,)7E -M(`!3XR8!`!I,``#J!`!6XPD``!H(,)7E$`!3XP8```H@`%/C'@$`&A`PH.,( -M,(7E`'"@XP>`H.%$``#J!0!6XP$`5A,6`0`*/```ZA`[`>,#,)3G`P!3XQ,` -M`(H$.`'C`S"4YP``4^,/```:"#"5Y04`4^,!(*`#K#,#8)3G`0``Z@0X`>,#8)3G -M;#"4Y2``$^,&```*##"5Y0$`<^/U```:L"'5X?\_#^,#`%+A\0``&@(`5N,# -M```:"#"5Y2``4^/L```:"```Z@0`5N,&```:"#"5Y1``4^,@`%,3Y0``&B`` -M4^,0,*`#"#"%!01PE>77?>#G;#"4Y2``$^,'```*`0`3XP%PH!,'@*`1`P`` -M"@,``.H`<*#C!X"@X0```.H!@*#CJ#4@((+BE#X!XP,@A.<$8)7E`F'&XY@^`>,#8(3G"""5Y9P^`>,# -M((3G('"%XGJ-A.(@`(CB!Q"@X0@@E>7^___K7C^&X@,P@^(#,H3@!`"#X@<0 -MH.$(()7E_O__ZU\^AN(,,(/B`S&$X`@@E>4$((/EL#4"`A/C&P``"@$`6.,,```:V`'%X0`@X./_/P_C -M`"`"X`$P`^`($(WB^"!AX6,-A.(8`(#B#1"@X0@@H./^___K#@``ZM@!Q>$` -M(.#C_S\/XP`@`N`!,`/@"!"-XO@@8>%C#83B$`"`X@T0H.$((*#C_O__ZU`` -M`.H!`%CC3@``&@$`5^,$(-4%"#@!`P,@A`<$,)7E`P`3XX$```H&:X3B#&"& -MX@,P`^(#`H;@`!"@XQ`@H./^___K87V$X@QPA^($`-7E`P``X@`"A^``$*#C -M$""@X_[__^MBC83B#("(X@0`U>4#``#B``*(X``0H.,0(*#C_O__ZP0PE>4! -M`A/C"P``"@,P`^(#`H?@,!"%X@@@H./^___K!`#5Y0,``.(``HC@.!"%X@@@ -MH./^___K"@``Z@,P`^(#`H?@.!"%X@@@H./^___K!`#5Y0,``.(``HC@,!"% -MX@@@H./^___K!`#5Y0,``.(``H;@(!"%X@@@E>7^___K!#"5Y0,P`^($,(7E -M`3"@XQLLH.,",,3G`!"@XP(K`>,"$,3G!`"@X5X=A.(H$('B!""5Y?[__^L` -M0%#B`4"@$SH``.I7#83B&`"`XN`0A.+^___K`(!0X@%`H`,S```*$:Z(X@H` -MH.$`$*#C$""@X_[__^L@D(7B"@"@X0D0H.$0(*#C_O__ZP(`5N,6```:`""@ -MXP$[`>,#(,3G!#"5Y0$"$^,(```*\`"(XA`0B>(((*#C_O__ZP$,B.(8$(GB -M"""@X_[__^L'``#J\`"(XA@0B>(((*#C_O__ZP$,B.(0$(GB"""@X_[__^L` -M`%?C!0``"@0`H.$($*#A`""@X_[__^L`0*#A!```Z@0`H.$($*#A`2"@X_[_ -M_^L`0*#A`$!4X@%`H!,```#J`$"@XP0`H.$(T(WB\(>]Z`(`5N/3_O\:SO[_ -MZA!`+>E>38#B*$"$XA`[`>,#$(#G`P!1XP(@H(.H-P&#`R"`AP00H.'^___K -M`0!0XP``H!,!`*`#$("]Z'!`+>DHT$WB`$!0XAX```J=-0/C`S#4YP``4^,: -M```*;#"4Y2(-$^,9```:$#74Y0$`4^,6```*_O__ZPTPH.%_;(%`*#A`!"@XR0@H./^___K!`"@X040H.'^___K`$"@ -MX00PEN4!,$/B!#"&Y?[__^L"``#J`$"@XP```.H!0*#C!`"@X2C0C>)P@+WH -M$$`MZ0!`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E;#"4Y0$`$^,% -M```*!`"@X?[__^L$`*#A_O__ZP0`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@ -M0N($((/E_O__ZP$`H.,0@+WH<$`MZ0!`H.$!4*#A/#&0Y0$`4^$^```*_O__ -MZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y6PPE.4!`!/C`@``&CPAE.4``%+C -M!```&@0`H.'^___K;#"4Y0$`$^,!```:0``3XP0```H$`*#A_O__ZVPPE.4! -M`!/C!```&CPQE.4!`%/C`0``"@``4^,!```:!`"@X?[__^L\,93E!`!3XP,` -M`!H`,.#CV#"$Y00`H.'^___K/%&$Y6PPE.5X,,/C;#"$Y0$`5>,(,(,#;#"$ -M!0@```H@,(,S;#"$-04``#H$`%7C`P``&A`P@^-L,(3E!`"@X?[__^L-(*#A -M?SW"XS\PP^,$()/E`2!"X@0@@^7^___K`0"@XW"`O>AP0"WI`$"@X0!0H.&$ -M8+7E````XP``0.,%$*#A!B"@X?[__^L!,.#CV#"$Y6PPE.6`,(/C;#"$Y7A@ -MA.4!,*#C<##$Y04`H.'^___K`0!0XPT``!IL,)3E@###XVPPA.40-=3E``!3 -MXP(```IQ,-3E``!3XSP```H$`*#AE!"$XO[__^L`0*#A.```ZFP`A.+^___K -M`0!0XPL``!H`,*#C<##$Y0`P`.,`,$#C`!"3Y44.A.(,`(#BHA^!X@(0@>+^ -M___K`4"@XR@``.IL,)3E(``3XQ<```I`,*#C;#"$Y:EMA.(P4(;B!0"@X0`0 -MH.,D(*#C_O__ZP4`H.&4$(3B)""@X_[__^L$`*#A_O__ZR@`AN+^___K!`"@ -MX?[__^L!`%#C`$"@$P`PH`-P,,0%`4"@`PT``.J`,,/C;#"$Y1`UU.4``%/C -M`@``"G$PU.4``%/C!```"@0`H.&4$(3B_O__ZP!`H.$```#J`4"@XP0`H.%P -M@+WH\$$MZ0!0H.$!<*#AG34#XP,PT.<``%/C!```&BP"G^4L$I_E_O__ZP!` -MH..```#J;#"0Y8``$^,"```:`@L3XWT``!H6``#J"`*?Y0`2G^7^___K;$"5 -MY=1#X.=T``#J;#"5Y0(+$^,%```*!@"@X?[__^L!0$3B`0!TX_?__QH!``#J -M``!4XP4``,K(`9_EO!&?Y?[__^ML0)7EU$/@YUP``.K^___K#2"@X7\]PN,_ -M,,/C!""3Y0$@@N($((/E;#"5Y4$`$^,S```*E""5Y0`PE^4#`%+A(0``&I@` -MA>($$(?B_O__ZP$`4.,<```:;#"5Y0@`$^,4```:!0"@X<`0A>+^___K``!0 -MXP%`H!-````:!0"@X?[__^ML,)7E`0`3XP$```H%`*#A_O__ZP4`H.'^___K -M;#"5Y4``$^-`,,,3(#"#$VPPA142``#J!0"@X0$0H.,!(*#A_O__ZPT``.H% -M`*#A_O__ZVPPE>4!`!/C`0``"@4`H.'^___K!0"@X?[__^ML,)7E0``3XT`P -MPQ,@,(,3;#"%%0PV`N,#,-7G`0!3XP0``!JL`)_EG!"?Y?[__^L`0*#C%0`` -MZ@<`H.'^___K``!0XP0``!J,`)_E>!"?Y?[__^L`0*#C#```ZI0`A>('$*#A -M)""@X_[__^L`,*#CC#2%Y04`H.'^___K`$!0X@(``!I4`)_E/!"?Y?[__^L- -M(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K!`"@X?"!O>AD`*#C_O__ZS!` -MH.-D8*#C@___ZDP%```D#@``@`4``+0%``#D!0``"`8``"@&``!P0"WI`$"@ -MX0%0H.$`,-'E``!3XP\``!H!(-'E``!2XPP``!H",-'E``!3XQH``!H#,-'E -M``!3XQ<``!H$,-'E``!3XQ0``!H%,-'E``!3XQ$``!I'``#J_P!3XPX``!H! -M,-7E_P!3XPL``!H",-7E_P!3XP@``!H#,-7E_P!3XP4``!H$,-7E_P!3XP(` -M`!H%,-7E_P!3XS8```K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E;#"4 -MY2(-$^/30^`7(P``&D$`$^,8```*X`"$X@40H.$&(*#C_O__ZP$`4.,$```: -M;#"4Y0@`$^,!0*`#%P``"@T``.H$`*#A_O__ZVPPE.4!`!/C`0``"@0`H.'^ -M___K!`"@X?[__^ML,)3E0``3XT`PPQ,@,(,3;#"$%;@`A.(%$*#A!B"@X_[_ -M_^L!,*#CC#2$Y00`H.'^___K`$"@X0T@H.%_/<+C/S##XP0@D^4!($+B!""# -MY?[__^L```#J`$"@XP0`H.%P@+WH!$`MY1303>(`P*#A`#``XP`P0.,-0*#A -M#P"3Z`<`I.@`,,3E`##=Y0``4^,.```*#`!3X0!`H`,%```:`0``Z@P`4^$$ -M```:`0"@XQ`$H.$&``#J`$"@XPT@H.$!0(3B!##2YP``4^/T__\:``"@XQ30 -MC>(0`+WH'O\OX01`+>4`,-#E``!3XQ@```I_,`/B!`!3XP(`4Q,2```*"P!3 -MXQ````H6`%/C`$"@$P@``!H,``#J?S`#X@0`4^,"`%,3"```"@L`4^,&```* -M%@!3XP0```H!0(3B!##0YP``4^/S__\:`0``Z@$`H.,```#J``"@XQ``O>@> -M_R_A!$`MY0`PT.4``%/C#0``"@!`H.-_,`/B`@!3XP0`4Q,$```*"P!3XP(` -M``H6`%/C``"@$P0``!H!0(3B!##0YP``4^/R__\:`0"@XQ``O>@>_R_A$$`M -MZ0!`H.$.`%+C!```VO[__^L!`%#C!`"@$P``H`,0@+WH_O__ZP$`4.,0@+T( -M!`"@X?[__^L!`%#C`P"@`P(`H!,0@+WH<``MZ0``4^,.``#:`%"@XP!0@N4` -M0*#A``#4Y0$`4.$!,-0%`#""!0<```H!8-3E`@"&X@!0A>`%`%/A`&"@P0!` -MA,#S___*`$"@XP0`H.%P`+WH'O\OX01`+>4`,-#E``!3XP!`H`,`0*`3`@`` -M&@4``.H-`%3C`P``"@%`A.($,-#G``!3X_G__QH$`*#A$`"]Z![_+^$00"WI -M`<"@X0(PH.$P$*#C#""@X?[__^L0@+WH`#"@X3``0.)P`._F"0!0XQ[_+Y%A -M($/B_R_A<$`MZ0%0H.'^___K`$"@X04`H.'^___K!$&$X(0`@.!P`._F<("] -MZ'!`+>D!4*#A_O__ZP!`H.$%`*#A_O__ZP0"@.%P`._F<("]Z'!`+>D`0*#A -M`E"@X1!@G>4`$,#E`2#$Y0``4N,"```*`@"`X@,0H.'^___K`@"%X@`PEN4` -M,(/@`#"&Y0``A.!P@+WH<$`MZ0!@H.$!0*#A`U"@X0(0H.$$(*#A_O__ZP`P -ME>4$,(/@`#"%Y00`AN!P@+WH\$`MZ0S03>(`<%#B2P``"@`P`.,`,$#C`$"3 -MY0``5.,.```*`&"@XPU0H.$``-3E`1#4Y?[__^L&`,7G`6"&X@-`A.(&`%;C -M]___&@<`H.$-$*#A!B"@X_[__^L#``#J#0"@X0<0H.$&(*#C_O__ZP`PW>7_ -M`%/C#P``&@%`W>7_`%3C#```&@)`W>7_`%3C*@``&@-`W>7_`%3C)P``&@1` -MW>7_`%3C)```&@5`W>7_`%3C(0``&A```.H``%/C'@``&@%`W>4``%3C&P`` -M&@)`W>4``%3C&```&@-`W>4``%3C%0``&@1`W>4``%3C$@``&@5`W>4``%3C -M#P``&@`PH.,`,,WE'R#@XP$@S>5L((+B`B#-Y7@@X.,#(,WE!##-Y04PS>4' -M`*#A#1"@X7\@@N+^___K"`"?Y?[__^L,T(WB\("]Z$`&``#P3RWI'-!-X@!@ -MH.$!@*#A`J"@X0.PH.$"`*#A`!"@X[@@H./^___K`0!8XP"0H)/+``":`$#6 -MY0%P]N4"@$CB!U"@X0<`6.$1```J!P``Z@5@AN``0-;E`7#VY0*`2.('4*#A -M!P!8X0%@AB(6```J``!;X[\```H$`Y_E!!"@X0<@H.$(,*#A_O__ZP``X..Y -M``#J`6"&X@"0H.,`,`#C`#!`XP@PC>4`,`#C`#!`XPPPC>4`,`#C`#!`XQ`P -MC>4`,`#C`#!`XQ0PC>4D`%3C@&"*!81PR@6>```*(```B@0`5.,@8(H%)'#* -M!9D```H-``"*`0!4XPA@B@4,<,H%E```"@!@BC4$<,HUD0``.@(`5.,08(H% -M%'#*!8T```H#`%3CA```&B\``.H&`%3C,&"*!31PR@6&```**&"*-2QPRC6# -M```Z$`!4XSA@B@4\<,H%?P``"B$`5.-V```:<@``ZC8`5..(8(H%C'#*!7@` -M``H.``"*+0!4XZ!@B@6D<,H%-P8(H%='#*!38```H!`%'C -M4&"*!51PR@44```:,0``Z@0`5>,#``"*#`"=Y040H.'^___K'P``Z@00UN4! -M`%'C8&"*E61PRI4F``":`@!1XVA@B@5L<,H%(@``"@```.,``$#C!2"@X?[_ -M_^L1``#J````XP``0.,%(*#A_O__ZPP``.H#$-;E,P!1X[!@B@6T<,H%$P`` -M"A``G>4%(*#A_O__ZP,``.H`4(WE````XP``0./^___K`9")X@D``.IX8(KE -M?'#*Y08``.H!D(GB``!;XP,```H(`)WE!!"@X0<@H.'^___K"(!EX`$`6.,Z -M__^*``!8XP(``!H``%GB`0"@$P```.H``.#C'-"-XO"/O>AX!@``<$`MZ0!0 -MH.$!0*#A`!"@XQ`@H./^___K%`!4XW"`O8@!,*#C$T2@X10P`.,1,$#C`S`$ -MX```4^,,```:"#T`XP`P0.,#,`3@``!3XPP``!H"`!3C<("]"`4`H.$`$`#C -M`!!`XP0@H./^___K<("]Z`4`H.$T$)_E"""@X_[__^MP@+WH`$``XP!`0.,% -M`*#A!!"@X00@H./^___K!`"%X@00A.(((*#C_O__ZW"`O>C,`P``\$$MZ1#0 -M3>(`0*#AL"G0X;`MP.$*,*#C##"-Y=)P@.("(*#CL"#'X2T@T.4#`%+C(B"@ -M`[`@QP%\()#E``!2X[`@UQ$0(((3L"#'$0Q0G>4"4(7B$&"-X@10)N58()#E -M`&"-Y0(`A^(`$*#C7#"$XO[__^L`@*#A*E#4Y1\`5>,#```:F%"4Y0X`5>,4 -M4*"#"U"@D[!PA.('`*#A!1"@X?[__^L'`*#A_O__ZP`@H.$`4*#A"`!0XQ4` -M`-H`8(WE"`"@X0$0H.,((*#C!S"@X?[__^L`8(WE`Q"@XP$@H..8,(3B_O__ -MZP!@C>4&$*#C`B"@XY0PA.+^___K`&"-Y3(0H.,(($7BN#"$XO[__^L.``#J -M`&"-Y0@`H.$!$*#C!S"@X?[__^L`8(WE`Q"@XP$@H..8,(3B_O__ZP!@C>4& -M$*#C`B"@XY0PA.+^___K#`"=Y1#0C>+P@;WH\$\MZ1303>(`4*#A`7"@X00@ -MC>4#L*#A`#``XP`P0.,0,)/E##"-Y0P`4>,C``":#$"@XP2@C>`$D*#C`8"@ -MXP1@A>``,-;EW0!3XQ4``!H"`(3B``"%X`H0H.$)(*#A_O__ZP$`4.,.```: -M!G"@X00PG>4``%/C!```"@$@UN4$`)WE!A"@X0(@@N+^___K``!;XP1`A1`! -M,-05`C"#$@`PBQ4&``#J!#"%X`@PT^<",(/B`T"$X`0`5^'?__^*`&"@XP8` -MH.$4T(WB\(^]Z#!`+>D,T$WB`5"@X0`P`.,`,$#C%#"3Y00PC>4`0%#B#0`` -M"@`PU.7=`%/C"@``&@(`A.($$(WB!""@X_[__^L!`%#C!```&@$PU.4",(/B -M`#"%Y0%`H.,```#J`$"@XP0`H.$,T(WB,("]Z/!/+>D4T$WB`'"@X0&`H.$$ -M((WE`["@X0`P`.,`,$#C&#"3Y0PPC>4,`%'C/```F@Q`H.,!H*#C!&"'X`!0 -MUN7=`%7C&@``&@*0A.()`(?@#!"-X@0@H./^___K`0!0XQ,``!H!0(3B!%"' -MX``@U>4X`)WE!A"@X0(@@N+^___K`"#5Y0(P@N(`0*#C"$"$XG1`[^8#`%3A -M^___N@(@@N(\,)WEL"##X0!`U>4$0(G@&0``ZC``5>,3```:`9"$X@F0A^`` -M(-GE!`"=Y080H.$"((+B_O__ZP`@V>4",(+B`%"@XPA0A>)U4._F`P!5X?O_ -M_[H"((+BL"#+X0)`A.(`,-GE`T"$X`,``.H$,(?@"C#3YP)`A.(#0(3@!`!8 -MX<3__XH\,)WEL`#3X;`PV^$#`(#@%-"-XO"/O>@00"WI`$"@X8`0G^4$(*#C -M_O__ZP$`4.,0@+T(!`"@X6P0G^4$(*#C_O__ZP$`4.,"`*`#$("]"`0`H.%4 -M$)_E!""@X_[__^L!`%#C"`"@`Q"`O0@$`*#A/!"?Y00@H./^___K`0!0XQ`` -MH`,0@+T(!`"@X200G^4$(*#C_O__ZP$`4.,$`*`#``"@$Q"`O>C4`P``V`,` -M`-P#``#@`P``Y`,``/!!+>D"4*#A`T"@X0``4>,M``#:`##0Y3``4^,J```: -M`C!!X@$@T.5S,._F`P!2X24``!H$<(#B!&!!X@,`5N,%``#:!P"@X?[__^L` -M`(7E!'"'X@1@1N(!``#J``!6XQD``,H!`%;C%```V@&`U^4`,-?E"(23X1,` -M``H"8$;B"`%6X1```+H``%CC$```V@)@A^(`<*#C`%"4Y08`H.'^___K!0"` -MX0``A.4$8(;B`7"'X@<`6.'V___*!```Z@%@5N(!8*`3`@``Z@!@H.,```#J -M`6"@XP8`H.'P@;WH$$`MZ0!`H.&`$)_E!""@X_[__^L!`%#C$("]"`0`H.%L -M$)_E!""@X_[__^L!`%#C`@"@`Q"`O0@$`*#A5!"?Y00@H./^___K`0!0XP@` -MH`,0@+T(!`"@X3P0G^4$(*#C_O__ZP$`4.,0`*`#$("]"`0`H.$D$)_E!""@ -MX_[__^L!`%#C!`"@`P``H!,0@+WHZ`,``.P#``#P`P``]`,``/@#``#P02WI -M`$"@X0)@H.$#<*#A`%!1XC,``-H`,-#EW0!3XS```!H",$7B`2#0Y7,P[^8# -M`%+A*P``&@(`@.*X$)_E!""@X_[__^L!`%#C)0``&@A`A.((4$7B`P!5XP4` -M`-H$`*#A_O__ZP``AN4$0(3B!%!%X@$``.H``%7C&0``R@$`5>,4``#:`8#4 -MY0`PU.4(A)/A$P``"@)01>((`57A$```N@``6.,0``#:`E"$X@!@H.,`0)?E -M!0"@X?[__^L$`(#A``"'Y010A>(!8(;B!@!8X?;__\H$``#J`5!5X@%0H!," -M``#J`%"@XP```.H!4*#C!0"@X?"!O>C\`P``\$\MZ1S03>(`<*#A!!"-Y0)@ -MH.$`,`#C`#!`XQPPD^4,,(WE`$"@X12`C>+=H*#C#)"-X@2PH.,$`*#A"A"@ -MX0@@H.$&,*#A_O__ZP!04.(1```*`@"%X@D0H.$+(*#A_O__ZP``4.,0```* -M$@"-X@80A>("(*#C_O__Z[)!W>$!`%3C"0``&@5`H.$!,-7E!""=Y0`P@N42 -M``#J!4"@X0`PH.,$()WE`#""Y0T``.H40)WE_C\/X_\_3^,#,&3@`S"'X`9@ -M@^`&8&7@``!6XP)`A,($0(7`UO__R@!`H.,$,)WE`$"#Y00`H.$6(-0/C`S"0YP``4^,%```:C#4#XP,PD.<``%/C;$"0!0%`!`(````* -M`$"@XP0`H.$0`+WH'O\OX0H`@.(>_R_A'O\OX0@`@.(>_R_A!$`MY:PW`>,# -M,)#G``!3XP,```I,0)'E`$!4X@%`H!,"``#J3$"1Y0%`5.(!0*`3!`"@X1`` -MO>@>_R_A'O\OX1[_+^$>_R_A'O\OX?`%+>D8<)WE#`!3XP!`H),V``":#$"@ -MXP)0H.,#8*#C!("@XP'`H.,$`-'GW0!0XR<``!H$`('@!0#0YP``4.,C```: -M!`"!X`8`T.=0`%#C'P``&@0`@>`(`-#G\@!0XQL``!H%`(3B`*#1YP(`6N,7 -M```:``!3X14``)H),(3B`P!4X0=`H"$(```J`#"@XP<`@N`$$('@`\#1YP/` -MP.7E+0+C`B#0YP$`4N,'(,T%(1"@XP<@C>(4Q0/C#^"@X0SP -MD^<&``#J"""-X@$0H.,!$&+E(1"@XQ3%`^,/X*#A#/"3YPS0C>(`@+WH<$`M -MZ0!`H.&I78#B*`"%XLL=A.(A$('B!B"@X_[__^LP`(7B*AR$XAP0@>(D(*#C -M_O__ZR`@H..D.@+C`R"$YV0@H..H.@+C`R"$YP`PH..T*@+C`C"$Y[@J`N," -M,(3GO"H"XP(PA.>K+:#C`C"$YW"`O>@$X"WE#-!-XGP`@.+^___K`!"@X08` -MC>("(*#C_O__Z[8`W>$,T(WB`("]Z!!`+>D`0*#A_O__ZPT@H.%_/<+C/S## -MXP0@D^4!((+B!""#Y6PPE.4""Q/C`CO#$VPPA!4-(*#A?SW"XS\PP^,$()/E -M`2!"X@0@@^7^___K$("]Z/!!+>D`8*#A`4"@X48PT>4!`!/C\(&]&#!PT>5< -M4)'E``!5XP4``!I7#8#B&`"`XD80@>+^___K`%!0XO"!O0CX-97E`0!3X_"! -MO1C\-97E`0!3X_"!O1@'@*#A#R;5Y1`VU>53-Z#A4C>#X0$`$^/P@;T8*`"? -MY0<0H.'^___K$#;5Y0$@H.,2AX/A$(;%Y08`H.$'$*#A1B"$XO[__^OP@;WH -MC`@``/!!+>D(T$WB`%"@X=`TD.4``%/C5```"M0TD.4``%/C"P``&N(]`N,# -M,-#G`0!3XP<``!KE/0+C`S#0YP$`4^,`,*`#U#2`!0$PH!/4-(`5!```ZN(] -M`N,#,-7G`@!3XP$PH`/4-(4%"#"-X@``H.,$`"/E#&"!X@QP0N(&`*#A+1"@ -MXP,@H.$',*#A_O__ZP"`4.()```*!$"=Y0``5.,&``#:!##8Y0,P`^(#,(/B -M`2"@XQ(SH.%S,._FX#2%Y04`H.'^___K`$!0X@P```IO/X3B`$"@XP0`H.$` -M(.#C0!"@XP``P^6R(,/AM"##X080P^4!0(3B1#"#XA``5./W__\:5PV%XA@` -M@.+@$(7B_O__ZP!`4.(,```*;S^$X@!`H.,$`*#A`"#@XT`0H.,``,/ELB## -MX;0@P^$&$,/E`4"$XD0P@^(0`%3C]___&@@@C>(`,*#C!#`BY08`H.$]$*#C -M!S"@X?[__^L(T(WB\(&]Z/!/+>D\T$WB`$"@X0%@H.$"H*#A8)"=Y0`0`.,` -M$$#C$""-X@,`D>@$`(+DLA#"X"$8H.$`$,+E`""@X]`DA.4,8(;B-'"-X@R` -M0^(&`*#A+1"@XP<@H.$(,*#A_O__ZP``4.-"```*-%"=Y0``5>,_```*Q#24 -MY0``4^,(```:``"9Y0"0C>4``(K@W1"@XP<@H.,0,(WB_O__ZP$PH./$-(3E -M`+"9Y1@`C>(`$*#C&B"@X_[__^OB,`'CN#'-X1Q5`^,$`*#A!1"@XPP@C>(/ -MX*#A!?"4YP0`H.$$$*#C"""-X@_@H.$%\)3G"%"=Y0PPG>4%4&/@'PQ5X[@Q -MW2$".X,CN#'-(0,PH.,:,,WE`)"-Y0L`BN`M$*#C&B"@XQ@PC>+^___K`3"@ -MX]`TA.4&`*#A/1"@XP<@H.$(,*#A_O__ZP!@4.()```*-%"=Y18`5>,&```: -M``"9Y0"0C>4``(K@/1"@XQ8@H.,",(;B_O__Z]`$E.4\T(WB\(^]Z'!`+>D` -M0*#A*ER`XAA0A>*L-P'C`R"0YP`@4N(!(*`3E#H"XP,@@.<`(*#CF#H"XP,@ -M@.=".@+C`S#0YP$P0^(>`%/C`_&?ES,``.HP?0``0'T``$!]``!0?0``A'T` -M`(1]``"$?0``0'T``(1]``!`?0``0'T``(1]``"$?0``A'T``(1]``"$?0`` -MA'T``(1]``"$?0``4'T``(1]``"$?0``A'T``(1]``"$?0``A'T``(1]``"$ -M?0``A'T``(1]``!@?0```2"@XZ`Z`N,#((#G$```Z@,@H..@.@+C`R"`YPP` -M`.H"(*#CH#H"XP,@@.<(``#J03H"XP,PT.<.`%/C`B"@@Z`Z`H,#(("'`R"@ -MDZ`Z`I,#(("703H"XP,@U.>P.@+C`R"$YSPQE.4``%/C`""@`ZPZ`@,#((0' -M/"&4Y<0Z`N,#((3G!0"@X?[__^O<.@+C`P"$YWA0@.)D.@+C`U"$YW"`O>@P -M0"WI#-!-X@!`H.$!4*#A?`"`XO[__^L`$*#A!@"-X@(@H./^___K?`"%XO[_ -M_^L`$*#A!`"-X@(@H./^___K#""4Y0PPE>4#`%+A%@``&DP@E.5,,)7E`P!2 -MX1(``!H$`(3B!!"%X@8@H./^___K`0!0XPP``!H0`(3B$!"%X@P@E.7^___K -M`0!0XP8``!JT4-WAMD#=X01`)>`#`!3C``"@$P$`H`,```#J``"@XPS0C>(P -M@+WH<$`MZ0!@H.$!0*#A`E"@X0(`H.$&$*#A!""@X30U`^,/X*#A`_"5YVPP -ME>4!`!/C$```"MP`A>($$*#AP?__ZP``4.,+```*?#4!XP,@U>=T(,3E?24! -MXP(@U>=U(,3E`U#5YP%0A>*E4*#A7U!%XC10A.44``#J="#6Y70PU.4"(8/@ -M9S8&XV8V1N.3$L+@PB"@X70@Q.5U$-;E=2#4Y0$A@N"3$L+@PB"@X74@Q.4T -M$);E-""4Y0$A@N"3$L/@PB^@X<,P8N`T,(3E>""4Y08`H.$$$*#A>"""XO[_ -M_^MP@+WH$$`MZ0P@D.4,,)'E`P!2X0``H!,0@+T8$`"`XA`0@>+^___K`0!0 -MXP``H!,!`*`#$("]Z/!!+>D(T$WB`&"@X0%PH.$`,*#C`##-Y0$PS>4",,WE -M`S#-Y00PS>4%,,WE#0"@X08@H./^___K``!0XP!0H!,?```:_O__ZPT@H.%_ -M/<+C/S##XP0@D^4!((+B!""#Y0!`EN4$`%;A#0``"@:`H.,$4*#A!P"@X2`0 -MA.(((*#A_O__ZP$`4.,#```*`$"4Y00`5N'U__\:`0``Z@8`5.$````:`%"@ -MXPT@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L%`*#A"-"-XO"!O>@00"WI -M_O__ZQ"`O>CP3RWIA=]-X@"0H.$!4*#A!""-Y0.`H.$`,`#C`#!`XP@PD^4( -M,(WE$#L!XP-`D.<4.P'C`V"0YP,P1.(!`%/C_Z"@@P`PH),,,4PH*#C!P!6XPP``(H!,*#C$V:@X04`%N,!,*`3#S'-%08``!K``!;C -M!#"@$P\QS14"```:,``6XP(PH!,/,($(*#C_O__ZP$` -M4.,%```:`2#6Y1$.C>(&$*#A`B""XO[__^L>``#J,`!:XP8``!H$0(7@`2#4 -MY1$.C>(&$*#A`B""XO[__^L5``#JW0!:XPP``!H"`(3B``"%X`@0C>($(*#C -M_O__ZP$`4.,%```:!#"%X`<@T^<+`*#A!A"@X0(@@N+^___K!#"%X`7=`%3C3P``&A$.C>("`(#B"!"-X@0@ -MH./^___K`0!0XTH``!H60=WE`0!4XT<``!H70=WE``!4XT0``!I&#XWB"!"- -MX@,@H./^___K`0!0XSX``!H;0=WE!0!4XP3QGY<8``#JH((``+""``#`@@`` -MT((``-""``#@@@```""@XP0X`>,#((GG#@``Z@$@H.,$.`'C`R")YPH``.H" -M(*#C!#@!XP,@B><&``#J!""@XP0X`>,#((GG`@``Z@4@H.,$.`'C`R")YQPQ -MW>4!`%/C!P``&D("`(#B0Q^-X@0@H./^___K`0!0XQ<``!H4``#J!S%# -MX@-QH.$!@*#C'('-Y1%NC>(.`(;B0Q^-X@0@H./^___K$A"'XA%!W>40($3B -M$@"&X@$0AN`"(&?@_O__ZQ%!W>4$0&?@$4'-Y0A@H.$"``#J`6"@XP```.H` -M8*#C,`!:XT@``!H20=WE`0!4XT0``!H30=WE``!4XT$``!I%#XWB0Q^-X@,@ -MH./^___K`0!0XSL``!H70=WE`4!$X@0`5.,$\9^7%```ZMB#``#H@P``&(0` -M`/B#```(A````2"@XP0X`>,#((GG#@``Z@(@H.,$.`'C`R")YPH``.H$(*#C -M!#@!XP,@B><&``#J!2"@XP0X`>,#((GG`@``Z@`@H.,$.`'C`R")YQ@QW>4! -M`%/C!P``&D8/C>("`(#B0Q^-X@0@H./^___K`0!0XQ0``!H4``#J!S%#X@.! -MH.$!,*#C&#'-Y1%^C>(*`(?B0Q^-X@0@H./^___K#A"(XA%!W>4,($3B#@"' -MX@$0A^`"(&C@_O__ZQ%!W>4$0&C@$4'-Y0```.H`8*#C!`"=Y040H.$,(*#C -M_O__Z_@X`>,#,-GG`0!3XPP``!K\2@'C!""=Y0P`@N)C'8GB.1"!X@0@F>?^ -M___K!("9YPR`B.(`(*#C^#@!XP,@R><>``#J,`!:XP!0H!,!4*`#,`!:X]T` -M6A,7```:`0!6XQ4``!H10=WE!#"=Y0P`@^(1'HWB`B"$XO[__^L10=WE#H"$ -MX@``5>,&```*!#"=Y0@@@^`!$$+B`#"@XP`PP>4"($+B`##"Y0D`H.$*$*#A -M$2Z-XO[__^L```#J#("@X[A@B>(F7(GB%%"%X@!`H.,&<*#C`##5Y0``4^,' -M```*!`.)X"8,@.(5`(#B!A"@X0<@H.'^___K`0!0XP0```H!0(3B0%"%XA`` -M5./P__\:`P``ZA``5.,!```*``!4XP$``*H(`*#A%```ZC``6N,1```:`3"@ -MXP0@G>4(,,+G`X"(X``PH.,(,,+G`5"(X@03B>`%`(+@)AR!XAL0@>(0(*#C -M_O__ZQ&`B.($,)WE#2#SY1(@@N(`(,/E"`"@X87?C>+PC[WH\$C#OY@$PQ.4#D,3E2"77Y0$0H.,1,X+A -M2#7'Y0`PU.4!,$/B!`!3XP/QGY`0(*#C_O__ZP$PH.,",,3E!@``ZF00AN($`(3B"A*! -MX!`@H./^___K`3"@XP(PQ.44,*#CL##%X01`A>4(,(7E`#"@XPPPA>40,(7E -M%`"%XO[__^M+#8?B"`"`X@40H.'^___K`$"@X0```.H`0*#C!`"@X?"'O>CP -M02WI`("@X0%PH.$<`*#C_O__ZP!0H.$`0*#A``!0XP!`H`,=```*!`"@X_[_ -M_^L`8%#B!```&@4`H.$<$*#C_O__ZP!`H.,4``#J!@"@X0`0H.,$(*#C_O__ -MZP`PE^4`,,;E$S"@X[`PQ.$$8(3E!#"@XP@PA.4`,*#C##"$Y1`PA.44`(3B -M_O__ZTL-B.((`(#B!!"@X?[__^L`0*#A!`"@X?"!O>CP02WI`'"@X0!`D.4` -M8*#C!P"@X000H.'^___K`0!0XPT```H$4*#A##"4Y0$`4^,'```*``!6XP0` -M``H0()3E$#"6Y0(P8^```%/C````J@5@H.$`0)3E[/__Z@8`H.'P@;WH$$`M -MZ0!`H.&=-0/C`S#0YP``4^,0@+T(B#4#XP,PD.BL"```9`X``!!`+>D`0*#A``!1XA"`O0@,,)#E`0!3XQ"`O0@,`)#H -M!#""Y0`@@^4``(#E!`"`Y1`0A.+^___K)#"4Y0$P0^(D,(3E$("]Z!!`+>G^ -M___K$("]Z'!`+>D`8*#A`%!1X@T```K^___K#3"@X7]-P^,_0,3C!#"4Y0$P -M@^($,(3E!0"@X080H.'^___K!#"4Y0$P0^($,(3E_O__ZP$`H.-P@+WH$$`M -MZ?[__^L0@+WH$$`MZ0!`H.$8$)'E_O__ZU(-A.(P`(#B`1"@X_[__^L$`*#A -M_O__ZQ"`O>@00"WI`$"@X6PPD.4!,,/C;#"`Y:PT`^,#,)#G``!3XP$```H# -M$*#C,_\OX7$PU.4``%/C`0``&@0`H.'^___K!`"@X0,0H.,!(*#C_O__ZQ"` -MO>AP0"WI&-!-X@!`H.$`4%'BP%"``G$PT.4``%/C*@``"B`@U>4A,-7E(A#5 -MY0`0C>4C$-7E!!"-Y200U>4($(WE)1#5Y0P0C>4%8*#A*!"VY1`0C>5X`)_E -M+!"%XO[__^N4`(3B!A"@X20@H./^___K`#"@XXPTA.588)_E!`"@X?[__^L` -M4*#A`0!0XPX```H&`*#A!1"@X?[__^MQ,-3E`3!#XG,P[^9Q,,3E``!3X_'_ -M_QH@`)_E(!"?Y50N`./^___K!`"@X?[__^L8T(WB<("]Z+`(``#L"```"`D` -M`'P.``!P0"WI`%"@X0%@H.'^___K#3"@X7]-P^,_0,3C!#"4Y0$P@^($,(3E -M!0"@X080H.'^___K!#"4Y0$P0^($,(3E_O__ZW"`O>CP1RWI`&"@X6QP@.*( -M-0/C`S"0YP``4^/PA[T8C#4#XP,PD.<``%/C\(>]&/[__^L-(*#A?SW"XS\P -MP^,$()/E`2""X@0@@^5Q,-;E``!3XR4```H!,$/BB,#@``$$`MZ0!`H.$`(*#C<"#`Y2P0H.,4-0/C#^"@X0/PD.=L,)3E -M`3"#XVPPA.6L-`/C`S"4YP``4^,"```*!`"@X0(0H.,S_R_A!`"@X?[__^L` -M,*#C<3#$Y1"`O>CP02WI`$"@X0%@H.$!<*#AMPV`XC0`@.+^___K``!0X_"! -MO0AL,)3E$``3XPP```I7#83B&`"`X@80H.'^___K`%!0XO"!O0@$`*#A!1"@ -MX?[__^L$`*#A!1"@X?[__^OP@;WH5UV$XAA0A>(%`*#A!A"@X?[__^L``%#C -M\(&]&`4`H.$&$*#A_O__ZP!04.+P@;T(`#"@X]PPA>4(,);EV#"%Y:@W`>,# -M,)3G`@!3XZPW`0,#,)0'[#"%!0`PH./H,(7E_O__ZPT@H.%_/<+C/S##XP0@ -MD^4!((+B!""#Y6PPE.5``!/C`0``&B``$^,+```*Z#8!XP,PE.<"`%/C!P`` -M&H0`A.+@$(3B_O__ZP!@4.(!,*`3##"&%00`H.'^___K#2"@X7\]PN,_,,/C -M!""3Y0$@0N($((/E_O__ZP0`H.$%$*#A_O__Z_"!O>CX3RWI`&"@X0%`H.$@ -M`('BX!"&X@8@H./^___K`'"@X910E.5X4(7B'%"$Y=\/5>/H``"*_O__ZPT@ -MH.%_/<+C/S##XP0@D^4!((+B!""#Y1@PE.4``%/CQ0``V@`P`.,`,$#C`""@ -MXP`@P^5L,);E@``3X]<```I7C8;B&("(X@$`$^,M```*`0!7XP0``!J$`(;B -MX!"&XO[__^L`4*#A,@``ZH1PAN+@4(;B!P"@X040H.'^___K`*!0X@`PH!,, -M,(H5"`"@X040H.'^___K`*!0X@T```K^___K#3"@X7]=P^,_4,7C!#"5Y0$P -M@^($,(7E!@"@X0H0H.'^___K!#"5Y0$P0^($,(7E_O__ZP<`H.$@$(3B_O__ -MZP!0H.%L,);E"``3XQ````H``%#C`3"@$PPP@!4.```:I0``ZH0`AN(@$(3B -M_O__ZP!0H.%L,);E"``3XP0```H``%#C`3"@$PPP@!4"```:F0``Z@``5>.7 -M```*;#"6Y0@`$^,T```*(*"$X@@`H.$*$*#A_O__ZP!P4.($```:"`"@X0H0 -MH.'^___K`'!0XHD```H8,)3EU#"'Y0$PH./<,(?E`#"@X]@PA^6H-P'C`S"6 -MYP(`4^,?```:`("@XQL\H.,#@,;G`3L!XP.`QN<#.P'C`X#&YP$PH./H,(?E -MK#,)$);G9+"@XYL!`>#3C03C8H!!XY@A@>`*`*#A(1.#X/[__^N0(-7E -M?#4!XP,@QN>1(-7E?34!XP,@QN>04-7E`5"%XJ50H.%?4$7B>C4!XP-0QN<` -M,)?E"2"6YYL""^"8*XC@"@"@X2@3@^#^___K?#"4Y0``4^,@,*`#;#"&!00` -M``H!`%/C"#"@`VPPA@4`,*`3;#"&%08`H.%9'X;B5"&6Y?[__^L&`*#A5A^& -MXE0AEN7^___K;#"6Y0@`$^,%```*4@V&XC``@.(`$*#C_O__ZP8`H.'^___K -M10Z&X@P`@.+^___K&```Z@0`<^,,```:!@"@X?[__^L`,`#C`#!`XP`0D^5% -M#H;B#`"`XO[__^ML,);E@``3XX`PPQ-L,(85"0``Z@`P`.,`,$#C`!"3Y44. -MAN(,`(#B_O__ZVPPEN6``!/C@###$VPPAA4-(*#A?SW"XS\PP^,$()/E`2!" -MX@0@@^7^___K^(^]Z/!!+>D`0*#AX&"`XH0`@.(&$*#A_O__ZP!0H.%L,)3E -M&``3XQ(```I7#83B&`"`X@80H.'^___K`'"@X?[__^L-,*#A?VW#XS]@QN,$ -M,);E`3"#X@0PAN4$`*#A!Q"@X?[__^L$,);E`3!#X@0PAN7^___K;#"4Y7`` -M$^,4```*!`"@X?[__^L$`*#A_O__ZP!PH.'^___K#3"@X7]MP^,_8,;C!#"6 -MY0$P@^($,(;E!`"@X0<0H.'^___K!#"6Y0$P0^($,(;E_O__ZP0`H.'^___K -M``!5XP`PH!,,,(45;#"4Y4``$^,&```*Z#8!XP,PE.D(T$WB`$"@X0%0H.$4.P'C`W"0YTR` -MD>7X.`'C`S#0YP$`4^,'```:F`"!XI00D>4`(*#C!#"-XO[__^L`8%#B`6"@ -M$QP``.KE/0+C`S#0YP$`4^,!8*`3!0``&@$`5^,`8*`3`6"@`P``6.,`8*`# -M`6`FX@$P5^(!,*`3``!8XP`PH!,``%/C!```"C0`G^4'$*#A"""@X?[__^L` -M8*#C;#"4Y2``$^,#```*?""5Y3PQE.4#`%+A`&"@$P8`H.$(T(WB\(&]Z)`) -M``#P3RWI--!-X@!`H.$`8*#C+V#-Y1AP@.((L)#E&#"0Y0PP@.5,H(#B@#"` -MXB`PC>4L,(#B'#"-Y0"``.,`@$#C;#!`XB0PC>4&D*#C4```Z@PPE.4#4*#A -M``!3XP!`H`.D```*`#"3Y0PPA.4@-)3E`0!3XPP``!H``%;C`P``"E`@EN50 -M,)7E`P!2X4```*H@`(7B"A"@X0D@H.'^___K`0!0XSH``!J5``#J*""4Y0`` -M4N,&```:``!6XY````I0();E4#"5Y0,`4N&,``"Z+P``Z@4PU.4``%/C&0`` -M"@``5N,#```*4""6Y5`PE>4#`%+A)@``JB@@E>5\,)3E`P!2X2(``!HL`(7B -M(!"=Y?[__^L!`%#C'0``&A``E>7^___KAS,!XP,`4.$8``#*)`"=Y040H.'^ -M___K``!0XV\``!H2``#J``!6XP,```I0$);E4#"5Y0,`4>$,``"J*#"5Y0,` -M4N$)```:+`"%XAP0G>7^___K`0!0XP0``!HD`)WE!1"@X?[__^L``%#C6P`` -M&@<`H.$,$)3E_O__ZP``4..I__\*``!6XP4``!H```#C``!`XX@1G^7^___K -M`$"@XTL``.H+4*#A(##6Y2$@UN4`((WE(B#6Y00@C>4C(-;E"""-Y20@UN4, -M((WE)2#6Y1`@C>4```#C``!`XT`1G^4L((;B_O__ZP`PE.4!`!/C%```"BP! -MG^4D$9_E_O__ZW``A.(<$(;BFOG_ZP``4.,&```*$`&?Y001G^7^___K"P"@ -MX?[__^L"0*#C*```Z@L`H.'^___K"P"@X?[__^L+`*#A_O__ZP4`H.$!$*#C -M+R"-XAPU`^,/X*#A`_"5YR]`W>4!`%3C%0``&@4`H.$"$*#C+B"-XAPU`^,/ -MX*#A`_"5YY(@UN4"`%+C`!``XP`00.,`,`#C`#!`XP,0H!$N0-WE`@!4XP`@ -M`.,`($#C`#``XP`P0.,#(*`1;`"?Y?[__^L%`*#A!A"@X?[__^L`0*#A!`"@ -MX330C>+PC[WH("#5Y2$PU>4B$-7E`!"-Y2,0U>4$$(WE)!#5Y0@0C>4E$-7E -M#!"-Y5`0E>40$(WE"`"@X2P0A>+^___K!6"@X9+__^JH#@``$`H``#P*``"` -M"@``$$`MZ0!`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E!`"@X?[_ -M_^L!`%#C`$"@`P!`E!4$,)05`""4%00P@A4`((,5`$"$%01`A!4-(*#A?SW" -MXS\PP^,$()/E`2!"X@0@@^7^___K!`"@X1"`O>AP0"WI`$"@X?[__^L",*#C -M`##$Y1$PH.,!,,3E>##@XP(PQ.4#`,3E(#2@X00PQ.4@6*#A!5#$Y7"`O>CP -M02WI`$"@X0%0H.'^___K;#"4Y1``$^/P@;T8;'"$XO[__^L-(*#A?SW"XS\P -MP^,$()/E`2""X@0@@^5L,)3E"``3XQP```IQ,-3E``!3XP$P0Q)Q,,05\#T" -M`P,PU`=Q,,0%MB#5X?\_#^,#`%+A`#"@$W$PQ!4$`*#A_O__ZP0`H.'^___K -MA`"$XN`0A.+^___K`&!0X@0```H`,*#C##"&Y0<`H.$&$*#A_O__ZP0`H.'` -M$(3B_O__ZVPPE.5``!/C`0``&B``$^,Z```*5PV$XA@`@.(%$*#A_O__ZP!@ -MH.'^___K#3"@X7]=P^,_4,7C!#"5Y0$P@^($,(7E!`"@X080H.'^___K!#"5 -MY0$P0^($,(7E_O__Z^@V`>,#,)3G`0!3XR,``!J$`(3BX!"$XO[__^L`4%#B -M!```"@`PH.,,,(7E!P"@X040H.'^___KJ6V$XE0AE.4D`(;BW!"$XG@@@N+^ -M___K,%"&X@4`H.$`$*#C)""@X_[__^L%`*#AE!"$XB0@H./^___K!`"@X?[_ -M_^LH`(;B_O__ZVPPE.4@`!/C0#"#$R`PPQ-L,(05!`"@X?[__^L-(*#A?SW" -MXS\PP^,$()/E`2!"X@0@@^7^___K\(&]Z'!`+>D`0*#A_O__ZPT`H.%_/<#C -M/S##XP0@D^4!((+B!""#Y0`PH.-,-X3E;#"4Y0(+$^,$```*20Z$XO[__^ML -M,)3E`CO#XVPPA.4`,`#C`#!`XP`PD^6X)0'C`B"4YV00H..1`@'@TRT$XV(@ -M0>.2`8'@5@V$X@@`@.(A$X/@_O__ZW`PU.4!`%/C6```&FQ0A.)L,)3E(``3 -MXR@```H!`!/C4@``&H`P@^-L,(3E!0"@X?[__^L!`%#C"```&@`P`.,`,$#C -M`!"3Y44.A.(,`(#BHA^!X@(0@>+^___K0P``ZFPPE.4".\/C;#"$Y:EMA.(P -M4(;B!0"@X0`0H.,D(*#C_O__ZP4`H.&4$(3B)""@X_[__^L$`*#A_O__ZR@` -MAN+^___K0#"@XVPPA.4$`*#A_O__ZP`PH.-P,,3E*P``ZH`P@^-L,(3E`#"@ -MXW`PQ.4%`*#A_O__ZP$`4.,(```:`#``XP`P0.,`$)/E10Z$X@P`@.*B'X'B -M`A"!XO[__^L:``#JN`"?Y7$0U.7^___K<3#4Y0``4^,1```*`3!#XG,P[^9Q -M,,3E``!3XP8```H$`*#AE!"$XO[__^L!`%#C`3"@`W`PQ`4%```*`#"@XW$P -MQ.4$`*#A_O__ZP0`H.'^___K;#"4Y8`PP^-L,(3E!`"@X?[__^L-(*#A?SW" -MXS\PP^,$()/E`2!"X@0@@^7^___K!`"@X?[__^N,.93E``!3XW"`O1AX-0/C -M`S"4YP``4^-P@+T(!`"@X3/_+^%P@+WHX`H``/!!+>D`8*#A`E"@X0!`4>+P -M@;T(##"4Y0$`4^/P@;T(_O__ZP!PH.$`,);E0``3XP(``!H@`!/C%("@`P`` -M``H!@*#C``!5XP8``!H0,)3E!W!CX!\U"./K,47CDR>#X*,"6.'P@;V(_O__ -MZPTPH.%_74!,(/B!#"%Y0P`E.@$,(+E`""#Y0!`A.4$0(3E -M!`"@X1`0AN+^___K)#"6Y0$P0^(D,(;E!#"5Y0$P0^($,(7E_O__Z_"!O>@0 -M0"WI_O__ZQ"`O>CP02WI`$"@X0%PH.%L@(#B_O__ZPT@H.%_/<+C/S##XP0@ -MD^4!((+B!""#Y81@A.*$0)3E!0``Z@10H.$`0)3E"`"@X040H.$'(*#A_O__ -MZP8`H.$$$*#A_O__ZP``4./T__\*#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E -M_O__Z_"!O>@00"WI_O__ZQ"`O>AP0"WI`%"@X?[__^L-(*#A?SW"XS\PP^,$ -M()/E`2""X@0@@^40`(7B_O__ZP$`4.,`0*`##P``"A!`E>4,`)3H!#""Y0`@ -M@^4`0(3E!$"$Y0!@H.,(8(3E#&"$Y?[__^L0`(3E%&"$Y1A@A.4D,)7E`3"# -MXB0PA>4-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K!`"@X7"`O>@00"WI -M_O__ZQ"`O>CP1RWI`*"@X0%PH.&$@(#BA$"0Y0!@H.,&4*#A"`"@X000H.'^ -M___K`0!0XP\```H$4*#A'`"$X@<0H.&(]__K``!0XPD``!H``%;C!```"A`@ -ME.40,);E`C!CX```4^,```"J!6"@X0!`E.7J___J"`"@X000H.'^___K`0!0 -MXRT``!I\`(KB_O__ZP$`4.,4```:"@"@X0(0H.-V((?B'#4#XP_@H.$#\)KG -M>""7Y1P`AN('$*#A>"""XO[__^O^___K$`"&Y0!`H.,,0(;E_O__ZQ``AN4( -M0(;E%$"&Y1A`AN7PA[WH;`"*XO[__^L`0%#B\(>]"'A0E^5X4(7B!R"@X790 -M@N0*`*#A`A"@XQPU`^,/X*#A`_":YQP`A.('$*#A!2"@X?[__^L$`*#A"!"@ -MX?[__^OPA[WHE""5Y7@PE^4#`%+A`@``F@HPU^4!`%/C\(>]"!P`A>('$*#A -M"B"@X6SW_^O^___K$`"%Y?"'O>AP0"WI`$"@X0%@H.'^___K#2"@X7\]PN,_ -M,,/C!""3Y0$@@N($((/E;#"4Y0$`$^,-```*W%"$X@4`H.$&$*#A*O?_ZP`` -M4.,'```*!0"@X080H.$$(*#A4O?_ZP0`H.%9'X3B5"&4Y?[__^L$`*#A!A"@ -MX?[__^L-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K<("]Z/!!+>D`8*#A -M`4"@X7@PD>5X,(/BWP]3XR<``(K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($ -M((/E;#"6Y4``$^,4```*X`"&X@00A.(&(*#C_O__ZP``4.,.```*?'"$XE8/ -MAN('$*#A"""@X_[__^N$`(;B!!"$XO[__^L`4%#B!```"I@`A>('$*#A"""@ -MX_[__^L(``#J;#"6Y8``$^,%```:$##4Y0``4^,,,(0%!@"@X000H.'^___K -M#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__Z_"!O>@00"WI`$"@X?[__^L8 -M`(3B_O__ZR``A.+^___K$("]Z!!`+>D`0%#B$("]"`0`H.'^___K(`"4Y0`` -M4.,0@+T(YAR@X_[__^L0@+WH$$`MZ?[__^L0@+WH\$$MZ0!PH.%L8(#B!@"@ -MX0`0H.-R+J#C_O__ZW1PA^4`4*#C>%"'Y6Q0A^4",*#C/#&'Y0$PH.-*-@00"WI_O__ZQ"`O>@!`*#C'O\OX0$`H.,>_R_A`0"@XQ[_+^$! -M`*#C'O\OX0$`H.,>_R_A\$DPT$WB`5"@X0!``.,`0$#C#<"@X0\`M.@/`*SH#P"TZ`\`K.@/ -M`)3H!P"LZ``PS.4`0-WE!0!4X0D```H!0*#C#2"@X00PTN<%`%/A!```"@%` -MA.(M`%3C^?__&@``H.,```#J`0"@XS#0C>(P`+WH'O\OX0``4.,>_R\!^#60 -MY0$`4^,>_R\1_#60Y0$`4^,>_R\1$#;0Y0``4^,`,*`3$#;`%1[_+^$``*#C -M'O\OX03@+>4,T$WB`#"@X0`@T>4$`%+C`R"@`\`I@`4'(,T%"```"@$`4N," -M(*`#!R#-!00```H``%+C`2"@`P<@S04`(*`3!R#-%0,`H.$"$*#C!R"-XA3% -M`^,/X*#A#/"3YP``H.,,T(WB`("]Z``PT>4#`%/CU#F`E0``H.,>_R_A``!1 -MXP0`H`,``*`3'O\OX5`QD.54$9#E6B^@XP+`D.<#`%SA!@``&@(@@.`$()+E -M`0!2X0(``!K0`)#E4`'@YQ[_+^%H,8#E;!&`Y0$`H.,>_R_A`#"@XX@WP.5+ -M+:#C`C#`YU`W@.54-X#E6#>`Y6`W@.7(-(#E9#>`Y5PW@.5H-X#E;"<`X[(P -M@.$#$*#A`R"`X!` -MY7@W@.4>_R_A<$`MZ0!0H.$!0*#A`0"@X0`0H.-8(*#C_O__ZQ@PH..Z,,3A -M`3"@XQ0PQ.4',*#C*##$Y0`PH.,J,,3E$B"@XT\@Q.4,,(3EH3?5Y0$`$^,& -M,*`31S#$%04PH`-',,0%`#"@XQ4PQ.4",,3E13#$Y48PQ.5(,,3E23#$Y4HP -MQ.6<-P#CLS"5X;8PQ.%P@+WH\$\MZ0S03>(`4*#A`7"@X0*0H.$"`*#A`!"@ -MXP8MH./^___K!T"@X0```.,``$#C!Q"@X?[__^L2`%?C`P``FE`!G^7^___K -M`&"@XTX``.I".@+C`[#5YP*@"^($L`OB`#``XP`P0.,G(*#CDC``8*#C!D"@X0`P`.,`,$#C!#"-Y0`P -MU>4.`%/C`""@@P$@H),``%KC`""@`P``4N,;```*AB"&X`(AB>``,,+E"0!7 -MXPL``!H!$$/B<1#OY@H`4>,!$*"3!!""E0T``)H,,$/B4T$)_E!B"@X?[__^L!8(;B=F#OY@%`A.)T0._F`5"% -MX@0`6.'$__^*!@"@X0S0C>+PC[WH.`L````/``#H$0``$$`MZ0!`H.$``%'C -M!`"@`Q"`O0@$`*#A2174Y7HNA.($((+BC/__ZZ('Q.4``*#C$("]Z'!`+>D` -M0*#AT#20Y0$`4^,`4*`#4@``"FQ7`.-(`9_E2!&?Y;4@E.'^___KM3"4X00` -M$^,&```:8">4Y0``4N,+```*!#"#X[4PA.$!4*#C"```ZF`GE.4``%+C!``` -M&@0PP^-L)P#CLC"$X0%0H.,```#J`%"@XVPW`..S,)3A$``3XPH``!K())3E -M``!2XP(``!IH)Y3E``!2XQ$```H0,(/C;"<`X[(PA.$!4(7B"0``ZL@DE.4` -M`%+C&```&F@GE.4``%+C!@``&A`PP^-L)P#CLC"$X0%0A>+(-)3E``!3XPX` -M`!IL-P#CLS"4X00`$^,*```:Z#24Y0(,$^,#```*9#>4Y0``4^,"8*`3!``` -M&FAGE.4`8%;B`6"@$P```.H#8*#C;#<`X[,PE.$#(`/B!@!2X0,PPQ,#8(81 -M;#<`$[-@A!$!4(42(`"?Y1@0G^5L-P#CLR"4X04PH.'^___K!0"@X7"`O>AX -M"P``_!$``)@+```00"WI````XP``0.,($)_E_O__ZP$`H.,0@+WH%!(``!!` -M+>EP$)'ERPV`XB$`@.($$('B!B"@X_[__^L!`*#C$("]Z/!`+>D,T$WB`'"@ -MX0%`H.$"8*#A#3"@X6@@G^4#`)+H!`"#Y+`0P^%P4);E"#"4Y0``4^,1```* -M!%"%X@4`H.'+'8?B(1"!X@8@H./^___K``!0XP4``!H%`*#A#1"@X08@H./^ -M___K``!0XP,```H'`*#A!A"@X0_@H.$(\)3E#-"-XO"`O>@<$@``$$`MZ9X7 -MT.6@)]#EGS?0Y?[__^L!`*#C$("]Z!!`+>D`0*#A'@V`X@@`@.+^___K!`"@ -MX?[__^L0@+WH<$`MZ0!0H.$!8*#A`""1Y5)(Y^<8`%3C&```B@`P`.,`,$#C -MA#&#X%0SD^4``%/C`@``"G(@_^8"`%/A#P``&A,,A>(0`(#B_O__ZPA@EN(* -M```*`#``XP`P0..$08/@!0"@X080H.$/X*#A6/.4Y1PS`>,#()7G`2""X@,@ -MA><``*#C<("]Z/!!+>D`<*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#'``` -M"M\/H./^___K`&"@X0"`H.$``%#C!```&@4`H.$<$*#C_O__ZP!`H.,1``#J -MK1Z'XM\OH./^___K%`"$XO[__^LW,*#CL##$X01@A.7?/Z#C"#"$Y0`PH.,, -M,(3E$#"$Y4L-A^((`(#B!!"@X?[__^MP0._F!`"@X?"!O>CP3RWI#-!-X@!` -MH.$!4*#A`F"@X0-PH.%+/:#C`S#0YP``4^/J```*_O__ZPT@H.%_/<+C/S## -MXP0@D^4!((+B!""#Y3``5>-G```*!@``BBH`5>-:```*+0!5XUT```H%`%7C -MS0``&@L``.K=`%7C9P``"O\`5>,"```*/0!5X\8``!I=``#J````XP``0.-$ -M$Y_E_O__Z\```.I6GX3B5*&4Y2V-A.(,@(CBGC(-4(7BGC0!,*#C`3#%Y)XW`>.S -M,)3A`0`3XP$PH!,!,,44`#"@`P$PQ00$`%CC!C#=!0$PQ00&```*!0!8XP0` -M`!H%`*#A!A"-X@(@H./^___K`E"%X@80A.`%`*#A5A^!X@H@9N#^___KW#"4 -MY0(P@^((,(/@T#J$Y0*@BN((@(K@2(N$Y00`H.'^___K=@``Z@```.,``$#C -M#!*?Y?[__^MQ``#J````XP``0./\$9_E_O__ZVP``.H```#C``!`X^P1G^7^ -M___K9P``Z@```.,``$#CW!&?Y?[__^MB``#J````XP``0./,$9_E_O__Z\@! -MG^4&$*#A!""@X_[__^L``%#C!```"@```.,``$#CK!&?Y?[__^M3``#JI`&? -MY080H.$$(*#C_O__ZP``4.,$```*````XP``0..($9_E_O__ZT@``.J``9_E -M!A"@X00@H./^___K``!0XT````H`@*#C"&"-X@B`)N4M783B#%"%XDBKE.4` -M``#C``!`XTP1G^7^___K!0"@X0H0H.$((*#A#3"@X?[__^L`D%#B,0``"@!@ -MG>4(`%;A+@``"@FP9>`*@&O@!H!8X`"@H`,'```*"`"@X?[__^L`H%#B`P`` -M"@H`H.$&$(G@"""@X?[__^MP5Y3E``!5XQX```H!(-7E`""-Y0(@@N(+,(+@ -M"#"#X`,,4^,/``"*"0"@X040H.'^___K`#"=Y0``6N,$```*`C"#X@,`B>`* -M$*#A"""@X?[__^L`4)WE`C"%X@LP@^`(,(/@2#N$Y0``6N,%```*"@"@X0@0 -MH.'^___K`0``ZFP`G^7^___K`3"@XX@WQ.4-(*#A?SW"XS\PP^,$()/E`2!" -MX@0@@^7^___K``!7XP$```H$`*#A_O__ZPS0C>+PC[WHY!(``/@2```0$P`` -M)!,``#@3``!0$P``A`0``&P3``"(!```@!,``(P$``"4$P``Q`L``'!`+>D8 -MT$WB`%"@X0%`H.',-I'E``!3XPT``*H(-]'E``!3XQ@``!H!,*#C"#?!Y5`W -MD.4!,(/B4#>`Y0$`4^,1```:*A"@XP`@H./^___K#0``Z@@WT>4``%/C"@`` -M"@`PH.,(-\'E4#>0Y0$P0^)0-X#E``!3XP,``!HJ$*#C`""@XP$PH./^___K -MR#8`X[,PE.$!"Q/C$0``&@DWU.4``%/C(```&@$PH.,)-\3E5#>5Y0$P@^)4 -M-X7EH2?5Y0$`4N,8``":`0!3XQ8``!H%`*#A_Q"@XP`@H./^___K$0``Z@DW -MU.4``%/C#@``"@`PH.,)-\3E5#>5Y0$P0^)4-X7EH2?5Y0$`4N,&``":``!3 -MXP0``!H%`*#A_Q"@XP`@H.,!,*#C_O__Z\PVE.6``!/C$0``&@HWU.4``%/C -M(```&@$PH.,*-\3E6#>5Y0$P@^)8-X7EH2?5Y0$`4N,8``":`0!3XQ8``!H% -M`*#A_Q"@XP`@H./^___K$0``Z@HWU.4``%/C#@``"@`PH.,*-\3E6#>5Y0$P -M0^)8-X7EH2?5Y0$`4N,&``":``!3XP0``!H%`*#A_Q"@XP`@H.,!,*#C_O__ -MZ\PVE.4""Q/C10``"A!FE.569._GX!#4Y>$@U.7B,-3EXP#4Y0``C>7D`-3E -M!`"-Y>4`U.4(`(WE#&"-Y80!G^7^___K##?4Y0``4^,`,*`3##?$%<@TE14! -M,$,2R#2%%1``%N,5```:"S?4Y0``4^,!,(,""S?$!6`WE04!,(,"8#>%!>`@ -MU.7A,-3EXA#4Y0`0C>7C$-3E!!"-Y>00U.4($(WEY1#4Y0P0C>5@%Y7E$!"- -MY1`!G^40$9_E_O__ZP(`%N,O```:#3?4Y0``4^,!,(,"#3?$!60WE04!,(," -M9#>%!>`@U.7A,-3EXA#4Y0`0C>7C$-3E!!"-Y>00U.4($(WEY1#4Y0P0C>5D -M%Y7E$!"-Y;@`G^6P$)_E_O__ZQ@``.H,-]3E``!3XP$PH`,,-\0%R#25!0$P -M@P+(-(4%T#25Y0$`4^,.```:X"#4Y>$PU.7B$-3E`!"-Y>,0U.4$$(WEY!#4 -MY0@0C>7E$-3E#!"-Y<@4E>40$(WE5`"?Y4@0G^7^___K!0"@X3K]_^L``%#C -M"0``V@4`H.$M$*#C`""@XP(PH.'^___K!0"@X3T0H.,`(*#C`3"@X_[__^L8 -MT(WB<("]Z-@+```<#```J!,``'`,``"\#```\$$MZ0!@H.&(.9#E`0!3X_"! -MO=@#`%/CD#F0!0$P@P*0.8`%'`"@X_[__^L`<*#A`$"@X0``4./P@;T(,`"@ -MX_[__^L`4%#B`P``&@<`H.$<$*#C_O__Z_"!O>@4`(?B_O__ZQ(PH..P,,?A -M!%"'Y3`PH.,(,(?E`#"@XPPPA^40,(?E2PV&X@@`@.('$*#A_O__Z_"!O>CP -M02WI$-!-X@!0H.$!0*#AP#F0Y0,P`^(#`%/C,0``&@&`H.%7#8#B&`"`XO[_ -M_^L`8%#B)@``"@9PU.4```#C``!`XP<0H.'^___KV!"6Y0$P0>(;`%/C!``` -MF@```.,``$#C_O__ZP4`H.,H``#J`Q"!XG%@[^8`$-3E`2#4Y0(PU.4#`-3E -M``"-Y00`U.4$`(WE!0#4Y0@`C>4,8(WE````XP``0./^___K!R&@X0=`A.(` -M0(WE!0"@X080H.$"*8+C"#"@X?[__^L!`*#C#P``Z@```.,``$#C_O__ZP4` -MH.,*``#J!B#1Y0(AH.$',('B`#"-Y040H.,"*8+C!#"@X?[__^L&,-3EW#F% -MY0``H.,0T(WB\(&]Z!!`+>D0T$WB`4"@X0`PH.,(,,WE"3#-Y0HPS>4+,,WE -M###-Y0TPS>4#,-'E``!3XP$PT17@.8`5`1#1Y0(Y@>,$(-3D`$"-Y0(A@^$( -M,(WB_O__ZP``H.,0T(WB$("]Z/!`+>D4T$WB`$"@X0!0`.,`4$#C!0"@X?[_ -M_^L```#C``!`XU8]H.,#$)3G_O__ZP```.,``$#C>S4!X],0E.'^___K!`"@ -MX0`0H.,,((WB'#4#XP_@H.$#\)3G````XP``0.,,$)WE_O__ZP```.,``$#C -M>C4!X],0E.'^___K````XP``0.-\-0'C`Q#4Y_[__^L```#C``!`XWTU`>,# -M$-3G_O__ZP4`H.'^___K!`"@X<4>H./^___K`%"@X00`H.%8'`#C_O__ZP`@ -MH.$```#C``!`XP40H.'^___K!`"@X:(=`./^___K`%"@X00`H.&D'0#C_O__ -MZP!@H.$$`*#AIAT`X_[__^L`<*#A!`"@X:@=`./^___K``"-Y0```.,``$#C -M!1"@X08@H.$',*#A_O__ZP0`H.%;&@#C_O__ZP!0H.$$`*#A7!H`X_[__^L` -M(*#A````XP``0.,%$*#A_O__ZQ30C>+P@+WH<$`MZ0!`H.'^___K``!0XP,` -M`!H$`*#A_O__ZP``4.-P@+T(`%"@XY]7Q.6@5\3E%&4#XP0`H.$*$*#C!2"@ -MX0_@H.$&\)3G!`"@X0,0H.,`(`#C`"!`XP_@H.$&\)3G!`"@X9X7U.6@)]3E -MGS?4Y?[__^L$`*#A_O__Z\!9A.4$`*#A!1"@X?[__^NP,@'C`U"$YTD-A.(\ -M`(#B_O__ZW"`O>AP0"WI`%"@X0%`H.'^___KT#25Y0``4^,-```*`3"@X_@U -MA.74-)7E_#6$Y04`H.&I'H7B"A"!XO[__^L``%#C`3"@$PXVQ!4!,*#CW#"$ -MY00``.H`,*#C^#6$Y?PUA.4.-L3EW#"$Y9\WU>4,-L3EH#?5Y0TVQ.4`,*#C -M#S;$Y1`VQ.7$-)7E``!3XP$PH!/<,(05`3"@X]`PA.5P@+WH<$`MZ0C03>(` -M0*#A``!1XPT``*H(((WB`3"@XP$P8N4450/C#!"@XP_@H.$%\)3G!`"@X0,0 -MH.,`(`#C`"!`XP_@H.$%\)3G;```ZL`YD.4#,`/B`0!3XPL``!K^___K`%!0 -MX@@```K8,)7E@S*$X$Q>@^4$`*#AV!"5Y?[__^L$`*#AV!"5Y?[__^M7#83B -M&`"`XJT>A.($$('B_O__ZP!@4.(D```*V#"6Y8,RA.!,;H/E!`"@X0<0H.,! -M(*#C_O__ZP0`H.'^___K%%4#XP0`H.$%$*#CLRZ$X@0@@N(/X*#A!?"4YP0` -MH.$-$*#CIBZ$X@H@@N(/X*#A!?"4YP0`H.%L.@#CLQ"4X?[__^L$`*#A_O__ -MZP0`H.'^___K!`"@X080H.'^___K!`"@X080H.&)___K&@``Z@0`H.$'$*#C -M`2"@X_[__^L$`*#A_O__ZQ15`^,$`*#A!1"@X[,NA.($((+B#^"@X07PE.<$ -M`*#A#1"@XZ8NA.(*((+B#^"@X07PE.<$`*#A;#H`X[,0E.'^___K!`"@X?[_ -M_^L$`*#A_O__ZP@@C>(",*#C`3!BY00`H.$,$*#C%#4#XP_@H.$#\)3GP#F4 -MY0,P`^("`%/C!0``&@0`H.%Y'H3B_O__ZP$@H..P,@'C`R"$YP0`H.$"$*#C -M`""@X_[__^L(T(WB<("]Z/!'+>D`8*#A`7"@X0*`H.$<`*#C_O__ZP!`H.$` -M4*#A``!0X_"'O0@4`*#C_O__ZP"@4.(#```:!`"@X1P0H./^___K\(>]Z!0` -MA.+^___K.#"@X[`PQ.$4,*#C"#"$Y02@A.4`,*#C##"$Y1`PA.4,,*#CL##* -MX0LPH.,",,KE>0Z&X@@`@.+^___K`P#*Y0A`BN($`*#A!Q"@X08@H./^___K -M"("$Y10`G^7^___K2PV&X@@`@.(%$*#A_O__Z_"'O>@8#P``\$$MZ0C03>(` -M8*#A`7"@X;8@S>$<`*#C_O__ZP!`H.$`4*#A``!0XR<```H0`*#C_O__ZP"` -M4.(#```:!`"@X1P0H./^___K'P``ZA0`A.+^___K.#"@X[`PQ.$0,*#C"#"$ -MY02`A.4`,*#C##"$Y1`PA.4(,*#CL##(X0PPH.,",,CE>0Z&X@@`@.+^___K -M`P#(Y0@`B.('$*#A!B"@X_[__^L.`(CB!A"-X@(@H./^___K&`"?Y?[__^M+ -M#8;B"`"`X@00H.'^___K"-"-XO"!O>@X#P``\$$MZ0!@H.$<`*#C_O__ZP!P -MH.$`0*#A``!0X_"!O0@,`*#C_O__ZP!04.(#```:!P"@X1P0H./^___K\(&] -MZ!0`A^+^___K.#"@X[`PQ^$,,*#C"#"'Y010A^4`,*#C##"'Y1`PA^4$,*#C -ML##%X0DPH.,",,7E>0Z&X@@`@.+^___K`P#%Y8PYEN4(,(7E2PV&X@@`@.(' -M$*#A_O__Z_"!O>CP02WI`'"@X0&`H.$<`*#C_O__ZP!0H.$`0*#A``!0X_"! -MO0@Z#J#C_O__ZP!@4.(#```:!0"@X1P0H./^___K\(&]Z!0`A>+^___K.#"@ -MX[`PQ>$Z/J#C"#"%Y01@A>4`,*#C##"%Y1`PA>7F/Z#CL##&X0HPH.,",,;E -M>0Z'X@@`@.+^___K`P#&Y0A0AN(D`(;BK1Z'XM\OH./^___K%("%Y1B`A>4' -M`*#A!1"@X?[__^M+#8?B"`"`X@00H.'^___K\(&]Z'!`+>D`0*#A`5"@X0)@ -MH.&M#H#B_O__ZP`0H.$%`*#A!B"@X_[__^L``%#C%@``"EP`G^5<$)_E_O__ -MZ\`YE.4#(`/B`@!2XP\``!H!"1/C!@``"@`PH./`.83E!`"@X040H.$&(*#A -M_O__ZP8``.HG#!/C!```"@`PH./`.83E!`"@X0$0X./^___K`0"@XW"`O>C` -M"P``N!,``#!`+>D,T$WB`$"@X:U>@.(<.Y#EGC?`Y04`H.'^___K:CH`X[,` -MA.$$`*#A_O__ZP4`H.'^___K`%"@X00`H.$%$*#A_O__ZP$`%>,D```*!`"@ -MX0(0H./^___KU#F4Y0(`4^/,,*`#SS"@$P@@C>(!,&+E!`"@X1$0H.,4-0/C -M#^"@X0/PE.<$`*#AGA?4Y:`GU.6?-]3E_O__ZVHZ`..S`)3A_O__ZP`P`.,` -M,$#C`#"3Y600H..1``'@TRT$XV(@0>.2`8'@20V$XCP`@.(A$X/@_O__ZP(Q -M`./`.83E%P``Z@(`%>,5```*!`"@X0$0H./^___K"""-XC`PX.,!,&+E!`"@ -MX1$0H.,4-0/C#^"@X0/PE.<$`*#AGA?4Y:`GU.6?-]3E_O__ZP0`H.'^___K -M`1"@X\`9A.4$`*#A_O__ZPS0C>(P@+WH\$\MZ0S03>(`<*#A`5"@X0)`H.%P -MD)'E:#"1Y1@P0^($,(WE`PQ3XP``H(.O``"*`@"@X0`0H./?+Z#C_O__ZPA@ -MC>($@#;E?#"(X@`PA.5X@(3E?`"$XA@0B>(((*#A_O__ZV0PE>4T,(3E63#5 -MY74PQ.5<,-7E=##$Y0<`H.$"$*#C=B"$XAPU`^,/X*#A`_"7YXB`A.)X,)3E -M"`"@X0`0H.,&(*#A##!#XO[__^L`H%#B`P``&C@"G^7^___K``"@XXD``.H* -M4*#A`2#UY0``4N,`,*`###"$!00```H0`(3B`A"*XO[__^L`,-7E##"$Y62@ -MA.(*`*#A`!"@XQ`@H./^___K>#"4Y0@`H.$!$*#C!B"@X0PP0^+^___K`%!0 -MX@"PH`,$```*"@"@X0(0A>($()WE_O__ZP2PG>5X,)3E"`"@X3(0H.,&(*#A -M##!#XO[__^L`4%#B`P``"@L`BN`"$(7B!""=Y?[__^L#$*#C/!"$Y7@PE.4( -M`*#A!B"@X0PP0^+^___K`#"@XTPPA.5`,(3E`%!0X@(PU15,,(05$@``&G@P -ME.4(`*#A/1"@XP8@H.$,,$/B_O__ZP!04.(",-453#"$%0@``!J(.9?E`P!3 -MXY`YEP6#,(,``S&'`*0WTP5,,(0%GC?7%4PPA!5\`(3B_O__ZP`0H.%$`(3B -M`B"@X_[__^L$`*#A_O__ZP!0H.$!`!#C!@``"@$PH.-@,(3E!`"$X@H0B>(& -M(*#C_O__ZP4``.H`,*#C8#"$Y00`A.(0$(GB!B"@X_[__^L0`!7C`3"@$S`P -MA!4`,*`#,#"$!0`PH.-(,(3EY3T"XP,PU^0Z&X@,`@.#^___K`P#%Y08`H.$($*#A"""%XO[__^L` -M`%#C!@``&@<`H.$<$*#C_O__ZP4`H.'A'Z#C_O__Z_"!O>A+#8;B"`"`X@<0 -MH.'^___KC#F6Y0$P@^*,.8;E\(&]Z/!!+>D`0*#A<%"1Y?[__^N(.93E`P!3 -MXQ<```JM#H3B_O__ZP`0H.$0`(7B!B"@X_[__^L``%#C#P``"L`YE.4!"1/C -M#```"E<-A.(8`(#B"A"%XO[__^L`0%#B!@``"A4^H./38(3A`0"@XP`0H.,& -M`)#@!Q"AX/,`A.$!`*#C\(&]Z'!`+>D`8*#A_O__ZP!`4.(.```*!@"@X?[_ -M_^L`4%#B!```&@8`H.$$$*#A_O__ZP!`H.,%``#J`S"@XV0PA.5P4(3E$#"5 -MY6PPA.440(7E!`"@X7"`O>CP3RWII-!-X@!`H.&,,(WB`""@XP0@@^0$((/D -M!""#Y``@@^7,-)#E`@!3X;H```K(-)#E`@!3X;<```J`.M#E`0!3X[0```K4 -M`I_EU!*?Y?[__^L$,*#CGS#-Y0`PH..>,,WE3@V$XC@`@.+^___K`'!0XJ@` -M``H$`*#A"!"'XO[__^ML`)?E`!"@XV@@H./^___K;&"7Y090H.$`,*#C*##E -MY0$PQ>6MCH3B"`"@X?[__^L`$*#A+`"&X@8@H./^___K,@"&XLL=A.(A$('B -M!B"@X_[__^L(`*#A_O__ZP`0H.$X`(;B!B"@X_[__^L&(*#AOA/RX9PW`..S -M`)3A#Q`!X@`2@>&P$,+ALR"4X0$@@N*S((3AL##5X?PPP^/0,(/CL##%X0>` -MH.$8,*#C%#"HY4``AN(!$*#CGR"-X@@PH.'^___K`1"@XYX@C>((,*#A_O__ -MZP"PH.',-)3E``!3XP<``-J@,(WB!""@XY`@8^4`@(WE2!"@XP$@H./^___K -M`+"@X10`C>(`$*#C>""@X_[__^O(-)3E``!3XU@``-K^___K#1"@X7\]P>,_ -M,,/C!""3Y0$@@N($((/EA""$X@P@C>6$H)3E`9"@XP1@H.$,`)WE"A"@X?[_ -M_^L!`%#C%P``"@I0H.$`H)KEE#"5Y:0`A>(M$*#C$""-X@PP0^+^___K``!0 -MXP(```H00)WE``!4X^W__QIH,)7E`2!#X@T`4N/I__^*H!"-X@,P@>",D$/E -M%$#=Y0``5.,4D,T%XO__Z@9`H.$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^ -M___K`)"@XPE@H.$!,*#C##"-Y0>@H.$$<*#A%!"-X@DPT>4/(*#CDA8CX`%0H.,,0)WE`2#3Y0$`4N,$```:#P!4XZ`0C=($(('0%%!" -MU0%`A-(!4(7B`3"#X@\`5>/S__\:`("-Y0L`H.%)$*#C!""@X8PPC>+^___K -M`+"@X0%@AN(/D(GB"`!6X]___QH'0*#A"G"@X10PE^48,(?E!`"@X0<0H.'^ -M___KI-"-XO"/O>C`"P``S!,``/!%+>D4L`(?B"A"@X08@H./^___K -M,@"'XLL=A.(A$('B!B"@X_[__^NM#H3B_O__ZP`0H.$X`(?B!B"@X_[__^L' -M(*#AOA/RX9PW`..S`)3A#Q`!X@`2@>&P$,+ALR"4X0$@@N*S((3AL##5X?PP -MP^/0,(/CL##%X0:`H.$8,*#C%#"HY4``A^(!$*#C%R"-X@@PH.'^___K`1"@ -MXP<@C>((,*#A_O__ZP!PH.&T,-WA%U#=Y0,`5>-;```:!R#=Y0$`4N,T```* -M?CK4-0(``#H"`%+C5```&D8``.H!,(/B$/,`/B`S&@X0$Z@^,",(/C&""-XK0P -M8N$"$*#C"#"@X?[__^L8((WB`#"@X[@P8N$"$*#C"#"@X?[__^L`<*#A5PV$ -MXA@`@.(*$*#A_O__ZP!04.('```*M##=X0$'`*#A`A"@XPX@C>((,*#A_O__ZR,``.HJ783B`1"@XP$@A>`( -M,*#A_O__ZP(0H.,$((WB"#"@X?[__^N".@#CLS"4X3\P`^(!.H/C&""-XK0P -M8N$"$*#C"#"@X?[__^L"$*#C!""%X@@PH.'^___K#```ZH,QH.'_,`/B&""- -MXK0P8N$"$*#C"#"@X?[__^L8((WB)3"@X[8P8N$"$*#C"#"@X?[__^L4,);E -M&#"&Y00`H.$&$*#A_O__ZQS0C>+PA;WH\$$MZ0!`H.$!8*#A!'"!XE<-@.(8 -M`(#B!Q"@X?[__^L`4%#B&0``"L`YE.4!"1/C`@``"G0JU.4``%+C`@``&@,P -M`^(#`%/C"P``&@0`H.$'$*#A`""@X[`PUN'^___K`#``XP`P0.,`$)/E8@^% -MXL@0@>+^___K!```Z@`PEN40)M7E`1"@XQ$SPN$0-L7E``"@X_"!O>CX3RWI -M`'"@X0%`H.$"@*#AP#F0Y0,@`^(#`%+C`0``"@$)$^-!```*5PV'XA@`@.(( -M$*#A_O__ZP!04.([```*``!4XQD``!IO7X7B`*``XP"@0.,"D*#C!+"@X01@ -MH.$`,-7E`0!3XPL``!H*`*#A!!"@X?[__^N$,*#A!P"@X0@0H.$)(*#A'C`# -MXO[__^L`L,7E`##@X[(PQ>$!0(3B1%"%XA``5./K__\:'P``Z@$`5.,=```: -M`$"@XP"@`.,`H$#C`I"@XP&PH.,$8*#A#S;5Y5,TH.$!`!/C$```"@H`H.$$ -M$*#A_O__ZX0PH.$!,(/C!P"@X0@0H.$)(*#A'S`#XO[__^L;9.#A#S;5Y0,P -M!N`/-L7E$#;5Y0-@!N`09L7E`4"$XA``5./F__\:`0"@X_B/O>CP1RWI"-!- -MX@"`H.$!8*#AU#"1Y0$P@^+8,('EJ#@DF.40-I;E4S3OYR(T`^!@ -M`!/C`3"@$PXVQA7H))CE$#:6Y5,T[^!`AN((`*#A`!"@ -MXP0@H.'^___K"`"@X0$0H.,$(*#A_O__ZP`0H.,/%L;E$!;&Y14.AN(X(*#C -M_O__ZP``5N-P```*!E"@X0!PH.,'0*#A,`'5Y0``4.,"```*?P``XO[__^L` -M<(?A`4"$X@%0A>(0`%3C]?__&O@UEN4``%/C`)"@`Q\```H(`*#A$Q"@XP<@ -MC>(8-0/C#^"@X0/PF.<'0-WE`@!4XQ#`H`,(P*`3`%"@XV$.H.,!X*#C!T"% -MX@``5>,%0*"AQ$&&X`!`A.`$(-3EQ3^@X:,^H.$#$(7@!Q`!X@$P8^!2,Z#A -M`0`3XPPPA1(>'M__^Z#I;6Y2@QF.4.`%/C!0``FO].Q^/_ -M0L3C``!4XQ1`H!,$0*`#!P``ZO\^Q^/_,L/C``!3XPM`H!,"```:_PX7XP-` -MH!,!0*`#!`"@X?[__^L`4*#A#P+'X_[__^O4$);E'P!1XR,``(H_H`#BV$#6 -MY1]`!.*`0(3C`0!9XPX``!H@0(3C!7Z'X0```.,``$#C!Q"@X00@H.'^___K -M"`"@X0<0H.$$(*#A+#4#XP_@H.$#\)CG0*"*XPL``.H%?H?A````XP``0.,' -M$*#A!""@X?[__^L(`*#A!Q"@X00@H.$L-0/C#^"@X0/PF.=.4<;E3Z'&Y0(` -M`.H```#C``!`X_[__^O^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/ET""6 -MY0$@@N/0((;E!""3Y0$@0N($((/E_O__ZPC0C>+PA[WH$$`MZ4"#!3C -M`3"@$]PP@14`,*`#W#"!!<0TD.4``%/CW#"!!0(+%.,!,*`3^#6!%=PP@14` -M,*`#^#6!!=`TD.4``%/C^#6!!?[__^L0@+WH\$$MZ0C03>(`0*#A`8"@X;8@ -MS>%.#8#B.`"`XO[__^L`4%#B-```"@0`H.$($(7B_O__ZVP`E>4`$*#C:""@ -MX_[__^ML<)7E!V"@X0`PH.,H,.;E`3#&Y2P`A^(($*#A!B"@X_[__^LR`(?B -MRQV$XB$0@>(&(*#C_O__ZZT.A.+^___K`!"@X3@`A^(&(*#C_O__ZP<@H.&^ -M$_+AG#<`X[,`E.$/$`'B`!*!X;`0PN&S()3A`2""XK,@A.&P,-;A_###X\`P -M@^.P,,;A!3"@X1@@H.,4(*/E0`"'X@(0H.,&((WB_O__ZQ0PE>48,(7E!`"@ -MX040H.'^___K"-"-XO"!O>AP0"WI`$"@X0!04>)P@+T("#?5Y0``4^,*```* -M`#"@XP@WQ>50-Y#E`3!#XE`W@.4``%/C`P``&BH0H.,`(*#C`3"@X_[__^L) -M-]7E``!3XPX```H`,*#C"3?%Y50WE.4!,$/B5#>$Y:$GU.4!`%+C!@``F@`` -M4^,$```:!`"@X?\0H.,`(*#C`3"@X_[__^L*-]7E``!3XPX```H`,*#C"C?% -MY5@WE.4!,$/B6#>$Y:$GU.4!`%+C!@``F@``4^,$```:!`"@X?\0H.,`(*#C -M`3"@X_[__^L+-]7E``!3XP`PH!,+-\458#>4%0$P0Q)@-X05##?5Y0``4^,` -M,*`3##?%%<@TE!4!,$,2R#2$%0TWU>4``%/C`#"@$PTWQ15D-Y05`3!#$F0W -MA!4$`*#AOO7_ZP``4.,)``#:!`"@X2T0H.,`(*#C`C"@X?[__^L$`*#A/1"@ -MXP`@H.,!,*#C_O__Z^!@A>($`*#A`!"@XP8@H.'^___K!`"@X0$0H.,&(*#A -M_O__ZP`PH.,/-L7E$#;%Y00`H.$&$*#A`R"@X_[__^O^___K#3"@X7]MP^,_ -M8,;C!#"6Y0$P@^($,(;E!`"@X040H.'^___K!#"6Y0$P0^($,(;E_O__ZW"` -MO>CP3RWI'-!-X@"`H.$7;(#B"&"&X@@W`>,#0)#G#3"@X7^MP^,_H,KC"I"@ -MX4``%/C -M(```"@$P0^(\-H7E``!3XQP``!H+,(7@.":5Y306E>4$(('E`!""Y30VA>4X -M-H7EX!#5Y>$@U>7B,-7EXP#5Y0``C>7D`-7E!`"-Y>4`U>4(`(WE%`"=Y?[_ -M_^O^___K!#":Y0$P@^($,(KE"`"@X040H.'^___K!#"9Y0$P0^($,(GE_O__ -MZP8`H.$$$*#A_O__ZP``4./4__\*%WR(XA<\H.,#0)CGU&D/X_]O3^,8IP'C -M+)8`XP"P`.,`L$#C(@``Z@90A.``0)3E!0"@X?[__^L``%#C"C"8%SPVA14\ -M-I7E``!3XQ@```H!,$/B/#:%Y0``4^,4```:"3"%X#`FE>4L%I7E!""!Y0`0 -M@N4L-H7E,#:%Y>`0U>7A(-7EXC#5Y>,`U>4``(WEY`#5Y00`C>7E`-7E"`"- -MY0L`H.'^___K"`"@X040H.'^___K!P"@X000H.'^___K``!0X]?__PHD`4*#A<$"1Y01PH.$08(3BK0Z`XO[__^L`$*#A!@"@X08@H./^ -M___K``!0XQ4```JX0=3A5`"?Y500G^4$(*#A_O__ZVPPE>40`!/C!P``"E<- -MA>(8`(#B"A"'XO[__^L`$*#A!0"@X?[__^L%``#J!0"@X080H.$$(*#A_O__ -MZP`PH.,0-<7E`0"@X_"!O>A0$```[!,``/!!+>D`4*#A<$"1Y01PH.$08(3B -MK0Z`XO[__^L`$*#A!@"@X08@H./^___K``!0XQ4```JX0=3A5`"?Y500G^4$ -M(*#A_O__ZVPPE>40`!/C!P``"E<-A>(8`(#B"A"'XO[__^L`$*#A!0"@X?[_ -M_^L%``#J!0"@X080H.$$(*#A_O__ZP`PH.,0-<7E`0"@X_"!O>A0$```^!,` -M`/!!+>D(T$WB`&"@X0TPH.&$()_E`P"2Z`0`@^2P$,/A%XR&XA<\H.,#4);G -MU'D/X_]_3^,,``#J!T"%X`!0E>5B/H3B##"#XC`FE.4L%I3E!""!Y0`0@N4L -M-H3E,#:$Y08`H.$$$*#A_O__ZP@`H.$%$*#A_O__ZP``4./M__\*!@"@X0T0 -MH.$#(*#C_O__ZP``H.,(T(WB\(&]Z`04``!P0"WI`$"@X0`PH..(-\#E2RV@ -MXP(PP.?^___K!`"@X?[__^L$`*#A_O__ZP!@H.'^___K#3"@X7]=P^,_4,7C -M!#"5Y0$P@^($,(7E!`"@X080H.'^___K!#"5Y0$P0^($,(7E_O__ZP0`H.'^ -M___K<`>4Y0``4.,#```*?!>4Y?[__^L`,*#C<#>$Y70'E.4``%#C`P``"H`7 -ME.7^___K`#"@XW0WA.5X!Y3E``!0XW"`O0B$%Y3E_O__ZP`PH.-X-X3E<("] -MZ!!`+>D`0*#A'@V`X@@`@.+^___K!`"@X?[__^L0@+WH<$`MZ0!0H.$`0)#E -M``!4XW"`O0@$`*#A_O__ZX@U`^,#,)3G`0!3XW"`O1BK#H7B#`"`XO[__^NN -M#H7B#`"`XO[__^MP@+WH<$`MZ0C03>(`0*#A_O__ZP``4.,$```*!`"@X:T> -MA.($$('B`R"@X_[__^L`4*#CP%F$Y9]7Q.6@5\3E!`"@X040H.'^___K%&4# -MXP0`H.$*$*#C!2"@X0_@H.$&\)3G!`"@X0,0H.,`(`#C`"!`XP_@H.$&\)3G -MP#F4Y0,P`^(#`%/C`0!3$P4``!H(((WB`5!BY00`H.$'$*#C#^"@X0;PE.<` -M4*#CP%F$Y00`H.&>%]3EH"?4Y9\WU.7^___K!`"@X?[__^M)#83B/`"`XO[_ -M_^NP,@'C`U"$YP4`H.$(T(WB<("]Z/!/+>D4T$WB`$"@X0%0H.&MCH#B`7"@ -MX<`YD.4!"1/C%```"@(`$^,"```*!!"(X@,@H./^___K`&"@X\!IA.4$`*#A -M_O__ZTD-A.(\`(#B_O__ZP0`H.$&$*#A_O__ZP0`H.$*$*#C!B"@X10U`^,/ -MX*#A`_"4YP0`H.%V$-?E`""@X_[__^L$`*#A_O__ZP`PH..P(@'C`C"$YY\W -MQ.6@-\3E""5Y4@KA.4##%+C!`"@@U8``(HM?83B#'"'X@<`H.%\$(7B -M_O__ZP<`H.%(&Y3E_O__ZVX*Q.5(.Y3E#`!3XS8``)H,4*#C`8"@X^&=`N,` -ML`#C`+!`XQBAG^4%8(?@`##6Y3T`4^,-```*W0!3XP(```HM`%/C(@``&@8` -M`.H"`(;B"A"@X00@H./^___K``!0XW&*Q!4:``#J=8K$Y1@``.IVBL3E;CK4 -MY0(`4^,4```:"3#4YP``4^,1```*`B"&X@0@C>4!,-+E!``3XPP```J?A\3E -M`3#2Y0,P`^(!`%/CH(?$!00```H#`%/C`""@$Z`GQ!4",*`#H#?$!0L`H.'^ -M___K`3#6Y0(P@^(#4(7@2#N4Y04`4^'.__^*%%4#XP0`H.$#$*#CK2Z$X@0@ -M@N(/X*#A!?"4YP!@H.,0((WB`6!BY00`H.$,$*#C#^"@X07PE.=)#83B/`"` -MXO[__^L$`*#A_O__ZP8`H.$4T(WB\(^]Z(@$``#P1RWI`%"@X0&0H.$"H*#A -M````XP``0..4$9_E_O__ZTX-A>(X`(#B_O__ZP!`4.+PA[T(!0"@X0@0A.+^ -M___KLC'4X0(P@^*R,<3A`3"@XTTPQ.58,,3E`("@XS&`Q.54@,3E;`"4Y0@0 -MH.%H(*#C_O__ZVQ@E.4H8(;B!G"@X0"`QN4!@,;EP#F5Y0,P`^(#`%/C`(#' -M!0(PH`,!,,8%!```"@(`4^,`,*`#`##&!0$PH`,!,,8%5##4Y0``4^,'```* -M`##7Y0$@U^4"-(/A`CJ#XW,P_^8`,,?E(S2@X0$PQ^6R@=3A`H!(X@B`AN`/ -MH`KBL##8X0.@BN%ZH/_FL*#(X5@PU.4!,`/B`S**X7,P_^:P,,CA,2#4Y0,@ -M`N*",H/AL##(X00`A^()$*#A!B"@X_[__^L*`(?BRQV%XB$0@>(&(*#C_O__ -MZZT.A>+^___K`!"@X1``A^(&(*#C_O__Z[8A]^&<-P#CLQ"5X0\@`N(!(H+A -ML"#'X;,@E>$!((+BLR"%X;`PUN'\,,/CR#"#X[`PQN$:,*#C%#"$Y1@PA.4% -M`*#A!!"@X?[__^OPA[WH#!0``/!!+>D`0*#A`8"@X4X-@.(X`(#B_O__ZP!0 -M4.+P@;T(!`"@X0@0A>+^___K;`"5Y0`0H.-H(*#C_O__ZVQPE>4H<(?B!V"@ -MX0`PH.,`,,?E`3#'Y<`YE.4#,`/B`P!3XP0``!H`,*#C`##'Y0(PH.,!,,?E -M!```Z@(`4^,`,*`#`##'!0$PH`,!,,<%``!8XP<```H`,-;E`2#6Y0(T@^$! -M.H/C(&(*#C_O__ZP@`H.'^___K`!"@X1``AN(&(*#C_O__ -MZ[8A]N&<-P#CLQ"4X0\@`N(!(H+AL"#&X;,@E.$!((+BLR"$X;`PU^'\,,/C -M2#"#X[`PQ^$8,*#C%#"%Y1@PA>4$`*#A!1"@X?[__^OP@;WH\$\MZ3303>(` -M0*#A3@V`XC@`@.+^___K`*!0XA\!``H$`*#A"!"*XO[__^ML`)KE`!"@XV@@ -MH./^___K;%":Y05@H.$`<*#C*'#FY0%PQN6MCH3B"`"@X?[__^L`$*#A+`"% -MX@8@H./^___K,@"%XLL=A.(A$('B!B"@X_[__^L(`*#A_O__ZP`0H.$X`(7B -M!B"@X_[__^L%(*#AOA/RX9PW`..S`)3A#Q`!X@`2@>&P$,+ALR"4X0$@@N*S -M((3AL##6X?PPP^.P,,;A0&"%XA@PH.,4,(KE+0V$X@P`@.+^___K`!"@X08` -MH.$"(*#C_O__ZQ0PFN4",(/B%#"*Y3`0C>(#(*#CLB!AX4(`A>("(*#C_O__ -MZQ0PFN4",(/B"B"@X10PHN4(((WEW"J4Y0@PG>4`,(WE1`"%X@<0H.&N/H3B -M_O__ZP!PH.$T.]3E``!3X\T``!H:``#J!C"$X#0[T^4``%/C!```"@8PP>4'`*#A`1"@XP@@ -MH.,%,*#A_O__ZP@PG>4`,(WE,A"@XP@@1N((,(7B_O__ZP"PH.$(``#J`&"@ -MXP@@G>4`((WE!P"@X0$0H.,&(*#A&#"-XO[__^L`L*#AM6Z$X@A@AN(H<(WB -M2#N4Y08`H.$P$*#C!R"@X0PP0^+^___K`%!0X@<```H(,)WE`#"-Y0L`H.$P -M$*#C*""=Y0(PA>+^___K`+"@X=`TE.4!`%/C1```&D@[E.4&`*#A+1"@XP<@ -MH.$,,$/B_O__ZP!04.(\```*!`"@X?[__^L``%#C.```&JD.A.(*`(#B`A"% -MXB`@H./^___KX3T"XP,PU.<``%/CFCH``[,@E`%"(,(#LR"$`9HZ`!.S()01 -M`B""$[,@A!&:.@#CLR"4X0P@@N.S((3A!`"@X1,0H.,G((WB#XP_@H.$# -M\)3G)U#=Y0,`5>,)```:FCH`X[,@E.$!+(+CLR"$X:D.A.(-`(#BH!&?Y1`@ -MH./^___K"```ZIHZ`..S()3A`BR"X[,@A.&I#H3B#0"`XGP1G^40(*#C_O__ -MZP@@G>4`((WE"P"@X2T0H.,H()WEJ3Z$X@HP@^+^___K`+"@X4@[E.4,`%/C -M.0``FBV-A.(,@(CB#&"@XP`P`.,`,$#CA""#XA`@C>4$D*#CC""#X@P@C>6( -M,(/B%#"-Y01PH.$&4(C@`##5Y=T`4^,A```:`D"%X@0`H.$0$)WE"2"@X?[_ -M_^L``%#C"P``&@0`H.$4$)WE"2"@X?[__^L``%#C!0``&@0`H.$,$)WE"2"@ -MX?[__^L``%#C#@``"@0`H.$,$)WE"2"@X?[__^L``%#C#C"@$P$PQ14!(-7E -M"#"=Y0`PC>4+`*#AW1"@XP(PA>+^___K`+"@X0$PU>4",(/B`V"&X$@[E^4& -M`%/AT___B@=`H.%N.M3E!0!3XP<``!H(()WE`""-Y0L`H.'=$*#C!B"@XP`P -M`.,`,$#C_O__ZQ0PFN48,(KE!`"@X0H0H.'^___K`P``ZC`0C>(8,&'E`6"@ -MXR[__^HTT(WB\(^]Z)`$``"@!```<$`MZ0!0H.%)38#B/$"$X@0`H.'^___K -MP#F5Y0,\P^,).X/CP#F%Y04`H.'^___K`#``XP`P0.,`$)/E!`"@X1X0@>+^ -M___K<("]Z/!/+>DDT$WB`$"@X0)PH.$#H*#AOA#-X0```.,``$#C[!.?Y?[_ -M_^M.#83B.`"`XO[__^L`8%#B\P``"@0`H.$($(;B_O__ZVP`EN4`$*#C:""@ -MX_[__^ML4);E*("%X@B0H.$`,*#C`##(Y0$PR.4L`(7BX!"'X@8@H./^___K -M,@"%XLL=A.(A$('B!B"@X_[__^NM#H3B_O__ZP`0H.$X`(7B!B"@X_[__^N^ -M(_7AG#<`X[,0E.$/(`+B`2*"X;`@Q>&S()3A`2""XK,@A.$P`%KC$`!:$\L` -M`!HMO83B#+"+X@`PV.4!(-CE`C2#X?PPP^,#H(KA>J#_Y@"@R.4JI*#A`:#( -MY1@0H..R$<;A%#"6Y1@P@^(&H*#A%#"JY1B`B.(+`*#A_O__ZR!0C>*P`-#A -ML@!EX0@`H.$"$*#C!2"@X0HPH.'^___K`A"@XPX@C>(*,*#A_O__Z[0]U^$# -M.8/COC'-X0(0H.,%(*#A"C"@X?[__^L`4*#A0"&7Y0@`4N,%``"*`*"-Y0$0 -MH.,3/H?B_O__ZP@`C>4+``#J`*"-Y0$0H.,((*#C$SZ'XO[__^M`(9?E`*"- -MY3(0H.,(($+B3C^'XO[__^L(`(WES#:7Y0(+$^,V```*T#24Y0``4^,S```* -M(%"-X@`PH.,(,"7E#("+XD@[E.4(`*#A+1"@XP4@H.$,,$/B_O__ZP"04.(/ -M```*&""=Y0``4N,,```*"`"=Y0D0H.$"((+B_O__ZQ@PG>4"((/B"!"=Y0(0 -M@>`($(WE%""6Y0(P@^`",(/B%#"&Y4@[E.4(`*#A/1"@XP4@H.$,,$/B_O__ -MZP!04.(/```*&""=Y0``4N,,```*"`"=Y040H.$"((+B_O__ZQ@PG>4"((/B -M"!"=Y0(0@>`($(WE%""6Y0(P@^`",(/B%#"&Y#^___K`%!0 -MXA<```H"`(7B"1"@X0L@H.'^___K``!0XRX```H(`)WE!1"@X1A0G>4"((7B -M_O__ZQ@PG>4"((/B"!"=Y0(0@>`($(WE%""6Y0(P@^`",(/B%#"&Y0(``.H" -M,(/B`U"%X-W__^IN.M3E!0!3XP<``!H`H(WE"`"=Y=T0H.,&(*#C`#``XP`P -M0./^___K"`"-Y7@7E.4``%'C"```"H0GE.4``%+C!0``"@@`G>7^___K%""6 -MY80WE.4#,(+@%#"&Y10PEN48,(;E!`"@X080H.'^___K`P``ZA@PG>4``%/C -MW/__&M[__^HDT(WB\(^]Z"`4```P%```\$\MZ1303>(`0*#A`8"@X0*@H.%. -M#8#B.`"`XO[__^L`8%#BN@``"@0`H.$($(;B_O__ZVP`EN4`$*#C:""@X_[_ -M_^MLD);E"7"@X0`PH.,H,.?E`3#'Y0D@H.&^$_+AG#<`X[,`E.$/$`'B`!*! -MX;`0PN&S()3A`2""XK,@A.&P,-?A_###X[`P@^.P,,?A0)")XA@PH.,4,(;E -M``!8XS@```H$`(?BX!"(X@8@H./^___KRUV$XB%0A>(*`(?B!1"@X08@H./^ -M___K$`"'X@40H.$&(*#C_O__ZT2VF.5[L/_F"S"@X;JPS>$``%KC`+"@$PLP -MH!&Z,,T1`0``&@"P6^(!L*`3"G"-XA10AN()`*#A`A"@XP<@H.$%,*#A_O__ -MZT`VF.6Z,,WA`A"@XP<@H.$%,*#A_O__Z[J@S>$"$*#C!R"@X04PH.'^___K -M`'"@X4`VF.4"`%/C9```&M`PF.6C-!O@80``"@!0C>40$*#C@""@XQD]B.(( -M,(/B_O__ZUH``.JM7H3B!0"@X?[__^L`$*#A!`"'X@8@H./^___K"@"'XLL= -MA.(A$('B!B"@X_[__^L%`*#A_O__ZP`0H.$0`(?B!B"@X_[__^O4N93E`0!; -MXP"PH!,!L*`#NK#-X=`YE.4#`%/C$```&L`YE.6C-!O@#0``"N0YE.7@&93E -M`1^#X1`@C>($$"+E`3"#XN0YA.4)`*#A!!"@XQ0PAN+^___K`)"@X00PH.,> -M,,;E"H"-XA10AN()`*#A`A"@XP@@H.$%,*#A_O__Z]`YE.6Z,,WA`A"@XP@@ -MH.$%,*#A_O__Z[J@S>$"$*#C"""@X04PH.'^___K`("@X=`YE.4#`%/C&0`` -M&L`YE.6C-!O@%@``"@!0C>40$*#C@""@XYX^A.((,(/B_O__ZP`PU^4!(-?E -M`C2#X0$Y@^-S,/_F`##'Y2,TH.$!,,?E&#"@X[(QQN$!,*#C'3#&Y00PH.,? -M,,;E%#"6Y00P@^(4,(;E%#"6Y1@PAN4$`*#A!A"@X?[__^L$`*#A!A"@X?[_ -M_^L4T(WB\(^]Z!!`+>D`0*#AP#F0Y0$,$^,'```*_`"?Y?[__^L`,*#CP#F$ -MY00`H.$"$.#C_O__ZQ"`O>@"#!/C'P``"L0YD.4!,(/BQ#F`Y0(`4^,+``": -MU#F0Y0,`4^,$```*`#"@X\`Y@.4`$.#C_O__ZQ"`O>@!,*#CU#F`Y0`PH./$ -M.8#EE`"?Y?[__^L!,*#CT#F$Y00`H.$`$*#C`2"@X?[__^MX,)_E`!"3Y4D- -MA.(\`(#B'A"!XO[__^L0@+WH`@H3XQ"`O0C(.9#E`3"#XL@Y@.4"`%/C!``` -MF@`PH./`.8#E`1#@X_[__^L0@+WH,`"?Y?[__^L$`*#A_O__ZQPPG^4`$)/E -M20V$XCP`@.(>$('B_O__ZQ"`O>B0$```O!````````#H$```<$`MZ0!`H.%) -M78#B/%"%X@4`H.'^___KP#F4Y0$\P^,"/(/CP#F$Y0$PH./0.83E`""@X\0I -MA.7(*83ES"F$Y00`H.$"$*#A_O__ZP`P`.,`,$#C`!"3Y04`H.$>$('B_O__ -MZW"`O>CP02WI"-!-X@!PH.%P0)'E:("1Y,=```:U#F7 -MY0$`4^,?```:'@"$XA`0H.,$((WB'C!(XO[__^L`0%#B'@``"IX.A^((`(#B -M`A"$X@0@G>7^___K`S"@X]`YA^4'`*#A`!"@XP$@H.'^___K`#``XP`P0.,` -M$)/E20V'XCP`@.(>$('B_O__ZP$`H.,+``#J!`!5XP@``!K4.9?E`0!3XP4` -M`!H'`*#A_O__ZP$`H.,"``#J`0"@XP```.H``*#C"-"-XO"!O>@8$0``\$4M -MZ2S03>(`0*#A`5"@X0`PH.,4,(WE##"-XNPAG^4#`)+H!`"#Y+`0P^%.#83B -M.`"`XO[__^L`8%#B<0``"@0`H.$($(;B_O__ZVP`EN4`$*#C:""@X_[__^ML -M<);E*'"'X@>`H.'+K83B(:"*X@`PH.,`,,?E`3#'Y0,`5>$-```:K5Z$X@4` -MH.'^___K`!"@X00`A^(&(*#C_O__ZP4`H.'^___K`!"@X1``A^(&(*#C_O__ -MZP@``.H,4(WB!`"'X@40H.$&(*#C_O__ZQ``A^(%$*#A!B"@X_[__^L*`(CB -M"A"@X08@H./^___KMB'XX9PW`..S$)3A#R`"X@$B@N&P(,CALR"4X0$@@N*S -M((3AL##7X?PPP^-`,(/CN#''X`90H.$8,*#C%#"EY9@IE.4`4(WE!P"@X0`0 -MH..9/H3B##"#XO[__^L`<*#A!`"@X1@0C>(4((WB_O__ZQ0@G>4(`%+C#@`` -MVAB`C>(`4(WE!P"@X0$0H.,((*#C"#"@X?[__^L`4(WE,A"@XQ10G>4(($7B -M"#"(XO[__^L`4*#A!0``Z@!0C>4'`*#A`1"@XQ@PC>+^___K`%"@X4PGE.4! -M$$+B_C$`XP,`4>$'``"*!0"@X14=A.(+$('B_O__ZQ0@EN5,-Y3E`S""X!0P -MAN44,);E&#"&Y00`H.$&$*#A_O__ZRS0C>+PA;WH.!0``/A/+>D`4*#A_O__ -MZP``4.-X```*4S8#XP,PU><``%/C`0``"@4`H.'^___KK6Z%X@1@AN)7#87B -M&`"`X@80H.'^___K`$!0XOB/O0A:/Z#C%2Z@XP,`E.<"$)3G`0!0X3D``!H$ -M$*#C`B"$X`,PA.`!`)/G`3"2YP,`4.$R```:M#(!XP,PE>76/:#C`S"5YP``4^,!```*!0"@X3/_+^$%`*#A`!"@X_[__^L%`*#A -M`!"@X_[__^L%`*#A`!"@X_[__^NT,@'C`R"5YP$@@N(#((7G`2"@X[`R`>,# -M((7G%```Z@!`H..T,@'C`T"%YX`!G^7^___K!0"@X080H.'_+P_C_O__Z\Q) -MA>7XC[WH`""@X[0R`>,#((7G%3Z@X],`A.%:/Z#C\P"$X0$@H..P,@'C`R"% -MY\PYE>4!((/BS"F%Y0``4^,$```:(#0!X],`A>$X-`'C\P"%X?B/O>@/`!+C -M^(^]&#@T`>,@)`'C`P"5YP(0E>/S`(7A^(^]Z`4` -MH.'^___K``!0X_B/O0CI3H7B27V%XA!PA^(`H*#C%8Z@XP20H./_OP_C`#"4 -MY0$`4^,9```:!&`4Y0``5N,6```*!#"4Y0@@EN<#`%+A#P``&@@PAN`),)/G -M"@!3X0L``!H(,)3E`@!3XP$P@Y((,(25"0``F@B@A.4`H(3E!0"@X>`0AN(+ -M(*#A_O__ZP(``.H(H(3E"#"6YP0PA.4@0(3B!P!4X=___QH!(*#CL#(!XP,@ -MA>?XC[WH-!$``'!`+>D(T$WB`$"@X9`YD.6#((/@`B&`X'HN@N($4-+E"&"2 -MY0``5>,A```*``!3XP0``!H%$*#A`""@XP(PH.'^___K`0``Z@40H.'^___K -ME#F4Y0$`4^,!`%8#!0``&@0`H.$!$*#C_O__ZP0`H.$!$*#C_O__ZP`P`.,` -M,$#C`#"3Y:PB`>.R()3A9!"@XY$"`>#3+03C8B!!XY(!@>!)#83B#`"`XB$3 -M@^#^___K/```ZC`U`^,/X*#A`_"4YP``4.,.```*`#"@XXPYA.4`,.#CD#F$ -MY:PR`>,R(*#CLR"$X0`P`.,`,$#C`!"3Y4D-A.(,`(#B!1"!XO[__^LH``#J -M!#"@XX@YA.4$`*#AGA?4Y:`GU.6?-]3E_O__ZP@@C>(`,*#C`3!BY00`H.$+ -M$*#C%#4#XP_@H.$#\)3GP!G4Y00`H.$#$`'B_O__ZP0`H.'^___K!`"@X?[_ -M_^L!`%#C`@``&@0`H.$`$*#C_O__ZP0`H.'^___KK#(!XV0`H..S`(3A`#"@ -MXX@YA.4$`*#A9O3_ZP0`H.%D]/_K!`"@X6+T_^L(T(WB<("]Z#!`+>D,T$WB -M`$"@X8@YD.4``%/C*@``&@%0H.$!,*#CB#F`Y0`PH..,.8#ED#F`Y0@@D>4# -M`%+A!```"ID.@.(,`(#B#!"!XO[__^L$``#JF0Z`X@P`@.(`$*#C(2"@X_[_ -M_^L(,)7EF#F$Y0`PE>64.83E!`"@X?[__^L!`%#C#P``&@(PH..(.83E!`"@ -MX0$0H./^___K!`"@X0$0H./^___K`#``XP`P0.,`$)/E20V$X@P`@.(%$('B -M_O__ZQ@``.J(.93E`3!#X@$`4^,2``"*!`"@X?[__^L$`*#A`!"@XP$@H.'^ -M___K!`"@X0`0H./^___K"""-X@$PH.,!,&+E!`"@X0L0H.,4-0/C#^"@X0/P -ME.<#,*#CB#F$Y00`H.'^___K``"@XPS0C>(P@+WH\$\MZ1S03>(`0*#A`8"@ -MX4X-@.(X`(#B_O__ZP!@4.(#```:3`.?Y4P3G^7^___KS@``Z@0`H.$($(;B -M_O__ZVP`EN4`$*#C:""@X_[__^ML<);E!U"@X0`PH.,H,.7E`3#%Y2P`A^(( -M$*#A!B"@X_[__^LR`(?BRQV$XB$0@>(&(*#C_O__ZS@`A^*M'H3B!!"!X@8@ -MH./^___KOB/WX9PW`..S$)3A#R`"X@$B@N&P(,?ALR"4X0$@@N*S((3A`##5 -MY0$@U>4"-(/A_###XP,XH.$C.*#A4#"#XP`PQ>4C-*#A`3#%Y1@PH..R,<;A -M%#"&Y4@;E.4##%'CFP``B@-PA>#`.93E`S`#X@,`4^-"```:+0V$X@P`@.(` -M(*#C%#"-XO[__^MT-Y3E`)"@X0``4^,``%`3+@``"A2`G>4``%CC*P``"BT= -MA.(,$('B`*!AX$B[E.4+L&K@"[!HX`<`H.$*(*#A_O__ZPIPA^`4,);E"C"# -MX!0PAN5T-Y3E`2#3Y10@C>4"((+B"C""X`,,4^,)``"*!P"@X707E.7^___K -M%#"=Y0(@@^("<(?@%""6Y0(P@^`",(/B%#"&Y110G>4"4(7B"J"%X`N@BN`# -M#%KC8```B@<`H.$($(G@"R"@X?[__^L4,);E"["#X!2PAN58``#J!P"@X2T= -MA.(,$('B2"N4Y?[__^L4();E2#N4Y0,P@N`4,(;E3@``Z@B`A^(@,*#C%#"& -MY2U=A.(,4(7B!0"@X?[__^L`$*#A"`"@X0(@H./^___K"H"'XA0PEN4",(/B -M%#"&Y04`H.'^___K`!"@X0@`H.$"(*#C_O__ZQ0PEN4",(/B!E"@X10PI>7< -M*I3E`%"-Y0P`A^(`$*#CKCZ$XO[__^L`H*#ALWZ$X@1PA^('`*#A_O__ZP"` -MH.$`4(WE"@"@X0$0H.,(`%CC"""@,0@@H",',*#A_O__ZP!0C>4#$*#C`2"@ -MX[$^A.(,,(/B_O__ZP!PH.'`.93E`S`#X@$`4^,-```:`""@XQ,@S>48,(WB -M#"`CY0!0C>4&$*#C`B"@X_[__^L`4(WE*A"@XP$@H.,3,(WB_O__ZP!PH.$( -M`%CC!@``F@!0C>4'`*#A,A"@XP@@2.*S/H3B##"#XO[__^L4,);E&#"&Y00` -MH.$&$*#A_O__ZQS0C>+PC[WH7!$``$`4``#P0"WI#-!-X@!`H.%P8)'E:%"1 -MY6PPD.4(`!/C)0``&@$`$^,!```:4``3XR$```H8`(;B`!"@XP0@C>(8,$7B -M_O__ZP!P4.(:```*!%"=Y0``5>,%```*`@"'XJX>A.+<*I3E_O__ZP``4.,1 -M```*L"#6X0$,$N,",*`3`#"@`](DX.<",(/A`0!3XQ!@A@($```*"F"&,@(` -M`#H"`%/C&&"&$@I@A@($`*#A!A"@X0`@H./^___K`0"@XPS0C>+P@+WH\$4M -MZ1S03>(`4*#A$#"-XIPBG^4#`)+H!`"#Y+`0P^%.#87B.`"`XO[__^L`0%#B -M`P``&GP"G^5\$I_E_O__ZYD``.K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($ -M((/E!0"@X0@0A.+^___K$#"@XU(A$('B!B"@ -MX_[__^NM#H7B_O__ZP`0H.$X`(?B!B"@X_[__^L',*#AOB/SX0\@`N*P(,/A -ML##6X?PPP^.`,(/CL##&X4!PA^(8,*#C%#"$Y<`YE>4#,`/B`P!3XPD``!H' -M`*#A+1V%X@P0@>)(*Y7E_O__ZQ0@E.5(.Y7E`S""X!0PA.5(``#J"("'XB`P -MH.,4,(3E+6V%X@Q@AN(&`*#A_O__ZP`0H.$(`*#A`B"@X_[__^L*@(?B%#"4 -MY0(P@^(4,(3E!@"@X?[__^L`$*#A"`"@X0(@H./^___K%#"4Y0(P@^($8*#A -M%#"FY=PJE>4`8(WE#`"'X@`0H..N/H7B_O__ZP"@H.&S?H7B!'"'X@<`H.'^ -M___K`("@X0!@C>4*`*#A`1"@XP@`6.,((*`Q"""@(P48,(WB$"`CY0!@C>4&$*#C`B"@ -MX_[__^L`8(WE*A"@XP$@H.,/,(WB_O__ZP!PH.$(`%CC!0``F@!@C>4R$*#C -M""!(XK,^A>(,,(/B_O__ZP`PH..(-\7E#2"@X7\]PN,_,,/C!""3Y0$@0N($ -M((/E_O__ZQ0PE.4@((/B`@Q2XP(``)HH`)_E_O__ZP,``.H8,(3E!0"@X000 -MH.'^___K'-"-XO"%O>A0%```7!$``%@4``!X$0``\$4MZ0S03>(`0*#A`&"@ -MXPAPC>(!8&?E&(4#XQ*@H.,$`*#A_O__ZP0`H.$*$*#A!R"@X0_@H.$(\)3G -M!U#=Y0``5>,#```:`6"&XF4`5N/R__\:!0``ZF0`5N,#```:%`"?Y?[__^L` -M`*#C````Z@$`H.,,T(WB\(6]Z)`1``#P1RWI$-!-X@!`H.'+^___K``!0XP$@H`-+/:`#`R#$ -M!\0TE.4``%/C`3"@$W$ZQ!70-)3E``!3XP$PH!-Q.L05=#K$%=@PE.4!`%/C -M`0``"@0`H.'^___K!`"@X0,0H./^___K%&4#XP0`H.$#$*#CX""$X@_@H.$& -M\)3G$%"-XA4$`*#A'1"@ -MXP4@H.$/X*#A!O"4YT0T"N,(,(WE!`"@X1X0H.,%(*#A#^"@X0;PE.>H-P'C -M`S"4YP(`4^/,,*`#SS"@$Q`@C>(!,&+E!`"@X1$0H.,/X*#A!O"4YP0`H.$- -M$*#C#""-X@_@H.$&\)3GV#"4Y0$`4^,#```*!`"@X0<0H.,!(*#C_O__ZU0Q -ME.59#X3B/1"@XP0@C>(,,$/B_O__ZP!@4.(5```*!%"=Y0``5>,2```*X3T" -MXP,PU.<``%/C#@``"@,PUN4$`!/C"P``"@,P`^(!($/B`@!2XP!0H(,!8*"# -M`3!#D@`@`),`($"3`R""D)AETI6<5=*5`0``Z@!0H.,%8*#A!`"@X0<0H.$% -M(*#A!C"@X?[__^L```#C``!`XP<0H.$&(*#A!3"@X?[__^N>=\3EGV?$Y:!7 -MQ.7(,)3EH3?$Y0@`H.$*$*#AW""4Y?[__^M+/:#C`S#4YP$`4^,*```:!`"@ -MX040H.,`(*#C`C"@X?[__^L$`*#A_O__ZP``4.,!```:9`&?Y?[__^L$`*#A -M_O__ZP"`4.)/```*`!"@X]00B.4!8*#CV&"(Y=P0B.7X%8CEZ!"(Y14.B.(X -M(*#C_O__ZP5=A.(%`*#A_O__ZP!PH.$%`*#A!Q"@X08@H.'^___K$PZ(X@40 -MH.$'(*#A_O__ZT!QB.4``%?C"@``V@A0H.$`8*#C,`'5Y0``4.,!```*?P`` -MXO[__^L!8(;B`5"%X@8`5^'V___**`&4Y0X`4.,5;J"##V"@DPX`4.,$`*"# -M`0"@D_[__^L`H*#A!@"@X?[__^L`D*#AV%#8Y1]0!>*`<(7C"EZ&X0```.,` -M`$#C!1"@X0<@H.'^___K!`"@X040H.$'(*#A+#4#XP_@H.$#\)3G3J'(Y3^0 -M">)/D]Z,`1``#X3RWI -M`'"@X?[__^L``%#C`P``&A`!G^7^___K!`"@X_B/O>@'`*#A_O__ZP!@4.([ -M```*GC4`4(/E`$"$Y01`A.7,,);E`3!#XLPPAN4``%/C -M5(#$%0LPH`%4,,0%5H#$Y0<`H.$$$*#A#^"@X0GPE^C`$0``,$`MZ0S03>(`0*#A`5"@ -MX0```.,``$#CP!"?Y?[__^O`.93E`R`#X@$`4N,=```:`0D3XQ,``!H$`*#A -M>1Z$XO[__^L$`*#A_O__ZP``4.,)```:V#"5Y8,RA.`Y/8/B"#"#X@`@H.,( -M((/EP#F4Y0$P(^+`.83E%@``ZL`YE.4!.8/CP#F$Y0@@C>(",*#C`3!BY00` -MH.$,$*#C%#4#XP_@H.$#\)3GV#"5Y8,RA.!,7H/E!`"@X=@0E>7^___K!`"@ -MX040H.&A[?_K`2"@X[`R`>,#((3G#-"-XC"`O>AP%```,$`MZ0S03>(`0*#A -MK5Z`XAP[D.6>-\#E!0"@X?[__^MJ.@#CLP"$X00`H.'^___K!0"@X?[__^L` -M4*#A!`"@X040H.'^___K`@`5XS$```H(((WB,##@XP$P8N4$`*#A$1"@XQ0U -M`^,/X*#A`_"4YP0`H.&>%]3E`""@XP(PH.'^___K!`"@X?[__^L!$*#CP!F$ -MY00`H.'^___K!`"@X?[__^L``%#C!0``&@0`H.$`$.#C_O__ZP`PH./`.83E -M%P``ZA15`^,$`*#A`Q"@XZDMA.(H((+B#^"@X07PE.<(((WB`#"@XP(P8N4$ -M`*#A#!"@XP_@H.$%\)3G!`"@X0$0H./^___KP#F4Y0$Y@^/`.83E`@``Z@P` -MG^4%$*#A_O__ZPS0C>(P@+WH'!(``'!`+>D`0*#A`6"@X6`PD>4$`%/C*@`` -M"@``4^,H```:_O__ZP!0H..P,@'C`U"$YY]7Q.6@5\3E@``*#C<("] -MZ/!!+>D`4*#A<$"1Y01@H.'+#8#B(0"`X@00A.(&(*#C_O__ZP``4.-H```* -MP#F5Y0,@`^(#`%+C`0``"@$)$^-B```*"G"&XE<-A>(8`(#B!Q"@X?[__^L` -M@%#B6P``"@1@H.$8,/;E`P!3XU<``!IT.M7E``!3XU0```H!,-;E`0!3XQP` -M``H"```Z`@!3XTX``!HM``#J*DV%X@%`A.($`*#A`A"&X@<@H./^___K!0"@ -MX000H.$'(*#A_O__ZW\ZU>4!`%/C!0``&@4`H.$'$*#A`2"@XP`PH./^___K -M.@``Z@4`H.$'$*#A`2"@XR4PH./^___K-```Z@5`UN540>+G!"#6Y0,PUN4" -M-)/A"0``&@$PH.,3-*#ARK5Y00PH.'^___K`0"@X_"!O>B0%```^$\MZ0!PH.%P8)'E:("1Y$``%3C!@``"@P"G^4$$*#A_O__ZP`PH./` -M.8?E`[#@XW@``.JX,=7A;"H`X[(PA^$!"Q/C"3"@$Q0PH`-O.L?EO+'5X0NY -MH.$KN:#A:#H`X[.PA^$>`%CC*```FAY`H..XH9_E!I"@XP10AN``,-7E+0!3 -MXQ$```H"``"**@!3XQD``!H5``#J/0!3XP\```K=`%/C%```&@(`A>(*$*#A -M"2"@X?[__^L``%#C#@``"@<`H.$%$*#A_O__ZPH``.H'`*#A!1"@X?[__^L& -M``#J!P"@X040H.'^___K`@``Z@<`H.$%$*#A_O__ZP$PU>4",(/B`T"$X`0` -M6.'9__^*P#F7Y0(ZP^,!.8/CP#F'Y;,.A^($`(#B`#"@XW_`X.,#$-#G?R`! -MX@(@0N(N`%+C`O&?ES```.H8"`$`(`@!`!@(`0`@"`$`(`@!`"`(`0`@"`$` -M(`@!`"`(`0`8"`$`&`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`(`0`@ -M"`$`(`@!`!@(`0`@"`$`&`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`( -M`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@!`"`(`0`@"`$`(`@! -M`"`(`0`@"`$`(`@!`"`(`0`@"`$`&`@!``P0@>$#$,#G`3"#XA``4^/%__\: -M!P"@X0L0H.'^___K`0"@X_B/O>A8$@``L`0``/!/+>G\T$WB`$"@X0$@H.$X -M,(WB:!B?Y0,`D>@$`(/DL!##X7!0DN5H8)+EP#F4Y0,P`^(#`%/C``"@$P8" -M`!JPH-7A_*`:X@2`H`,*@*`3`'!:X@%PH!,8,(CB`P!6X04``"H<")_E!Q"@ -MX08@H.'^___K``"@X_40,(WEX`>?Y>`7G^7^___KT#"9Y0$+$^,!.\,3`CJ#$]`PB14$ -M```:`0D3XP$YPQ,".H,3T#")%<(PV>7C`-GE``"-Y>0`V>4$`(WEY0#9Y0@`C>5$!Y_E -M_O__ZP%@H..O`0#J$&"-Y0@`H.$`$*#C-""-X@8PH.'^___K`&"@X310G>4` -M`%7CI`$`"@(`@.*N'H3BW"J4Y?[__^L``%#C`6"@`P$```H!8';B`&"@,]PZ -ME.4T4)WE`P!5X97^___K`%!0 -MX@,``!JX!I_E_O__ZP%@AN*+`0#J)`"-X@(0A>(T()WE_O__Z_@@C>+$<#+E -M"`"@X3(0H.,0,)WE_O__ZP!04.((```*$`!7XP8``(HD`(WB!P"`X`(0A>(T -M()WE_O__ZS10G>4%<(?@0'&)Y1,.B>(D$(WB!R"@X?[__^L`$*#CT!:)Y=06 -MB>78%HGEW!:)Y>`6B>7D%HGE;CZ)X@@P@^(4,(WE`P"@X2`@H./^___KY#@! -MXP,PE.<"`!/C(@``"I@@G>4``%+C'P``"@`PH.,<,(WE(#"-Y0)PH.&4(,(/B`S"4YR!0G>4#,`7@Y#:)Y0`` -M4N,I8*`#``!3XU$!``HC``#J`0`3XU(!``J0,)WE``!3XT\!``H`,*#C(#"- -MY1PPC>60<)WEE+#=Y0(`1^("$(OB(""-XAPPC>+^___K`0!0XT$!`!H!,*#C -MT#:)Y=0VF>4!,(/CU#:)Y>@X`>,#()3G(%"=Y0(@!>#8)HGE"#"#X@,PE.<< -M4)WE`S`%X.`VB>4``%+C*6"@`P``4^,L`0`*``!6XQ4``%?C#@``&K`PG>4``%/C!0``"KP$G^7^___KS#:9Y0$Z@^/,-HGE"P`` -MZJ@$G^7^___KS#:9Y0(Z@^/,-HGE!0``Z@(@B^(4`)WE`A!'XB``4N,@(*`C -M_O__Z\PVF>4"/,/CS#:)Y0`PH./<,(GE%#?)Y0$@H.,:)\GE&3?)Y1@WR>47 -M-\GE%C?)Y<0TE.4``%/C/P``"OBPC>(`,*#CQ#`KY0APH.'=@*#C!P"@X0@0 -MH.$+(*#A$#"=Y?[__^L`<%#B,P``"@(`A^(X$(WB!B"@X_[__^L``%#C*0`` -M"LPVF>4"/(/CS#:)Y0$PH./<,(GE"##7Y10WR>73(N'G%2?)Y0\P`^(/`%/C -M`3"@$QHWR14`,*`#&C?)!10WV>4/`!/C&P``"@$`$^,#,*`3&3?)%0`PH`,9 -M-\D%%#?9Y0(`$^,#,*`3&#?)%0`PH`,8-\D%%#?9Y00`$^,#,*`3%C?)%0`P -MH`,6-\D%%#?9Y0@`$^,#,*`3%S?)%0`PH`,7-\D%`P``ZC10G>4"4(7B!7"' -MX,3__^IA7HGB`5"%X@4`H.$`$*#C&B"@X_[__^O@,)WE``!3XPH```KD,-WE -M&0!3XP<``)K,-IGE"CR#X\PVB>4%`*#AX!"=Y1H@H./^___K`@``ZLPVF>4" -M.\/CS#:)Y=`TE.4``%/C`P``&LPVF>4""Q/CD```&A,``.K,-IGE`@L3XQ`` -M``KD-IGE"``3XP(``!K@-IGE"``3XPH```K@$-GEX2#9Y>(PV>7C`-GE``"- -MY>0`V>4$`(WEY0#9Y0@`C>6``I_E_O__Z\PFF>4"(8+CS":)Y4`1F>4),*#A -M`%"@XP<``.HP`=/E?P``X@$P@^(6`%#C`B'"P\PFB<4"``#*`5"%X@4`4>'U -M__^*R#8`X[,PF>$@`!/CS#:9%8`P@Q/,-HD5S#:9!8`PPP/,-HD%U!"9Y0`` -M4>,"```*"`*?Y?[__^L<``#J`3"@X]0PB>7%)0#C`A"#X`$1A.`$$)'E``!1 -MXP,```H!,(/BU#")Y2``4^/V__^:H"(%`*#A_O__ZP``4.,%```:.#:9Y30F -MF>4$,(+E`""#Y316B>4X5HGE8EZ)X@Q0A>(%`*#A_O__ZP``4.,%```*&#`0B>+4()GE_O__ZP``6N,&```:!`"@X080H.$) -M(*#A$#"@X_[__^L!`*#C'@``Z@0`H.$&$*#A"2"@X3`PH./^___K`0"@XQ<` -M`.H$`*#A!Q"@X08@H./^___K``"@XQ$``.H!8*#C`#"@X]0PB>4#`%KA!@`` -M&@0`H.$&$*#A"2"@X1`P@^+^___K``"@XP4``.H$`*#A!A"@X0D@H.$P,*#C -M_O__ZP``H./\T(WB\(^]Z"I@H./J___J*&"@X^C__^K,-IGE`SK#X\PVB>71 -M_O_JH!0``'@2``#`"P``J!0``+`2``#T$@``*!,``'`3``#`$P``#!0``!P4 -M```X%```5!0``/!/+>DTT$WB`$"@X7!@D>5H<)'EP#F0Y0,P`^(#`%/C``"@ -M$^L``!K(`Y_E_O__ZPJ@AN*H-P'C`S"4YQPPC>6ZL=;AN)'6X0E0H.&H`Y_E -M"1"@X0L@H.'^___K'!"=Y0(`4>,'```:K#4<$)WE`1!QX@`0H#,@$(WE`3"@X0``6>,`,*`#`3`#$@`` -M4^,&```:`3!YX@`PH#,D,(WE'!"=Y0$`4>,``%D#$0``&@`PVN4!(-KE`""- -MY0(@VN4$((WE`R#:Y0@@C>4$(-KE#""-Y04@VN40((WE``.?Y040H.$<()WE -M_O__ZP"`H.,-4*#CJP``ZE==A.(84(7B!0"@X0H0H.'^___K`(!0XA@``!H` -M$-KE`2#:Y0(PVN4#`-KE``"-Y00`VN4$`(WE!0#:Y0@`C>6H`I_E_O__ZP4` -MH.$*$*#A_O__ZP"`4.(#```:D`*?Y?[__^L14*#CD```Z@$\H./0,(CE`#"@ -MXT`VB.4+``#J8EZ(X@Q0A>(%`*#A_O__ZP``4.,%```:,#:8Y2PFF.4$,(+E -M`""#Y2Q6B.4P5HCE8UZ(X@10A>(%`*#A_O__ZP``4.,#```*!0"@X1<4"`%'C`3"# -M`P``4^,/```*`0!2XP@``!K0,)CE`3S#XP$[@^/0,(CE%#4``%7C`P``&B@!G^7^___K#U"@ -MXR0``.H"`(;B&1V(X@@0@>*`(*#C_O__ZP``4.,'```*T#"8Y0(\P^,!.X/C -MT#"(Y10W`>,#,)3G/#:(Y0@``.K@`)_E_O__ZP]0H.,1``#JU`"?Y0L0H.'^ -M___K#E"@XPP``.H!L(OB0+:(Y00`H.$($*#A`""@X_[__^O0,)CE`0L3XP$` -MH`,`,*`30#:(%0$`H!,2``#J``!8XPL```J(8)_E"("&X@@`H.$`$*#C*"<` -MX_[__^L",*#C2#:&Y>@`AN(*$*#A!B"@X_[__^L$`*#A"!"@X04@H.'^___K -M``"@XS30C>+PC[WH`3!YX@`PH#,D,(WE`!"@XR`0C>5&___JB!0``)04``"L -M%```_!0``#05``!H%0``J!4``.@5```,%@``/!8``&@6```(#```\$:Z$XL`IE.4!#!+C"@``"A@`AN(8$$?B -M_O__ZVX*Q.4*`*#A!A"@X0<@H.'^___K!`"@X?[__^M:``#J5UV$XAA0A>+` -M&93E`S`$XP`P0.,#,`'@`A`$XP$`4^$9```:!0"@X0H0AN+^___K`%!0XDP` -M``H5/J#CTP"%X0\@H.,`,*#C`"`"X`$P`^`#$)+A!```&@0`H.$&$*#A!R"@ -MX04PH.'^___K%3Z@X]-@A>$!`*#C`!"@XP8`D.`'$*'@\P"%X3<``.H#(`+B -M`0!2XS0``!H*@(;B!0"@X0@0H.'^___K`%!0XA0```H5/J#CTP"%X0\@H.,` -M,*#C`"`"X`$P`^`#$)+A!```&@0`H.$&$*#A!R"@X04PH.'^___K%3Z@X]-@ -MA>$!`*#C`!"@XP8`D.`'$*'@\P"%X1D``.H$`*#A_O__ZP!0H.$@`%#C%``` -M"@0`H.$D$(;B)"!'X@4PH.'^___K``!0XP4``!J%,H3@.3V#X@@P@^(`(*#C -M"""#Y0<``.H*`*#A!A"@X0<@H.'^___K!`"@X0@0H.$%(*#A_O__ZP$`H./P -MA[WH\$`MZ0S03>(`8*#A`5"@X0TPH.%P(9_E`P"2Z`0`@^2P$,/A<$"5Y01P -MH.&P,-3A#``3XU(``!H$0(3B!`"@X.3_ZVPPEN40`!/C`@``"@8`H.$%$*#A_O__ZPS0C>+P@+WHM!0``+@$ -M``#P02WI(-!-X@!`H.%Y?H#B!P"@X0`0H.,X*P#C_O__ZY!'A.40P(WB3#&? -MY0\`D^@'`*SH`##,Y0TPH.$`4*#C!%"#Y`10@^0$4(/D`%##Y0%@H.,!8,WE -M`H"@XP*`S>4#,*#C`S#-Y0`PX.,$,,WE"`"'X@40H.'^___KG#<`X[-0A.%! -M.@+C`S#4YYXWQ.6?5\3EH%?$Y;0R`>,#4(3G0CH"XP,PU.>A-\3EEPZ$X@D` -M@.(0$(WB#2"@X_[__^N6#H3B#`"`X@T0H.$-(*#C_O__ZXA9A.60683EC%F$ -MY!9A.7D683EW%F$Y=A9A.6>#H3B -M"`"`X@40H.&`(*#C_O__ZPDPH.-O.L3E<(K$Y7Y:Q.7J/0+C`S#4YW\ZQ.4$ -M`*#A_O__ZP0`H.'^___K!`"@X4D5U.5Z+H3B!"""XC+C_^NB!\3EK#(!XV0@ -MH..S((3AE&?$Y08`H.$@T(WB\(&]Z+P4```$0"WE``!1XQD``-H`,-#E?S`# -MX@0`4^,"`%,3$@``"@L`4^,0```*%@!3XP!`H!,)```:#```Z@0PT.=_,`/B -M!`!3XP(`4Q,'```*"P!3XP4```H6`%/C`P``"@%`A.($`%'A\___R@$``.H! -M`*#C````Z@``H.,0`+WH'O\OX01`+>4``%'C#0``V@!`H.,$,-#G?S`#X@(` -M4^,$`%,3!```"@L`4^,"```*%@!3XP``H!,#```:`4"$X@0`4>'R___*`0"@ -MXQ``O>@>_R_A!$`MY0$`0.)P`._F$P!0XP1`H(,`,`"3`#!`DP!`TY<$`*#A -M$`"]Z![_+^%P0"WI`4"@X0)@H.&>-]#E#@!3XP0``)IT6M#E``!5XQ10H!,$ -M4*`##P``ZG1:T.4``%7C"%"@$P!0H`,!`*#A`A"@X?[__^L!`%#C`5"%`P4` -M``H$`*#A!A"@X?[__^L!`%#C`U"%`P)0A1,%`*#A<("]Z`1`+>5_``#B"P!0 -MXP!`H(,`,`"3`#!`DP``@Y`40-"5!`"@X1``O>@>_R_A\$$MZ0!@H.$!<*#A -M`$"@XP0PAN!L6=/E`C"%XG,P[^8!`%/C!0``F@4`H.'^___K!P!0X0$``!H! -M`*#C\(&]Z`%`A.(-`%3C\/__&@``H./P@;WH\$,,```*_P!5XPT```H%`*#A_O__ -MZP!0H.$(`*#A!1"@X?[__^L!`%#C"5"%`750[P8'4,KG`7"'X@%`A.(&`%3A -M[/__&@<`H.'PA[WH!.`MY0S03>((((WB`3"@XP$P8N45$*#C%#4#XP_@H.$# -M\)#G#-"-X@"`O>@$X"WE#-!-X@@@C>(`,*#C`3!BY140H.,4-0/C#^"@X0/P -MD.<,T(WB`("]Z`3@+>4,T$WB`#"@X0<0S>4!`%+C!0``&A80H.,'((WB%,4# -MXP_@H.$,\)/G!```ZA<0H.,'((WB%,4#XP_@H.$,\)/G#-"-X@"`O>@$X"WE -M#-!-X@@@C>(!$&+E`1"@XQ0U`^,/X*#A`_"0YPS0C>(`@+WH!.`MY0S03>(( -M((WB`1!BY0`0H.,4-0/C#^"@X0/PD.<,T(WB`("]Z!!`+>D,-0/C`S"0YP`` -M4^,0@+T(,_\OX1"`O>@00"WI"#4#XP,PD.<``%/C$("]"#/_+^$0@+WH<$`M -MZ0!`H.$#8*#A`E"@X0``4N,``%,3`0``&O[__^L(``#J`0!2XP,``!H"$('B -M<1#OYO[__^L"``#J`A!!XG$0[^;^___K!`"@X080H.$%(*#A_O__ZW"`O>@! -M`!#C`P"@$]``X`<>_R_A!`"`XA[_+^'`*9#E`S`$XP`P0.,#,`+@`@`$XP`` -M4^$``*`3`0"@`Q[_+^'`*9#E`S`$XP`P0.,#,`+@`0`$XP``4^$``*`3`0"@ -M`Q[_+^&0/I#E`0!3XPD```H`,*#C`R"`X+`NDN4!`%+C!```"B`P@^(Z#E/C -M^/__&@$`H.,>_R_A``"@XQ[_+^$``:#A;S(!$&+E&!"@XQ0U`^,/X*#A`_"0YPS0 -MC>(`@+WH$$`MZ1D0H.,`(*#C%#4#XP_@H.$#\)#G$("]Z/!/+>D4T$WB`'"@ -MX00@C>4#8*#A@1&@X0`0C>4%4('B!$"@XQ2E`^,(D(WB&K"@XP$``.H!0$3B -M`5!%X@&`E.("```*`0!8XR```!H/``#J`##6Y00`G>4#.(#A`2#6Y0(\@^$( -M,(WE`""=Y0*`B.`,@(WE!P"@X1H0H.,(((WB%#4#XP_@H.$#\)?G)```Z@,@ -MUN4$,-;E`SB@X0(T@^$"(-;E`C"#X04@UN4"/(/A"#"-Y0Q0C>4'`*#A"Q"@ -MX0D@H.$/X*#A"O"7Y]C__^H!@$3B"(&@X3@`G>4(,(#@`1#3Y0(@T^4"**#A -M`22"X0@0T.4DT$WB`""@XQ@@S>49(,WE&B#-Y1L@ -MS>4<(,WE'2#-Y0@PC>($((/D!""#Y`0@@^0`((/E"#"-X@`PC>48,(WB_O__ -MZR30C>(`@+WH!$`MY9`^D.4``%/C`D"@`P0```KK/H#B`T"@XP`@D^4``%+C -M!@``&H0R@.`!(*#C4"Z#Y>4.@^(`,*#C"#"`Y0,``.H!0(3B(#"#XB``5./Q -M__\:!`"@X1``O>@>_R_A\$\MZ0S03>(`4*#A<3K0Y0``4^,[```*H7?0Y0$` -M5^,*<*`#$'"@$RI-@.(*0(3BJ6Z`X@I@AN(4A0/C!*"-XAN0H.,!Q$._F -M`2""X00@C>73,N'G`P!3XP/QGY<:``#JI"$!`+PA`0#4(0$`["$!``4`H.$= -M$*#C"B"@X0_@H.$(\)7G$```Z@4`H.$>$*#C"B"@X0_@H.$(\)7G"@``Z@4` -MH.$+$*#A"B"@X0_@H.$(\)7G!```Z@4`H.$)$*#A"B"@X0_@H.$(\)7G!$"$ -MX@8`5.'/__\:#-"-XO"/O>CP0"WI#-!-X@!@H.'0-)#E``!3XSX```H!,*#C -M=3K`Y0$PT>4``%/C'0``"JD^@.(*,(/B`$"@XP(`5.,%```*!""!X`(`TN4` -M(-/E`B``X``@P^4-``#JG%K6Y00@T>4#<`7B`^`"X@X`5^$.<*#!`W`%TAS` -M!>(<``+B``!4$`%+AY/__ -MB@8`H.$3$*#C!R"-XA@U`^,/X*#A`_"6YZENAN(-8(;B`$"@XP```.,``$#C -M`!``XP`00.,',-WE``!3XP,`4Q,$(-$'`##6!0,P`@``,,8%!"#0%P`PUA4# -M,`(0`##&%0%`A.(!8(;B$`!4X_#__QH,T(WB\("]Z$8Z`N,#,-#G``!3XP`P -MH`--,<$%3#'!!1[_+P$!`%/C"@``&D_R_A4>_R_A!$`MY7\``.($`$#B:`!0XP#QGY=J``#JZ"4!`)@E -M`0"8)0$`F"4!`)@E`0"8)0$`F"4!`.`E`0#0)0$`F"4!`)@E`0"8)0$`F"4! -M`)@E`0#()0$`F"4!`)@E`0"8)0$`V"4!`)@E`0#`)0$`F"4!`)@E`0"8)0$` -MF"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"X)0$`F"4!`)@E`0"8 -M)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"P)0$`F"4!`)@E -M`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4! -M`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"H)0$` -MF"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8 -M)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E -M`0"@)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4!`)@E`0"8)0$`F"4! -M`)@E`0"0)0$`"T"@XQ0``.H`0*#C$@``Z@I`H.,0``#J"4"@XPX``.H(0*#C -M#```Z@=`H.,*``#J!D"@XP@``.H%0*#C!@``Z@1`H.,$``#J`T"@XP(``.H" -M0*#C````Z@%`H.,$`*#A$`"]Z![_+^'P02WI`&"@X0T`4>,!4*`Q#5"@(P`` -M5>,`<*`#"@``"@!PH.,'0*#A`8"@XP0`UN>``!#C`0``"O[__^L8<(?A`4"$ -MX@0`5>'W__^*!P"@X?"!O>CP02WI`'"@X0T`4>,!8*`Q#6"@(P``5N,`4*`# -M"```"@!0H.,%0*#A`8"@XP0`U^?^___K&%"%X0%`A.($`%;A^?__B@4`H.'P -M@;WH!"#0Y0,PT.4#-J#A`@J#X1[_+^$$0"WE=#K0Y0``4^,,```*;CK0Y00` -M4^,)```*GS?0Y0$`$^,&0*`3!4"@`P`PT>4!`-'E``2#X5!$H.$!``3B```` -MZ@``H.,0`+WH'O\OX01`+>4"`Q#C&T"@$P,``!H:0*#C`3"@XQ,D$.`!```* -M=$#OY@,``.H!0$3B`0!TX_C__QH`0*#C!`"@X1``O>@>_R_A,``MZ010T.4# -M,-#E!52#X0()%>,/0*`3!@``&@Y`H.-5-*#A`0`3XP(``!H!0$3B`0!TX_G_ -M_QIT`._F,`"]Z![_+^$00"WI)#4#XP_@H.$#\)#G$("]Z!!`+>G^___K$("] -MZ!!`+>G8$)'E_O__ZQ"`O>@00"WI;CK0Y00`4^,(```*!0!3XPT```H#`%/C -M#P``&@$PH.-X.L#E`#"@XWDZP.40@+WH`""@XW@JP.4!,*#C>3K`Y?T0H./^ -M___K$("]Z/T0H.,`(*#C_O__ZQ"`O>@`,*#C>#K`Y0$PH.-Y.L#E$("]Z#!` -M+>D,T$WB`$"@X0%0H.$@`!'C#```"G`ZT.4#`%/C%0``"@@@C>(!,*#C`3!B -MY0,PH.-P.L#E$!"@XQ0U`^,/X*#A`_"4YPL``.IP.M#E`0!3XP@```H(((WB -M`#"@XP$P8N4!,*#C<#K`Y1`0H.,4-0/C#^"@X0/PE.<"`!7C%#"@$V\ZQ!43 -M```:H3?4Y0H`$^,+```*`0L5XP0```IO.M3E"0!3XPDPH!-O.L05"0``ZF\Z -MU.44`%/C%#"@$V\ZQ!4$``#J%``3XPDPH!-O.L05%#"@`V\ZQ`4$`*#A#A"@ -MXZ8NA.(/((+B%#4#XP_@H.$#\)3G#-"-XC"`O>@>_R_A!$`MY1A`@>($,)3E -M`""@XR@;`./Q((#A`,"4Y0P@@N'Q((#A$`"]Z![_+^$00"WI"!"@XP`@H.,4 -M-0/C#^"@X0/PD.<0@+WH$$`MZ2@U`^,/X*#A`_"0YQ"`O>AP0"WI`$"@X0%@ -MH.%7#8#B&`"`X@(0H.'^___K`%!0XG"`O0@!,-;E4S'CYP,R@^`#487@?SK4 -MY0$`4^,`,*`3`3"@`[PQQ>5P@+WH\$4MZ0S03>(`@*#A`5"@X0-`H.$$8(WB -M`G"@X0$`H.$!$*#C!B"@X07^___K!("=Y04`H.$R$*#C!B"@X0($()WE_O__ZP$`H.,,T(WB\(6]Z!!`+>FA-]#E`0`3 -MXP<```J!`H#@Y0Z`X@P`@.(`$`#C`!!`XP0@H./^___K$("]Z($"@.#E#H#B -M#`"`X@@0G^4$(*#C_O__ZQ"`O>AT!0``$$`MZ0$PH.$!(-'E`0!2XQ"`O8@! -M(*#CD4T$WB`&"@X0%P -MH.$$,(WE)(!2XD<```I7O8#B&+"+XJTN@.($((+B`""-Y0!`H.,`,`#C`#!` -MXPPPC>4(0(WE)%"$X@50A^``,-7E*@!3XRT```H]`%/C,0``&@``5>,O```* -M`S#5Y00`$^,`D*`#"*"=!0D```H#,`/B`2!#X@(`4N,`D*"#`:"@@P$P0Y(, -M()V5`S""D""@TY4DD-.5GS?6Y0H`4^$$```:H#?6Y0D`4^$`(*`#@"K&!1@` -M``H!,*#C@#K&Y9^GQN6@E\;E"P"@X0`0G>7^___K`*!0X@\```KX-9KE``!3 -MXY\WUA4,-LH5H#?6%0TVRA4`,*`###;*!0TVR@4%``#J!@"@X040H.'^___K -M!@"@X000G>7^___K`3#5Y0(P@^(#0(3@!`!8X<'__XH4T(WB\(^]Z!!`+>D! -M,*#AT"20Y0``4N,0@+T(`2#1Y18`4N,0@+V(`2"@XW8JP.6K#H#B"@"`X@(0 -M@>(!(-/E_O__ZQ"`O>@00"WIQ#20Y0``4^,`0*`#<4K`!00`H`$0@+T(`4"@ -MXW%*P.4J#8#B"`"`X@@0@>(2(*#C_O__ZP0`H.$0@+WH\$`MZ0S03>(`0*#A -MLUZ`X@10A>(%`*#A_O__ZW8ZU.4``%/C`P``"G4ZU.4``%/C`3"@$W0ZQ!6> -M-]3E#@!3XP0``)IT>M3E``!7XQ1PH!,$<*`#$```ZG1ZU.4``%?C"'"@$P!P -MH`,`8*#A!0"@X080H.'^___K`0!0XP%PAP,%```*!0"@X080H.'^___K`0!0 -MXP-PAP,"<(<30CH"XP,PU.<#<`?@H7?$Y0)P1^)W<._F`0!7XPHZ`).V,,V1 -M#CX`@[8PS8$$`*#A#Q"@XP8@C>(4-0/C#^"@X0/PE.<,T(WB\("]Z/!/+>D< -MT$WB`("@X0%PH.$,`%'C60``F@Q`H.,`H`#C`*!`XPBPBN($,(K@!#"-Y1`P -MBN((,(WE%)"*XA@PBN(,,(WE'#"*XA`PC>4@,(KB%#"-Y01@B.``,-;EW0!3 -MXT$``!H"4(;B!0"@X0L0H.$#(*#C_O__ZP``4.-#```:!0"@X000G>4#(*#C -M_O__ZP``4.,]```:!0"@X0@0G>4#(*#C_O__ZP``4.,Y```:!0"@X0D0H.$# -M(*#C_O__ZP``4.,S```:!0"@X0D0H.$#(*#C_O__ZP``4.,M```:!0"@X0P0 -MG>4#(*#C_O__ZP``4.,#`*`3)P``&@4`H.$0$)WE`R"@X_[__^L``%#C!`"@ -M$R```!H%`*#A%!"=Y0,@H./^___K``!0XP(`H!,9```:!0"@X200BN(#(*#C -M_O__ZP``4.,%`*`3$@``&@4`H.$H$(KB`R"@X_[__^L``%#C!@"@$PL``!H! -M,-;E`C"#X@-`A.`$`%?AM/__BAP`G^7^___K!P"@XP(``.H``*#C````Z@$` -MH.,(/X*#A!?"4Y^$]`N,#,-3G``!3XP@``!H; -M``#J`#"@XW0ZQ.4$`*#AGA?4Y:`GU.6?-]3E_O__ZR0``.J:.@#CLS"4X0(` -M$^,/```*NSK4Y00`$^,,```*`3"@XY\WQ.6[.M3E`S`#X@$`4^,!,*`#H#?$ -M!00```H#`%/C`#"@$Z`WQ!4",*`#H#?$!00`H.&>%]3EH"?4Y9\WU.7^___K -MFCH`X[,PE.%3,>'G>CK$Y0``4^,"```:&`"?Y1@0G^7^___KO#K4Y0,P`^)W -M.L3E#-"-XC"`O>C\%P``]!0``/!/+>D,T$WB`'"@X:T.@.+^___K$``0XS`` -M``I(.Y?E#`!3XRT``)HMC8?B#("(X@Q`H.,`D`#C`)!`XP2@H.,`L`#C`+!` -MXP`P`.,`,$#C!#"-Y01@B.``,-;E,`!3XP\```K=`%/C$P``&@)0AN(%`*#A -M"Q"@X0H@H.'^___K``!0XPP```H,`(7B!!"=Y0H@H.'^___K``!0XP8```H, -M``#J"@"&X@D0H.$*(*#A_O__ZP``4.,&```:`3#6Y0(P@^(#0(3@2#N7Y00` -M4^'?__^*`0``Z@$`H.,```#J``"@XPS0C>+PC[WH$$`MZ0!`H.$9$*#C`""@ -MXQ0U`^,/X*#A`_"0YSD-A.(,`(#B`!"@XP$KH./^___K$("]Z/!`+>D4T$WB -M`%"@X0%PH.$"8*#A#4"@X0T`H.$`$*#C#2"@X_[__^L%`*#A#1"@X?[__^L` -M(*#A``"&Y0<`H.$-$*#A_O__ZQ30C>+P@+WH!.`MY0S03>)\`(#B_O__ZP`0 -MH.$&`(WB`B"@X_[__^NV`-WA#-"-X@"`O>@P0"WI#-!-X@!`H.$R/*#C`S#0 -MYP$`4^$5```*B#4#XP,PD.$(((WB`3!BY3(\H.,#$,#G(A"@XQ0U`^,/X*#A`_"4YP4PU.>` -M,"/B!3#$YPS0C>(P@+WH`0"@XQ[_+^$!`*#C'O\OX0$`H.,>_R_A`0"@XQ[_ -M+^$>_R_A'O\OX1[_+^$>_R_A$$`MZ3@U`^,#,)#G``!3XP%`H`,!```*,_\O -MX0!`H.$$`*#A$("]Z!!`+>D`0*#A````XP``0.,`$`#C`!!`X_[__^L`,*#C -M%##$Y1"`O>@00"WI`$"@X0```.,``$#C)!"?Y?[__^O@,)3E``!3XP$```K4 -M`(3B_O__ZP`PH./@,(3EY#"$Y1"`O>@8%0``$$`MZ1XPH./<,(#E`#``XP`P -M0./@,(#E`#``XP`P0./D,(#EU`"`XO[__^L0@+WH$$`MZ=1`0.(```#C``!` -MXR@0G^7^___KZ##4Y0``4^,0@+T(QCU$XA0P0^(``)/E_O__ZP`PH./H,,3E -M$("]Z#@5```00"WIQTV`XC1`A.($`*#A_O__ZP0`H.'^___K$("]Z'!`+>D` -M0*#AQVV`XC1@AN(&`*#A`1"@X_[__^L`4*#CJ#(#XP-0A.<<,@/C`U"$YR`R -M`^,#4(3G3SH"XP,PU.=4(@/C`C#$YU4B`^,",,3G?2Z@XY@R`^,#((3GG#(# -MXP-0Q.=E,@/C`U#$YV8R`^,#4,3GLS(#XP-0Q.=7,@/C`U#$YTXZ`N,#,-3G -M6"(#XP(PQ.<%,%/@`3"@$U8B`^,",,3G63(#XP-0Q.<,(*#C`3(#XP,@Q.<$ -M,@/C`U#$YP4R`^,#4,3G?R#@XP(R`^,#(,3G`"``XW0R`^,`($#C`R"$YW@R -M`^,#0(3GR0V$XB@`@.(%$*#A!2"@X?[__^O4,@/C`U"$YP8`H.'^___K<("] -MZ!!`+>D`0*#A_O__ZUPR`^,#,)3G`#!CX&,`4^,8``":;#"4Y0$`$^,5```* -M$``3XQ,``!I``!/C$0``&B``$^,/```:9C(#XP,PU.,# -M,)3G`@!3XPD``!H;/*#C`S#4YP``4^,%```:&`"?Y?[__^L``*#C$("]Z``` -MH.,0@+WH`0"@XQ"`O>@@&```,$`MZ0S03>(`0*#A`E"@X0<0S>4*`%'C-0`` -MB@0R`^,#,-#G`0!3X0,``!H%,@/C`S#0YP(`4^$M```*``!1XQ0``!JP`)_E -M_O__ZP4R`^,#4,3G"%"-X@$@=>4!,$/B`R#$YP0`H.$,$*#C_O__ZP0`H.$C -M$*#C!2"@X10U`^,/X*#A`_"4YP`@H.-9,@/C`R#$YQ8``.H$`*#A_O__ZP`` -M4.,2```*4`"?Y?[__^L%,@/C`U#$YP@@C>(!$'+E`3!#X@,0Q.(P@+WH -M2!@``(@8```00"WI5C(#XP,PT.<``%/C$("]"`0R`^,#,-#G``!3XQ"`O0@` -M$*#C`2"@X?[__^L0@+WH\$(`0*#A;#"0Y0$`$^,J```*_O__ZU8R -M`^,#,-3G``!3XR4```H(((WB`3"@XP$P8N4$`*#A)1"@XQ@U`^,/X*#A`_"4 -MYP=0W>4``%7C$@``"AD``.H)`*#A_O__ZP%@5N($```:````XP``0.,`$*#C -M_O__ZQ```.H$`*#A"A"@X0@@H.$/X*#A!_"4YP=0W>4``%7C[O__"@<``.ID -M`*#C_O__ZP]G`N,8=0/C!X"-XB6@H.-DD*#C[O__Z@C0C>+PA[WH$$`MZ0`P -MH.%L()#E`0`2XQ"`O0@""Q+C$("]&!``$N,0@+T80``2XQ"`O1@@`!+C$("] -M&&8B`^,"(-#G`0!2XQ"`O0A6(@/C`B#0YP``4N,0@+T(5R(#XP(@T.D`0*#ALC(#XP,PT.<``%/C#P``"O[__^L`,`#C`#!`XP`P -MD^68(@/C`B"4YV00H..1`@'@TRT$XV(@0>.2`8'@R0V$XB@`@.(A$X/@_O__ -MZQ"`O>AL,)#E$``3XPP``!I``!/C"@``&B``$^,(```:@2@`XP`@0.,"(`/@ -M``!2XP,``!K(-0/C`S"0YP``4^,.```:`#``XP`P0.,`,)/EF"(#XP(@E.=D -M$*#CD0(!X-,M!.-B($'CD@&!X,D-A.(H`(#B(1.#X/[__^L0@+WHJ#(#XP,P -MD.<``%/C$("]&*`R`^,#,)#G``!3XQ"`O1@"(*#CK#(#XP,@@.<`(*#C$#!# -MX@,@P.<0`)_E;!"4Y?[__^L$`*#A_O__ZQ"`O>CX&```<$`MZ0!`H.&@,@/C -M`S"0YP$`4^-P@+T(LC(#XP,PT.<``%/C+0``"O[__^L`4%#B`"``XP`@0.,` -M,`#C`#!`XP,@H!$@`9_E(!&?Y?[__^NH,@/C`S"4YP,`5>$;```*`@!5XPH` -M`!H"(*#CK#(#XP,@A.W+X+B`C"$YP0`H.'^___K!``` -MZ@`@H..L,@/C`R"$YP0`H.'^___KJ#(#XP,@E.<"`%+C`!``XP`00.,`,`#C -M`#!`XP,0H!&D`)_E_O__ZYPR`^,#(-3G`2""X@,@Q.=8,@/C`S#4YP``4^-P -M@+T(J#(#XP,PE.<``%/C<("]&)PR`^,#,-3G`P`3XW"`O1AL()3E@3@`XP`P -M0.,#,`+@``!3XW"`O1@0`!+C<("]&$``$N-P@+T8(``2XW"`O1C(-0/C`S"4 -MYP``4^-P@+T((`"?Y100G^7^___K`B"@XZPR`^,#((3G<("]Z#09``!(%0`` -M5!D``'`9```P`"WI`#``XP`P0.,`$)/E``!1XP`PH-,#0*#1&0``V@`P`.,` -M,$#C!#"3Y0``4^$`,*`#"0``&@,``.J#(87@#""2YP``4N$(```:`"``XP`@ -M0..#(8+@"$"2Y0D``.H`0*#C`%``XP!00.,$P*#C`4"$XG1`[^8$,*#A`0!4 -MX>W__[H`0*#C;`D`XP,`4>$$`*`1,`"]Z![_+^$P`"WI`#``XP`P0.,`$)/E -M``!1XP`PH-,#0*#1&0``V@`P`.,`,$#C"#"3Y0``4^$`,*`#"0``&@,``.J# -M(87@#""2YP``4N$(```:`"``XP`@0..#(8+@!$"2Y0D``.H`0*#C`%``XP!0 -M0.,(P*#C`4"$XG1`[^8$,*#A`0!4X>W__[H`0*#C`P!1X00`H!$!`*`#,`"] -MZ![_+^%P0"WI`%"@X?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4%`*#A -M_O__ZP$`4.,`0*`##P``"@!`E>4,`)3H!#""Y0`@@^4`0(3E!$"$Y1!@E.4` -M`%;C!@``"E(]AN(X,(/B`P!5X=`T`0,#()8'`2!"`@,@A@<-(*#A?SW"XS\P -MP^,$()/E`2!"X@0@@^7^___K!`"@X7"`O>@00"WI_O__ZQ"`O>AP0"WI`$"@ -MX0%@H.$04)#E_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y0P`E.@$,(+E -M`""#Y0!`A.4$0(3E!`"@X080H.'^___K``!5XP8```I2/87B.#"#X@,`5N'0 -M-`$#`R"5!P$@@@(#((4'#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP$` -MH.-P@+WH\$$MZ0C03>(`0*#A$("0Y0``4.,`<*`#<'"0%30PT.4``%/C#``` -M"C`@D.4``%#C"0``"G0PD.4#,&+@=#"`Y7`0D.4!`%/A`C"#,'0P@#5H,)`E -M`R!B(&@@@"4L4)3E*#"4Y0-0A>`%8(?@!@"@X0`0`.,`$$#C!B"@X_[__^L` -M`%#C#0``"@90A>(%4(?@!0"@X8@1G^4"(*#C_O__ZP``4.,%```:!0"@X701 -MG^4"(*#C_O__ZP``4.,%```*!@"@X6`1G^4&(*#C_O__ZP``4.-,```*+""4 -MY2@PE.4#,(+@`6"@XP8@H.,",(/@N";4X0(@8^"V(,WA;""8Y0$($N,:```* -M`W"'X'@@X.,`(,?E$B"@XP$@Q^4``%3C`%"@`P40H`$,```*)#!#XG!0E.4# -M4(7@<%"$Y70@E.4"`%7A!5!C@'!0A(4`4*"#:""4E0(P8Y!H,(25;!"4Y04` -MH.$8(*#C_O__ZQA0A>(0``#JAB"@X0``5.,`4*`##```"@XP0^(",(/@<%"4 -MY0-0A>!P4(3E=""4Y0(`5>$%,&.`<#"$A0!0H(-H()25`C!CD&@PA)4%`*#A -M.!"$X@8@H./^___K!@"%XCX0A.(&(*#C_O__ZP``5N,'```:MC#=X2,DH.$# -M-(+A"!"-XK(P8>$,`(7B`B"@X_[__^L!`*#C"-"-XO"!O>@H()3E+#"4Y0,P -M@N``8*#C!B"@X;'__^I,#,-#G``!3 -MXP!PH!,'4*`1R34!`P-0T`>]-0$#`W#0!P$PH./()0'C`C#`Y[PE`>,",,#G -M;#"0Y0(+$^,P```:?#4!XP-@T.>&4(7@JSH*XZHZ2N.3!8/@HS"@X8,P@^`# -M`%7AJVH*$ZIJ2A.6)880IF"@$0%@AA*K:@H#JFI*`Y8UA@"F8*`!9`!6XV1@ -MH"-]-0'C`U#4YX50A^"K.@KCJCI*XY,%@^"C,*#A@S"#X`,`5>&K.@H3JCI* -M$Y,EA1"E4*`1`5"%$JLZ"@.J.DH#DP6%`*50H`%\-0'C`V#$YP%@AN*F8*#A -M7V!&XGHU`>,#8,3G9`!5XV10H"-]-0'C`U#$YP`P`.,`,$#C`#"3Y;@E`>," -M()3G9!"@XY$"`>#3+03C8B!!XY(!@>!6#83B"`"`XB$3@^#^___K\(&]Z'!` -M+>D`0*#A`%`/X8``#/$-(*#A?SW"XS\PP^,$()/E`2""X@0@@^7^___K`0!0 -MXP!`H`,`0)05!#"4%0`@E!4$,((5`""#%0!`A!4$0(05@``5XP$```H%\"'A -M````Z@7P(>$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^4`,)/E`@`3XP````K^ -M___K!`"@X7"`O>@00"WI`#"@X0!`#^&```SQ#<"@X7\MS.,_(,+C!,"2Y0'` -MC.($P(+E!""0Y0#`D.4$((SE`,""Y0``@^4$`(/E_O__ZX``%.,!```*!/`A -MX0```.H$\"'A#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E`#"3Y0(`$^,````* -M_O__ZP$`H.,0@+WH<$`MZ0!`H.$!8*#A$%"0Y0@`D.4``%#C`@``"O[__^L` -M,*#C"#"$Y?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4,`)3H!#""Y0`@ -M@^4`0(3E!$"$Y00`H.$&$*#A_O__ZP``5>,&```*4CV%XC@P@^(#`%;AT#0! -M`P,@E0E+WTWB`*"@X1`0C>52#8#B.`"`XAP`C>4H()'E``!1XPL```IP -M,)'E`C"#X'`P@>40`)WE=!"0Y0$`4^$#,&*`<#"`A1`0G95H,)&5`R!BD&@@ -M@940()WE+#"2Y0``4^,-``#:``!2XPL```IP()+E`R""X!``G>5P((#E=!"0 -MY0$`4N$",&.`<#"`A1`0G95H()&5`C!CD&@P@940()WE:)"2Y7!`DN4.`%GC -MPP``V@Q0U.4-,-3E!52#X05@H.$.,(7B!#"-Y0,`6>$0``"J"@``Z@50AN`$ -M0(7@#%#4Y0TPU.4%5(/A!7"@X0Z@A>($L(OB"0!:X0H``-H%8*#AW`*?Y0D0 -MH.$&(*#A_O__ZZH``.H`L*#C"X"@X05PH.$`H(WE!*"=Y0Y@A.(,`(?B_O__ -MZP!`4.(,```*H#"4Y0PP@^*@,(3EE#"4Y0PP@^*4,(3E!`"@X040H.'^___K -M!A"@X04@H.'^___K#P``ZA`0G>4(`)'E(!"@X_[__^L`0%#B!```"J!@A.54 -M4(3E!3"&X)0PA.4$``#J`*"=Y4`"G^4($*#A_O__ZQD``.HH((WB"T""YP&` -MB.)X@._F0`!8XP0``!H`H)WE````XP``0./^___K$```Z@Y`2>('<%3@"@`` -M"@-`"N($0&3B!`!4XP!`H`,'`%3A;P``R@>09.`.`%GCL?__R@"@G>4```#J -M`*"=Y0``6.-G```*$#"=Y3XP@^($,(WE$`"=Y3@`@.(``(WE`&"@XP9PH.$H -ML(WB_AX/X_\?3^,($(WE2B^-X@$@@N`,((WE`#``XP`P0.,4,(WE$#"#XA@P -MC>4(D*#A!E";YZ``E>4&0-#E!X#0Y50PE>4'`%/C(```FA00G>4&(*#C_O__ -MZP``4.,%```*!$2(X?,`".,W$0CC``!4X0$`5!$%```:H`"5Y1@0G>4&(*#C -M_O__ZP``4.,/```*!0"@X080H./^___K!0"@X080H./^___K!!"=Y08@H./^ -M___K!0"@X080H./^___K`!"=Y08@H./^___K%P``ZK0UU>$C)*#A`S2"X4H/ -MC>((()WELC"`X04`H.$"$*#C_O__ZPP0G>4"(*#C_O__ZP4`H.$&$*#C_O__ -MZP00G>4&(*#C_O__ZP4`H.$&$*#C_O__ZP`0G>4&(*#C_O__ZP``5>,+```* -MUTV@XP4`H.$$$)KG_O__Z[H&Q>$$,)KG&#"%Y6@PU>4?,40`)WE'!"=Y?[_ -M_^L!`*#C2]^-XO"/O>B(&0``O!D``/!/+>D,T$WB`("@X0%@H.$,<('B#%"1 -MY0$`4N,%```:!P"@X?[__^L``%#C10``&K`BU>&V(,;A#3"@X7^=P^,_D,GC -M!)"-Y5(MB.(X((+B`""-Y8BE`^.,M0/C-```Z@<`5>$Y```*!4"@X;8@UN&P -M,M7A`C!CX`(+$^,Q```:`%"5Y00PE.4$,(7E`%"#Y0!`A.4$0(3EMC#6X;`B -MU.$#`%+A`3"#`@,ZH`$C.J`!MC#&`1PPU.4``%/C$@``&@HPF.<``%/C&0`` -M&@LPF.<``%/C%@``&@0PF>4!,$/B!#")Y?[__^L(`*#A!!"@X?[__^O^___K -M!""=Y00PDN4!,(/B!#""Y0D``.H!`%/C!P``&@@`H.$$$*#AN_[_ZP$`4.," -M```*!`"@X0`0G>7^___K!P"@X?[__^L``%#CQO__"@$``.H!0*#C````Z@!` -MH.,$`*#A#-"-XO"/O>AP0"WI`%"@X0!`D.6(-0/C`S"4YP``4^-P@+T8C#4# -MXP,PE.<``%/C<("]&/[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4$`*#A -M!1"@X0$@H..1___K`0!0XP4``!H`,`#C`#!`XP`0D^44`(7B`Q"!XO[__^L- -M(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K<("]Z/!!+>D`8*#A`7"@X0B` -M@.((`*#A_O__ZP!`EN4$``#J!%"@X0!`E.4%`*#A!Q"@X?[__^L&`*#A!!"@ -MX?[__^L``%#C]?__"@@`H.'^___K\(&]Z/!/+>D\T$WB`&"@X1"`D.52#8CB -M.`"`XA0`C>5P0);E`%#4Y0-0!>*(.9CE`P!3XP<``!J0.9CE@S"#X`,QB.!Z -M/H/B"#"#X@0@D^4!((+B!""#Y0``5>.3!0`:!#"@X;`@U.%R<._F#%`'X@$, -M$N/2).#G`A"@$P`0H`,!((+A'R#&Y18@].4/(`+B(B#&Y;`@U.$B(J#AL"+& -MX;`@T^%2)N#G(R#&Y;`@T^%2)>#G)"#&Y;`@T^'2)N#G)2#&Y;`@T^%2)^#G -M)B#&Y;`PT^&C-Z#A'3#&Y00`5>,6```*"`!5XZX```H``%7C`)"@$_T"`!IP -M$);E5PV(XA@`@.(*$('B_O__ZP!`4.(&```*%3Z@X].@A.$!`*#C`!"@XPH` -MD.`+$*'@\P"$X0@`H.$&$*#A_O__ZUL%`.IP0);EL##4X0PP`^($`%/C5@4` -M&@0`A.++'8CB(1"!X@8@H./^___K``!0XT\%``JP,-3A_#`#XJ0`4^-+!0`: -MLG#4X5<-B.(8`(#B"A"$XO[__^L`4%#B1`4`"@=YH.$G>:#AU#"5Y0<`4^$_ -M!0`:%3Z@X].@A>$!`*#C`!"@XPH`D.`+$*'@\P"%X34PUN4'`%/C#@``BM4S -MUN$!(*#C$C.@X<``$^,91]45`4`$$@D``!HP`!/C&$?5%0%`!!(%```:!@`3 -MXQ9'U14"0`00`0``&A='U>4!0`3B``!4XR(%`!K0,)7E!``3XQ\%``J<-P'C -MLR"8X=0PE>52,Z#A`0`3XQD%``K^___K#1"@X7\]P>,_,,/C!""3Y0$@@N($ -M((/E!0"@X<1`L.4$$*#A_O__ZP``4.,G```:#`"4Z`0P@N4`((/E`$"$Y01` -MA.7,,)7E`3!#XLPPA>4``%/C`3"@$U0PQ!4`,*`#5##$!0$PH.-6,,3E"`"@ -MX000H.$\-0/C#^"@X0/PF.4``%/C -M)@``&IXW`>/4()7ELQ"8X0$`H.,0(L'ALR"(X0@`H.$%$*#C`""@XP(PH.'^ -M___K&@``ZIXW`>.S()CAU#"5Y5(SH.$!`!/C%```"LP0E>4``%'C`@``&H`/ -MG^7^___K`P``ZG@/G^7^___K`#"@X\PPA>6>-P'CU""5Y;,0F.$!`*#C$"+! -MX;,@B.$(`*#A!1"@XP`@H.,",*#A_O__ZPT@H.%_/<+C/S##XP0@D^4!($+B -M!""#Y?[__^O!!`#JK#0#XP,PF.<``%/C`@``"@@`H.$%$*#C,_\OX:=SH.$> -M<,;E<$"6Y1Q`C>6P,-3A`1P3X@(@H!,`(*`#TS3@YP,@@N$!`%+C!*"$`@$` -M``H0H(0B!*"$,@``4>,"(*`3`""@`P,@@N$!`%+C$'"$`@0```H*<(0R`@`` -M.@(`4N,8<(02"G"$`@``4>,"$*`3`!"@`P,P@>$#`%/C`_&?EP,``.HH30$` -M,$T!`#A-`0!`30$``%"@XP8``.H04(3B!```Z@I0A.("``#J!%"$X@```.H$ -M4(3B``!5XQ@"``HX,(;B&#"-Y0,`H.$*$*#A!B"@X_[__^L^D(;B"0"@X0<0 -MH.$&(*#C_O__ZU"PAN(+`*#A!1"@X08@H./^___K'S#6Y0,`4^,#\9^7B0$` -MZJQ-`0"\3P$`J%$!`)Q3`0!*4(;B!0"@X0H0H.$&(*#C_O__ZT1`AN($`*#A -M!Q"@X08@H./^___K<*"6Y2"@C>7@<(CB.*#6Y0&@"N)L,)CE(``3XP$``!I` -M`!/C)0``"LM-B.(A0(3B!`"@X0D0H.$&(*#C_O__ZP``4.-D```:!`"@X1@0 -MG>4&(*#C_O__ZP``4.,!```:``!:XUP```H+`*#A`!``XP`00.,&(*#C_O__ -MZP``4.-5```:!P"@X3`=G^4&(*#C_O__ZP``4.-/```:"P"@X0<0H.$&(*#C -M_O__ZP``4.,^<(82`9"@$SD``!I&``#J"``3XP@```H+`*#A"1"@X08@H./^ -M___K``!0XU!PAA(!D*`3+@``&CL``.H0`!/C#P``"@``6N,$```*4##6Y0$` -M$^,!D*`3)P``&C(``.H+`*#A&!"=Y08@H./^___K``!0XSYPAA(!D*`3(@`` -M&BD``.H!"!/C`)"@`PEPH`$7```*&`"=Y2`@G>4$$(+B!B"@X_[__^L)`*#A -M(#"=Y0H0@^(&(*#C_O__ZPL`H.$@L)WE$!"+X@8@H./^___K!0"@X1@0G>4& -M(*#C_O__ZP0`H.$)$*#A!B"@X_[__^L!D*#C``!:XP,```H(`*#A_O__ZP!0 -MH.$$``#J5PV(XA@`@.('$*#A_O__ZP!0H.$``%7C`)"@`P8!`.H`4*#C!9"@ -MX0,!`.I*<(;B!P"@X0H0H.$&(*#C_O__ZT1`AN($`*#A!1"@X08@H./^___K -M<*"6Y5==B.(84(7BX`"(XB``C>4X$-;E)!"-Y6PPF.4(`!/C/0``"@$`$^,! -M```:@``3XSD```JP,-KA_"`#XD@`4N-7```*B"`#XH@`4N,!```:<``3XU(` -M`!K+?8CB(7"'X@<`H.$)$*#A!B"@X_[__^L``%#C2@``&B0@G>4!0`+B!P"@ -MX1@0G>4&(*#C_O__ZP``4.,!```:``!4XT````H+`*#A`!N?Y08@H./^___K -M``!0XSH``!H@`)WEZ!J?Y08@H./^___K``!0XS0``!H+`*#A(!"=Y08@H./^ -M___K``!0XRX```H``%3C`P``"@@`H.'^___K`%"@X0,``.H%`*#A4!"&XO[_ -M_^L`4*#A``!5XR4``!HF``#J`0@3XQ\```H!`!/C'0``"A@`G>4$$(KB!B"@ -MX_[__^L)`*#A"A"*X@8@H./^___K"P"@X1`0BN(&(*#C_O__ZP<`H.$8$)WE -M!B"@X_[__^L$`*#A"1"@X08@H./^___K"P"@X2`0G>4&(*#C_O__ZP4`H.%0 -M$(;B_O__ZP!04.(#```:!```Z@!0H.,%D*#AC```Z@&0H..*``#J`)"@XX@` -M`.I*`(;B!1"@X08@H./^___K1`"&X@<0H.$&(*#C_O__ZW!PEN5L,)CE$``3 -MXP!0H`,!D*`#>@``"@L`H.'@$(CB!B"@X_[__^L``%#C`%"@`P60H`%R```* -M5ZV(XAB@BN(^D(;B"@"@X0D0H.'^___K`%!0XEH```IP0);E"@"@X0D0H.'^ -M___KL##4X0!`4.(9```*`0H3XPD```K0,)3E!#"#X]`PA.6<-P'CU""4Y;,0 -MF.$!`*#C$"*!X;,@B.$-``#JT#"4Y00`$^,*```*!#`CXM`PA.6<-P'CU""4 -MY;,0F.$!`*#C$"+!X;,@B.$(`*#A!!"@X?[__^NP(-?A_#`"XD@`4^,U```* -MB"`"XH@`4N,T```:R`!3XS````H*`*#A"1"@X?[__^L`<%#B+0``"MPPE^4` -M`%/C*@``"A0WU^4/`!/C)P``"M`PE^4$`!/C)```"C4@UN4'`%+C#@``BG(P -MK^8!$*#C$3.@X<``$^,91]<5`D`$$@D``!HP`!/C&$?7%0)`!!(%```:!@`3 -MXQ9'UQ4"0`02`0``&A='U^4"0`3B``!4XPX```H<-Y?E``!3XP0```H(`*#A -M!Q"@X?[__^L!D*#C%```Z@@`H.'@$(?B_O__ZP&0H.,/``#J`)"@XPT``.H! -MD*#C"P``ZDH`AN($$(3B!B"@X_[__^M$`(;B"A"$X@8@H./^___K`)"@XWL` -M`.H`4*#C!9"@X0``6>-W```*``!5XW0```J`4(;E`#"@XQPPQN4>,-;E`0!3 -MXQ0``!H<,)WE&"#SY0\@`N(U(,;EL!#3X=$2X>!N/X/BA#"&Y;`RUN$B(-;E#P!4XT0``,H/(`+B`S*" -MX7-P_^:$,(7@M#K3X0<`4^$]```*A$"%X+1ZQ.$F,-;E``!3XS(```JH-P'C -M`S"8YP,`4^,#\9^7#@``ZO!4`0#P5`$``%4!`/!4`0"L-P'C`S"8YS0PQN4& -M``#J2C#6Y0$`$^,$.`$3`S"8%S0PQA7L,)4%-##&!30PUN4!,$/B!`!3XP/Q -MGY<4``#J1%4!`%A5`0"$50$`<%4!`$15`0`$,*#C+#"&Y3`PAN4!D*#C%@`` -MZ@@PH.,L,(;E!#"@XS`PAN4!D*#C$```Z@@PH.,L,(;E,#"&Y0&0H.,+``#J -M`#"@XRPPAN4P,(;E`9"@XP8``.H`,*#C-##&Y3`PAN4L,(;E`9"@XP```.H` -MD*#C`0!9XP,```H&`*#A%!"=Y?[__^M5`@#JK#0#XP,PF.<``%/C`@``"@@` -MH.$%$*#C,_\OX30PUN4``%/C)P``"G`@EN4H,);E`S""X`,PT^4C,Z#A5C#& -MY30PUN4?```*)R#6Y0``4N,#```*""L!XP(@F.``#J9%8!`'16`0#,5@$`A%8!`&16`0`( -M`*#A!A"@X?[__^L5``#J"`"@X080H.'^___K$0``Z@@`H.$&$*#A_O__ZPT` -M`.HG(-;E`0!2XPH``!H``%/C"```"@$K`>,"(-CG`0!2XP$```H"`%/C`@`` -M"@$@H.,,.P'C`R"(YP``5N,X`@`*5SV(XA@P@^(8,(WE)%#6Y2)PUN4#`*#A -M1!"&XO[__^L`0%#B`*"@`QR@C06<0(02'$"-%06PE^$&0*`!`$"@$P$`5>,2 -M```:'`"=Y0``4.,+```*``!7XP4``!K^___K``!0XP(``!H<`)WE%!"=Y?[_ -M_^L&`*#A'!"=Y?[__^OR`0#J!@"@X100G>7^___K`$"@XP%0=>(`4*`S``!7 -MXP!0H`,``%7C;```"AP0G>4``%'C90``"@&PH.$&`*#A_O__ZQP@G>4`0)+E -M#`"4Z`0P@N4`((/E`$"$Y01`A.4B,-3E``!3XP<```H$`*#A%!"=Y?[__^L< -M`)WE%!"=Y?[__^L`0*#C5```ZAPPG>4`<)/E`:"@XT,``.H'4*#A(C#7Y0H` -M4^$'```*!`"@X100G>7^___K'`"=Y100G>7^___K`$"@XT0``.H!H(/B>J#O -MYB@PE^4L()?E``!7XPL```H#((+@5`R!BD&@@AY4P()3E``!4XQ<```IT,)3E`S!BX'0PA.5P -M$)3E`0!3X0(P@S!T,(0U:#"4)0,@8B!H((0E=`"4Y7`0E>5H()7E_O__ZV@@ -ME>5T,)3E`C"#X'0PA.5X$)3E`0!3X0,P8H!T,(2%"```B@0``.IT`)3E7^___K`@``ZF@PE.4"((/@:""$Y3`PE>4P,(3E`'"7Y0L`H.$'$*#A -M_O__ZP``4..V__\*'`"=Y100G>7^___K`P``Z@8`H.$4$)WE_O__ZWL!`.H` -M`%3C>0$`"B8PU.4``%/CC`$`"A@`G>5$$(3B_O__ZP!0H.$T,-3E`@!3XX4! -M`!H``%#C7@``"DHPU.4!`!/C`5R``@H```I64-3E&SR@XP,PV.<``%/C!5*( -M$&)=A1(,4(42`@``&O0!G^7^___K6P``ZB@PE.4L()3E:+"4Y0NP8^`P$)3E -M"[!AX`BP2^(+L&+@<'"4Y0.@@N`*H(?@+#"-X@`PC>4U,-3E!#"-Y04`H.$' -M$*#A"B"@X0LPH.'^___K"Z"*X`!PH.,'4*#A+!"-X@4@T><%,-KG`P!2X0%P -MH!,!4(7B"`!5X_C__QH!`%?C)```&F@PE.4``%/C`P``"@!0H.,(4(7B`P!5 -MX?S__SI*$-3E`1`!X@$`4>,!4*`3!```&E90U.7@.9CE`P!5X0!0H!,!4*`# -M)S#4Y0$`4^,`4*`3`5`%`@``5>,'```*"`"@X?[__^L```#C``!`XR<0U.7^ -M___K`%"@XQ```.H```#C``!`XP,0H.'^___K`%"@XPH``.H".P'C`S#8YP`` -M4^,%```:2C#4Y0$`$^,!4*`3`CL!$P-0R!<````:`5"@XW0PE.4(($/B=""$ -MY7`0E.4!`%+A=#"$-6@PE"4(,$,B:#"$)0``5>,8`0`:!`"@X100G>7^___K -M_@``Z@``5>,:```*Z#"5Y0``4^,7```**!"4Y2PPE.4#$('@!A"!XC8`C>(! -M$(?@`B"@X_[__^NV,]WA(R2@X0,T@N%S,/_FMC/-X8XH".,"`%/A!P``"@0` -MH.$4$)WE_O__ZPH!`.H@&@``0!H``%P5``"$&@``:`"4Y0"@H.'*OZ#A^*#- -MX>`T`>/3H(CAV`#-X0"@FN`!L*O@\Z"(X0@UF.4!,(/B"#6(Y3@PE.4!`'/C -M`P``&KPCU.'_/P_C`P!2X00```HX,-3E`0`3XPPUF`4!,(,"##6(!8!0E.4` -M`%7C#```"A4^H.,!H*#C`+"@X],`A>$`H)K@`;"KX/.@A>%6/Z#CTZ"%X=@` -MS>$*`)#@"Q"AX/,`A>'0-)CE`0!3XZ```!J$<)3E'##4Y0``4^,>```:!`"@ -MX3CX_^L>,-3E`0!3XPL```J(-0/C`S"8YP``4^.*```:C#4#XP,PF.<``%/C -MA@``&@@`H.$$$*#A_O__ZZ(``.H$,-?E``!3XQP``!JP$M3AMA#'X0@`H.$$ -M$*#A_O__Z[8PU^$!,(/B`SJ@X2,ZH.&V,,?AE```Z@$`4^,/```:!##7Y0`` -M4^,,```:L"+4X;8@Q^$(`*#A!!"@X6+Y_^NV,-?A`3"#X@,ZH.$C.J#AMC#' -MX0$`4..#```*8@``ZO[__^L-H*#A?SW*XS\PP^,$()/E`2""X@0@@^6P,M3A -M"E#7Y;80U^'_+P_C`@!1X;8PQP&V(-?A`P!BX`(+$.-*```:`@!3X00``!H! -M,(/B`SJ@X2,ZH.&V,,?AB@``Z@4`H.$!($'B`B"%X`(@8^`""Q+CA```"@%0 -M1>(%`%/A`3"#H@,`8*"V`,>A`3J#L@$P@[(#,&"PMC#'L7H``.JP,M7AL"+4 -MX0,08N`""Q'C`%"5%0(``!H#`%+A!0``&BH``.H*`*#A!1"@X?[__^L``%#C -M\?__"@P`E.@$,(+E`""#Y0!`A.4$0(3E!`"@X040H.'^___K"`"@X0<0H.$` -M(*#C%/K_ZP$`4.,-```:`#``XP`P0.,`$)/E%`"'X@,0@>+^___K#;"@X7\] -MR^,_,,/C!""3Y0$@0N($((/E_O__ZS```.H-`*#A?SW`XS\PP^,$()/E`2!" -MX@0@@^7^___K%`"'XO[__^LF``#J#1"@X7\]P>,_,,/C!""3Y0$@0N($((/E -M_O__ZX@U`^,#,)CG``!3XQL``!J,-0/C`S"8YP``4^,7```:$```Z@0`H.&; -M]__K`0!0XP"0H!$,```:B#4#XP,PF.<``%/C!P``&HPU`^,#,)CG``!3XP,` -M`!H(`*#A!!"@X?[__^L%``#J`)"@XP8`H.$4$)WE_O__ZP``6>,'```*Z#0! -MX]-`B.$!`*#C`!"@XP0`D.`%$*'@\P"(X08``.KP-`'CTT"(X0$`H.,`$*#C -M!`"0X`40H>#S`(CA"0"@X3S0C>+PC[WH`)"@XX_]_^H`(*#CMB/-X7!PE.48 -M`)WE1!"$XO[__^L`4*#AJ#D`0*#A_O__ZP`PH.-H,(3E$("]Z!!`+>D`0*#A_O__ -MZP@`A.+^___K$`"$XO[__^N\`(3B_O__ZQ"`O>AP0"WI`$"@X1Q0D.7^___K -M!`"@X?[__^L0`)3E``!0XP$```J)'*#C_O__ZP4`H.'8-`/C#^"@X0/PE>=P -M@+WH$$`MZ0!`H.$`$*#C+""@X_[__^L$`*#A_O__ZP0`A.+^___K$("]Z/!! -M+>D`@*#A`6"@X0`0H.,2+J#C_O__ZP@`H.'^___K"`"@X?[__^L(`(CB_O__ -MZQQ@B.4!/*#C&#"(Y0@`H.$&$*#A_O__ZXD,H./^___K$`"(Y0``4.,`4*`# -M*P``"O\`@.+_0,#C%$"(Y0APH.$B6X3B!`"@X?[__^L$`*#A!Q"@X?[__^L& -M`*#A!!"@X?[__^L08(3EB$"$X@4`5.'S__\:`3"@XV@PR.58`(CB`!"@X_[_ -M_^L&`*#AU#0#XP_@H.$#\);G`%"@X=!`B.(`,`#C`#!`X]PPB.7@8(CE!`"@ -MX0`0H.,!(*#A_O__Z_H_H.,`,8CE`#``XP`P0.,`$)/E!`"@X600@>+^___K -M!0"@X?"!O>@!`*#C'O\OX?!!+>D(T$WB`&"@X0%0H.$`(`#C`"!`XPTPH.$# -M`)+H!`"#Y+`0P^$``%7C`&"@`S````H`,-7E`0`3XPU0H!$`0-7E`3#5Y01! -M(^`",-7E!$$CX`,PU>4$02/@!##5Y01!(^`%,-7E!$$CX"1$).`?0`3B_O__ -MZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y0)`A.*$<8;@A$&6YP:`H.,'``#J -M"&!$XM@`A.(%$*#A"""@X?[__^L!`%#C!@``"@!`E.4'`*#A!!"@X?[__^L` -M`%#C\O__"@!@H.,-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K!@"@X0C0 -MC>+P@;WH!.`MY0S03>(`(*#A#3"@X2`0G^4#`)'H!`"#Y+`0P^%7#8+B&`"` -MX@T0H.'^___K#-"-X@"`O>AL%0``\$$MZ0!@H.$`4%'BL```"DY]@.(X<(?B -M!P"@X<00A>+^___K`("@X\R`A>7^___K#3"@X7]-P^,_0,3C!#"4Y0$P@^($ -M,(3E!P"@X5P0A>+^___K5#"%XE@@E>54$)7E!""!Y0`0@N54,(7E6#"%Y00P -ME.4!,$/B!#"$Y?[__^O^___K!#"4Y0$P@^($,(3E!P"@X4@0A>+^___K0#"% -MXD0@E>5`$)7E!""!Y0`0@N5`,(7E1#"%Y00PE.4!,$/B!#"$Y?[__^O^___K -M!#"4Y0$P@^($,(3E!P"@X300A>+^___K+#"%XC`@E>4L$)7E!""!Y0`0@N4L -M,(7E,#"%Y00PE.4!,$/B!#"$Y?[__^O^___K!#"4Y0$P@^($,(3E!P"@X2`0 -MA>+^___K&#"%XAP@E>48$)7E!""!Y0`0@N48,(7E'#"%Y00PE.4!,$/B!#"$ -MY?[__^L(,(7B#""5Y0@0E>4$(('E`!""Y0@PA>4,,(7EZ#8!XP,@EN+^___KF`"%XO[__^MB#X7B_O__ZPA`H.$$`H3@``&%X',/@.+^ -M___K`4"$XA``5./X__\:8CZ%X@PP@^(P)I7E+!:5Y00@@>4`$(+E+#:%Y04@ -MH.$P-J+E!"""XC@VE>4T%I7E!#"!Y0`0@^4T)H7E.":%Y0`PH.,\-H7E'#>% -MY10WQ>45-\7E%C?%Y148-\7E&3?%Y1HWQ>6<-P'C`2"@X]0`E>6S$);A -M$A#!X;,0AN&>-P'CU`"5Y;,0EN$2(,'ALR"&X08`H.$%$*#A_O__Z]0@E>4! -M($+B%SV"X@8P@^(#,8;@!#"3Y04`4^$&```:%RV"X@8@@N("(8;@!!""X@`@ -MH.,`(('EU""#Y?[__^L-,*#A?TW#XS]`Q.,$,)3E`3"#X@0PA.4%`*#A5QV& -MXB`0@>+^___K!#"4Y0$P0^($,(3E_O__ZP$`H./P@;WH\$@V`>,#,)CG`0!3X_"'O0C^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($ -M((/E5YV(XBB0B>(`H*#CKV^*X@%@AN*&88C@`$"9Y08``.H(4$3B`$"4Y04` -M5^$"```*"`"@X040H.'^___K!@"@X000H.'^___K``!0X_/__PH!H(KB")") -MXB``6N/J__\:#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__Z_"'O>@00"WI -M`$"@X?[__^L8`(3B_O__ZRP`A.+^___K0`"$XO[__^M4`(3B_O__ZQ"`O>@0 -M0"WI`$"@X0``5.,````*_O__ZQ``A.+^___KF`"$XO[__^ND`(3B_O__ZQ"` -MO>AP0"WI`$"@X?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4(8(3B"$"4 -MY0,``.H$4*#A`$"4Y04`H.'^___K!@"@X000H.'^___K``!0X_;__PH-(*#A -M?SW"XS\PP^,$()/E`2!"X@0@@^7^___K<("]Z'!`+>D`0*#A_O__ZQ!0A.(% -M`*#A_O__ZP4`H.'^___K20^$XO[__^M'#X3B_O__ZW"`O>@00"WI`$!0X@8` -M``H$`*#A_O__ZP``E.4``%#C`0``"@05#N/^___K`0"@XQ"`O>AP0"WI`$"@ -MX0`0H.,H)P#C_O__ZP0`H.'^___K!`"@X?[__^L(`(3B_O__Z\0`A.+^___K -M`%"@X\Q0A.40`(3B_O__ZY@`A.+^___K8@Z$X@P`@.+^___K8PZ$X@0`@.+^ -M___K/%:$YCP3RWI#-!-X@!PH.$!8*#A`"#@X[8@S>'^___K#2"@X7\]PN,_,,/C!""3 -MY0$@@N($((/E"`"'XO[__^L!`%#C`%"@`T\```H(4)?E#`"5Z`0P@N4`((/E -M`%"%Y010A>4%`*#A_O__Z^``A>(&$*#A!B"@X_[__^L`0-;E`3#6Y01!(^`" -M,-;E!$$CX`,PUN4$02/@!##6Y01!(^`%,-;E!$$CX"1$).`?0`3B_O__ZPTP -MH.%_;#^___K`6"&XD1`A.(0`%;C[?__&@T@H.%_/<+C/S## -MXP0@D^4!($+B!""#Y?[__^L%`*#A#-"-XO"/O>@00"WI"-!-X@`@H.$-,*#A -M,!"?Y0,`D>@$`(/DL!##X5<-@N(8`(#B#1"@X?[__^L`0%#B`3"@$]@PA!4! -M`*#C"-"-XA"`O>AT%0``\$$MZ0!@H.$$!0[C_O__ZP``AN4``%#C\(&]"`,` -MP.,$`(#B!`"&Y0APAN('`*#A_O__ZQ``AN+^___K`%"@XQ!1AN5%#X;B_O__ -MZT4H,-'E!P!3XPL``(K8,M'A`2"@XQ(SH.'``!/C5$"$ -M$@8``!HP`!/C0$"$$@,``!H&`!/C+$"$$@```!H80(3B$`"4Y1``O>@>_R_A -M\`,MZ60PD>4/,`/B`0!3XQ@``!H"8*#AQG^@X1@T`>/30(#A!D"4X`=0I>#S -M0(#A!#60Y0$P@^($-8#E7$"1Y0``5.,+```*%SZ@X].`A.$!`*#C`!"@XP@` -MD.`)$*'@\P"$X5X_H./3`(3A`&"6X`%PI^#S8(3A\`.]Z![_+^$$0"WE!P!2 -MXQ```(H!`*#C$"*@X<``$N-40($2`""@$P`@PQ4,```:,``2XT!`@1(!(*`3 -M`"##%0<``!H&`!+C+$"!$@,@H!,`(,,5`@``&AA`@>("(*#C`"##Y00`H.$0 -M`+WH'O\OX01`+>4``%'C!@``V@!`H.,$(*#AA#&`X`0@@^4!0(3B`0!4X?K_ -M_QH0`+WH'O\OX?A/+>D`H*#A`6"@X?[__^L-$*#A?SW!XS\PP^,$()/E`2"" -MX@0@@^7$D(;BQ'"6Y0&`H.,`L*#C1@``Z@=`H.$`<)?E,##4Y0<`4^,0``"* -MT#/4X1@SH.'``!/C"0``&C``$^,$```:!@`3XP@```H65];E`E`%X@<``.H8 -M5];E`E`%X@0``.H95];E`E`%X@$``.H75];E`E`%X@``5>,L```*#`"4Z`0P -M@N4`((/E`$"$Y01`A.7,,);E`3!#XLPPAN4<-Y;E`3!#XAPWAN4``%/C5(#$ -M%0L@H!%8(,05"S"@`50PQ`58@,0%5H#$Y0H`H.$$$*#A/"4#XP_@H.$"\)KG -M`0!0XP(``!H*`*#A!!"@X?[__^L<-Y;E``!3XPP``!H:-];E``!3XPD``!K4 -M();EGAD,T$WB`&"@X0%0H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E -MQ+"%XL1PE>4`,*#C`#"-Y0&`H..>EP'C!("-Y40``.H'0*#A`'"7Y00PE.4' -M(*#A!#"'Y0!P@^4`0(3E!$"$Y3`PU.4'`%/C$```BM`SU.$8,Z#AP``3XPD` -M`!HP`!/C!```&@8`$^,(```*%J?5Y0*@"N('``#J&*?5Y0*@"N($``#J&:?5 -MY0*@"N(!``#J%Z?5Y0*@"N+,,)7E`3!#XLPPA>4``%/C5(#$%0`@H`-4(,0% -M``!:XPD```H<-Y7E`3!#XAPWA>4``%/C5(#$%0`PH!-8,,05`""@`U0@Q`58 -M@,0%5H#$Y08`H.$$$*#A/#4#XP_@H.$#\);G`0!0XP(``!H&`*#A!!"@X?[_ -M_^O,,)7E``!3XP4``!K4()7EN3"6X1@RP^&Y,(;A!""=Y0`@C>4+`*#A!Q"@ -MX?[__^L``%#CM?__"@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L&`*#A -M_O__ZP!04.)%```*G#4)`*#A!Q"@X?[__^L` -M`%#CV?__"@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L`,)WE``!3XP0` -M``H&`*#A!1"@XP`@H.,",*#A_O__ZPS0C>+PC[WH\$$MZ0!@H.$!0*#A1G#1 -MY5Q0D>4``%7C!0``&E<-@.(8`(#B1A"!XO[__^L`4%#BB```"@%P!^)6,-3E -M`0!3XP4``!H``%?C$3"@$U.S -M,);A``!3XW@```H,`)3H!#""Y0`@@^4`0(3E!$"$Y?[__^L-(*#A?WW"XS]P -MQ^,$,)?E`3"#X@0PA^4$`*#AQ!"%XO[__^O,,)7E`3"#XLPPA>6>-P'CLR"6 -MX0$@@N.S((;A!@"@X040H.,`(*#C`C"@X?[__^L$,)?E`3!#X@0PA^7^___K -M`4"@XU@``.K0,)7E!``3XU0```J<-P'CLR"6X=0PE>52,Z#A`0`3XTX```H, -M`)3H!#""Y0`@@^4`0(3E!$"$Y?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@ -M@^4$`*#AQ!"%XO[__^O,,)7E`3"#XLPPA>4P,-3E!P!3XQ$``(K0,]3A`2"@ -MXQ(SH.'``!/C"0``&C``$^,$```:!@`3XP@```H61]7E`D`$X`<``.H81]7E -M`4`$X@0``.H91]7E`4`$X@$``.H71]7E`4`$X@``5.,)```*'#>5Y0$P@^(< -M-X7E&C?5Y0``4^,`0*`3`4`$`@``5.,#```:$```ZAHWU>4``%/C#0``"IXW -M`>/4()7ELQ"6X0$`H.,0(H'ALR"&X4``%/A!```&@8`H.$%$*#C`""@ -MXP(PH.'^___K#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP%`H.,```#J -M`$"@XP0`H.'P@;WH,$`MZ2S03>(`4*#A`4"@X0``D.4%$*#A_O__ZP4`H.$8 -M$(WB#B"@X_[__^NT,-3A`@M3XP8``!H%`*#A!!"-XA0@H./^___K!5#=Y:52 -MH.$#``#JCE@(XP4`4^$'4*`#`%"@$RA0Q.4:,*#CNC#$X7@P`"WI`$"@X54PX.,`,,#E`3#`Y0,PH.,",,#E\S`(XS4$,,#E`C#5Y04PP.4A -M-*#A`12#X;80P.$(`*#C,`"]Z![_+^$00"WI43V@XP-`D.<``%3C$("]"$0T -M`>,#$-#G!`"@X8$1H.'^___K$("]Z!!`+>D`0*#A!""@XT0T`>,#(,#G(`"@ -MX_[__^M1/:#C`P"$YP``4.,``.`#$("]"$0T`>,#,-3G!0!3XPP``!I/383B -M,#"$X@`P@.4H,(3B"#"`Y2`PA.(0,(#E&#"$XA@P@.400(3B($"`Y0``H.,0 -M@+WH!`!3XP``H!,0@+T83TV$XB@PA.(`,(#E(#"$X@@P@.40,(3B$#"`Y1A` -MA.(80(#E``"@XQ"`O>CP02WI"-!-X@!0H.$!8*#A43V@XP-PD.=<0)'E``!4 -MXP8``!I7#8#B&`"`XD80@>+^___K`$!0X@!`H`,9```*!0"@X000H.$P(-;E -M!S"-XO[__^L`0*#A`("@X?[__^L``%#C`P``"@=0W>4$`*#AA1&7Y_[__^L& -M`*#A"!"$XO[__^L0,)3E`3"#XA`PA.4'0-WEA'&'X`0PE^4!,(/B!#"'Y0%` -MH.,$`*#A"-"-XO"!O>@00"WI_O__ZP``4.(!`*`3$("]Z/!/+>D\T$WB!`"- -MY1`0C>44((WE6$"0Y0`PH.,H,(WE`3"@XRPPC>4",*#C,#"-Y0,PH.,T,(WE -MY3T"XP,PU.6T,)#E(#"-Y;@PD.4D -M,(WE`'"@XP%@H.,&0*#A'S#@XP\`X.,```#J!6"@X3C`C>($(8S@`Q"2YP4`((S@`,"2 -MY0#`@>4`4(+E`4"$X@,`5.,&4*#1Z?__V@%0AN(#`%7C!G"@T05`H-'D___: -M_O__ZPT0H.%_/<'C/S##XP0@D^4!((+B!""#Y10@G>4``%+C0@``V@`PH.,( -M,(WE*!"-X@C`G>4,,9'G$""=Y8,Q@N`,,(WE`+"3Y0"@F^4L``#J"F"@X0B0 -MBN($,)WE6("3Y0EPH.$(4)KE#@``Z@5`H.$`4)7E!#"4Y00PA>4`4(/E`$"$ -MY01`A.40,);E`3!#XA`PAN4(`*#A!!"@X?[__^L``%#C!0``"@<`H.$%$*#A -M_O__ZP``4./K__\*#P``Z@``5.,-```*#,"=Y00PG.4!,$/B!#",Y0D`H.'^ -M___K``!0XQ(```H,`);H!#""Y0`@@^4`8(;E!&"&Y0P``.H`H)KE"P"@X0H0 -MH.'^___K``!0X\W__PH($)WE`1"!X@@0C>44()WE`0!2X;[__\H`0*#C#<"@ -MX7\]S.,_,,/C!""3Y0$@0N($((/E_O__ZP0`H.$\T(WB\(^]Z!!`+>D`0*#A -M3PV`XA``@.+^___K``!0XP\```I/#83B&`"`XO[__^L``%#C"@``"D\-A.(@ -M`(#B_O__ZP``4.,%```*3PV$XB@`@.+^___K`0!PX@``H#,0@+WH`0"@XQ"` -MO>CP02WI`%"@X5APD.4`0%'B(0``"O[__^L-(*#A?SW"XS\PP^,$()/E`2"" -MX@0@@^4$`*#A#`"4Z`0P@N4`((/E`$"$Y01`A.5@8)3E``!6XP`PH!-@,(05 -M3!"%XO[__^M(,)7E`3"#XD@PA>4-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^ -M___K``!6XP(```H'`*#A!A"@X?[__^L!`*#C\(&]Z/!!+>D`<*#A`6"@X?[_ -M_^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4`0);E!```Z@10H.$`0)3E!P"@ -MX040H.'^___K!@"@X000H.'^___K``!0X_7__PH-(*#A?SW"XS\PP^,$()/E -M`2!"X@0@@^7^___K\(&]Z!!`+>D``%'C````"O[__^L!`*#C$("]Z/!!+>D` -M4*#A6'"0Y?[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^5,`(7B_O__ZP$` -M4.,`0*`#)```"DQ`E>4,`)3H!#""Y0`@@^4`0(3E!$"$Y0``5.,<```*2#"5 -MY0$P0^)(,(7E`&"@XVQ@A.5P8(3E"`"$X@80H.%8(*#C_O__ZP$PH.-D,(3E -M8&"$Y70PQ.5(,)7E`0!3XPL``!K7/:#C`S"7YY0QD^4((+/E`0`2XP4``!H` -M4`_A@``,\0`@D^4!((+C`""#Y07P(>$-(*#A?SW"XS\PP^,$()/E`2!"X@0@ -M@^7^___K!`"@X?"!O>CP1RWI0-!-X@!@H.$!H*#A3GV`XCAPA^('`*#A_O__ -MZP!`4.(``.`#)@$`"AB`C>(*`*#A"!"@X?[__^LP4(WB"`"@X040H.$.(*#C -M_O__Z[PSW>$C)*#A`S2"X;PPQ.$TD(3B"0"@X040H.$&(*#C_O__ZSJ`A.(( -M`*#A!A"%X@8@H./^___K`#"@XU4PQ.5L,);E(``3XP$``!I``!/C"```"D8` -MA.()$*#A!B"@X_[__^M``(3B"!"@X08@H./^___K%```Z@@`$^,(```*1@"$ -MXN`0AN(&(*#C_O__ZT``A.(($*#A!B"@X_[__^L)``#J$``3XP<```I&`(3B -M"1"@X08@H./^___K0`"$XN`0AN(&(*#C_O__ZQPPG>44,(3EO##4X0(+4^,: -M```:&`"-X@T0H.$8(*#C_O__ZP`PH.,+,,3E&C$`XQP@G>4#`%+A$```FKPP -MU.$""U/C#0``&A4PW>5$`%/C`P``&A=0W>5#`%7C#0``&@0``.I#`%/C!``` -M&A=0W>5$`%7C`0``&@$PH.,+,,3EO##4X8XH".,&&`#C`@!3X0$`4Q$"```* -M"S#4Y0$`4^,#```:!@"@X000H.,!(*#C_O__ZT:0U.4!D!GB!```"@8`H.'^ -M___K`%!0X@8``!JF``#J5PV&XA@`@.)&$(3B_O__ZP!04.*@```*"("$XM@P -ME>4R,,3E7%"$Y0`PH.,Q,,3E#B"@X[`AQ.$8(*#CLB'$X0@@H.,)(,3E,##$ -MY6PPEN5P`!/C!@``"MPPE>4``%/C"0``"A@`C>(($*#ACOW_ZP4``.K$-);E -M``!3XP(```H8`(WB"!"@X8?]_^OH,)7E`0!3XPD``!H`,*#C'3#$Y;P@U.&. -M.`CC`P!2X4<```IL,);E`0@3XT0``!IV``#JJ#,$.`$3`S"6 -M%QTPQ!7L,)4%'3#$!:@W`>,#,);G`P!3XP/QGY<.``#JG'T!`)Q]`0"L?0$` -MG'T!`+`W`>,#,);G3##$Y0@``.H``%GC"#@!$P,PEA=,,,05`#"@`TPPQ`4! -M``#J`#"@XTPPQ.4=,-3E`3!#X@0`4^,#\9^7%0``ZOA]`0`(?@$`/'X!`"Q^ -M`0#X?0$`!#"@XQXPQ.4?,,3E#P``Z@@PH.,>,,3E!#"@XQ\PQ.4!.P'C`S#6 -MYP``4^,'```:-@``Z@@PH.,>,,3E'S#$Y0(``.H`,*#C'C#$Y1\PQ.4=,-3E -M``!3XPH```H$.P'C`S"6YP$`4^,#```*##L!XP,PEN<``%/C`@``&@$PH.,* -M,,3E`0``Z@`PH.,*,,3E"@"@X0@0H.'^___K`#"@XU0PQ.58,,3E5C#$Y=P@ -ME>5-(,3E^"75Y4X@Q.5.$=7E3Q#$Y0P6U>50$,3E#1;5Y5$0Q.4.%M7E4A#$ -MY5,PQ.4#`%+A&@``"OPUE>4``%/C%P``"@\FU>4P,-3E4C.@X0$`$^,!,*`3 -M4S#$%1```.H'`*#A!!"@X?[__^L``.#C"0``Z@8`H.$$$*#C,_\OX08`H.$$ -M$*#A/#4#XP_@H.$#\);G`0!PX@``H#-`T(WB\(>]Z&"@A.6L-`/C`S"6YP`` -M4^/N__\:\/__ZO!!+>D`<*#A`4"@X0)0H.$!8*#A`0"@X0`0H.-`(*#C_O__ -MZP`PU.4!(-3E`B2#X0,_#^,`,$#C`S`"X`,@`N(`(,3E(R2@X0$@Q.4!(-7E -M`C"#X0`PQ.4C)*#A`2#$Y0$@U>4(`!+CBP``"FP@E^4(`!+C$```"@$\@^,` -M,,3E(S2@X0$PQ.4$`(3BX!"'X@8@H./^___K"@"$XC(0A>(&(*#C_O__ZQ`` -MA.(L$(7B!B"@X_[__^LC``#J$``2XQ````H"/(/C`##$Y2,TH.$!,,3E!`"$ -MXBP0A>(&(*#C_O__ZPH`A.+@$(?B!B"@X_[__^L0`(3B,A"%X@8@H./^___K -M$```ZB``$N,"```:0``2XP!`H`-@```*!`"&XBP0A>(&(*#C_O__ZPH`AN(R -M$(7B!B"@X_[__^L0`(;BX!"'X@8@H./^___K3##5Y0``4^,'```*`##6Y0$@ -MUN4"-(/A`CJ#XW,P_^8`,,;E(S2@X0$PQN45,-7E``!3XP<```H`,-;E`2#6 -MY0(T@^$!.8/C$"8$;B -M!F"$X"@PU>4``%/CL"#6$0\P`Q(#,((1L##&$5`PU>4!,`/BL"#6X0,R@N%S -M,/_FL##&X2D@U>4#(`+B@C*#X;`PQN$^,-7E5&"5Y0``5N,,```:`0`3XP,` -M``H'`*#A_O__ZP!@H.$$``#J5PV'XA@`@.(^$(7B_O__ZP!@H.$``%;C%@`` -M"B@PU>4\,(/B@S"&X+`@T^$!((+BL"##X2@@U>4\((+B@B"&X+`PTN$#.J#A -M(SJ@X;`PPN$H,-7E@V"&X+@WUN&V,,7AMB'TX0\@`N(#,H+AL##$X0%`H.,` -M``#J`4"@XP0`H.'P@;WH<$`MZ0!0H.$`8`_A@``,\0T@H.%_/<+C/S##XP0@ -MD^4!((+B!""#Y<0`@.+^___K`0!0XP!`H`,+```*Q$"5Y0P`E.@$,(+E`""# -MY0!`A.4$0(3E``!4X]PPE14!,$,2W#"%%0`PH!,4,(05@``6XP$```H&\"'A -M````Z@;P(>$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^4`,)/E`@`3XP````K^ -M___K!`"@X7"`O>AP0"WI`$"@X0``4>(``*`#<("]"`!0#^&```SQ#2"@X7\] -MPN,_,,/C!""3Y0$@@N($((/E#`"0Z`0P@N4`((/E``"`Y00`@.7@$(3B_O__ -MZ_`PE.4!,(/B\#"$Y8``%>,!```*!?`AX0```.H%\"'A#2"@X7\]PN,_,,/C -M!""3Y0$@0N($((/E`#"3Y0(`$^,!`*`#<("]"/[__^L!`*#C<("]Z'!`+>D` -M0*#A``!1XP``H`-P@+T(N#'1X0``4^,#```*!`"@X?[__^L!`*#C<("]Z`!0 -M#^&```SQ#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E#`"1Z`0P@N4`((/E`!"! -MY000@>4!`*#AQ!"$XO[__^O<,)3E`3"#XMPPA.6``!7C`0``"@7P(>$```#J -M!?`AX0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y0`PD^4"`!/C`0"@`W"`O0C^ -M___K`0"@XW"`O>AP0"WI`%"@X0!@#^&```SQ#2"@X7\]PN,_,,/C!""3Y0$@ -M@N($((/EX`"`XO[__^L!`%#C`$"@`PL```K@0)7E#`"4Z`0P@N4`((/E`$"$ -MY01`A.4``%3C\#"5%0$P0Q+P,(45`#"@$Q0PA!6``!;C`0``"@;P(>$```#J -M!O`AX0T@H.%_/<+C/S##XP0@D^4!($+B!""#Y0`PD^4"`!/C````"O[__^L$ -M`*#A<("]Z#!`+>D,T$WB`$"@X0(PH.$4)`'C`B#0YP``4N,`(*`#%30!`P,@ -MP`<9```*`0!2XQ<```H!`*#A*A"@XP0@C>+^___K`%!0X@`@H`,5-`$#`R#$ -M!PX```H",-7E`@`3XP`@H`,5-`$#`R#$!P@```I'.@+C`S#4YP$`4^,!(*`# -M%30!`P,@Q`<"(*`3%30!$P,@Q!<,T(WB,("]Z/!/+>ELT$WB#`"-Y0%@H.$" -M0*#A1I#2Y0&0">)4#$*#A"""$XO[__^L``%#C20(` -M"E!0C>(&`*#A!1"@X?[__^L%`*#A`!"@X[`AU.'^___K5#"=Y10PA.4,-`'C -M#`"=Y0,PD.<$,$/B"#"-Y2@0A.(4$(WE(""$XA`@C>4$8)WE`("@XU"PC>(& -M4*#AL##6X0$[@^.P,,;ALG'4X0=@AN`(,)WE`W!GX!XPU.4``%/CM```"ATP -MU.4!,$/B!`!3XP/QGY>H``#JB(8!`.R&`0`8B0$`#(@!`(B&`0`@,=KE(##$ -MY2$QVN4A,,3E(C':Y2(PQ.5,,-3E`S.@X2,PQ.42#J#CT""*X?\4X.,!`%+A -M`P``&@``4^,`(*`#`#"@`P,```H!`*#C`!"@XP`@DN`!,*/@$AZ@X_$@BN&* -M``#J``!9XR,```HA,=KE(##$Y2$QVN5?,`/B(#"#XR$PQ.4@,=KE(C#$Y4PP -MU.4#,Z#A(#"#XR,PQ.4B,=KE)##$Y2,QVN4E,,3E)#':Y28PQ.4E,=KE)S#$ -MY1(.H./0((KA`0!RXP0``!K_'P_C`0!3X0`@H`,`,*`#`P``"@$`H.,`$*#C -M`""2X`$PH^`2'J#C\2"*X60``.HA,=KE(##$Y2$QVN5?,`/B(#"#XR$PQ.4@ -M,=KE(C#$Y2`@H.,C(,3E(C':Y20PQ.4C,=KE)3#$Y20QVN4F,,3E)3':Y2

``#J(#':Y2`PQ.4A,=KE(3#$ -MY0`@H.,B(,3E(#"@XR,PQ.4B,=KE)##$Y2,QVN4E,,3E)#':Y28PQ.4E,=KE -M)S#$Y1(.H./0((KA`0!RXP0``!K_'P_C`0!3X0`@H`,`,*`#`P``"@$`H.,` -M$*#C`""2X`$PH^`2'J#C\2"*X08`H.$0$)WE'B#4Y?[__^L>,-3E`V"&X`=P -M8^```%CC`""@$P`@C14%```:!@"@X;P0U.'^___K``"-Y0!@AN`'<&#@'S#4 -MY0``4^,"```*"B#4Y0``4N,'<&,0``!9XP4```H+`*#A!A"@X10@E.7^___K -M`'"@X00``.H+`*#A!A"@X0<@H.'^___K`'"@X0=@AN`?(-3E``!2XP<```H* -M,-3E``!3XP0```H&`*#A%!"=Y?[__^L?,-3E`V"&X`&`B.(``%GC`P``&@L` -MH.'^___K`0!0X\,``!IX@._F'(#$Y;(AU.$>$-3E`#"=Y0$`6.,`,*`3`#"- -MY0HPU.4``%/C'S#4%0(@@>`'<(+@``"=Y0!PA^`#<(?@&'"$Y;`PU>$!.\/C -ML##%X0`PH.-,,,WE33#-Y4XPS>5/,,WE1F#4Y5Q0E.4#`%7A!0``&@P0G>57 -M#8'B&`"`XD80A.+^___K`%"@X1TPU.4"`%/CF0``&@``5>.7```*-#"-X@`@ -MH.,$((/D!""#Y`0@@^0`((/E;("4Y0$`%N,3```*"#@!XPP@G>4#`)+G``*" -MX&$-@.(,`(#B-!"-XA`@H./^___K`0!0XP(,$('B_O__ZP@``.KP`(7B-!"-XA`@H./^___K`0!0X_@```H< -M`(WB\!"%XO[__^LH<(CB"%"@X2DP]>4!`!/C$```"AP`C>(0$(?B!B"@X_[_ -M_^L`,-7E`@`3XP0```H<`(WB&!"'X@8@H./^___K%```ZAP`C>(*$(?B!B"@ -MX_[__^L/``#J'`"-X@00A^(&(*#C_O__ZP`PU>4"`!/C!```"AP`C>(0$(?B -M!B"@X_[__^L#``#J'`"-X@H0A^(&(*#C_O__ZPP0G>7$-)'E`0!3XS`PU`5, -M,,T%'`"-XDP0C>($(*#C_O__ZP!@H.,,A`'C'*"-X@:PH.$$4*#A)P``Z@-` -M%^(!0*`3)W&$X+(1U>$>(-7E`0""X`=Q@.`!8(;B`P!6X0T``!H8,)7E`Q!A -MX`$@8N`*,-7E``!3XPLPH`$?,-45`D!CX`H`H.$'$*#A!""@X?[__^L$<(?@ -M#P``Z@PPG>4(0)/G!!!AX`$@8N`*,-7E``!3XPM`H`$?0-45`D!DX`H`H.$' -M$*#A!""@X?[__^L?,-7E`T"$X`1PA^`<,-7E`P!6X=3__[H%0*#A1%"-XAP` -MC>(%$*#A_O__ZP<`H.$%$*#A"""@X_[__^L8,)3E"#"#XA@PA.4``%/C`P`` -M"@!0H.,(4(7B`P!5X?S__SH*,-3E``!3XPH``!H>``#J`S`6X@$PH!,F88/@ -M!F&@X2A@AN(&`*#A!!"=Y;(AU.'^___K0?[_ZATPU.4!,$/B!`!3XP/QGY4$$*#A_O__ZP``6>,`,*`3,S#$%0%`H!-<```:7%"4 -MY1PPU.4!`%/C##0!$PP`G14#8)`7&&"4!0P0G>6A-]'E!P!3XP,``)KE/0+C -M`S#1YP``4^,6```*2#H"XPP@G>6S,)+A!@!3X0$PH#,S,,0U`T"@,44``#I- -M,=7E``!3XP$PH!,S,,05`T"@$3\``!I,,=7E``!3XP(PH!,S,,05`4"@$P`P -MH`,S,,0%`4"@`S8``.I3/Z#CLS"5X0``4^,,```*33'5Y0``4^,!,*`3,S#$ -M%0-`H!$L```:3#'5Y0``4^,!0*`#`C"@$S,PQ!4!0*`3)0``ZDXPU.4``%/C -M#P``"@PPG>5W6M/EGS?3Y0``4^,$```*`C!%XG,P[^8!`%/C!@``B@$``.H# -M`%7C`P``&@$PH.,S,,3E`T"@X1(``.I(.@+C#`"=Y;,PD.$#`%;A`3"@@S,P -MQ(4#0*"!"@``BE,PU.4!`%/C,S#$!0-`H`$`,*`3,S#$%0%`H!,"``#J`$"@ -MXP```.H`0*#C!`"@X6S0C>+PC[WH$$`MZ0!`H.'^___K!`"@X?[__^L,`(3B -M_O__ZR``A.+^___K*`"$XO[__^LP`(3B_O__ZS@`A.+^___K0`"$XO[__^M4 -M`(3B_O__Z\P`A.+^___KU`"$XO[__^L0@+WH\$$MZ0!PH.%88)#E1$"0Y=B` -MD.4&`*#AT#0#XP_@H.$#\);G!P"@X?[__^M$,)?E``!3X_"!O0@>6X3B!@"@ -MX000H.'^___K>$"$X@4`5.'Y__\:"%"@X2-.B.(*C*#C!@"@X040H.$((*#A -M_O__ZXQ0A>($`%7A^/__&D``E^4``%#C`0``"@08!^/^___KU`"7Y0``4.,! -M```*C1^@X_[__^OH`(?B_O__Z^Q0E^4C3H7B`HN@XP8`H.$%$*#A"""@X?[_ -M_^N,4(7B!`!5X?C__QKH`)?E``!0XP$```J-'Z#C_O__ZP8`H.'^___K\(&] -MZ!!`+>D`0*#A_O__ZP@`A.+^___K`#"@XQ`PA.40@+WH$$`MZ0!`H.$`$*#C -MB""@X_[__^L$`*#A_O__ZP@`A.+N___K'`"$XNS__^LP`(3BZO__ZT0`A.+H -M___K6`"$XO[__^M@`(3B_O__ZQ"`O>CP3RWI#-!-X@"@H.$!<*#A`!"@XP$L -MH./^___K"@"@X?[__^L*`*#A`!"@X_[__^L,`(KB`!"@X_[__^OX`(KB`1"@ -MX_[__^M8<(KE&`"*XO[__^L@`(KB_O__ZR@`BN+^___K,`"*XO[__^LX`(KB -M_O__ZTP`BN+^___K!`@'X_[__^M``(KE``!0XP`PH`-$,(H%=P``"@,`@.(# -M0,#C1$"*Y4R`BN(>6X3B`&"@XP0`H.'^___K:'"$Y61@A.5@8(3E;&"$Y7!@ -MA.4$`*#A"!"@X?[__^MX0(3B!0!4X?+__QH!/*#C2#"*Y2HY`.-4,(KEQ`"* -MXO[__^O,`(KB_O__ZXT/H./^___KU`"*Y0``4.-7```*`P"`X@-`P./80(KE -MQ)"*XFF_A.(`4*#C"HR@XP1@H.$$`*#A_O__ZQ10A.4(<(3EN%'$X0<`H.$$ -M$*#A"""@X?[__^L``%#C1```"KI1Q.$$`*#A"1"@X?[__^L+`%3AC$"$$NS_ -M_QH$,*#CW#"*Y>``BN+^___KC0^@X_[__^OH`(KE``!0XS0```H#`(#B`T#` -MX^Q`BN7@L(KB:3^$X@0PC>4`8*#C`8"@XP*;H.,$4*#A!`"@X?[__^L48(3E -M"'"$Y;B!Q.$'`*#A!!"@X0D@H.'^___K``!0XQ\```H$`*#A"Q"@X?[__^L$ -M,)WE`P!4X8Q`A!+L__\:!#"@X_`PBN4'`*#A_O__ZP``4.,2```:B`":Y8P0 -MVN7^___K`3"@XYPPRN60`(KB`!"@X_[__^L`,*#CM#"*Y;@PBN6\,(KEP#"* -MY,``*`C -M'O\O(0`P`.,`,$#C`##3Y0``4^,&```:`#``XP`P0.,!$(/@!##1Y0`PPN4! -M`*#C'O\OX0```.,``$#C`3!#XH,$@.`!$(#@!#+1Y0`PPN4!`*#C'O\OX0(, -M4>,``*`C'O\O(0`P`.,`,$#C`##3Y0``4^,%```:`#``XP`P0.,!$(/@!"#! -MY0$`H.,>_R_A````XP``0.,!,$/B@P2`X`$0@.`$(L'E`0"@XQ[_+^$00"WI -M5#4#XP_@H.$#\)#G$("]Z!!`+>E@-0/C#^"@X0/PD.<0@+WH!$`MY0%`(.(! -M0`3B`@`0XP%`A`)T0.\&!``0XP%`A`)T0.\&"``0XP%`A`)T0.\&!`"@X1`` -MO>@>_R_A!.`MY0S03>(4P-WE$."=Y0#@C>4$P(WE6,4#XP_@H.$,\)#G#-"- -MX@"`O>@$X"WE#-!-XA#`W>4`P(WE7,4#XP_@H.$,\)#G#-"-X@"`O>@00"WI -M9,4#XP_@H.$,\)#G$("]Z`3@+>4,T$WB$,#=Y0#`C>5HQ0/C#^"@X0SPD.<, -MT(WB`("]Z`$`$.,`,-$%`##"!0$PT04!,,(%`@`0XP(PT04",,(%`S#1!0,P -MP@4$`!#C!##1!00PP@4%,-$%!3#"!0@`$.,&,-$%!C#"!04,T$WB$,#=Y0#`C>5LQ0/C#^"@X0SPD.<,T(WB`("]Z/!/+>D4T$WB -M`("@X0&PH.$"0*#A`Z"@X3B0G>4`4*#COE#-X;Q0S>$`4(WE!1"@X0$@H.,. -M,(WB_O__ZP!0C>4(`*#A!1"@X0,@H.,,,(WB_O__Z[Y0W>$$`%7A*0``.@$` -M6^,`<``3`'!`$P4``!H$,(K@O%#=X04`4^$A``#*`'``XP!P0.,(`*#A"Q"@ -MX0$@H./^___K``!:XQ,``-J^4-WA!`!5X0!@H(,%``"*#@``Z@%`A.)T0/_F -MOE#=X00`5>$)``":"`"@X000H.$&((G@-_\OX0!04.($```*`6"&X@H`5N'Q -M__^Z````Z@!0H.,(`*#A"Q"@X0`@H./^___K````Z@!0H.,%`*#A%-"-XO"/ -MO>@$X"WE%-!-X@`0H.,`$(WE`R"@XPXPC>+^___KO@#=X130C>(`@+WH<$`M -MZ0!`H.$!4*#A`!"@XP$@H./^___K!`"@X0`0H.,!(*#A_O__Z[``Q>$$`*#A -M`!"@XP$@H.'^___K`0"@XW"`O>CP02WI$-!-X@!PH.$!0*#A`F"@X0.`H.$` -M$*#C$#"-XK(08^$`$(WE!""@X_[__^L$,(;@OE#=X04`4^$``*##$```R@<` -MH.$`$*#C`2"@X_[__^L`@(WE`%"@XP10C>4'`*#A!1"@X00@H.$&,*#A_O__ -MZP<`H.$%$*#A!2"@X?[__^L!`*#C$-"-XO"!O>CP12WI%-!-X@!@H.$!@*#A -M`J"@X0-PH.$`0*#C$%"-XK)`9>$$$*#A`2"@X_[__^L`<(WE!@"@X0@0H.$$ -M(*#C!3"@X?[__^N^4-WA`*"-Y01PC>4&`*#A"!"@X00@H.$%,*#A_O__ZP8` -MH.$$$*#A!""@X?[__^L4T(WB\(6]Z`$`4>,%```:`B"`X,LM@N(H((+B`R#2 -MY0`@P^4>_R_A`@!1XPH``!H"((#@RQV"XB@0@>(#$-'EL!##X&P$,/A'O\OX00`4>,>_R\1`@"`X,LM@.(H((+B`Q#2Y0`0@^7+ -M+8#B*2""X@,@TN4"%('A`!"#Y$`((/ERPV`XBL` -M@.(#$-#E`2R"X0`@@^4>_R_A'O\OX?!!+>D`0`#C`$!`XP0`A.+_$*#C`BR@ -MX_[__^L""X3B!`"`XO\0H.,!+*#C_O__ZPD,A.($`(#B_Q"@XP$LH./^___K -M"DR$X@1`A.(&7(3B`FR@X_]PH.,$`*#A!A"@X0<@H.'^___K`DR$X@4`5.'X -M__\:`$``XP!`0./_#D3B!`!`XO\0H.,!*Z#C_O__Z[\.1.($`$#B_Q"@XP$K -MH./^___K5$"?Y09A`%0``<$`MZ1#03>(`0*#A`6"@X0)0H.$0,(WB`""@X[(@8^$` -M4(WE!""@X_[__^O@,@/C`S#4YP$`4^,%```:RPV$XBL`@.+_$*#COB#=X?[_ -M_^L%``#J!`"@X080H.'++83B*R""X@4PH.'^___K$-"-XG"`O>CP3RWI--!- -MXA``C>4!@*#A`F"@X0.@H.$`$*#C,#"-XKH08^$`$(WE!""@X_[__^L(@(WE -MM@+=X0@PAN```%/AF@``RO[__^L`D%#BEP``"A``G>4`$*#CMB+=X0DPH.'^ -M___K``!0XPP`C>6+```*$`"=Y0$0H.,!(*#A_O__Z]B!Y^(%,(+@`1")X`$@4>4)($/E -M`"#:Y0@@0^4!4(7B`4"@XS$``.H&`%3A.P``"@8P9.`!`%/C$```&@0@VN<( -MP)WE##"$X`,0V><"`%'A"```"L4`H.$!$*#C$7#'X3``C>(%4(#@""!%Y0,P -MB>`!,-/G!S!%Y0%`A.(G``#J!!"@X00PVN<(P)WE#""$X`(`V><#`%#A!@`` -M&@$`H.,$P(K@`B")X`#`W.<`(-+G`@!(` -M,`#C`#!`XQ0PC>4`,`#C`#!`XQ@PC>4`,`#C`#!`XQPPC>4'`%7CP?__V@\` -M5^,9```*``"@XP``C>40`)WE"!"@X0<@H.$+,*#A_O__ZW``[^8,`(WE%`"= -MY0@0H.'^___K&`"=Y0<0H.'^___K`%"@XQQPG>4'`*#A!1#;Y_[__^L!4(7B -M"`!5X_G__QH,$)WE``!1XPH```H&`%3A"```"@&`B.)X@._F"P"@X?\0H.,( -M(*#C_O__ZP!0H.,/<*#CUO__ZA``G>4!$*#C`""@X_[__^L)`*#AMA+=X?[_ -M_^L!``#J`""@XPP@C>4,`)WE--"-XO"/O>AP0"WI`%"@X0%`H.$"8*#A``!3 -MXP(```K^___K`$"@X2(``.HQ$*#C="#OYO[__^L%`*#A,A"@X_[__^M41.'G -M_"``X@4`H.$R$*#C!"""X?[__^L%`*#A,!"@XP8@H.'^___K!0"@X3,0H./R -M(*#C_O__ZP!`H.,S8*#C`0``Z@%`A.)T0._F!0"@X080H.'^___K@``0XP$` -M``ID`%3C]O__&F,`5.,`0*"#`4"@DP0`H.%P@+WH$$`MZ0`@TN4`,*#C_O__ -MZQ"`O>CP02WI`%"@X0%`H.$"<*#A``!3XP(```K^___K`$"@X2<``.HQ$*#C -M="#OYO[__^L%`*#A,A"@X_[__^M41.'G_"``X@4`H.$R$*#C!"""X?[__^L% -M`*#A,Q"@XW(@H./^___K`$"@XS-@H.,!``#J`4"$XG1`[^8%`*#A!A"@X?[_ -M_^N``!#C`@``&F0`5./V__\:!P``ZF,`5.,%``"*!0"@X3`0H./^___K``#' -MY0%`H.,"``#J`##@XP`PQ^4`0*#C!`"@X?"!O>@00"WI`#"@X_[__^L0@+WH -M\$`MZ1303>(`8*#A`5"@X0)PH.$`$*#C$#"-XK(08^$`$(WE`2"@X_[__^N^ -M0-WA!0!4X2D``)H&`*#A,!"@XP<@H.'^___K!@"@X3$0H.-U(._F_O__ZP8` -MH.$R$*#C_O__ZU54X>?\(`#B!@"@X3(0H.,%((+A_O__ZP8`H.$S$*#C_O__ -MZX`LX.&B+.#A!@"@X3,0H.-R(._F_O__ZP8`H.$S$*#C_O__ZP!0H.$`0*#C -M,W"@XP8``.H&`*#A!Q"@X?[__^L`4*#A`4"$XF0`5.,!```*@``5X_;__QH4 -MT(WB\("]Z/!`+>D4T$WB`&"@X0%0H.$`$*#C$#"-XK(08^$`$(WE`2"@X_[_ -M_^N^0-WA!0!4X?]`H),G``":!@"@X3$0H.-U(._F_O__ZP8`H.$R$*#C_O__ -MZU54X>?\(`#B!@"@X3(0H.,%((+A_O__ZP8`H.$S$*#C_O__ZW\@`.(&`*#A -M,Q"@X_[__^L&`*#A,Q"@X_[__^L`4*#A`$"@XS-PH.,&``#J!@"@X0<0H.'^ -M___K`%"@X0%`A.+Z#U3C`0``"H``%>/V__\*!@"@X3`0H./^___K`$"@X00` -MH.$4T(WB\("]Z/!!+>D`4*#A`4"@X0*`H.$``%/C`0``"O[__^OP@;WH,1"@ -MXW0@[^;^___K!0"@X3(0H./^___K5$3AY_P@`.(%`*#A,A"@XP0@@N'^___K -M!0"@X3,0H./^___K?R``X@4`H.$S$*#C_O__ZP4`H.$P$*#C_O__ZP``4.,. -M``"Z`$"@XS!@H.,/=P+C!0"@X080H.'^___K`4"$XG1`_^8'`%3A`#"@@P$P -MH),``%#C`#"@LP``4^/S__\:,@"@X_[__^L%`*#A,!"@X_[__^L``,CE\(&] -MZ!!`+>GT-`/C`S"0YP``4^,0@+T(,_\OX1"`O>@00"WI^#0#XP,PD.<``%/C -M$("]"#/_+^$0@+WH$$`MZ>PT`^,#,)#G``!3XQ"`O0@S_R_A$("]Z!!`+>GD -M-`/C`S"0YP``4^,0@+T(,_\OX1"`O>@00"WIW#0#XP,PD.<``%/C$("]"#/_ -M+^$0@+WH$$`MZ>`T`^,#,)#G``!3XQ"`O0@S_R_A$("]Z'!`+>D`0*#A`""@ -MXYTU`^,#(,#G`2"@XY\U`^,#(,#GN#0#XP_@H.$#\)#G`%"@X0$`4.,!(*`# -MG34#`P,@Q`<`(*`3G34#$P,@Q!<`(*#CGS4#XP,@Q.=P@+WH<$`MZ0!0H.&\ -M-`/C#^"@X0/PD.<`0*#A`0!0XP`@H`.=-0,#`R#%!W"`O>@00"WI<#4#XP,P -MD.<``%/C$("]"#/_+^$0@+WH!$`MY;0T`^,#0)#G`#"@XUDB`^,",,#G&C3$ -MY1``O>@>_R_A_P!1XP$`H!$*`*`#'O\OX0`PH.,#`-'G@``0XYX```I_``#B -M`@!`XFH`4.,`\9^7F0``ZIBD`0!4I0$`J*0!`%2E`0!4I0$`5*4!`%2E`0!4 -MI0$`5*4!`+BD`0#8I`$`5*4!`%2E`0!4I0$`5*4!`%2E`0#HI`$`5*4!`%2E -M`0!4I0$`R*0!`%2E`0#XI`$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4! -M`%2E`0!4I0$`5*4!`%2E`0`(I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$` -M5*4!`%2E`0!4I0$`5*4!`%2E`0`8I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4 -MI0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E -M`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0`HI0$`5*4!`%2E`0!4I0$`5*4! -M`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$` -M5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0`XI0$`5*4!`%2E`0!4 -MI0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!4I0$`5*4!`%2E`0!(I0$`L`#2X0$` -M@..P`,+A*@``ZK``TN$"`(#CL`#"X28``.JP`-+A!`"`X[``PN$B``#JL`#2 -MX0@`@..P`,+A'@``ZK``TN$0`(#CL`#"X1H``.JP`-+A(`"`X[``PN$6``#J -ML`#2X4``@..P`,+A$@``ZK``TN&``(#CL`#"X0X``.JP`-+A`0R`X[``PN$* -M``#JL`#2X0(,@..P`,+A!@``ZK``TN$!"X#CL`#"X0(``.JP`-+A`@N`X[`` -MPN$!,(/B$`!3XUK__QH>_R_A!$`MY03`W>4``%SC-0``"@4`4N,"\9^7+P`` -MZIBE`0"TI0$`T*4!`.RE`0`(I@$`)*8!``-`H.$``%'C(#"@`P`PQ`5_,.`3 -M`##$%7```.H#0*#A``!1XP(\H`.P,,0!!CR@$[`PQ!%I``#J`T"@X0``4>/Q -M,0`#L##$`1\^H!.P,,018@``Z@-`H.$``%'C\3$``[`PQ`%=/J`3L##$$5L` -M`.H#0*#A``!1XP$\H`.P,,0!`3N@$[`PQ!%4``#J`T"@X0``4>,/,*`#`##$ -M!1`PH!,`,,0530``Z@`@H.,`(,/E2@``Z@4`4N,"\9^710``ZG"F`0"XI@$` -MU*8!`/"F`0`,IP$`5*/Q,0`#L##$`5T^H!.P,,01&@``Z@-`H.$``%'C -M`3N@$[`PQ!$5```:MC'0X0D@0^)R(/_F`0!2XX`PH).P,,21#@``F@TP0^)S -M,/_F`0!3XP$\H).P,,21"```Z@-`H.$``%'C#S"@`P`PQ`40,*`3`##$%0$` -M`.H`(*#C`"##Y1``O>@>_R_A`#``XP`P0.,(,(#E`#``XP`P0.,L,(#E`#`` -MXP`P0.,P,(#E`#``XP`P0.,T,(#E`#``XP`P0.-0,(#E`#``XP`P0.-4,(#E -M`#``XP`P0.-8,(#E`#``XP`P0.-T,(#E`#``XP`P0.-X,(#E`#``XP`P0.-\ -M,(#E`#``XP`P0..,,(#E`#``XP`P0..0,(#E`#``XP`P0..4,(#E`#``XP`P -M0..8,(#E`#``XP`P0..<,(#E`#``XP`P0..@,(#E`#``XP`P0..D,(#E`#`` -MXP`P0..H,(#E`#``XP`P0..L,(#E`#``XP`P0..P,(#E`#``XP`P0..T,(#E -M`#``XP`P0..X,(#E`#``XP`P0..\,(#E`#``XP`P0./`,(#E`#``XP`P0./$ -M,(#E`#``XP`P0./(,(#E`#``XP`P0./,,(#E'O\OX?!/+>D40`(WB_Q"@XP@@H./^___K`0`7XPBPH!$/@*`3)@`` -M&@&0B.)YD/_F!`"@X0@0H.$`(-KE!C"@X?[__^L!L(GB>[#_Y@2@C>4$`*#A -M"1"@X0HPH.$!(//E!#"-Y08PH.'^___K$%"-X@0`H.$($*#A!2"@X08PH.'^ -M___K!`"@X0D0H.$!((7B!C"@X?[__^L`,-KE$%#=Y04`4^$%```:!""=Y0`P -MTN414-WE!0!3X0^`H`,````*#H"@XP(`%^,+D*`1*@``&@$PB^)S,/_F"`2- -MZ00`H.$+$*#A"C"@X0(@\^4(,(WE!C"@X?[__^L$()WE`9""XGF0_^8,H(WE -M!`"@X0(0H.$*,*#A`R#SY0PPC>4&,*#A_O__ZQ!0C>($`*#A"Q"@X0(@A>(& -M,*#A_O__ZP0`H.$$$)WE`R"%X@8PH.'^___K"""=Y0`PTN424-WE!0!3X00` -M`!H,()WE`##2Y1-0W>4%`%/A````"OV`".($`!?C";"@$2H``!H!,(GBD$`*#A"1"@X0HPH.$$(//E"#"-Y08PH.'^___K!""=Y0&P@N)[L/_F -M#*"-Y00`H.$"$*#A"C"@X04@\^4,,(WE!C"@X?[__^L04(WB!`"@X0D0H.$$ -M((7B!C"@X?[__^L$`*#A!!"=Y04@A>(&,*#A_O__ZP@@G>4`,-+E%%#=Y04` -M4^$$```:#""=Y0`PTN454-WE!0!3X0````K[@`CB"``7XR```!H!D(OB>9#_ -MY@IPH.$$`*#A"Q"@X08@]^4&,*#A_O__ZP0`H.$)$*#A!R#ZY08PH.'^___K -M$%"-X@0`H.$+$*#A!B"%X@8PH.'^___K!`"@X0D0H.$'((7B!C"@X?[__^L` -M,-?E%D#=Y00`4^$#```:`##:Y1=`W>4$`%/A````"O>`".((`*#A'-"-XO"/ -MO>@00"WI"-!-XA#`W>4``%SC`P``"@#`C>5`___K`$"@X0,``.H`P*#C`,"- -MY3O__^L`0*#A!`"@X0C0C>(0@+WH<$`MZ1#03>(`4*#A`6"@X0)`H.$0,(WB -M`""@X[(@8^$`0(WE`R"@X_[__^L%`*#A!A"@X00@H.'^___KOD#=X0``5.$` -M`*"3`0"@@Q#0C>)P@+WH\$$MZ0!PH.$!8*#A`H"@X0-`H.$"4(/B!0"@X?\0 -MH.,((*#C_O__ZP!PQ.4!8,3E!@"@X0@0H.$%(*#A_O__ZP$`U.7^___K"@#$ -MY?"!O>CP02WI"-!-X@!`H.$`,*#CMC#-X0!@4>($```*`#``XP`P0..P,-/A -MMC#-X2(``.HO$*#C!B"-XA@U`^,/X*#A`_"4YQP``.H%4-WE_P!5XR4```H? -M(`7B#P!2XP]0!1(.```:`3"#XG,0_^:V$,WA!`"@X0<@H.$&,*#A_O__ZP50 -MW>4/,`7B#P!3XP]0!1*V4-T!`5"%`K90S0$(```*!0"@X?[__^NV4-WA`5"% -MXH!0A>"V4,WA`0``Z@5PC>+_@0#C!`"@X;80W>$'(*#A!C"@X?[__^L``%#C -M`@``"K8PW>$(`%/AUO__F@``5N,$```*`#``XP`P0..V0-WA`$"#Y04``.H$ -M`*#A+Q"@XP8@C>(4-0/C#^"@X0/PE.>V`-WA"-"-XO"!O>CP1RWI$-!-X@!P -MH.$!D*#A`D"@X0-@H.$P@-WEL*#3X0A0C>(%`*#A_Q"@XP@@H./^___K!P"@ -MX0`0U.4%(*#A"#"@X?[__^L``%#C*```"@$0BN(!(-3E`("-Y0<`H.%Q$/_F -M"#"-XO[__^L`4*#A#P!0XQD```H``%GC!P``&@`0U.4`@(WE!P"@X04@H.$( -M,(WB_O__ZP!`H.$&``#J`!#4Y0"`C>4'`*#A!2"@X0@PC>+N``#K`$"@X0`` -M5.,``*`#$```"@<`H.$)$*#A"""@X?[__^L`H*#A"```Z@HPU.6#H(K@`:"* -MXGJ@_^8#``#J"C#4Y8.@BN`!H(KB>J#_YK"@QN$!`*#C$-"-XO"'O>CP3RWI -M+-!-X@!PH.$,$(WE`K"@X0.0H.%08-WE`##3Y0\`4^.,``":L##2X;0RS>$` -M0*#CLD+-X2=`S>4`8(WE`B"@XR(PC>+^___K)Z"-X@10H.%V``#J`(#9Y8B" -MH.$/@(CC>(#OY@<`H.$((*#A!C"@X?[__^L'`*#AM!+=X0H@H.$&,*#A_O__ -MZR7_`%/C%0``&@,`5>-L``"*`5"%XG50[^8#``#J`P!5XV<``(H!4(7B -M=5#OY@<`H.&T$MWA"""@X08PH.'^___K!P"@X;02W>$*(*#A!C"@X?[__^LG -M,-WE_P!3X^[__PH#`%CA20``&K1"W>$!$(3B<1#_YK02S>$`0-GE>$`$X@$P -MV>6$0(/A!P"@X00@H.$&,*#A_O__ZP<`H.&T$MWA"B"@X08PH.'^___K)S#= -MY?\`4^,5```:`P!5XT```(H!4(7B=5#OY@,``.H#`%7C.P``B@%0A>)U4._F -M!P"@X;02W>$$(*#A!C"@X?[__^L'`*#AM!+=X0H@H.$&,*#A_O__ZR7_ -M`%/C[O__"@\@`^(/`%+C!P``&@,`5>,G``"*`5"%XG50[^:T0MWA`4"$XK1" -MS>$9``#J`P!4X0%`H`,;```*\#`#XJB"H.&C,(CA%##-Y2=`W>4/``3B%0#- -MY?[__^L>`,WE`&"-Y0<`H.$,$)WE%""-XB0PC>(U___K``!0XP4``!H,``#J -M'S`#X@\`4^.T0MT!`D"$`K1"S0&T$MWALD+=X0$`5.&$__^*`$"@X[0RW>&P -M,,OA/P``Z@!`H.,]``#J`#"@XR6P$-+ALA+-X0!0V>4!,-GE!5*#X750 -M[^8%(*#A!C"@X?[__^L'`*#ALA+=X2<@C>(&,*#A_O__ZR7_`%/C`4"@ -M`R>`C0($```*$```Z@0`5.,D```*`4"$XG1`[^8'`*#ALA+=X04@H.$&,*#A -M_O__ZP<`H.&R$MWA"""@X08PH.'^___K)S#=Y?\`4^/N__\*`P!5X0%`H`,/ -M```*(S*@X10PS>4G0-WE#P`$XA4`S>7^___K'@#-Y0!@C>4'`*#A#!"=Y10@ -MC>(B,(WB[/[_ZP``4.,#```*`$"@X[(RW>&P,,OA````Z@!`H.,$`*#A+-"- -MXO"/O>CP12WI'-!-X@!@H.$!<*#A`H"@X0.@H.$X0-WE`#"@X[HPS>$!$*#C -M!""@X6+^_^L``%#C'@``"@Q0C>('`*#A"!"@X0H@H.$%,*#A;_[_ZP!`C>4& -M`*#A`1"@XPH@C>(%,*#A%0``ZP``4.,0```*`$"-Y08`H.$!$*#C"B"-X@PP -MC>(%___K``!0XP@```H`0(WE!@"@X0$0H.,*((WB##"-XNH``.L``%#B`0"@ -M$P```.H``*#C'-"-XO"%O>CP3RWI--!-X@!PH.$0$(WE&""-Y0@PC>588-WE -M`#"@XR\PS>6\,LWANC+-X;@RS>$`8(WE`B"@XRHPC>+^___K`&"-Y0<`H.$0 -M$)WE`2"@XR@PC>+^___K$""=Y0``4N,3```:``!6XP8```H`,`#C`#!`X[!` -MT^&$2Z#AI$N@X;Q"S>$9``#J!P"@X2\0H.,L((WB#XP_@H.$#\)?GO$+= -MX81+H.&D2Z#AO$+-X0X``.H``%;C!@``"@`P`.,`,$#CL$#3X81+H.&D2Z#A -MO$+-X04``.H`,`#C`#!`X[!`T^&$2Z#AI$N@X;Q"S>&\$MWANE+=X0$`5>&@ -M``":"#"=Y0(P@^(<,(WE`,"@XQ3`C>4'L*#A"P"@X2\@C>(&,*#A_O__ZP`` -M4../```*+T#=Y?\`5..,```*'S`$X@\`4^,D4J`1#W`$$A```!J\4MWA`5"% -MXG40_^:\$LWA"P"@X2\@C>(&,*#A_O__ZR]PW>4'4*#A#S`'X@\`4^-_```* -M\%`'XJ50H.&D4H7A`W"@X0<`H.'^___K`)"@X0@@G>4`,-+E!0!3X64``!J\ -M0MWA`4"$XG10_^:`@*#A``!8XQ4``-H`H*#C%$"=Y0QPC>4%<*#A!Q"$X`L` -MH.%Q$/_F)R"-X@8PH.'^___K``!0XP(```HG4-WE_P!5XP&@H!,!0(3B=$#O -MY@@`5.'P__^Z#'"=Y0``6N-)```:","=Y0$PW.4!`!/C`@``&@$`%^,.4*`# -M````"@]0H.,"`!/C`0``&@(`%^/]4`4"!``3XP$``!H$`!?C^U`%`@@`$^,! -M```:"``7X_=0!0(/`%7C,P``"KQ"W>$!$(3B`&"-Y0L`H.%Q$/_F!2"@X1PP -MG>7^___K`$"@X0\`4.,"```:`#"@XP@`G>46``#J$""=Y0``4N,(```:"#"= -MY0`0T^4`8(WE"P"@X00@H.$<,)WE_O__ZP!`H.$'``#J","=Y0`0W.4`8(WE -M"P"@X00@H.$<,)WE$/__ZP!`H.$``%3CYO__&AT``.H#$*#A52.@X0$`$N,! -M(-`%`<"@`QP3@@$!$,`%`3"#X@0`4^/U__\:"""=Y0$`TN7^___K"#"=Y0H` -MP^6\0MWA`1"$XHF0H.%Q$/GF<1#_YKI2W>$!`%7A!@``FKP2S>%I___JO,+= -MX1@@G>6PP,+A`4"@XP```.H`0*#C!`"@X330C>+PC[WH\$4MZ0S03>(`H*#A -M`8"@X0-`H.$H8-WE`G"#XK`0TN$!$('B`2#3Y0!@C>5Q$/_F!S"@X?[__^L` -M4*#A#P!0XP$`H`,2```*``!8XP<``!H`$-3E`&"-Y0H`H.$%(*#A!S"@X?[_ -M_^L`0*#A!@``Z@`0U.4`8(WE"@"@X04@H.$',*#AR/[_ZP!`H.$``%3B`0"@ -M$PS0C>+PA;WH\$4MZ1S03>(`8*#A`7"@X0*`H.$#H*#A.$#=Y0`0H..Z$,WA -M!""@X2?]_^L``%#C'@``"@Q0C>('`*#A"!"@X0H@H.$%,*#A-/W_ZP!`C>4& -M`*#A`!"@XPH@C>(%,*#AVO[_ZP``4.,0```*`$"-Y08`H.$`$*#C"B"-X@PP -MC>+*_?_K``!0XP@```H`0(WE!@"@X0`0H.,*((WB##"-XJ___^L``%#B`0"@ -M$P```.H``*#C'-"-XO"%O>CP3RWI3-!-X@"`H.$!H*#A`F"@X0-PH.%P0-WE -M``!4XP,```H`0(WEQ?__ZP!`H.$J`0#JMC'0X0D@0^)R(/_F`0!2XQH!`(H` -M$*#C`2"@X?[__^L?#E#C`$"@@Q\!`(HPH,WE,6#-Y3)0C>(%`*#A_Q"@XP@@ -MH./^___K!@"@X0<0H.$%(*#A_O__ZS$`W>7^___K$`"-Y0&0H.,`<*#C"6"@ -MX0`P`.,`,$#C##"-Y12@C>4$H*#A`0!6X]D``!H(`*#A!Q"@X4<@C>(`,*#C -M_O__ZP``4.."```*1T#=Y?\`5.-_```*1D#-Y0\@!.(8((WE`@"@X?[__^L< -M`(WE,##=Y20"4^$$```:@#"@X2`PC>4``%/C!@``RB@``.H!<(?B'""=Y8(P -MH.%W4$D*#A+'"- -MY2!PG>4+8*#A!1"+X`@`H.%Q$/_F1R"-X@HPH.'^___K``!0XP(```I'0-WE -M_P!4XP"0H!,!4(7B=5#OY@<`5>'O__^Z!E"@X21@G>4)0*#A*)"=Y2QPG>4` -M`%3C'#"=!8-PA0!W48()WE`S""X0$`$^,/0*`3#D"@`P(` -M$^/]0`0"!``3X_M`!`((`!/C]T`$`@10H.$/,`3B#P!3XS````H!$(?B`#"@ -MXP`PC>4(`*#A<1#_YA@@G>4R,(WB_O__ZP!`H.$/,`#B#P!3XP8```H`,*#C -M`#"-Y0@`H.$4$)WE!""@X3PPC>+^___K,3#=Y0-0)>`!`!7C#T"@`PY`H!," -M`!7C_4`$$@0`%>/[0`02"``5X_=`!!(/,`3B#P!3XP"0H`,'```*"`"@X0`0 -MH.,!(*#A_O__ZP!PH.$4,)WE,##-Y3%`S>4,()WE`$"2Y0%`A.(`0(+E`P!4 -MXWD``,IS``#J`7"'XAP@G>6",*#A=W#SYG=P_^84,)WE,##-Y6L``.HP0-WE -M,3#=Y01"@^%T0._F"`"@X0<0H.$$(*#A"C"@X?[__^L(`*#A!Q"@X48@C>(* -M,*#A_O__ZT8PW>4#`%3A(&"@`UD```K_`%/C!@``&@P@G>4`0)+E`4"$X@!` -M@N4#`%3C5@``RE```.HC4J#A#T`#X@0`H.'^___K`+"@X3P`C>+_$*#C"""@ -MX_[__^L(`*#A!1"@X3P@C>(*,*#A_O__ZP``4.,9```*`7"'XG=P_^8`H(WE -M"`"@X0<0H.$$(*#A/#"-XO[__^L`0*#A#S``X@\`4^.+<(<`=W#_!@\```H` -MH(WE"`"@X040H.$$(*#A/#"-XO[__^L(`*#A`!"@XPH@H.'^___K`'"@X0,` -M`.H!<(?BBS"@X7=P\^9W7^___K$`"-Y0PPG>4` -M0)/E`4"$X@!`@^4#`%3C!0``R@%@H.,?#E?C`#"@@P$P"9(``%/C`O__&@%` -MH.,*``#J#3!#XG,P_^8!`%/C`$"@@P4``(H`,*#C`#"-Y08@H.$',*#AF?[_ -MZP!`H.$$`*#A3-"-XO"/O>CP3RWI3-!-X@"`H.$($(WE`G"@X0-@H.$`(*#C -M2#"-X@T@8^4`8(WE`A"@X?[__^L``%?CH0``"CM`W>4(()WE`@!4X9T``#H' -M`*#A_Q"@XP@@H./^___K/`"-XO\0H.,((*#C_O__ZP"@H.,*4*#A#*"-Y0%` -MH.-'D(WB$*"-Y0`P`.,`,$#C&#"-Y0JPH.$!`!3C8@``"@@`H.$%$*#A"2"@ -MX08PH.'^___K``!0XVD```I'H-WE_P!:XV8```H?,`KB#P!3XRI"H!$/L`H2 -M%```&@%0A>)U4/_F"`"@X040H.$)(*#A!C"@X?[__^M',-WE#Q`#X@\`4>,$ -M```*\"`#XJ)`H.&J0H3A`;"@X00``.H8`)WE_O__ZP%0A>)U4/_F2@``Z@L` -MH.'^___K#`"-Y0@PG>4#`%3A,0``&H`@H.$<((WE``!2XR8``-H`H*#C$$"= -MY0$PH.,4,(WE`R"%X+`BS>$LL(WE,%"-Y0.PH.$T<(WE''"=Y7)0_^8%$(3@ -M"`"@X7$0_^8)(*#A!C"@X?[__^L``%#C!0``"D5(((WB"J""X`PP2N7_ -M`%/C`+"@$P%`A.)T0._F!*"@X0<`5.'L__^Z,%"=Y12PC>4LL)WE-'"=Y10P -MG>4``%/C($"@`QD```H!4(7B#""=Y8(PH.%U4//F=5#_Y@%`H.,2``#J`5"% -MX@P@G>6",*#A=5#SYG50_^8!0*#C"P``ZB``%.,)```*"P"@X3P0C>('(*#A -M_O__ZP%0A>(,()WE@C"@X750\^9U4/_F`4"@XP(,5>.,__\Z`##7Y?\`4^,7 -M```:`3#7Y?\`4^,4```:`C#7Y?\`4^,1```:`S#7Y?\`4^,.```:!##7Y?\` -M4^,+```:!3#7Y?\`4^,(```:!C#7Y?\`4^,%```:!P#7Y?\`4.(!`*`3`@`` -MZ@``H.,```#J`0"@XTS0C>+PC[WH\$\MZ3S03>(`0*#A`6"@X0)0H.$``%/C -M`@``"D+__^L`0*#AF0``ZK8QT.$)($/B4)@*#A`7"@XS>PC>(0D(WE_Z$`XPQ@C>4$8*#A`0`7XTD```H&`*#A"!"@ -MX0L@H.$`,*#C_O__ZP``4.-/```*-T#=Y?\`5.-,```*#R`$X@0@C>4"`*#A -M_O__ZP"0H.$,,)WE)`)3X3$``!J`(*#A%""-Y0``4N,G``#:`3"@XP@PC>4` -M<*#C$$"=Y0,@B."X(44@)WE%%"-Y7)0_^8$D*#A!1"$X`8` -MH.%Q$/_F"R"@X0DPH.'^___K``!0XP<```HW,-WE.""-X@=P@N`,,$?E"""= -MY?\`4^,`(*`3"""-Y0%`A.)T0._F!'"@X00`6.'J___*()"=Y22`G>444)WE -M"#"=Y0``4^,@<*`#%@``"@&`B.*),*#A>(#SYGB`_^8!<*#C$```Z@&`B.*` -M,*#A>(#SYGB`_^8!<*#C"@``ZB``%^,(```*!`"=Y2P0C>(%(*#A_O__ZP&` -MB.*),*#A>(#SYGB`_^8!<*#C"@!8X:;__YH`,-7E_P!3XQ<``!H!,-7E_P!3 -MXQ0``!H",-7E_P!3XQ$``!H#,-7E_P!3XPX``!H$,-7E_P!3XPL``!H%,-7E -M_P!3XP@``!H&,-7E_P!3XP4``!H'0-7E_T!4X@%`H!,-``#J`$"@XPL``.H! -M0*#C"0``Z@TP0^)S,/_F`0!3XP!`H(,$``"*!`"@X04@H.$`,*#CI_[_ZP!` -MH.$$`*#A/-"-XO"/O>AP0"WI`%"@X;!`T>$I,0CC`P!4X0`@H`/@,@,#`R#` -M!W"`O0@4`)_E!!"@X?[__^L!(*#CX#(#XP,@Q>=P@+WH*!L``'!`+>FT-`/C -M`T"0YP`PE.4``%+C!@``"@`PH./`-L3EPC;$Y<$VQ.7%-L3ER3;$Y7"`O>@( -M`!/C#P``"GDPT>6C,J#A!`!3XP`PH!,!,*`#P#;$Y7Q0T>75,.+GPC;$Y0$P -M!>+!-L3E53+@Y\4VQ.754N#GR5;$Y00``.I\,-'E(S*PX0`PH`,!,*`3P#;$ -MY;0T`^,#0)#GYST"XP,PT.<"`%/CQ3;$%>@]`N,#,-#G`0!3XP8PH`/'-L0% -M#```"@(`4^,`,*`#QS;$!0@```H$`%/C!S"@`\P0H./^___K4#OAYP$`4^,0,*`#`#"@$P-`A.$'``#J!S`$ -MX@$`4^.0```:!P"@X?00H./^___K#P(`XB!*A.$'4`3B`0!5XQ0``!H`,*#C -M!#"(Y0<`H.%H$*#C_O__ZU`AX.<$,)CE`S""X0$'$.,"(*`3`""@`P(P@^$! -M!1#C!""@$P`@H`,",(/A!#"(Y=`PX.<(,(CE4&S@YPQ@B.6(`%3C.```"@X` -M`(H8`%3C(0``"@0``(H``%3C1@``"@@`5.-4```:(P``ZB@`5.,=```*@0!4 -MXT,```H@`%3C30``&C@``.J(,`'C`P!4X3$```H&``"*F`!4XQH```JH`%3C -M'```"HD`5.-"```:.0``ZI`P`>,#`%3A'@``"J@P`>,#`%3A'P``"HDP`>,# -M`%3A.```&C,``.H```#C``!`X_[__^M-``#J````XP``0./^___K1@``Z@`` -M`.,``$#C_O__ZT(``.H```#C``!`X_[__^M!``#J````XP``0./^___K.@`` -MZ@```.,``$#C_O__ZS8``.H```#C``!`X_[__^LU``#J````XP``0./^___K -M+@``Z@```.,``$#C_O__ZRH``.H```#C``!`X_[__^LF``#J````XP``0./^ -M___K(@``Z@```.,``$#C_O__ZQX``.H```#C``!`X_[__^L:``#J````XP`` -M0./^___K%@``Z@```.,``$#C_O__ZP!`B.5P,`3B$`!3XP(``!H`,*#C*3#( -MY0@``.H@`%/C`C"@`RDPR`4$```*`0!5XP,PH`,I,,@%`S"@$RDPR!4$`*#A -M\(&]Z`=0!.*)___J`$"(Y7`P!.+O___J`$"(Y>K__^H00"WIM#0#XP-`D.?^ -M___K``"$Y1"`O>AP0"WI`$"@X0%@H.$``%+C!```"@`P`.,`,$#C`!##Y0%0 -MH.,H``#JMC'0X0TP0^)S,/_F`0!3XR(``(JT-`/C`S"0YP0PD^4"`!/C'0`` -M"C00H./^___K`P!6XP;QGY<1``#JS,@!`-C(`0#HR`$`^,@!``-LP.,!4*#C -M#```Z@-D,T$WB`&"@X0)PH.$``%'C*@``&@``4N,#```*`A"@X($<*#A_X$`XP<``.H'`-WE -M_P!0XW4```H/``#B_O__ZX!`A.`!0(3B=$#_Y@8`H.$$$*#A!2"@X0,@```*'S`%X@\`4^,/4`42#0``&@%`A.)T0/_F!@"@X000H.$((*#A!S"@ -MX?[__^L'4-WE#S`%X@\`4^,!0(0"=$#_!@]0!1(%```*!0"@X?[__^L!0(3B -M@`"@X71`\.9T0/_F!@"@X000H.$((*#A!S"@X?[__^L``%#C`0``"@H`5.'; -M__^:[S$`XP,`5.$#``":`9")XGF0[^8#`%GCR___F@FPH.$!,$OB@T2$X'1` -M_^8``%?C`#``$P`P0!,`0(,5`#```P`P0`,`0(,%!`"@X0S0C>+PC[WH?"`` -M`/!/+>F+WTWB``"-Y10@C>4<,(WE4"+=Y0@@C>48$(WE%,"=Y0$PC.`!#%/C -MU```RB@PC>(!'(/B`"#@X[`@P^&R(,/AM"##X;8@P^$(,(/B`0!3X?C__QH` -M$*#C(Q#-Y200S>4E$,WE_CT/X_\_3^.*+XWBLQ""X0``G>4H((WB`R!"X@@P -MG>7^___K)4#=Y?\`5..Z```*_CT/X_\_3^.*SXWBLU"*S4(SA`+"@ -MXP2PC>4!4*#C*!"-X@,00>(0$(WE'S`$X@\`4^,I```:`7"%XG=P_^8``)WE -M!1"@X20@C>((,)WE_O__ZR0PW>7_`%/C(P``"OXM#^/_+T_CBL^-XK)0G.$! -M4(7BLE",X0\@`^(/`%+C$```&@%0A^)U4/_F``"=Y0<0H.$0()WE"#"=Y?[_ -M_^LE0-WE_P!4XV\```K^/0_C_S]/XXH?C>*S0)'A`4"$XK-`@>%6``#J\!`# -MXJ1"H.&A0(3A!$"-Y0^P`^(#``#J)"*@X00@C>4/L`3B!7"@X00PG>4?`%/C -M!T"@@3@``(HHP(WB@X&,X`!@H.,DD(WB`9!)XOZM#^/_KT_C6S:@X0$`$^,' -M4*`1)```&@%0A^)U4/_F``"=Y0<0H.$)(*#A"#"=Y?[__^N*'XWBND"1X0%` -MA.*Z0('A(R#=Y0P@C>6P(,CA_S$`XP,`5>$9``"*`7"%XG=P_^8``)WE!1"@ -MX0D@H.$(,)WE_O__ZXK/C>*Z0)SA`4"$XKI`C.$C0-WE#!"=Y01$@>&P0,CA -M_R$`XP(`5^$'0*"!"0``B@=0H.$!8(;B`H"(X@0`5N,#```*!7"@X=#__^H% -M0*#A````Z@5`H.$!4(3B=5#_Y@``G>4$$*#A$""=Y0@PG>7^___K)4#=Y?\` -M5.,7```*_CT/X_\_3^.*SXWBLT")*SXWB`%"@X8`QH.$#$([@`S",X`5`H.'I -M___J%!"=Y0``4>,+```*2B^-XA@PG>4#((+@`#"@XP$`H.$+PC[WH\$\MZ4G?3>(``(WE#""-Y10PC>5(L=WE$!"-Y0$P@N"``%/C -MG0``RAPPC>((,(WE@!"#X@`@X..P(,/ALB##X;0@P^&V(,/A"#"#X@$`4^'X -M__\:^CX/X_\_3^,`$*#C$BZ-XK,0@N$``)WEG""-X@LPH.'^___KG$#=Y?\` -M5.,`0*`#^CX/$_\_3Q,2SHT2LT"<$0%`A!*S0(P1`4"@$_^1`./ZC@_C_X]/ -MXP10H.%```#J)Z*@X0]P!^**H:#A'!"-X@I@@>`(()WE"#""X@J@@^`!`!?C -M(```&@``G>4%$*#AG""-X@LPH.'^___K`5"%XG50_^82/HWBN$"3X0%`A.*X -M0(/AG,#=Y03`C>6PP,;A"0!5X5H``(H``)WE!1"@X9P@C>(+,*#A_O__ZP%0 -MA>)U4/_F$AZ-XKA`D>$!0(3BN$"!X9Q`W>4$()WE!$2"X;!`QN$)`%7A20`` -MB@)@AN(*`%;AIW"@$=C__QH``)WE!1"@X9P@C>(+,*#A_O__ZYQ`W>7_0%3B -M`4"@$PD`5>$`0*"#``!4XP4```H2/HWBN$"3X0%`A.*X0(/A`5"%XG50_^:< -M<-WE_S!7X@$PH!,)`%7A`#"@@P``4^.W__\:``"@XQS@C>*@P(WB`%"@X0L` -M`.JR(-'@`"##Y2(DH.$!(,/E`4"$XG1`_^8",(/B!`!4X_;__QH!`(#B$`!0 -MXP0```J`,:#A`Q".X`,PC.`%0*#A[O__Z@S`G>4``%SC"P``"J`@C>(0$)WE -M`2""X``PH.,,`*#A%,"=Y0$0TN0#$,SG`3"#XG,0_^8!`%#A^?__B@``G>4O -M$*#C'""-X@(@0N(4-0/C#^"@X0/PD.<%``#J``"=Y040H.&<((WB"S"@X?[_ -M_^O%___J2=^-XO"/O>CP3RWI--!-XAP`C>44$(WE$""-Y2`PC>58L-WE`#"@ -MXR\PS>4N,,WE+3#-Y0$+H./^___K``!0XQ@`C>4"```:``2?Y?[__^O\``#J -M`@R@X_[__^L`0*#A!`"-Y0``4.,`4*`3"&"@$P(``!K8`Y_E_O__Z_$``.H& -M`*#A_O__ZP4`A.<``%#C`@``&KP#G^7^___KZ0``Z@10A>("#%7C]/__&A`0 -MG>44()WE`C"!X`$+4^/A``#*`#"@XP`@X.,#$)3GL"#!X0,0E.>R(,'A`Q"4 -MY[0@P>$#$)3GMB#!X00P@^("#%/C]/__&@`PH.,(,(WE`1"@XPP0C>4#H*#A -M`#"-Y21`C>44+(*#A8_W_ZP``4./&```*"0"@X0`0H.,O -M((WB"S"@X?[__^LO0-WE_P!4X[X```H!4*#C'S`$X@\`4^,:```:`6"%XG9@ -M_^8)`*#A!1"@X2X@C>(+,*#A_O__ZRXPW>7_`%/C%```"@\0`^(/`%'C!P`` -M&@%0AN)U4/_F"0"@X080H.$O((WB"S"@X?[__^M*``#J\"`#XJ1"H.&B0(3A -M`$"-Y0^@`^(#``#J)"*@X0`@C>4/H`3B!6"@X0`PG>6``!/C+```&@00G>4# -M<8'@!E"@X0!`H.-:-*#A`0`3XP5@H!$>```:`6"%XG9@_^8)`*#A!1"@X2T@ -MC>(+,*#A_O__ZX2`H.$`,)?E+5#=Y;A0@^'_(0#C`@!6X18``(H!4(;B=5#_ -MY@D`H.$&$*#A+2"-X@LPH.'^___K`#"7Y0B`@^`M8-WEL##8X08T@^&P,,CA -M_S$`XP,`5>$%``"*!6"@X0%`A.($`%3C`@``"@90H.'7___J!6"@X0%0AN)U -M4/_F"0"@X080H.$O((WB"S"@X?[__^LO0-WE_P!4XP8``!H00(7B_Q$`XP$` -M5.$`0*#3`4"@PPA`C>4(``#J+T#=Y?\A`./_,%3B`3"@$P(`5>$`,*"#``!3 -MXY3__QH(0)WE"#"=Y0``4^,&```*#!"=Y0$P@>)S,._F##"-Y00`4^,(0(T5 -M>O__&@5@H.$D0)WE'`"=Y0`0H.,+(*#AW/S_ZQC`G>4`$*#C`>"@X0X``.H! -M`)3GLP"0X0``PN4!`)3GLP"0X2`$H.$!`,+E`C"#X@(@@N((`%/C]/__&@C` -MC.($$('B`@Q1XP(```H,(*#A#C"@X>W__^H0()WE``!2XPL```H8,)WE%!"= -MY0$@@^``,*#C$`"=Y2#`G>4!$-+D`Q#,YP$P@^)S$/_F`0!0X?G__XH``%OC -M!@``"@%@1N(,,)WE`2!#XH(DAN!H,)_E`""#Y04``.H!8$;B#!"=Y0$@0>*" -M)(;@4#"?Y0`@@^4`4*#C"&"@XP4`E.<&$*#A_O__ZP10A>("#%7C^?__&@0` -MH.$"'*#C_O__ZQ@`G>4!&Z#C_O__ZS30C>+PC[WHF"```+`@``#,(``````` -M```````00"WI"-!-XA#`G>440-WE``!4XPT```H``%'C!0``&@!`C>4"$*#A -M`R"@X0PPH.%._?_K)```Z@!`C>4"$*#A`R"@X0PPH.'5_O_K'@``Z@``4>,6 -M```:MA'0X0E`0>)T0/_F`0!4XP8``(H`$*#C`!"-Y0(0H.$#(*#A##"@X1W^ -M_^L0``#J#1!!XG$0_^8!`%'C#```B@`0H.,`$(WE`A"@X0,@H.$,,*#A+_W_ -MZP4``.H`$*#C`!"-Y0(0H.$#(*#A##"@X;7^_^L(T(WB$("]Z!!`+>FT-`/C -M`P"0YP``4.,0@+T('1V@X_[__^L0@+WH$$`MZ0H0H./^___K$```X@``4.,& -M`*`3!`"@`Q"`O>AP0"WI`$"@X0%@H.&V,=#A"1!#XG$0_^8!`%'C-```B@$` -M4N,I```:`!"@X_[__^L""1#C!```&@(I@.,$`*#A`!"@XW(@_^;^___K!`"@ -MX0(0H./^___K`0H0XP0``!H!*H#C!`"@X0(0H.-R(/_F_O__ZP0`H.$($*#C -M_O__ZP!0H.$B,`#B(@!3XP0```HB((#C!`"@X0@0H.-R(/_F_O__ZP$`5N-P -M@+T8!`"@X3<0H./^___K#R``X@0`H.$W$*#CL"""X_[__^MP@+WH`0!6XW"` -MO1@W$*#C_O__ZW\@`.($`*#A-Q"@X_[__^MP@+WH#3!#XG,P_^8!`%/C<("] -MB`$`4N,M```:SQ"@XVD@H./^___K!`"@X0`0H./^___K`@D0XP0``!H"*8#C -M!`"@X0`0H.-R(/_F_O__ZP0`H.$"$*#C_O__ZP$*$.,$```:`2J`XP0`H.$" -M$*#C@00"WI`$"@X0``4>,6```*`Q"@X_[__^L$ -M((#C!`"@X0,0H.-R(._F_O__ZP0`H.&`$*#C_O__ZP$@@.,$`*#A@!"@XW(@ -M[^;^___K!`"@X8(0H./^___K]R``X@0`H.&"$*#C_O__ZQ"`O>B`$*#C_O__ -MZ_X@`.($`*#A@!"@X_[__^L$`*#A@1"@XP`@H./^___K$("]Z/!/+>D,T$WB -M`'"@X0&`H.$$$(WEG6((XY=C1>.6,H;@)F.@X<2PH..;)FO@``!6XP!0H`,. -M```*`$"@XP10H.'$H*#C!P"@X0$:A.(*(*#A!#"(X/[__^L!4(7BQ$"$X@4` -M5N'V__^*Q%"@XY4&!>#$4$7B``!;XR<```K$,*#CDP8#X``PC>4'D`OBJX&P -MX1$```H!6H/B!""=Y0-`@N``8*#C"*"@XP<`H.$%$*#A"B"@X00PH.'^___K -M`6"&X@A0A>((0(3B!@!8X?7__XH>4DCB`#"=Y851@^```%GC#0``"@A@A>($ -M()WE!F""X`%:A>((4(7B`$"@XP<`H.$%$*#A!"#6Y_[__^L!0(3B`5"%X@0` -M6>'W__^*#-"-XO"/O>CP02WI`$"@X0%0H.$"8*#A`W"@X8(0H./^___K!R#` -MXP=0!>(%((+A!`"@X8(0H.-R(._F_O__ZP0`H.$&$*#A!R"@X:3__^OP@;WH -M\$$MZ0!0H.&T-`/C`T"0Y[(QU.$A`%/C`P``BO"!O1BV,=3A``!3X_"!O0@% -M`*#ASQ$`XR`@H./^___K!0"@X0,0H./^___K!``0XV-`H!,R8*`3`W"@$P0` -M`!KP@;WH`4!$XG1`[^8``%3C"```"@8`H.'^___K!0"@X0<0H.'^___K`!"@ -MX00`$./S__\:\(&]Z````.,``$#C_O__ZP4`H.$#$*#C_O__Z_L@`.(%`*#A -M`Q"@X_[__^OP@;WH\$\MZ0S03>(`0*#AM#0#XP-0D.<,`*#C_O__ZP"PH.$` -M8*#A``!0XP!`H`.K```*`#"5Y0@`$^,2```*`R"@X8`P#^,`,$#C`S`"X(`` -M4^,&```:=R`"XB``4N-T>@,3`*``$P"@0!.B```:G@``ZD(-4^-B>@,#`*`` -M`P"@0`.9```:FP``Z@$PH.,`,(#E`'"@XP>@H.$$H(;E"'"&Y;0PVN&R,<7A -M!C#:Y;8QQ>&P(-KA\#\/XP`P0.,#,`+@P"@(X\`2">,"`%/A`0!3$0$```HC -M#%/C`0``&B"@BN(@<$?B!`"@X8`0H./^___K@``0XP4```H$`*#A_O__ZP0` -MH.&`$*#C`""@X_[__^L$`*#A`1"@XP;__^NT-`/C`S"4YP`PD^4(`!/C%P`` -M"@>:H.$IFJ#A)W:PX0L```H*8*#A`%"@XP&*H.,$`*#A!1"@X08@H.$(,*#A -M9/__ZP%0A>(!:H;B!0!7X?;__XH``%GC"0``"@0`H.$'$*#A!R:*X`DPH.%9 -M___K`P``Z@0`H.$*$*#A!R"@X0O__^L$`*#A`!"@X^+^_^L$`*#A@!"@X_[_ -M_^L`8*#A`5"@XX!PH./I@P#C!@``Z@0`H.$'$*#A_O__ZP!@H.$!4(7B"`!5 -MX0,```H$`!;C]O__"OH/5>,#```Z&`&?Y080H.'^___K,0``Z@0`H.&`$*#C -M_O__ZP)0@.,$`*#A@!"@XT`@Q>/^___K`)"@XPF`H.&`8*#C!7"@XP`P`.,` -M,$#C!#"-Y0.@H.,(4*#A!`"@X080H.'^___K0``0XR@``!H'`*#A_O__Z_H/ -M5>,!4(42]?__&@0`H.$&$*#A_O__ZP`0H.$$`)WE_O__ZP``6>,.```:!`"@ -MX0H0H.'^___K`%"@X00`H.$*$*#A^R`%XO[__^L$((7C!`"@X0H0H.%R(._F -M_O__ZP&0H./=___J1`"?Y?[__^L`0*#C"0``Z@0`H.$,T(WB\(^]Z+I[`^,` -MH`#C`*!`XP$PH.,`,(;E9/__Z@%`H.,+`*#A#!"@X_[__^OQ___J4"$``*PA -M```$0"WE`0`0XP!`H!,&```:`4"@XS`TH.$!`!/C`@``&@%`A.(@`%3C^?__ -M&@0`H.$0`+WH'O\OX1[_+^$$0"WEM,0#XPQ`D.<.#%'C#0'4!0`#A``0,8`% -M$@``"@0.`.,``%'A!P``&@T!U.4``X3@%#&`Y6P(`.,``%'A``"@$P$`H`,0 -M``#J"`X`XP``4>$$```:#0'4Y0`#A.`H,8#E``"@XPT``.ILR`#C#`!1X0`` -MH!,!`*`#`0QRXPP`40$-P=0%#,.$`"PQC`7A#E'C#<'4!0S#A``8,8P%"P`` -M"A3.`.,,`%'A#<'4!0S#A``<,8P%"P``"AC.`.,,`%'A#<'4!0S#A``@,8P% -M"@``"AS.`.,,`%'A#<'4!0S#A``D,8P%"@``"H,.4>,-P=0%#,.$`#`QC`4* -M```*-,@`XPP`4>$-P=0%#,.$`#0QC`4$```*.,@`XPP`4>$-P=0%#,.$`$@Q -MC`7_`%+C`""@$P$@``(``%+C#2'4%0(CA!!,,8(5/"@`XP(`4>$-(=0%`B.$ -M`#@Q@@4+```*2"@`XP(`4>$-(=0%`D.$`#PQA`4,```*3"@`XP(`4>$-(=0% -M!2""`@(SA`<&```*:"@`XP(`4>$-(=0%`A.$`$0Q@04!((("#2'$!1``O>@> -M_R_A`0"@XQ[_+^$!`*#C'O\OX01`+>4"$$'B#@!1XP=`X(,`,`"3`#!`DP%! -MDY<"0&3@``!4XP!`H-.$0*#!=$#OQC\`5.,$`*`Q/P"@(Q``O>@>_R_A!$`M -MY0(00>(.`%'C!T#@@P`P`),`,$"3`1&#D#Q`D96B`(3@$`"]Z![_+^'P02WI -M`$"@X0&`H.&T-`/C`U"0YP(0H./H(M7E_O__ZP!PH.'I8M7E_R#5Y0(@AN`$ -M`*#A!!"@XW(@[^;^___K!P!0X0!0H*$'4*"Q!`"@X1`0H.,&(*#A_O__ZP`` -M5>$`4(BE``"(M?"!O>CP02WI`$"@X0%0H.&T-`/C`W"0YP(0H.,%(*#AP/__ -MZP!@H.$$`*#A$!"@XP4@H.&[___K`$"@X?\PU^4`(&/@``!2XP!`H-,$0&/` -M=$#OQ@!0H.,[8,?ED8T$WB#""- -MY00PC>6T-`/C`T"0YP`P`.,`,$#CN#?3X;0QS>$`,)3E=S`#XB``4^,`,*`3 -M`3"@`P@PC>4``%/C"'"@$P1PH`."@H'@!`"=Y8"B@>``,*#C`<"@XP-@H.$# -M0*#A#)"@X0-0H.$#()CG`P":YP``4N$"0&#``$!BT`4`5.,8``":!@!5XP(` -M51,4```:``!6XQ(``!H,L:#A"T"8YP0@@N```%+C!```&A@`C>(E(8#@!`"= -MY00`0N4)``#J"R":YP(@@.```%+C&`"-`B4A@``,`)T%!`!"!1EEAA$```#J -M&66&X0%0A>(!P(SB!#"#X@4`5^':__^*``!6XQT``!HG<;#A`4"@`S(```H" -MP*#C`4"@XP!0H.,4@(WB!6"@X04@V.?_`%+C#0``"@5!H.$$`%SA"0``FH(B -M@>`$,:#A`R""X`,P@>`$`)+D8`"#Y0%`A.($,(/B!`!4`,*`3`3`"`@``4^,&```*$""!XA`PF.5P -M,('E!("(X@00@>("`%'A^?__&@!`H.,$`*#A&-"-XO`/O>@>_R_A'O\OX7!` -M+>D`8*#A`4"@X0)0H.$`$)'E/R"@X_[__^L$(-7E!@"@X000E.7W(`+B_O__ -MZP@@U>4&`*#A"!"4Y?<@`N+^___K#"#5Y08`H.$,$)3EWR`"XO[__^MP@+WH -M\$$MZ0!@H.&T-`/C`W"0YP"`E^5W@`CB`$``XP!`0.,K7H3B!@"@X0`0E.4$ -M(-3E_O__ZPA`A.(%`%3A^/__&@8`H.'*%`#C"B"@X_[__^L@`%CC!@``&BLP -MU^4``%/C`P``&@8`H.%`$*#C!""@X_[__^L!`*#C\(&]Z/!!+>D`4*#A`6"@ -MX0)PH.$`0*#C!0"@X000EN?^___K!`"'YP1`A.(,`%3C^/__&@4`H.$,$);E -M_O__ZPP`A^7P@;WH<$`MZ0)`H.'^___K`%"@X00`H.%+_O_K!$`%X#0`H.%P -M@+WH\$]Z'!`+>D`4*#AM#0# -MXP-`D.?%'J#C_R"@X_[__^L)`<3E!0"@X5@<`./_(*#C_O__ZPH!Q.4%`*#A -MQAZ@X_\@H./^___K"P'$Y04`H.%H'`#C_R"@X_[__^L,`<3E!0"@X3@<`./_ -M(*#C_O__ZP`!Q.4%`*#A-!P`XP`@X./^___K!`&$Y7"`O>CP02WI`%"@X0%@ -MH.$"<*#A`$"@XP4`H.$$$);G!"#7Y_[__^L$0(3B#`!4X_C__QH%`*#A#!"6 -MY0P@E^7^___K\(&]Z/!!+>D`<*#A`8"@X0)`H.$#8*#A`0!RXP4```K^___K -M`%"@X00`H.'W_?_K!$#%X19@A.$'`*#A"!"@X08@H.'^___K\(&]Z!!`+>D` -M0*#A"!D`X_\O#^,`,*#C_O__ZP0`H.$(&0#C_R\/XP,X`./^___K!`"@X0@9 -M`./_+P_C!CH`X_[__^L$`*#A"!D`X_\O#^,',*#C_O__ZP0`H.$(&0#C_R\/ -MXP$\H./^___K!`"@X2@:`./_**#C#SB@X_[__^L$`*#A"!D`X_\O#^,!/*#C -M_O__ZP0`H.$H&@#C_RB@XQ4XH./^___K$("]Z'!`+>D`0*#A`6"@X0)0H.&= -M-0/C`S#0YP``4^,,```:3A"@X_[__^N`+.#AHBS@X00`H.%.$*#C!@`XP(JH.,!,*#C_O__ZP``5>,-```*``!6XP4```H$`*#A9!@` -MXV`@H.,!,*#C_O__ZW"`O>@$`*#A9!@`XV`@H.,",*#C_O__ZW"`O>@``%;C -M!0``"@0`H.&&'J#C`RR@XP(PH./^___K<("]Z`0`H.&&'J#C`RR@XP$PH./^ -M___K<("]Z!!`+>FT-`/C`S"0YP`PD^5W,`/B(`!3XP(``!H!(*#CP___ZQ"` -MO>@`(*#CP/__ZQ"`O>CP1RWI`*"@X0&`H.$"<*#A`&!3XO"'O0@`0*#C!%"@ -MX0"0X.,*`*#A!!"8YPD@H.$$,)?G_O__ZP%0A>($0(3B!0!6X?;__XKPA[WH -M\$$MZ0!PH.$!8*#A``!2XZ15`@,;6T`#I%4"$]M40!,``%/C!P``&@`0D>4` -M(.#CH#4"XQL[0./^___KH%4"X]M;0.,#``#J`!"1Y0`@X.,%,*#A_O__ZP%` -MH.,`@.#C!P"@X001EN<((*#A!3"@X?[__^L!0(3B$`!4X_?__QKP@;WH<$`M -MZ0!0H.$``%'C`$$`XP!!0.,!1*`#@AZ@XP`@X.,$,*#A_O__ZP4`H.$H&`#C -M`"#@XP0PH.'^___K<("]Z/!/+>F(/`)/H#P",Z"3`C>+,4(7B#P"UZ`\`K.@/`+7H#P"L -MZ``PE>4`,(SE`("6Y=B!X.<$()WE``!2XR```!H$`*#A`AN@XP`@X./^___K -M6%"-X@0`H.$%$*#A4BZ&X@@@@N(0,*#CR?[_ZP0`H.%($(WB5BZ&X@@@@N*J -M_O_K!`"@X200C>)9+H;B#"""X@DPH..^_O_K!`"@X040H.$!(*#C!S"@X8[_ -M_^L$`*#A@AZ@XP$LH./^___K[03&Y00``.H$`*#A6!"-X@$@H.,',*#A@___ -MZ^TTUN4``%/C`@``&@0`H.$!$*#CGO__ZP0`H.$"&Z#C`22@XP`PH./^___K -M!`"@X00<`.,`(.#C`#8%XZ`S0./^___K!`"@X0@<`.,`(.#CY#``XP@P0./^ -M___K!`"@X708`.,`(.#C`#`$XR`R0N/^___K!`"@X8<>H.,!*Z#C`3"@X_[_ -M_^L$`*#AAQZ@XP$CH.,!,*#C_O__ZP0`H.&&'J#C`2N@XP`PH./^___K!`"@ -MX608`.,!*Z#C`#"@X_[__^L``%?C"0``"@0`H.$A':#C`"#@XP$XH./^___K -M!`"@X408`.,`(.#C`3B@X_[__^M6OH;B"+"+X@0`H.%($(WB"R"@X1O^_^L` -M`%CC!0``"@0`H.%H&P#C`"#@XP(WH./^___K!```Z@0`H.%H&P#C`"#@X_8V -MH./^___K``!7XPP```H``%CC!0``"@0`H.%L&P#C`"#@XP(WH./^___K!``` -MZ@0`H.%L&P#C`"#@X_8VH./^___K!`"@X2@>`.,`(.#C`#``XX`P2./^___K -M!`"@X3D=H.,`(.#C`#P'XP`Q0./^___K!`"@X40>`.,`(.#C`#@$XP`Q0./^ -M___K!#"=Y8.BBN``@*#C'YP(XP"00>,"-0#C%CA"XQ@PC>4",@#C%CA"XPPP -MC>4`,`#C`#!`XQPPC>4$4*#A!0"@X>,>H.,`(.#C"3"@X?[__^L%`*#A-!X` -MXP`@X.,),*#A_O__ZP4`H.$X'@#C`"#@XP(Q`.,4,DCC_O__ZP``5^,G`0`* -M!0"@X3P>`.,`(.#C##"=Y?[__^LB3`CC`$!!XP4`H.'E'J#C`"#@XP0PH.'^ -M___K!0"@X50>`.,`(.#C!#"@X?[__^L%`*#A6!X`XP`@X.,",0#C%#)(X_[_ -M_^L%`*#A7!X`XP`@X.,,,)WE_O__ZP4`H.%,'@#C`"#@X]$X`N,0,$#C_O__ -MZP4`H.%('@#C`"#@X_DTH./^___K!0"@X4@>`.,`(.#C/C.@X_[__^OZ#Z#C -M_O__ZP4`H.&L'@#C`"#@X_[__^L`0*#A!0"@X90>`.,`(.#C_O__ZP@`C>4% -M`*#AG!X`XP`@X./^___K$`"-Y04`H.&D'@#C`"#@X_[__^L4`(WE`0(4XR0` -M`!H(,)WE4RCIYT(Q`.,#`%+A'P``"A`@G>52..GG0@!3XQL```H"`Q3C!@`` -M&E`HZ>,!```:S`.?Y?[__^L``%?C>```"@0`H.$H'@#C`"#@XP`PH./^___K!`"@ -MX2$=H.,`(.#C`3B@X_[__^L$`*#A*!X`XP`@X.,`,`#C@#!(X_[__^L$`*#A -M6!"-X@`@H.,',*#A9O[_ZP"`H.,`4`#C_U-`XP`P`.,`,$#C&#"-Y0`P`.,` -M,$#C'#"-Y0J0H.$$`*#AYAZ@XP`@X.,",*#C_O__ZP0`H.'F'J#C`"#@XP`P -MH./^___K^@^@X_[__^L$`*#AK!X`XP`@X./^___K`*"@X00`H.&T'@#C`"#@ -MX_[__^L(`(WE!`"@X;P>`.,`(.#C_O__ZPP`C>4$`*#AQ!X`XP`@X./^___K -M$`"-Y00`H.','@#C`"#@X_[__^L4`(WE``!:XRD``+H(()WE!3`"X$(A`.,C -M"%+A)```"@P@G>4%,`+@0@A3XR````H!`1KC!P``&A`@G>4%,`+@,B$`XR,( -M4N$"```*!3``X#8(4^-X```:&`"=Y?[__^L!`%CC`:"@$Q(``!H<`)WE_O__ -MZP0`H.&T'@#C`"#@X_[__^L%,`#@(SB@X1`PB>4$`*#AO!X`XP`@X./^___K -M!3``X",XH.$4,(GE`:"@XP```.H`H*#C`8"(X@(`6..J__\:"I"@X0``6N,! -M```:Y`&?Y?[__^L$`*#A*!X`XP`@X.,`,*#C_O__ZP0PG>4``%/C;0``"NTT -MUN4``%/C`@``&@0`H.$`$*#C%?[_ZP0`H.%8$(WB4BZ&X@@@@N(0,*#CV_W_ -MZP0`H.%($(WB"R"@X4K]_^L$`*#A)!"-XEDNAN(,((+B"3"@X]']_^L$`*#A -M(1V@XP`@X./3/@+C`S!`X_[__^L``%?C!0``"@0`H.%$&`#C`"#@X],^`N,# -M,$#C_O__ZP!<".,`44#C!`"@X>,>H.,`(.#C!3"@X?[__^L$`*#A-!X`XP`@ -MX.,%,*#A_O__ZSP``.H%`*#A/!X`XP`@X.,8,)WE_O__Z^W^_^H%0*#A!0"@ -MX90>`.,`(.#C_O__ZU`(Z><``(KE!0"@X9P>`.,`(.#C_O__ZU`(Z><$`(KE -M!0"@X:0>`.,`(.#C_O__ZU`(Z><(`(KE!0"@X:P>`.,`(.#C_O__ZU`(Z><, -M`(KE*___Z@F@H.$```#C``!`X_[__^L$`*#AM!X`XP`@X./^___K4`CIYQ`` -MB>4$`*#AO!X`XP`@X./^___K4`CIYQ0`B>4$`*#AQ!X`XP`@X./^___K4`CI -MYQ@`B>4$`*#AS!X`XP`@X./^___K4`CIYQP`B>6)___JG-"-XO"/O>C<(0`` -M+"(``/!/+>FTT$WB`*"@X0%`H.&T-`/C`V"0YXS`C>*$Y)_E#P"^Z`\`K.@/ -M`+[H#P"LZ``PGN4`,(SE``!4XP8```H*`*#AC!"-XE^__K``!0XQ<``!H*`*#A#!"-X@$@H.,",*#CE_O_ -MZP``4.,!4*`3$```&@!`H.-@,)7E`T"$X`10A>(%`%GA^O__&@``5./_4*`# -M`U"@$P8``.H!0(3B=$#OY@(`5./&__^:_U"@XP```.H`4*#C;'"=Y72PG>5\ -M@)WEA`"=Y0``C>7_`%7C$P``"J,PX..P$(WBA2*!X`-PDN?8=8;E!!""X@,0 -MD>?<%8;E"!""X@.PD><0$(+B`X"1Y^"%AN60,!+EY#6&Y8P@$N4`((WE`9"@ -MXPE`H.$&``#J`3R@X^`UAN78-8;E`)"@X^25AN7*% -M60!`3@"@"@X3(=H./_(P#C)#2@X?[_ -M_^L*`*#A3!P`XP(AH./4,^#G_O__ZP1`E^4"#!3C!$O@$21+X!$$$)WED00$ -MX`1`C>4D1*#A"@"@X90<`.,/(J#C5#/CY_[__^L*`*#A,AV@XS\HH.,_,`3B -M_O__ZPH`H.%,'`#C`B*@XP3`G>7<,^#G_O__ZP``6^,"```:M`&?Y?[__^L0 -M``#J"@"@X10<`./_(P#C"#"7Y?[__^L,,)?E"@"@X10<`.,_*Z#C/S`#XO[_ -M_^L,,)?E"@"@XH.,/(J#C4S/CY_[__^L`,);E=S`#XB``4^--```:``!8 -MXTL```H``%GC`!```P`00`,`$``3`!!`$P```.,``$#C_O__Z_\`5>-!```* -M``!9XS\```H*`*#AB!P`XP`@X./^___K('N@X0PPC>*%4H/@$$"5Y0(,%.,$ -M2^`1)$O@$9<$!.`*`*#AB!P`X_\C`.,D-*#A_O__ZPH`H.%,'`#C`B.@X]0S -MX.?^___K%$"5Y0(,%.,$2^`1)$O@$9<$!^`G1*#A"@"@X9P<`.,/(J#C5#/C -MY_[__^L*`*#AB!P`XS\HH.,_,`3B_O__ZPH`H.%,'`#C`B2@X]7^___K'#"5Y0H`H.$$ -M$*#A/RN@XS\P`^+^___K'#"5Y0H`H.%X'`#C#RJ@XU,SX^?^___K"@"@X8P0 -MC>)7+H;B""""X@DPH..+^__KM-"-XO"/O>AL%@``7"(``/A/+>D`4*#AM#0# -MXP-`D.<`,)3E=S`#XB``4^,/```:`#"4Y0@`$^,(```**S#4Y0(`4^,E```: -M=H$`XP!``.,`0$#C`&``XP!@0.,D``#JH`&?Y?[__^L``*#C^(^]Z``PE.4( -M`!/C%```"BLPU.4"`%/C!0``&G:!`.,`0`#C`$!`XP!@`.,`8$#C%```Z@$` -M4^-Z@0`#`$```P!`0`,`8``#`&!``W:!`!,`0``3`$!`$P!@`!,`8$`3"``` -MZC`!G^7^___K``"@X_B/O>AV@0#C`$``XP!`0.,`8`#C`&!`XP``4>,Q```: -M``!8XSX``-H&0*#A`&"@XP%PH.,%L*#C,I"@XP"@X.,`,)3E_@!3XP(``!H) -M`*#A_O__ZQ<``.K]`%/C`@``&@L`H.'^___K$@``ZOP`4^,"```:!P"@X?[_ -M_^L-``#J^P!3XP(``!H)`*#A_O__ZP@``.KZ`%/C`@``&@L`H.'^___K`P`` -MZOD`4^,!```:!P"@X?[__^L%`*#A`!"4Y0H@H.$$,)3E_O__ZP<`H.'^___K -M`F"&X@A`A.(&`%CAUO__R@X``.H!`%'C#```&@5LA.(`<.#C`8"@XP4`H.$` -M$)3E!R"@X00PE.7^___K"`"@X?[__^L(0(3B!@!4X?7__QH!`*#C^(^]Z*PB -M``#P1RWI`&"@X0%`H.&T-`/C`Z"0YS^0`N(D&`#C`"#@X_[__^L`<*#A``!4 -MXP!0H`$&```*A#&$X(,QBN`&`*#A#!.3Y0`@X./^___K`%"@X7]4Q>,"5<7C -M`H''XP8`H.$D&`#C`"#@XP@PH.'^___K"@"@X_[__^N$,83@@S&*X(E;A>$& -M`*#A#!.3Y0`@X.,",87C_O__ZV0`H./^___K!@"@X208`.,`(.#C`C&'X_[_ -M_^L*`*#C_O__ZP8`H.$D&`#C`"#@XP@PH.'^___K"@"@X_[__^L``%3C!0`` -M&@8`H.&"'J#C`2R@X_[__^MP4._F!@``Z@$`5.,/```:!@"@X2@8`.,!+*#C -M_O__ZW!0[^8``%7C"```"H1!A."$H8K@!@"@X3`3FN7_+P_C#R!`X_[__^L` -M0*#A!P``ZH1!A."$H8K@!@"@X2P3FN7_+P_C#R!`X_[__^L`0*#A!`"@X?"' -MO>CP1RWI`&"@X0%`H.$"@*#A`W"@X2"@G>7_/P_C#S!`XP,`5^$%```*FO__ -MZP!0H.$'`*#AZ?C_ZP=0Q>$:H(7AM#0#XP,PEN>$083@A$&#X/^DRN,/ILKC -M/S`(X@8`H.'\$I3E`"#@XP,ZBN'^___K\(>]Z'!`+>D#0*#AA?__ZP!0H.$$ -M`*#AU/C_ZP1`!>`T`*#A<("]Z/!/+>FYWTWB`$"@X0P0C>4"L*#AM#0#XP,P -MD.<<,(WE`&``XP!@0..FSXWB1>^&X@\`ON@/`*SH#P">Z`\`C.@`4*#C"CV- -MX@10@^0$4(/D!%"#Y`10@^0$4(/D`%"#Y2`PH.-X,HWE,#0%XZ`P0.-\,HWE -M@3>@XX`RC>7D,`#C"#!`XX0RC>6!.:#CB#*-Y7[/C>)-[X;B#P"^Z`\`K.@/ -M`+[H#P"LZ`\`ON@/`*SH#P">Z`\`C.AVSXWB73^&X@\`D^@/`(SH0'"@XV8/ -MC>(%$*#A!R"@X?[__^LL-0CCF#&-Y2PE".,!($#CG"&-Y2PU".,%,$#CH#&- -MY:0AC>6H,8WE+C4(XP(P0..X,8WE+C4(X[PQC>4N)0CC`R!`X\`AC>7$,8WE -MR#&-Y58/C>(%$*#A!R"@X?[__^L9,`+C!3!`XU@QC>44(`+C!2!`XUPAC>43 -M(`+C!2!`XV`AC>4/(`+C!2!`XV0AC>6-(`+C!2!`XV@AC>4:(`+C!2!`XW@A -MC>5\,8WE%C`"XP4P0..`,8WE,S`"XP4P0..$,8WE4#`"XP4P0..(,8WE1@^- -MX@40H.$'(*#A_O__Z[`]"N,!,$#C&#&-Y1PQC>6@/0KC`3!`XR`QC>60/0KC -M`3!`XR0QC>6`/0KC`3!`XR@QC>7[/J#C.#&-Y3PQC>7Z/J#C0#&-Y?D^H.-$ -M,8WE/CV@XT@QC>41/HWB82^&X@,`DN@#`(/H0C^-XF-OAN(#`);H`P"#Z*`` -MC>(%$*#A:""@X_[__^L#H.#CH*#-Y0*`X..A@,WE`2#@XZ(@S>6C(,WE`##@ -MXZ0PS>6E,,WE`7"@XZ=PS>4"8*#CJ&#-Y0-0H..I4,WE!,"@XZK`S>4%`*#C -MJP#-Y080H..L$,WEK:#-Y:Z`S>6O(,WEL"#-Y;$PS>6R,,WEM'#-Y;5@S>6V -M4,WEM\#-Y;@`S>6Y$,WE!9#@X[J0S>6[H,WEO"#-Y;T@S>6^,,WEOS#-Y<%P -MS>7"8,WEPU#-Y<3`S>7%`,WEQA#-Y<7(,,WER3#-Y7+,,WES##- -MY7/8,WET%#-Y='`S>72`,WETQ#-Y0H@X./4(,WE""#@X]4@S>4&(.#C -MUB#-Y00@X./7(,WEV(#-Y=DPS>4<()WE`#"2Y0``6^,"P*`3!\"@`3C`C>4( -M`!/CQ0$`&@0`H.%H&P#C`"#@X_XVH./^___K``!;XP0```H$`*#A:!L`XP`@ -MX./^-J#C_O__ZP!@H..F?XWB`(#@XZY?C>($`*#A!A"7YP@@H.'^___K!@"% -MYP1@AN(@`%;C]___&@0`H.%V'XWB>B^-XG3Y_^L$`*#A?A^-XHXOC>(0,*#C -MB?G_ZS@@G>4``%+C+@$`"@PPG>4.4(/BQ5"@X0P`5>,,4*"C0,"-XC3`C>5N -M+XWB,""-Y0`PH.,0,(WE##"-Y:`PC>(``%7C!3"#H#PPC>4`P`#C_,))XQ3` -MC>4$`*#A#!"=Y0X@H.,`,.#C_O__Z]`WY.4,`(/G -M$3Z-X@QPD^<`8*#C?E^-X@"`X.,$`*#A!A"5YP@@H.$',*#A_O__ZP1@AN)` -M`%;C]___&@P@G>4``%+C.@``&@!@H.,&4*#AIG^-X@&KH.,&D*#A`(0`XP"$ -M0.,`L.#C!`!5XP8``(H$`*#A!A"7YPL@H.&>SXWB!C",&```:KB^-X@8PDN<$`*#A"R"@X0,PB.'^___K`P``Z@0`H.$*(*#A -M"3"@X?[__^L!4(7B!&"&X@@`5>/D__\:`%P(XP!10.,$`*#AXQZ@XP`@X.,% -M,*#A_O__ZP0`H.$T'@#C`"#@XP4PH.'^___K!`"@X78?C>)Z+XWBROC_ZP$X -MH.,`,(WE!`"@X0$0H.,`(*#C`##@X_[__^LF``#J`%P(XP!10.,$`*#AY1Z@ -MXP`@X.,%,*#A_O__ZP0`H.%4'@#C`"#@XP4PH.'^___K!`"@X78?C>)Z+XWB -MLOC_ZP$XH.,`,(WE!`"@X0`0H.,!(*#A`##@X_[__^L/,`#C`3!`XP`PC>4$ -M`*#A`!"@XQ`@H.,`,.#C_O__ZP,Q`.,",$#C`#"-Y00`H.$`$*#C$2"@XP`P -MX./^___K#,"=Y8PRH.%F+XWB`R""X!@@C>5@((WB`R""X"P@C>56+XWB`R"" -MX"@@C>5&+XWB`R""X"0@C>4\()WE(""-Y2BN`.,$4*#A&#"=Y0!`D^44%`*#A#!"=Y0P@H.,`,.#C_O__ZRC` -MG>4`,)SE`#"-Y04`H.$,$)WE`""@XP`PX./^___K`$"-Y04`H.$,$)WE#2"@ -MXP`PX./^___K)""=Y0`PDN4`,(WE!0"@X0P0G>4*(*#C`##@X_[__^L`8*#C -M`$#@XP*QH.,#@*#C`)``X_R20>,%`*#A"A"@X00@H.$+,*#A_O__ZT+/C>(0 -M,)WE`W"7^___K"`"@X?[__^L%`*#A!Q"@X00@ -MH.$),*#A_O__ZP@`H.'^___K!0"@X0H0H.$$(*#A`#"@X_[__^L%`*#A#!"= -MY0L@H.,$,*#A_O__Z]!TY.4$<(+D+""-Y1@PG>4$,(/B&#"-Y2C`G>4$P(SB*,"-Y20@G>4$ -M((+B)""-Y2`PG>4-,(/B(#"-Y3#`G>48()WE`@!4"`%SAX_[_B@0`H.%V'XWB>B^-XHCX_^L`8*#CIG^-XJY?C>(`@.#C -M!`"@X080E^<((*#A!C"5Y_[__^L$8(;B(`!6X_?__QH$`*#A?A^-XHXOC>(0 -M,*#C!/G_ZS@PG>4``%/C1P``&D(``.H&,9?G`#"-Y04`H.$&$*#A#2"@XP`P -MX./^___K`0!6XPP``!H`L(WE!0"@X0@0H.$0(*#C`##@X_[__^L,P)WE`,"- -MY04`H.$($*#A$2"@XP`PX./^___KAC**X`8BB>`(0*#A`!"3Y0P`4>,$$!*% -M`!"#A0%`A.($,(/B!"""X@@`5./V__\:`6"&XC@@G>4&`%+AV?__B@5`H.%H -M4(WB'&"=Y0!PH.,.@*#C`*#@XP*0H.$,`)7H@S*@X0(E@^$(,)7E`R""X0@P -M%>6#-X+A\#2&Y000%>6!)X+A]"2&Y0`PC>4$`*#A!Q"@X0@@H.$*,*#A_O__ -MZP%PA^(@4(7B"&"&X@<`6>'I__^*`3"@XQS`G>4`-4`4(WE -M!`"@X0`0H.,-(*#C`##@X_[__^L`8*#C8*"-XD"0C>(&@*#AMG^-X@^P`.,! -ML$#C`3$`XP(P0.,,,(WE!%"@X;O__^JYWXWB\(^]Z!!`+>FT-`/C`T"0YP`U -MU.4``%/C$("]&``PE.5W,`/B(`!3XP(``!H!(*#C3?W_ZQ"`O>@`(*#C2OW_ -MZQ"`O>CP3RWI#-!-X@!`H.$!@*#AM#0#XP,PD.<`8)/E"&`&X@,=`./^___K -M`%"@X7!P$.(,```*!`"@X0,=`../(`7B_O__ZP0`H.$`$*#C`2"@X?\_`./^ -M___K`*"@X0``6.,@```*!@``Z@0`H.$B%0#C_R"@X_[__^L`D*#C":"@X2(` -M`.H$`*#A`1"@XP`@H./_/P#C_O__ZP"0H.'_OP_C"+!`XPLP"N`!.(/C`#"- -MY00`H.$`$*#C`2"@X?\_`./^___K"[`)X`&XB^,`L(WE!`"@X0$0H.,`(*#C -M_S\`X_[__^L)``#J_S3`X_4$`*#A`!"@XQ@@ -MH./_/P#C_O__ZP``5N,"```*9`"@X_[__^L!``#J`P"@X_[__^L``%?C$@`` -M"@0`H.$#'0#C!2"@X?[__^L`H(WE!`"@X0`0H.,!(*#A_S\`X_[__^L``%CC -M"@``"@"0C>4$`*#A`1"@XP`@H./_/P#C_O__ZP,``.H$`*#A(A4`XP`@H./^ -M___K#-"-XO"/O>@00"WIM#0#XP,PD.<`,)/E=S`#XB``4^,"```:`1"@XX3_ -M_^L0@+WH`!"@XX'__^L0@+WH\$\MZ3303>(`H*#A`8"@X0@@C>40P(WB(#&? -MY0\`D^@/`(SH`3R@XR`PC>4)/*#C)#"-Y0([H.,H,(WE`S"@XRPPC>4`0*#C -M!&"@X0&PH.,,<*#A_Y\/XP^00.,P((WB"#&"X!`P0^(,,(WE!%"@X0,`6.,( -M\9^7`P``ZI@)`@`<"0(`'`D"`$@)`@``L*#C'@``Z@PPG>4`0)/E"@"@X000 -MH.$%()?G_O__ZPH`H.$$$*#A_O__ZP!@H.$3``#J!3"7YP,ZH.$C.J#A!3"' -MYP`PC>4*`*#A"!"=Y0,@H.,),*#A_O__ZPH`H./^___K"@"@X0@0G>4#(*#C -M`##@X_[__^L`8*#A"@"@X_[__^L%0)?G!@!4X00``!H$4(7B$`!5XP(```H$ -M8*#AS___Z@"PH.,+`*#A--"-XO"/O>@0%P``\$\MZ0S03>(`<*#AM#0#XP-` -MD.<`,)3E=S`#XB``4^,(```:`#"4Y0@`$^.)```*3F"@XP!0`.,`4$#C`$`` -MXP!`0.,6``#J`#"4Y0@`$^.````**S#4Y0(`4^,%```:`6"@XP!0`.,`4$#C -M`$``XP!`0.,*``#J`0!3XP%@H`,`4``#`%!``P!```,`0$`#`6"@$P!0`!,` -M4$`3`$``$P!`0!,``%'C!```"@$`4>-J```:``!6XS,``,IG``#J1EZ$X@A0 -MA>+_CP_C#X!`XP"@H.,!8*#C!;"@XS*0H.,`()3E_@!2XP(``!H)`*#A_O__ -MZR```.K]`%+C`@``&@L`H.'^___K&P``ZOP`4N,"```:!@"@X?[__^L6``#J -M^P!2XP(``!H)`*#A_O__ZQ$``.KZ`%+C`@``&@L`H.'^___K#```ZOD`4N," -M```:!@"@X?[__^L'``#J!#"4Y0`PC>4'`*#A"A"@X0@PH.'^___K!@"@X?[_ -M_^L(0(3B!0!4X=7__QHT``#J!4"@X0!0H./_KP_C#Z!`XP&`H.,%L*#C,I"@ -MXP`@E.7^`%+C`@``&@D`H.'^___K(```ZOT`4N,"```:"P"@X?[__^L;``#J -M_`!2XP(``!H(`*#A_O__ZQ8``.K[`%+C`@``&@D`H.'^___K$0``ZOH`4N," -M```:"P"@X?[__^L,``#J^0!2XP(``!H(`*#A_O__ZP<``.H$,)3E`#"-Y0<` -MH.$($*#A"C"@X?[__^L(`*#A_O__ZP)0A>((0(3B!0!6X=3__\H!``#J`$"@ -MXP```.H!0*#C!`"@X0S0C>+PC[WH\$$MZ0!0H.&T-`/C`T"0YR!@E.4@$(3E -M)2#$Y8@U`^,#,)#G``!3XV<``!J,-0/C`S"0YP``4^-C```:M#0#XP-`D.(`0*#A`6"@X;0T`^,#4)#G.##5Y0``4^,?```*`2!!XG(@[^8",(7@.Q#3 -MY000S>5),-/E!3#-Y;0T`^,#,)#G*3#3Y0,`4^,``%,3!0``&@)0A>!7,-7E -M`##-Y64PU>4!,,WE!0``Z@(`4^,"4(4`D(T$WB`&"@X0%0 -MH.&T-`/C`T"0YR1PU.4H,-3E!0!3XRH```H``%'C`5"@`R10Q.6(-0/C`S"0 -MYP``4^,B```:C#4#XP,PD.<``%/C'@``&K0T`^,#<)#G!1"@X?[__^L%H*#A -M*C#7Y0``4^,7```*`$"@XP!<#^/_7T_C_X\/XP^`0.,8D*#C02^$X@(QE^<# -M,`7@"C"#X0(QA^<`,(WE!@"@X000H.$)(*#A"#"@X?[__^L!0(3B=$#OYBHP -MU^4$`%/A[___B@```.HD<,3E"-"-XO"'O>@00"WI_O__ZQ"`O>CX3RWI`&"@ -MX;0T`^,#4)#GASZ@X^PRA>4T,X7E=#@`XWPSA>7$,X7ECCZ@X_`RA>4X,X7E -MY#@`XX`SA>7(,X7EABZ@X_0BA>5D.`#C/#.%Y?@BA>5`,X7E(3V@X_PRA>5$ -M.`#C1#.%Y7@X`.,`,X7E2#.%Y7PX`..0,X7EV#.%Y0PX`.,$,X7E3#.%Y90S -MA>7<,X7E@CZ@XP@SA>4H.`#C4#.%Y20X`.,,,X7E+#@`XU0SA>58.`#C$#.% -MY5@SA>5<.`#CH#.%Y>@SA>7%/J#C%#.%Y5@\`.-<,X7EQCZ@XZ0SA>5H/`#C -M[#.%Y50\`.,8,X7E7#P`XV`SA>5D/`#CJ#.%Y6P\`./P,X7E%#P`XQPSA>4< -M/`#C9#.%Y20\`..L,X7E+#P`X_0SA>7!/J#C(#.%Y1@\`.-H,X7EPCZ@X[`S -MA>4H/`#C^#.%Y3(]H.,D,X7EB#P`XVPSA>7)/J#CM#.%Y9@\`./\,X7EA#P` -MXR@SA>6,/`#C<#.%Y90\`..X,X7EG#P`XP`TA>6*/J#C+#.%Y:0X`.-T,X7E -MJ#@`X[PSA>6L.`#C!#2%Y;@X`.,P,X7EO#@`XW@SA>6V,=#A#3!#XG,P_^8! -M`%/C+```BB@0H./^___K`$"@X0(`H./^___K`B"$XP8`H.$H$*#C4(`!/C!```&@8`H.$B$*#C'R"@X_[__^L'``#J -M!@"@X2(0H.,/(*#C_O__ZP8`H.$5$*#CZ2"@X_[__^L&`*#A)1"@XX`@H./^ -M___KM#0#XP-PEN<&`*#A`!"@XS+Y_^L`0*#A`0!0XX(``!H'L*#A*3#7Y0`` -M4^,U```:!@"@X008`.,#(*#C`C"#XO[__^L&`*#A#!D`XS,@`.,P($#C(C`` -MXR`P0./^___K!@"@X00:`./_)*#C13"@X_[__^L&`*#A!!P`X_\@H.,C,*#C -M_O__ZP8`H.'''J#C,""@XP$PH./^___K!@"@X70>`.,#(Z#C`C"@X_[__^L& -M`*#A>!X`XP,CH.,",*#C_O__ZP8`H.%\'@#C`R.@XP(PH./^___K!@"@X3H= -MH.,#(Z#C`C"@X_[__^L&`*#AB!X`XP,CH.,",*#C_O__Z^@!G^7^___KX#(# -MXP,PUN<``%/C.0``&@TQR^6T-`/C`T"6YP`PE.4(`!/C!0``"BLPU.4!`%/C -M`$```P!`0`,$```:!0``ZJ0!G^7^___K`$"@XS0``.H`0`#C`$!`XQ5]A.(! -MD*#C!:"@XS*`H.,`,)3E_@!3XP(``!H(`*#A_O__ZQ<``.K]`%/C`@``&@H` -MH.'^___K$@``ZOP`4^,"```:"0"@X?[__^L-``#J^P!3XP(``!H(`*#A_O__ -MZP@``.KZ`%/C`@``&@H`H.'^___K`P``ZOD`4^,!```:"0"@X?[__^L&`*#A -M#@"4Z/[__^L,0(3B!P!4X=O__QH&`*#A`1"@X[3X_^L`0*#A`0!0XP0``!H& -M`*#A)!@`XP(LH./^___K&`3+Y;8QUN$*`%/C#```&@`@E>6`,`_C`#!`XP,P -M`N!"#5/C!@``&BLPU>4!`%/C(@``&@8`H.%R'`#C4""@X_[__^NV,=;A#3!# -MXG,P_^8!`%/C&0``B@`PE>4(`!/C%@``&@8`H.%`$*#C_O__ZP0@@.,&`*#A -M0!"@XW(@[^;^___K!@"@X008`.,!*:#C`#"@X_[__^L&`*#AAQZ@XV`@H.,# -M,*#C_O__ZP8`H.&&'J#C8""@XP`PH./^___K!`"@X?B/O>CL(@``'",``![_ -M+^$`,`#C`#!`XP$38>`"(('@@@&3YQ[_+^$```#C``!`XP$38>`"$('@_S3# -MXP\VP^.!,8#G@1&`X`$PH.,',,'E'O\OX0```.,``$#C`1-AX`(0@>"!`8#@ -M!##`Y1[_+^$```#C``!`XP$38>`"$('@@0&`X`8PP.4>_R_A\$$MZ0!@H.$` -M4*#C!7"@X0&`H.,3``#J)C!$X@$`4^,%``":!@"@X040H.$$(*#A!S"@X?[_ -M_^L$``#J!@"@X040H.$$(*#A"#"@X?[__^L!0(3B0`!4X^[__QH!4(7B`@!5 -MX_"!O0@'0*#AZ?__ZO!!+>D`8*#A`%"@XP5PH.$!@*#C$P``ZB8P1.(!`%/C -M!0``F@8`H.$%$*#A!""@X0/P@;T(!T"@X>G__^IP`"WI`&"@XP`@ -M`.,`($#C!D"@X0L``.H`0(/E!$##Y09`P^4%0,/E!T##Y0%0A>((,(/B0`!5 -MX_;__QH!8(;B`@!6XP0```J&-*#AAC%#X`,P@N`$4*#A[O__ZG``O>@>_R_A -M!.`MY0S03>(`,`#C`#!`XP'#8>`"P(S@C#&#X`4PT^4!`%/C$```&@`P`.,` -M,$#C`<-AX`+`C.",,8/@!C#3Y0$`4^,(```:`#``XP`P0.,!PV'@`L",X(PQ -MD^<`,(WE_S\/XP\P0./^___K#-"-X@"`O>CP02WI`&"@X0!0H.,%<*#A"0`` -MZ@8`H.$%$*#A!""@X?[__^L!0(3B0`!4X_C__QH!4(7B`@!5X_"!O0@'0*#A -M\___ZA!`+>D(T$WBM#0#XP-`D.<``%'C`@``"@$`4>,4```:"@``ZA`TE.4# -M.\/C`3N#XQ`TA.4`,(WE`!"@XQ@@H./_/P_C#S!`X_[__^L(``#J$#24Y0,[ -MP^,0-(3E`#"-Y0`0H.,8(*#C_S\/XP\P0./^___K"-"-XA"`O>AP0"WI`4"@ -MX0)0H.$`,`#C`#!`XP$C8>`%((+@@C&#X`0PT^4!`%/C``"@$W"`O1@%(*#A -M_S\/XP\P0./^___K`#``XP`P0.,$(V3@!2""X((QD^<#`%#A!@``"@`P`.,` -M,$#C!"-DX`4@@N"",8/@`2"@XP4@P^4`,`#C`#!`XP1#9.`%4(3@A3&#X`4` -MT^5P@+WH\$$MZ0!@H.$`4*#C!7"@X0D``.H&`*#A!1"@X00@H.'^___K`4"$ -MXD``5./X__\:`5"%X@(`5>/P@;T(!T"@X?/__^IP0"WI"-!-X@!`H.&T-`/C -M`V"0YP`PH.,`,(WE!#"-Y8@YD.4#`%/C&P``&C\_`^,_/T/C!#"-Y0`PT>4# -M**#A`R2"X0,@@N$#/(+A`#"-Y2``4^,#``":W3+6Y0``4^,@,*`3`#"-%0$P -MT>4#**#A`R2"X0,@@N$#/(+A!#"-Y2``4^,I``":W3+6Y0``4^,@,*`3!#"- -M%20``.KB--;E`0!3XP0``!H0,`'C$#!!XP`PC>4$,(WE'```Z@(`4^,:```* -M`##1Y0,LH.$#)(+A`R""X0,X@N$`,(WE`3#1Y0,HH.$#)(+A`R""X0,\@N$$ -M,(WE-S#6Y0``4^,+```:*#&6Y0!0G>4#4(7@+#&6Y0,TA>``,(WE2#&6Y010 -MG>4#4(7@3#&6Y0,\A>`$,(WE#1"@X0C@C>(`P*#C/P"@XP%0H.$,,*#A`R#5 -MYS\`4N,#`,6'`3"#X@0`4^/Y__\:!!"!X@X`4>'T__\:!`"@X0@>`./_+*#C -M`##=Y?[__^L$`*#A;!@`X_\@X.,`4)WE)32@X?[__^L$`*#A;!@`X_\@H.,' -M,-WE_O__ZP0`H.$X&`#C_R#@XP1`G>7_-,3C_O__ZPC0C>)P@+WH\$\MZ0S0 -M3>(`8*#AM#0#XP-`D.P``"BHPVN4``%/C`5"@`P0``!IY``#J`#":Y0@`$^/W__\:<@``Z@`PH.,$ -M,(WE`7"@XP.PH.$#4*#A!H"@X05@H.$#`%7C!?&?EQ0``.HL'`(`4!P"`"P< -M`@!0'`(`A3&%X(,QBN"Z/X/B"`"@X000D^40(*#C_O__ZP0`C>4'``#JA3&% -MX(,QBN"Z/X/B"`"@X000D^4!)J#C_O__ZP0`C>6&D8;@B9&*X"].B>((`*#A -M"!"4Y0$FH.,',*#A_O__ZP<`H.'^___K"`"@X000E.40(*#C!S"@X?[__^L' -M`*#A_O__Z\)/B>((`*#A!!"4Y0$KH.,+,*#A_O__ZP<`H.'^___K"`"@X000 -ME.4"*Z#C"S"@X?[__^L'`*#A_O__ZP``5>,"```*`0!5XPH``!H$``#J"`"@ -MX080H.'^___K`$"@X0X``.H(`*#A!A"@X?[__^L`0*#A$P``Z@,`5>,%\9^7 -M`P``ZE`=`@!X'0(`4!T"`'@=`@`'0*#A$@``Z@=`H.&&88;@AF&*X+IOAN(( -M`*#A!!"6Y1`@H.,$,)WE_O__ZP@``.H'0*#AAF&&X(9ABN"Z;X;B"`"@X000 -MEN4!)J#C!#"=Y?[__^L!`%3C"```&@%0A>)U4._F*C#:Y04`4^&4__^*!%"@ -MX0(``.H`4*#C````Z@10H.$%`*#A#-"-XO"/O>CP3RWI9-!-X@``C>4@((WE -MM#0#XP-0D.<`,-'E1##-Y0$`0N(<`(WE`""%X*M`TN4#0(3@!#R@X00X@^$$ -M,(/A!$2#X5!`C>4!,-'E13#-Y;E`TN4#0(3@!#B@X00\@^$$,(/A!$2#X51` -MC>4@,)7E``!3XP(PH`&/,-,%1$#=!01`@P!$0,T%1$#=Y00TH.$$/(/A!#"# -MX01(@^%(0(WE(#"5Y0``4^,%```:'""=Y0)0A>"=,-7E14#=Y01`@^!%0,WE -M14#=Y00XH.$$/(/A!#"#X01$@^%,0(WE`#"@XP@PC>4$,(WE1$"-XB#`G>4$ -MP$SB_\`,XB3`C>4`,`#C`#!`XPPPC>4,X(/B$."-Y;0T`^,``)WE`V"0YQPP -MG>4#((;@XR""X@`PH.,#<*#A2!"-XOJY#^/YN4_C%*0!XQ2D0>,&@*#A`V"@ -MX3<`V.4#`%#C`/&?EVL``.I$'P(`@!\"`!@@`@`T(`(```!7XP@`H!,``*`# -M!,"=Y0``C.!$`(#B``&8YWS`[^8!`%SC4,"-D@-0G)<#4)&'`%"%X`!@H.-F -M``#J#0'8Y0$`4.,`8*`#$@``"@(`4.,0``":(."=Y0,`7N,`8*"3!@``FB0` -MG>4%`%#C`6"@DP(``)H@P)WE"0!G`G@.4%6*#A!ER%X41@W>4&8(7A -M15#=Y054AN$$X)WE?@#OY@$`4.-0`(V2`P"0EP,`D8<%4(#@`&"@XPT``.H` -M`%?C"`"@$P``H`,$P)WE``",X$0`@.(``9CG?,#OY@$`7.-0P(V2`U"(#4(#G`7"'X@0P@^(.((+B`@!7XW'__QJT-`/C`."=Y0,PGN<4,(WE -M.#"-X@S`G>4'`)SH!P"#Z"PPC>(0X)WE!P">Z`<`@^@`L*#C"Z"@X7^0H.,8 -ML(WE6`"-X@M0D.<`,*#C@R&@X1D2!>`Q(J#A4I,-#E`@!3XP4``!IH.`#C'"X`XP,`5>$"`%41!0``"BL``.I( -M.`#C%"X`XP,`5>$"`%41)@``&@APH.$4/@#C'"X`XP,`5>$"`%41R5Z@`P4` -M``I(.`#C:"@`XP,`5>$"`%41F#P`XP-0H`$%@*#A`&"@XP(`5N,#```*"`!7 -MXPAP1X()``"*!P``Z@8`5^,%``":!B!'X@``G>4"$(7B4($*#A=R#OYO[__^L!8(;B=F#OY@&`B.(#`%;CY___&@&@BN)Z -MH._F!+"+X@(`6N.B__\:!""=Y0$@@N($((WE"#"=Y0(P@^((,(WE!@!2X^W^ -M_QIDT(WB\(^]Z`1`+>6T-`/C`T"0YT0DE.7_),+C_RS"XP$P`.,$,$#C`P!2 -MX0@``!K8-)3E``!3X]!$E`4.```*T$24Y00`4^$#0*"Q!$"@H0D``.I$--3E -M`3!#XG,P[^8!`%/CT$24E0,``)I&--3E!`!3XP!`H!/81)0%=`#OYA``O>@> -M_R_AM#0#XP,PD.<`(*#C$B;#Y1[_+^$$0"WEM#0#XP-`D.?]-M3E``!3XPD` -M``H`,)3E=S`#XB``4^,%```*-#"1Y30`DN4``%/A-#""I78PT:5V,,*E$`"] -MZ![_+^$$0"WEM#0#XP-`D.<`,)3E=S`#XB``4^,>```*_3;4Y0``4^,;```* -M`#"@XP@WA.4,-X3E$#?$Y0`@X.,$)L3E#C;$Y54@X.,1)L3E_";4Y0PFQ.4- -M)L3E``"@XP`0H.-()@#C\@"$X64NH./R`(3A6"8`X_(`A.%F+J#C\@"$X6@F -M`./R`(3A9RZ@X_(`A.%X-L3E>3;$Y1``O>@>_R_A!$`MY;0T`^,#0)#G`#"4 -MY7$Y0@WE.4!,(/B"#>$Y04``.H$-Y3E`1"#X`07A.4, -M-Y3E`3"#X@PWA.40`+WH'O\OX?!/+>FLT$WB`+"@X;0T`^,#0)#G*`"-X@`0 -MH..`(*#C_O__ZVPPF^4!`!/CB```"A1`C>5P`!/C_P"@`P@`C05L```*`"`` -MXP`@0.,<,(WB`P"2Z`0`@^2P$,/A_O__ZPT`H.%_/<#C/S##XP0@D^4!((+B -M!""#Y7_,*#C"#"-Y0P@C>4" -MD*#A!G"@XQR@C>(0L(WE!+"@X:^/B>(!@(CB$`"=Y8B!@.``4)OE)```Z@A@ -M1>(`4)7EX$"&X@0`H.$*$*#A!R"@X?[__^L``%#C&P``&@0`H.$`$)WE!R"@ -MX?[__^L``%#C%0``&M`PEN4!`!/C$@``"B`WEN4($)WE`P!1X0,0H*$($(WE -M#""=Y0,`4N$#(*"Q#""-Y:@`C>($$)WE`2&`X-@0EN4#.('A@#`"Y00@G>4! -M,(+B4(`*#A!1"@X?[__^L``%#CU?__"@&0B>((L(OB(`!9X\O_ -M_QH0L)WE#0"@X7\]P.,_,,/C!""3Y0$@0N($((/E_O__ZQ00G>4;--'E`0!3 -MXPL``!H$8)WE``!6XP@``-HH0(WB`%"@XPL`H.$$$*#A_O__ZP%0A>($0(3B -M!@!5X?C__[H,()WE``!2XQ0PG17<)(,5`@``&@`PH.,4$)WEW#2!Y0@@G>7_ -M`%+C%#"=%=@D@Q4`,*`#%`"=!=@T@`5L,)OE"``3XPD```H4$)WE&S31Y0$` -M4^,%```:T#21Y0,XH.&H$(WBA#`AY0L`H.'^___KK-"-XO"/O>AP0"WI`%"@ -MX;0T`^,#0)#G,#34Y0``4^,7,*`#1S3$!7"`O0A(--3E1R34Y0,`4N%P@+T( -MQ1Z@XW\@H./^___K!0"@X5@<`.-_(*#C2#34Y?[__^M(--3E1S3$Y7"`O>AP -M0"WI`%"@X0%@H.&T-`/C`T"0Y_`UU.4``%/C&0``&G08`.,`(.#C_O__ZW,) -M`.(@!Z#A]`6$Y04`H.'''J#C`"#@X_[__^O0`>#G^`6$Y04`H.%<&`#C`"#@ -MX_[__^L@#*#A_`6$Y04`H.%T&@#C`"#@X_[__^M0!N/G``:$Y0$PH./P-<3E -M``!6XP$PH!-?-,05$@``&F`TE.4``%/C`C"@`U\TQ`4-```*7B34Y0$`4N,% -M```:'0!3XP`PH,-?-,3%`3"@TU\TQ-4$``#J&0!3XP$PH--?-,35`#"@PU\T -MQ,5?--3E7B34Y0,`4N%P@+T(``!3XR,``!H%`*#A=!@`XP(`8*#A`7"@X0W`H.$XX)_E#P"^Z`\`K.@# -M`)[H`P",Z`!`H.,-4*#A!@"@X000E><'(*#A_O__ZP1`A.(8`%3C^/__&AS0 -MC>+P@+WH0!<``'!`+>D`0*#A`%!1X@`0`!,`$$`3`!```P`00`,```#C``!` -MX_[__^NM#H3B_O__ZP`@H.$$`*#A!1"@X?[__^MP@+WH<$`MZ0!`H.&T-`/C -M`S"0Y^@6P^6M7H#B!0"@X?[__^L`(*#A!`"@X0`0H./^___K!0"@X?[__^L` -M(*#A!`"@X0$0H./^___K<("]Z!!`+>FT-`/C`T"0YP`PE.5W,`/B(`!3XQ<` -M``K]-M3E``!3XQ0```IL,)#E`0`3XP``H!,2!L05$("]&!(VU.4``%/C``"@ -M$Q(&Q!40@+T8`3"@XQ(VQ.4,%M3E`@!1XP,0H`$"$*`3#!;$Y0`@H./^___K -M`0"@XQ"`O>@``*#C$("]Z/!/+>D$Y0PWA.4$-L3ED@$` -MZA@T`>/38(7A2!8`X]$@A.$&@*#A!Y"@X0*`6.`#D,G@^(#-X>`D`>-E/J#C -MTX"$X=*@A>$(H%K@";#+X/"@S>'Q8(3AT@"%X?,`A.$$-M3E`0!3XVL``!H, -M-M3E`@!3XPL``!I8-@#CTP"$X=A@S>$&`)#@!Q"AX/,`A.%H-@#CTP"$X0H` -MD.`+$*'@\P"$X0L``.IF/J#CTP"$X=B`S>$(`)#@"1"AX/,`A.%G/J#CTP"$ -MX="@S>$*`)#@"Q"AX/,`A.$,9M3E`@!6XP%@H`,"8*`3#C;4Y0$P0^)S,._F -M#C;$Y0``4^,$```*`*"@XP"PH./PH#PH%H-@#CTP"$ -MX5@V`./3H(3A`*":X`&PJ^!Y-M3E`0!3XP8``!H*<*#ABS&@X:H^@^&*(:#A -M`J":X`.PJ^`%``#J``!3XP,``!K0`4Y0``4>,` -MD*#3`@``V@`'E.7^___K`)"@X0P7E.4``%'C`'"@TP(``-H$!Y3E_O__ZP!P -MH.$"`%CC!X"@$0EPH!$)@*`!"':$Y1D``.H(%Y3E``!1XP!@H-,"``#:``>4 -MY?[__^L`8*#A#!>4Y0``4>,`<*#3`@``V@0'E.7^___K`'"@X0R&U.4"`%CC -M!H"@`0>`H!$--M3E`@!3XP=@H!$(9H3E`&"@XP"@H.,`L*#C\*'-X00VU.4! -M`%/C5@``&@XFU.4``%+C4P``&@\VU.4``%/C,0``&A00G>4!`%OA`P``B@P` -M`!H0,)WE`P!:X0D``)H,-M3E`@!3XQ$VU`6#,*`!$3;$!1$VU!6#,*`1`3"# -M$A$VQ!4(``#J##;4Y0(`4^,1-M0%@S"@`0$P@P(1-L0%$3;4%8,PH!$1-L05 -M$1;4Y0`PH.,#<*#A`V"@X5$CH.$!`!+C`6"&$G9@[Q8!<(<"=W#O!@$P@^(( -M`%/C]O__&@PVU.4"`%/C`@``&@<`5N$"``"*`P``Z@<`5N$!```Z`F"@XP`` -M`.H!8*#C#S;4Y0$`4^,)```:53#@XQ$VQ.4(-I3E`P!8X0QFU*4#``"J#&;4 -MY0(`5N,!8*`#`F"@$P`PH.,$-L3E$#?$Y0`WA.4(-X3E!#>$Y0PWA.4`(*#C -M`#"@XU@6`./Q((3A9AZ@X_$@A.%H%@#C\2"$X6<>H./Q((3A20``Z@``4^-' -M```:>3;4Y0$`4^,2```:T"#-X=A@S>$&()+@!S"CX*,PL.%B(*#A``!3XP0` -M`!H&```:.!P)XQP00.,!`%+A`@``F@$PH.-Y-L3EA```Z@`PH.-Y-L3E$P`` -MZ@``4^,1```:T"#-X=B@S>$*()+@"S"CX*,PL.%B(*#A``!3XP0``!H&```: -M.!P)XQP00.,!`%+A`@``F@$PH.-Y-L3E;P``Z@`PH.-Y-L3E#&;4Y0(`5N,! -M8*`#`F"@$P$PH.,$-L3E$#?$Y=`@S>'8`,WA`""2X`$PH^```%/C`@``&@8` -M`!KZ#U+C!```F@0PH.,.-L3E`#"@XP\VQ.4#``#J`C"@XPXVQ.4!,*#C#S;$ -MY0`PH.,`-X3E"#>$Y00WA.4,-X3E##;4Y08`4^$#```*!0"@X080H.$!(*#C -M_O__ZPPVU.4--L3E#&;$Y0B&A.4.-M3E``!3XT0```H!`!/C'P``&@\VU.4` -M`%/C%```&GDVU.4!`%/C!P``&@`P`.,`,$#C`!"3Y6$.A.($`(#B`1"!XO[_ -M_^LT``#J``!3XS(``!H`,`#C`#!`XP`0D^5A#H3B!`"`X@40@>+^___K*@`` -MZ@`P`.,`,$#C`!"3Y6$.A.($`(#B,A"!XO[__^LB``#J#S;4Y0``4^,4```: -M>3;4Y0$`4^,'```:`#``XP`P0.,`$)/E80Z$X@0`@.()$('B_O__ZQ0``.H` -M`%/C$@``&@`P`.,`,$#C`!"3Y6$.A.($`(#B"A"!XO[__^L*``#J`#``XP`P -M0.,`$)/E80Z$X@0`@.(R$('B_O__ZP(``.H`,*#C$#;$Y8[__^HD`0*#A3#8#XP,PD.D4K-,7E*33%Y;04`^,!0);G,#3$Y00PH.,Q-,3E(#"@XT@TQ.4`,*#C1S3$ -MY44TQ.5$-,3E`R"@XT8DQ.4C`*#C-`2$Y2@`H.,X!(3E&0Z@XSP$A.7Z#Z#C -M0`2$Y3X`H.-,!,3E'@"@XTT$Q.4*P*#C2<3$Y0S`H.-*Q,3E`\#@XTO$Q.5/ -M),3E4#3$Y58$Q.55-,3E6#2$Y24PH..!-L3E*23%Y0%PEN@H.$`@*#C#4"@ -MX08`H.$($)3G_O__Z\`%RN4$@(CB`:"*XA@`6./W__\:`3"@X^`TQ^4`,*#C -MXC3'Y;0D`^,"$);GX#+!Y=@4`>,!,(;G`D"6YXTTQ.7,-,3E*#34Y0$`4^.( -M-,0%`#"@$X@TQ!4I--7E!#"#XRDTQ>6T)`/C`D"6YP`PH./C-,3EY#3$Y>DT -MQ.4!,*#CY33$Y2DTU>4(,(/C*33%Y0)`EN?`-M3E``!3XPL```H&`*#A`!"@ -MXQX@H./P,*#C_O__Z]0&Q.4&`*#A`!"@XQ\@H./P,*#C_O__Z]4&Q.6T)`/C -M`D"6YP(PH.-<-,3E733$Y5XTQ.5?-,3E`#"@XV`TA.4I%-7E$!"!XRD4Q>4" -M0);G`#>$Y00WA.4(-X3E##>$Y?P6U.4,%L3E#1;$Y0`0X.,$%L3E"#:$Y1`V -MQ.55$.#C$1;$Y0)`EN=\-H3E@#;$Y2DTU>4J-,7EA$0`XZ1T`.,&`*#A!!"@ -MX?[__^L_``#B@@;%Y0%`A.(!4(7B!P!4X?;__QHF(/`)7H -M!P"LZ+(PS.`C.*#A`##,Y>@UE.4!,(/BZ#6$Y0$PH./D-,3E)##4Y0X`4^,$ -M```:QC74Y0``4^,!,*`#QC7$!0,``.K&-=3E``!3XP`PH!/&-<05"0"@X0`0 -MH.,D(*#C'S"@X_[__^MPH._F.1#4Y0H08>`)`*#A<1#OYO[__^L)`*#A_O__ -MZP`@G>4``%+C`B"@$P$@H`,$((WE``!:XW`"``H)`*#A,AV@XP`@X./^___K -M`#``X\`_3^,#``#@`&``XX!O1^,&8`/@!@!0X0!0H`,'```*`5"@XY09G^4` -M(`#CP"]/XP4QD><#,`+@``!3X0$``!J,4,WE`@``Z@%0A>(E`%7C]O__&@`P -MG>4``%/C%0``"@D`H.&('`#C`"#@X_[__^L@"Z#A``N@X08`4.$`4*`#!P`` -M"@%0H.,P&9_E`"``X\`O3^,%,9'G`S`"X`,`4.$!```:C5#-Y0(``.H!4(7B -M)0!5X_;__QH)`*#A)!H`XP`@X./^___K/S\#XS\_0^,#,`#@F'"-X@0P)^4` -M4*#C!6"@X0`P`.,`,$#C0K^#X@*PB^($@*#C`C"#X@@PC>4,H(WE`Z"@X<8U -MU.4``%/C"```"@<`H.$%$(K@"""@X?[__^L!`%#C"@``&@R@G>5V8._F#0`` -MZ@<`H.$%$(O@"""@X?[__^L!`%#C#*"=!79@[P8%```*`6"&X@A0A>(A`%;C -MY___&@R@G>4`8*#CZ334Y0``4^,4```:.3#4Y>DTQ.7JI,3EZZ3$Y>PTQ.4$ -M$)WE``!1XPD``-H$,*#A`%"@XXP`C>(%(-#GR"7#Y'X__^Z=F#OYL=EQ.7+9<3E*S#4Y0$`4^,;```:UC74Y0,@A.#.I<+E`3"# -MXG,P[^;6-<3E"`!3XP`PH`/6-<0%!#"@X0!0H.,%<*#A!6"@X,4``#*'P``Z@00G>4``%'C"P``V@0PH.$`4*#CD`"-X@APS>7,)=/E -M",#=Y0(@;.`%(,#G`5"%X@$P@^(!`%7A]___NLLUU.4#<&?@=W#OY@APC>4/ -M``#J!#"@X0!0H..0`(WB"'#-Y'W__^ZRS74Y0-PA^!W<._F"'"-Y>DTU.4#`%KA"C!C@'-P[X8#,&J0(!,(/B`0!5X?C__[K' -M-=3E`S!FX,'X__^ZQS74Y0,PAN#'-<3E`#"@XP@PC>4K,-3E`0!3XR,```HY,-3E"@!3 -MX0,``#H$$)WE``!1XQ(``,H:``#J!!"=Y0``4>,)``#:!#"@X0!0H..0`(WB -MR"73Y0$@@N(%(,#G`5"%X@$P@^(!`%7A^/__NL4* -M``#J!#"@X0!0H..0`(WBR"73Y04@P.'Y__^ZQ\74Y0C` -MC>4$P)WE``!=S(*_F)`!2XR0@H,,%(,''`P`` -MRG,PK^8%`%/C!C"@TP4PP=,@(*## -M"""-Q00``,H(,)WE@``3XP$```H`P*#C","-Y>4TU.4``%/CSP``"@9@E^'- -M```*`#``XP`P0..04-WE!3&#X+`PD^78593EW&64Y0``5>,E```*`@P5XP5; -MX!$E6^`1(WN@X9<%!>`$4(WE523IYPP@C>4"#!;C!FO@$29KX!&7!@;@1E2@ -MX0PPG>4'>X/A/S`%X@D`H.$R':#C`"#@XP,XA^'^___K"0"@X90<`.,/(J#C -M53/CY_[__^L)`*#A3!P`XP(AH.,$P)WEW#/@Y_[__^L)`*#A3!P`XP(BH./6 -M,^#G_O__ZPT``.H)`*#A,AV@XP`@X./^___K"0"@X90<`.,/(J#C`#"@X_[_ -M_^L)`*#A3!P`XPHBH.,`,*#C_O__Z\8UU.4``%/C)P``&@@@G>5R<._F`&`` -MXP!@0..'48;@"0"@X2(:`.,((=7E_O__ZPD`H.$C&@#C"2'5Y?[__^L",(7B -M"0"@X20:`.,((=/E_O__ZPD`H.$E&@#C"R'5Y?[__^L$,(7B"0"@X28:`.,( -M(=/E_O__ZPD`H.$G&@#C#2'5Y?[__^L)`*#A*!H`XPXAU>7^___K"0"@X2D: -M`.,/(=7E_O__ZR4``.H(,)WE`)`*#A(QH`XP$@UN7^___K"0"@X20:`.,"(-;E_O__ZPD`H.$E&@#C -M`R#6Y?[__^L&4*#A"0"@X28:`.,$(-;E_O__ZPD`H.$G&@#C!2#6Y?[__^L) -M`*#A*!H`XP8@UN7^___K"0"@X2D:`.,'(-;E_O__ZP#`G>4``%SC/```"@`P -M`.,`,$#CD5#=Y04Q@^"P,)/EX%64Y>1EE.4``%7C)0``"@(,%>,%6^`1)5O@ -M$2-[H.&7!07@`%"-Y54DZ><$((WE`@P6XP9KX!$F:^`1EP8&X$94H.$$,)WE -M!WN#X3\P!>()`*#AB!P`XP`@X.,#.(?A_O__ZPD`H.&<'`#C#R*@XU4SX^?^ -M___K"0"@X4P<`.,"(Z#C`,"=Y=PSX.?^___K"0"@X4P<`.,")*#CUC/@Y_[_ -M_^L-``#J"0"@X8@<`.,`(.#C_O__ZPD`H.&<'`#C#R*@XP`PH./^___K"0"@ -MX4P<`.,*)*#C`#"@X_[__^L#`%CC`P``FNNDQ.4)`*#A`!"@X_[__^L+`%KA -M'P``"CE@U.4*8&;@=F#OY@,UU.4``%/C"@``"G90K^8-4(7BI5^%X,4PH.&8 -M((WB`S&"X`D`H.%H&P#C'RN@XW0P$^7^___K!#74Y0``4^,*```*=E"OY@U0 -MA>*E7X7@Q3"@X9C`C>(#,8S@"0"@X6P;`.,?*Z#C0#`3Y?[__^OLI,3EY334 -MY0``4^/II,05`#"@X^,TQ.64`$*#C)""@X_\_#^,/ -M,$#C_O__ZP$PH./F-,3E`@``ZC?]_^L`,*#CYC3$Y0C0C>(0@+WH\$\MZ3S0 -M3>(`0*#A.""-X@$PH.,!,&+EM#0#XP.`D.=9,@/C`U#0YR40H.,8-0/C#^"@ -MX0/PD.>=-0/C`S#4YP$`4^.U!``:``!5X[,$`!HW4-WE``!5X[`$``H$`*#A -M!OG_Z[1T`^,'4)3G!`"@X=H>H.,`(.#C_O__ZR`(H.%D!(7E!`"@X:0=`.,` -M(.#C_O__ZW`P_^9H-(7E(&B@X6QDA>4$`*#AJ!T`XP`@X./^___K<`#_YG`$ -MA>4$`*#ASQZ@XP`@X./^___K<##_YH`TA>4@:*#AA&2%Y6@4E>5D))7E`B"! -MX&P4E>4!((+@4$`*#A+!H`XP$IH.,!,*#C -M_O__ZP0`H.%<&@#C_R"@X_[__^MX!(7E!`"@X5@:`./_)*#C_O__ZP`,H.%X -M-)7E(#B#X'@TA>5H%)7E9"25Y0(@@>!L%)7E`2""X'`4E>4!((+@`S""X'PT -MA>4$`*#A#1R@XP(CH.,!,*#C_O__ZP0`H.$-'*#C`B.@XP`PH./^___K!`"@ -MX2P:`.,#*:#C`#"@X_[__^L$`*#A+!H`XP,IH.,",*#C_O__ZP=0E.,#,)3G`@!3XP0PH,-&-,7%M#0#XP-@E.=%)-;E1#36Y0,`4N$$```* -M`@!3XP0```H!`%/C?0``&@$``.H``%+CA0``"@0`H.'Y]__K3@3&Y;0T`^,# -M8)3G3C36Y10@@^(^`%+C/C"@PTPTQL44,(/23#3&U7PDEN40-P+C`P!2X14` -M`)I5)-;E`2""XG(@[^95),;E5C36Y4@4UN4!`%/A5A3&-0$PH#-5-,8U'P`` -M.@(`4N,=``":3"36Y0$0@^("`%'A323&Q0$P@])--,;5X3Z@XU@TAN44``#J -M6#26Y0``4^,!,$,26#2&%0\``!I5--;E``!3XPD``!I6--;E`2!#XAT`4N,> -M,*#35C3&U4TTQM4!($/"5B3&Q4TTQL4"``#J`P!3XP`PH`-5-,8%?#26Y?D` -M4^,B``"*!`"@X?T4`./^___K`0`0XPHPH!-)-,85%0``&GPTEN5`));E`@!3 -MX0<``)I)--;E2R36Y0(00^("`%'A223&M0(P0Z))-,:E"0``ZCPDEN4"`%/A -M!@``*DDTUN5*)-;E`A"#X@(`4>%)),;%`C"#TDDTQM5.)-;E"B""XDDTUN4" -M,&/@2#3&Y0X``.KZ#U/C1S36A0(P@X)(-,:%"0``BNXB`.,"`%/A1S36A0$P -M@X)(-,:%`P``BGT/4^-'--8U`3!#,D@TQC5,--;E2"36Y0,`4N%(-,:%3336 -MY4@DUN4#`%+A2#3&-00`H.&6^/_K"@``Z@`PH.-.-,;E!""@XS$DQN4*(*#C -M223&Y2`@H.-(),;E1S3&Y00`H.&*^/_KM#0#XP-@E.?8=);E;#"4Y7``$^," -M```*1#36Y0``4^,$```*`#"@XRPTQN4$,*#C,33&Y40``.HL--;E``!3XP<` -M`!H!,*#C+#3&Y0`PH.,Q-,;E(#"@XT@TQN4$`*#A6T-`/C -M`U"4YVPPE.4!`!/C!@``&M@TE>4``%/C#0``&F`TA>5L,)3E`0`3XPD```I` -M`!/C`0``&B``$^,"```*V#25Y6`TA>4$``#JT#25Y6`TA>4!``#JV#25Y6`T -MA>4`,)7E=S`#XB``4^,"```*!`"@X0`0H./^___KM#0#XP-@E.?@--;E``!3 -MXTH```HI--;E`@`3XP`PH`/B-,8%10``"FPPE.4!`!/C!@``&MA4EN4``%7C -M`#"@`^(TQ@7A-,8%!@``&CL``.I``!/C`@``&B``$^/05)8%````"MA4EN5) -M`%7C`C"@P^(TQL4'``#*0S!%X@,`4^,!,*"3XC3&E0(``)H]`%7C`#"@T^(T -MQM7B)-;EX336Y0,`4N$C```*!`"@X200UN7^___KXC36Y0``4^,2```:M#0# -MXP.@E.<Z`,`C.@`<*#C'%"-X@0`H.$'$)7G -MP"7:Y?[__^L$<(?B`:"*XA@`5^/W__\:"@``Z@$`4^,#```:!`"@X100H.,Z -M^/_K!```Z@(`4^,"```:!`"@X1`0H.,T^/_KXC36Y>$TQN4$`*#A_O__Z[0T -M`^,#8)3GZ#;6Y0``4^,'`@`**336Y0@`$^,$`@`*P#;6Y0``4^,!`@`*PC;6 -MY0,`4^/^`0`:;#"4Y1``$^/[`0`:`0`3XP"PH`/D.I\%`+##!0D```K8.I_E -M`%#3Y0``5>,!L*`#"Q"@`0`0PP4!(*`3O#J?%0`@PQ4`L*`3M#0#XP-PE.=L -M,)3E`0`3XP>@H`$`D*`#P```"@0`H.']%`#C_O__ZP"@H.$$`*#AB!0`X_[_ -M_^L`4*#A>`J?Y040H.'^___K!`"@X8P4`./^___K%`"-Y6`*G^44$)WE_O__ -MZP0`H.%)'J#C_O__ZP@`C>4!H`KBQ#;7Y0H`4^$B```*Q*;'Y>@]`N,#,-3G -M`P!3XP&0H!.7```:`""@XQ`ZG^4!(,/E!3"@X\($`*#A_10`XP4@H.'^___KQ`F?Y040H.'^___K`9"@XWH``.JT"9_EZ#T" -MXP,0U.?^___K_P3%X_J?H..9``#@"!"=Y?[__^L`4*#A%""=Y?\$PN.9``#@ -M"!"=Y?[__^L`D*#AS%:'Y=`&A^5P"9_E!1"@X?[__^MH"9_E"1"@X?[__^L` -M`%KC7P``"N@]`N,#,-3G`P!3XUL``!I("9_E_O__ZQT`5>,=`%F3!5"@DP\` -M`)IO,$GBB@!3XP!0H),+``":QP!5X\<`68,'4*"#!P``BE<_1>(",$/BE0!3 -MXPA0H),"``":?0]5XPE0H",&4*`S`B"@X\PXG^4!(,/EZ#B?Y1!2P^7'5L?E -MQ3;7Y0$`4^,",*`1`#"@`P.@BN%ZH._F!0!5XR`"``IZH._F``!5XP(``!JT -M")_E_O__ZQ```.H&`%7C`@``&J0(G^7^___K"P``Z@<`5>,"```:E`B?Y?[_ -M_^L&``#J"0!5XP(``!J$")_E_O__ZP$``.I\")_E_O__Z\?Y0L0H.$)(*#A!3"@X?[__^L$`*#A0!"@X_[__^L`$*#A0`>?Y?[_ -M_^L+D(GA!9"9X?H```K$-M;E``!3X]H```K(-M;E``!3XR(```IN.M3E`@!3 -MXQ@``!K'-M;E!0!3XPT```I_.M3E``!3XQD```KT!I_E_O__ZP!0H.-_6L3E -MK0Z$XO[__^L`(*#A!`"@X040H.'^___K#@``ZG\ZU.4``%/C"P``&L`&G^7^ -M___K`3"@XW\ZQ.4&``#J?SK4Y0``4^,#```:I`:?Y?[__^L!,*#C?SK$Y<4V -MUN4``%/CK@``"HP&G^7^___K;CK4Y0(`4^,)```:QS;6Y08`4^,&```:<`:? -MY?[__^L$`*#A0!"@XZ`@H./^___K)P``ZL,$#CX#:&Y>0VAN5,!9_ES!:6Y0@E -M`./^___K*P``Z@<`4^,'```:+R@+XUX@0./@)H;EY":&Y20%G^4(%0#C_O__ -MZR$``.H``%/C&```&LPVEN6@`%/C"```FB\W"N->,$#CX#:&Y>0VAN7T!)_E -MS!:6Y0@E`./^___K$P``ZBLS"N->,$#CX#:&Y2LT"N->,$#CY#:&Y,$#C_O__ZP8``.H`,*#CX#:&Y>0VAN6H!)_EQQ;6Y0@E -M`./^___KQS;6Y04`4^,:```*H3?4Y00`4^,,```:UC;6Y0@`$^,)```**R@+ -MXUX@0./@)H;EY":&Y6@$G^4(%0#C_O__Z\(*#CX3"#XO[__^LJ``#J*`2?Y=06UN7^ -M___KU#;6Y0`PC>4$`*#A`!"@XQX@H./P,*#C_O__ZQ\``.H`!)_E_O__ZQP` -M`.K(-M;E``!3XP8```I_.M3E``!3XP,``!K@`Y_E_O__ZP$PH.-_.L3EU`.? -MY?[__^L$`*#A0!"@XP`@H./^___KL`.?Y=06UN7^___KU#;6Y0`PC>4$`*#A -M`!"@XQX@H./P,*#C_O__ZP`PH./@-H;EY#:&Y;0T`^,#4)3GY3T"XP,PU.4``%+C!0``"N`F -ME>4``%+C"```&N0FE>4``%+C!0``&M@D`>,"()3G``!2XP"0H`,!```*2@`` -MZ@&0H.,8)`'CTJ"$X3`D`>/2`(3A`*!:X`&PR^#@)`'CTF"$X?@D`>/2`(3A -M`&!6X`%PQ^#X8,WA``!3XP0`4Q,+```:`&"@XP4"`%'A`P``B@,``!H(`)WE"@!0X0```)H!8*#C["65Y08`4N$"```:X"+5 -MY0``4N,8```:`0!9XVX_A@(#<94'#P``"@(`4^,(```:H3?4Y0@`$^,%```* -M`#``XP`P0.,&((;B`C&#X%QQD^4$``#J`#``XP`P0.,5((;B`C&#X%QQD^4$ -M`*#A"!4`XP<@H.'^___K[&6%Y0$PH./@,L7E"```ZN`RU>4``%/C!0``"@0` -MH.$(%0#CY"*5Y?[__^L`,*#CX#+%Y0`0H./8-`'C`Q"$YQ@T`>/38(3A,#0! -MX_-@A.'@-`'CTV"$X?@T`>/S8(3A!`"@X0+V_^ML,)3E"``3XP4``!KH-@'C -M`S"4YP$P@^(!`%/C!@``RA@``.H$`*#AA!0`X_[__^L_``#B@@;(Y1(``.H! -M8*#C!E"@X1JMH./H=@'C!`"@X1(=AN($$('B_O__ZP9@B.`*8(;@/P``X@(` -MQN4!4(7B=5#OY@5@H.$',)3G`3"#X@,`5>'P__^Z[ST"XP,PU.<``%/C&P`` -M"@0`H.%&$*#C_O__ZP0`@.-P4._F!`"@X480H.,%(*#A_O__ZP0`H.%$$*#C -M^R`%XO[__^L$`*#A1A"@X_[__^O[(`#B!`"@X480H./^___K!`"@X400H./^ -M___K`P``Z@2@BN.@`)_E_O__Z_']_^H\T(WB\(^]Z'P8``!`-P``B",``)PC -M``"X(P``P",``-0C``#H(P``^",```@D``#(!P``)"0``$`D``!D)```A"0` -M`*`D``#$)```W"0``!PE```X)0``3"4``&@E``"`)0``E"4``*@E``#`)0`` -MZ"4```PF``!,)@``>"8``+`F``#H)@``*"<``$@G``!H)P``?"<``)@G``"X -M)P``!$`MY3,@0>(Q`%+C9$"@DR<``)HI($'B"0!2XX%`H)$C``":'R!!X@D` -M4N,D0(&2'P``FA4@0>()`%+C(D"!DAL``)H*($'B"@!2XP<``(H*$$'B@1"@ -MX58U!>-5-47CDR'#X,$?0^`J0('B$```Z@4@0>($`%+C!0``BH$0@>`/$$'B -MH1^!X,%`H.$60(3B!P``Z@$P0>(#`%/C`4"@@0$009*!$(&0H1^!D,%`H)$& -M0(22!`"@X1``O>@>_R_A^$\MZ0"PH.$0H)#EM#0#XP-@FN=7,-#E`P!3XZ8` -M`(H!@*#AJ#(#XP,PFN<``%/C`@``&A@TUN4``%/C(0``&@4@V.4B,Z#A`P!3 -MXP/QGY(?B_WR'XO1PA^)W<._F(0``ZCX@`N(0<&+B=W#OYAT``.H%(-'ETC+AYP,` -M4^,#\9^7%P``ZMA6`@#$5@(`L%8"`)Q6`@`?(`+B+7#@XX)P1^!W<._F#P`` -MZA\@`N(9<.#C@G!'X'=P[^8*``#J'R`"X@MPX.."<$?@=W#OY@4``.H?(`+B -M@G"@X1!P9^)W<._F````Z@!PH.-W,._F8R"#XG(@[^9V`%+C`%"@@P,``(J` -M`!?C9%"@`V0P@Q)S4.\6L#'6X1,`4^,;```:!D"%XG1`[^9D`%3C!%"@,610 -MH",C,$7B,#<,KGL#'6X1,`4^,1```:,0!5XR$``(HC -M,$7B)S,._F#`!3XSQ`H),8``":$D!%XG1` -M[^8#`%3C*$"@DQ1`H(,2``#J*`!5XP\``(H$0-CE0`!4XP!`H(,,``"*$P!4 -MXPD``)I`0&3B9""@XY($`N#I,@KCBSY"XY,2P^#"+Z#APT%BX'1`[^8```#J -M9$"@XUE`R^5:0,OE`##@XULPR^4*`*#A!1"@X2+__^M<`,OE^(^]Z'PVEN4! -M,(/B?#:&Y0%PH.$J,-;E``!3XP"0H`,)@*`!)```"@"0H.,)@*#A"`0`XP\0 -MH.,)4*#A!3"@X04@AN``((+@!"#2Y0``4N,!D(D2>9#O%@4@U^<_(`+B-R!" -MXH(@H.%R(._F8\""XGS`[^9V`%SC`""@@P,``(J``!+C9""@`V0@@A)R(.\6 -M`H"(X`,@A^!6/H/BT4"2X<1`H.$#08KG`5"%XG50[^8J,-;E!0!3X=___XH$ -M,-?EHS"@X6XP0^)S,._F`U"@X6,@@^)R(._F=@!2XP!`H(,#``"*@``3XV1` -MH`-D,(,2,#4,KGL#'6X1,`4^,O```*6##; -MY0``4^,%```*5S#;Y1,`4^,"``":&P!3XP)`H),```":`4"@XPLPH.$`8*#C -M!R"@X0IPH.$(H*#A!("@X=U`TN'$3P3@=%#OYB``=.,%``"Z`%!EXH50A>!U -M4._F=4"OYF,`5.,````:9%"@XP``5N-94,L%6E##Y0%@AN)V8._F`2""X@$P -M@^(&`%CAZO__B@J`H.$'H*#A!P``Z@@`H.$)$*#A_O__ZP`0H.$*`*#AKO[_ -MZUP`R^7XC[WH``!9X_B/O0CT___J\$]",@U`>,#,-3G``!3XP8```H`,*#CS"4!XP(PA.?0 -M)0'C`C"$Y\@E`>,",,3GS#4!XP,0E.70-0'C`R"4YP(` -M@.`#`(3G_O__Z\DU`>,#`,3GM#0#XP.@E.>`8)7E5S#5Y0``5N,@AY85)'>6 -M%="$F@74=)H%`P!3XQ4``)H``%CC8("5M6`PE>4(`%/A"```FH@AB.""@(C@ -M`X"(X,TL#./,+$SCDCB(X"B"H.$!@(CB'```ZH@AB.""@(C@`X"(X,TL#./, -M+$SCDCB(X"B"H.$4``#J``!7XV!PE;5@,)7E!P!3X0@``)J'(8?@@G"'X`-P -MA^#-+`SCS"Q,XY(WA^`G&Y08``.J`-MKE`0!3X]"$B@4!```*``!3X]!TB@74=(KE``!4XP``51/P -MA[T(O#4!XP,PU.<``%/C!@``"@`PH.-7+:#C`C"$Y\0E`>,",(3GO"4!XP(P -MQ.=7/:#C`Q"4YP$0@>(#$(3G7`#5Y<0U`>,#()3G`@"`X`,`A.?^___KO34! -MXP,`Q.?PA[WH'O\OX7!`+>D`4*#A`4"@X0)@H.$`(*#C`"#!Y0$@P>4$`('B -M`Q"@X08@H./^___K"@"$XLL=A>(A$('B!B"@X_[__^L0`(3BK1Z%X@00@>(& -M(*#C_O__ZP0PH.&V(?/A#R`"XK`@P^$`,-3E`2#4Y0(T@^'\,,/C`SB@X2,X -MH.%0,(/C`##$Y2,TH.$!,,3E2"N5Y0,,4N-P@+V(&`"$XBT=A>(,$('B_O__ -MZT@[E>48,(/B`#"&Y7"`O>CP02WI`&"@X0%0H.$"@*#A`W"@X1@@W>4!0*#A -M`#"@XP`PP>4!,,'E`P!2X0`PP140,*`3`3#!%3PQD.4!`%/C`@``"@0`4^,P -M```:%P``Z@`PT>4!(-'E`C2#X0$\@^-S,/_F`##!Y2,TH.$!,,'EK0Z`XO[_ -M_^L`$*#A!`"%X@8@H./^___K"@"%XLL=AN(A$('B!B"@X_[__^L0`(7B!Q"@ -MX08@H./^___K)@``Z@`PT>4!(-'E`C2#X0(\@^-S,/_F`##!Y2,TH.$!,,'E -M!`"!X@<0H.$&(*#C_O__ZZT.AN+^___K`!"@X0H`A>(&(*#C_O__ZQ``A>++ -M'8;B(1"!X@8@H./^___K#@``Z@0`@>('$*#A!B"@X_[__^L*`(7BRQV&XB$0 -M@>(&(*#C_O__ZZT.AN+^___K`!"@X1``A>(&(*#C_O__Z[8Q].$/,`/BL##$ -MX;`PU>'\,,/C2#"#X[`PQ>$8,*#C`#"(Y?"!O>CP02WI`%"@X0%`H.$"<*#A -M`#"@XP`PP>408*#C`6#!Y;`PT>'\,,/CI#"#X[`PP>%H.@#CLS"0X0,Y@^.R -M,,'AK0Z`XO[__^L`$*#A!`"$X@8@H./^___K"@"$XLL=A>(A$('B!B"@X_[_ -M_^L`8(?E\(&]Z'!`+>D"4*#A`V"@X0%`H.$!`*#A`!"@XR`@H./^___K`#"4 -MY2,S@^,"-H/C=5#_Y@4P@^$`,(3E!#"4Y1(\@^,$,(3E``!6XP$V@Q,$,(05 -M$#"4!8`P@P,0,(0%##"4!0(Q@P,,,(0%$#"4Y0$\@^,0,(3E!`"@X?[__^MP -M@+WH\$4MZ1S03>(`0*#A`6"@X0*@H.$`(`#C`"!`XPPPC>(#`)+H!`"#Y+`0 -MP^$`,*#C`##&Y0$PQN4$`(;B#!"-X@8@H./^___K"@"&XLL=A.(A$('B!B"@ -MX_[__^NM#H3B_O__ZP`0H.$0`(;B!B"@X_[__^L&,*#AMB'SX0\@`N*P(,/A -ML##6X?PPP^.`,(/C!E"@X;`RQ>`@,*#C%#"-Y2U]A.(,<(?B!P"@X?[__^L` -M$*#A!0"@X0(@H./^___K(H"&XA10G>4"4(7B%%"-Y0<`H.'^___K`!"@X0@` -MH.$"(*#C_O__ZR1PAN(44)WE`E"%XA10C>7`.93E`S`#X@,`4^,(```:2"N4 -MY0P@0N(%((+@%""-Y0<`H.&U'H3B"!"!XO[__^LR``#JW"J4Y11@C>(`8(WE -M!P"@X0`0H..N/H3B_O__ZP"`H.&S7H3B!%"%X@4`H.'^___K`'"@X0!@C>4( -M`*#A`1"@XP@`5^,'(*`Q"""@(P4PH.'^___K`&"-Y0,0H.,!(*#CL3Z$X@PP -M@^+^___K`%"@X<`YE.4#,`/B`0!3XP@``!H8,(WB`""@XQ`@(^44((WB`""- -MY080H.,"(*#C_O__ZP!0H.$(`%?C!P``FA0PC>(`,(WE!0"@X3(0H.,(($?B -MLSZ$X@PP@^+^___K%#"=Y2`@@^("#%+C`#"*E0$``)H(`)_E_O__ZQS0C>+P -MA;WHV"<``/!/+>DTT$WB`&"@X1`0C>4"D*#AM"0#XP(@D.<(((WE`("2Y=B! -MX.<``%/C##"-Y6\```H%`%GC;0``B@`PH.,L,(WE,""-XK8P8N$8((WE9#"@ -MXR`PC>5SKZ#C+""-X@$@@N(4((WE##"=Y0(P@^(<,(WE`#``XP`P0.,D,(WE -M"""=Y1JTTN5D4*#C`3"@XQ-[H.$'+8OB!""-Y08`H.$*$*#A_O__ZP<``.!P -M0._F``!8XP(```H``%3C1@``"@8``.H``%3C!```&@8`H.$$$)WE_O__ZP`` -M4.,^```*``!5XS\```H!4$7BZO__ZA0`G>4,$)WE"2"@X?[__^L+``#J&`"= -MY0P0G>4"(*#C_O__ZQ0`G>4<$)WE`B!)XO[__^LL,-WE@SS@X:,\X.$L,,WE -M+##=Y1`@G>4#,(+A+##-Y2Q`G>6``!3C!```"D00B^(&`*#A@1"@X;HBW>'^ -M___K=!"+X@8`H.$!$:#A+""=Y?[__^L``%CC$0``&@8`H.$*$*#A_O__ZU`+ -MH.$!`!#C!P``&B0`G>7^___K(#"=Y0``4^,1```*`3!#XB`PC>6Q___J!@"@ -MX0<=B^+_(*#C_O__ZP&PB^(#L`OB"""=Y1JTPN4%``#J`P!9X\+__YK&___J -M````XP``0./^___K--"-XO"/O>CP3RWI+-!-X@!`H.$!8*#AM#0#XP-PD.H./^___K!`"@ -MX54>H./^___K$""`XP0`H.%5'J#C4$`*#A -M(A0`X[\@`N+^___K)#37Y4`PP^,D-,?EM#0#XP.0E.?Z#Z#C_O__ZP"`4.(# -M```:?`*?Y7P2G^7^___K=0``Z@@`H.$`$*#C^B^@X_[__^L$`*#A*!"(XAP@ -MC>+^___K'%"=Y2!0A>)_,!7B`3"@$Z53@^!UH._F`0!:XP*@H`,2I\GEBE.@ -MX2A0A>($`*#A!1"(X!0@C>+^___K(!!%X@0`H.$!$(C@%""=Y0$PH..#_O_K -M(:#-Y110G>4@4(7B?S`5X@$PH!.E4X/@!:"*X'J0[^:)4Z#A*%"%XJV^A.(+ -M`*#A_O__ZP`PH.$`H*#C`*"-Y00`H.$%$(C@$""-XO[__^L@$$7B!`"@X0$0 -MB.`0()WE"C"@X6G^_^LBD,WE$%"=Y2!0A>)_,!7B`3"@$Z53@^`%D(G@>9#O -MYHE3H.$H4(7B"P"@X?[__^L`,*#A`*"-Y00`H.$%$(C@&""-XO[__^L@$$7B -M!`"@X0$0B.`8()WE"C"@X5'^_^L@D,WE&*"=Y4X-A.(X`(#B_O__ZP!04.(? -M```*(*"*XG\P&N(!,*`3JJ.#X`J@B>!ZH._FBJ.@X00`H.$($(7B_O__ZQ`P -MH.-7,,7E(#!*XA@PA>44,(7E;`"5Y0@0H.$*(*#A_O__ZP0`H.$%$*#AU3V@ -MXP_@H.$#\)3G!`"@X0,0H.,!(*#A(#"-XO[__^L(`*#A^A^@X_[__^L$`*#A -M51Z@X_[__^L(((#C!`"@X54>H.-R(._F_O__ZP0`H.%5'J#C_O__Z^\@`.($ -M`*#A51Z@X_[__^L,,)WE``!3XP@```HD)-?E0"""XP0`H.$B%`#C@\*```_!@``'!`+>D(T$WB`$"@X0%0H.$%8@/C -M````XP``0.,T$)_E!2"@X08PU.?^___K!%#-Y08PU.<%,,WE`1"@XP80S>4$ -M`*#A`R"@XP0PC>+^___K"-"-XG"`O>@0&0``<$`MZ1#03>(`8*#A!!"-Y0)0 -MH.$(0(WB!`"@X0`0H.,%(*#C_O__ZP0`H.$$$(WB!""@X_[__^L,4,WE!@"@ -MX080H.,%(*#C!#"@X?[__^L!`*#C$-"-XG"`O>CP02WI`$"@X0)@H.&T-`/C -M`S"0YQLTT^4!`%/C`0``&O[__^OP@;WH#P+!X_[__^L_<`#B'U`&XB``%N-` -M<(<3!`"@X1(=A>($$('B!R"@X?[__^OP@;WH$$`MZ0$PH.$%$*#C`R"@X_[_ -M_^L!`*#C$("]Z!!`+>D`,%'B!`"@`Q"`O0@`$-/E`2#3Y0(P@^+^___K``"@ -MXQ"`O>@$0"WE2$"0Y0`@D.6T-`/C`S"2YX``4>,$```:`$"4Y8`P".,`,$SC -M!$2#X0\``.J!`%'C!```&@!`E.6`,`#C`C!,XP1$@^$(``#J!P!1XP!`H(,` -M()25`B2@D0,A@I-Q$..6,D?1E0]`!)*$1X*1!`"@X1``O>@>_R_A'O\OX1[_ -M+^$00"WI`$"@X0`0H..,(*#C_O__ZP`P`.,`,$#C##"$Y0`P`.,`,$#C$#"$ -MY0`P`.,`,$#C%#"$Y0`P`.,`,$#C4#"$Y0`P`.,`,$#C8#"$Y0`P`.,`,$#C -M-#"$Y0`P`.,`,$#C.#"$Y0`P`.,`,$#C/#"$Y0`P`.,`,$#C0#"$Y0`P`.,` -M,$#C5#"$Y0`P`.,`,$#C9#"$Y0`P`.,`,$#C;#"$Y0`P`.,`,$#C<#"$Y1"` -MO>CP02WI`$"0Y9`T`>,#8)3G`2"@XU(V`^,#(,3G:7^&X@"`H.,*``#J0`"5 -MY0``4.,````*_O__ZP%`A.($4(7B"`!4X_?__QH'`%;A\(&]"(Q@AN(&4*#A -M"$"@X?'__^IP0"WI`%"0Y6@U`>,#0)7G`2"@XU$V`^,#(,7GV%"$X@)@H.$H -M8,3E$`"4Y0``4.,````*_O__ZP4`5.%P@+T(2$"$XO;__^KP1RWI`7"@X0*0 -MH.$`0)#E`U"@X12`D^5DH)3EB#4#XP,PE.<``%/C!P``&HPU`^,#,)3G``!3 -MXP,``!ID,@/C`S#4YP``4^,%```*3@V$XC@`@.(%$*#A_O__ZP!`H.-L``#J -M`&`/X8``#/$-(*#A?SW"XS\PP^,$()/E`2""X@0@@^4&`%'C`?&?ER4``.K4 -M:@(`\&H"``QK`@`H:P(`4&L"`%!K`@!$:P(`>#0!XP,@E.,#()3G`2""X@,@A.$+``#J<#0!XP,@E.$- -M(*#A?SW"XS\PP^,$()/E`2!"X@0@@^4`,)/E`@`3XP````K^___K0&"5Y1P` -MA.('$*#A*/__ZP!PH.&4-`'C`S"4YP,`$^,"```*N#'5X0``4^,#```*.#"6 -MY8`PP^,X,(;E`@``ZC@PEN6`,(/C.#"&Y6PPF.4HH(;E,'"&Y3PPAN5,D(;E -M`#``XP`P0.-P,(;E;%"&Y08`H.$@$*#C_O__ZP!04.(%```:M#0#XP-`E.?^ -M___KN`:$Y0%`H.,#``#J$`"?Y040H.'^___K`$"@XP0`H.'PA[WHB"@``/!! -M+>D`<*#A;&"0Y0A`EN5.783B.%"%XKHQUN$&`%/C`_&?EQP``.J0;`(`I&P" -M`+AL`@#,;`(`Z&P"`.AL`@#@;`(`>#0!XP,@E.,#()3G`2!"X@,@A.<&``#J<#0!XP,@E.@!(*#CC#4#XP,@A.=, -M`)_E_O__Z_"!O>BT-`/C`U"4Y_[__^N\!H7E43V$X@!@#^&```SQ'%"SY0$@ -MA>,`((/E!O`AX0$`%>/P@;T840V$XA@`@.+^___K\(&]Z*0H``#0*```\$\M -MZ2S03>(`0*#A`;"@X0*0H.$#H*#AM'7=X5B`W>4`4)#E2&"0Y8PU`^,#,)7G -M``!3XW```!ID,@/C`S#5YP``4^-L```:_@!7XP0``)JT`9_EM!&?Y?[__^L` -M8.#C9@``ZD`PD.4``%/C!```&IP!G^64$9_E_O__ZP!@X.->``#J,`"`XAP` -MC>7^___K0#"4Y1@PC>4#`*#A`!"@X_X@H./^___K`0!8XP<``!H`();E@#`` -MXP`P2.,"-(/A)#"-Y<``H.,@`(WE"0``Z@`PEN4#-*#A`C&#XR0PC>48`)WE -M4!"=Y0<@H.'^___K0#"@XR`PC>4`!HWH&`"=Y0@`C>4,<(WEB#,!XQ`PC>4& -M`*#A)!"=Y0L@H.$@,)WE_O__ZP!@4.(H``"J;`!VXQ,`=A,2```:"1"@X0$` -M6.,`(``3`"!`$P`@``,`($`#4`"=Y0`PD.4`,(WE````XP``0.,&,*#A_O__ -MZP$PH..()0/C`C"%YXPE`^,",(7G&@``Z@D0H.$!`%CC`"``$P`@0!,`(``# -M`"!``U``G>4`,)#E`#"-Y0```.,``$#C!C"@X?[__^L`()3EM#0#XP,PDN4&(*#A_O__ZQP` -MG>7^___K````Z@!@H.,&`*#A+-"-XO"/O>CH*```+!D``!@I```00"WI&-!- -MX@1`D.48,(WB!"`CY7$@_^8`,(WE!#"@XP0PC>4`,*#C"#"-Y00`H.$%$*#C -M:___ZQC0C>(0@+WH$$`MZ1C03>($0)#E&#"-X@0@(^5Q(/_F`#"-Y0(PH.,$ -M,(WE`#"@XP@PC>4$`*#A!1"@XUO__^L8T(WB$("]Z!!`+>D8T$WB!$"0Y1@P -MC>($("/E<2#_Y@`PC>4!,*#C!#"-Y0`PH.,(,(WE!`"@X040H.-+___K&-"- -MXA"`O>@$X"WE'-!-X@`PH.,8P(WB!#`LY00`D.5Q(/_F`,"-Y000H.,$$(WE -M`1"@XP@0C>4%$*#C.___ZQ0`G>44($ -M,"SE!`"0Y7$@_^8`P(WE`A"@XP00C>4!$*#C"!"-Y040H.,J___KM`'=X1S0 -MC>(`@+WH!.`MY1S03>(`,*#C&,"-X@0P+.4$`)#E<2#_Y@#`C>4!$*#C!!"- -MY0@0C>4%$*#C&O__ZQ0`W>4D1WDWB`%"@X0&`H.$"8*#A -M`W"@X1!`C>($`*#A`!"@X_X@H./^___K!%"5Y79@_^8$`*#A!Q"@X08@H.'^ -M___K4`"-Z``PH.,(,(WE!0"@X040H.-X(/_F__[_ZQ'>C>+P@;WH\$$MZ0%P -MH.$$8)#E`$"6Y4B`EN6()0/C`B"4YP``4N-J```:C"4#XP(@E.<``%+C9@`` -M&F0B`^,"(-3G``!2XV(``!H#4*#A*##3Y0``4^,"```*)#"5Y0``4^,&```: -M50V$X@P`@.+^___K)`"%Y0``4.,!,*`3*##%%0``5>-2```*!`"@X040H.'^ -M___K*##5Y0``4^,"```*)#"5Y0``4^,<```:USV@XP,`E.>@$0'C(""@X_[_ -M_^LD`(7E``!0XT$```J@()#E@CN@X:,[H.$"/&/B`R""X*`@@.64()#E`S"" -MX)0P@.4D,)7EG""3Y3`@A>6@()/E-""%Y90@D^4X((7EF""3Y3P@A>6@,)/E -M0#"%Y0P``.J<,)/E,#"%Y20PE>6@()/E-""%Y90@D^4X((7EF""3Y3P@A>6@ -M,)/E0#"%Y0`PH.,H,,7E(#4!XP,@U.4&`*#A!Q"@X3O] -M_^M`,)7E*("$Y3``A.4\,(3E^CZ@XTPPA.4`,`#C`#!`XW`PA.5L4(3E!`"@ -MX2`0H./^___K`%"@X0$P@.(!`%/C`4"@DP8``)H<`)_E!1"@X30@E.7^___K -M`$"@XP```.H`0*#C!`"@X?"!O>A\*0``\$$MZ0!@H.%L4)#E#$"5Y2`U`>,# -M(-3G`2!"X@,@Q.>,-0/C`S"4YP``4^,'```:B#4#XP,PE.<``%/C`P``&E$V -M`^,#,-3G``!3XP(```H!,*#C*##%Y?"!O>@T$)#E``!1XS(``!I0()#E&"!" -MXH@_`.,#`%+A"```F@$PH.,H,,7E!`"@X1PU`>,#$)3G`""@XP4PH.'^___K -M\(&]Z&@`A.(`$*#C_O__ZU`PEN4@,(7E)`"5Y5`0EN7^___K50V$XA@`@.(D -M$)7E_O__ZV`U`>,#,)3G`0!3XPL``(H5/(3B`'`/X8``#/$\8+/E`2"&XP`@ -M@^4'\"'A`0`6XP(``!H5#(3B.`"`XO[__^L`(*#C)""%Y2@@Q>4$`*#A'#4! -MXP,0E.<%,*#A_O__Z_"!O>BT`)_E_O__ZS0PEN4@`'/C#0``"@8``,IL`'/C -M"@``"D<`<^,,```*``#J$P!SXP,```H"`'/C`0``"A8`<^/P -M@;T8`2"@XX@U`^,#((3G\(&]Z+0T`^,#,)3G`B"@X[4FP^5H`(3B_O__ZP0` -M4.,#``#:/`"?Y000H./^___K\(&]Z`$PH.,H,,7E!`"@X1PU`>,#$)3G`""@ -MXP4PH.'^___K\(&]Z`P`G^7^___K\(&]Z+@I``#H*0``!"H``/!'+>D`0*#A -M3GV`XCAPA^)L,)#E`@L3X_"'O1B(50/CC&4#XU*&`^,`H*#C!3"4YP$`4^,% -M```*!C"4YP$`4^,"```*"##4YP$`4^,#```:````XP``0./^___K\(>]Z`0` -MH.$'$*#A"B"@X?[__^L``%#C[/__&O"'O>CP3RWI+-!-X@P`C>55/8#B&!"# -MXAP0C>52+8#B."""XA@@C>4,,(/B(#"-Y0`P`.,`,$#C)#"-Y90``.H,()WE -MB!4#XP$PDN7^ -M___KBP``ZA0PG>544)/EH'"3Y0J@U^4(<(WE`("7Y0AIH.$F::#A!!"7Y1`0 -MC>4(()?E`""-Y5A(X^>$0:#A!$"-Y1B0AN($D(G@!;"@X04`6>$`,*"3`3"@ -M@P``5N,!,(,#``!3XV4``!H"A1CB!H"@$Q@`G>7^___K`$!0XE\```H$`*#A -M_O__ZP`PH.-\,(3E:#"$Y0`0G>4/"A'C`#"@$P$PH`,0()WEHBT3X`XPA@(` -M,(T%!0``"G(V`.,#`%;A&AV@DP`0C94.((:"`""-A0P@G>77':#C`0"2YP`0 -MG>4@(*#C_O__ZP!04.(B```*#""=Y=<=H.,!,)+G&#"%Y0A0A.6@`)7E!S`` -MX@@P8^(#`(#@E""5Y0,P@N`(`(#@H`"%Y0@P@^"4,(7E!#"=Y1@0@^(!$(?@ -M!B"@X?[__^N@,)7E=#"$Y7`PA.5L,(3EH""5Y0`0G>4!((+@>""$Y08P@^!T -M,(3E`@!3X0,P9H!T,(2%"@``B@8``.H4`)WE(!"@X_[__^L(`(3E)`"=Y?[_ -M_^L9``#J:#"4Y09@@^!H8(3E!`"@X0@0G>7^___K!`"@X?[__^L!H$KB>J#_ -MY@M0:>```%7C`#"@TP$PH,,``%KC`""@$P$@`P(``%+C"""=%0J@TA4``%KC -M`#"@`P$P`Q(``%/C"7"'$(3__QH4$)WEH#"1Y90P@>4`(*#C5""!Y2``G>44 -M$)WE_O__ZQP`G>7^___K``!0XQ0`C>5E__\:+-"-XO"/O>AL*@``'O\OX?A/ -M+>D`0*#A$WR`XB1PA^*,,P'C`X"0YX`@H.,<-0'C`R"`YV@U`>,#4)#GV+"% -MXARE`>,`D*#C=&4!XP<`H.$*$)3G"2"@X04PH.$X_R_A``!0XP<```H&,)3G -M`3!#X@8PA.<+`%7A`4"@`P(```I(4(7B\/__Z@!`H.,$`*#A^(^]Z`1`+>6T -M-`/C`T"0YP<`4>,!\9^7!P``ZKAY`@#(>0(`]'D"``1Z`@`4>@(`)'H"`#1Z -M`@!$>@(``$"@XR4``.K0-)3E`#""Y0%`H.,A``#J`#"4Y76T-`/C`T"0Y\`VU.4``%/C!0``"L(VU.4#`%/C44$``P!`0`,$0`$`!P`` -M"@`PE.4``%/C7T$`$P!`0!,$0`$064$``P!`0`,$0`$``0"$XQ``O>@>_R_A -M,``MZ;0T`^,#4)#G`#"@XQLTQ>4Z,,7ELS(#XP,PT.<``%/C&C3%!0!`H.,Z -M0,7EYD3%Y2Q$Q>4#,*#C[#6%Y?!%Q>761<7E!#"@X4!0(3B=$#OY@%0 -MA>((`%3C^?__&C``O>@>_R_A`0"@XQ[_+^%P0"WI`$"@X=)=@.(X4(7B'0V@ -MX_[__^NT-`/C`P"$YP``4.,!```:;`&?Y?[__^L`(`#CN#0#XP`@0.,#((3G -M`"``X[PT`^,`($#C`R"$YP`@`./$-`/C`"!`XP,@A.<`(`#CR#0#XP`@0.,# -M((3G`"``X\PT`^,`($#C`R"$YP`@`./0-`/C`"!`XP,@A.<`(`#CU#0#XP`@ -M0.,#((3G`"``X]@T`^,`($#C`R"$YP`@`./<-`/C`"!`XP,@A.<`(`#CX#0# -MXP`@0.,#((3G`"``X_`T`^,`($#C`R"$YP`@`./T-`/C`"!`XP,@A.<`(`#C -M^#0#XP`@0.,#((3G`"``XQ0U`^,`($#C`R"$YP`@`.,8-0/C`"!`XP,@A.<` -M(`#C'#4#XP`@0.,#((3G`"``XR`U`^,`($#C`R"$YP`@`.,D-0/C`"!`XP,@ -MA.<`(`#C*#4#XP`@0.,#((3G`"``XSPU`^,`($#C`R"$YP`@`./5/:#C`"!` -MXP,@A.<`(`#C.#4#XP`@0.,#((3G!0"@X?[__^MP@+WHR"H``'!`+>FT-`/C -M`U"0YP8`4>,#```*!P!1XP!`H!-"```:`P``Z@`PTN41-\7E`4"@XST``.H` -M0-+E``!4XP4``!H`,*#C*33%Y>0`G^7^___K`4"$XC0``.H!`%3C!0``&BDT -MU>4!,,/C*33%Y<0`G^7^___K+```Z@(`5.,$```:*335Y0(PP^,I-,7E`4"@ -MXR4``.H#`%3C!@``&BDTU>4$,,/C*33%Y8P`G^7^___K`4"@XQP``.H$`%3C -M!```&BDTU>4(,,/C*33%Y0%`H.,5``#J!0!4XP0``!HI--7E$###XRDTQ>4! -M0*#C#@``Z@8`5.,!0*`3"P``&BDTU>4!`!/C`@``&L4>H./^___K1P3%Y2DT -MU>4?,(/C*33%Y1@`G^7^___K`4"@XP0`H.%P@+WH\"H``!@K```L*P``4"L` -M`!!`+>FT-`/C`T"0YP`PH.,[-\3EM#'0X0(`4^,0@+T8*S#4Y00`4^,0@+T8 -M`#"4Y9@`4^,9```*"@``BA@`4^,6```*`@``B@@`4^,0@+T8$@``ZB@`4^,0 -M```*B`!3XQ"`O1@-``#JB"`!XP(`4^$1```*`@``BJ@`4^,0@+T8!@``ZI`@ -M`>,"`%/A"@``"J@@`>,"`%/A$("]&`8``.KS$*#C_O__Z_```.(@`%#C`3"@ -M`SLWQ`40@+WH\Q"@X_[__^OP``#B(`!0XP$PH`,[-\0%$("]Z/!'+>D`0*#A -MM#0#XP-0D.%Y2@PD.4D -M-X7E+#"0Y1@WA>4P,)#E'#>%Y30PD.4H-X7E.#"0Y2`WA>4DH-#E)7#0Y;0T -M`^,#4)#G`&"5Y=9AX.<``%;C(@``"@`PH.,P-\7E,3?%Y68>#^/^___K`("@ -MX0\`$.,%```*,#?5Y0$P@^,P-\7E,3?5Y0$P@^(Q-\7E6(+GYP``6.,%```* -M,#?5Y00P@^,P-\7E,3?5Y0$P@^(Q-\7E!`"@X6<>#^/^___K#P`0XX$```HP -M-]7E`C"#XS`WQ>4Q-]7E`3"#XC$WQ>5Z``#J`#"@XS`WQ>4Q-\7E9!X/X_[_ -M_^M0`N'G`P!0XP#QGY<7``#J((`"`#2``@`T@`(`((`"``,PH.,P-\7E`C"@ -MXS$WQ>4.``#J!`"@X4@>#^/^___K#P`0XP$PH!,P-\45`@``&O``$.,",*`3 -M,#?%%0$PH.,Q-\7E`0``Z@$`6N/PA[T8`6`FXK0T`^,#4)3GY3T"XP-`U.<` -M0%3B`4"@$P(`5^,$```*`P!7XR@```H!`%?C\(>]&$$``.H&`!3A"@``"A@W -ME>4R-\7E'">5Y3,GQ>4T-\7E-2?%Y38WQ>4W-\7E.#?%Y3DWQ>7PA[WH`6`F -MX@8`%.$*```*'">5Y3(GQ>48-Y7E,S?%Y30GQ>4U-\7E-C?%Y34X-\7E -M.3?%Y?"'O>@8-Y7E,C?%Y3,WQ>4<)Y7E-"?%Y34GQ>4V-\7E-S?%Y3@WQ>4Y -M-\7E\(>]Z```5N/PA[T8``!4XPL```H8-Y7E,C?%Y1PGE>4S)\7E(!>5Y307 -MQ>4U)\7E-C?%Y34X-\7E.3?%Y?"'O>@8-Y7E,C?%Y1PGE>4S)\7E(">5 -MY30GQ>4U)\7E-C?%Y34X-\7E.3?%Y?"'O>@8-Y7E,C?%Y3,WQ>4T-\7E -M-3?%Y38WQ>4W-\7E.#?%Y3DWQ>7PA[WH,3?5Y0$`4^.B__\:G___ZO!/+>G$ -MT$WB`'"@X4``C>(`$*#C@""@X_[__^O@,@/C`S#7YP``4^,-```:ZC(#XP,P -MU^*`(*#C_O__ -MZPH``.H!(*#CX#(#XP,@Q^?J,@/C`S#7YP``4^,#```:!P"@X0`0H.,!(*#A -M_O__ZP<`H.%`$(WB_O__Z[0T`^,#4)?GX#(#XP,PU^<``%/C`#"@$S8PQ16^ -M0-T%-D#%!;0T`^,#4)?GX#(#XP,PU^<``%/C"0``&D`PC>*Z(-/AO"+%X;PP -MT^&^,L7AOT#=Y31`Q>690-WE-4#%Y0<``.IX-@7CO#+%X30R`>.^,L7A5##@ -MXS0PQ>4R,.#C-3#%Y30PU>4``%/C`P``"OX`4^,`(*`3L"'%$1$``.HL()7E -M`3`"XP@S0^,#`%+A##"@`[`QQ0$*```*`3`"XPDS0^,#`%+A#""@`[`AQ0$$ -M```*`3`"XPHS0^,#`%+A##"@`[`QQ0'@,@/C`S#7YP``4^,%```:RPV'XB$` -M@.)6$(WB!B"@X_[__^L*``#J`"``XP`@0.,4,(WB`P"2Z`0`@^2P$,/ARPV' -MXB$`@.(4$(WB!B"@X_[__^O@,@/C`S#7YP@PC>6T-`/C`S"7YP0PC>44`(WB -M`!"@XRP@H./^___K"#"=Y0``4^,%```:0!"-X@'`H.$`4*#C%."-X@5@H.$M -M``#J%."-X@PPCN(/X([B(A"@XP`@H.,"P*#C`P"@XPP00^4&$$/E`"##Y0;` -MP^4,`,/E$B##Y1@@P^4)$$/E`Q!#Y0,@P^4)P,/E#P##Y14@P^4;(,/E`3"# -MX@X`4^'N__\:`#"@XSXPS>4_,,WE00``ZEH`T^4``,+E8`#3Y08`PN4!0(3B -M`3"#X@$@@N(#`%3C]O__&@%0A>(#P(SB`@!5XP0``!H`0*#C%("-X@1@H.$/ -M4.#C)```ZH4@A>`"(([@##"@X09`H.'H___J9L#1Y5S"H.$/P`SB`,##Y6G` -MT>556W -M0-WE/T#-Y0$PH.,$()WE.##"Y0!`H.,$@*#AJZ#@XYO@X..3P.#CBP#@XPQP -MC>4$<*#A)0``Z@(`5>,(0*"1`@``F@@`5>,!0*"3`D"@@P$P@^($0('@"F"$ -MX`"0UN4`D,/E!I#6Y1R0P^4.D(3@`I#9Y520P^4,D(3@`+#9Y7"PP^4`L(3@ -M!+#;Y8RPP^4&D-GEJ)##Y09@UN4"0(3@!$#4Y00`5N$(0*"1!D!D@'1`[X8X -M0,/E`5"%X@X`5>/<__\:`7"'X@(`5^,+```*!S*@X84``%/CN4#= -M!0=`!`($()T%-T#"!0`PH!,$()T5-S#"%;0T`^,#4)?G`""5Y>`R`^,#,-?G -M``!3XPD```H'(`+B`0!2XP,PH`,I,,4%`C"@$RDPQ14`,*#CW#+%Y2LPQ>4( -M``#J"``2X[E`W16D0J`1O$#=!0]`!`(K0,7E`0!4XP$PH`/=,L4%X$(#XP<` -MH.%`$(WB!"#7Y_[__^NT-`/C`R"7YP0PU^<``%/C`$"@$P,``!H`,)+E"``3 -MX[5`W16]0-T%YCT"XP,PU^<2`%/C`""@DP$@H(.D(Y+A237'!0,```H'`*#A -M?Q`$XO[__^M)!4?`%3C`0``&@$PH.,!-<7E.3#5Y>6T-`/C`T"7YP$@ -MH..H-`/C`R#'Y[`QU.$``%/C`2"@`Z0T`P,#((<'!@``"AP`4^,!(*`3I#0# -M$P,@AQ<&(*`#I#0#`P,@AP,L3E -MX#(#XP,PU^<``%/C!0``"@`PH..Q(@/C`C#'YV+PC[WH<$`MZ0!`H.'^___KG#4#XP,`Q.?^___KM%0#XP4PE.<$ -M(*#C*"##Y00`H.$*$*#C_O__ZU`BX.?J,@/C`R#$YR``(.+0`N#GX#(#XP,` -MQ.<$`*#A+O[_ZP0`H.'^___K!4"4YRDPU.4#`%/C`3"@`PPTQ`4!,*`3#33$ -M%0PTQ!5P@+WH<$`MZ0!`H.&T-`/C`U"0YU4>H.,0(`'C_O__ZP0`H.$5':#C -M!"0&X_[__^L$`*#A6!4`XP4@H./^___K!`"@X5D5`.,"(*#C_O__ZP`PE>4( -M`!/C!```"@0`H.%1'J#C#R8&X_[__^MP@+WH!`"@X5$>H./_)@;C_O__ZW"` -MO>AP0"WI`%"@X;0T`^,#0)#G`#"4Y0@`$^,3```*)"34Y4`@@N,B%`#C@B%0#C_O__ZP`@H.$AP0"WI`&"@X0%`H.$1':#C="#OYO[__^L&`*#A010`XU0D -MY^?^___K`0!4XP!0H),%``":`%"@XZ1`H.$!4(7B=5#OY@$`5./Z__^*!@"@ -MX1(=H.,%(*#A_O__ZW"`O>AP0"WI`%"@X;0T`^,#0)#G`#"4Y0@`$^,1```* -M)"34Y2(4`.._(`+B_O__ZR0TU.5`,,/C)#3$Y04`H.%!%0#C9""@X_[__^LE -M)-3E_B`"XB4DQ.4%`*#A0A4`X_[__^MP@+WH(A4`X_[__^L`(*#A'`3$Y04` -MH.$B%0#C0"""X_[__^MP@+WH<$`MZ0!`H.&T-`/C`U"0YP``4>,)```*(!"@ -MXP0@H./^___K!`"@X2$0H./^___K_B``X@0`H.$A$*#C_O__ZP`PE>6`(`_C -M`"!`XP(@`^`$`*#A$1"@XT(-4N,C(*`3*R"@`_[__^L$`*#A!!"@XP(H!./^ -M___K!`"@X1P0H.,.(*#C_O__ZW"`O>@00"WI`$"@X1P0H.,`(*#C_O__ZP0` -MH.$$$*#C$B@(X_[__^L0@+WH$$`MZ0!`H.&Q,@/C`S#0YP``4^,)```*7!"@ -MX_[__^L`0*#A````XP``0.,$$*#A_O__ZX``%.,0```*$0``ZD,0H./^___K -M]R``X@0`H.%#$*#C_O__ZP0`H.%"$*#C_O__ZP!`H.$```#C``!`XP00H.'^ -M___K"``4XP$```H`0*#C````Z@)`H.,$`*#A$("]Z'!`+>D`0*#A5!4`XVHZ -M`..S()#A_O__ZP0`H.%:%0#C`B"@X_[__^L$`*#A(___ZP0`H.$;%0#C"2"@ -MX_[__^L$`*#A!!8`X_[__^L!4,#C!`"@X006`.,%(*#A_O__ZP0`H.$$%@#C -M`2"%X_[__^L$`*#A7A4`XU`@H./^___K!`"@X5\5`.-0(*#C_O__ZP0`H.%5 -M'J#C&B"@X_[__^L$`*#A)14`XV\@H./^___K!`"@X2'__^L$`*#A51Z@X_[_ -M_^L"((#C!`"@X54>H.-R(._F_O__ZW"`O>AP0"WI`$"@X0)@H.&T-`/C`U"0 -MYP400>(J`%'C`?&?EU<``.I$C@(`3(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(` -M^(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(`8(X"`)R.`@"0C@(`^(X"`/B.`@#X -MC@(`^(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(`^(X"`/B.`@#XC@(`^(X"`/B. -M`@#XC@(`^(X"`*B.`@#XC@(`^(X"`/B.`@#XC@(`^(X"`.".`@#XC@(`^(X" -M`/B.`@#LC@(`ME+5X;!0PN$$`*#A(A4`X_[__^L``,;E<("]Z((?H./^___K -M`%"@X0$($.-P@+T(!`"@X8(?H.,!*(7C_O__ZP$PH.,`,,;E<("]Z"DTU>4` -M,,+E<("]Z"DPU>4`,,+E<("]Z*@R`^,#,)#G`@!3XP$PH`,`,,(%<("]"`@6 -M`./^___K!P@0XP`PH!,`,,85`3"@`P`PQ@5P@+WH_#;5Y0`PPN5P@+WH/#<` -MX[,PE>&P,,+A<("]Z!!`+>D`0*#A`1R@X7(@[^8A*(+A'AZ@XP$A@N/^___K -M!`"@X1X>H./^___K`0"@XQ"`O>CP3RWI#-!-X@!`H.$!8*#AM#0#XP-PD.,S```:(```ZK-> -M@.($4(7B!0"@X?[__^L`@*#A!`"@X040H.$((*#A_O__ZP\``.+^___K`)"@ -MX04`H.$($*#A_O__ZP!0H.%T.M3E``!3XP``H`,"```*J0Z$X@H`@.+^___K -M"5Z%X0"PA>$$`*#AJ1Z$X@H0@>+^___K``!0X@$`H!,$`(WE)0``ZN<.@.(, -M`(#B_O__ZP!0H.&A-]3E`0`3XP$`H!,"`*`#_O__ZP"0H.&S#H3B!`"`X@40 -MH.'^___K";Z`X0`PH.,$,(WE$P``ZH%2@.#E7H7B#%"%X@4`H.'^___K`("@ -MX00`H.$%$*#A"""@X?[__^L/``#B_O__ZP"0H.&S#H3B!`"`X@@0H.'^___K -M";Z`X0`PH.,$,(WEP#;7Y0``4^,-```*PC;7Y0,`4^,*```:Q#;7Y0``4^,' -M```*Q3;7Y0``4^,$```*QS;7Y0<`4^,``%,3`[K+`S^PRP,+`*#A_O__ZS^` -M`.(;--?E`0!3XPD``!H?4`;B@%"%XP0PG>4!`%/C(%"%`P0`H.$+$*#A!2"@ -MX?[__^L'``#J!#"=Y0$`4^-`@(@#!`"@X1(=AN($$('B"""@X?[__^M.DAP0"WI`$"@X480H.,`(*#C_O__ZP0`H.%$ -M$*#C_O__Z_]$>+87C!`"@ -MX4(0H.-R(/_F_O__ZP0`H.%,$*#C@"`(X_[__^MP@+WH\$%#'Z#C_O__ZP-0!>(#0`3B!$2@X09CH.$% -M583AP&`&X@-P!^(&4(7A`X`(X@=RA>$(AH?A"J>(X0<``.(`H(KA"0"@X4,? -MH./W+P_C`"!`XP(@"N#^___K\(>]Z/!/+>D,!\9^7B`,`ZD23`@!HDP(`D),"``25`@"DH`(`+)4"`,B5`@#8E0(` -M$)8"`.B6`@!HEP(`V)<"`-R9`@``FP(`$)L"`(B;`@#HFP(`!)P"`*2@`@"D -MH`(`%)P"`""<`@`\G`(`4)P"`&2<`@`4G0(`))T"`$R=`@!`@"\G@(`S)X"``"?`@"DH`(`I*`"``R?`@`TGP(`F)\" -M`*2?`@"DH`(`L)\"`+B?`@"DH`(`X)\"`/"?`@`"$0#C_O__ZPQ@`.(`(-7E -M!`"@X0(1`.,"((;A_O__ZTX#`.H"$0#C_O__ZP`PU>4#(`#B`R&"X00`H.$" -M$0#CH.,2(*#C_O__ZP0`H.$(%@#CCB("XP`@1^/^___K -M!`"@X:06`./_+P_C_O__ZP0`H.&B%@#C`2N@X_[__^L$`*#A614`XP(@H./^ -M___K!`"@X5@5`.,%(*#C_O__ZP0`H.%:%0#C"B"@X_[__^L$`*#A41Z@XP`@ -MH./^___K!`"@X14=H.,$)`;C_O__ZP0`H.%3%0#C`2"@X_[__^L$`*#A51Z@ -MXPP@H./^___K`#"6Y0@`$^,'```*!`"@X54>H./^___K[R``X@0`H.%5'J#C -M_O__ZP8``.H$`*#A51Z@X_[__^O/(`#B!`"@X54>H./^___K!`"@X0(1`./^ -M___K#%``X@0`H.$"$0#C!R"%X?[__^OG`@#J`&"@XP0`H.%A'H;B"!"!X@8@ -MU>?^___K`6"&X@8`5N/W__\:W0(`ZA@@C>(`,*#CLC!BX040H.'^___KME'= -MX15>!>(-4(7CME'-X;92QN&V4=WA`2"%XW(@_^:V($$`*#A010`XR4DH.'^___KMC'=X0$`4^,`4*"3!@``F@!0H..C -M,*#A`5"%XG50[^8!`%/C^O__BK8QS>$$`*#A$AV@XP4@H.'^___KM@(`ZB(5 -M`.,`(-+E_O__Z[("`.H`,-+E``!3XP,```I5'J#C#""@X_[__^NK`@#J51Z@ -MX_[__^OS(`#B!`"@X54>H./^___KI`(`ZK@R`>/38(#A:CH`X[,@D.$"):#A -M!@"@X0<0H.'"/Z#A_O__ZP`L#^/_+T_C`##@XP)@EN`#<*?@`&!6X`%PQ^#` -M.93E`S`#X@,`4^,!`%,3`0``&@0`H.$6_?_K!`"@X54>H./^___K]R``X@0` -MH.%5'J#C_O__ZP0`H.%6'J#C!B"@X?[__^L$`*#A9!4`XP<@H.'^___K!`"@ -MX54>H./^___K"""`XP0`H.%5'J#CH.-R(._F_O__ZQD"`.H(%@#C -M_O__ZR$MP.,$`*#A"!8`X_[__^L$`*#A51Z@X_[__^LP((#C!`"@X54>H.-R -M(._F_O__ZPH"`.K^___K`0!0XP,```K`.93E`S`#X@$`4^,6```:!`"@X:06 -M`./_+P_C_O__ZP`PEN4(`!/C!P``"@0`H.%5'J#C_O__Z^\@`.($`*#A51Z@ -MX_[__^LC``#J!`"@X54>H./^___KSR``X@0`H.%5'J#C_O__ZQL``.H#`%/C -M&0``&@A6`.,$`*#A!1"@X?[__^L"*X#C!`"@X040H.'^___K`#"6Y0@`$^,' -M```*!`"@X54>H./^___K[R``X@0`H.%5'J#C_O__ZP8``.H$`*#A51Z@X_[_ -M_^O/(`#B!`"@X54>H./^___K`#"6Y0@`$^,3```*P#F4Y0,P`^(#`%/C!P`` -M&@0`H.$(%@#C_O__ZX`@@.,$`*#A"!8`X_[__^O!`0#J!`"@X0@6`./^___K -MP""`XP0`H.$(%@#C_O__Z[D!`.H$`*#A"!8`X_[__^M`((#C!`"@X0@6`./^ -M___KL0$`Z@!0TN4``%7C&P``&J06`./_+P_C_O__ZP`PEN4(`!/C!P``"@0` -MH.$(%@#C_O__Z\`@@.,$`*#A"!8`X_[__^L&``#J!`"@X0@6`./^___K0""` -MXP0`H.$(%@#C_O__ZVPPE.4(`!/C)0``"K`QUN$2`%/C)```&B$``.H!`%7C -M!```&J06`.,`(*#C_O__ZS!0H.,=``#J`@!5XQH``!H`,);E"``3XP8```I5 -M'J#C_O__Z^\@`.($`*#A51Z@X_[__^L%``#J51Z@X_[__^O/(`#B!`"@X54> -MH./^___K;#"4Y6``$^,'```*!`"@X4(5`.,"(*#C_O__ZP=0H.,"``#J!U"@ -MXP```.HP4*#C!`"@X2H4`.,%)(7A_O__ZV@!`.I4%0#CL"#2X?[__^MD`0#J -M&Q4`XP`@TN7^___K<3K4Y0``4^->`0`:H5?4Y0$`5>,*4*`#$%"@$V\ZU.6# -M4(7@=5#OY@0`H.$%'*#C!2"@X?[__^L$`*#A!!4`XP4@H.'^___K!`"@X0@5 -M`.,%(*#A_O__ZP0`H.$,%0#C!2"@X?[__^M&`0#J%14`XP`@TN7^___K!`"@ -MX1<5`.,!(-7E_O__ZP0`H.$I%`#C`"#5Y?[__^L$`*#A.Q8`XP`@U>7^___K -M!`"@X3T6`.,`(-7E_O__ZP0`H.$_%@#C`"#5Y?[__^LN`0#J`"#2Y4(4`.,` -M`%+C@""@$P`@H`/^___K)P$`ZAH=H.,`(-+E_O__ZR,!`.H`,-+E*33&Y2`! -M`.H`,-+E``!3XRDTUA4J-,85*C36!2DTQ@49`0#J`"#2Y2DTUN4#,(+A*33& -MY10!`.H`(-+E*336Y0,P`N`I-,;E#P$`Z@`PTN6#D:#A`7"@XP!@H.,&@*#A -M=+8`XP"@`.,!H$CC`S`#XA`P@^,$,(WE`%"@X0,``.H`@*#C`6"&X@%PA^)W -M<._F=D#OY@``5.,+```:!#"=Y0.`B.$)0(3@!0"@X0L0H.$((*#A_O__ZP4` -MH.%G'J#C"B"$X?[__^OM___J"4"$X`4`H.$+$*#A`""@X_[__^L%`*#A9QZ@ -MXPH@A.'^___K!P!7X^'__YKC``#J9QZ@XP,AH./^___KWP``ZG06`.,`()+E -M_O__ZP0@E>4$`*#A9QZ@XP(A@N,!*(+C_O__Z]4``.H%'*#C`""2Y?[__^O1 -M``#J!!4`XP`@DN7^___KS0``Z@`PDN7D,H;E"!4`XP`@DN7^___KQP``Z@P5 -M`.,`()+E_O__Z\,``.H`4-+E!P!5X\```(JL-P'C`S"0YP4`4^,'8*"#`"`` -MDP`@0),#,(*0"E5P4`./^___K^"``X@0`H.%<%`#C!0!6X08@@B$%(((Q -M_O__ZZX``.H`,`#C`#!`XQ`@D^40((WE%#"3Y0PPC>7`-M;E``!3XP,```K" -M-M;E`P!3XPQ@C0(````*$&"-X@!0U>4#`%7CG0``B@)0A>(!,*#C$U6@X750 -M[^8/`%7C!:"@,0^@H",*@*#A"G*@X0!0H.,'D*#A!3#6Y_`@`^('`%+A#S`# -MP@,PB<$%,,;'!3#6YP\@`^("`%CA\#`#L@,PBK$%,,:W!`"@X44>A>(($('B -M!2#6Y_[__^L!4(7B!`!5X^O__QI]``#J"AV@XP`@TN7^___K>0``ZE@>#^,` -M(-+E_O__ZW4``.H`4-+E``!5XP4```H`,);E=S`#XB``4^,!```*`1"@X_[_ -M_^L$`*#A!1"@X?[__^MH``#J`!#2Y?[__^ME``#JQ1Z@XW\@H.,`,)7E_O__ -MZP0`H.%8'`#C?R"@XP`PE>7^___K6P``Z@```.,``$#C_O__ZP0`H.%$$*#C -M`""@X_[__^L$`*#A1A"@X_\@H./^___K!`"@X400H.,`(`#C`2%`X_[__^L$ -M`*#A1!"@XP`A`.,!(4#C_O__ZP```.,``$#C_O__ZT(``.H`$-+E_O__ZS\` -M`.H`$-+E_O__ZSP``.K^___K.@``Z@!0TN7\-M;E!0!3X38```J&'J#C`RR@ -MXP4PH.'^___K_%;&Y3```.H\-P#CL%#2X;-0AN$L``#J(A4`X_\@H./^___K -M!`"@X=P4`./^___KK#0!X[,`A.&S,@/C`S#4YP$`4^,@```*!`"@X:$?H./^ -M___K`2>`XP0`H.&A'Z#C_O__ZV10H..A;Z#C!`"@X080H.'^___K`@@0XP0` -M``H!4$7B=5#OYO\`5>/V__\:`P``Z@``5>,!```:,`"?Y?[__^L$`*#AA1^@ -MXP`@H./^___K!`"@X0(C4*P`` -M$$`MZ?[__^L!`*#C$("]Z!!`+>D(T$WB`$"@X2(5`./_(*#C_O__ZP`@H.,` -M((WE!`"@X0(0H.'_,*#C_O__ZP0`H.$&'*#C0""@X_[__^L$`*#A`A"@XQ8@ -MH./^___K!`"@X0(0H.,4(*#C_O__ZPC0C>(0@+WH,$`MZ0S03>(`0*#AM#0# -MXP-0D.<```#C``!`X_`0G^7^___K!`"@X1$0H./^___K"2"`XP0`H.$1$*#C -M!@`XS@@`.,X($#C`3"@X_[__^L$ -M``#J!`"@X7@8`.,X(*#C`3"@X_[__^L$`*#A!!P`X_`@H.,!,*#C_O__ZP0` -MH.$"&Z#C`B"@XP`PH./^___K!`"@X><>H.,`(.#CH#4"XQLS1N/^___KE3T" -MXP,P0.,`,(WE!`"@X0`0H.,!(*#A`##@X_[__^LI,-7E`@!3XP<``!J5/0+C -M`S!`XP`PC>4$`*#A`1"@XP`@H.,`,.#C_O__ZPS0C>(P@+WH6!D``/!!+>D` -M0*#A`8"@X;0T`^,#,)#GLC'3X2``4^,=``"*@!"@XP`@H./^___K!`"@X0(0 -MH./^___K_RL/XP`@0.,"(`#@!`"@X0(0H./^___K!`"@X0(0H./^___K`"J@ -MX2(JH.$$`*#A`A"@XP4J@N/^___K!`"@X0(0H./^___K`2N`XP0`H.$"$*#C -MH.,@(*#C_O__ZP0`H.'/$0#C(""@X_[_ -M_^L!4*#C`F"@XS)PH.,%``#J!P"@X?[__^L!4(7B=5#OYF4`5>,&```*!`"@ -MX080H.'^___K`0L0X_3__QIC`%7C#```FJP`G^6L$)_E_O__ZP0`H.$#$*#C -M4""@X_[__^L*`*#C_O__ZP(``.J,`)_EA!"?Y?[__^L$`*#A`Q"@XU0@H./^ -M___K!`"@X5@>#^,`(*#C_O__ZP``6.,0```*!`"@X0@0H..C(`?C_O__ZP0` -MH.$H$*#C@""@X_[__^L$`*#A)!"@XP\H"./^___K!`"@X0`0H./Y(*#C_O__ -MZ_"!O>@$`*#A'Q"@XP`@H./^___K\(&]Z/PK``!D&0``-"P``/!!+>D`4*#A -MM#0#XP.`D.<`0*#C!&"@X^ES`.,%`*#A!A"@X?[__^L"`!#C`P``&@<`5.&: -M```*`4"$XO;__^H%`*#A'!"@XP`@H./^___K!0"@X1$0H.,K(*#C_O__ZV0` -MH./^___K!0"@X2$0H./^___K`0`0XPT``!H!((#C!0"@X2$0H.-R(._F_O__ -MZV0`H./^___K!0"@X0`0H./^___K_B``X@4`H.$`$*#C_O__ZP4`H.$$$*#C -M_O__ZP$L@.,%`*#A!!"@XW(@_^;^___K`$"@XP1@H./I!@`XP`@X./^___KN#(#XP,`A.<$`*#A!!P`XP`@X./^ -M___KO#(#XP,`A.<$`*#A`AN@XP`@X./^___KRSV@XP,`A.!@`XS@@`.,X($#C`#"@X_[__^L&``#J`P!3XP0``!H$`*#A>!@` -MXS@@H.,`,*#C_O__ZP0`H.$$'`#C\""@XP`PH./^___K!`"@X0(;H.,"(*#C -M`3"@X_[__^L$`*#AYQZ@XP`@X./^___KQ#(#XP,`A.<$`*#AYQZ@XP`@X..@ -M-0+C&S!`X_[__^L`(*#C`""-Y00`H.$"$*#A`##@X_[__^LI,-7E`@!3XP8` -M`!H`(*#C`""-Y00`H.$!$*#C_S\/XP\P0./^___K!`"@X1$0H./^___K`&"@ -MX0`@E>6`,`_C`#!`XP,P`N!"#5/C_F```O9@!A($`*#A$1"@XP8@H.'^___K -M!`"@X6D>H./^___K`B"`XP0`H.%I'J#C/C_ZR$``.J(`)_E_O__ZXPU -M`^,#,)3G``!3XQ$``!H$`*#AR_W_ZP0`H.$!$*#C*/[_ZP0`H.'I^?_K!`"@ -MX0@0H..C(`?C_O__ZP0`H.$!$*#C@B"@X_[__^L$`*#A`1"@XU_X_^NR,@/C -M`S#4YP``4^,%```*L3(#XP,PU.<``%/C`0``"@0`H.%X^/_K`0"@XQ"`O>A\ -M+```\$(`0*#AM#0#XP.`D.?^___KLS(#XP,PU.<``%/C$P``"@0` -MH.'^___K.C#8Y0``4^,#```*!`"@X0$0H./^___K!```Z@0`H.$`$*#C_O__ -MZP$PH.,Z,,CE!`"@X?[__^L$`*#A_O__ZP%@H.-E`P#J!`"@X6G^_^L`8%#B -M80,`"N4]`N,#H-3G``!:X_F@H`/VH*`3`%"@XP%P2N((``#J`6"%X@0`H.$% -M$*#A!B"@X0[Y_^L`4*#A`0!0XQ\``!H&4*#A!Q"@X0<`5>'S__\Z!`"@X?\@ -MH.,$^?_K`%"@X0$`4.,5```:"0``Z@90H.$!8(7B!`"@X040H.$&(*#A^OC_ -MZP!0H.$!`%#C!```"@H``.K^`%KC"E"@D?/__YH!``#J_@!6X^___YH$`*#A -M_Q"@XPH@H.'L^/_K`%"@X0!@5>(O`P`*M#0#XP-0E.<`8)7EUF'@Y^4]`N,# -M<-3G``!6XZ.0H`,"```*``!7X["0H!/GD*`#,#?5Y0$`$^,`H*`#!0``"@`` -M5N,"```*``!7XPR@H`,````**:"@XP(`$^,&```*``!6XRE@H`,0```*``!7 -MXQQ@H!,"8*`#`@``Z@``5N,*```*`&"@XP0`$^,`4*`#`@``"@``5^,<4*`3 -M`E"@`P0`H.&%'Z#C!2"@X?[__^L)*(KA`B&"XP0`H.$"'*#C!B2"X?[__^OE -M/0+C`U#4YP``5>/Y4*`#]E"@$P0`H.$D%`#C!2"@X?[__^L$`*#A)10`XP4@ -MH.'^___K!`"@X5T4`.,%(*#A_O__ZP0`H.%%'Z#C!2"@X?[__^L$`*#A"1(` -MXP4@H.'^___KM#0#XP-0E.<`,)7E"``3XT$```HQ-]7E`@!3XQ4```H#`%/C -M+@``"@$`4^-0```:,"?5Y0$@0N)R(._F`P!2XP!0H(,`,`"3`#!`DX(P@Y"\ -M5-.1`%"-Y010C>4(4(WE!`"@X040H.$%(*#A!3"@X3KY_^L^``#J,#?5Y0,P -M0^)S,._F`P!3XP!@H(,&4*"!`"``DP`@0).#,(*0M%73D;QETY'E/0+C`S#4 -MYP``4^,&H*`1!7"@$06@H`$&<*`!`*"-Y010C>4(4(WE!`"@X080H.$'(*#A -M!3"@X1_Y_^LC``#JY3T"XP,@U.<#,*#C`#"-Y00PC>4(,(WE!`"@X0$0H.,` -M`%+C`2"@`0(@H!,",*#C$?G_ZQ4``.HQ-]7E`0!3XP<```H"`%/C"P``&N4] -M`N,#4-3G``!5XS-0H`,U4*`3!@``ZC`WU>4"`%/C`@``"@$`4^,_4*`#```` -M"@!0H.,$`*#A#1$`XP4@H.'^___K!`"@X181`./_)P+C_O__ZP0`H.%!'Z#C -M$2"@X_[__^L9--CE``!3XPL```H$`*#A)!4`X_\@H./^___K!`"@X405`.," -M+*#C_O__ZP0`H.%C%`#C!2"@X_[__^L$`*#A_O__ZP``4.,'```:`&"@XU`V -M`^,#8,3G&V3(Y0```.,``$#C_O__ZV0"`.H!,*#C4"8#XP(PQ.<;-,CE```` -MXP``0./^___K!`"@X?[__^L-,@/C`S#4YP$`4^,"(*`#J#(#`P,@A`>T-`/C -M`U"4YP`PE>5W,`/B!""@XR@@Q>4@`%/C`S"@$RDPQ14&,*#C)##(Y00`H.'^ -M___K`&!0XD8"``H$`*#A#Q8`XP0@H./^___K!`"@X4D?H.,`(.#C_O__ZP0` -MH.$2'J#C`"#@X_[__^MA7J#C%F8`XP4PA."S/8/B$3"#X@0`H.$%$*#A`"#3 -MY?[__^L!4(7B!@!5X?7__QH$`*#A`1R@X_[__^L#*,#C!`"@X0$H.,` -M(.#C_O__ZP0`H.$D%@#C`"#@X_[__^L$`*#A$1V@X_[__^L@6J#A!5J@X00` -MH.$1':#C\2\/XP\@0.,"((7A_O__ZP0`H.$H%`#C$"`!X_[__^L$`*#A*A0` -MXS`@`^/^___K!`"@X2@4`.,*(`'C_O__ZP0`H.$Z%@#C"B`!X_[__^L$`*#A -M%!4`XPH@`>/^___K!`"@X185`.,*(`'C_O__ZP0`H.$(%0#C*R0*XUX@0./^ -M___K!`"@X0P5`.-/)`KC_O__ZP0`H.$$%0#C)",*XUX@0./^___K!`"@X04< -MH.,F(@KC+R!`X_[__^L$`*#A0QZ@XP`@H./^___K!`"@X304`.,$)`#C""!! -MX_[__^L$`*#A.!0`XP$B`.,#)$#C_O__ZP0`H.$\%`#C!28`XPH./^___K@"S@X:(LX.$$`*#A0AZ@XW(@[^;^___K!`"@X1D=H.-` -M(*#C_O__ZP8PE.<`(*#C.B?#Y00`H.$,]O_K!`"@X5T5`./_(*#C_O__ZP0` -MH.'^___K`&!0XK,!``H$`*#A_O__ZP!@4.*O`0`*`""8Y8`P#^,`,$#C`S`" -MX(``4^,2```:=R`"XB``4N,/```*53(`XP,P0.,`,(WE!`"@X0`0H.,:(*#C -M`##@X_[__^L`.@#C!3!`XP`PC>4$`*#A`!"@XQL@H.,`,.#C_O__Z_]?#^,/ -M4$#C!`"@X0`0H.,8(*#C!3"@X?[__^L0!(CE!`"@X0$0H.,8(*#C!3"@X?[_ -M_^L4!(CE!`"@X0(;H.,!)*#C`3"@X_[__^L$`*#A`AN@XP(DH.,!,*#C_O__ -MZP0`H.'^___K!`"@X200V.7^___K`#"8Y7H.,#+*#C_O__ZP(`4.,"(*`#_";%!6`UGP4!(*`3_";% -M%5@UGQ58!9_E2!6?Y?[__^L$`*#AS!0`X_\O#^,!(D#C_O__ZP0`H.$C%`#C -M_R"@X_[__^OE/0+C`S#4YP``4^,#```*!`"@X48>H.,`(*#C_O__ZP`@H..H -M,@/C`R"$YSHPV.4"`%/A`P``"@0`H.$!$*#C_O__ZP0``.H$`*#A`!"@X_[_ -M_^L!,*#C.C#(Y00`H.'^___K!`"@X?[__^NT-`/C`U"4YP0`H.%5'J#C_O__ -MZR`$A>4$`*#A(A4`X_[__^L4$`*#A0!X/X^`@H./^___K!`"@X4$>#^.-(*#C_O__ZP0`H.%" -M'@_C@""@X_[__^L$`*#A@Q^@XR`C`./]($#C_O__ZP`@F.6`,`_C`#!`XP,P -M`N"``%/C+P``"@0`H.%`'@_CYB"@X_[__^L$`*#A01X/XY0@H./^___K!`"@ -MX4(>#^.`(*#C_O__ZP0`H.%`'@_CX""@X_[__^L$`*#A01X/XQD@H./^___K -M!`"@X4(>#^.`(*#C_O__ZP0`H.%`'@_CY2"@X_[__^L$`*#A01X/XY$@H./^ -M___K!`"@X4(>#^.`(*#C_O__ZP0`H.%`'@_CXB"@X_[__^L$`*#A01X/XX$@ -MH./^___K!`"@X4(>#^.`(*#C_O__Z[0T`^,#4)3G`*"5Y0B`"N($`*#A^A$` -MX_[__^L`<*#A`0`0XR```!K_7P_C#U!`XP8T#^,`,(WE!`"@X0`0H.,5(*#C -M!3"@X?[__^L&-`_C!#!`XP`PC>4$`*#A`!"@XQ4@H.,%,*#A_O__ZP8T#^,( -M,$#C`#"-Y00`H.$`$*#C%2"@XP4PH.'^___K!C0/XPPP0.,`,(WE!`"@X0`0 -MH.,5(*#C!3"@X?[__^L","?BTS#@YP``6.,`@*`#`8`#$@``6.,C```*=Z`* -MXB``6N,@```:_U\/XP]00.,&-`_C`#"-Y00`H.$!$*#C%2"@XP4PH.'^___K -M!C0/XP0P0.,`,(WE!`"@X0$0H.,5(*#C!3"@X?[__^L&-`_C"#!`XP`PC>4$ -M`*#A`1"@XQ4@H.,%,*#A_O__ZP8T#^,,,$#C`#"-Y00`H.$!$*#C%2"@XP4P -MH.'^___K$``7XP<``!H$`*#A%A"@X_[__^L/(`#B!`"@X180H..0((+C_O__ -MZ[0T`^,#4)3GP#;5Y0``4^-=```*PC;5Y0,`4^-:```:Q3;5Y0``4^,'```* -M!`"@X4`0H..@(*#C_O__ZZ`!G^5`$*#CH""@X_[__^L$`*#A_10`X_[__^O% -M-M7E`0!3XP(PH!,`,*`#`7``XL4'<(/A``!2XP0@H!,`(*`#`G"'X7=P -M[^;]5`#C!`"@X040H.$'(*#A_O__ZT0!G^4%$*#A!R"@X?[__^O$A@#CJEH) -MXZI:2N,$`*#A"!"@X04@H.'^___K%'&?Y0<`H.$($*#A!2"@X?[__^L$@(CB -M0%``X[U?3^,$`*#A"!"@X04@H.'^___K!P"@X0@0H.$%(*#A_O__Z\Q6`.,$ -M`*#A!1"@X4$AH./^___K!P"@X040H.%!(:#C_O__ZP1\`.,$`*#A!Q"@X?[_ -M_^O]4`#B!`"@X0<0H.$%(*#A_O__ZY0`G^4%$*#A_O__ZP%\A^($`*#A!Q"@ -MX?[__^O]4`#B!`"@X0<0H.$%(*#A_O__ZV@`G^4%$*#A_O__ZP0`H.'^___K -M!`"@X140H./I(*#C_O__ZV%>H.,6=@#C!`"@X040H.'^___K`5"%X@<`5>'Y -M__\:!@"@X1#0C>+PA[WHS"P``*09``#<+```Z"P``/0L```(+0``("T``$@M -M``!@+0``$$`MZ0!`H.$<`(#B_O__ZP`PH.,.,,3E$("]Z!!`+>D`0*#ASPV` -MXBP`@.+S___KT0V$X@@`@.+P___K$("]Z'!`+>D!0*#A!0"!Z`(PH.,(,('E -M`%"@XPQ0P>4.4,'E%%"!Y1A0@>4`,`#C`#!`XR@P@>4L$(3E'`"!X@40H.$% -M(*#A_O__ZTQ0A.50,(3B4#"$Y50PA.4`,`#C`#!`XU@PA.5P@+WH$$`MZ0!` -MH.$`(`#CK#0#XP`@0.,#((#GSQV`XBP0@>(!(*#CV___ZP0`H.'1'83B"!"! -MX@(@H./6___K$("]Z'!`+>D`0*#A`5"@X;0T`^,#8)#GC#4#XP,PD.4!`%/C`@``"@(`4^,I```:!0``ZI`@`.($`*#A3A"@XV`@ -M@N/^___K(@``Z@\@`.($`*#A3A"@XR`@@N/^___K'```Z@0PD>4!`%/C`@`` -M"@(`4^,7```:$```ZOTVUN4``%/C!@``"DX0H./^___K!`"@X4X0H./@(*#C -M_O__ZPP``.I,$*#C_O__ZW`@`.($`*#A3!"@X_[__^L%``#J31"@X_[__^MP -M(`#B!`"@X4T0H./^___K`3"@XPPPQ>5P@+WH\$$MZ0!`H.$!4*#AM#0#XP-@ -MD.>,-0/C`S"0YP$`4^/P@;T(B#4#XP,PD.,M;E`0!3XP0``!H$`*#A3A"@XV(@ -MA^/^___K*0``Z@0`H.%.$*#C:""'X_[__^LD``#J!R``X@0`H.%.$*#C"""" -MX_[__^L>``#J!#"1Y0$`4^,"```*`@!3XQD``!H1``#J_3;6Y0``4^,&```* -M3A"@X_[__^L$`*#A3A"@X^@@H./^___K#@``ZDP0H./^___K<"``X@0`H.%, -M$*#C""""X_[__^L&``#J31"@X_[__^MP(`#B!`"@X4T0H.,(((+C_O__ZP`P -MH.,,,,7E\(&]Z/!!+>D`0*#A3&`TY8PU`^,#,);G`0!3X_"!O0B(-0/C`S"6 -MYP$`4^/P@;T(I#0#XP,PEN<&`%/C`_&?EV,$`.HHO`(`[+T"`*C"`@"@Q`(` -MD,<"``3+`@`\S0(`&#"4Y0$`4^,#```:!@"@X000H.$Z___K`@``Z@8`H.$$ -M$*#A??__ZQ0@E.4!($+B%""$Y0@PE.4(`%/C!P``"@D`4^,1```*`P!3XP%0 -MH!,0```:`5!RX@!0H#,-``#J;%"6Y0$`%>,`4*`#!```"B``%>,,```:0``5 -MXPH``!K54>#G``!2XP0```H!``#J`5!RX@!0H#,``%7C$```"FPPEN4!`!/C -M"0``"@PPU.4``%/C(00`&@8`H.$$$*#A#___ZP(``.H&`*#A!!"@X5+__^L` -M,*#C%#"$Y0XPQ.7P@;WH&#"4Y0$`4^,",*`#&#"$!0$PH!,8,(05"#"4Y0,P -M0^(&`%/C`_&?ER4``.I4O0(`<+T"`-"]`@#0O0(`T+T"`'"]`@",O0(``#`` -MXP`P0.,`$)/E'`"$X@H0@>+^___K\(&]Z``P`.,`,$#C`!"3Y1P`A.(4$('B -M_O__Z_"!O>@8,)3E`0!3XP8``!H`,`#C`#!`XP`0D^4<`(3B*!"!XO[__^OP -M@;WH`#``XP`P0.,`$)/E'`"$XB@0@>+^___K\(&]Z``P`.,`,$#C`!"3Y1P` -MA.(4$('B_O__Z_"!O>BT-`/C`W"6Y]%=AN((4(7B-##7Y08`4^,%0*`!&#"4 -MY0$`4^,#```:!@"@X000H.'"_O_K`@``Z@8`H.$$$*#A!?__ZS0PU^4``%/C -M)P``&FPPEN4!`!/C$@``"E4T`^,#,-;G``!3XP8``!H&`*#A!1"@X;'^_^L! -M(*#C530#XP,@QN<9``#J5#0#XP,PUN<``%/C%0``&@8`H.$%$*#AIO[_ZQ$` -M`.I5-`/C`S#6YP``4^,&```:!@"@X040H.'E_O_K`2"@XU4T`^,#(,;G!@`` -MZE0T`^,#,-;G``!3XP(```H&`*#A!1"@X=K^_^L(,)3E`S!#X@@`4^,#\9^7 -MJ@,`ZDB_`@`4OP(`G,T"`'R_`@"@,,-3E``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"! -MXO[__^OP@;WH%#"4Y0$P0^(4,(3E``!3XS```!JH,@/C`S"6YP``4^,#```* -M!@"@X000H.&F_O_K)0``ZFPPEN4!,`/B`0!3XP\``!H0,,3E`S"@XP@PA.4, -M,-3E``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"!XO[_ -M_^L1``#J``!3XP\``!H!,*#C#S#$Y00PH.,(,(3E###4Y0``4^,",*`3&#"$ -M%0$PH`,8,(0%`#``XP`P0.,`$)/E'`"$XF00@>+^___K`#"@XQ(PQ.7P@;WH -MJ#(#XP,PEN<``%/C`P``"@8`H.$$$*#A=?[_Z_"!O>@,,-3E``!3XP(PH!,8 -M,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B$A"!XO[__^OP@;WH%#"4Y0$P -M0^(4,(3E``!3XS$``!JH,@/C`S"6YP``4^,#```*!@"@X000H.%;_O_K)0`` -MZFPPEN4!,`/B`0!3XP\``!H0,,3E`S"@XP@PA.4,,-3E``!3XP(PH!,8,(05 -M`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"!XO[__^L1``#J``!3XP\``!H! -M,*#C#S#$Y00PH.,(,(3E###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P -M0.,`$)/E'`"$XF00@>+^___K`#"@XQ0PA.4.,,3E\(&]Z*@R`^,#,);G``!3 -MXP,```H&`*#A!!"@X2G^_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0% -M`#``XP`P0.,`$)/E'`"$X@40@>+^___K\(&]Z`PPU.4``%/C`C"@$Q@PA!4! -M,*`#&#"$!0`P`.,`,$#C`!"3Y1P`A.(2$('B_O__Z_"!O>@8,)3E`0!3XP@` -M`!H",*#C&#"$Y0`P`.,`,$#C`!"3Y1P`A.)]'X'B_O__Z_"!O>BH,@/C`S"6 -MYP``4^,#```*!@"@X000H.'[_?_K#P``Z@$PH.,0,,3E`S"@XP@PA.4,,-3E -M``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B,A"!XO[__^L` -M,*#C$S#$Y?"!O>@8,)3E`0!3XP,``!H&`*#A!!"@X9K]_^L"``#J!@"@X000 -MH.'=_?_K"#"4Y08`4^,"```*"@!3X_"!O1@V``#J%#"4Y0$P0^(4,(3E``!3 -MXQP``!JH,@/C`S"6YP``4^,#```*!@"@X000H.'+_?_K$0``ZFPPEN4!,`/B -M`0!3XP4``!H(,(3E&#"$Y08`H.$$$*#A>OW_ZP<``.H``%/C!0``&@(PH.,( -M,(3E&#"$Y08`H.$$$*#AN/W_ZP`PH.,2,,3E\(&]Z*@R`^,#,);G``!3XP,` -M``H&`*#A!!"@X:[]_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#`` -MXP`P0.,`$)/E'`"$XA(0@>+^___K\(&]Z!0PE.4!,$/B%#"$Y0``4^,<```: -MJ#(#XP,PEN<``%/C`P``"@8`H.$$$*#AE/W_ZQ$``.IL,);E`3`#X@$`4^,% -M```:"#"$Y1@PA.4&`*#A!!"@X4/]_^L'``#J``!3XP4``!H",*#C"#"$Y1@P -MA.4&`*#A!!"@X8']_^L`,*#C#C#$Y?"!O>BH,@/C`S"6YP``4^,#```*!@"@ -MX000H.%W_?_K\(&]Z`PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$!0`P`.,`,$#C -M`!"3Y1P`A.(%$('B_O__Z_"!O>@8,)3E`0!3XP,``!H&`*#A!!"@X1S]_^L% -M``#J"#"4Y0L`4^.@```*!@"@X000H.%<_?_K"#"4Y08P0^(%`%/C`_&?ERP" -M`.H`Q0(`G,T"`)S-`@#HQ@(`],4"`!S'`@`4,)3E`3!#XA0PA.4``%/C(@`` -M&J@R`^,#,);G``!3XP,```H&`*#A!!"@X47]_^L7``#J;#"6Y0$P`^(!`%/C -M"```&@@PA.48,(3E###4Y0``4^,.```:!@"@X000H.'Q_/_K"@``Z@``4^,( -M```:`C"@XP@PA.48,(3E###4Y0``4^,"```*!@"@X000H.$L_?_K`#"@XQ(P -MQ.7P@;WHJ#(#XP,PEN<``%/C`P``"@8`H.$$$*#A(OW_Z_"!O>@,,-3E``!3 -MXP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B$A"!XO[__^OP@;WH -M%#"4Y0$P0^(4,(3E``!3XR(``!JH,@/C`S"6YP``4^,#```*!@"@X000H.$( -M_?_K%P``ZFPPEN4!,`/B`0!3XP@``!H(,(3E&#"$Y0PPU.4``%/C#@``&@8` -MH.$$$*#AM/S_ZPH``.H``%/C"```&@(PH.,(,(3E&#"$Y0PPU.4``%/C`@`` -M"@8`H.$$$*#A[_S_ZP`PH.,.,,3E\(&]Z*@R`^,#,);G``!3XP,```H&`*#A -M!!"@X>7\_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P0.,` -M$)/E'`"$X@40@>+^___K\(&]Z`PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$!0`P -M`.,`,$#C`!"3Y1P`A.(2$('B_O__Z_"!O>@8,)3E`0!3XP@``!H",*#C&#"$ -MY0`P`.,`,$#C`!"3Y1P`A.)]'X'B_O__Z_"!O>BH,@/C`S"6YP``4^,#```* -M!@"@X000H.&W_/_K!0``Z@$PH.,(,(3E&#"$Y08`H.$$$*#A:?S_ZP`PH.,3 -M,,3E\(&]Z!@PE.4!`%/C`P``&@8`H.$$$*#A8/S_ZP(``.H&`*#A!!"@X:/\ -M_^M;-`/C`S#6YP``4^,,```:8#0#XP,PEN<``%/C"```&@(PH.-@)`/C`C"& -MYU`D`^,",(;G!@"@X=$=AN(($('BDOS_ZP@PE.4$,$/B"`!3XP/QGY=B`0#J -M-,@"`)S-`@"\R`(`G,T"`&C(`@`@R@(`+,D"`'3*`@"HR@(`###4Y0``4^," -M,*`3&#"$%0$PH`,8,(0%`#``XP`P0.,`$)/E'`"$XF00@>+^___K\(&]Z`PP -MU.4``%/C"```"@(PH.,8,(3E`#``XP`P0.,`$)/E'`"$XA00@>+^___K\(&] -MZ`$PH.,8,(3E`#``XP`P0.,`$)/E'`"$X@H0@>+^___K\(&]Z!0PE.4!,$/B -M%#"$Y:@R`^,#,);G``!3XP<```H0,@/C`S"6YP("4^,#``":!@"@X000H.%4 -M_/_K\(&]Z`PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$!0`P`.,`,$#C`!"3Y1P` -MA.(2$('B_O__Z_"!O>@4,)3E`3!#XA0PA.4``%/C'@``&J@R`^,#,);G``!3 -MXP<```H0,@/C`S"6YP("4^,#``":!@"@X000H.$V_/_K#P``Z@$PH.,/,,3E -M!#"@XP@PA.4,,-3E``!3XP(PH!,8,(05`3"@`Q@PA`4`,`#C`#!`XP`0D^4< -M`(3B9!"!XO[__^L`,*#C#C#$Y?"!O>BH,@/C`S"6YP``4^,'```*$#(#XP,P -MEN<"`E/C`P``F@8`H.$$$*#A%_S_Z_"!O>@,,-3E``!3XP(PH!,8,(05`3"@ -M`Q@PA`4`,`#C`#!`XP`0D^4<`(3B!1"!XO[__^OP@;WH###4Y0``4^,(```* -M`C"@XQ@PA.4`,`#C`#!`XP`0D^4<`(3B%!"!XO[__^OP@;WH`3"@XQ@PA.4` -M,`#C`#!`XP`0D^4<`(3B"A"!XO[__^OP@;WH###4Y0``4^,",*`3&#"$%0$P -MH`,8,(0%`#``XP`P0.,`$)/E'`"$X@H0@>+^___K\(&]Z!0PE.4!,$/B%#"$ -MY0``4^,$```:###4Y0``4^.J```*`3"@XQ0PA.4,,-3E``!3XP(PH!,8,(05 -M`3"@`Q@PA`4`,`#C`#!`XP`0D^4<`(3B"A"!XO[__^OP@;WH&#"4Y0$`4^,# -M```:!@"@X000H.&#^__K`@``Z@8`H.$$$*#AQOO_ZP@PE.4&`%/C`@``"@H` -M4^/P@;T8/@``ZA0PE.4!,$/B%#"$Y0``4^,@```:J#(#XP,PEN<``%/C#0`` -M"A`R`^,#,);G`@)3XPD``)H",*#C"#"$Y1@PA.4,,-3E``!3XP\```H&`*#A -M!!"@X:K[_^L+``#J`3"@XP@PA.48,(3E###4Y0``4^,%```:`#``XP`P0.,` -M$)/E'`"$X@40@>+^___K`#"@XQ(PQ.7P@;WHJ#(#XP,PEN<``%/C!P``"A`R -M`^,#,);G`@)3XP,``)H&`*#A!!"@X8_[_^OP@;WH###4Y0``4^,",*`3&#"$ -M%0$PH`,8,(0%`#``XP`P0.,`$)/E'`"$XA(0@>+^___K\(&]Z!0PE.4!,$/B -M%#"$Y0``4^,@```:J#(#XP,PEN<``%/C#0``"A`R`^,#,);G`@)3XPD``)H" -M,*#C"#"$Y1@PA.4,,-3E``!3XP\```H&`*#A!!"@X6O[_^L+``#J`3"@XP@P -MA.48,(3E###4Y0``4^,%```:`#``XP`P0.,`$)/E'`"$X@40@>+^___K`#"@ -MXPXPQ.7P@;WHJ#(#XP,PEN<``%/C!P``"A`R`^,#,);G`@)3XP,``)H&`*#A -M!!"@X5#[_^OP@;WH###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P0.,` -M$)/E'`"$X@40@>+^___K\(&]Z!@PE.4!`%/C`P``&@8`H.$$$*#A]?K_Z_"! -MO>@&`*#A!!"@X3C[_^OP@;WH`0!3X^+[_QK>^__J"C"@XQ0PA.4!,*#C&#"$ -MY0`P`.,`,$#C`!"3Y1P`A.(R$('B_O__Z_"!O>AP0"WI`%"@X;0T`^,#,)#G -M-##3Y08`4^//38`2+$"$$M%-@`((0(0"`1!!X@8`4>,!\9^76```ZO3-`@#T -MS0(`],T"`*3.`@"DS@(`&,X"``C/`@`!,*#C"#"$Y1@PA.4`,`#C`#!`XP`0 -MD^4<`(3B_O__ZW"`O>@0-=#E``!3XP(```IL,)#E`0`3XW"`O1@2,-3E``!3 -MXW"`O1@.,-3E`0!3XP,``!H<`(3B_O__ZP`PH.,.,,3E`3"@XQ(PQ.4&,*#C -M"#"$Y1@PH.,4,(3E###4Y0``4^,",*`3&#"$%0$PH`,8,(0%`#``XP`P0.,` -M$)/E'`"$XA(0@>+^___K<("]Z`XPU.4``%/C<("]&`@PE.4&`%/C<("]"`$P -MH.,.,,3E"C"@XP@PA.4",*#C%#"$Y0PPU.4``%/C`C"@$Q@PA!4!,*`#&#"$ -M!0`P`.,`,$#C`!"3Y1P`A.(%$('B_O__ZW"`O>@",*#C"#"$Y1@PA.4.,-3E -M``!3XP,```H<`(3B_O__ZP`PH.,.,,3E!0"@X000H.'"^O_K<("]Z'!`+>D` -M0*#AC#4#XP,PD.,"`%,3<("]F`$`4>,#`%$3<("]"*0T`^,#,)3G -M`3!#X@4`4^,#\9^79@8`ZO3/`@#,!\9^75`8`ZE30 -M`@#\T`(`5-`"`(#2`@"`T@(`I-$"`#35`@!4T`(`,-,"`/#3`@`PTP(`U-0" -M``\PU>4``%/C<("]&`@PE>4&`%/C<("]"`L`4^,)`%,3<("]"!,PU>4``%/C -M<("]&!`PU>4!`%/C`P``&AP`A>+^___K`#"@XQ`PQ>4.,-7E`0!3XP,``!H< -M`(7B_O__ZP`PH.,.,,7E`3"@XP\PQ>4#,(/B"#"%Y0PPU>4``%/C`C"@$Q@P -MA14!,*`#&#"%!:0]G^4`$)/E'`"%XF00@>+^___K<("]Z!`PU>4``%/C<("] -M&`@PE>4&`%/C<("]"`L`4^,)`%,3<("]"!,PU>4``%/C<("]&`\PU>4!`%/C -M`P``&AP`A>+^___K`#"@XP\PQ>4.,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,. -M,,7E`3"@XQ`PQ>4",(/B"#"%Y0PPU>4``%/C`C"@$Q@PA14!,*`#&#"%!?P\ -MG^4`$)/E'`"%XC(0@>+^___K<("]Z!`UU.4``%/C`@``"FPPE.4!`!/C<("] -M&!(PU>4``%/C<("]&`@PE>4+`%/C"0!3$W"`O0@3,-7E``!3XW"`O1@/,-7E -M`0!3XP,``!H<`(7B_O__ZP`PH.,/,,7E$##5Y0$`4^,#```:'`"%XO[__^L` -M,*#C$##%Y0XPU>4!`%/C`P``&AP`A>+^___K`#"@XPXPQ>4!,*#C$C#%Y04P -M@^((,(7E$C"#XA0PA>4,,-7E``!3XP(PH!,8,(45`3"@`Q@PA04@/)_E`!"3 -MY1P`A>(2$('B_O__ZW"`O>@.,-7E``!3XW"`O1@(,)7E!@!3XW"`O0@+`%/C -M"0!3$W"`O0@3,-7E``!3XW"`O1@/,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,/ -M,,7E$##5Y0$`4^,#```:'`"%XO[__^L`,*#C$##%Y0$PH.,.,,7E"3"#X@@P -MA>4",*#C%#"%Y0PPU>4``%/C`C"@$Q@PA14!,*`#&#"%!7`[G^4`$)/E'`"% -MX@40@>+^___K<("]Z!,PU>4``%/C<("]&`\PU>4!`%/C`P``&AP`A>+^___K -M`#"@XP\PQ>40,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,0,,7E#C#5Y0$`4^,# -M```:'`"%XO[__^L`,*#C#C#%Y1(PU>4!`%/C`P``&AP`A>+^___K`#"@XQ(P -MQ>4!,*#C$S#%Y0DPH.,(,(7E###5Y0``4^,",*`3&#"%%0$PH`,8,(4%`#`` -MXP`P0.,`$)/E'`"%XA(0@>+^___K<("]Z`\PU>4!`%/C`P``&AP`A>+^___K -M`#"@XP\PQ>40,-7E`0!3XP,``!H<`(7B_O__ZP`PH.,0,,7E#C#5Y0$`4^,# -M```:'`"%XO[__^L`,*#C#C#%Y1(PU>4!`%/C`P``&AP`A>+^___K`#"@XQ(P -MQ>43,-7E``!3XP$PH`,3,,4%`0``"AP`A>+^___K"S"@XP@PA>4,,-7E``!3 -MXP@```H",*#C&#"%Y0`P`.,`,$#C`!"3Y1P`A>)]'X'B_O__ZW"`O>@!,*#C -M&#"%Y0`P`.,`,$#C`!"3Y1P`A>+^___K<("]Z!,PU>4``%/C`P``"AP`A>+^ -M___K`#"@XQ,PQ>4!,*#C#S#%Y00PH.,(,(7E###5Y0``4^,",*`3&#"%%0$P -MH`,8,(4%`#``XP`P0.,`$)/E'`"%XF00@>+^___K<("]Z`(PH.,(,(7E&#"% -MY0\PU>4``%/C`P``"AP`A>+^___K`#"@XP\PQ>40,-7E``!3XP,```H<`(7B -M_O__ZP`PH.,0,,7E#C#5Y0``4^,#```*'`"%XO[__^L`,*#C#C#%Y1,PU>4` -M`%/C`P``"AP`A>+^___K`#"@XQ,PQ>42,-7E``!3XP,```H<`(7B_O__ZP`P -MH.,2,,7E!`"@X040H.$;^?_K<("]Z,]=A.(L4(7B`A!!X@H`4>,!\9^7X`0` -MZI37`@!DV0(`[-8"`.S6`@`@U@(`H-D"`&39`@`4V`(`K-@"`!38`@`(V0(` -M$#74Y0``4^-P@+T8_C,#XP,PU.<``%/C<("]&/0S`^,#,)3G"P!3XPD`4Q-P -M@+T(_S,#XP,PU.<``%/C<("]&/HS`^,#,-3G`0!3XP4``!H-"X3B"`"`XO[_ -M_^L`(*#C^C,#XP,@Q.X-Y_E -M`!"3Y0T+A.((`(#B$A"!XO[__^MP@+WH^C,#XP,PU.<``%/C<("]&&PPE.4! -M`!/C<("]"/0S`^,#,)3G!@!3XW"`O0@+`%/C"0!3$W"`O0C_,P/C`S#4YP`` -M4^-P@+T8`2"@X_HS`^,#(,3G"2""X@8P0^(#((3G`B"@XPPP@^(#((3G"#!# -MX@,PU.<``%/C!#0#$P,@A!C_,P/C`S#4YP``4^-P@+T8^C,#XP,PU.@",*#C]",#XP(PA.<$)`/C`C"$YP`P -M`.,`,$#C`!"3Y0T+A.((`(#B_O__ZW"`O>C^,P/CLS"4X0``4^-P@+T8`C"# -MXO0C`^,",(3G$"""X@(PA.<`-9_E`!"3Y0T+A.((`(#B_O__ZW"`O>@",*#C -M]",#XP(PA.<$)`/C`C"$Y_HS`^,#,-3G``!3XP4```H-"X3B"`"`XO[__^L` -M(*#C^C,#XP,@Q.?^,P/C`S#4YP``4^,%```*#0N$X@@`@.+^___K`""@X_XS -M`^,#(,3G_S,#XP,PU.<``%/C!0``"@T+A.((`(#B_O__ZP`@H./_,P/C`R#$ -MYP`P`.,`,$#C`!"3Y0T+A.((`(#B_O__ZW"`O>@"$$'B"@!1XP'QGY?'`P#J -M^-L"`%3>`@!0VP(`4-L"`(3:`@"4W@(`5-X"`)S<`@!8W0(`G-P"`/S=`@`0 -M-=3E``!3XW"`O1C^,P/C`S#4YP``4^-P@+T8]#,#XP,PE.<+`%/C"0!3$W"` -MO0C_,P/C`S#4YP``4^-P@+T8^C,#XP,PU.CZ,P/C`S#4YP``4^-P@+T8;#"4Y0$` -M$^-P@+T(]#,#XP,PE.<&`%/C<("]"`L`4^,)`%,3<("]"/\S`^,#,-3G``!3 -MXW"`O1@!(*#C^C,#XP,@Q.<)((+B!C!#X@,@A.<"(*#C##"#X@,@A.<(,$/B -M`S#4YP``4^,$-`,3`R"$%P$@H`,$-`,#`R"$!ZPRG^4`$)/E#0N$X@@`@.(% -M$('B_O__ZW"`O>CT,P/C`S"4YPL`4^,)`%,3<("]"/\S`^,#,-3G``!3XW"` -MO1@!,*#C]",#XP(PA.<$)`/C`C"$Y_HS`^,#,-3G``!3XP4```H-"X3B"`"` -MXO[__^L`(*#C^C,#XP,@Q.?^,P/C`S#4YP``4^,%```*#0N$X@@`@.+^___K -M`""@X_XS`^,#(,3G`#``XP`P0.,`$)/E#0N$X@@`@.+^___K<("]Z/\S`^,# -M,-3G``!3XW"`O1CZ,P/C`S#4YP$`4^,%```:#0N$X@@`@.+^___K`""@X_HS -M`^,#(,3G_C,#XP,PU.+^___K<("]Z`$@H.,$-`/C -M`R"$YP`P`.,`,$#C`!"3Y0T+A.((`(#B_O__ZW"`O>C_,P/C`S#4YP``4^,% -M```*#0N$X@@`@.+^___K`""@X_\S`^,#(,3G`C"@X_0C`^,",(3G!"0#XP(P -MA.<`,`#C`#!`XP`0D^4-"X3B"`"`XO[__^MP@+WH_C,#X[,PE.$``%/C<("] -M&`(P@^+T(P/C`C"$YQ`@@N(",(3G$#"?Y0`0D^4-"X3B"`"`XO[__^MP@+WH -M``````(PH./T(P/C`C"$YP0D`^,",(3G^C,#XP,PU.<``%/C!0``"@T+A.(( -M`(#B_O__ZP`@H./Z,P/C`R#$Y_XS`^,#,-3G``!3XP4```H-"X3B"`"`XO[_ -M_^L`(*#C_C,#XP,@Q.?_,P/C`S#4YP``4^,%```*#0N$X@@`@.+^___K`""@ -MX_\S`^,#(,3G`#``XP`P0.,`$)/E#0N$X@@`@.+^___K<("]Z`(P0>(+`%/C -M`_&?EXH"`.K@X`(`X.`"``3C`@`$XP(`!.("`*CG`@!\WP(`R.,"`"CE`@#( -MXP(`K.4"`*3F`@!;-`/C`S#4YP``4^,3```*`""@XULT`^,#(,3GT0V$XB0` -M@.+^___K`C"@XV`D`^,",(3G$"!"X@(PA.=4-`/C`S#4YP``4^,$```*0#$? -MY0`0D^4-"X3B"`"`XO[__^O],P/C`S#4YP``4^-P@+T8]#,#XP,PE.<&`%/C -M<("]"`L`4^,)`%,3<("]"/\S`^,#,-3G``!3XW"`O1CZ,P/C`S#4YP$`4^,% -M```:#0N$X@@`@.+^___K`""@X_HS`^,#(,3G^S,#XP,PU.+^ -M___K<("]Z`(`4>,7```:6S0#XP,PU.<``%/C$P``"@`@H.-;-`/C`R#$Y]$- -MA.(D`(#B_O__ZP(PH.-@)`/C`C"$YQ`@0N(",(3G5#0#XP,PU.<``%/C!``` -M"JPR'^4`$)/E#0N$X@@`@.+^___K^S,#XP,PU.<``%/C<("]&/0S`^,#,)3G -M!@!3XW"`O0@+`%/C"0!3$W"`O0C_,P/C`S#4YP``4^-P@+T8^C,#XP,PU.@0-=3E``!3XP(```IL,)3E -M`0`3XW"`O1C^,P/C`S#4YP``4^-P@+T8]#,#XP,PE.<+`%/C"0!3$W"`O0C_ -M,P/C`S#4YP``4^-P@+T8^S,#XP,PU.+^___K<("]Z%LT`^,#,-3G``!3XQ,` -M``H`(*#C6S0#XP,@Q.?1#83B)`"`XO[__^L",*#C8"0#XP(PA.<0($+B`C"$ -MYU0T`^,#,-3G``!3XP0```J,-1_E`!"3Y0T+A.((`(#B_O__Z_\S`^,#,-3G -M``!3XW"`O1C[,P/C`S#4YP$`4^,%```:#0N$X@@`@.+^___K`""@X_LS`^,# -M(,3G^C,#XP,PU.+^___K<("]Z`$@H.,$-`/C`R"$YX0V'^4` -M$)/E#0N$X@@`@.(*$('B_O__ZW"`O>C_,P/C`S#4YP``4^,%```*#0N$X@@` -M@.+^___K`""@X_\S`^,#(,3G`2"@X_LS`^,#(,3G!""@X_0S`^,#((3G^#,# -MXP,PU.<``%/C`B"@$P0T`Q,#((07`2"@`P0T`P,#((0'`#``XP`P0.,`$)/E -M#0N$X@@`@.)D$('B_O__ZW"`O>C_,P/C`S#4YP``4^,%```*#0N$X@@`@.+^ -M___K`""@X_\S`^,#(,3G`2"@X_LS`^,#(,3G!""@X_0S`^,#((3G^#,#XP,P -MU.<``%/C`B"@$P0T`Q,#((07`2"@`P0T`P,#((0'#5N$X@A0A>(`,`#C`#!` -MXP`0D^4%`*#A9!"!XO[__^M;-`/C`S#4YP``4^,!(*`#6S0#`P,@Q`<"```* -MT0V$XB0`@.+^___K"R"@XU`T`^,#((3G5#0#XP,PU.<``%/C`B"@$V`T`Q,# -M((07`2"@`V`T`P,#((0'`#``XP`P0.,`$)/E!0"@X0H0@>+^___K<("]Z/\S -M`^,#,-3G``!3XP4```H-"X3B"`"`XO[__^L`(*#C_S,#XP,@Q.-P@+T8#@``Z@U;A.((4(7B!0"@X?[__^L!,*#C]",#XP(PA.<$ -M)`/C`C"$YP`P`.,`,$#C`!"3Y04`H.'^___K<("]Z`0`H.'/'83B+!"!XC/T -M_^MP@+WH<$`MZ0!0H.$`0)#EC#4#XP,PE.@>_R_A!$`MY54C,-#E``!3XP0```J!2Z#A#P)4XP!`H!,! -M0*`#`P``ZB`0@>(_`!'C`$"@$P%`H`,$`*#A$`"]Z![_+^$$0"WE'!"0Y2$8 -MH.$!&*#A'!"`Y0`PH.,#0*#ALR"0X0)`).`",(/B(`!3X_K__QH!$(3A'!"` -MY1``O>@>_R_A%3#0Y0``4^,>_R\!`B#0Y0``4N,>_R\1`3!#X@0`4^,#\9^7 -M#P``ZISJ`@"LZ@(`K.H"`+SJ`@"4! -M-8/C!#"!Y1[_+^$$,)'E`S6#XP0P@>4>_R_A*S#0Y0$`4^,"```*`@!3XP<` -M`!H#``#J`#"1Y0$Z@^,`,('E`@``Z@`PD>4".X/C`#"!Y2LPT.4``%/C`#"1 -M%0(Z@Q,`,($5'O\OX48PT.4``%/C'O\O`0`PD>5((-#E`0`2XP(DH!,`(*`# -M`R""X0`@@>5),-#E`0!3XP$F@@,`(($%'O\O`0(`4^,")H(#`""!!1[_+P$` -M`%/C`R:"$P`@@14>_R_A\$\MZ2S03>(`D*#A`6"@X7`0D>4($(WE3BV`XC@@ -M@N(8((WE9#"6Y0$`4^,.```:O##6X08H`.,"`%/A"@``"HXH".,"`%/A!P`` -M"@LPUN4!`%/C!```"A`UT.4!`%/C`0``&@80H.'^___K;*"6Y1PPUN4``%/C -MX```V@@0AN(@$(WE`("@XP`@`.,`($#C%""-Y00@`.,&($#C$""-Y0`@`.,` -M($#C)""-Y0`?#^,!$$#C'!"-Y0`@`.,@+$CC!""-Y0$P0^((`%/A&'"6!0@` -M``H,-`'C`W"9YP1P1^($.P'C`S"9YP``4^,`,*`3'S#6!0=P8^!H4);EM#0# -MXP,PE><,,(WE"D"@X48PUN4!,`/B`#"-Y04`H.$'$*#A_O__ZP``4.,`L*`3 -M"$"*`@&PH`,$`*#A`!"@XR`@H./^___K9!"6Y0\P`>(!`%/C1@``&C(@UN4? -M(`+B!#"4Y0,@@N$$((3E5S#6Y1\P`^(#-(+A!#"$Y4\@UN4"**#A#R@"X@(P -M@^$$,(3E(`"=Y000H.'^___K4S#6Y0$`4^,$,)0%(#"#`P0PA`4$,)050#"# -M$P0PA!6^(-;A##"4Y0(X@^$,,(3E33#6Y0``4^,0,)050#"#$Q`PA!6\,-;A -M!B@`XXX8".,!`%/A`@!3$1<```H+,-;E`0!3XQ0```H04(3B(`"=Y040H.'^ -M___K(`"=Y040H.'^___K$#"4Y0@P@^,0,(3E%#"4Y1P0G>4#,('A%#"$Y3(@ -MUN4,$)WE`B"!X((FTN4#,(+A%#"$Y3,``.H$,)3E0#"#XP0PA.40,)3E`3R# -MXQ`PA.4L``#J`P!3XQ@``!HR(-;E'R`"X@0PE.4#((+A!""$Y54"((/A=S#_Y@,P@N$`,(3E`!"=Y0``4>,!-(,3`#"$%0``6^,& -M```:!#"4Y0$S@^,$,(3E!`"@X?[__^LH0(?B!```Z@0`H.'^___K"*"*XFR@ -MAN4@0(?B!@"@X?[__^L`4*#A"0"@X040H.$$(*#A"#"=Y?[__^L)`*#A!A"@ -MX0<@H.'^___K`8"(XAPPUN4(`%/A!0``V@2@BN`#(!KB`2"@$RJA@N`*H:#A -M,/__ZA@`G>4&$*#A_O__ZRS0C>+PC[WH\$$MZ0!0H.$!0*#A,##1Y57^ -M___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E!0"@X000H.'^___K`0!0XQ<` -M`!H-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K7&"4Y0``5N,%```:5PV% -MXA@`@.)&$(3B_O__ZP!@4.)3```*S#"6Y2``4^-0``":!0"@X080H.'^___K -M``"@X_"!O>A.;87B.&"&X@4`H.$($(3B_O__ZP``4.,D``#*;#"5Y0(+$^,A -M```:!@"@X?[__^L`<%#B'0``"@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[_ -M_^MP<(3E$#"7Y6PPA.440(?E!0"@X6`0E.4$(*#A_O__ZP$`4.,$```:!0"@ -MX000H.'^___K`0"@X_"!O>@&`*#A!Q"@X?[__^L&`*#A!!"@X?[__^L!`*#C -M\(&]Z`4`H.$$$*#A_O__ZP!PH.$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^ -M___K`0!7XQ(```H&`*#A!!"@X?[__^L@-`'CTV"%X0``X.,`$.#C!@"0X`<0 -MH>#S`(7A*#0!X]-@A>$!`*#C`!"@XP8`D.`'$*'@\P"%X0$`H./P@;WH``"@ -MX_"!O>@00"WI_O__ZQ"`O>CP02WI`("@X0%PH.&(0)'EC%#1Y0!@4N(#```: -M`0"@X?[__^L`8%#B\(&]"`<`H.$$$*#A!2"@X?[__^L`0%#B(0``"G!@A.40 -M,);E;#"$Y11`AN5D,)3E#S`#X@$`4^,,```:,##4Y0\`4^,;``"*"`"@X6`0 -ME.4$(*#A_O__ZP!0H.$(`*#A!!"@X?[__^L!`%7C!```&@@`H.$$$*#A_O__ -MZP$`H./P@;WH!P"@X080H.'^___K!P"@X000H.'^___K`0"@X_"!O>@'`*#A -M!A"@X?[__^L``*#C\(&]Z`@`H.$$$*#A_O__Z^G__^H00"WI`""@X5$-@.(8 -M`(#B`!``XP`00./^___K`0"@XQ"`O>@`,*#C(#"!Y2PP@>4(,('E0#"1Y0`` -M4^,X,($5,#"!%30P@17Z/H,2/#"!%1[_+^'P02WI`$"@X0%@H.$0@)#E`#"1 -MY0(#$^,`(*`3`2"@`R<@P.4`()'E4G?@YS=PP.4,$-'E/Q`!XE<0P.4,$);E -M41/@YU@0P.4/.!/B`3"@$R(]$^#P@;T(<%"0Y;`PU>$,$`/B!`!1XWH```K2 -M)^#G`B"7X7<``!H!#!/C`B"@$P`@H`/3-.#G`S""X0,`4^,#\9^7`P``ZF3S -M`@!L\P(`=/,"`'SS`@``4*#C!@``ZA!0A>($``#J"E"%X@(``.H$4(7B```` -MZ@10A>(%`*#AX!"(X@8@H./^___K``!0XUP```IP4)3EL"#5X0$,$N,",*`3 -M`#"@`](DX.<",(/A`0!3XP10A0(!```*$%"%(@10A3(%`*#ARQV(XB$0@>(& -M(*#C_O__ZP!0H.%P,)3EL'#3X00`H.$8$(;B_O__ZP`PH..`,(3E;#"8Y1`` -M$^,:```*5VV(XAA@AN)P4)3EL"#5X0$,$N,",*`3`#"@`](DX.<",(/A`0!3 -MXQ!0A0($```*"E"%,@(``#H"`%/C&%"%$@I0A0(&`*#A!1"@X?[__^L`4%#B -M\(&]"(!0A.4(`*#A!!"@X?[__^OP@;WH_'`'X@``5>,%```:`5"%XH``5^,` -M4*`3`5`%`@``5>/P@;T(;#"8Y6``$^,5```*5VV(XAA@AN)P4)3EL"#5X0$, -M$N,",*`3`#"@`](DX.<",(/A`0!3XQ!0A0($```*"E"%,@(``#H"`%/C&%"% -M$@I0A0(&`*#A!1"@X?[__^L`4%#B@%"$%0@`H.$$$*#A_O__Z_"!O>AP,)3E -ML'#3X?QP!^($`*#A&!"&XO[__^L`4*#C@%"$Y=3__^IP0"WI`&"@X6@U`>,# -M0)#G$EZ$X@8`H.$$$*#A_O__ZTA`A.(%`%3A^?__&F0U`>,#`);G``!0XP$` -M``I)'Z#C_O__ZV`U`>,#,);G``!3XP$```H8`)_E_O__ZU5MAN(8`(;B_O__ -MZPP`AN+^___K<("]Z,`M``#X3RWI`%"@X14,@.(X`(#B`!``XP`00.,%(*#A -M_O__ZU4-A>(L`(#B_O__ZTD/H./^___K9#4!XP,`A><``%#C`+"@`T<```H` -M$*#C22^@X_[__^MD-0'C`T"5YP-`A.(#0,3C:#4!XP-`A>?8<(3B^FZ@XP"` -MH.,$`*#A_O__ZP@`A.+^___K&&"$Y04`H.$$$*#A_O__ZP"P4.($```*"("$ -MY0Q0A.4'`%3A2$"$$O#__QH$(*#C=#4!XP,@A>=5G87B&#")XE@E`>,",(7G -M7"4!XP(PA><`8*#C8#4!XP-@A><,D(GB3#4!XP.0A>=0-0'C`Y"%YU0U`>,# -M8(7GUWV@XZ"!`>,@H*#C!P"5YP@0H.$*(*#A_O__ZP!`4.(-```*!S"5YQ@P -MA.6@()3E@CN@X:,[H.$"/&/B`R""X*`@A.64()3E`S""X)0PA.4)`*#A!!"@ -MX?[__^L!8(;B"`!6X^C__QH+`*#A^(^]Z`1`+>6T-`/C`T"0YP`PH..T-L3E -MM3;$Y;@VA.6\-H3E$`"]Z![_+^%P0"WIM#0#XP-`D.>T-M3E`0!3XP!0H`,? -M```*(1Z@X_[__^L`4*#AZCH.X^HZ3N,#`%#A0#"@`[4VQ`48```*``!0XP4` -M``I<`)_E!1"@X?[__^L(,*#CM3;$Y1```.JU)M3E``!2XP!0H`,$```*.`"? -MY3@0G^7^___KM5;4Y?E0!>(L`)_E)!"?Y04@H.'^___K`#"@X[4VQ.4%`*#A -M<("]Z+4FU.7P___JW"T``.PM```(&@``""X``/!/+>D,T$WB`$"@X;0T`^,# -M8)#G`#"@X[4VQN77/:#C`S"0YY0QD^4((+/E`0`2XP4``!H`4`_A@``,\0`@ -MD^4!((+C`""#Y07P(>$$`*#A_O__ZU&-A.(8@(CB"`"@X?[__^MJ?H;B"'"' -MX@<`H.'^___K`3"@X[0VQN4"(*#CK#(#XP,@A.=L,)3E`0`3XZX```JT-`/C -M`U"4YP0`H.$`$*#C_O__ZP0`H.&D%@#C`""@X_[__^L$`*#A4Q4`XP,@H./^ -M___K`#"5Y0@`$^,(```*!`"@X54>H./^___K$""`XP0`H.%5'J#CH./^___K,""`XP0`H.%5'J#C%]3EH"?4Y9\WU.7^___KY3T"XP,PU.<``%/C&0``"@0`H.$%'*#C -M'",$XR\@0./^___K!`"@X005`.,<)`7C7B!`X_[__^L$`*#A"!4`XR4E"N/^ -M___K!`"@X0P5`.-))0KC_O__Z]`TE.4``%/C%P``&@0`H.$(%0#C(",$X_[_ -M_^L2``#J!`"@X04($#C_O__ -MZP0`H.$(%0#C(",%XQ`@0./^___K!`"@X0P5`.-$)`KC_O__ZQ15`^,$`*#A -M`Q"@XZTNA.($((+B#^"@X07PE.<(((WB`#"@XP$P8N4$`*#A#!"@XP_@H.$% -M\)3GP!G4Y00`H.$#$`'B_O__ZP0`H.$!$*#C_O__ZP0`H.'<%`#CK#0!XP,@ -MU.?^___KU#F4Y0(`4^,$```:!`"@X1H=H./,(*#C_O__ZP,``.H$`*#A&AV@ -MX\\@H./^___KK#G83B*)")X@!0H..PIP'C -M!;"@X0HPE.<#`%7A!0``&@0`H.$)$*#A!2"@X0$PH./^___K!```Z@0`H.$) -M$*#A!2"@X0LPH.'^___K`5"%X@0`5>/N__\:$P``Z@0`4^,"`%,3$```&E<- -MA.(8`(#BX!"$XO[__^L`4%#B"@``"@0`H.$%$*#A`2"@X_[__^L$`*#A7AV$ -MXB@0@>((.`'C`R"4YP`PH./^___K;#"4Y2(]P^-L,(3E`#"@X[0VQN4'`*#A -M_O__ZU$]A.(`8`_A@``,\1Q0L^4!((7C`""#Y0;P(>$!`!7C`0``&@@`H.'^ -M___K`#``XP`P0.,`$)/E40Z$X@@`@.+($('B_O__Z]<]H.,#,)3GE"&3Y0(P -MH.$($+/E`0`1XPD```H`4`_A@``,\0!`D^4!$,3C`!"#Y07P(>$!`!3C`0`` -M"@0`DN7^___K#-"-XO"/O>CP02WI`$"@X<4>H./^___K`%"@X00`H.%8'`#C -M_O__ZP!@H.$$`*#A)!@`X_[__^L`@*#A!`"@X0(;H./^___K`'"@X?]0Q>,` -M-`/C5#E&XP,`5>$0```:_V#&XP`T`^-4.4;C`P!6X0L``!K_@,CC`#``XSDP -M2.,Y"%CC`P!8$04``!K_<,#C`#``XP0S2./!!U?C`P!7$?"!O0@$`*#A_O__ -MZ_"!O>AP0"WI`$"@X;0T`^,#8)#G(1Z@X_[__^L``%#C`0``"@0`H.'^___K -M_O__ZP!0H.&4-`'C`S"4YP``4^-P@+T8N`:6Y04`8.#^___K?0Y0XW"`O9B\ -M!I;E``!0X[Q6A@5P@+T(!0!@X/[__^OZ#E#C<("]F`P`G^7^___K!`"@X?[_ -M_^MP@+WH)"X``!!`+>FT-`/C`T"0YVH.A.((`(#B_O__ZP`PH..T-L3EM3;$ -MY;@VA.6\-H3E$("]Z```@.4$`(#E'O\OX0`PD.4``%/A``"@$P$`H`,>_R_A -M!#"1Y00`@>4*`(#H``"#Y1[_+^$$,(#B"@"`Z`@P@.4>_R_A'O\OX00P@.(! -M(*#C#`"`Z`@P@.4>_R_A'O\OX1[_+^$>_R_A#2"@X7\]PN,_,,/C!""3Y0$@ -M@N($((/E'O\OX0T@H.%_/<+C/S##XP0@D^4!((+B!""#Y1[_+^$00"WI_O__ -MZQ"`O>@00"WI_O__ZQ"`O>@``%'A``"@$P$`H`,>_R_A`#``XP`P0.,``)/E -M'O\OX?H_H..3``/@'R4(X^LA1>.2$X+@H@*@X1[_+^$`,`#C`#!`XP`PD^4# -M,&#@^B^@XY(#`^`?)0CCZR%%XY(3@N"B`J#A'O\OX0$08.#Z/Z#CDP$!X!\U -M"./K,47CDR&#X*,"H.$>_R_A`!"`Y1[_+^$``)#E'O\OX3``+>F?3Y#A`4"$ -MX)1?@.$``#7C^O__&C``O>@>_R_A,``MZ9]/D.$!0$3@E%^`X0``->/Z__\: -M,`"]Z![_+^$P`"WIGT^0X0%`A.*47X#A```UX_K__QHP`+WH'O\OX3``+>F? -M3Y#A`4!$XI1?@.$``#7C^O__&C``O>@>_R_A,``MZ9]/D.$!0(3@E%^`X0`` -M->/Z__\:!`"@X3``O>@>_R_A,``MZ9]/D.$!0$3@E%^`X0``->/Z__\:!`"@ -MX3``O>@>_R_A,``MZ9]/D.$!0(3BE%^`X0``->/Z__\:!`"@X3``O>@>_R_A -M,``MZ9]/D.$!0$3BE%^`X0``->/Z__\:!`"@X3``O>@>_R_A\$,"```:!%"@X0```.H`4.#C!0"@X?"'O>CP1RWI -M`&"@X0&`H.$"<*#A$#"0Y0``4^,8```*##"3Y0``4^,5```*``!2XP!`H-,0 -M``#:(*"`X@!`H.,0P);E!@"@X000B.`'(&3@"C"@X0_@H.$,\)SE`%!0X@,` -M`-H%0(3@!`!7X?/__\H!``#J``!5XP(``!H$4*#A````Z@!0X.,%`*#A\(>] -MZ!!`+>D"0*#A_O__ZP(`H.$#$*#A$("]Z!!`+>D"0*#A_O__ZP$`H.$`$*#C -M$("]Z/!!+>D`<*#A`6"@X0@`H.,!$*#C_O__ZP!04.(%0*`1X&*D%01PA!4% -M`*#A\(&]Z!!`+>D`$*#C_O__ZP``H.,0@+WH<$`MZ0!0H.$!`*#A`A"@X0,@ -MH.'^___K`$"@X0$*<.,`,*"#`#"%A0``H($`0(65``"@DW"`O>@00"WI`"`` -MXP`@0.,`,0#C$#!`XP`@DN4#`%+A!@``"@`@`.,`($#C`#(`XR`P0.,$()+E -M`P!2X0,``!H8`)_E&!"?Y?[__^L0@+WH````XP``0./^___K$("]Z#PN```H -M&@``$$`MZ0`@`.,`($#C`#$`XQ`P0.,`()+E`P!2X08```H`(`#C`"!`XP`R -M`.,@,$#C!""2Y0,`4N$#```:&`"?Y1@0G^7^___K$("]Z````.,``$#C_O__ -MZQ"`O>@\+@``/!H``!!`+>D`(`#C`"!`XP`Q`.,0,$#C`""2Y0,`4N$&```* -M`"``XP`@0.,`,@#C(#!`XP0@DN4#`%+A`P``&A@`G^48$)_E_O__ZQ"`O>@` -M``#C``!`X_[__^L0@+WH/"X``%`:```00"WI````XP``0.,`$*#C`"``XP`@ -M0./^___K$("]Z!!`+>G^___K$("]Z'!`+>D`0%#B<("]"+!5!N-F5D#C!0"@ -MX?[__^L!0%3B^___&G"`O>@00"WI?0Y0XP(``+H!`*#C_O__ZQ"`O>C3/03C -M8C!!XY,@P^#`#Z#A0P-@X`$`@.+^___K$("]Z!!`+>G^___K$("]Z!!`+>ED -M0*#CE``$X-,]!.-B,$'CDR3#X,1/H.%#0V3@``!4XP%`H`,-(*#A?SW"XS\P -MP^,,,)/E`2"@XP`@@^4$`*#A_O__ZQ"`O>@00"WI#2"@X7\]PN,_,,/C!""3 -MY0$@0N($((/E`#"3Y0(`$^,0@+T(_O__ZQ"`O>@00"WI#2"@X7\]PN,_,,/C -M!""3Y0$@0N($((/E`#"3Y0(`$^,0@+T(_O__ZQ"`O>@00"WI_O__ZP$`<.(` -M`*`S$("]Z!!`+>G^___K$("]Z!!`+>D``%+C$("]"/[__^L0@+WH$$`MZ?[_ -M_^L!`'#B``"@,Q"`O>@00"WI_O__ZQ"`O>AP0"WI`$"@X0%@H.'7/:#C`U"0 -MYP``4.,V```*Q#4#XP,`D.<``%#C`P``"O[__^L`(*#CQ#4#XP,@A.?^___K -M``!0XP(``!H%`*#A_O__ZP$``.H%`*#A_O__ZP4`H.'^___KQ#4#XP-0A.<$ -M`*#A_O__ZP!04.(>```*8#"4Y2`P@^(0,H7E8`"4Y2``@.(%$*#A_O__ZP4` -MH.$&$*#A_O__ZT`!E>7+'83B(1"!X@8@H./^___K_O__ZP``4.,#```:!0"@ -MX?[__^L`0*#A`@``Z@4`H.'^___K`$"@X0``5.,#```:!0"@X?[__^L``*#C -M<("]Z```X.-P@+WH$$`MZ?[__^L0@+WH$$`MZ2`0H./^___K$("]Z'!`+>D` -M4*#A_O__ZP!`4.($```*``!5XP(```H$`*#A!1"@X?[__^L$`*#A<("]Z!!` -M+>G^___K$("]Z!!`+>D`0%#B$("]".`"E.4``%#C$("]"/[__^L$`*#A_O__ -MZQ"`O>@00"WI_O__ZQ"`O>AP0"WI`%"@X?[__^L`0%#B!```"@``5>,"```* -M!`"@X040H.'^___K!`"@X7"`O>CP02WI`$"@X0@`H.,!$*#C_O__ZP!@4.(1 -M```*+GZ&X@0`H.'^___K`%"@X0"`H.$``%#C`P``"@``5.,!```*!!"@X?[_ -M_^L`@(?E``!5XP1`AQ4"```:!@"@X?[__^L`8*#C!@"@X?"!O>@$0"WEX$*0 -MY2`T`>,#()3GT#4#XP,@A.?H-`'C`R"4Y\PU`^,#((3G*#0!XP,@E.?H-0/C -M`R"$Y_`T`>,#()3GY#4#XP,@A.<8-`'C`R"4Y]@U`^,#((3GX#0!XP,@E.?4 -M-0/C`R"$Y]<-A.(,`(#B$`"]Z![_+^%P0"WIX$*0Y64R`^,#,-3G`0!3XP4` -M`!JH,@/C`S"4YP(`4^,!(*`#I#(#`P,@A`H,@/C`S"4 -MYP``4^,2```:``!0XPD```J4,9#E"""SY0$`$N,%```:`%`/X8``#/$`()/E -M`2""XP`@@^4%\"'AK#0#XP,PE.<``%/C`@``"@0`H.$'$*#C,_\OX0``H.-P -M@+WH$$`MZ0!`H.'P-`/C#^"@X0/PD.<`,*#C428#XP(PQ.=2)@/C`C#$YU,F -M`^,",,3G'B"@XU@DA.4!(*#C2B7$Y:`B`^,",(3GJ"(#XP(PA.=F(@/C`C#$ -MYP``H.,`$*#C("0!X_(`A.'H)`'C\@"$X1`UQ.5L,)3E(CW#XVPPA.5T-0/C -M`S"4YP``4^,!```*!`"@X3/_+^$`,*#CG"(#XP(PQ.>(.83E`#``XP`P0.,` -M,)/EN"4!XP(@E.=D$*#CD0(!X-,M!.-B($'CD@&!X%8-A.((`(#B(1.#X/[_ -M_^L!`*#C$("]Z!!`+>D`0*#A````XP``0.,`$`#C`!!`X_[__^L$`*#A,!"@ -MXP`@H.,4-0/C#^"@X0/PE.>\-0/C`S"4YP``4^,!```*!`"@X3/_+^&,-0/C -M`S"4YP``4^,0@+T8!`"@X?[__^L0@+WH<$`MZ0!`H.'7/:#C`U"0YWD.@.+^ -M___K2PV$X@@`@.+^___K$PR$XA``@.+^___K;`"$XO[__^M.#83B.`"`XO[_ -M_^M7#83B&`"`XO[__^M2#83B.`"`XO[__^L$`*#A_O__ZP0`H.'3/:#C#^"@ -MX0/PE.?$-0/C`P"4YP``4.,#```*_O__ZP`@H./$-0/C`R"$YP``5>,!```* -M!0"@X?[__^L!`*#C<("]Z!!`+>D`0*#A10Z`X@P`@.+^___K20Z$XO[__^M1 -M#H3B"`"`XO[__^L$`*#A_O__Z\D-A.(H`(#B_O__ZU8-A.((`(#B_O__ZP0` -MH.'H-`/C#^"@X0/PE.<0@+WH<$`MZ0!`H.%&.@+C`R#0YQ0T`>,#(,#G1SH" -MXP,PT.<5)`'C`C#`YQ8D`>,",,#G2CH"X[,@D.$,-`'C`R"`YQXPH.-8-(#E -M`6"@XTIEP.4`4*#CU%2`Y1L\H.,#4,#G6#H"XP,@T.<$.P'C`R"`YUDZ`N,# -M(-#G"#L!XP,@@.>H-P'C`U"`YZPW`>,#4(#GL#,#8(#G$#L!XP-0@.<4.P'C`V"`Y_[__^L$`*#A_O__ZP0`H.'P-`/C#^"@ -MX0/PE.=1-@/C`U#$YU(V`^,#4,3G4S8#XP-0Q.<&`*#A<("]Z'!`+>D`0*#A -M2PV`X@@`@.+^___K``!0XT````H,,P'C`T"$YQ,,A.(0`(#B_O__ZP``4.,Y -M```*!`"@X?[__^L``%#C-0``"@0`H.'^___K``!0XS$```I.#83B.`"`X@00 -MH.'^___K``!0XP,``!JT`)_E_O__ZP!0H.,H``#J4@V$XC@`@.($$*#A_O__ -MZP``4.,#```:D`"?Y?[__^L`4*#C'@``ZEX-A.(H`(#B`!"@XW`B`>/^___K -M5PV$XA@`@.+^___K``!0XP,``!I<`)_E_O__ZP!0H.,0``#J_#8!XP-`A.<$ -M`*#A_O__ZP0`H.'^___K!`"@X?[__^L`4*#A!`"@X?[__^L$`*#A_O__ZP0` -MH.'^___K````Z@!0H.,%`*#A<("]Z(`N``"<+@``N"X``!!`+>D`0*#A2PV` -MX@@`@.+^___KH#4#XP,PE.<``%/C$("]"$L-A.(4`(#B_O__ZQ"`O>@00"WI -M`$"@X0```.,``$#C!!"@X08LH./^___KH#4#XP,`A.<``.#AH`^@X1"`O>@0 -M0"WIX$*0Y<@U`^,#,)3G``!3XP0``!K+#83B(0"`X@(0@>(&(*#C_O__ZP`` -MH.,0@+WH\$$MZ0`04.(#```*6`8#X_[__^L`0*#A`@``ZE@&`^/^___K`$"@ -MX0``5..A```*X&*4Y=<]H.,#0(;G?`*?Y?[__^MX,I_EM#"$Y4L_H..L,83E -M;#*?Y:PPA.5H4#(,;G`3"#X@@@E>4#(,;G!#"#X@P@E>4#(,;G`3"# -MXA`@E>4#(,;G`3"#XK0AU>&S((;A`C"#XK@AU>&S((;A!3!#XAP@E>4#(,;G -M`C!#XB`@E>4#(,;G"3"#XB0@E>4#(,;G`3"#X@P@E^4#(,;G`3"#XA`@E^4# -M(,;G`3"#XA0@E^4#(,;G"S!#XB@@E>4#(,;G#3"#XBP@E>4#(,;G`3"#XC`@ -ME>4#(,;G`C"#XK0CU>&S((;A`C"#XA@@E^4#(,;G`3"#XAP@E^4#(,;G`3"# -MXB`@E^4#(,;G`3"#XB0@E^4#(,;G`3"#XC@@E>4#(,;G`3"#XB@@E^4#(,;G -M`3"#XBP@E^4#(,;G`3"#XC`@E^4#(,;G`3"#XC0@E^4#(,;G`3"#XC@@E^4# -M(,;G`3"#XCP@E^4#(,;G#CV#XCP@E>4#(,;G`3"#XD`@E>4#(,;G`3"#XD0@ -ME>4#(,;G`3"#XD@@E>4#(,;G`3"#XD`@E^4#(,;G`3"#XD0@E^4#(,;G`3"# -MXDP@E>4#(,;G`3"#XE`@E>4#(,;G`3"#XE0@E>4#(,;G`3"#XE@@E>4#(,;G -M`3"#XEP@E>4#(,;G`3"#XF`@E>4#(,;G`C"#XF0@E>4#(,;G`3"#XD@@E^4# -M(,;G3'"7Y0$P@^(#<,;G:%"5Y0$P@^(#4,;G!`"@X?"!O>C4+@``?!H````` -M``"H-P``L$L!`/PN```00"WI`$"@X?[__^L$`*#A_O__ZP``H.,0@+WH<$`M -MZ0!0H.'@8I#E2#8#XP-`EN<`(*#C`R"&YP(`5.%P@+T(````XP``0.,$$*#A -M_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K````XP``0.,$ -M$*#A_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K````XP`` -M0.,$$*#A_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K```` -MXP``0.,$$*#A_O__ZP```.,``$#C!!"@X?[__^L```#C``!`XP00H.'^___K -M````XP``0.,$$*#A_O__ZP```.,``$#C!!"@X?[__^L`0`#C`$!`XP4`H.%0 -M$)3E_O__ZU10E.4!4$7B5%"$Y0``5>-P@+T84!"4Y0``4>-P@+T(````XP`` -M0./^___K`$``XP!`0.,`,`#C`#!`XU@`A.(<$)/E_O__ZP`PH.-0,(3E<("] -MZ/!!+>D`0*#AX&*0Y0`P`.,`,$#C4%"3Y0``5>,M```:M#'6X0(`4^,%```: -MW`2?Y0`0`.,`$$#C"2"@X_[__^L&``#J`P!3XP0``!J\!)_E`!``XP`00.,) -M(*#C_O__ZP!0`.,`4$#C`#``XP`P0.-8`(7B`1F@XQP@D^7^___K`""@X5`` -MA>4``%#C`@``&GP$G^7^___K\(&]Z````.,``$#C)!$(X_[__^L`4%#B!``` -M"@`P`.,`,$#C.#"%Y31`A>4#``#J````XP``0./^___K\(&]Z$@V`^,#,);G -M``!3X_"!O1@`,`#C`#!`XP0`H.%M$03C4""3Y?[__^L`<*#A2#8#XP,`AN<` -M`%#C$```&OPSG^540)/E``!4XPD``!I00)/E``!4XP8```H#0*#A6`"#XMPS -MG^4<$)/E_O__ZP`PH.-0,(3ES`.?Y?[__^OP@;WH`#``XP`P0.-44)/E`5"% -MXE10@^4```#C``!`XR01".,'(*#A_O__ZP!04.(.```*`#``XP`P0.,X,(7E -M-$"%Y0`P`.,`,$#C/#"%Y0```.,``$#C)!$(XP<@H.'^___K`%!0X@0``!H2 -M``#J````XP``0./^___K\(&]Z``P`.,`,$#C.#"%Y31`A>4`,`#C`#!`XSPP -MA>4```#C``!`XR01".,'(*#A_O__ZP!04.($```:#P``Z@```.,``$#C_O__ -MZ_"!O>@`,`#C`#!`XS@PA>4T0(7E````XP``0.,D$0CC!R"@X?[__^L`4%#B -M!```&@\``.H```#C``!`X_[__^OP@;WH`#``XP`P0.,X,(7E-$"%Y0```.,` -M`$#C)!$(XP<@H.'^___K`%!0X@0``!H/``#J````XP``0./^___K\(&]Z``P -M`.,`,$#C.#"%Y31`A>4```#C``!`XR01".,'(*#A_O__ZP!04.($```:#P`` -MZ@```.,``$#C_O__Z_"!O>@`,`#C`#!`XS@PA>4T0(7E````XP``0.,D$0CC -M!R"@X?[__^L`4%#B!```&@\``.H```#C``!`X_[__^OP@;WH`#``XP`P0.,X -M,(7E-$"%Y0```.,``$#C)!$(XP<@H.'^___K`%!0X@0``!H/``#J````XP`` -M0./^___K\(&]Z``P`.,`,$#C.#"%Y31`A>4```#C``!`XR01".,'(*#A_O__ -MZP!04.($```:#P``Z@```.,``$#C_O__Z_"!O>@`,`#C`#!`XS@PA>4T0(7E -M````XP``0.,D$0CC!R"@X?[__^L`4%#B!```&@\``.H```#C``!`X_[__^OP -M@;WH`#``XP`P0.,X,(7E-$"%Y0```.,``$#C)!$(XP<@H.'^___K`%!0X@0` -M`!H/``#J````XP``0./^___K\(&]Z``P`.,`,$#C.#"%Y31`A>4```#C``!` -MXR01".,'(*#A_O__ZP!04.($```:#P``Z@```.,``$#C_O__Z_"!O>@`,`#C -M`#!`XS@PA>4T0(7E````XP``0.,D$0CC!R"@X?[__^L`4%#B!```&@\``.H` -M``#C``!`X_[__^OP@;WH`#``XP`P0.,X,(7E-$"%Y0```.,``$#C)!$(XP<@ -MH.'^___K`%!0X@0``!H+``#J````XP``0./^___K\(&]Z``P`.,`,$#C.#"% -MY31`A>4`,`#C`#!`XSPPA>7P@;WH````XP``0./^___K\(&]Z``X``#0+P`` -MJ#<````````<,```,$`MZ1303>(`4*#AX$*0Y:0R`^,#,)3G`0!3XP``H`-, -M-@,#`P"$!W8```K(-0/C`S"4YP``4^,H```:B"4#XP(PA.>,)0/C`C"$YY`E -M`^,",(3G!`"@X?[__^L``%#C6P``"D`!E>4`$-#E`2#0Y0(PT.4#P-#E`,"- -MY03`T.4$P(WE!0#0Y0@`C>5\`9_E_O__ZP0`H.'^___K``!0XTL```H$`*#A -M_O__ZP``4.-'```*N#4#XP,PE.<``%/C`0``"@0`H.$S_R_A!0"@X?[__^L! -M(*#CR#4#XP,@A.<`(*#C3#8#XP,@A.<`,`#C`#!`XP`0D^51#H3B"`"`XL@0 -M@>+^___K6#(#XP,PU.<``%/C`P``&K(R`^,#,-3G``!3XQ````H`(*#CH#(# -MXP,@A.<`,`#C`#!`XP`PD^68(@/C`B"4YV00H..1`@'@TRT$XV(@0>.2`8'@ -MR0V$XB@`@.(A$X/@_O__ZY0AE>4",*#A"!"SY0$`$>,'```:`$`/X8``#/$` -M()/E`2#"XP`@@^4$\"'A``"@XQD``.H`4`_A@``,\0!`D^4!$,3C`!"#Y07P -M(>$!`!3C``"@`Q````H$`)+E_O__ZP``H.,,``#J`""@X\@U`^,#((3G!0"@ -MX?[__^N4,97E`$`/X8``#/$((+/E`2""XP`@@^4$\"'A``#@XQ30C>(P@+WH -M0#```!!`+>D``%'C`0``"G;__^L`0*#A!`"@X1"`O>@00"WIQ#0#XP,PD.<` -M`%/C$("]"#/_+^$0@+WH$$`MZ?[__^L```#C``!`XP`PH.-L,(#E_O__Z_[_ -M_^L0@+WH$$`MZ?[__^L0@+WH$$`MZ0!`H.'(-0/C`S"0YP$`4^,0@+T8`2"@ -MXX@U`^,#((#GO#4#XP,PD.<``%/C````"C/_+^%E,@/C`S#4YP``4^,!```: -M!`"@X?[__^N,-0/C`S"4YP``4^,$```:!`"@X?[__^L!(*#CC#4#XP,@A.<` -M(*#CR#4#XP,@A.<0@+WH<$`MZ2#03>(@`(#B_O__ZP!0H.'@0I#ER#4#XP,P -ME.<``%/C4P``"H@U`^,#,)3G``!3XT\``!J,-0/C`S"4YP``4^-+```:-`&? -MY?[__^L``%3C0P``"@$@H.-F,@/C`R#$YP0`H.'^___K!`"@X?[__^O';83B -M-&"&X@8`H.'^___K``!5XP@```H%`*#A_O__ZY0QE>4`4`_A@``,\0@@L^4! -M((+C`""#Y07P(>$$`*#A`!"@X_[__^ML,)3E"``3XQ@```H!`!/C%@``"N`P -MU.4`,(WEX3#4Y00PC>7B,-3E"#"-Y>,PU.4,,(WEY##4Y1`PC>7E,-3E%#"- -MY>@PE.48,(WEE#"4Y1PPC>5P`)_E!T``/0P```H,0``\$$MZ0!0H.$@<(#B!P"@X?[__^L`8*#AX$*0 -MY0<`H.$`$*#C_O__ZP``5.,X```*!`"@X?[__^ML,)3E`0`3XP(```H$`*#A -M`!"@X_[__^L`,`#C`#!`XVPPD^4!`%/C`2"@`XPU`P,#((0'`#"4Y0$`4^,% -M```*``!6XP,```H&`*#A_O__ZP8`H.'^___K!`"@X?[__^L$`*#A4/__ZR$P -MU.4"`%/C`6"@$P,``!H@8-3E`0!6XP!@H!,!8*`#M#4#XP,PE.<``%/C`0`` -M"@0`H.$S_R_A!`"@X?[__^L@`)7E:`!`XO[__^L!`%;C!0``&B``E>5H`$#B -M&#"0Y0``4^,````*_O__Z_[__^OP@;WH(`"5Y6@`0.+^___K^?__ZA!`+>D` -M0*#AR#0#XP,PD.<``%/C````"C/_+^$$`*#A_O__ZQ"`O>@00"WI````XP`` -M0.,`$`#C`!!`X_[__^O^___K_O__ZP```.,``$#C`!``XP`00./^___K_O__ -MZP```.,``$#C`3"@XVPP@.4`$*#C`"``XP`@0./^___K$("]Z!!`+>G^___K -M$("]Z'!`+>D`0*#A````XP``0./^___K``!4XRL```H@`(3B_O__ZP!@H.'@ -M0I#E``!4XR4```K'783B-%"%X@4`H.'^___K!`"@X?[__^L`(*#CLS(#XP,@ -MQ.<&`*#A`1"@X_[__^L``%#C%P``&@8`H.'^___K!@"@X?[__^L%`*#A_O__ -MZP@0E.4``%'C!@``"DP`G^7^___K"`"4Y?[__^L,$*#C`2"@X_[__^L$`*#A -M`!"@X_[__^L```#C``!`X_[__^L``*#C<("]Z````.,``$#C#!"?Y?[__^L` -M`.#C<("]Z!`R``"$'0``<$`MZ0!0H.$@`(#B_O__Z^!"D.5E,@/C`S#4YP`` -M4^,#```*!0"@X?[__^L`0*#A"P``ZM0R`^,#,)3G``!3XP0```H!(*#CW#(# -MXP,@Q.<`0*#C`@``Z@4`H.'^___K`$"@X00`H.%P@+WH\$$MZ0!`H.%@`)#E -M(`"`XO[__^L``%3C.```"@!0H.'';83B-&"&X@8`H.'^___K`2"@XZ`R`^,# -M((3G!`"@X?[__^L%`*#A`!"@X_[__^L``%#C`@``"@8`H.'^___K)@``Z@4` -MH.'^___K!0"@X?[__^N4(97E`C"@X0@0L^4!`!'C!@``&@!0#^&```SQ`""3 -MY0$@PN,`((/E!?`AX0D``.H`<`_A@``,\0!0D^4!$,7C`!"#Y0?P(>$!`!7C -M`0``"@0`DN7^___K`%"@X[,R`^,#4,3GM#(#XP-0Q.>H,@/C`U"$YZ`R`^,# -M4(3G!@"@X?[__^L%`*#A\(&]Z`P`G^4,$)_E_O__ZP``X./P@;WH3#(``)@= -M``!P0"WI`$"@X6``D.4@`(#B_O__Z\@U`^,#,)3G``!3XT<```J(-0/C`S"4 -MYP``4^-#```:C#4#XP,PE.<``%/C/P``&@``5.,]```*`&"@X00`H.'^___K -M````XP``0./^___KQUV$XC10A>(%`*#A_O__ZP$@H..@,@/C`R"$YP``5N,( -M```*!@"@X?[__^N4,9;E`&`/X8``#/$((+/E`2""XP`@@^4&\"'A!`"@X0`0 -MH./^___K;#"4Y0$`$^,.```*`3##XVPPA.6L-`/C`S"4YP``4^,"```*!`"@ -MX0,0H.,S_R_A!`"@X?[__^L$`*#A`Q"@XP`@H./^___K!`"@X?[__^L$`*#A -M`1"@X_[__^L$`*#A_O__ZP(@H..H,@/C`R"$YP!@H..@,@/C`V"$YP4`H.'^ -M___K!@"@X7"`O>@```#C``!`XP@0G^7^___K``#@XW"`O>BH'0``$$`MZ5PP -MD.4``%/C`@``"E@`D.4.$0#C_O__ZP$`H.,0@+WH$$`MZ?[__^L0@+WH\$``#K`0!0 -MXS@``!H$`*#A_O__ZP0`H.'^___K``!0XS(```IG,@/C`S#4YP``4^,)```* -M9#"4Y(%`*#A_O__ZT`!E^4%$*#A!B"@X_[_ -M_^L'`*#A_O__ZP``4.,3```:`#``XP`P0.,($)/E``!1XP$```IH`)_E_O__ -MZ_[__^L``*#C\(>]Z"``MN5H`$#B_O__ZP8`H.$`$*#C_O__ZP``H.-I___K -M$@#@X_"'O>@@`);E:`!`XO[__^L(`*#A`!"@X_[__^L$`*#A7___ZP<`H.'^ -M___K$@#@X_"'O>BX'0``J#(``'!`+>D`0*#A3`"`XO[__^L.`0#C_O__ZU@` -MA.4``%#C!0``&@!0H.-84(3E(`"?Y?[__^L%0*#A`P``Z@\`@.(/`,#C7`"$ -MY0%`H.,$`*#A<("]Z+@R``#P02WI`$"@X62`D.4<`(3E`#"@XR0PP.4E,,#E -M`#``XP`P0.,`4)/E`'"5Y2@QF.4$,-/E(3#`Y0(PU^4@,,#E!!#7Y2(0P.4` -M`%'C(P``V@`@H.$`,*#C`U"@X0Q@E^4#8);@&```"@,`UN4#``#B`@!0XT(` -M`!K2P-;A``!(!4*`30`"$ -MX@`0H./^___K!`"@X?[__^L$`*#A_O__ZV@`A.(`$*#C_O__ZP4`H.'P@;WH -M`P!0X\'__PH"`%#CRO__&L3__^HP,$#B_R^103!`XG,P[^8%`%/C``#@@S<`0)(>_R_A``"@XQ[_ -M+^'@,I#E;#"3Y0@`$^,",*`3`#""%0L``!I``!/C`0``&B``$^,"```*`3"@ -MXP`P@N4$``#J$``3XP,PH!,`,((5`#"@`P`P@@4``*#C'O\OX01`+>7@0I#E -M;#"4Y0$`$^,&```*>C4!X],PE.$`,&/B`#""Y0`PH.,$,,+E!```Z@`PH.,` -M,(+E!##"Y0$PH.,%,,+E``"@XQ``O>@>_R_A`##0Y0``4^,(```*`0!3X0,` -M`!H(``#J#`"`X@$`4^$%```*###0Y0``4^/Y__\:``!3X@$`H!,>_R_A`0"@ -MXQ[_+^'@$I#E2#H"X[,PD>$`,(+E``"@XP0`PN4>_R_A!$`MY>!"D.4%,-+E -M``!3XP0```HJ*0#C##0!XP,@A.<``*#C"```Z@`PDN4!'$/B*B@`XP(`4>$5 -M`."#`3##DPPD`9,",(27``"@DQ``O>@>_R_AX!*0Y0PT`>,#,)'G`#""Y0`` -MH.,$`,+E'O\OX0_R_A``#@XQ[_+^$` -M`*#C'O\OX0``H.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A``"@XQ[_ -M+^$``*#C'O\OX0``H.,>_R_A!$`MY>!"D.5L,)3E`0`3XP<``!H`,*#C*B8# -MXP(PQ.,#$-3G?C4!XP,@U.=Z-0'C -MTP"4X2LV`^,#`,3G*C8#XP,0Q.G@ -M0I#E`S`!X@,`4^,,```:S`"?Y?[__^L`,*#C%"L!XP(PA.<"$*#C!"!"X@(0 -MA.,+```*E`"?Y?[__^L`,*#C%"L! -MXP(PA.,$ -M```*````XP``0./^___K`$"@XP,``.H```#C``!`X_[__^L50.#C!`"@X1"` -MO>A8,P``J#,``/!/+>DPH.$` -M,*#CB`&-Z06`H.$&<*#A!&"@X0-`H.$&`*#A"!"@X00@H.$`,.#C3,4#XP_@ -MH.$,\);G`%"@X!2D.4%`*#A!@"3Z/\_#^,/,$#C3,4#XP_@ -MH.$,\)7G`%"@X00`H.$`$`#C`!!`XP4@H.'^___K``"@XW"`O>CP3RWIJ]]- -MX@)PH.$#@*#AX**0Y6H]#^/_/T_C`$"@XZHOC>*S0(+A:#T/X_\_3^.S0(+A -MB@^-X@00H.&`(*#C_O__ZR@`C>($$*#A`BR@X_[__^L`$)?EMX0W`H.%_ -M/480(WE'$"-Y22`C>7@!I_EX!:?Y0@@H.'^___K!%"@X21@C>+0EI_E -M%+"-X@,``.H,`%7C!@``"@5`B^<$4(7B!@"@X0D0H.'^___K`$!0XO;__QH8 -M4)WE``!5XZ$!``H(%0(+@>$!$X@@``.H*`*#A`1!4Y?[__^L(`*#A -M"1"@X0@@H.$!,%3E_O__ZP%@AN(!0(3B$`!6X_/__QIX!9_E_O__ZP@`H.%P -M%9_E"""@X?[__^L04(7B@`!5X\K__QI4!9_E_O__ZP@`H.'^___KM`#'X0`` -MH.,^`0#J!`"@X3P5G^7^___K``!0XU@``!H@0(WB!0"@X000H.$0(*#C_O__ -MZW!@_^8&L*#A%`6?Y080H.'^___K"0"@X000H.$*(*#C_O__ZW!0_^8``%7C -M)P$`"@Q0C>7L!)_E!1"@X?[__^MJ30_C_T]/XP`0H.,`$(WE"@"@X0,@H..J -MSXWB!#",X/[__^L&L(7@JB^-XK1`DN$$`%OA`P``VJP$G^7^___K#0#@XQ(! -M`.H*`*#A!A"@X04@H.&*/XWB_O__ZP``4.,"```:A`2?Y?[__^L!``#J?`2? -MY?[__^L(`*#A`!"@XP0@H./^___K`$"@XV1DG^6*7XWB8*2?Y6"4G^5@M)_E -M#@``Z@8`H.$$$-7G_O__ZP@`H.$*$*#A"""@X00PU>?^___K"0"@X?[__^L( -M`*#A"Q"@X0@@H.'^___K`4"$X@PPG>4#`%3A[?__N@@`H.'^___K`0"`XK0` -MQ^$$!)_E"!"@X?[__^L``*#CX```Z@0`H.'P$Y_E_O__ZP``4.,]```:*#"- -MX@`PC>4*`*#A`!"@XP$@H.$"/*#C_O__ZP``4.,#```:>`.?Y?[__^L-`.#C -MS@``ZK`#G^7^___K"`"@X0`0H.,$(*#C_O__ZP!`H.,H4(WB4&.?Y5"CG^6, -MDY_EC+.?Y0```.,``$#C!!#5Y_[__^L(`*#A`!``XP`00.,((*#A!##5Y_[_ -M_^L/,`3B#P!3XP8``!H)`*#A_O__ZP@`H.$+$*#A"""@X?[__^L(``#J!S`$ -MX@<`4^,%```:!@"@X?[__^L(`*#A"A"@X0@@H.'^___K`4"$X@(,5./?__\: -M"`"@X?[__^NT`,?A``"@XYT``.H$`*#A]!*?Y?[__^L``%#C/```&FI-#^/_ -M3T_C`!"@XP`0C>4*`*#A`R"@XZK/C>($,(S@_O__ZZHOC>*T0)+A%0!4XP,` -M`,J``I_E_O__ZPT`X..'``#J"@"@X180H.,&(*#CBC^-XO[__^L``%#C`@`` -M&E@"G^7^___K`0``ZE`"G^7^___K"`"@X0`0H.,$(*#C_O__ZP!`H.,X8I_E -MBE^-XC2BG^4TDI_E-+*?Y08`H.$$$-7G_O__ZP@`H.$*$*#A"""@X00PU>?^ -M___K"0"@X?[__^L(`*#A"Q"@X0@@H.'^___K`4"$X@8`5./N__\:"`"@X?[_ -M_^NT`,?A``"@XUL``.H$`*#A\!&?Y?[__^L``%#C/```&FI-#^/_3T_C`!"@ -MXP`0C>4*`*#A`R"@XZK/C>($,(S@_O__ZZHOC>*T0)+A"0!4XP,``,IX`9_E -M_O__ZPT`X.-%``#J"@"@X0H0H.,$(*#CBC^-XO[__^L``%#C`@``&E`!G^7^ -M___K`0``ZD@!G^7^___K"`"@X0`0H.,$(*#C_O__ZP!`H.,P89_EBE^-XBRA -MG^4LD9_E++&?Y08`H.$$$-7G_O__ZP@`H.$*$*#A"""@X00PU>?^___K"0"@ -MX?[__^L(`*#A"Q"@X0@@H.'^___K`4"$X@0`5./N__\:"`"@X?[__^NT`,?A -M``"@XQD``.H$`*#A[!"?Y?[__^L``%#C``"@$Q,``!H*`*#A$!"-XO[__^L* -M`*#A_O__ZV@]#^/_/T_CJL^-XK-`G.$`,&3@"`"@X;`0G^4((*#A_O__ZP@` -MH.'^___KM`#'X0``H.,```#J%0#@XZO?C>+PC[WH;#0``/@=``!X-```?#0` -M`(0T``"8-```L#0``,0T``#L-```!#4```PU``#,-```^#0``!0U```8-0`` -M8#0``!PU```@-0``*#4``#0U``!`-0``8#4``'PU``"4-0``G#4``*@U``"L -M-0``L#4``+PU``#$-0``]#4``/@U````-@``!#8```PV```4-@``\$$MZ0C0 -M3>(#@*#AX'*0Y0)@H.$`,*#C!#"-Y0`0DN4-(*#A?SW"XS\PP^,(0)/E!%"1 -MX@10U3``0*`S``!4XP,``!H$`(WB!""@X_[__^L"``#J!`"-X@00H./^___K -MB#4#XP,PE^+@HI#E`$"@XPQ`C>400(WE%$"-Y6HM#^/_+T_C*AZ-XK)` -M@>$<,(WE````XP``0.-`%)_E`R"@X?[__^L<8(WB`'``XP!P0.,,@(WB`P`` -MZ@P`5.,&```*!%"(YP1`A.(&`*#A!Q"@X?[__^L`4%#B]O__&A!`G>4``%3C -M^```"A1@G>4``%;C]0``"@Q0G>4%`*#A`!``XP`00./^___K``!0XST``!H$ -M`*#A&!"-XA`@H./^___K<(#OYK@#G^4($*#A_O__ZP8`H.'^___KH'"PX>0` -M``J@`Y_E!Q"@X?[__^N8`Y_E!A"@X?[__^L`4*#C(DZ-X@0``.H"`%;E`1!6 -MY?[__^L%`,3G`5"%X@)@AN('`%7A]___.FI-#^/_3T_C`!"@XP`0C>4*`*#A -M`R"@XRK.C>($,(S@_O__ZP+^___K``!0XP,``!H$`Y_E_O__ZPT` -MX..W``#J^`*?Y?[__^L``*#CLP``Z@4`H.$`$`#C`!!`X_[__^L``%#C+0`` -M&@0`H.$8$(WB$""@X_[__^MP@._FJ`*?Y0@0H.'^___K!@"@X?[__^N@<+#A -MH```"J0"G^4'$*#A_O__ZX@"G^4&$*#A_O__ZP!0H.,@0(WB!```Z@(`5N4! -M$%;E_O__ZP4`Q.'W__\Z(#"-X@`PC>4*`*#A`1"@XP@@ -MH.%W,/_F_O__ZP``4.,#```:0`*?Y?[__^L-`.#C@P``ZC0"G^7^___K``"@ -MXW\``.H%`*#A`!``XP`00./^___K``!0XSL``!H$`*#A_O__ZZ!PL.%T```* -M!@!7XP0``)KX`9_E!!"@X?[__^L-`.#C;@``Z@```.,``$#C!!"@X?[__^L$ -M4*#A`&"@XR).C>(``-7E`1#5Y?[__^L&`,3G`6"&X@)0A>(&`%?A]___BFI- -M#^/_3T_C`!"@XP`0C>4*`*#A`R"@XRK.C>($,(S@_O__ZQ8PA^(J'HWBM$"1 -MX00`4^$#``":6`&?Y?[__^L-`.#C30``Z@H`H.$6$*#C=R#_YB(^C>+^___K -M``!0XP,``!HP`9_E_O__ZPT`X.-"``#J````XP``0./^___K``"@XST``.H% -M`*#A`!``XP`00./^___K``!0XP``H!,V```:!`"@X?[__^N@<+#A,0``"M@` -MG^4$$*#A_O__ZP10H.$`8*#C(DZ-X@0``.H"`%7E`1!5Y?[__^L&`,3G`6"& -MX@)0A>('`%;A]___.FI-#^/_3T_C`!"@XP`0C>4*`*#A`R"@XRK.C>($,(S@ -M_O__ZPHPA^(J'HWBM$"1X00`4^$#``"::`"?Y?[__^L-`.#C$0``Z@H`H.$* -M$*#C=R#_YB(^C>+^___K``!0XP,``!I``)_E_O__ZPT`X.,&``#J-`"?Y?[_ -M_^L``*#C`@``ZA4`X.,```#J#0#@XZG?C>+PA;WH'!X``"@U```T-0``5#8` -M`&@V``!\-@``F#8``+PV``#,-```Q#4``,PV``#P0"WI%-!-X@)`H.'@8I#E -M````XP``0..T$9_E_O__ZP`P`.,`,$#C`%#3Y0``5>,(```:`U"@X0`P`.,` -M,$#C!0"@X0`0D^40(*#C_O__ZP`PH.,/,,7EM##4X1``4^-7``"*`!"4Y0T@ -MH.%_/<+C/S##XPA0D^400)'B!4#4,`!0H#,``%7C!0``&@T`H.$0(*#C_O__ -MZP``4.-(```:!```Z@T`H.$0$*#C_O__ZPU`X.-#``#J&`&?Y1`1G^44(9_E -M#3"@X?[__^L&`*#A#1"@X?[__^L`0%#B.0``&O@`G^7^___K[`"?Y?`0G^4) -M(*#C_O__ZP$`4.,(```:U%"?Y1!PU>6H-`/C`W#&YP8`H.'^___K$5#5Y54R -M`^,#4,;GL%"?Y0UPH.$%`*#A#1"@X1`@H./^___K`#"@XP\PQ>4-`*#AE!"? -MY0D@H./^___K`0!0XQH``!J$`)_E;!"?Y?[__^L&`*#A`1"@X_[__^NL-`/C -M`S"6YP``4^,"```*!@"@X0<0H.,S_R_A1%"?Y:@T`^,#(-;G$"#%Y0!PH.,# -M<,;G!@"@X?[__^M5,@/C`R#6YQ$@Q>4#<,;G````Z@U`X.,$`*#A%-"-XO"` -MO>@P'@```#<``"@X```D-P``0#<``$PW``!P0"WI"-!-X@!@H.$"4*#A`T"@ -MX0```.,``$#C5!&?Y0,@H.'^___K!`"@X0`0`.,`$$#C!""@X_[__^L``%#C -M*```"K0PU>$$,$/B$$0(3BX%*6Y0$P0^(!`%/C`P``"@(`4^,` -M0*`3"```&@,``.H`0-3E,$!$XG1`[^8#``#J``#4Y0$0U.7^___K`$"@X0H` -M5.,R``"*6#(#XP,PU><$`%/A+@``"@``5.,"(*`35S(#$P,@Q1<@``#J!`"@X0`0`.,`$$#C -M!""@X_[__^L``%#C&0``"K0PU>$$,$/BM##%X>!2EN4(((WB`#"@XP0P(N4$ -M`(3B`!``XP`00./^___K!#"=Y0$`4^,+``"*52(#XP(PQ><$0)WE``!4XP`@ -M`.,`($#C`#``XP`P0.,#(*`1%`"?Y100G^7^___K``"@XPC0C>)P@+WH1!X` -M`)@W``!0'@``<$`MZ0-`H.'@`I#E`!"3Y?[__^L`4*#A!`"@X0`0`.,`$$#C -M!2"@X?[__^L``*#C<("]Z/!'+>D`8*#A````XP``0./^___K`4"@XP);H.,` -M@`#C`(!`XP!P`.,`<$#C`*``XP"@0./$/Z#A(S^@X0,@A.`#(`+B`C!CX`$` -M4^,"```:"`"@X040H.'^___K!@"@X040H.'^___K`!"@X0<`H.'^___K`P`4 -MXP$``!H*`*#A_O__ZP10A>("#%3C\(>]"`%`A.+F___J\$G@`I#E!@"3Z/[__^L``*#C$("]Z/!/+>DLT$WBX'*0Y0!`DN5T8/_F5%CG -MYP0PDN4D,(WE)$R@X7!`1.(/`%3C!/&?E_T"`.H4/P,`F#\#`$Q``P!\0`,` -MQ$`#`/Q``P!400,`S$H#`,Q*`P#,2@,`S$H#`,Q*`P#,2@,`S$H#`,Q*`P"4 -M00,``@!5XPP```H$`%7C$P``"@$`5>/J`@`:!P"@X080H.'^___K`""@X0`` -M`.,``$#C!A"@X?[__^OA`@#J!P"@X080H.'^___K`""@X0```.,``$#C!A"@ -MX?[__^O8`@#J!P"@X080H.'^___K`""@X0```.,``$#C!A"@X?[__^O/`@#J -M`@!5XQ````H$`%7C&P``"@$`5>/)`@`:!P"@X080H.%S(._F_O__ZP<`H.$& -M$*#A_O__ZP`@H.$```#C``!`XP80H.'^___KO`(`Z@<`H.$&$*#A5D`%3C9$"@ -M(WDU`>,#0,?G4`(`Z@D`5>/7```*$@``B@0`5>-+```*!P``B@$`5>,M```* -M)P``.@(`5>,W```*`P!5XT,"`!HY``#J!@!5XYP```I,```Z!P!5X[$```H( -M`%7C.P(`&K8``.H2`%7C20$`"@H``(H/`%7C.P$`"@(``(H,`%7C,@(`&BP! -M`.H0`%7C1@$`"A$`5>,M`@`:20$`ZOT`5>.,`0`*!```BMT`5>-/`0`*[@!5 -MXR4"`!I;`0#J_@!5XYP!``K_`%7C(`(`&J@!`.H```#C``!`XVP0E^7^___K -M&@(`ZJ@W`>,#$)?GK#,``)?G``"-Y0```.,` -M`$#C_O__ZPT"`.H```#C``!`X\`9E^7^___K"`(`Z@```.,``$#CQ!27Y?[_ -M_^L```#C``!`X]`4E^7^___K_P$`Z@```.,``$#CGA?7Y?[__^L```#C``!` -MXY\7U^7^___K````XP``0..@%]?E_O__Z_(!`.I7#8?B&`"`XN`0A^+^___K -M`%!0XCP```K@$-7EX2#5Y>(PU>7C`-7E``"-Y>0`U>4$`(WEY0#5Y0@`C>4` -M``#C``!`X_[__^L```#C``!`XTT1U>5,(=7E_O__ZP```.,``$#CW!"5Y?@E -ME>5/,=7E_O__Z]`0A>(.`)'H3@'5Y0``C>4```#C``!`X_[__^L```#C``!` -MXPP6U>4-)M7E#C;5Y?[__^L```#C``!`X_P5E>7^___K````XP``0.,/%M7E -M$";5Y?[__^MO7X7B`$"@XP!@`.,`8$#C`##5Y0``4^,#```*!@"@X000H.&R -M(-7A_O__ZP%`A.)$4(7B$`!4X_3__QJO`0#JX!#7Y>$@U^7B,-?EXP#7Y0`` -MC>7D`-?E!`"-Y>4`U^4(`(WEH`:?Y?[__^NC`0#J(T"-X@<`H.$4$*#C!""@ -MX1@U`^,/X*#A`_"7YP```.,``$#C(Q#=Y08@H.'^___K#Q`&XB,0S>4```#C -M``!`X_[__^L'`*#A%!"@XP0@H.$4-0/C#^"@X0/PE^>+`0#J````XP``0.., -M-0/C`Q"7YX@U`^,#()?G_O__ZX,!`.H```#C``!`XY0T`>,#$)?G!3N@XP,@ -ME^?^___K````XP``0.,@-0'C`Q#7Y_[__^MV`0#J````XP``0..<-P'CLQ"7 -MX9XW`>.S()?A_O__Z_[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^57G8?B -M*)")X@"@H.,`,`#C`#!`XQ0PC>4`,`#C`#!`XQ@PC>4`,`#C`#!`XQPPC>4' -M@*#AKW^*X@%PA^*'<8C@`$"9Y0"P`.,`L$#C`#``XP`P0.,0,(WE.P``Z@A@ -M1.(`0)3EU#"6Y210G>4%`%/A-0``&N`0UN7A(-;EXC#6Y>,`UN4``(WEY`#6 -MY00`C>7E`-;E"`"-Y10`G>7^___K"P"@X4T1UN5,(=;E_O__ZQ``G>7<$);E -M^"66Y4\QUN7^___K3C'6Y0`PC>48`)WET!"&X@X`D>C^___KT`2?Y0P6UN4- -M)M;E#C;6Y?[__^O`!)_E_!66Y?[__^NX!)_E#Q;6Y1`FUN7^___KK`2?Y(@`%KC -ML/__&@T@H.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L$`0#J````XP``0.,# -M$*#A_O__ZP<`H.$&$*#C)""-XB`U`^,/X*#A`_"7Y_D``.H``%/C]P``&O@# -MG^7^___K>#4#XP,PE^<``%/C\0``"@<`H.$S_R_A[@``Z@```.,``$#C'#(# -MXP,0E^?^___KZ```Z@```.,``$#C`!``XP`00./^___KX@``Z@$`4^,`$``3 -M`!!`$YP3GP4```#C``!`X_[__^LD0)WE4S8#XP-`Q^?7``#J``!3XP(``!H' -M`*#A_O__Z](``.H!`%/C`@``&@<`H.'^___KS0``Z@(`4^/+```:!P"@X?[_ -M_^O(``#J#P!3XQ<``!H'`*#A!Q"@XR,@C>(<-0/C#^"@X0/PE^(@-0/C#^"@X0/PE^<' -M`*#A!Q"@XR,@C>(<-0/C#^"@X0/PE^<```#C``!`XR,0W>7^___KG0``ZG9@ -M[^8'`*#AQ1Z@XP8@H.'^___K!P"@X<4>H./^___K`!"@X0```.,``$#C_O__ -MZP<`H.%8'`#C!B"@X?[__^L'`*#A6!P`X_[__^L`$*#A````XP``0./^___K -MA0``Z@<`H.'%'J#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A6!P`X_[__^L` -M$*#A````XP``0./^___K=@``Z@<`H.$A'J#C_O__ZP`0H.$```#C``!`X_[_ -M_^L'`*#A"!8`X_[__^L`$*#A````XP``0./^___K!P"@X0H=H./^___K`!"@ -MX0```.,``$#C_O__ZP<`H.&A'Z#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A -MHA^@X_[__^L`$*#A````XP``0./^___K!P"@X606`./^___K`!"@X0```.,` -M`$#C_O__ZP```.,``$#C_O__ZP<`H.%#'J#C_O__ZP`0H.$```#C``!`X_[_ -M_^L'`*#A.!0`X_[__^L`$*#A````XP``0./^___K!P"@X1$=H./^___K`!"@ -MX0```.,``$#C_O__ZP<`H.%8%`#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A -MA!0`X_[__^L`$*#A````XP``0./^___K!P"@X8@4`./^___K`!"@X0```.,` -M`$#C_O__ZP<`H.%$%`#C_O__ZP`0H.$```#C``!`X_[__^L'`*#A2!0`X_[_ -M_^L`$*#A````XP``0./^___K!P"@X4P4`./^___K`!"@X0```.,``$#C_O__ -MZP<`H.%%'J#C_O__ZP`0H.$```#C``!`X_[__^L"``#J````XP``0./^___K -M``"@XRS0C>+PC[WHU#H``%`Z``!T.@``B#H``.0[```,/```@#P``*@\``#$ -M/```\#P``!@]``!(/0``@#T``+0]``#L/0``$$`MZ>!"D.4`$-+E217$Y00` -MH.'^___K`0!0XP``X!,``*`#$("]Z/!/+>E!2D.4```#C``!` -MX_[__^N(-0/C`R"5YQ00G>4!,''B`#"@,P``4N,!,(,3``!3XP!`H`,>8*`# -M!0``"J0``.H&`*#A_O__ZP%`A.)E`%3C`@``"FPPE>4B#1/C]___&@`@H.,4 -M,)WEMB##X100G>6T,-'A'P!3XY4``)H`$)'E#2"@X7\]PN,_,,/C"&"3Y2!` -MD>(&0-0P`&"@,P``5N,%```:+`"-XB`@H./^___K``!0XP4```J%``#J+`"- -MXB`0H./^___K%4#@XX,``.K^___K#1"@X7\]P>,_,,/C!""3Y0$@@N($((/E -MA""%XA@@C>6$H)7E`)"@XRRPC>),@(WB'("-Y0`P`.,`,$#C(#"-Y1@`G>4* -M$*#A_O__ZP$`4.-/```*"4"@X0M0H.$``-7E&?;_ZP!P4.(0``"Z`0#UY17V -M_^L`8%#B#```N@%0A>('8H;A!&#(YP0`5.,#``#*`##5Y3H`4^,$```:`5"% -MX@%`A.(&`%3CZ___&ED``.H```#C``!`XRP0C>+^___K#1"@X7\]P>,_,,/C -M!""3Y0$@0N($((/E_O__ZQ5`X.-)``#J3&#=Y4UPW>5.(-WE)""-Y4]`W>4` -M0(WE4$#=Y01`C>510-WE"$"-Y2``G>4&$*#A!R"@X20PG>7^___KI&"%XI0@ -ME>4&`*#A5!"-X@P@0N+^___K``!0XP4```I40)WE``!4XP$PH!,4$)T5MC#! -M$0X``!J4()7E!@"@X500C>(,($+B_O__ZP``4.,%```*5$"=Y0``5.,"(*`3 -M%#"=%;8@PQ$!```:`*":Y:K__^H-$*#A?SW!XS\PP^,$()/E`2!"X@0@@^7^ -M___K%""=Y;0PTN$A`%/C$0``F@``DN4@`(#B#1"@X7\]P>,_,,/C"%"3Y0%` -MD.(%0-0P`%"@,P``5>,$```:!A""X@$@H./^___K``!0XP$```H50.#C```` -MZ@!`H.,$`*#A7-"-XO"/O>@*4*#A'`"=Y2`0BN(&(*#C_O__ZP$`4./5__\: -MJO__ZO!/+>D,T$WB`D"@X>!BD.6T4-+A``!5X[T```H`,)+E``!3X[H```JV -ML-+A!7"@X04`H.'^___K`*!0X@M`X`.T```*`!"4Y0T@H.%_/<+C/S##XPB` -MD^4'4)'@"%#5,`"`H#,``%CC!0``&@H`H.$'(*#A_O__ZP``4..H```:!@`` -MZ@``5^,$```*"@"@X0<0H.'^___K#4#@XZ,``.H*D*#A`%":Y2(`5>,50."# -MG@``B@B`BN*``I_E@!*?Y?[__^L'`%7C3@``"@H``(H"`%7C%@``"@(``(H` -M`%7C$```"G4``.H#`%7C)@``"@8`5>-Q```:.0``ZB``5>-3```*`@``BA\` -M5>-K```:1@``ZB$`5>-7```*(@!5XV8``!I>``#J&`*?Y?[__^MB``#J!#"8 -MY0(`4^,(```*!`!3XPL```H!`%/C6P``&@8`H.$`$)CE_O__ZP@`B.56``#J -M!@"@X0`0F.7^___K"`"(Y5$``.H&`*#A`!"8Y?[__^L(`(CE3```Z@0PF.4" -M`%/C"```"@0`4^,+```*`0!3XT4``!H&`*#A`!"8Y0@@V.7^___K0```Z@8` -MH.$`$)CEN"#8X?[__^L[``#J!@"@X0`0F.4(()CE_O__ZS8``.H&`*#A`!#8 -MY00@V.4`,.#C3,4#XP_@H.$,\);G"`"(Y2T``.H`$-CE!"#8Y0@PF.4`,(WE -M!@"@X0`PX.-0Q0/C#^"@X0SPEN[#OY@``6^,7```: -M``"4Y0T@H.%_/<+C/S##XPA0D^4'0)#@!4#4,`!0H#,``%7C!T"@$0,``!H* -M$*#A!R"@X?[__^L`0*#A``!4XP8```H#``#J%4#@XP0`H.$,T(WB\(^]Z`U` -MX.,```#J`$"@XPH`H.$'$*#A_O__Z_7__^H<-0``8!X```!````\0```4$`` -M`&Q```#P1RWI$-!-XN!2D.4#0*#A`#"@XP@PC>6\,,WA`#"-Y;0PS>$-`*#A -M!A"$X@8@H./^___K`#"4Y0$`4^,O```:!`*?Y?[__^L-`*#A"!"-X@8@H./^ -M___K`0!0XU4```H`8*#C#7"@X0:`H.-VD._F!J"@X08#A>`F#(#B%0"`X@T0 -MH.$((*#A_O__ZP$`4.,1```:M`&?Y?[__^L&HZ#A$&8"XP8`BN```(7@"P"` -MXA00A.(0(*#C_O__ZPJ@A>`&8(K@`4"@XP1`QN4$D(G@%#H"XP.0Q>`%`(#B`!"@XP8@H./^___K"%"% -MX`1`A>``,*#C!##$Y0%`H.,2``#J`4"$XA``5./E__\:#0``Z@,`4^,)```: -M)@R%XA0`@.(`$*#C`2N@X_[__^L`(*#C%#H"XP,@Q>]Z!1J`N-\`)_E!A#5Y_[__^L&`-7G$'8"XP`# -MA^```(7@!0"`X@T0H.$&(*#C_O__ZP8`U><``X?@``"%X`L`@.(4$(3B$""@ -MX_[__^L&,-7G`S.%X`=P@^`!,*#C!##'Y08PU><0`%/C -MW?__&J?__^J`0```I$```-A`````00``<$`MZ0)`H.'@8I#E;""6Y0$`$N,' -M```:0``2XP4``!H``*#CM`#$X;8PU.$".8/CMC#$X7"`O>@&4-3E``!5XP0` -M``H$`%7C%0#@@P%019("``":<("]Z+`G`>,"4);G`1"%XG$0_^:V$,3A%"L! -MXP(@EN<&`%+C`O&?ES8``.K$5`,`L%0#`'!5`P"P5`,`6%4#`'!5`P!850,` -M``"@X[0`Q.$"&8'CMA#$X7"`O>A?+H7B#"""X@(AAN"T(-+AM"#$X0``4N,8 -M```*7A^%X@,0@>(!$H;@7UZ%X@Q0A>(%48;@`P"@X000@>($()7E_O__Z[8@ -MU.&V(,3A$#L!XP,PEN<``%/C`BJ"`[8@Q`$``*`#<("]"`$`4^,``*`3`2F" -M`[8@Q`$``*`#<("]Z```H..T`,3A`AF!X[80Q.%P@+WH$#"@X[0PQ.$*&X'C -MMA#$X0``H.-P@+WH``"@X[0`Q.$"&8'CMA#$X7"`O>@00"WI``!3X@<```H. -MP*#CM,#"X0$PH..V,,+A`!``XP`00.,,(*#A_O__ZP``H.,0@+WH<$`MZ0)0 -MH.'@0I#E;""4Y0$`$N,"```:0``2XP!`X`,(```*Z&"4Y;1@Q>$#`*#A[!"$ -MX@8@H.'^___K`3"@X[8PQ>$`0*#C!`"@X7"`O>AP0"WIX%*0Y0)`H.$!,*#C -MLC#$X`0`H.$`$*#C!B"@X_[__^ML,)7E`0`3XP,``!I``!/C`0``&A``$^,$ -M```*!`"@X>`0A>(&(*#C_O__ZP,``.H$`*#A`!"@XP8@H./^___K``"@XW"` -MO>CP02WI(-!-X@)@H.$#<*#AX$*0Y0```.,``$#CMA#2X?[__^L$`(WB`!"@ -MXQP@H./^___KME#6X0()%>,/```*0`*?Y?[__^L!(*#C%#L!XP,@A.<`,*#C -MK"(% -M```*!`!5XQ4`X(,!@$62`5"@DP8``)IW``#JL#,-```*Q`&?Y?[__^L`,*#C%"L!XP(PA.?;+T+B`C"$ -MYP0@@N(",(3G6"""X@(PA.?#+X+B`C"$YQ\``.H!"1'C#P``"@```.,``$#C -M_O__ZP`@H.,4.P'C`R"$YP$PH..H)P'C`C"$YZPG`>,",(3G!"@!XP(PA.<0 -M*P'C`C"$YPT``.H```#C``!`X_[__^L`,*#C%"L!XP(PA.>H)P'C`C"$YZPG -M`>,",(3G!"@!XP(PA.<0*P'C`C"$YPB`C>6T,-;A``!3XP8```H%`%/C!3"@ -MDPTPH(,,,(WE##"#X@0PC>4A``#J`#"@XPPPC>4!`%7C'0``&K`W`>,#@(3G -M7UZ(X@Q0A>(%483@P`"?Y0@0H.$$(+7E_O__ZP`PE>4%`%/C`@``"@T`4^,* -M```:!```Z@$@H..L-P'C`R"$YP!`H.,<``#J!2"@XZPW`>,#((3G`$"@XQ<` -M`.H`,*#CK"4",8/C"#"-Y010C>(,`(7B!Q"@ -MX0P@G>7^___K!`"@X040H.'^___K``!0XP0``!JH,@/C`S"4YP``4^->0.`# -M````"@!`H.,$`*#A(-"-XO"!O>AT00``B$$``*!!```00@``\$4;,,'EOC+1X3`P@^("`%/AV```B@0PD>4!`'/CU0``&K@@ -MT>'_/P_C`P!2X=$``!HD,-'E`P!3X\X``(I>?8;B*'"'X@Q0@>(%`*#A`!`` -MXP`00./^___K``!0XU```!I``Y_E_O__ZP`@H.,4.P'C`R"&YP$PH..L)P'C -M`C"&YU@@@N(",(;G)(#4Y;Y2U.$4`Y_E"!"@X?[__^L$`%CC%4#@@[8``(H` -M`%7CL0``"@4`5>,%H*"3#:"@@PR0BN()`*#A_O__ZP!04.*K```*!0"@X0`0 -MH.,<(*#C_O__ZPB@A>4`D(7E#0!:XP4PH`.L)P$#`C"&!U@@@@(",(8'`C&( -MXP0PA>4,H(7B"@"@X3`0A.((()7E_O__ZQPPU.4``%/C!P``"H`"G^7^___K -M!@"@X040H.'^___K``!0XY,```J0``#J9`*?Y?[__^L#`%CCC@``BEX_B.(# -M,(/B`S*&X`0`@^(*$*#A"""5Y?[__^M?/HCB##"#X@,QAN`(()7E!""#Y08` -MH.$'$*#A"""@X0`PH./^___K`$"@XWP``.JH-P'C`S"6YP(`4^-R```:;""6 -MY0@P`.,!,$#C`S`"X```4^-L```*5PV&XA@`@.+@$(;B_O__ZP"`4.)0```* -M!0"@X<@1G^7^___K``!0XP`PH!/H,(@5%#L!XP,PEN<&`%/C!`!3$ZPW`0,# -M,)8'[#"(!1PPU.4!`%/C&P``&C!PA.*^(M3A$0Z(X@<0H.$0`%+C$""@(_[_ -M_^L%`*#A,#(,;G!@"@X0@0H.$!(*#C_O__ZR0``.HD`-3E -M``*&X#"`A.*^(M3A!@N`X@P`@.(($*#A$`!2XQ`@H"/^___K)`#4Y0H`@.*H -MIP'C``**X```AN`$`(#B$!"(X@@@H./^___K)`#4Y0X`@.(``HK@``"&X`0` -M@.(8$(CB"""@X_[__^L!,*#C&RR@XP(PQN,#,);G!@!3XP0`4Q,&```:K#]Z`!`H.,```#J7D#@XP4`H.$)$*#A_O__Z_;_ -M_^I$0@``;$(``(!"``"00@``H$(``*A"``#P1RWI`)"@X0*@H.$#8*#AMG+3 -MX4!PA^('`*#A_O__ZP!`H.$`@*#A``!0XT(```H`$*#C!R"@X?[__^L$`*#A -M`S"@XP0P@.3_$*#C!B"@X_[__^NT,M;A`P!3XP/QGY%T#``!0`.,`4$#C!P``Z@!0`.,`4$#C!```Z@!0`.,`4$#C`0``Z@!0 -M`.,`4$#C#`"(X@40H.$0(*#C_O__ZP`PEN4$`!/C`#"@$QPPR!4`,);E"``3 -MXP$PH!,<,,@5!C#:Y0$P0^(D,,CE`#"6Y0(`$^,#```*)0"(X@P0AN(((*#C -M_O__Z[8RUN$``%/C!```"KXRR.$P`(CB*!"&XK8BUN'^___K"0"@X0@0H.$' -M(*#AP/[_ZP!0H.$$`*#A!Q"@X?[__^L```#J`%#@XP4`H.'PA[WH<$`MZ0!0 -MH.$"0*#AX&*0Y;8PTN$#.J#A(SJ@X0H`4^,#\9^7"@``ZD!?`P!`7P,`0%\# -M`$!?`P"$7@,`K%X#`/Q>`P!`7P,`0%\#`'Q>`P!`7P,`7D#@XR\``.H`,)+E -M``!3XP$@H!,,-@(3`R#&%P!`H!,`0*`###8"`P-`Q@,#0(;GJ#(`<*#A`D"@X0`PH.,, -M,(WE"#"-Y0%0H.$#`%'A`!"@$P$0H`.``%+C`3"@D0$P@8,``%/C!@``"@`@ -MH./X.`'C`R#`YP(`4>$"0*`1%4#@`\H``.H``%+C`$"@`\<```H$L*#A!`"@ -MX?[__^L`8%#B"T#@`\$```H&`*#A!1"@X0L@H.'^___K`P!4XP!`X)/'``": -M!%"@X08`H.$$$*#A#""-X@@PC>+^___K`0!0XP4``!H"(*#CJ#((,(WB_O__ZP$`4.,%```:`B"@XZ@W -M`>,#((?G!R"@XQ`[`>,#((?G#%"=Y0%01>(/`%7C!?&?ES$``.JP8`,`S&`# -M`#AA`P`@80,`.&$#`#AA`P`X80,`Z&`#`#AA`P`X80,`.&$#`#AA`P`X80,` -M.&$#`#AA`P`$80,``""@XP0X`>,#((?G`2"@XQ0[`>,#((?G&@``Z@$@H.,$ -M.`'C`R"'YP`@H.,4.P'C`R"'YQ,``.H"(*#C!#@!XP,@A^<$(*#C%#L!XP,@ -MA^<,``#J!""@XP0X`>,#((?G!B"@XQ0[`>,#((?G!0``Z@4@H.,$.`'C`R"' -MYP`@H.,4.P'C`R"'YPA0G>4!4$7B#P!5XP7QGY,#((?G!""@XQ0[`>,#((?G00`` -MZ@0@H..L-P'C`R"'YP8@H.,4.P'C`R"'YSH``.H%(*#CK#,#(,?G`#``XP`P0..8,)/E!#"-Y3(``.H% -M@*#A!:"&X``PVN7=`%/C&@``&@(`A>(``(;@!!"-X@0@H./^___K`0!0XQ,` -M`!JP`)_E_O__ZPJ`H.$!(-KE`B""X@(,4N,"+*"C_#H!XP,@A^=C#8?B.0"` -MX@H0H.'^___K^#@!XP$@H.,#(,?G=`"?Y?[__^L`0*#C%0``Z@B`AN`),-CG -M`C"#X@-0A>!U4/_F!0!4X=C__XH`0*#C#```Z@0`H.$4T(WB\(^]Z``@H./X -M.`'C`R#'YP`P`.,`,$#CF#"3Y00PC>4`4*#C`9"@X\G__^H&`*#A"Q"@X?[_ -M_^ON___JW$(``.A"```00"WIX`*0Y0,0H.&T(-+A!?__ZQ"`O>CP12WI#-!- -MX@)0H.$`,*#C!#"-Y>!BD.6R,,WA`3#-Y6PPEN4!`!/C`@``&D``$^,``.`# -M60``"E0QEN59#X;B+1"@XP0@C>(,,$/B_O__ZP!P4.(0```*!$"=Y0``5.,- -M```*!T"@X0(`C>(%$(?B`B"@X_[__^L",/3E`2#4Y0(T@^'3H.#G8``3XP!P -MH`,!<*`3`8"@XP(``.H`<*#C!Z"@X0>`H.%`,=;E`2!#XG(@[^;]`%+C`$"@ -M@PP``(H&(*#A`$"@XP0`H.%_,`/B!`!3X0-`H"$$`,7E03'2Y0$@@N(!$$/B -M<1#OYOT`4>/U__^:`0!8XR,``!H&`*#A$Q"@XP$@C>(8-0/C#^"@X0/PEN+PA;WH<$`MZ2#03>+@8I#E`$"2Y03@TN4-P*#A,#&?Y0\`D^@' -M`*SH`##,Y0$`=.,P```*I$*@X<4Z!>-\.D#CDR2#X*,SH.%N`%/C!5"@`RD` -M``H/``"*-P!3XP)0H`,E```*!0``B@H`4^,`4*`#(0``"A0`4^,>```:%0`` -MZCP`4^,#4*`#&P``"EH`4^,8```:$0``ZO``4^,(4*`#%0``"@4``(IX`%/C -M!E"@`Q$```JT`%/C#@``&@D``.I:#U/C"5"@`PL```H>#E/C"```&@4``.H! -M4*#C!@``Z@10H.,$``#J!U"@XP(``.H*4*#C````Z@M0H.,`0*#C#0"@X1`0 -MC>(`P.#C!##0YP4`4^$$P,$7`@``&@0PP><``%[C`@``"@%`A.(-`%3C]?__ -M&@8`H.$0$(WB_O__ZP$`4.,``*`#``#@$R#0C>)P@+WHB!X``/!`+>D,T$WB -M`F"@X>!"D.4`,*#C!#"-Y6PPE.5!`!/C3P``"E0QE.59#X3B+1"@XP0@C>(, -M,$/B_O__ZP``4.,`<*`#`@``"@10G>4`<%7B`7"@$P5=A.(%`*#A_O__ZP$` -M4.,-```:`0!7XP4``!H&`*#A$!"@XP`@`.,`($#C_O__ZSL``.H&`*#A$!"@ -MXP`@`.,`($#C_O__ZS4``.H%`*#A_O__ZP$`4.,-```:`0!7XP4``!H&`*#A -M$!"@XP`@`.,`($#C_O__ZRD``.H&`*#A$!"@XP`@`.,`($#C_O__ZR,``.HH -M,93E#@!3XPT``)H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^___K&```Z@8` -MH.$0$*#C`"``XP`@0./^___K$@``Z@$`5^,%```:!@"@X1`0H.,`(`#C`"!` -MX_[__^L*``#J!@"@X1`0H.,`(`#C`"!`X_[__^L$``#J`@"@X1`0H.,`(`#C -M`"!`X_[__^L``*#C#-"-XO"`O>CX3RWI`V"@X>!"D.6./Z#CM##"X08`H.$` -M$*#C`R"@X?[__^M`.P3C3#!`XP`PAN5D,*#C+##&Y2TPQN4N,,;E!S"@XR\P -MQN5<(*#C,"#&Y4T@X.,Q(,;E`%"@XS)0QN4S,,;E!#"@XS0PQN4`,`#C`#!` -MXP!PD^4X<(;E!'"3Y3QPAN4(<)/E0'"&Y0QPD^5$<(;E`3R@X\`PAN4J.0#C -MQ#"&Y;Q=QN$6,*#C&#'&Y1`PH.,9,<;E!7"@X0J@H.,$D*#CH+8(XP&P0..D -M-]3E``!3XPH```HF@(?BB(&&X`HPR.>D!]3E_O__ZYL``.`)`(CG`3"@X[@P -MR.$!<(?B=W#_YB``5^,#```*`5"%X@Q`A.(@`%7CZ___&A,^H..S<(;A,G'& -MY0\PH.,T,H;E/S"@XP\PQN4``*#C^(^]Z'!`+>D"4*#AX$*0Y6PPE.4!`!/C -M"@``"B@!E.7^___KH#8(XP$P0..3``/@`#"%Y0$PH..T,,7A*#&4Y08PQ>4) -M``#JG@?4Y?[__^N@-@CC`3!`XY,``^``,(7E`3"@X[0PQ>&>-]3E!C#%Y0`` -MH.-P@+WH\$\MZ<7?3>("L*#A`T"@X0`PH./T,HWE`BR-XK([PN$5.PCC_S]/ -MX[X_PN$!,*#C`RR-XK`PPN$##(WB`@"`XB`0B^(&(*#C_O__ZQ1@A.(X,YWE -M!@!3X0L``)HQ7HWB%""@X[0A9>$$`*#A!1"@X00@H./^___K!`"$X@00A>(0 -M(*#C_O__ZP9`H.$H`(OB_O__ZP``4.,@```*&SL(X_\_3^,"+(WBOC_"X0$P -MH.,#+(WBMC#"X;ARV^$@`%?C('"@([1PPN$(<(?B!U"$X#@SG>4%`%/A$``` -MFC%NC>*T<6;A!'"@XP0`H.$&$*#A!R"@X?[__^L'`(3@"!"&X@<@H.'^___K -M"`"$XBP0B^(#/(WBM"#3X?[__^L```#J!%"@X:0@B^(8((WEE#";Y0(`H.$M -M$*#CO2^-X@PP0^+^___K`&!0XA0```KT0IWE``!4XQ$```H&0*#A*PZ-X@(` -M@.(%$(;B`B"@X_[__^L",/3E`2#4Y0(T@^'3(.#G)""-Y6``$^,`,*`#`3"@ -M$Q`PC>4!(*#C#""-Y0,``.H`,*#C$#"-Y20PC>4,,(WE`3L(X_\_3^,"+(WB -MOC_"X8!`B^($`*#A_O__ZP$`4.,.```:##"=Y0$`4^,%```:`PR-XA`0H.,` -M(`#C`"!`X_[__^LX``#J`PR-XA`0H.,`(`#C`"!`X_[__^LR``#J!`"@X?[_ -M_^L!`%#C#@``&@P@G>4!`%+C!0``&@,,C>(0$*#C`"``XP`@0./^___K)0`` -MZ@,,C>(0$*#C`"``XP`@0./^___K'P``ZF@PF^4.`%/C#@``F@PPG>4!`%/C -M!0``&@,,C>(0$*#C`"``XP`@0./^___K$P``Z@,,C>(0$*#C`"``XP`@0./^ -M___K#0``Z@P@G>4!`%+C!0``&@,,C>(0$*#C`"``XP`@0./^___K!```Z@,, -MC>(0$*#C`"``XP`@0./^___K%&"%XC@SG>4&`%/A"P``FC%.C>(4(*#CM"%D -MX04`H.$$$*#A!""@X_[__^L$`(7B!!"$XA`@H./^___K!E"@X0<["./_/T_C -M`BR-XKX_PN&8,(OB"#"-Y0,`H.'^___K`!"@X;X/C>("`(#B`B"@X_[__^L" -M+(WBNC_2X0,`$^,5```*`0`3XP,PH!,`,XT5`3"@`P`SC04(H(7B.#.=Y0H` -M4^$,``":,4Z-X@@@H..T(63A!&"@XP4`H.$$$*#A!B"@X?[__^L&`(7@!A"$ -MX`8@H.'^___K````Z@6@H.%H,)OE``!3XP$PH`-H,(L%!3L(X_\_3^,"+(WB -MOC_"X6@`F^7^___KH#8(XP$P0..3``/@`#.-Y0$PH.,#+(WBM##"X6@PF^4& -M,\WE#%"*XC@SG>4%`%/A"P``FC%.C>(,(*#CM"%DX0H`H.$$$*#A!""@X_[_ -M_^L$`(KB!!"$X@@@H./^___K!:"@X2L["./_/T_C`BR-XKX_PN&Z3]+A$``4 -MXP([H!,#+(T2MC#"$0(YH`,#+(T"MC#"`0`PH.,#+(WBM##"X0A0BN(X,YWE -M!0!3X1$``)HQ3HWB"""@X[0A9.$$8*#C"@"@X000H.$&(*#A_O__ZP8`BN`( -M$(3B!B"@X?[__^L%`*#A+!"+X@,\C>*T(-/A_O__ZP6@H.&MCXWB"`"@X4`0 -MH.,`(`#C`"!`X_[__^N`(-OE``!2XP!PH`,C```*K4^-X@!`A.`+4*#A`'"@ -MXT"`B.(`,`#C`#!`XQ0PC>4`,`#C`V"@X0!@0.,`D`#C`)!`XQR@C>4@L(WE -M%+"=Y0:@H.%_8`+B!P!6X09PH"$($&3@IC"@X0$`$N,*(*`!"R"@$0`@C>4$ -M`*#A"2"@X?[__^N!(-7E`5"%X@``4N,`0(00[O__&AR@G>4@L)WE#""=Y0$` -M4N,Q```:`CR-XK(;T^$""1'C#```"B0@G>4``%+C!```"@YQ`.,0,)WE``!3 -MXTM_H!,D``#J$""=Y0``4N.0<*`3@G"@`Q\``.J``!'C"@``"B0PG>4``%/C -M`P``"A`@G>4``%+C%@``&A$``.H0,)WE``!3XQ```!H+``#JN`6?Y?[__^LD -M()WE``!2XP,```H0,)WE``!3XPD``!H$``#J$""=Y0``4N,#```:07"@XP0` -M`.J'<*#C`@``ZDAPH.,```#JEG"@XX=PH.$A.PCC_S]/XP(LC>*^/\+A`#"@ -MXP4SS>4$,\WE(#$*XP(`,(WE*SZ-X@0PC>4(`)WE+""-XJL_ -MC>+^___K`CR-XK!+T^$``%3C80``"HM/C>($`*#A`!"@XX`@H./^___K`#`` -MXP`P0.,#`)/H`P"$Z`(LC>*P2]+A``!4XQ````HC;HWB`V"&X@!`H.,`<`#C -M`'!`XTN/C>($4*#A!@"@X0<0H.$%(-CG_O__ZP!@AN`!4(7B`CR-XK!+T^$% -M`%3A]?__BK\/C>(`$*#C%""@X_[__^L"/`CC_S]/XP(LC>*^/\+ABP^-XO[_ -M_^MP`/_F`SR-XK0`P^$(4(#B!6"*X#@CG>4&`%+A$```FC%.C>*T463A!%"@ -MXPH`H.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XHL?C>(#/(WB -MM"#3X?[__^L&H*#AOP^-X@`0H.,4(*#C_O__ZP4\"./_/T_C`BR-XKX_PN&P -M6]+A`SR-XK10P^$(4(7B!6"*X#@CG>4&`%+A$```FC%.C>*T463A!%"@XPH` -MH.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XDL?C>(#/(WBM"#3 -MX?[__^L&H*#A`BR-XKQ*TN$``%3C80``"HM/C>($`*#A`!"@XX`@H./^___K -M`#``XP`P0.,#`)/H`P"$Z`(\C>*\2M/A``!4XQ````HC;HWB`V"&X@!`H.,` -M<`#C`'!`XRR`C>($4*#A!@"@X0<0H.$%(-CG_O__ZP!@AN`!4(7B`BR-XKQ* -MTN$%`%3A]?__BK\/C>(`$*#C%""@X_[__^L"/`CC_S]/XP(LC>*^/\+ABP^- -MXO[__^MP`/_F`SR-XK0`P^$(4(#B!6"*X#@CG>4&`%+A$```FC%.C>*T463A -M!%"@XPH`H.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XHL?C>(# -M/(WBM"#3X?[__^L&H*#AOP^-X@`0H.,4(*#C_O__ZP4\"./_/T_C`BR-XKX_ -MPN&\6M+A`SR-XK10P^$(4(7B!6"*X#@CG>4&`%+A$```FC%.C>*T463A!%"@ -MXPH`H.$$$*#A!2"@X?[__^L%`(K@"!"$X@4@H.'^___K"`"*XBP0C>(#/(WB -MM"#3X?[__^L&H*#A`#"@XZPRC>64<)OE#'!7XCD```H#0*#AJX^-X@4L"./_ -M+T_C#""-Y;\_C>((,(/B$#"-Y0&0H.,$4*#A%+"-Y0>PH.$8<)WE!6"'X`8` -MH.$($*#A_O__ZP``4.,?```*K$*=Y0(`5.,<``":#""=Y0(\C>*^+\/AO#K3 -MX0,LC>*T,,+A"#"#X@@PC>4#0(K@.#.=Y00`4^$0``":"""=Y0(\C>*\+\/A -M"@"@X;\?C>($(*#C_O__ZP0`BN(0$)WE!""@X_[__^L(`(KB!A"@X0,\C>*T -M(-/A_O__ZP2@H.$%,(?@"3#3YP(P@^(#4(7@!0!;X=/__XH4L)WE`3P(X_\_ -M3^,"+(WBOC_"X4LPH.,#,\WE5#";Y0``4^-0,-L%5#"+!50PV^6#((/@4##; -MY0,@@N!"(:#A`2/-Y50PB^60,-OE`#/-Y6,PX.,",\WE"&"*XC@SG>4&`%/A -M#```FC%.C>(((*#CM"%DX010H.,*`*#A!!"@X04@H.'^___K!0"*X`40A.`% -M(*#A_O__ZP:@H.$*`*#AQ=^-XO"/O>BX0P``\$\MZ1S03>(4$(WE#""-Y1`P -MC>7@DI#EM'#2X0=P@^"T,@/C`S#9YP``4^,$```*B#4#XP,PF><``%/C%4#@ -M$S8``!K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/EA(")XH1`F>5ZOHGB -M!+"+XA!@G>7_H@#C"`"@X000H.'^___K`0!0XQ8```H',&;@"@!3X09`X-,3 -M``#:!%"@X2@PE.4``%/C`$"4!?'__PH+`*#A:!"5Y?[__^L!`%#C!@``&@!P -MC>4)`*#A%!"=Y04@H.$&,*#AT?S_ZP!@H.$`0)3EX___Z@!`H.,-(*#A?SW" -MXS\PP^,$()/E`2!"X@0@@^7^___K$#"=Y09@8^`,()WEM&#"X0`PH..V,,+A -M!`"@X1S0C>+PC[WH<$`MZ>!2D.4`0%/B#P``"K`PU.$``%/C`P``"@$`4^-> -M0.`3#```&@0``.H%`*#A_O__ZP``4.,$```*!0``Z@4`H.'^___K``!0XP$` -M`!H`0.#C````Z@!`H.,$`*#A<("]Z#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@ -MXQ`@H./^___K`3"@X[`PS>$"`(WB`!"@XP8@H./^___KUSV@XP,`E><5&PCC -M#2"@X0`PH./^___K%-"-XC"`O>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0 -M(*#C_O__ZP$PH..P,,WA`@"-XN`0A>(&(*#C_O__Z]<]H.,#`)7G%1L(XPT@ -MH.$`,*#C_O__ZQ30C>(P@+WH,$`MZ1303>(`4*#A#4"@X0T`H.$`$*#C$""@ -MX_[__^O7/:#C`P"5YQD;".,-(*#A`#"@X_[__^L4T(WB,("]Z/!'+>D`D*#A -M`:"@X0)PH.$#@*#A````XP``0./0$)_E_O__ZQP`H./^___K`%"@X0!`H.$` -M`%#C`$"@`RH```H4`*#C_O__ZP!@4.($```:!0"@X1P0H./^___K`$"@XR$` -M`.H&`*#A`!"@XQ0@H./^___K`8#&Y0!PQN4!,*#C`S#&Y0%P1^)W<._F!`!7 -MXQ!0H(,`,`"3`#!`DP=P@Y"\4->5!`"&X@H0H.$%(*#A_O__ZQ0PH..P,,3A -M!&"$Y0@PA.4`,*#C##"$Y1`PA.44`(3B_O__ZTL-B>((`(#B!!"@X?[__^L` -M0*#A!`"@X?"'O>B8'@``$$`MZ04@0N)R(._F"`!2XP!`H(,`P`"3`,!`DP(@ -MC)#$0-*5!""@X;;__^L0@+WH<$`MZ0C03>(!8*#A`E"@X0`0`.,`$$#CT#"1 -MY00PC>7@0I#E````XP``0./4$('B_O__ZVPPE.40`!/C%4#@`R(```H.4$7B -M<`>4Y0``4.,#```*?!>4Y?[__^L`,*#C<#>$Y0``5>,`0*#3%P``V@4`H.'^ -M___K<`>$Y7Q7A.4``%#C!0``&DP`G^5,$)_E42H!X_[__^L50.#C"P``Z@X0 -MAN(%(*#A_O__ZP0`H.'=$*#C!""-X@$PH./^___K`2"@XTL]H.,#(,3G`$"@ -MXP0`H.$(T(WB<("]Z`!$``#`'@``\$\MZ4S03>(`8*#A`7"@X0!`H.'@(K3E -MG34#XP,PTN<``%/C`$#@`_L$``H`,)'E``!3XQ5`X`/W!``*M`#1X?[__^L0 -M`(WE`("@X0``4.,+0.`#\`0`"@`0E^6TD-?A#2"@X7\]PN,_,,/C"*"3Y0E0 -MD>`*4-4P`*"@,P``6N,$```:"2"@X?[__^L``%#C!```&@@``.H``%GC!@`` -M"@D0H.'^___K$`"=Y;00U^'^___K#4#@X]<$`.K(#Y_ER!^?Y0`@F.7^___K -M`!"8Y0$P0>(2`%/C`_&?E[0$`.H(>P,`,'L#`$!\`P"0C0,`@(L#``B#`P"0 -MC0,`D(T#`)"-`P"0C0,`D(T#`)"-`P"0C0,`D(T#`)"-`P#4)`-CE -M#`"-Y1`/G^7^___K;#"5Y1$`$^,P```*!#"8Y0$`<^,#```:N"#8X0$X@^(# -M`%+A*0``"E<-A>(8`(#B!!"(XO[__^L`0%#B"T#@`WP$``H08)CEO##8X=0P -MA.43#H3B%!"(XA`@H./^___K`@P6XP$PH!/<,(05`#"@`]PPA`7$-)7E``!3 -MX]PPA`4""Q;C`#"@`_@UA`4'```*`3"@X_@UA.7<,(3E80Z$X@,`@.`D$(CB -M&B"@X_[__^O0-)7E``!3X_@UA`4%`*#A!!"@X?[__^L`0*#C600`ZA5`X.-7 -M!`#J`%"4Y000V.4%(-CE!C#8Y0<`V.4``(WE"`#8Y00`C>4)`-CE"`"-Y0P. -MG^7^___K;#"5Y1$`$^,5```*!#"8Y0$`<^,#```:N"#8X0$X@^(#`%+A#@`` -M"E<-A>(8`(#B!!"(XO[__^L`0%#B!```"@4`H.$$$*#A_O__ZP!`H.,V!`#J -MM`V?Y?[__^L`0*#C,@0`ZA5`X.,P!`#JMX0`PH.-`,(WEE#V?Y10AD^4T -M((WE+""-XD8?@^(#`)'H!`""Y+`0PN$`4)3ES`V?Y1(>@^(&(*#A_O__ZVPP -ME>40`!/C=0$`"J!'`>,$`(7@#!"(X@(@H./^___KM#"5X0$P0^)S,/_F'P!3 -MXP0PH($@(*"#LR"%@0Y@1N)4887E`PQ6XPM`X(,,!`"*5D^%X@0`H.$`$*#C -M`RR@X_[__^L$`*#A#A"(XE0AE>7^___K/#&5Y00`4^-8`0`:`)"@XQ"1A>7@ -M`(7BRQV%XB$0@>(&(*#C_O__ZP0`H.'^___K`2#0Y0`PT.4"-(/A(#&%Y0$@ -MU.58,=7E`C2#X10PC>4,8(3B0*"-XE0QE>4&`*#A"1"@X0H@H.$,,$/B_O__ -MZP"04.(,```*0$"=Y0``5.,)```*Z`"%X@`0H.,D(*#C_O__Z^P`A>("$(GB -M0""=Y?[__^M`0)WEZ$"%Y0`PH.,<,87E5#&5Y08`H.$#$*#C"B"@X0PP0^+^ -M___K`)!0X@,```I`0)WE``!4XP*PV14````:`+"@XRBQA>4<`(WB`!"@XQ`@ -MH./^___K5#&5Y08`H.$!$*#C"B"@X0PP0^+^___K`$!0X@"0H`,$```*'`"- -MX@(0A.)`()WE_O__ZT"0G>54,97E!@"@X3(0H.,*(*#A##!#XO[__^L`0%#B -M!@``"AP`C>()`(#@`A"$XD`@G>7^___K0$"=Y020B>`<`(WB"1"@X0L@H.'^ -M___K<)#OY@4-A>()$*#A_O__ZU0QE>4&`*#A*A"@XPH@H.$,,$/B_O__ZP"P -M4.(%```*0$"=Y0``5.,"```*!0"@X0L0H.'^___K5#&5Y08`H.$M$*#C"B"@ -MX0PP0^+^___K`+!0XA<```I`0)WE``!4XQ0```H(D(GC!0"@X1,0H.-'((WB -M#XP_@H.$#\)7G1T#=Y0,`5.,"0(L"`##@`P,PQ`4!,(,"!##$!4X.A>() -M`(#B`A"+XD`@G>7^___K`;"@XP```.H`L*#C"P!9XQ$``(IY0*_F`3"@XQ-$ -MH.$,/`#C`#!`XP,P!.```%/C`S"@$Q@QA14)```:$``4XP(PH!,8,845!0`` -M&@(`%.,!,(,2&#&%%0$``!H#,*#C&#&%Y44,)WE$``3XP$PH!,,,845 -M`#"@`PPQA04`,*#CY"@!XP(PA><\,(WE.#"-Y0@@@N(",(7G""""X@(PA>=4 -M,97E!@"@X3`0H.,*(*#A##!#XO[__^L`0%#B&0``"D`0G>4``%'C%@``"@0` -MH.$"$('B/""-XC@PC>+^___K`0!0XP\``!H"(*#CJ#<$,(/B`R"5YP(@@N,#((7G/$"=Y0@P@^(#0(7G.$"=Y0@P@^(#0(7G -M`#"@XT`PC>4\,(WE.#"-Y>@H`>,",(7G""""X@(PA><&0*#AW9"@XU0QE>4. -M,$/B!`"@X0D0H.$*(*#A0$"=Y0,P9.#^___K`$!0XB$```H"`(3B-!"-X@0@ -MH./^___K``!0XR<#``H$`*#A0$"=Y0(0A.(\((WB.#"-XO[__^L!`%#C$P`` -M&@(@H..H-P'C`R"%YP$@H.-./X/B`R"%YP0P@^(#()7G`2""XP,@A><\0)WE -M!#"#X@-`A><"``#J`C"#X@-`A.#3___J`#"@XT`PC>7$ -M-(7E6CH"XP,PU><``%/C&@``"MV0H.-4,97E#C!#X@8`H.$)$*#A"B"@X4!` -MG>4#,&3@_O__ZP!`4.(/```*`@"$XBP0C>(&(*#C_O__ZP``4./W`@`*`3"@ -MX\0TA>4(,/3E@SS@X:,\X.$`,,3E`@``Z@(P@^(#8(3@Y?__Z@`PH./0-(7E -MX#T"XP,PU><``%/C`+"@`P&P"Q(``%OC!@``"@$PH./0-(7EQ#2%Y>(]`N,# -M,-7G`0!3X]0TA054,97E>#"#X@40H.'<,*'E!0"@X?[__^M7;87B&&"&XN!` -MA>(&`*#A!!"@X?[__^L``%#C!```&@8`H.$$$*#A_O__ZP``4.,%```*!0"@ -MX?[__^L!,*#CV#"%Y0!`H..G`@#J%4#@XZ4"`.JT4-?A`$"4Y5@'G^5L%Y_E -M_O__ZP`PH.,@,(CE&S#(Y;XRV.%`,(/B`P!5X<0"`!H$4*#A!#"8Y0$`<^,' -M```:N"#8X0$X@^(#`%+A`P``&B1@V.4#`%;CN0(`B@D``.I7#87B&`"`X@00 -MB.+^___K`&!0XJ@"`!H$!Y_E_O__ZP!`H..#`@#J#$"(X@0`H.'P%I_E_O__ -MZP``4.,$```:Y`:?Y080H.'^___K`$"@XW@"`.H$`*#A*!>?Y?[__^L!`'#B -M``"@,P``4.,`8*`#`3"@`V0```JP!I_E_O__ZR1@V.6^HMCAI`:?Y080H.$* -M(*#A_O__ZP$P>N(`,*`S`P!6XP$P@X,``%/CC`(`&@``6N,`0*`#$0``"@4` -M6N,%H*"3#:"@@PR0BN()`*#A_O__ZP!`4.(#```:5`:?Y?[__^L`0*#C4@(` -MZ@0`H.$`$*#C'""@X_[__^L(H(3E`)"$Y01@A.4,D(3B"0"@X3`0B.((()3E -M_O__ZQPPV.4``%/C)```"@P&G^7^___K`""@XQ0[`>,#((7G`3"@XZPG`>," -M,(7G6"""X@(PA><(,)3E#0!3XP4PH`-8($("`C"%!U@@@@(",(4'L#=>/X;B`S"#X@,RA>`$`(/B"1"@X0@@E.7^___K7SZ&X@PP@^(#,87@"""4 -MY00@@^4%`*#A#!"$X@@@U.4&,*#AZ?S_ZX\!`.I\!9_E_O__ZUX_AN(#,(/B -M`S*%X`0`@^()$*#A"""4Y?[__^M?/H;B##"#X@,QA>`(()3E!""#Y04`H.$, -M$(3B""#4Y08PH.'5_/_K>P$`Z@``4^-Z```*;#"5Y1``$^-W```*'##8Y0$` -M4^,K`@`:``!0XQ0```H(!9_EX!2?Y?[__^LD`-CE``*%X+XBV.$&"X#B#`"` -MXC`0B.(0`%+C$""@(_[__^L!(*#C!#@!XP,@A>>^,MCA#0!3XP0@@@($.`$# -M`R"%!T0``.H$`*#AM!2?Y?[__^L``%#C)```&J@$G^5X%)_E_O__ZP(@H.,$ -M.`'C`R"%YR0`V.4``H7@,$"(XKXBV.$&"X#B#`"`X@00H.$0`%+C$""@(_[_ -M_^LD`-CE"@"`XJAG`>,``H;@``"%X`0`@.(0$(3B"""@X_[__^LD`-CE#@"` -MX@`"AN```(7@!`"`XA@0A.(((*#C_O__ZP$@H.,!.P'C`R#%YQH``.H$`*#A -M%!2?Y?[__^L``%#C#P``&@@$G^70$Y_E_O__ZP0@H.,$.`'C`R"%YR0`V.4` -M`H7@OB+8X08+@.(,`(#B,!"(XA``4N,0(*`C_O__ZP4``.K,`Y_ED!.?Y?[_ -M_^L`(*#C!#@!XP,@A>>_/T/B`R"5 -MYU@P0^(#((7G!0"@X3`0B.)R(._F)##8Y2/\_^L%`*#A_O__ZP!@4.*\`0`* -M`$"@X^A`AN4$.`'C`S"5Y^PPAN6-`0#JJ#<"`%/C`#"@$P$PH`,` -M`%;C`#"@`P``4^.M`0`*;#"5Y1``$^.J`0`*'##8Y0$`4^-C```:,*"(XKXB -MV.$1#H;B"A"@X1``4N,0(*`C_O__ZP0`H.$D$Y_E_O__ZP``4.,)```:Z`*? -MY:@2G^7^___K`3"@X^PPAN6^,MCA#0!3XP4PH`/L,(8%)0``Z@0`H.&H$I_E -M_O__ZP``4.,0```:L`*?Y6P2G^7^___K`C"@X^PPAN7P`(;B$!"*X@@@H./^ -M___K`0R&XA@0BN(((*#C_O__ZP$@H.,!.P'C`R#%YP\``.H$`*#A6!*?Y?[_ -M_^L``%#C!0``&EP"G^44$I_E_O__ZP0PH./L,(;E!```ZD@"G^7\$9_E_O__ -MZP`PH./L,(;E'`"@X_[__^L`D*#A``!0XQ\```H7`*#C_O__ZP"@4.(#```: -M"0"@X1P0H./^___K%P``ZA0`B>+^___K%2"@X[`@R>$$H(GE%S"@XP@PB>4` -M,*#C##")Y1`PB>7L,);E!C#*Y0H`H.'@$(;B!B"@X_[__^L'`(KB$1Z&XA`@ -MH./^___K2PV%X@@`@.()$*#A_O__ZP!`H./H0(;E&@$`Z@``4.,1```*)`#8 -MY0`"A>"^(MCA!@N`X@P`@.(P$(CB$`!2XQ`@H"/^___K`2"@XP0X`>,#((7G -MOC+8X0T`4^,$((("!#@!`P,@A0=>``#J!`"@X2`1G^7^___K``!0XR$``!H" -M(*#C!#@!XP,@A>`$`(#B$!"$X@@@H./^___K)`#8 -MY0X`@.(``H;@``"%X`0`@.(8$(3B"""@X_[__^L!(*#C`3L!XP,@Q>```<-0``Z!X``"Q$ -M``!@1```C$0``.P=```<'P``T$0``*!"```810``1$4``&Q%``"<10``@$(` -M`)!"``#,10``J$(``.1%``"P0@```$8``!Q&```X1@``5$8``'!&``",1@`` -MJ$8``.1&```P'P``]$,```!$``!('P``_$8``$!"````(*#C!#@!XP,@A>>_/T/B`R"5YU@P0^(#((7G!0"@X3`0 -MB.)R(._F)##8Y23[_^L%`*#A_O__ZP!@4.*]```*`$"@X^A`AN4$.`'C`S"5 -MY^PPAN6.``#J``!4XXP```H$`*#A#!"*XO[__^L`0*#CAP``Z@!`E.4$$-CE -M!2#8Y08PV.4'`-CE``"-Y0@`V.4$`(WE"0#8Y0@`C>7<`!_E_O__ZVPPE.41 -M`!/C(```"@0PF.4!`'/C`P``&K@@V.$!.(/B`P!2X1D```I7#83B&`"`X@00 -MB.+^___K`$!0X@!`X`-J```*Z#;4Y=T`4^,P`%,3"@``&NDFU.4"((+B(`!2 -MXR`@H",,((CE$`"(XFX>A.(($('B_O__ZP!`H.-;``#J8`$?Y?[__^L`0*#C -M5P``ZA5`X.-5``#J!@"@X0@0H.&T(-?A)_O_ZP!`H.%/``#JM%#7X0!`E.60 -M`1_EF!$?Y04@H.'^___K;#"4Y1``$^,50.`#10``"@Y01>)T!Y3E``!0XP,` -M``J`%Y3E_O__ZP`PH.-T-X3E``!5XP!`H-,Z``#:!0"@X?[__^MT!X3E@%>$ -MY0``4.,%```:\`$?Y?P1'^5\*@'C_O__ZQ5`X.,N``#J#A"(X@4@H.'^___K -M`$"@XRD``.JT4-?A`$"4Y2@"'^4D$A_E!2"@X?[__^ML,)3E$``3XQ5`X`,? -M```*#E!%XG@'E.4``%#C`P``"H07E.7^___K`#"@XW@WA.4``%7C`$"@TQ0` -M`-H%`*#A_O__ZW@'A.6$5X3E``!0XP4``!J(`A_EB!(?Y:$J`>/^___K%4#@ -MXP@``.H.$(CB!2"@X?[__^L`0*#C`P``ZJP"'^7^___K7D#@XQ(``.H``%3C -M$```&@``E^6T8-?A#2"@X7\]PN,_,,/C"*"3Y090D.`*4-4P`*"@,P``6N,# -M```:"!"@X08@H.'^___K`&"@X0``5N,-0.`3$`"=Y;00U^'^___K!`"@X4S0 -MC>+PC[WH0#"=Y0``4^/M_/\:[_S_ZD`PG>4``%/C"_W_&@W]_^H,0(CB!`"@ -MX403'^7^___K`0!PX@``H#,`,*#CR_W_Z@!`H./4___J%4#@X]+__^KP1RWI -M`&"@X0%`H.'\.PCC`P!2X9X```K^.PCC`P!2X5Y@X!.=```:M`'1X3\`4..5 -M``":$#"1Y0``4^.2```*_O__ZP"`H.$`D*#A``!0XPM@X`.1```*$!"4Y;2A -MU.$-(*#A?SW"XS\PP^,(<)/E"E"1X`=0U3``<*`S``!7XP0``!H*(*#A_O__ -MZP``4.,)```*`P``Z@``6N,&```*"A"@X?[__^L(`*#AM!'4X?[__^L-8.#C -M>```Z@`0F>4!,$'B`P!3XP/QGY=2``#J-(\#`.R/`P`$D`,`')`#`!`0F>7@ -M4I;E###9Y0<`4^,(``"*W##9X0$@H.,2,Z#AW``3XR$``!H@`!/C&P``&@(` -M$^,!```:7F#@XT,``.H"(*#CJ#?_$`'B`0!1XP(```H"`%'A$P`` -M&@8``.H$,*#C$"L!XP(PA><4*P'C`C"%YP!@H.,S``#J!R"@XQ`[`>,#((7G -M!B"@XQ0[`>,#((7G`&"@XRL``.H&`*#A*^;_ZP!@H.$G``#J`&"@XR4``.K@ -M`I;E,!")XKP@V>'5\__K`&"@X1\``.H&`*#A"1"@X;0AU.$]\O_K`&"@X1D` -M`.K@4I;E##"9Y0$`4^,#```*`@!3XUY@X!,2```:!```Z@4`H.'^___K``!0 -MXP0``!H%``#J!0"@X?[__^L``%#C`0``"@!@H.,&``#J`&#@XP0``.H```#C -M``!`X_[__^M>8.#C$@``Z@``5N,0```:$`"4Y;2AU.$-(*#A?SW"XS\PP^,( -M<)/E"E"0X`=0U3``<*`S``!7XP,``!H)$*#A"B"@X?[__^L`H*#A``!:XPU@ -MX!,(`*#AM!'4X?[__^L$``#J%6#@XP(``.H0$('B.OK_ZP!@H.$&`*#A\(>] -MZ!!`+>D`0`#C`$!`XP`PH.,4,(3E9`"@X_[__^L40)3E`@!4XP$``!H,`)_E -M_O__ZP0`G^7^___K$("]Z$`X``!P0"WI`$``XP!`0.,84(3B!0"@X0`0H.,` -M(`#C`"!`X_[__^L%`*#A_O__ZP(PH.,4,(3E<("]Z!!`+>ED,@/C`S"0Y_\T -MP^/_,,/C`0A3XR,```I8,@/C`S#0YP``4^,A```*93(#XP,PT.#3+03C8B!!XY+!@>#) -M#8#B*`"`XB$3@^#^___K`4"@XP(``.H`0*#C````Z@%`H.,$`*#A$("]Z/!% -M+>DLT$WB`E"@X0-@H.'@0I#E!`"@X?[__^L``%#C!```&I`!G^60$9_E_O__ -MZP!`X.-=``#JR#4#XP,PE.<``%/C!```&G0!G^5L$9_E_O__ZP!`X.-4``#J -MM(#5X2``6.,$``":6`&?Y4P1G^7^___K!D#@XTP``.IL,)3E$``3XP0```H\ -M`9_E+!&?Y?[__^L`0.#C1```ZA`[`>,#H)3GMC#5X0``4^,^```*``!8XSP` -M``H@`%CC(("@(P10C>(%`*#A`!"@XR0@H./^___K*'"-XB2`)^4$`(7B!A"@ -MX0@@H.'^___KA&"$XH0PE.5X,(3E!'"'X@8`H.%X$)3E_O__ZP$`4.,=```* -M>%"4Y04`H.$L,)#D>#"$Y0<0H.$$()WE_O__ZP$`4./Q__\:*""5Y00PG>4# -M`%+A[?__&FPPE.4@`!/C`P``"GP@E>4\,93E`P!2X>;__QH$`*#A?!"5Y?[_ -M_^L``%#C!```&E0`G^5`$)_E_O__ZP!`X.,)``#J!`"@X0H0H.'^___K!`"@ -MX000C>+^___K``!0XP!`X`,````*`$"@XP0`H.$LT(WB\(6]Z%A'``!@'P`` -M=$<``)!'``"T1P``X$<``/!/+>DLT$WB`E"@X0-@H.'@0I#E!`"@X?[__^L` -M`%#CF0``"H@U`^,#$)3G``!1XP,```I@`I_E_O__ZP!`X..2``#JR#4#XP,P -ME.<``%/CC0``"ITU`^,#,-3G``!3XXD```H0-=3E`0!3XP,``!H$`*#A_O__ -MZP!`H..#``#J;#"4Y2(-$^,#```*!`"@X?[__^L`0*#C?```ZK0PU>%/#U/C -M*P``&K8PU>$"`!/C(0``"@%PUN4@`%?C('"@HP2`C>((`*#A`!"@XR0@H./^ -M___K%%"&X@0`B.(%$*#A!R"@X?[__^L$<(WEK`&?Y040H.$!(-;E_O__Z_[_ -M_^L-,*#A?UW#XS]0Q>,$,)7E`3"#X@0PA>4$`*#A"!"@X?[__^L`0*#A!#"5 -MY0$P0^($,(7E_O__ZU```.H`,-;E`0!3XU```!I4`9_E_O__ZP!`X.--``#J -M"P!3XT0``)H&`*#A/!&?Y0P@H./^___K`0!0XSX``!JT<-7A#'!'X@Q@AN($ -M`(WB`!"@XR0@H./^___K$*&?Y0B`C>(,D9_E#+&?Y2```.H&`*#A`!``XP`0 -M0.,#((WB_O__ZP-0W>53`%7C&@``&@%@AN(*`*#A_O__ZP%P1^+'7\?A!@"@ -MX=`0G^4"((WB_O__ZP%@AN(!4$7B`B#=Y0(`5>$'``"Z!""-Y0@`H.$&$*#A -M_O__ZPD`H.$+$*#A"""@X?[__^L"<-WE!V"&X`5P9^```%?CW/__RO[__^L- -M,*#A?UW#XS]0Q>,$,)7E`3"#X@0PA>4$`*#A!!"-XO[__^L`0*#A!#"5Y0$P -M0^($,(7E_O__ZP(``.H$`*#A_O__ZP!`H.$``%3C`$"@$P```!H`0.#C!`"@ -MX2S0C>+PC[WH$$@``"1(``!,2```=!\``(Q(``"H2```A!\``(A(``#P3RWI -M6=]-X@"PH.$0$(WE`H"@X10PC>7@DI#EMX0:@H.$&`*#A_O__ZP!04.(+ -M0.`#7=`%/C10$`&@(`A>(\ -M$(WB!""@X_[__^L!`%#C/P$`&@(,5N,";*"C%0V)X@L`@.(%$*#A!B"@X?[_ -M_^M,9XGE`$"@XS8!`.H+`%;C`P``R@``5N,`0*###0``RA4``.H%`*#AT!2? -MY0P@H./^___K`0!0X_7__QH+`*#A$!"=Y0@@H.$%,*#A]_[_ZP!`H.$C`0#J -M!##5YV$@0^)R(._F&0!2XR`P0Y($,,67`4"$X@0`5N'V___*`$"@XWQDG^4$ -M<9;G!P"@X?[__^L`(*#A!0"@X0<0H.'^___K``!0XP,```H!0(3B"0!4X_/_ -M_QKL``#J"`!4XP3QGY?I``#JP)@#`$R9`P#8F0,`&)H#`&2:`P"DF@,`Q)H# -M`.2:`P#@FP,`````XP``0./^___K`#``XP`P0.,40)/E`0!4XP0``!H#0*#A -M&`"#XO[__^L",*#C%#"$Y5PPC>(`(`#C`"!`XP,`DN@#(*#A!`""Y+`0PN'P -M+@_C_R]/XP40H.,6#HWBLA"`X0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`0 -M0.,#(*#C_O__Z\(``.H```#C``!`X_[__^M<,(WB`"``XP`@0.,#`)+H`R"@ -MX00`@N0`$,+E\"X/X_\O3^,$$*#C%@Z-XK(0@.$+`*#A`AP(XTP@C>+^___K -M!0"@X0`0`.,`$$#C`R"@X_[__^L`,`#C`#!`XQ1`D^4"`%3CI0``&@-`H.$8 -M`(/B_O__ZP$PH.,4,(3EGP``ZFPPF>4!`!/C!@``"@4`H.$`$`#C`!!`XWHU -M`>/3()GA_O__ZY4``.H%`*#A`!``XP`00.,#(*#C_O__ZX\``.H+`*#A$!"= -MY2P@C>(4,)WE1/+_ZP``4.,`0*`3+""=!8,^#0,;,T0#DQ+#`,(OH`%#26(` -M!0"@X0`0`.,`$$#C!""@X?[__^M\``#J0!&;Y0`@T>4!,-'E`@#1Y0``C>4# -M`-'E!`"-Y00`T>4(`(WE!1#1Y0P0C>4%`*#A`!``XP`00./^___K;```Z@$P -MH.-*-4%`*#A`!`` -MXP`00.,#(*#C_O__ZUP``.H\0(WB!0"@X0`0`.,`$$#C!""@X?[__^L$`*#A -M`!``XP`00./^___K``!0XP`PH`-(,(T%$P``"CP`C>(`$`#C`!!`X_[__^L` -M`%#C`C"@`T@PC04+```*/`"-X@`0`.,`$$#C_O__ZP``4.,%,*`#2#"-!0,` -M``I\`9_E?!&?Y3P@C>+^___K`#``XP`P0.-(0)WE`$##Y1Q`C>($`*#A2!"- -MX@0@H./^___K"P"@X1`0G>4$(*#A%#"=Y=[K_^L``%#C`@``"C0!G^4L$9_E -M_O__ZP```.,``$#C2!"=Y?[__^L%`*#A`!``XP`00.,#(*#C_O__ZQT``.H` -M,`#C`#!`XP`PT^4``%/C!0``"@(`4^,-0*`#`P``"@4`4^,.0*`#````"@M` -MH.,%`*#A`!``XP`00.,$(*#A_O__ZP`P`.,`,$#C````XP``0.,$$*#A`"#3 -MY?[__^L$``#J!0"@X0`0`.,`$$#C`R"@X_[__^L`D)CEM$#8X04`H.'^___K -M`7"`XG=P_^8'`%3A!'"@,0T@H.%_/<+C/S##XPA@D^4'0)G@!D#4,`!@H#,` -M`%;C!```&@D`H.$%$*#A!R"@X?[__^L`<*#A``!7XPU`X!,````:`$"@XP4` -MH.$*$*#A_O__ZP0`H.%9WXWB\(^]Z'0?``"$40$`B$D``)@?``"D20``\$$<(3BA#"4Y7@PA.4"8(;B!H"@XP<`H.%X$)3E_O__ZP$` -M4.,%```:!`"@X080H.'^___K``!0XQ8```H7``#J>%"4Y04`H.$@,)#D>#"$ -MY080H.$((*#A_O__ZP$`4./K__\:!`"@X7P0E>7^___K``!0XP<```H$`*#A -M"A"@X?[__^L$`*#A!A"@X?[__^L``%#C`0``&@!`X.,```#J`$"@XP0`H.'P -MA[WH6$<``*@?```\2@``<$`MZ0)0H.'@0I#E!`"@X?[__^L``%#C`$"@`Q\` -M``J=-0/C`S#4YP``4^,:```*`#"5Y0,`4^,#\9^7`P``ZFR>`P!DG@,`?)X# -M`'2>`P`50.#C$0``Z@!0H.,$``#J`E"@XP(``.H$4*#C````Z@%0H.,$`*#A -M!1"@X?[__^L``%#C!```"@0`H.$%$*#A_O__ZP!`H.,```#J`$#@XP0`H.%P -M@+WH#""0Y10PD.4#((+@$#"0Y0(`8^`>_R_A``"!Y:`PD.4,,('E$#"!Y50@ -MD.44(('E#`"!Z1[_+^$$`)#E`0!PX@``H#,>_R_A'O\OX?!!+>D`4*#AX$*1 -MY00`H.'^___K``!0XPP```H$`*#A!1"@X?[__^L``%#C!P``NB`T`>/38(3A -M`0"@XP`0H.,&`)#@!Q"AX/,`A.$(``#J*#0!X]-@A.$!`*#C`!"@XP8`D.`' -M$*'@\P"$X04`H.'^___K``"@X_"!O>AP0"WI`$"@X?[__^L-(*#A?SW"XS\P -MP^,$()/E`2""X@0@@^4$`*#A_O__ZP``4.,+```*43V$X@!@#^&```SQ'%"S -MY0$@A>,`((/E!O`AX0$`%>,"```:40V$XA@`@.+^___K#2"@X7\]PN,_,,/C -M!""3Y0$@0N($((/E_O__ZW"`O>AP0"WI`4"@X=<]H.,#,)#GE"&3Y0(PH.$( -M$+/E`0`1XPD```H`8`_A@``,\0!0D^4!$,7C`!"#Y0;P(>$!`!7C`0``"@0` -MDN7^___K!`"@X?[__^MP@+WH$$`MZ0%`H.%@$)'E``!1XP````K^___K`#"@ -MXV`PA.40@+WH\$$MZ0%@H.$"<*#A`5"@X0!`H.-``)7E``!0XP````K^___K -M`4"$X@10A>((`%3C]___&@P`EN4``%#C\(&]"`<0H.'^___K\(&]Z/!!+>D! -M4*#A`@"@X?[__^L,`(7E``!0X_"!O0A_#X#B`P"`XJ`$H.&`!*#A$`"%Y0!` -MH.-@0(7E!&"@X=!PH.,&`*#A!Q"@X?[__^M``(7E``!0XP,``!H@`)_E_O__ -MZP``H./P@;WH`4"$X@10A>((`%3C\?__&@$`H./P@;WHM$H``'!`+>D`0*#A -M`6"@X0)0H.'^___K!0!0X0!0H#$``%;C!0``"A00E.4)`)3H`1!CX`8@H.$% -M,*#A_O__ZQ`PE.4%,(/@$#"$Y00PE.4#,&7@!#"$Y04`H.%P@+WH,$`MZ130 -M3>(`0*#A``!1XQ<```K4,)'E(`!3XQ0``(H7/8/B!3"#X@,Q@.`$,)/E`0!3 -MX0X``!H04(WB`2"@X[`A9>$"`(7BX!"#X@8@H./^___K(`"?Y?[__^O7/:#C -M`P"4YP0<".,-(*#AUSU#XO[__^L4T(WB,("]Z-1*```P0"WI%-!-X@!`H.$` -M`%'C%P``"M0PD>4@`%/C%```BA<]@^(%,(/B`S&`X`0PD^4!`%/A#@``&A!0 -MC>(!(*#CL"%EX0(`A>+@$(/B!B"@X_[__^L@`)_E_O__Z]<]H.,#`)3G`QP( -MXPT@H.'7/4/B_O__ZQ30C>(P@+WH^$H``'!`+>D`0*#A`"``XU@R`>,`($#C -M`R"`YUPR`>,#`(3G25V`X@P`A>(`$*#C`2"@X?[__^L`(`#CB#(!XP`@0.,# -M((3GC#(!XP-`A.<\`(7B`!"@XP$@H.'^___K<("]Z!!`+>D`,`#C`#!`XY0Q -M@>68$8'E8@^!X@`0H.,!(*#A_O__ZQ"`O>@00"WI`$"@X0`P`.,`,$#C:#2` -MY6P$A.5%#H#B#`"`X@`0H.,!(*#A_O__ZP`P`.,`,$#CG#2$Y:!$A.5)#H3B -M`!"@XP$@H.'^___K`#``XP`P0.,D-83E*$6$Y5$.A.((`(#B`!"@XP$@H.'^ -M___K$("]Z!!`+>G^___K$("]Z!!`+>G^___K$("]Z!!`+>G^___K$("]Z/!' -M+>D`0*#AJ##83B -M*`"`X@`0H.-P(@'C_O__ZP<`H.$&$*#A`2N@X_[__^L(D,3G"E#$YP`@H.,0 -M.P'C`R"$YP$@H.,4.P'C`R"$Y_"'O>@`,*#CJ"L)P'C`C"`Y[`G -M`>,",(#G!"@!XP(P@.,!((#G^"@! -MXP(PP.?PA[WH\$(`D*#A`F"@X=T`4>,[```:`0R@X_[__^L`H*#A -M`!"@XP$LH./^___K"@"@X0`0`.,`$$#C$B"@X_[__^L14(KB`4#6Y0)`A.(! -M#%3C!'"@,0%\H",``%?C#0``"@`PH.,#0*#A`(``XP"`0.,%`*#A"!"@X0,@ -MUN?^___K`%"%X`%`A.)T0._F!#"@X00`5^'U__^*!0"@X0`0`.,`$$#C`B"@ -MX_[__^L-0*#A#0"@X0`0H.,0(*#C_O__ZP$PA>(#,&K@@00"WI`$"@X?[__^O7/:#C`P"4Y_[__^L$`*#A_O__ZQ"` -MO>@00"WI`$"@X?[__^O7/:#C`P"4Y_[__^L,`)3E``!0XQ"`O0C^___K#A"@ -MXP$@H./^___K$("]Z!!`+>D`0*#A_O__ZP`P`.,`,$#C`!"3Y5$.A.((`(#B -MR!"!XO[__^L0@+WH$$`MZ?[__^L0@+WH$$`MZ?[__^L0@+WH`0"@XQ[_+^$` -M,*#C"#"!Y0PP@>4!`*#C'O\OX1[_+^$>_R_A$$`MZ0`P`.,`,$#C(#"`Y20` -M@.44`(#B`!"@XP$@H.'^___K$("]Z!!`+>G^___K$("]Z'!`+>D`4*#A`4"@ -MX0@PD>4!,$/B"#"!Y20`D>7^___K`#"@XR0PA.4H,,3E'##4Y0``4^-P@+T8 -M!0"@X1PU`>,#$)7G`""@XP0PH.'^___K<("]Z/!'+>D`<*#A`6"@X5*-@.(X -M@(CB"$"1Y0``5.,^```*<#"1Y:`PA.5T,)'EE#"$Y6@PD>54,(3E;#"0Y1`` -M$^,B```*`0"@X3A0\.7+'8?B(1"!X@8@H./^___K``!0XQH``!H!H!7B!P`` -M"@<`H.'^___K`%"@X00`H.$@$*#C_O__ZP"0H.$%``#J5PV'XA@`@.(X$(;B -M_O__ZP!0H.$`D*#C``!5XP@```K7/:#C`R"7YQ@@A.4$`*#A`Q"7Y_[__^L` -M`%KC#```"@E`H.%H,-3E'S'#YV@PQ.77/:#C`R"7YQ@@A.4$`*#A`Q"7Y_[_ -M_^NZ!L3A!`"@X?[__^L`,*#C"#"&Y08`H.$($*#A_O__ZP$`H./PA[WH``!1 -MXP(```H!`*#A"!"@X?[__^OP-`'CTT"'X0$`H.,`$*#C!`"0X`40H>#S`(?A -M``"@X_"'O>AP0"WI,-!-X@!0H.$!0*#A!`"-X@`0H.,<(*#C_O__ZP``5.,$ -M,)T5!#"#$P0PC14$,)T%"#"#`P0PC04!,*#CN##-X01@C>(&`(;BN!"%X@8@ -MH./^___K($"-X@0`H.$`$*#C$""@X_[__^L<,*#CM#+-X=<]H.,#`)7G!AP( -MXP0@H.$&,*#A_O__ZS#0C>)P@+WH$$`MZ0%`H.$0`)'E``!0XP````K^___K -M)`"4Y0``4.,````*_O__ZP$`H.,0@+WH<$`MZ0%`H.$`4*#C'%#!Y04`H.'0 -M$*#C_O__ZQ``A.4D4(3E*%#$Y4!0A.5$4(3E/%"$Y3A0A.4P4(3E-%"$Y2!0 -MA.4L4(3E!0!0X`$`H!-P@+WH=BM>9-FNQ%CYT?0(F'^A7OZ[+)C@O[[$%GL_U?ZD6_(_=3 -MEN1;F\)U'.&N/6I,6FQ!?@+U3X-<:/11--$(^9/B5/%NW%AM>:56:4$<^*$.D&!('^\*!$>+HEXTOSHOY=P("*!:T_O"%(<`3Q -MWV/!=W6O8T(P(!KE#OUMOTR!%!@U)B_#X;ZB-JS(Y[HK -M,I7FH,"8&=&>?Z-F1'Y4JSN#"\J,*:?BO!T6=JT[VU9D3G0>%-N2 -M"@QL2.2X79]NO>]#IL2H.:0Q-].+\C+50XM9;K?:C`%DL=*RWO\J-9M -M.BS&I?B$[IGVC?\-UKW>L9%48%`"`\ZI5GWG&;5B3>;LFH]%'YV)0/J'[Q6R -MZX[)^PM![+-G7_U%ZB._4_?DEIM;=<+A'#VN3&IL6GY!]0*#3VA<4?31-/D( -MXI.K<1.7IO6Y:```P2Q`8.,?>;SB%AVM=ML[9%9T3A0>DML,"DALN.2?7;UN0^_$ICFH,:33-_*+U3*+0VY9 -MVK"0?$)QQ,RJD-@&!?1F5@Z)R>Y -MV3CK$RNS(C/2NZEP!XDSIRVV/"(5DLD@ATFJ_U!XI7H#CUGX"8`:%V7:US&$ -MQM"X@L,IL%IW'A%[RZC\;=8L.F-\=WOR:V_%,`%G*_[7JW;*@LE]^EE'\*W4 -MHJ^7Q<=@Q%03'(\,8E@6:!Q*`XNLGLG4)@RP:&VY: -MH%([UK,IXR^$4]$`[2#\L5MJR[XY2DQ8S]#OJOM#33.%1?D"?U`\GZA1HT"/ -MDITX];RVVB$0__/2S0P3[%^71!?$IWX]9%T9"]O@ -M,CH*208D7,+3K&*1E>1YY\@W;8W53JEL5O3J97JN"+IX)2XX?B8$6G9CI2;'H?ISE4HWXRAB0V_YD)H09DM -M#[!4NQ8!`@0($"!`@!LV-C:E8V/&A'Q\^)EW=^Z->WOV#?+R_[UK:]:Q;V_> -M5,7%D5`P,&`#`0$"J6=GSGTK*U89_O[G8M?7M>:KJTV:=G;L1)SV-BK4S$Q8C\5%2H,!`0(4L?'E64C(T9>P\.= -M*!@8,*&6ECRDI4C[CX]UQ+R]>EX2$$_534Z9HT=&Y`````"SM[<%@("!`'_S\ -MX\BQL7GM6UNVOFIJU$;+RXW9OKYG2SDY6JJD\6^_OMQ4-#AM=-39I5,S-FE(6%$<]%18H0^?GI!@("!(%_?_[P -M4%"@1#P\>+J?GR7CJ*A+\U%1HOZCHUW`0$"`BH^/!:V2DC^\G9TA2#@X<`3U -M]?'?O+QCP;:V=W7:VJ]C(2%",!`0(!K__^4.\_/];=+2OTS-S8$4#`P8-1,3 -M)B_L[,/A7U^^HI>7-JQD9,CG75VZ -M*QD9,I5S<^:@8&#`F(&!&=%/3YY_W-RC9B(B1'XJ*E2KD)`[@XB("\I&1HPI -M[N['T[BX:SP4%"AYWMZGXEY>O!T+"Q9VV]NM.^#@VU8R,F1..CIT'@H*%-M) -M29(*!@8,;"0D2.1<7+A=PL*?;M/3O>^LK$.F8F+$J)&1.:25E3$WY.33BWEY -M\C+GY]5#R,B+63KJSZ]E9GKTZ:ZN1Q@("!#5NKIOB'AX\&\E)4IR+BY<)!P<./&FIE?' -MM+1S4<;&ER/HZ,M\W=VAG'1TZ"$?'S[=2TN6W+V]88:+BPV%BHH/D'!PX$(^ -M/GS$M;5QJF9FS-A(2)`%`P,&`?;V]Q(.#ARC86'"7S4U:OE75Z[0N;EID8:& -M%UC!P9DG'1TZN9Z>)SCAX=D3^/CKLYB8*S,1$2*[:6G2<-G9J8F.C@>GE)0S -MMIN;+2(>'CR2AX<5(.GIR4G.SH?_556J>"@H4'K?WZ6/C(P#^*&A68")B0D7 -M#0T:VK^_93'FYM?&0D*$N&AHT,-!08*PF9DI=RTM6A$/#Q[+L+![_%14J-:[ -MNVTZ%A8L4*?T45-E07[#I!<:EEXG.LMKJSOQ19T?JUCZK),#XTM5^C`@]FUV -MK9%VS(@E3`+U_-?E3]?+*L6`1#4FCZ-BM4E:L=YG&[HEF`[J1>'`_ET"=2_# -M$O!,@:.71HW&^=-KYU^/`Y6FV_VEE2E2V#OM33(718*6G@243(R8YJ -MB<)U>'F.]&L^6)G=<;DGMD_AOA>MB/!FK"#)M#K.?1A*WV.",1KE8#-1ET5_ -M4V+@=V2QA*YKNQR@@?Z4*PCY6&A(OVI#GL@PNJ -M[V!`!I]Q7E$0;KWYBB$^/0;=EJX%/MU&O>9-M8U4D05=Q'%OU`8$_Q508"3[ -MF!F7Z;W6S$-`B7>>V6>]0NBPB(N)!SA;&>?;[LAY1PI\H>D/0GS)'H3X```` -M`(.&@`E([2LRK'`1'DYR6FS[_P[]5CB%#Q[5KCTG.2TV9-D/"B&F7&C15%N; -M.BXV)+%G"@P/YU>3TI;NM)Z1FQM/Q<"`HB#<86E+=UH6&A(<"KJ3XN4JH,!# -MX"(\'1<;$@L-"0ZMQXORN:BV+[]8'^CGR8!][SU -M%";S%]J8D9^5,(3C?;HN-B07O[L[VPEX)LWT&%EN`;>:[*B:3X-E;I7F?N;_ -MJ@C/O"'FZ!7OV9OGNLXV;TK4"9_JUGRP*:^RI#$Q(S\J,)2EQL!FHC4WO$YT -MILJ"_+#0D.`5V*&XAJ3+@?+,%_465&!.I>G5TUC`%S=(?Z+D$+^UH=9[-2TMN2,U80Z1-' -MUFV,8=>:>@RA-XX4^%F)/!/K[B>ISC7)8;?MY1SA/+%'>EG?TIP_<_)5>*\ -MBTD\*$&5#?]Q`:@YWK,,")SDM-B0P59D883+>W"V,M5T7&Q(0E>XT%():M4P -M-J4XOT"CGH'SU_M\XSF"FR__AS2.0T3$WNG+5'N4,J;"(SWN3)4+0OK#3@@N -MH68HV22R=ENB26V+T25R^/9DAFB8%M2D7,Q=9;:2;'!(4/WMN=I>%497IXV= -MA)#8JP",O-,*]^18!;BS10;0+!Z/RC\/`L&OO0,!$XIK.I$104]GW.J7\L_. -M\+3F2": -MV\#^>,U:]!_=J#.(!\`[%]@47^I&;5*#2WE>I^3R9SOH.`[3:XJ -M];#(Z[L\@U.9819FYV?H:.E`````0(#!`4&!P@)"@LD -M*"PP-#@\0&1H;'!TA(B,E9F=H:4````````@`0(#!`4&!P@)"@LD*"PP-#@\ -M0&1H;'!TB(R5F9VAI0`````````?`0(#!`4&!P@)"@L,#20H+#`T.#Q`9&AL -M<'1X?("$B(P````````@`0(#!`4&!P@)"@L,#0`````````````````````` -M```````````-`0(#!`4&!P@)"@L,#0`````````````````````````````` -M```-`0(#!`4&!P@)"@L,#0XD*"PP-#@\0``````````````````````6`0(# -M!`4&!P@)"@L,#0XD*"PP-#@\0``````````````````````6`0(#!`4&!P@) -M"@L,#20H+#`T.#Q````````````````````````5`0(#!`4&!P@)"@L,#0XD -M*"PP-#@\0``````````````````````6`0(#!`4&!P@)"@L,#0X````````` -M```````````````````````.`0(#!`4&!P@)"@L,#0`````````````````` -M```````````````-`0(#!`4&!P@)"@LX/$!D:&QP=(B,E9F=H:4````````` -M```````:`0(#!`4&!P@)"@N5F9VAI0`````````````````````````````0 -M`0(#!`4&!P@)"@LD*"PP-#@\0)69G:&E```````````````````8`0(#!`4& -M!P@)"@LD*"PP-#@\0&1H;'!T>'R5F9VAI0`````````?`0(#!`4&!P@)"@LD -M*"PP-#@\0``````````````````````````3`0(#!`4&!P@)"@L,#20H+#`T -M.#Q`9&AL<'1X?("$B(P````````@`0(#!`4&!P@)"@LD*"PPE9F=H:4````` -M```````````````````4`0(#!`4&!P@)"@L,#20H+#`````````````````` -M```````````1````:6YI=%]C:&%N;F5L7W-E=`````!R='=?:'1?;W!E5]S=7-P96YD`````X``'P.``"`#@`` -MA`X``(@.``",#@``T`X``-0.``#8#@``W`X``.`.``#L#@``(@4``%`%``!1 -M!0``0`````0,```(#```=`@``&@+``!L"P``<`@``&`(``!D"`````@``!0, -M```<#```3`P``'@,``"`#```B`P``)0,``"<#```H`P```0)```$#`````@` -M``@,``!T"```<`@``&`(``!D"```7`@``&P.``!P#@``=`X``'@.``!\#@`` -M@`X``(0.``"(#@``C`X``-`.``#4#@``V`X``-P.``#@#@``[`X``"(%``!0 -M!0``404``$````"D)=L$I"4;"V@+``!L"P``)_#__R^@5:HG````+U"J50`. -M!`X0#A0.&`X<#C`(-`@\"$@(3`AH"/_______P``D`P``)$,``"2#```F`P` -M`)D,``":#```D`P``)$,``"2#```F`P``)D,``":#```'````!P````=```` -M'0```!X````?```````````````!`````0````(````"`````P```!P````= -M````'@```!X````>````'P```````````````0````(````"`````P````,` -M`````0,$!@<)"@P-#Q`2$Q4`_@&`?^(!@'C'``#"D/@`PI@``3Z0^ -M`$^D7@!/I```*Z1>`"*D7@!/I```3Z0``$^D``!/I%X`'$->`"ND7@`PI@`` -M'$->`"ND7@`KI%X`*Z1>`/_______P``4V5T1G=2%]R;V%M:6YG7W1I;65S`')T;#@Q.3)C=2YR='=?:'=P=W)P -M7V1E=&5C=`!R=&PX,3DR8W4N5]T:')E7!E``!R=&PX,3DR8W4N%]S971?97-S:60`````0U-#04X@4P$``%,``````')T=U]W>%]S971?%]S971?=V%P``#@BP```D@` -M`')T=U]W'0```````#CBP````````````````````````````#D -MBP```4@``&%P:6YF;P````````````#EBP```D@``'-E='!I9``````````` -M``#FBP```4@``'=P0#HBP```4@``'=P7!T -M"@```')X(&)C+VUC('!A8VME=',L('1O('!E7!T"@````!B97-T7V-H86YN96Q?-4<@/2`E9`H```!B97-T7V-H86YN -M96Q?,C1'(#T@)60*``!R%]U"5X"@``875T:%]A;&<],'@E>"P@96YC7V%L9STP>"5X+"!A=71H -M7W1Y<&4],'@E>"P@96YC7W1Y<&4],'@E>`H`9G=S=&%T93TP>"5X"@```"5S -M"@!V,RXP+C(R,S`N,C`Q,3`W,C@``'-T85]D>E]B:71M87`],'@E>"P@=&EM -M7V)I=&UA<#TP>"5X"@````!S=&$G#HE,#)X -M.B4P,G@Z)3`R>#HE,#)X"@````!R='-E;CTE9"P@8W1S,G-L968])60*``!Q -M;W-?96X])60L(&AT7V5N/25D+"!I;FET7W)A=&4])60*``!S=&%T93TP>"5X -M+"!A:60])60L(&UA8VED/25D+"!R86ED/25D"@``8G=M;V1E/25D+"!C:%]O -M9F9S970])60L('-G:3TE9`H`````86UP9'5?96YA8FQE(#T@)60*``!A9V=? -M96YA8FQE7V)I=&UA<#TE>"P@8V%N9&ED871E7W1I9%]B:71M87`])7@*``!S -M;&5E<'%?;&5N/25D"@``=&ED/25D+"!I;F1I8V%T95]S97$])60*`````"5U -M("5U````"`E>````&EN=F%L:60@#HE,#)X.B4P,G@Z)3`R>`H```!R='=?"D],'@E>`H```!R='=?7!E/25D(&QE;CTE -M;'4I"@!U;FMN;W=N('9E;F1O#HE,#)X.B4P,G@@;&5N/25L -M=2D*`````$E%144@.#`R+C$Q(&5L96UE;G0@<&%R#HE,#)X.B4P,G@Z)3`R>#HE,#)X*2P@;&5N9W1H.B5D"@``2!A;F]T:&5R(')O86UI;F<* -M`"5S(')O86UI;F<@9&]?:F]I;B!R971U#HE,#)X.B4P,G@Z)3`R>#HE -M,#)X.B4P,G@I"@```"5S.B!?1E=?3$E.2T5$('=H:6QE(&%S:U]F;W)?:F]I -M;F)S#HE,#)X.B4P,G@Z)3`R>"D@`H`````8VAA;FYE -M;"!P;&%N(&ED(&5R7!E(0H``$A4.B!35$$@)3`R>#HE,#)X.B4P,G@Z)3`R -M>#HE,#)X.B4P,G@@2%0@0V%P86)I;&ET:65S($EN9F\Z(#!X)3`T>`H`)7,@ -M4U1!("4P,G@Z)3`R>#HE,#)X.B4P,G@Z)3`R>#HE,#)X("T@;F\@9W)E96YF -M:65L9"P@;G5M(&]F(&YO;BUG9B!S=&%T:6]N#HE,#)X.B4P,G@Z)3`R>#HE,#)X("T@,C`@34AZ($A4+"!N=6T@ -M;V8@,C!-2'H@2%0@4U1!#HE -M,#)X.B4P,G@Z)3`R>"`M(&YO($A4+"!N=6T@;V8@;F]N+4A4('-T871I;VYS -M("5D"@````!R.#%]S971?2!F86EL -M960L(&UA8U]I9"AA:60I/25D"@```%=R:71E($-!32P@;6%C7V%D9'(])7@Z -M)7@Z)7@Z)7@Z)7@Z)7@L(&-A;5]E;G1R>3TE9`H`````5]H9&PH*3H@"4P,G@I+"!0051(+4(H,'@E,#)X*0H`````($]&1$T@+4%L87)M($1!,B@P -M>"4P-'@I+$1!-"@P>"4P-'@I+$1!-B@P>"4P-'@I+$1!."@P>"4P-'@I"@`` -M`"!#0TL@+4%L87)M($$U0B@P>"4P,G@I+$$U0R@P>"4P,G@I"@````!R97!O -M"5X+"!A`H```!S=&%T:6]N(&%I9"`E9"!E>&-E960@=&AE(&UA>"!N=6UB97(* -M````875T:"!E>'!I"5X"@````!A9&1?4D%4:61?8FUC7W-T82!E#HE,#)X.B4P,G@Z -M)3`R>"!S96YT(&EN=F%L:60@87-S;V-I871I;VX@#HE,#)X.B4P,G@Z)3`R -M>#HE,#)X('1R:65D('1O('5S92!42TE0('=I=&@@2%0@87-S;V-I871I;VX* -M`````"`@;VQD($%)1"`E9`H````@(&YO(')O;VT@9F]R(&UO65R("T@:&]S=&%P9`H````K3VY!=71H -M"@````!A=71H(&%L9STE>"P@%]S97$])60L(&5X<%]S -M97$])61=(0H````H,BEA=71H(')E:F5C=&5D(&)E8V%U'!?'!?"D* -M````"D*`````&Y296UA:6Y?3&5N9W1H(&ES("5D(&%N9"!N4W5B9G)A -M;65?3&5N9W1H(&ES(#H@)60*``!S:V)?8VQO;F4H*2!&86EL(2$A("P@;G)? -M"`*`'=O"D@:7,@:6YV -M86QI9"$A"@````!";'5E5&]O=&@@0E1?06YT7TYU;2`]($%N='@R"@```$)L -M=654;V]T:"!"5%]!;G1?3G5M(#T@06YT>#$*````0FQU951O;W1H($)47T-O -M97AI7!E(#T@0E1?,E=I7!E(#T@0E1?06-C96P*`````$)L=654;V]T:"!"5%]#;V5X:7-T5'EP92`] -M($)47T-34E]"0S0*``!";'5E5&]O=&@@0E1?0V]E>&ES=%1Y<&4@/2!"5%]2 -M5$PX-S4V"@``0FQU951O;W1H($)47T-O97AI7!E(#T@56YK;F]W;@H` -M0FQU951O;W1H($)47T%N=%]I0H````` -M0FQU951O;W1H($)47U-E"5X"@``0VAI<"!697)S:6]N($E$.B!615)324].7TY/4DU! -M3%]44TU#7T-(25!?.3)#7S%4,E(N"@````!#:&EP(%9E&-E960@,'@E6"X@0VAE8VL@:70N"@```&-H:W-U;2!R97!O"4P.'@@+@H`4&]L;&EN9R!&5R!R96%D>2!F86EL -M(2$@4D5'7TU#54971$PZ,'@E,#AX("X*````1$P@1FER;7=A"!O;FQY(%1X($]+"@!&86EL960``%-U8V-E5]#;VYF:6="0E=I=&A(96%D97)&:6QE -M*"DZ(&1O(&YO="!S=7!P;W)T('1E#0X."`@/25X"@```%)A=&EO(#!X-#AC("`])7@* -M````3T9&`$].``!"5%\E#1F9"!T;R`E>`H`8E)E9T)4 -M7U-C;R`]("`E9`H```!2871I;U]4>#TE9`H`````4F%T:6]?4%))/25D"@`` -M`&)T7W-C;R`@/3TS($9O;&QO=R!#;W5N=&5R"@!"5"!465!%(%-E="!T;R`@ -M/3T^($)47U-#3PH`0E0@5%E012!3970@=&\@(#T]/B!"5%]/=&AE#1F9"!T;R`E>`H`8E=I9FE#;VYN96-T -M0VAA;F=E("5D+"!B0G13=&%T94-H86YG92`@)60L8E)S&ET(%)E9U\P>#0P("@E,G@I"@````!"5%]$:7-A;&QO -M=R!!35!$52`*`$)47T%L;&]W($%-4$15("!24U-)(#X]-#`*``!"5%]!;&QO -M=R!!35!$52!"5"!)9&QE"@!"5%])&ES=`H`0E1?5'5R;B!/1D8@0V]E>&ES=`H`````0E1?5'5R;B!/ -M3B!#;V5X:7-T*%)E9S!X-#0@/2`P>#$P,3`P*0H``$)47U1U2!S=&%T -M92!4>"`H)60I(#XS-3`@<&%R86UE=&5R*#!X)7@I(#T@,'@E>`H```!"5"!I -M;B!"5%]"=7-Y('-T871E('!A"5X*2`](#!X)7@*`$)4(&EN -M($)47U-#3R!S=&%T92!4>"`H)60I(#XQ-C`@<&%R86UE=&5R*#!X)7@I(#T@ -M,'@E>`H`0E0@:6X@0E1?4T-/('-T871E(%1X("@E9"D@/#$V,"!P87)A;65T -M97(H,'@E>"D@/2`P>"5X"@!"5"!I;B`@4W1A=&4@("5D("!A;F0@<&%R86UE -M=&5R*#!X)7@I('5S92!O"5X*2`](#!X)7@*``!"5"!3970@4F9296

#%%6S"5X(`H``$)47TES;VQA=&EO;DAI9V@*````0E1?06QL;W<@04U01%4@ -M8G0@:7,@;V9F"@```$)47U1U"P@=7-B("5S("!F86EL("QS=&%T=7,Z)60@=F%L=64],'@E>`H` -M``!C86YN;W0@"DL=7)B -M7W-T871U2!F;W(@ -M2$%,($1!5$$@"@`````]/3X@1&ES86)L92!A;&P@9'EN86UI8R!F=6YC=&EO -M;BXN+@H`````/3T^($1I"!P -M;W=E`H````]/3X@=')I9V=E0H```!3;&EM0V]M8F]$8F<@/3T@5%)5 -M10H```!C87)D(&1I"DE"5X"@```$)4('=R:71E(#!X -M)7@@/2`P>"5X(&9O$,P-"`] -M(#!X)7@*``!"5"!W$0P-"`](#!X)7@*``!P>&UI=&9R86UE+3YF -M%]S:V)?<75E=64@;F]T(&5M<'1Y"@``='AD -M;6%S=&%T=2@E>"D*`#T]/B5S(&5R"5X*2`*```]/3X@ -M)7,@=VEF:5]S=&%T=7,H,'@E>"D*````='@@:&%N9RXN+G-T87)T(')E0H`56YA -M8FQE('1O(&-R96%T95]P0H`34%#($%D9')E#HE,#)X.B4P,G@Z)3`R>`H`````=VQA;B5D```C(R,C(R,C(R,C -M(R`@#HE,#)X.B4P,G@Z)3`R>"DL(&QE;F=T:#HE9"!A -M%T*``!W<&%? -M"``(#!X)3`X>"`````` -M"@```#!X)3`U>```)7,Z(&EN/25S"@``+````')E86QM87````* -M"0``)7,*"0````!M86,`=FED<&ED``!A8FQEF5=(#T@)60`6R5S72!W<'-?```"CT]/3T]/3T@0D(@4D5' -M(#T]/3T]/3T*``````H]/3T]/3T]($U!0R!214<@/3T]/3T]/0H```!R='=? -M"D],'@E>`H```!R='=?"5X*3TP -M>"5X"@!R96%D7V)B"5X -M*3TP>"5X"@!R96%D(%)&7W)E9R!P871H*#!X)3`R>"DL;V9F"D*`````'=R:71E(%)&7W)E9R!P871H*#!X)3`R>"DL -M;V9F"D*````9G=S=&%T93TP>"5X"@`` -M`&%U=&A?86QG/3!X)7@L(&5N8U]A;&<],'@E>"P@875T:%]T>7!E/3!X)7@L -M(&5N8U]T>7!E/3!X)7@*`'!M;&UE:6YF;RT^`H``'%O#HE,#)X -M.B4P,G@Z)3`R>#HE,#)X.B4P,G@*`````')T`H``'1I9#TE9"P@:6YD:6-A=&5?"5X+"!A`H````H02E$349L86<],'@E>`H`8E-U&UI=&)U9E]C;G0])60L(&9R965?>&UI -M=&9R86UE7V-N=#TE9`H`"5X+"!T:6U?8FET;6%P/3!X)7@*`````'-L965P<5]L96X] -M)60*``!D=6UP(')X('!A8VME="`H)60I"@`````C(R,C(R,@2!F=6YC=&EO -M;@H````@/3T]($1-1FQA9R@P>"4P,G@I(#T]/2`*````97AT6YA;6EC(&9U;F,@"@!E>'1R85]A'1R -M85]A&ES=&5N8V4@+2!"250H,RD* -M````97AT'1R85]A"5X"@!W&,U."D],'@E>`H` -M"5X"@!D8F#8P."D],'@E>`H`````9&)G*#!X,C@P*3TP>"5X"@`` -M``!D8F#(X."D],'@E>`H`````9&)G -M*#!X-C8T*3TP>"5X"@````!D8F#0S -M."D],'@E>`H`````9&)G*#!X-#0P*3TP>"5X"@````!D8F#0X-"D],'@E>`H`````9&)G*#!X-#@X*3TP>"5X"@`` -M``!D8F#0T."D],'@E>`H`````9&)G -M*#!X-#1C*3TP>"5X"@````!D8F#HE,#)X.B4P,G@Z)3`R -M>`H`````.#%]D2!F;W(@;F]R;6%L(&UO9&4L(&-A -M;B=T(&5N=&5R(&UP(&UO9&4*````/3T^('1R:6=G97(@9W!I;R`P"@`]/3X@ -M`H```!; -M%]S971?<&UK:61=($E77U!-2U-!7U)%34]612$*`````%MR='=?=WA? -M2!I;F1E>"`]("5D(&9O`H`````16YC6EN -M9&5X7W!R;W9I9&5D(#T](#$I+"!K97EI9#TE9"P@:V5Y7VQE;CTE9`H`5T50 -M`'=P85]S971?96YC#TE9`H``'=E<"P@#TP -M"@``;F]N90````!42TE0`````$-#35``````)7,N+BYC86QL(')T=U]I;F1I -M8V%T95]D:7-C;VYN96-T"B``4T54(%=04U])10H`4T54(%=04U])12P@=W!S -M7W!H87-E/3U?5%)510H```!)145%(#@P,BXQ,6)N````245%12`X,#(N,3%B -M`````$E%144@.#`R+C$Q8F=N``!)145%(#@P,BXQ,6)G````245%12`X,#(N -M,3%A;@```$E%144@.#`R+C$Q80````!)145%(#@P,BXQ,6=N````245%12`X -M,#(N,3%G`````'5N87-S;V-I871E9``````@4F%T97,@*$UB+W,I.B`````` -M`"XU```E9"5S(````'=X7V=E=%]S8V%N+"!M8W-?`H``'=P85]I93T`)3`R>`````!R#HE,#)X.B4P,G@Z)3`R>`H` -M`')T=U]D96Q?#HE,#)X.B4P,G@Z)3`R>#HE,#)X"@`` -M7!T:6]N+"!C%]S971?96YC5]I9'@])60L(&QE;CTE9`H` -M```@2P@5T50"@`E2P@5$M)4`H`````)7,L('-E="!G2P@ -M5T50"@``)7,L('-E="!P86ER=VES92!K97DL(%1+25`*`"5S+"!S970@<&%I -M2P@;F]N90H` -M#HE -M,#)X.B4P,G@Z)3`R>`H`#HE,#)X.B4P,G@Z)3`R>``E*G,@ -M)7,``%53``!%50``2E```"5S('5N:VYO=VX@8V]U;G1R>5]C;V1E.B5S"@`E -M&UI=%]U -M``"PL*B`I!X``+"PJ("P'@``L+"H@-`>``"PL*B`W!X``+"PJ(!T'P``L+"H -M@(`?``"P7X"`!"```+"PIX"$(```L+"P@-@@``"PKP2`["$``+"PH8`<(@`` -ML+"A@$@B``"PL+"`:"(``+"PJH"8(@``L+"@@"`C``"PL*R`5",``+"PJH#D -M(P``L*L(@/`D``"PIP&`'"<``+"G`X#H*0``L+"@@!0J``"PL*"`0"H``+"P -ML(!4*@``L*H#@!0K``"PL*J`0"L``+"PL(#$*P``L*L(@"@M``"PKQ*`?"X` -M`+"PHX`D+P``L+"P@+@O``"PL*.`S#```+"PHH"(,0``L+"@@+0Q``"PL+"` -MQ#$``*\_#H#<,P``KC\+@'`U``"PKRJ`T#H``+"PKH#D.P``L*\L@`Q#``"P -ML*R`H$,```````!D1```KS\*@!A&``"PL+"`+$8``+"O`H"\1P``L*@#@"Q( -M``"PJP*`H$@``+"H`8#L2```L*@!@#A)``"PL*B`:$D``+"PJ("820``L+"H -M@,A)``"PJ`.`+$H``+"PJ(!<2@``L+"H@(A*``"PKPJ`.$T``+"K"H!(3@`` -ML*H%@!Q/``!?A`:`+%$``+"L`8!,4@``L*L.@'A3``"PL*B`F%,``+"PJ("X -M4P``L+"H@-A3``"PL*B`^%,``+"PJ(`85```L+"H@#A4``"PL*B`6%0``+"P -MJ(!X5```L+"H@)A4``"PL*B`N%0``+"PJ(#X5```L+"H@!A5``"PL*B`6%4` -M`+"PJ(!\50``L+"H@)Q5``"PL*B`P%4``+"PL(#$50``L+"P@,A5``"PL*B` -M&%8``+"PL(`L5@``L+"H@)A6``"PL*R`'%<``+"PJH#05P``L*X!@"1=``"P -ML*B`8%T``+"J"8`$7@``L+"H@'!>``"PL*J`C%\``+"PJH`$80``L+"L@'!C -M``"PL*J`]&0``+"@!(!P90``L+"@@/!E``"PL*"`1&8``+"PJ(",9@``L+"B -M@.1F``"PL*"`)&<``+"PJ(!`9P``L+"P@(AG``"PL*J`L&<``+"PJH#49P`` -ML+"J@!AH``"PL*J`2&@``+"K`H"4:0``L*\&@!QM``"PL*J`T&T``+"L`X`L -M;P``L*\$@/QO``"PJ0*`:'```+"O!("D<0``L+"H@$AR``"PL*R`*',``+"P -MJ(#,````(0"@'AX``"P -ML*B`S'@``+"PK(!T>0``L*P!@.AZ``"PKPZ`:'P``+"PJH#4?0``L*D"@(Q^ -M``"PL*J`<'\``+"PJ("D?P``L*P!@'2```"PL*B`@(```*\$LH`\A@``L+"N -M@*R'``"PL*R`5(@``+"PK("XB```L+"H@'R)``"PL*B`Q(D``+"PJ(#0B0`` -ML+"J@""*``"PL*B`+(H``+"PJ(!8B@``L+"H@*R*``"PJ@6`D(L``+"PJH#8 -MBP``L+"N@+"-``"PL*B`#(X``+"PK(!``"PL*R`O)X``+"PJ(#(G@``L+"J@&2?``"PL*B` -M<)\``+"PKH#DH```L+"J@'RA``"PL*R`6*(``+"PJ(!XH@``L+"H@*2B``"P -ML*B`L*(``+"PK("HHP``L+"H@+2C``"PL+"`O*,``+"PL(#$HP``L+"P@,RC -M``"PL+"`U*,``+"PL(#`0"PL+"`/!X!`+"PL(!@ -M'@$`L+"P@(0>`0"PL+"`P!X!`+"PL(#D'@$``(0"@`P?`0"PL*B`*!\!`+"O -M!(!4(`$``(0(@*0@`0"PL*"`!"$!`+"O`H`4(@$`L*L"@#`C`0"PL+"`U",! -M`+"PH(#X)0$`L+"L@$PF`0"PL*R`F"8!`+"PL("L)@$`L+"@@/PF`0"PL*"` -M0"`$`L+"L@'!Y`0"PL*B`B'D!`+"PK(!\>@$`L*X/@&1_ -M`0"PL*R`#((!`+"PJH"\@@$`L+"J@&"#`0"PL*J`)(0!`+"PJH#4A`$`L*D" -M@'"%`0"PKQJ`%(\!`+"PJ(!TCP$`L+"L@&B0`0"PL*B`B)`!`+"PJ(#8D`$` -ML*\"@%R3`0"PL+"`O),!`+"PL(`4E`$`L+"H@"B4`0"PL*B`/)0!`+"PH(!X -ME`$``(0"@*24`0``A`*`R)0!`+"PJ(#`0"PL*B`I)X!`+"K!(",GP$`L*L$@'"@`0"P -ML*R`2*$!`+"PJ(!DH0$`L+"H@("A`0"PL*B`G*$!`+"PJ("XH0$`L+"H@-2A -M`0"PL*B`\*$!`+"PJH!,H@$`L+"J@'BB`0"PL*B`E*(!`+"PH("XH@$`L+"P -M@,BB`0"PL+"`9*4!`+"PH("`IP$`L+"P@,BH`0"PKP:`J*L!`+"H`8#HJP$` -ML*H#@#RL`0"PL*R`C*P!`+"L`8"XK0$`L*X#@,RN`0"PKPJ`++(!`%^$!H#L -ML@$`L*\,@("V`0!?A`*`'+'`"`+"H!8"X -M<`(``(0&@/QP`@``A`:`0'$"``"$!H"`<0(`K#\#@.AQ`@"PL*R`R',"`+"P -MK(#$=0(`L+"N@$!V`@"PKPJ`\'@"`+"PL(#T>`(`KPBQ@'AY`@"PL*"`7'H" -M`+"PH("X>@(`L+"A@"1[`@"PL+"`+'L"`+"PJH#,?`(`L+"J@!!^`@"PL*B` -MZ'X"`+"PKH#H@0(`L*\P@-2(`@"PL*J`6(D"`+"PJH#8B0(`L+"J@&B*`@"P -ML*J`R(H"`+"PJH!0BP(`L+"J@-R+`@"PL*B`!(P"`+"PJ("8C`(`L+"J@'2- -M`@"PL*J`_(X"`+"PJ(`PCP(`L*\"@$R1`@"PL*J`X)$"`+"PKH! -M`P"PL*J`2"`#`+"PJ(!L(`,`L+"H@'@@`P"PL*Z`!",#`+"PJH!<(P,`L+"L -M@/0D`P"PL+"`-"4#`+"PL(`\)0,`L+"P@(PE`P"PL*"`W"4#`+"PL(`@)@,` -ML+"P@#PF`P"PL*"`D"8#`+"PL("L)@,`L+"P@,@F`P"PL+"`X"8#`+"H`8`8 -M)P,`L+"P@"`G`P"PL+"`*"<#`+"PL(`P)P,`L+"P@#@G`P"PL+"`0"<#`+"P -ML(!()P,`L+"P@%`G`P"PL+"`6"<#`+"PL(!@)P,`L+"P@&@G`P"PL*"`Z"<# -M`+"PJH",*`,`L+"H@'PI`P"PKP:`N"H#`+"PJH``*P,`KRJR@$0S`P"PK`&` -MB#0#``P````T.0,`L*L$@"`[`P"PJ@&`I#P#`+"PJH#8/`,`L+"N@'`]`P"P -ML*Z`B#X#`+"PJ("@/@,`L*\*@"!+`P"PL*B`2$L#`+"O%H!@3@,`L*\"@+A1 -M`P"PK@.`%%0#`+"PJH"$50,`L+"H@+A5`P"PL*J`"%8#`+"PJH!T5@,`L*P' -M@`Q9`P"PL*Z`X%P#`+"PKH`H7@,`L+"J@%1?`P"PKP2`*&,#`+"PJ(!`8P,` -M7X0"@.AD`P"PJ@>`/&8#`+"K`H#`9P,`KPBQ@`!I`P"PL*J`=&D#`*]$LH!0 -M=0,`L*\&@'QV`P"PL*J`X'8#`+"I!(`X=P,`L*D$@)!W`P"PJ02`T'<#`+"P -MKH#(>`,`L+"H@/AX`P"PJ@&`W'D#`+"O$H!4C@,`L+"N@/R0`P"PL*B`/)$# -M`+"PJH!TD0,`L+"H@#22`P!?A`J`")0#`+"O"H#$E@,`KS\8@.R<`P"PL*Z` -M#)X#`+"PJH"TG@,`L+"P@,R>`P"PL+"`[)X#`+"PL(#\G@,`L+"P@`"?`P"P -ML*R`?)\#`+"PJH``H`,`L+"J@%B@`P"PL*B`?*`#`+"PK(#(H`,`L+"L@$RA -M`P"PL*J`J*$#`+"I!(`HH@,`L*D$@*BB`P"PL*J`"*,#`+"PJ(`PHP,`L+"H -M@*2C`P"PL*B`L*,#`+"PJ("\HP,`L+"H@,BC`P"PL*Z`M*0#`+"N`X#$I0,` -ML+"H@.BE`P"PL*B`(*8#`+"PJ(!,I@,`L+"H@%BF`P"PL*B`9*8#`+"PL(!L -MI@,`L+"P@("F`P"PL+"`A*8#`+"PL("(I@,`L+"H@+"F`P"PL*B`O*8#`+"P -MJH`0IP,`L+"N@&2H`P"PJ@N`^*@#`+"PJ(`HJ0,`L+"J@``````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````!\`P````````0`````````?`,````````$`````````#`` -M````````!``````````4`````````!<`````````!@`````````&```````` -M``@`````````#0`````````$``````````X`````````!`````````!L```` -M``````0``````````@`````````$```````````````````````````````` -M```````````````````````````````````````````````````````````` -M``````````````````````````````````````````````P````````````` -M```````````````````````````````````````````````````````````` -M````````````````````````````````?`,````````````````````````` -M```````````````!`````````````````````0`````````"``````````,` -M````````!``````````%``````````8`````````!P`````````(```````` -M``D`````````"@`````````+``````````P`````````#0`````````.```` -M``````\`````````$``````````1`````````!(`````````$P`````````4 -M`````````!4`````````%@`````````7`````````!@`````````&0`````` -M```:`````````!L`````````'``````````=`````````!X`````````'P`` -M```````@`````````"$`````````(@`````````C`````````"0````````` -M)0`````````F`````````"<`````````*``````````I`````````"H````` -M````*P`````````L`````````"T`````````+@`````````O`````````#`` -M````````,0`````````R`````````#,`````````-``````````U```````` -M`#8`````````-P`````````X`````````#D`````````.@`````````[```` -M`````.[N[NX$````@H2+E@P2&"0P2&!L``^L```/K`$`#ZP"``^L!``/K`4` -M4/(``%#R`0!0\@(`4/($`%#R!0!0\@$`````1!<````````!````7!<````` -M```"````:!<````````#````=!<````````$````@!<````````%````D!<` -M```````&````K!<````````'````N!<````````(````Q!<````````1```` -MU!<```````!_````X!<`````````4/(!`%#R`@!0\@3_`````0`````````` -M````__\```$```````````````!0\@(!`0```````*@6````````$````+06 -M````````(````,`6````````,````-`6````````0````.`6````````4``` -M`.P6`````````````/@6`````````````/@6````````@`````07```````` -MD````!`7````````H````!@7````````L````"07````````P````"P7```` -M````T````#@7`````````%#R`@`!````4/("``^L`H*$BY:,F*2P``-_```3 -M=```$!@```KW``!00P``#$,``$"6``#@3```"O4```6U``#@3`(!(```-0`` -M``$```!L"0```@```'$)```#````=@D```0```!["0``!0```(`)```&```` -MA0D```<```"*"0``"````(\)```)````E`D```H```"9"0``"P```)X)```, -M````HPD```T```"H"0``#@```+0)```D````/!0``"@```!0%```+````&04 -M```P````>!0``#0```",%```.````*`4```\````M!0``$````#(%```E0`` -M`'$6``"9````A18``)T```"9%@``H0```*T6``"E````P18``*<```#+%@`` -MJ0```-46``"K````WQ8``*T```#I%@``9````'P5``!H````D!4``&P```"D -M%0``<````+@5``!T````S!4``'@```#@%0``?````/05``"`````"!8``(0` -M```<%@``B````#`6``",````1!8``"(````R%```)@```$84```J````6A0` -M`"X```!N%```N````#@3``"\````3!,``,````!@$P``Q````'03``#0```` -ML!,``-0```#$$P``V````-@3``"JJ@,``````($W``"`\P``JJH#``#X```` -M`/@`$P```*2>`@`3````=%X"`!,```"D#@(`$P```-#.`0`3````0)\!`!,` -M``!P3@$`$P```*`&`0`3````<,8``!,```"@@@``$P```'!"```3````0`(` -M`#8U+AL`````,S(K&0`````P+RD8`````"TM%Q<`````*RHE%0`````H*"04 -M`````"8E(1,`````)",?$@`````B(1T1`````"`@&Q``````'QX:#P`````= -M'!@.`````!L:%PX`````&AD6#0`````8%Q4,`````!<6$PL`````%A42"P`` -M```4%!$*`````!,3$`H`````$A(/"0`````1$0\)`````!`0#@@`````#P\- -M"``````.#@P'``````T-#`<`````#0P+!@`````,#`H&``````L+"@8````` -M"PH)!0`````*"@D%``````H)"`4`````"0D(!0`````)"`<$`````#8U+B4< -M$@D$,S(K(QH1"`0P+RDA&1`(`RTM)Q\8#P@#*RHE'A8.!P,H*"(<%0T'`R8E -M(1L4#08#)",?&1,,!@,B(1T8$0L&`B`@&Q81"`4"'QX:%1`*!0(='!@4#PH% -M`AL:%Q,."00"&AD6$@T)!`(8%Q41#`@$`A<6$Q`,"`0"%A42#PL'!`$4%!$. -M"P<#`A,3$`T*!@,!$A(/#`D&`P$1$0\,"08#`1`0#@L(!0,!#P\-"P@%`P$. -M#@P*"`4"`0T-#`H'!0(!#0P+"0<$`@$,#`H)!@0"`0L+"@@&!`(!"PH)"`8$ -M`@$*"@D'!0,"`0H)"`<%`P(!"0D(!@4#`0$)"`<&!`,!`04```#!B`(%2P`` -M``85$%::.P``-6@!``````````````````)#K0`````````````````````" -M2G0````````````````````````````````````````````````````````` -M```"6"D``````*%3````!00#`@`#!@4$`P`$!@4$`@`$"`<&!``&"@D(!@`( -M"@D(!``("@D(`@`("@D(```($A$0"``0&AD8$``8(B$@&``@(B$@$``@(B$@ -M"``@(B$<"``@(B$4"``@(B`8"``@,3`@$``P,3`8```P,2\0$``P,2P0$``P -M,2@0```P,2`0```P,1`0```P!`0$!00$!0<'!P@*!`0$!`8*"PT%!0<'"`L- -M#P0$!`4'!PD)#`X0$@0$!04&"A$3"0D)"0P.$1,````````````D)BH8&AT? -M(2`"@`,@! -M0`&0`>`",`$L`4`!X`+0`^@$L`9`!]```@`"``0`"``,`!(`&``D`#``2`!@ -M`&P`*``\`%``9`"@`,@`\`$8`&0`H`#P`6@!]`)8`R`#Z`("`@("`@,#!`0% -M!P0$!PH*#`P2!0<'"`L2)#P!`0$!`0(#!`4&!P@!`@,$!08'"`4&!P@)"@L, -M(!X<&!`8```````````````````````````````````````````````````` -M``````````````````````````````````````"[`0SE@BGU@N6#.O6#X")0 -M!NDE@OCF(KO^!NDE@OCB(N6"*?6"Y8,Z]8/DDR*[`0:)@HJ#\")0`O<9(KO^!^/U\`GC&2*) -M@HJ#Y)/U\'0!DR*[`1#E@BGU@N6#.O6#X/7PH^`B4`GI)8+XAO`(YB*[_@KI -M)8+XXO7P".(BY8,J]8/ID_7PH^F3(KL!"HF"BH/PY?"C\")0!O<)I_`9(KO^ -M!O/E\`GS&2+XNP$1Y8(I]8+E@SKU@^CPY?"C\")0">DE@LCV"*;P(KO^">DE -M@LCRY?`(\B+@_*/@_:/@_J/@_R*D)8+U@N7P-8/U@R+@^Z/@^J/@^2+XX/NC -MH^#Y)?#PY8(5@G`"%8/@^CCP(NOPH^KPH^GP(M"#T(+XY)-P$G0!DW`-HZ.3 -M^'0!D_6"B(/D!@J$"XY).C^N23H_CDDZ/(Q8+(RL6# -MRO"CR,6"R,K%@\K?Z=[G@+Y(EU<``````````$B73@``````````09=6`$&7 -MJP!!EVB`09>M``#PHW0#\.3[_7]4?@'3$*\!P\#0D)>*Z_"CX/NCX/5$Y/5% -M$C6KT-"2KR+DD)>+\)`%6.#_D)>&X"\D_I"7C/#D^_U_4'X!D6.0`5-T!?`B -MD`%?Y/"0`3QT"/#DD)>+\*-T%/#D^_U_7'X!D6.0`5]T!?"0!I)T`O"0EW(4 -M\)"7=.!4#\.4#%`1?0%_#!))"I"7>N`PX`,23R(BCX*.@Z.CH^3P(A):]P)7 -M:"(B`EAT`EA[TQ"O`0<7ZO9A5F[V`; -MD)>0Y'7P`7%G$BG9_Y"7C>1U\`%Q9^]138#>JV"J8:EBT-"2KR+`X,#PP(/` -M@L#0==``P`#``<`"P`/`!,`%P`;`!Y`!Q'13\'1%H_!3D=^0`3S@53#U-*/@ -M53'U-:/@53+U-J/@53/U-^4T,.!3D`$\=`'PD)>`X##@(!,35#\PX!F0EX+D -M\)"7@>!D`V`,?P'Q>>]P!7\"$E7+D)=ZX/\PX!X3$U0_,.`7D)=\Y/"0EWO@ -M9`1@"N3_\7GO<`,25[GE-##A"9`!/'0"\!)=6>4T,.(UD`$\=`3PD`:2X##@ -M()"7B^3PHW04\.3[_7]8?@&18Y`!6W0%\)`&DG0!\(`(D)=SY/`22F/E-##C -M-9`!/'0(\)`&DN`PX2"0EXOD\*-T%/#D^_U_7'X!D6.0`5]T!?"0!I)T`O"` -M")"7$=`'PD)>!X&0#8`Q_`?%Y[W`%?P(25YY38PX&Z0`3YT`?"0EX#@ -M,.`9D)>$Y/"0EX'@9`-@#'\!\7GO8`5_`1)5RY"7>N`PX$&0EW[D\/_Q>>]@ -M-A)TK9"7>^#_9`1@*N^T`P?D_Q)65H`2D)=[X+0"&!)9D.]P!7\!$E96D)=V -MX/]]`1))"A)/(G13!)`!Q/!T1:/PT`?0!M`%T`30`]`"T`'0`-#0T(+0@]#P -MT.`R[V0!<#V0EX/@8`-_`"*0EV;@8`-_`2*0EX+@8`-_`2*0EX#@_Q,35#\P -MX`OOQ!-4!S#@`W\`(I"7A.!_`6`V?P`BD)=]X&`#?P`BD)=FX&`#?P$BD)=\ -MX&`#?P$BD)=ZX!,35#\PX`-_`"*0EW[@?P%@`G\`(N3U(W]@?@&!\=,0KP'# -MP-"0!!W@8!J0!2+@5)!@!Y`!QN!$0/"0`9[_"C[?#DH_"C\.5J8`3D_Q&[D)>9X##@"9"7F^3PHW2`\)"7F>#_PQ.0 -M_1#PD`0E[_"0EYK@8!^CH^#_)`_U@N0T_/6#X$2`\'00+_6"Y#3\]8/@1(#P -MD)>;H^#__20(]8+D-/SU@^3P=`DM]8+D-/SU@^!4\/!T(2_U@N0T_/6#X%3W -M\)"7F^#^H^#_(N]@"Y"79^"T`1#D_X`)D)=GX+0!!7\!$G4A(I`!-W0"\!)T -MT>]P!I`!R'3]\'T"?P,2-N;E:F`$?P$1NQ)SG9"7=.!4\/#@1`+P(N#_?0&/ -M9XUHY6=4#_^0EW3@5`]O8';E9S#B,)"7=.`@X@5_`1):V9"7=.`PXPKE9R#C -M!1):O8!4D)=TX"#C3>5G,.-(KV@26F6`09"7=.!4#_^_#`WE9R#C"/'[[V`M -M$EJ]D)=TX%0/_[\$#>5G(.(($EF0[V`5$=:0EW3@5`__OP()$EGS[V`#$EOL -MD)=TX%0/_Y"7=N!4#V]P(^`PYA^0EW3@5`__D)=HX/Y/D`$O\.YD@)"7:/"0 -MEW;@5+_P(N]D`7`[?7Q_`A(V=7T"?P,2-G60`5?D\)`!/'0"\'T!?PPQ"I"7 -M>N`PX`+Q(N3_$;N0!@3@5'_PD`8*X%3X\"*0`39T?/"C=`+P?7S_$C;F?0)_ -M`Q(VYI`&!.!$@/"0!@K@1`?PD)=OX*/@D`58\.5I,.`CD)=LX'`BX`3PD)=T -MX%0/PY0$4`9]`7\$,0J0EWK@,.`'X2+DD)=L\"*0EWK@D)=V,.`%X/\"=(`DX_6"Y#24]8/DC_`20H'E4U0?_^4()>`DP/6"Y#21]8/DC_`2 -M0H'E"=.4!$`#=0D$=?`*Y0B0D``20U)U\`+E"1)#4N#^H^#_Y5-4'R__Y#[^ -M=?`*Y0B0D``20U)U\`+E"1)#4N[PH^_PY50@YB3E4U0?_^4()>`D8_6"Y#24 -M]8/DC_`20H'E3S#G-J\($EY!@"_E4U0?_^4()>`DH_6"Y#24]8/DC_`20H'E -M3S#G$N5/5'_]Y5-4'_4.JPFO"!)=_>5J%"3]4`*`/Y"7=^!@,I`!6^3PD`$\ -M=`3P\=[O9`%P)W5$%/5%^_U_6'X!$C6KD`%;=`7PD`:2=`'PD)=S\(`'\=Z_ -M`0)18^4L,.$AD`$T=`+PA=%8A=)9A=-:A=1;A=5A=E?$F\5Y2PP -MXP:0`31T"/#E+##D"9`!-'00\$-7$.4L,.4DD`'/X##E'>!4W_"0`31T(/!U -MJ`!UZ`#QAY```^!4^_#Q8H#^Y2PPY@:0`31T0/#E+C#A3)`!-G0"\$-70)`! -M`N!4`V0!<"F0`3?@,.`*=`'PD)=6Y/"`&)"75N`$\.##E`I`#.3PD`09X##@ -M`Q)02I"7A>"T`0F0!2+D\)"7A?#E+B#@`J%TD)=F=`'PD`$V\)"7@.`PX#"0 -MEX5T`?"0EX#@_Q,35#\PX!Z0EX)T`?`21(&0EX'@9`-@#7\!$D=Y[V`%?P$2 -M5>]@-!)TK9"7>^#_9`1@ -M*.^T`P?D_Q)65H`2D)=[X+0"%A)9D.]P!7\!$E96D)=VX/]]`3$*\2(27+:0 -MEV;D\.4N(.("H?J0`39T!/"0EWK@,.`&H^!D!&!LY6ED`7!FY6I@8N5J9`)@ -M!N5J9`5P)Y`&J^"0EVKPD`:JX)"7=?"0EVK@<`>0EW7@_X`%D)=JX/^0EVKO -M\)"7;.!@`^`4\)"7:^3PD`%7\)`!/'0"\)"7>>!4_?#@5._PY6H4)/U0`H`# -M$EPD`%7Y/"0`3QT`O"0EWCD\)"7>>!4 -M_?#@5`=P`E%CY2XPY1^0`39T(/#E:;0!%.5J8!"0EW?@9`)@!1)5J%"3]4`*`(9"7=^!@ -M!GT!?PR`#Y"7=.!4#\.4!%`&?0%_!#$*Y/\1NR*0EWO@9`1@+Y"7=.!4#Q1@ -M'Q1@%23^8`HD^'`;Y)"7>_`BD)=[=`'P(I"7>W0"\"*0`<;@1`CP(O3_D`!# -MX%_PTQ"O``E)`$&^!4?V1_ -M?P%@`G\`(I"7?^"T`0;D\-'P\2(B\=[O9`%@"9`!N.!$`?"`-9"7<^!@"9`! -MN.!$`O"`)I"7#_?0$22"J0!!]T(/`B=2@SY/4I=2H#]2N0 -M`3#E*/"CY2GPH^4J\*/E*_`BY)"7,/"C\'6.`A)S&Y```N!4X)"796`%=`'P -M@`-T`O"0`//@,.,(D)=G=`'P@`7DD)=G\)"79^"T`1.0`/+@,.<,D)=,=/WP -MHW0S\(`*D)=,=/WPHW0O\.3U5Q)G[Q)U&!)8@A(R/?'Y\><18>20EV;PD`#S -MX##B#9`%0700\)`%6O"CY/"0`61TH/#QSQ)%`9"7,N79\!)/L\*OD`"`X$1` -M\!)/8G7H`T.HA=*OD)35_^7X!$G,LOP$)D`8U -MX%0/\(`%@``"KX/]T`7X` -MJ`<(@`7#,\XSSMCY_^]=<`)!QI"7J^!U\`20`=`20U+@D)I=Y-1)%"9"7->#_Q!,3$U0!D)>K,.!9X'7P`I``B!)#4N"0ES;P -MD)>KX'7P`I``B1)#4N"0ES?PD)>KX'7P!)`!T1)#4N"0ESCPD)>KX'7P!)`! -MTA)#4N"0ESGPD)>KX'7P!)`!TQ)#4N"0ESKP@#/@=?`$D`'1$D-2X)"7-O"0 -MEZO@=?`$D`'2$D-2X)"7-_"0EZO@=?`$D`'3$D-2X)"7./#O5'__>P%ZEWDV -M40ESL20U[AZY"7.Q)#7@)P -M$I"7.Q)#7@)NYI"7.Q)#7@)NT)"7.Q)#7H`9D)<[$D->`G!:D)<[$D->X?&0 -M`<;@1`'P(M,0KP'#P-"0ESX20W[DD)=!\!(IV<,3(.`"@8Z0ESX20UX2*=G_ -M5`+^D)>`X%3]3O[P[U0!_^Y4_D__\!(IV?Y4"/WO5/=-_Y"7@/#N5!#^[U3O -M3O_P$BG9_E0@_>]4WTW_D)>`\.Y40/[O5+].\"#@`H%^D)=!="'PD)<^$D-> -M$BG9_Q,35`'^D)>`X/T3$U0!;F`J[U0$_^U4^T_PX!,35#\PX`Z0`31T0/#] -MY/\2-N:`"^20EX+P?4#_$C9UD)>`X/T3$Q-4'S#@!Y"70>!$$O#MQ%0/,.`' -MD)=!X$04\)"7@.#$$U0',.`'D)=!X$2`\)"7@.#$$Q-4`R#@!Y"70>!$0/"0 -MET'@D`4G\)"7@>!P!'\!L]4]TW_D)=Z\.Y4$/[O5.].__`2*=G^5$#][U2_ -M39"7>O`@X`*AEY"7070Q\.X3$U0!_Y"7>N#^$Q-4`6]@)Y"7/A)#7A(IV50$ -M_^Y4^T^0EWKPX!,35#\@X`ODD)=\\'U`_Q(V=9"7>N#]$Q,35!\PX`>0ET'@ -M1`+P[<14#S#@!Y"70>!$!/"0ET'@5`9@#)`!/G0#\/U_`A(W`)"70>"0!2?P -MD)=ZX/_$$Q-4`S#@#*/@9`1@6G\$T5:`5)"7>^!D!'`8?P'15N3_$D=Y[V`( -MD)=V$DD&@`3QN8`T$D\B@"^0ET%T`?"0!2?P?0-_`A(VDI"7>^"T!`1_`8`) -MD)=[X+0#!.3_T5823^T22F/Q^=#0DJ\BD)>!X/YO8&#O%&`:%&`R%&!$)`-P -M4NZT`P+A=9"7@>!D`G!$X8N0EX'@_K0#!'\!@#?NM`(#`EMVD)>!X'`I@#>0 -MEX'@_K0#!N3_T32`!>YP`M%#X:.0EX'@M`(#`D3[D)>!X'`"\94B[V`%D`4B -MY/"0EX%T`?`BD`$^=`/P_7\"$C<`D)>!=`'P(I"7>^#^;W`"X2#O%&`Q%&!6 -M%&!V%'`"X0(D!&`"X2#NM`,$?P'A1)"7>^#^M`0&?P'Q*X`([K0"!'\!\2'A -M79"7>^"T`P1_`?%$D)=[X'`"X3J0EWO@_K0$!'\!@'?N9`)P9W\!@&20EWO@ -MM`,$?P'Q1)"7>^!P!/$Z@`N0EWO@M`0$Y/_Q*P)T<)"7>^#^M`0&Y/_Q*X`( -M[K0"!'\!\2&0EWO@M`$"\5T"W0!\"*0EZ_O -M\!):]Y"7K^!@!9`%(N3PY)"7>_`B?P$26F7DD)=[\"*0!2)T#_"0EX%T`_`B -MD`4BY/!]`W\"$C:2D`4GY/"0EX'P(A):]Y`%(N3P@.60`3YT`_#]?P(2-P"` -MQ1)TT>]P!I`!R'3]\!)SG9"7@70"\"*0EWO@M`$$?P*`")"7>^!P!'\#T58B -M=3`?=3$!Y/4RD`$XY3#PH^4Q\*/E,O`BY/4F(A(IV?5I(A(IV9"7AO`BY)"7 -MAO"0EX#@5/[P5/OPY*/PH_"C\*/PH_"0EWK@5/[P5/OPY*/PH_"C\*/PH_`B -MP.#`@\""P-!UT`#`!<`&P`=]*9`!Q.WP=%C_H_!3D>^0`%'@_I``5>!>]3WE -M/3#F`W1`\)`!Q.WPH^_PT`?0!M`%T-#0@M"#T.`RCQV,'HT?(H\@C"&-(B+D -M]6F0EWGP]6J0EW9T#/"0EW3PY)"7=_"0EW/PD)=R\)"7=03PD)=J\.20EWCP -MD)=L\)"7<70'\.20EVOPD)=O\*-T`O#DD)=N\)"7:?`BY)"7>/"0EVOPD)=Y -M\"*+$8H2B1,1T:L1JA*I$Q(IV?5J%&`.%&`>%&`O)`-P07\!@#JK$:H2J1.0 -M``(20B#]Y/\Q08`GJQ&J$JD3D``"$D(@_7\!,4$?@!.K$:H2J1.0``(20B#] -M?P(Q0>3_$DG&(N\D_F`+!'`=D)=U=`'P@!'MD)=U<`5T!?"``NWPD)=UX)"7 -M:O`BTQ"O`!$`?"`2)"7>>!4`V`)D`&YX$0"\(`WD)=VX%0/TY0"0`F0 -M`;G@1`3P@".0EWG@,.()D`&YX$0(\(`3D)=YX##D"9`!N>!$$/"``W\!(I`! -MN^!$!/!_`"+E5V`)D`&ZX$0!\(!;D)=VX%0/TY0!0`F0`;K@1`+P@$>0`H?@ -M8`F0`;K@1`3P@#B0EV7@M`(0D)=,X/ZCX/6"CH/@8!&`(9`!K^!@"9`!NN!$ -M"/"`$I"7;N!P"9`!NN!$$/"``W\!(I`!N^!$`O!_`"*0!@3@5+_P[V`)Y6FT -M`03D_U&$D)=TX%3P\.!$#/`BCVP21_CO9`%P+I"781)()N5L8!!T(2_U@N0T -M_/6#X$00\(`.="$O]8+D-/SU@^!4[_"0!!]T(/`BD`8$X$1`\.5IM`$$?P%1 -MA)"7=.!4\/#@1`3P(I"7K._P4?>0EZS@8`60!2+D\)"7=.!4\/#@1`3P(I`` -M$>!$"?`23V*0EQT20T:0@(42*G]_>'X($B_9D)3]_Q(T@9"79^"T`1&0@%D2*HL``RV5Y/U_`1(T@2)1]Y"7A>!D`6`, -MD`$VX"#@!9`%(N3PD)>!=`'P(H]KY)"7I?"C\)`!">!_`##G`G\![V5K8#[# -MD)>FX)2(D)>EX)030`B0`<;@1(#P(I"7I>1U\`$20H%_%'X`$C=4TY"7IN"4 -M,I"7I>"4`$"YD`''X##@LB(BD)=TX%3P\.!$`?`210)QZ^!4\/#@1`+P(A)' -M^+\!$)"78.#_Y/T22"J0!!]T(/`BD`:IX/4+5,!P#I"7>>!4_O#@5/WP$DIC -MY0LPYAB0EWG@1`'PD)=WX&0"8`21!8`,$D2F@`>0EWG@5/[PY0N0EWDPYQC@ -M1`+PY)"7BQ)$5Y`!5W0%\)"7>'0!\"+@5/WP(H]M$D?X[V0!<"Z0EV(22";E -M;6`0="$O]8+D-/SU@^!$$/"`#G0A+_6"Y#3\]8/@5._PD`0?="#P(N20ER[P -MY6IP`J%8Y6ED`6`"H5CE:A1@*23]8"4D`B3[4`*`(Y"7:N`4\.!@!*/@8!:0 -MEVK@<`J0EW7@D)=J\(``D)>]P -M!)"7+O"0ER[@8#B0EWG@1!#PY)"7B_"0EW'@D)>,$D1;D`%7=`7PD)=TX%0/ -MPY0$4!%]`7\$$DD*D)=ZX##@`Q)/(B*0EWC@8`[D\*/@5/WPX%0'<"B`(Y"7 -M:^`$\)"7>>!4[_"0EVO@TY0!0`WE:;0!"Z/@<`?@!/`B$DIC(N_#E"!0.>\P -MX!?MQ%3P_>_#$_XDI/6"Y#0$]8/@5`^`$._#$_XDI/6"Y#0$]8/@5/#P=*0N -M]8+D-`3U@^!-\"+@_72$)1'U@N0TEO6#[?"O$=,0KP'#P-!TA"_U@N0T!/6# -M[?#0T)*O(NU4'_40=`$O]8+D-)+U@^#U#^O#E`%``H`JY0\E#O[E$)!!GI/\ -M[M.<=`%`#"_U@N0TDO6#Y/"`KR_U@N0TDO6#[O`BK`=U\`GLD),G$D-2X/]T -MI2SU@N0TEO6#X%0?^].?0`*K!^LEX"1F]8+D-$'U@^23_G0!D__K)>`D+O6" -MY#1!]8-T`9,O_^23/L,3_N\3_^PEX"3A]8+D-)+U@^[PH^_PKP2M`['EKP,B -MK0=TA"WU@N0T!/6#X%1_]1Q4'_QU\`GMD),G$D-2X/^0ESWP[27@)('U@N0T -MDO6#X/NCX)"7/LOPH^OP[27@).3U@N0TE?6#X/NCX)"70,OPH^OP["7@)"[U -M@N0T0?6#Y)/Z=`&3^^TEX"3A]8+D-)+U@^KPH^OP[,.?0`+AK'2E+?6"Y#26 -M]8/L\`3[D)<]X/_KTY]``N'=Z\.4$$`AZR3P_W0!?@"H!PB`!<,SSC/.V/G_ -MD)<^X%[^H^!?3G`CZ\.4$%`Y=`%^`*@#"(`%PS/.,\[8^?^0ET#@7OZCX%]. -M8!SK9!-@".MD$F`#NQ$)D)<^X##@`GL8K`.,'(`T"X"+D)<]X/ML<&ETI2WU -M@N0TEO6#[/!U\`GMD),I$D-2X+0!#.4<(.8'[$1`]1R``Z\<(NPEX"1F]8+D -M-$'U@^23_G0!D__L)>`D+O6"Y#1!]8-T`9,O_^23/L,3_N\3_^TEX"3A]8+D -M-)+U@^[PH^_P@%OLTYM`5I"7/>#_=*4M]8+D-);U@^_PK`>/'.PEX"1F]8+D -M-$'U@^23_G0!D__L)>`D+O6"Y#1!]8-T`9,O_^23/L,3_N\3_^TEX"3A]8+D -M-)+U@^[PH^_PKQPB=`$M]8+D-)+U@^3PKP7E'$2`_1)=Y>4<1(#_(JH'KP5T -MA"KU@N0T!/6#X%1_^U0?^9"7/_!U\`GJD),H$D-2X)"70?!U\`GJD),G$D-2 -MX/Z0ET+PZB7@).3U@N0TE?6#X/VCX)"70\WPH^WPZB7@)('U@N0TDO6#X/VC -MX)"710`F0ET+@D)<_\/OO<`(AT9"70._PZS#F"9"7/^#[H^`4 -M\)"70.!P`B'1D)<_X/_3E`!0`B'1Y)"7/O#O%)"7/?"0ET'@^9"7/>#_TYE` -M:N^4$$`A[R3P_W0!?@"H!PB`!<,SSC/.V/G_D)=%X%[^H^!?3G`GD)<]X/_# -ME!!0,G0!?@"H!PB`!<,SSC/.V/G_D)=#X%[^H^!?3F`5D)<]X/NCX`3PD)=` -MX/^0ES[@;V`(D)<]X!3P@(B0ET#@_Y"7/N##GU`,D)<]X+4!!9"70>#[ZR7@ -M)&;U@N0T0?6#Y)/^=`&3_^LEX"0N]8+D-$'U@W0!DR__Y),^PQ/^[Q/_ZB7@ -M).'U@N0TDO6#[O"C[_"O`JT#$EWEKP,BY/41=?`)Y1&0DRH20U+@9`%@`N'C -MY1$EX"3`]8+D-)'U@^#^H^#3E`#NE`!0`N'CY1%U\`JD)`#Y=)`U\'46`?47 -MB1CE$27@),#U@N0TD?6#X/^CX)"7-\_PH^_PY1$EX"1C]8+D-)3U@^#_H^"0 -MESG/\*/O\'2$)1'U@N0T!/6#X%0_D)41D),G$D-2X)"7 -M//!T9"41]8+D-);U@^##E`5``H&\D)<\X/^0ES3@GT`3D)<\X)"7-/#N5$#^ -MD)"4`$`(Y/VO$1&4X7KE$27@).'U@N0TDO6#X/49H^#U&JL3JA2I%1(IV?]^ -M`*L6JA>I&!)"E_VL\!(I\N\E&O4:[C49]1FK$ZH4J160``$20B#_?@"K%JH7 -MJ1B0``(20L+]K/`2*?+O)1KU&NXU&?49JQ.J%*D5D``"$D(@_WX`JQ:J%ZD8 -MD``$$D+"_:SP$BGR[R4:]1KN-1GU&:L3JA2I%9```Q)"(/]^`*L6JA>I&)`` -M!A)"POVL\!(I\N\E&O4:[C49]1FK$ZH4J160``020B#_?@"K%JH7J1B0``@2 -M0L+]K/`2*?+O)1KU&NXU&?49JQ.J%*D5D``%$D(@_WX`D)0`SE&I_U&N49GO49@`7D]1GU&N41)>`DX?6"Y#22]8/E&?"CY1KP -MD)`D9O6"Y#1! -M]8/3=`&3E1KDDY494`+A3GT!KQ$1E.%.=&0E$?6"Y#26]8/@_&0%8`+!5Y"3 -M(N#_M`,+D)\D!?_D,_YT(241]8+D-)+U@^#]TY_N9(#X=("84#+M)`7_Y#/^=",E$?6" -MY#25]8/@TY_N9(#X=("84!1TA"41]8+D-);U@^#_D)41 -MD),K$D-2X+0!$.3U&W1D)1'U@N0TEO6#Y/"M&^%)[&0&8`+A3O49]1J00=N3 -M_WX`D)"5&4`'!1+E$K0%O>42PQ/U$N4;M`$&Y1)P1H`3Y1NT`Q7E$G`%=1L# -M@#GE$K0!!74;`8`O@"KE&[0%*.42<`5U&P6`#>42M`$%=1L#@`-U&P'3D)`DH_6"Y#24]8/D\*/P!1'E$<.4(%`"01PBY/UTI"WU@N0T!/6# -MY/`-O1#PY/UU\`KMD)``$D-2Y/"C\'7P"NV0D`(20U+D\*/P=?`*[9"0!!)# -M4N3PH_!U\`KMD)`&$D-2Y/"C\'7P"NV0D`@20U+D\*/P=(0M]8+D-);U@W03 -M\'1$+?6"Y#25]8/D\'1#+?6"Y#24]8/D\.TEX"3`]8+D-)'U@^3PH_#M)>`D -M8_6"Y#24]8/D\*/P[27@)./U@N0TE/6#Y/"C\.TEX"2C]8+D-)3U@^3PH_#M -M)>`D9/6"Y#25]8/D\*/P[27@)*3U@N0TE?6#Y/"C\'1$+?6"Y#26]8/D\'0D -M+?6"Y#26]8/D\'1D+?6"Y#26]8/D\)!!C)/^=`&3_Y!!5'0!DR__Y),^PQ/^ -M[Q/_[27@).'U@N0TDO6#[O"C[_!U\`GMD),I$D-2=`'P=,$M]8+D-)+U@W0, -M\'7P">V0DR420U)T__"C\'7P">V0DR,20U+D\*-T#_!U\`GMD),G$D-2=!/P -M=?`)[9"3*!)#4N3P=(0M]8+D-`3U@W03\`WM9"!@`@$#(H\1[R7@).3U@N0T -ME:^"]1./%.41=?`"I"2!^722-?!U%0'U%HD7=?`)Y1&0DR420U*O@H6#&(\9 -MY1%U\`FD)"/Y=),U\'4:`?4;B1QTP241]8+D-)+U@^`20X=J!0!J&@%J+P)J -M1`-J;01J@@5JEP9JO0QJZ@UK%PYK1`\``&MXY1$EX"3D]8+D-)7U@W3P\*-T -M%8`\Y1$EX"3D]8+D-)7U@W3P\*-T$(`GY1$EX"3D]8+D-)7U@W3P\*-T!8`2 -MY1$EX"3D]8+D-)7U@W3P\*/D\.41)>`D@?6"Y#22]8-T#_"C=(_P87CE$27@ -M).3U@N0TE?6#=`_PHW3U@"?E$27@).3U@N0TE?6#=`_PHW3P@!+E$27@).3U -M@N0TE?6#Y/"C=`WPY1$EX"2!]8+D-)+U@^3PH_!A>)`$1^"K%:H6J1<20DV0 -M!$;@JQ6J%JD7D``!$D)?D`1%X(44@H43@_"0!$1A;Y`$2^"K%:H6J1<20DV0 -M!$K@JQ6J%JD7D``!$D)?D`1)X(44@H43@_"0!$B`6)`$3^"K%:H6J1<20DV0 -M!$[@JQ6J%JD7D``!$D)?D`1-X(44@H43@_"0!$R`*Y`$4^"K%:H6J1<20DV0 -M!%+@JQ6J%JD7D``!$D)?D`11X(44@H43@_"0!%#@A12"A1.#H_"K%:H6J1?` -M`\`"P`$2*=G_JQJJ&ZD<$BG97]`!T`+0`Q)"3:L5Y1T(+0@_"%%(*%$X.CP(/`@N#_A1F"A1B#H^#^[U[0@M"#\.41)>`D@?6" -MY#22]8/@_J/@3F`[=1(+=`%^`*@2"(`%PS/.,\[8^?_E$27@)('U@N0TDO6# -MX%[^H^!?3F`&Y1(D$(!=%1+E$L.4`%#*@%;E$27@).3U@N0TE?6#X/ZCX$Y@ -M/742#W0!?@"H$@B`!<,SSC/.V/G_Y1$EX"3D]8+D-)7U@^!>_J/@7TY@")"7 -M2N42\(`0%1+E$L.4`%#(@`7DD)=*\.41)>`DY/6"Y#25]8/@_J/@3F`[Y/42 -M=`%^`*@2"(`%PS/.,\[8^?_E$27@).3U@N0TE?6#X%[^H^!?3F`(D)=+Y1+P -M@%L%$N42M!#*@%+E$27@)('U@N0TDO6#X/ZCX$Y@.>3U$G0!?@"H$@B`!<,S -MSC/.V/G_Y1$EX"2!]8+D-)+U@^!>_J/@7TY@!N42)!"`"@42Y1*T#,R`!>20 -METOPD)=*X/]U\`GE$9"3)Q)#4N_PD)=+X/YU\`GE$9"3*!)#4N[P=(0E$?6" -MY#0$]8/@TY]`!I"72A)=U'2$)1'U@N0T!/6#X/^0ETO@_N_#GE`#$EW4D)=* -MX/_3E!-`")"3(G0#\(`A[].4"T`(D),B=`+P@!/OTY0#0`B0DR)T`?"`!>20 -MDR+PD),BX)`$L?`BD)<^[_"C[?"C$D-^D)=`$D->D``#$D(@5/#$5`^0ET/P -MD``$$D(@5$#$$Q-4`Y"71/"0ES[@_W7P"9"3)1)#4JV"K(.0ET7L\*/M\.]U -M\`FD)"/Y=),U\/I[`:,20WZ0ET`20UZ0``,20B!4#_^0ET<20U[O$D)-D)=` -M$D->D``"$D(@_Y"71Q)#7I```>\20E^0ET`20UZ0``$20B#_D)=%X/RCX/WU -M@HR#[_`2*=F-@HR#H_"0ET/@_I"7/N#_),'U@N0TDO6#[O"0ES_@_G7P">^0 -MDRD20U+N\'7P">^0DRH20U)T`?"0ET3@_G7P">^0DRL20U+N\"&%D``$$D(@ -M_U0?_N]4(,035`?]KP:AU!(IV?41PY0@4!60``(20B#_=",E$?6"Y#25]8/O -M\"+E$;0@"I```A)"()"3(?`BD)5B0EY820WX+ -M>I=Y+M,0KP'#P-"0EY,20WZ0EV7@9`)@;I"79>!D`7!FD)>MX/\$\)"7DQ)# -M7I```>\20E]_KWX!\;SO8$F0EY,20UZ+8XIDB65U9@)[`7H!>:`210F0EY82 -M0UZ+8XIDB660EY,20UX2*=G_Q%0/]69[`7H!>:(210F0`:]T__"0`=[O"C[_#DH_"C\)"7G>#^H^#U@HZ#X&`MPY"7H."4 -MZ)"7G^"4`T`+D`'&X$00\'\`@!60EY_D=?`!$D*!?PI^`!(W5(#%?P'0T)*O -M(I`"">#]$BG9_J\%[2Z0EU_PD``!$D(@_^TOD)=@\)```A)"(/_M+Y"78?"0 -M``,20B#_[2^0EV+PD``$$D(@_ZX%[2^0EV/P(M,0KP'#P-"0ESX20WZ0ESX2 -M0UZ0``$20L+ZY?`D`/_D.OZ0ESX20UZ0``'NC_`20QD2*=G_8"RU(Q:0ESX2 -M0UZ0``$20L)E)7`$Y21E\&`CD)<^$D->D``!$D+"_Z[P$=*`$)"7/A)#7A(I -MV64C8`,21^_0T)*O(I"70>[PH^_P=2,!CB3U)>3]?PLQ%.3]?P(Q%#'JY/\Q -MWN3U)Y`!R>4G\)"70>#\H^#][/N-1.3U17T!?V!^`0(UJ],0KP'#P-"0ET3M -M\)"70^_PTY0'4$^CX'`:D)=#X/]T`:@'"(`"PS/8_/3_D`!'X%_P@!>0ET/@ -M_W0!J`<(@`+#,]C\_Y``1^!/\!)/8I"70^#_=`&H!PB``L,SV/ST_Y``1H!: -MD)=#X"3X\*/@3U)H`#=28! -M?P$B?P`BY2-D`7`^,>J_`01_`3'>D`!&X$0$_7]&$D]RD`!$X%3[_7]$$D]R -MD`!&X%3[_7]&$D]R?P)1:X\GD`')Y2?PM`$"44LBD`!)X)"7KO#@5`_P1/#] -M?TD23W*0EZ[@1+#]?TD"3W+3$*\!P\#0D)>P[_#3E`=01^#_=`&H!PB``L,S -MV/ST_Y``1N!?\!)/8I"7L.#]=`%^`*@%"(`%PS/.,\[8^?^0`$3@^^3^[UNH -M!0B`!LZBYQ/.$]CX_X!$D)>PX"3X\.#_=`&H!PB``L,SV/P23UJ0E[#@_70! -M?@"H!0B`!<,SSC/.V/G_D`!"X/OD_N];J`4(@`;.HN<3SA/8^/_0T)*O(I`& -M-'3_\.2C\*/PH_`B(N20EV3PD`"`X$2`_7^``D]RCA&/$HL3BA2)%>20ES/P -M[Y``,?`23V+E$50#_Y``,N!4_$_P$D]BD``SX%1_\!)/8I``,^`@YPZ0ES/@ -MPY1D4`7@!/"`ZY"7,^##E&10$)``,."K$ZH4J1420DU_`2)_`"*0!2)T__!Q -MG9"7>W0#\")_>'X($B?>D)<=$BI_?P1^#!(GWI"7(1(J?W\`?@@2)]Z0ER42 -M*G^0EV?@D)<=M`$-$D-&[U3'_^U4Q_V`!Q)#1N]4Q__LD("%$BI_?WA^"!(O -MV9"7(1)#1N]4#__LD("%$BI_?P1^#!(OV9"7)1)#1N]$`O_LD("%$BI_?P!^ -M"!(OV7]P?@X2)]Z0ERD2*G^0@(42*HL`&R6@?W!^#A(OV9"`61(JBP````#D -M_?\2-(&0EV?@M`$1D(!9$BJ+`````.3]?P$2-(&0`!'@5/;P`D]B$DC6D)=[ -M=`+P(I`%(G0/\)"7>W0$\"*N!^3_$D=Y[V`9D)=ZX,03$U0#(.`-KP9]`1)) -M"A)/(G\!(G\`(I"7>N#_Q!,35`,PX`NCX&0$8`5_!!)65I"7>^!D!&`#$D_M -M(I`%(G3_\.20EZ?PH_"0!?C@<`^CX'`+H^!P!Z/@<`-_`2+3D)>HX)3HD)>G -MX)0#0`-_`")_,GX`$C=4D)>GY'7P`1)"@8#&D)=GX)"7+?`B[W`"P=B0ERW@ -M8`,">J20EQD20T:0@(42*G]_C'X($B_9D);%$D-&D("%$BI_?T1^"!(OV9"6 -MR1)#1I"`A1(J?W]'X. -M$B_9D);=$D-&D("%$BI_?WQ^#A(OV9"6X1)#1I"`A1(J?W^`?@X2+]F0EN42 -M0T:0@(42*G]_A'X.$B_9D);I$D-&D("%$BI_?XA^#A(OV9"6[1)#1I"`A1(J -M?W^,?@X2+]F0EO$20T:0@(42*G]_T'X.$B_9D);U$D-&D("%$BI_?]1^#A(O -MV9"6^1)#1I"`A1(J?W_8?@X2+]F0EOT20T:0@(42*G]_W'X.$B_9D)!D`6`#`GJD?XQ^"!(GWI"7 -M&1(J?W]$?@@2)]Z0EL42*G]_7'X($B?>D);)$BI_?VQ^#A(GWI"6S1(J?W]P -M?@X2)]Z0EM$2*G]_='X.$B?>D);5$BI_?WA^#A(GWI"6V1(J?W]\?@X2)]Z0 -MEMT2*G]_@'X.$B?>D);A$BI_?X1^#A(GWI"6Y1(J?W^(?@X2)]Z0END2*G]_ -MC'X.$B?>D);M$BI_?]!^#A(GWI"6\1(J?W_4?@X2)]Z0EO42*G]_V'X.$B?> -MD);Y$BI_?]Q^#A(GWI"6_1(J?W_@?@X2)]Z0EP$2*G]_['X.$B?>D)<%$BI_ -M?P1^#!(GWI"7"1(J?W\$?@T2)]Z0EPT2*G]_#'X)$B?>D)<1$BI_?P1^"!(G -MWI"7%1(J?W^,?@@2)]Z0EZ$2*G^0EZ$20T;M1,#][)"7H1(J?Y"7H1)#1I"` -MA1(J?W^,?@@2+]F0@(42*HL``0``?T1^"!(OV9"`A1(JBP#;):1_7'X($B_9 -MD("%$BJ+(-LEI']L?@X2+]F0@(42*HL@VR6D?W!^#A(OV9"`A1(JBP0;):1_ -M='X.$B_9D("%$BJ+!!LEI']X?@X2+]F0@(42*HL$&R6D?WQ^#A(OV9"`A1(J -MBP0;):1_@'X.$B_9D("%$BJ+8]LEI'^$?@X2+]F0@(42*HL$&R6D?XA^#A(O -MV9"`A1(JBR#;):1_C'X.$B_9D("%$BJ+(-LEI'_0?@X2+]F0@(42*HL@VR6D -M?]1^#A(OV9"`A1(JBR#;):1_V'X.$B_9D("%$BJ+`!LEI'_A$BI_D)>A$D-&D("%$BI_?P1^ -M#!(OV7\$?@T2)]Z0EZ$2*G^0EZ$20T;O5/#_[)"7H1(J?Y"7H1)#1N]$`?_L -MD)>A$BI_D)>A$D-&D("%$BI_?P1^#1(OV7\,?@D2)]Z0EZ$2*G^0EZ$20T;D -M_^R0EZ$2*G^0EZ$20T;O1!'_[)"7H1(J?Y"7H1)#1I"`A1(J?W\,?@D2+]E_ -M#'X)$B?>D)>A$BI_D)>A$D-&[50/_>Q4\/R0EZ$2*G^0EZ$20T;M1!#][$0! -M_)"7H1(J?Y"7H1)#1I"`A1(J?W\,?@D2+]E_!'X($B?>D)>A$BI_D)>A$D-& -M[U3P_^R0EZ$2*G^0EZ$20T;O1`'_[)"7H1(J?Y"7H1)#1I"`A1(J?W\$?@@2 -M+]GDD)J[?"0EZGO\-.4!U!EX/]T`:@'"(`"PS/8_/3_ -MD`!'X%_P$D]BD)>IX/]T`:@'"(`"PS/8_/^0`$;@3_`23V*0EZK@8!:0EZG@ -M_W0!J`<(@`+#,]C\_Y``18!HD)>IX/]T`:@'"(`"PS/8_/3_D`!%@&V0EZG@ -M)/CPX/]T`:@'"(`"PS/8_,14\!)/6I"7J>#_=`&H!PB``L,SV/S_D`!#X$_P -M$D]BD)>JX&`;D)>IX/]T`:@'"(`"PS/8_,14\/^0`$+@3X`:D)>IX/]T`:@' -M"(`"PS/8_,14\/3_D`!"X%_P$D]BT-"2KR(..```P8@"`$L````&%1,)5#H! -M`#5H`0`````````````````"0[H``````````````````````DOD```````` -M`````````````````````````````````````````````````````E\4```` -M``"AWP````4$`P(``P8%!`,`!`8%!`(`!`@'!@0`!@H)"`8`"`H)"`0`"`H) -M"`(`"`H)"```"!(1$`@`$!H9&!``&"(A(!@`("(A(!``("(A(`@`("(A'`@` -M("(A%`@`("(@&`@`(#$P(!``,#$P&```,#$O$!``,#$L$!``,#$H$```,#$@ -M$```,#$0$```,`0$!`4$!`0%!04&!@0$!`4%!08&!`0%!04%!@8$!`4%!04& -M!PH+#1`$!04&!@D,$0@("0D*#!`1!`0$!00$!0<'!P@*!`0$!`8*"PT%!0<' -M"`L-#P0$!`4'!PD)#`X0$@0$!04&"A$3"0D)"0P.$1,````````````D)BH8 -M&AT?(2`"@ -M`,@!0`&0`>`",`$L`4`!X`+0`^@$L`9`!]```@`"``0`"``,`!(`&``D`#`` -M2`!@`&P`*``\`%``9`"@`,@`\`$8`&0`H`#P`6@!]`)8`R`#Z`("`@("`@,# -M!`0%!P0$!PH*#`P2!0<'"`L2)#P!`0$!`0(#!`4&!P@!`@,$!08'"`4&!P@) -M"@L,(!X<&!`8````````````````NP$,Y8(I]8+E@SKU@^`B4`;I)8+XYB*[ -M_@;I)8+XXB+E@BGU@N6#.O6#Y),BNP$&B8**@_`B4`+W(KO^`?,B^+L!#>6" -M*?6"Y8,Z]8/H\")0!NDE@LCV(KO^!>DE@LCR(L7P^*/@*/#%\/CE@A6"<`(5 -M@^`X\"*[`0J)@HJ#X/7PH^`B4`:'\`GG&2*[_@?C]?`)XQDBB8**@^23]?!T -M`9,BNP$0Y8(I]8+E@SKU@^#U\*/@(E`)Z26"^(;P".8BN_X*Z26"^.+U\`CB -M(N6#*O6#Z9/U\*/IDR*[`0J)@HJ#\.7PH_`B4`;W":?P&2*[_@;SY?`)\QDB -M^+L!$>6"*?6"Y8,Z]8/H\.7PH_`B4`GI)8+(]@BF\"*[_@GI)8+(\N7P"/(B -M[TO_[DK^[4G][$C\(N#\H^#]H^#^H^#_(J0E@O6"Y?`U@_6#(N#[H^#ZH^#Y -M(OC@^Z.CX/DE\/#E@A6"<`(5@^#Z./`BZ_"CZO"CZ?`BT(/0@OCDDW`2=`&3 -M<`VCHY/X=`&3]8*(@^1S=`*3:&#OHZ.C@-\"0_@"4&_DDZ/XY).C0`/V@`'R -M"-_T@"GDDZ/X5`1^`9-@O*/_5#\PY0E4'_[DDZ-@`0[/5,`EX&"H0+CDDZ/ZY).C^.23H\C% -M@LC*Q8/*\*/(Q8+(RL6#RM_IWN>`ODB7=@``````````2)=M``````````!! -MEW4`09>]`$&7AX!!E[\``/"C=`/PY/O]?U1^`=,0KP'#P-"0EYSK\*/@^Z/@ -M]43D]442,&+0T)*O(I`!7^3PD`$\=`CPY)"7G?"C=!3PY/O]?UQ^`9%PD`%? -M=`7PD`:2=`+PD)>1%/"0EY/@5`_#E`Q0`Q)(VR*/@HZ#HZ.CY/`BY/5G?V!^ -M`8#MD)>5X/]]`0)(W[&QOP$/D)=_X/_D_?']D`0?="#P(B(B(B(```)?I@)? -MK=,0KP'#P-"+8(IAB6*0EY]QBZMCJF2I99"7HG&+KV859N]@&Y"7HN1U\`%Q -M=!(D8O^0EY_D=?`!<73O44V`WJM@JF&I8M#0DJ\BD`:IX/4+5,!P#9"7F.!4 -M_O#@5/WPD=[E"S#F%Y"7F.!$`?"0EY;@9`)@!)'H@`N1CH`'D)>8X%3^\.4+ -MD)>8,.<7X$0"\.20EYV19)`!5W0%\)"7EW0!\"+@5/WP(M,0KP'#P-"0!!W@ -M8!J0!2+@5)!@!Y`!QN!$0/"0`3PD=[E-##D")`!/'00\/$$Y30PY0F0`3QT(/`24NCE -M-3#@$)`!/70!\)``@^"0EY7PD=YTWP20`<3P=$6C\-`'T`;0!=`$T`/0`M`! -MT`#0T-""T(/0\-#@,N5G9`%P/1)LWK\!!'\!\=V0`$;@1`3]?T;Q4I``1.!4 -M^_U_1/%2D`!&X%3[_7]&\5)_`A)L^H]KD`')Y6OPM`$"\;\B\)``1>!4_OU_ -M1=,0KP'#P-"/@G6#`.WP$D_ET-"2KR*0`3QT__"C\*/PD`$T\*/PH_"C\/U_ -M5/%2??]_5?%2??]_5O%2??]_5X"_D`$PY/"C\*/PH_"0`3CPH_"C\*/P_7]0 -M\5+D_7]1\5+D_7]2\5+D_7]3@).0`$G@D)?`\.!4#_!$\/U_2?%2D)?`X$2P -M_7])X5*0`#\)``@.!$@/U_@.%2X/]]`9"7J^_PH^WP -MY*/PH_#E)V`$Y/\1CI"7J^`PX`F0EZWD\*-T@/"0EZO@_\,3D/T0\)`$)>_P -MD)>LX&`?HZ/@_R0/]8+D-/SU@^!$@/!T$"_U@N0T_/6#X$2`\)"7K:/@__TD -M"/6"Y#3\]8/D\'0)+?6"Y#3\]8/@5/#P="$O]8+D-/SU@^!4]_"0EZW@_J/@ -M_R+O8`N0EX;@M`$0Y/^`"9"7AN"T`05_`1)OJR)]`G\#$C$LY2<4)/U0`H`A -MD)>6X&`&?0%_#(`/D)>3X%0/PY0$4`9]`7\$$=_D_Q&.(GT!?PR/)(TEY214 -M#_^0EY/@5`]O8'#E)##B+9"7D^`@X@1_`7$/D)>3X##C">4D(.,$,96`4)"7 -MD^`@XTGE)##C1*\E<2Z`/I"7D^!4#_^_#`SE)"#C!W&&[V`J,960EY/@5`__ -MOP0,Y20@X@?Q]>]@%#&QD)>3X%0/_[\""!)@`^]@`E'UD)>3X%0/_Y"7E>!4 -M#V]P(^`PYA^0EY/@5`__D)>'X/Y/D`$O\.YD@)"7A_"0EY7@5+_P(I`&!.!$ -M0/#E)K0!!'\!<4V0EY/@5/#PX$0$\"*0`3=T`O"0!2)T__`2;@_O<`:0`.X*/@D`58\.4F,.`: -MD)>+X'`9X`3PD)>3X%0/PY0$4`M]`7\$`=_DD)>+\"*+$HH3B13QSZL2JA.I -M%!(D8O4G%&`.%&`>%&`O)`-P0'\!@#JK$JH3J120``(20B#]Y/]1SX`GJQ*J -M$ZD4D``"$D(@_7\!4<\?@!.K$JH3J120``(20B#]?P)1S^3_,>V0EY1P!70%\(`"[?"0EY3@D)>)\"*0EY/@5/#PX$0!\!)$ -M_1)$_N!4\/#@1`+P(I"7ON_P$FY0D)>^X&`%D`4BY/"0EY/@5/#PX$0$\"*0 -M!@3@5+_P[V`)Y2:T`03D_W%-D)>3X%3P\.!$#/`BCVT21;'O9`%P+I"7@!)' -M^>5M8!!T(2_U@N0T_/6#X$00\(`.="$O]8+D-/SU@^!4[_"0!!]T(/`B<=7O -M9`%@"9`!N.!$`?"`-9"7DN!@"9`!N.!$`O"`)I"7D>!@"9`!N.!$!/"`%Y"7 -ME>!4#].4!$`)D`&XX$0(\(`#?P$BD`&[X$0(\'\`(I`$&^!4?V1_?P%@`G\` -M(L#@P/#`@\""P-!UT`#``,`!P`+``\`$P`7`!L`'D`'$=.3P=$NC\)`!-.!5 -M*/4LD`$VX%4J]2ZCX%4K]2_E+"#@`J%]D`$T=`'PA=%-A=).A=-/A=10A=51 -MA=92A==3A=E4Y5140,,3_^535"!O<`*A-.54,.4"H33E4E0?]0CE350_]0GE -M450?_^4()>`DX_6"Y#24]8/DC_`20H'E4U0?_^4()>`DP/6"Y#21]8/DC_`2 -M0H'E"=.4!$`#=0D$=?`*Y0B0D``20U]U\`+E"1)#7^#^H^#_Y5-4'R__Y#[^ -M=?`*Y0B0D``20U]U\`+E"1)#7^[PH^_PY50@YB3E4U0?_^4()>`D8_6"Y#24 -M]8/DC_`20H'E3S#G-J\($EL^@"_E4U0?_^4()>`DH_6"Y#24]8/DC_`20H'E -M3S#G$N5/5'_]Y5-4'_4.JPFO"!):Z^4G%"3]4`*`0)"7EN!@,I`!6^3PD`$\ -M=`3P<=7O9`%P*'5$%/5%^_U_6'X!$C!BD`%;=`7PD`:2=`'PD)>2\(`(<=6_ -M`0,21-[E+##A(9`!-'0"\(716(7268736H746X757(7678777H797Q)IY.4L -M,.,&D`$T=`CPY2PPY`F0`31T$/!#5Q#E+##E)9`!S^`PY1[@5-_PD`$T="#P -M=:@`=>@`$D>3D``#X%3[\/'E@/[E+##F!I`!-'1`\.4N,.$[D`$V=`+P0U=` -MD`$"X%0#9`%P*)`!-^`PX`IT`?"0EW7D\(`7D)=UX`3PX,.4"D`+Y/"0!!G@ -M,.`"\9KE+C#@$I"7A70!\)`!-O`280:0EX7D\.4N,.)RD`$V=`3PY29D`7!F -MY2=@8N4G9`)@!N4G9`5P)Y`&J^"0EXGPD`:JX)"7E/"0EXG@<`>0EY3@_X`% -MD)>)X/^0EXGO\)"7B^!@`^`4\)"7BN3PD`%7\)`!/'0"\)"7F.!4_?#@5._P -MY2<4)/U0`H`#$D53Y2XPXRB0`39T"/#E)F0!6X&0" -M8`421.B``Q)$CN4N,.8>D`$V=$#PY2:T`1/E)V`/D)>8X%3^\.!4!W`#$D3> -MY2\PX0B0`3=T`O`1J73D!)`!Q/!T2Z/PT`?0!M`%T`30`]`"T`'0`-#0T(+0 -M@]#PT.`R$D6QOP$0D`()X/]]`1)'_9`$'W0@\")U*#/D]2EU*@/U*Y`!,.4H -M\*/E*?"CY2KPH^4K\"+DD)>7\)"7BO"0EYCP(O3_D`!#X%_PTQ"O`!$`O"`-Y"7E>!4 -M#].4`D`)D`&YX$0$\(`CD)>8X##B"9`!N>!$"/"`$Y"7F.`PY`F0`;G@1!#P -M@`-_`2*0`;O@1`3P?P`B=3`?=3$!Y/4RD`$XY3#PH^4Q\*/E,O`BY)"73_"C -M\'6.`A)'Z9```N!4X)"7A&`%=`'P@`-T`O"0`//@,.,(D)>&=`'P@`7DD)>& -M\)"7AN"T`1.0`/+@,.<,D)=K=/WPHW0S\(`*D)=K=/WPHW0O\.3U5Q)H`A)O -MHA)?M!(N`1)N"Q)/L>20EX7PD`#SX##B#9`%0700\)`%6O"CY/"0`61TH/`1 -M5Q)$_Q)WW)"74>79\!)':,*OD`"`X$1`\!)/Y77H`T.HA=*OD)=/X&0!\"1O -MD`'$\'10H_#E5S#D"<*O4U?OTJ]QGN57,.86PJ]35[_2KQ)A^9"7/.#_8`.T -M`0(QE)"7/.!P`Q)X.C%G@+F0!C3@8"8435_^7X!$FVIOP$)D`8U -MX%0/\(`%@``";9ODD`8T\"*0ES/@PY044`7@!/!!3)"7,^!D%&`"04R0ET+@ -M<"60ET7@0!/W@5/[PD)="X)`$ -M1/"0ET/@D`1%\)"71."0!$;PH^3PD)=%X)`$2/"0ET;@D`1)\)"71^"0!$KP -MH^3PD)#^TY]0"Y"72^##GM.4`4`0D)"0ETGPD`5BX)"72O"0!6/@D)=+\,-T_Y_^D)=) -MX-.>0![@+_"CX+3_#^3PH^"T_P/D\"*0ETN``Y"72N`$\"*0ETG@+_`BD)#_49:0ETQT`1)'2(!`D)=,X&0!<#B0ESW@_U&6 -MY)"73/"0`$7@1`']?T421U*0ES+@8!60ES020U.0@)82)0A_@'X($BL(@`60 -M!2+D\)`%A^!D@/"0ETC@D`6$\)"72>"0!87PD)=*X)`%AO"0ETO@D`6'\"*0 -M`]X/]T`7X`J`<(@`7#,\XSSMCY_^]=<`*! -MV)"7O>!U\`20`=`20U_@D)=3\'5C`75DEW5E4W5F`7L!>I=Y5!)%"9"75.#_ -MQ!,3$U0!D)>],.!9X'7P`I``B!)#7^"0EU7PD)>]X'7P`I``B1)#7^"0EU;P -MD)>]X'7P!)`!T1)#7^"0EU?PD)>]X'7P!)`!TA)#7^"0EUCPD)>]X'7P!)`! -MTQ)#7^"0EUGP@#/@=?`$D`'1$D-?X)"75?"0E[W@=?`$D`'2$D-?X)"75O"0 -ME[W@=?`$D`'3$D-?X)"75_#O5'__>P%ZEWE5D>"0EU+@_Y"7O>#^=`&H!@B` -M`L,SV/ST7Y"74O"0E[W@_W0!J`<(@`+#,]C\D`',\)"7O>`$\.!4`_!AJ)`! -MQN!$`O`BD)=:$D.+[Q)#E%4,`545`E4>`U4G!54P!E5C!U4X"55!#%5*#553 -M#@``55R0EUH20VL":N&0EUH20VL":PN0EUH20VL":Q&0EUH20VL":;60EUH2 -M0VN`+)"76A)#:P)K69"76A)#:P)Y$I"76A)#:P)WJ9"76A)#:P)V(I`!QN!$ -M`?`BD``$$D(@_U0?_N]4(,035`?]KP:0EUWO\*/M\*,20XN0EU\20VN0``,2 -M0B!4\,14#Y"78O"0``020B!40,03$U0#D)=C\)"77>#_=?`)D),E$D-?K8*L -M@Y"79.SPH^WP[W7P":0D(_ETDS7P^GL!HQ)#BY"77Q)#:Y```Q)"(%0/_Y"7 -M9A)#:^\20DV0EU\20VN0``(20B#_D)=F$D-KD``![Q)"7Y"77Q)#:Y```1)" -M(/^0EV3@_*/@_?6"C(/O\!(D8HV"C(.C\)"78N#^D)==X/\DP?6"Y#22]8/N -M\)"77N#^=?`)[Y"3*1)#7^[P=?`)[Y"3*A)#7W0!\)"78^#^=?`)[Y"3*Q)# -M7^[PCQ+O)>`DY/6"Y#25KX+U%(\5Y1)U\`*D)('Y=)(U\'46`?47B1AU\`GE -M$I"3)1)#7Z^"A8,9CQKE$G7P":0D(_ETDS7P=1L!]1R)'73!)1+U@N0TDO6# -MX!)#E%;R`%<'`5<<`E%!E>L#%?:#5@'#E@T#P``6&CE$B7@ -M).3U@N0TE?6#=/#PHW05@#SE$B7@).3U@N0TE?6#=/#PHW00@"?E$B7@).3U -M@N0TE?6#=/#PHW0%@!+E$B7@).3U@N0TE?6#=/#PH^3PY1(EX"2!]8+D-)+U -M@W0/\*-TC_`"6&CE$B7@).3U@N0TE?6#=`_PHW3U@"?E$B7@).3U@N0TE?6# -M=`_PHW3P@!+E$B7@).3U@N0TE?6#Y/"C=`WPY1(EX"2!]8+D-)+U@^3PH_`" -M6&B0!$?@JQ:J%ZD8$D)-D`1&X*L6JA>I&)```1)"7Y`$1>"%%8*%%(/PD`1$ -M`EA?D`1+X*L6JA>I&!)"39`$2N"K%JH7J1B0``$20E^0!$G@A16"A12#\)`$ -M2(!8D`1/X*L6JA>I&!)"39`$3N"K%JH7J1B0``$20E^0!$W@A16"A12#\)`$ -M3(`KD`13X*L6JA>I&!)"39`$4N"K%JH7J1B0``$20E^0!%'@A16"A12#\)`$ -M4."%%8*%%(.C\*L6JA>I&,`#P`+``1(D8O^K&ZH0U%_K``\`"P`$2)&+_JQNJ'*D=D``!$D(@7]`!T`+0`Q)"3845 -M@H44@\"#P(+@_X4:@H49@^#^[U[0@M"#\(45@H44@Z/`@\""X/^%&H*%&8.C -MX/[O7M""T(/PY1(EX"2!]8+D-)+U@^#^H^!.8#MU$PMT`7X`J!,(@`7#,\XS -MSMCY_^42)>`D@?6"Y#22]8/@7OZCX%].8`;E$R00@%T5$^43PY0`4,J`5N42 -M)>`DY/6"Y#25]8/@_J/@3F`]=1,/=`%^`*@3"(`%PS/.,\[8^?_E$B7@).3U -M@N0TE?6#X%[^H^!?3F`(D)=IY1/P@!`5$^43PY0`4,B`!>20EVGPY1(EX"3D -M]8+D-)7U@^#^H^!.8#OD]1-T`7X`J!,(@`7#,\XSSMCY_^42)>`DY/6"Y#25 -M]8/@7OZCX%].8`B0EVKE$_"`6P43Y1.T$,J`4N42)>`D@?6"Y#22]8/@_J/@ -M3F`YY/43=`%^`*@3"(`%PS/.,\[8^?_E$B7@)('U@N0TDO6#X%[^H^!?3F`& -MY1,D$(`*!1/E$[0,S(`%Y)"7:O"0EVG@_W7P">42D),G$D-?[_"0EVK@_G7P -M">42D),H$D-?[O!TA"42]8+D-`3U@^#3GT`%D)=I4<)TA"42]8+D-`3U@^#_ -MD)=JX/[OPYY0`E'"D)=IX/_3E!-`")"3(G0#\(`A[].4"T`(D),B=`+P@!/O -MTY0#0`B0DR)T`?"`!>20DR+PD),BX)`$L?`BX/UTA"42]8+D-);U@^WPKQ+3 -M$*\!P\#0=(0O]8+D-`3U@^WPT-"2KR+M5!_U$'0!+_6"Y#22]8/@]0^0!/W@ -MM`$%=1$#@`-U$0'KPY410`*`*N4/)0[^Y1"00=:3_.[3G'0!0`PO]8+D-)+U -M@^3P@*`O]8+D-)+U@^[P(JP'=?`)[)"3)Q)#7^#_=*4L]8+D-);U@^!4'_O3 -MGT`"JP?K)>`DGO6"Y#1!]8/DD_YT`9/_ZR7@)&;U@N0T0?6#=`&3+__DDS[# -M$_[O$__L)>`DX?6"Y#22]8/N\*/O\*\$K0-1TZ\#(JH'KP5TA"KU@N0T!/6# -MX%1_^U0?^9"77O!U\`GJD),H$D-?X)"78/!U\`GJD),G$D-?X/Z0EV'PZB7@ -M).3U@N0TE?6#X/VCX)"78LWPH^WPZB7@)('U@N0TDO6#X/VCX)"79,WPH^WP -MZ=.>0`F0EV'@D)=>\/OO<`*!Y)"77^_PZS#F"9"77N#[H^`4\)"77^!P`H'D -MD)=>X/_3E`!0`H'DY)"77?#O%)"77/"0EV#@^9"77.#_TYE`:N^4$$`A[R3P -M_W0!?@"H!PB`!<,SSC/.V/G_D)=DX%[^H^!?3G`GD)=##GU`,D)=V0DR<20U_@ -M_Y"77/#M)>`D@?6"Y#22]8/@^Z/@D)==R_"CZ_#M)>`DY/6"Y#25]8/@^Z/@ -MD)=?R_"CZ_#L)>`D9O6"Y#1!]8/DD_IT`9/[[27@).'U@N0TDO6#ZO"CZ_#L -MPY]``L$M=*4M]8+D-);U@^SP!/N0EUS@_^O3GT`"P5[KPY000"'K)/#_=`%^ -M`*@'"(`%PS/.,\[8^?^0EUW@7OZCX%].<"/KPY004#ET`7X`J`,(@`7#,\XS -MSMCY_Y"77^!>_J/@7TY@'.MD$V`(ZV028`.[$0F0EUW@,.`">QBL`XP=@#0+ -M@(N0EUS@^VQP:72E+?6"Y#26]8/L\'7P">V0DRD20U_@M`$,Y1T@Y@?L1$#U -M'8`#KQTB["7@))[U@N0T0?6#Y)/^=`&3_^PEX"1F]8+D-$'U@W0!DR__Y),^ -MPQ/^[Q/_[27@).'U@N0TDO6#[O"C[_"`6^S3FT!6D)=4=1(#] -M4=/E'42`_R+`X,#PP(/`@L#0==``P`#``<`"P`/`!,`%P`;`!Y`!Q'04\'1? -MH_!3D>^0`%'@_Y``5>!?]3WE/3#F&'1`\)"7.^!4`_^_`PN0ESC@8`5_`1)V -M^N4],.<5D`!5=(#PD)<[X%0#_[\#!7\"$G;ZD`'$=!3P=%^C\-`'T`;0!=`$ -MT`/0`M`!T`#0T-""T(/0\-#@,H\>C!^-("*/(8PBC2,BY/4FD)>8\/4GD)>5 -M=`SPD)>3\.20EY;PD)>2\)"7D?"0EY0$\)"7B?#DD)>7\)"7B_"0EY!T!_#D -MD)>*\)"7CO"C=`+PY)"7C?"0EXCP(N578`F0`;K@1`'P@%N0EY7@5`_3E`%` -M"9`!NN!$`O"`1Y`"A^!@"9`!NN!$!/"`.)"7A."T`A"0EVO@_J/@]8*.@^!@ -M$8`AD`&OX&`)D`&ZX$0(\(`2D)>-X'`)D`&ZX$00\(`#?P$BD`&[X$0"\'\` -M(H]LY)"7M_"C\)`!">!_`##G`G\![V5L8#[#D)>XX)2(D)>WX)030`B0`<;@ -M1(#P(I"7M^1U\`$20H%_%'X`$C(5TY"7N."4,I"7M^"4`$"YD`''X##@LB*/ -M;A)%L>]D`7`ND)>!$D?YY6Y@$'0A+_6"Y#3\]8/@1!#P@`YT(2_U@N0T_/6# -MX%3O\)`$'W0@\"+DD)=-\.4G8&[E)F0!<&CE)Q1@*23]8"4D`B3[4`*`(Y"7 -MB>`4\.!@!*/@8!:0EXG@<`J0EY3@D)>)\(``D)=-=`'PD)=-X&`ND)>8X$00 -M\.20EYWPD)>0X)"7GA)$:)`!5W0%\)"7D^!4#\.4!%`'?0%_!!)(WR*0EY?@ -M8`[D\*/@5/WPX%0'<"B`(Y"7BN`$\)"7F.!4[_"0EXK@TY0!0`WE)K0!"Z/@ -M<`?@!/`B$D3>(N_#E"!0.>\PX!?MQ%3P_>_#$_XDI/6"Y#0$]8/@5`^`$._# -M$_XDI/6"Y#0$]8/@5/#P=*0N]8+D-`3U@^!-\"+D]1)U\`GE$I"3*A)#7^!D -M`6`"X?7E$B7@),#U@N0TD?6#X/ZCX-.4`.Z4`%`"X?7E$G7P"J0D`/ETD#7P -M=142)>`DP/6"Y#21]8/@_Z/@D)=6S_"C[_#E$B7@)&/U@N0TE/6# -MX/^CX)"76,_PH^_P=(0E$O6"Y#0$]8/@5#^0EU+PX/Y4'Z/P=?`)Y1*0DR<2 -M0U_@D)=;\'1D)1+U@N0TEO6#X,.4!4`"@<^0EUO@_Y"74^"?0!.0EUO@D)=3 -M\.Y40/Z0EU+P[T[PD`3]X&0!<"F0EU/@_Y!!2I/^=",E$O6"Y#25]8/@PYY` -M!N^00-J`,)"74^"00/:`)Y"74^#_D$%*D_YT(R42]8+D-)7U@^##GD`&[Y!! -M$H`'D)=3X)!!+I.0EUKPD)=:X'7P!J0D4/ET0#7P=13_]16)%I"74N"00?*3 -M_].0EUG@GY"76."4`$`)Y/VO$A);I^&,Y1(EX"3A]8+D-)+U@^#U&J/@]1NK -M%*H5J182)&+_?@"K%ZH8J1D20I?]K/`2)'OO)1OU&^XU&O4:JQ2J%:D6D``! -M$D(@_WX`JQ>J&*D9D``"$D+"_:SP$B1[[R4;]1ON-1KU&JL4JA6I%I```A)" -M(/]^`*L7JABI&9``!!)"POVL\!(D>^\E&_4;[C4:]1JK%*H5J1:0``,20B#_ -M?@"K%ZH8J1F0``820L+]K/`2)'OO)1OU&^XU&O4:JQ2J%:D6D``$$D(@_WX` -MJQ>J&*D9D``($D+"_:SP$B1[[R4;]1ON-1KU&JL4JA6I%I``!1)"(/]^`)"7 -M5N#\H^#]$B1[T^4;G^4:GD`,Y1N?]1OE&I[U&H`%Y/4:]1OE$B7@).'U@N0T -MDO6#Y1KPH^4;\)"74N#Y)>`D9O6"Y#1!]8/#=`&3E1ODDY4:4`>O$A)=*^%@ -MZ27@))[U@N0T0?6#TW0!DY4;Y).5&E`"X6!]`:\2$ENGX6!T9"42]8+D-);U -M@^#\9`5@`L%JD),BX/^T`PN0EU/@PY090#V`+N^T`@N0EU/@PY010"Z`'Y"3 -M(N#_M`$+D)=3X,.4"D`;@`SO20E4/P=$,E -M$O6"Y#24]8/@]1QT(R42]8+D-)7U@^#_PY0P4`+!%Y"50^!D`6`"P1=T1"42 -M]8+D-)7U@^!D"F!1[R0%_^0S_G0A)1+U@N0TDO6#X/W3G^YD@/AT@)A0,NTD -M!?_D,_YT(R42]8+D-)7U@^#3G^YD@/AT@)A0%'2$)1+U@N0TEO6#X/^0EU/@ -M;V`]=",E$O6"Y#25]8/@_].40D`%=1P%@`[OTY0Y0`5U'`.``W4<`70A)1+U -M@N0TDO6#[_!T1"42]8+D-)6`*71D)1+U@N0TEO6#Y/!T1"42]8+D-)7U@^`$ -M\(`0Y/4<=&0E$O6"Y#26]8/D\)"74^#_=(0E$O6"Y#26]8/O\'1#)1+U@N0T -ME/6#Y1SP=?`)Y1*0DRL20U_@M`$0Y/4<=&0E$O6"Y#26]8/D\*TY"75.[PH^_P=$,E$O6"Y#24]8/@ -M]1SD]1.K%ZH8J1EU\`+E$Z3U@H7P@Q)"POVL\.43D$(.D_]^`!(D>^\E&_4; -M[C4:]1K#D)=5X)4;D)=4X)4:0`<%$^43M`6]Y1/#$_43Y1RT`0;E$W!&@!/E -M'+0#%>43<`5U'`.`.>43M`$%=1P!@"^`*N43U\!)"^JL7JABI&9```N3U\!)#&9`` -M!.3U\!)#&9``!N3U\!)#&9``".3U\!)#&>42)>`DP/6"Y#21]8/D\*/PY1(E -MX"1C]8+D-)3U@^3PH_#E$B7@)*/U@N0TE/6#Y/"C\`42Y1+#E"!0`P)A_"*0 -M!$1T$?"C=/#PHW0/\*/D\/UTI"WU@N0T!/6#Y/`-O1#PY/UU\`KMD)``$D-? -MY/"C\'7P"NV0D`(20U_D\*/P=?`*[9"0!!)#7^3PH_!U\`KMD)`&$D-?Y/"C -M\'7P"NV0D`@20U_D\*/P=(0M]8+D-);U@W03\'1$+?6"Y#25]8/D\'1#+?6" -MY#24]8/D\.TEX"3`]8+D-)'U@^3PH_#M)>`D8_6"Y#24]8/D\*/P[27@)./U -M@N0TE/6#Y/"C\.TEX"2C]8+D-)3U@^3PH_#M)>`D9/6"Y#25]8/D\*/P[27@ -M)*3U@N0TE?6#Y/"C\'1$+?6"Y#26]8/D\'0D+?6"Y#26]8/D\'1D+?6"Y#26 -M]8/D\)!!Q)/^=`&3_Y!!C'0!DR__Y),^PQ/^[Q/_[27@).'U@N0TDO6#[O"C -M[_!U\`GMD),J$D-?=`'P=?`)[9"3*1)#7W0!\'3!+?6"Y#22]8-T#/!U\`GM -MD),E$D-?=/_PH_!U\`GMD),C$D-?Y/"C=`_P=?`)[9"3)Q)#7W03\'7P">V0 -MDR@20U_D\'2$+?6"Y#0$]8-T$_`-[60@8`(!)B(2)&+U$L.4(%`5D``"$D(@ -M_W0C)1+U@N0TE?6#[_`BY1*T(`J0``(20B"0DR'P(I"73>!4\$0#\%0/1(#P -M>P!Z`'E8D)>H$D.+"WJ7>4W3$*\!P\#0D)>E$D.+D)>$X&0"8&Z0EX3@9`%P -M9I"7O^#_!/"0EZ420VN0``'O$D)??Z]^`5&+[V!)D)>E$D-KBV.*9(EE=68" -M>P%Z`7F@$D4)D)>H$D-KBV.*9(EED)>E$D-K$B1B_\14#_5F>P%Z`7FB$D4) -MD`&O=/_PD`'+X&2`\-#0DJ\BTQ"O`QY'7P`1)"@7\* -M?@`2,A6`Q7\!T-"2KR+3$*\!P\#0D``!$D(@D)>6\)```Q)"()"7B/`2)&)E -M)V`#$DINT-"2KR(2)&+U)B*0`@G@_1(D8OZO!>TND)=^\)```1)"(/_M+Y"7 -M?_"0``(20B#_[2^0EX#PD``#$D(@_^TOD)>!\)``!!)"(/^N!>TOD)>"\"+3 -M$*\!P\#0D)==$D.+D)==$D-KD``!$D+"^N7P)`#_Y#K^D)==$D-KD``![H_P -M$D,9$B1B_V`LM6<6D)==$D-KD``!$D+"96EP!.5H9?!@(Y"771)#:Y```1)" -MPO^N\''1@!"0EUT20VL2)&)E9V`#$D35T-"2KR*0EV#N\*/O\'5G`8YH]6GD -M_7\+D13D_7\"D121WN3_$D?=Y/5KD`')Y6OPD)=@X/RCX/WL^XU$Y/5%?0%_ -M8'X!`C!BTQ"O`#]=`%^`*@%"(`%PS/.,\[8^?^0`$3@^^3^[UNH!0B`!LZB -MYQ/.$]CX_X!$D)?!X"3X\.#_=`&H!PB``L,SV/P23]V0E\'@_70!?@"H!0B` -M!<,SSC/.V/G_D`!"X/OD_N];J`4(@`;.HN<3SA/8^/_0T)*O(I`&-'3_\.2C -M\*/PH_`BCA*/$XL4BA6)%N20EU+P[Y``,?`23^7E$E0#_Y``,N!4_$_P$D_E -MD``SX%1_\!)/Y9``,^`@YPZ0EU+@PY1D4`7@!/"`ZY"74N##E&10$)``,."K -M%*H5J1820DU_`2)_`"+D]6HBY)"7N?"C\)`%^.!P#Z/@<`NCX'`'H^!P`W\! -M(M.0E[K@E.B0E[G@E`-``W\`(G\R?@`2,A60E[GD=?`!$D*!@,:0`!'@1`GP -M$D_ED)<=$D-3D("6$B4(?WA^"!(K")"7(1)#4Y"`EA(E"'\$?@P2*PB0ER42 -M0U.0@)82)0A_`'X($BL(D)3]?P$2,"PB?WA^"!(B99"7'1(E"'\$ -M?@P2(F60ER$2)0A_`'X($B)ED)&X)"7';0!#1)#4^]4Q__M5,?] -M@`<20U/O5,?_[)"`EA(E"']X?@@2*PB0ER$20U/O5`__[)"`EA(E"'\$?@P2 -M*PB0ER420U/O1`+_[)"`EA(E"'\`?@@2*PA_<'X.$B)ED)&X+0!$9"`:!(E%`````#D -M_7\!$C`LD``1X%3V\`)/Y9"7AN"0ERWP(N]P`P)Q8Y"7+>!@`P)U+I"7&1)# -M4Y"`EA(E"'^,?@@2*PB0EL420U.0@)82)0A_1'X($BL(D);)$D-3D("6$B4( -M?UQ^"!(K")"6S1)#4Y"`EA(E"']L?@X2*PB0EM$20U.0@)82)0A_<'X.$BL( -MD);5$D-3D("6$B4(?W1^#A(K")"6V1)#4Y"`EA(E"']X?@X2*PB0EMT20U.0 -M@)82)0A_?'X.$BL(D);A$D-3D("6$B4(?X!^#A(K")"6Y1)#4Y"`EA(E"'^$ -M?@X2*PB0END20U.0@)82)0A_B'X.$BL(D);M$D-3D("6$B4(?XQ^#A(K")"6 -M\1)#4Y"`EA(E"'_0?@X2*PB0EO420U.0@)82)0A_U'X.$BL(D);Y$D-3D("6 -M$B4(?]A^#A(K")"6_1)#4Y"`EA(E"'_S$B4(D)>S$D-3[43`_>R0E[,2)0B0E[,20U.0@)82)0A_C'X($BL( -MD("6$B44``$``']$?@@2*PB0@)82)10`VR6D?UQ^"!(K")"`EA(E%"#;):1_ -M;'X.$BL(D("6$B44(-LEI']P?@X2*PB0@)82)10$&R6D?W1^#A(K")"`EA(E -M%`0;):1_>'X.$BL(D("6$B44!!LEI']\?@X2*PB0@)82)10$&R6D?X!^#A(K -M")"`EA(E%&/;):1_A'X.$BL(D("6$B44!!LEI'^(?@X2*PB0@)82)10@VR6D -M?XQ^#A(K")"`EA(E%"#;):1_T'X.$BL(D("6$B44(-LEI'_4?@X2*PB0@)82 -M)10@VR6D?]A^#A(K")"`EA(E%``;):1_W'X.$BL(D("6$B44`!LEI'_@?@X2 -M*PB0@)82)10DVR6D?^Q^#A(K"'\$?@P2(F60E[,2)0B0E[,20U/D_^R0E[,2 -M)0B0E[,20U/O1!'_[)"7LQ(E")"7LQ)#4Y"`EA(E"'\$?@P2*PA_!'X-$B)E -MD)>S$B4(D)>S$D-3[U3P_^R0E[,2)0B0E[,20U/O1`'_[)"7LQ(E")"7LQ)# -M4Y"`EA(E"'\$?@T2*PA_#'X)$B)ED)>S$B4(D)>S$D-3Y/_LD)>S$B4(D)>S -M$D-3[T01_^R0E[,2)0B0E[,20U.0@)82)0A_#'X)$BL(?PQ^"1(B99"7LQ(E -M")"7LQ)#4^U4#_WL5/#\D)>S$B4(D)>S$D-3[400_>Q$`?R0E[,2)0B0E[,2 -M0U.0@)82)0A_#'X)$BL(?P1^"!(B99"7LQ(E")"7LQ)#4^]4\/_LD)>S$B4( -MD)>S$D-3[T0!_^R0E[,2)0B0E[,20U.0@)82)0A_!'X($BL(Y)"7+?`BTQ"O -M`[[_#3E`=09>#_=`&H!PB``L,SV/ST_Y``1^!?\!)/Y9"7 -MN^#_=`&H!PB``L,SV/S_D`!&X$_P$D_ED)>\X&`6D)>[X/]T`:@'"(`"PS/8 -M_/^0`$6`:)"7N^#_=`&H!PB``L,SV/ST_Y``18!MD)>[X"3X\.#_=`&H!PB` -M`L,SV/S$5/`23]V0E[O@_W0!J`<(@`+#,]C\_Y``0^!/\!)/Y9"7O.!@&Y"7 -MN^#_=`&H!PB``L,SV/S$5/#_D`!"X$^`&I"7N^#_=`&H!PB``L,SV/S$5/#T -M_Y``0N!?\!)/Y=#0DJ\BBQ**$XD4D``"$D(@D)<[\.`PX$N0ES)T`?!_@'X( -M$B)ED)D`!'X%3S_7]'$D=2D`!(X%3S_7]($D=2D`!&X%3O_7]&$D=2 -MY)"7./`B[Q1@,A1@:B0"8`+AJ)"7.'0"\)``2.!$#/U_2!)'4I``1^!$"/U_ -M1Q)'4I``1>!$$/U_18!UY)"7./"0ES020U.0@)82)0A_@'X($BL(D`!%X$3O -M_7]%$D=2D`!%X%3O_7]%$D=2D`!&X$00_7]&@#J0ESAT`?"0ESX20U.0@)82 -M)0A_@'X($BL(D`!%X$0@_7]%$D=2D`!%X$00_7]%$D=2D`!&X$00_7]&$D=2 -M(I```A)"()"7//#@8`3@]'`AHJ_D,_42PJ^0`$?@5/O]?T<21U)]0'\!$C%F -MY1(D_Y*O(N3]?T421U*0!/WD\*/PD)<\\)"70O"0ET7PD)=#\)"71O"0ET3P -MD)='\)"7+@3PY*/PH_"C\)"7,_"0ESCPD)`$\(`DD)=#X,.4_U`& -MX`3PY(`1D)=$X,.4_U`,X`3PY)"70_"0ET+PD`!$X##C,I"71>##E/]0!>`$ -M\(`DD)=&X,.4_U`&X`3PY(`1D)='X,.4_U`,X`3PY)"71O"0ET7PD`3]X$0! -M\"*0``(20B"0ESKPD``!$D(@)>`EX)"7.?`2)&(EX"7@D)<]\)`%8."0ETCP -MD`5AX)"72?"0!6+@D)=*\)`%8^"0ETOPHJ_D,Y"77?#"KY"7.>#_$E*6D)== -MX"3_DJ^0ESK@<`)!')"7.>!P`D$`+9"7 -M.N!P+Y"73!)'2)``1N!4_OU_1A)'4I`%(N3PHJ\SD)==\,*O?2#D_Q(Q29"7 -M7>`D_Y*O(D98PH@"`$L````&%1,10CH!`#5H`0`````````````````"0[H` -M`````````````````````DOD```````````````````````````````````` -M`````````````````````````E\4``````"AWP````4$`P(``P8%!`,`!`8% -M!`(`!`@'!@0`!@H)"`8`"`H)"`0`"`H)"`(`"`H)"```"!(1$`@`$!H9&!`` -M&"(A(!@`("(A(!``("(A(`@`("(A'`@`("(A%`@`("(@&`@`(#$P(!``,#$P -M&```,#$O$!``,#$L$!``,#$H$```,#$@$```,#$0$```,`0$!`4$!`0%!04& -M!@0$!`4%!08&!`0%!04%!@8$!`4%!04&!PH+#1`$!04&!@D,$0@("0D*#!`1 -M!`0$!00$!0<'!P@*!`0$!`8*"PT%!0<'"`L-#P0$!`4'!PD)#`X0$@0$!04& -M"A$3"0D)"0P.$1,````````````D)BH8&AT?(2`"@`,@!0`&0`>`",`$L`4`!X`+0`^@$ -ML`9`!]```@`"``0`"``,`!(`&``D`#``2`!@`&P`*``\`%``9`"@`,@`\`$8 -M`&0`H`#P`6@!]`)8`R`#Z`("`@("`@,#!`0%!P0$!PH*#`P2!0<'"`L2)#P! -M`0$!`0(#!`4&!P@!`@,$!08'"`4&!P@)"@L,(!X<&!`8```````````````` -MNP$,Y8(I]8+E@SKU@^`B4`;I)8+XYB*[_@;I)8+XXB+E@BGU@N6#.O6#Y),B -MNP$&B8**@_`B4`+W(KO^`?,B^+L!#>6"*?6"Y8,Z]8/H\")0!NDE@LCV(KO^ -M!>DE@LCR(L7P^*/@*/#%\/CE@A6"<`(5@^`X\"*[`0J)@HJ#X/7PH^`B4`:' -M\`GG&2*[_@?C]?`)XQDBB8**@^23]?!T`9,BNP$0Y8(I]8+E@SKU@^#U\*/@ -M(E`)Z26"^(;P".8BN_X*Z26"^.+U\`CB(N6#*O6#Z9/U\*/IDR*[`0J)@HJ# -M\.7PH_`B4`;W":?P&2*[_@;SY?`)\QDB^+L!$>6"*?6"Y8,Z]8/H\.7PH_`B -M4`GI)8+(]@BF\"*[_@GI)8+(\N7P"/(B[TO_[DK^[4G][$C\(N#\H^#]H^#^ -MH^#_(J0E@O6"Y?`U@_6#(N#[H^#ZH^#Y(OC@^Z.CX/DE\/#E@A6"<`(5@^#Z -M./`BZ_"CZO"CZ?`BT(/0@OCDDW`2=`&3<`VCHY/X=`&3]8*(@^1S=`*3:&#O -MHZ.C@-\"0_@"4&_DDZ/XY).C0`/V@`'R"-_T@"GDDZ/X5`1^`9-@O*/_5#\PY0E4'_[DDZ-@ -M`0[/5,`EX&"H0+CDDZ/ZY).C^.23H\C%@LC*Q8/*\*/(Q8+(RL6#RM_IWN>` -MODB7=@``````````2)=M``````````!!EW4`09>]`$&7AX!!E[\``/"C=`/P -MY/O]?U1^`=,0KP'#P-"0EYSK\*/@^Z/@]43D]442-:O0T)*O(I`!7^3PD`$\ -M=`CPY)"7G?"C=!3PY/O]?UQ^`9%PD`%?=`7PD`:2=`+PD)>1%/"0EY/@5`_# -ME`Q0`Q)(VR*/@HZ#HZ.CY/`BY/5G?V!^`8#MD)>5X/]]`0)(W[&QOP$/D)=_ -MX/_D_?']D`0?="#P(B(B(B(```)?I@)?K=,0KP'#P-"+8(IAB6*0EY]QBZMC -MJF2I99"7HG&+KV859N]@&Y"7HN1U\`%Q=!(IV?^0EY_D=?`!<73O44V`WJM@ -MJF&I8M#0DJ\BD`:IX/4+5,!P#9"7F.!4_O#@5/WPD=[E"S#F%Y"7F.!$`?"0 -MEY;@9`)@!)'H@`N1CH`'D)>8X%3^\.4+D)>8,.<7X$0"\.20EYV19)`!5W0% -M\)"7EW0!\"+@5/WP(M,0KP'#P-"0!!W@8!J0!2+@5)!@!Y`!QN!$0/"0`3PD=[E-##D -M")`!/'00\/$$Y30PY0F0`3QT(/`24NCE-3#@$)`!/70!\)``@^"0EY7PD=YT -MWP20`<3P=$6C\-`'T`;0!=`$T`/0`M`!T`#0T-""T(/0\-#@,N5G9`%P/1)L -MWK\!!'\!\=V0`$;@1`3]?T;Q4I``1.!4^_U_1/%2D`!&X%3[_7]&\5)_`A)L -M^H]KD`')Y6OPM`$"\;\B\)``1>!4_OU_1=,0KP'#P-"/@G6#`.WP$D_ET-"2 -MKR*0`3QT__"C\*/PD`$T\*/PH_"C\/U_5/%2??]_5?%2??]_5O%2??]_5X"_ -MD`$PY/"C\*/PH_"0`3CPH_"C\*/P_7]0\5+D_7]1\5+D_7]2\5+D_7]3@).0 -M`$G@D)?`\.!4#_!$\/U_2?%2D)?`X$2P_7])X5*0`# -M\)``@.!$@/U_@.%2X/]]`9"7J^_PH^WPY*/PH_#E)V`$Y/\1CI"7J^`PX`F0 -MEZWD\*-T@/"0EZO@_\,3D/T0\)`$)>_PD)>LX&`?HZ/@_R0/]8+D-/SU@^!$ -M@/!T$"_U@N0T_/6#X$2`\)"7K:/@__TD"/6"Y#3\]8/D\'0)+?6"Y#3\]8/@ -M5/#P="$O]8+D-/SU@^!4]_"0EZW@_J/@_R+O8`N0EX;@M`$0Y/^`"9"7AN"T -M`05_`1)OF")]`G\#$C9UY2<4)/U0`H`AD)>6X&`&?0%_#(`/D)>3X%0/PY0$ -M4`9]`7\$$=_D_Q&.(GT!?PR/)(TEY214#_^0EY/@5`]O8'#E)##B+9"7D^`@ -MX@1_`7$/D)>3X##C">4D(.,$,96`4)"7D^`@XTGE)##C1*\E<2Z`/I"7D^!4 -M#_^_#`SE)"#C!W&&[V`J,960EY/@5`__OP0,Y20@X@?Q]>]@%#&QD)>3X%0/ -M_[\""!)@`^]@`E'UD)>3X%0/_Y"7E>!4#V]P(^`PYA^0EY/@5`__D)>'X/Y/ -MD`$O\.YD@)"7A_"0EY7@5+_P(I`&!.!$0/#E)K0!!'\!<4V0EY/@5/#PX$0$ -M\"*0`3=T`O"0!2)T__`2;@_O<`:0`.X*/@D`58\.4F,.`:D)>+X'`9X`3PD)>3X%0/PY0$4`M] -M`7\$`=_DD)>+\"*+$HH3B13QSZL2JA.I%!(IV?4G%&`.%&`>%&`O)`-P0'\! -M@#JK$JH3J120``(20B#]Y/]1SX`GJQ*J$ZD4D``"$D(@_7\!4<\?@!.K$JH3 -MJ120``(20B#]?P)1S^3_,>V0EY1P!70%\(`" -M[?"0EY3@D)>)\"*0EY/@5/#PX$0!\!)$_1)$_N!4\/#@1`+P(I"7ON_P$FY0 -MD)>^X&`%D`4BY/"0EY/@5/#PX$0$\"*0!@3@5+_P[V`)Y2:T`03D_W%-D)>3 -MX%3P\.!$#/`BCVT21;'O9`%P+I"7@!)'^>5M8!!T(2_U@N0T_/6#X$00\(`. -M="$O]8+D-/SU@^!4[_"0!!]T(/`B<=7O9`%@"9`!N.!$`?"`-9"7DN!@"9`! -MN.!$`O"`)I"7D>!@"9`!N.!$!/"`%Y"7E>!4#].4!$`)D`&XX$0(\(`#?P$B -MD`&[X$0(\'\`(I`$&^!4?V1_?P%@`G\`(L#@P/#`@\""P-!UT`#``,`!P`+` -M`\`$P`7`!L`'D`'$=.3P=$NC\)`!-.!5*/4LD`$VX%4J]2ZCX%4K]2_E+"#@ -M`J%]D`$T=`'PA=%-A=).A=-/A=10A=51A=92A==3A=E4Y5140,,3_^535"!O -M<`*A-.54,.4"H33E4E0?]0CE350_]0GE450?_^4()>`DX_6"Y#24]8/DC_`2 -M0H'E4U0?_^4()>`DP/6"Y#21]8/DC_`20H'E"=.4!$`#=0D$=?`*Y0B0D``2 -M0U]U\`+E"1)#7^#^H^#_Y5-4'R__Y#[^=?`*Y0B0D``20U]U\`+E"1)#7^[P -MH^_PY50@YB3E4U0?_^4()>`D8_6"Y#24]8/DC_`20H'E3S#G-J\($EL^@"_E -M4U0?_^4()>`DH_6"Y#24]8/DC_`20H'E3S#G$N5/5'_]Y5-4'_4.JPFO"!): -MZ^4G%"3]4`*`0)"7EN!@,I`!6^3PD`$\=`3P<=7O9`%P*'5$%/5%^_U_6'X! -M$C6KD`%;=`7PD`:2=`'PD)>2\(`(<=6_`0,21-[E+##A(9`!-'0"\(716(72 -M68736H746X757(7678777H797Q)IY.4L,.,&D`$T=`CPY2PPY`F0`31T$/!# -M5Q#E+##E)9`!S^`PY1[@5-_PD`$T="#P=:@`=>@`$D>3D``#X%3[\/'E@/[E -M+##F!I`!-'1`\.4N,.$[D`$V=`+P0U=`D`$"X%0#9`%P*)`!-^`PX`IT`?"0 -MEW7D\(`7D)=UX`3PX,.4"D`+Y/"0!!G@,.`"\9KE+C#@$I"7A70!\)`!-O`2 -M80:0EX7D\.4N,.)RD`$V=`3PY29D`7!FY2=@8N4G9`)@!N4G9`5P)Y`&J^"0 -MEXGPD`:JX)"7E/"0EXG@<`>0EY3@_X`%D)>)X/^0EXGO\)"7B^!@`^`4\)"7 -MBN3PD`%7\)`!/'0"\)"7F.!4_?#@5._PY2<4)/U0`H`#$D53Y2XPXRB0`39T -M"/#E)F0!6X&0"8`421.B``Q)$CN4N,.8>D`$V=$#P -MY2:T`1/E)V`/D)>8X%3^\.!4!W`#$D3>Y2\PX0B0`3=T`O`1J73D!)`!Q/!T -M2Z/PT`?0!M`%T`30`]`"T`'0`-#0T(+0@]#PT.`R$D6QOP$0D`()X/]]`1)' -M_9`$'W0@\")U*#/D]2EU*@/U*Y`!,.4H\*/E*?"CY2KPH^4K\"+DD)>7\)"7 -MBO"0EYCP(O3_D`!#X%_PTQ"O`!$`O"`-Y"7E>!4#].4`D`)D`&YX$0$\(`CD)>8X##B -M"9`!N>!$"/"`$Y"7F.`PY`F0`;G@1!#P@`-_`2*0`;O@1`3P?P`B=3`?=3$! -MY/4RD`$XY3#PH^4Q\*/E,O`BY)"73_"C\'6.`A)'Z9```N!4X)"7A&`%=`'P -M@`-T`O"0`//@,.,(D)>&=`'P@`7DD)>&\)"7AN"T`1.0`/+@,.<,D)=K=/WP -MHW0S\(`*D)=K=/WPHW0O\.3U5Q)H`A)OCQ)?M!(R/1)N"Q)/L>20EX7PD`#S -MX##B#9`%0700\)`%6O"CY/"0`61TH/`15Q)$_Q)WR9"74>79\!)':,*OD`"` -MX$1`\!)/Y77H`T.HA=*OD)=/X&0!\"1OD`'$\'10H_#E5S#D"<*O4U?OTJ]Q -MGN57,.86PJ]35[_2KQ)A^9"7/.#_8`.T`0(QE)"7/.!P`Q)X)S%G@+F0!C3@ -M8"8435_^7X!$FVIOP$)D`8UX%0/\(`%@``";9ODD`8T\"*0ES/@ -MPY044`7@!/!!3)"7,^!D%&`"04R0ET+@<"60ET7@0!/W@5/[PD)="X)`$1/"0ET/@D`1%\)"71."0!$;PH^3P -MD)=%X)`$2/"0ET;@D`1)\)"71^"0!$KPH^3PD)#^TY]0 -M"Y"72^##GM.4`4`0D)"0ETGP -MD`5BX)"72O"0!6/@D)=+\,-T_Y_^D)=)X-.>0![@+_"CX+3_#^3PH^"T_P/D -M\"*0ETN``Y"72N`$\"*0ETG@+_`BD)#_49:0 -METQT`1)'2(!`D)=,X&0!<#B0ESW@_U&6Y)"73/"0`$7@1`']?T421U*0ES+@ -M8!60ES020U.0@(42*G]_@'X($B_9@`60!2+D\)`%A^!D@/"0ETC@D`6$\)"7 -M2>"0!87PD)=*X)`%AO"0ETO@D`6'\"*0`] -MX/]T`7X`J`<(@`7#,\XSSMCY_^]=<`*!V)"7O>!U\`20`=`20U_@D)=3\'5C -M`75DEW5E4W5F`7L!>I=Y5!)%"9"75.#_Q!,3$U0!D)>],.!9X'7P`I``B!)# -M7^"0EU7PD)>]X'7P`I``B1)#7^"0EU;PD)>]X'7P!)`!T1)#7^"0EU?PD)>] -MX'7P!)`!TA)#7^"0EUCPD)>]X'7P!)`!TQ)#7^"0EUGP@#/@=?`$D`'1$D-? -MX)"75?"0E[W@=?`$D`'2$D-?X)"75O"0E[W@=?`$D`'3$D-?X)"75_#O5'__ -M>P%ZEWE5D>"0EU+@_Y"7O>#^=`&H!@B``L,SV/ST7Y"74O"0E[W@_W0!J`<( -M@`+#,]C\D`',\)"7O>`$\.!4`_!AJ)`!QN!$`O`BD)=:$D.+[Q)#E%4,`545 -M`E4>`U4G!54P!E5C!U4X"55!#%5*#553#@``55R0EUH20VL":N&0EUH20VL" -M:PN0EUH20VL":Q&0EUH20VL":;60EUH20VN`+)"76A)#:P)K69"76A)#:P)X -M_Y"76A)#:P)WEI"76A)#:P)V#Y`!QN!$`?`BD``$$D(@_U0?_N]4(,035`?] -MKP:0EUWO\*/M\*,20XN0EU\20VN0``,20B!4\,14#Y"78O"0``020B!40,03 -M$U0#D)=C\)"77>#_=?`)D),E$D-?K8*L@Y"79.SPH^WP[W7P":0D(_ETDS7P -M^GL!HQ)#BY"77Q)#:Y```Q)"(%0/_Y"79A)#:^\20DV0EU\20VN0``(20B#_ -MD)=F$D-KD``![Q)"7Y"77Q)#:Y```1)"(/^0EV3@_*/@_?6"C(/O\!(IV8V" -MC(.C\)"78N#^D)==X/\DP?6"Y#22]8/N\)"77N#^=?`)[Y"3*1)#7^[P=?`) -M[Y"3*A)#7W0!\)"78^#^=?`)[Y"3*Q)#7^[PCQ+O)>`DY/6"Y#25KX+U%(\5 -MY1)U\`*D)('Y=)(U\'46`?47B1AU\`GE$I"3)1)#7Z^"A8,9CQKE$G7P":0D -M(_ETDS7P=1L!]1R)'73!)1+U@N0TDO6#X!)#E%;R`%<'`5<<`E%!E>L#%?:#5@'#E@T#P``6&CE$B7@).3U@N0TE?6#=/#PHW05@#SE$B7@ -M).3U@N0TE?6#=/#PHW00@"?E$B7@).3U@N0TE?6#=/#PHW0%@!+E$B7@).3U -M@N0TE?6#=/#PH^3PY1(EX"2!]8+D-)+U@W0/\*-TC_`"6&CE$B7@).3U@N0T -ME?6#=`_PHW3U@"?E$B7@).3U@N0TE?6#=`_PHW3P@!+E$B7@).3U@N0TE?6# -MY/"C=`WPY1(EX"2!]8+D-)+U@^3PH_`"6&B0!$?@JQ:J%ZD8$D)-D`1&X*L6 -MJA>I&)```1)"7Y`$1>"%%8*%%(/PD`1$`EA?D`1+X*L6JA>I&!)"39`$2N"K -M%JH7J1B0``$20E^0!$G@A16"A12#\)`$2(!8D`1/X*L6JA>I&!)"39`$3N"K -M%JH7J1B0``$20E^0!$W@A16"A12#\)`$3(`KD`13X*L6JA>I&!)"39`$4N"K -M%JH7J1B0``$20E^0!%'@A16"A12#\)`$4."%%8*%%(.C\*L6JA>I&,`#P`+` -M`1(IV?^K&ZH0U%_K``\`"P`$2*=G_ -MJQNJ'*D=D``!$D(@7]`!T`+0`Q)"3845@H44@\"#P(+@_X4:@H49@^#^[U[0 -M@M"#\(45@H44@Z/`@\""X/^%&H*%&8.CX/[O7M""T(/PY1(EX"2!]8+D-)+U -M@^#^H^!.8#MU$PMT`7X`J!,(@`7#,\XSSMCY_^42)>`D@?6"Y#22]8/@7OZC -MX%].8`;E$R00@%T5$^43PY0`4,J`5N42)>`DY/6"Y#25]8/@_J/@3F`]=1,/ -M=`%^`*@3"(`%PS/.,\[8^?_E$B7@).3U@N0TE?6#X%[^H^!?3F`(D)=IY1/P -M@!`5$^43PY0`4,B`!>20EVGPY1(EX"3D]8+D-)7U@^#^H^!.8#OD]1-T`7X` -MJ!,(@`7#,\XSSMCY_^42)>`DY/6"Y#25]8/@7OZCX%].8`B0EVKE$_"`6P43 -MY1.T$,J`4N42)>`D@?6"Y#22]8/@_J/@3F`YY/43=`%^`*@3"(`%PS/.,\[8 -M^?_E$B7@)('U@N0TDO6#X%[^H^!?3F`&Y1,D$(`*!1/E$[0,S(`%Y)"7:O"0 -MEVG@_W7P">42D),G$D-?[_"0EVK@_G7P">42D),H$D-?[O!TA"42]8+D-`3U -M@^#3GT`%D)=I4<)TA"42]8+D-`3U@^#_D)=JX/[OPYY0`E'"D)=IX/_3E!-` -M")"3(G0#\(`A[].4"T`(D),B=`+P@!/OTY0#0`B0DR)T`?"`!>20DR+PD),B -MX)`$L?`BX/UTA"42]8+D-);U@^WPKQ+3$*\!P\#0=(0O]8+D-`3U@^WPT-"2 -MKR+M5!_U$'0!+_6"Y#22]8/@]0^0!/W@M`$%=1$#@`-U$0'KPY410`*`*N4/ -M)0[^Y1"00=:3_.[3G'0!0`PO]8+D-)+U@^3P@*`O]8+D-)+U@^[P(JP'=?`) -M[)"3)Q)#7^#_=*4L]8+D-);U@^!4'_O3GT`"JP?K)>`DGO6"Y#1!]8/DD_YT -M`9/_ZR7@)&;U@N0T0?6#=`&3+__DDS[#$_[O$__L)>`DX?6"Y#22]8/N\*/O -M\*\$K0-1TZ\#(JH'KP5TA"KU@N0T!/6#X%1_^U0?^9"77O!U\`GJD),H$D-? -MX)"78/!U\`GJD),G$D-?X/Z0EV'PZB7@).3U@N0TE?6#X/VCX)"78LWPH^WP -MZB7@)('U@N0TDO6#X/VCX)"79,WPH^WPZ=.>0`F0EV'@D)=>\/OO<`*!Y)"7 -M7^_PZS#F"9"77N#[H^`4\)"77^!P`H'DD)=>X/_3E`!0`H'DY)"77?#O%)"7 -M7/"0EV#@^9"77.#_TYE`:N^4$$`A[R3P_W0!?@"H!PB`!<,SSC/.V/G_D)=D -MX%[^H^!?3G`GD)=##GU`, -MD)=V0DR<20U_@_Y"77/#M)>`D@?6"Y#22]8/@^Z/@ -MD)==R_"CZ_#M)>`DY/6"Y#25]8/@^Z/@D)=?R_"CZ_#L)>`D9O6"Y#1!]8/D -MD_IT`9/[[27@).'U@N0TDO6#ZO"CZ_#LPY]``L$M=*4M]8+D-);U@^SP!/N0 -MEUS@_^O3GT`"P5[KPY000"'K)/#_=`%^`*@'"(`%PS/.,\[8^?^0EUW@7OZC -MX%].<"/KPY004#ET`7X`J`,(@`7#,\XSSMCY_Y"77^!>_J/@7TY@'.MD$V`( -MZV028`.[$0F0EUW@,.`">QBL`XP=@#0+@(N0EUS@^VQP:72E+?6"Y#26]8/L -M\'7P">V0DRD20U_@M`$,Y1T@Y@?L1$#U'8`#KQTB["7@))[U@N0T0?6#Y)/^ -M=`&3_^PEX"1F]8+D-$'U@W0!DR__Y),^PQ/^[Q/_[27@).'U@N0TDO6#[O"C -M[_"`6^S3FT!6D)=4=1(#]4=/E'42`_R+`X,#PP(/`@L#0==`` -MP`#``<`"P`/`!,`%P`;`!Y`!Q'04\'1?H_!3D>^0`%'@_Y``5>!?]3WE/3#F -M&'1`\)"7.^!4`_^_`PN0ESC@8`5_`1)VY^4],.<5D`!5=(#PD)<[X%0#_[\# -M!7\"$G;GD`'$=!3P=%^C\-`'T`;0!=`$T`/0`M`!T`#0T-""T(/0\-#@,H\> -MC!^-("*/(8PBC2,BY/4FD)>8\/4GD)>5=`SPD)>3\.20EY;PD)>2\)"7D?"0 -MEY0$\)"7B?#DD)>7\)"7B_"0EY!T!_#DD)>*\)"7CO"C=`+PY)"7C?"0EXCP -M(N578`F0`;K@1`'P@%N0EY7@5`_3E`%`"9`!NN!$`O"`1Y`"A^!@"9`!NN!$ -M!/"`.)"7A."T`A"0EVO@_J/@]8*.@^!@$8`AD`&OX&`)D`&ZX$0(\(`2D)>- -MX'`)D`&ZX$00\(`#?P$BD`&[X$0"\'\`(H]LY)"7M_"C\)`!">!_`##G`G\! -M[V5L8#[#D)>XX)2(D)>WX)030`B0`<;@1(#P(I"7M^1U\`$20H%_%'X`$C=4 -MTY"7N."4,I"7M^"4`$"YD`''X##@LB*/;A)%L>]D`7`ND)>!$D?YY6Y@$'0A -M+_6"Y#3\]8/@1!#P@`YT(2_U@N0T_/6#X%3O\)`$'W0@\"+DD)=-\.4G8&[E -M)F0!<&CE)Q1@*23]8"4D`B3[4`*`(Y"7B>`4\.!@!*/@8!:0EXG@<`J0EY3@ -MD)>)\(``D)=-=`'PD)=-X&`ND)>8X$00\.20EYWPD)>0X)"7GA)$:)`!5W0% -M\)"7D^!4#\.4!%`'?0%_!!)(WR*0EY?@8`[D\*/@5/WPX%0'<"B`(Y"7BN`$ -M\)"7F.!4[_"0EXK@TY0!0`WE)K0!"Z/@<`?@!/`B$D3>(N_#E"!0.>\PX!?M -MQ%3P_>_#$_XDI/6"Y#0$]8/@5`^`$._#$_XDI/6"Y#0$]8/@5/#P=*0N]8+D -M-`3U@^!-\"+D]1)U\`GE$I"3*A)#7^!D`6`"X?7E$B7@),#U@N0TD?6#X/ZC -MX-.4`.Z4`%`"X?7E$G7P"J0D`/ETD#7P=142)>`DP/6"Y#21]8/@ -M_Z/@D)=6S_"C[_#E$B7@)&/U@N0TE/6#X/^CX)"76,_PH^_P=(0E$O6"Y#0$ -M]8/@5#^0EU+PX/Y4'Z/P=?`)Y1*0DR<20U_@D)=;\'1D)1+U@N0TEO6#X,.4 -M!4`"@<^0EUO@_Y"74^"?0!.0EUO@D)=3\.Y40/Z0EU+P[T[PD`3]X&0!<"F0 -MEU/@_Y!!2I/^=",E$O6"Y#25]8/@PYY`!N^00-J`,)"74^"00/:`)Y"74^#_ -MD$%*D_YT(R42]8+D-)7U@^##GD`&[Y!!$H`'D)=3X)!!+I.0EUKPD)=:X'7P -M!J0D4/ET0#7P=13_]16)%I"74N"00?*3_].0EUG@GY"76."4`$`)Y/VO$A); -MI^&,Y1(EX"3A]8+D-)+U@^#U&J/@]1NK%*H5J182*=G_?@"K%ZH8J1D20I?] -MK/`2*?+O)1OU&^XU&O4:JQ2J%:D6D``!$D(@_WX`JQ>J&*D9D``"$D+"_:SP -M$BGR[R4;]1ON-1KU&JL4JA6I%I```A)"(/]^`*L7JABI&9``!!)"POVL\!(I -M\N\E&_4;[C4:]1JK%*H5J1:0``,20B#_?@"K%ZH8J1F0``820L+]K/`2*?+O -M)1OU&^XU&O4:JQ2J%:D6D``$$D(@_WX`JQ>J&*D9D``($D+"_:SP$BGR[R4; -M]1ON-1KU&JL4JA6I%I``!1)"(/]^`)"75N#\H^#]$BGRT^4;G^4:GD`,Y1N? -M]1OE&I[U&H`%Y/4:]1OE$B7@).'U@N0TDO6#Y1KPH^4;\)"74N#Y)>`D9O6" -MY#1!]8/#=`&3E1ODDY4:4`>O$A)=*^%@Z27@))[U@N0T0?6#TW0!DY4;Y).5 -M&E`"X6!]`:\2$ENGX6!T9"42]8+D-);U@^#\9`5@`L%JD),BX/^T`PN0EU/@ -MPY090#V`+N^T`@N0EU/@PY010"Z`'Y"3(N#_M`$+D)=3X,.4"D`;@`SO20E4/P=$,E$O6"Y#24]8/@]1QT(R42]8+D-)7U -M@^#_PY0P4`+!%Y"50^!D`6`"P1=T1"42]8+D-)7U@^!D"F!1[R0%_^0S_G0A -M)1+U@N0TDO6#X/W3G^YD@/AT@)A0,NTD!?_D,_YT(R42]8+D-)7U@^#3G^YD -M@/AT@)A0%'2$)1+U@N0TEO6#X/^0EU/@;V`]=",E$O6"Y#25]8/@_].40D`% -M=1P%@`[OTY0Y0`5U'`.``W4<`70A)1+U@N0TDO6#[_!T1"42]8+D-)6`*71D -M)1+U@N0TEO6#Y/!T1"42]8+D-)7U@^`$\(`0Y/4<=&0E$O6"Y#26]8/D\)"7 -M4^#_=(0E$O6"Y#26]8/O\'1#)1+U@N0TE/6#Y1SP=?`)Y1*0DRL20U_@M`$0 -MY/4<=&0E$O6"Y#26]8/D\*T43<`5U'`.`.>43M`$%=1P! -M@"^`*N43U\!)"^JL7JABI&9```N3U\!)#&9``!.3U\!)#&9``!N3U\!)#&9``".3U -M\!)#&>42)>`DP/6"Y#21]8/D\*/PY1(EX"1C]8+D-)3U@^3PH_#E$B7@)*/U -M@N0TE/6#Y/"C\`42Y1+#E"!0`P)A_"*0!$1T$?"C=/#PHW0/\*/D\/UTI"WU -M@N0T!/6#Y/`-O1#PY/UU\`KMD)``$D-?Y/"C\'7P"NV0D`(20U_D\*/P=?`* -M[9"0!!)#7^3PH_!U\`KMD)`&$D-?Y/"C\'7P"NV0D`@20U_D\*/P=(0M]8+D -M-);U@W03\'1$+?6"Y#25]8/D\'1#+?6"Y#24]8/D\.TEX"3`]8+D-)'U@^3P -MH_#M)>`D8_6"Y#24]8/D\*/P[27@)./U@N0TE/6#Y/"C\.TEX"2C]8+D-)3U -M@^3PH_#M)>`D9/6"Y#25]8/D\*/P[27@)*3U@N0TE?6#Y/"C\'1$+?6"Y#26 -M]8/D\'0D+?6"Y#26]8/D\'1D+?6"Y#26]8/D\)!!Q)/^=`&3_Y!!C'0!DR__ -MY),^PQ/^[Q/_[27@).'U@N0TDO6#[O"C[_!U\`GMD),J$D-?=`'P=?`)[9"3 -M*1)#7W0!\'3!+?6"Y#22]8-T#/!U\`GMD),E$D-?=/_PH_!U\`GMD),C$D-? -MY/"C=`_P=?`)[9"3)Q)#7W03\'7P">V0DR@20U_D\'2$+?6"Y#0$]8-T$_`- -M[60@8`(!)B(2*=GU$L.4(%`5D``"$D(@_W0C)1+U@N0TE?6#[_`BY1*T(`J0 -M``(20B"0DR'P(I"73>!4\$0#\%0/1(#P>P!Z`'E8D)>H$D.+"WJ7>4W3$*\! -MP\#0D)>E$D.+D)>$X&0"8&Z0EX3@9`%P9I"7O^#_!/"0EZ420VN0``'O$D)? -M?Z]^`5&+[V!)D)>E$D-KBV.*9(EE=68">P%Z`7F@$D4)D)>H$D-KBV.*9(EE -MD)>E$D-K$BG9_\14#_5F>P%Z`7FB$D4)D`&O=/_PD`'+X&2`\-#0DJ\BTQ"O -M`QY'7P`1)"@7\*?@`2-U2`Q7\!T-"2KR+3$*\!P\#0 -MD``!$D(@D)>6\)```Q)"()"7B/`2*=EE)V`#$DINT-"2KR(2*=GU)B*0`@G@ -M_1(IV?ZO!>TND)=^\)```1)"(/_M+Y"7?_"0``(20B#_[2^0EX#PD``#$D(@ -M_^TOD)>!\)``!!)"(/^N!>TOD)>"\"+3$*\!P\#0D)==$D.+D)==$D-KD``! -M$D+"^N7P)`#_Y#K^D)==$D-KD``![H_P$D,9$BG9_V`LM6<6D)==$D-KD``! -M$D+"96EP!.5H9?!@(Y"771)#:Y```1)"PO^N\''1@!"0EUT20VL2*=EE9V`# -M$D35T-"2KR*0EV#N\*/O\'5G`8YH]6GD_7\+D13D_7\"D121WN3_$D?=Y/5K -MD`')Y6OPD)=@X/RCX/WL^XU$Y/5%?0%_8'X!`C6KTQ"O`#]=`%^`*@%"(`% -MPS/.,\[8^?^0`$3@^^3^[UNH!0B`!LZBYQ/.$]CX_X!$D)?!X"3X\.#_=`&H -M!PB``L,SV/P23]V0E\'@_70!?@"H!0B`!<,SSC/.V/G_D`!"X/OD_N];J`4( -M@`;.HN<3SA/8^/_0T)*O(I`&-'3_\.2C\*/PH_`BCA*/$XL4BA6)%N20EU+P -M[Y``,?`23^7E$E0#_Y``,N!4_$_P$D_ED``SX%1_\!)/Y9``,^`@YPZ0EU+@ -MPY1D4`7@!/"`ZY"74N##E&10$)``,."K%*H5J1820DU_`2)_`"+D]6HBY)"7 -MN?"C\)`%^.!P#Z/@<`NCX'`'H^!P`W\!(M.0E[K@E.B0E[G@E`-``W\`(G\R -M?@`2-U20E[GD=?`!$D*!@,:0EQT20U.0@(42*G]_>'X($B_9D)3]_Q(T@9"7AN"T`1&0@%D2*HL``RV5Y/U_`1(T@2)_ -M>'X($B?>D)<=$BI_?P1^#!(GWI"7(1(J?W\`?@@2)]Z0ER42*G^0EX;@D)<= -MM`$-$D-3[U3'_^U4Q_V`!Q)#4^]4Q__LD("%$BI_?WA^"!(OV9"7(1)#4^]4 -M#__LD("%$BI_?P1^#!(OV9"7)1)#4^]$`O_LD("%$BI_?P!^"!(OV7]P?@X2 -M)]Z0ERD2*G^0@(42*HL`&R6@?W!^#A(OV9"`61(JBP````#D_?\2-(&0EX;@ -MM`$1D(!9$BJ+`````.3]?P$2-($BD)>&X)"7+?`B[W`#`G%0D)D);)$BI_?VQ^#A(GWI"6S1(J?W]P?@X2)]Z0 -MEM$2*G]_='X.$B?>D);5$BI_?WA^#A(GWI"6V1(J?W]\?@X2)]Z0EMT2*G]_ -M@'X.$B?>D);A$BI_?X1^#A(GWI"6Y1(J?W^(?@X2)]Z0END2*G]_C'X.$B?> -MD);M$BI_?]!^#A(GWI"6\1(J?W_4?@X2)]Z0EO42*G]_V'X.$B?>D);Y$BI_ -M?]Q^#A(GWI"6_1(J?W_@?@X2)]Z0EP$2*G]_['X.$B?>D)<%$BI_?P1^#!(G -MWI"7"1(J?W\$?@T2)]Z0EPT2*G]_#'X)$B?>D)<1$BI_?P1^"!(GWI"7%1(J -M?W^,?@@2)]Z0E[,2*G^0E[,20U/M1,#][)"7LQ(J?Y"7LQ)#4Y"`A1(J?W^, -M?@@2+]F0@(42*HL``0``?T1^"!(OV9"`A1(JBP#;):1_7'X($B_9D("%$BJ+ -M(-LEI']L?@X2+]F0@(42*HL@VR6D?W!^#A(OV9"`A1(JBP0;):1_='X.$B_9 -MD("%$BJ+!!LEI']X?@X2+]F0@(42*HL$&R6D?WQ^#A(OV9"`A1(JBP0;):1_ -M@'X.$B_9D("%$BJ+8]LEI'^$?@X2+]F0@(42*HL$&R6D?XA^#A(OV9"`A1(J -MBR#;):1_C'X.$B_9D("%$BJ+(-LEI'_0?@X2+]F0@(42*HL@VR6D?]1^#A(O -MV9"`A1(JBR#;):1_V'X.$B_9D("%$BJ+`!LEI'_S$BI_D)>S$D-3D("%$BI_?P1^#!(OV7\$ -M?@T2)]Z0E[,2*G^0E[,20U/O5/#_[)"7LQ(J?Y"7LQ)#4^]$`?_LD)>S$BI_ -MD)>S$D-3D("%$BI_?P1^#1(OV7\,?@D2)]Z0E[,2*G^0E[,20U/D_^R0E[,2 -M*G^0E[,20U/O1!'_[)"7LQ(J?Y"7LQ)#4Y"`A1(J?W\,?@D2+]E_#'X)$B?> -MD)>S$BI_D)>S$D-3[50/_>Q4\/R0E[,2*G^0E[,20U/M1!#][$0!_)"7LQ(J -M?Y"7LQ)#4Y"`A1(J?W\,?@D2+]E_!'X($B?>D)>S$BI_D)>S$D-3[U3P_^R0 -ME[,2*G^0E[,20U/O1`'_[)"7LQ(J?Y"7LQ)#4Y"`A1(J?W\$?@@2+]GDD)\[?"0E[OO\-.4!U!EX/]T`:@'"(`"PS/8_/3_D`!'X%_P -M$D_ED)>[X/]T`:@'"(`"PS/8_/^0`$;@3_`23^60E[S@8!:0E[O@_W0!J`<( -M@`+#,]C\_Y``18!HD)>[X/]T`:@'"(`"PS/8_/3_D`!%@&V0E[O@)/CPX/]T -M`:@'"(`"PS/8_,14\!)/W9"7N^#_=`&H!PB``L,SV/S_D`!#X$_P$D_ED)>\ -MX&`;D)>[X/]T`:@'"(`"PS/8_,14\/^0`$+@3X`:D)>[X/]T`:@'"(`"PS/8 -M_,14\/3_D`!"X%_P$D_ET-"2KR*+$HH3B120``(20B"0ESOPX##@2Y"7,G0! -M\'^`?@@2)]Z0ES02*G^K$JH3J120``$20B#_Y/S]_G@:$BILJ`2I!:H&JP>0 -MES020U/L5`/\$D-&D)<^$BI_D`4BY/"`+>20ES+P?X!^"!(GWNQ4`_SL1,#\ -MD)3PH_"0ESSPD)="\)"71?"0ET/PD)=& -M\)"71/"0ET?PD)!$P/U_40)'4I"73.!D`6`(D)"0ESWPD`5@ -MX)"72/"0!6'@D)=)\)`%8N"0ETKPD`5CX)"72_"BK^0SD)==\,*OD)!4[_U_11)'4I`%A^!D@/"0ETC@D`6$\)"7 -M2>"0!87PD)=*X)`%AO"0ETO@D`6'\**OY#.0EUWPPJ^0`3S@1"#P?2#D_Q(W -M`(`MD)`/P``*2D!```````````` -M``````)TR0`````````````````````"6=`````````````````````````` -M```````````````````````````````````"`DY/6"Y#25]8/@_:/@D)=:S?"C[?#OPYY``P)#5I`!Q70@\)"75>#_ -M=*4E%_6"Y#26]8/O\.\$D)=6\)"75^#_D)=6X/[3GT`#`D.@[L.4$$`A[B3P -M_W0!?@"H!PB`!<,SSC/.V/G_D)=8X%[^H^!?3G`GD)=6X/_#E!!0670!?@"H -M!PB`!<,SSC/.V/G_D)=:X%[^H^!?3F`\D)=6X+01#9"76>`PYP:0EU9T%_"0 -MEU;@_V038`3OM!(-D)=8X##@!I"75G08\)"75N"0EU7PD)=4\(!3D)=6X`3P -M`D*RD)=7X/F0EU7@_VE@`P)#Z)`!Q71`\'2E)1?U@N0TEO6#[_#E%W7P"*0D -M:?6"Y#23]8/@M`$4ZS#F!I"75.#_(I"75>!$0)"75/"0EU7@_R7@))[U@N0T -M0?6#Y)/\=`&3_>\EX"1F]8+D-$'U@W0!DRW_Y),\PQ/^[Q/_Y/S]Y1_PD)=4\/NCX/\EX"2>]8+D-$'U@^23_'0!D_WO)>`D9O6"Y#1!]8-T -M`9,M_^23/,,3_N\3_^3\_>47)>`EX"3A]8+D-)+U@Q(=J:\#(G0!)1?U@N0T -MDO6#Y/"0EU3@1(#_=(0E%_6"Y#0$]8/O\"+O%&`@%&!+)`)P>)"7:70"\)`` -M2.!$#/"0`$?@1`CPD`!%@%ODD)=I\)"79>#\H^#]H^#^H^#_D(%6$AVI?X!^ -M"!(SV)``1>!$[_#@5._PHX`MD)=I=`'PD)=OX/RCX/VCX/ZCX/^0@582':E_ -M@'X($C/8D`!%X$0@\.!$$/"CX$00\"+D]6$B`G]I`G]P=$60`<3PHW0)\.20 -MESKPD)`D -MP/6"Y#21]8/@_*/@TY0`[)0`4`,"3C'O=?`*I"0`^720-?#Z>P&+$_44B160 -MESK@)>`DP/6"Y#21]8/@_:/@D)=&S?"C[?#O)>`D8_6"Y#24]8/@_Z/@D)=( -MS_"C[_"0``(29B#_KO`29?4O_^7P/I"73_"C[_"0``829B#_KO"0``029B`O -M_^7P/I"73?"C[_"0``@29B#_D)=+Y?#PH^_PD)!D`7`H -MD)<]X/^004J3_G0C*_6"Y#25]8/@PYY`!N^001*`,I"7/>"002Z`*9"7/>#_ -MD$%*D_Z0ESK@)"/U@N0TE?6#X,.>0`;OD$#:@`>0ESW@D$#VDY"72O"0ETK@ -M=?`&I"10^71`-?!U$/_U$8D2D)<\X)!!\I/_TY"72>"?D)=(X)0`0`V0ESK@ -M_^3]$E]M`DW'D)`DX?6"Y#22]8/@_*/@_:/@_J/@_Y"7/A(=J9"7 -M/N#XH^#YH^#ZH^#[P`#``<`"P`.K$*H1J1(2'-;_?@"K$ZH4J1429?7]K/`2 -M'1SD_/W0`]`"T`'0`.LO_^H^_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[ -MP`#``<`"P`.K$*H1J1*0``$2'.__?@"K$ZH4J160``(29B#]K/`2'1SD_/W0 -M`]`"T`'0`.LO_^H^_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[P`#``<`" -MP`.K$*H1J1*0``(2'.__?@"K$ZH4J160``029B#]K/`2'1SD_/W0`]`"T`'0 -M`.LO_^H^_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[P`#``<`"P`.K$*H1 -MJ1*0``,2'.__?@"K$ZH4J160``829B#]K/`2'1SD_/W0`]`"T`'0`.LO_^H^ -M_NTY_>PX_)"7/A(=J9"7/N#XH^#YH^#ZH^#[P`#``<`"P`.K$*H1J1*0``02 -M'.__?@"K$ZH4J160``@29B#]K/`2'1SD_/W0`]`"T`'0`.LO_^H^_NTY_>PX -M_)"7/A(=J:L0JA&I$I``!1(<[_]^`)"71N#\H^#]$ATR4`/R0ESX2 -M':F`!Q(=M0````"0ES[@_*/@_:/@_J/@_Y"7.N`EX"7@).'U@N0TDO6#$AVI -MD)<\X"7@)&;U@N0T0?6#Y)/^=`&3_^3\_9"7/N#XH^#YH^#ZH^#[TQ)FI$`+ -MD)`DGO6"Y#1!]8/DD_YT`9/_Y/S]D)<^X/BCX/FC -MX/JCX/O#$F:D0`,"33Z0ESK@_WT!$E]M`DT^D)20 -ME4/P=",O]8+D-)7U@^#_PY0P4`,"2RV0E4/@9`%@`P)++9"7.N`D1/6"Y#25 -M]8/@9`I@5I"7.N#^[R0%_>0S_'0A+O6"Y#22]8/@_].=[&2`^'2`F%`S[R0% -M_>0S_'0C+O6"Y#25]8/@TYWL9(#X=("84!:0ESK@)(3U@N0TEO6#X/^0ESW@ -M;V!6D)_3E#R0EU)`!70#\(`# -M=`'PD)D)=2X,14\/"0ESK@PQ/_ -M)*3U@N0T!/6#X%0/`DTAD)20EU+PD)`D8_6"Y#24]8/D\*/P[R7@)*/U@N0TE/6#Y/"C\)"7.N`$\`)% -M&"+O<`,"4*.0ERW@8`,"5.60EQG@_*/@_:/@_J/@_Y"!5A(=J7^,?@@2,]B0 -MEL7@_*/@_:/@_J/@_Y"!5A(=J7]$?@@2,]B0ELG@_*/@_:/@_J/@_Y"!5A(= -MJ7]'X.$BL3D);9$AVI -M?WQ^#A(K$Y"6W1(=J7^`?@X2*Q.0EN$2':E_A'X.$BL3D);E$AVI?XA^#A(K -M$Y"6Z1(=J7^,?@X2*Q.0ENT2':E_T'X.$BL3D);Q$AVI?]1^#A(K$Y"6]1(= -MJ7_8?@X2*Q.0EOD2':E_W'X.$BL3D);]$AVI?^!^#A(K$Y"7`1(=J7_L?@X2 -M*Q.0EP42':E_!'X,$BL3D)<)$AVI?P1^#1(K$Y"7#1(=J7\,?@D2*Q.0EQ$2 -M':E_!'X($BL3D)<5$AVI?XQ^"!(K$Y"7HQ(=J9"7H^#\H^#]H^#^H^#_[43` -M_>R0EZ,2':F0EZ/@_*/@_:/@_J/@_Y"!5A(=J7^,?@@2,]B0@582';4``0`` -M?T1^"!(SV)"!5A(=M0#;):1_7'X($C/8D(%6$AVU(-LEI']L?@X2,]B0@582 -M';4@VR6D?W!^#A(SV)"!5A(=M00;):1_='X.$C/8D(%6$AVU!!LEI']X?@X2 -M,]B0@582';4$&R6D?WQ^#A(SV)"!5A(=M00;):1_@'X.$C/8D(%6$AVU8]LE -MI'^$?@X2,]B0@582';4$&R6D?XA^#A(SV)"!5A(=M2#;):1_C'X.$C/8D(%6 -M$AVU(-LEI'_0?@X2,]B0@582';4@VR6D?]1^#A(SV)"!5A(=M2#;):1_V'X. -M$C/8D(%6$AVU`!LEI'_C$AVID)>C -MX/RCX/VCX/ZCX$01_^R0EZ,2':F0EZ/@_*/@_:/@_J/@_Y"!5A(=J7\$?@P2 -M,]A_!'X-$BL3D)>C$AVID)>CX/RCX/VCX/ZCX%3P_^R0EZ,2':F0EZ/@_*/@ -M_:/@_J/@1`'_[)"7HQ(=J9"7H^#\H^#]H^#^H^#_D(%6$AVI?P1^#1(SV'\, -M?@D2*Q.0EZ,2':F0EZ/@_*/@_:/@_N3_[)"7HQ(=J9"7H^#\H^#]H^#^H^!$ -M$?_LD)>C$AVID)>CX/RCX/VCX/ZCX/^0@582':E_#'X)$C/8?PQ^"1(K$Y"7 -MHQ(=J9"7H^#\H^#]H^#^H^#_[50/_>Q4\/R0EZ,2':F0EZ/@_*/@_:/@_J/@ -M_^U$$/WL1`'\D)>C$AVID)>CX/RCX/VCX/ZCX/^0@582':E_#'X)$C/8?P1^ -M"!(K$Y"7HQ(=J9"7H^#\H^#]H^#^H^!4\/_LD)>C$AVID)>CX/RCX/VCX/ZC -MX$0!_^R0EZ,2':F0EZ/@_*/@_:/@_J/@_Y"!5A(=J7\$?@@2,]CDD)40=?`(I"1E -M]8+D-).O@O46CQ?E$'7P"*0D8_ETDS7P=1@!]1F)&G3!)1#U@N0TDO6#X!)F -MP55G`%5\`561`E6F`U70!%7E!57Z!E8A#%9/#59\#E:I#P``5MWE$"7@).3U -M@N0TE?6#=/#PHW05@#SE$"7@).3U@N0TE?6#=/#PHW00@"?E$"7@).3U@N0T -ME?6#=/#PHW0%@!+E$"7@).3U@N0TE?6#=/#PH^3PY1`EX"2!]8+D-)+U@W0/ -M\*-TC_`"5MWE$"7@).3U@N0TE?6#=`_PHW3U@"?E$"7@).3U@N0TE?6#=`_P -MHW3P@!+E$"7@).3U@N0TE?6#Y/"C=`WPY1`EX"2!]8+D-)+U@^3PH_`"5MV0 -M!$?@JQ.J%*D5$F65D`1&X*L3JA2I%9```1)EIY`$1>"%$H*%$8/PD`1$`E;4 -MD`1+X*L3JA2I%1)EE9`$2N"K$ZH4J160``$29:>0!$G@A1*"A1&#\)`$2(!8 -MD`1/X*L3JA2I%1)EE9`$3N"K$ZH4J160``$29:>0!$W@A1*"A1&#\)`$3(`K -MD`13X*L3JA2I%1)EE9`$4N"K$ZH4J160``$29:>0!%'@A1*"A1&#\)`$4."% -M$H*%$8.C\*L3JA2I%<`#P`+``1(0U%/K``\`"P`$2'-;_JQBJ&:D:D``!$ASO7]`!T`+0`Q)EE842@H41 -M@\"#P(+@_X47@H46@^#^[U[0@M"#\(42@H41@Z/`@\""X/^%%X*%%H.CX/[O -M7M""T(/PY1`EX"2!]8+D-)+U@^#^H^!.8$R0EU%T"_"0EU'@_\.4`%`#`E@C -M=`%^`*@'"(`%PS/.,\[8^?_E$"7@)('U@N0TDO6#X%[^H^!?3F`*D)=1X"00 -MH_"`:)"74>`4\("ZY1`EX"3D]8+D-)7U@^#^H^!.8$>0EU%T#_"0EU'@_\.4 -M`$`\=`%^`*@'"(`%PS/.,\[8^?_E$"7@).3U@N0TE?6#X%[^H^!?3F`(D)=1 -MX*/P@`V0EU'@%/"`O^20EU+PY1`EX"3D]8+D-)7U@^#^H^!.8$?DD)=1\)"7 -M4>#_PY000`,"6-UT`7X`J`<(@`7#,\XSSMCY_^40)>`DY/6"Y#25]8/@7OZC -MX%].8`:0EU'@@&.0EU'@!/"`ON40)>`D@?6"Y#22]8/@_J/@3F!&Y)"74?"0 -MEU'@_\.4#%`\=`%^`*@'"(`%PS/.,\[8^?_E$"7@)('U@N0TDO6#X%[^H^!? -M3F`(D)=1X"00@`F0EU'@!/"`O^20EU/PD)=2X/_E$'7P"*0D9_6"Y#23]8/O -M\)"74^#^Y1!U\`BD)&CU@N0TD_6#[O!TA"40]8+D-`3U@^#3GT`?D)=2X/]T -MA"40]8+D-);U@^_P=(0E$/6"Y#0$]8/O\)"74N#_TY030`B0DV)T`_"`(>_3 -ME`M`")"38G0"\(`3[].4`T`(D)-B=`'P@`7DD)-B\)"38N"0!+'PY1`EX"3D -M]8+D-)7U@^#_H^"0!)S/\*/O\.40)>`D@?6"Y#22]8/@_Z/@D`2>S_"C[_#E -M$'7P"*0D:?6"Y#23]8/@Q#-4X$40D`2@\'3!)1#U@N0TDO6#X)`$H?`BP.#` -M\,"#P(+`T'70`,``P`'``L`#P`3`!<`&P`>0`<1TT/!T6:/PD`$WX%4K]2^0 -M`33@52CU+)`!-N!5*O4NY2P@X`,"6X*0`31T`?"%T4V%TDZ%TT^%U%"%U5&% -MUE*%UU.%V53E5%1`PQ/_Y5-4(&]P`P);+^54,.4#`ELOY5)4'_4(Y4U4/_4) -MY5%4'__E""7@)./U@N0TE/6#Y(_P$F7)Y5-4'__E""7@),#U@N0TD?6#Y(_P -M$F7)Y0G3E`1``W4)!'7P"N4(I"0`]8+E\#20]8-U\`+E"1)FM>#^H^#_Y5-4 -M'R__Y#[^=?`*Y0BD)`#U@N7P-)#U@W7P`N4)$F:U[O"C[_#E5"#F).535!__ -MY0@EX"1C]8+D-)3U@^2/\!)ER>5/,.5/,.<2Y4]4?_WE4U0?]0VK":\($G92Y65@3Y"7C>!@-9`! -M6^3PD`$\=`3PD`0;X%1_9']P-'5(%/5)^_U_6'X!$CCLD`%;=`7PD`:2=`'P -MD)>'\(`4D`0;X%1__[]_"I"7B^#_?0$2;MKE+##A(9`!-'0"\(715H725X73 -M6(7468756H766X777(7971)]Q.4L,.,&D`$T=`CPY2PPY`F0`31T$/!#51#E -M+##E(9`!S^`PY1K@5-_PD`$T="#PD``#X%3[\'\0?@`2.JB`_N4L,.8&D`$T -M=$#PY2XPX0F0`39T`O!#54#E+C#@"9`!-G0!\!)VT^4N,.)CD`$V=`3PY61D -M`7!7Y65@4^5E9`)P)Y`&J^"0EW_PD`:JX)"7BO"0EW_@<`>0EXK@_X`%D)=_ -MX/^0EW_O\)"7@>!@`^`4\)"7@.3PD`%7\)`!/'0"\)"7C^!4_?#@5._P$G=) -MY2XPXS&0`39T"/#E9&0!<"7E96`AD`%7Y/"0`3QT`O!U2`-U20#D^_U_5'X! -M$CCLD`%7=`7PY2XPY#J0`39T$/#E9&0!<"[E96`JD`%7Y/"0`3QT`O"0EX[D -M\)"7C^!4_?#@5`-P#I"7B?"0EXO@_WT!$F[:Y2XPY1*0`39T(/#E9+0!!^5E -M8`,2?G[E+C#F*I`!-G1`\.5D9`%P'N5E8!J0EX_@5/[PX%0#<`Z0EXGPD)>+ -MX/]]`1)NVN4O,.$)D`$W=`+P$GSH=-`$D`'$\'19H_#0!]`&T`70!-`#T`+0 -M`=``T-#0@M"#T/#0X#)T79`!Q/"C=&7PD`1$=!'PHW3P\*-T#_"CY/"0ESKP -MD)`D8_6"Y#24]8/D\*/P[R7@)./U@N0TE/6#Y/"C\.\EX"2C]8+D -M-)3U@^3PH_#O)>`D9/6"Y#25]8/D\*/P[R7@)*3U@N0TE?6#Y/"C\'1$+_6" -MY#26]8/D\'0D+_6"Y#26]8/D\'1D+_6"Y#26]8/D\)!!Q)/^=`&3_Y!!C'0! -MDR__Y),^PQ/^[Q/_Y/S]ZR7@)>`DX?6"Y#22]8,2':GK=?`(I"1J]8+D-)/U -M@W0!\.MU\`BD)&GU@N0TD_6#=`'P=,$K]8+D-)+U@W0,\.MU\`BD)&7U@N0T -MD_6#=/_PH_#K=?`(I"1C]8+D-)/U@^3PHW0/\.MU\`BD)&?U@N0TD_6#=!/P -MZW7P"*0D:/6"Y#23]8/D\'2$*_6"Y#0$]8-T$_"0ESK@!/`"7:`DY/6"Y#25]8/@^Z/@ -MD)=;R_"CZ_#E%R7@)('U@N0TDO6#X/NCX)"770`R0EUK@D)=7 -M\)"75/#M<`,"8-F0EUCM\)"75.`PY@Z0EU?@D)=4\)"76.`4\)"76.!P`P)@ -MV9"75^#_TY0`4`,"8-GDD)=6\.\4D)=5\)"76>#]D)=5X/_3G4!O[Y000"'O -M)/#_=`%^`*@'"(`%PS/.,\[8^?^0EUW@7OZCX%].<">0EU7@_\.4$%`W=`%^ -M`*@'"(`%PS/.,\[8^?^0EUO@7OZCX%].8!J0EU7@D)=4\)"75N`$\)"76.#_ -MD)=6X&]@")"75>`4\("#D)=8X/^0EU;@PY]0#Y"75>"U!0B0EUG@D)=4\)"7 -M5.#_)>`DGO6"Y#1!]8/DD_QT`9/][R7@)&;U@N0T0?6#=`&3+?_DDSS#$_[O -M$__D_/WE%R7@)>`DX?6"Y#22]8,2':F0EU3@_W2$)1?U@N0T!/6#[_`BD`'$ -M=#+P=&&C\)`!S.!4#Y"7.O"0ESK@_7`#`F+2D)>QX/]T`7X`J`<(@`7#,\XS -MSMCY_^]=<`,"8K.0E['@=?`$I"30]8+E\#0!]8/@D)<[\**OY#.C\,*O=20! -M=267=28[=2P%ZEWD]$GDGD)<\X"3_DJ^CX/_$$Q,35`&0E[$PX'#@=?`" -MI"2(]8+D-?#U@^"0ES[PD)>QX'7P`J0DB?6"Y#7P]8/@D)<_\)"7L>!U\`2D -M)-'U@N7P-`'U@^"0ET#PD)>QX'7P!*0DTO6"Y?`T`?6#X)"70?"0E['@=?`$ -MI"33]8+E\#0!]8/@D)="\(!"X'7P!*0DT?6"Y?`T`?6#X)"7/O"0E['@=?`$ -MI"32]8+E\#0!]8/@D)<_\)"7L>!U\`2D)-/U@N7P-`'U@^"0ET#P[U1__WL! -M>I=Y/A)N`I"7.N#_D)>QX/YT`:@&"(`"PS/8_/1?D)#_=`&H!PB` -M`L,SV/R0`QX`3PX%0#\`)A1L*O=#($D`'$\'1AH_"0ESK@D`'&\)"7 -ML>"0`7=`'P@`7DD)>7\)"7E^"T`1.0`/+@,.<,D)>0=/WPHW0S\(`*D)>0=/WP -MHW0O\.3U51)=91)_8!)YSA(VT1)$_W4H,^3U*74J`O4KD`$PY2CPH^4I\*/E -M*O"CY2OPD`#SX##B#9`%0700\)`%6O"CY/"0`61TH/!U2/_D]4G[?0%_4'X! -M$CCL=3`?=3$!Y/4RD`$XY3#PH^4Q\*/E,O`2>-"0ESGEV?"0`3QT__"C\*/P -MD`$T\*/PH_"C\,*OD`"`X$1`\'\0?@`2.JAUZ`-#J(72KY`!P.3PH_"C\*/P -MD`'&\*/PD)`EX)"7:O`2'-8EX"7@D)=N\)"7:^"0!)CP -MD)=JX!,35#^0!)GPD)=NX!,35#^0!)KPD`5@X)"7>?"0!6'@D)=Z\)`%8N"0 -MEWOPD`5CX)"7?/"BK^0SD)=)\,*OD)=JX/\2>7R0ETG@)/^2KY"7:^!P`P)E -M89"7:N!P`P)E89"7;N!P`P)E8:*OY#.0ETGPPJ^0EWUT`?"0ETG@)/^2KY`` -M1>!4_O"CX$0!\)"78^!@'9"7;^#\H^#]H^#^H^#_D(%6$AVI?X!^"!(SV(`& -MD`4B='_PD`!%X%3O\)`%A^!D@/"0EWG@D`6$\)"7>N"0!87PD)=[X)`%AO"0 -MEWS@D`6'\**OY#.0ETGPPJ^0`3S@1"#P?2#D_Q(Z28`KD)=KX'`MD)=]\)`` -M1>!4_O"CX%3^\)`%(N3PHJ\SD)=)\,*O?2#D_Q(YVY"72>`D_Y*O(KL!!HF" -MBH/P(E`"]R*[_@'S(OB[`0WE@BGU@N6#.O6#Z/`B4`;I)8+(]B*[_@7I)8+( -M\B+%\/BCX"CPQ?#XY8(5@G`"%8/@./`BH_C@Q?`E\/#E@A6"<`(5@^#(./#H -M(KL!"HF"BH/@]?"CX")0!H?P"><9(KO^!^/U\`GC&2*)@HJ#Y)/U\'0!DR*[ -M`1#E@BGU@N6#.O6#X/7PH^`B4`GI)8+XAO`(YB*[_@KI)8+XXO7P".(BY8,J -M]8/ID_7PH^F3(KL!"HF"BH/PY?"C\")0!O<)I_`9(KO^!O/E\`GS&2+XNP$1 -MY8(I]8+E@SKU@^CPY?"C\")0">DE@LCV"*;P(KO^">DE@LCRY?`(\B+KG_7P -MZIY"\.F=0O#HG$7P(J0E@O6"Y?`U@_6#(M"#T(+XY)-P$G0!DW`-HZ.3^'0! -MD_6"B(/D\29960ET;@^Z/@^J/@^9```A(<[_^0ET[@ -M^Z/@^J/@^9```>\29:>0ET;@^Z/@^J/@^9```1(<[_^0ETS@_*/@_?6"C(/O -M\!(0`<1T_O!T9Z/P4Y'?D`$\X%4P]32CX%4Q]36CX%4R]3;E -M-##@#Y`!/'0!\)`!4W0'\$-5@.4T,.$)D`$\=`+P$GL`Y30PXCJ0`3QT!/"0 -M!I+@,.`>=4@4=4D`Y/O]?UA^`1(X[)`!6W0%\)`&DG0!\(`/D)>'Y/"0EXO@ -M_WT!$F[:Y30PXP:0`3QT"/#E-##D"9`!/'00\!)^W^4T,.4)D`$\="#P$F^B -MY34PX!60`3UT`?"0`(/@D)>+\.#_?0$2;MKE-C#C!I`!/G0(\'3^!)`!Q/!T -M9Z/PT`?0!M`%T`30`]`"T`'0`-#0T(+0@]#PT.`RBQ"*$8D2D``"$ASOD)=L -M\."0!)3PD``!$ASOD`25\)"7;.`PX'20EV-T`?!_@'X($BL3D)=E$AVIJQ"J -M$:D2D``!$ASO_^3\_?YX&A(=EJ@$J06J!JL'D)=EX/RCX/VCX/ZCX/_L5`/\ -MZT__ZD[^Z4W]Z$S\D)=O$AVID`4BY/"0EV_@_*/@_:/@_J/@_W@8$AV#D`26 -M[_"`1>20EV/P?X!^"!(K$Y"791(=J9"79>#\H^#]H^#^H^#_[$3`_)"791(= -MJ9"79>#\H^#]H^#^H^#_D(%6$AVI?X!^"!(SV)"7;."0`$!P#9"7 -M>.!P!Y`$_>!4_O"0EW/@D`2(\)"7=."0!(GPD)=UX)`$BO"CY/"0EW;@D`2, -M\)"7=^"0!(WPD)=XX)`$CO"CY/"0EU_@D`20\)"78."0!)'PD)=AX)`$DO"0 -MEV+@D`23\.20EV3PD)=?!/#DH_"C\*/PD)=S\*/PH_"C\*/PH_"0EV3@D`27 -M\)`%8."0ESKPD`5AX)"7._"0!6+@D)<\\)`%8^"0ESWPD)=\X/^0ESW@_M.? -M4`N0EWS@PY[3E`%`$9"7:N"T`0*``Y"7;N#_$GE\(I"7L.WPD)>O[_#3E`=0 -M;>#_=`&H!PB``L,SV/ST_Y``1^!?\'\0?@`2.JB0EZ_@_W0!J`<(@`+#,]C\ -M_Y``1N!/\'\0?@`2.JB0E[#@8!:0EZ_@_W0!J`<(@`+#,]C\_Y``18!XD)>O -MX/]T`:@'"(`"PS/8_/3_D`!%@'V0EZ_@)/CPX/]T`:@'"(`"PS/8_,14\/3_ -MD`!#X%_P?Q!^`!(ZJ)"7K^#_=`&H!PB``L,SV/S_D`!#X$_P?Q!^`!(ZJ)"7 -ML.!@&Y"7K^#_=`&H!PB``L,SV/S$5/#_D`!"X$^`&I"7K^#_=`&H!PB``L,S -MV/S$5/#T_Y``0N!?\'\0?@`2.J@BD`'$=##P=&RC\']X?@@2*Q.0EQT2':E_ -M!'X,$BL3D)'X($C/8D)!4]O!_$'X``CJH -MD)=]X&0!8`F0EVO@8`,";@&0EU_@PY3_4`7@!/"`.Y"78.##E/]0!N`$\.2` -M*)"78>##E/]0"N`$\.20EV#P@!60EV+@PY3_4!#@!/#DD)=A\)"78/"0EU_P -MD`!$X%0,8';@,.(RD)=SX,.4_U`%X`3P@"20EW3@PY3_4`;@!/#D@!&0EW7@ -MPY3_4`S@!/#DD)=T\)"7<_"0`$3@,.,RD)=VX,.4_U`%X`3P@"20EW?@PY3_ -M4`;@!/#D@!&0EWC@PY3_4`S@!/#DD)=W\)"7=O"0!/W@1`'P(I"70^OPH^KP -MH^GPK0>0`<1T`O!T;J/P[1)FP6X_`6Y-`FY;`VYI!6YW!FZ%!VZ3"6ZA#&ZO -M#6Z]#@``;LN0ET/@^Z/@^J/@^0)]G9"70^#[H^#ZH^#Y`G]WD)=#X/NCX/JC -MX/D"?1>0ET/@^Z/@^J/@^0)\"Y"70^#[H^#ZH^#Y`F;GD)=#X/NCX/JCX/D" -M?RB0ET/@^Z/@^J/@^0)S%)"70^#[H^#ZH^#Y`F0TD)=#X/NCX/JCX/D"?'Z0 -MET/@^Z/@^J/@^0)I#\*O=`($D`'$\'1NH_"`_H]BC6.0`<1TVO!T;J/PY6)4 -M#_^0EXC@5`]O8'CE8C#B,)"7B.`@X@5_`1)^")"7B.`PXPKE8B#C!1)^)X!6 -MD)>(X"#C3^5B,.-*KV,2?>B`0Y"7B.!4#_^_#`[E8B#C"1)]KCO8`,2?D20EXC@ -M5`__D)>+X%0/;W`CX##F'Y"7B.!4#_^0EW[@_D^0`2_P[F2`D)=^\)"7B^!4 -MO_`BD)=KX&0!8`,"<&60`$;@1`'PD)=]X'!`D)=CX&`=D)=OX/RCX/VCX/ZC -MX/^0@582':E_@'X($C/8@`:0!2)T?_"0EVK@_Q)Y?)"7?70!\)``1>!4_O"` -M1)"7?>!D`7`\D)=NX/\2>7SDD)=]\)``1>!$`?"0EV/@8!V0EV7@_*/@_:/@ -M_J/@_Y"!5A(=J7^`?@@2,]B`!9`%(N3PD`6'X&2`\)"7>>"0!83PD)=ZX)`% -MA?"0EWO@D`6&\)"7?."0!8?P(I"7,.OPH^KPH^GPD)>6X&0"<`,"<1N0`:_@ -M8`F0`:`2>2>0ES;@)/^2KZ*OY#/PPJ^0 -MES/@^Z/@^J/@BR2*)?4FD):(2>2>0 -MES;@)/^2KY`!KW3_\)`!R^!D@/`BD`'$=!SP='&C\)``$>!$"?!_$'X`$CJH -MD)<=X/RCX/VCX/ZCX/^0@582':E_>'X($C/8D)3]_Q(XMI"7E^"T`1&0@202 -M';4``RV5Y/U_`1(XMB*0EY[O\*/M\.2C\*/PY65@!>3_$GZ9D)>>X##@"9"7 -MH.3PHW2`\)`$'>!@'9`%(N"0EZ+PX/]4D&#LD`'(=/SP[U1OD`4B\(#=D)>> -MX/_#$Y#]$/"0!"7O\)"7G^!@$*.CX"00]8+D-/SU@^!$@/"0EZ"CX/_])`CU -M@N0T_/6#Y/!T"2WU@N0T_/6#X%3P\'0A+_6"Y#3\]8/@5/?PD)>@X/ZCX/\B -MD)>U[_#3E`=02N#_=`&H!PB``L,SV/ST_Y``1N!?\'\0?@`2.JB0E[7@_70! -M?@"H!0B`!<,SSC/.V/G_D`!$X/OD_N];J`4(@`;.HN<3SA/8^/\BD)>UX"3X -M\.#_=`&H!PB``L,SV/ST_Y``0^!?\'\0?@`2.JB0E[7@_70!?@"H!0B`!<,S -MSC/.V/G_D`!"X/OD_N];J`4(@`;.HN<3SA/8^/\BD)=&Z_"CZO"CZ?"BK^0S -MH_#"KY"71N#[H^#ZH^#YD``!$F8@^N7P)`#_Y#K^D)=&H^#ZD``![H_P$F9W -M$AS6_V`WM5X;D)=&X/NCX/JCX/F0``$29B!E8'`$Y5]E\&`ND)=&X/NCX/JC -MX/F0``$29B#_KO`2?+2`%9"71N#[H^#ZH^#Y$AS695Y@`Q)_5I"72>`D_Y*O -M(L#@P/#`@\""P-!UT`#``,`!P`+``\`$P`7`!L`'D`'$=*OP='.C\%.1[Y`` -M4>#_D`!5X%_U/>4],.88=$#PD)=LX%0#_[\#"Y"7:>!@!7\!$D1[Y3TPYQ60 -M`%5T@/"0EVS@5`/_OP,%?P(21'N0`<1TJ_!T!\"("=0<"8M/DDZ/XY).C0`/V@`'R"-_T@"GDDZ/X -M5``OH\/='60`<3PHW1,\.4/=?`(I"1G]8+D-)/U@^#_=*4E -M#_6"Y#26]8/@5!_[TY]``JL'ZR7@))[U@N0T0?6#Y)/^=`&3_^LEX"1F]8+D -M-$'U@W0!DR__Y),^PQ/^[Q/_Y/S]Y0\EX"7@).'U@N0TDO6#$AVI=(0E#_6" -MY#0$]8/K\/\BD)=,[_#3E`=0,^#_=`&H!PB``L,SV/ST_Y``1^!?\'\0?@`2 -M.JB0ETS@_W0!J`<(@`+#,]C\]/^0`$:`.Y"73.`D^/#@_W0!J`<(@`+#,]C\ -MQ%3P]/^0`$/@7_!_$'X`$CJHD)=,X/]T`:@'"(`"PS/8_/3_D`!#X%_P?Q!^ -M`!(ZJ"*/"HT+K0-T=I`!Q/"C=%+PY0M4'_ET`24*]8+D-)+U@^#_D`3]X+0! -M!74.`X`#=0X![=.5#D`%KPH"=4R0`<5T(/#E#2__Z9!!UI/^[].>0"*0`<5T -M0/!T`24*]8+D-)+U@^3P=(0E"O6"Y#0$]8/E"_`B=`$E"O6"Y#22]8/O\"+D -MD)*X)"7?_"``)"7+G0!\)"7+N!@,9"7C^!$$/"0EX7@]4CD]4G[_7]4?@$2 -M..R0`5=T!?"0EXC@5`_#E`10!WT!?P02;MHBD`:IX/4*5,!P#I"7B?"0EXO@ -M_WT!`F[:Y0HPYA*0EXET`?"0EX_@1`'P$GY^@`>0EX_@5/[PY0HPYRF0EXET -M`?"0EX_@1`+P=4@#Y/5)^_U_5'X!$CCLD`%7=`7PD)>.=`'P(I"7C^!4_?`B -MD``KX$0!\'_H?@,2.JB0``C@1!#P?Q!^`!(ZJ)``">!4]_!_$'X`$CJHD``H -MX%3^\'\0?@`2.JB0`"#@5/[P?Q!^`!(ZJ)``)>!$0/!_$'X`$CJHD``)X%3O -M\'\0?@`".JB+$(H1B1(2?LVK$*H1J1(2'-;U911@#A1@#Q1@&B0#<#Q_`8`U -MY/^`,9"7BG0!\)"7?_#D_X`CJQ"J$:D2D``"$ASO_Y"7BG`%=`7P@`+O\)"7 -MBN"0EW_PY/\2=#TBD``EX%2_\'\0?@`2.JB0`"#@1`'P?Q!^`!(ZJ)``*.!$ -M`?!_$'X`$CJHD`#PX##A^9``">!$"/!_$'X`$CJHD``(X%3O\'\0?@`2.JB0 -M`"O@5/[P?^A^`P(ZJ)``1>3PD`3]\*/PD)=M\)"7<_"0EW;PD)=T\)"7=_"0 -MEW7PD)=X\)"77P3PY*/PH_"C\)"79/"0EVGPD)=K\)"7??"0EV[PD)=J\)"7 -M8_"0`%'@1,#P(HLABB*)(Y"7F.OPH^KPH^GPH^4D\*/E)?"CY2;PKR<5)^]@ -M*I"7F^#[H^1U\`$29=^I\/H2'-;_D)>8X/NCY'7P`1)EWZGP^N\2996`SZLA -MJB*I(R*0!6#@D)=Y\)`%8>"0EWKPD`5BX)"7>_"0!6/@D)=\\,-T_Y_^D)=Z -MX-.>0![@+_"CX+3_#^3PH^"T_P/D\"*0EWR``Y"7>^`$\"*0EWK@+_`BY/5D -MD)>/\/5ED)>+=`SPD)>(\.20EXWPD)>'\)"7AO"0EXH$\)"7?_#DD)>.\)"7 -MB?"0EX'PD)>%=`?PY)"7@/"0EX/PHW0"\.20EXSP(N20EZWPH_"0`<1T'?!T -M>J/PD`7XX'`/H^!P"Z/@<`>CX'`#?P$BTY"7KN"4Z)"7K>"4`T`#?P`B?S)^ -M`!(ZJ)"7KN`$\'#*D)>MX`3P@,+DD)>5\**O,Y"7._"0`(#@(.$:$CJ^$CJ^ -MD)J/P@-^0!C!T`?#"KY``@.!$@/!_$'X`$CJHD)<[ -MX"3_DJ\BD`'$=+CP='JC\.55<#>0EXO@5`_3E`%0+)`"A^!P)I"7EN"T`A"0 -MEY#@_J/@]8*.@^!@"(`/D`&OX'`)D)>,X&`#?P$B?P`BD)>.X&`2Y/"CX%3] -M\.!4`W`SD)>)\(`CD)>`X`3PD)>/X%3O\)"7@.#3E`%`#>5DM`$2H^!P#N`$ -M\"*0EXO@_WT!$F[:(N20ESKP[Y``,?#N5`/_H^!4_$_PH^!4?_"0`##@(.<. -MD)/X"#D$9"7A^!D`6`) -MD)>!X'`#?P$B?P`BCV:0`<1TS/!T>Z/PD)>4X/]]`1)QR>5F8!!T(2_U@N0T -M_/6#X$00\(`.="$O]8+D-/SU@^!4[_"0!!]T`?`B$AS6_\.4(%`5D``"$ASO -M_G0C+_6"Y#25]8/N\(`.[[0@"I```A(<[Y"38?!T(R_U@N0TE?6#X)`$LO`B -MD`$W=`+PD`4B=/_P$GH=[W`&D`'(=/WP?0)_`Q(Z+^5E8`5_`1)^F1)L,)"7 -MB.!4\/#@1`+P(I```A(<[Y"7;?#@D`2;\)"7;>!@!."T_QRBK^0S]1#"KY`` -M1^!4^_!]0'\!$CGXY1`D_Y*O(I"72N[PH^_P=5X!CE_U8'\+$G7/$GYAY/\2 -M?QN0ETK@_*/@_>S[C4CD]4E]`7]@?@$"..Q]`G\#$CF^Y65@(Y"7C>!@!GT! -M?PR`#Y"7B.!4#\.4!%`'?0%_!!)NVN3_$GZ9(I`"">#]$AS6_J\%[2Z0EY+P -MD``!$ASO_^TOD)>3\)```A(<[_^N!>TOD)>4\"*0!C3@8"8435_ -M^7X!$GM&OP$)D`8UX%0/\(`%@``"?P#DD`8T\"*0`<1T-\!(P%ZEWDN`G!FD`8$X%2_\.]@"N5DM`$%Y/\2>\R0EXC@5/#PX$0,\"*0 -ME[+O\!)Q')"7LN!@!9`%(N3PD)>(X%3P\.!$!/`BD`8$X$1`\.5DM`$%?P$2 -M>\R0EXC@5/#PX$0$\"*0EXC@5/#PX$0!\!)WM1)X=9"7B.!4\/#@1`+P(G\+ -M$G)O[V5A8!#E8;0!!>3U88`#=6$!?P$B?P`BD`'$='[P='ZC\)"7D^#_Y/T2 -M<7X+0!$.3_@`F0EY?@M`$%?P$23CLBD`!)X)"7M/#@ -M5`_PX/]$\)``2?#O1+#P(N20EX[PD)>`\)"7B?"0EX_P(N5>M`$+$GYAOP$% -M?P$2?QLBD`DH[_"C\*/PH_"C\*/P(I`&-'3_\.2C\*/PH_`B09>Q`$&7?H!! -ME[,``)`!RN5A\.]@`Q)^M"*0ET;K\*/J\*/I\"*0EZ?K\*/J\*/I\"*0EZKK -M\*/J\*/I\"*/@HZ#HZ.CY/`BY/5>?V!^`0)_3)"7E^"0ERWP(H\;C!R-'2*/ -M'HP?C2`B$AS6]60B(E())`````V`$0`H````@]O_```(```"``2`!`@```,` -M```("````/P```P(```*````$`@``(A3`!`4"```$#T,`A@(``"%`R`"'`@` -M```````@"`````$``20(```$`#D`*`@````!``$L"```!``Y`#`(```G)R-%1I5`P``)0`O$-8#``` -M'C14:5P,``"4`#Q#8`P```````!D#```BX0646@,``#_"\!';`P``#8```!P -M#```#0!_+'0,``!;$88!>`P``!\```!\#```$I:Y`(`,`````0!`A`P````` -M]B"(#`````$`0(P,`````"`@D`P``"`8$@"4#````````)@,```@&!(`G`P` -M`']_``"@#````````*0,``"`````J`P```````"L#````````+`,```````` -MM`P```````"X#````````+P,```````HP`P```````#$#````````,@,```` -M````S`P```````#0#````````-0,````````V`P``"`@```@(``!\"````````(`(``!P,`C`A`@``-4$``"( -M"````````(P(``#``,#,D`@````(``"4"```_O___Y@(```0(#!`G`@``%!@ -M<```"0````````0)```C````"`D````````,"0``$1$2@0`*``#(1]``!`H` -M``P`_X`("@```(.#C`P*```/$F@N$`H``'B[`)44"@``*$`4$1@*```7$8@` -M'`H````/%(D@"@`````;&B0*```7$PX)*`H```0"```L"@````#3`'`*```` -MOQ\0=`H```<`````#```0!T'2`0,```15J`#"`P``.0````,#```;&QL;!`, -M`````(`(%`P````!`$`8#`````"`"!P,`````0!`(`P````````D#``````` -M`"@,````````+`P````````P#```1*SI:30,``#/4I9&.`P``)19>4D\#``` -M')>7"D`,```_0'P?1`P``+<``0!(#```!P$"[$P,``!_`W\`4`P``!XT5&E4 -M#```E`"\0U@,```>-%1I7`P``)0`/$-@#````````&0,``"+A!91:`P``/\+ -MP$=L#```-@```'`,```-`'\L=`P``-L0A@%X#```'P```'P,```2%KD`@`P` -M```!`$"$#`````#V((@,`````0!`C`P`````(""0#```(!@2`)0,```````` -MF`P``"`8$@"<#```?W\``*`,````````I`P``(````"H#````````*P,```` -M````L`P```````"T#````````+@,````````O`P``````"C`#````````,0, -M````````R`P```````#,#````````-`,````````U`P```````#8#```)R2R -M9-P,```R:78`X`P``"(B(@#D#````````.@,```"0V0W[`P```S4ER\`#0`` -M0`<(``0-```!!`(`"`T``'^0```,#0```0(!(!`-```S,V.@%`T``$.\,S,8 -M#0``:UN/>BP-``!UF9?,,`T````````T#0```(!@@#@-````````/`T``)-R -M`@!`#0```````$0-````````2`T```````!,#0```````%`-```*%#=D5`T` -M``````!8#0```````%P-``!D(`,P8`T``&C>4T9D#0``/(I1!&@-```!(0`` -M;`T``!8<("IP#0``+C82&'0-```@(BPR>`T``"0\#@``#@``*BHJ*@0.```J -M*BHJ"`X``"HJD`,0#@``*BHJ*A0.```J*BHJ&`X``"HJ*BH<#@``*BHJ*B@. -M````````,`X``!_<`!`T#@``'XP`$#@.```"`10"/`X``,($%FA`#@```'P` -M`40.````2``!2`X``````/M,#@``T2@``%`.```?W``05`X``!^,`!!8#@`` -M`@$4`EP.```%#18H8`X```@```!H#@``I"4;`&P.``"@)1MC<`X``*`E&V-T -M#@``H"4;"'@.``"@)1L(?`X``*`E&PB`#@``H"4;"(0.``"@)1MCB`X``*`E -M&PB,#@``H"4;8]`.``"@)1MCU`X``*`E&V/8#@``H"4;8]P.``"@)1L`X`X` -M`*`E&P#L#@``H"4;:Q0/```#````3`\`````````#P````,````.``#_____ -M#`P)!P0.``#_____!00"`0@.````_P```````&P(````____`````!`.``#_ -M____#@P,"Q0.``#_____!@4#`1@.``#_____#@T,"QP.``#_____"04#`3`( -M``#_____#`P)!S0(``#_____!00"`3@(````____`````&P(``#_```````` -M`#P(``#_____#@T,"T@(``#_____"04#`4P(``#_____#@T,"V@(``#_____ -M"04#`0`.``#_____``````0.``#_____``````@.````_P```````&P(```` -M____`````!`.``#_____`````!0.``#_____`````!@.``#_____`````!P. -M``#_____`````#`(``#_____`````#0(``#_____`````#@(````____```` -M`&P(``#_`````````#P(``#_____`````$@(``#_____`````$P(``#_____ -M`````&@(``#_____```````.``#_____!`0$!`0.``#_____!`("``@.```` -M_P```````&P(````____`````!`.``#_____!@8&!A0.``#_____!@0"`!@. -M``#_____`````!P.``#_____`````#`(``#_____!`0$!#0(``#_____!`(" -M`#@(````____`````&P(``#_`````````#P(``#_____!@8&!D@(``#_____ -M!@0"`$P(``#_____`````&@(``#_____```````.``#_____``````0.``#_ -M____``````@.````_P```````&P(````____`````!`.``#_____`````!0. -M``#_____`````!@.``#_____`````!P.``#_____`````#`(``#_____```` -M`#0(``#_____`````#@(````____`````&P(``#_`````````#P(``#_____ -M`````$@(``#_____`````$P(``#_____`````&@(``#_____```````.``#_ -M____``````0.``#_____``````@.````_P```````&P(````____`````!`. -M``#_____`````!0.``#_____`````!@.``#_____`````!P.``#_____```` -M`#`(``#_____`````#0(``#_____`````#@(````____`````&P(``#_```` -M`````#P(``#_____`````$@(``#_____`````$P(``#_____`````&@(``#_ -M____```````.``#_____!`0$!`0.``#_____!`("``@.````_P```````&P( -M````____`````!`.``#_____`````!0.``#_____`````!@.``#_____```` -M`!P.``#_____`````#`(``#_____!`0$!#0(``#_____!`("`#@(````____ -M`````&P(``#_`````````#P(``#_____`````$@(``#_____`````$P(``#_ -M____`````&@(``#_____```````.``#_____``````0.``#_____``````@. -M````_P```````&P(````____`````!`.``#_____`````!0.``#_____```` -M`!@.``#_____`````!P.``#_____`````#`(``#_____`````#0(``#_____ -M`````#@(````____`````&P(``#_`````````#P(``#_____`````$@(``#_ -M____`````$P(``#_____`````&@(``#_____```````.``#_____#`P,"@0. -M``#_____"`8$`@@.````_P```````&P(````____`````!`.``#_____#@T, -M"A0.``#_____"`8$`A@.``#_____#@T,"AP.``#_____"`8$`C`(``#_____ -M#`P,"C0(``#_____"`8$`C@(````____`````&P(``#_`````````#P(``#_ -M____#@T,"D@(``#_____"`8$`DP(``#_____#@T,"F@(``#_____"`8$`@`. -M``#_____``````0.``#_____``````@.````_P```````&P(````____```` -M`!`.``#_____`````!0.``#_____`````!@.``#_____`````!P.``#_____ -M`````#`(``#_____`````#0(``#_____`````#@(````____`````&P(``#_ -M`````````#P(``#_____`````$@(``#_____`````$P(``#_____`````&@( -M``#_____```````.``#_____!`0$!`0.``#_____!`("``@.````_P`````` -M`&P(````____`````!`.``#_____!@8&!A0.``#_____!@0"`!@.``#_____ -M`````!P.``#_____`````#`(``#_____!`0$!#0(``#_____!`("`#@(```` -M____`````&P(``#_`````````#P(``#_____!@8&!D@(``#_____!@0"`$P( -M``#_____`````&@(``#_____```````.``#_____``````0.``#_____```` -M``@.````_P```````&P(````____`````!`.``#_____`````!0.``#_____ -M`````!@.``#_____`````!P.``#_____`````#`(``#_____`````#0(``#_ -M____`````#@(````____`````&P(``#_`````````#P(``#_____`````$@( -M``#_____`````$P(``#_____`````&@(``#_____```````.``#_____```` -M``0.``#_____``````@.````_P```````&P(````____`````!`.``#_____ -M`````!0.``#_____`````!@.``#_____`````!P.``#_____`````#`(``#_ -M____`````#0(``#_____`````#@(````____`````&P(``#_`````````#P( -M``#_____`````$@(``#_____`````$P(``#_____`````&@(``#_____```` -M```.``#_____!`0$!`0.``#_____!`("``@.````_P```````&P(````____ -M`````!`.``#_____`````!0.``#_____`````!@.``#_____`````!P.``#_ -M____`````#`(``#_____!`0$!#0(``#_____!`("`#@(````____`````&P( -M``#_`````````#P(``#_____`````$@(``#_____`````$P(``#_____```` -M`&@(``#_____```````.``#_____``````0.``#_____``````@.````_P`` -M`````&P(````____`````!`.``#_____`````!0.``#_____`````!@.``#_ -M____`````!P.``#_____`````#`(``#_____`````#0(``#_____`````#@( -M````____`````&P(``#_`````````#P(``#_____`````$@(``#_____```` -M`$P(``#_____`````&@(``#_____`````#`,``!*K.EI/`P``!B7EPHD```` -M#X`1`"@```"#V_\`0`````0`#```"``````$@`0(```!````"`@```#\```, -M"```"@```!`(``"(4P`0%`@``!`]#`(8"```A0,@`AP(````````(`@````! -M``$D"```!`(Y`"@(````````+`@````````P"````````#0(````````.`@` -M```````\"````````$`(``````$`1`@```````!("````````$P(```````` -M4`@```````!4"````````%@(``":5II67`@``*0E&P!@"```,`+F9F0(```P -M`1\&:`@```````!L"````"`@('`(`````P`#=`@```!``")X"```"`@``'P( -M``#QP_\`@`@``'`P","$"```U00``(@(````````C`@``,``P,R0"`````@` -M`)0(``#^____F`@``!`@,$"<"```4&!P```)````````!`D``",````("0`` -M``````P)```1$1*!``H``,A'T``$"@``#`#_@`@*````@X.,#`H```\2:"X0 -M"@``>+L`E10*```H0!01&`H``!<1B``<"@````\4B2`*`````!85)`H``!(/ -M"P`X``*`E&PA\#@``H"4; -M"(`.``"@)1L(A`X``*`E&V.(#@``H"4;"(P.``"@)1MCT`X``*`E&V/4#@`` -MH"4;8]@.``"@)1MCW`X``*`E&P#@#@``H"4;`.P.``"@)1MKZ`X``$A453$4 -M#P```P```$P/``````````\````#```D````#8`1`"@```"#V_\```@````` -M!(`$"````0````@(````_```#`@```H````0"```B%,`$!0(```0/0P"&`@` -M`(4#(`(<"````````"`(`````0`!)`@```0`.0`H"````````"P(```````` -M,`@````````T"````````#@(````````/`@```````!`"``````!`$0(```` -M````2`@```````!,"````````%`(````````5`@```````!8"```FE::5EP( -M``"D)1L`8`@``#`"YF9D"```,`$?!F@(````````;`@````R,C)P"`````<` -M!W0(````0``B>`@```@(``!\"````````(`(``!P,`C`A`@``-4$``"("``` -M`````(P(``#``,#,D`@````(``"4"```_O___Y@(```0(#!`G`@``%!@<``` -M"0````````0)```C````"`D````````,"0``$1$2@0`*``#(1]``!`H```P` -M_X`("@```(.#C`P*```/$F@N$`H``'B[`)44"@``*$`4$1@*```7$8@`'`H` -M```/%(D@"@`````;&B0*```7$PX)*`H```0"```L"@````#3`'`*````OQ\0 -M=`H```<`````#```0!T'2`0,```15J`#"`P``.0````,#```;&QL;!`,```` -M`(`(%`P````!`$`8#`````"`"!P,`````0!`(`P````````D#````````"@, -M````````+`P````````P#```1*SI:30,``#/4I9&.`P``)19>4D\#```')>7 -M"D`,```_0'P?1`P``+<``0!(#```!P$"[$P,``!_`W\`4`P``!XT5&E4#``` -ME`"\0U@,```>-%1I7`P``)0`/$-@#````````&0,``"+A!91:`P``/\+P$=L -M#```-@```'`,```-`'\L=`P``-L0A@%X#```'P```'P,```2%KD`@`P````! -M`$"$#`````#V((@,`````0!`C`P`````(""0#```(!@2`)0,````````F`P` -M`"`8$@"<#```?W\``*`,````````I`P``(````"H#````````*P,```````` -ML`P```````"T#````````+@,````````O`P``````"C`#````````,0,```` -M````R`P```````#,#````````-`,````````U`P```````#8#```)R2R9-P, -M```R:78`X`P``"(B(@#D#````````.@,```"0V0W[`P```S4ER\`#0``0`<( -M``0-```!!`(`"`T``'^0```,#0```0(!(!`-```S,V.@%`T``$.\,S,8#0`` -M:UN/>BP-``!UF9?,,`T````````T#0```(!@@#@-````````/`T``)-R`@!` -M#0```````$0-````````2`T```````!,#0```````%`-```*%#=D5`T````` -M``!8#0```````%P-``!D(`,P8`T``&C>4T9D#0``/(I1!&@-```!(0``;`T` -M`!8<("IP#0``+C82&'0-```@(BPR>`T``"0\#@``#@``*BHJ*@0.```J*BHJ -M"`X``"HJD`,0#@``*BHJ*A0.```J*BHJ&`X``"HJ*BH<#@``*BHJ*B@.```` -M````,`X``!_<`!`T#@``'XP`$#@.```"`10"/`X``,($%FA`#@```'P``40. -M````2``!2`X``````/M,#@``T2@``%`.```?W``05`X``!^,`!!8#@```@$4 -M`EP.```%#18H8`X```@```!H#@``I"4;`&P.``"@)1MC<`X``*`E&V-T#@`` -MH"4;"'@.``"@)1L(?`X``*`E&PB`#@``H"4;"(0.``"@)1MCB`X``*`E&PB, -M#@``H"4;8]`.``"@)1MCU`X``*`E&V/8#@``H"4;8]P.``"@)1L`X`X``*`E -M&P#L#@``H"4;:Q0/```#````3`\`````````#P````,``"0````-@!$`*``` -M`(/;_P``"````@`$@`0(```#````"`@```#\```,"```"@```!`(``"(4P`0 -M%`@``!`]#`(8"```A0,@`AP(````````(`@````!``$D"```!``Y`"@(```` -M`0`!+`@```0`.0`P"```)R+L`E10*```H0!01 -M&`H``!<1B``<"@````\4B2`*`````!L:)`H``!<3#@DH"@``!`(``"P*```` -M`-,`<`H```"_'Q!T"@``!P`````,``!`'0=(!`P``#-6H`,(#```Y`````P, -M``!L;&QL$`P`````@`@4#`````$`0!@,`````(`('`P````!`$`@#``````` -M`"0,````````*`P````````L#````````#`,``!$K.EI-`P``,]2ED8X#``` -ME%EY23P,````X``*0E&PQ\#@``I"4;#(`.``"D)1L,A`X``*0E -MVV.(#@``I"4;#(P.``"D)=MCT`X``*0EVV/4#@``I"7;8]@.``"D)=MCW`X` -M`*0E&P#@#@``I"4;`.P.``"D)=MO%`\```,```!,#P`````````/`````P`` -M``X``/____\("`@&!`X``/____\&!`0`"`X```#_````````;`@```#___\` -M````$`X``/____\(!@8$%`X``/____\$`@(`&`X``/____\(!@8$'`X``/__ -M__\$`@(`,`@``/____\("`@&-`@``/____\&!`0`.`@```#___\`````;`@` -M`/\`````````/`@``/____\(!@8$2`@``/____\$`@(`3`@``/____\(!@8$ -M:`@``/____\$`@(```X``/____\`````!`X``/____\`````"`X```#_```` -M````;`@```#___\`````$`X``/____\`````%`X``/____\`````&`X``/__ -M__\`````'`X``/____\`````,`@``/____\`````-`@``/____\`````.`@` -M``#___\`````;`@``/\`````````/`@``/____\`````2`@``/____\````` -M3`@``/____\`````:`@``/____\```````X``/____\`````!`X``/____\` -M````"`X```#_````````;`@```#___\`````$`X``/____\`````%`X``/__ -M__\`````&`X``/____\`````'`X``/____\`````,`@``/____\`````-`@` -M`/____\`````.`@```#___\`````;`@``/\`````````/`@``/____\````` -M2`@``/____\`````3`@``/____\`````:`@``/____\```````X``/____\` -M````!`X``/____\`````"`X```#_````````;`@```#___\`````$`X``/__ -M__\`````%`X``/____\`````&`X``/____\`````'`X``/____\`````,`@` -M`/____\`````-`@``/____\`````.`@```#___\`````;`@``/\````````` -M/`@``/____\`````2`@``/____\`````3`@``/____\`````:`@``/____\` -M``````X``/____\`````!`X``/____\`````"`X```#_````````;`@```#_ -M__\`````$`X``/____\`````%`X``/____\`````&`X``/____\`````'`X` -M`/____\`````,`@``/____\`````-`@``/____\`````.`@```#___\````` -M;`@``/\`````````/`@``/____\`````2`@``/____\`````3`@``/____\` -M````:`@``/____\```````X``/____\`````!`X``/____\`````"`X```#_ -M````````;`@```#___\`````$`X``/____\`````%`X``/____\`````&`X` -M`/____\`````'`X``/____\`````,`@``/____\`````-`@``/____\````` -M.`@```#___\`````;`@``/\`````````/`@``/____\`````2`@``/____\` -M````3`@``/____\`````:`@``/____\```````X``/____\`````!`X``/__ -M__\`````"`X```#_````````;`@```#___\`````$`X``/____\`````%`X` -M`/____\`````&`X``/____\`````'`X``/____\`````,`@``/____\````` -M-`@``/____\`````.`@```#___\`````;`@``/\`````````/`@``/____\` -M````2`@``/____\`````3`@``/____\`````:`@``/____\``````````%D! -M`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(`"@`` -M`+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1!``` -M&0`````````:````50(!`!L`````"@8`'````'C##P`=````4!(*`!X```!? -M1`0`'P````$`"``@````%+8``"$`````P`8`(@`````````C````6!4``"0` -M``!@````)0```(,$```F`````/`$`"<```#9QPX`*````,!W!0`I````@T<` -M`"H````!````*P```#03`@`J`````````"L```!4````*@````$````K```` -M"`@``"L````S,P4`+`````P````J`````@```"L````("```*P```#.S!0`L -M````#0```"H````#````*P````@(```K````,S,&`"P````-````*@````0` -M```K````"`@``"L````SLP8`+`````T````J````!0```"L````("```*P`` -M`#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P````-```` -M*@````<````K````"0<``"L````S,P8`+`````T````J````"````"L````* -M!@``*P```#.S!``L````#0```"H````)````*P````H&```K````,S,%`"P` -M```-````*@````H````K````"@8``"L````SLP4`+`````T````J````"P`` -M`"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H&```K```` -M,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+`````T````J -M````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X`$`````\` -M!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y`P(`$``` -M``\``P`1`````/4/`!``````````$0`````````0````#P`(`!$`````\0,` -M$`````\`"0`1`````#$"`!(`````(`,`$@`````0!P`2```````+`!(````` -MP`\`$P```+.'`@`3````MT0"`!,```"K!`(`$P```)_$`0`3````DX0!`!,` -M``";0@$`$P```)D"`0`3````G,(``!,```"@@0``$P```*Q````3````(``` -M`!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0```"3T```5```` -M)/0$`!4````D]`@`%0```"3T#``6````,`,.`!8````P`PH`%@```#`#!@`6 -M````,`,"``````!9`0$`&`````'T``#^`````````/X`````````'P````,` -M"`#^`````````/X`````````'@```%=$!``?```````(``````!9`0,````` -M`%D!`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(` -M"@```+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1 -M!```$@`````@`P`2`````!`'`!(```````L`$@````#`#P`3````KX<"`!,` -M``"W1`(`$P```*L$`@`3````G\0!`!,```"3A`$`$P```)="`0`3````E0(! -M`!,```"8P@``$P```)R!```3````J$```!,````<````%````$R4`0`4```` -M1)0%`!0```!,E`D`%````$24#0`5````)/0``!4````D]`0`%0```"3T"``5 -M````)/0,`!8````P`PX`%@```#`#"@`6````,`,&`!8````P`P(``````%D! -M`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(`"@`` -M`+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1!``` -M&0`````````:````50(!`!L`````"@8`'````'C##P`=````4!(*`!X```!? -M1`0`'P````$`"``@````%+8``"$`````P`8`(@`````````C````6!4``"0` -M``!@````)0```(,$```F`````/`$`"<```#9QPX`*````,!W!0`I````@T<` -M`"H````!````*P```#03`@`J`````````"L```!4````*@````$````K```` -M"`@``"L````S,P4`+`````P````J`````@```"L````("```*P```#.S!0`L -M````#0```"H````#````*P````@(```K````,S,&`"P````-````*@````0` -M```K````"`@``"L````SLP8`+`````T````J````!0```"L````("```*P`` -M`#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P````-```` -M*@````<````K````"0<``"L````S,P8`+`````T````J````"````"L````* -M!@``*P```#.S!``L````#0```"H````)````*P````H&```K````,S,%`"P` -M```-````*@````H````K````"@8``"L````SLP4`+`````T````J````"P`` -M`"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H&```K```` -M,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+`````T````J -M````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X`$`````\` -M!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y`P(`$``` -M``\``P`1`````/4/`!``````````$0`````````0````#P`(`!$`````\0,` -M$`````\`"0`1`````#$"`!(`````(`,`$@`````0!P`2```````+`!(````` -MP`\`$P```+.'`@`3````MT0"`!,```"K!`(`$P```)_$`0`3````DX0!`!,` -M``";0@$`$P```)D"`0`3````G,(``!,```"@@0``$P```*Q````3````(``` -M`!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0````7T```5```` -M!?0$`!4````%]`@`%0````7T#``6````,`,.`!8````P`PH`%@```#`#!@`6 -M````,`,"``````!9`0$`&`````'T``#^`````````/X`````````'P````,` -M"`#^`````````/X`````````'@```%=$!``?```````(``````!9`0,````` -M`%D!`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/!`(` -M"@```+&M`0`+````9T@%``P````NF0@`#0```"SE```.````YYP#``\```!1 -M!```&0`````````:````50(!`!L`````"@8`'````'C##P`=````4!(*`!X` -M``!?1`0`'P````$`"``@````%+8``"$`````P`8`(@`````````C````6!4` -M`"0```!@````)0```(,$```F`````/($`"<```#9QPX`*````,!W!0`I```` -M@T<``"H````!````*P```#03`@`J`````````"L```!4````*@````$````K -M````"`@``"L````S,P4`+`````P````J`````@```"L````("```*P```#.S -M!0`L````#0```"H````#````*P````@(```K````,S,&`"P````-````*@`` -M``0````K````"`@``"L````SLP8`+`````T````J````!0```"L````("``` -M*P```#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P````- -M````*@````<````K````"0<``"L````S,P8`+`````T````J````"````"L` -M```*!@``*P```#.S!``L````#0```"H````)````*P````H&```K````,S,% -M`"P````-````*@````H````K````"@8``"L````SLP4`+`````T````J```` -M"P```"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H&```K -M````,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+`````T` -M```J````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X`$``` -M``\`!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y`P(` -M$`````\``P`1`````/4/`!``````````$0`````````0````#P`(`!$````` -M\0,`$`````\`"0`1`````#$"`!(`````(`,`$@`````0!P`2```````+`!(` -M````P`\`$P```+.'`@`3````MT0"`!,```"K!`(`$P```)_$`0`3````DX0! -M`!,```";0@$`$P```)D"`0`3````G,(``!,```"@@0``$P```*Q````3```` -M(````!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0```"3T```5 -M````)/0$`!4````D]`@`%0```"3T#``6````,`,.`!8````P`PH`%@```#`# -M!@`6````,`,"``````!9`0$`&`````'T``#^`````````/X`````````'P`` -M``,`"`#^`````````/X`````````'@```%=$!``?```````(``````!9`0,` -M`````%D!`P`!````A!(#``(`````@`D``P```&.,`0`$````YQ`"``D```!/ -M!`(`"@```+"M`0`+````9T@%``P````NF0@`#0```"GE```.````YYP#``\` -M``!1!```&0`````````:````50(``!L`````"@8`'````'C##P`=````4!(* -M`!X```!?1`0`'P````$`"``@````%+8``"$`````P`8`(@```#P(```C```` -M6!4``"0```!@````)0```(,$```F`````/`$`"<```#9QPX`*````,!W"0`I -M````@T<``"H````!````*P```#03`@`J`````````"L```!4````*@````$` -M```K````"`@``"L````S,P4`+`````P````J`````@```"L````("```*P`` -M`#.S!0`L````#0```"H````#````*P````@(```K````,S,&`"P````-```` -M*@````0````K````"`@``"L````SLP8`+`````T````J````!0```"L````( -M"```*P```#,S!P`L````#0```"H````&````*P````D'```K````,[,%`"P` -M```-````*@````<````K````"0<``"L````S,P8`+`````T````J````"``` -M`"L````*!@``*P```#.S!``L````#0```"H````)````*P````H&```K```` -M,S,%`"P````-````*@````H````K````"@8``"L````SLP4`+`````T````J -M````"P```"L````*!@``*P```#,S!@`L````#0```"H````,````*P````H& -M```K````,[,&`"P````-````*@````T````K````"@8``"L````S,P<`+``` -M``T````J````#@```"L````+!0``*P```&9F!@`L````&@```"H```````X` -M$`````\`!``1````_#$.`!`````/``8`$0```/CY#P`0````#P`"`!$```#Y -M`P(`$`````\``P`1`````/4/`!``````````$0`````````0````#P`(`!$` -M````\0,`$`````\`"0`1`````#$"`!(`````@`T`$@``````"0`2`````!`% -M`!(`````(`$`$P```+2/`@`3````J$\"`!,```"D!P(`$P```)C'`0`3```` -MI(,!`!,```"80P$`$P```*0!`0`3````F,$``!,```"D@```$P```)A````3 -M`````````!0```!,E`$`%````$24!0`4````3)0)`!0```!$E`T`%0````7T -M```5````!?0$`!4````%]`@`%0````7T#``6````,`,.`!8````P`PH`%@`` -M`#`#!@`6````,`,"``````!9`0$`&`````'T``#^`````````/X````````` -M'P````,`"`#^`````````/X`````````'@```%=$!``?```````(``````!9 -M`0,`(`0``(`````C!````````#`$````````,00````````R!````````#,$ -M```!````-`0```0````U!```!0```#8$```&````-P0```<````X!``````` -M`#D$````````.@0````````[!````0```#P$```$````/00```4````^!``` -M!@```#\$```'````0`0``%T```!!!````0```$($````````1`0``!4```!% -M!```\````$8$```/````1P0```````!8!```00```%D$``"H````6@0``'(` -M``!;!```N0```&`$``!F````800``&8```!B!```"````&,$```#````R`0` -M`/\```#)!```"````,P$``#_````S00``/\```#.!````0`````%```F```` -M`04``*(````"!0``+P````,%````````!`4``"@````%!0``HP````8%``!> -M````!P4````````(!0``*P````D%``"D````"@4``%X````+!0````````P% -M``!/````#04``*0````.!0````````\%````````$@4``!P````4!0``"@`` -M`!4%```0````%@4```H````7!0``$````!H%```6````)`4```\````E!0`` -M3P```$8%``!`````1P4```````!0!0``$````%$%```0````604```(```!: -M!0```@```%T%``#_````!08``#`````(!@``#@````D&```J````4@8``"`` -M```\!@``"@```#T&```.````/@8```H````_!@``#@```&X&```%``````<` -M`"$````!!P``0P````('``!E`````P<``(<````(!P``(0````D'``!#```` -M"@<``&4````+!P``AP```'@,```!``![>`P```$``7MX#````0`">W@,```! -M``-[>`P```$`!'MX#````0`%>W@,```!``9Z>`P```$`!WEX#````0`(>'@, -M```!``EW>`P```$`"G9X#````0`+=7@,```!``QT>`P```$`#7-X#````0`. -M`P```$`$'!X#````0`1;W@,```!`!)N>`P```$`$VUX#``` -M`0`4;'@,```!`!5K>`P```$`%FIX#````0`7:7@,```!`!AH>`P```$`&6=X -M#````0`:9G@,```!`!ME>`P```$`'&1X#````0`=8W@,```!`!YB>`P```$` -M'V%X#````0`@8'@,```!`"%)>`P```$`(DAX#````0`C1W@,```!`"1&>`P` -M``$`)45X#````0`F1'@,```!`"=#>`P```$`*$)X#````0`I07@,```!`"I` -M>`P```$`*R9X#````0`L)7@,```!`"TD>`P```$`+B-X#````0`O(G@,```! -M`#`A>`P```$`,2!X#````0`R!G@,```!`#,%>`P```$`-`1X#````0`U`W@, -M```!`#8">`P```$`-P%X#````0`X`'@,```!`#D`>`P```$`.@!X#````0`[ -M`'@,```!`#P`>`P```$`/0!X#````0`^`'@,```!`#\`>`P```$`0'MX#``` -M`0!!>W@,```!`$)[>`P```$`0WMX#````0!$>W@,```!`$5[>`P```$`1GIX -M#````0!'>7@,```!`$AX>`P```$`27=X#````0!*=G@,```!`$MU>`P```$` -M3'1X#````0!-`P```$`3W%X#````0!0<'@,```!`%%O>`P` -M``$`4FYX#````0!3;7@,```!`%1L>`P```$`56MX#````0!6:G@,```!`%=I -M>`P```$`6&AX#````0!99W@,```!`%IF>`P```$`6V5X#````0!<9'@,```! -M`%UC>`P```$`7F)X#````0!?87@,```!`&!@>`P```$`84EX#````0!B2'@, -M```!`&-'>`P```$`9$9X#````0!E17@,```!`&9$>`P```$`9T-X#````0!H -M0G@,```!`&E!>`P```$`:D!X#````0!K)G@,```!`&PE>`P```$`;21X#``` -M`0!N(W@,```!`&\B>`P```$`<"%X#````0!Q('@,```!`'(&>`P```$``P```$`=@)X#````0!W`7@,```!`'@`>`P```$` -M>0!X#````0!Z`'@,```!`'L`>`P```$`?`!X#````0!]`'@,```!`'X`>`P` -M``$`?P!X#```'@``.'@,```>``$X>`P``!X``CAX#```'@`#.'@,```>``0X -M>`P``!X`!3AX#```'@`&.'@,```>```P``!X`"#AX#```'@`)/'@,```> -M``H^>`P``!X`"T!X#```'@`,1'@,```>``U(>`P``!X`#DQX#```'@`/4'@, -M```>`!!2>`P``!X`$59X#```'@`26G@,```>`!->>`P``!X`%&!X#```'@`5 -M8'@,```>`!9@>`P``!X`%V)X#```'@`88G@,```>`!EB>`P``!X`&F)X#``` -M'@`;8G@,```>`!QB>`P``!X`'6)X#```'@`>8G@,```>`!]B>`P```$``'MX -M#````0`!>W@,```!``)[>`P```$``WMX#````0`$>W@,```!``5[>`P```$` -M!GIX#````0`'>7@,```!``AX>`P```$`"7=X#````0`*=G@,```!``MU>`P` -M``$`#'1X#````0`-`P```$`#W%X#````0`0<'@,```!`!%O -M>`P```$`$FYX#````0`3;7@,```!`!1L>`P```$`%6MX#````0`6:G@,```! -M`!=I>`P```$`&&AX#````0`99W@,```!`!IF>`P```$`&V5X#````0`<9'@, -M```!`!UC>`P```$`'F)X#````0`?87@,```!`"!@>`P```$`(4EX#````0`B -M2'@,```!`"-'>`P```$`)$9X#````0`E17@,```!`"9$>`P```$`)T-X#``` -M`0`H0G@,```!`"E!>`P```$`*D!X#````0`K)G@,```!`"PE>`P```$`+21X -M#````0`N(W@,```!`"\B>`P```$`,"%X#````0`Q('@,```!`#(&>`P```$` -M,P5X#````0`T!'@,```!`#4#>`P```$`-@)X#````0`W`7@,```!`#@`>`P` -M``$`.0!X#````0`Z`'@,```!`#L`>`P```$`/`!X#````0`]`'@,```!`#X` -M>`P```$`/P!X#````0!`>W@,```!`$%[>`P```$`0GMX#````0!#>W@,```! -M`$1[>`P```$`17MX#````0!&>G@,```!`$=Y>`P```$`2'AX#````0!)=W@, -M```!`$IV>`P```$`2W5X#````0!,='@,```!`$US>`P```$`3G)X#````0!/ -M<7@,```!`%!P>`P```$`46]X#````0!2;G@,```!`%-M>`P```$`5&QX#``` -M`0!5:W@,```!`%9J>`P```$`5VEX#````0!8:'@,```!`%EG>`P```$`6F9X -M#````0!;97@,```!`%QD>`P```$`76-X#````0!>8G@,```!`%]A>`P```$` -M8&!X#````0!A27@,```!`&)(>`P```$`8T=X#````0!D1G@,```!`&5%>`P` -M``$`9D1X#````0!G0W@,```!`&A">`P```$`:4%X#````0!J0'@,```!`&LF -M>`P```$`;"5X#````0!M)'@,```!`&XC>`P```$`;R)X#````0!P(7@,```! -M`'$@>`P```$`<@9X#````0!S!7@,```!`'0$>`P```$`=0-X#````0!V`G@, -M```!`'`P```$`>`!X#````0!Y`'@,```!`'H`>`P```$`>P!X#````0!\ -M`'@,```!`'T`>`P```$`?@!X#````0!_`'@,```>```X>`P``!X``3AX#``` -M'@`".'@,```>``,X>`P``!X`!#AX#```'@`%.'@,```>``8X>`P``!X`!SAX -M#```'@`(.'@,```>``D\>`P``!X`"CYX#```'@`+0'@,```>``Q$>`P``!X` -M#4AX#```'@`.3'@,```>``]0>`P``!X`$%)X#```'@`15G@,```>`!):>`P` -M`!X`$UYX#```'@`48'@,```>`!5@>`P``!X`%F!X#```'@`78G@,```>`!AB -M>`P``!X`&6)X#```'@`:8G@,```>`!MB>`P``!X`'&)X#```'@`=8G@,```> -M`!YB>`P``!X`'V)X#````0``>W@,```!``%[>`P```$``GMX#````0`#>W@, -M```!``1[>`P```$`!7MX#````0`&>W@,```!``=[>`P```$`"'MX#````0`) -M>G@,```!``IY>`P```$`"WAX#````0`,=W@,```!``UV>`P```$`#G5X#``` -M`0`/='@,```!`!!S>`P```$`$7)X#````0`2<7@,```!`!-P>`P```$`%&]X -M#````0`5;G@,```!`!9M>`P```$`%VQX#````0`8:W@,```!`!EJ>`P```$` -M&FEX#````0`;:'@,```!`!QG>`P```$`'69X#````0`>97@,```!`!]D>`P` -M``$`(&-X#````0`A8G@,```!`")A>`P```$`(V!X#````0`D1G@,```!`"5% -M>`P```$`)D1X#````0`G0W@,```!`"A">`P```$`*4%X#````0`J0'@,```! -M`"LF>`P```$`+"5X#````0`M)'@,```!`"XC>`P```$`+R)X#````0`P(7@, -M```!`#$@>`P```$`,@9X#````0`S!7@,```!`#0$>`P```$`-0-X#````0`V -M`G@,```!`#`P```$`.`!X#````0`Y`'@,```!`#H`>`P```$`.P!X#``` -M`0`\`'@,```!`#T`>`P```$`/@!X#````0`_`'@,```!`$![>`P```$`07MX -M#````0!">W@,```!`$-[>`P```$`1'MX#````0!%>W@,```!`$9[>`P```$` -M1WMX#````0!(>W@,```!`$EZ>`P```$`2GEX#````0!+>'@,```!`$QW>`P` -M``$`379X#````0!.=7@,```!`$]T>`P```$`4'-X#````0!1`P```$`4W!X#````0!4;W@,```!`%5N>`P```$`5FUX#````0!7;'@,```! -M`%AK>`P```$`66IX#````0!::7@,```!`%MH>`P```$`7&=X#````0!=9G@, -M```!`%YE>`P```$`7V1X#````0!@8W@,```!`&%B>`P```$`8F%X#````0!C -M8'@,```!`&1&>`P```$`945X#````0!F1'@,```!`&=#>`P```$`:$)X#``` -M`0!I07@,```!`&I`>`P```$`:R9X#````0!L)7@,```!`&TD>`P```$`;B-X -M#````0!O(G@,```!`'`A>`P```$`<2!X#````0!R!G@,```!`',%>`P```$` -M=`1X#````0!U`W@,```!`'8">`P```$`=P%X#````0!X`'@,```!`'D`>`P` -M``$`>@!X#````0![`'@,```!`'P`>`P```$`?0!X#````0!^`'@,```!`'\` -M>`P``!X``#AX#```'@`!.'@,```>``(X>`P``!X``SAX#```'@`$.'@,```> -M``4X>`P``!X`!CAX#```'@`'.'@,```>``@X>`P``!X`"3QX#```'@`*/G@, -M```>``M`>`P``!X`#$1X#```'@`-2'@,```>``Y,>`P``!X`#U!X#```'@`0 -M4G@,```>`!%6>`P``!X`$EIX#```'@`37G@,```>`!1@>`P``!X`%6!X#``` -M'@`68'@,```>`!=B>`P``!X`&&)X#```'@`98G@,```>`!IB>`P``!X`&V)X -M#```'@`<8G@,```>`!UB>`P``!X`'F)X#```'@`?8@(````!````"P````(` -M```!````*PD``"H)```!`````0````$````!````!P````<````H`````0`` -M``$````!`````0````4````3`````@````,````!`````0````(````"```` -M`@```'`P``#8,0````````````````````````````````````````````"0 -M3`$````````````````````````````````````````````````````````` -M`````````````````````````````````````````P#:"Y&!```````````` -M```````#`-H+=H$```````````````````,`V@MP@0`````````````````` -M`P#:"WZ!```````````````````#`-H+>H$```````````````````,`V@M[ -M@0```````````````````P#:"WV!```````````````````#`-H+5(<````` -M``````````````,`V@M_@0```````````````````P#:"XJ!```````````` -M```````#`-H+=X$```````````````````,`V@MX@0`````````````````` -M`P#:"WR!```````````````````#`-H+AH$```````````````````,`&2`7 -M[0```````````````````P#V#5(````````````````````#`))S$7@````` -M``````````````,`N`>)@0```````````````````P"P#G&0```````````` -M```````#`/@&,^````````````````````,`/!`I%@`````````````````` -M`P`!(`@S```````````````````#``T%`A$```````````````````,`&2`J -MJP```````````````````P#T((MD```````````````````#`%5(D``````` -M``````````````,`TQ-7,P```````````````````P#V#5P````````````` -M```````#`-H+B%````````````````````,`5DB1```````````````````` -M`P!&F$&0```````````````````#`$8(09````````````````````,`&2`" -M20```````````````````P`9("ZK```````````````````#`-,363,````` -M``````````````,`TQ-8,P```````````````````P#R!/>O```````````` -M```````#`/($^:\```````````````````,`\@3ZKP`````````````````` -M`P`9(`$2```````````````````#`/($^*\```````````````````,`\@3[ -MKP```````````````````P#R!/RO```````````````````#`!D@`1(````` -M``````````````,``2`',P```````````````````P`!(`HS```````````` -M```````#``$@"3,```````````````````,`A@4?-``````````````````` -M`P"2`&#L -M4P#`V*<`@(U;`$!4B0``&[<`@*@2`0`V;@$`424"`&S<`H#Y-P/T2```)$D` -M`&1*``!L2@``>$H``(!*``",2@``G$H``*1*```X`!P`%0```,!1`0"@4@$` -MN!\````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M````````````````````````````````````````1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H -M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H -M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H -M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H -M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H -M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H -M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H -M1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N -M,```1T-#.B`H1TY5*2`T+C0N,```1T-#.B`H1TY5*2`T+C0N,`!!*@```&%E -M86)I``$@````!36UT86(` -M+G-T6UT86(`+D%232YE>'1A8@`N&ED>``N -M````"0``````````````V(0&`$`````5````"0````0````(````;`````$` -M```"`````````#`9!``8```````````````$`````````'L````!``!P@@`` -M``````!(&00`&!T```$`````````!`````````!W````"0`````````````` -M&(4&`%`>```5````#`````0````(````B@````$````#`````````&`V!``0 -M4P$````````````$`````````(8````)``````````````!HHP8`.`4``!4` -M```.````!`````@```"0````"`````,`````````<(D%`(@\```````````` -M``@`````````E0````$``````````````'")!0"L`@`````````````!```` -M`````)X````#``!P```````````,!0"^```````````````!``````````$````"```````` -M``````"@J`8`,,```!8````["```!````!`````)`````P`````````````` -MT&@'``EM``````````````$`````````R````!S&"0#L````'/8*`/P````< -M=@D`%`$``!R%"``@`0``'(4(`#0!``````<2PL` -M4!X``!SJ"P!D'@``'+`(`&P>``````< -MA0@`J!X``!R:"0"\'@``'-$(`-0>``` -M```$<``"RA``"`1P``'*8(`)1'```KH@``F$<``"RB -M``"@1P``'*8(``A(```KI```#$@``"RD```42```'*8(`%Q(```KI@``8$@` -M`"RF``!D2```'*8(`'1(```KIP``>$@``"RG``"$2```'*8(`,A(```KJ0`` -MS$@``"RI``#42```'*8(`!1)```KJP``&$D``"RK```@20``'*8(`$A)```K -MK0``3$D``"RM``!420``'*8(`'A)```KKP``?$D``"RO``"$20``'*8(`*A) -M```KL0``K$D``"RQ``"T20``'*8(``A*```KLP``#$H``"RS```42@``'*8( -M`#Q*```KM0``0$H``"RU``!(2@``'*8(`&1*```KMP``:$H``"RW``!L2@`` -M*[@``'!*```LN```=$H``!RF"`#$2@``'*8(`,Q*```"@"(5P``'+$(`+Q7```%L``!RQ"`"06P``'+$(`*A;`````````<4`H`9%X``!QV"0"(7@``',8)`,!>```< -M>@@`W%X``!Q0"@`$7P``'($)`"!?```<=`H`9%\``!SM"P"`7P``''8)`)Q? -M```K_```H%\``"S\``"L7P``'(,*`-1?```<+0H`#&```!S?"``<8```'%0( -M`#!@```K`0L`-&```"P!"P!,8```'"8*`(!@```&P``"P7`0"`;```'(,*`*1L -M```<@PH`L&P``"L8`0"T;```+!@!`+AL```<@PH`Z&P``!R#"@`8;0```@,` -M`#!M```&T``"L;`0!\;0``+!L!`(1M``````'(`*`&AX``````''8)``!Y```<)`D`2'D``!R#"@!H>0``'%@(`'!Y```"`P`` -M`'H``!S8"@`X>@``'"D+`(1Z```<)`D`W'H``!S8"@``>P``*U$!``1[```L -M40$`1'L``!S8"@"`>P``'-@(`)Q[```(D```("``"P -MB0``'/8*`,B)```)<``!R#"@"`EP``'$X* -M`)"7```<>@@`F)<``!R!"0"@EP``'%`*`.B7```K@0$`[)<``"R!`0#PEP`` -M*X(!`/27```L@@$`!)@``"N!`0`(F```+($!``R8```K@@$`$)@``"R"`0`< -MF```'(,*`"B8```<'@D`=)@``!R#"@"`F````@(``(28```"`P``B)@```(# -M``",F````@,``)B8``````<-`H` -M2)X``!S&"0"$G@``'#0*`)">``````< -MQ@D`\)X``!PM"@`DGP``'!0*`%B?```<=@D`:)\``!R%"0"4GP``')L)`.B? -M```@L`J*(``!S:"`#(H@``',T(`.RB```KN0L`\*(` -M`"RY"P``HP``'(0(``BC```+D``!PD"0"0@`!+H``!P>"P`D -MN@``'*\(`"RZ```<2@@`<+H``!SF"0!XN@``'"P+`("Z```<>0@`O+H``!SO -M"0#8N@``'#L)`/BZ```<&`H`$+L``!P8"@`DNP``'(4(`#"[```+X``!QW"@"$ -MO@```@,``(B^```"`@``J+X``!Q["@"XO@``''`)`,"^```,<``!S8"`"HQP``'/4)`+3'```"`P``N,<```("``#DQP``')4(`/C' -M```,\``!Q>"0"-```!SU"0#( -MT```'`,)`!#1```<`PD`6-$``!P#"0#0T0``'`,)`.31```<`PD`^-$``!SA -M"0`(T@``'.$)`"32```<-`L`*-(``!S&"0!,T@``'(,(`%S2```<=@D`G-(` -M`"L``@"@T@``+``"`!33```<@PH`&-,``!S&"0`PTP``'(,(`$#3```<=@D` -M3-,``!R;"0!TTP``*P$"`'C3```L`0(`C-,``!QH"P#\TP``'(,*``C4```< -M9`@`%-0``!R;"0!`U```'%D(`%#4```<"`D`;-0``!R#"@"(U```'"0)`)34 -M```<9`@`J-0``!ST"`"\U````@,``,#4```"`@``W-0``!Q9"`#LU```'`@) -M``C5```<@PH`)-4``!PD"0`PU0``'&0(`$35```<]`@`6-4```(#``!-H``"N^`0!\V@`` -M++X!`(3:```<@PH`D-H``!R5"`"DV@``'+8*`-C:``````< -M@`H`7-X``!RQ"`"`W@``'+$(`+#>```-\``!S8"@"PH`^`$!`!QP"0```@$`'*@(`!`"`0``,!`!P# -M"P"(`P$`'+$(`*P#`0`"0`` -M&`$`*YP)``08`0`LG`D`H!@!`!PA"@"L&`$``@(``+`8`0`""0``T!@!`!S- -M"``L&0$`'-$(`'`9`0``0`"4!``(!``!\ -M)0$``@$``(`E`0`"`0``A"4!``(!``"()0$``@$``(PE`0`"`0``,"8!`!S` -M"@!\)@$`',`*`)PG`0`#4!`!R# -M"@"4-0$``@,``.`U`0`<@PH`!#8!`!Q["P`T-@$`',(*`$0V`0`<@PH`B#8! -M`!Q["P"4-@$``@,``)@V`0`"`P``R#8!`!Q4"@#H-@$`'+<*`#`W`0`#`@"4.0$`+-X"`*0Y`0`<@PH`Y#D!`!QT"0#\.0$` -M'.P+``PZ`0`KW@(`$#H!`"S>`@`4.@$`*]T"`!@Z`0`LW0(`)#H!`!R#"@"P -M.@$`'(,*`,0Z`0`"`P``R#H!``("``#,.@$``@,``-`Z`0`"`P``V#H!`"OF -M`@#<.@$`+.8"`/0Z`0`KY@(`^#H!`"SF`@`@.P$`*^8"`"0[`0`LY@(`.#L! -M`"OF`@`\.P$`+.8"`'0[`0`KY@(`>#L!`"SF`@"0.P$`*^8"`)0[`0`LY@(` -MO#L!`"OF`@#`.P$`+.8"`-0[`0`KY@(`V#L!`"SF`@`4/`$`',8)`#0\`0`< -M+0H`G#P!`!QV"0"L/`$`'%@)`,0\`0`$8!``(#``"@1@$`'/$(`&!'`0`<=@D`;$`0`L`0L`1%X!`!PF"@!@7@$`''8)`(!>`0`<=@D`B%X!`!RW"P"H -M7@$`''8)``Q?`0`&`$`'"T*`#QX`0`<+0H`:'@!`!S&"0"P>`$`'/8* -M`-AX`0`<=@D`['@!`!R,"0`$>0$`',8)`#AY`0`0$` -M''8)`'QY`0`0$`'"T*``AZ`0`@$`'(`+`+1Z`0`<6@D`R'H!`!R2"`#L>@$`'+$(``![`0`P$`'+$(`%A[`0`P$`'+$(`)1[`0`'P!`!PD"0!`?0$``@$``$1]`0`"`0`` -M2'T!``(!``!,?0$``@$``(Q]`0`"`0``D'T!``(!``"4?0$``@$``)A]`0`" -M`0``Y'T!``(!``#H?0$``@$``.Q]`0`"`0``\'T!``(!``#T?0$``@$``)!^ -M`0`@L` -M%)`!`!QZ"P`)`!`!S;"0"8D`$`',T(`*"0`0`P,`!)P!`"Q[`P`,G`$`*WP#`!"<`0`L?`,`&)P!`"M]`P``0`<+PH`*)X!`!PO"@!(G@$`'!()`'">`0`<$@D`G)X!`!Q- -M"P#,G@$`'%$+`.B>`0`<+PH`^)X!`!PO"@`$GP$`'!()`!R?`0`<+PH`*)\! -M`!P2"0!`GP$`'"\*`$R?`0`<$@D`:)\!`!P2"0"PGP$`'%$+`-"?`0`<+PH` -MW)\!`!P2"0#TGP$`'"\*``"@`0`<$@D`$*`!`!PO"@`*P!`!P'"0"`K`$`'&P(`*BL`0`K/`L`K*P!`"P\ -M"P`(K0$`'$T+`#"M`0`<;`@`8*T!`!Q-"P"`K0$`*SP+`(2M`0`L/`L`Z*T! -M`!S-"`#\K0$`'!8*`""N`0`<5PD`3*X!`!R/"P",K@$`'+$)`!2O`0`<40L` -M0*\!`!RZ"0!4KP$`'$T+`)BO`0`, -M`0`K\0,`&-X!`"SQ`P`PW@$`')<*`$#>`0`<+0L`6-X!`!R7"@!DW@$`'(,* -M`'C>`0`<$@D`C-X!`!PO"@"@W@$`'"\*`+#>`0`<@PH`S-X!`"OM"@#0W@$` -M+.T*`.S>`0`<>@L`]-X!``(#``#XW@$``@,```SA`0`K_@,`$.$!`"S^`P!0 -MX0$`*_X#`%3A`0`L_@,`B.$!`!RJ"`"HX0$`'*H(`,3A`0`.8!`!SR"@",Y@$`'/(*`*#F`0`<\@H`S.8!`!PO"@#HY@$`'$$+``SG -M`0`/4!`!QN"P", -M]0$`'&X+`,#U`0`<;@L`U/4!`!QN"P#L]0$`'&X+`/SU`0`<@PH`%/8!`!QN -M"P`L]@$`'&X+`$3V`0`<;@L`9/8!`"LH!`!H]@$`+"@$`&SV`0`K*00`00`C"4"`!S& -M"0`4)@(`'`@)`"PF`@`<"`D`F"8"`!R;"0#0)@(`''8)```G`@`00`L#4"`"QY!`#`-0(` -M'/X(`#0V`@`00`6#P"`"QY!`#(/`(`'&X+`-P\`@`<;@L`]#P" -M`!QN"P`(/0(`'&X+`!P]`@`<;@L`,#T"`!QN"P!$/0(`'&X+`%P]`@`KD`0` -M8#T"`"R0!`!T/0(`'"\*`(0]`@`<+PH`F#T"`!PO"@"H/0(`'"\*`+P]`@`< -M+PH`S#T"`!PO"@#00`##\"`!QN"P`@/P(` -M'&X+`#@_`@`<;@L`3#\"`!QN"P!@/P(`'&X+`'0_`@`<;@L`B#\"`!QN"P"@ -M/P(`'*()`.P_`@`<;@L`)$`"`!QN"P!(0`(``@(``(Q``@`$$"`!SR"@#$00(`'&X+`-1!`@`<\@H`Z$$" -M`!SR"@`P0@(`'&X+`$1"`@`<;@L`6$("`!QN"P!L0@(`'&X+`-1"`@`<4@@` -M2$0"`!P2"0`T1P(`'&X+`$Q'`@`<;@L`V$<"`!S2"@",2`(`'*<*`-!(`@`< -M+PH`($D"`!R0"0#(20(`'!()`-A)`@`00`J%("`"QY -M!`"\4@(`*WD$`,!2`@`L>00`W%("`!Q!"P`(4P(`'$$+`'13`@`<$@D`H%," -M`!P2"0#H4P(`'!()``!4`@`<+PH`$%0"`!PO"@`<5`(`'!()`"Q4`@`<+PH` -M.%0"`!P2"0!(5`(`'(,*`%A4`@`"`@``7%0"``(*``!@5`(``@,``&14`@`" -M`P``:%0"``(#``!L5`(``@,``'!4`@`"`P``=%0"``(#``!X5`(``@,``'Q4 -M`@`"`P``@%0"``()``"$5`(``@,``(A4`@`"`P``C%0"``(#``"05`(``@,` -M`)14`@`"`P``F%0"``(#``"<5`(``@,``*!4`@`"`P``I%0"``(#``"H5`(` -M`@,``*Q4`@`"`P``L%0"``(#``"T5`(``@,``+A4`@`"`P``O%0"``(#``#` -M5`(``@,``,14`@`"`P``R%0"``(#``#,5`(``@,``-!4`@`"`P``U%0"``(# -M``#85`(``@,``-Q4`@`"`P``X%0"``(#``#D5`(``@,``.A4`@`"`P``[%0" -M``(#```$5@(``@$```A6`@`"`0``#%8"``(!```05@(``@$``(Q6`@`"`0`` -MD%8"``(!``"45@(``@$``)A6`@`"`0``)%H"`!S&"@!86@(`')L(`,!:`@`< -MQ@H`2%P"`!S&"@"$7`(`'+$(`)A<`@``@``@``@`<60@`W%X"`!RQ"`#P7@(`'+$(`!A?`@`&P"``(!``!\;`(``@$` -M`(!L`@`"`0``A&P"``(!``"(;`(``@$``(QL`@`"`0``Y&P"`!SY"0#P;`(` -M'(@(`#1M`@`<@PH`C&T"`!R#"@"<;0(`'!0*`-!M`@`<>`L`V&T"``(#``#< -M;0(``@,``#AN`@`<@PH`6&X"`!R#"@!L;@(`'"X*`(1N`@`&\"`"SJ!`"(;P(`*^L$`(QO`@`LZP0`E&\"`!R#"@#,;P(`'+$(`-1O`@`< -MZ`@`[&\"``(#``#P;P(``@(``/1O`@`"`P``J'$"`!RP"@#`<0(`'+$(`%!R -M`@``(`'(,*`%QX`@`"`#,>`(`',@)`-1X`@`< -MQ`@`['@"``(#``"0>0(``@$``)1Y`@`"`0``F'D"``(!``"<>0(``@$``*!Y -M`@`"`0``I'D"``(!``"H>0(``@$``*QY`@`"`0``0'L"`!P8"@!8>P(`'(,* -M`%Q[`@`KC0L`9'L"`"R-"P!L>P(`*P$*`'1[`@`L`0H`?'L"`"N>"0"$>P(` -M+)X)`(Q[`@`K"`L`E'L"`"P("P"<>P(`*[X)`*1[`@`LO@D`K'L"`"N&"@"T -M>P(`+(8*`+Q[`@`KX`D`Q'L"`"S@"0#,>P(`*^X+`-1[`@`L[@L`W'L"`"OB -M"P#D>P(`+.(+`.Q[`@`K&@H`]'L"`"P:"@#\>P(`*P8%``1\`@`L!@4`#'P" -M`"LO"P`4?`(`+"\+`!Q\`@`K"P4`)'P"`"P+!0`L?`(`*R`)`#1\`@`L(`D` -M/'P"`"ML"0!$?`(`+&P)`$Q\`@`K:P@`5'P"`"QK"`!)@"`!PJ"0"@F`(`'&8* -M`+B8`@`<$@D`R)@"`!PO"@#8F`(`'!()`.B8`@`<+PH`!)D"`!R7"@`4F0(` -M'$$+`"R9`@`<$@D`/)D"`!PO"@!,F0(`'!()`%R9`@`<+PH`A)D"`!R7"@"4 -MF0(`'$$+`*29`@``@`<+PH`Q)X"`!PO -M"@#LG@(`'-(*`/B>`@``@`K -M`0L`/-X"`"P!"P!,W@(`'"8*`(C>`@`<)@H`D-X"``(!"P#`W@(`'+<+`.C> -M`@`-\"``(!``"@ -MWP(`'+<+`-C?`@`<)@H`,.`"`!RW"P!8X`(`'+<+`+#@`@`<)@H`V.`"`!PF -M"@`,X0(`'+<+`$3A`@`<)@H`G.$"`!RW"P#\X0(`'"8*`&CB`@`0L`\/0"`!PD"0`$]0(`''D+`"#U -M`@`"@#H^@(`')X*`!3[`@`<)`D`+/L"`!P-"@!(^P(` -M')X*`&3[`@``@#`"OW!0!\"`,`+/<%`(`(`P`K^`4` -MA`@#`"SX!0"("`,`'(,*`-`(`P``D#`!RS"0"4"0,`'+<+`)P)`P`!0#`"P.!@"$ -M%`,`'&0)`)04`P`K&08`F!0#`"P9!@"<%`,`'(,*`*04`P`KS0D`J!0#`"S- -M"0"T%`,`*P\&`+@4`P`L#P8`Q!0#`!QD"0#4%`,`*QD&`-@4`P`L&08`W!0# -M`!R#"@#D%`,`*RH*`.@4`P`L*@H`]!0#`"L0!@#X%`,`+!`&``05`P`<9`D` -M%!4#`"L9!@`8%0,`+!D&`!P5`P`<@PH`)!4#`"L^"P`H%0,`+#X+`#05`P`K -M$08`.!4#`"P1!@!$%0,`'&0)`%05`P`K&08`6!4#`"P9!@!<%0,`'(,*`&05 -M`P`KR0@`:!4#`"S)"`!T%0,`*Q(&`'@5`P`L$@8`A!4#`!QD"0"4%0,`*QD& -M`)@5`P`L&08`G!4#`!R#"@"D%0,`*PX)`*@5`P`L#@D`M!4#`"L3!@"X%0,` -M+!,&`,05`P`<9`D`U!4#`"L9!@#8%0,`+!D&`-P5`P`<@PH`Y!4#`"N+"`#H -M%0,`+(L(`/05`P`KH0@`^!4#`"RA"``$%@,`*QD&``@6`P`L&08`#!8#`!R# -M"@`4%@,``@H``!@6`P`"`P``'!8#``(*```@%@,``@@*`"06`P`"`P``@!8# -M`!P]"@"X%@,`'(,*`,`6`P`<,`H`T!8#`!S!"`#X%@,`'!H+`!07`P`K`0L` -M&!<#`"P!"P`L%P,`'"8*`%P7`P`K`0L`8!<#`"P!"P"0%P,`'"8*`/`7`P`< -MG@@`#!@#`!Q."P`X&`,``@,``'@8`P``P`<2PL`-!X#`!S#"0`\'@,`'&P+`)0> -M`P``P`"`P``Y!X#``("``#X'@,`'&D( -M`#P?`P`"D#``(#``"<*0,`*]<&`*`I`P`LUP8`I"D#`!R# -M"@#0*0,`*]@&`-0I`P`LV`8`V"D#`"O9!@#<*0,`+-D&`.`I`P`KV@8`Y"D# -M`"S:!@#P*0,`'(,*`%0J`P`<@PH`8"H#`!R#"@!X*@,`'(,*`+0J`P`"`P`` -MZ"H#`"O>!@#L*@,`+-X&`/0J`P`<#@L`0"L#`!S-"`!0*P,`',T(`(@K`P`< -MXPL`K"L#`!R\"@#8*P,`'(,*``@L`P`<*`L`."P#`!SU"@!,+`,`'(,*`&`L -M`P`<0`H`<"P#`!R#"@"`+`,`',T(`(@L`P`<@PH`F"P#`!P."P"T+`,`'(,* -M`,@L`P`<@PH`W"P#`!P."P#T+`,`'(,*``@M`P`<#@L`'"T#`!R#"@`L+0,` -M'`X+`$@M`P`<@PH`7"T#`!P."P!T+0,`'(,*`(0M`P`<#@L`F"T#`!R#"@"@ -M+0,`'+4+`+@M`P`<]0H`U"T#`!Q?"P#H+0,`'(,*`/@M`P`<7PL`%"X#`!R# -M"@`X+@,`'%$+`%0N`P`<@PH`<"X#`!Q`"@"`+@,`'(,*`(PN`P`<@PH`G"X# -M`!S-"`#$+@,`'(,*`-@N`P`<#@L`X"X#`!R#"@#P+@,`'`X+``@O`P`#T#`"L'!P!\/0,`+`<'`(`]`P`<@PH` -MC#T#`"L%!P"0/0,`+`4'`)0]`P`KV@8`F#T#`"S:!@"!P"L50,`'+$(`/!5 -M`P`PD`&%T#`!S-"``P70,`',T(`$1=`P`"`0``2%T#``(!``!, -M70,``@$``%!=`P`"`0``5%T#`"MK!P!870,`+&L'`&!=`P`K<0<`9%T#`"QQ -M!P!L70,`*W('`'!=`P`L<@<`>%T#`"MS!P!\70,`+','`(Q=`P`<6@H`U%T# -M`!RQ"`#T70,`'+$(`!1>`P``P`"`0`` -M7%X#``(!``!@7@,``@$``&1>`P`"`0``:%X#``(!``!L7@,``@$``'!>`P`" -M`0``=%X#``(!``!X7@,``@$```Q?`P`<>@@`&%\#`!R#"@`@7P,`'($)`"A? -M`P`<4`H`3%\#``(#``!07P,``@(``,1?`P`<&`H`X%\#`!RQ"``$8`,`''T* -M`#A@`P`<;P@`<&`#``(!``!T8`,``@$``'A@`P`"`0``?&`#``(!``"`8`,` -M`@$``(1@`P`"`0``B&`#``(!``",8`,``@$``)!@`P`"`0``E&`#``(!``"8 -M8`,``@$``)Q@`P`"`0``H&`#``(!``"D8`,``@$``*A@`P`"`0``K&`#``(! -M``!,80,``@$``%!A`P`"`0``5&$#``(!``!880,``@$``%QA`P`"`0``8&$# -M``(!``!D80,``@$``&AA`P`"`0``;&$#``(!``!P80,``@$``'1A`P`"`0`` -M>&$#``(!``!\80,``@$``(!A`P`"`0``A&$#``(!``"(80,``@$``"1B`P`K -MSP8`*&(#`"S/!@!<8@,`'`@)`&QB`P`<@PH`F&(#`!RQ"`"L8@,`'(,*`/1B -M`P`KSP8`^&(#`"S/!@`88P,`'(4(`"!C`P`"`P``)&,#``(#``",8P,`'-@* -M`+1C`P`!P#0<`,`+)X'`.AP`P`<#@L`$'$#`!S- -M"``H<0,`'+4+`&1Q`P`<_@@`='$#`!S^"`"(<0,`'/X(`)QQ`P`!P!H<@,`+)X'`(!R`P`<#@L`J'(#`!S-"`#`<@,`'+4+`/QR`P`< -M_@@`#',#`!S^"``@`,`'!@*`"AX`P``,`*\\&`&AX`P`LSP8`@'@#`!RQ"`"D>`,`'-4*`+1X`P``,`*\\&`.!X`P`LSP8`"'D#`"O/!@`,>0,`+,\&`!QY`P`K -ML`<`('D#`"RP!P`H>0,`'(,*`%!Y`P`0,`'(,*`*!Y -M`P`0,``@,``-AY`P`"`@``''H#`!Q["0!D>@,`'.,+ -M`(!Z`P`@,`'(,*`+QZ`P`"`0``P'H#``(!``#$>@,` -M`@$``,AZ`P`"`0``S'H#``(!``#0>@,``@$``-1Z`P`"`0``V'H#``(!``#< -M>@,``@$``.!Z`P`"`0``Y'H#``(!``#H>@,``@$``.QZ`P`"`0``\'H#``(! -M``#T>@,``@$``/AZ`P`"`0``_'H#``(!````>P,``@$```1[`P`"`0``%'L# -M`!R#"@`<>P,`'`,+`"1[`P`<1PD`9'L#`!R#"@"<>P,`'"0)`,1[`P`"P`@L`V)P#``("``#`P`"`P``!)X#``("```( -MG@,``@,``!R>`P`<,`D`3)X#``(!``!0G@,``@$``%2>`P`"`0``6)X#``(! -M``"(G@,`'!`+`)R>`P`<@@D`$)\#`!RZ"``DGP,`'&4+`'"?`P`<_0D`A)\# -M`!S&"0"DGP,`'#P(`-R?`P`<>`L`^)\#`!QV"0!(H`,`')X(`%"@`P`<_0D` -M;*`#`!R,"0"PD` -MX*0#`!S-"`#HI`,`*R4(`.RD`P`L)0@`]*0#`!S^"``@I0,`*R8(`"2E`P`L -M)@@`-*4#`!P."P!4I0,`*R<(`%BE`P`L)P@`8*4#`!S^"`!TI0,`',T(`*2E -M`P`<2@H`N*4#`!R%"`#,I0,`'*H+`-BE`P`<3@L`X*4#`!PD"@#PI0,`'%P( -M`/RE`P`<;`L`#*8#`!R+"P`8I@,`'!\*`"BF`P`<;@@`+*8#`"L!"P`PI@,` -M+`$+`$2F`P`<)@H`4*8#`!QB"0!!(```+V"P"`$@```G@)`(@2```"OP@`D!(```+O"@"8$@```BP*`,`2 -M```"_@L`X!(```+R"`"$&@```AL&`(@:```"\P4`C!H```)C"`"@&@```@`& -M`*@:```"``P`O!H```+Q!0```````@(```@````"]@@`#`````*-"0`0```` -M`FL+`!0````"`@``'`````(?"P`@`````L$+`"0````"PP@`*`````("```P -M`````A\+`#0````"P0L`.`````)1"@`\`````@(``$0````"'PL`2`````+! -M"P!,`````D8(`%`````"`@``6`````(?"P!<`````L$+`&`````"K0D`9``` -M``("``!L`````A\+`'`````"P0L`=`````)""0!X`````@(``(`````"'PL` -MA`````+!"P"(`````F$*`(P````"`@``E`````(?"P"8`````L$+`)P````" -MY`L`H`````("``"H`````A\+`*P````"P0L`L`````+<"`"T`````@(``+P` -M```"'PL`P`````+!"P#$`````G\)`,@````"`@``T`````(?"P#4`````L$+ -M`-@````"\0H`W`````("``#D`````A\+`.@````"P0L`[`````*N"0#P```` -M`@(``/@````"'PL`_`````+!"P```0```J0*``0!```"`@``#`$```(?"P`0 -M`0```L$+`!0!```"&0L`&`$```("```@`0```A\+`"0!```"P0L`*`$```*; -M"@`L`0```@(``#0!```"'PL`.`$```+!"P`\`0```DP*`$`!```"`@``2`$` -M``(?"P!,`0```L$+`%`!```"X@H`5`$```("``!<`0```A\+`&`!```"P0L` -M9`$```+Y"@!H`0```@(``'`!```"'PL`=`$```+!"P!X`0```C8)`'P!```" -M`@``A`$```(?"P"(`0```L$+`(P!```"Q0H`D`$```("``"8`0```A\+`)P! -M```"P0L`H`$```)C"P"D`0```@(``*P!```"'PL`L`$```+!"P"T`0```EX* -M`+@!```"`@``P`$```(?"P#$`0```L$+`,@!```"2`H`S`$```("``#4`0`` -M`BP)`-@!```"R`H`W`$```**"P#@`0```@(``.@!```"+`D`[`$```+("@#P -M`0```L\*`/0!```"`@``_`$```(?"P```@```L$+``0"```"/0D```````(" -M"0`$`````@4```@````"M@L`#`````(%```0`````IH(`!0````"!0``&``` -M``+""0`<`````@4````````J`0````````"T"``(````*@$``!`````J`0`` -M&````"H!```@````*@$``"@````J`0``,````"H!```X````*@$``$`````J -M`0``2````"H!``!0````*@$``%@````J`0``8````"H!``!H````*@$``'`` -M```J`0``>````"H!``"`````*@$``(@````J`0``D````"H!``"8````*@$` -M`*`````J`0``J````"H!``"P````*@$``+@````J`0``P````"H!``#(```` -M*@$``-`````J`0``V````"H!``#@````*@$``.@````J`0``\````"H!``#X -M````*@$````!```J`0``"`$``"H!```0`0``*@$``!@!```J`0``(`$``"H! -M```H`0``*@$``#`!```J`0``.`$``"H!``!``0``*@$``$@!```J`0``4`$` -M`"H!``!8`0``*@$``&`!```J`0``:`$``"H!``!P`0``*@$``'@!```J`0`` -M@`$``"H!``"(`0``*@$``)`!```J`0``F`$``"H!``"@`0``*@$``*@!```J -M`0``L`$``"H!``"X`0``*@$``+@!````M`@`P`$``"H!``#(`0``*@$``-`! -M```J`0``V`$``"H!``#@`0``*@$``.@!```J`0``\`$``"H!``#X`0``*@$` -M```"```J`0``"`(``"H!```0`@``*@$``!@"```J`0``(`(``"H!```H`@`` -M*@$``#`"```J`0``.`(``"H!``!``@``*@$``$@"```J`0``4`(``"H!``!8 -M`@``*@$``&`"```J`0``:`(``"H!``!P`@``*@$``'@"```J`0``@`(``"H! -M``"(`@``*@$``)`"```J`0``F`(``"H!``"@`@``*@$``*@"```J`0``L`(` -M`"H!``"X`@``*@$``,`"```J`0``R`(``"H!``#(`@```+L+`,P"```J!P`` -MT`(``"H!``#8`@``*@$``-@"````M`@`X`(``"H!``#H`@``*@$``/`"```J -M`0``^`(``"H!`````P``*@$```@#```J`0``$`,``"H!```8`P``*@$``"`# -M```J`0``*`,``"H!```P`P``*@$``#@#```J`0``0`,``"H!``!(`P``*@$` -M`%`#```J`0``6`,``"H!``!@`P``*@$``&@#```J`0``:`,```"T"`!P`P`` -M*@$``'@#```J`0``@`,``"H!``"(`P``*@$``)`#```J`0``F`,``"H!``"@ -M`P``*@$``*@#```J`0``L`,``"H!``"X`P``*@$``,`#```J`0``R`,``"H! -M``#0`P``*@$``-@#```J`0``X`,``"H!``#H`P``*@$``/`#```J`0``^`,` -M`"H!````!```*@$````$````M`@`"`0``"H!```0!```*@$``!@$```J`0`` -M(`0``"H!```H!```*@$``#`$```J`0``.`0``"H!``!`!```*@$``$@$```J -M`0``4`0``"H!``!8!```*@$``&`$```J`0``8`0```"T"`!H!```*@$``'`$ -M```J`0``>`0``"H!``"`!```*@$``(@$```J`0``D`0``"H!``"8!```*@$` -M`*`$```J`0``J`0``"H!``"P!```*@$``+@$```J`0``P`0``"H!``#(!``` -M*@$``-`$```J`0``V`0``"H!``#@!```*@$``.@$```J`0``\`0``"H!``#X -M!```*@$````%```J`0``"`4``"H!```0!0``*@$``!@%```J`0``(`4``"H! -M```@!0```+0(`"@%```J`0``,`4``"H!```X!0``*@$``$`%```J`0``2`4` -M`"H!``!0!0``*@$``%@%```J`0``8`4``"H!``!H!0``*@$``'`%```J`0`` -M>`4``"H!``"`!0``*@$``(@%```J`0``D`4``"H!``"8!0``*@$``*`%```J -M`0``J`4``"H!``"P!0``*@$``+@%```J`0``P`4``"H!``#(!0``*@$``-`% -M```J`0``V`4``"H!``#@!0``*@$``.@%```J`0``\`4``"H!``#X!0``*@$` -M```&```J`0``"`8``"H!```0!@``*@$``!@&```J`0``(`8``"H!```H!@`` -M*@$``#`&```J`0``.`8``"H!``!`!@``*@$``$@&```J`0``4`8``"H!``!8 -M!@``*@$``&`&```J`0``:`8``"H!``!P!@``*@$``'@&```J`0``@`8``"H! -M``"(!@``*@$``)`&```J`0``F`8``"H!``"@!@``*@$``*@&```J`0``L`8` -M`"H!``"X!@``*@$``,`&```J`0``R`8``"H!``#0!@``*@$``-@&```J`0`` -MX`8``"H!``#H!@``*@$``/`&```J`0``^`8``"H!````!P``*@$```@'```J -M`0``$`<``"H!```0!P```+0(`!@'```J`0``(`<``"H!```H!P``*@$``#`' -M```J`0``.`<``"H!``!`!P``*@$``$@'```J`0``4`<``"H!``!8!P``*@$` -M`&`'```J`0``:`<``"H!``!P!P``*@$``'@'```J`0``@`<``"H!``"(!P`` -M*@$``)`'```J`0``F`<``"H!``"@!P``*@$``*@'```J`0``L`<``"H!``"X -M!P``*@$``,`'```J`0``R`<``"H!``#0!P``*@$``-@'```J`0``X`<``"H! -M``#H!P``*@$``/`'```J`0``^`<``"H!````"```*@$```@(```J`0``$`@` -M`"H!```8"```*@$``"`(```J`0``*`@``"H!```P"```*@$``#@(```J`0`` -M0`@``"H!``!("```*@$``%`(```J`0``6`@``"H!``!@"```*@$``&@(```J -M`0``<`@``"H!``!X"```*@$``(`(```J`0``B`@``"H!``"0"```*@$``)@( -M```J`0``H`@``"H!``"H"```*@$``+`(```J`0``N`@``"H!``#`"```*@$` -M`,@(```J`0``T`@``"H!``#8"```*@$``.`(```J`0``Z`@``"H!``#P"``` -M*@$``/@(```J`0````D``"H!```("0``*@$``!`)```J`0``&`D``"H!```@ -M"0``*@$``"@)```J`0``,`D``"H!```X"0``*@$``$`)```J`0``2`D``"H! -M``!0"0``*@$``%@)```J`0``8`D``"H!``!H"0``*@$``'`)```J`0``>`D` -M`"H!``"`"0``*@$``(@)```J`0``D`D``"H!``"8"0``*@$``*`)```J`0`` -MJ`D``"H!``"P"0``*@$``+@)```J`0``P`D``"H!``#("0``*@$``-`)```J -M`0``V`D``"H!``#@"0``*@$``.@)```J`0``\`D``"H!``#P"0```+0(`/@) -M```J`0````H``"H!```("@``*@$``!`*```J`0``&`H``"H!```@"@``*@$` -M`"@*```J`0``,`H``"H!```X"@``*@$``$`*```J`0``2`H``"H!``!0"@`` -M*@$``%@*```J`0``8`H``"H!``!H"@``*@$``'`*```J`0``>`H``"H!``"` -M"@``*@$``(@*```J`0``D`H``"H!``"8"@``*@$``*`*```J`0``J`H``"H! -M``"P"@``*@$``+@*```J`0``P`H``"H!``#("@``*@$``-`*```J`0``V`H` -M`"H!``#@"@``*@$``.@*```J`0``\`H``"H!``#X"@``*@$````+```J`0`` -M"`L``"H!```0"P``*@$``!@+```J`0``(`L``"H!```H"P``*@$``#`+```J -M`0``.`L``"H!``!`"P``*@$``$@+```J`0``4`L``"H!``!8"P``*@$``&`+ -M```J`0``:`L``"H!``!P"P``*@$``'@+```J`0``@`L``"H!``"("P``*@$` -M`)`+```J`0``F`L``"H!``"@"P``*@$``*@+```J`0``L`L``"H!``"X"P`` -M*@$``,`+```J`0``R`L``"H!``#("P```+0(`-`+```J`0``V`L``"H!``#@ -M"P``*@$``.@+```J`0``\`L``"H!``#X"P``*@$````,```J`0``"`P``"H! -M```0#```*@$``!@,```J`0``(`P``"H!```H#```*@$``#`,```J`0``.`P` -M`"H!``!`#```*@$``$@,```J`0``4`P``"H!``!8#```*@$``&`,```J`0`` -M:`P``"H!``!P#```*@$``'@,```J`0``@`P``"H!``"`#````+0(`(@,```J -M`0``D`P``"H!``"0#````+0(`)@,```J`0``H`P``"H!``"H#```*@$``+`, -M```J`0``N`P``"H!``#`#```*@$``,@,```J`0``T`P``"H!``#8#```*@$` -M`.`,```J`0``Z`P``"H!``#P#```*@$``/@,```J`0````T``"H!```(#0`` -M*@$``!`-```J`0``&`T``"H!```@#0``*@$``"`-````M`@`*`T``"H!```P -M#0``*@$``#@-```J`0``0`T``"H!``!(#0``*@$``%`-```J`0``6`T``"H! -M``!@#0``*@$``&@-```J`0``<`T``"H!``!X#0``*@$``(`-```J`0``B`T` -M`"H!``"0#0``*@$``)`-````M`@`F`T``"H!``"@#0``*@$``*@-```J`0`` -ML`T``"H!``"X#0``*@$``,`-```J`0``R`T``"H!``#0#0``*@$``-@-```J -M`0``X`T``"H!``#H#0``*@$``/`-```J`0``^`T``"H!````#@``*@$```@. -M```J`0``$`X``"H!```8#@``*@$``"`.```J`0``*`X``"H!```P#@``*@$` -M`#@.```J`0``0`X``"H!``!(#@``*@$``%`.```J`0``6`X``"H!``!@#@`` -M*@$``&@.```J`0``<`X``"H!``!X#@``*@$``(`.```J`0``B`X``"H!``"0 -M#@``*@$``)`.````M`@`F`X``"H!``"@#@``*@$``*@.```J`0``L`X``"H! -M``"X#@``*@$``,`.```J`0``R`X``"H!``#0#@``*@$``-@.```J`0``X`X` -M`"H!``#H#@``*@$``/`.```J`0``^`X``"H!````#P``*@$```@/```J`0`` -M$`\``"H!```8#P``*@$``"`/```J`0``*`\``"H!```P#P``*@$``#@/```J -M`0``0`\``"H!``!(#P``*@$``%`/```J`0``6`\``"H!``!@#P``*@$``&@/ -M```J`0``<`\``"H!``!P#P```+0(`'@/```J`0``@`\``"H!``"(#P``*@$` -M`)`/```J`0``F`\``"H!``"@#P``*@$``*@/```J`0``L`\``"H!``"X#P`` -M*@$``+@/````M`@`P`\``"H!``#(#P``*@$``-`/```J`0``V`\``"H!``#@ -M#P``*@$``.@/```J`0``\`\``"H!``#X#P``*@$````0```J`0``"!```"H! -M```0$```*@$``!@0```J`0``(!```"H!```H$```*@$``#`0```J`0``.!`` -M`"H!``!`$```*@$``$@0```J`0``4!```"H!``!8$```*@$``&`0```J`0`` -M:!```"H!``!P$```*@$``'@0```J`0``@!```"H!``"($```*@$``)`0```J -M`0``F!```"H!``"@$```*@$``*@0```J`0``L!```"H!``"X$```*@$``,`0 -M```J`0``R!```"H!``#0$```*@$``-@0```J`0``X!```"H!``#@$````+0( -M`.@0```J`0``\!```"H!``#X$```*@$````1```J`0``"!$``"H!```0$0`` -M*@$``!@1```J`0``(!$``"H!```H$0``*@$``#`1```J`0``.!$``"H!``!` -M$0``*@$``$@1```J`0``4!$``"H!``!8$0``*@$``&`1```J`0``:!$``"H! -M``!P$0``*@$``'@1```J`0``@!$``"H!``"($0``*@$``)`1```J`0``F!$` -M`"H!``"@$0``*@$``*@1```J`0``L!$``"H!``"X$0``*@$``,`1```J`0`` -MR!$``"H!``#0$0``*@$``-@1```J`0``X!$``"H!``#H$0``*@$``/`1```J -M`0``^!$``"H!````$@``*@$```@2```J`0``$!(``"H!```8$@``*@$``"`2 -M```J`0``*!(``"H!```P$@``*@$``#@2```J`0``0!(``"H!``!($@``*@$` -M`%`2```J`0``6!(``"H!``!8$@```+0(`&`2```J`0``:!(``"H!``!P$@`` -M*@$``'@2```J`0``@!(``"H!``"($@``*@$``)`2```J`0``F!(``"H!``"@ -M$@``*@$``*@2```J`0``L!(``"H!``"X$@``*@$``,`2```J`0``R!(``"H! -M``#0$@``*@$``-@2```J`0``V!(```"T"`#@$@``*@$``.@2```J`0``\!(` -M`"H!``#X$@``*@$````3```J`0``"!,``"H!```0$P``*@$``!@3```J`0`` -M(!,``"H!```H$P``*@$``#`3```J`0``.!,``"H!``!`$P``*@$``$@3```J -M`0``4!,``"H!``!8$P``*@$``&`3```J`0``:!,``"H!``!P$P``*@$``'@3 -M```J`0``>!,```"T"`"`$P``*@$``(@3```J`0``D!,``"H!``"0$P```+0( -M`)@3```J`0``H!,``"H!``"H$P``*@$``+`3```J`0``N!,``"H!``#`$P`` -M*@$``,@3```J`0``T!,``"H!``#8$P``*@$``.`3```J`0``Z!,``"H!``#P -M$P``*@$``/@3```J`0``^!,```"T"```%```*@$```@4```J`0``$!0``"H! -M```8%```*@$``"`4```J`0``*!0``"H!```P%```*@$``#@4```J`0``0!0` -M`"H!``!(%```*@$``%`4```J`0``6!0``"H!``!@%```*@$``&@4```J`0`` -M!8``"H!``!X%@```+0(`(`6```J`0``B!8``"H!``"0 -M%@``*@$``)@6```J`0``H!8``"H!``"H%@``*@$``*@6````M`@`L!8``"H! -M``"X%@``*@$``,`6```J`0``R!8``"H!``#0%@``*@$``-@6```J`0``X!8` -M`"H!``#H%@``*@$``/`6```J`0``^!8``"H!````%P``*@$```@7```J`0`` -M$!<``"H!```8%P``*@$``"`7```J`0``*!<``"H!```P%P``*@$``#@7```J -M`0``0!<``"H!``!(%P``*@$``%`7```J`0``6!<``"H!``!@%P``*@$``&@7 -M```J`0``!@``"H!``"`&```*@$``(@8```J`0``B!@```"T"`"0&```*@$``)@8```J -M`0``H!@``"H!``"H&```*@$``+`8```J`0``N!@``"H!``#`&```*@$``,@8 -M```J`0``T!@``"H!``#8&```*@$``.`8```J`0``Z!@``"H!``#P&```*@$` -M`/@8```J`0```!D``"H!```(&0``*@$``!`9```J`0``$!D```"T"``8&0`` -M*@$``"`9```J`0``*!D``"H!```P&0``*@$``#@9```J`0``0!D``"H!``!( -M&0``*@$``%`9```J`0``6!D``"H!``!@&0``*@$``&@9```J`0``!P``"H!``"`'```*@$``(@<```J`0``D!P``"H!``"8'```*@$``*`<```J -M`0``J!P``"H!``"P'```*@$``+@<```J`0``P!P``"H!``#`'````+0(`,@< -M```J`0``T!P``"H!``#8'```*@$``.`<```J`0``Z!P``"H!``#P'```*@$` -M`/@<```J`0```!T``"H!```('0``*@$``!`=```J`0``!`````(5"0`,```` -M`A4)`!0````"%0D`'`````(5"0`D`````A4)`"P````"%0D`=`````)J"@!\ -M`````J(+`(0````"50L`C`````)/"0"4`````OD(`)P````">@D`I`````+X -M"P"L`````DD(`&P!```",PL`O`$```))"0#$`0```JP+`,P!```"/0@`U`$` -M``*R"P#<`0```@4)`/0!```"```````` -M```!``L```"D'@```````````0`+````L!X```````````$`"P```-`>```` -M```````!``L```#<'@```````````0`+````=!\```````````$`)0`````` -M```+`````0`#``X`````````````````#@`T```````````````$`/'_0P`` -M`(`?``"$`````@`!``L```"`'P```````````0!0````!"```(`````"``$` -M"P````0@```````````!`&````"$(```5`````(``0`+````A"`````````` -M``$`<0```-@@```4`0```@`!``L```#8(````````````0!Z```````````` -M`````!``#@```.@A```````````!`(0```#L(0``,`````(``0`+````["$` -M``````````$`E````!PB```L`````@`!``L````<(@```````````0"D```` -M2"(``"`````"``$`"P```$@B```````````!``L```!H(@```````````0`+ -M````F"(```````````$`"P```"`C```````````!``L```!4(P`````````` -M`0`+````Y",```````````$`L````/`D```L`@```@`!``L```#P)``````` -M`````0`;````#`````````````,`MP```!PG``#,`@```@`!``L````<)P`` -M`````````0"^````Z"D``"P````"``$`"P```.@I```````````!`,8````4 -M*@``+`````(``0`+````%"H```````````$`S0```$`J```4`````@`!``L` -M``!`*@```````````0#2````5"H``,`````"``$`"P```%0J```````````! -M``X````0*P```````````0#;````%"L``"P````"``$`"P```!0K```````` -M```!`.0```!`*P``A`````(``0`+````0"L```````````$`[@```,0K``!D -M`0```@`!``L```#$*P```````````0#Y````*"T``%0!```"``$`"P```"@M -M```````````!``4!``!\+@``J`````(``0`+````?"X```````````$`%@$` -M`"0O``"4`````@`!``L````D+P```````````0`L`0``N"\``!0!```"``$` -M"P```+@O```````````!`$(!``#,,```O`````(``0`+````S#`````````` -M``$`6`$``(@Q```L`````@`!``L```"(,0```````````0`+````M#$````` -M``````$`"P```,0Q```````````!``L```#<,P```````````0`.````;#4` -M``````````$`9`$``'`U``!@!0```@`!``L```!P-0```````````0`+```` -MT#H```````````$`;P$``.0[```H!P```@`!``L```#D.P```````````0`. -M````"$,```````````$`"P````Q#```````````!``X```"<0P`````````` -M`0`+````H$,```````````$`"P```&1$```````````!`'P!```,``````0` -M``$``P`.````#`````````````,`@@$```P$`````0```0`#`(T!```,!0`` -M#`````$``P`.`````````````````!``F0$````````$`````0`0`*L!```$ -M``````0```$`$`"W`0``!`0````(```!`!``Q0$`````````````!`#Q_PL` -M```81@```````````0`+````+$8```````````$`T0$``)`````````````% -M`!$```"H````````````!0`+````O$<```````````$`%@```,`````````` -M```%``L````L2````````````0#6`0````$```````````4`VP$``"P!```` -M```````%``L```"@2````````````0#@`0``1`$```````````4`"P```.Q( -M```````````!`.4!``!L`0``````````!0`+````.$D```````````$`Z@$` -M`)0!```````````%``L```!H20```````````0#O`0``I`$```````````4` -M"P```)A)```````````!`/0!``"T`0``````````!0`+````R$D````````` -M``$`^0$``,P!```````````%``L````L2@```````````0#_`0``"`(````` -M``````4`"P```%Q*```````````!``4"```8`@``````````!0`+`@``'`(` -M``````````4`"P```(A*```````````!`!$"``"@`@``````````!0`7`@`` -MQ`(```````````4`'0(``.P"```````````%`","```0`P``````````!0`I -M`@``)`,```````````4`+P(``%0#```````````%``X````H30`````````` -M`0`+````.$T```````````$`-0(``(`#```````````%`#L"``"(`P`````` -M````!0!!`@``E`,```````````4`1P(``*@#```````````%`$T"``"P`P`` -M````````!0`+````2$X```````````$`4P(``.0#```````````%`'H```#` -M`P``````````#@`.````%$\```````````$`"P```!Q/```````````!`%D" -M``!8`@``````````!0!?`@``B`(```````````4`90(``&0#```````````% -M`&L"```,!```````````!0`+````+%$```````````$`<0(``%P$```````` -M```%`'<"``!T!```````````!0!]`@``C`0```````````4`@P(``*0$```` -M```````%``L```!,4@```````````0")`@``W`0```````````4`CP(```@% -M```````````%``X```!P4P```````````0"5`@``P`,```0````!``X`#@`` -M`,`#```````````.`*@"``#$`P``!`````$`#@"Z`@`````````````$`/'_ -M"P```'A3```````````!``L```"84P```````````0`+````N%,````````` -M``$`"P```-A3```````````!``L```#X4P```````````0`+````&%0````` -M``````$`"P```#A4```````````!``L```!85````````````0`+````>%0` -M``````````$`"P```)A4```````````!``L```"X5````````````0`+```` -M^%0```````````$`"P```!A5```````````!``L```!850```````````0`+ -M````?%4```````````$`"P```)Q5```````````!``L```#`50`````````` -M`0`+````Q%4```````````$`"P```,A5```````````!`,,"```````````` -M``0`\?_5`@`````````````$`/'_"P```!A6```````````!``L````L5@`` -M`````````0`+````F%8```````````$`"P```!Q7```````````!``L```#0 -M5P```````````0`+````)%T```````````$`"P```&!=```````````!``L` -M```$7@```````````0`+````<%X```````````$`"P```(Q?```````````! -M`-$!```@!0``````````!0`+````!&$```````````$`#@```%1C```````` -M```!``L```!P8P```````````0#E`@``)`X``!0````!``,`]`(````````` -M````!`#Q_PL```#T9````````````0!Z````.`X```````````,`"P```'!E -M```````````!``L```#P90```````````0`+````1&8```````````$`"P`` -M`(QF```````````!``L```#D9@```````````0`+````)&<```````````$` -M"P```$!G```````````!``L```"(9P```````````0`+````L&<````````` -M``$`"P```-1G```````````!``L````8:````````````0`+````2&@````` -M``````$`#@```)!I```````````!``L```"4:0```````````0#O`0``2`@` -M``````````4`U@$``/0&```````````%`.4!``"L!P``````````!0`6```` -MM`8```````````4`VP$``"@'```````````%`.`!``!H!P``````````!0#J -M`0``[`<```````````4`#@```!AM```````````!``L````<;0`````````` -M`0`;````R`,```````````X`#@```,QM```````````!``L```#0;0`````` -M`````0`+````+&\```````````$`"P```/QO```````````!``L```!H<``` -M`````````0`+````I'$```````````$`#@```#1R```````````!``L```!( -M<@```````````0`+````*',```````````$`#@```+AS```````````!``L` -M``#,``` -M`````````0`.````<'D```````````$`"P```'1Y```````````!``L```#H -M>@```````````0!Z````6`X```````````,`"P```&A\```````````!``X` -M``"T?````````````0`+````,'T```````````$`5P0``-1]``"X`````@`! -M``L```#4?0```````````0!G!```C'X``.0````"``$`"P```(Q^```````` -M```!``L```!P?P```````````0`+````I'\```````````$`"P```'2````` -M```````!``L```"`@````````````0`.````B((```````````$`"P```*"" -M```````````!``X```#$@P```````````0`+````V(,```````````$`"P`` -M`#R&```````````!``X```#DA@```````````0`+````^(8```````````$` -M"P```*R'```````````!``L```!4B````````````0`+````N(@````````` -M``$`#@```'2)```````````!``L```!\B0```````````0`+````Q(D````` -M``````$`"P```-")```````````!``L````@B@```````````0`+````+(H` -M``````````$`"P```%B*```````````!``L```"LB@```````````0`.```` -M@(L```````````$`"P```)"+```````````!``L```#8BP```````````0#@ -M`0``.`D```````````4`Y0$``%`)```````````%`.H!``!P"0`````````` -M!0`.````K(T```````````$`"P```+"-```````````!``L````,C@`````` -M`````0`+````7(\```````````$`&P````0,```````````0``L```!4DP`` -M`````````0`+````:)0```````````$`#@```#25```````````!``L````X -ME0```````````0!?`@``I`H```````````4`]`$``+0)```````````%`/D! -M``#<"0``````````!0!V!```?`H```````````4`"P(``'@*```````````% -M``X```"`F````````````0`+````D)@```````````$`"P````29```````` -M```!``L```!`F0```````````0`+````')L```````````$`#@```&2=```` -M```````!``L```!HG0```````````0`+````+)X```````````$`"P```#B> -M```````````!``L```"\G@```````````0`+````R)X```````````$`"P`` -M`&2?```````````!``L```!PGP```````````0`+````Y*````````````$` -M"P```'RA```````````!``L```!8H@```````````0`+````>*(````````` -M``$`"P```*2B```````````!``L```"PH@```````````0`+````J*,````` -M``````$`?`0``%@.```'`````0`#``X```!8#@```````````P"(!```8`X` -M``0````!``,`E`0``&0.```6`````0`#`*,$``!\#@``#0````$``P"R!``` -MC`X``!H````!``,`P00``*@.```G`````0`#``X````$#```````````$`#0 -M!```!`P```$````!`!``W`0`````````````!`#Q_PL```"THP`````````` -M`0`+````O*,```````````$`"P```,2C```````````!``L```#,HP`````` -M`````0`+````U*,```````````$`"P```-RC```````````!`'H`````!``` -M````````#@`+````/*0```````````$`"P```$2D```````````!``L```!8 -MI````````````0`;````T`X```````````,`"P```-"D```````````!``L` -M```$I0```````````0`+````#*4```````````$`"P```'BE```````````! -M``L```",I0```````````0`+````G*4```````````$`"P```."E```````` -M```!``L```!,I@```````````0#K!```W*8``*0!```"``$`"P```-RF```` -M```````!`-$!```<"P``````````!0`6````4`L```````````4`#@```'2H -M```````````!``L```"`J````````````0#\!```M*@``'@!```"``$`"P`` -M`+2H```````````!``X````@J@```````````0`+````+*H```````````$` -MX`$``,`+```````````%``X```!(J@```````````0`+````3*H````````` -M``$`%`4``'"J``",`````@`!``L```!PJ@```````````0`.````^*H````` -M``````$`"P```/RJ```````````!``L````8JP```````````0`+````.*L` -M``````````$`"P```,"K```````````!``L```!@K````````````0`.```` -M/+````````````$`"P```'"P```````````!``X`````M````````````0`+ -M````%+0```````````$`"P```*RT```````````!`/\!```(#0`````````` -M!0`%`@``-`T```````````4`"P(``'`-```````````%`'8$``"H#0`````` -M````!0`+````R+4```````````$`"P```"BV```````````!`%D"``#4#0`` -M````````!0!?`@``#`X```````````4`$0(``"`.```````````%`!<"```T -M#@``````````!0`=`@``4`X```````````4`(P(``%P.```````````%`"D" -M``!T#@``````````!0`O`@``B`X```````````4`90(``+`.```````````% -M`#4"``#P#@``````````!0`+````F+<```````````$`)`4```@,```````` -M```0`"X%```\N```H`````(``0`+````/+@```````````$`"P```-RX```` -M```````!``L```#DN@```````````0`.````J+L```````````$`"P```*R[ -M```````````!``X```"`O````````````0`+````A+P```````````$`"P`` -M`"B]```````````!``L```#PO0```````````0`.````A+X```````````$` -M"P```(R^```````````!``L```#8OP```````````0`.````T,(````````` -M``$`"P```-3"```````````!``L```"TPP```````````0`+````.,0````` -M``````$`/@4``)#$```L`P```@`!``L```"0Q````````````0`.````M,<` -M``````````$`"P```+S'```````````!``L```!DR@```````````0`+```` -M_,H```````````$`30(``'P/```````````%`%P%``"4#P``````````!0`+ -M````-,P```````````$`4P(``*P/```````````%`&(%``#8#P`````````` -M!0`+````+,\```````````$`"P```(#/```````````!``L```"$T``````` -M`````0`+````9-(```````````$`:P(````0```````````%`'$"```H$``` -M````````!0`+````*-0```````````$`#@```+S4```````````!``L```#$ -MU````````````0`.````6-4```````````$`"P``````````````!``X` -M``#\U0```````````0`+`````-8```````````$`"P```,C6```````````! -M``L```#HU@```````````0`+````,-<```````````$`"P```!C8```````` -M```!`'T"``!D$```````````!0`.````9-H```````````$`"P```&C:```` -M```````!``X`````0`````````!``L````\'@$````````` -M`0`+````8!X!``````````$`"P```(0>`0`````````!``L```#`'@$````` -M`````0`+````Y!X!``````````$`"P````P?`0`````````!``L````H'P$` -M`````````0`+````5"`!``````````$`"P```*0@`0`````````!``L````$ -M(0$``````````0`.````E"$!``````````$`"P```*0A`0`````````!``L` -M```4(@$``````````0`+````,",!``````````$`"P```-0C`0`````````! -M``X```#L(P$``````````0`+````D"4!``````````$`"P```/@E`0`````` -M```!``L```!,)@$``````````0`+````F"8!``````````$`"P```*PF`0`` -M```````!``L```#\)@$``````````0`+````0"@`` -M``05```````````#``L````8,P$``````````0`.````5#,!``````````$` -M"P```%@S`0`````````!`/X'``"(,P$`1`````(``0`+````B#,!```````` -M``$`#@```,@S`0`````````!``L```#,,P$``````````0`+````[#,!```` -M``````$`"P`````U`0`````````!``X```"4-0$``````````0`+````F#4! -M``````````$`#@```)0V`0`````````!``L```"<-@$``````````0`+```` -MT#8!``````````$`VP$``+P8```````````%``L```"<-P$``````````0`+ -M````,#@!``````````$`#@```%0Y`0`````````!``L```!8.0$````````` -M`0#J`0``+!D```````````4`Y0$``"09```````````%``X```#$.@$````` -M`````0`."```!!4``!(````!``,`'0@``!@5```=`````0`#`"P(```X%0`` -M$`````$``P`["```2!4``!$````!``,`2@@`````````````!`#Q_PL```#4 -M.@$``````````0!Z````J`4```````````X`"P```'`[`0`````````!``X` -M``"H!0``````````#@!3"``````````````$`/'_"P````P\`0`````````! -M``L```"H/`$``````````0`+````M#P!``````````$`7@@``$@]`0`P`@`` -M`@`!``L```!(/0$``````````0!Z````5`<```````````X`#@```&P_`0`` -M```````!`'`(``!X/P$`3`$```(``0`+````>#\!``````````$`"P```,1` -M`0`````````!``L```!800$``````````0`+````X$$!``````````$`B@@` -M`(Q"`0#P`P```@`!``L```",0@$``````````0`6````Z!D```````````4` -M#@```'1&`0`````````!`)@(``!\1@$`8`$```(``0`+````?$8!```````` -M``$`"P```-Q'`0`````````!``L```!T2`$``````````0`+````R$@!```` -M``````$`#@```!!-`0`````````!``L````@30$``````````0`.````G$T! -M``````````$`"P```*Q-`0`````````!`!L```!<%0```````````P`.```` -MX%0!``````````$`"P```/!4`0`````````!``X````P50$``````````0`+ -M````1%4!``````````$`#@```%!6`0`````````!``L```!D5@$````````` -M`0#O`0``O!H```````````4`#@```(Q;`0`````````!``L```"<6P$````` -M`````0`+````P%\!``````````$`"P```-A?`0`````````!``L`````8`$` -M`````````0`+````0&`!``````````$`"P```&A@`0`````````!`+,(``!4 -M!P``!@````$`#@`.````5`<```````````X`P@@``%P'```"`````0`.`-0( -M``!@!P```@````$`#@#Q"```9`<```8````!``X`!@D`````````````!`#Q -M_PL```"`80$``````````0`+````B&$!``````````$`>@```&05```````` -M```#``L```",8@$``````````0`.````Q&(!``````````$`"P```,AB`0`` -M```````!``L```"D90$``````````0`+````8&8!``````````$`"P```)!F -M`0`````````!``L```#`9@$``````````0`+````-&@```#@3```````````0`!L```!L!P`````` -M````#@`+````!'0!``````````$`"P```#!T`0`````````!``L```#<=`$` -M`````````0`+````D'4!``````````$`"P```*1U`0`````````!``L```#P -M=P$``````````0`+````5'@!``````````$`"P```/AX`0`````````!``L` -M``!P>0$``````````0`+````B'D!``````````$`"P```'QZ`0`````````! -M``X```!`?0$``````````0`+````4'T!``````````$`#@```(Q]`0`````` -M```!``L```"@```#P3```````````0``L```"\DP$````````` -M`0`+````%)0!``````````$`"P```"B4`0`````````!``L````\E`$````` -M`````0`+````>)0!``````````$`"P```*24`0`````````!``L```#(E`$` -M`````````0`+````W)0!``````````$`"P````"5`0`````````!``L```!4 -ME0$``````````0`+````>)4!``````````$`APD``)2>`0`0`````@`!`),) -M``"TG0$`%`````(``0`+````D)8!``````````$`"P```+B6`0`````````! -M``L```#\E@$``````````0`+````C)@```$PS```````````0`)H+``#$O`$`U`(```(``0`+ -M````Q+P!``````````$`T0$```P;```````````%``L```"8OP$````````` -M`0`+````-,(!``````````$`#@```'3"`0`````````!``L```!XP@$````` -M`````0`.````Q,,!``````````$`"P```-S#`0`````````!``X````\Q`$` -M`````````0`+````8,0!``````````$`#@```*C$`0`````````!``L```#D -MQ`$``````````0`1`@``:!T```````````4`%P(``*`=```````````%`!T" -M``#0'0``````````!0`C`@```!X```````````4`*0(``#P>```````````% -M`"\"``!T'@``````````!0!E`@``K!X```````````4`-0(``.@>```````` -M```%`#L"```@'P``````````!0!!`@``6!\```````````4`1P(``(0?```` -M```````%`$T"``"P'P``````````!0!`0`````````!``X```!, -M,P``````````$``L#```3#,```0````!`!``/PP`````````````!`#Q_U$, -M``#\W@$`.`````(``0`+````_-X!``````````$`"P```#3?`0`````````! -M``L````XWP$``````````0`+````[.`!``````````$`"P```/3@`0`````` -M```!`&<,``#\X`$`1`````(``0`+````_.`!``````````$`>@```'P5```` -M```````#``L```!`X0$``````````0`+````;.$!``````````$`"P```-CA -M`0`````````!``L```!@X@$``````````0`+````9.(!``````````$`"P`` -M`&CB`0`````````!``L```"4X@$``````````0`+````F.(!``````````$` -M>0P``*#B`0#T`0```@`!``L```"@X@$``````````0`+````E.0!```````` -M``$`D`P``)CD`0!<`````@`!``L```"8Y`$``````````0`+````].0!```` -M``````$`JPP``'#E`0!$`````@`!``L```!PY0$``````````0`+````M.4! -M``````````$`P0P``-CE`0!,`````@`!``L```#8Y0$``````````0`+```` -M).8!``````````$`V`P``*SF`0!$`````@`!``L```"LY@$``````````0`+ -M````\.8!``````````$`"P```#CG`0`````````!`/`,``#@YP$`S`````(` -M`0`+````X.@```#@7```````````#`*`.``", -M)P(`8`````(``0`+````C"<"``````````$`"P```.PG`@`````````!`*T. -M``#H*0(`6`````(``0`+````Z"D"``````````$`#@```#PJ`@`````````! -M``L```!`*@(``````````0#1`0``7",```````````4`$0```&0C```````` -M```%`!8```!L(P``````````!0`+````A"H"``````````$`"P```-`J`@`` -M```````!`,`.``!4*P(`S`8```(``0`+````5"L"``````````$`U`X``"`R -M`@`D`````@`!``L````@,@(``````````0`+````1#("``````````$`#@`` -M`!0U`@`````````!``L````8-0(``````````0`+````-#4"``````````$` -M\`X``(`U`@#,"@```@`!``L```"`-0(``````````0`;````R`<````````` -M``X`#@```$A``@`````````!``L```!,0`(``````````0`+````L$`"```` -M``````$`Y0$``+0C```````````%`.`!``"P(P``````````!0`.````6%0" -M``````````$`'`\``#@7```&`````0`#``X````X%P```````````P`H#P`` -M0!<``!@````!``,`-`\``%@7```8`````0`#`$`/``!P%P``:`````$``P!, -M#P``V!<```\````!``,`6`\``.@7``"4`````0`#`& -M`@"``````@`!``L```#\7@(``````````0`+````?%\"``````````$`>@`` -M`/08```````````#``X```"880(``````````0`+````G&$"``````````$` -M$0```/`G```````````%`!8````D*```````````!0`+````F&,"```````` -M``$`#@```.QF`@`````````!``L```#T9@(``````````0#;`0``:"@````` -M``````4`#@```$QG`@`````````!``L```!09P(``````````0`+````K&<" -M``````````$`"P````1H`@`````````!``L````@:`(``````````0`T$``` -M]!@```8````!``,`#@```/08```````````#`$`0``#\&```$0````$``P!/ -M$```$!D``!L````!``,`7A``````````````!`#Q_VX0``!(:`(`?`````(` -M`0`+````2&@"``````````$`?1```,1H`@`$`````@`!``L```#$:`(````` -M`````0"*$```R&@"``0````"``$`"P```,AH`@`````````!``L```#,:`(` -M`````````0"8$```0'$"`$`````"``$`HA```/QP`@!$`````@`!`*T0``"X -M<`(`1`````(``0"X$```Z'$"`.`!```"``$`QA```'AP`@!``````@`!`-$0 -M```X<`(`0`````(``0#=$```^&\"`$`````"``$`Z1```"AJ`@`D`@```@`! -M`/@0``#@:0(`2`````(``0`-$0``@&D"`&`````"``$`"P```(!I`@`````` -M```!``L```#@:0(``````````0`+````*&H"``````````$`#@```+AJ`@`` -M```````!``L```#4:@(``````````0`C$0``3&P"`)0!```"``$`#@```$AL -M`@`````````!``L```!,;`(``````````0`.````=&P"``````````$`"P`` -M`)!L`@`````````!``X```#8;0(``````````0`[$0``X&T"`!@"```"``$` -M"P```.!M`@`````````!`.`!```\*0``````````!0#E`0``1"D````````` -M``4`Z@$``$PI```````````%``X```#L;P(``````````0`+````^&\"```` -M``````$`"P```#AP`@`````````!``L```!X<`(``````````0`+````N'`" -M``````````$`"P```/QP`@`````````!``L```!`<0(``````````0`+```` -M@'$"``````````$`"P```.AQ`@`````````!`$T1``#(`(``````````0`+````>'D"``````````$`#@```)!Y`@`````````!``L` -M``"P>0(``````````0`+````7'H"``````````$`@1$``+AZ`@!L`````@`! -M``L```"X>@(``````````0">$0``)'L"``@````"``$`"P```"1[`@`````` -M```!``L````L>P(``````````0"P$0``U(@"`(0````"``$`#@```,A\`@`` -M```````!``L```#,?`(``````````0`.`````'X"``````````$`"P```!!^ -M`@`````````!``L```#H?@(``````````0`.````$(`"``````````$`"P`` -M`""``@`````````!`,81``#H@0(`[`8```(``0`+````Z($"``````````$` -M>@```$`9```````````#``L```#4B`(``````````0#=$0``6(D"`(`````" -M``$`"P```%B)`@`````````!`/,1``#8B0(`D`````(``0`+````V(D"```` -M``````$`"P```&B*`@`````````!``(2``#(B@(`B`````(``0`+````R(H" -M``````````$`#Q(``%"+`@",`````@`!``L```!0BP(``````````0`>$@`` -MW(L"`"@````"``$`"P```-R+`@`````````!``L````$C`(``````````0#@ -M`0``>"L```````````4`Y0$``)0K```````````%``L```"8C`(````````` -M`0`+````=(T"``````````$`#@```)B-`@`````````!``L```!$C@(````` -M`````0`V$@``_(X"`#0````"``$`"P```/R.`@`````````!``L````PCP(` -M`````````0!`$@``3)$"`)0````"``$`"P```$R1`@`````````!`$T2``#@ -MD0(`?`````(``0`+````X)$"``````````$`"P```%R2`@`````````!``X` -M``"`D@(``````````0`+````1),"``````````$`Z@$``*0K```````````% -M`.\!``"\*P``````````!0`.````K*`"``````````$`"P```+"@`@`````` -M```!`&@2``#`H`(`:`````(``0`+````P*`"``````````$`"P```"BA`@`` -M```````!`/D!``#P*P``````````!0`.````/*("``````````$`@!(``$"B -M`@#L`0```@`!``L```!`H@(``````````0`.````(*0"``````````$`F!(` -M`"RD`@"\`@```@`!``L````LI`(``````````0`.````Y*8"``````````$` -M"P```.BF`@`````````!``X```"4J`(``````````0`+````F*@"```````` -M``$`#@````"J`@`````````!``L````$J@(``````````0!9`@``I"P````` -M``````4`7P(``+@L```````````%``X````@N`(``````````0"E$@``0!D` -M``8````!``,`#@```$`9```````````#`+$2``!(&0``!@````$``P"\$@`` -M4!D```0````!``,`R!(``%09```$`````0`#`-02``!8&0``#`````$``P#C -M$@``9!D``!@````!``,`\A(``'P9```-`````0`#``$3``",&0``"`````$` -M`P`,$P``E!D```@````!``,`%Q,``)P9```(`````0`#`"(3``"D&0``%P`` -M``$``P`Q$P`````````````$`/'_01,``$2X`@`<`````@`!``L```!$N`(` -M`````````0`+````8+@"``````````$`3Q,``(2X`@!H`````@`!``L```"$ -MN`(``````````0!;$P``?.D"`#@````"``$`;A,``,R[`@#4$0```@`!``L` -M``#LN`(``````````0"$$P``0,\"`#P:```"``$`DQ,``"RY`@`<`0```@`! -M``L````LN0(``````````0";$P``2+H"`(0!```"``$`"P```$BZ`@`````` -M```!``L```#,NP(``````````0`.````#+P"``````````$`"P```"B\`@`` -M```````!``X````XO0(``````````0`+````5+T"``````````$`#@```/"^ -M`@`````````!``L````4OP(``````````0`.````Z,0"``````````$`"P`` -M``#%`@`````````!``X````0R`(``````````0`+````-,@"``````````$` -MI!,``*#-`@"@`0```@`!``L```"@S0(``````````0`.````V,T"```````` -M``$`"P```/3-`@`````````!``L```!`SP(``````````0`.````W,\"```` -M``````$`"P```/3/`@`````````!``X````DT`(``````````0`+````5-`" -M``````````$`#@```/35`@`````````!``L````@U@(``````````0`.```` -M6-H"``````````$`"P```(3:`@`````````!``X```"0W@(``````````0`+ -M````E-X"``````````$`#@```$S?`@`````````!``L```!\WP(````````` -M`0`+````?.D"``````````$`MA,`````````````!`#Q_PL```"TZ0(````` -M`````0`+````N.D"``````````$`>@```+P9```````````#``L```#@Z0(` -M`````````0`+````(.H"``````````$`"P```&#J`@`````````!``X```"( -MZ@(``````````0`+````G.H"``````````$`"P```,SJ`@`````````!``L` -M```8ZP(``````````0`+````=.L"``````````$`$0```*0M```````````% -M`-$!``!X+0``````````!0`+````B.\"``````````$`"P```&3Q`@`````` -M```!``L```!P\0(``````````0`+````8/("``````````$`QQ,``+P9``!, -M`````0`#``X```"\&0```````````P#2$P`````````````$`/'_"P```(3R -M`@`````````!``L```"T\@(``````````0`.````3/,"``````````$`"P`` -M`%SS`@`````````!``L````P]0(``````````0`.````I/4"``````````$` -M"P```*CU`@`````````!`.,3``````````````0`\?\+````&/<"```````` -M``$`"P```$#W`@`````````!``X```#L]P(``````````0`+````_/<"```` -M``````$`"P```/S[`@`````````!``L```"D_`(``````````0`.````+/T" -M``````````$`"P```##]`@`````````!`/43```(&@``(`````$``P`$%``` -M```````````$`/'_#@```-P)```````````.`!44``````````````0`\?\+ -M````8/T"``````````$`"P```&S]`@`````````!``L```"`_0(````````` -M`0`+````E/T"``````````$`"P```*3]`@`````````!``L```"H_0(````` -M`````0`+````O/T"``````````$`"P```,#]`@`````````!``L```#$_0(` -M`````````0`+````R/T"``````````$`"P```.3]`@`````````!``L````` -M_@(``````````0`+````#/X"``````````$`"P```!C^`@`````````!``L` -M```H_@(``````````0`+````./X"``````````$`"P```%3^`@`````````! -M``L```"`_@(``````````0`+````H/X"``````````$`"P```*C^`@`````` -M```!``L```"P_@(``````````0`+````T/X"``````````$`"P```/#^`@`` -M```````!``L````0_P(``````````0`+````,/\"``````````$`"P```%3_ -M`@`````````!``L```!X_P(``````````0`+````G/\"``````````$`"P`` -M`,#_`@`````````!``L```!,``,``````````0`+````V``#``````````$` -M"P```/```P`````````!``L````(`0,``````````0`+````.`$#```````` -M``$`"P```$P!`P`````````!``L```"$`0,``````````0!Z````8#<````` -M`````!``#@```.`!`P`````````!``L```#H`0,``````````0`.````1`(# -M``````````$`"P```$P"`P`````````!``X```"H`@,``````````0`+```` -ML`(#``````````$`$0```&0N```````````%``L```#0`@,``````````0`+ -M````W`(#``````````$`"P````0#`P`````````!``L````\`P,````````` -M`0`+````2`,#``````````$`"P```)0#`P`````````!``L```#$`P,````` -M`````0`+````]`,#``````````$`"P````@$`P`````````!``L````4!`,` -M`````````0`+````*`0#``````````$`"P```#P$`P`````````!``L```!( -M!`,``````````0`+````2`4#``````````$`"P```%0%`P`````````!``L` -M``!D!0,``````````0`+````E`4#``````````$`"P```*`%`P`````````! -M``L```#(!0,``````````0`+````U`4#``````````$`"P````0&`P`````` -M```!`"44```H&@``$P````$``P`T%```/!H``!$````!``,`0Q0``%`:```8 -M`````0`#``X```!@-P``````````$`!2%```8#<``$@````!`!``8Q0````` -M````````!`#Q_VX4``!P!@,`>`````(``0`+````<`8#``````````$`@!0` -M`.@&`P"@`````@`!``L```#H!@,``````````0`+````B`<#``````````$` -M"P```'`(`P`````````!`-$!``!P+@``````````!0!Z````:!H````````` -M``,`"P```-@(`P`````````!``L```"$"0,``````````0`+````X`D#```` -M``````$`"P```-0*`P`````````!``X`````#`,``````````0`+````#`P# -M``````````$`"P```$`,`P`````````!`(T4``!P#`,`-`````(``0`+```` -M<`P#``````````$`"P```*0,`P`````````!``X```!D#P,``````````0`+ -M````?`\#``````````$`"P```)@/`P`````````!`.4!````+P`````````` -M!0#J`0``#"\```````````4`[P$``!@O```````````%`/0!```@+P`````` -M````!0#Y`0``+"\```````````4`_P$``#PO```````````%``4"``!(+P`` -M````````!0`+`@``5"\```````````4`=@0``%PO```````````%`%D"``!D -M+P``````````!0!?`@``="\```````````4`$0(``(`O```````````%`!<" -M``"0+P``````````!0`=`@``H"\```````````4`&P```*@W```````````0 -M`","``"L+P``````````!0`+````!!$#``````````$`*0(``+@O```````` -M```%`"\"``#$+P``````````!0`U`@``^"\```````````4`#@```!06`P`` -M```````!`*44```H%@,`%`(```(``0`+````*!8#``````````$`#@```#@8 -M`P`````````!``L````\&`,``````````0"Q%```:!H``!,````!``,`P!0` -M`'P:``!0`````0`#``X```"$&@```````````P#/%```S!H``"`````!``,` -M\10``.P:```<`````0`#``\5```(&P``&0````$``P`J%0``)!L``!8````! -M``,`0A4``#P;```9`````0`#`%T5``!8&P``&`````$``P!W%0``@```"!,`0`````````.``L```"8&`,````````` -M`0`7&@``I!@#`(0````"``$`"P```*08`P`````````!`"8:```H&0,`F`$` -M``(``0`+````*!D#``````````$`#@```*P:`P`````````!`#(:``#`&@,` -M)`$```(``0`+````P!H#``````````$`01H``.0;`P`H`````@`!``L```#D -M&P,``````````0`+````#!P#``````````$`VP$``&`Q```````````%`.`! -M``"D,0``````````!0#E`0``K#$```````````4`Z@$``,0Q```````````% -M`.\!``#8,0``````````!0`+````:!P#``````````$`"P```'0<`P`````` -M```!`/0!``#D,0``````````!0#_`0``'#(```````````4`!0(``$PR```` -M```````%``X```!8'0,``````````0!/&@``8!T#`&P````"``$`"P```&`= -M`P`````````!``L```#,'0,``````````0`.````X!X#``````````$`"P`` -M`.@>`P`````````!``L"``!H,@``````````!0!V!```?#(```````````4` -M#@```$0@`P`````````!``L```!((`,``````````0!:&@``;"`#``P````" -M``$`"P```&P@`P`````````!`&L:``!X(`,`C`(```(``0`+````>"`#```` -M``````$`)`4``!@X```````````0`%D"``",,@``````````!0!X&@``7",# -M`)@!```"``$`#@```/PB`P`````````!``L````$(P,``````````0`.```` -M6",#``````````$`"P```%PC`P`````````!`!<"``#@,@``````````!0`= -M`@``"#,```````````4`(P(``!@S```````````%`(<:``!X'0``#`````$` -M`P"6&@``A!T``!,````!``,`I1H``)@=```.`````0`#`+0:``"H'0``#P`` -M``$``P##&@``N!T``#`````!``,`#@```+@=```````````#`-H:```````` -M&@````$`"`#^&@``&@```!H````!``@`(AL``#0````>`````0`(`$H;``!2 -M````'@````$`"`!R&P``($P!`'`````!``X`#@```"!,`0`````````.`'H; -M``"03`$`Q`0```$`#@")&P````````@````!``D`#@`````````````````) -M`*T;```(````"`````$`"0#1&P``$`````@````!``D`^1L``!@````(```` -M`0`)`"$<```8.```!`````$`$``G'``````````````$`/'_-1P``/0D`P!` -M`````@`!``L```#T)`,``````````0`_'```-"4#``@````"``$`"P```#0E -M`P`````````!`$\<```\)0,`4`````(``0`+````/"4#``````````$`7QP` -M`(PE`P!0`````@`!``L```",)0,``````````0`+````W"4#``````````$` -M;QP``"`F`P`<`````@`!``L````@)@,``````````0!^'```/"8#`%0````" -M``$`"P```#PF`P`````````!`(X<``"0)@,`'`````(``0`+````D"8#```` -M``````$`GAP``*PF`P`<`````@`!``L```"L)@,``````````0"O'```R"8# -M`!@````"``$`"P```,@F`P`````````!`,`<``#@)@,`.`````(``0`+```` -MX"8#``````````$`T!P``!@G`P`(`````@`!``L````8)P,``````````0#A -M'```("<#``@````"``$`"P```"`G`P`````````!`.<<```H)P,`"`````(` -M`0`+````*"<#``````````$``QT``#`G`P`(`````@`!``L````P)P,````` -M`````0`:'0``."<#``@````"``$`"P```#@G`P`````````!`#`=``!`)P,` -M"`````(``0`+````0"<#``````````$`/QT``$@G`P`(`````@`!``L```!( -M)P,``````````0!+'0``4"<#``@````"``$`"P```%`G`P`````````!`%<= -M``!8)P,`"`````(``0`+````6"<#``````````$`9!T``&`G`P`(`````@`! -M``L```!@)P,``````````0!M'0``:"<#`(`````"``$`"P```&@G`P`````` -M```!`(0=``#H)P,`I`````(``0`+````Z"<#``````````$`T0$``"PS```` -M```````%`'H```#L'0```````````P`1````0#,```````````4`D!T``(PH -M`P#P`````@`!``L```",*`,``````````0#;`0``X#,```````````4`X`$` -M``0T```````````%``X```!T*0,``````````0`+````?"D#``````````$` -MY0$``"`T```````````%`.\!``!,-```````````!0#Y`0``8#0````````` -M``4`]`$``%0T```````````%``X```"T*@,``````````0"B'0``N"H#`$@` -M```"``$`"P```+@J`P`````````!`/\!``!D-```````````!0"Q'0```"L# -M`$0(```"``$`"P`````K`P`````````!`(\"``#D-0``````````!0#"'0`` -M[#4```````````4`#@```+0R`P`````````!`,@=``!$,P,`1`$```(``0`+ -M````1#,#``````````$`#@```(`T`P`````````!`-8=``"(-`,`K`0```(` -M`0`+````B#0#``````````$`!0(``&PT```````````%``L"``!X-``````` -M````!0!Z!0``3#8```````````4`YQT``+0V```````````%`&@%````-@`` -M````````!0#M'0``5#8```````````4`\QT``)@V```````````%`/D=```$ -M-@``````````!0`.````"#D#``````````$`_QT``#0Y`P#L`0```@`!``L` -M```T.0,``````````0`1'@``[#8```````````4`&P```"@X```````````0 -M``X````(.P,``````````0`7'@``(#L#`(0!```"``$`"P```"`[`P`````` -M```!`"(>``!8-P``````````!0`H'@``;#<```````````4`+AX``'0W```` -M```````%`#0>``!\-P``````````!0`Z'@``C#<```````````4`0!X``(`W -M```````````%``X```"8/`,``````````0!&'@``I#P#`#0````"``$`"P`` -M`*0\`P`````````!`%0>``"@-P``````````!0`+````V#P#``````````$` -M6AX``*@W```````````%`'$"``"4-0``````````!0`+````<#T#```````` -M``$`8!X``,0W```````````%`&8>``"(/@,`&`````(``0`+````B#X#```` -M``````$`=1X``*`^`P"`#````@`!``L```"@/@,``````````0`.````U#X# -M``````````$`"P```!0_`P`````````!`((>``#@-P``````````!0"('@`` -M^#<```````````4`CAX``!`X```````````%`)0>```H.```````````!0": -M'@``0#@```````````4`H!X``%@X```````````%`*8>``!P.``````````` -M!0"L'@``B#@```````````4`LAX``*`X```````````%`+@>``#8.``````` -M````!0"^'@``$#D```````````4`Q!X``"`Y```````````%`,H>``!<.0`` -M````````!0#0'@``=#D```````````4`UAX``(0Y```````````%`-P>``"4 -M.0``````````!0#B'@``H#D```````````4`Z!X``*PY```````````%`.X> -M``"\.0``````````!0#T'@``[#D```````````4`^AX```0Z```````````% -M```?```H.@``````````!0`&'P``4#H```````````4`#!\``'0Z```````` -M```%`!(?``"(.@``````````!0`8'P``N#H```````````4`'A\``"0[```` -M```````%`"0?``!`.P``````````!0`K'P``4#L```````````4`,A\``'@[ -M```````````%`#D?``"D.P``````````!0!`'P``O#L```````````4`1Q\` -M`/0[```````````%`$X?```T/```````````!0!5'P``4#P```````````4` -M7!\``&@\```````````%`&,?``!\/```````````!0!J'P``A#P````````` -M``4`<1\``*@\```````````%`'@?```8/@``````````!0!_'P``*#X````` -M``````4`AA\``#@^```````````%`(T?``!(/@``````````!0"4'P``6#X` -M``````````4`FQ\``&P^```````````%`*(?``"`/@``````````!0"I'P`` -ME#X```````````4`L!\``*@^```````````%`+`P`````````!``L```!\ -M7@,``````````0`.````3%\#``````````$`)B$``%1?`P#4`P```@`!``L` -M``!47P,``````````0`.````<&`#``````````$`"P```+!@`P`````````! -M``X```!,80,``````````0`+````C&$#``````````$`#@```"!C`P`````` -M```!`#4A```H8P,`&`````(``0`+````*&,#``````````$`1R$``$!C`P"H -M`0```@`!``L```!`8P,``````````0!7(0``Z&0#`%0!```"``$`"P```.AD -M`P`````````!``X````X9@,``````````0!G(0``/&8#`(0!```"``$`"P`` -M`#QF`P`````````!`'$,````` -M``````4`KR$``(A#```````````%`+8A``#`9P,`0`$```(``0`+````P&<# -M``````````$`)`4``%11`0`````````.`,`,``````````0!1(@``^'@#`.0````"``$`"P```/AX`P`` -M```````!`&0B``#T0P``````````!0`.````U'D#``````````$`:R(``-QY -M`P!X%````@`!``L```#<>0,``````````0`.````O'H#``````````$`"P`` -M``A[`P`````````!``X```!HB@,``````````0`+````](H#``````````$` -M"P```%2.`P`````````!``X````DCP,``````````0`+````-(\#```````` -M``$`?2(``!Q'```````````%``L```#\D`,``````````0`.````.)$#```` -M``````$`"P```#R1`P`````````!`(0B``!`1P``````````!0`+````=)$# -M``````````$`BR(``#22`P#4`0```@`!``L````TD@,``````````0`.```` -M\),#``````````$`G"(```B4`P"\`@```@`!``L````(E`,``````````0"L -M(@``B$@```````````4`#@```*26`P`````````!`+,B``#$E@,`*`8```(` -M`0`+````Q)8#``````````$`#@```)R8`P`````````!``L```#`F`,````` -M`````0##(@``T$@```````````4`RB(``/1(```````````%`-$B``#\2``` -M````````!0#8(@```$D```````````4`WR(``"1)```````````%`.8B```L -M20``````````!0#M(@``/$D```````````4`]"(``$Q)```````````%`/LB -M``!T20``````````!0`"(P``?$D```````````4`"2,``(!)```````````% -M`!`C``"$20``````````!0`7(P``R$D```````````4`'B,``/A)```````` -M```%`"4C```,2@``````````!0`.````V)P#``````````$`+",``.R<`P`@ -M`0```@`!``L```#LG`,``````````0`.`````)X#``````````$`.R,```R> -M`P"H`````@`!``L````,G@,``````````0`.````3)X#``````````$`"P`` -M`%R>`P`````````!`$LC``#L'0``#`````$``P!:(P``^!T``!$````!``,` -M:2,```P>```.`````0`#`'@C```<'@``$0````$``P"'(P``,!X``!(````! -M``,`EB,``$0>```+`````0`#`*4C``!0'@``#P````$``P"T(P``8!X``!$` -M```!``,`PR,``'0>```0`````0`#`-(C``"$'@``!`````$``P`.````A!X` -M``````````,`WB,``(@>```-`````0`#`.HC``"8'@``#@````$``P#Y(P`` -MJ!X```4````!``,`!"0``+`>```)`````0`#``\D``"\'@``!`````$``P`; -M)```P!X``!,````!``,`*B0``-0>```2`````0`#`#DD``#H'@``%@````$` -M`P!()````!\```0````!``,`5"0```0?```&`````0`#`&`D```,'P``#P`` -M``$``P!O)```'!\``!,````!``,`?B0``#`?```7`````0`#`(TD``!('P`` -M%P````$``P"<)```8!\``!$````!``,`JR0``(0?```0`````0`#`+HD``"4 -M'P``!`````$``P#&)```F!\``!`````!``,`U20``*@?```/`````0`#`.0D -M``"X'P``^`$```$``P`.````5%$!``````````X`]20``,!1`0#@`````0`. -M``(E``"@4@$`<`````$`#@`.````*#@``````````!``%B4``"@X```0```` -M`0`0`" -M`P`````````!``L```#LG@,``````````0`+````_)X#``````````$`"P`` -M``"?`P`````````!``L```!\GP,``````````0`+`````*`#``````````$` -M"P```%B@`P`````````!``L```!\H`,``````````0`+````R*`#```````` -M``$`#@```$BA`P`````````!``L```!,H0,``````````0!Q)0`````````` -M```$`/'_"P```*BA`P`````````!``X````DH@,``````````0`+````**(# -M``````````$`#@```*2B`P`````````!``L```"HH@,``````````0`+```` -M"*,#``````````$`"P```#"C`P`````````!``L```"DHP,``````````0`+ -M````L*,#``````````$`"P```+RC`P`````````!``L```#(HP,````````` -M`0!Z````B#@``````````!``"P```+2D`P`````````!`!8````82P`````` -M````!0#6`0``+$L```````````4`VP$``#1+```````````%``L```#$I0,` -M`````````0`+````Z*4#``````````$`"P```""F`P`````````!``L```!, -MI@,``````````0`+````6*8#``````````$`#@```(@X```````````0`'XE -M``"(.`````0```$`$`".)0`````````````$`/'_"P```&2F`P`````````! -M``L```!LI@,``````````0`+````@*8#``````````$`"P```(2F`P`````` -M```!``L```"(I@,``````````0`+````L*8#``````````$`"P```+RF`P`` -M```````!``L````0IP,``````````0`+````9*@#``````````$`"P```/BH -M`P`````````!``L````HJ0,``````````0";)0``>/\"`"0````2``$`K24` -M`/!W`0!D````$@`!`,(E``#,!@``2`$``!(``0#7)0``'/L!`'0````2``$` -M[24`````````````$````/'D"`.0````2``$` -M'BD``#R4`0`\````$@`!`#8I``"$Y@``'`,``!(``0!!*0``N(@``,0````2 -M``$`8BD``$AR``#@````$@`!`'0I``#(20``9````!(``0"&*0``P/<``,0` -M```2``$`D2D`````````````$````)\I```H`0``(````!(``0"^*0``>,(! -M`&P"```2``$`X"D``(CO`@#<`0``$@`!`/,I``#`P`0````$@`!`),L``!T&`,`)````!(``0"Q+```M"0"`'P````2 -M``$`R"P``&@J`0!0````$@`!`.0L```0IP,`5`$``!(``0#Y+``````````` -M```0````"BT``("A`0`<````$@`!`"$M``#8=P``=````!(``0!#+0``.$T` -M`!`!```2``$`5BT``*1U`0!,`@``$@`!`&DM```P_P(`)````!(``0![+0`` -M@&$!``@````2``$`BRT``'R)``!(````$@`!`*0M`````````````!````"M -M+0``?*`#`$P````2``$`QRT``$QX```L````$@`!`-HM``!`]P(`O````!(` -M`0#Z+0``0.$!`"P````2``$`#"X``+3R`@!\`@``$@`!`#PN```\$P```0`` -M`!$`$`!*+@``R`,!`-P!```2``$`6"X``-@(`P"L````$@`!`&@N``#T'`$` -M3````!(``0!W+@``Q/T"``0````2``$`BBX``#P$`P`,````$@`!`)8N``"\ -MHP,`#````!(``0"H+@``R$L!``0````1``X`N"X`````````````$````,\N -M```$`P,`.````!(``0#=+@``.)X``(0````2``$`]2X``,CJ``!H````$@`! -M``4O``"*(``"P````2``$`@#$`````````````$````)0Q``#X2P$` -M!````!$`#@"B,0``:(H"`&`````2``$`N#$```P?`0`<````$@`!`,LQ``"T -M&0``;`$``!(``0#>,0``:-H``+@!```2``$`\3$``*2B```,````$@`!``0R -M``#H'0``!````!$``P`3,@``R*`#`(0````2``$`+C(``*@!``"<````$@`! -M`$XR``#`#@``G````!(``0!?,@``P&8!`'0````2``$`=3(``-`5`@`$```` -M$@`!`(XR`````````````!````"1,@``H`0``!`````1``X`G3(``"Q1```@ -M`0``$@`!`*\R```HU```G````!(``0"Z,@``X`$``.`!```1``X`RS(``%`6 -M`@!P````$@`!`.DR```$&P$`+````!(``0#],@``W"4#`$0````2``$`&C,` -M`,Q\`@!$`0``$@`!`"\S``!L_0(`%````!(``0!!,P``6'8```0````2``$` -M63,``*R*``#D````$@`!`&8S``#PO0``G````!(``0!Y,P``T(D``%`````2 -M``$`CC,`````````````$````)TS``!,-P``!````!$`$`"],P``?`4``%`! -M```2``$`T#,```SS```T`0``$@`!`.,S``!DH0$`'````!(``0#W,P`````` -M```````0````!C0``$#(`0`8````$@`!`"$T`````````````!`````P-``` -M```````````0````-S0```0,``"D````$@`!`$XT```\.```!````!$`$`!D -M-```9)\```P````2``$`=C0``)@8`P`,````$@`!`)`T``!@K```$`0``!(` -M`0">-``````````````0````I#0``("H```T````$@`!`+,T```T%@(`'``` -M`!(``0#/-````)4!`%0````2``$`Z#0``"@$`P`4````$@`!`/0T``!<\0`` -ML`$``!(``0``-0``+'L"`*`!```2``$`%C4``-2A`0`<````$@`!`"@U``"D -M90$`O````!(``0`]-0``9*@#`)0````2``$`534``"Q&``"0`0``$@`!`&LU -M``"PH@``^````!(``0!_-0``$/\"`"`````2``$`BC4``&A@`0`8`0``$@`! -M`)XU``!X4P``(````!(``0"H-0``!%X``&P````2``$`Q#4``+A4``!````` -M$@`!`-$U```$I0``"````!(``0#:-0``)&H!`-@````2``$`[34``(3X``#$ -M`@``$@`!`/HU```)0! -M`"P````2``$`8S<``.@``0#D````$@`!`((W```\'@$`)````!(``0"=-P`` -MH$,``,0````2``$`K3<`````````````$````+TW``#H>@``@`$``!(``0#3 -M-P``N*(!`!`````2``$`ZS<``'1(`0!4````$@`!``0X``!TD0,`P````!(` -M`0`5.```U$L!``0````1``X`)C@``/QO``!L````$@`!`#`X``"T&@$`4``` -M`!(``0!&.```='D``'0!```2``$`6#@``(0)`P!<````$@`!`&TX``"P-P`` -M!````!$`$`!^.```"`$#`#`````2``$`GS@``%A<`@`$````$@`!`+8X``#4 -M!0,`,````!(``0#$.```&*L``"`````2``$`UC@``+@*``"X````$@`!`.HX -M``"P_@(`(````!(``0#U.```O#<```0````1`!```CD``+R3`0!8````$@`! -M`"`Y``#8X0$`B````!(``0`Z.0``R*(!`)P"```2``$`4CD``)@F`0`4```` -M$@`!`&(Y``#L-P``!````!$`$`!P.0``Q'4"`'P````2``$`ASD``(@I`0!, -M````$@`!`)DY``"\_0(`!````!(``0"I.0``7$H``"P````2``$`OCD`` -M``"@````$@`!`,PY``"D#P(`+`8``!(``0#>.0``N/\``#`!```2``$`[#D` -M```````$````$@`!`/\Y``#T;0$`P`(``!(``0`2.@``!!8``*`````2``$` -M(SH``,0#`P`P````$@`!`#,Z``"L)@$`4````!(``0!$.@``#*4``&P````2 -M``$`4CH``(@$```$````$0`.`%HZ``#L,P$`%`$``!(``0!P.@``=(\!`/0` -M```2``$`A#H``/@E`0!4````$@`!`)8Z``!("`$`N`@``!(``0"A.@``B&<` -M`"@````2``$`KSH``)@/`P!L`0``$@`!`,,Z``!4E0$`)````!(``0#=.@`` -M##P!`)P````2``$`\3H``$@!``!0````$@`!``([``#,G@,`(````!(``0`4 -M.P``U"D!`)0````2``$`+#L``)`=`0`<````$@`!`#H[``#,,P$`(````!(` -M`0!0.P``-,P``/@"```2``$`9SL```1V```$````$@`!`(([``#\U@$`(``` -M`!(``0"5.P``U!4"`!@````2``$`ICL``'AX``!4````$@`!`+\[```H*0$` -M!````!(``0#2.P`````````````0````Y#L``*P#```X````$@`!`/T[```8 -M5@``%````!(``0`//```U#H!`)P````2``$`&SP``!A&```4````$@`!`"X\ -M``"P`@,`(````!(``0!$/```5/\"`"0````2``$`5CP`````````````$``` -M`&4\``!TC0(`B`$``!(``0!T/```E/T"`!`````2``$`@SP``!S;`0#````` -M$@`!`)X\``"X*@$`-````!(``0"M/```L"P!`.@````2``$`PCP``"QO``#0 -M````$@`!`-$\``!P"`,`:````!(``0#D/```Q*4#`"0````2``$`_SP``.@> -M`P!@`0``$@`!``X]``!`(P````0``!$`$``=/0`````````````0````+3T` -M`-`;`0!4````$@`!`#H]```,C@``4`$``!(``0!5/0``A/("`#`````2``$` -M;#T``'BE```4````$@`!`'@]``!4!0,`$````!(``0"$/0``D"L!`#@!```1 -M``X`G#T``)P%```#````$0`.`*H]```DY@$`B````!(``0#-/0``]$L!``0` -M```1``X`WCT``"Q6``!L````$@`!`/@]``!8B@``5````!(``0`0/@``T!`` -M`)0````2``$`(CX``(P%```#````$0`.`"T^`````````````!`````^/@`` -MR)X``)P````2``$`43X``'0%```$````$0`.`&<^``!,``,`C````!(``0!Q -M/@`````````````0````?3X``$@#`P!,````$@`!`),^``"4X@$`!````!(` -M`0"K/@``!&$``&P"```2``$`OSX```"@`P!8````$@`!`-,^```````````` -M`!````#B/@``;.$!`&P````2``$`^SX``"1G```<````$@`!``L_``!,0`(` -M9````!(``0`L/P`````````````0````/3\``,2)```,````$@`!`%4_``"\ -MQP``J`(``!(``0!E/P``I'\``-`````2``$`=S\``.#I`@!`````$@`!`(L_ -M```470(`=`$``!(``0"E/P``9-(``,0!```2``$`N#\``-2$`0"<````$@`! -M`,X_```P=`$`K````!(``0#@/P``5!X``%`````2``$`\S\``!C^`@`0```` -M$@`!``M````PZP``8`$``!(``0`80```R/T"`!P````2``$`)D```/1X`@"$ -M````$@`!`#M````8!0````0``!$``P`_0```"*,#`"@````2``$`5D```#@6 -M`0#8!0``$0`.`'5````(\P$`L`0``!(``0".0```4!`!`.@%```1``X`JD`` -M`&`>`0`D````$@`!`,=```!`!```;````!(``0#?0```3*(!`"P````2``$` -M[D````R"`0"P````$@`!``!!`````````````!`````,00``W-L!`"`#```2 -M``$`($$``(!Q`@!H````$@`!`"M!```0'`$`V`4``!$`#@!*00``7#<```0` -M```1`!``8T$``!!,`0`$````$0`.`')!``#L2P$`!````!$`#@"`00``R!@" -M`)0````2``$`E$$``*R'``"H````$@`!`*%!```HE`$`%````!(``0"V00`` -M@(```+P%```2``$`RD$``*`%`P`H````$@`!`-I!``"<_P(`)````!(``0#L -M00``Q)D!`'0````2``$``D(```P9``"H````$@`!`!9"``!1@``V#P#`)@````2``$`:D8``"@G`0!H!```$0`. -M`()&`````````````!````"/1@``0"L````$```1`!``HD8``$2D```4```` -M$@`!`+%&``!`8`$`*````!(``0#)1@``F%,``"`````2``$`U$8``#`Q`0!H -M!```$0`.`/)&``!L"```I````!(``0`'1P``+,\``%0````2``$`%T<``("G -M`0!(`0``$@`!`"Q'``!T'P``#````!(``0`^1P`````````````0````4$<` -M````````````$````%U'```8"0````0``!$``P!A1P``S'0``/0````2``$` -M<$<``)BH`@!L`0``$@`!`(5'``!4(P``D````!(``0"31P``<#L!`)P````2 -M``$`GT<``*BB`P!@````$@`!`+-'```P_0(`,````!(``0#.1P``<&,``(0! -M```2``$`XT<```@,```&````$0`0`.U'`````````````!````#V1P``L`0` -M``8````1``X``T@``"2$`0"P````$@`!`!E(``!`=@(`L`(``!(``0`P2``` -M#$P!``0````1``X`0T@``%P/``!T`0``$@`!`%5(``"0F```=````!(``0!J -M2``````````````0`````4```,````1``X`H4\``+`R`0`(````$@`!`+A/```` -MU@``R````!(``0#%3P``<(4!`*0)```2``$`W$\``/S[`@"H````$@`!``!0 -M```HO0``R````!(``0`04``````````````0````%U```)BW``"D````$@`! -M`#90```@B@``#````!(``0!*4```\#$!`"P````2``$`7E```.`W```$```` -M$0`0`'!0``#,%0``"`` -M```2``$`I%$``"BA`@`8`0``$@`!`+!1```4)`(`H````!(``0#+40``<+`` -M`*0#```2``$`VE$``+P.`@#<````$@`!`.I1```$=`$`+````!(``0#[40`` -M5`T``,P````2``$`#U(``)@!```0````$@`!`#!2``#,:`(`M````!(``0!' -M4@``R%4``%`````2``$`5%(``+A3```@````$@`!`%]2```,0P``E````!(` -M`0!O4@`````````````0````?5(``,15```$````$@`!`(Y2``"\2P$`!``` -M`!$`#@"E4@``5/X"`"P````2``$`O5(``$`0`0`0````$0`.`-=2```\A@`` -M<`$``!(``0#C4@``:'P``&P!```2``$`!U,``!0(``!8````$@`!`!=3``#8 -M2P$`!````!$`#@`H4P``\'@"``0````2``$`.E,``+0Q```0````$@`!`%)3 -M``#D2P$`!````!$`#@!B4P``C%\``'@!```2``$`;E,``/QJ`0!4````$@`! -M`(I3```0#@(`K````!(``0"C4P``6*`#`"0````2``$`N%,``&B4``#0```` -M$@`!`,]3``!`]```@`,``!(``0#>4P`````````````0````\%,``!Q7``"T -M````$@`!``=4``"$!```!````!$`#@`/5```@/X"`"`````2``$`*%0``!CW -M`@`H````$@`!`$14`````````````!````!+5```K.@!`#0````2``$`:%0` -M`!QM``"T````$@`!`']4``"(I@,`*````!(``0"35```&&@``#`````2``$` -MI%0``$`;`````0``$0`0`+54``!,I@``D````!(``0#-5```G#8!`#0````2 -M``$`UU0``*P%``"H`0``$0`.`.-4`````````````!````#S5``````````` -M```0````"E4``)@G`0`,````$@`!`!]5`````````````!`````I50``=.L" -M`!0$```2``$`.54``%BB```@````$@`!`%)5``!(3@``U````!(``0!D50`` -MU",!`"0"```2``$`>E4``(0!`P!D````$@`!`(U5````-0$`F````!(``0": -M50``F`4```,````1``X`IU4``)`````H````$@`!`+U5``"L-P``!````!$` -M$`#)50`````````````0````UU4``.`)`P#T````$@`!`.Y5```````````` -M`!````#^50``I/T"``0````2``$`#58``*BC```,````$@`!`"!6``"8C`(` -MW````!(``0!"5@``1`(``"0````2``$`8%8``)AS`0!L````$@`!`&U6``"8 -MX@$`"````!(``0")5@``'$P!``0````1``X`D%8``'#Q`@#P````$@`!`*U6 -M```8#0````$``!$``P"R5@``["<"`/P!```2``$`R%8``'0I`0`4````$@`! -M`-Y6`````````````!````#G5@``8/T"``P````2``$`^E8````````````` -M$`````U7```(=@``"````!(``0`M5P``C&8``%@````2``$`.%<``"AS``"D -M````$@`!`%%7``#D(P``#`$``!(``0!D5P``>*(!`!P````2``$`=%<``"0< -M`0!X````$@`!`(17```H'P$`+`$``!(``0".5P``2"`#`"0````2``$`HU<` -M`%AW```$````$@`!`,U7````"P$`0`4``!$`#@#M5P``:.(!`"P````2``$` -M`%@``,0W```$````$0`0``Q8```X_@(`'````!(``0`>6```2`0#```!```2 -M``$`,%@``!!V```\````$@`!`$%8``"$)P$`%````!(``0!16```-,(!`$0` -M```2``$`:U@``/0W```$````$0`0`'I8```(3`$`!````!$`#@"'6```H`4` -M``8````1``X`EE@``'!_```T````$@`!`*)8```@#@``H````!(``0"S6``` -MW`D``+H[```1``X`RU@``#`C`0"D````$@`!`-98``!,=@``!````!(``0#R -M6```]`,#`!0````2``$``5D``/!+`0`$````$0`.`!)9``"TY0$`)````!(` -M`0`J60``3*8#``P````2``$`1%D``%A5```D````$@`!`%59```````````` -M`!````!<60``@/T"`!0````2``$`<5D``#P#`P`,````$@`!`']9```T'``` -M$````!(``0"/60``M$L!``0````1``X`FUD``-PW```$````$0`0`*U9``#8 -MBP``V`$``!(``0#'60``$`D``+`````2``$`TED``&AP```\`0``$@`!`.%9 -M``#H`0,`9````!(``0#R60``!`````0````2``$`!%H``'`'``!8````$0`. -M`"1:`````````````!`````L6@````0``(0````1``X`.5H``&PQ`0`T```` -M$@`!`$U:``"(D`$`4````!(``0!E6@``W$`P`8````$@`!`.%;``!\GP,`A````!(``0#V6P``G&$" -M`/P!```2``$``5P``*C]`@`4````$@`!`!%<``#`2P$`!````!$`#@`>7``` -M!!$#`"0%```2``$`,%P``$!G``!(````$@`!`#U<``#DN@``R````!(``0!2 -M7```1!P``!`"```2``$`85P``*0G`0`0````$@`!`&Y<`````````````!`` -M``!\7```].`!``@````2``$`DUP`````````````$````)E<``#H_P``V`4` -M`!$`#@"R7```,*,#`'0````2``$`QEP``-PS``"4`0``$@`!`-=<``"8+0$` -MJ`$``!(``0#F7```4#<```0````1`!``_EP``#1G`0`T````$@`!`!9=```` -M`````````!`````=70``C&(!`#P````2``$`,ET``-3"``#@````$@`!`$9= -M`````````````!````!570``!"$!`!`!```2``$`8UT``-`"`P`,````$@`! -M`'%=`````````````!````"`70``Z'X"```#```2``$`GET``.3$`0!<`P`` -M$@`!`+==``!`%0````8``!$`$`#*70``:.(``!P$```2``$`V%T``&3*``"8 -M````$@`!`.-=``"`SP``!`$``!(``0#P70``L$`"`$`4```2``$`!UX``)@/ -M`@`,````$@`!`!E>``",!```!````!$`#@`A7@``Y!X!`"@````2``$`,5X` -M`$`=`0`H````$@`!`$%>``"0!```$````!$`#@!-7@`````````````0```` -M6%X``$`S```$````$0`0`&M>```X`0,`%````!(``0!U7@``+$@``'0````2 -M``$`AUX``,PC`@!(````$@`!`)Q>```\&`,`'````!(``0"K7@``&%0``"`` -M```2``$`N%X`````````````$````,)>```$C`(`E````!(``0#07@``H#$! -M`%`````2``$`W5X``(@(`@!$`0``$@`!`/!>``#`"0``^````!(``0`'7P`` -M%(\!`&`````2``$`(%\`````````````$````#)?`````````````!`````_ -M7P``<+H``*`_```1``X`6E\```@$`P`,````$@`!`&=?``#8'0(`8`4``!(` -M`0")7P``R)T!`,P````2``$`FU\`````````````$````*U?```XYP$`J``` -M`!(``0#`7P``;!L"`&P"```2``$`UU\``*24`0`D````$@`!`/!?```@:`(` -M*````!(``0`%8``````````````0````&&```*R[``#8````$@`!`"U@``#\ -M`@$`S````!(``0`[8```:&P!`(P!```2``$`6&```&AG`0`P````$@`!`&M@ -M```4M```F````!(``0!\8```^'@!`'@````2``$`E6```'Q?`@`@`@``$@`! -M`*5@`````````````!````"S8```K&<"`%@````2``$`R6```%@Y`0!\`0`` -M$@`!`-I@```XF@$`Q`(``!(``0#N8``````````````0````_6```%Q<`@"X -M````$@`!``]A`````````````!`````980``@`4```,````1``X`)V$``+!+ -M`0`$````$0`.`#-A``"H40$`&````!$`#@!$80``?'H!`.@$```2``$`36$` -M`(0%```#````$0`.`%MA``"<'`$`+````!(``0!M80``G*4``$0````2``$` -M?F$``$`=````!@``$0`0`(UA``!P!0``!````!$`#@"B80``&$P!``0````1 -M``X`N&$`````````````$````,EA``"0[```%`(``!(``0#880``\.8!`$@` -M```2``$`[F$``*`R`0`(````$@`!``5B``#0.@``%`$``!(``0`58@``"!@" -M`$0````2``$`+6(``#3?`0`$````$@`!`$1B``!LI@,`%````!(``0!?8@`` -M<"P!`$`````2``$`<6(``&1_`0"H`@``$@`!`()B``#,-P``!````!$`$`"7 -M8@`````````````0````JV(`````````````$````,%B``!(6@(`$`(``!(` -M`0#;8@``E`4#``P````2``$`YV(``!PR`0!\````$@`!`/1B```<.```#``` -M`!$`$`#[8@`````,````$@`!`+=E``"D&P$`+````!(``0#-90`` -M$/H``-@%```1``X`YF4``##7``#H````$@`!`/5E``#0:P$`:````!(``0`) -M9@``@!0``&`````2``$`'F8``*0>```,````$@`!`#!F```P%P(`9````!(` -M`0!$9@``D&8!`#`````2``$`5F8``+RC```(````$@`!`&-F``!D1```M`$` -M`!(``0!S9@``X'8#`%@````2``$`DF8``'`8``"<````$@`!`*=F```XJP`` -MB````!(``0"T9@``Q#(!``0````2``$`S68``+`\`0``!0``$0`.`.5F```` -M`````````!````#U9@`````````````0````!V<``-`V`0#,````$@`!`!UG -M``",I0``$````!(``0`I9P```$P!``0````1``X`-&<``/BH`P`P````$@`! -M`%%G`````````````!````!89P``:!P#``P````2``$` -M:0``S`$!`#`!```2``$`,&D``$@S```$````$0`0`$5I``!@70``I````!(` -M`0!D:0``J/X"``@````2``$`<&D``)3D`0`$````$@`!`))I``!`+P````0` -M`!$`$`"I:0``"`$``"`````2``$`QFD``)0#`P`P````$@`!`-EI``#0*@(` -MA````!(``0#Q:0``.-\!`+0!```2``$`#6H``/1D``!\````$@`!`"]J``#T -MY`$`?````!(``0!":@``4&<"`%P````2``$`6&H``"BI`P!4````$@`!`'9J -M``#,HP``"````!(``0"#:@``2&@``$P!```2``$`DVH``-@``P`8````$@`! -M`*)J``#LN`(`0````!(``0"W:@`````````````0````R&H``+@W```$```` -M$0`0`-=J``!(H0$`'````!(``0#K:@``P)@!``0!```2``$`_6H``/1F`@!< -M````$@`!`!AK``#<'@``F````!(``0`K:P``.&P!`#`````2``$`/&L````` -M````````$````$YK``!4"`(`-````!(``0!G:P``S!T#`!P!```2``$`=6L` -M`."E``!L````$@`!`(-K```P]0(`>````!(``0"<:P``P%\!`!@````2``$` -MKVL`````````````$````+9K```HM@``<`$``!(``0#9:P``H!D"`,P!```2 -M``$`^FL`````````````$`````1L``!8I@,`#````!(``0`=;```M#<```0` -M```1`!``*6P``"R*```L````$@`!`$1L```L*0$`+````!(``0!/;```R+4` -M`&`````2``$`6FP``.!+`0`$````$0`.`&YL``"(7@(`=````!(``0!^;``` -M?*$``-P````2``$`F&P``/A4```@````$@`!`*9L``!\50``(````!(``0"U -M;```5'8```0````2``$`SFP``)"+``!(````$@`!`-IL``!4C@,`J`(``!(` -M`0#D;``````````````0````]VP`````````````$`````!R='=?8VUD+F,` -M)&$`)&0`+DQ#,0`N3$,R`"Y,04Y#2$]2,0!?7V9U;F-?7RXS-38Q-P!R='=? -M7!T`&-R8S,R -M7W)E=F5R'1?:V5Y`&)Y=&5?&ES=%!A8VME=``N3$,R.0`N3$,S,0`N3$,T-``N3$,T-@`N3$,T-P`N3$,T -M.0!#+C8Y-BXS-S$S,0!$969A=6QT0VAA;FYE;%!L86X`7U]F=6YC7U\N,S0V -M.3``7U]F=6YC7U\N,S@W-3D`7U]F=6YC7U\N,S4W,C,`0RXT-C(N,S0X,#`` -M=VQA;F5V96YT5]S=7-P96YD`')T=U]L871E7W)EF4`6-F9RYC`'!H>5]#86QC -M=6QA=&5":713:&EF=`!P:'E?1&)M5&]4>%!W`!?4$A97U-I;75L87)I -M='E#;VUP87)E`%]02%E?34%#4V5T=&EN9T-A;&EB7!E+C,V-3$1E"YC`&9F861D`!3=TQE9$]N`%-W3&5D3V9F`%-W3&5D0V]N=')O;$UO9&4U`')T;#@Q -M.3)C=5]X;6ET+F,`0U-75$-(+C0X,@!R=&PX,3DR8W5?#)N=6U?:0!R='=?=WA?%]G971?%]G971?0!R='=?=WA?0!R='=?=WA?%]W%]G971?96YC`')T=U]W>%]G971?;FEC:P`N3$,Q-30` -M%]S971?96YC7V5X=``N3$,Q-C<`+DQ#,38X`"Y,0S$V.0!R -M='=?=WA?%]S971?%]G971?%]S971?<')I=@`N3$,R,C8`+DQ#,C(W`"Y,0S(R.``N -M3$,R,CD`+DQ#,C,P`"Y,0S(S,0`N3$,R,S(`+DQ#,C,S`"Y,0S(S-``N3$,R -M,S4`+DQ#,C,V`"Y,0S(S-P`N3$,R-#``+DQ#,C0Q`"Y,0S(T,@!R='=?=WA? -M&UI=%]L:6YU>"YC`&UL;65?;&EN=7@N -M8P!B86-K=7!034M)1$QI"YC`$%43TU)0U])3D-?4D54 -M55).`')T=U]T>&9R86UE'1R85]C;61?:&1L -M`')T;#@Q.3)C7U!(65]397121E)E9P!F:6QP7V]P96X`<')O8U]G971?:'1? -M;W!T:6]N`')T;#@Q.3)C7U!(65]3971"96%C;VY(=U)E9P!R='=?=6YR96=I -M0!R96%D1FEL90!R='=?0!R='=?5]B0!R='=?:6YD:6-A=&5?=WA?87-S;V-?979E;G0`7W!S7V-L;W-E7U)&`')T -M=U]R96-V7V5N=')Y`')T=U]R96=I5]S=7-P96YD`')T=U]C -M71E`'5S8E]F7!E`')T=U]F5]C;60`2%1/;D%S%]S=&%T0!R='=?:7-?8V-K0!?%]S:6=N86P`&9R -M86UE`$%43TU)0U]!1$1?4D5455).`')T=U]A8V-E0!?'0`5]S -M=7-P96YD`')T=U]C`!?5]D;VUA:6X`4V5T2&%L1&5F5F%R.#$Y,D-5&ET`&QI;FME9%]S=&%T=7-?8VAK`&5F=7-E7U)E861%1G5S90!M;&UE97AT -M7W-T85]A9&1?979E;G1?8V%L;&)A8VL`:7-?8VQI96YT7V%S7!T`'!A&UI=%]T87-K;&5T -M`'!R;V-E&UI=`!R='=?F4X,3DR0P!02%E?4D93:&%D;W=2 -M96%D`')T=U]S8V%N7W1I;65O=71?:&%N9&QE<@!F:7)E7W=R:71E7TU!0U]C -M;60`8W)E871E7W!R;V-?96YT0!"4D]!1$-/35]/54DS`')T;#@Q.3)C7U!(65]'971(5U)E -M9T]R:6=I;F%L5F%L=64`%!O=V5R3&5V96PX,3DR -M0P!R='=?9V5T7W=P83)?:64`&UI=',`7W)T=U]F&UI=%]P%]A;&EV90!#25-#3U]/ -M54D`&UI=&9R86UE7V5X`')T;#@Q.3)C=5]C86Q?='AD97-C -M7V-H:W-U;0!P0!?7V%E86)I7VED:78`5&0P`')T=U]G971? -M=W!A7VEE`')T;#@Q.3)C=5]H86Q?9&5I;FET`')T=U]S96-G971M:6,`FUA;&QO8P!C:%]F -M%]B -M96%C;VY?8VUD`&MI;&Q?<&ED`')T=U]U;G)E9VES=&5R7V5A`!R9E]R96=?9'5M<`!02%E?4D93:&%D -M;W=#;VUP87)E06QL`')T=U]R97-E=%]S96-U7!R:78`4$A97U-E=$)7 -M36]D93@Q.3)#`&UO9%]T:6UE<@!F0!D;W=N`%]R='=?=W)I=&4X`')T -M=U]S=&%R=%]D&UI=%]P0!R97!O0!%1E5315]3:&%D;W=296%D`')T=U]G971?8V%P86)I;&ET -M>5]F&UI=',`5]H86YD;&5R`')T=U]B=7-Y7W1H -M5]C;61R0!R=&PX,3DR8U]%9G5S95!A&UI=%]S8VAE9'5L90!&:6QL -M2#)#0VUD`%]R='=?;75T97A?:6YI=`!R='=?=F-S7W1Y<&4`0!R='=?;69R965? -M5]E=F5N=`!I;FET7W1I;65R7VME>0!734U/;D%S0!U71E4F5A9`!N971I9E]C87)R:65R7V]F -M9@!$=6UP0D)$8F=0;W)T7SDR0U4`4$A97U)&-C`U,E]#;VYF:6&UI=%]D96QI=F5R>5]E;F%B;&5D7V9R86UE7!T`'=I9FE?9&5A8W1I=F%T95]U -M5]S=&%T=7,`71E7!E`')T=U]F -M0!D:7-C;VYN96-T7VAD;`!R='=?9V5T7W-T -M85]P96YD:6YG`')T=U]C0!D979?&UI=',`8V]M<&QE=&5? -M86YD7V5X:70`%!O=V5R -M`%]?:VUA;&QO8P!R='=?:F]I;E]T:6UE;W5T7VAA;F1L97(`5]L;70`0V]N -#include -#include -#include - -#include "wifi_power.h" - -/* - * rtw_channel_plan : The initialization parameter of wifi channel, - * Allow number is "0" "2" and "5". - * 0 => 11 ( channel 1 ~ 11 is SCAN_ACTIVE ) - * 2 => 13 ( channel 1 ~ 13 is SCAN_ACTIVE ) - * 5 => 14 ( channel 1 ~ 14 is SCAN_ACTIVE ) - * default number is "2". - */ -char init_channel_plan = 2; - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -/* - * GPIO to control LDO/DCDC. - * - * 用于控制WIFI的电源,通常是3.3V和1.8V,可能1.2V也在其中。 - * - * 如果是扩展IO,请参考下面的例子: - * POWER_USE_EXT_GPIO, 0, 0, 0, PCA9554_Pin1, GPIO_HIGH - */ -struct wifi_power power_gpio = -{ - //POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 - - // RBOX - //POWER_USE_GPIO, POWER_GPIO_IOMUX, - //GPIO5D6_SDMMC1PWREN_NAME, GPIO5H_GPIO5D6, RK29_PIN5_PD6, GPIO_HIGH - - /*// YIFANG M803 - POWER_USE_GPIO, 0, - 0, 0, GPIO_WIFI_POWER, GPIO_HIGH - */ - //SDK - POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 -}; - -/* - * GPIO to control WIFI PowerDOWN/RESET. - * - * 控制WIFI的PowerDown脚。有些模组PowerDown脚是和Reset脚短接在一起。 - */ -struct wifi_power power_save_gpio = -{ - POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 -}; - -/* - * GPIO to reset WIFI. Keep this as NULL normally. - * - * 控制WIFI的Reset脚,通常WiFi模组没有用到这个引脚。 - */ -struct wifi_power power_reset_gpio = -{ - POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 -}; - -/* - * 在WIFI被上电前,会调用这个函数。 - */ -void wifi_turn_on_callback(void) -{ -} - -/* - * 在WIFI被下电后,会调用这个函数。 - */ -void wifi_turn_off_callback(void) -{ -} - -/* - * If external GPIO chip such as PCA9554 is being used, please - * implement the following 2 function. - * - * id: is GPIO identifier, such as GPIOPortF_Pin0, or external - * name defined in struct wifi_power. - * sens: the value should be set to GPIO, usually is GPIO_HIGH or GPIO_LOW. - * - * 如果有用扩展GPIO来控制WIFI,请实现下面的函数: - * 函数的功能是:控制指定的IO口id,使其状态切换为要求的sens状态。 - * id : 是IO的标识号,以整数的形式标识。 - * sens: 是要求的IO状态,为高或低。 - */ -void wifi_extgpio_operation(u8 id, u8 sens) -{ - //pca955x_gpio_direction_output(id, sens); -} - -/* - * 在系统中如果要调用WIFI的IO控制,将WIFI下电,可以调用如下接口: - * void rockchip_wifi_shutdown(void); - * 但注意需要在宏WIFI_GPIO_POWER_CONTROL的控制下。 - */ - -#endif /* WIFI_GPIO_POWER_CONTROL */ - diff --git a/drivers/net/wireless/rtl8192c/wifi_power.h b/drivers/net/wireless/rtl8192c/wifi_power.h deleted file mode 100644 index be89742c471f..000000000000 --- a/drivers/net/wireless/rtl8192c/wifi_power.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * wifi_power.h - * - * WIFI power control. - * - * Yongle Lai - */ - -#ifndef WIFI_POWER_H -#define WIFI_POWER_H - -#include - -#define DONT_SWITCH_USB 0 /* Don't switch USB automaticately. */ -#define WIFI_USE_OTG 1 /* WiFi will be connected to USB OTG. */ -#define WIFI_USE_HOST11 2 /* WiFi will be connected to USB HOST 1.1. */ - -#define WIFI_USE_IFACE WIFI_USE_HOST11 /* Select USB Controler */ -#define WIFI_GPIO_POWER_CONTROL 1 /* Enable GPIO Control Power */ - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) -#include -#include -#else -#include -#include -#endif - -#define WIFI_CHIP_MV8686 0 -#define WIFI_CHIP_AR6002 1 -#define WIFI_CHIP_BCM4319 2 -#define WIFI_CHIP_NRX700 3 -#define WIFI_CHIP_RT3070 4 -#define WIFI_CHIP_RTL8192C 5 - -#define POWER_NOT_USE_GPIO 0 -#define POWER_USE_GPIO 1 -#define POWER_USE_EXT_GPIO 2 /* External GPIO chip is used, such as PCA9554. */ - -#define POWER_GPIO_NOT_IOMUX 0 -#define POWER_GPIO_IOMUX 1 - -#define GPIO_SWITCH_OFF 0 -#define GPIO_SWITCH_ON 1 - -struct wifi_power -{ - u8 use_gpio; /* If uses GPIO to control wifi power supply. 0 - no, 1 - yes. */ - u8 gpio_iomux; /* If the GPIO is iomux. 0 - no, 1 - yes. */ - char *iomux_name; /* IOMUX name */ - u8 iomux_value; /* IOMUX value - which function is choosen. */ - u8 gpio_id; /* GPIO number */ - u8 sensi_level; /* GPIO sensitive level. */ -}; - -int wifi_turn_on_card(int module); -int wifi_turn_off_card(void); -int wifi_reset_card(void); -void wifi_extgpio_operation(u8 id, u8 sens); - -void rockchip_wifi_shutdown(void); - -#endif /* WIFI_GPIO_POWER_CONTROL */ - -#define WIFI_NETWORK_BUSY 0 -#define WIFI_NETWORK_IDLE 1 - -int wifi_power_save_init(void); -int wifi_power_save_exit(void); -int wifi_power_save_stop(void); -int wifi_power_save_state(void); -void wifi_power_save_suspend(void); -void wifi_power_save_resume(void); -int wifi_power_save_register_callback(int (*callback)(int status)); - -void wifi_turn_on_callback(void); -void wifi_turn_off_callback(void); - -/* usb wifi */ -int wifi_activate_usb(void); -int wifi_deactivate_usb(void); -void wifi_usb_init(void); - -#endif /* WIFI_POWER_H */ - diff --git a/drivers/net/wireless/rtl8192c/wifi_power_ops.c b/drivers/net/wireless/rtl8192c/wifi_power_ops.c deleted file mode 100644 index 4096bdac15fd..000000000000 --- a/drivers/net/wireless/rtl8192c/wifi_power_ops.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * wifi_power.c - * - * Yongle Lai @ Rockchip Fuzhou @ 20100303. - * - * Power control for WIFI module. - * - * There are Power supply and Power Up/Down controls for WIFI typically. - */ -#include -#include -#include -#include - -#include "wifi_power.h" - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) -#include -#include -#else -#include -#include -#endif - - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -extern struct wifi_power power_gpio; -extern struct wifi_power power_save_gpio; -extern struct wifi_power power_reset_gpio; - -#define OS_IOMUX(name, value) rk29_mux_api_set((name), (value)); - -int wifi_gpio_operate(struct wifi_power *gpio, int flag) -{ - int sensitive; - - if (gpio->use_gpio == POWER_NOT_USE_GPIO) - return 0; - - if (gpio->gpio_iomux == POWER_GPIO_IOMUX) - { - OS_IOMUX(gpio->iomux_name, gpio->iomux_value); - } - - if (flag == GPIO_SWITCH_ON) - sensitive = gpio->sensi_level; - else - sensitive = 1 - gpio->sensi_level; - - if (gpio->use_gpio == POWER_USE_EXT_GPIO) - { - wifi_extgpio_operation(gpio->gpio_id, sensitive); - } - else - { - int ret; - - ret = gpio_request(gpio->gpio_id, NULL); - if (ret != 0) - printk("Request GPIO for WIFI POWER error!\n"); - - gpio_direction_output(gpio->gpio_id, sensitive); - gpio_set_value(gpio->gpio_id, sensitive); - - gpio_free(gpio->gpio_id); - } - - return 0; -} - -/* - * WiFi power up sequence - */ -int wifi_turn_on_rtl8192c_card(void) -{ - wifi_gpio_operate(&power_gpio, GPIO_SWITCH_ON); - if (power_gpio.use_gpio != POWER_NOT_USE_GPIO) - msleep(1000); - - return 0; -} - -int wifi_turn_on_card(int module) -{ - wifi_turn_on_callback(); - - wifi_turn_on_rtl8192c_card(); - - return 0; -} - -int wifi_turn_off_card(void) -{ - wifi_gpio_operate(&power_gpio, GPIO_SWITCH_OFF); - msleep(5); - - wifi_turn_off_callback(); - - return 0; -} - -void rockchip_wifi_shutdown(void) -{ - printk("rockchip_wifi_shutdown....\n"); - - wifi_turn_off_card(); -} -EXPORT_SYMBOL(rockchip_wifi_shutdown); - -#endif /* WIFI_GPIO_POWER_CONTROL */ - diff --git a/drivers/net/wireless/rtl8192c/wifi_power_usb.c b/drivers/net/wireless/rtl8192c/wifi_power_usb.c deleted file mode 100644 index c979cc34958c..000000000000 --- a/drivers/net/wireless/rtl8192c/wifi_power_usb.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * wifi_power.c - * - * Power control for WIFI module. - * - * There are Power supply and Power Up/Down controls for WIFI typically. - */ -#include -#include -#include -#include - -#include "wifi_power.h" - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -int wifi_change_usb_mode = 0; -int usb_wifi_status = 0; - -void wifi_usb_init(void) -{ - wifi_change_usb_mode = 0; - usb_wifi_status = 0; -} - -#if (WIFI_USE_IFACE == WIFI_USE_OTG) - -#define USB_NORMAL 0 -#define USB_FORCE_HOST 1 -#define USB_FORCE_DEVICE 2 - -extern int usb_force_usb_for_wifi(int mode); - -/* - * Change USB mode to HOST. - */ -int wifi_activate_usb(void) -{ - wifi_turn_on_card(WIFI_CHIP_RTL8192C); - - wifi_change_usb_mode = usb_force_usb_for_wifi(USB_FORCE_HOST); - msleep(1000); - - usb_wifi_status = 1; - - return 0; -} - -/* - * Change USB mode to be original. - */ -int wifi_deactivate_usb(void) -{ - if (wifi_change_usb_mode == 1) - { - usb_force_usb_for_wifi(USB_FORCE_DEVICE); - msleep(1000); - usb_force_usb_for_wifi(USB_NORMAL); - msleep(1000); - } - wifi_turn_off_card(); - - usb_wifi_status = 0; - - return 0; -} - -#elif (WIFI_USE_IFACE == WIFI_USE_HOST11) - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) -extern int usb_switch_usb_host11_for_wifi(int enabled); -#endif - -int wifi_deactivate_usb(void) -{ -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) - usb_switch_usb_host11_for_wifi(0); - msleep(1000); -#endif - - wifi_turn_off_card(); - msleep(100); - - return 0; -} - -int wifi_activate_usb(void) -{ - wifi_turn_on_card(WIFI_CHIP_RTL8192C); - msleep(100); - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) - usb_switch_usb_host11_for_wifi(1); - msleep(1000); -#endif - - return 0; -} - -#else - -int wifi_deactivate_usb(void) -{ - wifi_turn_off_card(); - msleep(1000); - return 0; -} - -int wifi_activate_usb(void) -{ - wifi_turn_on_card(WIFI_CHIP_RTL8192C); - msleep(1000); - return 0; -} -#endif - -#endif /* WIFI_GPIO_POWER_CONTROL */ - diff --git a/drivers/net/wireless/rtl8192c/wifi_version.h b/drivers/net/wireless/rtl8192c/wifi_version.h deleted file mode 100755 index 1c05d2a7d1cf..000000000000 --- a/drivers/net/wireless/rtl8192c/wifi_version.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Yongle Lai @ Rockchip - */ -#ifndef WIFI_BCM4319_VERSION_H -#define WIFI_BCM4319_VERSION_H - -/* - * Broadcom BCM4319 driver version. - */ -#define RTL8192_DRV_VERSION "3.10" - -#endif /* WIFI_BCM4319_VERSION_H */ - From ba886aaf438aaf00a836a32fe21f02a69b3272ba Mon Sep 17 00:00:00 2001 From: yangkai Date: Thu, 22 Sep 2011 15:51:08 +0800 Subject: [PATCH 141/150] fix msc MACRO MAX_UNFLUSHED_PACKETS use --- drivers/usb/gadget/f_mass_storage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index e5efee14a184..072ae172d05f 100755 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -1079,7 +1079,7 @@ static int do_write(struct fsg_dev *fsg) amount_left_to_write -= nwritten; fsg->residue -= nwritten; -#ifdef MAX_UNFLUSHED_BYTES +#ifdef MAX_UNFLUSHED_PACKETS curlun->unflushed_packet ++; if (curlun->unflushed_packet >= MAX_UNFLUSHED_PACKETS) { fsync_sub(curlun); From 1d7eb49758a74f4cb89e27ab5fd29508454a157c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Thu, 22 Sep 2011 16:00:38 +0800 Subject: [PATCH 142/150] gpu : force gcvSURF_TILE_STATUS use contiguous memory --- drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h | 8 +++----- .../staging/rk29/vivante/hal/kernel/gc_hal_kernel.c | 10 +++++++++- .../vivante/hal/os/linux/kernel/gc_hal_kernel_os.c | 7 ++++--- 3 files changed, 16 insertions(+), 9 deletions(-) mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h old mode 100644 new mode 100755 index d6baf688680a..72d8086fcf2c --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal_options.h @@ -304,14 +304,12 @@ /* - dkm : gcdPAGE_ALLOC_LIMIT & gcdPAGE_ALLOC_LIMIT_SIZE + dkm : gcdPAGE_ALLOC_LIMIT - gckOS_AllocatePagedMemoryExϵͳpageĴСϵͳpageʱᵼϵͳ - gcdPAGE_ALLOC_LIMIT Page - gcdPAGE_ALLOC_LIMIT_SIZE PageĴС,λΪM + gckOS_AllocatePagedMemoryExϵͳpage̫ϵͳ䲻ʱᵼϵͳ(᲻ͣflush cache) + µںѾһ */ #define gcdPAGE_ALLOC_LIMIT 0 -#define gcdPAGE_ALLOC_LIMIT_SIZE 0 /* diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c index f76834c6d5ed..ffb10bca4d1f 100755 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel.c @@ -290,6 +290,11 @@ _AllocateMemory( default: break; } + +#if (0==gcdPAGE_ALLOC_LIMIT) + // dkm : force gcvSURF_TILE_STATUS use contiguous memory + if(gcvSURF_TILE_STATUS == Type) pool = gcvPOOL_CONTIGUOUS; +#endif do { @@ -388,7 +393,10 @@ _AllocateMemory( while ((*Pool == gcvPOOL_DEFAULT) || (*Pool == gcvPOOL_LOCAL) || (*Pool == gcvPOOL_UNIFIED) - || ((*Pool == gcvPOOL_SYSTEM) && (pool==gcvPOOL_CONTIGUOUS)) +#if (0==gcdPAGE_ALLOC_LIMIT) + // dkm : let gcvPOOL_SYSTEM can use contiguous memory + || ((*Pool == gcvPOOL_SYSTEM) && (pool==gcvPOOL_CONTIGUOUS)) +#endif ); if (gcmIS_SUCCESS(status)) diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c index d5bf1f83cea9..ee93a1c4c40f 100755 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -3019,16 +3019,17 @@ gceSTATUS gckOS_AllocatePagedMemoryEx( { // dkm: gcdPAGE_ALLOC_LIMIT #if gcdPAGE_ALLOC_LIMIT - if( (g_pages_alloced + numPages) > (256*gcdPAGE_ALLOC_LIMIT_SIZE) ) { +#define PAGE_ALLOC_LIMIT_SIZE 0 + if( (g_pages_alloced + numPages) > (256*PAGE_ALLOC_LIMIT_SIZE) ) { //printk("full %d! \n", g_pages_alloced); addr = NULL; } else { - addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA | __GFP_NOWARN, GetOrder(numPages)); + addr = (char *)__get_free_pages(GFP_ATOMIC | GFP_DMA | __GFP_NOWARN | __GFP_NO_KSWAPD, GetOrder(numPages)); if(addr) { g_pages_alloced += numPages; //printk("alloc %d / %d \n", numPages, g_pages_alloced); } else { - printk("gpu : alloc %d fail! (%d/%d)\n", numPages, g_pages_alloced, (256*gcdPAGE_ALLOC_LIMIT_SIZE) ); + printk("gpu : alloc %d fail! (%d/%d)\n", numPages, g_pages_alloced, (256*PAGE_ALLOC_LIMIT_SIZE) ); } } #else From eb414ee121bbd1326c05bed7758babf40e5bcc32 Mon Sep 17 00:00:00 2001 From: xbw Date: Thu, 22 Sep 2011 17:04:20 +0800 Subject: [PATCH 143/150] Strengthen the signal lock in sdcard driver --- drivers/mmc/host/rk29_sdmmc.c | 94 +++++++++++++++++++++++++++++------ 1 file changed, 80 insertions(+), 14 deletions(-) diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 488149d41ba4..d2b735764cf3 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.08 The last modify date is 2011-09-21,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.09 The last modify date is 2011-09-22,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -657,6 +657,7 @@ static int rk29_sdmmc_start_command(struct rk29_sdmmc *host, struct mmc_command host->cmd = cmd; host->old_cmd = cmd->opcode; + host->errorstep = 0; rk29_sdmmc_write(host->regs, SDMMC_CMDARG, cmd->arg); // write to SDMMC_CMDARG register rk29_sdmmc_write(host->regs, SDMMC_CMD, cmd_flags | SDMMC_CMD_START); // write to SDMMC_CMD register @@ -743,6 +744,8 @@ static int rk29_sdmmc_wait_unbusy(struct rk29_sdmmc *host) static void send_stop_cmd(struct rk29_sdmmc *host) { + int ret; + mod_timer(&host->request_timer, jiffies + msecs_to_jiffies(RK29_SDMMC_SEND_START_TIMEOUT+600)); host->stopcmd.opcode = MMC_STOP_TRANSMISSION; @@ -761,7 +764,14 @@ static void send_stop_cmd(struct rk29_sdmmc *host) rk29_sdmmc_wait_unbusy(host); - rk29_sdmmc_start_command(host, &host->stopcmd, host->cmdr); + ret = rk29_sdmmc_start_command(host, &host->stopcmd, host->cmdr); + if(SDM_SUCCESS != ret) + { + rk29_sdmmc_start_error(host); + + host->state = STATE_IDLE; + host->complete_done = 4; + } } static void rk29_sdmmc_dma_cleanup(struct rk29_sdmmc *host) @@ -965,7 +975,7 @@ static int rk29_sdmmc_prepare_write_data(struct rk29_sdmmc *host, struct mmc_dat } else { - xbwprintk(3, "%s..%d... trace data, ======xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name); + xbwprintk(7, "%s..%d... trace data, ======xbw=[%s]====\n", __FUNCTION__, __LINE__, host->dma_name); output = rk29_sdmmc_submit_data_dma(host, data); if(output) { @@ -1168,13 +1178,13 @@ static void rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *dat rk29_sdmmc_write(host->regs, SDMMC_BYTCNT,data->blksz*data->blocks); rk29_sdmmc_write(host->regs, SDMMC_BLKSIZ,data->blksz); - xbwprintk(3, "%s..%d... trace data, CMD%d, data->blksz=%d, data->blocks=%d ======xbw=[%s]====\n", \ - __FUNCTION__, __LINE__, host->cmd->opcode,data->blksz, data->blocks, host->dma_name); + xbwprintk(3, "%s..%d..CMD%d(arg=0x%x), data->blksz=%d, data->blocks=%d ==xbw=[%s]==\n", \ + __FUNCTION__, __LINE__, host->cmd->opcode,host->cmd->arg,data->blksz, data->blocks, host->dma_name); if (data->flags & MMC_DATA_WRITE) { host->cmdr |= (SDMMC_CMD_DAT_WRITE | SDMMC_CMD_DAT_EXP); - xbwprintk(3, "%s..%d... write data, len=%d ======xbw=[%s]====\n", \ + xbwprintk(7, "%s..%d... write data, len=%d ======xbw=[%s]====\n", \ __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name); ret = rk29_sdmmc_prepare_write_data(host, data); @@ -1182,7 +1192,7 @@ static void rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *dat else { host->cmdr |= (SDMMC_CMD_DAT_READ | SDMMC_CMD_DAT_EXP); - xbwprintk(3, "%s..%d... read data len=%d ======xbw=[%s]====\n", \ + xbwprintk(7, "%s..%d... read data len=%d ======xbw=[%s]====\n", \ __FUNCTION__, __LINE__, data->blksz*data->blocks, host->dma_name); ret = rk29_sdmmc_prepare_read_data(host, data); @@ -1649,6 +1659,9 @@ static void rk29_sdmmc_dealwith_timeout(struct rk29_sdmmc *host) static void rk29_sdmmc_INT_CMD_DONE_timeout(unsigned long host_data) { struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data; + unsigned long iflags; + + spin_lock_irqsave(&host->lock, iflags); if(STATE_SENDING_CMD == host->state) { @@ -1660,6 +1673,7 @@ static void rk29_sdmmc_INT_CMD_DONE_timeout(unsigned long host_data) rk29_sdmmc_dealwith_timeout(host); } + spin_unlock_irqrestore(&host->lock, iflags); } @@ -1667,6 +1681,9 @@ static void rk29_sdmmc_INT_CMD_DONE_timeout(unsigned long host_data) static void rk29_sdmmc_INT_DTO_timeout(unsigned long host_data) { struct rk29_sdmmc *host = (struct rk29_sdmmc *) host_data; + unsigned long iflags; + + spin_lock_irqsave(&host->lock, iflags); if( (host->cmdr & SDMMC_CMD_DAT_EXP) && (STATE_DATA_BUSY == host->state)) @@ -1679,6 +1696,8 @@ static void rk29_sdmmc_INT_DTO_timeout(unsigned long host_data) rk29_sdmmc_dealwith_timeout(host); } + spin_unlock_irqrestore(&host->lock, iflags); + } @@ -1921,10 +1940,10 @@ static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq) __FUNCTION__, __LINE__, host->state, host->cmd->opcode,mrq->cmd->opcode,mrq->cmd->arg, host->dma_name); } + host->new_mrq = mrq; spin_unlock_irqrestore(&host->lock, iflags); - host->new_mrq = mrq; rk29_sdmmc_start_request(mmc); #else @@ -2125,6 +2144,52 @@ static void rk29_sdmmc_init_card(struct mmc_host *mmc, struct mmc_card *card) } +static int rk29_sdmmc_clear_fifo(struct rk29_sdmmc *host) +{ + unsigned int timeout, value; + + if(RK29_CTRL_SDMMC_ID == host->pdev->id) + { + rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, 0xFFFFFFFF); + } + + //stop DMA + if(host->dodma) + { + rk29_sdmmc_stop_dma(host); + rk29_sdmmc_control_host_dma(host, FALSE); + host->dodma = 0; + } + + //Clean the fifo. + for(timeout=0; timeoutregs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY) + break; + + value = rk29_sdmmc_read(host->regs, SDMMC_DATA); + } + + /* reset */ + rk29_sdmmc_write(host->regs, SDMMC_CTRL,(SDMMC_CTRL_RESET | SDMMC_CTRL_FIFO_RESET )); + + timeout = 1000; + value = rk29_sdmmc_read(host->regs, SDMMC_CTRL); + while (( value & (SDMMC_CTRL_FIFO_RESET | SDMMC_CTRL_RESET)) && (timeout > 0)) + { + udelay(1); + timeout--; + value = rk29_sdmmc_read(host->regs, SDMMC_CTRL); + } + + if (timeout == 0) + { + host->errorstep = 0x0A; + return SDM_WAIT_FOR_FIFORESET_TIMEOUT; + } +} + + static const struct mmc_host_ops rk29_sdmmc_ops[] = { { @@ -2178,7 +2243,7 @@ static void rk29_sdmmc_request_end(struct rk29_sdmmc *host, struct mmc_command * { if(status & (SDMMC_INT_DCRC | SDMMC_INT_EBE)) { - cmd->data->error = -EILSEQ;;//mrq->data->error = -EILSEQ; + cmd->data->error = -EILSEQ; output = SDM_DATA_CRC_ERROR; host->errorstep = 0x16; } @@ -2425,8 +2490,9 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) struct mmc_data *data = host->cmd->data; enum rk29_sdmmc_state state = host->state; int pending_flag, stopflag; + unsigned long iflags; - spin_lock(&host->lock); + spin_lock_irqsave(&host->lock, iflags); state = host->state; pending_flag = 0; @@ -2581,7 +2647,7 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) unlock: if(0==host->complete_done) { - spin_unlock(&host->lock); + spin_unlock_irqrestore(&host->lock, iflags); return; } @@ -2590,13 +2656,13 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv) if(host->mrq && host->mmc->doneflag) { host->mmc->doneflag = 0; - spin_unlock(&host->lock); + spin_unlock_irqrestore(&host->lock, iflags); mmc_request_done(host->mmc, host->mrq); } else { - spin_unlock(&host->lock); + spin_unlock_irqrestore(&host->lock, iflags); } } @@ -2947,7 +3013,7 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) } else { - mmc->f_max = RK29_MAX_SDIO_FREQ;//SDHC_FPP_FREQ / 2; + mmc->f_max = RK29_MAX_SDIO_FREQ; } #endif From df83454810391c16e3a5b375d538f5ae0b61f092 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 21 Sep 2011 19:14:25 +0800 Subject: [PATCH 144/150] rk29_phone:change voltage unit to uV while reporting event --- drivers/power/wm831x_power.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/power/wm831x_power.c b/drivers/power/wm831x_power.c index 8cdb0a3dfc52..53946c136eb5 100755 --- a/drivers/power/wm831x_power.c +++ b/drivers/power/wm831x_power.c @@ -620,7 +620,7 @@ static int wm831x_bat_get_prop(struct power_supply *psy, break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: //ret = wm831x_power_read_voltage(wm831x, WM831X_AUX_BATT, val); - val->intval = wm831x_power->batt_info.voltage; + val->intval = wm831x_power->batt_info.voltage*1000;//uV break; case POWER_SUPPLY_PROP_HEALTH: //ret = wm831x_bat_check_health(wm831x, &val->intval); From 3d5e55646746d4d1ef2f7f66097bd4a7b03623ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B1=E5=BB=BA=E6=96=8C?= Date: Sat, 24 Sep 2011 10:10:50 +0800 Subject: [PATCH 145/150] wm8994: fix on callint the soundrecord a bug --- sound/soc/codecs/wm8994.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 65892019b8df..629ea11c62bf 100755 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -2564,9 +2564,14 @@ static int wm8994_trigger(struct snd_pcm_substream *substream, // struct snd_soc_dai *codec_dai = machine->codec_dai; struct snd_soc_codec *codec = dai->codec; struct wm8994_priv *wm8994 = codec->private_data; + char last_route = wm8994->kcontrol.private_value & 0xff; if(wm8994_current_mode >= wm8994_handsetMIC_to_baseband_to_headset && wm8994_current_mode != null) return 0; + if((last_route == SPEAKER_INCALL || last_route == EARPIECE_INCALL + || last_route == HEADSET_INCALL || BLUETOOTH_SCO_INCALL) + && wm8994_current_mode == wm8994_record_add) + return 0; // DBG("%s::%d status = %d substream->stream '%s'\n",__FUNCTION__,__LINE__, // cmd, substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? "PLAYBACK":"CAPTURE"); From b18438608c399d359cec7e5ca1db3e2125850d38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Sat, 24 Sep 2011 15:02:54 +0800 Subject: [PATCH 146/150] rk29: sdk: gpu: Reduce the reserved memory to 16M --- arch/arm/mach-rk29/board-rk29-phonesdk.c | 2 +- arch/arm/mach-rk29/board-rk29phonepadsdk.c | 2 +- arch/arm/mach-rk29/board-rk29sdk.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 5f8ee2921096..0388e09ea7e7 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -118,7 +118,7 @@ #else #define SDRAM_SIZE SZ_512M #endif -#define PMEM_GPU_SIZE SZ_64M +#define PMEM_GPU_SIZE SZ_16M #define PMEM_UI_SIZE SZ_32M #define PMEM_VPU_SIZE SZ_64M #define PMEM_CAM_SIZE PMEM_CAM_NECESSARY diff --git a/arch/arm/mach-rk29/board-rk29phonepadsdk.c b/arch/arm/mach-rk29/board-rk29phonepadsdk.c index 2d8f49ed3a2c..d380cf9b3c02 100755 --- a/arch/arm/mach-rk29/board-rk29phonepadsdk.c +++ b/arch/arm/mach-rk29/board-rk29phonepadsdk.c @@ -103,7 +103,7 @@ #else #define SDRAM_SIZE SZ_512M #endif -#define PMEM_GPU_SIZE SZ_64M +#define PMEM_GPU_SIZE SZ_16M #define PMEM_UI_SIZE SZ_32M #define PMEM_VPU_SIZE SZ_64M #define PMEM_CAM_SIZE PMEM_CAM_NECESSARY diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index f2339f06cea2..d340f5527bf2 100644 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -98,7 +98,7 @@ #else #define SDRAM_SIZE SZ_512M #endif -#define PMEM_GPU_SIZE SZ_64M +#define PMEM_GPU_SIZE SZ_16M #define PMEM_UI_SIZE (48 * SZ_1M) /* 1280x800: 64M 1024x768: 48M ... */ #define PMEM_VPU_SIZE SZ_64M #define PMEM_CAM_SIZE PMEM_CAM_NECESSARY From 2d2140071692dace1ce1540bb0539ec25d688327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Sat, 24 Sep 2011 17:19:55 +0800 Subject: [PATCH 147/150] modify the processing of 8188 driver wake up --- .../net/wireless/rtl8192c/include/autoconf.h | 2 +- .../rtl8192c/os_dep/linux/ioctl_linux.uu | 2456 ++++++++--------- .../wireless/rtl8192c/os_dep/linux/usb_intf.c | 6 +- .../rtl8192c/os_dep/linux/wifi_version.h | 2 +- 4 files changed, 1234 insertions(+), 1232 deletions(-) diff --git a/drivers/net/wireless/rtl8192c/include/autoconf.h b/drivers/net/wireless/rtl8192c/include/autoconf.h index d58240b12116..9949bc07ab83 100755 --- a/drivers/net/wireless/rtl8192c/include/autoconf.h +++ b/drivers/net/wireless/rtl8192c/include/autoconf.h @@ -58,7 +58,7 @@ #define SUPPORT_HW_RFOFF_DETECTED 1 #define CONFIG_LPS 1 -#define CONFIG_BT_COEXIST 1 +//#define CONFIG_BT_COEXIST 1 //befor link #define CONFIG_ANTENNA_DIVERSITY //after link diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu b/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu index 67a571925367..7bd6a80e031b 100644 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu @@ -1,5 +1,5 @@ begin 644 os_dep/linux/ioctl_linux.o -M?T5,1@$!`0````````````$`*``!```````````````DF@``````!30````` +M?T5,1@$!`0````````````$`*``!``````````````#LF0``````!30````` M`"@`$0`.`#`P0.)S,._F"0!3XS``0)(>_R^183!`XG,P[^8%`%/C5P!`DA[_ M+Y%!,$#B`RD.5L,)/E"``3 MXP(PH!,`,((5"P``&D``$^,!```:(``3XP(```H!,*#C`#""Y00``.H0`!/C @@ -11,13 +11,13 @@ MLS"1X0`P@N4``*#C!`#"Y1[_+^$$0"WEX$*0Y04PTN4``%/C!```"BHI`.,, M-`'C`R"$YP``H.,(``#J`#"2Y0$<0^(J*`#C`@!1X14`X(,!,,.3#"0!DP(P MA)<``*"3$`"]Z![_+^'@$I#E##0!XP,PD><`,(+E``"@XP0`PN4>_R_A!S"@ MXP`P@N4``*#C!`#"Y0$PH.,%,,+E'O\OX0``H.,``(+E!`#"Y0$PH.,%,,+E -M'O\OX1!`+>D(T$WBX$*0Y0X`D^@`,(WE!`"@X?\_#^,/,$#C4,4#XP_@H.$, +M'O\OX1!`+>D(T$WBX$*0Y0X`D^@`,(WE!`"@X?\_#^,/,$#C3,4#XP_@H.$, M\)3G``"@XPC0C>(0@+WH``#@XQ[_+^$``.#C'O\OX0``H.,>_R_A``"@XQ[_ M+^$``*#C'O\OX0``H.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A``"@ -MXQ[_+^$$0"WEX$*0Y6PPE.4!`!/C!P``&@`PH.,J)@/C`C#$YRLF`^,",,3G -M+"8#XP(PQ.<+``#J?#4!XP,0U.=^-0'C`R#4YWHU`>/3`)3A*S8#XP,`Q.G@4I#E`F"@X8@U`^,#$)7G`3!RX@`PH#,``%'C`3"#$P``4^,50.`3&@`` +MXQ[_+^$$0"WEX$*0Y6PPE.4!`!/C!P``&@`PH.,F)@/C`C#$YR/3`)3A)S8#XP,`Q.G@4I#E`F"@X80U`^,#$)7G`3!RX@`PH#,``%'C`3"#$P``4^,50.`3&@`` M&@!`DN4"`%3C$```B@11A>`$4(7B!#"VY0`PA>4`,`#C`#!`XP`@EN4$(8/G M````XP``0.,`$`#C`!!`XP0@H.$`,)7E_O__ZP!`H.,&``#J````XP``0.,` M$`#C`!!`XP0@H.'^___K`$"@XP0`H.%P@+WH$$`MZ>!"D.4#,`'B`P!3XPP` @@ -26,14 +26,14 @@ MYP-`H.$E``#J`@`1XPL```J4`)_E_O__ZP`PH.,4*P'C`C"$YP$@H.,0&P'C M`2"$Y]H?0>(!((3G`T"@X1<``.H!`!'C"@``"A`[`>,#,)3G`P!3XP!`H(,` M,*"3$"L!DP(PA)>H)P&3`C"$EP-`H)$*``#J!``1XP0```H```#C``!`X_[_ M_^L`0*#C`P``Z@```.,``$#C_O__ZQ5`X.,$`*#A$("]Z"P```!\````\$\M -MZ1S03>(`0*#A$Q"@XQ<@C>(8-0/C#^"@X0/PD.<```#C``!`X_[__^L7@-WE +MZ1S03>(`0*#A$Q"@XQ<@C>(4-0/C#^"@X0/PD.<```#C``!`X_[__^L7@-WE M`P!8XP``6!,`@*`3`8"@`P``6.,!@*`3`H"@`P!0H.,!<*#C`*``XP"@0.,` MD`#C`)!`XP!@`.,`8$#CQ`"?Y040H.'^___K!["@X0`PH..(`8WI!8"@X09P -MH.$$8*#A`T"@X08`H.$($*#A!""@X0`PX.-,Q0/C#^"@X0SPEN<`4*#ARS^@ +MH.$$8*#A`T"@X08`H.$($*#A!""@X0`PX.-(Q0/C#^"@X0SPEN<`4*#ARS^@ MX2,_H.$#((O@`R`"X@(P8^`!`%/C`@``&@H`H.$$$*#A_O__ZP<`H.$%$*#A M_O__ZP,P"^(!L(OB``!3XP$``!H)`*#A_O__ZP%`A.(!#%3CX?__&@A0H.$, M@)WE!D"@X0=@H.$(<)WE`7R'X@%0A>((`%7ASO__NAS0C>+PC[WH$`$``'!` -M+>D#0*#AX%*0Y04`H.$&`)/H_S\/XP\P0.-,Q0/C#^"@X0SPE><`4*#A!`"@ +M+>D#0*#AX%*0Y04`H.$&`)/H_S\/XP\P0.-(Q0/C#^"@X0SPE><`4*#A!`"@ MX0`0`.,`$$#C!2"@X?[__^L``*#C<("]Z/!/+>FKWTWB`G"@X0.`H.'@HI#E M:CT/X_\_3^,`0*#CJB^-XK-`@N%H/0_C_S]/X[-`@N&*#XWB!!"@X8`@H./^ M___K*`"-X@00H.$"+*#C_O__ZP`0E^6T8-?A#<"@X7\]S.,_,,/C"$"3Y090 @@ -83,11 +83,11 @@ MF`$``,`!``#8`0``X`$``*`!``#,`0``Z`$``.P!```T`0``\`$``/0!``#\ M`0``"`(``!0"```T`@``4`(``&@"``!P`@``?`(``(`"``"$`@``D`(``)@" M``#(`@``S`(``-0"``#8`@``X`(``.@"``#P02WI"-!-X@.`H.'@($(*#C_O__ZP(``.H$`(WB!!"@X_[__^N(-0/C`S"7YP%@=N(` +M`P``&@0`C>($(*#C_O__ZP(``.H$`(WB!!"@X_[__^N$-0/C`S"7YP%@=N(` M8*`S``!3XP%@AA,``%;C%4#@$RH``!H$0)WE``!4XP`PV`4$,(T%H`"?Y:`0 -MG^4$()WE_O__ZP0PG>4!`%/C"```&JPT`^,#,)?G``!3XQH```H'`*#A"1"@ -MXS/_+^$`0*#C%@``Z@(`4^,(```:K#0#XP,PE^<``%/C#P``"@<`H.$*$*#C -M,_\OX0!`H.,+``#J`P!3XP@``!JL-`/C`S"7YP``4^,$```*!P"@X0P0H.,S +MG^4$()WE_O__ZP0PG>4!`%/C"```&J@T`^,#,)?G``!3XQH```H'`*#A"1"@ +MXS/_+^$`0*#C%@``Z@(`4^,(```:J#0#XP,PE^<``%/C#P``"@<`H.$*$*#C +M,_\OX0!`H.,+``#J`P!3XP@``!JH-`/C`S"7YP``4^,$```*!P"@X0P0H.,S M_R_A`$"@XP```.H`0*#C!`"@X0C0C>+P@;WH"`,``"````#P12WIJ=]-XN"B MD.4`0*#C#$"-Y1!`C>440(WE:BT/X_\O3^,J'HWBLD"!X1PPC>4```#C``!` MXT`4G^4#(*#A_O__ZQQ@C>(`<`#C`'!`XPR`C>(#``#J#`!4XP8```H$4(CG @@ -121,19 +121,19 @@ MH./^___K`#"@XP\PQ>6T,-3A$`!3XU<``(H`$)3E#2"@X7\]PN,_,,/C"%"3 MY1!`D>(%0-0P`%"@,P``5>,%```:#0"@X1`@H./^___K``!0XT@``!H$``#J M#0"@X1`0H./^___K#4#@XT,``.H8`9_E$!&?Y10AG^4-,*#A_O__ZP8`H.$- M$*#A_O__ZP!`4.(Y```:^`"?Y?[__^OL`)_E\!"?Y0D@H./^___K`0!0XP@` -M`!K44)_E$'#5Y:@T`^,#<,;G!@"@X?[__^L14-7E53(#XP-0QN>P4)_E#7"@ +M`!K44)_E$'#5Y:0T`^,#<,;G!@"@X?[__^L14-7E43(#XP-0QN>P4)_E#7"@ MX04`H.$-$*#A$""@X_[__^L`,*#C#S#%Y0T`H.&4$)_E"2"@X_[__^L!`%#C -M&@``&H0`G^5L$)_E_O__ZP8`H.$!$*#C_O__ZZPT`^,#,);G``!3XP(```H& -M`*#A!Q"@XS/_+^%$4)_EJ#0#XP,@UN<0(,7E`'"@XP-PQN<&`*#A_O__ZU4R +M&@``&H0`G^5L$)_E_O__ZP8`H.$!$*#C_O__ZZ@T`^,#,);G``!3XP(```H& +M`*#A!Q"@XS/_+^%$4)_EI#0#XP,@UN<0(,7E`'"@XP-PQN<&`*#A_O__ZU$R M`^,#(-;G$2#%Y0-PQN<```#J#4#@XP0`H.$4T(WB\("]Z$0```#4`P`````` M`/@#```4!```(`0``'!`+>D(T$WB`&"@X0)0H.$#0*#A````XP``0.-4$9_E M`R"@X?[__^L$`*#A`!``XP`00.,$(*#C_O__ZP``4.,H```*M##5X00P0^)S M,/_FM##%X01`A.+@4I;E`3!#X@$`4^,#```*`@!3XP!`H!,(```:`P``Z@!` -MU.4P0$3B=$#OY@,``.H``-3E`1#4Y?[__^L`0*#A"@!4XS(``(I8,@/C`S#5 -MYP0`4^$N```*``!4XP(@H!-7,@,3`R#%%P$``!H%`*#A_O__ZU@R`^,#0,7G -M`$!4X@%`H!-6,@/C`T#%YR```.H$`*#A`!``XP`00.,$(*#C_O__ZP``4.,9 +MU.4P0$3B=$#OY@,``.H``-3E`1#4Y?[__^L`0*#A"@!4XS(``(I4,@/C`S#5 +MYP0`4^$N```*``!4XP(@H!-3,@,3`R#%%P$``!H%`*#A_O__ZU0R`^,#0,7G +M`$!4X@%`H!-2,@/C`T#%YR```.H$`*#A`!``XP`00.,$(*#C_O__ZP``4.,9 M```*M##5X00P0^*T,,7AX%*6Y0@@C>(`,*#C!#`BY00`A.(`$`#C`!!`X_[_ -M_^L$,)WE`0!3XPL``(I5(@/C`C#%YP1`G>4``%3C`"``XP`@0.,`,`#C`#!` +M_^L$,)WE`0!3XPL``(I1(@/C`C#%YP1`G>4``%3C`"``XP`@0.,`,`#C`#!` MXP,@H!$4`)_E%!"?Y?[__^L``*#C"-"-XG"`O>A8````;`0``&0```!P0"WI M`T"@X>`"D.4`$)/E_O__ZP!0H.$$`*#A`!``XP`00.,%(*#A_O__ZP``H.-P M@+WH\$,; M```*`0!5X\D"`!H'`*#A!A"@X7,@[^;^___K!P"@X080H.'^___K`""@X0`` M`.,``$#C!A"@X?[__^N\`@#J!P"@X080H.%S(/_F_O__ZP<`H.$&$*#A_O__ MZP`@H.$```#C``!`XP80H.'^___KKP(`Z@<`H.$&$*#A`R"@X?[__^L'`*#A -M!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__ZZ("`.H'`*#A!A"@X0`@X.-$ -M-0/C#^"@X0/PE^<`(*#A````XP``0.,&$*#A_O__ZY8"`.H'`*#A!A"@X0`@ -MX.-(Q0/C#^"@X0SPE^<'`*#A!A"@X0`@X.-$-0/C#^"@X0/PE^<`(*#A```` -MXP``0.,&$*#A_O__ZX0"`.H'`*#A!1"@X08@H.$`,.#C3,4#XP_@H.$,\)?G +M!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__ZZ("`.H'`*#A!A"@X0`@X./5 +M/:#C#^"@X0/PE^<`(*#A````XP``0.,&$*#A_O__ZY8"`.H'`*#A!A"@X0`@ +MX.-$Q0/C#^"@X0SPE^<'`*#A!A"@X0`@X./5/:#C#^"@X0/PE^<`(*#A```` +MXP``0.,&$*#A_O__ZX0"`.H'`*#A!1"@X08@H.$`,.#C2,4#XP_@H.$,\)?G M`#"@X0```.,``$#C!1"@X08@H.'^___K=@(`Z@`PC>4'`*#A!1"@X08@H.$` -M,.#C4,4#XP_@H.$,\)?G!P"@X040H.$&(*#A`##@XTS%`^,/X*#A#/"7YP`P +M,.#C3,4#XP_@H.$,\)?G!P"@X040H.$&(*#A`##@XTC%`^,/X*#A#/"7YP`P MH.$```#C``!`XP40H.$&(*#A_O__ZV`"`.H``%7C`""@`W@U`0,#(,<'6P(` M"@$`5>-9`@`:`2"@XW@U`>,#(,?G)$"=Y60`5.-D0*`C>34!XP-`Q^=0`@#J M"0!5X]<```H2``"*!`!5XTL```H'``"*`0!5XRT```HG```Z`@!5XS<```H# @@ -178,9 +178,9 @@ MX@X`D>A.`=7E``"-Y0```.,``$#C_O__ZP```.,``$#C#!;5Y0TFU>4.-M7E M_O__ZP```.,``$#C_!65Y?[__^L```#C``!`XP\6U>40)M7E_O__ZV]?A>(` M0*#C`&``XP!@0.,`,-7E``!3XP,```H&`*#A!!"@X;(@U>'^___K`4"$XD10 MA>(0`%3C]/__&J\!`.K@$-?EX2#7Y>(PU^7C`-?E``"-Y>0`U^4$`(WEY0#7 -MY0@`C>6@!I_E_O__ZZ,!`.HC0(WB!P"@X100H.,$(*#A#XP_@H.$#\)?G +MY0@`C>6@!I_E_O__ZZ,!`.HC0(WB!P"@X100H.,$(*#A%#4#XP_@H.$#\)?G M````XP``0.,C$-WE!B"@X?[__^L/$`;B(Q#-Y0```.,``$#C_O__ZP<`H.$4 -M$*#C!""@X10U`^,/X*#A`_"7YXL!`.H```#C``!`XXPU`^,#$)?GB#4#XP,@ +M$*#C!""@X1`U`^,/X*#A`_"7YXL!`.H```#C``!`XX@U`^,#$)?GA#4#XP,@ ME^?^___K@P$`Z@```.,``$#CE#0!XP,0E^<%.Z#C`R"7Y_[__^L```#C``!` MXR`U`>,#$-?G_O__ZW8!`.H```#C``!`XYPW`>.S$)?AGC=A^(HD(GB`*"@XP`P`.,` @@ -193,14 +193,14 @@ MG^7\%9;E_O__Z[@$G^4/%M;E$";6Y?[__^NL!)_ES!"6Y?[__^MO;X;B`%"@ MXP`PUN4``%/C`P``"AP`G>4%$*#ALB#6X?[__^L!4(7B1&"&XA``5>/T__\: M!P"@X000H.'^___K``!0X[[__PH!H(KB")")XB``6N.P__\:#2"@X7\]PN,_ M,,/C!""3Y0$@0N($((/E_O__ZP0!`.H```#C``!`XP,0H.'^___K!P"@X080 -MH.,D((WB(#4#XP_@H.$#\)?G^0``Z@``4^/W```:^`.?Y?[__^MX-0/C`S"7 -MYP``4^/Q```*!P"@X3/_+^'N``#J````XP``0.,<,@/C`Q"7Y_[__^OH``#J +MH.,D((WB'#4#XP_@H.$#\)?G^0``Z@``4^/W```:^`.?Y?[__^MT-0/C`S"7 +MYP``4^/Q```*!P"@X3/_+^'N``#J````XP``0.,8,@/C`Q"7Y_[__^OH``#J M````XP``0.,`$`#C`!!`X_[__^OB``#J`0!3XP`0`!,`$$`3G!.?!0```.,` -M`$#C_O__ZR1`G>53-@/C`T#'Y]<``.H``%/C`@``&@<`H.'^___KT@``Z@$` +M`$#C_O__ZR1`G>5/-@/C`T#'Y]<``.H``%/C`@``&@<`H.'^___KT@``Z@$` M4^,"```:!P"@X?[__^O-``#J`@!3X\L``!H'`*#A_O__Z\@``.H/`%/C%P`` -M&@<`H.$'$*#C(R"-XAPU`^,/X*#A`_"7YR0#G^4C$-WE_O__ZQP#G^7^___K +M&@<`H.$'$*#C(R"-XA@U`^,/X*#A`_"7YR0#G^4C$-WE_O__ZQP#G^7^___K M&`.?Y?[__^L4`Y_E_O__ZQ`#G^7^___K#`.?Y?[__^L(`Y_E_O__ZP0#G^7^ -M___KK@``Z@<`H.$'$*#C)""-XB`U`^,/X*#A`_"7YP<`H.$'$*#C(R"-XAPU +M___KK@``Z@<`H.$'$*#C)""-XAPU`^,/X*#A`_"7YP<`H.$'$*#C(R"-XA@U M`^,/X*#A`_"7YP```.,``$#C(Q#=Y?[__^N=``#J=F#OY@<`H.'%'J#C!B"@ MX?[__^L'`*#AQ1Z@X_[__^L`$*#A````XP``0./^___K!P"@X5@<`.,&(*#A M_O__ZP<`H.%8'`#C_O__ZP`0H.$```#C``!`X_[__^N%``#J!P"@X<4>H./^ @@ -218,7 +218,7 @@ MX_[__^L'`*#A3!0`X_[__^L`$*#A````XP``0./^___K!P"@X44>H./^___K M`!"@X0```.,``$#C_O__ZP(``.H```#C``!`X_[__^L``*#C+-"-XO"/O>BH M!P``)`<``$@'``!(4((WEX%*0Y0```.,``$#C_O__ZX@U`^,#()7G +M$P``H`,0@+WH\$\MZ5S03>(4((WEX%*0Y0```.,``$#C_O__ZX0U`^,#()7G M%!"=Y0$P<>(`,*`S``!2XP$P@Q,``%/C`$"@`QY@H`,%```*I```Z@8`H.'^ M___K`4"$XF4`5.,"```*;#"5Y2(-$^/W__\:`""@XQ0PG>6V(,/A%!"=Y;0P MT>$?`%/CE0``F@`0D>4-(*#A?SW"XS\PP^,(8)/E($"1X@9`U#``8*`S``!6 @@ -236,1207 +236,1207 @@ MH)KEJO__Z@T0H.%_/<'C/S##XP0@D^4!($+B!""#Y?[__^L4()WEM##2X2$` M4^,1``":``"2Y2``@.(-$*#A?SW!XS\PP^,(4)/E`4"0X@5`U#``4*`S``!5 MXP0``!H&$(+B`2"@X_[__^L``%#C`0``"A5`X.,```#J`$"@XP0`H.%(" -M0*#AX&*0Y;10TN$``%7CO0``"@`PDN4``%/CN@``"K:PTN$%<*#A!0"@X?[_ -M_^L`H%#B"T#@`[0```H`$)3E#2"@X7\]PN,_,,/C"("3Y0=0D>`(4-4P`("@ -M,P``6.,%```:"@"@X0<@H.'^___K``!0XZ@``!H&``#J``!7XP0```H*`*#A -M!Q"@X?[__^L-0.#CHP``Z@J0H.$`4)KE(@!5XQ5`X(.>``"*"("*XH`"G^6` -M$I_E_O__ZP<`5>-.```*"@``B@(`5>,6```*`@``B@``5>,0```*=0``Z@,` -M5>,F```*!@!5XW$``!HY``#J(`!5XU,```H"``"*'P!5XVL``!I&``#J(0!5 -MXU<```HB`%7C9@``&EX``.H8`I_E_O__ZV(``.H$,)CE`@!3XP@```H$`%/C -M"P``"@$`4^-;```:!@"@X0`0F.7^___K"`"(Y58``.H&`*#A`!"8Y?[__^L( -M`(CE40``Z@8`H.$`$)CE_O__ZP@`B.5,``#J!#"8Y0(`4^,(```*!`!3XPL` -M``H!`%/C10``&@8`H.$`$)CE""#8Y?[__^M```#J!@"@X0`0F.6X(-CA_O__ -MZSL``.H&`*#A`!"8Y0@@F.7^___K-@``Z@8`H.$`$-CE!"#8Y0`PX.-,Q0/C -M#^"@X0SPEN<(`(CE+0``Z@`0V.4$(-CE"#"8Y0`PC>4&`*#A`##@XU#%`^,/ -MX*#A#/"6YR,``.H4`9_E_O__ZP8`H.$H$*#C`""@XQ0U`^,/X*#A`_"6YQH` -M`.KT`)_E"!#:Y?[__^L&`*#A*1"@XP@@H.$4-0/C#^"@X0/PEN<0``#JT`"? -MY0@0VN7^___K!@"@X2H0H.,((*#A%#4#XP_@H.$#\);G!@``ZH0U`^,#,);G -M``!3XP(```H&`*#A,_\OX0@`RN5[L._F``!;XQ<``!H``)3E#2"@X7\]PN,_ -M,,/C"%"3Y0=`D.`%0-0P`%"@,P``5>,'0*`1`P``&@H0H.$'(*#A_O__ZP!` -MH.$``%3C!@``"@,``.H50.#C!`"@X0S0C>+PC[WH#4#@XP```.H`0*#C"@"@ -MX0<0H.'^___K]?__ZO`!``!T````U`P``!`-```D#0``0`T``/!'+>D0T$WB -MX%*0Y0-`H.$`,*#C"#"-Y;PPS>$`,(WEM##-X0T`H.$&$(3B!B"@X_[__^L` -M,)3E`0!3XR\``!H$`I_E_O__ZPT`H.$($(WB!B"@X_[__^L!`%#C50``"@!@ -MH.,-<*#A!H"@XW:0[^8&H*#A!@.%X"8,@.(5`(#B#1"@X0@@H.'^___K`0!0 -MXQ$``!JT`9_E_O__ZP:CH.$09@+C!@"*X```A>`+`(#B%!"$XA`@H./^___K -M"J"%X`9@BN`!0*#C!$#&Y020B>`4.@+C`Y#%YSD``.H!8(;B$`!6X^#__QHX -M``#J`""@XQ0Z`N,#(,7G`4"@XS```.H"`%/C'P``&D0!G^7^___K`$"@XPU@ -MH.$&<*#C!("@X00#A>`F#(#B%0"`X@T0H.$'(*#A_O__ZP$`4.,-```:!(.@ -MX1!&`N,$`(C@``"%X`4`@.(`$*#C!B"@X_[__^L(4(7@!$"%X``PH.,$,,3E -M`4"@XQ(``.H!0(3B$`!4X^7__QH-``#J`P!3XPD``!HF#(7B%`"`X@`0H.,! -M*Z#C_O__ZP`@H.,4.@+C`R#%YP%`H.,"``#J`$"@XP```.H!0*#C!`"@X1#0 -MC>+PA[WH%&H"XWP`G^4&$-7G_O__ZP8`U><0=@+C``.'X```A>`%`(#B#1"@ -MX08@H./^___K!@#5YP`#A^```(7@"P"`XA00A.(0(*#C_O__ZP8PU><#,X7@ -M!W"#X`$PH.,$,,?E!C#5YP$P@^)S,._F!C#%YQ``4^/=__\:I___ZE0-``!X -M#0``K`T``-0-``!P0"WI`D"@X>!BD.5L();E`0`2XP<``!I``!+C!0``&@`` -MH..T`,3AMC#4X0(Y@^.V,,3A<("]Z`90U.4``%7C!```"@0`5>,5`."#`5!% -MD@(``)IP@+WHL".V -M$,3A<("]Z%\NA>(,((+B`B&&X+0@TN&T(,3A``!2XQ@```I>'X7B`Q"!X@$2 -MAN!?7H7B#%"%X@51AN`#`*#A!!"!X@0@E>7^___KMB#4X;8@Q.$0.P'C`S"6 -MYP``4^,"*H(#MB#$`0``H`-P@+T(`0!3XP``H!,!*8(#MB#$`0``H`-P@+WH -M``"@X[0`Q.$"&8'CMA#$X7"`O>@0,*#CM##$X0H;@>.V$,3A``"@XW"`O>@` -M`*#CM`#$X0(9@>.V$,3A<("]Z!!`+>D``%/B!P``"@[`H..TP,+A`3"@X[8P -MPN$`$`#C`!!`XPP@H.'^___K``"@XQ"`O>AP0"WI`E"@X>!"D.5L()3E`0`2 -MXP(``!I``!+C`$#@`P@```KH8)3EM&#%X0,`H.'L$(3B!B"@X?[__^L!,*#C -MMC#%X0!`H.,$`*#A<("]Z'!`+>G@4I#E`D"@X0$PH..R,,3@!`"@X0`0H.,& -M(*#C_O__ZVPPE>4!`!/C`P``&D``$^,!```:$``3XP0```H$`*#AX!"%X@8@ -MH./^___K`P``Z@0`H.$`$*#C!B"@X_[__^L``*#C<("]Z/!!+>D@T$WB`F"@ -MX0-PH.'@0I#E````XP``0..V$-+A_O__ZP0`C>(`$*#C'""@X_[__^NV4-;A -M`@D5XP\```I``I_E_O__ZP$@H.,4.P'C`R"$YP`PH..L)P'C`C"$YU@@@N(" -M,(3G7"!"X@(PA.?:+X+B`C"$YP-`H.%^``#J_U`5X@4```H$`%7C%0#@@P&` -M19(!4*"3!@``FG<``.JP-P'C`X"4Y]P!G^4($*#A_O__ZP!0H..V$-;A`@H1 -MXPT```K$`9_E_O__ZP`PH.,4*P'C`C"$Y]LO0N(",(3G!"""X@(PA.=8((+B -M`C"$Y\,O@N(",(3G'P``Z@$)$>,/```*````XP``0./^___K`""@XQ0[`>,# -M((3G`3"@XZ@G`>,",(3GK",",(3G#0``Z@`` -M`.,``$#C_O__ZP`PH.,4*P'C`C"$YZ@G`>,",(3GK",",(3G"("-Y;0PUN$``%/C!@``"@4`4^,%,*"3#3"@@PPPC>4,,(/B -M!#"-Y2$``.H`,*#C##"-Y0$`5>,=```:L#7^___K`#"5Y04`4^,"```*#0!3XPH``!H$``#J`2"@XZPW -M`>,#((3G`$"@XQP``.H%(*#CK#('$*#A#""=Y?[__^L$`*#A -M!1"@X?[__^L``%#C!```&J@R`^,#,)3G``!3XUY`X`,````*`$"@XP0`H.$@ -MT(WB\(&]Z$@.``!<#@``=`X``.0.``#P1RWI`4"@X>!BD.4`,*#C(#"!Y1LP -MP>6^,M'A,#"#X@(`4^'8``"*!#"1Y0$`<^/5```:N"#1X?\_#^,#`%+AT0`` -M&B0PT>4#`%/CS@``BEY]AN(H<(?B#%"!X@4`H.$`$`#C`!!`X_[__^L``%#C -M4```&D`#G^7^___K`""@XQ0[`>,#((;G`3"@XZPG`>,",(;G6"""X@(PAN.Q```*!0!5XP6@ -MH),-H*"##)"*X@D`H.'^___K`%!0XJL```H%`*#A`!"@XQP@H./^___K"*"% -MY0"0A>4-`%KC!3"@`ZPG`0,",(8'6"""`@(PA@<",8CC!#"%Y0R@A>(*`*#A -M,!"$X@@@E>7^___K'##4Y0``4^,'```*@`*?Y?[__^L&`*#A!1"@X?[__^L` -M`%#CDP``"I```.ID`I_E_O__ZP,`6...``"*7C^(X@,P@^(#,H;@!`"#X@H0 -MH.$(()7E_O__ZU\^B.(,,(/B`S&&X`@@E>4$((/E!@"@X0<0H.$((*#A`#"@ -MX_[__^L`0*#C?```ZJ@W`>,#,);G`@!3XW(``!IL();E"#``XP$P0.,#,`+@ -M``!3XVP```I7#8;B&`"`XN`0AN+^___K`(!0XE````H%`*#AR!&?Y?[__^L` -M`%#C`#"@$^@PB!44.P'C`S"6YP8`4^,$`%,3K#,``HK@``"&X`0` -M@.(0$(CB"""@X_[__^LD`-3E#@"`X@`"BN```(;@!`"`XA@0B.(((*#C_O__ -MZP$PH.,;+*#C`C#&YR00U.6^+T+B`A"&YP8`H.$'$*#A)"#4Y?[__^L&`*#A -M_O__ZP!`4.(1```*!0"@X700G^7^___K``!0XP`PH!/H,(05%#L!XP,PEN<& -M`%/C!`!3$P8``!JL-P'C`S"6Y^PPA.4`0*#C`@``ZA5`X.,```#J`$"@XP0` -MH.'PA[WH`$"@XP```.I>0.#C!0"@X0D0H.'^___K]O__ZA@/``!`#P``5`\` -M`&0/``!T#P``?`\``/!'+>D`D*#A`J"@X0-@H.&VAP0"WI`%"@X0)`H.'@8I#EMC#2 -MX0,ZH.$C.J#A"@!3XP/QGY<*``#J3#H``$PZ``!,.@``3#H``)`Y``"X.0`` -M"#H``$PZ``!,.@``B#D``$PZ``!>0.#C+P``Z@`PDN4``%/C`2"@$PPV`A,# -M(,87`$"@$P!`H`,,-@(#`T#&!R4``.H4.P'C`S"6YP``4^,@```*`#"2Y0`` -M4^,=```*`2"@XQ0[`>,#((;G`$"@XZPW`>,#0(;G!#@!XP-`AN>H-P'C`T"& -MYQ`[`>,#0(;G$0``ZFPPEN4!`!/C"```"@8`H.'^___K-`"?Y300G^7^___K -M!@"@X?[__^L&`*#A_O__ZP4`H.$`$)3E5/+_ZP!`H.$```#J`$"@XP0`H.%P -M@+WHC`\``(@```#P3RWI%-!-X@!PH.$"0*#A`#"@XPPPC>4(,(WE`5"@X0,` -M4>$`$*`3`1"@`X``4N,!,*"1`3"!@P``4^,&```*`""@X_@X`>,#(,#G`@!1 -MX0)`H!$50.`#R@``Z@``4N,`0*`#QP``"@2PH.$$`*#A_O__ZP!@4.(+0.`# -MP0``"@8`H.$%$*#A"R"@X?[__^L#`%3C`$#@D\<``)H$4*#A!@"@X000H.$, -M((WB"#"-XO[__^L!`%#C!0``&@(@H..H-P'C`R"'YP0@H.,0.P'C`R"'YP8` -MH.$%$*#A#""-X@@PC>+^___K`0!0XP4``!H"(*#CJ#,%\9^7,0``ZKP[``#8.P``1#P``"P\``!$/``` -M1#P``$0\``#T.P``1#P``$0\``!$/```1#P``$0\``!$/```1#P``!`\```` -M(*#C!#@!XP,@A^,#((?G`""@XQ0[ -M`>,#((?G$P``Z@(@H.,$.`'C`R"'YP0@H.,4.P'C`R"'YPP``.H$(*#C!#@! -MXP,@A^<&(*#C%#L!XP,@A^<%``#J!2"@XP0X`>,#((?G`""@XQ0[`>,#((?G -M"%"=Y0%01>(/`%7C!?&?ES(``.J8/```M#P``"0]```(/0``)#T``"0]```D -M/0``T#P``"0]```D/0``)#T``"0]```D/0``)#T``"0]``#L/````""@XZPW -M`>,#((?G`2"@XQ0[`>,#((?G3P``Z@$@H..L-P'C`R"'YP`@H.,4.P'C`R"' -MYT@``.H"(*#CK#,#((?G -M!B"@XQ0[`>,#((?G.@``Z@4@H..L-P'C`R"'YP`@H.,4.P'C`R"'YS,``.H` -M(*#C^#@!XP,@Q^<`,`#C`#!`XY@PD^4$,(WE,@``Z@6`H.$%H(;@`##:Y=T` -M4^,:```:`@"%X@``AN`$$(WB!""@X_[__^L!`%#C$P``&K``G^7^___K"H"@ -MX0$@VN4"((+B`@Q2XP(LH*/\.@'C`R"'YV,-A^(Y`(#B"A"@X?[__^OX.`'C -M`2"@XP,@Q^=T`)_E_O__ZP!`H.,5``#J"("&X`DPV.<",(/B`U"%X'50_^8% -M`%3AV/__B@!`H.,,``#J!`"@X130C>+PC[WH`""@X_@X`>,#(,?G`#``XP`P -M0..8,)/E!#"-Y0!0H.,!D*#CR?__Z@8`H.$+$*#A_O__Z^[__^JP#P``O`\` -M`!!`+>G@`I#E`Q"@X;0@TN$%___K$("]Z/!%+>D,T$WB`E"@X0`PH.,$,(WE -MX&*0Y;(PS>$!,,WE;#"6Y0$`$^,"```:0``3XP``X`-9```*5#&6Y5D/AN(M -M$*#C!""-X@PP0^+^___K`'!0XA````H$0)WE``!4XPT```H'0*#A`@"-X@40 -MA^("(*#C_O__ZP(P].4!(-3E`C2#X=.@X.=@`!/C`'"@`P%PH!,!@*#C`@`` -MZ@!PH.,'H*#A!X"@X4`QUN4!($/B5!,=+E`2""X@$00^)Q$._F_0!1X_7__YH! -M`%CC(P``&@8`H.$3$*#C`2"-XA@U`^,/X*#A`_"6YP%`W>4#`%3C"0``&@`` -M6N,#```*``!7XY9PH!.'<*`##0``Z@``5^-(<*`307"@`PD``.H``%KC!``` -M"@XQ`.,``%?C`W"@`4M_H!,"``#J``!7XY!PH!."<*`#AW"@X2`Q"N,',$#C -MDP<#X``PA>4``*#C!```ZB`Q"N,',$#CDP0#X``PA>4``*#C#-"-XO"%O>AP -M0"WI(-!-XN!BD.4`0)+E!.#2Y0W`H.$P,9_E#P"3Z`<`K.@`,,SE`0!TXS`` -M``JD0J#AQ3H%XWPZ0..3)(/@HS.@X6X`4^,%4*`#*0``"@\``(HW`%/C`E"@ -M`R4```H%``"*"@!3XP!0H`,A```*%`!3XQX``!H5``#J/`!3XP-0H`,;```* -M6@!3XQ@``!H1``#J\`!3XPA0H`,5```*!0``BG@`4^,&4*`#$0``"K0`4^,. -M```:"0``ZEH/4^,)4*`#"P``"AX.4^,(```:!0``Z@%0H.,&``#J!%"@XP0` -M`.H'4*#C`@``Z@I0H.,```#J"U"@XP!`H.,-`*#A$!"-X@#`X.,$,-#G!0!3 -MX03`P1<"```:!##!YP``7N,"```*`4"$X@T`5./U__\:!@"@X1`0C>+^___K -M`0!0XP``H`,``.`3(-"-XG"`O>B<````\$`MZ0S03>("8*#AX$*0Y0`PH.,$ -M,(WE;#"4Y4$`$^-/```*5#&4Y5D/A.(M$*#C!""-X@PP0^+^___K``!0XP!P -MH`,"```*!%"=Y0!P5>(!<*`3!5V$X@4`H.'^___K`0!0XPT``!H!`%?C!0`` -M&@8`H.$0$*#C`"``XP`@0./^___K.P``Z@8`H.$0$*#C`"``XP`@0./^___K -M-0``Z@4`H.'^___K`0!0XPT``!H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^ -M___K*0``Z@8`H.$0$*#C`"``XP`@0./^___K(P``ZB@QE.4.`%/C#0``F@$` -M5^,%```:!@"@X1`0H.,`(`#C`"!`X_[__^L8``#J!@"@X1`0H.,`(`#C`"!` -MX_[__^L2``#J`0!7XP4``!H&`*#A$!"@XP`@`.,`($#C_O__ZPH``.H&`*#A -M$!"@XP`@`.,`($#C_O__ZP0``.H"`*#A$!"@XP`@`.,`($#C_O__ZP``H.,, -MT(WB\("]Z/A/+>D#8*#AX$*0Y8X_H..T,,+A!@"@X0`0H.,#(*#A_O__ZT`[ -M!.-,,$#C`#"&Y60PH.,L,,;E+3#&Y2XPQN4',*#C+S#&Y5P@H.,P(,;E32#@ -MXS$@QN4`4*#C,E#&Y3,PQN4$,*#C-##&Y0`P`.,`,$#C`'"3Y3APAN4$<)/E -M/'"&Y0APD^5`<(;E#'"3Y41PAN4!/*#CP#"&Y2HY`./$,(;EO%W&X18PH.,8 -M,<;E$#"@XQDQQN4%<*#A"J"@XP20H..@M@CC`;!`XZ0WU.4``%/C"@``"B:` -MA^*(@8;@"C#(YZ0'U.7^___KFP``X`D`B./K__\:$SZ@X[-PAN$R<<;E#S"@XS0RAN4_,*#C -M#S#&Y0``H./XC[WH<$`MZ0)0H.'@0I#E;#"4Y0$`$^,*```**`&4Y?[__^N@ -M-@CC`3!`XY,``^``,(7E`3"@X[0PQ>$H,93E!C#%Y0D``.J>!]3E_O__ZZ`V -M".,!,$#CDP`#X``PA>4!,*#CM##%X9XWU.4&,,7E``"@XW"`O>CP3RWIQ=]- -MX@*PH.$#0*#A`#"@X_0RC>4"+(WBLCO"X14["./_/T_COC_"X0$PH.,#+(WB -ML##"X0,,C>("`(#B(!"+X@8@H./^___K%&"$XC@SG>4&`%/A"P``FC%>C>(4 -M(*#CM"%EX00`H.$%$*#A!""@X_[__^L$`(3B!!"%XA`@H./^___K!D"@X2@` -MB^+^___K``!0XR````H;.PCC_S]/XP(LC>*^/\+A`3"@XP,LC>*V,,+AN'+; -MX2``5^,@<*`CM'#"X0APA^('4(3@.#.=Y04`4^$0``":,6Z-XK1Q9N$$<*#C -M!`"@X080H.$'(*#A_O__ZP<`A.`($(;B!R"@X?[__^L(`(3B+!"+X@,\C>*T -M(-/A_O__ZP```.H$4*#AI""+XA@@C>64,)OE`@"@X2T0H..]+XWB##!#XO[_ -M_^L`8%#B%```"O1"G>4``%3C$0``"@9`H.$K#HWB`@"`X@40AN("(*#C_O__ -MZP(P].4!(-3E`C2#X=,@X.4!.PCC_S]/XP(LC>*^/\+A@$"+X@0`H.'^ -M___K`0!0XPX``!H,,)WE`0!3XP4``!H##(WB$!"@XP`@`.,`($#C_O__ZS@` -M`.H##(WB$!"@XP`@`.,`($#C_O__ZS(``.H$`*#A_O__ZP$`4.,.```:#""= -MY0$`4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^LE``#J`PR-XA`0H.,`(`#C -M`"!`X_[__^L?``#J:#";Y0X`4^,.``":##"=Y0$`4^,%```:`PR-XA`0H.,` -M(`#C`"!`X_[__^L3``#J`PR-XA`0H.,`(`#C`"!`X_[__^L-``#J#""=Y0$` -M4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^L$``#J`PR-XA`0H.,`(`#C`"!` -MX_[__^L48(7B.#.=Y08`4^$+``":,4Z-XA0@H..T(63A!0"@X000H.$$(*#C -M_O__ZP0`A>($$(3B$""@X_[__^L&4*#A!SL(X_\_3^,"+(WBOC_"X9@PB^(( -M,(WE`P"@X?[__^L`$*#AO@^-X@(`@.("(*#C_O__ZP(LC>*Z/]+A`P`3XQ4` -M``H!`!/C`S"@$P`SC14!,*`#`#.-!0B@A>(X,YWE"@!3X0P``)HQ3HWB"""@ -MX[0A9.$$8*#C!0"@X000H.$&(*#A_O__ZP8`A>`&$(3@!B"@X?[__^L```#J -M!:"@X6@PF^4``%/C`3"@`V@PBP4%.PCC_S]/XP(LC>*^/\+A:`";Y?[__^N@ -M-@CC`3!`XY,``^``,XWE`3"@XP,LC>*T,,+A:#";Y08SS>4,4(KB.#.=Y04` -M4^$+``":,4Z-X@P@H..T(63A"@"@X000H.$$(*#C_O__ZP0`BN($$(3B"""@ -MX_[__^L%H*#A*SL(X_\_3^,"+(WBOC_"X;I/TN$0`!3C`CN@$P,LC1*V,,(1 -M`CF@`P,LC0*V,,(!`#"@XP,LC>*T,,+A"%"*XC@SG>4%`%/A$0``FC%.C>(( -M(*#CM"%DX01@H.,*`*#A!!"@X08@H.'^___K!@"*X`@0A.(&(*#A_O__ZP4` -MH.$L$(OB`SR-XK0@T^'^___K!:"@X:V/C>((`*#A0!"@XP`@`.,`($#C_O__ -MZX`@V^4``%+C`'"@`R,```JM3XWB`$"$X`M0H.$`<*#C0("(X@`P`.,`,$#C -M%#"-Y0`P`.,#8*#A`&!`XP"0`.,`D$#C'*"-Y2"PC>44L)WE!J"@X7]@`N(' -M`%;A!G"@(0@09."F,*#A`0`2XPH@H`$+(*`1`""-Y00`H.$)(*#A_O__ZX$@ -MU>4!4(7B``!2XP!`A!#N__\:'*"=Y2"PG>4,()WE`0!2XS$``!H"/(WBLAO3 -MX0()$>,,```*)""=Y0``4N,$```*#G$`XQ`PG>4``%/C2W^@$R0``.H0()WE -M``!2XY!PH!."<*`#'P``ZH``$>,*```*)#"=Y0``4^,#```*$""=Y0``4N,6 -M```:$0``ZA`PG>4``%/C$```&@L``.JX!9_E_O__ZR0@G>4``%+C`P``"A`P -MG>4``%/C"0``&@0``.H0()WE``!2XP,``!I!<*#C!```ZH=PH.,"``#J2'"@ -MXP```.J6<*#CAW"@X2$["./_/T_C`BR-XKX_PN$`,*#C!3/-Y00SS>4@,0KC -M!S!`XY,'`^``,XWE#%"*XC@SG>4%`%/A"P``FC%.C>(,(*#CM"%DX0H`H.$$ -M$*#A!""@X_[__^L$`(KB!!"$X@@@H./^___K!:"@X0`PH.,"+(WBL#O"X;PZ -MPN&4$)OE2S^-X@`PC>4K/HWB!#"-Y0@`G>4L((WBJS^-XO[__^L"/(WBL$O3 -MX0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@#`(3H -M`BR-XK!+TN$``%3C$```"B-NC>(#8(;B`$"@XP!P`.,`<$#C2X^-X@10H.$& -M`*#A!Q"@X04@V.?^___K`&"&X`%0A>("/(WBL$O3X04`5.'U__^*OP^-X@`0 -MH.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WBM`## -MX0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$%(*#A -M_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^-X@,\C>*T(-/A_O__ZP:@H.&_ -M#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_"X;!;TN$#/(WBM%##X0A0 -MA>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$%(*#A_O__ -MZP4`BN`($(3B!2"@X?[__^L(`(KB2Q^-X@,\C>*T(-/A_O__ZP:@H.$"+(WB -MO$K2X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@# -M`(3H`CR-XKQ*T^$``%3C$```"B-NC>(#8(;B`$"@XP!P`.,`<$#C+("-X@10 -MH.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("+(WBO$K2X04`5.'U__^*OP^- -MX@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WB -MM`##X0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$% -M(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^-X@,\C>*T(-/A_O__ZP:@ -MH.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_"X;Q:TN$#/(WBM%## -MX0A0A>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"@"@X000H.$%(*#A -M_O__ZP4`BN`($(3B!2"@X?[__^L(`(KB+!"-X@,\C>*T(-/A_O__ZP:@H.$` -M,*#CK#*-Y91PF^4,<%?B.0``"@-`H.&KCXWB!2P(X_\O3^,,((WEOS^-X@@P -M@^(0,(WE`9"@XP10H.$4L(WE!["@X1APG>4%8(?@!@"@X0@0H.'^___K``!0 -MXQ\```JL0IWE`@!4XQP``)H,()WE`CR-XKXOP^&\.M/A`RR-XK0PPN$(,(/B -M"#"-Y0-`BN`X,YWE!`!3X1```)H(()WE`CR-XKPOP^$*`*#AOQ^-X@0@H./^ -M___K!`"*XA`0G>4$(*#C_O__ZP@`BN(&$*#A`SR-XK0@T^'^___K!*"@X04P -MA^`),-/G`C"#X@-0A>`%`%OAT___BA2PG>4!/`CC_S]/XP(LC>*^/\+A2S"@ -MXP,SS>54,)OE``!3XU`PVP54,(L%5##;Y8,@@^!0,-OE`R""X$(AH.$!(\WE -M5#"+Y9`PV^4`,\WE8S#@XP(SS>4(8(KB.#.=Y08`4^$,``":,4Z-X@@@H..T -M(63A!%"@XPH`H.$$$*#A!2"@X?[__^L%`(K@!1"$X`4@H.'^___K!J"@X0H` -MH.'%WXWB\(^]Z(P0``#P3RWI'-!-XA00C>4,((WE$#"-Y>"2D.6T<-+A!W"# -MX+0R`^,#,-GG``!3XP0```J(-0/C`S"9YP``4^,50.`3-@``&O[__^L-(*#A -M?SW"XS\PP^,$()/E`2""X@0@@^6$@(GBA$"9Y7J^B>($L(OB$&"=Y?^B`.,( -M`*#A!!"@X?[__^L!`%#C%@``"@6T8,+A`#"@X[8PPN$$`*#A'-"-XO"/O>AP -M0"WIX%*0Y0!`4^(/```*L##4X0``4^,#```*`0!3XUY`X!,,```:!```Z@4` -MH.'^___K``!0XP0```H%``#J!0"@X?[__^L``%#C`0``&@!`X.,```#J`$"@ -MXP0`H.%P@+WH,$`MZ1303>(`4*#A#4"@X0T`H.$`$*#C$""@X_[__^L!,*#C -ML##-X0(`C>(`$*#C!B"@X_[__^O7/:#C`P"5YQ4;".,-(*#A`#"@X_[__^L4 -MT(WB,("]Z#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@XQ`@H./^___K`3"@X[`P -MS>$"`(WBX!"%X@8@H./^___KUSV@XP,`E><5&PCC#2"@X0`PH./^___K%-"- -MXC"`O>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0(*#C_O__Z]<]H.,#`)7G -M&1L(XPT@H.$`,*#C_O__ZQ30C>(P@+WH\$]Z*P` -M```00"WI!2!"XG(@[^8(`%+C`$"@@P#``),`P$"3`B",D,1`TI4$(*#AMO__ -MZQ"`O>AP0"WI"-!-X@%@H.$"4*#A`!``XP`00./0,)'E!#"-Y>!"D.4```#C -M``!`X]00@>+^___K;#"4Y1``$^,50.`#(@``"@Y01>)P!Y3E``!0XP,```I\ -M%Y3E_O__ZP`PH.-P-X3E``!5XP!`H-,7``#:!0"@X?[__^MP!X3E?%>$Y0`` -M4.,%```:3`"?Y4P0G^51*@'C_O__ZQ5`X.,+``#J#A"&X@4@H.'^___K!`"@ -MX=T0H.,$((WB`3"@X_[__^L!(*#C2SV@XP,@Q.<`0*#C!`"@X0C0C>)P@+WH -MU!```-0```#P3RWI3-!-X@!@H.$!<*#A`$"@X>`BM.6=-0/C`S#2YP``4^,` -M0.`#^P0`"@`PD>4``%/C%4#@`_<$``JT`-'A_O__ZQ``C>4`@*#A``!0XPM` -MX`/P!``*`!"7Y;20U^$-(*#A?SW"XS\PP^,(H)/E"5"1X`I0U3``H*`S``!: -MXP0``!H)(*#A_O__ZP``4.,$```:"```Z@``6>,&```*"1"@X?[__^L0`)WE -MM!#7X?[__^L-0.#CUP0`ZL@/G^7('Y_E`""8Y?[__^L`$)CE`3!!XA(`4^,# -M\9^7M`0`ZA16```\5@``3%<``)QH``",9@``%%X``)QH``"<:```G&@``)QH -M``"<:```G&@``)QH``"<:```G&@``.A7``!49P``;&<```1H````0)3E7`^? -MY5P?G^7^___K!`"@X?[__^L$`*#A_O__ZP!`H.&;!`#J`%"4Y;P0V.$$(-CE -M!3#8Y08`V.4``(WE!P#8Y00`C>4(`-CE"`"-Y0D`V.4,`(WE$`^?Y?[__^ML -M,)7E$0`3XS````H$,)CE`0!SXP,``!JX(-CA`3B#X@,`4N$I```*5PV%XA@` -M@.($$(CB_O__ZP!`4.(+0.`#?`0`"A!@F.6\,-CAU#"$Y1,.A.(4$(CB$""@ -MX_[__^L"#!;C`3"@$]PPA!4`,*`#W#"$!<0TE>4``%/CW#"$!0(+%N,`,*`# -M^#6$!0<```H!,*#C^#6$Y=PPA.5A#H3B`P"`X"00B.(:(*#C_O__Z]`TE>4` -M`%/C^#6$!04`H.$$$*#A_O__ZP!`H.-9!`#J%4#@XU<$`.H`4)3E!!#8Y04@ -MV.4&,-CE!P#8Y0``C>4(`-CE!`"-Y0D`V.4(`(WE#`Z?Y?[__^ML,)7E$0`3 -MXQ4```H$,)CE`0!SXP,``!JX(-CA`3B#X@,`4N$.```*5PV%XA@`@.($$(CB -M_O__ZP!`4.($```*!0"@X000H.'^___K`$"@XS8$`.JT#9_E_O__ZP!`H.,R -M!`#J%4#@XS`$`.JT8-?A`#"@XT`PC>64/9_E%"&3Y30@C>4L((WB1A^#X@,` -MD>@$`(+DL!#"X0!0E.7,#9_E$AZ#X@8@H.'^___K;#"5Y1``$^-U`0`*H$`,$(CB`B"@X_[__^NT,)7A`3!#XG,P_^8?`%/C!#"@@2`@H(.S((6! -M#F!&XE1AA>4##%;C"T#@@PP$`(I63X7B!`"@X0`0H.,#+*#C_O__ZP0`H.$. -M$(CB5"&5Y?[__^L\,97E!`!3XU@!`!H`D*#C$)&%Y>``A>++'87B(1"!X@8@ -MH./^___K!`"@X?[__^L!(-#E`##0Y0(T@^$@,87E`2#4Y5@QU>4"-(/A%#"- -MY0Q@A.)`H(WB5#&5Y08`H.$)$*#A"B"@X0PP0^+^___K`)!0X@P```I`0)WE -M``!4XPD```KH`(7B`!"@XR0@H./^___K[`"%X@(0B>)`()WE_O__ZT!`G>7H -M0(7E`#"@XQPQA>54,97E!@"@X0,0H.,*(*#A##!#XO[__^L`D%#B`P``"D!` -MG>4``%3C`K#9%0```!H`L*#C*+&%Y1P`C>(`$*#C$""@X_[__^M4,97E!@"@ -MX0$0H.,*(*#A##!#XO[__^L`0%#B`)"@`P0```H<`(WB`A"$XD`@G>7^___K -M0)"=Y50QE>4&`*#A,A"@XPH@H.$,,$/B_O__ZP!`4.(&```*'`"-X@D`@.`" -M$(3B0""=Y?[__^M`0)WE!)")X!P`C>()$*#A"R"@X?[__^MPD._F!0V%X@D0 -MH.'^___K5#&5Y08`H.$J$*#C"B"@X0PP0^+^___K`+!0X@4```I`0)WE``!4 -MXP(```H%`*#A"Q"@X?[__^M4,97E!@"@X2T0H.,*(*#A##!#XO[__^L`L%#B -M%P``"D!`G>4``%3C%```"@B0B>,%`*#A$Q"@XT<@C>(8-0/C#^"@X0/PE>=' -M0-WE`P!4XP)`BP(`,.`#`S#$!0$P@P($,,0%3@Z%X@D`@.("$(OB0""=Y?[_ -M_^L!L*#C````Z@"PH.,+`%GC$0``BGE`K^8!,*#C$T2@X0P\`.,`,$#C`S`$ -MX```4^,#,*`3&#&%%0D``!H0`!3C`C"@$Q@QA14%```:`@`4XP$P@Q(8,845 -M`0``&@,PH.,8,87ER)"%Y10PG>40`!/C`3"@$PPQA14`,*`###&%!0`PH./D -M*`'C`C"%YSPPC>4X,(WE""""X@(PA><(((+B`C"%YU0QE>4&`*#A,!"@XPH@ -MH.$,,$/B_O__ZP!`4.(9```*0!"=Y0``4>,6```*!`"@X0(0@>(\((WB.#"- -MXO[__^L!`%#C#P``&@(@H..H-P'C`R"%YP$@H.-./X/B`R"%YP0P@^(#()7G -M`B""XP,@A><\0)WE"#"#X@-`A><`,*#C0#"-Y3PPC>4X -M,(WEZ"@!XP(PA><(((+B`C"%YP9`H.'=D*#C5#&5Y0XP0^($`*#A"1"@X0H@ -MH.%`0)WE`S!DX/[__^L`0%#B(0``"@(`A.(T$(WB!""@X_[__^L``%#C)P,` -M"@0`H.%`0)WE`A"$XCP@C>(X,(WB_O__ZP$`4.,3```:`B"@XZ@W`>,#((7G -M`2"@XTX_@^(#((7G!#"#X@,@E>4$,(/B`T"%YSA`G>4( -M,(/B`T"%YP(``.H",(/B`T"$X-/__^H`,*#C0#"-Y<0TA>5:.@+C`S#5YP`` -M4^,:```*W9"@XU0QE>4.,$/B!@"@X0D0H.$*(*#A0$"=Y0,P9.#^___K`$!0 -MX@\```H"`(3B+!"-X@8@H./^___K``!0X_<"``H!,*#CQ#2%Y0@P].6#/.#A -MHSS@X0`PQ.4"``#J`C"#X@-@A.#E___J`#"@X]`TA>7@/0+C`S#5YP``4^,` -ML*`#`;`+$@``6^,&```*`3"@X]`TA>7$-(7EXCT"XP,PU>5X,(/B!1"@X=PPH>4%`*#A_O__ZU=MA>(88(;BX$"%X@8`H.$$$*#A_O__ -MZP``4.,$```:!@"@X000H.'^___K``!0XP4```H%`*#A_O__ZP$PH./8,(7E -M`$"@XZ<"`.H50.#CI0(`ZK10U^$`0)3E6`>?Y6P7G^7^___K`#"@XR`PB.4; -M,,CEOC+8X4`P@^(#`%7AQ`(`&@10H.$$,)CE`0!SXP<``!JX(-CA`3B#X@,` -M4N$#```:)Y0,`5N.Y`@"*"0``ZE<-A>(8`(#B!!"(XO[__^L`8%#BJ`(` -M&@0'G^7^___K`$"@XX,"`.H,0(CB!`"@X?`6G^7^___K``!0XP0``!KD!I_E -M!A"@X?[__^L`0*#C>`(`Z@0`H.$H%Y_E_O__ZP$`<.(``*`S``!0XP!@H`,! -M,*`#9```"K`&G^7^___K)Y;ZBV.&D!I_E!A"@X0H@H.'^___K`3!ZX@`P -MH#,#`%;C`3"#@P``4^.,`@`:``!:XP!`H`,1```*!0!:XP6@H),-H*"##)"* -MX@D`H.'^___K`$!0X@,``!I4!I_E_O__ZP!`H.-2`@#J!`"@X0`0H.,<(*#C -M_O__ZPB@A.4`D(3E!&"$Y0R0A.()`*#A,!"(X@@@E.7^___K'##8Y0``4^,D -M```*#`:?Y?[__^L`(*#C%#L!XP,@A>=8((+B`C"%YP@P -ME.4-`%/C!3"@`U@@0@(",(4'6"""`@(PA0>P-P'C`V"%YUX_AN(#,(/B`S*% -MX`0`@^()$*#A"""4Y?[__^M?/H;B##"#X@,QA>`(()3E!""#Y04`H.$,$(3B -M""#4Y08PH.'I_/_KCP$`ZGP%G^7^___K7C^&X@,P@^(#,H7@!`"#X@D0H.$( -M()3E_O__ZU\^AN(,,(/B`S&%X`@@E.4$((/E!0"@X0P0A.(((-3E!C"@X=7\ -M_^M[`0#J``!3XWH```IL,)7E$``3XW<```H<,-CE`0!3XRL"`!H``%#C%``` -M"@@%G^7@%)_E_O__ZR0`V.4``H7@OB+8X08+@.(,`(#B,!"(XA``4N,0(*`C -M_O__ZP$@H.,$.`'C`R"%Y[XRV.$-`%/C!"""`@0X`0,#((4'1```Z@0`H.&T -M%)_E_O__ZP``4.,D```:J`2?Y7@4G^7^___K`B"@XP0X`>,#((7G)`#8Y0`" -MA>`P0(CBOB+8X08+@.(,`(#B!!"@X1``4N,0(*`C_O__ZR0`V.4*`(#BJ&`$`(#B -M&!"$X@@@H./^___K`2"@XP$[`>,#(,7G&@``Z@0`H.$4%)_E_O__ZP``4.,/ -M```:"`2?Y=`3G^7^___K!""@XP0X`>,#((7G)`#8Y0`"A>"^(MCA!@N`X@P` -M@.(P$(CB$`!2XQ`@H"/^___K!0``ZLP#G^60$Y_E_O__ZP`@H.,$.`'C`R"% +M0*#AX&*0Y;10TN$``%7CH0``"@`PDN4``%/CG@``"K:PTN$%<*#A!0"@X?[_ +M_^L`H%#B"T#@`Y@```H`$)3E#2"@X7\]PN,_,,/C"("3Y0=0D>`(4-4P`("@ +M,P``6.,%```:"@"@X0<@H.'^___K``!0XXP``!H&``#J``!7XP0```H*`*#A +M!Q"@X?[__^L-0.#CAP``Z@J0H.$`4)KE(@!5XQ5`X(."``"*"("*XA`"G^40 +M$I_E_O__ZP8`5>,]```*!@``B@(`5>,.```*`P!5XR(```H``%7C!P``"E@` +M`.H?`%7C1@``"B(`5>--```*!P!5XU(``!HW``#JR`&?Y?[__^M.``#J!#"8 +MY0(`4^,(```*!`!3XPL```H!`%/C1P``&@8`H.$`$)CE_O__ZP@`B.5"``#J +M!@"@X0`0F.7^___K"`"(Y3T``.H&`*#A`!"8Y?[__^L(`(CE.```Z@0PF.4" +M`%/C"```"@0`4^,+```*`0!3XS$``!H&`*#A`!"8Y0@@V.7^___K+```Z@8` +MH.$`$)CEN"#8X?[__^LG``#J!@"@X0`0F.4(()CE_O__ZR(``.H&`*#A`!#8 +MY00@V.4`,.#C2,4#XP_@H.$,\);G"`"(Y1D``.H`$-CE!"#8Y0@PF.4`,(WE +M!@"@X0`PX.-,Q0/C#^"@X0SPEN@-0.#C````Z@!`H.,*`*#A!Q"@X?[__^OU___J\`$``'0```#4 +M#```$`T``/!'+>D0T$WBX%*0Y0-`H.$`,*#C"#"-Y;PPS>$`,(WEM##-X0T` +MH.$&$(3B!B"@X_[__^L`,)3E`0!3XR\``!H$`I_E_O__ZPT`H.$($(WB!B"@ +MX_[__^L!`%#C50``"@!@H.,-<*#A!H"@XW:0[^8&H*#A!@.%X"8,@.(5`(#B +M#1"@X0@@H.'^___K`0!0XQ$``!JT`9_E_O__ZP:CH.$09@+C!@"*X```A>`+ +M`(#B%!"$XA`@H./^___K"J"%X`9@BN`!0*#C!$#&Y020B>`4.@+C`Y#%YSD` +M`.H!8(;B$`!6X^#__QHX``#J`""@XQ0Z`N,#(,7G`4"@XS```.H"`%/C'P`` +M&D0!G^7^___K`$"@XPU@H.$&<*#C!("@X00#A>`F#(#B%0"`X@T0H.$'(*#A +M_O__ZP$`4.,-```:!(.@X1!&`N,$`(C@``"%X`4`@.(`$*#C!B"@X_[__^L( +M4(7@!$"%X``PH.,$,,3E`4"@XQ(``.H!0(3B$`!4X^7__QH-``#J`P!3XPD` +M`!HF#(7B%`"`X@`0H.,!*Z#C_O__ZP`@H.,4.@+C`R#%YP%`H.,"``#J`$"@ +MXP```.H!0*#C!`"@X1#0C>+PA[WH%&H"XWP`G^4&$-7G_O__ZP8`U><0=@+C +M``.'X```A>`%`(#B#1"@X08@H./^___K!@#5YP`#A^```(7@"P"`XA00A.(0 +M(*#C_O__ZP8PU><#,X7@!W"#X`$PH.,$,,?E!C#5YP$P@^)S,._F!C#%YQ`` +M4^/=__\:I___ZB0-``!(#0``?`T``*0-``!P0"WI`D"@X>!BD.5L();E`0`2 +MXP<``!I``!+C!0``&@``H..T`,3AMC#4X0(Y@^.V,,3A<("]Z`90U.4``%7C +M!```"@0`5>,5`."#`5!%D@(``)IP@+WHL".V$,3A<("]Z%\NA>(,((+B`B&&X+0@TN&T(,3A``!2 +MXQ@```I>'X7B`Q"!X@$2AN!?7H7B#%"%X@51AN`#`*#A!!"!X@0@E>7^___K +MMB#4X;8@Q.$0.P'C`S"6YP``4^,"*H(#MB#$`0``H`-P@+T(`0!3XP``H!,! +M*8(#MB#$`0``H`-P@+WH``"@X[0`Q.$"&8'CMA#$X7"`O>@0,*#CM##$X0H; +M@>.V$,3A``"@XW"`O>@``*#CM`#$X0(9@>.V$,3A<("]Z!!`+>D``%/B!P`` +M"@[`H..TP,+A`3"@X[8PPN$`$`#C`!!`XPP@H.'^___K``"@XQ"`O>AP0"WI +M`E"@X>!"D.5L()3E`0`2XP(``!I``!+C`$#@`P@```KH8)3EM&#%X0,`H.'L +M$(3B!B"@X?[__^L!,*#CMC#%X0!`H.,$`*#A<("]Z'!`+>G@4I#E`D"@X0$P +MH..R,,3@!`"@X0`0H.,&(*#C_O__ZVPPE>4!`!/C`P``&D``$^,!```:$``3 +MXP0```H$`*#AX!"%X@8@H./^___K`P``Z@0`H.$`$*#C!B"@X_[__^L``*#C +M<("]Z/!!+>D@T$WB`F"@X0-PH.'@0I#E````XP``0..V$-+A_O__ZP0`C>(` +M$*#C'""@X_[__^NV4-;A`@D5XP\```I``I_E_O__ZP$@H.,4.P'C`R"$YP`P +MH..L)P'C`C"$YU@@@N(",(3G7"!"X@(PA.?:+X+B`C"$YP-`H.%^``#J_U`5 +MX@4```H$`%7C%0#@@P&`19(!4*"3!@``FG<``.JP-P'C`X"4Y]P!G^4($*#A +M_O__ZP!0H..V$-;A`@H1XPT```K$`9_E_O__ZP`PH.,4*P'C`C"$Y]LO0N(" +M,(3G!"""X@(PA.=8((+B`C"$Y\,O@N(",(3G'P``Z@$)$>,/```*````XP`` +M0./^___K`""@XQ0[`>,#((3G`3"@XZ@G`>,",(3GK",",(3G#0``Z@```.,``$#C_O__ZP`PH.,4*P'C`C"$YZ@G`>,",(3G +MK",",(3G"("-Y;0PUN$``%/C!@``"@4`4^,% +M,*"3#3"@@PPPC>4,,(/B!#"-Y2$``.H`,*#C##"-Y0$`5>,=```:L#7^___K`#"5Y04`4^,"```*#0!3 +MXPH``!H$``#J`2"@XZPW`>,#((3G`$"@XQP``.H%(*#CK#(' +M$*#A#""=Y?[__^L$`*#A!1"@X?[__^L``%#C!```&J0R`^,#,)3G``!3XUY` +MX`,````*`$"@XP0`H.$@T(WB\(&]Z!@.```L#@``1`X``+0.``#P1RWI`4"@ +MX>!BD.4`,*#C(#"!Y1LPP>6^,M'A,#"#X@(`4^'8``"*!#"1Y0$`<^/5```: +MN"#1X?\_#^,#`%+AT0``&B0PT>4#`%/CS@``BEY]AN(H<(?B#%"!X@4`H.$` +M$`#C`!!`X_[__^L``%#C4```&D`#G^7^___K`""@XQ0[`>,#((;G`3"@XZPG +M`>,",(;G6"""X@(PAN.Q```*!0!5XP6@H),-H*"##)"*X@D`H.'^___K`%!0XJL```H%`*#A +M`!"@XQP@H./^___K"*"%Y0"0A>4-`%KC!3"@`ZPG`0,",(8'6"""`@(PA@<" +M,8CC!#"%Y0R@A>(*`*#A,!"$X@@@E>7^___K'##4Y0``4^,'```*@`*?Y?[_ +M_^L&`*#A!1"@X?[__^L``%#CDP``"I```.ID`I_E_O__ZP,`6...``"*7C^( +MX@,P@^(#,H;@!`"#X@H0H.$(()7E_O__ZU\^B.(,,(/B`S&&X`@@E>4$((/E +M!@"@X0<0H.$((*#A`#"@X_[__^L`0*#C?```ZJ@W`>,#,);G`@!3XW(``!IL +M();E"#``XP$P0.,#,`+@``!3XVP```I7#8;B&`"`XN`0AN+^___K`(!0XE`` +M``H%`*#AR!&?Y?[__^L``%#C`#"@$^@PB!44.P'C`S"6YP8`4^,$`%,3K#,``HK@``"&X`0`@.(0$(CB"""@X_[__^LD`-3E#@"`X@`"BN```(;@ +M!`"`XA@0B.(((*#C_O__ZP$PH.,;+*#C`C#&YR00U.6^+T+B`A"&YP8`H.$' +M$*#A)"#4Y?[__^L&`*#A_O__ZP!`4.(1```*!0"@X700G^7^___K``!0XP`P +MH!/H,(05%#L!XP,PEN<&`%/C!`!3$P8``!JL-P'C`S"6Y^PPA.4`0*#C`@`` +MZA5`X.,```#J`$"@XP0`H.'PA[WH`$"@XP```.I>0.#C!0"@X0D0H.'^___K +M]O__ZN@.```0#P``)`\``#0/``!$#P``3`\``/!'+>D`D*#A`J"@X0-@H.&V +MAP0"WI +M`%"@X0)`H.'@8I#EMC#2X0,ZH.$C.J#A"@!3XP/QGY<*``#JU#D``-0Y``#4 +M.0``U#D``!@Y``!`.0``D#D``-0Y``#4.0``$#D``-0Y``!>0.#C+P``Z@`P +MDN4``%/C`2"@$PPV`A,#(,87`$"@$P!`H`,,-@(#`T#&!R4``.H4.P'C`S"6 +MYP``4^,@```*`#"2Y0``4^,=```*`2"@XQ0[`>,#((;G`$"@XZPW`>,#0(;G +M!#@!XP-`AN>H-P'C`T"&YQ`[`>,#0(;G$0``ZFPPEN4!`!/C"```"@8`H.'^ +M___K-`"?Y300G^7^___K!@"@X?[__^L&`*#A_O__ZP4`H.$`$)3E4(,(WE`5"@X0,`4>$`$*`3`1"@`X``4N,!,*"1`3"!@P``4^,&```* +M`""@X_@X`>,#(,#G`@!1X0)`H!$50.`#R@``Z@``4N,`0*`#QP``"@2PH.$$ +M`*#A_O__ZP!@4.(+0.`#P0``"@8`H.$%$*#A"R"@X?[__^L#`%3C`$#@D\<` +M`)H$4*#A!@"@X000H.$,((WB"#"-XO[__^L!`%#C!0``&@(@H..H-P'C`R"' +MYP0@H.,0.P'C`R"'YP8`H.$%$*#A#""-X@@PC>+^___K`0!0XP4``!H"(*#C +MJ#,%\9^7,0``ZD0[``!@ +M.P``S#L``+0[``#,.P``S#L``,P[``!\.P``S#L``,P[``#,.P``S#L``,P[ +M``#,.P``S#L``)@[````(*#C!#@!XP,@A^,#((?G`""@XQ0[`>,#((?G$P``Z@(@H.,$.`'C`R"'YP0@H.,4.P'C +M`R"'YPP``.H$(*#C!#@!XP,@A^<&(*#C%#L!XP,@A^<%``#J!2"@XP0X`>,# +M((?G`""@XQ0[`>,#((?G"%"=Y0%01>(/`%7C!?&?ES(``.H@/```/#P``*P\ +M``"0/```K#P``*P\``"L/```6#P``*P\``"L/```K#P``*P\``"L/```K#P` +M`*P\``!T/````""@XZPW`>,#((?G`2"@XQ0[`>,#((?G3P``Z@$@H..L-P'C +M`R"'YP`@H.,4.P'C`R"'YT@``.H"(*#CK#,#((?G!B"@XQ0[`>,#((?G.@``Z@4@H..L-P'C`R"'YP`@ +MH.,4.P'C`R"'YS,``.H`(*#C^#@!XP,@Q^<`,`#C`#!`XY@PD^4$,(WE,@`` +MZ@6`H.$%H(;@`##:Y=T`4^,:```:`@"%X@``AN`$$(WB!""@X_[__^L!`%#C +M$P``&K``G^7^___K"H"@X0$@VN4"((+B`@Q2XP(LH*/\.@'C`R"'YV,-A^(Y +M`(#B"A"@X?[__^OX.`'C`2"@XP,@Q^=T`)_E_O__ZP!`H.,5``#J"("&X`DP +MV.<",(/B`U"%X'50_^8%`%3AV/__B@!`H.,,``#J!`"@X130C>+PC[WH`""@ +MX_@X`>,#(,?G`#``XP`P0..8,)/E!#"-Y0!0H.,!D*#CR?__Z@8`H.$+$*#A +M_O__Z^[__^J`#P``C`\``!!`+>G@`I#E`Q"@X;0@TN$%___K$("]Z/!%+>D, +MT$WB`E"@X0`PH.,$,(WEX&*0Y;(PS>$!,,WE;#"6Y0$`$^,"```:0``3XP`` +MX`-9```*5#&6Y5D/AN(M$*#C!""-X@PP0^+^___K`'!0XA````H$0)WE``!4 +MXPT```H'0*#A`@"-X@40A^("(*#C_O__ZP(P].4!(-3E`C2#X=.`X.=@`!/C +M`*"@`P&@H!,!<*#C`@``Z@!PH.,'H*#A!X"@X4`QUN4!($/B5!,=+E`2""X@$0 +M0^)Q$._F_0!1X_7__YH!`%?C(P``&@8`H.$3$*#C`2"-XA0U`^,/X*#A`_"6 +MYP%`W>4#`%3C"0``&@``6.,#```*``!:XY:@H!.'H*`##0``Z@``6N-(H*`3 +M0:"@`PD``.H``%CC!```"@XQ`.,``%KC`Z"@`4NOH!,"``#J``!:XY"@H!." +MH*`#BJ"@X2`Q"N,',$#CDPH#X``PA>4``*#C!```ZB`Q"N,',$#CDP0#X``P +MA>4``*#C#-"-XO"%O>AP0"WI(-!-XN!BD.4`0)+E!.#2Y0W`H.$P,9_E#P"3 +MZ`<`K.@`,,SE`0!TXS````JD0J#AQ3H%XWPZ0..3)(/@HS.@X6X`4^,%4*`# +M*0``"@\``(HW`%/C`E"@`R4```H%``"*"@!3XP!0H`,A```*%`!3XQX``!H5 +M``#J/`!3XP-0H`,;```*6@!3XQ@``!H1``#J\`!3XPA0H`,5```*!0``BG@` +M4^,&4*`#$0``"K0`4^,.```:"0``ZEH/4^,)4*`#"P``"AX.4^,(```:!0`` +MZ@%0H.,&``#J!%"@XP0``.H'4*#C`@``Z@I0H.,```#J"U"@XP!`H.,-`*#A +M$!"-X@#`X.,$,-#G!0!3X03`P1<"```:!##!YP``7N,"```*`4"$X@T`5./U +M__\:!@"@X1`0C>+^___K`0!0XP``H`,``.`3(-"-XG"`O>B<````\$`MZ0S0 +M3>("8*#AX$*0Y0`PH.,$,(WE;#"4Y4$`$^-/```*5#&4Y5D/A.(M$*#C!""- +MX@PP0^+^___K``!0XP!PH`,"```*!%"=Y0!P5>(!<*`3!5V$X@4`H.'^___K +M`0!0XPT``!H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^___K.P``Z@8`H.$0 +M$*#C`"``XP`@0./^___K-0``Z@4`H.'^___K`0!0XPT``!H!`%?C!0``&@8` +MH.$0$*#C`"``XP`@0./^___K*0``Z@8`H.$0$*#C`"``XP`@0./^___K(P`` +MZB@QE.4.`%/C#0``F@$`5^,%```:!@"@X1`0H.,`(`#C`"!`X_[__^L8``#J +M!@"@X1`0H.,`(`#C`"!`X_[__^L2``#J`0!7XP4``!H&`*#A$!"@XP`@`.,` +M($#C_O__ZPH``.H&`*#A$!"@XP`@`.,`($#C_O__ZP0``.H"`*#A$!"@XP`@ +M`.,`($#C_O__ZP``H.,,T(WB\("]Z/A/+>D#8*#AX$*0Y8X_H..T,,+A!@"@ +MX0`0H.,#(*#A_O__ZT`[!.-,,$#C`#"&Y60PH.,L,,;E+3#&Y2XPQN4',*#C +M+S#&Y5P@H.,P(,;E32#@XS$@QN4`4*#C,E#&Y3,PQN4$,*#C-##&Y0`P`.,` +M,$#C`'"3Y3APAN4$<)/E/'"&Y0APD^5`<(;E#'"3Y41PAN4!/*#CP#"&Y2HY +M`./$,(;EO%W&X18PH.,8,<;E$#"@XQDQQN4%<*#A"J"@XP20H..@M@CC`;!` +MXZ0WU.4``%/C"@``"B:`A^*(@8;@"C#(YZ0'U.7^___KFP``X`D`B./K__\:$SZ@X[-PAN$R +M<<;E#S"@XS0RAN4_,*#C#S#&Y0``H./XC[WH<$`MZ0)0H.'@0I#E;#"4Y0$` +M$^,*```**`&4Y?[__^N@-@CC`3!`XY,``^``,(7E`3"@X[0PQ>$H,93E!C#% +MY0D``.J>!]3E_O__ZZ`V".,!,$#CDP`#X``PA>4!,*#CM##%X9XWU.4&,,7E +M``"@XW"`O>CP3RWIQ=]-X@*PH.$#0*#A`#"@X_0RC>4"+(WBLCO"X14["./_ +M/T_COC_"X0$PH.,#+(WBL##"X0,,C>("`(#B(!"+X@8@H./^___K%&"$XC@S +MG>4&`%/A"P``FC%>C>(4(*#CM"%EX00`H.$%$*#A!""@X_[__^L$`(3B!!"% +MXA`@H./^___K!D"@X2@`B^+^___K``!0XR````H;.PCC_S]/XP(LC>*^/\+A +M`3"@XP,LC>*V,,+AN'+;X2``5^,@<*`CM'#"X0APA^('4(3@.#.=Y04`4^$0 +M``":,6Z-XK1Q9N$$<*#C!`"@X080H.$'(*#A_O__ZP<`A.`($(;B!R"@X?[_ +M_^L(`(3B+!"+X@,\C>*T(-/A_O__ZP```.H$4*#AI""+XA@@C>64,)OE`@"@ +MX2T0H..]+XWB##!#XO[__^L`8%#B%```"O1"G>4``%3C$0``"@9`H.$K#HWB +M`@"`X@40AN("(*#C_O__ZP(P].4!(-3E`C2#X=,@X.4!.PCC_S]/XP(L +MC>*^/\+A@$"+X@0`H.'^___K`0!0XPX``!H,,)WE`0!3XP4``!H##(WB$!"@ +MXP`@`.,`($#C_O__ZS@``.H##(WB$!"@XP`@`.,`($#C_O__ZS(``.H$`*#A +M_O__ZP$`4.,.```:#""=Y0$`4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^LE +M``#J`PR-XA`0H.,`(`#C`"!`X_[__^L?``#J:#";Y0X`4^,.``":##"=Y0$` +M4^,%```:`PR-XA`0H.,`(`#C`"!`X_[__^L3``#J`PR-XA`0H.,`(`#C`"!` +MX_[__^L-``#J#""=Y0$`4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^L$``#J +M`PR-XA`0H.,`(`#C`"!`X_[__^L48(7B.#.=Y08`4^$+``":,4Z-XA0@H..T +M(63A!0"@X000H.$$(*#C_O__ZP0`A>($$(3B$""@X_[__^L&4*#A!SL(X_\_ +M3^,"+(WBOC_"X9@PB^((,(WE`P"@X?[__^L`$*#AO@^-X@(`@.("(*#C_O__ +MZP(LC>*Z/]+A`P`3XQ4```H!`!/C`S"@$P`SC14!,*`#`#.-!0B@A>(X,YWE +M"@!3X0P``)HQ3HWB"""@X[0A9.$$8*#C!0"@X000H.$&(*#A_O__ZP8`A>`& +M$(3@!B"@X?[__^L```#J!:"@X6@PF^4``%/C`3"@`V@PBP4%.PCC_S]/XP(L +MC>*^/\+A:`";Y?[__^N@-@CC`3!`XY,``^``,XWE`3"@XP,LC>*T,,+A:#"; +MY08SS>4,4(KB.#.=Y04`4^$+``":,4Z-X@P@H..T(63A"@"@X000H.$$(*#C +M_O__ZP0`BN($$(3B"""@X_[__^L%H*#A*SL(X_\_3^,"+(WBOC_"X;I/TN$0 +M`!3C`CN@$P,LC1*V,,(1`CF@`P,LC0*V,,(!`#"@XP,LC>*T,,+A"%"*XC@S +MG>4%`%/A$0``FC%.C>(((*#CM"%DX01@H.,*`*#A!!"@X08@H.'^___K!@"* +MX`@0A.(&(*#A_O__ZP4`H.$L$(OB`SR-XK0@T^'^___K!:"@X:V/C>((`*#A +M0!"@XP`@`.,`($#C_O__ZX`@V^4``%+C`'"@`R,```JM3XWB`$"$X`M0H.$` +M<*#C0("(X@`P`.,`,$#C%#"-Y0`P`.,#8*#A`&!`XP"0`.,`D$#C'*"-Y2"P +MC>44L)WE!J"@X7]@`N('`%;A!G"@(0@09."F,*#A`0`2XPH@H`$+(*`1`""- +MY00`H.$)(*#A_O__ZX$@U>4!4(7B``!2XP!`A!#N__\:'*"=Y2"PG>4,()WE +M`0!2XS$``!H"/(WBLAO3X0()$>,,```*)""=Y0``4N,$```*#G$`XQ`PG>4` +M`%/C2W^@$R0``.H0()WE``!2XY!PH!."<*`#'P``ZH``$>,*```*)#"=Y0`` +M4^,#```*$""=Y0``4N,6```:$0``ZA`PG>4``%/C$```&@L``.JX!9_E_O__ +MZR0@G>4``%+C`P``"A`PG>4``%/C"0``&@0``.H0()WE``!2XP,``!I!<*#C +M!```ZH=PH.,"``#J2'"@XP```.J6<*#CAW"@X2$["./_/T_C`BR-XKX_PN$` +M,*#C!3/-Y00SS>4@,0KC!S!`XY,'`^``,XWE#%"*XC@SG>4%`%/A"P``FC%. +MC>(,(*#CM"%DX0H`H.$$$*#A!""@X_[__^L$`(KB!!"$X@@@H./^___K!:"@ +MX0`PH.,"+(WBL#O"X;PZPN&4$)OE2S^-X@`PC>4K/HWB!#"-Y0@`G>4L((WB +MJS^-XO[__^L"/(WBL$O3X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L` +M,`#C`#!`XP,`D^@#`(3H`BR-XK!+TN$``%3C$```"B-NC>(#8(;B`$"@XP!P +M`.,`<$#C2X^-X@10H.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("/(WBL$O3 +MX04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB +M_O__ZW``_^8#/(WBM`##X0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$ +M4*#C"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^-X@,\ +MC>*T(-/A_O__ZP:@H.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_" +MX;!;TN$#/(WBM%##X0A0A>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C +M"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KB2Q^-X@,\C>*T +M(-/A_O__ZP:@H.$"+(WBO$K2X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[_ +M_^L`,`#C`#!`XP,`D^@#`(3H`CR-XKQ*T^$``%3C$```"B-NC>(#8(;B`$"@ +MXP!P`.,`<$#C+("-X@10H.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("+(WB +MO$K2X04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+ +M#XWB_O__ZW``_^8#/(WBM`##X0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK11 +M9.$$4*#C"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^- +MX@,\C>*T(-/A_O__ZP:@H.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WB +MOC_"X;Q:TN$#/(WBM%##X0A0A>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$ +M4*#C"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KB+!"-X@,\ +MC>*T(-/A_O__ZP:@H.$`,*#CK#*-Y91PF^4,<%?B.0``"@-`H.&KCXWB!2P( +MX_\O3^,,((WEOS^-X@@P@^(0,(WE`9"@XP10H.$4L(WE!["@X1APG>4%8(?@ +M!@"@X0@0H.'^___K``!0XQ\```JL0IWE`@!4XQP``)H,()WE`CR-XKXOP^&\ +M.M/A`RR-XK0PPN$(,(/B"#"-Y0-`BN`X,YWE!`!3X1```)H(()WE`CR-XKPO +MP^$*`*#AOQ^-X@0@H./^___K!`"*XA`0G>4$(*#C_O__ZP@`BN(&$*#A`SR- +MXK0@T^'^___K!*"@X04PA^`),-/G`C"#X@-0A>`%`%OAT___BA2PG>4!/`CC +M_S]/XP(LC>*^/\+A2S"@XP,SS>54,)OE``!3XU`PVP54,(L%5##;Y8,@@^!0 +M,-OE`R""X$(AH.$!(\WE5#"+Y9`PV^4`,\WE8S#@XP(SS>4(8(KB.#.=Y08` +M4^$,``":,4Z-X@@@H..T(63A!%"@XPH`H.$$$*#A!2"@X?[__^L%`(K@!1"$ +MX`4@H.'^___K!J"@X0H`H.'%WXWB\(^]Z%P0``#P3RWI'-!-XA00C>4,((WE +M$#"-Y>"2D.6T<-+A!W"#X+`R`^,#,-GG``!3XP0```J$-0/C`S"9YP``4^,5 +M0.`3-@``&O[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^6$@(GBA$"9Y7J^ +MB>($L(OB$&"=Y?^B`.,(`*#A!!"@X?[__^L!`%#C%@``"@6T8,+A`#"@X[8P +MPN$$`*#A'-"-XO"/O>AP0"WIX%*0Y0!`4^(/```*L##4X0``4^,#```*`0!3 +MXUY`X!,,```:!```Z@4`H.'^___K``!0XP0```H%``#J!0"@X?[__^L``%#C +M`0``&@!`X.,```#J`$"@XP0`H.%P@+WH,$`MZ1303>(`4*#A#4"@X0T`H.$` +M$*#C$""@X_[__^L!,*#CL##-X0(`C>(`$*#C!B"@X_[__^N\-0/C`P"5YQ4; +M".,-(*#A`#"@X_[__^L4T(WB,("]Z#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@ +MXQ`@H./^___K`3"@X[`PS>$"`(WBX!"%X@8@H./^___KO#4#XP,`E><5&PCC +M#2"@X0`PH./^___K%-"-XC"`O>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0 +M(*#C_O__Z[PU`^,#`)7G&1L(XPT@H.$`,*#C_O__ZQ30C>(P@+WH\$]Z*P````00"WI!2!"XG(@[^8(`%+C`$"@@P#``),`P$"3 +M`B",D,1`TI4$(*#AMO__ZQ"`O>AP0"WI"-!-X@%@H.$"4*#A`!``XP`00./0 +M,)'E!#"-Y>!"D.4```#C``!`X]00@>+^___K;#"4Y1``$^,50.`#(@``"@Y0 +M1>)P!Y3E``!0XP,```I\%Y3E_O__ZP`PH.-P-X3E``!5XP!`H-,7``#:!0"@ +MX?[__^MP!X3E?%>$Y0``4.,%```:3`"?Y4P0G^51*@'C_O__ZQ5`X.,+``#J +M#A"&X@4@H.'^___K!`"@X=T0H.,$((WB`3"@X_[__^L!(*#C2SV@XP,@Q.<` +M0*#C!`"@X0C0C>)P@+WHI!```-0```#P3RWI3-!-X@!@H.$!<*#A`$"@X>`B +MM.69-0/C`S#2YP``4^,`0.`#^P0`"@`PD>4``%/C%4#@`_<$``JT`-'A_O__ +MZQ``C>4`@*#A``!0XPM`X`/P!``*`!"7Y;20U^$-(*#A?SW"XS\PP^,(H)/E +M"5"1X`I0U3``H*`S``!:XP0``!H)(*#A_O__ZP``4.,$```:"```Z@``6>,& +M```*"1"@X?[__^L0`)WEM!#7X?[__^L-0.#CUP0`ZL@/G^7('Y_E`""8Y?[_ +M_^L`$)CE`3!!XA(`4^,#\9^7M`0`ZIQ5``#$50``U%8``"1H```49@``G%T` +M`"1H```D:```)&@``"1H```D:```)&@``"1H```D:```)&@``'!7``#<9@`` +M]&8``(QG````0)3E7`^?Y5P?G^7^___K!`"@X?[__^L$`*#A_O__ZP!`H.&; +M!`#J`%"4Y;P0V.$$(-CE!3#8Y08`V.4``(WE!P#8Y00`C>4(`-CE"`"-Y0D` +MV.4,`(WE$`^?Y?[__^ML,)7E$0`3XS````H$,)CE`0!SXP,``!JX(-CA`3B# +MX@,`4N$I```*5PV%XA@`@.($$(CB_O__ZP!`4.(+0.`#?`0`"A!@F.6\,-CA +MU#"$Y1,.A.(4$(CB$""@X_[__^L"#!;C`3"@$]PPA!4`,*`#W#"$!<0TE>4` +M`%/CW#"$!0(+%N,`,*`#^#6$!0<```H!,*#C^#6$Y=PPA.5A#H3B`P"`X"00 +MB.(:(*#C_O__Z]`TE>4``%/C^#6$!04`H.$$$*#A_O__ZP!`H.-9!`#J%4#@ +MXU<$`.H`4)3E!!#8Y04@V.4&,-CE!P#8Y0``C>4(`-CE!`"-Y0D`V.4(`(WE +M#`Z?Y?[__^ML,)7E$0`3XQ4```H$,)CE`0!SXP,``!JX(-CA`3B#X@,`4N$. +M```*5PV%XA@`@.($$(CB_O__ZP!`4.($```*!0"@X000H.'^___K`$"@XS8$ +M`.JT#9_E_O__ZP!`H.,R!`#J%4#@XS`$`.JT8-?A`#"@XT`PC>64/9_E%"&3 +MY30@C>4L((WB1A^#X@,`D>@$`(+DL!#"X0!0E.7,#9_E$AZ#X@8@H.'^___K +M;#"5Y1``$^-U`0`*H$`,$(CB`B"@X_[__^NT,)7A`3!#XG,P_^8? +M`%/C!#"@@2`@H(.S((6!#F!&XE1AA>4##%;C"T#@@PP$`(I63X7B!`"@X0`0 +MH.,#+*#C_O__ZP0`H.$.$(CB5"&5Y?[__^L\,97E!`!3XU@!`!H`D*#C$)&% +MY>``A>++'87B'1"!X@8@H./^___K!`"@X?[__^L!(-#E`##0Y0(T@^$@,87E +M`2#4Y5@QU>4"-(/A%#"-Y0Q@A.)`H(WB5#&5Y08`H.$)$*#A"B"@X0PP0^+^ +M___K`)!0X@P```I`0)WE``!4XPD```KH`(7B`!"@XR0@H./^___K[`"%X@(0 +MB>)`()WE_O__ZT!`G>7H0(7E`#"@XQPQA>54,97E!@"@X0,0H.,*(*#A##!# +MXO[__^L`D%#B`P``"D!`G>4``%3C`K#9%0```!H`L*#C*+&%Y1P`C>(`$*#C +M$""@X_[__^M4,97E!@"@X0$0H.,*(*#A##!#XO[__^L`0%#B`)"@`P0```H< +M`(WB`A"$XD`@G>7^___K0)"=Y50QE>4&`*#A,A"@XPH@H.$,,$/B_O__ZP!` +M4.(&```*'`"-X@D`@.`"$(3B0""=Y?[__^M`0)WE!)")X!P`C>()$*#A"R"@ +MX?[__^MPD._F!0V%X@D0H.'^___K5#&5Y08`H.$J$*#C"B"@X0PP0^+^___K +M`+!0X@4```I`0)WE``!4XP(```H%`*#A"Q"@X?[__^M4,97E!@"@X2T0H.,* +M(*#A##!#XO[__^L`L%#B%P``"D!`G>4``%3C%```"@B0B>,%`*#A$Q"@XT<@ +MC>(4-0/C#^"@X0/PE>='0-WE`P!4XP)`BP(`,.`#`S#$!0$P@P($,,0%3@Z% +MX@D`@.("$(OB0""=Y?[__^L!L*#C````Z@"PH.,+`%GC$0``BGE`K^8!,*#C +M$T2@X0P\`.,`,$#C`S`$X```4^,#,*`3&#&%%0D``!H0`!3C`C"@$Q@QA14% +M```:`@`4XP$P@Q(8,845`0``&@,PH.,8,87ER)"%Y10PG>40`!/C`3"@$PPQ +MA14`,*`###&%!0`PH./D*`'C`C"%YSPPC>4X,(WE""""X@(PA><(((+B`C"% +MYU0QE>4&`*#A,!"@XPH@H.$,,$/B_O__ZP!`4.(9```*0!"=Y0``4>,6```* +M!`"@X0(0@>(\((WB.#"-XO[__^L!`%#C#P``&@(@H..H-P'C`R"%YP$@H.-. +M/X/B`R"%YP0P@^(#()7G`B""XP,@A><\0)WE"#"#X@-`A><`,*#C0#"-Y3PPC>4X,(WEZ"@!XP(PA><(((+B`C"%YP9`H.'=D*#C5#&5 +MY0XP0^($`*#A"1"@X0H@H.%`0)WE`S!DX/[__^L`0%#B(0``"@(`A.(T$(WB +M!""@X_[__^L``%#C)P,`"@0`H.%`0)WE`A"$XCP@C>(X,(WB_O__ZP$`4.,3 +M```:`B"@XZ@W`>,#((7G`2"@XTX_@^(#((7G!#"#X@,@E>4$,(/B`T"%YSA`G>4(,(/B`T"%YP(``.H",(/B`T"$X-/__^H`,*#C0#"- +MY<0TA>5:.@+C`S#5YP``4^,:```*W9"@XU0QE>4.,$/B!@"@X0D0H.$*(*#A +M0$"=Y0,P9.#^___K`$!0X@\```H"`(3B+!"-X@8@H./^___K``!0X_<"``H! +M,*#CQ#2%Y0@P].6#/.#AHSS@X0`PQ.4"``#J`C"#X@-@A.#E___J`#"@X]`T +MA>7@/0+C`S#5YP``4^,`L*`#`;`+$@``6^,&```*`3"@X]`TA>7$-(7EXCT" +MXP,PU>5X,(/B!1"@X=PPH>4%`*#A_O__ZU=MA>(88(;B +MX$"%X@8`H.$$$*#A_O__ZP``4.,$```:!@"@X000H.'^___K``!0XP4```H% +M`*#A_O__ZP$PH./8,(7E`$"@XZ<"`.H50.#CI0(`ZK10U^$`0)3E6`>?Y6P7 +MG^7^___K`#"@XR`PB.4;,,CEOC+8X4`P@^(#`%7AQ`(`&@10H.$$,)CE`0!S +MXP<``!JX(-CA`3B#X@,`4N$#```:)Y0,`5N.Y`@"*"0``ZE<-A>(8`(#B +M!!"(XO[__^L`8%#BJ`(`&@0'G^7^___K`$"@XX,"`.H,0(CB!`"@X?`6G^7^ +M___K``!0XP0``!KD!I_E!A"@X?[__^L`0*#C>`(`Z@0`H.$H%Y_E_O__ZP$` +M<.(``*`S``!0XP!@H`,!,*`#9```"K`&G^7^___K)Y;ZBV.&D!I_E!A"@ +MX0H@H.'^___K`3!ZX@`PH#,#`%;C`3"#@P``4^.,`@`:``!:XP!`H`,1```* +M!0!:XP6@H),-H*"##)"*X@D`H.'^___K`$!0X@,``!I4!I_E_O__ZP!`H.-2 +M`@#J!`"@X0`0H.,<(*#C_O__ZPB@A.4`D(3E!&"$Y0R0A.()`*#A,!"(X@@@ +ME.7^___K'##8Y0``4^,D```*#`:?Y?[__^L`(*#C%#L!XP,@A>=8((+B`C"%YP@PE.4-`%/C!3"@`U@@0@(",(4'6"""`@(PA0>P-P'C +M`V"%YUX_AN(#,(/B`S*%X`0`@^()$*#A"""4Y?[__^M?/H;B##"#X@,QA>`( +M()3E!""#Y04`H.$,$(3B""#4Y08PH.'I_/_KCP$`ZGP%G^7^___K7C^&X@,P +M@^(#,H7@!`"#X@D0H.$(()3E_O__ZU\^AN(,,(/B`S&%X`@@E.4$((/E!0"@ +MX0P0A.(((-3E!C"@X=7\_^M[`0#J``!3XWH```IL,)7E$``3XW<```H<,-CE +M`0!3XRL"`!H``%#C%```"@@%G^7@%)_E_O__ZR0`V.4``H7@OB+8X08+@.(, +M`(#B,!"(XA``4N,0(*`C_O__ZP$@H.,$.`'C`R"%Y[XRV.$-`%/C!"""`@0X +M`0,#((4'1```Z@0`H.&T%)_E_O__ZP``4.,D```:J`2?Y7@4G^7^___K`B"@ +MXP0X`>,#((7G)`#8Y0`"A>`P0(CBOB+8X08+@.(,`(#B!!"@X1``4N,0(*`C +M_O__ZR0`V.4*`(#BJ&`$`(#B&!"$X@@@H./^___K`2"@XP$[`>,#(,7G&@``Z@0` +MH.$4%)_E_O__ZP``4.,/```:"`2?Y=`3G^7^___K!""@XP0X`>,#((7G)`#8 +MY0`"A>"^(MCA!@N`X@P`@.(P$(CB$`!2XQ`@H"/^___K!0``ZLP#G^60$Y_E +M_O__ZP`@H.,$.`'C`R"%YR0@V.4(.`'C`R"%YP$@H..^/X/B`R#%Y[\_0^(# +M()7G6#!#X@,@A><%`*#A,!"(XG(@[^8D,-CE(_S_ZP4`H.'^___K`&!0XKP! +M``H`0*#CZ$"&Y00X`>,#,)7G[#"&Y8T!`.JH-P'C`S"5YP(`4^,`,*`3`3"@ +M`P``5N,`,*`#``!3XZT!``IL,)7E$``3XZH!``H<,-CE`0!3XV,``!HPH(CB +MOB+8X1$.AN(*$*#A$`!2XQ`@H"/^___K!`"@X203G^7^___K``!0XPD``!KH +M`I_EJ!*?Y?[__^L!,*#C[#"&Y;XRV.$-`%/C!3"@`^PPA@4E``#J!`"@X:@2 +MG^7^___K``!0XQ```!JP`I_E;!*?Y?[__^L",*#C[#"&Y?``AN(0$(KB"""@ +MX_[__^L!#(;B&!"*X@@@H./^___K`2"@XP$[`>,#(,7G#P``Z@0`H.%8$I_E +M_O__ZP``4.,%```:7`*?Y102G^7^___K!#"@X^PPAN4$``#J2`*?Y?P1G^7^ +M___K`#"@X^PPAN4<`*#C_O__ZP"0H.$``%#C'P``"A<`H./^___K`*!0X@,` +M`!H)`*#A'!"@X_[__^L7``#J%`")XO[__^L5(*#CL"#)X02@B>47,*#C"#") +MY0`PH.,,,(GE$#")Y>PPEN4&,,KE"@"@X>`0AN(&(*#C_O__ZP<`BN(1'H;B +M$""@X_[__^M+#87B"`"`X@D0H.'^___K`$"@X^A`AN4:`0#J``!0XQ$```HD +M`-CE``*%X+XBV.$&"X#B#`"`XC`0B.(0`%+C$""@(_[__^L!(*#C!#@!XP,@ +MA>>^,MCA#0!3XP0@@@($.`$#`R"%!UX``.H$`*#A(!&?Y?[__^L``%#C(0`` +M&@(@H.,$.`'C`R"%YR0`V.4``H7@,$"(XKXBV.$&"X#B#`"`X@00H.$0`%+C +M$""@(_[__^LD`-CE"@"`XJAG`>,``H;@``"%X`0`@.(0$(3B"""@X_[__^LD +M`-CE#@"`X@`"AN```(7@!`"`XA@0A.(((*#C_O__ZP$@H.,!.P'C`R#%YS<` +M`.H$`*#AC!"?Y?[__^L``%#C+P``&@0@H.,$.`'C`R"%YR0`V.4``H7@OB+8 +MX08+@.(,`(#B,!"(XA``4N,0(*`C_O__ZR4``.K$$```Z````/`!``#\```` +MT!````01```P$0```````#`!``!T$0``1`\``+P1``#H$0``$!(``$`2```D +M#P``-`\``'`2``!,#P``B!(``%0/``"D$@``P!(``-P2``#X$@``%!,``#`3 +M``!,$P``B!,``$0!``"8$```I!```%P!``"@$P``Y`X````@H.,$.`'C`R"% MYR0@V.4(.`'C`R"%YP$@H..^/X/B`R#%Y[\_0^(#()7G6#!#X@,@A><%`*#A -M,!"(XG(@[^8D,-CE(_S_ZP4`H.'^___K`&!0XKP!``H`0*#CZ$"&Y00X`>,# -M,)7G[#"&Y8T!`.JH-P'C`S"5YP(`4^,`,*`3`3"@`P``5N,`,*`#``!3XZT! -M``IL,)7E$``3XZH!``H<,-CE`0!3XV,``!HPH(CBOB+8X1$.AN(*$*#A$`!2 -MXQ`@H"/^___K!`"@X203G^7^___K``!0XPD``!KH`I_EJ!*?Y?[__^L!,*#C -M[#"&Y;XRV.$-`%/C!3"@`^PPA@4E``#J!`"@X:@2G^7^___K``!0XQ```!JP -M`I_E;!*?Y?[__^L",*#C[#"&Y?``AN(0$(KB"""@X_[__^L!#(;B&!"*X@@@ -MH./^___K`2"@XP$[`>,#(,7G#P``Z@0`H.%8$I_E_O__ZP``4.,%```:7`*? -MY102G^7^___K!#"@X^PPAN4$``#J2`*?Y?P1G^7^___K`#"@X^PPAN4<`*#C -M_O__ZP"0H.$``%#C'P``"A<`H./^___K`*!0X@,``!H)`*#A'!"@X_[__^L7 -M``#J%`")XO[__^L5(*#CL"#)X02@B>47,*#C"#")Y0`PH.,,,(GE$#")Y>PP -MEN4&,,KE"@"@X>`0AN(&(*#C_O__ZP<`BN(1'H;B$""@X_[__^M+#87B"`"` -MX@D0H.'^___K`$"@X^A`AN4:`0#J``!0XQ$```HD`-CE``*%X+XBV.$&"X#B -M#`"`XC`0B.(0`%+C$""@(_[__^L!(*#C!#@!XP,@A>>^,MCA#0!3XP0@@@($ -M.`$#`R"%!UX``.H$`*#A(!&?Y?[__^L``%#C(0``&@(@H.,$.`'C`R"%YR0` -MV.4``H7@,$"(XKXBV.$&"X#B#`"`X@00H.$0`%+C$""@(_[__^LD`-CE"@"` -MXJAG`>,``H;@``"%X`0`@.(0$(3B"""@X_[__^LD`-CE#@"`X@`"AN```(7@ -M!`"`XA@0A.(((*#C_O__ZP$@H.,!.P'C`R#%YS<``.H$`*#AC!"?Y?[__^L` -M`%#C+P``&@0@H.,$.`'C`R"%YR0`V.4``H7@OB+8X08+@.(,`(#B,!"(XA`` -M4N,0(*`C_O__ZR4``.KT$```Z````/`!``#\`````!$``#01``!@$0`````` -M`#`!``"D$0``=`\``.P1```8$@``0!(``'`2``!4#P``9`\``*`2``!\#P`` -MN!(``(0/``#4$@``\!(```P3```H$P``1!,``&`3``!\$P``N!,``$0!``#( -M$```U!```%P!``#0$P``%`\````@H.,$.`'C`R"%YR0@V.4(.`'C`R"%YP$@ -MH..^/X/B`R#%Y[\_0^(#()7G6#!#X@,@A><%`*#A,!"(XG(@[^8D,-CE)/O_ -MZP4`H.'^___K`&!0XKT```H`0*#CZ$"&Y00X`>,#,)7G[#"&Y8X``.H``%3C -MC```"@0`H.$,$(KB_O__ZP!`H..'``#J`$"4Y000V.4%(-CE!C#8Y0<`V.4` -M`(WE"`#8Y00`C>4)`-CE"`"-Y=P`'^7^___K;#"4Y1$`$^,@```*!#"8Y0$` -M<^,#```:N"#8X0$X@^(#`%+A&0``"E<-A.(8`(#B!!"(XO[__^L`0%#B`$#@ -M`VH```KH-M3EW0!3XS``4Q,*```:Z2;4Y0(@@N(@`%+C(""@(PP@B.40`(CB -M;AZ$X@@0@>+^___K`$"@XUL``.I@`1_E_O__ZP!`H.-7``#J%4#@XU4``.H& -M`*#A"!"@X;0@U^$G^__K`$"@X4\``.JT4-?A`$"4Y9`!'^68$1_E!2"@X?[_ -M_^ML,)3E$``3XQ5`X`-%```*#E!%XG0'E.4``%#C`P``"H`7E.7^___K`#"@ -MXW0WA.4``%7C`$"@TSH``-H%`*#A_O__ZW0'A.6`5X3E``!0XP4``!KP`1_E -M_!$?Y7PJ`>/^___K%4#@XRX``.H.$(CB!2"@X?[__^L`0*#C*0``ZK10U^$` -M0)3E*`(?Y202'^4%(*#A_O__ZVPPE.40`!/C%4#@`Q\```H.4$7B>`>4Y0`` -M4.,#```*A!>4Y?[__^L`,*#C>#>$Y0``5>,`0*#3%```V@4`H.'^___K>`>$ -MY817A.4``%#C!0``&H@"'^6($A_EH2H!X_[__^L50.#C"```Z@X0B.(%(*#A -M_O__ZP!`H.,#``#JK`(?Y?[__^M>0.#C$@``Z@``5.,0```:``"7Y;1@U^$- -M(*#A?SW"XS\PP^,(H)/E!E"0X`I0U3``H*`S``!:XP,``!H($*#A!B"@X?[_ -M_^L`8*#A``!6XPU`X!,0`)WEM!#7X?[__^L$`*#A3-"-XO"/O>A`,)WE``!3 -MX^W\_QKO_/_J0#"=Y0``4^,+_?\:#?W_Z@Q`B.($`*#A1!,?Y?[__^L!`'#B -M``"@,P`PH./+_?_J`$"@X]3__^H50.#CTO__ZO!'+>D`8*#A`4"@X?P[".,# -M`%+AG@``"OX[".,#`%+A7F#@$YT``!JT`='A/P!0XY4``)H0,)'E``!3XY(` -M``K^___K`("@X0"0H.$``%#C"V#@`Y$```H0$)3EM*'4X0T@H.%_/<+C/S## -MXPAPD^4*4)'@!U#5,`!PH#,``%?C!```&@H@H.'^___K``!0XPD```H#``#J -M``!:XP8```H*$*#A_O__ZP@`H.&T$=3A_O__ZPU@X.-X``#J`!"9Y0$P0>(# -M`%/C`_&?EU(``.I`:@``^&H``!!K```H:P``$!"9Y>!2EN4,,-GE!P!3XP@` -M`(K<,-GA`2"@XQ(SH.'<`!/C(0``&B``$^,;```:`@`3XP$``!I>8.#C0P`` -MZ@(@H..H-P'C`R"%Y_\0`>(!`%'C`@``"@(`4>$3```:!@``Z@0PH.,0*P'C -M`C"%YQ0K`>,",(7G`&"@XS,``.H'(*#C$#L!XP,@A><&(*#C%#L!XP,@A><` -M8*#C*P``Z@8`H.$KYO_K`&"@X2<``.H`8*#C)0``ZN`"EN4P$(GBO"#9X=7S -M_^L`8*#A'P``Z@8`H.$)$*#AM"'4X3WR_^L`8*#A&0``ZN!2EN4,,)GE`0!3 -MXP,```H"`%/C7F#@$Q(``!H$``#J!0"@X?[__^L``%#C!```&@4``.H%`*#A -M_O__ZP``4.,!```*`&"@XP8``.H`8.#C!```Z@```.,``$#C_O__ZUY@X.,2 -M``#J``!6XQ```!H0`)3EM*'4X0T@H.%_/<+C/S##XPAPD^4*4)#@!U#5,`!P -MH#,``%?C`P``&@D0H.$*(*#A_O__ZP"@H.$``%KC#6#@$P@`H.&T$=3A_O__ -MZP0``.H58.#C`@``ZA`0@>(Z^O_K`&"@X08`H.'PA[WH$$`MZ0!``.,`0$#C -M`#"@XQ0PA.5D`*#C_O__ZQ1`E.4"`%3C`0``&@P`G^7^___K!`"?Y?[__^L0 -M@+WH&````'!`+>D`0`#C`$!`XQA0A.(%`*#A`!"@XP`@`.,`($#C_O__ZP4` -MH.'^___K`C"@XQ0PA.5P@+WH$$`MZ60R`^,#,)#G_S3#X_\PP^,!"%/C(P`` -M"E@R`^,#,-#G``!3XR$```IE,@/C`S#0YP$`4^,#```:3#8#XP,PD.("4*#A`V"@ -MX>!"D.4$`*#A_O__ZP``4.,$```:D`&?Y9`1G^7^___K`$#@XUT``.K(-0/C -M`S"4YP``4^,$```:=`&?Y6P1G^7^___K`$#@XU0``.JT@-7A(`!8XP0``)I8 -M`9_E3!&?Y?[__^L&0.#C3```ZFPPE.40`!/C!```"CP!G^4L$9_E_O__ZP!` -MX.-$``#J$#L!XP.@E.>V,-7A``!3XSX```H``%CC/```"B``6.,@@*`C!%"- -MX@4`H.$`$*#C)""@X_[__^LH<(WB)(`GY00`A>(&$*#A"""@X?[__^N$8(3B -MA#"4Y7@PA.4$<(?B!@"@X7@0E.7^___K`0!0XQT```IX4)3E!0"@X2PPD.1X -M,(3E!Q"@X00@G>7^___K`0!0X_'__QHH()7E!#"=Y0,`4N'M__\:;#"4Y2`` -M$^,#```*?""5Y3PQE.4#`%+AYO__&@0`H.%\$)7E_O__ZP``4.,$```:5`"? -MY4`0G^7^___K`$#@XPD``.H$`*#A"A"@X?[__^L$`*#A!!"-XO[__^L``%#C -M`$#@`P````H`0*#C!`"@X2S0C>+PA;WH+!0``'0!``!(%```9!0``(@4``"T -M%```\$\MZ2S03>("4*#A`V"@X>!"D.4$`*#A_O__ZP``4..9```*B#4#XP,0 -ME.<``%'C`P``"F`"G^7^___K`$#@XY(``.K(-0/C`S"4YP``4^.-```*G34# -MXP,PU.<``%/CB0``"A`UU.4!`%/C`P``&@0`H.'^___K`$"@XX,``.IL,)3E -M(@T3XP,```H$`*#A_O__ZP!`H.-\``#JM##5X4\/4^,K```:MC#5X0(`$^,A -M```*`7#6Y2``5^,@<*"C!("-X@@`H.$`$*#C)""@X_[__^L44(;B!`"(X@40 -MH.$'(*#A_O__ZP1PC>6L`9_E!1"@X0$@UN7^___K_O__ZPTPH.%_74!,(/B!#"%Y00`H.$($*#A_O__ZP!`H.$$,)7E`3!#X@0PA>7^___K -M4```Z@`PUN4!`%/C4```&E0!G^7^___K`$#@XTT``.H+`%/C1```F@8`H.$\ -M$9_E#""@X_[__^L!`%#C/@``&K1PU>$,<$?B#&"&X@0`C>(`$*#C)""@X_[_ -M_^L0H9_E"("-X@R1G^4,L9_E(```Z@8`H.$`$`#C`!!`XP,@C>+^___K`U#= -MY5,`5>,:```:`6"&X@H`H.'^___K`7!'XL=?Q^$&`*#AT!"?Y0(@C>+^___K -M`6"&X@%01>("(-WE`@!5X0<``+H$((WE"`"@X080H.'^___K"0"@X0L0H.$( -M(*#A_O__ZP)PW>4'8(;@!7!GX```5^/<___*_O__ZPTPH.%_74!,(/B!#"%Y00`H.$$$(WB_O__ZP!`H.$$,)7E`3!#X@0PA>7^___K`@`` -MZ@0`H.'^___K`$"@X0``5.,`0*`3````&@!`X.,$`*#A+-"-XO"/O>CD%``` -M^!0``"`5``"(`0``8!4``'P5``"8`0``7!4``/!/+>E9WTWB`+"@X1`0C>4" -M@*#A%#"-Y>"2D.6T8-+A!J"@X08`H.'^___K`%!0X@M`X`-S`0`*`!"8Y0T` -MH.%_/<#C/S##XPAPD^4&0)'@!T#4,`!PH#,``%?C!0``&@4`H.$&(*#A_O__ -MZP``4.,*```*!```Z@``5N,'```*!0"@X080H.'^___K!0"@X0H0H.'^___K -M#4#@XUD!`.JV(-CA9C<(XP,`4N$`,*`3`3"@`P@`5N,`,*#3``!3XQ8```H` -M,`#C`#!`XZ@QD^4\,(WE`##5Y=T`4^-%`0`:`@"%XCP0C>($(*#C_O__ZP$` -M4.,_`0`:`@Q6XP)LH*,5#8GB"P"`X@40H.$&(*#A_O__ZTQGB>4`0*#C-@$` -MZ@L`5N,#``#*``!6XP!`H,,-``#*%0``Z@4`H.'0%)_E#""@X_[__^L!`%#C -M]?__&@L`H.$0$)WE"""@X04PH.'W_O_K`$"@X2,!`.H$,-7G82!#XG(@[^89 -M`%+C(#!#D@0PQ9*R$(#A"P"@X0(<".-,((WB_O__ZP4`H.$`$`#C`!!`XP,@H./^___KP@`` -MZ@```.,``$#C_O__ZUPPC>(`(`#C`"!`XP,`DN@#(*#A!`""Y``0PN7P+@_C -M_R]/XP00H.,6#HWBLA"`X0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`00.,# -M(*#C_O__ZP`P`.,`,$#C%$"3Y0(`5..E```:`T"@X1@`@^+^___K`3"@XQ0P -MA.6?``#J;#"9Y0$`$^,&```*!0"@X0`0`.,`$$#C>C4!X],@F>'^___KE0`` -MZ@4`H.$`$`#C`!!`XP,@H./^___KCP``Z@L`H.$0$)WE+""-XA0PG>5$\O_K -M``!0XP!`H!,L()T%@SX-`QLS1`.3$L,`PB^@`4-)8@`%`*#A`!``XP`00.,$ -M(*#A_O__ZWP``.I`$9OE`"#1Y0$PT>4"`-'E``"-Y0,`T>4$`(WE!`#1Y0@` -MC>4%$-'E#!"-Y04`H.$`$`#C`!!`X_[__^ML``#J`3"@XTHUR>4%`*#A`!`` -MXP`00.,#(*#C_O__ZV0``.H`,*#C2C7)Y04`H.$`$`#C`!!`XP,@H./^___K -M7```ZCQ`C>(%`*#A`!``XP`00.,$(*#A_O__ZP0`H.$`$`#C`!!`X_[__^L` -M`%#C`#"@`T@PC043```*/`"-X@`0`.,`$$#C_O__ZP``4.,",*`#2#"-!0L` -M``H\`(WB`!``XP`00./^___K``!0XP4PH`-(,(T%`P``"GP!G^5\$9_E/""- -MXO[__^L`,`#C`#!`XTA`G>4`0,/E'$"-X@0`H.%($(WB!""@X_[__^L+`*#A -M$!"=Y00@H.$4,)WEWNO_ZP``4.,"```*-`&?Y2P1G^7^___K````XP``0.-( -M$)WE_O__ZP4`H.$`$`#C`!!`XP,@H./^___K'0``Z@`P`.,`,$#C`##3Y0`` -M4^,%```*`@!3XPU`H`,#```*!0!3XPY`H`,````*"T"@XP4`H.$`$`#C`!!` -MXP0@H.'^___K`#``XP`P0.,```#C``!`XP00H.$`(-/E_O__ZP0``.H%`*#A -M`!``XP`00.,#(*#C_O__ZP"0F.6T0-CA!0"@X?[__^L!<(#B=W#_Y@<`5.$$ -M<*`Q#2"@X7\]PN,_,,/C"&"3Y0=`F>`&0-0P`&"@,P``5N,$```:"0"@X040 -MH.$'(*#A_O__ZP!PH.$``%?C#4#@$P```!H`0*#C!0"@X0H0H.'^___K!`"@ -MX5G?C>+PC[WHB`$``#````!<%@``K`$``'@6``#P1RWI`F"@X>!"D.4$`*#A -M_O__ZP``4.,$```:\`"?Y?`0G^7^___K`$#@XS8``.K(-0/C`S"4YP``4^,O -M```*L##6X0$`4^,$```*R`"?Y<`0G^7^___K%4#@XRH``.H0.P'C`Z"4YX1P -MA.*$,)3E>#"$Y0)@AN(&@*#C!P"@X7@0E.7^___K`0!0XP4``!H$`*#A!A"@ -MX?[__^L``%#C%@``"A<``.IX4)3E!0"@X2`PD.1X,(3E!A"@X0@@H.'^___K -M`0!0X^O__QH$`*#A?!"5Y?[__^L``%#C!P``"@0`H.$*$*#A_O__ZP0`H.$& -M$*#A_O__ZP``4.,!```:`$#@XP```.H`0*#C!`"@X?"'O>@L%```O`$``!`7 -M``!P0"WI`E"@X>!"D.4$`*#A_O__ZP``4.,`0*`#'P``"ITU`^,#,-3G``!3 -MXQH```H`,)7E`P!3XP/QGY<#``#J>'D``'!Y``"(>0``@'D``!5`X.,1``#J -M`%"@XP0``.H"4*#C`@``Z@10H.,```#J`5"@XP0`H.$%$*#A_O__ZP``4.,$ -M```*!`"@X040H.'^___K`$"@XP```.H`0.#C!`"@X7"`O>A`0@\`@(0>`&#L -M4P#`V*<`@(U;`$!4B0``&[<`@*@2`0`V;@$`424"`&S<`H#Y-P/(%0``^!4` -M`#@7``!`%P``3!<``%07``!@%P``,# +M,)7G[#"&Y8X``.H``%3CC```"@0`H.$,$(KB_O__ZP!`H..'``#J`$"4Y000 +MV.4%(-CE!C#8Y0<`V.4``(WE"`#8Y00`C>4)`-CE"`"-Y=P`'^7^___K;#"4 +MY1$`$^,@```*!#"8Y0$`<^,#```:N"#8X0$X@^(#`%+A&0``"E<-A.(8`(#B +M!!"(XO[__^L`0%#B`$#@`VH```KH-M3EW0!3XS``4Q,*```:Z2;4Y0(@@N(@ +M`%+C(""@(PP@B.40`(CB;AZ$X@@0@>+^___K`$"@XUL``.I@`1_E_O__ZP!` +MH.-7``#J%4#@XU4``.H&`*#A"!"@X;0@U^$G^__K`$"@X4\``.JT4-?A`$"4 +MY9`!'^68$1_E!2"@X?[__^ML,)3E$``3XQ5`X`-%```*#E!%XG0'E.4``%#C +M`P``"H`7E.7^___K`#"@XW0WA.4``%7C`$"@TSH``-H%`*#A_O__ZW0'A.6` +M5X3E``!0XP4``!KP`1_E_!$?Y7PJ`>/^___K%4#@XRX``.H.$(CB!2"@X?[_ +M_^L`0*#C*0``ZK10U^$`0)3E*`(?Y202'^4%(*#A_O__ZVPPE.40`!/C%4#@ +M`Q\```H.4$7B>`>4Y0``4.,#```*A!>4Y?[__^L`,*#C>#>$Y0``5>,`0*#3 +M%```V@4`H.'^___K>`>$Y817A.4``%#C!0``&H@"'^6($A_EH2H!X_[__^L5 +M0.#C"```Z@X0B.(%(*#A_O__ZP!`H.,#``#JK`(?Y?[__^M>0.#C$@``Z@`` +M5.,0```:``"7Y;1@U^$-(*#A?SW"XS\PP^,(H)/E!E"0X`I0U3``H*`S``!: +MXP,``!H($*#A!B"@X?[__^L`8*#A``!6XPU`X!,0`)WEM!#7X?[__^L$`*#A +M3-"-XO"/O>A`,)WE``!3X^W\_QKO_/_J0#"=Y0``4^,+_?\:#?W_Z@Q`B.($ +M`*#A1!,?Y?[__^L!`'#B``"@,P`PH./+_?_J`$"@X]3__^H50.#CTO__ZO!' +M+>D`8*#A`4"@X?P[".,#`%+AG@``"OX[".,#`%+A7F#@$YT``!JT`='A/P!0 +MXY4``)H0,)'E``!3XY(```K^___K`("@X0"0H.$``%#C"V#@`Y$```H0$)3E +MM*'4X0T@H.%_/<+C/S##XPAPD^4*4)'@!U#5,`!PH#,``%?C!```&@H@H.'^ +M___K``!0XPD```H#``#J``!:XP8```H*$*#A_O__ZP@`H.&T$=3A_O__ZPU@ +MX.-X``#J`!"9Y0$P0>(#`%/C`_&?EU(``.K(:0``@&H``)AJ``"P:@``$!"9 +MY>!2EN4,,-GE!P!3XP@``(K<,-GA`2"@XQ(SH.'<`!/C(0``&B``$^,;```: +M`@`3XP$``!I>8.#C0P``Z@(@H..H-P'C`R"%Y_\0`>(!`%'C`@``"@(`4>$3 +M```:!@``Z@0PH.,0*P'C`C"%YQ0K`>,",(7G`&"@XS,``.H'(*#C$#L!XP,@ +MA><&(*#C%#L!XP,@A><`8*#C*P``Z@8`H.%)YO_K`&"@X2<``.H`8*#C)0`` +MZN`"EN4P$(GBO"#9X=7S_^L`8*#A'P``Z@8`H.$)$*#AM"'4X3WR_^L`8*#A +M&0``ZN!2EN4,,)GE`0!3XP,```H"`%/C7F#@$Q(``!H$``#J!0"@X?[__^L` +M`%#C!```&@4``.H%`*#A_O__ZP``4.,!```*`&"@XP8``.H`8.#C!```Z@`` +M`.,``$#C_O__ZUY@X.,2``#J``!6XQ```!H0`)3EM*'4X0T@H.%_/<+C/S## +MXPAPD^4*4)#@!U#5,`!PH#,``%?C`P``&@D0H.$*(*#A_O__ZP"@H.$``%KC +M#6#@$P@`H.&T$=3A_O__ZP0``.H58.#C`@``ZA`0@>(Z^O_K`&"@X08`H.'P +MA[WH$$`MZ0!``.,`0$#C`#"@XQ0PA.5D`*#C_O__ZQ1`E.4"`%3C`0``&@P` +MG^7^___K!`"?Y?[__^L0@+WH&````'!`+>D`0`#C`$!`XQA0A.(%`*#A`!"@ +MXP`@`.,`($#C_O__ZP4`H.'^___K`C"@XQ0PA.5P@+WH$$`MZ6`R`^,#,)#G +M_S3#X_\PP^,!"%/C(P``"E0R`^,#,-#G``!3XR$```IA,@/C`S#0YP$`4^,# +M```:2#8#XP,PD.("4*#A`V"@X>!"D.4$`*#A_O__ZP``4.,$```:D`&?Y9`1G^7^ +M___K`$#@XUT``.K$-0/C`S"4YP``4^,$```:=`&?Y6P1G^7^___K`$#@XU0` +M`.JT@-7A(`!8XP0``)I8`9_E3!&?Y?[__^L&0.#C3```ZFPPE.40`!/C!``` +M"CP!G^4L$9_E_O__ZP!`X.-$``#J$#L!XP.@E.>V,-7A``!3XSX```H``%CC +M/```"B``6.,@@*`C!%"-X@4`H.$`$*#C)""@X_[__^LH<(WB)(`GY00`A>(& +M$*#A"""@X?[__^N$8(3BA#"4Y7@PA.4$<(?B!@"@X7@0E.7^___K`0!0XQT` +M``IX4)3E!0"@X2PPD.1X,(3E!Q"@X00@G>7^___K`0!0X_'__QHH()7E!#"= +MY0,`4N'M__\:;#"4Y2``$^,#```*?""5Y3PQE.4#`%+AYO__&@0`H.%\$)7E +M_O__ZP``4.,$```:5`"?Y4`0G^7^___K`$#@XPD``.H$`*#A"A"@X?[__^L$ +M`*#A!!"-XO[__^L``%#C`$#@`P````H`0*#C!`"@X2S0C>+PA;WH_!,``'0! +M```8%```-!0``%@4``"$%```\$\MZ2S03>("4*#A`V"@X>!"D.4$`*#A_O__ +MZP``4..9```*A#4#XP,0E.<``%'C`P``"F`"G^7^___K`$#@XY(``.K$-0/C +M`S"4YP``4^.-```*F34#XP,PU.<``%/CB0``"A`UU.4!`%/C`P``&@0`H.'^ +M___K`$"@XX,``.IL,)3E(@T3XP,```H$`*#A_O__ZP!`H.-\``#JM##5X4\/ +M4^,K```:MC#5X0(`$^,A```*`7#6Y2``5^,@<*"C!("-X@@`H.$`$*#C)""@ +MX_[__^L44(;B!`"(X@40H.$'(*#A_O__ZP1PC>6L`9_E!1"@X0$@UN7^___K +M_O__ZPTPH.%_74!,(/B!#"%Y00`H.$($*#A_O__ZP!`H.$$ +M,)7E`3!#X@0PA>7^___K4```Z@`PUN4!`%/C4```&E0!G^7^___K`$#@XTT` +M`.H+`%/C1```F@8`H.$\$9_E#""@X_[__^L!`%#C/@``&K1PU>$,<$?B#&"& +MX@0`C>(`$*#C)""@X_[__^L0H9_E"("-X@R1G^4,L9_E(```Z@8`H.$`$`#C +M`!!`XP,@C>+^___K`U#=Y5,`5>,:```:`6"&X@H`H.'^___K`7!'XL=?Q^$& +M`*#AT!"?Y0(@C>+^___K`6"&X@%01>("(-WE`@!5X0<``+H$((WE"`"@X080 +MH.'^___K"0"@X0L0H.$((*#A_O__ZP)PW>4'8(;@!7!GX```5^/<___*_O__ +MZPTPH.%_74!,(/B!#"%Y00`H.$$$(WB_O__ZP!`H.$$,)7E +M`3!#X@0PA>7^___K`@``Z@0`H.'^___K`$"@X0``5.,`0*`3````&@!`X.,$ +M`*#A+-"-XO"/O>BT%```R!0``/`4``"(`0``,!4``$P5``"8`0``+!4``/!/ +M+>E9WTWB`+"@X1`0C>4"@*#A%#"-Y>"2D.6T8-+A!J"@X08`H.'^___K`%!0 +MX@M`X`."`0`*`!"8Y0T`H.%_/<#C/S##XPAPD^4&0)'@!T#4,`!PH#,``%?C +M!0``&@4`H.$&(*#A_O__ZP``4.,*```*!```Z@``5N,'```*!0"@X080H.'^ +M___K!0"@X0H0H.'^___K#4#@XV@!`.JV(-CA9C<(XP,`4N$`,*`3`3"@`P@` +M5N,`,*#3``!3XQ8```H`,`#C`#!`XZ@QD^4\,(WE`##5Y=T`4^-4`0`:`@"% +MXCP0C>($(*#C_O__ZP$`4.-.`0`:`@Q6XP)LH*,5#8GB"P"`X@40H.$&(*#A +M_O__ZTQGB>4`0*#C10$`Z@L`5N,#``#*``!6XP!`H,,-``#*%0``Z@4`H.$, +M%9_E#""@X_[__^L!`%#C]?__&@L`H.$0$)WE"""@X04PH.'W_O_K`$"@X3(! +M`.H$,-7G82!#XG(@[^89`%+C(#!#D@0PQ9*R$(#A"P"@X0(<".-, +M((WB_O__ZP4`H.$`$`#C`!!`XP,@H./^___KP@``Z@```.,``$#C_O__ZUPP +MC>(`(`#C`"!`XP,`DN@#(*#A!`""Y``0PN7P+@_C_R]/XP00H.,6#HWBLA"` +MX0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`00.,#(*#C_O__ZP`P`.,`,$#C +M%$"3Y0(`5..E```:`T"@X1@`@^+^___K`3"@XQ0PA.6?``#J;#"9Y0$`$^,& +M```*!0"@X0`0`.,`$$#C>C4!X],@F>'^___KE0``Z@4`H.$`$`#C`!!`XP,@ +MH./^___KCP``Z@L`H.$0$)WE+""-XA0PG>4U\O_K``!0XP!`H!,L()T%@SX- +M`QLS1`.3$L,`PB^@`4-)8@`%`*#A`!``XP`00.,$(*#A_O__ZWP``.I`$9OE +M`"#1Y0$PT>4"`-'E``"-Y0,`T>4$`(WE!`#1Y0@`C>4%$-'E#!"-Y04`H.$` +M$`#C`!!`X_[__^ML``#J`3"@XTHUR>4%`*#A`!``XP`00.,#(*#C_O__ZV0` +M`.H`,*#C2C7)Y04`H.$`$`#C`!!`XP,@H./^___K7```ZCQ`C>(%`*#A`!`` +MXP`00.,$(*#A_O__ZP0`H.$`$`#C`!!`X_[__^L``%#C`#"@`T@PC043```* +M/`"-X@`0`.,`$$#C_O__ZP``4.,",*`#2#"-!0L```H\`(WB`!``XP`00./^ +M___K``!0XP4PH`-(,(T%`P``"H0!G^6$$9_E/""-XO[__^L`,`#C`#!`XTA` +MG>4`0,/E'$"-X@0`H.%($(WB!""@X_[__^L+`*#A$!"=Y00@H.$4,)WE[>O_ +MZP``4.,"```*/`&?Y301G^7^___K````XP``0.-($)WE_O__ZP4`H.$`$`#C +M`!!`XP,@H./^___K'0``Z@`P`.,`,$#C`##3Y0``4^,%```*`@!3XPU`H`,# +M```*!0!3XPY`H`,````*"T"@XP4`H.$`$`#C`!!`XP0@H.'^___K`#``XP`P +M0.,```#C``!`XP00H.$`(-/E_O__ZP0``.H%`*#A`!``XP`00.,#(*#C_O__ +MZP"0F.6T0-CA!0"@X?[__^L!<(#B=W#_Y@<`5.$$<*`Q#2"@X7\]PN,_,,/C +M"&"3Y0=`F>`&0-0P`&"@,P``5N,$```:"0"@X040H.$'(*#A_O__ZP!PH.$` +M`%?C#4#@$P```!H`0*#C!0"@X0H0H.'^___K!`"@X5G?C>+PC[WHB`$``#`` +M``"8%0```````%06``"L`0``D"8*#AX$*0Y00`H.'^___K``!0 +MXP0``!KP`)_E\!"?Y?[__^L`0.#C-@``ZL0U`^,#,)3G``!3XR\```JP,-;A +M`0!3XP0```K(`)_EP!"?Y?[__^L50.#C*@``ZA`[`>,#H)3GA'"$XH0PE.5X +M,(3E`F"&X@:`H.,'`*#A>!"4Y?[__^L!`%#C!0``&@0`H.$&$*#A_O__ZP`` +M4.,6```*%P``ZGA0E.4%`*#A(#"0Y'@PA.4&$*#A"""@X?[__^L!`%#CZ___ +M&@0`H.%\$)7E_O__ZP``4.,'```*!`"@X0H0H.'^___K!`"@X080H.'^___K +M``!0XP$``!H`0.#C````Z@!`H.,$`*#A\(>]Z/P3``"\`0``"!<``'!`+>D" +M4*#AX$*0Y00`H.'^___K``!0XP!`H`,?```*F34#XP,PU.<``%/C&@``"@`P +ME>4#`%/C`_&?EP,``.I$>0``/'D``%1Y``!,>0``%4#@XQ$``.H`4*#C!``` +MZ@)0H.,"``#J!%"@XP```.H!4*#C!`"@X040H.'^___K``!0XP0```H$`*#A +M!1"@X?[__^L`0*#C````Z@!`X.,$`*#A<("]Z$!"#P"`A!X`8.Q3`,#8IP"` +MC5L`0%2)```;MP"`J!(!`#9N`0!1)0(`;-P"@/DW`\`5``#P%0``,!<``#@7 +M``!$%P``3!<``%@7``!H%P``%]S971?875T:```4/($"PH)"`<&!00#`@$`_P```'-E=%]G -M+```!2```9V5T7W-E;G-I=&EV:71Y`.B+```!2```=W!S7W!R;V)?J+```!2```8VAA;FYE;%]P -M;&%N`````.N+```"2```9&)G`````````````````.R+```#2```%T*``!W<&%?"``(#!X)3`X>"``````"@```#!X)3`U>```)7,Z(&EN/25S"@``+````')E -M86QM87``"D*`"5S(`H`````"2`@"4P,G@``"5S(#!X)3`R6````"`````E``*"0``)7,*"0````!M86,`=FED<&ED``!A8FQEF5=(#T@)60`6R5S72!W<'-?``` -M"CT]/3T]/3T@0D(@4D5'(#T]/3T]/3T*``````H]/3T]/3T]($U!0R!214<@ -M/3T]/3T]/0H```!R='=?"D],'@E>`H```!R='=?"5X*3TP>"5X"@!R='=? -M=W)I=&4S,B@P>"5X*3TP>"5X"@!R96%D7V)B"5X*3TP>"5X"@!R96%D(%)&7W)E9R!P871H*#!X)3`R -M>"DL;V9F"D*`````'=R:71E(%)&7W)E -M9R!P871H*#!X)3`R>"DL;V9F"D*```` -M9G=S=&%T93TP>"5X"@```&%U=&A?86QG/3!X)7@L(&5N8U]A;&<],'@E>"P@ -M875T:%]T>7!E/3!X)7@L(&5N8U]T>7!E/3!X)7@*`'!M;&UE:6YF;RT^`H``'%O#HE,#)X.B4P,G@Z)3`R>#HE,#)X.B4P,G@*`````')T`H``'1I9#TE9"P@:6YD:6-A=&5?"5X+"!A`H````H02E$349L86<],'@E>`H`8E-U&UI=&)U9E]C -M;G0])60L(&9R965?>&UI=&9R86UE7V-N=#TE9`H`"5X+"!T:6U?8FET;6%P/3!X)7@* -M`````'-L965P<5]L96X])60*``!D=6UP(')X('!A8VME="`H)60I"@`````C -M(R,C(R,@2!F=6YC=&EO;@H````@/3T]($1-1FQA9R@P>"4P,G@I(#T]/2`* -M````97AT6YA;6EC(&9U;F,@ -M"@!E>'1R85]A'1R85]A&ES -M=&5N8V4@+2!"250H,RD*````97AT'1R85]A"5X"@!W -M&,U."D],'@E>`H`"5X -M"@!D8F#8P."D],'@E>`H`````9&)G -M*#!X,C@P*3TP>"5X"@````!D8F#(X -M."D],'@E>`H`````9&)G*#!X-C8T*3TP>"5X"@````!D8F#0S."D],'@E>`H`````9&)G*#!X-#0P*3TP>"5X"@`` -M``!D8F#0X-"D],'@E>`H`````9&)G -M*#!X-#@X*3TP>"5X"@````!D8F#0T -M."D],'@E>`H`````9&)G*#!X-#1C*3TP>"5X"@````!D8F#HE,#)X.B4P,G@Z)3`R>`H`````.#%]D2!F;W(@ -M;F]R;6%L(&UO9&4L(&-A;B=T(&5N=&5R(&UP(&UO9&4*````/3T^('1R:6=G -M97(@9W!I;R`P"@`]/3X@`H```!;%]S971?<&UK:61=($E77U!-2U-!7U)%34]6 -M12$*`````%MR='=?=WA?2!I -M;F1E>"`]("5D(&9O`H`````16YC#TE9`H``'=E<"P@#TP"@``;F]N90````!42TE0`````$-#35``````)7,N -M+BYC86QL(')T=U]I;F1I8V%T95]D:7-C;VYN96-T"B``4T54(%=04U])10H` -M4T54(%=04U])12P@=W!S7W!H87-E/3U?5%)510H```!)145%(#@P,BXQ,6)N -M````245%12`X,#(N,3%B`````$E%144@.#`R+C$Q8F=N``!)145%(#@P,BXQ -M,6)G````245%12`X,#(N,3%A;@```$E%144@.#`R+C$Q80````!)145%(#@P -M,BXQ,6=N````245%12`X,#(N,3%G`````'5N87-S;V-I871E9``````@4F%T -M97,@*$UB+W,I.B```````"XU```E9"5S(````'=X7V=E=%]S8V%N+"!M8W-? -M`H``'=P85]I93T`)3`R>`````!R#HE -M,#)X.B4P,G@Z)3`R>`H``')T=U]D96Q?#HE,#)X.B4P -M,G@Z)3`R>#HE,#)X"@``7!T:6]N+"!C2P@5T50"@`E -M2P@5$M)4`H`````)7,L('-E="!G2P@5T50"@``)7,L('-E="!P86ER=VES92!K97DL(%1+ -M25`*`"5S+"!S970@<&%I2P@;F]N90H`#HE,#)X.B4P,G@Z)3`R>`H`#HE,#)X -M.B4P,G@Z)3`R>``E*G,@)7,``%53``!%50``2E```"5S('5N:VYO=VX@8V]U -M;G1R>5]C;V1E.B5S"@`E'0`+G)E;"YD871A`"YB'1A8@`N&ED>``N0`` -MO`$`````````````!``````````E````"0``````````````Z/<``(@"```/ -M`````P````0````(````+P````@````#`````````+![``!@```````````` -M```(`````````#0````!`````@````````"P>P``#```````````````!``` -M``````!#`````0``<((`````````O'L``%`"```!``````````0````````` -M/P````D``````````````'#Z``!H`@``#P````<````$````"````$X````! -M`````@`````````,?@``Q`,`````````````!`````````!6`````0```#(` -M````````T($``(@7``````````````0````!````90````$````````````` -M`%B9```2```````````````!`````````&X````!``````````````!JF0`` -M`````````````````0````````!^`````P``<```````````:ID``"L````` -M``````````$`````````$0````,``````````````)69``".```````````` -M```!``````````$````"``````````````#,G```H!X``!````!U`0``!``` -M`!`````)`````P``````````````;+L``'01``````````````$````````` -M``````````````````````$```````````````0`\?\````````````````# -M``$``````````````````P`#``````````````````,`!0`/`````````$`` -M```"``$`&0`````````````````!``````````````````,`!@`````````` -M```````#``<`'````$`````(`````@`!`!D```!``````````````0`L```` -M2````%`````"``$`&0```$@````````````!`#P```"8````4`````(``0`9 -M````F`````````````$`&0```.@````````````!`$P````L`0``'`````(` -M`0`9````+`$```````````$`6P```$@!``!4`````@`!`!D```!(`0`````` -M`````0!K````G`$``!P````"``$`&0```)P!```````````!`'L```"X`0`` -M'`````(``0`9````N`$```````````$`C````-0!```8`````@`!`!D```#4 -M`0```````````0"=````[`$``#@````"``$`&0```.P!```````````!`*T` -M```D`@``"`````(``0`9````)`(```````````$`O@```"P"```(`````@`! -M`!D````L`@```````````0#$````-`(```@````"``$`&0```#0"```````` -M```!`.`````\`@``"`````(``0`9````/`(```````````$`]P```$0"```( -M`````@`!`!D```!$`@```````````0`-`0``3`(```@````"``$`&0```$P" -M```````````!`!P!``!4`@``"`````(``0`9````5`(```````````$`*`$` -M`%P"```(`````@`!`!D```!<`@```````````0`T`0``9`(```@````"``$` -M&0```&0"```````````!`$$!``!L`@``"`````(``0`9````;`(````````` -M``$`2@$``'0"``"``````@`!`!D```!T`@```````````0!A`0``]`(``*0` -M```"``$`&0```/0"```````````!`&T!````````````````"@!R`0`````` -M``````````D`?`$``!0````````````*`($!``"8`P``\`````(``0`9```` -MF`,```````````$`DP$``+0````````````*`)@!``#8````````````"@"= -M`0``@`0```````````$`&0```(@$```````````!`*`!``#T```````````` -M"@"E`0``(`$```````````H`J@$``#0!```````````*`+`!```H`0`````` -M````"@"=`0``P`4```````````$`M0$``,0%``!(`````@`!`!D```#$!0`` -M`````````0#$`0``.`$```````````H`R@$```P&``!$"````@`!`!D````, -M!@```````````0#;`0``N`(```````````H`X0$``,`"```````````*`)T! -M``#`#0```````````0#G`0``4`X``$0!```"``$`&0```%`.```````````! -M`)T!``",#P```````````0#U`0``E`\``*P$```"``$`&0```)0/```````` -M```!``8"``!``0``````````"@`,`@``3`$```````````H`$@(``"`#```` -M```````*`!@"``"(`P``````````"@`>`@``U`(```````````H`)`(``"@# -M```````````*`"H"``!L`P``````````"@`P`@``V`(```````````H`G0$` -M`!04```````````!`#8"``!`%```[`$```(``0`9````0!0```````````$` -M2`(``,`#```````````*`$X"````````````````!0"=`0``%!8````````` -M``$`6`(``"P6``"$`0```@`!`!D````L%@```````````0!C`@``+`0````` -M``````H`:0(``$`$```````````*`&\"``!(!```````````"@!U`@``4`0` -M``````````H`>P(``&`$```````````*`($"``!4!```````````"@"=`0`` -MI!<```````````$`AP(``+`7```T`````@`!`!D```"P%P```````````0"5 -M`@``=`0```````````H`&0```.07```````````!`)L"``!\!``````````` -M"@"A`@``:`(```````````H`&0```'P8```````````!`*<"``"8!``````` -M````"@"M`@``E!D``!@````"``$`&0```)09```````````!`+P"``"L&0`` -M@`P```(``0`9````K!D```````````$`G0$``.`9```````````!`!D````@ -M&@```````````0#)`@``M`0```````````H`SP(``,P$```````````*`-4" -M``#D!```````````"@#;`@``_`0```````````H`X0(``!0%```````````* -M`.<"```L!0``````````"@#M`@``1`4```````````H`\P(``%P%```````` -M```*`/D"``!T!0``````````"@#_`@``K`4```````````H`!0,``.0%```` -M```````*``L#``#T!0``````````"@`1`P``,`8```````````H`%P,``$@& -M```````````*`!T#``!8!@``````````"@`C`P``:`8```````````H`*0,` -M`'0&```````````*`"\#``"`!@``````````"@`U`P``D`8```````````H` -M.P,``,`&```````````*`$$#``#8!@``````````"@!'`P``_`8````````` -M``H`30,``"0'```````````*`%,#``!(!P``````````"@!9`P``7`<````` -M``````H`7P,``(P'```````````*`&4#``#X!P``````````"@!K`P``%`@` -M``````````H`<@,``"0(```````````*`'D#``!,"```````````"@"``P`` -M>`@```````````H`AP,``)`(```````````*`(X#``#("```````````"@"5 -M`P``"`D```````````H`G`,``"0)```````````*`*,#```\"0`````````` -M"@"J`P``4`D```````````H`L0,``%@)```````````*`+@#``!\"0`````` -M````"@"_`P``[`H```````````H`Q@,``/P*```````````*`,T#```,"P`` -M````````"@#4`P``'`L```````````H`VP,``"P+```````````*`.(#``!` -M"P``````````"@#I`P``5`L```````````H`\`,``&@+```````````*`/<# -M``!\"P``````````"@#^`P``D`L```````````H`!00``*0+```````````* -M``P$``"X"P``````````"@`3!```S`L```````````H`&@0``.`+```````` -M```*`"$$``#T"P``````````"@`H!```"`P```````````H`+P0``!P,```` -M```````*`#8$```P#```````````"@`]!```1`P```````````H`1`0``%@, -M```````````*`$L$``!L#```````````"@"=`0``\"4```````````$`4@0` -M`"PF```H`````@`!`!D````L)@```````````0!J!```5"8``!@#```"``$` -M&0```%0F```````````!`'H$``!\#```````````"@"!!```K`P````````` -M``H`B`0``)0,```````````*`(\$``!L*0``6`,```(``0`9````;"D````` -M``````$`G0$``*PL```````````!`*`$``#$+```7`(```(``0`9````Q"P` -M``````````$`G0$``!`O```````````!`+$$```@+P``<`$```(``0`9```` -M("\```````````$`G0$``*`O```````````!`!D```"\+P```````````0#` -M!```D#```#0````"``$`&0```)`P```````````!`-`$```8#@`````````` -M"@#7!```Q#```%`````"``$`&0```,0P```````````!`.@$```4,0``;``` -M``(``0`9````%#$```````````$`]P0``(`Q``"8`@```@`!`!D```"`,0`` -M`````````0`&!0``*`X```````````H`#04``)@.```````````*`!0%``#` -M#@``````````"@"=`0``"#0```````````$`&P4``!@T``#4`P```@`!`!D` -M```8-````````````0`N!0``%`\```````````H`G0$``-0W```````````! -M`#4%``#L-P``2`$```(``0`9````[#<```````````$`G0$``%`X```````` -M```!`!D```!@.````````````0!(!0``=`\```````````H`3P4``'P/```` -M```````*`%8%``"$#P``````````"@!=!0``-#D``"P!```"``$`&0```#0Y -M```````````!`)T!``!<.0```````````0`9````B#D```````````$`G0$` -M`%@Z```````````!`&T%``!@.@``U`,```(``0`9````8#H```````````$` -MG0$``'P[```````````!`!D```"\.P```````````0"=`0``6#P````````` -M``$`&0```)@\```````````!`)T!```L/@```````````0!\!0``-#X``!@` -M```"``$`&0```#0^```````````!`(X%``!,/@``J`$```(``0`9````3#X` -M``````````$`G@4``/0_``!4`0```@`!`!D```#T/P```````````0"=`0`` -M1$$```````````$`K@4``$A!``"$`0```@`!`!D```!(00```````````0"^ -M!0``W`\```````````H`Q04``.P/```````````*`,P%``#\#P`````````` -M"@#3!0``#!````````````H`V@4``!P0```````````*`.$%```L$``````` -M````"@#H!0``/!````````````H`[P4``$P0```````````*`/8%``!<$``` -M````````"@#]!0``S$(``$`!```"``$`&0```,Q"```````````!``X&```` -M`````````````P`8!@``#$0``'0````"``$`&0````Q$```````````!`"@& -M``"`1```W`L```(``0`9````@$0```````````$`-P8``&P0```````````* -M`#X&``"`$```````````"@!%!@``?!````````````H`3`8``(00```````` -M```*`%,&``"P$```````````"@!:!@``N!````````````H`808``,`0```` -M```````*`)T!``!84````````````0!H!@``7%```"P!```"``$`&0```%Q0 -M```````````!`'@&``"(40``9`````(``0`9````B%$```````````$`&0`` -M`.Q1```````````!`!D```!$4@```````````0`9````G%(```````````$` -MB`8``-Q2``#X`````@`!`!D```#<4@```````````0"6!@``\`$````````` -M``H`G0$``-!3```````````!`)P&``#44P``,`````(``0`9````U%,````` -M``````$`J`8```14``#D`````@`!`!D````$5````````````0"[!@``R!`` -M``````````H`G0$``.!4```````````!`,(&``#H5```>!0```(``0`9```` -MZ%0```````````$`G0$``,A5```````````!`!D````45@```````````0"= -M`0``=&4```````````$`&0````!F```````````!`!D```!@:0`````````` -M`0"=`0``,&H```````````$`&0```$!J```````````!`-0&``#P$P`````` -M````"@`9````"&P```````````$`G0$``$1L```````````!`!D```!(;``` -M`````````0#;!@``%!0```````````H`&0```(!L```````````!`.(&``!` -M;0``U`$```(``0`9````0&T```````````$`G0$``/QN```````````!`/,& -M```4;P``O`(```(``0`9````%&\```````````$``P<``%P5```````````* -M`)T!``"P<0```````````0`*!P``T'$``"@&```"``$`&0```-!Q```````` -M```!`)T!``"H0``J`````(``0`9```` -M&'D```````````$`G0$``%AY```````````!`!D```!H>0```````````0`` -M```````````````#``D`H@<````````,`````0`)`+$'```,````$0````$` -M"0#`!P``(`````X````!``D`SP<``#`````1`````0`)`-X'``!$````$@`` -M``$`"0#M!P``6`````L````!``D`_`<``&0````/`````0`)``L(``!T```` -M$0````$`"0`:"```B````!`````!``D`*0@``)@````$`````0`)`)T!``"8 -M````````````"0`U"```G`````T````!``D`00@``*P````.`````0`)`%`( -M``"\````!0````$`"0!;"```Q`````D````!``D`9@@``-`````$`````0`) -M`'((``#4````$P````$`"0"!"```Z````!(````!``D`D`@``/P````6```` -M`0`)`)\(```4`0``!`````$`"0"K"```&`$```8````!``D`MP@``"`!```/ -M`````0`)`,8(```P`0``$P````$`"0#5"```1`$``!<````!``D`Y`@``%P! -M```7`````0`)`/,(``!T`0``$0````$`"0`""0``F`$``!`````!``D`$0D` -M`*@!```$`````0`)`!T)``"L`0``$`````$`"0`L"0``O`$```\````!``D` -M.PD``,P!``#X`0```0`)`)T!`````````````````P!,"0``;````.`````! -M``,`60D``$P!``!P`````0`#``````````````````,`"@"=`0`````````` -M``````4`;0D````````0`````0`%`'X)```0`````0````$`!0"3"0``$0`` -M``$````!``4`I@D``!@```!(`````0`%``````````````````,`#``````` -M```````````#``L``````````````````P`-`+L)`````````````!````#2 -M"0``Z````$0````2``$`[PD`````````````$````/8)`````````````!`` -M``#]"0``B`0``#P!```2``$`"0H`````````````$````!$*```````````` -M`!`````="@`````````````0````+@H`````````````$````#@*```````` -M`````!`````_"@`````````````0````1@H`````````````$````%D*```` -M`````````!````!@"@`````````````0````;PH`````````````$````(@* -M`````````````!````"9"@`````````````0````K@H`````````````$``` -M`+\*`````````````!````#-"@`````````````0````X0H````````````` -M$````/@*`````````````!````#_"@`````````````0````!PL````````` -M````$````!D+`````````````!`````E"P`````````````0````-0L````` -M````````$````$P+`````````````!````!>"P`````````````0````;`L` -M````````````$````((+`````````````!````")"P`````````````0```` -ME`L``.07``"8````$@`!`*`+``!\&```&`$``!(``0"M"P`````````````0 -M````N@L`````````````$````,0+`````````````!````#/"P`````````` -M```0````VPL`````````````$````.@+`````````````!````#X"P`````` -M```````0````"0P`````````````$````"$,`````````````!`````Q#``` -M```````````0````1`P`````````````$````%(,`````````````!````!A -M#``````````````0````<0P`````````````$````(`,`````````````!`` -M``",#``````````````0````EPP`````````````$````*,,```````````` -M`!````"Z#``````````````0````Q@P`````````````$````-@,```````` -M`````!````#M#``````````````0````_@P`````````````$````!8-```` -M`````````!`````O#0`````````````0````/`T`````````````$````$T- -M`````````````!````!?#0`````````````0````:@T`````````````$``` -M`'X-`````````````!````";#0`````````````0````I`T````````````` -M$````+T-`````````````!````#)#0`````````````0````T`T````````` -M````$````.(-`````````````!````#]#0`````````````0````#`X````` -M````````$````!8.`````````````!`````R#@``[%$``%@````2``$`40X` -M````````````$````&4.``!$4@``6````!(``0"!#@``G%(``$`````2``$` -MH0X`````````````$````+0.`````````````!````#$#@`````````````0 -M````T@X`````````````$````.8.`````````````!````#T#@`````````` -M```0````"P\`````````````$````!"YC`&AE>#)N=6U?:0`D80!R='=?=WA? -M%]G971?%]G971?0!R='=?=WA?0!R='=?=WA?%]G971? -M97-S:60`7!T:6]N`"Y,0S$V,@!R='=?=WA? -M'0`+DQ#,38W`"Y,0S$V.``N3$,Q-CD`%]S971?9V5N7VEE`')T=U]W>%]G -M971?%]G971?%]G971?9G)E<0!T%]S971?;6QM90!S971?9W)O=7!?:V5Y`"Y,0S(V`'-E=%]W97!? -M:V5Y`')T=U]S971?=W!S7V)E86-O;@`N3$,Q.3``%]S971? -M%]S971?=V%P`')T=U]W>%]S971?;6]D90!?7V9U;F-?7RXS-S8Y,@!? -M7V9U;F-?7RXS.3,U,P!?7V9U;F-?7RXS-S5]D;VUA:6X`=6E?<&ED`'!R:6YT -M:P!R9E]R96=?9'5M<`!S<')I;G1F`%]R='=?;65M5]F5\R8VAA0!R='=?0!R -M='=?7!E`')T=U]S971?&ET`&US;&5E<`!W86ME7W5N;&]C:P!W86ME7VQO8VM?9&5S=')O>0!R -M=&PX,3@X7W!O=V5R7W-A=F5?:6YI=`!W86ME7VQO8VM?:6YI=`!W86ME7VQO -M8VL`5]C;60``,` -M`"PV``!\`P``*S4``(`#```L-0``B`,``!QX`0"P`P``''@!`.P#```<>`$` -M5`0``"LY``!8!```+#D``%P$```<>`$`:`0``"LZ``!L!```+#H``'`$```< -M>`$`@`0```)L`0"$!````FP!`*@$```K/0``K`0``"P]``"P!```''@!`-P$ -M```K/@``X`0``"P^``#D!```*S\``.@$```L/P``[`0``"M```#P!```+$`` -M`/P$```<>`$`8`4``!QX`0!L!0``''@!`(0%```<>`$`P`4```)L`0#T!0`` -M*T0``/@%```L1`````8``!QZ`0!,!@``''L!`%P&```<>P$`E`8``!Q\`0"X -M!@``''T!`.0&```<>`$`%`<``!Q^`0!$!P``''\!`%@'```<>`$`;`<``!R` -M`0!\!P``''@!`(P'```<>P$`E`<``!QX`0"D!P``''H!`,`'```<>`$`U`<` -M`!QX`0#H!P``''H!```(```<>`$`%`@``!QZ`0`H"```''@!`#@(```<>@$` -M5`@``!QX`0!H"```''H!`(`(```<>`$`D`@``!QZ`0"D"```''@!`*P(```< -M@0$`Q`@``!Q_`0#@"```'((!`/0(```<>`$`!`D``!R"`0`@"0``''@!`$0) -M```<@P$`8`D``!QX`0!\"0``'(`!`(P)```<>`$`F`D``!QX`0"H"0``''L! -M`-`)```<>`$`Y`D``!QZ`0#L"0``''@!`/P)```<>@$`%`H``!R!`0`H"@`` -M''@!`#P*````$`D`H``!Q[`0"L -M"@``*T<``+`*```L1P``N`H``!QX`0#`"@``*T@``,0*```L2```T`H``!QZ -M`0#D"@``''@!`/0*```<>@$`#`L``!QX`0`<"P``''H!`#`+```<@0$`2`L` -M`!Q_`0!T"P``'(,!`(P+```<>`$`J`L``!R``0"X"P``''@!`,0+```<>`$` -MU`L``!Q[`0#X"P``''@!``P,```<>@$`%`P``!QX`0`D#```''H!`#@,```< -M@0$`4`P``!Q_`0!\#```'(,!`)0,```<>`$`L`P``!R``0#`#```''@!`,P, -M```<>`$`W`P``!Q[`0``#0``''@!`!0-```<>@$`'`T``!QX`0`L#0``''H! -M`$`-```<@0$`6`T``!Q_`0!P#0``'(4!`'@-````$`:!```!R!`0!\$```''@!`(@0```<>`$`H!```!R' -M`0#8$```'(,!`/00```<>`$`$!$``!R(`0`@$0``''@!`#`1```<>`$`0!$` -M`"M2``!$$0``+%(``$@1````$`$!(``"M3```4$@``+%,``!@2````$`9!,``!R'`0"< -M$P``'(,!`+@3```<>`$`U!,``!R(`0#D$P``''@!`/03```<>`$`%!0```)) -M`0`8%````FP!`!P4```";`$`(!0```)L`0`D%````FP!`"@4```";`$`+!0` -M``)L`0`P%````FP!`#04```";`$`.!0```)L`0`\%````FP!`%`4```K6@`` -M5!0``"Q:``!<%```''@!`&`4```K6P``9!0``"Q;``!X%```*XH!`'P4```L -MB@$`C!0``!R+`0#4%```''P!`.P4````$`-!4``!R-`0!4%0``'(X!`'@5```!<` -M`"MC``!\%P``+&,``(`7```K9```A!<``"QD``"4%P``''@!`*07```"20$` -MJ!<```)L`0"L%P```DD!`,`7```@$`[!<``"MJ``#P%P``+&H``/07```<>`$``!@``"MK```$&```+&L```@8 -M```K0```#!@``"Q````0&```*S\``!08```L/P``/!@``!QX`0!(&```')0! -M`%08```<>`$`9!@``!QX`0"$&```*VT``(@8```L;0``C!@``!QX`0"8&``` -M*VL``)P8```L:P``H!@``"M```"D&```+$```*@8```K/P``K!@``"P_``#4 -M&```''@!`.`8````$`8!D` -M`!R4`0!L&0``''@!`'P9```<>`$`H!D``!R7`0#@&0```@(``.09```"`@`` -MZ!D```("``#L&0```@(``/`9```"`@``]!D```("``#X&0```@(``/P9```" -M`@```!H```("```$&@```@(```@:```"`@``#!H```("```0&@```@(``!0: -M```"`@``&!H```("```<&@```@(``$`:````$`9!H``!R9`0!L&@``*W4``'`:```L=0``>!H``!QX`0"(&@`` -M')0!`)`:```K=@``E!H``"QV``"<&@``''@!`,@:````$`,!L``!R7`0`\&P``')0!`$0;```K>0``2!L` -M`"QY``!0&P``''@!`'0;```K>@``>!L``"QZ``"`&P``''@!`+P;```K>P`` -MP!L``"Q[``#(&P``''@!`/`;```K?```]!L``"Q\````'```''@!`$@<```K -M?0``3!P``"Q]``!8'```''@!`&0=```K?@``:!T``"Q^``!P'0``''@!`)P= -M```K?P``H!T``"Q_``"D'0``''@!`*P=```K@```L!T``"R```"X'0``''@! -M`,`=```K@0``Q!T``"R!``#,'0``''@!`-`=```K@@``U!T``"R"``#<'0`` -M''@!`.0=```K@P``Z!T``"R#``#P'0``''@!`/0=```KA```^!T``"R$```` -M'@``''@!``0>```KA0``"!X``"R%```0'@``''@!`"0>``````<>`$`8!X``"N'``!D'@``+(<``'`>```<>`$`=!X` -M`"N(``!X'@``+(@``(@>```<>`$`G!X``"N)``"@'@``+(D``*0>```<>`$` -MJ!X``"N*``"L'@``+(H``+P>```<>`$`P!X``"N+``#$'@``+(L``,P>```< -M>`$`T!X``"N,``#4'@``+(P``.`>```<>`$`[!X``"N-``#P'@``+(T```P? -M```<>`$`3!\``!QX`0!P'P``*XX``'0?```LC@``@!\``!QX`0",'P``*X\` -M`)`?```LCP``E!\``!QX`0"T'P``*Y```+@?```LD```S!\``!QX`0#4'P`` -M*Y$``-@?```LD0``[!\``!QX`0#P'P``*Y(``/0?```LD@```"```!QX`0`( -M(```*Y,```P@```LDP``("```!QX`0`D(```')T!`$P@```KA@``4"```"R& -M``!8(```*XD``%P@```LB0``9"```"N-``!H(```+(T``(0@```KAP``B"`` -M`"R'``",(```*X@``)`@```LB```W"```!QX`0#L(```''@!```A```<>`$` -M&"$``!QX`0`L(0``''@!`#@A```<>`$`2"$``!QX`0!4(0``''@!`'@A```< -M>`$`E"$``!R>`0#((0``')\!`-`A```KE```U"$``"R4``#<(0``''@!``@B -M```<>`$`*"(``"N5```L(@``+)4``#@B```<>`$`0"(``"N6``!$(@``+)8` -M`$@B```KEP``3"(``"R7``!0(@``''@!`%PB```KF```8"(``"R8``!H(@`` -M*YD``&PB```LF0``<"(``!QX`0"0(@``')8!`*0B````$`^"(``!QX`0``(P``''@!``@C```<>`$`$",``!QX -M`0`8(P``''@!`"`C```<>`$`6",``"N:``!<(P``+)H``&0C```<>`$`?",` -M`!R:`0"((P``')@!`)`C```KFP``E",``"R;``"8(P``''@!`*@C`````#\(P``+)X````D -M```<>`$`$"0``!R4`0`8)```*Y\``!PD```LGP``("0``!QX`0`L)```')0! -M`#0D```KH```."0``"R@```\)```''@!`$@D````$`9"0``!R4`0!L)```*Z(``'`D```LH@``="0``!QX`0"` -M)```')0!`(@D```KHP``C"0``"RC``"0)```''@!`)PD````$`L"0``"L_``"T)```+#\``+@D```<>`$`Q"0` -M`!R4`0#,)```*Z4``-`D```LI0``U"0``!QX`0#@)```')0!`.@D```KI@`` -M["0``"RF``#P)```''@!`/PD````$`&"4``!R4`0`@)0``*Z@``"0E```LJ```*"4``!QX`0`T)0``')0!`#PE -M```KJ0``0"4``"RI``!$)0``''@!`%`E````$`;"4``!R4`0!T)0``*ZL``'@E```LJP``?"4``!QX`0"()0`` -M')0!`)`E```KK```E"4``"RL``"8)0``''@!`*0E````$`P"4``!R4`0#()0``*ZX``,PE```LK@``T"4``!QX -M`0#8)0``*Z\``-PE```LKP``X"4``!QX`0#P)0```FP!`/0E```";`$`^"4` -M``)L`0#\)0```FP!```F```";`$`!"8```)L`0`()@```FP!``PF```";`$` -M$"8```)L`0`4)@```FP!`!@F```";`$`'"8```)L`0`@)@```FP!`"0F```" -M;`$`*"8```)L`0!`)@``'*`!`&0F```KM0``:"8``"RU``!L)@``''@!`*0F -M````$`#"@``!R?`0!0*``` -M''@!`&@H````$`Q"H``!R8 -M`0#8*@``')D!`.PJ````$`;"P``!RD`0"D+```'*8!`*PL```";`$` -ML"P```))`0"T+````FP!`+@L```";`$`O"P```)L`0#`+````FP!`/0L```< -MIP$`""T``!QX`0`8+0``'(T!`$PM````$`^"T``!R-`0`@+@``''L!`&0N```<>P$`H"X``!QX`0#`+@``'*`$`,#(``!QX`0!(,@``''@!`(0R```KS``` -MB#(``"S,``",,@``''@!`,0R```KS0``R#(``"S-``#,,@``''@!`%@S```< -M>`$`S#,``!RG`0#8,P``'*@!``@T```";`$`##0```)L`0`0-````FP!`!0T -M```";`$`>#0``"O1``!\-```+-$``(`T````$`9#4``!RH`0!X-0`` -M''@!`)PU```P$`4#@```("``!4.````@(``%@X```" -M`@``7#@```("``!@.```*]$``&0X```LT0``;#@``"O7``!P.```+-<``'@X -M```KV```?#@``"S8``"$.```*]D``(@X```LV0``F#@``!R+`0#@.```'*#T``!QX`0"D/0``'*`$``#X``"LU -M```$/@``+#4``"0^````0`440``''8!`&!1```P$`(%(``!Q[`0`X4@``'+\!`&!2```< -M>P$`>%(``!RG`0"04@``'+\!`+A2```<>P$`T%(``!R_`0#P4@``*Q`!`/12 -M```L$`$`_%(``!QX`0`$4P``'*\!`"!3````$`7%0``!RF`0!X5```'*4!`)A4```<>`$`K%0``!RG -M`0#`5```',0!`.!4```";`$`Y%0```))`0`H50``'*4!`'!5````$`R%4```("``#,50```@(``-!5```"`@`` -MU%4```("``#850```@(``-Q5```"`@``X%4```("``#D50```@(``.A5```" -M`@``[%4```("``#P50```@(``/15```"`@``^%4```("``#\50```@(```!6 -M```"`@``!%8```("```(5@```@(```Q6```"`@``$%8```("```@5@``''@! -M`"A6```%<``!QX`0"P5P``')P!`,17```P$`/%D``!RG`0!D60``'+(!`)19```<>P$`K%D` -M`!RR`0#(60``'*```<>`$`J%X``!Q_`0"\7@``''@!`-!>````$`4&```!RG`0"P8```''@!`-1@````$`4&(``!RK`0#(8@``'*`$`/&,``!RG`0!,8P``'*`$`\&8``!R<`0`P9P``'*`$`@&<``!QX`0"H9P``'*8!`,1G````$`0&@``!RF`0!<:```'*4!`'QH```<>`$`D&@``!RG`0"@ -M:```''@!`.AH````$` -MS&L``!RD`0#D:P``'*8!``QL```K6P``$&P``"Q;```@;```'-(!`#1L```< -MTP$`/&P``!S4`0!$;````@0``$QL```K6P``4&P``"Q;``!@;```*R4!`&1L -M```L)0$`:&P``!S6`0!P;```'-`$`T&T``!QX`0`0;@`` -M''L!`"AN````0!H;@``'(T!`*AN````0"`<0``')\!`(QQ````$`Q'8``"L^`0#(=@``+#X!`-!V```<>`$`V'8``"LT`0#<=@``+#0! -M`.1V``````''@!`$QX```<>`$`?'@``!R>`0"0>```'.0!`+AX``````'-P!`.QX```0```DD!`!1Y```" -M;`$`*'D``!S8`0!8>0```@(``%QY```"`@``8'D```("``!D>0```@(``)1Y -M`````!X -M`````AX``'P````""0``@`````+[``"$`````D4!`(@````""P``C`````(> -M``"0`````@T``)@````"^```G`````(N`0"L`````AX``+`````"'@``O``` -M``)"`0#``````L<``,0````""0$`R`````(>``#,`````BH!`-`````"!P$` -MU`````(G`0#8`````L4``-P````"'@``X`````+"``#L`````NH``/`````" -MZ```]`````(>``#X`````A```/P````"$@````$```(4```$`0```AX```@! -M```"'@``#`$```(>```0`0```A8``!0!```"R0``&`$```*^```<`0```AX` -M`"`!```"&```+`$```+F```T`0```MH``#P!```"TP``1`$```*[``!,`0`` -M`FX``%`!```"9@``5`$```(F``!8`0```K@``%P!```"LP``8`$```(R``!D -M`0```DH``&@!```"(@``;`$```(@``!P`0```B0``'0!```"L0``>`$```)P -M``!\`0```AH``(`!```"0@``A`$```(<``"(`0```AP``(P!```"*```D`$` -M``(J``"4`0```BP``)P!```"+@``H`$```(<``"D`0```ET``*@!```"'``` -MK`$```)8``"P`0```AP``+0!```"30``N`$```)%````````*@(````````` -M=0$`"````"H"```0````*@(``!@````J`@``(````"H"```H````*@(``#`` -M```J`@``.````"H"``!`````*@(``$@````J`@``4````"H"``!8````*@(` -M`&`````J`@``:````"H"``!P````*@(``'@````J`@``@````"H"``"(```` -M*@(``)`````J`@``F````"H"``"@````*@(``*@````J`@``L````"H"``"X -M````*@(``,`````J`@``R````"H"``#0````*@(``-@````J`@``X````"H" -M``#@`````(D!`.0````J!P``Z````"H"``#P````*@(``/@````J`@````$` -M`"H"```(`0``*@(``!`!```J`@``&`$``"H"```@`0``*@(``"@!```J`@`` -M,`$``"H"```X`0``*@(``$`!```J`@``2`$``"H"``!0`0``*@(``%@!```J -M`@``8`$``"H"``!H`0``*@(``'`!```J`@``>`$``"H"``"``0``*@(``(@! -M```J`@``D`$``"H"``"8`0``*@(``*`!```J`@``J`$``"H"``"P`0``*@(` -M`+@!```J`@``P`$``"H"``#(`0``*@(``-`!```J`@``V`$``"H"``#@`0`` -M*@(``.@!```J`@``\`$``"H"``#X`0``*@(````"```J`@``"`(``"H"```0 -M`@``*@(``!@"```J`@``(`(``"H"```H`@``*@(``#`"```J`@``.`(``"H" -2``!``@``*@(``$@"```J`@`` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````HL@&!L+!?A```````````L+"P +M@$````"PL+"`2````+"PL("8````L+"@@.@```"PL+"`+`$``+"PL(!(`0`` +ML+"@@)P!``"PL+"`N`$``+"PL(#4`0``L+"P@.P!``"PJ`&`)`(``+"PL(`L +M`@``L+"P@#0"``"PL+"`/`(``+"PL(!$`@``L+"P@$P"``"PL+"`5`(``+"P +ML(!<`@``L+"P@&0"``"PL+"`;`(``+"PL(!T`@``L+"@@/0"``"PL*J`F`,` +M`+"PJ("(!```L*\&@,0%``"PL*J`#`8``*\JLH!0#@``L*P!@)0/```````` +M0!0``+"K!(`L%@``L*H!@+`7``"PL*J`Y!<``+"PKH!\&```L+"N@)09``"P +ML*B`K!D``+"O"H`L)@``L+"H@%0F``"PKQ:`;"D``+"O`H!,+```L*X#@*@N +M``"PL*J`&#```+"PJ(!,,```L+"J@)PP``"PL*J`"#$``+"L!X"@,P``L+"N +M@'0W``"PL*Z`O#@``+"PJH#H.0``L*\$@+P]``"PL*B`U#T``%^$`H!\/P`` +ML*H'@-!```"PJP*`5$(``*\(L8"40P``L+"J@`A$``"O1+*`Y$\``+"O!H`0 +M40``L+"J@'11``"PJ02`S%$``+"I!(`D4@``L*D$@&12``"PL*Z`7%,``+"P +MJ(",4P``L*H!@'!4``"PKQ*`Z&@``+"PKH"0:P``L+"H@-!K``"PL*J`"&P` +M`+"PJ(#(;```7X0*@)QN``"PKPJ`6'$``*\_&(#$=P``L+"N@.1X``"PL*J` +M%]S971?875T:```4/($"PH)"`<&!00#`@$`_P```'-E=%]G+ +M```!2```9V5T7W-E;G-I=&EV:71Y`.B+```!2```=W!S7W!R;V)?J+```!2```8VAA;FYE;%]P;&%N +M`````.N+```"2```9&)G`````````````````.R+```#2```%T*``!W<&%?"`` +M(#!X)3`X>"``````"@```#!X)3`U>```)7,Z(&EN/25S"@``+````')E86QM +M87``"D*`"5S(`H`````"2`@"4P,G@``"5S(#!X)3`R6````"`````E``*"0``)7,*"0````!M86,`=FED<&ED``!A8FQEF5=(#T@)60`6R5S72!W<'-?```"CT] +M/3T]/3T@0D(@4D5'(#T]/3T]/3T*``````H]/3T]/3T]($U!0R!214<@/3T] +M/3T]/0H```!R='=?"D],'@E>`H```!R='=?"5X*3TP>"5X"@!R96%D7V)B"5X*3TP>"5X"@!R96%D(%)&7W)E9R!P871H*#!X)3`R>"DL +M;V9F"D*`````'=R:71E(%)&7W)E9R!P +M871H*#!X)3`R>"DL;V9F"D*````9G=S +M=&%T93TP>"5X"@```&%U=&A?86QG/3!X)7@L(&5N8U]A;&<],'@E>"P@875T +M:%]T>7!E/3!X)7@L(&5N8U]T>7!E/3!X)7@*`'!M;&UE:6YF;RT^`H``'%O#HE,#)X.B4P,G@Z)3`R>#HE,#)X.B4P,G@*`````')T`H``'1I9#TE9"P@:6YD:6-A=&5?"5X+"!A`H````H02E$349L86<],'@E>`H`8E-U&UI=&)U9E]C;G0] +M)60L(&9R965?>&UI=&9R86UE7V-N=#TE9`H`"5X+"!T:6U?8FET;6%P/3!X)7@*```` +M`'-L965P<5]L96X])60*``!D=6UP(')X('!A8VME="`H)60I"@`````C(R,C +M(R,@2!F=6YC=&EO;@H````@/3T]($1-1FQA9R@P>"4P,G@I(#T]/2`*```` +M97AT6YA;6EC(&9U;F,@"@!E +M>'1R85]A'1R85]A&ES=&5N +M8V4@+2!"250H,RD*````97AT'1R85]A"5X"@!W&,U."D],'@E>`H`"5X"@!D +M8F#8P."D],'@E>`H`````9&)G*#!X +M,C@P*3TP>"5X"@````!D8F#(X."D] +M,'@E>`H`````9&)G*#!X-C8T*3TP>"5X"@````!D8F#0S."D],'@E>`H`````9&)G*#!X-#0P*3TP>"5X"@````!D +M8F#0X-"D],'@E>`H`````9&)G*#!X +M-#@X*3TP>"5X"@````!D8F#0T."D] +M,'@E>`H`````9&)G*#!X-#1C*3TP>"5X"@````!D8F#HE +M,#)X.B4P,G@Z)3`R>`H`````.#%]D2!F;W(@;F]R +M;6%L(&UO9&4L(&-A;B=T(&5N=&5R(&UP(&UO9&4*````/3T^('1R:6=G97(@ +M9W!I;R`P"@!;%]S971?<&UK:61=($E77U!-2U-!7U)%34]612$*```` +M`%MR='=?=WA?2!I;F1E>"`] +M("5D(&9O`H`````16YC#TE9`H``'=E<"P@#TP"@``;F]N90````!42TE0`````$-#35``````)7,N+BYC86QL +M(')T=U]I;F1I8V%T95]D:7-C;VYN96-T"B``4T54(%=04U])10H`4T54(%=0 +M4U])12P@=W!S7W!H87-E/3U?5%)510H```!)145%(#@P,BXQ,6)N````245% +M12`X,#(N,3%B`````$E%144@.#`R+C$Q8F=N``!)145%(#@P,BXQ,6)G```` +M245%12`X,#(N,3%A;@```$E%144@.#`R+C$Q80````!)145%(#@P,BXQ,6=N +M````245%12`X,#(N,3%G`````'5N87-S;V-I871E9``````@4F%T97,@*$UB +M+W,I.B```````"XU```E9"5S(````'=X7V=E=%]S8V%N+"!M8W-?`H``'=P85]I93T`)3`R>`````!R#HE,#)X.B4P +M,G@Z)3`R>`H``')T=U]D96Q?#HE,#)X.B4P,G@Z)3`R +M>#HE,#)X"@``7!T:6]N+"!C%]S971?96YC5]I9'@])60L +M(&QE;CTE9`H````@2P@5T50"@`E2P@5$M)4`H`````)7,L('-E="!G2P@5T50"@``)7,L('-E="!P86ER=VES92!K97DL(%1+25`*`"5S +M+"!S970@<&%I2P@;F]N90H`#HE,#)X.B4P,G@Z)3`R>`H`#HE,#)X.B4P,G@Z)3`R>#HE,#)X.B4P,G@` +M)2IS("5S``!54P``154``$I0```E6UT86(`+G-T0`````````````$`````````!L````)``````````````#(S```&"L```\` +M```!````!`````@````I`````0````,`````````P'D``+P!```````````` +M``0`````````)0````D``````````````.#W``"(`@``#P````,````$```` +M"````"\````(`````P````````"`>P``8```````````````"``````````T +M`````0````(`````````@'L```P```````````````0`````````0P````$` +M`'""`````````(Q[``!0`@```0`````````$`````````#\````)```````` +M``````!H^@``:`(```\````'````!`````@```!.`````0````(````````` +MW'T``,0#``````````````0`````````5@````$````R`````````*"!``"` +M%P`````````````$`````0```&4````!```````````````@F0``$@`````` +M`````````0````````!N`````0``````````````,ID````````````````` +M``$`````````?@````,``'```````````#*9```K```````````````!```` +M`````!$````#``````````````!=F0``C@```````````````0`````````! +M`````@``````````````E)P``+`>```0````=0$```0````0````"0````,` +M`````````````$2[``"!$0`````````````!```````````````````````` +M```````!```````````````$`/'_`````````````````P`!```````````` +M``````,``P`````````````````#``4`#P````````!``````@`!`!D````` +M`````````````0`````````````````#``8``````````````````P`'`!P` +M``!`````"`````(``0`9````0`````````````$`+````$@```!0`````@`! +M`!D```!(`````````````0`\````F````%`````"``$`&0```)@````````` +M```!`!D```#H`````````````0!,````+`$``!P````"``$`&0```"P!```` +M```````!`%L```!(`0``5`````(``0`9````2`$```````````$`:P```)P! +M```<`````@`!`!D```"<`0```````````0![````N`$``!P````"``$`&0`` +M`+@!```````````!`(P```#4`0``&`````(``0`9````U`$```````````$` +MG0```.P!```X`````@`!`!D```#L`0```````````0"M````)`(```@````" +M``$`&0```"0"```````````!`+X````L`@``"`````(``0`9````+`(````` +M``````$`Q````#0"```(`````@`!`!D````T`@```````````0#@````/`(` +M``@````"``$`&0```#P"```````````!`/<```!$`@``"`````(``0`9```` +M1`(```````````$`#0$``$P"```(`````@`!`!D```!,`@```````````0`< +M`0``5`(```@````"``$`&0```%0"```````````!`"@!``!<`@``"`````(` +M`0`9````7`(```````````$`-`$``&0"```(`````@`!`!D```!D`@`````` +M`````0!!`0``;`(```@````"``$`&0```&P"```````````!`$H!``!T`@`` +M@`````(``0`9````=`(```````````$`80$``/0"``"D`````@`!`!D```#T +M`@```````````0!M`0````````````````H`<@$````````````````)`'P! +M```4````````````"@"!`0``F`,``/`````"``$`&0```)@#```````````! +M`),!``"T````````````"@"8`0``V`````````````H`G0$``(`$```````` +M```!`!D```"(!````````````0"@`0``]`````````````H`I0$``"`!```` +M```````*`*H!```T`0``````````"@"P`0``*`$```````````H`G0$``,`% +M```````````!`+4!``#$!0``2`````(``0`9````Q`4```````````$`Q`$` +M`#@!```````````*`,H!```,!@``1`@```(``0`9````#`8```````````$` +MVP$``+@"```````````*`.$!``#``@``````````"@"=`0``P`T````````` +M``$`YP$``%`.``!$`0```@`!`!D```!0#@```````````0"=`0``C`\````` +M``````$`]0$``)0/``"L!````@`!`!D```"4#P```````````0`&`@``0`$` +M``````````H`#`(``$P!```````````*`!("```@`P``````````"@`8`@`` +MB`,```````````H`'@(``-0"```````````*`"0"```H`P``````````"@`J +M`@``;`,```````````H`,`(``-@"```````````*`)T!```4%``````````` +M`0`V`@``0!0``.P!```"``$`&0```$`4```````````!`$@"``#``P`````` +M````"@!.`@````````````````4`G0$``!06```````````!`%@"```L%@`` +MA`$```(``0`9````+!8```````````$`8P(``"P$```````````*`&D"``!` +M!```````````"@!O`@``2`0```````````H`=0(``%`$```````````*`'L" +M``!@!```````````"@"!`@``5`0```````````H`G0$``*07```````````! +M`(<"``"P%P``-`````(``0`9````L!<```````````$`E0(``'0$```````` +M```*`!D```#D%P```````````0";`@``?`0```````````H`H0(``&@"```` +M```````*`!D```!\&````````````0"G`@``F`0```````````H`K0(``)09 +M```8`````@`!`!D```"4&0```````````0"\`@``K!D``(`,```"``$`&0`` +M`*P9```````````!`)T!``#@&0```````````0`9````(!H```````````$` +MR0(``+0$```````````*`,\"``#,!```````````"@#5`@``Y`0````````` +M``H`VP(``/P$```````````*`.$"```4!0``````````"@#G`@``+`4````` +M``````H`[0(``$0%```````````*`/,"``!````````````0"2!P``Y'@``*@````"``$`&0```.1X```````````! +M`)T!```D>0```````````0`9````-'D```````````$````````````````` +M`P`)`*('````````#`````$`"0"Q!P``#````!$````!``D`P`<``"`````. +M`````0`)`,\'```P````$0````$`"0#>!P``1````!(````!``D`[0<``%@` +M```+`````0`)`/P'``!D````#P````$`"0`+"```=````!$````!``D`&@@` +M`(@````0`````0`)`"D(``"8````!`````$`"0"=`0``F`````````````D` +M-0@``)P````-`````0`)`$$(``"L````#@````$`"0!0"```O`````4````! +M``D`6P@``,0````)`````0`)`&8(``#0````!`````$`"0!R"```U````!,` +M```!``D`@0@``.@````2`````0`)`)`(``#\````%@````$`"0"?"```%`$` +M``0````!``D`JP@``!@!```&`````0`)`+<(```@`0``#P````$`"0#&"``` +M,`$``!,````!``D`U0@``$0!```7`````0`)`.0(``!<`0``%P````$`"0#S +M"```=`$``!$````!``D``@D``)@!```0`````0`)`!$)``"H`0``!`````$` +M"0`="0``K`$``!`````!``D`+`D``+P!```/`````0`)`#L)``#,`0``^`$` +M``$`"0"=`0````````````````,`3`D``&P```#@`````0`#`%D)``!,`0`` +M<`````$``P`````````````````#``H`G0$````````````````%`&T)```` +M````$`````$`!0!^"0``$`````$````!``4`DPD``!$````!`````0`%`*8) +M```8````2`````$`!0`````````````````#``P``````````````````P`+ +M``````````````````,`#0"["0`````````````0````T@D``.@```!$```` +M$@`!`.\)`````````````!````#V"0`````````````0````_0D``(@$```\ +M`0``$@`!``D*`````````````!`````1"@`````````````0````'0H````` +M````````$````"X*`````````````!`````X"@`````````````0````/PH` +M````````````$````$8*`````````````!````!9"@`````````````0```` +M8`H`````````````$````&\*`````````````!````"("@`````````````0 +M````F0H`````````````$````*X*`````````````!````"_"@`````````` +M```0````S0H`````````````$````.$*`````````````!````#X"@`````` +M```````0````_PH`````````````$`````<+`````````````!`````9"P`` +M```````````0````)0L`````````````$````#4+`````````````!````!, +M"P`````````````0````7@L`````````````$````&P+`````````````!`` +M``"""P`````````````0````B0L`````````````$````)0+``#D%P``F``` +M`!(``0"@"P``?!@``!@!```2``$`K0L`````````````$````+H+```````` +M`````!````#$"P`````````````0````SPL`````````````$````-L+```` +M`````````!````#H"P`````````````0````^`L`````````````$`````D, +M`````````````!`````A#``````````````0````,0P`````````````$``` +M`$0,`````````````!````!2#``````````````0````80P````````````` +M$````'$,`````````````!````"`#``````````````0````C`P````````` +M````$````)<,`````````````!````"C#``````````````0````N@P````` +M````````$````,8,`````````````!````#8#``````````````0````[0P` +M````````````$````/X,`````````````!`````6#0`````````````0```` +M+PT`````````````$````#P-`````````````!````!-#0`````````````0 +M````7PT`````````````$````&H-`````````````!````!^#0`````````` +M```0````FPT`````````````$````*0-`````````````!````"]#0`````` +M```````0````R0T`````````````$````-`-`````````````!````#B#0`` +M```````````0````_0T`````````````$`````P.`````````````!`````6 +M#@`````````````0````,@X``'11``!8````$@`!`%$.`````````````!`` +M``!E#@``S%$``%@````2``$`@0X``"12``!`````$@`!`*$.```````````` +M`!````"T#@`````````````0````Q`X`````````````$````-(.```````` +M`````!````#F#@`````````````0````]`X`````````````$`````L/```` +M`````````!`````7#P`````````````0````-P\`````````````$````$X/ +M`````````````!````!E#P`````````````0````=`\`````````````$``` +M`(8/`````````````!````"8#P`````````````0````K0\``.AH``"H`@`` +M$@`!`+%]S971?9G)E<0!R='=?=WA?9V5T7VUO9&4`%]G971?%]S971?9G)A9P!R='=?=WA?9V5T7V9R +M86<`0!R='=?=WA?9V5T7W!O=V5R`')T=U]W>%]W +M%]S971?;71K +M7W=P%]S +M971?;71K7W=P%]W%]G971?96YC`')T=U]W>%]G971?;FEC:P`N3$,Q-3(`%]S971?96YC7V5X=``N3$,Q-C4`+DQ#,38V`"Y,0S$V-P!R='=?=WA? +M%]S971?%]S971?97-S:60`%-I>F4`:V5Y7S)C:&%R,FYU;0!R='=?969U0!R='=? +M=F%L:61A=&5?%]D:7-A%]A%]S8V%N7V-O;7!L971E7V5V96YT`%]R='=?:6YI=%]L:7-T:&5A9`!R +M='=?96YQ=65U95]C;60`=7!D871E7V)E86-O;@!F;'5S:%]A;&Q?8V%M7V5N +M=')Y`')T=U]S=&%?9FQU`,``"PV``!\`P``*S4``(`#```L-0``B`,` +M`!QX`0"P`P``''@!`.P#```<>`$`5`0``"LY``!8!```+#D``%P$```<>`$` +M:`0``"LZ``!L!```+#H``'`$```<>`$`@`0```)L`0"$!````FP!`*@$```K +M/0``K`0``"P]``"P!```''@!`-P$```K/@``X`0``"P^``#D!```*S\``.@$ +M```L/P``[`0``"M```#P!```+$```/P$```<>`$`8`4``!QX`0!L!0``''@! +M`(0%```<>`$`P`4```)L`0#T!0``*T0``/@%```L1`````8``!QZ`0!,!@`` +M''L!`%P&```<>P$`E`8``!Q\`0"X!@``''T!`.0&```<>`$`%`<``!Q^`0!$ +M!P``''\!`%@'```<>`$`;`<``!R``0!\!P``''@!`(P'```<>P$`E`<``!QX +M`0"D!P``''H!`,`'```<>`$`U`<``!QX`0#H!P``''H!```(```<>`$`%`@` +M`!QZ`0`H"```''@!`#@(```<>@$`5`@``!QX`0!H"```''H!`(`(```<>`$` +MD`@``!QZ`0"D"```''@!`*P(```<@0$`Q`@``!Q_`0#@"```'((!`/0(```< +M>`$`!`D``!R"`0`@"0``''@!`$0)```<@P$`8`D``!QX`0!\"0``'(`!`(P) +M```<>`$`F`D``!QX`0"H"0``''L!`-`)```<>`$`Y`D``!QZ`0#L"0``''@! +M`/P)```<>@$`%`H``!R!`0`H"@``''@!`#P*````$`D`H``!Q[`0"L"@``*T<``+`*```L1P``N`H``!QX`0#` +M"@``*T@``,0*```L2```T`H``!QZ`0#D"@``''@!`/0*```<>@$`#`L``!QX +M`0`<"P``''H!`#`+```<@0$`2`L``!Q_`0!T"P``'(,!`(P+```<>`$`J`L` +M`!R``0"X"P``''@!`,0+```<>`$`U`L``!Q[`0#X"P``''@!``P,```<>@$` +M%`P``!QX`0`D#```''H!`#@,```<@0$`4`P``!Q_`0!\#```'(,!`)0,```< +M>`$`L`P``!R``0#`#```''@!`,P,```<>`$`W`P``!Q[`0``#0``''@!`!0- +M```<>@$`'`T``!QX`0`L#0``''H!`$`-```<@0$`6`T``!Q_`0!P#0``'(4! +M`'@-````$`:!```!R!`0!\ +M$```''@!`(@0```<>`$`H!```!R'`0#8$```'(,!`/00```<>`$`$!$``!R( +M`0`@$0``''@!`#`1```<>`$`0!$``"M2``!$$0``+%(``$@1````$`$!(``"M3```4$@``+%,``!@2```< +M?P$`*!(``!R!`0!$$@``''@!`%`2```K5```5!(``"Q4``!<$@``''@!`'02 +M````$`9!,``!R'`0"<$P``'(,!`+@3```<>`$`U!,``!R(`0#D +M$P``''@!`/03```<>`$`%!0```))`0`8%````FP!`!P4```";`$`(!0```)L +M`0`D%````FP!`"@4```";`$`+!0```)L`0`P%````FP!`#04```";`$`.!0` +M``)L`0`\%````FP!`%`4```K6@``5!0``"Q:``!<%```''@!`&`4```K6P`` +M9!0``"Q;``!X%```*XH!`'P4```LB@$`C!0``!R+`0#4%```''P!`.P4```< +M?0$`"!4``!QX`0`4%0``'(P!`"05```<>`$`-!4``!R-`0!4%0``'(X!`'@5 +M```!<``"MC``!\%P``+&,``(`7```K9```A!<` +M`"QD``"4%P``''@!`*07```"20$`J!<```)L`0"L%P```DD!`,`7```@$`[!<``"MJ``#P%P``+&H``/07```< +M>`$``!@``"MK```$&```+&L```@8```K0```#!@``"Q````0&```*S\``!08 +M```L/P``/!@``!QX`0!(&```')0!`%08```<>`$`9!@``!QX`0"$&```*VT` +M`(@8```L;0``C!@``!QX`0"8&```*VL``)P8```L:P``H!@``"M```"D&``` +M+$```*@8```K/P``K!@``"P_``#4&```''@!`.`8````$`8!D``!R4`0!L&0``''@!`'P9```<>`$`H!D` +M`!R7`0#@&0```@(``.09```"`@``Z!D```("``#L&0```@(``/`9```"`@`` +M]!D```("``#X&0```@(``/P9```"`@```!H```("```$&@```@(```@:```" +M`@``#!H```("```0&@```@(``!0:```"`@``&!H```("```<&@```@(``$`: +M````$`9!H``!R9`0!L&@``*W4` +M`'`:```L=0``>!H``!QX`0"(&@``')0!`)`:```K=@``E!H``"QV``"<&@`` +M''@!`,@:````$`,!L``!R7 +M`0`\&P``')0!`$0;```K>0``2!L``"QY``!0&P``''@!`'0;```K>@``>!L` +M`"QZ``"`&P``''@!`+P;```K>P``P!L``"Q[``#(&P``''@!`/`;```K?``` +M]!L``"Q\````'```''@!`$@<```K?0``3!P``"Q]``!8'```''@!`&0=```K +M?@``:!T``"Q^``!P'0``''@!`)P=```K?P``H!T``"Q_``"D'0``''@!`*P= +M```K@```L!T``"R```"X'0``''@!`,`=```K@0``Q!T``"R!``#,'0``''@! +M`-`=```K@@``U!T``"R"``#<'0``''@!`.0=```K@P``Z!T``"R#``#P'0`` +M''@!`/0=```KA```^!T``"R$````'@``''@!``0>```KA0``"!X``"R%```0 +M'@``''@!`"0>``````<>`$`8!X``"N' +M``!D'@``+(<``'`>```<>`$`=!X``"N(``!X'@``+(@``(@>```<>`$`G!X` +M`"N)``"@'@``+(D``*0>```<>`$`J!X``"N*``"L'@``+(H``+P>```<>`$` +MP!X``"N+``#$'@``+(L``,P>```<>`$`T!X``"N,``#4'@``+(P``.`>```< +M>`$`[!X``"N-``#P'@``+(T```P?```<>`$`3!\``!QX`0!P'P``*XX``'0? +M```LC@``@!\``!QX`0",'P``*X\``)`?```LCP``E!\``!QX`0"T'P``*Y`` +M`+@?```LD```S!\``!QX`0#4'P``*Y$``-@?```LD0``[!\``!QX`0#P'P`` +M*Y(``/0?```LD@```"```!QX`0`((```*Y,```P@```LDP``("```!QX`0`D +M(```')T!`$P@```KA@``4"```"R&``!8(```*XD``%P@```LB0``9"```"N- +M``!H(```+(T``(0@```KAP``B"```"R'``",(```*X@``)`@```LB```W"`` +M`!QX`0#L(```''@!```A```<>`$`&"$``!QX`0`L(0``''@!`#@A```<>`$` +M2"$``!QX`0!4(0``''@!`'@A```<>`$`E"$``!R>`0#((0``')\!`-`A```K +ME```U"$``"R4``#<(0``''@!``@B```<>`$`*"(``"N5```L(@``+)4``#@B +M```<>`$`0"(``"N6``!$(@``+)8``$@B```KEP``3"(``"R7``!0(@``''@! +M`%PB```KF```8"(``"R8``!H(@``*YD``&PB```LF0``<"(``!QX`0"0(@`` +M')8!`*0B````$`^"(``!QX`0`` +M(P``''@!``@C```<>`$`$",``!QX`0`8(P``''@!`"`C```<>`$`6",``"N: +M``!<(P``+)H``&0C```<>`$`?",``!R:`0"((P``')@!`)`C```KFP``E",` +M`"R;``"8(P``''@!`*@C`````#\(P``+)X````D```<>`$`$"0``!R4`0`8)```*Y\``!PD +M```LGP``("0``!QX`0`L)```')0!`#0D```KH```."0``"R@```\)```''@! +M`$@D````$`9"0``!R4`0!L)``` +M*Z(``'`D```LH@``="0``!QX`0"`)```')0!`(@D```KHP``C"0``"RC``"0 +M)```''@!`)PD````$`L"0``"L_ +M``"T)```+#\``+@D```<>`$`Q"0``!R4`0#,)```*Z4``-`D```LI0``U"0` +M`!QX`0#@)```')0!`.@D```KI@``["0``"RF``#P)```''@!`/PD````$`&"4``!R4`0`@)0``*Z@``"0E```L +MJ```*"4``!QX`0`T)0``')0!`#PE```KJ0``0"4``"RI``!$)0``''@!`%`E +M````$`;"4``!R4`0!T)0``*ZL` +M`'@E```LJP``?"4``!QX`0"()0``')0!`)`E```KK```E"4``"RL``"8)0`` +M''@!`*0E````$`P"4``!R4`0#( +M)0``*ZX``,PE```LK@``T"4``!QX`0#8)0``*Z\``-PE```LKP``X"4``!QX +M`0#P)0```FP!`/0E```";`$`^"4```)L`0#\)0```FP!```F```";`$`!"8` +M``)L`0`()@```FP!``PF```";`$`$"8```)L`0`4)@```FP!`!@F```";`$` +M'"8```)L`0`@)@```FP!`"0F```";`$`*"8```)L`0!`)@``'*`!`&0F```K +MM0``:"8``"RU``!L)@``''@!`*0F````$`#"@``!R?`0!0*```''@!`&@H````$`I"H``!R8`0"X*@``')D!`,PJ````$` +MH"P``!R-`0#4+```'(T!`.0L```<>`$`!"T``!RG`0!8+0``''@!`(`M```< +MC0$`J"T``!Q[`0#L+0``''L!`"@N```<>`$`2"X``!RG`0!D+@``'*P$`'#$``"O+```@,0``+,L``"@Q```<>`$`.#$``!Q[ +M`0!,,0``''@!`+@Q```<>`$`T#$``!QX`0`,,@``*\P``!`R```LS```%#(` +M`!QX`0!,,@``*\T``%`R```LS0``5#(``!QX`0#@,@``''@!`%0S````$`3#0``!QX`0!X-```'*4!`)`T +M```<>P$`S#0``!RG`0#@-```''@!`.PT````$`+#T``!RG`0!`/0``''@!`(@]```K-0``C#T``"PU``"L +M/0``'*8!`+0]```";`$`N#T```)L`0`@/@``'+(!`$@^```P$`P$(``"OZ``#$0@`` +M+/H``#Q#````$`Q$H` +M`!RX`0#42@``'+@!``Q+```@$`I$L``!Q[`0"\2P``'($!`/A+```< +MN`$`"$P``!RX`0`<3```'+@!`#!,```<>P$`?$P``!RX`0",3```'+@!`*!, +M```@$`/$T``!Q[`0!430``'($!`)!-```P$`%$X``!RX`0`D3@``'+@!`#A.```P$`P%$``!R_`0#H40``''L!``!2```%(``"L0`0!\4@``+!`!`(12```< +M>`$`C%(``!RO`0"H4@``'*\!`+Q2```%4```("``!\50```@(``(!5```"`@``A%4```("``"(50```@(``(Q5```" +M`@``D%4```("``"450```@(``)A5```"`@``J%4``!QX`0"P50``',4!`+A5 +M````$`.%<``!R<`0!,5P``',@!`%Q7```<>`$`K%<``!QX`0#,5P`` +M'*P$`(%@``!RG`0!(6```'*`$`"%X``!R<`0`87@``''@!`#!> +M``````<>`$`D%X``!QX`0#,7@``'*4! +M`-Q>```<>`$`]%X``!Q[`0`47P``'*`$`B%\``!RG`0"\7P`` +M''@!`-A?````$`>&$``!RG +M`0"(80``''@!`-AA````$`F&(` +M`!Q_`0"L8@``''@!`,1B````$` +M'&,``!QX`0`L8P``'*\!`$!C````$`,&<``!RF`0!,9P``'*4!`&QG```<>`$`@&<``!RG`0"@9P``''@! +M`,AG````$`&&T``!QX`0`X;0``''@!`%AM```<>`$`F&T``!Q[`0"P;0``'*`$`6&X``!S<`0!D;@`` +M'-T!`(1N```";`$`B&X```))`0",;@```FP!`)!N```";`$`E&X```)L`0"8 +M;@```FP!`+1N````$`F&\``!R=`0"\;P``'-X!`-!O```P$`2'```"LL`0!,<```+"P!`%1P````$`8',` +M`"M;``!D`$` +MM',``!S2`0#('0``!RX`0!\=```*UL` +M`(!T```L6P``F'0``!S3`0"X=```*S`$`B'8``"L^`0",=@``+#X!`)1V +M```<>`$`G'8``"LT`0"@=@``+#0!`*AV``````''@!`$AX``````'(T!`)AX``````'.4!`-AX```";`$`W'@```))`0#@>````FP!`/1X```< +MV`$`)'D```("```H>0```@(``"QY```"`@``,'D```("``!@>0``'-L!`'1Y +M````````(>``!\ +M`````@D``(`````"^P``A`````)%`0"(`````@L``(P````"'@``D`````(- +M``"8`````O@``)P````"+@$`K`````(>``"P`````AX``+P````"0@$`P``` +M``+'``#$`````@D!`,@````"'@``S`````(J`0#0`````@```(`0```AX```P! +M```"'@``$`$```(6```4`0```LD``!@!```"O@``'`$```(>```@`0```A@` +M`"P!```"Y@``-`$```+:```\`0```M,``$0!```"NP``3`$```)N``!0`0`` +M`F8``%0!```")@``6`$```*X``!<`0```K,``&`!```",@``9`$```)*``!H +M`0```B(``&P!```"(```<`$```(D``!T`0```K$``'@!```"<```?`$```(: +M``"``0```D(``(0!```"'```B`$```(<``",`0```B@``)`!```"*@``E`$` +M``(L``"<`0```BX``*`!```"'```I`$```)=``"H`0```AP``*P!```"6``` +ML`$```(<``"T`0```DT``+@!```"10```````"H"`````````'4!``@````J +M`@``$````"H"```8````*@(``"`````J`@``*````"H"```P````*@(``#@` +M```J`@``0````"H"``!(````*@(``%`````J`@``6````"H"``!@````*@(` +M`&@````J`@``<````"H"``!X````*@(``(`````J`@``B````"H"``"0```` +M*@(``)@````J`@``H````"H"``"H````*@(``+`````J`@``N````"H"``#` +M````*@(``,@````J`@``T````"H"``#8````*@(``.`````J`@``X`````") +M`0#D````*@<``.@````J`@``\````"H"``#X````*@(````!```J`@``"`$` +M`"H"```0`0``*@(``!@!```J`@``(`$``"H"```H`0``*@(``#`!```J`@`` +M.`$``"H"``!``0``*@(``$@!```J`@``4`$``"H"``!8`0``*@(``&`!```J +M`@``:`$``"H"``!P`0``*@(``'@!```J`@``@`$``"H"``"(`0``*@(``)`! +M```J`@``F`$``"H"``"@`0``*@(``*@!```J`@``L`$``"H"``"X`0``*@(` +M`,`!```J`@``R`$``"H"``#0`0``*@(``-@!```J`@``X`$``"H"``#H`0`` +M*@(``/`!```J`@``^`$``"H"`````@``*@(```@"```J`@``$`(``"H"```8 +M`@``*@(``"`"```J`@``*`(``"H"```P`@``*@(``#@"```J`@``0`(``"H" +*``!(`@``*@(````` ` end diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c index fb0bb699b08d..b56b65c26736 100755 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c @@ -60,6 +60,7 @@ static struct usb_interface *pintf; #ifdef CONFIG_GLOBAL_UI_PID int ui_pid[3] = {0, 0, 0}; #endif +int sleep_resume = 1; extern void rtl8188_power_save_exit(void); extern void rtl8188_power_save_init(void); @@ -777,7 +778,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) //padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); return 0; } - + sleep_resume = 0; DBG_8192C("########### rtw_suspend #################\n"); if(padapter)//system suspend @@ -978,6 +979,7 @@ int rtw_resume_process(struct usb_interface *pusb_intf) #endif DBG_871X("########### rtw_resume done#################\n"); + sleep_resume = 1; #ifdef CONFIG_RESUME_IN_WORKQUEUE rtw_unlock_suspend(); @@ -1253,7 +1255,7 @@ static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device #ifdef CONFIG_GLOBAL_UI_PID if(ui_pid[1]!=0) { DBG_871X("ui_pid[1]:%d\n",ui_pid[1]); -// rtw_signal_process(ui_pid[1], SIGUSR2); + rtw_signal_process(ui_pid[1], SIGUSR2); } #endif diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h index 1b07896e2f33..3690f4b0687c 100755 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h @@ -7,7 +7,7 @@ /* * Broadcom BCM4319 driver version. */ -#define RTL8192_DRV_VERSION "3.11" +#define RTL8192_DRV_VERSION "3.12" #endif /* WIFI_BCM4319_VERSION_H */ From 7f43fa47bcfb6ab092f3ca551642377eaaf970fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Sat, 24 Sep 2011 21:15:10 +0800 Subject: [PATCH 148/150] delete the old rtl8188cu driver --- drivers/net/wireless/rtl8192c/Kconfig | 8 - drivers/net/wireless/rtl8192c/Makefile | 199 - .../wireless/rtl8192c/core/efuse/rtw_efuse.c | 1042 - drivers/net/wireless/rtl8192c/core/rtw_cmd.c | 2352 -- .../net/wireless/rtl8192c/core/rtw_debug.c | 604 - .../net/wireless/rtl8192c/core/rtw_eeprom.c | 424 - .../wireless/rtl8192c/core/rtw_ieee80211.c | 1202 - drivers/net/wireless/rtl8192c/core/rtw_io.c | 422 - .../wireless/rtl8192c/core/rtw_ioctl_query.c | 197 - .../wireless/rtl8192c/core/rtw_ioctl_rtl.c | 1032 - .../wireless/rtl8192c/core/rtw_ioctl_set.c | 1283 - drivers/net/wireless/rtl8192c/core/rtw_mlme.c | 3678 -- .../net/wireless/rtl8192c/core/rtw_mlme_ext.c | 10541 ------ drivers/net/wireless/rtl8192c/core/rtw_mp.c | 2254 -- .../net/wireless/rtl8192c/core/rtw_mp_ioctl.c | 2841 -- drivers/net/wireless/rtl8192c/core/rtw_p2p.c | 1726 - .../net/wireless/rtl8192c/core/rtw_pwrctrl.c | 1128 - drivers/net/wireless/rtl8192c/core/rtw_recv.c | 4445 --- drivers/net/wireless/rtl8192c/core/rtw_rf.c | 96 - .../net/wireless/rtl8192c/core/rtw_security.c | 2811 -- .../net/wireless/rtl8192c/core/rtw_sta_mgt.c | 654 - .../wireless/rtl8192c/core/rtw_wlan_util.c | 1747 - drivers/net/wireless/rtl8192c/core/rtw_xmit.c | 3779 -- drivers/net/wireless/rtl8192c/hal/hal_init.c | 122 - .../rtl8192c/hal/rtl8192c/rtl8192c_cmd.c | 1134 - .../rtl8192c/hal/rtl8192c/rtl8192c_dm.c | 4687 --- .../rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c | 3541 -- .../rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c | 5415 --- .../rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c | 1047 - .../rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c | 752 - .../rtl8192c/hal/rtl8192c/rtl8192c_sreset.c | 285 - .../hal/rtl8192c/usb/Hal8192CUHWImg.c | 7346 ---- .../rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c | 2659 -- .../hal/rtl8192c/usb/rtl8192cu_recv.c | 380 - .../hal/rtl8192c/usb/rtl8192cu_xmit.c | 1338 - .../rtl8192c/hal/rtl8192c/usb/usb_halinit.c | 5453 --- .../rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c | 1208 - .../rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c | 1997 - .../rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c | 1266 - .../rtl8192c/include/Hal8192CEHWImg.h | 66 - .../rtl8192c/include/Hal8192CPhyCfg.h | 451 - .../rtl8192c/include/Hal8192CPhyReg.h | 1052 - .../rtl8192c/include/Hal8192CUHWImg.h | 92 - .../rtl8192c/include/Hal8192DEHWImg.h | 66 - .../rtl8192c/include/Hal8192DETestHWImg.h | 54 - .../rtl8192c/include/Hal8192DPhyCfg.h | 545 - .../rtl8192c/include/Hal8192DPhyReg.h | 1059 - .../rtl8192c/include/Hal8192DUHWImg.h | 66 - .../rtl8192c/include/Hal8192DUTestHWImg.h | 54 - .../net/wireless/rtl8192c/include/autoconf.h | 216 - .../wireless/rtl8192c/include/basic_types.h | 276 - .../rtl8192c/include/byteorder/big_endian.h | 87 - .../rtl8192c/include/byteorder/generic.h | 209 - .../include/byteorder/little_endian.h | 89 - .../rtl8192c/include/byteorder/swab.h | 133 - .../rtl8192c/include/byteorder/swabb.h | 157 - .../net/wireless/rtl8192c/include/circ_buf.h | 27 - .../net/wireless/rtl8192c/include/cmd_osdep.h | 36 - .../net/wireless/rtl8192c/include/drv_conf.h | 57 - .../net/wireless/rtl8192c/include/drv_types.h | 432 - .../wireless/rtl8192c/include/drv_types_ce.h | 92 - .../rtl8192c/include/drv_types_linux.h | 25 - .../wireless/rtl8192c/include/drv_types_xp.h | 95 - .../net/wireless/rtl8192c/include/ethernet.h | 41 - .../net/wireless/rtl8192c/include/farray.h | 31480 ---------------- .../net/wireless/rtl8192c/include/h2clbk.h | 35 - .../net/wireless/rtl8192c/include/hal_init.h | 272 - .../net/wireless/rtl8192c/include/ieee80211.h | 1432 - .../wireless/rtl8192c/include/ieee80211_ext.h | 477 - .../net/wireless/rtl8192c/include/if_ether.h | 112 - drivers/net/wireless/rtl8192c/include/ip.h | 138 - .../wireless/rtl8192c/include/mlme_osdep.h | 43 - .../wireless/rtl8192c/include/mp_custom_oid.h | 353 - .../net/wireless/rtl8192c/include/nic_spec.h | 47 - .../rtl8192c/include/osdep_ce_service.h | 171 - .../wireless/rtl8192c/include/osdep_intf.h | 128 - .../wireless/rtl8192c/include/osdep_service.h | 808 - .../net/wireless/rtl8192c/include/pci_hal.h | 168 - .../net/wireless/rtl8192c/include/pci_ops.h | 58 - .../wireless/rtl8192c/include/pci_osintf.h | 33 - .../wireless/rtl8192c/include/recv_osdep.h | 58 - .../wireless/rtl8192c/include/rtl8192c_cmd.h | 98 - .../wireless/rtl8192c/include/rtl8192c_dm.h | 608 - .../rtl8192c/include/rtl8192c_event.h | 29 - .../wireless/rtl8192c/include/rtl8192c_hal.h | 879 - .../wireless/rtl8192c/include/rtl8192c_led.h | 43 - .../wireless/rtl8192c/include/rtl8192c_recv.h | 182 - .../wireless/rtl8192c/include/rtl8192c_rf.h | 93 - .../wireless/rtl8192c/include/rtl8192c_spec.h | 1898 - .../rtl8192c/include/rtl8192c_sreset.h | 54 - .../wireless/rtl8192c/include/rtl8192c_xmit.h | 91 - .../wireless/rtl8192c/include/rtl8192d_cmd.h | 103 - .../wireless/rtl8192c/include/rtl8192d_dm.h | 471 - .../wireless/rtl8192c/include/rtl8192d_hal.h | 857 - .../wireless/rtl8192c/include/rtl8192d_led.h | 44 - .../wireless/rtl8192c/include/rtl8192d_recv.h | 182 - .../wireless/rtl8192c/include/rtl8192d_rf.h | 98 - .../wireless/rtl8192c/include/rtl8192d_spec.h | 1859 - .../wireless/rtl8192c/include/rtl8192d_xmit.h | 106 - .../wireless/rtl8192c/include/rtw_byteorder.h | 41 - .../net/wireless/rtl8192c/include/rtw_cmd.h | 1100 - .../net/wireless/rtl8192c/include/rtw_debug.h | 374 - .../wireless/rtl8192c/include/rtw_eeprom.h | 145 - .../net/wireless/rtl8192c/include/rtw_efuse.h | 123 - .../net/wireless/rtl8192c/include/rtw_event.h | 154 - .../net/wireless/rtl8192c/include/rtw_ht.h | 51 - .../net/wireless/rtl8192c/include/rtw_io.h | 535 - .../net/wireless/rtl8192c/include/rtw_ioctl.h | 271 - .../rtl8192c/include/rtw_ioctl_query.h | 37 - .../wireless/rtl8192c/include/rtw_ioctl_rtl.h | 84 - .../wireless/rtl8192c/include/rtw_ioctl_set.h | 74 - .../net/wireless/rtl8192c/include/rtw_led.h | 212 - .../net/wireless/rtl8192c/include/rtw_mlme.h | 573 - .../wireless/rtl8192c/include/rtw_mlme_ext.h | 759 - .../net/wireless/rtl8192c/include/rtw_mp.h | 634 - .../wireless/rtl8192c/include/rtw_mp_ioctl.h | 596 - .../rtl8192c/include/rtw_mp_phy_regdef.h | 1098 - .../net/wireless/rtl8192c/include/rtw_p2p.h | 48 - .../wireless/rtl8192c/include/rtw_pwrctrl.h | 331 - .../net/wireless/rtl8192c/include/rtw_qos.h | 41 - .../net/wireless/rtl8192c/include/rtw_recv.h | 703 - .../net/wireless/rtl8192c/include/rtw_rf.h | 138 - .../wireless/rtl8192c/include/rtw_security.h | 423 - .../wireless/rtl8192c/include/rtw_version.h | 1 - .../net/wireless/rtl8192c/include/rtw_xmit.h | 665 - .../net/wireless/rtl8192c/include/sdio_hal.h | 34 - .../net/wireless/rtl8192c/include/sdio_ops.h | 80 - .../wireless/rtl8192c/include/sdio_ops_ce.h | 56 - .../rtl8192c/include/sdio_ops_linux.h | 55 - .../wireless/rtl8192c/include/sdio_ops_xp.h | 56 - .../wireless/rtl8192c/include/sdio_osintf.h | 48 - .../net/wireless/rtl8192c/include/sta_info.h | 293 - .../net/wireless/rtl8192c/include/usb_hal.h | 30 - .../net/wireless/rtl8192c/include/usb_ops.h | 58 - .../wireless/rtl8192c/include/usb_osintf.h | 39 - .../rtl8192c/include/usb_vendor_req.h | 60 - drivers/net/wireless/rtl8192c/include/wifi.h | 1148 - .../wireless/rtl8192c/include/wlan_bssdef.h | 435 - .../wireless/rtl8192c/include/xmit_osdep.h | 90 - .../rtl8192c/os_dep/linux/ioctl_linux.uu | 1442 - .../rtl8192c/os_dep/linux/mlme_linux.c | 781 - .../wireless/rtl8192c/os_dep/linux/os_intfs.c | 1343 - .../rtl8192c/os_dep/linux/recv_linux.c | 391 - .../wireless/rtl8192c/os_dep/linux/usb_intf.c | 1474 - .../rtl8192c/os_dep/linux/wifi_power.c | 112 - .../rtl8192c/os_dep/linux/wifi_power.h | 87 - .../rtl8192c/os_dep/linux/wifi_power_ops.c | 112 - .../rtl8192c/os_dep/linux/wifi_power_usb.c | 118 - .../rtl8192c/os_dep/linux/wifi_version.h | 13 - .../rtl8192c/os_dep/linux/xmit_linux.c | 291 - .../wireless/rtl8192c/os_dep/osdep_service.c | 1346 - 151 files changed, 151283 deletions(-) delete mode 100755 drivers/net/wireless/rtl8192c/Kconfig delete mode 100644 drivers/net/wireless/rtl8192c/Makefile delete mode 100755 drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_cmd.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_debug.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_eeprom.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_io.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mlme.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mp.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_p2p.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_recv.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_rf.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_security.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c delete mode 100755 drivers/net/wireless/rtl8192c/core/rtw_xmit.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/hal_init.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c delete mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h delete mode 100755 drivers/net/wireless/rtl8192c/include/autoconf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/basic_types.h delete mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h delete mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/generic.h delete mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h delete mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/swab.h delete mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/swabb.h delete mode 100755 drivers/net/wireless/rtl8192c/include/circ_buf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/cmd_osdep.h delete mode 100755 drivers/net/wireless/rtl8192c/include/drv_conf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/drv_types.h delete mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_ce.h delete mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_linux.h delete mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_xp.h delete mode 100755 drivers/net/wireless/rtl8192c/include/ethernet.h delete mode 100755 drivers/net/wireless/rtl8192c/include/farray.h delete mode 100755 drivers/net/wireless/rtl8192c/include/h2clbk.h delete mode 100755 drivers/net/wireless/rtl8192c/include/hal_init.h delete mode 100755 drivers/net/wireless/rtl8192c/include/ieee80211.h delete mode 100755 drivers/net/wireless/rtl8192c/include/ieee80211_ext.h delete mode 100755 drivers/net/wireless/rtl8192c/include/if_ether.h delete mode 100755 drivers/net/wireless/rtl8192c/include/ip.h delete mode 100755 drivers/net/wireless/rtl8192c/include/mlme_osdep.h delete mode 100755 drivers/net/wireless/rtl8192c/include/mp_custom_oid.h delete mode 100755 drivers/net/wireless/rtl8192c/include/nic_spec.h delete mode 100755 drivers/net/wireless/rtl8192c/include/osdep_ce_service.h delete mode 100755 drivers/net/wireless/rtl8192c/include/osdep_intf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/osdep_service.h delete mode 100755 drivers/net/wireless/rtl8192c/include/pci_hal.h delete mode 100755 drivers/net/wireless/rtl8192c/include/pci_ops.h delete mode 100755 drivers/net/wireless/rtl8192c/include/pci_osintf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/recv_osdep.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_event.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_led.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_led.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_byteorder.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_cmd.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_debug.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_eeprom.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_efuse.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_event.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ht.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_io.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_led.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mlme.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_p2p.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_qos.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_recv.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_rf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_security.h delete mode 100644 drivers/net/wireless/rtl8192c/include/rtw_version.h delete mode 100755 drivers/net/wireless/rtl8192c/include/rtw_xmit.h delete mode 100755 drivers/net/wireless/rtl8192c/include/sdio_hal.h delete mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops.h delete mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h delete mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h delete mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h delete mode 100755 drivers/net/wireless/rtl8192c/include/sdio_osintf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/sta_info.h delete mode 100755 drivers/net/wireless/rtl8192c/include/usb_hal.h delete mode 100755 drivers/net/wireless/rtl8192c/include/usb_ops.h delete mode 100755 drivers/net/wireless/rtl8192c/include/usb_osintf.h delete mode 100755 drivers/net/wireless/rtl8192c/include/usb_vendor_req.h delete mode 100755 drivers/net/wireless/rtl8192c/include/wifi.h delete mode 100755 drivers/net/wireless/rtl8192c/include/wlan_bssdef.h delete mode 100755 drivers/net/wireless/rtl8192c/include/xmit_osdep.h delete mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu delete mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c delete mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c delete mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c delete mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c delete mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c delete mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h delete mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c delete mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c delete mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h delete mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c delete mode 100755 drivers/net/wireless/rtl8192c/os_dep/osdep_service.c diff --git a/drivers/net/wireless/rtl8192c/Kconfig b/drivers/net/wireless/rtl8192c/Kconfig deleted file mode 100755 index 60dc33866eef..000000000000 --- a/drivers/net/wireless/rtl8192c/Kconfig +++ /dev/null @@ -1,8 +0,0 @@ -config RTL8192CU - tristate "Realtek 8192C USB WiFi" - depends on WLAN_80211 && USB - select WIRELESS_EXT - select IEEE80211 - ---help--- - Help message of RTL8192CU - diff --git a/drivers/net/wireless/rtl8192c/Makefile b/drivers/net/wireless/rtl8192c/Makefile deleted file mode 100644 index 218c25c33d7e..000000000000 --- a/drivers/net/wireless/rtl8192c/Makefile +++ /dev/null @@ -1,199 +0,0 @@ -# -# Makefile for RTL8188/8192 USB WiFi -# - -EXTRA_CFLAGS += -O1 -#EXTRA_CFLAGS += -O3 -EXTRA_CFLAGS += -Wall -#EXTRA_CFLAGS += -Wextra -#EXTRA_CFLAGS += -Werror -#EXTRA_CFLAGS += -pedantic -#EXTRA_CFLAGS += -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes - -EXTRA_CFLAGS += -Wno-unused-variable -EXTRA_CFLAGS += -Wno-unused-value -EXTRA_CFLAGS += -Wno-unused-label -EXTRA_CFLAGS += -Wno-unused-parameter -EXTRA_CFLAGS += -Wno-unused-function -EXTRA_CFLAGS += -Wno-unused - -EXTRA_CFLAGS += -Wno-uninitialized - -EXTRA_CFLAGS += -I$(src)/include - -CONFIG_AUTOCFG_CP = n - -CONFIG_RTL8192C = y -CONFIG_RTL8192D = n - -CONFIG_USB_HCI = y -CONFIG_PCI_HCI = n -CONFIG_SDIO_HCI = n - -CONFIG_MP_INCLUDED = n -CONFIG_POWER_SAVING = n -CONFIG_USB_AUTOSUSPEND = n -CONFIG_HW_PWRP_DETECTION = n -CONFIG_WIFI_TEST = n -CONFIG_BT_COEXISTENCE = n -CONFIG_RTL8192CU_REDEFINE_1X1 = n - -CONFIG_PLATFORM_ARM_RK2918 = y - -CONFIG_DRVEXT_MODULE = n - -export TopDIR ?= $(shell pwd) - - -ifeq ($(CONFIG_RTL8192C), y) - -RTL871X = rtl8192c - -ifeq ($(CONFIG_USB_HCI), y) -MODULE_NAME = 8192cu -FW_FILES := hal/$(RTL871X)/usb/Hal8192CUHWImg.o -endif - -CHIP_FILES := hal/$(RTL871X)/$(RTL871X)_sreset.o -CHIP_FILES += $(FW_FILES) -endif - -os_dep/linux/ioctl_linux.o: os_dep/linux/ioctl_linux.uu - @echo "UUDE os_dep/linux/ioctl_linux.uu" - @uudecode os_dep/linux/ioctl_linux.uu -o os_dep/linux/ioctl_linux.o - -ifeq ($(CONFIG_USB_HCI), y) - -HCI_NAME = usb - -_OS_INTFS_FILES := os_dep/osdep_service.o \ - os_dep/linux/os_intfs.o \ - os_dep/linux/$(HCI_NAME)_intf.o \ - os_dep/linux/ioctl_linux.o \ - os_dep/linux/xmit_linux.o \ - os_dep/linux/ioctl_linux.o \ - os_dep/linux/mlme_linux.o \ - os_dep/linux/recv_linux.o - -_HAL_INTFS_FILES := hal/hal_init.o \ - hal/$(RTL871X)/$(RTL871X)_hal_init.o \ - hal/$(RTL871X)/$(RTL871X)_phycfg.o \ - hal/$(RTL871X)/$(RTL871X)_rf6052.o \ - hal/$(RTL871X)/$(RTL871X)_dm.o \ - hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ - hal/$(RTL871X)/$(RTL871X)_cmd.o \ - hal/$(RTL871X)/usb/usb_ops_linux.o \ - hal/$(RTL871X)/usb/usb_halinit.o \ - hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_led.o \ - hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_xmit.o \ - hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_recv.o - -_HAL_INTFS_FILES += $(CHIP_FILES) - -endif - -ifeq ($(CONFIG_AUTOCFG_CP), y) -$(shell cp $(TopDIR)/autoconf_$(RTL871X)_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) -endif - - -ifeq ($(CONFIG_USB_HCI), y) -ifeq ($(CONFIG_USB_AUTOSUSPEND), y) -EXTRA_CFLAGS += -DCONFIG_USB_AUTOSUSPEND -endif -endif - -ifeq ($(CONFIG_POWER_SAVING), y) -EXTRA_CFLAGS += -DCONFIG_POWER_SAVING -endif - -ifeq ($(CONFIG_HW_PWRP_DETECTION), y) -EXTRA_CFLAGS += -DCONFIG_HW_PWRP_DETECTION -endif - -ifeq ($(CONFIG_WIFI_TEST), y) -EXTRA_CFLAGS += -DCONFIG_WIFI_TEST -endif - -ifeq ($(CONFIG_BT_COEXISTENCE), y) -EXTRA_CFLAGS += -DCONFIG_BT_COEXISTENCE -endif - -ifeq ($(CONFIG_RTL8192CU_REDEFINE_1X1), y) -EXTRA_CFLAGS += -DRTL8192C_RECONFIG_TO_1T1R -endif - -ifeq ($(CONFIG_PLATFORM_ARM_RK2918), y) -EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -ARCH := arm -CROSS_COMPILE := /opt/toolchain/arm-eabi-4.4.0/bin/arm-eabi- -KSRC := 2.6.25.1 -#MODULE_NAME := wlan0 -endif - -# -# Add minimize memory usage. -# -EXTRA_CFLAGS += -DCONFIG_MINIMAL_MEMORY_USAGE - -ifneq ($(KERNELRELEASE),) - - -rtk_core := core/rtw_cmd.o \ - core/rtw_security.o \ - core/rtw_debug.o \ - core/rtw_io.o \ - core/rtw_ioctl_query.o \ - core/rtw_ioctl_set.o \ - core/rtw_ieee80211.o \ - core/rtw_mlme.o \ - core/rtw_mlme_ext.o \ - core/rtw_wlan_util.o \ - core/rtw_pwrctrl.o \ - core/rtw_rf.o \ - core/rtw_recv.o \ - core/rtw_sta_mgt.o \ - core/rtw_xmit.o \ - core/rtw_p2p.o - -rtl$(MODULE_NAME)-y += $(rtk_core) - -rtl$(MODULE_NAME)-y += core/efuse/rtw_efuse.o - -rtl$(MODULE_NAME)-y += $(_HAL_INTFS_FILES) - -rtl$(MODULE_NAME)-y += $(_OS_INTFS_FILES) - - -rtl$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o \ - core/rtw_mp_ioctl.o \ - core/rtw_ioctl_rtl.o - -rk_cfg := \ - os_dep/linux/wifi_power.o \ - os_dep/linux/wifi_power_usb.o \ - os_dep/linux/wifi_power_ops.o - -rkcfg-y += $(rk_cfg) -obj-$(CONFIG_RTL8192CU) := rtl$(MODULE_NAME).o rkcfg.o - -else - -export CONFIG_RTL8192CU = m - -all: modules - -modules: - $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules - -strip: - $(CROSS_COMPILE)strip $(MODULE_NAME).ko --strip-unneeded - -config_r: - @echo "make config" - /bin/bash script/Configure script/config.in - -.PHONY: modules clean - -endif - diff --git a/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c b/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c deleted file mode 100755 index 2d90a4c5963f..000000000000 --- a/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c +++ /dev/null @@ -1,1042 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_EFUSE_C_ - -#include -#include -#include - -#include - -#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE -extern int storeAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path); -extern int retriveAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path); -#endif - - -/*------------------------Define local variable------------------------------*/ -u8 fakeEfuseBank=0; -u32 fakeEfuseUsedBytes=0; -u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]={0}; -u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0}; -u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0}; - -u32 BTEfuseUsedBytes=0; -u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; -u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; -u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; - -u32 fakeBTEfuseUsedBytes=0; -u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; -u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; -u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; -/*------------------------Define local variable------------------------------*/ - -//------------------------------------------------------------------------------ -#define REG_EFUSE_CTRL 0x0030 -#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. -//------------------------------------------------------------------------------ - -BOOLEAN -Efuse_Read1ByteFromFakeContent( - IN PADAPTER pAdapter, - IN u16 Offset, - IN OUT u8 *Value ) -{ - if(Offset >= EFUSE_MAX_HW_SIZE) - { - return _FALSE; - } - //DbgPrint("Read fake content, offset = %d\n", Offset); - if(fakeEfuseBank == 0) - *Value = fakeEfuseContent[Offset]; - else - *Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset]; - return _TRUE; -} -BOOLEAN -Efuse_Write1ByteToFakeContent( - IN PADAPTER pAdapter, - IN u16 Offset, - IN u8 Value ) -{ - if(Offset >= EFUSE_MAX_HW_SIZE) - { - return _FALSE; - } - if(fakeEfuseBank == 0) - fakeEfuseContent[Offset] = Value; - else - { - fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value; - } - return _TRUE; -} - -/*----------------------------------------------------------------------------- - * Function: Efuse_PowerSwitch - * - * Overview: When we want to enable write operation, we should change to - * pwr on state. When we stop write, we should switch to 500k mode - * and disable LDO 2.5V. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/17/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -VOID -Efuse_PowerSwitch( - IN PADAPTER pAdapter, - IN u8 bWrite, - IN u8 PwrState) -{ - pAdapter->HalFunc.EfusePowerSwitch(pAdapter, bWrite, PwrState); -} - -/*----------------------------------------------------------------------------- - * Function: efuse_GetCurrentSize - * - * Overview: Get current efuse size!!! - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/16/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -u16 -Efuse_GetCurrentSize( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN BOOLEAN bPseudoTest) -{ - u16 ret=0; - - ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest); - - return ret; -} - -/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */ -u8 -Efuse_CalculateWordCnts(IN u8 word_en) -{ - u8 word_cnts = 0; - if(!(word_en & BIT(0))) word_cnts++; // 0 : write enable - if(!(word_en & BIT(1))) word_cnts++; - if(!(word_en & BIT(2))) word_cnts++; - if(!(word_en & BIT(3))) word_cnts++; - return word_cnts; -} - -// -// Description: -// Execute E-Fuse read byte operation. -// Refered from SD1 Richard. -// -// Assumption: -// 1. Boot from E-Fuse and successfully auto-load. -// 2. PASSIVE_LEVEL (USB interface) -// -// Created by Roger, 2008.10.21. -// -VOID -ReadEFuseByte( - PADAPTER Adapter, - u16 _offset, - u8 *pbuf, - IN BOOLEAN bPseudoTest) -{ - u32 value32; - u8 readbyte; - u16 retry; - //u32 start=rtw_get_current_time(); - - if(bPseudoTest) - { - Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf); - return; - } - - //Write Address - rtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff)); - readbyte = rtw_read8(Adapter, EFUSE_CTRL+2); - rtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc)); - - //Write bit 32 0 - readbyte = rtw_read8(Adapter, EFUSE_CTRL+3); - rtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f)); - - //Check bit 32 read-ready - retry = 0; - value32 = rtw_read32(Adapter, EFUSE_CTRL); - //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10)) - while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000)) - { - value32 = rtw_read32(Adapter, EFUSE_CTRL); - retry++; - } - - // 20100205 Joseph: Add delay suggested by SD1 Victor. - // This fix the problem that Efuse read error in high temperature condition. - // Designer says that there shall be some delay after ready bit is set, or the - // result will always stay on last data we read. - rtw_udelay_os(50); - value32 = rtw_read32(Adapter, EFUSE_CTRL); - - *pbuf = (u8)(value32 & 0xff); - //MSG_8192C("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start)); - -} - - -// -// Description: -// 1. Execute E-Fuse read byte operation according as map offset and -// save to E-Fuse table. -// 2. Refered from SD1 Richard. -// -// Assumption: -// 1. Boot from E-Fuse and successfully auto-load. -// 2. PASSIVE_LEVEL (USB interface) -// -// Created by Roger, 2008.10.21. -// -// 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. -// 2. Add efuse utilization collect. -// 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 -// write addr must be after sec5. -// -VOID -efuse_ReadEFuse( - PADAPTER Adapter, - u8 efuseType, - u16 _offset, - u16 _size_byte, - u8 *pbuf, - IN BOOLEAN bPseudoTest - ) -{ - Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest); -} - -VOID -EFUSE_GetEfuseDefinition( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u8 type, - OUT PVOID *pOut, - IN BOOLEAN bPseudoTest - ) -{ - pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest); -} - -/*----------------------------------------------------------------------------- - * Function: EFUSE_Read1Byte - * - * Overview: Copy from WMAC fot EFUSE read 1 byte. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 09/23/2008 MHC Copy from WMAC. - * - *---------------------------------------------------------------------------*/ -u8 -EFUSE_Read1Byte( - IN PADAPTER Adapter, - IN u16 Address) -{ - u8 data; - u8 Bytetemp = {0x00}; - u8 temp = {0x00}; - u32 k=0; - u16 contentLen=0; - - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); - - if (Address < contentLen) //E-fuse 512Byte - { - //Write E-fuse Register address bit0~7 - temp = Address & 0xFF; - rtw_write8(Adapter, EFUSE_CTRL+1, temp); - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); - //Write E-fuse Register address bit8~9 - temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); - rtw_write8(Adapter, EFUSE_CTRL+2, temp); - - //Write 0x30[31]=0 - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - temp = Bytetemp & 0x7F; - rtw_write8(Adapter, EFUSE_CTRL+3, temp); - - //Wait Write-ready (0x30[31]=1) - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - while(!(Bytetemp & 0x80)) - { - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - k++; - if(k==1000) - { - k=0; - break; - } - } - data=rtw_read8(Adapter, EFUSE_CTRL); - return data; - } - else - return 0xFF; - -}/* EFUSE_Read1Byte */ - -/*----------------------------------------------------------------------------- - * Function: EFUSE_Write1Byte - * - * Overview: Copy from WMAC fot EFUSE write 1 byte. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 09/23/2008 MHC Copy from WMAC. - * - *---------------------------------------------------------------------------*/ -void -EFUSE_Write1Byte( - IN PADAPTER Adapter, - IN u16 Address, - IN u8 Value) -{ - u8 Bytetemp = {0x00}; - u8 temp = {0x00}; - u32 k=0; - u16 contentLen=0; - - //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr=%x Data =%x\n", Address, Value)); - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); - - if( Address < contentLen) //E-fuse 512Byte - { - rtw_write8(Adapter, EFUSE_CTRL, Value); - - //Write E-fuse Register address bit0~7 - temp = Address & 0xFF; - rtw_write8(Adapter, EFUSE_CTRL+1, temp); - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); - - //Write E-fuse Register address bit8~9 - temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); - rtw_write8(Adapter, EFUSE_CTRL+2, temp); - - //Write 0x30[31]=1 - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - temp = Bytetemp | 0x80; - rtw_write8(Adapter, EFUSE_CTRL+3, temp); - - //Wait Write-ready (0x30[31]=0) - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - while(Bytetemp & 0x80) - { - Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); - k++; - if(k==100) - { - k=0; - break; - } - } - } -}/* EFUSE_Write1Byte */ - -/* 11/16/2008 MH Read one byte from real Efuse. */ -u8 -efuse_OneByteRead( - IN PADAPTER pAdapter, - IN u16 addr, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - u8 tmpidx = 0; - u8 bResult; - - if(bPseudoTest) - { - bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data); - return bResult; - } - // -----------------e-fuse reg ctrl --------------------------------- - //address - rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff)); - rtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) | - (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )); - - rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72);//read cmd - - while(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<100)) - { - tmpidx++; - } - if(tmpidx<100) - { - *data=rtw_read8(pAdapter, EFUSE_CTRL); - bResult = _TRUE; - } - else - { - *data = 0xff; - bResult = _FALSE; - } - return bResult; -} - -/* 11/16/2008 MH Write one byte to reald Efuse. */ -u8 -efuse_OneByteWrite( - IN PADAPTER pAdapter, - IN u16 addr, - IN u8 data, - IN BOOLEAN bPseudoTest) -{ - u8 tmpidx = 0; - u8 bResult; - - if(bPseudoTest) - { - bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data); - return bResult; - } - //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr = %x Data=%x\n", addr, data)); - - //return 0; - - // -----------------e-fuse reg ctrl --------------------------------- - //address - rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff)); - rtw_write8(pAdapter, EFUSE_CTRL+2, - (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )|(u8)((addr>>8)&0x03) ); - rtw_write8(pAdapter, EFUSE_CTRL, data);//data - - rtw_write8(pAdapter, EFUSE_CTRL+3, 0xF2);//write cmd - - while((0x80 & rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){ - tmpidx++; - } - - if(tmpidx<100) - { - bResult = _TRUE; - } - else - { - bResult = _FALSE; - } - - return bResult; -} - -int -Efuse_PgPacketRead( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret=0; - - ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest); - - return ret; -} - -int -Efuse_PgPacketWrite(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret; - - ret = pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest); - - return ret; -} - -/*----------------------------------------------------------------------------- - * Function: efuse_WordEnableDataRead - * - * Overview: Read allowed word in current efuse section data. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/16/2008 MHC Create Version 0. - * 11/21/2008 MHC Fix Write bug when we only enable late word. - * - *---------------------------------------------------------------------------*/ -void -efuse_WordEnableDataRead(IN u8 word_en, - IN u8 *sourdata, - IN u8 *targetdata) -{ - if (!(word_en&BIT(0))) - { - targetdata[0] = sourdata[0]; - targetdata[1] = sourdata[1]; - } - if (!(word_en&BIT(1))) - { - targetdata[2] = sourdata[2]; - targetdata[3] = sourdata[3]; - } - if (!(word_en&BIT(2))) - { - targetdata[4] = sourdata[4]; - targetdata[5] = sourdata[5]; - } - if (!(word_en&BIT(3))) - { - targetdata[6] = sourdata[6]; - targetdata[7] = sourdata[7]; - } -} - - -u8 -Efuse_WordEnableDataWrite( IN PADAPTER pAdapter, - IN u16 efuse_addr, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - u8 ret=0; - - ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest); - - return ret; -} - -static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value) -{ - return efuse_OneByteRead(padapter,address, value, _FALSE); -} - -static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value) -{ - return efuse_OneByteWrite(padapter,address, *value, _FALSE); -} - -/* - * read/wirte raw efuse data - */ -u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data) -{ - int i = 0; - u16 real_content_len = 0, max_available_size = 0; - u8 res = _FAIL ; - u8 (*rw8)(PADAPTER, u16, u8*); - - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE); - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - - if (start_addr > real_content_len) - return _FAIL; - - if (_TRUE == bWrite) { - if ((start_addr + cnts) > max_available_size) - return _FAIL; - rw8 = &efuse_write8; - } else - rw8 = &efuse_read8; - - Efuse_PowerSwitch(padapter, bWrite, _TRUE); - - // e-fuse one byte read / write - for (i = 0; i < cnts; i++) { - if (start_addr >= real_content_len) { - res = _FAIL; - break; - } - - res = rw8(padapter, start_addr++, data++); - if (_FAIL == res) break; - } - - Efuse_PowerSwitch(padapter, bWrite, _FALSE); - - return res; -} -//------------------------------------------------------------------------------ -u16 efuse_GetMaxSize(PADAPTER padapter) -{ - u16 max_size; - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); - return max_size; -} -//------------------------------------------------------------------------------ -u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size) -{ - Efuse_PowerSwitch(padapter, _FALSE, _TRUE); - *size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE); - Efuse_PowerSwitch(padapter, _FALSE, _FALSE); - - return _SUCCESS; -} -//------------------------------------------------------------------------------ -u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) -{ - u16 mapLen=0; - - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); - - if ((addr + cnts) > mapLen) - return _FAIL; - - Efuse_PowerSwitch(padapter, _FALSE, _TRUE); - - efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE); - - Efuse_PowerSwitch(padapter, _FALSE, _FALSE); - - return _SUCCESS; -} -//------------------------------------------------------------------------------ -u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) -{ - u8 offset, word_en; - u8 *map; - u8 newdata[PGPKT_DATA_SIZE]; - s32 i, j, idx; - u8 ret = _SUCCESS; - u16 mapLen=0; - - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); - - if ((addr + cnts) > mapLen) - return _FAIL; - - map = rtw_zmalloc(mapLen); - if(map == NULL){ - return _FAIL; - } - - ret = rtw_efuse_map_read(padapter, 0, mapLen, map); - if (ret == _FAIL) goto exit; - - Efuse_PowerSwitch(padapter, _TRUE, _TRUE); - - offset = (addr >> 3); - word_en = 0xF; - _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE); - i = addr & 0x7; // index of one package - j = 0; // index of new package - idx = 0; // data index - - if (i & 0x1) { - // odd start - if (data[idx] != map[addr+idx]) { - word_en &= ~BIT(i >> 1); - newdata[i-1] = map[addr+idx-1]; - newdata[i] = data[idx]; - } - i++; - idx++; - } - do { - for (; i < PGPKT_DATA_SIZE; i += 2) - { - if (cnts == idx) break; - if ((cnts - idx) == 1) { - if (data[idx] != map[addr+idx]) { - word_en &= ~BIT(i >> 1); - newdata[i] = data[idx]; - newdata[i+1] = map[addr+idx+1]; - } - idx++; - break; - } else { - if ((data[idx] != map[addr+idx]) || - (data[idx+1] != map[addr+idx+1])) - { - word_en &= ~BIT(i >> 1); - newdata[i] = data[idx]; - newdata[i+1] = data[idx + 1]; - } - idx += 2; - } - if (idx == cnts) break; - } - - if (word_en != 0xF) { - ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE); - DBG_8192C("offset=%x \n",offset); - DBG_8192C("word_en=%x \n",word_en); - - for(i=0;iefuse_eeprom_data[Offset]; - -} // EFUSE_ShadowRead1Byte - -//---------------Read Two Bytes -static VOID -efuse_ShadowRead2Byte( - IN PADAPTER pAdapter, - IN u16 Offset, - IN OUT u16 *Value) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - - *Value = pEEPROM->efuse_eeprom_data[Offset]; - *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; - -} // EFUSE_ShadowRead2Byte - -//---------------Read Four Bytes -static VOID -efuse_ShadowRead4Byte( - IN PADAPTER pAdapter, - IN u16 Offset, - IN OUT u32 *Value) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - - *Value = pEEPROM->efuse_eeprom_data[Offset]; - *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; - *Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16; - *Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24; - -} // efuse_ShadowRead4Byte - - -/*----------------------------------------------------------------------------- - * Function: efuse_ShadowWrite1Byte - * efuse_ShadowWrite2Byte - * efuse_ShadowWrite4Byte - * - * Overview: Write efuse modify map by one/two/four byte. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/12/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -static VOID -efuse_ShadowWrite1Byte( - IN PADAPTER pAdapter, - IN u16 Offset, - IN u8 Value) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - - pEEPROM->efuse_eeprom_data[Offset] = Value; - -} // efuse_ShadowWrite1Byte - -//---------------Write Two Bytes -static VOID -efuse_ShadowWrite2Byte( - IN PADAPTER pAdapter, - IN u16 Offset, - IN u16 Value) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - - pEEPROM->efuse_eeprom_data[Offset] = Value&0x00FF; - pEEPROM->efuse_eeprom_data[Offset+1] = Value>>8; - -} // efuse_ShadowWrite1Byte - -//---------------Write Four Bytes -static VOID -efuse_ShadowWrite4Byte( - IN PADAPTER pAdapter, - IN u16 Offset, - IN u32 Value) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - - pEEPROM->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF); - pEEPROM->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF); - pEEPROM->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF); - pEEPROM->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF); - -} // efuse_ShadowWrite1Byte - -/*----------------------------------------------------------------------------- - * Function: EFUSE_ShadowMapUpdate - * - * Overview: Transfer current EFUSE content to shadow init and modify map. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/13/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -void EFUSE_ShadowMapUpdate( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN BOOLEAN bPseudoTest) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - u16 mapLen=0; - - EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); - - if (pEEPROM->bautoload_fail_flag == _TRUE) - { - _rtw_memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen); - } - else - { - #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - if(0 != retriveAdaptorInfoFile(pEEPROM, pAdapter->registrypriv.adaptor_info_caching_file_path)) { - #endif - - Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest); - - #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - storeAdaptorInfoFile(pEEPROM, pAdapter->registrypriv.adaptor_info_caching_file_path); - } - #endif - } - - //PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], - //(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); -}// EFUSE_ShadowMapUpdate - - -/*----------------------------------------------------------------------------- - * Function: EFUSE_ShadowRead - * - * Overview: Read from efuse init map !!!!! - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/12/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -void -EFUSE_ShadowRead( - IN PADAPTER pAdapter, - IN u8 Type, - IN u16 Offset, - IN OUT u32 *Value ) -{ - if (Type == 1) - efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value); - else if (Type == 2) - efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value); - else if (Type == 4) - efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value); - -} // EFUSE_ShadowRead - -/*----------------------------------------------------------------------------- - * Function: EFUSE_ShadowWrite - * - * Overview: Write efuse modify map for later update operation to use!!!!! - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/12/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -extern VOID -EFUSE_ShadowWrite( - IN PADAPTER pAdapter, - IN u8 Type, - IN u16 Offset, - IN OUT u32 Value) -{ -#if (MP_DRIVER == 0) - return; -#endif - - if (Type == 1) - efuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value); - else if (Type == 2) - efuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value); - else if (Type == 4) - efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value); - -} // EFUSE_ShadowWrite - -VOID -Efuse_InitSomeVar( - IN PADAPTER pAdapter - ) -{ - u8 i; - - _rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE); - _rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN); - _rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN); - - for(i=0; i -#include -#include -#include -#include -#include -#include - -/* -Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. -No irqsave is necessary. -*/ - -sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv) -{ - sint res=_SUCCESS; - -_func_enter_; - - _rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0); - //_rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0); - _rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0); - - - _rtw_init_queue(&(pcmdpriv->cmd_queue)); - - //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf - - pcmdpriv->cmd_seq = 1; - - pcmdpriv->cmd_allocated_buf = rtw_zmalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ); - - if (pcmdpriv->cmd_allocated_buf == NULL){ - res= _FAIL; - goto exit; - } - - //pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ( (SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ-1)); - pcmdpriv->cmd_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pcmdpriv->cmd_allocated_buf ), CMDBUFF_ALIGN_SZ); - - pcmdpriv->rsp_allocated_buf = rtw_zmalloc(MAX_RSPSZ + 4); - - if (pcmdpriv->rsp_allocated_buf == NULL){ - res= _FAIL; - goto exit; - } - - //pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ( (SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3); - pcmdpriv->rsp_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pcmdpriv->rsp_allocated_buf ), 4); - - pcmdpriv->cmd_issued_cnt = pcmdpriv->cmd_done_cnt = pcmdpriv->rsp_cnt = 0; - -exit: - -_func_exit_; - - return res; - -} - - -sint _rtw_init_evt_priv(struct evt_priv *pevtpriv) -{ - sint res=_SUCCESS; - -_func_enter_; - -#ifdef CONFIG_H2CLBK - _rtw_init_sema(&(pevtpriv->lbkevt_done), 0); - pevtpriv->lbkevt_limit = 0; - pevtpriv->lbkevt_num = 0; - pevtpriv->cmdevt_parm = NULL; -#endif - - //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf - ATOMIC_SET(&pevtpriv->event_seq, 0); - pevtpriv->evt_done_cnt = 0; - -#ifdef CONFIG_EVENT_THREAD_MODE - - _rtw_init_sema(&(pevtpriv->evt_notify), 0); - _rtw_init_sema(&(pevtpriv->terminate_evtthread_sema), 0); - - pevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4); - if (pevtpriv->evt_allocated_buf == NULL){ - res= _FAIL; - goto exit; - } - //pevtpriv->evt_buf = pevtpriv->evt_allocated_buf + 4 - ((unsigned int)(pevtpriv->evt_allocated_buf) & 3); - pevtpriv->evt_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pevtpriv->evt_allocated_buf ), 4); - - -#ifdef CONFIG_SDIO_HCI - pevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ +4); - - if (pevtpriv->allocated_c2h_mem == NULL){ - res= _FAIL; - goto exit; - } - - //pevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem + 4 - //- ( (u32)(pevtpriv->allocated_c2h_mem) & 3); - pevtpriv->c2h_mem = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pevtpriv->allocated_c2h_mem ), 4); - -#ifdef PLATFORM_OS_XP - pevtpriv->pc2h_mdl= IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL); - - if(pevtpriv->pc2h_mdl == NULL){ - res= _FAIL; - goto exit; - } - MmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl); -#endif -#endif //end of CONFIG_SDIO_HCI - - _rtw_init_queue(&(pevtpriv->evt_queue)); - -exit: - -#endif //end of CONFIG_EVENT_THREAD_MODE - -_func_exit_; - - return res; -} - -void _rtw_free_evt_priv (struct evt_priv *pevtpriv) -{ -_func_enter_; - - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("+_rtw_free_evt_priv \n")); - -#ifdef CONFIG_EVENT_THREAD_MODE - _rtw_free_sema(&(pevtpriv->evt_notify)); - _rtw_free_sema(&(pevtpriv->terminate_evtthread_sema)); - - - if (pevtpriv->evt_allocated_buf) - rtw_mfree(pevtpriv->evt_allocated_buf, MAX_EVTSZ + 4); -#endif - - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("-_rtw_free_evt_priv \n")); - -_func_exit_; - -} - -void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) -{ -_func_enter_; - - if(pcmdpriv){ - _rtw_spinlock_free(&(pcmdpriv->cmd_queue.lock)); - _rtw_free_sema(&(pcmdpriv->cmd_queue_sema)); - //_rtw_free_sema(&(pcmdpriv->cmd_done_sema)); - _rtw_free_sema(&(pcmdpriv->terminate_cmdthread_sema)); - - if (pcmdpriv->cmd_allocated_buf) - rtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ); - - if (pcmdpriv->rsp_allocated_buf) - rtw_mfree(pcmdpriv->rsp_allocated_buf, MAX_RSPSZ + 4); - } -_func_exit_; -} - -/* -Calling Context: - -rtw_enqueue_cmd can only be called between kernel thread, -since only spin_lock is used. - -ISR/Call-Back functions can't call this sub-function. - -*/ - -sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj) -{ - _irqL irqL; - -_func_enter_; - - if (obj == NULL) - goto exit; - - _enter_critical_bh(&queue->lock, &irqL); - - rtw_list_insert_tail(&obj->list, &queue->queue); - - _exit_critical_bh(&queue->lock, &irqL); - -exit: - -_func_exit_; - - return _SUCCESS; -} - -struct cmd_obj *_rtw_dequeue_cmd(_queue *queue) -{ - _irqL irqL; - struct cmd_obj *obj; - -_func_enter_; - - _enter_critical_bh(&(queue->lock), &irqL); - - if (rtw_is_list_empty(&(queue->queue))) - obj = NULL; - else - { - obj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list); - rtw_list_delete(&obj->list); - } - - _exit_critical_bh(&(queue->lock), &irqL); - -_func_exit_; - - return obj; -} - -u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) -{ - u32 res; -_func_enter_; - res = _rtw_init_cmd_priv (pcmdpriv); -_func_exit_; - return res; -} - -u32 rtw_init_evt_priv (struct evt_priv *pevtpriv) -{ - int res; -_func_enter_; - res = _rtw_init_evt_priv(pevtpriv); -_func_exit_; - return res; -} - -void rtw_free_evt_priv (struct evt_priv *pevtpriv) -{ -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_evt_priv\n")); - _rtw_free_evt_priv(pevtpriv); -_func_exit_; -} - -void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) -{ -_func_enter_; - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_cmd_priv\n")); - _rtw_free_cmd_priv(pcmdpriv); -_func_exit_; -} - -int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) -{ - u8 bAllow = _FALSE; //set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE - - #ifdef SUPPORT_HW_RFOFF_DETECTED - //To decide allow or not - if( (pcmdpriv->padapter->pwrctrlpriv.bHWPwrPindetect) - &&(!pcmdpriv->padapter->registrypriv.usbss_enable) - ) - { - if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) ) - { - struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; - if(pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID) - { - //DBG_8192C("==>enqueue POWER_SAVING_CTRL_WK_CID\n"); - bAllow = _TRUE; - } - } - } -#endif - - if( (pcmdpriv->padapter->hw_init_completed==_FALSE && bAllow == _FALSE) - || pcmdpriv->cmdthd_running== _FALSE //com_thread not running - ) - { - //DBG_871X("%s: hw_init_completed:%u, cmdthd_running:%u\n", __FUNCTION__, - // pcmdpriv->padapter->hw_init_completed, - // pcmdpriv->cmdthd_running - //); - return _FAIL; - } - return _SUCCESS; -} - - - -u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) -{ - int res = _FAIL; - -_func_enter_; - - if (cmd_obj == NULL) { - goto exit; - } - - if( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) { - rtw_free_cmd_obj(cmd_obj); - goto exit; - } - - res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj); - - if(res == _SUCCESS) - _rtw_up_sema(&pcmdpriv->cmd_queue_sema); - -exit: - -_func_exit_; - - return res; -} - -struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv) -{ - struct cmd_obj *cmd_obj; - -_func_enter_; - - cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue); - -_func_exit_; - return cmd_obj; -} - -void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv) -{ -_func_enter_; - pcmdpriv->cmd_done_cnt++; - //_rtw_up_sema(&(pcmdpriv->cmd_done_sema)); -_func_exit_; -} - -void rtw_free_cmd_obj(struct cmd_obj *pcmd) -{ -_func_enter_; - - if((pcmd->cmdcode!=_JoinBss_CMD_) &&(pcmd->cmdcode!= _CreateBss_CMD_)) - { - //free parmbuf in cmd_obj - rtw_mfree((unsigned char*)pcmd->parmbuf, pcmd->cmdsz); - } - - if(pcmd->rsp!=NULL) - { - if(pcmd->rspsz!= 0) - { - //free rsp in cmd_obj - rtw_mfree((unsigned char*)pcmd->rsp, pcmd->rspsz); - } - } - - //free cmd_obj - rtw_mfree((unsigned char*)pcmd, sizeof(struct cmd_obj)); - -_func_exit_; -} - - -thread_return rtw_cmd_thread(thread_context context) -{ - u8 ret; - struct cmd_obj *pcmd; - u8 *pcmdbuf, *prspbuf; - u8 (*cmd_hdl)(_adapter *padapter, u8* pbuf); - void (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd); - _adapter *padapter = (_adapter *)context; - struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); - -_func_enter_; - - thread_enter(padapter); - - pcmdbuf = pcmdpriv->cmd_buf; - prspbuf = pcmdpriv->rsp_buf; - - pcmdpriv->cmdthd_running=_TRUE; - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n")); - - while(1) - { - if ((_rtw_down_sema(&(pcmdpriv->cmd_queue_sema))) == _FAIL) - break; - - if (rtw_register_cmd_alive(padapter) != _SUCCESS) - { - continue; - } - -_next: - if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) - { - //DBG_8192C("###> rtw_cmd_thread break.................\n"); - RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("rtw_cmd_thread:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - break; - } - - if(!(pcmd = rtw_dequeue_cmd(pcmdpriv))) { - rtw_unregister_cmd_alive(padapter); - continue; - } - - if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) ) { - rtw_free_cmd_obj(pcmd); - continue; - } - - pcmdpriv->cmd_issued_cnt++; - - pcmd->cmdsz = _RND4((pcmd->cmdsz));//_RND4 - - _rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz); - - if(pcmd->cmdcode <= (sizeof(wlancmds) /sizeof(struct cmd_hdl))) - { - cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns; - - if (cmd_hdl) - { - ret = cmd_hdl(padapter, pcmdbuf); - pcmd->res = ret; - } - - //invoke cmd->callback function - pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback; - if(pcmd_callback == NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("mlme_cmd_hdl(): pcmd_callback=0x%p, cmdcode=0x%x\n", pcmd_callback, pcmd->cmdcode)); - rtw_free_cmd_obj(pcmd); - } - else - { - //todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL) - - pcmd_callback(padapter, pcmd);//need conider that free cmd_obj in rtw_cmd_callback - } - - pcmdpriv->cmd_seq++; - } - - cmd_hdl = NULL; - - flush_signals_thread(); - - goto _next; - - } - pcmdpriv->cmdthd_running=_FALSE; - - - // free all cmd_obj resources - do{ - pcmd = rtw_dequeue_cmd(pcmdpriv); - if(pcmd==NULL) - break; - - rtw_free_cmd_obj(pcmd); - }while(1); - - _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema); - -_func_exit_; - - thread_exit(); - -} - - -#ifdef CONFIG_EVENT_THREAD_MODE -u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj) -{ - _irqL irqL; - int res; - _queue *queue = &pevtpriv->evt_queue; - -_func_enter_; - - res = _SUCCESS; - - if (obj == NULL) { - res = _FAIL; - goto exit; - } - - _enter_critical_bh(&queue->lock, &irqL); - - rtw_list_insert_tail(&obj->list, &queue->queue); - - _exit_critical_bh(&queue->lock, &irqL); - - //rtw_evt_notify_isr(pevtpriv); - -exit: - -_func_exit_; - - return res; -} - -struct evt_obj *rtw_dequeue_evt(_queue *queue) -{ - _irqL irqL; - struct evt_obj *pevtobj; - -_func_enter_; - - _enter_critical_bh(&queue->lock, &irqL); - - if (rtw_is_list_empty(&(queue->queue))) - pevtobj = NULL; - else - { - pevtobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct evt_obj, list); - rtw_list_delete(&pevtobj->list); - } - - _exit_critical_bh(&queue->lock, &irqL); - -_func_exit_; - - return pevtobj; -} - -void rtw_free_evt_obj(struct evt_obj *pevtobj) -{ -_func_enter_; - - if(pevtobj->parmbuf) - rtw_mfree((unsigned char*)pevtobj->parmbuf, pevtobj->evtsz); - - rtw_mfree((unsigned char*)pevtobj, sizeof(struct evt_obj)); - -_func_exit_; -} - -void rtw_evt_notify_isr(struct evt_priv *pevtpriv) -{ -_func_enter_; - pevtpriv->evt_done_cnt++; - _rtw_up_sema(&(pevtpriv->evt_notify)); -_func_exit_; -} -#endif - - -/* -u8 rtw_setstandby_cmd(unsigned char *adapter) -*/ -u8 rtw_setstandby_cmd(_adapter *padapter, uint action) -{ - struct cmd_obj* ph2c; - struct usb_suspend_parm* psetusbsuspend; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - - u8 ret = _SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if (ph2c == NULL) { - ret = _FAIL; - goto exit; - } - - psetusbsuspend = (struct usb_suspend_parm*)rtw_zmalloc(sizeof(struct usb_suspend_parm)); - if (psetusbsuspend == NULL) { - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - ret = _FAIL; - goto exit; - } - - psetusbsuspend->action = action; - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend)); - - ret = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return ret; -} - -/* -rtw_sitesurvey_cmd(~) - ### NOTE:#### (!!!!) - MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock -*/ -u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *pssid) -{ - u8 res = _FAIL; - struct cmd_obj *ph2c; - struct sitesurvey_parm *psurveyPara; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); -#endif //CONFIG_P2P - -_func_enter_; - -#ifdef CONFIG_LPS - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){ - rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1); - } -#endif - -#ifdef CONFIG_P2P - p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1); -#endif //CONFIG_P2P - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if (ph2c == NULL) - return _FAIL; - - psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm)); - if (psurveyPara == NULL) { - rtw_mfree((unsigned char*) ph2c, sizeof(struct cmd_obj)); - return _FAIL; - } - - rtw_free_network_queue(padapter, _FALSE); - - RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("\nflush network queue\n\n")); - - init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); - - psurveyPara->bsslimit = cpu_to_le32(48); - psurveyPara->scan_mode = cpu_to_le32(pmlmepriv->scan_mode); - psurveyPara->ss_ssidlen= cpu_to_le32(0);// pssid->SsidLength; - _rtw_memset(psurveyPara->ss_ssid, 0, IW_ESSID_MAX_SIZE + 1); - if ((pssid != NULL) && (pssid->SsidLength)) { - _rtw_memcpy(psurveyPara->ss_ssid, pssid->Ssid, pssid->SsidLength); - psurveyPara->ss_ssidlen = cpu_to_le32(pssid->SsidLength); - } - - set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - - if(res == _SUCCESS) { - - pmlmepriv->scan_start_time = rtw_get_current_time(); - - _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT); - - rtw_led_control(padapter, LED_CTL_SITE_SURVEY); - - pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec - } else { - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - } - -_func_exit_; - - return res; -} - -u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset) -{ - struct cmd_obj* ph2c; - struct setdatarate_parm* pbsetdataratepara; - struct cmd_priv* pcmdpriv = &padapter->cmdpriv; - u8 res = _SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if (ph2c == NULL) { - res = _FAIL; - goto exit; - } - - pbsetdataratepara = (struct setdatarate_parm*)rtw_zmalloc(sizeof(struct setdatarate_parm)); - if (pbsetdataratepara == NULL) { - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res = _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate)); -#ifdef MP_FIRMWARE_OFFLOAD - pbsetdataratepara->curr_rateidx = *(u32*)rateset; -// _rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32)); -#else - pbsetdataratepara->mac_id = 5; - _rtw_memcpy(pbsetdataratepara->datarates, rateset, NumRates); -#endif - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: - -_func_exit_; - - return res; -} - -u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset) -{ - struct cmd_obj* ph2c; - struct setbasicrate_parm* pssetbasicratepara; - struct cmd_priv* pcmdpriv=&padapter->cmdpriv; - u8 res = _SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if (ph2c == NULL) { - res= _FAIL; - goto exit; - } - pssetbasicratepara = (struct setbasicrate_parm*)rtw_zmalloc(sizeof(struct setbasicrate_parm)); - - if (pssetbasicratepara == NULL) { - rtw_mfree((u8*) ph2c, sizeof(struct cmd_obj)); - res = _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_); - - _rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: - -_func_exit_; - - return res; -} - - -/* -unsigned char rtw_setphy_cmd(unsigned char *adapter) - -1. be called only after rtw_update_registrypriv_dev_network( ~) or mp testing program -2. for AdHoc/Ap mode or mp mode? - -*/ -u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch) -{ - struct cmd_obj* ph2c; - struct setphy_parm* psetphypara; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; -// struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -// struct registry_priv* pregistry_priv = &padapter->registrypriv; - u8 res=_SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - psetphypara = (struct setphy_parm*)rtw_zmalloc(sizeof(struct setphy_parm)); - - if(psetphypara==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_); - - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("CH=%d, modem=%d", ch, modem)); - - psetphypara->modem = modem; - psetphypara->rfchannel = ch; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; - return res; -} - -u8 rtw_setbbreg_cmd(_adapter*padapter, u8 offset, u8 val) -{ - struct cmd_obj* ph2c; - struct writeBB_parm* pwritebbparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - pwritebbparm = (struct writeBB_parm*)rtw_zmalloc(sizeof(struct writeBB_parm)); - - if(pwritebbparm==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg)); - - pwritebbparm->offset = offset; - pwritebbparm->value = val; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; - return res; -} - -u8 rtw_getbbreg_cmd(_adapter *padapter, u8 offset, u8 *pval) -{ - struct cmd_obj* ph2c; - struct readBB_parm* prdbbparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res=_FAIL; - goto exit; - } - prdbbparm = (struct readBB_parm*)rtw_zmalloc(sizeof(struct readBB_parm)); - - if(prdbbparm ==NULL){ - rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); - return _FAIL; - } - - _rtw_init_listhead(&ph2c->list); - ph2c->cmdcode =GEN_CMD_CODE(_GetBBReg); - ph2c->parmbuf = (unsigned char *)prdbbparm; - ph2c->cmdsz = sizeof(struct readBB_parm); - ph2c->rsp = pval; - ph2c->rspsz = sizeof(struct readBB_rsp); - - prdbbparm ->offset = offset; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; - return res; -} - -u8 rtw_setrfreg_cmd(_adapter *padapter, u8 offset, u32 val) -{ - struct cmd_obj* ph2c; - struct writeRF_parm* pwriterfparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - pwriterfparm = (struct writeRF_parm*)rtw_zmalloc(sizeof(struct writeRF_parm)); - - if(pwriterfparm==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg)); - - pwriterfparm->offset = offset; - pwriterfparm->value = val; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; - return res; -} - -u8 rtw_getrfreg_cmd(_adapter *padapter, u8 offset, u8 *pval) -{ - struct cmd_obj* ph2c; - struct readRF_parm* prdrfparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - prdrfparm = (struct readRF_parm*)rtw_zmalloc(sizeof(struct readRF_parm)); - if(prdrfparm ==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_init_listhead(&ph2c->list); - ph2c->cmdcode =GEN_CMD_CODE(_GetRFReg); - ph2c->parmbuf = (unsigned char *)prdrfparm; - ph2c->cmdsz = sizeof(struct readRF_parm); - ph2c->rsp = pval; - ph2c->rspsz = sizeof(struct readRF_rsp); - - prdrfparm ->offset = offset; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return res; -} - -void rtw_getbbrfreg_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) -{ - _func_enter_; - - //rtw_free_cmd_obj(pcmd); - rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); - rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); - -#ifdef CONFIG_MP_INCLUDED - padapter->mppriv.workparam.bcompleted= _TRUE; -#endif -_func_exit_; -} - -void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) -{ - _func_enter_; - - rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); - rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); - -#ifdef CONFIG_MP_INCLUDED - padapter->mppriv.workparam.bcompleted= _TRUE; -#endif - -_func_exit_; -} - -u8 rtw_createbss_cmd(_adapter *padapter) -{ - struct cmd_obj* pcmd; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network; - u8 res=_SUCCESS; - -_func_enter_; - - rtw_led_control(padapter, LED_CTL_START_TO_LINK); - - if (pmlmepriv->assoc_ssid.SsidLength == 0){ - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for Any SSid:%s\n",pmlmepriv->assoc_ssid.Ssid)); - } else { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); - } - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; - goto exit; - } - - _rtw_init_listhead(&pcmd->list); - pcmd->cmdcode = _CreateBss_CMD_; - pcmd->parmbuf = (unsigned char *)pdev_network; - pcmd->cmdsz = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX*)pdev_network); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - pdev_network->Length = pcmd->cmdsz; - -#ifdef CONFIG_RTL8712 - //notes: translate IELength & Length after assign the Length to cmdsz; - pdev_network->Length = cpu_to_le32(pcmd->cmdsz); - pdev_network->IELength = cpu_to_le32(pdev_network->IELength); - pdev_network->Ssid.SsidLength = cpu_to_le32(pdev_network->Ssid.SsidLength); -#endif - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - -_func_exit_; - - return res; -} - -u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz) -{ - struct cmd_obj* pcmd; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; - goto exit; - } - - _rtw_init_listhead(&pcmd->list); - pcmd->cmdcode = GEN_CMD_CODE(_CreateBss); - pcmd->parmbuf = pbss; - pcmd->cmdsz = sz; - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - -_func_exit_; - - return res; -} - -u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork) -{ - u8 *auth, res = _SUCCESS; - uint t_len = 0; - WLAN_BSSID_EX *psecnetwork; - struct cmd_obj *pcmd; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode; - -_func_enter_; - - rtw_led_control(padapter, LED_CTL_START_TO_LINK); - - if (pmlmepriv->assoc_ssid.SsidLength == 0){ - RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("+Join cmd: Any SSid\n")); - } else { - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+Join cmd: SSid=[%s]\n", pmlmepriv->assoc_ssid.Ssid)); - } - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res=_FAIL; - RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd: memory allocate for cmd_obj fail!!!\n")); - goto exit; - } - /* // for IEs is pointer - t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + - sizeof (NDIS_802_11_SSID) + sizeof (ULONG) + - sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + - sizeof (NDIS_802_11_CONFIGURATION) + - sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + - sizeof (NDIS_802_11_RATES_EX)+ sizeof(WLAN_PHY_INFO)+ sizeof (ULONG) + MAX_IE_SZ; - */ - //for IEs is fix buf size - t_len = sizeof(WLAN_BSSID_EX); - - - //for hidden ap to set fw_state here - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != _TRUE) - { - switch(ndis_network_mode) - { - case Ndis802_11IBSS: - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - break; - - case Ndis802_11Infrastructure: - set_fwstate(pmlmepriv, WIFI_STATION_STATE); - break; - - case Ndis802_11APMode: - case Ndis802_11AutoUnknown: - case Ndis802_11InfrastructureMax: - break; - - } - } - - psecnetwork=(WLAN_BSSID_EX *)&psecuritypriv->sec_bss; - if(psecnetwork==NULL) - { - if(pcmd !=NULL) - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - - res=_FAIL; - - RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd :psecnetwork==NULL!!!\n")); - - goto exit; - } - - _rtw_memset(psecnetwork, 0, t_len); - - _rtw_memcpy(psecnetwork, &pnetwork->network, get_WLAN_BSSID_EX_sz(&pnetwork->network)); - - auth=&psecuritypriv->authenticator_ie[0]; - psecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength; - - if((psecnetwork->IELength-12) < (256-1)) { - _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12); - } else { - _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1)); - } - - psecnetwork->IELength = 0; - // Added by Albert 2009/02/18 - // If the the driver wants to use the bssid to create the connection. - // If not, we have to copy the connecting AP's MAC address to it so that - // the driver just has the bssid information for PMKIDList searching. - - if ( pmlmepriv->assoc_by_bssid == _FALSE ) - { - _rtw_memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN ); - } - - psecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength); - - - pqospriv->qos_option = 0; - - if(pregistrypriv->wmm_enable) - { - u32 tmp_len; - - tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength); - - if (psecnetwork->IELength != tmp_len) - { - psecnetwork->IELength = tmp_len; - pqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon - } - else - { - pqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon - } - } - -#ifdef CONFIG_80211N_HT - phtpriv->ht_option = _FALSE; - if(pregistrypriv->ht_enable) - { - // Added by Albert 2010/06/23 - // For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. - // Especially for Realtek 8192u SoftAP. - if ( ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_ ) && - ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_ ) && - ( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ )) - { - //rtw_restructure_ht_ie - rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], - pnetwork->network.IELength, &psecnetwork->IELength); - } - } - -#endif - - psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength; - - if(psecnetwork->IELength < (256-1)) - { - _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength); - } - else - { - _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1)); - } - - pcmd->cmdsz = get_WLAN_BSSID_EX_sz(psecnetwork);//get cmdsz before endian conversion - -#ifdef CONFIG_RTL8712 - //wlan_network endian conversion - psecnetwork->Length = cpu_to_le32(psecnetwork->Length); - psecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength); - psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy); - psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi); - psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse); - psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow); - psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod); - psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig); - psecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime); - psecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern); - psecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet); - psecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length); - psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length); - psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode); - psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength); -#endif - - _rtw_init_listhead(&pcmd->list); - pcmd->cmdcode = _JoinBss_CMD_;//GEN_CMD_CODE(_JoinBss) - pcmd->parmbuf = (unsigned char *)psecnetwork; - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - -_func_exit_; - - return res; -} - -u8 rtw_disassoc_cmd(_adapter*padapter) // for sta_mode -{ - struct cmd_obj* pdisconnect_cmd; - struct disconnect_parm* pdisconnect; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - - u8 res=_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_disassoc_cmd\n")); - - //if ((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) { - - pdisconnect_cmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pdisconnect_cmd == NULL){ - res=_FAIL; - goto exit; - } - - pdisconnect = (struct disconnect_parm*)rtw_zmalloc(sizeof(struct disconnect_parm)); - if(pdisconnect == NULL) { - rtw_mfree((u8 *)pdisconnect_cmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(pdisconnect_cmd, pdisconnect, _DisConnect_CMD_); - res = rtw_enqueue_cmd(pcmdpriv, pdisconnect_cmd); - //} - -exit: - -_func_exit_; - - return res; -} - -u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) -{ - struct cmd_obj* ph2c; - struct setopmode_parm* psetop; - - struct cmd_priv *pcmdpriv= &padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FALSE; - goto exit; - } - psetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm)); - - if(psetop==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FALSE; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_); - psetop->mode = (u8)networktype; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return res; -} - -u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key) -{ - struct cmd_obj* ph2c; - struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - struct set_stakey_rsp *psetstakey_rsp = NULL; - - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct sta_info* sta = (struct sta_info* )psta; - u8 res=_SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if ( ph2c == NULL){ - res= _FAIL; - goto exit; - } - - psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); - if(psetstakey_para==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; - goto exit; - } - - psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); - if(psetstakey_rsp == NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); - res=_FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - ph2c->rsp = (u8 *) psetstakey_rsp; - ph2c->rspsz = sizeof(struct set_stakey_rsp); - - _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN); - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){ -#ifdef CONFIG_TDLS - if((sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) - psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy; - else -#endif - psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm; - }else{ - GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE); - } - - if (unicast_key == _TRUE) { -#ifdef CONFIG_TDLS - if((sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) - _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16); - else -#endif - _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); - } else { - _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); - } - - //jeff: set this becasue at least sw key is ready - padapter->securitypriv.busetkipkey=_TRUE; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return res; -} - -u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table) -{ - struct cmd_obj* ph2c; - struct setratable_parm * psetrttblparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - psetrttblparm = (struct setratable_parm*)rtw_zmalloc(sizeof(struct setratable_parm)); - - if(psetrttblparm==NULL){ - rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); - - _rtw_memcpy(psetrttblparm,prate_table,sizeof(struct setratable_parm)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; - return res; - -} - -u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval) -{ - struct cmd_obj* ph2c; - struct getratable_parm * pgetrttblparm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - pgetrttblparm = (struct getratable_parm*)rtw_zmalloc(sizeof(struct getratable_parm)); - - if(pgetrttblparm==NULL){ - rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - -// init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); - - _rtw_init_listhead(&ph2c->list); - ph2c->cmdcode =GEN_CMD_CODE(_GetRaTable); - ph2c->parmbuf = (unsigned char *)pgetrttblparm; - ph2c->cmdsz = sizeof(struct getratable_parm); - ph2c->rsp = (u8*)pval; - ph2c->rspsz = sizeof(struct getratable_rsp); - - pgetrttblparm ->rsvd = 0x0; - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); -exit: -_func_exit_; - return res; - -} - -u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr) -{ - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - struct cmd_obj* ph2c; - struct set_assocsta_parm *psetassocsta_para; - struct set_stakey_rsp *psetassocsta_rsp = NULL; - - u8 res=_SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - psetassocsta_para = (struct set_assocsta_parm*)rtw_zmalloc(sizeof(struct set_assocsta_parm)); - if(psetassocsta_para==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - res=_FAIL; - goto exit; - } - - psetassocsta_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_assocsta_rsp)); - if(psetassocsta_rsp==NULL){ - rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); - rtw_mfree((u8 *) psetassocsta_para, sizeof(struct set_assocsta_parm)); - return _FAIL; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_); - ph2c->rsp = (u8 *) psetassocsta_rsp; - ph2c->rspsz = sizeof(struct set_assocsta_rsp); - - _rtw_memcpy(psetassocsta_para->addr, mac_addr,ETH_ALEN); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return res; - } - -u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr) -{ - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - struct cmd_obj* ph2c; - struct addBaReq_parm *paddbareq_parm; - - u8 res=_SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - paddbareq_parm = (struct addBaReq_parm*)rtw_zmalloc(sizeof(struct addBaReq_parm)); - if(paddbareq_parm==NULL){ - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - paddbareq_parm->tid = tid; - _rtw_memcpy(paddbareq_parm->addr, addr, ETH_ALEN); - - init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq)); - - //DBG_8192C("rtw_addbareq_cmd, tid=%d\n", tid); - - //rtw_enqueue_cmd(pcmdpriv, ph2c); - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return res; -} - -u8 rtw_dynamic_chk_wk_cmd(_adapter*padapter) -{ - struct cmd_obj* ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - u8 res=_SUCCESS; - -_func_enter_; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm->ec_id = DYNAMIC_CHK_WK_CID; - pdrvextra_cmd_parm->type_size = 0; - pdrvextra_cmd_parm->pbuf = NULL; - - init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - - //rtw_enqueue_cmd(pcmdpriv, ph2c); - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return res; - -} - -u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan) -{ - struct cmd_obj* pcmdobj; - struct SetChannelPlan_param *setChannelPlan_param; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - - u8 res=_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_chplan_cmd\n")); - - pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmdobj == NULL){ - res=_FAIL; - goto exit; - } - - setChannelPlan_param = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(struct SetChannelPlan_param)); - if(setChannelPlan_param == NULL) { - rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - setChannelPlan_param->channel_plan=chplan; - - init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelPlan_param, GEN_CMD_CODE(_SetChannelPlan)); - res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); - -exit: - -_func_exit_; - - return res; -} - -static void traffic_status_watchdog(_adapter *padapter) -{ -#ifdef CONFIG_LPS - u8 bEnterPS; -#endif - u8 bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE; - u8 bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - // - // Determine if our traffic is busy now - // - if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) - { - - if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 100 || - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 100 ) - { - bBusyTraffic = _TRUE; - - if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) - bRxBusyTraffic = _TRUE; - else if(pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > pmlmepriv->LinkDetectInfo.NumRxOkInPeriod) - bTxBusyTraffic = _TRUE; - } - - // Higher Tx/Rx data. - if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 || - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000 ) - { - bHigherBusyTraffic = _TRUE; - - // Extremely high Rx data. - if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 5000) - bHigherBusyRxTraffic = _TRUE; - else - bHigherBusyRxTraffic = _FALSE; - } - -#ifdef CONFIG_LPS - // check traffic for powersaving. - if( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) || - (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) ) - { - //DBG_8192C("Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); - bEnterPS= _FALSE; - } - else - { - bEnterPS= _TRUE; - } - - // LeisurePS only work in infra mode. - if(bEnterPS) - { - LPS_Enter(padapter); - } - else - { - LPS_Leave(padapter); - } -#endif - } - else - { -#ifdef CONFIG_LPS - LPS_Leave(padapter); -#endif - } - - pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0; - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0; - pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0; - pmlmepriv->LinkDetectInfo.bBusyTraffic = bBusyTraffic; - pmlmepriv->LinkDetectInfo.bTxBusyTraffic = bTxBusyTraffic; - pmlmepriv->LinkDetectInfo.bRxBusyTraffic = bRxBusyTraffic; - pmlmepriv->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic; - pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic; -} - -void dynamic_chk_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - //struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - if(padapter->HalFunc.sreset_xmit_status_check) - padapter->HalFunc.sreset_xmit_status_check(padapter); - #endif - - if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE) - { - //if(pmlmeext->linked_to > 0) - //{ - // pmlmeext->linked_to--; - // if(pmlmeext->linked_to==0) - linked_status_chk(padapter); - //} - - traffic_status_watchdog(padapter); - } - - padapter->HalFunc.hal_dm_watchdog(padapter); - - //check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); - -} - -#ifdef CONFIG_LPS -void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 mstatus; - -_func_enter_; - - if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) - || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) - { - return; - } - - switch(lps_ctrl_type) - { - case LPS_CTRL_SCAN: - //DBG_8192C("LPS_CTRL_SCAN \n"); - LeaveAllPowerSaveMode(padapter); - break; - case LPS_CTRL_JOINBSS: - //DBG_8192C("LPS_CTRL_JOINBSS \n"); - LPS_Leave(padapter); - break; - case LPS_CTRL_CONNECT: - //DBG_8192C("LPS_CTRL_CONNECT \n"); - mstatus = 1; - // Reset LPS Setting - padapter->pwrctrlpriv.LpsIdleCount = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); - break; - case LPS_CTRL_DISCONNECT: - //DBG_8192C("LPS_CTRL_DISCONNECT \n"); - mstatus = 0; - LPS_Leave(padapter); - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); - break; - case LPS_CTRL_SPECIAL_PACKET: - //DBG_8192C("LPS_CTRL_SPECIAL_PACKET \n"); - pwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time(); - LPS_Leave(padapter); - break; - - default: - break; - } - -_func_exit_; -} -#endif -u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue) -{ - struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - u8 res = _SUCCESS; - -_func_enter_; - - //if(!pwrctrlpriv->bLeisurePs) - // return res; - - if(enqueue) - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm->ec_id = LPS_CTRL_WK_CID; - pdrvextra_cmd_parm->type_size = lps_ctrl_type; - pdrvextra_cmd_parm->pbuf = NULL; - - init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else - { - lps_ctrl_wk_hdl(padapter, lps_ctrl_type); - } - -exit: - -_func_exit_; - - return res; - -} - - -#ifdef CONFIG_ANTENNA_DIVERSITY - -void antenna_select_wk_hdl(_adapter *padapter, u8 antenna) -{ - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); -} - -u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue) -{ - struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 bSupportAntDiv = _FALSE; - u8 res = _SUCCESS; - -_func_enter_; - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); - if(_FALSE == bSupportAntDiv ) return res; - - if(_TRUE == enqueue) - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm->ec_id = ANT_SELECT_WK_CID; - pdrvextra_cmd_parm->type_size = antenna; - pdrvextra_cmd_parm->pbuf = NULL; - init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else{ - antenna_select_wk_hdl(padapter,antenna ); - } -exit: - -_func_exit_; - - return res; - -} -#endif - -void power_saving_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) -{ - rtw_ps_processor(padapter); -} - -#ifdef CONFIG_P2P -u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ) -{ - struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res = _SUCCESS; - -_func_enter_; - - if ( pwdinfo->p2p_state == P2P_STATE_NONE ) - { - return res; - } - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID; - pdrvextra_cmd_parm->type_size = intCmdType; // As the command tppe. - pdrvextra_cmd_parm->pbuf = NULL; // Must be NULL here - - init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - -_func_exit_; - - return res; - -} -#endif //CONFIG_P2P - -u8 rtw_ps_cmd(_adapter*padapter) -{ - struct cmd_obj *ppscmd; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - - u8 res = _SUCCESS; -_func_enter_; - - ppscmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ppscmd==NULL){ - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ - rtw_mfree((unsigned char *)ppscmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm->ec_id = POWER_SAVING_CTRL_WK_CID; - pdrvextra_cmd_parm->pbuf = NULL; - DBG_8192C("==> %s , enqueue CMD \n",__FUNCTION__); - init_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - res = rtw_enqueue_cmd(pcmdpriv, ppscmd); - -exit: - -_func_exit_; - - return res; - -} - -#ifdef CONFIG_AP_MODE - -static void rtw_chk_hi_queue_hdl(_adapter *padapter) -{ - int cnt=0; - struct sta_info *psta_bmc; - struct sta_priv *pstapriv = &padapter->stapriv; - - psta_bmc = rtw_get_bcmc_stainfo(padapter); - if(!psta_bmc) - return; - - - if(psta_bmc->sleepq_len==0) - { - while((rtw_read32(padapter, 0x414)&0x00ffff00)!=0) - { - rtw_msleep_os(100); - - cnt++; - - if(cnt>10) - break; - } - - if(cnt<=10) - { - pstapriv->tim_bitmap &= ~BIT(0); - - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - } - } - -} - -u8 rtw_chk_hi_queue_cmd(_adapter*padapter) -{ - struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res = _SUCCESS; - - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm->ec_id = CHECK_HIQ_WK_CID; - pdrvextra_cmd_parm->type_size = 0; - pdrvextra_cmd_parm->pbuf = NULL; - - init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - -exit: - - return res; - -} -#endif - -u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) -{ - struct drvextra_cmd_parm *pdrvextra_cmd; - - if(!pbuf) - return H2C_PARAMETERS_ERROR; - - pdrvextra_cmd = (struct drvextra_cmd_parm*)pbuf; - - switch(pdrvextra_cmd->ec_id) - { - case DYNAMIC_CHK_WK_CID: - dynamic_chk_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); - break; - case POWER_SAVING_CTRL_WK_CID: - power_saving_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); - break; -#ifdef CONFIG_LPS - case LPS_CTRL_WK_CID: - lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type_size); - break; -#endif -#ifdef CONFIG_ANTENNA_DIVERSITY - case ANT_SELECT_WK_CID: - antenna_select_wk_hdl(padapter, pdrvextra_cmd->type_size); - break; -#endif -#ifdef CONFIG_P2P - case P2P_PS_WK_CID: - p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type_size); - break; - case P2P_PROTO_WK_CID: - // Commented by Albert 2011/07/01 - // I used the type_size as the type command - p2p_protocol_wk_hdl( padapter, pdrvextra_cmd->type_size ); - break; -#endif //CONFIG_P2P -#ifdef CONFIG_AP_MODE - case CHECK_HIQ_WK_CID: - rtw_chk_hi_queue_hdl(padapter); - break; -#endif //CONFIG_AP_MODE - default: - break; - - } - - - if(pdrvextra_cmd->pbuf && pdrvextra_cmd->type_size>0) - { - rtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); - } - - - return H2C_SUCCESS; - -} - -void rtw_survey_cmd_callback(_adapter* padapter , struct cmd_obj *pcmd) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -_func_enter_; - - if (pcmd->res != H2C_SUCCESS) { - clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY); - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nrtw_survey_cmd_callback : clr _FW_UNDER_SURVEY ")); - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: MgntActrtw_set_802_11_bssid_LIST_SCAN Fail ************\n\n.")); - } - - // free cmd - rtw_free_cmd_obj(pcmd); - -_func_exit_; -} -void rtw_disassoc_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -_func_enter_; - - if (pcmd->res != H2C_SUCCESS) - { - _enter_critical_bh(&pmlmepriv->lock, &irqL); - set_fwstate(pmlmepriv, _FW_LINKED); - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ***Error: disconnect_cmd_callback Fail ***\n.")); - - goto exit; - } - - // free cmd - rtw_free_cmd_obj(pcmd); - -exit: - -_func_exit_; -} - - -void rtw_joinbss_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -_func_enter_; - - if((pcmd->res != H2C_SUCCESS)) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("********Error:rtw_select_and_join_from_scanned_queue Wait Sema Fail ************\n")); - _set_timer(&pmlmepriv->assoc_timer, 1); - } - - rtw_free_cmd_obj(pcmd); - -_func_exit_; -} - -void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd) -{ - _irqL irqL; - u8 timer_cancelled; - struct sta_info *psta = NULL; - struct wlan_network *pwlan = NULL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)pcmd->parmbuf; - struct wlan_network *tgt_network = &(pmlmepriv->cur_network); - -_func_enter_; - - if((pcmd->res != H2C_SUCCESS)) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: rtw_createbss_cmd_callback Fail ************\n\n.")); - _set_timer(&pmlmepriv->assoc_timer, 1 ); - } - - _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); - - //endian_convert - pnetwork->Length = le32_to_cpu(pnetwork->Length); - pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); - pnetwork->Privacy =le32_to_cpu(pnetwork->Privacy); - pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); - pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); - pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); - //pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); - pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); - pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); - pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); - pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); - pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); - pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); - pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); - pnetwork->IELength = le32_to_cpu(pnetwork->IELength); - - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) ) - { - psta = rtw_get_stainfo(&padapter->stapriv, pnetwork->MacAddress); - if(!psta) - { - psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); - if (psta == NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n")); - goto createbss_cmd_fail ; - } - } - - rtw_indicate_connect( padapter); - } - else - { - pwlan = _rtw_alloc_network(pmlmepriv); - - if ( pwlan == NULL) - { - pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue); - if( pwlan == NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n Error: can't get pwlan in rtw_joinbss_event_callback \n")); - goto createbss_cmd_fail; - } - pwlan->last_scanned = rtw_get_current_time(); - } - else - { - rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); - } - - pnetwork->Length = get_WLAN_BSSID_EX_sz(pnetwork); - _rtw_memcpy(&(pwlan->network), pnetwork, pnetwork->Length); - //pwlan->fixed = _TRUE; - - //rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); - - // copy pdev_network information to pmlmepriv->cur_network - _rtw_memcpy(&tgt_network->network, pnetwork, (get_WLAN_BSSID_EX_sz(pnetwork))); - - // reset DSConfig - //tgt_network->network.Configuration.DSConfig = (u32)rtw_ch2freq(pnetwork->Configuration.DSConfig); - - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - -#if 0 - if((pmlmepriv->fw_state) & WIFI_AP_STATE) - { - psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); - - if (psta == NULL) { // for AP Mode & Adhoc Master Mode - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n")); - goto createbss_cmd_fail ; - } - - rtw_indicate_connect( padapter); - } - else { - - //rtw_indicate_disconnect(dev); - } -#endif - - // we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback) - - } - -createbss_cmd_fail: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - rtw_free_cmd_obj(pcmd); - -_func_exit_; - -} - - - -void rtw_setstaKey_cmdrsp_callback(_adapter* padapter , struct cmd_obj *pcmd) -{ - - struct sta_priv * pstapriv = &padapter->stapriv; - struct set_stakey_rsp* psetstakey_rsp = (struct set_stakey_rsp*) (pcmd->rsp); - struct sta_info* psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr); - -_func_enter_; - - if(psta==NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: rtw_setstaKey_cmdrsp_callback => can't get sta_info \n\n")); - goto exit; - } - - //psta->aid = psta->mac_id = psetstakey_rsp->keyid; //CAM_ID(CAM_ENTRY) - -exit: - - rtw_free_cmd_obj(pcmd); - -_func_exit_; - -} -void rtw_setassocsta_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) -{ - _irqL irqL; - struct sta_priv * pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct set_assocsta_parm* passocsta_parm = (struct set_assocsta_parm*)(pcmd->parmbuf); - struct set_assocsta_rsp* passocsta_rsp = (struct set_assocsta_rsp*) (pcmd->rsp); - struct sta_info* psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr); - -_func_enter_; - - if(psta==NULL) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: setassocsta_cmdrsp_callbac => can't get sta_info \n\n")); - goto exit; - } - - psta->aid = psta->mac_id = passocsta_rsp->cam_id; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)) - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - - set_fwstate(pmlmepriv, _FW_LINKED); - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - rtw_free_cmd_obj(pcmd); -exit: -_func_exit_; -} - -void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) -{ -_func_enter_; - - rtw_free_cmd_obj(pcmd); -#ifdef CONFIG_MP_INCLUDED - padapter->mppriv.workparam.bcompleted=_TRUE; -#endif - -_func_exit_; - -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_debug.c b/drivers/net/wireless/rtl8192c/core/rtw_debug.c deleted file mode 100755 index 79c69670714f..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_debug.c +++ /dev/null @@ -1,604 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_DEBUG_C_ - - -#include - -#ifdef CONFIG_DEBUG_RTL871X - - u32 GlobalDebugLevel = _drv_info_; - - u64 GlobalDebugComponents = \ - _module_rtl871x_xmit_c_ | - _module_xmit_osdep_c_ | - _module_rtl871x_recv_c_ | - _module_recv_osdep_c_ | - _module_rtl871x_mlme_c_ | - _module_mlme_osdep_c_ | - _module_rtl871x_sta_mgt_c_ | - _module_rtl871x_cmd_c_ | - _module_cmd_osdep_c_ | - _module_rtl871x_io_c_ | - _module_io_osdep_c_ | - _module_os_intfs_c_| - _module_rtl871x_security_c_| - _module_rtl871x_eeprom_c_| - _module_hal_init_c_| - _module_hci_hal_init_c_| - _module_rtl871x_ioctl_c_| - _module_rtl871x_ioctl_set_c_| - _module_rtl871x_ioctl_query_c_| - _module_rtl871x_pwrctrl_c_| - _module_hci_intfs_c_| - _module_hci_ops_c_| - _module_hci_ops_os_c_| - _module_rtl871x_ioctl_os_c| - _module_rtl8712_cmd_c_| - _module_rtl8192c_xmit_c_| - _module_rtl8712_recv_c_ | - _module_mp_ | - _module_efuse_; - -#endif - -#ifdef CONFIG_PROC_DEBUG -#include - -int proc_get_drv_version(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - - int len = 0; - - len += snprintf(page + len, count - len, "%s\n", DRIVERVERSION); - - *eof = 1; - return len; -} - -int proc_get_write_reg(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - *eof = 1; - return 0; -} - -int proc_set_write_reg(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - struct net_device *dev = (struct net_device *)data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - char tmp[32]; - u32 addr, val, len; - - if (count < 3) - { - DBG_8192C("argument size is less than 3\n"); - return -EFAULT; - } - - if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { - - int num = sscanf(tmp, "%x %x %x", &addr, &val, &len); - - if (num != 3) { - DBG_8192C("invalid write_reg parameter!\n"); - return count; - } - - switch(len) - { - case 1: - rtw_write8(padapter, addr, (u8)val); - break; - case 2: - rtw_write16(padapter, addr, (u16)val); - break; - case 4: - rtw_write32(padapter, addr, val); - break; - default: - DBG_8192C("error write length=%d", len); - break; - } - - } - - return count; - -} - -static u32 proc_get_read_addr=0xeeeeeeee; -static u32 proc_get_read_len=0x4; - -int proc_get_read_reg(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - - int len = 0; - - if(proc_get_read_addr==0xeeeeeeee) - { - *eof = 1; - return len; - } - - switch(proc_get_read_len) - { - case 1: - len += snprintf(page + len, count - len, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr)); - break; - case 2: - len += snprintf(page + len, count - len, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr)); - break; - case 4: - len += snprintf(page + len, count - len, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr)); - break; - default: - len += snprintf(page + len, count - len, "error read length=%d\n", proc_get_read_len); - break; - } - - *eof = 1; - return len; - -} - -int proc_set_read_reg(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - struct net_device *dev = (struct net_device *)data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - char tmp[16]; - u32 addr, len; - - if (count < 2) - { - DBG_8192C("argument size is less than 2\n"); - return -EFAULT; - } - - if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { - - int num = sscanf(tmp, "%x %x", &addr, &len); - - if (num != 2) { - DBG_8192C("invalid read_reg parameter!\n"); - return count; - } - - proc_get_read_addr = addr; - - proc_get_read_len = len; - } - - return count; - -} - -int proc_get_fwstate(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - int len = 0; - - len += snprintf(page + len, count - len, "fwstate=0x%x\n", get_fwstate(pmlmepriv)); - - *eof = 1; - return len; -} - -int proc_get_sec_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - int len = 0; - - len += snprintf(page + len, count - len, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", - psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, - psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus); - - *eof = 1; - return len; -} - -int proc_get_mlmext_state(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - int len = 0; - - len += snprintf(page + len, count - len, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state); - - *eof = 1; - return len; -} - -int proc_get_qos_option(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - int len = 0; - - len += snprintf(page + len, count - len, "qos_option=%d\n", pmlmepriv->qospriv.qos_option); - - *eof = 1; - return len; - -} - -int proc_get_ht_option(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - int len = 0; - - len += snprintf(page + len, count - len, "ht_option=%d\n", pmlmepriv->htpriv.ht_option); - - *eof = 1; - return len; -} - -int proc_get_rf_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - int len = 0; - - len += snprintf(page + len, count - len, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n", - pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); - - - *eof = 1; - return len; - -} - -int proc_get_ap_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct sta_info *psta; - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - struct sta_priv *pstapriv = &padapter->stapriv; - int len = 0; - - psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); - if(psta) - { - int i; - struct recv_reorder_ctrl *preorder_ctrl; - - len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); - len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); - len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); - len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); - len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); - len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); - len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); - - for(i=0;i<16;i++) - { - preorder_ctrl = &psta->recvreorder_ctrl[i]; - if(preorder_ctrl->enable) - { - len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq); - } - } - - } - else - { - len += snprintf(page + len, count - len, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress)); - } - - *eof = 1; - return len; - -} - -int proc_get_adapter_state(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - int len = 0; - - len += snprintf(page + len, count - len, "bSurpriseRemoved=%d, bDriverStopped=%d\n", - padapter->bSurpriseRemoved, padapter->bDriverStopped); - - *eof = 1; - return len; - -} - -int proc_get_trx_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct recv_priv *precvpriv = &padapter->recvpriv; - int len = 0; - - len += snprintf(page + len, count - len, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n", - pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt); -#ifdef CONFIG_USB_HCI - len += snprintf(page + len, count - len, "rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt); -#endif - - *eof = 1; - return len; - -} - - -int proc_get_rx_signal(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - int len = 0; - - len += snprintf(page + len, count - len, - "rssi:%d\n" - "rxpwdb:%d\n" - "signal_strength:%u\n" - "signal_qual:%u\n" - "noise:%u\n", - padapter->recvpriv.rssi, - padapter->recvpriv.rxpwdb, - padapter->recvpriv.signal_strength, - padapter->recvpriv.signal_qual, - padapter->recvpriv.noise - ); - - *eof = 1; - return len; -} - -int proc_set_rx_signal(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - struct net_device *dev = (struct net_device *)data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - char tmp[32]; - u32 is_signal_dbg, signal_strength; - - if (count < 1) - return -EFAULT; - - if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { - - int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength); - - is_signal_dbg = is_signal_dbg==0?0:1; - - if(is_signal_dbg && num!=2) - return count; - - signal_strength = signal_strength>100?100:signal_strength; - signal_strength = signal_strength<0?0:signal_strength; - - padapter->recvpriv.is_signal_dbg = is_signal_dbg; - padapter->recvpriv.signal_strength_dbg=signal_strength; - - if(is_signal_dbg) - DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength); - else - DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH"); - - } - - return count; - -} - - -#ifdef CONFIG_AP_MODE - -int proc_get_all_sta_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - _irqL irqL; - struct sta_info *psta; - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct sta_priv *pstapriv = &padapter->stapriv; - int i, j; - _list *plist, *phead; - struct recv_reorder_ctrl *preorder_ctrl; - int len = 0; - - - len += snprintf(page + len, count - len, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); - - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - for(i=0; i< NUM_STA; i++) - { - phead = &(pstapriv->sta_hash[i]); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - - plist = get_next(plist); - - //if(extra_arg == psta->aid) - { - len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); - len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); - len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); - len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); - len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); - len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); - len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); - len += snprintf(page + len, count - len, "sleepq_len=%d\n", psta->sleepq_len); - - for(j=0;j<16;j++) - { - preorder_ctrl = &psta->recvreorder_ctrl[j]; - if(preorder_ctrl->enable) - { - len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq); - } - } - - } - - } - - } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - *eof = 1; - return len; - -} - -#endif - -#ifdef MEMORY_LEAK_DEBUG -#include -extern atomic_t _malloc_cnt;; -extern atomic_t _malloc_size;; - -int proc_get_malloc_cnt(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - - int len = 0; - - len += snprintf(page + len, count - len, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt)); - len += snprintf(page + len, count - len, "_malloc_size=%d\n", atomic_read(&_malloc_size)); - - *eof = 1; - return len; -} -#endif /* MEMORY_LEAK_DEBUG */ - -#ifdef CONFIG_FIND_BEST_CHANNEL -int proc_get_best_channel(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - int len = 0; - u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0; - - for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { - if ( pmlmeext->channel_set[i].ChannelNum == 1) - index_24G = i; - if ( pmlmeext->channel_set[i].ChannelNum == 36) - index_5G = i; - } - - for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { - // 2.4G - if ( pmlmeext->channel_set[i].ChannelNum == 6 ) { - if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) { - index_24G = i; - best_channel_24G = pmlmeext->channel_set[i].ChannelNum; - } - } - - // 5G - if ( pmlmeext->channel_set[i].ChannelNum >= 36 - && pmlmeext->channel_set[i].ChannelNum < 140 ) { - // Find primary channel - if ( (( pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0) - && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) { - index_5G = i; - best_channel_5G = pmlmeext->channel_set[i].ChannelNum; - } - } - - if ( pmlmeext->channel_set[i].ChannelNum >= 149 - && pmlmeext->channel_set[i].ChannelNum < 165) { - // find primary channel - if ( (( pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0) - && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) { - index_5G = i; - best_channel_5G = pmlmeext->channel_set[i].ChannelNum; - } - } -#if 0 // debug - len += snprintf(page + len, count - len, "The rx cnt of channel %3d = %d\n", - pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count); -#endif - } - - len += snprintf(page + len, count - len, "best_channel_5G = %d\n", best_channel_5G); - len += snprintf(page + len, count - len, "best_channel_24G = %d\n", best_channel_24G); - - *eof = 1; - return len; - -} -#endif /* CONFIG_FIND_BEST_CHANNEL */ - -#endif - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c b/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c deleted file mode 100755 index 4a0832bcb8c9..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c +++ /dev/null @@ -1,424 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_EEPROM_C_ - -#include -#include -#include - -void up_clk(_adapter* padapter, u16 *x) -{ -_func_enter_; - *x = *x | _EESK; - rtw_write8(padapter, EE_9346CR, (u8)*x); - rtw_udelay_os(CLOCK_RATE); - -_func_exit_; - -} - -void down_clk(_adapter * padapter, u16 *x ) -{ -_func_enter_; - *x = *x & ~_EESK; - rtw_write8(padapter, EE_9346CR, (u8)*x); - rtw_udelay_os(CLOCK_RATE); -_func_exit_; -} - -void shift_out_bits(_adapter * padapter, u16 data, u16 count) -{ - u16 x,mask; -_func_enter_; - - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - mask = 0x01 << (count - 1); - x = rtw_read8(padapter, EE_9346CR); - - x &= ~(_EEDO | _EEDI); - - do - { - x &= ~_EEDI; - if(data & mask) - x |= _EEDI; - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - rtw_write8(padapter, EE_9346CR, (u8)x); - rtw_udelay_os(CLOCK_RATE); - up_clk(padapter, &x); - down_clk(padapter, &x); - mask = mask >> 1; - } while(mask); - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - x &= ~_EEDI; - rtw_write8(padapter, EE_9346CR, (u8)x); -out: -_func_exit_; -} - -u16 shift_in_bits (_adapter * padapter) -{ - u16 x,d=0,i; -_func_enter_; - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - x = rtw_read8(padapter, EE_9346CR); - - x &= ~( _EEDO | _EEDI); - d = 0; - - for(i=0; i<16; i++) - { - d = d << 1; - up_clk(padapter, &x); - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - x = rtw_read8(padapter, EE_9346CR); - - x &= ~(_EEDI); - if(x & _EEDO) - d |= 1; - - down_clk(padapter, &x); - } -out: -_func_exit_; - - return d; -} - -void standby(_adapter * padapter ) -{ - u8 x; -_func_enter_; - x = rtw_read8(padapter, EE_9346CR); - - x &= ~(_EECS | _EESK); - rtw_write8(padapter, EE_9346CR,x); - - rtw_udelay_os(CLOCK_RATE); - x |= _EECS; - rtw_write8(padapter, EE_9346CR, x); - rtw_udelay_os(CLOCK_RATE); -_func_exit_; -} - -u16 wait_eeprom_cmd_done(_adapter* padapter) -{ - u8 x; - u16 i,res=_FALSE; -_func_enter_; - standby(padapter ); - for (i=0; i<200; i++) - { - x = rtw_read8(padapter, EE_9346CR); - if (x & _EEDO){ - res=_TRUE; - goto exit; - } - rtw_udelay_os(CLOCK_RATE); - } -exit: -_func_exit_; - return res; -} - -void eeprom_clean(_adapter * padapter) -{ - u16 x; -_func_enter_; - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - x = rtw_read8(padapter, EE_9346CR); - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - x &= ~(_EECS | _EEDI); - rtw_write8(padapter, EE_9346CR, (u8)x); - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - up_clk(padapter, &x); - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - down_clk(padapter, &x); -out: -_func_exit_; -} - -void eeprom_write16(_adapter * padapter, u16 reg, u16 data) -{ - u8 x; -#ifdef CONFIG_RTL8712 - u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; - tmp8_ori=rtw_read8(padapter, 0x102502f1); - tmp8_new=tmp8_ori & 0xf7; - if(tmp8_ori != tmp8_new){ - rtw_write8(padapter, 0x102502f1, tmp8_new); - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); - } - tmp8_clk_ori=rtw_read8(padapter,0x10250003); - tmp8_clk_new=tmp8_clk_ori|0x20; - if(tmp8_clk_new!=tmp8_clk_ori){ - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); - rtw_write8(padapter, 0x10250003, tmp8_clk_new); - } -#endif -_func_enter_; - - x = rtw_read8(padapter, EE_9346CR); - - x &= ~(_EEDI | _EEDO | _EESK | _EEM0); - x |= _EEM1 | _EECS; - rtw_write8(padapter, EE_9346CR, x); - - shift_out_bits(padapter, EEPROM_EWEN_OPCODE, 5); - - if(padapter->EepromAddressSize==8) //CF+ and SDIO - shift_out_bits(padapter, 0, 6); - else //USB - shift_out_bits(padapter, 0, 4); - - standby( padapter); - -// Commented out by rcnjko, 2004.0 -// // Erase this particular word. Write the erase opcode and register -// // number in that order. The opcode is 3bits in length; reg is 6 bits long. -// shift_out_bits(Adapter, EEPROM_ERASE_OPCODE, 3); -// shift_out_bits(Adapter, reg, Adapter->EepromAddressSize); -// -// if (wait_eeprom_cmd_done(Adapter ) == FALSE) -// { -// return; -// } - - - standby(padapter ); - - // write the new word to the EEPROM - - // send the write opcode the EEPORM - shift_out_bits(padapter, EEPROM_WRITE_OPCODE, 3); - - // select which word in the EEPROM that we are writing to. - shift_out_bits(padapter, reg, padapter->EepromAddressSize); - - // write the data to the selected EEPROM word. - shift_out_bits(padapter, data, 16); - - if (wait_eeprom_cmd_done(padapter ) == _FALSE) - { - - goto exit; - } - - standby(padapter ); - - shift_out_bits(padapter, EEPROM_EWDS_OPCODE, 5); - shift_out_bits(padapter, reg, 4); - - eeprom_clean(padapter ); -exit: -#ifdef CONFIG_RTL8712 - if(tmp8_clk_new!=tmp8_clk_ori) - rtw_write8(padapter, 0x10250003, tmp8_clk_ori); - if(tmp8_new!=tmp8_ori) - rtw_write8(padapter, 0x102502f1, tmp8_ori); - -#endif -_func_exit_; - return; -} - -u16 eeprom_read16(_adapter * padapter, u16 reg) //ReadEEprom -{ - - u16 x; - u16 data=0; -#ifdef CONFIG_RTL8712 - u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; - tmp8_ori= rtw_read8(padapter, 0x102502f1); - tmp8_new = tmp8_ori & 0xf7; - if(tmp8_ori != tmp8_new){ - rtw_write8(padapter, 0x102502f1, tmp8_new); - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); - } - tmp8_clk_ori=rtw_read8(padapter,0x10250003); - tmp8_clk_new=tmp8_clk_ori|0x20; - if(tmp8_clk_new!=tmp8_clk_ori){ - RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); - rtw_write8(padapter, 0x10250003, tmp8_clk_new); - } -#endif -_func_enter_; - - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - // select EEPROM, reset bits, set _EECS - x = rtw_read8(padapter, EE_9346CR); - - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - - x &= ~(_EEDI | _EEDO | _EESK | _EEM0); - x |= _EEM1 | _EECS; - rtw_write8(padapter, EE_9346CR, (unsigned char)x); - - // write the read opcode and register number in that order - // The opcode is 3bits in length, reg is 6 bits long - shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); - shift_out_bits(padapter, reg, padapter->EepromAddressSize); - - // Now read the data (16 bits) in from the selected EEPROM word - data = shift_in_bits(padapter); - - eeprom_clean(padapter); -out: -#ifdef CONFIG_RTL8712 - if(tmp8_clk_new!=tmp8_clk_ori) - rtw_write8(padapter, 0x10250003, tmp8_clk_ori); - if(tmp8_new!=tmp8_ori) - rtw_write8(padapter, 0x102502f1, tmp8_ori); - -#endif -_func_exit_; - return data; - - -} - - - - -//From even offset -void eeprom_read_sz(_adapter * padapter, u16 reg, u8* data, u32 sz) -{ - - u16 x, data16; - u32 i; -_func_enter_; - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - // select EEPROM, reset bits, set _EECS - x = rtw_read8(padapter, EE_9346CR); - - if(padapter->bSurpriseRemoved==_TRUE){ - RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); - goto out; - } - - x &= ~(_EEDI | _EEDO | _EESK | _EEM0); - x |= _EEM1 | _EECS; - rtw_write8(padapter, EE_9346CR, (unsigned char)x); - - // write the read opcode and register number in that order - // The opcode is 3bits in length, reg is 6 bits long - shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); - shift_out_bits(padapter, reg, padapter->EepromAddressSize); - - - for(i=0; i>8; - } - - eeprom_clean(padapter); -out: -_func_exit_; - - - -} - - -//addr_off : address offset of the entry in eeprom (not the tuple number of eeprom (reg); that is addr_off !=reg) -u8 eeprom_read(_adapter * padapter, u32 addr_off, u8 sz, u8* rbuf) -{ - u8 quotient, remainder, addr_2align_odd; - u16 reg, stmp , i=0, idx = 0; -_func_enter_; - reg = (u16)(addr_off >> 1); - addr_2align_odd = (u8)(addr_off & 0x1); - - if(addr_2align_odd) //read that start at high part: e.g 1,3,5,7,9,... - { - stmp = eeprom_read16(padapter, reg); - rbuf[idx++] = (u8) ((stmp>>8)&0xff); //return hogh-part of the short - reg++; sz--; - } - - quotient = sz >> 1; - remainder = sz & 0x1; - - for( i=0 ; i < quotient; i++) - { - stmp = eeprom_read16(padapter, reg+i); - rbuf[idx++] = (u8) (stmp&0xff); - rbuf[idx++] = (u8) ((stmp>>8)&0xff); - } - - reg = reg+i; - if(remainder){ //end of read at lower part of short : 0,2,4,6,... - stmp = eeprom_read16(padapter, reg); - rbuf[idx] = (u8)(stmp & 0xff); - } -_func_exit_; - return _TRUE; -} - - - -VOID read_eeprom_content(_adapter * padapter) -{ - -_func_enter_; - - -_func_exit_; -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c b/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c deleted file mode 100755 index 82259790ae9f..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c +++ /dev/null @@ -1,1202 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _IEEE80211_C - -#include -#include -#include -#include -#include - - -//----------------------------------------------------------- -// for adhoc-master to generate ie and provide supported-rate to fw -//----------------------------------------------------------- - -static u8 WIFI_CCKRATES[] = -{(IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK), - (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK), - (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK), - (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK)}; - -static u8 WIFI_OFDMRATES[] = -{(IEEE80211_OFDM_RATE_6MB), - (IEEE80211_OFDM_RATE_9MB), - (IEEE80211_OFDM_RATE_12MB), - (IEEE80211_OFDM_RATE_18MB), - (IEEE80211_OFDM_RATE_24MB), - IEEE80211_OFDM_RATE_36MB, - IEEE80211_OFDM_RATE_48MB, - IEEE80211_OFDM_RATE_54MB}; - - -int rtw_get_bit_value_from_ieee_value(u8 val) -{ - unsigned char dot11_rate_table[]={2,4,11,22,12,18,24,36,48,72,96,108,0}; // last element must be zero!! - - int i=0; - while(dot11_rate_table[i] != 0) { - if (dot11_rate_table[i] == val) - return BIT(i); - i++; - } - return 0; -} - -uint rtw_is_cckrates_included(u8 *rate) -{ - u32 i = 0; - - while(rate[i]!=0) - { - if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || - (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) - return _TRUE; - i++; - } - - return _FALSE; -} - -uint rtw_is_cckratesonly_included(u8 *rate) -{ - u32 i = 0; - - - while(rate[i]!=0) - { - if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && - (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) - - return _FALSE; - - i++; - } - - return _TRUE; - -} - -int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) -{ - if (channel > 14) - { - if ((rtw_is_cckrates_included(rate)) == _TRUE) - return WIRELESS_INVALID; - else - return WIRELESS_11A; - } - else // could be pure B, pure G, or B/G - { - if ((rtw_is_cckratesonly_included(rate)) == _TRUE) - return WIRELESS_11B; - else if((rtw_is_cckrates_included(rate)) == _TRUE) - return WIRELESS_11BG; - else - return WIRELESS_11G; - } - -} - -u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, - unsigned int *frlen) -{ - _rtw_memcpy((void *)pbuf, (void *)source, len); - *frlen = *frlen + len; - return (pbuf + len); -} - -// rtw_set_ie will update frame length -u8 *rtw_set_ie -( - u8 *pbuf, - sint index, - uint len, - u8 *source, - uint *frlen //frame length -) -{ -_func_enter_; - *pbuf = (u8)index; - - *(pbuf + 1) = (u8)len; - - if (len > 0) - _rtw_memcpy((void *)(pbuf + 2), (void *)source, len); - - *frlen = *frlen + (len + 2); - - return (pbuf + len + 2); -_func_exit_; -} - - - -/*---------------------------------------------------------------------------- -index: the information element id index, limit is the limit for search ------------------------------------------------------------------------------*/ -u8 *rtw_get_ie(u8 *pbuf, sint index, sint *len, sint limit) -{ - sint tmp,i; - u8 *p; -_func_enter_; - if (limit < 1){ - _func_exit_; - return NULL; - } - - p = pbuf; - i = 0; - *len = 0; - while(1) - { - if (*p == index) - { - *len = *(p + 1); - return (p); - } - else - { - tmp = *(p + 1); - p += (tmp + 2); - i += (tmp + 2); - } - if (i >= limit) - break; - } -_func_exit_; - return NULL; -} - -void rtw_set_supported_rate(u8* SupportedRates, uint mode) -{ -_func_enter_; - - _rtw_memset(SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); - - switch (mode) - { - case WIRELESS_11B: - _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); - break; - - case WIRELESS_11G: - case WIRELESS_11A: - case WIRELESS_11_5N: - case WIRELESS_11A_5N://Todo: no basic rate for ofdm ? - _rtw_memcpy(SupportedRates, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); - break; - - case WIRELESS_11BG: - case WIRELESS_11G_24N: - case WIRELESS_11_24N: - case WIRELESS_11BG_24N: - _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); - _rtw_memcpy(SupportedRates + IEEE80211_CCK_RATE_LEN, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); - break; - - } -_func_exit_; -} - -uint rtw_get_rateset_len(u8 *rateset) -{ - uint i = 0; -_func_enter_; - while(1) - { - if ((rateset[i]) == 0) - break; - - if (i > 12) - break; - - i++; - } -_func_exit_; - return i; -} - -int rtw_generate_ie(struct registry_priv *pregistrypriv) -{ - u8 wireless_mode; - int sz = 0, rateLen; - WLAN_BSSID_EX* pdev_network = &pregistrypriv->dev_network; - u8* ie = pdev_network->IEs; - -_func_enter_; - - //timestamp will be inserted by hardware - sz += 8; - ie += sz; - - //beacon interval : 2bytes - *(u16*)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);//BCN_INTERVAL; - sz += 2; - ie += 2; - - //capability info - *(u16*)ie = 0; - - *(u16*)ie |= cpu_to_le16(cap_IBSS); - - if(pregistrypriv->preamble == PREAMBLE_SHORT) - *(u16*)ie |= cpu_to_le16(cap_ShortPremble); - - if (pdev_network->Privacy) - *(u16*)ie |= cpu_to_le16(cap_Privacy); - - sz += 2; - ie += 2; - - //SSID - ie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz); - - //supported rates - if(pregistrypriv->wireless_mode == WIRELESS_11ABGN) - { - if(pdev_network->Configuration.DSConfig > 14) - wireless_mode = WIRELESS_11A_5N; - else - wireless_mode = WIRELESS_11BG_24N; - } - else - { - wireless_mode = pregistrypriv->wireless_mode; - } - - rtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode) ; - - rateLen = rtw_get_rateset_len(pdev_network->SupportedRates); - - if (rateLen > 8) - { - ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, pdev_network->SupportedRates, &sz); - //ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); - } - else - { - ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, pdev_network->SupportedRates, &sz); - } - - //DS parameter set - ie = rtw_set_ie(ie, _DSSET_IE_, 1, (u8 *)&(pdev_network->Configuration.DSConfig), &sz); - - - //IBSS Parameter Set - - ie = rtw_set_ie(ie, _IBSS_PARA_IE_, 2, (u8 *)&(pdev_network->Configuration.ATIMWindow), &sz); - - if (rateLen > 8) - { - ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); - } - - - //HT Cap. - if(((pregistrypriv->wireless_mode&WIRELESS_11_5N)||(pregistrypriv->wireless_mode&WIRELESS_11_24N)) - && (pregistrypriv->ht_enable==_TRUE)) - { - //todo: - } - - //pdev_network->IELength = sz; //update IELength - -_func_exit_; - - //return _SUCCESS; - - return sz; - -} - -unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) -{ - int len; - u16 val16; - unsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01}; - u8 *pbuf = pie; - - while(1) - { - pbuf = rtw_get_ie(pbuf, _WPA_IE_ID_, &len, limit); - - if (pbuf) { - - //check if oui matches... - if (_rtw_memcmp((pbuf + 2), wpa_oui_type, sizeof (wpa_oui_type)) == _FALSE) { - - goto check_next_ie; - } - - //check version... - _rtw_memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16)); - - val16 = le16_to_cpu(val16); - if (val16 != 0x0001) - goto check_next_ie; - - *wpa_ie_len = *(pbuf + 1); - - return pbuf; - - } - else { - - *wpa_ie_len = 0; - return NULL; - } - -check_next_ie: - - limit = limit - (pbuf - pie) - 2 - len; - - if (limit <= 0) - break; - - pbuf += (2 + len); - - } - - *wpa_ie_len = 0; - - return NULL; - -} - -unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit) -{ - - return rtw_get_ie(pie, _WPA2_IE_ID_,rsn_ie_len, limit); - -} - -int rtw_get_wpa_cipher_suite(u8 *s) -{ - if (_rtw_memcmp(s, WPA_CIPHER_SUITE_NONE, WPA_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_NONE; - if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP40, WPA_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_WEP40; - if (_rtw_memcmp(s, WPA_CIPHER_SUITE_TKIP, WPA_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_TKIP; - if (_rtw_memcmp(s, WPA_CIPHER_SUITE_CCMP, WPA_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_CCMP; - if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP104, WPA_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_WEP104; - - return 0; -} - -int rtw_get_wpa2_cipher_suite(u8 *s) -{ - if (_rtw_memcmp(s, RSN_CIPHER_SUITE_NONE, RSN_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_NONE; - if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP40, RSN_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_WEP40; - if (_rtw_memcmp(s, RSN_CIPHER_SUITE_TKIP, RSN_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_TKIP; - if (_rtw_memcmp(s, RSN_CIPHER_SUITE_CCMP, RSN_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_CCMP; - if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP104, RSN_SELECTOR_LEN) == _TRUE) - return WPA_CIPHER_WEP104; - - return 0; -} - - -int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher) -{ - int i, ret=_SUCCESS; - int left, count; - u8 *pos; - - if (wpa_ie_len <= 0) { - /* No WPA IE - fail silently */ - return _FAIL; - } - - - if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) || - (_rtw_memcmp(wpa_ie+2, WPA_OUI_TYPE, WPA_SELECTOR_LEN) != _TRUE) ) - { - return _FAIL; - } - - pos = wpa_ie; - - pos += 8; - left = wpa_ie_len - 8; - - - //group_cipher - if (left >= WPA_SELECTOR_LEN) { - - *group_cipher = rtw_get_wpa_cipher_suite(pos); - - pos += WPA_SELECTOR_LEN; - left -= WPA_SELECTOR_LEN; - - } - else if (left > 0) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); - - return _FAIL; - } - - - //pairwise_cipher - if (left >= 2) - { - //count = le16_to_cpu(*(u16*)pos); - count = RTW_GET_LE16(pos); - pos += 2; - left -= 2; - - if (count == 0 || left < count * WPA_SELECTOR_LEN) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " - "count %u left %u", __FUNCTION__, count, left)); - return _FAIL; - } - - for (i = 0; i < count; i++) - { - *pairwise_cipher |= rtw_get_wpa_cipher_suite(pos); - - pos += WPA_SELECTOR_LEN; - left -= WPA_SELECTOR_LEN; - } - - } - else if (left == 1) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); - return _FAIL; - } - - - return ret; - -} - -int rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher) -{ - int i, ret=_SUCCESS; - int left, count; - u8 *pos; - - if (rsn_ie_len <= 0) { - /* No RSN IE - fail silently */ - return _FAIL; - } - - - if ((*rsn_ie!= _WPA2_IE_ID_) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2))) - { - return _FAIL; - } - - pos = rsn_ie; - pos += 4; - left = rsn_ie_len - 4; - - //group_cipher - if (left >= RSN_SELECTOR_LEN) { - - *group_cipher = rtw_get_wpa2_cipher_suite(pos); - - pos += RSN_SELECTOR_LEN; - left -= RSN_SELECTOR_LEN; - - } else if (left > 0) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); - return _FAIL; - } - - //pairwise_cipher - if (left >= 2) - { - //count = le16_to_cpu(*(u16*)pos); - count = RTW_GET_LE16(pos); - pos += 2; - left -= 2; - - if (count == 0 || left < count * RSN_SELECTOR_LEN) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " - "count %u left %u", __FUNCTION__, count, left)); - return _FAIL; - } - - for (i = 0; i < count; i++) - { - *pairwise_cipher |= rtw_get_wpa2_cipher_suite(pos); - - pos += RSN_SELECTOR_LEN; - left -= RSN_SELECTOR_LEN; - } - - } - else if (left == 1) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); - - return _FAIL; - } - - - return ret; - -} - -int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len) -{ - u8 authmode, sec_idx, i; - u8 wpa_oui[4]={0x0,0x50,0xf2,0x01}; - uint cnt; - -_func_enter_; - - //Search required WPA or WPA2 IE and copy to sec_ie[ ] - - cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_); - - sec_idx=0; - - while(cnt found WPS_IE.....\n"); - *wps_ielen = ie_ptr[1]+2; - match=_TRUE; - } - return match; -} - -u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) -{ - //int match; - uint cnt; - u8 *wpsie_ptr=NULL; - u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04}; - - cnt=_FIXED_IE_LENGTH_; - //match=_FALSE; - while(cntwpa_ie = pos; - elems->wpa_ie_len = elen; - break; - case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */ - if (elen < 5) { - DBG_871X("short WME " - "information element ignored " - "(len=%lu)\n", - (unsigned long) elen); - return -1; - } - switch (pos[4]) { - case WME_OUI_SUBTYPE_INFORMATION_ELEMENT: - case WME_OUI_SUBTYPE_PARAMETER_ELEMENT: - elems->wme = pos; - elems->wme_len = elen; - break; - case WME_OUI_SUBTYPE_TSPEC_ELEMENT: - elems->wme_tspec = pos; - elems->wme_tspec_len = elen; - break; - default: - DBG_871X("unknown WME " - "information element ignored " - "(subtype=%d len=%lu)\n", - pos[4], (unsigned long) elen); - return -1; - } - break; - case 4: - /* Wi-Fi Protected Setup (WPS) IE */ - elems->wps_ie = pos; - elems->wps_ie_len = elen; - break; - default: - DBG_871X("Unknown Microsoft " - "information element ignored " - "(type=%d len=%lu)\n", - pos[3], (unsigned long) elen); - return -1; - } - break; - - case OUI_BROADCOM: - switch (pos[3]) { - case VENDOR_HT_CAPAB_OUI_TYPE: - elems->vendor_ht_cap = pos; - elems->vendor_ht_cap_len = elen; - break; - default: - DBG_871X("Unknown Broadcom " - "information element ignored " - "(type=%d len=%lu)\n", - pos[3], (unsigned long) elen); - return -1; - } - break; - - default: - DBG_871X("unknown vendor specific information " - "element ignored (vendor OUI %02x:%02x:%02x " - "len=%lu)\n", - pos[0], pos[1], pos[2], (unsigned long) elen); - return -1; - } - - return 0; - -} - -/** - * ieee802_11_parse_elems - Parse information elements in management frames - * @start: Pointer to the start of IEs - * @len: Length of IE buffer in octets - * @elems: Data structure for parsed elements - * @show_errors: Whether to show parsing errors in debug log - * Returns: Parsing result - */ -ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, - struct ieee802_11_elems *elems, - int show_errors) -{ - uint left = len; - u8 *pos = start; - int unknown = 0; - - _rtw_memset(elems, 0, sizeof(*elems)); - - while (left >= 2) { - u8 id, elen; - - id = *pos++; - elen = *pos++; - left -= 2; - - if (elen > left) { - if (show_errors) { - DBG_871X("IEEE 802.11 element " - "parse failed (id=%d elen=%d " - "left=%lu)\n", - id, elen, (unsigned long) left); - } - return ParseFailed; - } - - switch (id) { - case WLAN_EID_SSID: - elems->ssid = pos; - elems->ssid_len = elen; - break; - case WLAN_EID_SUPP_RATES: - elems->supp_rates = pos; - elems->supp_rates_len = elen; - break; - case WLAN_EID_FH_PARAMS: - elems->fh_params = pos; - elems->fh_params_len = elen; - break; - case WLAN_EID_DS_PARAMS: - elems->ds_params = pos; - elems->ds_params_len = elen; - break; - case WLAN_EID_CF_PARAMS: - elems->cf_params = pos; - elems->cf_params_len = elen; - break; - case WLAN_EID_TIM: - elems->tim = pos; - elems->tim_len = elen; - break; - case WLAN_EID_IBSS_PARAMS: - elems->ibss_params = pos; - elems->ibss_params_len = elen; - break; - case WLAN_EID_CHALLENGE: - elems->challenge = pos; - elems->challenge_len = elen; - break; - case WLAN_EID_ERP_INFO: - elems->erp_info = pos; - elems->erp_info_len = elen; - break; - case WLAN_EID_EXT_SUPP_RATES: - elems->ext_supp_rates = pos; - elems->ext_supp_rates_len = elen; - break; - case WLAN_EID_VENDOR_SPECIFIC: - if (rtw_ieee802_11_parse_vendor_specific(pos, elen, - elems, - show_errors)) - unknown++; - break; - case WLAN_EID_RSN: - elems->rsn_ie = pos; - elems->rsn_ie_len = elen; - break; - case WLAN_EID_PWR_CAPABILITY: - elems->power_cap = pos; - elems->power_cap_len = elen; - break; - case WLAN_EID_SUPPORTED_CHANNELS: - elems->supp_channels = pos; - elems->supp_channels_len = elen; - break; - case WLAN_EID_MOBILITY_DOMAIN: - elems->mdie = pos; - elems->mdie_len = elen; - break; - case WLAN_EID_FAST_BSS_TRANSITION: - elems->ftie = pos; - elems->ftie_len = elen; - break; - case WLAN_EID_TIMEOUT_INTERVAL: - elems->timeout_int = pos; - elems->timeout_int_len = elen; - break; - case WLAN_EID_HT_CAP: - elems->ht_capabilities = pos; - elems->ht_capabilities_len = elen; - break; - case WLAN_EID_HT_OPERATION: - elems->ht_operation = pos; - elems->ht_operation_len = elen; - break; - default: - unknown++; - if (!show_errors) - break; - DBG_871X("IEEE 802.11 element parse " - "ignored unknown element (id=%d elen=%d)\n", - id, elen); - break; - } - - left -= elen; - pos += elen; - } - - if (left) - return ParseFailed; - - return unknown ? ParseUnknown : ParseOK; - -} - -u8 key_char2num(u8 ch) -{ - if((ch>='0')&&(ch<='9')) - return ch - '0'; - else if ((ch>='a')&&(ch<='f')) - return ch - 'a' + 10; - else if ((ch>='A')&&(ch<='F')) - return ch - 'A' + 10; - else - return 0xff; -} - -u8 str_2char2num(u8 hch, u8 lch) -{ - return ((key_char2num(hch) * 10 ) + key_char2num(lch)); -} - -u8 key_2char2num(u8 hch, u8 lch) -{ - return ((key_char2num(hch) << 4) | key_char2num(lch)); -} - -extern char* rtw_initmac; -void rtw_macaddr_cfg(u8 *mac_addr) -{ - u8 mac[ETH_ALEN]; - if(mac_addr == NULL) return; - - if ( rtw_initmac ) - { // Users specify the mac address - int jj,kk; - - for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 ) - { - mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]); - } - _rtw_memcpy(mac_addr, mac, ETH_ALEN); - } - else - { // Use the mac address stored in the Efuse - _rtw_memcpy(mac, mac_addr, ETH_ALEN); - } - - if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) && - (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) || - ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) && - (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0))) - { - mac[0] = 0x00; - mac[1] = 0xe0; - mac[2] = 0x4c; - mac[3] = 0x87; - mac[4] = 0x00; - mac[5] = 0x00; - // use default mac addresss - _rtw_memcpy(mac_addr, mac, ETH_ALEN); - DBG_8192C("MAC Address from efuse error, assign default one !!!\n"); - } - - //DBG_8192C("rtw_macaddr_cfg MAC Address = "MAC_FMT"\n", MAC_ARG(mac_addr)); -} - -#ifdef CONFIG_P2P -// Added by Albert 20100910 -// The input buffer in_ie should be pointer to the address of any information element of management frame. -// The p2p_ie buffer will contain "whole" the P2P IE, include the Element ID, Length, P2P OUI and P2P Attributes. -// The p2p_ielen will be the length of p2p_ie buffer. -// The return value will be the offset for the next IE. - -int rtw_get_p2p_ie(u8 *in_ie, uint in_len, u8 *p2p_ie, uint *p2p_ielen) -{ - int match; - uint cnt = 0; - u8 eid, p2p_oui[4]={0x50,0x6F,0x9A,0x09}; - - - match=_FALSE; - while(cnt 1 byte for attribute ID field, 2 bytes for length field - if(attr_content) - _rtw_memcpy( attr_content, &p2p_ie[ cnt + 3 ], attrlen ); - - if(attr_contentlen) - *attr_contentlen = attrlen; - - cnt += attrlen + 3; - - match = _TRUE; - break; - } - else - { - cnt += attrlen + 3; //goto next - } - - } - - return match; - -} - -u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr) -{ - u32 a_len; - - *pbuf = attr_id; - - //*(u16*)(pbuf + 1) = cpu_to_le16(attr_len); - RTW_PUT_LE16(pbuf + 1, attr_len); - - if(pdata_attr) - _rtw_memcpy(pbuf + 3, pdata_attr, attr_len); - - a_len = attr_len + 3; - - return a_len; -} - -// Noted by Albert 20100910 -// 1. WPS uses the TLV format to store the attribute contents. -// T: Type, 2bytes length -// L: Length, 2bytes length -// V: Value, variable length -// 2. WPS uses the big endian to store the WPS attribute contents. - -// attr_content: The output buffer, contains the "value part" of WPS attribute field. -// attr_contentlen: The data length of the "value part" of WPS attribute field. - -int rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *attr_content, uint *attr_contentlen) -{ - int match; - uint cnt = 0; - u8 wps_oui[4]={0x00,0x50,0xF2,0x04}; - u16 attr_id; - - - match=_FALSE; - - if ( ( wps_ie[ 0 ] != _VENDOR_SPECIFIC_IE_ ) || - ( _rtw_memcmp( wps_ie + 2, wps_oui , 4 ) != _TRUE ) ) - { - return( match ); - } - - // 1 ( WPS IE ) + 1 ( Length ) + 4 ( WPS OUI ) - cnt = 6; - while( cnt < wps_ielen ) - { - // 2 -> the length of WPS attribute type field. - //u16 attrlen = be16_to_cpu(*(u16*)(wps_ie + cnt + 2 )); - u16 attrlen = RTW_GET_BE16(wps_ie + cnt + 2); - - //attr_id = be16_to_cpu( *(u16*) ( wps_ie + cnt ) ); - attr_id = RTW_GET_BE16(wps_ie + cnt); - if( attr_id == target_attr_id ) - { - // 3 -> 1 byte for attribute ID field, 2 bytes for length field - _rtw_memcpy( attr_content, &wps_ie[ cnt + 4 ], attrlen ); - - *attr_contentlen = attrlen; - - cnt += attrlen + 4; - - match = _TRUE; - break; - } - else - { - cnt += attrlen + 4; //goto next - } - - } - - return match; - -} - -// Commented by Albert 20110520 -// This function is only used by P2P -int rtw_get_wps_ie_p2p(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) -{ - int match; - uint cnt = 0; - u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04}; - - match=_FALSE; - while(cnt -#include -#include -#include -#include - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) -#error "Shall be Linux or Windows, but not both!\n" -#endif - -#ifdef CONFIG_SDIO_HCI -#include -#endif - -#ifdef CONFIG_USB_HCI -#include -#endif - -#ifdef CONFIG_PCI_HCI -#include -#endif - - -u8 rtw_read8(_adapter *adapter, u32 addr) -{ - u8 r_val; - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); - _func_enter_; - _read8 = pintfhdl->io_ops._read8; - - r_val = _read8(pintfhdl, addr); - _func_exit_; - return r_val; -} - -u16 rtw_read16(_adapter *adapter, u32 addr) -{ - u16 r_val; - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); - _func_enter_; - _read16 = pintfhdl->io_ops._read16; - - r_val = _read16(pintfhdl, addr); - _func_exit_; - return r_val; -} - -u32 rtw_read32(_adapter *adapter, u32 addr) -{ - u32 r_val; - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); - _func_enter_; - _read32 = pintfhdl->io_ops._read32; - - r_val = _read32(pintfhdl, addr); - _func_exit_; - return r_val; - -} - -void _rtw_write8(_adapter *adapter, u32 addr, u8 val) -{ - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); - _func_enter_; - _write8 = pintfhdl->io_ops._write8; - - _write8(pintfhdl, addr, val); -} -void _rtw_write16(_adapter *adapter, u32 addr, u16 val) -{ - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); - _func_enter_; - _write16 = pintfhdl->io_ops._write16; - - _write16(pintfhdl, addr, val); - _func_exit_; - -} -void _rtw_write32(_adapter *adapter, u32 addr, u32 val) -{ - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); - _func_enter_; - _write32 = pintfhdl->io_ops._write32; - - _write32(pintfhdl, addr, val); - _func_exit_; - -} - -void rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *pdata) -{ - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = (struct intf_hdl*)(&(pio_priv->intf)); - void (*_writeN)(struct intf_hdl *pintfhdl, u32 addr,u32 length, u8 *pdata); - _func_enter_; - _writeN = pintfhdl->io_ops._writeN; - - _writeN(pintfhdl, addr,length,pdata); - _func_exit_; - -} -void rtw_write8_async(_adapter *adapter, u32 addr, u8 val) -{ - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - void (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); - _func_enter_; - _write8_async = pintfhdl->io_ops._write8_async; - - _write8_async(pintfhdl, addr, val); - _func_exit_; - -} -void rtw_write16_async(_adapter *adapter, u32 addr, u16 val) -{ - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - void (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); - _func_enter_; - _write16_async = pintfhdl->io_ops._write16_async; - - _write16_async(pintfhdl, addr, val); - _func_exit_; - -} -void rtw_write32_async(_adapter *adapter, u32 addr, u32 val) -{ - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - void (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); - _func_enter_; - _write32_async = pintfhdl->io_ops._write32_async; - - _write32_async(pintfhdl, addr, val); - _func_exit_; - -} -void rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) -{ - void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _func_enter_; - - if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE)) - { - RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_mem:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); - return; - } - - _read_mem = pintfhdl->io_ops._read_mem; - - _read_mem(pintfhdl, addr, cnt, pmem); - - _func_exit_; - -} - -void rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) -{ - void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _func_enter_; - - _write_mem = pintfhdl->io_ops._write_mem; - - _write_mem(pintfhdl, addr, cnt, pmem); - - _func_exit_; - -} - -void rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) -{ - u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _func_enter_; - - if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE)) - { - RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_port:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); - return; - } - - _read_port = pintfhdl->io_ops._read_port; - - _read_port(pintfhdl, addr, cnt, pmem); - - _func_exit_; - -} - -void read_port_cancel(_adapter *adapter) -{ - void (*_read_port_cancel)(struct intf_hdl *pintfhdl); - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _read_port_cancel = pintfhdl->io_ops._read_port_cancel; - - if(_read_port_cancel) - _read_port_cancel(pintfhdl); - -} - -void rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) -{ - u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _func_enter_; - - _write_port = pintfhdl->io_ops._write_port; - - _write_port(pintfhdl, addr, cnt, pmem); - - _func_exit_; - -} - -void write_port_cancel(_adapter *adapter) -{ - void (*_write_port_cancel)(struct intf_hdl *pintfhdl); - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _write_port_cancel = pintfhdl->io_ops._write_port_cancel; - - if(_write_port_cancel) - _write_port_cancel(pintfhdl); - -} - - -void rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem){ -#ifdef CONFIG_SDIO_HCI - void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _func_enter_; - - _attrib_read= pintfhdl->io_ops._attrib_read; - - _attrib_read(pintfhdl, addr, cnt, pmem); - - _func_exit_; -#endif -} - -void rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem){ -#ifdef CONFIG_SDIO_HCI - void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - struct io_priv *pio_priv = &adapter->iopriv; - struct intf_hdl *pintfhdl = &(pio_priv->intf); - - _func_enter_; - - _attrib_write= pintfhdl->io_ops._attrib_write; - - _attrib_write(pintfhdl, addr, cnt, pmem); - - _func_exit_; - -#endif -} - -int init_io_priv(_adapter *padapter) -{ - void (*set_intf_ops)(struct _io_ops *pops); - struct io_priv *piopriv = &padapter->iopriv; - struct intf_hdl *pintf = &piopriv->intf; - - piopriv->padapter = padapter; - pintf->padapter = padapter; - pintf->pintf_dev = &padapter->dvobjpriv; - - -#ifdef CONFIG_SDIO_HCI - set_intf_ops = &sdio_set_intf_ops; -#endif //END OF CONFIG_SDIO_HCI - - -#ifdef CONFIG_USB_HCI - - if(padapter->chip_type == RTL8188C_8192C) - { -#ifdef CONFIG_RTL8192C - set_intf_ops = &rtl8192cu_set_intf_ops; -#endif - } - else if(padapter->chip_type == RTL8192D) - { -#ifdef CONFIG_RTL8192D - set_intf_ops = &rtl8192du_set_intf_ops; -#endif - } - else - { - set_intf_ops = NULL; - } -#endif //END OF CONFIG_USB_HCI - -#ifdef CONFIG_PCI_HCI - - if(padapter->chip_type == RTL8188C_8192C) - { -#ifdef CONFIG_RTL8192C - set_intf_ops = &rtl8192ce_set_intf_ops; -#endif - } - else if(padapter->chip_type == RTL8192D) - { -#ifdef CONFIG_RTL8192D - set_intf_ops = &rtl8192de_set_intf_ops; -#endif - } - else - { - set_intf_ops = NULL; - } -#endif //END OF CONFIG_PCI_HCI - - - - if(set_intf_ops==NULL) - return _FAIL; - - - set_intf_ops(&pintf->io_ops); - - return _SUCCESS; - -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c deleted file mode 100755 index 156640cf351a..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c +++ /dev/null @@ -1,197 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_IOCTL_QUERY_C_ - -#include -#include -#include -#include -#include - - -#ifdef PLATFORM_WINDOWS -// -// Added for WPA2-PSK, by Annie, 2005-09-20. -// -u8 -query_802_11_capability( - _adapter* Adapter, - u8* pucBuf, - u32 * pulOutLen -) -{ - static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = - { - {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled}, - {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled}, - {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled}, - {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled}, - {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled}, - {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled}, - {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled}, - {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled}, - {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled}, - {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled}, - {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled} - }; - static ULONG ulNumOfPairSupported = sizeof(szAuthEnc)/sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); - NDIS_802_11_CAPABILITY * pCap = (NDIS_802_11_CAPABILITY *)pucBuf; - u8* pucAuthEncryptionSupported = (u8*) pCap->AuthenticationEncryptionSupported; - - - pCap->Length = sizeof(NDIS_802_11_CAPABILITY); - if(ulNumOfPairSupported > 1 ) - pCap->Length += (ulNumOfPairSupported-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); - - pCap->Version = 2; - pCap->NoOfPMKIDs = NUM_PMKID_CACHE; - pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported; - - if( sizeof (szAuthEnc) <= 240 ) // 240 = 256 - 4*4 // SecurityInfo.szCapability: only 256 bytes in size. - { - _rtw_memcpy( pucAuthEncryptionSupported, (u8*)szAuthEnc, sizeof (szAuthEnc) ); - *pulOutLen = pCap->Length; - return _TRUE; - } - else - { - *pulOutLen = 0; - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("_query_802_11_capability(): szAuthEnc size is too large.\n")); - return _FALSE; - } -} - -u8 query_802_11_association_information( _adapter *padapter,PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo) -{ - struct wlan_network *tgt_network; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv *psecuritypriv=&(padapter->securitypriv); - WLAN_BSSID_EX *psecnetwork=(WLAN_BSSID_EX*)&(psecuritypriv->sec_bss); - u8 * pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); - unsigned char i,*auth_ie,*supp_ie; - - //NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); - _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); - //pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); - - //------------------------------------------------------ - // Association Request related information - //------------------------------------------------------ - // Req_1. AvailableRequestFixedIEs - if(psecnetwork!=NULL){ - - pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES|NDIS_802_11_AI_REQFI_CURRENTAPADDRESS; - pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short)* & psecnetwork->IEs[10]; - _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress, - & psecnetwork->MacAddress, 6); - - pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); - - if(check_fwstate( pmlmepriv, _FW_UNDER_LINKING|_FW_LINKED)==_TRUE) - { - - if(psecuritypriv->ndisauthtype>=Ndis802_11AuthModeWPA2) - pDest[0] =48; //RSN Information Element - else - pDest[0] =221; //WPA(SSN) Information Element - - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n Adapter->ndisauthtype==Ndis802_11AuthModeWPA)?0xdd:0x30 [%d]",pDest[0])); - supp_ie=&psecuritypriv->supplicant_ie[0]; - for(i=0;inetwork.IELength=%d\n\n", i,(int)psecnetwork->IELength)); - while((iRequestIELength += (2 + supp_ie[1+i]);// (2 + psecnetwork->IEs[1+i]+4); - - } - - - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n psecnetwork != NULL,fwstate==_FW_UNDER_LINKING \n")); - - } - - - //------------------------------------------------------ - // Association Response related information - //------------------------------------------------------ - - if(check_fwstate( pmlmepriv, _FW_LINKED)==_TRUE) - { - tgt_network =&(pmlmepriv->cur_network); - if(tgt_network!=NULL){ - pAssocInfo->AvailableResponseFixedIEs = - NDIS_802_11_AI_RESFI_CAPABILITIES - |NDIS_802_11_AI_RESFI_ASSOCIATIONID - ; - - pAssocInfo->ResponseFixedIEs.Capabilities =(unsigned short)* & tgt_network->network.IEs[10]; - pAssocInfo->ResponseFixedIEs.StatusCode = 0; - pAssocInfo->ResponseFixedIEs.AssociationId =(unsigned short) tgt_network->aid; - - pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)+pAssocInfo->RequestIELength; - auth_ie=&psecuritypriv->authenticator_ie[0]; - - for(i=0;i0){ - _rtw_memcpy((u8 *)&pDest[0],&auth_ie[1],i); - pAssocInfo->ResponseIELength =i; - } - - - pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; - - - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n tgt_network != NULL,fwstate==_FW_LINKED \n")); - } - } - RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n exit query_802_11_association_information \n")); -_func_exit_; - - return _TRUE; -} -#endif - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c deleted file mode 100755 index 87348a291b4b..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c +++ /dev/null @@ -1,1032 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_IOCTL_RTL_C_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_MP_INCLUDED -#include -#include -#endif - -struct oid_obj_priv oid_rtl_seg_01_01[] = -{ - {1, &oid_null_function}, //0x80 - {1, &oid_null_function}, //0x81 - {1, &oid_null_function}, //0x82 - {1, &oid_null_function}, //0x83//OID_RT_SET_SNIFFER_MODE - {1, &oid_rt_get_signal_quality_hdl}, //0x84 - {1, &oid_rt_get_small_packet_crc_hdl}, //0x85 - {1, &oid_rt_get_middle_packet_crc_hdl}, //0x86 - {1, &oid_rt_get_large_packet_crc_hdl}, //0x87 - {1, &oid_rt_get_tx_retry_hdl}, //0x88 - {1, &oid_rt_get_rx_retry_hdl}, //0x89 - {1, &oid_rt_pro_set_fw_dig_state_hdl}, //0x8A - {1, &oid_rt_pro_set_fw_ra_state_hdl} , //0x8B - {1, &oid_null_function}, //0x8C - {1, &oid_null_function}, //0x8D - {1, &oid_null_function}, //0x8E - {1, &oid_null_function}, //0x8F - {1, &oid_rt_get_rx_total_packet_hdl}, //0x90 - {1, &oid_rt_get_tx_beacon_ok_hdl}, //0x91 - {1, &oid_rt_get_tx_beacon_err_hdl}, //0x92 - {1, &oid_rt_get_rx_icv_err_hdl}, //0x93 - {1, &oid_rt_set_encryption_algorithm_hdl}, //0x94 - {1, &oid_null_function}, //0x95 - {1, &oid_rt_get_preamble_mode_hdl}, //0x96 - {1, &oid_null_function}, //0x97 - {1, &oid_rt_get_ap_ip_hdl}, //0x98 - {1, &oid_rt_get_channelplan_hdl}, //0x99 - {1, &oid_rt_set_preamble_mode_hdl}, //0x9A - {1, &oid_rt_set_bcn_intvl_hdl}, //0x9B - {1, &oid_null_function}, //0x9C - {1, &oid_rt_dedicate_probe_hdl}, //0x9D - {1, &oid_null_function}, //0x9E - {1, &oid_null_function}, //0x9F - {1, &oid_null_function}, //0xA0 - {1, &oid_null_function}, //0xA1 - {1, &oid_null_function}, //0xA2 - {1, &oid_null_function}, //0xA3 - {1, &oid_null_function}, //0xA4 - {1, &oid_null_function}, //0xA5 - {1, &oid_null_function}, //0xA6 - {1, &oid_rt_get_total_tx_bytes_hdl}, //0xA7 - {1, &oid_rt_get_total_rx_bytes_hdl}, //0xA8 - {1, &oid_rt_current_tx_power_level_hdl}, //0xA9 - {1, &oid_rt_get_enc_key_mismatch_count_hdl}, //0xAA - {1, &oid_rt_get_enc_key_match_count_hdl}, //0xAB - {1, &oid_rt_get_channel_hdl}, //0xAC - {1, &oid_rt_set_channelplan_hdl}, //0xAD - {1, &oid_rt_get_hardware_radio_off_hdl}, //0xAE - {1, &oid_null_function}, //0xAF - {1, &oid_null_function}, //0xB0 - {1, &oid_null_function}, //0xB1 - {1, &oid_null_function}, //0xB2 - {1, &oid_null_function}, //0xB3 - {1, &oid_rt_get_key_mismatch_hdl}, //0xB4 - {1, &oid_null_function}, //0xB5 - {1, &oid_null_function}, //0xB6 - {1, &oid_null_function}, //0xB7 - {1, &oid_null_function}, //0xB8 - {1, &oid_null_function}, //0xB9 - {1, &oid_null_function}, //0xBA - {1, &oid_rt_supported_wireless_mode_hdl}, //0xBB - {1, &oid_rt_get_channel_list_hdl}, //0xBC - {1, &oid_rt_get_scan_in_progress_hdl}, //0xBD - {1, &oid_null_function}, //0xBE - {1, &oid_null_function}, //0xBF - {1, &oid_null_function}, //0xC0 - {1, &oid_rt_forced_data_rate_hdl}, //0xC1 - {1, &oid_rt_wireless_mode_for_scan_list_hdl}, //0xC2 - {1, &oid_rt_get_bss_wireless_mode_hdl}, //0xC3 - {1, &oid_rt_scan_with_magic_packet_hdl}, //0xC4 - {1, &oid_null_function}, //0xC5 - {1, &oid_null_function}, //0xC6 - {1, &oid_null_function}, //0xC7 - {1, &oid_null_function}, //0xC8 - {1, &oid_null_function}, //0xC9 - {1, &oid_null_function}, //0xCA - {1, &oid_null_function}, //0xCB - {1, &oid_null_function}, //0xCC - {1, &oid_null_function}, //0xCD - {1, &oid_null_function}, //0xCE - {1, &oid_null_function}, //0xCF - -}; - -struct oid_obj_priv oid_rtl_seg_01_03[] = -{ - {1, &oid_rt_ap_get_associated_station_list_hdl}, //0x00 - {1, &oid_null_function}, //0x01 - {1, &oid_rt_ap_switch_into_ap_mode_hdl}, //0x02 - {1, &oid_null_function}, //0x03 - {1, &oid_rt_ap_supported_hdl}, //0x04 - {1, &oid_rt_ap_set_passphrase_hdl}, //0x05 - -}; - -struct oid_obj_priv oid_rtl_seg_01_11[] = -{ - {1, &oid_null_function}, //0xC0 OID_RT_PRO_RX_FILTER - {1, &oid_null_function}, //0xC1 OID_CE_USB_WRITE_REGISTRY - {1, &oid_null_function}, //0xC2 OID_CE_USB_READ_REGISTRY - {1, &oid_null_function}, //0xC3 OID_RT_PRO_SET_INITIAL_GAIN - {1, &oid_null_function}, //0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE - {1, &oid_null_function}, //0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE - {1, &oid_null_function}, //0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP - {1, &oid_null_function}, //0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP - {1, &oid_rt_pro_rf_write_registry_hdl}, //0xC8 - {1, &oid_rt_pro_rf_read_registry_hdl}, //0xC9 - {1, &oid_null_function} //0xCA OID_RT_PRO_QUERY_RF_TYPE - -}; - -struct oid_obj_priv oid_rtl_seg_03_00[] = -{ - {1, &oid_null_function}, //0x00 - {1, &oid_rt_get_connect_state_hdl}, //0x01 - {1, &oid_null_function}, //0x02 - {1, &oid_null_function}, //0x03 - {1, &oid_rt_set_default_key_id_hdl}, //0x04 - - -}; - - -//************** oid_rtl_seg_01_01 section start ************** - -NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - - _func_enter_; - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql,LOWER); - if(poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) - { - //DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); - if(!rtw_setfwdig_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) - { - status = NDIS_STATUS_NOT_ACCEPTED; - } - - } - else{ - status = NDIS_STATUS_NOT_ACCEPTED; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; -#endif - return status; -} -//----------------------------------------------------------------------------- -NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv) -{ - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - - _func_enter_; - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - - _irqlevel_changed_(&oldirql,LOWER); - - if(poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) - { - //DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); - if(!rtw_setfwra_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) - { - status = NDIS_STATUS_NOT_ACCEPTED; - } - - } - else{ - status = NDIS_STATUS_NOT_ACCEPTED; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; -#endif - return status; -} -//----------------------------------------------------------------------------- -NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - //DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl \n")); - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - -#if 0 - if(pMgntInfo->mAssoc || pMgntInfo->mIbss) - { - ulInfo = pAdapter->RxStats.SignalQuality; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - ulInfo = 0xffffffff; // It stands for -1 in 4-byte integer. - } - break; -#endif - - return status; -} - -//------------------------------------------------------------------------------ - -NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { - *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH; - } - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { - *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH; - } - - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { - *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH; - } - - - return status; -} - -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) - { - *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH; - } - - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len>= sizeof(u32)) - { - //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); - *(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH ; - } - - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG preamblemode = 0 ; - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - if(padapter->registrypriv.preamble == PREAMBLE_LONG) - preamblemode = 0; - else if (padapter->registrypriv.preamble == PREAMBLE_AUTO) - preamblemode = 1; - else if (padapter->registrypriv.preamble == PREAMBLE_SHORT) - preamblemode = 2; - - - *(ULONG *)poid_par_priv->information_buf = preamblemode ; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH ; - } - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - -NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct eeprom_priv* peeprompriv = &padapter->eeprompriv; - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - *(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan ; - - return status; -} -NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct eeprom_priv* peeprompriv = &padapter->eeprompriv; - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf ; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG preamblemode = 0; - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - preamblemode = *(ULONG *)poid_par_priv->information_buf ; - if( preamblemode == 0) - padapter->registrypriv.preamble = PREAMBLE_LONG; - else if (preamblemode==1 ) - padapter->registrypriv.preamble = PREAMBLE_AUTO; - else if ( preamblemode==2 ) - padapter->registrypriv.preamble = PREAMBLE_SHORT; - - *(ULONG *)poid_par_priv->information_buf = preamblemode ; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH ; - } - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH ; - } - - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len>= sizeof(ULONG)) - { - //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); - *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else - { - status = NDIS_STATUS_INVALID_LENGTH ; - } - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - NDIS_802_11_CONFIGURATION *pnic_Config; - - ULONG channelnum; - - _func_enter_; - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) - pnic_Config = &pmlmepriv->cur_network.network.Configuration; - else - pnic_Config = &padapter->registrypriv.dev_network.Configuration; - - channelnum = pnic_Config->DSConfig; - *(ULONG *)poid_par_priv->information_buf = channelnum; - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - _func_exit_; - - - - return status; -} -NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG ulInfo = 0 ; - //DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl \n")); - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if(poid_par_priv->information_buf_len >= sizeof(ULONG)){ - ulInfo |= 0x0100; //WIRELESS_MODE_B - ulInfo |= 0x0200; //WIRELESS_MODE_G - ulInfo |= 0x0400; //WIRELESS_MODE_A - - *(ULONG *) poid_par_priv->information_buf = ulInfo; - //DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo)); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - else{ - status = NDIS_STATUS_INVALID_LENGTH; - } - - return status; -} -NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - - -NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - -NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -//************** oid_rtl_seg_01_01 section end ************** - -//************** oid_rtl_seg_01_03 section start ************** -NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - -//************** oid_rtl_seg_01_03 section end ************** - -//**************** oid_rtl_seg_01_11 section start **************** -NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - _func_enter_; - //DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl \n")); - if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql,LOWER); - if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) - { - //RegOffsetValue - The offset of RF register to write. - //RegDataWidth - The data width of RF register to write. - //RegDataValue - The value to write. - //RegOffsetValue = *((unsigned long*)InformationBuffer); - //RegDataWidth = *((unsigned long*)InformationBuffer+1); - //RegDataValue = *((unsigned long*)InformationBuffer+2); - if(!rtw_setrfreg_cmd(Adapter, - *(unsigned char*)poid_par_priv->information_buf, - (unsigned long)(*((unsigned long*)poid_par_priv->information_buf+2)))) - { - status = NDIS_STATUS_NOT_ACCEPTED; - } - - } - else{ - status = NDIS_STATUS_INVALID_LENGTH; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; - - return status; -} - -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - _func_enter_; - - //DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl \n")); - if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql,LOWER); - if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) - { - if(Adapter->mppriv.act_in_progress == _TRUE) - { - status = NDIS_STATUS_NOT_ACCEPTED; - } - else - { - //init workparam - Adapter->mppriv.act_in_progress = _TRUE; - Adapter->mppriv.workparam.bcompleted= _FALSE; - Adapter->mppriv.workparam.act_type = MPT_READ_RF; - Adapter->mppriv.workparam.io_offset = *(unsigned long*)poid_par_priv->information_buf; - Adapter->mppriv.workparam.io_value = 0xcccccccc; - - //RegOffsetValue - The offset of RF register to read. - //RegDataWidth - The data width of RF register to read. - //RegDataValue - The value to read. - //RegOffsetValue = *((unsigned long*)InformationBuffer); - //RegDataWidth = *((unsigned long*)InformationBuffer+1); - //RegDataValue = *((unsigned long*)InformationBuffer+2); - if(!rtw_getrfreg_cmd(Adapter, - *(unsigned char*)poid_par_priv->information_buf, - (unsigned char*)&Adapter->mppriv.workparam.io_value)) - { - status = NDIS_STATUS_NOT_ACCEPTED; - } - } - - - } - else { - status = NDIS_STATUS_INVALID_LENGTH; - } - _irqlevel_changed_(&oldirql,RAISE); - _func_exit_; -#endif - return status; -} - -//**************** oid_rtl_seg_01_11 section end**************** - - -//************** oid_rtl_seg_03_00 section start ************** -enum _CONNECT_STATE_{ - CHECKINGSTATUS, - ASSOCIATED, - ADHOCMODE, - NOTASSOCIATED -}; - -NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - ULONG ulInfo; - - if(poid_par_priv->type_of_oid != QUERY_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - // nStatus==0 CheckingStatus - // nStatus==1 Associated - // nStatus==2 AdHocMode - // nStatus==3 NotAssociated - - if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) - ulInfo = CHECKINGSTATUS; - else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - ulInfo = ASSOCIATED; - else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)== _TRUE) - ulInfo = ADHOCMODE; - else - ulInfo = NOTASSOCIATED ; - - *(ULONG *)poid_par_priv->information_buf = ulInfo; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - -#if 0 - // Rearrange the order to let the UI still shows connection when scan is in progress - RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("===> Query OID_RT_GET_CONNECT_STATE.\n")); - if(pMgntInfo->mAssoc) - ulInfo = 1; - else if(pMgntInfo->mIbss) - ulInfo = 2; - else if(pMgntInfo->bScanInProgress) - ulInfo = 0; - else - ulInfo = 3; - ulInfoLen = sizeof(ULONG); - RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("<=== Query OID_RT_GET_CONNECT_STATE: %d\n", ulInfo)); -#endif - - return status; -} - -NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if(poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -//************** oid_rtl_seg_03_00 section end ************** diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c deleted file mode 100755 index e73c7159b056..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.c +++ /dev/null @@ -1,1283 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_IOCTL_SET_C_ - - -#include -#include -#include -#include -#include - -#ifdef CONFIG_USB_HCI -#include -#include -#endif -#ifdef CONFIG_SDIO_HCI -#include -#endif - -#include - -extern void indicate_wx_scan_complete_event(_adapter *padapter); - -#define IS_MAC_ADDRESS_BROADCAST(addr) \ -( \ - ( (addr[0] == 0xff) && (addr[1] == 0xff) && \ - (addr[2] == 0xff) && (addr[3] == 0xff) && \ - (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ -) - -u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid) -{ - u8 i; - u8 ret=_TRUE; - -_func_enter_; - - if (ssid->SsidLength > 32) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid length >32\n")); - ret= _FALSE; - goto exit; - } - - /* - * To support various locale like Chinese. - * Don't filter the SSID string. - */ -#if 0 - for(i = 0; i < ssid->SsidLength; i++) - { - //wifi, printable ascii code must be supported - if(!( (ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e) )){ - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid has nonprintabl ascii\n")); - ret= _FALSE; - break; - } - } -#endif - -exit: - -_func_exit_; - - return ret; -} - -u8 rtw_do_join(_adapter * padapter) -{ - _list *plist, *phead; - u8* pibss = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - _queue *queue = &(pmlmepriv->scanned_queue); - u8 ret=_SUCCESS; - - phead = get_list_head(queue); - plist = get_next(phead); - -_func_enter_; - - printk("\n rtw_do_join: phead = %p; plist = %p \n\n\n", phead, plist); - - pmlmepriv->cur_network.join_res = -2; - - set_fwstate(pmlmepriv, _FW_UNDER_LINKING); - - pmlmepriv->pscanned = plist; - - pmlmepriv->to_join = _TRUE; - - if(_rtw_queue_empty(queue)== _TRUE) - { - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - - //when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty - //we try to issue sitesurvey firstly - - if(pmlmepriv->LinkDetectInfo.bBusyTraffic==_FALSE - #ifdef CONFIG_LAYER2_ROAMING - || pmlmepriv->to_roaming >0 - #endif - ) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_do_join(): site survey if scanned_queue is empty\n.")); - // submit site_survey_cmd - if(_SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid)) ) { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_do_join(): site survey return error\n.")); - } - } - - goto exit; - } - else - { - int select_ret; - if((select_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv))==_SUCCESS) - { - pmlmepriv->to_join = _FALSE; - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); - } -#if 0 - else if(ret == 2) - { - DBG_8712("*****UNDER_LINKED WITH SAME NETWORK, RETURN*****\n"); - - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - - } -#endif - else - { - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) - { - // submit createbss_cmd to change to a ADHOC_MASTER - - //pmlmepriv->lock has been acquired by caller... - WLAN_BSSID_EX *pdev_network = &(padapter->registrypriv.dev_network); - - pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; - - pibss = padapter->registrypriv.dev_network.MacAddress; - - _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); - - rtw_update_registrypriv_dev_network(padapter); - - rtw_generate_random_ibss(pibss); - - if(rtw_createbss_cmd(padapter)!=_SUCCESS) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>do_goin: rtw_createbss_cmd status FAIL*** \n ")); - return _FALSE; - } - - pmlmepriv->to_join = _FALSE; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("***Error=> rtw_select_and_join_from_scanned_queue FAIL under STA_Mode*** \n ")); - - } - else - { - // can't associate ; reset under-linking - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - -#if 0 - if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) - { - if(_rtw_memcmp(pmlmepriv->cur_network.network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) - { - // for funk to do roaming - // funk will reconnect, but funk will not sitesurvey before reconnect - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("for funk to do roaming")); - if(pmlmepriv->sitesurveyctrl.traffic_busy==_FALSE) - rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid); - } - - } -#endif - - //when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue - //we try to issue sitesurvey firstly - if(pmlmepriv->LinkDetectInfo.bBusyTraffic==_FALSE - #ifdef CONFIG_LAYER2_ROAMING - || pmlmepriv->to_roaming >0 - #endif - ) - { - //DBG_8192C("rtw_do_join() when no desired bss in scanning queue \n"); - if( _SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid)) ){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("do_join(): site survey return error\n.")); - } - } - - - } - - } - - } - -exit: - -_func_exit_; - - return ret; -} - -#ifdef PLATFORM_WINDOWS -u8 rtw_pnp_set_power_wakeup(_adapter* padapter) -{ - u8 res=_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_wakeup!!!\n")); - - res = rtw_setstandby_cmd(padapter, 0); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_wakeup!!!\n")); - -_func_exit_; - - return res; -} - -u8 rtw_pnp_set_power_sleep(_adapter* padapter) -{ - u8 res=_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("==>rtw_pnp_set_power_sleep!!!\n")); - //DbgPrint("+rtw_pnp_set_power_sleep\n"); - - res = rtw_setstandby_cmd(padapter, 1); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<==rtw_pnp_set_power_sleep!!!\n")); - -_func_exit_; - - return res; -} - -u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults) -{ -_func_enter_; - - switch( reloadDefaults) - { - case Ndis802_11ReloadWEPKeys: - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("SetInfo OID_802_11_RELOAD_DEFAULTS : Ndis802_11ReloadWEPKeys\n")); - break; - } - - // SecClearAllKeys(Adapter); - // 8711 CAM was not for En/Decrypt only - // so, we can't clear all keys. - // should we disable WPAcfg (ox0088) bit 1-2, instead of clear all CAM - - //TO DO... - -_func_exit_; - - return _TRUE; -} - -u8 set_802_11_test(_adapter* padapter, NDIS_802_11_TEST *test) -{ - u8 ret=_TRUE; - -_func_enter_; - - switch(test->Type) - { - case 1: - NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->AuthenticationEvent, test->Length - 8); - NdisMIndicateStatusComplete(padapter->hndis_adapter); - break; - - case 2: - NdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->RssiTrigger, sizeof(NDIS_802_11_RSSI)); - NdisMIndicateStatusComplete(padapter->hndis_adapter); - break; - - default: - ret=_FALSE; - break; - } - -_func_exit_; - - return ret; -} - -u8 rtw_set_802_11_pmkid(_adapter* padapter, NDIS_802_11_PMKID *pmkid) -{ - u8 ret=_SUCCESS; - - return ret; -} - -#endif - -u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid) -{ - _irqL irqL; - u8 status=_TRUE; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - _queue *queue = &pmlmepriv->scanned_queue; - -_func_enter_; - - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_, - ("+rtw_set_802_11_bssid: bssid="MAC_FMT"\n", MAC_ARG(bssid) )); - - if ((bssid[0]==0x00 && bssid[1]==0x00 && bssid[2]==0x00 && bssid[3]==0x00 && bssid[4]==0x00 &&bssid[5]==0x00) || - (bssid[0]==0xFF && bssid[1]==0xFF && bssid[2]==0xFF && bssid[3]==0xFF && bssid[4]==0xFF &&bssid[5]==0xFF)) - { - status = _FALSE; - return status; - } - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("Set BSSID is not allowed under surveying || adhoc master || under linking, fw_state=0x%08x\n", - get_fwstate(pmlmepriv))); - status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); - goto _Abort_Set_BSSID; - } - - if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n")); - - if (_rtw_memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN) == _TRUE) - { - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE) - goto _Abort_Set_BSSID;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. - } else { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set BSSID not the same ssid\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_bssid="MAC_FMT"\n", MAC_ARG(bssid) )); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("cur_bssid="MAC_FMT"\n", MAC_ARG(pmlmepriv->cur_network.network.MacAddress) )); - - rtw_disassoc_cmd(padapter); - - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); - - rtw_free_assoc_resources(padapter); - - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { - _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - } - } - } - - _rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN); - - pmlmepriv->assoc_by_bssid=_TRUE; - - status = rtw_do_join(padapter); - - goto done; - -_Abort_Set_BSSID: - - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("rtw_set_802_11_bssid: _Abort_Set_BSSID\n")); - -done: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - -_func_exit_; - - return status; -} - -u8 rtw_set_802_11_ssid(_adapter* padapter, NDIS_802_11_SSID *ssid) -{ - _irqL irqL; - u8 status = _TRUE; - int timeout = 50; - - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *pnetwork = &pmlmepriv->cur_network; - _queue *queue = &pmlmepriv->scanned_queue; - -#ifdef PLATFORM_WINDOWS - LARGE_INTEGER sys_time; - u32 diff_time,cur_time ; -#endif - - -_func_enter_; - - //printk("+rtw_set_802_11_ssid: ssid=[%s] fw_state=0x%08x\n", - // ssid->Ssid, get_fwstate(pmlmepriv)); - - if(padapter->hw_init_completed==_FALSE){ - printk("%s: set_ssid: hw_init_completed==_FALSE=>exit!!!\n", __func__); - return _FALSE; - } - - //_enter_critical_bh(&pmlmepriv->lock, &irqL); - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { - printk("%s: Set SSID is not allowed in _FW_UNDER_LINKING\n", __func__); - status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); - //goto _Abort_Set_SSID; - return status; - } - - while (timeout-- > 0) - { - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _FALSE) - break; - - msleep(100); - } - - if (timeout <= 0) - { - printk("%s: Set SSID is not allowed under surveying\n", __func__); - status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); - goto _Abort_Set_SSID; - } -#if 0 - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) { - printk("%s: Set SSID is not allowed under surveying || adhoc master || under linking\n", __func__); - status = check_fwstate(pmlmepriv, _FW_UNDER_LINKING); - goto _Abort_Set_SSID; - } -#endif - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - ("set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n")); - - if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) && - (_rtw_memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength) == _TRUE)) - { - if((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("Set SSID is the same ssid, fw_state=0x%08x\n", - get_fwstate(pmlmepriv))); - - if(rtw_is_same_ibss(padapter, pnetwork) == _FALSE) - { - //if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again - rtw_disassoc_cmd(padapter); - - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); - - rtw_free_assoc_resources(padapter); - - if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) { - _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - } - } - else - { - //printk("it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again.\n"); - goto _Abort_Set_SSID;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. - } - } -#ifdef CONFIG_LPS - else { - rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1); - } -#endif - } - else - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("Set SSID not the same ssid\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_ssid=[%s] len=0x%x\n", ssid->Ssid, (unsigned int)ssid->SsidLength)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("assoc_ssid=[%s] len=0x%x\n", pmlmepriv->assoc_ssid.Ssid, (unsigned int)pmlmepriv->assoc_ssid.SsidLength)); - - rtw_disassoc_cmd(padapter); - - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); - - rtw_free_assoc_resources(padapter); - - if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) { - _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - } - } - } - -#ifdef PLATFORM_LINUX - if (padapter->securitypriv.btkip_countermeasure == _TRUE) { - printk("%s: btkip_countermeasure == _TRUE.\n", __func__); - status = _FALSE; - goto _Abort_Set_SSID; - } -#endif - - if (rtw_validate_ssid(ssid) == _FALSE) { - printk("%s: rtw_validate_ssid fail.\n", __func__); - status = _FALSE; - goto _Abort_Set_SSID; - } - - _rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID)); - - pmlmepriv->assoc_by_bssid=_FALSE; - - status = rtw_do_join(padapter); - if (status == _FALSE) - printk("%s: rtw_do_join fail\n", __func__); - - goto done; - -_Abort_Set_SSID: - - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - ("-rtw_set_802_11_ssid: _Abort_Set_SSID: status=%d\n", status)); - -done: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - -_func_exit_; - - return status; - -} - -u8 rtw_set_802_11_infrastructure_mode(_adapter* padapter, - NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - NDIS_802_11_NETWORK_INFRASTRUCTURE* pold_state = &(cur_network->network.InfrastructureMode); - -_func_enter_; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_notice_, - ("+rtw_set_802_11_infrastructure_mode: old=%d new=%d fw_state=0x%08x\n", - *pold_state, networktype, get_fwstate(pmlmepriv))); - - if(*pold_state != networktype) - { - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(" change mode!")); - //DBG_871X("change mode, old_mode=%d, new_mode=%d, fw_state=0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); - - if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) ||(*pold_state==Ndis802_11IBSS)) - rtw_disassoc_cmd(padapter); - - if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)== _TRUE) ) - rtw_free_assoc_resources(padapter); - - - if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) || (*pold_state==Ndis802_11Infrastructure) ||(*pold_state==Ndis802_11IBSS)) - { - rtw_indicate_disconnect(padapter); //will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not - } - - if(*pold_state==Ndis802_11APMode) - { - //change to other mode from Ndis802_11APMode - cur_network->join_res = -1; - -#ifdef CONFIG_NATIVEAP_MLME - stop_ap_mode(padapter); -#endif - } - - *pold_state = networktype; - - // clear WIFI_STATION_STATE; WIFI_AP_STATE; WIFI_ADHOC_STATE; WIFI_ADHOC_MASTER_STATE - //pmlmepriv->fw_state &= 0xffffff87; - _clr_fwstate_(pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE); - - switch(networktype) - { - case Ndis802_11IBSS: - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - break; - - case Ndis802_11Infrastructure: - set_fwstate(pmlmepriv, WIFI_STATION_STATE); - break; - - case Ndis802_11APMode: - set_fwstate(pmlmepriv, WIFI_AP_STATE); -#ifdef CONFIG_NATIVEAP_MLME - start_ap_mode(padapter); - //rtw_indicate_connect(padapter); -#endif - - break; - - case Ndis802_11AutoUnknown: - case Ndis802_11InfrastructureMax: - break; - } - - //SecClearAllKeys(adapter); - - //RT_TRACE(COMP_OID_SET, DBG_LOUD, ("set_infrastructure: fw_state:%x after changing mode\n", - // get_fwstate(pmlmepriv) )); - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - } - -_func_exit_; - - return _TRUE; -} - - -u8 rtw_set_802_11_disassociate(_adapter *padapter) -{ - _irqL irqL; - struct mlme_priv * pmlmepriv = &padapter->mlmepriv; - -_func_enter_; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\n")); - - rtw_disassoc_cmd(padapter); - rtw_indicate_disconnect(padapter); - rtw_free_assoc_resources(padapter); - } - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - -_func_exit_; - - return _TRUE; -} - -u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - u8 res=_TRUE; - -_func_enter_; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("+rtw_set_802_11_bssid_list_scan(), fw_state=%x\n", get_fwstate(pmlmepriv))); - - if (padapter == NULL) { - res=_FALSE; - goto exit; - } - if (padapter->hw_init_completed==_FALSE){ - res = _FALSE; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n===rtw_set_802_11_bssid_list_scan:hw_init_completed==_FALSE===\n")); - goto exit; - } - - if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || - (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) - { - // Scan or linking is in progress, do nothing. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_bssid_list_scan fail since fw_state = %x\n", get_fwstate(pmlmepriv))); - res = _TRUE; - - if(check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###_FW_UNDER_SURVEY|_FW_UNDER_LINKING\n\n")); - } else { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n###pmlmepriv->sitesurveyctrl.traffic_busy==_TRUE\n\n")); - } - } else { - NDIS_802_11_SSID ssid; - - #ifdef CONFIG_SET_SCAN_DENY_TIMER - if(ATOMIC_READ(&pmlmepriv->set_scan_deny)==1){ - DBG_871X("%s:%d CONFIG_SET_SCAN_DENY_TIMER deny scan\n", __FUNCTION__, __LINE__); - indicate_wx_scan_complete_event(padapter); - return _SUCCESS; - } - #endif - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - _rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID)); - - res = rtw_sitesurvey_cmd(padapter, &ssid); - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - } -exit: - -_func_exit_; - - return res; -} - -u8 rtw_set_802_11_authentication_mode(_adapter* padapter, NDIS_802_11_AUTHENTICATION_MODE authmode) -{ - struct security_priv *psecuritypriv = &padapter->securitypriv; - int res; - u8 ret; - -_func_enter_; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("set_802_11_auth.mode(): mode=%x\n", authmode)); - - psecuritypriv->ndisauthtype=authmode; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_authentication_mode:psecuritypriv->ndisauthtype=%d", psecuritypriv->ndisauthtype)); - - if(psecuritypriv->ndisauthtype>3) - psecuritypriv->dot11AuthAlgrthm=dot11AuthAlgrthm_8021X; - - res=rtw_set_auth(padapter,psecuritypriv); - - if(res==_SUCCESS) - ret=_TRUE; - else - ret=_FALSE; - -_func_exit_; - - return ret; -} - -u8 rtw_set_802_11_add_wep(_adapter* padapter, NDIS_802_11_WEP *wep){ - - u8 bdefaultkey; - u8 btransmitkey; - sint keyid,res; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - u8 ret=_SUCCESS; - -_func_enter_; - - bdefaultkey=(wep->KeyIndex & 0x40000000) > 0 ? _FALSE : _TRUE; //for ??? - btransmitkey= (wep->KeyIndex & 0x80000000) > 0 ? _TRUE : _FALSE; //for ??? - keyid=wep->KeyIndex & 0x3fffffff; - - if(keyid>4) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MgntActrtw_set_802_11_add_wep:keyid>4=>fail\n")); - ret=_FALSE; - goto exit; - } - - switch(wep->KeyLength) - { - case 5: - psecuritypriv->dot11PrivacyAlgrthm=_WEP40_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=5\n")); - break; - case 13: - psecuritypriv->dot11PrivacyAlgrthm=_WEP104_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength=13\n")); - break; - default: - psecuritypriv->dot11PrivacyAlgrthm=_NO_PRIVACY_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_add_wep:wep->KeyLength!=5 or 13\n")); - break; - } - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:befor memcpy, wep->KeyLength=0x%x wep->KeyIndex=0x%x keyid =%x\n",wep->KeyLength,wep->KeyIndex,keyid)); - - _rtw_memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]),&(wep->KeyMaterial),wep->KeyLength); - - psecuritypriv->dot11DefKeylen[keyid]=wep->KeyLength; - - psecuritypriv->dot11PrivacyKeyIndex=keyid; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_wep:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x \n", - psecuritypriv->dot11DefKey[keyid].skey[0],psecuritypriv->dot11DefKey[keyid].skey[1],psecuritypriv->dot11DefKey[keyid].skey[2], - psecuritypriv->dot11DefKey[keyid].skey[3],psecuritypriv->dot11DefKey[keyid].skey[4],psecuritypriv->dot11DefKey[keyid].skey[5], - psecuritypriv->dot11DefKey[keyid].skey[6],psecuritypriv->dot11DefKey[keyid].skey[7],psecuritypriv->dot11DefKey[keyid].skey[8], - psecuritypriv->dot11DefKey[keyid].skey[9],psecuritypriv->dot11DefKey[keyid].skey[10],psecuritypriv->dot11DefKey[keyid].skey[11], - psecuritypriv->dot11DefKey[keyid].skey[12])); - - res=rtw_set_key(padapter,psecuritypriv, keyid, 1); - - if(res==_FAIL) - ret= _FALSE; -exit: - -_func_exit_; - - return ret; - -} - -u8 rtw_set_802_11_remove_wep(_adapter* padapter, u32 keyindex){ - - u8 ret=_SUCCESS; - -_func_enter_; - - if (keyindex >= 0x80000000 || padapter == NULL){ - - ret=_FALSE; - goto exit; - - } - else - { - int res; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - if( keyindex < 4 ){ - - _rtw_memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16); - - res=rtw_set_key(padapter,psecuritypriv,keyindex, 0); - - psecuritypriv->dot11DefKeylen[keyindex]=0; - - if(res==_FAIL) - ret=_FAIL; - - } - else - { - ret=_FAIL; - } - - } - -exit: - -_func_exit_; - - return ret; - -} - -u8 rtw_set_802_11_add_key(_adapter* padapter, NDIS_802_11_KEY *key){ - - uint encryptionalgo; - u8 * pbssid; - struct sta_info *stainfo; - u8 bgroup = _FALSE; - u8 bgrouptkey = _FALSE;//can be remove later - u8 ret=_SUCCESS; - -_func_enter_; - - if (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)){ - - // It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination, - // it must fail the request and return NDIS_STATUS_INVALID_DATA. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: ((key->KeyIndex & 0x80000000) == 0)[=%d] ",(int)(key->KeyIndex & 0x80000000) == 0)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key:((key->KeyIndex & 0x40000000) > 0)[=%d]" , (int)(key->KeyIndex & 0x40000000) > 0)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("rtw_set_802_11_add_key: key->KeyIndex=%d \n" ,(int)key->KeyIndex)); - ret= _FAIL; - goto exit; - } - - if(key->KeyIndex & 0x40000000) - { - // Pairwise key - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Pairwise key +++++\n")); - - pbssid=get_bssid(&padapter->mlmepriv); - stainfo=rtw_get_stainfo(&padapter->stapriv, pbssid); - - if((stainfo!=NULL)&&(padapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:( stainfo!=NULL)&&(Adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\n")); - encryptionalgo=stainfo->dot118021XPrivacy; - } - else{ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: stainfo==NULL)||(Adapter->securitypriv.dot11AuthAlgrthm!=dot11AuthAlgrthm_8021X)\n")); - encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm; - } - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (encryptionalgo ==%d)!\n",encryptionalgo )); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11PrivacyAlgrthm ==%d)!\n",padapter->securitypriv.dot11PrivacyAlgrthm)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11AuthAlgrthm ==%d)!\n",padapter->securitypriv.dot11AuthAlgrthm)); - - if((stainfo!=NULL)){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("rtw_set_802_11_add_key: (stainfo->dot118021XPrivacy ==%d)!\n", stainfo->dot118021XPrivacy)); - } - - if(key->KeyIndex & 0x000000FF){ - // The key index is specified in the lower 8 bits by values of zero to 255. - // The key index should be set to zero for a Pairwise key, and the driver should fail with - // NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" key->KeyIndex & 0x000000FF.\n")); - ret= _FAIL; - goto exit; - } - - // check BSSID - if (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _TRUE){ - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("MacAddr_isBcst(key->BSSID)\n")); - ret= _FALSE; - goto exit; - } - - // Check key length for TKIP. - //if(encryptionAlgorithm == RT_ENC_TKIP_ENCRYPTION && key->KeyLength != 32) - if((encryptionalgo== _TKIP_)&& (key->KeyLength != 32)){ - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("TKIP KeyLength:0x%x != 32\n", key->KeyLength)); - ret=_FAIL; - goto exit; - - } - - // Check key length for AES. - if((encryptionalgo== _AES_)&& (key->KeyLength != 16)) { - // For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case. - if(key->KeyLength == 32) { - key->KeyLength = 16; - } else { - ret= _FAIL; - goto exit; - } - } - - // Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko. - if( (encryptionalgo== _WEP40_|| encryptionalgo== _WEP104_) && (key->KeyLength != 5 || key->KeyLength != 13)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("WEP KeyLength:0x%x != 5 or 13\n", key->KeyLength)); - ret=_FAIL; - goto exit; - } - - bgroup = _FALSE; - - // Check the pairwise key. Added by Annie, 2005-07-06. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Pairwise Key set]\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3))); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength)); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - - } - else - { - // Group key - KeyIndex(BIT30==0) - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ Group key +++++\n")); - - - // when add wep key through add key and didn't assigned encryption type before - if((padapter->securitypriv.ndisauthtype<=3)&&(padapter->securitypriv.dot118021XGrpPrivacy==0)) - { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("keylen=%d( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )padapter->securitypriv.dot118021XGrpPrivacy(%x)\n", key->KeyLength,padapter->securitypriv.dot11PrivacyAlgrthm,padapter->securitypriv.dot118021XGrpPrivacy)); - - switch(key->KeyLength) - { - case 5: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); - break; - case 13: - padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); - break; - default: - padapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u \n", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength)); - break; - } - - encryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" Adapter->securitypriv.dot11PrivacyAlgrthm=%x\n", padapter->securitypriv.dot11PrivacyAlgrthm)); - - } - else - { - encryptionalgo=padapter->securitypriv.dot118021XGrpPrivacy; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("( Adapter->securitypriv.dot11PrivacyAlgrthm=%x )encryptionalgo(%x)=padapter->securitypriv.dot118021XGrpPrivacy(%x)keylen=%d\n", padapter->securitypriv.dot11PrivacyAlgrthm,encryptionalgo,padapter->securitypriv.dot118021XGrpPrivacy,key->KeyLength)); - - } - - if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE) && (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _FALSE)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" IBSS but BSSID is not Broadcast Address.\n")); - ret= _FAIL; - goto exit; - } - - // Check key length for TKIP - if((encryptionalgo== _TKIP_) && (key->KeyLength != 32)) { - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(" TKIP GTK KeyLength:%u != 32\n", key->KeyLength)); - ret= _FAIL; - goto exit; - - } else if(encryptionalgo== _AES_ && (key->KeyLength != 16 && key->KeyLength != 32) ) { - - // Check key length for AES - // For NDTEST, we allow keylen=32 in this case. 2005.01.27, by rcnjko. - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("<=== SetInfo, OID_802_11_ADD_KEY: AES GTK KeyLength:%u != 16 or 32\n", key->KeyLength)); - ret= _FAIL; - goto exit; - } - - // Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03. - if((encryptionalgo== _AES_) && (key->KeyLength == 32) ) { - key->KeyLength = 16; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("AES key length changed: %u\n", key->KeyLength) ); - } - - if(key->KeyIndex & 0x8000000) {//error ??? 0x8000_0000 - bgrouptkey = _TRUE; - } - - if((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE)&&(check_fwstate(&padapter->mlmepriv, _FW_LINKED)==_TRUE)) - { - bgrouptkey = _TRUE; - } - - bgroup = _TRUE; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n") ); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("[Group Key set]\n") ); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")) ; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key index: 0x%8x(0x%8x)\n", key->KeyIndex,(key->KeyIndex&0x3))); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("key Length: %d\n", key->KeyLength)) ; - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("------------------------------------------\n")); - - } - - // If WEP encryption algorithm, just call rtw_set_802_11_add_wep(). - if((padapter->securitypriv.dot11AuthAlgrthm !=dot11AuthAlgrthm_8021X)&&(encryptionalgo== _WEP40_ || encryptionalgo== _WEP104_)) - { - u8 ret; - u32 keyindex; - u32 len = FIELD_OFFSET(NDIS_802_11_KEY, KeyMaterial) + key->KeyLength; - NDIS_802_11_WEP *wep = &padapter->securitypriv.ndiswep; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ WEP key +++++\n")); - - wep->Length = len; - keyindex = key->KeyIndex&0x7fffffff; - wep->KeyIndex = keyindex ; - wep->KeyLength = key->KeyLength; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY:Before memcpy \n")); - - _rtw_memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength); - _rtw_memcpy(&(padapter->securitypriv.dot11DefKey[keyindex].skey[0]), key->KeyMaterial, key->KeyLength); - - padapter->securitypriv.dot11DefKeylen[keyindex]=key->KeyLength; - padapter->securitypriv.dot11PrivacyKeyIndex=keyindex; - - ret = rtw_set_802_11_add_wep(padapter, wep); - - goto exit; - - } - - if(key->KeyIndex & 0x20000000){ - // SetRSC - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("OID_802_11_ADD_KEY: +++++ SetRSC+++++\n")); - if(bgroup == _TRUE) - { - NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL; - _rtw_memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8); - } - else - { - NDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL; - _rtw_memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8); - } - - } - - // Indicate this key idx is used for TX - // Save the key in KeyMaterial - if(bgroup == _TRUE) // Group transmit key - { - int res; - - if(bgrouptkey == _TRUE) - { - padapter->securitypriv.dot118021XGrpKeyid=(u8)key->KeyIndex; - } - - if((key->KeyIndex&0x3) == 0){ - ret = _FAIL; - goto exit; - } - - _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], 0, 16); - _rtw_memset(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); - _rtw_memset(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16); - - if((key->KeyIndex & 0x10000000)) - { - _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); - _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7])); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n")); - - } - else - { - _rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8); - _rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5], - padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7])); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n")); - - } - - //set group key by index - _rtw_memcpy(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial, key->KeyLength); - - key->KeyIndex=key->KeyIndex & 0x03; - - padapter->securitypriv.binstallGrpkey=_TRUE; - - padapter->securitypriv.bcheck_grpkey=_FALSE; - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("reset group key")); - - res=rtw_set_key(padapter,&padapter->securitypriv, key->KeyIndex, 1); - - if(res==_FAIL) - ret= _FAIL; - - goto exit; - - } - else // Pairwise Key - { - u8 res; - - pbssid=get_bssid(&padapter->mlmepriv); - stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid ); - - if(stainfo!=NULL) - { - _rtw_memset( &stainfo->dot118021x_UncstKey, 0, 16);// clear keybuffer - - _rtw_memcpy(&stainfo->dot118021x_UncstKey, key->KeyMaterial, 16); - - if(encryptionalgo== _TKIP_) - { - padapter->securitypriv.busetkipkey=_FALSE; - - //_set_timer(&padapter->securitypriv.tkip_timer, 50); - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n ==========_set_timer\n")); - - // if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255] - if((key->KeyIndex & 0x10000000)){ - _rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 16, 8); - _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 24, 8); - - } else { - _rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 24, 8); - _rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 16, 8); - - } - - } - else if(encryptionalgo == _AES_) - { - - } - - - //Set key to CAM through H2C command - if(bgrouptkey)//never go to here - { - res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _FALSE); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n")); - } - else{ - res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _TRUE); - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n")); - } - - if(res ==_FALSE) - ret= _FAIL; - - } - - } - -exit: - -_func_exit_; - - return ret; -} - -u8 rtw_set_802_11_remove_key(_adapter* padapter, NDIS_802_11_REMOVE_KEY *key){ - - uint encryptionalgo; - u8 * pbssid; - struct sta_info *stainfo; - u8 bgroup = (key->KeyIndex & 0x4000000) > 0 ? _FALSE: _TRUE; - u8 keyIndex = (u8)key->KeyIndex & 0x03; - u8 ret=_SUCCESS; - -_func_enter_; - - if ((key->KeyIndex & 0xbffffffc) > 0) { - ret=_FAIL; - goto exit; - } - - if (bgroup == _TRUE) { - encryptionalgo= padapter->securitypriv.dot118021XGrpPrivacy; - // clear group key by index - //NdisZeroMemory(Adapter->MgntInfo.SecurityInfo.KeyBuf[keyIndex], MAX_WEP_KEY_LEN); - //Adapter->MgntInfo.SecurityInfo.KeyLen[keyIndex] = 0; - - _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[keyIndex], 0, 16); - - //! \todo Send a H2C Command to Firmware for removing this Key in CAM Entry. - - } else { - - pbssid=get_bssid(&padapter->mlmepriv); - stainfo=rtw_get_stainfo(&padapter->stapriv , pbssid ); - if(stainfo !=NULL){ - encryptionalgo=stainfo->dot118021XPrivacy; - - // clear key by BSSID - _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16); - - //! \todo Send a H2C Command to Firmware for disable this Key in CAM Entry. - - } - else{ - ret= _FAIL; - goto exit; - } - } - -exit: - -_func_exit_; - - return _TRUE; - -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mlme.c b/drivers/net/wireless/rtl8192c/core/rtw_mlme.c deleted file mode 100755 index 0da81194e57b..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_mlme.c +++ /dev/null @@ -1,3678 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_MLME_C_ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern void indicate_wx_scan_complete_event(_adapter *padapter); -extern u8 rtw_do_join(_adapter * padapter); - -sint _rtw_init_mlme_priv (_adapter* padapter) -{ - sint i; - u8 *pbuf; - extern char init_channel_plan;// wifi_power.c (add by gwl) - struct wlan_network *pnetwork; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - sint res = _SUCCESS; - -_func_enter_; - - _rtw_memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv)); - pmlmepriv->nic_hdl = (u8 *)padapter; - - pmlmepriv->pscanned = NULL; - pmlmepriv->fw_state = 0; - pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; - pmlmepriv->scan_mode=SCAN_ACTIVE;// 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) - pmlmepriv->ChannelPlan = init_channel_plan; //initialize channel plan parameter (add by gwl) - - _rtw_spinlock_init(&(pmlmepriv->lock)); - _rtw_init_queue(&(pmlmepriv->free_bss_pool)); - _rtw_init_queue(&(pmlmepriv->scanned_queue)); - - set_scanned_network_val(pmlmepriv, 0); - - _rtw_memset(&pmlmepriv->assoc_ssid,0,sizeof(NDIS_802_11_SSID)); - - pbuf = rtw_zvmalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); - - if (pbuf == NULL){ - res=_FAIL; - goto exit; - } - pmlmepriv->free_bss_buf = pbuf; - - pnetwork = (struct wlan_network *)pbuf; - - for(i = 0; i < MAX_BSS_CNT; i++) - { - _rtw_init_listhead(&(pnetwork->list)); - - rtw_list_insert_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue)); - - pnetwork++; - } - - //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf - - #ifdef CONFIG_SET_SCAN_DENY_TIMER - ATOMIC_SET(&pmlmepriv->set_scan_deny, 0); - #endif - - rtw_init_mlme_timer(padapter); - -exit: - -_func_exit_; - - return res; -} - -void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv) -{ - _rtw_spinlock_free(&pmlmepriv->lock); - _rtw_spinlock_free(&(pmlmepriv->free_bss_pool.lock)); - _rtw_spinlock_free(&(pmlmepriv->scanned_queue.lock)); -} - -void _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) -{ -_func_enter_; - - if(pmlmepriv){ - rtw_mfree_mlme_priv_lock (pmlmepriv); - - if (pmlmepriv->free_bss_buf) { - rtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network)); - } - } -_func_exit_; -} - -sint _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) -{ - _irqL irqL; - -_func_enter_; - - if (pnetwork == NULL) - goto exit; - - _enter_critical_bh(&queue->lock, &irqL); - - rtw_list_insert_tail(&pnetwork->list, &queue->queue); - - _exit_critical_bh(&queue->lock, &irqL); - -exit: - -_func_exit_; - - return _SUCCESS; -} - -struct wlan_network *_rtw_dequeue_network(_queue *queue) -{ - _irqL irqL; - - struct wlan_network *pnetwork; - -_func_enter_; - - _enter_critical_bh(&queue->lock, &irqL); - - if (_rtw_queue_empty(queue) == _TRUE) - - pnetwork = NULL; - - else - { - pnetwork = LIST_CONTAINOR(get_next(&queue->queue), struct wlan_network, list); - - rtw_list_delete(&(pnetwork->list)); - } - - _exit_critical_bh(&queue->lock, &irqL); - -_func_exit_; - - return pnetwork; -} - -struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) -{ - _irqL irqL; - struct wlan_network *pnetwork; - _queue *free_queue = &pmlmepriv->free_bss_pool; - _list* plist = NULL; - -_func_enter_; - - _enter_critical_bh(&free_queue->lock, &irqL); - - if (_rtw_queue_empty(free_queue) == _TRUE) { - pnetwork=NULL; - goto exit; - } - plist = get_next(&(free_queue->queue)); - - pnetwork = LIST_CONTAINOR(plist , struct wlan_network, list); - - rtw_list_delete(&pnetwork->list); - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("_rtw_alloc_network: ptr=%p\n", plist)); - pnetwork->network_type = 0; - pnetwork->fixed = _FALSE; - pnetwork->last_scanned = rtw_get_current_time(); - pnetwork->aid=0; - pnetwork->join_res=0; - - pmlmepriv->num_of_scanned ++; - -exit: - _exit_critical_bh(&free_queue->lock, &irqL); - -_func_exit_; - - return pnetwork; -} - -void _rtw_free_network(struct mlme_priv *pmlmepriv ,struct wlan_network *pnetwork, u8 isfreeall) -{ - u32 curr_time, delta_time; - u32 lifetime = SCANQUEUE_LIFETIME; - _irqL irqL; - _queue *free_queue = &(pmlmepriv->free_bss_pool); - -_func_enter_; - - if (pnetwork == NULL) - goto exit; - - if (pnetwork->fixed == _TRUE) - goto exit; - - curr_time = rtw_get_current_time(); - - if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) - lifetime = 1; - - if(!isfreeall) - { -#ifdef PLATFORM_WINDOWS - - delta_time = (curr_time -pnetwork->last_scanned)/10; - - if(delta_time < lifetime*1000000)// unit:usec - { - goto exit; - } - -#endif - -#ifdef PLATFORM_LINUX - - delta_time = (curr_time -pnetwork->last_scanned)/HZ; - - if(delta_time < lifetime)// unit:sec - { - goto exit; - } - -#endif - } - - _enter_critical_bh(&free_queue->lock, &irqL); - - rtw_list_delete(&(pnetwork->list)); - - rtw_list_insert_tail(&(pnetwork->list),&(free_queue->queue)); - - pmlmepriv->num_of_scanned --; - - - //DBG_871X("_rtw_free_network:SSID=%s\n", pnetwork->network.Ssid.Ssid); - - _exit_critical_bh(&free_queue->lock, &irqL); - -exit: - -_func_exit_; - -} - -void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork) -{ - - _queue *free_queue = &(pmlmepriv->free_bss_pool); - -_func_enter_; - - if (pnetwork == NULL) - goto exit; - - if (pnetwork->fixed == _TRUE) - goto exit; - - //_enter_critical(&free_queue->lock, &irqL); - - rtw_list_delete(&(pnetwork->list)); - - rtw_list_insert_tail(&(pnetwork->list), get_list_head(free_queue)); - - pmlmepriv->num_of_scanned --; - - //_exit_critical(&free_queue->lock, &irqL); - -exit: - -_func_exit_; - -} - - -/* - return the wlan_network with the matching addr - - Shall be calle under atomic context... to avoid possible racing condition... -*/ -struct wlan_network *_rtw_find_network(_queue *scanned_queue, u8 *addr) -{ - - _irqL irqL; - _list *phead, *plist; - struct wlan_network *pnetwork = NULL; - u8 zero_addr[ETH_ALEN] = {0,0,0,0,0,0}; - -_func_enter_; - - if(_rtw_memcmp(zero_addr, addr, ETH_ALEN)){ - pnetwork=NULL; - goto exit; - } - - _enter_critical_bh(&scanned_queue->lock, &irqL); - - phead = get_list_head(scanned_queue); - plist = get_next(phead); - - while (plist != phead) - { - pnetwork = LIST_CONTAINOR(plist, struct wlan_network ,list); - - if (_rtw_memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE) - break; - - plist = get_next(plist); - } - - if(plist == phead) - pnetwork = NULL; - - _exit_critical_bh(&scanned_queue->lock, &irqL); - -exit: - -_func_exit_; - - return pnetwork; - -} - - -void _rtw_free_network_queue(_adapter *padapter, u8 isfreeall) -{ - _irqL irqL; - _list *phead, *plist; - struct wlan_network *pnetwork; - struct mlme_priv* pmlmepriv = &padapter->mlmepriv; - _queue *scanned_queue = &pmlmepriv->scanned_queue; - _queue *free_queue = &pmlmepriv->free_bss_pool; - u8 *mybssid = get_bssid(pmlmepriv); - -_func_enter_; - - - _enter_critical_bh(&scanned_queue->lock, &irqL); - - phead = get_list_head(scanned_queue); - plist = get_next(phead); - - while (rtw_end_of_queue_search(phead, plist) == _FALSE) - { - - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - - plist = get_next(plist); - - _rtw_free_network(pmlmepriv,pnetwork, isfreeall); - - } - - _exit_critical_bh(&scanned_queue->lock, &irqL); - -_func_exit_; - -} - - - - -sint rtw_if_up(_adapter *padapter) { - - sint res; -_func_enter_; - - if( padapter->bDriverStopped || padapter->bSurpriseRemoved || - (check_fwstate(&padapter->mlmepriv, _FW_LINKED)== _FALSE)){ - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_if_up:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - res=_FALSE; - } - else - res= _TRUE; - -_func_exit_; - return res; -} - - -void rtw_generate_random_ibss(u8* pibss) -{ - u32 curtime = rtw_get_current_time(); - -_func_enter_; - pibss[0] = 0x02; //in ad-hoc mode bit1 must set to 1 - pibss[1] = 0x11; - pibss[2] = 0x87; - pibss[3] = (u8)(curtime & 0xff) ;//p[0]; - pibss[4] = (u8)((curtime>>8) & 0xff) ;//p[1]; - pibss[5] = (u8)((curtime>>16) & 0xff) ;//p[2]; -_func_exit_; - return; -} - -u8 *rtw_get_capability_from_ie(u8 *ie) -{ - return (ie + 8 + 2); -} - - -u16 rtw_get_capability(WLAN_BSSID_EX *bss) -{ - u16 val; -_func_enter_; - - _rtw_memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2); - -_func_exit_; - return le16_to_cpu(val); -} - -u8 *rtw_get_timestampe_from_ie(u8 *ie) -{ - return (ie + 0); -} - -u8 *rtw_get_beacon_interval_from_ie(u8 *ie) -{ - return (ie + 8); -} - - -int rtw_init_mlme_priv (_adapter *padapter)//(struct mlme_priv *pmlmepriv) -{ - int res; -_func_enter_; - res = _rtw_init_mlme_priv(padapter);// (pmlmepriv); -_func_exit_; - return res; -} - -void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) -{ -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_mlme_priv\n")); - _rtw_free_mlme_priv (pmlmepriv); -_func_exit_; -} - -int rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) -{ - int res; -_func_enter_; - res = _rtw_enqueue_network(queue, pnetwork); -_func_exit_; - return res; -} - - - -static struct wlan_network *rtw_dequeue_network(_queue *queue) -{ - struct wlan_network *pnetwork; -_func_enter_; - pnetwork = _rtw_dequeue_network(queue); -_func_exit_; - return pnetwork; -} - - -struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) -{ - struct wlan_network *pnetwork; -_func_enter_; - pnetwork = _rtw_alloc_network(pmlmepriv); -_func_exit_; - return pnetwork; -} - -void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall)//(struct wlan_network *pnetwork, _queue *free_queue) -{ -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); - _rtw_free_network(pmlmepriv, pnetwork, is_freeall); -_func_exit_; -} - - -void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork ) -{ -_func_enter_; - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); - _rtw_free_network_nolock(pmlmepriv, pnetwork); -_func_exit_; -} - - -void rtw_free_network_queue(_adapter* dev, u8 isfreeall) -{ -_func_enter_; - _rtw_free_network_queue(dev, isfreeall); -_func_exit_; -} - -/* - return the wlan_network with the matching addr - - Shall be calle under atomic context... to avoid possible racing condition... -*/ -struct wlan_network *rtw_find_network(_queue *scanned_queue, u8 *addr) -{ - struct wlan_network *pnetwork = _rtw_find_network(scanned_queue, addr); - - return pnetwork; -} - -int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork) -{ - int ret=_TRUE; - struct security_priv *psecuritypriv = &adapter->securitypriv; - - if ( (psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ ) && - ( pnetwork->network.Privacy == 0 ) ) - { - ret=_FALSE; - } - else if((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_ ) && - ( pnetwork->network.Privacy == 1 ) ) - { - ret=_FALSE; - } - else - { - ret=_TRUE; - } - - return ret; - -} - -inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b) -{ - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(%s,%d)(%s,%d)\n", - // a->Ssid.Ssid,a->Ssid.SsidLength,b->Ssid.Ssid,b->Ssid.SsidLength)); - return (a->Ssid.SsidLength == b->Ssid.SsidLength) - && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE; -} - -static int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst) -{ - u16 s_cap, d_cap; - -_func_enter_; - -#ifdef PLATFORM_OS_XP - if ( ((uint)dst) <= 0x7fffffff || - ((uint)src) <= 0x7fffffff || - ((uint)&s_cap) <= 0x7fffffff || - ((uint)&d_cap) <= 0x7fffffff) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n@@@@ error address of dst\n")); - - KeBugCheckEx(0x87110000, (ULONG_PTR)dst, (ULONG_PTR)src,(ULONG_PTR)&s_cap, (ULONG_PTR)&d_cap); - - return _FALSE; - } -#endif - - - _rtw_memcpy((u8 *)&s_cap, rtw_get_capability_from_ie(src->IEs), 2); - _rtw_memcpy((u8 *)&d_cap, rtw_get_capability_from_ie(dst->IEs), 2); - - - s_cap = le16_to_cpu(s_cap); - d_cap = le16_to_cpu(d_cap); - -_func_exit_; - - return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) && - (src->Configuration.DSConfig == dst->Configuration.DSConfig) && - ( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) && - ( (_rtw_memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength)) == _TRUE) && - ((s_cap & WLAN_CAPABILITY_IBSS) == - (d_cap & WLAN_CAPABILITY_IBSS)) && - ((s_cap & WLAN_CAPABILITY_BSS) == - (d_cap & WLAN_CAPABILITY_BSS))); - -} - -struct wlan_network * rtw_get_oldest_wlan_network(_queue *scanned_queue) -{ - _list *plist, *phead; - - - struct wlan_network *pwlan = NULL; - struct wlan_network *oldest = NULL; -_func_enter_; - phead = get_list_head(scanned_queue); - - plist = get_next(phead); - - while(1) - { - - if (rtw_end_of_queue_search(phead,plist)== _TRUE) - break; - - pwlan= LIST_CONTAINOR(plist, struct wlan_network, list); - - if(pwlan->fixed!=_TRUE) - { - if (oldest == NULL ||time_after(oldest->last_scanned, pwlan->last_scanned)) - oldest = pwlan; - } - - plist = get_next(plist); - } -_func_exit_; - return oldest; - -} - -static void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src,_adapter * padapter) -{ - u32 last_evm = 0, tmpVal; - -_func_enter_; - -#ifdef CONFIG_ANTENNA_DIVERSITY - padapter->HalFunc.SwAntDivCompareHandler(padapter, dst, src); -#endif - - - //Update signal strength first. Alwlays using the newest value will cause large vibration of scan result's signal strength - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) { - //Because we've process the rx phy info in rtl8192c_process_phy_info/rtl8192d_process_phy_info, - //we can just take the recvpriv's value - src->PhyInfo.SignalStrength = padapter->recvpriv.signal_strength; - src->PhyInfo.SignalQuality = padapter->recvpriv.signal_qual; - src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal_strength); - } - else { - src->PhyInfo.SignalStrength = (src->PhyInfo.SignalStrength+dst->PhyInfo.SignalStrength*4)/5; - src->PhyInfo.SignalQuality = (src->PhyInfo.SignalQuality+dst->PhyInfo.SignalQuality*4)/5; - src->Rssi=(src->Rssi+dst->Rssi*4)/5; - } - - - _rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src)); - - #if 0 - if(dst->Ssid.Ssid[0]=='j') { - DBG_871X("%s %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, rssi:%d\n", __FUNCTION__ - , dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, (int)dst->Rssi); - } - #endif - -#if 0 // old codes, may be useful one day... -// DBG_8192C("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi); - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) - { - - //DBG_8192C("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal); - if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) - { - padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; - last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; - padapter->recvpriv.signal_qual_data.total_val -= last_evm; - } - padapter->recvpriv.signal_qual_data.total_val += query_rx_pwr_percentage(src->Rssi); - - padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = query_rx_pwr_percentage(src->Rssi); - if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) - padapter->recvpriv.signal_qual_data.index = 0; - - //DBG_8192C("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, src->Rssi); - - // <1> Showed on UI for user,in percentage. - tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; - padapter->recvpriv.signal=(u8)tmpVal;//Link quality - - src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal) ; - } - else{ -// DBG_8192C("ELSE:ssid=%s update_network: src->rssi=0x%d dst->rssi=%d\n",src->Ssid.Ssid,src->Rssi,dst->Rssi); - src->Rssi=(src->Rssi +dst->Rssi)/2;//dBM - } - -// DBG_8192C("a:update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Rssi,padapter->recvpriv.signal); - -#endif - -_func_exit_; -} - -static void update_current_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) -{ - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - -_func_enter_; - -#ifdef PLATFORM_OS_XP - if ((unsigned long)(&(pmlmepriv->cur_network.network)) < 0x7ffffff) - { - KeBugCheckEx(0x87111c1c, (ULONG_PTR)(&(pmlmepriv->cur_network.network)), 0, 0,0); - } -#endif - - if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork))) - { - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n"); - - //if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength) - { - update_network(&(pmlmepriv->cur_network.network), pnetwork,adapter); - rtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), - pmlmepriv->cur_network.network.IELength); - } - } - -_func_exit_; - -} - - -/* - -Caller must hold pmlmepriv->lock first. - - -*/ -void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target) -{ - _list *plist, *phead; - ULONG bssid_ex_sz; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - _queue *queue = &(pmlmepriv->scanned_queue); - struct wlan_network *pnetwork = NULL; - struct wlan_network *oldest = NULL; - -_func_enter_; - - phead = get_list_head(queue); - plist = get_next(phead); - - while(1) - { - if (rtw_end_of_queue_search(phead,plist)== _TRUE) - break; - - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - - if ((unsigned long)(pnetwork) < 0x7ffffff) - { -#ifdef PLATFORM_OS_XP - KeBugCheckEx(0x87111c1c, (ULONG_PTR)pnetwork, 0, 0,0); -#endif - } - - if (is_same_network(&(pnetwork->network), target)) - break; - - if ((oldest == ((struct wlan_network *)0)) || - time_after(oldest->last_scanned, pnetwork->last_scanned)) - oldest = pnetwork; - - plist = get_next(plist); - - } - - - /* If we didn't find a match, then get a new network slot to initialize - * with this beacon's information */ - if (rtw_end_of_queue_search(phead,plist)== _TRUE) { - - if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) { - /* If there are no more slots, expire the oldest */ - //list_del_init(&oldest->list); - pnetwork = oldest; - -#ifdef CONFIG_ANTENNA_DIVERSITY - //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity - adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); -#endif - _rtw_memcpy(&(pnetwork->network), target, get_WLAN_BSSID_EX_sz(target)); - pnetwork->last_scanned = rtw_get_current_time(); - //variable initialize - pnetwork->fixed = _FALSE; - pnetwork->last_scanned = rtw_get_current_time(); - - pnetwork->network_type = 0; - pnetwork->aid=0; - pnetwork->join_res=0; - } - else { - /* Otherwise just pull from the free list */ - - pnetwork = rtw_alloc_network(pmlmepriv); // will update scan_time - - if(pnetwork==NULL){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n\nsomething wrong here\n\n\n")); - goto exit; - } - - bssid_ex_sz = get_WLAN_BSSID_EX_sz(target); - target->Length = bssid_ex_sz; -#ifdef CONFIG_ANTENNA_DIVERSITY - //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna; - adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); -#endif - _rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz ); - - rtw_list_insert_tail(&(pnetwork->list),&(queue->queue)); - - } - } - else { - /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new - * net and call the new_net handler - */ - - //target.Reserved[0]==1, means that scaned network is a bcn frame. - if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1)) - goto exit; - - update_network(&(pnetwork->network),target,adapter); - - pnetwork->last_scanned = rtw_get_current_time(); - - } - -exit: - -_func_exit_; - -} - - -void rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(((_adapter *)adapter)->mlmepriv); - _queue *queue = &(pmlmepriv->scanned_queue); - -_func_enter_; - - _enter_critical_bh(&queue->lock, &irqL); - - update_current_network(adapter, pnetwork); - - rtw_update_scanned_network(adapter, pnetwork); - - _exit_critical_bh(&queue->lock, &irqL); - -_func_exit_; -} - -//select the desired network based on the capability of the (i)bss. -// check items: (1) security -// (2) network_type -// (3) WMM -// (4) HT -// (5) others -int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) -{ - struct security_priv *psecuritypriv = &adapter->securitypriv; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - u32 desired_encmode; - u32 privacy; - - //u8 wps_ie[512]; - uint wps_ielen; - - int bselected = _TRUE; - - desired_encmode = psecuritypriv->ndisencryptstatus; - privacy = pnetwork->network.Privacy; - - if(psecuritypriv->wps_phase == _TRUE) - { - if(rtw_get_wps_ie(pnetwork->network.IEs, pnetwork->network.IELength, NULL, &wps_ielen)!=NULL) - { - //rtw_disassoc_cmd(adapter); - //rtw_indicate_disconnect(adapter); - //rtw_free_assoc_resources(adapter); - return _TRUE; - } - else - { - return _FALSE; - } - } - if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do.... - { - if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) - bselected = _FALSE; - } - - - if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) { - DBG_871X("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy); - bselected = _FALSE; - } - - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) - { - if(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode) - bselected = _FALSE; - } - - - return bselected; -} - -/* TODO: Perry : For Power Management */ -void rtw_atimdone_event_callback(_adapter *adapter , u8 *pbuf) -{ - -_func_enter_; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("receive atimdone_evet\n")); -_func_exit_; - return; -} - - -void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf) -{ - _irqL irqL; - u32 len; - WLAN_BSSID_EX *pnetwork; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - -_func_enter_; - - pnetwork = (WLAN_BSSID_EX *)pbuf; - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_survey_event_callback, ssid=%s\n", pnetwork->Ssid.Ssid)); - -#ifdef CONFIG_RTL8712 - //endian_convert - pnetwork->Length = le32_to_cpu(pnetwork->Length); - pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); - pnetwork->Privacy =le32_to_cpu( pnetwork->Privacy); - pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); - pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); - pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); - pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); - pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); - pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); - pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); - pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); - pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); - pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); - pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); - pnetwork->IELength = le32_to_cpu(pnetwork->IELength); -#endif - - len = get_WLAN_BSSID_EX_sz(pnetwork); - if(len > (sizeof(WLAN_BSSID_EX))) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n ****rtw_survey_event_callback: return a wrong bss ***\n")); - goto exit; - } - - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - // update IBSS_network 's timestamp - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) - { - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"rtw_survey_event_callback : WIFI_ADHOC_MASTER_STATE \n\n"); - if(_rtw_memcmp(&(pmlmepriv->cur_network.network.MacAddress), pnetwork->MacAddress, ETH_ALEN)) - { - struct wlan_network* ibss_wlan = NULL; - - _rtw_memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8); - - ibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->MacAddress); - if(ibss_wlan) - { - _rtw_memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8); - goto exit; - } - } - } - - // lock pmlmepriv->lock when you accessing network_q - if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _FALSE) - { - if( pnetwork->Ssid.Ssid[0] == 0 ) - { - pnetwork->Ssid.SsidLength = 0; - } - rtw_add_network(adapter, pnetwork); - } - -exit: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - -_func_exit_; - - return; -} - - - -void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - -#ifdef CONFIG_MLME_EXT - - mlmeext_surveydone_event_callback(adapter); - -#endif - -_func_enter_; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_surveydone_event_callback: fw_state:%x\n\n", get_fwstate(pmlmepriv))); - - if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY)) - { - u8 timer_cancelled; - - _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); - - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - } - else { - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv))); - } - - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - rtw_set_signal_stat_timer(&adapter->recvpriv); - #endif - - if(pmlmepriv->to_join == _TRUE) - { - if((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) ) - { - if(check_fwstate(pmlmepriv, _FW_LINKED)==_FALSE) - { - set_fwstate(pmlmepriv, _FW_UNDER_LINKING); - - if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) - { - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT ); - } - else - { - WLAN_BSSID_EX *pdev_network = &(adapter->registrypriv.dev_network); - u8 *pibss = adapter->registrypriv.dev_network.MacAddress; - - //pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;//because don't set assoc_timer - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("switching to adhoc master\n")); - - _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); - - rtw_update_registrypriv_dev_network(adapter); - rtw_generate_random_ibss(pibss); - - pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; - - if(rtw_createbss_cmd(adapter)!=_SUCCESS) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error=>rtw_createbss_cmd status FAIL\n")); - } - - pmlmepriv->to_join = _FALSE; - } - } - } - else - { - set_fwstate(pmlmepriv, _FW_UNDER_LINKING); - pmlmepriv->to_join = _FALSE; - if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) - { - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); - } - else - { - #ifdef CONFIG_LAYER2_ROAMING - DBG_871X("try_to_join, but select scanning queue fail, to_roaming:%d\n", pmlmepriv->to_roaming); - #else - DBG_871X("try_to_join, but select scanning queue fail\n"); - #endif - - #ifdef CONFIG_LAYER2_ROAMING - if(pmlmepriv->to_roaming!=0) { - if( --pmlmepriv->to_roaming == 0 - || _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid) - ) { - pmlmepriv->to_roaming = 0; - rtw_free_assoc_resources(adapter); - rtw_indicate_disconnect(adapter); - } else { - pmlmepriv->to_join = _TRUE; - } - } - #endif - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - } - } - } - //else - { - /* - * 20110324 Commented by Jeff - * indicate the scan complete event when this scan isn't caused by join - */ - indicate_wx_scan_complete_event(adapter); - - //DBG_871X("scan complete in %dms\n",rtw_get_passing_time_ms(pmlmepriv->scan_start_time)); - - } - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - -#ifdef CONFIG_P2P - p2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0); -#endif //CONFIG_P2P - - rtw_os_xmit_schedule(adapter); - -#ifdef CONFIG_DRVEXT_MODULE_WSC - drvext_surveydone_callback(&adapter->drvextpriv); -#endif - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - if(pmlmeext->sitesurvey_res.bss_cnt == 0){ - if(adapter->HalFunc.silentreset) - adapter->HalFunc.silentreset(adapter); - } - } - #endif -_func_exit_; - -} - -void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf) -{ - -} - -void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf) -{ - -} - -static void free_scanqueue(struct mlme_priv *pmlmepriv) -{ - _irqL irqL; - _queue *free_queue = &pmlmepriv->free_bss_pool; - _queue *scan_queue = &pmlmepriv->scanned_queue; - _list *plist, *phead, *ptemp; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+free_scanqueue\n")); - - _enter_critical_bh(&free_queue->lock, &irqL); - - phead = get_list_head(scan_queue); - plist = get_next(phead); - - while (plist != phead) - { - ptemp = get_next(plist); - rtw_list_delete(plist); - rtw_list_insert_tail(plist, &free_queue->queue); - plist =ptemp; - pmlmepriv->num_of_scanned --; - } - - _exit_critical_bh(&free_queue->lock, &irqL); - -_func_exit_; -} - -/* -*rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock -*/ -void rtw_free_assoc_resources(_adapter *adapter ) -{ - _irqL irqL; - struct wlan_network* pwlan = NULL; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - struct mlme_ext_info *pmlmeinfo = &adapter->mlmeextpriv.mlmext_info; - struct sta_priv *pstapriv = &adapter->stapriv; - struct wlan_network *tgt_network = &pmlmepriv->cur_network; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_free_assoc_resources\n")); - - pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("tgt_network->network.MacAddress="MAC_FMT" ssid=%s\n", - MAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.Ssid)); - - if(check_fwstate( pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE)) - { - struct sta_info* psta; - - psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(adapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - } - - if(check_fwstate( pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) - { - struct sta_info* psta; - - rtw_free_all_stainfo(adapter); - - psta = rtw_get_bcmc_stainfo(adapter); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(adapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - rtw_init_bcmc_stainfo(adapter); - } - - if(pwlan) - { - pwlan->fixed = _FALSE; - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_assoc_resources : pwlan== NULL \n\n")); - } - - - if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1)) - /*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/) - { - rtw_free_network_nolock(pmlmepriv, pwlan); - } - pmlmepriv->key_mask = 0; - -_func_exit_; - -} - -/* -*rtw_indicate_connect: the caller has to lock pmlmepriv->lock -*/ -void rtw_indicate_connect(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_connect\n")); - - pmlmepriv->to_join = _FALSE; -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ANTENNA_DIVERSITY_LINK, 0); -#endif - set_fwstate(pmlmepriv, _FW_LINKED); - - rtw_led_control(padapter, LED_CTL_LINK); - -#ifdef CONFIG_DRVEXT_MODULE - if(padapter->drvextpriv.enable_wpa) - { - indicate_l2_connect(padapter); - } - else -#endif - { - rtw_os_indicate_connect(padapter); - } - - #ifdef CONFIG_LAYER2_ROAMING - pmlmepriv->to_roaming=0; - #endif - - #ifdef CONFIG_SET_SCAN_DENY_TIMER - rtw_set_scan_deny(pmlmepriv, 3000); - #endif - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("-rtw_indicate_connect: fw_state=0x%08x\n", get_fwstate(pmlmepriv))); - -_func_exit_; - -} - - -/* -*rtw_indicate_connect: the caller has to lock pmlmepriv->lock -*/ -void rtw_indicate_disconnect( _adapter *padapter ) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_disconnect\n")); - - _clr_fwstate_(pmlmepriv, _FW_LINKED); - - rtw_led_control(padapter, LED_CTL_NO_LINK); - - #ifdef CONFIG_LAYER2_ROAMING - if(pmlmepriv->to_roaming<=0) - #endif - rtw_os_indicate_disconnect(padapter); - -#ifdef CONFIG_LPS - rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); -#endif - -#ifdef CONFIG_P2P - p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); -#endif //CONFIG_P2P - -_func_exit_; -} - -//Notes: -//pnetwork : returns from rtw_joinbss_event_callback -//ptarget_wlan: found from scanned_queue -//if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist. -//if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. -//if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan !=NULL). -// - - -//#define REJOIN -#ifdef CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP -void joinbss_event_prehandle(_adapter *adapter, u8 *pbuf) -{ - _irqL irqL,irqL2; - int res; - static u8 retry=0; - u8 timer_cancelled; - struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct wlan_network *pnetwork = (struct wlan_network *)pbuf; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; - unsigned int the_same_macaddr = _FALSE; - -_func_enter_; - -#ifdef CONFIG_RTL8712 - //endian_convert - pnetwork->join_res = le32_to_cpu(pnetwork->join_res); - pnetwork->network_type = le32_to_cpu(pnetwork->network_type); - pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length); - pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength); - pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy); - pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi); - pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; - pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow); - pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod); - pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); - pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); - pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); - pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); - pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); - pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length); - pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode); - pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength ); -#endif - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res)); - - rtw_get_encrypt_decrypt_from_registrypriv(adapter); - - - if (pmlmepriv->assoc_ssid.SsidLength == 0) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n")); - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); - } - - the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); - - pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network); - if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n")); - goto ignore_joinbss_callback; - } - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n")); - - if(pnetwork->join_res > 0) - { - retry = 0; - if (check_fwstate(pmlmepriv,_FW_UNDER_LINKING) ) - { - //s1. find ptarget_wlan - if(check_fwstate(pmlmepriv, _FW_LINKED) ) - { - if(the_same_macaddr == _TRUE) - { - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); - } - else - { - pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); - if(pcur_wlan) pcur_wlan->fixed = _FALSE; - - pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); - if(pcur_sta){ - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); - rtw_free_stainfo(adapter, pcur_sta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); - } - - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; - } - } - - } - else - { - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; - } - } - - if(ptarget_wlan == NULL) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n")); - goto ignore_joinbss_callback; - } - - //s2. find ptarget_sta & update ptarget_sta - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - ptarget_sta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); - if(ptarget_sta==NULL) { - ptarget_sta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); - } - - if(ptarget_sta) //update ptarget_sta - { - ptarget_sta->aid = pnetwork->join_res; - ptarget_sta->qos_option = 1;//? - ptarget_sta->mac_id=0; - - if(adapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X) - { - adapter->securitypriv.binstallGrpkey=_FALSE; - adapter->securitypriv.busetkipkey=_FALSE; - adapter->securitypriv.bgrpkey_handshake=_FALSE; - - ptarget_sta->ieee8021x_blocked=_TRUE; - ptarget_sta->dot118021XPrivacy=adapter->securitypriv.dot11PrivacyAlgrthm; - - _rtw_memset((u8 *)&ptarget_sta->dot118021x_UncstKey, 0, sizeof (union Keytype)); - - _rtw_memset((u8 *)&ptarget_sta->dot11tkiprxmickey, 0, sizeof (union Keytype)); - _rtw_memset((u8 *)&ptarget_sta->dot11tkiptxmickey, 0, sizeof (union Keytype)); - - _rtw_memset((u8 *)&ptarget_sta->dot11txpn, 0, sizeof (union pn48)); - _rtw_memset((u8 *)&ptarget_sta->dot11rxpn, 0, sizeof (union pn48)); - } - - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't allocate stainfo when joinbss_event callback\n")); - goto ignore_joinbss_callback; - } - - } - - //s3. update cur_network & indicate connect - if(ptarget_wlan) - { - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:"MAC_FMT"\n" - ,get_fwstate(pmlmepriv), MAC_ARG(pnetwork->network.MacAddress))); - - - // why not use ptarget_wlan?? - _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); - cur_network->aid = pnetwork->join_res; - - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - rtw_set_signal_stat_timer(&adapter->recvpriv); - #endif - adapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; - adapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; - //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) - adapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - rtw_set_signal_stat_timer(&adapter->recvpriv); - #endif - - //update fw_state //will clr _FW_UNDER_LINKING here indirectly - switch(pnetwork->network.InfrastructureMode) - { - case Ndis802_11Infrastructure: - pmlmepriv->fw_state = WIFI_STATION_STATE; - break; - case Ndis802_11IBSS: - pmlmepriv->fw_state = WIFI_ADHOC_STATE; - break; - default: - pmlmepriv->fw_state = WIFI_NULL_STATE; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n")); - break; - } - - rtw_update_protection(adapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), - (cur_network->network.IELength)); - -#ifdef CONFIG_80211N_HT - //TODO: update HT_Capability - rtw_update_ht_cap(adapter, cur_network->network.IEs, cur_network->network.IELength); -#endif - - //indicate connect - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - struct xmit_priv *pxmitpriv = &adapter->xmitpriv; - //Set Value to 0 for prevent xmit data frame without hw setting done. - ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 0); - rtw_indicate_connect(adapter); - } - else - { - //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); - } - - - } - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer \n")); - _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); - - - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv))); - goto ignore_joinbss_callback; - } - - } - else if(pnetwork->join_res == -4) - { - rtw_reset_securitypriv(adapter); - _set_timer(&pmlmepriv->assoc_timer, 1); - - //rtw_free_assoc_resources(adapter); - - if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - } - - } - else //if join_res < 0 (join fails), then try again - { - #ifdef REJOIN - res = rtw_select_and_join_from_scanned_queue(pmlmepriv); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res)); - if (res != _SUCCESS || retry>2) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n")); - #endif - - _set_timer(&pmlmepriv->assoc_timer, 1); - - //rtw_free_assoc_resources(adapter); - - if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - } - - #ifdef REJOIN - retry = 0; - - } - else - { - //extend time of assoc_timer - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); - - retry++; - } - #endif - } - -ignore_joinbss_callback: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - _func_exit_; -} - -void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf) -{ - struct wlan_network *pnetwork = (struct wlan_network *)pbuf; - struct xmit_priv *pxmitpriv = &adapter->xmitpriv; - -_func_enter_; - - mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); - - //Set Value to 1 to xmit data frame. - ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 1); - rtw_os_xmit_schedule(adapter); - -_func_exit_; -} - -#else //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP -void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf) -{ - _irqL irqL,irqL2; - int res; - static u8 retry=0; - u8 timer_cancelled; - struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct wlan_network *pnetwork = (struct wlan_network *)pbuf; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; - unsigned int the_same_macaddr = _FALSE; - -_func_enter_; - -#ifdef CONFIG_RTL8712 - //endian_convert - pnetwork->join_res = le32_to_cpu(pnetwork->join_res); - pnetwork->network_type = le32_to_cpu(pnetwork->network_type); - pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length); - pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength); - pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy); - pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi); - pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; - pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow); - pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod); - pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); - pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); - pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); - pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); - pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); - pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length); - pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode); - pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength ); -#endif - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res)); - - rtw_get_encrypt_decrypt_from_registrypriv(adapter); - - - if (pmlmepriv->assoc_ssid.SsidLength == 0) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n")); - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); - } - - the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); - - pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network); - if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n")); - goto ignore_joinbss_callback; - } - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n")); - - if(pnetwork->join_res > 0) - { - retry = 0; - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) ) - { - //s1. find ptarget_wlan - if(check_fwstate(pmlmepriv, _FW_LINKED) ) - { - if(the_same_macaddr == _TRUE) - { - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); - } - else - { - pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); - if(pcur_wlan) pcur_wlan->fixed = _FALSE; - - pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); - if(pcur_sta){ - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); - rtw_free_stainfo(adapter, pcur_sta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); - } - - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; - } - } - } - else - { - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; - } - } - - if(ptarget_wlan == NULL) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n")); - goto ignore_joinbss_callback; - } - - //s2. find ptarget_sta & update ptarget_sta - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - ptarget_sta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); - if(ptarget_sta==NULL) - { - //DBG_8192C("==> %s #1, call rtw_alloc_stainfo\n",__FUNCTION__); - ptarget_sta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); - } - - if(ptarget_sta) //update ptarget_sta - { - ptarget_sta->aid = pnetwork->join_res; - ptarget_sta->qos_option = 1;//? - ptarget_sta->mac_id=0; - - if(adapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X) - { - adapter->securitypriv.binstallGrpkey=_FALSE; - adapter->securitypriv.busetkipkey=_FALSE; - adapter->securitypriv.bgrpkey_handshake=_FALSE; - - ptarget_sta->ieee8021x_blocked=_TRUE; - ptarget_sta->dot118021XPrivacy=adapter->securitypriv.dot11PrivacyAlgrthm; - - _rtw_memset((u8 *)&ptarget_sta->dot118021x_UncstKey, 0, sizeof (union Keytype)); - - _rtw_memset((u8 *)&ptarget_sta->dot11tkiprxmickey, 0, sizeof (union Keytype)); - _rtw_memset((u8 *)&ptarget_sta->dot11tkiptxmickey, 0, sizeof (union Keytype)); - - _rtw_memset((u8 *)&ptarget_sta->dot11txpn, 0, sizeof (union pn48)); - _rtw_memset((u8 *)&ptarget_sta->dot11rxpn, 0, sizeof (union pn48)); - } - - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't allocate stainfo when joinbss_event callback\n")); - goto ignore_joinbss_callback; - } - - } - - //s3. update cur_network & indicate connect - if(ptarget_wlan) - { - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:%x:%x:%x:%x:%x:%x\n",get_fwstate(pmlmepriv), - pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], - pnetwork->network.MacAddress[2], pnetwork->network.MacAddress[3], - pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5])); - - - _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); - cur_network->aid = pnetwork->join_res; - - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - rtw_set_signal_stat_timer(&adapter->recvpriv); - #endif - adapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; - adapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; - //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) - adapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - rtw_set_signal_stat_timer(&adapter->recvpriv); - #endif - - //update fw_state //will clr _FW_UNDER_LINKING here indirectly - switch(pnetwork->network.InfrastructureMode) - { - case Ndis802_11Infrastructure: - pmlmepriv->fw_state = WIFI_STATION_STATE; - break; - case Ndis802_11IBSS: - pmlmepriv->fw_state = WIFI_ADHOC_STATE; - break; - default: - pmlmepriv->fw_state = WIFI_NULL_STATE; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n")); - break; - } - - rtw_update_protection(adapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), - (cur_network->network.IELength)); - -#ifdef CONFIG_80211N_HT - //TODO: update HT_Capability - rtw_update_ht_cap(adapter, cur_network->network.IEs, cur_network->network.IELength); -#endif - - //indicate connect - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - rtw_indicate_connect(adapter); - } - else - { - //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); - } - - - } - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer \n")); - _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); - - - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv))); - goto ignore_joinbss_callback; - } - - } - else if(pnetwork->join_res == -4) - { - rtw_reset_securitypriv(adapter); - _set_timer(&pmlmepriv->assoc_timer, 1); - - //rtw_free_assoc_resources(adapter); - - if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - } - - } - else //if join_res < 0 (join fails), then try again - { - #ifdef REJOIN - res = rtw_select_and_join_from_scanned_queue(pmlmepriv); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res)); - if (res != _SUCCESS || retry>2) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n")); - - #endif - _set_timer(&pmlmepriv->assoc_timer, 1); - - //rtw_free_assoc_resources(adapter); - - if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - } - - #ifdef REJOIN - retry = 0; - - } - else - { - //extend time of assoc_timer - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); - - retry++; - } - #endif - - } - -ignore_joinbss_callback: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); - -_func_exit_; - -} -#endif //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP - -void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf) -{ - _irqL irqL; - struct sta_info *psta; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct stassoc_event *pstassoc = (struct stassoc_event*)pbuf; - struct wlan_network *cur_network = &(pmlmepriv->cur_network); - struct wlan_network *ptarget_wlan = NULL; - -_func_enter_; - - // to do: - if(rtw_access_ctrl(&adapter->acl_list, pstassoc->macaddr) == _FALSE) - return; - -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { - psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); - if(psta) - { - bss_cap_update(adapter, psta); - - sta_info_update(adapter, psta); - } - - goto exit; - } -#endif - - psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); - if( psta != NULL) - { - //the sta have been in sta_info_queue => do nothing - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error: rtw_stassoc_event_callback: sta has been in sta_hash_queue \n")); - - goto exit; //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) - } - - psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr); - if (psta == NULL) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't alloc sta_info when rtw_stassoc_event_callback\n")); - goto exit; - } - - //to do : init sta_info variable - psta->qos_option = 0; - psta->mac_id = le32_to_cpu((uint)pstassoc->cam_id); - //psta->aid = (uint)pstassoc->cam_id; - - if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) - psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; - - psta->ieee8021x_blocked = _FALSE; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) - { - if(adapter->stapriv.asoc_sta_count== 2) - { - ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); - if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; - - // a sta + bc/mc_stainfo (not Ibss_stainfo) - rtw_indicate_connect(adapter); - } - } - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - - mlmeext_sta_add_event_callback(adapter, psta); - -#ifdef CONFIG_RTL8711 - //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta - rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE); -#endif - -exit: - -_func_exit_; - -} - -void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf) -{ - _irqL irqL,irqL2; - struct sta_info *psta; - struct wlan_network* pwlan = NULL; - WLAN_BSSID_EX *pdev_network=NULL; - u8* pibss = NULL; - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - struct stadel_event *pstadel = (struct stadel_event*)pbuf; - struct sta_priv *pstapriv = &adapter->stapriv; - struct wlan_network *tgt_network = &(pmlmepriv->cur_network); - -_func_enter_; - - mlmeext_sta_del_event_callback(adapter); - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) - return; - - _enter_critical_bh(&pmlmepriv->lock, &irqL2); - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) - { - - #ifdef CONFIG_LAYER2_ROAMING - if(pmlmepriv->to_roaming > 0) - pmlmepriv->to_roaming--; // this stadel_event is caused by roaming, decrease to_roaming - else if(pmlmepriv->to_roaming ==0) - pmlmepriv->to_roaming= adapter->registrypriv.max_roaming_times; - - if(*((unsigned short *)(pstadel->rsvd)) !=65535 ) //if stadel_event isn't caused by no rx - pmlmepriv->to_roaming=0; // don't roam - #endif //CONFIG_LAYER2_ROAMING - - - rtw_free_assoc_resources(adapter); - rtw_indicate_disconnect(adapter); - - // remove the network entry in scanned_queue - pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); - if (pwlan) { - pwlan->fixed = _FALSE; - rtw_free_network_nolock(pmlmepriv, pwlan); - } - - #ifdef CONFIG_LAYER2_ROAMING - _rtw_roaming(adapter, tgt_network); - #endif //CONFIG_LAYER2_ROAMING - - } - - if ( check_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE) || - check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) - { - psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(adapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - if(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo) - { - //rtw_indicate_disconnect(adapter);//removed@20091105 - - //free old ibss network - //pwlan = rtw_find_network(&pmlmepriv->scanned_queue, pstadel->macaddr); - pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); - if(pwlan) - { - pwlan->fixed = _FALSE; - rtw_free_network_nolock(pmlmepriv, pwlan); - } - - //re-create ibss - pdev_network = &(adapter->registrypriv.dev_network); - pibss = adapter->registrypriv.dev_network.MacAddress; - - _rtw_memcpy(pdev_network, &tgt_network->network, get_WLAN_BSSID_EX_sz(&tgt_network->network)); - - _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); - - rtw_update_registrypriv_dev_network(adapter); - - rtw_generate_random_ibss(pibss); - - if(check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) - { - set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); - _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE); - } - - if(rtw_createbss_cmd(adapter)!=_SUCCESS) - { - - RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>stadel_event_callback: rtw_createbss_cmd status FAIL*** \n ")); - - } - - - } - - } - - _exit_critical_bh(&pmlmepriv->lock, &irqL2); - -_func_exit_; - -} - - -void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf) -{ - struct reportpwrstate_parm *preportpwrstate = (struct reportpwrstate_parm *)pbuf; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_cpwm_event_callback !!!\n")); -#ifdef CONFIG_PWRCTRL - preportpwrstate->state |= (u8)(adapter->pwrctrlpriv.cpwm_tog + 0x80); - cpwm_int_hdl(adapter, preportpwrstate); -#endif - -_func_exit_; - -} - -void _rtw_join_timeout_handler (_adapter *adapter) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - int do_join_r; - -#if 0 - if (adapter->bDriverStopped == _TRUE){ - _rtw_up_sema(&pmlmepriv->assoc_terminate); - return; - } -#endif - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n^^^rtw_join_timeout_handler ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_join_timeout_handler, fw_state=%x\n", get_fwstate(pmlmepriv))); - - if(adapter->bDriverStopped ||adapter->bSurpriseRemoved) - return; - - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - #ifdef CONFIG_LAYER2_ROAMING - if(pmlmepriv->to_roaming>0) { // join timeout caused by roaming - while(1) { - pmlmepriv->to_roaming--; - if(pmlmepriv->to_roaming!=0) { //try another , - DBG_871X("%s try another roaming\n", __FUNCTION__); - if( _SUCCESS!=(do_join_r=rtw_do_join(adapter)) ) { - DBG_871X("%s roaming do_join return %d\n", __FUNCTION__ ,do_join_r); - continue; - } - break; - } else { - DBG_871X("%s We've try roaming but fail\n", __FUNCTION__); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - rtw_indicate_disconnect(adapter); - break; - } - } - - } else - #endif - { - if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - } - - //Jeff: Even if not linked, we still need to reset securitypriv - //if((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) - { - rtw_os_indicate_disconnect(adapter); - _clr_fwstate_(pmlmepriv, _FW_LINKED); - } - - free_scanqueue(pmlmepriv);//??? - rtw_led_control(adapter, LED_CTL_NO_LINK); - } - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - -#ifdef CONFIG_DRVEXT_MODULE_WSC - drvext_assoc_fail_indicate(&adapter->drvextpriv); -#endif - -_func_exit_; - -} - -void rtw_scan_timeout_handler (_adapter *adapter) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("\n^^^rtw_scan_timeout_handler ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) ) - { - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("fw status =%x, rtw_scan_timeout_handler: survey done event comes too late!\n", get_fwstate(pmlmepriv))); - } - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - -} - -static void rtw_auto_scan_handler(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - - //auto site survey per 60sec - if(pmlmepriv->scan_interval >0) - { - pmlmepriv->scan_interval--; - if(pmlmepriv->scan_interval==0) - { - if( pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE ) - return; - -/* - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) - { - DBG_8192C("exit %s when _FW_UNDER_SURVEY|_FW_UNDER_LINKING -> \n", __FUNCTION__); - return; - } - - if(pmlmepriv->sitesurveyctrl.traffic_busy == _TRUE) - { - DBG_8192C("%s exit cause traffic_busy(%x)\n",__FUNCTION__, pmlmepriv->sitesurveyctrl.traffic_busy); - return; - } -*/ - - DBG_871X("%s\n", __FUNCTION__); - - rtw_set_802_11_bssid_list_scan(padapter); - - pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec - - } - - } - -} - -void rtw_dynamic_check_timer_handlder(_adapter *adapter) -{ -#ifdef CONFIG_AP_MODE - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; -#endif //CONFIG_AP_MODE - struct registry_priv *pregistrypriv = &adapter->registrypriv; - - if(adapter->hw_init_completed == _FALSE) - return; - - if ((adapter->bDriverStopped == _TRUE)||(adapter->bSurpriseRemoved== _TRUE)) - return; - - if(adapter->net_closed == _TRUE) - return; - - rtw_dynamic_chk_wk_cmd(adapter); - - if(pregistrypriv->wifi_spec==1) - { - //auto site survey - rtw_auto_scan_handler(adapter); - } - -#ifdef CONFIG_AP_MODE - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - expire_timeout_chk(adapter); - } -#endif - -} - - -#ifdef CONFIG_SET_SCAN_DENY_TIMER -void rtw_set_scan_deny_timer_hdl(_adapter *adapter) -{ - struct mlme_priv *mlmepriv = &adapter->mlmepriv; - - //allowed set scan - ATOMIC_SET(&mlmepriv->set_scan_deny, 0); -} - -void rtw_set_scan_deny(struct mlme_priv *mlmepriv, u32 ms) -{ - ATOMIC_SET(&mlmepriv->set_scan_deny, 1); - _set_timer(&mlmepriv->set_scan_deny_timer, ms); -} -#endif - - -/* -* Select a new join candidate from the original @param candidate and @param competitor -* @return _TRUE: candidate is updated -* @return _FALSE: candidate is not updated -*/ -static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv - , struct wlan_network **candidate, struct wlan_network *competitor) -{ - int updated = _FALSE; - _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv); - - if(pmlmepriv->assoc_by_bssid==_TRUE) { // associate with bssid - if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) - && _rtw_memcmp(competitor->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE - ) { - *candidate = competitor; - updated = _TRUE; - } - } else if (pmlmepriv->assoc_ssid.SsidLength == 0 ) { // associate with ssid, but ssidlength is 0 - if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) ) { - *candidate = competitor; - updated = _TRUE; - } - } else -#ifdef CONFIG_LAYER2_ROAMING - if(pmlmepriv->to_roaming) { // roaming - if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) - && is_same_ess(&competitor->network, &pmlmepriv->cur_network.network) - //&&(!is_same_network(&competitor->network, &pmlmepriv->cur_network.network)) - && rtw_get_passing_time_ms((u32)competitor->last_scanned) < 5000 - && rtw_is_desired_network(adapter, competitor) - ) { - *candidate = competitor; - updated = _TRUE; - } - - } else -#endif - { // associate with ssid - if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) - && (competitor->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength) - &&((_rtw_memcmp(competitor->network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE) - && rtw_is_desired_network(adapter, competitor) - ) { - *candidate = competitor; - updated = _TRUE; - } - } - - if(updated){ - DBG_871X("new candidate: %s("MAC_FMT") rssi:%d\n", - (*candidate)->network.Ssid.Ssid, - MAC_ARG((*candidate)->network.MacAddress), - (int)(*candidate)->network.Rssi - ); - } - - return updated; -} - - -/* -Calling context: -The caller of the sub-routine will be in critical section... - -The caller must hold the following spinlock - -pmlmepriv->lock - - -*/ -#if 1 -int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv ) -{ - int ret; - _list *phead; - _adapter *adapter; - _queue *queue = &(pmlmepriv->scanned_queue); - struct wlan_network *pnetwork = NULL; - struct wlan_network *candidate = NULL; - u8 bSupportAntDiv = _FALSE; -_func_enter_; - - phead = get_list_head(queue); - adapter = (_adapter *)pmlmepriv->nic_hdl; - - pmlmepriv->pscanned = get_next( phead ); - - while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { - - pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); - if(pnetwork==NULL){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s return _FAIL:(pnetwork==NULL)\n", __FUNCTION__)); - ret = _FAIL; - goto exit; - } - - pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); - - #if 0 - DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid); - #endif - - rtw_check_join_candidate(pmlmepriv, &candidate, pnetwork); - - } - - if(candidate == NULL) { - DBG_871X("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__); - ret = _FAIL; - goto exit; - } else { - DBG_871X("%s: candidate: %s("MAC_FMT")\n", __FUNCTION__, - candidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress));; - } - - - // check for situation of _FW_LINKED - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - DBG_871X("%s: _FW_LINKED while ask_for_joinbss!!!\n", __FUNCTION__); - - if(is_same_network(&pmlmepriv->cur_network.network, &candidate->network)) - { - DBG_871X("%s: _FW_LINKED and is same network, it needn't join again\n", __FUNCTION__); - - rtw_indicate_connect(adapter);//rtw_indicate_connect again - - ret = 2; - goto exit; - } - else - { - rtw_disassoc_cmd(adapter); - rtw_indicate_disconnect(adapter); - rtw_free_assoc_resources(adapter); - } - } - - #ifdef CONFIG_ANTENNA_DIVERSITY - adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); - if(_TRUE == bSupportAntDiv) - { - u8 CurrentAntenna; - adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); - DBG_8192C("#### Opt_Ant_(%s) , cur_Ant(%s)\n", - (2==candidate->network.PhyInfo.Optimum_antenna)?"A":"B", - (2==CurrentAntenna)?"A":"B" - ); - } - #endif - - ret = rtw_joinbss_cmd(adapter, candidate); - -exit: -_func_exit_; - - return ret; - -} -#else -int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv ) -{ - _list *phead; - u8 CurrentAntenna; - unsigned char *dst_ssid, *src_ssid; - _adapter *adapter; - _queue *queue = &(pmlmepriv->scanned_queue); - struct wlan_network *pnetwork = NULL; - struct wlan_network *pnetwork_max_rssi = NULL; - #ifdef CONFIG_LAYER2_ROAMING - struct wlan_network * roaming_candidate=NULL; - u32 cur_time=rtw_get_current_time(); - #endif - -_func_enter_; - - phead = get_list_head(queue); - adapter = (_adapter *)pmlmepriv->nic_hdl; - - pmlmepriv->pscanned = get_next( phead ); - - while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { - - pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); - if(pnetwork==NULL){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(2)rtw_select_and_join_from_scanned_queue return _FAIL:(pnetwork==NULL)\n")); - return _FAIL; - } - - dst_ssid = pnetwork->network.Ssid.Ssid; - src_ssid = pmlmepriv->assoc_ssid.Ssid; - - pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); - - #if 0 - DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid); - #endif - - if(pmlmepriv->assoc_by_bssid==_TRUE) - { - if(_rtw_memcmp(pnetwork->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE) - { - //remove the condition @ 20081125 - //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)|| - // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode) - // goto ask_for_joinbss; - - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) - { - //DBG_871X("select_and_join(1): _FW_LINKED and is same network, it needn't join again\n"); - - rtw_indicate_connect(adapter);//rtw_indicate_connect again - - return 2; - } - else - { - rtw_disassoc_cmd(adapter); - rtw_indicate_disconnect(adapter); - rtw_free_assoc_resources(adapter); - - goto ask_for_joinbss; - - } - } - else - { - goto ask_for_joinbss; - } - - } - - } else if (pmlmepriv->assoc_ssid.SsidLength == 0) { - goto ask_for_joinbss;//anyway, join first selected(dequeued) pnetwork if ssid_len=0 - - #ifdef CONFIG_LAYER2_ROAMING - } else if(pmlmepriv->to_roaming>0) { - - if( (roaming_candidate == NULL ||roaming_candidate->network.Rssinetwork.Rssi ) - && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network) - //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network)) - && rtw_get_time_interval_ms((u32)pnetwork->last_scanned,cur_time) < 5000 - ) { - roaming_candidate = pnetwork; - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_, - DBG_871X - ("roaming_candidate???: %s("MAC_FMT")\n", - roaming_candidate->network.Ssid.Ssid, MAC_ARG(roaming_candidate->network.MacAddress) ) - //) - ; - } - continue; - #endif - - } else if ( (pnetwork->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength) - &&((_rtw_memcmp(dst_ssid, src_ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE) - ) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("dst_ssid=%s, src_ssid=%s \n", dst_ssid, src_ssid)); -#ifdef CONFIG_ANTENNA_DIVERSITY - adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); - DBG_8192C("#### dst_ssid=(%s) Opt_Ant_(%s) , cur_Ant(%s)\n", dst_ssid, - (2==pnetwork->network.PhyInfo.Optimum_antenna)?"A":"B", - (2==CurrentAntenna)?"A":"B"); -#endif - //remove the condition @ 20081125 - //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)|| - // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode) - //{ - // _rtw_memcpy(pmlmepriv->assoc_bssid, pnetwork->network.MacAddress, ETH_ALEN); - // goto ask_for_joinbss; - //} - - if(pmlmepriv->assoc_by_rssi==_TRUE)//if the ssid is the same, select the bss which has the max rssi - { - if( NULL==pnetwork_max_rssi|| pnetwork->network.Rssi > pnetwork_max_rssi->network.Rssi) - pnetwork_max_rssi = pnetwork; - } - else if(rtw_is_desired_network(adapter, pnetwork) == _TRUE) - { - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { -#if 0 - if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) - { - DBG_871X("select_and_join(2): _FW_LINKED and is same network, it needn't join again\n"); - - rtw_indicate_connect(adapter);//rtw_indicate_connect again - - return 2; - } - else -#endif - { - rtw_disassoc_cmd(adapter); - //rtw_indicate_disconnect(adapter);// - rtw_free_assoc_resources(adapter); - - goto ask_for_joinbss; - } - } - else - { - goto ask_for_joinbss; - } - - } - - - } - - } - - #ifdef CONFIG_LAYER2_ROAMING - if(pmlmepriv->to_roaming>0 && roaming_candidate ){ - pnetwork=roaming_candidate; - DBG_871X("select_and_join_from_scanned_queue: roaming_candidate: %s("MAC_FMT")\n", - pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress)); - goto ask_for_joinbss; - } - #endif - - if((pmlmepriv->assoc_by_rssi==_TRUE) && (pnetwork_max_rssi!=NULL)) - { - pnetwork = pnetwork_max_rssi; - DBG_871X("select_and_join_from_scanned_queue: pnetwork_max_rssi: %s("MAC_FMT")\n", - pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress)); - goto ask_for_joinbss; - } - - DBG_871X("(1)rtw_select_and_join_from_scanned_queue return _FAIL\n"); - -_func_exit_; - - return _FAIL; - -ask_for_joinbss: - -_func_exit_; - - return rtw_joinbss_cmd(adapter, pnetwork); - -} -#endif - - -sint rtw_set_auth(_adapter * adapter,struct security_priv *psecuritypriv) -{ - struct cmd_obj* pcmd; - struct setauth_parm *psetauthparm; - struct cmd_priv *pcmdpriv=&(adapter->cmdpriv); - sint res=_SUCCESS; - -_func_enter_; - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; //try again - goto exit; - } - - psetauthparm=(struct setauth_parm*)rtw_zmalloc(sizeof(struct setauth_parm)); - if(psetauthparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_memset(psetauthparm, 0, sizeof(struct setauth_parm)); - psetauthparm->mode=(unsigned char)psecuritypriv->dot11AuthAlgrthm; - - pcmd->cmdcode = _SetAuth_CMD_; - pcmd->parmbuf = (unsigned char *)psetauthparm; - pcmd->cmdsz = (sizeof(struct setauth_parm)); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - - _rtw_init_listhead(&pcmd->list); - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("after enqueue set_auth_cmd, auth_mode=%x\n", psecuritypriv->dot11AuthAlgrthm)); - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: - -_func_exit_; - - return res; - -} - - -sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx) -{ - u8 keylen; - struct cmd_obj *pcmd; - struct setkey_parm *psetkeyparm; - struct cmd_priv *pcmdpriv = &(adapter->cmdpriv); - struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); - sint res=_SUCCESS; - -_func_enter_; - - pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(pcmd==NULL){ - res= _FAIL; //try again - goto exit; - } - psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); - if(psetkeyparm==NULL){ - rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); - - if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){ - psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy=%d \n", psetkeyparm->algorithm)); - } - else{ - psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm; - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm=%d \n", psetkeyparm->algorithm)); - - } - psetkeyparm->keyid = (u8)keyid;//0~3 - psetkeyparm->set_tx = set_tx; - pmlmepriv->key_mask |= BIT(psetkeyparm->keyid); -#ifdef CONFIG_AUTOSUSPEND - if( _TRUE == adapter->pwrctrlpriv.bInternalAutoSuspend) - { - adapter->pwrctrlpriv.wepkeymask = pmlmepriv->key_mask; - DBG_8192C("....AutoSuspend pwrctrlpriv.wepkeymask(%x)\n",adapter->pwrctrlpriv.wepkeymask); - } -#endif - //DBG_8192C("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid,pmlmepriv->key_mask); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid)); - - switch(psetkeyparm->algorithm){ - - case _WEP40_: - keylen=5; - _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); - break; - case _WEP104_: - keylen=13; - _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); - break; - case _TKIP_: - keylen=16; - _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); - psetkeyparm->grpkey=1; - break; - case _AES_: - keylen=16; - _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); - psetkeyparm->grpkey=1; - break; - default: - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm)); - res= _FAIL; - goto exit; - } - - - pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *)psetkeyparm; - pcmd->cmdsz = (sizeof(struct setkey_parm)); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - - _rtw_init_listhead(&pcmd->list); - - //_rtw_init_sema(&(pcmd->cmd_sem), 0); - - res = rtw_enqueue_cmd(pcmdpriv, pcmd); - -exit: -_func_exit_; - return res; - -} - - -//adjust IEs for rtw_joinbss_cmd in WMM -int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len) -{ - unsigned int ielength=0; - unsigned int i, j; - - i = 12; //after the fixed IE - while(i=0 :if there is pre-auth key, and return the entry id -// -// - -static int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid) -{ - struct security_priv *psecuritypriv=&Adapter->securitypriv; - int i=0; - - do - { - if( ( psecuritypriv->PMKIDList[i].bUsed ) && - ( _rtw_memcmp( psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN ) == _TRUE ) ) - { - break; - } - else - { - i++; - //continue; - } - - }while(imlmepriv; - struct security_priv *psecuritypriv=&adapter->securitypriv; - uint ndisauthmode=psecuritypriv->ndisauthtype; - uint ndissecuritytype = psecuritypriv->ndisencryptstatus; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, - ("+rtw_restruct_sec_ie: ndisauthmode=%d ndissecuritytype=%d\n", - ndisauthmode, ndissecuritytype)); - - authmode = 0xFF;//init - - if((ndisauthmode==Ndis802_11AuthModeWPA)||(ndisauthmode==Ndis802_11AuthModeWPAPSK)) - { - authmode=_WPA_IE_ID_; - uncst_oui[0]=0x0; - uncst_oui[1]=0x50; - uncst_oui[2]=0xf2; - } - if((ndisauthmode==Ndis802_11AuthModeWPA2)||(ndisauthmode==Ndis802_11AuthModeWPA2PSK)) - { - authmode=_WPA2_IE_ID_; - uncst_oui[0]=0x0; - uncst_oui[1]=0x0f; - uncst_oui[2]=0xac; - } - - switch(ndissecuritytype) - { - case Ndis802_11Encryption1Enabled: - case Ndis802_11Encryption1KeyAbsent: - securitytype=_WEP40_; - uncst_oui[3]=0x1; - break; - case Ndis802_11Encryption2Enabled: - case Ndis802_11Encryption2KeyAbsent: - securitytype=_TKIP_; - uncst_oui[3]=0x2; - break; - case Ndis802_11Encryption3Enabled: - case Ndis802_11Encryption3KeyAbsent: - securitytype=_AES_; - uncst_oui[3]=0x4; - break; - default: - securitytype=_NO_PRIVACY_; - break; - } - - //Search required WPA or WPA2 IE and copy to sec_ie[ ] - cnt=12; - match=_FALSE; - while(cntdot118021XGrpPrivacy=_NO_PRIVACY_; - break; - case 0x1: //WEP_40 - psecuritypriv->dot118021XGrpPrivacy=_WEP40_; - break; - case 0x2: //TKIP - psecuritypriv->dot118021XGrpPrivacy=_TKIP_; - break; - case 0x3: //AESCCMP - case 0x4: - psecuritypriv->dot118021XGrpPrivacy=_AES_; - break; - case 0x5: //WEP_104 - psecuritypriv->dot118021XGrpPrivacy=_WEP104_; - break; - } - - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Multicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", - sec_ie[8],sec_ie[9],sec_ie[10],sec_ie[11])); - match =_FALSE; - break; - } - - if(sec_ie[12]==0x01) - { - //check the unicast encryption type - if(_rtw_memcmp(&sec_ie[14], &uncst_oui[0], 4) !=_TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Unicast error (%.2x %.2x %.2x %.2x != 00 50 F2 %.2x )! \n", - sec_ie[14],sec_ie[15],sec_ie[16],sec_ie[17],uncst_oui[3])); - match =_FALSE; - - break; - - } //else the uncst_oui is match - } - else//mixed mode, unicast_enc_type > 1 - { - //select the uncst_oui and remove the other uncst_oui - cnt=sec_ie[12]; - remove_cnt=(cnt-1)*4; - sec_ie[12]=0x01; - _rtw_memcpy(&sec_ie[14], &uncst_oui[0], 4); - - //remove the other unicast suit - _rtw_memcpy(&sec_ie[18], &sec_ie[18+remove_cnt],(sec_ie[1]-18+2-remove_cnt)); - sec_ie[1]=sec_ie[1]-remove_cnt; - } - - break; - } - } - - if(authmode==_WPA2_IE_ID_) - { - // parsing RSN IE to select required encryption algorithm, and set the bc/mc encryption algorithm - while(_TRUE) - { - if((sec_ie[2]!=0x01)||(sec_ie[3]!= 0x0)) - { - //IE Ver error - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n RSN IE :IE version error (%.2x %.2x != 01 00 )! \n",sec_ie[2],sec_ie[3])); - match=_FALSE; - break; - } - - if(_rtw_memcmp(&sec_ie[4], &uncst_oui[0], 3) ==_TRUE) - { - //get bc/mc encryption type - switch(sec_ie[7]) - { - case 0x1: //WEP_40 - psecuritypriv->dot118021XGrpPrivacy=_WEP40_; - break; - case 0x2: //TKIP - psecuritypriv->dot118021XGrpPrivacy=_TKIP_; - break; - case 0x4: //AESWRAP - psecuritypriv->dot118021XGrpPrivacy=_AES_; - break; - case 0x5: //WEP_104 - psecuritypriv->dot118021XGrpPrivacy=_WEP104_; - break; - default: //none - psecuritypriv->dot118021XGrpPrivacy=_NO_PRIVACY_; - break; - } - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n RSN IE :Multicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", - sec_ie[4],sec_ie[5],sec_ie[6],sec_ie[7])); - match=_FALSE; - break; - } - - if(sec_ie[8]==0x01) - { - //check the unicast encryption type - if(_rtw_memcmp(&sec_ie[10], &uncst_oui[0],4) !=_TRUE) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Unicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", - sec_ie[10],sec_ie[11],sec_ie[12],sec_ie[13])); - - match =_FALSE; - break; - - } //else the uncst_oui is match - } - else //mixed mode, unicast_enc_type > 1 - { - //select the uncst_oui and remove the other uncst_oui - cnt=sec_ie[8]; - remove_cnt=(cnt-1)*4; - sec_ie[8]=0x01; - _rtw_memcpy( &sec_ie[10] , &uncst_oui[0],4 ); - - //remove the other unicast suit - _rtw_memcpy(&sec_ie[14],&sec_ie[14+remove_cnt],(sec_ie[1]-14+2-remove_cnt)); - sec_ie[1]=sec_ie[1]-remove_cnt; - } - - break; - } - } - - } - - //copy fixed ie only - _rtw_memcpy(out_ie, in_ie,12); - ielength=12; - - if(psecuritypriv->wps_phase == _TRUE) - { - //DBG_871X("wps_phase == _TRUE\n"); - - _rtw_memcpy(out_ie+ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len); - - ielength += psecuritypriv->wps_ie_len; - psecuritypriv->wps_phase = _FALSE; - - } - else if((authmode==_WPA_IE_ID_)||(authmode==_WPA2_IE_ID_)) - { - //copy RSN or SSN - if(match ==_TRUE) - { - _rtw_memcpy(&out_ie[ielength], &sec_ie[0], sec_ie[1]+2); - ielength+=sec_ie[1]+2; - - if(authmode==_WPA2_IE_ID_) - { - //the Pre-Authentication bit should be zero, john - out_ie[ielength-1]= 0; - out_ie[ielength-2]= 0; - } - - rtw_report_sec_ie(adapter, authmode, sec_ie); - -#ifdef CONFIG_DRVEXT_MODULE - drvext_report_sec_ie(&adapter->drvextpriv, authmode, sec_ie); -#endif - - } - - } - else - { - - } - - iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid); - if(iEntry<0) - { - return ielength; - } - else - { - if(authmode == _WPA2_IE_ID_) - { - out_ie[ielength]=1; - ielength++; - out_ie[ielength]=0; //PMKID count = 0x0100 - ielength++; - _rtw_memcpy( &out_ie[ielength], &psecuritypriv->PMKIDList[iEntry].PMKID, 16); - - ielength+=16; - out_ie[13]+=18;//PMKID length = 2+16 - } - } - - //report_sec_ie(adapter, authmode, sec_ie); - -_func_exit_; - - return ielength; -} - -void rtw_init_registrypriv_dev_network( _adapter* adapter) -{ - struct registry_priv* pregistrypriv = &adapter->registrypriv; - struct eeprom_priv* peepriv = &adapter->eeprompriv; - WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; - u8 *myhwaddr = myid(peepriv); - -_func_enter_; - - _rtw_memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN); - - _rtw_memcpy(&pdev_network->Ssid, &pregistrypriv->ssid, sizeof(NDIS_802_11_SSID)); - - pdev_network->Configuration.Length=sizeof(NDIS_802_11_CONFIGURATION); - pdev_network->Configuration.BeaconPeriod = 100; - pdev_network->Configuration.FHConfig.Length = 0; - pdev_network->Configuration.FHConfig.HopPattern = 0; - pdev_network->Configuration.FHConfig.HopSet = 0; - pdev_network->Configuration.FHConfig.DwellTime = 0; - - -_func_exit_; - -} - -void rtw_update_registrypriv_dev_network(_adapter* adapter) -{ - int sz=0; - struct registry_priv* pregistrypriv = &adapter->registrypriv; - WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; - struct security_priv* psecuritypriv = &adapter->securitypriv; - struct wlan_network *cur_network = &adapter->mlmepriv.cur_network; - struct xmit_priv *pxmitpriv = &adapter->xmitpriv; - -_func_enter_; - -#if 0 - pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; - pxmitpriv->vcs = pregistrypriv->vcs_type; - pxmitpriv->vcs_type = pregistrypriv->vcs_type; - //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; - pxmitpriv->frag_len = pregistrypriv->frag_thresh; - - adapter->qospriv.qos_option = pregistrypriv->wmm_enable; -#endif - - pdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; // adhoc no 802.1x - - pdev_network->Rssi = 0; - - switch(pregistrypriv->wireless_mode) - { - case WIRELESS_11B: - pdev_network->NetworkTypeInUse = (Ndis802_11DS); - break; - case WIRELESS_11G: - case WIRELESS_11BG: - case WIRELESS_11_24N: - case WIRELESS_11G_24N: - case WIRELESS_11BG_24N: - pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); - break; - case WIRELESS_11A: - case WIRELESS_11A_5N: - pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); - break; - case WIRELESS_11ABGN: - if(pregistrypriv->channel > 14) - pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); - else - pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); - break; - default : - // TODO - break; - } - - pdev_network->Configuration.DSConfig = (pregistrypriv->channel); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("pregistrypriv->channel=%d, pdev_network->Configuration.DSConfig=0x%x\n", pregistrypriv->channel, pdev_network->Configuration.DSConfig)); - - if(cur_network->network.InfrastructureMode == Ndis802_11IBSS) - pdev_network->Configuration.ATIMWindow = (0); - - pdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode); - - // 1. Supported rates - // 2. IE - - //rtw_set_supported_rate(pdev_network->SupportedRates, pregistrypriv->wireless_mode) ; // will be called in rtw_generate_ie - sz = rtw_generate_ie(pregistrypriv); - - pdev_network->IELength = sz; - - pdev_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pdev_network); - - //notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd(); - //pdev_network->IELength = cpu_to_le32(sz); - -_func_exit_; - -} - -void rtw_get_encrypt_decrypt_from_registrypriv(_adapter* adapter) -{ - u16 wpaconfig=0; - struct registry_priv* pregistrypriv = &adapter->registrypriv; - struct security_priv* psecuritypriv= &adapter->securitypriv; -_func_enter_; - - -_func_exit_; - -} - -//the fucntion is at passive_level -void rtw_joinbss_reset(_adapter *padapter) -{ - u8 threshold; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -#ifdef CONFIG_80211N_HT - struct ht_priv *phtpriv = &pmlmepriv->htpriv; -#endif - - //todo: if you want to do something io/reg/hw setting before join_bss, please add code here - - - - -#ifdef CONFIG_80211N_HT - - pmlmepriv->num_FortyMHzIntolerant = 0; - - pmlmepriv->num_sta_no_ht = 0; - - phtpriv->ampdu_enable = _FALSE;//reset to disabled - -#ifdef CONFIG_USB_HCI - if(phtpriv->ht_option) - { - //validate usb rx aggregation - //rtw_write8(padapter, 0x102500D9, 48);//TH = 48 pages, 6k - threshold = 48; - if(padapter->registrypriv.wifi_spec==1) - threshold = 1; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } - else - { - //invalidate usb rx aggregation - //rtw_write8(padapter, 0x102500D9, 1);// TH=1 => means that invalidate usb rx aggregation - threshold = 1; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } -#endif - -#endif - -} - - -#ifdef CONFIG_80211N_HT - -//the fucntion is >= passive_level -unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len) -{ - u32 ielen, out_len; - unsigned char *p, *pframe; - struct ieee80211_ht_cap ht_capie; - unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - - - phtpriv->ht_option = _FALSE; - - p = rtw_get_ie(in_ie+12, _HT_CAPABILITY_IE_, &ielen, in_len-12); - - if(p && ielen>0) - { - if(pqospriv->qos_option == 0) - { - out_len = *pout_len; - pframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_, - _WMM_IE_Length_, WMM_IE, pout_len); - - pqospriv->qos_option = 1; - } - - out_len = *pout_len; - - _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); - - ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC | - IEEE80211_HT_CAP_DSSSCCK40; - - - { - u32 rx_packet_offset, max_recvbuf_sz; - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - if(max_recvbuf_sz-rx_packet_offset>(8191-256)) { - //DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__); - ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - } - } - - ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | - (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; - - - pframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_, - sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len); - - - //_rtw_memcpy(out_ie+out_len, p, ielen+2);//gtest - //*pout_len = *pout_len + (ielen+2); - - - phtpriv->ht_option = _TRUE; - - p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12); - if(p && (ielen==sizeof(struct ieee80211_ht_addt_info))) - { - out_len = *pout_len; - pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len); - } - - } - - return (phtpriv->ht_option); - -} - -//the fucntion is > passive_level (in critical_section) -void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len) -{ - u8 *p, max_ampdu_sz; - int i, len; - struct sta_info *bmc_sta, *psta; - struct ieee80211_ht_cap *pht_capie; - struct ieee80211_ht_addt_info *pht_addtinfo; - struct recv_reorder_ctrl *preorder_ctrl; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - struct recv_priv *precvpriv = &padapter->recvpriv; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct wlan_network *pcur_network = &(pmlmepriv->cur_network); - - - if(!phtpriv->ht_option) - return; - - - //DBG_8192C("+rtw_update_ht_cap()\n"); - - //maybe needs check if ap supports rx ampdu. - if((phtpriv->ampdu_enable==_FALSE) &&(pregistrypriv->ampdu_enable==1)) - { - if(pregistrypriv->wifi_spec==1) - { - phtpriv->ampdu_enable = _FALSE; - } - else - { - phtpriv->ampdu_enable = _TRUE; - } - } - else if(pregistrypriv->ampdu_enable==2) - { - phtpriv->ampdu_enable = _TRUE; - } - - - //check Max Rx A-MPDU Size - len = 0; - p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); - if(p && len>0) - { - pht_capie = (struct ieee80211_ht_cap *)(p+2); - max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_CAP_AMPDU_FACTOR); - max_ampdu_sz = 1 << (max_ampdu_sz+3); // max_ampdu_sz (kbytes); - - //DBG_8192C("rtw_update_ht_cap(): max_ampdu_sz=%d\n", max_ampdu_sz); - phtpriv->rx_ampdu_maxlen = max_ampdu_sz; - - } - - //for A-MPDU Rx reordering buffer control for bmc_sta & sta_info - //if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff - //todo: check if AP can send A-MPDU packets - bmc_sta = rtw_get_bcmc_stainfo(padapter); - if(bmc_sta) - { - for(i=0; i < 16 ; i++) - { - //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; - preorder_ctrl = &bmc_sta->recvreorder_ctrl[i]; - preorder_ctrl->enable = _FALSE; - preorder_ctrl->indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq); - #endif - preorder_ctrl->wend_b= 0xffff; - preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 - } - } - - psta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress); - if(psta) - { - for(i=0; i < 16 ; i++) - { - //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; - preorder_ctrl = &psta->recvreorder_ctrl[i]; - preorder_ctrl->enable = _FALSE; - preorder_ctrl->indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq); - #endif - preorder_ctrl->wend_b= 0xffff; - preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 - } - } - - len=0; - p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_ADD_INFO_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); - if(p && len>0) - { - pht_addtinfo = (struct ieee80211_ht_addt_info *)(p+2); - } - -} - -void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - u8 issued; - int priority; - struct sta_info *psta=NULL; - struct ht_priv *phtpriv; - struct pkt_attrib *pattrib =&pxmitframe->attrib; - struct sta_priv *pstapriv = &padapter->stapriv; - s32 bmcst = IS_MCAST(pattrib->ra); - - if(bmcst) - return; - - priority = pattrib->priority; - - if (pattrib->psta) - psta = pattrib->psta; - else - psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - - if(psta==NULL) - return; - - phtpriv = &psta->htpriv; - - if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) - { - issued = (phtpriv->agg_enable_bitmap>>priority)&0x1; - issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1; - - if(0==issued) - { - DBG_871X("rtw_issue_addbareq_cmd, p=%d\n", priority); - psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); - rtw_addbareq_cmd(padapter,(u8) priority, pattrib->ra); - } - } - -} - -#endif - -#ifdef CONFIG_LAYER2_ROAMING -void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - _rtw_roaming(padapter, tgt_network); - _exit_critical_bh(&pmlmepriv->lock, &irqL); -} -void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - int do_join_r; - - struct wlan_network *pnetwork; - - if(tgt_network != NULL) - pnetwork = tgt_network; - else - pnetwork = &pmlmepriv->cur_network; - - if(0 < pmlmepriv->to_roaming) { - DBG_871X("roaming from %s("MAC_FMT"), length:%d\n", - pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress), - pnetwork->network.Ssid.SsidLength); - _rtw_memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid, sizeof(NDIS_802_11_SSID)); - - pmlmepriv->assoc_by_bssid = _FALSE; - - while(1) { - if( _SUCCESS==(do_join_r=rtw_do_join(padapter)) ) { - break; - } else { - DBG_871X("roaming do_join return %d\n", do_join_r); - pmlmepriv->to_roaming--; - - if(0< pmlmepriv->to_roaming) { - continue; - } else { - DBG_871X("%s(%d) -to roaming fail, indicate_disconnect\n", __FUNCTION__,__LINE__); - rtw_indicate_disconnect(padapter); - break; - } - } - } - } - -} -#endif - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c b/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c deleted file mode 100755 index 311a3f976041..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c +++ /dev/null @@ -1,10541 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_MLME_EXT_C_ - -#include -#include -#include -#include -#include -#include -#include -#include - -struct mlme_handler mlme_sta_tbl[]={ - {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, - {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, - {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, - {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, - {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, - {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, - - /*---------------------------------------------------------- - below 2 are reserved - -----------------------------------------------------------*/ - {0, "DoReserved", &DoReserved}, - {0, "DoReserved", &DoReserved}, - {WIFI_BEACON, "OnBeacon", &OnBeacon}, - {WIFI_ATIM, "OnATIM", &OnAtim}, - {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, - {WIFI_AUTH, "OnAuth", &OnAuthClient}, - {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, - {WIFI_ACTION, "OnAction", &OnAction}, -}; - -#ifdef _CONFIG_NATIVEAP_MLME_ -struct mlme_handler mlme_ap_tbl[]={ - {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, - {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, - {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, - {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, - {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, - {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, - - /*---------------------------------------------------------- - below 2 are reserved - -----------------------------------------------------------*/ - {0, "DoReserved", &DoReserved}, - {0, "DoReserved", &DoReserved}, - {WIFI_BEACON, "OnBeacon", &OnBeacon}, - {WIFI_ATIM, "OnATIM", &OnAtim}, - {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, - {WIFI_AUTH, "OnAuth", &OnAuth}, - {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, - {WIFI_ACTION, "OnAction", &OnAction}, -}; -#endif - -struct action_handler OnAction_tbl[]={ - {WLAN_CATEGORY_SPECTRUM_MGMT, "ACTION_SPECTRUM_MGMT", &DoReserved}, - {WLAN_CATEGORY_QOS, "ACTION_QOS", &OnAction_qos}, - {WLAN_CATEGORY_DLS, "ACTION_DLS", &OnAction_dls}, - {WLAN_CATEGORY_BACK, "ACTION_BACK", &OnAction_back}, - {WLAN_CATEGORY_PUBLIC, "ACTION_PUBLIC", &OnAction_public}, - {WLAN_CATEGORY_RADIO_MEASUREMENT, "ACTION_RADIO_MEASUREMENT", &DoReserved}, - {WLAN_CATEGORY_FT, "ACTION_FT", &DoReserved}, - {WLAN_CATEGORY_HT, "ACTION_HT", &OnAction_ht}, - {WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved}, - {WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm}, - {WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, -}; - - -/************************************************** -OUI definitions for the vendor specific IE -***************************************************/ -unsigned char WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01}; -unsigned char WMM_OUI[] = {0x00, 0x50, 0xf2, 0x02}; -unsigned char WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04}; - -unsigned char WMM_INFO_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; -unsigned char WMM_PARA_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; - -unsigned char WPA_TKIP_CIPHER[4] = {0x00, 0x50, 0xf2, 0x02}; -unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02}; - -extern unsigned char REALTEK_96B_IE[]; - -/******************************************************** -MCS rate definitions -*********************************************************/ - -unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; -unsigned char MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - -/******************************************************** -ChannelPlan definitions -*********************************************************/ -static RT_CHANNEL_PLAN DefaultChannelPlan[RT_CHANNEL_DOMAIN_MAX] = { - {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},32}, // 0x00, RT_CHANNEL_DOMAIN_FCC - {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},31}, // 0x01, RT_CHANNEL_DOMAIN_IC - {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x02, RT_CHANNEL_DOMAIN_ETSI - {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x03, RT_CHANNEL_DOMAIN_SPAIN - {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x04, RT_CHANNEL_DOMAIN_FRANCE - {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x05, RT_CHANNEL_DOMAIN_MKK - {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x06, RT_CHANNEL_DOMAIN_MKK1 - {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x07, RT_CHANNEL_DOMAIN_ISRAEL - {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x08, RT_CHANNEL_DOMAIN_TELEC -#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ - {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x09, RT_CHANNEL_DOMAIN_MIC - {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x0A, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN - {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x0B, RT_CHANNEL_DOMAIN_WORLD_WIDE_13 - {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x0C, RT_CHANNEL_DOMAIN_TELEC_NETGEAR - {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, // 0x0D, RT_CHANNEL_DOMAIN_NCC -#endif /* Not using EEPROM_CHANNEL_PLAN directly */ - {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x09, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN - {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x0A, RT_CHANNEL_DOMAIN_WORLD_WIDE_13 - {{1,2,3,4,5,6,7,8,9,10,11,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},26}, // 0x0B, RT_CHANNEL_DOMAIN_NCC - {{1,2,3,4,5,6,7,8,9,10,11,149,153,157,161,165},16}, // 0x0C, RT_CHANNEL_DOMAIN_CHINA - {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, // 0x0D, RT_CHANNEL_DOMAIN__SINGAPORE_INDIA_MEXICO - {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165},31}, // 0x0E, RT_CHANNEL_DOMAIN_KOREA - {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, // 0x0F, RT_CHANNEL_DOMAIN_TURKEY - {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x10, RT_CHANNEL_DOMAIN_JAPAN - {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,149,153,157,161,165},20}, // 0x11, RT_CHANNEL_DOMAIN_FCC_NO_DFS - {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48},17}, // 0x12, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS - }; - -/**************************************************************************** - -Following are the initialization functions for WiFi MLME - -*****************************************************************************/ - -extern void joinbss_event_prehandle(_adapter *adapter, u8 *pbuf); - -int init_hw_mlme_ext(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - //set_opmode_cmd(padapter, infra_client_with_mlme);//removed - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - return _SUCCESS; -} - -static void init_mlme_ext_priv_value(_adapter* padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - -#ifdef CONFIG_TDLS - u8 i; -#endif - - //unsigned char default_channel_set[NUM_CHANNELS] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; - unsigned char mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff}; - unsigned char mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, 0xff,}; - - ATOMIC_SET(&pmlmeext->event_seq, 0); - pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode - - pmlmeext->cur_channel = padapter->registrypriv.channel; - pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - pmlmeext->retry = 0; - - pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode; - - //_rtw_memcpy(pmlmeext->channel_set, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Channel, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Len); - //_rtw_memcpy(pmlmeext->channel_set, default_channel_set, NUM_CHANNELS); - _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates); - _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates); - - pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - pmlmeext->sitesurvey_res.channel_idx = 0; - pmlmeext->sitesurvey_res.bss_cnt = 0; - -#ifdef CONFIG_TDLS - _init_workitem(&pmlmeext->TDLS_restore_workitem, TDLS_restore_workitem_callback, pmlmeext); -#endif - - pmlmeinfo->state = WIFI_FW_NULL_STATE; - pmlmeinfo->reauth_count = 0; - pmlmeinfo->reassoc_count = 0; - pmlmeinfo->link_count = 0; - pmlmeinfo->auth_seq = 0; - pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open; - pmlmeinfo->key_index = 0; - pmlmeinfo->iv = 0; - -#ifdef CONFIG_TDLS - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - pmlmeinfo->tdls_sta_cnt=0; - pmlmeinfo->tdls_dis_req=0; - pmlmeinfo->tdls_cam_entry_to_write=6; - pmlmeinfo->tdls_cam_entry_to_clear=0; - pmlmeinfo->tdls_ch_sensing=0; - pmlmeinfo->tdls_cur_channel=0; - pmlmeinfo->tdls_candidate_ch=1; //when inplement channel switching, default candidate channel is 1 - for(i=0; i<14; i++) - pmlmeinfo->tdls_collect_pkt_num[i]=0; -#endif - - pmlmeinfo->enc_algo = _NO_PRIVACY_; - pmlmeinfo->authModeToggle = 0; - - _rtw_memset(pmlmeinfo->chg_txt, 0, 128); - - pmlmeinfo->slotTime = SHORT_SLOT_TIME; - pmlmeinfo->preamble_mode = PREAMBLE_AUTO; - - pmlmeinfo->dialogToken = 0; -} - -static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set) -{ - u8 index,chanset_size = 0; - u8 b5GBand = _FALSE, b2_4GBand = _FALSE; - - _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*NUM_CHANNELS); - - printk(KERN_NOTICE "ChannelPlan = 0x%02x\n", ChannelPlan);//add by gwl - - if(ChannelPlan >= RT_CHANNEL_DOMAIN_MAX) - { - DBG_8192C("channel plan id error \n"); - return chanset_size; - } - - if(padapter->registrypriv.wireless_mode & WIRELESS_11G) - { - b2_4GBand = _TRUE; - } - - if(padapter->registrypriv.wireless_mode & WIRELESS_11A) - { - b5GBand = _TRUE; - } - - for(index=0;index= 1 && channel_set[chanset_size].ChannelNum <= 11) - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - else if((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) - channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } - else if(RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == ChannelPlan)// channel 12~13, passive scan - { - if(channel_set[chanset_size].ChannelNum <= 11) - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - else - channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } - else - { - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - } - - chanset_size++; - } - else if((DefaultChannelPlan[ChannelPlan].Channel[index] >= 36) && (b5GBand)) - { -#ifdef DFS - channel_set[chanset_size].ChannelNum = DefaultChannelPlan[ChannelPlan].Channel[index]; - if ( channel_set[chanset_size].ChannelNum <= 48 - || channel_set[chanset_size].ChannelNum >= 149 ) - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - else - channel_set[chanset_size].ScanType = SCAN_PASSIVE; - chanset_size++; -#else /* DFS */ - if ( DefaultChannelPlan[ChannelPlan].Channel[index] <= 48 - || DefaultChannelPlan[ChannelPlan].Channel[index] >= 149 ) { - channel_set[chanset_size].ChannelNum = DefaultChannelPlan[ChannelPlan].Channel[index]; - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - DBG_8192C("%s(): channel_set[%d].ChannelNum = %d\n", __FUNCTION__, chanset_size, channel_set[chanset_size].ChannelNum); - chanset_size++; - } -#endif /* DFS */ - } - } - - return chanset_size; -} - -int init_mlme_ext_priv(_adapter* padapter) -{ - int res = _SUCCESS; - struct registry_priv* pregistrypriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - _rtw_memset((u8 *)pmlmeext, 0, sizeof(struct mlme_ext_priv)); - pmlmeext->padapter = padapter; - - //fill_fwpriv(padapter, &(pmlmeext->fwpriv)); - - init_mlme_ext_priv_value(padapter); - pmlmeinfo->bAcceptAddbaReq = pregistrypriv->bAcceptAddbaReq; - - init_mlme_ext_timer(padapter); - -#ifdef CONFIG_AP_MODE - init_mlme_ap_info(padapter); -#endif - - pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set); - - pmlmeext->chan_scan_time = SURVEY_TO; - pmlmeext->mlmeext_init = _TRUE; - - return res; - -} - -void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext) -{ - _adapter *padapter = pmlmeext->padapter; - - if (!padapter) - return; - -#ifdef CONFIG_AP_MODE - free_mlme_ap_info(padapter); -#endif - - if (padapter->bDriverStopped == _TRUE) - { - _cancel_timer_ex(&pmlmeext->survey_timer); - _cancel_timer_ex(&pmlmeext->link_timer); - //_cancel_timer_ex(&pmlmeext->ADDBA_timer); - } - - -} - -static void UpdateBrateTbl( - IN PADAPTER Adapter, - IN u8 *mBratesOS -) -{ - u8 i; - u8 rate; - - // 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory. - for(i=0;iu.hdr.rx_data; - uint len = precv_frame->u.hdr.len; - - if(ptable->func) - { - //receive the frames that ra(a1) is my address or ra(a1) is bc address. - if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && - !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) - { - return; - } - - ptable->func(padapter, precv_frame); - } - -} - -void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) -{ - int index; - struct mlme_handler *ptable; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - u8 *pframe = precv_frame->u.hdr.rx_data; - uint len = precv_frame->u.hdr.len; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, - ("+mgt_dispatcher: type(0x%x) subtype(0x%x)\n", - GetFrameType(pframe), GetFrameSubType(pframe))); - -#if 0 - { - u8 *pbuf; - pbuf = GetAddr1Ptr(pframe); - DBG_8192C("A1-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); - pbuf = GetAddr2Ptr(pframe); - DBG_8192C("A2-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); - pbuf = GetAddr3Ptr(pframe); - DBG_8192C("A3-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); - } -#endif - - if (GetFrameType(pframe) != WIFI_MGT_TYPE) - { - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("mgt_dispatcher: type(0x%x) error!\n", GetFrameType(pframe))); - return; - } - - //receive the frames that ra(a1) is my address or ra(a1) is bc address. - if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && - !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) - { - return; - } - - ptable = mlme_sta_tbl; - - index = GetFrameSubType(pframe) >> 4; - -#ifdef CONFIG_TDLS - if((index << 4)==WIFI_ACTION){ - //category==public (4), action==TDLS_DISCOVERY_RESPONSE - if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){ - DBG_8192C("recv tdls discovery response frame\n"); - On_TDLS_Dis_Rsp(padapter, precv_frame); - } - } -#endif - - if (index > 13) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Currently we do not support reserved sub-fr-type=%d\n", index)); - return; - } - ptable += index; - -#if 0//gtest - sa = get_sa(pframe); - psta = search_assoc_sta(sa, padapter); - // only check last cache seq number for management frame - if (psta != NULL) { - if (GetRetry(pframe)) { - if (GetTupleCache(pframe) == psta->rxcache->nonqos_seq){ - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n")); - return; - } - } - psta->rxcache->nonqos_seq = GetTupleCache(pframe); - } -#else - - if(GetRetry(pframe)) - { - //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n")); - //return; - } -#endif - -#ifdef CONFIG_AP_MODE - switch (GetFrameSubType(pframe)) - { - case WIFI_AUTH: - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - ptable->func = &OnAuth; - else - ptable->func = &OnAuthClient; - //pass through - case WIFI_ASSOCREQ: - case WIFI_REASSOCREQ: - _mgt_dispatcher(padapter, ptable, precv_frame); -#ifdef CONFIG_HOSTAPD_MLME - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - rtw_hostapd_mlme_rx(padapter, precv_frame); -#endif - break; - case WIFI_PROBEREQ: - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { -#ifdef CONFIG_HOSTAPD_MLME - rtw_hostapd_mlme_rx(padapter, precv_frame); -#else - _mgt_dispatcher(padapter, ptable, precv_frame); -#endif - } - else - _mgt_dispatcher(padapter, ptable, precv_frame); - break; - case WIFI_BEACON: - _mgt_dispatcher(padapter, ptable, precv_frame); - break; - case WIFI_ACTION: - //if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - _mgt_dispatcher(padapter, ptable, precv_frame); - break; - default: - _mgt_dispatcher(padapter, ptable, precv_frame); - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - rtw_hostapd_mlme_rx(padapter, precv_frame); - break; - } -#else - - _mgt_dispatcher(padapter, ptable, precv_frame); - -#endif - -} - -#ifdef CONFIG_P2P -u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da) -{ - issue_probersp_p2p( padapter, da); - return _SUCCESS; -} -#endif //CONFIG_P2P - - -/**************************************************************************** - -Following are the callback functions for each subtype of the management frames - -*****************************************************************************/ - -unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame) -{ - unsigned int ielen; - unsigned char *p; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur = &(pmlmeinfo->network); - u8 *pframe = precv_frame->u.hdr.rx_data; - uint len = precv_frame->u.hdr.len; - u8 is_valid_p2p_probereq = _FALSE; - -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; - - if ( ( pwdinfo->p2p_state != P2P_STATE_NONE ) && - ( pwdinfo->p2p_state != P2P_STATE_IDLE ) && - ( pwdinfo->role != P2P_ROLE_CLIENT ) && - ( pwdinfo->p2p_state != P2P_STATE_FIND_PHASE_SEARCH ) && - (pwdinfo->p2p_state != P2P_STATE_SCAN ) - ) - { - // Commented by Albert 2011/03/17 - // mcs_rate = 0 -> CCK 1M rate - // mcs_rate = 1 -> CCK 2M rate - // mcs_rate = 2 -> CCK 5.5M rate - // mcs_rate = 3 -> CCK 11M rate - // In the P2P mode, the driver should not support the CCK rate - if ( pattrib->mcs_rate > 3 ) - { - if((is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len)) == _TRUE) - { - if(pwdinfo->role == P2P_ROLE_DEVICE) - { - p2p_listen_state_process( padapter, get_sa(pframe)); - - return _SUCCESS; - } - - if(pwdinfo->role == P2P_ROLE_GO) - { - goto _continue; - } - } - } - } -#endif //CONFIG_P2P - -_continue: - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - { - return _SUCCESS; - } - - if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE && - check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)==_FALSE) - { - return _SUCCESS; - } - - - //DBG_871X("+OnProbeReq\n"); - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); - - - //check (wildcard) SSID - if (p != NULL) - { - if(is_valid_p2p_probereq == _TRUE) - { - goto _issue_probersp; - } - - if ((ielen != 0) && (!_rtw_memcmp((void *)(p+2), (void *)cur->Ssid.Ssid, le32_to_cpu(cur->Ssid.SsidLength)))) - { - return _SUCCESS; - } - -_issue_probersp: - - issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq); - - } - - return _SUCCESS; - -} - -unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct sta_info *psta; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *pframe = precv_frame->u.hdr.rx_data; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &padapter->wdinfo; -#endif - - -#ifdef CONFIG_P2P - if (P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) - { - if ( _TRUE == pwdinfo->tx_prov_disc_info.benable ) - { - if( _rtw_memcmp( pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) - { - if ( P2P_ROLE_CLIENT == pwdinfo->role ) - { - pwdinfo->tx_prov_disc_info.benable = _FALSE; - issue_p2p_provision_request( padapter, - pwdinfo->tx_prov_disc_info.peerIFAddr, - pwdinfo->tx_prov_disc_info.ssid.Ssid, - pwdinfo->tx_prov_disc_info.ssid.SsidLength, - pwdinfo->tx_prov_disc_info.peerDevAddr ); - } - else if ( ( P2P_ROLE_DEVICE == pwdinfo->role ) || ( P2P_ROLE_GO == pwdinfo->role ) ) - { - pwdinfo->tx_prov_disc_info.benable = _FALSE; - issue_p2p_provision_request( padapter, - pwdinfo->tx_prov_disc_info.peerIFAddr, - NULL, - 0, - pwdinfo->tx_prov_disc_info.peerDevAddr ); - } - } - } - return _SUCCESS; - } - else if ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) - { - if ( _TRUE == pwdinfo->nego_req_info.benable ) - { - printk( "[%s] P2P State is GONEGO ING!\n", __FUNCTION__ ); - if( _rtw_memcmp( pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) - { - pwdinfo->nego_req_info.benable = _FALSE; - issue_p2p_GO_request( padapter, pwdinfo->nego_req_info.peerDevAddr); - } - } - } -#endif - - report_survey_event(padapter, precv_frame); - - if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) - { - return _SUCCESS; - } - - if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) - { - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - { - if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) - { - psta->sta_stats.rx_pkts++; - } - } - } - - return _SUCCESS; - -} - -unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) -{ - int cam_idx; - struct sta_info *psta; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *pframe = precv_frame->u.hdr.rx_data; - uint len = precv_frame->u.hdr.len; - - if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) - { - report_survey_event(padapter, precv_frame); - - return _SUCCESS; - } - - if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) - { - if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) - { - //check the vendor of the assoc AP - pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe+sizeof(struct ieee80211_hdr_3addr), len-sizeof(struct ieee80211_hdr_3addr)); - - //update TSF Value - update_TSF(pmlmeext, pframe, len); - - //start auth - start_clnt_auth(padapter); - - return _SUCCESS; - } - - if(((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) - { - if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) - { - //update WMM, ERP in the beacon - //todo: the timer is used instead of the number of the beacon received - if ((psta->sta_stats.rx_pkts & 0xf) == 0) - { - //DBG_871X("update_bcn_info\n"); - update_beacon_info(padapter, pframe, len, psta); - } -#ifdef CONFIG_P2P - process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)); -#endif //CONFIG_P2P - psta->sta_stats.rx_pkts++; - } - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) - { - //update WMM, ERP in the beacon - //todo: the timer is used instead of the number of the beacon received - if ((psta->sta_stats.rx_pkts & 0xf) == 0) - { - //DBG_871X("update_bcn_info\n"); - update_beacon_info(padapter, pframe, len, psta); - } - psta->sta_stats.rx_pkts++; - } - else - { - //allocate a new CAM entry for IBSS station - if ((cam_idx = allocate_fw_sta_entry(padapter)) == NUM_STA) - { - goto _END_ONBEACON_; - } - - //get supported rate - if (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL) - { - pmlmeinfo->FW_sta_info[cam_idx].status = 0; - goto _END_ONBEACON_; - } - - //update TSF Value - update_TSF(pmlmeext, pframe, len); - - //report sta add event - report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx); - - //pmlmeext->linked_to = LINKED_TO; - } - } - } - -_END_ONBEACON_: - - return _SUCCESS; - -} - -unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) -{ -#ifdef CONFIG_AP_MODE - unsigned int auth_mode, seq, ie_len; - unsigned char *sa, *p; - u16 algorithm; - int status; - static struct sta_info stat; - struct sta_info *pstat=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 *pframe = precv_frame->u.hdr.rx_data; - uint len = precv_frame->u.hdr.len; - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return _FAIL; - - DBG_871X("+OnAuth\n"); - - sa = GetAddr2Ptr(pframe); - - auth_mode = psecuritypriv->dot11AuthAlgrthm; - seq = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 2)); - algorithm = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN)); - - if (GetPrivacy(pframe)) - { -#if 0 //TODO: SW rtw_wep_decrypt - if (SWCRYPTO) - { - status = rtw_wep_decrypt(priv, pframe, pfrinfo->pktlen, - priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm); - if (status == FALSE) - { - SAVE_INT_AND_CLI(flags); - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"wep-decrypt a Auth frame error!\n"); - status = _STATS_CHALLENGE_FAIL_; - goto auth_fail; - } - } - - seq = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4 + 2)); - algorithm = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4)); -#endif - } - - - DBG_871X("auth alg=%x, seq=%X\n", algorithm, seq); - - if (auth_mode == 2 && - psecuritypriv->dot11PrivacyAlgrthm != _WEP40_ && - psecuritypriv->dot11PrivacyAlgrthm != _WEP104_) - auth_mode = 0; - - if ((algorithm > 0 && auth_mode == 0) || // rx a shared-key auth but shared not enabled - (algorithm == 0 && auth_mode == 1) ) // rx a open-system auth but shared-key is enabled - { - DBG_871X("auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\n", - algorithm, auth_mode, sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]); - - status = _STATS_NO_SUPP_ALG_; - - goto auth_fail; - } - -#if 0 //TODO:ACL control - phead = &priv->wlan_acl_list; - plist = phead->next; - //check sa - if (acl_mode == 1) // 1: positive check, only those on acl_list can be connected. - res = FAIL; - else - res = SUCCESS; - - while(plist != phead) - { - paclnode = list_entry(plist, struct rtw_wlan_acl_node, list); - plist = plist->next; - if (!memcmp((void *)sa, paclnode->addr, 6)) { - if (paclnode->mode & 2) { // deny - res = FAIL; - break; - } - else { - res = SUCCESS; - break; - } - } - } - - if (res != SUCCESS) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"auth abort because ACL!\n"); - return FAIL; - } -#endif - - pstat = rtw_get_stainfo(pstapriv, sa); - if (pstat == NULL) - { - // allocate a new one - DBG_871X("going to alloc stainfo for sa=%02X%02X%02X%02X%02X%02X\n", sa[0],sa[1],sa[2],sa[3],sa[4],sa[5]); - pstat = rtw_alloc_stainfo(pstapriv, sa); - if (pstat == NULL) - { - DBG_871X(" Exceed the upper limit of supported clients...\n"); - status = _STATS_UNABLE_HANDLE_STA_; - goto auth_fail; - } - - pstat->state = WIFI_FW_AUTH_NULL; - pstat->auth_seq = 0; - - //pstat->flags = 0; - //pstat->capability = 0; - } - else - { - if(rtw_is_list_empty(&pstat->asoc_list)==_FALSE) - { - rtw_list_delete(&pstat->asoc_list); - if (pstat->expire_to > 0) - { - //TODO: STA re_auth within expire_to - } - } - if (seq==1) { - //TODO: STA re_auth and auth timeout - } - } - - if (rtw_is_list_empty(&pstat->auth_list)) - { - rtw_list_insert_tail(&pstat->auth_list, &pstapriv->auth_list); - } - - - if (pstat->auth_seq == 0) - pstat->expire_to = pstapriv->auth_to; - - if ((pstat->auth_seq + 1) != seq) - { - DBG_871X("(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", - seq, pstat->auth_seq+1); - status = _STATS_OUT_OF_AUTH_SEQ_; - goto auth_fail; - } - - if (algorithm==0 && (auth_mode == 0 || auth_mode == 2)) - { - if (seq == 1) - { - pstat->state &= ~WIFI_FW_AUTH_NULL; - pstat->state |= WIFI_FW_AUTH_SUCCESS; - pstat->expire_to = pstapriv->assoc_to; - pstat->authalg = algorithm; - } - else - { - DBG_871X("(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", - seq, pstat->auth_seq+1); - status = _STATS_OUT_OF_AUTH_SEQ_; - goto auth_fail; - } - } - else // shared system or auto authentication - { - if (seq == 1) - { - //prepare for the challenging txt... - - //get_random_bytes((void *)pstat->chg_txt, 128);//TODO: - - pstat->state &= ~WIFI_FW_AUTH_NULL; - pstat->state |= WIFI_FW_AUTH_STATE; - pstat->authalg = algorithm; - pstat->auth_seq = 2; - } - else if (seq == 3) - { - //checking for challenging txt... - DBG_871X("checking for challenging txt...\n"); - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_ , _CHLGETXT_IE_, (int *)&ie_len, - len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4); - - if((p==NULL) || (ie_len<=0)) - { - DBG_871X("auth rejected because challenge failure!(1)\n"); - status = _STATS_CHALLENGE_FAIL_; - goto auth_fail; - } - - if (_rtw_memcmp((void *)(p + 2), pstat->chg_txt, 128)) - { - pstat->state &= (~WIFI_FW_AUTH_STATE); - pstat->state |= WIFI_FW_AUTH_SUCCESS; - // challenging txt is correct... - pstat->expire_to = pstapriv->assoc_to; - } - else - { - DBG_871X("auth rejected because challenge failure!\n"); - status = _STATS_CHALLENGE_FAIL_; - goto auth_fail; - } - } - else - { - DBG_871X("(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", - seq, pstat->auth_seq+1); - status = _STATS_OUT_OF_AUTH_SEQ_; - goto auth_fail; - } - } - - - // Now, we are going to issue_auth... - pstat->auth_seq = seq + 1; - -#ifdef CONFIG_NATIVEAP_MLME - issue_auth(padapter, pstat, (unsigned short)(_STATS_SUCCESSFUL_)); -#endif - - if (pstat->state & WIFI_FW_AUTH_SUCCESS) - pstat->auth_seq = 0; - - - return _SUCCESS; - -auth_fail: - - if (pstat) - { - pstat = &stat; - _rtw_memset((char *)pstat, '\0', sizeof(stat)); - pstat->auth_seq = 2; - _rtw_memcpy(pstat->hwaddr, sa, 6); - } - -#ifdef CONFIG_NATIVEAP_MLME - issue_auth(padapter, pstat, (unsigned short)status); -#endif - -#endif - return _FAIL; - -} - -unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame) -{ - unsigned int seq, len, status, algthm, offset; - unsigned char *p; - unsigned int go2asoc = 0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 *pframe = precv_frame->u.hdr.rx_data; - uint pkt_len = precv_frame->u.hdr.len; - - //DBG_871X("%s\n", __FUNCTION__); - - //check A1 matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) - return _SUCCESS; - - if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE)) - return _SUCCESS; - - offset = (GetPrivacy(pframe))? 4: 0; - - algthm = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset)); - seq = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2)); - status = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 4)); - - if (status != 0) - { - DBG_871X("clnt auth fail, status: %d\n", status); - goto authclnt_fail; - } - - if (seq == 2) - { - if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) - { - // legendary shared system - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len, - pkt_len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_); - - if (p == NULL) - { - //DBG_8192C("marc: no challenge text?\n"); - goto authclnt_fail; - } - - _rtw_memcpy((void *)(pmlmeinfo->chg_txt), (void *)(p + 2), len); - pmlmeinfo->auth_seq = 3; - issue_auth(padapter, NULL, 0); - set_link_timer(pmlmeext, REAUTH_TO); - - return _SUCCESS; - } - else - { - // open system - go2asoc = 1; - } - } - else if (seq == 4) - { - if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) - { - go2asoc = 1; - } - else - { - goto authclnt_fail; - } - } - else - { - // this is also illegal - //DBG_8192C("marc: clnt auth failed due to illegal seq=%x\n", seq); - goto authclnt_fail; - } - - if (go2asoc) - { - start_clnt_assoc(padapter); - return _SUCCESS; - } - -authclnt_fail: - - //pmlmeinfo->state &= ~(WIFI_FW_AUTH_STATE); - - return _FAIL; - -} - -unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) -{ -#ifdef CONFIG_AP_MODE - u16 capab_info, listen_interval; - struct ieee802_11_elems elems; - struct sta_info *pstat; - unsigned char reassoc, *p, *pos, *wpa_ie; - unsigned char rsnie_hdr[4]={0x00, 0x50, 0xf2, 0x01}; - unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; - int i, ie_len, wpa_ie_len, left; - unsigned long flags; - unsigned char supportRate[16]; - int supportRateNum; - unsigned short status = _STATS_SUCCESSFUL_; - unsigned short frame_type, ie_offset=0; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur = &(pmlmeinfo->network); - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *pframe = precv_frame->u.hdr.rx_data; - uint pkt_len = precv_frame->u.hdr.len; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 p2p_status_code = P2P_STATUS_SUCCESS; - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u32 p2pielen = 0; -#endif //CONFIG_P2P - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - return _FAIL; - - frame_type = GetFrameSubType(pframe); - if (frame_type == WIFI_ASSOCREQ) - { - reassoc = 0; - ie_offset = _ASOCREQ_IE_OFFSET_; - } - else // WIFI_REASSOCREQ - { - reassoc = 1; - ie_offset = _REASOCREQ_IE_OFFSET_; - } - - - if (pkt_len < IEEE80211_3ADDR_LEN + ie_offset) { - DBG_871X("handle_assoc(reassoc=%d) - too short payload (len=%lu)" - "\n", reassoc, (unsigned long)pkt_len); - return _FAIL; - } - - pstat = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - if (pstat == (struct sta_info *)NULL) - { - status = _RSON_CLS2_; - goto asoc_class2_error; - } - - capab_info = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN); - //capab_info = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - //listen_interval = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN+2)); - listen_interval = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN+2); - - left = pkt_len - (IEEE80211_3ADDR_LEN + ie_offset); - pos = pframe + (IEEE80211_3ADDR_LEN + ie_offset); - - - DBG_871X("%s\n", __FUNCTION__); - - // check if this stat has been successfully authenticated/assocated - if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS)) - { - if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS)) - { - status = _RSON_CLS2_; - goto asoc_class2_error; - } - else - { - pstat->state &= (~WIFI_FW_ASSOC_SUCCESS); - pstat->state |= WIFI_FW_ASSOC_STATE; - } - } - else - { - pstat->state &= (~WIFI_FW_AUTH_SUCCESS); - pstat->state |= WIFI_FW_ASSOC_STATE; - } - - -#if 0// todo:tkip_countermeasures - if (hapd->tkip_countermeasures) { - resp = WLAN_REASON_MICHAEL_MIC_FAILURE; - goto fail; - } -#endif - - pstat->capability = capab_info; - -#if 0//todo: - //check listen_interval - if (listen_interval > hapd->conf->max_listen_interval) { - hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, - HOSTAPD_LEVEL_DEBUG, - "Too large Listen Interval (%d)", - listen_interval); - resp = WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE; - goto fail; - } - - pstat->listen_interval = listen_interval; -#endif - - //now parse all ieee802_11 ie to point to elems - if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed || - !elems.ssid) { - DBG_871X("STA " MAC_FMT " sent invalid association request\n", - MAC_ARG(pstat->hwaddr)); - status = _STATS_FAILURE_; - goto OnAssocReqFail; - } - - - // now we should check all the fields... - // checking SSID - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SSID_IE_, &ie_len, - pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p == NULL) - { - status = _STATS_FAILURE_; - } - - if (ie_len == 0) // broadcast ssid, however it is not allowed in assocreq - status = _STATS_FAILURE_; - else - { - // check if ssid match - if (!_rtw_memcmp((void *)(p+2), cur->Ssid.Ssid, cur->Ssid.SsidLength)) - status = _STATS_FAILURE_; - - if (ie_len != cur->Ssid.SsidLength) - status = _STATS_FAILURE_; - } - - if(_STATS_SUCCESSFUL_ != status) - goto OnAssocReqFail; - - // check if the supported rate is ok - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p == NULL) { - DBG_871X("Rx a sta assoc-req which supported rate is empty!\n"); - // use our own rate set as statoin used - //_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN); - //supportRateNum = AP_BSSRATE_LEN; - - status = _STATS_FAILURE_; - goto OnAssocReqFail; - } - else { - _rtw_memcpy(supportRate, p+2, ie_len); - supportRateNum = ie_len; - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_ , &ie_len, - pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p != NULL) { - - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); - supportRateNum += ie_len; - } - } - } - - //todo: mask supportRate between AP & STA -> move to update raid - //get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0); - - //update station supportRate - pstat->bssratelen = supportRateNum; - _rtw_memcpy(pstat->bssrateset, supportRate, supportRateNum); - - - //check RSN/WPA/WPS - pstat->dot8021xalg = 0; - pstat->wpa_psk = 0; - pstat->wpa_group_cipher = 0; - pstat->wpa2_group_cipher = 0; - pstat->wpa_pairwise_cipher = 0; - pstat->wpa2_pairwise_cipher = 0; - _rtw_memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie)); - if((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) { - - int group_cipher=0, pairwise_cipher=0; - - wpa_ie = elems.rsn_ie; - wpa_ie_len = elems.rsn_ie_len; - - if(rtw_parse_wpa2_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) - { - pstat->dot8021xalg = 1;//psk, todo:802.1x - pstat->wpa_psk |= BIT(1); - - pstat->wpa2_group_cipher = group_cipher&psecuritypriv->wpa2_group_cipher; - pstat->wpa2_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa2_pairwise_cipher; - - if(!pstat->wpa2_group_cipher) - status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; - - if(!pstat->wpa2_pairwise_cipher) - status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; - } - else - { - status = WLAN_STATUS_INVALID_IE; - } - - } else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) { - - int group_cipher=0, pairwise_cipher=0; - - wpa_ie = elems.wpa_ie; - wpa_ie_len = elems.wpa_ie_len; - - if(rtw_parse_wpa_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) - { - pstat->dot8021xalg = 1;//psk, todo:802.1x - pstat->wpa_psk |= BIT(0); - - pstat->wpa_group_cipher = group_cipher&psecuritypriv->wpa_group_cipher; - pstat->wpa_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa_pairwise_cipher; - - if(!pstat->wpa_group_cipher) - status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; - - if(!pstat->wpa_pairwise_cipher) - status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; - - } - else - { - status = WLAN_STATUS_INVALID_IE; - } - - } else { - wpa_ie = NULL; - wpa_ie_len = 0; - } - - if(_STATS_SUCCESSFUL_ != status) - goto OnAssocReqFail; - - pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS); - //if (hapd->conf->wps_state && wpa_ie == NULL) { //todo: to check ap if supporting WPS - if(wpa_ie == NULL) { - if (elems.wps_ie) { - DBG_871X("STA included WPS IE in " - "(Re)Association Request - assume WPS is " - "used\n"); - pstat->flags |= WLAN_STA_WPS; - //wpabuf_free(sta->wps_ie); - //sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4, - // elems.wps_ie_len - 4); - } else { - DBG_871X("STA did not include WPA/RSN IE " - "in (Re)Association Request - possible WPS " - "use\n"); - pstat->flags |= WLAN_STA_MAYBE_WPS; - } - } else if (psecuritypriv->wpa_psk && wpa_ie == NULL) { - DBG_871X("STA " MAC_FMT ": No WPA/RSN IE in association " - "request\n", MAC_ARG(pstat->hwaddr)); - status = WLAN_STATUS_INVALID_IE; - goto OnAssocReqFail; - } - else - { - int copy_len; - - copy_len = ((wpa_ie_len+2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)):(wpa_ie_len+2); - - _rtw_memcpy(pstat->wpa_ie, wpa_ie-2, copy_len); - } - - - // check if there is WMM IE & support WWM-PS - pstat->flags &= ~WLAN_STA_WME; - pstat->qos_option = 0; - pstat->qos_info = 0; - pstat->has_legacy_ac = _TRUE; - pstat->uapsd_vo = 0; - pstat->uapsd_vi = 0; - pstat->uapsd_be = 0; - pstat->uapsd_bk = 0; - if (pmlmepriv->qospriv.qos_option) - { - p = pframe + WLAN_HDR_A3_LEN + ie_offset; ie_len = 0; - for (;;) - { - p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p != NULL) { - if (_rtw_memcmp(p+2, WMM_IE, 6)) { - - pstat->flags |= WLAN_STA_WME; - - pstat->qos_option = 1; - pstat->qos_info = *(p+8); - - pstat->max_sp_len = (pstat->qos_info>>5)&0x3; - - if((pstat->qos_info&0xf) !=0xf) - pstat->has_legacy_ac = _TRUE; - else - pstat->has_legacy_ac = _FALSE; - - if(pstat->qos_info&0xf) - { - if(pstat->qos_info&BIT(0)) - pstat->uapsd_vo = BIT(0)|BIT(1); - else - pstat->uapsd_vo = 0; - - if(pstat->qos_info&BIT(1)) - pstat->uapsd_vi = BIT(0)|BIT(1); - else - pstat->uapsd_vi = 0; - - if(pstat->qos_info&BIT(2)) - pstat->uapsd_bk = BIT(0)|BIT(1); - else - pstat->uapsd_bk = 0; - - if(pstat->qos_info&BIT(3)) - pstat->uapsd_be = BIT(0)|BIT(1); - else - pstat->uapsd_be = 0; - - } - - break; - } - } - else { - break; - } - p = p + ie_len + 2; - } - } - - -#ifdef CONFIG_80211N_HT - /* save HT capabilities in the sta object */ - _rtw_memset(&pstat->htpriv.ht_cap, 0, sizeof(struct ieee80211_ht_cap)); - if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct ieee80211_ht_cap)) - { - pstat->flags |= WLAN_STA_HT; - - pstat->flags |= WLAN_STA_WME; - - _rtw_memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct ieee80211_ht_cap)); - - } else - pstat->flags &= ~WLAN_STA_HT; - - - if((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT)) - { - status = _STATS_FAILURE_; - goto OnAssocReqFail; - } - - - if ((pstat->flags & WLAN_STA_HT) && - ((pstat->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || - (pstat->wpa_pairwise_cipher&WPA_CIPHER_TKIP))) - { - DBG_871X("HT: " MAC_FMT " tried to " - "use TKIP with HT association\n", MAC_ARG(pstat->hwaddr)); - - //status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY; - //goto OnAssocReqFail; - } -#endif /* CONFIG_80211N_HT */ - - // - //if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)//? - pstat->flags |= WLAN_STA_NONERP; - for (i = 0; i < pstat->bssratelen; i++) { - if ((pstat->bssrateset[i] & 0x7f) > 22) { - pstat->flags &= ~WLAN_STA_NONERP; - break; - } - } - - if (pstat->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) - pstat->flags |= WLAN_STA_SHORT_PREAMBLE; - else - pstat->flags &= ~WLAN_STA_SHORT_PREAMBLE; - - - - if (status != _STATS_SUCCESSFUL_) - goto OnAssocReqFail; - -#ifdef CONFIG_P2P - pstat->is_p2p_device = _FALSE; - if(pwdinfo->role == P2P_ROLE_GO) - { - if(rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , p2pie, &p2pielen)) - { - pstat->is_p2p_device = _TRUE; - if((p2p_status_code=(u8)process_assoc_req_p2p_ie(pwdinfo, p2pie, p2pielen, pstat))>0) - { - pstat->p2p_status_code = p2p_status_code; - status = _STATS_CAP_FAIL_; - goto OnAssocReqFail; - } - } - } - pstat->p2p_status_code = p2p_status_code; -#endif //CONFIG_P2P - - //TODO: identify_proprietary_vendor_ie(); - // Realtek proprietary IE - // identify if this is Broadcom sta - // identify if this is ralink sta - // Customer proprietary IE - - - - /* get a unique AID */ - if (pstat->aid > 0) { - DBG_871X(" old AID %d\n", pstat->aid); - } else { - for (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++) - if (pstapriv->sta_aid[pstat->aid - 1] == NULL) - break; - - //if (pstat->aid > NUM_STA) { - if (pstat->aid > pstapriv->max_num_sta) { - - pstat->aid = 0; - - DBG_871X(" no room for more AIDs\n"); - - status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; - - goto OnAssocReqFail; - - - } else { - pstapriv->sta_aid[pstat->aid - 1] = pstat; - DBG_871X("allocate new AID = (%d)\n", pstat->aid); - } - } - - - pstat->state &= (~WIFI_FW_ASSOC_STATE); - pstat->state |= WIFI_FW_ASSOC_SUCCESS; - - if (!rtw_is_list_empty(&pstat->auth_list)) - { - rtw_list_delete(&pstat->auth_list); - } - if (rtw_is_list_empty(&pstat->asoc_list)) - { - pstat->expire_to = pstapriv->expire_to; - rtw_list_insert_tail(&pstat->asoc_list, &pstapriv->asoc_list); - } - - - // now the station is qualified to join our BSS... - if(pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_==status)) - { -#ifdef CONFIG_NATIVEAP_MLME - //.1 bss_cap_update - //bss_cap_update(padapter, pstat); - - - //.2 - - DBG_871X("indicate_sta_join_event to upper layer - hostapd\n"); - rtw_indicate_sta_assoc_event(padapter, pstat); - - - //.3-(1) report sta add event - report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); - - //.3 -(2) - //sta_info_update(padapter, pstat); - - if (frame_type == WIFI_ASSOCREQ) - issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); - else - issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); - -#endif - } - - return _SUCCESS; - -asoc_class2_error: - -#ifdef CONFIG_NATIVEAP_MLME - issue_deauth(padapter, (void *)GetAddr2Ptr(pframe), status); -#endif - - return _FAIL; - -OnAssocReqFail: - - -#ifdef CONFIG_NATIVEAP_MLME - pstat->aid = 0; - if (frame_type == WIFI_ASSOCREQ) - issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); - else - issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); -#endif - - -#endif /* CONFIG_AP_MODE */ - - return _FAIL; - -} - -unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) -{ - uint i; - int res; - unsigned short status; - PNDIS_802_11_VARIABLE_IEs pIE; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u8 *pframe = precv_frame->u.hdr.rx_data; - uint pkt_len = precv_frame->u.hdr.len; - - //DBG_871X("%s\n", __FUNCTION__); - - //check A1 matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) - return _SUCCESS; - - if (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE))) - return _SUCCESS; - - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - return _SUCCESS; - - _cancel_timer_ex(&pmlmeext->link_timer); - - //status - if ((status = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 2))) > 0) - { - DBG_871X("assoc reject, status code: %d\n", status); - pmlmeinfo->state = WIFI_FW_NULL_STATE; - res = -4; - goto report_assoc_result; - } - - //get capabilities - pmlmeinfo->capability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - - //set slot time - pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10))? 9: 20; - - //AID - res = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 4))&0x3fff); - - //following are moved to join event callback function - //to handle HT, WMM, rate adaptive, update MAC reg - //for not to handle the synchronous IO in the tasklet - for (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM - { - WMM_param_handler(padapter, pIE); - } - break; - - case _HT_CAPABILITY_IE_: //HT caps - HT_caps_handler(padapter, pIE); - break; - - case _HT_EXTRA_INFO_IE_: //HT info - HT_info_handler(padapter, pIE); - break; - - case _ERPINFO_IE_: - ERP_IE_handler(padapter, pIE); - - default: - break; - } - - i += (pIE->Length + 2); - } - - pmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE); - pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; - - //Update Basic Rate Table for spec, 2010-12-28 , by thomas - UpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates); - -report_assoc_result: - - report_join_res(padapter, res); - - return _SUCCESS; -} - -unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) -{ - unsigned short reason; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 *pframe = precv_frame->u.hdr.rx_data; - uint pktlen = precv_frame->u.hdr.len; - - //check A3 - if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) - return _SUCCESS; - - reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - - DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); - -#ifdef CONFIG_AP_MODE - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { -#if 0 - _irqL irqL; - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); -#endif - ap_free_sta(padapter, rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe))); - - return _SUCCESS; - } - else -#endif - { - receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason); - } - pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; - return _SUCCESS; - -} - -unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) -{ - unsigned short reason; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 *pframe = precv_frame->u.hdr.rx_data; - uint pktlen = precv_frame->u.hdr.len; - - //check A3 - if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) - return _SUCCESS; - - reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); - - DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); - -#ifdef CONFIG_AP_MODE - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { -#if 0 - _irqL irqL; - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); -#endif - - ap_free_sta(padapter, rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe))); - - return _SUCCESS; - } - else -#endif - { - receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); - } - pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; - return _SUCCESS; - -} - -unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame) -{ - DBG_871X("%s\n", __FUNCTION__); - return _SUCCESS; -} - -unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame) -{ - return _SUCCESS; -} - -unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame) -{ - return _SUCCESS; -} - -unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) -{ - u8 *addr; - struct sta_info *psta=NULL; - struct recv_reorder_ctrl *preorder_ctrl; - unsigned char *frame_body; - unsigned char category, action; - unsigned short tid, status, reason_code = 0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 *pframe = precv_frame->u.hdr.rx_data; - struct sta_priv *pstapriv = &padapter->stapriv; - - uint len = precv_frame->u.hdr.len; - - //check RA matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode - return _SUCCESS; - -/* - //check A1 matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) - return _SUCCESS; -*/ - //DBG_871X("%s\n", __FUNCTION__); - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) - return _SUCCESS; - - addr = GetAddr2Ptr(pframe); - psta = rtw_get_stainfo(pstapriv, addr); - - if(psta==NULL) - return _SUCCESS; - - frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); - - category = frame_body[0]; - if (category == WLAN_CATEGORY_BACK)// representing Block Ack - { - if (!pmlmeinfo->HT_enable) - { - return _SUCCESS; - } - - action = frame_body[1]; - //DBG_871X("%s, action=%d\n", __FUNCTION__, action); - switch (action) - { - case WLAN_ACTION_ADDBA_REQ: //ADDBA request - - _rtw_memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request)); - //process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), GetAddr3Ptr(pframe)); - process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), addr); - - if(pmlmeinfo->bAcceptAddbaReq == _TRUE) - { - issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 0); - } - else - { - issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 37);//reject ADDBA Req - } - - break; - - case WLAN_ACTION_ADDBA_RESP: //ADDBA response - - //status = frame_body[3] | (frame_body[4] << 8); //endian issue - status = RTW_GET_LE16(&frame_body[3]); - tid = ((frame_body[5] >> 2) & 0x7); - - if (status == 0) - { //successful - psta->htpriv.agg_enable_bitmap |= 1 << tid; - psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); - } - else - { - psta->htpriv.agg_enable_bitmap &= ~BIT(tid); - } - - //DBG_8192C("marc: ADDBA RSP: %x\n", pmlmeinfo->agg_enable_bitmap); - break; - - case WLAN_ACTION_DELBA: //DELBA - if ((frame_body[3] & BIT(3)) == 0) - { - psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); - psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); - - //reason_code = frame_body[4] | (frame_body[5] << 8); - reason_code = RTW_GET_LE16(&frame_body[4]); - } - else if((frame_body[3] & BIT(3)) == BIT(3)) - { - tid = (frame_body[3] >> 4) & 0x0F; - - preorder_ctrl = &psta->recvreorder_ctrl[tid]; - preorder_ctrl->enable = _FALSE; - preorder_ctrl->indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq); - #endif - } - - DBG_8192C("%s(): DELBA: %x(%x)\n", __FUNCTION__,pmlmeinfo->agg_enable_bitmap, reason_code); - //todo: how to notify the host while receiving DELETE BA - break; - - default: - break; - } - } - - return _SUCCESS; -} - -#ifdef CONFIG_P2P -void issue_p2p_GO_request(_adapter *padapter, u8* raddr) -{ - - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_GO_NEGO_REQ; - u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; - u8 wpsielen = 0, p2pielen = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - DBG_8192C( "[%s] In\n", __FUNCTION__ ); - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pwdinfo->negotiation_dialog_token = 1; // Initialize the dialog value - pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen)); - - - - // WPS Section - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Device Password ID - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - - if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); - } - else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); - } - else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); - } - - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110306 - // According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes - // 1. P2P Capability - // 2. Group Owner Intent - // 3. Configuration Timeout - // 4. Listen Channel - // 5. Extended Listen Timing - // 6. Intended P2P Interface Address - // 7. Channel List - // 8. P2P Device Info - // 9. Operating Channel - - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; - - // Group Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = 0x00; - - // Group Owner Intent - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - // Todo the tie breaker bit. - p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) ); - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - - // Listen Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listening channel number - - - // Extended Listen Timing ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); - p2pielen += 2; - - // Value: - // Availability Period - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - // Availability Interval - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - - // Intended P2P Interface Address - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - p2pielen += ETH_ALEN; - - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Number of Channels - p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 - - // Channel List - p2pie[ p2pielen++ ] = 0x01; - p2pie[ p2pielen++ ] = 0x02; - p2pie[ p2pielen++ ] = 0x03; - p2pie[ p2pielen++ ] = 0x04; - p2pie[ p2pielen++ ] = 0x05; - p2pie[ p2pielen++ ] = 0x06; - p2pie[ p2pielen++ ] = 0x07; - p2pie[ p2pielen++ ] = 0x08; - p2pie[ p2pielen++ ] = 0x09; - p2pie[ p2pielen++ ] = 0x0A; - p2pie[ p2pielen++ ] = 0x0B; - - - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - - p2pielen += 2; - - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - p2pielen += 2; - - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - - -void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint len, u8 result) -{ - - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_GO_NEGO_RESP; - u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; - u8 p2pielen = 0; - uint wpsielen = 0; - u16 wps_devicepassword_id = 0x0000; - uint wps_devicepassword_id_len = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pwdinfo->negotiation_dialog_token = frame_body[7]; // The Dialog Token of provisioning discovery request frame. - pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); - - // Commented by Albert 20110328 - // Try to get the device password ID from the WPS IE of group negotiation request frame - // WiFi Direct test plan 5.1.15 - rtw_get_wps_ie_p2p( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); - rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); - wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); - - _rtw_memset( wpsie, 0x00, 255 ); - wpsielen = 0; - - // WPS Section - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Device Password ID - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - if ( wps_devicepassword_id == WPS_DPID_USER_SPEC ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); - } - else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC ) - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); - } - else - { - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); - } - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20100908 - // According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes - // 1. Status - // 2. P2P Capability - // 3. Group Owner Intent - // 4. Configuration Timeout - // 5. Operating Channel - // 6. Intended P2P Interface Address - // 7. Channel List - // 8. Device Info - // 9. Group ID ( Only GO ) - - - // ToDo: - - // P2P Status - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = result; - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - - if ( pwdinfo->role == P2P_ROLE_CLIENT ) - { - // Commented by Albert 2011/03/08 - // According to the P2P specification - // if the sending device will be client, the P2P Capability should be reserved of group negotation response frame - p2pie[ p2pielen++ ] = 0; - } - else - { - // Be group owner or meet the error case - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; - } - - // Group Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = 0x00; - - // Group Owner Intent - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - if ( pwdinfo->peer_intent & 0x01 ) - { - // Peer's tie breaker bit is 1, our tie breaker bit should be 0 - p2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 ); - } - else - { - // Peer's tie breaker bit is 0, our tie breaker bit should be 1 - p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) ); - } - - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number - - // Intended P2P Interface Address - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - p2pielen += ETH_ALEN; - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Number of Channels - p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 - - // Channel List - p2pie[ p2pielen++ ] = 0x01; - p2pie[ p2pielen++ ] = 0x02; - p2pie[ p2pielen++ ] = 0x03; - p2pie[ p2pielen++ ] = 0x04; - p2pie[ p2pielen++ ] = 0x05; - p2pie[ p2pielen++ ] = 0x06; - p2pie[ p2pielen++ ] = 0x07; - p2pie[ p2pielen++ ] = 0x08; - p2pie[ p2pielen++ ] = 0x09; - p2pie[ p2pielen++ ] = 0x0A; - p2pie[ p2pielen++ ] = 0x0B; - - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - - p2pielen += 2; - - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - p2pielen += 2; - - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - if ( pwdinfo->role == P2P_ROLE_GO ) - { - // Group ID Attribute - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); - p2pielen += 2; - - // Value: - // p2P Device Address - _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // SSID - _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); - p2pielen += pwdinfo->nego_ssidlen; - - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result) -{ - - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_GO_NEGO_CONF; - u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; - u8 wpsielen = 0, p2pielen = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); - - - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110306 - // According to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes - // 1. Status - // 2. P2P Capability - // 3. Operating Channel - // 4. Channel List - // 5. Group ID ( if this WiFi is GO ) - - // P2P Status - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = result; - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; - - // Group Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = 0x00; - - - // Operating Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - if ( pwdinfo->role == P2P_ROLE_CLIENT ) - { - p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch; - } - else - { - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel - } - - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + pwdinfo->channel_cnt ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Number of Channels - p2pie[ p2pielen++ ] = pwdinfo->channel_cnt; - - // Channel List - _rtw_memcpy( p2pie + p2pielen, pwdinfo->channel_list, pwdinfo->channel_cnt ); - p2pielen += pwdinfo->channel_cnt; - - if ( pwdinfo->role == P2P_ROLE_GO ) - { - // Group ID Attribute - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); - p2pielen += 2; - - // Value: - // p2P Device Address - _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // SSID - _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); - p2pielen += pwdinfo->nego_ssidlen; - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ) -{ - - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_INVIT_REQ; - u8 p2pie[ 255 ] = { 0x00 }; - u8 p2pielen = 0; - u8 dialogToken = 3; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20101011 - // According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes - // 1. Configuration Timeout - // 2. Invitation Flags - // 3. Operating Channel ( Only GO ) - // 4. P2P Group BSSID ( Only GO ) - // 5. Channel List - // 6. P2P Group ID - // 7. P2P Device Info - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - // Invitation Flags - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INVITATION_FLAGS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = P2P_INVITATION_FLAGS_PERSISTENT; - - - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Number of Channels - p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 - - // Channel List - p2pie[ p2pielen++ ] = 0x01; - p2pie[ p2pielen++ ] = 0x02; - p2pie[ p2pielen++ ] = 0x03; - p2pie[ p2pielen++ ] = 0x04; - p2pie[ p2pielen++ ] = 0x05; - p2pie[ p2pielen++ ] = 0x06; - p2pie[ p2pielen++ ] = 0x07; - p2pie[ p2pielen++ ] = 0x08; - p2pie[ p2pielen++ ] = 0x09; - p2pie[ p2pielen++ ] = 0x0A; - p2pie[ p2pielen++ ] = 0x0B; - - // P2P Group ID - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 6 + pwdinfo->invitereq_info.ssidlen ); - p2pielen += 2; - - // Value: - // P2P Device Address for GO - _rtw_memcpy( p2pie + p2pielen, raddr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // SSID - _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.ssid, pwdinfo->invitereq_info.ssidlen ); - p2pielen += pwdinfo->invitereq_info.ssidlen; - - - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); - p2pielen += 2; - - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - p2pielen += 2; - - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success) -{ - - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_INVIT_RESP; - u8 p2pie[ 255 ] = { 0x00 }; - u8 p2pielen = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - // P2P IE Section. - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20101005 - // According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes - // 1. Status - // 2. Configuration Timeout - // 3. Operating Channel ( Only GO ) - // 4. P2P Group BSSID ( Only GO ) - // 5. Channel List - - // P2P Status - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); - p2pielen += 2; - - // Value: - if ( success ) - { - p2pie[ p2pielen++ ] = P2P_STATUS_SUCCESS; - } - else - { - // Sent the event receiving the P2P Invitation Req frame to DMP UI. - // DMP had to compare the MAC address to find out the profile. - // So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. - // If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req - // to NB to rebuild the persistent group. - p2pie[ p2pielen++ ] = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - - // Configuration Timeout - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO - p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client - - - if ( success ) - { - // Channel List - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Channel Entry List - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Number of Channels - p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 - - // Channel List - p2pie[ p2pielen++ ] = 0x01; - p2pie[ p2pielen++ ] = 0x02; - p2pie[ p2pielen++ ] = 0x03; - p2pie[ p2pielen++ ] = 0x04; - p2pie[ p2pielen++ ] = 0x05; - p2pie[ p2pielen++ ] = 0x06; - p2pie[ p2pielen++ ] = 0x07; - p2pie[ p2pielen++ ] = 0x08; - p2pie[ p2pielen++ ] = 0x09; - p2pie[ p2pielen++ ] = 0x0A; - p2pie[ p2pielen++ ] = 0x0B; - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_p2p_provision_request(_adapter *padapter, u8* pinterface_raddr, u8* pssid, u8 ussidlen, u8* pdev_raddr ) -{ - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = 1; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PROVISION_DISC_REQ; - u8 wpsie[ 100 ] = { 0x00 }; - u8 wpsielen = 0; - u32 p2pielen = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - DBG_8192C( "[%s] In\n", __FUNCTION__ ); - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, pinterface_raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, pssid, ussidlen, pdev_raddr ); - - pframe += p2pielen; - pattrib->pktlen += p2pielen; - - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -u8 is_matched_in_profilelist( u8* peermacaddr, struct profile_info* profileinfo ) -{ - u8 i, match_result = 0; - - DBG_8192C( "[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, - peermacaddr[0], peermacaddr[1],peermacaddr[2],peermacaddr[3],peermacaddr[4],peermacaddr[5]); - - for( i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++ ) - { - DBG_8192C( "[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, - profileinfo->peermac[0], profileinfo->peermac[1],profileinfo->peermac[2],profileinfo->peermac[3],profileinfo->peermac[4],profileinfo->peermac[5]); - if ( _rtw_memcmp( peermacaddr, profileinfo->peermac, ETH_ALEN ) ) - { - match_result = 1; - DBG_8192C( "[%s] Match!\n", __FUNCTION__ ); - break; - } - } - - return (match_result ); -} - -void issue_probersp_p2p(_adapter *padapter, unsigned char *da) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned char *mac; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u16 beacon_interval = 100; - u16 capInfo = 0; - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 wpsie[255] = { 0x00 }; - u32 wpsielen = 0, p2pielen = 0; - - - DBG_871X("%s\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - mac = myid(&(padapter->eeprompriv)); - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - - // Use the device address for BSSID field. - _rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(fctrl, WIFI_PROBERSP); - - pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = pattrib->hdrlen; - pframe += pattrib->hdrlen; - - //timestamp will be inserted by hardware - pframe += 8; - pattrib->pktlen += 8; - - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); - pframe += 2; - pattrib->pktlen += 2; - - // capability info: 2 bytes - // ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec) - capInfo |= cap_ShortPremble; - capInfo |= cap_ShortSlot; - - _rtw_memcpy(pframe, (unsigned char *) &capInfo, 2); - pframe += 2; - pattrib->pktlen += 2; - - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen); - - // supported rates... - // Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 ) - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); - - // DS parameter set - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); - - // Todo: WPS IE - // Noted by Albert 20100907 - // According to the WPS specification, all the WPS attribute is presented by Big Endian. - - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // WiFi Simple Config State - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; // Not Configured. - - // Response Type - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X; - - // UUID-E - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); - wpsielen += 2; - - // Value: - _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - wpsielen += 0x10; - - // Manufacturer - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 ); - wpsielen += 2; - - // Value: - _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 ); - wpsielen += 7; - - // Model Name - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 ); - wpsielen += 2; - - // Value: - _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 ); - wpsielen += 6; - - // Model Number - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[ wpsielen++ ] = 0x31; // character 1 - - // Serial Number - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN ); - wpsielen += 2; - - // Value: - _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN ); - wpsielen += ETH_ALEN; - - // Primary Device Type - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); - wpsielen += 2; - - // Value: - // Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - wpsielen += 2; - - // OUI - *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // Sub Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - wpsielen += 2; - - // Device Name - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); - wpsielen += 2; - - // Value: - _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); - wpsielen += pwdinfo->device_name_len; - - // Config Method - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - wpsielen += 2; - - // Value: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - wpsielen += 2; - - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - - p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe); - pframe += p2pielen; - pattrib->pktlen += p2pielen; - - - pattrib->last_txcmdsz = pattrib->pktlen; - - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_probereq_p2p(_adapter *padapter) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned char *mac; - unsigned char bssrate[NumRates]; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - int bssrate_len = 0; - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 wpsie[255] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; - u16 wpsielen = 0, p2pielen = 0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - mac = myid(&(padapter->eeprompriv)); - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - // broadcast probe request frame - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_PROBEREQ); - - pframe += sizeof (struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); - - pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen)); - - if ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) - { - pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &(pattrib->pktlen)); - } - else - { - pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen)); - } - // Use the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 ) - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); - - // WPS IE - // Noted by Albert 20110221 - // According to the WPS specification, all the WPS attribute is presented by Big Endian. - - wpsielen = 0; - // WPS OUI - *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 - - // Device Name - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); - wpsielen += 2; - - // Value: - _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); - wpsielen += pwdinfo->device_name_len; - - // Primary Device Type - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); - wpsielen += 2; - - // Value: - // Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - wpsielen += 2; - - // OUI - *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); - wpsielen += 4; - - // Sub Category ID - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110221 - // According to the P2P Specification, the probe request frame should contain 5 P2P attributes - // 1. P2P Capability - // 2. P2P Device ID if this probe request wants to find the specific P2P device - // 3. Listen Channel - // 4. Extended Listen Timing - // 5. Operating Channel if this WiFi is working as the group owner now - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; - - // Group Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = 0x00; - - // Listen Channel - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listen channel - - - // Extended Listen Timing - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); - p2pielen += 2; - - // Value: - // Availability Period - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - // Availability Interval - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - if ( pwdinfo->role == P2P_ROLE_GO ) - { - // Operating Channel (if this WiFi is working as the group owner now) - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); - p2pielen += 2; - - // Value: - // Country String - p2pie[ p2pielen++ ] = 'U'; - p2pie[ p2pielen++ ] = 'S'; - - // The third byte should be set to 0x04. - // Described in the "Operating Channel Attribute" section. - p2pie[ p2pielen++ ] = 0x04; - - // Operating Class - p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 - - // Channel Number - p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number - - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - pattrib->last_txcmdsz = pattrib->pktlen; - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); - - dump_mgntframe(padapter, pmgntframe); - - return; -} - -#endif //CONFIG_P2P - -unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame) -{ - unsigned char *frame_body; - unsigned char category, action; - u8 *pframe = precv_frame->u.hdr.rx_data; - uint len = precv_frame->u.hdr.len; -#ifdef CONFIG_P2P - u8 p2p_ie[ 255 ]; - u32 p2p_ielen, wps_ielen; - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); - u8 result = P2P_STATUS_SUCCESS; -#endif //CONFIG_P2P - - //check RA matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode - return _SUCCESS; - - frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); - - category = frame_body[0]; - if(category != WLAN_CATEGORY_PUBLIC) - return _SUCCESS; - - action = frame_body[ 1 ]; - if ( action == ACT_PUBLIC_P2P ) // IEEE 802.11 P2P Public Action usage. - { -#ifdef CONFIG_P2P - // Commented by Albert 20100908 - // Low byte -> High byte is 0x50, 0x6F, 0x9A, 0x09 for P2P OUI. - // But the P2POUT is defined as 0x506F9A09 -> should use the cpu_to_be32 - if ( cpu_to_be32( *( ( u32* ) ( frame_body + 2 ) ) ) == P2POUI ) - { - _rtw_memset( p2p_ie, 0x00, 255 ); - p2p_ielen = 0; - - switch( frame_body[ 6 ] )//OUI Subtype - { - case P2P_GO_NEGO_REQ: - { - DBG_8192C( "[%s] Got GO Nego Req Frame\n", __FUNCTION__); - - if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_FAIL ) - { - // Commented by Albert 20110526 - // In this case, this means the previous nego fail doesn't be reset yet. - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - // Restore the previous p2p state - pwdinfo->p2p_state = pwdinfo->pre_p2p_state; - printk( "[%s] Restore the previous p2p state to %d\n", __FUNCTION__, pwdinfo->p2p_state ); - } - - pwdinfo->pre_p2p_state = pwdinfo->p2p_state; - - result = process_p2p_group_negotation_req( pwdinfo, frame_body, len ); - issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result ); - // Commented by Albert 20110718 - // No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); - break; - } - case P2P_GO_NEGO_RESP: - { - DBG_8192C( "[%s] Got GO Nego Resp Frame\n", __FUNCTION__); - - if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_ING ) - { - // Commented by Albert 20110425 - // The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - result = process_p2p_group_negotation_resp( pwdinfo, frame_body, len); - - issue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result); - - // Reset the dialog token for group negotiation frames. - pwdinfo->negotiation_dialog_token = 1; - - if( pwdinfo->p2p_state == P2P_STATE_GONEGO_FAIL ) - { - _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); - } - } - else - { - DBG_8192C( "[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __FUNCTION__); - } - - break; - } - case P2P_GO_NEGO_CONF: - { - DBG_8192C( "[%s] Got GO Nego Confirm Frame\n", __FUNCTION__); - process_p2p_group_negotation_confirm( pwdinfo, frame_body, len); - break; - } - case P2P_INVIT_REQ: - { - // Added by Albert 2010/10/05 - // Received the P2P Invite Request frame. - - DBG_8192C( "[%s] Got invite request frame!\n", __FUNCTION__ ); - if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - // Parse the necessary information from the P2P Invitation Request frame. - // For example: The MAC address of sending this P2P Invitation Request frame. - u8 groupid[ 38 ] = { 0x00 }; - u32 attr_contentlen = 0; - u8 match_result = 0; - - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen); - _rtw_memcpy( pwdinfo->p2p_peer_interface_addr, groupid, ETH_ALEN ); - pwdinfo->p2p_state = P2P_STATE_RECV_INVITE_REQ; - DBG_8192C( "[%s] peer address %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, - groupid[0], groupid[1], groupid[2], groupid[3], groupid[4], groupid[5] ); - - if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) ) - { - match_result = 1; - } - else - { - match_result = 0; - } - - DBG_8192C( "[%s] match_result = %d\n", __FUNCTION__, match_result ); - - pwdinfo->inviteresp_info.token = frame_body[ 7 ]; - issue_p2p_invitation_response( padapter, pwdinfo->p2p_peer_interface_addr, pwdinfo->inviteresp_info.token, match_result ); - } - - break; - } - case P2P_INVIT_RESP: - { - u8 attr_content = 0x00; - u32 attr_contentlen = 0; - - DBG_8192C( "[%s] Got invite response frame!\n", __FUNCTION__ ); - if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); - - if ( attr_contentlen == 1 ) - { - DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); - if ( attr_content == P2P_STATUS_SUCCESS ) - { - pwdinfo->role = P2P_ROLE_CLIENT; - } - else - { - pwdinfo->role = P2P_ROLE_DEVICE; - } - } - else - { - pwdinfo->role = P2P_ROLE_DEVICE; - } - } - break; - } - case P2P_DEVDISC_REQ: - - process_p2p_devdisc_req(pwdinfo, pframe, len); - - break; - - case P2P_DEVDISC_RESP: - - process_p2p_devdisc_resp(pwdinfo, pframe, len); - - break; - - case P2P_PROVISION_DISC_REQ: - DBG_8192C( "[%s] Got Provisioning Discovery Request Frame\n", __FUNCTION__ ); - process_p2p_provdisc_req(pwdinfo, pframe, len); - _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); - pwdinfo->pre_p2p_state = pwdinfo->p2p_state; - pwdinfo->p2p_state = P2P_STATE_RX_PROVISION_DIS_REQ; - _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); - break; - - case P2P_PROVISION_DISC_RESP: - // Commented by Albert 20110707 - // Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? - DBG_8192C( "[%s] Got Provisioning Discovery Response Frame\n", __FUNCTION__ ); - // Commented by Albert 20110426 - // The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. - _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); - pwdinfo->p2p_state = P2P_STATE_RX_PROVISION_DIS_RSP; - process_p2p_provdisc_resp(pwdinfo, pframe); - _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); - break; - - } - - } -#endif //CONFIG_P2P - } - - return _SUCCESS; -} - -unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame) -{ - return _SUCCESS; -} - -unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame) -{ - return _SUCCESS; -} - -unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame) -{ -#ifdef CONFIG_P2P - u8 *frame_body; - u8 category, OUI_Subtype, dialogToken=0; - u8 *pframe = precv_frame->u.hdr.rx_data; - uint len = precv_frame->u.hdr.len; - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); - - - DBG_871X("%s\n", __FUNCTION__); - - //check RA matches or not - if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode - return _SUCCESS; - - frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); - - category = frame_body[0]; - if(category != WLAN_CATEGORY_P2P) - return _SUCCESS; - - if ( cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ) != P2POUI ) - return _SUCCESS; - - OUI_Subtype = frame_body[5]; - dialogToken = frame_body[6]; - - switch(OUI_Subtype) - { - case P2P_NOTICE_OF_ABSENCE: - - break; - - case P2P_PRESENCE_REQUEST: - - process_p2p_presence_req(pwdinfo, pframe, len); - - break; - - case P2P_PRESENCE_RESPONSE: - - break; - - case P2P_GO_DISC_REQUEST: - - break; - - default: - break; - - } - -#endif //CONFIG_P2P - - return _SUCCESS; - -} - -unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame) -{ - int i; - unsigned char category; - struct action_handler *ptable; - unsigned char *frame_body; - u8 *pframe = precv_frame->u.hdr.rx_data; - - frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); - - category = frame_body[0]; - - for(i = 0; i < sizeof(OnAction_tbl)/sizeof(struct action_handler); i++) - { - ptable = &OnAction_tbl[i]; - - if(category == ptable->num) - ptable->func(padapter, precv_frame); - - } - - return _SUCCESS; - -} - -unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame) -{ - u8 *pframe = precv_frame->u.hdr.rx_data; - uint len = precv_frame->u.hdr.len; - - //DBG_871X("rcvd mgt frame(%x, %x)\n", (GetFrameSubType(pframe) >> 4), *(unsigned int *)GetAddr1Ptr(pframe)); - return _SUCCESS; -} - -struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv) -{ - struct xmit_frame *pmgntframe; - struct xmit_buf *pxmitbuf; - - if ((pmgntframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) - { - return NULL; - } - - if ((pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv)) == NULL) - { - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - return NULL; - } - - pmgntframe->frame_tag = MGNT_FRAMETAG; - - pmgntframe->pxmitbuf = pxmitbuf; - - pmgntframe->buf_addr = pxmitbuf->pbuf; - - pxmitbuf->priv_data = pmgntframe; - - return pmgntframe; - -} - - -/**************************************************************************** - -Following are some TX fuctions for WiFi MLME - -*****************************************************************************/ - -void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) -{ - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - - _rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); - - pattrib->hdrlen = 24; - pattrib->nr_frags = 1; - pattrib->priority = 7; - pattrib->mac_id = 0; - pattrib->qsel = 0x12; - - pattrib->pktlen = 0; - - if(pmlmeext->cur_wireless_mode & WIRELESS_11B) - pattrib->raid = 6;//b mode - else - pattrib->raid = 5;//a/g mode - - pattrib->encrypt = _NO_PRIVACY_; - pattrib->bswenc = _FALSE; - - pattrib->qos_en = _FALSE; - pattrib->ht_en = _FALSE; - pattrib->bwmode = HT_CHANNEL_WIDTH_20; - pattrib->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - pattrib->sgi = _FALSE; - - pattrib->seqnum = pmlmeext->mgnt_seq; - -} - -void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe) -{ - padapter->HalFunc.mgnt_xmit(padapter, pmgntframe); -} - -//Commented by Kurt -#ifdef CONFIG_TDLS -void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; -// SetToDs(fctrl); - if (power_mode) - { - SetPwrMgt(fctrl); - } - - _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; - pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; - SetSeqNum(pwlanhdr, pattrib->seqnum); - - SetFrameSubType(pframe, WIFI_DATA_NULL); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); - - return; -} - -s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) -{ - - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - - s32 res=_SUCCESS; - sint bmcast; - - bmcast = IS_MCAST(pattrib->ra); - - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - if (psta == NULL) { - res =_FAIL; - goto exit; - } - - pattrib->mac_id = psta->mac_id; - - pattrib->psta = psta; - - pattrib->ack_policy = 0; - // get ether_hdr_len - pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag - - if (pqospriv->qos_option && psta->qos_option) { - if(pattrib->priority==0) - pattrib->priority = 1; //tdls management frame should be AC_BK - pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; - pattrib->subtype = WIFI_QOS_DATA_TYPE; - } else { - pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA_TYPE; - pattrib->priority = 0; - } - - if (psta->ieee8021x_blocked == _TRUE) - { - pattrib->encrypt = 0; - } - else - { - GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); - - switch(psecuritypriv->dot11AuthAlgrthm) - { - case dot11AuthAlgrthm_Open: - case dot11AuthAlgrthm_Shared: - case dot11AuthAlgrthm_Auto: - pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; - break; - case dot11AuthAlgrthm_8021X: - pattrib->key_idx = 0; - break; - default: - pattrib->key_idx = 0; - break; - } - } - - switch (pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - pattrib->iv_len = 4; - pattrib->icv_len = 4; - break; - case _TKIP_: - pattrib->iv_len = 8; - pattrib->icv_len = 4; - if(padapter->securitypriv.busetkipkey==_FAIL) - { - res =_FAIL; - goto exit; - } - break; - case _AES_: - pattrib->iv_len = 8; - pattrib->icv_len = 8; - break; - default: - pattrib->iv_len = 0; - pattrib->icv_len = 0; - break; - } - - if (pattrib->encrypt && - ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) - { - pattrib->bswenc = _TRUE; - } else { - pattrib->bswenc = _FALSE; - } - - //qos_en, ht_en, init rate, ,bw, ch_offset, sgi - pattrib->qos_en = psta->qos_option; - pattrib->ht_en = psta->htpriv.ht_option; - pattrib->raid = psta->raid; - pattrib->bwmode = psta->htpriv.bwmode; - pattrib->ch_offset = psta->htpriv.ch_offset; - pattrib->sgi= psta->htpriv.sgi; - pattrib->ampdu_en = _FALSE; - - if(pattrib->ht_en && psta->htpriv.ampdu_enable) - { - if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) - pattrib->ampdu_en = _TRUE; - } - -exit: - - return res; -} - -void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta= NULL; - _irqL irqL; - static u8 dialogtoken = 0; - u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - //for tdls; pattrib->nr_frags is used to fill dialogtoken - pattrib->nr_frags = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - - update_tdls_attrib(padapter, pattrib); - - //init peer sta_info - ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); - if(ptdls_sta==NULL){ - ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr); - } - - if(ptdls_sta){ - ptdls_sta->state |= TDLS_RESPONDER_STATE; - //for tdls; ptdls_sta->aid is used to fill dialogtoken - ptdls_sta->aid = pattrib->nr_frags; - ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt++; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - } - else { - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - goto exit; - } - - pattrib->qsel=pattrib->priority; - if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta=NULL; - _irqL irqL; - - ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); - if(ptdls_sta==NULL){ - DBG_8192C("issue tdls teardown unsuccessful\n"); - return; - }else{ - ptdls_sta->state=UN_TDLS_STATE; - } - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - rtw_dump_xframe(padapter, pmgntframe); - - if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ - ptdls_sta->option =3; - _set_workitem(&ptdls_sta->option_workitem); - } - - //free peer sta_info - DBG_8192C("tdls teardown, free sta_info\n"); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - //ready to clear cam - if(ptdls_sta->cam_entry!=0){ - pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; - rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); - } - _set_workitem(&pmlmeext->TDLS_restore_workitem); - rtw_free_stainfo(padapter, ptdls_sta); - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; //tdls;kurt - -exit: - - return; -} - -void issue_tdls_dis_req(_adapter *padapter) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - static u8 dialogtoken=0; - u8 mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - //for tdls; pattrib->nr_frags is used to fill dialogtoken - pattrib->nr_frags = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - //for tdls; pattrib->type is used to fill status - pattrib->type = 0; - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - rtw_dump_xframe(padapter, pmgntframe); - DBG_8192C("issue tdls dis req\n"); - -exit: - - return; -} - -void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta=NULL; - _irqL irqL; - - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - //pattrib->nr_frags is used to fill dialogtoken - pattrib->nr_frags = rx_pkt_pattrib->frag_num; - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - rtw_dump_xframe(padapter, pmgntframe); - - ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - //status code!=0 ; setup unsuccess - if(ptdls_sta->stat_code!=0){ - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, ptdls_sta); - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - } - -exit: - - return; - -} - -void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta=NULL; - _irqL irqL; - - struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - //pattrib->nr_frags is used to fill dialogtoken - pattrib->nr_frags = rx_pkt_pattrib->frag_num; - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - pmlmeinfo->tdls_setup_state=TDLS_LINKED_STATE; - - rtw_dump_xframe(padapter, pmgntframe); - - ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); - - ptdls_sta->option=1; - _set_workitem(&ptdls_sta->option_workitem); - //status code!=0 ; setup unsuccess - if(ptdls_sta->stat_code!=0){ - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - //ready to clear cam - if(ptdls_sta->cam_entry!=0){ - pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; - rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); - } - rtw_free_stainfo(padapter, ptdls_sta); - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - } - -exit: - - return; - -} - -//TDLS Discovery Response frame is a management action frame -void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - // unicast probe request frame - _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN); - _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof (struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); - //tdls; pattrib->nr_frags is used to fill dialogtoken - pattrib->nr_frags = rx_pkt_pattrib->frag_num; - - fill_tdls_dis_rsp_frbody(padapter, pmgntframe, pframe); - - pattrib->nr_frags = 1; - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; -} - -void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - static u8 dialogtoken=0; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, psta->hwaddr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - //for tdls; pattrib->nr_frags is used to fill dialogtoken - pattrib->nr_frags = dialogtoken; - dialogtoken = (dialogtoken+1)%256; - //for tdls; pattrib->type is used to fill status - pattrib->type = 0; - //PTI frame's priority should be AC_VO - pattrib->priority = 7; - - update_tdls_attrib(padapter, pattrib); - pattrib->qsel=pattrib->priority; - if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - pattrib->qsel=pattrib->priority; - if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - - _irqL irqL; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - - pmgntframe->frame_tag = DATA_FRAMETAG; - pattrib->ether_type = 0x890d; - pattrib->pctrl =0; - - _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); - - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - update_tdls_attrib(padapter, pattrib); - - pattrib->qsel=pattrib->priority; -/* - _enter_critical_bh(&pxmitpriv->lock, &irqL); - if(xmit_tdls_enqueue_for_sleeping_sta(padapter, pmgntframe)==_TRUE){ - _exit_critical_bh(&pxmitpriv->lock, &irqL); - return _FALSE; - } -*/ - if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){ - rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); - } - rtw_dump_xframe(padapter, pmgntframe); - -exit: - - return; -} - -sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(pmlmeinfo->tdls_dis_req==1 || pmlmeinfo->tdls_dis_req==2){ - report_survey_event(adapter, precv_frame); - } - - return _FAIL; -} - -u8 collect_tdls_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid) -{ - int FIXED_IE=5; - int i; - unsigned int len; - unsigned char *p; - u8 *pframe = precv_frame->u.hdr.rx_data; - uint packet_len = precv_frame->u.hdr.len; - struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; - -// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -// struct registry_priv *pregistrypriv = &padapter->registrypriv; - - //[-24]: mgt_frame hdrlen - len = packet_len - 24 ; - - if (len > MAX_IE_SZ) - { - DBG_8192C("TDLS dis rsp IE too long for survey event\n"); - return _FAIL; - } - - _rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX)); - - //represent tdls peer - bssid->Reserved[1] = 'T'; - - bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; - - //below is to copy the information element - bssid->IELength = len; - _rtw_memcpy(bssid->IEs, (pframe + 24), bssid->IELength); - - //get the signal strength - //bssid->Rssi = precv_frame->u.hdr.attrib.signal_strength; // 0-100 index. - bssid->Rssi = precv_frame->u.hdr.attrib.RecvSignalPower; // in dBM.raw data - bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.signal_qual;//in percentage - bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.signal_strength;//in percentage -#ifdef CONFIG_ANTENNA_DIVERSITY - //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); -#endif - - _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); - - //checking rate info... - i = 0; - p = rtw_get_ie(bssid->IEs + FIXED_IE, _SUPPORTEDRATES_IE_, &len, bssid->IELength - FIXED_IE); - if (p != NULL) - { - _rtw_memcpy(bssid->SupportedRates, (p + 2), len); - i = len; - } - - p = rtw_get_ie(bssid->IEs + FIXED_IE, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - FIXED_IE); - if (p != NULL) - { - _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len); - } - - //pframe+10 would be src_addr - _rtw_memcpy(bssid->MacAddress, (pframe+10), ETH_ALEN); - return _SUCCESS; - -} - -#endif - -void issue_beacon(_adapter *padapter) -{ - _irqL irqL; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned int rate_len; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -#endif //CONFIG_P2P - - - //DBG_871X("%s\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); - return; - } - - _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->qsel = 0x10; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - //pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_BEACON); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); - - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - //DBG_871X("ie len=%d\n", cur_network->IELength); -#ifdef CONFIG_P2P - // for P2P : Primary Device Type & Device Name - u32 wpsielen=0, insert_len=0; - u8 *wpsie=NULL; - wpsie = rtw_get_wps_ie(cur_network->IEs, cur_network->IELength, NULL, &wpsielen); - - if(pwdinfo->role == P2P_ROLE_GO && wpsie && wpsielen>0) - { - uint wps_offset, remainder_ielen; - u8 *premainder_ie, *pframe_wscie; - - wps_offset = (uint)(wpsie - cur_network->IEs); - - premainder_ie = wpsie + wpsielen; - - remainder_ielen = cur_network->IELength - wps_offset - wpsielen; - - pframe_wscie = pframe + wps_offset; - _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen); - pframe += (wps_offset + wpsielen); - pattrib->pktlen += (wps_offset + wpsielen); - - //now pframe is end of wsc ie, insert Primary Device Type & Device Name - // Primary Device Type - // Type: - *(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); - insert_len += 2; - - // Length: - *(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 ); - insert_len += 2; - - // Value: - // Category ID - *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - insert_len += 2; - - // OUI - *(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI ); - insert_len += 4; - - // Sub Category ID - *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - insert_len += 2; - - - // Device Name - // Type: - *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - insert_len += 2; - - // Length: - *(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len ); - insert_len += 2; - - // Value: - _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len ); - insert_len += pwdinfo->device_name_len; - - - //update wsc ie length - *(pframe_wscie+1) = (wpsielen -2) + insert_len; - - //pframe move to end - pframe+=insert_len; - pattrib->pktlen += insert_len; - - //copy remainder_ie to pframe - _rtw_memcpy(pframe, premainder_ie, remainder_ielen); - pframe += remainder_ielen; - pattrib->pktlen += remainder_ielen; - - } - else -#endif //CONFIG_P2P - { - _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); - pframe += cur_network->IELength; - pattrib->pktlen += cur_network->IELength; - } - -#ifdef CONFIG_P2P - if(pwdinfo->role == P2P_ROLE_GO) - { - u32 len; - - len = build_beacon_p2p_ie(pwdinfo, pframe); - - pframe += len; - pattrib->pktlen += len; - } -#endif //CONFIG_P2P - - goto _issue_bcn; - - } - - //below for ad-hoc mode - - //timestamp will be inserted by hardware - pframe += 8; - pattrib->pktlen += 8; - - // beacon interval: 2 bytes - - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pattrib->pktlen += 2; - - // capability info: 2 bytes - - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pattrib->pktlen += 2; - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); - - // supported rates... - rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); - - // DS parameter set - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); - - //if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - u8 erpinfo=0; - u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; - ATIMWindow = 0; - pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); - - //ERP IE - pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); - } - - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); - } - - - //todo:HT for adhoc - -_issue_bcn: - - pmlmepriv->update_bcn = _FALSE; - - _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - - if ((pattrib->pktlen + TXDESC_SIZE) > 512) - { - DBG_871X("beacon frame too large\n"); - return; - } - - pattrib->last_txcmdsz = pattrib->pktlen; - - //DBG_871X("issue bcn_sz=%d\n", pattrib->last_txcmdsz); - - dump_mgntframe(padapter, pmgntframe); - -} - -void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq) -{ - u8 *pwps_ie; - uint wps_ielen; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned char *mac, *bssid; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - unsigned int rate_len; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -#endif //CONFIG_P2P - - //DBG_871X("%s\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); - return; - } - - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - mac = myid(&(padapter->eeprompriv)); - bssid = cur_network->MacAddress; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(fctrl, WIFI_PROBERSP); - - pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = pattrib->hdrlen; - pframe += pattrib->hdrlen; - - - if(cur_network->IELength>MAX_IE_SZ) - return; - -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - pwps_ie = rtw_get_wps_ie(cur_network->IEs, cur_network->IELength, NULL, &wps_ielen); - - //inerset & update wps_probe_resp_ie - if((pmlmepriv->wps_probe_resp_ie!=NULL) && pwps_ie && (wps_ielen>0)) - { - uint wps_offset, remainder_ielen; - u8 *premainder_ie; - - wps_offset = (uint)(pwps_ie - cur_network->IEs); - - premainder_ie = pwps_ie + wps_ielen; - - remainder_ielen = cur_network->IELength - wps_offset - wps_ielen; - - _rtw_memcpy(pframe, cur_network->IEs, wps_offset); - pframe += wps_offset; - pattrib->pktlen += wps_offset; - - wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];//to get ie data len - if((wps_offset+wps_ielen+2)<=MAX_IE_SZ) - { - _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen+2); - pframe += wps_ielen+2; - pattrib->pktlen += wps_ielen+2; - } - - if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) - { - _rtw_memcpy(pframe, premainder_ie, remainder_ielen); - pframe += remainder_ielen; - pattrib->pktlen += remainder_ielen; - } - } - else - { - _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); - pframe += cur_network->IELength; - pattrib->pktlen += cur_network->IELength; - } - - } - else -#endif - { - - //timestamp will be inserted by hardware - pframe += 8; - pattrib->pktlen += 8; - - // beacon interval: 2 bytes - - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pattrib->pktlen += 2; - - // capability info: 2 bytes - - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pattrib->pktlen += 2; - - //below for ad-hoc mode - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); - - // supported rates... - rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); - - // DS parameter set - pframe =rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); - - if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - u8 erpinfo=0; - u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; - ATIMWindow = 0; - pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); - - //ERP IE - pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); - } - - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); - } - - - //todo:HT for adhoc - - } - -#ifdef CONFIG_P2P - if(pwdinfo->role == P2P_ROLE_GO && is_valid_p2p_probereq) - { - u32 len; - - len = build_probe_resp_p2p_ie(pwdinfo, pframe); - - pframe += len; - pattrib->pktlen += len; - } -#endif //CONFIG_P2P - - - pattrib->last_txcmdsz = pattrib->pktlen; - - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -void issue_probereq(_adapter *padapter, u8 blnbc) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned char *mac; - unsigned char bssrate[NumRates]; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - int bssrate_len = 0; - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+issue_probereq\n")); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - mac = myid(&(padapter->eeprompriv)); - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - if ( 0 == blnbc ) - { - // unicast probe request frame - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - } - else - { - // broadcast probe request frame - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); - } - - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_PROBEREQ); - - pframe += sizeof (struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); - - pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeext->sitesurvey_res.ss_ssidlen, pmlmeext->sitesurvey_res.ss_ssid, &(pattrib->pktlen)); - - get_rate_set(padapter, bssrate, &bssrate_len); - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - - //add wps_ie for wps2.0 - if(pmlmepriv->probereq_wpsie_len>0 && pmlmepriv->probereq_wpsie_lenprobereq_wpsie, pmlmepriv->probereq_wpsie_len); - pframe += pmlmepriv->probereq_wpsie_len; - pattrib->pktlen += pmlmepriv->probereq_wpsie_len; - //pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero - } - - - pattrib->last_txcmdsz = pattrib->pktlen; - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); - - dump_mgntframe(padapter, pmgntframe); - - return; -} - -// if psta == NULL, indiate we are station(client) now... -void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned int val32; - unsigned short val16; - int use_shared_key = 0; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_AUTH); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - - if(psta)// for AP mode - { -#ifdef CONFIG_NATIVEAP_MLME - - _rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - - - // setting auth algo number - val16 = (u16)psta->authalg; - - if(status != _STATS_SUCCESSFUL_) - val16 = 0; - - if (val16) { - val16 = cpu_to_le16(val16); - use_shared_key = 1; - } - - pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - - // setting auth seq number - val16 =(u16)psta->auth_seq; - val16 = cpu_to_le16(val16); - pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - - // setting status code... - val16 = status; - val16 = cpu_to_le16(val16); - pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); - - // added challenging text... - if ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) - { - pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, psta->chg_txt, &(pattrib->pktlen)); - } -#endif - } - else - { - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); - - // setting auth algo number - val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)? 1: 0;// 0:OPEN System, 1:Shared key - if (val16) { - val16 = cpu_to_le16(val16); - use_shared_key = 1; - } - //DBG_8192C("%s auth_algo= %s auth_seq=%d\n",__FUNCTION__,(pmlmeinfo->auth_algo==0)?"OPEN":"SHARED",pmlmeinfo->auth_seq); - - //setting IV for auth seq #3 - if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) - { - //DBG_8192C("==> iv(%d),key_index(%d)\n",pmlmeinfo->iv,pmlmeinfo->key_index); - val32 = ((pmlmeinfo->iv++) | (pmlmeinfo->key_index << 30)); - val32 = cpu_to_le32(val32); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&val32, &(pattrib->pktlen)); - - pattrib->iv_len = 4; - } - - pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - - // setting auth seq number - val16 = pmlmeinfo->auth_seq; - val16 = cpu_to_le16(val16); - pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); - - - // setting status code... - val16 = status; - val16 = cpu_to_le16(val16); - pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); - - // then checking to see if sending challenging text... - if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) - { - pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, pmlmeinfo->chg_txt, &(pattrib->pktlen)); - - SetPrivacy(fctrl); - - pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); - - pattrib->encrypt = _WEP40_; - - pattrib->icv_len = 4; - - pattrib->pktlen += pattrib->icv_len; - - } - - } - - pattrib->last_txcmdsz = pattrib->pktlen; - - rtw_wep_encrypt(padapter, (u8 *)pmgntframe); - - dump_mgntframe(padapter, pmgntframe); - - return; -} - - -void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type) -{ -#ifdef CONFIG_AP_MODE - struct xmit_frame *pmgntframe; - struct ieee80211_hdr *pwlanhdr; - struct pkt_attrib *pattrib; - unsigned char *pbuf, *pframe; - unsigned short val; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - u8 *ie = pnetwork->IEs; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -#endif //CONFIG_P2P - - DBG_871X("%s\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN); - _rtw_memcpy((void *)GetAddr2Ptr(pwlanhdr), myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy((void *)GetAddr3Ptr(pwlanhdr), get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - if ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP)) - SetFrameSubType(pwlanhdr, pkt_type); - else - return; - - pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen += pattrib->hdrlen; - pframe += pattrib->hdrlen; - - //capability - val = *(unsigned short *)rtw_get_capability_from_ie(ie); - - pframe = rtw_set_fixed_ie(pframe, _CAPABILITY_ , (unsigned char *)&val, &(pattrib->pktlen)); - - status = cpu_to_le16(status); - pframe = rtw_set_fixed_ie(pframe , _STATUS_CODE_ , (unsigned char *)&status, &(pattrib->pktlen)); - - val = cpu_to_le16(pstat->aid | BIT(14) | BIT(15)); - pframe = rtw_set_fixed_ie(pframe, _ASOC_ID_ , (unsigned char *)&val, &(pattrib->pktlen)); - - if (pstat->bssratelen <= 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, pstat->bssratelen, pstat->bssrateset, &(pattrib->pktlen)); - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pstat->bssrateset, &(pattrib->pktlen)); - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (pstat->bssratelen-8), pstat->bssrateset+8, &(pattrib->pktlen)); - } - -#ifdef CONFIG_80211N_HT - if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option)) - { - uint ie_len=0; - - //FILL HT CAP INFO IE - //p = hostapd_eid_ht_capabilities_info(hapd, p); - pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(pbuf && ie_len>0) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); - } - - //FILL HT ADD INFO IE - //p = hostapd_eid_ht_operation(hapd, p); - pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if(pbuf && ie_len>0) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); - } - - } -#endif - - //FILL WMM IE - if ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option)) - { - uint ie_len=0; - unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; - - for (pbuf = ie + _BEACON_IE_OFFSET_; ;pbuf+= (ie_len + 2)) - { - pbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); - if(pbuf && _rtw_memcmp(pbuf+2, WMM_PARA_IE, 6)) - { - _rtw_memcpy(pframe, pbuf, ie_len+2); - pframe += (ie_len+2); - pattrib->pktlen +=(ie_len+2); - - break; - } - - if ((pbuf == NULL) || (ie_len == 0)) - { - break; - } - } - - } - - - if (pmlmeinfo->assoc_AP_vendor == realtekAP) - { - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); - } - - //add WPS IE ie for wps 2.0 - if(pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len>0) - { - _rtw_memcpy(pframe, pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); - - pframe += pmlmepriv->wps_assoc_resp_ie_len; - pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len; - } - -#ifdef CONFIG_P2P - if((pwdinfo->role == P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE)) - { - u32 len; - - len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code); - - pframe += len; - pattrib->pktlen += len; - } -#endif //CONFIG_P2P - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - -#endif -} - -void issue_assocreq(_adapter *padapter) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe, *p; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned short val16; - unsigned int i, ie_len; - unsigned char rf_type, bssrate[NumRates]; - PNDIS_802_11_VARIABLE_IEs pIE; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - int bssrate_len = 0; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - u8 p2pie[ 255 ] = { 0x00 }; - u16 p2pielen = 0; -#endif //CONFIG_P2P - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ASSOCREQ); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - //caps - - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - pframe += 2; - pattrib->pktlen += 2; - - //listen interval - //todo: listen interval for power saving - val16 = cpu_to_le16(3); - _rtw_memcpy(pframe ,(unsigned char *)&val16, 2); - pframe += 2; - pattrib->pktlen += 2; - - //SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &(pattrib->pktlen)); - - //supported rate & extended supported rate -#if 0 - get_rate_set(padapter, bssrate, &bssrate_len); -#else - for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { - if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0) break; - bssrate[bssrate_len] = pmlmeinfo->network.SupportedRates[bssrate_len]; - } -#endif - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //RSN - p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _RSN_IE_2_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if (p != NULL) - { - pframe = rtw_set_ie(pframe, _RSN_IE_2_, ie_len, (p + 2), &(pattrib->pktlen)); - } - -#ifdef CONFIG_80211N_HT - //HT caps - if(padapter->mlmepriv.htpriv.ht_option==_TRUE) - { - p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_CAPABILITY_IE_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if ((p != NULL) && (!(is_ap_in_tkip(padapter)))) - { - _rtw_memcpy(&(pmlmeinfo->HT_caps), (p + 2), sizeof(struct HT_caps_element)); - - //to disable 40M Hz support while gd_bw_40MHz_en = 0 - if (pregpriv->cbw40_enable == 0) - { - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info &= (~(BIT(6) | BIT(1))); - } - else - { - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= BIT(1); - } - - //todo: disable SM power save mode - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x000c; - - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - //switch (pregpriv->rf_config) - switch(rf_type) - { - case RF_1T1R: - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x0100;//RX STBC One spatial stream - _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_1R, 16); - break; - - case RF_2T2R: - case RF_1T2R: - default: - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x0200;//RX STBC two spatial stream - _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_2R, 16); - break; - } - #ifdef RTL8192C_RECONFIG_TO_1T1R - { - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x0100;//RX STBC One spatial stream - _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_1R, 16); - } - #endif - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info = cpu_to_le16(pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info); - pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, ie_len , (u8 *)(&(pmlmeinfo->HT_caps)), &(pattrib->pktlen)); - - } - } -#endif - - //vendor specific IE, such as WPA, WMM, WPS - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if ((_rtw_memcmp(pIE->data, WPA_OUI, 4)) || - (_rtw_memcmp(pIE->data, WMM_OUI, 4)) || - (_rtw_memcmp(pIE->data, WPS_OUI, 4))) - { - //Commented by Kurt 20110629 - //In some older APs, WPS handshake - //would be fail if we append vender extensions informations to AP - if(_rtw_memcmp(pIE->data, WPS_OUI, 4)){ - pIE->Length=14; - } - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &(pattrib->pktlen)); - } - break; - - default: - break; - } - - i += (pIE->Length + 2); - } - - if (pmlmeinfo->assoc_AP_vendor == realtekAP) - { - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); - } - -#ifdef CONFIG_P2P - if ( ( pwdinfo->p2p_state != P2P_STATE_NONE ) && ( pwdinfo->p2p_state != P2P_STATE_IDLE ) ) - { - // Should add the P2P IE in the association request frame. - // P2P OUI - - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20101109 - // According to the P2P Specification, the association request frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. Extended Listen Timing - // 3. Device Info - // Commented by Albert 20110516 - // 4. P2P Interface - - // P2P Capability - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; - - // Group Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = 0x00; - - // Extended Listen Timing - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); - p2pielen += 2; - - // Value: - // Availability Period - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - // Availability Interval - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - p2pielen += 2; - - // Device Info - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - if ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) || - ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) ) - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); - } - else - { - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); - } - - p2pielen += 2; - - // Primary Device Type - // Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - p2pielen += 2; - - // OUI - *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - p2pielen += 4; - - // Sub Category ID - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - p2pielen += 2; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - // P2P Interface - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE; - - // Length: - *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D ); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Device Address - p2pielen += ETH_ALEN; - - p2pie[ p2pielen++ ] = 1; // P2P Interface Address Count - - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Interface Address List - p2pielen += ETH_ALEN; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); - - } -#endif //CONFIG_P2P - - pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); - - return; -} - -void issue_nulldata(_adapter *padapter, unsigned int power_mode) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //DBG_871X("%s:%d\n", __FUNCTION__, power_mode); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - SetFrDs(fctrl); - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { - SetToDs(fctrl); - } - - if (power_mode) - { - SetPwrMgt(fctrl); - } - - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_DATA_NULL); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); - - return; -} - - -void issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl, *qc; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - DBG_871X("%s\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - pattrib->hdrlen +=2; - pattrib->qos_en = _TRUE; - pattrib->eosp = 1; - pattrib->ack_policy = 0; - pattrib->mdata = 0; - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - SetFrDs(fctrl); - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { - SetToDs(fctrl); - } - - if(pattrib->mdata) - SetMData(fctrl); - - qc = (unsigned short *)(pframe + pattrib->hdrlen - 2); - - SetPriority(qc, tid); - - SetEOSP(qc, pattrib->eosp); - - SetAckpolicy(qc, pattrib->ack_policy); - - _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); - - pframe += sizeof(struct ieee80211_hdr_3addr_qos); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr_qos); - - pattrib->last_txcmdsz = pattrib->pktlen; - dump_mgntframe(padapter, pmgntframe); - -} - -void issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_DEAUTH); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - reason = cpu_to_le16(reason); - pframe = rtw_set_fixed_ie(pframe, _RSON_CODE_ , (unsigned char *)&reason, &(pattrib->pktlen)); - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); -} - -void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) -{ - u8 category = WLAN_CATEGORY_BACK; - u16 start_seq; - u16 BA_para_set; - u16 reason_code; - u16 BA_timeout_value; - u16 BA_starting_seqctrl; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - u8 *pframe; - struct ieee80211_hdr *pwlanhdr; - u16 *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - - //DBG_871X("%s, category=%d, action=%d, status=%d\n", __FUNCTION__, category, action, status); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - //_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - - status = cpu_to_le16(status); - - - if (category == 3) - { - switch (action) - { - case 0: //ADDBA req - do { - pmlmeinfo->dialogToken++; - } while (pmlmeinfo->dialogToken == 0); - pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->dialogToken), &(pattrib->pktlen)); - - BA_para_set = (0x1002 | ((status & 0xf) << 2)); //immediate ack & 64 buffer size - //sys_mib.BA_para_set = 0x0802; //immediate ack & 32 buffer size - BA_para_set = cpu_to_le16(BA_para_set); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); - - BA_timeout_value = 0; - BA_timeout_value = cpu_to_le16(BA_timeout_value); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_timeout_value)), &(pattrib->pktlen)); - - //if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) - if ((psta = rtw_get_stainfo(pstapriv, raddr)) != NULL) - { - start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07]&0xfff) + 1; - BA_starting_seqctrl = start_seq << 4; - } - BA_starting_seqctrl = cpu_to_le16(BA_starting_seqctrl); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_starting_seqctrl)), &(pattrib->pktlen)); - break; - - case 1: //ADDBA rsp - pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->ADDBA_req.dialog_token), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&status), &(pattrib->pktlen)); - BA_para_set = cpu_to_le16((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen)); - break; - case 2://DELBA - BA_para_set = (status & 0x1F) << 3; - BA_para_set = cpu_to_le16(BA_para_set); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); - - reason_code = 37;//Requested from peer STA as it does not want to use the mechanism - reason_code = cpu_to_le16(reason_code); - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(reason_code)), &(pattrib->pktlen)); - break; - default: - break; - } - } - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); -} - -static void issue_action_BSSCoexistPacket(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - unsigned char category, action; - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct wlan_network *pnetwork = NULL; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - _queue *queue = &(pmlmepriv->scanned_queue); - u8 InfoContent[16] = {0}; - u8 ICS[8][15]; - - if((pmlmepriv->num_FortyMHzIntolerant==0) || (pmlmepriv->num_sta_no_ht==0)) - return; - - if(_TRUE == pmlmeinfo->bwmode_updated) - return; - - - DBG_871X("%s\n", __FUNCTION__); - - - category = WLAN_CATEGORY_PUBLIC; - action = ACT_PUBLIC_BSSCOEXIST; - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - - - // - if(pmlmepriv->num_FortyMHzIntolerant>0) - { - u8 iedata=0; - - iedata |= BIT(2);//20 MHz BSS Width Request - - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - } - - - // - _rtw_memset(ICS, 0, sizeof(ICS)); - if(pmlmepriv->num_sta_no_ht>0) - { - int i; - - _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - phead = get_list_head(queue); - plist = get_next(phead); - - while(1) - { - int len; - u8 *p; - WLAN_BSSID_EX *pbss_network; - - if (rtw_end_of_queue_search(phead,plist)== _TRUE) - break; - - pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); - - plist = get_next(plist); - - pbss_network = (WLAN_BSSID_EX *)&pnetwork->network; - - p = rtw_get_ie(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_); - if((p==NULL) || (len==0))//non-HT - { - if((pbss_network->Configuration.DSConfig<=0) || (pbss_network->Configuration.DSConfig>14)) - continue; - - ICS[0][pbss_network->Configuration.DSConfig]=1; - - if(ICS[0][0] == 0) - ICS[0][0] = 1; - } - - } - - _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); - - - for(i= 0;i<8;i++) - { - if(ICS[i][0] == 1) - { - int j, k = 0; - - InfoContent[k] = i; - //SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent,i); - k++; - - for(j=1;j<=14;j++) - { - if(ICS[i][j]==1) - { - if(k<16) - { - InfoContent[k] = j; //channel number - //SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j); - k++; - } - } - } - - pframe = rtw_set_ie(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &(pattrib->pktlen)); - - } - - } - - - } - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - -} - -unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta = NULL; - //struct recv_reorder_ctrl *preorder_ctrl; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u16 tid; - - if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) - if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) - return _SUCCESS; - - psta = rtw_get_stainfo(pstapriv, addr); - if(psta==NULL) - return _SUCCESS; - - //DBG_8192C("%s:%s\n", __FUNCTION__, (initiator==0)?"RX_DIR":"TX_DIR"); - - if(initiator==0) // recipient - { - for(tid = 0;tidrecvreorder_ctrl[tid].enable == _TRUE) - { - DBG_8192C("rx agg disable tid(%d)\n",tid); - issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F)); - psta->recvreorder_ctrl[tid].enable = _FALSE; - psta->recvreorder_ctrl[tid].indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, - psta->recvreorder_ctrl[tid].indicate_seq); - #endif - } - } - } - else if(initiator == 1)// originator - { - //DBG_8192C("tx agg_enable_bitmap(0x%08x)\n", psta->htpriv.agg_enable_bitmap); - for(tid = 0;tidhtpriv.agg_enable_bitmap & BIT(tid)) - { - DBG_8192C("tx agg disable tid(%d)\n",tid); - issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F) ); - psta->htpriv.agg_enable_bitmap &= ~BIT(tid); - psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); - - } - } - } - - return _SUCCESS; - -} - -unsigned int send_beacon(_adapter *padapter) -{ - u8 bxmitok = _FALSE; - int retry=0; - -#ifdef CONFIG_PCI_HCI - - //DBG_871X("%s\n", __FUNCTION__); - - issue_beacon(padapter); - - return _SUCCESS; - -#endif - -#ifdef CONFIG_USB_HCI - do{ - - issue_beacon(padapter); - - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_TX_BCN_DONE, (u8 *)(&bxmitok)); - - }while((_FALSE == bxmitok) &&((retry++)<100 )); - - if(retry == 100) - { - DBG_871X("send_beacon, fail!\n"); - return _FAIL; - } - else - { - return _SUCCESS; - } -#endif - -} - -/**************************************************************************** - -Following are some utitity fuctions for WiFi MLME - -*****************************************************************************/ - -BOOLEAN IsLegal5GChannel( - IN PADAPTER Adapter, - IN u8 channel) -{ - - int i=0; - u8 Channel_5G[45] = {36,38,40,42,44,46,48,50,52,54,56,58, - 60,62,64,100,102,104,106,108,110,112,114,116,118,120,122, - 124,126,128,130,132,134,136,138,140,149,151,153,155,157,159, - 161,163,165}; - for(i=0;imlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - static unsigned char prev_survey_channel = 0; - static unsigned int p2p_scan_count = 0; -#endif //CONFIG_P2P - -#ifdef CONFIG_TDLS - u32 v, bit_6=1<<6; - if(pmlmeinfo->tdls_dis_req==1){ - SelectChannel(padapter, pmlmeext->cur_channel); - - val8 = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - - //when we already set at a direct link and also want to dicovery TDLS STAs - //it is used to avoiding RCR DATA BIT on - v = rtw_read32(padapter, 0x0608); - v &= ~(bit_6); - rtw_write32(padapter, 0x0608, v); - - issue_tdls_dis_req(padapter); - - set_survey_timer(pmlmeext, 300); - - pmlmeinfo->tdls_dis_req=2; - return; - } - else if(pmlmeinfo->tdls_dis_req==2){ - pmlmeinfo->tdls_dis_req=3; - - //config MSR - Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); - - //turn on dynamic functions - Restore_DM_Func_Flag(padapter); - - report_surveydone_event(padapter); - - pmlmeext->chan_scan_time = SURVEY_TO; - pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - return; - } -#endif - -#ifdef CONFIG_P2P - if ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) - { - if ( pwdinfo->find_phase_state_exchange_cnt != 0 ) - { - // Commented by Albert 2011/06/03 - // The driver is in the find phase, it should go through the social channel. - survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx]; - ScanType = SCAN_ACTIVE; - } - else - { - // Commented by Albert 2011/06/03 - // The driver is in the scan phase, it should go through all the channel. - survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; - ScanType = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ScanType; - } - } - else if ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) - { - // Commented by Albert 2011/07/06 - // The driver is trying to transmit the provision discovery request frame. - // Before that, the driver will try to send the probe request frame to make sure the peer device is available. - if ( _TRUE == pwdinfo->tx_prov_disc_info.benable) - { - survey_channel = pwdinfo->tx_prov_disc_info.peer_channel_num[ pmlmeext->sitesurvey_res.channel_idx ]; - } - else - { - survey_channel = 0; - } - ScanType = SCAN_ACTIVE; - } - else if ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) - { - // commented by Albert 20110707 - // The driver is trying to transmit the negotiation request frame. - // Before that, the driver will try to send the probe request frame to make sure the peer device is available. - if ( _TRUE == pwdinfo->nego_req_info.benable ) - { - survey_channel = pwdinfo->nego_req_info.peer_channel_num[ pmlmeext->sitesurvey_res.channel_idx ]; - } - else - { - survey_channel = 0; - } - ScanType = SCAN_ACTIVE; - } - else -#endif //CONFIG_P2P - { - survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; - ScanType = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ScanType; - } - - if(survey_channel != 0) - { - - //DBG_871X("switching to channel:%d at %dms\n", - // survey_channel, rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time) - //); - //PAUSE 4-AC Queue when site_survey - //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); - //val8 |= 0x0f; - //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); - - if(pmlmeext->sitesurvey_res.channel_idx == 0) - { - set_channel_bwmode(padapter, survey_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } - else - { - SelectChannel(padapter, survey_channel); - } - -#ifdef CONFIG_TDLS - if(pmlmeinfo->tdls_ch_sensing==1) - pmlmeinfo->tdls_cur_channel =survey_channel; -#endif - - //DBG_871X("%s scan_mode:%d, ScanType:%d\n", __FUNCTION__, pmlmeext->sitesurvey_res.scan_mode, ScanType); - if((pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) && (ScanType == SCAN_ACTIVE)) - { - -#ifdef CONFIG_P2P - if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || - ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) - ) - { - issue_probereq_p2p(padapter); - issue_probereq_p2p(padapter); - issue_probereq_p2p(padapter); - } - else if ( ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) || - ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) ) - { - issue_probereq_p2p(padapter); - } - else -#endif //CONFIG_P2P - { - //todo: to issue two probe req??? - issue_probereq(padapter, 1); - //rtw_msleep_os(SURVEY_TO>>1); - issue_probereq(padapter, 1); - } - } - - set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); - - } - else - { - - // channel number is 0 or this channel is not valid. -#ifdef CONFIG_P2P - if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) - { - DBG_8192C( "[%s] find phase exchange cnt = %d\n", __FUNCTION__, pwdinfo->find_phase_state_exchange_cnt ); - } - - if ( ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) || - ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) ) - { - pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); - } - - if ( ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) && - ( pwdinfo->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_CNT ) ) - { - // Set the P2P State to the listen state of find phase and set the current channel to the listen channel - pwdinfo->p2p_state = P2P_STATE_FIND_PHASE_LISTEN; - pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - _set_timer( &pwdinfo->find_phase_timer, ( u32 ) ( ( u32 ) ( pwdinfo->listen_dwell ) * 100 ) ); - } - else -#endif //CONFIG_P2P - - { - -#ifdef CONFIG_ANTENNA_DIVERSITY - // 20100721:Interrupt scan operation here. - // For SW antenna diversity before link, it needs to switch to another antenna and scan again. - // It compares the scan result and select beter one to do connection. - if(padapter->HalFunc.SwAntDivBeforeLinkHandler(padapter)) - { - pmlmeext->sitesurvey_res.bss_cnt = 0; - pmlmeext->sitesurvey_res.channel_idx = -1; - pmlmeext->chan_scan_time = SURVEY_TO /2; - set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); - return; - } -#endif - -#ifdef CONFIG_P2P - if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) - { - pwdinfo->p2p_state = P2P_STATE_LISTEN; - } -#endif //CONFIG_P2P - - pmlmeext->sitesurvey_res.state = SCAN_COMPLETE; - - //switch back to the original channel - //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); - -#ifdef CONFIG_P2P - if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_OK ) - { - DBG_8192C( "[%s] In P2P WPS mode, stay in the peer operating channel = %d\n", __FUNCTION__, pwdinfo->peer_operating_ch ); - set_channel_bwmode(padapter, pwdinfo->peer_operating_ch, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - } - else -#endif //CONFIG_P2P - { - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - } - - //flush 4-AC Queue after site_survey - //val8 = 0; - //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); - - val8 = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - - //config MSR - Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); - - //turn on dynamic functions - Restore_DM_Func_Flag(padapter); - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); - - if (is_client_associated_to_ap(padapter) == _TRUE) - { - //issue null data - issue_nulldata(padapter, 0); - } - -#ifdef CONFIG_TDLS - if(pmlmeinfo->tdls_ch_sensing==1){ - u8 i, min; - pmlmeinfo->tdls_ch_sensing=0; - pmlmeinfo->tdls_cur_channel=1; - min=pmlmeinfo->tdls_collect_pkt_num[0]; - for(i=1; i<14-1; i++){ - if(min > pmlmeinfo->tdls_collect_pkt_num[i]){ - pmlmeinfo->tdls_cur_channel=i+1; - min=pmlmeinfo->tdls_collect_pkt_num[i]; - } - pmlmeinfo->tdls_collect_pkt_num[i]=0; - } - pmlmeinfo->tdls_collect_pkt_num[0]=0; - pmlmeinfo->tdls_candidate_ch=pmlmeinfo->tdls_cur_channel; - DBG_8192C("TDLS channel sensing done, candidate channel: %02x\n", pmlmeinfo->tdls_candidate_ch); - pmlmeinfo->tdls_cur_channel=0; - - // If we support TDLS, then when we finished site survey, - // we stil turn RCR_CBSSID_DATA off, - // such we can receive all kinds of data frames. - v = rtw_read32(padapter, 0x0608); - bit_6=1<<6; - v &= ~(bit_6); - rtw_write32(padapter, 0x0608, v); - } -#else - report_surveydone_event(padapter); -#endif - pmlmeext->chan_scan_time = SURVEY_TO; - pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - - issue_action_BSSCoexistPacket(padapter); - issue_action_BSSCoexistPacket(padapter); - issue_action_BSSCoexistPacket(padapter); - - } - - } - - return; - -} - -//collect bss info from Beacon and Probe response frames. -u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid) -{ - int i; - u32 len; - u8 *p; - u16 val16, subtype; - u8 *pframe = precv_frame->u.hdr.rx_data; - u32 packet_len = precv_frame->u.hdr.len; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - len = packet_len - sizeof(struct ieee80211_hdr_3addr); - - if (len > MAX_IE_SZ) - { - //DBG_8192C("IE too long for survey event\n"); - return _FAIL; - } - - _rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX)); - - subtype = GetFrameSubType(pframe) >> 4; - - if(subtype==WIFI_BEACON) - bssid->Reserved[0] = 1; - - bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; - - //below is to copy the information element - bssid->IELength = len; - _rtw_memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength); - - //get the signal strength - //bssid->Rssi = precv_frame->u.hdr.attrib.signal_strength; // 0-100 index. - bssid->Rssi = precv_frame->u.hdr.attrib.RecvSignalPower; // in dBM.raw data - bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.signal_qual;//in percentage - bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.signal_strength;//in percentage -#ifdef CONFIG_ANTENNA_DIVERSITY - //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); -#endif - - // checking SSID - if ((p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_)) == NULL) - { - DBG_871X("marc: cannot find SSID for survey event\n"); - return _FAIL; - } - - if (*(p + 1)) - { - _rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); - bssid->Ssid.SsidLength = *(p + 1); - } - else - { - bssid->Ssid.SsidLength = 0; - } - - _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); - - //checking rate info... - i = 0; - p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if (p != NULL) - { - _rtw_memcpy(bssid->SupportedRates, (p + 2), len); - i = len; - } - - p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if (p != NULL) - { - _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len); - } - - //todo: -#if 0 - if (judge_network_type(bssid->SupportedRates, (len + i)) == WIRELESS_11B) - { - bssid->NetworkTypeInUse = Ndis802_11DS; - } - else -#endif - { - bssid->NetworkTypeInUse = Ndis802_11OFDM24; - } - - // Checking for DSConfig - p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - - bssid->Configuration.DSConfig = 0; - bssid->Configuration.Length = 0; - - if (p) - { - bssid->Configuration.DSConfig = *(p + 2); - } - else - {// In 5G, some ap do not have DSSET IE - // checking HT info for channel - p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if(p) - { - struct HT_info_element *HT_info = (struct HT_info_element *)(p + 2); - bssid->Configuration.DSConfig = HT_info->primary_channel; - } - else - { // use current channel - if (padapter->mlmeextpriv.sitesurvey_res.state == SCAN_PROCESS) - bssid->Configuration.DSConfig = padapter->mlmeextpriv.channel_set[padapter->mlmeextpriv.sitesurvey_res.channel_idx].ChannelNum; - else - bssid->Configuration.DSConfig = padapter->mlmeextpriv.cur_channel; - } - } - - _rtw_memcpy(&bssid->Configuration.BeaconPeriod, rtw_get_beacon_interval_from_ie(bssid->IEs), 2); - - - bssid->Configuration.BeaconPeriod = le32_to_cpu(bssid->Configuration.BeaconPeriod); - - val16 = rtw_get_capability((WLAN_BSSID_EX *)bssid); - - if (val16 & BIT(0)) - { - bssid->InfrastructureMode = Ndis802_11Infrastructure; - _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); - } - else - { - bssid->InfrastructureMode = Ndis802_11IBSS; - _rtw_memcpy(bssid->MacAddress, GetAddr3Ptr(pframe), ETH_ALEN); - } - - if (val16 & BIT(4)) - bssid->Privacy = 1; - else - bssid->Privacy = 0; - - bssid->Configuration.ATIMWindow = 0; - - //20/40 BSS Coexistence check - if((pregistrypriv->wifi_spec==1) && (_FALSE == pmlmeinfo->bwmode_updated)) - { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); - if(p && len>0) - { - struct HT_caps_element *pHT_caps; - pHT_caps = (struct HT_caps_element *)(p + 2); - - if(pHT_caps->HT_cap_element.HT_caps_info&BIT(14)) - { - pmlmepriv->num_FortyMHzIntolerant++; - } - } - else - { - pmlmepriv->num_sta_no_ht++; - } - - } - - return _SUCCESS; - -} - -void start_create_ibss(_adapter* padapter) -{ - unsigned short caps; - u32 val32; - u8 val8; - u8 join_type; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; - pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); - - //update wireless mode - update_wireless_mode(padapter); - - //udpate capability - caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); - update_capinfo(padapter, caps); - if(caps&cap_IBSS)//adhoc master - { - //set_opmode_cmd(padapter, adhoc);//removed - - val8 = 0xcf; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - - //switch channel - //SelectChannel(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE); - set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - - beacon_timing_control(padapter); - - //set msr to WIFI_FW_ADHOC_STATE - pmlmeinfo->state = WIFI_FW_ADHOC_STATE; - Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); - - //issue beacon - if(send_beacon(padapter)==_FAIL) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing beacon frame fail....\n")); - - report_join_res(padapter, -1); - pmlmeinfo->state = WIFI_FW_NULL_STATE; - } - else - { - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress); - join_type = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - - report_join_res(padapter, 1); - pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; - } - } - else - { - DBG_871X("start_create_ibss, invalid cap:%x\n", caps); - return; - } - -} - -void start_clnt_join(_adapter* padapter) -{ - unsigned short caps; - u8 val8; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - - - pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; - pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); - - //update wireless mode - update_wireless_mode(padapter); - - //udpate capability - caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); - update_capinfo(padapter, caps); - if (caps&cap_ESS) - { - Set_NETYPE0_MSR(padapter, WIFI_FW_STATION_STATE); - - val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - - //switch channel - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - //here wait for receiving the beacon to start auth - //and enable a timer - set_link_timer(pmlmeext, decide_wait_for_beacon_timeout(pmlmeinfo->bcn_interval)); - - pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE; - } - else if (caps&cap_IBSS) //adhoc client - { - Set_NETYPE0_MSR(padapter, WIFI_FW_ADHOC_STATE); - - val8 = 0xcf; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - - //switch channel - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - beacon_timing_control(padapter); - - pmlmeinfo->state = WIFI_FW_ADHOC_STATE; - - report_join_res(padapter, 1); - } - else - { - //DBG_8192C("marc: invalid cap:%x\n", caps); - return; - } - -} - -void start_clnt_auth(_adapter* padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - _cancel_timer_ex(&pmlmeext->link_timer); - - pmlmeinfo->state &= (~WIFI_FW_AUTH_NULL); - pmlmeinfo->state |= WIFI_FW_AUTH_STATE; - - pmlmeinfo->auth_seq = 1; - pmlmeinfo->reauth_count = 0; - pmlmeinfo->reassoc_count = 0; - pmlmeinfo->link_count = 0; - - issue_auth(padapter, NULL, 0); - - set_link_timer(pmlmeext, REAUTH_TO); - -} - - -void start_clnt_assoc(_adapter* padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - _cancel_timer_ex(&pmlmeext->link_timer); - - pmlmeinfo->state &= (~(WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE)); - pmlmeinfo->state |= (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE); - - issue_assocreq(padapter); - - set_link_timer(pmlmeext, REASSOC_TO); -} - -unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //check A3 - if (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) - return _SUCCESS; - - DBG_871X("%s\n", __FUNCTION__); - - if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - { - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_del_sta_event(padapter, MacAddr, reason); - } - else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) - { - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_join_res(padapter, -2); - } - } - - return _SUCCESS; -} - -/**************************************************************************** - -Following are the functions to report events - -*****************************************************************************/ - -void report_survey_event(_adapter *padapter, union recv_frame *precv_frame) -{ - struct cmd_obj *pcmd_obj; - u8 *pevtcmd; - u32 cmdsz; - struct survey_event *psurvey_evt; - struct C2HEvent_Header *pc2h_evt_hdr; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - //u8 *pframe = precv_frame->u.hdr.rx_data; - //uint len = precv_frame->u.hdr.len; -#ifdef CONFIG_TDLS - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 *pframe = get_recvframe_data(precv_frame); -#endif - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } - - cmdsz = (sizeof(struct survey_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { - rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - return; - } - - _rtw_init_listhead(&pcmd_obj->list); - - pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); - pcmd_obj->cmdsz = cmdsz; - pcmd_obj->parmbuf = pevtcmd; - - pcmd_obj->rsp = NULL; - pcmd_obj->rspsz = 0; - - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); - pc2h_evt_hdr->len = sizeof(struct survey_event); - pc2h_evt_hdr->ID = GEN_EVT_CODE(_Survey); - pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - - psurvey_evt = (struct survey_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); - -#ifdef CONFIG_TDLS - //when tdls_dis_req is on, it would only report STAs who respond TDLS discovery response frame - if((pmlmeinfo->tdls_dis_req==1 || pmlmeinfo->tdls_dis_req==2)){ - if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){ - if (collect_tdls_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL){ - rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - rtw_mfree((u8 *)pevtcmd, cmdsz); - return; - } - } - }else -#endif - if (collect_bss_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL) - { - rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - rtw_mfree((u8 *)pevtcmd, cmdsz); - return; - } - - rtw_enqueue_cmd(pcmdpriv, pcmd_obj); - - pmlmeext->sitesurvey_res.bss_cnt++; - - return; - -} - -void report_surveydone_event(_adapter *padapter) -{ - struct cmd_obj *pcmd_obj; - u8 *pevtcmd; - u32 cmdsz; - struct surveydone_event *psurveydone_evt; - struct C2HEvent_Header *pc2h_evt_hdr; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } - - cmdsz = (sizeof(struct surveydone_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { - rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - return; - } - - _rtw_init_listhead(&pcmd_obj->list); - - pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); - pcmd_obj->cmdsz = cmdsz; - pcmd_obj->parmbuf = pevtcmd; - - pcmd_obj->rsp = NULL; - pcmd_obj->rspsz = 0; - - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); - pc2h_evt_hdr->len = sizeof(struct surveydone_event); - pc2h_evt_hdr->ID = GEN_EVT_CODE(_SurveyDone); - pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - - psurveydone_evt = (struct surveydone_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); - psurveydone_evt->bss_cnt = pmlmeext->sitesurvey_res.bss_cnt; - - //DBG_871X("survey done event(%x)\n", psurveydone_evt->bss_cnt); - - rtw_enqueue_cmd(pcmdpriv, pcmd_obj); - - return; - -} - -void report_join_res(_adapter *padapter, int res) -{ - struct cmd_obj *pcmd_obj; - u8 *pevtcmd; - u32 cmdsz; - struct joinbss_event *pjoinbss_evt; - struct C2HEvent_Header *pc2h_evt_hdr; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } - - cmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { - rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - return; - } - - _rtw_init_listhead(&pcmd_obj->list); - - pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); - pcmd_obj->cmdsz = cmdsz; - pcmd_obj->parmbuf = pevtcmd; - - pcmd_obj->rsp = NULL; - pcmd_obj->rspsz = 0; - - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); - pc2h_evt_hdr->len = sizeof(struct joinbss_event); - pc2h_evt_hdr->ID = GEN_EVT_CODE(_JoinBss); - pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - - pjoinbss_evt = (struct joinbss_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); - _rtw_memcpy((unsigned char *)(&(pjoinbss_evt->network.network)), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); - pjoinbss_evt->network.join_res = pjoinbss_evt->network.aid = res; - - //DBG_871X("report_join_res(%d)\n", res); - - #ifdef CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP - joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network); - #endif //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP - - rtw_enqueue_cmd(pcmdpriv, pcmd_obj); - - return; - -} - -void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason) -{ - struct cmd_obj *pcmd_obj; - u8 *pevtcmd; - u32 cmdsz; - struct stadel_event *pdel_sta_evt; - struct C2HEvent_Header *pc2h_evt_hdr; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } - - cmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { - rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - return; - } - - _rtw_init_listhead(&pcmd_obj->list); - - pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); - pcmd_obj->cmdsz = cmdsz; - pcmd_obj->parmbuf = pevtcmd; - - pcmd_obj->rsp = NULL; - pcmd_obj->rspsz = 0; - - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); - pc2h_evt_hdr->len = sizeof(struct stadel_event); - pc2h_evt_hdr->ID = GEN_EVT_CODE(_DelSTA); - pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - - pdel_sta_evt = (struct stadel_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); - _rtw_memcpy((unsigned char *)(&(pdel_sta_evt->macaddr)), MacAddr, ETH_ALEN); - _rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd),(unsigned char *)(&reason),2); - - DBG_871X("rtl8192: delete STA\n"); - - rtw_enqueue_cmd(pcmdpriv, pcmd_obj); - - return; -} - -void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx) -{ - struct cmd_obj *pcmd_obj; - u8 *pevtcmd; - u32 cmdsz; - struct stassoc_event *padd_sta_evt; - struct C2HEvent_Header *pc2h_evt_hdr; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - - if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } - - cmdsz = (sizeof(struct stassoc_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { - rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - return; - } - - _rtw_init_listhead(&pcmd_obj->list); - - pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); - pcmd_obj->cmdsz = cmdsz; - pcmd_obj->parmbuf = pevtcmd; - - pcmd_obj->rsp = NULL; - pcmd_obj->rspsz = 0; - - pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); - pc2h_evt_hdr->len = sizeof(struct stassoc_event); - pc2h_evt_hdr->ID = GEN_EVT_CODE(_AddSTA); - pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); - - padd_sta_evt = (struct stassoc_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); - _rtw_memcpy((unsigned char *)(&(padd_sta_evt->macaddr)), MacAddr, ETH_ALEN); - padd_sta_evt->cam_id = cam_idx; - - DBG_871X("report_add_sta_event: add STA\n"); - - rtw_enqueue_cmd(pcmdpriv, pcmd_obj); - - return; -} - - -/**************************************************************************** - -Following are the event callback functions - -*****************************************************************************/ - -//for sta/adhoc mode -static void update_sta_info(_adapter *padapter, struct sta_info *psta) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //ERP - VCS_update(padapter, psta); - - - //HT - if(pmlmepriv->htpriv.ht_option) - { - psta->htpriv.ht_option = _TRUE; - - psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable; - - if (support_short_GI(padapter, &(pmlmeinfo->HT_caps))) - psta->htpriv.sgi = _TRUE; - - psta->qos_option = _TRUE; - - } - else - { - psta->htpriv.ht_option = _FALSE; - - psta->htpriv.ampdu_enable = _FALSE; - - psta->htpriv.sgi = _FALSE; - - psta->qos_option = _FALSE;//? - - } - - psta->htpriv.bwmode = pmlmeext->cur_bwmode; - psta->htpriv.ch_offset = pmlmeext->cur_ch_offset; - - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - - - //QoS - if(pmlmepriv->qospriv.qos_option) - psta->qos_option = _TRUE; - - - psta->state = _FW_LINKED; - -} - -u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0}; - -void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) -{ - struct sta_info *psta, *psta_bmc; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - struct sta_priv *pstapriv = &padapter->stapriv; - u8 join_type, init_rts_rate; - - if(join_res < 0) - { - join_type = 1; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); - return; - } - - if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - //for bc/mc - psta_bmc = rtw_get_bcmc_stainfo(padapter); - if(psta_bmc) - { - pmlmeinfo->FW_sta_info[psta_bmc->mac_id].psta = psta_bmc; - update_bmc_sta_support_rate(padapter, psta_bmc->mac_id); - Update_RA_Entry(padapter, psta_bmc->mac_id); - } - } - - psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); - if (psta)//only for infra. mode - { - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - } - - //turn on dynamic functions - Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); - - // update IOT-releated issue - update_IOT_info(padapter); - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates); - - //BCN interval - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval)); - - //udpate capability - update_capinfo(padapter, pmlmeinfo->capability); - - //WMM, Update EDCA param - WMMOnAssocRsp(padapter); - - //HT - HTOnAssocRsp(padapter); - - //update sta_info - if (psta) //only for infra. mode - { - //DBG_871X("set_sta_rate & update_sta_info\n"); - - //set per sta rate after updating HT cap. - set_sta_rate(padapter, psta); - - update_sta_info(padapter, psta); - } - - join_type = 2; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - - if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) - { - // correcting TSF - correct_TSF(padapter, pmlmeext); - - //set_link_timer(pmlmeext, DISCONNECT_TO); - pmlmeext->linked_to = LINKED_TO; - } - -#ifdef CONFIG_LPS - rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0); -#endif - - //DBG_871X("=>%s\n", __FUNCTION__); - -} - -void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta) -{ - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 join_type; - - DBG_871X("%s\n", __FUNCTION__); - - if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - if(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)//adhoc master or sta_count>1 - { - //nothing to do - } - else//adhoc client - { - //update TSF Value - //update_TSF(pmlmeext, pframe, len); - - // correcting TSF - correct_TSF(padapter, pmlmeext); - - //start beacon - if(send_beacon(padapter)==_FAIL) - { - pmlmeinfo->FW_sta_info[psta->mac_id].status = 0; - - pmlmeinfo->state ^= WIFI_FW_ADHOC_STATE; - - return; - } - - pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; - - } - - join_type = 2; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - } - - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - //rate radaptive - Update_RA_Entry(padapter, psta->mac_id); - - //update adhoc sta_info - update_sta_info(padapter, psta); - - pmlmeext->linked_to = LINKED_TO; - -} - -void mlmeext_sta_del_event_callback(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter)) - { - //set_opmode_cmd(padapter, infra_client_with_mlme); - - //switch to the 20M Hz mode after disconnect - pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); - - //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - flush_all_cam_entry(padapter); - - pmlmeinfo->state = WIFI_FW_NULL_STATE; - - //set MSR to no link state - Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); - - pmlmeext->linked_to = 0; - _cancel_timer_ex(&pmlmeext->link_timer); - - } - -} - -/**************************************************************************** - -Following are the functions for the timer handlers - -*****************************************************************************/ - -void _linked_rx_signal_strehgth_display(_adapter *padapter) -{ - int UndecoratedSmoothedPWDB; - DBG_8192C("============ linked status check ===================\n"); - DBG_8192C("pathA Rx SNRdb:%d\n",padapter->recvpriv.RxSNRdB[0]); - DBG_8192C("pathA Rx PWDB:%d\n",padapter->recvpriv.rxpwdb); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); - DBG_8192C("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB); - DBG_8192C("Rx RSSI:%d\n",padapter->recvpriv.rssi); - DBG_8192C("Rx Signal_strength:%d\n",padapter->recvpriv.signal_strength); - DBG_8192C("Rx Signal_qual:%d \n",padapter->recvpriv.signal_qual); - DBG_8192C("============ linked status check ===================\n"); - DBG_8192C(" DIG PATH-A(0x%02x), PATH-B(0x%02x)\n",rtw_read8(padapter,0xc50),rtw_read8(padapter,0xc58)); - DBG_8192C(" OFDM -Alarm DA2(0x%04x),DA4(0x%04x),DA6(0x%04x),DA8(0x%04x)\n", - rtw_read16(padapter,0xDA2),rtw_read16(padapter,0xDA4),rtw_read16(padapter,0xDA6),rtw_read16(padapter,0xDA8)); - - DBG_8192C(" CCK -Alarm A5B(0x%02x),A5C(0x%02x)\n",rtw_read8(padapter,0xA5B),rtw_read8(padapter,0xA5C)); - -} - -void linked_status_chk(_adapter *padapter) -{ - u32 i; - struct sta_info *psta; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct recv_priv *precvpriv = &(padapter->recvpriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - - if (is_client_associated_to_ap(padapter)) - { - if(padapter->bRxRSSIDisplay) - _linked_rx_signal_strehgth_display(padapter); - - //linked infrastructure client mode - if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) - { - /*to monitor whether the AP is alive or not*/ - if (psta->sta_stats.last_rx_pkts == psta->sta_stats.rx_pkts) - { - // Commented by Albert 2010/07/21 - // In this case, there is no any rx packet received by driver. - - #ifdef CONFIG_LAYER2_ROAMING - if(pmlmeext->retry<2) - #else - if(pmlmeext->retry<8)// Alter the retry limit to 8 - #endif - { - if(pmlmeext->retry==0) - { - _rtw_memcpy(pmlmeext->sitesurvey_res.ss_ssid, pmlmeinfo->network.Ssid.Ssid, pmlmeinfo->network.Ssid.SsidLength); - pmlmeext->sitesurvey_res.ss_ssidlen = pmlmeinfo->network.Ssid.SsidLength; - pmlmeext->sitesurvey_res.scan_mode = SCAN_ACTIVE; - pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - if(padapter->HalFunc.sreset_linked_status_check) - padapter->HalFunc.sreset_linked_status_check(padapter); - #endif - - //DBG_871X("issue_probereq to check if ap alive, retry=%d\n", pmlmeext->retry); - - // In order to know the AP's current state, try to send the probe request - // to trigger the AP to send the probe response. - issue_probereq(padapter, 0); - issue_probereq(padapter, 0); - issue_probereq(padapter, 0); - } - - pmlmeext->retry++; - pmlmeext->linked_to = LINKED_TO; - } - else - { - pmlmeext->retry = 0; - DBG_871X("no beacon to call receive_disconnect()\n"); - receive_disconnect(padapter, pmlmeinfo->network.MacAddress - , 65535// indicate disconnect caused by no rx - ); - pmlmeinfo->link_count = 0; - return; - } - } - else - { - pmlmeext->retry = 0; - psta->sta_stats.last_rx_pkts = psta->sta_stats.rx_pkts; - //set_link_timer(pmlmeext, DISCONNECT_TO); - pmlmeext->linked_to = LINKED_TO; - } - - /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ - if (pmlmeinfo->link_count++ == 0) - { - pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; - } - else if ((pmlmeinfo->link_count & 0xf) == 0) - { - if ( pxmitpriv->last_tx_pkts == pxmitpriv->tx_pkts) - { - //DBG_871X("(Interface %d)issue nulldata to keep alive\n",padapter->dvobjpriv.InterfaceNumber); - issue_nulldata(padapter, 0); - } - - pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; - } - - } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) - } - else if (is_client_associated_to_ibss(padapter)) - { - //linked IBSS mode - //for each assoc list entry to check the rx pkt counter - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { - psta = pmlmeinfo->FW_sta_info[i].psta; - - if(NULL==psta) continue; - - if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) - { - - if(pmlmeinfo->FW_sta_info[i].retry<3) - { - pmlmeinfo->FW_sta_info[i].retry++; - } - else - { - pmlmeinfo->FW_sta_info[i].retry = 0; - pmlmeinfo->FW_sta_info[i].status = 0; - report_del_sta_event(padapter, psta->hwaddr - , 65535// indicate disconnect caused by no rx - ); - } - } - else - { - pmlmeinfo->FW_sta_info[i].retry = 0; - pmlmeinfo->FW_sta_info[i].rx_pkt = (u32)psta->sta_stats.rx_pkts; - } - } - } - - //set_link_timer(pmlmeext, DISCONNECT_TO); - pmlmeext->linked_to = LINKED_TO; - - } - -} - -void survey_timer_hdl(_adapter *padapter) -{ - struct cmd_obj *ph2c; - struct sitesurvey_parm *psurveyPara; - struct cmd_priv *pcmdpriv=&padapter->cmdpriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - //DBG_8192C("marc: survey timer\n"); - - //issue rtw_sitesurvey_cmd - if (pmlmeext->sitesurvey_res.state > SCAN_START) - { - if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) - pmlmeext->sitesurvey_res.channel_idx++; - - if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - goto exit_survey_timer_hdl; - } - - if ((psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm))) == NULL) - { - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - goto exit_survey_timer_hdl; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); - rtw_enqueue_cmd(pcmdpriv, ph2c); - } - - -exit_survey_timer_hdl: - - return; -} - -void link_timer_hdl(_adapter *padapter) -{ - static unsigned int rx_pkt = 0; - static u64 tx_cnt = 0; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - - if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) - { - DBG_871X("link_timer_hdl:no beacon while connecting\n"); - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_join_res(padapter, -3); - } - else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE) - { - //re-auth timer - if (++pmlmeinfo->reauth_count > REAUTH_LIMIT) - { - if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto) - { - pmlmeinfo->state = 0; - report_join_res(padapter, -1); - return; - } - else - { - pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; - pmlmeinfo->reauth_count = 0; - } - } - - DBG_871X("link_timer_hdl: auth timeout and try again\n"); - pmlmeinfo->auth_seq = 1; - issue_auth(padapter, NULL, 0); - set_link_timer(pmlmeext, REAUTH_TO); - } - else if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE) - { - //re-assoc timer - if (++pmlmeinfo->reassoc_count > REASSOC_LIMIT) - { - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_join_res(padapter, -2); - return; - } - - DBG_871X("link_timer_hdl: assoc timeout and try again\n"); - issue_assocreq(padapter); - set_link_timer(pmlmeext, REASSOC_TO); - } -#if 0 - else if (is_client_associated_to_ap(padapter)) - { - //linked infrastructure client mode - if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) - { - /*to monitor whether the AP is alive or not*/ - if (rx_pkt == psta->sta_stats.rx_pkts) - { - receive_disconnect(padapter, pmlmeinfo->network.MacAddress); - return; - } - else - { - rx_pkt = psta->sta_stats.rx_pkts; - set_link_timer(pmlmeext, DISCONNECT_TO); - } - - //update the EDCA paramter according to the Tx/RX mode - update_EDCA_param(padapter); - - /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ - if (pmlmeinfo->link_count++ == 0) - { - tx_cnt = pxmitpriv->tx_pkts; - } - else if ((pmlmeinfo->link_count & 0xf) == 0) - { - if (tx_cnt == pxmitpriv->tx_pkts) - { - issue_nulldata(padapter, 0); - } - - tx_cnt = pxmitpriv->tx_pkts; - } - } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) - } - else if (is_client_associated_to_ibss(padapter)) - { - //linked IBSS mode - //for each assoc list entry to check the rx pkt counter - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { - psta = pmlmeinfo->FW_sta_info[i].psta; - - if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) - { - pmlmeinfo->FW_sta_info[i].status = 0; - report_del_sta_event(padapter, psta->hwaddr); - } - else - { - pmlmeinfo->FW_sta_info[i].rx_pkt = psta->sta_stats.rx_pkts; - } - } - } - - set_link_timer(pmlmeext, DISCONNECT_TO); - } -#endif - - return; -} - -void addba_timer_hdl(struct sta_info *psta) -{ - u8 bitmap; - u16 tid; - struct ht_priv *phtpriv; - - if(!psta) - return; - - phtpriv = &psta->htpriv; - - if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) - { - if(phtpriv->candidate_tid_bitmap) - phtpriv->candidate_tid_bitmap=0x0; - - } - -} - -u8 NULL_hdl(_adapter *padapter, u8 *pbuf) -{ - return H2C_SUCCESS; -} - -u8 setopmode_hdl(_adapter *padapter, u8 *pbuf) -{ - u8 type; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct setopmode_parm *psetop = (struct setopmode_parm *)pbuf; - - if(psetop->mode == Ndis802_11APMode) - { - pmlmeinfo->state = WIFI_FW_AP_STATE; - type = _HW_STATE_AP_; -#ifdef CONFIG_NATIVEAP_MLME - //start_ap_mode(padapter); -#endif - } - else if(psetop->mode == Ndis802_11Infrastructure) - { - type = _HW_STATE_STATION_; - } - else if(psetop->mode == Ndis802_11IBSS) - { - type = _HW_STATE_ADHOC_; - } - else - { - type = _HW_STATE_NOLINK_; - } - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); - //Set_NETYPE0_MSR(padapter, type); - - return H2C_SUCCESS; - -} - -u8 createbss_hdl(_adapter *padapter, u8 *pbuf) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; - u32 initialgain; - - - if(pparm->network.InfrastructureMode == Ndis802_11APMode) - { -#ifdef CONFIG_AP_MODE - - if(pmlmeinfo->state == WIFI_FW_AP_STATE) - { - //todo: - return H2C_SUCCESS; - } -#endif - } - - //below is for ad-hoc master - if(pparm->network.InfrastructureMode == Ndis802_11IBSS) - { - rtw_joinbss_reset(padapter); - - pmlmeext->linked_to = 0; - - pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE; - pmlmeinfo->ERP_enable = 0; - pmlmeinfo->WMM_enable = 0; - pmlmeinfo->HT_enable = 0; - pmlmeinfo->HT_caps_enable = 0; - pmlmeinfo->HT_info_enable = 0; - pmlmeinfo->agg_enable_bitmap = 0; - pmlmeinfo->candidate_tid_bitmap = 0; - - //disable dynamic functions, such as high power, DIG - Save_DM_Func_Flag(padapter); - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - //config the initial gain under linking, need to write the BB registers - initialgain = 0x30; - //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - - //cancel link timer - _cancel_timer_ex(&pmlmeext->link_timer); - - //clear CAM - flush_all_cam_entry(padapter); - - _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); - pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength; - - if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength - return H2C_PARAMETERS_ERROR; - - _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); - - start_create_ibss(padapter); - - } - - return H2C_SUCCESS; - -} - -u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) -{ - u8 join_type; - PNDIS_802_11_VARIABLE_IEs pIE; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; - u32 acparm, initialgain, i; - - //check already connecting to AP or not - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - { - if (pmlmeinfo->state & WIFI_FW_STATION_STATE) - { - issue_deauth(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING); - } - - pmlmeinfo->state = WIFI_FW_NULL_STATE; - - //clear CAM - flush_all_cam_entry(padapter); - - _cancel_timer_ex(&pmlmeext->link_timer); - - //set MSR to nolink - Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); - } - -#ifdef CONFIG_ANTENNA_DIVERSITY - rtw_antenna_select_cmd(padapter, pparm->network.PhyInfo.Optimum_antenna, _FALSE); -#endif - - rtw_joinbss_reset(padapter); - - pmlmeext->linked_to = 0; - - pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE; - pmlmeinfo->ERP_enable = 0; - pmlmeinfo->WMM_enable = 0; - pmlmeinfo->HT_enable = 0; - pmlmeinfo->HT_caps_enable = 0; - pmlmeinfo->HT_info_enable = 0; - pmlmeinfo->agg_enable_bitmap = 0; - pmlmeinfo->candidate_tid_bitmap = 0; - pmlmeinfo->bwmode_updated = _FALSE; - //pmlmeinfo->assoc_AP_vendor = maxAP; - - _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); - pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength; - - if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength - return H2C_PARAMETERS_ERROR; - - _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); - - //Check AP vendor - pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength); - - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_://Get WMM IE. - if ( _rtw_memcmp(pIE->data, WMM_OUI, 4) ) - { - pmlmeinfo->WMM_enable = 1; - } - break; - - case _HT_CAPABILITY_IE_: //Get HT Cap IE. - pmlmeinfo->HT_caps_enable = 1; - break; - - case _HT_EXTRA_INFO_IE_: //Get HT Info IE. - pmlmeinfo->HT_info_enable = 1; - - //spec case only for cisco's ap because cisco's ap issue assoc rsp using mcs rate @40MHz or @20MHz - if(pmlmeinfo->assoc_AP_vendor == ciscoAP) - { - struct HT_info_element *pht_info = (struct HT_info_element *)(pIE->data); - - if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) - { - //switch to the 40M Hz mode according to the AP - pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; - switch (pht_info->infos[0] & 0x3) - { - case 1: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case 3: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; - } - - DBG_871X("set ch/bw for cisco's ap before connected\n"); - } - } - break; - - default: - break; - } - - i += (pIE->Length + 2); - } -#if 0 - if (padapter->registrypriv.wifi_spec) { - // for WiFi test, follow WMM test plan spec - acparm = 0x002F431C; // VO - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E541C; // VI - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - acparm = 0x0000A525; // BE - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A549; // BK - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); - - // for WiFi test, mixed mode with intel STA under bg mode throughput issue - if (padapter->mlmepriv.htpriv.ht_option == _FALSE){ - acparm = 0x00004320; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - } - } - else { - acparm = 0x002F3217; // VO - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E4317; // VI - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - acparm = 0x00105320; // BE - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A444; // BK - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); - } -#endif - //disable dynamic functions, such as high power, DIG - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - //config the initial gain under linking, need to write the BB registers - initialgain = 0x32; - //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); - join_type = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - - //cancel link timer - _cancel_timer_ex(&pmlmeext->link_timer); - - start_clnt_join(padapter); - - return H2C_SUCCESS; - -} - -u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf) -{ - struct disconnect_parm *pparm = (struct disconnect_parm *)pbuf; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - u8 val8; - - if (is_client_associated_to_ap(padapter)) - { - issue_deauth(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING); - } - - //set_opmode_cmd(padapter, infra_client_with_mlme); - - pmlmeinfo->state = WIFI_FW_NULL_STATE; - - //switch to the 20M Hz mode after disconnect - pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - //set MSR to no link state - Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //Stop BCN - val8 = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8)); - } - - pmlmeinfo->state = WIFI_FW_NULL_STATE; - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - flush_all_cam_entry(padapter); - - _cancel_timer_ex(&pmlmeext->link_timer); - pmlmeext->linked_to = 0; - - return H2C_SUCCESS; -} - -u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; - u8 val8; - u32 initialgain; - u32 i; -#ifdef CONFIG_TDLS - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; -#endif - - if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE) - { - //for first time sitesurvey_cmd - pmlmeext->sitesurvey_res.state = SCAN_START; - pmlmeext->sitesurvey_res.bss_cnt = 0; - pmlmeext->sitesurvey_res.channel_idx = 0; - - if (le32_to_cpu(pparm->ss_ssidlen)) - { - _rtw_memcpy(pmlmeext->sitesurvey_res.ss_ssid, pparm->ss_ssid, le32_to_cpu(pparm->ss_ssidlen)); - } - else - { - _rtw_memset(pmlmeext->sitesurvey_res.ss_ssid, 0, (IW_ESSID_MAX_SIZE + 1)); - } - - pmlmeext->sitesurvey_res.ss_ssidlen = le32_to_cpu(pparm->ss_ssidlen); - -#ifdef CONFIG_TDLS - if(pmlmeinfo->tdls_ch_sensing==1) - pmlmeext->sitesurvey_res.scan_mode=SCAN_PASSIVE; - else - pmlmeext->sitesurvey_res.scan_mode = le32_to_cpu(pparm->scan_mode); -#else - pmlmeext->sitesurvey_res.scan_mode = le32_to_cpu(pparm->scan_mode); -#endif - - //issue null data if associating to the AP - if (is_client_associated_to_ap(padapter) == _TRUE) - { - pmlmeext->sitesurvey_res.state = SCAN_TXNULL; - - issue_nulldata(padapter, 1); - issue_nulldata(padapter, 1); - - //delay 50ms to protect nulldata(1). - set_survey_timer(pmlmeext, 50); - - return H2C_SUCCESS; - } - } - - if ((pmlmeext->sitesurvey_res.state == SCAN_START) || (pmlmeext->sitesurvey_res.state == SCAN_TXNULL)) - { -#ifdef CONFIG_FIND_BEST_CHANNEL -#if 0 - for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { - pmlmeext->channel_set[i].rx_count = 0; - } -#endif -#endif /* CONFIG_FIND_BEST_CHANNEL */ - - //disable dynamic functions, such as high power, DIG - Save_DM_Func_Flag(padapter); - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - //config the initial gain under scaning, need to write the BB registers - initialgain = 0x20; - //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - - //set MSR to no link state - Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); - - val8 = 1; //before site survey - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); - - pmlmeext->sitesurvey_res.state = SCAN_PROCESS; - } - -#ifdef CONFIG_TDLS - if(pmlmeinfo->tdls_ch_sensing==1){ - rtw_write16(padapter, 0x06A4,0xffff); - } -#endif - - site_survey(padapter); - - return H2C_SUCCESS; - -} - -u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf) -{ - struct setauth_parm *pparm = (struct setauth_parm *)pbuf; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (pparm->mode < 4) - { - pmlmeinfo->auth_algo = pparm->mode; - } - - return H2C_SUCCESS; -} - -u8 setkey_hdl(_adapter *padapter, u8 *pbuf) -{ - unsigned short ctrl; - struct setkey_parm *pparm = (struct setkey_parm *)pbuf; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - //main tx key for wep. - if(pparm->set_tx) - pmlmeinfo->key_index = pparm->keyid; - - //write cam - ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid; - - write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key); - - return H2C_SUCCESS; -} - -u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf) -{ - unsigned short ctrl=0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct set_stakey_parm *pparm = (struct set_stakey_parm *)pbuf; -#ifdef CONFIG_TDLS - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta; -#endif - - if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - unsigned char cam_id;//cam_entry - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - psta = rtw_get_stainfo(pstapriv, pparm->addr); - if(psta) - { - ctrl = (BIT(15) | ((pparm->algorithm) << 2)); - - DBG_8192C("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm); - - if((psta->mac_id<1) || (psta->mac_id>(NUM_STA-4))) - { - DBG_8192C("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id); - return H2C_REJECTED; - } - - cam_id = (psta->mac_id + 3);//0~3 for default key, cmd_id=macid + 3, macid=aid+1; - - DBG_8192C("Write CAM, mac_addr=%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0], - pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4], - pparm->addr[5], cam_id); - - write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key); - - return H2C_SUCCESS_RSP; - - } - else - { - DBG_8192C("r871x_set_stakey_hdl(): sta has been free\n"); - return H2C_REJECTED; - } - - } - - //below for sta mode - - ctrl = BIT(15) | ((pparm->algorithm) << 2); - -#ifdef CONFIG_TDLS - if(pmlmeinfo->tdls_cam_entry_to_clear!=0){ - clear_cam_entry(padapter, pmlmeinfo->tdls_cam_entry_to_clear); - pmlmeinfo->tdls_cam_entry_to_clear=0; - - return H2C_SUCCESS; - } - - psta = rtw_get_stainfo(pstapriv, pparm->addr);//Get TDLS Peer STA - if((psta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE){ - write_cam(padapter, psta->cam_entry, ctrl, pparm->addr, pparm->key); - } - else -#endif - write_cam(padapter, 5, ctrl, pparm->addr, pparm->key); - - pmlmeinfo->enc_algo = pparm->algorithm; - - return H2C_SUCCESS; -} - -u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf) -{ - struct addBaReq_parm *pparm = (struct addBaReq_parm *)pbuf; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, pparm->addr); - - if(!psta) - return H2C_SUCCESS; - - - if (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) || - ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pmlmeinfo->ADDBA_retry_count = 0; - //pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid); - //psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid); - issue_action_BA(padapter, pparm->addr, WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); - //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO); - _set_timer(&psta->addba_retry_timer, ADDBA_TO); - } - else - { - psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid); - } - - return H2C_SUCCESS; -} - -u8 set_tx_beacon_cmd(_adapter* padapter) -{ - struct cmd_obj *ph2c; - struct Tx_Beacon_param *ptxBeacon_parm; - struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 res = _SUCCESS; - -_func_enter_; - - if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - res= _FAIL; - goto exit; - } - - if ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL) - { - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - _rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); - init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - - -exit: - -_func_exit_; - - return res; -} - - -u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf) -{ - u8 evt_code, evt_seq; - u16 evt_sz; - uint *peventbuf; - void (*event_callback)(_adapter *dev, u8 *pbuf); - struct evt_priv *pevt_priv = &(padapter->evtpriv); - - peventbuf = (uint*)pbuf; - evt_sz = (u16)(*peventbuf&0xffff); - evt_seq = (u8)((*peventbuf>>24)&0x7f); - evt_code = (u8)((*peventbuf>>16)&0xff); - - - #ifdef CHECK_EVENT_SEQ - // checking event sequence... - if (evt_seq != (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f) ) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("Evetn Seq Error! %d vs %d\n", (evt_seq & 0x7f), (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f))); - - pevt_priv->event_seq = (evt_seq+1)&0x7f; - - goto _abort_event_; - } - #endif - - // checking if event code is valid - if (evt_code >= MAX_C2HEVT) - { - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent Code(%d) mismatch!\n", evt_code)); - goto _abort_event_; - } - - // checking if event size match the event parm size - if ((wlanevents[evt_code].parmsize != 0) && - (wlanevents[evt_code].parmsize != evt_sz)) - { - - RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent(%d) Parm Size mismatch (%d vs %d)!\n", - evt_code, wlanevents[evt_code].parmsize, evt_sz)); - goto _abort_event_; - - } - - ATOMIC_INC(&pevt_priv->event_seq); - - peventbuf += 2; - - if(peventbuf) - { - event_callback = wlanevents[evt_code].event_callback; - event_callback(padapter, (u8*)peventbuf); - - pevt_priv->evt_done_cnt++; - } - - -_abort_event_: - - - return H2C_SUCCESS; - -} - -u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) -{ - if(!pbuf) - return H2C_PARAMETERS_ERROR; - - return H2C_SUCCESS; -} - - -u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf) -{ - if(send_beacon(padapter)==_FAIL) - { - DBG_871X("issue_beacon, fail!\n"); - return H2C_PARAMETERS_ERROR; - } -#ifdef CONFIG_AP_MODE - else //tx bc/mc frames after update TIM - { - _irqL irqL; - struct sta_info *psta_bmc; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - //for BC/MC Frames - psta_bmc = rtw_get_bcmc_stainfo(padapter); - if(!psta_bmc) - return H2C_SUCCESS; - - if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0)) - { - - rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows - - _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&psta_bmc->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - - xmitframe_plist = get_next(xmitframe_plist); - - rtw_list_delete(&pxmitframe->list); - - psta_bmc->sleepq_len--; - if(psta_bmc->sleepq_len>0) - pxmitframe->attrib.mdata = 1; - else - pxmitframe->attrib.mdata = 0; - - pxmitframe->attrib.triggered=1; - - if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(padapter, pxmitframe); - } - - //pstapriv->tim_bitmap &= ~BIT(0); - - } - - _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - - } - - } -#endif - - return H2C_SUCCESS; - -} - -#ifdef CONFIG_AP_MODE - -void init_mlme_ap_info(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); - - //pmlmeext->bstart_bss = _FALSE; - - start_ap_mode(padapter); -} - -void free_mlme_ap_info(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - - stop_ap_mode(padapter); -} - -static void update_BCNTIM(_adapter *padapter) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); - unsigned char *src_ie = pnetwork->IEs; - unsigned int src_ielen = pnetwork->IELength; - unsigned char *dst_ie = pnetwork_mlmeext->IEs; - - - //update TIM IE - //if(pstapriv->tim_bitmap) - if(_TRUE) - { - u8 *p, ie_len; - u16 tim_bitmap_le; - u32 tmp_len, head_len=0; - - tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); - - //calucate head_len - head_len = _FIXED_IE_LENGTH_; - head_len += pnetwork->Ssid.SsidLength + 2; - - // get supported rates len - p = rtw_get_ie(src_ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); - if (p != NULL) - { - head_len += tmp_len+2; - } - - //DS Parameter Set IE, len=3 - head_len += 3; - - //copy head offset - _rtw_memcpy(dst_ie, src_ie, head_len); - - - //append TIM IE from head_len offset - dst_ie+=head_len; - - *dst_ie++=_TIM_IE_; - - if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fc)) - ie_len = 5; - else - ie_len = 4; - - *dst_ie++= ie_len; - - *dst_ie++=0;//DTIM count - *dst_ie++=1;//DTIM peroid - - if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames - *dst_ie++ = BIT(0);//bitmap ctrl - else - *dst_ie++ = 0; - - if(ie_len==4) - { - *dst_ie++ = *(u8*)&tim_bitmap_le; - } - else if(ie_len==5) - { - _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); - dst_ie+=2; - } - - //copy remainder IE - _rtw_memcpy(dst_ie, src_ie+head_len, src_ielen-head_len); - - //pnetwork_mlmeext->Length += ie_len+2; - //pnetwork_mlmeext->IELength += ie_len+2; - pnetwork_mlmeext->Length = pnetwork->Length+ie_len+2; - pnetwork_mlmeext->IELength = src_ielen+ie_len+2; - - } - else - { - _rtw_memcpy(dst_ie, src_ie, src_ielen); - pnetwork_mlmeext->Length = pnetwork->Length; - pnetwork_mlmeext->IELength = src_ielen; - } - -#ifdef CONFIG_USB_HCI - set_tx_beacon_cmd(padapter); -#endif - - -/* - if(send_beacon(padapter)==_FAIL) - { - DBG_871X("issue_beacon, fail!\n"); - } -*/ - -} - -u8 chk_sta_is_alive(struct sta_info *psta) -{ - struct stainfo_stats *pstats; - - pstats = &psta->sta_stats; - - if(pstats->rx_pkts == pstats->last_rx_pkts) - { - if(psta->state&WIFI_SLEEP_STATE) - return _TRUE; - else - return _FALSE; - } - else - { - pstats->last_rx_pkts = pstats->rx_pkts; - - return _TRUE; - } - -} - -void expire_timeout_chk(_adapter *padapter) -{ - _list *phead, *plist; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - phead = &pstapriv->auth_list; - plist = get_next(phead); - - //check auth_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); - - plist = get_next(plist); - - if(psta->expire_to>0) - { - psta->expire_to--; - if (psta->expire_to == 0) - { - _irqL irqL; - - rtw_list_delete(&psta->auth_list); - - DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", - psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - } - } - - } - - - psta = NULL; - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //check asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - if(chk_sta_is_alive(psta)) - { - psta->expire_to = pstapriv->expire_to; - } - - if(psta->expire_to>0) - { - psta->expire_to--; - if (psta->expire_to == 0) - { - _irqL irqL; - - rtw_list_delete(&psta->asoc_list); - - DBG_871X("asoc expire %02X%02X%02X%02X%02X%02X\n", - psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); -#if 0 - //tear down Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - - issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); -#endif - ap_free_sta(padapter, psta); - - } - } - - } - -} - - -static void add_RATid(_adapter *padapter, struct sta_info *psta) -{ - int i; - u8 rf_type; - u32 init_rate=0; - unsigned char sta_band = 0, raid, shortGIrate = _FALSE; - unsigned char limit; - unsigned int tx_ra_bitmap=0; - struct ht_priv *psta_ht = NULL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - - - if(psta) - psta_ht = &psta->htpriv; - else - return; - - //b/g mode ra_bitmap - for (i=0; ibssrateset); i++) - { - if (psta->bssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } - - //n mode ra_bitmap - if(psta_ht->ht_option) - { - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - if(rf_type == RF_2T2R) - limit=16;// 2R - else - limit=8;// 1R - - for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) - tx_ra_bitmap |= BIT(i+12); - } - - //max short GI rate - shortGIrate = psta_ht->sgi; - } - - -#if 0//gtest - if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) - { - //is this a 2r STA? - if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) - { - priv->pshare->has_2r_sta |= BIT(pstat->aid); - if(rtw_read16(padapter, 0x102501f6) != 0xffff) - { - rtw_write16(padapter, 0x102501f6, 0xffff); - reset_1r_sta_RA(priv, 0xffff); - Switch_1SS_Antenna(priv, 3); - } - } - else// bg or 1R STA? - { - if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) - { - if(rtw_read16(padapter, 0x102501f6) != 0x7777) - { // MCS7 SGI - rtw_write16(padapter, 0x102501f6,0x7777); - reset_1r_sta_RA(priv, 0x7777); - Switch_1SS_Antenna(priv, 2); - } - } - } - - } - - if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) - { - if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) - pstat->rssi_level = 1; - else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || - ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && - (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && - (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) - pstat->rssi_level = 2; - else - pstat->rssi_level = 3; - } - - // rate adaptive by rssi - if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) - { - if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x100f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x100ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x100ff005; - else - pstat->tx_ra_bitmap &= 0x100ff001; - - break; - } - } - else - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x1f0f0000; - break; - case 2: - pstat->tx_ra_bitmap &= 0x1f0ff000; - break; - case 3: - if (priv->pshare->is_40m_bw) - pstat->tx_ra_bitmap &= 0x000ff005; - else - pstat->tx_ra_bitmap &= 0x000ff001; - - break; - } - - // Don't need to mask high rates due to new rate adaptive parameters - //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta - // pstat->tx_ra_bitmap &= 0x81ffffff; - - // NIC driver will report not supporting MCS15 and MCS14 in asoc req - //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) - // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 - } - } - else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) - { - switch (pstat->rssi_level) { - case 1: - pstat->tx_ra_bitmap &= 0x00000f00; - break; - case 2: - pstat->tx_ra_bitmap &= 0x00000ff0; - break; - case 3: - pstat->tx_ra_bitmap &= 0x00000ff5; - break; - } - } - else - { - pstat->tx_ra_bitmap &= 0x0000000d; - } - - // disable tx short GI when station cannot rx MCS15(AP is 2T2R) - // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) - // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate - if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || - (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) - { - pstat->tx_ra_bitmap &= ~BIT(28); - } -#endif - - if ( pcur_network->Configuration.DSConfig > 14 ) { - // 5G band - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_5N | WIRELESS_11A; - else - sta_band |= WIRELESS_11A; - } else { - if (tx_ra_bitmap & 0xffff000) - sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; - else if (tx_ra_bitmap & 0xff0) - sta_band |= WIRELESS_11G |WIRELESS_11B; - else - sta_band |= WIRELESS_11B; - } - - raid = networktype_to_raid(sta_band); - init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; - - if (psta->aid < NUM_STA) - { - u8 arg = 0; - - arg = psta->mac_id&0x1f; - - arg |= BIT(7); - - if (shortGIrate==_TRUE) - arg |= BIT(5); - - tx_ra_bitmap |= ((raid<<28)&0xf0000000); - - DBG_871X("update raid entry, bitmap=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); - - //bitmap[0:27] = tx_rate_bitmap - //bitmap[28:31]= Rate Adaptive id - //arg[0:4] = macid - //arg[5] = Short GI - padapter->HalFunc.Add_RateATid(padapter, tx_ra_bitmap, arg); - - if (shortGIrate==_TRUE) - init_rate |= BIT(6); - - //set ra_id, init_rate - psta->raid = raid; - psta->init_rate = init_rate; - - } - else - { - DBG_871X("station aid %d exceed the max number\n", psta->aid); - } - -} - -static void update_bmc_sta(_adapter *padapter) -{ - _irqL irqL; - u32 init_rate=0; - unsigned char network_type, raid; - unsigned short para16; - int i, supportRateNum = 0; - unsigned int tx_ra_bitmap=0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); - - if(psta) - { - psta->aid = 0;//default set to 0 - //psta->mac_id = psta->aid+4; - psta->mac_id = psta->aid + 1; - - psta->qos_option = 0; - psta->htpriv.ht_option = _FALSE; - - psta->ieee8021x_blocked = 0; - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. - - - - //prepare for add_RATid - supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); - network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1); - - _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); - psta->bssratelen = supportRateNum; - - //b/g mode ra_bitmap - for (i=0; ibssrateset[i]) - tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); - } - - if ( pcur_network->Configuration.DSConfig > 14 ) { - //force to A mode. 5G doesn't support CCK rates - network_type = WIRELESS_11A; - tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps - } else { - //force to b mode - network_type = WIRELESS_11B; - tx_ra_bitmap = 0xf; - } - - //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum); - - raid = networktype_to_raid(network_type); - init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; - - //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap); - - //if(pHalData->fw_ractrl == _TRUE) - { - u8 arg = 0; - - arg = psta->mac_id&0x1f; - - arg |= BIT(7); - - //if (shortGIrate==_TRUE) - // arg |= BIT(5); - - tx_ra_bitmap |= ((raid<<28)&0xf0000000); - - DBG_871X("update_bmc_sta, mask=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); - - //bitmap[0:27] = tx_rate_bitmap - //bitmap[28:31]= Rate Adaptive id - //arg[0:4] = macid - //arg[5] = Short GI - padapter->HalFunc.Add_RateATid(padapter, tx_ra_bitmap, arg); - - } - - //set ra_id, init_rate - psta->raid = raid; - psta->init_rate = init_rate; - - _enter_critical_bh(&psta->lock, &irqL); - psta->state = _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - } - else - { - DBG_871X("add_RATid_bmc_sta error!\n"); - } - -} - -//notes: -//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode -//MAC_ID = AID+1 for sta in ap/adhoc mode -//MAC_ID = 1 for bc/mc for sta/ap/adhoc -//MAC_ID = 0 for bssid for sta/ap/adhoc -//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; - -void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - struct ht_priv *phtpriv_sta = &psta->htpriv; - - //set intf_tag to if1 - //psta->intf_tag = 0; - - //psta->mac_id = psta->aid+4; - psta->mac_id = psta->aid+1; - - if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) - psta->ieee8021x_blocked = _TRUE; - else - psta->ieee8021x_blocked = _FALSE; - - - //update sta's cap - - //ERP - VCS_update(padapter, psta); - - //HT related cap - if(phtpriv_sta->ht_option) - { - //check if sta supports rx ampdu - phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; - - //check if sta support s Short GI - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) - { - phtpriv_sta->sgi = _TRUE; - } - - // bwmode - if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) - { - //phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40; - phtpriv_sta->bwmode = pmlmeext->cur_bwmode; - phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; - - } - - psta->qos_option = _TRUE; - - } - else - { - phtpriv_sta->ampdu_enable = _FALSE; - - phtpriv_sta->sgi = _FALSE; - phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; - phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - } - - //Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - phtpriv_sta->agg_enable_bitmap = 0x0;//reset - phtpriv_sta->candidate_tid_bitmap = 0x0;//reset - - - //todo: init other variables - - _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); - - - //add ratid - add_RATid(padapter, psta); - - - _enter_critical_bh(&psta->lock, &irqL); - psta->state |= _FW_LINKED; - _exit_critical_bh(&psta->lock, &irqL); - - -} - -void start_bss_network(_adapter *padapter, u8 *pbuf) -{ - u8 *p; - u8 val8, cur_channel, cur_bwmode, cur_ch_offset; - u16 bcn_interval; - u32 acparm; - int ie_len; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct security_priv* psecuritypriv=&(padapter->securitypriv); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &(padapter->wdinfo); -#endif //CONFIG_P2P - - - //DBG_8192C("%s\n", __FUNCTION__); - - bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; - cur_channel = pnetwork->Configuration.DSConfig; - cur_bwmode = HT_CHANNEL_WIDTH_20;; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - - //check if there is wps ie, - //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, - //and at first time the security ie ( RSN/WPA IE) will not include in beacon. - if(NULL == rtw_get_wps_ie(pnetwork->IEs, pnetwork->IELength, NULL, &ie_len)) - { - pmlmeext->bstart_bss = _TRUE; - } - - //todo: update wmm, ht cap - //pmlmeinfo->WMM_enable; - //pmlmeinfo->HT_enable; - if(pmlmepriv->qospriv.qos_option) - pmlmeinfo->WMM_enable = _TRUE; - - if(pmlmepriv->htpriv.ht_option) - { - pmlmeinfo->WMM_enable = _TRUE; - pmlmeinfo->HT_enable = _TRUE; - } - - - if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time - { - flush_all_cam_entry(padapter); //clear CAM - } - - //set MSR to AP_Mode - Set_NETYPE0_MSR(padapter, _HW_STATE_AP_); - - //Set BSSID REG - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pnetwork->MacAddress); - - //Set EDCA param reg - acparm = 0x002F3217; // VO - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); - acparm = 0x005E4317; // VI - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); - //acparm = 0x00105320; // BE - acparm = 0x005ea42b; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); - acparm = 0x0000A444; // BK - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); - - //Set Security - val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); - - //Beacon Control related register - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); - - if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time - { - u32 initialgain; - - //disable dynamic functions, such as high power, DIG - //Save_DM_Func_Flag(padapter); - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - //turn on dynamic functions - Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); - - initialgain = 0x30; - //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); - - } - - //set channel, bwmode - p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); - if( p && ie_len) - { - struct HT_info_element *pht_info = (struct HT_info_element *)(p+2); - - if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) - { - //switch to the 40M Hz mode - //pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; - cur_bwmode = HT_CHANNEL_WIDTH_40; - switch (pht_info->infos[0] & 0x3) - { - case 1: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case 3: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; - } - - } - - } - - //TODO: need to judge the phy parameters on concurrent mode for single phy - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); - - DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); - - // - pmlmeext->cur_channel = cur_channel; - pmlmeext->cur_bwmode = cur_bwmode; - pmlmeext->cur_ch_offset = cur_ch_offset; - pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; - - //let pnetwork_mlmeext == pnetwork_mlme. - _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); - -#ifdef CONFIG_P2P - _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); - pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; -#endif //CONFIG_P2P - - - if(_TRUE == pmlmeext->bstart_bss) - { - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - - //issue beacon frame - if(send_beacon(padapter)==_FAIL) - { - DBG_871X("issue_beacon, fail!\n"); - } - } - - - //update bc/mc sta_info - update_bmc_sta(padapter); - - //pmlmeext->bstart_bss = _TRUE; - -} - -#ifdef CONFIG_NATIVEAP_MLME - -static void update_bcn_fixed_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_erpinfo_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_htcap_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_htinfo_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_rsn_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wpa_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wmm_ie(_adapter *padapter) -{ - DBG_871X("%s\n", __FUNCTION__); - -} - -static void update_bcn_wps_ie(_adapter *padapter) -{ - int match; - u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; - uint wps_ielen=0, wps_offset, remainder_ielen; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); - unsigned char *ie = pnetwork->IEs; - u32 ielen = pnetwork->IELength; - - - DBG_871X("%s\n", __FUNCTION__); - - pwps_ie = rtw_get_wps_ie(ie, ielen, NULL, &wps_ielen); - - if(pwps_ie==NULL || wps_ielen==0) - return; - - wps_offset = (uint)(pwps_ie-ie); - - premainder_ie = pwps_ie + wps_ielen; - - remainder_ielen = ielen - wps_offset - wps_ielen; - - if(remainder_ielen>0) - { - pbackup_remainder_ie = rtw_malloc(remainder_ielen); - if(pbackup_remainder_ie) - _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); - } - - - pwps_ie_src = pmlmepriv->wps_beacon_ie; - if(pwps_ie_src == NULL) - return; - - - wps_ielen = (uint)pwps_ie_src[1];//to get ie data len - if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) - { - _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); - pwps_ie += (wps_ielen+2); - - if(pbackup_remainder_ie) - _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); - - //update IELength - pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; - } - - if(pbackup_remainder_ie) - rtw_mfree(pbackup_remainder_ie, remainder_ielen); - -} - -static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) -{ - DBG_871X("%s\n", __FUNCTION__); - - if(_rtw_memcmp(WPA_OUI, oui, 4)) - { - update_bcn_wpa_ie(padapter); - } - else if(_rtw_memcmp(WMM_OUI, oui, 4)) - { - update_bcn_wmm_ie(padapter); - } - else if(_rtw_memcmp(WPS_OUI, oui, 4)) - { - update_bcn_wps_ie(padapter); - } - else - { - DBG_871X("unknown OUI type!\n"); - } - - -} - -void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //DBG_871X("%s\n", __FUNCTION__); - - if(_FALSE == pmlmeext->bstart_bss) - return; - - _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - - switch(ie_id) - { - case 0xFF: - - update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability - - break; - - case _TIM_IE_: - - update_BCNTIM(padapter); - - break; - - case _ERPINFO_IE_: - - update_bcn_erpinfo_ie(padapter); - - break; - - case _HT_CAPABILITY_IE_: - - update_bcn_htcap_ie(padapter); - - break; - - case _RSN_IE_2_: - - update_bcn_rsn_ie(padapter); - - break; - - case _HT_ADD_INFO_IE_: - - update_bcn_htinfo_ie(padapter); - - break; - - case _VENDOR_SPECIFIC_IE_: - - update_bcn_vendor_spec_ie(padapter, oui); - - break; - - default: - break; - } - - pmlmepriv->update_bcn = _TRUE; - - _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); - -#ifdef CONFIG_USB_HCI - if(tx) - { - //send_beacon(padapter);//send_beacon must execute on TSR level - set_tx_beacon_cmd(padapter); - } -#else - { - //PCI will issue beacon when BCN interrupt occurs. - } -#endif - -} - -#ifdef CONFIG_80211N_HT - -/* -op_mode -Set to 0 (HT pure) under the followign conditions - - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or - - all STAs in the BSS are 20 MHz HT in 20 MHz BSS -Set to 1 (HT non-member protection) if there may be non-HT STAs - in both the primary and the secondary channel -Set to 2 if only HT STAs are associated in BSS, - however and at least one 20 MHz HT STA is associated -Set to 3 (HT mixed mode) when one or more non-HT STAs are associated - (currently non-GF HT station is considered as non-HT STA also) -*/ -static int rtw_ht_operation_update(_adapter *padapter) -{ - u16 cur_op_mode, new_op_mode; - int op_mode_changes = 0; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; - - if(pmlmepriv->htpriv.ht_option == _TRUE) - return 0; - - //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) - // return 0; - - DBG_871X("%s current operation mode=0x%X\n", - __FUNCTION__, pmlmepriv->ht_op_mode); - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) - && pmlmepriv->num_sta_ht_no_gf) { - pmlmepriv->ht_op_mode |= - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && - pmlmepriv->num_sta_ht_no_gf == 0) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; - op_mode_changes++; - } - - if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } else if ((pmlmepriv->ht_op_mode & - HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && - (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { - pmlmepriv->ht_op_mode &= - ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; - op_mode_changes++; - } - - /* Note: currently we switch to the MIXED op mode if HT non-greenfield - * station is associated. Probably it's a theoretical case, since - * it looks like all known HT STAs support greenfield. - */ - new_op_mode = 0; - if (pmlmepriv->num_sta_no_ht || - (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) - new_op_mode = OP_MODE_MIXED; - else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) - && pmlmepriv->num_sta_ht_20mhz) - new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; - else if (pmlmepriv->olbc_ht) - new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; - else - new_op_mode = OP_MODE_PURE; - - cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; - if (cur_op_mode != new_op_mode) { - pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; - pmlmepriv->ht_op_mode |= new_op_mode; - op_mode_changes++; - } - - DBG_871X("%s new operation mode=0x%X changes=%d\n", - __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); - - return op_mode_changes; - -} - -#endif /* CONFIG_80211N_HT */ - - -void bss_cap_update(_adapter *padapter, struct sta_info *psta) -{ - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - -#if 0 - if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { - psta->nonerp_set = 1; - pmlmepriv->num_sta_non_erp++; - if (pmlmepriv->num_sta_non_erp == 1) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(psta->flags & WLAN_STA_NONERP) - { - if(!psta->nonerp_set) - { - psta->nonerp_set = 1; - - pmlmepriv->num_sta_non_erp++; - - if (pmlmepriv->num_sta_non_erp == 1) - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - - } - else - { - if(psta->nonerp_set) - { - psta->nonerp_set = 0; - - pmlmepriv->num_sta_non_erp--; - - if (pmlmepriv->num_sta_non_erp == 0) - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - - } - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && - !psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 1; - pmlmepriv->num_sta_no_short_slot_time++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) - { - if(!psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 1; - - pmlmepriv->num_sta_no_short_slot_time++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) - update_beacon(padapter, 0xFF, NULL, _TRUE); - - } - } - else - { - if(psta->no_short_slot_time_set) - { - psta->no_short_slot_time_set = 0; - - pmlmepriv->num_sta_no_short_slot_time--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 0)) - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - } - - -#if 0 - if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && - !psta->no_short_preamble_set) { - psta->no_short_preamble_set = 1; - pmlmepriv->num_sta_no_short_preamble++; - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - ieee802_11_set_beacons(hapd->iface); - } -#endif - - - if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) - { - if(!psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 1; - - pmlmepriv->num_sta_no_short_preamble++; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 1)) - update_beacon(padapter, 0xFF, NULL, _TRUE); - - } - } - else - { - if(psta->no_short_preamble_set) - { - psta->no_short_preamble_set = 0; - - pmlmepriv->num_sta_no_short_preamble--; - - if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 0)) - update_beacon(padapter, 0xFF, NULL, _TRUE); - - } - } - - -#ifdef CONFIG_80211N_HT - - if (psta->flags & WLAN_STA_HT) - { - u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); - - DBG_871X("HT: STA " MAC_FMT " HT Capabilities " - "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { - if (!psta->no_ht_gf_set) { - psta->no_ht_gf_set = 1; - pmlmepriv->num_sta_ht_no_gf++; - } - DBG_871X("%s STA " MAC_FMT " - no " - "greenfield, num of non-gf stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_no_gf); - } - - if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { - if (!psta->ht_20mhz_set) { - psta->ht_20mhz_set = 1; - pmlmepriv->num_sta_ht_20mhz++; - } - DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " - "num of 20MHz HT STAs %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_ht_20mhz); - } - - } - else - { - if (!psta->no_ht_set) { - psta->no_ht_set = 1; - pmlmepriv->num_sta_no_ht++; - } - if(pmlmepriv->htpriv.ht_option == _TRUE) { - DBG_871X("%s STA " MAC_FMT - " - no HT, num of non-HT stations %d\n", - __FUNCTION__, MAC_ARG(psta->hwaddr), - pmlmepriv->num_sta_no_ht); - } - } - - if (rtw_ht_operation_update(padapter) > 0) - { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - } - -#endif /* CONFIG_80211N_HT */ - -} - -void ap_free_sta(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct sta_priv *pstapriv = &padapter->stapriv; - - if(!psta) - return; - - - if (psta->nonerp_set) { - psta->nonerp_set = 0; - pmlmepriv->num_sta_non_erp--; - if (pmlmepriv->num_sta_non_erp == 0) - update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); - } - - if (psta->no_short_slot_time_set) { - psta->no_short_slot_time_set = 0; - pmlmepriv->num_sta_no_short_slot_time--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_slot_time == 0) - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - - if (psta->no_short_preamble_set) { - psta->no_short_preamble_set = 0; - pmlmepriv->num_sta_no_short_preamble--; - if (pmlmeext->cur_wireless_mode > WIRELESS_11B - && pmlmepriv->num_sta_no_short_preamble == 0) - update_beacon(padapter, 0xFF, NULL, _TRUE); - } - -#ifdef CONFIG_80211N_HT - - if (psta->no_ht_gf_set) { - psta->no_ht_gf_set = 0; - pmlmepriv->num_sta_ht_no_gf--; - } - - if (psta->no_ht_set) { - psta->no_ht_set = 0; - pmlmepriv->num_sta_no_ht--; - } - - if (psta->ht_20mhz_set) { - psta->ht_20mhz_set = 0; - pmlmepriv->num_sta_ht_20mhz--; - } - - if (rtw_ht_operation_update(padapter) > 0) - { - update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); - update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); - } - -#endif /* CONFIG_80211N_HT */ - - - //tear down Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - - - issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); - - //report_del_sta_event(padapter, psta->hwaddr); - - //clear key - //clear_cam_entry(padapter, (psta->mac_id + 3)); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - -} - -int rtw_sta_flush(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - int ret=0; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - - //DBG_871X("%s\n", __FUNCTION__); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //free sta asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - rtw_list_delete(&psta->asoc_list); - - ap_free_sta(padapter, psta); - - } - - - issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); - - return ret; - -} - -void sta_info_update(_adapter *padapter, struct sta_info *psta) -{ - int flags = psta->flags; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - - //update wmm cap. - if(WLAN_STA_WME&flags) - psta->qos_option = 1; - else - psta->qos_option = 0; - - if(pmlmepriv->qospriv.qos_option == 0) - psta->qos_option = 0; - - -#ifdef CONFIG_80211N_HT - //update 802.11n ht cap. - if(WLAN_STA_HT&flags) - { - psta->htpriv.ht_option = _TRUE; - psta->qos_option = 1; - } - else - { - psta->htpriv.ht_option = _FALSE; - } - - if(pmlmepriv->htpriv.ht_option == _FALSE) - psta->htpriv.ht_option = _FALSE; -#endif - - - update_sta_info_apmode(padapter, psta); - - -} - -void start_ap_mode(_adapter *padapter) -{ - int i; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - pmlmepriv->update_bcn = _FALSE; - - //init_mlme_ap_info(padapter); - pmlmeext->bstart_bss = _FALSE; - - pmlmepriv->num_sta_non_erp = 0; - - pmlmepriv->num_sta_no_short_slot_time = 0; - - pmlmepriv->num_sta_no_short_preamble = 0; - - pmlmepriv->num_sta_ht_no_gf = 0; - - pmlmepriv->num_sta_no_ht = 0; - - pmlmepriv->num_sta_ht_20mhz = 0; - - pmlmepriv->olbc = _FALSE; - - pmlmepriv->olbc_ht = _FALSE; - -#ifdef CONFIG_80211N_HT - pmlmepriv->ht_op_mode = 0; -#endif - - for(i=0; ista_aid[i] = NULL; - - pmlmepriv->wps_beacon_ie = NULL; - pmlmepriv->wps_probe_resp_ie = NULL; - pmlmepriv->wps_assoc_resp_ie = NULL; - - -} - -void stop_ap_mode(_adapter *padapter) -{ - _irqL irqL; - _list *phead, *plist; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - pmlmepriv->update_bcn = _FALSE; - pmlmeext->bstart_bss = _FALSE; - //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - rtw_sta_flush(padapter); - -#if 0 - //free sta asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - rtw_list_delete(&psta->asoc_list); - - //tear down Rx AMPDU - send_delba(padapter, 0, psta->hwaddr);// recipient - - //tear down TX AMPDU - send_delba(padapter, 1, psta->hwaddr);// // originator - psta->htpriv.agg_enable_bitmap = 0x0;//reset - psta->htpriv.candidate_tid_bitmap = 0x0;//reset - - issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - } -#endif - - //free_assoc_sta_resources - rtw_free_all_stainfo(padapter); - - psta = rtw_get_bcmc_stainfo(padapter); - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(padapter, psta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - - rtw_init_bcmc_stainfo(padapter); - - - if(pmlmepriv->wps_beacon_ie) - { - rtw_mfree(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len); - pmlmepriv->wps_beacon_ie = NULL; - } - - if(pmlmepriv->wps_probe_resp_ie) - { - rtw_mfree(pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len); - pmlmepriv->wps_probe_resp_ie = NULL; - } - - if(pmlmepriv->wps_assoc_resp_ie) - { - rtw_mfree(pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); - pmlmepriv->wps_assoc_resp_ie = NULL; - } - -} - - -#endif - -#endif - -u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf) -{ - struct SetChannelPlan_param *setChannelPlan_param; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - //struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(!pbuf) - return H2C_PARAMETERS_ERROR; - - setChannelPlan_param = (struct SetChannelPlan_param *)pbuf; - - //Jeff: We use mlmepriv->ChannelPlan to indicate channel plan, - //the setChannelPlan_param is useless now... - - pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set); - - return H2C_SUCCESS; -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mp.c b/drivers/net/wireless/rtl8192c/core/rtw_mp.c deleted file mode 100755 index 1fff3dd27f84..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_mp.c +++ /dev/null @@ -1,2254 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_MP_C_ - -#include - -#ifdef CONFIG_RTL8712 -#include -#endif -#ifdef CONFIG_RTL8192C -#include -#endif -#ifdef CONFIG_RTL8192D -#include -#endif - -#ifdef CONFIG_MP_INCLUDED - -u32 read_macreg(_adapter *padapter, u32 addr, u32 sz) -{ - u32 val = 0; - - switch(sz) - { - case 1: - val = rtw_read8(padapter, addr); - break; - case 2: - val = rtw_read16(padapter, addr); - break; - case 4: - val = rtw_read32(padapter, addr); - break; - default: - val = 0xffffffff; - break; - } - - return val; - -} - -void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz) -{ - switch(sz) - { - case 1: - rtw_write8(padapter, addr, (u8)val); - break; - case 2: - rtw_write16(padapter, addr, (u16)val); - break; - case 4: - rtw_write32(padapter, addr, val); - break; - default: - break; - } - -} - -u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask) -{ - return padapter->HalFunc.read_bbreg(padapter, addr, bitmask); -} - -void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val) -{ - padapter->HalFunc.write_bbreg(padapter, addr, bitmask, val); -} - -static u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask) -{ - return padapter->HalFunc.read_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bitmask); -} - -static void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val) -{ - padapter->HalFunc.write_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bitmask, val); -} - -u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr) -{ - return _read_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask); -} - -void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val) -{ - _write_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask, val); -} - -static void _init_mp_priv_(struct mp_priv *pmp_priv) -{ - WLAN_BSSID_EX *pnetwork; - - _rtw_memset(pmp_priv, 0, sizeof(struct mp_priv)); - - pmp_priv->mode = MP_OFF; - - pmp_priv->channel = 1; - pmp_priv->bandwidth = HT_CHANNEL_WIDTH_20; - pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - pmp_priv->rateidx = MPT_RATE_1M; - pmp_priv->txpoweridx = 0x2A; - - pmp_priv->antenna_tx = ANTENNA_A; - pmp_priv->antenna_rx = ANTENNA_AB; - - pmp_priv->check_mp_pkt = 0; - - pmp_priv->tx_pktcount = 0; - - pmp_priv->rx_pktcount = 0; - pmp_priv->rx_crcerrpktcount = 0; - - pmp_priv->network_macaddr[0] = 0x00; - pmp_priv->network_macaddr[1] = 0xE0; - pmp_priv->network_macaddr[2] = 0x4C; - pmp_priv->network_macaddr[3] = 0x87; - pmp_priv->network_macaddr[4] = 0x66; - pmp_priv->network_macaddr[5] = 0x55; - - pnetwork = &pmp_priv->mp_network.network; - _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN); - - pnetwork->Ssid.SsidLength = 8; - _rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength); -} - -#ifdef PLATFORM_WINDOWS -/* -void mp_wi_callback( - IN NDIS_WORK_ITEM* pwk_item, - IN PVOID cntx - ) -{ - _adapter* padapter =(_adapter *)cntx; - struct mp_priv *pmppriv=&padapter->mppriv; - struct mp_wi_cntx *pmp_wi_cntx=&pmppriv->wi_cntx; - - // Execute specified action. - if(pmp_wi_cntx->curractfunc != NULL) - { - LARGE_INTEGER cur_time; - ULONGLONG start_time, end_time; - NdisGetCurrentSystemTime(&cur_time); // driver version - start_time = cur_time.QuadPart/10; // The return value is in microsecond - - pmp_wi_cntx->curractfunc(padapter); - - NdisGetCurrentSystemTime(&cur_time); // driver version - end_time = cur_time.QuadPart/10; // The return value is in microsecond - - RT_TRACE(_module_mp_, _drv_info_, - ("WorkItemActType: %d, time spent: %I64d us\n", - pmp_wi_cntx->param.act_type, (end_time-start_time))); - } - - NdisAcquireSpinLock(&(pmp_wi_cntx->mp_wi_lock)); - pmp_wi_cntx->bmp_wi_progress= _FALSE; - NdisReleaseSpinLock(&(pmp_wi_cntx->mp_wi_lock)); - - if (pmp_wi_cntx->bmpdrv_unload) - { - NdisSetEvent(&(pmp_wi_cntx->mp_wi_evt)); - } - -} -*/ - -static int init_mp_priv_by_os(struct mp_priv *pmp_priv) -{ - struct mp_wi_cntx *pmp_wi_cntx; - - if (pmp_priv == NULL) return _FAIL; - - pmp_priv->rx_testcnt = 0; - pmp_priv->rx_testcnt1 = 0; - pmp_priv->rx_testcnt2 = 0; - - pmp_priv->tx_testcnt = 0; - pmp_priv->tx_testcnt1 = 0; - - pmp_wi_cntx = &pmp_priv->wi_cntx - pmp_wi_cntx->bmpdrv_unload = _FALSE; - pmp_wi_cntx->bmp_wi_progress = _FALSE; - pmp_wi_cntx->curractfunc = NULL; - - return _SUCCESS; -} -#endif - -#ifdef PLATFORM_LINUX -static int init_mp_priv_by_os(struct mp_priv *pmp_priv) -{ - int i, res; - struct mp_xmit_frame *pmp_xmitframe; - - if (pmp_priv == NULL) return _FAIL; - - _rtw_init_queue(&pmp_priv->free_mp_xmitqueue); - - pmp_priv->pallocated_mp_xmitframe_buf = NULL; - pmp_priv->pallocated_mp_xmitframe_buf = rtw_zmalloc(NR_MP_XMITFRAME * sizeof(struct mp_xmit_frame) + 4); - if (pmp_priv->pallocated_mp_xmitframe_buf == NULL) { - res = _FAIL; - goto _exit_init_mp_priv; - } - - pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((uint) (pmp_priv->pallocated_mp_xmitframe_buf) & 3); - - pmp_xmitframe = (struct mp_xmit_frame*)pmp_priv->pmp_xmtframe_buf; - - for (i = 0; i < NR_MP_XMITFRAME; i++) - { - _rtw_init_listhead(&pmp_xmitframe->list); - rtw_list_insert_tail(&pmp_xmitframe->list, &pmp_priv->free_mp_xmitqueue.queue); - - pmp_xmitframe->pkt = NULL; - pmp_xmitframe->frame_tag = MP_FRAMETAG; - pmp_xmitframe->padapter = pmp_priv->papdater; - - pmp_xmitframe++; - } - - pmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME; - - res = _SUCCESS; - -_exit_init_mp_priv: - - return res; -} -#endif - -static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter) -{ - struct pkt_attrib *pattrib; - struct tx_desc *desc; - - // init xmitframe attribute - pattrib = &pmptx->attrib; - _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib)); - desc = &pmptx->desc; - _rtw_memset(desc, 0, TXDESC_SIZE); - - pattrib->ether_type = 0x8712; - //_rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); -// _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN); -// pattrib->pctrl = 0; -// pattrib->dhcp_pkt = 0; -// pattrib->pktlen = 0; - pattrib->ack_policy = 0; -// pattrib->pkt_hdrlen = ETH_HLEN; - pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA; - pattrib->priority = 0; - pattrib->qsel = pattrib->priority; -// do_queue_select(padapter, pattrib); - pattrib->nr_frags = 1; - pattrib->encrypt = 0; - pattrib->bswenc = _FALSE; - pattrib->qos_en = _FALSE; -} - -s32 init_mp_priv(PADAPTER padapter) -{ - struct mp_priv *pmppriv = &padapter->mppriv; - - _init_mp_priv_(pmppriv); - pmppriv->papdater = padapter; - - pmppriv->tx.stop = 1; - mp_init_xmit_attrib(&pmppriv->tx, padapter); - - switch (padapter->registrypriv.rf_config) { - case RF_1T1R: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_A; - break; - case RF_1T2R: - default: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T2R: - case RF_2T2R_GREEN: - pmppriv->antenna_tx = ANTENNA_AB; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T4R: - pmppriv->antenna_tx = ANTENNA_AB; - pmppriv->antenna_rx = ANTENNA_ABCD; - break; - } - - return _SUCCESS; -} - -void free_mp_priv(struct mp_priv *pmp_priv) -{ - if (pmp_priv->pallocated_mp_xmitframe_buf) { - rtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0); - pmp_priv->pallocated_mp_xmitframe_buf = NULL; - } - pmp_priv->pmp_xmtframe_buf = NULL; -} - -#ifdef CONFIG_RTL8192C -#define PHY_IQCalibrate(a,b) rtl8192c_PHY_IQCalibrate(a,b) -#define PHY_LCCalibrate(a) rtl8192c_PHY_LCCalibrate(a) -#define dm_CheckTXPowerTracking(a) rtl8192c_dm_CheckTXPowerTracking(a) -#define PHY_SetRFPathSwitch(a,b) rtl8192c_PHY_SetRFPathSwitch(a,b) -#endif - -#ifdef CONFIG_RTL8192D -#define PHY_IQCalibrate(a) rtl8192d_PHY_IQCalibrate(a) -#define PHY_LCCalibrate(a) rtl8192d_PHY_LCCalibrate(a) -#define dm_CheckTXPowerTracking(a) rtl8192d_dm_CheckTXPowerTracking(a) -#define PHY_SetRFPathSwitch(a,b) rtl8192d_PHY_SetRFPathSwitch(a,b) -#endif - -s32 -MPT_InitializeAdapter( - IN PADAPTER pAdapter, - IN u8 Channel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - s32 rtStatus = _SUCCESS; - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - u32 tmpRegA, tmpRegC, TempCCk,ledsetting; - - //------------------------------------------------------------------------- - // HW Initialization for 8190 MPT. - //------------------------------------------------------------------------- - //------------------------------------------------------------------------- - // SW Initialization for 8190 MP. - //------------------------------------------------------------------------- - pMptCtx->bMptDrvUnload = _FALSE; - pMptCtx->bMassProdTest = _FALSE; - pMptCtx->bMptIndexEven = _TRUE; //default gain index is -6.0db - - /* Init mpt event. */ -#if 0 // for Windows - NdisInitializeEvent( &(pMptCtx->MptWorkItemEvent) ); - NdisAllocateSpinLock( &(pMptCtx->MptWorkItemSpinLock) ); - - PlatformInitializeWorkItem( - Adapter, - &(pMptCtx->MptWorkItem), - (RT_WORKITEM_CALL_BACK)MPT_WorkItemCallback, - (PVOID)Adapter, - "MptWorkItem"); -#endif - pMptCtx->bMptWorkItemInProgress = _FALSE; - pMptCtx->CurrMptAct = NULL; - //------------------------------------------------------------------------- - -#if 1 - // Don't accept any packets - rtw_write32(pAdapter, REG_RCR, 0); -#else - // Accept CRC error and destination address - pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); - rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); -#endif - -#if 0 - // If EEPROM or EFUSE is empty,we assign as RF 2T2R for MP. - if (pHalData->AutoloadFailFlag == TRUE) - { - pHalData->RF_Type = RF_2T2R; - } -#endif - ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); - rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); - -#ifdef CONFIG_RTL8192C - PHY_IQCalibrate(pAdapter, _FALSE); - dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter - PHY_LCCalibrate(pAdapter); -#endif - -#ifdef CONFIG_RTL8192D - PHY_IQCalibrate(pAdapter); - dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter - PHY_LCCalibrate(pAdapter); -#endif - -#ifdef CONFIG_PCI_HCI - PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //Wifi default use Main -#else - -#ifdef CONFIG_RTL8192C -#if 1 - if (pHalData->BoardType == BOARD_MINICARD) - PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main -#else - if(pAdapter->HalFunc.GetInterfaceSelectionHandler(pAdapter) == INTF_SEL2_MINICARD ) - PHY_SetRFPathSwitch(Adapter, pAdapter->MgntInfo.bDefaultAntenna); //default use Main -#endif - -#endif - -#endif - - pMptCtx->backup0xc50 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0); - pMptCtx->backup0xc58 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0); - pMptCtx->backup0xc30 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_RxDetector1, bMaskByte0); - - return rtStatus; -} - -/*----------------------------------------------------------------------------- - * Function: MPT_DeInitAdapter() - * - * Overview: Extra DeInitialization for Mass Production Test. - * - * Input: PADAPTER pAdapter - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 05/08/2007 MHC Create Version 0. - * 05/18/2007 MHC Add normal driver MPHalt code. - * - *---------------------------------------------------------------------------*/ -VOID -MPT_DeInitAdapter( - IN PADAPTER pAdapter - ) -{ - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - - pMptCtx->bMptDrvUnload = _TRUE; -#if 0 // for Windows - PlatformFreeWorkItem( &(pMptCtx->MptWorkItem) ); - - while(pMptCtx->bMptWorkItemInProgress) - { - if(NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50)) - { - break; - } - } - NdisFreeSpinLock( &(pMptCtx->MptWorkItemSpinLock) ); -#endif -} - -static u8 mpt_ProStartTest(PADAPTER padapter) -{ - PMPT_CONTEXT pMptCtx = &padapter->mppriv.MptCtx; - - pMptCtx->bMassProdTest = _TRUE; - pMptCtx->bStartContTx = _FALSE; - pMptCtx->bCckContTx = _FALSE; - pMptCtx->bOfdmContTx = _FALSE; - pMptCtx->bSingleCarrier = _FALSE; - pMptCtx->bCarrierSuppression = _FALSE; - pMptCtx->bSingleTone = _FALSE; - - return _SUCCESS; -} - -/* - * General use - */ -s32 SetPowerTracking(PADAPTER padapter, u8 enable) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - - if (!netif_running(padapter->pnetdev)) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: interface not opened!\n")); - return _FAIL; - } - - if (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n")); - return _FAIL; - } - - if (enable) - pdmpriv->TxPowerTrackControl = _TRUE; - else - pdmpriv->TxPowerTrackControl = _FALSE; - - return _SUCCESS; -} - -void GetPowerTracking(PADAPTER padapter, u8 *enable) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - - *enable = pdmpriv->TxPowerTrackControl; -} - -static void disable_dm(PADAPTER padapter) -{ - u8 v8; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - - //3 1. disable firmware dynamic mechanism - // disable Power Training, Rate Adaptive - v8 = rtw_read8(padapter, REG_BCN_CTRL); - v8 &= ~EN_BCN_FUNCTION; - rtw_write8(padapter, REG_BCN_CTRL, v8); - - //3 2. disable driver dynamic mechanism - // disable Dynamic Initial Gain - // disable High Power - // disable Power Tracking - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); - - // enable APK, LCK and IQK but disable power tracking - pdmpriv->TxPowerTrackControl = _FALSE; - Switch_DM_Func(padapter, DYNAMIC_FUNC_SS, _TRUE); -} - -//This function initializes the DUT to the MP test mode -s32 mp_start_test(PADAPTER padapter) -{ - WLAN_BSSID_EX bssid; - struct sta_info *psta; - u32 length; - u8 val8; - - _irqL irqL; - s32 res = _SUCCESS; - - struct mp_priv *pmppriv = &padapter->mppriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *tgt_network = &pmlmepriv->cur_network; - - - //3 disable dynamic mechanism - disable_dm(padapter); - - //3 0. update mp_priv -#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D) - if (padapter->registrypriv.rf_config == RF_819X_MAX_TYPE) { -// HAL_DATA_TYPE *phal = GET_HAL_DATA(padapter); -// switch (phal->rf_type) { - switch (GET_RF_TYPE(padapter)) { - case RF_1T1R: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_A; - break; - case RF_1T2R: - default: - pmppriv->antenna_tx = ANTENNA_A; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T2R: - case RF_2T2R_GREEN: - pmppriv->antenna_tx = ANTENNA_AB; - pmppriv->antenna_rx = ANTENNA_AB; - break; - case RF_2T4R: - pmppriv->antenna_tx = ANTENNA_AB; - pmppriv->antenna_rx = ANTENNA_ABCD; - break; - } - } -#endif - mpt_ProStartTest(padapter); - - //3 1. initialize a new WLAN_BSSID_EX -// _rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX)); - _rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN); - bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc"); - _rtw_memcpy(bssid.Ssid.Ssid, (u8*)"mp_pseudo_adhoc", bssid.Ssid.SsidLength); - bssid.InfrastructureMode = Ndis802_11IBSS; - bssid.NetworkTypeInUse = Ndis802_11DS; - bssid.IELength = 0; - - length = get_WLAN_BSSID_EX_sz(&bssid); - if (length % 4) - bssid.Length = ((length >> 2) + 1) << 2; //round up to multiple of 4 bytes. - else - bssid.Length = length; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - goto end_of_mp_start_test; - - //init mp_start_test status - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { - rtw_disassoc_cmd(padapter); - rtw_indicate_disconnect(padapter); - rtw_free_assoc_resources(padapter); - } - pmppriv->prev_fw_state = get_fwstate(pmlmepriv); - pmlmepriv->fw_state = WIFI_MP_STATE; -#if 0 - if (pmppriv->mode == _LOOPBOOK_MODE_) { - set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc - RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in Lookback mode\n")); - } else { - RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in normal mode\n")); - } -#endif - set_fwstate(pmlmepriv, _FW_UNDER_LINKING); - - //3 2. create a new psta for mp driver - //clear psta in the cur_network, if any - psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); - if (psta) rtw_free_stainfo(padapter, psta); - - psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress); - if (psta == NULL) { - RT_TRACE(_module_mp_, _drv_err_, ("mp_start_test: Can't alloc sta_info!\n")); - pmlmepriv->fw_state = pmppriv->prev_fw_state; - res = _FAIL; - goto end_of_mp_start_test; - } - - //3 3. join psudo AdHoc - tgt_network->join_res = 1; - tgt_network->aid = psta->aid = 1; - _rtw_memcpy(&tgt_network->network, &bssid, length); - - rtw_indicate_connect(padapter); - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - -end_of_mp_start_test: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - if (res == _SUCCESS) - { - // set MSR to WIFI_FW_ADHOC_STATE -#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D) - val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102 - val8 |= WIFI_FW_ADHOC_STATE; - rtw_write8(padapter, MSR, val8); // Link in ad hoc network -#endif - -#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D) - rtw_write8(padapter, MSR, 1); // Link in ad hoc network - rtw_write8(padapter, RCR, 0); // RCR : disable all pkt, 0x10250048 - rtw_write8(padapter, RCR+2, 0x57); // RCR disable Check BSSID, 0x1025004a - - // disable RX filter map , mgt frames will put in RX FIFO 0 - rtw_write16(padapter, RXFLTMAP0, 0x0); // 0x10250116 - - val8 = rtw_read8(padapter, EE_9346CR); // 0x1025000A - if (!(val8 & _9356SEL))//boot from EFUSE - efuse_change_max_size(padapter); -#endif - } - - return res; -} -//------------------------------------------------------------------------------ -//This function change the DUT from the MP test mode into normal mode -void mp_stop_test(PADAPTER padapter) -{ - struct mp_priv *pmppriv = &padapter->mppriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *tgt_network = &pmlmepriv->cur_network; - struct sta_info *psta; - - _irqL irqL; - - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE) - goto end_of_mp_stop_test; - - //3 1. disconnect psudo AdHoc - rtw_indicate_disconnect(padapter); - - //3 2. clear psta used in mp test mode. -// rtw_free_assoc_resources(padapter); - psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); - if (psta) rtw_free_stainfo(padapter, psta); - - //3 3. return to normal state (default:station mode) - pmlmepriv->fw_state = pmppriv->prev_fw_state; // WIFI_STATION_STATE; - - //flush the cur_network - _rtw_memset(tgt_network, 0, sizeof(struct wlan_network)); - - _clr_fwstate_(pmlmepriv, WIFI_MP_STATE); - -end_of_mp_stop_test: - - _exit_critical_bh(&pmlmepriv->lock, &irqL); -} -/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ -#if 0 -//#ifdef CONFIG_USB_HCI -static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID) -{ - u8 eRFPath; - u32 rfReg0x26; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - if (RateIdx < MPT_RATE_6M) { // CCK rate,for 88cu - rfReg0x26 = 0xf400; - } - else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {// OFDM rate,for 88cu - if ((4 == Channel) || (8 == Channel) || (12 == Channel)) - rfReg0x26 = 0xf000; - else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel)) - rfReg0x26 = 0xf400; - else - rfReg0x26 = 0x4f200; - } - else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {// MCS 20M ,for 88cu // MCS40M rate,for 88cu - - if (HT_CHANNEL_WIDTH_20 == BandWidthID) { - if ((4 == Channel) || (8 == Channel)) - rfReg0x26 = 0xf000; - else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel)) - rfReg0x26 = 0xf400; - else - rfReg0x26 = 0x4f200; - } - else{ - if ((4 == Channel) || (8 == Channel)) - rfReg0x26 = 0xf000; - else if ((5 == Channel) || (7 == Channel)) - rfReg0x26 = 0xf400; - else - rfReg0x26 = 0x4f200; - } - } - -// RT_TRACE(COMP_CMD, DBG_LOUD, ("\n mpt_AdjustRFRegByRateByChan92CU():Chan:%d Rate=%d rfReg0x26:0x%08x\n",Channel, RateIdx,rfReg0x26)); - for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) { - write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26); - } -} -#endif -/*----------------------------------------------------------------------------- - * Function: mpt_SwitchRfSetting - * - * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. - * - * Input: IN PADAPTER pAdapter - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. - * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. - * - *---------------------------------------------------------------------------*/ -static void mpt_SwitchRfSetting(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct mp_priv *pmp = &pAdapter->mppriv; - u8 ChannelToSw = pmp->channel; - u8 ulRateIdx = pmp->rateidx; - u8 ulbandwidth = pmp->bandwidth; - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); -#ifdef CONFIG_USB_HCI - - if (IS_92C_SERIAL(pHalData->VersionID)) - { - //92CE-VAU (92cu mCard) - if( BOARD_MINICARD == pHalData->BoardType) - { - if (ulRateIdx < MPT_RATE_6M) // CCK rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); - } - else //OFDM~MCS rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); - } - } - else //92CU dongle - { - if (ulRateIdx < MPT_RATE_6M) // CCK rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); - } - else if (ChannelToSw & BIT0) // OFDM rate, odd number channel - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); - } - else if (ChannelToSw == 4) // OFDM rate, even number channel - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200); - write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe0004); - write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709); - rtw_msleep_os(1); - write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333); - } - else if(ChannelToSw == 10) // OFDM rate, even number channel - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28000); - write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000A); - write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709); - rtw_msleep_os(1); - write_rfreg(pAdapter, 0, RF_SYN_G7, 0x7B333); - } - else if(ChannelToSw == 12) // OFDM rate, even number channel - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200); - write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000C); - write_rfreg(pAdapter, 0, RF_SYN_G7, 0x50B); - rtw_msleep_os(1); - write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333); - } - else - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); - } - } - } - else //88cu - { - - //mcard interface - - if( BOARD_MINICARD == pHalData->BoardType) - { - if (ulRateIdx < MPT_RATE_6M) // CCK rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); - } - else //OFDM~MCS rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); - } - - if(ChannelToSw == 6 || ChannelToSw == 8) - { - write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22); - write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22); - write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F); - } - else - { - write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x20); - write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x20); - write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30); - } - } - else - { - if (ulRateIdx < MPT_RATE_6M) // CCK rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); - } - else if (ChannelToSw & BIT0) // OFDM rate, odd number channel - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); - } - else - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); - } - } - } - -#else //PCI_INTERFACE - - if (ulRateIdx < MPT_RATE_6M) // CCK rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); - } - else //OFDM~MCS rate - { - write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); - } - //88CE - if(!IS_92C_SERIAL(pHalData->VersionID)) - { - if(ChannelToSw == 6 || ChannelToSw == 8) - { - write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22); - write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22); - write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F); - } - else - { - write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pMptCtx->backup0xc50); - write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pMptCtx->backup0xc58); - write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30); - } - } - -#endif -} -/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ - -/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ -static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) -{ - u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; - u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; - u8 i; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - // get current cck swing value and check 0xa22 & 0xa23 later to match the table. - CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); - - if (!bInCH14) - { - // Readback the current bb cck swing value and compare with the table to - // get the current swing index - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && - (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) - { - CCKSwingIndex = i; -// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", -// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); - break; - } - } - - //Write 0xa22 0xa23 - TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ; - - - //Write 0xa24 ~ 0xa27 - TempVal2 = 0; - TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+ - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24); - - //Write 0xa28 0xa29 - TempVal3 = 0; - TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + - (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ; - } - else - { - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) && - (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) - { - CCKSwingIndex = i; -// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", -// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); - break; - } - } - - //Write 0xa22 0xa23 - TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + - (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ; - - //Write 0xa24 ~ 0xa27 - TempVal2 = 0; - TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + - (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) + - (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+ - (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24); - - //Write 0xa28 0xa29 - TempVal3 = 0; - TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + - (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ; - } - - write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); - write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); - write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); -} - -static void MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) -{ - s32 TempCCk; - u8 CCK_index, CCK_index_old; - u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even - u8 TimeOut = 100; - s32 i = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - - - if (!IS_92C_SERIAL(pHalData->VersionID) || !IS_NORMAL_CHIP(pHalData->VersionID)) - return; -#if 0 - while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) - { - PlatformSleepUs(100); - TimeOut--; - if(TimeOut <= 0) - { - RTPRINT(FINIT, INIT_TxPower, - ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" )); - break; - } - } -#endif - if (beven && !pMptCtx->bMptIndexEven) //odd->even - { - Action = 2; - pMptCtx->bMptIndexEven = _TRUE; - } - else if (!beven && pMptCtx->bMptIndexEven) //even->odd - { - Action = 1; - pMptCtx->bMptIndexEven = _FALSE; - } - - if (Action != 0) - { - //Query CCK default setting From 0xa24 - TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; - for (i = 0; i < CCK_TABLE_SIZE; i++) - { - if (pHalData->dmpriv.bCCKinCH14) - { - if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE) - { - CCK_index_old = (u8) i; -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n", -// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - else - { - if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE) - { - CCK_index_old = (u8) i; -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n", -// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); - break; - } - } - } - - if (Action == 1) - CCK_index = CCK_index_old - 1; - else - CCK_index = CCK_index_old + 1; - -// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n", -// CCK_index)); - - //Adjust CCK according to gain index - if (!pHalData->dmpriv.bCCKinCH14) { - rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); - rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); - rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); - rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); - rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); - rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); - rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); - rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); - } else { - rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); - rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); - rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); - rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); - rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); - rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); - rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); - rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); - } - } -#if 0 - RTPRINT(FINIT, INIT_TxPower, - ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20))); - - PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); -#endif -} -/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ - -/* - * SetChannel - * Description - * Use H2C command to change channel, - * not only modify rf register, but also other setting need to be done. - */ -void SetChannel(PADAPTER pAdapter) -{ -#if 0 - struct mp_priv *pmp = &pAdapter->mppriv; - -// SelectChannel(pAdapter, pmp->channel); - set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth); -#else - u8 eRFPath; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct mp_priv *pmp = &pAdapter->mppriv; - u8 channel = pmp->channel; - u8 bandwidth = pmp->bandwidth; - u8 rate = pmp->rateidx; - - - // set RF channel register - for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) - _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel); - - mpt_SwitchRfSetting(pAdapter); - - SelectChannel(pAdapter, channel); - - if (pHalData->CurrentChannel == 14 && !pHalData->dmpriv.bCCKinCH14) { - pHalData->dmpriv.bCCKinCH14 = _TRUE; - MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); - } - else if (pHalData->CurrentChannel != 14 && pHalData->dmpriv.bCCKinCH14) { - pHalData->dmpriv.bCCKinCH14 = _FALSE; - MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); - } -#if 0 -//#ifdef CONFIG_USB_HCI - // Georgia add 2009-11-17, suggested by Edlu , for 8188CU ,46 PIN - if (!IS_92C_SERIAL(pHalData->VersionID) && !IS_NORMAL_CHIP(pHalData->VersionID)) { - mpt_AdjustRFRegByRateByChan92CU(pAdapter, rate, pHalData->CurrentChannel, bandwidth); - } -#endif - -#endif -} - -/* - * Notice - * Switch bandwitdth may change center frequency(channel) - */ -void SetBandwidth(PADAPTER pAdapter) -{ - struct mp_priv *pmp = &pAdapter->mppriv; - - - SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); - mpt_SwitchRfSetting(pAdapter); -} - -static void SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) -{ - u32 tmpval = 0; - - - // rf-A cck tx power - write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); - tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A]; - write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); - - // rf-B cck tx power - write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); - tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B]; - write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); - - RT_TRACE(_module_mp_, _drv_notice_, - ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n", - TxPower[RF_PATH_A], TxPower[RF_PATH_B])); -} - -static void SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) -{ - u32 TxAGC = 0; - u8 tmpval = 0; - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - // HT Tx-rf(A) - tmpval = TxPower[RF_PATH_A]; - TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; - - write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); - - if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) - { - if (tmpval > pMptCtx->APK_bound[RF_PATH_A]) - write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][0]); - else - write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][1]); - } - - // HT Tx-rf(B) - tmpval = TxPower[RF_PATH_B]; - TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; - - write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); - write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); - - if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) - { - if (tmpval > pMptCtx->APK_bound[RF_PATH_B]) - write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][0]); - else - write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][1]); - } - - RT_TRACE(_module_mp_, _drv_notice_, - ("-SetOFDMTxPower: A[0x%02x] B[0x%02x]\n", - TxPower[RF_PATH_A], TxPower[RF_PATH_B])); -} - -void SetAntennaPathPower(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 TxPowerLevel[MAX_RF_PATH_NUMS]; - u8 rfPath; - - TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; - TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - switch (pHalData->rf_chip) - { - case RF_8225: - case RF_8256: - case RF_6052: - SetCCKTxPower(pAdapter, TxPowerLevel); - if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate - MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); - SetOFDMTxPower(pAdapter, TxPowerLevel); - break; - - default: - break; - } -} - -void SetTxPower(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 TxPower = pAdapter->mppriv.txpoweridx; - u8 TxPowerLevel[MAX_RF_PATH_NUMS]; - u8 rf, rfPath; - - for (rf = 0; rf < MAX_RF_PATH_NUMS; rf++) { - TxPowerLevel[rf] = TxPower; - } - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - switch (pHalData->rf_chip) - { - // 2008/09/12 MH Test only !! We enable the TX power tracking for MP!!!!! - // We should call normal driver API later!! - case RF_8225: - case RF_8256: - case RF_6052: - SetCCKTxPower(pAdapter, TxPowerLevel); - if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate - MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); - SetOFDMTxPower(pAdapter, TxPowerLevel); - break; - - default: - break; - } - -// SetCCKTxPower(pAdapter, TxPower); -// SetOFDMTxPower(pAdapter, TxPower); -} - -void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) -{ - u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; - - TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); - TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); - TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); - - tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); - write_bbreg(pAdapter, rFPGA0_TxGainStage, - (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); -} - -void SetDataRate(PADAPTER pAdapter) -{ - mpt_SwitchRfSetting(pAdapter); -} - -#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D) -/*------------------------------Define structure----------------------------*/ -typedef struct _R_ANTENNA_SELECT_OFDM { - u32 r_tx_antenna:4; - u32 r_ant_l:4; - u32 r_ant_non_ht:4; - u32 r_ant_ht1:4; - u32 r_ant_ht2:4; - u32 r_ant_ht_s1:4; - u32 r_ant_non_ht_s1:4; - u32 OFDM_TXSC:2; - u32 Reserved:2; -}R_ANTENNA_SELECT_OFDM; - -typedef struct _R_ANTENNA_SELECT_CCK { - u8 r_cckrx_enable_2:2; - u8 r_cckrx_enable:2; - u8 r_ccktx_enable:4; -}R_ANTENNA_SELECT_CCK; -#endif - -void SetAntenna(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */ - R_ANTENNA_SELECT_CCK *p_cck_txrx; - - u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; - u8 chgTx = 0, chgRx = 0; - u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; - - - p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val; - p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val; - - p_ofdm_tx->r_ant_ht1 = 0x1; - p_ofdm_tx->r_ant_ht2 = 0x2; // Second TX RF path is A - p_ofdm_tx->r_ant_non_ht = 0x3; // 0x1+0x2=0x3 - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - p_ofdm_tx->r_tx_antenna = 0x1; - r_ofdm_tx_en_val = 0x1; - p_ofdm_tx->r_ant_l = 0x1; - p_ofdm_tx->r_ant_ht_s1 = 0x1; - p_ofdm_tx->r_ant_non_ht_s1 = 0x1; - p_cck_txrx->r_ccktx_enable = 0x8; - chgTx = 1; - - // From SD3 Willis suggestion !!! Set RF A=TX and B as standby -// if (IS_HARDWARE_TYPE_8192S(pAdapter)) - { - write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); - write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1); - r_ofdm_tx_en_val = 0x3; - - // Power save - //cosa r_ant_select_ofdm_val = 0x11111111; - - // We need to close RFB by SW control - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 0); - } - } - break; - - case ANTENNA_B: - p_ofdm_tx->r_tx_antenna = 0x2; - r_ofdm_tx_en_val = 0x2; - p_ofdm_tx->r_ant_l = 0x2; - p_ofdm_tx->r_ant_ht_s1 = 0x2; - p_ofdm_tx->r_ant_non_ht_s1 = 0x2; - p_cck_txrx->r_ccktx_enable = 0x4; - chgTx = 1; - - // From SD3 Willis suggestion !!! Set RF A as standby - //if (IS_HARDWARE_TYPE_8192S(pAdapter)) - { - PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); -// r_ofdm_tx_en_val = 0x3; - - // Power save - //cosa r_ant_select_ofdm_val = 0x22222222; - - // 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table. - // 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control - if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R) - { - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); -// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); - } - } - break; - - case ANTENNA_AB: // For 8192S - p_ofdm_tx->r_tx_antenna = 0x3; - r_ofdm_tx_en_val = 0x3; - p_ofdm_tx->r_ant_l = 0x3; - p_ofdm_tx->r_ant_ht_s1 = 0x3; - p_ofdm_tx->r_ant_non_ht_s1 = 0x3; - p_cck_txrx->r_ccktx_enable = 0xC; - chgTx = 1; - - // From SD3 Willis suggestion !!! Set RF B as standby - //if (IS_HARDWARE_TYPE_8192S(pAdapter)) - { - PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); - PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); - - // Disable Power save - //cosa r_ant_select_ofdm_val = 0x3321333; -#if 0 - // 2008/10/31 MH From SD3 Willi's suggestion. We must read RFA 2T table. - if ((pHalData->VersionID == VERSION_8192S_ACUT)) // For RTL8192SU A-Cut only, by Roger, 2008.11.07. - { - mpt_RFConfigFromPreParaArrary(pAdapter, 1, RF90_PATH_A); - } -#endif - // 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); -// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); - } - } - break; - - default: - break; - } - - // - // r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D - // r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D - // r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D - // - switch (pAdapter->mppriv.antenna_rx) - { - case ANTENNA_A: - r_rx_antenna_ofdm = 0x1; // A - p_cck_txrx->r_cckrx_enable = 0x0; // default: A - p_cck_txrx->r_cckrx_enable_2 = 0x0; // option: A - chgRx = 1; - break; - - case ANTENNA_B: - r_rx_antenna_ofdm = 0x2; // B - p_cck_txrx->r_cckrx_enable = 0x1; // default: B - p_cck_txrx->r_cckrx_enable_2 = 0x1; // option: B - chgRx = 1; - break; - - case ANTENNA_AB: - r_rx_antenna_ofdm = 0x3; // AB - p_cck_txrx->r_cckrx_enable = 0x0; // default:A - p_cck_txrx->r_cckrx_enable_2 = 0x1; // option:B - chgRx = 1; - break; - - default: - break; - } - - if (chgTx && chgRx) - { - switch(pHalData->rf_chip) - { - case RF_8225: - case RF_8256: - case RF_6052: - //r_ant_sel_cck_val = r_ant_select_cck_val; - PHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val); //OFDM Tx - PHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val); //OFDM Tx - PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx - PHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx - PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val);//r_ant_sel_cck_val); //CCK TxRx - break; - - default: - break; - } - } - - RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n")); -} - -s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - if (!netif_running(pAdapter->pnetdev)) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n")); - return _FAIL; - } - - if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { - RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n")); - return _FAIL; - } - - target_ther &= 0xff; - if (target_ther < 0x07) - target_ther = 0x07; - else if (target_ther > 0x1d) - target_ther = 0x1d; - - pHalData->EEPROMThermalMeter = target_ther; - - return _SUCCESS; -} - -static void TriggerRFThermalMeter(PADAPTER pAdapter) -{ - write_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x60); // 0x24: RF Reg[6:5] -// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" )); -} - -static u8 ReadRFThermalMeter(PADAPTER pAdapter) -{ - u32 ThermalValue = 0; - - ThermalValue = _read_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F); // 0x24: RF Reg[4:0] -// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue)); - return (u8)ThermalValue; -} - -void GetThermalMeter(PADAPTER pAdapter, u8 *value) -{ -#if 0 - fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER); - rtw_msleep_os(1000); - fw_cmd_data(pAdapter, value, 1); - *value &= 0xFF; -#else - TriggerRFThermalMeter(pAdapter); - rtw_msleep_os(1000); - *value = ReadRFThermalMeter(pAdapter); -#endif -} - -void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) -{ - pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; - if (bStart)// Start Single Carrier. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n")); - // 1. if OFDM block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on - - // 2. set CCK test mode off, set to CCK normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); - - // 3. turn on scramble setting - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); - - // 4. Turn On Single Carrier Tx and turn off the other test modes. - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - - // 5. Disable TX power saving at STF & LLTF - write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 1); - } - else// Stop Single Carrier. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n")); - - // Turn off all test modes. - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - - // Cancel disable TX power saving at STF&LLTF - write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 0); - - //Delay 10 ms //delay_ms(10); - rtw_msleep_os(10); - - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - } -} - -void SetSingleToneTx(PADAPTER pAdapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); - u8 rfPath; - - switch (pAdapter->mppriv.antenna_tx) - { - case ANTENNA_A: - default: - rfPath = RF_PATH_A; - break; - case ANTENNA_B: - rfPath = RF_PATH_B; - break; - case ANTENNA_C: - rfPath = RF_PATH_C; - break; - } - - pAdapter->mppriv.MptCtx.bSingleTone = bStart; - if (bStart)// Start Single Tone. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test start\n")); - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0); - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0); - - if (is92C) { - _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x01); - rtw_usleep_os(100); - if (rfPath == RF_PATH_A) - write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x10000); // PAD all on. - else if (rfPath == RF_PATH_B) - write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x10000); // PAD all on. - } else { - write_rfreg(pAdapter, rfPath, 0x21, 0xd4000); - rtw_usleep_os(100); - } - write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on. - rtw_usleep_os(100); - } - else// Stop Single Tone. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n")); - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); - - if (is92C) { - _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00); - rtw_usleep_os(100); - write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on. - write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on. - rtw_usleep_os(100); - } else { - write_rfreg(pAdapter, rfPath, 0x21, 0x54000); - rtw_usleep_os(100); - write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on. - rtw_usleep_os(100); - } - } -} - -void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) -{ - pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; - if (bStart) // Start Carrier Suppression. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n")); - //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) { - // 1. if CCK block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on - - //Turn Off All Test Mode - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting - - //Set CCK Tx Test Rate - //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate); - write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps - } - } - else// Stop Carrier Suppression. - { - RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n")); - //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) { - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting - - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - } - } - //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n"); -} - -void SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) -{ - u32 cckrate; - - if (bStart) - { - RT_TRACE(_module_mp_, _drv_alert_, - ("SetCCKContinuousTx: test start\n")); - - // 1. if CCK block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on - - //Turn Off All Test Mode - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - //Set CCK Tx Test Rate - #if 0 - switch(pAdapter->mppriv.rateidx) - { - case 2: - cckrate = 0; - break; - case 4: - cckrate = 1; - break; - case 11: - cckrate = 2; - break; - case 22: - cckrate = 3; - break; - default: - cckrate = 0; - break; - } - #else - cckrate = pAdapter->mppriv.rateidx; - #endif - write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting - - // Patch for CCK 11M waveform - if (cckrate == MPT_RATE_1M) - write_bbreg(pAdapter, 0xA71, BIT(6), bDisable); - else - write_bbreg(pAdapter, 0xA71, BIT(6), bEnable); - } - else { - RT_TRACE(_module_mp_, _drv_info_, - ("SetCCKContinuousTx: test stop\n")); - - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting - - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - } - - pAdapter->mppriv.MptCtx.bCckContTx = bStart; - pAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE; -}/* mpt_StartCckContTx */ - -void SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) -{ - if (bStart) { - RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n")); - // 1. if OFDM block on? - if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) - write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on - - // 2. set CCK test mode off, set to CCK normal mode - write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); - - // 3. turn on scramble setting - write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); - - // 4. Turn On Continue Tx and turn off the other test modes. - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - } else { - RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n")); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); - write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); - //Delay 10 ms - rtw_msleep_os(10); - //BB Reset - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); - write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); - } - - pAdapter->mppriv.MptCtx.bCckContTx = _FALSE; - pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; -}/* mpt_StartOfdmContTx */ - -void SetContinuousTx(PADAPTER pAdapter, u8 bStart) -{ -#if 0 - // ADC turn off [bit24-21] adc port0 ~ port1 - if (bStart) { - write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF); - rtw_usleep_os(100); - } -#endif - RT_TRACE(_module_mp_, _drv_info_, - ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx)); - - pAdapter->mppriv.MptCtx.bStartContTx = bStart; - if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) - { - SetCCKContinuousTx(pAdapter, bStart); - } - else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && - (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) - { - SetOFDMContinuousTx(pAdapter, bStart); - } -#if 0 - // ADC turn on [bit24-21] adc port0 ~ port1 - if (!bStart) { - write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000); - } -#endif -} - -//------------------------------------------------------------------------------ -void dump_mpframe(_adapter *padapter, struct xmit_frame *pmpframe) -{ - padapter->HalFunc.mgnt_xmit(padapter, pmpframe); -} - -struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv) -{ - struct xmit_frame *pmpframe; - struct xmit_buf *pxmitbuf; - - if ((pmpframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) - { - return NULL; - } - - if ((pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL) - { - rtw_free_xmitframe_ex(pxmitpriv, pmpframe); - return NULL; - } - - pmpframe->frame_tag = MP_FRAMETAG; - - pmpframe->pxmitbuf = pxmitbuf; - - pmpframe->buf_addr = pxmitbuf->pbuf; - - pxmitbuf->priv_data = pmpframe; - - return pmpframe; - -} - -thread_return mp_xmit_packet_thread(thread_context context) -{ - struct xmit_frame *pxmitframe; - struct mp_tx *pmptx; - struct mp_priv *pmp_priv; - struct xmit_priv *pxmitpriv; - PADAPTER padapter; - - pmp_priv = (struct mp_priv *)context; - pmptx = &pmp_priv->tx; - padapter = pmp_priv->papdater; - pxmitpriv = &(padapter->xmitpriv); - - thread_enter(padapter); - - //DBG_8192C("%s:pkTx Start\n", __func__); - while (1) { - pxmitframe = alloc_mp_xmitframe(pxmitpriv); - if (pxmitframe == NULL) { - if (pmptx->stop || - padapter->bSurpriseRemoved || - padapter->bDriverStopped) { - goto exit; - } - else { - rtw_msleep_os(1); - continue; - } - } - - _rtw_memcpy((u8 *)(pxmitframe->buf_addr+TXDESC_OFFSET), pmptx->buf, pmptx->write_size); - _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib)); - - dump_mpframe(padapter, pxmitframe); - - pmptx->sended++; - pmp_priv->tx_pktcount++; - - if (pmptx->stop || - padapter->bSurpriseRemoved || - padapter->bDriverStopped) - goto exit; - if ((pmptx->count != 0) && - (pmptx->count == pmptx->sended)) - goto exit; - - flush_signals_thread(); - } - -exit: - //DBG_8192C("%s:pkTx Exit\n", __func__); - rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size); - pmptx->pallocated_buf = NULL; - pmptx->stop = 1; - - thread_exit(); -} - -void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc) -{ - struct mp_priv *pmp_priv = &padapter->mppriv; - _rtw_memcpy(ptxdesc, &(pmp_priv->tx.desc), TXDESC_SIZE); -} - -void SetPacketTx(PADAPTER padapter) -{ - u8 *ptr, *pkt_start, *pkt_end; - u32 pkt_size; - struct tx_desc *desc; - struct ieee80211_hdr *hdr; - u8 macid, payload; - s32 bmcast; - struct pkt_attrib *pattrib; - struct mp_priv *pmp_priv; - - - pmp_priv = &padapter->mppriv; - if (pmp_priv->tx.stop) return; - pmp_priv->tx.sended = 0; - pmp_priv->tx.stop = 0; - pmp_priv->tx_pktcount = 0; - - //3 1. update_attrib() - pattrib = &pmp_priv->tx.attrib; - _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); - bmcast = IS_MCAST(pattrib->ra); - if (bmcast) { - pattrib->mac_id = 1; - pattrib->psta = rtw_get_bcmc_stainfo(padapter); - } else { - pattrib->mac_id = 0; - pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); - } - - pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen; - - //3 2. allocate xmit buffer - pkt_size = pattrib->last_txcmdsz; - - if (pmp_priv->tx.pallocated_buf) - rtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size); - pmp_priv->tx.write_size = pkt_size; - pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ; - pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size); - if (pmp_priv->tx.pallocated_buf == NULL) { - DBG_8192C("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size); - return; - } - pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ); - ptr = pmp_priv->tx.buf; - - desc = &(pmp_priv->tx.desc); - _rtw_memset(desc, 0, TXDESC_SIZE); - pkt_start = ptr; - pkt_end = pkt_start + pkt_size; - - //3 3. init TX descriptor - // offset 0 - //desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size - //desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); - //desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc - //if (bmcast) desc->txdw0 |= cpu_to_le32(BMC); // broadcast packet - - // offset 4 - desc->txdw1 |= cpu_to_le32(BK); // don't aggregate(AMPDU) - desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x1F); //CAM_ID(MAC_ID) - desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); // Queue Select, TID - desc->txdw1 |= cpu_to_le32((pattrib->raid << Rate_ID_SHT) & 0x000F0000); // Rate Adaptive ID - - // offset 8 - // offset 12 - //desc->txdw3 |= cpu_to_le32((pattrib->seqnum << SEQ_SHT) & 0xffff0000); - - // offset 16 - //desc->txdw4 |= cpu_to_le32(QoS); - desc->txdw4 |= cpu_to_le32(HW_SEQ_EN); - desc->txdw4 |= cpu_to_le32(USERATE); - desc->txdw4 |= cpu_to_le32(DISDATAFB); - - if( pmp_priv->preamble ){ - if (pmp_priv->rateidx <= MPT_RATE_54M) - desc->txdw4 |= cpu_to_le32(DATA_SHORT); // CCK Short Preamble - } - if (pmp_priv->bandwidth == HT_CHANNEL_WIDTH_40) - desc->txdw4 |= cpu_to_le32(DATA_BW); - - // offset 20 - desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F); - - if( pmp_priv->preamble ){ - if (pmp_priv->rateidx > MPT_RATE_54M) - desc->txdw5 |= cpu_to_le32(SGI); // MCS Short Guard Interval - } - desc->txdw5 |= cpu_to_le32(0x0001FF00); // DATA/RTS Rate Fallback Limit - - //3 4. make wlan header, make_wlanhdr() - hdr = (struct ieee80211_hdr *)pkt_start; - SetFrameSubType(&hdr->frame_ctl, pattrib->subtype); - _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA - _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA - _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID - - //3 5. make payload - ptr = pkt_start + pattrib->hdrlen; - - switch (pmp_priv->tx.payload) { - case 0: - payload = 0x00; - break; - case 1: - payload = 0x5a; - break; - case 2: - payload = 0xa5; - break; - case 3: - payload = 0xff; - break; - default: - payload = 0x00; - break; - } - - _rtw_memset(ptr, payload, pkt_end - ptr); - - //3 6. start thread - pmp_priv->tx.PktTxThread = kernel_thread(mp_xmit_packet_thread, pmp_priv, CLONE_FS|CLONE_FILES); - if(pmp_priv->tx.PktTxThread < 0) - DBG_871X("Create PktTx Thread Fail !!!!!\n"); - -} - -void SetPacketRx(PADAPTER pAdapter, u8 bStartRx) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - if(bStartRx) - { - // Accept CRC error and destination address - pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); - rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); - } - else - { - rtw_write32(pAdapter, REG_RCR, 0); - } -} - -void ResetPhyRxPktCount(PADAPTER pAdapter) -{ - u32 i, phyrx_set = 0; - - for (i = 0; i <= 0xF; i++) { - phyrx_set = 0; - phyrx_set |= _RXERR_RPT_SEL(i); //select - phyrx_set |= RXERR_RPT_RST; // set counter to zero - rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); - } -} - -static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit) -{ - //selection - u32 phyrx_set = 0, count = 0; - - phyrx_set = _RXERR_RPT_SEL(selbit & 0xF); - rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); - - //Read packet count - count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK; - - return count; -} - -u32 GetPhyRxPktReceived(PADAPTER pAdapter) -{ - u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; - - OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK); - CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK); - HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK); - - return OFDM_cnt + CCK_cnt + HT_cnt; -} - -u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter) -{ - u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; - - OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL); - CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL); - HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL); - - return OFDM_cnt + CCK_cnt + HT_cnt; -} - -//reg 0x808[9:0]: FFT data x -//reg 0x808[22]: 0 --> 1 to get 1 FFT data y -//reg 0x8B4[15:0]: FFT data y report -static u32 GetPSDData(PADAPTER pAdapter, u32 point) -{ - int psd_val; - - - psd_val = rtw_read32(pAdapter, 0x808); - psd_val &= 0xFFBFFC00; - psd_val |= point; - - rtw_write32(pAdapter, 0x808, psd_val); - rtw_mdelay_os(1); - psd_val |= 0x00400000; - - rtw_write32(pAdapter, 0x808, psd_val); - rtw_mdelay_os(1); - psd_val = rtw_read32(pAdapter, 0x8B4); - - psd_val &= 0x0000FFFF; - - return psd_val; -} - -/* - * pts start_point_min stop_point_max - * 128 64 64 + 128 = 192 - * 256 128 128 + 256 = 384 - * 512 256 256 + 512 = 768 - * 1024 512 512 + 1024 = 1536 - * - */ -u32 mp_query_psd(PADAPTER pAdapter, u8 *data) -{ - u8 *val; - u32 i, psd_pts=0, psd_start=0, psd_stop=0; - u32 psd_data=0; - - - if (!netif_running(pAdapter->pnetdev)) { - RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! interface not opened!\n")); - return 0; - } - - if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { - RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! not in MP mode!\n")); - return 0; - } - - if (strlen(data) == 0) { //default value - psd_pts = 128; - psd_start = 64; - psd_stop = 128; - } else { - sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop); - } - - _rtw_memset(data, '\0', sizeof(data)); - - i = psd_start; - while (i < psd_stop) - { - if (i >= psd_pts) { - psd_data = GetPSDData(pAdapter, i-psd_pts); - } else { - psd_data = GetPSDData(pAdapter, i); - } - sprintf(data, "%s%x ", data, psd_data); - i++; - } - - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(100); - #else - rtw_mdelay_os(100); - #endif - - return strlen(data)+1; -} - -#endif - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c b/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c deleted file mode 100755 index 1d59f13cba93..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c +++ /dev/null @@ -1,2841 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_MP_IOCTL_C_ - -#include -#include -#include -#include - -//#include -#include - - -//**************** oid_rtl_seg_81_85 section start **************** -NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == SET_OID) { - Adapter->registrypriv.wireless_mode = *(u8*)poid_par_priv->information_buf; - } else if (poid_par_priv->type_of_oid == QUERY_OID) { - *(u8*)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_info_, ("-query Wireless Mode=%d\n", Adapter->registrypriv.wireless_mode)); - } else { - status = NDIS_STATUS_NOT_ACCEPTED; - } - -_func_exit_; - - return status; -} -//**************** oid_rtl_seg_81_87_80 section start **************** -NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - struct bb_reg_param *pbbreg; - u16 offset; - u32 value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_bb_reg_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); - - offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff - if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; - - value = pbbreg->value; - - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_write_bb_reg_hdl: offset=0x%03X value=0x%08X\n", - offset, value)); - - _irqlevel_changed_(&oldirql, LOWER); - write_bbreg(Adapter, offset, 0xFFFFFFFF, value); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - struct bb_reg_param *pbbreg; - u16 offset; - u32 value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_bb_reg_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); - - offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff - if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; - - _irqlevel_changed_(&oldirql, LOWER); - value = read_bbreg(Adapter, offset, 0xFFFFFFFF); - _irqlevel_changed_(&oldirql, RAISE); - - pbbreg->value = value; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_read_bb_reg_hdl: offset=0x%03X value:0x%08X\n", - offset, value)); -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - struct rf_reg_param *pbbreg; - u8 path; - u8 offset; - u32 value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_rf_reg_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); - - if (pbbreg->path >= MAX_RF_PATH_NUMS) - return NDIS_STATUS_NOT_ACCEPTED; - if (pbbreg->offset > 0xFF) - return NDIS_STATUS_NOT_ACCEPTED; - if (pbbreg->value > 0xFFFFF) - return NDIS_STATUS_NOT_ACCEPTED; - - path = (u8)pbbreg->path; - offset = (u8)pbbreg->offset; - value = pbbreg->value; - - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_write_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", - path, offset, value)); - - _irqlevel_changed_(&oldirql, LOWER); - write_rfreg(Adapter, path, offset, value); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - struct rf_reg_param *pbbreg; - u8 path; - u8 offset; - u32 value; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_rf_reg_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); - - if (pbbreg->path >= MAX_RF_PATH_NUMS) - return NDIS_STATUS_NOT_ACCEPTED; - if (pbbreg->offset > 0xFF) - return NDIS_STATUS_NOT_ACCEPTED; - - path = (u8)pbbreg->path; - offset = (u8)pbbreg->offset; - - _irqlevel_changed_(&oldirql, LOWER); - value = read_rfreg(Adapter, path, offset); - _irqlevel_changed_(&oldirql, RAISE); - - pbbreg->value = value; - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_read_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", - path, offset, value)); - -_func_exit_; - - return status; -} -//**************** oid_rtl_seg_81_87_00 section end**************** -//------------------------------------------------------------------------------ - -//**************** oid_rtl_seg_81_80_00 section start **************** -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 ratevalue;//4 - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_set_data_rate_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - ratevalue = *((u32*)poid_par_priv->information_buf);//4 - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_set_data_rate_hdl: data rate idx=%d\n", ratevalue)); - if (ratevalue >= MPT_RATE_LAST) - return NDIS_STATUS_INVALID_DATA; - - Adapter->mppriv.rateidx = ratevalue; - - _irqlevel_changed_(&oldirql, LOWER); - SetDataRate(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 mode; - u8 val8; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_start_test_hdl\n")); - - if (Adapter->registrypriv.mp_mode == 0) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - //IQCalibrateBcut(Adapter); - - mode = *((u32*)poid_par_priv->information_buf); - Adapter->mppriv.mode = mode;// 1 for loopback - - if (mp_start_test(Adapter) == _FAIL) { - status = NDIS_STATUS_NOT_ACCEPTED; - goto exit; - } - -exit: - _irqlevel_changed_(&oldirql, RAISE); - - RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_pro_start_test_hdl: mp_mode=%d\n", Adapter->mppriv.mode)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_STOP_TEST\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - mp_stop_test(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - RT_TRACE(_module_mp_, _drv_notice_, ("-Set OID_RT_PRO_STOP_TEST\n")); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 Channel; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_channel_direct_call_hdl\n")); - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == QUERY_OID) { - *((u32*)poid_par_priv->information_buf) = Adapter->mppriv.channel; - return NDIS_STATUS_SUCCESS; - } - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - Channel = *((u32*)poid_par_priv->information_buf); - RT_TRACE(_module_mp_, _drv_notice_, ("oid_rt_pro_set_channel_direct_call_hdl: Channel=%d\n", Channel)); - if (Channel > 14) - return NDIS_STATUS_NOT_ACCEPTED; - Adapter->mppriv.channel = Channel; - - _irqlevel_changed_(&oldirql, LOWER); - SetChannel(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u16 bandwidth, channel_offset; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, - ("+oid_rt_set_bandwidth_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - bandwidth = *((u32*)poid_par_priv->information_buf);//4 - if (bandwidth != HT_CHANNEL_WIDTH_40) - bandwidth = HT_CHANNEL_WIDTH_20; - Adapter->mppriv.bandwidth = (u8)bandwidth; - - _irqlevel_changed_(&oldirql, LOWER); - SetBandwidth(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_set_bandwidth_hdl: bandwidth=%d channel_offset=%d\n", - bandwidth, channel_offset)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 antenna; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_antenna_bb_hdl\n")); - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == SET_OID) - { - antenna = *(u32*)poid_par_priv->information_buf; - - Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16); - Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF); - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_set_antenna_bb_hdl: tx_ant=0x%04x rx_ant=0x%04x\n", - Adapter->mppriv.antenna_tx, Adapter->mppriv.antenna_rx)); - - _irqlevel_changed_(&oldirql, LOWER); - SetAntenna(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - } else { - antenna = (Adapter->mppriv.antenna_tx << 16)|Adapter->mppriv.antenna_rx; - *(u32*)poid_par_priv->information_buf = antenna; - } - -_func_exit_; - - return status; -} - -NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 tx_pwr_idx; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_set_tx_power_control_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - tx_pwr_idx = *((u32*)poid_par_priv->information_buf); - if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE) - return NDIS_STATUS_NOT_ACCEPTED; - - Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx; - - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_set_tx_power_control_hdl: idx=0x%2x\n", - Adapter->mppriv.txpoweridx)); - - _irqlevel_changed_(&oldirql, LOWER); - SetTxPower(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} - -//------------------------------------------------------------------------------ -//**************** oid_rtl_seg_81_80_20 section start **************** -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid !=QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else { - status = NDIS_STATUS_INVALID_LENGTH; - } - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_received_hdl.\n")); - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_alert_, ("recv_ok:%d \n",Adapter->mppriv.rx_pktcount)); - } else { - status = NDIS_STATUS_INVALID_LENGTH; - } - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_crc32_error_hdl.\n")); - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - RT_TRACE(_module_mp_, _drv_alert_, ("recv_err:%d \n",Adapter->mppriv.rx_crcerrpktcount)); - } else { - status = NDIS_STATUS_INVALID_LENGTH; - } - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ - -NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_reset_tx_packet_sent_hdl.\n")); - Adapter->mppriv.tx_pktcount = 0; - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - Adapter->mppriv.rx_pktcount = 0; - Adapter->mppriv.rx_crcerrpktcount = 0; - } else { - status = NDIS_STATUS_INVALID_LENGTH; - } - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql, LOWER); - ResetPhyRxPktCount(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_received_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len != sizeof(ULONG)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_get_phy_rx_packet_received_hdl: recv_ok=%d\n", *(ULONG*)poid_par_priv->information_buf)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_crc32_error_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - - if (poid_par_priv->information_buf_len != sizeof(ULONG)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_get_phy_rx_packet_crc32_error_hdl: recv_err=%d\n", *(ULONG*)poid_par_priv->information_buf)); - -_func_exit_; - - return status; -} -//**************** oid_rtl_seg_81_80_20 section end **************** -NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_continuous_tx_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32*)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetContinuousTx(Adapter,(u8)bStartTest); - if (bStartTest) { - struct mp_priv *pmp_priv = &Adapter->mppriv; - if (pmp_priv->tx.stop == 0) { - pmp_priv->tx.stop = 1; - DBG_8192C("%s: pkt tx is running...\n", __func__); - rtw_msleep_os(5); - } - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = 1; - SetPacketTx(Adapter); - } - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} - -NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_carrier_tx_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32*)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetSingleCarrierTx(Adapter, (u8)bStartTest); - if (bStartTest) { - struct mp_priv *pmp_priv = &Adapter->mppriv; - if (pmp_priv->tx.stop == 0) { - pmp_priv->tx.stop = 1; - DBG_8192C("%s: pkt tx is running...\n", __func__); - rtw_msleep_os(5); - } - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = 1; - SetPacketTx(Adapter); - } - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} - -NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_carrier_suppression_tx_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32*)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetCarrierSuppressionTx(Adapter, (u8)bStartTest); - if (bStartTest) { - struct mp_priv *pmp_priv = &Adapter->mppriv; - if (pmp_priv->tx.stop == 0) { - pmp_priv->tx.stop = 1; - DBG_8192C("%s: pkt tx is running...\n", __func__); - rtw_msleep_os(5); - } - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = 1; - SetPacketTx(Adapter); - } - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} - -NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_tone_tx_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32*)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetSingleToneTx(Adapter,(u8)bStartTest); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} - -NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv) -{ - return 0; -} - -NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_TRIGGER_GPIO_0, 0); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//**************** oid_rtl_seg_81_80_00 section end **************** -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - PNDIS_802_11_SSID pssid; - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = (u32)sizeof(NDIS_802_11_SSID); - *poid_par_priv->bytes_rw = 0; - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - pssid = (PNDIS_802_11_SSID)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - - if (mp_start_joinbss(Adapter, pssid) == _FAIL) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID); - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - pRW_Reg RegRWStruct; - u32 offset, width; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, - ("+oid_rt_pro_read_register_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; - offset = RegRWStruct->offset; - width = RegRWStruct->width; - - if (offset > 0xFFF) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - switch (width) { - case 1: - RegRWStruct->value = rtw_read8(Adapter, offset); - break; - case 2: - RegRWStruct->value = rtw_read16(Adapter, offset); - break; - default: - width = 4; - RegRWStruct->value = rtw_read32(Adapter, offset); - break; - } - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_read_register_hdl: offset:0x%04X value:0x%X\n", - offset, RegRWStruct->value)); - - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = width; - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - pRW_Reg RegRWStruct; - u32 offset, width, value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, - ("+oid_rt_pro_write_register_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; - offset = RegRWStruct->offset; - width = RegRWStruct->width; - value = RegRWStruct->value; - - if (offset > 0xFFF) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - switch (RegRWStruct->width) - { - case 1: - if (value > 0xFF) { - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - rtw_write8(padapter, offset, (u8)value); - break; - case 2: - if (value > 0xFFFF) { - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - rtw_write16(padapter, offset, (u16)value); - break; - case 4: - rtw_write32(padapter, offset, value); - break; - default: - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - - _irqlevel_changed_(&oldirql, RAISE); - - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_pro_write_register_hdl: offset=0x%08X width=%d value=0x%X\n", - offset, width, value)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - pBurst_RW_Reg pBstRwReg; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_read_register_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; -#if 0 - pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - rtw_read_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); - _irqlevel_changed_(&oldirql,RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -#endif - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_read_register_hdl\n")); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - pBurst_RW_Reg pBstRwReg; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_write_register_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; -#if 0 - pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - rtw_write_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); - _irqlevel_changed_(&oldirql, RAISE); -#endif - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_write_register_hdl\n")); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -/* - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); - - _irqL oldirql; - - TX_CMD_Desc *TxCmd_Info; - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - RT_TRACE(_module_mp_, _drv_info_, ("+Set OID_RT_PRO_WRITE_TXCMD\n")); - - TxCmd_Info=(TX_CMD_Desc*)poid_par_priv->information_buf; - - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:Addr=%.8X\n", TxCmd_Info->offset)); - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:1.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[0])); - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:2.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[1])); - RT_TRACE(_module_mp_, _drv_info_, (("WRITE_TXCMD:3.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[2])); - RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:4.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[3])); - - _irqlevel_changed_(&oldirql, LOWER); - - rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]); - rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]); - - _irqlevel_changed_(&oldirql, RAISE); -*/ - - RT_TRACE(_module_mp_, _drv_notice_, - ("-Set OID_RT_PRO_WRITE_TXCMD: status=0x%08X\n", status)); - -_func_exit_; - - return status; -} - -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - pEEPROM_RWParam pEEPROM; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, ("+Query OID_RT_PRO_READ16_EEPROM\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; -#if 0 - pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - pEEPROM->value = eeprom_read16(Adapter, (u16)(pEEPROM->offset >> 1)); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_notice_, - ("-Query OID_RT_PRO_READ16_EEPROM: offset=0x%x value=0x%x\n", - pEEPROM->offset, pEEPROM->value)); -#endif -_func_exit_; - - return status; -} - -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - pEEPROM_RWParam pEEPROM; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_WRITE16_EEPROM\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; -#if 0 - pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - eeprom_write16(Adapter, (u16)(pEEPROM->offset >> 1), pEEPROM->value); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -#endif -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct mp_wiparam *pwi_param; - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam)) - return NDIS_STATUS_INVALID_LENGTH; - - if (Adapter->mppriv.workparam.bcompleted == _FALSE) - return NDIS_STATUS_NOT_ACCEPTED; - - pwi_param = (struct mp_wiparam *)poid_par_priv->information_buf; - - _rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam)); - Adapter->mppriv.act_in_progress = _FALSE; -// RT_TRACE(_module_mp_, _drv_info_, ("rf:%x\n", pwiparam->IoValue)); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro8711_pkt_loss_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(uint)*2) { - RT_TRACE(_module_mp_, _drv_err_, ("-oid_rt_pro8711_pkt_loss_hdl: buf_len=%d\n", (int)poid_par_priv->information_buf_len)); - return NDIS_STATUS_INVALID_LENGTH; - } - - if (*(uint*)poid_par_priv->information_buf == 1)//init==1 - Adapter->mppriv.rx_pktloss = 0; - - *((uint*)poid_par_priv->information_buf+1) = Adapter->mppriv.rx_pktloss; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); - struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; - struct intf_hdl *pintfhdl = &pio_queue->intf; - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -#ifdef CONFIG_SDIO_HCI - void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); -#endif - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+Query OID_RT_RD_ATTRIB_MEM\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - -#ifdef CONFIG_SDIO_HCI - _irqlevel_changed_(&oldirql, LOWER); -{ - u32 *plmem = (u32*)poid_par_priv->information_buf+2; - _attrib_read = pintfhdl->io_ops._attrib_read; - _attrib_read(pintfhdl, *((u32*)poid_par_priv->information_buf), - *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -} - _irqlevel_changed_(&oldirql, RAISE); -#endif - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; - struct intf_hdl *pintfhdl = &pio_queue->intf; - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -#ifdef CONFIG_SDIO_HCI - void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); -#endif - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - -#ifdef CONFIG_SDIO_HCI - _irqlevel_changed_(&oldirql, LOWER); -{ - u32 *plmem = (u32*)poid_par_priv->information_buf + 2; - _attrib_write = pintfhdl->io_ops._attrib_write; - _attrib_write(pintfhdl, *(u32*)poid_par_priv->information_buf, - *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); -} - _irqlevel_changed_(&oldirql, RAISE); -#endif - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_RF_INTFS\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - if (rtw_setrfintfs_cmd(Adapter, *(unsigned char*)poid_par_priv->information_buf) == _FAIL) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _rtw_memcpy(poid_par_priv->information_buf, (unsigned char*)&Adapter->mppriv.rxstat, sizeof(struct recv_stat)); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - PCFG_DBG_MSG_STRUCT pdbg_msg; - -_func_enter_; - -// RT_TRACE(0xffffffffff,_drv_alert_,("===> oid_rt_pro_cfg_debug_message_hdl.\n")); - -#if 0//#ifdef CONFIG_DEBUG_RTL871X - - pdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf); - - if (poid_par_priv->type_of_oid == SET_OID) { - RT_TRACE(0xffffffffff, _drv_alert_, - ("===>Set level :0x%08x, H32:0x%08x L32:0x%08x\n", - pdbg_msg->DebugLevel, pdbg_msg->DebugComponent_H32, pdbg_msg->DebugComponent_L32)); - - GlobalDebugLevel = pdbg_msg->DebugLevel; - GlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32; - RT_TRACE(0xffffffffff, _drv_alert_, - ("===> Set level :0x%08x, component:0x%016x\n", - GlobalDebugLevel, (u32)GlobalDebugComponents)); - } else { - pdbg_msg->DebugLevel = GlobalDebugLevel; - pdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32); - pdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(0xffffffffff, _drv_alert_, - ("===>Query level:0x%08x H32:0x%08x L32:0x%08x\n", - (u32)pdbg_msg->DebugLevel, (u32)pdbg_msg->DebugComponent_H32, (u32)pdbg_msg->DebugComponent_L32)); - } - -#endif - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_DATA_RATE_EX\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) !=_SUCCESS) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//----------------------------------------------------------------------------- -NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - u8 thermal = 0; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_get_thermal_meter_hdl\n")); - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - GetThermalMeter(Adapter, &thermal); - _irqlevel_changed_(&oldirql, RAISE); - - *(u32*)poid_par_priv->information_buf = (u32)thermal; - *poid_par_priv->bytes_rw = sizeof(u32); - -_func_exit_; - - return status; -} -//----------------------------------------------------------------------------- -NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_tssi_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (Adapter->mppriv.act_in_progress == _TRUE) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - //init workparam - Adapter->mppriv.act_in_progress = _TRUE; - Adapter->mppriv.workparam.bcompleted = _FALSE; - Adapter->mppriv.workparam.act_type = MPT_READ_TSSI; - Adapter->mppriv.workparam.io_offset = 0; - Adapter->mppriv.workparam.io_value = 0xFFFFFFFF; - - _irqlevel_changed_(&oldirql, LOWER); - - if (!rtw_gettssi_cmd(Adapter,0, (u8*)&Adapter->mppriv.workparam.io_value)) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - -_func_enter_; - -// if (poid_par_priv->type_of_oid != SET_OID) -// return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - if (poid_par_priv->type_of_oid == SET_OID) { - u8 enable; - - enable = *(u8*)poid_par_priv->information_buf; - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_set_power_tracking_hdl: enable=%d\n", enable)); - - SetPowerTracking(Adapter, enable); - } else { - GetPowerTracking(Adapter, (u8*)poid_par_priv->information_buf); - } - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//----------------------------------------------------------------------------- -NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - u32 ratevalue; - u8 datarates[NumRates]; - int i; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, ("+OID_RT_PRO_SET_BASIC_RATE\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; -#if 0 - ratevalue = *((u32*)poid_par_priv->information_buf); - - for (i = 0; i < NumRates; i++) { - if (ratevalue == mpdatarate[i]) - datarates[i] = mpdatarate[i]; - else - datarates[i] = 0xff; - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_info_, ("basicrate_inx=%d\n", datarates[i])); - } - - _irqlevel_changed_(&oldirql, LOWER); - - if (rtw_setbasicrate_cmd(Adapter, datarates) != _SUCCESS) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); -#endif - RT_TRACE(_module_mp_, _drv_notice_, - ("-OID_RT_PRO_SET_BASIC_RATE: status=0x%08X\n", status)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < 8) - return NDIS_STATUS_INVALID_LENGTH; - - *poid_par_priv->bytes_rw = 8; - _rtw_memcpy(poid_par_priv->information_buf, &(Adapter->pwrctrlpriv.pwr_mode), 8); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_qry_pwrstate_hdl: pwr_mode=%d smart_ps=%d\n", - Adapter->pwrctrlpriv.pwr_mode, Adapter->pwrctrlpriv.smart_ps)); - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - uint pwr_mode, smart_ps; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_SET_PWRSTATE\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_rw = 0; - *poid_par_priv->bytes_needed = 8; - - if (poid_par_priv->information_buf_len < 8) - return NDIS_STATUS_INVALID_LENGTH; - - pwr_mode = *(uint *)(poid_par_priv->information_buf); - smart_ps = *(uint *)((int)poid_par_priv->information_buf + 4); - - *poid_par_priv->bytes_rw = 8; - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct setratable_parm *prate_table; - u8 res; - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = sizeof(struct setratable_parm); - if (poid_par_priv->information_buf_len < sizeof(struct setratable_parm)) - return NDIS_STATUS_INVALID_LENGTH; - - prate_table = (struct setratable_parm*)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - res = rtw_setrttbl_cmd(Adapter, prate_table); - _irqlevel_changed_(&oldirql, RAISE); - - if (res == _FAIL) - status = NDIS_STATUS_FAILURE; - -_func_exit_; - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - #if 0 - struct mp_wi_cntx *pmp_wi_cntx=&(Adapter->mppriv.wi_cntx); - u8 res=_SUCCESS; - DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); - - if(pmp_wi_cntx->bmp_wi_progress ==_TRUE){ - DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n")); - Status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - else{ - pmp_wi_cntx->bmp_wi_progress=_TRUE; - pmp_wi_cntx->param.bcompleted=_FALSE; - pmp_wi_cntx->param.act_type=MPT_GET_RATE_TABLE; - pmp_wi_cntx->param.io_offset=0x0; - pmp_wi_cntx->param.bytes_cnt=sizeof(struct getratable_rsp); - pmp_wi_cntx->param.io_value=0xffffffff; - - res=rtw_getrttbl_cmd(Adapter,(struct getratable_rsp *)pmp_wi_cntx->param.data); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - if(res != _SUCCESS) - { - Status = NDIS_STATUS_NOT_ACCEPTED; - } - } - DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); - #endif - -_func_exit_; - - return status; -#else - return 0; -#endif -} - -//**************** oid_rtl_seg_87_12_00 section start **************** -NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - struct security_priv *psecuritypriv = &Adapter->securitypriv; - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - ENCRY_CTRL_STATE encry_mode; - - - *poid_par_priv->bytes_needed = sizeof(u8); - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == SET_OID) - { - encry_mode = *((u8*)poid_par_priv->information_buf); - switch (encry_mode) - { - case HW_CONTROL: - #if 0 - Adapter->registrypriv.software_decrypt=_FALSE; - Adapter->registrypriv.software_encrypt=_FALSE; - #else - psecuritypriv->sw_decrypt = _FALSE; - psecuritypriv->sw_encrypt = _FALSE; - #endif - break; - case SW_CONTROL: - #if 0 - Adapter->registrypriv.software_decrypt=_TRUE; - Adapter->registrypriv.software_encrypt=_TRUE; - #else - psecuritypriv->sw_decrypt = _TRUE; - psecuritypriv->sw_encrypt = _TRUE; - #endif - break; - case HW_ENCRY_SW_DECRY: - #if 0 - Adapter->registrypriv.software_decrypt=_TRUE; - Adapter->registrypriv.software_encrypt=_FALSE; - #else - psecuritypriv->sw_decrypt = _TRUE; - psecuritypriv->sw_encrypt = _FALSE; - #endif - break; - case SW_ENCRY_HW_DECRY: - #if 0 - Adapter->registrypriv.software_decrypt=_FALSE; - Adapter->registrypriv.software_encrypt=_TRUE; - #else - psecuritypriv->sw_decrypt = _FALSE; - psecuritypriv->sw_encrypt = _TRUE; - #endif - break; - } - - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_notice_, - ("-oid_rt_pro_encryption_ctrl_hdl: SET encry_mode=0x%x sw_encrypt=0x%x sw_decrypt=0x%x\n", - encry_mode, psecuritypriv->sw_encrypt, psecuritypriv->sw_decrypt)); - } - else { - #if 0 - if (Adapter->registrypriv.software_encrypt == _FALSE) { - if (Adapter->registrypriv.software_decrypt == _FALSE) - encry_mode = HW_CONTROL; - else - encry_mode = HW_ENCRY_SW_DECRY; - } - else { - if (Adapter->registrypriv.software_decrypt == _FALSE) - encry_mode = SW_ENCRY_HW_DECRY; - else - encry_mode = SW_CONTROL; - } - #else - - if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE)) - encry_mode = HW_CONTROL; - else if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _TRUE)) - encry_mode = HW_ENCRY_SW_DECRY; - else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _FALSE)) - encry_mode = SW_ENCRY_HW_DECRY; - else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE)) - encry_mode = SW_CONTROL; - - #endif - - *(u8*)poid_par_priv->information_buf = encry_mode; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_encryption_ctrl_hdl: QUERY encry_mode=0x%x\n", - encry_mode)); - } - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct sta_info *psta = NULL; - UCHAR *macaddr; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = ETH_ALEN; - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - macaddr = (UCHAR *) poid_par_priv->information_buf ; - - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, - ("OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); - - _irqlevel_changed_(&oldirql, LOWER); - - psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); - - if (psta == NULL) { // the sta have been in sta_info_queue => do nothing - psta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr); - - if (psta == NULL) { - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("Can't alloc sta_info when OID_RT_PRO_ADD_STA_INFO\n")); - status = NDIS_STATUS_FAILURE; - } - } else { //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_err_, - ("Error: OID_RT_PRO_ADD_STA_INFO: sta has been in sta_hash_queue \n")); - } - - _irqlevel_changed_(&oldirql, RAISE); - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL irqL; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct sta_info *psta = NULL; - UCHAR *macaddr; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = ETH_ALEN; - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - macaddr = (UCHAR *) poid_par_priv->information_buf ; - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, - ("+OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); - - psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); - if (psta != NULL) { - _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); - rtw_free_stainfo(Adapter, psta); - _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); - } - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -#include -u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var) -{ -#if 0 -#ifdef CONFIG_SDIO_HCI - - if (offset == 1) { - u16 tmp_blk_num; - tmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM); - RT_TRACE(_module_mp_, _drv_err_, ("Query Information, mp_query_drv_var SDIO_RX0_RDYBLK_NUM=0x%x padapter->dvobjpriv.rxblknum=0x%x\n", tmp_blk_num, padapter->dvobjpriv.rxblknum)); - if (padapter->dvobjpriv.rxblknum != tmp_blk_num) { - RT_TRACE(_module_mp_,_drv_err_, ("Query Information, mp_query_drv_var call recv rx\n")); - // sd_recv_rxfifo(padapter); - } - } - -#if 0 - if(offset <=100){ //For setting data rate and query data rate - if(offset==100){ //For query data rate - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): query rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); - var=padapter->registrypriv.tx_rate; - - } - else if(offset<0x1d){ //For setting data rate - padapter->registrypriv.tx_rate=offset; - var=padapter->registrypriv.tx_rate; - padapter->registrypriv.use_rate=_TRUE; - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): set rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); - } - else{ //not use the data rate - padapter->registrypriv.use_rate=_FALSE; - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) out of rate range\n",offset)); - } - } - else if (offset<=110){ //for setting debug level - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d) for set debug level\n",offset)); - if(offset==110){ //For query data rate - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): query dbg level=0x%.2x \n",offset,padapter->registrypriv.dbg_level)); - padapter->registrypriv.dbg_level=GlobalDebugLevel; - var=padapter->registrypriv.dbg_level; - } - else if(offset<110 && offset>100){ - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): set dbg level=0x%.2x \n",offset,offset-100)); - padapter->registrypriv.dbg_level=GlobalDebugLevel=offset-100; - var=padapter->registrypriv.dbg_level; - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_alert_, (" mp_query_drv_var(_drv_alert_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_crit_, (" mp_query_drv_var(_drv_crit_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_err_, (" mp_query_drv_var(_drv_err_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_warning_, (" mp_query_drv_var(_drv_warning_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_notice_, (" mp_query_drv_var(_drv_notice_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_info_, (" mp_query_drv_var(_drv_info_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - RT_TRACE(_module_mp_, _drv_debug_, (" mp_query_drv_var(_drv_debug_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); - - } - } - else if(offset >110 &&offset <116){ - if(115==offset){ - RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): query TRX access type: [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); - } - else { - switch(offset){ - case 111: - padapter->dvobjpriv.tx_block_mode=1; - padapter->dvobjpriv.rx_block_mode=1; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); - break; - case 112: - padapter->dvobjpriv.tx_block_mode=1; - padapter->dvobjpriv.rx_block_mode=0; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); - break; - case 113: - padapter->dvobjpriv.tx_block_mode=0; - padapter->dvobjpriv.rx_block_mode=1; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); - break; - case 114: - padapter->dvobjpriv.tx_block_mode=0; - padapter->dvobjpriv.rx_block_mode=0; - RT_TRACE(_module_mp_, _drv_emerg_, \ - (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ - offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); - break; - default : - break; - - } - - } - - } - else if(offset>=127){ - u64 prnt_dbg_comp; - u8 chg_idx; - u64 tmp_dbg_comp; - chg_idx=offset-0x80; - tmp_dbg_comp=BIT(chg_idx); - prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; - RT_TRACE(_module_mp_, _drv_emerg_, (" 1: mp_query_drv_var: offset(%d;0x%x):for dbg conpoment prnt_dbg_comp=0x%.16x GlobalDebugComponents=0x%.16x padapter->registrypriv.dbg_component=0x%.16x\n",offset,offset,prnt_dbg_comp,GlobalDebugComponents,padapter->registrypriv.dbg_component)); - if(offset==127){ - // prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; - var=(u32)(padapter->registrypriv.dbg_component); - RT_TRACE(0xffffffff, _drv_emerg_, ("2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) \n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); - prnt_dbg_comp=GlobalDebugComponents; - RT_TRACE(0xffffffff, _drv_emerg_, ("2-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); - prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; - RT_TRACE(0xffffffff, _drv_emerg_, ("2-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); - - } - else{ - RT_TRACE(0xffffffff, _drv_emerg_, ("3: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx)); - prnt_dbg_comp=GlobalDebugComponents; - RT_TRACE(0xffffffff, _drv_emerg_,("3-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));// ("3-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment=0x%x chg_idx=%d or0x%x BIT(chg_idx[%d]=0x%x)\n",offset,offset,prnt_dbg_comp,chg_idx,chg_idx,(chg_idx),tmp_dbg_comp) - prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; - RT_TRACE(0xffffffff, _drv_emerg_, ("3-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); - - if(GlobalDebugComponents&tmp_dbg_comp){ - //this bit is already set, now clear it - GlobalDebugComponents=GlobalDebugComponents&(~tmp_dbg_comp); - } - else{ - //this bit is not set, now set it. - GlobalDebugComponents =GlobalDebugComponents|tmp_dbg_comp; - } - RT_TRACE(0xffffffff, _drv_emerg_, ("4: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); - prnt_dbg_comp=GlobalDebugComponents; - RT_TRACE(0xffffffff, _drv_emerg_, ("4-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); - - RT_TRACE(_module_rtl871x_xmit_c_, _drv_emerg_, ("0: mp_query_drv_var(_module_rtl871x_xmit_c_:0): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,prnt_dbg_comp)); - RT_TRACE(_module_xmit_osdep_c_, _drv_emerg_, ("1: mp_query_drv_var(_module_xmit_osdep_c_:1): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_recv_c_, _drv_emerg_, ("2: mp_query_drv_var(_module_rtl871x_recv_c_:2): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_recv_osdep_c_, _drv_emerg_, ("3: mp_query_drv_var(_module_recv_osdep_c_:3): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_mlme_c_, _drv_emerg_, ("4: mp_query_drv_var(_module_rtl871x_mlme_c_:4): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_mlme_osdep_c_, _drv_emerg_, (" 5:mp_query_drv_var(_module_mlme_osdep_c_:5): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_emerg_, ("6: mp_query_drv_var(_module_rtl871x_sta_mgt_c_:6): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_cmd_c_, _drv_emerg_, ("7: mp_query_drv_var(_module_rtl871x_cmd_c_:7): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_cmd_osdep_c_, _drv_emerg_, ("8: mp_query_drv_var(_module_cmd_osdep_c_:8): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_io_c_, _drv_emerg_, ("9: mp_query_drv_var(_module_rtl871x_io_c_:9): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_io_osdep_c_, _drv_emerg_, ("10: mp_query_drv_var(_module_io_osdep_c_:10): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_os_intfs_c_, _drv_emerg_, ("11: mp_query_drv_var(_module_os_intfs_c_:11): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_security_c_, _drv_emerg_, ("12: mp_query_drv_var(_module_rtl871x_security_c_:12): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_eeprom_c_, _drv_emerg_, ("13: mp_query_drv_var(_module_rtl871x_eeprom_c_:13): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hal_init_c_, _drv_emerg_, ("14: mp_query_drv_var(_module_hal_init_c_:14): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_hal_init_c_, _drv_emerg_, ("15: mp_query_drv_var(_module_hci_hal_init_c_:15): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_ioctl_c_, _drv_emerg_, ("16: mp_query_drv_var(_module_rtl871x_ioctl_c_:16): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_emerg_, ("17: mp_query_drv_var(_module_rtl871x_ioctl_set_c_:17): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_ioctl_query_c_, _drv_emerg_, ("18: mp_query_drv_var(_module_rtl871x_ioctl_query_c_:18): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_emerg_, ("19: mp_query_drv_var(_module_rtl871x_pwrctrl_c_:19): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_intfs_c_, _drv_emerg_, ("20: mp_query_drv_var(_module_hci_intfs_c_:20): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_ops_c_, _drv_emerg_, ("21: mp_query_drv_var(_module_hci_ops_c_:21): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_osdep_service_c_, _drv_emerg_, ("22: mp_query_drv_var(_module_osdep_service_c_:22): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_mp_, _drv_emerg_, ("23: mp_query_drv_var(_module_mp_:23): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - RT_TRACE(_module_hci_ops_os_c_, _drv_emerg_, ("24: mp_query_drv_var(_module_hci_ops_os_c_:24): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - var=(u32)(GlobalDebugComponents); - //GlobalDebugComponents=padapter->registrypriv.dbg_component; - RT_TRACE(0xffffffff, _drv_emerg_, (" ==mp_query_drv_var(_module_mp_): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); - - } - } - else{ - RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) >110\n",offset)); - } -#endif -#endif - - return var; -#else - return 0; -#endif -} - -NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - DR_VARIABLE_STRUCT *pdrv_var; - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = sizeof(DR_VARIABLE_STRUCT); - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - RT_TRACE(_module_mp_, _drv_notice_, ("+Query Information, OID_RT_PRO_QUERY_DR_VARIABLE\n")); - - pdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - pdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset, pdrv_var->variable); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_notice_, - ("-oid_rt_pro_query_dr_variable_hdl: offset=0x%x valule=0x%x\n", - pdrv_var->offset, pdrv_var->variable)); - - return status; -#else - return 0; -#endif -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - RT_TRACE(_module_mp_, _drv_err_, ("oid_rt_pro_rx_packet_type_hdl...................\n")); -#if 0 - - if (poid_par_priv->information_buf_len < sizeof (UCHAR)) { - status = NDIS_STATUS_INVALID_LENGTH; - *poid_par_priv->bytes_needed = sizeof(UCHAR); - return status; - } - - if (poid_par_priv->type_of_oid == SET_OID) { - Adapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf; - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n",\ - Adapter->mppriv.rx_with_status)); - - //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); - //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n", - Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\ - Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5])); - - } - else { - *(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n", \ - Adapter->mppriv.rx_with_status)); - - //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); - //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n", - Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\ - Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5])); - } -#endif - - return NDIS_STATUS_SUCCESS; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - PEFUSE_ACCESS_STRUCT pefuse; - u8 *data; - u16 addr = 0, cnts = 0, max_available_size = 0; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(EFUSE_ACCESS_STRUCT)) - return NDIS_STATUS_INVALID_LENGTH; - - pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; - addr = pefuse->start_addr; - cnts = pefuse->cnts; - data = pefuse->data; - - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_read_efuse_hd: buf_len=%ld addr=%d cnts=%d\n", - poid_par_priv->information_buf_len, addr, cnts)); - - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - - if ((addr + cnts) > max_available_size) { - RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: parameter error!\n")); - return NDIS_STATUS_NOT_ACCEPTED; - } - - _irqlevel_changed_(&oldirql, LOWER); - if (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) { - RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: rtw_efuse_access FAIL!\n")); - status = NDIS_STATUS_FAILURE; - } else - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) -{ - - _irqL oldirql; - PEFUSE_ACCESS_STRUCT pefuse; - u8 *data; - u16 addr = 0, cnts = 0, max_available_size = 0; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; - addr = pefuse->start_addr; - cnts = pefuse->cnts; - data = pefuse->data; - - RT_TRACE(_module_mp_, _drv_notice_, - ("+oid_rt_pro_write_efuse_hdl: buf_len=%ld addr=0x%04x cnts=%d\n", - poid_par_priv->information_buf_len, addr, cnts)); - - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - - if ((addr + cnts) > max_available_size) { - RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_write_efuse_hdl: parameter error")); - return NDIS_STATUS_NOT_ACCEPTED; - } - - _irqlevel_changed_(&oldirql, LOWER); - if (rtw_efuse_access(Adapter, _TRUE, addr, cnts, data) == _FAIL) - status = NDIS_STATUS_FAILURE; - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - PPGPKT_STRUCT ppgpkt; - u8 tmpidx; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - -// RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_rw_efuse_pgpkt_hdl\n")); - - *poid_par_priv->bytes_rw = 0; - - if (poid_par_priv->information_buf_len < sizeof(PGPKT_STRUCT)) - return NDIS_STATUS_INVALID_LENGTH; - - ppgpkt = (PPGPKT_STRUCT)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - - if (poid_par_priv->type_of_oid == QUERY_OID) - { - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_rw_efuse_pgpkt_hdl: Read offset=0x%x\n",\ - ppgpkt->offset)); - - Efuse_PowerSwitch(Adapter, _FALSE, _TRUE); - if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE) - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - else - status = NDIS_STATUS_FAILURE; - Efuse_PowerSwitch(Adapter, _FALSE, _FALSE); - } else { - RT_TRACE(_module_mp_, _drv_notice_, - ("oid_rt_pro_rw_efuse_pgpkt_hdl: Write offset=0x%x word_en=0x%x\n",\ - ppgpkt->offset, ppgpkt->word_en)); - - Efuse_PowerSwitch(Adapter, _TRUE, _TRUE); - if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE) - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - else - status = NDIS_STATUS_FAILURE; - Efuse_PowerSwitch(Adapter, _TRUE, _FALSE); - } - - _irqlevel_changed_(&oldirql, RAISE); - - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_pro_rw_efuse_pgpkt_hdl: status=0x%08X\n", status)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u16 size; - u8 ret; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len information_buf = size; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_FAILURE; - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - u16 max_size; - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - *(u32*)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_get_efuse_max_size_hdl: size=%d status=0x%08X\n", - *(int*)poid_par_priv->information_buf, status)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_efuse_hdl\n")); - - if (poid_par_priv->type_of_oid == QUERY_OID) - status = oid_rt_pro_read_efuse_hdl(poid_par_priv); - else - status = oid_rt_pro_write_efuse_hdl(poid_par_priv); - - RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_efuse_hdl: status=0x%08X\n", status)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) -{ - _irqL oldirql; - u8 *data; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - u16 mapLen=0; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_efuse_map_hdl\n")); - - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); - - *poid_par_priv->bytes_rw = 0; - - if (poid_par_priv->information_buf_len < mapLen) - return NDIS_STATUS_INVALID_LENGTH; - - data = (u8*)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - - if (poid_par_priv->type_of_oid == QUERY_OID) - { - RT_TRACE(_module_mp_, _drv_info_, - ("oid_rt_pro_efuse_map_hdl: READ\n")); - - if (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS) - *poid_par_priv->bytes_rw = mapLen; - else { - RT_TRACE(_module_mp_, _drv_err_, - ("oid_rt_pro_efuse_map_hdl: READ fail\n")); - status = NDIS_STATUS_FAILURE; - } - } else { - // SET_OID - RT_TRACE(_module_mp_, _drv_info_, - ("oid_rt_pro_efuse_map_hdl: WRITE\n")); - - if (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS) - *poid_par_priv->bytes_rw = mapLen; - else { - RT_TRACE(_module_mp_, _drv_err_, - ("oid_rt_pro_efuse_map_hdl: WRITE fail\n")); - status = NDIS_STATUS_FAILURE; - } - } - - _irqlevel_changed_(&oldirql, RAISE); - - RT_TRACE(_module_mp_, _drv_info_, - ("-oid_rt_pro_efuse_map_hdl: status=0x%08X\n", status)); - -_func_exit_; - - return status; -} - -NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - - u32 crystal_cap = 0; - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len information_buf);//4 - if (crystal_cap > 0xf) - return NDIS_STATUS_NOT_ACCEPTED; - - Adapter->mppriv.curr_crystalcap = crystal_cap; - - _irqlevel_changed_(&oldirql,LOWER); - SetCrystalCap(Adapter); - _irqlevel_changed_(&oldirql,RAISE); - -_func_exit_; - -#endif - return status; -} - -NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - u8 rx_pkt_type; - u32 rcr_val32; - -_func_enter_; - - RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_set_rx_packet_type_hdl\n")); - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - rx_pkt_type = *((u8*)poid_par_priv->information_buf);//4 - - RT_TRACE(_module_mp_, _drv_info_, ("rx_pkt_type: %x\n",rx_pkt_type )); -#if 0 - _irqlevel_changed_(&oldirql, LOWER); -#if 0 - rcr_val8 = rtw_read8(Adapter, 0x10250048);//RCR - rcr_val8 &= ~(RCR_AB|RCR_AM|RCR_APM|RCR_AAP); - - if(rx_pkt_type == RX_PKT_BROADCAST){ - rcr_val8 |= (RCR_AB | RCR_ACRC32 ); - } - else if(rx_pkt_type == RX_PKT_DEST_ADDR){ - rcr_val8 |= (RCR_AAP| RCR_AM |RCR_ACRC32); - } - else if(rx_pkt_type == RX_PKT_PHY_MATCH){ - rcr_val8 |= (RCR_APM|RCR_ACRC32); - } - else{ - rcr_val8 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); - } - rtw_write8(Adapter, 0x10250048,rcr_val8); -#else - rcr_val32 = rtw_read32(Adapter, RCR);//RCR = 0x10250048 - rcr_val32 &= ~(RCR_CBSSID|RCR_AB|RCR_AM|RCR_APM|RCR_AAP); -#if 0 - if(rx_pkt_type == RX_PKT_BROADCAST){ - rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); - } - else if(rx_pkt_type == RX_PKT_DEST_ADDR){ - //rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32); - rcr_val32 |= (RCR_CBSSID|RCR_APM|RCR_ACRC32); - } - else if(rx_pkt_type == RX_PKT_PHY_MATCH){ - rcr_val32 |= (RCR_APM|RCR_ACRC32); - //rcr_val32 |= (RCR_AAP|RCR_ACRC32); - } - else{ - rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); - } -#else - switch (rx_pkt_type) - { - case RX_PKT_BROADCAST : - rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); - break; - case RX_PKT_DEST_ADDR : - rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); - break; - case RX_PKT_PHY_MATCH: - rcr_val32 |= (RCR_APM|RCR_ACRC32); - break; - default: - rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); - break; - } - - if (rx_pkt_type == RX_PKT_DEST_ADDR) { - Adapter->mppriv.check_mp_pkt = 1; - } else { - Adapter->mppriv.check_mp_pkt = 0; - } -#endif - rtw_write32(Adapter, RCR, rcr_val32); - -#endif - _irqlevel_changed_(&oldirql, RAISE); -#endif -_func_exit_; - - return status; -} - -NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - _irqL oldirql; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - u32 txagc; - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - txagc = *(u32*)poid_par_priv->information_buf; - RT_TRACE(_module_mp_, _drv_info_, - ("oid_rt_pro_set_tx_agc_offset_hdl: 0x%08x\n", txagc)); - - _irqlevel_changed_(&oldirql, LOWER); - SetTxAGCOffset(Adapter, txagc); - _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -#else - return 0; -#endif -} - -NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - struct mp_priv *pmppriv = &Adapter->mppriv; - u32 type; - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len information_buf; - - if (_LOOPBOOK_MODE_ == type) { - pmppriv->mode = type; - set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc - RT_TRACE(_module_mp_, _drv_info_, ("test mode change to loopback mode:0x%08x.\n", get_fwstate(pmlmepriv))); - } else if (_2MAC_MODE_ == type){ - pmppriv->mode = type; - _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE); - RT_TRACE(_module_mp_, _drv_info_, ("test mode change to 2mac mode:0x%08x.\n", get_fwstate(pmlmepriv))); - } else - status = NDIS_STATUS_NOT_ACCEPTED; - -_func_exit_; - - return status; -#else - return 0; -#endif -} - -unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) -{ - PMP_XMIT_PARM pparm; - PADAPTER padapter; - struct mp_priv *pmp_priv; - struct pkt_attrib *pattrib; - - RT_TRACE(_module_mp_, _drv_notice_, ("+%s\n", __func__)); - - pparm = (PMP_XMIT_PARM)poid_par_priv->information_buf; - padapter = (PADAPTER)poid_par_priv->adapter_context; - pmp_priv = &padapter->mppriv; - - if (poid_par_priv->type_of_oid == QUERY_OID) { - pparm->enable = !pmp_priv->tx.stop; - pparm->count = pmp_priv->tx.sended; - } else { - if (pparm->enable == 0) { - pmp_priv->tx.stop = 1; - } else if (pmp_priv->tx.stop == 1) { - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = pparm->count; - pmp_priv->tx.payload = pparm->payload_type; - pattrib = &pmp_priv->tx.attrib; - pattrib->pktlen = pparm->length; - _rtw_memcpy(pattrib->dst, pparm->da, ETH_ALEN); - SetPacketTx(padapter); - } else - return NDIS_STATUS_FAILURE; - } - - return NDIS_STATUS_SUCCESS; -} - -#if 0 -unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) -{ - unsigned char *pframe, *pmp_pkt; - struct ethhdr *pethhdr; - struct pkt_attrib *pattrib; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - int llc_sz, payload_len; - struct mp_xmit_frame *pxframe= NULL; - struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet*)param; - u8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55}; - -// DBG_8192C("+mp_ioctl_xmit_packet_hdl\n"); - - pxframe = alloc_mp_xmitframe(&padapter->mppriv); - if (pxframe == NULL) - { - DEBUG_ERR(("Can't alloc pmpframe %d:%s\n", __LINE__, __FILE__)); - return -1; - } - - //mp_xmit_pkt - payload_len = pmp_xmitpkt->len - 14; - pmp_pkt = (unsigned char*)pmp_xmitpkt->mem; - pethhdr = (struct ethhdr *)pmp_pkt; - - //DBG_8192C("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem); - - //DBG_8192C("pxframe=0x%x\n", (void*)pxframe); - //DBG_8192C("pxframe->mem=0x%x\n", (void*)pxframe->mem); - - //update attribute - pattrib = &pxframe->attrib; - memset((u8 *)(pattrib), 0, sizeof (struct pkt_attrib)); - pattrib->pktlen = pmp_xmitpkt->len; - pattrib->ether_type = ntohs(pethhdr->h_proto); - pattrib->hdrlen = 24; - pattrib->nr_frags = 1; - pattrib->priority = 0; -#ifndef CONFIG_MP_LINUX - if(IS_MCAST(pethhdr->h_dest)) - pattrib->mac_id = 4; - else - pattrib->mac_id = 5; -#else - pattrib->mac_id = 5; -#endif - - // - memset(pxframe->mem, 0 , WLANHDR_OFFSET); - pframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET; - - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - SetFrameSubType(pframe, WIFI_DATA); - - _rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr3, addr3, ETH_ALEN); - - pwlanhdr->seq_ctl = 0; - pframe += pattrib->hdrlen; - - llc_sz= rtw_put_snap(pframe, pattrib->ether_type); - pframe += llc_sz; - - _rtw_memcpy(pframe, (void*)(pmp_pkt+14), payload_len); - - pattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len; - - DEBUG_INFO(("issuing mp_xmit_frame, tx_len=%d, ether_type=0x%x\n", pattrib->last_txcmdsz, pattrib->ether_type)); - xmit_mp_frame(padapter, pxframe); - - return _SUCCESS; -} -#endif -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - _irqL oldirql; - u8 bpwrup; - -_func_enter_; - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - RT_TRACE(_module_mp_, _drv_info_, - ("\n ===> Setoid_rt_set_power_down_hdl.\n")); - - _irqlevel_changed_(&oldirql, LOWER); - - bpwrup = *(u8 *)poid_par_priv->information_buf; - //CALL the power_down function -#ifdef PLATFORM_LINUX -#ifdef CONFIG_SDIO_HCI - dev_power_down(Adapter,bpwrup); -#endif -#endif - _irqlevel_changed_(&oldirql, RAISE); - - //DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER. - // Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value)); - -_func_exit_; - - return status; -} -//------------------------------------------------------------------------------ -NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); -// _irqL oldirql; - -_func_enter_; - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len < sizeof(u32)) { - status = NDIS_STATUS_INVALID_LENGTH; - return status; - } - - RT_TRACE(_module_mp_, _drv_info_, - ("\n ===> oid_rt_get_power_mode_hdl.\n")); - -// _irqlevel_changed_(&oldirql, LOWER); - *(int*)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; -// _irqlevel_changed_(&oldirql, RAISE); - -_func_exit_; - - return status; -#else - return 0; -#endif -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_p2p.c b/drivers/net/wireless/rtl8192c/core/rtw_p2p.c deleted file mode 100755 index 22a64470dc73..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_p2p.c +++ /dev/null @@ -1,1726 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTW_P2P_C_ - -#include -#include -#include - -#ifdef CONFIG_P2P - - -static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) -{ - _list *phead, *plist; - u32 len=0; - u16 attr_len = 0; - u8 tmplen, *pdata_attr, *pstart, *pcur; - struct sta_info *psta = NULL; - _adapter *padapter = pwdinfo->padapter; - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_871X("%s\n", __FUNCTION__); - - pdata_attr = rtw_zmalloc(MAX_P2P_IE_LEN); - - pstart = pdata_attr; - pcur = pdata_attr; - - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //look up sta asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - - if(psta->is_p2p_device) - { - tmplen = 0; - - pcur++; - - //P2P device address - _rtw_memcpy(pcur, psta->dev_addr, ETH_ALEN); - pcur += ETH_ALEN; - - //P2P interface address - _rtw_memcpy(pcur, psta->hwaddr, ETH_ALEN); - pcur += ETH_ALEN; - - *pcur = psta->dev_cap; - pcur++; - - //*(u16*)(pcur) = cpu_to_be16(psta->config_methods); - RTW_PUT_BE16(pcur, psta->config_methods); - pcur += 2; - - _rtw_memcpy(pcur, psta->primary_dev_type, 8); - pcur += 8; - - *pcur = psta->num_of_secdev_type; - pcur++; - - _rtw_memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8); - pcur += psta->num_of_secdev_type*8; - - if(psta->dev_name_len>0) - { - //*(u16*)(pcur) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - RTW_PUT_BE16(pcur, WPS_ATTR_DEVICE_NAME); - pcur += 2; - - //*(u16*)(pcur) = cpu_to_be16( psta->dev_name_len ); - RTW_PUT_BE16(pcur, psta->dev_name_len); - pcur += 2; - - _rtw_memcpy(pcur, psta->dev_name, psta->dev_name_len); - pcur += psta->dev_name_len; - } - - - tmplen = (u8)(pcur-pstart); - - *pstart = (tmplen-1); - - attr_len += tmplen; - - //pstart += tmplen; - pstart = pcur; - - } - - - } - - if(attr_len>0) - { - len = rtw_set_p2p_attr_content(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr); - } - - rtw_mfree(pdata_attr, MAX_P2P_IE_LEN); - - return len; - -} - -static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - _adapter *padapter = pwdinfo->padapter; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - unsigned char category = WLAN_CATEGORY_P2P;//P2P action frame - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_GO_DISC_REQUEST; - u8 dialogToken=0; - - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - //Build P2P action frame header - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - //there is no IE in this P2P action frame - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - -} - -static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - _adapter *padapter = pwdinfo->padapter; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_DEVDISC_RESP; - u8 p2pie[8] = { 0x00 }; - u32 p2pielen = 0; - - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pwdinfo->device_addr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - //Build P2P public action frame header - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - - //Build P2P IE - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // P2P_ATTR_STATUS - p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen); - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - -} - -static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method) -{ - _adapter *padapter = pwdinfo->padapter; - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = frame_body[7]; // The Dialog Token of provisioning discovery request frame. - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PROVISION_DISC_RESP; - u8 wpsie[ 100 ] = { 0x00 }; - u8 wpsielen = 0; - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - wpsielen = 0; - // WPS OUI - //*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); - RTW_PUT_BE32(wpsie, WPSOUI); - wpsielen += 4; - -#if 0 - // WPS version - // Type: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); - wpsielen += 2; - - // Length: - *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); - wpsielen += 2; - - // Value: - wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 -#endif - - // Config Method - // Type: - //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); - RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD); - wpsielen += 2; - - // Length: - //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); - RTW_PUT_BE16(wpsie + wpsielen, 0x0002); - wpsielen += 2; - - // Value: - //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method ); - RTW_PUT_BE16(wpsie + wpsielen, config_method); - wpsielen += 2; - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - - return; - -} - -static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - _adapter *padapter = pwdinfo->padapter; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - unsigned char category = WLAN_CATEGORY_P2P;//P2P action frame - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PRESENCE_RESPONSE; - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u8 noa_attr_content[32] = { 0x00 }; - u32 p2pielen = 0; - - DBG_871X("[%s]\n", __FUNCTION__); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - - _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - //Build P2P action frame header - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); - - - //Add P2P IE header - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - //Add Status attribute in P2P IE - p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); - - //Add NoA attribute in P2P IE - noa_attr_content[0] = 0x1;//index - noa_attr_content[1] = 0x0;//CTWindow and OppPS Parameters - - //todo: Notice of Absence Descriptor(s) - - p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content); - - - - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &(pattrib->pktlen)); - - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe(padapter, pmgntframe); - -} - -u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) -{ - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u16 capability=0; - u32 len=0, p2pielen = 0; - - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - - // According to the P2P Specification, the beacon frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. P2P Device ID - // 3. Notice of Absence ( NOA ) - - // P2P Capability ATTR - // Type: - // Length: - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - // Group Capability Bitmap, 1 byte - capability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY; - capability |= ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8); - if(pwdinfo->p2p_state == P2P_STATE_PROVISIONING_ING) - capability |= (P2P_GRPCAP_GROUP_FORMATION<<8); - - capability = cpu_to_le16(capability); - - p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability); - - - // P2P Device ID ATTR - p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr); - - - // Notice of Absence ATTR - // Type: - // Length: - // Value: - - //go_add_noa_attr(pwdinfo); - - - pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - - - return len; - -} - -u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) -{ - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u32 len=0, p2pielen = 0; - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20100907 - // According to the P2P Specification, the probe response frame should contain 5 P2P attributes - // 1. P2P Capability - // 2. Extended Listen Timing - // 3. Notice of Absence ( NOA ) ( Only GO needs this ) - // 4. Device Info - // 5. Group Info ( Only GO need this ) - - // P2P Capability ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - RTW_PUT_LE16(p2pie + p2pielen, 0x0002); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY; - - // Group Capability Bitmap, 1 byte - if(pwdinfo->role == P2P_ROLE_GO) - { - p2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS); - - if(pwdinfo->p2p_state == P2P_STATE_PROVISIONING_ING) - p2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION; - - p2pielen++; - } - else if ( pwdinfo->role == P2P_ROLE_DEVICE ) - { - // Group Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = 0x00; - } - - // Extended Listen Timing ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); - RTW_PUT_LE16(p2pie + p2pielen, 0x0004); - p2pielen += 2; - - // Value: - // Availability Period - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); - p2pielen += 2; - - // Availability Interval - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); - RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); - p2pielen += 2; - - - // Notice of Absence ATTR - // Type: - // Length: - // Value: - if(pwdinfo->role == P2P_ROLE_GO) - { - //go_add_noa_attr(pwdinfo); - } - - // Device Info ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); - RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm); - p2pielen += 2; - - // Primary Device Type - // Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_RTK_WIDI); - p2pielen += 2; - - // OUI - //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); - p2pielen += 4; - - // Sub Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_RTK_DMP); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); - p2pielen += 2; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - - // Group Info ATTR - // Type: - // Length: - // Value: - if(pwdinfo->role == P2P_ROLE_GO) - { - p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen); - } - - - pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - - - return len; - -} - -u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr ) -{ - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u32 len=0, p2pielen = 0; - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // Commented by Albert 20110301 - // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes - // 1. P2P Capability - // 2. Device Info - // 3. Group ID ( When joining an operating P2P Group ) - - // P2P Capability ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); - RTW_PUT_LE16(p2pie + p2pielen, 0x0002); - p2pielen += 2; - - // Value: - // Device Capability Bitmap, 1 byte - // Be able to participate in additional P2P Groups and - // support the P2P Invitation Procedure - p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; - - // Group Capability Bitmap, 1 byte - p2pie[ p2pielen++ ] = 0x00; - - - // Device Info ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; - - // Length: - // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) - // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); - RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); - p2pielen += 2; - - // Value: - // P2P Device Address - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - // Config Method - // This field should be big endian. Noted by P2P specification. - if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) - { - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_PBC); - } - else - { - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_DISPLAY); - } - - p2pielen += 2; - - // Primary Device Type - // Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_RTK_WIDI); - p2pielen += 2; - - // OUI - //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); - RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); - p2pielen += 4; - - // Sub Category ID - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_RTK_DMP); - p2pielen += 2; - - // Number of Secondary Device Types - p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List - - // Device Name - // Type: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); - RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); - p2pielen += 2; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); - RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); - p2pielen += pwdinfo->device_name_len; - - if ( pwdinfo->role == P2P_ROLE_CLIENT ) - { - // Added by Albert 2011/05/19 - // In this case, the pdev_raddr is the device address of the group owner. - - // P2P Group ID ATTR - // Type: - p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; - - // Length: - //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + ussidlen ); - RTW_PUT_LE16(p2pie + p2pielen, ETH_ALEN + ussidlen); - p2pielen += 2; - - // Value: - _rtw_memcpy( p2pie + p2pielen, pdev_raddr, ETH_ALEN ); - p2pielen += ETH_ALEN; - - _rtw_memcpy( p2pie + p2pielen, pssid, ussidlen ); - p2pielen += ussidlen; - - } - - pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - - - return len; - -} - - -u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code) -{ - u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; - u32 len=0, p2pielen = 0; - - // P2P OUI - p2pielen = 0; - p2pie[ p2pielen++ ] = 0x50; - p2pie[ p2pielen++ ] = 0x6F; - p2pie[ p2pielen++ ] = 0x9A; - p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 - - // According to the P2P Specification, the Association response frame should contain 2 P2P attributes - // 1. Status - // 2. Extended Listen Timing (optional) - - - // Status ATTR - p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code); - - - // Extended Listen Timing ATTR - // Type: - // Length: - // Value: - - - pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); - - return len; - -} - -u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) -{ - u32 len=0; - - return len; -} - -u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) -{ - u8 *p; - u32 ret=_FALSE; - u8 p2pie[ MAX_P2P_IE_LEN ] = { 0xFF }; - u32 p2pielen = 0; - int ssid_len=0, rate_cnt = 0; - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); - - if ( rate_cnt <= 4 ) - { - int i, g_rate =0; - - for( i = 0; i < rate_cnt; i++ ) - { - if ( ( ( *( p + 2 + i ) & 0xff ) != 0x02 ) && - ( ( *( p + 2 + i ) & 0xff ) != 0x04 ) && - ( ( *( p + 2 + i ) & 0xff ) != 0x0B ) && - ( ( *( p + 2 + i ) & 0xff ) != 0x16 ) ) - { - g_rate = 1; - } - } - - if ( g_rate == 0 ) - { - // There is no OFDM rate included in SupportedRates IE of this probe request frame - // The driver should response this probe request. - return ret; - } - } - else - { - // rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. - // We should proceed the following check for this probe request. - } - - // Added comments by Albert 20100906 - // There are several items we should check here. - // 1. This probe request frame must contain the P2P IE. (Done) - // 2. This probe request frame must contain the wildcard SSID. (Done) - // 3. Wildcard BSSID. (Todo) - // 4. Destination Address. ( Done in mgt_dispatcher function ) - // 5. Requested Device Type in WSC IE. (Todo) - // 6. Device ID attribute in P2P IE. (Todo) - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len, - len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); - - if((pwdinfo->role == P2P_ROLE_DEVICE) || (pwdinfo->role == P2P_ROLE_GO)) - { - if(rtw_get_p2p_ie( pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_ , len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_ , p2pie, &p2pielen)) - { - if ( (p != NULL) && _rtw_memcmp( ( void * ) ( p+2 ), ( void * ) pwdinfo->p2p_wildcard_ssid , 7 )) - { - //todo: - //Check Requested Device Type attributes in WSC IE. - //Check Device ID attribute in P2P IE - - ret = _TRUE; - } - } - else - { - //non -p2p device - } - - } - - - return ret; - -} - -u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *p2p_ie, uint p2p_ielen, struct sta_info *psta) -{ - u8 status_code = P2P_STATUS_SUCCESS; - u8 *pbuf, *pattr_content=NULL; - u32 attr_contentlen = 0; - u16 cap_attr=0; - - if(pwdinfo->role != P2P_ROLE_GO) - return P2P_STATUS_FAIL_REQUEST_UNABLE; - - //Check P2P Capability ATTR - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen)==_FALSE) - return P2P_STATUS_FAIL_INVALID_PARAM; - - cap_attr = le16_to_cpu(cap_attr); - psta->dev_cap = cap_attr&0xff; - - - //Check Extended Listen Timing ATTR - - - //Check P2P Device Info ATTR - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen)==_TRUE) - { - pattr_content = pbuf = rtw_zmalloc(attr_contentlen); - if(pattr_content) - { - u8 num_of_secdev_type; - u16 dev_name_len; - - - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO , pattr_content, (uint*)&attr_contentlen); - - _rtw_memcpy(psta->dev_addr, pattr_content, ETH_ALEN);//P2P Device Address - - pattr_content += ETH_ALEN; - - _rtw_memcpy(&psta->config_methods, pattr_content, 2);//Config Methods - psta->config_methods = be16_to_cpu(psta->config_methods); - - pattr_content += 2; - - _rtw_memcpy(psta->primary_dev_type, pattr_content, 8); - - pattr_content += 8; - - num_of_secdev_type = *pattr_content; - pattr_content += 1; - - if(num_of_secdev_type==0) - { - psta->num_of_secdev_type = 0; - } - else - { - u32 len; - - psta->num_of_secdev_type = num_of_secdev_type; - - len = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8); - - _rtw_memcpy(psta->secdev_types_list, pattr_content, len); - - pattr_content += (num_of_secdev_type*8); - } - - - //dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8); - psta->dev_name_len=0; - if(WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content)) - { - dev_name_len = be16_to_cpu(*(u16*)(pattr_content+2)); - - psta->dev_name_len = (sizeof(psta->dev_name)dev_name):dev_name_len; - - _rtw_memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len); - } - - rtw_mfree(pbuf, attr_contentlen); - - } - - } - else - { - status_code = P2P_STATUS_FAIL_INVALID_PARAM; - } - - return status_code; - -} - -u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) -{ - u8 *frame_body; - u8 status, dialogToken; - struct sta_info *psta = NULL; - _adapter *padapter = pwdinfo->padapter; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 p2p_ie[ MAX_P2P_IE_LEN ] = { 0xFF }; - u32 p2p_ielen = 0; - - frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); - - dialogToken = frame_body[7]; - status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; - - if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - u8 groupid[ 38 ] = { 0x00 }; - u8 dev_addr[ETH_ALEN] = { 0x00 }; - u32 attr_contentlen = 0; - - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) - { - if(_rtw_memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) && - _rtw_memcmp(pwdinfo->p2p_group_ssid, groupid+ETH_ALEN, pwdinfo->p2p_group_ssid_len)) - { - attr_contentlen=0; - if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen)) - { - _list *phead, *plist; - phead = &pstapriv->asoc_list; - plist = get_next(phead); - - //look up sta asoc_queue - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); - - plist = get_next(plist); - - if(psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) && - _rtw_memcmp(psta->dev_addr, dev_addr, ETH_ALEN)) - { - - //issue GO Discoverability Request - issue_group_disc_req(pwdinfo, psta->hwaddr); - - status = P2P_STATUS_SUCCESS; - - break; - } - else - { - status = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - } - - } - - } - else - { - status = P2P_STATUS_FAIL_INVALID_PARAM; - } - - } - else - { - status = P2P_STATUS_FAIL_INVALID_PARAM; - } - - } - - } - - - //issue Device Discoverability Response - issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); - - - return (status==P2P_STATUS_SUCCESS) ? _TRUE:_FALSE; - -} - -u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) -{ - return _TRUE; -} - -u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) -{ - u8 *frame_body; - u8 wpsie[255] = { 0x00 }; - uint wps_ielen = 0, attr_contentlen = 0; - u16 uconfig_method = 0; - - - frame_body = (pframe + sizeof(struct ieee80211_hdr_3addr)); - - if ( rtw_get_wps_ie_p2p( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wps_ielen) ) - { - if ( rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_CONF_METHOD , ( u8* ) &uconfig_method, &attr_contentlen) ) - { - uconfig_method = be16_to_cpu( uconfig_method ); - switch( uconfig_method ) - { - case WPS_CM_DISPLYA: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 ); - break; - } - case WPS_CM_LABEL: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "lab", 3 ); - break; - } - case WPS_CM_PUSH_BUTTON: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 ); - break; - } - case WPS_CM_KEYPAD: - { - _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 ); - break; - } - } - issue_p2p_provision_resp( pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method); - } - } - DBG_8192C( "[%s] config method = %s\n", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req ); - return _TRUE; - -} - -u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe) -{ - - return _TRUE; -} - - - -u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) -{ - u8 result = P2P_STATUS_SUCCESS; - u32 p2p_ielen, wps_ielen; - u8 p2p_ie[ 255 ]; - - if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO ) - { - result = P2P_STATUS_FAIL_INFO_UNAVAILABLE; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - return( result ); - } - - if ( rtw_get_wps_ie_p2p( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen) ) - { - - } - else - { - DBG_8192C( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); - result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - return( result ); - } - - if ( rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - u8 attr_content = 0x00; - u32 attr_contentlen = 0; - - if ( result != P2P_STATUS_SUCCESS ) - { - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - } - else - { - pwdinfo->p2p_state = P2P_STATE_GONEGO_ING; - } - - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen); - DBG_8192C( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); - pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. - - if ( result == P2P_STATUS_SUCCESS ) - { - if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) - { - // Try to match the tie breaker value - if ( pwdinfo->intent == P2P_MAX_INTENT ) - { - pwdinfo->role = P2P_ROLE_DEVICE; - result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; - } - else - { - if ( attr_content & 0x01 ) - { - pwdinfo->role = P2P_ROLE_CLIENT; - } - else - { - pwdinfo->role = P2P_ROLE_GO; - } - } - } - else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) - { - pwdinfo->role = P2P_ROLE_GO; - } - else - { - pwdinfo->role = P2P_ROLE_CLIENT; - } - } - - attr_contentlen = 0; - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ); - - if ( attr_contentlen != ETH_ALEN ) - { - _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); - } - } - else - { - DBG_8192C( "[%s] P2P IE not Found!!\n", __FUNCTION__ ); - result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - } - - return( result ); -} - -u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) -{ - u8 result = P2P_STATUS_SUCCESS; - u32 p2p_ielen, wps_ielen; - u8 p2p_ie[ 255 ]; - - - // Be able to know which one is the P2P GO and which one is P2P client. - - if ( rtw_get_wps_ie_p2p( pframe+ _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen) ) - { - - } - else - { - DBG_8192C( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); - result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - } - - if ( rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - u8 attr_content = 0x00; - u32 attr_contentlen = 0; - - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); - if ( attr_contentlen == 1 ) - { - uint ch_cnt = 0; - u8 ch_content[50] = { 0x00 }; - - DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); - if ( attr_content == P2P_STATUS_SUCCESS ) - { - - attr_contentlen = 0; - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ); - - if ( attr_contentlen != ETH_ALEN ) - { - _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); - } - - attr_content = 0x00; - attr_contentlen = 0; - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen); - DBG_8192C( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); - pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. - - if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) - { - // Try to match the tie breaker value - if ( pwdinfo->intent == P2P_MAX_INTENT ) - { - pwdinfo->role = P2P_ROLE_DEVICE; - result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - } - else - { - pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; - if ( attr_content & 0x01 ) - { - pwdinfo->role = P2P_ROLE_CLIENT; - } - else - { - pwdinfo->role = P2P_ROLE_GO; - } - } - } - else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) - { - pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; - pwdinfo->role = P2P_ROLE_GO; - } - else - { - pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; - pwdinfo->role = P2P_ROLE_CLIENT; - } - - if ( pwdinfo->role == P2P_ROLE_CLIENT ) - { - u8 operatingch_info[5] = { 0x00 }; - - attr_contentlen = 0; - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen); - DBG_8192C( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); - pwdinfo->peer_operating_ch = operatingch_info[4]; - } - } - else - { - pwdinfo->role = P2P_ROLE_DEVICE; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - result = attr_content; - } - - if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt) ) - { - pwdinfo->channel_cnt = ch_content[ 4 ]; // Number of Channels - _rtw_memcpy( pwdinfo->channel_list, &ch_content[ 5 ], pwdinfo->channel_cnt ); // Channel List - DBG_8192C( "[%s] channel count = %d\n", __FUNCTION__, pwdinfo->channel_cnt ); - } - else - { - DBG_8192C( "[%s] channel list attribute not found!\n", __FUNCTION__); - } - } - else - { - // the length of P2P STATUS ATTRIBUTE is not 1, doesn't match with the P2P specification. - pwdinfo->role = P2P_ROLE_DEVICE; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - } - } - else - { - pwdinfo->role = P2P_ROLE_DEVICE; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; - } - - return( result ); - -} - -u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) -{ - u32 p2p_ielen; - u8 p2p_ie[ 255 ]; - u8 result = P2P_STATUS_SUCCESS; - - if ( rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) - { - u8 attr_content = 0x00, operatingch_info[5] = { 0x00 }; - u8 groupid[ 38 ] = { 0x00 }; - u32 attr_contentlen = 0; - - - pwdinfo->negotiation_dialog_token = 1; - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); - if ( attr_contentlen == 1 ) - { - DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); - result = attr_content; - - if ( attr_content == P2P_STATUS_SUCCESS ) - { - u8 bcancelled = 0; - - _cancel_timer( &pwdinfo->restore_p2p_state_timer, &bcancelled ); - - // Commented by Albert 20100911 - // Todo: Need to handle the case which both Intents are the same. - pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; - if ( ( pwdinfo->intent ) > ( pwdinfo->peer_intent >> 1 ) ) - { - pwdinfo->role = P2P_ROLE_GO; - } - else if ( ( pwdinfo->intent ) < ( pwdinfo->peer_intent >> 1 ) ) - { - pwdinfo->role = P2P_ROLE_CLIENT; - } - else - { - // Have to compare the Tie Breaker - if ( pwdinfo->peer_intent & 0x01 ) - { - pwdinfo->role = P2P_ROLE_CLIENT; - } - else - { - pwdinfo->role = P2P_ROLE_GO; - } - } - rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen); - DBG_8192C( "[%s] Ssid = %s, ssidlen = %d\n", __FUNCTION__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN]) ); - - attr_contentlen = 0; - rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen); - DBG_8192C( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); - pwdinfo->peer_operating_ch = operatingch_info[4]; - } - else - { - pwdinfo->role = P2P_ROLE_DEVICE; - pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; - } - } - } - - return( result ); -} - -u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) -{ - u8 *frame_body; - u8 dialogToken=0; - u8 status = P2P_STATUS_SUCCESS; - - frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); - - dialogToken = frame_body[6]; - - //todo: check NoA attribute - - issue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); - - return _TRUE; -} - -void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength) -{ - u32 p2p_ielen = 0; - u32 attr_contentlen = 0; - u8 p2p_ie[ MAX_P2P_IE_LEN] = { 0x00 }; - u8 noa_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2 - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); - u8 find_p2p = _FALSE, find_p2p_ps = _FALSE; - u8 noa_offset, noa_num, noa_index; - u32 offset, cnt; - -_func_enter_; - - if ( pwdinfo->p2p_state == P2P_STATE_NONE ) - { - return; - } - - cnt = _BEACON_IE_OFFSET_; - while(cnt < IELength) - { - offset = rtw_get_p2p_ie( &IEs[cnt], IELength-cnt, p2p_ie, &p2p_ielen); - - if(offset) - { - find_p2p = _TRUE; - // Get Notice of Absence IE. - if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen)) - { - find_p2p_ps = _TRUE; - noa_index = noa_attr[0]; - - if( (pwdinfo->p2p_ps_enable == _FALSE) || - (noa_index != pwdinfo->noa_index) )// if index change, driver should reconfigure related setting. - { - pwdinfo->noa_index = noa_index; - pwdinfo->opp_ps = noa_attr[1] >> 7; - pwdinfo->ctwindow = noa_attr[1] & 0x7F; - - noa_offset = 2; - noa_num = 0; - // NoA length should be n*(13) + 2 - if(attr_contentlen > 2) - { - while(noa_offset < attr_contentlen) - { - //_rtw_memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); - pwdinfo->noa_count[noa_num] = noa_attr[noa_offset]; - noa_offset += 1; - - _rtw_memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4); - noa_offset += 4; - - _rtw_memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4); - noa_offset += 4; - - _rtw_memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4); - noa_offset += 4; - - noa_num++; - } - } - pwdinfo->noa_num = noa_num; - - if( pwdinfo->opp_ps == 1 ) - { - pwdinfo->p2p_ps_enable = _TRUE; - // driver should wait LPS for entering CTWindow - if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) - { - p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); - } - } - else if( pwdinfo->noa_num > 0 ) - { - pwdinfo->p2p_ps_enable = _TRUE; - p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); - } - else if( pwdinfo->p2p_ps_enable == _TRUE) - { - p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); - } - } - - break; // find target, just break. - } - - cnt += offset; - } - else // No p2p IE. - { - break; - } - } - - if(find_p2p == _TRUE) - { - if( (pwdinfo->p2p_ps_enable == _TRUE) && (find_p2p_ps == _FALSE) ) - { - p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); - } - } - -_func_exit_; -} - -void find_phase_handler( _adapter* padapter ) -{ - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - NDIS_802_11_SSID ssid; - _irqL irqL; - u8 _status = 0; - -_func_enter_; - - _rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID)); - _rtw_memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN ); - ssid.SsidLength = P2P_WILDCARD_SSID_LEN; - - pwdinfo->p2p_state = P2P_STATE_FIND_PHASE_SEARCH; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - _status = rtw_sitesurvey_cmd(padapter, &ssid); - _exit_critical_bh(&pmlmepriv->lock, &irqL); - - -_func_exit_; -} - -void restore_p2p_state_handler( _adapter* padapter ) -{ - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -_func_enter_; - - pwdinfo->p2p_state = pwdinfo->pre_p2p_state; - if ( pwdinfo->role != P2P_ROLE_CLIENT ) - { - // In the P2P client mode, the driver should not switch back to its listen channel - // because this P2P client should stay at the operating channel of P2P GO. - set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - } -_func_exit_; -} - - -void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType) -{ - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - -_func_enter_; - - switch(intCmdType) - { - case P2P_FIND_PHASE_WK: - { - find_phase_handler( padapter ); - break; - } - case P2P_RESTORE_STATE_WK: - { - restore_p2p_state_handler( padapter ); - break; - } - } - -_func_exit_; -} - - - -void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - -_func_enter_; - - // Pre action for p2p state - switch(p2p_ps_state) - { - case P2P_PS_ENABLE: - if( pwdinfo->ctwindow > 0 ) - { - if(pwrpriv->smart_ps != 0) - { - pwrpriv->smart_ps = 0; - DBG_871X("%s(): Enter CTW, change SmartPS\n", __FUNCTION__); - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); - } - } - break; - default: - break; - } - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); - - // clear P2P SW status - if(p2p_ps_state == P2P_PS_DISABLE) - { - pwdinfo->noa_index = 0; - pwdinfo->ctwindow = 0; - pwdinfo->opp_ps = 0; - pwdinfo->noa_num = 0; - pwdinfo->p2p_ps_enable = _FALSE; - if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) - { - if(pwrpriv->smart_ps == 0) - { - pwrpriv->smart_ps = 2; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); - } - } - } - -_func_exit_; -} - -u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue) -{ - struct cmd_obj *ph2c; - struct drvextra_cmd_parm *pdrvextra_cmd_parm; - struct wifidirect_info *pwdinfo= &(padapter->wdinfo); - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res = _SUCCESS; - -_func_enter_; - - if ( (pwdinfo->p2p_state == P2P_STATE_NONE) || - ( pwdinfo->p2p_ps == p2p_ps_state ) ) - { - return res; - } - - // driver only perform p2p ps when GO have Opp_Ps or NoA - if( pwdinfo->p2p_ps_enable ) - { - pwdinfo->p2p_ps = p2p_ps_state; - - if(enqueue) - { - ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); - if(ph2c==NULL){ - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); - if(pdrvextra_cmd_parm==NULL){ - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - res= _FAIL; - goto exit; - } - - pdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID; - pdrvextra_cmd_parm->type_size = p2p_ps_state; - pdrvextra_cmd_parm->pbuf = NULL; - - init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); - - res = rtw_enqueue_cmd(pcmdpriv, ph2c); - } - else - { - p2p_ps_wk_hdl(padapter, p2p_ps_state); - } - } - -exit: - -_func_exit_; - - return res; - -} - -#endif //CONFIG_P2P - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c b/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c deleted file mode 100755 index 5c574e309a4f..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c +++ /dev/null @@ -1,1128 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_PWRCTRL_C_ - -#include -#include -#include -#include - -#ifdef CONFIG_SDIO_HCI -#include -#endif - -#ifdef CONFIG_IPS -void ips_enter(_adapter * padapter) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - _enter_pwrlock(&pwrpriv->lock); - - pwrpriv->bips_processing = _TRUE; - - // syn ips_mode with request - pwrpriv->ips_mode = pwrpriv->ips_mode_req; - - pwrpriv->ips_enter_cnts++; - DBG_8192C("==>ips_enter cnts:%d\n",pwrpriv->ips_enter_cnts); - if(rf_off == pwrpriv->change_rfpwrstate ) - { - DBG_8192C("==>power_saving_ctrl_wk_hdl change rf to OFF...LED(0x%08x).... \n\n",rtw_read32(padapter,0x4c)); - - if(pwrpriv->ips_mode == IPS_LEVEL_2) { - u8 rf_type; - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - pwrpriv->bkeepfwalive = ( rf_type == RF_1T1R )? _TRUE : _FALSE;//rtl8192cu cannot support IPS_Level2 ,must debug - } - - rtw_ips_pwr_down(padapter); - pwrpriv->rf_pwrstate = rf_off; - } - pwrpriv->bips_processing = _FALSE; - _exit_pwrlock(&pwrpriv->lock); - -} - -int ips_leave(_adapter * padapter) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - int result = _SUCCESS; - sint keyid; - _enter_pwrlock(&pwrpriv->lock); - if((pwrpriv->rf_pwrstate == rf_off) &&(!pwrpriv->bips_processing)) - { - pwrpriv->change_rfpwrstate = rf_on; - pwrpriv->ips_leave_cnts++; - DBG_8192C("==>ips_leave cnts:%d\n",pwrpriv->ips_leave_cnts); - - result = rtw_ips_pwr_up(padapter); - pwrpriv->bips_processing = _TRUE; - pwrpriv->rf_pwrstate = rf_on; - - if((_WEP40_ == psecuritypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == psecuritypriv->dot11PrivacyAlgrthm)) - { - DBG_8192C("==>%s,channel(%d),processing(%x)\n",__FUNCTION__,padapter->mlmeextpriv.cur_channel,pwrpriv->bips_processing); - set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); - for(keyid=0;keyid<4;keyid++){ - if(pmlmepriv->key_mask & BIT(keyid)){ - if(keyid == psecuritypriv->dot11PrivacyKeyIndex) - result=rtw_set_key(padapter,psecuritypriv, keyid, 1); - else - result=rtw_set_key(padapter,psecuritypriv, keyid, 0); - } - } - } - - DBG_8192C("==> ips_leave.....LED(0x%08x)...\n",rtw_read32(padapter,0x4c)); - pwrpriv->bips_processing = _FALSE; - - pwrpriv->bkeepfwalive = _FALSE; - - - } - _exit_pwrlock(&pwrpriv->lock); - return result; -} - - -#endif - -#ifdef CONFIG_AUTOSUSPEND -extern void autosuspend_enter(_adapter* padapter); -extern int autoresume_enter(_adapter* padapter); -#endif -#ifdef SUPPORT_HW_RFOFF_DETECTED -int rtw_hw_suspend(_adapter *padapter ); -int rtw_hw_resume(_adapter *padapter); - -#endif - -#ifdef PLATFORM_LINUX -void rtw_ps_processor(_adapter*padapter) -{ -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); -#endif //CONFIG_P2P - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - int res; - rt_rf_power_state rfpwrstate; - -#ifdef SUPPORT_HW_RFOFF_DETECTED - if(pwrpriv->bips_processing == _TRUE) return; - - //DBG_8192C("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca)); - if(padapter->pwrctrlpriv.bHWPwrPindetect) - { - #ifdef CONFIG_AUTOSUSPEND - if(padapter->registrypriv.usbss_enable) - { - if(pwrpriv->rf_pwrstate == rf_on) - { - if(padapter->net_closed == _TRUE) - pwrpriv->ps_flag = _TRUE; - - rfpwrstate = RfOnOffDetect(padapter); - DBG_8192C("@@@@- #1 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); - if(rfpwrstate!= pwrpriv->rf_pwrstate) - { - if(rfpwrstate == rf_off) - { - pwrpriv->change_rfpwrstate = rf_off; - - pwrpriv->bkeepfwalive = _TRUE; - pwrpriv->brfoffbyhw = _TRUE; - - autosuspend_enter(padapter); - } - } - } - } - else - #endif - { - rfpwrstate = RfOnOffDetect(padapter); - DBG_8192C("@@@@- #2 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); - - if(rfpwrstate!= pwrpriv->rf_pwrstate) - { - if(rfpwrstate == rf_off) - { - pwrpriv->change_rfpwrstate = rf_off; - pwrpriv->brfoffbyhw = _TRUE; - padapter->bCardDisableWOHSM = _TRUE; - rtw_hw_suspend(padapter ); - } - else - { - pwrpriv->change_rfpwrstate = rf_on; - rtw_hw_resume(padapter ); - } - DBG_8192C("current rf_pwrstate(%s)\n",(pwrpriv->rf_pwrstate == rf_off)?"rf_off":"rf_on"); - } - } - pwrpriv->pwr_state_check_cnts ++; - } - -#endif - if( pwrpriv->power_mgnt == PS_MODE_ACTIVE ) return; - - if((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts%4)==0)) - { - if ( (check_fwstate(pmlmepriv, _FW_LINKED|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || - (padapter->bup == _FALSE) -#ifdef CONFIG_P2P - || (pwdinfo->p2p_state != P2P_STATE_NONE) -#endif //CONFIG_P2P - ) - { - return; - } - - DBG_8192C("==>%s .fw_state(%x)\n",__FUNCTION__,get_fwstate(pmlmepriv)); - pwrpriv->change_rfpwrstate = rf_off; - -#ifdef CONFIG_AUTOSUSPEND - if(padapter->registrypriv.usbss_enable) - { - if(padapter->pwrctrlpriv.bHWPwrPindetect) - pwrpriv->bkeepfwalive = _TRUE; - - if(padapter->net_closed == _TRUE) - pwrpriv->ps_flag = _TRUE; - - padapter->bCardDisableWOHSM = _TRUE; - autosuspend_enter(padapter); - } - else if(padapter->pwrctrlpriv.bHWPwrPindetect) - { - } - else -#endif - { -#ifdef CONFIG_IPS - ips_enter(padapter); -#endif - } - } - - -} - -void pwr_state_check_handler(void *FunctionContext) -{ - _adapter *padapter = (_adapter *)FunctionContext; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); -#endif //CONFIG_P2P - //DBG_871X("%s\n", __FUNCTION__); - -#ifdef SUPPORT_HW_RFOFF_DETECTED - //DBG_8192C("%s...bHWPwrPindetect(%d)\n",__FUNCTION__,padapter->pwrctrlpriv.bHWPwrPindetect); - if(padapter->pwrctrlpriv.bHWPwrPindetect) - { - rtw_ps_cmd(padapter); - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); - } - else -#endif - { - //if(padapter->net_closed == _TRUE) return; - //DBG_8192C("==>%s .fw_state(%x)\n", __FUNCTION__, get_fwstate(pmlmepriv)); - if ( (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, _FW_LINKED|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || - (padapter->bup == _FALSE) -#ifdef CONFIG_P2P - || (pwdinfo->p2p_state != P2P_STATE_NONE) -#endif //CONFIG_P2P - ) - { - //other pwr ctrl.... - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); - } - else - { - if((pwrpriv->rf_pwrstate == rf_on) &&(_FALSE == pwrpriv->bips_processing)) - { - pwrpriv->change_rfpwrstate = rf_off; - pwrctrlpriv->pwr_state_check_cnts = 0; - DBG_8192C("==>pwr_state_check_handler .fw_state(%x)\n",get_fwstate(pmlmepriv)); - rtw_ps_cmd(padapter); - } - - } - } - - - -} -#endif - - -#ifdef CONFIG_LPS -void rtw_set_rpwm(_adapter * padapter, u8 val8) -{ - u8 rpwm; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - -_func_enter_; - - if(pwrpriv->rpwm == val8){ - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("Already set rpwm [%d] ! \n", val8)); - return; - } - - if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)){ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_set_rpwm=> bDriverStopped or bSurpriseRemoved \n")); - return; - } - rpwm = val8 |pwrpriv->tog; - - pwrpriv->rpwm = val8; - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_set_rpwm: value = %x\n", rpwm)); - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); - - pwrpriv->tog += 0x80; - -_func_exit_; -} - -u8 PS_RDY_CHECK(_adapter * padapter) -{ - u32 curr_time, delta_time; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - curr_time = rtw_get_current_time(); - - delta_time = curr_time -pwrpriv->DelayLPSLastTimeStamp; - - if(delta_time < LPS_DELAY_TIME) - { - return _FALSE; - } - - if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) || - (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ) - return _FALSE; - - if(_TRUE == pwrpriv->bInSuspend ) - return _FALSE; - - if( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) ) - { - DBG_8192C("Group handshake still in progress !!!\n"); - return _FALSE; - } - - return _TRUE; -} - -void rtw_set_ps_mode(_adapter * padapter, u8 ps_mode, u8 smart_ps) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; -#ifdef CONFIG_P2P - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); -#endif //CONFIG_P2P - -_func_enter_; - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("========= Power Mode is :%d, Smart_PS = %d\n", ps_mode,smart_ps)); - //DBG_8192C("========= Power Mode is :%d, Smart_PS = %d\n", ps_mode,smart_ps); - - if(ps_mode > PM_Card_Disable) { - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("ps_mode:%d error\n", ps_mode)); - return; - } - - if((pwrpriv->pwr_mode == ps_mode) && - (pwrpriv->smart_ps == smart_ps)){ - return; - } - - //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) - if(ps_mode == PS_MODE_ACTIVE) - { -#ifdef CONFIG_P2P - if(pwdinfo->opp_ps == 0) -#endif //CONFIG_P2P - { - DBG_8192C("rtw_set_ps_mode(): Busy Traffic , Leave 802.11 power save..\n"); - pwrpriv->smart_ps = smart_ps; - pwrpriv->pwr_mode = ps_mode; - rtw_set_rpwm(padapter, PS_STATE_S4); - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); - pwrpriv->bFwCurrentInPSMode = _FALSE; - } - } - else - { - if(PS_RDY_CHECK(padapter)) - { - DBG_8192C("rtw_set_ps_mode(): Enter 802.11 power save mode...\n"); - pwrpriv->smart_ps = smart_ps; - pwrpriv->pwr_mode = ps_mode; - pwrpriv->bFwCurrentInPSMode = _TRUE; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); -#ifdef CONFIG_P2P - // Set CTWindow after LPS - if(pwdinfo->opp_ps == 1) - //if(pwdinfo->p2p_ps_enable == _TRUE) - p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0); -#endif //CONFIG_P2P - rtw_set_rpwm(padapter, PS_STATE_S2); - } - //else - //{ - // pwrpriv->pwr_mode = PS_MODE_ACTIVE; - //} - } - -_func_exit_; -} - - -// -// Description: -// Enter the leisure power save mode. -// -void LPS_Enter(PADAPTER padapter) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -_func_enter_; - - //DBG_8192C("LeisurePSEnter()...\n"); - - if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) || - (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ) - return; - - if(_TRUE == pwrpriv->bInSuspend ) - return ; - - if (pwrpriv->bLeisurePs) - { - // Idle for a while if we connect to AP a while ago. - if(pwrpriv->LpsIdleCount >= 2) // 4 Sec - { - if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) - { - rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, 2); - } - } - else - pwrpriv->LpsIdleCount++; - } - -_func_exit_; -} - - -// -// Description: -// Leave the leisure power save mode. -// -void LPS_Leave(PADAPTER padapter) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - -_func_enter_; - - //DBG_8192C("LeisurePSLeave()...\n"); - - if (pwrpriv->bLeisurePs) - { - if(pwrpriv->pwr_mode != PS_MODE_ACTIVE) - { - rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0); - } - } - -_func_exit_; -} - -#endif - -// -// Description: Leave all power save mode: LPS, FwLPS, IPS if needed. -// Move code to function by tynli. 2010.03.26. -// -void LeaveAllPowerSaveMode(IN PADAPTER Adapter) -{ - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - u32 LPSLeaveTimeOut = 10000; - //u32 IPSLeaveTimeOut = 10000; - -_func_enter_; - - //DBG_8192C("%s.....\n",__FUNCTION__); - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { //connect -#ifdef CONFIG_P2P - p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, 0); -#endif //CONFIG_P2P -#ifdef CONFIG_LPS - //DBG_8192C("==> leave LPS.......\n"); - LPS_Leave(Adapter); - - if (Adapter->pwrctrlpriv.bLeisurePs) - { - BOOLEAN bAwake = _TRUE; - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); - while(!bAwake) - { - rtw_usleep_os(100); - LPSLeaveTimeOut--; - if(LPSLeaveTimeOut <= 0) - { - DBG_8192C("Wait for FW LPS leave too long!!! LPSLeaveTimeOut = %d\n", LPSLeaveTimeOut ); - break; - } - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); - } - } -#endif - } - else - { - if(Adapter->pwrctrlpriv.rf_pwrstate== rf_off) - { - #ifdef CONFIG_AUTOSUSPEND - if(Adapter->registrypriv.usbss_enable) - { - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) - usb_disable_autosuspend(Adapter->dvobjpriv.pusbdev); - #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) - Adapter->dvobjpriv.pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user - #endif - } - else - #endif - { - /* - #ifdef CONFIG_IPS - if(_FALSE == ips_leave(Adapter)) - { - DBG_8192C("======> ips_leave fail.............\n"); - } - #endif - */ - } - } - } - -_func_exit_; -} - -#ifdef CONFIG_PWRCTRL - -/* -Caller:ISR handler... - -This will be called when CPWM interrupt is up. - -using to update cpwn of drv; and drv willl make a decision to up or down pwr level -*/ -void cpwm_int_hdl(_adapter *padapter, struct reportpwrstate_parm *preportpwrstate) -{ - struct pwrctrl_priv *pwrpriv = &(padapter->pwrctrlpriv); - struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - -_func_enter_; - - if(pwrpriv->cpwm_tog == ((preportpwrstate->state)&0x80)){ - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("cpwm_int_hdl : cpwm_tog = %x this time cpwm=0x%x toggle bit didn't change !!!\n",pwrpriv->cpwm_tog ,preportpwrstate->state)); - goto exit; - } - - _enter_pwrlock(&pwrpriv->lock); - - pwrpriv->cpwm = (preportpwrstate->state)&0xf; - - if(pwrpriv->cpwm >= PS_STATE_S2){ - if(pwrpriv->alives & CMD_ALIVE) - _rtw_up_sema(&(pcmdpriv->cmd_queue_sema)); - - if(pwrpriv->alives & XMIT_ALIVE) - _rtw_up_sema(&(pxmitpriv->xmit_sema)); - } - pwrpriv->cpwm_tog= (preportpwrstate->state)&0x80; - _exit_pwrlock(&pwrpriv->lock); -exit: - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("cpwm_int_hdl : cpwm = %x !!!\n",pwrpriv->cpwm)); - -_func_exit_; - -} - - -__inline static void register_task_alive(struct pwrctrl_priv *pwrctrl, uint tag) -{ -_func_enter_; - pwrctrl->alives |= tag; -_func_exit_; -} - -__inline static void unregister_task_alive(struct pwrctrl_priv *pwrctrl, uint tag) -{ -_func_enter_; - - if (pwrctrl->alives & tag) - pwrctrl->alives ^= tag; - -_func_exit_; -} -#endif - -#ifdef CONFIG_RESUME_IN_WORKQUEUE -static void resume_workitem_callback(struct work_struct *work); -#endif //CONFIG_RESUME_IN_WORKQUEUE - -void rtw_init_pwrctrl_priv(_adapter *padapter) -{ - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - -_func_enter_; - -#ifdef PLATFORM_WINDOWS - pwrctrlpriv->pnp_current_pwr_state=NdisDeviceStateD0; -#endif - - _init_pwrlock(&pwrctrlpriv->lock); - pwrctrlpriv->rf_pwrstate = rf_on; - pwrctrlpriv->ips_enter_cnts=0; - pwrctrlpriv->ips_leave_cnts=0; - - pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode; - pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode; - - pwrctrlpriv->pwr_state_check_inverval = 2000; - pwrctrlpriv->pwr_state_check_cnts = 0; - pwrctrlpriv->bInternalAutoSuspend = _FALSE; - pwrctrlpriv->bInSuspend = _FALSE; - pwrctrlpriv->bkeepfwalive = _FALSE; - -#ifdef CONFIG_AUTOSUSPEND -#ifdef SUPPORT_HW_RFOFF_DETECTED - pwrctrlpriv->pwr_state_check_inverval = (pwrctrlpriv->bHWPwrPindetect) ?1000:2000; -#endif -#endif - - pwrctrlpriv->LpsIdleCount = 0; - //pwrctrlpriv->FWCtrlPSMode =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; - pwrctrlpriv->power_mgnt =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; - pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE; - - pwrctrlpriv->bFwCurrentInPSMode = _FALSE; - - pwrctrlpriv->cpwm = PS_STATE_S4; - - pwrctrlpriv->pwr_mode = PS_MODE_ACTIVE; - - - pwrctrlpriv->smart_ps = 0; - - pwrctrlpriv->tog = 0x80; - -#ifdef PLATFORM_LINUX - _init_timer(&(pwrctrlpriv->pwr_state_check_timer), padapter->pnetdev, pwr_state_check_handler, (u8 *)padapter); -#endif - - #ifdef CONFIG_RESUME_IN_WORKQUEUE - _init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL); - pwrctrlpriv->rtw_workqueue = create_singlethread_workqueue("rtw_workqueue"); - #endif //CONFIG_RESUME_IN_WORKQUEUE - - #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) - pwrctrlpriv->early_suspend.suspend = NULL; - rtw_register_early_suspend(pwrctrlpriv); - #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER - - -_func_exit_; - -} - - -void rtw_free_pwrctrl_priv(_adapter *adapter) -{ - struct pwrctrl_priv *pwrctrlpriv = &adapter->pwrctrlpriv; - -_func_enter_; - - //_rtw_memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv)); - - - #ifdef CONFIG_RESUME_IN_WORKQUEUE - if (pwrctrlpriv->rtw_workqueue) { - flush_workqueue(pwrctrlpriv->rtw_workqueue); - destroy_workqueue(pwrctrlpriv->rtw_workqueue); - } - #endif - - - #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) - rtw_unregister_early_suspend(pwrctrlpriv); - #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER - - _free_pwrlock(&pwrctrlpriv->lock); - -_func_exit_; -} - - -/* -Caller: rtw_xmit_thread - -Check if the fw_pwrstate is okay for xmit. -If not (cpwm is less than P1 state), then the sub-routine -will raise the cpwm to be greater than or equal to P1. - -Calling Context: Passive - -Return Value: - -_SUCCESS: rtw_xmit_thread can write fifo/txcmd afterwards. -_FAIL: rtw_xmit_thread can not do anything. -*/ -sint rtw_register_tx_alive(_adapter *padapter) -{ - uint res = _SUCCESS; - -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - register_task_alive(pwrctrl, XMIT_ALIVE); - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_tx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - if(pwrctrl->cpwm < PS_STATE_S2){ - rtw_set_rpwm(padapter, PS_STATE_S3); - res = _FAIL; - } - - _exit_pwrlock(&pwrctrl->lock); - -_func_exit_; - -#endif /* CONFIG_PWRCTRL */ - - return res; - -} - -/* -Caller: rtw_cmd_thread - -Check if the fw_pwrstate is okay for issuing cmd. -If not (cpwm should be is less than P2 state), then the sub-routine -will raise the cpwm to be greater than or equal to P2. - -Calling Context: Passive - -Return Value: - -_SUCCESS: rtw_cmd_thread can issue cmds to firmware afterwards. -_FAIL: rtw_cmd_thread can not do anything. -*/ -sint rtw_register_cmd_alive(_adapter *padapter) -{ - uint res = _SUCCESS; - -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - register_task_alive(pwrctrl, CMD_ALIVE); - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_cmd_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - if(pwrctrl->cpwm < PS_STATE_S2){ - rtw_set_rpwm(padapter, PS_STATE_S3); - res = _FAIL; - } - - _exit_pwrlock(&pwrctrl->lock); -_func_exit_; -#endif - - return res; -} - - -/* -Caller: rx_isr - -Calling Context: Dispatch/ISR - -Return Value: - -*/ -sint rtw_register_rx_alive(_adapter *padapter) -{ - -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - register_task_alive(pwrctrl, RECV_ALIVE); - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_rx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - _exit_pwrlock(&pwrctrl->lock); - -_func_exit_; - -#endif /*CONFIG_PWRCTRL*/ - - return _SUCCESS; -} - - -/* -Caller: evt_isr or evt_thread - -Calling Context: Dispatch/ISR or Passive - -Return Value: -*/ -sint rtw_register_evt_alive(_adapter *padapter) -{ - -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - register_task_alive(pwrctrl, EVT_ALIVE); - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_info_,("rtw_register_evt_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - _exit_pwrlock(&pwrctrl->lock); - -_func_exit_; - -#endif /*CONFIG_PWRCTRL*/ - - return _SUCCESS; -} - - -/* -Caller: ISR - -If ISR's txdone, -No more pkts for TX, -Then driver shall call this fun. to power down firmware again. -*/ - -void rtw_unregister_tx_alive(_adapter *padapter) -{ -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - unregister_task_alive(pwrctrl, XMIT_ALIVE); - - if((pwrctrl->cpwm > PS_STATE_S2) && (pwrctrl->pwr_mode > PS_MODE_ACTIVE)){ - if(pwrctrl->alives == 0){ - rtw_set_rpwm(padapter, PS_STATE_S0); - } - } - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_tx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - _exit_pwrlock(&pwrctrl->lock); - -_func_exit_; - -#endif /*CONFIG_PWRCTRL*/ -} - -/* -Caller: ISR - -If ISR's txdone, -No more pkts for TX, -Then driver shall call this fun. to power down firmware again. -*/ - -void rtw_unregister_cmd_alive(_adapter *padapter) -{ -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - unregister_task_alive(pwrctrl, CMD_ALIVE); - - if((pwrctrl->cpwm > PS_STATE_S2) && (pwrctrl->pwr_mode > PS_MODE_ACTIVE)){ - if((pwrctrl->alives == 0)&&(check_fwstate(&padapter->mlmepriv, _FW_UNDER_LINKING)!=_TRUE)){ - rtw_set_rpwm(padapter, PS_STATE_S0); - } - } - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_cmd_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - _exit_pwrlock(&pwrctrl->lock); - -_func_exit_; - -#endif /*CONFIG_PWRCTRL*/ -} - - -/* - -Caller: ISR - -*/ -void rtw_unregister_rx_alive(_adapter *padapter) -{ -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - unregister_task_alive(pwrctrl, RECV_ALIVE); - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_rx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - _exit_pwrlock(&pwrctrl->lock); - -_func_exit_; - -#endif -} - - -void rtw_unregister_evt_alive(_adapter *padapter) -{ -#ifdef CONFIG_PWRCTRL - - struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; - -_func_enter_; - - _enter_pwrlock(&pwrctrl->lock); - - unregister_task_alive(pwrctrl, EVT_ALIVE); - - RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_evt_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); - - _exit_pwrlock(&pwrctrl->lock); - -_func_exit_; - -#endif /*CONFIG_PWRCTRL*/ -} - -#ifdef CONFIG_RESUME_IN_WORKQUEUE -#ifdef CONFIG_USB_HCI -extern int rtw_resume_process(struct usb_interface *pusb_intf); -#endif -static void resume_workitem_callback(struct work_struct *work) -{ - struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, resume_work); - _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); - - DBG_871X("%s\n",__FUNCTION__); - - #ifdef CONFIG_USB_HCI - rtw_resume_process(adapter->dvobjpriv.pusbintf); - #elif defined(CONFIG_PCI_HCI) - #endif - -} - -void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv) -{ - // accquire system's suspend lock preventing from falliing asleep while resume in workqueue - rtw_lock_suspend(); - - #if 1 - queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work); - #else - _set_workitem(&pwrpriv->resume_work); - #endif -} -#endif //CONFIG_RESUME_IN_WORKQUEUE - -#ifdef CONFIG_HAS_EARLYSUSPEND -#ifdef CONFIG_USB_HCI -extern int rtw_resume_process(struct usb_interface *pusb_intf); -#endif -static void rtw_early_suspend(struct early_suspend *h) -{ - struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - DBG_871X("%s\n",__FUNCTION__); - - //jeff: do nothing but set do_late_resume to false - pwrpriv->do_late_resume = _FALSE; -} - -static void rtw_late_resume(struct early_suspend *h) -{ - struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); - - DBG_871X("%s\n",__FUNCTION__); - if(pwrpriv->do_late_resume) { - #ifdef CONFIG_USB_HCI - rtw_resume_process(adapter->dvobjpriv.pusbintf); - pwrpriv->do_late_resume = _FALSE; - #elif defined(CONFIG_PCI_HCI) - #endif - } -} - -void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) -{ - //DBG_871X("%s\n", __FUNCTION__); - - //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit - pwrpriv->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; - pwrpriv->early_suspend.suspend = rtw_early_suspend; - pwrpriv->early_suspend.resume = rtw_late_resume; - register_early_suspend(&pwrpriv->early_suspend); - - -} - -void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) -{ - DBG_871X("%s\n", __FUNCTION__); - - if (pwrpriv->early_suspend.suspend) - unregister_early_suspend(&pwrpriv->early_suspend); - - pwrpriv->early_suspend.suspend = NULL; - pwrpriv->early_suspend.resume = NULL; -} -#endif //CONFIG_HAS_EARLYSUSPEND - -#ifdef CONFIG_ANDROID_POWER -#ifdef CONFIG_USB_HCI -extern int rtw_resume_process(struct usb_interface *pusb_intf); -#endif -static void rtw_early_suspend(android_early_suspend_t *h) -{ - struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - DBG_871X("%s\n",__FUNCTION__); - - //jeff: do nothing but set do_late_resume to false - pwrpriv->do_late_resume = _FALSE; -} - -static void rtw_late_resume(android_early_suspend_t *h) -{ - struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); - _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); - - DBG_871X("%s\n",__FUNCTION__); - if(pwrpriv->do_late_resume) { - #ifdef CONFIG_USB_HCI - rtw_resume_process(adapter->dvobjpriv.pusbintf); - pwrpriv->do_late_resume = _FALSE; - #elif defined(CONFIG_PCI_HCI) - #endif - } -} - -void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) -{ -// DBG_871X("%s\n", __FUNCTION__); - - //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit - pwrpriv->early_suspend.level = ANDROID_EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; - pwrpriv->early_suspend.suspend = rtw_early_suspend; - pwrpriv->early_suspend.resume = rtw_late_resume; - android_register_early_suspend(&pwrpriv->early_suspend); -} - -void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) -{ - DBG_871X("%s\n", __FUNCTION__); - - if (pwrpriv->early_suspend.suspend) - android_unregister_early_suspend(&pwrpriv->early_suspend); - - pwrpriv->early_suspend.suspend = NULL; - pwrpriv->early_suspend.resume = NULL; -} -#endif //CONFIG_ANDROID_POWER - -u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val) -{ - u8 bResult = _TRUE; - if(padapter->HalFunc.interface_ps_func) - { - bResult = padapter->HalFunc.interface_ps_func(padapter,efunc_id,val); - } - return bResult; -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_recv.c b/drivers/net/wireless/rtl8192c/core/rtw_recv.c deleted file mode 100755 index 4c0ad26c2003..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_recv.c +++ /dev/null @@ -1,4445 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_RECV_C_ -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_USB_HCI -#include -#endif - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -#include -#include - -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS -static RTW_DECLARE_TIMER_HDL(signal_stat); -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - -void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv) -{ - - -_func_enter_; - - _rtw_memset((u8 *)psta_recvpriv, 0, sizeof (struct sta_recv_priv)); - - _rtw_spinlock_init(&psta_recvpriv->lock); - - //for(i=0; iblk_strms[i]); - - _rtw_init_queue(&psta_recvpriv->defrag_q); - -_func_exit_; - -} - -sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter) -{ - sint i; - - union recv_frame *precvframe; - - sint res=_SUCCESS; - -_func_enter_; - - _rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct recv_priv)); - - _rtw_spinlock_init(&precvpriv->lock); - - _rtw_init_queue(&precvpriv->free_recv_queue); - _rtw_init_queue(&precvpriv->recv_pending_queue); - - precvpriv->adapter = padapter; - - precvpriv->free_recvframe_cnt = NR_RECVFRAME; - - rtw_os_recv_resource_init(precvpriv, padapter); - - precvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); - - if(precvpriv->pallocated_frame_buf==NULL){ - res= _FAIL; - goto exit; - } - //_rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); - - precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ); - //precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ - - // ((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1)); - - precvframe = (union recv_frame*) precvpriv->precv_frame_buf; - - - for(i=0; i < NR_RECVFRAME ; i++) - { - _rtw_init_listhead(&(precvframe->u.list)); - - rtw_list_insert_tail(&(precvframe->u.list), &(precvpriv->free_recv_queue.queue)); - - res = rtw_os_recv_resource_alloc(padapter, precvframe); - - precvframe->u.hdr.adapter =padapter; - precvframe++; - - } - -#ifdef CONFIG_USB_HCI - - precvpriv->rx_pending_cnt=1; - - _rtw_init_sema(&precvpriv->allrxreturnevt, 0); - -#endif - - res = padapter->HalFunc.init_recv_priv(padapter); - -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - #ifdef PLATFORM_LINUX - _init_timer(&precvpriv->signal_stat_timer, padapter->pnetdev, RTW_TIMER_HDL_NAME(signal_stat), padapter); - #elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS) - _init_timer(&precvpriv->signal_stat_timer, padapter->hndis_adapter, RTW_TIMER_HDL_NAME(signal_stat), padapter); - #endif - - precvpriv->signal_stat_sampling_interval = 1000; //ms - //precvpriv->signal_stat_converging_constant = 5000; //ms - - rtw_set_signal_stat_timer(precvpriv); -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - -exit: - -_func_exit_; - - return res; - -} - -void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv) -{ - _rtw_spinlock_free(&precvpriv->lock); -#ifdef CONFIG_RECV_THREAD_MODE - _rtw_free_sema(&precvpriv->recv_sema); - _rtw_free_sema(&precvpriv->terminate_recvthread_sema); -#endif - - _rtw_spinlock_free(&precvpriv->free_recv_queue.lock); - _rtw_spinlock_free(&precvpriv->recv_pending_queue.lock); - - _rtw_spinlock_free(&precvpriv->free_recv_buf_queue.lock); - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - _rtw_spinlock_free(&precvpriv->recv_buf_pending_queue.lock); -#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX -} - -void _rtw_free_recv_priv (struct recv_priv *precvpriv) -{ - _adapter *padapter = precvpriv->adapter; - -_func_enter_; - - rtw_mfree_recv_priv_lock(precvpriv); - - rtw_os_recv_resource_free(precvpriv); - - if(precvpriv->pallocated_frame_buf) { - rtw_vmfree(precvpriv->pallocated_frame_buf, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); - } - - padapter->HalFunc.free_recv_priv(padapter); - -_func_exit_; - -} - -union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue) -{ - _irqL irqL; - union recv_frame *precvframe; - _list *plist, *phead; - _adapter *padapter; - struct recv_priv *precvpriv; -_func_enter_; - - _enter_critical_bh(&pfree_recv_queue->lock, &irqL); - - if(_rtw_queue_empty(pfree_recv_queue) == _TRUE) - { - precvframe = NULL; - } - else - { - phead = get_list_head(pfree_recv_queue); - - plist = get_next(phead); - - precvframe = LIST_CONTAINOR(plist, union recv_frame, u); - - rtw_list_delete(&precvframe->u.hdr.list); - padapter=precvframe->u.hdr.adapter; - if(padapter !=NULL){ - precvpriv=&padapter->recvpriv; - if(pfree_recv_queue == &precvpriv->free_recv_queue) - precvpriv->free_recvframe_cnt--; - } - } - - _exit_critical_bh(&pfree_recv_queue->lock, &irqL); - -_func_exit_; - - return precvframe; - -} - - -void rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpriv) -{ - struct recv_buf *precvbuf = precvframe->u.hdr.precvbuf; - - /* Perry: This can be removed */ - _rtw_init_listhead(&precvframe->u.hdr.list); - - precvframe->u.hdr.len=0; - - -} - - -int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue) -{ - _irqL irqL; - _adapter *padapter=precvframe->u.hdr.adapter; - struct recv_priv *precvpriv = &padapter->recvpriv; - -_func_enter_; - - -#ifdef PLATFORM_WINDOWS - rtw_os_read_port(padapter, precvframe->u.hdr.precvbuf); -#endif - -#ifdef PLATFORM_LINUX - - if(precvframe->u.hdr.pkt) - { - dev_kfree_skb_any(precvframe->u.hdr.pkt);//free skb by driver - precvframe->u.hdr.pkt = NULL; - } - -#ifdef CONFIG_SDIO_HCI -{ - _irqL irql; - struct recv_buf *precvbuf=precvframe->u.hdr.precvbuf; - if(precvbuf !=NULL){ - _enter_critical_bh(&precvbuf->recvbuf_lock, &irql); - - precvbuf->ref_cnt--; - if(precvbuf->ref_cnt == 0 ){ - _enter_critical_bh(&precvpriv->free_recv_buf_queue.lock, &irqL); - rtw_list_delete(&(precvbuf->list)); - rtw_list_insert_tail(&(precvbuf->list), get_list_head(&precvpriv->free_recv_buf_queue)); - precvpriv->free_recv_buf_queue_cnt++; - _exit_critical_bh(&precvpriv->free_recv_buf_queue.lock, &irqL); - RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("rtw_os_read_port: precvbuf=0x%p enqueue:precvpriv->free_recv_buf_queue_cnt=%d\n",precvbuf,precvpriv->free_recv_buf_queue_cnt)); - } - RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("rtw_os_read_port: precvbuf=0x%p enqueue:precvpriv->free_recv_buf_queue_cnt=%d\n",precvbuf,precvpriv->free_recv_buf_queue_cnt)); - _exit_critical_bh(&precvbuf->recvbuf_lock, &irql); - } -} -#endif -#endif - - _enter_critical_bh(&pfree_recv_queue->lock, &irqL); - - rtw_list_delete(&(precvframe->u.hdr.list)); - - rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(pfree_recv_queue)); - - if(padapter !=NULL){ - if(pfree_recv_queue == &precvpriv->free_recv_queue) - precvpriv->free_recvframe_cnt++; - } - - _exit_critical_bh(&pfree_recv_queue->lock, &irqL); - -_func_exit_; - - return _SUCCESS; - -} - - -union recv_frame *rtw_dequeue_recvframe (_queue *queue) -{ - return rtw_alloc_recvframe(queue); -} - - -sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) -{ - _irqL irqL; - _adapter *padapter=precvframe->u.hdr.adapter; - struct recv_priv *precvpriv = &padapter->recvpriv; - -_func_enter_; - - - //_spinlock(&pfree_recv_queue->lock); - _enter_critical_bh(&queue->lock, &irqL); - - //_rtw_init_listhead(&(precvframe->u.hdr.list)); - rtw_list_delete(&(precvframe->u.hdr.list)); - - - rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(queue)); - - if (padapter != NULL) { - if (queue == &precvpriv->free_recv_queue) - precvpriv->free_recvframe_cnt++; - } - - //_rtw_spinunlock(&pfree_recv_queue->lock); - _exit_critical_bh(&queue->lock, &irqL); - - -_func_exit_; - - return _SUCCESS; -} - -/* -sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) -{ - return rtw_free_recvframe(precvframe, queue); -} -*/ - - - - -/* -caller : defrag ; recvframe_chk_defrag in recv_thread (passive) -pframequeue: defrag_queue : will be accessed in recv_thread (passive) - -using spinlock to protect - -*/ - -void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue) -{ - union recv_frame *precvframe; - _list *plist, *phead; - -_func_enter_; - _rtw_spinlock(&pframequeue->lock); - - phead = get_list_head(pframequeue); - plist = get_next(phead); - - while(rtw_end_of_queue_search(phead, plist) == _FALSE) - { - precvframe = LIST_CONTAINOR(plist, union recv_frame, u); - - plist = get_next(plist); - - //rtw_list_delete(&precvframe->u.hdr.list); // will do this in rtw_free_recvframe() - - rtw_free_recvframe(precvframe, pfree_recv_queue); - } - - _rtw_spinunlock(&pframequeue->lock); - -_func_exit_; - -} - -sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue) -{ - _irqL irqL; - - _enter_critical(&queue->lock, &irqL); - - rtw_list_delete(&precvbuf->list); - - rtw_list_insert_tail(&precvbuf->list, get_list_head(queue)); - - _exit_critical(&queue->lock, &irqL); - - - return _SUCCESS; - -} - -struct recv_buf *rtw_dequeue_recvbuf (_queue *queue) -{ - _irqL irqL; - struct recv_buf *precvbuf; - _list *plist, *phead; - - _enter_critical(&queue->lock, &irqL); - - if(_rtw_queue_empty(queue) == _TRUE) - { - precvbuf = NULL; - } - else - { - phead = get_list_head(queue); - - plist = get_next(phead); - - precvbuf = LIST_CONTAINOR(plist, struct recv_buf, list); - - rtw_list_delete(&precvbuf->list); - - } - - _exit_critical(&queue->lock, &irqL); - - - return precvbuf; - -} - -static sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe){ - - sint i,res=_SUCCESS; - u32 datalen; - u8 miccode[8]; - u8 bmic_err=_FALSE,brpt_micerror = _TRUE; - u8 *pframe, *payload,*pframemic; - u8 *mickey,*iv,rxdata_key_idx; - struct sta_info *stainfo; - struct rx_pkt_attrib *prxattrib=&precvframe->u.hdr.attrib; - struct security_priv *psecuritypriv=&adapter->securitypriv; - - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -_func_enter_; - - stainfo=rtw_get_stainfo(&adapter->stapriv ,&prxattrib->ta[0]); - - if(prxattrib->encrypt ==_TKIP_) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:prxattrib->encrypt ==_TKIP_\n")); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5])); - - //calculate mic code - if(stainfo!= NULL) - { - if(IS_MCAST(prxattrib->ra)) - { - //mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0]; - //iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen; - //rxdata_key_idx =( ((iv[3])>>6)&0x3) ; - mickey=&psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0]; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic: bcmc key \n")); - //DBG_8192C("\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\n", - // psecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx); - - if(psecuritypriv->binstallGrpkey==_FALSE) - { - res=_FAIL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n")); - DBG_8192C("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n"); - goto exit; - } - } - else{ - mickey=&stainfo->dot11tkiprxmickey.skey[0]; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic: unicast key \n")); - } - - datalen=precvframe->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len-prxattrib->icv_len-8;//icv_len included the mic code - pframe=precvframe->u.hdr.rx_data; - payload=pframe+prxattrib->hdrlen+prxattrib->iv_len; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n",prxattrib->iv_len,prxattrib->icv_len)); - - //rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data - - rtw_seccalctkipmic(mickey,pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data - - pframemic=payload+datalen; - - bmic_err=_FALSE; - - for(i=0;i<8;i++){ - if(miccode[i] != *(pframemic+i)){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x) ",i,miccode[i],i,*(pframemic+i))); - bmic_err=_TRUE; - } - } - - - if(bmic_err==_TRUE){ - - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - *(pframemic-8),*(pframemic-7),*(pframemic-6),*(pframemic-5),*(pframemic-4),*(pframemic-3),*(pframemic-2),*(pframemic-1))); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - *(pframemic-16),*(pframemic-15),*(pframemic-14),*(pframemic-13),*(pframemic-12),*(pframemic-11),*(pframemic-10),*(pframemic-9))); - - { - uint i; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet (len=%d)======\n",precvframe->u.hdr.len)); - for(i=0;iu.hdr.len;i=i+8){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x", - *(precvframe->u.hdr.rx_data+i),*(precvframe->u.hdr.rx_data+i+1), - *(precvframe->u.hdr.rx_data+i+2),*(precvframe->u.hdr.rx_data+i+3), - *(precvframe->u.hdr.rx_data+i+4),*(precvframe->u.hdr.rx_data+i+5), - *(precvframe->u.hdr.rx_data+i+6),*(precvframe->u.hdr.rx_data+i+7))); - } - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet end [len=%d]======\n",precvframe->u.hdr.len)); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n hrdlen=%d, \n",prxattrib->hdrlen)); - } - - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d ", - prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2], - prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5],psecuritypriv->binstallGrpkey)); - - // double check key_index for some timing issue , - // cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue - if((IS_MCAST(prxattrib->ra)==_TRUE) && (prxattrib->key_index != pmlmeinfo->key_index )) - brpt_micerror = _FALSE; - - if((prxattrib->bdecrypted ==_TRUE)&& (brpt_micerror == _TRUE)) - { - rtw_handle_tkip_mic_err(adapter,(u8)IS_MCAST(prxattrib->ra)); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); - DBG_8192C(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); - } - else - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); - DBG_8192C(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); - } - - res=_FAIL; - - } - else{ - //mic checked ok - if((psecuritypriv->bcheck_grpkey ==_FALSE)&&(IS_MCAST(prxattrib->ra)==_TRUE)){ - psecuritypriv->bcheck_grpkey =_TRUE; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->bcheck_grpkey =_TRUE")); - } - } - - } - else - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic: rtw_get_stainfo==NULL!!!\n")); - } - - recvframe_pull_tail(precvframe, 8); - - } - -exit: - -_func_exit_; - - return res; - -} - -//decrypt and set the ivlen,icvlen of the recv_frame -static union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame) -{ - - struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - union recv_frame *return_packet=precv_frame; - -_func_enter_; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt)); - - if(prxattrib->encrypt>0) - { - u8 *iv = precv_frame->u.hdr.rx_data+prxattrib->hdrlen; - prxattrib->key_index = ( ((iv[3])>>6)&0x3) ; - - if(prxattrib->key_index > WEP_KEYS) - { - DBG_871X("prxattrib->key_index(%d) > WEP_KEYS \n", prxattrib->key_index); - - switch(prxattrib->encrypt){ - case _WEP40_: - case _WEP104_: - prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex; - break; - case _TKIP_: - case _AES_: - default: - prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid; - break; - } - } - } - - if((prxattrib->encrypt>0) && ((prxattrib->bdecrypted==0) ||(psecuritypriv->sw_decrypt==_TRUE))) - { - psecuritypriv->hw_decrypted=_FALSE; - - #ifdef DBG_RX_DECRYPTOR - DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n" - , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); - #endif - - switch(prxattrib->encrypt){ - case _WEP40_: - case _WEP104_: - rtw_wep_decrypt(padapter, (u8 *)precv_frame); - break; - case _TKIP_: - rtw_tkip_decrypt(padapter, (u8 *)precv_frame); - break; - case _AES_: - rtw_aes_decrypt(padapter, (u8 * )precv_frame); - break; - default: - break; - } - } - else if(prxattrib->bdecrypted==1 - && prxattrib->encrypt >0 - && (psecuritypriv->busetkipkey==1 || prxattrib->encrypt !=_TKIP_ ) - ) - { -#if 0 - if((prxstat->icv==1)&&(prxattrib->encrypt!=_AES_)) - { - psecuritypriv->hw_decrypted=_FALSE; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->hw_decrypted=_FALSE")); - - rtw_free_recvframe(precv_frame, &padapter->recvpriv.free_recv_queue); - - return_packet=NULL; - - } - else -#endif - { - psecuritypriv->hw_decrypted=_TRUE; - #ifdef DBG_RX_DECRYPTOR - DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n" - , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); - #endif - - } - } - else { - #ifdef DBG_RX_DECRYPTOR - DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, psecuritypriv->hw_decrypted:%d\n" - , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); - #endif - } - - //recvframe_chkmic(adapter, precv_frame); //move to recvframme_defrag function - -_func_exit_; - - return return_packet; - -} -//###set the security information in the recv_frame -static union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame) -{ - u8 *psta_addr,*ptr; - uint auth_alg; - struct recv_frame_hdr *pfhdr; - struct sta_info * psta; - struct sta_priv *pstapriv ; - union recv_frame * prtnframe; - u16 ether_type=0; - u16 eapol_type = 0x888e;//for Funia BD's WPA issue - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - -_func_enter_; - - pstapriv = &adapter->stapriv; - ptr = get_recvframe_data(precv_frame); - pfhdr = &precv_frame->u.hdr; - psta_addr = pfhdr->attrib.ta; - psta = rtw_get_stainfo(pstapriv, psta_addr); - - auth_alg = adapter->securitypriv.dot11AuthAlgrthm; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:adapter->securitypriv.dot11AuthAlgrthm= 0x%d\n",adapter->securitypriv.dot11AuthAlgrthm)); - - if(auth_alg==2) - { - if ((psta!=NULL) && (psta->ieee8021x_blocked)) - { - //blocked - //only accept EAPOL frame - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==1\n")); - - prtnframe=precv_frame; - - //get ether_type - ptr=ptr+pfhdr->attrib.hdrlen+pfhdr->attrib.iv_len+LLC_HEADER_SIZE; - _rtw_memcpy(ðer_type,ptr, 2); - ether_type= ntohs((unsigned short )ether_type); - - if (ether_type == eapol_type) { - prtnframe=precv_frame; - } - else { - //free this frame - rtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue); - prtnframe=NULL; - } - } - else - { - //allowed - //check decryption status, and decrypt the frame if needed - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==0\n")); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:precv_frame->hdr.attrib.privacy=%x\n",precv_frame->u.hdr.attrib.privacy)); - - if(pattrib->bdecrypted==0) - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:prxstat->decrypted=%x\n", pattrib->bdecrypted)); - - prtnframe=precv_frame; - //check is the EAPOL frame or not (Rekey) - if(ether_type == eapol_type){ - - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type == 0x888e\n")); - //check Rekey - - prtnframe=precv_frame; - } - else{ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type = 0x%.4x\n",ether_type)); - } - } - } - else - { - prtnframe=precv_frame; - } - -_func_exit_; - - return prtnframe; - -} - -static sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache) -{ - sint tid = precv_frame->u.hdr.attrib.priority; - - u16 seq_ctrl = ( (precv_frame->u.hdr.attrib.seq_num&0xffff) << 4) | - (precv_frame->u.hdr.attrib.frag_num & 0xf); - -_func_enter_; - - if(tid>15) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, (tid>15)! seq_ctrl=0x%x, tid=0x%x\n", seq_ctrl, tid)); - - return _FAIL; - } - - if(1)//if(bretry) - { - if(seq_ctrl == prxcache->tid_rxseq[tid]) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, seq_ctrl=0x%x, tid=0x%x, tid_rxseq=0x%x\n", seq_ctrl, tid, prxcache->tid_rxseq[tid])); - - return _FAIL; - } - } - - prxcache->tid_rxseq[tid] = seq_ctrl; - -_func_exit_; - - return _SUCCESS; - -} - -static void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame) -{ -#ifdef CONFIG_AP_MODE - unsigned char pwrbit; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta=NULL; - - psta = rtw_get_stainfo(pstapriv, pattrib->src); - - pwrbit = GetPwrMgt(ptr); - - if(psta) - { - if(pwrbit) - { - psta->state |= WIFI_SLEEP_STATE; - pstapriv->sta_dz_bitmap |= BIT(psta->aid); - //DBG_871X("to sleep, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); - } - else - { - if(psta->state & WIFI_SLEEP_STATE) - { - psta->state ^= WIFI_SLEEP_STATE; - - pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); - - //DBG_871X("to wakeup, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); - wakeup_sta_to_xmit(padapter, psta); - - } - } - - } - -#endif -} - -static void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame) -{ -#ifdef CONFIG_AP_MODE - struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta=NULL; - - psta = rtw_get_stainfo(pstapriv, pattrib->src); - - if(!psta) return; - - if(!psta->qos_option) - return; - - if(!(psta->qos_info&0xf)) - return; - - - if(psta->state&WIFI_SLEEP_STATE) - { - u8 wmmps_ac=0; - - switch(pattrib->priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(1); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(1); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(1); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(1); - break; - } - - if(wmmps_ac) - { - if(psta->sleepq_ac_len>0) - { - //process received triggered frame - xmit_delivery_enabled_frames(padapter, psta); - } - else - { - //issue one qos null frame with More data bit = 0 and the EOSP bit set (=1) - issue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority); - } - } - - } - - -#endif - -} - -#ifdef CONFIG_TDLS -sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - u8 *psa, *pmyid; - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct security_priv *psecuritypriv = &adapter->securitypriv; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *pdialog , *prsnie, *ppairwise_cipher; - u8 i, k, pairwise_count; - u8 ccmp_have=0, rsnie_have=0; - u16 j; - u8 SNonce[32]; - u32 *timeout_interval; - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE = 5; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - pmyid=myid(&(adapter->eeprompriv)); - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - - if(ptdls_sta==NULL ||(ptdls_sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) - { - if(ptdls_sta==NULL){ - ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); - }else{ - //If the direct link is already set up - //Process as re-setup after tear down - DBG_8192C("re-setup a direct link\n"); - } - - if(ptdls_sta) - { - //copy dialog token - pdialog=ptr+2; - //rx_pkt_pattrib->frag_num is used to fill dialog token - _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - rsnie_have=1; - if(prx_pkt_attrib->encrypt){ - prsnie=(u8*)pIE; - //check whether initiator STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1); - for(k=0;kstat_code=72; - } - } - break; - case _EXT_CAP_IE_: - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - if(prx_pkt_attrib->encrypt) - _rtw_memcpy(SNonce, (ptr+j+52), 32); - break; - case _TIMEOUT_ITVL_IE_: - if(prx_pkt_attrib->encrypt) - timeout_interval = (u32 *)(ptr+j+3); - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //check status code - //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject - if((rsnie_have && (prx_pkt_attrib->encrypt))|| - (rsnie_have==0 && (prx_pkt_attrib->encrypt==0))){ - ptdls_sta->stat_code=0; - }else if(rsnie_have && (prx_pkt_attrib->encrypt==0)){ - //security disabled - ptdls_sta->stat_code=5; - }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){ - //request haven't RSNIE - ptdls_sta->stat_code=38; - } - - ptdls_sta->state|= TDLS_INITIATOR_STATE; - ptdls_sta->aid=*(pdialog); - if(prx_pkt_attrib->encrypt){ - _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); - _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); - } - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt++; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - } - else - { - goto _exit_recv_tdls_frame; - } - } - //already receiving TDLS setup request - else if(ptdls_sta->state==TDLS_INITIATOR_STATE){ - DBG_8192C("receive duplicated TDLS setup request frame in handshaking\n"); - goto _exit_recv_tdls_frame; - } - //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator - //following is to check out MAC_addr - else if(ptdls_sta->state==TDLS_RESPONDER_STATE){ - DBG_8192C("receive setup_req after sending setUP_req\n"); - for (i=0;i<6;i++){ - if(*(pmyid+i)==*(psa+i)){ - } - else if(*(pmyid+i)>*(psa+i)){ - goto _exit_recv_tdls_frame; - }else if(*(pmyid+i)<*(psa+i)){ - ptdls_sta->state=TDLS_INITIATOR_STATE; - ptdls_sta->aid=*(pdialog); - break; - } - } - } - - issue_tdls_setup_rsp(adapter, precv_frame); - -_exit_recv_tdls_frame: - - return _FAIL; -} - - -sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa, *pdialog; - u16 stat_code; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - sint parsing_length; //frame body length, without icv_len - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =7; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; - u16 pairwise_count, j, k; - u8 verify_ccmp=0; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - _rtw_memcpy(&stat_code, ptr+2, 2); - - pdialog=ptr+4; - //rx_pkt_pattrib->frag_num is used to fill dialog token - _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); - - if(stat_code!=0){ - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(adapter, ptdls_sta); - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - return _FAIL; - } - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _SUPPORTEDRATES_IE_: - break; - case _COUNTRY_IE_: - break; - case _EXT_SUPPORTEDRATES_IE_: - break; - case _SUPPORTED_CH_IE_: - break; - case _RSN_IE_2_: - prsnie=(u8*)pIE; - //check whether responder STA has CCMP pairwise_cipher. - ppairwise_cipher=prsnie+10; - _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); - for(k=0;kANonce, (ptr+j+20), 32); - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _RIC_Descriptor_IE_: - break; - case _HT_CAPABILITY_IE_: - break; - case EID_BSSCoexistence: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - if(prx_pkt_attrib->encrypt){ - if(verify_ccmp==1){ - wpa_tdls_generate_tpk(adapter, ptdls_sta); - ptdls_sta->stat_code=0; - } - else{ - ptdls_sta->stat_code=72; //invalide contents of RSNIE - } - }else{ - ptdls_sta->stat_code=0; - } - - if(prx_pkt_attrib->encrypt){ - if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: valid - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - rtw_free_stainfo(adapter, ptdls_sta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - return _FAIL; - } - } - DBG_8192C("issue_tdls_setup_cfm\n"); - issue_tdls_setup_cfm(adapter, precv_frame); - - if((ptdls_sta->state&TDLS_RESPONDER_STATE)==TDLS_RESPONDER_STATE) - ptdls_sta->state |= TDLS_LINKED_STATE; - - if(prx_pkt_attrib->encrypt){ - if(ptdls_sta->cam_entry==0){ - ptdls_sta->dot118021XPrivacy=_AES_; - ptdls_sta->cam_entry=pmlmeinfo->tdls_cam_entry_to_write; - if(++pmlmeinfo->tdls_cam_entry_to_write>31) - pmlmeinfo->tdls_cam_entry_to_write=6; - } - rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); - } - - return _FAIL; -} - -sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - _irqL irqL; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 *psa; - u16 stat_code; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =5; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; - u16 j, pairwise_count; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - //[+1]: payload type - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0){ - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - rtw_free_stainfo(adapter, ptdls_sta); - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - return _FAIL; - } - - if(prx_pkt_attrib->encrypt){ - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _RSN_IE_2_: - prsnie=(u8*)pIE; - break; - case _VENDOR_SPECIFIC_IE_: - break; - case _FTIE_: - pftie=(u8*)pIE; - break; - case _TIMEOUT_ITVL_IE_: - ptimeout_ie=(u8*)pIE; - break; - case _HT_EXTRA_INFO_IE_: - break; - case _LINK_ID_IE_: - plinkid_ie=(u8*)pIE; - break; - default: - break; - } - - j += (pIE->Length + 2); - - } - - //verify mic in FTIE MIC field - if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - rtw_free_stainfo(adapter, ptdls_sta); - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - return _FAIL; - } - - } - - pmlmeinfo->tdls_setup_state=TDLS_LINKED_STATE; - if((ptdls_sta->state & TDLS_INITIATOR_STATE)==TDLS_INITIATOR_STATE) - ptdls_sta->state|=TDLS_LINKED_STATE; - - ptdls_sta->option=1; //write RCR DATA BIT - _set_workitem(&ptdls_sta->option_workitem); - - //Write cam - //TDLS encryption(if needed) will always be CCMP - if(prx_pkt_attrib->encrypt){ - if(ptdls_sta->cam_entry==0){ - ptdls_sta->dot118021XPrivacy=_AES_; - ptdls_sta->cam_entry=pmlmeinfo->tdls_cam_entry_to_write; - if(++pmlmeinfo->tdls_cam_entry_to_write>31) - pmlmeinfo->tdls_cam_entry_to_write=6; - } - rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); - } - - - return _FAIL; -} - -sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *ptr = precv_frame->u.hdr.rx_data; - u8 *pdialog = NULL; - - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+8+1; - pdialog=ptr+2; - - //check frame contents - - //rx_pkt_pattrib->frag_num is used to fill dialog token - _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); - - issue_tdls_dis_rsp(adapter, precv_frame); - - return _FAIL; - -} - -sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame) -{ - u8 *psa; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &adapter->stapriv; - struct sta_info *ptdls_sta= NULL; - _irqL irqL; - - psa = get_sa(ptr); - - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - if(ptdls_sta!=NULL){ - - if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ - ptdls_sta->option =3; - _set_workitem(&ptdls_sta->option_workitem); - } - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - pmlmeinfo->tdls_sta_cnt--; - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); - //ready to clear cam - if(ptdls_sta->cam_entry!=0){ - pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; - //it will clear cam response to ptdls_sta->cam_entry - rtw_setstakey_cmd(adapter, (u8 *)ptdls_sta, _TRUE); - } - _set_workitem(&pmlmeext->TDLS_restore_workitem); - rtw_free_stainfo(adapter, ptdls_sta); - } - if(pmlmeinfo->tdls_sta_cnt==0) - pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; - - return _FAIL; - -} - -u8 TDLS_check_ch_state(uint state){ - if( (state & TDLS_CH_SWITCH_ON_STATE) && - (state & TDLS_AT_OFF_CH_STATE) && - (state & TDLS_PEER_AT_OFF_STATE) ){ - - if(state & TDLS_PEER_SLEEP_STATE) - return 2; //U-APSD + ch. switch - else - return 1; //ch. switch - }else - return 0; -} - -//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here -sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - //get peer sta infomation - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->state); - int i; - ptdls_sta->sta_stats.rx_pkts++; - - //receive peer traffic response frame, sleeping STA wakes up - ptdls_sta->state &= ~(TDLS_PEER_SLEEP_STATE); - - // if noticed peer STA wakes up by receiving peer traffic response - // and we want to do channel swtiching, then we will transmit channel switch request first - if(ptdls_sta->state & TDLS_APSD_CHSW_STATE){ - issue_tdls_ch_switch_req(adapter, pattrib->src); - ptdls_sta->state &= ~(TDLS_APSD_CHSW_STATE); - return _FAIL; - } - - //check 4-AC queue bit - if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) - wmmps_ac=1; - - //if it's a direct link and have buffered frame - if(ptdls_sta->state & TDLS_LINKED_STATE){ - if(wmmps_ac && state) - { - _irqL irqL; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - - _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - //transmit buffered frames - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - xmitframe_plist = get_next(xmitframe_plist); - rtw_list_delete(&pxmitframe->list); - - ptdls_sta->sleepq_len--; - if(ptdls_sta->sleepq_len>0){ - pxmitframe->attrib.mdata = 1; - pxmitframe->attrib.eosp = 0; - }else{ - pxmitframe->attrib.mdata = 0; - pxmitframe->attrib.eosp = 1; - } - //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS - if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(adapter, pxmitframe); - } - - } - - if(ptdls_sta->sleepq_len==0) - { - DBG_871X("no buffered packets to xmit\n"); - //on U-APSD + CH. switch state, when there is no buffered date to xmit, - // we should go back to base channel - if(state==2){ - ptdls_sta->option = 3; - _set_workitem(&ptdls_sta->option_workitem); - }else if(ptdls_sta->state&TDLS_SW_OFF_STATE){ - ptdls_sta->state &= ~(TDLS_SW_OFF_STATE); - pmlmeinfo->tdls_candidate_ch= pmlmeext->cur_channel; - issue_tdls_ch_switch_req(adapter, pattrib->src); - DBG_8192C("issue tdls ch switch req back to base channel\n"); - } - - } - else - { - DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); - ptdls_sta->sleepq_len=0; - } - - _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - - } - - } - - return _FAIL; -} - -sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =3; - u16 j; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - //[+1]: payload type - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - - ptdls_sta->off_ch = *(ptr+2); - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _COUNTRY_IE_: - break; - case _CH_SWTICH_ANNOUNCE_: - break; - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); - default: - break; - } - - j += (pIE->Length + 2); - - } - - //todo: check status - ptdls_sta->stat_code=0; - ptdls_sta->state|=TDLS_CH_SWITCH_ON_STATE; - - issue_nulldata(adapter, 1); - - issue_tdls_ch_switch_rsp(adapter, psa); - - DBG_8192C("issue tdls channel switch response\n"); - - if((ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ - DBG_8192C("back to base channel\n"); - ptdls_sta->option=7; - _set_workitem(&ptdls_sta->option_workitem); - - }else{ - ptdls_sta->option=6; - _set_workitem(&ptdls_sta->option_workitem); - } - return _FAIL; -} - -sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame) -{ - struct sta_info *ptdls_sta= NULL; - struct sta_priv *pstapriv = &adapter->stapriv; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; - u8 *psa; - sint parsing_length; - PNDIS_802_11_VARIABLE_IEs pIE; - u8 FIXED_IE =4; - u16 stat_code, j, switch_time, switch_timeout; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - - psa = get_sa(ptr); - ptdls_sta = rtw_get_stainfo(pstapriv, psa); - - //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, - //it will go back to base channel and terminate this channel switch procedure - if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE ){ - if(pmlmeext->cur_channel==ptdls_sta->off_ch){ - DBG_8192C("back to base channel\n"); - ptdls_sta->option=7; - _set_workitem(&ptdls_sta->option_workitem); - }else{ - DBG_8192C("receive unsolicited channel switch response \n"); - ptdls_sta->option=3; - _set_workitem(&ptdls_sta->option_workitem); - } - return _FAIL; - } - - //avoiding duplicated or unconditional ch. switch. rsp - if((ptdls_sta->state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE) - return _FAIL; - - //[+1]: payload type - ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; - parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len - -prx_pkt_attrib->hdrlen - -prx_pkt_attrib->iv_len - -prx_pkt_attrib->icv_len - -LLC_HEADER_SIZE - -TYPE_LENGTH_FIELD_SIZE - -1 - -FIXED_IE; - - _rtw_memcpy(&stat_code, ptr+2, 2); - - if(stat_code!=0){ - return _FAIL; - } - - //parsing information element - for(j=FIXED_IE; jElementID) - { - case _LINK_ID_IE_: - break; - case _CH_SWITCH_TIMING_: - _rtw_memcpy(&switch_time, pIE->data, 2); - if(switch_time > ptdls_sta->ch_switch_time) - _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); - - _rtw_memcpy(&switch_timeout, pIE->data+2, 2); - if(switch_timeout > ptdls_sta->ch_switch_timeout) - _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); - - default: - break; - } - - j += (pIE->Length + 2); - - } - - ptdls_sta->state &= ~(TDLS_CH_SW_INITIATOR_STATE); - ptdls_sta->state |=TDLS_CH_SWITCH_ON_STATE; - - //goto set_channel_workitem_callback() - ptdls_sta->option=6; - _set_workitem(&ptdls_sta->option_workitem); - - return _FAIL; -} - -sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) -{ - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - sint ret = _SUCCESS; - u8 *paction = get_recvframe_data(precv_frame); - - //point to action field, [+8]: snap+ether_type, [+1]: payload_type, [+1]: category field - paction+=pattrib->hdrlen + pattrib->iv_len+8+1+1; - - switch(*paction){ - case TDLS_SETUP_REQUEST: - DBG_8192C("recv tdls setup request frame\n"); - ret=On_TDLS_Setup_Req(adapter, precv_frame); - break; - case TDLS_SETUP_RESPONSE: - DBG_8192C("recv tdls setup response frame\n"); - ret=On_TDLS_Setup_Rsp(adapter, precv_frame); - break; - case TDLS_SETUP_CONFIRM: - DBG_8192C("recv tdls setup confirm frame\n"); - ret=On_TDLS_Setup_Cfm(adapter, precv_frame); - break; - case TDLS_TEARDOWN: - DBG_8192C("recv tdls teardown, free sta_info\n"); - ret=On_TDLS_Teardown(adapter, precv_frame); - break; - case TDLS_DISCOVERY_REQUEST: - DBG_8192C("recv tdls discovery request frame\n"); - ret=On_TDLS_Dis_Req(adapter, precv_frame); - break; - case TDLS_PEER_TRAFFIC_RESPONSE: - DBG_8192C("recv tdls discovery response frame\n"); - ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); - break; - case TDLS_CHANNEL_SWITCH_REQUEST: - DBG_8192C("recv tdls channel switch request frame\n"); - ret=On_TDLS_Ch_Switch_Req(adapter, precv_frame); - break; - case TDLS_CHANNEL_SWITCH_RESPONSE: - DBG_8192C("recv tdls channel switch response frame\n"); - ret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame); - break; - default: - DBG_8192C("receive TDLS frame but not supported\n"); - ret=_FAIL; - break; - } - -exit: - return ret; - -} -#endif - -static sint sta2sta_data_frame( - _adapter *adapter, - union recv_frame *precv_frame, - struct sta_info**psta -) -{ - u8 *ptr = precv_frame->u.hdr.rx_data; - sint ret = _SUCCESS; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - struct security_priv *psecuritypriv = &adapter->securitypriv; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - u8 *mybssid = get_bssid(pmlmepriv); - u8 *myhwaddr = myid(&adapter->eeprompriv); - u8 * sta_addr = NULL; - sint bmcast = IS_MCAST(pattrib->dst); - -#ifdef CONFIG_TDLS - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_info *ptdls_sta=NULL; - u8 *psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; - //frame body located after [+2]: ether-type, [+1]: payload type - u8 *pframe_body = psnap_type+2+1; -#endif - -_func_enter_; - - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) - { - - // filter packets that SA is myself or multicast or broadcast - if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); - ret= _FAIL; - goto exit; - } - - if( (!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast) ){ - ret= _FAIL; - goto exit; - } - - if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || - _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || - (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) { - ret= _FAIL; - goto exit; - } - - sta_addr = pattrib->src; - - } - else if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { -#ifdef CONFIG_TDLS - - //direct link data transfer - if(pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE){ - ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - if(ptdls_sta==NULL){ - ret=_FAIL; - goto exit; - }else if(((ptdls_sta->state&TDLS_LINKED_STATE)!=TDLS_LINKED_STATE)&&(!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)){ - ret=_FAIL; - goto exit; - }else if((ptdls_sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE){ - - //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data - if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) - { - if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) - { - ret= _FAIL; - goto exit; - } - } - // filter packets that SA is myself or multicast or broadcast - if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); - ret= _FAIL; - goto exit; - } - // da should be for me - if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) - { - ret= _FAIL; - goto exit; - } - // check BSSID - if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || - _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || - (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) - { - ret= _FAIL; - goto exit; - } - // if NULL-frame, check pwrbit - if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) - { - //NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA - if(GetPwrMgt(ptr)){ - ptdls_sta->state|=TDLS_PEER_SLEEP_STATE; - // it would be triggered when we are off channel and receiving NULL DATA - // we can confirm that peer STA is at off channel - }else if(ptdls_sta->state&TDLS_CH_SWITCH_ON_STATE){ - if((ptdls_sta->state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){ - issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta, 0); - ptdls_sta->state |= TDLS_PEER_AT_OFF_STATE; - On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); - } - } - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); - ret= _FAIL; - goto exit; - } - //receive some of all TDLS management frames, process it at ON_TDLS - if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))){ - ret= OnTDLS(adapter, precv_frame); - goto exit; - } - - } - } - else -#endif - // For Station mode, sa and bssid should always be BSSID, and DA is my mac-address - if(!_rtw_memcmp(pattrib->bssid, pattrib->src, ETH_ALEN) ) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("bssid != TA under STATION_MODE; drop pkt\n")); - ret= _FAIL; - goto exit; - } - - sta_addr = pattrib->bssid; - - } - else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - if (bmcast) - { - // For AP mode, if DA == MCAST, then BSSID should be also MCAST - if (!IS_MCAST(pattrib->bssid)){ - ret= _FAIL; - goto exit; - } - } - else // not mc-frame - { - // For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID - if(!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) { - ret= _FAIL; - goto exit; - } - - sta_addr = pattrib->src; - } - - } - else if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - { - _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - sta_addr = mybssid; - } - else - { - ret = _FAIL; - } - - - - if(bmcast) - *psta = rtw_get_bcmc_stainfo(adapter); - else - *psta = rtw_get_stainfo(pstapriv, sta_addr); // get ap_info - - if (*psta == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under sta2sta_data_frame ; drop pkt\n")); -#ifdef CONFIG_MP_INCLUDED - if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - adapter->mppriv.rx_pktloss++; -#endif - ret= _FAIL; - goto exit; - } - -exit: -_func_exit_; - return ret; - -} - - -static sint ap2sta_data_frame( - _adapter *adapter, - union recv_frame *precv_frame, - struct sta_info**psta ) -{ - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - sint ret = _SUCCESS; - struct sta_priv *pstapriv = &adapter->stapriv; - struct security_priv *psecuritypriv = &adapter->securitypriv; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - u8 *mybssid = get_bssid(pmlmepriv); - u8 *myhwaddr = myid(&adapter->eeprompriv); - sint bmcast = IS_MCAST(pattrib->dst); - -_func_enter_; - - if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE - || check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE ) - ) - { - - // if NULL-frame, drop packet - if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s NULL frame\n", __FUNCTION__); - #endif - ret= _FAIL; - goto exit; - } - - //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data - if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) - { - if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s drop QoS-SubType Data, including QoS NULL, excluding QoS-Data\n", __FUNCTION__); - #endif - ret= _FAIL; - goto exit; - } - - } - - // filter packets that SA is myself or multicast or broadcast - if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s SA=%x:%x:%x:%x:%x:%x, myhwaddr= %x:%x:%x:%x:%x:%x\n", __FUNCTION__, - pattrib->src[0], pattrib->src[1], pattrib->src[2], - pattrib->src[3], pattrib->src[4], pattrib->src[5], - *(myhwaddr), *(myhwaddr+1), *(myhwaddr+2), - *(myhwaddr+3), *(myhwaddr+4), *(myhwaddr+5)); - #endif - ret= _FAIL; - goto exit; - } - - // da should be for me - if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" ap2sta_data_frame: compare DA fail; DA= %x:%x:%x:%x:%x:%x \n", - pattrib->dst[0], - pattrib->dst[1], - pattrib->dst[2], - pattrib->dst[3], - pattrib->dst[4], - pattrib->dst[5])); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s compare DA fail; DA= %x:%x:%x:%x:%x:%x \n", __FUNCTION__, - pattrib->dst[0],pattrib->dst[1],pattrib->dst[2], - pattrib->dst[3],pattrib->dst[4],pattrib->dst[5]); - #endif - - ret= _FAIL; - goto exit; - } - - - // check BSSID - if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || - _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || - (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" ap2sta_data_frame: compare BSSID fail ; BSSID=%x:%x:%x:%x:%x:%x\n", - pattrib->bssid[0], - pattrib->bssid[1], - pattrib->bssid[2], - pattrib->bssid[3], - pattrib->bssid[4], - pattrib->bssid[5])); - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("mybssid= %x:%x:%x:%x:%x:%x\n", - mybssid[0], - mybssid[1], - mybssid[2], - mybssid[3], - mybssid[4], - mybssid[5])); - - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s compare BSSID fail ; BSSID=%x:%x:%x:%x:%x:%x, mybssid= %x:%x:%x:%x:%x:%x\n", __FUNCTION__, - pattrib->bssid[0], pattrib->bssid[1], pattrib->bssid[2], - pattrib->bssid[3], pattrib->bssid[4], pattrib->bssid[5], - mybssid[0], mybssid[1], mybssid[2], - mybssid[3], mybssid[4], mybssid[5]); - #endif - - ret= _FAIL; - goto exit; - } - - if(bmcast) - *psta = rtw_get_bcmc_stainfo(adapter); - else - *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get ap_info - - if (*psta == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ap2sta: can't get psta under STATION_MODE ; drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\n", __FUNCTION__); - #endif - ret= _FAIL; - goto exit; - } - - } - else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && - (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ) - { - _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - - // - _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); - - - *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info - if (*psta == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under MP_MODE ; drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__); - #endif - ret= _FAIL; - goto exit; - } - - - } - else - { - ret = _FAIL; - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s fw_state:0x%x\n", __FUNCTION__, get_fwstate(pmlmepriv)); - #endif - } - -exit: - -_func_exit_; - - return ret; - -} - -static sint sta2ap_data_frame( - _adapter *adapter, - union recv_frame *precv_frame, - struct sta_info**psta ) -{ - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - struct security_priv *psecuritypriv = &adapter->securitypriv; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - unsigned char *mybssid = get_bssid(pmlmepriv); - sint ret=_SUCCESS; - -_func_enter_; - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - //For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR - if(!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) - { - ret= _FAIL; - goto exit; - } - - *psta = rtw_get_stainfo(pstapriv, pattrib->src); - - if (*psta == NULL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under AP_MODE; drop pkt\n")); - ret= _FAIL; - goto exit; - } - - - process_pwrbit_data(adapter, precv_frame); - - - // if NULL-frame, drop packet - if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); - - //process_null_data(adapter, precv_frame); - //process_pwrbit_data(adapter, precv_frame); - - - ret= _FAIL; - goto exit; - } - - //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data - if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) - { - - if(GetFrameSubType(ptr)==WIFI_QOS_DATA_NULL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" QoS NULL frame \n")); - - //process_null_data(adapter, precv_frame); - - ret= _FAIL; - goto exit; - } - - process_wmmps_data(adapter, precv_frame); - - /* - if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) - { - process_null_data(adapter, precv_frame); - ret= _FAIL; - goto exit; - } - */ - } - - } - -exit: - -_func_exit_; - - return ret; - -} - -static sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame) -{ -#ifdef CONFIG_AP_MODE - struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *pframe = precv_frame->u.hdr.rx_data; - //uint len = precv_frame->u.hdr.len; - - //DBG_871X("+validate_recv_ctrl_frame\n"); - - if (GetFrameType(pframe) != WIFI_CTRL_TYPE) - { - return _FAIL; - } - - //receive the frames that ra(a1) is my address - if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN)) - { - return _FAIL; - } - - //only handle ps-poll - if(GetFrameSubType(pframe) == WIFI_PSPOLL) - { - u16 aid; - u8 wmmps_ac=0; - struct sta_info *psta=NULL; - - aid = GetAid(pframe); - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - - if((psta==NULL) || (psta->aid!=aid)) - { - return _FAIL; - } - - //for rx pkt statistics - psta->sta_stats.rx_pkts++; - - switch(pattrib->priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(0); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(0); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(0); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(0); - break; - } - - if(wmmps_ac) - return _FAIL; - - if((psta->state&WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap&BIT(psta->aid))) - { - _irqL irqL; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - - _enter_critical_bh(&psta->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&psta->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - if ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - - xmitframe_plist = get_next(xmitframe_plist); - - rtw_list_delete(&pxmitframe->list); - - psta->sleepq_len--; - - if(psta->sleepq_len>0) - pxmitframe->attrib.mdata = 1; - else - pxmitframe->attrib.mdata = 0; - - pxmitframe->attrib.triggered = 1; - - //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); - - if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(padapter, pxmitframe); - } - - if(psta->sleepq_len==0) - { - pstapriv->tim_bitmap &= ~BIT(psta->aid); - - //DBG_871X("after handling ps-poll, tim=%x\n", pstapriv->tim_bitmap); - - //upate BCN for TIM IE - //update_BCNTIM(padapter); - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - } - - } - else - { - //DBG_871X("no buffered packets to xmit\n"); - if(pstapriv->tim_bitmap&BIT(psta->aid)) - { - if(psta->sleepq_len==0) - { - DBG_871X("no buffered packets to xmit\n"); - } - else - { - DBG_871X("error!psta->sleepq_len=%d\n", psta->sleepq_len); - psta->sleepq_len=0; - } - - pstapriv->tim_bitmap &= ~BIT(psta->aid); - - //upate BCN for TIM IE - //update_BCNTIM(padapter); - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - } - - } - - _exit_critical_bh(&psta->sleep_q.lock, &irqL); - - } - - } - -#endif - - return _FAIL; - -} - -static sint validate_recv_mgnt_frame(_adapter *adapter, union recv_frame *precv_frame) -{ - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - -#ifdef CONFIG_TDLS - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - - if(pmlmeinfo->tdls_ch_sensing==1 && pmlmeinfo->tdls_cur_channel !=0){ - pmlmeinfo->tdls_collect_pkt_num[pmlmeinfo->tdls_cur_channel-1]++; - } -#endif - - RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("+validate_recv_mgnt_frame\n")); - -#if 0 - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { -#ifdef CONFIG_NATIVEAP_MLME - mgt_dispatcher(adapter, precv_frame); -#else - rtw_hostapd_mlme_rx(adapter, precv_frame); -#endif - } - else - { - mgt_dispatcher(adapter, precv_frame); - } -#endif - -#ifdef CONFIG_AP_MODE - { - //for rx pkt statistics - struct sta_info *psta = rtw_get_stainfo(&adapter->stapriv, GetAddr2Ptr(precv_frame->u.hdr.rx_data)); - if(psta) - psta->sta_stats.rx_pkts++; - } -#endif - - mgt_dispatcher(adapter, precv_frame); - - return _SUCCESS; - -} - - -static sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame) -{ - int res; - u8 bretry; - u8 *psa, *pda, *pbssid; - struct sta_info *psta = NULL; - u8 *ptr = precv_frame->u.hdr.rx_data; - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - struct sta_priv *pstapriv = &adapter->stapriv; - struct security_priv *psecuritypriv = &adapter->securitypriv; - sint ret = _SUCCESS; -#ifdef CONFIG_TDLS - struct sta_info *ptdls_sta = NULL; - struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -#endif - -_func_enter_; - - bretry = GetRetry(ptr); - pda = get_da(ptr); - psa = get_sa(ptr); - pbssid = get_hdr_bssid(ptr); - - if(pbssid == NULL){ - ret= _FAIL; - goto exit; - } - -#ifdef CONFIG_TDLS - if(pmlmeinfo->tdls_ch_sensing==1 && pmlmeinfo->tdls_cur_channel !=0){ - pmlmeinfo->tdls_collect_pkt_num[pmlmeinfo->tdls_cur_channel-1]++; - } -#endif - - _rtw_memcpy(pattrib->dst, pda, ETH_ALEN); - _rtw_memcpy(pattrib->src, psa, ETH_ALEN); - - _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN); - - switch(pattrib->to_fr_ds) - { - case 0: - _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); - _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); - res= sta2sta_data_frame(adapter, precv_frame, &psta); - break; - - case 1: - _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN); - res= ap2sta_data_frame(adapter, precv_frame, &psta); - break; - - case 2: - _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN); - _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); - res= sta2ap_data_frame(adapter, precv_frame, &psta); - break; - - case 3: - _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); - _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); - res=_FAIL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n")); - break; - - default: - res=_FAIL; - break; - - } - - if(res==_FAIL){ - //RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" after to_fr_ds_chk; res = fail \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s case:%d, res:%d\n", __FUNCTION__, pattrib->to_fr_ds, res); - #endif - ret= res; - goto exit; - } - - - if(psta==NULL){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" after to_fr_ds_chk; psta==NULL \n")); - ret= _FAIL; - goto exit; - } - - //psta->rssi = prxcmd->rssi; - //psta->signal_quality= prxcmd->sq; - precv_frame->u.hdr.psta = psta; - - - pattrib->amsdu=0; - //parsing QC field - if(pattrib->qos == 1) - { - pattrib->priority = GetPriority((ptr + 24)); - pattrib->ack_policy =GetAckpolicy((ptr + 24)); - pattrib->amsdu = GetAMsdu((ptr + 24)); - pattrib->hdrlen = pattrib->to_fr_ds==3 ? 32 : 26; - - if(pattrib->priority!=0 && pattrib->priority!=3) - { - adapter->recvpriv.bIsAnyNonBEPkts = _TRUE; - } - } - else - { - pattrib->priority=0; - pattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24; - } - - - if(pattrib->order)//HT-CTRL 11n - { - pattrib->hdrlen += 4; - } - -#ifdef CONFIG_TDLS - //checking reordering per direct link - if((pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE)&&(pattrib->to_fr_ds==0)){ - ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); - if(ptdls_sta==NULL){ - ret= _FAIL; - goto exit; - }else{ - precv_frame->u.hdr.preorder_ctrl = &ptdls_sta->recvreorder_ctrl[pattrib->priority]; - - // decache, drop duplicate recv packets - if(recv_decache(precv_frame, bretry, &ptdls_sta->sta_recvpriv.rxcache) == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n")); - ret= _FAIL; - goto exit; - } - } - if(ptdls_sta->dot118021XPrivacy==_AES_) - pattrib->encrypt=ptdls_sta->dot118021XPrivacy; - }else -#endif - { - precv_frame->u.hdr.preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority]; - - // decache, drop duplicate recv packets - if(recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n")); - ret= _FAIL; - goto exit; - } - } - - if(pattrib->privacy){ - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("validate_recv_data_frame:pattrib->privacy=%x\n", pattrib->privacy)); - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0],IS_MCAST(pattrib->ra))); - -#ifdef CONFIG_TDLS - if(ptdls_sta==NULL) -#endif - GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra)); - - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n pattrib->encrypt=%d\n",pattrib->encrypt)); - - SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt); - } - else - { - pattrib->encrypt = 0; - pattrib->iv_len = pattrib->icv_len = 0; - } - -exit: - -_func_exit_; - - return ret; -} - -static sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) -{ - //shall check frame subtype, to / from ds, da, bssid - - //then call check if rx seq/frag. duplicated. - - u8 type; - u8 subtype; - sint retval = _SUCCESS; - - struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; - - u8 *ptr = precv_frame->u.hdr.rx_data; - u8 ver =(unsigned char) (*ptr)&0x3 ; -#ifdef CONFIG_FIND_BEST_CHANNEL - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; -#endif - -_func_enter_; - - -#ifdef CONFIG_FIND_BEST_CHANNEL - if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { - pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].rx_count++; - } -#endif - -#if 0 -DBG_871X("\n"); -{ - int i; - for(i=0; i<64;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); - -} -DBG_871X("\n"); -#endif - - //add version chk - if(ver!=0){ - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n")); - retval= _FAIL; - goto exit; - } - - type = GetFrameType(ptr); - subtype = GetFrameSubType(ptr); //bit(7)~bit(2) - - pattrib->to_fr_ds = get_tofr_ds(ptr); - - pattrib->frag_num = GetFragNum(ptr); - pattrib->seq_num = GetSequence(ptr); - - pattrib->pw_save = GetPwrMgt(ptr); - pattrib->mfrag = GetMFrag(ptr); - pattrib->mdata = GetMData(ptr); - pattrib->privacy = GetPrivacy(ptr); - pattrib->order = GetOrder(ptr); -#if 0 //for debug - -if(pHalData->bDumpRxPkt ==1){ - int i; - DBG_871X("############################# \n"); - - for(i=0; i<64;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); - DBG_871X("############################# \n"); -} -else if(pHalData->bDumpRxPkt ==2){ - if(type== WIFI_MGT_TYPE){ - int i; - DBG_871X("############################# \n"); - - for(i=0; i<64;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); - DBG_871X("############################# \n"); - } -} -else if(pHalData->bDumpRxPkt ==3){ - if(type== WIFI_DATA_TYPE){ - int i; - DBG_871X("############################# \n"); - - for(i=0; i<64;i=i+8) - DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), - *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); - DBG_871X("############################# \n"); - } -} - -#endif - switch (type) - { - case WIFI_MGT_TYPE: //mgnt - retval = validate_recv_mgnt_frame(adapter, precv_frame); - if (retval == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n")); - } - retval = _FAIL; // only data frame return _SUCCESS - break; - case WIFI_CTRL_TYPE: //ctrl - retval = validate_recv_ctrl_frame(adapter, precv_frame); - if (retval == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n")); - } - retval = _FAIL; // only data frame return _SUCCESS - break; - case WIFI_DATA_TYPE: //data - rtw_led_control(adapter, LED_CTL_RX); - pattrib->qos = (subtype & BIT(7))? 1:0; - retval = validate_recv_data_frame(adapter, precv_frame); - if (retval == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n")); - } - break; - default: - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type)); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type); - #endif - retval = _FAIL; - break; - } - -exit: - -_func_exit_; - - return retval; -} - - -//remove the wlanhdr and add the eth_hdr -#if 1 -static sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) -{ - sint rmv_len; - u16 eth_type, len; - u8 bsnaphdr; - u8 *psnap_type; - struct ieee80211_snap_hdr *psnap; - - sint ret=_SUCCESS; - _adapter *adapter =precvframe->u.hdr.adapter; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - - u8 *ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field - struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; - -_func_enter_; - - if(pattrib->encrypt){ - recvframe_pull_tail(precvframe, pattrib->icv_len); - } - - psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); - psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; - /* convert hdr + possible LLC headers into Ethernet header */ - //eth_type = (psnap_type[0] << 8) | psnap_type[1]; - if((_rtw_memcmp(psnap, rfc1042_header, SNAP_SIZE) && - (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && - (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )|| - //eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || - _rtw_memcmp(psnap, bridge_tunnel_header, SNAP_SIZE)){ - /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ - bsnaphdr = _TRUE; - } - else { - /* Leave Ethernet header part of hdr and full payload */ - bsnaphdr = _FALSE; - } - - rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); - len = precvframe->u.hdr.len - rmv_len; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n\n", pattrib->hdrlen, pattrib->iv_len)); - - if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)) - { - ptr += rmv_len ; - *ptr = 0x87; - *(ptr+1) = 0x12; - - eth_type = 0x8712; - // append rx status for mp test packets - ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24); - _rtw_memcpy(ptr, get_rxmem(precvframe), 24); - ptr+=24; - } - else { - ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0))); - } - - _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); - _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); - - if(!bsnaphdr) { - len = htons(len); - _rtw_memcpy(ptr+12, &len, 2); - } - -_func_exit_; - return ret; - -} - -#else - -sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) -{ - sint rmv_len; - u16 eth_type; - u8 bsnaphdr; - u8 *psnap_type; - struct ieee80211_snap_hdr *psnap; - - sint ret=_SUCCESS; - _adapter *adapter =precvframe->u.hdr.adapter; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - - u8* ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field - struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; - struct _vlan *pvlan = NULL; - -_func_enter_; - - psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); - psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; - if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03) - { - if (_rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)) - bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; - else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) && - _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) ) - bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; - else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) - bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; - else { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n")); - ret= _FAIL; - goto exit; - } - - } else - bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; - - rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n", pattrib->hdrlen, pattrib->iv_len)); - - if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) - { - ptr += rmv_len ; - *ptr = 0x87; - *(ptr+1) = 0x12; - - //back to original pointer - ptr -= rmv_len; - } - - ptr += rmv_len ; - - _rtw_memcpy(ð_type, ptr, 2); - eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type - ptr +=2; - - if(pattrib->encrypt){ - recvframe_pull_tail(precvframe, pattrib->icv_len); - } - - if(eth_type == 0x8100) //vlan - { - pvlan = (struct _vlan *) ptr; - - //eth_type = get_vlan_encap_proto(pvlan); - //eth_type = pvlan->h_vlan_encapsulated_proto;//? - rmv_len += 4; - ptr+=4; - } - - if(eth_type==0x0800)//ip - { - //struct iphdr* piphdr = (struct iphdr*) ptr; - //__u8 tos = (unsigned char)(pattrib->priority & 0xff); - - //piphdr->tos = tos; - - //if (piphdr->protocol == 0x06) - //{ - // RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", precvframe->u.hdr.len)); - //} - } - else if(eth_type==0x8712)// append rx status for mp test packets - { - //ptr -= 16; - //_rtw_memcpy(ptr, get_rxmem(precvframe), 16); - } - else - { -#ifdef PLATFORM_OS_XP - NDIS_PACKET_8021Q_INFO VlanPriInfo; - UINT32 UserPriority = precvframe->u.hdr.attrib.priority; - UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 ); - - VlanPriInfo.Value = // Get current value. - NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo); - - VlanPriInfo.TagHeader.UserPriority = UserPriority; - VlanPriInfo.TagHeader.VlanId = VlanID ; - - VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero. - VlanPriInfo.TagHeader.Reserved = 0; // Should be zero. - NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; -#endif - } - - if(eth_type==0x8712)// append rx status for mp test packets - { - ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24); - _rtw_memcpy(ptr, get_rxmem(precvframe), 24); - ptr+=24; - } - else - ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)); - - _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); - _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); - - eth_type = htons((unsigned short)eth_type) ; - _rtw_memcpy(ptr+12, ð_type, 2); - -exit: - -_func_exit_; - - return ret; -} -#endif - -static void count_rx_stats(_adapter *padapter, union recv_frame *prframe) -{ - int sz; - struct sta_info *psta = NULL; - struct stainfo_stats *pstats = NULL; - struct rx_pkt_attrib *pattrib = & prframe->u.hdr.attrib; - struct recv_priv *precvpriv = &padapter->recvpriv; - - sz = get_recvframe_len(prframe); - precvpriv->rx_bytes += sz; - - padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++; - - if( (!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst))){ - padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++; - } - - psta = prframe->u.hdr.psta; - - if(psta) - { - pstats = &psta->sta_stats; - - pstats->rx_pkts++; - pstats->rx_bytes += sz; - } - -} - - -//perform defrag -static union recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q) -{ - _list *plist, *phead; - u8 *data,wlanhdr_offset; - u8 curfragnum; - struct recv_frame_hdr *pfhdr,*pnfhdr; - union recv_frame* prframe, *pnextrframe; - _queue *pfree_recv_queue; - -_func_enter_; - - curfragnum=0; - pfree_recv_queue=&adapter->recvpriv.free_recv_queue; - - phead = get_list_head(defrag_q); - plist = get_next(phead); - prframe = LIST_CONTAINOR(plist, union recv_frame, u); - pfhdr=&prframe->u.hdr; - rtw_list_delete(&(prframe->u.list)); - - if(curfragnum!=pfhdr->attrib.frag_num) - { - //the first fragment number must be 0 - //free the whole queue - rtw_free_recvframe(prframe, pfree_recv_queue); - rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); - - return NULL; - } - - curfragnum++; - - plist= get_list_head(defrag_q); - - plist = get_next(plist); - - data=get_recvframe_data(prframe); - - while(rtw_end_of_queue_search(phead, plist) == _FALSE) - { - pnextrframe = LIST_CONTAINOR(plist, union recv_frame , u); - pnfhdr=&pnextrframe->u.hdr; - - - //check the fragment sequence (2nd ~n fragment frame) - - if(curfragnum!=pnfhdr->attrib.frag_num) - { - //the fragment number must be increasing (after decache) - //release the defrag_q & prframe - rtw_free_recvframe(prframe, pfree_recv_queue); - rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); - return NULL; - } - - curfragnum++; - - //copy the 2nd~n fragment frame's payload to the first fragment - //get the 2nd~last fragment frame's payload - - wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len; - - recvframe_pull(pnextrframe, wlanhdr_offset); - - //append to first fragment frame's tail (if privacy frame, pull the ICV) - recvframe_pull_tail(prframe, pfhdr->attrib.icv_len); - - //memcpy - _rtw_memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len); - - recvframe_put(prframe, pnfhdr->len); - - pfhdr->attrib.icv_len=pnfhdr->attrib.icv_len; - plist = get_next(plist); - - }; - - //free the defrag_q queue and return the prframe - rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Performance defrag!!!!!\n")); - -_func_exit_; - - return prframe; -} - - -//check if need to defrag, if needed queue the frame to defrag_q -static union recv_frame * recvframe_chk_defrag(_adapter *padapter,union recv_frame* precv_frame) -{ - u8 ismfrag; - u8 fragnum; - u8 *psta_addr; - struct recv_frame_hdr *pfhdr; - struct sta_info * psta; - struct sta_priv *pstapriv ; - _list *phead; - union recv_frame* prtnframe=NULL; - _queue *pfree_recv_queue, *pdefrag_q; - -_func_enter_; - - pstapriv = &padapter->stapriv; - - pfhdr=&precv_frame->u.hdr; - - pfree_recv_queue=&padapter->recvpriv.free_recv_queue; - - //need to define struct of wlan header frame ctrl - ismfrag= pfhdr->attrib.mfrag; - fragnum=pfhdr->attrib.frag_num; - - psta_addr=pfhdr->attrib.ta; - psta=rtw_get_stainfo(pstapriv, psta_addr); - if (psta==NULL) - pdefrag_q = NULL; - else - pdefrag_q=&psta->sta_recvpriv.defrag_q; - - if ((ismfrag==0) && (fragnum==0)) - { - prtnframe = precv_frame;//isn't a fragment frame - } - - if (ismfrag==1) - { - //0~(n-1) fragment frame - //enqueue to defraf_g - if(pdefrag_q != NULL) - { - if(fragnum==0) - { - //the first fragment - if(_rtw_queue_empty(pdefrag_q) == _FALSE) - { - //free current defrag_q - rtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue); - } - } - - - //Then enqueue the 0~(n-1) fragment into the defrag_q - - //_rtw_spinlock(&pdefrag_q->lock); - phead = get_list_head(pdefrag_q); - rtw_list_insert_tail(&pfhdr->list, phead); - //_rtw_spinunlock(&pdefrag_q->lock); - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Enqueuq: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); - - prtnframe=NULL; - - } - else - { - //can't find this ta's defrag_queue, so free this recv_frame - rtw_free_recvframe(precv_frame, pfree_recv_queue); - prtnframe=NULL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); - } - - } - - if((ismfrag==0)&&(fragnum!=0)) - { - //the last fragment frame - //enqueue the last fragment - if(pdefrag_q != NULL) - { - //_rtw_spinlock(&pdefrag_q->lock); - phead = get_list_head(pdefrag_q); - rtw_list_insert_tail(&pfhdr->list,phead); - //_rtw_spinunlock(&pdefrag_q->lock); - - //call recvframe_defrag to defrag - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("defrag: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); - precv_frame = recvframe_defrag(padapter, pdefrag_q); - prtnframe=precv_frame; - - } - else - { - //can't find this ta's defrag_queue, so free this recv_frame - rtw_free_recvframe(precv_frame, pfree_recv_queue); - prtnframe=NULL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); - } - - } - - - if((prtnframe!=NULL)&&(prtnframe->u.hdr.attrib.privacy)) - { - //after defrag we must check tkip mic code - if(recvframe_chkmic(padapter, prtnframe)==_FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic(padapter, prtnframe)==_FAIL\n")); - rtw_free_recvframe(prtnframe,pfree_recv_queue); - prtnframe=NULL; - } - } - -_func_exit_; - - return prtnframe; - -} - - -static int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) -{ -#ifdef PLATFORM_LINUX //for amsdu TP improvement,Creator: Thomas - int a_len, padding_len; - u16 eth_type, nSubframe_Length; - u8 nr_subframes, i; - unsigned char *data_ptr, *pdata; - struct rx_pkt_attrib *pattrib; - _pkt *sub_skb,*subframes[MAX_SUBFRAME_COUNT]; - struct recv_priv *precvpriv = &padapter->recvpriv; - _queue *pfree_recv_queue = &(precvpriv->free_recv_queue); - int ret = _SUCCESS; - - nr_subframes = 0; - - pattrib = &prframe->u.hdr.attrib; - - recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen); - - if(prframe->u.hdr.attrib.iv_len >0) - { - recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len); - } - - a_len = prframe->u.hdr.len; - - pdata = prframe->u.hdr.rx_data; - - while(a_len > ETH_HLEN) { - - /* Offset 12 denote 2 mac address */ - //nSubframe_Length = *((u16*)(pdata + 12)); - //==m==>change the length order - //nSubframe_Length = (nSubframe_Length>>8) + (nSubframe_Length<<8); - //nSubframe_Length = ntohs(*((u16*)(pdata + 12))); - nSubframe_Length = RTW_GET_BE16(pdata + 12); - - //ntohs(nSubframe_Length); - - if( a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length) ) { - DBG_8192C("nRemain_Length is %d and nSubframe_Length is : %d\n",a_len,nSubframe_Length); - goto exit; - } - - /* move the data point to data content */ - pdata += ETH_HLEN; - a_len -= ETH_HLEN; - - /* Allocate new skb for releasing to upper layer */ -#ifdef CONFIG_SKB_COPY - sub_skb = dev_alloc_skb(nSubframe_Length + 12); - if(sub_skb) - { - skb_reserve(sub_skb, 12); - data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length); - _rtw_memcpy(data_ptr, pdata, nSubframe_Length); - } - else - { -#endif // CONFIG_SKB_COPY - sub_skb = skb_clone(prframe->u.hdr.pkt, GFP_ATOMIC); - if(sub_skb) - { - sub_skb->data = pdata; - sub_skb->len = nSubframe_Length; - sub_skb->tail = sub_skb->data + nSubframe_Length; - } - else - { - DBG_8192C("skb_clone() Fail!!! , nr_subframes = %d\n",nr_subframes); - break; - } - } - - //sub_skb->dev = padapter->pnetdev; - subframes[nr_subframes++] = sub_skb; - if(nr_subframes >= MAX_SUBFRAME_COUNT) { - DBG_8192C("ParseSubframe(): Too many Subframes! Packets dropped!\n"); - break; - } - - pdata += nSubframe_Length; - a_len -= nSubframe_Length; - if(a_len != 0) { - padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4-1)); - if(padding_len == 4) { - padding_len = 0; - } - - if(a_len < padding_len) { - goto exit; - } - pdata += padding_len; - a_len -= padding_len; - } - } - - for(i=0; idata[6] << 8) | sub_skb->data[7]; - //eth_type = ntohs(*(u16*)&sub_skb->data[6]); - eth_type = RTW_GET_BE16(&sub_skb->data[6]); - if (sub_skb->len >= 8 && - ((_rtw_memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) && - eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || - _rtw_memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) )) { - /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ - skb_pull(sub_skb, SNAP_SIZE); - _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); - _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); - } else { - u16 len; - /* Leave Ethernet header part of hdr and full payload */ - len = htons(sub_skb->len); - _rtw_memcpy(skb_push(sub_skb, 2), &len, 2); - _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); - _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); - } - - /* Indicat the packets to upper layer */ - if (sub_skb) { - //memset(sub_skb->cb, 0, sizeof(sub_skb->cb)); - - sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev); - sub_skb->dev = padapter->pnetdev; - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX - if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) { - sub_skb->ip_summed = CHECKSUM_UNNECESSARY; - } else { - sub_skb->ip_summed = CHECKSUM_NONE; - } -#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */ - sub_skb->ip_summed = CHECKSUM_NONE; -#endif - - netif_rx(sub_skb); - } - } - -exit: - - prframe->u.hdr.len=0; - rtw_free_recvframe(prframe, pfree_recv_queue);//free this recv_frame - - return ret; -#else - _irqL irql; - unsigned char *ptr, *pdata, *pbuf, *psnap_type; - union recv_frame *pnrframe, *pnrframe_new; - int a_len, mv_len, padding_len; - u16 eth_type, type_len; - u8 bsnaphdr; - struct ieee80211_snap_hdr *psnap; - struct _vlan *pvlan; - struct recv_priv *precvpriv = &padapter->recvpriv; - _queue *pfree_recv_queue = &(precvpriv->free_recv_queue); - int ret = _SUCCESS; -#ifdef PLATFORM_WINDOWS - struct recv_buf *precvbuf = prframe->u.hdr.precvbuf; -#endif - a_len = prframe->u.hdr.len - prframe->u.hdr.attrib.hdrlen; - - recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen); - - if(prframe->u.hdr.attrib.iv_len >0) - { - recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len); - } - - pdata = prframe->u.hdr.rx_data; - - prframe->u.hdr.len=0; - - pnrframe = prframe; - - - do{ - - mv_len=0; - pnrframe->u.hdr.rx_data = pnrframe->u.hdr.rx_tail = pdata; - ptr = pdata; - - - _rtw_memcpy(pnrframe->u.hdr.attrib.dst, ptr, ETH_ALEN); - ptr+=ETH_ALEN; - _rtw_memcpy(pnrframe->u.hdr.attrib.src, ptr, ETH_ALEN); - ptr+=ETH_ALEN; - - _rtw_memcpy(&type_len, ptr, 2); - type_len= ntohs((unsigned short )type_len); - ptr +=2; - mv_len += ETH_HLEN; - - recvframe_put(pnrframe, type_len+ETH_HLEN);//update tail; - - if(pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8) - { - //panic("pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8\n"); - - rtw_free_recvframe(pnrframe, pfree_recv_queue); - - goto exit; - } - - psnap=(struct ieee80211_snap_hdr *)(ptr); - psnap_type=ptr+SNAP_SIZE; - if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03) - { - if ( _rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)) - { - bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; - } - else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) && - _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) ) - { - bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; - } - else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) - { - bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; - } - else - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n")); - - //KeBugCheckEx(0x87123333, 0xe0, 0x4c, 0x87, 0xdd); - - //panic("0x87123333, 0xe0, 0x4c, 0x87, 0xdd\n"); - - rtw_free_recvframe(pnrframe, pfree_recv_queue); - - goto exit; - } - - } - else - { - bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; - } - - ptr += (bsnaphdr?SNAP_SIZE:0); - _rtw_memcpy(ð_type, ptr, 2); - eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type - - mv_len+= 2+(bsnaphdr?SNAP_SIZE:0); - ptr += 2;//now move to iphdr; - - pvlan = NULL; - if(eth_type == 0x8100) //vlan - { - pvlan = (struct _vlan *)ptr; - ptr+=4; - mv_len+=4; - } - - if(eth_type==0x0800)//ip - { - struct iphdr* piphdr = (struct iphdr*)ptr; - - - if (piphdr->protocol == 0x06) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", pnrframe->u.hdr.len)); - } - } -#ifdef PLATFORM_OS_XP - else - { - NDIS_PACKET_8021Q_INFO VlanPriInfo; - UINT32 UserPriority = pnrframe->u.hdr.attrib.priority; - UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 ); - - VlanPriInfo.Value = // Get current value. - NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo); - - VlanPriInfo.TagHeader.UserPriority = UserPriority; - VlanPriInfo.TagHeader.VlanId = VlanID; - - VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero. - VlanPriInfo.TagHeader.Reserved = 0; // Should be zero. - NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; - - } -#endif - - pbuf = recvframe_pull(pnrframe, (mv_len-sizeof(struct ethhdr))); - - _rtw_memcpy(pbuf, pnrframe->u.hdr.attrib.dst, ETH_ALEN); - _rtw_memcpy(pbuf+ETH_ALEN, pnrframe->u.hdr.attrib.src, ETH_ALEN); - - eth_type = htons((unsigned short)eth_type) ; - _rtw_memcpy(pbuf+12, ð_type, 2); - - padding_len = (4) - ((type_len + ETH_HLEN)&(4-1)); - - a_len -= (type_len + ETH_HLEN + padding_len) ; - - -#if 0 - - if(a_len > ETH_HLEN) - { - pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue); - if(pnrframe_new) - { - _pkt *pskb_copy; - unsigned int copy_len = pnrframe->u.hdr.len; - - _rtw_init_listhead(&pnrframe_new->u.hdr.list); - - #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pskb_copy = dev_alloc_skb(copy_len+64); - #else - pskb_copy = netdev_alloc_skb(padapter->pnetdev, copy_len + 64); - #endif - if(pskb_copy==NULL) - { - DBG_8192C("amsdu_to_msdu:can not all(ocate memory for skb copy\n"); - } - - pnrframe_new->u.hdr.pkt = pskb_copy; - - _rtw_memcpy(pskb_copy->data, pnrframe->u.hdr.rx_data, copy_len); - - pnrframe_new->u.hdr.rx_data = pnrframe->u.hdr.rx_data; - pnrframe_new->u.hdr.rx_tail = pnrframe->u.hdr.rx_data + copy_len; - - - if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) - { - rtw_recv_indicatepkt(padapter, pnrframe_new);//indicate this recv_frame - } - else - { - rtw_free_recvframe(pnrframe_new, pfree_recv_queue);//free this recv_frame - } - - } - else - { - DBG_8192C("amsdu_to_msdu:can not allocate memory for pnrframe_new\n"); - } - - } - else - { - if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) - { - rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame - } - else - { - rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame - } - - pnrframe = NULL; - - } - -#else - - //padding_len = (4) - ((type_len + ETH_HLEN)&(4-1)); - - //a_len -= (type_len + ETH_HLEN + padding_len) ; - - pnrframe_new = NULL; - - - if(a_len > ETH_HLEN) - { - pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue); - - if(pnrframe_new) - { - - - //pnrframe_new->u.hdr.precvbuf = precvbuf;//precvbuf is assigned before call rtw_init_recvframe() - //rtw_init_recvframe(pnrframe_new, precvpriv); - { - _pkt *pskb = pnrframe->u.hdr.pkt; - _rtw_init_listhead(&pnrframe_new->u.hdr.list); - - pnrframe_new->u.hdr.len=0; - -#ifdef PLATFORM_LINUX - if(pskb) - { - pnrframe_new->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); - } -#endif - - } - - pdata += (type_len + ETH_HLEN + padding_len); - pnrframe_new->u.hdr.rx_head = pnrframe_new->u.hdr.rx_data = pnrframe_new->u.hdr.rx_tail = pdata; - pnrframe_new->u.hdr.rx_end = pdata + a_len + padding_len;// - -#ifdef PLATFORM_WINDOWS - pnrframe_new->u.hdr.precvbuf=precvbuf; - _enter_critical_bh(&precvbuf->recvbuf_lock, &irql); - precvbuf->ref_cnt++; - _exit_critical_bh(&precvbuf->recvbuf_lock, &irql); -#endif - - } - else - { - //panic("pnrframe_new=%x\n", pnrframe_new); - } - } - - - if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE) ) - { - rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame - } - else - { - rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame - } - - - pnrframe = NULL; - if(pnrframe_new) - { - pnrframe = pnrframe_new; - } - - -#endif - - }while(pnrframe); - -exit: - - return ret; -#endif -} - - -static int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num) -{ - u8 wsize = preorder_ctrl->wsize_b; - u16 wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;//% 4096; - - // Rx Reorder initialize condition. - if (preorder_ctrl->indicate_seq == 0xFFFF) - { - preorder_ctrl->indicate_seq = seq_num; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, seq_num); - #endif - - //DbgPrint("check_indicate_seq, 1st->indicate_seq=%d\n", precvpriv->indicate_seq); - } - - //DbgPrint("enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); - - // Drop out the packet which SeqNum is smaller than WinStart - if( SN_LESS(seq_num, preorder_ctrl->indicate_seq) ) - { - //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); - //DbgPrint("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); - - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, - preorder_ctrl->indicate_seq, seq_num); - #endif - - - return _FALSE; - } - - // - // Sliding window manipulation. Conditions includes: - // 1. Incoming SeqNum is equal to WinStart =>Window shift 1 - // 2. Incoming SeqNum is larger than the WinEnd => Window shift N - // - if( SN_EQUAL(seq_num, preorder_ctrl->indicate_seq) ) - { - preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, seq_num); - #endif - } - else if(SN_LESS(wend, seq_num)) - { - //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); - //DbgPrint("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); - - // boundary situation, when seq_num cross 0xFFF - if(seq_num >= (wsize - 1)) - preorder_ctrl->indicate_seq = seq_num + 1 -wsize; - else - preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1; - - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, seq_num); - #endif - } - - //DbgPrint("exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); - - return _TRUE; -} - - -static int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe) -{ - struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; - _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; - _list *phead, *plist; - union recv_frame *pnextrframe; - struct rx_pkt_attrib *pnextattrib; - - //DbgPrint("+enqueue_reorder_recvframe()\n"); - - //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); - - - phead = get_list_head(ppending_recvframe_queue); - plist = get_next(phead); - - while(rtw_end_of_queue_search(phead, plist) == _FALSE) - { - pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u); - pnextattrib = &pnextrframe->u.hdr.attrib; - - if(SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) - { - plist = get_next(plist); - } - else if( SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) - { - //Duplicate entry is found!! Do not insert current entry. - //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); - - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - - return _FALSE; - } - else - { - break; - } - - //DbgPrint("enqueue_reorder_recvframe():while\n"); - - } - - - //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); - - rtw_list_delete(&(prframe->u.hdr.list)); - - rtw_list_insert_tail(&(prframe->u.hdr.list), plist); - - //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - - - //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); - return _TRUE; - -} - - -static int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced) -{ - _irqL irql; - //u8 bcancelled; - _list *phead, *plist; - union recv_frame *prframe; - struct rx_pkt_attrib *pattrib; - //u8 index = 0; - int bPktInBuf = _FALSE; - struct recv_priv *precvpriv = &padapter->recvpriv; - _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; - - //DbgPrint("+recv_indicatepkts_in_order\n"); - - //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); - - phead = get_list_head(ppending_recvframe_queue); - plist = get_next(phead); - -#if 0 - // Check if there is any other indication thread running. - if(pTS->RxIndicateState == RXTS_INDICATE_PROCESSING) - return; -#endif - - // Handling some condition for forced indicate case. - if(bforced==_TRUE) - { - if(rtw_is_list_empty(phead)) - { - // _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); - return _TRUE; - } - - prframe = LIST_CONTAINOR(plist, union recv_frame, u); - pattrib = &prframe->u.hdr.attrib; - preorder_ctrl->indicate_seq = pattrib->seq_num; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - } - - // Prepare indication list and indication. - // Check if there is any packet need indicate. - while(!rtw_is_list_empty(phead)) - { - if(plist == phead) - break; - - prframe = LIST_CONTAINOR(plist, union recv_frame, u); - pattrib = &prframe->u.hdr.attrib; - - if(!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, - ("recv_indicatepkts_in_order: indicate=%d seq=%d amsdu=%d\n", - preorder_ctrl->indicate_seq, pattrib->seq_num, pattrib->amsdu)); - -#if 0 - // This protect buffer from overflow. - if(index >= REORDER_WIN_SIZE) - { - RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!! \n")); - bPktInBuf = TRUE; - break; - } -#endif - - plist = get_next(plist); - rtw_list_delete(&(prframe->u.hdr.list)); - - if(SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) - { - preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - } - -#if 0 - index++; - if(index==1) - { - //Cancel previous pending timer. - //PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer); - if(bforced!=_TRUE) - { - //DBG_8192C("_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\n"); - _cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled); - } - } -#endif - - //Set this as a lock to make sure that only one thread is indicating packet. - //pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; - - // Indicate packets - //RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!! \n")); - - - //indicate this recv_frame - //DbgPrint("recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\n", precvpriv->indicate_seq, pattrib->seq_num); - if(!pattrib->amsdu) - { - //DBG_8192C("recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\n", preorder_ctrl->indicate_seq, pattrib->seq_num); - - if ((padapter->bDriverStopped == _FALSE) && - (padapter->bSurpriseRemoved == _FALSE)) - { - _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);//unlock before indicate packet - - rtw_recv_indicatepkt(padapter, prframe); //indicate this recv_frame - - _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); - - } - } - else if(pattrib->amsdu==1) - { - if(amsdu_to_msdu(padapter, prframe)!=_SUCCESS) - { - rtw_free_recvframe(prframe, &precvpriv->free_recv_queue); - } - } - else - { - //error condition; - } - - - //Update local variables. - bPktInBuf = _FALSE; - - } - else - { - bPktInBuf = _TRUE; - break; - } - - //DbgPrint("recv_indicatepkts_in_order():while\n"); - - } - - //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - -/* - //Release the indication lock and set to new indication step. - if(bPktInBuf) - { - // Set new pending timer. - //pTS->RxIndicateState = RXTS_INDICATE_REORDER; - //PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime); - //DBG_8192C("_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME)\n"); - _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); - } - else - { - //pTS->RxIndicateState = RXTS_INDICATE_IDLE; - } -*/ - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - - //return _TRUE; - return bPktInBuf; - -} - - -static int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) -{ - _irqL irql; - int retval = _SUCCESS; - struct recv_priv *precvpriv = &padapter->recvpriv; - struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; - struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl; - _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; - - if(!pattrib->amsdu) - { - //s1. - wlanhdr_to_ethhdr(prframe); - - if(pattrib->qos !=1 /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/) - { - if ((padapter->bDriverStopped == _FALSE) && - (padapter->bSurpriseRemoved == _FALSE)) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n" )); - - rtw_recv_indicatepkt(padapter, prframe); - return _SUCCESS; - - } - - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s pattrib->qos !=1\n", __FUNCTION__); - #endif - - return _FAIL; - - } - - if (preorder_ctrl->enable == _FALSE) - { - //indicate this recv_frame - preorder_ctrl->indicate_seq = pattrib->seq_num; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - - rtw_recv_indicatepkt(padapter, prframe); - - preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - - return _SUCCESS; - } - -#ifndef CONFIG_RECV_REORDERING_CTRL - //indicate this recv_frame - rtw_recv_indicatepkt(padapter, prframe); - return _SUCCESS; -#endif - - } - else if(pattrib->amsdu==1) //temp filter -> means didn't support A-MSDUs in a A-MPDU - { - if (preorder_ctrl->enable == _FALSE) - { - preorder_ctrl->indicate_seq = pattrib->seq_num; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - - retval = amsdu_to_msdu(padapter, prframe); - - preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, pattrib->seq_num); - #endif - - if(retval != _SUCCESS){ - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); - #endif - } - - return retval; - } - } - else - { - - } - - _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); - - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, - ("recv_indicatepkt_reorder: indicate=%d seq=%d\n", - preorder_ctrl->indicate_seq, pattrib->seq_num)); - - //s2. check if winstart_b(indicate_seq) needs to been updated - if(!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) - { - //pHTInfo->RxReorderDropCounter++; - //ReturnRFDList(Adapter, pRfd); - //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("RxReorderIndicatePacket() ==> Packet Drop!!\n")); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - //return _FAIL; - - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s check_indicate_seq fail\n", __FUNCTION__); - #endif - goto _err_exit; - } - - - //s3. Insert all packet into Reorder Queue to maintain its ordering. - if(!enqueue_reorder_recvframe(preorder_ctrl, prframe)) - { - //DbgPrint("recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\n"); - //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); - //return _FAIL; - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\n", __FUNCTION__); - #endif - goto _err_exit; - } - - - //s4. - // Indication process. - // After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets - // with the SeqNum smaller than latest WinStart and buffer other packets. - // - // For Rx Reorder condition: - // 1. All packets with SeqNum smaller than WinStart => Indicate - // 2. All packets with SeqNum larger than or equal to WinStart => Buffer it. - // - - //recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE); - if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE)==_TRUE) - { - _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); - _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); - } - else - { - _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); - _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); - } - - - return _SUCCESS; - -_err_exit: - - _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); - - return _FAIL; -} - - -void rtw_reordering_ctrl_timeout_handler(void *pcontext) -{ - _irqL irql; - struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)pcontext; - _adapter *padapter = preorder_ctrl->padapter; - _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; - - - if(padapter->bDriverStopped ||padapter->bSurpriseRemoved) - { - return; - } - - //DBG_8192C("+rtw_reordering_ctrl_timeout_handler()=>\n"); - - _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); - - if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE)==_TRUE) - { - _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); - } - - _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); - -} - - -static int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe) -{ - int retval = _SUCCESS; - struct recv_priv *precvpriv = &padapter->recvpriv; - struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - -#ifdef CONFIG_80211N_HT - - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - - if(phtpriv->ht_option==_TRUE) //B/G/N Mode - { - //prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; - - if(recv_indicatepkt_reorder(padapter, prframe)!=_SUCCESS)// including perform A-MPDU Rx Ordering Buffer Control - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\n", __FUNCTION__); - #endif - - if ((padapter->bDriverStopped == _FALSE) && - (padapter->bSurpriseRemoved == _FALSE)) - { - retval = _FAIL; - return retval; - } - } - } - else //B/G mode -#endif - { - retval=wlanhdr_to_ethhdr (prframe); - if(retval != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__); - #endif - return retval; - } - - if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) - { - //indicate this recv_frame - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n" )); - rtw_recv_indicatepkt(padapter, prframe); - - - } - else - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n" )); - - RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - retval = _FAIL; - return retval; - } - - } - - return retval; - -} - - -static int recv_func(_adapter *padapter, void *pcontext) -{ - struct rx_pkt_attrib *pattrib; - union recv_frame *prframe, *orig_prframe; - int retval = _SUCCESS; - _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; - struct recv_priv *precvpriv = &padapter->recvpriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#ifdef CONFIG_TDLS - u8 *psnap_type, *pcategory; -#endif - - prframe = (union recv_frame *)pcontext; - orig_prframe = prframe; - - pattrib = &prframe->u.hdr.attrib; - -#ifdef CONFIG_MP_INCLUDED - if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0)) - { - if (pattrib->crc_err == 1) - padapter->mppriv.rx_crcerrpktcount++; - else - padapter->mppriv.rx_pktcount++; - - if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n")); - retval = _FAIL; - rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame - goto _exit_recv_func; - } - } -#endif - - //check the frame crtl field and decache - retval = validate_recv_frame(padapter, prframe); - if (retval != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recv_func: validate_recv_frame fail! drop pkt\n")); - rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame - goto _exit_recv_func; - } - // DATA FRAME - rtw_led_control(padapter, LED_CTL_RX); - - prframe = decryptor(padapter, prframe); - if (prframe == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decryptor: drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__); - #endif - retval = _FAIL; - goto _exit_recv_func; - } - -#ifdef CONFIG_TDLS - //check TDLS frame - psnap_type = get_recvframe_data(orig_prframe); - psnap_type+=pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; - //[+2]: ether_type, [+1]: payload type - pcategory = psnap_type+2+1; - if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))&&((*pcategory==0x0c))){ - retval = OnTDLS(padapter, prframe); //all of functions will return _FAIL - goto _exit_recv_func; - } -#endif - - prframe = recvframe_chk_defrag(padapter, prframe); - if(prframe==NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chk_defrag: drop pkt\n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__); - #endif - goto _exit_recv_func; - } - - prframe=portctrl(padapter, prframe); - if (prframe == NULL) { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("portctrl: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__); - #endif - retval = _FAIL; - goto _exit_recv_func; - } - - count_rx_stats(padapter, prframe); - -#ifdef CONFIG_80211N_HT - - retval = process_recv_indicatepkts(padapter, prframe); - if (retval != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recv_func: process_recv_indicatepkts fail! \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s recv_func: process_recv_indicatepkts fail!\n", __FUNCTION__); - #endif - rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame - goto _exit_recv_func; - } - -#else - - if (!pattrib->amsdu) - { - retval = wlanhdr_to_ethhdr (prframe); - if (retval != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__); - #endif - rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame - goto _exit_recv_func; - } - - if ((padapter->bDriverStopped == _FALSE) && (padapter->bSurpriseRemoved == _FALSE)) - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: recv_func rtw_recv_indicatepkt\n" )); - //indicate this recv_frame - retval = rtw_recv_indicatepkt(padapter, prframe); - if (retval != _SUCCESS) - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__); - #endif - goto _exit_recv_func; - } - } - else - { - RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: rtw_free_recvframe\n" )); - RT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", __FUNCTION__, - padapter->bDriverStopped, padapter->bSurpriseRemoved); - #endif - retval = _FAIL; - rtw_free_recvframe(orig_prframe, pfree_recv_queue); //free this recv_frame - } - - } - else if(pattrib->amsdu==1) - { - - retval = amsdu_to_msdu(padapter, prframe); - if(retval != _SUCCESS) - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); - #endif - rtw_free_recvframe(orig_prframe, pfree_recv_queue); - goto _exit_recv_func; - } - } - else - { - #ifdef DBG_RX_DROP_FRAME - DBG_871X("DBG_RX_DROP_FRAME %s what is this condition??\n", __FUNCTION__); - #endif - } -#endif - - -_exit_recv_func: - - return retval; -} - - -s32 rtw_recv_entry(union recv_frame *precvframe) -{ - _adapter *padapter; - struct recv_priv *precvpriv; - //struct mlme_priv *pmlmepriv ; - //struct dvobj_priv *pdev; - //u8 *phead, *pdata, *ptail,*pend; - - //_queue *pfree_recv_queue, *ppending_recv_queue; - //u8 blk_mode = _FALSE; - s32 ret=_SUCCESS; - //struct intf_hdl * pintfhdl; - -_func_enter_; - -// RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("+rtw_recv_entry\n")); - - padapter = precvframe->u.hdr.adapter; - //pintfhdl = &padapter->iopriv.intf; - - //pdev=&padapter->dvobjpriv; - //pmlmepriv = &padapter->mlmepriv; - precvpriv = &padapter->recvpriv; - //pfree_recv_queue = &precvpriv->free_recv_queue; - //ppending_recv_queue = &precvpriv->recv_pending_queue; - - //phead = precvframe->u.hdr.rx_head; - //pdata = precvframe->u.hdr.rx_data; - //ptail = precvframe->u.hdr.rx_tail; - //pend = precvframe->u.hdr.rx_end; - - //rtw_led_control(padapter, LED_CTL_RX); - -#ifdef CONFIG_SDIO_HCI - if (precvpriv->free_recvframe_cnt <= 1) - goto _recv_entry_drop; -#endif - -#ifdef CONFIG_RECV_THREAD_MODE - if (_rtw_queue_empty(ppending_recv_queue) == _TRUE) - { - //enqueue_recvframe_usb(precvframe, ppending_recv_queue);//enqueue to recv_pending_queue - rtw_enqueue_recvframe(precvframe, ppending_recv_queue); - _rtw_up_sema(&precvpriv->recv_sema); - } - else - { - //enqueue_recvframe_usb(precvframe, ppending_recv_queue);//enqueue to recv_pending_queue - rtw_enqueue_recvframe(precvframe, ppending_recv_queue); - } -#else - if ((ret = recv_func(padapter, precvframe)) == _FAIL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("rtw_recv_entry: recv_func return fail!!!\n")); - goto _recv_entry_drop; - } -#endif - - precvpriv->rx_pkts++; - -_func_exit_; - - return ret; - -_recv_entry_drop: - - - precvpriv->rx_drop++; - -#ifdef CONFIG_MP_INCLUDED - padapter->mppriv.rx_pktloss = precvpriv->rx_drop; -#endif - - //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("_recv_entry_drop\n")); - -_func_exit_; - - return ret; -} - -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS -RTW_DECLARE_TIMER_HDL(signal_stat){ -//void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ - _adapter *adapter = (_adapter *)FunctionContext; - struct recv_priv *recvpriv = &adapter->recvpriv; - - u32 tmp_s, tmp_q; - u8 avg_signal_strength = 0; - u8 avg_signal_qual = 0; - u32 num_signal_strength = 0; - u32 num_signal_qual = 0; - u8 _alpha = 3; // this value is based on converging_constant = 5000 and sampling_interval = 1000 - - if(recvpriv->signal_strength_data.update_req == 0) {// update_req is clear, means we got rx - avg_signal_strength = recvpriv->signal_strength_data.avg_val; - avg_signal_qual = recvpriv->signal_qual_data.avg_val; - } - - if(recvpriv->signal_qual_data.update_req == 0) {// update_req is clear, means we got rx - num_signal_strength = recvpriv->signal_strength_data.total_num; - num_signal_qual = recvpriv->signal_qual_data.total_num; - } - - // after avg_vals are accquired, we can re-stat the signal values - recvpriv->signal_strength_data.update_req = 1; - recvpriv->signal_qual_data.update_req = 1; - - //update value of signal_strength, rssi, signal_qual - if(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _FALSE) { - tmp_s = (avg_signal_strength+(_alpha-1)*recvpriv->signal_strength); - if(tmp_s %_alpha) - tmp_s = tmp_s/_alpha + 1; - else - tmp_s = tmp_s/_alpha; - if(tmp_s>100) - tmp_s = 100; - - tmp_q = (avg_signal_qual+(_alpha-1)*recvpriv->signal_qual); - if(tmp_q %_alpha) - tmp_q = tmp_q/_alpha + 1; - else - tmp_q = tmp_q/_alpha; - if(tmp_q>100) - tmp_q = 100; - - recvpriv->signal_strength = tmp_s; - recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s); - recvpriv->signal_qual = tmp_q; - - #if 0 - DBG_871X("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u" - ", num_signal_strength:%u, num_signal_qual:%u" - "\n" - , __FUNCTION__ - , recvpriv->signal_strength - , recvpriv->rssi - , recvpriv->signal_qual - , num_signal_strength, num_signal_qual - ); - #endif - } - - rtw_set_signal_stat_timer(recvpriv); - -} -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_rf.c b/drivers/net/wireless/rtl8192c/core/rtw_rf.c deleted file mode 100755 index 665c7e5b9d15..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_rf.c +++ /dev/null @@ -1,96 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_RF_C_ - -#include -#include -#include -#include -#include - - -struct ch_freq { - u32 channel; - u32 frequency; -}; - -struct ch_freq ch_freq_map[] = { - {1, 2412},{2, 2417},{3, 2422},{4, 2427},{5, 2432}, - {6, 2437},{7, 2442},{8, 2447},{9, 2452},{10, 2457}, - {11, 2462},{12, 2467},{13, 2472},{14, 2484}, - /* UNII */ - {36, 5180},{40, 5200},{44, 5220},{48, 5240},{52, 5260}, - {56, 5280},{60, 5300},{64, 5320},{149, 5745},{153, 5765}, - {157, 5785},{161, 5805},{165, 5825},{167, 5835},{169, 5845}, - {171, 5855},{173, 5865}, - /* HiperLAN2 */ - {100, 5500},{104, 5520},{108, 5540},{112, 5560},{116, 5580}, - {120, 5600},{124, 5620},{128, 5640},{132, 5660},{136, 5680}, - {140, 5700}, - /* Japan MMAC */ - {34, 5170},{38, 5190},{42, 5210},{46, 5230}, - /* Japan */ - {184, 4920},{188, 4940},{192, 4960},{196, 4980}, - {208, 5040},/* Japan, means J08 */ - {212, 5060},/* Japan, means J12 */ - {216, 5080},/* Japan, means J16 */ -}; - -int ch_freq_map_num = (sizeof(ch_freq_map) / sizeof(struct ch_freq)); - -u32 rtw_ch2freq(u32 channel) -{ - u8 i; - u32 freq = 0; - - for (i = 0; i < ch_freq_map_num; i++) - { - if (channel == ch_freq_map[i].channel) - { - freq = ch_freq_map[i].frequency; - break; - } - } - if (i == ch_freq_map_num) - freq = 2412; - - return freq; -} - -u32 rtw_freq2ch(u32 freq) -{ - u8 i; - u32 ch = 0; - - for (i = 0; i < ch_freq_map_num; i++) - { - if (freq == ch_freq_map[i].frequency) - { - ch = ch_freq_map[i].channel; - break; - } - } - if (i == ch_freq_map_num) - ch = 1; - - return ch; -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_security.c b/drivers/net/wireless/rtl8192c/core/rtw_security.c deleted file mode 100755 index ec3a98f3f43e..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_security.c +++ /dev/null @@ -1,2811 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_SECURITY_C_ - -#include -#include -#include -#include -#include - - -//=====WEP related===== - -#define CRC32_POLY 0x04c11db7 - -struct arc4context -{ - u32 x; - u32 y; - u8 state[256]; -}; - - -static void arcfour_init(struct arc4context *parc4ctx, u8 * key,u32 key_len) -{ - u32 t, u; - u32 keyindex; - u32 stateindex; - u8 * state; - u32 counter; -_func_enter_; - state = parc4ctx->state; - parc4ctx->x = 0; - parc4ctx->y = 0; - for (counter = 0; counter < 256; counter++) - state[counter] = (u8)counter; - keyindex = 0; - stateindex = 0; - for (counter = 0; counter < 256; counter++) - { - t = state[counter]; - stateindex = (stateindex + key[keyindex] + t) & 0xff; - u = state[stateindex]; - state[stateindex] = (u8)t; - state[counter] = (u8)u; - if (++keyindex >= key_len) - keyindex = 0; - } -_func_exit_; -} -static u32 arcfour_byte( struct arc4context *parc4ctx) -{ - u32 x; - u32 y; - u32 sx, sy; - u8 * state; -_func_enter_; - state = parc4ctx->state; - x = (parc4ctx->x + 1) & 0xff; - sx = state[x]; - y = (sx + parc4ctx->y) & 0xff; - sy = state[y]; - parc4ctx->x = x; - parc4ctx->y = y; - state[y] = (u8)sx; - state[x] = (u8)sy; -_func_exit_; - return state[(sx + sy) & 0xff]; -} - - -static void arcfour_encrypt( struct arc4context *parc4ctx, - u8 * dest, - u8 * src, - u32 len) -{ - u32 i; -_func_enter_; - for (i = 0; i < len; i++) - dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx); -_func_exit_; -} - -static sint bcrc32initialized = 0; -static u32 crc32_table[256]; - - -static u8 crc32_reverseBit( u8 data) -{ - return( (u8)((data<<7)&0x80) | ((data<<5)&0x40) | ((data<<3)&0x20) | ((data<<1)&0x10) | ((data>>1)&0x08) | ((data>>3)&0x04) | ((data>>5)&0x02) | ((data>>7)&0x01) ); -} - -static void crc32_init(void) -{ -_func_enter_; - if (bcrc32initialized == 1) - goto exit; - else{ - sint i, j; - u32 c; - u8 *p=(u8 *)&c, *p1; - u8 k; - - c = 0x12340000; - - for (i = 0; i < 256; ++i) - { - k = crc32_reverseBit((u8)i); - for (c = ((u32)k) << 24, j = 8; j > 0; --j){ - c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1); - } - p1 = (u8 *)&crc32_table[i]; - - p1[0] = crc32_reverseBit(p[3]); - p1[1] = crc32_reverseBit(p[2]); - p1[2] = crc32_reverseBit(p[1]); - p1[3] = crc32_reverseBit(p[0]); - } - bcrc32initialized= 1; - } -exit: -_func_exit_; -} - -static u32 getcrc32(u8 *buf, sint len) -{ - u8 *p; - u32 crc; -_func_enter_; - if (bcrc32initialized == 0) crc32_init(); - - crc = 0xffffffff; /* preload shift register, per CRC-32 spec */ - - for (p = buf; len > 0; ++p, --len) - { - crc = crc32_table[ (crc ^ *p) & 0xff] ^ (crc >> 8); - } -_func_exit_; - return ~crc; /* transmit complement, per CRC-32 spec */ -} - - -/* - Need to consider the fragment situation -*/ -void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe) -{ // exclude ICV - - unsigned char crc[4]; - struct arc4context mycontext; - - sint curfragnum,length; - u32 keylength; - - u8 *pframe, *payload,*iv; //,*wepkey - u8 wepkey[16]; - struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - -_func_enter_; - - - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) - return; - -#ifdef CONFIG_USB_TX_AGGREGATION - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + - (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); -#else - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; -#endif - - //start to encrypt each fragment - if((pattrib->encrypt==_WEP40_)||(pattrib->encrypt==_WEP104_)) - { - keylength=psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex]; - - for(curfragnum=0;curfragnumnr_frags;curfragnum++) - { - iv=pframe+pattrib->hdrlen; - _rtw_memcpy(&wepkey[0], iv, 3); - _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); - payload=pframe+pattrib->iv_len+pattrib->hdrlen; - - if((curfragnum+1)==pattrib->nr_frags) - { //the last fragment - - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; - - *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); - - arcfour_init(&mycontext, wepkey,3+keylength); - arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); - - } - else - { - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; - *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); - arcfour_init(&mycontext, wepkey,3+keylength); - arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); - - pframe+=pxmitpriv->frag_len; - pframe=(u8 *)RND4((SIZE_PTR)(pframe)); - - } - - } - - } - -_func_exit_; - -} - -void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe) -{ - // exclude ICV - u8 crc[4]; - struct arc4context mycontext; - sint length; - u32 keylength; - u8 *pframe, *payload,*iv,wepkey[16]; - u8 keyindex; - struct rx_pkt_attrib *prxattrib = &(((union recv_frame*)precvframe)->u.hdr.attrib); - struct security_priv *psecuritypriv=&padapter->securitypriv; - -_func_enter_; - - pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - - //start to decrypt recvframe - if((prxattrib->encrypt==_WEP40_)||(prxattrib->encrypt==_WEP104_)) - { - iv=pframe+prxattrib->hdrlen; - //keyindex=(iv[3]&0x3); - keyindex = prxattrib->key_index; - keylength=psecuritypriv->dot11DefKeylen[keyindex]; - _rtw_memcpy(&wepkey[0], iv, 3); - //_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); - _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0],keylength); - length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; - - payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; - - //decrypt payload include icv - arcfour_init(&mycontext, wepkey,3+keylength); - arcfour_encrypt(&mycontext, payload, payload, length); - - //calculate icv and compare the icv - *((unsigned long *)crc)=le32_to_cpu(getcrc32(payload,length-4)); - - if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) - { - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", - crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); - } - - } - -_func_exit_; - - return; - -} - -//3 =====TKIP related===== - -static u32 secmicgetuint32( u8 * p ) -// Convert from Byte[] to Us4Byte32 in a portable way -{ - s32 i; - u32 res = 0; -_func_enter_; - for( i=0; i<4; i++ ) - { - res |= ((u32)(*p++)) << (8*i); - } -_func_exit_; - return res; -} - -static void secmicputuint32( u8 * p, u32 val ) -// Convert from Us4Byte32 to Byte[] in a portable way -{ - long i; -_func_enter_; - for( i=0; i<4; i++ ) - { - *p++ = (u8) (val & 0xff); - val >>= 8; - } -_func_exit_; -} - -static void secmicclear(struct mic_data *pmicdata) -{ -// Reset the state to the empty message. -_func_enter_; - pmicdata->L = pmicdata->K0; - pmicdata->R = pmicdata->K1; - pmicdata->nBytesInM = 0; - pmicdata->M = 0; -_func_exit_; -} - -void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ) -{ - // Set the key -_func_enter_; - pmicdata->K0 = secmicgetuint32( key ); - pmicdata->K1 = secmicgetuint32( key + 4 ); - // and reset the message - secmicclear(pmicdata); -_func_exit_; -} - -void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ) -{ -_func_enter_; - // Append the byte to our word-sized buffer - pmicdata->M |= ((unsigned long)b) << (8*pmicdata->nBytesInM); - pmicdata->nBytesInM++; - // Process the word if it is full. - if( pmicdata->nBytesInM >= 4 ) - { - pmicdata->L ^= pmicdata->M; - pmicdata->R ^= ROL32( pmicdata->L, 17 ); - pmicdata->L += pmicdata->R; - pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8); - pmicdata->L += pmicdata->R; - pmicdata->R ^= ROL32( pmicdata->L, 3 ); - pmicdata->L += pmicdata->R; - pmicdata->R ^= ROR32( pmicdata->L, 2 ); - pmicdata->L += pmicdata->R; - // Clear the buffer - pmicdata->M = 0; - pmicdata->nBytesInM = 0; - } -_func_exit_; -} - -void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes ) -{ -_func_enter_; - // This is simple - while( nbytes > 0 ) - { - rtw_secmicappendbyte(pmicdata, *src++ ); - nbytes--; - } -_func_exit_; -} - -void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ) -{ -_func_enter_; - // Append the minimum padding - rtw_secmicappendbyte(pmicdata, 0x5a ); - rtw_secmicappendbyte(pmicdata, 0 ); - rtw_secmicappendbyte(pmicdata, 0 ); - rtw_secmicappendbyte(pmicdata, 0 ); - rtw_secmicappendbyte(pmicdata, 0 ); - // and then zeroes until the length is a multiple of 4 - while( pmicdata->nBytesInM != 0 ) - { - rtw_secmicappendbyte(pmicdata, 0 ); - } - // The appendByte function has already computed the result. - secmicputuint32( dst, pmicdata->L ); - secmicputuint32( dst+4, pmicdata->R ); - // Reset to the empty message. - secmicclear(pmicdata); -_func_exit_; -} - - -void rtw_seccalctkipmic(u8 * key,u8 *header,u8 *data,u32 data_len,u8 *mic_code, u8 pri) -{ - - struct mic_data micdata; - u8 priority[4]={0x0,0x0,0x0,0x0}; -_func_enter_; - rtw_secmicsetkey(&micdata, key); - priority[0]=pri; - - /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */ - if(header[1]&1){ //ToDS==1 - rtw_secmicappend(&micdata, &header[16], 6); //DA - if(header[1]&2) //From Ds==1 - rtw_secmicappend(&micdata, &header[24], 6); - else - rtw_secmicappend(&micdata, &header[10], 6); - } - else{ //ToDS==0 - rtw_secmicappend(&micdata, &header[4], 6); //DA - if(header[1]&2) //From Ds==1 - rtw_secmicappend(&micdata, &header[16], 6); - else - rtw_secmicappend(&micdata, &header[10], 6); - - } - rtw_secmicappend(&micdata, &priority[0], 4); - - - rtw_secmicappend(&micdata, data, data_len); - - rtw_secgetmic(&micdata,mic_code); -_func_exit_; -} - - - - -/* macros for extraction/creation of unsigned char/unsigned short values */ -#define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15)) -#define Lo8(v16) ((u8)( (v16) & 0x00FF)) -#define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF)) -#define Lo16(v32) ((u16)( (v32) & 0xFFFF)) -#define Hi16(v32) ((u16)(((v32) >>16) & 0xFFFF)) -#define Mk16(hi,lo) ((lo) ^ (((u16)(hi)) << 8)) - -/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */ -#define TK16(N) Mk16(tk[2*(N)+1],tk[2*(N)]) - -/* S-box lookup: 16 bits --> 16 bits */ -#define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)]) - -/* fixed algorithm "parameters" */ -#define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */ -#define TA_SIZE 6 /* 48-bit transmitter address */ -#define TK_SIZE 16 /* 128-bit temporal key */ -#define P1K_SIZE 10 /* 80-bit Phase1 key */ -#define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */ - - -/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */ -static const unsigned short Sbox1[2][256]= /* Sbox for hash (can be in ROM) */ -{ { - 0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154, - 0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A, - 0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B, - 0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B, - 0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F, - 0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F, - 0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5, - 0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F, - 0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB, - 0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397, - 0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED, - 0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A, - 0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194, - 0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3, - 0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104, - 0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D, - 0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39, - 0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695, - 0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83, - 0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76, - 0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4, - 0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B, - 0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0, - 0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018, - 0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751, - 0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85, - 0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12, - 0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9, - 0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7, - 0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A, - 0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8, - 0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A, - }, - - - { /* second half of table is unsigned char-reversed version of first! */ - 0xA5C6,0x84F8,0x99EE,0x8DF6,0x0DFF,0xBDD6,0xB1DE,0x5491, - 0x5060,0x0302,0xA9CE,0x7D56,0x19E7,0x62B5,0xE64D,0x9AEC, - 0x458F,0x9D1F,0x4089,0x87FA,0x15EF,0xEBB2,0xC98E,0x0BFB, - 0xEC41,0x67B3,0xFD5F,0xEA45,0xBF23,0xF753,0x96E4,0x5B9B, - 0xC275,0x1CE1,0xAE3D,0x6A4C,0x5A6C,0x417E,0x02F5,0x4F83, - 0x5C68,0xF451,0x34D1,0x08F9,0x93E2,0x73AB,0x5362,0x3F2A, - 0x0C08,0x5295,0x6546,0x5E9D,0x2830,0xA137,0x0F0A,0xB52F, - 0x090E,0x3624,0x9B1B,0x3DDF,0x26CD,0x694E,0xCD7F,0x9FEA, - 0x1B12,0x9E1D,0x7458,0x2E34,0x2D36,0xB2DC,0xEEB4,0xFB5B, - 0xF6A4,0x4D76,0x61B7,0xCE7D,0x7B52,0x3EDD,0x715E,0x9713, - 0xF5A6,0x68B9,0x0000,0x2CC1,0x6040,0x1FE3,0xC879,0xEDB6, - 0xBED4,0x468D,0xD967,0x4B72,0xDE94,0xD498,0xE8B0,0x4A85, - 0x6BBB,0x2AC5,0xE54F,0x16ED,0xC586,0xD79A,0x5566,0x9411, - 0xCF8A,0x10E9,0x0604,0x81FE,0xF0A0,0x4478,0xBA25,0xE34B, - 0xF3A2,0xFE5D,0xC080,0x8A05,0xAD3F,0xBC21,0x4870,0x04F1, - 0xDF63,0xC177,0x75AF,0x6342,0x3020,0x1AE5,0x0EFD,0x6DBF, - 0x4C81,0x1418,0x3526,0x2FC3,0xE1BE,0xA235,0xCC88,0x392E, - 0x5793,0xF255,0x82FC,0x477A,0xACC8,0xE7BA,0x2B32,0x95E6, - 0xA0C0,0x9819,0xD19E,0x7FA3,0x6644,0x7E54,0xAB3B,0x830B, - 0xCA8C,0x29C7,0xD36B,0x3C28,0x79A7,0xE2BC,0x1D16,0x76AD, - 0x3BDB,0x5664,0x4E74,0x1E14,0xDB92,0x0A0C,0x6C48,0xE4B8, - 0x5D9F,0x6EBD,0xEF43,0xA6C4,0xA839,0xA431,0x37D3,0x8BF2, - 0x32D5,0x438B,0x596E,0xB7DA,0x8C01,0x64B1,0xD29C,0xE049, - 0xB4D8,0xFAAC,0x07F3,0x25CF,0xAFCA,0x8EF4,0xE947,0x1810, - 0xD56F,0x88F0,0x6F4A,0x725C,0x2438,0xF157,0xC773,0x5197, - 0x23CB,0x7CA1,0x9CE8,0x213E,0xDD96,0xDC61,0x860D,0x850F, - 0x90E0,0x427C,0xC471,0xAACC,0xD890,0x0506,0x01F7,0x121C, - 0xA3C2,0x5F6A,0xF9AE,0xD069,0x9117,0x5899,0x273A,0xB927, - 0x38D9,0x13EB,0xB32B,0x3322,0xBBD2,0x70A9,0x8907,0xA733, - 0xB62D,0x223C,0x9215,0x20C9,0x4987,0xFFAA,0x7850,0x7AA5, - 0x8F03,0xF859,0x8009,0x171A,0xDA65,0x31D7,0xC684,0xB8D0, - 0xC382,0xB029,0x775A,0x111E,0xCB7B,0xFCA8,0xD66D,0x3A2C, - } -}; - - /* -********************************************************************** -* Routine: Phase 1 -- generate P1K, given TA, TK, IV32 -* -* Inputs: -* tk[] = temporal key [128 bits] -* ta[] = transmitter's MAC address [ 48 bits] -* iv32 = upper 32 bits of IV [ 32 bits] -* Output: -* p1k[] = Phase 1 key [ 80 bits] -* -* Note: -* This function only needs to be called every 2**16 packets, -* although in theory it could be called every packet. -* -********************************************************************** -*/ -static void phase1(u16 *p1k,const u8 *tk,const u8 *ta,u32 iv32) -{ - sint i; -_func_enter_; - /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */ - p1k[0] = Lo16(iv32); - p1k[1] = Hi16(iv32); - p1k[2] = Mk16(ta[1],ta[0]); /* use TA[] as little-endian */ - p1k[3] = Mk16(ta[3],ta[2]); - p1k[4] = Mk16(ta[5],ta[4]); - - /* Now compute an unbalanced Feistel cipher with 80-bit block */ - /* size on the 80-bit block P1K[], using the 128-bit key TK[] */ - for (i=0; i < PHASE1_LOOP_CNT ;i++) - { /* Each add operation here is mod 2**16 */ - p1k[0] += _S_(p1k[4] ^ TK16((i&1)+0)); - p1k[1] += _S_(p1k[0] ^ TK16((i&1)+2)); - p1k[2] += _S_(p1k[1] ^ TK16((i&1)+4)); - p1k[3] += _S_(p1k[2] ^ TK16((i&1)+6)); - p1k[4] += _S_(p1k[3] ^ TK16((i&1)+0)); - p1k[4] += (unsigned short)i; /* avoid "slide attacks" */ - } -_func_exit_; -} - - -/* -********************************************************************** -* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16 -* -* Inputs: -* tk[] = Temporal key [128 bits] -* p1k[] = Phase 1 output key [ 80 bits] -* iv16 = low 16 bits of IV counter [ 16 bits] -* Output: -* rc4key[] = the key used to encrypt the packet [128 bits] -* -* Note: -* The value {TA,IV32,IV16} for Phase1/Phase2 must be unique -* across all packets using the same key TK value. Then, for a -* given value of TK[], this TKIP48 construction guarantees that -* the final RC4KEY value is unique across all packets. -* -* Suggested implementation optimization: if PPK[] is "overlaid" -* appropriately on RC4KEY[], there is no need for the final -* for loop below that copies the PPK[] result into RC4KEY[]. -* -********************************************************************** -*/ -static void phase2(u8 *rc4key,const u8 *tk,const u16 *p1k,u16 iv16) -{ - sint i; - u16 PPK[6]; /* temporary key for mixing */ -_func_enter_; - /* Note: all adds in the PPK[] equations below are mod 2**16 */ - for (i=0;i<5;i++) PPK[i]=p1k[i]; /* first, copy P1K to PPK */ - PPK[5] = p1k[4] +iv16; /* next, add in IV16 */ - - /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */ - PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */ - PPK[1] += _S_(PPK[0] ^ TK16(1)); - PPK[2] += _S_(PPK[1] ^ TK16(2)); - PPK[3] += _S_(PPK[2] ^ TK16(3)); - PPK[4] += _S_(PPK[3] ^ TK16(4)); - PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */ - - /* Final sweep: bijective, "linear". Rotates kill LSB correlations */ - PPK[0] += RotR1(PPK[5] ^ TK16(6)); - PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */ - PPK[2] += RotR1(PPK[1]); - PPK[3] += RotR1(PPK[2]); - PPK[4] += RotR1(PPK[3]); - PPK[5] += RotR1(PPK[4]); - /* Note: At this point, for a given key TK[0..15], the 96-bit output */ - /* value PPK[0..5] is guaranteed to be unique, as a function */ - /* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */ - /* is now a keyed permutation of {TA,IV32,IV16}. */ - - /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */ - rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */ - rc4key[1] =(Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */ - rc4key[2] = Lo8(iv16); - rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1); - - - /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */ - for (i=0;i<6;i++) - { - rc4key[4+2*i] = Lo8(PPK[i]); - rc4key[5+2*i] = Hi8(PPK[i]); - } -_func_exit_; -} - - -//The hlen isn't include the IV -u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe) -{ // exclude ICV - u16 pnl; - u32 pnh; - u8 rc4key[16]; - u8 ttkey[16]; - u8 crc[4]; - struct arc4context mycontext; - sint curfragnum,length; - u32 prwskeylen; - - u8 *pframe, *payload,*iv,*prwskey; - union pn48 dot11txpn; - struct sta_info *stainfo; - struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - u32 res=_SUCCESS; -_func_enter_; - - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) - return _FAIL; - -#ifdef CONFIG_USB_TX_AGGREGATION - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + - (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); -#else - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; -#endif - - //4 start to encrypt each fragment - if(pattrib->encrypt==_TKIP_){ - - if(pattrib->psta) - { - stainfo = pattrib->psta; - } - else - { - stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); - } - - if (stainfo!=NULL){ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo!=NULL!!!\n")); - - if(IS_MCAST(pattrib->ra)) - { - prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; - } - else - { - prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - } - - prwskeylen=16; - - for(curfragnum=0;curfragnumnr_frags;curfragnum++){ - iv=pframe+pattrib->hdrlen; - payload=pframe+pattrib->iv_len+pattrib->hdrlen; - - GET_TKIP_PN(iv, dot11txpn); - - pnl=(u16)(dot11txpn.val); - pnh=(u32)(dot11txpn.val>>16); - - phase1((u16 *)&ttkey[0],prwskey,&pattrib->ta[0],pnh); - - phase2(&rc4key[0],prwskey,(u16 *)&ttkey[0],pnl); - - if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; - RT_TRACE(_module_rtl871x_security_c_,_drv_info_,("pattrib->iv_len =%x, pattrib->icv_len =%x\n", pattrib->iv_len,pattrib->icv_len)); - *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ - - arcfour_init(&mycontext, rc4key,16); - arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); - - } - else{ - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; - *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ - arcfour_init(&mycontext,rc4key,16); - arcfour_encrypt(&mycontext, payload, payload, length); - arcfour_encrypt(&mycontext, payload+length, crc, 4); - - pframe+=pxmitpriv->frag_len; - pframe=(u8 *)RND4((SIZE_PTR)(pframe)); - - } - } - - - } - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo==NULL!!!\n")); - res=_FAIL; - } - - } -_func_exit_; - return res; - -} - - -//The hlen isn't include the IV -u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe) -{ // exclude ICV - u16 pnl; - u32 pnh; - u8 rc4key[16]; - u8 ttkey[16]; - u8 crc[4]; - struct arc4context mycontext; - sint length; - u32 prwskeylen; - - u8 *pframe, *payload,*iv,*prwskey; - union pn48 dot11txpn; - struct sta_info *stainfo; - struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; -// struct recv_priv *precvpriv=&padapter->recvpriv; - u32 res=_SUCCESS; - -_func_enter_; - - pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - - //4 start to decrypt recvframe - if(prxattrib->encrypt==_TKIP_){ - - stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); - if (stainfo!=NULL){ - - if(IS_MCAST(prxattrib->ra)) - { - DBG_871X("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); - //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; - prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; - prwskeylen=16; - } - else - { - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n")); - prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - prwskeylen=16; - } - - iv=pframe+prxattrib->hdrlen; - payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; - length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; - - GET_TKIP_PN(iv, dot11txpn); - - pnl=(u16)(dot11txpn.val); - pnh=(u32)(dot11txpn.val>>16); - - phase1((u16 *)&ttkey[0],prwskey,&prxattrib->ta[0],pnh); - phase2(&rc4key[0],prwskey,(unsigned short *)&ttkey[0],pnl); - - //4 decrypt payload include icv - - arcfour_init(&mycontext, rc4key,16); - arcfour_encrypt(&mycontext, payload, payload, length); - - *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4)); - - if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) - { - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", - crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); - res=_FAIL; - } - - - } - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n")); - res=_FAIL; - } - - } -_func_exit_; - return res; - -} - - -//3 =====AES related===== - - - -#define MAX_MSG_SIZE 2048 -/*****************************/ -/******** SBOX Table *********/ -/*****************************/ - - static u8 sbox_table[256] = - { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, - 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, - 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, - 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, - 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, - 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, - 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, - 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, - 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, - 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, - 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, - 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 - }; - -/*****************************/ -/**** Function Prototypes ****/ -/*****************************/ - -static void bitwise_xor(u8 *ina, u8 *inb, u8 *out); -static void construct_mic_iv( - u8 *mic_header1, - sint qc_exists, - sint a4_exists, - u8 *mpdu, - uint payload_length, - u8 * pn_vector); -static void construct_mic_header1( - u8 *mic_header1, - sint header_length, - u8 *mpdu); -static void construct_mic_header2( - u8 *mic_header2, - u8 *mpdu, - sint a4_exists, - sint qc_exists); -static void construct_ctr_preload( - u8 *ctr_preload, - sint a4_exists, - sint qc_exists, - u8 *mpdu, - u8 *pn_vector, - sint c); -static void xor_128(u8 *a, u8 *b, u8 *out); -static void xor_32(u8 *a, u8 *b, u8 *out); -static u8 sbox(u8 a); -static void next_key(u8 *key, sint round); -static void byte_sub(u8 *in, u8 *out); -static void shift_row(u8 *in, u8 *out); -static void mix_column(u8 *in, u8 *out); -static void add_round_key( u8 *shiftrow_in, - u8 *mcol_in, - u8 *block_in, - sint round, - u8 *out); -static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext); - - -/****************************************/ -/* aes128k128d() */ -/* Performs a 128 bit AES encrypt with */ -/* 128 bit data. */ -/****************************************/ -static void xor_128(u8 *a, u8 *b, u8 *out) -{ - sint i; -_func_enter_; - for (i=0;i<16; i++) - { - out[i] = a[i] ^ b[i]; - } -_func_exit_; -} - - -static void xor_32(u8 *a, u8 *b, u8 *out) -{ - sint i; -_func_enter_; - for (i=0;i<4; i++) - { - out[i] = a[i] ^ b[i]; - } -_func_exit_; -} - - -static u8 sbox(u8 a) -{ - return sbox_table[(sint)a]; -} - - -static void next_key(u8 *key, sint round) -{ - u8 rcon; - u8 sbox_key[4]; - u8 rcon_table[12] = - { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x36, 0x36 - }; -_func_enter_; - sbox_key[0] = sbox(key[13]); - sbox_key[1] = sbox(key[14]); - sbox_key[2] = sbox(key[15]); - sbox_key[3] = sbox(key[12]); - - rcon = rcon_table[round]; - - xor_32(&key[0], sbox_key, &key[0]); - key[0] = key[0] ^ rcon; - - xor_32(&key[4], &key[0], &key[4]); - xor_32(&key[8], &key[4], &key[8]); - xor_32(&key[12], &key[8], &key[12]); -_func_exit_; -} - - -static void byte_sub(u8 *in, u8 *out) -{ - sint i; -_func_enter_; - for (i=0; i< 16; i++) - { - out[i] = sbox(in[i]); - } -_func_exit_; -} - - -static void shift_row(u8 *in, u8 *out) -{ -_func_enter_; - out[0] = in[0]; - out[1] = in[5]; - out[2] = in[10]; - out[3] = in[15]; - out[4] = in[4]; - out[5] = in[9]; - out[6] = in[14]; - out[7] = in[3]; - out[8] = in[8]; - out[9] = in[13]; - out[10] = in[2]; - out[11] = in[7]; - out[12] = in[12]; - out[13] = in[1]; - out[14] = in[6]; - out[15] = in[11]; -_func_exit_; -} - - -static void mix_column(u8 *in, u8 *out) -{ - sint i; - u8 add1b[4]; - u8 add1bf7[4]; - u8 rotl[4]; - u8 swap_halfs[4]; - u8 andf7[4]; - u8 rotr[4]; - u8 temp[4]; - u8 tempb[4]; -_func_enter_; - for (i=0 ; i<4; i++) - { - if ((in[i] & 0x80)== 0x80) - add1b[i] = 0x1b; - else - add1b[i] = 0x00; - } - - swap_halfs[0] = in[2]; /* Swap halfs */ - swap_halfs[1] = in[3]; - swap_halfs[2] = in[0]; - swap_halfs[3] = in[1]; - - rotl[0] = in[3]; /* Rotate left 8 bits */ - rotl[1] = in[0]; - rotl[2] = in[1]; - rotl[3] = in[2]; - - andf7[0] = in[0] & 0x7f; - andf7[1] = in[1] & 0x7f; - andf7[2] = in[2] & 0x7f; - andf7[3] = in[3] & 0x7f; - - for (i = 3; i>0; i--) /* logical shift left 1 bit */ - { - andf7[i] = andf7[i] << 1; - if ((andf7[i-1] & 0x80) == 0x80) - { - andf7[i] = (andf7[i] | 0x01); - } - } - andf7[0] = andf7[0] << 1; - andf7[0] = andf7[0] & 0xfe; - - xor_32(add1b, andf7, add1bf7); - - xor_32(in, add1bf7, rotr); - - temp[0] = rotr[0]; /* Rotate right 8 bits */ - rotr[0] = rotr[1]; - rotr[1] = rotr[2]; - rotr[2] = rotr[3]; - rotr[3] = temp[0]; - - xor_32(add1bf7, rotr, temp); - xor_32(swap_halfs, rotl,tempb); - xor_32(temp, tempb, out); -_func_exit_; -} - - -static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext) -{ - sint round; - sint i; - u8 intermediatea[16]; - u8 intermediateb[16]; - u8 round_key[16]; -_func_enter_; - for(i=0; i<16; i++) round_key[i] = key[i]; - - for (round = 0; round < 11; round++) - { - if (round == 0) - { - xor_128(round_key, data, ciphertext); - next_key(round_key, round); - } - else if (round == 10) - { - byte_sub(ciphertext, intermediatea); - shift_row(intermediatea, intermediateb); - xor_128(intermediateb, round_key, ciphertext); - } - else /* 1 - 9 */ - { - byte_sub(ciphertext, intermediatea); - shift_row(intermediatea, intermediateb); - mix_column(&intermediateb[0], &intermediatea[0]); - mix_column(&intermediateb[4], &intermediatea[4]); - mix_column(&intermediateb[8], &intermediatea[8]); - mix_column(&intermediateb[12], &intermediatea[12]); - xor_128(intermediatea, round_key, ciphertext); - next_key(round_key, round); - } - } -_func_exit_; -} - - -/************************************************/ -/* construct_mic_iv() */ -/* Builds the MIC IV from header fields and PN */ -/************************************************/ -static void construct_mic_iv( - u8 *mic_iv, - sint qc_exists, - sint a4_exists, - u8 *mpdu, - uint payload_length, - u8 *pn_vector - ) -{ - sint i; -_func_enter_; - mic_iv[0] = 0x59; - if (qc_exists && a4_exists) mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ - if (qc_exists && !a4_exists) mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ - if (!qc_exists) mic_iv[1] = 0x00; - for (i = 2; i < 8; i++) - mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ - #ifdef CONSISTENT_PN_ORDER - for (i = 8; i < 14; i++) - mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */ - #else - for (i = 8; i < 14; i++) - mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ - #endif - mic_iv[14] = (unsigned char) (payload_length / 256); - mic_iv[15] = (unsigned char) (payload_length % 256); -_func_exit_; -} - - -/************************************************/ -/* construct_mic_header1() */ -/* Builds the first MIC header block from */ -/* header fields. */ -/************************************************/ -static void construct_mic_header1( - u8 *mic_header1, - sint header_length, - u8 *mpdu - ) -{ -_func_enter_; - mic_header1[0] = (u8)((header_length - 2) / 256); - mic_header1[1] = (u8)((header_length - 2) % 256); - mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ - mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ - mic_header1[4] = mpdu[4]; /* A1 */ - mic_header1[5] = mpdu[5]; - mic_header1[6] = mpdu[6]; - mic_header1[7] = mpdu[7]; - mic_header1[8] = mpdu[8]; - mic_header1[9] = mpdu[9]; - mic_header1[10] = mpdu[10]; /* A2 */ - mic_header1[11] = mpdu[11]; - mic_header1[12] = mpdu[12]; - mic_header1[13] = mpdu[13]; - mic_header1[14] = mpdu[14]; - mic_header1[15] = mpdu[15]; -_func_exit_; -} - - -/************************************************/ -/* construct_mic_header2() */ -/* Builds the last MIC header block from */ -/* header fields. */ -/************************************************/ -static void construct_mic_header2( - u8 *mic_header2, - u8 *mpdu, - sint a4_exists, - sint qc_exists - ) -{ - sint i; -_func_enter_; - for (i = 0; i<16; i++) mic_header2[i]=0x00; - - mic_header2[0] = mpdu[16]; /* A3 */ - mic_header2[1] = mpdu[17]; - mic_header2[2] = mpdu[18]; - mic_header2[3] = mpdu[19]; - mic_header2[4] = mpdu[20]; - mic_header2[5] = mpdu[21]; - - //mic_header2[6] = mpdu[22] & 0xf0; /* SC */ - mic_header2[6] = 0x00; - mic_header2[7] = 0x00; /* mpdu[23]; */ - - - if (!qc_exists && a4_exists) - { - for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ - - } - - if (qc_exists && !a4_exists) - { - mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ - mic_header2[9] = mpdu[25] & 0x00; - } - - if (qc_exists && a4_exists) - { - for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ - - mic_header2[14] = mpdu[30] & 0x0f; - mic_header2[15] = mpdu[31] & 0x00; - } - -_func_exit_; -} - - -/************************************************/ -/* construct_mic_header2() */ -/* Builds the last MIC header block from */ -/* header fields. */ -/************************************************/ -static void construct_ctr_preload( - u8 *ctr_preload, - sint a4_exists, - sint qc_exists, - u8 *mpdu, - u8 *pn_vector, - sint c - ) -{ - sint i = 0; -_func_enter_; - for (i=0; i<16; i++) ctr_preload[i] = 0x00; - i = 0; - - ctr_preload[0] = 0x01; /* flag */ - if (qc_exists && a4_exists) - ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ - if (qc_exists && !a4_exists) - ctr_preload[1] = mpdu[24] & 0x0f; - - for (i = 2; i < 8; i++) - ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ - #ifdef CONSISTENT_PN_ORDER - for (i = 8; i < 14; i++) - ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */ - #else - for (i = 8; i < 14; i++) - ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ - #endif - ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */ - ctr_preload[15] = (unsigned char) (c % 256); -_func_exit_; -} - - -/************************************/ -/* bitwise_xor() */ -/* A 128 bit, bitwise exclusive or */ -/************************************/ -static void bitwise_xor(u8 *ina, u8 *inb, u8 *out) -{ - sint i; -_func_enter_; - for (i=0; i<16; i++) - { - out[i] = ina[i] ^ inb[i]; - } -_func_exit_; -} - - -static sint aes_cipher(u8 *key, uint hdrlen, - u8 *pframe, uint plen) -{ -// /*static*/ unsigned char message[MAX_MSG_SIZE]; - uint qc_exists, a4_exists, i, j, payload_remainder, - num_blocks, payload_index; - - u8 pn_vector[6]; - u8 mic_iv[16]; - u8 mic_header1[16]; - u8 mic_header2[16]; - u8 ctr_preload[16]; - - /* Intermediate Buffers */ - u8 chain_buffer[16]; - u8 aes_out[16]; - u8 padded_buffer[16]; - u8 mic[8]; -// uint offset = 0; - uint frtype = GetFrameType(pframe); - uint frsubtype = GetFrameSubType(pframe); - -_func_enter_; - frsubtype=frsubtype>>4; - - - _rtw_memset((void *)mic_iv, 0, 16); - _rtw_memset((void *)mic_header1, 0, 16); - _rtw_memset((void *)mic_header2, 0, 16); - _rtw_memset((void *)ctr_preload, 0, 16); - _rtw_memset((void *)chain_buffer, 0, 16); - _rtw_memset((void *)aes_out, 0, 16); - _rtw_memset((void *)padded_buffer, 0, 16); - - if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) - a4_exists = 0; - else - a4_exists = 1; - - if ( - (frtype == WIFI_DATA_CFACK) || - (frtype == WIFI_DATA_CFPOLL)|| - (frtype == WIFI_DATA_CFACKPOLL)) - { - qc_exists = 1; - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - } - else if ( - (frsubtype == 0x08) || - (frsubtype == 0x09)|| - (frsubtype == 0x0a)|| - (frsubtype == 0x0b)) - { - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - qc_exists = 1; - } - else - qc_exists = 0; - - pn_vector[0]=pframe[hdrlen]; - pn_vector[1]=pframe[hdrlen+1]; - pn_vector[2]=pframe[hdrlen+4]; - pn_vector[3]=pframe[hdrlen+5]; - pn_vector[4]=pframe[hdrlen+6]; - pn_vector[5]=pframe[hdrlen+7]; - - construct_mic_iv( - mic_iv, - qc_exists, - a4_exists, - pframe, //message, - plen, - pn_vector - ); - - construct_mic_header1( - mic_header1, - hdrlen, - pframe //message - ); - construct_mic_header2( - mic_header2, - pframe, //message, - a4_exists, - qc_exists - ); - - - payload_remainder = plen % 16; - num_blocks = plen / 16; - - /* Find start of payload */ - payload_index = (hdrlen + 8); - - /* Calculate MIC */ - aes128k128d(key, mic_iv, aes_out); - bitwise_xor(aes_out, mic_header1, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); - bitwise_xor(aes_out, mic_header2, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); - - for (i = 0; i < num_blocks; i++) - { - bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); - - payload_index += 16; - aes128k128d(key, chain_buffer, aes_out); - } - - /* Add on the final payload block if it needs padding */ - if (payload_remainder > 0) - { - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = pframe[payload_index++];//padded_buffer[j] = message[payload_index++]; - } - bitwise_xor(aes_out, padded_buffer, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); - - } - - for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; - - /* Insert MIC into payload */ - for (j = 0; j < 8; j++) - pframe[payload_index+j] = mic[j]; //message[payload_index+j] = mic[j]; - - payload_index = hdrlen + 8; - for (i=0; i< num_blocks; i++) - { - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, //message, - pn_vector, - i+1); - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); - for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; - } - - if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ - { /* encrypt it and copy the unpadded part back */ - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, //message, - pn_vector, - num_blocks+1); - - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = pframe[payload_index+j];//padded_buffer[j] = message[payload_index+j]; - } - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - for (j=0; jattrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - -// uint offset = 0; - u32 res=_SUCCESS; -_func_enter_; - - if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) - return _FAIL; - -#ifdef CONFIG_USB_TX_AGGREGATION - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + - (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); -#else - pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; -#endif - - //4 start to encrypt each fragment - if((pattrib->encrypt==_AES_)){ - - if(pattrib->psta) - { - stainfo = pattrib->psta; - } - else - { - stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); - } - - if (stainfo!=NULL){ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo!=NULL!!!\n")); - - if(IS_MCAST(pattrib->ra)) - { - prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; - } - else - { - prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - } - - prwskeylen=16; - - for(curfragnum=0;curfragnumnr_frags;curfragnum++){ - - if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; - - aes_cipher(prwskey,pattrib->hdrlen,pframe, length); - } - else{ - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; - - aes_cipher(prwskey,pattrib->hdrlen,pframe, length); - pframe+=pxmitpriv->frag_len; - pframe=(u8*)RND4((SIZE_PTR)(pframe)); - - } - } - - - } - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n")); - res=_FAIL; - } - - } - - - -_func_exit_; - return res; -} - -static sint aes_decipher(u8 *key, uint hdrlen, - u8 *pframe, uint plen) -{ - static u8 message[MAX_MSG_SIZE]; - uint qc_exists, a4_exists, i, j, payload_remainder, - num_blocks, payload_index; - - u8 pn_vector[6]; - u8 mic_iv[16]; - u8 mic_header1[16]; - u8 mic_header2[16]; - u8 ctr_preload[16]; - - /* Intermediate Buffers */ - u8 chain_buffer[16]; - u8 aes_out[16]; - u8 padded_buffer[16]; - u8 mic[8]; - - -// uint offset = 0; - uint frtype = GetFrameType(pframe); - uint frsubtype = GetFrameSubType(pframe); -_func_enter_; - frsubtype=frsubtype>>4; - - - _rtw_memset((void *)mic_iv, 0, 16); - _rtw_memset((void *)mic_header1, 0, 16); - _rtw_memset((void *)mic_header2, 0, 16); - _rtw_memset((void *)ctr_preload, 0, 16); - _rtw_memset((void *)chain_buffer, 0, 16); - _rtw_memset((void *)aes_out, 0, 16); - _rtw_memset((void *)padded_buffer, 0, 16); - - //start to decrypt the payload - - num_blocks = (plen-8) / 16; //(plen including llc, payload_length and mic ) - - payload_remainder = (plen-8) % 16; - - pn_vector[0] = pframe[hdrlen]; - pn_vector[1] = pframe[hdrlen+1]; - pn_vector[2] = pframe[hdrlen+4]; - pn_vector[3] = pframe[hdrlen+5]; - pn_vector[4] = pframe[hdrlen+6]; - pn_vector[5] = pframe[hdrlen+7]; - - if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) - a4_exists = 0; - else - a4_exists = 1; - - if ( - (frtype == WIFI_DATA_CFACK) || - (frtype == WIFI_DATA_CFPOLL)|| - (frtype == WIFI_DATA_CFACKPOLL)) - { - qc_exists = 1; - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - } - else if ( - (frsubtype == 0x08) || - (frsubtype == 0x09)|| - (frsubtype == 0x0a)|| - (frsubtype == 0x0b)) - { - if(hdrlen != WLAN_HDR_A3_QOS_LEN){ - - hdrlen += 2; - } - qc_exists = 1; - } - else - qc_exists = 0; - - - // now, decrypt pframe with hdrlen offset and plen long - - payload_index = hdrlen + 8; // 8 is for extiv - - for (i=0; i< num_blocks; i++) - { - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, - pn_vector, - i+1 - ); - - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, &pframe[payload_index], chain_buffer); - - for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j]; - } - - if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ - { /* encrypt it and copy the unpadded part back */ - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - pframe, - pn_vector, - num_blocks+1 - ); - - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = pframe[payload_index+j]; - } - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - for (j=0; j 0) - { - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = message[payload_index++]; - } - bitwise_xor(aes_out, padded_buffer, chain_buffer); - aes128k128d(key, chain_buffer, aes_out); - - } - - for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; - - /* Insert MIC into payload */ - for (j = 0; j < 8; j++) - message[payload_index+j] = mic[j]; - - payload_index = hdrlen + 8; - for (i=0; i< num_blocks; i++) - { - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - message, - pn_vector, - i+1); - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, &message[payload_index], chain_buffer); - for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; - } - - if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ - { /* encrypt it and copy the unpadded part back */ - construct_ctr_preload( - ctr_preload, - a4_exists, - qc_exists, - message, - pn_vector, - num_blocks+1); - - for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; - for (j = 0; j < payload_remainder; j++) - { - padded_buffer[j] = message[payload_index+j]; - } - aes128k128d(key, ctr_preload, aes_out); - bitwise_xor(aes_out, padded_buffer, chain_buffer); - for (j=0; ju.hdr.attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; -// struct recv_priv *precvpriv=&padapter->recvpriv; - u32 res=_SUCCESS; -_func_enter_; - pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; - //4 start to encrypt each fragment - if((prxattrib->encrypt==_AES_)){ - - stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); - if (stainfo!=NULL){ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo!=NULL!!!\n")); - - if(IS_MCAST(prxattrib->ra)) - { - DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n"); - //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; - prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; - prwskeylen=16; - } - else - { - prwskey=&stainfo->dot118021x_UncstKey.skey[0]; - prwskeylen=16; - } - - length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; - - aes_decipher(prwskey,prxattrib->hdrlen,pframe, length); - - - } - else{ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n")); - res=_FAIL; - } - - } -_func_exit_; - return res; -} - -/* compress 512-bits */ -static int sha256_compress(struct sha256_state *md, unsigned char *buf) -{ - u32 S[8], W[64], t0, t1; - u32 t; - int i; - - /* copy state into S */ - for (i = 0; i < 8; i++) { - S[i] = md->state[i]; - } - - /* copy the state into 512-bits into W[0..15] */ - for (i = 0; i < 16; i++) - W[i] = WPA_GET_BE32(buf + (4 * i)); - - /* fill W[16..63] */ - for (i = 16; i < 64; i++) { - W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + - W[i - 16]; - } - - /* Compress */ -#define RND(a,b,c,d,e,f,g,h,i) \ - t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ - t1 = Sigma0(a) + Maj(a, b, c); \ - d += t0; \ - h = t0 + t1; - - for (i = 0; i < 64; ++i) { - RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i); - t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; - S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t; - } - - /* feedback */ - for (i = 0; i < 8; i++) { - md->state[i] = md->state[i] + S[i]; - } - return 0; -} - -/* Initialize the hash state */ -static void sha256_init(struct sha256_state *md) -{ - md->curlen = 0; - md->length = 0; - md->state[0] = 0x6A09E667UL; - md->state[1] = 0xBB67AE85UL; - md->state[2] = 0x3C6EF372UL; - md->state[3] = 0xA54FF53AUL; - md->state[4] = 0x510E527FUL; - md->state[5] = 0x9B05688CUL; - md->state[6] = 0x1F83D9ABUL; - md->state[7] = 0x5BE0CD19UL; -} - -/** - Process a block of memory though the hash - @param md The hash state - @param in The data to hash - @param inlen The length of the data (octets) - @return CRYPT_OK if successful -*/ -static int sha256_process(struct sha256_state *md, unsigned char *in, - unsigned long inlen) -{ - unsigned long n; -#define block_size 64 - - if (md->curlen > sizeof(md->buf)) - return -1; - - while (inlen > 0) { - if (md->curlen == 0 && inlen >= block_size) { - if (sha256_compress(md, (unsigned char *) in) < 0) - return -1; - md->length += block_size * 8; - in += block_size; - inlen -= block_size; - } else { - n = MIN(inlen, (block_size - md->curlen)); - _rtw_memcpy(md->buf + md->curlen, in, n); - md->curlen += n; - in += n; - inlen -= n; - if (md->curlen == block_size) { - if (sha256_compress(md, md->buf) < 0) - return -1; - md->length += 8 * block_size; - md->curlen = 0; - } - } - } - - return 0; -} - - -/** - Terminate the hash to get the digest - @param md The hash state - @param out [out] The destination of the hash (32 bytes) - @return CRYPT_OK if successful -*/ -static int sha256_done(struct sha256_state *md, unsigned char *out) -{ - int i; - - if (md->curlen >= sizeof(md->buf)) - return -1; - - /* increase the length of the message */ - md->length += md->curlen * 8; - - /* append the '1' bit */ - md->buf[md->curlen++] = (unsigned char) 0x80; - - /* if the length is currently above 56 bytes we append zeros - * then compress. Then we can fall back to padding zeros and length - * encoding like normal. - */ - if (md->curlen > 56) { - while (md->curlen < 64) { - md->buf[md->curlen++] = (unsigned char) 0; - } - sha256_compress(md, md->buf); - md->curlen = 0; - } - - /* pad upto 56 bytes of zeroes */ - while (md->curlen < 56) { - md->buf[md->curlen++] = (unsigned char) 0; - } - - /* store length */ - WPA_PUT_BE64(md->buf + 56, md->length); - sha256_compress(md, md->buf); - - /* copy output */ - for (i = 0; i < 8; i++) - WPA_PUT_BE32(out + (4 * i), md->state[i]); - - return 0; -} - -/** - * sha256_vector - SHA256 hash for data vector - * @num_elem: Number of elements in the data vector - * @addr: Pointers to the data areas - * @len: Lengths of the data blocks - * @mac: Buffer for the hash - * Returns: 0 on success, -1 of failure - */ -static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len, - u8 *mac) -{ - struct sha256_state ctx; - size_t i; - - sha256_init(&ctx); - for (i = 0; i < num_elem; i++) - if (sha256_process(&ctx, addr[i], len[i])) - return -1; - if (sha256_done(&ctx, mac)) - return -1; - return 0; -} - -static u8 os_strlen(const char *s) -{ - const char *p = s; - while (*p) - p++; - return p - s; -} - -static int os_memcmp(void *s1, void *s2, u8 n) -{ - unsigned char *p1 = s1, *p2 = s2; - - if (n == 0) - return 0; - - while (*p1 == *p2) { - p1++; - p2++; - n--; - if (n == 0) - return 0; - } - - return *p1 - *p2; -} - -/** - * hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104) - * @key: Key for HMAC operations - * @key_len: Length of the key in bytes - * @num_elem: Number of elements in the data vector - * @addr: Pointers to the data areas - * @len: Lengths of the data blocks - * @mac: Buffer for the hash (32 bytes) - */ -static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem, - u8 *addr[], size_t *len, u8 *mac) -{ - unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */ - unsigned char tk[32]; - u8 *_addr[6]; - size_t _len[6], i; - - if (num_elem > 5) { - /* - * Fixed limit on the number of fragments to avoid having to - * allocate memory (which could fail). - */ - return; - } - - /* if key is longer than 64 bytes reset it to key = SHA256(key) */ - if (key_len > 64) { - sha256_vector(1, &key, &key_len, tk); - key = tk; - key_len = 32; - } - - /* the HMAC_SHA256 transform looks like: - * - * SHA256(K XOR opad, SHA256(K XOR ipad, text)) - * - * where K is an n byte key - * ipad is the byte 0x36 repeated 64 times - * opad is the byte 0x5c repeated 64 times - * and text is the data being protected */ - - /* start out by storing key in ipad */ - _rtw_memset(k_pad, 0, sizeof(k_pad)); - _rtw_memcpy(k_pad, key, key_len); - /* XOR key with ipad values */ - for (i = 0; i < 64; i++) - k_pad[i] ^= 0x36; - - /* perform inner SHA256 */ - _addr[0] = k_pad; - _len[0] = 64; - for (i = 0; i < num_elem; i++) { - _addr[i + 1] = addr[i]; - _len[i + 1] = len[i]; - } - sha256_vector(1 + num_elem, _addr, _len, mac); - - _rtw_memset(k_pad, 0, sizeof(k_pad)); - _rtw_memcpy(k_pad, key, key_len); - /* XOR key with opad values */ - for (i = 0; i < 64; i++) - k_pad[i] ^= 0x5c; - - /* perform outer SHA256 */ - _addr[0] = k_pad; - _len[0] = 64; - _addr[1] = mac; - _len[1] = 32; - sha256_vector(2, _addr, _len, mac); -} - -/** - * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2) - * @key: Key for PRF - * @key_len: Length of the key in bytes - * @label: A unique label for each purpose of the PRF - * @data: Extra data to bind into the key - * @data_len: Length of the data - * @buf: Buffer for the generated pseudo-random key - * @buf_len: Number of bytes of key to generate - * - * This function is used to derive new, cryptographically separate keys from a - * given key. - */ -static void sha256_prf(u8 *key, size_t key_len, char *label, - u8 *data, size_t data_len, u8 *buf, size_t buf_len) -{ - u16 counter = 1; - size_t pos, plen; - u8 hash[SHA256_MAC_LEN]; - u8 *addr[4]; - size_t len[4]; - u8 counter_le[2], length_le[2]; - - addr[0] = counter_le; - len[0] = 2; - addr[1] = (u8 *) label; - len[1] = os_strlen(label); - addr[2] = data; - len[2] = data_len; - addr[3] = length_le; - len[3] = sizeof(length_le); - - WPA_PUT_LE16(length_le, buf_len * 8); - pos = 0; - while (pos < buf_len) { - plen = buf_len - pos; - WPA_PUT_LE16(counter_le, counter); - if (plen >= SHA256_MAC_LEN) { - hmac_sha256_vector(key, key_len, 4, addr, len, - &buf[pos]); - pos += SHA256_MAC_LEN; - } else { - hmac_sha256_vector(key, key_len, 4, addr, len, hash); - _rtw_memcpy(&buf[pos], hash, plen); - break; - } - counter++; - } -} - -/* AES tables*/ -const u32 Te0[256] = { - 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, - 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, - 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, - 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, - 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, - 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, - 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, - 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, - 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, - 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, - 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, - 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, - 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, - 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, - 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, - 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, - 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, - 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, - 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, - 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, - 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, - 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, - 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, - 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, - 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, - 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, - 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, - 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, - 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, - 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, - 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, - 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, - 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, - 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, - 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, - 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, - 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, - 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, - 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, - 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, - 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, - 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, - 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, - 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, - 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, - 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, - 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, - 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, - 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, - 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, - 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, - 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, - 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, - 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, - 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, - 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, - 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, - 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, - 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, - 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, - 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, - 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, - 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, - 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, -}; -const u32 Td0[256] = { - 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, - 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, - 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, - 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, - 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, - 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, - 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, - 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, - 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, - 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, - 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, - 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, - 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, - 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, - 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, - 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, - 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, - 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, - 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, - 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, - 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, - 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, - 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, - 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, - 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, - 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, - 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, - 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, - 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, - 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, - 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, - 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, - 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, - 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, - 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, - 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, - 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, - 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, - 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, - 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, - 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, - 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, - 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, - 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, - 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, - 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, - 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, - 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, - 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, - 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, - 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, - 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, - 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, - 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, - 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, - 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, - 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, - 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, - 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, - 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, - 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, - 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, - 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, - 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, -}; -const u8 Td4s[256] = { - 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, - 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, - 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, - 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, - 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, - 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, - 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, - 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, - 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, - 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, - 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, - 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, - 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, - 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, - 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, - 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, - 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, - 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, - 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, - 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, - 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, - 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, - 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, - 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, - 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, - 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, - 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, - 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, - 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, - 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, - 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, - 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, -}; -const u8 rcons[] = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 - /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ -}; - -/** - * Expand the cipher key into the encryption key schedule. - * - * @return the number of rounds for the given cipher key size. - */ -static void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[]) -{ - int i; - u32 temp; - - rk[0] = GETU32(cipherKey ); - rk[1] = GETU32(cipherKey + 4); - rk[2] = GETU32(cipherKey + 8); - rk[3] = GETU32(cipherKey + 12); - for (i = 0; i < 10; i++) { - temp = rk[3]; - rk[4] = rk[0] ^ - TE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^ - RCON(i); - rk[5] = rk[1] ^ rk[4]; - rk[6] = rk[2] ^ rk[5]; - rk[7] = rk[3] ^ rk[6]; - rk += 4; - } -} - -static void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16]) -{ - u32 s0, s1, s2, s3, t0, t1, t2, t3; - int Nr = 10; -#ifndef FULL_UNROLL - int r; -#endif /* ?FULL_UNROLL */ - - /* - * map byte array block to cipher state - * and add initial round key: - */ - s0 = GETU32(pt ) ^ rk[0]; - s1 = GETU32(pt + 4) ^ rk[1]; - s2 = GETU32(pt + 8) ^ rk[2]; - s3 = GETU32(pt + 12) ^ rk[3]; - -#define ROUND(i,d,s) \ -d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \ -d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \ -d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \ -d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3] - -#ifdef FULL_UNROLL - - ROUND(1,t,s); - ROUND(2,s,t); - ROUND(3,t,s); - ROUND(4,s,t); - ROUND(5,t,s); - ROUND(6,s,t); - ROUND(7,t,s); - ROUND(8,s,t); - ROUND(9,t,s); - - rk += Nr << 2; - -#else /* !FULL_UNROLL */ - - /* Nr - 1 full rounds: */ - r = Nr >> 1; - for (;;) { - ROUND(1,t,s); - rk += 8; - if (--r == 0) - break; - ROUND(0,s,t); - } - -#endif /* ?FULL_UNROLL */ - -#undef ROUND - - /* - * apply last round and - * map cipher state to byte array block: - */ - s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0]; - PUTU32(ct , s0); - s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1]; - PUTU32(ct + 4, s1); - s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2]; - PUTU32(ct + 8, s2); - s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3]; - PUTU32(ct + 12, s3); -} - -static void * aes_encrypt_init(u8 *key, size_t len) -{ - u32 *rk; - if (len != 16) - return NULL; - rk = (u32*)rtw_malloc(AES_PRIV_SIZE); - if (rk == NULL) - return NULL; - rijndaelKeySetupEnc(rk, key); - return rk; -} - -static void aes_128_encrypt(void *ctx, u8 *plain, u8 *crypt) -{ - rijndaelEncrypt(ctx, plain, crypt); -} - - -static void gf_mulx(u8 *pad) -{ - int i, carry; - - carry = pad[0] & 0x80; - for (i = 0; i < AES_BLOCK_SIZE - 1; i++) - pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7); - pad[AES_BLOCK_SIZE - 1] <<= 1; - if (carry) - pad[AES_BLOCK_SIZE - 1] ^= 0x87; -} - -static void aes_encrypt_deinit(void *ctx) -{ - _rtw_memset(ctx, 0, AES_PRIV_SIZE); - rtw_mfree(ctx, AES_PRIV_SIZE); -} - - -/** - * omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128 - * @key: 128-bit key for the hash operation - * @num_elem: Number of elements in the data vector - * @addr: Pointers to the data areas - * @len: Lengths of the data blocks - * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) - * Returns: 0 on success, -1 on failure - * - * This is a mode for using block cipher (AES in this case) for authentication. - * OMAC1 was standardized with the name CMAC by NIST in a Special Publication - * (SP) 800-38B. - */ -static int omac1_aes_128_vector(u8 *key, size_t num_elem, - u8 *addr[], size_t *len, u8 *mac) -{ - void *ctx; - u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE]; - u8 *pos, *end; - size_t i, e, left, total_len; - - ctx = aes_encrypt_init(key, 16); - if (ctx == NULL) - return -1; - _rtw_memset(cbc, 0, AES_BLOCK_SIZE); - - total_len = 0; - for (e = 0; e < num_elem; e++) - total_len += len[e]; - left = total_len; - - e = 0; - pos = addr[0]; - end = pos + len[0]; - - while (left >= AES_BLOCK_SIZE) { - for (i = 0; i < AES_BLOCK_SIZE; i++) { - cbc[i] ^= *pos++; - if (pos >= end) { - e++; - pos = addr[e]; - end = pos + len[e]; - } - } - if (left > AES_BLOCK_SIZE) - aes_128_encrypt(ctx, cbc, cbc); - left -= AES_BLOCK_SIZE; - } - - _rtw_memset(pad, 0, AES_BLOCK_SIZE); - aes_128_encrypt(ctx, pad, pad); - gf_mulx(pad); - - if (left || total_len == 0) { - for (i = 0; i < left; i++) { - cbc[i] ^= *pos++; - if (pos >= end) { - e++; - pos = addr[e]; - end = pos + len[e]; - } - } - cbc[left] ^= 0x80; - gf_mulx(pad); - } - - for (i = 0; i < AES_BLOCK_SIZE; i++) - pad[i] ^= cbc[i]; - aes_128_encrypt(ctx, pad, mac); - aes_encrypt_deinit(ctx); - return 0; -} - - -/** - * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC) - * @key: 128-bit key for the hash operation - * @data: Data buffer for which a MAC is determined - * @data_len: Length of data buffer in bytes - * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) - * Returns: 0 on success, -1 on failure - * - * This is a mode for using block cipher (AES in this case) for authentication. - * OMAC1 was standardized with the name CMAC by NIST in a Special Publication - * (SP) 800-38B. - */ -static int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac) -{ - return omac1_aes_128_vector(key, 1, &data, &data_len, mac); -} - -#ifdef CONFIG_TDLS -void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 *SNonce = psta->SNonce; - u8 *ANonce = psta->ANonce; - - u8 key_input[SHA256_MAC_LEN]; - u8 *nonce[2]; - size_t len[2]; - u8 data[3 * ETH_ALEN]; - - /* IEEE Std 802.11z-2010 8.5.9.1: - * TPK-Key-Input = SHA-256(min(SNonce, ANonce) || max(SNonce, ANonce)) - */ - len[0] = 32; - len[1] = 32; - if (os_memcmp(SNonce, ANonce, 32) < 0) { - nonce[0] = SNonce; - nonce[1] = ANonce; - } else { - nonce[0] = ANonce; - nonce[1] = SNonce; - } - - sha256_vector(2, nonce, len, key_input); - - /* - * TPK-Key-Data = KDF-N_KEY(TPK-Key-Input, "TDLS PMK", - * min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || BSSID || N_KEY) - * TODO: is N_KEY really included in KDF Context and if so, in which - * presentation format (little endian 16-bit?) is it used? It gets - * added by the KDF anyway.. - */ - - if (os_memcmp(myid(&(padapter->eeprompriv)), psta->hwaddr, ETH_ALEN) < 0) { - _rtw_memcpy(data, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(data + ETH_ALEN, psta->hwaddr, ETH_ALEN); - } else { - _rtw_memcpy(data, psta->hwaddr, ETH_ALEN); - _rtw_memcpy(data + ETH_ALEN, myid(&(padapter->eeprompriv)), ETH_ALEN); - } - _rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN); - - sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk)); - - -} - -/** - * wpa_tdls_ftie_mic - Calculate TDLS FTIE MIC - * @kck: TPK-KCK - * @lnkid: Pointer to the beginning of Link Identifier IE - * @rsnie: Pointer to the beginning of RSN IE used for handshake - * @timeoutie: Pointer to the beginning of Timeout IE used for handshake - * @ftie: Pointer to the beginning of FT IE - * @mic: Pointer for writing MIC - * - * Calculate MIC for TDLS frame. - */ -int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, - u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, - u8 *mic) -{ - u8 *buf, *pos; - struct wpa_tdls_ftie *_ftie; - struct wpa_tdls_lnkid *_lnkid; - int ret; - int len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] + - 2 + timeoutie[1] + 2 + ftie[1]; - buf = rtw_zmalloc(len); - if (!buf) { - DBG_8192C("TDLS: No memory for MIC calculation\n"); - return -1; - } - - pos = buf; - _lnkid = (struct wpa_tdls_lnkid *) lnkid; - /* 1) TDLS initiator STA MAC address */ - _rtw_memcpy(pos, _lnkid->init_sta, ETH_ALEN); - pos += ETH_ALEN; - /* 2) TDLS responder STA MAC address */ - _rtw_memcpy(pos, _lnkid->resp_sta, ETH_ALEN); - pos += ETH_ALEN; - /* 3) Transaction Sequence number */ - *pos++ = trans_seq; - /* 4) Link Identifier IE */ - _rtw_memcpy(pos, lnkid, 2 + lnkid[1]); - pos += 2 + lnkid[1]; - /* 5) RSN IE */ - _rtw_memcpy(pos, rsnie, 2 + rsnie[1]); - pos += 2 + rsnie[1]; - /* 6) Timeout Interval IE */ - _rtw_memcpy(pos, timeoutie, 2 + timeoutie[1]); - pos += 2 + timeoutie[1]; - /* 7) FTIE, with the MIC field of the FTIE set to 0 */ - _rtw_memcpy(pos, ftie, 2 + ftie[1]); - _ftie = (struct wpa_tdls_ftie *) pos; - _rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN); - pos += 2 + ftie[1]; - - ret = omac1_aes_128(kck, buf, pos - buf, mic); - rtw_mfree(buf, len); - return ret; - -} - -int tdls_verify_mic(u8 *kck, u8 trans_seq, - u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie) -{ - u8 *buf, *pos; - int len; - u8 mic[16]; - int ret; - u8 *rx_ftie, *tmp_ftie; - - if (lnkid == NULL || rsnie == NULL || - timeoutie == NULL || ftie == NULL){ - DBG_8192C("pointer fail\n"); - return 0; - } - - len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie+1) + 2 + *(timeoutie+1) + 2 + *(ftie+1); - - buf = rtw_zmalloc(len); - if (buf == NULL) - return 0; - - pos = buf; - /* 1) TDLS initiator STA MAC address */ - _rtw_memcpy(pos, lnkid + ETH_ALEN + 2, ETH_ALEN); - pos += ETH_ALEN; - /* 2) TDLS responder STA MAC address */ - _rtw_memcpy(pos, lnkid + 2 * ETH_ALEN + 2, ETH_ALEN); - pos += ETH_ALEN; - /* 3) Transaction Sequence number */ - *pos++ = trans_seq; - /* 4) Link Identifier IE */ - _rtw_memcpy(pos, lnkid, 2 + 18); - pos += 2 + 18; - /* 5) RSN IE */ - _rtw_memcpy(pos, rsnie, 2 + *(rsnie+1)); - pos += 2 + *(rsnie+1); - /* 6) Timeout Interval IE */ - _rtw_memcpy(pos, timeoutie, 2 + *(timeoutie+1)); - pos += 2 + *(timeoutie+1); - /* 7) FTIE, with the MIC field of the FTIE set to 0 */ - _rtw_memcpy(pos, ftie, 2 + *(ftie+1)); - pos += 2; - tmp_ftie = (u8 *) (pos+2); - _rtw_memset(tmp_ftie, 0, 16); - pos += *(ftie+1); - - ret = omac1_aes_128(kck, buf, pos - buf, mic); - rtw_mfree(buf, len); - if (ret) - return 0; - rx_ftie = ftie+4; - - if (os_memcmp(mic, rx_ftie, 16) == 0) { - //Valid MIC - DBG_8192C( "[%s] Valid MIC\n", __FUNCTION__); - return 1; - } - //Invalid MIC - DBG_8192C( "[%s] Invalid MIC\n", __FUNCTION__); - return 0; - -} -#endif - -#ifdef PLATFORM_WINDOWS -void rtw_use_tkipkey_handler ( - IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3 - ) -#endif -#ifdef PLATFORM_LINUX -void rtw_use_tkipkey_handler(void *FunctionContext) -#endif -{ - _adapter *padapter = (_adapter *)FunctionContext; - - -_func_enter_; - - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler ^^^\n")); - -/* - if(padapter->bDriverStopped ||padapter->bSurpriseRemoved){ - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler (padapter->bDriverStopped %d)(padapter->bSurpriseRemoved %d)^^^\n",padapter->bDriverStopped,padapter->bSurpriseRemoved)); - - return; - } - */ - - padapter->securitypriv.busetkipkey=_TRUE; - - RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler padapter->securitypriv.busetkipkey=%d^^^\n",padapter->securitypriv.busetkipkey)); - -_func_exit_; - -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c b/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c deleted file mode 100755 index cf478b2fe7f4..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c +++ /dev/null @@ -1,654 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_STA_MGT_C_ - -#include -#include -#include -#include -#include -#include - - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -#include - - -void _rtw_init_stainfo(struct sta_info *psta) -{ - -_func_enter_; - - _rtw_memset((u8 *)psta, 0, sizeof (struct sta_info)); - - _rtw_spinlock_init(&psta->lock); - _rtw_init_listhead(&psta->list); - _rtw_init_listhead(&psta->hash_list); - //_rtw_init_listhead(&psta->asoc_list); - //_rtw_init_listhead(&psta->sleep_list); - //_rtw_init_listhead(&psta->wakeup_list); - - _rtw_init_queue(&psta->sleep_q); - psta->sleepq_len = 0; - - _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); - _rtw_init_sta_recv_priv(&psta->sta_recvpriv); - -#ifdef CONFIG_AP_MODE - - _rtw_init_listhead(&psta->asoc_list); - - _rtw_init_listhead(&psta->auth_list); - - psta->expire_to = 0; - - psta->flags = 0; - - psta->capability = 0; - - -#ifdef CONFIG_NATIVEAP_MLME - psta->nonerp_set = 0; - psta->no_short_slot_time_set = 0; - psta->no_short_preamble_set = 0; - psta->no_ht_gf_set = 0; - psta->no_ht_set = 0; - psta->ht_20mhz_set = 0; -#endif - -#endif - -_func_exit_; - -} - -u32 _rtw_init_sta_priv(struct sta_priv *pstapriv) -{ - struct sta_info *psta; - s32 i; - -_func_enter_; - - pstapriv->pallocated_stainfo_buf = rtw_zvmalloc (sizeof(struct sta_info) * NUM_STA+ 4); - - if(!pstapriv->pallocated_stainfo_buf) - return _FAIL; - - pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - - ((SIZE_PTR)(pstapriv->pallocated_stainfo_buf ) & 3); - - _rtw_init_queue(&pstapriv->free_sta_queue); - - _rtw_spinlock_init(&pstapriv->sta_hash_lock); - - //_rtw_init_queue(&pstapriv->asoc_q); - pstapriv->asoc_sta_count = 0; - _rtw_init_queue(&pstapriv->sleep_q); - _rtw_init_queue(&pstapriv->wakeup_q); - - psta = (struct sta_info *)(pstapriv->pstainfo_buf); - - - for(i = 0; i < NUM_STA; i++) - { - _rtw_init_stainfo(psta); - - _rtw_init_listhead(&(pstapriv->sta_hash[i])); - - rtw_list_insert_tail(&psta->list, get_list_head(&pstapriv->free_sta_queue)); - - psta++; - } - -#ifdef CONFIG_AP_MODE - - pstapriv->sta_dz_bitmap = 0; - pstapriv->tim_bitmap = 0; - - _rtw_init_listhead(&pstapriv->asoc_list); - _rtw_init_listhead(&pstapriv->auth_list); - pstapriv->auth_to = 3; // 3*2 = 6 sec - pstapriv->assoc_to = 3; - pstapriv->expire_to = 900;// 900*2 = 1800 sec = 30 min, expire after no any traffic. - - pstapriv->max_num_sta = NUM_STA; - -#endif - -_func_exit_; - - return _SUCCESS; - -} - -void _rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv) -{ -_func_enter_; - - _rtw_spinlock_free(&psta_xmitpriv->lock); - - _rtw_spinlock_free(&(psta_xmitpriv->be_q.sta_pending.lock)); - _rtw_spinlock_free(&(psta_xmitpriv->bk_q.sta_pending.lock)); - _rtw_spinlock_free(&(psta_xmitpriv->vi_q.sta_pending.lock)); - _rtw_spinlock_free(&(psta_xmitpriv->vo_q.sta_pending.lock)); -_func_exit_; -} - -static void _rtw_free_sta_recv_priv_lock(struct sta_recv_priv *psta_recvpriv) -{ -_func_enter_; - - _rtw_spinlock_free(&psta_recvpriv->lock); - - _rtw_spinlock_free(&(psta_recvpriv->defrag_q.lock)); - -_func_exit_; - -} - -void rtw_mfree_stainfo(struct sta_info *psta) -{ -_func_enter_; - - if(&psta->lock != NULL) - _rtw_spinlock_free(&psta->lock); - - _rtw_free_sta_xmit_priv_lock(&psta->sta_xmitpriv); - _rtw_free_sta_recv_priv_lock(&psta->sta_recvpriv); - -_func_exit_; -} - - -// this function is used to free the memory of lock || sema for all stainfos -void rtw_mfree_all_stainfo(struct sta_priv *pstapriv ) -{ - _irqL irqL; - _list *plist, *phead; - struct sta_info *psta = NULL; - -_func_enter_; - - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - phead = get_list_head(&pstapriv->free_sta_queue); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info ,list); - plist = get_next(plist); - - rtw_mfree_stainfo(psta); - } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - -_func_exit_; - -} - - -void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv) -{ - rtw_mfree_all_stainfo(pstapriv); //be done before free sta_hash_lock - - _rtw_spinlock_free(&pstapriv->free_sta_queue.lock); - - _rtw_spinlock_free(&pstapriv->sta_hash_lock); - _rtw_spinlock_free(&pstapriv->wakeup_q.lock); - _rtw_spinlock_free(&pstapriv->sleep_q.lock); - -} - -u32 _rtw_free_sta_priv(struct sta_priv *pstapriv) -{ -_func_enter_; - if(pstapriv){ - rtw_mfree_sta_priv_lock(pstapriv); - - if(pstapriv->pallocated_stainfo_buf) { - rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4); - } - } - -_func_exit_; - return _SUCCESS; -} - - -//struct sta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr) -struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) -{ - _irqL irqL, irqL2; - uint tmp_aid; - s32 index; - _list *phash_list; - struct sta_info *psta; - _queue *pfree_sta_queue; - struct recv_reorder_ctrl *preorder_ctrl; - int i = 0; - u16 wRxSeqInitialValue = 0xffff; - -_func_enter_; - - pfree_sta_queue = &pstapriv->free_sta_queue; - - _enter_critical_bh(&(pfree_sta_queue->lock), &irqL); - - if (_rtw_queue_empty(pfree_sta_queue) == _TRUE) - { - psta = NULL; - } - else - { - psta = LIST_CONTAINOR(get_next(&pfree_sta_queue->queue), struct sta_info, list); - - rtw_list_delete(&(psta->list)); - - tmp_aid = psta->aid; - - _rtw_init_stainfo(psta); - - _rtw_memcpy(psta->hwaddr, hwaddr, ETH_ALEN); - - index = wifi_mac_hash(hwaddr); - - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("rtw_alloc_stainfo: index = %x", index)); - - if(index >= NUM_STA){ - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("ERROR=> rtw_alloc_stainfo: index >= NUM_STA")); - psta= NULL; - goto exit; - } - phash_list = &(pstapriv->sta_hash[index]); - - _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); - - rtw_list_insert_tail(&psta->hash_list, phash_list); - - pstapriv->asoc_sta_count ++ ; - - _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); - -// Commented by Albert 2009/08/13 -// For the SMC router, the sequence number of first packet of WPS handshake will be 0. -// In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable. -// So, we initialize the tid_rxseq variable as the 0xffff. - - for( i = 0; i < 16; i++ ) - { - _rtw_memcpy( &psta->sta_recvpriv.rxcache.tid_rxseq[ i ], &wRxSeqInitialValue, 2 ); - } - - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("alloc number_%d stainfo with hwaddr = %x %x %x %x %x %x \n", - pstapriv->asoc_sta_count , hwaddr[0], hwaddr[1], hwaddr[2],hwaddr[3],hwaddr[4],hwaddr[5])); - - init_addba_retry_timer(pstapriv->padapter, psta); - -#ifdef CONFIG_TDLS - psta->padapter = pstapriv->padapter; - init_TPK_timer(pstapriv->padapter, psta); - _init_workitem(&psta->option_workitem, TDLS_option_workitem_callback, psta); - init_ch_switch_timer(pstapriv->padapter, psta); - init_base_ch_timer(pstapriv->padapter, psta); - _init_workitem(&psta->base_ch_workitem, base_channel_workitem_callback, psta); - init_off_ch_timer(pstapriv->padapter, psta); - _init_workitem(&psta->off_ch_workitem, off_channel_workitem_callback, psta); -#endif - - //for A-MPDU Rx reordering buffer control - for(i=0; i < 16 ; i++) - { - preorder_ctrl = &psta->recvreorder_ctrl[i]; - - preorder_ctrl->padapter = pstapriv->padapter; - - preorder_ctrl->enable = _FALSE; - - preorder_ctrl->indicate_seq = 0xffff; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq); - #endif - preorder_ctrl->wend_b= 0xffff; - //preorder_ctrl->wsize_b = (NR_RECVBUFF-2); - preorder_ctrl->wsize_b = 64;//64; - - _rtw_init_queue(&preorder_ctrl->pending_recvframe_queue); - - rtw_init_recv_timer(preorder_ctrl); - } - - } - -exit: - - _exit_critical_bh(&(pfree_sta_queue->lock), &irqL); - -_func_exit_; - - return psta; - - -} - - -// using pstapriv->sta_hash_lock to protect -u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta) -{ - int i; - _irqL irqL0; - _queue *pfree_sta_queue; - struct recv_reorder_ctrl *preorder_ctrl; - struct sta_xmit_priv *pstaxmitpriv; - struct xmit_priv *pxmitpriv= &padapter->xmitpriv; - struct sta_priv *pstapriv = &padapter->stapriv; - - -_func_enter_; - - if (psta == NULL) - goto exit; - - pfree_sta_queue = &pstapriv->free_sta_queue; - - - pstaxmitpriv = &psta->sta_xmitpriv; - - //rtw_list_delete(&psta->sleep_list); - - //rtw_list_delete(&psta->wakeup_list); - - rtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q); - psta->sleepq_len = 0; - - _enter_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); - - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vo_q.sta_pending); - - rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending)); - - _exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); - - - _enter_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); - - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vi_q.sta_pending); - - rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending)); - - _exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); - - - _enter_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); - - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->bk_q.sta_pending); - - rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending)); - - _exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); - - _enter_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); - - rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->be_q.sta_pending); - - rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending)); - - _exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); - - - rtw_list_delete(&psta->hash_list); - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5])); - pstapriv->asoc_sta_count --; - - - // re-init sta_info; 20061114 - _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); - _rtw_init_sta_recv_priv(&psta->sta_recvpriv); - - _cancel_timer_ex(&psta->addba_retry_timer); - -#ifdef CONFIG_TDLS - _cancel_timer_ex(&psta->TPK_timer); - _cancel_timer_ex(&psta->option_timer); - _cancel_timer_ex(&psta->base_ch_timer); - _cancel_timer_ex(&psta->off_ch_timer); -#endif - - //for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer - for(i=0; i < 16 ; i++) - { - preorder_ctrl = &psta->recvreorder_ctrl[i]; - - _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); - } - - -#ifdef CONFIG_AP_MODE - - rtw_list_delete(&psta->asoc_list); - rtw_list_delete(&psta->auth_list); - psta->expire_to = 0; - - psta->sleepq_ac_len = 0; - psta->qos_info = 0; - - psta->max_sp_len = 0; - psta->uapsd_bk = 0; - psta->uapsd_be = 0; - psta->uapsd_vi = 0; - psta->uapsd_vo = 0; - - psta->has_legacy_ac = 0; - -#ifdef CONFIG_NATIVEAP_MLME - - pstapriv->sta_dz_bitmap &=~BIT(psta->aid); - pstapriv->tim_bitmap &=~BIT(psta->aid); - - rtw_indicate_sta_disassoc_event(padapter, psta); - - if (pstapriv->sta_aid[psta->aid - 1] == psta) - { - pstapriv->sta_aid[psta->aid - 1] = NULL; - psta->aid = 0; - } - -#endif - -#endif - - _enter_critical_bh(&(pfree_sta_queue->lock), &irqL0); - rtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue)); - _exit_critical_bh(&(pfree_sta_queue->lock), &irqL0); - -exit: - -_func_exit_; - - return _SUCCESS; - -} - -// free all stainfo which in sta_hash[all] -void rtw_free_all_stainfo(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - s32 index; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter); - -_func_enter_; - - if(pstapriv->asoc_sta_count==1) - goto exit; - - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - for(index=0; index< NUM_STA; index++) - { - phead = &(pstapriv->sta_hash[index]); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list); - - plist = get_next(plist); - - if(pbcmc_stainfo!=psta) - rtw_free_stainfo(padapter , psta); - - } - } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - -exit: - -_func_exit_; - -} - -/* any station allocated can be searched by hash list */ -struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) -{ - - _irqL irqL; - - _list *plist, *phead; - - struct sta_info *psta = NULL; - - u32 index; - - u8 *addr; - - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; - -_func_enter_; - - if(hwaddr==NULL) - return NULL; - - if(IS_MCAST(hwaddr)) - { - addr = bc_addr; - } - else - { - addr = hwaddr; - } - - index = wifi_mac_hash(addr); - - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - phead = &(pstapriv->sta_hash[index]); - plist = get_next(phead); - - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - - psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - - if ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN))== _TRUE) - { // if found the matched address - break; - } - psta=NULL; - plist = get_next(plist); - } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); -_func_exit_; - return psta; - -} - -u32 rtw_init_bcmc_stainfo(_adapter* padapter) -{ - - struct sta_info *psta; - struct tx_servq *ptxservq; - u32 res=_SUCCESS; - NDIS_802_11_MAC_ADDRESS bcast_addr= {0xff,0xff,0xff,0xff,0xff,0xff}; - - struct sta_priv *pstapriv = &padapter->stapriv; - _queue *pstapending = &padapter->xmitpriv.bm_pending; - -_func_enter_; - - psta = rtw_alloc_stainfo(pstapriv, bcast_addr); - - if(psta==NULL){ - res=_FAIL; - RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("rtw_alloc_stainfo fail")); - goto exit; - } - - // default broadcast & multicast use macid 1 - psta->mac_id = 1; - - ptxservq= &(psta->sta_xmitpriv.be_q); - -/* - _enter_critical(&pstapending->lock, &irqL0); - - if (rtw_is_list_empty(&ptxservq->tx_pending)) - rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(pstapending)); - - _exit_critical(&pstapending->lock, &irqL0); -*/ - -exit: -_func_exit_; - return _SUCCESS; - -} - - -struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter) -{ - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; -_func_enter_; - psta = rtw_get_stainfo(pstapriv, bc_addr); -_func_exit_; - return psta; - -} - -u8 rtw_access_ctrl(struct wlan_acl_pool* pacl_list, u8 * mac_addr) -{ - return _TRUE; -} - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c b/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c deleted file mode 100755 index 9043a8a4a595..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c +++ /dev/null @@ -1,1747 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_WLAN_UTIL_C_ - -#include -#include -#include -#include - - -unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f}; -unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74}; - -unsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18}; -unsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7}; -unsigned char BROADCOM_OUI3[] = {0x00, 0x05, 0xb5}; - -unsigned char CISCO_OUI[] = {0x00, 0x40, 0x96}; -unsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43}; -unsigned char RALINK_OUI[] = {0x00, 0x0c, 0x43}; -unsigned char REALTEK_OUI[] = {0x00, 0xe0, 0x4c}; -unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5}; - -unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20}; - -extern unsigned char MCS_rate_2R[16]; -extern unsigned char MCS_rate_1R[16]; -extern unsigned char WPA_OUI[]; -extern unsigned char WPA_TKIP_CIPHER[4]; -extern unsigned char RSN_TKIP_CIPHER[4]; - -#define R2T_PHY_DELAY (0) - -//#define WAIT_FOR_BCN_TO_MIN (3000) -#define WAIT_FOR_BCN_TO_MIN (6000) -#define WAIT_FOR_BCN_TO_MAX (20000) - - -int cckrates_included(unsigned char *rate, int ratelen) -{ - int i; - - for(i = 0; i < ratelen; i++) - { - if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || - (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) - return _TRUE; - } - - return _FALSE; - -} - -int cckratesonly_included(unsigned char *rate, int ratelen) -{ - int i; - - for(i = 0; i < ratelen; i++) - { - if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && - (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) - return _FALSE; - } - - return _TRUE; -} - -unsigned char networktype_to_raid(unsigned char network_type) -{ - unsigned char raid; - - switch(network_type) - { - case WIRELESS_11B: - raid = 6; - break; - case WIRELESS_11A: - case WIRELESS_11G: - raid = 5; - break; - case WIRELESS_11BG: - raid = 4; - break; - case WIRELESS_11_24N: - case WIRELESS_11_5N: - raid = 3; - break; - case WIRELESS_11A_5N: - case WIRELESS_11G_24N: - raid = 1; - break; - case WIRELESS_11BG_24N: - raid = 0; - break; - default: - raid = 4; - break; - - } - - return raid; - -} - -int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen) -{ - int network_type = 0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - if(pmlmeext->cur_channel > 14) - { - if (pmlmeinfo->HT_enable) - { - network_type = WIRELESS_11_5N; - } - - network_type |= WIRELESS_11A; - } - else - { - if (pmlmeinfo->HT_enable) - { - network_type = WIRELESS_11_24N; - } - - if ((cckratesonly_included(rate, ratelen)) == _TRUE) - { - network_type |= WIRELESS_11B; - } - else if((cckrates_included(rate, ratelen)) == _TRUE) - { - network_type |= WIRELESS_11BG; - } - else - { - network_type |= WIRELESS_11G; - } - } - - return network_type; -} - -unsigned char ratetbl_val_2wifirate(unsigned char rate) -{ - unsigned char val = 0; - - switch (rate & 0x7f) - { - case 0: - val = IEEE80211_CCK_RATE_1MB; - break; - - case 1: - val = IEEE80211_CCK_RATE_2MB; - break; - - case 2: - val = IEEE80211_CCK_RATE_5MB; - break; - - case 3: - val = IEEE80211_CCK_RATE_11MB; - break; - - case 4: - val = IEEE80211_OFDM_RATE_6MB; - break; - - case 5: - val = IEEE80211_OFDM_RATE_9MB; - break; - - case 6: - val = IEEE80211_OFDM_RATE_12MB; - break; - - case 7: - val = IEEE80211_OFDM_RATE_18MB; - break; - - case 8: - val = IEEE80211_OFDM_RATE_24MB; - break; - - case 9: - val = IEEE80211_OFDM_RATE_36MB; - break; - - case 10: - val = IEEE80211_OFDM_RATE_48MB; - break; - - case 11: - val = IEEE80211_OFDM_RATE_54MB; - break; - - } - - return val; - -} - -int is_basicrate(_adapter *padapter, unsigned char rate) -{ - int i; - unsigned char val; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - for(i = 0; i < NumRates; i++) - { - val = pmlmeext->basicrate[i]; - - if ((val != 0xff) && (val != 0xfe)) - { - if (rate == ratetbl_val_2wifirate(val)) - { - return _TRUE; - } - } - } - - return _FALSE; -} - - -unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset) -{ - int i; - unsigned char rate; - unsigned int len = 0; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - for (i = 0; i < NumRates; i++) - { - rate = pmlmeext->datarate[i]; - - switch (rate) - { - case 0xff: - return len; - - case 0xfe: - continue; - - default: - rate = ratetbl_val_2wifirate(rate); - - if (is_basicrate(padapter, rate) == _TRUE) - { - rate |= IEEE80211_BASIC_RATE_MASK; - } - - rateset[len] = rate; - len++; - break; - } - } - return len; -} - - -void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len) -{ - unsigned char supportedrates[NumRates]; - - _rtw_memset(supportedrates, 0, NumRates); - *bssrate_len = ratetbl2rateset(padapter, supportedrates); - _rtw_memcpy(pbssrate, supportedrates, *bssrate_len); -} - -void Save_DM_Func_Flag(_adapter *padapter) -{ - u8 bSaveFlag = _TRUE; - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); -} - -void Restore_DM_Func_Flag(_adapter *padapter) -{ - u8 bSaveFlag = _FALSE; - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); -} - -void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable) -{ - if(enable == _TRUE) - { - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode)); - } - else - { - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode)); - } - -#if 0 - u8 val8; - - val8 = rtw_read8(padapter, FW_DYNAMIC_FUN_SWITCH); - - if(enable == _TRUE) - { - rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 | mode)); - } - else - { - rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 & mode)); - } -#endif - -} - -void Set_NETYPE1_MSR(_adapter *padapter, u8 type) -{ - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MEDIA_STATUS1, (u8 *)(&type)); -} - -void Set_NETYPE0_MSR(_adapter *padapter, u8 type) -{ - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type)); -} - -void SelectChannel(_adapter *padapter, unsigned char channel) -{ - unsigned int scanMode; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - scanMode = (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE)? 1: 0;//todo: - - if(padapter->HalFunc.set_channel_handler) - padapter->HalFunc.set_channel_handler(padapter, channel); - -} - -void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset) -{ - if(padapter->HalFunc.set_bwmode_handler) - padapter->HalFunc.set_bwmode_handler(padapter, (HT_CHANNEL_WIDTH)bwmode, channel_offset); -} - -void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode) -{ - if((bwmode == HT_CHANNEL_WIDTH_20)||(channel_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)) - { - SelectChannel(padapter, channel); - } - else - { - //switch to the proper channel - if (channel_offset == HAL_PRIME_CHNL_OFFSET_LOWER) - { - SelectChannel(padapter, channel + 2); - } - else - { - SelectChannel(padapter, channel - 2); - } - } - - - SetBWMode(padapter, bwmode, channel_offset); - -} - -int get_bsstype(unsigned short capability) -{ - if (capability & BIT(0)) - { - return WIFI_FW_AP_STATE; - } - else if (capability & BIT(1)) - { - return WIFI_FW_ADHOC_STATE; - } - else - { - return 0; - } -} - -__inline u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork) -{ - return (pnetwork->MacAddress); -} - -u16 get_beacon_interval(WLAN_BSSID_EX *bss) -{ - unsigned short val; - _rtw_memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2); - - return le16_to_cpu(val); - -} - -int is_client_associated_to_ap(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)) - { - return _TRUE; - } - else - { - return _FAIL; - } -} - -int is_client_associated_to_ibss(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)) - { - return _TRUE; - } - else - { - return _FAIL; - } -} - -int is_IBSS_empty(_adapter *padapter) -{ - unsigned int i; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { - return _FAIL; - } - } - - return _TRUE; - -} - -unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval) -{ - if ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN) - { - return WAIT_FOR_BCN_TO_MIN; - } - else if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX) - { - return WAIT_FOR_BCN_TO_MAX; - } - else - { - return ((bcn_interval << 2)); - } -} - -void CAM_empty_entry( - PADAPTER Adapter, - u8 ucIndex -) -{ - Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex)); -} - -void invalidate_cam_all(_adapter *padapter) -{ - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_INVALID_ALL, 0); -} - -void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key) -{ - unsigned int i, val, addr, cmd; - int j; - u32 cam_val[2]; - - addr = entry << 3; - - for (j = 5; j >= 0; j--) - { - switch (j) - { - case 0: - val = (ctrl | (mac[0] << 16) | (mac[1] << 24) ); - break; - - case 1: - val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24)); - break; - - default: - i = (j - 2) << 2; - val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24)); - break; - - } - - cam_val[0] = val; - cam_val[1] = addr + (unsigned int)j; - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); - - //rtw_write32(padapter, WCAMI, val); - - //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j); - //rtw_write32(padapter, RWCAM, cmd); - - //DBG_8192C("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val); - - } - -} - -void clear_cam_entry(_adapter *padapter, u8 entry) -{ -#if 0 - u32 addr, val=0; - u32 cam_val[2]; - - addr = entry << 3; - - - cam_val[0] = val; - cam_val[1] = addr + (unsigned int)0; - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); - - - - cam_val[0] = val; - cam_val[1] = addr + (unsigned int)1; - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); -#else - - unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00}; - - write_cam(padapter, entry, 0, null_sta, null_key); - -#endif -} - -int allocate_fw_sta_entry(_adapter *padapter) -{ - unsigned int mac_id; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++) - { - if (pmlmeinfo->FW_sta_info[mac_id].status == 0) - { - pmlmeinfo->FW_sta_info[mac_id].status = 1; - pmlmeinfo->FW_sta_info[mac_id].retry = 0; - break; - } - } - - return mac_id; -} - -void flush_all_cam_entry(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -#if 0 - unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00}; - - for (i = 0; i < NUM_STA; i++) - { - write_cam(padapter, i, 0, null_sta, null_key); - } -#else - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_INVALID_ALL, 0); -#endif - _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info)); -} - -int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(pmlmepriv->qospriv.qos_option==0) - { - pmlmeinfo->WMM_enable = 0; - return _FAIL; - } - - pmlmeinfo->WMM_enable = 1; - _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); - return _TRUE; - - /*if (pregpriv->wifi_spec == 1) - { - if (pmlmeinfo->WMM_enable == 1) - { - //todo: compare the parameter set count & decide wheher to update or not - return _FAIL; - } - else - { - pmlmeinfo->WMM_enable = 1; - _rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); - return _TRUE; - } - } - else - { - pmlmeinfo->WMM_enable = 0; - return _FAIL; - }*/ - -} - -void WMMOnAssocRsp(_adapter *padapter) -{ - unsigned char ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime; - unsigned short TXOP; - unsigned int acParm, i; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (pmlmeinfo->WMM_enable == 0) - return; - - if( pmlmeext->cur_wireless_mode == WIRELESS_11B) - aSifsTime = 10; - else - aSifsTime = 16; - - for (i = 0; i < 4; i++) - { - ACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03; - ACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01; - - //AIFS = AIFSN * slot time + SIFS - r2t phy delay - AIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime; - - ECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f); - ECWMax = (pmlmeinfo->WMM_param.ac_param[i].CW & 0xf0) >> 4; - TXOP = le16_to_cpu(pmlmeinfo->WMM_param.ac_param[i].TXOP_limit); - - acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); - - switch (ACI) - { - case 0x0: - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); - break; - - case 0x1: - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); - break; - - case 0x2: - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); - break; - - case 0x3: - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); - break; - } - - //DBG_871X("WMM(%x): %x, %x\n", ACI, ACM, acParm); - } - - return; -} - -static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - unsigned char new_bwmode; - unsigned char new_ch_offset; - struct HT_info_element *pHT_info; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - if(!pIE) - return; - - pHT_info = (struct HT_info_element *)pIE->data; - - if(pHT_info->infos[0] & BIT(2)) - { - new_bwmode = HT_CHANNEL_WIDTH_40; - switch (pHT_info->infos[0] & 0x3) - { - case 1: - new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case 3: - new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; - } - } - else - { - new_bwmode = HT_CHANNEL_WIDTH_20; - new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - } - - - if((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset)) - { - pmlmeinfo->bwmode_updated = _TRUE; - - pmlmeext->cur_bwmode = new_bwmode; - pmlmeext->cur_ch_offset = new_ch_offset; - } - else - { - pmlmeinfo->bwmode_updated = _FALSE; - } - - - if(_TRUE == pmlmeinfo->bwmode_updated) - { - struct sta_info *psta; - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - struct sta_priv *pstapriv = &padapter->stapriv; - - //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - - //update ap's stainfo - psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); - if(psta) - { - struct ht_priv *phtpriv_sta = &psta->htpriv; - - if(phtpriv_sta->ht_option) - { - // bwmode - phtpriv_sta->bwmode = pmlmeext->cur_bwmode; - phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; - } - else - { - phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; - phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - } - - } - - //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it! - - } - -} - -void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - unsigned int i; - u8 rf_type; - u8 max_AMPDU_len, min_MPDU_spacing; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - - if(phtpriv->ht_option == _FALSE) return; - - pmlmeinfo->HT_caps_enable = 1; - - for (i = 0; i < (pIE->Length); i++) - { - if (i != 2) - { - // Commented by Albert 2010/07/12 - // Got the endian issue here. - pmlmeinfo->HT_caps.HT_cap[i] &= (pIE->data[i]); - } - else - { - //modify from fw by Thomas 2010/11/17 - if ((pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3)) - { - max_AMPDU_len = (pIE->data[i] & 0x3); - } - else - { - max_AMPDU_len = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x3); - } - - if ((pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c)) - { - min_MPDU_spacing = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c); - } - else - { - min_MPDU_spacing = (pIE->data[i] & 0x1c); - } - - pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing; - } - } - - // Commented by Albert 2010/07/12 - // Have to handle the endian issue after copying. - // HT_ext_caps didn't be used yet. - pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info = le16_to_cpu( pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info ); - pmlmeinfo->HT_caps.HT_cap_element.HT_ext_caps = le16_to_cpu( pmlmeinfo->HT_caps.HT_cap_element.HT_ext_caps ); - - padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); - - //update the MCS rates - for (i = 0; i < 16; i++) - { - if((rf_type == RF_1T1R) || (rf_type == RF_1T2R)) - { - pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - } - else - { - pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i]; - } - #ifdef RTL8192C_RECONFIG_TO_1T1R - { - pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - } - #endif - } - - return; -} - -void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - - if(phtpriv->ht_option == _FALSE) return; - - - if(pIE->Length > sizeof(struct HT_info_element)) - return; - - pmlmeinfo->HT_info_enable = 1; - _rtw_memcpy(&(pmlmeinfo->HT_info), pIE->data, pIE->Length); - - return; -} - -void HTOnAssocRsp(_adapter *padapter) -{ - unsigned char max_AMPDU_len; - unsigned char min_MPDU_spacing; - unsigned char FactorLevel[18] = {2, 4, 4, 7, 7, 13, 13, 13, 2, 7, 7, 13, 13, 15, 15, 15, 15, 0}; - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - - //DBG_871X("%s\n", __FUNCTION__); - - if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) - { - pmlmeinfo->HT_enable = 1; - } - else - { - pmlmeinfo->HT_enable = 0; - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - return; - } - - //handle A-MPDU parameter field - /* - AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k - AMPDU_para [4:2]:Min MPDU Start Spacing - */ - max_AMPDU_len = pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x03; - - min_MPDU_spacing = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c) >> 2; - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); - - if ((pregpriv->cbw40_enable) && - (pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info & BIT(1)) && - (pmlmeinfo->HT_info.infos[0] & BIT(2))) - { - //switch to the 40M Hz mode accoring to the AP - pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; - switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) - { - case HT_EXTCHNL_OFFSET_UPPER: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; - break; - - case HT_EXTCHNL_OFFSET_LOWER: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; - break; - - default: - pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - break; - } - - //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); - } - - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - - // - // Config SM Power Save setting - // - pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info & 0x0C) >> 2; - if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) - { - /*u8 i; - //update the MCS rates - for (i = 0; i < 16; i++) - { - pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; - }*/ - DBG_8192C("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); - } - - // - // Config current HT Protection mode. - // - pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; - -} - -void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(pIE->Length>1) - return; - - pmlmeinfo->ERP_enable = 1; - _rtw_memcpy(&(pmlmeinfo->ERP_IE), pIE->data, pIE->Length); -} - -void VCS_update(_adapter *padapter, struct sta_info *psta) -{ - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - switch (pregpriv->vrtl_carrier_sense)/* 0:off 1:on 2:auto */ - { - case 0: //off - psta->rtsen = 0; - psta->cts2self = 0; - break; - - case 1: //on - if (pregpriv->vcs_type == 1) /* 1:RTS/CTS 2:CTS to self */ - { - psta->rtsen = 1; - psta->cts2self = 0; - } - else - { - psta->rtsen = 0; - psta->cts2self = 1; - } - break; - - case 2: //auto - default: - if ((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1))) - { - if (pregpriv->vcs_type == 1) - { - psta->rtsen = 1; - psta->cts2self = 0; - } - else - { - psta->rtsen = 0; - psta->cts2self = 1; - } - } - else - { - psta->rtsen = 0; - psta->cts2self = 0; - } - break; - } -} - -void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta) -{ - unsigned int i; - unsigned int len; - PNDIS_802_11_VARIABLE_IEs pIE; - - len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN); - - for (i = 0; i < len;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i); - - switch (pIE->ElementID) - { -#if 0 - case _VENDOR_SPECIFIC_IE_: - //todo: to update WMM paramter set while receiving beacon - if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM - { - (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0; - } - break; -#endif - - case _HT_EXTRA_INFO_IE_: //HT info - //HT_info_handler(padapter, pIE); - bwmode_update_check(padapter, pIE); - break; - - case _ERPINFO_IE_: - ERP_IE_handler(padapter, pIE); - VCS_update(padapter, psta); - break; - - default: - break; - } - - i += (pIE->Length + 2); - } -} - -unsigned int is_ap_in_tkip(_adapter *padapter) -{ - u32 i; - PNDIS_802_11_VARIABLE_IEs pIE; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - - if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) - { - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if ((_rtw_memcmp(pIE->data, WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4))) - { - return _TRUE; - } - break; - - case _RSN_IE_2_: - if (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4)) - { - return _TRUE; - } - - default: - break; - } - - i += (pIE->Length + 2); - } - - return _FALSE; - } - else - { - return _FALSE; - } - -} - -int wifirate2_ratetbl_inx(unsigned char rate) -{ - int inx = 0; - rate = rate & 0x7f; - - switch (rate) - { - case 54*2: - inx = 11; - break; - - case 48*2: - inx = 10; - break; - - case 36*2: - inx = 9; - break; - - case 24*2: - inx = 8; - break; - - case 18*2: - inx = 7; - break; - - case 12*2: - inx = 6; - break; - - case 9*2: - inx = 5; - break; - - case 6*2: - inx = 4; - break; - - case 11*2: - inx = 3; - break; - case 11: - inx = 2; - break; - - case 2*2: - inx = 1; - break; - - case 1*2: - inx = 0; - break; - - } - return inx; -} - -unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz) -{ - unsigned int i, num_of_rate; - unsigned int mask = 0; - - num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; - - for (i = 0; i < num_of_rate; i++) - { - if ((*(ptn + i)) & 0x80) - { - mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); - } - } - return mask; -} - -unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz) -{ - unsigned int i, num_of_rate; - unsigned int mask = 0; - - num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; - - for (i = 0; i < num_of_rate; i++) - { - mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); - } - - return mask; -} - -unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps) -{ - unsigned int mask = 0; - - mask = ((pHT_caps->HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->HT_cap_element.MCS_rate[1] << 20)); - - return mask; -} - -int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps) -{ - unsigned char bit_offset; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if (!(pmlmeinfo->HT_enable)) - return _FAIL; - - if ((pmlmeinfo->assoc_AP_vendor == ralinkAP)) - return _FAIL; - - bit_offset = (pmlmeext->cur_bwmode & HT_CHANNEL_WIDTH_40)? 6: 5; - - if (pHT_caps->HT_cap_element.HT_caps_info & (0x1 << bit_offset)) - { - return _SUCCESS; - } - else - { - return _FAIL; - } -} - -unsigned char get_highest_rate_idx(u32 mask) -{ - int i; - unsigned char rate_idx=0; - - for(i=27; i>=0; i--) - { - if(mask & BIT(i)) - { - rate_idx = i; - break; - } - } - - return rate_idx; -} - -unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps) -{ - int i, mcs_rate; - - mcs_rate = (pHT_caps->HT_cap_element.MCS_rate[0] | (pHT_caps->HT_cap_element.MCS_rate[1] << 8)); - - for (i = 15; i >= 0; i--) - { - if (mcs_rate & (0x1 << i)) - { - break; - } - } - - return i; -} - -void Update_RA_Entry(_adapter *padapter, u32 mac_id) -{ - padapter->HalFunc.UpdateRAMaskHandler(padapter, mac_id); -} - -void enable_rate_adaptive(_adapter *padapter, u32 mac_id) -{ - Update_RA_Entry(padapter, mac_id); -} - -void set_sta_rate(_adapter *padapter, struct sta_info *psta) -{ - //rate adaptive - enable_rate_adaptive(padapter, psta->mac_id); -} - -unsigned char check_assoc_AP(u8 *pframe, uint len) -{ - unsigned int i; - PNDIS_802_11_VARIABLE_IEs pIE; - - for (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;) - { - pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); - - switch (pIE->ElementID) - { - case _VENDOR_SPECIFIC_IE_: - if ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3))) - { - //DBG_871X("link to Artheros AP\n"); - return atherosAP; - } - else if ((_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3)) - || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3)) - || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3))) - { - //DBG_871X("link to Broadcom AP\n"); - return broadcomAP; - } - else if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3)) - { - //DBG_871X("link to Marvell AP\n"); - return marvellAP; - } - else if (_rtw_memcmp(pIE->data, RALINK_OUI, 3)) - { - //DBG_871X("link to Ralink AP\n"); - return ralinkAP; - } - else if (_rtw_memcmp(pIE->data, CISCO_OUI, 3)) - { - //DBG_871X("link to Cisco AP\n"); - return ciscoAP; - } - else if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3)) - { - //DBG_871X("link to Realtek 96B\n"); - return realtekAP; - } - else if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI,3)) - { - //DBG_871X("link to Airgo Cap\n"); - return airgocapAP; - } - else - { - break; - } - - default: - break; - } - - i += (pIE->Length + 2); - } - - DBG_871X("link to new AP\n"); - return unknownAP; -} - -void update_IOT_info(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - switch (pmlmeinfo->assoc_AP_vendor) - { - case marvellAP: - pmlmeinfo->turboMode_cts2self = 1; - pmlmeinfo->turboMode_rtsen = 0; - break; - - case ralinkAP: - pmlmeinfo->turboMode_cts2self = 0; - pmlmeinfo->turboMode_rtsen = 1; - //disable high power - Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE); - break; - case realtekAP: - //rtw_write16(padapter, 0x4cc, 0xffff); - //rtw_write16(padapter, 0x546, 0x01c0); - //disable high power - Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE); - break; - default: - pmlmeinfo->turboMode_cts2self = 0; - pmlmeinfo->turboMode_rtsen = 1; - break; - } - -} - -void update_capinfo(PADAPTER Adapter, u16 updateCap) -{ - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - BOOLEAN ShortPreamble; - - // Check preamble mode, 2005.01.06, by rcnjko. - // Mark to update preamble value forever, 2008.03.18 by lanhsin - //if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO ) - { - - if(updateCap & cShortPreamble) - { // Short Preamble - if(pmlmeinfo->preamble_mode != PREAMBLE_SHORT) // PREAMBLE_LONG or PREAMBLE_AUTO - { - ShortPreamble = _TRUE; - pmlmeinfo->preamble_mode = PREAMBLE_SHORT; - Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); - } - } - else - { // Long Preamble - if(pmlmeinfo->preamble_mode != PREAMBLE_LONG) // PREAMBLE_SHORT or PREAMBLE_AUTO - { - ShortPreamble = _FALSE; - pmlmeinfo->preamble_mode = PREAMBLE_LONG; - Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); - } - } - } - - if ( updateCap & cIBSS ) { - //Filen: See 802.11-2007 p.91 - pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; - } - else - { - //Filen: See 802.11-2007 p.90 - if( pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11_24N)) - { - if( (updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */) - { // Short Slot Time - if(pmlmeinfo->slotTime != SHORT_SLOT_TIME) - { - pmlmeinfo->slotTime = SHORT_SLOT_TIME; - } - } - else - { // Long Slot Time - if(pmlmeinfo->slotTime != NON_SHORT_SLOT_TIME) - { - pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; - } - } - } - else if( pmlmeext->cur_wireless_mode & (WIRELESS_11A | WIRELESS_11_5N)) - { - pmlmeinfo->slotTime = SHORT_SLOT_TIME; - } - else - { - //B Mode - pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; - } - } - - Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime ); - -} - -void update_wireless_mode(_adapter *padapter) -{ - int ratelen, network_type = 0; - u16 SIFS_Timer; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - unsigned char *rate = cur_network->SupportedRates; - - ratelen = rtw_get_rateset_len(cur_network->SupportedRates); - - if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) - { - pmlmeinfo->HT_enable = 1; - } - - if(pmlmeext->cur_channel > 14) - { - if (pmlmeinfo->HT_enable) - { - network_type = WIRELESS_11_5N; - } - - network_type |= WIRELESS_11A; - } - else - { - if (pmlmeinfo->HT_enable) - { - network_type = WIRELESS_11_24N; - } - - if ((cckratesonly_included(rate, ratelen)) == _TRUE) - { - network_type |= WIRELESS_11B; - } - else if((cckrates_included(rate, ratelen)) == _TRUE) - { - network_type |= WIRELESS_11BG; - } - else - { - network_type |= WIRELESS_11G; - } - } - - pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode; - if((pmlmeext->cur_wireless_mode==WIRELESS_11G) || - (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G) - SIFS_Timer = 0x0a0a; - else - SIFS_Timer = 0x0e0e;//pHalData->SifsTime; - padapter->HalFunc.SetHwRegHandler( padapter, HW_VAR_SIFS, (u8 *)&SIFS_Timer); - -} - - -void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value) -{ -#if 0 - struct cmd_obj *ph2c; - struct reg_rw_parm *pwriteMacPara; - struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); - - if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } - - if ((pwriteMacPara = (struct reg_rw_parm*)rtw_malloc(sizeof(struct reg_rw_parm))) == NULL) - { - rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); - return; - } - - pwriteMacPara->rw = 1; - pwriteMacPara->addr = addr; - pwriteMacPara->value = value; - - init_h2fwcmd_w_parm_no_rsp(ph2c, pwriteMacPara, GEN_CMD_CODE(_Write_MACREG)); - rtw_enqueue_cmd(pcmdpriv, ph2c); -#endif -} - -u8 bmc_support_rate_ofdm[4] = - {IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK, - IEEE80211_OFDM_RATE_18MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK}; -u8 bmc_support_rate_cck[4] = - {IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK, - IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK}; - -void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id) -{ - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if(pmlmeext->cur_wireless_mode & WIRELESS_11B) - { - // Only B, B/G, and B/G/N AP could use CCK rate - _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), bmc_support_rate_cck, 4); - } - else - { - _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), bmc_support_rate_ofdm, 4); - } -} - -int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx) -{ - unsigned int ie_len; - PNDIS_802_11_VARIABLE_IEs pIE; - int supportRateNum = 0; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len); - if (pIE == NULL) - { - return _FAIL; - } - - _rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len); - supportRateNum = ie_len; - - pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len); - if (pIE) - { - _rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); - } - - return _SUCCESS; - -} - -void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) -{ - struct sta_info *psta; - u16 tid, start_seq, param; - struct recv_reorder_ctrl *preorder_ctrl; - struct sta_priv *pstapriv = &padapter->stapriv; - struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - psta = rtw_get_stainfo(pstapriv, addr); - - if(psta) - { - start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4; - - param = le16_to_cpu(preq->BA_para_set); - tid = (param>>2)&0x0f; - - preorder_ctrl = &psta->recvreorder_ctrl[tid]; - - #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ - preorder_ctrl->indicate_seq = start_seq; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __FUNCTION__, __LINE__, - preorder_ctrl->indicate_seq, start_seq); - #endif - #endif - - preorder_ctrl->enable =(pmlmeinfo->bAcceptAddbaReq == _TRUE)? _TRUE :_FALSE; - } - -} - -void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) -{ - u8* pIE; - u32 *pbuf; - - pIE = pframe + sizeof(struct ieee80211_hdr_3addr); - pbuf = (u32*)pIE; - - pmlmeext->TSFValue = le32_to_cpu(*(pbuf+1)); - - pmlmeext->TSFValue = pmlmeext->TSFValue << 32; - - pmlmeext->TSFValue |= le32_to_cpu(*pbuf); -} - -void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext) -{ - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CORRECT_TSF, 0); -} - -void beacon_timing_control(_adapter *padapter) -{ - padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter); -} - -#if 0 -unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame) -{ - unsigned short ATIMWindow; - unsigned char *pframe; - struct tx_desc *ptxdesc; - struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - unsigned int rate_len, len = 0; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - _rtw_memset(beacon_frame, 0, 256); - - pframe = beacon_frame + TXDESC_SIZE; - - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); - - SetFrameSubType(pframe, WIFI_BEACON); - - pframe += sizeof(struct ieee80211_hdr_3addr); - len = sizeof(struct ieee80211_hdr_3addr); - - //timestamp will be inserted by hardware - pframe += 8; - len += 8; - - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); - - pframe += 2; - len += 2; - - // capability info: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); - - pframe += 2; - len += 2; - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &len); - - // supported rates... - rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &len); - - // DS parameter set - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &len); - - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; - ATIMWindow = 0; - pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &len); - - //todo: ERP IE - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len); - } - - if ((len + TXDESC_SIZE) > 256) - { - //DBG_8192C("marc: beacon frame too large\n"); - return 0; - } - - //fill the tx descriptor - ptxdesc = (struct tx_desc *)beacon_frame; - - //offset 0 - ptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff); - ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); //default = 32 bytes for TX Desc - - //offset 4 - ptxdesc->txdw1 |= cpu_to_le32((0x10 << QSEL_SHT) & 0x00001f00); - - //offset 8 - ptxdesc->txdw2 |= cpu_to_le32(BMC); - ptxdesc->txdw2 |= cpu_to_le32(BK); - - //offset 16 - ptxdesc->txdw4 = 0x80000000; - - //offset 20 - ptxdesc->txdw5 = 0x00000000; //1M - - return (len + TXDESC_SIZE); -} -#endif - diff --git a/drivers/net/wireless/rtl8192c/core/rtw_xmit.c b/drivers/net/wireless/rtl8192c/core/rtw_xmit.c deleted file mode 100755 index 259d54da3fcb..000000000000 --- a/drivers/net/wireless/rtl8192c/core/rtw_xmit.c +++ /dev/null @@ -1,3779 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTW_XMIT_C_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_TDLS -#include -#endif - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) -#error "Shall be Linux or Windows, but not both!\n" -#endif - -#ifdef PLATFORM_WINDOWS -#include -#endif - -#ifdef CONFIG_USB_HCI -#include -#endif - - -static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; -static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; - -#ifdef CONFIG_TDLS -extern unsigned char MCS_rate_2R[16]; -extern unsigned char MCS_rate_1R[16]; -#endif - -static void _init_txservq(struct tx_servq *ptxservq) -{ -_func_enter_; - _rtw_init_listhead(&ptxservq->tx_pending); - _rtw_init_queue(&ptxservq->sta_pending); - ptxservq->qcnt = 0; -_func_exit_; -} - - -void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv) -{ - -_func_enter_; - - _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv)); - - _rtw_spinlock_init(&psta_xmitpriv->lock); - - //for(i = 0 ; i < MAX_NUMBLKS; i++) - // _init_txservq(&(psta_xmitpriv->blk_q[i])); - - _init_txservq(&psta_xmitpriv->be_q); - _init_txservq(&psta_xmitpriv->bk_q); - _init_txservq(&psta_xmitpriv->vi_q); - _init_txservq(&psta_xmitpriv->vo_q); - _rtw_init_listhead(&psta_xmitpriv->legacy_dz); - _rtw_init_listhead(&psta_xmitpriv->apsd); - -_func_exit_; - -} - -s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter) -{ - int i; - struct xmit_buf *pxmitbuf; - struct xmit_frame *pxframe; - sint res=_SUCCESS; - -_func_enter_; - - _rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv)); - - _rtw_spinlock_init(&pxmitpriv->lock); - _rtw_init_sema(&pxmitpriv->xmit_sema, 0); - _rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0); - - ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 1); - - /* - Please insert all the queue initializaiton using _rtw_init_queue below - */ - - pxmitpriv->adapter = padapter; - - //for(i = 0 ; i < MAX_NUMBLKS; i++) - // _rtw_init_queue(&pxmitpriv->blk_strms[i]); - - _rtw_init_queue(&pxmitpriv->be_pending); - _rtw_init_queue(&pxmitpriv->bk_pending); - _rtw_init_queue(&pxmitpriv->vi_pending); - _rtw_init_queue(&pxmitpriv->vo_pending); - _rtw_init_queue(&pxmitpriv->bm_pending); - - //_rtw_init_queue(&pxmitpriv->legacy_dz_queue); - //_rtw_init_queue(&pxmitpriv->apsd_queue); - - _rtw_init_queue(&pxmitpriv->free_xmit_queue); - - - /* - Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, - and initialize free_xmit_frame below. - Please also apply free_txobj to link_up all the xmit_frames... - */ - - pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4); - - if (pxmitpriv->pallocated_frame_buf == NULL){ - pxmitpriv->pxmit_frame_buf =NULL; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_frame fail!\n")); - res= _FAIL; - goto exit; - } - pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4); - //pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - - // ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3); - - pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; - - for (i = 0; i < NR_XMITFRAME; i++) - { - _rtw_init_listhead(&(pxframe->list)); - - pxframe->padapter = padapter; - pxframe->frame_tag = NULL_FRAMETAG; - - pxframe->pkt = NULL; - - pxframe->buf_addr = NULL; - pxframe->pxmitbuf = NULL; - - rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue)); - - pxframe++; - } - - pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME; - - pxmitpriv->frag_len = MAX_FRAG_THRESHOLD; - - - //init xmit_buf - _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue); - _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue); - - pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4); - - if (pxmitpriv->pallocated_xmitbuf == NULL){ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_buf fail!\n")); - res= _FAIL; - goto exit; - } - - pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4); - //pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - - // ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3); - - pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf; - - for (i = 0; i < NR_XMITBUFF; i++) - { - _rtw_init_listhead(&pxmitbuf->list); - - pxmitbuf->priv_data = NULL; - pxmitbuf->padapter = padapter; - pxmitbuf->ext_tag = _FALSE; - -/* - pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ); - if (pxmitbuf->pallocated_buf == NULL) - { - res = _FAIL; - goto exit; - } - - pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); - //pxmitbuf->pbuf = pxmitbuf->pallocated_buf + XMITBUF_ALIGN_SZ -((SIZE_PTR) (pxmitbuf->pallocated_buf) &(XMITBUF_ALIGN_SZ-1)); -*/ - - if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ))) == _FAIL) - goto exit; - - - pxmitbuf->flags = XMIT_VO_QUEUE; - - rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue)); - #ifdef DBG_XMIT_BUF - pxmitbuf->no=i; - #endif - - pxmitbuf++; - - } - - pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF; - - // Init xmit extension buff - _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue); - - pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); - - if (pxmitpriv->pallocated_xmit_extbuf == NULL){ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n")); - res= _FAIL; - goto exit; - } - - pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4); - - pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf; - - for (i = 0; i < NR_XMIT_EXTBUFF; i++) - { - _rtw_init_listhead(&pxmitbuf->list); - - pxmitbuf->priv_data = NULL; - pxmitbuf->padapter = padapter; - pxmitbuf->ext_tag = _TRUE; - -/* - pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMIT_EXTBUF_SZ); - if (pxmitbuf->pallocated_buf == NULL) - { - res = _FAIL; - goto exit; - } - - pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), 4); -*/ - - if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ)) == _FAIL) - goto exit; - - rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue)); - #ifdef DBG_XMIT_BUF - pxmitbuf->no=i; - #endif - pxmitbuf++; - - } - - pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF; - - if (rtw_alloc_hwxmits(padapter) != 0) // Modified by Yongle Lai - { - res= _FAIL; - goto exit; - } - - rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); - -#ifdef CONFIG_USB_HCI - pxmitpriv->txirp_cnt=1; - - _rtw_init_sema(&(pxmitpriv->tx_retevt), 0); - - //per AC pending irp - pxmitpriv->beq_cnt = 0; - pxmitpriv->bkq_cnt = 0; - pxmitpriv->viq_cnt = 0; - pxmitpriv->voq_cnt = 0; -#endif - - if(padapter->HalFunc.init_xmit_priv != NULL) - padapter->HalFunc.init_xmit_priv(padapter); - -exit: - -_func_exit_; - - return _SUCCESS; -} - -void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv) -{ - _rtw_spinlock_free(&pxmitpriv->lock); - _rtw_free_sema(&pxmitpriv->xmit_sema); - _rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema); - - _rtw_spinlock_free(&pxmitpriv->be_pending.lock); - _rtw_spinlock_free(&pxmitpriv->bk_pending.lock); - _rtw_spinlock_free(&pxmitpriv->vi_pending.lock); - _rtw_spinlock_free(&pxmitpriv->vo_pending.lock); - _rtw_spinlock_free(&pxmitpriv->bm_pending.lock); - - //_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock); - //_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock); - - _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock); - _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock); - _rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock); -} - - -void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv) -{ - int i; - _adapter *padapter = pxmitpriv->adapter; - struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; - - _func_enter_; - - padapter->HalFunc.free_xmit_priv(padapter); - - rtw_mfree_xmit_priv_lock(pxmitpriv); - - if(pxmitpriv->pxmit_frame_buf==NULL) - goto out; - - for(i=0; ipallocated_buf) - // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ); - - pxmitbuf++; - } - - if(pxmitpriv->pallocated_frame_buf) { - rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4); - } - - - if(pxmitpriv->pallocated_xmitbuf) { - rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4); - } - - // free xmit extension buff - _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock); - - pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; - for(i=0; ipallocated_buf) - // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMIT_EXTBUF_SZ); - - pxmitbuf++; - } - - if(pxmitpriv->pallocated_xmit_extbuf) { - rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); - } - - rtw_free_hwxmits(padapter); - -out: - -_func_exit_; - -} - -static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - u32 sz; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *psta = pattrib->psta; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - if (pattrib->nr_frags != 1) - { - sz = padapter->xmitpriv.frag_len; - } - else //no frag - { - sz = pattrib->last_txcmdsz; - } - - // (1) RTS_Threshold is compared to the MPDU, not MSDU. - // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. - // Other fragments are protected by previous fragment. - // So we only need to check the length of first fragment. - if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec) - { - if(sz > padapter->registrypriv.rts_thresh) - { - pattrib->vcs_mode = RTS_CTS; - } - else - { - if(psta->rtsen) - pattrib->vcs_mode = RTS_CTS; - else if(psta->cts2self) - pattrib->vcs_mode = CTS_TO_SELF; - else - pattrib->vcs_mode = NONE_VCS; - } - } - else - { - while (_TRUE) - { -#if 0 //Todo - //check IOT action - if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF) - { - pattrib->vcs_mode = CTS_TO_SELF; - pattrib->rts_rate = MGN_24M; - break; - } - else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE)) - { - pattrib->vcs_mode = RTS_CTS; - pattrib->rts_rate = MGN_24M; - break; - } -#endif - //check ERP protection - if(psta->rtsen || psta->cts2self) - { - if(psta->rtsen) - pattrib->vcs_mode = RTS_CTS; - else if(psta->cts2self) - pattrib->vcs_mode = CTS_TO_SELF; - - break; - } - - //check HT op mode - if(pattrib->ht_en) - { - u8 HTOpMode = pmlmeinfo->HT_protection; - if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) || - (!pmlmeext->cur_bwmode && HTOpMode == 3) ) - { - pattrib->vcs_mode = RTS_CTS; - break; - } - } - - //check rts - if(sz > padapter->registrypriv.rts_thresh) - { - pattrib->vcs_mode = RTS_CTS; - break; - } - - //to do list: check MIMO power save condition. - - //check AMPDU aggregation for TXOP - if(pattrib->ampdu_en==_TRUE) - { - pattrib->vcs_mode = RTS_CTS; - break; - } - - pattrib->vcs_mode = NONE_VCS; - break; - } - } -} - -static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta) -{ - /*if(psta->rtsen) - pattrib->vcs_mode = RTS_CTS; - else if(psta->cts2self) - pattrib->vcs_mode = CTS_TO_SELF; - else - pattrib->vcs_mode = NONE_VCS;*/ - - pattrib->mdata = 0; - pattrib->eosp = 0; - pattrib->triggered=0; - - //qos_en, ht_en, init rate, ,bw, ch_offset, sgi - pattrib->qos_en = psta->qos_option; - pattrib->ht_en = psta->htpriv.ht_option; - pattrib->raid = psta->raid; - pattrib->bwmode = psta->htpriv.bwmode; - pattrib->ch_offset = psta->htpriv.ch_offset; - pattrib->sgi= psta->htpriv.sgi; - pattrib->ampdu_en = _FALSE; - - if(pattrib->ht_en && psta->htpriv.ampdu_enable) - { - if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) - pattrib->ampdu_en = _TRUE; - } - -} - -static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib) -{ - struct ethhdr etherhdr; - struct iphdr ip_hdr; - s32 UserPriority = 0; - - - _rtw_open_pktfile(ppktfile->pkt, ppktfile); - _rtw_pktfile_read(ppktfile, (unsigned char*)ðerhdr, ETH_HLEN); - - // get UserPriority from IP hdr - if (pattrib->ether_type == 0x0800) { - _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr)); -// UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; - UserPriority = ip_hdr.tos >> 5; - } else if (pattrib->ether_type == 0x888e) { - // "When priority processing of data frames is supported, - // a STA's SME should send EAPOL-Key frames at the highest priority." - UserPriority = 7; - } - - pattrib->priority = UserPriority; - pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; - pattrib->subtype = WIFI_QOS_DATA_TYPE; -} - -static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib) -{ - uint i; - struct pkt_file pktfile; - struct sta_info *psta = NULL; - struct ethhdr etherhdr; - - sint bmcast; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct sta_priv *pstapriv = &padapter->stapriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv= &pmlmepriv->qospriv; - sint res = _SUCCESS; - - _func_enter_; - - _rtw_open_pktfile(pkt, &pktfile); - i = _rtw_pktfile_read(&pktfile, (u8*)ðerhdr, ETH_HLEN); - - pattrib->ether_type = ntohs(etherhdr.h_proto); - - - _rtw_memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN); - _rtw_memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN); - - pattrib->pctrl = 0; - - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { - _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - } - else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { - _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); - } - else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN); - } - - pattrib->pktlen = pktfile.pkt_len; // rtw_xmitframe_coalesce() overwirte this! - - if (ETH_P_IP == pattrib->ether_type) - { - // The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time - // to prevent DHCP protocol fail - u8 tmp[24]; - _rtw_pktfile_read(&pktfile, &tmp[0], 24); - pattrib->dhcp_pkt = 0; - if (pktfile.pkt_len > 282) {//MINIMUM_DHCP_PACKET_SIZE) { - if (ETH_P_IP == pattrib->ether_type) {// IP header - if (((tmp[21] == 68) && (tmp[23] == 67)) || - ((tmp[21] == 67) && (tmp[23] == 68))) { - // 68 : UDP BOOTP client - // 67 : UDP BOOTP server - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("======================update_attrib: get DHCP Packet \n")); - // Use low rate to send DHCP packet. - //if(pMgntInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom) - //{ - // tcb_desc->DataRate = MgntQuery_TxRateExcludeCCKRates(ieee);//0xc;//ofdm 6m - // tcb_desc->bTxDisableRateFallBack = false; - //} - //else - // pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate; - //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate)); - pattrib->dhcp_pkt = 1; - } - } - } - } - - #ifdef CONFIG_SET_SCAN_DENY_TIMER - if ( (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) - { - rtw_set_scan_deny(pmlmepriv, 3000); - } - #endif - -#ifdef CONFIG_LPS - // If EAPOL , ARP , OR DHCP packet, driver must be in active mode. - if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) - { - rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1); - } -#endif - - bmcast = IS_MCAST(pattrib->ra); - - // get sta_info - if (bmcast) { - psta = rtw_get_bcmc_stainfo(padapter); - } else { - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - if (psta == NULL) { // if we cannot get psta => drrp the pkt - RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra))); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); - #endif - res =_FAIL; - goto exit; - } - } - - if (psta) - { - pattrib->mac_id = psta->mac_id; - pattrib->psta = psta; - } - else - { - // if we cannot get psta => drop the pkt - RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra))); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); - #endif - res = _FAIL; - goto exit; - } - - pattrib->ack_policy = 0; - // get ether_hdr_len - pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag - - pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA_TYPE; - pattrib->priority = 0; - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) - { - if(psta->qos_option) - set_qos(&pktfile, pattrib); - } - else - { - if(pqospriv->qos_option) - set_qos(&pktfile, pattrib); - } - - //pattrib->priority = 5; //force to used VI queue, for testing - - if (psta->ieee8021x_blocked == _TRUE) - { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n")); - - pattrib->encrypt = 0; - - if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)) - { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type)); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n", __FUNCTION__,pattrib->ether_type); - #endif - res = _FAIL; - goto exit; - } - } - else - { - GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); - - switch(psecuritypriv->dot11AuthAlgrthm) - { - case dot11AuthAlgrthm_Open: - case dot11AuthAlgrthm_Shared: - case dot11AuthAlgrthm_Auto: - pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; - break; - case dot11AuthAlgrthm_8021X: - if(bmcast) - pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid; - else - pattrib->key_idx = 0; - break; - default: - pattrib->key_idx = 0; - break; - } - - - } - - switch (pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - pattrib->iv_len = 4; - pattrib->icv_len = 4; - break; - - case _TKIP_: - pattrib->iv_len = 8; - pattrib->icv_len = 4; - - if(padapter->securitypriv.busetkipkey==_FAIL) - { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npadapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", padapter->securitypriv.busetkipkey)); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s padapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, padapter->securitypriv.busetkipkey); - #endif - res =_FAIL; - goto exit; - } - - break; - case _AES_: - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n pattrib->encrypt=%d (_AES_)\n",pattrib->encrypt)); - pattrib->iv_len = 8; - pattrib->icv_len = 8; - break; - - default: - pattrib->iv_len = 0; - pattrib->icv_len = 0; - break; - } - - RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, - ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n", - pattrib->encrypt, padapter->securitypriv.sw_encrypt)); - - if (pattrib->encrypt && - ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) - { - pattrib->bswenc = _TRUE; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_, - ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n", - pattrib->encrypt, padapter->securitypriv.sw_encrypt)); - } else { - pattrib->bswenc = _FALSE; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n")); - } - - rtw_set_tx_chksum_offload(pkt, pattrib); - - update_attrib_phy_info(pattrib, psta); - -exit: - -_func_exit_; - - return res; -} - -static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){ - sint curfragnum,length; - u8 *pframe, *payload,mic[8]; - struct mic_data micdata; - struct sta_info *stainfo; - struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - u8 priority[4]={0x0,0x0,0x0,0x0}; - sint bmcst = IS_MCAST(pattrib->ra); - - if(pattrib->psta) - { - stainfo = pattrib->psta; - } - else - { - stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]); - } - - - -_func_enter_; - - if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_) - { - //encode mic code - if(stainfo!= NULL){ - u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; - -#ifdef CONFIG_USB_TX_AGGREGATION - pframe = pxmitframe->buf_addr + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); -#else - pframe = pxmitframe->buf_addr + TXDESC_OFFSET; -#endif - - if(bmcst) - { - if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){ - //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); - //rtw_msleep_os(10); - return _FAIL; - } - //start to calculate the mic code - rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey); - } - else - { - if(_rtw_memcmp(&stainfo->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){ - //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); - //rtw_msleep_os(10); - return _FAIL; - } - //start to calculate the mic code - rtw_secmicsetkey(&micdata, &stainfo->dot11tkiptxmickey.skey[0]); - } - - if(pframe[1]&1){ //ToDS==1 - rtw_secmicappend(&micdata, &pframe[16], 6); //DA - if(pframe[1]&2) //From Ds==1 - rtw_secmicappend(&micdata, &pframe[24], 6); - else - rtw_secmicappend(&micdata, &pframe[10], 6); - } - else{ //ToDS==0 - rtw_secmicappend(&micdata, &pframe[4], 6); //DA - if(pframe[1]&2) //From Ds==1 - rtw_secmicappend(&micdata, &pframe[16], 6); - else - rtw_secmicappend(&micdata, &pframe[10], 6); - - } - - if(pqospriv->qos_option==1) - priority[0]=(u8)pxmitframe->attrib.priority; - - - rtw_secmicappend(&micdata, &priority[0], 4); - - payload=pframe; - - for(curfragnum=0;curfragnumnr_frags;curfragnum++){ - payload=(u8 *)RND4((SIZE_PTR)(payload)); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n", - curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7))); - - payload=payload+pattrib->hdrlen+pattrib->iv_len; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len)); - if((curfragnum+1)==pattrib->nr_frags){ - length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); - rtw_secmicappend(&micdata, payload,length); - payload=payload+length; - } - else{ - length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); - rtw_secmicappend(&micdata, payload, length); - payload=payload+length+pattrib->icv_len; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len)); - } - } - rtw_secgetmic(&micdata,&(mic[0])); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n")); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz)); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \n\ - mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n", - mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7])); - //add mic code and add the mic code length in last_txcmdsz - - _rtw_memcpy(payload, &(mic[0]),8); - pattrib->last_txcmdsz+=8; - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n")); - payload=payload-pattrib->last_txcmdsz+8; - for(curfragnum=0;curfragnumlast_txcmdsz;curfragnum=curfragnum+8) - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ", - *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3), - *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7))); - } - else{ - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n")); - } - } - -_func_exit_; - - return _SUCCESS; -} - -static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct security_priv *psecuritypriv=&padapter->securitypriv; - -_func_enter_; - - //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc)) - if(pattrib->bswenc) - { - //DBG_8192C("start xmitframe_swencrypt\n"); - RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n")); - switch(pattrib->encrypt){ - case _WEP40_: - case _WEP104_: - rtw_wep_encrypt(padapter, (u8 *)pxmitframe); - break; - case _TKIP_: - rtw_tkip_encrypt(padapter, (u8 *)pxmitframe); - break; - case _AES_: - rtw_aes_encrypt(padapter, (u8 * )pxmitframe); - break; - default: - break; - } - - } else { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n")); - } - -_func_exit_; - - return _SUCCESS; -} - -s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib) -{ - u16 *qc; - - struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv = &pmlmepriv->qospriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -#ifdef CONFIG_TDLS - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta=NULL; - u8 tdls_seq=0; -#endif - -//#ifdef CONFIG_PWRCTRL -// struct pwrctrl_priv *pwrpriv = &(padapter->pwrctrlpriv); -//#endif - - sint res = _SUCCESS; - u16 *fctrl = &pwlanhdr->frame_ctl; - -_func_enter_; - - _rtw_memset(hdr, 0, WLANHDR_OFFSET); - - SetFrameSubType(fctrl, pattrib->subtype); - - if (pattrib->subtype & WIFI_DATA_TYPE) - { - if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) { - //to_ds = 1, fr_ds = 0; -#ifdef CONFIG_TDLS - if((pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE)){ - ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - if((ptdls_sta!=NULL)&&((ptdls_sta->state & TDLS_LINKED_STATE)==TDLS_LINKED_STATE)&&(pattrib->ether_type!=0x0806)){ - //TDLS data transfer, ToDS=0, FrDs=0 - _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); - tdls_seq=1; - }else{ - // 1.usual data transfer - // 2.Arp pkt will relayed by AP - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); - } - }else -#endif - { - //usual data transfer - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); - } - } - else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) { - //to_ds = 0, fr_ds = 1; - SetFrDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN); - } - else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { - _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); - } - else { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv))); - res = _FAIL; - goto exit; - } - -/*#ifdef CONFIG_PWRCTRL - if (pwrpriv->cpwm >= FW_PWR1 && !(padapter->mlmepriv.sitesurveyctrl.traffic_busy)) - SetPwrMgt(fctrl); -#else - if ((get_fwstate(pmlmepriv)) & WIFI_SLEEP_STATE) - SetPwrMgt(fctrl); -#endif*/ - - if(pattrib->mdata) - SetMData(fctrl); - - if (pattrib->encrypt) - SetPrivacy(fctrl); - - if (pqospriv->qos_option) - { - qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); - - if (pattrib->priority) - SetPriority(qc, pattrib->priority); - - - SetEOSP(qc, pattrib->eosp); - - SetAckpolicy(qc, pattrib->ack_policy); - } - - //TODO: fill HT Control Field - - //Update Seq Num will be handled by f/w - { - struct sta_info *psta; - - sint bmcst = IS_MCAST(pattrib->ra); - - if (pattrib->psta) { - psta = pattrib->psta; - } else { - if(bmcst) { - psta = rtw_get_bcmc_stainfo(padapter); - } else { - psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - } - } - -#ifdef CONFIG_TDLS - // 1. update seq_num per link by sta_info - // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len - if(tdls_seq==1){ - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; - - pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; - - SetSeqNum(hdr, pattrib->seqnum); - - if (pattrib->encrypt){ - pattrib->encrypt= _AES_; - pattrib->iv_len=8; - pattrib->icv_len=8; - } - }else -#endif - if(psta){ - psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; - - pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; - - SetSeqNum(hdr, pattrib->seqnum); - } - } - } - else - { - - } - -exit: - -_func_exit_; - - return res; -} - -s32 rtw_txframes_pending(_adapter *padapter) -{ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) || - (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) || - (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) || - (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE)); -} - -s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib) -{ - struct sta_info *psta; - struct tx_servq *ptxservq; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - int priority = pattrib->priority; - - psta = pattrib->psta; - - switch(priority) - { - case 1: - case 2: - ptxservq = &(psta->sta_xmitpriv.bk_q); - break; - case 4: - case 5: - ptxservq = &(psta->sta_xmitpriv.vi_q); - break; - case 6: - case 7: - ptxservq = &(psta->sta_xmitpriv.vo_q); - break; - case 0: - case 3: - default: - ptxservq = &(psta->sta_xmitpriv.be_q); - break; - - } - - return ptxservq->qcnt; -} - -#ifdef CONFIG_TDLS -void fill_tdls_setup_req_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct ieee80211_ht_cap ht_capie; - struct sta_priv *pstapriv=&padapter->stapriv; - struct sta_info *ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); - - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_REQUEST; - unsigned char bssrate[NumRates]; - int bssrate_len = 0, i = 0 ; - u8 more_supportedrates = 0; - u8 country[8] = {0}; - u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) - unsigned int ie_len; - unsigned char *p; - struct registry_priv *pregpriv = &padapter->registrypriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - u8 link_id_addr[18] = {0}; - u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch. - //RSNIE - u8 RSNIE[20]= - { 0x01, 0x00, //version shall be set to 1 - 0x00, 0x0f, 0xac, 0x07, //group sipher suite - 0x01, 0x00, //pairwise cipher suite count - 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only - 0x01, 0x00, //AKM suite count - 0x00, 0x0f, 0xac, 0x07, //TPK Handshake - 0x00, 0x02, - //PMKID shall not be present - }; - u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero - u8 iedata=0; - u8 timeout_itvl[5]; //set timeout interval to maximum value - u32 time; - - //SNonce - if(pattrib->encrypt){ - for(i=0;i<8;i++){ - time=rtw_get_current_time(); - _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); - } - } - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { - if (pregistrypriv->dev_network.SupportedRates[bssrate_len]== 0) break; - bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; - } - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //country(optional) - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); - - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); - - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, wmm_ie, &(pattrib->pktlen)); - - //FTIE(optional) - if(pattrib->encrypt){ - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - - } - - //Sup_reg_classes(optional) - //HT capabilities - _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); - - ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; - - { - u32 rx_packet_offset, max_recvbuf_sz; - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - if(max_recvbuf_sz-rx_packet_offset>(8191-256)) - ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - } - - ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | - (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; - - switch(pHalData->rf_type) - { - case RF_1T1R: - ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); - break; - - case RF_2T2R: - case RF_1T2R: - default: - ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); - break; - } - - pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, - sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void fill_tdls_setup_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_info *ptdls_sta; - struct sta_priv *pstapriv = &padapter->stapriv; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct ieee80211_ht_cap ht_capie; - - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_RESPONSE; - unsigned char bssrate[NumRates]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - u8 country[8] = {0}; - u16 *stat_code = (u16 *)&pattrib->type; - u8 *dialog_token = &pattrib->nr_frags; - u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) - unsigned int ie_len; - unsigned char *p; - struct registry_priv *pregpriv = &padapter->registrypriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - u8 link_id_addr[18] = {0}; - u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch - u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero - u8 iedata=0; - u8 timeout_itvl[5]; //setup response timeout interval will copy from request - u8 ANonce[32]; //maybe it can put in ontdls_req - u8 k; //for random ANonce - u8 RSNIE[20]= - { 0x01, 0x00, //version shall be set to 1 - 0x00, 0x0f, 0xac, 0x07, //group sipher suite - 0x01, 0x00, //pairwise cipher suite count - 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only - 0x01, 0x00, //AKM suite count - 0x00, 0x0f, 0xac, 0x07, //TPK Handshake - 0x00, 0x02, - //PMKID shall not be present - }; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; - u32 time; - - ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - if(pattrib->encrypt){ - for(k=0;k<8;k++){ - time=rtw_get_current_time(); - _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); - } - } - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - if(ptdls_sta->stat_code!=0) //invalid setup request - return; - - //dialog token - pframe = rtw_set_fixed_ie(pframe, 1, dialog_token, &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt ) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { - if (pregistrypriv->dev_network.SupportedRates[bssrate_len]== 0) break; - bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; - } - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //country(optional) - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt){ - prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); - } - - //extended capabilities - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); - - //QoS capability(WMM_IE) - pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, wmm_ie, &(pattrib->pktlen)); - - //FTIE(optional) - if(pattrib->encrypt){ - wpa_tdls_generate_tpk(padapter, ptdls_sta); - - pftie = pframe; - pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //Sup_reg_classes(optional) - //HT capabilities - _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); - - ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; - - { - u32 rx_packet_offset, max_recvbuf_sz; - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - if(max_recvbuf_sz-rx_packet_offset>(8191-256)) - ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - } - - ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | - (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; - - switch(pHalData->rf_type) - { - case RF_1T1R: - ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); - break; - - case RF_2T2R: - case RF_1T2R: - default: - ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); - break; - } - - pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, - sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //fill ftie mic - if(pattrib->encrypt) - wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); - -} - -void fill_tdls_setup_cfm_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_SETUP_CONFIRM; - unsigned char bssrate[NumRates]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - u8 country[8] = {0}; - u8 *dialog_token = &pattrib->nr_frags; - u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) - unsigned int ie_len; - unsigned char *p; - u8 timeout_itvl[5]; //set timeout interval to maximum value - u8 RSNIE[20]= - { 0x01, 0x00, //version shall be set to 1 - 0x00, 0x0f, 0xac, 0x07, //group sipher suite - 0x01, 0x00, //pairwise cipher suite count - 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only - 0x01, 0x00, //AKM suite count - 0x00, 0x0f, 0xac, 0x07, //TPK Handshake - 0x00, 0x02, - //PMKID shall not be present - }; - struct registry_priv *pregpriv = &padapter->registrypriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - u8 link_id_addr[18] = {0}; - u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status code, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, dialog_token, &(pattrib->pktlen)); - - if(ptdls_sta->stat_code!=0) //invalid setup request - return; - - //RSNIE - if(pattrib->encrypt){ - prsnie = pframe; - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); - } - - //EDCA param set; WMM param ele. - if(pattrib->encrypt){ - //FTIE - pftie = pframe; - pftie_mic = pframe+4; - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); - _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); - pframe += 84; - pattrib->pktlen += 84; - - //Timeout interval - ptimeout_ie = pframe; - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); - ptdls_sta->TPK_count=0; - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - } - - //HT operation; todo - //Link identifier - plinkid_ie = pframe; - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //fill ftie mic - if(pattrib->encrypt) - wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); - -} - -void fill_tdls_teardown_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_TEARDOWN; - unsigned char reason = _RSON_TDLS_TEAR_UN_RSN_; - u8 link_id_addr[18] = {0}; - - struct sta_info *ptear_sta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(reason), &(pattrib->pktlen)); - - //Link identifier - ptear_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - if((ptear_sta->state & TDLS_INITIATOR_STATE)==TDLS_INITIATOR_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - }else if((ptear_sta->state & TDLS_RESPONDER_STATE)==TDLS_RESPONDER_STATE){ - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - } - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void fill_tdls_dis_req_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_DISCOVERY_REQUEST; - u8 link_id_addr[18] = {0}; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void fill_tdls_dis_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct ieee80211_ht_cap ht_capie; - - unsigned char category = WLAN_CATEGORY_PUBLIC; - unsigned char action = TDLS_DISCOVERY_RESPONSE; - unsigned char bssrate[NumRates]; - int bssrate_len = 0; - u8 more_supportedrates = 0; - u8 country[8] = {0}; - u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) - unsigned int ie_len; - unsigned char *p; - struct registry_priv *pregpriv = &padapter->registrypriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - u8 link_id_addr[18] = {0}; - u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch. - //RSNIE - u8 RSNIE[20]= - { 0x01, 0x00, //version shall be set to 1 - 0x00, 0x0f, 0xac, 0x07, //group sipher suite - 0x01, 0x00, //pairwise cipher suite count - 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only - 0x01, 0x00, //AKM suite count - 0x00, 0x0f, 0xac, 0x07, //TPK Handshake - 0x00, 0x02, - //PMKID shall not be present - }; - u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero - u8 iedata=0; - u8 timeout_itvl[5]; //set timeout interval to maximum value - u32 timeout_interval= TPK_RESEND_COUNT * 1000; - - //category, action, dialog token - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); - - //capability - _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); - - if(pattrib->encrypt) - *pframe =*pframe | BIT(4); - pframe += 2; - pattrib->pktlen += 2; - - //supported rates - for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { - if (pregistrypriv->dev_network.SupportedRates[bssrate_len] == 0) break; - bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; - } - - if (bssrate_len > 8) - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); - more_supportedrates = 1; - } - else - { - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); - } - - //extended supported rates - if(more_supportedrates==1){ - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); - } - - //supported channels - pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); - - //RSNIE - if(pattrib->encrypt) - pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); - - //extended capability - pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); - - //FTIE - if(pattrib->encrypt){ - _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 - _rtw_memset(pframe, _FTIE_, 1); //version - _rtw_memset((pframe+1), 82, 1); //length - pframe += 84; - pattrib->pktlen += 84; - //Timeout interval - timeout_itvl[0]=0x02; - _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); - pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); - - } - - //Sup_reg_classes(optional) - //HT capabilities - _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); - - ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; - - { - u32 rx_packet_offset, max_recvbuf_sz; - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); - padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - if(max_recvbuf_sz-rx_packet_offset>(8191-256)) - ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - } - - ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | - (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; - - switch(pHalData->rf_type) - { - case RF_1T1R: - ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); - break; - - case RF_2T2R: - case RF_1T2R: - default: - ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream - _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); - break; - } - - pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, - sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); - - //20/40 BSS coexistence - if(pmlmepriv->num_FortyMHzIntolerant>0) - iedata |= BIT(2);//20 MHz BSS Width Request - pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); - _rtw_memcpy((link_id_addr+12), pattrib->src, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - -} - -void fill_tdls_peer_traffic_indication(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; - u8 link_id_addr[18] = {0}; - u8 AC_queue=0; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, reason code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //PTI control - //PU buffer status - if(ptdls_sta->uapsd_bk&BIT(0)) - AC_queue=BIT(0); - if(ptdls_sta->uapsd_be&BIT(0)) - AC_queue=BIT(1); - if(ptdls_sta->uapsd_vi&BIT(0)) - AC_queue=BIT(2); - if(ptdls_sta->uapsd_vo&BIT(0)) - AC_queue=BIT(3); - pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); - -} - -void fill_tdls_ch_switch_req(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; - u8 link_id_addr[18] = {0}; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 ch_switch_timing[4] = {0}; - u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, target_ch - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->tdls_candidate_ch), &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //ch switch timing - _rtw_memcpy(ch_switch_timing, &switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); - - //update ch switch attrib to sta_info - ptdls_sta->off_ch=pmlmeinfo->tdls_candidate_ch; - ptdls_sta->ch_switch_time=switch_time; - ptdls_sta->ch_switch_timeout=switch_timeout; - -} - -void fill_tdls_ch_switch_rsp(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) -{ - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 payload_type = 0x02; - unsigned char category = WLAN_CATEGORY_TDLS; - unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; - u8 link_id_addr[18] = {0}; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 ch_switch_timing[4] = {0}; - - //payload type - pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); - //category, action, status_code - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); - pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); - - //Link identifier - _rtw_memcpy(link_id_addr, pattrib->ra, 6); - _rtw_memcpy((link_id_addr+6), pattrib->src, 6); - _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); - pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); - - //ch switch timing - _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); - _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); - pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); - -} - -int fill_tdls_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 action) -{ - int res=_SUCCESS; - - switch(action){ - case TDLS_SETUP_REQUEST: - fill_tdls_setup_req_frbody(padapter, pxmitframe, pframe); - break; - case TDLS_SETUP_RESPONSE: - fill_tdls_setup_rsp_frbody(padapter, pxmitframe, pframe); - break; - case TDLS_SETUP_CONFIRM: - fill_tdls_setup_cfm_frbody(padapter, pxmitframe, pframe); - break; - case TDLS_TEARDOWN: - fill_tdls_teardown_frbody(padapter, pxmitframe, pframe); - break; - case TDLS_DISCOVERY_REQUEST: - fill_tdls_dis_req_frbody(padapter, pxmitframe, pframe); - break; - case TDLS_PEER_TRAFFIC_INDICATION: - fill_tdls_peer_traffic_indication(padapter, pxmitframe, pframe); - break; - case TDLS_CHANNEL_SWITCH_REQUEST: - fill_tdls_ch_switch_req(padapter, pxmitframe, pframe); - break; - case TDLS_CHANNEL_SWITCH_RESPONSE: - fill_tdls_ch_switch_rsp(padapter, pxmitframe, pframe); - break; - default: - res=_FAIL; - break; - } - - return res; -} - -s32 make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, u8 action) -{ - u16 *qc; - struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct qos_priv *pqospriv = &pmlmepriv->qospriv; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta=NULL, *ptdls_sta=NULL; - u8 tdls_seq=0; - - sint res = _SUCCESS; - u16 *fctrl = &pwlanhdr->frame_ctl; - -_func_enter_; - - _rtw_memset(hdr, 0, WLANHDR_OFFSET); - - SetFrameSubType(fctrl, pattrib->subtype); - - switch(action){ - case TDLS_SETUP_REQUEST: - case TDLS_SETUP_RESPONSE: - case TDLS_SETUP_CONFIRM: - case TDLS_TEARDOWN: //directly to peer STA or via AP - case TDLS_PEER_TRAFFIC_INDICATION: - case TDLS_PEER_PSM_REQUEST: //directly to peer STA or via AP - case TDLS_DISCOVERY_REQUEST: //unicast: directly to peer sta, Bcast: via AP - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); - break; - case TDLS_CHANNEL_SWITCH_REQUEST: - case TDLS_CHANNEL_SWITCH_RESPONSE: - case TDLS_PEER_PSM_RESPONSE: - case TDLS_PEER_TRAFFIC_RESPONSE: - _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); - tdls_seq=1; - break; - } - - if (pattrib->encrypt) - SetPrivacy(fctrl); - - if (pqospriv->qos_option) - { - qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); - if (pattrib->priority) - SetPriority(qc, pattrib->priority); - SetAckpolicy(qc, pattrib->ack_policy); - } - - psta = pattrib->psta; - - // 1. update seq_num per link by sta_info - // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len - if(tdls_seq==1){ - ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); - if(ptdls_sta){ - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; - pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; - SetSeqNum(hdr, pattrib->seqnum); - - if (pattrib->encrypt){ - pattrib->encrypt= _AES_; - pattrib->iv_len=8; - pattrib->icv_len=8; - } - }else{ - res=_FAIL; - goto exit; - } - }else if(psta){ - psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; - psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; - pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; - SetSeqNum(hdr, pattrib->seqnum); - } - - -exit: - -_func_exit_; - - return res; -} - -s32 xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, u8 action) -{ - s32 llc_sz, mem_sz; - - SIZE_PTR addr; - - u8 *pframe, *mem_start; - - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - u8 *pbuf_start; - s32 bmcst = IS_MCAST(pattrib->ra); - s32 res = _SUCCESS; - -_func_enter_; - - if (pattrib->psta) { - psta = pattrib->psta; - } else { - if(bmcst) { - psta = rtw_get_bcmc_stainfo(padapter); - } else { - psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - } - } - - if(psta==NULL) - return _FAIL; - - if (pxmitframe->buf_addr == NULL) - return _FAIL; - - pbuf_start = pxmitframe->buf_addr; - mem_start = pbuf_start + TXDESC_OFFSET; - - if (make_tdls_wlanhdr(padapter, mem_start, pattrib, action) == _FAIL) { - res = _FAIL; - goto exit; - } - - pframe = mem_start; - pframe += pattrib->hdrlen; - - //adding icv, if necessary... - if (pattrib->iv_len) - { - if (psta != NULL) - { - switch(pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - break; - case _TKIP_: - if(bmcst) - TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - TKIP_IV(pattrib->iv, psta->dot11txpn, 0); - break; - case _AES_: - if(bmcst) - AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - AES_IV(pattrib->iv, psta->dot11txpn, 0); - break; - } - } - - _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); - pframe += pattrib->iv_len; - - } - - llc_sz = rtw_put_snap(pframe, pattrib->ether_type); - pframe += llc_sz; - - //pattrib->pktlen will be counted in fill_tdls_frbody - pattrib->pktlen = 0; - - fill_tdls_frbody(padapter, pxmitframe, pframe, action); - - if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { - _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); - pframe += pattrib->icv_len; - } - - pattrib->nr_frags = 1; - pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz + - ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen; - - if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) - { - goto exit; - } - - xmitframe_swencrypt(padapter, pxmitframe); - - update_attrib_vcs_info(padapter, pxmitframe); - -exit: - -_func_exit_; - - return res; -} -#endif - -/* - -This sub-routine will perform all the following: - -1. remove 802.3 header. -2. create wlan_header, based on the info in pxmitframe -3. append sta's iv/ext-iv -4. append LLC -5. move frag chunk from pframe to pxmitframe->mem -6. apply sw-encrypt, if necessary. - -*/ -s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe) -{ - struct pkt_file pktfile; - - s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz; - - SIZE_PTR addr; - - u8 *pframe, *mem_start; - - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - struct pkt_attrib *pattrib = &pxmitframe->attrib; - - u8 *pbuf_start; - - s32 bmcst = IS_MCAST(pattrib->ra); - s32 res = _SUCCESS; - -_func_enter_; - - if (pattrib->psta) { - psta = pattrib->psta; - } else { - psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); - } - - if(psta==NULL) - return _FAIL; - - if (pxmitframe->buf_addr == NULL) - return _FAIL; - - pbuf_start = pxmitframe->buf_addr; - -#ifdef CONFIG_USB_TX_AGGREGATION - mem_start = pbuf_start + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); -#else - mem_start = pbuf_start + TXDESC_OFFSET; -#endif - - if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n")); - res = _FAIL; - goto exit; - } - - _rtw_open_pktfile(pkt, &pktfile); - _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen); - - pattrib->pktlen = pktfile.pkt_len; - - frg_inx = 0; - frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342 - - while (1) - { - llc_sz = 0; - - mpdu_len = frg_len; - - pframe = mem_start; - - SetMFrag(mem_start); - - pframe += pattrib->hdrlen; - mpdu_len -= pattrib->hdrlen; - - //adding icv, if necessary... - if (pattrib->iv_len) - { - //if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) - // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); - //else - // psta = rtw_get_stainfo(pstapriv, pattrib->ra); - - if (psta != NULL) - { - switch(pattrib->encrypt) - { - case _WEP40_: - case _WEP104_: - WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - break; - case _TKIP_: - if(bmcst) - TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - TKIP_IV(pattrib->iv, psta->dot11txpn, 0); - break; - case _AES_: - if(bmcst) - AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); - else - AES_IV(pattrib->iv, psta->dot11txpn, 0); - break; - } - } - - _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); - - RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_, - ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n", - padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3))); - - pframe += pattrib->iv_len; - - mpdu_len -= pattrib->iv_len; - } - - if (frg_inx == 0) { - llc_sz = rtw_put_snap(pframe, pattrib->ether_type); - pframe += llc_sz; - mpdu_len -= llc_sz; - } - - if ((pattrib->icv_len >0) && (pattrib->bswenc)) { - mpdu_len -= pattrib->icv_len; - } - - - if (bmcst) { - // don't do fragment to broadcat/multicast packets - mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen); - } else { - mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len); - } - - pframe += mem_sz; - - if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { - _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); - pframe += pattrib->icv_len; - } - - frg_inx++; - - if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE)) - { - pattrib->nr_frags = frg_inx; - - pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) + - ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz; - - ClearMFrag(mem_start); - -#ifdef CONFIG_SDIO_HCI - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("coalesce: pattrib->last_txcmdsz=%d pxmitframe->pxmitbuf->phead=0x%p pxmitframe->pxmitbuf->ptail=0x%p pxmitframe->pxmitbuf->len=%d\n", pattrib->last_txcmdsz, pxmitframe->pxmitbuf->phead, pxmitframe->pxmitbuf->ptail, pxmitframe->pxmitbuf->len)); - pxmitframe->pxmitbuf->ptail = pxmitframe->buf_addr + _RND512(pframe-pxmitframe->buf_addr); - pxmitframe->pxmitbuf->len += pxmitframe->pxmitbuf->ptail - pxmitframe->buf_addr;//(pframe-mem_start); - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("coalesce: [2] pattrib->last_txcmdsz=%d pxmitframe->pxmitbuf->ptail=0x%p pxmitframe->pxmitbuf->len=%d\n", pattrib->last_txcmdsz, pxmitframe->pxmitbuf->ptail, pxmitframe->pxmitbuf->len)); -#endif - - break; - - } else { - -#ifdef CONFIG_SDIO_HCI - pxmitframe->pxmitbuf->ptail = pxmitframe->buf_addr + _RND512(pframe-pxmitframe->buf_addr); - pxmitframe->pxmitbuf->len += pxmitframe->pxmitbuf->ptail - pxmitframe->buf_addr; - pframe=pxmitframe->pxmitbuf->ptail; -#endif - } - - addr = (SIZE_PTR)(pframe); - - mem_start = (unsigned char *)RND4(addr) + TXDESC_OFFSET; - _rtw_memcpy(mem_start, pbuf_start + TXDESC_OFFSET, pattrib->hdrlen); - } - - if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) - { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n")); - res = _FAIL; - goto exit; - } - -#ifdef CONFIG_SDIO_HCI - fillin_txdesc(padapter, pxmitframe); -#endif - - xmitframe_swencrypt(padapter, pxmitframe); - - if(bmcst == _FALSE) - update_attrib_vcs_info(padapter, pxmitframe); - else - pattrib->vcs_mode = NONE_VCS; - -exit: - -_func_exit_; - - return res; -} - -/* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header - * IEEE LLC/SNAP header contains 8 octets - * First 3 octets comprise the LLC portion - * SNAP portion, 5 octets, is divided into two fields: - * Organizationally Unique Identifier(OUI), 3 octets, - * type, defined by that organization, 2 octets. - */ -s32 rtw_put_snap(u8 *data, u16 h_proto) -{ - struct ieee80211_snap_hdr *snap; - u8 *oui; - -_func_enter_; - - snap = (struct ieee80211_snap_hdr *)data; - snap->dsap = 0xaa; - snap->ssap = 0xaa; - snap->ctrl = 0x03; - - if (h_proto == 0x8137 || h_proto == 0x80f3) - oui = P802_1H_OUI; - else - oui = RFC1042_OUI; - - snap->oui[0] = oui[0]; - snap->oui[1] = oui[1]; - snap->oui[2] = oui[2]; - - *(u16 *)(data + SNAP_SIZE) = htons(h_proto); - -_func_exit_; - - return SNAP_SIZE + sizeof(u16); -} - -void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len) -{ - - uint protection; - u8 *perp; - sint erp_len; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct registry_priv *pregistrypriv = &padapter->registrypriv; - -_func_enter_; - - switch(pxmitpriv->vcs_setting) - { - case DISABLE_VCS: - pxmitpriv->vcs = NONE_VCS; - break; - - case ENABLE_VCS: - break; - - case AUTO_VCS: - default: - perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len); - if(perp == NULL) - { - pxmitpriv->vcs = NONE_VCS; - } - else - { - protection = (*(perp + 2)) & BIT(1); - if (protection) - { - if(pregistrypriv->vcs_type == RTS_CTS) - pxmitpriv->vcs = RTS_CTS; - else - pxmitpriv->vcs = CTS_TO_SELF; - } - else - pxmitpriv->vcs = NONE_VCS; - } - - break; - - } - -_func_exit_; - -} - -void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz) -{ - struct sta_info *psta = NULL; - struct stainfo_stats *pstats = NULL; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) - { - pxmitpriv->tx_bytes += sz; -#ifdef CONFIG_USB_TX_AGGREGATION - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pxmitframe->agg_num; -#else - pmlmepriv->LinkDetectInfo.NumTxOkInPeriod++; -#endif - - psta = pxmitframe->attrib.psta; - - if(psta) - { - pstats = &psta->sta_stats; -#ifdef CONFIG_USB_TX_AGGREGATION - pstats->tx_pkts += pxmitframe->agg_num; -#else - pstats->tx_pkts++; -#endif - pstats->tx_bytes += sz; - } - } - -} - -struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv) -{ - _irqL irqL; - struct xmit_buf *pxmitbuf = NULL; - _list *plist, *phead; - _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; - -_func_enter_; - - _enter_critical(&pfree_queue->lock, &irqL); - - if(_rtw_queue_empty(pfree_queue) == _TRUE) { - pxmitbuf = NULL; - } else { - - phead = get_list_head(pfree_queue); - - plist = get_next(phead); - - pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list); - - rtw_list_delete(&(pxmitbuf->list)); - } - - if (pxmitbuf != NULL) - { - pxmitpriv->free_xmit_extbuf_cnt--; - #ifdef DBG_XMIT_BUF - DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt); - #endif - - - pxmitbuf->priv_data = NULL; - -#ifdef CONFIG_SDIO_HCI - pxmitbuf->len = 0; - pxmitbuf->phead = pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->pbuf; - pxmitbuf->pend = pxmitbuf->pbuf + (MAX_XMIT_EXTBUF_SZ-4); -#endif -#ifdef CONFIG_PCI_HCI - pxmitbuf->len = 0; -#endif - } - - _exit_critical(&pfree_queue->lock, &irqL); - -_func_exit_; - - return pxmitbuf; -} - -s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) -{ - _irqL irqL; - _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; - -_func_enter_; - - if(pxmitbuf==NULL) - { - return _FAIL; - } - - _enter_critical(&pfree_queue->lock, &irqL); - - rtw_list_delete(&pxmitbuf->list); - - rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue)); - pxmitpriv->free_xmit_extbuf_cnt++; - #ifdef DBG_XMIT_BUF - DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt); - #endif - - _exit_critical(&pfree_queue->lock, &irqL); - -_func_exit_; - - return _SUCCESS; -} - -struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv) -{ - _irqL irqL; - struct xmit_buf *pxmitbuf = NULL; - _list *plist, *phead; - _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; - -_func_enter_; - - //DBG_8192C("+rtw_alloc_xmitbuf\n"); - - _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); - - if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) { - pxmitbuf = NULL; - } else { - - phead = get_list_head(pfree_xmitbuf_queue); - - plist = get_next(phead); - - pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list); - - rtw_list_delete(&(pxmitbuf->list)); - } - - if (pxmitbuf != NULL) - { - pxmitpriv->free_xmitbuf_cnt--; - #ifdef DBG_XMIT_BUF - DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt); - #endif - //DBG_8192C("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); - - pxmitbuf->priv_data = NULL; - -#ifdef CONFIG_SDIO_HCI - pxmitbuf->len = 0; - pxmitbuf->phead = pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->pbuf; - pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ; -#endif -#ifdef CONFIG_PCI_HCI - pxmitbuf->len = 0; -#endif - } - #ifdef DBG_XMIT_BUF - else - { - DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n"); - } - #endif - - _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); - -_func_exit_; - - return pxmitbuf; -} - -s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) -{ - _irqL irqL; - _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; - -_func_enter_; - - //DBG_8192C("+rtw_free_xmitbuf\n"); - - if(pxmitbuf==NULL) - { - return _FAIL; - } - - if(pxmitbuf->ext_tag) - { - rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf); - } - else - { - _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); - - rtw_list_delete(&pxmitbuf->list); - - rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue)); - - pxmitpriv->free_xmitbuf_cnt++; - //DBG_8192C("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); - #ifdef DBG_XMIT_BUF - DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt); - #endif - _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); - } - -_func_exit_; - - return _SUCCESS; -} - -/* -Calling context: -1. OS_TXENTRY -2. RXENTRY (rx_thread or RX_ISR/RX_CallBack) - -If we turn on USE_RXTHREAD, then, no need for critical section. -Otherwise, we must use _enter/_exit critical to protect free_xmit_queue... - -Must be very very cautious... - -*/ - -struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue) -{ - /* - Please remember to use all the osdep_service api, - and lock/unlock or _enter/_exit critical to protect - pfree_xmit_queue - */ - - _irqL irqL; - struct xmit_frame *pxframe = NULL; - _list *plist, *phead; - _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; - _adapter *padapter = pxmitpriv->adapter; - -_func_enter_; - - _enter_critical_bh(&pfree_xmit_queue->lock, &irqL); - - if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt)); - pxframe = NULL; - } else { - phead = get_list_head(pfree_xmit_queue); - - plist = get_next(phead); - - pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list); - - rtw_list_delete(&(pxframe->list)); - } - - if (pxframe != NULL) - { - pxmitpriv->free_xmitframe_cnt--; - - RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); - - pxframe->buf_addr = NULL; - pxframe->pxmitbuf = NULL; - - _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib)); - //pxframe->attrib.psta = NULL; - - pxframe->frame_tag = DATA_FRAMETAG; - -#ifdef CONFIG_USB_HCI - pxframe->pkt = NULL; - pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc - -#ifdef CONFIG_USB_TX_AGGREGATION - pxframe->agg_num = 1; -#endif - -#endif //#ifdef CONFIG_USB_HCI - -#ifdef PLATFORM_LINUX - if(pxmitpriv->free_xmitframe_cnt==1) - { - if (!netif_queue_stopped(padapter->pnetdev)) - netif_stop_queue(padapter->pnetdev); - } -#endif - - } - - _exit_critical_bh(&pfree_xmit_queue->lock, &irqL); - -_func_exit_; - - return pxframe; -} - -s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) -{ - _irqL irqL; - _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; - _adapter *padapter = pxmitpriv->adapter; - _pkt *pndis_pkt = NULL; - -_func_enter_; - - if (pxmitframe == NULL) { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n")); - goto exit; - } - - _enter_critical_bh(&pfree_xmit_queue->lock, &irqL); - - rtw_list_delete(&pxmitframe->list); - - if (pxmitframe->pkt){ - pndis_pkt = pxmitframe->pkt; - pxmitframe->pkt = NULL; - } - - rtw_list_insert_tail(&pxmitframe->list, get_list_head(pfree_xmit_queue)); - - pxmitpriv->free_xmitframe_cnt++; - RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); - - _exit_critical_bh(&pfree_xmit_queue->lock, &irqL); - - - if(pndis_pkt) - rtw_os_pkt_complete(padapter, pndis_pkt); - -exit: - -_func_exit_; - - return _SUCCESS; -} - -s32 rtw_free_xmitframe_ex(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) -{ - -_func_enter_; - - if(pxmitframe==NULL){ - goto exit; - } - - RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe_ex()\n")); - - rtw_free_xmitframe(pxmitpriv, pxmitframe); - -exit: - -_func_exit_; - - return _SUCCESS; -} - -void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue) -{ - _irqL irqL; - _list *plist, *phead; - struct xmit_frame *pxmitframe; - -_func_enter_; - - _enter_critical_bh(&(pframequeue->lock), &irqL); - - phead = get_list_head(pframequeue); - plist = get_next(phead); - - while (rtw_end_of_queue_search(phead, plist) == _FALSE) - { - - pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list); - - plist = get_next(plist); - - rtw_free_xmitframe(pxmitpriv,pxmitframe); - - } - _exit_critical_bh(&(pframequeue->lock), &irqL); - -_func_exit_; -} - -s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) - { - RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, - ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n")); -// pxmitframe->pkt = NULL; - return _FAIL; - } - - return _SUCCESS; -} - -static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue) -{ - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - _adapter *padapter = pxmitpriv->adapter; -#ifdef CONFIG_TDLS - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; -#endif - - xmitframe_phead = get_list_head(pframe_queue); - xmitframe_plist = get_next(xmitframe_phead); - - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - - xmitframe_plist = get_next(xmitframe_plist); - -/*#ifdef RTK_DMP_PLATFORM -#ifdef CONFIG_USB_TX_AGGREGATION - if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2)) - { - pxmitframe = NULL; - - tasklet_schedule(&pxmitpriv->xmit_tasklet); - - break; - } -#endif -#endif*/ - rtw_list_delete(&pxmitframe->list); - - ptxservq->qcnt--; - -#ifndef CONFIG_TDLS -#ifdef CONFIG_AP_MODE - if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)==_FALSE) -#endif - { - //rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending); - - //ptxservq->qcnt--; - - break; - } -//else CONFIG_TDLS, process as TDLS Buffer STA -#else - if((pmlmeinfo->tdls_setup_state&TDLS_LINKED_STATE)!=TDLS_LINKED_STATE) - break; - if(xmit_tdls_enqueue_for_sleeping_sta(padapter, pxmitframe)==_FALSE) - break; -#endif - - - pxmitframe = NULL; - - } - - return pxmitframe; -} - -struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry) -{ - _irqL irqL0; - _list *sta_plist, *sta_phead; - struct hw_xmit *phwxmit; - struct tx_servq *ptxservq = NULL; - _queue *pframe_queue = NULL; - struct xmit_frame *pxmitframe = NULL; - _adapter *padapter = pxmitpriv->adapter; - struct registry_priv *pregpriv = &padapter->registrypriv; - int i, inx[4]; -#ifdef CONFIG_USB_HCI -// int j, tmp, acirp_cnt[4]; -#endif - -_func_enter_; - - inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; - - if(pregpriv->wifi_spec==1) - { - int j, tmp, acirp_cnt[4]; -#if 0 - if(flagsvo, 1->vi, 2->be, 3->bk. - acirp_cnt[0] = pxmitpriv->voq_cnt; - acirp_cnt[1] = pxmitpriv->viq_cnt; - acirp_cnt[2] = pxmitpriv->beq_cnt; - acirp_cnt[3] = pxmitpriv->bkq_cnt; - - for(i=0; i<4; i++) - { - for(j=i+1; j<4; j++) - { - if(acirp_cnt[j]lock, &irqL0); - - for(i = 0; i < entry; i++) - { - phwxmit = phwxmit_i + inx[i]; - - //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0); - - sta_phead = get_list_head(phwxmit->sta_queue); - sta_plist = get_next(sta_phead); - - while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE) - { - - ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending); - - pframe_queue = &ptxservq->sta_pending; - - pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue); - - if(pxmitframe) - { - phwxmit->accnt--; - - //Remove sta node when there is no pending packets. - if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break - rtw_list_delete(&ptxservq->tx_pending); - - //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); - - goto exit; - } - - sta_plist = get_next(sta_plist); - - } - - //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); - - } - -exit: - - _exit_critical_bh(&pxmitpriv->lock, &irqL0); - -_func_exit_; - - return pxmitframe; -} - -#if 1 -struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac) -{ - struct tx_servq *ptxservq; - -_func_enter_; - - switch (up) - { - case 1: - case 2: - ptxservq = &(psta->sta_xmitpriv.bk_q); - *(ac) = 3; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); - break; - - case 4: - case 5: - ptxservq = &(psta->sta_xmitpriv.vi_q); - *(ac) = 1; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); - break; - - case 6: - case 7: - ptxservq = &(psta->sta_xmitpriv.vo_q); - *(ac) = 0; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); - break; - - case 0: - case 3: - default: - ptxservq = &(psta->sta_xmitpriv.be_q); - *(ac) = 2; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); - break; - - } - -_func_exit_; - - return ptxservq; -} -#else -__inline static struct tx_servq *rtw_get_sta_pending - (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up) -{ - struct tx_servq *ptxservq; - struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; - -_func_enter_; - -#ifdef CONFIG_RTL8711 - - if(IS_MCAST(psta->hwaddr)) - { - ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo - *ppstapending = &padapter->xmitpriv.bm_pending; - } - else -#endif - { - switch (up) - { - case 1: - case 2: - ptxservq = &(psta->sta_xmitpriv.bk_q); - *ppstapending = &padapter->xmitpriv.bk_pending; - (phwxmits+3)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); - break; - - case 4: - case 5: - ptxservq = &(psta->sta_xmitpriv.vi_q); - *ppstapending = &padapter->xmitpriv.vi_pending; - (phwxmits+1)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); - break; - - case 6: - case 7: - ptxservq = &(psta->sta_xmitpriv.vo_q); - *ppstapending = &padapter->xmitpriv.vo_pending; - (phwxmits+0)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); - break; - - case 0: - case 3: - default: - ptxservq = &(psta->sta_xmitpriv.be_q); - *ppstapending = &padapter->xmitpriv.be_pending; - (phwxmits+2)->accnt++; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); - break; - - } - - } - -_func_exit_; - - return ptxservq; -} -#endif - -/* - * Will enqueue pxmitframe to the proper queue, - * and indicate it to xx_pending list..... - */ -s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - //_irqL irqL0; - u8 ac_index; - struct sta_info *psta; - struct tx_servq *ptxservq; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct sta_priv *pstapriv = &padapter->stapriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; - sint bmcst = IS_MCAST(pattrib->ra); - sint res = _SUCCESS; - -_func_enter_; - - if (pattrib->psta) { - psta = pattrib->psta; - } else { - psta = rtw_get_stainfo(pstapriv, pattrib->ra); - } - - if (psta == NULL) { - res = _FAIL; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n")); - goto exit; - } - - ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index)); - - //_enter_critical(&pstapending->lock, &irqL0); - - if (rtw_is_list_empty(&ptxservq->tx_pending)) { - rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue)); - } - - //_enter_critical(&ptxservq->sta_pending.lock, &irqL1); - - rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending)); - ptxservq->qcnt++; - phwxmits[ac_index].accnt++; - - //_exit_critical(&ptxservq->sta_pending.lock, &irqL1); - - //_exit_critical(&pstapending->lock, &irqL0); - -exit: - -_func_exit_; - - return res; -} - -int rtw_alloc_hwxmits(_adapter *padapter) -{ - struct hw_xmit *hwxmits; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - pxmitpriv->hwxmit_entry = HWXMIT_ENTRY; - - pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry); - if (pxmitpriv->hwxmits == NULL) //Add by Yongle Lai - return -1; - - hwxmits = pxmitpriv->hwxmits; - - if(pxmitpriv->hwxmit_entry == 5) - { - //pxmitpriv->bmc_txqueue.head = 0; - //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue; - hwxmits[0] .sta_queue = &pxmitpriv->bm_pending; - - //pxmitpriv->vo_txqueue.head = 0; - //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue; - hwxmits[1] .sta_queue = &pxmitpriv->vo_pending; - - //pxmitpriv->vi_txqueue.head = 0; - //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue; - hwxmits[2] .sta_queue = &pxmitpriv->vi_pending; - - //pxmitpriv->bk_txqueue.head = 0; - //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; - hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; - - //pxmitpriv->be_txqueue.head = 0; - //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue; - hwxmits[4] .sta_queue = &pxmitpriv->be_pending; - - } - else if(pxmitpriv->hwxmit_entry == 4) - { - - //pxmitpriv->vo_txqueue.head = 0; - //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue; - hwxmits[0] .sta_queue = &pxmitpriv->vo_pending; - - //pxmitpriv->vi_txqueue.head = 0; - //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue; - hwxmits[1] .sta_queue = &pxmitpriv->vi_pending; - - //pxmitpriv->be_txqueue.head = 0; - //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue; - hwxmits[2] .sta_queue = &pxmitpriv->be_pending; - - //pxmitpriv->bk_txqueue.head = 0; - //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; - hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; - } - else - { - - - } - - return 0; -} - -void rtw_free_hwxmits(_adapter *padapter) -{ - struct hw_xmit *hwxmits; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - hwxmits = pxmitpriv->hwxmits; - if(hwxmits) - rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry)); -} - -void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry) -{ - sint i; -_func_enter_; - for(i = 0; i < entry; i++, phwxmit++) - { - //_rtw_spinlock_init(&phwxmit->xmit_lock); - //_rtw_init_listhead(&phwxmit->pending); - //phwxmit->txcmdcnt = 0; - phwxmit->accnt = 0; - } -_func_exit_; -} - -/* - * The main transmit(tx) entry - * - * Return - * 1 enqueue - * 0 success, hardware will handle this xmit frame(packet) - * <0 fail - */ -s32 rtw_xmit(_adapter *padapter, _pkt *pkt) -{ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct xmit_frame *pxmitframe = NULL; - - s32 res; - - - pxmitframe = rtw_alloc_xmitframe(pxmitpriv); - if (pxmitframe == NULL) { - RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n")); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe\n", __FUNCTION__); - #endif - return -1; - } - - res = update_attrib(padapter, pkt, &pxmitframe->attrib); - if (res == _FAIL) { - RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n")); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__); - #endif - rtw_free_xmitframe(pxmitpriv, pxmitframe); - return -1; - } - pxmitframe->pkt = pkt; - - rtw_led_control(padapter, LED_CTL_TX); - - if (padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _FALSE) - return 1; - - return 0; -} - -#ifdef CONFIG_TDLS -void process_enqueue_frame(_adapter *padapter, struct xmit_frame *pxmitframe, struct sta_info *psta) -{ - _irqL irqL; - struct sta_info *ptdls_sta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); - - //enqueue frame for TDLS sleeping STA - rtw_list_delete(&pxmitframe->list); - _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q)); - ptdls_sta->sleepq_len++; - - //indicate 4-AC queue bit in TDLS peer traffic indication - switch(pattrib->priority) - { - case 1: - case 2: - ptdls_sta->uapsd_bk = ptdls_sta->uapsd_bk | BIT(0); - break; - case 4: - case 5: - ptdls_sta->uapsd_vi = ptdls_sta->uapsd_vi | BIT(0); - break; - case 6: - case 7: - ptdls_sta->uapsd_vo = ptdls_sta->uapsd_vo | BIT(0); - break; - case 0: - case 3: - default: - ptdls_sta->uapsd_be = ptdls_sta->uapsd_be | BIT(0); - break; - } - - ptdls_sta->sleepq_ac_len++; - - _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); - -} - -sint xmit_tdls_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - sint ret=_FALSE; - - _irqL irqL; - struct sta_info *ptdls_sta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - int i; - - ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); - if(ptdls_sta==NULL){ - if(pHalData->CurrentChannel != pmlmeext->cur_channel){ - DBG_8192C("pHalData: %02x, pmlmeext: %02x ", pHalData->CurrentChannel, pmlmeext->cur_channel); - for(i=0; i<6; i++){ - DBG_8192C("%02x ", *(pattrib->dst+i)); - } - DBG_8192C("\n"); - ret = 2; //enqueue data that want to transmit via AP - } - - return ret; - }else if(ptdls_sta->state&TDLS_LINKED_STATE){ - if(ptdls_sta->state&TDLS_PEER_SLEEP_STATE) - { - process_enqueue_frame(padapter, pxmitframe, ptdls_sta); - //when sleepq_len ==1? or >=1? transmit PTI - if(ptdls_sta->sleepq_len==1) - { - //transmit TDLS PTI via AP - ptdls_sta->option=2; - _set_workitem(&ptdls_sta->option_workitem); - } - ret = _TRUE; - } - else if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ - if(!((ptdls_sta->state & TDLS_AT_OFF_CH_STATE) && (ptdls_sta->state & TDLS_PEER_AT_OFF_STATE))){ - process_enqueue_frame(padapter, pxmitframe, ptdls_sta); - ret = _TRUE; - } - } - - } - return ret; - -} -#endif - -#ifdef CONFIG_AP_MODE - -sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - _irqL irqL; - sint ret=_FALSE; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - sint bmcst = IS_MCAST(pattrib->ra); - - if(pattrib->psta) - { - psta = pattrib->psta; - } - else - { - psta=rtw_get_stainfo(pstapriv, pattrib->ra); - } - - if(psta==NULL) - return ret; - - if(pattrib->triggered==1) - { - //DBG_871X("directly xmit pspoll_triggered packet\n"); - - //pattrib->triggered=0; - - if(bmcst) - pattrib->qsel = 0x11;//HIQ - - - return ret; - } - - - if(bmcst) - { - if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode - { - //pattrib->qsel = 0x11;//HIQ - - rtw_list_delete(&pxmitframe->list); - - _enter_critical_bh(&psta->sleep_q.lock, &irqL); - - rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); - - psta->sleepq_len++; - - pstapriv->tim_bitmap |= BIT(0);// - - //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); - - update_beacon(padapter, _TIM_IE_, NULL, _FALSE);//tx bc/mc packets after upate bcn - - _exit_critical_bh(&psta->sleep_q.lock, &irqL); - - ret = _TRUE; - - } - - return ret; - - } - - - if(psta->state&WIFI_SLEEP_STATE) - { - u8 wmmps_ac=0; - - if(pstapriv->sta_dz_bitmap&BIT(psta->aid)) - { - rtw_list_delete(&pxmitframe->list); - - _enter_critical_bh(&psta->sleep_q.lock, &irqL); - - rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); - - psta->sleepq_len++; - - switch(pattrib->priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(0); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(0); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(0); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(0); - break; - } - - if(wmmps_ac) - psta->sleepq_ac_len++; - - if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac))) - { - pstapriv->tim_bitmap |= BIT(psta->aid); - - //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); - - if(psta->sleepq_len==1) - { - //DBG_871X("sleepq_len==1, update BCNTIM\n"); - //upate BCN for TIM IE - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - } - } - - _exit_critical_bh(&psta->sleep_q.lock, &irqL); - - //if(psta->sleepq_len > (NR_XMITFRAME>>3)) - //{ - // wakeup_sta_to_xmit(padapter, psta); - //} - - ret = _TRUE; - - } - - } - - return ret; - -} - -void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - u8 update_mask=0, wmmps_ac=0; - struct sta_info *psta_bmc; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - _enter_critical_bh(&psta->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&psta->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - - xmitframe_plist = get_next(xmitframe_plist); - - rtw_list_delete(&pxmitframe->list); - - switch(pxmitframe->attrib.priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(1); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(1); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(1); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(1); - break; - } - - psta->sleepq_len--; - if(psta->sleepq_len>0) - pxmitframe->attrib.mdata = 1; - else - pxmitframe->attrib.mdata = 0; - - if(wmmps_ac) - { - psta->sleepq_ac_len--; - if(psta->sleepq_ac_len>0) - { - pxmitframe->attrib.mdata = 1; - pxmitframe->attrib.eosp = 0; - } - else - { - pxmitframe->attrib.mdata = 0; - pxmitframe->attrib.eosp = 1; - } - } - - pxmitframe->attrib.triggered = 1; - - if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(padapter, pxmitframe); - } - - if(psta->sleepq_len==0) - { - pstapriv->tim_bitmap &= ~BIT(psta->aid); - - //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); - //upate BCN for TIM IE - //update_BCNTIM(padapter); - update_mask = BIT(0); - } - - } - - _exit_critical_bh(&psta->sleep_q.lock, &irqL); - - - //for BC/MC Frames - psta_bmc = rtw_get_bcmc_stainfo(padapter); - if(!psta_bmc) - return; - - if(pstapriv->sta_dz_bitmap==0x0)//no any sta in ps mode - { - _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&psta_bmc->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - - xmitframe_plist = get_next(xmitframe_plist); - - rtw_list_delete(&pxmitframe->list); - - psta_bmc->sleepq_len--; - if(psta_bmc->sleepq_len>0) - pxmitframe->attrib.mdata = 1; - else - pxmitframe->attrib.mdata = 0; - - - pxmitframe->attrib.triggered = 1; - - if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(padapter, pxmitframe); - } - - if(psta_bmc->sleepq_len==0) - { - pstapriv->tim_bitmap &= ~BIT(0); - - //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); - //upate BCN for TIM IE - //update_BCNTIM(padapter); - update_mask |= BIT(1); - } - - } - - _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); - - } - - - if(update_mask) - { - //update_BCNTIM(padapter); - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - } - -} - -void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta) -{ - _irqL irqL; - u8 wmmps_ac=0; - _list *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - _enter_critical_bh(&psta->sleep_q.lock, &irqL); - - xmitframe_phead = get_list_head(&psta->sleep_q); - xmitframe_plist = get_next(xmitframe_phead); - - while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - - xmitframe_plist = get_next(xmitframe_plist); - - switch(pxmitframe->attrib.priority) - { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk&BIT(1); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi&BIT(1); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo&BIT(1); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be&BIT(1); - break; - } - - if(!wmmps_ac) - continue; - - rtw_list_delete(&pxmitframe->list); - - psta->sleepq_len--; - psta->sleepq_ac_len--; - - if(psta->sleepq_ac_len>0) - { - pxmitframe->attrib.mdata = 1; - pxmitframe->attrib.eosp = 0; - } - else - { - pxmitframe->attrib.mdata = 0; - pxmitframe->attrib.eosp = 1; - } - - pxmitframe->attrib.triggered = 1; - - if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) - { - rtw_os_xmit_complete(padapter, pxmitframe); - } - - if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac)) - { - pstapriv->tim_bitmap &= ~BIT(psta->aid); - - //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); - //upate BCN for TIM IE - //update_BCNTIM(padapter); - update_beacon(padapter, _TIM_IE_, NULL, _FALSE); - //update_mask = BIT(0); - } - - } - - _exit_critical_bh(&psta->sleep_q.lock, &irqL); - -} - -#endif - diff --git a/drivers/net/wireless/rtl8192c/hal/hal_init.c b/drivers/net/wireless/rtl8192c/hal/hal_init.c deleted file mode 100755 index 3e54e907f6d0..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/hal_init.c +++ /dev/null @@ -1,122 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#define _HAL_INIT_C_ -#include -#include -#include -#include - -#include - -#ifdef CONFIG_SDIO_HCI - #include -#elif defined(CONFIG_USB_HCI) - #include -#endif - -void intf_chip_configure(_adapter *padapter) -{ - if(padapter->HalFunc.intf_chip_configure) - padapter->HalFunc.intf_chip_configure(padapter); -} - -void intf_read_chip_info(_adapter *padapter) -{ - if(padapter->HalFunc.read_adapter_info) - padapter->HalFunc.read_adapter_info(padapter); -} - -void intf_read_chip_version(_adapter *padapter) -{ - if(padapter->HalFunc.read_chip_version) - padapter->HalFunc.read_chip_version(padapter); -} - -void rtw_dm_init(_adapter *padapter) -{ - if(padapter->HalFunc.dm_init) - padapter->HalFunc.dm_init(padapter); -} - -void rtw_sw_led_init(_adapter *padapter) -{ - if(padapter->HalFunc.InitSwLeds) - padapter->HalFunc.InitSwLeds(padapter); -} - -void rtw_sw_led_deinit(_adapter *padapter) -{ - if(padapter->HalFunc.DeInitSwLeds) - padapter->HalFunc.DeInitSwLeds(padapter); -} - -uint rtw_hal_init(_adapter *padapter) -{ - uint status = _SUCCESS; - - padapter->hw_init_completed=_FALSE; - - padapter->bfirst_init = _TRUE; - status = padapter->HalFunc.hal_init(padapter); - - if(status == _SUCCESS){ - padapter->hw_init_completed = _TRUE; - } - else{ - padapter->hw_init_completed = _FALSE; - RT_TRACE(_module_hal_init_c_,_drv_err_,("rtw_hal_init: hal__init fail\n")); - } - padapter->bfirst_init = _FALSE; - - RT_TRACE(_module_hal_init_c_,_drv_err_,("-rtl871x_hal_init:status=0x%x\n",status)); - - return status; - -} - -uint rtw_hal_deinit(_adapter *padapter) -{ - uint status = _SUCCESS; - -_func_enter_; - - status = padapter->HalFunc.hal_deinit(padapter); - - if(status == _SUCCESS){ - padapter->hw_init_completed = _FALSE; - } - else - { - RT_TRACE(_module_hal_init_c_,_drv_err_,("\n rtw_hal_deinit: hal_init fail\n")); - } - -_func_exit_; - - return status; - -} -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM -void rtw_sreset_init(_adapter *padapter) -{ - if(padapter->HalFunc.sreset_init_value) - padapter->HalFunc.sreset_init_value(padapter); -} -#endif diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c deleted file mode 100755 index 517f2444d031..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c +++ /dev/null @@ -1,1134 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTL8192C_CMD_C_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - -#if 0 -static BOOLEAN -CheckWriteMSG( - IN PADAPTER Adapter, - IN u8 BoxNum -) -{ - u8 valHMETFR; - BOOLEAN Result = _FALSE; - - valHMETFR = rtw_read8(Adapter, REG_HMETFR); - - //DbgPrint("CheckWriteH2C(): Reg[0x%2x] = %x\n",REG_HMETFR, valHMETFR); - - if(((valHMETFR>>BoxNum)&BIT0) == 1) - Result = _TRUE; - - return Result; - -} - -static BOOLEAN CheckFwReadLastMSG( - IN PADAPTER Adapter, - IN u8 BoxNum -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 valHMETFR, valMCUTST_1; - BOOLEAN Result = _FALSE; - - valHMETFR = rtw_read8(Adapter, REG_HMETFR); - valMCUTST_1 = rtw_read8(Adapter, (REG_MCUTST_1+BoxNum)); - - //DbgPrint("REG[%x] = %x, REG[%x] = %x\n", - // REG_HMETFR, valHMETFR, REG_MCUTST_1+BoxNum, valMCUTST_1 ); - - // Do not seperate to 91C and 88C, we use the same setting. Suggested by SD4 Filen. 2009.12.03. - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - if(((valHMETFR>>BoxNum)&BIT0) == 0) - Result = _TRUE; - } - else - { - if((((valHMETFR>>BoxNum)&BIT0) == 0) && (valMCUTST_1 == 0)) - { - Result = _TRUE; - } - } - - return Result; -} -#endif - - -#define RTL92C_MAX_H2C_BOX_NUMS 4 -#define RTL92C_MAX_CMD_LEN 5 -#define MESSAGE_BOX_SIZE 4 -#define EX_MESSAGE_BOX_SIZE 2 - - -static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 isvern, u8 msgbox_num) -{ - u8 read_down = _FALSE; - int retry_cnts = 100; - - u8 valid; - -// DBG_8192C(" _is_fw_read_cmd_down ,isnormal_chip(%x),reg_1cc(%x),msg_box(%d)...\n",isvern,rtw_read8(padapter,REG_HMETFR),msgbox_num); - - do{ - valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num); - if(isvern){ - if(0 == valid ){ - read_down = _TRUE; - } - } - else{ - if((0 == valid) && (0 == rtw_read8(padapter, REG_MCUTST_1+msgbox_num))){ - read_down = _TRUE; - } - } - }while( (!read_down) && (retry_cnts--)); - - return read_down; - -} - - -/***************************************** -* H2C Msg format : -*| 31 - 8 |7 | 6 - 0 | -*| h2c_msg |Ext_bit |CMD_ID | -* -******************************************/ -void FillH2CCmd(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer) -{ -#if 1 - u8 bcmd_down = _FALSE; - int retry_cnts = 100; - u8 h2c_box_num; - u32 msgbox_addr; - u32 msgbox_ex_addr; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 isnchip =IS_NORMAL_CHIP(pHalData->VersionID); - u32 h2c_cmd = 0; - u16 h2c_cmd_ex = 0; - - _func_enter_; - - if(!pCmdBuffer){ - return ; - } - if(CmdLen > RTL92C_MAX_CMD_LEN){ - return ; - } - //pay attention to if race condition happened in H2C cmd setting. - do{ - h2c_box_num = pHalData->LastHMEBoxNum; - - if(!_is_fw_read_cmd_down(padapter, isnchip, h2c_box_num)){ - DBG_8192C(" fw read cmd failed...\n"); - break; - } - - if(CmdLen<=3) - { - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); - } - else{ - _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer, EX_MESSAGE_BOX_SIZE); - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer+2,( CmdLen-EX_MESSAGE_BOX_SIZE)); - *(u8*)(&h2c_cmd) |= BIT(7); - } - - *(u8*)(&h2c_cmd) |= ElementID; - - if(h2c_cmd & BIT(7)){ - msgbox_ex_addr = REG_HMEBOX_EXT_0 + (h2c_box_num *EX_MESSAGE_BOX_SIZE); - h2c_cmd_ex = cpu_to_le16( h2c_cmd_ex ); - rtw_write16(padapter, msgbox_ex_addr, h2c_cmd_ex); - } - msgbox_addr =REG_HMEBOX_0 + (h2c_box_num *MESSAGE_BOX_SIZE); - h2c_cmd = cpu_to_le32( h2c_cmd ); - rtw_write32(padapter,msgbox_addr, h2c_cmd); - - if(!isnchip){//for Test chip - if(! (rtw_read8(padapter, REG_HMETFR) & BIT(h2c_box_num))){ - DBG_8192C("Chip test - check fw write failed, write again..\n"); - continue; - } - // Fill H2C protection register. - rtw_write8(padapter,REG_MCUTST_1+h2c_box_num, 0xFF); - } - bcmd_down = _TRUE; - - // DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" - // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); - - pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL92C_MAX_H2C_BOX_NUMS ; - - }while((!bcmd_down) && (retry_cnts--)); -/* - if(bcmd_down) - DBG_8192C("H2C Cmd exe down. \n" ); - else - DBG_8192C("H2C Cmd exe failed. \n" ); -*/ - _func_exit_; - -#else - u8 BoxNum; - u16 BOXReg, BOXExtReg; - u8 BoxContent[4], BoxExtContent[2]; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 BufIndex=0; - u8 bWriteSucess = _FALSE; - u8 IsFwRead = _FALSE; - u8 WaitH2cLimmit = 100; - - u32 h2c_cmd = 0; - u16 h2c_cmd_ex = 0; - -_func_enter_; - - //DBG_8192C("FillH2CCmd : ElementID=%d \n",ElementID); - - while(!bWriteSucess) - { - // 2. Find the last BOX number which has been writen. - BoxNum = pHalData->LastHMEBoxNum; - switch(BoxNum) - { - case 0: - BOXReg = REG_HMEBOX_0; - BOXExtReg = REG_HMEBOX_EXT_0; - break; - case 1: - BOXReg = REG_HMEBOX_1; - BOXExtReg = REG_HMEBOX_EXT_1; - break; - case 2: - BOXReg = REG_HMEBOX_2; - BOXExtReg = REG_HMEBOX_EXT_2; - break; - case 3: - BOXReg = REG_HMEBOX_3; - BOXExtReg = REG_HMEBOX_EXT_3; - break; - default: - break; - } - - // 3. Check if the box content is empty. - IsFwRead = CheckFwReadLastMSG(padapter, BoxNum); - while(!IsFwRead) - { - //wait until Fw read - WaitH2cLimmit--; - if(WaitH2cLimmit == 0) - { - DBG_8192C("FillH2CCmd92C(): Wating too long for FW read clear HMEBox(%d)!!!\n", BoxNum); - break; - } - rtw_msleep_os(10); //us - IsFwRead = CheckFwReadLastMSG(padapter, BoxNum); - //U1btmp = PlatformEFIORead1Byte(Adapter, 0x1BF); - //RT_TRACE(COMP_CMD, DBG_LOUD, ("FillH2CCmd92C(): Wating for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n", BoxNum, U1btmp)); - } - - // If Fw has not read the last H2C cmd, break and give up this H2C. - if(!IsFwRead) - { - DBG_8192C("FillH2CCmd92C(): Write H2C register BOX[%d] fail!!!!! Fw do not read. \n", BoxNum); - break; - } - - // 4. Fill the H2C cmd into box - _rtw_memset(BoxContent, 0, sizeof(BoxContent)); - _rtw_memset(BoxExtContent, 0, sizeof(BoxExtContent)); - - BoxContent[0] = ElementID; // Fill element ID - - //DBG_8192C("FillH2CCmd92C():Write ElementID BOXReg(%4x) = %2x \n", BOXReg, ElementID); - - switch(CmdLen) - { - case 1: - { - BoxContent[0] &= ~(BIT7); - _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 1); - rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); - h2c_cmd = *((u32*)BoxContent); - break; - } - case 2: - { - BoxContent[0] &= ~(BIT7); - _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 2); - rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); - h2c_cmd = *((u32*)BoxContent); - break; - } - case 3: - { - BoxContent[0] &= ~(BIT7); - _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 3); - rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); - h2c_cmd = *((u32*)BoxContent); - break; - } - case 4: - { - BoxContent[0] |= (BIT7); - _rtw_memcpy((u8*)(BoxExtContent), pCmdBuffer+BufIndex, 2); - _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex+2, 2); - rtw_write16(padapter, BOXExtReg, *((u16*)BoxExtContent)); - rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); - h2c_cmd = *((u32*)BoxContent); - h2c_cmd_ex = *((u32*)BoxExtContent); - break; - } - case 5: - { - BoxContent[0] |= (BIT7); - _rtw_memcpy((u8*)(BoxExtContent), pCmdBuffer+BufIndex, 2); - _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex+2, 3); - rtw_write16(padapter, BOXExtReg, *((u16*)BoxExtContent)); - rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); - h2c_cmd = *((u32*)BoxContent); - h2c_cmd_ex = *((u32*)BoxExtContent); - break; - } - default: - break; - - } - - - DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" - ,pHalData->LastHMEBoxNum ,CmdLen,BOXReg,h2c_cmd,BOXExtReg,h2c_cmd_ex); - - //DBG_8192C("FillH2CCmd(): BoxExtContent=0x%x\n", *(u16*)BoxExtContent); - //DBG_8192C("FillH2CCmd(): BoxContent=0x%x\n", *(u32*)BoxContent); - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - // 5. Normal chip does not need to check if the H2C cmd has be written successfully. - bWriteSucess = _TRUE; - } - else - { - // 5. Check if the H2C cmd has be written successfully. - bWriteSucess = CheckWriteMSG(padapter, BoxNum); - if(!bWriteSucess) //If not then write again. - continue; - - //6. Fill H2C protection register. - - rtw_write8(padapter, REG_MCUTST_1+BoxNum, 0xFF); - //RT_TRACE(COMP_CMD, DBG_LOUD, ("FillH2CCmd92C():Write Reg(%4x) = 0xFF \n", REG_MCUTST_1+BoxNum)); - } - - // Record the next BoxNum - pHalData->LastHMEBoxNum = BoxNum+1; - if(pHalData->LastHMEBoxNum == 4) // loop to 0 - pHalData->LastHMEBoxNum = 0; - - //DBG_8192C("FillH2CCmd92C():pHalData->LastHMEBoxNum = %d\n", pHalData->LastHMEBoxNum); - - } - -_func_exit_; - -#endif - -} - -u8 rtl8192c_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) -{ - u8 ElementID, CmdLen; - u8 *pCmdBuffer; - struct cmd_msg_parm *pcmdmsg; - - if(!pbuf) - return H2C_PARAMETERS_ERROR; - - pcmdmsg = (struct cmd_msg_parm*)pbuf; - ElementID = pcmdmsg->eid; - CmdLen = pcmdmsg->sz; - pCmdBuffer = pcmdmsg->buf; - - FillH2CCmd(padapter, ElementID, CmdLen, pCmdBuffer); - - return H2C_SUCCESS; -} - -#if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) -u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter *padapter ,u8 bfwpoll, u16 period) -{ - u8 res=_SUCCESS; - struct H2C_SS_RFOFF_PARAM param; - DBG_8192C("==>%s bfwpoll(%x)\n",__FUNCTION__,bfwpoll); - param.gpio_period = period;//Polling GPIO_11 period time - param.ROFOn = (_TRUE == bfwpoll)?1:0; - FillH2CCmd(padapter, SELECTIVE_SUSPEND_ROF_CMD, sizeof(param), (u8*)(¶m)); - return res; -} -#endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED - -u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param) -{ - u8 res=_SUCCESS; - -_func_enter_; - - *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); - - FillH2CCmd(padapter, RSSI_SETTING_EID, 3, param); - -_func_exit_; - - return res; -} - -u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg) -{ - u8 buf[5]; - u8 res=_SUCCESS; - -_func_enter_; - - _rtw_memset(buf, 0, 5); - mask = cpu_to_le32( mask ); - _rtw_memcpy(buf, &mask, 4); - buf[4] = arg; - - FillH2CCmd(padapter, MACID_CONFIG_EID, 5, buf); - -_func_exit_; - - return res; - -} - -//bitmap[0:27] = tx_rate_bitmap -//bitmap[28:31]= Rate Adaptive id -//arg[0:4] = macid -//arg[5] = Short GI -void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - if(pHalData->fw_ractrl == _TRUE) - { - rtl8192c_set_raid_cmd(pAdapter, bitmap, arg); - } - else - { - u8 macid, init_rate, shortGIrate=_FALSE; - - init_rate = get_highest_rate_idx(bitmap&0x0fffffff)&0x3f; - - macid = arg&0x1f; - - shortGIrate = (arg&BIT(5)) ? _TRUE:_FALSE; - - if (shortGIrate==_TRUE) - init_rate |= BIT(6); - - rtw_write8(pAdapter, (REG_INIDATA_RATE_SEL+macid), (u8)init_rate); - } - -} - -void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode) -{ - SETPWRMODE_PARM H2CSetPwrMode; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - -_func_enter_; - - DBG_871X("%s(): Mode = %d, SmartPS = %d\n", __FUNCTION__,Mode,pwrpriv->smart_ps); - - H2CSetPwrMode.Mode = Mode; - - H2CSetPwrMode.SmartPS = pwrpriv->smart_ps; - - H2CSetPwrMode.BcnPassTime = 1;//pPSC->RegMaxLPSAwakeIntvl; - - FillH2CCmd(padapter, SET_PWRMODE_EID, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode); - -_func_exit_; -} - -void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 rate_len, pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - //pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_BEACON); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pktlen = sizeof (struct ieee80211_hdr_3addr); - - //timestamp will be inserted by hardware - pframe += 8; - pktlen += 8; - - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - // capability info: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - //DBG_871X("ie len=%d\n", cur_network->IELength); - pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); - _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); - - goto _ConstructBeacon; - } - - //below for ad-hoc mode - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); - - // supported rates... - rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); - - // DS parameter set - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); - - if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; - ATIMWindow = 0; - pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); - } - - - //todo: ERP IE - - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); - } - - - //todo:HT for adhoc - -_ConstructBeacon: - - if ((pktlen + TXDESC_SIZE) > 512) - { - DBG_871X("beacon frame too large\n"); - return; - } - - *pLength = pktlen; - - //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen); - -} - -void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct ieee80211_hdr *)pframe; - - // Frame control. - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - SetPwrMgt(fctrl); - SetFrameSubType(pframe, WIFI_PSPOLL); - - // AID. - SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); - - // BSSID. - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - // TA. - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - - *pLength = 16; -} - -void ConstructNullFunctionData(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bForcePowerSave) -{ - struct ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave); - - pwlanhdr = (struct ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - if (bForcePowerSave) - { - SetPwrMgt(fctrl); - } - - switch(cur_network->network.InfrastructureMode) - { - case Ndis802_11Infrastructure: - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); - break; - case Ndis802_11APMode: - SetFrDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); - break; - case Ndis802_11IBSS: - default: - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - break; - } - - SetSeqNum(pwlanhdr, 0); - - SetFrameSubType(pframe, WIFI_DATA_NULL); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pktlen = sizeof(struct ieee80211_hdr_3addr); - - *pLength = pktlen; -} - -void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) -{ - struct ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u8 *mac, *bssid; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - - - //DBG_871X("%s\n", __FUNCTION__); - - pwlanhdr = (struct ieee80211_hdr *)pframe; - - mac = myid(&(padapter->eeprompriv)); - bssid = cur_network->MacAddress; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); - - SetSeqNum(pwlanhdr, 0); - SetFrameSubType(fctrl, WIFI_PROBERSP); - - pktlen = sizeof(struct ieee80211_hdr_3addr); - pframe += pktlen; - - if(cur_network->IELength>MAX_IE_SZ) - return; - - _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); - pframe += cur_network->IELength; - pktlen += cur_network->IELength; - - *pLength = pktlen; -} - -// -// Description: In normal chip, we should send some packet to Hw which will be used by Fw -// in FW LPS mode. The function is to fill the Tx descriptor of this packets, then -// Fw can tell Hw to send these packet derectly. -// Added by tynli. 2009.10.15. -// -static VOID -FillFakeTxDescriptor92C( - IN PADAPTER Adapter, - IN u8* pDesc, - IN u32 BufferLen, - IN BOOLEAN IsPsPoll -) -{ - struct tx_desc *ptxdesc = (struct tx_desc *)pDesc; - - // Clear all status - _rtw_memset(pDesc, 0, 32); - - //offset 0 - ptxdesc->txdw0 |= cpu_to_le32( OWN | FSG | LSG); //own, bFirstSeg, bLastSeg; - - ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(BufferLen&0x0000ffff); // Buffer size + command header - - //offset 4 - ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT<txdw1 |= cpu_to_le32(NAVUSEHDR); - } - else - { - ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number - ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. - } - - //offset 16 - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - -#ifdef CONFIG_USB_HCI - // USB interface drop packet if the checksum of descriptor isn't correct. - // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). - rtl8192cu_cal_txdesc_chksum(ptxdesc); -#endif - - //RT_PRINT_DATA(COMP_CMD, DBG_TRACE, "TxFillCmdDesc8192C(): H2C Tx Cmd Content ----->\n", pDesc, TX_DESC_SIZE); -} - -// To check if reserved page content is destroyed by beacon beacuse beacon is too large. -// 2010.06.23. Added by tynli. -VOID -CheckFwRsvdPageContent( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); - u32 MaxBcnPageNum; - - if(pHalData->FwRsvdPageStartOffset != 0) - { - /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize); - RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset), - ("CheckFwRsvdPageContent(): The reserved page content has been"\ - "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!", - MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/ - } -} - -// -// Description: Fill the reserved packets that FW will use to RSVD page. -// Now we just send 4 types packet to rsvd page. -// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. -// Input: -// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw, -// so we need to set the packet length to total lengh. -// TRUE: At the second time, we should send the first packet (default:beacon) -// to Hw again and set the lengh in descriptor to the real beacon lengh. -// 2009.10.15 by tynli. -static void SetFwRsvdPagePkt(PADAPTER Adapter, BOOLEAN bDLFinished) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); - struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u32 BeaconLength, ProbeRspLength, PSPollLength, NullFunctionDataLength; - u8 *ReservedPagePacket; - u8 PageNum=0, U1bTmp, TxDescLen=0, TxDescOffset=0; - u16 BufIndex=0; - u32 TotalPacketLen; - RSVDPAGE_LOC RsvdPageLoc; - BOOLEAN bDLOK = _FALSE; - - //DBG_871X("%s\n", __FUNCTION__); - - ReservedPagePacket = (u8*)rtw_malloc(1000); - if(ReservedPagePacket == NULL){ - DBG_871X("%s(): alloc ReservedPagePacket fail !!!\n", __FUNCTION__); - return; - } - - _rtw_memset(ReservedPagePacket, 0, 1000); - - TxDescLen = 32;//TX_DESC_SIZE; - -#ifdef CONFIG_USB_HCI - BufIndex = TXDESC_OFFSET; - TxDescOffset = TxDescLen+8; //Shift index for 8 bytes because the dummy bytes in the first descipstor. -#else - BufIndex = 0; - TxDescOffset = 0; -#endif - - //(1) beacon - ConstructBeacon(Adapter,&ReservedPagePacket[BufIndex],&BeaconLength); - - //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: BCN\n", &ReservedPagePacket[BufIndex], (BeaconLength+BufIndex)); - -//-------------------------------------------------------------------- - - // When we count the first page size, we need to reserve description size for the RSVD - // packet, it will be filled in front of the packet in TXPKTBUF. - U1bTmp = (u8)PageNum_128(BeaconLength+TxDescLen); - PageNum += U1bTmp; - // To reserved 2 pages for beacon buffer. 2010.06.24. - if(PageNum == 1) - PageNum+=1; - pHalData->FwRsvdPageStartOffset = PageNum; - - BufIndex = (PageNum*128) + TxDescOffset; - - //(2) ps-poll - ConstructPSPoll(Adapter, &ReservedPagePacket[BufIndex],&PSPollLength); - - FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE); - - //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PS-POLL\n", &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen)); - - RsvdPageLoc.LocPsPoll = PageNum; - -//------------------------------------------------------------------ - - U1bTmp = (u8)PageNum_128(PSPollLength+TxDescLen); - PageNum += U1bTmp; - - BufIndex = (PageNum*128) + TxDescOffset; - - //(3) null data - ConstructNullFunctionData( - Adapter, - &ReservedPagePacket[BufIndex], - &NullFunctionDataLength, - get_my_bssid(&(pmlmeinfo->network)), - _FALSE); - - FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], NullFunctionDataLength, _FALSE); - - RsvdPageLoc.LocNullData = PageNum; - - //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: NULL DATA \n", &ReservedPagePacket[BufIndex-TxDescLen], (NullFunctionDataLength+TxDescLen)); -//------------------------------------------------------------------ - - U1bTmp = (u8)PageNum_128(NullFunctionDataLength+TxDescLen); - PageNum += U1bTmp; - - BufIndex = (PageNum*128) + TxDescOffset; - - //(4) probe response - ConstructProbeRsp( - Adapter, - &ReservedPagePacket[BufIndex], - &ProbeRspLength, - get_my_bssid(&(pmlmeinfo->network)), - _FALSE); - - FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE); - - RsvdPageLoc.LocProbeRsp = PageNum; - - //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PROBE RSP \n", &ReservedPagePacket[BufIndex-TxDescLen], (ProbeRspLength-TxDescLen)); - -//------------------------------------------------------------------ - - U1bTmp = (u8)PageNum_128(ProbeRspLength+TxDescLen); - - PageNum += U1bTmp; - - TotalPacketLen = (PageNum*128); - - if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) - { - return; - } - - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(Adapter, pattrib); - pattrib->qsel = 0x10; - pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescLen; - _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); - - Adapter->HalFunc.mgnt_xmit(Adapter, pmgntframe); - - bDLOK = _TRUE; - - if(bDLOK) - { - //DBG_871X("Set RSVD page location to Fw.\n"); - FillH2CCmd(Adapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8 *)&RsvdPageLoc); - } - - rtw_mfree(ReservedPagePacket,1000); - -} - -void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus) -{ - JOINBSSRPT_PARM JoinBssRptParm; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - -_func_enter_; - - //DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); - - if(mstatus == 1) - { - // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. - // Suggested by filen. Added by tynli. - rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); - // Do not set TSF again here or vWiFi beacon DMA INT will not work. - //correct_TSF(padapter, pmlmeext); - // Hw sequende enable by dedault. 2010.06.23. by tynli. - //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); - //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - BOOLEAN bRecover = _FALSE; - - //set REG_CR bit 8 - //U1bTmp = rtw_read8(padapter, REG_CR+1); - rtw_write8(padapter, REG_CR+1, 0x03); - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. - //SetBcnCtrlReg(padapter, 0, BIT3); - //SetBcnCtrlReg(padapter, BIT4, 0); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - if(pHalData->RegFwHwTxQCtrl&BIT6) - bRecover = _TRUE; - - // To tell Hw the packet is not a real beacon frame. - //U1bTmp = rtw_read8(padapter, REG_FWHW_TXQ_CTRL+2); - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6))); - pHalData->RegFwHwTxQCtrl &= (~BIT6); - SetFwRsvdPagePkt(padapter, 0); - - // 2010.05.11. Added by tynli. - //SetBcnCtrlReg(padapter, BIT3, 0); - //SetBcnCtrlReg(padapter, 0, BIT4); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bRecover) - { - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); - pHalData->RegFwHwTxQCtrl |= BIT6; - } - - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. - rtw_write8(padapter, REG_CR+1, 0x02); - } - } - - JoinBssRptParm.OpMode = mstatus; - - FillH2CCmd(padapter, JOINBSS_RPT_EID, sizeof(JoinBssRptParm), (u8 *)&JoinBssRptParm); - -_func_exit_; -} - -#ifdef CONFIG_P2P -void rtl8192c_set_p2p_ctw_period_cmd(_adapter* padapter, u8 ctwindow) -{ - struct P2P_PS_CTWPeriod_t p2p_ps_ctw; - - p2p_ps_ctw.CTWPeriod = ctwindow; - - FillH2CCmd(padapter, P2P_PS_CTW_CMD_EID, 1, (u8 *)(&p2p_ps_ctw)); - -} - -void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); - struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload; - u8 i; - u16 ctwindow; - u32 start_time, tsf_low; - -_func_enter_; - - switch(p2p_ps_state) - { - case P2P_PS_DISABLE: - DBG_8192C("P2P_PS_DISABLE \n"); - _rtw_memset(p2p_ps_offload, 0 ,1); - break; - case P2P_PS_ENABLE: - DBG_8192C("P2P_PS_ENABLE \n"); - // update CTWindow value. - if( pwdinfo->ctwindow > 0 ) - { - p2p_ps_offload->CTWindow_En = 1; - ctwindow = pwdinfo->ctwindow; - if(IS_HARDWARE_TYPE_8723(padapter)) - { - //rtw_write16(padapter, REG_ATIMWND, ctwindow); - } - else - { - rtl8192c_set_p2p_ctw_period_cmd(padapter, ctwindow); - } - } - - // hw only support 2 set of NoA - for( i=0 ; inoa_num ; i++) - { - // To control the register setting for which NOA - rtw_write8(padapter, 0x5CF, (i << 4)); - if(i == 0) - p2p_ps_offload->NoA0_En = 1; - else - p2p_ps_offload->NoA1_En = 1; - - // config P2P NoA Descriptor Register - rtw_write32(padapter, 0x5E0, pwdinfo->noa_duration[i]); - - rtw_write32(padapter, 0x5E4, pwdinfo->noa_interval[i]); - - //Get Current TSF value - tsf_low = rtw_read32(padapter, REG_TSFTR); - - start_time = pwdinfo->noa_start_time[i]; - if(pwdinfo->noa_count[i] != 1) - { - while( start_time <= (tsf_low+(50*1024) ) ) - { - start_time += pwdinfo->noa_interval[i]; - if(pwdinfo->noa_count[i] != 255) - pwdinfo->noa_count[i]--; - } - } - //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,start_time); - rtw_write32(padapter, 0x5E8, start_time); - - rtw_write8(padapter, 0x5EC, pwdinfo->noa_count[i]); - } - - if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) - { - // rst p2p circuit - rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); - - p2p_ps_offload->Offload_En = 1; - - if(pwdinfo->role == P2P_ROLE_GO) - { - p2p_ps_offload->role= 1; - p2p_ps_offload->AllStaSleep = 0; - } - else - { - p2p_ps_offload->role= 0; - } - - p2p_ps_offload->discovery = 0; - } - break; - case P2P_PS_SCAN: - DBG_8192C("P2P_PS_SCAN \n"); - p2p_ps_offload->discovery = 1; - break; - case P2P_PS_SCAN_DONE: - DBG_8192C("P2P_PS_SCAN_DONE \n"); - p2p_ps_offload->discovery = 0; - pwdinfo->p2p_ps = P2P_PS_ENABLE; - break; - default: - break; - } - - FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload); - -_func_exit_; - -} -#endif //CONFIG_P2P - - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c deleted file mode 100755 index 736941c64456..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c +++ /dev/null @@ -1,4687 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -//============================================================ -// Description: -// -// This file is for 92CE/92CU dynamic mechanism only -// -// -//============================================================ - -//============================================================ -// include files -//============================================================ -#include -#include -#include -#include - -#include - -//============================================================ -// Global var -//============================================================ -static u32 EDCAParam[maxAP][3] = -{ // UL DL - {0x5ea322, 0x00a630, 0x00a44f}, //atheros AP - {0x5ea32b, 0x5ea42b, 0x5e4322}, //broadcom AP - {0x3ea430, 0x00a630, 0x3ea44f}, //cisco AP - {0x5ea44f, 0x00a44f, 0x5ea42b}, //marvell AP - {0x5ea422, 0x00a44f, 0x00a44f}, //ralink AP - //{0x5ea44f, 0x5ea44f, 0x5ea44f}, //realtek AP - {0xa44f, 0x5ea44f, 0x5e431c}, //realtek AP - {0x5ea42b, 0xa630, 0x5e431c}, //airgocap AP - {0x5ea42b, 0x5ea42b, 0x5ea42b}, //unknown AP -// {0x5e4322, 0x00a44f, 0x5ea44f}, //unknown AP -}; - - -/*----------------------------------------------------------------------------- - * Function: dm_DIGInit() - * - * Overview: Set DIG scheme init value. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * - *---------------------------------------------------------------------------*/ -static void dm_DIGInit( - IN PADAPTER pAdapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - - - pDigTable->Dig_Enable_Flag = _TRUE; - pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; - - pDigTable->CurIGValue = 0x20; - pDigTable->PreIGValue = 0x0; - - pDigTable->CurSTAConnectState = pDigTable->PreSTAConnectState = DIG_STA_DISCONNECT; - pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT; - - pDigTable->RssiLowThresh = DM_DIG_THRESH_LOW; - pDigTable->RssiHighThresh = DM_DIG_THRESH_HIGH; - - pDigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW; - pDigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH; - - - pDigTable->rx_gain_range_max = DM_DIG_MAX; - pDigTable->rx_gain_range_min = DM_DIG_MIN; - - pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; - pDigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX; - pDigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN; - - pDigTable->PreCCKPDState = CCK_PD_STAGE_MAX; - pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; - - pDigTable->ForbiddenIGI = DM_DIG_MIN; - pDigTable->LargeFAHit = 0; - pDigTable->Recover_cnt = 0; - pdmpriv->DIG_Dynamic_MIN = 0x25; //for FUNAI_TV -} - - -static u8 dm_initial_gain_MinPWDB( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - int Rssi_val_min = 0; - - if((pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) && - (pDigTable->CurSTAConnectState == DIG_STA_CONNECT) ) - { - if(pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) - Rssi_val_min = (pdmpriv->EntryMinUndecoratedSmoothedPWDB > pdmpriv->UndecoratedSmoothedPWDB)? - pdmpriv->UndecoratedSmoothedPWDB:pdmpriv->EntryMinUndecoratedSmoothedPWDB; - else - Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; - } - else if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT || - pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT) - Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; - else if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) - Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - - //printk("%s CurMultiSTAConnectState(0x%02x) UndecoratedSmoothedPWDB(%d),EntryMinUndecoratedSmoothedPWDB(%d)\n" - //,__FUNCTION__,pDigTable->CurSTAConnectState, - //pdmpriv->UndecoratedSmoothedPWDB,pdmpriv->EntryMinUndecoratedSmoothedPWDB); - - return (u8)Rssi_val_min; -} - - -static VOID -dm_FalseAlarmCounterStatistics( - IN PADAPTER Adapter - ) -{ - u32 ret_value; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); - - ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter1, bMaskDWord); - FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16); - - ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter2, bMaskDWord); - FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff); - FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16); - ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter3, bMaskDWord); - FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff); - ret_value = PHY_QueryBBReg(Adapter, rOFDM0_FrameSync, bMaskDWord); - FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff); - FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16); - - FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal + - FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail+ - FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail; - - - //hold cck counter - PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, BIT(14), 1); - - ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterLower, bMaskByte0); - FalseAlmCnt->Cnt_Cck_fail = ret_value; - - ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterUpper, bMaskByte3); - FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8; - - FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Parity_Fail + - FalseAlmCnt->Cnt_Rate_Illegal + - FalseAlmCnt->Cnt_Crc8_fail + - FalseAlmCnt->Cnt_Mcs_fail + - FalseAlmCnt->Cnt_Cck_fail); - - //reset false alarm counter registers - PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 1); - PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 0); - //reset cck counter - PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 0); - //enable cck counter - PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 2); - - //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Parity_Fail = %ld, Cnt_Rate_Illegal = %ld, Cnt_Crc8_fail = %ld, Cnt_Mcs_fail = %ld\n", - // FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal, FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail) ); - //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n", - // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) ); - //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n", - // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) ); -} - - -static VOID -DM_Write_DIG( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - - //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurIGValue = 0x%lx, PreIGValue = 0x%lx, BackoffVal = %d\n", - // DM_DigTable.CurIGValue, DM_DigTable.PreIGValue, DM_DigTable.BackoffVal)); - - if (pDigTable->Dig_Enable_Flag == _FALSE) - { - //RT_TRACE( COMP_DIG, DBG_LOUD, ("DIG is disabled\n")); - pDigTable->PreIGValue = 0x17; - return; - } - - if(pDigTable->PreIGValue != pDigTable->CurIGValue) - { - // Set initial gain. - //PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pDigTable->CurIGValue); - //PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pDigTable->CurIGValue); - //printk("%s DIG(0x%02x)\n",__FUNCTION__,pDigTable->CurIGValue); - PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, 0x7f, pDigTable->CurIGValue); - PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, 0x7f, pDigTable->CurIGValue); - pDigTable->PreIGValue = pDigTable->CurIGValue; - } -} - - -static VOID -dm_CtrlInitGainByFA( - IN PADAPTER pAdapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); - - u8 value_IGI = pDigTable->CurIGValue; - - if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH0) - value_IGI --; - else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) - value_IGI += 0; - else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH2) - value_IGI ++; - else if(FalseAlmCnt->Cnt_all >= DM_DIG_FA_TH2) - value_IGI +=2; - - if(value_IGI > DM_DIG_FA_UPPER) - value_IGI = DM_DIG_FA_UPPER; - if(value_IGI < DM_DIG_FA_LOWER) - value_IGI = DM_DIG_FA_LOWER; - - if(FalseAlmCnt->Cnt_all > 10000) - value_IGI = 0x32; - - pDigTable->CurIGValue = value_IGI; - - DM_Write_DIG(pAdapter); - -} - -#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV -VOID dm_CtrlInitGainByRssi( IN PADAPTER pAdapter) -{ - - u32 isBT; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); - - //modify DIG upper bound - if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX ) - pDigTable->rx_gain_range_max = DM_DIG_MAX; - else - pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20; - - //modify DIG lower bound - if((FalseAlmCnt->Cnt_all > 500)&&(pdmpriv->DIG_Dynamic_MIN < 0x25)) - pdmpriv->DIG_Dynamic_MIN++; - if((FalseAlmCnt->Cnt_all < 500)&&(pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN)) - pdmpriv->DIG_Dynamic_MIN--; - if((pDigTable->Rssi_val_min < 8) && (pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN)) - pdmpriv->DIG_Dynamic_MIN--; - - //modify DIG lower bound, deal with abnorally large false alarm - if(FalseAlmCnt->Cnt_all > 10000) - { - //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); - pDigTable->LargeFAHit++; - if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue) - { - pDigTable->ForbiddenIGI = pDigTable->CurIGValue; - pDigTable->LargeFAHit = 1; - } - if(pDigTable->LargeFAHit >= 3) - { - if((pDigTable->ForbiddenIGI+1) >pDigTable->rx_gain_range_max) - pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max; - else - pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); - pDigTable->Recover_cnt = 3600; //3600=2hr - } - } - else - { - //Recovery mechanism for IGI lower bound - if(pDigTable->Recover_cnt != 0){ - pDigTable->Recover_cnt --; - } - else - { - if(pDigTable->LargeFAHit == 0 ) - { - if((pDigTable->ForbiddenIGI -1) < pdmpriv->DIG_Dynamic_MIN) //DM_DIG_MIN) - { - pDigTable->ForbiddenIGI = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN; - pDigTable->rx_gain_range_min = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN; - } - else - { - pDigTable->ForbiddenIGI --; - pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); - } - } - else if(pDigTable->LargeFAHit == 3 ) - { - pDigTable->LargeFAHit = 0; - } - } - } - #ifdef CONFIG_USB_HCI - if(FalseAlmCnt->Cnt_all < 250) - { -#endif - //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n"); - - isBT = rtw_read8(pAdapter, 0x4fd) & 0x01; - - if(!isBT){ - - if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh) - { - if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min) - pDigTable->BackoffVal = pDigTable->BackoffVal_range_min; - else - pDigTable->BackoffVal -= 2; - } - else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh) - { - if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max) - pDigTable->BackoffVal = pDigTable->BackoffVal_range_max; - else - pDigTable->BackoffVal +=2; - } - } - else - pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; - - pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal; - - //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal); -#ifdef CONFIG_USB_HCI - } - else - { - //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n"); - //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min); - - //Adjust initial gain by false alarm - if(FalseAlmCnt->Cnt_all > 1000) - pDigTable->CurIGValue = pDigTable ->PreIGValue+2; - else if (FalseAlmCnt->Cnt_all > 750) - pDigTable->CurIGValue = pDigTable->PreIGValue+1; - else if(FalseAlmCnt->Cnt_all < 500) - pDigTable->CurIGValue = pDigTable->PreIGValue-1; - } -#endif - - //Check initial gain by upper/lower bound - if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max) - pDigTable->CurIGValue = pDigTable->rx_gain_range_max; - - if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min) - pDigTable->CurIGValue = pDigTable->rx_gain_range_min; - - //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__, - // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min); - //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue ); - - DM_Write_DIG(pAdapter); - -} -#else -static VOID dm_CtrlInitGainByRssi(IN PADAPTER pAdapter) -{ - u32 isBT; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); - - //modify DIG upper bound - if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX ) - pDigTable->rx_gain_range_max = DM_DIG_MAX; - else - pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20; - //printk("%s Rssi_val_min(0x%02x),rx_gain_range_max(0x%02x)\n",__FUNCTION__,pDigTable->Rssi_val_min,pDigTable->rx_gain_range_max); - - //modify DIG lower bound, deal with abnorally large false alarm - if(FalseAlmCnt->Cnt_all > 10000) - { - //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); - - pDigTable->LargeFAHit++; - if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue) - { - pDigTable->ForbiddenIGI = pDigTable->CurIGValue; - pDigTable->LargeFAHit = 1; - } - - if(pDigTable->LargeFAHit >= 3) - { - if((pDigTable->ForbiddenIGI+1) > pDigTable->rx_gain_range_max) - pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max; - else - pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); - pDigTable->Recover_cnt = 3600; //3600=2hr - } - } - else - { - //Recovery mechanism for IGI lower bound - if(pDigTable->Recover_cnt != 0) - pDigTable->Recover_cnt --; - else - { - if(pDigTable->LargeFAHit == 0 ) - { - if((pDigTable->ForbiddenIGI -1) < DM_DIG_MIN) - { - pDigTable->ForbiddenIGI = DM_DIG_MIN; - pDigTable->rx_gain_range_min = DM_DIG_MIN; - } - else - { - pDigTable->ForbiddenIGI --; - pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); - } - } - else if(pDigTable->LargeFAHit == 3 ) - { - pDigTable->LargeFAHit = 0; - } - } - } - - //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.ForbiddenIGI = 0x%x, DM_DigTable.LargeFAHit = 0x%x\n",pDigTable->ForbiddenIGI, pDigTable->LargeFAHit)); - //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.rx_gain_range_max = 0x%x, DM_DigTable.rx_gain_range_min = 0x%x\n",pDigTable->rx_gain_range_max, pDigTable->rx_gain_range_min)); - -#ifdef CONFIG_USB_HCI - if(FalseAlmCnt->Cnt_all < 250) - { -#endif - //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n"); - - isBT = rtw_read8(pAdapter, 0x4fd) & 0x01; - - if(!isBT){ - - if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh) - { - if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min) - pDigTable->BackoffVal = pDigTable->BackoffVal_range_min; - else - pDigTable->BackoffVal -= 2; - } - else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh) - { - if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max) - pDigTable->BackoffVal = pDigTable->BackoffVal_range_max; - else - pDigTable->BackoffVal +=2; - } - } - else - pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; - - pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal; - - //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal); -#ifdef CONFIG_USB_HCI - } - else - { - //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n"); - //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min); - - //Adjust initial gain by false alarm - if(FalseAlmCnt->Cnt_all > 1000) - pDigTable->CurIGValue = pDigTable ->PreIGValue+2; - else if (FalseAlmCnt->Cnt_all > 750) - pDigTable->CurIGValue = pDigTable->PreIGValue+1; - else if(FalseAlmCnt->Cnt_all < 500) - pDigTable->CurIGValue = pDigTable->PreIGValue-1; - } -#endif - - //Check initial gain by upper/lower bound - if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max) - pDigTable->CurIGValue = pDigTable->rx_gain_range_max; - - if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min) - pDigTable->CurIGValue = pDigTable->rx_gain_range_min; - - //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__, - // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min); - //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue ); - - DM_Write_DIG(pAdapter); - -} -#endif - -static VOID -dm_initial_gain_Multi_STA( - IN PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - int rssi_strength = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - BOOLEAN bMulti_STA = _FALSE; - - //ADHOC and AP Mode - if(check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - bMulti_STA = _TRUE; - } - - - if((bMulti_STA == _FALSE) - || (pDigTable->CurSTAConnectState != DIG_STA_DISCONNECT)) - { - pdmpriv->binitialized = _FALSE; - pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; - return; - } - else if(pdmpriv->binitialized == _FALSE) - { - pdmpriv->binitialized = _TRUE; - pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0; - pDigTable->CurIGValue = 0x20; - DM_Write_DIG(pAdapter); - } - - // Initial gain control by ap mode - if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) - { - if ( (rssi_strength < pDigTable->RssiLowThresh) && - (pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_1)) - { - // Set to dig value to 0x20 for Luke's opinion after disable dig - if(pDigTable->Dig_Ext_Port_Stage == DIG_EXT_PORT_STAGE_2) - { - pDigTable->CurIGValue = 0x20; - DM_Write_DIG(pAdapter); - } - pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_1; - } - else if (rssi_strength > pDigTable->RssiHighThresh) - { - pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_2; - dm_CtrlInitGainByFA(pAdapter); - } - } - else if(pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_0) - { - pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0; - pDigTable->CurIGValue = 0x20; - DM_Write_DIG(pAdapter); - } - - //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurMultiSTAConnectState = %x Dig_Ext_Port_Stage %x\n", - // DM_DigTable.CurMultiSTAConnectState, DM_DigTable.Dig_Ext_Port_Stage)); -} - - -static VOID -dm_initial_gain_STA( - IN PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - - //RT_TRACE( COMP_DIG, DBG_LOUD, ("PreSTAConnectState = %x, CurSTAConnectState = %x\n", - // DM_DigTable.PreSTAConnectState, DM_DigTable.CurSTAConnectState)); - - - if(pDigTable->PreSTAConnectState == pDigTable->CurSTAConnectState|| - pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT || - pDigTable->CurSTAConnectState == DIG_STA_CONNECT) - { - // beforeconnect -> beforeconnect or connect -> connect - // (dis)connect -> beforeconnect - // disconnect -> connecct or beforeconnect -> connect - if(pDigTable->CurSTAConnectState != DIG_STA_DISCONNECT) - { - pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter); - dm_CtrlInitGainByRssi(pAdapter); - } - } - else - { - // connect -> disconnect or beforeconnect -> disconnect - pDigTable->Rssi_val_min = 0; - pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; - pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; - pDigTable->CurIGValue = 0x20; - pDigTable->PreIGValue = 0; - DM_Write_DIG(pAdapter); - } - -} - - -static void dm_CCK_PacketDetectionThresh( - IN PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - - if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT) - { - pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter); - if(pDigTable->PreCCKPDState == CCK_PD_STAGE_LowRssi) - { - if(pDigTable->Rssi_val_min <= 25) - pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; - else - pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi; - } - else{ - if(pDigTable->Rssi_val_min <= 20) - pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; - else - pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi; - } - } - else - pDigTable->CurCCKPDState=CCK_PD_STAGE_MAX; - - if(pDigTable->PreCCKPDState != pDigTable->CurCCKPDState) - { - if((pDigTable->CurCCKPDState == CCK_PD_STAGE_LowRssi)|| - (pDigTable->CurCCKPDState == CCK_PD_STAGE_MAX)) - { - PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0x83); - - //PHY_SetBBReg(pAdapter, rCCK0_System, bMaskByte1, 0x40); - //if(IS_92C_SERIAL(pHalData->VersionID)) - //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd7); - } - else - { - PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0xcd); - //PHY_SetBBReg(pAdapter,rCCK0_System, bMaskByte1, 0x47); - //if(IS_92C_SERIAL(pHalData->VersionID)) - //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd3); - } - - pDigTable->PreCCKPDState = pDigTable->CurCCKPDState; - } - - //RT_TRACE( COMP_DIG, DBG_LOUD, ("CCKPDStage=%x\n",pDigTable->CurCCKPDState)); - //RT_TRACE( COMP_DIG, DBG_LOUD, ("is92C=%x\n",IS_92C_SERIAL(pHalData->VersionID))); - -} - - -static void -dm_CtrlInitGainByTwoPort( - IN PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) - return; - - // Decide the current status and if modify initial gain or not - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) - { - pDigTable->CurSTAConnectState = DIG_STA_BEFORE_CONNECT; - } - else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - pDigTable->CurSTAConnectState = DIG_STA_CONNECT; - } - else - { - pDigTable->CurSTAConnectState = DIG_STA_DISCONNECT; - } - - - pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT; - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - if((is_IBSS_empty(pAdapter)==_FAIL) && (pAdapter->stapriv.asoc_sta_count > 2)) - pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT; - } - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - if(pAdapter->stapriv.asoc_sta_count > 2) - pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT; - } - - - dm_initial_gain_STA(pAdapter); - dm_initial_gain_Multi_STA(pAdapter); - dm_CCK_PacketDetectionThresh(pAdapter); - - pDigTable->PreSTAConnectState = pDigTable->CurSTAConnectState; - -} - - -static void dm_DIG( - IN PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - - //RTPRINT(FDM, DM_Monitor, ("dm_DIG() ==>\n")); - - if(pdmpriv->bDMInitialGainEnable == _FALSE) - return; - - //if(pDigTable->Dig_Enable_Flag == _FALSE) - // return; - - if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG)) - return; - - //RTPRINT(FDM, DM_Monitor, ("dm_DIG() progress \n")); - - dm_CtrlInitGainByTwoPort(pAdapter); - - //RTPRINT(FDM, DM_Monitor, ("dm_DIG() <==\n")); -} - -static void dm_SavePowerIndex(IN PADAPTER Adapter) -{ - u8 index; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; - - for(index = 0; index< 6; index++) - pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]); -} - -static void dm_RestorePowerIndex(IN PADAPTER Adapter) -{ - u8 index; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; - - for(index = 0; index< 6; index++) - rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]); -} - -static void dm_WritePowerIndex( - IN PADAPTER Adapter, - IN u8 Value) -{ - u8 index; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; - - for(index = 0; index< 6; index++) - rtw_write8(Adapter, Power_Index_REG[index], Value); -} - -static void dm_InitDynamicTxPower(IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - -#ifdef CONFIG_USB_HCI - if(pHalData->BoardType == BOARD_USB_High_PA) - { - dm_SavePowerIndex(Adapter); - pdmpriv->bDynamicTxPowerEnable = _TRUE; - } - else -#else - pdmpriv->bDynamicTxPowerEnable = _FALSE; -#endif - - pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal; - pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; -} - - -static void dm_DynamicTxPower(IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - int UndecoratedSmoothedPWDB; - - if(!pdmpriv->bDynamicTxPowerEnable) - return; - - // If dynamic high power is disabled. - if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_HP) ) - { - pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; - return; - } - - // STA not connected and AP not connected - if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) && - (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)) - { - //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("Not connected to any \n")); - pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; - - //the LastDTPlvl should reset when disconnect, - //otherwise the tx power level wouldn't change when disconnect and connect again. - // Maddest 20091220. - pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal; - return; - } - - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port - { - //todo: AP Mode - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) - { - UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); - } - else - { - UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB; - //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); - } - } - else // associated entry pwdb - { - UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); - } - - if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2) - { - pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2; - //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n")); - } - else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) && - (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) ) - { - pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1; - //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n")); - } - else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5)) - { - pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; - //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n")); - } - - if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) ) - { - PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel); - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal - dm_RestorePowerIndex(Adapter); - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) - dm_WritePowerIndex(Adapter, 0x14); - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) - dm_WritePowerIndex(Adapter, 0x10); - } - pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl; - -} - - -static VOID -DM_ChangeDynamicInitGainThresh( - IN PADAPTER pAdapter, - IN u32 DM_Type, - IN u32 DM_Value) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - - if (DM_Type == DIG_TYPE_THRESH_HIGH) - { - pDigTable->RssiHighThresh = DM_Value; - } - else if (DM_Type == DIG_TYPE_THRESH_LOW) - { - pDigTable->RssiLowThresh = DM_Value; - } - else if (DM_Type == DIG_TYPE_ENABLE) - { - pDigTable->Dig_Enable_Flag = _TRUE; - } - else if (DM_Type == DIG_TYPE_DISABLE) - { - pDigTable->Dig_Enable_Flag = _FALSE; - } - else if (DM_Type == DIG_TYPE_BACKOFF) - { - if(DM_Value > 30) - DM_Value = 30; - pDigTable->BackoffVal = (u8)DM_Value; - } - else if(DM_Type == DIG_TYPE_RX_GAIN_MIN) - { - if(DM_Value == 0) - DM_Value = 0x1; - pDigTable->rx_gain_range_min = (u8)DM_Value; - } - else if(DM_Type == DIG_TYPE_RX_GAIN_MAX) - { - if(DM_Value > 0x50) - DM_Value = 0x50; - pDigTable->rx_gain_range_max = (u8)DM_Value; - } -} /* DM_ChangeDynamicInitGainThresh */ - - -static VOID PWDB_Monitor( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - int i; - int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff; - u8 sta_cnt=0; - u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi - - if(check_fwstate(&Adapter->mlmepriv, _FW_LINKED) != _TRUE) - return; - - - if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - _irqL irqL; - _list *plist, *phead; - struct sta_info *psta; - struct sta_priv *pstapriv = &Adapter->stapriv; - u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff}; - - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - for(i=0; i< NUM_STA; i++) - { - phead = &(pstapriv->sta_hash[i]); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) - { - psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - - plist = get_next(plist); - - if(_rtw_memcmp(psta ->hwaddr, bcast_addr, ETH_ALEN) || - _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN)) - continue; - - if(psta->state & WIFI_ASOC_STATE) - { - - if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) - tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; - - if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) - tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; - - PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); - } - - } - - } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - - - if(pHalData->fw_ractrl == _TRUE) - { - // Report every sta's RSSI to FW - for(i=0; i< sta_cnt; i++) - { - rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]); - } - } - - } - - - - if(tmpEntryMaxPWDB != 0) // If associated entry is found - { - pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; - } - else - { - pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; - } - - if(tmpEntryMinPWDB != 0xff) // If associated entry is found - { - pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; - } - else - { - pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; - } - - - if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) - { - - if(pHalData->fw_ractrl == _TRUE) - { - u32 param = (u32)(pdmpriv->UndecoratedSmoothedPWDB<<16); - - param |= 0;//macid=0 for sta mode; - - rtl8192c_set_rssi_cmd(Adapter, (u8*)¶m); - } - } - -} - - -static void -DM_InitEdcaTurbo( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - pHalData->bCurrentTurboEDCA = _FALSE; - Adapter->recvpriv.bIsAnyNonBEPkts = _FALSE; - -} - - -static void -dm_CheckEdcaTurbo( - IN PADAPTER Adapter - ) -{ - u32 trafficIndex; - u32 edca_param; - u64 cur_tx_bytes = 0; - u64 cur_rx_bytes = 0; - u8 bbtchange = _FALSE; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); - struct recv_priv *precvpriv = &(Adapter->recvpriv); - struct registry_priv *pregpriv = &Adapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); -#endif - - - if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)) - { - goto dm_CheckEdcaTurbo_EXIT; - } - - if (pmlmeinfo->assoc_AP_vendor >= maxAP) - { - goto dm_CheckEdcaTurbo_EXIT; - } - -#ifdef CONFIG_BT_COEXIST - if(pbtpriv->BT_Coexist) - { - if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0)) - { - bbtchange = _TRUE; - } - } -#endif - - // Check if the status needs to be changed. - if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) ) - { - cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes; - cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes; - - //traffic, TX or RX - if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP)) - { - if (cur_tx_bytes > (cur_rx_bytes << 2)) - { // Uplink TP is present. - trafficIndex = UP_LINK; - } - else - { // Balance TP is present. - trafficIndex = DOWN_LINK; - } - } - else - { - if (cur_rx_bytes > (cur_tx_bytes << 2)) - { // Downlink TP is present. - trafficIndex = DOWN_LINK; - } - else - { // Balance TP is present. - trafficIndex = UP_LINK; - } - } - - if ((pdmpriv->prv_traffic_idx != trafficIndex) || (!pHalData->bCurrentTurboEDCA)) - { -#ifdef CONFIG_BT_COEXIST - if(_TRUE == bbtchange) - { - edca_param = pbtpriv->BT_EDCA[trafficIndex]; - } - else -#endif - { -#if 0 - //adjust EDCA parameter for BE queue - edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; -#else - - if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) - { - edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; - } - else - { - edca_param = EDCAParam[unknownAP][trafficIndex]; - } -#endif - } - -#ifdef CONFIG_PCI_HCI - if(IS_92C_SERIAL(pHalData->VersionID)) - { - edca_param = 0x60a42b; - } - else - { - edca_param = 0x6ea42b; - } -#endif - rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param); - - pdmpriv->prv_traffic_idx = trafficIndex; - } - - pHalData->bCurrentTurboEDCA = _TRUE; - } - else - { - // - // Turn Off EDCA turbo here. - // Restore original EDCA according to the declaration of AP. - // - if(pHalData->bCurrentTurboEDCA) - { - rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE); - pHalData->bCurrentTurboEDCA = _FALSE; - } - } - -dm_CheckEdcaTurbo_EXIT: - // Set variables for next time. - precvpriv->bIsAnyNonBEPkts = _FALSE; - pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes; - precvpriv->last_rx_bytes = precvpriv->rx_bytes; - -} - -#define DPK_DELTA_MAPPING_NUM 13 -#define index_mapping_HP_NUM 15 -//091212 chiyokolin -static VOID -dm_TXPowerTrackingCallback_ThermalMeter_92C( - IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100, ThermalValue_HP_count = 0; - u32 ThermalValue_HP = 0; - s8 delta_DPK; - int ele_A, ele_D, TempCCk, X, value32; - int Y, ele_C; - s8 OFDM_index[2], CCK_index = 0, OFDM_index_old[2], CCK_index_old = 0, delta_APK; - int i = 0, CCKSwingNeedUpdate = 0; - BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); -#if 0 -//#ifdef CONFIG_MP_INCLUDED - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; -#endif - - u8 OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur - u32 DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { - {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x01, - 0x02, 0x02, 0x03}, - {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, - 0x1f, 0x00, 0x00, 0x01, 0x02, - 0x02, 0x03, 0x03}}; - - s8 index_mapping_HP[index_mapping_HP_NUM] = { - 0, 1, 3, 4, 6, - 7, 9, 10, 12, 13, - 15, 16, 18, 19, 21 - }; - - s8 index_HP; - - pdmpriv->TXPowerTrackingCallbackCnt++; //cosa add for debug - pdmpriv->bTXPowerTrackingInit = _TRUE; - - if(pHalData->CurrentChannel == 14 && !pdmpriv->bCCKinCH14) - pdmpriv->bCCKinCH14 = _TRUE; - else if(pHalData->CurrentChannel != 14 && pdmpriv->bCCKinCH14) - pdmpriv->bCCKinCH14 = _FALSE; - - //DBG_8192C("===>dm_TXPowerTrackingCallback_ThermalMeter_92C\n"); - - ThermalValue = (u8)PHY_QueryRFReg(Adapter, RF90_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] - - //DBG_8192C("\n\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n",ThermalValue,pdmpriv->ThermalValue, pHalData->EEPROMThermalMeter); - - rtl8192c_PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); - rtl8192c_PHY_DigitalPredistortion(Adapter); - - if(is2T) - rf = 2; - else - rf = 1; - - if(ThermalValue) - { -// if(!pHalData->ThermalValue) - { - //Query OFDM path A default setting - ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; - for(i=0; ibCCKinCH14) - { - if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==_TRUE) - { - CCK_index_old =(u8)i; - //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14); - break; - } - } - else - { - if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==_TRUE) - { - CCK_index_old =(u8)i; - //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14); - break; - } - } - } - - if(!pdmpriv->ThermalValue) - { - pdmpriv->ThermalValue = pHalData->EEPROMThermalMeter; - pdmpriv->ThermalValue_LCK = ThermalValue; - pdmpriv->ThermalValue_IQK = ThermalValue; - pdmpriv->ThermalValue_DPK = pHalData->EEPROMThermalMeter; - -#ifdef CONFIG_USB_HCI - for(i = 0; i < rf; i++) - pdmpriv->OFDM_index_HP[i] = pdmpriv->OFDM_index[i] = OFDM_index_old[i]; - pdmpriv->CCK_index_HP = pdmpriv->CCK_index = CCK_index_old; -#else - for(i = 0; i < rf; i++) - pdmpriv->OFDM_index[i] = OFDM_index_old[i]; - pdmpriv->CCK_index = CCK_index_old; -#endif - } - -#ifdef CONFIG_USB_HCI - if(pHalData->BoardType == BOARD_USB_High_PA) - { - pdmpriv->ThermalValue_HP[pdmpriv->ThermalValue_HP_index] = ThermalValue; - pdmpriv->ThermalValue_HP_index++; - if(pdmpriv->ThermalValue_HP_index == HP_THERMAL_NUM) - pdmpriv->ThermalValue_HP_index = 0; - - for(i = 0; i < HP_THERMAL_NUM; i++) - { - if(pdmpriv->ThermalValue_HP[i]) - { - ThermalValue_HP += pdmpriv->ThermalValue_HP[i]; - ThermalValue_HP_count++; - } - } - - if(ThermalValue_HP_count) - ThermalValue = (u8)(ThermalValue_HP / ThermalValue_HP_count); - } -#endif - } - - delta = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); -#ifdef CONFIG_USB_HCI - if(pHalData->BoardType == BOARD_USB_High_PA) - { - if(pdmpriv->bDoneTxpower) - delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); - else - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - } - else -#endif - { - delta_HP = 0; - } - delta_LCK = (ThermalValue > pdmpriv->ThermalValue_LCK)?(ThermalValue - pdmpriv->ThermalValue_LCK):(pdmpriv->ThermalValue_LCK - ThermalValue); - delta_IQK = (ThermalValue > pdmpriv->ThermalValue_IQK)?(ThermalValue - pdmpriv->ThermalValue_IQK):(pdmpriv->ThermalValue_IQK - ThermalValue); - delta_DPK = pdmpriv->ThermalValue_DPK - ThermalValue; - - //DBG_8192C("Readback Thermal Meter = 0x%lx pre thermal meter 0x%lx EEPROMthermalmeter 0x%lx delta 0x%lx delta_LCK 0x%lx delta_IQK 0x%lx\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK); - - if(delta_LCK > 1) - { - pdmpriv->ThermalValue_LCK = ThermalValue; - rtl8192c_PHY_LCCalibrate(Adapter); - } - - if((delta > 0 || delta_HP > 0) && pdmpriv->TxPowerTrackControl) - { -#ifdef CONFIG_USB_HCI - if(pHalData->BoardType == BOARD_USB_High_PA) - { - pdmpriv->bDoneTxpower = _TRUE; - delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); - - if(delta_HP > index_mapping_HP_NUM-1) - index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; - else - index_HP = index_mapping_HP[delta_HP]; - - if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pdmpriv->OFDM_index_HP[i] - index_HP; - CCK_index = pdmpriv->CCK_index_HP -index_HP; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pdmpriv->OFDM_index_HP[i] + index_HP; - CCK_index = pdmpriv->CCK_index_HP + index_HP; - } - - delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); - - } - else -#endif - { - if(ThermalValue > pdmpriv->ThermalValue) - { - for(i = 0; i < rf; i++) - pdmpriv->OFDM_index[i] -= delta; - - pdmpriv->CCK_index -= delta; - } - else - { - for(i = 0; i < rf; i++) - pdmpriv->OFDM_index[i] += delta; - - pdmpriv->CCK_index += delta; - } - } - - /* - if(is2T) - { - DBG_8192C("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", - pdmpriv->OFDM_index[0], pdmpriv->OFDM_index[1], pdmpriv->CCK_index); - } - else - { - //DBG_8192C("temp OFDM_A_index=0x%x, CCK_index=0x%x\n",pdmpriv->OFDM_index[0], pdmpriv->CCK_index); - } - */ - - //no adjust -#ifdef CONFIG_USB_HCI - if(pHalData->BoardType != BOARD_USB_High_PA) -#endif - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pdmpriv->OFDM_index[i]+1; - CCK_index = pdmpriv->CCK_index+1; - } - else - { - for(i = 0; i < rf; i++) - OFDM_index[i] = pdmpriv->OFDM_index[i]; - CCK_index = pdmpriv->CCK_index; - } -#if 0 -//#ifdef CONFIG_MP_INCLUDED - for(i = 0; i < rf; i++) - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - OFDM_index[i] += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - OFDM_index[i] -= 1; - else - OFDM_index[i] -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - OFDM_index[i] -= 1; - } - } - - { - if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) - { - if(ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) - { - CCK_index += 1; - } - } - else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) - { - if (delta < 5) - CCK_index -= 1; - else - CCK_index -= 2; - } - else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) - { - CCK_index -= 1; - } - } -#endif - } - - for(i = 0; i < rf; i++) - { - if(OFDM_index[i] > OFDM_TABLE_SIZE-1) - OFDM_index[i] = OFDM_TABLE_SIZE-1; - else if (OFDM_index[i] < OFDM_min_index) - OFDM_index[i] = OFDM_min_index; - } - - if(CCK_index > CCK_TABLE_SIZE-1) - CCK_index = CCK_TABLE_SIZE-1; - else if (CCK_index < 0) - CCK_index = 0; - - /* - if(is2T) - { - DBG_8192C("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", OFDM_index[0], OFDM_index[1], CCK_index); - } - else - { - //DBG_8192C("new OFDM_A_index=0x%x, CCK_index=0x%x\n", OFDM_index[0], CCK_index); - } - */ - - } - - if(pdmpriv->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) - { - //Adujst OFDM Ant_A according to IQK result - ele_D = (OFDMSwingTable[(u8)OFDM_index[0]] & 0xFFC00000)>>22; - X = pdmpriv->RegE94; - Y = pdmpriv->RegE9C; - - if(X != 0) - { - if ((X & 0x00000200) != 0) - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x000003FF; - - //wirte new elements A, C, D to regC80 and regC94, element B is always 0 - value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); - - } - else - { - PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[(u8)OFDM_index[0]]); - PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); - } - - //RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); - - //Adjust CCK according to IQK result - if(!pdmpriv->bCCKinCH14){ - rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][0]); - rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][1]); - rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][2]); - rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][3]); - rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][4]); - rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][5]); - rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][6]); - rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][7]); - } - else{ - rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch14[(u8)CCK_index][0]); - rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch14[(u8)CCK_index][1]); - rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch14[(u8)CCK_index][2]); - rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch14[(u8)CCK_index][3]); - rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch14[(u8)CCK_index][4]); - rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch14[(u8)CCK_index][5]); - rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch14[(u8)CCK_index][6]); - rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch14[(u8)CCK_index][7]); - } - - if(is2T) - { - ele_D = (OFDMSwingTable[(u8)OFDM_index[1]] & 0xFFC00000)>>22; - - //new element A = element D x X - X = pdmpriv->RegEB4; - Y = pdmpriv->RegEBC; - - if(X != 0){ - if ((X & 0x00000200) != 0) //consider minus - X = X | 0xFFFFFC00; - ele_A = ((X * ele_D)>>8)&0x000003FF; - - //new element C = element D x Y - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - ele_C = ((Y * ele_D)>>8)&0x00003FF; - - //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 - value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); - - value32 = (ele_C&0x000003C0)>>6; - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); - - value32 = ((X * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); - - value32 = ((Y * ele_D)>>7)&0x01; - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); - - } - else{ - PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[(u8)OFDM_index[1]]); - PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); - PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); - } - - //DBG_8192C("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D); - } - - /* - DBG_8192C("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", \ - PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord),\ - PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), \ - PHY_QueryRFReg(Adapter, RF90_PATH_A, 0x24, bMaskDWord)); - */ - } - -#if MP_DRIVER == 1 - if(delta_IQK > 1) -#else - if(delta_IQK > 3) -#endif - { - pdmpriv->ThermalValue_IQK = ThermalValue; - rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); - } - - if(delta_DPK != 0) - { - delta_DPK = ThermalValue - pHalData->EEPROMThermalMeter; - - //if(pdmpriv->bDPPathAOK || pdmpriv->bDPPathBOK) - // DBG_8192C("TxPwrTracking delata_DPK = %d\n", delta_DPK); - - if(pdmpriv->bDPPathAOK) - PHY_SetBBReg(Adapter, 0xb68, 0x7c00, DPK_delta_mapping[0][((delta_DPK+13)/2)]); - if(pdmpriv->bDPPathBOK) - PHY_SetBBReg(Adapter, 0xb6c, 0x7c00, DPK_delta_mapping[1][((delta_DPK+13)/2)]); - pdmpriv->ThermalValue_DPK = ThermalValue; - } - - //update thermal meter value - if(pdmpriv->TxPowerTrackControl) - pdmpriv->ThermalValue = ThermalValue; - - } - - //DBG_8192C("<===dm_TXPowerTrackingCallback_ThermalMeter_92C\n"); - - pdmpriv->TXPowercount = 0; - -} - - -static VOID -dm_InitializeTXPowerTracking_ThermalMeter( - IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - //pMgntInfo->bTXPowerTracking = _TRUE; - pdmpriv->TXPowercount = 0; - pdmpriv->bTXPowerTrackingInit = _FALSE; - pdmpriv->ThermalValue = 0; - -#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default - pdmpriv->TxPowerTrackControl = _TRUE; -#endif - - //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl); -} - - -static VOID -DM_InitializeTXPowerTracking( - IN PADAPTER Adapter) -{ - dm_InitializeTXPowerTracking_ThermalMeter(Adapter); -} - -// -// Description: -// - Dispatch TxPower Tracking direct call ONLY for 92s. -// - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource -// leakage under some platform. -// -// Assumption: -// PASSIVE_LEVEL when this routine is called. -// -// Added by Roger, 2009.06.18. -// -static VOID -DM_TXPowerTracking92CDirectCall( - IN PADAPTER Adapter) -{ - dm_TXPowerTrackingCallback_ThermalMeter_92C(Adapter); -} - -static VOID -dm_CheckTXPowerTracking_ThermalMeter( - IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - //u1Byte TxPowerCheckCnt = 5; //10 sec - - //if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/) - if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_SS)) - { - return; - } - - if(!pdmpriv->TM_Trigger) //at least delay 1 sec - { - //pHalData->TxPowerCheckCnt++; //cosa add for debug - PHY_SetRFReg(Adapter, RF90_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60); - //DBG_8192C("Trigger 92C Thermal Meter!!\n"); - - pdmpriv->TM_Trigger = 1; - return; - - } - else - { - //DBG_8192C("Schedule TxPowerTracking direct call!!\n"); - DM_TXPowerTracking92CDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18. - pdmpriv->TM_Trigger = 0; - } - -} - - -VOID -rtl8192c_dm_CheckTXPowerTracking( - IN PADAPTER Adapter) -{ - dm_CheckTXPowerTracking_ThermalMeter(Adapter); -} - -#ifdef CONFIG_BT_COEXIST -static BOOLEAN BT_BTStateChange(PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - struct registry_priv *registry_par = &Adapter->registrypriv; - - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - - u32 Polling, Ratio_Tx, Ratio_PRI; - u32 BT_Tx, BT_PRI; - u8 BT_State; - static u8 ServiceTypeCnt = 0; - u8 CurServiceType; - static u8 LastServiceType = BT_Idle; - - if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) - return _FALSE; - - BT_State = rtw_read8(Adapter, 0x4fd); -/* - temp = PlatformEFIORead4Byte(Adapter, 0x488); - BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff)); - BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff)); - - temp = PlatformEFIORead4Byte(Adapter, 0x48c); - Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) + - ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff); - -*/ - BT_Tx = rtw_read32(Adapter, 0x488); - - DBG_8192C("Ratio 0x488 =%x\n", BT_Tx); - BT_Tx =BT_Tx & 0x00ffffff; - //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx)); - - BT_PRI = rtw_read32(Adapter, 0x48c); - - DBG_8192C("Ratio 0x48c =%x\n", BT_PRI); - BT_PRI =BT_PRI & 0x00ffffff; - //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI)); - - - Polling = rtw_read32(Adapter, 0x490); - //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling)); - - - if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffff && BT_State==0xff) - return _FALSE; - - BT_State &= BIT0; - - if(BT_State != pbtpriv->BT_CUR_State) - { - pbtpriv->BT_CUR_State = BT_State; - - if(registry_par->bt_sco == 3) - { - ServiceTypeCnt = 0; - - pbtpriv->BT_Service = BT_Idle; - - DBG_8192C("BT_%s\n", BT_State?"ON":"OFF"); - - BT_State = BT_State | - ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) |BIT2; - - rtw_write8(Adapter, 0x4fd, BT_State); - DBG_8192C("BT set 0x4fd to %x\n", BT_State); - } - - return _TRUE; - } - DBG_8192C("bRegBT_Sco = %d\n",registry_par->bt_sco); - - Ratio_Tx = BT_Tx*1000/Polling; - Ratio_PRI = BT_PRI*1000/Polling; - - pbtpriv->Ratio_Tx=Ratio_Tx; - pbtpriv->Ratio_PRI=Ratio_PRI; - - DBG_8192C("Ratio_Tx=%d\n", Ratio_Tx); - DBG_8192C("Ratio_PRI=%d\n", Ratio_PRI); - - - if(BT_State && registry_par->bt_sco==3) - { - DBG_8192C("bt_sco ==3 Follow Counter\n"); -// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff) -// { -// ServiceTypeCnt = 0; -// return FALSE; -// } -// else - { - /* - Ratio_Tx = BT_Tx*1000/Polling; - Ratio_PRI = BT_PRI*1000/Polling; - - pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; - pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; - - RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); - RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); - - */ - if((Ratio_Tx < 30) && (Ratio_PRI < 30)) - CurServiceType = BT_Idle; - else if((Ratio_PRI > 110) && (Ratio_PRI < 250)) - CurServiceType = BT_SCO; - else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200)) - CurServiceType = BT_Busy; - else if((Ratio_Tx >=350) && (Ratio_Tx < 500)) - CurServiceType = BT_OtherBusy; - else if(Ratio_Tx >=500) - CurServiceType = BT_PAN; - else - CurServiceType=BT_OtherAction; - } - -/* if(pHalData->bt_coexist.bStopCount) - { - ServiceTypeCnt=0; - pHalData->bt_coexist.bStopCount=FALSE; - } -*/ -// if(CurServiceType == BT_OtherBusy) - { - ServiceTypeCnt=2; - LastServiceType=CurServiceType; - } -#if 0 - else if(CurServiceType == LastServiceType) - { - if(ServiceTypeCnt<3) - ServiceTypeCnt++; - } - else - { - ServiceTypeCnt = 0; - LastServiceType = CurServiceType; - } -#endif - - if(ServiceTypeCnt==2) - { - pbtpriv->BT_Service = LastServiceType; - BT_State = BT_State | - ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) | - //((pbtpriv->BT_Service==BT_SCO)?0:BIT2); - ((pbtpriv->BT_Service!=BT_Idle)?0:BIT2); - - //if(pbtpriv->BT_Service==BT_Busy) - // BT_State&= ~(BIT2); - - if(pbtpriv->BT_Service==BT_SCO) - { - DBG_8192C("BT TYPE Set to ==> BT_SCO\n"); - } - else if(pbtpriv->BT_Service==BT_Idle) - { - DBG_8192C("BT TYPE Set to ==> BT_Idle\n"); - } - else if(pbtpriv->BT_Service==BT_OtherAction) - { - DBG_8192C("BT TYPE Set to ==> BT_OtherAction\n"); - } - else if(pbtpriv->BT_Service==BT_Busy) - { - DBG_8192C("BT TYPE Set to ==> BT_Busy\n"); - } - else if(pbtpriv->BT_Service==BT_PAN) - { - DBG_8192C("BT TYPE Set to ==> BT_PAN\n"); - } - else - { - DBG_8192C("BT TYPE Set to ==> BT_OtherBusy\n"); - } - - //Add interrupt migration when bt is not in idel state (no traffic). - //suggestion by Victor. - if(pbtpriv->BT_Service!=BT_Idle)//EDCA_VI_PARAM modify - { - - rtw_write16(Adapter, 0x504, 0x0ccc); - rtw_write8(Adapter, 0x506, 0x54); - rtw_write8(Adapter, 0x507, 0x54); - - } - else - { - rtw_write8(Adapter, 0x506, 0x00); - rtw_write8(Adapter, 0x507, 0x00); - } - - rtw_write8(Adapter, 0x4fd, BT_State); - DBG_8192C("BT_SCO set 0x4fd to %x\n", BT_State); - return _TRUE; - } - } - - return _FALSE; - -} - -static BOOLEAN -BT_WifiConnectChange( - IN PADAPTER Adapter - ) -{ - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); -// PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - static BOOLEAN bMediaConnect = _FALSE; - - //if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo)) - if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) - { - bMediaConnect = _FALSE; - } - else - { - if(!bMediaConnect) - { - bMediaConnect = _TRUE; - return _TRUE; - } - bMediaConnect = _TRUE; - } - - return _FALSE; -} - -#define BT_RSSI_STATE_NORMAL_POWER BIT0 -#define BT_RSSI_STATE_AMDPU_OFF BIT1 -#define BT_RSSI_STATE_SPECIAL_LOW BIT2 -#define BT_RSSI_STATE_BG_EDCA_LOW BIT3 - -static s32 GET_UNDECORATED_AVERAGE_RSSI(PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - s32 average_rssi; - - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) - { - average_rssi = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - } - else - { - average_rssi = pdmpriv->UndecoratedSmoothedPWDB; - } - return average_rssi; -} - -static u8 BT_RssiStateChange( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - s32 UndecoratedSmoothedPWDB; - u8 CurrBtRssiState = 0x00; - - - - - //if(pMgntInfo->bMediaConnect) // Default port - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(Adapter); - } - else // associated entry pwdb - { - if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) - UndecoratedSmoothedPWDB = 100; // No any RSSI information. Assume to be MAX. - else - UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - } - - // Check RSSI to determine HighPower/NormalPower state for BT coexistence. - if(UndecoratedSmoothedPWDB >= 67) - CurrBtRssiState &= (~BT_RSSI_STATE_NORMAL_POWER); - else if(UndecoratedSmoothedPWDB < 62) - CurrBtRssiState |= BT_RSSI_STATE_NORMAL_POWER; - - // Check RSSI to determine AMPDU setting for BT coexistence. - if(UndecoratedSmoothedPWDB >= 40) - CurrBtRssiState &= (~BT_RSSI_STATE_AMDPU_OFF); - else if(UndecoratedSmoothedPWDB <= 32) - CurrBtRssiState |= BT_RSSI_STATE_AMDPU_OFF; - - // Marked RSSI state. It will be used to determine BT coexistence setting later. - if(UndecoratedSmoothedPWDB < 35) - CurrBtRssiState |= BT_RSSI_STATE_SPECIAL_LOW; - else - CurrBtRssiState &= (~BT_RSSI_STATE_SPECIAL_LOW); - - // Check BT state related to BT_Idle in B/G mode. - if(UndecoratedSmoothedPWDB < 15) - CurrBtRssiState |= BT_RSSI_STATE_BG_EDCA_LOW; - else - CurrBtRssiState &= (~BT_RSSI_STATE_BG_EDCA_LOW); - - if(CurrBtRssiState != pbtpriv->BtRssiState) - { - pbtpriv->BtRssiState = CurrBtRssiState; - return _TRUE; - } - else - { - return _FALSE; - } -} - -static void dm_BTCoexist(PADAPTER Adapter ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct mlme_ext_info *pmlmeinfo = &Adapter->mlmeextpriv.mlmext_info; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - //PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo); - - //PRX_TS_RECORD pRxTs = NULL; - u8 BT_gpio_mux; - - BOOLEAN bWifiConnectChange, bBtStateChange,bRssiStateChange; - - if(pbtpriv->bCOBT == _FALSE) return; - - if(!( pdmpriv->DMFlag & DYNAMIC_FUNC_BT)) return; - - if( (pbtpriv->BT_Coexist) &&(pbtpriv->BT_CoexistType == BT_CSR_BC4) && (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE) ) - { - bWifiConnectChange = BT_WifiConnectChange(Adapter); - bBtStateChange = BT_BTStateChange(Adapter); - bRssiStateChange = BT_RssiStateChange(Adapter); - - DBG_8192C("bWifiConnectChange %d, bBtStateChange %d,bRssiStateChange %d\n", - bWifiConnectChange,bBtStateChange,bRssiStateChange); - - // add by hpfan for debug message - BT_gpio_mux = rtw_read8(Adapter, REG_GPIO_MUXCFG); - DBG_8192C("BTCoexit Reg_0x40 (%2x)\n", BT_gpio_mux); - - if( bWifiConnectChange ||bBtStateChange ||bRssiStateChange ) - { - if(pbtpriv->BT_CUR_State) - { - - // Do not allow receiving A-MPDU aggregation. - if(pbtpriv->BT_Ampdu)// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. - { - - if(pmlmeinfo->assoc_AP_vendor == ciscoAP) - { - if(pbtpriv->BT_Service!=BT_Idle) - { - if(pmlmeinfo->bAcceptAddbaReq) - { - DBG_8192C("BT_Disallow AMPDU \n"); - pmlmeinfo->bAcceptAddbaReq = _FALSE; - send_delba(Adapter,0, get_my_bssid(&(pmlmeinfo->network))); - } - } - else - { - if(!pmlmeinfo->bAcceptAddbaReq) - { - DBG_8192C("BT_Allow AMPDU RSSI >=40\n"); - pmlmeinfo->bAcceptAddbaReq = _TRUE; - } - } - } - else - { - if(!pmlmeinfo->bAcceptAddbaReq) - { - DBG_8192C("BT_Allow AMPDU BT Idle\n"); - pmlmeinfo->bAcceptAddbaReq = _TRUE; - } - } - } - -#if 0 - else if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy)) - { - if(pHalData->bt_coexist.BtRssiState & BT_RSSI_STATE_AMDPU_OFF) - { - if(pMgntInfo->bBT_Ampdu && pHTInfo->bAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n")); - pHTInfo->bAcceptAddbaReq = FALSE; - if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE)) - TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR); - } - } - else - { - if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n")); - pHTInfo->bAcceptAddbaReq = TRUE; - } - } - } - else - { - if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n")); - pHTInfo->bAcceptAddbaReq = TRUE; - } - } -#endif - - if(pbtpriv->BT_Ant_isolation) - { - DBG_8192C("BT_IsolationLow\n"); - -// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3. -#if 0 - RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); - if(pMgntInfo->bUseRAMask) - { - // 20100407 Joseph: Fix rate adaptive modification for BT coexist. - // This fix is not complete yet. It shall also consider VWifi and Adhoc case, - // which connect with multiple STAs. - Adapter->HalFunc.UpdateHalRAMaskHandler( - Adapter, - FALSE, - 0, - NULL, - NULL, - pMgntInfo->RateAdaptive.RATRState, - RAMask_Normal); - } - else - { - Adapter->HalFunc.UpdateHalRATRTableHandler( - Adapter, - &pMgntInfo->dot11OperationalRateSet, - pMgntInfo->dot11HTOperationalRateSet,NULL); - } -#endif - - // 20100415 Joseph: Modify BT coexist mechanism suggested by Yaying. - // Now we only enable HW BT coexist when BT in "Busy" state. - if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20) - { - if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && - pbtpriv->BT_Service==BT_OtherAction) - { - DBG_8192C("BT_Turn ON Coexist\n"); - rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); - } - else - { - if((pbtpriv->BT_Service==BT_Busy) && - (pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER)) - { - DBG_8192C("BT_Turn ON Coexist\n"); - rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); - } - else if((pbtpriv->BT_Service==BT_OtherAction) && - (pbtpriv->BtRssiState & BT_RSSI_STATE_SPECIAL_LOW)) - { - DBG_8192C("BT_Turn ON Coexist\n"); - rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); - } - else if(pbtpriv->BT_Service==BT_PAN) - { - DBG_8192C("BT_Turn ON Coexist\n"); - rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); - } - else - { - DBG_8192C("BT_Turn OFF Coexist\n"); - rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); - } - } - } - else - { - DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist\n"); - rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); - } - - if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20) - { - if(pbtpriv->BT_Service==BT_PAN) - { - DBG_8192C("BT_Turn ON Coexist(Reg0x44 = 0x10100)\n"); - rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x10100); - } - else - { - DBG_8192C("BT_Turn OFF Coexist(Reg0x44 = 0x0)\n"); - rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0); - } - } - else - { - DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist(Reg0x44 = 0x0)\n"); - rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0); - } - - // 20100430 Joseph: Integrate the BT coexistence EDCA tuning here. - if(pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER) - { - if(pbtpriv->BT_Service==BT_OtherBusy) - { - //pbtpriv->BtEdcaUL = 0x5ea72b; - //pbtpriv->BtEdcaDL = 0x5ea72b; - pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72b; - pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72b; - - DBG_8192C("BT in BT_OtherBusy state Tx (%d) >350 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx ,REG_EDCA_BE_PARAM, 0x5ea72b); - } - else if(pbtpriv->BT_Service==BT_Busy) - { - //pbtpriv->BtEdcaUL = 0x5eb82f; - //pbtpriv->BtEdcaDL = 0x5eb82f; - - pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82f; - pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82f; - - DBG_8192C("BT in BT_Busy state parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82f); - } - else if(pbtpriv->BT_Service==BT_SCO) - { - if(pbtpriv->Ratio_Tx>160) - { - //pbtpriv->BtEdcaUL = 0x5ea72f; - //pbtpriv->BtEdcaDL = 0x5ea72f; - pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72f; - pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72f; - DBG_8192C("BT in BT_SCO state Tx (%d) >160 parameter(0x%x) = 0x%x\n",pbtpriv->Ratio_Tx, REG_EDCA_BE_PARAM, 0x5ea72f); - } - else - { - //pbtpriv->BtEdcaUL = 0x5ea32b; - //pbtpriv->BtEdcaDL = 0x5ea42b; - - pbtpriv->BT_EDCA[UP_LINK] = 0x5ea32b; - pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea42b; - - DBG_8192C("BT in BT_SCO state Tx (%d) <160 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx,REG_EDCA_BE_PARAM, 0x5ea32f); - } - } - else - { - // BT coexistence mechanism does not control EDCA parameter. - //pbtpriv->BtEdcaUL = 0; - //pbtpriv->BtEdcaDL = 0; - - pbtpriv->BT_EDCA[UP_LINK] = 0; - pbtpriv->BT_EDCA[DOWN_LINK] = 0; - DBG_8192C("BT in State %d and parameter(0x%x) use original setting.\n",pbtpriv->BT_Service, REG_EDCA_BE_PARAM); - } - - if((pbtpriv->BT_Service!=BT_Idle) && - (pmlmeext->cur_wireless_mode == WIRELESS_MODE_G) && - (pbtpriv->BtRssiState & BT_RSSI_STATE_BG_EDCA_LOW)) - { - //pbtpriv->BtEdcaUL = 0x5eb82b; - //pbtpriv->BtEdcaDL = 0x5eb82b; - - pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82b; - pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82b; - - DBG_8192C("BT set parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82b); - } - } - else - { - // BT coexistence mechanism does not control EDCA parameter. - //pbtpriv->BtEdcaUL = 0; - //pbtpriv->BtEdcaDL = 0; - - pbtpriv->BT_EDCA[UP_LINK] = 0; - pbtpriv->BT_EDCA[DOWN_LINK] = 0; - } - - // 20100415 Joseph: Set RF register 0x1E and 0x1F for BT coexist suggested by Yaying. - if(pbtpriv->BT_Service!=BT_Idle) - { - DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf); - PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, 0xf); - //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf)); - //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, 0xf); - } - else - { - DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n",pbtpriv->BtRfRegOrigin1E); - PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E); - //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F)); - //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F); - } - } - else - { - DBG_8192C("BT_IsolationHigh\n"); - // Do nothing. - } - } - else - { - - if(pbtpriv->BT_Ampdu && !pmlmeinfo->bAcceptAddbaReq) - { - DBG_8192C("BT_Allow AMPDU bt is off\n"); - pmlmeinfo->bAcceptAddbaReq = _TRUE; - } - - DBG_8192C("BT_Turn OFF Coexist bt is off \n"); - rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); - - DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", pbtpriv->BtRfRegOrigin1E); - PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E); - //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F)); - //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F); - - // BT coexistence mechanism does not control EDCA parameter since BT is disabled. - //pbtpriv->BtEdcaUL = 0; - //pbtpriv->BtEdcaDL = 0; - pbtpriv->BT_EDCA[UP_LINK] = 0; - pbtpriv->BT_EDCA[DOWN_LINK] = 0; - - -// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3. -#if 0 - RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); - if(pMgntInfo->bUseRAMask) - { - // 20100407 Joseph: Fix rate adaptive modification for BT coexist. - // This fix is not complete yet. It shall also consider VWifi and Adhoc case, - // which connect with multiple STAs. - Adapter->HalFunc.UpdateHalRAMaskHandler( - Adapter, - FALSE, - 0, - NULL, - NULL, - pMgntInfo->RateAdaptive.RATRState, - RAMask_Normal); - } - else - { - Adapter->HalFunc.UpdateHalRATRTableHandler( - Adapter, - &pMgntInfo->dot11OperationalRateSet, - pMgntInfo->dot11HTOperationalRateSet,NULL); - } -#endif - } - } - } -} - -static void dm_InitBtCoexistDM( PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - - if( !pbtpriv->BT_Coexist ) return; - - pbtpriv->BtRfRegOrigin1E = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1e, 0xf0); - pbtpriv->BtRfRegOrigin1F = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1f, 0xf0); -} - -void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - - pbtpriv->bCOBT = bStart; - send_delba(padapter,0, get_my_bssid(&(pmlmeinfo->network))); - send_delba(padapter,1, get_my_bssid(&(pmlmeinfo->network))); - -} - -void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir) -{ - struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - DBG_8192C("issue_delete_ba : %s...\n",(dir==0)?"RX_DIR":"TX_DIR"); - send_delba(padapter,dir, get_my_bssid(&(pmlmeinfo->network))); -} - -#endif - -#if 0//def CONFIG_PCI_HCI - -BOOLEAN -BT_BTStateChange( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - - u4Byte temp, Polling, Ratio_Tx, Ratio_PRI; - u4Byte BT_Tx, BT_PRI; - u1Byte BT_State; - static u1Byte ServiceTypeCnt = 0; - u1Byte CurServiceType; - static u1Byte LastServiceType = BT_Idle; - - if(!pMgntInfo->bMediaConnect) - return FALSE; - - BT_State = PlatformEFIORead1Byte(Adapter, 0x4fd); -/* - temp = PlatformEFIORead4Byte(Adapter, 0x488); - BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff)); - BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff)); - - temp = PlatformEFIORead4Byte(Adapter, 0x48c); - Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) + - ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff); - -*/ - BT_Tx = PlatformEFIORead4Byte(Adapter, 0x488); - - RTPRINT(FBT, BT_TRACE, ("Ratio 0x488 =%x\n", BT_Tx)); - BT_Tx =BT_Tx & 0x00ffffff; - //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx)); - - BT_PRI = PlatformEFIORead4Byte(Adapter, 0x48c); - - RTPRINT(FBT, BT_TRACE, ("Ratio Ratio 0x48c =%x\n", BT_PRI)); - BT_PRI =BT_PRI & 0x00ffffff; - //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI)); - - - Polling = PlatformEFIORead4Byte(Adapter, 0x490); - //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling)); - - - if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffffff && BT_State==0xff) - return FALSE; - - BT_State &= BIT0; - - if(BT_State != pHalData->bt_coexist.BT_CUR_State) - { - pHalData->bt_coexist.BT_CUR_State = BT_State; - - if(pMgntInfo->bRegBT_Sco == 3) - { - ServiceTypeCnt = 0; - - pHalData->bt_coexist.BT_Service = BT_Idle; - - RTPRINT(FBT, BT_TRACE, ("BT_%s\n", BT_State?"ON":"OFF")); - - BT_State = BT_State | - ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) |BIT2; - - PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State); - RTPRINT(FBT, BT_TRACE, ("BT set 0x4fd to %x\n", BT_State)); - } - - return TRUE; - } - RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco %d\n", pMgntInfo->bRegBT_Sco)); - - Ratio_Tx = BT_Tx*1000/Polling; - Ratio_PRI = BT_PRI*1000/Polling; - - pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; - pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; - - RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); - RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); - - - if(BT_State && pMgntInfo->bRegBT_Sco==3) - { - RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco ==3 Follow Counter\n")); -// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff) -// { -// ServiceTypeCnt = 0; -// return FALSE; -// } -// else - { - /* - Ratio_Tx = BT_Tx*1000/Polling; - Ratio_PRI = BT_PRI*1000/Polling; - - pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; - pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; - - RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); - RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); - - */ - if((Ratio_Tx <= 50) && (Ratio_PRI <= 50)) - CurServiceType = BT_Idle; - else if((Ratio_PRI > 150) && (Ratio_PRI < 200)) - CurServiceType = BT_SCO; - else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200)) - CurServiceType = BT_Busy; - else if(Ratio_Tx >= 350) - CurServiceType = BT_OtherBusy; - else - CurServiceType=BT_OtherAction; - - } -/* if(pHalData->bt_coexist.bStopCount) - { - ServiceTypeCnt=0; - pHalData->bt_coexist.bStopCount=FALSE; - } -*/ - if(CurServiceType == BT_OtherBusy) - { - ServiceTypeCnt=2; - LastServiceType=CurServiceType; - } - else if(CurServiceType == LastServiceType) - { - if(ServiceTypeCnt<3) - ServiceTypeCnt++; - } - else - { - ServiceTypeCnt = 0; - LastServiceType = CurServiceType; - } - - if(ServiceTypeCnt==2) - { - pHalData->bt_coexist.BT_Service = LastServiceType; - BT_State = BT_State | - ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) | - ((pHalData->bt_coexist.BT_Service==BT_SCO)?0:BIT2); - - if(pHalData->bt_coexist.BT_Service==BT_Busy) - BT_State&= ~(BIT2); - - if(pHalData->bt_coexist.BT_Service==BT_SCO) - { - RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_SCO\n")); - } - else if(pHalData->bt_coexist.BT_Service==BT_Idle) - { - RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Idle\n")); - } - else if(pHalData->bt_coexist.BT_Service==BT_OtherAction) - { - RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherAction\n")); - } - else if(pHalData->bt_coexist.BT_Service==BT_Busy) - { - RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Busy\n")); - } - else - { - RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherBusy\n")); - } - - //Add interrupt migration when bt is not in idel state (no traffic). - //suggestion by Victor. - if(pHalData->bt_coexist.BT_Service!=BT_Idle) - { - - PlatformEFIOWrite2Byte(Adapter, 0x504, 0x0ccc); - PlatformEFIOWrite1Byte(Adapter, 0x506, 0x54); - PlatformEFIOWrite1Byte(Adapter, 0x507, 0x54); - - } - else - { - PlatformEFIOWrite1Byte(Adapter, 0x506, 0x00); - PlatformEFIOWrite1Byte(Adapter, 0x507, 0x00); - } - - PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State); - RTPRINT(FBT, BT_TRACE, ("BT_SCO set 0x4fd to %x\n", BT_State)); - return TRUE; - } - } - - return FALSE; - -} - -BOOLEAN -BT_WifiConnectChange( - IN PADAPTER Adapter - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - static BOOLEAN bMediaConnect = FALSE; - - if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo)) - { - bMediaConnect = FALSE; - } - else - { - if(!bMediaConnect) - { - bMediaConnect = TRUE; - return TRUE; - } - bMediaConnect = TRUE; - } - - return FALSE; -} - -BOOLEAN -BT_RSSIChangeWithAMPDU( - IN PADAPTER Adapter - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(!Adapter->pNdisCommon->bRegBT_Ampdu || !Adapter->pNdisCommon->bRegAcceptAddbaReq) - return FALSE; - - RTPRINT(FBT, BT_TRACE, ("RSSI is %d\n",pHalData->UndecoratedSmoothedPWDB)); - - if((pHalData->UndecoratedSmoothedPWDB<=32) && pMgntInfo->pHTInfo->bAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32 Need change\n")); - return TRUE; - - } - else if((pHalData->UndecoratedSmoothedPWDB>=40) && !pMgntInfo->pHTInfo->bAcceptAddbaReq ) - { - RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40, Need change\n")); - return TRUE; - } - else - return FALSE; - -} - - -VOID -dm_BTCoexist( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - static u1Byte LastTxPowerLvl = 0xff; - PRX_TS_RECORD pRxTs = NULL; - - BOOLEAN bWifiConnectChange, bBtStateChange,bRSSIChangeWithAMPDU; - - if( (pHalData->bt_coexist.BluetoothCoexist) && - (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) && - (!ACTING_AS_AP(Adapter)) ) - { - bWifiConnectChange = BT_WifiConnectChange(Adapter); - bBtStateChange = BT_BTStateChange(Adapter); - bRSSIChangeWithAMPDU = BT_RSSIChangeWithAMPDU(Adapter); - RTPRINT(FBT, BT_TRACE, ("bWifiConnectChange %d, bBtStateChange %d,LastTxPowerLvl %x, DynamicTxHighPowerLvl %x\n", - bWifiConnectChange,bBtStateChange,LastTxPowerLvl,pHalData->DynamicTxHighPowerLvl)); - if( bWifiConnectChange ||bBtStateChange || - (LastTxPowerLvl != pHalData->DynamicTxHighPowerLvl) ||bRSSIChangeWithAMPDU) - { - LastTxPowerLvl = pHalData->DynamicTxHighPowerLvl; - - if(pHalData->bt_coexist.BT_CUR_State) - { - // Do not allow receiving A-MPDU aggregation. - if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy)) - { - if(pHalData->UndecoratedSmoothedPWDB<=32) - { - if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n")); - pMgntInfo->pHTInfo->bAcceptAddbaReq = FALSE; - if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE)) - TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR); - } - } - else if(pHalData->UndecoratedSmoothedPWDB>=40) - { - if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n")); - pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; - } - } - } - else - { - if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n")); - pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; - } - } - - if(pHalData->bt_coexist.BT_Ant_isolation) - { - RTPRINT(FBT, BT_TRACE, ("BT_IsolationLow\n")); - RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); - Adapter->HalFunc.UpdateHalRATRTableHandler( - Adapter, - &pMgntInfo->dot11OperationalRateSet, - pMgntInfo->dot11HTOperationalRateSet,NULL); - - if(pHalData->bt_coexist.BT_Service==BT_SCO) - { - - RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist with SCO \n")); - PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); - } - else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) - { - RTPRINT(FBT, BT_TRACE, ("BT_Turn ON Coexist\n")); - PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0xb4); - } - else - { - RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist\n")); - PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); - } - } - else - { - RTPRINT(FBT, BT_TRACE, ("BT_IsolationHigh\n")); - // Do nothing. - } - } - else - { - if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) - { - RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU bt is off\n")); - pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; - } - - RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist bt is off \n")); - PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); - - RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); - Adapter->HalFunc.UpdateHalRATRTableHandler( - Adapter, - &pMgntInfo->dot11OperationalRateSet, - pMgntInfo->dot11HTOperationalRateSet,NULL); - } - } - } -} -#endif - - -/*----------------------------------------------------------------------------- - * Function: dm_CheckRfCtrlGPIO() - * - * Overview: Copy 8187B template for 9xseries. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/10/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -static VOID -dm_CheckRfCtrlGPIO( - IN PADAPTER Adapter - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); -#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) - #ifdef CONFIG_USB_HCI - // 2010/08/12 MH Add for CU selective suspend. - PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(Adapter); - #else - PRT_SDIO_DEVICE pDevice = GET_RT_SDIO_DEVICE(Adapter); - #endif -#endif - - if(!Adapter->MgntInfo.PowerSaveControl.bGpioRfSw) - return; - - RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n")); - -#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) - // Walk around for DTM test, we will not enable HW - radio on/off because r/w - // page 1 register before Lextra bus is enabled cause system fails when resuming - // from S4. 20080218, Emily - if(Adapter->bInHctTest) - return; - -//#if ((HAL_CODE_BASE == RTL8192_S) ) - //Adapter->HalFunc.GPIOChangeRFHandler(Adapter, GPIORF_POLLING); -//#else - // 2010/07/27 MH Only Minicard and support selective suspend, we can not turn off all MAC power to - // stop 8051. For dongle and minicard, we both support selective suspend mode. - //if(pDevice->RegUsbSS && Adapter->HalFunc.GetInterfaceSelectionHandler(Adapter) == INTF_SEL2_MINICARD) - - // - // 2010/08/12 MH We support severl power consumption combination as below. - // - // Power consumption combination - // SS Enable: (LPS disable + IPS + SW/HW radio off) - // 1. Dongle + PDN (support HW radio off) - // 2. Dongle + Normal (No HW radio off) - // 3. MiniCard + PDN (support HW radio off) - // 4. MiniCard + Normal (support HW radio off) - // - // SS Disable: (LPS + IPS + SW/HW radio off) - // 1. Dongle + PDN (support HW radio off) - // 2. Dongle + Normal (No HW radio off) - // 3. MiniCard + PDN (support HW radio off) - // 4. MiniCard + Normal (support HW radio off) - // - // For Power down module detection. We need to read power register no matter - // dongle or minicard, we will add the item is the detection method. - // - // - //vivi add du case - if ((IS_HARDWARE_TYPE_8192CU(Adapter)||IS_HARDWARE_TYPE_8192DU(Adapter)) - && pDevice->RegUsbSS) - { - RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Enabled\n")); - if (SUPPORT_HW_RADIO_DETECT(Adapter)) - { // Support HW radio detection - RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n")); - GpioDetectTimerStart(Adapter); - } - else - { // Dongle does not support HW radio detection.?? In the fufure?? - RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n")); - } - } - else if (IS_HARDWARE_TYPE_8192CU(Adapter) || - IS_HARDWARE_TYPE_8723U(Adapter)|| - IS_HARDWARE_TYPE_8192DU(Adapter) || - IS_HARDWARE_TYPE_8723S(Adapter)) - { // Not support Selective suspend - RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Disable\n")); - if (SUPPORT_HW_RADIO_DETECT(Adapter)) - { - RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n")); - PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); - } - else - { - RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n")); - } - } - else - { // CE only support noemal HW radio detection now. Support timers GPIO detection in SE/CU. - PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); - } -//#endif -#else if defined CONFIG_PCI_HCI - if(Adapter->bInHctTest) - return; - - // CE only support noemal HW radio detection now. We support timers GPIO detection in SE. - PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); -#endif -#endif -} /* dm_CheckRfCtrlGPIO */ - -static VOID -dm_InitRateAdaptiveMask( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pdmpriv->RateAdaptive; - - pRA->RATRState = DM_RATR_STA_INIT; - pRA->PreRATRState = DM_RATR_STA_INIT; - - if (pdmpriv->DM_Type == DM_Type_ByDriver) - pdmpriv->bUseRAMask = _TRUE; - else - pdmpriv->bUseRAMask = _FALSE; -} - -/*----------------------------------------------------------------------------- - * Function: dm_RefreshRateAdaptiveMask() - * - * Overview: Update rate table mask according to rssi - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 05/27/2009 hpfan Create Version 0. - * - *---------------------------------------------------------------------------*/ -static VOID -dm_RefreshRateAdaptiveMask( IN PADAPTER pAdapter) -{ -#if 0 - PADAPTER pTargetAdapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PMGNT_INFO pMgntInfo = &(ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, TRUE)->MgntInfo); - PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pMgntInfo->RateAdaptive; - u4Byte LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0; - - if(pAdapter->bDriverStopped) - { - RT_TRACE(COMP_RATR, DBG_TRACE, ("<---- dm_RefreshRateAdaptiveMask(): driver is going to unload\n")); - return; - } - - if(!pMgntInfo->bUseRAMask) - { - RT_TRACE(COMP_RATR, DBG_LOUD, ("<---- dm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n")); - return; - } - - // if default port is connected, update RA table for default port (infrastructure mode only) - if(pAdapter->MgntInfo.mAssoc && (!ACTING_AS_AP(pAdapter))) - { - - // decide rastate according to rssi - switch (pRA->PreRATRState) - { - case DM_RATR_STA_HIGH: - HighRSSIThreshForRA = 50; - LowRSSIThreshForRA = 20; - break; - - case DM_RATR_STA_MIDDLE: - HighRSSIThreshForRA = 55; - LowRSSIThreshForRA = 20; - break; - - case DM_RATR_STA_LOW: - HighRSSIThreshForRA = 50; - LowRSSIThreshForRA = 25; - break; - - default: - HighRSSIThreshForRA = 50; - LowRSSIThreshForRA = 20; - break; - } - - if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA) - pRA->RATRState = DM_RATR_STA_HIGH; - else if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA) - pRA->RATRState = DM_RATR_STA_MIDDLE; - else - pRA->RATRState = DM_RATR_STA_LOW; - - if(pRA->PreRATRState != pRA->RATRState) - { - RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid); - RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pHalData->UndecoratedSmoothedPWDB)); - RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pRA->RATRState)); - RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pRA->PreRATRState, pRA->RATRState)); - pAdapter->HalFunc.UpdateHalRAMaskHandler( - pAdapter, - FALSE, - 0, - NULL, - NULL, - pRA->RATRState); - pRA->PreRATRState = pRA->RATRState; - } - } - - // - // The following part configure AP/VWifi/IBSS rate adaptive mask. - // - if(ACTING_AS_AP(pAdapter) || ACTING_AS_IBSS(pAdapter)) - { - pTargetAdapter = pAdapter; - } - else - { - pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, FALSE); - if(!ACTING_AS_AP(pTargetAdapter)) - pTargetAdapter = NULL; - } - - // if extension port (softap) is started, updaet RA table for more than one clients associate - if(pTargetAdapter != NULL) - { - int i; - PRT_WLAN_STA pEntry; - PRATE_ADAPTIVE pEntryRA; - - for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++) - { - if( pTargetAdapter->MgntInfo.AsocEntry[i].bUsed && pTargetAdapter->MgntInfo.AsocEntry[i].bAssociated) - { - pEntry = pTargetAdapter->MgntInfo.AsocEntry+i; - pEntryRA = &pEntry->RateAdaptive; - - switch (pEntryRA->PreRATRState) - { - case DM_RATR_STA_HIGH: - { - HighRSSIThreshForRA = 50; - LowRSSIThreshForRA = 20; - } - break; - - case DM_RATR_STA_MIDDLE: - { - HighRSSIThreshForRA = 55; - LowRSSIThreshForRA = 20; - } - break; - - case DM_RATR_STA_LOW: - { - HighRSSIThreshForRA = 50; - LowRSSIThreshForRA = 25; - } - break; - - default: - { - HighRSSIThreshForRA = 50; - LowRSSIThreshForRA = 20; - } - } - - if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA) - pEntryRA->RATRState = DM_RATR_STA_HIGH; - else if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA) - pEntryRA->RATRState = DM_RATR_STA_MIDDLE; - else - pEntryRA->RATRState = DM_RATR_STA_LOW; - - if(pEntryRA->PreRATRState != pEntryRA->RATRState) - { - RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("AsocEntry addr : "), pEntry->MacAddr); - RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB)); - RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pEntryRA->RATRState)); - RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pEntryRA->PreRATRState, pEntryRA->RATRState)); - pAdapter->HalFunc.UpdateHalRAMaskHandler( - pTargetAdapter, - FALSE, - pEntry->AID+1, - pEntry->MacAddr, - pEntry, - pEntryRA->RATRState); - pEntryRA->PreRATRState = pEntryRA->RATRState; - } - - } - } - } -#endif -} - -static VOID -dm_CheckProtection( - IN PADAPTER Adapter - ) -{ -#if 0 - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u1Byte CurRate, RateThreshold; - - if(pMgntInfo->pHTInfo->bCurBW40MHz) - RateThreshold = MGN_MCS1; - else - RateThreshold = MGN_MCS3; - - if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) - { - pMgntInfo->bDmDisableProtect = TRUE; - DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } - else - { - pMgntInfo->bDmDisableProtect = FALSE; - DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } -#endif -} - -static VOID -dm_CheckStatistics( - IN PADAPTER Adapter - ) -{ -#if 0 - if(!Adapter->MgntInfo.bMediaConnect) - return; - - //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly. - Adapter->HalFunc.GetHwRegHandler( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) ); - - // Calculate current Tx Rate(Successful transmited!!) - - // Calculate current Rx Rate(Successful received!!) - - //for tx tx retry count - Adapter->HalFunc.GetHwRegHandler( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) ); -#endif -} - -static void dm_CheckPbcGPIO(_adapter *padapter) -{ - u8 tmp1byte; - u8 bPbcPressed = _FALSE; - - if(!padapter->registrypriv.hw_wps_pbc) - return; - -#ifdef CONFIG_USB_HCI - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); - tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode - - tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level - - tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); - tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); - rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode - - tmp1byte =rtw_read8(padapter, GPIO_IN); - - if (tmp1byte == 0xff) - return ; - -#if 0 /* NO PBC button here */ - if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT) - { - bPbcPressed = _TRUE; - } -#endif - -#else - tmp1byte = rtw_read8(padapter, GPIO_IN); - //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte)); - - if (tmp1byte == 0xff || padapter->init_adpt_in_progress) - return ; - - if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0) - { - bPbcPressed = _TRUE; - } -#endif - - if( _TRUE == bPbcPressed) - { - // Here we only set bPbcPressed to true - // After trigger PBC, the variable will be set to false - DBG_8192C("CheckPbcGPIO - PBC is pressed\n"); - -#ifdef RTK_DMP_PLATFORM -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) - kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC); -#else - kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC); -#endif -#else - - if ( padapter->pid[0] == 0 ) - { // 0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver. - return; - } - -#ifdef PLATFORM_LINUX - rtw_signal_process(padapter->pid[0], SIGUSR1); -#endif -#endif - } -} - -#ifdef CONFIG_PCI_HCI -// -// Description: -// Perform interrupt migration dynamically to reduce CPU utilization. -// -// Assumption: -// 1. Do not enable migration under WIFI test. -// -// Created by Roger, 2010.03.05. -// -VOID -dm_InterruptMigration( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bCurrentIntMt, bCurrentACIntDisable; - BOOLEAN IntMtToSet = _FALSE; - BOOLEAN ACIntToSet = _FALSE; - - - // Retrieve current interrupt migration and Tx four ACs IMR settings first. - bCurrentIntMt = pHalData->bInterruptMigration; - bCurrentACIntDisable = pHalData->bDisableTxInt; - - // - // Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics - // when interrupt migration is set before. 2010.03.05. - // - if(!Adapter->registrypriv.wifi_spec && - (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && - pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) - { - IntMtToSet = _TRUE; - - // To check whether we should disable Tx interrupt or not. - if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic ) - ACIntToSet = _TRUE; - } - - //Update current settings. - if( bCurrentIntMt != IntMtToSet ){ - DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet); - if(IntMtToSet) - { - // - // Set interrrupt migration timer and corresponging Tx/Rx counter. - // timer 25ns*0xfa0=100us for 0xf packets. - // 2010.03.05. - // - rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx - pHalData->bInterruptMigration = IntMtToSet; - } - else - { - // Reset all interrupt migration settings. - rtw_write32(Adapter, REG_INT_MIG, 0); - pHalData->bInterruptMigration = IntMtToSet; - } - } - - /*if( bCurrentACIntDisable != ACIntToSet ){ - DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet); - if(ACIntToSet) // Disable four ACs interrupts. - { - // - // Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. - // When extremely highly Rx OK occurs, we will disable Tx interrupts. - // 2010.03.05. - // - UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS ); - pHalData->bDisableTxInt = ACIntToSet; - } - else// Enable four ACs interrupts. - { - UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 ); - pHalData->bDisableTxInt = ACIntToSet; - } - }*/ - -} - -#endif - -// -// Initialize GPIO setting registers -// -static void -dm_InitGPIOSetting( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - u8 tmp1byte; - - tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); - tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); - -#ifdef CONFIG_BT_COEXIST - // UMB-B cut bug. We need to support the modification. - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && - pHalData->bt_coexist.BT_Coexist) - { - tmp1byte |= (BIT5); - } -#endif - rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); - -} - -static void update_EDCA_param(_adapter *padapter) -{ - u32 trafficIndex; - u32 edca_param; - u64 cur_tx_bytes = 0; - u64 cur_rx_bytes = 0; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct recv_priv *precvpriv = &(padapter->recvpriv); - struct registry_priv *pregpriv = &padapter->registrypriv; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - u8 bbtchange = _FALSE; -#endif - - - //DBG_871X("%s\n", __FUNCTION__); - - //associated AP - if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)) - { - return; - } - - if (pmlmeinfo->assoc_AP_vendor >= maxAP) - { - return; - } - - cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes; - cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes; - - //traffic, TX or RX - if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP)) - { - if (cur_tx_bytes > (cur_rx_bytes << 2)) - { // Uplink TP is present. - trafficIndex = UP_LINK; - } - else - { // Balance TP is present. - trafficIndex = DOWN_LINK; - } - } - else - { - if (cur_rx_bytes > (cur_tx_bytes << 2)) - { // Downlink TP is present. - trafficIndex = DOWN_LINK; - } - else - { // Balance TP is present. - trafficIndex = UP_LINK; - } - } - -#ifdef CONFIG_BT_COEXIST - if(pbtpriv->BT_Coexist) - { - if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0)) - { - bbtchange = _TRUE; - } - } -#endif - - if (pdmpriv->prv_traffic_idx != trafficIndex) - { -#if 0 -#ifdef CONFIG_BT_COEXIST - if(_TRUE == bbtchange) - rtw_write32(padapter, REG_EDCA_BE_PARAM, pbtpriv->BT_EDCA[trafficIndex]); - else -#endif - //adjust EDCA parameter for BE queue - //fire_write_MAC_cmd(padapter, EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]); - rtw_write32(padapter, REG_EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]); - -#else - if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) - { - edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; - } - else if((pmlmeinfo->assoc_AP_vendor == airgocapAP) && - ((pmlmeext->cur_wireless_mode == WIRELESS_11G) ||(pmlmeext->cur_wireless_mode == WIRELESS_11BG))) - { - edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; - } - else - { - edca_param = EDCAParam[unknownAP][trafficIndex]; - } - -#ifdef CONFIG_BT_COEXIST - if(_TRUE == bbtchange) - edca_param = pbtpriv->BT_EDCA[trafficIndex]; -#endif - - rtw_write32(padapter, REG_EDCA_BE_PARAM, edca_param); -#endif - pdmpriv->prv_traffic_idx = trafficIndex; - } - -//exit_update_EDCA_param: - - pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes; - precvpriv->last_rx_bytes = precvpriv->rx_bytes; - - return; -} - -static void dm_InitDynamicBBPowerSaving( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PS_T *pPSTable = &pdmpriv->DM_PSTable; - - pPSTable->PreCCAState = CCA_MAX; - pPSTable->CurCCAState = CCA_MAX; - pPSTable->PreRFState = RF_MAX; - pPSTable->CurRFState = RF_MAX; - pPSTable->Rssi_val_min = 0; -} - -static void dm_1R_CCA( - IN PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PS_T *pPSTable = &pdmpriv->DM_PSTable; - - if(pPSTable->Rssi_val_min != 0) - { - if(pPSTable->PreCCAState == CCA_2R) - { - if(pPSTable->Rssi_val_min >= 35) - pPSTable->CurCCAState = CCA_1R; - else - pPSTable->CurCCAState = CCA_2R; - } - else{ - if(pPSTable->Rssi_val_min <= 30) - pPSTable->CurCCAState = CCA_2R; - else - pPSTable->CurCCAState = CCA_1R; - } - } - else - pPSTable->CurCCAState=CCA_MAX; - - if(pPSTable->PreCCAState != pPSTable->CurCCAState) - { - if(pPSTable->CurCCAState == CCA_1R) - { - if(pHalData->rf_type == RF_2T2R) - { - PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x13); - PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20); - } - else - { - PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x23); - PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100 - } - } - else - { - PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x33); - PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63); - } - pPSTable->PreCCAState = pPSTable->CurCCAState; - } - //DBG_8192C("dm_1R_CCA(): CCAStage=%x\n", pPSTable->CurCCAState); -} - -void -rtl8192c_dm_RF_Saving( - IN PADAPTER pAdapter, - IN u8 bForceInNormal - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PS_T *pPSTable = &pdmpriv->DM_PSTable; - - if(pdmpriv->initialize == 0){ - pdmpriv->rf_saving_Reg874 = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord)&0x1CC000)>>14; - pdmpriv->rf_saving_RegC70 = (PHY_QueryBBReg(pAdapter, rOFDM0_AGCParameter1, bMaskDWord)&BIT3)>>3; - pdmpriv->rf_saving_Reg85C = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_SwitchControl, bMaskDWord)&0xFF000000)>>24; - pdmpriv->rf_saving_RegA74 = (PHY_QueryBBReg(pAdapter, 0xa74, bMaskDWord)&0xF000)>>12; - //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord); - pdmpriv->initialize = 1; - } - - if(!bForceInNormal) - { - if(pPSTable->Rssi_val_min != 0) - { - - if(pPSTable->PreRFState == RF_Normal) - { - #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV - if(pPSTable->Rssi_val_min >= 50) - #else - if(pPSTable->Rssi_val_min >= 30) - #endif - pPSTable->CurRFState = RF_Save; - else - pPSTable->CurRFState = RF_Normal; - } - else{ - #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV - if(pPSTable->Rssi_val_min <= 45) - #else - if(pPSTable->Rssi_val_min <= 25) - #endif - pPSTable->CurRFState = RF_Normal; - else - pPSTable->CurRFState = RF_Save; - } - } - else - pPSTable->CurRFState=RF_MAX; - } - else - { - pPSTable->CurRFState = RF_Normal; - } - - if(pPSTable->PreRFState != pPSTable->CurRFState) - { - if(pPSTable->CurRFState == RF_Save) - { - PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1C0000, 0x2); //Reg874[20:18]=3'b010 - PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, 0); //RegC70[3]=1'b0 - PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, 0x63); //Reg85C[31:24]=0x63 - PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, 0xC000, 0x2); //Reg874[15:14]=2'b10 - PHY_SetBBReg(pAdapter, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3 - PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0); //Reg818[28]=1'b0 - PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x1); //Reg818[28]=1'b1 - //DBG_8192C("%s(): RF_Save\n", __FUNCTION__); - } - else - { - PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1CC000, pdmpriv->rf_saving_Reg874); - PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, pdmpriv->rf_saving_RegC70); - PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, pdmpriv->rf_saving_Reg85C); - PHY_SetBBReg(pAdapter, 0xa74, 0xF000, pdmpriv->rf_saving_RegA74); - PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0); - //DBG_8192C("%s(): RF_Normal\n", __FUNCTION__); - } - pPSTable->PreRFState = pPSTable->CurRFState; - } -} - -static void -dm_DynamicBBPowerSaving( -IN PADAPTER pAdapter - ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv; - struct dm_priv *pdmpriv = &pHalData->dmpriv; - PS_T *pPSTable = &pdmpriv->DM_PSTable; - - //1 1.Determine the minimum RSSI - if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) && - (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)) - { - pPSTable->Rssi_val_min = 0; - //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n")); - } - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port - { - //if(ACTING_AS_AP(pAdapter) || pMgntInfo->mIbss) - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) //todo: AP Mode - { - pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); - } - else - { - pPSTable->Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; - //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); - } - } - else // associated entry pwdb - { - pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; - //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); - } - - //1 2.Power Saving for 92C - if(IS_92C_SERIAL(pHalData->VersionID)) - { - //dm_1R_CCA(pAdapter); - } - - // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable. - // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns to 600ns. - //1 3.Power Saving for 88C - else - { - rtl8192c_dm_RF_Saving(pAdapter, _FALSE); - } -} - - -#ifdef CONFIG_ANTENNA_DIVERSITY -// Add new function to reset the state of antenna diversity before link. -// -void SwAntDivResetBeforeLink8192C(IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; - - pDM_SWAT_Table->SWAS_NoLink_State = 0; -} - -// Compare RSSI for deciding antenna -void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if((0 != pHalData->AntDivCfg) && (!IS_92C_SERIAL(pHalData->VersionID)) ) - { - //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi), - // src->Rssi,query_rx_pwr_percentage(src->Rssi)); - //select optimum_antenna for before linked =>For antenna diversity - if(dst->Rssi >= src->Rssi )//keep org parameter - { - src->Rssi = dst->Rssi; - src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; - } - } -} - -// Add new function to reset the state of antenna diversity before link. -u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - - // Condition that does not need to use antenna diversity. - if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) - { - //DBG_8192C("SwAntDivBeforeLink8192C(): No AntDiv Mechanism.\n"); - return _FALSE; - } - - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - pDM_SWAT_Table->SWAS_NoLink_State = 0; - return _FALSE; - } - // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF. -/* - if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect) - { - - - RT_TRACE(COMP_SWAS, DBG_LOUD, - ("SwAntDivCheckBeforeLink8192C(): RFChangeInProgress(%x), eRFPowerState(%x)\n", - pMgntInfo->RFChangeInProgress, - pHalData->eRFPowerState)); - - pDM_SWAT_Table->SWAS_NoLink_State = 0; - - return FALSE; - } -*/ - - if(pDM_SWAT_Table->SWAS_NoLink_State == 0){ - //switch channel - pDM_SWAT_Table->SWAS_NoLink_State = 1; - pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A; - - //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna); - rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE); - //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"); - return _TRUE; - } - else - { - pDM_SWAT_Table->SWAS_NoLink_State = 0; - return _FALSE; - } - - - -} -#endif -#ifdef CONFIG_SW_ANTENNA_DIVERSITY -// -// 20100514 Luke/Joseph: -// Add new function to reset antenna diversity state after link. -// -void -SwAntDivRestAfterLink8192C( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; - - if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) - return; - - //DBG_8192C("======> SwAntDivRestAfterLink <========== \n"); - pHalData->RSSI_cnt_A= 0; - pHalData->RSSI_cnt_B= 0; - pHalData->RSSI_test = _FALSE; - - pDM_SWAT_Table->try_flag = 0xff; - pDM_SWAT_Table->RSSI_Trying = 0; - pDM_SWAT_Table->SelectAntennaMap=0xAA; - pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna; - pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna; - - pdmpriv->lastTxOkCnt=0; - pdmpriv->lastRxOkCnt=0; - - pdmpriv->TXByteCnt_A=0; - pdmpriv->TXByteCnt_B=0; - pdmpriv->RXByteCnt_A=0; - pdmpriv->RXByteCnt_B=0; - pdmpriv->DoubleComfirm=0; - pdmpriv->TrafficLoad = TRAFFIC_LOW; - -} - - -// -// 20100514 Luke/Joseph: -// Add new function for antenna diversity after link. -// This is the main function of antenna diversity after link. -// This function is called in HalDmWatchDog() and dm_SW_AntennaSwitchCallback(). -// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test. -// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing. -// After 500ms, dm_SW_AntennaSwitchCallback() calls this function to compare the signal just -// listened on the air with the RSSI of original antenna. -// It chooses the antenna with better RSSI. -// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting -// penalty to get next try. -// -static VOID -dm_SW_AntennaSwitch( - PADAPTER Adapter, - u8 Step -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; - s32 curRSSI=100, RSSI_A, RSSI_B; - u64 curTxOkCnt, curRxOkCnt; - u64 CurByteCnt = 0, PreByteCnt = 0; - u8 nextAntenna = 0; - u8 Score_A=0, Score_B=0; - u8 i; - - // Condition that does not need to use antenna diversity. - if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) - { - //RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No AntDiv Mechanism.\n")); - return; - } - // If dynamic ant_div is disabled. - if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_ANT_DIV) ) - { - return; - } - - if (check_fwstate(&Adapter->mlmepriv, _FW_LINKED) ==_FALSE) - return; -#if 0 //to do - // Radio off: Status reset to default and return. - if(pHalData->eRFPowerState==eRfOff) - { - SwAntDivRestAfterLink(Adapter); - return; - } -#endif - //DBG_8192C("\n............................ %s.........................\n",__FUNCTION__); - // Handling step mismatch condition. - // Peak step is not finished at last time. Recover the variable and check again. - if( Step != pDM_SWAT_Table->try_flag ) - { - SwAntDivRestAfterLink8192C(Adapter); - } - - - if(pDM_SWAT_Table->try_flag == 0xff) - { -#if 0 - // Select RSSI checking target - if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter)) - { - // Target: Infrastructure mode AP. - pHalData->RSSI_target = NULL; - RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is DEF AP!\n")); - } - else - { - u8 index = 0; - PRT_WLAN_STA pEntry = NULL; - PADAPTER pTargetAdapter = NULL; - - if( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) ) - { - // Target: AP/IBSS peer. - pTargetAdapter = Adapter; - } - else if(ACTING_AS_AP(ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE))) - { - // Target: VWIFI peer. - pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE); - } - - if(pTargetAdapter != NULL) - { - for(index=0; indexbAssociated) - break; - } - } - } - - if(pEntry == NULL) - { - SwAntDivRestAfterLink(Adapter); - RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No Link.\n")); - return; - } - else - { - pHalData->RSSI_target = pEntry; - RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is PEER STA\n")); - } - } - - -#endif - - pHalData->RSSI_cnt_A= 0; - pHalData->RSSI_cnt_B= 0; - pDM_SWAT_Table->try_flag = 0; - // DBG_8192C("dm_SW_AntennaSwitch(): Set try_flag to 0 prepare for peak!\n"); - return; - } - else - { - curTxOkCnt = Adapter->xmitpriv.tx_bytes - pdmpriv->lastTxOkCnt; - curRxOkCnt = Adapter->recvpriv.rx_bytes - pdmpriv->lastRxOkCnt; - - pdmpriv->lastTxOkCnt = Adapter->xmitpriv.tx_bytes ; - pdmpriv->lastRxOkCnt = Adapter->recvpriv.rx_bytes ; - - if(pDM_SWAT_Table->try_flag == 1) - { - if(pDM_SWAT_Table->CurAntenna == Antenna_A) - { - pdmpriv->TXByteCnt_A += curTxOkCnt; - pdmpriv->RXByteCnt_A += curRxOkCnt; - //DBG_8192C("##### TXByteCnt_A(%lld) , RXByteCnt_A(%lld) ####\n",pdmpriv->TXByteCnt_A,pdmpriv->RXByteCnt_A); - } - else - { - pdmpriv->TXByteCnt_B += curTxOkCnt; - pdmpriv->RXByteCnt_B += curRxOkCnt; - //DBG_8192C("##### TXByteCnt_B(%lld) , RXByteCnt_B(%lld) ####\n",pdmpriv->TXByteCnt_B,pdmpriv->RXByteCnt_B); - } - - nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; - pDM_SWAT_Table->RSSI_Trying--; - //DBG_8192C("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying); - - if(pDM_SWAT_Table->RSSI_Trying == 0) - { - CurByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A) : (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B); - PreByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B) : (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A); - - //DBG_8192C("CurByteCnt = %lld\n", CurByteCnt); - //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt); - - if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) - { - PreByteCnt = PreByteCnt*9; //normalize:Cur=90ms:Pre=10ms - } - else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) - { - //CurByteCnt = CurByteCnt/2; - CurByteCnt = CurByteCnt>>1;//normalize:100ms:50ms - } - - - //DBG_8192C("After DIV=>CurByteCnt = %lld\n", CurByteCnt); - //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt); - - if(pHalData->RSSI_cnt_A > 0) - RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; - else - RSSI_A = 0; - if(pHalData->RSSI_cnt_B > 0) - RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; - else - RSSI_B = 0; - - curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B; - pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_B : RSSI_A; - //DBG_8192C("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI); - //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n", - //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")); - //DBG_8192C("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n", - //RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B); - } - - } - else - { - - if(pHalData->RSSI_cnt_A > 0) - RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; - else - RSSI_A = 0; - if(pHalData->RSSI_cnt_B > 0) - RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; - else - RSSI_B = 0; - curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B; - pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == Antenna_A)? RSSI_A : RSSI_B; - //DBG_8192C("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI); - //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n", - //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")); - - //DBG_8192C("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n", - // RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B); - //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt)); - //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt)); - } - - //1 Trying State - if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0)) - { - - if(pDM_SWAT_Table->TestMode == TP_MODE) - { - //DBG_8192C("SWAS: TestMode = TP_MODE\n"); - //DBG_8192C("TRY:CurByteCnt = %lld\n", CurByteCnt); - //DBG_8192C("TRY:PreByteCnt = %lld\n",PreByteCnt); - if(CurByteCnt < PreByteCnt) - { - if(pDM_SWAT_Table->CurAntenna == Antenna_A) - pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1; - else - pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1; - } - else - { - if(pDM_SWAT_Table->CurAntenna == Antenna_A) - pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1; - else - pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1; - } - for (i= 0; i<8; i++) - { - if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1) - Score_A++; - else - Score_B++; - } - //DBG_8192C("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap); - //DBG_8192C("Score_A=%d, Score_B=%d\n", Score_A, Score_B); - - if(pDM_SWAT_Table->CurAntenna == Antenna_A) - { - nextAntenna = (Score_A > Score_B)?Antenna_A:Antenna_B; - } - else - { - nextAntenna = (Score_B > Score_A)?Antenna_B:Antenna_A; - } - //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B")); - //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n", - //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B"))); - - if(nextAntenna != pDM_SWAT_Table->CurAntenna) - { - //DBG_8192C("SWAS: Switch back to another antenna\n"); - } - else - { - //DBG_8192C("SWAS: current anntena is good\n"); - } - } - - if(pDM_SWAT_Table->TestMode == RSSI_MODE) - { - //DBG_8192C("SWAS: TestMode = RSSI_MODE\n"); - pDM_SWAT_Table->SelectAntennaMap=0xAA; - if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna - { - //DBG_8192C("SWAS: Switch back to another antenna\n"); - nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; - } - else // current anntena is good - { - nextAntenna = pDM_SWAT_Table->CurAntenna; - //DBG_8192C("SWAS: current anntena is good\n"); - } - } - pDM_SWAT_Table->try_flag = 0; - pHalData->RSSI_test = _FALSE; - pHalData->RSSI_sum_A = 0; - pHalData->RSSI_cnt_A = 0; - pHalData->RSSI_sum_B = 0; - pHalData->RSSI_cnt_B = 0; - pdmpriv->TXByteCnt_A = 0; - pdmpriv->TXByteCnt_B = 0; - pdmpriv->RXByteCnt_A = 0; - pdmpriv->RXByteCnt_B = 0; - - } - - //1 Normal State - else if(pDM_SWAT_Table->try_flag == 0) - { - if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) - { - if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000) - pdmpriv->TrafficLoad = TRAFFIC_HIGH; - else - pdmpriv->TrafficLoad = TRAFFIC_LOW; - } - else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) - { - if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000) - pdmpriv->TrafficLoad = TRAFFIC_HIGH; - else - pdmpriv->TrafficLoad = TRAFFIC_LOW; - } - if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) - pDM_SWAT_Table->bTriggerAntennaSwitch = 0; - //DBG_8192C("Normal:TrafficLoad = %lld\n", curTxOkCnt+curRxOkCnt); - - //Prepare To Try Antenna - nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; - pDM_SWAT_Table->try_flag = 1; - pHalData->RSSI_test = _TRUE; - if((curRxOkCnt+curTxOkCnt) > 1000) - { - pDM_SWAT_Table->RSSI_Trying = 4; - pDM_SWAT_Table->TestMode = TP_MODE; - } - else - { - pDM_SWAT_Table->RSSI_Trying = 2; - pDM_SWAT_Table->TestMode = RSSI_MODE; - - } - //DBG_8192C("SWAS: Normal State -> Begin Trying! TestMode=%s\n",(pDM_SWAT_Table->TestMode == TP_MODE)?"TP":"RSSI"); - - - pHalData->RSSI_sum_A = 0; - pHalData->RSSI_cnt_A = 0; - pHalData->RSSI_sum_B = 0; - pHalData->RSSI_cnt_B = 0; - } - } - - //1 4.Change TRX antenna - if(nextAntenna != pDM_SWAT_Table->CurAntenna) - { - //DBG_8192C("@@@@@@@@ SWAS: Change TX Antenna!\n "); - rtw_antenna_select_cmd(Adapter, nextAntenna, 1); - } - - //1 5.Reset Statistics - pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna; - pDM_SWAT_Table->CurAntenna = nextAntenna; - pDM_SWAT_Table->PreRSSI = curRSSI; - - - //1 6.Set next timer - - if(pDM_SWAT_Table->RSSI_Trying == 0) - return; - - if(pDM_SWAT_Table->RSSI_Trying%2 == 0) - { - if(pDM_SWAT_Table->TestMode == TP_MODE) - { - if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) - { - _set_timer(&pdmpriv->SwAntennaSwitchTimer,10 ); //ms - //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"); - } - else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) - { - _set_timer(&pdmpriv->SwAntennaSwitchTimer, 50 ); //ms - //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"); - } - } - else - { - _set_timer(&pdmpriv->SwAntennaSwitchTimer, 500 ); //ms - //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"); - } - } - else - { - if(pDM_SWAT_Table->TestMode == TP_MODE) - { - if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) - _set_timer(&pdmpriv->SwAntennaSwitchTimer,90 ); //ms - else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) - _set_timer(&pdmpriv->SwAntennaSwitchTimer,100 ); //ms - } - else - { - _set_timer(&pdmpriv->SwAntennaSwitchTimer,500 ); //ms - //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"); - } - } - -// RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: -----The End-----\n ")); - -} - -// -// 20100514 Luke/Joseph: -// Callback function for 500ms antenna test trying. -// -static void dm_SW_AntennaSwitchCallback(void *FunctionContext) -{ - _adapter *padapter = (_adapter *)FunctionContext; - - if(padapter->net_closed == _TRUE) - return; - // Only - dm_SW_AntennaSwitch(padapter, SWAW_STEP_DETERMINE); -} - - -// -// 20100722 -// This function is used to gather the RSSI information for antenna testing. -// It selects the RSSI of the peer STA that we want to know. -// -void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; - - if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) - return; - - if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - { - if(pDM_SWAT_Table->CurAntenna == Antenna_A) - { - pHalData->RSSI_sum_A += RxPWDBAll; - pHalData->RSSI_cnt_A++; - } - else - { - pHalData->RSSI_sum_B+= RxPWDBAll; - pHalData->RSSI_cnt_B++; - - } - //DBG_8192C("%s Ant_(%s),RSSI_sum(%d),RSSI_cnt(%d)\n",__FUNCTION__,(2==pHalData->CurAntenna)?"A":"B",pHalData->RSSI_sum,pHalData->RSSI_cnt); - } - -} - - - -static VOID -dm_SW_AntennaSwitchInit( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; - - pHalData->RSSI_sum_A = 0; - pHalData->RSSI_sum_B = 0; - pHalData->RSSI_cnt_A = 0; - pHalData->RSSI_cnt_B = 0; - - pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna; - pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna; - pDM_SWAT_Table->try_flag = 0xff; - pDM_SWAT_Table->PreRSSI = 0; - pDM_SWAT_Table->bTriggerAntennaSwitch = 0; - pDM_SWAT_Table->SelectAntennaMap=0xAA; - - // Move the timer initialization to InitializeVariables function. - //PlatformInitializeTimer(Adapter, &pMgntInfo->SwAntennaSwitchTimer, (RT_TIMER_CALL_BACK)dm_SW_AntennaSwitchCallback, NULL, "SwAntennaSwitchTimer"); -} - -#endif - -//#define RSSI_CCK 0 -//#define RSSI_OFDM 1 -static void dm_RSSIMonitorInit( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - pdmpriv->OFDM_Pkt_Cnt = 0; - pdmpriv->RSSI_Select = RSSI_CCK; -} - -static void dm_RSSIMonitorCheck( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - if(pdmpriv->OFDM_Pkt_Cnt == 0) - pdmpriv->RSSI_Select = RSSI_CCK; - else - pdmpriv->RSSI_Select = RSSI_OFDM; - - pdmpriv->OFDM_Pkt_Cnt = 0; - //DBG_8192C("RSSI_Select=%s OFDM_Pkt_Cnt(%d)\n", - //(pdmpriv->RSSI_Select == RSSI_OFDM)?"RSSI_OFDM":"RSSI_CCK", - //pdmpriv->OFDM_Pkt_Cnt); -} - -//============================================================ -// functions -//============================================================ -void rtl8192c_init_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - _init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , dm_SW_AntennaSwitchCallback, Adapter); -#endif -} - -void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - _cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer); -#endif -} -#ifdef CONFIG_HW_ANTENNA_DIVERSITY -void dm_InitHybridAntDiv(IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) - return; - - //Set OFDM HW RX Antenna Diversity - PHY_SetBBReg(Adapter,0xc50, BIT7, 1); //Enable Hardware antenna switch - PHY_SetBBReg(Adapter,0x870, BIT9|BIT8, 0); //Enable hardware control of "ANT_SEL" & "ANT_SELB" - PHY_SetBBReg(Adapter,0xCA4, BIT11, 0); //Switch to another antenna by checking pwdb threshold - PHY_SetBBReg(Adapter,0xCA4, 0x7FF, 0x080); //Pwdb threshold=8dB - PHY_SetBBReg(Adapter,0xC54, BIT23, 1); //Decide final antenna by comparing 2 antennas' pwdb - PHY_SetBBReg(Adapter,0x874, BIT23, 0); //No update ANTSEL during GNT_BT=1 - PHY_SetBBReg(Adapter,0x80C, BIT21, 1); //TX atenna selection from tx_info - //Set CCK HW RX Antenna Diversity - PHY_SetBBReg(Adapter,0xA00, BIT15, 1);//Enable antenna diversity - PHY_SetBBReg(Adapter,0xA0C, BIT4, 0); //Antenna diversity decision period = 32 sample - PHY_SetBBReg(Adapter,0xA0C, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4 - PHY_SetBBReg(Adapter,0xA10, BIT13, 1); //polarity ana_A=1 and ana_B=0 - PHY_SetBBReg(Adapter,0xA14, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16) - - pHalData->CCK_Ant1_Cnt = 0; - pHalData->CCK_Ant2_Cnt = 0; - pHalData->OFDM_Ant1_Cnt = 0; - pHalData->OFDM_Ant2_Cnt = 0; -} - - -#define RxDefaultAnt1 0x65a9 -#define RxDefaultAnt2 0x569a - -void dm_SelectRXDefault(IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) - return; - - //DbgPrint(" Ant1_Cnt=%d, Ant2_Cnt=%d\n", pHalData->Ant1_Cnt, pHalData->Ant2_Cnt); - //DBG_8192C(" CCK_Ant1_Cnt = %d, CCK_Ant2_Cnt = %d\n", pHalData->CCK_Ant1_Cnt, pHalData->CCK_Ant2_Cnt); - //DBG_8192C(" OFDM_Ant1_Cnt = %d, OFDM_Ant2_Cnt = %d\n", pHalData->OFDM_Ant1_Cnt, pHalData->OFDM_Ant2_Cnt); - if((pHalData->OFDM_Ant1_Cnt == 0) && (pHalData->OFDM_Ant2_Cnt == 0)) - { - if((pHalData->CCK_Ant1_Cnt + pHalData->CCK_Ant2_Cnt) >=10 ) - { - if(pHalData->CCK_Ant1_Cnt > (5*pHalData->CCK_Ant2_Cnt)) - { - DBG_8192C(" RX Default = Ant1\n"); - PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); - } - else if(pHalData->CCK_Ant2_Cnt > (5*pHalData->CCK_Ant1_Cnt)) - { - DBG_8192C(" RX Default = Ant2\n"); - PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); - } - else if(pHalData->CCK_Ant1_Cnt > pHalData->CCK_Ant2_Cnt) - { - DBG_8192C(" RX Default = Ant2\n"); - PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); - } - else - { - DBG_8192C(" RX Default = Ant1\n"); - PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); - } - pHalData->CCK_Ant1_Cnt = 0; - pHalData->CCK_Ant2_Cnt = 0; - pHalData->OFDM_Ant1_Cnt = 0; - pHalData->OFDM_Ant2_Cnt = 0; - } - } - else - { - if(pHalData->OFDM_Ant1_Cnt > pHalData->OFDM_Ant2_Cnt) - { - DBG_8192C(" RX Default = Ant1\n"); - PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); - } - else - { - DBG_8192C(" RX Default = Ant2\n"); - PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); - } - pHalData->CCK_Ant1_Cnt = 0; - pHalData->CCK_Ant2_Cnt = 0; - pHalData->OFDM_Ant1_Cnt = 0; - pHalData->OFDM_Ant2_Cnt = 0; - } - - -} - -#endif - -void -rtl8192c_InitHalDm( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 i; - -#ifdef CONFIG_USB_HCI - dm_InitGPIOSetting(Adapter); -#endif - - pdmpriv->DM_Type = DM_Type_ByDriver; - pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; - pdmpriv->UndecoratedSmoothedPWDB = (-1); - - //.1 DIG INIT - pdmpriv->bDMInitialGainEnable = _TRUE; - pdmpriv->DMFlag |= DYNAMIC_FUNC_DIG; - dm_DIGInit(Adapter); - - //.2 DynamicTxPower INIT - pdmpriv->DMFlag |= DYNAMIC_FUNC_HP; - dm_InitDynamicTxPower(Adapter); - - //.3 - DM_InitEdcaTurbo(Adapter); - - //.4 RateAdaptive INIT - dm_InitRateAdaptiveMask(Adapter); - - //.5 Tx Power Tracking Init. - pdmpriv->DMFlag |= DYNAMIC_FUNC_SS; - DM_InitializeTXPowerTracking(Adapter); - -#ifdef CONFIG_BT_COEXIST - pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; - dm_InitBtCoexistDM(Adapter); -#endif - - dm_InitDynamicBBPowerSaving(Adapter); - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV; - dm_SW_AntennaSwitchInit(Adapter); -#endif - -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV; - dm_InitHybridAntDiv(Adapter); -#endif - - dm_RSSIMonitorInit(Adapter); - - pdmpriv->DMFlag_tmp = pdmpriv->DMFlag; - - // Save REG_INIDATA_RATE_SEL value for TXDESC. - for(i = 0 ; i<32 ; i++) - { - pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f; - } -} - -VOID -rtl8192c_HalDmWatchDog( - IN PADAPTER Adapter - ) -{ - BOOLEAN bFwCurrentInPSMode = _FALSE; - BOOLEAN bFwPSAwake = _TRUE; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - -#ifdef CONFIG_LPS - bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode; - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); -#endif - -#ifdef CONFIG_P2P - // Fw is under p2p powersaving mode, driver should stop dynamic mechanism. - // modifed by thomas. 2011.06.11. - if(Adapter->wdinfo.p2p_ps_enable) - bFwPSAwake = _FALSE; -#endif //CONFIG_P2P - - // Stop dynamic mechanism when: - // 1. RF is OFF. (No need to do DM.) - // 2. Fw is under power saving mode for FwLPS. (Prevent from SW/FW I/O racing.) - // 3. IPS workitem is scheduled. (Prevent from IPS sequence to be swapped with DM. - // Sometimes DM execution time is longer than 100ms such that the assertion - // in MgntActSet_RF_State() called by InactivePsWorkItem will be triggered by - // wating to long for RFChangeInProgress.) - // 4. RFChangeInProgress is TRUE. (Prevent from broken by IPS/HW/SW Rf off.) - // Noted by tynli. 2010.06.01. - //if(rfState == eRfOn) - if( (Adapter->hw_init_completed == _TRUE) - && ((!bFwCurrentInPSMode) && bFwPSAwake)) - { - // - // Calculate Tx/Rx statistics. - // - dm_CheckStatistics(Adapter); - - // - // For PWDB monitor and record some value for later use. - // - PWDB_Monitor(Adapter); - - // - // Dynamic Initial Gain mechanism. - // -#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV - dm_RSSIMonitorCheck(Adapter); -#endif - dm_FalseAlarmCounterStatistics(Adapter); - dm_DIG(Adapter); - - // - //Dynamic BB Power Saving Mechanism - // - dm_DynamicBBPowerSaving(Adapter); - - // - // Dynamic Tx Power mechanism. - // - dm_DynamicTxPower(Adapter); - - // - // Tx Power Tracking. - // - rtl8192c_dm_CheckTXPowerTracking(Adapter); - - // - // Rate Adaptive by Rx Signal Strength mechanism. - // - dm_RefreshRateAdaptiveMask(Adapter); - -#ifdef CONFIG_BT_COEXIST - //BT-Coexist - dm_BTCoexist(Adapter); -#endif - - // EDCA turbo - //update the EDCA paramter according to the Tx/RX mode - //update_EDCA_param(Adapter); - dm_CheckEdcaTurbo(Adapter); - - // - // Dynamically switch RTS/CTS protection. - // - //dm_CheckProtection(Adapter); - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - // - // Software Antenna diversity - // - dm_SW_AntennaSwitch(Adapter, SWAW_STEP_PEAK); -#endif - -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - //Hybrid Antenna Diversity - dm_SelectRXDefault(Adapter); -#endif - -#ifdef CONFIG_PCI_HCI - // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. - // Tx Migration settings. - //dm_InterruptMigration(Adapter); - - //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) - // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); -#endif - - // Read REG_INIDATA_RATE_SEL value for TXDESC. - if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) - { - pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f; - } - else - { - u8 i; - for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++) - { - pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f; - } - } - } - - // Check GPIO to determine current RF on/off and Pbc status. - // Check Hardware Radio ON/OFF or not - //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw) - //{ - //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n")); - // dm_CheckRfCtrlGPIO(Adapter); - //} - -#ifdef CONFIG_PCI_HCI - if(pHalData->bGpioHwWpsPbc) -#endif - { - dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11 - } - -} - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c deleted file mode 100755 index 02aa4a188bd5..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c +++ /dev/null @@ -1,3541 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ - -#define _RTL8192C_HAL_INIT_C_ -#include -#include -#include -#include -#include - -#include - -#ifdef CONFIG_USB_HCI -#include -#endif - -#ifdef CONFIG_PCI_HCI -#include -#endif - -#ifdef PLATFORM_LINUX -#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE -#include - - int isAdaptorInfoFileValid(void) -{ - return 1; -} - -int storeAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path) -{ - int ret =0; - mm_segment_t oldfs; - struct file *fp; - if(eeprom_priv) { - - if( 0 == (ret=openFile(&fp, path, O_CREAT|O_WRONLY, 0666)) ) { - //DBG_8192C("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp); - - oldfs = get_fs(); set_fs(get_ds()); - if( EEPROM_MAX_SIZE==(ret=writeFile(fp, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE)) ) { - //DBG_8192C("%s writeFile OK\n",__FUNCTION__); - ret = 0; - } else { - DBG_8192C("%s writeFile Fail, ret:%d\n",__FUNCTION__, ret); - } - set_fs(oldfs); - - closeFile(fp); - } else { - DBG_8192C("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret); - } - - } else { - //DBG_8192C("%s NULL pointer\n",__FUNCTION__); - ret = -EINVAL; - } - return ret; -} - -int retriveAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path) -{ - int ret =-1; - mm_segment_t oldfs; - struct file *fp; - - if(eeprom_priv) { - - if( 0 == (ret=openFile(&fp,path, O_RDONLY, 0)) ){ - //DBG_8192C("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp); - - oldfs = get_fs(); set_fs(get_ds()); - if( EEPROM_MAX_SIZE==(ret=readFile(fp, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE)) ) { - //DBG_8192C("%s readFile OK\n",__FUNCTION__); - ret = 0; - } else { - DBG_8192C("%s readFile Fai, ret:%dl\n",__FUNCTION__, ret); - } - set_fs(oldfs); - - closeFile(fp); - } else { - DBG_8192C("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret); - } - - #if 0 - if(isAdaptorInfoFileValid()) { - return 0; - } else { - return -ENODATA; - } - #endif - } else { - //DBG_8192C("%s NULL pointer\n",__FUNCTION__); - ret = -EINVAL; - } - return ret; -} -#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE -#endif //PLATFORM_LINUX - -static BOOLEAN -hal_EfusePgPacketWrite2ByteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest); -static BOOLEAN -hal_EfusePgPacketWrite1ByteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest); -static BOOLEAN -hal_EfusePgPacketWriteData( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest); -static BOOLEAN -hal_EfusePgPacketWrite_BT( - IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *pData, - IN BOOLEAN bPseudoTest); - -static VOID -_FWDownloadEnable( - IN PADAPTER Adapter, - IN BOOLEAN enable - ) -{ - u8 tmp; - - if(enable) - { - #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE - { - u8 val; - if( (val=rtw_read8(Adapter, REG_MCUFWDL))) - DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); - } - #endif - - // 8051 enable - tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); - rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|0x04); - - // MCU firmware download enable. - tmp = rtw_read8(Adapter, REG_MCUFWDL); - rtw_write8(Adapter, REG_MCUFWDL, tmp|0x01); - - // 8051 reset - tmp = rtw_read8(Adapter, REG_MCUFWDL+2); - rtw_write8(Adapter, REG_MCUFWDL+2, tmp&0xf7); - } - else - { - // MCU firmware download enable. - tmp = rtw_read8(Adapter, REG_MCUFWDL); - rtw_write8(Adapter, REG_MCUFWDL, tmp&0xfe); - - // Reserved for fw extension. - rtw_write8(Adapter, REG_MCUFWDL+1, 0x00); - } -} - - -#define MAX_REG_BOLCK_SIZE 196 -#define MIN_REG_BOLCK_SIZE 8 - -static VOID -_BlockWrite( - IN PADAPTER Adapter, - IN PVOID buffer, - IN u32 size - ) -{ -#ifdef CONFIG_PCI_HCI - u32 blockSize = sizeof(u32); // Use 4-byte write to download FW - u8 *bufferPtr = (u8 *)buffer; - u32 *pu4BytePtr = (u32 *)buffer; - u32 i, offset, blockCount, remainSize; - - blockCount = size / blockSize; - remainSize = size % blockSize; - - for(i = 0 ; i < blockCount ; i++){ - offset = i * blockSize; - rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), *(pu4BytePtr + i)); - } - - if(remainSize){ - offset = blockCount * blockSize; - bufferPtr += offset; - - for(i = 0 ; i < remainSize ; i++){ - rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset + i), *(bufferPtr + i)); - } - } -#else - -#ifdef SUPPORTED_BLOCK_IO - u32 blockSize = MAX_REG_BOLCK_SIZE; // Use 196-byte write to download FW - u32 blockSize2 = MIN_REG_BOLCK_SIZE; -#else - u32 blockSize = sizeof(u32); // Use 4-byte write to download FW - u32* pu4BytePtr = (u32*)buffer; - u32 blockSize2 = sizeof(u8); -#endif - u8* bufferPtr = (u8*)buffer; - u32 i, offset = 0, offset2, blockCount, remainSize, remainSize2; - - blockCount = size / blockSize; - remainSize = size % blockSize; - - for(i = 0 ; i < blockCount ; i++){ - offset = i * blockSize; - #ifdef SUPPORTED_BLOCK_IO - rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize, (bufferPtr + offset)); - #else - rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), le32_to_cpu(*(pu4BytePtr + i))); - #endif - } - - if(remainSize){ - offset2 = blockCount * blockSize; - blockCount = remainSize / blockSize2; - remainSize2 = remainSize % blockSize2; - - for(i = 0 ; i < blockCount ; i++){ - offset = offset2 + i * blockSize2; - #ifdef SUPPORTED_BLOCK_IO - rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize2, (bufferPtr + offset)); - #else - rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset ), *(bufferPtr + offset)); - #endif - } - - if(remainSize2) - { - offset += blockSize2; - bufferPtr += offset; - - for(i = 0 ; i < remainSize2 ; i++){ - rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset + i), *(bufferPtr + i)); - } - } - } -#endif -} - -static VOID -_PageWrite( - IN PADAPTER Adapter, - IN u32 page, - IN PVOID buffer, - IN u32 size - ) -{ - u8 value8; - u8 u8Page = (u8) (page & 0x07) ; - - value8 = (rtw_read8(Adapter, REG_MCUFWDL+2)& 0xF8 ) | u8Page ; - rtw_write8(Adapter, REG_MCUFWDL+2,value8); - _BlockWrite(Adapter,buffer,size); -} - -static VOID -_FillDummy( - u8* pFwBuf, - u32* pFwLen - ) -{ - u32 FwLen = *pFwLen; - u8 remain = (u8)(FwLen%4); - remain = (remain==0)?0:(4-remain); - - while(remain>0) - { - pFwBuf[FwLen] = 0; - FwLen++; - remain--; - } - - *pFwLen = FwLen; -} - -static VOID -_WriteFW( - IN PADAPTER Adapter, - IN PVOID buffer, - IN u32 size - ) -{ - // Since we need dynamic decide method of dwonload fw, so we call this function to get chip version. - // We can remove _ReadChipVersion from ReadAdapterInfo8192C later. - - BOOLEAN isNormalChip; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); - - if(isNormalChip){ - u32 pageNums,remainSize ; - u32 page,offset; - u8* bufferPtr = (u8*)buffer; - -#ifdef CONFIG_PCI_HCI - // 20100120 Joseph: Add for 88CE normal chip. - // Fill in zero to make firmware image to dword alignment. - _FillDummy(bufferPtr, &size); -#endif - - pageNums = size / MAX_PAGE_SIZE ; - //RT_ASSERT((pageNums <= 4), ("Page numbers should not greater then 4 \n")); - remainSize = size % MAX_PAGE_SIZE; - - for(page = 0; page < pageNums; page++){ - offset = page *MAX_PAGE_SIZE; - _PageWrite(Adapter,page, (bufferPtr+offset),MAX_PAGE_SIZE); - } - if(remainSize){ - offset = pageNums *MAX_PAGE_SIZE; - page = pageNums; - _PageWrite(Adapter,page, (bufferPtr+offset),remainSize); - } - //RT_TRACE(COMP_INIT, DBG_LOUD, ("_WriteFW Done- for Normal chip.\n")); - } - else { - _BlockWrite(Adapter,buffer,size); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("_WriteFW Done- for Test chip.\n")); - } -} - -static int _FWFreeToGo( - IN PADAPTER Adapter - ) -{ - u32 counter = 0; - u32 value32; - u32 restarted = _FALSE; - - // polling CheckSum report - do{ - value32 = rtw_read32(Adapter, REG_MCUFWDL); - }while((counter ++ < POLLING_READY_TIMEOUT_COUNT) && (!(value32 & FWDL_ChkSum_rpt))); - - if(counter >= POLLING_READY_TIMEOUT_COUNT){ - DBG_8192C("chksum report faill ! REG_MCUFWDL:0x%08x .\n",value32); - return _FAIL; - } - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Checksum report OK ! REG_MCUFWDL:0x%08x .\n",value32)); - - - value32 = rtw_read32(Adapter, REG_MCUFWDL); - value32 |= MCUFWDL_RDY; - value32 &= ~WINTINI_RDY; - rtw_write32(Adapter, REG_MCUFWDL, value32); - - -POLLING_FW_READY: - // polling for FW ready - counter = 0; - do - { - if(rtw_read32(Adapter, REG_MCUFWDL) & WINTINI_RDY){ - //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",PlatformIORead4Byte(Adapter, REG_MCUFWDL)) ); - return _SUCCESS; - } - rtw_udelay_os(5); - }while(counter++ < POLLING_READY_TIMEOUT_COUNT); - - DBG_8192C("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", rtw_read32(Adapter, REG_MCUFWDL)); - - if(restarted == _FALSE) { - u8 tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); - //DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp & ~BIT2); - rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp & ~BIT2); - //DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp|BIT2); - rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|BIT2); - restarted = _TRUE; - goto POLLING_FW_READY; - } - - - return _FAIL; - -} - - -VOID -rtl8192c_FirmwareSelfReset( - IN PADAPTER Adapter -) -{ - u8 u1bTmp; - u8 Delay = 100; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if((pHalData->FirmwareVersion > 0x21) || - (pHalData->FirmwareVersion == 0x21 && - pHalData->FirmwareSubVersion >= 0x01)) // after 88C Fw v33.1 - { - //0x1cf=0x20. Inform 8051 to reset. 2009.12.25. tynli_test - rtw_write8(Adapter, REG_HMETFR+3, 0x20); - - u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); - while(u1bTmp&BIT2) - { - Delay--; - if(Delay == 0) - break; - rtw_udelay_os(50); - u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); - } - - if((u1bTmp&BIT2) && (Delay == 0)) - { - DBG_8192C("FirmwareDownload92C():fw reset by itself Fail!!!!!! 0x03 = %x\n", u1bTmp); - //RT_ASSERT(FALSE, ("PowerOffAdapter8192CE(): 0x03 = %x\n", u1bTmp)); - #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE - { - u8 val; - if( (val=rtw_read8(Adapter, REG_MCUFWDL))) - DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); - } - #endif - rtw_write8(Adapter,REG_SYS_FUNC_EN+1,(rtw_read8(Adapter, REG_SYS_FUNC_EN+1)&~BIT2)); - } - - //DBG_8192C("%s =====> 8051 reset success (%d) .\n", __FUNCTION__ ,Delay); - } -} - -// -// Description: -// Download 8192C firmware code. -// -// -int FirmwareDownload92C( - IN PADAPTER Adapter -) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - s8 R92CFwImageFileName_TSMC[] ={RTL8192C_FW_TSMC_IMG}; - s8 R92CFwImageFileName_UMC[] ={RTL8192C_FW_UMC_IMG}; - s8 R92CFwImageFileName_UMC_B[] ={RTL8192C_FW_UMC_B_IMG}; - //s8 R8723FwImageFileName_UMC[] ={RTL8723_FW_UMC_IMG}; - u8* FwImage = NULL; - u32 FwImageLen = 0; - char* pFwImageFileName; - u8* pucMappedFile = NULL; - //vivi, merge 92c and 92s into one driver, 20090817 - //vivi modify this temply, consider it later!!!!!!!! - //PRT_FIRMWARE pFirmware = GET_FIRMWARE_819X(Adapter); - //PRT_FIRMWARE_92C pFirmware = GET_FIRMWARE_8192C(Adapter); - PRT_FIRMWARE_92C pFirmware = NULL; - PRT_8192C_FIRMWARE_HDR pFwHdr = NULL; - u8 *pFirmwareBuf; - u32 FirmwareLen; - - pFirmware = (PRT_FIRMWARE_92C)rtw_zvmalloc(sizeof(RT_FIRMWARE_92C)); - - if(!pFirmware) - { - rtStatus = _FAIL; - goto Exit; - } - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID)) - { - pFwImageFileName = R92CFwImageFileName_UMC; - FwImage = Rtl819XFwUMCACutImageArray; - FwImageLen = UMCACutImgArrayLength; - //DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC\n"); - } - else if(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - { - // The ROM code of UMC B-cut Fw is the same as TSMC. by tynli. 2011.01.14. - pFwImageFileName = R92CFwImageFileName_UMC_B; - FwImage = Rtl819XFwUMCBCutImageArray; - FwImageLen = UMCBCutImgArrayLength; - //DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC_B\n"); - } - else - { - pFwImageFileName = R92CFwImageFileName_TSMC; - FwImage = Rtl819XFwTSMCImageArray; - FwImageLen = TSMCImgArrayLength; - //DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_TSMC\n"); - } - } - else - { - #if 0 - pFwImageFileName = TestChipFwFile; - FwImage = Rtl8192CTestFwImg; - FwImageLen = Rtl8192CTestFwImgLen; - RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> FirmwareDownload91C() fw:Rtl8192CTestFwImg\n")); - #endif - } - - //RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> FirmwareDownload91C() fw:%s\n", pFwImageFileName)); - -#ifdef CONFIG_EMBEDDED_FWIMG - pFirmware->eFWSource = FW_SOURCE_HEADER_FILE; -#else - pFirmware->eFWSource = FW_SOURCE_IMG_FILE; // We should decided by Reg. -#endif - - switch(pFirmware->eFWSource) - { - case FW_SOURCE_IMG_FILE: - //TODO: - //_rtw_memcpy(pFirmware->szFwBuffer, FwImage, FwImageLen); - break; - case FW_SOURCE_HEADER_FILE: - if(FwImageLen > FW_8192C_SIZE){ - rtStatus = _FAIL; - //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE) ); - DBG_871X("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE); - goto Exit; - } - - pFirmware->szFwBuffer = FwImage; - pFirmware->ulFwLength = FwImageLen; - break; - } - - pFirmwareBuf = pFirmware->szFwBuffer; - FirmwareLen = pFirmware->ulFwLength; - - // To Check Fw header. Added by tynli. 2009.12.04. - pFwHdr = (PRT_8192C_FIRMWARE_HDR)pFirmware->szFwBuffer; - - pHalData->FirmwareVersion = le16_to_cpu(pFwHdr->Version); - pHalData->FirmwareSubVersion = le16_to_cpu(pFwHdr->Subversion); - - //RT_TRACE(COMP_INIT, DBG_LOUD, (" FirmwareVersion(%#x), Signature(%#x)\n", - // Adapter->MgntInfo.FirmwareVersion, pFwHdr->Signature)); - - //DBG_8192C("fw_ver=v%d, fw_subver=%d, sig=0x%x\n", - //pHalData->FirmwareVersion, pHalData->FirmwareSubVersion, le16_to_cpu(pFwHdr->Signature)&0xFFF0); - - if(IS_FW_HEADER_EXIST(pFwHdr)) - { - //RT_TRACE(COMP_INIT, DBG_LOUD,("Shift 32 bytes for FW header!!\n")); - pFirmwareBuf = pFirmwareBuf + 32; - FirmwareLen = FirmwareLen -32; - } - - // Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, - // or it will cause download Fw fail. 2010.02.01. by tynli. - if(rtw_read8(Adapter, REG_MCUFWDL)&BIT7) //8051 RAM code - { - rtl8192c_FirmwareSelfReset(Adapter); - rtw_write8(Adapter, REG_MCUFWDL, 0x00); - } - - - _FWDownloadEnable(Adapter, _TRUE); - _WriteFW(Adapter, pFirmwareBuf, FirmwareLen); - _FWDownloadEnable(Adapter, _FALSE); - - rtStatus = _FWFreeToGo(Adapter); - if(_SUCCESS != rtStatus){ - DBG_8192C("DL Firmware failed!\n"); - goto Exit; - } - //RT_TRACE(COMP_INIT, DBG_LOUD, (" Firmware is ready to run!\n")); - -Exit: - - if(pFirmware) { - rtw_vmfree((u8*)pFirmware, sizeof(RT_FIRMWARE_92C)); - } - - //RT_TRACE(COMP_INIT, DBG_LOUD, (" <=== FirmwareDownload91C()\n")); - return rtStatus; - -} - -VOID -InitializeFirmwareVars92C( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // Init Fw LPS related. - Adapter->pwrctrlpriv.bFwCurrentInPSMode = _FALSE; - - //Init H2C counter. by tynli. 2009.12.09. - pHalData->LastHMEBoxNum = 0; -} - -#ifdef CONFIG_BT_COEXIST -static void _update_bt_param(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - struct registry_priv *registry_par = &padapter->registrypriv; - - if(2 != registry_par->bt_iso) - pbtpriv->BT_Ant_isolation = registry_par->bt_iso;// 0:Low, 1:High, 2:From Efuse - - if(registry_par->bt_sco == 1) // 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy - pbtpriv->BT_Service = BT_OtherAction; - else if(registry_par->bt_sco==2) - pbtpriv->BT_Service = BT_SCO; - else if(registry_par->bt_sco==4) - pbtpriv->BT_Service = BT_Busy; - else if(registry_par->bt_sco==5) - pbtpriv->BT_Service = BT_OtherBusy; - else - pbtpriv->BT_Service = BT_Idle; - - pbtpriv->BT_Ampdu = registry_par->bt_ampdu; - pbtpriv->bCOBT = _TRUE; -#if 1 - //DBG_8192C("BT Coexistance = %s\n", (pbtpriv->BT_Coexist==_TRUE)?"enable":"disable"); - if(pbtpriv->BT_Coexist) - { - if(pbtpriv->BT_Ant_Num == Ant_x2) - { - DBG_8192C("BlueTooth BT_Ant_Num = Antx2\n"); - } - else if(pbtpriv->BT_Ant_Num == Ant_x1) - { - DBG_8192C("BlueTooth BT_Ant_Num = Antx1\n"); - } - switch(pbtpriv->BT_CoexistType) - { - case BT_2Wire: - DBG_8192C("BlueTooth BT_CoexistType = BT_2Wire\n"); - break; - case BT_ISSC_3Wire: - DBG_8192C("BlueTooth BT_CoexistType = BT_ISSC_3Wire\n"); - break; - case BT_Accel: - DBG_8192C("BlueTooth BT_CoexistType = BT_Accel\n"); - break; - case BT_CSR_BC4: - DBG_8192C("BlueTooth BT_CoexistType = BT_CSR_BC4\n"); - break; - case BT_RTL8756: - DBG_8192C("BlueTooth BT_CoexistType = BT_RTL8756\n"); - break; - default: - DBG_8192C("BlueTooth BT_CoexistType = Unknown\n"); - break; - } - DBG_8192C("BlueTooth BT_Ant_isolation = %d\n", pbtpriv->BT_Ant_isolation); - - - switch(pbtpriv->BT_Service) - { - case BT_OtherAction: - DBG_8192C("BlueTooth BT_Service = BT_OtherAction\n"); - break; - case BT_SCO: - DBG_8192C("BlueTooth BT_Service = BT_SCO\n"); - break; - case BT_Busy: - DBG_8192C("BlueTooth BT_Service = BT_Busy\n"); - break; - case BT_OtherBusy: - DBG_8192C("BlueTooth BT_Service = BT_OtherBusy\n"); - break; - default: - DBG_8192C("BlueTooth BT_Service = BT_Idle\n"); - break; - } - - DBG_8192C("BT_RadioSharedType = 0x%x\n", pbtpriv->BT_RadioSharedType); - } -#endif - -} - - -#define GET_BT_COEXIST(priv) (&priv->bt_coexist) - -void rtl8192c_ReadBluetoothCoexistInfo( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - u8 rf_opt4; - - if(AutoloadFail){ - pbtpriv->BT_Coexist = _FALSE; - pbtpriv->BT_CoexistType= BT_2Wire; - pbtpriv->BT_Ant_Num = Ant_x2; - pbtpriv->BT_Ant_isolation= 0; - pbtpriv->BT_RadioSharedType = BT_Radio_Shared; - return; - } - - if(isNormal) - { - pbtpriv->BT_Coexist = (((PROMContent[EEPROM_RF_OPT1]&BOARD_TYPE_NORMAL_MASK)>>5) == BOARD_USB_COMBO)?_TRUE:_FALSE; // bit [7:5] - rf_opt4 = PROMContent[EEPROM_RF_OPT4]; - pbtpriv->BT_CoexistType = ((rf_opt4&0xe)>>1); // bit [3:1] - pbtpriv->BT_Ant_Num = (rf_opt4&0x1); // bit [0] - pbtpriv->BT_Ant_isolation = ((rf_opt4&0x10)>>4); // bit [4] - pbtpriv->BT_RadioSharedType = ((rf_opt4&0x20)>>5); // bit [5] - } - else - { - pbtpriv->BT_Coexist = (PROMContent[EEPROM_RF_OPT4] >> 4) ? _TRUE : _FALSE; - } - _update_bt_param(Adapter); - -} -#endif - -VERSION_8192C -rtl8192c_ReadChipVersion( - IN PADAPTER Adapter - ) -{ - u32 value32; - //VERSION_8192C version; - u32 ChipVersion=0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - value32 = rtw_read32(Adapter, REG_SYS_CFG); - - if (value32 & TRP_VAUX_EN) - { -#if 0 - // Test chip. - if(IS_HARDWARE_TYPE_8723(Adapter)) { - ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); - ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. - } - else { - version = (value32 & TYPE_ID) ?VERSION_TEST_CHIP_92C :VERSION_TEST_CHIP_88C; - } -#else - // tynli_test. 2011.01.10. - if(IS_HARDWARE_TYPE_8192C(Adapter)) - { - ChipVersion = (value32 & TYPE_ID) ? VERSION_TEST_CHIP_92C : VERSION_TEST_CHIP_88C; - } - else - { - ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); - ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. - } -#endif - } - else - { -#if 0 - // Normal mass production chip. - ChipVersion = NORMAL_CHIP; -#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION - ChipVersion |= ((value32 & TYPE_ID) ? CHIP_92C : 0); -#endif - ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); - ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. - if(IS_8723_SERIES(ChipVersion)) - { - if(IS_VENDOR_UMC(ChipVersion)) - ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) ? CHIP_VENDOR_UMC_B_CUT : 0); - } - else - { - // Mark out by tynli. UMC B-cut IC will not set the SYS_CFG[19] to UMC - // because we do not want the custmor to know. 2011.01.11. - //if(IS_VENDOR_UMC(ChipVersion)) - { - // To check the value of B-cut. by tynli. 2011.01.11. - u1bTmp = (u1Byte)((value32 & CHIP_VER_RTL_MASK)>>12); - if(u1bTmp == 1) - { // B-cut - ChipVersion |= CHIP_VENDOR_UMC_B_CUT; - } - } - } -#else - // Normal mass production chip. - ChipVersion = NORMAL_CHIP; -//#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION - ChipVersion |= ((value32 & TYPE_ID) ? RF_TYPE_2T2R : 0); //92c -//#endif - ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); - ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. - if(IS_HARDWARE_TYPE_8192C(Adapter)) - { - // 88/92C UMC B-cut IC will not set the SYS_CFG[19] to UMC - // because we do not want the custmor to know. by tynli. 2011.01.17. - //MSG_8192C("mask result = 0x%x is_UMC %d chipversion 0x%x\n", (value32 & CHIP_VER_RTL_MASK), IS_CHIP_VENDOR_UMC(ChipVersion), ChipVersion); - if((!IS_CHIP_VENDOR_UMC(ChipVersion) )&& (value32 & CHIP_VER_RTL_MASK)) - { - //MSG_8192C("chip mask result = 0x%x\n", ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC)); - ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC); // IC version (CUT) - //MSG_8192C("chip version = 0x%x\n", ChipVersion); - } - } - else - { - if(IS_CHIP_VENDOR_UMC(ChipVersion)) - ChipVersion |= ((value32 & CHIP_VER_RTL_MASK)); // IC version (CUT) - } - - if(IS_92C_SERIAL(ChipVersion)) - { - value32 = rtw_read32(Adapter, REG_HPON_FSM); - ChipVersion |= ((CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_92C_1T2R) ? RF_TYPE_1T2R : 0); - } - else if(IS_8723_SERIES(ChipVersion)) - { - //RT_ASSERT(IS_HARDWARE_TYPE_8723(Adapter), ("Incorrect chip version!!\n")); - value32 = rtw_read32(Adapter, REG_GPIO_OUTSTS); - ChipVersion |= ((value32 & RF_RL_ID)>>20); //ROM code version. - } -#endif - - } - - //version = (VERSION_8192C)ChipVersion; - - // For multi-function consideration. Added by Roger, 2010.10.06. - if(IS_8723_SERIES(ChipVersion)) - { - pHalData->MultiFunc = RT_MULTI_FUNC_NONE; - value32 = rtw_read32(Adapter, REG_MULTI_FUNC_CTRL); - pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & WL_FUNC_EN) ? RT_MULTI_FUNC_WIFI : 0) ); - pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & BT_FUNC_EN) ? RT_MULTI_FUNC_BT : 0) ); - pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & GPS_FUNC_EN) ? RT_MULTI_FUNC_GPS : 0) ); - pHalData->PolarityCtl = ((value32 & WL_HWPDN_SL) ? RT_POLARITY_HIGH_ACT : RT_POLARITY_LOW_ACT); - //MSG_8192C("ReadChipVersion(): MultiFunc(%x), PolarityCtl(%x) \n", pHalData->MultiFunc, pHalData->PolarityCtl); - - //For regulator mode. by tynli. 2011.01.14 - pHalData->RegulatorMode = ((value32 & TRP_BT_EN) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR); - //MSG_8192C("ReadChipVersion(): RegulatorMode(%x) \n", pHalData->RegulatorMode); - } - -//#if DBG -#if 1 - switch(ChipVersion) - { - case VERSION_NORMAL_TSMC_CHIP_92C_1T2R: - MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C_1T2R.\n"); - break; - case VERSION_NORMAL_TSMC_CHIP_92C: - MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C.\n"); - break; - case VERSION_NORMAL_TSMC_CHIP_88C: - MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_88C.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_92C_A_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_A_CUT.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_88C_A_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_A_CUT.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_92C_B_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_B_CUT.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_88C_B_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_B_CUT.\n"); - break; - case VERSION_TEST_CHIP_92C: - MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_92C.\n"); - break; - case VERSION_TEST_CHIP_88C: - MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_88C.\n"); - break; - case VERSION_TEST_UMC_CHIP_8723: - MSG_8192C("Chip Version ID: VERSION_TEST_UMC_CHIP_8723.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_A_CUT.\n"); - break; - case VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT: - MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_B_CUT.\n"); - break; - default: - MSG_8192C("Chip Version ID: ???????????????.\n"); - break; - } -#endif - - pHalData->VersionID = ChipVersion; - - if(IS_1T2R(ChipVersion)) - pHalData->rf_type = RF_1T2R; - else if(IS_2T2R(ChipVersion)) - pHalData->rf_type = RF_2T2R; - else if(IS_8723_SERIES(ChipVersion)) - pHalData->rf_type = RF_1T1R; - else - pHalData->rf_type = RF_1T1R; - - //MSG_8192C("RF_Type is %x!!\n", pHalData->rf_type); - - return ChipVersion; -} - - -RT_CHANNEL_DOMAIN -_HalMapChannelPlan8192C( - IN PADAPTER Adapter, - IN u8 HalChannelPlan - ) -{ - RT_CHANNEL_DOMAIN rtChannelDomain; - - switch(HalChannelPlan) - { -#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ - case EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN: - rtChannelDomain = RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN; - break; - case EEPROM_CHANNEL_PLAN_WORLD_WIDE_13: - rtChannelDomain = RT_CHANNEL_DOMAIN_WORLD_WIDE_13; - break; -#endif /* Not using EEPROM_CHANNEL_PLAN directly */ - default: - if(HalChannelPlan == 0xFF) - rtChannelDomain = RT_CHANNEL_DOMAIN_WORLD_WIDE_13; - else - rtChannelDomain = (RT_CHANNEL_DOMAIN)HalChannelPlan; - break; - } - - return rtChannelDomain; - -} - -u8 GetEEPROMSize8192C(PADAPTER Adapter) -{ - u8 size = 0; - u32 curRCR; - - curRCR = rtw_read16(Adapter, REG_9346CR); - size = (curRCR & BOOT_FROM_EEPROM) ? 6 : 4; // 6: EEPROM used is 93C46, 4: boot from E-Fuse. - - //MSG_8192C("EEPROM type is %s\n", size==4 ? "E-FUSE" : "93C46"); - - return size; -} - -void rtl8192c_HalSetBrateCfg( - IN PADAPTER Adapter, - IN u8 *mBratesOS, - OUT u16 *pBrateCfg -) -{ - u8 is_brate; - u8 i; - u8 brate; - - for(i=0;i rtl8192c_free_hal_data =====\n"); - - if(padapter->HalData) - rtw_mfree(padapter->HalData, sizeof(HAL_DATA_TYPE)); - //DBG_8192C("<===== rtl8192c_free_hal_data =====\n"); - -_func_exit_; -} - -//=========================================================== -// Efuse related code -//=========================================================== -enum{ - VOLTAGE_V25 = 0x03, - LDOE25_SHIFT = 28 , - }; - -static VOID -hal_EfusePowerSwitch_RTL8192C( - IN PADAPTER pAdapter, - IN u8 bWrite, - IN u8 PwrState) -{ - u8 tempval; - u16 tmpV16; - - if (PwrState == _TRUE) - { - // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid - tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL); - if( ! (tmpV16 & PWC_EV12V ) ){ - tmpV16 |= PWC_EV12V ; - rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16); - } - // Reset: 0x0000h[28], default valid - tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN); - if( !(tmpV16 & FEN_ELDR) ){ - tmpV16 |= FEN_ELDR ; - rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); - } - - // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid - tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR); - if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){ - tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; - rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); - } - - if(bWrite == _TRUE) - { - // Enable LDO 2.5V before read/write action - tempval = rtw_read8(pAdapter, EFUSE_TEST+3); - tempval &= 0x0F; - tempval |= (VOLTAGE_V25 << 4); - rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); - } - } - else - { - if(bWrite == _TRUE){ - // Disable LDO 2.5V after read/write action - tempval = rtw_read8(pAdapter, EFUSE_TEST+3); - rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); - } - } -} - -static VOID -hal_EfusePowerSwitch_RTL8723( - IN PADAPTER pAdapter, - IN u8 bWrite, - IN u8 PwrState) -{ - u8 tempval; - u16 tmpV16; - - if (PwrState == _TRUE) - { - rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); - - // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid - tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL); - if( ! (tmpV16 & PWC_EV12V ) ){ - tmpV16 |= PWC_EV12V ; - rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16); - } - // Reset: 0x0000h[28], default valid - tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN); - if( !(tmpV16 & FEN_ELDR) ){ - tmpV16 |= FEN_ELDR ; - rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); - } - - // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid - tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR); - if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){ - tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; - rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); - } - - if(bWrite == _TRUE) - { - // Enable LDO 2.5V before read/write action - tempval = rtw_read8(pAdapter, EFUSE_TEST+3); - tempval &= 0x0F; - tempval |= (VOLTAGE_V25 << 4); - rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); - } - } - else - { - rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF); - - if(bWrite == _TRUE){ - // Disable LDO 2.5V after read/write action - tempval = rtw_read8(pAdapter, EFUSE_TEST+3); - rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); - } - } -} - -static VOID -rtl8192c_EfusePowerSwitch( - IN PADAPTER pAdapter, - IN u8 bWrite, - IN u8 PwrState) -{ - if(IS_HARDWARE_TYPE_8192C(pAdapter)) - { - hal_EfusePowerSwitch_RTL8192C(pAdapter, bWrite, PwrState); - } - else if(IS_HARDWARE_TYPE_8723(pAdapter)) - { - hal_EfusePowerSwitch_RTL8723(pAdapter, bWrite, PwrState); - } -} - -static VOID -ReadEFuse_RTL8192C( - PADAPTER Adapter, - u16 _offset, - u16 _size_byte, - u8 *pbuf, - IN BOOLEAN bPseudoTest - ) -{ - u8 efuseTbl[EFUSE_MAP_LEN]; - u8 rtemp8[1]; - u16 eFuse_Addr = 0; - u8 offset, wren; - u16 i, j; - u16 eFuseWord[EFUSE_MAX_SECTION][EFUSE_MAX_WORD_UNIT]; - u16 efuse_utilized = 0; - u8 efuse_usage = 0; - - // - // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. - // - if((_offset + _size_byte)>EFUSE_MAP_LEN) - {// total E-Fuse table is 128bytes - //DBG_8192C("ReadEFuse_RTL8192C(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte); - return; - } - - // 0. Refresh efuse init map as all oxFF. - for (i = 0; i < EFUSE_MAX_SECTION; i++) - for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) - eFuseWord[i][j] = 0xFFFF; - - - // - // 1. Read the first byte to check if efuse is empty!!! - // - // - ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); - if(*rtemp8 != 0xFF) - { - efuse_utilized++; - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); - eFuse_Addr++; - } - - // - // 2. Read real efuse content. Filter PG header and every section data. - // - while((*rtemp8 != 0xFF) && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN)) - { - // Check PG header for section num. - offset = ((*rtemp8 >> 4) & 0x0f); - - if(offset < EFUSE_MAX_SECTION) - { - // Get word enable value from PG header - wren = (*rtemp8 & 0x0f); - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wren)); - - for(i=0; i= EFUSE_REAL_CONTENT_LEN) - break; - - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); - ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); eFuse_Addr++; - efuse_utilized++; - eFuseWord[offset][i] |= (((u16)*rtemp8 << 8) & 0xff00); - - if(eFuse_Addr >= EFUSE_REAL_CONTENT_LEN) - break; - } - - wren >>= 1; - - } - } - - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); - // Read next PG header - ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); - if(*rtemp8 != 0xFF && (eFuse_Addr < 512)) - { - efuse_utilized++; - eFuse_Addr++; - } - } - - // - // 3. Collect 16 sections and 4 word unit into Efuse map. - // - for(i=0; i> 8) & 0xff); - } - } - - // - // 4. Copy from Efuse map to output pointer memory!!! - // - for(i=0; i<_size_byte; i++) - { - pbuf[i] = efuseTbl[_offset+i]; - } - - // - // 5. Calculate Efuse utilization. - // - efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN); - Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized); - //Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage); -} - -static VOID -ReadEFuse_RTL8723( - PADAPTER Adapter, - u16 _offset, - u16 _size_byte, - u8 *pbuf, - IN BOOLEAN bPseudoTest - ) -{ - u8 efuseTbl[EFUSE_MAP_LEN_8723]; - u16 eFuse_Addr = 0; - u8 offset = 0, wden = 0; - u16 i, j; - u16 eFuseWord[EFUSE_MAX_SECTION_8723][EFUSE_MAX_WORD_UNIT]; - u16 efuse_utilized = 0; - u8 efuse_usage = 0; - u8 offset_2_0=0; - u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; - // - // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. - // - if((_offset + _size_byte)>EFUSE_MAP_LEN_8723) - { - //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_RTL8723(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte)); - return; - } - - // 0. Refresh efuse init map as all oxFF. - for (i = 0; i < EFUSE_MAX_SECTION_8723; i++) - for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) - eFuseWord[i][j] = 0xFFFF; - - // - // 1. Read the first byte to check if efuse is empty!!! - // - // - ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); - - if(efuseHeader != 0xFF) - { - efuse_utilized++; - } - else - { - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("EFUSE is empty\n")); - return; - } - - - // - // 2. Read real efuse content. Filter PG header and every section data. - // - while((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR(eFuse_Addr)) - { - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseHeader)); - - // Check PG header for section num. - if(EXT_HEADER(efuseHeader)) //extended header - { - offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader); - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("extended header offset_2_0=%x\n", offset_2_0)); - - ReadEFuseByte(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest); - - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseExtHdr)); - - if(efuseExtHdr != 0xff) - { - efuse_utilized++; - if(ALL_WORDS_DISABLED(efuseExtHdr)) - { - ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); - if(efuseHeader != 0xff) - { - efuse_utilized++; - } - continue; - } - else - { - offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0; - wden = (efuseExtHdr & 0x0F); - } - } - else - { - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n")); - // We should handle this condition. - } - } - else - { - offset = ((efuseHeader >> 4) & 0x0f); - wden = (efuseHeader & 0x0f); - } - - if(offset < EFUSE_MAX_SECTION_8723) - { - // Get word enable value from PG header - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden)); - - for(i=0; i> 8) & 0xff); - } - } - - // - // 4. Copy from Efuse map to output pointer memory!!! - // - for(i=0; i<_size_byte; i++) - { - pbuf[i] = efuseTbl[_offset+i]; - } - - // - // 5. Calculate Efuse utilization. - // - efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN); - Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized); - //Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage); -} - -static BOOLEAN -Hal_EfuseSwitchToBank( - IN PADAPTER pAdapter, - IN u8 bank, - IN BOOLEAN bPseudoTest - ) -{ - BOOLEAN bRet = _FALSE; - u32 value32=0; - - //RTPRINT(FEEPROM, EFUSE_PG, ("Efuse switch bank to %d\n", bank)); - if(bPseudoTest) - { - fakeEfuseBank = bank; - bRet = _TRUE; - } - else - { - if(IS_HARDWARE_TYPE_8723(pAdapter) && - INCLUDE_MULTI_FUNC_BT(pAdapter)) - { - value32 = rtw_read32(pAdapter, EFUSE_TEST); - bRet = _TRUE; - switch(bank) - { - case 0: - value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); - break; - case 1: - value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_0); - break; - case 2: - value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_1); - break; - case 3: - value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_2); - break; - default: - value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); - bRet = _FALSE; - break; - } - rtw_write32(pAdapter, EFUSE_TEST, value32); - } - else - bRet = _TRUE; - } - return bRet; -} - -static VOID -ReadEFuse_BT( - PADAPTER Adapter, - u16 _offset, - u16 _size_byte, - u8 *pbuf, - IN BOOLEAN bPseudoTest - ) -{ - u8 *efuseTbl; - u16 eFuse_Addr = 0; - u8 offset = 0, wden = 0; - u16 i, j; - u16 **eFuseWord; - u16 efuse_utilized = 0; - u8 efuse_usage = 0; - u8 offset_2_0=0; - u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; - u8 bank=0; - BOOLEAN bCheckNextBank=_FALSE; - - efuseTbl = rtw_malloc(EFUSE_BT_MAP_LEN); - if(efuseTbl == NULL){ - DBG_8192C("efuseTbl malloc fail !\n"); - return; - } - - eFuseWord = (u16 **)rtw_zmalloc(sizeof(u16 *)*EFUSE_BT_MAX_SECTION); - if(eFuseWord == NULL){ - DBG_8192C("eFuseWord malloc fail !\n"); - return; - } - else{ - for(i=0;iEFUSE_BT_MAP_LEN) - { - //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_BT(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte)); - return; - } - - // 0. Refresh efuse init map as all oxFF. - for (i = 0; i < EFUSE_BT_MAX_SECTION; i++) - for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) - eFuseWord[i][j] = 0xFFFF; - - for(bank=1; bank> 1) | offset_2_0; - wden = (efuseExtHdr & 0x0F); - } - } - else - { - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n")); - // We should handle this condition. - } - } - else - { - offset = ((efuseHeader >> 4) & 0x0f); - wden = (efuseHeader & 0x0f); - } - - if(offset < EFUSE_BT_MAX_SECTION) - { - // Get word enable value from PG header - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden)); - - for(i=0; i= EFUSE_REAL_CONTENT_LEN) - bCheckNextBank = _TRUE; - else - bCheckNextBank = _FALSE; - } - } - if(!bCheckNextBank) - { - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Stop to check next bank\n")); - break; - } - } - - // switch bank back to bank 0 for later BT and wifi use. - Hal_EfuseSwitchToBank(Adapter, 0, bPseudoTest); - - // - // 3. Collect 16 sections and 4 word unit into Efuse map. - // - for(i=0; i> 8) & 0xff); - } - } - - // - // 4. Copy from Efuse map to output pointer memory!!! - // - for(i=0; i<_size_byte; i++) - { - pbuf[i] = efuseTbl[_offset+i]; - } - - // - // 5. Calculate Efuse utilization. - // - efuse_usage = (u8)((efuse_utilized*100)/EFUSE_BT_REAL_CONTENT_LEN); - if(bPseudoTest) - { - fakeBTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1; - } - else - { - BTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1; - } - - for(i=0;i>4) & 0x0F; - hworden = efuse_data & 0x0F; - word_cnts = Efuse_CalculateWordCnts(hworden); - //read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - } - else - { - bContinual = _FALSE ; - } - } - - return efuse_addr; -} - -static u16 -Hal_EfuseGetCurrentSize_BT(IN PADAPTER pAdapter, - IN BOOLEAN bPseudoTest) -{ - int bContinual = _TRUE; - u16 efuse_addr = 0; - u8 hoffset=0,hworden=0; - u8 efuse_data,word_cnts=0; - u8 bank=0, startBank=0; - u16 retU2=0; - u32 total_efuse_used=0; - - if(bPseudoTest) - { - efuse_addr = (u16)((fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN)); - startBank = (u8)(1+(fakeBTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN)); - } - else - { - efuse_addr = (u16)((BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN)); - startBank = (u8)(1+(BTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN)); - } - - if((startBank < 1) || (startBank >= EFUSE_MAX_BANK)) - DBG_8192C("Error, bank error, bank=%d\n", bank); - - //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), start bank=%d, start_efuse_addr = %d\n", startBank, efuse_addr)); - - for(bank=startBank; bank> 5) | ((efuse_data & 0xF0) >> 1); - hworden = efuse_data & 0x0F; - } - } - else - { - hoffset = (efuse_data>>4) & 0x0F; - hworden = efuse_data & 0x0F; - } - word_cnts = Efuse_CalculateWordCnts(hworden); - //read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - } - else - { - bContinual = _FALSE ; - } - } - - // Check if we need to check next bank efuse - if(efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_PROTECT_BYTES_BANK)) - { - break;// don't need to check next bank. - } - } - - retU2 = ((bank-1)*EFUSE_REAL_CONTENT_LEN)+efuse_addr; - if(bPseudoTest) - { - fakeBTEfuseUsedBytes = retU2; - //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", fakeBTEfuseUsedBytes)); - } - else - { - BTEfuseUsedBytes = retU2; - //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", BTEfuseUsedBytes)); - } - - return retU2; -} - - -static u16 -hal_EfuseGetCurrentSize_8723(IN PADAPTER pAdapter, - IN BOOLEAN bPseudoTest) -{ - int bContinual = _TRUE; - - u16 efuse_addr = 0; - u8 hoffset=0,hworden=0; - u8 efuse_data,word_cnts=0; - - if(bPseudoTest) - { - efuse_addr = (u16)(fakeEfuseUsedBytes); - } - else - { - pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); - } - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), start_efuse_addr = %d\n", efuse_addr)); - - while ( bContinual && - efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) && - AVAILABLE_EFUSE_ADDR(efuse_addr)) - { - if(efuse_data!=0xFF) - { - if((efuse_data&0x1F) == 0x0F) //extended header - { - hoffset = efuse_data; - efuse_addr++; - efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); - if((efuse_data & 0x0F) == 0x0F) - { - efuse_addr++; - continue; - } - else - { - hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); - hworden = efuse_data & 0x0F; - } - } - else - { - hoffset = (efuse_data>>4) & 0x0F; - hworden = efuse_data & 0x0F; - } - word_cnts = Efuse_CalculateWordCnts(hworden); - //read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - } - else - { - bContinual = _FALSE ; - } - } - - if(bPseudoTest) - { - fakeEfuseUsedBytes = efuse_addr; - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", fakeEfuseUsedBytes)); - } - else - { - pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", efuse_addr)); - } - - return efuse_addr; -} - -static u16 -Hal_EfuseGetCurrentSize_Pseudo(IN PADAPTER pAdapter, - IN BOOLEAN bPseudoTest) -{ - u16 ret=0; - - ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest); - - return ret; -} - -static u16 -rtl8192c_EfuseGetCurrentSize( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN BOOLEAN bPseudoTest) -{ - u16 ret=0; - - if(efuseType == EFUSE_WIFI) - { - if(bPseudoTest) - { - ret = Hal_EfuseGetCurrentSize_Pseudo(pAdapter, bPseudoTest); - } - else - { - if(IS_HARDWARE_TYPE_8192C(pAdapter)) - { - ret = hal_EfuseGetCurrentSize_8192C(pAdapter, bPseudoTest); - } - else if(IS_HARDWARE_TYPE_8723(pAdapter)) - { - ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest); - } - } - } - else - { - ret = Hal_EfuseGetCurrentSize_BT(pAdapter, bPseudoTest); - } - - return ret; -} - -static int -hal_EfusePgPacketRead_8192C( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - u8 ReadState = PG_STATE_HEADER; - - int bContinual = _TRUE; - int bDataEmpty = _TRUE ; - - u8 efuse_data,word_cnts=0; - u16 efuse_addr = 0; - u8 hoffset=0,hworden=0; - u8 tmpidx=0; - u8 tmpdata[8]; - - if(data==NULL) return _FALSE; - if(offset>15) return _FALSE; - - - _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); - _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); - - // - // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. - // Skip dummy parts to prevent unexpected data read from Efuse. - // By pass right now. 2009.02.19. - // - while(bContinual && (efuse_addr < EFUSE_REAL_CONTENT_LEN) ) - { - //------- Header Read ------------- - if(ReadState & PG_STATE_HEADER) - { - if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)){ - hoffset = (efuse_data>>4) & 0x0F; - hworden = efuse_data & 0x0F; - word_cnts = Efuse_CalculateWordCnts(hworden); - bDataEmpty = _TRUE ; - - if(hoffset==offset){ - for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){ - if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ){ - tmpdata[tmpidx] = efuse_data; - if(efuse_data!=0xff){ - bDataEmpty = _FALSE; - } - } - } - if(bDataEmpty==_FALSE){ - ReadState = PG_STATE_DATA; - }else{//read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - } - else{//read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - - } - else{ - bContinual = _FALSE ; - } - } - //------- Data section Read ------------- - else if(ReadState & PG_STATE_DATA) - { - efuse_WordEnableDataRead(hworden,tmpdata,data); - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - - } - - if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && - (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) - return _FALSE; - else - return _TRUE; - -} - -static int -hal_EfusePgPacketRead_8723( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - u8 ReadState = PG_STATE_HEADER; - - int bContinual = _TRUE; - int bDataEmpty = _TRUE ; - - u8 efuse_data,word_cnts=0; - u16 efuse_addr = 0; - u8 hoffset=0,hworden=0; - u8 tmpidx=0; - u8 tmpdata[8]; - u8 max_section=0; - u8 tmp_header = 0; - - EFUSE_GetEfuseDefinition(pAdapter, EFUSE_WIFI, TYPE_EFUSE_MAX_SECTION, (PVOID)&max_section, bPseudoTest); - - if(data==NULL) - return _FALSE; - if(offset>max_section) - return _FALSE; - - _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); - _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); - - - // - // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. - // Skip dummy parts to prevent unexpected data read from Efuse. - // By pass right now. 2009.02.19. - // - while(bContinual && AVAILABLE_EFUSE_ADDR(efuse_addr) ) - { - //------- Header Read ------------- - if(ReadState & PG_STATE_HEADER) - { - if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)) - { - if(EXT_HEADER(efuse_data)) - { - tmp_header = efuse_data; - efuse_addr++; - efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); - if(!ALL_WORDS_DISABLED(efuse_data)) - { - hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); - hworden = efuse_data & 0x0F; - } - else - { - DBG_8192C("Error, All words disabled\n"); - efuse_addr++; - continue; - } - } - else - { - hoffset = (efuse_data>>4) & 0x0F; - hworden = efuse_data & 0x0F; - } - word_cnts = Efuse_CalculateWordCnts(hworden); - bDataEmpty = _TRUE ; - - if(hoffset==offset) - { - for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++) - { - if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ) - { - tmpdata[tmpidx] = efuse_data; - if(efuse_data!=0xff) - { - bDataEmpty = _FALSE; - } - } - } - if(bDataEmpty==_FALSE){ - ReadState = PG_STATE_DATA; - }else{//read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - } - else{//read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - - } - else{ - bContinual = _FALSE ; - } - } - //------- Data section Read ------------- - else if(ReadState & PG_STATE_DATA) - { - efuse_WordEnableDataRead(hworden,tmpdata,data); - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - - } - - if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && - (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) - return _FALSE; - else - return _TRUE; - -} - -static int -Hal_EfusePgPacketRead( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret=0; - - if(IS_HARDWARE_TYPE_8192C(pAdapter)) - { - ret = hal_EfusePgPacketRead_8192C(pAdapter, offset, data, bPseudoTest); - } - else if(IS_HARDWARE_TYPE_8723(pAdapter)) - { - ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest); - } - - return ret; -} - -static int -Hal_EfusePgPacketRead_Pseudo( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret=0; - - ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest); - - return ret; -} - -static int -rtl8192c_Efuse_PgPacketRead( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret=0; - - if(bPseudoTest) - { - ret = Hal_EfusePgPacketRead_Pseudo(pAdapter, offset, data, bPseudoTest); - } - else - { - ret = Hal_EfusePgPacketRead(pAdapter, offset, data, bPseudoTest); - } - - return ret; -} - -static BOOLEAN -hal_EfuseFixHeaderProcess( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN PPGPKT_STRUCT pFixPkt, - IN u16 *pAddr, - IN BOOLEAN bPseudoTest -) -{ - u8 originaldata[8], badworden=0; - u16 efuse_addr=*pAddr; - u32 PgWriteSuccess=0; - - _rtw_memset((PVOID)originaldata, 0xff, 8); - - if(Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest)) - { //check if data exist - badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest); - - if(badworden != 0xf) // write fail - { - if(efuseType == EFUSE_WIFI) - PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); - else - PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); - if(!PgWriteSuccess) - return _FALSE; - else - efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); - } - else - { - efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; - } - } - else - { - efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; - } - *pAddr = efuse_addr; - return _TRUE; -} - -static BOOLEAN -hal_EfusePgPacketWrite2ByteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - BOOLEAN bRet=_FALSE, bContinual=_TRUE; - u16 efuse_addr=*pAddr, efuse_max_available_len=0; - u8 pg_header=0, tmp_header=0, pg_header_temp=0; - u8 repeatcnt=0; - - //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 2byte header\n")); - EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest); - - while(efuse_addr < efuse_max_available_len) - { - pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; - //RTPRINT(FEEPROM, EFUSE_PG, ("pg_header = 0x%x\n", pg_header)); - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - - while(tmp_header == 0xFF) - { - if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) - { - //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for pg_header!!\n")); - return _FALSE; - } - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - } - - //to write ext_header - if(tmp_header == pg_header) - { - efuse_addr++; - pg_header_temp = pg_header; - pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - - while(tmp_header == 0xFF) - { - if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) - { - //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for ext_header!!\n")); - return _FALSE; - } - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - } - - if((tmp_header & 0x0F) == 0x0F) //word_en PG fail - { - if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) - { - //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for word_en!!\n")); - return _FALSE; - } - else - { - efuse_addr++; - continue; - } - } - else if(pg_header != tmp_header) //offset PG fail - { - PGPKT_STRUCT fixPkt; - //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for offset PG fail, need to cover the existed data\n")); - fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1); - fixPkt.word_en = tmp_header & 0x0F; - fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); - if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) - return _FALSE; - } - else - { - bRet = _TRUE; - break; - } - } - else if ((tmp_header & 0x1F) == 0x0F) //wrong extended header - { - efuse_addr+=2; - continue; - } - } - - *pAddr = efuse_addr; - return bRet; -} - -static BOOLEAN -hal_EfusePgPacketWrite1ByteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - BOOLEAN bRet=_FALSE; - u8 pg_header=0, tmp_header=0; - u16 efuse_addr=*pAddr; - u8 repeatcnt=0; - - //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 1byte header\n")); - pg_header = ((pTargetPkt->offset << 4) & 0xf0) |pTargetPkt->word_en; - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - - while(tmp_header == 0xFF) - { - if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) - { - return _FALSE; - } - efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); - } - - if(pg_header == tmp_header) - { - bRet = _TRUE; - } - else - { - PGPKT_STRUCT fixPkt; - //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for fixed PG packet, need to cover the existed data\n")); - fixPkt.offset = (tmp_header>>4) & 0x0F; - fixPkt.word_en = tmp_header & 0x0F; - fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); - if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) - return _FALSE; - } - - *pAddr = efuse_addr; - return bRet; -} - -static BOOLEAN -hal_EfusePgPacketWriteData( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - BOOLEAN bRet=_FALSE; - u16 efuse_addr=*pAddr; - u8 badworden=0; - u32 PgWriteSuccess=0; - - badworden = 0x0f; - badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); - if(badworden == 0x0F) - { - // write ok - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData ok!!\n")); - return _TRUE; - } - else - { - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData Fail!!\n")); - //reorganize other pg packet - if(efuseType == EFUSE_WIFI) - PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); - else - PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); - if(!PgWriteSuccess) - return _FALSE; - else - return _TRUE; - } - - return bRet; -} - -static BOOLEAN -hal_EfusePgPacketWriteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - BOOLEAN bRet=_FALSE; - - if(pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE) - { - bRet = hal_EfusePgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); - } - else - { - bRet = hal_EfusePgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); - } - - return bRet; -} - -static BOOLEAN -hal_EfusePgCheckAvailableAddr( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN BOOLEAN bPseudoTest - ) -{ - u16 efuse_max_available_len=0; - - EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&efuse_max_available_len, bPseudoTest); - //RTPRINT(FEEPROM, EFUSE_PG, ("efuse_max_available_len = %d\n", efuse_max_available_len)); - - if(Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= efuse_max_available_len) - { - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgCheckAvailableAddr error!!\n")); - return _FALSE; - } - return _TRUE; -} - -static VOID -hal_EfuseConstructPGPkt( - IN u8 offset, - IN u8 word_en, - IN u8 *pData, - IN PPGPKT_STRUCT pTargetPkt - -) -{ - _rtw_memset((PVOID)pTargetPkt->data, 0xFF, sizeof(u8)*8); - pTargetPkt->offset = offset; - pTargetPkt->word_en= word_en; - efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data); - pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); - - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseConstructPGPkt(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\n", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts)); -} - -static BOOLEAN -hal_EfuseCheckIfDatafollowed( - IN PADAPTER pAdapter, - IN u8 word_cnts, - IN u16 startAddr, - IN BOOLEAN bPseudoTest - ) -{ - BOOLEAN bRet=_FALSE; - u8 i, efuse_data; - - for(i=0; i<(word_cnts*2) ; i++) - { - if(efuse_OneByteRead(pAdapter, (startAddr+i) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)) - bRet = _TRUE; - } - - return bRet; -} - -static BOOLEAN -wordEnMatched( - IN PPGPKT_STRUCT pTargetPkt, - IN PPGPKT_STRUCT pCurPkt, - IN u8 *pWden -) -{ - u8 match_word_en = 0x0F; // default all words are disabled - u8 i; - - // check if the same words are enabled both target and current PG packet - if( ((pTargetPkt->word_en & BIT0) == 0) && - ((pCurPkt->word_en & BIT0) == 0) ) - { - match_word_en &= ~BIT0; // enable word 0 - } - if( ((pTargetPkt->word_en & BIT1) == 0) && - ((pCurPkt->word_en & BIT1) == 0) ) - { - match_word_en &= ~BIT1; // enable word 1 - } - if( ((pTargetPkt->word_en & BIT2) == 0) && - ((pCurPkt->word_en & BIT2) == 0) ) - { - match_word_en &= ~BIT2; // enable word 2 - } - if( ((pTargetPkt->word_en & BIT3) == 0) && - ((pCurPkt->word_en & BIT3) == 0) ) - { - match_word_en &= ~BIT3; // enable word 3 - } - - *pWden = match_word_en; - - if(match_word_en != 0xf) - return _TRUE; - else - return _FALSE; -} - -static BOOLEAN -hal_EfusePartialWriteCheck( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16 *pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest - ) -{ - BOOLEAN bRet=_FALSE; - u8 i, efuse_data=0, cur_header=0; - u8 new_wden=0, matched_wden=0, badworden=0; - u16 startAddr=0, efuse_max_available_len=0, efuse_max=0; - PGPKT_STRUCT curPkt; - - EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest); - EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&efuse_max, bPseudoTest); - - if(efuseType == EFUSE_WIFI) - { - if(bPseudoTest) - { - startAddr = (u16)(fakeEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); - } - else - { - pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&startAddr); - startAddr%=EFUSE_REAL_CONTENT_LEN; - } - } - else - { - if(bPseudoTest) - { - startAddr = (u16)(fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); - } - else - { - startAddr = (u16)(BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); - } - } - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePartialWriteCheck(), startAddr=%d\n", startAddr)); - - while(1) - { - if(startAddr >= efuse_max_available_len) - { - bRet = _FALSE; - break; - } - - if(efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data!=0xFF)) - { - if(EXT_HEADER(efuse_data)) - { - cur_header = efuse_data; - startAddr++; - efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); - if(ALL_WORDS_DISABLED(efuse_data)) - { - //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition, all words disabled")); - bRet = _FALSE; - break; - } - else - { - curPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); - curPkt.word_en = efuse_data & 0x0F; - } - } - else - { - cur_header = efuse_data; - curPkt.offset = (cur_header>>4) & 0x0F; - curPkt.word_en = cur_header & 0x0F; - } - - curPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en); - // if same header is found but no data followed - // write some part of data followed by the header. - if( (curPkt.offset == pTargetPkt->offset) && - (!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr+1, bPseudoTest)) && - wordEnMatched(pTargetPkt, &curPkt, &matched_wden) ) - { - //RTPRINT(FEEPROM, EFUSE_PG, ("Need to partial write data by the previous wrote header\n")); - // Here to write partial data - badworden = Efuse_WordEnableDataWrite(pAdapter, startAddr+1, matched_wden, pTargetPkt->data, bPseudoTest); - if(badworden != 0x0F) - { - u32 PgWriteSuccess=0; - // if write fail on some words, write these bad words again - if(efuseType == EFUSE_WIFI) - PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); - else - PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); - - if(!PgWriteSuccess) - { - bRet = _FALSE; // write fail, return - break; - } - } - // partial write ok, update the target packet for later use - for(i=0; i<4; i++) - { - if((matched_wden & (0x1<word_en |= (0x1<word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); - } - // read from next header - startAddr = startAddr + (curPkt.word_cnts*2) +1; - } - else - { - // not used header, 0xff - *pAddr = startAddr; - //RTPRINT(FEEPROM, EFUSE_PG, ("Started from unused header offset=%d\n", startAddr)); - bRet = _TRUE; - break; - } - } - return bRet; -} - -static BOOLEAN -hal_EfusePgPacketWrite_BT( - IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *pData, - IN BOOLEAN bPseudoTest - ) -{ - PGPKT_STRUCT targetPkt; - u16 startAddr=0; - u8 efuseType=EFUSE_BT; - - if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest)) - return _FALSE; - - hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); - - if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - return _FALSE; - - if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - return _FALSE; - - if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - return _FALSE; - - return _TRUE; -} - -static BOOLEAN -hal_EfusePgPacketWrite_8723( - IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *pData, - IN BOOLEAN bPseudoTest - ) -{ - PGPKT_STRUCT targetPkt; - u16 startAddr=0; - u8 efuseType=EFUSE_WIFI; - - if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest)) - return _FALSE; - - hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); - - if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - return _FALSE; - - if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - return _FALSE; - - if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - return _FALSE; - - return _TRUE; -} - -static int -hal_EfusePgPacketWrite_8192C(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - u8 WriteState = PG_STATE_HEADER; - - int bContinual = _TRUE,bDataEmpty=_TRUE, bResult = _TRUE; - u16 efuse_addr = 0; - u8 efuse_data; - - u8 pg_header = 0; - - u8 tmp_word_cnts=0,target_word_cnts=0; - u8 tmp_header,match_word_en,tmp_word_en; - - PGPKT_STRUCT target_pkt; - PGPKT_STRUCT tmp_pkt; - - u8 originaldata[sizeof(u8)*8]; - u8 tmpindex = 0,badworden = 0x0F; - - static int repeat_times = 0; - u8 efuseType=EFUSE_WIFI; - - // - // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. - // So we have to prevent unexpected data string connection, which will cause - // incorrect data auto-load from HW. The total size is equal or smaller than 498bytes - // (i.e., offset 0~497, and dummy 1bytes) expected after CP test. - // 2009.02.19. - // - if( Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) - { - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWrite_8192C(), over size\n")); - return _FALSE; - } - - // Init the 8 bytes content as 0xff - target_pkt.offset = offset; - target_pkt.word_en= word_en; - - _rtw_memset((PVOID)target_pkt.data, 0xFF, sizeof(u8)*8); - - efuse_WordEnableDataRead(word_en,data,target_pkt.data); - target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en); - - //efuse_reg_ctrl(pAdapter,_TRUE);//power on - //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE Power ON\n")); - - // - // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. - // So we have to prevent unexpected data string connection, which will cause - // incorrect data auto-load from HW. Dummy 1bytes is additional. - // 2009.02.19. - // - while( bContinual && (efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) ) - { - - if(WriteState==PG_STATE_HEADER) - { - bDataEmpty=_TRUE; - badworden = 0x0F; - //************ so ******************* - //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER\n")); - if ( efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) && - (efuse_data!=0xFF)) - { - tmp_header = efuse_data; - - tmp_pkt.offset = (tmp_header>>4) & 0x0F; - tmp_pkt.word_en = tmp_header & 0x0F; - tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en); - - //************ so-1 ******************* - if(tmp_pkt.offset != target_pkt.offset) - { - efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet - #if (EFUSE_ERROE_HANDLE == 1) - WriteState = PG_STATE_HEADER; - #endif - } - else - { - //************ so-2 ******************* - for(tmpindex=0 ; tmpindex<(tmp_word_cnts*2) ; tmpindex++) - { - if(efuse_OneByteRead(pAdapter, (efuse_addr+1+tmpindex) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)){ - bDataEmpty = _FALSE; - } - } - //************ so-2-1 ******************* - if(bDataEmpty == _FALSE) - { - efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet - #if (EFUSE_ERROE_HANDLE == 1) - WriteState=PG_STATE_HEADER; - #endif - } - else - {//************ so-2-2 ******************* - match_word_en = 0x0F; - if( !( (target_pkt.word_en&BIT0)|(tmp_pkt.word_en&BIT0) )) - { - match_word_en &= (~BIT0); - } - if( !( (target_pkt.word_en&BIT1)|(tmp_pkt.word_en&BIT1) )) - { - match_word_en &= (~BIT1); - } - if( !( (target_pkt.word_en&BIT2)|(tmp_pkt.word_en&BIT2) )) - { - match_word_en &= (~BIT2); - } - if( !( (target_pkt.word_en&BIT3)|(tmp_pkt.word_en&BIT3) )) - { - match_word_en &= (~BIT3); - } - - //************ so-2-2-A ******************* - if((match_word_en&0x0F)!=0x0F) - { - badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1, tmp_pkt.word_en ,target_pkt.data, bPseudoTest); - - //************ so-2-2-A-1 ******************* - //############################ - if(0x0F != (badworden&0x0F)) - { - u8 reorg_offset = offset; - u8 reorg_worden=badworden; - Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest); - } - //############################ - - tmp_word_en = 0x0F; - if( (target_pkt.word_en&BIT0)^(match_word_en&BIT0) ) - { - tmp_word_en &= (~BIT0); - } - if( (target_pkt.word_en&BIT1)^(match_word_en&BIT1) ) - { - tmp_word_en &= (~BIT1); - } - if( (target_pkt.word_en&BIT2)^(match_word_en&BIT2) ) - { - tmp_word_en &= (~BIT2); - } - if( (target_pkt.word_en&BIT3)^(match_word_en&BIT3) ) - { - tmp_word_en &=(~BIT3); - } - - //************ so-2-2-A-2 ******************* - if((tmp_word_en&0x0F)!=0x0F){ - //reorganize other pg packet - //efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr - efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); - //=========================== - target_pkt.offset = offset; - target_pkt.word_en= tmp_word_en; - //=========================== - }else{ - bContinual = _FALSE; - } - #if (EFUSE_ERROE_HANDLE == 1) - WriteState=PG_STATE_HEADER; - repeat_times++; - if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ - bContinual = _FALSE; - bResult = _FALSE; - } - #endif - } - else{//************ so-2-2-B ******************* - //reorganize other pg packet - efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr - //=========================== - target_pkt.offset = offset; - target_pkt.word_en= target_pkt.word_en; - //=========================== - #if (EFUSE_ERROE_HANDLE == 1) - WriteState=PG_STATE_HEADER; - #endif - } - } - } - //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-1\n")); - } - else //************ s1: header == oxff ******************* - { - pg_header = ((target_pkt.offset << 4)&0xf0) |target_pkt.word_en; - - efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); - - if(tmp_header == pg_header) - { //************ s1-1******************* - WriteState = PG_STATE_DATA; - } - #if (EFUSE_ERROE_HANDLE == 1) - else if(tmp_header == 0xFF){//************ s1-3: if Write or read func doesn't work ******************* - //efuse_addr doesn't change - WriteState = PG_STATE_HEADER; - repeat_times++; - if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ - bContinual = _FALSE; - bResult = _FALSE; - } - } - #endif - else - {//************ s1-2 : fixed the header procedure ******************* - tmp_pkt.offset = (tmp_header>>4) & 0x0F; - tmp_pkt.word_en= tmp_header & 0x0F; - tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en); - - //************ s1-2-A :cover the exist data ******************* - //memset(originaldata,0xff,sizeof(UINT8)*8); - _rtw_memset((PVOID)originaldata, 0xff, sizeof(u8)*8); - - if(Efuse_PgPacketRead( pAdapter, tmp_pkt.offset,originaldata, bPseudoTest)) - { //check if data exist - //efuse_reg_ctrl(pAdapter,_TRUE);//power on - badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,tmp_pkt.word_en,originaldata, bPseudoTest); - //############################ - if(0x0F != (badworden&0x0F)) - { - u8 reorg_offset = tmp_pkt.offset; - u8 reorg_worden=badworden; - Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest); - efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); - } - //############################ - else{ - efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet - } - } - //************ s1-2-B: wrong address******************* - else - { - efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet - } - - #if (EFUSE_ERROE_HANDLE == 1) - WriteState=PG_STATE_HEADER; - repeat_times++; - if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ - bContinual = _FALSE; - bResult = _FALSE; - } - #endif - - //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-2\n")); - } - - } - - } - //write data state - else if(WriteState==PG_STATE_DATA) - { //************ s1-1 ******************* - //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_DATA\n")); - badworden = 0x0f; - badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,target_pkt.word_en,target_pkt.data, bPseudoTest); - if((badworden&0x0F)==0x0F) - { //************ s1-1-A ******************* - bContinual = _FALSE; - } - else - {//reorganize other pg packet //************ s1-1-B ******************* - efuse_addr = efuse_addr + (2*target_word_cnts) +1;//next pg packet addr - - //=========================== - target_pkt.offset = offset; - target_pkt.word_en= badworden; - target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en); - //=========================== - #if (EFUSE_ERROE_HANDLE == 1) - WriteState=PG_STATE_HEADER; - repeat_times++; - if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ - bContinual = _FALSE; - bResult = _FALSE; - } - #endif - //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-3\n")); - } - } - } - - if(efuse_addr >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) - { - //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("hal_EfusePgPacketWrite_8192C(): efuse_addr(%#x) Out of size!!\n", efuse_addr)); - } - //efuse_reg_ctrl(pAdapter,_FALSE);//power off - - return _TRUE; -} - -static int -Hal_EfusePgPacketWrite_Pseudo(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret; - - ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest); - - return ret; -} - -static int -Hal_EfusePgPacketWrite(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret=0; - - if(IS_HARDWARE_TYPE_8192C(pAdapter)) - { - ret = hal_EfusePgPacketWrite_8192C(pAdapter, offset, word_en, data, bPseudoTest); - } - else if(IS_HARDWARE_TYPE_8723(pAdapter)) - { - ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest); - } - - return ret; -} - -static int -rtl8192c_Efuse_PgPacketWrite(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret; - - if(bPseudoTest) - { - ret = Hal_EfusePgPacketWrite_Pseudo(pAdapter, offset, word_en, data, bPseudoTest); - } - else - { - ret = Hal_EfusePgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest); - } - return ret; -} - -VOID -rtl8192c_EfuseParseIDCode( - IN PADAPTER pAdapter, - IN u8 *hwinfo - ) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u16 i,EEPROMId; - - // Checl 0x8129 again for making sure autoload status!! - EEPROMId = *((u16 *)&hwinfo[0]); - if( EEPROMId != RTL_EEPROM_ID) - { - DBG_8192C("EEPROM ID(%#x) is invalid!!\n", EEPROMId); - pEEPROM->bautoload_fail_flag = _TRUE; - } - else - { - pEEPROM->bautoload_fail_flag = _FALSE; - } - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("EEPROM ID = 0x%4x\n", EEPROMId)); -} - -void rtl8192c_read_chip_version(PADAPTER pAdapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - pHalData->VersionID = rtl8192c_ReadChipVersion(pAdapter); -} - -void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc) -{ - pHalFunc->free_hal_data = &rtl8192c_free_hal_data; - - pHalFunc->dm_init = &rtl8192c_init_dm_priv; - pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv; - pHalFunc->read_chip_version = &rtl8192c_read_chip_version; - - pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C; - pHalFunc->set_channel_handler = &PHY_SwChnl8192C; - - pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog; - - pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid; - -#ifdef CONFIG_ANTENNA_DIVERSITY - pHalFunc->SwAntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C; - pHalFunc->SwAntDivCompareHandler = &SwAntDivCompare8192C; -#endif - - pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg; - pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg; - pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg; - pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg; - - //Efuse related function - pHalFunc->EfusePowerSwitch = &rtl8192c_EfusePowerSwitch; - pHalFunc->ReadEFuse = &rtl8192c_ReadEFuse; - pHalFunc->EFUSEGetEfuseDefinition = &rtl8192c_EFUSE_GetEfuseDefinition; - pHalFunc->EfuseGetCurrentSize = &rtl8192c_EfuseGetCurrentSize; - pHalFunc->Efuse_PgPacketRead = &rtl8192c_Efuse_PgPacketRead; - pHalFunc->Efuse_PgPacketWrite = &rtl8192c_Efuse_PgPacketWrite; - pHalFunc->Efuse_WordEnableDataWrite = &rtl8192c_Efuse_WordEnableDataWrite; - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - pHalFunc->sreset_init_value = &rtl8192c_sreset_init_value; - pHalFunc->sreset_reset_value = &rtl8192c_sreset_reset_value; - pHalFunc->silentreset = &rtl8192c_silentreset_for_specific_platform; - pHalFunc->sreset_xmit_status_check = &rtl8192c_sreset_xmit_status_check; - pHalFunc->sreset_linked_status_check = &rtl8192c_sreset_linked_status_check; - pHalFunc->sreset_get_wifi_status = &rtl8192c_sreset_get_wifi_status; -#endif - -} - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c deleted file mode 100755 index 35f9c708e6a5..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c +++ /dev/null @@ -1,5415 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -/****************************************************************************** - - Module: rtl8192c_phycfg.c - - Note: Merge 92SE/SU PHY config as below - 1. BB register R/W API - 2. RF register R/W API - 3. Initial BB/RF/MAC config by reading BB/MAC/RF txt. - 3. Power setting API - 4. Channel switch API - 5. Initial gain switch API. - 6. Other BB/MAC/RF API. - - Function: PHY: Extern function, phy: local function - - Export: PHY_FunctionName - - Abbrev: NONE - - History: - Data Who Remark - 08/08/2008 MHC 1. Port from 9x series phycfg.c - 2. Reorganize code arch and ad description. - 3. Collect similar function. - 4. Seperate extern/local API. - 08/12/2008 MHC We must merge or move USB PHY relative function later. - 10/07/2008 MHC Add IQ calibration for PHY.(Only 1T2R mode now!!!) - 11/06/2008 MHC Add TX Power index PG file to config in 0xExx register - area to map with EEPROM/EFUSE tx pwr index. - -******************************************************************************/ -#define _HAL_8192C_PHYCFG_C_ - -#include -#include -#include -#include - -#include - - -/*---------------------------Define Local Constant---------------------------*/ -/* Channel switch:The size of command tables for switch channel*/ -#define MAX_PRECMD_CNT 16 -#define MAX_RFDEPENDCMD_CNT 16 -#define MAX_POSTCMD_CNT 16 - -#define MAX_DOZE_WAITING_TIMES_9x 64 - -/*---------------------------Define Local Constant---------------------------*/ - - -/*------------------------Define global variable-----------------------------*/ - -/*------------------------Define local variable------------------------------*/ - - -/*--------------------Define export function prototype-----------------------*/ -// Please refer to header file -/*--------------------Define export function prototype-----------------------*/ - -/*----------------------------Function Body----------------------------------*/ -// -// 1. BB register R/W API -// - -/** -* Function: phy_CalculateBitShift -* -* OverView: Get shifted position of the BitMask -* -* Input: -* u4Byte BitMask, -* -* Output: none -* Return: u4Byte Return the shift bit bit position of the mask -*/ -static u32 -phy_CalculateBitShift( - u32 BitMask - ) -{ - u32 i; - - for(i=0; i<=31; i++) - { - if ( ((BitMask>>i) & 0x1 ) == 1) - break; - } - - return (i); -} - - -/** -* Function: PHY_QueryBBReg -* -* OverView: Read "sepcific bits" from BB register -* -* Input: -* PADAPTER Adapter, -* u4Byte RegAddr, //The target address to be readback -* u4Byte BitMask //The target bit position in the target address -* //to be readback -* Output: None -* Return: u4Byte Data //The readback register value -* Note: This function is equal to "GetRegSetting" in PHY programming guide -*/ -u32 -rtl8192c_PHY_QueryBBReg( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 ReturnValue = 0, OriginalValue, BitShift; - u16 BBWaitCounter = 0; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask)); - - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = phy_CalculateBitShift(BitMask); - ReturnValue = (OriginalValue & BitMask) >> BitShift; - - //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, OriginalValue)); - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx), OriginalValue(%#lx)\n", RegAddr, BitMask, OriginalValue)); - - return (ReturnValue); - -} - - -/** -* Function: PHY_SetBBReg -* -* OverView: Write "Specific bits" to BB register (page 8~) -* -* Input: -* PADAPTER Adapter, -* u4Byte RegAddr, //The target address to be modified -* u4Byte BitMask //The target bit position in the target address -* //to be modified -* u4Byte Data //The new register value in the target bit position -* //of the target address -* -* Output: None -* Return: None -* Note: This function is equal to "PutRegSetting" in PHY programming guide -*/ - -VOID -rtl8192c_PHY_SetBBReg( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //u16 BBWaitCounter = 0; - u32 OriginalValue, BitShift; - -#if (DISABLE_BB_RF == 1) - return; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); - - if(BitMask!= bMaskDWord){//if not "double word" write - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = phy_CalculateBitShift(BitMask); - Data = ((OriginalValue & (~BitMask)) | (Data << BitShift)); - } - - rtw_write32(Adapter, RegAddr, Data); - - //RTPRINT(FPHY, PHY_BBW, ("BBW MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, Data)); - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); - -} - - -// -// 2. RF register R/W API -// - -/*----------------------------------------------------------------------------- - * Function: phy_FwRFSerialRead() - * - * Overview: We support firmware to execute RF-R/W. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/21/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -static u32 -phy_FwRFSerialRead( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset ) -{ - u32 retValue = 0; - //RT_ASSERT(FALSE,("deprecate!\n")); - return (retValue); - -} /* phy_FwRFSerialRead */ - - -/*----------------------------------------------------------------------------- - * Function: phy_FwRFSerialWrite() - * - * Overview: We support firmware to execute RF-R/W. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 01/21/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -static VOID -phy_FwRFSerialWrite( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u32 Data ) -{ - //RT_ASSERT(FALSE,("deprecate!\n")); -} - - -/** -* Function: phy_RFSerialRead -* -* OverView: Read regster from RF chips -* -* Input: -* PADAPTER Adapter, -* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte Offset, //The target address to be read -* -* Output: None -* Return: u4Byte reback value -* Note: Threre are three types of serial operations: -* 1. Software serial write -* 2. Hardware LSSI-Low Speed Serial Interface -* 3. Hardware HSSI-High speed -* serial write. Driver need to implement (1) and (2). -* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() -*/ -static u32 -phy_RFSerialRead( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset - ) -{ - u32 retValue = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; - u32 NewOffset; - u32 tmplong,tmplong2; - u8 RfPiEnable=0; -#if 0 - if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs - return retValue; - if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs - return retValue; -#endif - // - // Make sure RF register offset is correct - // - Offset &= 0x3f; - - // - // Switch page for 8256 RF IC - // - NewOffset = Offset; - - // 2009/06/17 MH We can not execute IO for power save or other accident mode. - //if(RT_CANNOT_IO(Adapter)) - //{ - // RTPRINT(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n")); - // return 0xFFFFFFFF; - //} - - // For 92S LSSI Read RFLSSIRead - // For RF A/B write 0x824/82c(does not work in the future) - // We must use 0x824 for RF A and B to execute read trigger - tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord); - if(eRFPath == RF90_PATH_A) - tmplong2 = tmplong; - else - tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord); - - tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF - - PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge)); - rtw_udelay_os(10);// PlatformStallExecution(10); - //rtw_mdelay_os(1); - - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2); - rtw_udelay_os(100);//PlatformStallExecution(100); - //rtw_mdelay_os(1); - - PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge); - rtw_udelay_os(10);//PlatformStallExecution(10); - //rtw_mdelay_os(1); - - PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge)); - rtw_udelay_os(10);// PlatformStallExecution(10); - - if(eRFPath == RF90_PATH_A) - RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT8); - else if(eRFPath == RF90_PATH_B) - RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT8); - - if(RfPiEnable) - { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF - retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData); - //DBG_8192C("Readback from RF-PI : 0x%x\n", retValue); - } - else - { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF - retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData); - //DBG_8192C("Readback from RF-SI : 0x%x\n", retValue); - } - //DBG_8192C("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue); - - return retValue; - -} - - - -/** -* Function: phy_RFSerialWrite -* -* OverView: Write data to RF register (page 8~) -* -* Input: -* PADAPTER Adapter, -* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte Offset, //The target address to be read -* u4Byte Data //The new register Data in the target bit position -* //of the target to be read -* -* Output: None -* Return: None -* Note: Threre are three types of serial operations: -* 1. Software serial write -* 2. Hardware LSSI-Low Speed Serial Interface -* 3. Hardware HSSI-High speed -* serial write. Driver need to implement (1) and (2). -* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() - * - * Note: For RF8256 only - * The total count of RTL8256(Zebra4) register is around 36 bit it only employs - * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10]) - * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration - * programming guide" for more details. - * Thus, we define a sub-finction for RTL8526 register address conversion - * =========================================================== - * Register Mode RegCTL[1] RegCTL[0] Note - * (Reg00[12]) (Reg00[10]) - * =========================================================== - * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf) - * ------------------------------------------------------------------ - * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf) - * ------------------------------------------------------------------ - * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf) - * ------------------------------------------------------------------ - * - * 2008/09/02 MH Add 92S RF definition - * - * - * -*/ -static VOID -phy_RFSerialWrite( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u32 Data - ) -{ - u32 DataAndAddr = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; - u32 NewOffset; - -#if 0 - // We should check valid regs for RF_6052 case. - if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs - return; - if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs - return; -#endif - - // 2009/06/17 MH We can not execute IO for power save or other accident mode. - //if(RT_CANNOT_IO(Adapter)) - //{ - // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); - // return; - //} - - Offset &= 0x3f; - - // - // Shadow Update - // - //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); - - // - // Switch page for 8256 RF IC - // - NewOffset = Offset; - - // - // Put write addr in [5:0] and write data in [31:16] - // - //DataAndAddr = (Data<<16) | (NewOffset&0x3f); - DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF - - // - // Write Operation - // - PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); - //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr)); - -} - - -/** -* Function: PHY_QueryRFReg -* -* OverView: Query "Specific bits" to RF register (page 8~) -* -* Input: -* PADAPTER Adapter, -* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte RegAddr, //The target address to be read -* u4Byte BitMask //The target bit position in the target address -* //to be read -* -* Output: None -* Return: u4Byte Readback value -* Note: This function is equal to "GetRFRegSetting" in PHY programming guide -*/ -u32 -rtl8192c_PHY_QueryRFReg( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 Original_Value, Readback_Value, BitShift; - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //u8 RFWaitCounter = 0; - //_irqL irqL; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), BitMask(%#lx)\n", RegAddr, eRFPath,BitMask)); - -#ifdef CONFIG_USB_HCI - //PlatformAcquireMutex(&pHalData->mxRFOperate); -#else - //_enter_critical(&pHalData->rf_lock, &irqL); -#endif - - - Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); - - BitShift = phy_CalculateBitShift(BitMask); - Readback_Value = (Original_Value & BitMask) >> BitShift; - -#ifdef CONFIG_USB_HCI - //PlatformReleaseMutex(&pHalData->mxRFOperate); -#else - //_exit_critical(&pHalData->rf_lock, &irqL); -#endif - - - //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%lx Addr[0x%lx]=0x%lx\n", eRFPath, BitMask, RegAddr, Original_Value));//BitMask(%#lx),BitMask, - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), Original_Value(%#lx)\n", - // RegAddr, eRFPath, Original_Value)); - - return (Readback_Value); -} - -/** -* Function: PHY_SetRFReg -* -* OverView: Write "Specific bits" to RF register (page 8~) -* -* Input: -* PADAPTER Adapter, -* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D -* u4Byte RegAddr, //The target address to be modified -* u4Byte BitMask //The target bit position in the target address -* //to be modified -* u4Byte Data //The new register Data in the target bit position -* //of the target address -* -* Output: None -* Return: None -* Note: This function is equal to "PutRFRegSetting" in PHY programming guide -*/ -VOID -rtl8192c_PHY_SetRFReg( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //u1Byte RFWaitCounter = 0; - u32 Original_Value, BitShift; - //_irqL irqL; - -#if (DISABLE_BB_RF == 1) - return; -#endif - - //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", - // RegAddr, BitMask, Data, eRFPath)); - //RTPRINT(FINIT, INIT_RF, ("PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", - // RegAddr, BitMask, Data, eRFPath)); - - -#ifdef CONFIG_USB_HCI - //PlatformAcquireMutex(&pHalData->mxRFOperate); -#else - //_enter_critical(&pHalData->rf_lock, &irqL); -#endif - - - // RF data is 12 bits only - if (BitMask != bRFRegOffsetMask) - { - Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); - BitShift = phy_CalculateBitShift(BitMask); - Data = ((Original_Value & (~BitMask)) | (Data<< BitShift)); - } - - phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); - - - -#ifdef CONFIG_USB_HCI - //PlatformReleaseMutex(&pHalData->mxRFOperate); -#else - //_exit_critical(&pHalData->rf_lock, &irqL); -#endif - - //PHY_QueryRFReg(Adapter,eRFPath,RegAddr,BitMask); - //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", - // RegAddr, BitMask, Data, eRFPath)); - -} - - -// -// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. -// - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigMACWithParaFile() - * - * Overview: This function read BB parameters from general file format, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - * Note: The format of MACPHY_REG.txt is different from PHY and RF. - * [Register][Mask][Value] - *---------------------------------------------------------------------------*/ -static int -phy_ConfigMACWithParaFile( - IN PADAPTER Adapter, - IN u8* pFileName -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - return rtStatus; -} - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigMACWithHeaderFile() - * - * Overview: This function read BB parameters from Header file we gen, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - * Note: The format of MACPHY_REG.txt is different from PHY and RF. - * [Register][Mask][Value] - *---------------------------------------------------------------------------*/ -static int -phy_ConfigMACWithHeaderFile( - IN PADAPTER Adapter -) -{ - u32 i = 0; - u32 ArrayLength = 0; - u32* ptrArray; - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //2008.11.06 Modified by tynli. - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read Rtl819XMACPHY_Array\n")); - ArrayLength = MAC_2T_ArrayLength; - ptrArray = Rtl819XMAC_Array; - - for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column - rtw_write8(Adapter, ptrArray[i], (u8)ptrArray[i+1]); - } - - return _SUCCESS; - -} - - -/*----------------------------------------------------------------------------- - * Function: PHY_MACConfig8192C - * - * Overview: Condig MAC by header file or parameter file. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 08/12/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -int -PHY_MACConfig8192C( - IN PADAPTER Adapter - ) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - s8 *pszMACRegFile; - s8 sz88CMACRegFile[] = RTL8188C_PHY_MACREG; - s8 sz92CMACRegFile[] = RTL8192C_PHY_MACREG; - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); - - if(isNormal) - { - if(is92C) - pszMACRegFile = sz92CMACRegFile; - else - pszMACRegFile = sz88CMACRegFile; - } - else - { - //pszMACRegFile = TestMacRegFile; - } - - // - // Config MAC - // -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = phy_ConfigMACWithHeaderFile(Adapter); -#else - - // Not make sure EEPROM, add later - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read MACREG.txt\n")); - rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); -#endif - -#ifdef CONFIG_PCI_HCI - //this switching setting cause some 8192cu hw have redownload fw fail issue - //improve 2-stream TX EVM by Jenyu - if(isNormal && is92C) - rtw_write8(Adapter, REG_SPS0_CTRL+3,0x71); -#endif - - - // 2010.07.13 AMPDU aggregation number 9 - //rtw_write16(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); - rtw_write8(Adapter, REG_MAX_AGGR_NUM, 0x0A); //By tynli. 2010.11.18. -#ifdef CONFIG_USB_HCI - if(is92C && (BOARD_USB_DONGLE == pHalData->BoardType)) - rtw_write8(Adapter, 0x40,0x04); -#endif - - return rtStatus; - -} - - -/** -* Function: phy_InitBBRFRegisterDefinition -* -* OverView: Initialize Register definition offset for Radio Path A/B/C/D -* -* Input: -* PADAPTER Adapter, -* -* Output: None -* Return: None -* Note: The initialization value is constant and it should never be changes -*/ -static VOID -phy_InitBBRFRegisterDefinition( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // RF Interface Sowrtware Control - pHalData->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 - pHalData->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) - pHalData->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874 - pHalData->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) - - // RF Interface Readback Value - pHalData->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0 - pHalData->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) - pHalData->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4 - pHalData->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) - - // RF Interface Output (and Enable) - pHalData->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 - pHalData->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 - - // RF Interface (Output and) Enable - pHalData->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) - pHalData->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) - - //Addr of LSSI. Wirte RF register by driver - pHalData->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter - pHalData->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; - - // RF parameter - pHalData->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select - pHalData->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter; - pHalData->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter; - pHalData->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter; - - // Tx AGC Gain Stage (same for all path. Should we remove this?) - pHalData->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - pHalData->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - pHalData->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - pHalData->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage - - // Tranceiver A~D HSSI Parameter-1 - pHalData->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1 - pHalData->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1 - - // Tranceiver A~D HSSI Parameter-2 - pHalData->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2 - pHalData->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2 - - // RF switch Control - pHalData->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control - pHalData->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl; - pHalData->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl; - pHalData->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl; - - // AGC control 1 - pHalData->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1; - pHalData->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1; - pHalData->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1; - pHalData->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1; - - // AGC control 2 - pHalData->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2; - pHalData->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2; - pHalData->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2; - pHalData->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2; - - // RX AFE control 1 - pHalData->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance; - pHalData->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance; - pHalData->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance; - pHalData->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance; - - // RX AFE control 1 - pHalData->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE; - pHalData->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE; - pHalData->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE; - pHalData->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE; - - // Tx AFE control 1 - pHalData->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance; - pHalData->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance; - pHalData->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance; - pHalData->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance; - - // Tx AFE control 2 - pHalData->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE; - pHalData->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE; - pHalData->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE; - pHalData->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE; - - // Tranceiver LSSI Readback SI mode - pHalData->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; - pHalData->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; - pHalData->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack; - pHalData->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack; - - // Tranceiver LSSI Readback PI mode - pHalData->PHYRegDef[RF90_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; - pHalData->PHYRegDef[RF90_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; - //pHalData->PHYRegDef[RF90_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack; - //pHalData->PHYRegDef[RF90_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack; - -} - - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithParaFile() - * - * Overview: This function read BB parameters from general file format, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * 2008/11/06 MH For 92S we do not support silent reset now. Disable - * parameter file compare!!!!!!?? - * - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithParaFile( - IN PADAPTER Adapter, - IN u8* pFileName -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - return rtStatus; -} - - - -//**************************************** -// The following is for High Power PA -//**************************************** -VOID -phy_ConfigBBExternalPA( - IN PADAPTER Adapter -) -{ -#ifdef CONFIG_USB_HCI - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 i=0; - u32 temp=0; - - if(!pHalData->ExternalPA) - { - return; - } - - // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the - // same code as SU. It is already updated in PHY_REG_1T_HP.txt. -#if 0 - PHY_SetBBReg(Adapter, 0xee8, BIT28, 1); - temp = PHY_QueryBBReg(Adapter, 0x860, bMaskDWord); - temp |= (BIT26|BIT21|BIT10|BIT5); - PHY_SetBBReg(Adapter, 0x860, bMaskDWord, temp); - PHY_SetBBReg(Adapter, 0x870, BIT10, 0); - PHY_SetBBReg(Adapter, 0xc80, bMaskDWord, 0x20000080); - PHY_SetBBReg(Adapter, 0xc88, bMaskDWord, 0x40000100); -#endif - -#endif -} - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithHeaderFile() - * - * Overview: This function read BB parameters from general file format, and do register - * Read/Write - * - * Input: PADAPTER Adapter - * u1Byte ConfigType 0 => PHY_CONFIG - * 1 =>AGC_TAB - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithHeaderFile( - IN PADAPTER Adapter, - IN u8 ConfigType -) -{ - int i; - u32* Rtl819XPHY_REGArray_Table; - u32* Rtl819XAGCTAB_Array_Table; - u16 PHY_REGArrayLen, AGCTAB_ArrayLen; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // - // 2009.11.24. Modified by tynli. - // - if(IS_92C_SERIAL(pHalData->VersionID)) - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - AGCTAB_ArrayLen = AGCTAB_2TArrayLength; - Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_2TArray; - PHY_REGArrayLen = PHY_REG_2TArrayLength; - Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2TArray; -#ifdef CONFIG_USB_HCI - if(pHalData->BoardType == BOARD_MINICARD ) - { - PHY_REGArrayLen = PHY_REG_2T_mCardArrayLength; - Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2T_mCardArray; - } -#endif - } - else - { - DBG_8192C(" ===> phy_ConfigBBWithHeaderFile(): do not support test chip\n"); - return _FAIL; - } - } - else - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - AGCTAB_ArrayLen = AGCTAB_1TArrayLength; - Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1TArray; - PHY_REGArrayLen = PHY_REG_1TArrayLength; - Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1TArray; -#ifdef CONFIG_USB_HCI - if(pHalData->BoardType == BOARD_MINICARD ) - { - PHY_REGArrayLen = PHY_REG_1T_mCardArrayLength; - Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_mCardArray; - } - else if(pHalData->BoardType == BOARD_USB_High_PA) - { - AGCTAB_ArrayLen = AGCTAB_1T_HPArrayLength; - Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1T_HPArray; - PHY_REGArrayLen = PHY_REG_1T_HPArrayLength; - Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_HPArray; - } -#endif - } - else - { - DBG_8192C(" ===> phy_ConfigBBWithHeaderFile(): do not support test chip\n"); - return _FAIL; - } - } - - if(ConfigType == BaseBand_Config_PHY_REG) - { - for(i=0;iMCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0])); - } - if(RegAddr == rTxAGC_A_Rate54_24) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1])); - } - if(RegAddr == rTxAGC_A_CCK1_Mcs32) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6])); - } - if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7])); - } - if(RegAddr == rTxAGC_A_Mcs03_Mcs00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2])); - } - if(RegAddr == rTxAGC_A_Mcs07_Mcs04) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3])); - } - if(RegAddr == rTxAGC_A_Mcs11_Mcs08) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4])); - } - if(RegAddr == rTxAGC_A_Mcs15_Mcs12) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5])); - } - if(RegAddr == rTxAGC_B_Rate18_06) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8])); - } - if(RegAddr == rTxAGC_B_Rate54_24) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9])); - } - if(RegAddr == rTxAGC_B_CCK1_55_Mcs32) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14])); - } - if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15])); - } - if(RegAddr == rTxAGC_B_Mcs03_Mcs00) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10])); - } - if(RegAddr == rTxAGC_B_Mcs07_Mcs04) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11])); - } - if(RegAddr == rTxAGC_B_Mcs11_Mcs08) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12])); - } - if(RegAddr == rTxAGC_B_Mcs15_Mcs12) - { - pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; - //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt, - // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13])); - pHalData->pwrGroupCnt++; - } -} -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithPgParaFile - * - * Overview: - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/06/2008 MHC Create Version 0. - * 2009/07/29 tynli (porting from 92SE branch)2009/03/11 Add copy parameter file to buffer for silent reset - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithPgParaFile( - IN PADAPTER Adapter, - IN u8* pFileName) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - - return rtStatus; - -} /* phy_ConfigBBWithPgParaFile */ - - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithPgHeaderFile - * - * Overview: Config PHY_REG_PG array - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/06/2008 MHC Add later!!!!!!.. Please modify for new files!!!! - * 11/10/2008 tynli Modify to mew files. - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithPgHeaderFile( - IN PADAPTER Adapter, - IN u8 ConfigType) -{ - int i; - u32* Rtl819XPHY_REGArray_Table_PG; - u16 PHY_REGArrayPGLen; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // Default: pHalData->RF_Type = RF_2T2R. - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - PHY_REGArrayPGLen = PHY_REG_Array_PGLength; - Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG; - -#ifdef CONFIG_USB_HCI -// 2010/10/19 Chiyoko According to Alex/Willson opinion, VAU/dongle can share the same PHY_REG_PG.txt -/* - if(pHalData->BoardType == BOARD_MINICARD ) - { - PHY_REGArrayPGLen = PHY_REG_Array_PG_mCardLength; - Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_mCard; - } - else */if(pHalData->BoardType ==BOARD_USB_High_PA ) - { - PHY_REGArrayPGLen = PHY_REG_Array_PG_HPLength; - Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_HP; - } -#endif - } - else - { - DBG_8192C(" ===> phy_ConfigBBWithPgHeaderFile(): do not support test chip\n"); - return _FAIL; - } - - if(ConfigType == BaseBand_Config_PHY_REG) - { - for(i=0;iBufOfLines), - MAX_LINES_HWCONFIG_TXT, - MAX_BYTES_LINE_HWCONFIG_TXT, - &nLinesRead - ); - if(rtStatus == RT_STATUS_SUCCESS) - { - PlatformMoveMemory(pHalData->BufOfLines6, pHalData->BufOfLines, nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesRead6 = nLinesRead; - } - else - { - // Temporarily skip PHY_REG_MP.txt if file does not exist. - pHalData->nLinesRead6 = 0; - RT_TRACE(COMP_INIT, DBG_LOUD, ("No matched file \r\n")); - return RT_STATUS_SUCCESS; - } - } - else - { - PlatformMoveMemory(pHalData->BufOfLines, pHalData->BufOfLines6, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - nLinesRead = pHalData->nLinesRead6; - rtStatus = RT_STATUS_SUCCESS; - } - - - if(rtStatus == RT_STATUS_SUCCESS) - { - RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName)); - - for(ithLine = 0; ithLine < nLinesRead; ithLine++) - { - szLine = pHalData->BufOfLines[ithLine]; - - if(!IsCommentString(szLine)) - { - // Get 1st hex value as register offset. - if(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) - { - if(u4bRegOffset == 0xff) - { // Ending. - break; - } - else if (u4bRegOffset == 0xfe) - delay_ms(50); - else if (u4bRegOffset == 0xfd) - delay_ms(5); - else if (u4bRegOffset == 0xfc) - delay_ms(1); - else if (u4bRegOffset == 0xfb) - PlatformStallExecution(50); - else if (u4bRegOffset == 0xfa) - PlatformStallExecution(5); - else if (u4bRegOffset == 0xf9) - PlatformStallExecution(1); - - // Get 2nd hex value as register value. - szLine += u4bMove; - if(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) - { - RT_TRACE(COMP_FPGA, DBG_TRACE, ("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue)); - PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue); - - // Add 1us delay between BB/RF register setting. - PlatformStallExecution(1); - } - } - } - } - } - else - { - RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): Failed%s\n", pFileName)); - } -#endif - - return rtStatus; -} - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithMpHeaderFile - * - * Overview: Config PHY_REG_MP array - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 02/04/2010 chiyokolin Modify to new files. - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithMpHeaderFile( - IN PADAPTER Adapter, - IN u1Byte ConfigType) -{ - int i; - u32* Rtl8192CPHY_REGArray_Table_MP; - u16 PHY_REGArrayMPLen; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - PHY_REGArrayMPLen = PHY_REG_Array_MPLength; - Rtl8192CPHY_REGArray_Table_MP = Rtl819XPHY_REG_Array_MP; - - if(ConfigType == BaseBand_Config_PHY_REG) - { - for(i=0;iphy_BB8192S_Config_ParaFile\n")); - - if(IS_92C_SERIAL(pHalData->VersionID)){ - pszBBRegFile=(u8*)&sz92CBBRegFile ; - pszAGCTableFile =(u8*)&sz92CAGCTableFile; - } - else{ - pszBBRegFile=(u8*)&sz88CBBRegFile ; - pszAGCTableFile =(u8*)&sz88CAGCTableFile; - } - - // - // 1. Read PHY_REG.TXT BB INIT!! - // We will seperate as 88C / 92C according to chip version - // -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_PHY_REG); -#else - // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different - // type of parameter files to phy_reg.txt at first. - rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile); -#endif - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!")); - goto phy_BB8190_Config_ParaFile_Fail; - } - -#if MP_DRIVER == 1 - // - // 1.1 Read PHY_REG_MP.TXT BB INIT!! - // We will seperate as 88C / 92C according to chip version - // -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = phy_ConfigBBWithMpHeaderFile(Adapter, BaseBand_Config_PHY_REG); -#else - // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different - // type of parameter files to phy_reg.txt at first. - rtStatus = phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile); -#endif - - if(rtStatus != _SUCCESS){ -// RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg MP Fail!!")); - goto phy_BB8190_Config_ParaFile_Fail; - } -#endif // #if (MP_DRIVER == 1) - - // - // 20100318 Joseph: Config 2T2R to 1T2R if necessary. - // - if(pHalData->rf_type == RF_1T2R) - { - phy_BB8192C_Config_1T(Adapter); - DBG_8192C("phy_BB8192C_Config_ParaFile():Config to 1T!!\n"); - } - - // - // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt - // - if (pEEPROM->bautoload_fail_flag == _FALSE) - { - pHalData->pwrGroupCnt = 0; - -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = phy_ConfigBBWithPgHeaderFile(Adapter, BaseBand_Config_PHY_REG); -#else - rtStatus = phy_ConfigBBWithPgParaFile(Adapter, (u8*)&szBBRegPgFile); -#endif - } - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!")); - goto phy_BB8190_Config_ParaFile_Fail; - } - - // - // 3. BB AGC table Initialization - // -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_AGC_TAB); -#else - //RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_BB8192S_Config_ParaFile AGC_TAB.txt\n")); - rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile); -#endif - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_FPGA, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():AGC Table Fail\n")); - goto phy_BB8190_Config_ParaFile_Fail; - } - - // Check if the CCK HighPower is turned ON. - // This is used to calculate PWDB. - pHalData->bCckHighPower = (BOOLEAN)(PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, 0x200)); - -phy_BB8190_Config_ParaFile_Fail: - - return rtStatus; -} - - -int -PHY_BBConfig8192C( - IN PADAPTER Adapter - ) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 RegVal; - u8 TmpU1B=0; - u8 value8; - - phy_InitBBRFRegisterDefinition(Adapter); - - if(IS_HARDWARE_TYPE_8723(Adapter)) - { - // Suggested by Scott. tynli_test. 2010.12.30. - //1. 0x28[1] = 1 - TmpU1B = rtw_read8(Adapter, REG_AFE_PLL_CTRL); - rtw_udelay_os(2); - rtw_write8(Adapter, REG_AFE_PLL_CTRL, (TmpU1B|BIT1)); - rtw_udelay_os(2); - - //2. 0x29[7:0] = 0xFF - rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xff); - rtw_udelay_os(2); - - //3. 0x02[1:0] = 2b'11 - TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN); - rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB)); - - //4. 0x25[6] = 0 - TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+1); - rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, (TmpU1B&(~BIT6))); - - //5. 0x24[20] = 0 //Advised by SD3 Alex Wang. 2011.02.09. - TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+2); - rtw_write8(Adapter, REG_AFE_XTAL_CTRL+2, (TmpU1B&(~BIT4))); - - //6. 0x1f[7:0] = 0x07 - rtw_write8(Adapter, REG_RF_CTRL, 0x07); - } - else - { - // Enable BB and RF - RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN); - rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1)); - - // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. - rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83); - rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb); - - rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB); - -#ifdef CONFIG_USB_HCI - rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB); -#else - rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB); -#endif - - // 2009/10/21 by SD1 Jong. Modified by tynli. Not in Documented in V8.1. - if(!IS_NORMAL_CHIP(pHalData->VersionID)) - { -#ifdef CONFIG_USB_HCI - rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x1f); -#else - rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x1b); -#endif - } - else - { -#ifdef CONFIG_USB_HCI - //To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23. - rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x0f); - rtw_write8(Adapter, 0x15, 0xe9); -#endif - } - - rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80); - -#ifdef CONFIG_PCI_HCI - // Force use left antenna by default for 88C. - // if(!IS_92C_SERIAL(pHalData->VersionID) || IS_92C_1T2R(pHalData->VersionID)) - if(Adapter->ledpriv.LedStrategy != SW_LED_MODE10) - { - RegVal = rtw_read32(Adapter, REG_LEDCFG0); - rtw_write32(Adapter, REG_LEDCFG0, RegVal|BIT23); - } -#endif - } - - // - // Config BB and AGC - // - rtStatus = phy_BB8192C_Config_ParaFile(Adapter); -#if 0 - switch(Adapter->MgntInfo.bRegHwParaFile) - { - case 0: - phy_BB8190_Config_HardCode(Adapter); - break; - - case 1: - rtStatus = phy_BB8192C_Config_ParaFile(Adapter); - break; - - case 2: - // Partial Modify. - phy_BB8190_Config_HardCode(Adapter); - phy_BB8192C_Config_ParaFile(Adapter); - break; - - default: - phy_BB8190_Config_HardCode(Adapter); - break; - } -#endif -#ifdef CONFIG_USB_HCI - if(IS_HARDWARE_TYPE_8192CU(Adapter)&&IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) - &&(pHalData->BoardType == BOARD_USB_High_PA)) - rtw_write8(Adapter, 0xc72, 0x50); -#endif - - // For fix 8723 WL_TRSW bug. Suggested by Scott. 2011.01.24. - if(IS_HARDWARE_TYPE_8723(Adapter)) - { - if(!IS_NORMAL_CHIP(pHalData->VersionID)) - { - // 1. 0x40[2] = 1 - value8 = rtw_read8(Adapter, REG_GPIO_MUXCFG); - rtw_write8(Adapter, REG_GPIO_MUXCFG, (value8|BIT2)); - - // 2. 0x804[14] = 0 // BB disable TRSW control, enable SW control - PHY_SetBBReg(Adapter, rFPGA0_TxInfo, BIT14, 0x0); - - // 3. 0x870[6:5] = 2'b11 - PHY_SetBBReg(Adapter, rFPGA0_XAB_RFInterfaceSW, (BIT5|BIT6), 0x3); - - // 4. 0x860[6:5] = 2'b00 // BB SW control TRSW pin output level - PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, (BIT5|BIT6), 0x0); - } - } -#if 0 - // Check BB/RF confiuration setting. - // We only need to configure RF which is turned on. - PathMap = (u1Byte)(PHY_QueryBBReg(Adapter, rFPGA0_TxInfo, 0xf) | - PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf)); - pHalData->RF_PathMap = PathMap; - for(index = 0; index<4; index++) - { - if((PathMap>>index)&0x1) - rf_num++; - } - - if((GET_RF_TYPE(Adapter) ==RF_1T1R && rf_num!=1) || - (GET_RF_TYPE(Adapter)==RF_1T2R && rf_num!=2) || - (GET_RF_TYPE(Adapter)==RF_2T2R && rf_num!=2) || - (GET_RF_TYPE(Adapter)==RF_2T2R_GREEN && rf_num!=2) || - (GET_RF_TYPE(Adapter)==RF_2T4R && rf_num!=4)) - { - RT_TRACE( - COMP_INIT, - DBG_LOUD, - ("PHY_BBConfig8192C: RF_Type(%x) does not match RF_Num(%x)!!\n", pHalData->RF_Type, rf_num)); - } -#endif - - return rtStatus; -} - - -int -PHY_RFConfig8192C( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - // - // RF config - // - rtStatus = PHY_RF6052_Config8192C(Adapter); -#if 0 - switch(pHalData->rf_chip) - { - case RF_6052: - rtStatus = PHY_RF6052_Config(Adapter); - break; - case RF_8225: - rtStatus = PHY_RF8225_Config(Adapter); - break; - case RF_8256: - rtStatus = PHY_RF8256_Config(Adapter); - break; - case RF_8258: - break; - case RF_PSEUDO_11N: - rtStatus = PHY_RF8225_Config(Adapter); - break; - default: //for MacOs Warning: "RF_TYPE_MIN" not handled in switch - break; - } -#endif - return rtStatus; -} - - -/*----------------------------------------------------------------------------- - * Function: PHY_ConfigRFWithParaFile() - * - * Overview: This function read RF parameters from general file format, and do RF 3-wire - * - * Input: PADAPTER Adapter - * ps1Byte pFileName - * RF90_RADIO_PATH_E eRFPath - * - * Output: NONE - * - * Return: RT_STATUS_SUCCESS: configuration file exist - * - * Note: Delay may be required for RF configuration - *---------------------------------------------------------------------------*/ -int -rtl8192c_PHY_ConfigRFWithParaFile( - IN PADAPTER Adapter, - IN u8* pFileName, - RF90_RADIO_PATH_E eRFPath -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - int rtStatus = _SUCCESS; - - - return rtStatus; - -} - -//**************************************** -// The following is for High Power PA -//**************************************** -#define HighPowerRadioAArrayLen 22 -//This is for High power PA -u32 Rtl8192S_HighPower_RadioA_Array[HighPowerRadioAArrayLen] = { -0x013,0x00029ea4, -0x013,0x00025e74, -0x013,0x00020ea4, -0x013,0x0001ced0, -0x013,0x00019f40, -0x013,0x00014e70, -0x013,0x000106a0, -0x013,0x0000c670, -0x013,0x000082a0, -0x013,0x00004270, -0x013,0x00000240, -}; - -int -PHY_ConfigRFExternalPA( - IN PADAPTER Adapter, - RF90_RADIO_PATH_E eRFPath -) -{ - int rtStatus = _SUCCESS; -#ifdef CONFIG_USB_HCI - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 i=0; - - if(!pHalData->ExternalPA) - { - return rtStatus; - } - - // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the - // same code as SU. It is already updated in radio_a_1T_HP.txt. -#if 0 - //add for SU High Power PA - for(i = 0;iVersionID)) - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - RadioA_ArrayLen = RadioA_2TArrayLength; - Rtl819XRadioA_Array_Table = Rtl819XRadioA_2TArray; - RadioB_ArrayLen = RadioB_2TArrayLength; - Rtl819XRadioB_Array_Table = Rtl819XRadioB_2TArray; - } - else - { - rtStatus = _FAIL; - return rtStatus; - } - } - else - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - RadioA_ArrayLen = RadioA_1TArrayLength; - Rtl819XRadioA_Array_Table = Rtl819XRadioA_1TArray; - RadioB_ArrayLen = RadioB_1TArrayLength; - Rtl819XRadioB_Array_Table = Rtl819XRadioB_1TArray; -#ifdef CONFIG_USB_HCI - if( BOARD_MINICARD == pHalData->BoardType ) - { - RadioA_ArrayLen = RadioA_1T_mCardArrayLength; - Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_mCardArray; - RadioB_ArrayLen = RadioB_1T_mCardArrayLength; - Rtl819XRadioB_Array_Table = Rtl819XRadioB_1T_mCardArray; - } - else if( BOARD_USB_High_PA == pHalData->BoardType ) - { - RadioA_ArrayLen = RadioA_1T_HPArrayLength; - Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_HPArray; - } -#endif - } - else - { - rtStatus = _FAIL; - return rtStatus; - } - } - - switch(eRFPath){ - case RF90_PATH_A: - for(i = 0;i actually we call PlatformStallExecution()) to do NdisStallExecution() - // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK - // to run at Dispatch level to achive it. - //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK); - WriteData[i] &= 0xfff; - PHY_SetRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]); - // TODO: we should not delay for such a long time. Ask SD3 - rtw_mdelay_os(10); - ulRegRead = PHY_QueryRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord); - rtw_mdelay_os(10); - //cosa PlatformReleaseSpinLock(Adapter, RT_INITIAL_SPINLOCK); - break; - - default: - rtStatus = _FAIL; - break; - } - - - // - // Check whether readback data is correct - // - if(ulRegRead != WriteData[i]) - { - //RT_TRACE(COMP_FPGA, DBG_LOUD, ("ulRegRead: %lx, WriteData: %lx \n", ulRegRead, WriteData[i])); - rtStatus = _FAIL; - break; - } - } - - return rtStatus; -} - - -VOID -rtl8192c_PHY_GetHWRegOriginalValue( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // read rx initial gain - pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0); - pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0); - pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0); - pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0); - //RT_TRACE(COMP_INIT, DBG_LOUD, - //("Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n", - //pHalData->DefaultInitialGain[0], pHalData->DefaultInitialGain[1], - //pHalData->DefaultInitialGain[2], pHalData->DefaultInitialGain[3])); - - // read framesync - pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0); - pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Default framesync (0x%x) = 0x%x \n", - // rOFDM0_RxDetector3, pHalData->framesync)); -} - - -// -// Description: -// Map dBm into Tx power index according to -// current HW model, for example, RF and PA, and -// current wireless mode. -// By Bruce, 2008-01-29. -// -static u8 -phy_DbmToTxPwrIdx( - IN PADAPTER Adapter, - IN WIRELESS_MODE WirelessMode, - IN int PowerInDbm - ) -{ - u8 TxPwrIdx = 0; - int Offset = 0; - - - // - // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to - // 3dbm, and OFDM HT equals to 0dbm repectively. - // Note: - // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. - // By Bruce, 2008-01-29. - // - switch(WirelessMode) - { - case WIRELESS_MODE_B: - Offset = -7; - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - Offset = -8; - break; - default: - Offset = -8; - break; - } - - if((PowerInDbm - Offset) > 0) - { - TxPwrIdx = (u8)((PowerInDbm - Offset) * 2); - } - else - { - TxPwrIdx = 0; - } - - // Tx Power Index is too large. - if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S) - TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S; - - return TxPwrIdx; -} - -// -// Description: -// Map Tx power index into dBm according to -// current HW model, for example, RF and PA, and -// current wireless mode. -// By Bruce, 2008-01-29. -// -int -phy_TxPwrIdxToDbm( - IN PADAPTER Adapter, - IN WIRELESS_MODE WirelessMode, - IN u8 TxPwrIdx - ) -{ - int Offset = 0; - int PwrOutDbm = 0; - - // - // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. - // Note: - // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. - // By Bruce, 2008-01-29. - // - switch(WirelessMode) - { - case WIRELESS_MODE_B: - Offset = -7; - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - Offset = -8; - default: - Offset = -8; - break; - } - - PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part. - - return PwrOutDbm; -} - - -/*----------------------------------------------------------------------------- - * Function: GetTxPowerLevel8190() - * - * Overview: This function is export to "common" moudule - * - * Input: PADAPTER Adapter - * psByte Power Level - * - * Output: NONE - * - * Return: NONE - * - *---------------------------------------------------------------------------*/ -VOID -PHY_GetTxPowerLevel8192C( - IN PADAPTER Adapter, - OUT u32* powerlevel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TxPwrLevel = 0; - int TxPwrDbm; - - // - // Because the Tx power indexes are different, we report the maximum of them to - // meet the CCX TPC request. By Bruce, 2008-01-31. - // - - // CCK - TxPwrLevel = pHalData->CurrentCckTxPwrIdx; - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); - - // Legacy OFDM - TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; - - // Compare with Legacy OFDM Tx power. - if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); - - // HT OFDM - TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; - - // Compare with HT OFDM Tx power. - if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) - TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); - - *powerlevel = TxPwrDbm; -} - - -static void getTxPowerIndex( - IN PADAPTER Adapter, - IN u8 channel, - IN OUT u8* cckPowerLevel, - IN OUT u8* ofdmPowerLevel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 index = (channel -1); - // 1. CCK - cckPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelCck[RF90_PATH_A][index]; //RF-A - cckPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelCck[RF90_PATH_B][index]; //RF-B - - // 2. OFDM for 1S or 2S - if (GET_RF_TYPE(Adapter) == RF_1T2R || GET_RF_TYPE(Adapter) == RF_1T1R) - { - // Read HT 40 OFDM TX power - ofdmPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelHT40_1S[RF90_PATH_A][index]; - ofdmPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelHT40_1S[RF90_PATH_B][index]; - } - else if (GET_RF_TYPE(Adapter) == RF_2T2R) - { - // Read HT 40 OFDM TX power - ofdmPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelHT40_2S[RF90_PATH_A][index]; - ofdmPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelHT40_2S[RF90_PATH_B][index]; - } - //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, set tx power index !!\n", channel)); -} - -static void ccxPowerIndexCheck( - IN PADAPTER Adapter, - IN u8 channel, - IN OUT u8* cckPowerLevel, - IN OUT u8* ofdmPowerLevel - ) -{ -#if 0 - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo); - - // - // CCX 2 S31, AP control of client transmit power: - // 1. We shall not exceed Cell Power Limit as possible as we can. - // 2. Tolerance is +/- 5dB. - // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit. - // - // TODO: - // 1. 802.11h power contraint - // - // 071011, by rcnjko. - // - if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE && - pMgntInfo->mAssoc && - pCcxInfo->bUpdateCcxPwr && - pCcxInfo->bWithCcxCellPwr && - channel == pMgntInfo->dot11CurrentChannelNumber) - { - u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr); - u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr); - u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr); - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", - pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx)); - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", - channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); - - // CCK - if(cckPowerLevel[0] > CckCellPwrIdx) - cckPowerLevel[0] = CckCellPwrIdx; - // Legacy OFDM, HT OFDM - if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx) - { - if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0) - { - ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff; - } - else - { - ofdmPowerLevel[0] = 0; - } - } - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", - cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); - } - - pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; - pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; - - RT_TRACE(COMP_TXAGC, DBG_LOUD, - ("PHY_SetTxPowerLevel8192S(): CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", - cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); -#endif -} -/*----------------------------------------------------------------------------- - * Function: SetTxPowerLevel8190() - * - * Overview: This function is export to "HalCommon" moudule - * We must consider RF path later!!!!!!! - * - * Input: PADAPTER Adapter - * u1Byte channel - * - * Output: NONE - * - * Return: NONE - * 2008/11/04 MHC We remove EEPROM_93C56. - * We need to move CCX relative code to independet file. - * 2009/01/21 MHC Support new EEPROM format from SD3 requirement. - * - *---------------------------------------------------------------------------*/ -VOID -PHY_SetTxPowerLevel8192C( - IN PADAPTER Adapter, - IN u8 channel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 cckPowerLevel[2], ofdmPowerLevel[2]; // [0]:RF-A, [1]:RF-B - -#if(MP_DRIVER == 1) - return; -#endif - - if(pHalData->bTXPowerDataReadFromEEPORM == _FALSE) - return; - - getTxPowerIndex(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); - //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x, ofdmPowerLevel (A / B) = 0x%x / 0x%x\n", - // channel, cckPowerLevel[0], cckPowerLevel[1], ofdmPowerLevel[0], ofdmPowerLevel[1])); - - ccxPowerIndexCheck(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); - - rtl8192c_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); - rtl8192c_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); - -#if 0 - switch(pHalData->rf_chip) - { - case RF_8225: - PHY_SetRF8225CckTxPower(Adapter, cckPowerLevel[0]); - PHY_SetRF8225OfdmTxPower(Adapter, ofdmPowerLevel[0]); - break; - - case RF_8256: - PHY_SetRF8256CCKTxPower(Adapter, cckPowerLevel[0]); - PHY_SetRF8256OFDMTxPower(Adapter, ofdmPowerLevel[0]); - break; - - case RF_6052: - PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); - PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); - break; - - case RF_8258: - break; - } -#endif - -} - - -// -// Description: -// Update transmit power level of all channel supported. -// -// TODO: -// A mode. -// By Bruce, 2008-02-04. -// -BOOLEAN -PHY_UpdateTxPowerDbm8192C( - IN PADAPTER Adapter, - IN int powerInDbm - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 idx; - u8 rf_path; - - // TODO: A mode Tx power. - u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm); - u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm); - - if(OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0) - OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff; - else - OfdmTxPwrIdx = 0; - - //RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_UpdateTxPowerDbm8192S(): %ld dBm , CckTxPwrIdx = %d, OfdmTxPwrIdx = %d\n", powerInDbm, CckTxPwrIdx, OfdmTxPwrIdx)); - - for(idx = 0; idx < 14; idx++) - { - for (rf_path = 0; rf_path < 2; rf_path++) - { - pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx; - pHalData->TxPwrLevelHT40_1S[rf_path][idx] = - pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx; - } - } - - //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel);//gtest:todo - - return _TRUE; -} - - -/* - Description: - When beacon interval is changed, the values of the - hw registers should be modified. - By tynli, 2008.10.24. - -*/ - - -void -rtl8192c_PHY_SetBeaconHwReg( - IN PADAPTER Adapter, - IN u16 BeaconInterval - ) -{ - -} - - -VOID -PHY_ScanOperationBackup8192C( - IN PADAPTER Adapter, - IN u8 Operation - ) -{ -#if 0 - IO_TYPE IoType; - - if(!Adapter->bDriverStopped) - { - switch(Operation) - { - case SCAN_OPT_BACKUP: - IoType = IO_CMD_PAUSE_DM_BY_SCAN; - Adapter->HalFunc.SetHwRegHandler(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); - - break; - - case SCAN_OPT_RESTORE: - IoType = IO_CMD_RESUME_DM_BY_SCAN; - Adapter->HalFunc.SetHwRegHandler(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); - break; - - default: - RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n")); - break; - } - } -#endif -} - -/*----------------------------------------------------------------------------- - * Function: PHY_SetBWModeCallback8192C() - * - * Overview: Timer callback function for SetSetBWMode - * - * Input: PRT_TIMER pTimer - * - * Output: NONE - * - * Return: NONE - * - * Note: (1) We do not take j mode into consideration now - * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run - * concurrently? - *---------------------------------------------------------------------------*/ -static VOID -_PHY_SetBWMode92C( - IN PADAPTER Adapter -) -{ -// PADAPTER Adapter = (PADAPTER)pTimer->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 regBwOpMode; - u8 regRRSR_RSC; - - //return; - - // Added it for 20/40 mhz switch time evaluation by guangan 070531 - //u4Byte NowL, NowH; - //u8Byte BeginTime, EndTime; - - /*RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SetBWModeCallback8192C() Switch to %s bandwidth\n", \ - pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"))*/ - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - //pHalData->SetBWModeInProgress= _FALSE; - return; - } - - // There is no 40MHz mode in RF_8225. - if(pHalData->rf_chip==RF_8225) - return; - - if(Adapter->bDriverStopped) - return; - - // Added it for 20/40 mhz switch time evaluation by guangan 070531 - //NowL = PlatformEFIORead4Byte(Adapter, TSFR); - //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); - //BeginTime = ((u8Byte)NowH << 32) + NowL; - - //3// - //3//<1>Set MAC register - //3// - //Adapter->HalFunc.SetBWModeHandler(); - - regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE); - regRRSR_RSC = rtw_read8(Adapter, REG_RRSR+2); - //regBwOpMode = Adapter->HalFunc.GetHwRegHandler(Adapter,HW_VAR_BWMODE,(pu1Byte)®BwOpMode); - - switch(pHalData->CurrentChannelBW) - { - case HT_CHANNEL_WIDTH_20: - regBwOpMode |= BW_OPMODE_20MHZ; - // 2007/02/07 Mark by Emily becasue we have not verify whether this register works - rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); - break; - - case HT_CHANNEL_WIDTH_40: - regBwOpMode &= ~BW_OPMODE_20MHZ; - // 2007/02/07 Mark by Emily becasue we have not verify whether this register works - rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); - - regRRSR_RSC = (regRRSR_RSC&0x90) |(pHalData->nCur40MhzPrimeSC<<5); - rtw_write8(Adapter, REG_RRSR+2, regRRSR_RSC); - break; - - default: - /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): - unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW));*/ - break; - } - - //3// - //3//<2>Set PHY related register - //3// - switch(pHalData->CurrentChannelBW) - { - /* 20 MHz channel*/ - case HT_CHANNEL_WIDTH_20: - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0); - PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0); - PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1); - - break; - - - /* 40 MHz channel*/ - case HT_CHANNEL_WIDTH_40: - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1); - PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1); - - // Set Control channel to upper or lower. These settings are required only for 40MHz - PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1)); - PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC); - PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0); - - PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1); - - break; - - - - default: - /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): unknown Bandwidth: %#X\n"\ - ,pHalData->CurrentChannelBW));*/ - break; - - } - //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315 - - // Added it for 20/40 mhz switch time evaluation by guangan 070531 - //NowL = PlatformEFIORead4Byte(Adapter, TSFR); - //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); - //EndTime = ((u8Byte)NowH << 32) + NowL; - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime))); - - //3<3>Set RF related register - switch(pHalData->rf_chip) - { - case RF_8225: - //PHY_SetRF8225Bandwidth(Adapter, pHalData->CurrentChannelBW); - break; - - case RF_8256: - // Please implement this function in Hal8190PciPhy8256.c - //PHY_SetRF8256Bandwidth(Adapter, pHalData->CurrentChannelBW); - break; - - case RF_8258: - // Please implement this function in Hal8190PciPhy8258.c - // PHY_SetRF8258Bandwidth(); - break; - - case RF_PSEUDO_11N: - // Do Nothing - break; - - case RF_6052: - rtl8192c_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW); - break; - - default: - //RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); - break; - } - - //pHalData->SetBWModeInProgress= FALSE; - - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SetBWModeCallback8192C() \n" )); -} - - - /*----------------------------------------------------------------------------- - * Function: SetBWMode8190Pci() - * - * Overview: This function is export to "HalCommon" moudule - * - * Input: PADAPTER Adapter - * HT_CHANNEL_WIDTH Bandwidth //20M or 40M - * - * Output: NONE - * - * Return: NONE - * - * Note: We do not take j mode into consideration now - *---------------------------------------------------------------------------*/ -VOID -PHY_SetBWMode8192C( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth, // 20M or 40M - IN unsigned char Offset // Upper, Lower, or Don't care -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - HT_CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW; - // Modified it for 20/40 mhz switch by guangan 070531 - //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; - - //return; - - //if(pHalData->SwChnlInProgress) -// if(pMgntInfo->bScanInProgress) -// { -// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s Exit because bScanInProgress!\n", -// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); -// return; -// } - -// if(pHalData->SetBWModeInProgress) -// { -// // Modified it for 20/40 mhz switch by guangan 070531 -// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s cancel last timer because SetBWModeInProgress!\n", -// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); -// PlatformCancelTimer(Adapter, &pHalData->SetBWModeTimer); -// //return; -// } - - //if(pHalData->SetBWModeInProgress) - // return; - - //pHalData->SetBWModeInProgress= TRUE; - - pHalData->CurrentChannelBW = Bandwidth; - -#if 0 - if(Offset==HT_EXTCHNL_OFFSET_LOWER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; - else if(Offset==HT_EXTCHNL_OFFSET_UPPER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; - else - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; -#else - pHalData->nCur40MhzPrimeSC = Offset; -#endif - - if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) - { -#ifdef USE_WORKITEM - //PlatformScheduleWorkItem(&(pHalData->SetBWModeWorkItem)); -#else - #if 0 - //PlatformSetTimer(Adapter, &(pHalData->SetBWModeTimer), 0); - #else - _PHY_SetBWMode92C(Adapter); - #endif -#endif - } - else - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() SetBWModeInProgress FALSE driver sleep or unload\n")); - //pHalData->SetBWModeInProgress= FALSE; - pHalData->CurrentChannelBW = tmpBW; - } - -} - - -static void _PHY_SwChnl8192C(PADAPTER Adapter, u8 channel) -{ - u8 eRFPath; - u32 param1, param2; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //s1. pre common command - CmdID_SetTxPowerLevel - PHY_SetTxPowerLevel8192C(Adapter, channel); - - //s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel - param1 = RF_CHNLBW; - param2 = channel; - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { - pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2); - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); - } - - - //s3. post common command - CmdID_End, None - -} - -VOID -PHY_SwChnl8192C( // Call after initialization - IN PADAPTER Adapter, - IN u8 channel - ) -{ - //PADAPTER Adapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, _TRUE); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 tmpchannel = pHalData->CurrentChannel; - BOOLEAN bResult = _TRUE; - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - //pHalData->SwChnlInProgress=FALSE; - return; //return immediately if it is peudo-phy - } - - //if(pHalData->SwChnlInProgress) - // return; - - //if(pHalData->SetBWModeInProgress) - // return; - - //-------------------------------------------- - switch(pHalData->CurrentWirelessMode) - { - case WIRELESS_MODE_A: - case WIRELESS_MODE_N_5G: - //RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14")); - break; - - case WIRELESS_MODE_B: - //RT_ASSERT((channel<=14), ("WIRELESS_MODE_B but channel>14")); - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - //RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14")); - break; - - default: - //RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode)); - break; - } - //-------------------------------------------- - - //pHalData->SwChnlInProgress = TRUE; - if(channel == 0) - channel = 1; - - pHalData->CurrentChannel=channel; - - //pHalData->SwChnlStage=0; - //pHalData->SwChnlStep=0; - - if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) - { -#ifdef USE_WORKITEM - //bResult = PlatformScheduleWorkItem(&(pHalData->SwChnlWorkItem)); -#else - #if 0 - //PlatformSetTimer(Adapter, &(pHalData->SwChnlTimer), 0); - #else - _PHY_SwChnl8192C(Adapter, channel); - #endif -#endif - if(bResult) - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress TRUE schdule workitem done\n")); - } - else - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE schdule workitem error\n")); - //if(IS_HARDWARE_TYPE_8192SU(Adapter)) - //{ - // pHalData->SwChnlInProgress = FALSE; - pHalData->CurrentChannel = tmpchannel; - //} - } - - } - else - { - //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE driver sleep or unload\n")); - //if(IS_HARDWARE_TYPE_8192SU(Adapter)) - //{ - // pHalData->SwChnlInProgress = FALSE; - pHalData->CurrentChannel = tmpchannel; - //} - } -} - - -static BOOLEAN -phy_SwChnlStepByStep( - IN PADAPTER Adapter, - IN u8 channel, - IN u8 *stage, - IN u8 *step, - OUT u32 *delay - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PCHANNEL_ACCESS_SETTING pChnlAccessSetting; - SwChnlCmd PreCommonCmd[MAX_PRECMD_CNT]; - u4Byte PreCommonCmdCnt; - SwChnlCmd PostCommonCmd[MAX_POSTCMD_CNT]; - u4Byte PostCommonCmdCnt; - SwChnlCmd RfDependCmd[MAX_RFDEPENDCMD_CNT]; - u4Byte RfDependCmdCnt; - SwChnlCmd *CurrentCmd; - u1Byte eRFPath; - u4Byte RfTXPowerCtrl; - BOOLEAN bAdjRfTXPowerCtrl = _FALSE; - - - RT_ASSERT((Adapter != NULL), ("Adapter should not be NULL\n")); -#if(MP_DRIVER != 1) - RT_ASSERT(IsLegalChannel(Adapter, channel), ("illegal channel: %d\n", channel)); -#endif - RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n")); - - pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting; - RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n")); - - //for(eRFPath = RF90_PATH_A; eRFPath NumTotalRFPath; eRFPath++) - //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - //{ - // <1> Fill up pre common command. - PreCommonCmdCnt = 0; - phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, - CmdID_SetTxPowerLevel, 0, 0, 0); - phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, - CmdID_End, 0, 0, 0); - - // <2> Fill up post common command. - PostCommonCmdCnt = 0; - - phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT, - CmdID_End, 0, 0, 0); - - // <3> Fill up RF dependent command. - RfDependCmdCnt = 0; - switch( pHalData->RFChipID ) - { - case RF_8225: - RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); - // 2008/09/04 MH Change channel. - if(channel==14) channel++; - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_RF_WriteReg, rZebra1_Channel, (0x10+channel-1), 10); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_End, 0, 0, 0); - break; - - case RF_8256: - // TEST!! This is not the table for 8256!! - RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_RF_WriteReg, rRfChannel, channel, 10); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_End, 0, 0, 0); - break; - - case RF_6052: - RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_RF_WriteReg, RF_CHNLBW, channel, 10); - phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, - CmdID_End, 0, 0, 0); - - break; - - case RF_8258: - break; - - // For FPGA two MAC verification - case RF_PSEUDO_11N: - return TRUE; - default: - RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); - return FALSE; - break; - } - - - do{ - switch(*stage) - { - case 0: - CurrentCmd=&PreCommonCmd[*step]; - break; - case 1: - CurrentCmd=&RfDependCmd[*step]; - break; - case 2: - CurrentCmd=&PostCommonCmd[*step]; - break; - } - - if(CurrentCmd->CmdID==CmdID_End) - { - if((*stage)==2) - { - return TRUE; - } - else - { - (*stage)++; - (*step)=0; - continue; - } - } - - switch(CurrentCmd->CmdID) - { - case CmdID_SetTxPowerLevel: - PHY_SetTxPowerLevel8192C(Adapter,channel); - break; - case CmdID_WritePortUlong: - PlatformEFIOWrite4Byte(Adapter, CurrentCmd->Para1, CurrentCmd->Para2); - break; - case CmdID_WritePortUshort: - PlatformEFIOWrite2Byte(Adapter, CurrentCmd->Para1, (u2Byte)CurrentCmd->Para2); - break; - case CmdID_WritePortUchar: - PlatformEFIOWrite1Byte(Adapter, CurrentCmd->Para1, (u1Byte)CurrentCmd->Para2); - break; - case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!! - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { -#if 1 - pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | CurrentCmd->Para2); - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); -#else - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, (CurrentCmd->Para2)); -#endif - } - break; - } - - break; - }while(TRUE); - //cosa }/*for(Number of RF paths)*/ - - (*delay)=CurrentCmd->msDelay; - (*step)++; - return FALSE; -#endif - return _TRUE; -} - - -static BOOLEAN -phy_SetSwChnlCmdArray( - SwChnlCmd* CmdTable, - u32 CmdTableIdx, - u32 CmdTableSz, - SwChnlCmdID CmdID, - u32 Para1, - u32 Para2, - u32 msDelay - ) -{ - SwChnlCmd* pCmd; - - if(CmdTable == NULL) - { - //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n")); - return _FALSE; - } - if(CmdTableIdx >= CmdTableSz) - { - //RT_ASSERT(FALSE, - // ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%ld, CmdTableSz:%ld\n", - // CmdTableIdx, CmdTableSz)); - return _FALSE; - } - - pCmd = CmdTable + CmdTableIdx; - pCmd->CmdID = CmdID; - pCmd->Para1 = Para1; - pCmd->Para2 = Para2; - pCmd->msDelay = msDelay; - - return _TRUE; -} - - -static void -phy_FinishSwChnlNow( // We should not call this function directly - IN PADAPTER Adapter, - IN u8 channel - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 delay; - - while(!phy_SwChnlStepByStep(Adapter,channel,&pHalData->SwChnlStage,&pHalData->SwChnlStep,&delay)) - { - if(delay>0) - rtw_mdelay_os(delay); - } -#endif -} - - - -// -// Description: -// Switch channel synchronously. Called by SwChnlByDelayHandler. -// -// Implemented by Bruce, 2008-02-14. -// The following procedure is operted according to SwChanlCallback8190Pci(). -// However, this procedure is performed synchronously which should be running under -// passive level. -// -VOID -PHY_SwChnlPhy8192C( // Only called during initialize - IN PADAPTER Adapter, - IN u8 channel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlPhy8192S(), switch from channel %d to channel %d.\n", pHalData->CurrentChannel, channel)); - - // Cannot IO. - //if(RT_CANNOT_IO(Adapter)) - // return; - - // Channel Switching is in progress. - //if(pHalData->SwChnlInProgress) - // return; - - //return immediately if it is peudo-phy - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - //pHalData->SwChnlInProgress=FALSE; - return; - } - - //pHalData->SwChnlInProgress = TRUE; - if( channel == 0) - channel = 1; - - pHalData->CurrentChannel=channel; - - //pHalData->SwChnlStage = 0; - //pHalData->SwChnlStep = 0; - - phy_FinishSwChnlNow(Adapter,channel); - - //pHalData->SwChnlInProgress = FALSE; -} - - -// -// Description: -// Configure H/W functionality to enable/disable Monitor mode. -// Note, because we possibly need to configure BB and RF in this function, -// so caller should in PASSIVE_LEVEL. 080118, by rcnjko. -// -VOID -PHY_SetMonitorMode8192C( - IN PADAPTER pAdapter, - IN BOOLEAN bEnableMonitorMode - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN bFilterOutNonAssociatedBSSID = FALSE; - - //2 Note: we may need to stop antenna diversity. - if(bEnableMonitorMode) - { - bFilterOutNonAssociatedBSSID = FALSE; - RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): enable monitor mode\n")); - - pHalData->bInMonitorMode = TRUE; - pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE); - pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); - } - else - { - bFilterOutNonAssociatedBSSID = TRUE; - RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): disable monitor mode\n")); - - pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE); - pHalData->bInMonitorMode = FALSE; - pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); - } -#endif -} - - -/*----------------------------------------------------------------------------- - * Function: PHYCheckIsLegalRfPath8190Pci() - * - * Overview: Check different RF type to execute legal judgement. If RF Path is illegal - * We will return false. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/15/2007 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -BOOLEAN -PHY_CheckIsLegalRfPath8192C( - IN PADAPTER pAdapter, - IN u32 eRFPath) -{ -// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN rtValue = _TRUE; - - // NOt check RF Path now.! -#if 0 - if (pHalData->RF_Type == RF_1T2R && eRFPath != RF90_PATH_A) - { - rtValue = FALSE; - } - if (pHalData->RF_Type == RF_1T2R && eRFPath != RF90_PATH_A) - { - - } -#endif - return rtValue; - -} /* PHY_CheckIsLegalRfPath8192C */ - -//------------------------------------------------------------------------- -// -// IQK -// -//------------------------------------------------------------------------- -#define MAX_TOLERANCE 5 -#define IQK_DELAY_TIME 1 //ms - -static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK -_PHY_PathA_IQK( - IN PADAPTER pAdapter, - IN BOOLEAN configPathB - ) -{ - u32 regEAC, regE94, regE9C, regEA4; - u8 result = 0x00; - - //RTPRINT(FINIT, INIT_IQK, ("Path A IQK!\n")); - - //path-A IQK setting - //RTPRINT(FINIT, INIT_IQK, ("Path-A IQK setting!\n")); - PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x10008c1f); - PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x10008c1f); - PHY_SetBBReg(pAdapter, 0xe38, bMaskDWord, 0x82140102); - - PHY_SetBBReg(pAdapter, 0xe3c, bMaskDWord, configPathB ? 0x28160202 : 0x28160502); - -#if 1 - //path-B IQK setting - if(configPathB) - { - PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x10008c22); - PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x10008c22); - PHY_SetBBReg(pAdapter, 0xe58, bMaskDWord, 0x82140102); - PHY_SetBBReg(pAdapter, 0xe5c, bMaskDWord, 0x28160202); - } -#endif - //LO calibration setting - //RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n")); - PHY_SetBBReg(pAdapter, 0xe4c, bMaskDWord, 0x001028d1); - - //One shot, path A LOK & IQK - //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n")); - PHY_SetBBReg(pAdapter, 0xe48, bMaskDWord, 0xf9000000); - PHY_SetBBReg(pAdapter, 0xe48, bMaskDWord, 0xf8000000); - - // delay x ms - //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME)); - rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000); - - // Check failed - regEAC = PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC)); - regE94 = PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xe94 = 0x%x\n", regE94)); - regE9C= PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xe9c = 0x%x\n", regE9C)); - regEA4= PHY_QueryBBReg(pAdapter, 0xea4, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regEA4)); - - if(!(regEAC & BIT28) && - (((regE94 & 0x03FF0000)>>16) != 0x142) && - (((regE9C & 0x03FF0000)>>16) != 0x42) ) - result |= 0x01; - else //if Tx not OK, ignore Rx - return result; - - if(!(regEAC & BIT27) && //if Tx is OK, check whether Rx is OK - (((regEA4 & 0x03FF0000)>>16) != 0x132) && - (((regEAC & 0x03FF0000)>>16) != 0x36)) - result |= 0x02; - else - DBG_8192C("Path A Rx IQK fail!!\n"); - - return result; - - -} - -static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK -_PHY_PathB_IQK( - IN PADAPTER pAdapter - ) -{ - u32 regEAC, regEB4, regEBC, regEC4, regECC; - u8 result = 0x00; - //RTPRINT(FINIT, INIT_IQK, ("Path B IQK!\n")); -#if 0 - //path-B IQK setting - RTPRINT(FINIT, INIT_IQK, ("Path-B IQK setting!\n")); - PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x10008c22); - PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x10008c22); - PHY_SetBBReg(pAdapter, 0xe58, bMaskDWord, 0x82140102); - PHY_SetBBReg(pAdapter, 0xe5c, bMaskDWord, 0x28160202); - - //LO calibration setting - RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n")); - PHY_SetBBReg(pAdapter, 0xe4c, bMaskDWord, 0x001028d1); -#endif - //One shot, path B LOK & IQK - //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n")); - PHY_SetBBReg(pAdapter, 0xe60, bMaskDWord, 0x00000002); - PHY_SetBBReg(pAdapter, 0xe60, bMaskDWord, 0x00000000); - - // delay x ms - //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME)); - rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000); - - // Check failed - regEAC = PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC)); - regEB4 = PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regEB4)); - regEBC= PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xebc = 0x%x\n", regEBC)); - regEC4= PHY_QueryBBReg(pAdapter, 0xec4, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regEC4)); - regECC= PHY_QueryBBReg(pAdapter, 0xecc, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("0xecc = 0x%x\n", regECC)); - - if(!(regEAC & BIT31) && - (((regEB4 & 0x03FF0000)>>16) != 0x142) && - (((regEBC & 0x03FF0000)>>16) != 0x42)) - result |= 0x01; - else - return result; - - if(!(regEAC & BIT30) && - (((regEC4 & 0x03FF0000)>>16) != 0x132) && - (((regECC & 0x03FF0000)>>16) != 0x36)) - result |= 0x02; - else - DBG_8192C("Path B Rx IQK fail!!\n"); - - - return result; - -} - -static VOID -_PHY_PathAFillIQKMatrix( - IN PADAPTER pAdapter, - IN BOOLEAN bIQKOK, - IN int result[][8], - IN u8 final_candidate, - IN BOOLEAN bTxOnly - ) -{ - u32 Oldval_0, X, TX0_A, reg; - int Y, TX0_C; - - //DBG_8192C("Path A IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"); - - if(final_candidate == 0xFF) - return; - else if(bIQKOK) - { - Oldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF; - - X = result[final_candidate][0]; - if ((X & 0x00000200) != 0) - X = X | 0xFFFFFC00; - TX0_A = (X * Oldval_0) >> 8; - //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX0_A = 0x%lx, Oldval_0 0x%lx\n", X, TX0_A, Oldval_0)); - PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A); - PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X* Oldval_0>>7) & 0x1)); - - Y = result[final_candidate][1]; - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - TX0_C = (Y * Oldval_0) >> 8; - //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX = 0x%lx\n", Y, TX0_C)); - PHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6)); - PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F)); - PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y* Oldval_0>>7) & 0x1)); - - if(bTxOnly) - { - DBG_8192C("_PHY_PathAFillIQKMatrix only Tx OK\n"); - return; - } - - reg = result[final_candidate][2]; - PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg); - - reg = result[final_candidate][3] & 0x3F; - PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg); - - reg = (result[final_candidate][3] >> 6) & 0xF; - PHY_SetBBReg(pAdapter, 0xca0, 0xF0000000, reg); - } -} - -static VOID -_PHY_PathBFillIQKMatrix( - IN PADAPTER pAdapter, - IN BOOLEAN bIQKOK, - IN int result[][8], - IN u8 final_candidate, - IN BOOLEAN bTxOnly //do Tx only - ) -{ - u32 Oldval_1, X, TX1_A, reg; - int Y, TX1_C; - - DBG_8192C("Path B IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"); - - if(final_candidate == 0xFF) - return; - else if(bIQKOK) - { - Oldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF; - - X = result[final_candidate][4]; - if ((X & 0x00000200) != 0) - X = X | 0xFFFFFC00; - TX1_A = (X * Oldval_1) >> 8; - //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX1_A = 0x%lx\n", X, TX1_A)); - PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A); - PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X* Oldval_1>>7) & 0x1)); - - Y = result[final_candidate][5]; - if ((Y & 0x00000200) != 0) - Y = Y | 0xFFFFFC00; - TX1_C = (Y * Oldval_1) >> 8; - //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX1_C = 0x%lx\n", Y, TX1_C)); - PHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6)); - PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F)); - PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y* Oldval_1>>7) & 0x1)); - - if(bTxOnly) - return; - - reg = result[final_candidate][6]; - PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg); - - reg = result[final_candidate][7] & 0x3F; - PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg); - - reg = (result[final_candidate][7] >> 6) & 0xF; - PHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg); - } -} - -static VOID -_PHY_SaveADDARegisters( - IN PADAPTER pAdapter, - IN u32* ADDAReg, - IN u32* ADDABackup, - IN u32 RegisterNum - ) -{ - u32 i; - - //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n")); - for( i = 0 ; i < RegisterNum ; i++){ - ADDABackup[i] = PHY_QueryBBReg(pAdapter, ADDAReg[i], bMaskDWord); - } -} - -static VOID -_PHY_SaveMACRegisters( - IN PADAPTER pAdapter, - IN u32* MACReg, - IN u32* MACBackup - ) -{ - u32 i; - - //RTPRINT(FINIT, INIT_IQK, ("Save MAC parameters.\n")); - for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ - MACBackup[i] =rtw_read8(pAdapter, MACReg[i]); - } - MACBackup[i] = rtw_read32(pAdapter, MACReg[i]); - -} - -static VOID -_PHY_ReloadADDARegisters( - IN PADAPTER pAdapter, - IN u32* ADDAReg, - IN u32* ADDABackup, - IN u32 RegiesterNum - ) -{ - u32 i; - - //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n")); - for(i = 0 ; i < RegiesterNum ; i++){ - PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, ADDABackup[i]); - } -} - -static VOID -_PHY_ReloadMACRegisters( - IN PADAPTER pAdapter, - IN u32* MACReg, - IN u32* MACBackup - ) -{ - u32 i; - - //RTPRINT(FINIT, INIT_IQK, ("Reload MAC parameters !\n")); - for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ - rtw_write8(pAdapter, MACReg[i], (u8)MACBackup[i]); - } - rtw_write32(pAdapter, MACReg[i], MACBackup[i]); -} - -static VOID -_PHY_PathADDAOn( - IN PADAPTER pAdapter, - IN u32* ADDAReg, - IN BOOLEAN isPathAOn, - IN BOOLEAN is2T - ) -{ - u32 pathOn; - u32 i; - - //RTPRINT(FINIT, INIT_IQK, ("ADDA ON.\n")); - - pathOn = isPathAOn ? 0x04db25a4 : 0x0b1b25a4; - if(_FALSE == is2T){ - pathOn = 0x0bdb25a0; - PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, 0x0b1b25a0); - } - else{ - PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, pathOn); - } - - for( i = 1 ; i < IQK_ADDA_REG_NUM ; i++){ - PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, pathOn); - } - -} - -static VOID -_PHY_MACSettingCalibration( - IN PADAPTER pAdapter, - IN u32* MACReg, - IN u32* MACBackup - ) -{ - u32 i = 0; - - //RTPRINT(FINIT, INIT_IQK, ("MAC settings for Calibration.\n")); - - rtw_write8(pAdapter, MACReg[i], 0x3F); - - for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){ - rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT3))); - } - rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT5))); - -} - -static VOID -_PHY_PathAStandBy( - IN PADAPTER pAdapter - ) -{ - //RTPRINT(FINIT, INIT_IQK, ("Path-A standby mode!\n")); - - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x0); - PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80800000); -} - -static VOID -_PHY_PIModeSwitch( - IN PADAPTER pAdapter, - IN BOOLEAN PIMode - ) -{ - u32 mode; - - //RTPRINT(FINIT, INIT_IQK, ("BB Switch to %s mode!\n", (PIMode ? "PI" : "SI"))); - - mode = PIMode ? 0x01000100 : 0x01000000; - PHY_SetBBReg(pAdapter, 0x820, bMaskDWord, mode); - PHY_SetBBReg(pAdapter, 0x828, bMaskDWord, mode); -} - -/* -return _FALSE => do IQK again -*/ -static BOOLEAN -_PHY_SimularityCompare( - IN PADAPTER pAdapter, - IN int result[][8], - IN u8 c1, - IN u8 c2 - ) -{ - u32 i, j, diff, SimularityBitMap, bound = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 final_candidate[2] = {0xFF, 0xFF}; //for path A and path B - BOOLEAN bResult = _TRUE, is2T = IS_92C_SERIAL( pHalData->VersionID); - - if(is2T) - bound = 8; - else - bound = 4; - - SimularityBitMap = 0; - - for( i = 0; i < bound; i++ ) - { - diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]); - if (diff > MAX_TOLERANCE) - { - if((i == 2 || i == 6) && !SimularityBitMap) - { - if(result[c1][i]+result[c1][i+1] == 0) - final_candidate[(i/4)] = c2; - else if (result[c2][i]+result[c2][i+1] == 0) - final_candidate[(i/4)] = c1; - else - SimularityBitMap = SimularityBitMap|(1<dmpriv; - u32 i; - u8 PathAOK, PathBOK; - u32 ADDA_REG[IQK_ADDA_REG_NUM] = { 0x85c, 0xe6c, 0xe70, 0xe74, - 0xe78, 0xe7c, 0xe80, 0xe84, - 0xe88, 0xe8c, 0xed0, 0xed4, - 0xed8, 0xedc, 0xee0, 0xeec }; - - u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {0x522, 0x550, 0x551,0x040}; - - u32 IQK_BB_REG[IQK_BB_REG_NUM] = { - 0xc04, 0xc08, 0x874, 0xb68, 0xb6c, - 0x870, 0x860, 0x864, 0x800 - }; - -#if MP_DRIVER - const u32 retryCount = 9; -#else - const u32 retryCount = 2; -#endif - - // Note: IQ calibration must be performed after loading - // PHY_REG.txt , and radio_a, radio_b.txt - - u32 bbvalue; - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - - if(t==0) - { - bbvalue = PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord); - //RTPRINT(FINIT, INIT_IQK, ("PHY_IQCalibrate()==>0x%08lx\n",bbvalue)); - - //RTPRINT(FINIT, INIT_IQK, ("IQ Calibration for %s\n", (is2T ? "2T2R" : "1T1R"))); - - // Save ADDA parameters, turn Path A ADDA on - _PHY_SaveADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup,IQK_ADDA_REG_NUM); - _PHY_SaveMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); - _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM); - } - _PHY_PathADDAOn(pAdapter, ADDA_REG, _TRUE, is2T); - - if(t==0) - { - pdmpriv->bRfPiEnable = (u8)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8)); - } - - if(!pdmpriv->bRfPiEnable){ - // Switch BB to PI mode to do IQ Calibration. - _PHY_PIModeSwitch(pAdapter, _TRUE); - } - - PHY_SetBBReg(pAdapter, 0x800, BIT24, 0x00); - PHY_SetBBReg(pAdapter, 0xc04, bMaskDWord, 0x03a05600); - PHY_SetBBReg(pAdapter, 0xc08, bMaskDWord, 0x000800e4); - PHY_SetBBReg(pAdapter, 0x874, bMaskDWord, 0x22204000); - PHY_SetBBReg(pAdapter, 0x870, BIT10, 0x01); - PHY_SetBBReg(pAdapter, 0x870, BIT26, 0x01); - PHY_SetBBReg(pAdapter, 0x860, BIT10, 0x00); - PHY_SetBBReg(pAdapter, 0x864, BIT10, 0x00); - - if(is2T) - { - PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000); - PHY_SetBBReg(pAdapter, 0x844, bMaskDWord, 0x00010000); - } - - //MAC settings - _PHY_MACSettingCalibration(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); - - //Page B init - if(isNormal) - PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00080000); - else - PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0f600000); - - if(is2T) - { - if(isNormal) - PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00080000); - else - PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x0f600000); - } - - // IQ calibration setting - //RTPRINT(FINIT, INIT_IQK, ("IQK setting!\n")); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80800000); - PHY_SetBBReg(pAdapter, 0xe40, bMaskDWord, 0x01007c00); - PHY_SetBBReg(pAdapter, 0xe44, bMaskDWord, 0x01004800); - - for(i = 0 ; i < retryCount ; i++){ - PathAOK = _PHY_PathA_IQK(pAdapter, is2T); - if(PathAOK == 0x03){ - //DBG_8192C("Path A IQK Success!!\n"); - result[t][0] = (PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord)&0x3FF0000)>>16; - result[t][1] = (PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord)&0x3FF0000)>>16; - result[t][2] = (PHY_QueryBBReg(pAdapter, 0xea4, bMaskDWord)&0x3FF0000)>>16; - result[t][3] = (PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord)&0x3FF0000)>>16; - break; - } - else if (i == (retryCount-1) && PathAOK == 0x01) //Tx IQK OK - { - //DBG_8192C("Path A IQK Only Tx Success!!\n"); - - result[t][0] = (PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord)&0x3FF0000)>>16; - result[t][1] = (PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord)&0x3FF0000)>>16; - } - } - - if(0x00 == PathAOK){ - DBG_8192C("Path A IQK failed!!\n"); - } - - if(is2T){ - _PHY_PathAStandBy(pAdapter); - - // Turn Path B ADDA on - _PHY_PathADDAOn(pAdapter, ADDA_REG, _FALSE, is2T); - - for(i = 0 ; i < retryCount ; i++){ - PathBOK = _PHY_PathB_IQK(pAdapter); - if(PathBOK == 0x03){ - DBG_8192C("Path B IQK Success!!\n"); - result[t][4] = (PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord)&0x3FF0000)>>16; - result[t][5] = (PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord)&0x3FF0000)>>16; - result[t][6] = (PHY_QueryBBReg(pAdapter, 0xec4, bMaskDWord)&0x3FF0000)>>16; - result[t][7] = (PHY_QueryBBReg(pAdapter, 0xecc, bMaskDWord)&0x3FF0000)>>16; - break; - } - else if (i == (retryCount - 1) && PathBOK == 0x01) //Tx IQK OK - { - DBG_8192C("Path B Only Tx IQK Success!!\n"); - result[t][4] = (PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord)&0x3FF0000)>>16; - result[t][5] = (PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord)&0x3FF0000)>>16; - } - } - - if(0x00 == PathBOK){ - DBG_8192C("Path B IQK failed!!\n"); - } - } - - //Back to BB mode, load original value - //RTPRINT(FINIT, INIT_IQK, ("IQK:Back to BB mode, load original value!\n")); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0); - - if(t!=0) - { - if(!pdmpriv->bRfPiEnable){ - // Switch back BB to SI mode after finish IQ Calibration. - _PHY_PIModeSwitch(pAdapter, _FALSE); - } - - // Reload ADDA power saving parameters - _PHY_ReloadADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup, IQK_ADDA_REG_NUM); - - // Reload MAC parameters - _PHY_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); - - // Reload BB parameters - _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM); - - // Restore RX initial gain - PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00032ed3); - if(is2T){ - PHY_SetBBReg(pAdapter, 0x844, bMaskDWord, 0x00032ed3); - } - - //load 0xe30 IQC default value - PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x01008c00); - PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x01008c00); - - } - //RTPRINT(FINIT, INIT_IQK, ("_PHY_IQCalibrate() <==\n")); - -} - - -static VOID -_PHY_LCCalibrate( - IN PADAPTER pAdapter, - IN BOOLEAN is2T - ) -{ - u8 tmpReg; - u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - - //Check continuous TX and Packet TX - tmpReg = rtw_read8(pAdapter, 0xd03); - - if((tmpReg&0x70) != 0) //Deal with contisuous TX case - rtw_write8(pAdapter, 0xd03, tmpReg&0x8F); //disable all continuous TX - else // Deal with Packet TX case - rtw_write8(pAdapter, REG_TXPAUSE, 0xFF); // block all queues - - if((tmpReg&0x70) != 0) - { - //1. Read original RF mode - //Path-A - RF_Amode = PHY_QueryRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits); - - //Path-B - if(is2T) - RF_Bmode = PHY_QueryRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits); - - //2. Set RF mode = standby mode - //Path-A - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000); - - //Path-B - if(is2T) - PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000); - } - - //3. Read RF reg18 - LC_Cal = PHY_QueryRFReg(pAdapter, RF90_PATH_A, 0x18, bMask12Bits); - - //4. Set LC calibration begin - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x18, bMask12Bits, LC_Cal|0x08000); - - if(isNormal) { - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(100); - #else - rtw_mdelay_os(100); - #endif - } - else - rtw_mdelay_os(3); - - //Restore original situation - if((tmpReg&0x70) != 0) //Deal with contisuous TX case - { - //Path-A - rtw_write8(pAdapter, 0xd03, tmpReg); - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits, RF_Amode); - - //Path-B - if(is2T) - PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits, RF_Bmode); - } - else // Deal with Packet TX case - { - rtw_write8(pAdapter, REG_TXPAUSE, 0x00); - } - -} - - -//Analog Pre-distortion calibration -#define APK_BB_REG_NUM 8 -#define APK_CURVE_REG_NUM 4 -#define PATH_NUM 2 - -static VOID -_PHY_APCalibrate( - IN PADAPTER pAdapter, - IN char delta, - IN BOOLEAN is2T - ) -{ -#if 1//(PLATFORM == PLATFORM_WINDOWS)//??? - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - u32 regD[PATH_NUM]; - u32 tmpReg, index, offset, path, i, pathbound = PATH_NUM, apkbound; - - u32 BB_backup[APK_BB_REG_NUM]; - u32 BB_REG[APK_BB_REG_NUM] = { - 0x904, 0xc04, 0x800, 0xc08, 0x874, - 0x870, 0x860, 0x864 }; - u32 BB_AP_MODE[APK_BB_REG_NUM] = { - 0x00000020, 0x00a05430, 0x02040000, - 0x000800e4, 0x00204000 }; - u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = { - 0x00000020, 0x00a05430, 0x02040000, - 0x000800e4, 0x22204000 }; - - u32 AFE_backup[IQK_ADDA_REG_NUM]; - u32 AFE_REG[IQK_ADDA_REG_NUM] = { - 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, - 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, - 0xed0, 0xed4, 0xed8, 0xedc, 0xee0, - 0xeec}; - - u32 MAC_backup[IQK_MAC_REG_NUM]; - u32 MAC_REG[IQK_MAC_REG_NUM] = { - 0x522, 0x550, 0x551, 0x040}; - - u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { - {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c}, - {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e} - }; - - u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { - {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings - {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c} - }; - - u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { - {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d}, - {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050} - }; - - u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { - {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings - {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a} - }; - - u32 APK_RF_value_A[PATH_NUM][APK_BB_REG_NUM] = { - {0x1adb0, 0x1adb0, 0x1ada0, 0x1ad90, 0x1ad80}, - {0x00fb0, 0x00fb0, 0x00fa0, 0x00f90, 0x00f80} - }; - - u32 AFE_on_off[PATH_NUM] = { - 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on - - u32 APK_offset[PATH_NUM] = { - 0xb68, 0xb6c}; - - u32 APK_normal_offset[PATH_NUM] = { - 0xb28, 0xb98}; - - u32 APK_value[PATH_NUM] = { - 0x92fc0000, 0x12fc0000}; - - u32 APK_normal_value[PATH_NUM] = { - 0x92680000, 0x12680000}; - - char APK_delta_mapping[APK_BB_REG_NUM][13] = { - {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0} - }; - - u32 APK_normal_setting_value_1[13] = { - 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28, - 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3, - 0x12680000, 0x00880000, 0x00880000 - }; - - u32 APK_normal_setting_value_2[16] = { - 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3, - 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025, - 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008, - 0x00050006 - }; - - u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a - u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM]; - - int BB_offset, delta_V, delta_offset; - - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - -#if (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; - - pMptCtx->APK_bound[0] = 45; - pMptCtx->APK_bound[1] = 52; -#endif - - //RTPRINT(FINIT, INIT_IQK, ("==>PHY_APCalibrate() delta %d\n", delta)); - - //RTPRINT(FINIT, INIT_IQK, ("AP Calibration for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip"))); - - if(!is2T) - pathbound = 1; - - //2 FOR NORMAL CHIP SETTINGS - if(isNormal) - { -// Temporarily do not allow normal driver to do the following settings because these offset -// and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal -// will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the -// root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31. -#if (MP_DRIVER != 1) - return; -#endif - - //settings adjust for normal chip - for(index = 0; index < PATH_NUM; index ++) - { - APK_offset[index] = APK_normal_offset[index]; - APK_value[index] = APK_normal_value[index]; - AFE_on_off[index] = 0x6fdb25a4; - } - - for(index = 0; index < APK_BB_REG_NUM; index ++) - { - for(path = 0; path < pathbound; path++) - { - APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index]; - APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index]; - } - BB_AP_MODE[index] = BB_normal_AP_MODE[index]; - } - - apkbound = 6; - } - else - { - PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0fe00000); - if(is2T) - PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0fe00000); - apkbound = 12; - } - - //save BB default value - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - if(index == 0 && isNormal) //skip - continue; - BB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord); - } - - //save MAC default value - _PHY_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup); - - //save AFE default value - _PHY_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup,16); - - for(path = 0; path < pathbound; path++) - { - //save old AP curve - if(isNormal) - { - if(path == RF90_PATH_A) - { - //path A APK - //load APK setting - //path-A - offset = 0xb00; - for(index = 0; index < 11; index ++) - { - PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); - - offset += 0x04; - } - - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x12680000); - - offset = 0xb68; - for(; index < 13; index ++) - { - PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); - - offset += 0x04; - } - - //page-B1 - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); - - //path A - offset = 0xb00; - for(index = 0; index < 16; index++) - { - PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); - - offset += 0x04; - } - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - } - else if(path == RF90_PATH_B) - { - //path B APK - //load APK setting - //path-B - offset = 0xb70; - for(index = 0; index < 10; index ++) - { - PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); - - offset += 0x04; - } - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x12680000); - - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x12680000); - - offset = 0xb68; - index = 11; - for(; index < 13; index ++) //offset 0xb68, 0xb6c - { - PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); - - offset += 0x04; - } - - //page-B1 - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); - - //path B - offset = 0xb60; - for(index = 0; index < 16; index++) - { - PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); - - offset += 0x04; - } - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - } - -#if 0 - tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x3, bMaskDWord); - AP_curve[path][0] = tmpReg & 0x1F; //[4:0] - - tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord); - AP_curve[path][1] = (tmpReg & 0xF8000) >> 15; //[19:15] - AP_curve[path][2] = (tmpReg & 0x7C00) >> 10; //[14:10] - AP_curve[path][3] = (tmpReg & 0x3E0) >> 5; //[9:5] -#endif - } - else - { - tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord); - - AP_curve[path][0] = (tmpReg & 0xF8000) >> 15; //[19:15] - AP_curve[path][1] = (tmpReg & 0x7C00) >> 10; //[14:10] - AP_curve[path][2] = (tmpReg & 0x3E0) >> 5; //[9:5] - AP_curve[path][3] = tmpReg & 0x1F; //[4:0] - } - - //save RF default value - regD[path] = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord); - - //Path A AFE all on, path B AFE All off or vise versa - for(index = 0; index < IQK_ADDA_REG_NUM ; index++) - PHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xe70 %x\n", PHY_QueryBBReg(pAdapter, 0xe70, bMaskDWord))); - - //BB to AP mode - if(path == 0) - { - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - if(index == 0 && isNormal) //skip - continue; - else if (index < 5) - PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]); - else if (BB_REG[index] == 0x870) - PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26); - else - PHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0); - } - PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x01008c00); - PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x01008c00); - } - else //path B - { - PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x01008c00); - PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x01008c00); - } - - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x800 %x\n", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord))); - - //MAC settings - _PHY_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup); - - if(path == RF90_PATH_A) //Path B to standby mode - { - PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0, bMaskDWord, 0x10000); - } - else //Path A to standby mode - { - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMaskDWord, 0x10000); - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x10, bMaskDWord, 0x1000f); - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x11, bMaskDWord, 0x20103); - } - - delta_offset = ((delta+14)/2); - if(delta_offset < 0) - delta_offset = 0; - else if (delta_offset > 12) - delta_offset = 12; - - //AP calibration - for(index = 0; index < APK_BB_REG_NUM; index++) - { - if(index != 1 && isNormal) //only DO PA11+PAD01001, AP RF setting - continue; - - tmpReg = APK_RF_init_value[path][index]; -#if 1 - if(!pdmpriv->bAPKThermalMeterIgnore) - { - BB_offset = (tmpReg & 0xF0000) >> 16; - - if(!(tmpReg & BIT15)) //sign bit 0 - { - BB_offset = -BB_offset; - } - - delta_V = APK_delta_mapping[index][delta_offset]; - - BB_offset += delta_V; - - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() APK num %d delta_V %d delta_offset %d\n", index, delta_V, delta_offset)); - - if(BB_offset < 0) - { - tmpReg = tmpReg & (~BIT15); - BB_offset = -BB_offset; - } - else - { - tmpReg = tmpReg | BIT15; - } - tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16); - } -#endif - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xc, bMaskDWord, 0x8992e); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xc, bMaskDWord))); - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x0, bMaskDWord, APK_RF_value_0[path][index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x0, bMaskDWord))); - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord, tmpReg); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord))); - if(!isNormal) - { - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xa, bMaskDWord, APK_RF_value_A[path][index]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xa %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xa, bMaskDWord))); - } - - // PA11+PAD01111, one shot - i = 0; - do - { - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); - { - PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord))); - rtw_mdelay_os(3); - PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]); - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord))); - if(isNormal) { - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(20); - #else - rtw_mdelay_os(20); - #endif - } - else - rtw_mdelay_os(3); - } - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - - if(!isNormal) - { - tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xb, bMaskDWord); - tmpReg = (tmpReg & 0x3E00) >> 9; - } - else - { - if(path == RF90_PATH_A) - tmpReg = PHY_QueryBBReg(pAdapter, 0xbd8, 0x03E00000); - else - tmpReg = PHY_QueryBBReg(pAdapter, 0xbd8, 0xF8000000); - } - //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xbd8[25:21] %x\n", tmpReg)); - - i++; - } - while(tmpReg > apkbound && i < 4); - - APK_result[path][index] = tmpReg; - } - } - - //reload MAC default value - _PHY_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup); - - //reload BB default value - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - if(index == 0 && isNormal) //skip - continue; - PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]); - } - - //reload AFE default value - _PHY_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); - - //reload RF path default value - for(path = 0; path < pathbound; path++) - { - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord, regD[path]); - if(path == RF90_PATH_B) - { - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x10, bMaskDWord, 0x1000f); - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x11, bMaskDWord, 0x20101); - } -#if 1 - if(!isNormal) - { - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - if(APK_result[path][index] > 12) - APK_result[path][index] = AP_curve[path][index-1]; - //RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", index, APK_result[path][index])); - } - } - else - { //note no index == 0 - if (APK_result[path][1] > 6) - APK_result[path][1] = 6; - //RTPRINT(FINIT, INIT_IQK, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1])); - -#if 0 - if(APK_result[path][2] < 2) - APK_result[path][2] = 2; - else if (APK_result[path][2] > 6) - APK_result[path][2] = 6; - RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 2, APK_result[path][2])); - - if(APK_result[path][3] < 2) - APK_result[path][3] = 2; - else if (APK_result[path][3] > 6) - APK_result[path][3] = 6; - RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 3, APK_result[path][3])); - - if(APK_result[path][4] < 5) - APK_result[path][4] = 5; - else if (APK_result[path][4] > 9) - APK_result[path][4] = 9; - RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 4, APK_result[path][4])); -#endif - - } -#endif - } - - //RTPRINT(FINIT, INIT_IQK, ("\n")); - - - for(path = 0; path < pathbound; path++) - { - if(isNormal) - { - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x3, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1])); - if(path == RF90_PATH_A) - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05)); - else - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05)); - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, - ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08)); - } - else - { - for(index = 0; index < 2; index++) - pdmpriv->APKoutput[path][index] = ((APK_result[path][index] << 15) | (APK_result[path][2] << 10) | (APK_result[path][3] << 5) | APK_result[path][4]); - -#if (MP_DRIVER == 1) - if(pMptCtx->TxPwrLevel[path] > pMptCtx->APK_bound[path]) - { - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, - pdmpriv->APKoutput[path][0]); - } - else - { - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, - pdmpriv->APKoutput[path][1]); - } -#else - PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, - pdmpriv->APKoutput[path][0]); -#endif - } - } - - pdmpriv->bAPKdone = _TRUE; - - //RTPRINT(FINIT, INIT_IQK, ("<==PHY_APCalibrate()\n")); -#endif -} - - -#define DP_BB_REG_NUM 7 -#define DP_RF_REG_NUM 1 -#define DP_RETRY_LIMIT 10 -#define DP_PATH_NUM 2 -#define DP_DPK_NUM 3 -#define DP_DPK_VALUE_NUM 2 - -//digital predistortion -static VOID -_PHY_DigitalPredistortion( - IN PADAPTER pAdapter, - IN BOOLEAN is2T - ) -{ -#if 1//(PLATFORM == PLATFORM_WINDOWS) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - u32 tmpReg, tmpReg2, index, offset, path, i, pathbound = PATH_NUM; - u32 AFE_backup[IQK_ADDA_REG_NUM]; - u32 AFE_REG[IQK_ADDA_REG_NUM] = { - 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, - 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, - 0xed0, 0xed4, 0xed8, 0xedc, 0xee0, - 0xeec}; - - u32 BB_backup[DP_BB_REG_NUM]; - u32 BB_REG[DP_BB_REG_NUM] = { - 0xc04, 0x800, 0xc08, 0x874, - 0x870, 0x860, 0x864}; - u32 BB_settings[DP_BB_REG_NUM] = { - 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, - 0x0, 0x0, 0x0}; - - u32 RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; - u32 RF_REG[DP_RF_REG_NUM] = { - 0x0d}; - - u32 MAC_backup[IQK_MAC_REG_NUM]; - u32 MAC_REG[IQK_MAC_REG_NUM] = { - 0x522, 0x550, 0x551, 0x040}; - - u32 Tx_AGC[DP_DPK_NUM][DP_DPK_VALUE_NUM] = { - {0x1e1e1e1e, 0x03901e1e}, - {0x18181818, 0x03901818}, - {0x0e0e0e0e, 0x03900e0e} - }; - -// u32 RF_PATHA_backup[DP_RF_REG_NUM]; -// u32 RF_REG_PATHA[DP_RF_REG_NUM] = { -// 0x00, 0x10, 0x11}; - - u32 Reg800, Reg874, Regc04, Regc08, Reg040; - - u32 AFE_on_off[PATH_NUM] = { - 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on - - u32 RetryCount = 0; - - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - - //DBG_8192C("==>_PHY_DigitalPredistortion()\n"); - - //DBG_8192C("_PHY_DigitalPredistortion for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip")); - - if(!isNormal) - return; - - //save BB default value - for(index=0; index tx_agc 1f ~11 - // PA gain = 11 & PAD2 => tx_agc 10~0e - // PA gain = 01 => tx_agc 0b~0d - // PA gain = 00 => tx_agc 0a~00 - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); - PHY_SetBBReg(pAdapter, 0xbc0, bMaskDWord, 0x0005361f); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - - //do inner loopback DPK 3 times - for(i = 0; i < 3; i++) - { - //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 - for(index = 0; index < 3; index++) - PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, Tx_AGC[i][0]); - PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, Tx_AGC[i][1]); - for(index = 0; index < 4; index++) - PHY_SetBBReg(pAdapter, 0xe10+index*4, bMaskDWord, Tx_AGC[i][0]); - - // PAGE_B for Path-A inner loopback DPK setting - PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02097098); - PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0xf76d9f84); - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); - PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); - - //----send one shot signal----// - // Path A - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x80047788); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x00047788); - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); - #else - rtw_mdelay_os(50); - #endif - } - - //PA gain = 11 => tx_agc = 1a - for(index = 0; index < 3; index++) - PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, 0x34343434); - PHY_SetBBReg(pAdapter, 0xe08+index*4, bMaskDWord, 0x03903434); - for(index = 0; index < 4; index++) - PHY_SetBBReg(pAdapter, 0xe10+index*4, bMaskDWord, 0x34343434); - - //==================================== - // PAGE_B for Path-A DPK setting - //==================================== - // open inner loopback @ b00[19]:10 od 0xb00 0x01097018 - PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02017098); - PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0xf76d9f84); - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); - PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); - - //rf_lpbk_setup - //1.rf 00:5205a, rf 0d:0e52c - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x0c, bMaskDWord, 0x8992b); - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x0d, bMaskDWord, 0x0e52c); - PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMaskDWord, 0x5205a ); - - //----send one shot signal----// - // Path A - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x800477c0); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x000477c0); - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); - #else - rtw_mdelay_os(50); - #endif - - while(RetryCount < DP_RETRY_LIMIT && !pdmpriv->bDPPathAOK) - { - //----read back measurement results----// - PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x0c297018); - tmpReg = PHY_QueryBBReg(pAdapter, 0xbe0, bMaskDWord); - rtw_mdelay_os(10); - PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x0c29701f); - tmpReg2 = PHY_QueryBBReg(pAdapter, 0xbe8, bMaskDWord); - rtw_mdelay_os(10); - - tmpReg = (tmpReg & bMaskHWord) >> 16; - tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; - if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff ) - { - PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02017098); - - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x800477c0); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x000477c0); - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); - #else - rtw_mdelay_os(50); - #endif - RetryCount++; - DBG_8192C("path A DPK RetryCount %d 0xbe0[31:16] %x 0xbe8[31:16] %x\n", RetryCount, tmpReg, tmpReg2); - } - else - { - DBG_8192C("path A DPK Sucess\n"); - pdmpriv->bDPPathAOK = _TRUE; - break; - } - } - RetryCount = 0; - - //DPP path A - if(pdmpriv->bDPPathAOK) - { - // DP settings - PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x01017098); - PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0x776d9f84); - PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); - PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); - - for(i=0xb00; i<=0xb3c; i+=4) - { - PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x40004000); - //DBG_8192C("path A ofsset = 0x%x\n", i); - } - - //pwsf - PHY_SetBBReg(pAdapter, 0xb40, bMaskDWord, 0x40404040); - PHY_SetBBReg(pAdapter, 0xb44, bMaskDWord, 0x28324040); - PHY_SetBBReg(pAdapter, 0xb48, bMaskDWord, 0x10141920); - - for(i=0xb4c; i<=0xb5c; i+=4) - { - PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x0c0c0c0c); - } - - //TX_AGC boundary - PHY_SetBBReg(pAdapter, 0xbc0, bMaskDWord, 0x0005361f); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - } - else - { - PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x00000000); - PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0x00000000); - } - - //DPK path B - if(is2T) - { - //Path A to standby mode - PHY_SetRFReg(pAdapter, RF90_PATH_A, RF_AC, bMaskDWord, 0x10000); - - // LUTs => tx_agc - // PA gain = 11 & PAD1, => tx_agc 1f ~11 - // PA gain = 11 & PAD2, => tx_agc 10 ~0e - // PA gain = 01 => tx_agc 0b ~0d - // PA gain = 00 => tx_agc 0a ~00 - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); - PHY_SetBBReg(pAdapter, 0xbc4, bMaskDWord, 0x0005361f); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - - //do inner loopback DPK 3 times - for(i = 0; i < 3; i++) - { - //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 - for(index = 0; index < 4; index++) - PHY_SetBBReg(pAdapter, 0x830+index*4, bMaskDWord, Tx_AGC[i][0]); - for(index = 0; index < 2; index++) - PHY_SetBBReg(pAdapter, 0x848+index*4, bMaskDWord, Tx_AGC[i][0]); - for(index = 0; index < 2; index++) - PHY_SetBBReg(pAdapter, 0x868+index*4, bMaskDWord, Tx_AGC[i][0]); - - // PAGE_B for Path-A inner loopback DPK setting - PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02097098); - PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0xf76d9f84); - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); - PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); - - //----send one shot signal----// - // Path B - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x80047788); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x00047788); - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); - #else - rtw_mdelay_os(50); - #endif - } - - // PA gain = 11 => tx_agc = 1a - for(index = 0; index < 4; index++) - PHY_SetBBReg(pAdapter, 0x830+index*4, bMaskDWord, 0x34343434); - for(index = 0; index < 2; index++) - PHY_SetBBReg(pAdapter, 0x848+index*4, bMaskDWord, 0x34343434); - for(index = 0; index < 2; index++) - PHY_SetBBReg(pAdapter, 0x868+index*4, bMaskDWord, 0x34343434); - - // PAGE_B for Path-B DPK setting - PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02017098); - PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0xf76d9f84); - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); - PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); - - // RF lpbk switches on - PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x0101000f); - PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x01120103); - - //Path-B RF lpbk - PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0c, bMaskDWord, 0x8992b); - PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0d, bMaskDWord, 0x0e52c); - PHY_SetRFReg(pAdapter, RF90_PATH_B, RF_AC, bMaskDWord, 0x5205a); - - //----send one shot signal----// - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x800477c0); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x000477c0); - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); - #else - rtw_mdelay_os(50); - #endif - - while(RetryCount < DP_RETRY_LIMIT && !pdmpriv->bDPPathBOK) - { - //----read back measurement results----// - PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x0c297018); - tmpReg = PHY_QueryBBReg(pAdapter, 0xbf0, bMaskDWord); - PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x0c29701f); - tmpReg2 = PHY_QueryBBReg(pAdapter, 0xbf8, bMaskDWord); - - tmpReg = (tmpReg & bMaskHWord) >> 16; - tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; - - if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff) - { - PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02017098); - - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x800477c0); - rtw_mdelay_os(1); - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x000477c0); - #ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); - #else - rtw_mdelay_os(50); - #endif - RetryCount++; - DBG_8192C("path B DPK RetryCount %d 0xbf0[31:16] %x, 0xbf8[31:16] %x\n", RetryCount , tmpReg, tmpReg2); - } - else - { - DBG_8192C("path B DPK Success\n"); - pdmpriv->bDPPathBOK = _TRUE; - break; - } - } - - //DPP path B - if(pdmpriv->bDPPathBOK) - { - // DP setting - // LUT by SRAM - PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x01017098); - PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0x776d9f84); - PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); - PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); - - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); - for(i=0xb60; i<=0xb9c; i+=4) - { - PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x40004000); - //DBG_8192C("path B ofsset = 0x%x\n", i); - } - - // PWSF - PHY_SetBBReg(pAdapter, 0xba0, bMaskDWord, 0x40404040); - PHY_SetBBReg(pAdapter, 0xba4, bMaskDWord, 0x28324050); - PHY_SetBBReg(pAdapter, 0xba8, bMaskDWord, 0x0c141920); - - for(i=0xbac; i<=0xbbc; i+=4) - { - PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x0c0c0c0c); - } - - // tx_agc boundary - PHY_SetBBReg(pAdapter, 0xbc4, bMaskDWord, 0x0005361f); - PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); - - } - else - { - PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x00000000); - PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0x00000000); - } - } - - //reload BB default value - for(index=0; indexbDPdone = _TRUE; - //DBG_8192C("<==_PHY_DigitalPredistortion()\n"); -#endif -} - - -static VOID _PHY_SetRFPathSwitch( - IN PADAPTER pAdapter, - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ - u8 u1bTmp; - - if(!pAdapter->hw_init_completed) - { - u1bTmp = rtw_read8(pAdapter, REG_LEDCFG2) | BIT7; - rtw_write8(pAdapter, REG_LEDCFG2, u1bTmp); - //PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - - if(is2T) - { - if(bMain) - PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A - else - PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT - } - else - { - - if(bMain) - PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x2); //Main - else - PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x1); //Aux - } - -} - -//return value TRUE => Main; FALSE => Aux - -static BOOLEAN _PHY_QueryRFPathSwitch( - IN PADAPTER pAdapter, - IN BOOLEAN is2T - ) -{ -// if(is2T) -// return _TRUE; - - if(!pAdapter->hw_init_completed) - { - PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); - PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - - if(is2T) - { - if(PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) - return _TRUE; - else - return _FALSE; - } - else - { - if(PHY_QueryBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300) == 0x02) - return _TRUE; - else - return _FALSE; - } -} - - -static VOID -_PHY_DumpRFReg(IN PADAPTER pAdapter) -{ - u32 rfRegValue,rfRegOffset; - - //RTPRINT(FINIT, INIT_RF, ("PHY_DumpRFReg()====>\n")); - - for(rfRegOffset = 0x00;rfRegOffset<=0x30;rfRegOffset++){ - rfRegValue = PHY_QueryRFReg(pAdapter,RF90_PATH_A, rfRegOffset, bMaskDWord); - //RTPRINT(FINIT, INIT_RF, (" 0x%02x = 0x%08x\n",rfRegOffset,rfRegValue)); - } - //RTPRINT(FINIT, INIT_RF, ("<===== PHY_DumpRFReg()\n")); -} - - -VOID -rtl8192c_PHY_IQCalibrate( - IN PADAPTER pAdapter, - IN BOOLEAN bReCovery - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u32 IQK_BB_REG[9] = { - rOFDM0_XARxIQImbalance, rOFDM0_XBRxIQImbalance, rOFDM0_ECCAThreshold, rOFDM0_AGCRSSITable, - rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance, rOFDM0_XCTxAFE, rOFDM0_XDTxAFE, rOFDM0_RxIQExtAnta}; - int result[4][8]; //last is final result - u8 i, final_candidate; - BOOLEAN bPathAOK, bPathBOK; - int RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0; - BOOLEAN is12simular, is13simular, is23simular; - - -#if (MP_DRIVER == 1) - //ignore IQK when continuous Tx - if (pAdapter->mppriv.MptCtx.bStartContTx == _TRUE) - return; - if (pAdapter->mppriv.MptCtx.bCarrierSuppression == _TRUE) - return; - if (pAdapter->mppriv.MptCtx.bSingleCarrier == _TRUE) - return; - if (pAdapter->mppriv.MptCtx.bSingleTone == _TRUE) - return; -#endif - -#if DISABLE_BB_RF - return; -#endif - - if(bReCovery) - { - _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); - return; - } - //DBG_8192C("IQK:Start!!!\n"); - - for(i = 0; i < 8; i++) - { - result[0][i] = 0; - result[1][i] = 0; - result[2][i] = 0; - result[3][i] = 0; - } - final_candidate = 0xff; - bPathAOK = _FALSE; - bPathBOK = _FALSE; - is12simular = _FALSE; - is23simular = _FALSE; - is13simular = _FALSE; - - for (i=0; i<3; i++) - { - if(IS_92C_SERIAL( pHalData->VersionID)){ - _PHY_IQCalibrate(pAdapter, result, i, _TRUE); - //_PHY_DumpRFReg(pAdapter); - } - else{ - // For 88C 1T1R - _PHY_IQCalibrate(pAdapter, result, i, _FALSE); - } - - if(i == 1) - { - is12simular = _PHY_SimularityCompare(pAdapter, result, 0, 1); - if(is12simular) - { - final_candidate = 0; - break; - } - } - - if(i == 2) - { - is13simular = _PHY_SimularityCompare(pAdapter, result, 0, 2); - if(is13simular) - { - final_candidate = 0; - break; - } - - is23simular = _PHY_SimularityCompare(pAdapter, result, 1, 2); - if(is23simular) - final_candidate = 1; - else - { - for(i = 0; i < 8; i++) - RegTmp += result[3][i]; - - if(RegTmp != 0) - final_candidate = 3; - else - final_candidate = 0xFF; - } - } - } - - for (i=0; i<4; i++) - { - RegE94 = result[i][0]; - RegE9C = result[i][1]; - RegEA4 = result[i][2]; - RegEAC = result[i][3]; - RegEB4 = result[i][4]; - RegEBC = result[i][5]; - RegEC4 = result[i][6]; - RegECC = result[i][7]; - //RTPRINT(FINIT, INIT_IQK, ("IQK: RegE94=%lx RegE9C=%lx RegEA4=%lx RegEAC=%lx RegEB4=%lx RegEBC=%lx RegEC4=%lx RegECC=%lx\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC)); - } - - if(final_candidate != 0xff) - { - pdmpriv->RegE94 = RegE94 = result[final_candidate][0]; - pdmpriv->RegE9C = RegE9C = result[final_candidate][1]; - RegEA4 = result[final_candidate][2]; - RegEAC = result[final_candidate][3]; - pdmpriv->RegEB4 = RegEB4 = result[final_candidate][4]; - pdmpriv->RegEBC = RegEBC = result[final_candidate][5]; - RegEC4 = result[final_candidate][6]; - RegECC = result[final_candidate][7]; - //DBG_8192C("IQK: final_candidate is %x\n", final_candidate); - //DBG_8192C("IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC); - bPathAOK = bPathBOK = _TRUE; - } - else - { - - #if 0 - DBG_871X("%s do _PHY_ReloadADDARegisters\n"); - _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); - return; - #else - pdmpriv->RegE94 = pdmpriv->RegEB4 = 0x100; //X default value - pdmpriv->RegE9C = pdmpriv->RegEBC = 0x0; //Y default value - #endif - } - - if((RegE94 != 0)/*&&(RegEA4 != 0)*/) - _PHY_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0)); - - if(IS_92C_SERIAL( pHalData->VersionID)){ - if((RegEB4 != 0)/*&&(RegEC4 != 0)*/) - _PHY_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0)); - } - - _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); - -} - - -VOID -rtl8192c_PHY_LCCalibrate( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - -#if (MP_DRIVER == 1) - // ignore LCK when continuous Tx - if (pAdapter->mppriv.MptCtx.bStartContTx == _TRUE) - return; - if (pAdapter->mppriv.MptCtx.bCarrierSuppression == _TRUE) - return; - if (pAdapter->mppriv.MptCtx.bSingleCarrier == _TRUE) - return; - if (pAdapter->mppriv.MptCtx.bSingleTone == _TRUE) - return; -#endif - -#if DISABLE_BB_RF - return; -#endif - - if(IS_92C_SERIAL( pHalData->VersionID)){ - _PHY_LCCalibrate(pAdapter, _TRUE); - } - else{ - // For 88C 1T1R - _PHY_LCCalibrate(pAdapter, _FALSE); - } -} - -VOID -rtl8192c_PHY_APCalibrate( - IN PADAPTER pAdapter, - IN char delta - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - -#if DISABLE_BB_RF - return; -#endif - - if(pdmpriv->bAPKdone) - return; - -// if(IS_NORMAL_CHIP(pHalData->VersionID)) -// return; - - if(IS_92C_SERIAL( pHalData->VersionID)){ - _PHY_APCalibrate(pAdapter, delta, _TRUE); - } - else{ - // For 88C 1T1R - _PHY_APCalibrate(pAdapter, delta, _FALSE); - } -} - -VOID -rtl8192c_PHY_DigitalPredistortion( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - -#if DISABLE_BB_RF - return; -#endif - - return; - - if(pdmpriv->bDPdone) - return; - - if(IS_92C_SERIAL( pHalData->VersionID)){ - _PHY_DigitalPredistortion(pAdapter, _TRUE); - } - else{ - // For 88C 1T1R - _PHY_DigitalPredistortion(pAdapter, _FALSE); - } -} - -VOID rtl8192c_PHY_SetRFPathSwitch( - IN PADAPTER pAdapter, - IN BOOLEAN bMain - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#if DISABLE_BB_RF - return; -#endif - - if(IS_92C_SERIAL( pHalData->VersionID)){ - _PHY_SetRFPathSwitch(pAdapter, bMain, _TRUE); - } - else{ - // For 88C 1T1R - _PHY_SetRFPathSwitch(pAdapter, bMain, _FALSE); - } -} - -// -// Move from phycfg.c to gen.c to be code independent later -// -//-------------------------Move to other DIR later----------------------------*/ -#ifdef CONFIG_USB_HCI - -// -// Description: -// To dump all Tx FIFO LLT related link-list table. -// Added by Roger, 2009.03.10. -// -VOID -DumpBBDbgPort_92CU( - IN PADAPTER Adapter - ) -{ - - //RT_TRACE(COMP_SEND, DBG_WARNING, ("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("BaseBand Debug Ports:\n")); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0000); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0803); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0a06); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0007); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); - PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x000f0000); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); - PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x00150000); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); - - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x800, PHY_QueryBBReg(Adapter, 0x0800, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x900, PHY_QueryBBReg(Adapter, 0x0900, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa00, PHY_QueryBBReg(Adapter, 0x0a00, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa54, PHY_QueryBBReg(Adapter, 0x0a54, bMaskDWord))); - //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa58, PHY_QueryBBReg(Adapter, 0x0a58, bMaskDWord))); - -} -#endif - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c deleted file mode 100755 index d17c23f9a720..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c +++ /dev/null @@ -1,1047 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -/****************************************************************************** - * - * - * Module: rtl8192c_rf6052.c ( Source C File) - * - * Note: Provide RF 6052 series relative API. - * - * Function: - * - * Export: - * - * Abbrev: - * - * History: - * Data Who Remark - * - * 09/25/2008 MHC Create initial version. - * 11/05/2008 MHC Add API for tw power setting. - * - * -******************************************************************************/ - -#define _RTL8192C_RF6052_C_ - -#include -#include -#include -#include - -#include - -/*---------------------------Define Local Constant---------------------------*/ -// Define local structure for debug!!!!! -typedef struct RF_Shadow_Compare_Map { - // Shadow register value - u32 Value; - // Compare or not flag - u8 Compare; - // Record If it had ever modified unpredicted - u8 ErrorOrNot; - // Recorver Flag - u8 Recorver; - // - u8 Driver_Write; -}RF_SHADOW_T; -/*---------------------------Define Local Constant---------------------------*/ - - -/*------------------------Define global variable-----------------------------*/ -/*------------------------Define global variable-----------------------------*/ - - -/*------------------------Define local variable------------------------------*/ -// 2008/11/20 MH For Debug only, RF -//static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG] = {0}; -static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG]; -/*------------------------Define local variable------------------------------*/ - - -/*----------------------------------------------------------------------------- - * Function: RF_ChangeTxPath - * - * Overview: For RL6052, we must change some RF settign for 1T or 2T. - * - * Input: u2Byte DataRate // 0x80-8f, 0x90-9f - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 09/25/2008 MHC Create Version 0. - * Firmwaer support the utility later. - * - *---------------------------------------------------------------------------*/ -void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, - IN u16 DataRate) -{ -// We do not support gain table change inACUT now !!!! Delete later !!! -#if 0//(RTL92SE_FPGA_VERIFY == 0) - static u1Byte RF_Path_Type = 2; // 1 = 1T 2= 2T - static u4Byte tx_gain_tbl1[6] - = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100}; - static u4Byte tx_gain_tbl2[6] - = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030}; - u1Byte i; - - if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7) - { - // Set TX SYNC power G2G3 loop filter - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x0f000); - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TXPA_G3, bRFRegOffsetMask, 0xeacf1); - - // Change TX AGC gain table - for (i = 0; i < 6; i++) - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl1[i]); - - // Set PA to high value - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x01e39); - } - else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8) - { - // Set TX SYNC power G2G3 loop filter - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x04440); - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TXPA_G3, bRFRegOffsetMask, 0xea4f1); - - // Change TX AGC gain table - for (i = 0; i < 6; i++) - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl2[i]); - - // Set PA low gain - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, - RF_TXPA_G2, bRFRegOffsetMask, 0x01e19); - } -#endif - -} /* RF_ChangeTxPath */ - - -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetBandwidth() - * - * Overview: This function is called by SetBWModeCallback8190Pci() only - * - * Input: PADAPTER Adapter - * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M - * - * Output: NONE - * - * Return: NONE - * - * Note: For RF type 0222D - *---------------------------------------------------------------------------*/ -VOID -rtl8192c_PHY_RF6052SetBandwidth( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth) //20M or 40M -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - switch(Bandwidth) - { - case HT_CHANNEL_WIDTH_20: - pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400); - PHY_SetRFReg(Adapter, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); - break; - - case HT_CHANNEL_WIDTH_40: - pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff)); - PHY_SetRFReg(Adapter, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); - break; - - default: - //RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth )); - break; - } - -} - - -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetCckTxPower - * - * Overview: - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/05/2008 MHC Simulate 8192series.. - * - *---------------------------------------------------------------------------*/ - -VOID -rtl8192c_PHY_RF6052SetCckTxPower( - IN PADAPTER Adapter, - IN u8* pPowerlevel) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; - u32 TxAGC[2]={0, 0}, tmpval=0; - BOOLEAN TurboScanOff = _FALSE; - u8 idx1, idx2; - u8* ptr; - - // 2010/10/18 MH Accorsing to SD3 eechou's suggestion, we need to disable turbo scan for RU. - // Otherwise, external PA will be broken if power index > 0x20. -#ifdef CONFIG_USB_HCI - if (pHalData->EEPROMRegulatory != 0 || pHalData->ExternalPA) -#else - if (pHalData->EEPROMRegulatory != 0) -#endif - { - //DbgPrint("TurboScanOff=1 EEPROMRegulatory=%d ExternalPA=%d\n", pHalData->EEPROMRegulatory, pHalData->ExternalPA); - TurboScanOff = _TRUE; - } - - if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) - { - TxAGC[RF90_PATH_A] = 0x3f3f3f3f; - TxAGC[RF90_PATH_B] = 0x3f3f3f3f; - - TurboScanOff = _TRUE;//disable turbo scan - - if(TurboScanOff) - { - for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) - { - TxAGC[idx1] = - pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | - (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); -#ifdef CONFIG_USB_HCI - // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. - if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA) - TxAGC[idx1] = 0x20; -#endif - } - } - } - else - { -// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. -// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. -// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) - { - TxAGC[RF90_PATH_A] = 0x10101010; - TxAGC[RF90_PATH_B] = 0x10101010; - } - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) - { - TxAGC[RF90_PATH_A] = 0x00000000; - TxAGC[RF90_PATH_B] = 0x00000000; - } - else - { - for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) - { - TxAGC[idx1] = - pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | - (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); - } - - if(pHalData->EEPROMRegulatory==0) - { - tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + - (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8); - TxAGC[RF90_PATH_A] += tmpval; - - tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + - (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24); - TxAGC[RF90_PATH_B] += tmpval; - } - } - } - - for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) - { - ptr = (u8*)(&(TxAGC[idx1])); - for(idx2=0; idx2<4; idx2++) - { - if(*ptr > RF6052_MAX_TX_PWR) - *ptr = RF6052_MAX_TX_PWR; - ptr++; - } - } - - // rf-A cck tx power - tmpval = TxAGC[RF90_PATH_A]&0xff; - PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); - tmpval = TxAGC[RF90_PATH_A]>>8; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); - - // rf-B cck tx power - tmpval = TxAGC[RF90_PATH_B]>>24; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); - tmpval = TxAGC[RF90_PATH_B]&0x00ffffff; - PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); - //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", - // tmpval, rTxAGC_B_CCK1_55_Mcs32)); - -} /* PHY_RF6052SetCckTxPower */ - -// -// powerbase0 for OFDM rates -// powerbase1 for HT MCS rates -// -static void getPowerBase( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel, - IN OUT u32* OfdmBase, - IN OUT u32* MCSBase - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 powerBase0, powerBase1; - u8 Legacy_pwrdiff=0, HT20_pwrdiff=0; - u8 i, powerlevel[2]; - - for(i=0; i<2; i++) - { - powerlevel[i] = pPowerLevel[i]; - Legacy_pwrdiff = pHalData->TxPwrLegacyHtDiff[i][Channel-1]; - powerBase0 = powerlevel[i] + Legacy_pwrdiff; - - powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0; - *(OfdmBase+i) = powerBase0; - //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i))); - } - - for(i=0; i<2; i++) - { - //Check HT20 to HT40 diff - if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) - { - HT20_pwrdiff = pHalData->TxPwrHt20Diff[i][Channel-1]; - powerlevel[i] += HT20_pwrdiff; - } - powerBase1 = powerlevel[i]; - powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1; - *(MCSBase+i) = powerBase1; - //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i))); - } -} - -static void getTxPowerWriteValByRegulatory( - IN PADAPTER Adapter, - IN u8 Channel, - IN u8 index, - IN u32* powerBase0, - IN u32* powerBase1, - OUT u32* pOutWriteVal - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 i, chnlGroup, pwr_diff_limit[4]; - u32 writeVal, customer_limit, rf; - - // - // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate - // - for(rf=0; rf<2; rf++) - { - switch(pHalData->EEPROMRegulatory) - { - case 0: // Realtek better performance - // increase power diff defined by Realtek for large power - chnlGroup = 0; - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - case 1: // Realtek regulatory - // increase power diff defined by Realtek for regulatory - { - if(pHalData->pwrGroupCnt == 1) - chnlGroup = 0; - if(pHalData->pwrGroupCnt >= 3) - { - if(Channel <= 3) - chnlGroup = 0; - else if(Channel >= 4 && Channel <= 9) - chnlGroup = 1; - else if(Channel > 9) - chnlGroup = 2; - - if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) - chnlGroup++; - else - chnlGroup+=4; - } - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - } - break; - case 2: // Better regulatory - // don't increase any power diff - writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - case 3: // Customer defined power diff. - // increase power diff defined by customer. - chnlGroup = 0; - //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", - // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); - - if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) - { - //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n", - // ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1])); - } - else - { - //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n", - // ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1])); - } - for (i=0; i<4; i++) - { - pwr_diff_limit[i] = (u8)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8)); - if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) - { - if(pwr_diff_limit[i] > pHalData->PwrGroupHT40[rf][Channel-1]) - pwr_diff_limit[i] = pHalData->PwrGroupHT40[rf][Channel-1]; - } - else - { - if(pwr_diff_limit[i] > pHalData->PwrGroupHT20[rf][Channel-1]) - pwr_diff_limit[i] = pHalData->PwrGroupHT20[rf][Channel-1]; - } - } - customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) | - (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]); - //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit)); - - writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - default: - chnlGroup = 0; - writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + - ((index<2)?powerBase0[rf]:powerBase1[rf]); - //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); - break; - } - -// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. -// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. -// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. - - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) - writeVal = 0x14141414; - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) - writeVal = 0x00000000; - - - // 20100628 Joseph: High power mode for BT-Coexist mechanism. - // This mechanism is only applied when Driver-Highpower-Mechanism is OFF. - if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) - { - //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n")); - writeVal = writeVal - 0x06060606; - } - else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2) - { - //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n")); - writeVal = writeVal; - } - *(pOutWriteVal+rf) = writeVal; - } -} - -static void writeOFDMPowerReg( - IN PADAPTER Adapter, - IN u8 index, - IN u32* pValue - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 RegOffset_A[6] = { rTxAGC_A_Rate18_06, rTxAGC_A_Rate54_24, - rTxAGC_A_Mcs03_Mcs00, rTxAGC_A_Mcs07_Mcs04, - rTxAGC_A_Mcs11_Mcs08, rTxAGC_A_Mcs15_Mcs12}; - u16 RegOffset_B[6] = { rTxAGC_B_Rate18_06, rTxAGC_B_Rate54_24, - rTxAGC_B_Mcs03_Mcs00, rTxAGC_B_Mcs07_Mcs04, - rTxAGC_B_Mcs11_Mcs08, rTxAGC_B_Mcs15_Mcs12}; - u8 i, rf, pwr_val[4]; - u32 writeVal; - u16 RegOffset; - - for(rf=0; rf<2; rf++) - { - writeVal = pValue[rf]; - for(i=0; i<4; i++) - { - pwr_val[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8)); - if (pwr_val[i] > RF6052_MAX_TX_PWR) - pwr_val[i] = RF6052_MAX_TX_PWR; - } - writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0]; - - if(rf == 0) - RegOffset = RegOffset_A[index]; - else - RegOffset = RegOffset_B[index]; - - PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal); - //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal)); - - // 201005115 Joseph: Set Tx Power diff for Tx power training mechanism. - if(((pHalData->rf_type == RF_2T2R) && - (RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs15_Mcs12))|| - ((pHalData->rf_type != RF_2T2R) && - (RegOffset == rTxAGC_A_Mcs07_Mcs04 || RegOffset == rTxAGC_B_Mcs07_Mcs04)) ) - { - writeVal = pwr_val[3]; - if(RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_A_Mcs07_Mcs04) - RegOffset = 0xc90; - if(RegOffset == rTxAGC_B_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs07_Mcs04) - RegOffset = 0xc98; - for(i=0; i<3; i++) - { - if(i!=2) - writeVal = (writeVal>8)?(writeVal-8):0; - else - writeVal = (writeVal>6)?(writeVal-6):0; - rtw_write8(Adapter, (u32)(RegOffset+i), (u8)writeVal); - } - } - } -} -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetOFDMTxPower - * - * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for - * different channel and read original value in TX power register area from - * 0xe00. We increase offset and original value to be correct tx pwr. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/05/2008 MHC Simulate 8192 series method. - * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to - * A/B pwr difference or legacy/HT pwr diff. - * 2. We concern with path B legacy/HT OFDM difference. - * 01/22/2009 MHC Support new EPRO format from SD3. - * - *---------------------------------------------------------------------------*/ -VOID -rtl8192c_PHY_RF6052SetOFDMTxPower( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel) -{ - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 writeVal[2], powerBase0[2], powerBase1[2]; - u8 index = 0; - - getPowerBase(Adapter, pPowerLevel, Channel, &powerBase0[0], &powerBase1[0]); - - for(index=0; index<6; index++) - { - getTxPowerWriteValByRegulatory(Adapter, Channel, index, - &powerBase0[0], &powerBase1[0], &writeVal[0]); - - writeOFDMPowerReg(Adapter, index, &writeVal[0]); - } - -} - - -static VOID -phy_RF6052_Config_HardCode( - IN PADAPTER Adapter - ) -{ - - // Set Default Bandwidth to 20M - //Adapter->HalFunc .SetBWModeHandler(Adapter, HT_CHANNEL_WIDTH_20); - - // TODO: Set Default Channel to channel one for RTL8225 - -} - -static int -phy_RF6052_Config_ParaFile( - IN PADAPTER Adapter - ) -{ - u32 u4RegValue; - u8 eRFPath; - BB_REGISTER_DEFINITION_T *pPhyReg; - - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - static char sz88CRadioAFile[] = RTL8188C_PHY_RADIO_A; - static char sz88CRadioBFile[] = RTL8188C_PHY_RADIO_B; -#ifdef CONFIG_USB_HCI - static char sz88CRadioAFile_mCard[] = RTL8188C_PHY_RADIO_A_mCard; - static char sz88CRadioBFile_mCard[] = RTL8188C_PHY_RADIO_B_mCard; - static char sz88CRadioAFile_HP[] = RTL8188C_PHY_RADIO_A_HP; -#endif - static char sz92CRadioAFile[] = RTL8192C_PHY_RADIO_A; - static char sz92CRadioBFile[] = RTL8192C_PHY_RADIO_B; - static char sz8723RadioAFile[] = RTL8723_PHY_RADIO_A; - static char sz8723RadioBFile[] = RTL8723_PHY_RADIO_B; - char *pszRadioAFile, *pszRadioBFile; - - - if(IS_HARDWARE_TYPE_8192C(Adapter)) - { - if(IS_92C_SERIAL( pHalData->VersionID))// 88c's IPA is different from 92c's - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - pszRadioAFile = sz92CRadioAFile; - pszRadioBFile = sz92CRadioBFile; - } - else - { - rtStatus = _FAIL; - return rtStatus; - } - } - else - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - pszRadioAFile = sz88CRadioAFile; - pszRadioBFile = sz88CRadioBFile; -#ifdef CONFIG_USB_HCI - if( BOARD_MINICARD == pHalData->BoardType) - { - pszRadioAFile = sz88CRadioAFile_mCard; - pszRadioBFile = sz88CRadioBFile_mCard; - } - else if( BOARD_USB_High_PA == pHalData->BoardType) - { - pszRadioAFile = sz88CRadioAFile_HP; - } -#endif - } - else - { - rtStatus = _FAIL; - return rtStatus; - } - } - } - else if(IS_HARDWARE_TYPE_8723(Adapter)) - { - pszRadioAFile = sz8723RadioAFile; - pszRadioBFile = sz8723RadioBFile; - } - - //3//----------------------------------------------------------------- - //3// <2> Initialize RF - //3//----------------------------------------------------------------- - //for(eRFPath = RF90_PATH_A; eRFPath NumTotalRFPath; eRFPath++) - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { - - pPhyReg = &pHalData->PHYRegDef[eRFPath]; - - /*----Store original RFENV control type----*/ - switch(eRFPath) - { - case RF90_PATH_A: - case RF90_PATH_C: - u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV); - break; - case RF90_PATH_B : - case RF90_PATH_D: - u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16); - break; - } - - /*----Set RF_ENV enable----*/ - PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1); - rtw_udelay_os(1);//PlatformStallExecution(1); - - /*----Set RF_ENV output high----*/ - PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1); - rtw_udelay_os(1);//PlatformStallExecution(1); - - /* Set bit number of Address and Data for RF register */ - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); // Set 1 to 4 bits for 8255 - rtw_udelay_os(1);//PlatformStallExecution(1); - - PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); // Set 0 to 12 bits for 8255 - rtw_udelay_os(1);//PlatformStallExecution(1); - - /*----Initialize RF fom connfiguration file----*/ - switch(eRFPath) - { - case RF90_PATH_A: -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus= rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF90_RADIO_PATH_E)eRFPath); -#else - rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, (RF90_RADIO_PATH_E)eRFPath); -#endif - break; - case RF90_PATH_B: -#ifdef CONFIG_EMBEDDED_FWIMG - rtStatus = rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF90_RADIO_PATH_E)eRFPath); -#else - rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, (RF90_RADIO_PATH_E)eRFPath); -#endif - break; - case RF90_PATH_C: - break; - case RF90_PATH_D: - break; - } - - /*----Restore RFENV control type----*/; - switch(eRFPath) - { - case RF90_PATH_A: - case RF90_PATH_C: - PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue); - break; - case RF90_PATH_B : - case RF90_PATH_D: - PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue); - break; - } - - if(rtStatus != _SUCCESS){ - //RT_TRACE(COMP_FPGA, DBG_LOUD, ("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath)); - goto phy_RF6052_Config_ParaFile_Fail; - } - - } - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile()\n")); - return rtStatus; - -phy_RF6052_Config_ParaFile_Fail: - return rtStatus; -} - - -int -PHY_RF6052_Config8192C( - IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - // - // Initialize general global value - // - // TODO: Extend RF_PATH_C and RF_PATH_D in the future - if(pHalData->rf_type == RF_1T1R) - pHalData->NumTotalRFPath = 1; - else - pHalData->NumTotalRFPath = 2; - - // - // Config BB and RF - // - rtStatus = phy_RF6052_Config_ParaFile(Adapter); -#if 0 - switch( Adapter->MgntInfo.bRegHwParaFile ) - { - case 0: - phy_RF6052_Config_HardCode(Adapter); - break; - - case 1: - rtStatus = phy_RF6052_Config_ParaFile(Adapter); - break; - - case 2: - // Partial Modify. - phy_RF6052_Config_HardCode(Adapter); - phy_RF6052_Config_ParaFile(Adapter); - break; - - default: - phy_RF6052_Config_HardCode(Adapter); - break; - } -#endif - return rtStatus; - -} - - -// -// ==> RF shadow Operation API Code Section!!! -// -/*----------------------------------------------------------------------------- - * Function: PHY_RFShadowRead - * PHY_RFShadowWrite - * PHY_RFShadowCompare - * PHY_RFShadowRecorver - * PHY_RFShadowCompareAll - * PHY_RFShadowRecorverAll - * PHY_RFShadowCompareFlagSet - * PHY_RFShadowRecorverFlagSet - * - * Overview: When we set RF register, we must write shadow at first. - * When we are running, we must compare shadow abd locate error addr. - * Decide to recorver or not. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 11/20/2008 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -u32 -PHY_RFShadowRead( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset) -{ - return RF_Shadow[eRFPath][Offset].Value; - -} /* PHY_RFShadowRead */ - - -VOID -PHY_RFShadowWrite( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u32 Data) -{ - RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask); - RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE; - -} /* PHY_RFShadowWrite */ - - -BOOLEAN -PHY_RFShadowCompare( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset) -{ - u32 reg; - // Check if we need to check the register - if (RF_Shadow[eRFPath][Offset].Compare == _TRUE) - { - reg = PHY_QueryRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask); - // Compare shadow and real rf register for 20bits!! - if (RF_Shadow[eRFPath][Offset].Value != reg) - { - // Locate error position. - RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE; - //RT_TRACE(COMP_INIT, DBG_LOUD, - //("PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n", - //eRFPath, Offset, reg)); - } - return RF_Shadow[eRFPath][Offset].ErrorOrNot ; - } - return _FALSE; -} /* PHY_RFShadowCompare */ - - -VOID -PHY_RFShadowRecorver( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset) -{ - // Check if the address is error - if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE) - { - // Check if we need to recorver the register. - if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE) - { - PHY_SetRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask, - RF_Shadow[eRFPath][Offset].Value); - //RT_TRACE(COMP_INIT, DBG_LOUD, - //("PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx", - //eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value)); - } - } - -} /* PHY_RFShadowRecorver */ - - -VOID -PHY_RFShadowCompareAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - PHY_RFShadowCompare(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset); - } - } - -} /* PHY_RFShadowCompareAll */ - - -VOID -PHY_RFShadowRecorverAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - PHY_RFShadowRecorver(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset); - } - } - -} /* PHY_RFShadowRecorverAll */ - - -VOID -PHY_RFShadowCompareFlagSet( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u8 Type) -{ - // Set True or False!!! - RF_Shadow[eRFPath][Offset].Compare = Type; - -} /* PHY_RFShadowCompareFlagSet */ - - -VOID -PHY_RFShadowRecorverFlagSet( - IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 Offset, - IN u8 Type) -{ - // Set True or False!!! - RF_Shadow[eRFPath][Offset].Recorver= Type; - -} /* PHY_RFShadowRecorverFlagSet */ - - -VOID -PHY_RFShadowCompareFlagSetAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! - if (Offset != 0x26 && Offset != 0x27) - PHY_RFShadowCompareFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _FALSE); - else - PHY_RFShadowCompareFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _TRUE); - } - } - -} /* PHY_RFShadowCompareFlagSetAll */ - - -VOID -PHY_RFShadowRecorverFlagSetAll( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! - if (Offset != 0x26 && Offset != 0x27) - PHY_RFShadowRecorverFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _FALSE); - else - PHY_RFShadowRecorverFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _TRUE); - } - } - -} /* PHY_RFShadowCompareFlagSetAll */ - -VOID -PHY_RFShadowRefresh( - IN PADAPTER Adapter) -{ - u32 eRFPath; - u32 Offset; - - for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) - { - for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) - { - RF_Shadow[eRFPath][Offset].Value = 0; - RF_Shadow[eRFPath][Offset].Compare = _FALSE; - RF_Shadow[eRFPath][Offset].Recorver = _FALSE; - RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE; - RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE; - } - } - -} /* PHY_RFShadowRead */ - -/* End of HalRf6052.c */ - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c deleted file mode 100755 index 9c0f0b132cbb..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c +++ /dev/null @@ -1,752 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTL8192C_REDESC_C_ -#include -#include -#include -#include - -static u8 evm_db2percentage(s8 value) -{ - // - // -33dB~0dB to 0%~99% - // - s8 ret_val; - - ret_val = value; - //ret_val /= 2; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("EVMdbToPercentage92S Value=%d / %x \n", ret_val, ret_val)); - - if(ret_val >= 0) - ret_val = 0; - if(ret_val <= -33) - ret_val = -33; - - ret_val = 0 - ret_val; - ret_val*=3; - - if(ret_val == 99) - ret_val = 100; - - return(ret_val); -} - - -static s32 signal_scale_mapping(_adapter *padapter, s32 cur_sig ) -{ - s32 ret_sig; - -#ifdef CONFIG_USB_HCI - if(cur_sig >= 51 && cur_sig <= 100) - { - ret_sig = 100; - } - else if(cur_sig >= 41 && cur_sig <= 50) - { - ret_sig = 80 + ((cur_sig - 40)*2); - } - else if(cur_sig >= 31 && cur_sig <= 40) - { - ret_sig = 66 + (cur_sig - 30); - } - else if(cur_sig >= 21 && cur_sig <= 30) - { - ret_sig = 54 + (cur_sig - 20); - } - else if(cur_sig >= 10 && cur_sig <= 20) - { - ret_sig = 42 + (((cur_sig - 10) * 2) / 3); - } - else if(cur_sig >= 5 && cur_sig <= 9) - { - ret_sig = 22 + (((cur_sig - 5) * 3) / 2); - } - else if(cur_sig >= 1 && cur_sig <= 4) - { - ret_sig = 6 + (((cur_sig - 1) * 3) / 2); - } - else - { - ret_sig = cur_sig; - } -#else - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if(pHalData->CustomerID == RT_CID_819x_Lenovo) - { - // Step 1. Scale mapping. - // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. - // 20100426 Joseph: Modify Signal strength mapping. - // This modification makes the RSSI indication similar to Intel solution. - // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. - if(cur_sig >= 54 && cur_sig <= 100) - { - ret_sig = 100; - } - else if(cur_sig>=42 && cur_sig <= 53 ) - { - ret_sig = 95; - } - else if(cur_sig>=36 && cur_sig <= 41 ) - { - ret_sig = 74 + ((cur_sig - 36) *20)/6; - } - else if(cur_sig>=33 && cur_sig <= 35 ) - { - ret_sig = 65 + ((cur_sig - 33) *8)/2; - } - else if(cur_sig>=18 && cur_sig <= 32 ) - { - ret_sig = 62 + ((cur_sig - 18) *2)/15; - } - else if(cur_sig>=15 && cur_sig <= 17 ) - { - ret_sig = 33 + ((cur_sig - 15) *28)/2; - } - else if(cur_sig>=10 && cur_sig <= 14 ) - { - ret_sig = 39; - } - else if(cur_sig>=8 && cur_sig <= 9 ) - { - ret_sig = 33; - } - else if(cur_sig <= 8 ) - { - ret_sig = 19; - } - } - else - { - // Step 1. Scale mapping. - if(cur_sig >= 61 && cur_sig <= 100) - { - ret_sig = 90 + ((cur_sig - 60) / 4); - } - else if(cur_sig >= 41 && cur_sig <= 60) - { - ret_sig = 78 + ((cur_sig - 40) / 2); - } - else if(cur_sig >= 31 && cur_sig <= 40) - { - ret_sig = 66 + (cur_sig - 30); - } - else if(cur_sig >= 21 && cur_sig <= 30) - { - ret_sig = 54 + (cur_sig - 20); - } - else if(cur_sig >= 5 && cur_sig <= 20) - { - ret_sig = 42 + (((cur_sig - 5) * 2) / 3); - } - else if(cur_sig == 4) - { - ret_sig = 36; - } - else if(cur_sig == 3) - { - ret_sig = 27; - } - else if(cur_sig == 2) - { - ret_sig = 18; - } - else if(cur_sig == 1) - { - ret_sig = 9; - } - else - { - ret_sig = cur_sig; - } - } -#endif - - return ret_sig; -} - - -static s32 translate2dbm(u8 signal_strength_idx) -{ - s32 signal_power; // in dBm. - - - // Translate to dBm (x=0.5y-95). - signal_power = (s32)((signal_strength_idx + 1) >> 1); - signal_power -= 95; - - return signal_power; -} - -void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat) -{ - PHY_STS_OFDM_8192CD_T *pOfdm_buf; - PHY_STS_CCK_8192CD_T *pCck_buf; - u8 i, max_spatial_stream, evm; - s8 rx_pwr[4], rx_pwr_all = 0; - u8 pwdb_all; - u32 rssi,total_rssi=0; - u8 bcck_rate=0, rf_rx_num = 0, cck_highpwr = 0; - _adapter *padapter = prframe->u.hdr.adapter; - struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 tmp_rxsnr; - s8 rx_snrX; - -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - PHY_RX_DRIVER_INFO_8192CD *pDrvInfo = ((PHY_RX_DRIVER_INFO_8192CD *)pphy_stat); - u8 bant1_sel = (pDrvInfo->ANTSEL == 1)?_TRUE:_FALSE; -#endif - - // Record it for next packet processing - bcck_rate=(pattrib->mcs_rate<=3? 1:0); - - if(bcck_rate) //CCK - { - u8 report; -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - if(bant1_sel == _TRUE) - pHalData->CCK_Ant1_Cnt++; - else - pHalData->CCK_Ant2_Cnt++; -#endif - - // CCK Driver info Structure is not the same as OFDM packet. - pCck_buf = (PHY_STS_CCK_8192CD_T *)pphy_stat; - //Adapter->RxStats.NumQryPhyStatusCCK++; - - // - // (1)Hardware does not provide RSSI for CCK - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) - // - - if(padapter->pwrctrlpriv.rf_pwrstate == rf_on) - cck_highpwr = (u8)pHalData->bCckHighPower; - else - cck_highpwr = _FALSE; - - if(!cck_highpwr) - { - report = pCck_buf->cck_agc_rpt&0xc0; - report = report>>6; - switch(report) - { - // 03312009 modified by cosa - // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion - // Note: different RF with the different RNA gain. - case 0x3: - rx_pwr_all = (-46) - (pCck_buf->cck_agc_rpt & 0x3e); - break; - case 0x2: - rx_pwr_all = (-26) - (pCck_buf->cck_agc_rpt & 0x3e); - break; - case 0x1: - rx_pwr_all = (-12) - (pCck_buf->cck_agc_rpt & 0x3e); - break; - case 0x0: - rx_pwr_all = (16) - (pCck_buf->cck_agc_rpt & 0x3e); - break; - } - } - else - { - report = pCck_buf->cck_agc_rpt & 0x60; - report = report>>5; - switch(report) - { - case 0x3: - rx_pwr_all = (-46) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x2: - rx_pwr_all = (-26)- ((pCck_buf->cck_agc_rpt & 0x1f)<<1); - break; - case 0x1: - rx_pwr_all = (-12) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; - break; - case 0x0: - rx_pwr_all = (16) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; - break; - } - } - - pwdb_all= query_rx_pwr_percentage(rx_pwr_all); - if(pHalData->CustomerID == RT_CID_819x_Lenovo) - { - // CCK gain is smaller than OFDM/MCS gain, - // so we add gain diff by experiences, the val is 6 - pwdb_all+=6; - if(pwdb_all > 100) - pwdb_all = 100; - // modify the offset to make the same gain index with OFDM. - if(pwdb_all > 34 && pwdb_all <= 42) - pwdb_all -= 2; - else if(pwdb_all > 26 && pwdb_all <= 34) - pwdb_all -= 6; - else if(pwdb_all > 14 && pwdb_all <= 26) - pwdb_all -= 8; - else if(pwdb_all > 4 && pwdb_all <= 14) - pwdb_all -= 4; - } - - pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive - pattrib->RecvSignalPower = rx_pwr_all; //dBM - padapter->recvpriv.rxpwdb = rx_pwr_all; - // - // (3) Get Signal Quality (EVM) - // - //if(bPacketMatchBSSID) - { - u8 sq; - - if(pHalData->CustomerID == RT_CID_819x_Lenovo) - { - // mapping to 5 bars for vista signal strength - // signal quality in driver will be displayed to signal strength - // in vista. - if(pwdb_all >= 50) - sq = 100; - else if(pwdb_all >= 35 && pwdb_all < 50) - sq = 80; - else if(pwdb_all >= 22 && pwdb_all < 35) - sq = 60; - else if(pwdb_all >= 18 && pwdb_all < 22) - sq = 40; - else - sq = 20; - } - else - { - if(pwdb_all> 40) - { - sq = 100; - } - else - { - sq = pCck_buf->SQ_rpt; - - if(pCck_buf->SQ_rpt > 64) - sq = 0; - else if (pCck_buf->SQ_rpt < 20) - sq= 100; - else - sq = ((64-sq) * 100) / 44; - - } - } - - pattrib->signal_qual=sq; - pattrib->rx_mimo_signal_qual[0]=sq; - pattrib->rx_mimo_signal_qual[1]=(-1); - } - - } - else //OFDM/HT - { -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - if(bant1_sel == _TRUE) - pHalData->OFDM_Ant1_Cnt++; - else - pHalData->OFDM_Ant2_Cnt++; -#endif - pdmpriv->OFDM_Pkt_Cnt++; - - pOfdm_buf = (PHY_STS_OFDM_8192CD_T *)pphy_stat; - - // - // (1)Get RSSI per-path - // - for(i=0; iNumTotalRFPath; i++) - { - // 2008/01/30 MH we will judge RF RX path now. - if (pHalData->bRFPathRxEnable[i]) - rf_rx_num++; - //else - //continue; - - rx_pwr[i] = ((pOfdm_buf->trsw_gain_X[i]&0x3F)*2) - 110; - - /* Translate DBM to percentage. */ - rssi=query_rx_pwr_percentage(rx_pwr[i]); - total_rssi += rssi; - - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], rssi)); - - //Get Rx snr value in DB - tmp_rxsnr = pOfdm_buf->rxsnr_X[i]; - rx_snrX = (s8)(tmp_rxsnr); - rx_snrX >>= 1; - padapter->recvpriv.RxSNRdB[i] = (int)rx_snrX; - - /* Record Signal Strength for next packet */ - //if(bPacketMatchBSSID) - { - //pRfd->Status.RxMIMOSignalStrength[i] =(u1Byte) RSSI; - - //The following is for lenovo signal strength in vista - if(pHalData->CustomerID == RT_CID_819x_Lenovo) - { - u8 sq; - - if(i == 0) - { - // mapping to 5 bars for vista signal strength - // signal quality in driver will be displayed to signal strength - // in vista. - if(rssi >= 50) - sq = 100; - else if(rssi >= 35 && rssi < 50) - sq = 80; - else if(rssi >= 22 && rssi < 35) - sq = 60; - else if(rssi >= 18 && rssi < 22) - sq = 40; - else - sq = 20; - //DbgPrint("ofdm/mcs RSSI=%d\n", RSSI); - //pRfd->Status.SignalQuality = SQ; - //DbgPrint("ofdm/mcs SQ = %d\n", pRfd->Status.SignalQuality); - } - } - } - } - - - // - // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive),average - // - rx_pwr_all = (((pOfdm_buf->pwdb_all ) >> 1 )& 0x7f) -110;//for OFDM Average RSSI - pwdb_all = query_rx_pwr_percentage(rx_pwr_all); - - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("PWDB_ALL=%d\n", pwdb_all)); - - pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive - pattrib->RecvSignalPower = rx_pwr_all;//dBM - padapter->recvpriv.rxpwdb = rx_pwr_all; - // - // (3)EVM of HT rate - // - if(pHalData->CustomerID != RT_CID_819x_Lenovo) - { - if(pattrib->rxht && pattrib->mcs_rate >=20 && pattrib->mcs_rate<=27) - max_spatial_stream = 2; //both spatial stream make sense - else - max_spatial_stream = 1; //only spatial stream 1 makes sense - - for(i=0; i>= 1" because the compilor of free build environment - // fill most significant bit to "zero" when doing shifting operation which may change a negative - // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. - evm = evm_db2percentage( (pOfdm_buf->rxevm_X[i]/*/ 2*/));//dbm - - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", - pattrib->mcs_rate, pOfdm_buf->rxevm_X[i], "%",evm)); - - //if(bPacketMatchBSSID) - { - if(i==0) // Fill value in RFD, Get the first spatial stream only - { - pattrib->signal_qual = (u8)(evm & 0xff); - } - pattrib->rx_mimo_signal_qual[i] = (u8)(evm & 0xff); - } - } - - } - - // - // 4. Record rx statistics for debug - // - - } - - - //UI BSS List signal strength(in percentage), make it good looking, from 0~100. - //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). - if(bcck_rate) - { - pattrib->signal_strength=(u8)signal_scale_mapping(padapter, pwdb_all); - } - else - { - if (rf_rx_num != 0) - { - pattrib->signal_strength= (u8)(signal_scale_mapping(padapter, total_rssi/=rf_rx_num)); - } - } - //DBG_8192C("%s,rx_pwr_all(%d),RxPWDBAll(%d)\n",__FUNCTION__,rx_pwr_all,pattrib->RxPWDBAll); - -} - - -static void process_rssi(_adapter *padapter,union recv_frame *prframe) -{ - u32 last_rssi, tmp_val; - struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - struct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data; -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - //DBG_8192C("process_rssi=> pattrib->rssil(%d) signal_strength(%d)\n ",pattrib->RecvSignalPower,pattrib->signal_strength); - //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) - { - - #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - if(signal_stat->update_req) { - signal_stat->total_num = 0; - signal_stat->total_val = 0; - signal_stat->update_req = 0; - } - - signal_stat->total_num++; - signal_stat->total_val += pattrib->signal_strength; - signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; - #else //CONFIG_NEW_SIGNAL_STAT_PROCESS - - //Adapter->RxStats.RssiCalculateCnt++; //For antenna Test - if(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX) - { - padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX; - last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index]; - padapter->recvpriv.signal_strength_data.total_val -= last_rssi; - } - padapter->recvpriv.signal_strength_data.total_val +=pattrib->signal_strength; - - padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->signal_strength; - if(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX) - padapter->recvpriv.signal_strength_data.index = 0; - - - tmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num; - - if(padapter->recvpriv.is_signal_dbg) { - padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg; - padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg); - } else { - padapter->recvpriv.signal_strength= tmp_val; - padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val); - } - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num)); - #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - } - -}// Process_UI_RSSI_8192C - - -static void process_PWDB(_adapter *padapter, union recv_frame *prframe) -{ - int UndecoratedSmoothedPWDB; - int UndecoratedSmoothedCCK; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct rx_pkt_attrib *pattrib= &prframe->u.hdr.attrib; - struct sta_info *psta = prframe->u.hdr.psta; - u8 isCCKrate=(pattrib->mcs_rate<=3? 1:0); - - - if(psta) - { - UndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; - UndecoratedSmoothedCCK = psta->rssi_stat.UndecoratedSmoothedCCK; - } - else - { - UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB; - UndecoratedSmoothedCCK = pdmpriv->UndecoratedSmoothedCCK; - } - - //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) - - if(!isCCKrate) - { - // Process OFDM RSSI - if(UndecoratedSmoothedPWDB < 0) // initialize - { - UndecoratedSmoothedPWDB = pattrib->RxPWDBAll; - } - - if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedPWDB) - { - UndecoratedSmoothedPWDB = - ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) + - (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); - - UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB + 1; - } - else - { - UndecoratedSmoothedPWDB = - ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) + - (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); - } - } - else - { - // Process CCK RSSI - if(UndecoratedSmoothedCCK < 0) // initialize - { - UndecoratedSmoothedCCK = pattrib->RxPWDBAll; - } - - if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedCCK) - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); - - UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; - } - else - { - UndecoratedSmoothedCCK = - ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + - (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); - } - } - - - - if(psta) - { - //psta->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;//todo: - pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; - - if(pdmpriv->RSSI_Select == RSSI_OFDM) - psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; - else if(pdmpriv->RSSI_Select == RSSI_CCK) - psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK; - - psta->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; - } - else - { - //pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; - - if(pdmpriv->RSSI_Select == RSSI_OFDM) - pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; - else if(pdmpriv->RSSI_Select == RSSI_CCK) - pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK; - - pdmpriv->UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; - } - - //UpdateRxSignalStatistics8192C(padapter, prframe); - -} - - -static void process_link_qual(_adapter *padapter,union recv_frame *prframe) -{ - u32 last_evm=0, tmpVal; - struct rx_pkt_attrib *pattrib; -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - struct signal_stat * signal_stat; -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - if(prframe == NULL || padapter==NULL){ - return; - } - - pattrib = &prframe->u.hdr.attrib; -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - signal_stat = &padapter->recvpriv.signal_qual_data; -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - - //DBG_8192C("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); - -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - if(signal_stat->update_req) { - signal_stat->total_num = 0; - signal_stat->total_val = 0; - signal_stat->update_req = 0; - } - - signal_stat->total_num++; - signal_stat->total_val += pattrib->signal_strength; - signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; - -#else //CONFIG_NEW_SIGNAL_STAT_PROCESS - if(pattrib->signal_qual != 0) - { - // - // 1. Record the general EVM to the sliding window. - // - if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) - { - padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; - last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; - padapter->recvpriv.signal_qual_data.total_val -= last_evm; - } - padapter->recvpriv.signal_qual_data.total_val += pattrib->signal_qual; - - padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->signal_qual; - if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) - padapter->recvpriv.signal_qual_data.index = 0; - - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, pattrib->signal_qual)); - - // <1> Showed on UI for user, in percentage. - tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; - padapter->recvpriv.signal_qual=(u8)tmpVal; - - } - else - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" pattrib->signal_qual =%d\n", pattrib->signal_qual)); - } -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - -}// Process_UiLinkQuality8192S - - -//void rtl8192c_process_phy_info(_adapter *padapter, union recv_frame *prframe) -void rtl8192c_process_phy_info(_adapter *padapter, void *prframe) -{ - union recv_frame *precvframe = (union recv_frame *)prframe; - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - // If we switch to the antenna for testing, the signal strength - // of the packets in this time shall not be counted into total receiving power. - // This prevents error counting Rx signal strength and affecting other dynamic mechanism. - - // Select the packets to do RSSI checking for antenna switching. - SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); - - if(GET_HAL_DATA(padapter)->RSSI_test == _TRUE) - return; -#endif - // - // Check RSSI - // - process_rssi(padapter, precvframe); - // - // Check PWDB. - // - process_PWDB(padapter, precvframe); - // - // Check EVM - // - process_link_qual(padapter, precvframe); - -} diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c deleted file mode 100755 index 226ed8f68406..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c +++ /dev/null @@ -1,285 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#include -#include -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM -extern void rtw_cancel_all_timer(_adapter *padapter); - -void rtl8192c_sreset_init_value(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - _rtw_mutex_init(&psrtpriv->silentreset_mutex ); - psrtpriv->silent_reset_inprogress = _FALSE; - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -} -void rtl8192c_sreset_reset_value(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - psrtpriv->silent_reset_inprogress = _FALSE; - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - psrtpriv->last_tx_time =0; - psrtpriv->last_tx_complete_time =0; -} - -static void _restore_security_setting(_adapter *padapter) -{ - u8 EntryId = 0; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct sta_priv * pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - - (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) - ? rtw_write8(padapter, REG_SECCFG, 0xcc) - : rtw_write8(padapter, REG_SECCFG, 0xcf); - - if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || - ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) - { - - for(EntryId=0; EntryId<4; EntryId++) - { - if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1); - else - rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0); - } - - } - else if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) - { - psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); - if (psta == NULL) { - //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); - } - else - { - //pairwise key - rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); - //group key - rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0); - } - } - -} - -static void _restore_network_status(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); - unsigned short caps; - u8 join_type; -#if 1 - - //======================================================= - // reset related register of Beacon control - - //set MSR to nolink - Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); - // reject all data frame - rtw_write16(padapter, REG_RXFLTMAP2,0x00); - //reset TSF - rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); - - //disable update TSF - if(IS_NORMAL_CHIP(pHalData->VersionID)) - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); - else - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); - - //======================================================= - rtw_joinbss_reset(padapter); - set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - //pmlmeinfo->assoc_AP_vendor = maxAP; - - if (padapter->registrypriv.wifi_spec) { - // for WiFi test, follow WMM test plan spec - rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F431C); - rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E541C); - rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x0000A525); - rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A549); - - // for WiFi test, mixed mode with intel STA under bg mode throughput issue - if (padapter->mlmepriv.htpriv.ht_option == 0) - rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00004320); - - } else { - rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F3217); - rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E4317); - rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00105320); - rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A444); - } - - //disable dynamic functions, such as high power, DIG - //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); -#endif - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); - join_type = 0; - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - - Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); - - mlmeext_joinbss_event_callback(padapter, 1); - //restore Sequence No. - rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); -} -void rtl8192c_silentreset_for_specific_platform(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - _irqL irqL; - - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - if (!netif_queue_stopped(padapter->pnetdev)) - netif_stop_queue(padapter->pnetdev); - - rtw_cancel_all_timer(padapter); - tasklet_kill(&pxmitpriv->xmit_tasklet); - - _enter_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); - psrtpriv->silent_reset_inprogress = _TRUE; - pwrpriv->change_rfpwrstate = rf_off; -#ifdef CONFIG_IPS - ips_enter(padapter); - ips_leave(padapter); -#endif - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - _restore_network_status(padapter); - _restore_security_setting(padapter); - } - - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); - - psrtpriv->silent_reset_inprogress = _FALSE; - _exit_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); - - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); - - if (netif_queue_stopped(padapter->pnetdev)) - netif_wake_queue(padapter->pnetdev); -} - -void rtl8192c_sreset_xmit_status_check(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - unsigned long current_time; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - unsigned int diff_time; - - if(rtw_read32(padapter, REG_TXDMA_STATUS) !=0x00){ - rtl8192c_silentreset_for_specific_platform(padapter); - } - - //total xmit irp = 4 - //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); - //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) - current_time = rtw_get_current_time(); - if(0==pxmitpriv->free_xmitbuf_cnt) - { - diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_time); - - if(diff_time > 2000){ - if(psrtpriv->last_tx_complete_time==0){ - psrtpriv->last_tx_complete_time = current_time; - } - else{ - diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_complete_time); - if(diff_time > 4000){ - //padapter->Wifi_Error_Status = WIFI_TX_HANG; - DBG_8192C("tx hang...start reset\n"); - rtl8192c_silentreset_for_specific_platform(padapter); - } - } - } - } -} -void rtl8192c_sreset_linked_status_check(_adapter *padapter) -{ - u32 regc50,regc58,reg824,reg800; - regc50 = rtw_read32(padapter,0xc50); - regc58 = rtw_read32(padapter,0xc58); - reg824 = rtw_read32(padapter,0x824); - reg800 = rtw_read32(padapter,0x800); - if( ((regc50&0xFFFFFF00)!= 0x69543400)|| - ((regc58&0xFFFFFF00)!= 0x69543400)|| - (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| - ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) - { - rtl8192c_silentreset_for_specific_platform(padapter); - } -} - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM -u8 rtl8192c_sreset_get_wifi_status(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - u8 status = WIFI_STATUS_SUCCESS; - u32 val32 = 0; - _irqL irqL; - if(psrtpriv->silent_reset_inprogress == _TRUE) - { - return status; - } - val32 =rtw_read32(padapter,REG_TXDMA_STATUS); - if(val32==0xeaeaeaea){ - psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; - } - else if(val32!=0){ - DBG_8192C("txdmastatu(%x)\n",val32); - psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; - } - - if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) - { - DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); - status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); - } - DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); - - //status restore - psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; - - return status; -} -#endif - -#endif diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c deleted file mode 100755 index a6a9bb34dbb4..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c +++ /dev/null @@ -1,7346 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -/*Created on 2011/ 6/15, 5:45*/ - -#include -#include "Hal8192CUHWImg.h" - -#ifdef CONFIG_BT_COEXISTENCE -// =================== TSMC Normal FW V75 2011-06-15 ======================= -u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = { -0xc1,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x10,0x55,0x54,0x3a,0x00,0x00, -0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, -0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, -0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, -0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, -0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, -0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, -0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, -0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, -0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, -0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, -0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, -0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, -0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, -0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, -0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, -0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, -0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, -0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, -0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, -0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, -0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, -0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, -0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, -0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, -0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, -0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, -0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, -0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, -0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, -0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, -0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, -0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, -0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, -0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, -0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, -0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, -0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, -0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, -0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, -0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, -0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, -0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, -0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, -0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, -0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, -0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, -0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, -0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, -0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, -0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, -0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, -0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, -0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, -0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, -0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, -0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, -0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, -0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, -0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, -0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, -0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, -0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, -0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, -0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, -0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, -0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, -0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, -0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, -0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, -0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, -0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, -0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, -0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, -0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, -0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, -0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, -0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, -0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, -0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, -0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, -0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, -0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, -0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, -0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, -0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, -0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, -0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, -0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, -0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, -0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, -0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, -0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, -0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, -0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, -0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, -0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, -0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, -0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, -0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, -0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, -0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, -0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, -0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, -0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, -0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, -0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, -0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, -0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, -0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, -0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, -0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, -0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, -0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, -0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, -0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, -0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, -0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, -0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, -0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, -0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, -0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, -0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, -0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, -0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, -0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0xab,0x22,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75, -0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, -0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, -0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, -0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, -0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, -0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, -0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, -0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, -0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, -0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, -0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, -0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, -0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, -0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, -0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, -0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, -0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, -0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6, -0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xcf,0x90,0x97,0x93,0xe0,0x54, -0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, -0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90, -0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, -0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, -0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36, -0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, -0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, -0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, -0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, -0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x29,0xd9,0xf5, -0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, -0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, -0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, -0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, -0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, -0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, -0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, -0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, -0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, -0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, -0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, -0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, -0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, -0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, -0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, -0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, -0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, -0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, -0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, -0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, -0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, -0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, -0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, -0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, -0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, -0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, -0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, -0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, -0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, -0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, -0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, -0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, -0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, -0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, -0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, -0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, -0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, -0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, -0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, -0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, -0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, -0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, -0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, -0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, -0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, -0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, -0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, -0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, -0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, -0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, -0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, -0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, -0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, -0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, -0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, -0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, -0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, -0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, -0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, -0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, -0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, -0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, -0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, -0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, -0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, -0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, -0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, -0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, -0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, -0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, -0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, -0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, -0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, -0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, -0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, -0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, -0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, -0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, -0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, -0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, -0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, -0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, -0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, -0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, -0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, -0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, -0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, -0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, -0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, -0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, -0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, -0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, -0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, -0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, -0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0xa2, -0x12,0x5f,0xb4,0x12,0x32,0x3d,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, -0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, -0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, -0x12,0x77,0xdc,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, -0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, -0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, -0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, -0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, -0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, -0x12,0x78,0x3a,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, -0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, -0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, -0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, -0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, -0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, -0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, -0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, -0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, -0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, -0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, -0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, -0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, -0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, -0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, -0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, -0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, -0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, -0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, -0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, -0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, -0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, -0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, -0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, -0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, -0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, -0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90, -0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, -0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, -0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, -0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, -0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80, -0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, -0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, -0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, -0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, -0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, -0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, -0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, -0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, -0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, -0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, -0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, -0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, -0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, -0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, -0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, -0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, -0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, -0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, -0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, -0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, -0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, -0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, -0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, -0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, -0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, -0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, -0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, -0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x79,0x12,0x90,0x97,0x5a,0x12,0x43,0x6b, -0x02,0x77,0xa9,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x22,0x90,0x01,0xc6,0xe0, -0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, -0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, -0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, -0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, -0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, -0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, -0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, -0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, -0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, -0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, -0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, -0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, -0x82,0x8c,0x83,0xef,0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, -0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, -0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, -0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, -0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, -0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, -0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, -0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, -0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, -0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, -0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, -0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, -0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, -0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, -0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, -0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, -0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, -0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, -0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, -0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, -0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, -0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, -0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, -0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, -0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, -0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, -0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, -0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, -0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, -0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, -0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, -0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, -0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x29, -0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, -0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, -0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, -0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, -0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, -0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, -0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, -0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, -0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, -0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, -0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, -0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, -0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, -0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, -0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, -0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, -0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, -0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, -0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, -0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, -0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, -0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, -0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, -0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, -0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, -0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, -0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, -0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, -0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, -0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, -0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, -0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, -0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, -0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, -0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, -0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, -0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, -0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, -0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, -0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, -0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, -0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, -0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, -0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, -0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, -0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, -0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, -0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, -0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, -0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, -0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, -0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, -0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, -0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, -0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, -0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, -0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, -0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, -0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, -0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, -0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, -0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, -0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, -0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, -0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, -0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, -0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, -0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, -0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, -0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, -0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, -0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, -0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, -0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, -0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, -0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, -0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, -0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, -0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, -0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, -0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, -0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, -0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, -0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, -0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, -0x60,0x05,0x7f,0x01,0x12,0x76,0xfa,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, -0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, -0xfa,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, -0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, -0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, -0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, -0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, -0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, -0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, -0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, -0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, -0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, -0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, -0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, -0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, -0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, -0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, -0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, -0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, -0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, -0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, -0x14,0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, -0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, -0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, -0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, -0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, -0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, -0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, -0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, -0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, -0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, -0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, -0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, -0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, -0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, -0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, -0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, -0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, -0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, -0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, -0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, -0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, -0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, -0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, -0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, -0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, -0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, -0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, -0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, -0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, -0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, -0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, -0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, -0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, -0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, -0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, -0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, -0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, -0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, -0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b, -0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, -0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, -0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, -0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, -0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29, -0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, -0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, -0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5, -0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, -0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, -0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, -0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, -0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1b,0x9f,0xe5, -0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, -0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, -0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, -0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, -0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, -0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, -0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, -0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, -0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, -0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, -0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, -0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, -0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, -0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, -0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, -0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, -0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, -0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, -0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, -0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, -0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, -0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, -0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, -0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, -0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, -0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, -0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, -0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, -0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, -0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, -0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, -0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, -0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, -0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, -0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, -0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, -0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, -0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, -0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, -0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, -0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, -0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, -0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, -0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, -0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, -0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, -0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, -0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, -0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, -0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, -0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, -0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, -0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, -0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, -0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, -0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, -0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, -0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, -0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, -0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, -0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, -0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, -0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, -0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, -0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, -0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, -0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, -0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, -0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, -0x60,0x02,0x01,0x26,0x22,0x12,0x29,0xd9,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, -0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, -0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, -0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, -0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, -0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, -0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, -0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, -0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, -0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, -0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, -0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66, -0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, -0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, -0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, -0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, -0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, -0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, -0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, -0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, -0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x29,0xd9,0x65, -0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x29,0xd9,0xf5,0x26, -0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, -0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, -0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, -0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, -0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, -0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, -0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60,0x2c, -0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, -0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, -0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, -0x43,0x6b,0x12,0x29,0xd9,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, -0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, -0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, -0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, -0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, -0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, -0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, -0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, -0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, -0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, -0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, -0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, -0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, -0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, -0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, -0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, -0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, -0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, -0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, -0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, -0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, -0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, -0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, -0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, -0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, -0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, -0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, -0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, -0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, -0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, -0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, -0x00,0x12,0x37,0x54,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, -0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f,0xe5,0x90,0x97,0x1d,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x21, -0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, -0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08, -0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95, -0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59, -0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x7f, -0x78,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, -0x12,0x27,0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde, -0x90,0x97,0x25,0x12,0x2a,0x7f,0x90,0x97,0x86,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d, -0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53, -0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12, -0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85, -0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x53, -0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12, -0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x29,0x12,0x2a,0x7f,0x90, -0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9, -0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81, -0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00, -0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02, -0x4f,0xe5,0x90,0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71, -0x63,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x75,0x2e,0x90,0x97,0x19,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc5, -0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9, -0x90,0x96,0xc9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08, -0x12,0x2f,0xd9,0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd5,0x12,0x43,0x53,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd9,0x12, -0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90, -0x96,0xdd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12, -0x2f,0xd9,0x90,0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80, -0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80, -0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xed,0x12,0x43, -0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, -0xf1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f, -0xd9,0x90,0x96,0xf5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e, -0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, -0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x85, -0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x01,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x05, -0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9, -0x90,0x97,0x09,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, -0x12,0x2f,0xd9,0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97,0x15,0x12,0x43,0x53,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x2d,0x74, -0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x2e,0x7f,0x8c,0x7e, -0x08,0x12,0x27,0xde,0x90,0x97,0x19,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27, -0xde,0x90,0x96,0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x96, -0xc9,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xcd,0x12,0x2a, -0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd1,0x12,0x2a,0x7f,0x7f,0x74, -0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd5,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12, -0x27,0xde,0x90,0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90, -0x96,0xdd,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe1,0x12, -0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe5,0x12,0x2a,0x7f,0x7f, -0x88,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe9,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e, -0x12,0x27,0xde,0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde, -0x90,0x96,0xf1,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf5, -0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf9,0x12,0x2a,0x7f, -0x7f,0xdc,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xfd,0x12,0x2a,0x7f,0x7f,0xe0,0x7e, -0x0e,0x12,0x27,0xde,0x90,0x97,0x01,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27, -0xde,0x90,0x97,0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97, -0x09,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0x0d,0x12,0x2a, -0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0x11,0x12,0x2a,0x7f,0x7f,0x04, -0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x15,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, -0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44, -0xc0,0xfd,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, -0x2a,0x8b,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85, -0x12,0x2a,0x8b,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80, -0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90, -0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9, -0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f, -0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12, -0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e, -0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e, -0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84, -0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f, -0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4, -0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25, -0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb, -0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20, -0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, -0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, -0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, -0x2a,0x8b,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e, -0x0c,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, -0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef, -0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e, -0x0d,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, -0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43, -0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, -0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f, -0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, -0x43,0x53,0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43, -0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, -0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f, -0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, -0x43,0x53,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x2a,0x7f, -0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97, -0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, -0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97, -0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90, -0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec, -0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3, -0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0, -0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, -0x46,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, -0x45,0x80,0x68,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, -0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8, -0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54, -0xf0,0x12,0x4f,0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, -0xbc,0xe0,0x60,0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90, -0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4, -0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92, -0xaf,0x22,0x8b,0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97, -0x3b,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08, -0x12,0x27,0xde,0x90,0x97,0x34,0x12,0x2a,0x7f,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, -0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8, -0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03, -0xfc,0x12,0x43,0x46,0x90,0x97,0x3e,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80, -0x2d,0xe4,0x90,0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03, -0xfc,0xec,0x44,0xc0,0xfc,0x90,0x97,0x34,0x12,0x2a,0x7f,0x90,0x97,0x34,0x12,0x43, -0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97, -0x3b,0xe0,0x30,0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, -0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e, -0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, -0x54,0xf3,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f, -0x46,0x12,0x47,0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60, -0x6a,0x24,0x02,0x60,0x02,0xe1,0xa8,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48, -0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd, -0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75, -0xe4,0x90,0x97,0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f, -0x45,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52, -0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01, -0xf0,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e, -0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52, -0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0, -0x44,0x10,0xfd,0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90, -0x97,0x3c,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12, -0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40, -0x7f,0x01,0x12,0x36,0xaf,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45, -0x12,0x47,0x52,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97, -0x42,0xf0,0x90,0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97, -0x44,0xf0,0x90,0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97, -0x4c,0xf0,0x90,0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00, -0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01, -0x60,0x08,0x90,0x97,0x3a,0xe0,0x60,0x02,0x21,0x11,0x90,0x97,0x2e,0xe0,0xc3,0x94, -0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50, -0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a, -0xe0,0x04,0xf0,0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94, -0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90, -0x97,0x2e,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, -0x97,0x42,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43, -0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0, -0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42, -0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50, -0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, -0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, -0xf0,0xe4,0x90,0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, -0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12, -0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25, -0xe0,0x90,0x97,0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61, -0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63, -0xe0,0x90,0x97,0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90, -0x97,0x39,0xe0,0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90, -0x97,0x3a,0xe0,0x70,0x02,0x41,0x1c,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x1c,0x90, -0x97,0x3d,0xe0,0x70,0x02,0x41,0x1c,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2, -0xaf,0x90,0x97,0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12, -0x47,0x49,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, -0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, -0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90, -0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64, -0x80,0xf0,0x90,0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05, -0x85,0xf0,0x90,0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05, -0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0, -0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2d,0x90,0x97,0x3a,0xe0, -0x70,0x2f,0x90,0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f, -0x46,0x12,0x47,0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0, -0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92, -0xaf,0x22,0x6b,0xc3,}; -#else -// =================== TSMC FW P2P_PS V75 2011-06-15 ======================= -u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = { -0xc1,0x88,0x02,0x05,0x4b,0x00,0x00,0x00,0x06,0x15,0x10,0x56,0x9a,0x3b,0x00,0x00, -0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x43,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x4a,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x58,0x29,0x00,0x00,0x00,0x00,0x00,0xa1,0x53,0x00,0x00,0x00, -0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, -0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, -0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, -0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, -0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, -0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, -0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, -0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, -0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, -0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04,0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05, -0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e, -0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a,0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e, -0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a, -0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00,0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04, -0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60, -0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50,0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40, -0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c,0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8, -0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c, -0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28, -0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0,0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64, -0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4,0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02, -0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c, -0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12,0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02, -0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06, -0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e,0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, -0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, -0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, -0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, -0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, -0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, -0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, -0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, -0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, -0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, -0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, -0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, -0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, -0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, -0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, -0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, -0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, -0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, -0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, -0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb, -0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0, -0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0, -0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12, -0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83, -0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xeb, -0x02,0x50,0x7f,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2, -0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33, -0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf, -0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x30,0xe4,0x7e, -0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93, -0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3, -0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca, -0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe, -0x48,0x97,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x4e,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x97,0x56,0x00,0x41,0x97,0xab,0x00,0x41,0x97, -0x68,0x80,0x41,0x97,0xad,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f, -0x54,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x8a,0xeb,0xf0,0xa3, -0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf, -0x22,0xe4,0x90,0x97,0x8b,0xf0,0x90,0x05,0x58,0xe0,0xff,0x90,0x97,0x86,0xe0,0x2f, -0x24,0xfe,0x90,0x97,0x8c,0xf0,0xe4,0xfb,0xfd,0x7f,0x50,0x7e,0x01,0x91,0x63,0x90, -0x01,0x53,0x74,0x05,0xf0,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08, -0xf0,0xe4,0x90,0x97,0x8b,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e, -0x01,0x91,0x63,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90, -0x97,0x72,0x14,0xf0,0x90,0x97,0x74,0xe0,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x11,0x7d, -0x01,0x7f,0x0c,0x12,0x49,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x03,0x12,0x4f,0x22, -0x22,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0x12,0x5a,0xf7,0x02,0x57, -0x68,0x22,0x22,0x02,0x58,0x74,0x02,0x58,0x7b,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x8d,0x71,0x7e,0xab,0x63,0xaa,0x64,0xa9, -0x65,0x90,0x97,0x90,0x71,0x7e,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0x90, -0xe4,0x75,0xf0,0x01,0x71,0x67,0x12,0x29,0xd9,0xff,0x90,0x97,0x8d,0xe4,0x75,0xf0, -0x01,0x71,0x67,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, -0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00, -0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07, -0x90,0x01,0xc4,0x74,0x53,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c, -0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5, -0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x53,0x90,0x01,0x3c,0x74, -0x01,0xf0,0x90,0x97,0x80,0xe0,0x30,0xe0,0x20,0x13,0x13,0x54,0x3f,0x30,0xe0,0x19, -0x90,0x97,0x82,0xe4,0xf0,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xf1, -0x79,0xef,0x70,0x05,0x7f,0x02,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0xff,0x30,0xe0, -0x1e,0x13,0x13,0x54,0x3f,0x30,0xe0,0x17,0x90,0x97,0x7c,0xe4,0xf0,0x90,0x97,0x7b, -0xe0,0x64,0x04,0x60,0x0a,0xe4,0xff,0xf1,0x79,0xef,0x70,0x03,0x12,0x57,0xb9,0xe5, -0x34,0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x5d,0x59,0xe5,0x34,0x30, -0xe2,0x35,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90, -0x97,0x8b,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91, -0x63,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90, -0x97,0x73,0xe4,0xf0,0x12,0x4a,0x63,0xe5,0x34,0x30,0xe3,0x35,0x90,0x01,0x3c,0x74, -0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x8b,0xe4,0xf0,0xa3,0x74, -0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x63,0x90,0x01,0x5f,0x74,0x05, -0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x97,0x72,0xe4,0xf0,0x12,0x4a, -0x63,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0,0x12,0x72,0x06,0xe5, -0x35,0x30,0xe0,0x11,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97, -0x76,0xf0,0x12,0x4a,0x63,0xe5,0x36,0x30,0xe1,0x46,0x90,0x01,0x3e,0x74,0x02,0xf0, -0x90,0x97,0x80,0xe0,0x30,0xe0,0x1a,0x90,0x97,0x84,0x74,0x01,0xf0,0x90,0x97,0x81, -0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xf1,0x79,0xef,0x70,0x05,0x7f,0x02,0x12,0x55, -0xcb,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x18,0x90,0x97,0x7e,0x74,0x01,0xf0,0x90,0x97, -0x7b,0xe0,0x64,0x04,0x60,0x0a,0xe4,0xff,0xf1,0x79,0xef,0x70,0x03,0x12,0x57,0xb9, -0xe5,0x36,0x30,0xe0,0x6e,0x90,0x01,0x3e,0x74,0x01,0xf0,0x90,0x97,0x80,0xe0,0x30, -0xe0,0x19,0x90,0x97,0x84,0xe4,0xf0,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0c,0x7f, -0x01,0xf1,0x79,0xef,0x60,0x05,0x7f,0x01,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0x30, -0xe0,0x41,0x90,0x97,0x7e,0xe4,0xf0,0xff,0xf1,0x79,0xef,0x60,0x36,0x12,0x74,0xad, -0x90,0x97,0x7b,0xe0,0xff,0x64,0x04,0x60,0x2a,0xef,0xb4,0x03,0x07,0xe4,0xff,0x12, -0x56,0x56,0x80,0x12,0x90,0x97,0x7b,0xe0,0xb4,0x02,0x18,0x12,0x59,0x90,0xef,0x70, -0x05,0x7f,0x01,0x12,0x56,0x56,0x90,0x97,0x76,0xe0,0xff,0x7d,0x01,0x12,0x49,0x0a, -0x12,0x4f,0x22,0x74,0x53,0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07, -0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0, -0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xef,0x64,0x01,0x70,0x3d,0x90,0x97, -0x83,0xe0,0x60,0x03,0x7f,0x00,0x22,0x90,0x97,0x66,0xe0,0x60,0x03,0x7f,0x01,0x22, -0x90,0x97,0x82,0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x80,0xe0,0xff,0x13,0x13, -0x54,0x3f,0x30,0xe0,0x0b,0xef,0xc4,0x13,0x54,0x07,0x30,0xe0,0x03,0x7f,0x00,0x22, -0x90,0x97,0x84,0xe0,0x7f,0x01,0x60,0x36,0x7f,0x00,0x22,0x90,0x97,0x7d,0xe0,0x60, -0x03,0x7f,0x00,0x22,0x90,0x97,0x66,0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x7c, -0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x7a,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0, -0x03,0x7f,0x00,0x22,0x90,0x97,0x7e,0xe0,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0xe4, -0xf5,0x23,0x7f,0x60,0x7e,0x01,0x81,0xf1,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90, -0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6, -0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f, -0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,0x7d,0x01,0x90,0x97,0x99,0xef,0xf0,0xa3, -0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x6a,0x60,0x04,0xe4,0xff,0x11,0xbb,0x90, -0x97,0x99,0xe0,0x30,0xe0,0x09,0x90,0x97,0x9b,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90, -0x97,0x99,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90, -0x97,0x9a,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc, -0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, -0xe0,0x44,0x80,0xf0,0x90,0x97,0x9b,0xa3,0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, -0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54, -0xf7,0xf0,0x90,0x97,0x9b,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60,0x0b,0x90,0x97, -0x67,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x67,0xe0,0xb4,0x01,0x05, -0x7f,0x01,0x12,0x75,0x21,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x74,0xd1,0xef, -0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0xe5, -0x6a,0x60,0x04,0x7f,0x01,0x11,0xbb,0x12,0x73,0x9d,0x90,0x97,0x74,0xe0,0x54,0xf0, -0xf0,0xe0,0x44,0x02,0xf0,0x22,0xe0,0xff,0x7d,0x01,0x8f,0x67,0x8d,0x68,0xe5,0x67, -0x54,0x0f,0xff,0x90,0x97,0x74,0xe0,0x54,0x0f,0x6f,0x60,0x76,0xe5,0x67,0x30,0xe2, -0x30,0x90,0x97,0x74,0xe0,0x20,0xe2,0x05,0x7f,0x01,0x12,0x5a,0xd9,0x90,0x97,0x74, -0xe0,0x30,0xe3,0x0a,0xe5,0x67,0x20,0xe3,0x05,0x12,0x5a,0xbd,0x80,0x54,0x90,0x97, -0x74,0xe0,0x20,0xe3,0x4d,0xe5,0x67,0x30,0xe3,0x48,0xaf,0x68,0x12,0x5a,0x65,0x80, -0x41,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0d,0xe5,0x67,0x20,0xe3,0x08, -0xf1,0xfb,0xef,0x60,0x2d,0x12,0x5a,0xbd,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf, -0x04,0x0d,0xe5,0x67,0x20,0xe2,0x08,0x12,0x59,0x90,0xef,0x60,0x15,0x11,0xd6,0x90, -0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x09,0x12,0x59,0xf3,0xef,0x60,0x03,0x12, -0x5b,0xec,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0x90,0x97,0x76,0xe0,0x54,0x0f,0x6f, -0x70,0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0x90,0x97,0x68, -0xe0,0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x68,0xf0,0x90,0x97, -0x76,0xe0,0x54,0xbf,0xf0,0x22,0xef,0x64,0x01,0x70,0x3b,0x7d,0x7c,0x7f,0x02,0x12, -0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01, -0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x31,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0, -0x02,0xf1,0x22,0xe4,0xff,0x11,0xbb,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06, -0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0,0xa3,0x74,0x02,0xf0, -0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0x90,0x06,0x04, -0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x97,0x6f,0xe0,0xa3, -0xe0,0x90,0x05,0x58,0xf0,0xe5,0x69,0x30,0xe0,0x23,0x90,0x97,0x6c,0xe0,0x70,0x22, -0xe0,0x04,0xf0,0x90,0x97,0x74,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01, -0x7f,0x04,0x31,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x07,0xe1,0x22,0xe4,0x90,0x97, -0x6c,0xf0,0x22,0x90,0x97,0x7a,0xe0,0x90,0x97,0x76,0x30,0xe0,0x05,0xe0,0xff,0x02, -0x74,0x87,0x21,0x06,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, -0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, -0x07,0x90,0x01,0xc4,0x74,0x74,0xf0,0x74,0x4a,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, -0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, -0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x81,0x0c,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, -0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, -0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, -0x20,0x6f,0x70,0x02,0x61,0xc4,0xe5,0x54,0x30,0xe5,0x02,0x61,0xc4,0xe5,0x52,0x54, -0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, -0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, -0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, -0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, -0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0, -0x02,0xe5,0x09,0x12,0x43,0x52,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, -0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75, -0xf0,0x02,0xe5,0x09,0x12,0x43,0x52,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, -0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, -0x12,0x5e,0x41,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, -0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, -0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, -0x08,0x12,0x5d,0xfd,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x3f,0x90,0x97,0x77, -0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xf1,0xde, -0xef,0x64,0x01,0x70,0x27,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, -0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, -0x97,0x73,0xf0,0x80,0x07,0xf1,0xde,0xbf,0x01,0x02,0x51,0x63,0xe5,0x2c,0x30,0xe1, -0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3,0x5a, -0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f,0x12, -0x6f,0x15,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c,0x30, -0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x24, -0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1d,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20, -0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0xf1,0x87,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0, -0xf1,0x62,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5, -0x2e,0x30,0xe1,0x4c,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90,0x01,0x02, -0xe0,0x54,0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01, -0xf0,0x90,0x97,0x56,0xe4,0xf0,0x80,0x18,0x90,0x97,0x56,0xe0,0x04,0xf0,0xe0,0xc3, -0x94,0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x50,0x4a, -0x90,0x97,0x85,0xe0,0xb4,0x01,0x09,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x85,0xf0, -0xe5,0x2e,0x20,0xe0,0x02,0xa1,0x74,0x90,0x97,0x66,0x74,0x01,0xf0,0x90,0x01,0x36, -0xf0,0x90,0x97,0x80,0xe0,0x30,0xe0,0x30,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x97, -0x80,0xe0,0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x1e,0x90,0x97,0x82,0x74,0x01,0xf0, -0x12,0x44,0x81,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0d,0x7f,0x01,0x12,0x47,0x79, -0xef,0x60,0x05,0x7f,0x01,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0xff,0x30,0xe0,0x4c, -0x13,0x13,0x54,0x3f,0x30,0xe0,0x45,0x90,0x97,0x7c,0x74,0x01,0xf0,0x12,0x44,0x81, -0xe4,0xff,0x12,0x47,0x79,0xef,0x60,0x34,0x12,0x74,0xad,0x90,0x97,0x7b,0xe0,0xff, -0x64,0x04,0x60,0x28,0xef,0xb4,0x03,0x07,0xe4,0xff,0x12,0x56,0x56,0x80,0x12,0x90, -0x97,0x7b,0xe0,0xb4,0x02,0x16,0x12,0x59,0x90,0xef,0x70,0x05,0x7f,0x01,0x12,0x56, -0x56,0x90,0x97,0x76,0xe0,0xff,0x7d,0x01,0x31,0x0a,0xf1,0x22,0x12,0x5c,0xb6,0x90, -0x97,0x66,0xe4,0xf0,0xe5,0x2e,0x20,0xe2,0x02,0xa1,0xfa,0x90,0x01,0x36,0x74,0x04, -0xf0,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x06,0xa3,0xe0,0x64,0x04,0x60,0x6c,0xe5,0x69, -0x64,0x01,0x70,0x66,0xe5,0x6a,0x60,0x62,0xe5,0x6a,0x64,0x02,0x60,0x06,0xe5,0x6a, -0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x6a,0xf0,0x90,0x06,0xaa,0xe0, -0x90,0x97,0x75,0xf0,0x90,0x97,0x6a,0xe0,0x70,0x07,0x90,0x97,0x75,0xe0,0xff,0x80, -0x05,0x90,0x97,0x6a,0xe0,0xff,0x90,0x97,0x6a,0xef,0xf0,0x90,0x97,0x6c,0xe0,0x60, -0x03,0xe0,0x14,0xf0,0x90,0x97,0x6b,0xe4,0xf0,0x90,0x01,0x57,0xf0,0x90,0x01,0x3c, -0x74,0x02,0xf0,0x90,0x97,0x79,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xef,0xf0,0xe5,0x6a, -0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x5c,0x1c,0xe5,0x2e,0x30,0xe3,0x28,0x90, -0x01,0x36,0x74,0x08,0xf0,0xe5,0x69,0x64,0x01,0x70,0x1c,0xe5,0x6a,0x60,0x18,0x90, -0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8b,0xe4,0x12,0x44, -0x57,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2e,0x90,0x01,0x36,0x74, -0x10,0xf0,0xe5,0x69,0x64,0x01,0x70,0x22,0xe5,0x6a,0x60,0x1e,0x90,0x01,0x57,0xe4, -0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x78,0xe4,0xf0,0x90,0x97,0x79,0xe0, -0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x02,0x51,0x63,0xe5,0x2e,0x30,0xe5,0x1f,0x90, -0x01,0x36,0x74,0x20,0xf0,0xe5,0x69,0xb4,0x01,0x14,0xe5,0x6a,0x60,0x10,0x90,0x97, -0x77,0xe0,0x64,0x02,0x60,0x05,0x12,0x5c,0x05,0x80,0x03,0x12,0x44,0xa6,0xe5,0x2e, -0x30,0xe6,0x1d,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x69,0xb4,0x01,0x12,0xe5,0x6a, -0x60,0x0e,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x07,0x70,0x02,0x51,0x63, -0xe5,0x2f,0x30,0xe1,0x25,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x97,0x7a,0xe0,0x30, -0xe0,0x16,0xe4,0xff,0x12,0x47,0x79,0xef,0x60,0x06,0xd1,0xf0,0xf1,0x22,0x80,0x0a, -0x90,0x97,0x7f,0x74,0x01,0xf0,0x80,0x02,0xd1,0xf0,0x74,0x74,0x04,0x90,0x01,0xc4, -0xf0,0x74,0x4a,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0, -0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32, -0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x21, -0x90,0x97,0x77,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x74,0xe0, -0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01,0x7f,0x04,0x31,0x0a,0xe4,0xff,0x11, -0xbb,0x22,0x90,0x97,0x7b,0xe0,0x64,0x04,0x60,0x2f,0x90,0x97,0x74,0xe0,0x54,0x0f, -0x14,0x60,0x1f,0x14,0x60,0x15,0x24,0xfe,0x60,0x0a,0x24,0xf8,0x70,0x1b,0xe4,0x90, -0x97,0x7b,0xf0,0x22,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0x90,0x97,0x7b,0x74,0x02, -0xf0,0x22,0x90,0x01,0xc6,0xe0,0x44,0x08,0xf0,0x22,0xf4,0xff,0x90,0x00,0x43,0xe0, -0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0,0xd0,0x92, -0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, -0xf1,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1, -0x72,0xe4,0xfd,0x7f,0x51,0xf1,0x72,0xe4,0xfd,0x7f,0x52,0xf1,0x72,0xe4,0xfd,0x7f, -0x53,0x80,0xbf,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1,0x72,0x7d,0xff,0x7f,0x55, -0xf1,0x72,0x7d,0xff,0x7f,0x56,0xf1,0x72,0x7d,0xff,0x7f,0x57,0x80,0x94,0x90,0x04, -0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0x90,0x97,0x7f, -0xe0,0xb4,0x01,0x06,0xe4,0xf0,0xd1,0xf0,0xf1,0x22,0x22,0xf1,0xde,0xef,0x64,0x01, -0x60,0x09,0x90,0x01,0xb8,0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x73,0xe0,0x60, -0x09,0x90,0x01,0xb8,0xe0,0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x72,0xe0,0x60,0x09, -0x90,0x01,0xb8,0xe0,0x44,0x04,0xf0,0x80,0x17,0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3, -0x94,0x04,0x40,0x09,0x90,0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22, -0x90,0x01,0xbb,0xe0,0x44,0x08,0xf0,0x7f,0x00,0x22,0x12,0x47,0xf8,0xbf,0x01,0x10, -0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x48,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0, -0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, -0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, -0x90,0x97,0x30,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x73,0x1b,0x90,0x00,0x02,0xe0, -0x54,0xe0,0x90,0x97,0x65,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, -0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x67,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, -0x97,0x67,0xf0,0x90,0x97,0x67,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, -0x0c,0x90,0x97,0x4c,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x4c, -0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x67,0xef,0x12,0x75,0x18, -0x12,0x58,0x82,0x12,0x32,0x3d,0xf1,0xf9,0xf1,0xe7,0x11,0x61,0xe4,0x90,0x97,0x66, -0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, -0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0xf1,0xcf,0x12,0x45,0x01, -0x90,0x97,0x32,0xe5,0xd9,0xf0,0x12,0x4f,0xb3,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44, -0x40,0xf0,0x12,0x4f,0x62,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x97,0x30, -0xe0,0x64,0x01,0xf0,0x24,0x7f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57, -0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x31,0x8c,0xe5,0x57,0x30,0xe6, -0x0a,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x62,0x19,0x31,0x5f,0x80,0xce,0x90, -0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b,0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9, -0x7e,0x01,0x12,0x73,0x2c,0xbf,0x01,0x09,0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80, -0x05,0x80,0x00,0x02,0x73,0x0c,0xe4,0x90,0x06,0x34,0xf0,0x22,0x90,0x01,0xcc,0xe0, -0x54,0x0f,0x90,0x97,0x33,0xf0,0x90,0x97,0x33,0xe0,0xfd,0x70,0x02,0x41,0xcd,0x90, -0x97,0xab,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x41,0xc6,0x90,0x97,0xab,0xe0,0x75, -0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x52,0xe0,0x90,0x97,0x34,0xf0,0x75,0x63,0x01, -0x75,0x64,0x97,0x75,0x65,0x34,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79,0x35,0x12, -0x45,0x09,0x90,0x97,0x35,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90,0x97,0xab, -0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x52,0xe0,0x90,0x97, -0x36,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43,0x52,0xe0, -0x90,0x97,0x37,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43, -0x52,0xe0,0x90,0x97,0x38,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2, -0x12,0x43,0x52,0xe0,0x90,0x97,0x39,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90, -0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x97,0x3a,0xf0,0x80,0x33,0xe0,0x75,0xf0,0x04, -0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x97,0x36,0xf0,0x90,0x97,0xab,0xe0,0x75, -0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90,0x97,0x37,0xf0,0x90,0x97,0xab, -0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x97,0x38,0xf0,0xef, -0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x36,0x51,0xce,0x90,0x97,0x33,0xe0,0xff, -0x90,0x97,0xab,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, -0xf4,0x5f,0x90,0x97,0x33,0xf0,0x90,0x97,0xab,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xab,0xe0,0x04,0xf0, -0xe0,0x54,0x03,0xf0,0x21,0x96,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22,0x90,0x97, -0x3b,0x12,0x43,0x7e,0xef,0x12,0x43,0x87,0x52,0xf7,0x01,0x53,0x00,0x02,0x53,0x08, -0x03,0x53,0x11,0x05,0x53,0x1a,0x06,0x53,0x43,0x07,0x53,0x23,0x08,0x53,0x2b,0x09, -0x53,0x34,0x20,0x00,0x00,0x53,0x3c,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x59,0x67, -0x90,0x97,0x3b,0x12,0x43,0x5e,0xe1,0xeb,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x70, -0x12,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x6e,0xe6,0x90,0x97,0x3b,0x12,0x43,0x5e, -0x02,0x6e,0xd0,0x90,0x97,0x3b,0x12,0x43,0x5e,0x80,0x19,0x90,0x97,0x3b,0x12,0x43, -0x5e,0x02,0x70,0x5a,0x90,0x97,0x3b,0x12,0x43,0x5e,0xe1,0xf1,0x90,0x01,0xc6,0xe0, -0x44,0x01,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x3e,0x12,0x43, -0x7e,0xe4,0x90,0x97,0x41,0xf0,0x12,0x29,0xd9,0xc3,0x13,0x20,0xe0,0x02,0x81,0x8e, -0x90,0x97,0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x54,0x02,0xfe,0x90,0x97,0x80, -0xe0,0x54,0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0, -0x12,0x29,0xd9,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x97,0x80,0xf0, -0xee,0x54,0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x29,0xd9,0xfe,0x54,0x20, -0xfd,0xef,0x54,0xdf,0x4d,0xff,0x90,0x97,0x80,0xf0,0xee,0x54,0x40,0xfe,0xef,0x54, -0xbf,0x4e,0xf0,0x20,0xe0,0x02,0x81,0x7e,0x90,0x97,0x41,0x74,0x21,0xf0,0x90,0x97, -0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x13,0x13,0x54,0x01,0xfe,0x90,0x97,0x80, -0xe0,0xfd,0x13,0x13,0x54,0x01,0x6e,0x60,0x2a,0xef,0x54,0x04,0xff,0xed,0x54,0xfb, -0x4f,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x0e,0x90,0x01,0x34,0x74,0x40,0xf0, -0xfd,0xe4,0xff,0x12,0x36,0xe6,0x80,0x0b,0xe4,0x90,0x97,0x82,0xf0,0x7d,0x40,0xff, -0x12,0x36,0x75,0x90,0x97,0x80,0xe0,0xfd,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07, -0x90,0x97,0x41,0xe0,0x44,0x12,0xf0,0xed,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x97, -0x41,0xe0,0x44,0x14,0xf0,0x90,0x97,0x80,0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07, -0x90,0x97,0x41,0xe0,0x44,0x80,0xf0,0x90,0x97,0x80,0xe0,0xc4,0x13,0x13,0x54,0x03, -0x20,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x40,0xf0,0x90,0x97,0x41,0xe0,0x90,0x05, -0x27,0xf0,0x90,0x97,0x81,0xe0,0x70,0x04,0x7f,0x01,0xb1,0xcb,0x90,0x97,0x80,0xe0, -0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x04,0x7f,0x03,0x80,0x0e,0x7f,0x01,0x12,0x47, -0x79,0xef,0x60,0x04,0x7f,0x01,0x80,0x02,0x7f,0x02,0xb1,0xcb,0xa1,0xc6,0x90,0x97, -0x41,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0,0xe4,0xff,0xb1,0xcb,0xa1,0xc4,0x90,0x97, -0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x54,0x02,0xfe,0x90,0x97,0x7a,0xe0,0x54, -0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x29, -0xd9,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x97,0x7a,0xf0,0xee,0x54, -0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x29,0xd9,0xfe,0x54,0x40,0xfd,0xef, -0x54,0xbf,0x4d,0x90,0x97,0x7a,0xf0,0x20,0xe0,0x02,0xa1,0x97,0x90,0x97,0x41,0x74, -0x31,0xf0,0xee,0x13,0x13,0x54,0x01,0xff,0x90,0x97,0x7a,0xe0,0xfe,0x13,0x13,0x54, -0x01,0x6f,0x60,0x27,0x90,0x97,0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0x54,0x04,0xff, -0xee,0x54,0xfb,0x4f,0x90,0x97,0x7a,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x20,0xe0,0x0b, -0xe4,0x90,0x97,0x7c,0xf0,0x7d,0x40,0xff,0x12,0x36,0x75,0x90,0x97,0x7a,0xe0,0xfd, -0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x02,0xf0,0xed, -0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x04,0xf0,0x90,0x97,0x41, -0xe0,0x54,0x06,0x60,0x0c,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37, -0x00,0x90,0x97,0x41,0xe0,0x90,0x05,0x27,0xf0,0x90,0x97,0x7a,0xe0,0xff,0xc4,0x13, -0x13,0x54,0x03,0x30,0xe0,0x0c,0xa3,0xe0,0x64,0x04,0x60,0x5a,0x7f,0x04,0xd1,0x56, -0x80,0x54,0x90,0x97,0x7b,0xe0,0x64,0x04,0x70,0x18,0x7f,0x01,0xd1,0x56,0xe4,0xff, -0x12,0x47,0x79,0xef,0x60,0x08,0x90,0x97,0x76,0x12,0x49,0x06,0x80,0x04,0xf1,0xb9, -0x80,0x34,0x12,0x4f,0x22,0x80,0x2f,0x90,0x97,0x41,0x74,0x01,0xf0,0x90,0x05,0x27, -0xf0,0x7d,0x03,0x7f,0x02,0x12,0x36,0x92,0x90,0x97,0x7b,0xe0,0xb4,0x04,0x04,0x7f, -0x01,0x80,0x09,0x90,0x97,0x7b,0xe0,0xb4,0x03,0x04,0xe4,0xff,0xd1,0x56,0x12,0x4f, -0xed,0x12,0x4a,0x63,0xf1,0xf9,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x97,0x81,0xe0,0xfe, -0x6f,0x60,0x60,0xef,0x14,0x60,0x1a,0x14,0x60,0x32,0x14,0x60,0x44,0x24,0x03,0x70, -0x52,0xee,0xb4,0x03,0x02,0xe1,0x75,0x90,0x97,0x81,0xe0,0x64,0x02,0x70,0x44,0xe1, -0x8b,0x90,0x97,0x81,0xe0,0xfe,0xb4,0x03,0x04,0x7f,0x01,0x80,0x37,0xee,0xb4,0x02, -0x03,0x02,0x5b,0x76,0x90,0x97,0x81,0xe0,0x70,0x29,0x80,0x37,0x90,0x97,0x81,0xe0, -0xfe,0xb4,0x03,0x06,0xe4,0xff,0xd1,0x34,0x80,0x05,0xee,0x70,0x02,0xd1,0x43,0xe1, -0xa3,0x90,0x97,0x81,0xe0,0xb4,0x02,0x03,0x02,0x44,0xfb,0x90,0x97,0x81,0xe0,0x70, -0x02,0xf1,0x95,0x22,0xef,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x81,0x74, -0x01,0xf0,0x22,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37,0x00,0x90, -0x97,0x81,0x74,0x01,0xf0,0x22,0x90,0x97,0x7b,0xe0,0xfe,0x6f,0x70,0x02,0xe1,0x20, -0xef,0x14,0x60,0x31,0x14,0x60,0x56,0x14,0x60,0x76,0x14,0x70,0x02,0xe1,0x02,0x24, -0x04,0x60,0x02,0xe1,0x20,0xee,0xb4,0x03,0x04,0x7f,0x01,0xe1,0x44,0x90,0x97,0x7b, -0xe0,0xfe,0xb4,0x04,0x06,0x7f,0x01,0xf1,0x2b,0x80,0x08,0xee,0xb4,0x02,0x04,0x7f, -0x01,0xf1,0x21,0xe1,0x5d,0x90,0x97,0x7b,0xe0,0xb4,0x03,0x04,0x7f,0x01,0xf1,0x44, -0x90,0x97,0x7b,0xe0,0x70,0x02,0xe1,0x3a,0x90,0x97,0x7b,0xe0,0xfe,0xb4,0x04,0x04, -0x7f,0x01,0x80,0x77,0xee,0x64,0x02,0x70,0x67,0x7f,0x01,0x80,0x64,0x90,0x97,0x7b, -0xe0,0xb4,0x03,0x04,0x7f,0x01,0xf1,0x44,0x90,0x97,0x7b,0xe0,0x70,0x04,0xf1,0x3a, -0x80,0x0b,0x90,0x97,0x7b,0xe0,0xb4,0x04,0x04,0xe4,0xff,0xf1,0x2b,0x02,0x74,0x70, -0x90,0x97,0x7b,0xe0,0xfe,0xb4,0x04,0x06,0xe4,0xff,0xf1,0x2b,0x80,0x08,0xee,0xb4, -0x02,0x04,0x7f,0x01,0xf1,0x21,0x90,0x97,0x7b,0xe0,0xb4,0x01,0x02,0xf1,0x5d,0x02, -0x73,0x8e,0x90,0x97,0x7b,0xe0,0xff,0x64,0x03,0x60,0x15,0xef,0x70,0x04,0xf1,0x3a, -0x80,0x0b,0x90,0x97,0x7b,0xe0,0xb4,0x02,0x04,0xe4,0xff,0xf1,0x21,0x12,0x74,0x7a, -0x22,0x12,0x5a,0xd9,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0xef,0x60,0x05,0x90,0x05, -0x22,0xe4,0xf0,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0x12,0x5a,0xbd,0x90,0x97,0x7b, -0x74,0x01,0xf0,0x22,0x90,0x97,0xaf,0xef,0xf0,0x12,0x5a,0xf7,0x90,0x97,0xaf,0xe0, -0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0xe4,0x90,0x97,0x7b,0xf0,0x22,0x7f,0x01,0x12, -0x5a,0x65,0xe4,0x90,0x97,0x7b,0xf0,0x22,0x90,0x05,0x22,0x74,0x0f,0xf0,0x90,0x97, -0x81,0x74,0x03,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x7d,0x03,0x7f,0x02,0x12,0x36, -0x92,0x90,0x05,0x27,0xe4,0xf0,0x90,0x97,0x81,0xf0,0x22,0x12,0x5a,0xf7,0x90,0x05, -0x22,0xe4,0xf0,0x80,0xe5,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37, -0x00,0x80,0xc5,0x12,0x74,0xd1,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x12, -0x73,0x9d,0x90,0x97,0x81,0x74,0x02,0xf0,0x22,0x90,0x97,0x7b,0xe0,0xb4,0x01,0x04, -0x7f,0x02,0x80,0x08,0x90,0x97,0x7b,0xe0,0x70,0x04,0x7f,0x03,0xd1,0x56,0x22,0x75, -0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5, -0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4,0xf5,0x26,0x22,0x12,0x29,0xd9,0xf5,0x69, -0x22,0x12,0x29,0xd9,0x90,0x97,0x86,0xf0,0x22,0xe4,0x90,0x97,0x86,0xf0,0x90,0x97, -0x80,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, -0xf0,0xa3,0xf0,0x90,0x97,0x7a,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0, -0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0, -0xd0,0x75,0xd0,0x00,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x7d,0x29,0x90,0x01,0xc4,0xed, -0xf0,0x74,0x58,0xff,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xfe,0x90,0x00, -0x55,0xe0,0x5e,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x03,0x74,0x40,0xf0,0x90,0x01,0xc4, -0xed,0xf0,0xa3,0xef,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0xd0,0xd0,0x82,0xd0, -0x83,0xd0,0xe0,0x32,0x8f,0x1d,0x8c,0x1e,0x8d,0x1f,0x22,0x8f,0x20,0x8c,0x21,0x8d, -0x22,0x22,0xe4,0xf5,0x69,0x90,0x97,0x79,0xf0,0xf5,0x6a,0x90,0x97,0x76,0x74,0x0c, -0xf0,0x90,0x97,0x74,0xf0,0xe4,0x90,0x97,0x77,0xf0,0x90,0x97,0x73,0xf0,0x90,0x97, -0x72,0xf0,0x90,0x97,0x75,0x04,0xf0,0x90,0x97,0x6a,0xf0,0xe4,0x90,0x97,0x78,0xf0, -0x90,0x97,0x6c,0xf0,0x90,0x97,0x71,0x74,0x07,0xf0,0xe4,0x90,0x97,0x6b,0xf0,0x90, -0x97,0x6f,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x6e,0xf0,0x90,0x97,0x69,0xf0, -0x22,0xe4,0x90,0x97,0x78,0xf0,0x90,0x97,0x6b,0xf0,0x90,0x97,0x79,0xf0,0x22,0x8b, -0x11,0x8a,0x12,0x89,0x13,0x11,0xd1,0xab,0x11,0xaa,0x12,0xa9,0x13,0x12,0x29,0xd9, -0xf5,0x6a,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x41,0x7f, -0x01,0x80,0x3a,0xab,0x11,0xaa,0x12,0xa9,0x13,0x90,0x00,0x02,0x12,0x42,0x20,0xfd, -0xe4,0xff,0x31,0x41,0x80,0x27,0xab,0x11,0xaa,0x12,0xa9,0x13,0x90,0x00,0x02,0x12, -0x42,0x20,0xfd,0x7f,0x01,0x31,0x41,0x1f,0x80,0x13,0xab,0x11,0xaa,0x12,0xa9,0x13, -0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x31,0x41,0xe4,0xff,0x12,0x49,0xc6, -0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x75,0x74,0x01,0xf0,0x80, -0x11,0xed,0x90,0x97,0x75,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97, -0x75,0xe0,0x90,0x97,0x6a,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00, -0x01,0x12,0x42,0x20,0x90,0x97,0x77,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97, -0x69,0xf0,0x12,0x29,0xd9,0x65,0x6a,0x60,0x02,0x11,0xdf,0xd0,0xd0,0x92,0xaf,0x22, -0x12,0x4f,0xde,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0,0x44,0x01,0xf0,0x80, -0x48,0x90,0x97,0x79,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9,0xe0,0x44,0x02,0xf0, -0x80,0x37,0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40,0x09,0x90,0x01,0xb9, -0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x79,0xe0,0x30,0xe2,0x09,0x90,0x01,0xb9, -0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x79,0xe0,0x30,0xe4,0x09,0x90,0x01,0xb9, -0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44,0x04,0xf0, -0x7f,0x00,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, -0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, -0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, -0xf0,0x80,0x38,0x90,0x97,0x65,0xe0,0xb4,0x02,0x10,0x90,0x97,0x4c,0xe0,0xfe,0xa3, -0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, -0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x6e,0xe0,0x70,0x09,0x90, -0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, -0x02,0xf0,0x7f,0x00,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5, -0x69,0xb4,0x01,0x04,0xe4,0xff,0x51,0x84,0x90,0x97,0x74,0xe0,0x54,0xf0,0xf0,0xe0, -0x44,0x0c,0xf0,0x22,0x8f,0x6c,0x12,0x47,0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x97, -0x61,0x12,0x48,0x26,0xe5,0x6c,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, -0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, -0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0x04, -0xe0,0x44,0x40,0xf0,0xe5,0x69,0xb4,0x01,0x04,0x7f,0x01,0x51,0x84,0x90,0x97,0x74, -0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x97,0xac,0xef,0xf0,0x51,0xf7, -0x90,0x97,0xac,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x74,0xe0,0x54, -0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f, -0x62,0x90,0x97,0x1d,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e, -0x08,0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f, -0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x46,0x90,0x80,0x85, -0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x46, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59, -0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x67, -0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd, -0x7f,0x01,0x12,0x34,0x81,0x22,0x51,0xf7,0x90,0x97,0x85,0xe0,0x64,0x01,0x60,0x0c, -0x90,0x01,0x36,0xe0,0x20,0xe0,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x81,0x74, -0x01,0xf0,0x22,0x8f,0x6b,0xe4,0x90,0x97,0xa5,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0, -0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6b,0x60,0x3e,0xc3,0x90,0x97,0xa6, -0xe0,0x94,0x88,0x90,0x97,0xa5,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44, -0x80,0xf0,0x22,0x90,0x97,0xa5,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x14,0x7e, -0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xa6,0xe0,0x94,0x32,0x90,0x97,0xa5,0xe0,0x94, -0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x22,0x90,0x97,0x74,0xe0, -0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0,0x12,0x45,0x02,0x71,0xeb,0xe0,0x54,0xf0,0xf0, -0xe0,0x44,0x02,0xf0,0x22,0x12,0x47,0xf8,0xbf,0x01,0x10,0x90,0x97,0x60,0xe0,0xff, -0xe4,0xfd,0x12,0x48,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0xa9,0xe0, -0xf5,0x0b,0x54,0xc0,0x70,0x0e,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd, -0xf0,0x12,0x4a,0x63,0xe5,0x0b,0x30,0xe6,0x18,0x90,0x97,0x79,0xe0,0x44,0x01,0xf0, -0x90,0x97,0x77,0xe0,0x64,0x02,0x60,0x04,0x91,0x05,0x80,0x0c,0x12,0x44,0xa6,0x80, -0x07,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90,0x97,0x79,0x30,0xe7,0x18, -0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x8b,0x12,0x44,0x57,0x90,0x01,0x57,0x74,0x05, -0xf0,0x90,0x97,0x78,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0,0x22,0x8f,0x6d,0x12, -0x47,0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x62,0x12,0x48,0x26,0xe5,0x6d,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, -0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x2e,0xf0,0xe5,0x6a,0x70,0x02,0xa1, -0x58,0xe5,0x69,0x64,0x01,0x60,0x02,0xa1,0x58,0xe5,0x6a,0x14,0x60,0x29,0x24,0xfd, -0x60,0x25,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x6a,0xe0,0x14,0xf0, -0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x97,0x6a,0xe0,0x70,0x0a,0x90,0x97,0x75, -0xe0,0x90,0x97,0x6a,0xf0,0x80,0x00,0x90,0x97,0x2e,0x74,0x01,0xf0,0x90,0x97,0x7a, -0xe0,0x30,0xe0,0x16,0xa3,0xe0,0xb4,0x04,0x05,0xe4,0x90,0x97,0x2e,0xf0,0xe4,0xff, -0x12,0x47,0x79,0xef,0x70,0x04,0x90,0x97,0x2e,0xf0,0x90,0x97,0x2e,0xe0,0x60,0x38, -0x90,0x97,0x79,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x8b,0xf0,0x90,0x97,0x71,0xe0, -0x90,0x97,0x8c,0x12,0x44,0x5b,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x74,0xe0, -0x54,0x0f,0xc3,0x94,0x04,0x50,0x11,0x7d,0x01,0x7f,0x04,0x12,0x49,0x0a,0x90,0x97, -0x7a,0xe0,0x30,0xe0,0x03,0x12,0x4f,0x22,0x22,0x90,0x97,0x78,0xe0,0x60,0x0e,0xe4, -0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28,0x80,0x23,0x90,0x97,0x6b, -0xe0,0x04,0xf0,0x90,0x97,0x79,0xe0,0x54,0xef,0xf0,0x90,0x97,0x6b,0xe0,0xd3,0x94, -0x01,0x40,0x0d,0xe5,0x69,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22, -0x12,0x4a,0x63,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4, -0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, -0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04, -0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, -0xe0,0x4d,0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, -0x83,0xed,0xf0,0xaf,0x11,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5, -0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f, -0xf5,0x10,0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0xeb, -0xc3,0x94,0x01,0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41, -0x9e,0x93,0xfc,0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92, -0xf5,0x83,0xe4,0xf0,0x80,0xaf,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0, -0x22,0xac,0x07,0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xff,0x74, -0xa5,0x2c,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40, -0x02,0xab,0x07,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4, -0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41, -0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff, -0xec,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef, -0xf0,0xaf,0x04,0xad,0x03,0xb1,0xe5,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d,0xf5, -0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1c,0x54,0x1f,0xfc,0x75,0xf0, -0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xff,0x90,0x97,0x3d,0xf0,0xed,0x25, -0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97, -0x3e,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x40,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25, -0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93, -0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0,0xa3, -0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xe1,0xac,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34, -0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x3d,0xe0,0xff,0xeb,0xd3,0x9f,0x40, -0x02,0xe1,0xdd,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e, -0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97, -0x3e,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x39, -0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, -0xff,0x90,0x97,0x40,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64,0x13, -0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x3e,0xe0,0x30,0xe0, -0x02,0x7b,0x18,0xac,0x03,0x8c,0x1c,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x3d,0xe0, -0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec,0xf0, -0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x52,0xe0,0xb4,0x01,0x0c,0xe5,0x1c, -0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1c,0x80,0x03,0xaf,0x1c,0x22,0xec,0x25,0xe0, -0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff, -0xec,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f, -0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5, -0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b, -0x40,0x56,0x90,0x97,0x3d,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5, -0x83,0xef,0xf0,0xac,0x07,0x8f,0x1c,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, -0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x2e,0xf5, -0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13, -0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, -0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1c,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0x92, -0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1c,0x44,0x80,0xfd,0x12,0x5d,0xe5,0xe5,0x1c, -0x44,0x80,0xff,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82,0xe4,0x34,0x04, -0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x3f,0xf0,0x75,0xf0,0x09, -0xea,0x90,0x93,0x28,0x12,0x43,0x52,0xe0,0x90,0x97,0x41,0xf0,0x75,0xf0,0x09,0xea, -0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xfe,0x90,0x97,0x42,0xf0,0xea,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x43,0xcd, -0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, -0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x45,0xcd,0xf0,0xa3,0xed,0xf0,0xe9,0xd3,0x9e,0x40, -0x09,0x90,0x97,0x42,0xe0,0x90,0x97,0x3f,0xf0,0xfb,0xef,0x70,0x02,0x21,0xd1,0x90, -0x97,0x40,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x3f,0xe0,0xfb,0xa3,0xe0,0x14, -0xf0,0x90,0x97,0x40,0xe0,0x70,0x02,0x21,0xd1,0x90,0x97,0x3f,0xe0,0xff,0xd3,0x94, -0x00,0x50,0x02,0x21,0xd1,0xe4,0x90,0x97,0x3e,0xf0,0xef,0x14,0x90,0x97,0x3d,0xf0, -0x90,0x97,0x41,0xe0,0xf9,0x90,0x97,0x3d,0xe0,0xff,0xd3,0x99,0x40,0x6a,0xef,0x94, -0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, -0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x45,0xe0,0x5e,0xfe,0xa3,0xe0, -0x5f,0x4e,0x70,0x27,0x90,0x97,0x3d,0xe0,0xff,0xc3,0x94,0x10,0x50,0x32,0x74,0x01, -0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x97,0x43,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97,0x3d,0xe0,0xfb, -0xa3,0xe0,0x04,0xf0,0x90,0x97,0x40,0xe0,0xff,0x90,0x97,0x3e,0xe0,0x6f,0x60,0x08, -0x90,0x97,0x3d,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x40,0xe0,0xff,0x90,0x97,0x3e, -0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x3d,0xe0,0xb5,0x01,0x05,0x90,0x97,0x41,0xe0, -0xfb,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe, -0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xea,0x25, -0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf, -0x02,0xad,0x03,0x12,0x5d,0xe5,0xaf,0x03,0x22,0xe4,0xf5,0x11,0x75,0xf0,0x09,0xe5, -0x11,0x90,0x93,0x2a,0x12,0x43,0x52,0xe0,0x64,0x01,0x60,0x02,0xe1,0xe3,0xe5,0x11, -0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, -0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xe3,0xe5,0x11,0x75,0xf0,0x0a,0xa4,0x24, -0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0xe5,0x11,0x25, -0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, -0x37,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x39,0xcf,0xf0,0xa3,0xef,0xf0,0x74, -0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x33, -0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93,0x27,0x12, -0x43,0x52,0xe0,0x90,0x97,0x3c,0xf0,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xbc,0x90,0x97,0x3c,0xe0,0xff,0x90, -0x97,0x34,0xe0,0x9f,0x40,0x13,0x90,0x97,0x3c,0xe0,0x90,0x97,0x34,0xf0,0xee,0x54, -0x40,0xfe,0x90,0x97,0x33,0xf0,0xef,0x4e,0xf0,0x90,0x97,0x34,0xe0,0xff,0x90,0x41, -0x12,0x93,0xfe,0x74,0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3, -0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80,0x07,0x90,0x97,0x34,0xe0,0x90,0x40,0xf6, -0x93,0x90,0x97,0x3b,0xf0,0x90,0x97,0x3b,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50,0xf9, -0x74,0x40,0x35,0xf0,0x75,0x13,0xff,0xf5,0x14,0x89,0x15,0x90,0x97,0x33,0xe0,0x90, -0x41,0xba,0x93,0xff,0xd3,0x90,0x97,0x3a,0xe0,0x9f,0x90,0x97,0x39,0xe0,0x94,0x00, -0x40,0x08,0xe4,0xfd,0xaf,0x11,0x11,0x94,0xe1,0x7a,0xe5,0x11,0x25,0xe0,0x24,0xe1, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x19,0xa3,0xe0,0xf5,0x1a,0xab,0x13, -0xaa,0x14,0xa9,0x15,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18, -0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35, -0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x42,0x20,0xff, -0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x02,0x12,0x42,0xc2,0xfd,0xac, -0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab,0x13, -0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x16,0xaa, -0x17,0xa9,0x18,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef, -0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90, -0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, -0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee, -0x35,0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x04,0x12,0x42,0x20, -0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x08,0x12,0x42,0xc2,0xfd, -0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab, -0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00,0x90,0x97, -0x37,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1a,0x9f,0xe5,0x19,0x9e, -0x40,0x0c,0xe5,0x1a,0x9f,0xf5,0x1a,0xe5,0x19,0x9e,0xf5,0x19,0x80,0x05,0xe4,0xf5, -0x19,0xf5,0x1a,0xe5,0x11,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, -0xe5,0x19,0xf0,0xa3,0xe5,0x1a,0xf0,0x90,0x97,0x33,0xe0,0xf9,0x25,0xe0,0x24,0x2e, -0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1a,0xe4,0x93,0x95, -0x19,0x50,0x07,0xaf,0x11,0x12,0x5e,0xaa,0xe1,0x4e,0xe9,0x25,0xe0,0x24,0x66,0xf5, -0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1a,0xe4,0x93,0x95,0x19, -0x50,0x02,0xe1,0x4e,0x7d,0x01,0xaf,0x11,0x11,0x94,0xe1,0x4e,0x74,0x64,0x25,0x11, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,0xc1,0x57,0x90, -0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x19,0x40,0x3d, -0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x11,0x40,0x2e,0x80, -0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x0a, -0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x34,0xe0,0xc3,0x94,0x03,0x40,0x0d, -0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0,0x74,0x43,0x25, -0x11,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1b,0x74,0x23,0x25,0x11,0xf5, -0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,0xc1,0x04,0x90, -0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x04,0x74,0x44,0x25,0x11,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,0xe4,0x33,0xfe, -0x74,0x21,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd,0xd3,0x9f,0xee, -0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,0x33,0xfe,0x74, -0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f,0xee,0x64,0x80, -0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, -0x83,0xe0,0xff,0x90,0x97,0x34,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25,0x11,0xf5,0x82, -0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,0x1b,0x05,0x80, -0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1b,0x03,0x80,0x03,0x75,0x1b,0x01,0x74, -0x21,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74,0x44,0x25,0x11, -0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, -0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1b,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xe4,0xf0,0x90,0x97,0x34,0xe0,0xff,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x11,0xf5,0x82,0xe4,0x34,0x94,0xf5, -0x83,0xe5,0x1b,0xf0,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93,0x2b,0x12,0x43,0x52,0xe0, -0xb4,0x01,0x10,0xe4,0xf5,0x1b,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, -0x83,0xe4,0xf0,0xad,0x1b,0xe1,0x49,0xec,0x64,0x06,0x60,0x02,0xe1,0x4e,0xf5,0x19, -0xf5,0x1a,0x90,0x41,0xdb,0x93,0xff,0x7e,0x00,0x90,0x97,0x37,0xe0,0xfc,0xa3,0xe0, -0xfd,0x12,0x29,0xf2,0x90,0x97,0x35,0xee,0xf0,0xa3,0xef,0xf0,0x74,0x43,0x25,0x11, -0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1b,0xe4,0xf5,0x12,0xab,0x16,0xaa, -0x17,0xa9,0x18,0x75,0xf0,0x02,0xe5,0x12,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x12,0x42, -0xc2,0xfd,0xac,0xf0,0xe5,0x12,0x90,0x41,0xd6,0x93,0xff,0x7e,0x00,0x12,0x29,0xf2, -0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xc3,0x90,0x97,0x36,0xe0,0x95, -0x1a,0x90,0x97,0x35,0xe0,0x95,0x19,0x40,0x07,0x05,0x12,0xe5,0x12,0xb4,0x05,0xbd, -0xe5,0x12,0xc3,0x13,0xf5,0x12,0xe5,0x1b,0xb4,0x01,0x06,0xe5,0x12,0x70,0x46,0x80, -0x13,0xe5,0x1b,0xb4,0x03,0x15,0xe5,0x12,0x70,0x05,0x75,0x1b,0x03,0x80,0x39,0xe5, -0x12,0xb4,0x01,0x05,0x75,0x1b,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1b,0xb4,0x05,0x28, -0xe5,0x12,0x70,0x05,0x75,0x1b,0x05,0x80,0x0d,0xe5,0x12,0xb4,0x01,0x05,0x75,0x1b, -0x03,0x80,0x03,0x75,0x1b,0x01,0xd3,0x90,0x97,0x3a,0xe0,0x94,0x03,0x90,0x97,0x39, -0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1b,0xd3,0x90,0x97,0x3a,0xe0,0x94,0x03,0x90, -0x97,0x39,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1b,0x74,0x43,0x25,0x11,0xf5,0x82, -0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1b,0xf0,0xfd,0xaf,0x11,0x12,0x5d,0x94,0x74,0x64, -0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74,0x64,0x50, -0x0e,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x0b,0x25, -0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18, -0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x02,0xe4, -0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00, -0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x43,0x19, -0xe5,0x11,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xe5,0x11,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0, -0xa3,0xf0,0xe5,0x11,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, -0xf0,0xa3,0xf0,0x05,0x11,0xe5,0x11,0xc3,0x94,0x20,0x50,0x02,0x41,0x1c,0x22,0xe4, -0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x0d,0xbd,0x10, -0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x52,0xe4,0xf0,0xa3, -0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75, -0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a, -0xed,0x90,0x90,0x06,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90, -0x90,0x08,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34, -0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xed,0x25, -0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, -0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, -0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, -0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, -0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, -0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x44, -0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, -0xe4,0xf0,0x90,0x41,0x8c,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x54,0x74,0x01, -0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24, -0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09, -0xed,0x90,0x93,0x29,0x12,0x43,0x52,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, -0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, -0x52,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x52, -0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x52, -0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x52,0xe4,0xf0,0x74, -0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, -0x60,0x02,0x01,0x03,0x22,0x8f,0x11,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, -0x95,0xaf,0x82,0xf5,0x13,0x8f,0x14,0xe5,0x11,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9, -0x74,0x92,0x35,0xf0,0x75,0x15,0x01,0xf5,0x16,0x89,0x17,0x75,0xf0,0x09,0xe5,0x11, -0x90,0x93,0x25,0x12,0x43,0x52,0xaf,0x82,0x85,0x83,0x18,0x8f,0x19,0xe5,0x11,0x75, -0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1a,0x01,0xf5,0x1b,0x89, -0x1c,0x74,0xc1,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x87, -0x6a,0x05,0x00,0x6a,0x1a,0x01,0x6a,0x2f,0x02,0x6a,0x44,0x03,0x6a,0x6d,0x04,0x6a, -0x82,0x05,0x6a,0x97,0x06,0x6a,0xbd,0x0c,0x6a,0xea,0x0d,0x6b,0x17,0x0e,0x6b,0x44, -0x0f,0x00,0x00,0x6b,0x78,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x11,0x25,0xe0,0x24,0xe4, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5, -0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3, -0x74,0x05,0x80,0x12,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5, -0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4, -0x34,0x92,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x61,0x78,0xe5,0x11,0x25, -0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5, -0x80,0x27,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, -0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x81, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x61,0x78,0x90,0x04,0x47, -0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x15, -0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x14, -0x82,0x85,0x13,0x83,0xf0,0x90,0x04,0x44,0x61,0x6f,0x90,0x04,0x4b,0xe0,0xab,0x15, -0xaa,0x16,0xa9,0x17,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x15,0xaa,0x16,0xa9, -0x17,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x14,0x82,0x85,0x13, -0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x15,0xaa,0x16,0xa9, -0x17,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00, -0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x14,0x82,0x85,0x13,0x83,0xf0,0x90, -0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x12,0x42, -0x4d,0x90,0x04,0x52,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42, -0x5f,0x90,0x04,0x51,0xe0,0x85,0x14,0x82,0x85,0x13,0x83,0xf0,0x90,0x04,0x50,0xe0, -0x85,0x14,0x82,0x85,0x13,0x83,0xa3,0xf0,0xab,0x15,0xaa,0x16,0xa9,0x17,0xc0,0x03, -0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1a,0xaa,0x1b,0xa9,0x1c,0x12,0x29, -0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x15,0xe5,0x17,0x24, -0x01,0xf9,0xe4,0x35,0x16,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, -0xab,0x1a,0xaa,0x1b,0xa9,0x1c,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, -0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x14,0x82,0x85,0x13,0x83,0xc0,0x83,0xc0,0x82, -0xe0,0xff,0x85,0x19,0x82,0x85,0x18,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, -0xf0,0x85,0x14,0x82,0x85,0x13,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x19, -0x82,0x85,0x18,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x11, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, -0x60,0x3b,0x75,0x12,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08,0x80,0x05,0xc3,0x33, -0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x12,0x24,0x10, -0x80,0x5d,0x15,0x12,0xe5,0x12,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x11,0x25, -0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, -0x3d,0x75,0x12,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08,0x80,0x05,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x4a,0xe5,0x12, -0xf0,0x80,0x10,0x15,0x12,0xe5,0x12,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, -0x97,0x4a,0xf0,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x12,0x74,0x01,0x7e,0x00,0xa8,0x12, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, -0x08,0x90,0x97,0x4b,0xe5,0x12,0xf0,0x80,0x5b,0x05,0x12,0xe5,0x12,0xb4,0x10,0xca, -0x80,0x52,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, -0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x12,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08, -0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0x81, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, -0xe5,0x12,0x24,0x10,0x80,0x0a,0x05,0x12,0xe5,0x12,0xb4,0x0c,0xcc,0x80,0x05,0xe4, -0x90,0x97,0x4b,0xf0,0x90,0x97,0x4a,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93, -0x27,0x12,0x43,0x52,0xef,0xf0,0x90,0x97,0x4b,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x11, -0x90,0x93,0x28,0x12,0x43,0x52,0xee,0xf0,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34, -0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x06,0x90,0x97,0x4a,0x12,0x5d,0xd4,0x74,0x84, -0x25,0x11,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x4b,0xe0,0xfe, -0xef,0xc3,0x9e,0x50,0x03,0x12,0x5d,0xd4,0x90,0x97,0x4a,0xe0,0xff,0xd3,0x94,0x13, -0x40,0x08,0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08, -0x90,0x93,0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93, -0x22,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90, -0x04,0xb1,0xf0,0x22,0x90,0x97,0x3e,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x7e, -0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0xf0,0xc4,0x54, -0x0f,0x90,0x97,0x43,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54,0x40,0xc4,0x13,0x13, -0x54,0x03,0x90,0x97,0x44,0xf0,0x90,0x97,0x3e,0xe0,0xff,0x75,0xf0,0x09,0x90,0x93, -0x25,0x12,0x43,0x52,0xad,0x82,0xac,0x83,0x90,0x97,0x45,0xec,0xf0,0xa3,0xed,0xf0, -0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0xfa,0x7b,0x01,0xa3, -0x12,0x43,0x7e,0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x42,0x20,0x54, -0x0f,0xff,0x90,0x97,0x47,0x12,0x43,0x5e,0xef,0x12,0x42,0x4d,0x90,0x97,0x40,0x12, -0x43,0x5e,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x47,0x12,0x43,0x5e,0x90, -0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x01,0x12, -0x42,0x20,0xff,0x90,0x97,0x45,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef, -0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97,0x43,0xe0,0xfe,0x90, -0x97,0x3e,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x90, -0x97,0x3f,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12,0x43,0x52,0xee,0xf0, -0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x52,0x74,0x01,0xf0,0x90,0x97,0x44, -0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x52,0xee,0xf0,0x21,0x85, -0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54, -0x07,0xfd,0xaf,0x06,0xa1,0xd4,0x12,0x29,0xd9,0xf5,0x11,0xc3,0x94,0x20,0x50,0x15, -0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xef,0xf0,0x22,0xe5,0x11,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20, -0x90,0x93,0x21,0xf0,0x22,0x90,0x97,0x2e,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f, -0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0x96,0x12,0x43,0x7e,0x0b, -0x7a,0x97,0x79,0x2e,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x93,0x12,0x43, -0x7e,0x90,0x97,0x65,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x65,0xe0,0x64,0x01,0x70, -0x66,0x90,0x97,0xad,0xe0,0xff,0x04,0xf0,0x90,0x97,0x93,0x12,0x43,0x5e,0x90,0x00, -0x01,0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0xf1,0xbc,0xef,0x60,0x49,0x90,0x97, -0x93,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a, -0x01,0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0x96,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64, -0x89,0x65,0x90,0x97,0x93,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5, -0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0, -0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01, -0xc3,0xc0,0xd0,0x90,0x97,0x9d,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, -0x90,0x97,0x9d,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90, -0x97,0xa0,0xe0,0x94,0xe8,0x90,0x97,0x9f,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6, -0xe0,0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0x9f,0xe4,0x75,0xf0,0x01,0x12, -0x42,0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92, -0xaf,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90, -0x97,0x5f,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x60,0xf0, -0x90,0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x61,0xf0,0x90,0x00,0x03, -0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20, -0xff,0xae,0x05,0xed,0x2f,0x90,0x97,0x63,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, -0xd0,0x90,0x97,0x3e,0x12,0x43,0x7e,0x90,0x97,0x3e,0x12,0x43,0x5e,0x90,0x00,0x01, -0x12,0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x3e,0x12, -0x43,0x5e,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60, -0x2c,0xb5,0x23,0x16,0x90,0x97,0x3e,0x12,0x43,0x5e,0x90,0x00,0x01,0x12,0x42,0xc2, -0x65,0x25,0x70,0x04,0xe5,0x24,0x65,0xf0,0x60,0x23,0x90,0x97,0x3e,0x12,0x43,0x5e, -0x90,0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x11,0xd2,0x80,0x10,0x90,0x97,0x3e, -0x12,0x43,0x5e,0x12,0x29,0xd9,0x65,0x23,0x60,0x03,0x12,0x47,0xef,0xd0,0xd0,0x92, -0xaf,0x22,0x90,0x97,0x41,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x23,0x01,0x8e,0x24,0xf5, -0x25,0xe4,0xfd,0x7f,0x0b,0x31,0x14,0xe4,0xfd,0x7f,0x02,0x31,0x14,0x31,0xea,0xe4, -0xff,0x31,0xde,0xe4,0xf5,0x27,0x90,0x01,0xc9,0xe5,0x27,0xf0,0x90,0x97,0x41,0xe0, -0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, -0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x44,0xed,0xf0, -0x90,0x97,0x43,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, -0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, -0x4f,0x62,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x43,0xe0,0x24,0xf8,0xf0, -0xa3,0xe0,0x70,0x1d,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, -0x1a,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0x62,0x90,0x97, -0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, -0xca,0xe5,0x26,0xf0,0xef,0x60,0x02,0x51,0x4b,0x22,0x7f,0x0b,0x51,0x6b,0xef,0x65, -0x26,0x60,0x10,0xe5,0x26,0xb4,0x01,0x05,0xe4,0xf5,0x26,0x80,0x03,0x75,0x26,0x01, -0x7f,0x01,0x22,0x7f,0x00,0x22,0xe5,0x23,0x64,0x01,0x70,0x3e,0x31,0xea,0xbf,0x01, -0x04,0x7f,0x01,0x31,0xde,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0x12,0x4f, -0x72,0x90,0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x12,0x4f,0x72,0x90,0x00,0x46, -0xe0,0x54,0xfb,0xfd,0x7f,0x46,0x12,0x4f,0x72,0x7f,0x02,0x51,0x6b,0x8f,0x27,0x90, -0x01,0xc9,0xe5,0x27,0xf0,0xb4,0x01,0x02,0x51,0x4b,0x22,0x90,0x00,0x49,0xe0,0x90, -0x97,0xae,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x12,0x4f,0x72,0x90, -0x97,0xae,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0x02,0x4f,0x72,0xd3,0x10,0xaf,0x01,0xc3, -0xc0,0xd0,0x90,0x97,0xb0,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01, -0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f, -0xf0,0x12,0x4f,0x62,0x90,0x97,0xb0,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08, -0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4, -0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8, -0xff,0x80,0x44,0x90,0x97,0xb0,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07, -0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0x5a,0x90,0x97,0xb0,0xe0,0xfd,0x74, -0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff, -0x90,0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2, -0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74, -0xff,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x22,0xe4,0x90,0x97,0x64,0xf0, -0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0x02,0x4f,0x72,0x8e,0x11,0x8f,0x12, -0x8b,0x13,0x8a,0x14,0x89,0x15,0xe4,0x90,0x97,0x33,0xf0,0xef,0x90,0x00,0x31,0xf0, -0x12,0x4f,0x62,0xe5,0x11,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0, -0x12,0x4f,0x62,0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0x62,0x90,0x00,0x33, -0xe0,0x20,0xe7,0x0e,0x90,0x97,0x33,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0, -0x80,0xeb,0x90,0x97,0x33,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab, -0x13,0xaa,0x14,0xa9,0x15,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x05, -0x22,0x74,0xff,0xf0,0x71,0x9d,0x90,0x97,0x7b,0x74,0x03,0xf0,0x22,0x7f,0x78,0x7e, -0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27, -0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x97, -0x25,0x12,0x2a,0x7f,0x90,0x97,0x67,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d,0x12,0x43, -0x46,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x46,0xef,0x54, -0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9, -0x90,0x97,0x21,0x12,0x43,0x46,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x46,0xef,0x44, -0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9, -0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x29,0x12,0x2a,0x7f,0x90,0x80,0x85, -0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, -0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97, -0x67,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4, -0xfd,0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02,0x4f,0x62, -0x12,0x48,0xd6,0x90,0x97,0x7b,0x74,0x02,0xf0,0x22,0x90,0x05,0x22,0x74,0x0f,0xf0, -0x90,0x97,0x7b,0x74,0x04,0xf0,0x22,0xae,0x07,0xe4,0xff,0x12,0x47,0x79,0xef,0x60, -0x19,0x90,0x97,0x7a,0xe0,0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x0d,0xaf,0x06,0x7d, -0x01,0x12,0x49,0x0a,0x12,0x4f,0x22,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x97,0x7a, -0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x0b,0xa3,0xe0,0x64,0x04,0x60,0x05, -0x7f,0x04,0x12,0x56,0x56,0x90,0x97,0x7b,0xe0,0x64,0x04,0x60,0x03,0x12,0x4f,0xed, -0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0xe4,0x90,0x97,0xa7,0xf0,0xa3,0xf0,0x90,0x05, -0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03, -0x7f,0x01,0x22,0xd3,0x90,0x97,0xa8,0xe0,0x94,0xe8,0x90,0x97,0xa7,0xe0,0x94,0x03, -0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x37,0x54,0x90,0x97,0xa7,0xe4, -0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6,0x90,0x97,0x67,0xe0,0x90,0x97,0x2d,0xf0, -0x22,0xef,0x70,0x02,0xc1,0xd8,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x7a,0xa4,0x90, -0x97,0x19,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, -0x2f,0xd9,0x90,0x96,0xc5,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44, -0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc9,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xcd,0x12,0x43,0x46,0x90,0x80, -0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43, -0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, -0xd5,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f, -0xd9,0x90,0x96,0xd9,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e, -0x0e,0x12,0x2f,0xd9,0x90,0x96,0xdd,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f, -0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe1,0x12,0x43,0x46,0x90,0x80,0x85, -0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x46, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9, -0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9, -0x90,0x96,0xed,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e, -0x12,0x2f,0xd9,0x90,0x96,0xf1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf5,0x12,0x43,0x46,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf9,0x12,0x43,0x46,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12, -0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90, -0x97,0x01,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12, -0x2f,0xd9,0x90,0x97,0x05,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec, -0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x09,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x0d,0x12,0x43,0x46,0x90,0x80, -0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43, -0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97, -0x15,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f, -0xd9,0x90,0x97,0x2d,0x74,0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x03, -0x02,0x7a,0xa4,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x19,0x12,0x2a,0x7f, -0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x96,0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e, -0x08,0x12,0x27,0xde,0x90,0x96,0xc9,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27, -0xde,0x90,0x96,0xcd,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96, -0xd1,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd5,0x12,0x2a, -0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c, -0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xdd,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12, -0x27,0xde,0x90,0x96,0xe1,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x27,0xde,0x90, -0x96,0xe5,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe9,0x12, -0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f, -0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf1,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e, -0x12,0x27,0xde,0x90,0x96,0xf5,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde, -0x90,0x96,0xf9,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xfd, -0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x01,0x12,0x2a,0x7f, -0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e, -0x0c,0x12,0x27,0xde,0x90,0x97,0x09,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27, -0xde,0x90,0x97,0x0d,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97, -0x11,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x15,0x12,0x2a, -0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97, -0xa1,0x12,0x43,0x46,0xed,0x44,0xc0,0xfd,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90, -0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, -0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08, -0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e, -0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c, -0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f, -0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4, -0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25, -0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b, -0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04, -0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, -0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, -0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, -0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85, -0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, -0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90, -0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9, -0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f, -0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12, -0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e, -0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f, -0x90,0x97,0xa1,0x12,0x43,0x46,0xe4,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90, -0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f, -0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, -0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f, -0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a, -0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xa1,0x12, -0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04, -0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xa1,0x12, -0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xe4,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a, -0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xa1,0x12, -0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c, -0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xa1,0x12, -0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc, -0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xed,0x44,0x10,0xfd, -0xec,0x44,0x01,0xfc,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e, -0x08,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46, -0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43, -0x46,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12, -0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4, -0x90,0x97,0x2d,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xaa,0xed, -0xf0,0x90,0x97,0xa9,0xef,0xf0,0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0, -0x12,0x4f,0x62,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, -0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x12,0x4f,0x62,0x90,0x97,0xaa, -0xe0,0x60,0x16,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, -0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x68,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01, -0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d, -0x90,0x97,0xa9,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x12,0x4f,0x5a,0x90,0x97,0xa9,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f, -0xf0,0x12,0x4f,0x62,0x90,0x97,0xaa,0xe0,0x60,0x1b,0x90,0x97,0xa9,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00, -0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, -0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0, -0x12,0x4f,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x0e,0x38,}; -#endif - -// =================== UMC A Cut V75 2011-06-15 ===================== -u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength] = { -0xc1,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x13,0x09,0x54,0x3a,0x01,0x00, -0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, -0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, -0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, -0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, -0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, -0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, -0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, -0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, -0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, -0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, -0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, -0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, -0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, -0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, -0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, -0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, -0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, -0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, -0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, -0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, -0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, -0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, -0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, -0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, -0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, -0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, -0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, -0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, -0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, -0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, -0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, -0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, -0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, -0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, -0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, -0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, -0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, -0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, -0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, -0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, -0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, -0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, -0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, -0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, -0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, -0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, -0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, -0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, -0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, -0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, -0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, -0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, -0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, -0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, -0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, -0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, -0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, -0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, -0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, -0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, -0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, -0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, -0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, -0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x30,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, -0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, -0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, -0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, -0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, -0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, -0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, -0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, -0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, -0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, -0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x24,0x62,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, -0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, -0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, -0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, -0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, -0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, -0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, -0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, -0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, -0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, -0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, -0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, -0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, -0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, -0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, -0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, -0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, -0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, -0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, -0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, -0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, -0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, -0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, -0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, -0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, -0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, -0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, -0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, -0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, -0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, -0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, -0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, -0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, -0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, -0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, -0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, -0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, -0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, -0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, -0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, -0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, -0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, -0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, -0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, -0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, -0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, -0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, -0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, -0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, -0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, -0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, -0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0xab,0x22,0x7d,0x02,0x7f,0x03,0x12,0x31,0x2c, -0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, -0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, -0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, -0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, -0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, -0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, -0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, -0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, -0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, -0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, -0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, -0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, -0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, -0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, -0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, -0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, -0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, -0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x31,0x9d, -0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xcf,0x90,0x97,0x93,0xe0,0x54, -0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, -0x12,0x31,0x2c,0x7d,0x02,0x7f,0x03,0x12,0x31,0x2c,0x90,0x01,0x57,0xe4,0xf0,0x90, -0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, -0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, -0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x31,0x9d,0x7d,0x02,0x7f,0x03,0x12,0x31, -0x9d,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, -0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, -0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, -0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, -0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x24,0x62,0xf5, -0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, -0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, -0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, -0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, -0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, -0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, -0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, -0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, -0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, -0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, -0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, -0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, -0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, -0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, -0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, -0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, -0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, -0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, -0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, -0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, -0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, -0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, -0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, -0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, -0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, -0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, -0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, -0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, -0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, -0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, -0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, -0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, -0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, -0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, -0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, -0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, -0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, -0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, -0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, -0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, -0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, -0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, -0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, -0x12,0x30,0x62,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, -0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, -0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, -0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, -0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, -0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, -0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, -0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, -0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, -0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, -0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, -0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, -0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, -0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, -0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, -0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, -0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, -0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, -0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, -0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, -0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, -0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, -0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, -0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, -0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, -0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, -0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, -0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, -0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, -0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, -0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, -0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, -0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, -0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, -0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, -0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, -0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, -0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, -0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, -0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, -0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, -0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, -0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, -0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, -0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, -0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, -0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, -0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, -0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, -0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, -0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, -0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0xa2, -0x12,0x5f,0xb4,0x12,0x2e,0x01,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, -0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, -0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, -0x12,0x77,0xdc,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, -0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, -0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, -0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, -0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, -0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, -0x12,0x78,0x3a,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, -0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, -0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, -0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, -0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, -0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, -0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, -0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, -0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, -0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, -0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, -0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, -0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, -0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, -0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, -0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, -0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, -0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, -0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, -0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, -0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, -0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, -0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, -0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, -0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, -0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, -0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, -0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,0x90, -0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, -0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, -0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, -0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, -0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80, -0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, -0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, -0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, -0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, -0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, -0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, -0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, -0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, -0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, -0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, -0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, -0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, -0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, -0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, -0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, -0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, -0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, -0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, -0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, -0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, -0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, -0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, -0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, -0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, -0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, -0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, -0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, -0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x79,0x12,0x90,0x97,0x5a,0x12,0x43,0x6b, -0x02,0x77,0xa9,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x22,0x90,0x01,0xc6,0xe0, -0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, -0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, -0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, -0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, -0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, -0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, -0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, -0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, -0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, -0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, -0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, -0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, -0x82,0x8c,0x83,0xef,0xf0,0x12,0x24,0x62,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, -0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, -0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, -0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, -0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, -0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, -0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, -0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, -0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, -0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, -0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, -0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, -0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, -0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, -0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, -0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, -0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, -0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, -0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, -0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, -0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, -0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, -0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, -0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, -0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, -0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, -0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, -0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, -0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, -0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, -0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, -0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, -0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x24, -0x62,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, -0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,0xff, -0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, -0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, -0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, -0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, -0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, -0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, -0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, -0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, -0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, -0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, -0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, -0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, -0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, -0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, -0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, -0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, -0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, -0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, -0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, -0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, -0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, -0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, -0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, -0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, -0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, -0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, -0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, -0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, -0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, -0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, -0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, -0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, -0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, -0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, -0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, -0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, -0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, -0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, -0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, -0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, -0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, -0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, -0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, -0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, -0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, -0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, -0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, -0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, -0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, -0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, -0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, -0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, -0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, -0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, -0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, -0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, -0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, -0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, -0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, -0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, -0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, -0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, -0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, -0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, -0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, -0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, -0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, -0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, -0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, -0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, -0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, -0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, -0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, -0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, -0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, -0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, -0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, -0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, -0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, -0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, -0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, -0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, -0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, -0x60,0x05,0x7f,0x01,0x12,0x76,0xfa,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, -0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, -0xfa,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, -0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, -0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, -0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, -0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, -0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, -0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, -0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, -0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, -0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, -0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, -0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, -0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, -0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, -0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, -0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, -0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, -0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, -0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, -0x14,0x7e,0x00,0x12,0x32,0x15,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, -0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, -0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, -0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, -0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, -0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, -0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, -0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, -0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, -0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, -0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, -0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, -0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, -0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, -0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, -0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, -0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, -0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, -0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, -0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, -0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, -0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, -0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, -0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, -0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, -0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, -0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, -0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, -0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, -0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, -0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, -0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, -0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, -0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, -0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, -0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, -0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, -0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x24,0x62,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, -0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b, -0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, -0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, -0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, -0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, -0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24, -0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, -0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, -0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5, -0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, -0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, -0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, -0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, -0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x24,0x7b,0xd3,0xe5,0x1b,0x9f,0xe5, -0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, -0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, -0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, -0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, -0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, -0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, -0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, -0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, -0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, -0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, -0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, -0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, -0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, -0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, -0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, -0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, -0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, -0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, -0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, -0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, -0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, -0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, -0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, -0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, -0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, -0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, -0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, -0xfc,0xa3,0xe0,0xfd,0x12,0x24,0x7b,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, -0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, -0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, -0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, -0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, -0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, -0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, -0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, -0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, -0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, -0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, -0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, -0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, -0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, -0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, -0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, -0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, -0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, -0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, -0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, -0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, -0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, -0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, -0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, -0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, -0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, -0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, -0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, -0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, -0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, -0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, -0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, -0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, -0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, -0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, -0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, -0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, -0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, -0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, -0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, -0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, -0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, -0x60,0x02,0x01,0x26,0x22,0x12,0x24,0x62,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, -0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, -0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, -0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, -0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, -0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, -0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, -0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, -0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, -0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, -0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, -0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x24,0x62,0xff,0xc4,0x54,0x0f,0xf5,0x66, -0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, -0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, -0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, -0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, -0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, -0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, -0x81,0x7f,0x0a,0x7e,0x00,0x12,0x32,0x15,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, -0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, -0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x24,0x62,0x65, -0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x24,0x62,0xf5,0x26, -0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x24,0x62,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, -0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, -0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, -0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, -0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, -0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, -0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x24,0x62,0xff,0x60,0x2c, -0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, -0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, -0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, -0x43,0x6b,0x12,0x24,0x62,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, -0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, -0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, -0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, -0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, -0x01,0x02,0x30,0x62,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, -0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, -0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, -0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, -0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, -0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, -0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, -0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, -0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, -0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, -0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, -0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, -0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, -0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, -0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, -0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, -0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, -0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, -0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, -0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, -0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, -0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, -0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, -0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, -0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, -0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, -0x00,0x12,0x32,0x15,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, -0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f,0xe5,0x90,0x97,0x1d,0x12,0x43,0x53, -0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97,0x21, -0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08, -0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08, -0x12,0x2b,0x08,0x90,0x97,0x29,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, -0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x03,0x2d,0x95, -0xe4,0xfd,0xff,0x12,0x30,0x2c,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68, -0x12,0x25,0x14,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x22,0x7f, -0x78,0x7e,0x08,0x12,0x22,0x65,0x90,0x97,0x1d,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c, -0x12,0x22,0x65,0x90,0x97,0x21,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x22,0x65, -0x90,0x97,0x25,0x12,0x25,0x08,0x90,0x97,0x86,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d, -0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53, -0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12, -0x2b,0x08,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x96, -0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x97,0x25,0x12,0x43,0x53, -0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12, -0x2b,0x08,0x7f,0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x97,0x29,0x12,0x25,0x08,0x90, -0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08, -0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x30,0x2c, -0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00, -0x00,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02, -0x4f,0xe5,0x90,0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71, -0x63,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x75,0x2e,0x90,0x97,0x19,0x12,0x43,0x53, -0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x96,0xc5, -0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08, -0x90,0x96,0xc9,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08, -0x12,0x2b,0x08,0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, -0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x96,0x12, -0x25,0x08,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd5,0x12,0x43,0x53,0x90, -0x80,0x96,0x12,0x25,0x08,0x7f,0x74,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd9,0x12, -0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12,0x2b,0x08,0x90, -0x96,0xdd,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12, -0x2b,0x08,0x90,0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80, -0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25, -0x08,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80, -0x96,0x12,0x25,0x08,0x7f,0x88,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xed,0x12,0x43, -0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96, -0xf1,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x2b, -0x08,0x90,0x96,0xf5,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd4,0x7e, -0x0e,0x12,0x2b,0x08,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, -0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x96, -0x12,0x25,0x08,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x97,0x01,0x12,0x43,0x53, -0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x97,0x05, -0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08, -0x90,0x97,0x09,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c, -0x12,0x2b,0x08,0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, -0x04,0x7e,0x0d,0x12,0x2b,0x08,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x96,0x12, -0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x90,0x97,0x15,0x12,0x43,0x53,0x90, -0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97,0x2d,0x74, -0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x2e,0x7f,0x8c,0x7e, -0x08,0x12,0x22,0x65,0x90,0x97,0x19,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x22, -0x65,0x90,0x96,0xc5,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08,0x12,0x22,0x65,0x90,0x96, -0xc9,0x12,0x25,0x08,0x7f,0x6c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xcd,0x12,0x25, -0x08,0x7f,0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xd1,0x12,0x25,0x08,0x7f,0x74, -0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xd5,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12, -0x22,0x65,0x90,0x96,0xd9,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12,0x22,0x65,0x90, -0x96,0xdd,0x12,0x25,0x08,0x7f,0x80,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe1,0x12, -0x25,0x08,0x7f,0x84,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe5,0x12,0x25,0x08,0x7f, -0x88,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe9,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e, -0x12,0x22,0x65,0x90,0x96,0xed,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x22,0x65, -0x90,0x96,0xf1,0x12,0x25,0x08,0x7f,0xd4,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xf5, -0x12,0x25,0x08,0x7f,0xd8,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xf9,0x12,0x25,0x08, -0x7f,0xdc,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xfd,0x12,0x25,0x08,0x7f,0xe0,0x7e, -0x0e,0x12,0x22,0x65,0x90,0x97,0x01,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x22, -0x65,0x90,0x97,0x05,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,0x90,0x97, -0x09,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x22,0x65,0x90,0x97,0x0d,0x12,0x25, -0x08,0x7f,0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0x11,0x12,0x25,0x08,0x7f,0x04, -0x7e,0x08,0x12,0x22,0x65,0x90,0x97,0x15,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12, -0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44, -0xc0,0xfd,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, -0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12, -0x25,0x14,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96, -0x12,0x25,0x14,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80, -0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90, -0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08, -0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2b, -0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12, -0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e, -0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e, -0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x63,0xdb,0x25,0xa4,0x7f,0x84, -0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f, -0x88,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4, -0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25, -0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb, -0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20, -0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14, -0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25, -0x14,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12, -0x25,0x14,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08,0x7f,0x04,0x7e, -0x0c,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, -0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef, -0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, -0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x7f,0x04,0x7e, -0x0d,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, -0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43, -0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, -0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x08,0x7f, -0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, -0x43,0x53,0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43, -0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, -0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f, -0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, -0x43,0x53,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x25,0x08, -0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97, -0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, -0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f,0x04,0x7e,0x08,0x12,0x22,0x65,0x90,0x97, -0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90, -0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec, -0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x96,0x12, -0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x2b,0x08,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3, -0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0, -0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, -0x46,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, -0x45,0x80,0x68,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, -0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8, -0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54, -0xf0,0x12,0x4f,0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, -0xbc,0xe0,0x60,0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90, -0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4, -0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92, -0xaf,0x22,0x8b,0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97, -0x3b,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08, -0x12,0x22,0x65,0x90,0x97,0x34,0x12,0x25,0x08,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, -0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x24,0xf5,0xa8, -0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03, -0xfc,0x12,0x43,0x46,0x90,0x97,0x3e,0x12,0x25,0x08,0x90,0x05,0x22,0xe4,0xf0,0x80, -0x2d,0xe4,0x90,0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x22,0x65,0xec,0x54,0x03, -0xfc,0xec,0x44,0xc0,0xfc,0x90,0x97,0x34,0x12,0x25,0x08,0x90,0x97,0x34,0x12,0x43, -0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97, -0x3b,0xe0,0x30,0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, -0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e, -0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, -0x54,0xf3,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f, -0x46,0x12,0x47,0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60, -0x6a,0x24,0x02,0x60,0x02,0xe1,0xa8,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48, -0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd, -0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75, -0xe4,0x90,0x97,0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25, -0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f, -0x45,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52, -0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01, -0xf0,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e, -0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52, -0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0, -0x44,0x10,0xfd,0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90, -0x97,0x3c,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12, -0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40, -0x7f,0x01,0x12,0x31,0x66,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45, -0x12,0x47,0x52,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97, -0x42,0xf0,0x90,0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97, -0x44,0xf0,0x90,0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97, -0x4c,0xf0,0x90,0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00, -0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01, -0x60,0x08,0x90,0x97,0x3a,0xe0,0x60,0x02,0x21,0x11,0x90,0x97,0x2e,0xe0,0xc3,0x94, -0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50, -0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a, -0xe0,0x04,0xf0,0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94, -0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90, -0x97,0x2e,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, -0x97,0x42,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43, -0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0, -0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42, -0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50, -0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, -0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, -0xf0,0xe4,0x90,0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, -0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12, -0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x24,0x62,0x25,0xe0,0x25, -0xe0,0x90,0x97,0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61, -0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63, -0xe0,0x90,0x97,0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90, -0x97,0x39,0xe0,0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90, -0x97,0x3a,0xe0,0x70,0x02,0x41,0x1c,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x1c,0x90, -0x97,0x3d,0xe0,0x70,0x02,0x41,0x1c,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2, -0xaf,0x90,0x97,0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12, -0x47,0x49,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, -0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, -0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90, -0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64, -0x80,0xf0,0x90,0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05, -0x85,0xf0,0x90,0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05, -0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0, -0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x31,0xb7,0x80,0x2d,0x90,0x97,0x3a,0xe0, -0x70,0x2f,0x90,0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f, -0x46,0x12,0x47,0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0, -0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x31,0x49,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92, -0xaf,0x22,0x46,0x58,}; - -// =================== UMC B Cut V75 2011-06-15 ===================== -u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] = { -0xc2,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x13,0x11,0x42,0x3a,0x01,0x00, -0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, -0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, -0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, -0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, -0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, -0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, -0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, -0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, -0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, -0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, -0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, -0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, -0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, -0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, -0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, -0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, -0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, -0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, -0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, -0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, -0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, -0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, -0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, -0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, -0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, -0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, -0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, -0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, -0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, -0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, -0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, -0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, -0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, -0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, -0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, -0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, -0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, -0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, -0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, -0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, -0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, -0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, -0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, -0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, -0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, -0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, -0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, -0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, -0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, -0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, -0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, -0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, -0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, -0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, -0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, -0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, -0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, -0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, -0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, -0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, -0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, -0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, -0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, -0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, -0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, -0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, -0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, -0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, -0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, -0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, -0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, -0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, -0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, -0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, -0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, -0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, -0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, -0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, -0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, -0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, -0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, -0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, -0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, -0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, -0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, -0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, -0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, -0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, -0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, -0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, -0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, -0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, -0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, -0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, -0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, -0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, -0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, -0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, -0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, -0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, -0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, -0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, -0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, -0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, -0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, -0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, -0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, -0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, -0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, -0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, -0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, -0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, -0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, -0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, -0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, -0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, -0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, -0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, -0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, -0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, -0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, -0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, -0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, -0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, -0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, -0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, -0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, -0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, -0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0x98,0x22,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75, -0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, -0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, -0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, -0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, -0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, -0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, -0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, -0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, -0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, -0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, -0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, -0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, -0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, -0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, -0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, -0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, -0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, -0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6, -0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xc5,0x90,0x97,0x93,0xe0,0x54, -0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, -0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90, -0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, -0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, -0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36, -0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, -0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, -0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, -0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, -0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x29,0xd9,0xf5, -0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, -0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, -0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, -0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, -0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, -0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, -0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, -0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, -0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, -0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, -0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, -0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, -0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, -0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, -0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, -0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, -0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, -0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, -0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, -0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, -0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, -0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, -0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, -0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, -0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, -0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, -0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, -0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, -0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, -0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, -0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, -0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, -0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, -0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, -0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, -0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, -0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, -0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, -0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, -0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, -0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, -0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, -0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, -0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, -0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, -0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, -0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, -0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, -0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, -0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, -0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, -0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, -0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, -0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, -0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, -0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, -0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, -0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, -0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, -0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, -0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, -0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, -0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, -0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, -0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, -0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, -0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, -0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, -0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, -0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, -0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, -0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, -0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, -0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, -0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, -0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, -0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, -0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, -0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, -0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, -0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, -0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, -0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, -0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, -0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, -0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, -0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, -0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, -0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, -0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, -0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, -0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, -0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, -0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, -0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, -0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0x8f, -0x12,0x5f,0xb4,0x12,0x32,0x3d,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, -0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, -0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, -0x12,0x77,0xc9,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, -0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, -0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, -0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, -0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, -0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, -0x12,0x78,0x27,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, -0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, -0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, -0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, -0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, -0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, -0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, -0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, -0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, -0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, -0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, -0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, -0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, -0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, -0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, -0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, -0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, -0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, -0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, -0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, -0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, -0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, -0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, -0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, -0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, -0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, -0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90, -0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, -0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, -0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, -0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, -0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80, -0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, -0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, -0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, -0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, -0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, -0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, -0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, -0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, -0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, -0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, -0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, -0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, -0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, -0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, -0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, -0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, -0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, -0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, -0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, -0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, -0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, -0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, -0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, -0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, -0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, -0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, -0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, -0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x78,0xff,0x90,0x97,0x5a,0x12,0x43,0x6b, -0x02,0x77,0x96,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x0f,0x90,0x01,0xc6,0xe0, -0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, -0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, -0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, -0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, -0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, -0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, -0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, -0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, -0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, -0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, -0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, -0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, -0x82,0x8c,0x83,0xef,0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, -0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, -0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, -0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, -0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, -0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, -0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, -0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, -0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, -0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, -0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, -0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, -0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, -0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, -0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, -0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, -0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, -0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, -0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, -0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, -0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, -0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, -0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, -0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, -0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, -0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, -0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, -0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, -0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, -0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, -0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, -0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, -0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x29, -0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, -0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, -0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, -0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, -0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, -0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, -0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, -0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, -0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, -0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, -0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, -0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, -0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, -0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, -0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, -0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, -0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, -0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, -0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, -0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, -0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, -0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, -0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, -0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, -0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, -0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, -0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, -0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, -0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, -0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, -0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, -0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, -0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, -0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, -0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, -0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, -0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, -0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, -0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, -0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, -0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, -0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, -0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, -0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, -0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, -0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, -0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, -0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, -0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, -0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, -0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, -0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, -0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, -0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, -0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, -0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, -0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, -0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, -0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, -0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, -0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, -0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, -0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, -0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, -0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, -0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, -0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, -0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, -0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, -0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, -0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, -0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, -0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, -0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, -0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, -0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, -0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, -0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, -0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, -0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, -0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, -0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, -0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, -0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, -0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, -0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, -0x60,0x05,0x7f,0x01,0x12,0x76,0xe7,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, -0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, -0xe7,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, -0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, -0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, -0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, -0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, -0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, -0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, -0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, -0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, -0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, -0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, -0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, -0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, -0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, -0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, -0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, -0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, -0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, -0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, -0x14,0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, -0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, -0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, -0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, -0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, -0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, -0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, -0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, -0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, -0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, -0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, -0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, -0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, -0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, -0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, -0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, -0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, -0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, -0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, -0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, -0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, -0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, -0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, -0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, -0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, -0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, -0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, -0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, -0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, -0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, -0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, -0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, -0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, -0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, -0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, -0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, -0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, -0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, -0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, -0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, -0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, -0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, -0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b, -0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, -0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, -0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, -0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, -0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29, -0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, -0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, -0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5, -0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, -0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, -0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, -0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, -0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1b,0x9f,0xe5, -0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, -0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, -0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, -0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, -0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, -0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, -0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, -0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, -0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, -0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, -0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, -0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, -0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, -0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, -0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, -0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, -0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, -0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, -0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, -0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, -0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, -0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, -0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, -0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, -0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, -0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, -0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, -0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, -0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, -0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, -0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, -0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, -0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, -0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, -0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, -0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, -0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, -0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, -0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, -0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, -0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, -0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, -0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, -0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, -0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, -0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, -0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, -0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, -0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, -0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, -0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, -0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, -0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, -0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, -0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, -0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, -0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, -0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, -0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, -0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, -0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, -0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, -0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, -0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, -0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, -0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, -0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, -0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, -0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, -0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, -0x60,0x02,0x01,0x26,0x22,0x12,0x29,0xd9,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, -0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, -0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, -0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, -0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, -0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, -0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, -0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, -0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, -0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, -0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, -0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66, -0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, -0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, -0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, -0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, -0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, -0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, -0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, -0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, -0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x29,0xd9,0x65, -0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x29,0xd9,0xf5,0x26, -0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, -0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, -0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, -0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, -0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, -0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, -0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, -0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60,0x2c, -0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, -0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, -0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, -0x43,0x6b,0x12,0x29,0xd9,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, -0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, -0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, -0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, -0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, -0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, -0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, -0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, -0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, -0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, -0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, -0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, -0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, -0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, -0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, -0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, -0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, -0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, -0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, -0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, -0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, -0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, -0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, -0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, -0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, -0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, -0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, -0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, -0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, -0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, -0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, -0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, -0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, -0x00,0x12,0x37,0x54,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, -0x90,0x97,0x1d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08, -0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x53,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12, -0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0, -0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f, -0x01,0x12,0x34,0x81,0x22,0x7f,0x78,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12, -0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f, -0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x25,0x12,0x2a,0x7f,0x90,0x97,0x86,0xe0, -0x90,0x97,0x1d,0xb4,0x01,0x0d,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7, -0xfd,0x80,0x07,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54, -0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, -0x90,0x97,0x25,0x12,0x43,0x53,0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90, -0x97,0x29,0x12,0x2a,0x7f,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f, -0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00, -0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59, -0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x90, -0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71,0x50,0x90,0x97, -0x2d,0xe0,0x60,0x03,0x02,0x75,0x1b,0x90,0x97,0x19,0x12,0x43,0x53,0x90,0x80,0x85, -0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc5,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc9, -0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9, -0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e, -0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd5,0x12,0x43,0x53,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd9,0x12,0x43,0x53,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xdd,0x12, -0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90, -0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12, -0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84, -0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, -0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xed,0x12,0x43,0x53,0x90,0x80, -0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf1,0x12,0x43, -0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, -0xf5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f, -0xd9,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e, -0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, -0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x01,0x12,0x43,0x53,0x90,0x80,0x85, -0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x05,0x12,0x43,0x53, -0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x09, -0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, -0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d, -0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97,0x15,0x12,0x43,0x53,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x2d,0x74,0x01,0xf0,0x22, -0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x1b,0x7f,0x8c,0x7e,0x08,0x12,0x27, -0xde,0x90,0x97,0x19,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x96, -0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x96,0xc9,0x12,0x2a, -0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xcd,0x12,0x2a,0x7f,0x7f,0x70, -0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd1,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12, -0x27,0xde,0x90,0x96,0xd5,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90, -0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xdd,0x12, -0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe1,0x12,0x2a,0x7f,0x7f, -0x84,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe5,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e, -0x12,0x27,0xde,0x90,0x96,0xe9,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde, -0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf1, -0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf5,0x12,0x2a,0x7f, -0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf9,0x12,0x2a,0x7f,0x7f,0xdc,0x7e, -0x0e,0x12,0x27,0xde,0x90,0x96,0xfd,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27, -0xde,0x90,0x97,0x01,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97, -0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0x09,0x12,0x2a, -0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0x0d,0x12,0x2a,0x7f,0x7f,0x0c, -0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0x11,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12, -0x27,0xde,0x90,0x97,0x15,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90, -0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0xc0,0xfd,0xec, -0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12, -0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00, -0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, -0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, -0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, -0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85, -0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, -0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90, -0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9, -0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f, -0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12, -0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e, -0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e, -0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0, -0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f, -0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4, -0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25, -0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b, -0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24, -0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27, -0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xe4,0xff,0xec, -0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x11,0xff, -0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85, -0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27, -0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0, -0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44, -0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09, -0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xe4, -0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44, -0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, -0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09, -0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed, -0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3, -0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97,0xb3,0x12,0x2a, -0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e, -0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a, -0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12, -0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3, -0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, -0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3,0x10,0xaf,0x01, -0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0,0xd3,0x94,0x07, -0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4, -0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f, -0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb,0xe0,0xff,0x74, -0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x68, -0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, -0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8,0xf0,0xe0,0xff, -0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x12,0x4f, -0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60, -0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xbb,0xe0, -0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4, -0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x8b, -0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3b,0xf0,0xe0, -0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde, -0x90,0x97,0x34,0x12,0x2a,0x7f,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x01,0x12, -0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8,0x04,0xa9,0x05, -0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03,0xfc,0x12,0x43, -0x46,0x90,0x97,0x3e,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90, -0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03,0xfc,0xec,0x44, -0xc0,0xfc,0x90,0x97,0x34,0x12,0x2a,0x7f,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80, -0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x3b,0xe0,0x30, -0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd, -0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e,0x90,0x00,0x47, -0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0,0x54,0xf3,0xfd, -0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f,0x46,0x12,0x47, -0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60,0x6a,0x24,0x02, -0x60,0x02,0xe1,0x95,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0,0x44,0x0c, -0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,0x47,0x12, -0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75,0xe4,0x90,0x97, -0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80, -0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x12,0x47, -0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46, -0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01,0xf0,0x90,0x97, -0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f, -0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x45, -0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd, -0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3c,0xf0, -0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12,0xc2,0xaf,0x90, -0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40,0x7f,0x01,0x12, -0x36,0xaf,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45,0x12,0x47,0x52, -0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97,0x42,0xf0,0x90, -0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97,0x44,0xf0,0x90, -0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90, -0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97,0x4c,0xf0,0x90, -0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00,0x51,0xe0,0x44, -0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01,0x60,0x08,0x90, -0x97,0x3a,0xe0,0x60,0x02,0x01,0xfe,0x90,0x97,0x2e,0xe0,0xc3,0x94,0xff,0x50,0x05, -0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04, -0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a,0xe0,0x04,0xf0, -0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94,0xff,0x50,0x10, -0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90,0x97,0x2e,0xf0, -0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90,0x97,0x42,0xe0, -0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43,0xe0,0xc3,0x94, -0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0,0xc3,0x94,0xff, -0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42,0xf0,0x90,0x00, -0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04, -0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4, -0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90, -0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01,0xf0,0x22,0x90, -0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x25, -0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25,0xe0,0x90,0x97, -0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97, -0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97, -0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x97,0x39,0xe0, -0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90,0x97,0x3a,0xe0, -0x70,0x02,0x41,0x09,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x09,0x90,0x97,0x3d,0xe0, -0x70,0x02,0x41,0x09,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x97, -0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12,0x47,0x49,0x90, -0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60, -0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e, -0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0, -0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90, -0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90, -0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0xa2, -0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0, -0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2d,0x90,0x97,0x3a,0xe0,0x70,0x2f,0x90, -0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x12,0x47, -0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x7d, -0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x22,0x00, -0xb5,0xf6,}; - - -// ===================8723========================================= -u8 Rtl8192CUFwUMC8723ImgArray[UMC8723ImgArrayLength] = { -0xc1,0x88,0x02,0x00,0x39,0x00,0x01,0x00,0x09,0x09,0x16,0x47,0x80,0x3f,0x00,0x00, -0x29,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x74,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x59,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x02,0x73,0xab,0x00,0x00,0x00,0x00,0x00,0x02,0x67,0xfe,0x00,0x00, -0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, -0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, -0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, -0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, -0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, -0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, -0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, -0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, -0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x05,0x05,0x05,0x05,0x05,0x05, -0x05,0x07,0x07,0x07,0x08,0x0a,0x05,0x05,0x05,0x07,0x07,0x0a,0x0d,0x0e,0x05,0x05, -0x07,0x07,0x08,0x0c,0x14,0x14,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x0c,0x0e, -0x13,0x13,0x09,0x09,0x0a,0x0b,0x0d,0x11,0x13,0x13,0x09,0x09,0x09,0x09,0x0c,0x14, -0x15,0x15,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x05, -0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05, -0x05,0x05,0x09,0x09,0x09,0x09,0x0b,0x0d,0x10,0x12,0x05,0x09,0x0a,0x0c,0x0d,0x0e, -0x10,0x12,0x09,0x09,0x0e,0x0e,0x10,0x10,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, -0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, -0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, -0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, -0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, -0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, -0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, -0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, -0x02,0x58,0x03,0x20,0x03,0xe8,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06, -0x07,0x08,0x01,0x02,0x03,0x04,0x08,0x0f,0x23,0x3c,0x05,0x06,0x07,0x0f,0x19,0x32, -0x4b,0x64,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, -0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x22,0x1f, -0x1e,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x8f,0x17,0x74,0x42,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x20,0xf0,0x74,0x84,0x25,0x17, -0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0x90,0x97,0x54,0xf0,0xe0,0xfb, -0x54,0x1f,0xff,0xa3,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4, -0x34,0x93,0xf5,0x83,0xe0,0xfe,0x90,0x97,0x57,0xf0,0xe5,0x17,0x25,0xe0,0x24,0x81, -0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x58,0xcd,0xf0, -0xa3,0xed,0xf0,0xe5,0x17,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x5a,0xcd,0xf0,0xa3,0xed,0xf0,0xef,0xc3,0x9e,0x40, -0x03,0x02,0x43,0x56,0x90,0x01,0xc5,0x74,0x20,0xf0,0x90,0x97,0x55,0xe0,0xff,0x74, -0xa5,0x25,0x17,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0xef,0x04,0x90,0x97, -0x56,0xf0,0x90,0x97,0x57,0xe0,0xff,0x90,0x97,0x56,0xe0,0xfe,0xd3,0x9f,0x40,0x03, -0x02,0x43,0xa0,0xee,0xc3,0x94,0x10,0x40,0x21,0xee,0x24,0xf0,0xff,0x74,0x01,0x7e, -0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97, -0x58,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x56,0xe0,0xff,0xc3, -0x94,0x10,0x50,0x59,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce, -0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x5a,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, -0x3c,0x90,0x97,0x56,0xe0,0xb4,0x11,0x0d,0x90,0x97,0x59,0xe0,0x30,0xe7,0x06,0x90, -0x97,0x56,0x74,0x17,0xf0,0x90,0x97,0x56,0xe0,0xff,0x64,0x13,0x60,0x04,0xef,0xb4, -0x12,0x0d,0x90,0x97,0x58,0xe0,0x30,0xe0,0x06,0x90,0x97,0x56,0x74,0x18,0xf0,0x90, -0x97,0x56,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x54,0xf0,0x80,0x53,0x90,0x97,0x56, -0xe0,0x04,0xf0,0x02,0x42,0xb2,0x90,0x97,0x57,0xe0,0xf9,0x90,0x97,0x55,0xe0,0xff, -0x69,0x60,0x03,0x02,0x43,0xe8,0x90,0x01,0xc5,0x74,0x40,0xf0,0x74,0xa5,0x25,0x17, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24, -0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xb4,0x01,0x14,0xeb,0x30,0xe6,0x06, -0x90,0x97,0x54,0xe0,0xff,0x22,0x90,0x97,0x55,0xe0,0x44,0x40,0x90,0x97,0x54,0xf0, -0x90,0x97,0x55,0xe0,0xff,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, -0x41,0xf5,0x83,0x74,0x01,0x93,0x2d,0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13, -0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0x12,0x1d,0xa9,0x80,0x71,0x90,0x97,0x55,0xe0,0xd3,0x99,0x40,0x69, -0x90,0x01,0xc5,0x74,0x60,0xf0,0x90,0x97,0x57,0xe0,0xff,0x74,0xa5,0x25,0x17,0xf5, -0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x90,0x97,0x55,0xef,0xf0,0x90,0x97,0x54, -0xf0,0xfb,0xa3,0xe0,0xff,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, -0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, -0x41,0xf5,0x83,0x74,0x01,0x93,0x2d,0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13, -0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0x12,0x1d,0xa9,0xaf,0x03,0x22,0x74,0x01,0x25,0x17,0xf5,0x82,0xe4, -0x34,0x92,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x54,0xe0,0x44,0x80,0xff,0x74,0x84,0x25, -0x17,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xef,0xf0,0x22,0xef,0x14,0x60,0x20,0x14, -0x60,0x4b,0x24,0x02,0x70,0x78,0x90,0x97,0x69,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0, -0x44,0x0c,0xf0,0x90,0x00,0x47,0xe0,0x44,0x08,0xf0,0x90,0x00,0x45,0x80,0x5b,0xe4, -0x90,0x97,0x69,0xf0,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, -0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90, -0x00,0x45,0xe0,0x44,0xef,0xf0,0xe0,0x54,0xef,0xf0,0xa3,0x80,0x2d,0x90,0x97,0x69, -0x74,0x01,0xf0,0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, -0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90,0x00, -0x45,0xe0,0x44,0x20,0xf0,0xe0,0x44,0x10,0xf0,0xa3,0xe0,0x44,0x10,0xf0,0x22,0xe4, -0xf5,0x61,0x22,0x02,0x7f,0x69,0x02,0x7f,0x70,0x74,0x45,0x90,0x01,0xc4,0xf0,0xa3, -0x74,0x09,0xf0,0xe4,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xff,0xc3,0x94,0x20, -0x40,0x03,0x02,0x4e,0x3a,0xef,0x75,0xf0,0x08,0xa4,0x24,0x6a,0xf5,0x82,0xe4,0x34, -0x93,0xf5,0x83,0xe0,0x64,0x01,0x60,0x03,0x02,0x4e,0x31,0x90,0x97,0x3a,0xe0,0x25, -0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0xd3,0x94, -0x00,0xec,0x94,0x00,0x50,0x03,0x02,0x4e,0x31,0xef,0x75,0xf0,0x0a,0xa4,0x24,0x00, -0xf9,0x74,0x90,0x35,0xf0,0xfa,0x7b,0x01,0x8b,0x13,0xf5,0x14,0x89,0x15,0x90,0x97, -0x3a,0xe0,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfd,0xa3, -0xe0,0x90,0x97,0x46,0xcd,0xf0,0xa3,0xed,0xf0,0xef,0x25,0xe0,0x24,0x63,0xf5,0x82, -0xe4,0x34,0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x48,0xcf,0xf0,0xa3,0xef, -0xf0,0x90,0x00,0x02,0x12,0x66,0x20,0xff,0xae,0xf0,0x12,0x65,0xf5,0x2f,0xff,0xe5, -0xf0,0x3e,0x90,0x97,0x4f,0xf0,0xa3,0xef,0xf0,0x90,0x00,0x06,0x12,0x66,0x20,0xff, -0xae,0xf0,0x90,0x00,0x04,0x12,0x66,0x20,0x2f,0xff,0xe5,0xf0,0x3e,0x90,0x97,0x4d, -0xf0,0xa3,0xef,0xf0,0x90,0x00,0x08,0x12,0x66,0x20,0xff,0x90,0x97,0x4b,0xe5,0xf0, -0xf0,0xa3,0xef,0xf0,0x90,0x97,0x3a,0xe0,0xfe,0x24,0x84,0xf5,0x82,0xe4,0x34,0x04, -0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x3c,0xf0,0xe0,0xfd,0x54,0x1f,0xa3,0xf0,0xee, -0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0x90,0x97, -0x51,0xf0,0x90,0x97,0x3a,0xe0,0xfb,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, -0xe0,0xc3,0x94,0x05,0x40,0x03,0x02,0x49,0xc2,0x90,0x97,0x51,0xe0,0xfe,0x90,0x97, -0x3d,0xe0,0x9e,0x40,0x13,0x90,0x97,0x51,0xe0,0x90,0x97,0x3d,0xf0,0xed,0x54,0x40, -0xfd,0x90,0x97,0x3c,0xf0,0xee,0x4d,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70,0x28, -0x90,0x97,0x3d,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x2b,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x32,0x90, -0x97,0x3d,0xe0,0x90,0x41,0x2e,0x80,0x29,0x90,0x97,0x3d,0xe0,0xff,0x90,0x41,0x4a, -0x93,0xfe,0x90,0x97,0x3a,0xe0,0x24,0x23,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, -0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80,0x07,0x90,0x97,0x3d,0xe0,0x90,0x40, -0xf6,0x93,0x90,0x97,0x4a,0xf0,0x90,0x97,0x4a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, -0xf9,0x74,0x40,0x35,0xf0,0x75,0x10,0xff,0xf5,0x11,0x89,0x12,0x90,0x97,0x3c,0xe0, -0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x49,0xe0,0x9f,0x90,0x97,0x48,0xe0,0x94, -0x00,0x40,0x0d,0x90,0x97,0x3a,0xe0,0xff,0xe4,0xfd,0x12,0x5f,0x6d,0x02,0x4d,0xc7, -0x90,0x97,0x3a,0xe0,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, -0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x97,0x3e,0x12, -0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb, -0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x1c, -0xd6,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0xf5,0xfd,0xac,0xf0, -0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f, -0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9, -0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00, -0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x01,0x12, -0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x66, -0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01, -0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97, -0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3, -0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12, -0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90, -0x00,0x04,0x12,0x66,0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03, -0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec, -0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9, -0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10, -0xaa,0x11,0xa9,0x12,0x90,0x00,0x03,0x12,0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa, -0x14,0xa9,0x15,0x90,0x00,0x06,0x12,0x66,0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4, -0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe, -0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0, -0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02, -0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x04,0x12,0x1c,0xef,0xff,0x7e, -0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x08,0x12,0x66,0x20,0xfd,0xac,0xf0, -0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f, -0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9, -0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x05,0x12,0x1c,0xef,0xff,0x7e,0x00,0x90, -0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0x90,0x97,0x3e, -0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66,0xa4,0x90, -0x97,0x3e,0x40,0x50,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xc0, -0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x05, -0x12,0x1c,0xef,0xff,0x7e,0x00,0x90,0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d, -0x1c,0xab,0x07,0xaa,0x06,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xc3,0xef,0x9b, -0xff,0xee,0x9a,0xfe,0xed,0x94,0x00,0xfd,0xec,0x94,0x00,0xfc,0x90,0x97,0x3e,0x12, -0x1d,0xa9,0x80,0x07,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0x90,0x97,0x3e,0xe0,0xfc, -0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x97,0x3a,0xe0,0x25,0xe0,0x25, -0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0x90,0x97,0x3c, -0xe0,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, -0x01,0x93,0xff,0xe4,0xfc,0xfd,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0, -0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66,0xa4,0x40,0x0b,0x90,0x97,0x3a,0xe0,0xff,0x12, -0x42,0x20,0x02,0x4d,0x3e,0x90,0x97,0x3c,0xe0,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, -0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe4,0xfc,0xfd,0x90,0x97, -0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0x12,0x66,0xa4, -0x40,0x03,0x02,0x4d,0x3e,0x90,0x97,0x3a,0xe0,0xff,0x7d,0x01,0x12,0x5f,0x6d,0x02, -0x4d,0x3e,0x90,0x97,0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, -0xe0,0x64,0x05,0x60,0x03,0x02,0x4b,0x8e,0x90,0x04,0xb3,0xe0,0x64,0x01,0x70,0x03, -0x02,0x4b,0x8e,0x90,0x93,0x62,0xe0,0xfe,0xb4,0x03,0x0b,0x90,0x97,0x3d,0xe0,0xc3, -0x94,0x19,0x40,0x3d,0x80,0x2e,0xee,0xb4,0x02,0x0b,0x90,0x97,0x3d,0xe0,0xc3,0x94, -0x11,0x40,0x2e,0x80,0x1f,0x90,0x93,0x62,0xe0,0xfe,0xb4,0x01,0x0b,0x90,0x97,0x3d, -0xe0,0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xee,0x70,0x11,0x90,0x97,0x3d,0xe0,0xc3, -0x94,0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43, -0xf0,0x74,0x23,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30, -0x50,0x03,0x02,0x4b,0x2d,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x03,0x02,0x4b,0x2d, -0x90,0x97,0x3a,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a, -0x60,0x56,0x90,0x97,0x3a,0xe0,0xfe,0xef,0x24,0x05,0xfd,0xe4,0x33,0xfc,0x74,0x21, -0x2e,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xff,0xd3,0x9d,0xec,0x64,0x80,0xf8, -0x74,0x80,0x98,0x50,0x33,0xef,0x24,0x05,0xfd,0xe4,0x33,0xfc,0x74,0x23,0x2e,0xf5, -0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9d,0xec,0x64,0x80,0xf8,0x74,0x80,0x98, -0x50,0x16,0x90,0x97,0x3a,0xe0,0x24,0x84,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0, -0xff,0x90,0x97,0x3d,0xe0,0x6f,0x60,0x56,0x90,0x97,0x3a,0xe0,0x24,0x23,0xf5,0x82, -0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x46,0x40,0x08,0x90,0x97,0x52,0x74, -0x05,0xf0,0x80,0x11,0xef,0xd3,0x94,0x3c,0x90,0x97,0x52,0x40,0x05,0x74,0x03,0xf0, -0x80,0x03,0x74,0x01,0xf0,0x90,0x97,0x3a,0xe0,0xff,0x24,0x23,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0xe0,0xfe,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee, -0xf0,0x90,0x97,0x3a,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x95,0x80,0x2f,0x90,0x97, -0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44, -0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x14,0xe4,0x90,0x97, -0x52,0xf0,0x90,0x97,0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4, -0xf0,0x90,0x97,0x3d,0xe0,0xff,0x90,0x97,0x3a,0xe0,0xfe,0x24,0x84,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xef,0xf0,0xee,0x30,0xe0,0x1e,0x90,0x97,0x52,0xe0,0xc4,0x54, -0xf0,0xf0,0x90,0x97,0x3a,0xe0,0xc3,0x13,0xff,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04, -0xf5,0x83,0xe0,0x54,0x0f,0x02,0x4d,0x21,0x90,0x97,0x3a,0xe0,0xc3,0x13,0xff,0x24, -0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0x02,0x4d,0x21,0x90,0x97, -0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x64,0x06,0x60,0x03, -0x02,0x4d,0x3e,0x90,0x04,0xb3,0xe0,0x64,0x01,0x70,0x03,0x02,0x4d,0x3e,0x90,0x97, -0x3e,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0x90,0x42,0x13,0xe4,0x93,0xff,0x7e,0x00, -0x90,0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0x90,0x97, -0x42,0x12,0x1d,0xa9,0xe4,0x90,0x97,0x3b,0xf0,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0, -0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab, -0x13,0xaa,0x14,0xa9,0x15,0x90,0x97,0x3b,0xe0,0xff,0x75,0xf0,0x02,0xa4,0xf5,0x82, -0x85,0xf0,0x83,0x12,0x66,0x20,0xfd,0xac,0xf0,0xef,0x90,0x42,0x0e,0x93,0xff,0x7e, -0x00,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb, -0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d, -0xa9,0x90,0x97,0x42,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, -0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66, -0xa4,0x50,0x0e,0x90,0x97,0x3b,0xe0,0x04,0xf0,0xe0,0x64,0x05,0x60,0x03,0x02,0x4b, -0xd9,0x90,0x97,0x3b,0xe0,0xc3,0x13,0xf0,0x90,0x97,0x52,0xe0,0xff,0xb4,0x01,0x0d, -0x90,0x97,0x3b,0xe0,0x70,0x5d,0x90,0x97,0x52,0x04,0xf0,0x80,0x5b,0xef,0xb4,0x03, -0x1d,0x90,0x97,0x3b,0xe0,0xff,0x70,0x08,0x90,0x97,0x52,0x74,0x03,0xf0,0x80,0x48, -0xef,0xb4,0x01,0x08,0x90,0x97,0x52,0x74,0x01,0xf0,0x80,0x3c,0x80,0x35,0x90,0x97, -0x52,0xe0,0x64,0x05,0x70,0x32,0x90,0x97,0x3b,0xe0,0xff,0x70,0x08,0x90,0x97,0x52, -0x74,0x05,0xf0,0x80,0x0f,0xef,0x90,0x97,0x52,0xb4,0x01,0x05,0x74,0x03,0xf0,0x80, -0x03,0x74,0x01,0xf0,0xd3,0x90,0x97,0x49,0xe0,0x94,0x03,0x90,0x97,0x48,0xe0,0x94, -0x00,0x40,0x05,0xe4,0x90,0x97,0x52,0xf0,0xd3,0x90,0x97,0x49,0xe0,0x94,0x03,0x90, -0x97,0x48,0xe0,0x94,0x00,0x40,0x05,0xe4,0x90,0x97,0x52,0xf0,0x90,0x97,0x3a,0xe0, -0xff,0x30,0xe0,0x1a,0x90,0x97,0x52,0xe0,0xc4,0x54,0xf0,0xf0,0xef,0xc3,0x13,0xff, -0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x13,0x90,0x97, -0x3a,0xe0,0xc3,0x13,0xff,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, -0xf0,0xf0,0x74,0xa4,0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xc0,0x83,0xc0,0x82, -0xe0,0xff,0x90,0x97,0x52,0xe0,0xfe,0xef,0x4e,0xd0,0x82,0xd0,0x83,0xf0,0x90,0x97, -0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05, -0x50,0x0f,0x74,0x64,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, -0x0f,0x90,0x97,0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0, -0x90,0x97,0x3a,0xe0,0xff,0x24,0x84,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, -0x1f,0xc3,0x94,0x09,0x50,0x05,0x90,0x92,0x00,0x80,0x11,0x74,0x84,0x2f,0xf5,0x82, -0xe4,0x34,0x04,0xf5,0x83,0xe0,0x90,0x92,0x00,0x20,0xe2,0x05,0x74,0x08,0xf0,0x80, -0x03,0x74,0x04,0xf0,0x90,0x97,0x3a,0xe0,0x60,0x0d,0x90,0x96,0xa4,0xe0,0xff,0x90, -0x92,0x00,0xe0,0xc3,0x9f,0x50,0x08,0x90,0x92,0x00,0xe0,0x90,0x96,0xa4,0xf0,0x90, -0x96,0xa4,0xe0,0x90,0x04,0x80,0xf0,0xab,0x13,0xaa,0x14,0xa9,0x15,0xe4,0xf5,0xf0, -0x12,0x66,0x58,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0xe4,0xf5,0xf0,0x12, -0x66,0x77,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x66,0x77,0x90,0x00,0x06,0xe4,0xf5, -0xf0,0x12,0x66,0x77,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x66,0x77,0x90,0x97,0x3a, -0xe0,0xff,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xef,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0xef,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0,0x02,0x45,0x18,0x22,0xef,0x70,0x03,0x02,0x50, -0xa3,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x54,0xe5,0x90,0x97,0x19,0xe0,0xfc,0xa3, -0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c, -0x7e,0x08,0x12,0x33,0xd8,0x90,0x96,0xc5,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, -0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x44,0x7e,0x08,0x12,0x33,0xd8, -0x90,0x96,0xc9,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, -0x56,0x12,0x1d,0xa9,0x7f,0x5c,0x7e,0x08,0x12,0x33,0xd8,0x90,0x96,0xcd,0xe0,0xfc, -0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f, -0x6c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xd1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, -0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x33, -0xd8,0x90,0x96,0xd5,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, -0x81,0x56,0x12,0x1d,0xa9,0x7f,0x74,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xd9,0xe0, -0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, -0x7f,0x78,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xdd,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, -0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x7c,0x7e,0x0e,0x12, -0x33,0xd8,0x90,0x96,0xe1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff, -0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xe5, -0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d, -0xa9,0x7f,0x84,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xe9,0xe0,0xfc,0xa3,0xe0,0xfd, -0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x88,0x7e,0x0e, -0x12,0x33,0xd8,0x90,0x96,0xed,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, -0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96, -0xf1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12, -0x1d,0xa9,0x7f,0xd0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xf5,0xe0,0xfc,0xa3,0xe0, -0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xd4,0x7e, -0x0e,0x12,0x33,0xd8,0x90,0x96,0xf9,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, -0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xd8,0x7e,0x0e,0x12,0x33,0xd8,0x90, -0x96,0xfd,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, -0x12,0x1d,0xa9,0x7f,0xdc,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x97,0x01,0xe0,0xfc,0xa3, -0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xe0, -0x7e,0x0e,0x12,0x33,0xd8,0x90,0x97,0x05,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, -0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xec,0x7e,0x0e,0x12,0x33,0xd8, -0x90,0x97,0x09,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, -0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x0d,0xe0,0xfc, -0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f, -0x04,0x7e,0x0d,0x12,0x33,0xd8,0x90,0x97,0x11,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, -0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33, -0xd8,0x90,0x97,0x15,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, -0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x2d,0x74, -0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x03,0x02,0x54,0xe5,0x7f,0x8c, -0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x19,0x12,0x1d,0xa9,0x7f,0x44,0x7e,0x08,0x12, -0x2b,0x13,0x90,0x96,0xc5,0x12,0x1d,0xa9,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x13,0x90, -0x96,0xc9,0x12,0x1d,0xa9,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xcd,0x12, -0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xd1,0x12,0x1d,0xa9,0x7f, -0x74,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xd5,0x12,0x1d,0xa9,0x7f,0x78,0x7e,0x0e, -0x12,0x2b,0x13,0x90,0x96,0xd9,0x12,0x1d,0xa9,0x7f,0x7c,0x7e,0x0e,0x12,0x2b,0x13, -0x90,0x96,0xdd,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe1, -0x12,0x1d,0xa9,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe5,0x12,0x1d,0xa9, -0x7f,0x88,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe9,0x12,0x1d,0xa9,0x7f,0x8c,0x7e, -0x0e,0x12,0x2b,0x13,0x90,0x96,0xed,0x12,0x1d,0xa9,0x7f,0xd0,0x7e,0x0e,0x12,0x2b, -0x13,0x90,0x96,0xf1,0x12,0x1d,0xa9,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96, -0xf5,0x12,0x1d,0xa9,0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xf9,0x12,0x1d, -0xa9,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xfd,0x12,0x1d,0xa9,0x7f,0xe0, -0x7e,0x0e,0x12,0x2b,0x13,0x90,0x97,0x01,0x12,0x1d,0xa9,0x7f,0xec,0x7e,0x0e,0x12, -0x2b,0x13,0x90,0x97,0x05,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x13,0x90, -0x97,0x09,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x13,0x90,0x97,0x0d,0x12, -0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x13,0x90,0x97,0x11,0x12,0x1d,0xa9,0x7f, -0x04,0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x15,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x08, -0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0, -0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xed,0x44,0xc0,0xfd,0xec,0x90,0x97,0xa3,0x12, -0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff, -0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x08,0x12,0x33,0xd8,0x90,0x81,0x56, -0x12,0x1d,0xb5,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x33,0xd8,0x90,0x81, -0x56,0x12,0x1d,0xb5,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x33,0xd8,0x90, -0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x33,0xd8, -0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x33, -0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12, -0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e, -0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e, -0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x80, -0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x63,0xdb,0x25,0xa4,0x7f, -0x84,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4, -0x7f,0x88,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25, -0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb, -0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20, -0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5, -0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d, -0xb5,0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12, -0x1d,0xb5,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56, -0x12,0x1d,0xb5,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x33,0xd8,0x7f,0x04, -0x7e,0x0c,0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc, -0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xe4,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, -0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x11,0xff,0xec, -0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, -0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33, -0xd8,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97, -0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xf0,0xff,0xec,0x90, -0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, -0xa3,0xe0,0x44,0x01,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0, -0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, -0x7f,0x04,0x7e,0x0d,0x12,0x33,0xd8,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x13,0x90,0x97, -0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xe4, -0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd, -0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x11,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, -0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, -0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33,0xd8,0x7f,0x0c,0x7e,0x09,0x12,0x2b, -0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, -0xe0,0xfe,0xa3,0xe0,0xff,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xa3, -0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, -0xff,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, -0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, -0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33,0xd8,0x7f,0x04,0x7e,0x08,0x12,0x2b, -0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, -0xe0,0xfe,0xa3,0xe0,0x54,0xf0,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97, -0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x01,0xff,0xec,0x90, -0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, -0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x08,0x12,0x33,0xd8, -0xe4,0x90,0x97,0x2d,0xf0,0x22,0x8f,0x10,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, -0x34,0x95,0xaf,0x82,0xf5,0x11,0x8f,0x12,0xe5,0x10,0x75,0xf0,0x02,0xa4,0x24,0x81, -0xf9,0x74,0x92,0x35,0xf0,0x75,0x13,0x01,0xf5,0x14,0x89,0x15,0xe5,0x10,0x75,0xf0, -0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4,0x34,0x93,0xaf,0x82,0xf5,0x16,0x8f,0x17,0xe5, -0x10,0x75,0xf0,0x08,0xa4,0x24,0x63,0xf9,0x74,0x93,0x35,0xf0,0x75,0x18,0x01,0xf5, -0x19,0x89,0x1a,0x74,0xc1,0x25,0x10,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12, -0x66,0xc1,0x55,0x67,0x00,0x55,0x7c,0x01,0x55,0x91,0x02,0x55,0xa6,0x03,0x55,0xd0, -0x04,0x55,0xe5,0x05,0x55,0xfa,0x06,0x56,0x21,0x0c,0x56,0x4f,0x0d,0x56,0x7c,0x0e, -0x56,0xa9,0x0f,0x00,0x00,0x56,0xdd,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, -0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x10,0x25,0xe0, -0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80, -0x27,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, -0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, -0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5, -0x82,0xe4,0x34,0x92,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x56,0xdd, -0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, -0xa3,0x74,0xf5,0x80,0x27,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, -0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x10,0x25,0xe0,0x24,0xe4, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x10,0x25, -0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x56, -0xdd,0x90,0x04,0x47,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04, -0x46,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04, -0x45,0xe0,0x85,0x12,0x82,0x85,0x11,0x83,0xf0,0x90,0x04,0x44,0x02,0x56,0xd4,0x90, -0x04,0x4b,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x4a,0xe0, -0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x49,0xe0, -0x85,0x12,0x82,0x85,0x11,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0, -0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x4e,0xe0,0xab,0x13,0xaa, -0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x4d,0xe0,0x85,0x12,0x82, -0x85,0x11,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x13,0xaa, -0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x52,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15, -0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x51,0xe0,0x85,0x12,0x82,0x85,0x11,0x83, -0xf0,0x90,0x04,0x50,0xe0,0x85,0x12,0x82,0x85,0x11,0x83,0xa3,0xf0,0xab,0x13,0xaa, -0x14,0xa9,0x15,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x1c,0xd6,0xff,0xab,0x18,0xaa, -0x19,0xa9,0x1a,0x12,0x1c,0xd6,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x65,0x95, -0xab,0x13,0xe5,0x15,0x24,0x01,0xf9,0xe4,0x35,0x14,0xfa,0xc0,0x03,0xc0,0x02,0xc0, -0x01,0x12,0x1c,0xd6,0xff,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x1c, -0xef,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x65,0x95,0x85,0x12,0x82,0x85,0x11, -0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x17,0x82,0x85,0x16,0x83,0xe0,0xfe,0xef, -0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x12,0x82,0x85,0x11,0x83,0xa3,0xc0,0x83,0xc0, -0x82,0xe0,0xff,0x85,0x17,0x82,0x85,0x16,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82, -0xd0,0x83,0xf0,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, -0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x4c,0x90,0x97,0x51,0x74,0x0b,0xf0,0x90,0x97,0x51, -0xe0,0xff,0xc3,0x94,0x00,0x50,0x03,0x02,0x58,0x23,0x74,0x01,0x7e,0x00,0xa8,0x07, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24, -0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, -0x0a,0x90,0x97,0x51,0xe0,0x24,0x10,0xa3,0xf0,0x80,0x68,0x90,0x97,0x51,0xe0,0x14, -0xf0,0x80,0xba,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x47,0x90,0x97,0x51,0x74,0x0f,0xf0,0x90,0x97,0x51, -0xe0,0xff,0xc3,0x94,0x00,0x40,0x3c,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, -0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82, -0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97, -0x51,0xe0,0xa3,0xf0,0x80,0x0d,0x90,0x97,0x51,0xe0,0x14,0xf0,0x80,0xbf,0xe4,0x90, -0x97,0x52,0xf0,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x47,0xe4,0x90,0x97,0x51,0xf0,0x90,0x97,0x51,0xe0, -0xff,0xc3,0x94,0x10,0x40,0x03,0x02,0x58,0xdd,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08, -0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0xe4, -0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, -0x90,0x97,0x51,0xe0,0x80,0x63,0x90,0x97,0x51,0xe0,0x04,0xf0,0x80,0xbe,0xe5,0x10, -0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, -0x60,0x46,0xe4,0x90,0x97,0x51,0xf0,0x90,0x97,0x51,0xe0,0xff,0xc3,0x94,0x0c,0x50, -0x3c,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, -0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, -0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x51,0xe0,0x24,0x10,0x80,0x09, -0x90,0x97,0x51,0xe0,0x04,0xf0,0x80,0xbf,0xe4,0x90,0x97,0x53,0xf0,0x90,0x97,0x52, -0xe0,0xff,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34,0x93,0xf5, -0x83,0xef,0xf0,0x90,0x97,0x53,0xe0,0xfe,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x68, -0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xee,0xf0,0x74,0x84,0x25,0x10,0xf5,0x82,0xe4, -0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x1f,0x90,0x97,0x52,0xe0,0xff,0x74,0x84, -0x25,0x10,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x10,0xf5, -0x82,0xe4,0x34,0x04,0xf5,0x83,0xef,0xf0,0x90,0x97,0x52,0xe0,0xff,0xd3,0x94,0x13, -0x40,0x08,0x90,0x93,0x62,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08, -0x90,0x93,0x62,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93, -0x62,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x62,0xf0,0x90,0x93,0x62,0xe0,0x90, -0x04,0xb1,0xf0,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, -0xe0,0xff,0xa3,0xe0,0x90,0x04,0x9c,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x10,0x25,0xe0, -0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x04,0x9e, -0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x69,0xf5,0x82,0xe4, -0x34,0x93,0xf5,0x83,0xe0,0xc4,0x33,0x54,0xe0,0x45,0x10,0x90,0x04,0xa0,0xf0,0x74, -0xc1,0x25,0x10,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x90,0x04,0xa1,0xf0,0x22, -0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0, -0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4, -0x74,0xd0,0xf0,0x74,0x59,0xa3,0xf0,0x90,0x01,0x37,0xe0,0x55,0x2b,0xf5,0x2f,0x90, -0x01,0x34,0xe0,0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xe5, -0x2c,0x20,0xe0,0x03,0x02,0x5b,0x82,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1,0x4d, -0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52,0x85, -0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54,0x20, -0x6f,0x70,0x03,0x02,0x5b,0x2f,0xe5,0x54,0x30,0xe5,0x03,0x02,0x5b,0x2f,0xe5,0x52, -0x54,0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5, -0x08,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12, -0x65,0xc9,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4, -0x34,0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x65,0xc9,0xe5,0x09,0xd3,0x94,0x04,0x40, -0x03,0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0xa4,0x24,0x00,0xf5,0x82,0xe5,0xf0, -0x34,0x90,0xf5,0x83,0x75,0xf0,0x02,0xe5,0x09,0x12,0x66,0xb5,0xe0,0xfe,0xa3,0xe0, -0xff,0xe5,0x53,0x54,0x1f,0x2f,0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0xa4, -0x24,0x00,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0x75,0xf0,0x02,0xe5,0x09,0x12, -0x66,0xb5,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6,0x24,0xe5,0x53,0x54,0x1f, -0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f, -0xf0,0x12,0x65,0xc9,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08,0x12,0x75,0x4c,0x80,0x2f, -0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94, -0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x65,0xc9,0xe5,0x4f,0x30,0xe7,0x12,0xe5,0x4f,0x54, -0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0d,0xab,0x09,0xaf,0x08,0x12,0x76,0x52,0xe5, -0x65,0x60,0x4f,0x90,0x97,0x8d,0xe0,0x60,0x35,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01, -0x3c,0x74,0x04,0xf0,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x70,0x34,0x75,0x48, -0x14,0xf5,0x49,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x38,0xec,0x90,0x01,0x5b,0x74, -0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x97,0x87,0xf0,0x80,0x14,0x90,0x04, -0x1b,0xe0,0x54,0x7f,0xff,0xbf,0x7f,0x0a,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12, -0x6e,0xda,0xe5,0x2c,0x30,0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x56, -0x85,0xd2,0x57,0x85,0xd3,0x58,0x85,0xd4,0x59,0x85,0xd5,0x5a,0x85,0xd6,0x5b,0x85, -0xd7,0x5c,0x85,0xd9,0x5d,0x12,0x7d,0xc4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34, -0x74,0x08,0xf0,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x55, -0x10,0xe5,0x2c,0x30,0xe5,0x21,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1a,0xe0,0x54,0xdf, -0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x7f,0x10, -0x7e,0x00,0x12,0x3a,0xa8,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74, -0x40,0xf0,0xe5,0x2e,0x30,0xe1,0x09,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x55,0x40, -0xe5,0x2e,0x30,0xe0,0x09,0x90,0x01,0x36,0x74,0x01,0xf0,0x12,0x76,0xd3,0xe5,0x2e, -0x30,0xe2,0x63,0x90,0x01,0x36,0x74,0x04,0xf0,0xe5,0x64,0x64,0x01,0x70,0x57,0xe5, -0x65,0x60,0x53,0xe5,0x65,0x64,0x02,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x7f, -0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x7f,0xe0,0x70,0x07,0x90, -0x97,0x8a,0xe0,0xff,0x80,0x05,0x90,0x97,0x7f,0xe0,0xff,0x90,0x97,0x7f,0xef,0xf0, -0x90,0x97,0x81,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x80,0xe4,0xf0,0x90,0x01, -0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8f,0xe0,0x54,0xfd,0xf0,0xe0, -0x54,0xef,0xf0,0x12,0x77,0x49,0xe5,0x2e,0x30,0xe3,0x31,0x90,0x01,0x36,0x74,0x08, -0xf0,0xe5,0x64,0x64,0x01,0x70,0x25,0xe5,0x65,0x60,0x21,0x90,0x01,0x57,0xe4,0xf0, -0x90,0x01,0x3c,0x74,0x02,0xf0,0x75,0x48,0x03,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f, -0x54,0x7e,0x01,0x12,0x38,0xec,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, -0x3a,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x64,0x64,0x01,0x70,0x2e,0xe5,0x65,0x60, -0x2a,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8e,0xe4, -0xf0,0x90,0x97,0x8f,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x03,0x70,0x0e,0x90,0x97,0x89, -0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x2e,0x30,0xe5,0x12, -0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x64,0xb4,0x01,0x07,0xe5,0x65,0x60,0x03,0x12, -0x7e,0x7e,0xe5,0x2e,0x30,0xe6,0x2a,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x64,0x64, -0x01,0x70,0x1e,0xe5,0x65,0x60,0x1a,0x90,0x97,0x8f,0xe0,0x54,0xfe,0xf0,0xe0,0x54, -0x03,0x70,0x0e,0x90,0x97,0x89,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e, -0xda,0xe5,0x2f,0x30,0xe1,0x09,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x7c,0xe8,0x74, -0xd0,0x04,0x90,0x01,0xc4,0xf0,0x74,0x59,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05, -0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83, -0xd0,0xf0,0xd0,0xe0,0x32,0x74,0x5d,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x65,0xf0,0x90, -0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0,0xa3,0xe4,0xf0, -0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xff,0xc3,0x94,0x10,0x50,0x14,0x74,0xa4, -0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0, -0x80,0xe2,0xe4,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xfb,0xc3,0x94,0x20,0x40, -0x03,0x02,0x5f,0x6c,0xe0,0xff,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xf5,0x82,0xe5,0xf0, -0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xef,0xa4,0x24,0x02,0xf5, -0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xef,0xa4, -0x24,0x04,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, -0x0a,0xef,0xa4,0x24,0x06,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3, -0xf0,0x75,0xf0,0x0a,0xef,0xa4,0x24,0x08,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83, -0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13, -0xf0,0x74,0x44,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xef,0x25,0xe0, -0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, -0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, -0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, -0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, -0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, -0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x44,0x2f, -0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2f,0xf5,0x82,0xe4,0x34, -0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4, -0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x8c,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xeb,0x25, -0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0xeb, -0x75,0xf0,0x08,0xa4,0x24,0x6a,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01,0xf0, -0xeb,0x75,0xf0,0x08,0xa4,0x24,0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01, -0xf0,0x74,0xc1,0x2b,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0xeb,0x75, -0xf0,0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0xff,0xf0,0xa3, -0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x63,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4, -0xf0,0xa3,0x74,0x0f,0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34, -0x93,0xf5,0x83,0x74,0x13,0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x68,0xf5,0x82,0xe4, -0x34,0x93,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x2b,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, -0x74,0x13,0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0,0x02,0x5d,0xa7,0x22,0x8f,0x17,0x74, -0x5f,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x6d,0xf0,0x74,0x84,0x25,0x17,0xf5,0x82,0xe4, -0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0x90,0x97,0x54,0xf0,0xe0,0x54,0x1f,0xff,0x90, -0x97,0x57,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x68,0xf5,0x82,0xe4,0x34,0x93, -0xf5,0x83,0xe0,0x90,0x97,0x59,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5, -0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0x90,0x97,0x5a,0xf0,0xe5,0x17,0x25,0xe0, -0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5b, -0xcb,0xf0,0xa3,0xeb,0xf0,0xe5,0x17,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92, -0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3, -0x9e,0x40,0x0c,0x90,0x97,0x5a,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0x54,0xf0,0xed, -0x70,0x03,0x02,0x60,0xd9,0x90,0x97,0x58,0xed,0xf0,0x90,0x97,0x54,0xe0,0x30,0xe6, -0x0e,0x90,0x97,0x57,0xe0,0x90,0x97,0x54,0xf0,0x90,0x97,0x58,0xe0,0x14,0xf0,0x90, -0x97,0x58,0xe0,0x70,0x03,0x02,0x60,0xd9,0x90,0x97,0x57,0xe0,0xff,0xd3,0x94,0x00, -0x50,0x03,0x02,0x60,0xd9,0xe4,0x90,0x97,0x56,0xf0,0xef,0x14,0x90,0x97,0x55,0xf0, -0x90,0x97,0x59,0xe0,0xfd,0x90,0x97,0x55,0xe0,0xff,0xd3,0x9d,0x40,0x6f,0xef,0x94, -0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, -0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0, -0x5f,0x4e,0x70,0x27,0x90,0x97,0x55,0xe0,0xff,0xc3,0x94,0x10,0x50,0x37,0x74,0x01, -0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, -0x97,0x5b,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1a,0x90,0x97,0x55,0xe0,0x90, -0x97,0x54,0xf0,0x90,0x97,0x56,0xe0,0x04,0xf0,0x90,0x97,0x58,0xe0,0xff,0x90,0x97, -0x56,0xe0,0x6f,0x60,0x08,0x90,0x97,0x55,0xe0,0x14,0xf0,0x80,0x83,0x90,0x97,0x58, -0xe0,0xff,0x90,0x97,0x56,0xe0,0xc3,0x9f,0x50,0x0f,0x90,0x97,0x55,0xe0,0xb5,0x05, -0x08,0x90,0x97,0x59,0xe0,0x90,0x97,0x54,0xf0,0x90,0x97,0x54,0xe0,0xff,0x25,0xe0, -0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd, -0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2d, -0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25, -0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0x90, -0x97,0x54,0xe0,0xff,0x74,0x84,0x25,0x17,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xef, -0xf0,0x22,0x90,0x01,0xc4,0x74,0x32,0xf0,0x74,0x61,0xa3,0xf0,0x90,0x01,0xcc,0xe0, -0x54,0x0f,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xfd,0x70,0x03,0x02,0x62,0xd2, -0x90,0x97,0xb1,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33, -0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x03,0x02,0x62,0xb3,0x90,0x97,0xb1, -0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd0,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0, -0x90,0x97,0x3b,0xf0,0xa2,0xaf,0xe4,0x33,0xa3,0xf0,0xc2,0xaf,0x75,0x24,0x01,0x75, -0x25,0x97,0x75,0x26,0x3b,0x75,0x27,0x01,0x7b,0x01,0x7a,0x97,0x79,0x3d,0x12,0x79, -0x27,0x90,0x97,0x3c,0xe0,0x24,0xff,0x92,0xaf,0xa3,0xe0,0xff,0xc4,0x13,0x13,0x13, -0x54,0x01,0x90,0x97,0xb1,0x30,0xe0,0x70,0xe0,0x75,0xf0,0x02,0xa4,0x24,0x88,0xf5, -0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe0,0x90,0x97,0x3e,0xf0,0x90,0x97,0xb1,0xe0,0x75, -0xf0,0x02,0xa4,0x24,0x89,0xf5,0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe0,0x90,0x97,0x3f, -0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd1,0xf5,0x82,0xe5,0xf0,0x34, -0x01,0xf5,0x83,0xe0,0x90,0x97,0x40,0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4, -0x24,0xd2,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x41,0xf0,0x90, -0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd3,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5, -0x83,0xe0,0x90,0x97,0x42,0xf0,0x80,0x42,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd1,0xf5, -0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x3e,0xf0,0x90,0x97,0xb1,0xe0, -0x75,0xf0,0x04,0xa4,0x24,0xd2,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90, -0x97,0x3f,0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd3,0xf5,0x82,0xe5, -0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x40,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01, -0x7a,0x97,0x79,0x3e,0x12,0x6e,0x02,0x90,0x97,0x3a,0xe0,0xff,0x90,0x97,0xb1,0xe0, -0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x97, -0x3a,0xf0,0x90,0x97,0xb1,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xb1,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0, -0x02,0x61,0x46,0xc2,0xaf,0x74,0x32,0x04,0x90,0x01,0xc4,0xf0,0x74,0x61,0xa3,0xf0, -0x90,0x97,0x3a,0xe0,0x90,0x01,0xc6,0xf0,0x90,0x97,0xb1,0xe0,0x90,0x01,0xc7,0xf0, -0x80,0xfe,0x22,0xe4,0x90,0x97,0x37,0xf0,0xa3,0xf0,0x12,0x7a,0x6c,0x90,0x00,0x02, -0xe0,0x54,0xe0,0x90,0x97,0x96,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0, -0x90,0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x97,0x74,0x01,0xf0,0x80,0x05,0xe4, -0x90,0x97,0x97,0xf0,0x90,0x97,0x97,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30, -0xe7,0x0c,0x90,0x97,0x90,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97, -0x90,0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x55,0x12,0x5d,0x65,0x12,0x7f, -0x60,0x12,0x79,0xce,0x12,0x36,0xd1,0x12,0x44,0xff,0x75,0x28,0x33,0xe4,0xf5,0x29, -0x75,0x2a,0x02,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3, -0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05, -0x41,0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0, -0xf0,0x75,0x48,0xff,0xe4,0xf5,0x49,0xfb,0x7d,0x01,0x7f,0x50,0x7e,0x01,0x12,0x38, -0xec,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0, -0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x12,0x78,0xd0,0x90,0x97,0x39,0xe5,0xd9, -0xf0,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,0xf0,0x7f,0x10, -0x7e,0x00,0x12,0x3a,0xa8,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x01,0xc0, -0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0xc6,0xf0,0xa3,0xf0,0x90,0x97, -0x37,0xe0,0x64,0x01,0xf0,0x24,0xd3,0x90,0x01,0xc4,0xf0,0x74,0x62,0xa3,0xf0,0xe5, -0x55,0x30,0xe6,0x17,0xc2,0xaf,0x53,0x55,0xbf,0xd2,0xaf,0x12,0x45,0x09,0x90,0x97, -0x6d,0xe0,0xff,0x60,0x03,0xb4,0x01,0x03,0x12,0x6a,0x1f,0xe5,0x55,0x30,0xe7,0x07, -0xc2,0xaf,0x53,0x55,0x7f,0xd2,0xaf,0xe5,0x55,0x30,0xe4,0x0a,0xc2,0xaf,0x53,0x55, -0xef,0xd2,0xaf,0x12,0x61,0x32,0x90,0x97,0x6d,0xe0,0x70,0x03,0x12,0x6d,0x29,0x12, -0x7d,0x45,0x80,0xaa,0x90,0x00,0x02,0x12,0x1c,0xef,0x90,0x97,0x6b,0xf0,0x90,0x00, -0x01,0x12,0x1c,0xef,0x25,0xe0,0x25,0xe0,0x90,0x97,0x6a,0xf0,0x12,0x1c,0xd6,0x25, -0xe0,0x25,0xe0,0x90,0x97,0x6e,0xf0,0x90,0x97,0x6b,0xe0,0x90,0x04,0x98,0xf0,0x90, -0x97,0x6a,0xe0,0x13,0x13,0x54,0x3f,0x90,0x04,0x99,0xf0,0x90,0x97,0x6e,0xe0,0x13, -0x13,0x54,0x3f,0x90,0x04,0x9a,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x79,0xf0,0x90, -0x05,0x61,0xe0,0x90,0x97,0x7a,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x7b,0xf0,0x90, -0x05,0x63,0xe0,0x90,0x97,0x7c,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x49,0xf0,0xc2, -0xaf,0x90,0x97,0x6a,0xe0,0xff,0x12,0x79,0x7c,0x90,0x97,0x49,0xe0,0x24,0xff,0x92, -0xaf,0x90,0x97,0x6b,0xe0,0x70,0x03,0x02,0x65,0x61,0x90,0x97,0x6a,0xe0,0x70,0x03, -0x02,0x65,0x61,0x90,0x97,0x6e,0xe0,0x70,0x03,0x02,0x65,0x61,0xa2,0xaf,0xe4,0x33, -0x90,0x97,0x49,0xf0,0xc2,0xaf,0x90,0x97,0x7d,0x74,0x01,0xf0,0x90,0x97,0x49,0xe0, -0x24,0xff,0x92,0xaf,0x90,0x00,0x45,0xe0,0x54,0xfe,0xf0,0xa3,0xe0,0x44,0x01,0xf0, -0x90,0x97,0x63,0xe0,0x60,0x1d,0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, -0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33, -0xd8,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,0x54,0xef,0xf0, -0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x79,0xe0,0x90,0x05,0x84,0xf0,0x90, -0x97,0x7a,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x7b,0xe0,0x90,0x05,0x86,0xf0,0x90, -0x97,0x7c,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x49,0xf0,0xc2, -0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x3a,0x49,0x80, -0x2b,0x90,0x97,0x6b,0xe0,0x70,0x2d,0x90,0x97,0x7d,0xf0,0x90,0x00,0x45,0xe0,0x54, -0xfe,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90, -0x97,0x49,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x39,0xdb,0x90,0x97,0x49,0xe0, -0x24,0xff,0x92,0xaf,0x22,0xbb,0x01,0x06,0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02, -0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82, -0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22, -0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0, -0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xa3, -0xf8,0xe0,0xc5,0xf0,0x25,0xf0,0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0, -0xc8,0x38,0xf0,0xe8,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5,0xf0,0xa3, -0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3,0xf5,0xf0, -0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01,0x93,0x22, -0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0, -0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22,0xbb,0xfe, -0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83, -0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xf0, -0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb,0xfe,0x06, -0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29,0xf5,0x82, -0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09,0xe9,0x25, -0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8,0xf2,0xe5, -0xf0,0x08,0xf2,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0, -0xe8,0x9c,0x45,0xf0,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83, -0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3, -0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68, -0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0,0xa3, -0xe9,0xf0,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x04, -0x12,0x1c,0xef,0xff,0x54,0x1f,0x90,0x97,0x49,0xf0,0x90,0x00,0x03,0x12,0x1c,0xef, -0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x4a,0xf0,0xef,0x54,0x20,0xc4,0x13,0x54,0x07, -0xa3,0xf0,0x90,0x97,0x49,0xe0,0xff,0x75,0xf0,0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4, -0x34,0x93,0xad,0x82,0x90,0x97,0x4c,0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x08,0xa4, -0x24,0x63,0xf9,0x74,0x93,0x35,0xf0,0xfa,0xa3,0x74,0x01,0xf0,0xa3,0xea,0xf0,0xa3, -0xe9,0xf0,0x90,0x97,0x46,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x03,0x12,0x1c, -0xef,0x54,0x0f,0xff,0x90,0x97,0x4e,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0xef, -0x12,0x65,0x95,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00, -0x02,0x12,0x1c,0xef,0xff,0x90,0x97,0x4e,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9, -0x90,0x00,0x01,0xef,0x12,0x65,0xa7,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, -0xe0,0xf9,0x90,0x00,0x01,0x12,0x1c,0xef,0xff,0x90,0x97,0x4c,0xe0,0xfc,0xa3,0xe0, -0xfd,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x12,0x1c,0xd6,0x8d,0x82,0x8c,0x83,0xa3,0xf0, -0x90,0x97,0x4a,0xe0,0xfe,0x90,0x97,0x49,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34, -0x92,0xf5,0x83,0xee,0xf0,0x90,0x97,0x4b,0xe0,0xfe,0xef,0x75,0xf0,0x08,0xa4,0x24, -0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xee,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24, -0x6a,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01,0xf0,0x02,0x54,0xe6,0xc0,0xe0, -0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0, -0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xfe, -0xf0,0x74,0x67,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34, -0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xe5,0x34,0x30,0xe0, -0x0f,0x90,0x01,0x3c,0x74,0x01,0xf0,0x90,0x01,0x53,0x74,0x07,0xf0,0x43,0x55,0x80, -0xe5,0x34,0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x7b,0x00,0xe5,0x34, -0x30,0xe2,0x3a,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x1e, -0x75,0x48,0x14,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x38,0xec, -0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x0f,0x90,0x97, -0x87,0xe4,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x34,0x30, -0xe3,0x06,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c, -0x74,0x10,0xf0,0x12,0x7e,0xdf,0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20, -0xf0,0x12,0x6f,0xa2,0xe5,0x35,0x30,0xe0,0x15,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90, -0x00,0x83,0xe0,0x90,0x97,0x8b,0xf0,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x36, -0x30,0xe3,0x06,0x90,0x01,0x3e,0x74,0x08,0xf0,0x74,0xfe,0x04,0x90,0x01,0xc4,0xf0, -0x74,0x67,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02, -0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8b, -0x10,0x8a,0x11,0x89,0x12,0x90,0x00,0x02,0x12,0x1c,0xef,0x90,0x97,0x6c,0xf0,0xe0, -0x90,0x04,0x94,0xf0,0x90,0x00,0x01,0x12,0x1c,0xef,0x90,0x04,0x95,0xf0,0x90,0x97, -0x6c,0xe0,0x30,0xe0,0x74,0x90,0x97,0x63,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12, -0x2b,0x13,0x90,0x97,0x65,0x12,0x1d,0xa9,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00, -0x01,0x12,0x1c,0xef,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x1d,0x96,0xa8,0x04, -0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, -0xfe,0xa3,0xe0,0xff,0xec,0x54,0x03,0xfc,0xeb,0x4f,0xff,0xea,0x4e,0xfe,0xe9,0x4d, -0xfd,0xe8,0x4c,0xfc,0x90,0x97,0x6f,0x12,0x1d,0xa9,0x90,0x05,0x22,0xe4,0xf0,0x90, -0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x78,0x18,0x12, -0x1d,0x83,0x90,0x04,0x96,0xef,0xf0,0x80,0x45,0xe4,0x90,0x97,0x63,0xf0,0x7f,0x80, -0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x65,0x12,0x1d,0xa9,0x90,0x97,0x65,0xe0,0xfc, -0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xec,0x44,0xc0,0xfc,0x90,0x97,0x65, -0x12,0x1d,0xa9,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, -0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97, -0x6c,0xe0,0x90,0x00,0x47,0x30,0xe1,0x11,0x74,0x0c,0xf0,0xa3,0xe0,0x44,0x0c,0xf0, -0x90,0x00,0x46,0xe0,0x44,0x10,0xf0,0x80,0x10,0xe0,0x54,0xf3,0xf0,0xa3,0xe0,0x54, -0xf3,0xf0,0x90,0x00,0x46,0xe0,0x54,0xef,0xf0,0xe4,0x90,0x97,0x69,0xf0,0x22,0x90, -0x97,0x64,0xe0,0xc3,0x94,0x14,0x50,0x06,0xe0,0x04,0xf0,0x02,0x6a,0xd9,0x90,0x97, -0x64,0xe0,0x64,0x14,0x60,0x03,0x02,0x6a,0xd9,0x90,0x97,0x73,0xe0,0x70,0x25,0x90, -0x97,0x76,0xe0,0x70,0x1f,0x90,0x97,0x74,0xe0,0x70,0x19,0x90,0x97,0x77,0xe0,0x70, -0x13,0x90,0x97,0x75,0xe0,0x70,0x0d,0x90,0x97,0x78,0xe0,0x70,0x07,0x90,0x04,0xfd, -0xe0,0x54,0xfe,0xf0,0x90,0x97,0x73,0xe0,0x90,0x04,0x88,0xf0,0x90,0x97,0x74,0xe0, -0x90,0x04,0x89,0xf0,0x90,0x97,0x75,0xe0,0x90,0x04,0x8a,0xf0,0xa3,0xe4,0xf0,0x90, -0x97,0x76,0xe0,0x90,0x04,0x8c,0xf0,0x90,0x97,0x77,0xe0,0x90,0x04,0x8d,0xf0,0x90, -0x97,0x78,0xe0,0x90,0x04,0x8e,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x5f,0xe0,0x90,0x04, -0x90,0xf0,0x90,0x97,0x60,0xe0,0x90,0x04,0x91,0xf0,0x90,0x97,0x61,0xe0,0x90,0x04, -0x92,0xf0,0x90,0x97,0x62,0xe0,0x90,0x04,0x93,0xf0,0xe4,0x90,0x97,0x64,0xf0,0x90, -0x97,0x5f,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97,0x73,0xf0,0xa3, -0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97,0x64,0xe0,0x90,0x04,0x97, -0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x3a,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x3b, -0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x3c,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x3d, -0xf0,0x90,0x97,0x7c,0xe0,0xff,0x90,0x97,0x3d,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90, -0x97,0x7c,0xe0,0xc3,0x9e,0xd3,0x94,0x01,0x40,0x11,0x90,0x97,0x6a,0xe0,0xb4,0x01, -0x02,0x80,0x03,0x90,0x97,0x6e,0xe0,0xff,0x12,0x79,0x7c,0x22,0x90,0x97,0xb0,0xed, -0xf0,0x90,0x97,0xaf,0xef,0xf0,0xd3,0x94,0x07,0x50,0x6d,0xe0,0xff,0x74,0x01,0xa8, -0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0, -0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07, -0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x7f,0x10, -0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb0,0xe0,0x60,0x16,0x90,0x97,0xaf,0xe0,0xff, -0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80, -0x78,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, -0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x7d,0x90,0x97,0xaf,0xe0,0x24,0xf8,0xf0,0xe0, -0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4, -0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97, -0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90, -0x00,0x43,0xe0,0x4f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb0,0xe0, -0x60,0x1b,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xaf, -0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0, -0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x22, -0x90,0x01,0xc4,0x74,0x30,0xf0,0x74,0x6c,0xa3,0xf0,0x7f,0x78,0x7e,0x08,0x12,0x2b, -0x13,0x90,0x97,0x1d,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x13,0x90,0x97, -0x21,0x12,0x1d,0xa9,0x7f,0x00,0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x25,0x12,0x1d, -0xa9,0x90,0x97,0x97,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x13,0xe0,0xfc,0xa3,0xe0,0xfd, -0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x0d,0xe0,0xfc, -0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xc7,0xff,0xec,0x90,0x81,0x56,0x12, -0x1d,0xa9,0x7f,0x78,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x21,0xe0,0xfc,0xa3,0xe0, -0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0x0f,0xff,0xec,0x90,0x81,0x56,0x12,0x1d,0xa9, -0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x25,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, -0xe0,0xfe,0xa3,0xe0,0x44,0x02,0xff,0xec,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x00, -0x7e,0x08,0x12,0x33,0xd8,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x97,0x29,0x12, -0x1d,0xa9,0x90,0x81,0x56,0x12,0x1d,0xb5,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e, -0x12,0x33,0xd8,0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff, -0x12,0x38,0xb6,0x90,0x97,0x97,0xe0,0xb4,0x01,0x11,0x90,0x81,0x24,0x12,0x1d,0xb5, -0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x38,0xb6,0x90,0x00,0x11,0xe0,0x54, -0xf6,0xf0,0x7f,0x10,0x7e,0x00,0x02,0x3a,0xa8,0x90,0x97,0x7d,0xe0,0x64,0x01,0x60, -0x09,0x90,0x97,0x6b,0xe0,0x60,0x03,0x02,0x6e,0x01,0x90,0x97,0x5f,0xe0,0xc3,0x94, -0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x60,0xe0,0xc3,0x94,0xff,0x50, -0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x61,0xe0,0xc3,0x94,0xff,0x50,0x0a, -0xe0,0x04,0xf0,0xe4,0x90,0x97,0x60,0xf0,0x80,0x15,0x90,0x97,0x62,0xe0,0xc3,0x94, -0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x61,0xf0,0x90,0x97,0x60,0xf0,0x90, -0x97,0x5f,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, -0x97,0x73,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x74, -0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x75,0xe0, -0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x74,0xf0,0x90,0x97,0x73, -0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x76,0xe0,0xc3,0x94,0xff,0x50, -0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x77,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, -0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x78,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, -0xf0,0xe4,0x90,0x97,0x77,0xf0,0x90,0x97,0x76,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, -0xf0,0x22,0x90,0x97,0x43,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xad,0x07,0x90, -0x01,0xc4,0x74,0x02,0xf0,0x74,0x6e,0xa3,0xf0,0xed,0x12,0x66,0xc1,0x6e,0x3f,0x01, -0x6e,0x4d,0x02,0x6e,0x5b,0x03,0x6e,0x69,0x05,0x6e,0x77,0x06,0x6e,0x85,0x07,0x6e, -0x93,0x09,0x6e,0xa1,0x0c,0x6e,0xaf,0x0d,0x6e,0xbd,0x0e,0x00,0x00,0x6e,0xcb,0x90, -0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7d,0x9d,0x90,0x97,0x43, -0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7f,0x77,0x90,0x97,0x43,0xe0,0xfb, -0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7d,0x17,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0, -0xfa,0xa3,0xe0,0xf9,0x02,0x7c,0x0b,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, -0xe0,0xf9,0x02,0x66,0xe7,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9, -0x02,0x7f,0x28,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x73, -0x14,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x64,0x34,0x90, -0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7c,0x7e,0x90,0x97,0x43, -0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x69,0x0f,0xc2,0xaf,0x74,0x02,0x04, -0x90,0x01,0xc4,0xf0,0x74,0x6e,0xa3,0xf0,0x80,0xfe,0x8f,0x62,0x8d,0x63,0x90,0x01, -0xc4,0x74,0xda,0xf0,0x74,0x6e,0xa3,0xf0,0xe5,0x62,0x54,0x0f,0xff,0x90,0x97,0x88, -0xe0,0x54,0x0f,0x6f,0x60,0x78,0xe5,0x62,0x30,0xe2,0x30,0x90,0x97,0x88,0xe0,0x20, -0xe2,0x05,0x7f,0x01,0x12,0x7e,0x08,0x90,0x97,0x88,0xe0,0x30,0xe3,0x0a,0xe5,0x62, -0x20,0xe3,0x05,0x12,0x7e,0x27,0x80,0x56,0x90,0x97,0x88,0xe0,0x20,0xe3,0x4f,0xe5, -0x62,0x30,0xe3,0x4a,0xaf,0x63,0x12,0x7d,0xe8,0x80,0x43,0x90,0x97,0x88,0xe0,0x54, -0x0f,0xff,0xbf,0x0c,0x0e,0xe5,0x62,0x20,0xe3,0x09,0x12,0x7d,0x72,0xef,0x60,0x2e, -0x12,0x7e,0x27,0x90,0x97,0x88,0xe0,0x54,0x0f,0xff,0xbf,0x04,0x0e,0xe5,0x62,0x20, -0xe2,0x09,0x12,0x7b,0x8a,0xef,0x60,0x16,0x12,0x7c,0x47,0x90,0x97,0x88,0xe0,0x54, -0x0f,0xff,0xbf,0x02,0x09,0x12,0x7a,0xb8,0xef,0x60,0x03,0x12,0x7e,0x44,0x90,0x97, -0x88,0xe0,0x54,0x0f,0xff,0x90,0x97,0x8b,0xe0,0x54,0x0f,0x6f,0x70,0x23,0xe0,0x30, -0xe6,0x1f,0x90,0x97,0x88,0xe0,0x54,0x0f,0xff,0x90,0x97,0x7e,0xe0,0xfe,0x4f,0x90, -0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x7e,0xf0,0x90,0x97,0x8b,0xe0,0x54,0xbf, -0xf0,0x22,0x90,0x97,0x6b,0xe0,0x64,0x01,0x60,0x03,0x02,0x70,0x65,0x90,0x00,0x46, -0xe0,0x44,0x01,0xf0,0x90,0x97,0x7d,0xe0,0x70,0x40,0x90,0x97,0x63,0xe0,0x60,0x1d, -0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, -0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x80,0x06,0x90,0x05,0x22, -0x74,0x7f,0xf0,0x90,0x97,0x6a,0xe0,0xff,0x12,0x79,0x7c,0x90,0x97,0x7d,0x74,0x01, -0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xf0,0x80,0x44,0x90,0x97,0x7d,0xe0,0x64,0x01, -0x70,0x3c,0x90,0x97,0x6e,0xe0,0xff,0x12,0x79,0x7c,0xe4,0x90,0x97,0x7d,0xf0,0x90, -0x00,0x45,0xe0,0x44,0x01,0xf0,0x90,0x97,0x63,0xe0,0x60,0x1d,0x90,0x97,0x65,0xe0, -0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, -0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05, -0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x79,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x7a, -0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x7b,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x7c, -0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x97,0x30,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9, -0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x70,0x03,0x02,0x71,0x1b,0x90,0x01,0xaf,0xe0, -0x60,0x09,0x90,0x01,0xc7,0xe0,0x04,0xf0,0xf0,0x80,0xf1,0x90,0x97,0xb3,0xe0,0xff, -0x04,0xf0,0x90,0x97,0x30,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x01, -0xef,0x12,0x65,0xa7,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x36,0xf0,0xc2,0xaf,0x90,0x97, -0x30,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0x8b,0x24,0x8a,0x25,0xf5,0x26,0x75,0x27, -0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x12,0x79,0x27,0x90,0x97,0x36,0xe0,0x24,0xff, -0x92,0xaf,0xa2,0xaf,0xe4,0x33,0xf0,0xc2,0xaf,0x90,0x97,0x33,0xe0,0xfb,0xa3,0xe0, -0xfa,0xa3,0xe0,0x8b,0x24,0x8a,0x25,0xf5,0x26,0x90,0x97,0x30,0xe0,0xfb,0xa3,0xe0, -0xfa,0xa3,0xe0,0xf9,0x12,0x1c,0xd6,0xff,0xc4,0x54,0x0f,0xf5,0x27,0x7b,0x01,0x7a, -0x01,0x79,0xa2,0x12,0x79,0x27,0x90,0x97,0x36,0xe0,0x24,0xff,0x92,0xaf,0x90,0x01, -0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0x22,0x90,0x01,0xc4,0x74, -0x1c,0xf0,0x74,0x71,0xa3,0xf0,0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x7f,0x10,0x7e, -0x00,0x12,0x3a,0xa8,0x90,0x97,0x1d,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, -0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x78,0x7e,0x08,0x12,0x33,0xd8,0x90, -0x97,0x21,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, -0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x25,0xe0,0xfc,0xa3, -0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x00, -0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x29,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, -0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x33,0xd8, -0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x38,0xb6, -0x90,0x97,0x97,0xe0,0xb4,0x01,0x11,0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x03,0x2d, -0x95,0xe4,0xfd,0x7f,0x01,0x12,0x38,0xb6,0x22,0x90,0x97,0x9e,0xef,0xf0,0xa3,0xed, -0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x65,0x60,0x05,0xe4,0xff,0x12,0x7e,0x99,0x90, -0x97,0x9e,0xe0,0x30,0xe0,0x09,0x90,0x97,0xa0,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90, -0x04,0x1d,0xe0,0x60,0x1d,0x90,0x05,0x22,0xe0,0x90,0x97,0xa2,0xf0,0xe0,0xff,0x54, -0x90,0x60,0xec,0x90,0x01,0xc8,0x74,0xfc,0xf0,0xef,0x54,0x6f,0x90,0x05,0x22,0xf0, -0x80,0xdd,0x90,0x97,0x9e,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, -0xef,0xf0,0x90,0x97,0x9f,0xe0,0x60,0x10,0xa3,0xa3,0xe0,0x24,0x10,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xa0,0xa3,0xe0,0xff,0xfd,0x24, -0x08,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4, -0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, -0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xa0,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x90, -0x97,0xb5,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0,0x7f,0x10, -0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb5,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05, -0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb, -0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8, -0xf8,0xff,0x22,0x90,0x97,0xb5,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07, -0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f, -0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb5,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8, -0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x42,0xe0, -0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13, -0xd8,0xf8,0xff,0x22,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xa2, -0xaf,0xe4,0x33,0xa3,0xf0,0xc2,0xaf,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, -0xe0,0xf9,0x90,0x00,0x01,0x12,0x66,0x20,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a, -0xfe,0x90,0x97,0x46,0xa3,0xe0,0xfa,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x66,0x77, -0x12,0x1c,0xd6,0xff,0x60,0x37,0xb5,0x5e,0x1b,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0, -0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x01,0x12,0x66,0x20,0x65,0x60,0x70,0x04,0xe5,0x5f, -0x65,0xf0,0x60,0x2e,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90, -0x00,0x01,0x12,0x66,0x20,0xff,0xae,0xf0,0x12,0x7c,0xb4,0x80,0x15,0x90,0x97,0x46, -0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x12,0x1c,0xd6,0x65,0x5e,0x60,0x03,0x12, -0x7f,0x56,0x90,0x97,0x49,0xe0,0x24,0xff,0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0, -0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03, -0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xab,0xf0,0x74,0x73, -0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5, -0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74,0x40,0xf0,0x90,0x97,0x6c,0xe0,0x54,0x03,0xff, -0xbf,0x03,0x0b,0x90,0x97,0x69,0xe0,0x60,0x05,0x7f,0x01,0x12,0x44,0x7b,0xe5,0x3d, -0x30,0xe7,0x15,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x97,0x6c,0xe0,0x54,0x03,0xff, -0xbf,0x03,0x05,0x7f,0x02,0x12,0x44,0x7b,0x90,0x01,0xc4,0x74,0xab,0xf0,0x74,0x73, -0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01, -0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xef,0x60,0x34, -0x7d,0x7d,0x7f,0x02,0x12,0x39,0xbe,0x7d,0x02,0x7f,0x03,0x12,0x39,0xbe,0x90,0x01, -0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x12,0x6e,0xda, -0xe4,0xff,0x12,0x7e,0x99,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0, -0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7d,0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x7d, -0xff,0x12,0x3a,0x2f,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x2f,0x90,0x06,0x04,0xe0,0x44, -0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x97,0x83,0xe0,0xa3,0xe0,0x90, -0x05,0x58,0xf0,0xe5,0x64,0x30,0xe0,0x1b,0x90,0x97,0x81,0xe0,0x70,0x1a,0xe0,0x04, -0xf0,0x90,0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x0c,0x7d,0x01,0x7f,0x04, -0x02,0x6e,0xda,0xe4,0x90,0x97,0x81,0xf0,0x22,0x02,0x75,0x07,0x02,0x62,0xd3,0xe4, -0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,0x80, -0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,0x44, -0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,0x01, -0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x7f,0x0e,0xe4,0x7e,0x01,0x93,0x60,0xbc, -0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,0x0e, -0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3, -0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5, -0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x8f,0x0f,0x74,0x75, -0x90,0x01,0xc4,0xf0,0xa3,0x74,0x4c,0xf0,0xe5,0x0f,0x75,0xf0,0x08,0xa4,0x24,0x67, -0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0x74,0xa5,0x25,0x0f,0xf5,0x82,0xe4, -0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07,0xeb,0x25, -0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, -0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, -0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xe5,0x0f, -0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9, -0x74,0x84,0x25,0x0f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xeb,0xf0,0xff,0x22,0x90, -0x97,0x4c,0xef,0xf0,0xd3,0x94,0x07,0x50,0x33,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, -0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x7f,0x10, -0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0x4c,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, -0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x3b,0x90,0x97,0x4c,0xe0, -0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, -0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12, -0x3a,0xa8,0x90,0x97,0x4c,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, -0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, -0xa8,0x22,0x8f,0x0a,0x8d,0x0b,0xad,0x03,0x74,0x76,0x90,0x01,0xc4,0xf0,0xa3,0x74, -0x52,0xf0,0xe5,0x0b,0x54,0x1f,0xf9,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x92, -0xf5,0x83,0xe0,0xff,0x90,0x04,0xfd,0xe0,0xb4,0x01,0x05,0x75,0x0e,0x03,0x80,0x03, -0x75,0x0e,0x01,0xed,0xd3,0x95,0x0e,0x40,0x05,0xaf,0x0a,0x02,0x75,0x4c,0x90,0x01, -0xc5,0x74,0x20,0xf0,0xe5,0x0d,0x2f,0xff,0xe9,0x90,0x41,0xd6,0x93,0xfe,0xef,0xd3, -0x9e,0x40,0x22,0x90,0x01,0xc5,0x74,0x40,0xf0,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4, -0x34,0x92,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x04,0xf5, -0x83,0xe5,0x0b,0xf0,0x22,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, -0xef,0xf0,0x22,0xe4,0x90,0x97,0x2e,0xf0,0xe5,0x65,0x60,0x6c,0xe5,0x64,0x64,0x01, -0x70,0x66,0xe5,0x65,0x64,0x02,0x60,0x06,0xe5,0x65,0x64,0x03,0x70,0x1d,0x90,0x97, -0x7f,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x97,0x7f,0xe0,0x70, -0x0a,0x90,0x97,0x8a,0xe0,0x90,0x97,0x7f,0xf0,0x80,0x00,0x90,0x97,0x2e,0x74,0x01, -0xf0,0x90,0x97,0x2e,0xe0,0x60,0x31,0x90,0x97,0x8f,0xe0,0x44,0x10,0xf0,0x90,0x97, -0x85,0xe0,0xf5,0x48,0xe4,0xf5,0x49,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x38,0xec, -0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50, -0x07,0x7d,0x01,0x7f,0x04,0x12,0x6e,0xda,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0a,0x54, -0xc0,0x70,0x0e,0x90,0x97,0x89,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x02,0x6e, -0xda,0xe5,0x0a,0x30,0xe6,0x12,0x90,0x97,0x89,0x74,0x01,0xf0,0x90,0x97,0x8f,0xe0, -0x44,0x01,0xf0,0x12,0x7e,0x7e,0x80,0x07,0x90,0x97,0x8f,0xe0,0x54,0xfe,0xf0,0xe5, -0x0a,0x30,0xe7,0x29,0x90,0x97,0x89,0x74,0x01,0xf0,0x90,0x97,0x8f,0xe0,0x44,0x02, -0xf0,0x75,0x48,0x03,0xe4,0xf5,0x49,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x38,0xec, -0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x8e,0x74,0x01,0xf0,0x22,0x90,0x97,0x8f, -0xe0,0x54,0xfd,0xf0,0x22,0x90,0x00,0x2b,0xe0,0x44,0x01,0xf0,0x7f,0xe8,0x7e,0x03, -0x12,0x3a,0xa8,0x90,0x00,0x08,0xe0,0x44,0x10,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, -0xa8,0x90,0x00,0x09,0xe0,0x54,0xf7,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, -0x00,0x28,0xe0,0x54,0xfe,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x20, -0xe0,0x54,0xfe,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x25,0xe0,0x44, -0x40,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x09,0xe0,0x54,0xef,0xf0, -0x7f,0x10,0x7e,0x00,0x02,0x3a,0xa8,0x8b,0x10,0x8a,0x11,0x89,0x12,0x12,0x7e,0xcd, -0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x1c,0xd6,0xf5,0x65,0x14,0x60,0x0e,0x14,0x60, -0x0f,0x14,0x60,0x1a,0x24,0x03,0x70,0x3c,0x7f,0x01,0x80,0x35,0xe4,0xff,0x80,0x31, -0x90,0x97,0x8a,0x74,0x01,0xf0,0x90,0x97,0x7f,0xf0,0xe4,0xff,0x80,0x23,0xab,0x10, -0xaa,0x11,0xa9,0x12,0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0x90,0x97,0x8a,0x70,0x05, -0x74,0x05,0xf0,0x80,0x02,0xef,0xf0,0x90,0x97,0x8a,0xe0,0x90,0x97,0x7f,0xf0,0xe4, -0xff,0x12,0x74,0x3d,0x22,0x90,0x00,0x25,0xe0,0x54,0xbf,0xf0,0x7f,0x10,0x7e,0x00, -0x12,0x3a,0xa8,0x90,0x00,0x20,0xe0,0x44,0x01,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, -0xa8,0x90,0x00,0x28,0xe0,0x44,0x01,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, -0x00,0xf0,0xe0,0x30,0xe1,0xf9,0x90,0x00,0x09,0xe0,0x44,0x08,0xf0,0x7f,0x10,0x7e, -0x00,0x12,0x3a,0xa8,0x90,0x00,0x08,0xe0,0x54,0xef,0xf0,0x7f,0x10,0x7e,0x00,0x12, -0x3a,0xa8,0x90,0x00,0x2b,0xe0,0x54,0xfe,0xf0,0x7f,0xe8,0x7e,0x03,0x02,0x3a,0xa8, -0x90,0x00,0x45,0xe4,0xf0,0x90,0x04,0xfd,0xf0,0xa3,0xf0,0x90,0x97,0x6d,0xf0,0x90, -0x97,0x73,0xf0,0x90,0x97,0x76,0xf0,0x90,0x97,0x74,0xf0,0x90,0x97,0x77,0xf0,0x90, -0x97,0x75,0xf0,0x90,0x97,0x78,0xf0,0x90,0x97,0x5f,0x04,0xf0,0xe4,0xa3,0xf0,0xa3, -0xf0,0xa3,0xf0,0x90,0x97,0x64,0xf0,0x90,0x97,0x69,0xf0,0x90,0x97,0x6b,0xf0,0x90, -0x97,0x7d,0xf0,0x90,0x97,0x6e,0xf0,0x90,0x97,0x6a,0xf0,0x90,0x97,0x63,0xf0,0x90, -0x00,0x51,0xe0,0x44,0xc0,0xf0,0x22,0x8b,0x21,0x8a,0x22,0x89,0x23,0x90,0x97,0x98, -0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xa3,0xe5,0x24,0xf0,0xa3,0xe5,0x25,0xf0, -0xa3,0xe5,0x26,0xf0,0xaf,0x27,0x15,0x27,0xef,0x60,0x2a,0x90,0x97,0x9b,0xe0,0xfb, -0xa3,0xe4,0x75,0xf0,0x01,0x12,0x65,0xdf,0xa9,0xf0,0xfa,0x12,0x1c,0xd6,0xff,0x90, -0x97,0x98,0xe0,0xfb,0xa3,0xe4,0x75,0xf0,0x01,0x12,0x65,0xdf,0xa9,0xf0,0xfa,0xef, -0x12,0x65,0x95,0x80,0xcf,0xab,0x21,0xaa,0x22,0xa9,0x23,0x22,0x90,0x05,0x60,0xe0, -0x90,0x97,0x79,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x7a,0xf0,0x90,0x05,0x62,0xe0, -0x90,0x97,0x7b,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x7c,0xf0,0xc3,0x74,0xff,0x9f, -0xfe,0x90,0x97,0x7a,0xe0,0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff, -0x0f,0xe4,0xf0,0xa3,0xe0,0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x7c,0x80,0x03, -0x90,0x97,0x7b,0xe0,0x04,0xf0,0x22,0x90,0x97,0x7a,0xe0,0x2f,0xf0,0x22,0xe4,0xf5, -0x64,0x90,0x97,0x8f,0xf0,0xf5,0x65,0x90,0x97,0x8b,0x74,0x0c,0xf0,0x90,0x97,0x88, -0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97,0x87,0xf0,0x90,0x97,0x86,0xf0,0x90,0x97, -0x8a,0x04,0xf0,0x90,0x97,0x7f,0xf0,0xe4,0x90,0x97,0x8e,0xf0,0x90,0x97,0x89,0xf0, -0x90,0x97,0x81,0xf0,0x90,0x97,0x85,0x74,0x07,0xf0,0xe4,0x90,0x97,0x80,0xf0,0x90, -0x97,0x83,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8c,0xf0,0x22,0xe4,0x90,0x97, -0xad,0xf0,0xa3,0xf0,0x90,0x01,0xc4,0x74,0x1d,0xf0,0x74,0x7a,0xa3,0xf0,0x90,0x05, -0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03, -0x7f,0x01,0x22,0xd3,0x90,0x97,0xae,0xe0,0x94,0xe8,0x90,0x97,0xad,0xe0,0x94,0x03, -0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xae,0xe0, -0x04,0xf0,0x70,0xca,0x90,0x97,0xad,0xe0,0x04,0xf0,0x80,0xc2,0xe4,0x90,0x97,0x95, -0xf0,0xa2,0xaf,0x33,0x90,0x97,0x3b,0xf0,0x90,0x00,0x80,0xe0,0x20,0xe1,0x1a,0x12, -0x3a,0xbe,0x12,0x3a,0xbe,0x90,0x97,0x3a,0xe0,0x64,0x01,0xf0,0xe0,0x24,0x6c,0x90, -0x01,0xc4,0xf0,0x74,0x7a,0xa3,0xf0,0x80,0xdf,0x90,0x06,0x30,0x74,0x01,0xf0,0xc2, -0xaf,0x90,0x00,0x80,0xe0,0x44,0x80,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, -0x97,0x3b,0xe0,0x24,0xff,0x92,0xaf,0x22,0x90,0x01,0xc4,0x74,0xb8,0xf0,0x74,0x7a, -0xa3,0xf0,0xe5,0x55,0x70,0x37,0x90,0x97,0x8b,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x50, -0x2c,0x90,0x02,0x87,0xe0,0x70,0x26,0x90,0x97,0x96,0xe0,0xb4,0x02,0x10,0x90,0x97, -0x90,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x08,0x80,0x0f,0x90,0x01, -0xaf,0xe0,0x70,0x09,0x90,0x97,0x8c,0xe0,0x60,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22, -0x90,0x97,0x8e,0xe0,0x60,0x12,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x03, -0x70,0x33,0x90,0x97,0x89,0xf0,0x80,0x23,0x90,0x97,0x80,0xe0,0x04,0xf0,0x90,0x97, -0x8f,0xe0,0x54,0xef,0xf0,0x90,0x97,0x80,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x64, -0xb4,0x01,0x12,0xa3,0xe0,0x70,0x0e,0xe0,0x04,0xf0,0x22,0x90,0x97,0x8b,0xe0,0xff, -0x7d,0x01,0x12,0x6e,0xda,0x22,0xe4,0x90,0x97,0x3a,0xf0,0xef,0x90,0x00,0x31,0xf0, -0xee,0x54,0x03,0xff,0xa3,0xe0,0x54,0xfc,0x4f,0xf0,0xa3,0xe0,0x54,0x7f,0xf0,0x90, -0x00,0x30,0xe0,0x20,0xe7,0x0e,0x90,0x97,0x3a,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0, -0x04,0xf0,0x80,0xeb,0x90,0x97,0x3a,0xe0,0xc3,0x94,0x64,0x50,0x0a,0x90,0x00,0x30, -0xe0,0x12,0x65,0x95,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x01,0xc4,0x74,0x8a,0xf0, -0x74,0x7b,0xa3,0xf0,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x70,0x2b,0x90,0x97, -0x89,0xe0,0x64,0x01,0x60,0x23,0x90,0x97,0x8b,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x50, -0x18,0x90,0x97,0x8f,0xe0,0x20,0xe4,0x11,0x90,0x97,0x87,0xe0,0x64,0x01,0x60,0x09, -0x90,0x97,0x81,0xe0,0x70,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22,0x8f,0x66,0x90,0x01, -0xc4,0x74,0xcc,0xf0,0x74,0x7b,0xa3,0xf0,0x90,0x97,0x94,0xe0,0xff,0x7d,0x01,0x12, -0x71,0xc9,0xe5,0x66,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, -0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, -0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x01,0xf0,0x22,0x12,0x1c,0xd6,0xff,0xc3, -0x94,0x20,0x50,0x15,0x90,0x00,0x02,0x12,0x1c,0xef,0xfe,0x74,0x23,0x2f,0xf5,0x82, -0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x80,0x0e,0xef,0xb4,0x20,0x0a,0x90,0x00,0x02, -0x12,0x1c,0xef,0x90,0x93,0x61,0xf0,0x74,0x23,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5, -0x83,0xe0,0x90,0x04,0xb2,0xf0,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22, -0x74,0xff,0xf0,0x12,0x7a,0x1d,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d, -0x02,0x7f,0x03,0x12,0x3a,0x2f,0xe5,0x65,0x60,0x05,0x7f,0x01,0x12,0x7e,0x99,0x12, -0x6c,0x30,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90,0x00, -0x02,0x12,0x1c,0xef,0x90,0x97,0x6d,0xf0,0xe0,0x90,0x04,0x9b,0xf0,0x90,0x97,0x6d, -0xe0,0x60,0x04,0xe0,0xb4,0xff,0x1c,0xa2,0xaf,0xe4,0x33,0xf5,0x10,0xc2,0xaf,0x90, -0x00,0x47,0xe0,0x54,0xfb,0xf0,0x7d,0x40,0x7f,0x01,0x12,0x39,0xf8,0xe5,0x10,0x24, -0xff,0x92,0xaf,0x22,0x90,0x97,0x4a,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x5e,0x01,0x8e, -0x5f,0xf5,0x60,0x7f,0x0b,0x12,0x75,0xcf,0x12,0x7e,0x61,0xe4,0xff,0x12,0x7f,0x1b, -0x90,0x97,0x4a,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x48,0xe4,0xf5,0x49,0x7d, -0x01,0x7f,0x60,0x7e,0x01,0x02,0x38,0xec,0x7d,0x02,0x7f,0x03,0x12,0x39,0xbe,0xe5, -0x65,0x60,0x23,0x90,0x97,0x8d,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0f,0x90, -0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x6e, -0xda,0xe4,0xff,0x12,0x7e,0x99,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x1c,0xd6,0xfe, -0xaf,0x05,0xed,0x2e,0x90,0x97,0x92,0xf0,0x90,0x00,0x01,0x12,0x1c,0xef,0xff,0xed, -0x2f,0x90,0x97,0x93,0xf0,0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0xae,0x05,0xed,0x2f, -0x90,0x97,0x94,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b,0x7b,0x01, -0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x7b,0x46,0xbf,0x01,0x09,0x90,0x06, -0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x7f,0x00,0xe4,0x90,0x06,0x34, -0xf0,0x22,0x90,0x01,0xc4,0x74,0x72,0xf0,0x74,0x7d,0xa3,0xf0,0x90,0x04,0x1b,0xe0, -0x54,0x7f,0xff,0xbf,0x7f,0x14,0x90,0x97,0x87,0xe0,0x70,0x0e,0x90,0x97,0x8b,0xe0, -0x54,0x0f,0xd3,0x94,0x04,0x50,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x00,0x01, -0x12,0x1c,0xef,0x90,0x97,0x8d,0xf0,0x12,0x1c,0xd6,0x65,0x65,0x60,0x15,0xa2,0xaf, -0xe4,0x33,0x90,0x97,0x46,0xf0,0xc2,0xaf,0x12,0x78,0x17,0x90,0x97,0x46,0xe0,0x24, -0xff,0x92,0xaf,0x22,0x90,0x97,0x2e,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, -0x80,0xf0,0x90,0x97,0x33,0xe4,0xf0,0xa3,0x74,0x00,0xf0,0xa3,0x74,0x56,0xf0,0x7b, -0x01,0x7a,0x97,0x79,0x2e,0x02,0x70,0x66,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef, -0x60,0x0a,0xe5,0x64,0xb4,0x01,0x05,0xe4,0xff,0x12,0x7b,0xcc,0x90,0x97,0x88,0xe0, -0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x90,0x97,0xb2,0xef,0xf0,0x12,0x71,0x1c, -0x90,0x97,0xb2,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x88,0xe0,0x54, -0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x64, -0xb4,0x01,0x05,0x7f,0x01,0x12,0x7b,0xcc,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0, -0x44,0x04,0xf0,0x22,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0,0x12, -0x77,0xb5,0x12,0x78,0x75,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0, -0x22,0x7f,0x0b,0x12,0x72,0x6f,0xef,0x65,0x61,0x60,0x10,0xe5,0x61,0xb4,0x01,0x05, -0xe4,0xf5,0x61,0x80,0x03,0x75,0x61,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x01, -0xc4,0x74,0x7e,0xf0,0x74,0x7e,0xa3,0xf0,0x90,0x97,0x93,0xe0,0xff,0xe4,0xfd,0x12, -0x71,0xc9,0x90,0x04,0x1f,0x74,0x01,0xf0,0x22,0xef,0x60,0x0b,0x90,0x97,0x97,0xe0, -0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x97,0xe0,0xb4,0x01,0x05,0x7f,0x01, -0x12,0x4e,0x3b,0x22,0x90,0x00,0x49,0xe0,0x90,0x97,0xb4,0xf0,0xe0,0x54,0x0f,0xf0, -0xe0,0xff,0x44,0xf0,0x90,0x00,0x49,0xf0,0xef,0x44,0xb0,0xf0,0x22,0xe4,0x90,0x97, -0x8e,0xf0,0x90,0x97,0x80,0xf0,0x90,0x97,0x89,0xf0,0x90,0x97,0x8f,0xf0,0x22,0xe5, -0x5e,0xb4,0x01,0x0b,0x12,0x7e,0x61,0xbf,0x01,0x05,0x7f,0x01,0x12,0x7f,0x1b,0x22, -0x90,0x09,0x28,0xef,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22, -0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x41,0x97, -0xb1,0x00,0x41,0x97,0x7e,0x80,0x41,0x97,0xb3,0x00,0x00,0x90,0x01,0xca,0xe5,0x61, -0xf0,0xef,0x60,0x03,0x12,0x7e,0xb4,0x22,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0, -0xa3,0xe9,0xf0,0x22,0x90,0x97,0xa7,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22, -0x90,0x97,0xaa,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0x8f,0x82,0x8e,0x83, -0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x5e,0x7f,0x60,0x7e,0x01,0x02,0x7f,0x4c, -0x90,0x97,0x97,0xe0,0x90,0x97,0x2d,0xf0,0x22,0x8f,0x1b,0x8c,0x1c,0x8d,0x1d,0x22, -0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x12,0x1c,0xd6,0xf5,0x64,0x22,0x22,0x52,0x09, -}; - -u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength] = { -0x024,0x0011800d, -0x028,0x00ffdb83, -0x800,0x80040002, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x01000100, -0x82c,0x00390004, -0x830,0x27272727, -0x834,0x27272727, -0x838,0x27272727, -0x83c,0x27272727, -0x840,0x00010000, -0x844,0x00010000, -0x848,0x27272727, -0x84c,0x27272727, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x0c1b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x27272727, -0x86c,0x2b2b2b27, -0x870,0x07000700, -0x874,0x22184000, -0x878,0x08080808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xcc0000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121313, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05633, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x6954341e, -0xc54,0x43bc0094, -0xc58,0x6954341e, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x0186115b, -0xc78,0x0000001f, -0xc7c,0x00b99612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020403, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000010, -0xe68,0x001b25a4, -0xe6c,0x63db25a4, -0xe70,0x63db25a4, -0xe74,0x0c1b25a4, -0xe78,0x0c1b25a4, -0xe7c,0x0c1b25a4, -0xe80,0x0c1b25a4, -0xe84,0x63db25a4, -0xe88,0x0c1b25a4, -0xe8c,0x63db25a4, -0xed0,0x63db25a4, -0xed4,0x63db25a4, -0xed8,0x63db25a4, -0xedc,0x001b25a4, -0xee0,0x001b25a4, -0xeec,0x6fdb25a4, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength] = { -0x024,0x0011800d, -0x028,0x00ffdb83, -0x800,0x80040000, -0x804,0x00000001, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000700, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x6954341e, -0xc54,0x43bc0094, -0xc58,0x6954341e, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength] = { -0x0, }; - -u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength] = { -0x0, }; - -u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength] = { -0x0, }; - -u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength] = { -0xe00,0xffffffff,0x07090c0c, -0xe04,0xffffffff,0x01020405, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x0b0c0c0e, -0xe14,0xffffffff,0x01030506, -0xe18,0xffffffff,0x0b0c0d0e, -0xe1c,0xffffffff,0x01030509, -0x830,0xffffffff,0x07090c0c, -0x834,0xffffffff,0x01020405, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x0b0c0d0e, -0x848,0xffffffff,0x01030509, -0x84c,0xffffffff,0x0b0c0d0e, -0x868,0xffffffff,0x01030509, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x06060606, -0xe14,0xffffffff,0x00020406, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x06060606, -0x848,0xffffffff,0x00020406, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength] = { -0xe00,0xffffffff,0x0a0c0c0c, -0xe04,0xffffffff,0x02040608, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x0a0c0d0e, -0xe14,0xffffffff,0x02040608, -0xe18,0xffffffff,0x0a0c0d0e, -0xe1c,0xffffffff,0x02040608, -0x830,0xffffffff,0x0a0c0c0c, -0x834,0xffffffff,0x02040608, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x0a0c0d0e, -0x848,0xffffffff,0x02040608, -0x84c,0xffffffff,0x0a0c0d0e, -0x868,0xffffffff,0x02040608, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x06060606, -0xe14,0xffffffff,0x00020406, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x06060606, -0x848,0xffffffff,0x00020406, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x04040404, -0xe04,0xffffffff,0x00020204, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x04040404, -0x834,0xffffffff,0x00020204, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength] = { -0xc30,0x69e9ac4a, -0xc3c,0x0a979718, -}; - -u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength] = { -0x024,0x0011800f, -0x028,0x00ffdb83, -0x040,0x000c0004, -0x800,0x80040000, -0x804,0x00000001, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390204, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x20202000, -0x870,0x03000300, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00ffc3f1, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x15160000, -0xa24,0x070b0f12, -0xa28,0x00000104, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x6954342e, -0xc54,0x43bc0094, -0xc58,0x6954342f, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c46000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x24000090, -0xc84,0x20f60000, -0xc88,0x24000090, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x24242424, -0xe04,0x24242424, -0xe08,0x03902024, -0xe10,0x24242424, -0xe14,0x24242424, -0xe18,0x24242424, -0xe1c,0x24242424, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xee8,0x31555448, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength] = { -0x024,0x0011800d, -0x028,0x00ffdb83, -0x800,0x80040000, -0x804,0x00000001, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x00000000, -0x82c,0x00000000, -0x830,0x00000000, -0x834,0x00000000, -0x838,0x00000000, -0x83c,0x00000000, -0x840,0x00010000, -0x844,0x00000000, -0x848,0x00000000, -0x84c,0x00000000, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x001b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x00000000, -0x86c,0x32323200, -0x870,0x07000700, -0x874,0x22004000, -0x878,0x00000808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xccc000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121111, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05611, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x6954341e, -0xc54,0x43bc0094, -0xc58,0x6954341e, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020401, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000008, -0xe68,0x001b25a4, -0xe6c,0x631b25a0, -0xe70,0x631b25a0, -0xe74,0x081b25a0, -0xe78,0x081b25a0, -0xe7c,0x081b25a0, -0xe80,0x081b25a0, -0xe84,0x631b25a0, -0xe88,0x081b25a0, -0xe8c,0x631b25a0, -0xed0,0x631b25a0, -0xed4,0x631b25a0, -0xed8,0x631b25a0, -0xedc,0x001b25a0, -0xee0,0x001b25a0, -0xeec,0x6b1b25a0, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength] = { -0x024,0x0011800d, -0x028,0x00ffdb83, -0x800,0x80040002, -0x804,0x00000003, -0x808,0x0000fc00, -0x80c,0x0000000a, -0x810,0x10005388, -0x814,0x020c3d10, -0x818,0x02200385, -0x81c,0x00000000, -0x820,0x01000100, -0x824,0x00390004, -0x828,0x01000100, -0x82c,0x00390004, -0x830,0x27272727, -0x834,0x27272727, -0x838,0x27272727, -0x83c,0x27272727, -0x840,0x00010000, -0x844,0x00010000, -0x848,0x27272727, -0x84c,0x27272727, -0x850,0x00000000, -0x854,0x00000000, -0x858,0x569a569a, -0x85c,0x0c1b25a4, -0x860,0x66e60230, -0x864,0x061f0130, -0x868,0x27272727, -0x86c,0x2b2b2b27, -0x870,0x07000700, -0x874,0x22184000, -0x878,0x08080808, -0x87c,0x00000000, -0x880,0xc0083070, -0x884,0x000004d5, -0x888,0x00000000, -0x88c,0xcc0000c0, -0x890,0x00000800, -0x894,0xfffffffe, -0x898,0x40302010, -0x89c,0x00706050, -0x900,0x00000000, -0x904,0x00000023, -0x908,0x00000000, -0x90c,0x81121313, -0xa00,0x00d047c8, -0xa04,0x80ff000c, -0xa08,0x8c838300, -0xa0c,0x2e68120f, -0xa10,0x9500bb78, -0xa14,0x11144028, -0xa18,0x00881117, -0xa1c,0x89140f00, -0xa20,0x1a1b0000, -0xa24,0x090e1317, -0xa28,0x00000204, -0xa2c,0x00d30000, -0xa70,0x101fbf00, -0xa74,0x00000007, -0xc00,0x48071d40, -0xc04,0x03a05633, -0xc08,0x000000e4, -0xc0c,0x6c6c6c6c, -0xc10,0x08800000, -0xc14,0x40000100, -0xc18,0x08800000, -0xc1c,0x40000100, -0xc20,0x00000000, -0xc24,0x00000000, -0xc28,0x00000000, -0xc2c,0x00000000, -0xc30,0x69e9ac44, -0xc34,0x469652cf, -0xc38,0x49795994, -0xc3c,0x0a97971c, -0xc40,0x1f7c403f, -0xc44,0x000100b7, -0xc48,0xec020107, -0xc4c,0x007f037f, -0xc50,0x6954341e, -0xc54,0x43bc0094, -0xc58,0x6954341e, -0xc5c,0x433c0094, -0xc60,0x00000000, -0xc64,0x5116848b, -0xc68,0x47c00bff, -0xc6c,0x00000036, -0xc70,0x2c7f000d, -0xc74,0x018610db, -0xc78,0x0000001f, -0xc7c,0x00b91612, -0xc80,0x40000100, -0xc84,0x20f60000, -0xc88,0x40000100, -0xc8c,0x20200000, -0xc90,0x00121820, -0xc94,0x00000000, -0xc98,0x00121820, -0xc9c,0x00007f7f, -0xca0,0x00000000, -0xca4,0x00000080, -0xca8,0x00000000, -0xcac,0x00000000, -0xcb0,0x00000000, -0xcb4,0x00000000, -0xcb8,0x00000000, -0xcbc,0x28000000, -0xcc0,0x00000000, -0xcc4,0x00000000, -0xcc8,0x00000000, -0xccc,0x00000000, -0xcd0,0x00000000, -0xcd4,0x00000000, -0xcd8,0x64b22427, -0xcdc,0x00766932, -0xce0,0x00222222, -0xce4,0x00000000, -0xce8,0x37644302, -0xcec,0x2f97d40c, -0xd00,0x00080740, -0xd04,0x00020403, -0xd08,0x0000907f, -0xd0c,0x20010201, -0xd10,0xa0633333, -0xd14,0x3333bc43, -0xd18,0x7a8f5b6b, -0xd2c,0xcc979975, -0xd30,0x00000000, -0xd34,0x80608000, -0xd38,0x00000000, -0xd3c,0x00027293, -0xd40,0x00000000, -0xd44,0x00000000, -0xd48,0x00000000, -0xd4c,0x00000000, -0xd50,0x6437140a, -0xd54,0x00000000, -0xd58,0x00000000, -0xd5c,0x30032064, -0xd60,0x4653de68, -0xd64,0x04518a3c, -0xd68,0x00002101, -0xd6c,0x2a201c16, -0xd70,0x1812362e, -0xd74,0x322c2220, -0xd78,0x000e3c24, -0xe00,0x2a2a2a2a, -0xe04,0x2a2a2a2a, -0xe08,0x03902a2a, -0xe10,0x2a2a2a2a, -0xe14,0x2a2a2a2a, -0xe18,0x2a2a2a2a, -0xe1c,0x2a2a2a2a, -0xe28,0x00000000, -0xe30,0x1000dc1f, -0xe34,0x10008c1f, -0xe38,0x02140102, -0xe3c,0x681604c2, -0xe40,0x01007c00, -0xe44,0x01004800, -0xe48,0xfb000000, -0xe4c,0x000028d1, -0xe50,0x1000dc1f, -0xe54,0x10008c1f, -0xe58,0x02140102, -0xe5c,0x28160d05, -0xe60,0x00000010, -0xe68,0x001b25a4, -0xe6c,0x63db25a4, -0xe70,0x63db25a4, -0xe74,0x0c1b25a4, -0xe78,0x0c1b25a4, -0xe7c,0x0c1b25a4, -0xe80,0x0c1b25a4, -0xe84,0x63db25a4, -0xe88,0x0c1b25a4, -0xe8c,0x63db25a4, -0xed0,0x63db25a4, -0xed4,0x63db25a4, -0xed8,0x63db25a4, -0xedc,0x001b25a4, -0xee0,0x001b25a4, -0xeec,0x6fdb25a4, -0xf14,0x00000003, -0xf4c,0x00000000, -0xf00,0x00000300, -}; - -u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength] = { -0xe00,0xffffffff,0x06080808, -0xe04,0xffffffff,0x00040406, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x04060608, -0xe14,0xffffffff,0x00020204, -0xe18,0xffffffff,0x04060608, -0xe1c,0xffffffff,0x00020204, -0x830,0xffffffff,0x06080808, -0x834,0xffffffff,0x00040406, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x04060608, -0x848,0xffffffff,0x00020204, -0x84c,0xffffffff,0x04060608, -0x868,0xffffffff,0x00020204, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -0xe00,0xffffffff,0x00000000, -0xe04,0xffffffff,0x00000000, -0xe08,0x0000ff00,0x00000000, -0x86c,0xffffff00,0x00000000, -0xe10,0xffffffff,0x00000000, -0xe14,0xffffffff,0x00000000, -0xe18,0xffffffff,0x00000000, -0xe1c,0xffffffff,0x00000000, -0x830,0xffffffff,0x00000000, -0x834,0xffffffff,0x00000000, -0x838,0xffffff00,0x00000000, -0x86c,0x000000ff,0x00000000, -0x83c,0xffffffff,0x00000000, -0x848,0xffffffff,0x00000000, -0x84c,0xffffffff,0x00000000, -0x868,0xffffffff,0x00000000, -}; - -u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287af, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x00014297, -0x013,0x00010295, -0x013,0x0000c298, -0x013,0x0000819c, -0x013,0x000040a8, -0x013,0x0000001c, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -}; - -u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f405, -0x015,0x0004f405, -0x015,0x0008f405, -0x015,0x000cf405, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength] = { -0x0, }; - - -u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb1, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e52c, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00010255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x00000000, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f200, -0x027,0x000ec7d9, -0x028,0x000577c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x00032000, -0x012,0x00071000, -0x012,0x000b0000, -0x012,0x000fc000, -0x013,0x000287b3, -0x013,0x000244b7, -0x013,0x000204ab, -0x013,0x0001c49f, -0x013,0x00018493, -0x013,0x0001429b, -0x013,0x00010299, -0x013,0x0000c29c, -0x013,0x000081a0, -0x013,0x000040ac, -0x013,0x00000020, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f424, -0x015,0x0004f424, -0x015,0x0008f424, -0x015,0x000cf424, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength] = { -0x0, }; - -u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength] = { -0x000,0x00030159, -0x001,0x00031284, -0x002,0x00098000, -0x003,0x00018c63, -0x004,0x000210e7, -0x009,0x0002044f, -0x00a,0x0001adb0, -0x00b,0x00054867, -0x00c,0x0008992e, -0x00d,0x0000e529, -0x00e,0x00039ce7, -0x00f,0x00000451, -0x019,0x00000000, -0x01a,0x00000255, -0x01b,0x00060a00, -0x01c,0x000fc378, -0x01d,0x000a1250, -0x01e,0x0004445f, -0x01f,0x00080001, -0x020,0x0000b614, -0x021,0x0006c000, -0x022,0x0000083c, -0x023,0x00001558, -0x024,0x00000060, -0x025,0x00000483, -0x026,0x0004f000, -0x027,0x000ec7d9, -0x028,0x000977c0, -0x029,0x00004783, -0x02a,0x00000001, -0x02b,0x00021334, -0x02a,0x00000000, -0x02b,0x00000054, -0x02a,0x00000001, -0x02b,0x00000808, -0x02b,0x00053333, -0x02c,0x0000000c, -0x02a,0x00000002, -0x02b,0x00000808, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000003, -0x02b,0x00000808, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000004, -0x02b,0x00000808, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x00000005, -0x02b,0x00000808, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x00000006, -0x02b,0x00000709, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x00000007, -0x02b,0x00000709, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x00000008, -0x02b,0x0000060a, -0x02b,0x0004b333, -0x02c,0x0000000d, -0x02a,0x00000009, -0x02b,0x0000060a, -0x02b,0x00053333, -0x02c,0x0000000d, -0x02a,0x0000000a, -0x02b,0x0000060a, -0x02b,0x0005b333, -0x02c,0x0000000d, -0x02a,0x0000000b, -0x02b,0x0000060a, -0x02b,0x00063333, -0x02c,0x0000000d, -0x02a,0x0000000c, -0x02b,0x0000060a, -0x02b,0x0006b333, -0x02c,0x0000000d, -0x02a,0x0000000d, -0x02b,0x0000060a, -0x02b,0x00073333, -0x02c,0x0000000d, -0x02a,0x0000000e, -0x02b,0x0000050b, -0x02b,0x00066666, -0x02c,0x0000001a, -0x02a,0x000e0000, -0x010,0x0004000f, -0x011,0x000e31fc, -0x010,0x0006000f, -0x011,0x000ff9f8, -0x010,0x0002000f, -0x011,0x000203f9, -0x010,0x0003000f, -0x011,0x000ff500, -0x010,0x00000000, -0x011,0x00000000, -0x010,0x0008000f, -0x011,0x0003f100, -0x010,0x0009000f, -0x011,0x00023100, -0x012,0x000d8000, -0x012,0x00090000, -0x012,0x00051000, -0x012,0x00012000, -0x013,0x00028fb4, -0x013,0x00024fa8, -0x013,0x000207a4, -0x013,0x0001c798, -0x013,0x000183a4, -0x013,0x00014398, -0x013,0x000101a4, -0x013,0x0000c198, -0x013,0x000080a4, -0x013,0x00004098, -0x013,0x00000000, -0x014,0x0001944c, -0x014,0x00059444, -0x014,0x0009944c, -0x014,0x000d9444, -0x015,0x0000f405, -0x015,0x0004f405, -0x015,0x0008f405, -0x015,0x000cf405, -0x016,0x000e0330, -0x016,0x000a0330, -0x016,0x00060330, -0x016,0x00020330, -0x000,0x00010159, -0x018,0x0000f401, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01f,0x00080003, -0x0fe,0x00000000, -0x0fe,0x00000000, -0x01e,0x00044457, -0x01f,0x00080000, -0x000,0x00030159, -}; - -u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength] = { -0x0, }; - -// MAC reg V13 - 2010-12-07 -u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength] = { -0x420,0x00000080, -0x423,0x00000000, -0x430,0x00000000, -0x431,0x00000000, -0x432,0x00000000, -0x433,0x00000001, -0x434,0x00000004, -0x435,0x00000005, -0x436,0x00000006, -0x437,0x00000007, -0x438,0x00000000, -0x439,0x00000000, -0x43a,0x00000000, -0x43b,0x00000001, -0x43c,0x00000004, -0x43d,0x00000005, -0x43e,0x00000006, -0x43f,0x00000007, -0x440,0x0000005d, -0x441,0x00000001, -0x442,0x00000000, -0x444,0x00000015, -0x445,0x000000f0, -0x446,0x0000000f, -0x447,0x00000000, -0x458,0x00000041, -0x459,0x000000a8, -0x45a,0x00000072, -0x45b,0x000000b9, -0x460,0x00000066, -0x461,0x00000066, -0x462,0x00000008, -0x463,0x00000003, -0x4c8,0x000000ff, -0x4c9,0x00000008, -0x4cc,0x000000ff, -0x4cd,0x000000ff, -0x4ce,0x00000001, -0x500,0x00000026, -0x501,0x000000a2, -0x502,0x0000002f, -0x503,0x00000000, -0x504,0x00000028, -0x505,0x000000a3, -0x506,0x0000005e, -0x507,0x00000000, -0x508,0x0000002b, -0x509,0x000000a4, -0x50a,0x0000005e, -0x50b,0x00000000, -0x50c,0x0000004f, -0x50d,0x000000a4, -0x50e,0x00000000, -0x50f,0x00000000, -0x512,0x0000001c, -0x514,0x0000000a, -0x515,0x00000010, -0x516,0x0000000a, -0x517,0x00000010, -0x51a,0x00000016, -0x524,0x0000000f, -0x525,0x0000004f, -0x546,0x00000040, -0x547,0x00000000, -0x550,0x00000010, -0x551,0x00000010, -0x559,0x00000002, -0x55a,0x00000002, -0x55d,0x000000ff, -0x605,0x00000030, -0x608,0x0000000e, -0x609,0x0000002a, -0x652,0x00000020, -0x63c,0x0000000a, -0x63d,0x0000000e, -0x63e,0x0000000a, -0x63f,0x0000000e, -0x66e,0x00000005, -0x700,0x00000021, -0x701,0x00000043, -0x702,0x00000065, -0x703,0x00000087, -0x708,0x00000021, -0x709,0x00000043, -0x70a,0x00000065, -0x70b,0x00000087, -}; - -u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength] = { -0x0, }; - -u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - -u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7a060001, -0xc78,0x79070001, -0xc78,0x78080001, -0xc78,0x77090001, -0xc78,0x760a0001, -0xc78,0x750b0001, -0xc78,0x740c0001, -0xc78,0x730d0001, -0xc78,0x720e0001, -0xc78,0x710f0001, -0xc78,0x70100001, -0xc78,0x6f110001, -0xc78,0x6e120001, -0xc78,0x6d130001, -0xc78,0x6c140001, -0xc78,0x6b150001, -0xc78,0x6a160001, -0xc78,0x69170001, -0xc78,0x68180001, -0xc78,0x67190001, -0xc78,0x661a0001, -0xc78,0x651b0001, -0xc78,0x641c0001, -0xc78,0x631d0001, -0xc78,0x621e0001, -0xc78,0x611f0001, -0xc78,0x60200001, -0xc78,0x49210001, -0xc78,0x48220001, -0xc78,0x47230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7a460001, -0xc78,0x79470001, -0xc78,0x78480001, -0xc78,0x77490001, -0xc78,0x764a0001, -0xc78,0x754b0001, -0xc78,0x744c0001, -0xc78,0x734d0001, -0xc78,0x724e0001, -0xc78,0x714f0001, -0xc78,0x70500001, -0xc78,0x6f510001, -0xc78,0x6e520001, -0xc78,0x6d530001, -0xc78,0x6c540001, -0xc78,0x6b550001, -0xc78,0x6a560001, -0xc78,0x69570001, -0xc78,0x68580001, -0xc78,0x67590001, -0xc78,0x665a0001, -0xc78,0x655b0001, -0xc78,0x645c0001, -0xc78,0x635d0001, -0xc78,0x625e0001, -0xc78,0x615f0001, -0xc78,0x60600001, -0xc78,0x49610001, -0xc78,0x48620001, -0xc78,0x47630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - -u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength] = { -0xc78,0x7b000001, -0xc78,0x7b010001, -0xc78,0x7b020001, -0xc78,0x7b030001, -0xc78,0x7b040001, -0xc78,0x7b050001, -0xc78,0x7b060001, -0xc78,0x7b070001, -0xc78,0x7b080001, -0xc78,0x7a090001, -0xc78,0x790a0001, -0xc78,0x780b0001, -0xc78,0x770c0001, -0xc78,0x760d0001, -0xc78,0x750e0001, -0xc78,0x740f0001, -0xc78,0x73100001, -0xc78,0x72110001, -0xc78,0x71120001, -0xc78,0x70130001, -0xc78,0x6f140001, -0xc78,0x6e150001, -0xc78,0x6d160001, -0xc78,0x6c170001, -0xc78,0x6b180001, -0xc78,0x6a190001, -0xc78,0x691a0001, -0xc78,0x681b0001, -0xc78,0x671c0001, -0xc78,0x661d0001, -0xc78,0x651e0001, -0xc78,0x641f0001, -0xc78,0x63200001, -0xc78,0x62210001, -0xc78,0x61220001, -0xc78,0x60230001, -0xc78,0x46240001, -0xc78,0x45250001, -0xc78,0x44260001, -0xc78,0x43270001, -0xc78,0x42280001, -0xc78,0x41290001, -0xc78,0x402a0001, -0xc78,0x262b0001, -0xc78,0x252c0001, -0xc78,0x242d0001, -0xc78,0x232e0001, -0xc78,0x222f0001, -0xc78,0x21300001, -0xc78,0x20310001, -0xc78,0x06320001, -0xc78,0x05330001, -0xc78,0x04340001, -0xc78,0x03350001, -0xc78,0x02360001, -0xc78,0x01370001, -0xc78,0x00380001, -0xc78,0x00390001, -0xc78,0x003a0001, -0xc78,0x003b0001, -0xc78,0x003c0001, -0xc78,0x003d0001, -0xc78,0x003e0001, -0xc78,0x003f0001, -0xc78,0x7b400001, -0xc78,0x7b410001, -0xc78,0x7b420001, -0xc78,0x7b430001, -0xc78,0x7b440001, -0xc78,0x7b450001, -0xc78,0x7b460001, -0xc78,0x7b470001, -0xc78,0x7b480001, -0xc78,0x7a490001, -0xc78,0x794a0001, -0xc78,0x784b0001, -0xc78,0x774c0001, -0xc78,0x764d0001, -0xc78,0x754e0001, -0xc78,0x744f0001, -0xc78,0x73500001, -0xc78,0x72510001, -0xc78,0x71520001, -0xc78,0x70530001, -0xc78,0x6f540001, -0xc78,0x6e550001, -0xc78,0x6d560001, -0xc78,0x6c570001, -0xc78,0x6b580001, -0xc78,0x6a590001, -0xc78,0x695a0001, -0xc78,0x685b0001, -0xc78,0x675c0001, -0xc78,0x665d0001, -0xc78,0x655e0001, -0xc78,0x645f0001, -0xc78,0x63600001, -0xc78,0x62610001, -0xc78,0x61620001, -0xc78,0x60630001, -0xc78,0x46640001, -0xc78,0x45650001, -0xc78,0x44660001, -0xc78,0x43670001, -0xc78,0x42680001, -0xc78,0x41690001, -0xc78,0x406a0001, -0xc78,0x266b0001, -0xc78,0x256c0001, -0xc78,0x246d0001, -0xc78,0x236e0001, -0xc78,0x226f0001, -0xc78,0x21700001, -0xc78,0x20710001, -0xc78,0x06720001, -0xc78,0x05730001, -0xc78,0x04740001, -0xc78,0x03750001, -0xc78,0x02760001, -0xc78,0x01770001, -0xc78,0x00780001, -0xc78,0x00790001, -0xc78,0x007a0001, -0xc78,0x007b0001, -0xc78,0x007c0001, -0xc78,0x007d0001, -0xc78,0x007e0001, -0xc78,0x007f0001, -0xc78,0x3800001e, -0xc78,0x3801001e, -0xc78,0x3802001e, -0xc78,0x3803001e, -0xc78,0x3804001e, -0xc78,0x3805001e, -0xc78,0x3806001e, -0xc78,0x3807001e, -0xc78,0x3808001e, -0xc78,0x3c09001e, -0xc78,0x3e0a001e, -0xc78,0x400b001e, -0xc78,0x440c001e, -0xc78,0x480d001e, -0xc78,0x4c0e001e, -0xc78,0x500f001e, -0xc78,0x5210001e, -0xc78,0x5611001e, -0xc78,0x5a12001e, -0xc78,0x5e13001e, -0xc78,0x6014001e, -0xc78,0x6015001e, -0xc78,0x6016001e, -0xc78,0x6217001e, -0xc78,0x6218001e, -0xc78,0x6219001e, -0xc78,0x621a001e, -0xc78,0x621b001e, -0xc78,0x621c001e, -0xc78,0x621d001e, -0xc78,0x621e001e, -0xc78,0x621f001e, -}; - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c deleted file mode 100755 index 7102231b99ff..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c +++ /dev/null @@ -1,2659 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ - -#include "drv_types.h" -#include "rtl8192c_hal.h" - -//================================================================================ -// Constant. -//================================================================================ - -// -// Default LED behavior. -// -#define LED_BLINK_NORMAL_INTERVAL 100 -#define LED_BLINK_SLOWLY_INTERVAL 200 -#define LED_BLINK_LONG_INTERVAL 400 - -#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000 -#define LED_BLINK_LINK_INTERVAL_ALPHA 500 //500 -#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 //150 -#define LED_BLINK_FASTER_INTERVAL_ALPHA 50 -#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000 - -//================================================================================ -// LED object. -//================================================================================ - - -//================================================================================ -// Prototype of protected function. -//================================================================================ - - -static void -BlinkTimerCallback( - unsigned long data - ); - -static void -BlinkWorkItemCallback( - struct work_struct *work - ); - -//================================================================================ -// LED_819xUsb routines. -//================================================================================ - -// -// Description: -// Initialize an LED_871x object. -// -static void -InitLed871x( - _adapter *padapter, - PLED_871x pLed, - LED_PIN_871x LedPin - ) -{ - pLed->padapter = padapter; - - pLed->LedPin = LedPin; - - pLed->CurrLedState = LED_OFF; - pLed->bLedOn = _FALSE; - - pLed->bLedBlinkInProgress = _FALSE; - pLed->BlinkTimes = 0; - pLed->BlinkingLedState = LED_UNKNOWN; - - _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); - - _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); -} - - -// -// Description: -// DeInitialize an LED_871x object. -// -static void -DeInitLed871x( - PLED_871x pLed - ) -{ - _cancel_timer_ex(&(pLed->BlinkTimer)); - - // We should reset bLedBlinkInProgress if we cancel the LedControlTimer, 2005.03.10, by rcnjko. - pLed->bLedBlinkInProgress = _FALSE; -} - - -// -// Description: -// Turn on LED according to LedPin specified. -// -static void -SwLedOn( - _adapter *padapter, - PLED_871x pLed -) -{ - u8 LedCfg; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - return; - } - - if( (BOARD_MINICARD == pHalData->BoardType )|| - (BOARD_USB_SOLO == pHalData->BoardType)|| - (BOARD_USB_COMBO == pHalData->BoardType)) - { - LedCfg = rtw_read8(padapter, REG_LEDCFG2); - switch(pLed->LedPin) - { - case LED_PIN_GPIO0: - break; - - case LED_PIN_LED0: - rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xf0)|BIT5|BIT6); // SW control led0 on. - break; - - case LED_PIN_LED1: - rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0x0f)|BIT5); // SW control led1 on. - break; - - default: - break; - - } - } - else - { - switch(pLed->LedPin) - { - case LED_PIN_GPIO0: - break; - - case LED_PIN_LED0: -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - if(pHalData->AntDivCfg) - { - LedCfg = rtw_read8(padapter, REG_LEDCFG2); - rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xe0)|BIT7|BIT6|BIT5); // SW control led0 on. - //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2))); - } - else -#endif - { - LedCfg = rtw_read8(padapter, REG_LEDCFG0); - rtw_write8(padapter,REG_LEDCFG0, LedCfg&0x70); // SW control led0 on. - //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); - } - break; - - case LED_PIN_LED1: - LedCfg = rtw_read8(padapter,(REG_LEDCFG1)); - rtw_write8(padapter,(REG_LEDCFG1), LedCfg&0x70); // SW control led1 on. - //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); - - break; - - default: - break; - } - } - pLed->bLedOn = _TRUE; - -} - - -// -// Description: -// Turn off LED according to LedPin specified. -// -static void -SwLedOff( - _adapter *padapter, - PLED_871x pLed -) -{ - u8 LedCfg; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if((padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - return; - } - - if( (BOARD_MINICARD == pHalData->BoardType )|| - (BOARD_USB_SOLO == pHalData->BoardType)|| - (BOARD_USB_COMBO == pHalData->BoardType)) - { - LedCfg = rtw_read8(padapter, REG_LEDCFG2);//0x4E - - switch(pLed->LedPin) - { - - case LED_PIN_GPIO0: - break; - - case LED_PIN_LED0: - if(BOARD_USB_COMBO == pHalData->BoardType) - { - LedCfg &= 0x90; // Set to software control. - rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3)); - LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG); - LedCfg &= 0xFE; - rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg); - } - else - { - LedCfg &= 0xf0; // Set to software control. - if(pHalData->bLedOpenDrain == _TRUE) // Open-drain arrangement for controlling the LED - rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT1|BIT5|BIT6)); - else - rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT5|BIT6)); - } - break; - - case LED_PIN_LED1: - LedCfg &= 0x0f; // Set to software control. - rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3)); - break; - - default: - break; - } - } - else - { - switch(pLed->LedPin) - { - case LED_PIN_GPIO0: - break; - - case LED_PIN_LED0: -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - if(pHalData->AntDivCfg) - { - LedCfg = rtw_read8(padapter, REG_LEDCFG2); - LedCfg &= 0xe0; // Set to software control. - rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT7|BIT6|BIT5)); - //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2))); - } - else -#endif - { - LedCfg = rtw_read8(padapter, REG_LEDCFG0); - LedCfg &= 0x70; // Set to software control. - rtw_write8(padapter, REG_LEDCFG0, (LedCfg|BIT3)); - //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); - } - break; - - case LED_PIN_LED1: - LedCfg = rtw_read8(padapter, (REG_LEDCFG1)); - LedCfg &= 0x70; // Set to software control. - rtw_write8(padapter, (REG_LEDCFG1), (LedCfg|BIT3)); - //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); - break; - - default: - break; - } - } - - pLed->bLedOn = _FALSE; - -} - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ - - -// -// Description: -// Implementation of LED blinking behavior. -// It toggle off LED and schedule corresponding timer if necessary. -// -static void -SwLedBlink( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - // Determine if we shall change LED state again. - pLed->BlinkTimes--; - switch(pLed->CurrLedState) - { - - case LED_BLINK_NORMAL: - if(pLed->BlinkTimes == 0) - { - bStopBlinking = _TRUE; - } - break; - - case LED_BLINK_StartToBlink: - if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) - { - bStopBlinking = _TRUE; - } - if( check_fwstate(pmlmepriv, _FW_LINKED) && - (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) ) - { - bStopBlinking = _TRUE; - } - else if(pLed->BlinkTimes == 0) - { - bStopBlinking = _TRUE; - } - break; - - case LED_BLINK_WPS: - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - break; - - - default: - bStopBlinking = _TRUE; - break; - - } - - if(bStopBlinking) - { - //if( padapter->pwrctrlpriv.cpwm >= PS_STATE_S2) - if(0) - { - SwLedOff(padapter, pLed); - } - else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE)) - { - SwLedOn(padapter, pLed); - } - else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && pLed->bLedOn == _TRUE) - { - SwLedOff(padapter, pLed); - } - - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - // Assign LED state to toggle. - if( pLed->BlinkingLedState == LED_ON ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - - // Schedule a timer to toggle LED state. - switch( pLed->CurrLedState ) - { - case LED_BLINK_NORMAL: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_SLOWLY: - case LED_BLINK_StartToBlink: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - break; - - case LED_BLINK_WPS: - { - if( pLed->BlinkingLedState == LED_ON ) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - else - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - break; - - default: - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - break; - } - } -} - - -static void -SwLedBlink1( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - PLED_871x pLed1 = &(ledpriv->SwLed1); - u8 bStopBlinking = _FALSE; - - if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - - if(pHalData->EEPROMCustomerID == RT_CID_DEFAULT) - { - if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - if(!pLed1->bSWLedCtrl) - { - SwLedOn(padapter, pLed1); - pLed1->bSWLedCtrl = _TRUE; - } - else if(!pLed1->bLedOn) - SwLedOn(padapter, pLed1); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n")); - } - else - { - if(!pLed1->bSWLedCtrl) - { - SwLedOff(padapter, pLed1); - pLed1->bSWLedCtrl = _TRUE; - } - else if(pLed1->bLedOn) - SwLedOff(padapter, pLed1); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n")); - } - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_NORMAL: - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - break; - - case LED_SCAN_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_TXRX_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - break; - - case LED_BLINK_WPS_STOP: //WPS success - if(pLed->BlinkingLedState == LED_ON) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - bStopBlinking = _FALSE; - } - else - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedWPSBlinkInProgress = _FALSE; - } - break; - - default: - break; - } - -} - -static void -SwLedBlink2( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_SCAN_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_TXRX_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); - - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - -} - -static void -SwLedBlink3( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - if(pLed->CurrLedState != LED_BLINK_WPS_STOP) - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_SCAN_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - if( !pLed->bLedOn ) - SwLedOn(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - if( pLed->bLedOn ) - SwLedOff(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_TXRX_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) - { - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - - if( !pLed->bLedOn ) - SwLedOn(padapter, pLed); - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - - if( pLed->bLedOn ) - SwLedOff(padapter, pLed); - - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - break; - - case LED_BLINK_WPS_STOP: //WPS success - if(pLed->BlinkingLedState == LED_ON) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - bStopBlinking = _FALSE; - } - else - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - pLed->bLedWPSBlinkInProgress = _FALSE; - } - break; - - - default: - break; - } - -} - - -static void -SwLedBlink4( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - PLED_871x pLed1 = &(ledpriv->SwLed1); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) - { - pLed1->BlinkingLedState = LED_OFF; - pLed1->CurrLedState = LED_OFF; - SwLedOff(padapter, pLed1); - } - - switch(pLed->CurrLedState) - { - case LED_BLINK_SLOWLY: - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_BLINK_StartToBlink: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_SCAN_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _FALSE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _FALSE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - case LED_TXRX_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - case LED_BLINK_WPS: - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_BLINK_WPS_STOP: //WPS authentication fail - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - break; - - case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap - pLed->BlinkTimes--; - if(pLed->BlinkTimes == 0) - { - if(pLed->bLedOn) - { - pLed->BlinkTimes = 1; - } - else - { - bStopBlinking = _TRUE; - } - } - - if(bStopBlinking) - { - pLed->BlinkTimes = 10; - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState)); - - -} - -static void -SwLedBlink5( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - switch(pLed->CurrLedState) - { - case LED_SCAN_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - if(pLed->bLedOn) - SwLedOff(padapter, pLed); - } - else - { pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - if(!pLed->bLedOn) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - - pLed->bLedScanBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - } - break; - - - case LED_TXRX_BLINK: - pLed->BlinkTimes--; - if( pLed->BlinkTimes == 0 ) - { - bStopBlinking = _TRUE; - } - - if(bStopBlinking) - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - if(pLed->bLedOn) - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - if(!pLed->bLedOn) - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - - pLed->bLedBlinkInProgress = _FALSE; - } - else - { - if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) - { - SwLedOff(padapter, pLed); - } - else - { - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - } - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); - - -} - -static void -SwLedBlink6( - PLED_871x pLed - ) -{ - _adapter *padapter = pLed->padapter; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - u8 bStopBlinking = _FALSE; - - // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) - { - SwLedOn(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); - } - else - { - SwLedOff(padapter, pLed); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n")); -} - - -// -// Description: -// Callback function of LED BlinkTimer, -// it just schedules to corresponding BlinkWorkItem. -// -static void -BlinkTimerCallback( - unsigned long data - ) -{ - PLED_871x pLed = (PLED_871x)data; - _adapter *padapter = pLed->padapter; - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - return; - } - - _set_workitem(&(pLed->BlinkWorkItem)); -} - - -// -// Description: -// Callback function of LED BlinkWorkItem. -// We dispatch acture LED blink action according to LedStrategy. -// -static void BlinkWorkItemCallback(struct work_struct *work) -{ - PLED_871x pLed = container_of(work, LED_871x, BlinkWorkItem); - struct led_priv *ledpriv = &(pLed->padapter->ledpriv); - _adapter *padapter = pLed->padapter; - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) - { - return; - } - - switch(ledpriv->LedStrategy) - { - case SW_LED_MODE0: - SwLedBlink(pLed); - break; - - case SW_LED_MODE1: - SwLedBlink1(pLed); - break; - - case SW_LED_MODE2: - SwLedBlink2(pLed); - break; - - case SW_LED_MODE3: - SwLedBlink3(pLed); - break; - - case SW_LED_MODE4: - SwLedBlink4(pLed); - break; - - case SW_LED_MODE5: - SwLedBlink5(pLed); - break; - - case SW_LED_MODE6: - SwLedBlink6(pLed); - break; - - default: - //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy)); - //SwLedBlink(pLed); - break; - } -} - - - -//================================================================================ -// Default LED behavior. -//================================================================================ - -// -// Description: -// Implement each led action for SW_LED_MODE0. -// This is default strategy. -// -static void -SwLedControlMode0( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - PLED_871x pLed = &(ledpriv->SwLed1); - - // Decide led state - switch(LedAction) - { - case LED_CTL_TX: - case LED_CTL_RX: - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_NORMAL; - pLed->BlinkTimes = 2; - - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - break; - - case LED_CTL_START_TO_LINK: - if( pLed->bLedBlinkInProgress == _FALSE ) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_StartToBlink; - pLed->BlinkTimes = 24; - - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->CurrLedState = LED_BLINK_StartToBlink; - } - break; - - case LED_CTL_LINK: - pLed->CurrLedState = LED_ON; - if( pLed->bLedBlinkInProgress == _FALSE ) - { - SwLedOn(padapter, pLed); - } - break; - - case LED_CTL_NO_LINK: - pLed->CurrLedState = LED_OFF; - if( pLed->bLedBlinkInProgress == _FALSE ) - { - SwLedOff(padapter, pLed); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = LED_OFF; - if(pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - SwLedOff(padapter, pLed); - break; - - case LED_CTL_START_WPS: - if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == LED_ON) - { - pLed->bLedBlinkInProgress = _TRUE; - - pLed->CurrLedState = LED_BLINK_WPS; - pLed->BlinkTimes = 20; - - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - else - { - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); - } - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedBlinkInProgress) - { - pLed->CurrLedState = LED_OFF; - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - break; - - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); - -} - - //ALPHA, added by chiyoko, 20090106 -static void -SwLedControlMode1( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct led_priv *ledpriv = &(padapter->ledpriv); - PLED_871x pLed = &(ledpriv->SwLed0); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - if( pLed->bLedLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_NORMAL; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_SCAN_BLINK; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_TXRX_BLINK; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - - case LED_CTL_STOP_WPS: - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress == _TRUE ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - } - else - { - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_STOP_WPS_FAIL: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - //Arcadyan/Sitecom , added by chiyoko, 20090216 -static void -SwLedControlMode2( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_SITE_SURVEY: - if(pmlmepriv->LinkDetectInfo.bBusyTraffic) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_SCAN_BLINK; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_TXRX_BLINK; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_STOP_WPS: - pLed->bLedWPSBlinkInProgress = _FALSE; - if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - break; - - case LED_CTL_STOP_WPS_FAIL: - pLed->bLedWPSBlinkInProgress = _FALSE; - if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) - { - SwLedOff(padapter, pLed); - } - else - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); - } - break; - - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); -} - - //COREGA, added by chiyoko, 20090316 - static void - SwLedControlMode3( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_SITE_SURVEY: - if(pmlmepriv->LinkDetectInfo.bBusyTraffic) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_SCAN_BLINK; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_TXRX_BLINK; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_LINK: - if(IS_LED_WPS_BLINKING(pLed)) - return; - - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_STOP_WPS: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - else - { - pLed->bLedWPSBlinkInProgress = _TRUE; - } - - pLed->CurrLedState = LED_BLINK_WPS_STOP; - if(pLed->bLedOn) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); - } - else - { - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), 0); - } - - break; - - case LED_CTL_STOP_WPS_FAIL: - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_START_TO_LINK: - case LED_CTL_NO_LINK: - if(!IS_LED_BLINKING(pLed)) - { - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), 0); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); -} - - - //Edimax-Belkin, added by chiyoko, 20090413 -static void -SwLedControlMode4( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - PLED_871x pLed1 = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_START_TO_LINK: - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = LED_OFF; - pLed1->CurrLedState = LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - - if( pLed->bLedStartToLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedNoLinkBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - - pLed->bLedStartToLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_StartToBlink; - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - //LED1 settings - if(LedAction == LED_CTL_LINK) - { - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = LED_OFF; - pLed1->CurrLedState = LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - } - - if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - } - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(IS_LED_WPS_BLINKING(pLed)) - return; - - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_SCAN_BLINK; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) - { - return; - } - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_TXRX_BLINK; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_START_WPS: //wait until xinpin finish - case LED_CTL_START_WPS_BOTTON: - if(pLed1->bLedWPSBlinkInProgress) - { - pLed1->bLedWPSBlinkInProgress = _FALSE; - _cancel_timer_ex(&(pLed1->BlinkTimer)); - - pLed1->BlinkingLedState = LED_OFF; - pLed1->CurrLedState = LED_OFF; - - if(pLed1->bLedOn) - _set_timer(&(pLed->BlinkTimer), 0); - } - - if(pLed->bLedWPSBlinkInProgress ==_FALSE) - { - if(pLed->bLedNoLinkBlinkInProgress == _TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if(pLed->bLedScanBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - pLed->bLedWPSBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_WPS; - if( pLed->bLedOn ) - { - pLed->BlinkingLedState = LED_OFF; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); - } - else - { - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - } - } - break; - - case LED_CTL_STOP_WPS: //WPS connect success - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - break; - - case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - //LED1 settings - if(pLed1->bLedWPSBlinkInProgress) - _cancel_timer_ex(&(pLed1->BlinkTimer)); - else - pLed1->bLedWPSBlinkInProgress = _TRUE; - - pLed1->CurrLedState = LED_BLINK_WPS_STOP; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = LED_OFF; - else - pLed1->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - - break; - - case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap - if(pLed->bLedWPSBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - - pLed->bLedNoLinkBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_BLINK_SLOWLY; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); - - //LED1 settings - if(pLed1->bLedWPSBlinkInProgress) - _cancel_timer_ex(&(pLed1->BlinkTimer)); - else - pLed1->bLedWPSBlinkInProgress = _TRUE; - - pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; - pLed1->BlinkTimes = 10; - if( pLed1->bLedOn ) - pLed1->BlinkingLedState = LED_OFF; - else - pLed1->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); - - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - - if( pLed->bLedNoLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedNoLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedLinkBlinkInProgress = _FALSE; - } - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - if( pLed->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedWPSBlinkInProgress = _FALSE; - } - if( pLed->bLedScanBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedScanBlinkInProgress = _FALSE; - } - if( pLed->bLedStartToLinkBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedStartToLinkBlinkInProgress = _FALSE; - } - - if( pLed1->bLedWPSBlinkInProgress ) - { - _cancel_timer_ex(&(pLed1->BlinkTimer)); - pLed1->bLedWPSBlinkInProgress = _FALSE; - } - - pLed1->BlinkingLedState = LED_UNKNOWN; - SwLedOff(padapter, pLed); - SwLedOff(padapter, pLed1); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - - - //Sercomm-Belkin, added by chiyoko, 20090415 -static void -SwLedControlMode5( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed = &(ledpriv->SwLed0); - - if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) - pLed = &(ledpriv->SwLed1); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_NO_LINK: - case LED_CTL_LINK: //solid blue - pLed->CurrLedState = LED_ON; - pLed->BlinkingLedState = LED_ON; - - _set_timer(&(pLed->BlinkTimer), 0); - break; - - case LED_CTL_SITE_SURVEY: - if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) - ; - else if(pLed->bLedScanBlinkInProgress ==_FALSE) - { - if(pLed->bLedBlinkInProgress ==_TRUE) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - pLed->bLedScanBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_SCAN_BLINK; - pLed->BlinkTimes = 24; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); - } - break; - - case LED_CTL_TX: - case LED_CTL_RX: - if(pLed->bLedBlinkInProgress ==_FALSE) - { - if(pLed->CurrLedState == LED_SCAN_BLINK) - { - return; - } - pLed->bLedBlinkInProgress = _TRUE; - pLed->CurrLedState = LED_TXRX_BLINK; - pLed->BlinkTimes = 2; - if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; - else - pLed->BlinkingLedState = LED_ON; - _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); - } - break; - - case LED_CTL_POWER_OFF: - pLed->CurrLedState = LED_OFF; - pLed->BlinkingLedState = LED_OFF; - - if( pLed->bLedBlinkInProgress) - { - _cancel_timer_ex(&(pLed->BlinkTimer)); - pLed->bLedBlinkInProgress = _FALSE; - } - - SwLedOff(padapter, pLed); - break; - - default: - break; - - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); -} - - //WNC-Corega, added by chiyoko, 20090902 -static void -SwLedControlMode6( - _adapter *padapter, - LED_CTL_MODE LedAction -) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - PLED_871x pLed0 = &(ledpriv->SwLed0); - - switch(LedAction) - { - case LED_CTL_POWER_ON: - case LED_CTL_LINK: - case LED_CTL_NO_LINK: - _cancel_timer_ex(&(pLed0->BlinkTimer)); - pLed0->CurrLedState = LED_ON; - pLed0->BlinkingLedState = LED_ON; - _set_timer(&(pLed0->BlinkTimer), 0); - break; - - case LED_CTL_POWER_OFF: - SwLedOff(padapter, pLed0); - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed->CurrLedState)); -} - - -// -// Description: -// Dispatch LED action according to pHalData->LedStrategy. -// -static void -LedControl871x( - _adapter *padapter, - LED_CTL_MODE LedAction - ) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - - if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) - ||(padapter->hw_init_completed == _FALSE) ) - { - return; - } - - - if( ledpriv->bRegUseLed == _FALSE) - return; - - //if (!priv->up) - // return; - - //if(priv->bInHctTest) - // return; - - if( (padapter->pwrctrlpriv.rf_pwrstate != rf_on && - padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && - (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || - LedAction == LED_CTL_SITE_SURVEY || - LedAction == LED_CTL_LINK || - LedAction == LED_CTL_NO_LINK || - LedAction == LED_CTL_POWER_ON) ) - { - return; - } - - switch(ledpriv->LedStrategy) - { - case SW_LED_MODE0: - //SwLedControlMode0(padapter, LedAction); - break; - - case SW_LED_MODE1: - SwLedControlMode1(padapter, LedAction); - break; - case SW_LED_MODE2: - SwLedControlMode2(padapter, LedAction); - break; - - case SW_LED_MODE3: - SwLedControlMode3(padapter, LedAction); - break; - - case SW_LED_MODE4: - SwLedControlMode4(padapter, LedAction); - break; - - case SW_LED_MODE5: - SwLedControlMode5(padapter, LedAction); - break; - - case SW_LED_MODE6: - SwLedControlMode6(padapter, LedAction); - break; - - default: - break; - } - - RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction)); -} - -// -// Description: -// Initialize all LED_871x objects. -// -void -rtl8192cu_InitSwLeds( - _adapter *padapter - ) -{ - struct led_priv *pledpriv = &(padapter->ledpriv); - - pledpriv->LedControlHandler = LedControl871x; - - InitLed871x(padapter, &(pledpriv->SwLed0), LED_PIN_LED0); - - InitLed871x(padapter,&(pledpriv->SwLed1), LED_PIN_LED1); -} - - -// -// Description: -// DeInitialize all LED_819xUsb objects. -// -void -rtl8192cu_DeInitSwLeds( - _adapter *padapter - ) -{ - struct led_priv *ledpriv = &(padapter->ledpriv); - - DeInitLed871x( &(ledpriv->SwLed0) ); - DeInitLed871x( &(ledpriv->SwLed1) ); -} - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c deleted file mode 100755 index ee0713dad913..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c +++ /dev/null @@ -1,380 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTL8192CU_RECV_C_ -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -#include -#include - -#include - - -void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf) -{ - - precvbuf->transfer_len = 0; - - precvbuf->len = 0; - - precvbuf->ref_cnt = 0; - - if(precvbuf->pbuf) - { - precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf; - precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ; - } - -} - -int rtl8192cu_init_recv_priv(_adapter *padapter) -{ - struct recv_priv *precvpriv = &padapter->recvpriv; - int i, res = _SUCCESS; - struct recv_buf *precvbuf; - -#ifdef CONFIG_RECV_THREAD_MODE - _rtw_init_sema(&precvpriv->recv_sema, 0);//will be removed - _rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);//will be removed -#endif - -#ifdef PLATFORM_LINUX - tasklet_init(&precvpriv->recv_tasklet, - (void(*)(unsigned long))rtl8192cu_recv_tasklet, - (unsigned long)padapter); -#endif - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE -#ifdef PLATFORM_LINUX - precvpriv->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); - if(precvpriv->int_in_urb == NULL){ - DBG_8192C("alloc_urb for interrupt in endpoint fail !!!!\n"); - } -#endif - precvpriv->int_in_buf = rtw_zmalloc(sizeof(INTERRUPT_MSG_FORMAT_EX)); - if(precvpriv->int_in_buf == NULL){ - DBG_8192C("alloc_mem for interrupt in endpoint fail !!!!\n"); - } -#endif - - //init recv_buf - _rtw_init_queue(&precvpriv->free_recv_buf_queue); - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - _rtw_init_queue(&precvpriv->recv_buf_pending_queue); -#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX - - precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4); - if(precvpriv->pallocated_recv_buf==NULL){ - res= _FAIL; - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("alloc recv_buf fail!\n")); - goto exit; - } - _rtw_memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF *sizeof(struct recv_buf) + 4); - - precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_recv_buf), 4); - //precvpriv->precv_buf = precvpriv->pallocated_recv_buf + 4 - - // ((uint) (precvpriv->pallocated_recv_buf) &(4-1)); - - - precvbuf = (struct recv_buf*)precvpriv->precv_buf; - - for(i=0; i < NR_RECVBUFF ; i++) - { - _rtw_init_listhead(&precvbuf->list); - - _rtw_spinlock_init(&precvbuf->recvbuf_lock); - - precvbuf->alloc_sz = MAX_RECVBUF_SZ; - - res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf); - if(res==_FAIL) - break; - - precvbuf->ref_cnt = 0; - precvbuf->adapter =padapter; - - - //rtw_list_insert_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue)); - - precvbuf++; - - } - - precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF; - -#ifdef PLATFORM_LINUX - - skb_queue_head_init(&precvpriv->rx_skb_queue); - -#ifdef CONFIG_PREALLOC_RECV_SKB - { - int i; - SIZE_PTR tmpaddr=0; - SIZE_PTR alignment=0; - struct sk_buff *pskb=NULL; - - skb_queue_head_init(&precvpriv->free_recv_skb_queue); - - for(i=0; ipnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); - #endif - - if(pskb) - { - pskb->dev = padapter->pnetdev; - - tmpaddr = (SIZE_PTR)pskb->data; - alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); - skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); - - skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); - } - - pskb=NULL; - - } - } -#endif - -#endif - -exit: - - return res; - -} - -void rtl8192cu_free_recv_priv (_adapter *padapter) -{ - int i; - struct recv_buf *precvbuf; - struct recv_priv *precvpriv = &padapter->recvpriv; - - precvbuf = (struct recv_buf *)precvpriv->precv_buf; - - for(i=0; i < NR_RECVBUFF ; i++) - { - rtw_os_recvbuf_resource_free(padapter, precvbuf); - precvbuf++; - } - - if(precvpriv->pallocated_recv_buf) - rtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4); - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE -#ifdef PLATFORM_LINUX - if(precvpriv->int_in_urb) - { - usb_free_urb(precvpriv->int_in_urb); - } -#endif - if(precvpriv->int_in_buf) - rtw_mfree(precvpriv->int_in_buf, sizeof(INTERRUPT_MSG_FORMAT_EX)); -#endif - -#ifdef PLATFORM_LINUX - - if (skb_queue_len(&precvpriv->rx_skb_queue)) { - DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n"); - } - - skb_queue_purge(&precvpriv->rx_skb_queue); - -#ifdef CONFIG_PREALLOC_RECV_SKB - - if (skb_queue_len(&precvpriv->free_recv_skb_queue)) { - //DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); - } - - skb_queue_purge(&precvpriv->free_recv_skb_queue); - -#endif - -#endif - -} - -void rtl8192cu_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat) -{ - u8 physt, qos, shift, icverr, htc, crcerr; - u16 drvinfo_sz=0; - struct phy_stat *pphy_info; - struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; - _adapter *padapter = precvframe->u.hdr.adapter; - u8 bPacketMatchBSSID =_FALSE; - u8 bPacketToSelf = _FALSE; - u8 bPacketBeacon = _FALSE; - - - //Offset 0 - drvinfo_sz = (le32_to_cpu(prxstat->rxdw0)&0x000f0000)>>16; - drvinfo_sz = drvinfo_sz<<3; - - pattrib->bdecrypted = ((le32_to_cpu(prxstat->rxdw0) & BIT(27)) >> 27)? 0:1; - - physt = ((le32_to_cpu(prxstat->rxdw0) & BIT(26)) >> 26)? 1:0; - - shift = (le32_to_cpu(prxstat->rxdw0)&0x03000000)>>24; - - qos = ((le32_to_cpu(prxstat->rxdw0) & BIT(23)) >> 23)? 1:0; - - icverr = ((le32_to_cpu(prxstat->rxdw0) & BIT(15)) >> 15)? 1:0; - - pattrib->crc_err = crcerr = ((le32_to_cpu(prxstat->rxdw0) & BIT(14)) >> 14 )? 1:0; - - - //Offset 4 - - //Offset 8 - - //Offset 12 -#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX - if ( le32_to_cpu(prxstat->rxdw3) & BIT(13)) { - pattrib->tcpchk_valid = 1; // valid - if ( le32_to_cpu(prxstat->rxdw3) & BIT(11) ) { - pattrib->tcp_chkrpt = 1; // correct - //DBG_8192C("tcp csum ok\n"); - } else - pattrib->tcp_chkrpt = 0; // incorrect - - if ( le32_to_cpu(prxstat->rxdw3) & BIT(12) ) - pattrib->ip_chkrpt = 1; // correct - else - pattrib->ip_chkrpt = 0; // incorrect - - } else { - pattrib->tcpchk_valid = 0; // invalid - } - -#endif - - pattrib->mcs_rate=(u8)((le32_to_cpu(prxstat->rxdw3))&0x3f); - pattrib->rxht=(u8)((le32_to_cpu(prxstat->rxdw3) >>6)&0x1); - - htc = (u8)((le32_to_cpu(prxstat->rxdw3) >>10)&0x1); - - //Offset 16 - //Offset 20 - - -#if 0 //dump rxdesc for debug - DBG_8192C("drvinfo_sz=%d\n", drvinfo_sz); - DBG_8192C("physt=%d\n", physt); - DBG_8192C("shift=%d\n", shift); - DBG_8192C("qos=%d\n", qos); - DBG_8192C("icverr=%d\n", icverr); - DBG_8192C("htc=%d\n", htc); - DBG_8192C("bdecrypted=%d\n", pattrib->bdecrypted); - DBG_8192C("mcs_rate=%d\n", pattrib->mcs_rate); - DBG_8192C("rxht=%d\n", pattrib->rxht); -#endif - - //phy_info - if(drvinfo_sz && physt) - { - bPacketMatchBSSID = ((!IsFrameTypeCtrl(precvframe->u.hdr.rx_data)) && !icverr && !crcerr && - _rtw_memcmp(get_hdr_bssid(precvframe->u.hdr.rx_data), get_bssid(&padapter->mlmepriv), ETH_ALEN)); - - bPacketToSelf = bPacketMatchBSSID && (_rtw_memcmp(get_da(precvframe->u.hdr.rx_data), myid(&padapter->eeprompriv), ETH_ALEN)); - - bPacketBeacon = (GetFrameSubType(precvframe->u.hdr.rx_data) == WIFI_BEACON); - - - pphy_info = (struct phy_stat *)(prxstat+1); - - //DBG_8192C("pphy_info, of0=0x%08x\n", *pphy_info); - //DBG_8192C("pphy_info, of1=0x%08x\n", *(pphy_info+1)); - //DBG_8192C("pphy_info, of2=0x%08x\n", *(pphy_info+2)); - //DBG_8192C("pphy_info, of3=0x%08x\n", *(pphy_info+3)); - //DBG_8192C("pphy_info, of4=0x%08x\n", *(pphy_info+4)); - //DBG_8192C("pphy_info, of5=0x%08x\n", *(pphy_info+5)); - //DBG_8192C("pphy_info, of6=0x%08x\n", *(pphy_info+6)); - //DBG_8192C("pphy_info, of7=0x%08x\n", *(pphy_info+7)); - - rtl8192c_query_rx_phy_status(precvframe, pphy_info); - - precvframe->u.hdr.psta = NULL; - if(bPacketMatchBSSID && check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) - { - u8 *sa; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - sa = get_sa(precvframe->u.hdr.rx_data); - - psta = rtw_get_stainfo(pstapriv, sa); - if(psta) - { - precvframe->u.hdr.psta = psta; - rtl8192c_process_phy_info(padapter, precvframe); - } - } - else if( bPacketToSelf || (bPacketBeacon && bPacketMatchBSSID) ) - { - if(check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) - { - u8 *sa; - struct sta_info *psta=NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - sa = get_sa(precvframe->u.hdr.rx_data); - - psta = rtw_get_stainfo(pstapriv, sa); - if(psta) - { - precvframe->u.hdr.psta = psta; - } - } - - rtl8192c_process_phy_info(padapter, precvframe); - } - -#if 0 //dump phy_status for debug - - DBG_8192C("signal_qual=%d\n", pattrib->signal_qual); - DBG_8192C("signal_strength=%d\n", pattrib->signal_strength); -#endif - - } - - -} - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c deleted file mode 100755 index 679fc9e6e826..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c +++ /dev/null @@ -1,1338 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _RTL8192C_XMIT_C_ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) -#error "Shall be Linux or Windows, but not both!\n" -#endif - - -s32 rtl8192cu_init_xmit_priv(_adapter *padapter) -{ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - -#ifdef PLATFORM_LINUX - tasklet_init(&pxmitpriv->xmit_tasklet, - (void(*)(unsigned long))rtl8192cu_xmit_tasklet, - (unsigned long)padapter); -#endif - return _SUCCESS; -} - -void rtl8192cu_free_xmit_priv(_adapter *padapter) -{ -} - -u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe) -{ - u32 addr; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - - switch(pattrib->qsel) - { - case 0: - case 3: - addr = BE_QUEUE_INX; - break; - case 1: - case 2: - addr = BK_QUEUE_INX; - break; - case 4: - case 5: - addr = VI_QUEUE_INX; - break; - case 6: - case 7: - addr = VO_QUEUE_INX; - break; - case 0x10: - addr = BCN_QUEUE_INX; - break; - case 0x11://BC/MC in PS (HIQ) - addr = HIGH_QUEUE_INX; - break; - case 0x12: - addr = MGT_QUEUE_INX; - break; - default: - addr = BE_QUEUE_INX; - break; - - } - - return addr; - -} - -static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib) -{ - u8 qsel; - - qsel = pattrib->priority; - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel)); - pattrib->qsel = qsel; -} - -int urb_zero_packet_chk(_adapter *padapter, int sz) -{ - int blnSetTxDescOffset; - struct dvobj_priv *pdvobj = (struct dvobj_priv*)&padapter->dvobjpriv; - - if ( pdvobj->ishighspeed ) - { - if ( ( (sz + TXDESC_SIZE) % 512 ) == 0 ) { - blnSetTxDescOffset = 1; - } else { - blnSetTxDescOffset = 0; - } - } - else - { - if ( ( (sz + TXDESC_SIZE) % 64 ) == 0 ) { - blnSetTxDescOffset = 1; - } else { - blnSetTxDescOffset = 0; - } - } - - return blnSetTxDescOffset; - -} - -void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc) -{ - u16 *usPtr = (u16*)ptxdesc; - u32 count = 16; // (32 bytes / 2 bytes per XOR) => 16 times - u32 index; - u16 checksum = 0; - - //Clear first - ptxdesc->txdw7 &= cpu_to_le32(0xffff0000); - - for(index = 0 ; index < count ; index++){ - checksum = checksum ^ le16_to_cpu(*(usPtr + index)); - } - - ptxdesc->txdw7 |= cpu_to_le32(0x0000ffff&checksum); - -} - -void fill_txdesc_sectype(struct pkt_attrib *pattrib, struct tx_desc *ptxdesc) -{ - if ((pattrib->encrypt > 0) && !pattrib->bswenc) - { - switch (pattrib->encrypt) - { - //SEC_TYPE - case _WEP40_: - case _WEP104_: - ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000); - break; - case _TKIP_: - case _TKIP_WTMIC_: - //ptxdesc->txdw1 |= cpu_to_le32((0x02<<22)&0x00c00000); - ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000); - break; - case _AES_: - ptxdesc->txdw1 |= cpu_to_le32((0x03<<22)&0x00c00000); - break; - case _NO_PRIVACY_: - default: - break; - - } - - } - -} - -void fill_txdesc_vcs(struct pkt_attrib *pattrib, u32 *pdw) -{ - //DBG_8192C("cvs_mode=%d\n", pattrib->vcs_mode); - - switch(pattrib->vcs_mode) - { - case RTS_CTS: - *pdw |= cpu_to_le32(BIT(12)); - break; - case CTS_TO_SELF: - *pdw |= cpu_to_le32(BIT(11)); - break; - case NONE_VCS: - default: - break; - } - - if(pattrib->vcs_mode) - { - *pdw |= cpu_to_le32(BIT(13));//ENABLE HW RTS - } - -} - -void fill_txdesc_phy(struct pkt_attrib *pattrib, u32 *pdw) -{ - //DBG_8192C("bwmode=%d, ch_off=%d\n", pattrib->bwmode, pattrib->ch_offset); - - if(pattrib->ht_en) - { - *pdw |= (pattrib->bwmode&HT_CHANNEL_WIDTH_40)? cpu_to_le32(BIT(25)):0; - - if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) - *pdw |= cpu_to_le32((0x01<<20)&0x003f0000); - else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) - *pdw |= cpu_to_le32((0x02<<20)&0x003f0000); - else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) - *pdw |= 0; - else - *pdw |= cpu_to_le32((0x03<<20)&0x003f0000); - } -} - -#ifdef CONFIG_USB_TX_AGGREGATION -static void _update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, int sz) -{ - uint qsel; - _adapter *padapter = pxmitframe->padapter; - struct ht_priv *phtpriv = &padapter->mlmepriv.htpriv; - struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - sint bmcst = IS_MCAST(pattrib->ra); - struct tx_desc *ptxdesc = (struct tx_desc*)pmem; - - - _rtw_memset(ptxdesc, 0, sizeof(struct tx_desc)); - - //4 offset 0 - ptxdesc->txdw0 |= cpu_to_le32(sz & 0x0000ffff); - ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); - ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000);//32 bytes for TX Desc - - if (bmcst) ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); - - RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, - ("update_txdesc: offset0=0x%08x\n", ptxdesc->txdw0)); - - //4 offset 4 - // pkt_offset, unit:8 bytes padding - if (pxmitframe->pkt_offset > 0) - ptxdesc->txdw1 |= cpu_to_le32((pxmitframe->pkt_offset << 26) & 0x7c000000); - -#ifdef CONFIG_USB_TX_AGGREGATION - if (pxmitframe->agg_num > 1) - ptxdesc->txdw5 |= cpu_to_le32((pxmitframe->agg_num << 24) & 0xff000000); -#endif - - if (pxmitframe->frame_tag == DATA_FRAMETAG) - { - //4 offset 4 - ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); - - qsel = (uint)(pattrib->qsel & 0x0000001f); - ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); - - ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid << 16) & 0x000f0000); - - fill_txdesc_sectype(pattrib, ptxdesc); - - if(pattrib->ampdu_en==_TRUE) - ptxdesc->txdw1 |= cpu_to_le32(BIT(5));//AGG EN - else - ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK - - - //4 offset 8 - - - //4 offset 12 - ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0xffff0000); - - - //4 offset 16 , offset 20 - if (pattrib->qos_en) - ptxdesc->txdw4 |= cpu_to_le32(BIT(6));//QoS - - if ((pattrib->ether_type != 0x888e) && - (pattrib->ether_type != 0x0806) && - (pattrib->dhcp_pkt != 1)) - { - //Non EAP & ARP & DHCP type data packet - - fill_txdesc_vcs(pattrib, &ptxdesc->txdw4); - fill_txdesc_phy(pattrib, &ptxdesc->txdw4); - - ptxdesc->txdw4 |= cpu_to_le32(0x00000008);//RTS Rate=24M - ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00); - //ptxdesc->txdw5 |= cpu_to_le32(0x0000000b);//DataRate - 54M - - //use REG_INIDATA_RATE_SEL value - ptxdesc->txdw5 |= cpu_to_le32(pdmpriv->INIDATA_RATE[pattrib->mac_id]); - - if (0)//for driver dbg - { - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - if (pattrib->ht_en) - ptxdesc->txdw5 |= cpu_to_le32(BIT(6));//SGI - - ptxdesc->txdw5 |= cpu_to_le32(0x00000013);//init rate - mcs7 - } - } - else - { - // EAP data packet and ARP packet. - // Use the 1M data rate to send the EAP/ARP packet. - // This will maybe make the handshake smooth. - - ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - } - - - //4 offset 24 -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - if (pattrib->hw_tcp_csum == 1) { - // ptxdesc->txdw6 = 0; // clear TCP_CHECKSUM and IP_CHECKSUM. It's zero already!! - u8 ip_hdr_offset = 32 + pattrib->hdrlen + pattrib->iv_len + 8; - ptxdesc->txdw7 = (1 << 31) | (ip_hdr_offset << 16); - DBG_8192C("ptxdesc->txdw7 = %08x\n", ptxdesc->txdw7); - } -#endif - } - else if(pxmitframe->frame_tag == MGNT_FRAMETAG) - { - //DBG_8192C("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); - - //4 offset 4 - ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); - - qsel = (uint)(pattrib->qsel&0x0000001f); - ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); - - ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); - - //fill_txdesc_sectype(pattrib, ptxdesc); - - - //4 offset 8 - - - //4 offset 12 - ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); - - - //4 offset 16 - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - - //4 offset 20 - } - else if(pxmitframe->frame_tag == TXAGG_FRAMETAG) - { - DBG_8192C("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); - } - else - { - DBG_8192C("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); - - //4 offset 4 - ptxdesc->txdw1 |= cpu_to_le32((4)&0x1f);//CAM_ID(MAC_ID) - - ptxdesc->txdw1 |= cpu_to_le32((6<< 16) & 0x000f0000);//raid - - - //4 offset 8 - - - //4 offset 12 - ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0xffff0000); - - - //4 offset 16 - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - - //4 offset 20 - } - - // 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS. - // (1) The sequence number of each non-Qos frame / broadcast / multicast / - // mgnt frame should be controled by Hw because Fw will also send null data - // which we cannot control when Fw LPS enable. - // --> default enable non-Qos data sequense number. 2010.06.23. by tynli. - // (2) Enable HW SEQ control for beacon packet, because we use Hw beacon. - // (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets. - // 2010.06.23. Added by tynli. - if(!pattrib->qos_en) - { - ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number - ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. - } - - rtl8192cu_cal_txdesc_chksum(ptxdesc); -} -#endif - -static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz) -{ - int pull=0; - uint qsel; - _adapter *padapter = pxmitframe->padapter; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct tx_desc *ptxdesc = (struct tx_desc *)pmem; - struct ht_priv *phtpriv = &pmlmepriv->htpriv; - struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; - sint bmcst = IS_MCAST(pattrib->ra); -#ifdef CONFIG_P2P - struct wifidirect_info* pwdinfo = &padapter->wdinfo; -#endif //CONFIG_P2P - -#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX - if(urb_zero_packet_chk(padapter, sz)==0) - { - ptxdesc = (struct tx_desc *)(pmem+PACKET_OFFSET_SZ); - pull = 1; - } -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - - _rtw_memset(ptxdesc, 0, sizeof(struct tx_desc)); - - if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) - { - //DBG_8192C("pxmitframe->frame_tag == DATA_FRAMETAG\n"); - - //offset 4 - ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); - - qsel = (uint)(pattrib->qsel & 0x0000001f); - ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); - - ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); - - fill_txdesc_sectype(pattrib, ptxdesc); - - - if(pattrib->ampdu_en==_TRUE) - ptxdesc->txdw1 |= cpu_to_le32(BIT(5));//AGG EN - else - ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK - - //offset 8 - - - //offset 12 - ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); - - - //offset 16 , offset 20 - if (pattrib->qos_en) - ptxdesc->txdw4 |= cpu_to_le32(BIT(6));//QoS - - if ((pattrib->ether_type != 0x888e) && (pattrib->ether_type != 0x0806) && (pattrib->dhcp_pkt != 1)) - { - //Non EAP & ARP & DHCP type data packet - - fill_txdesc_vcs(pattrib, &ptxdesc->txdw4); - fill_txdesc_phy(pattrib, &ptxdesc->txdw4); - - ptxdesc->txdw4 |= cpu_to_le32(0x00000008);//RTS Rate=24M - ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00);// - //ptxdesc->txdw5 |= cpu_to_le32(0x0000000b);//DataRate - 54M - - //use REG_INIDATA_RATE_SEL value - ptxdesc->txdw5 |= cpu_to_le32(pdmpriv->INIDATA_RATE[pattrib->mac_id]); - - if(0)//for driver dbg - { - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - if(pattrib->ht_en) - ptxdesc->txdw5 |= cpu_to_le32(BIT(6));//SGI - - ptxdesc->txdw5 |= cpu_to_le32(0x00000013);//init rate - mcs7 - } - - } - else - { - // EAP data packet and ARP packet. - // Use the 1M data rate to send the EAP/ARP packet. - // This will maybe make the handshake smooth. - - ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK - - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - -#ifdef CONFIG_P2P - // Added by Albert 2011/03/22 - // In the P2P mode, the driver should not support the b mode. - // So, the Tx packet shouldn't use the CCK rate - if ( pwdinfo->p2p_state != P2P_STATE_NONE ) - { - ptxdesc->txdw5 |= cpu_to_le32( 0x04 ); // Use the 6M data rate. - } -#endif //CONFIG_P2P - - } - - //offset 24 - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - if ( pattrib->hw_tcp_csum == 1 ) { - // ptxdesc->txdw6 = 0; // clear TCP_CHECKSUM and IP_CHECKSUM. It's zero already!! - u8 ip_hdr_offset = 32 + pattrib->hdrlen + pattrib->iv_len + 8; - ptxdesc->txdw7 = (1 << 31) | (ip_hdr_offset << 16); - DBG_8192C("ptxdesc->txdw7 = %08x\n", ptxdesc->txdw7); - } -#endif - } - else if((pxmitframe->frame_tag&0x0f)== MGNT_FRAMETAG) - { - //DBG_8192C("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); - - //offset 4 - ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); - - qsel = (uint)(pattrib->qsel&0x0000001f); - ptxdesc->txdw1 |= cpu_to_le32((qsel<txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); - - //fill_txdesc_sectype(pattrib, ptxdesc); - - //offset 8 - - //offset 12 - ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); - - //offset 16 - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - //offset 20 - ptxdesc->txdw5 |= cpu_to_le32(BIT(17));//retry limit enable - ptxdesc->txdw5 |= cpu_to_le32(0x00180000);//retry limit = 6 -#ifdef CONFIG_P2P - // Added by Albert 2011/03/17 - // In the P2P mode, the driver should not support the b mode. - // So, the Tx packet shouldn't use the CCK rate - if ( pwdinfo->p2p_state != P2P_STATE_NONE ) - { - ptxdesc->txdw5 |= cpu_to_le32( 0x04 ); // Use the 6M data rate. - } -#endif //CONFIG_P2P - - } - else if((pxmitframe->frame_tag&0x0f) == TXAGG_FRAMETAG) - { - DBG_8192C("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); - } -#ifdef CONFIG_MP_INCLUDED - else if((pxmitframe->frame_tag&0x0f) == MP_FRAMETAG) - { - fill_txdesc_for_mp(padapter, ptxdesc); - } -#endif - else - { - DBG_8192C("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); - - //offset 4 - ptxdesc->txdw1 |= cpu_to_le32((4)&0x1f);//CAM_ID(MAC_ID) - - ptxdesc->txdw1 |= cpu_to_le32((6<< 16) & 0x000f0000);//raid - - //offset 8 - - //offset 12 - ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); - - //offset 16 - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - //offset 20 - } - - // 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS. - // (1) The sequence number of each non-Qos frame / broadcast / multicast / - // mgnt frame should be controled by Hw because Fw will also send null data - // which we cannot control when Fw LPS enable. - // --> default enable non-Qos data sequense number. 2010.06.23. by tynli. - // (2) Enable HW SEQ control for beacon packet, because we use Hw beacon. - // (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets. - // 2010.06.23. Added by tynli. - if(!pattrib->qos_en) - { - ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number - ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. - } - - //offset 0 - ptxdesc->txdw0 |= cpu_to_le32(sz&0x0000ffff); - ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); - ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(BIT(24)); - } - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("offset0-txdesc=0x%x\n", ptxdesc->txdw0)); - - //offset 4 - if(!pull) ptxdesc->txdw1 |= cpu_to_le32((0x01<<26)&0xff000000);//pkt_offset, unit:8 bytes padding - - rtl8192cu_cal_txdesc_chksum(ptxdesc); - - return pull; - -} - -void rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - int t, sz, w_sz, pull=0; - u8 *mem_addr; - u32 ff_hwaddr; - struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - if ((pxmitframe->frame_tag == DATA_FRAMETAG) && - (pxmitframe->attrib.ether_type != 0x0806) && - (pxmitframe->attrib.ether_type != 0x888e) && - (pxmitframe->attrib.dhcp_pkt != 1)) - { - if(padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE) - rtw_issue_addbareq_cmd(padapter, pxmitframe); - } - - mem_addr = pxmitframe->buf_addr; - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_dump_xframe()\n")); - - for (t = 0; t < pattrib->nr_frags; t++) - { - if (t != (pattrib->nr_frags - 1)) - { - RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("pattrib->nr_frags=%d\n", pattrib->nr_frags)); - - sz = pxmitpriv->frag_len; - sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len); - } - else //no frag - { - sz = pattrib->last_txcmdsz; - } - - pull = update_txdesc(pxmitframe, mem_addr, sz); - - if(pull) - { - mem_addr += PACKET_OFFSET_SZ; //pull txdesc head - - //pxmitbuf ->pbuf = mem_addr; - pxmitframe->buf_addr = mem_addr; - - w_sz = sz + TXDESC_SIZE; - } - else - { - w_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ; - } - - ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe); - - rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf); - - rtw_count_tx_stats(padapter, pxmitframe, sz); - - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_write_port, w_sz=%d\n", w_sz)); - //DBG_8192C("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority); - - mem_addr += w_sz; - - mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr))); - - } - - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - -} - - -#ifdef CONFIG_USB_TX_AGGREGATION -static u32 xmitframe_need_length(struct xmit_frame *pxmitframe) -{ - struct pkt_attrib *pattrib = &pxmitframe->attrib; - - u32 len = 0; - - // no consider fragement - len = pattrib->hdrlen + pattrib->iv_len + - SNAP_SIZE + sizeof(u16) + - pattrib->pktlen + - ((pattrib->bswenc) ? pattrib->icv_len : 0); - - if(pattrib->encrypt ==_TKIP_) - len += 8; - - return len; -} - -#define IDEA_CONDITION 1 // check all packets before enqueue -s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct xmit_frame *pxmitframe = NULL; - struct xmit_frame *pfirstframe = NULL; - - // aggregate variable -// struct hw_xmit *phwxmit; - struct sta_info *psta = NULL; - struct tx_servq *ptxservq = NULL; - - _irqL irqL; - _list *xmitframe_plist = NULL, *xmitframe_phead = NULL; - - u32 pbuf; // next pkt address - u32 pbuf_tail; // last pkt tail - u32 len; // packet length, except TXDESC_SIZE and PKT_OFFSET - - u32 bulkSize = pHalData->UsbBulkOutSize; - u8 descCount; - u32 bulkPtr; - - // dump frame variable - u32 ff_hwaddr; - -#ifndef IDEA_CONDITION - int res = _SUCCESS; -#endif - - RT_TRACE(_module_rtl8192c_xmit_c_, _drv_info_, ("+xmitframe_complete\n")); - - - // check xmitbuffer is ok - if (pxmitbuf == NULL) { - pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); - if (pxmitbuf == NULL) return _FALSE; - } - - - //3 1. pick up first frame - do { - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - - pxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); - if (pxmitframe == NULL) { - // no more xmit frame, release xmit buffer - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - return _FALSE; - } - - -#ifndef IDEA_CONDITION - if (pxmitframe->frame_tag != DATA_FRAMETAG) { - RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, - ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", - pxmitframe->frame_tag, DATA_FRAMETAG)); -// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - continue; - } - - // TID 0~15 - if ((pxmitframe->attrib.priority < 0) || - (pxmitframe->attrib.priority > 15)) { - RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, - ("xmitframe_complete: TID(%d) should be 0~15!\n", - pxmitframe->attrib.priority)); -// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - continue; - } -#endif - - pxmitframe->pxmitbuf = pxmitbuf; - pxmitframe->buf_addr = pxmitbuf->pbuf; - pxmitbuf->priv_data = pxmitframe; - - //pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1. - pxmitframe->pkt_offset = 1; // first frame of aggregation, reserve offset - -#ifdef IDEA_CONDITION - rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); -#else - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - if (res == _FALSE) { -// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - continue; - } -#endif - - // always return ndis_packet after rtw_xmitframe_coalesce - rtw_os_xmit_complete(padapter, pxmitframe); - - break; - } while (1); - - //3 2. aggregate same priority and same DA(AP or STA) frames - pfirstframe = pxmitframe; - len = xmitframe_need_length(pfirstframe) + TXDESC_OFFSET; - pbuf_tail = len; - pbuf = _RND8(pbuf_tail); - - // check pkt amount in one bluk - descCount = 0; - bulkPtr = bulkSize; - if (pbuf < bulkPtr) - descCount++; - else { - descCount = 0; - bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; // round to next bulkSize - } - - // dequeue same priority packet from station tx queue - psta = pfirstframe->attrib.psta; - switch (pfirstframe->attrib.priority) { - case 1: - case 2: - ptxservq = &(psta->sta_xmitpriv.bk_q); -// phwxmit = pxmitpriv->hwxmits + 3; - break; - - case 4: - case 5: - ptxservq = &(psta->sta_xmitpriv.vi_q); -// phwxmit = pxmitpriv->hwxmits + 1; - break; - - case 6: - case 7: - ptxservq = &(psta->sta_xmitpriv.vo_q); -// phwxmit = pxmitpriv->hwxmits; - break; - - case 0: - case 3: - default: - ptxservq = &(psta->sta_xmitpriv.be_q); -// phwxmit = pxmitpriv->hwxmits + 2; - break; - } - - _enter_critical_bh(&pxmitpriv->lock, &irqL); - - xmitframe_phead = get_list_head(&ptxservq->sta_pending); - xmitframe_plist = get_next(xmitframe_phead); - while (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE) - { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - xmitframe_plist = get_next(xmitframe_plist); - -#ifdef CONFIG_AP_MODE - if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)==_TRUE) - { - //rtw_list_delete(&pxmitframe->list); - - ptxservq->qcnt--; - - continue; - } -#endif - - len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE; // no offset - if (pbuf + len > MAX_XMITBUF_SZ) break; - - rtw_list_delete(&pxmitframe->list); - ptxservq->qcnt--; - -#ifndef IDEA_CONDITION - // suppose only data frames would be in queue - if (pxmitframe->frame_tag != DATA_FRAMETAG) { - RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, - ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", - pxmitframe->frame_tag, DATA_FRAMETAG)); - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - continue; - } - - // TID 0~15 - if ((pxmitframe->attrib.priority < 0) || - (pxmitframe->attrib.priority > 15)) { - RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, - ("xmitframe_complete: TID(%d) should be 0~15!\n", - pxmitframe->attrib.priority)); - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - continue; - } -#endif - -// pxmitframe->pxmitbuf = pxmitbuf; - pxmitframe->buf_addr = pxmitbuf->pbuf + pbuf; - - pxmitframe->agg_num = 0; // not first frame of aggregation - pxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset - -#ifdef IDEA_CONDITION - rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); -#else - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - if (res == _FALSE) { - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - continue; - } -#endif - - // always return ndis_packet after rtw_xmitframe_coalesce - rtw_os_xmit_complete(padapter, pxmitframe); - - // (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz - _update_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz); - - // don't need xmitframe any more - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - - // handle pointer and stop condition - pbuf_tail = pbuf + len; - pbuf = _RND8(pbuf_tail); - - pfirstframe->agg_num++; - if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num) - break; - - if (pbuf < bulkPtr) { - descCount++; - if (descCount == pHalData->UsbTxAggDescNum) - break; - } else { - descCount = 0; - bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; - } - } - if (_rtw_queue_empty(&ptxservq->sta_pending) == _TRUE) - rtw_list_delete(&ptxservq->tx_pending); - - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - if ((pfirstframe->attrib.ether_type != 0x0806) && - (pfirstframe->attrib.ether_type != 0x888e) && - (pfirstframe->attrib.dhcp_pkt != 1)) - { - if(padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE) - rtw_issue_addbareq_cmd(padapter, pfirstframe); - } - -#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX - //3 3. update first frame txdesc - if ((pbuf_tail % bulkSize) == 0) { - // remove pkt_offset - pbuf_tail -= PACKET_OFFSET_SZ; - pfirstframe->buf_addr += PACKET_OFFSET_SZ; - pfirstframe->pkt_offset = 0; - } -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - _update_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz); - - //3 4. write xmit buffer to USB FIFO - ff_hwaddr = rtw_get_ff_hwaddr(pfirstframe); - - // xmit address == ((xmit_frame*)pxmitbuf->priv_data)->buf_addr - rtw_write_port(padapter, ff_hwaddr, pbuf_tail, (u8*)pxmitbuf); - - - //3 5. update statisitc - pbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE); - if (pfirstframe->pkt_offset == 1) pbuf_tail -= PACKET_OFFSET_SZ; - - rtw_count_tx_stats(padapter, pfirstframe, pbuf_tail); - - rtw_free_xmitframe_ex(pxmitpriv, pfirstframe); - - return _TRUE; -} - -#else - -s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) -{ - - struct hw_xmit *phwxmits; - sint hwentry; - struct xmit_frame *pxmitframe=NULL; - int res=_SUCCESS, xcnt = 0; - - phwxmits = pxmitpriv->hwxmits; - hwentry = pxmitpriv->hwxmit_entry; - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete()\n")); - - if(pxmitbuf==NULL) - { - pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); - if(!pxmitbuf) - { - return _FALSE; - } - } - - - do - { - pxmitframe = rtw_dequeue_xframe(pxmitpriv, phwxmits, hwentry); - - if(pxmitframe) - { - pxmitframe->pxmitbuf = pxmitbuf; - - pxmitframe->buf_addr = pxmitbuf->pbuf; - - pxmitbuf->priv_data = pxmitframe; - - if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) - { - if(pxmitframe->attrib.priority<=15)//TID0~15 - { - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - } - - rtw_os_xmit_complete(padapter, pxmitframe);//always return ndis_packet after rtw_xmitframe_coalesce - } - - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete(): rtw_dump_xframe\n")); - - - if(res == _SUCCESS) - { - rtw_dump_xframe(padapter, pxmitframe); - } - else - { - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - } - - xcnt++; - - } - else - { - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - return _FALSE; - } - - break; - - }while(0/*xcnt < (NR_XMITFRAME >> 3)*/); - - return _TRUE; - -} -#endif - - - -static s32 xmitframe_direct(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - s32 res = _SUCCESS; - - - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - if (res == _SUCCESS) { - rtw_dump_xframe(padapter, pxmitframe); - } - - return res; -} - -/* - * Return - * _TRUE dump packet directly - * _FALSE enqueue packet - */ -static s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - _irqL irqL; - s32 res; - struct xmit_buf *pxmitbuf = NULL; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#ifdef CONFIG_TDLS - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -#endif - - do_queue_select(padapter, pattrib); - - _enter_critical_bh(&pxmitpriv->lock, &irqL); - -#ifndef CONFIG_TDLS -#ifdef CONFIG_AP_MODE - if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) - { - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - if(pattrib->psta) - { - psta = pattrib->psta; - } - else - { - psta=rtw_get_stainfo(pstapriv, pattrib->ra); - } - - if(psta) - { - if(psta->sleepq_len > (NR_XMITFRAME>>3)) - { - wakeup_sta_to_xmit(padapter, psta); - } - } - - return _FALSE; - } -#endif -//else CONFIG_TDLS, process as TDLS Buffer STA -#else - if(pmlmeinfo->tdls_setup_state&TDLS_LINKED_STATE ){ //&& pattrib->ether_type!=0x0806) - res = xmit_tdls_enqueue_for_sleeping_sta(padapter, pxmitframe); - if(res==_TRUE){ - _exit_critical_bh(&pxmitpriv->lock, &irqL); - return _FALSE; - }else if(res==2){ - goto enqueue; - } - } -#endif - - if (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0) - goto enqueue; - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) - goto enqueue; - - - pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); - if (pxmitbuf == NULL) - goto enqueue; - - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - pxmitframe->pxmitbuf = pxmitbuf; - pxmitframe->buf_addr = pxmitbuf->pbuf; - pxmitbuf->priv_data = pxmitframe; - - if (xmitframe_direct(padapter, pxmitframe) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - } - - return _TRUE; - -enqueue: - res = rtw_xmitframe_enqueue(padapter, pxmitframe); - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - if (res != _SUCCESS) { - RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("pre_xmitframe: enqueue xmitframe fail\n")); - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - - // Trick, make the statistics correct - pxmitpriv->tx_pkts--; - pxmitpriv->tx_drop++; - return _TRUE; - } - - return _FALSE; -} - -void rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe) -{ - rtw_dump_xframe(padapter, pmgntframe); -} - -/* - * Return - * _TRUE dump packet directly ok - * _FALSE temporary can't transmit packets to hardware - */ -s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - return pre_xmitframe(padapter, pxmitframe); -} - -#ifdef CONFIG_HOSTAPD_MLME - -static void rtl8192cu_hostap_mgnt_xmit_cb(struct urb *urb) -{ -#ifdef PLATFORM_LINUX - struct sk_buff *skb = (struct sk_buff *)urb->context; - - //DBG_8192C("%s\n", __FUNCTION__); - - dev_kfree_skb_any(skb); -#endif -} - -s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) -{ -#ifdef PLATFORM_LINUX - u16 fc; - int rc, len, pipe; - unsigned int bmcst, tid, qsel; - struct sk_buff *skb, *pxmit_skb; - struct urb *urb; - unsigned char *pxmitbuf; - struct tx_desc *ptxdesc; - struct ieee80211_hdr *tx_hdr; - struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; - struct net_device *pnetdev = padapter->pnetdev; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dvobj_priv *pdvobj = &padapter->dvobjpriv; - - - //DBG_8192C("%s\n", __FUNCTION__); - - skb = pkt; - - len = skb->len; - tx_hdr = (struct ieee80211_hdr *)(skb->data); - fc = le16_to_cpu(tx_hdr->frame_ctl); - bmcst = IS_MCAST(tx_hdr->addr1); - - if ((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT) - goto _exit; - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pxmit_skb = dev_alloc_skb(len + TXDESC_SIZE); -#else - pxmit_skb = netdev_alloc_skb(pnetdev, len + TXDESC_SIZE); -#endif - - if(!pxmit_skb) - goto _exit; - - pxmitbuf = pxmit_skb->data; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - goto _exit; - } - - // ----- fill tx desc ----- - ptxdesc = (struct tx_desc *)pxmitbuf; - _rtw_memset(ptxdesc, 0, sizeof(*ptxdesc)); - - //offset 0 - ptxdesc->txdw0 |= cpu_to_le32(len&0x0000ffff); - ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(OWN | FSG | LSG); - - if(bmcst) - { - ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); - } - - //offset 4 - ptxdesc->txdw1 |= cpu_to_le32(0x00);//MAC_ID - - ptxdesc->txdw1 |= cpu_to_le32((0x12<txdw1 |= cpu_to_le32((0x06<< 16) & 0x000f0000);//b mode - - //offset 8 - - //offset 12 - ptxdesc->txdw3 |= cpu_to_le32((le16_to_cpu(tx_hdr->seq_ctl)<<16)&0xffff0000); - - //offset 16 - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - //offset 20 - - - //HW append seq - ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number - ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. - - - rtl8192cu_cal_txdesc_chksum(ptxdesc); - // ----- end of fill tx desc ----- - - // - skb_put(pxmit_skb, len + TXDESC_SIZE); - pxmitbuf = pxmitbuf + TXDESC_SIZE; - _rtw_memcpy(pxmitbuf, skb->data, len); - - //DBG_8192C("mgnt_xmit, len=%x\n", pxmit_skb->len); - - - // ----- prepare urb for submit ----- - - //translate DMA FIFO addr to pipehandle - //pipe = ffaddr2pipehdl(pdvobj, MGT_QUEUE_INX); - pipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f); - - usb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe, - pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb); - - urb->transfer_flags |= URB_ZERO_PACKET; - usb_anchor_urb(urb, &phostapdpriv->anchored); - rc = usb_submit_urb(urb, GFP_ATOMIC); - if (rc < 0) { - usb_unanchor_urb(urb); - kfree_skb(skb); - } - usb_free_urb(urb); - - -_exit: - - dev_kfree_skb_any(skb); - -#endif - - return 0; - -} -#endif - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c deleted file mode 100755 index 145902a3d5c0..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c +++ /dev/null @@ -1,5453 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _HCI_HAL_INIT_C_ - -#include -#include -#include -#include - -#include -#include - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM -#include "rtl8192c_sreset.h" -#endif - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -#ifndef CONFIG_USB_HCI - -#error "CONFIG_USB_HCI shall be on!\n" - -#endif - -#include -#include -#include - -#if DISABLE_BB_RF - #define HAL_MAC_ENABLE 0 - #define HAL_BB_ENABLE 0 - #define HAL_RF_ENABLE 0 -#else - #define HAL_MAC_ENABLE 1 - #define HAL_BB_ENABLE 1 - #define HAL_RF_ENABLE 1 -#endif - -//endpoint number 1,2,3,4,5 -// bult in : 1 -// bult out: 2 (High) -// bult out: 3 (Normal) for 3 out_ep, (Low) for 2 out_ep -// interrupt in: 4 -// bult out: 5 (Low) for 3 out_ep - - -static VOID -_OneOutEpMapping( - IN HAL_DATA_TYPE *pHalData - ) -{ - //only endpoint number 0x02 - - pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO - pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI - pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[0];//BE - pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK - - pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN - pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT - pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH - pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD -} - - -static VOID -_TwoOutEpMapping( - IN BOOLEAN IsTestChip, - IN HAL_DATA_TYPE *pHalData, - IN BOOLEAN bWIFICfg - ) -{ - -/* -#define VO_QUEUE_INX 0 -#define VI_QUEUE_INX 1 -#define BE_QUEUE_INX 2 -#define BK_QUEUE_INX 3 -#define BCN_QUEUE_INX 4 -#define MGT_QUEUE_INX 5 -#define HIGH_QUEUE_INX 6 -#define TXCMD_QUEUE_INX 7 -*/ - - if(IsTestChip && bWIFICfg){ // test chip && wmm - - - // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA - //{ 1, 0, 1, 0, 0, 0, 0, 0, 0 }; - //0:H(end_number=0x02), 1:L (end_number=0x03) - - pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO - pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI - pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[0];//BE - pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK - - pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN - pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT - pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH - pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD - } - else if(!IsTestChip && bWIFICfg){ // Normal chip && wmm - - // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA - //{ 0, 1, 0, 1, 0, 0, 0, 0, 0 }; - //0:H(end_number=0x02), 1:L (end_number=0x03) - - pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[1];//VO - pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI - pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE - pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK - - pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN - pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT - pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH - pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD - } - else{//typical setting - - //BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA - //{ 1, 1, 0, 0, 0, 0, 0, 0, 0 }; - //0:H(end_number=0x02), 1:L (end_number=0x03) - - pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO - pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI - pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE - pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK - - pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN - pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT - pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH - pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD - } - -} - - -static VOID _ThreeOutEpMapping( - IN HAL_DATA_TYPE *pHalData, - IN BOOLEAN bWIFICfg - ) -{ - if(bWIFICfg){//for WMM - - // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA - //{ 1, 2, 1, 0, 0, 0, 0, 0, 0 }; - //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05) - - pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO - pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI - pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE - pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK - - pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN - pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT - pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH - pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD - } - else{//typical setting - - // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA - //{ 2, 2, 1, 0, 0, 0, 0, 0, 0 }; - //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05) - pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO - pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI - pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE - pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[2];//BK - - pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN - pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT - pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH - pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD - } - -} - -static BOOLEAN -_MappingOutEP( - IN PADAPTER pAdapter, - IN u8 NumOutPipe, - IN BOOLEAN IsTestChip - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct registry_priv *pregistrypriv = &pAdapter->registrypriv; - - BOOLEAN bWIFICfg = (pregistrypriv->wifi_spec) ?_TRUE:_FALSE; - - BOOLEAN result = _TRUE; - - switch(NumOutPipe) - { - case 2: - _TwoOutEpMapping(IsTestChip, pHalData, bWIFICfg); - break; - case 3: - // Test chip doesn't support three out EPs. - if(IsTestChip){ - return _FALSE; - } - _ThreeOutEpMapping(pHalData, bWIFICfg); - break; - case 1: - _OneOutEpMapping(pHalData); - break; - default: - result = _FALSE; - break; - } - - return result; - -} - -static VOID -_ConfigTestChipOutEP( - IN PADAPTER pAdapter, - IN u8 NumOutPipe - ) -{ - u8 value8,txqsele; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - pHalData->OutEpQueueSel = 0; - pHalData->OutEpNumber = 0; - - value8 = rtw_read8(pAdapter, REG_TEST_SIE_OPTIONAL); - value8 = (value8 & USB_TEST_EP_MASK) >> USB_TEST_EP_SHIFT; - - switch(value8) - { - case 0: // 2 bulk OUT, 1 bulk IN - case 3: - pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ; - pHalData->OutEpNumber = 2; - //RT_TRACE(COMP_INIT, DBG_LOUD, ("EP Config: 2 bulk OUT, 1 bulk IN\n")); - break; - case 1: // 1 bulk IN/OUT => map all endpoint to Low queue - case 2: // 1 bulk IN, 1 bulk OUT => map all endpoint to High queue - txqsele = rtw_read8(pAdapter, REG_TEST_USB_TXQS); - if(txqsele & 0x0F){//map all endpoint to High queue - pHalData->OutEpQueueSel = TX_SELE_HQ; - } - else if(txqsele&0xF0){//map all endpoint to Low queue - pHalData->OutEpQueueSel = TX_SELE_LQ; - } - pHalData->OutEpNumber = 1; - //RT_TRACE(COMP_INIT, DBG_LOUD, ("%s\n", ((1 == value8) ? "1 bulk IN/OUT" : "1 bulk IN, 1 bulk OUT"))); - break; - default: - break; - } - - // TODO: Error recovery for this case - //RT_ASSERT((NumOutPipe == pHalData->OutEpNumber), ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n", (u4Byte)NumOutPipe, (u4Byte)pHalData->OutEpNumber)); - -} - - - -static VOID -_ConfigNormalChipOutEP( - IN PADAPTER pAdapter, - IN u8 NumOutPipe - ) -{ - u8 value8; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - pHalData->OutEpQueueSel = 0; - pHalData->OutEpNumber = 0; - - // Normal and High queue - value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 1)); - - if(value8 & USB_NORMAL_SIE_EP_MASK){ - pHalData->OutEpQueueSel |= TX_SELE_HQ; - pHalData->OutEpNumber++; - } - - if((value8 >> USB_NORMAL_SIE_EP_SHIFT) & USB_NORMAL_SIE_EP_MASK){ - pHalData->OutEpQueueSel |= TX_SELE_NQ; - pHalData->OutEpNumber++; - } - - // Low queue - value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 2)); - if(value8 & USB_NORMAL_SIE_EP_MASK){ - pHalData->OutEpQueueSel |= TX_SELE_LQ; - pHalData->OutEpNumber++; - } - - // TODO: Error recovery for this case - //RT_ASSERT((NumOutPipe == pHalData->OutEpNumber), ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n", (u4Byte)NumOutPipe, (u4Byte)pHalData->OutEpNumber)); - -} - -static BOOLEAN HalUsbSetQueuePipeMapping8192CUsb( - IN PADAPTER pAdapter, - IN u8 NumInPipe, - IN u8 NumOutPipe - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN result = _FALSE; - BOOLEAN isNormalChip; - - //may be update UPHY Parameter == georgia - - - // ReadAdapterInfo8192C also call _ReadChipVersion too. - // Since we need dynamic config EP mapping, so we call this function to get chip version. - // We can remove _ReadChipVersion from ReadAdapterInfo8192C later. - //pHalData->VersionID = rtl8192c_ReadChipVersion(pAdapter); - - isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); - - if(isNormalChip){ - _ConfigNormalChipOutEP(pAdapter, NumOutPipe); - } - else{ - _ConfigTestChipOutEP(pAdapter, NumOutPipe); - } - - // Normal chip with one IN and one OUT doesn't have interrupt IN EP. - if(isNormalChip && (1 == pHalData->OutEpNumber)){ - if(1 != NumInPipe){ - return result; - } - } - - // All config other than above support one Bulk IN and one Interrupt IN. - //if(2 != NumInPipe){ - // return result; - //} - - result = _MappingOutEP(pAdapter, NumOutPipe, !isNormalChip); - - return result; - -} - -void rtl8192cu_interface_configure(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; - - if (pdvobjpriv->ishighspeed == _TRUE) - { - pHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes - } - else - { - pHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes - } - - pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber; - pHalData->RtBulkInPipe = pdvobjpriv->ep_num[0]; - pHalData->RtBulkOutPipe[0] = pdvobjpriv->ep_num[1]; - pHalData->RtBulkOutPipe[1] = pdvobjpriv->ep_num[2]; - pHalData->RtIntInPipe = pdvobjpriv->ep_num[3]; - pHalData->RtBulkOutPipe[2] = pdvobjpriv->ep_num[4]; - -#ifdef CONFIG_USB_TX_AGGREGATION - pHalData->UsbTxAggMode = 1; - pHalData->UsbTxAggDescNum = 0x6; // only 4 bits -#endif - -#ifdef CONFIG_USB_RX_AGGREGATION - pHalData->UsbRxAggMode = USB_RX_AGG_DMA;// USB_RX_AGG_DMA; - pHalData->UsbRxAggBlockCount = 8; //unit : 512b - pHalData->UsbRxAggBlockTimeout = 0x6; - pHalData->UsbRxAggPageCount = 48; //uint :128 b //0x0A; // 10 = MAX_RX_DMA_BUFFER_SIZE/2/pHalData->UsbBulkOutSize - pHalData->UsbRxAggPageTimeout = 0x4; //6, absolute time = 34ms/(2^6) -#endif - - HalUsbSetQueuePipeMapping8192CUsb(padapter, - pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); - -} - -static u8 _InitPowerOn(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 ret = _SUCCESS; - u16 value16=0; - u8 value8 = 0; - u32 value32 = 0; - - // polling autoload done. - u32 pollingCount = 0; - - do - { - if(rtw_read8(padapter, REG_APS_FSMCO) & PFM_ALDN){ - //RT_TRACE(COMP_INIT,DBG_LOUD,("Autoload Done!\n")); - break; - } - - if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ - //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[PFM_ALDN] done!\n")); - return _FAIL; - } - - }while(_TRUE); - - -// For hardware power on sequence. - - //0. RSV_CTRL 0x1C[7:0] = 0x00 // unlock ISO/CLK/Power control register - rtw_write8(padapter, REG_RSV_CTRL, 0x0); - // Power on when re-enter from IPS/Radio off/card disable - rtw_write8(padapter, REG_SPS0_CTRL, 0x2b);//enable SPS into PWM mode -/* - value16 = PlatformIORead2Byte(Adapter, REG_AFE_XTAL_CTRL);//enable AFE clock - value16 &= (~XTAL_GATE_AFE); - PlatformIOWrite2Byte(Adapter,REG_AFE_XTAL_CTRL, value16 ); -*/ - - rtw_udelay_os(100);//PlatformSleepUs(150);//this is not necessary when initially power on - - value8 = rtw_read8(padapter, REG_LDOV12D_CTRL); - if(0== (value8 & LDV12_EN) ){ - value8 |= LDV12_EN; - rtw_write8(padapter, REG_LDOV12D_CTRL, value8); - //RT_TRACE(COMP_INIT, DBG_LOUD, (" power-on :REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8)); - rtw_udelay_os(100);//PlatformSleepUs(100);//this is not necessary when initially power on - value8 = rtw_read8(padapter, REG_SYS_ISO_CTRL); - value8 &= ~ISO_MD2PP; - rtw_write8(padapter, REG_SYS_ISO_CTRL, value8); - } - - // auto enable WLAN - pollingCount = 0; - value16 = rtw_read16(padapter, REG_APS_FSMCO); - value16 |= APFM_ONMAC; - rtw_write16(padapter, REG_APS_FSMCO, value16); - - do - { - if(0 == (rtw_read16(padapter, REG_APS_FSMCO) & APFM_ONMAC)){ - //RT_TRACE(COMP_INIT,DBG_LOUD,("MAC auto ON okay!\n")); - break; - } - - if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ - //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[APFM_ONMAC] done!\n")); - return _FAIL; - } - - }while(_TRUE); - - //Enable Radio ,GPIO ,and LED function - rtw_write16(padapter,REG_APS_FSMCO,0x0812); - -#ifdef CONFIG_AUTOSUSPEND - //for usb Combo card ,BT - if((BOARD_USB_COMBO == pHalData->BoardType)&&(padapter->registrypriv.usbss_enable)) - { - value32 = rtw_read32(padapter, REG_APS_FSMCO); - value32 |= (SOP_ABG|SOP_AMB|XOP_BTCK); - rtw_write32(padapter, REG_APS_FSMCO, value32); - } -#endif - - // release RF digital isolation - value16 = rtw_read16(padapter, REG_SYS_ISO_CTRL); - value16 &= ~ISO_DIOR; - rtw_write16(padapter, REG_SYS_ISO_CTRL, value16); - - // Enable MAC DMA/WMAC/SCHEDULE/SEC block - value16 = rtw_read16(padapter, REG_CR); - value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN - | PROTOCOL_EN | SCHEDULE_EN | MACTXEN | MACRXEN | ENSEC); - rtw_write16(padapter, REG_CR, value16); - - //tynli_test for suspend mode. - { - rtw_write8(padapter, 0xfe10, 0x19); - } - - // 2010/11/22 MH For slim combo debug mode check. - if (pHalData->BoardType == BOARD_USB_COMBO) - { - if (pHalData->SlimComboDbg == _TRUE) - { - DBG_8192C("SlimComboDbg == TRUE\n"); - - // 1. SIC?Test Mode , Debug Ports |۰ Enable, ҥH Driver Wӫ, - // nг]w 0x 00[7] -> "1", N Disable. effect if not: power consumption increase - rtw_write8(padapter, REG_SYS_ISO_CTRL, rtw_read8(padapter, REG_SYS_ISO_CTRL)|BIT7); - - // 2. SIC?Test Mode , GPIO-8?| report Power State ҥH Driver Wӫ, г]w? 0x04[6] -> "1" N Disable - // effect if not: GPIO-8 could not be GPIO or LED function - rtw_write8(padapter, REG_APS_FSMCO, rtw_read8(padapter, REG_APS_FSMCO)|BIT6); - - // 3. SIC Test Mode , EESK, EECS | report?Host Clock status, ҥH Driver Wӫ, г]w? 0x40[4] -> "1" N EEPROM ϥ Pin (autoload still from Efuse) - // effect if not:power consumption increase - value8 = rtw_read8(padapter, REG_GPIO_MUXCFG)|BIT4 ; - #ifdef CONFIG_BT_COEXIST - // 2011/01/26 MH UMB-B cut bug. We need to support the modification. - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && - pHalData->bt_coexist.BT_Coexist) - { - value8 |= (BIT5); - } - #endif - rtw_write8(padapter, REG_GPIO_MUXCFG,value8 ); - - - // 4. SIC Test Mode ,?SIC Debug ports |۰ Enable , ҥH Driver WӫᰨW, г]w? 0x40[15:11] -> 0x00, NDisable - // 4.1Two Steps setting for safety: 0x40[15,13,12, 11] -> "0", then ?0x40[14] -> "0" - // effect if not: Host could not transfer packets, and GPIO-3,2 will occupied by SIC then Co-exist could not work. - rtw_write16(padapter, REG_GPIO_MUXCFG, (rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF)|BIT14); - rtw_write16(padapter, REG_GPIO_MUXCFG, rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF); - } - } - - - // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in - // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all - // IC. According to Johnny's opinion, only RU will meet the condition. - if (IS_HARDWARE_TYPE_8192C(padapter) && (pHalData->BoardType == BOARD_USB_High_PA)) - rtw_write32(padapter, rFPGA0_XCD_RFParameter, rtw_read32(padapter, rFPGA0_XCD_RFParameter)&(~BIT1)); - return ret; - -} - - -static void _dbg_dump_macreg(_adapter *padapter) -{ - u32 offset = 0; - u32 val32 = 0; - u32 index =0 ; - for(index=0;index<64;index++) - { - offset = index*4; - val32 = rtw_read32(padapter,offset); - DBG_8192C("offset : 0x%02x ,val:0x%08x\n",offset,val32); - } -} - - -static void _InitPABias(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 pa_setting; - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); - - //FIXED PA current issue - //efuse_one_byte_read(padapter, 0x1FA, &pa_setting); - pa_setting = EFUSE_Read1Byte(padapter, 0x1FA); - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("_InitPABias 0x1FA 0x%x \n",pa_setting)); - - if(!(pa_setting & BIT0)) - { - PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x0F406); - PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x4F406); - PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x8F406); - PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0xCF406); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path A\n")); - } - - if(!(pa_setting & BIT1) && isNormal && is92C) - { - PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x0F406); - PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x4F406); - PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x8F406); - PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0xCF406); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path B\n")); - } - - if(!(pa_setting & BIT4)) - { - pa_setting = rtw_read8(padapter, 0x16); - pa_setting &= 0x0F; - rtw_write8(padapter, 0x16, pa_setting | 0x90); - } -} -#ifdef CONFIG_BT_COEXIST -static void _InitBTCoexist(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); - u8 u1Tmp; - - if(pbtpriv->BT_Coexist && pbtpriv->BT_CoexistType == BT_CSR_BC4) - { - -#if MP_DRIVER != 1 - if(pbtpriv->BT_Ant_isolation) - { - rtw_write8( padapter,REG_GPIO_MUXCFG, 0xa0); - DBG_8192C("BT write 0x%x = 0x%x\n", REG_GPIO_MUXCFG, 0xa0); - } -#endif - - u1Tmp = rtw_read8(padapter, 0x4fd) & BIT0; - u1Tmp = u1Tmp | - ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) | - ((pbtpriv->BT_Service==BT_SCO)?0:BIT2); - rtw_write8( padapter, 0x4fd, u1Tmp); - DBG_8192C("BT write 0x%x = 0x%x for non-isolation\n", 0x4fd, u1Tmp); - - - rtw_write32(padapter, REG_BT_COEX_TABLE+4, 0xaaaa9aaa); - DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+4, 0xaaaa9aaa); - - rtw_write32(padapter, REG_BT_COEX_TABLE+8, 0xffbd0040); - DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+8, 0xffbd0040); - - rtw_write32(padapter, REG_BT_COEX_TABLE+0xc, 0x40000010); - DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+0xc, 0x40000010); - - //Config to 1T1R - u1Tmp = rtw_read8(padapter,rOFDM0_TRxPathEnable); - u1Tmp &= ~(BIT1); - rtw_write8( padapter, rOFDM0_TRxPathEnable, u1Tmp); - DBG_8192C("BT write 0xC04 = 0x%x\n", u1Tmp); - - u1Tmp = rtw_read8(padapter, rOFDM1_TRxPathEnable); - u1Tmp &= ~(BIT1); - rtw_write8( padapter, rOFDM1_TRxPathEnable, u1Tmp); - DBG_8192C("BT write 0xD04 = 0x%x\n", u1Tmp); - - } -} -#endif - -//------------------------------------------------------------------------- -// -// LLT R/W/Init function -// -//------------------------------------------------------------------------- -static u8 _LLTWrite( - IN PADAPTER Adapter, - IN u32 address, - IN u32 data - ) -{ - u8 status = _SUCCESS; - int count = 0; - u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS); - - rtw_write32(Adapter, REG_LLT_INIT, value); - - //polling - do{ - - value = rtw_read32(Adapter, REG_LLT_INIT); - if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){ - break; - } - - if(count > POLLING_LLT_THRESHOLD){ - //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling write LLT done at address %d!\n", address)); - status = _FAIL; - break; - } - }while(count++); - - return status; - -} - - -static u8 _LLTRead( - IN PADAPTER Adapter, - IN u32 address - ) -{ - int count = 0; - u32 value = _LLT_INIT_ADDR(address) | _LLT_OP(_LLT_READ_ACCESS); - - rtw_write32(Adapter, REG_LLT_INIT, value); - - //polling and get value - do{ - - value = rtw_read32(Adapter, REG_LLT_INIT); - if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){ - return (u8)value; - } - - if(count > POLLING_LLT_THRESHOLD){ - //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling read LLT done at address %d!\n", address)); - break; - } - }while(count++); - - return 0xFF; - -} - - -static u8 InitLLTTable( - IN PADAPTER Adapter, - IN u32 boundary - ) -{ - u8 status = _SUCCESS; - u32 i; - - for(i = 0 ; i < (boundary - 1) ; i++){ - status = _LLTWrite(Adapter, i , i + 1); - if(_SUCCESS != status){ - return status; - } - } - - // end of list - status = _LLTWrite(Adapter, (boundary - 1), 0xFF); - if(_SUCCESS != status){ - return status; - } - - // Make the other pages as ring buffer - // This ring buffer is used as beacon buffer if we config this MAC as two MAC transfer. - // Otherwise used as local loopback buffer. - for(i = boundary ; i < LAST_ENTRY_OF_TX_PKT_BUFFER ; i++){ - status = _LLTWrite(Adapter, i, (i + 1)); - if(_SUCCESS != status){ - return status; - } - } - - // Let last entry point to the start entry of ring buffer - status = _LLTWrite(Adapter, LAST_ENTRY_OF_TX_PKT_BUFFER, boundary); - if(_SUCCESS != status){ - return status; - } - - return status; - -} - - -//--------------------------------------------------------------- -// -// MAC init functions -// -//--------------------------------------------------------------- -static VOID -_SetMacID( - IN PADAPTER Adapter, u8* MacID - ) -{ - u32 i; - for(i=0 ; i< MAC_ADDR_LEN ; i++){ - rtw_write32(Adapter, REG_MACID+i, MacID[i]); - } -} - -static VOID -_SetBSSID( - IN PADAPTER Adapter, u8* BSSID - ) -{ - u32 i; - for(i=0 ; i< MAC_ADDR_LEN ; i++){ - rtw_write32(Adapter, REG_BSSID+i, BSSID[i]); - } -} - - -// Shall USB interface init this? -static VOID -_InitInterrupt( - IN PADAPTER Adapter - ) -{ - u32 value32; - - // HISR - turn all on - value32 = 0xFFFFFFFF; - rtw_write32(Adapter, REG_HISR, value32); - - // HIMR - turn all on - rtw_write32(Adapter, REG_HIMR, value32); -} - - -static VOID -_InitQueueReservedPage( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - BOOLEAN isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); - - u32 outEPNum = (u32)pHalData->OutEpNumber; - u32 numHQ = 0; - u32 numLQ = 0; - u32 numNQ = 0; - u32 numPubQ; - u32 value32; - u8 value8; - BOOLEAN bWiFiConfig = pregistrypriv->wifi_spec; - //u32 txQPageNum, txQPageUnit,txQRemainPage; - -#if 0 - if(!pregistrypriv->wifi_spec){ - numPubQ = (isNormalChip) ? NORMAL_PAGE_NUM_PUBQ : TEST_PAGE_NUM_PUBQ; - //RT_ASSERT((numPubQ < TX_TOTAL_PAGE_NUMBER), ("Public queue page number is great than total tx page number.\n")); - txQPageNum = TX_TOTAL_PAGE_NUMBER - numPubQ; - - //RT_ASSERT((0 == txQPageNum%txQPageNum), ("Total tx page number is not dividable!\n")); - - txQPageUnit = txQPageNum/outEPNum; - txQRemainPage = txQPageNum % outEPNum; - - if(pHalData->OutEpQueueSel & TX_SELE_HQ){ - numHQ = txQPageUnit; - } - if(pHalData->OutEpQueueSel & TX_SELE_LQ){ - numLQ = txQPageUnit; - } - // HIGH priority queue always present in the configuration of 2 or 3 out-ep - // so ,remainder pages have assigned to High queue - if((outEPNum>1) && (txQRemainPage)){ - numHQ += txQRemainPage; - } - - // NOTE: This step shall be proceed before writting REG_RQPN. - if(isNormalChip){ - if(pHalData->OutEpQueueSel & TX_SELE_NQ){ - numNQ = txQPageUnit; - } - value8 = (u8)_NPQ(numNQ); - rtw_write8(Adapter, REG_RQPN_NPQ, value8); - } - //RT_ASSERT(((numHQ + numLQ + numNQ + numPubQ) < TX_PAGE_BOUNDARY), ("Total tx page number is greater than tx boundary!\n")); - } - else -#endif - { //for WMM - //RT_ASSERT((outEPNum>=2), ("for WMM ,number of out-ep must more than or equal to 2!\n")); - - numPubQ = (isNormalChip) ? ((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_PUBQ:NORMAL_PAGE_NUM_PUBQ) - :WMM_TEST_PAGE_NUM_PUBQ; - - if(pHalData->OutEpQueueSel & TX_SELE_HQ){ - numHQ = (isNormalChip)?((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_HPQ:NORMAL_PAGE_NUM_HPQ) - :WMM_TEST_PAGE_NUM_HPQ; - } - - if(pHalData->OutEpQueueSel & TX_SELE_LQ){ - numLQ = (isNormalChip)?((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_LPQ:NORMAL_PAGE_NUM_LPQ) - :WMM_TEST_PAGE_NUM_LPQ; - } - // NOTE: This step shall be proceed before writting REG_RQPN. - if(isNormalChip){ - if(pHalData->OutEpQueueSel & TX_SELE_NQ){ - numNQ = (bWiFiConfig)?WMM_NORMAL_PAGE_NUM_NPQ:NORMAL_PAGE_NUM_NPQ; - } - value8 = (u8)_NPQ(numNQ); - rtw_write8(Adapter, REG_RQPN_NPQ, value8); - } - } - - // TX DMA - value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN; - rtw_write32(Adapter, REG_RQPN, value32); -} - -static void _InitID(IN PADAPTER Adapter) -{ - int i; - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - - for(i=0; i<6; i++) - { - rtw_write8(Adapter, (REG_MACID+i), pEEPROM->mac_addr[i]); - } - -/* - NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); - //Ziv test -#if 1 - { - u1Byte sMacAddr[6] = {0}; - u4Byte i; - - for(i = 0 ; i < MAC_ADDR_LEN ; i++){ - sMacAddr[i] = PlatformIORead1Byte(Adapter, (REG_MACID + i)); - } - RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "Read back MAC Addr: ", sMacAddr); - } -#endif - -#if 0 - u4Byte nMAR = 0xFFFFFFFF; - u8 m_MacID[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; - u8 m_BSSID[] = {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; - int i; - - _SetMacID(Adapter, Adapter->PermanentAddress); - _SetBSSID(Adapter, m_BSSID); - - //set MAR - PlatformIOWrite4Byte(Adapter, REG_MAR, nMAR); - PlatformIOWrite4Byte(Adapter, REG_MAR+4, nMAR); -#endif -*/ -} - - -static VOID -_InitTxBufferBoundary( - IN PADAPTER Adapter - ) -{ - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - u8 txpktbuf_bndy; - - if(!pregistrypriv->wifi_spec){ - txpktbuf_bndy = TX_PAGE_BOUNDARY; - } - else{//for WMM - txpktbuf_bndy = ( IS_NORMAL_CHIP( pHalData->VersionID))?WMM_NORMAL_TX_PAGE_BOUNDARY - :WMM_TEST_TX_PAGE_BOUNDARY; - } - - rtw_write8(Adapter, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy); - rtw_write8(Adapter, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy); - rtw_write8(Adapter, REG_TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy); - rtw_write8(Adapter, REG_TRXFF_BNDY, txpktbuf_bndy); -#if 1 - rtw_write8(Adapter, REG_TDECTRL+1, txpktbuf_bndy); -#else - txdmactrl = PlatformIORead2Byte(Adapter, REG_TDECTRL); - txdmactrl &= ~BCN_HEAD_MASK; - txdmactrl |= BCN_HEAD(txpktbuf_bndy); - PlatformIOWrite2Byte(Adapter, REG_TDECTRL, txdmactrl); -#endif -} - -static VOID -_InitPageBoundary( - IN PADAPTER Adapter - ) -{ - // RX Page Boundary - //srand(static_cast(time(NULL)) ); - u16 rxff_bndy = 0x27FF;//(rand() % 1) ? 0x27FF : 0x23FF; - - rtw_write16(Adapter, (REG_TRXFF_BNDY + 2), rxff_bndy); - - // TODO: ?? shall we set tx boundary? -} - - -static VOID -_InitNormalChipRegPriority( - IN PADAPTER Adapter, - IN u16 beQ, - IN u16 bkQ, - IN u16 viQ, - IN u16 voQ, - IN u16 mgtQ, - IN u16 hiQ - ) -{ - u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7); - - value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | - _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | - _TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ); - - rtw_write16(Adapter, REG_TRXDMA_CTRL, value16); -} - -static VOID -_InitNormalChipOneOutEpPriority( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - u16 value = 0; - switch(pHalData->OutEpQueueSel) - { - case TX_SELE_HQ: - value = QUEUE_HIGH; - break; - case TX_SELE_LQ: - value = QUEUE_LOW; - break; - case TX_SELE_NQ: - value = QUEUE_NORMAL; - break; - default: - //RT_ASSERT(FALSE,("Shall not reach here!\n")); - break; - } - - _InitNormalChipRegPriority(Adapter, - value, - value, - value, - value, - value, - value - ); - -} - -static VOID -_InitNormalChipTwoOutEpPriority( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; - - - u16 valueHi = 0; - u16 valueLow = 0; - - switch(pHalData->OutEpQueueSel) - { - case (TX_SELE_HQ | TX_SELE_LQ): - valueHi = QUEUE_HIGH; - valueLow = QUEUE_LOW; - break; - case (TX_SELE_NQ | TX_SELE_LQ): - valueHi = QUEUE_NORMAL; - valueLow = QUEUE_LOW; - break; - case (TX_SELE_HQ | TX_SELE_NQ): - valueHi = QUEUE_HIGH; - valueLow = QUEUE_NORMAL; - break; - default: - //RT_ASSERT(FALSE,("Shall not reach here!\n")); - break; - } - - if(!pregistrypriv->wifi_spec ){ - beQ = valueLow; - bkQ = valueLow; - viQ = valueHi; - voQ = valueHi; - mgtQ = valueHi; - hiQ = valueHi; - } - else{//for WMM ,CONFIG_OUT_EP_WIFI_MODE - beQ = valueLow; - bkQ = valueHi; - viQ = valueHi; - voQ = valueLow; - mgtQ = valueHi; - hiQ = valueHi; - } - - _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); - -} - -static VOID -_InitNormalChipThreeOutEpPriority( - IN PADAPTER Adapter - ) -{ - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; - - if(!pregistrypriv->wifi_spec ){// typical setting - beQ = QUEUE_LOW; - bkQ = QUEUE_LOW; - viQ = QUEUE_NORMAL; - voQ = QUEUE_HIGH; - mgtQ = QUEUE_HIGH; - hiQ = QUEUE_HIGH; - } - else{// for WMM - beQ = QUEUE_LOW; - bkQ = QUEUE_NORMAL; - viQ = QUEUE_NORMAL; - voQ = QUEUE_HIGH; - mgtQ = QUEUE_HIGH; - hiQ = QUEUE_HIGH; - } - _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); -} - -static VOID -_InitNormalChipQueuePriority( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - switch(pHalData->OutEpNumber) - { - case 1: - _InitNormalChipOneOutEpPriority(Adapter); - break; - case 2: - _InitNormalChipTwoOutEpPriority(Adapter); - break; - case 3: - _InitNormalChipThreeOutEpPriority(Adapter); - break; - default: - //RT_ASSERT(FALSE,("Shall not reach here!\n")); - break; - } - - -} - -static VOID -_InitTestChipQueuePriority( - IN PADAPTER Adapter - ) -{ - u8 hq_sele ; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - - switch(pHalData->OutEpNumber) - { - case 2: // (TX_SELE_HQ|TX_SELE_LQ) - if(!pregistrypriv->wifi_spec)//typical setting - hq_sele = HQSEL_VOQ | HQSEL_VIQ | HQSEL_MGTQ | HQSEL_HIQ ; - else //for WMM - hq_sele = HQSEL_VOQ | HQSEL_BEQ | HQSEL_MGTQ | HQSEL_HIQ ; - break; - case 1: - if(TX_SELE_LQ == pHalData->OutEpQueueSel ){//map all endpoint to Low queue - hq_sele = 0; - } - else if(TX_SELE_HQ == pHalData->OutEpQueueSel){//map all endpoint to High queue - hq_sele = HQSEL_VOQ | HQSEL_VIQ | HQSEL_BEQ | HQSEL_BKQ | HQSEL_MGTQ | HQSEL_HIQ ; - } - break; - default: - //RT_ASSERT(FALSE,("Shall not reach here!\n")); - break; - } - rtw_write8(Adapter, (REG_TRXDMA_CTRL+1), hq_sele); -} - - -static VOID -_InitQueuePriority( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(IS_NORMAL_CHIP( pHalData->VersionID)){ - _InitNormalChipQueuePriority(Adapter); - } - else{ - _InitTestChipQueuePriority(Adapter); - } -} - -static VOID -_InitHardwareDropIncorrectBulkOut( - IN PADAPTER Adapter - ) -{ - u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK); - value32 |= DROP_DATA_EN; - rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32); -} - -static VOID -_InitNetworkType( - IN PADAPTER Adapter - ) -{ - u32 value32; - - value32 = rtw_read32(Adapter, REG_CR); - - // TODO: use the other function to set network type -#if RTL8191C_FPGA_NETWORKTYPE_ADHOC - value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AD_HOC); -#else - value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); -#endif - rtw_write32(Adapter, REG_CR, value32); -// RASSERT(pIoBase->rtw_read8(REG_CR + 2) == 0x2); -} - -static VOID -_InitTransferPageSize( - IN PADAPTER Adapter - ) -{ - // Tx page size is always 128. - - u8 value8; - value8 = _PSRX(PBP_128) | _PSTX(PBP_128); - rtw_write8(Adapter, REG_PBP, value8); -} - -static VOID -_InitDriverInfoSize( - IN PADAPTER Adapter, - IN u8 drvInfoSize - ) -{ - rtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize); -} - -static VOID -_InitWMACSetting( - IN PADAPTER Adapter - ) -{ - //u4Byte value32; - //u16 value16; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; - pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYSTS; -#if (0 == RTL8192C_RX_PACKET_NO_INCLUDE_CRC) - pHalData->ReceiveConfig |= ACRC32; -#endif - - // some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile() - rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); - - // Accept all multicast address - rtw_write32(Adapter, REG_MAR, 0xFFFFFFFF); - rtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF); - - - // Accept all data frames - //value16 = 0xFFFF; - //rtw_write16(Adapter, REG_RXFLTMAP2, value16); - - // 2010.09.08 hpfan - // Since ADF is removed from RCR, ps-poll will not be indicate to driver, - // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. - //value16 = 0x400; - //rtw_write16(Adapter, REG_RXFLTMAP1, value16); - - // Accept all management frames - //value16 = 0xFFFF; - //rtw_write16(Adapter, REG_RXFLTMAP0, value16); - - //enable RX_SHIFT bits - //rtw_write8(Adapter, REG_TRXDMA_CTRL, rtw_read8(Adapter, REG_TRXDMA_CTRL)|BIT(1)); - -} - -static VOID -_InitAdaptiveCtrl( - IN PADAPTER Adapter - ) -{ - u16 value16; - u32 value32; - - // Response Rate Set - value32 = rtw_read32(Adapter, REG_RRSR); - value32 &= ~RATE_BITMAP_ALL; - value32 |= RATE_RRSR_CCK_ONLY_1M; - rtw_write32(Adapter, REG_RRSR, value32); - - // CF-END Threshold - //m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1); - - // SIFS (used in NAV) - value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10); - rtw_write16(Adapter, REG_SPEC_SIFS, value16); - - // Retry Limit - value16 = _LRL(0x30) | _SRL(0x30); - rtw_write16(Adapter, REG_RL, value16); - -} - -static VOID -_InitRateFallback( - IN PADAPTER Adapter - ) -{ - // Set Data Auto Rate Fallback Retry Count register. - rtw_write32(Adapter, REG_DARFRC, 0x00000000); - rtw_write32(Adapter, REG_DARFRC+4, 0x10080404); - rtw_write32(Adapter, REG_RARFRC, 0x04030201); - rtw_write32(Adapter, REG_RARFRC+4, 0x08070605); - -} - - -static VOID -_InitEDCA( - IN PADAPTER Adapter - ) -{ - // Set Spec SIFS (used in NAV) - rtw_write16(Adapter,REG_SPEC_SIFS, 0x100a); - rtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a); - - // Set SIFS for CCK - rtw_write16(Adapter,REG_SIFS_CTX, 0x100a); - - // Set SIFS for OFDM - rtw_write16(Adapter,REG_SIFS_TRX, 0x100a); - - // TXOP - rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B); - rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F); - rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324); - rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226); -} - - -static VOID -_InitBeaconMaxError( - IN PADAPTER Adapter, - IN BOOLEAN InfraMode - ) -{ -#ifdef RTL8192CU_ADHOC_WORKAROUND_SETTING - rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); -#else - //rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10)); -#endif -} - - -#ifdef CONFIG_LED -static void _InitHWLed(PADAPTER Adapter) -{ - struct led_priv *pledpriv = &(Adapter->ledpriv); - - if( pledpriv->LedStrategy != HW_LED) - return; - -// HW led control -// to do .... -//must consider the situation which case of antenna diversity/ commbo card/solo card/mini card - -} -#endif //CONFIG_LED - -static VOID -_InitRDGSetting( - IN PADAPTER Adapter - ) -{ - rtw_write8(Adapter,REG_RD_CTRL,0xFF); - rtw_write16(Adapter, REG_RD_NAV_NXT, 0x200); - rtw_write8(Adapter,REG_RD_RESP_PKT_TH,0x05); -} - -static VOID -_InitRxSetting( - IN PADAPTER Adapter - ) -{ - rtw_write32(Adapter, REG_MACID, 0x87654321); - rtw_write32(Adapter, 0x0700, 0x87654321); -} - -static VOID -_InitRetryFunction( - IN PADAPTER Adapter - ) -{ - u8 value8; - - value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); - value8 |= EN_AMPDU_RTY_NEW; - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); - - // Set ACK timeout - rtw_write8(Adapter, REG_ACKTO, 0x40); -} - -/*----------------------------------------------------------------------------- - * Function: usb_AggSettingTxUpdate() - * - * Overview: Seperate TX/RX parameters update independent for TP detection and - * dynamic TX/RX aggreagtion parameters update. - * - * Input: PADAPTER - * - * Output/Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2010 MHC Seperate to smaller function. - * - *---------------------------------------------------------------------------*/ -static VOID -usb_AggSettingTxUpdate( - IN PADAPTER Adapter - ) -{ -#ifdef CONFIG_USB_TX_AGGREGATION - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u32 value32; - - if(Adapter->registrypriv.wifi_spec) - pHalData->UsbTxAggMode = _FALSE; - - if(pHalData->UsbTxAggMode){ - value32 = rtw_read32(Adapter, REG_TDECTRL); - value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); - value32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT); - - rtw_write32(Adapter, REG_TDECTRL, value32); - } - -#endif -} // usb_AggSettingTxUpdate - - -/*----------------------------------------------------------------------------- - * Function: usb_AggSettingRxUpdate() - * - * Overview: Seperate TX/RX parameters update independent for TP detection and - * dynamic TX/RX aggreagtion parameters update. - * - * Input: PADAPTER - * - * Output/Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2010 MHC Seperate to smaller function. - * - *---------------------------------------------------------------------------*/ -static VOID -usb_AggSettingRxUpdate( - IN PADAPTER Adapter - ) -{ -#ifdef CONFIG_USB_RX_AGGREGATION - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u8 valueDMA; - u8 valueUSB; - - valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL); - valueUSB = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); - - switch(pHalData->UsbRxAggMode) - { - case USB_RX_AGG_DMA: - valueDMA |= RXDMA_AGG_EN; - valueUSB &= ~USB_AGG_EN; - break; - case USB_RX_AGG_USB: - valueDMA &= ~RXDMA_AGG_EN; - valueUSB |= USB_AGG_EN; - break; - case USB_RX_AGG_MIX: - valueDMA |= RXDMA_AGG_EN; - valueUSB |= USB_AGG_EN; - break; - case USB_RX_AGG_DISABLE: - default: - valueDMA &= ~RXDMA_AGG_EN; - valueUSB &= ~USB_AGG_EN; - break; - } - - rtw_write8(Adapter, REG_TRXDMA_CTRL, valueDMA); - rtw_write8(Adapter, REG_USB_SPECIAL_OPTION, valueUSB); - - switch(pHalData->UsbRxAggMode) - { - case USB_RX_AGG_DMA: - rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount); - rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout); - break; - case USB_RX_AGG_USB: - rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount); - rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout); - break; - case USB_RX_AGG_MIX: - rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount); - rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout); - rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount); - rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout); - break; - case USB_RX_AGG_DISABLE: - default: - // TODO: - break; - } - - switch(PBP_128) - { - case PBP_128: - pHalData->HwRxPageSize = 128; - break; - case PBP_64: - pHalData->HwRxPageSize = 64; - break; - case PBP_256: - pHalData->HwRxPageSize = 256; - break; - case PBP_512: - pHalData->HwRxPageSize = 512; - break; - case PBP_1024: - pHalData->HwRxPageSize = 1024; - break; - default: - //RT_ASSERT(FALSE, ("RX_PAGE_SIZE_REG_VALUE definition is incorrect!\n")); - break; - } -#endif -} // usb_AggSettingRxUpdate - -static VOID -InitUsbAggregationSetting( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // Tx aggregation setting - usb_AggSettingTxUpdate(Adapter); - - // Rx aggregation setting - usb_AggSettingRxUpdate(Adapter); - - // 201/12/10 MH Add for USB agg mode dynamic switch. - pHalData->UsbRxHighSpeedMode = _FALSE; -} - -/*----------------------------------------------------------------------------- - * Function: USB_AggModeSwitch() - * - * Overview: When RX traffic is more than 40M, we need to adjust some parameters to increase - * RX speed by increasing batch indication size. This will decrease TCP ACK speed, we - * need to monitor the influence of FTP/network share. - * For TX mode, we are still ubder investigation. - * - * Input: PADAPTER - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2010 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -VOID -USB_AggModeSwitch( - IN PADAPTER Adapter - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - - //pHalData->UsbRxHighSpeedMode = FALSE; - // How to measure the RX speed? We assume that when traffic is more than - if (pMgntInfo->bRegAggDMEnable == _FALSE) - { - return; // Inf not support. - } - - - if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _TRUE && - pHalData->UsbRxHighSpeedMode == _FALSE) - { - pHalData->UsbRxHighSpeedMode = _TRUE; - DBG_8192C("UsbAggModeSwitchCheck to HIGH\n"); - } - else if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _FALSE && - pHalData->UsbRxHighSpeedMode == _TRUE) - { - pHalData->UsbRxHighSpeedMode = _FALSE; - DBG_8192C("UsbAggModeSwitchCheck to LOW\n"); - } - else - { - return; - } - - // 2010/12/10 MH Add for USB Aggregation judgement we need to - //if( pMgntInfo->LinkDetectInfo.NumRxOkInPeriod > 4000 || - // pMgntInfo->LinkDetectInfo.NumTxOkInPeriod > 4000 ) - -#ifdef CONFIG_USB_TX_AGGREGATION - //usb_AggSettingTxUpdate(Adapter); -#endif - -#ifdef CONFIG_USB_RX_AGGREGATION - if (pHalData->UsbRxHighSpeedMode == _TRUE) - { - // 2010/12/10 MH The parameter is tested by SD1 engineer and SD3 channel emulator. - // USB mode - pHalData->UsbRxAggBlockCount = 40; - pHalData->UsbRxAggBlockTimeout = 5; - // Mix mode - pHalData->UsbRxAggPageCount = 72; - pHalData->UsbRxAggPageTimeout = 6; - } - else - { - // USB mode - pHalData->UsbRxAggBlockCount = pMgntInfo->RegUsbRxAggBlockCount; - pHalData->UsbRxAggBlockTimeout = pMgntInfo->RegUsbRxAggBlockTimeout; - // Mix mode - pHalData->UsbRxAggPageCount = pMgntInfo->RegUsbRxAggPageCount; - pHalData->UsbRxAggPageTimeout = pMgntInfo->RegUsbRxAggPageTimeout; - } -#endif -#endif -} // USB_AggModeSwitch - -static VOID -_InitOperationMode( - IN PADAPTER Adapter - ) -{ -#if 0//gtest - PHAL_DATA_8192CUSB pHalData = GetHalData8192CUsb(Adapter); - u1Byte regBwOpMode = 0; - u4Byte regRATR = 0, regRRSR = 0; - - - //1 This part need to modified according to the rate set we filtered!! - // - // Set RRSR, RATR, and REG_BWOPMODE registers - // - switch(Adapter->RegWirelessMode) - { - case WIRELESS_MODE_B: - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK; - regRRSR = RATE_ALL_CCK; - break; - case WIRELESS_MODE_A: - ASSERT(FALSE); -#if 0 - regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ; - regRATR = RATE_ALL_OFDM_AG; - regRRSR = RATE_ALL_OFDM_AG; -#endif - break; - case WIRELESS_MODE_G: - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - break; - case WIRELESS_MODE_AUTO: - if (Adapter->bInHctTest) - { - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - } - else - { - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - } - break; - case WIRELESS_MODE_N_24G: - // It support CCK rate by default. - // CCK rate will be filtered out only when associated AP does not support it. - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - break; - case WIRELESS_MODE_N_5G: - ASSERT(FALSE); -#if 0 - regBwOpMode = BW_OPMODE_5G; - regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; - regRRSR = RATE_ALL_OFDM_AG; -#endif - break; - } - - // Ziv ???????? - //PlatformEFIOWrite4Byte(Adapter, REG_INIRTS_RATE_SEL, regRRSR); - PlatformEFIOWrite1Byte(Adapter, REG_BWOPMODE, regBwOpMode); - - // For Min Spacing configuration. - switch(pHalData->RF_Type) - { - case RF_1T2R: - case RF_1T1R: - RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter: RF_Type%s\n", (pHalData->RF_Type==RF_1T1R? "(1T1R)":"(1T2R)"))); - Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3); - break; - case RF_2T2R: - case RF_2T2R_GREEN: - RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter:RF_Type(2T2R)\n")); - Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3); - break; - } - - PlatformEFIOWrite1Byte(Adapter, REG_AMPDU_MIN_SPACE, Adapter->MgntInfo.MinSpaceCfg); -#endif -} - - - static VOID -_InitBeaconParameters( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); - - // TODO: Remove these magic number - rtw_write16(Adapter, REG_TBTT_PROHIBIT,0x6404);// ms - rtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME);// 5ms - rtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME); // 2ms - - // Suggested by designer timchen. Change beacon AIFS to the largest number - // beacause test chip does not contension before sending beacon. by tynli. 2009.11.03 - if(IS_NORMAL_CHIP( pHalData->VersionID)){ - rtw_write16(Adapter, REG_BCNTCFG, 0x660F); - } - else{ - rtw_write16(Adapter, REG_BCNTCFG, 0x66FF); - } - -} - -static VOID -_InitRFType( - IN PADAPTER Adapter - ) -{ - struct registry_priv *pregpriv = &Adapter->registrypriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BOOLEAN is92CU = IS_92C_SERIAL(pHalData->VersionID); - -#if DISABLE_BB_RF - pHalData->rf_chip = RF_PSEUDO_11N; - return; -#endif - - pHalData->rf_chip = RF_6052; - - if(_FALSE == is92CU){ - pHalData->rf_type = RF_1T1R; - //DBG_8192C("Set RF Chip ID to RF_6052 and RF type to 1T1R.\n"); - return; - } - - // TODO: Consider that EEPROM set 92CU to 1T1R later. - // Force to overwrite setting according to chip version. Ignore EEPROM setting. - //pHalData->RF_Type = is92CU ? RF_2T2R : RF_1T1R; - //MSG_8192C("Set RF Chip ID to RF_6052 and RF type to %d.\n", pHalData->rf_type); - -} - -static VOID _InitAdhocWorkaroundParams(IN PADAPTER Adapter) -{ -#if RTL8192CU_ADHOC_WORKAROUND_SETTING - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL); - pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); - pHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); - pHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2); -#endif -} - -static VOID -_BeaconFunctionEnable( - IN PADAPTER Adapter, - IN BOOLEAN Enable, - IN BOOLEAN Linked - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 value8 = 0; - - //value8 = Enable ? (EN_BCN_FUNCTION | EN_TXBCN_RPT) : EN_BCN_FUNCTION; - - if(_FALSE == Linked){ - if(IS_NORMAL_CHIP( pHalData->VersionID)){ - value8 |= DIS_TSF_UDT0_NORMAL_CHIP; - } - else{ - value8 |= DIS_TSF_UDT0_TEST_CHIP; - } - } - - rtw_write8(Adapter, REG_BCN_CTRL, value8); -#else - rtw_write8(Adapter, REG_BCN_CTRL, (BIT4 | BIT3 | BIT1)); - //SetBcnCtrlReg(Adapter, (BIT4 | BIT3 | BIT1), 0x00); - //RT_TRACE(COMP_BEACON, DBG_LOUD, ("_BeaconFunctionEnable 0x550 0x%x\n", PlatformEFIORead1Byte(Adapter, 0x550))); - - rtw_write8(Adapter, REG_RD_CTRL+1, 0x6F); -#endif -} - - -// Set CCK and OFDM Block "ON" -static VOID _BBTurnOnBlock( - IN PADAPTER Adapter - ) -{ -#if (DISABLE_BB_RF) - return; -#endif - - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1); - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1); -} - -static VOID _RfPowerSave( - IN PADAPTER Adapter - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u1Byte eRFPath; - -#if (DISABLE_BB_RF) - return; -#endif - - if(pMgntInfo->RegRfOff == TRUE){ // User disable RF via registry. - RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\n")); - MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW); - // Those action will be discard in MgntActSet_RF_State because off the same state - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0); - } - else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS){ // H/W or S/W RF OFF before sleep. - RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\n", pMgntInfo->RfOffReason)); - MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason); - } - else{ - pHalData->eRFPowerState = eRfOn; - pMgntInfo->RfOffReason = 0; - if(Adapter->bInSetPower || Adapter->bResetInProgress) - PlatformUsbEnableInPipes(Adapter); - RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): RF is on.\n")); - } -#endif -} - -enum { - Antenna_Lfet = 1, - Antenna_Right = 2, -}; - -static VOID -_InitAntenna_Selection(IN PADAPTER Adapter) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(pHalData->AntDivCfg==0) - return; - DBG_8192C("==> %s ....\n",__FUNCTION__); - - if((RF_1T1R == pHalData->rf_type)) - { - rtw_write32(Adapter, REG_LEDCFG0, rtw_read32(Adapter, REG_LEDCFG0)|BIT23); - PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); - - if(PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == Antenna_A) - pHalData->CurAntenna = Antenna_A; - else - pHalData->CurAntenna = Antenna_B; - DBG_8192C("%s,Cur_ant:(%x)%s\n",__FUNCTION__,pHalData->CurAntenna,(pHalData->CurAntenna == Antenna_A)?"Antenna_A":"Antenna_B"); - -} - - -} -// -// 2010/08/09 MH Add for power down check. -// -static BOOLEAN -HalDetectPwrDownMode( - IN PADAPTER Adapter - ) -{ - u8 tmpvalue; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; - - EFUSE_ShadowRead(Adapter, 1, EEPROM_RF_OPT3, (u32 *)&tmpvalue); - - // 2010/08/25 MH INF priority > PDN Efuse value. - if(tmpvalue & BIT4 && pwrctrlpriv->reg_pdnmode) - { - pHalData->pwrdown = _TRUE; - } - else - { - pHalData->pwrdown = _FALSE; - } - - DBG_8192C("HalDetectPwrDownMode(): PDN=%d\n", pHalData->pwrdown); - return pHalData->pwrdown; - -} // HalDetectPwrDownMode - - -// -// 2010/08/26 MH Add for selective suspend mode check. -// If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and -// slim card. -// -static VOID -HalDetectSelectiveSuspendMode( - IN PADAPTER Adapter - ) -{ - u8 tmpvalue; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dvobj_priv *pdvobjpriv = &Adapter->dvobjpriv; - - // If support HW radio detect, we need to enable WOL ability, otherwise, we - // can not use FW to notify host the power state switch. - - EFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue); - - DBG_8192C("HalDetectSelectiveSuspendMode(): SS "); - if(tmpvalue & BIT1) - { - DBG_8192C("Enable\n"); - } - else - { - DBG_8192C("Disable\n"); - pdvobjpriv->RegUsbSS = _FALSE; - } - - // 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode. - if (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData)) - { - //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - //if (!pMgntInfo->bRegDongleSS) - //{ - // RT_TRACE(COMP_INIT, DBG_LOUD, ("Dongle disable SS\n")); - pdvobjpriv->RegUsbSS = _FALSE; - //} - } -} // HalDetectSelectiveSuspendMode -/*----------------------------------------------------------------------------- - * Function: HwSuspendModeEnable92Cu() - * - * Overview: HW suspend mode switch. - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 08/23/2010 MHC HW suspend mode switch test.. - *---------------------------------------------------------------------------*/ -static VOID -HwSuspendModeEnable92Cu( - IN PADAPTER pAdapter, - IN u8 Type - ) -{ - //PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(pAdapter); - u16 reg = rtw_read16(pAdapter, REG_GPIO_MUXCFG); - - //if (!pDevice->RegUsbSS) - { - return; - } - - // - // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW - // to enter suspend mode automatically. Otherwise, it will shut down major power - // domain and 8051 will stop. When we try to enter selective suspend mode, we - // need to prevent HW to enter D2 mode aumotmatically. Another way, Host will - // issue a S10 signal to power domain. Then it will cleat SIC setting(from Yngli). - // We need to enable HW suspend mode when enter S3/S4 or disable. We need - // to disable HW suspend mode for IPS/radio_off. - // - //RT_TRACE(COMP_RF, DBG_LOUD, ("HwSuspendModeEnable92Cu = %d\n", Type)); - if (Type == _FALSE) - { - reg |= BIT14; - //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg)); - rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); - reg |= BIT12; - //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg)); - rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); - } - else - { - reg &= (~BIT12); - rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); - reg &= (~BIT14); - rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); - } - -} // HwSuspendModeEnable92Cu -rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u8 val8; - rt_rf_power_state rfpowerstate = rf_off; - - if(pAdapter->pwrctrlpriv.bHWPowerdown) - { - val8 = rtw_read8(pAdapter, REG_HSISR); - DBG_8192C("pwrdown, 0x5c(BIT7)=%02x\n", val8); - rfpowerstate = (val8 & BIT7) ? rf_off: rf_on; - } - else // rf on/off - { - rtw_write8( pAdapter, REG_MAC_PINMUX_CFG,rtw_read8(pAdapter, REG_MAC_PINMUX_CFG)&~(BIT3)); - val8 = rtw_read8(pAdapter, REG_GPIO_IO_SEL); - DBG_8192C("GPIO_IN=%02x\n", val8); - rfpowerstate = (val8 & BIT3) ? rf_on : rf_off; - } - return rfpowerstate; -} // HalDetectPwrDownMode -#ifdef SUPPORT_HW_RFOFF_DETECTED -void _ps_open_RF(_adapter *padapter); -#endif - -u32 rtl8192cu_hal_init(PADAPTER Adapter) -{ - u8 val8 = 0; - u32 boundary, status = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u8 isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - u8 is92C = IS_92C_SERIAL(pHalData->VersionID); - rt_rf_power_state eRfPowerStateToSet; -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); -#endif - - u32 init_start_time = rtw_get_current_time(); - -_func_enter_; - -#ifdef SUPPORT_HW_RFOFF_DETECTED - if(Adapter->pwrctrlpriv.bkeepfwalive) - { - _ps_open_RF(Adapter); - - if(pHalData->bIQKInitialized ){ - rtl8192c_PHY_IQCalibrate(Adapter,_TRUE); - } - else{ - rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); - pHalData->bIQKInitialized = _TRUE; - } - rtl8192c_dm_CheckTXPowerTracking(Adapter); - rtl8192c_PHY_LCCalibrate(Adapter); - - goto exit; - } -#endif - - status = _InitPowerOn(Adapter); - if(status == _FAIL){ - RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init power on!\n")); - goto exit; - } - - if(!pregistrypriv->wifi_spec){ - boundary = TX_PAGE_BOUNDARY; - } - else{// for WMM - boundary = (IS_NORMAL_CHIP(pHalData->VersionID)) ?WMM_NORMAL_TX_PAGE_BOUNDARY - :WMM_TEST_TX_PAGE_BOUNDARY; - } - - status = InitLLTTable(Adapter, boundary); - if(status == _FAIL){ - //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to init power on!\n")); - goto exit; - } - - _InitQueueReservedPage(Adapter); - _InitTxBufferBoundary(Adapter); - _InitQueuePriority(Adapter); - _InitPageBoundary(Adapter); - _InitTransferPageSize(Adapter); - - -#if ENABLE_USB_DROP_INCORRECT_OUT - _InitHardwareDropIncorrectBulkOut(Adapter); -#endif - - if(pHalData->bRDGEnable){ - _InitRDGSetting(Adapter); - } - -#if (1 == MP_DRIVER) - _InitRxSetting(Adapter); - // Don't Download Firmware - Adapter->bFWReady = _FALSE; -#elif RTL8192CU_FW_DOWNLOAD_ENABLE - status = FirmwareDownload92C(Adapter); - if(status == _FAIL) - { - - Adapter->bFWReady = _FALSE; - - pHalData->fw_ractrl = _FALSE; - - DBG_8192C("fw download fail!\n"); - - goto exit; - } - else - { - - Adapter->bFWReady = _TRUE; - - pHalData->fw_ractrl = _TRUE; - - DBG_8192C("fw download ok!\n"); - } -#endif - - InitializeFirmwareVars92C(Adapter); - - if(pwrctrlpriv->reg_rfoff == _TRUE){ - pwrctrlpriv->rf_pwrstate = rf_off; - } - - // 2010/08/09 MH We need to check if we need to turnon or off RF after detecting - // HW GPIO pin. Before PHY_RFConfig8192C. - //HalDetectPwrDownMode(Adapter); - // 2010/08/26 MH If Efuse does not support sective suspend then disable the function. - //HalDetectSelectiveSuspendMode(Adapter); - - - // Set RF type for BB/RF configuration - _InitRFType(Adapter);//->_ReadRFType() - - // Save target channel - // Current Channel will be updated again later. - pHalData->CurrentChannel = 6;//default set to 6 - -#if (HAL_MAC_ENABLE == 1) - status = PHY_MACConfig8192C(Adapter); - if(status == _FAIL) - { - goto exit; - } -#endif - // Get Rx PHY status in order to report RSSI and others. - _InitDriverInfoSize(Adapter, DRVINFO_SZ); - - _InitInterrupt(Adapter); - _InitID(Adapter);//set mac_address - _InitNetworkType(Adapter);//set msr - _InitWMACSetting(Adapter); - _InitAdaptiveCtrl(Adapter); - _InitEDCA(Adapter); - _InitRateFallback(Adapter); - _InitRetryFunction(Adapter); - InitUsbAggregationSetting(Adapter); - _InitOperationMode(Adapter);//todo - _InitBeaconParameters(Adapter); - _InitBeaconMaxError(Adapter, _TRUE); - -#ifdef CONFIG_LED - _InitHWLed(Adapter); -#endif //CONFIG_LED - - // - //d. Initialize BB related configurations. - // -#if (HAL_BB_ENABLE == 1) - status = PHY_BBConfig8192C(Adapter); - if(status == _FAIL) - { - goto exit; - } -#endif - - // 92CU use 3-wire to r/w RF - //pHalData->Rf_Mode = RF_OP_By_SW_3wire; - -#if (HAL_RF_ENABLE == 1) - status = PHY_RFConfig8192C(Adapter); - if(status == _FAIL) - { - goto exit; - } - - if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID)) - { - PHY_SetRFReg(Adapter, RF90_PATH_A, RF_RX_G1, bMaskDWord, 0x30255); - PHY_SetRFReg(Adapter, RF90_PATH_A, RF_RX_G2, bMaskDWord, 0x50a00); - } -#endif - - // - // Joseph Note: Keep RfRegChnlVal for later use. - // - pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(Adapter, (RF90_RADIO_PATH_E)0, RF_CHNLBW, bRFRegOffsetMask); - pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(Adapter, (RF90_RADIO_PATH_E)1, RF_CHNLBW, bRFRegOffsetMask); - - _BBTurnOnBlock(Adapter); - //NicIFSetMacAddress(padapter, padapter->PermanentAddress); - - invalidate_cam_all(Adapter); - - // 2010/12/17 MH We need to set TX power according to EFUSE content at first. - PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel); - -// Move by Neo for USB SS to below setp -//_RfPowerSave(Adapter); - - if (!IS_92C_SERIAL( pHalData->VersionID) && (pHalData->AntDivCfg!=0)) - { //for 88CU ,1T1R - _InitAntenna_Selection(Adapter); - } - - - // - // Disable BAR, suggested by Scott - // 2010.04.09 add by hpfan - // - rtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff); - - // HW SEQ CTRL - //set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. - rtw_write8(Adapter,REG_HWSEQ_CTRL, 0xFF); - - if(pregistrypriv->wifi_spec) - rtw_write16(Adapter,REG_FAST_EDCA_CTRL ,0); - -#if (MP_DRIVER == 1) - Adapter->mppriv.channel = pHalData->CurrentChannel; - MPT_InitializeAdapter(Adapter, Adapter->mppriv.channel); -#else - - - // - // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status - // and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not - // call init_adapter. May cause some problem?? - // - // Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed - // in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState - // is the same as eRfOff, we should change it to eRfOn after we config RF parameters. - // Added by tynli. 2010.03.30. - pwrctrlpriv->rf_pwrstate = rf_on; - -#if 0 //to do - RT_CLEAR_PS_LEVEL(pwrctrlpriv, RT_RF_OFF_LEVL_HALT_NIC); -#if 1 //Todo - // 20100326 Joseph: Copy from GPIOChangeRFWorkItemCallBack() function to check HW radio on/off. - // 20100329 Joseph: Revise and integrate the HW/SW radio off code in initialization. - - eRfPowerStateToSet = (rt_rf_power_state) RfOnOffDetect(Adapter); - pwrctrlpriv->rfoff_reason |= eRfPowerStateToSet==rf_on ? RF_CHANGE_BY_INIT : RF_CHANGE_BY_HW; - pwrctrlpriv->rfoff_reason |= (pwrctrlpriv->reg_rfoff) ? RF_CHANGE_BY_SW : 0; - - if(pwrctrlpriv->rfoff_reason&RF_CHANGE_BY_HW) - pwrctrlpriv->b_hw_radio_off = _TRUE; - - DBG_8192C("eRfPowerStateToSet=%d\n", eRfPowerStateToSet); - - if(pwrctrlpriv->reg_rfoff == _TRUE) - { // User disable RF via registry. - DBG_8192C("InitializeAdapter8192CU(): Turn off RF for RegRfOff.\n"); - //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_SW, _TRUE); - - // Those action will be discard in MgntActSet_RF_State because off the same state - //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0); - } - else if(pwrctrlpriv->rfoff_reason > RF_CHANGE_BY_PS) - { // H/W or S/W RF OFF before sleep. - DBG_8192C(" Turn off RF for RfOffReason(%x) ----------\n", pwrctrlpriv->rfoff_reason); - //pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; - pwrctrlpriv->rf_pwrstate = rf_on; - //MgntActSet_RF_State(Adapter, rf_off, pwrctrlpriv->rfoff_reason, _TRUE); - } - else - { - // Perform GPIO polling to find out current RF state. added by Roger, 2010.04.09. - if(pHalData->BoardType == BOARD_MINICARD /*&& (Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)*/) - { - DBG_8192C("InitializeAdapter8192CU(): RF=%d \n", eRfPowerStateToSet); - if (eRfPowerStateToSet == rf_off) - { - //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_HW, _TRUE); - pwrctrlpriv->b_hw_radio_off = _TRUE; - } - else - { - pwrctrlpriv->rf_pwrstate = rf_off; - pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; - pwrctrlpriv->b_hw_radio_off = _FALSE; - //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE); - } - } - else - { - pwrctrlpriv->rf_pwrstate = rf_off; - pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; - //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE); - } - - pwrctrlpriv->rfoff_reason = 0; - pwrctrlpriv->b_hw_radio_off = _FALSE; - pwrctrlpriv->rf_pwrstate = rf_on; - rtw_led_control(Adapter, LED_CTL_POWER_ON); - - } - - // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. - // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. - if(pHalData->pwrdown && eRfPowerStateToSet == rf_off) - { - // Enable register area 0x0-0xc. - rtw_write8(Adapter, REG_RSV_CTRL, 0x0); - - // - // We should configure HW PDn source for WiFi ONLY, and then - // our HW will be set in power-down mode if PDn source from all functions are configured. - // 2010.10.06. - // - //if(IS_HARDWARE_TYPE_8723U(Adapter)) - //{ - // u1bTmp = rtw_read8(Adapter, REG_MULTI_FUNC_CTRL); - // rtw_write8(Adapter, REG_MULTI_FUNC_CTRL, (u1bTmp|WL_HWPDN_EN)); - //} - //else - //{ - rtw_write16(Adapter, REG_APS_FSMCO, 0x8812); - //} - } - //DrvIFIndicateCurrentPhyStatus(Adapter); // 2010/08/17 MH Disable to prevent BSOD. -#endif -#endif - // 2010/08/26 MH Merge from 8192CE. - if(pwrctrlpriv->rf_pwrstate == rf_on) - { - if(pHalData->bIQKInitialized ){ - rtl8192c_PHY_IQCalibrate(Adapter,_TRUE); - } - else - { - rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); - pHalData->bIQKInitialized = _TRUE; - } - rtl8192c_dm_CheckTXPowerTracking(Adapter); - rtl8192c_PHY_LCCalibrate(Adapter); - } - -#endif /* #if (MP_DRIVER == 1) */ - -#if RTL8192CU_ADHOC_WORKAROUND_SETTING - _InitAdhocWorkaroundParams(Adapter); -#endif - - -#ifdef USB_INTERFERENCE_ISSUE - //fixed USB interface interference issue - rtw_write8(Adapter, 0xfe40, 0xe0); - rtw_write8(Adapter, 0xfe41, 0x8d); - rtw_write8(Adapter, 0xfe42, 0x80); - rtw_write32(Adapter,0x20c,0xfd0320); -#if 1 - //2011/01/07 ,suggest by Johnny,for solved the problem that too many protocol error on USB bus - if(!IS_VENDOR_UMC_A_CUT(pHalData->VersionID) )//&& !IS_92C_SERIAL(pHalData->VersionID))// TSMC , 8188 - { - // 0xE6=0x94 - rtw_write8(Adapter, 0xFE40, 0xE6); - rtw_write8(Adapter, 0xFE41, 0x94); - rtw_write8(Adapter, 0xFE42, 0x80); - - // 0xE0=0x19 - rtw_write8(Adapter, 0xFE40, 0xE0); - rtw_write8(Adapter, 0xFE41, 0x19); - rtw_write8(Adapter, 0xFE42, 0x80); - - // 0xE5=0x91 - rtw_write8(Adapter, 0xFE40, 0xE5); - rtw_write8(Adapter, 0xFE41, 0x91); - rtw_write8(Adapter, 0xFE42, 0x80); - - // 0xE2=0x81 - rtw_write8(Adapter, 0xFE40, 0xE2); - rtw_write8(Adapter, 0xFE41, 0x81); - rtw_write8(Adapter, 0xFE42, 0x80); - - } - -#endif -#endif //USB_INTERFERENCE_ISSUE - - _InitPABias(Adapter); - -#ifdef CONFIG_BT_COEXIST - _InitBTCoexist(Adapter); -#endif - - rtl8192c_InitHalDm(Adapter); - - // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter - // suspend mode automatically. - //HwSuspendModeEnable92Cu(Adapter, _FALSE); - - rtw_write8(Adapter, 0x15, 0xe9);//suggest by Johnny for lower temperature - //_dbg_dump_macreg(padapter); - - //misc - { - int i; - u8 mac_addr[6]; - for(i=0; i<6; i++) - { - mac_addr[i] = rtw_read8(Adapter, REG_MACID+i); - } - - //DBG_8192C("MAC Address from REG_MACID = "MAC_FMT"\n", MAC_ARG(mac_addr)); - } - -exit: - - //DBG_871X("%s in %dms\n", __FUNCTION__, rtw_get_passing_time_ms(init_start_time)); - -_func_exit_; - - return status; -} - - - - -#ifdef SUPPORT_HW_RFOFF_DETECTED -// 1 = original SS power ver 2 = Improved pwr version. -// We will provide several power consumption type for user to use. -#define CU_SS_MODE 1 - -void _ps_open_RF(_adapter *padapter) -{ - - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - DBG_8192C("==> %s \n",__FUNCTION__); -#if (CU_SS_MODE == 1) - // 1. Enable MAC Clock - //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); - //delay_us(WAIT_US_WRITE_POWERON); - - // 2. Force PWM, Enable SPS18_LDO_Marco_Block - rtw_write8(padapter, REG_SPS0_CTRL, rtw_read8(padapter,REG_SPS0_CTRL) | (BIT(0)|BIT(3))); - //delay_us(WAIT_US_WRITE_POWERON); - - // 3. restore BB, AFE control register. - //RF - //PHY_SetBBReg(padapter,rFPGA0_XAB_RFParameter,bMaskDWord, pwrpriv->PS_BBRegBackup[PSBBREG_RF0]); - //PHY_SetBBReg(padapter,rOFDM0_TRxPathEnable, bMaskDWord,pwrpriv->PS_BBRegBackup[PSBBREG_RF1]); - //PHY_SetBBReg(padapter,rFPGA0_RFMOD, bMaskDWord,pwrpriv->PS_BBRegBackup[PSBBREG_RF2]); - - if (pHalData->rf_type== RF_2T2R) - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 1); - else - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 1); - - PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 1); - PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1, 0); - - - //AFE - //PHY_SetBBReg(padapter,0x0e70, bMaskDWord,pwrpriv->PS_BBRegBackup[PSBBREG_AFE0]); - PHY_SetBBReg(padapter, 0x0e70, bMaskDWord ,0x631B25A0 ); - - // 4. issue 3-wire command that RF set to Rx idle mode. - // We can only prvide a usual value instead and then HW will modify the value by itself. - PHY_SetRFReg(padapter,RF90_PATH_A, 0,bMaskDWord, 0x32D95); - if ( pHalData->rf_type == RF_2T2R ) - PHY_SetRFReg(padapter,RF90_PATH_B, 0, bMaskDWord,0x32D95); - -#elif (CU_SS_MODE == 2) - - //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL - rtw_write8(padapter, REG_AFE_PLL_CTRL, 0x81); - - // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK - rtw_write16(padapter, REG_AFE_XTAL_CTRL, 0x800F); - rtw_mdelay_os(1); - - // 1. Enable MAC Clock. Can not be enabled now. - //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); - - // 2. Force PWM, Enable SPS18_LDO_Marco_Block - rtw_write8(padapter, REG_SPS0_CTRL,rtw_read8(padapter, REG_SPS0_CTRL) | (BIT0|BIT3)); - - // 3. restore BB, AFE control register. - //RF - if (pHalData->rf_type == RF_2T2R) - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 1); - else - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 1); - - PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 1); - PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1, 0); - - //AFE - PHY_SetBBReg(padapter, 0x0e70, bMaskDWord ,0x631B25A0 ); - - // 4. issue 3-wire command that RF set to Rx idle mode. This is used to re-write the RX idle mode. - // We can only prvide a usual value instead and then HW will modify the value by itself. - PHY_SetRFReg(padapter,RF90_PATH_A, 0, bRFRegOffsetMask,0x32D95); - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetRFReg(padapter,RF90_PATH_B, 0, bRFRegOffsetMask,0x32D95); - } - - // 5. gated MAC Clock - //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); - //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)|(BIT3)); - - { - u8 eRFPath = RF90_PATH_A,value8 = 0, u1bTmp, bytetmp, retry = 0; - - //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); - // 2010/08/12 MH Add for B path under SS test. - //if (pHalData->rf_type == RF_2T2R) - //PHY_SetRFReg(Adapter, RF90_PATH_B, 0x0, bMaskByte0, 0x0); - - bytetmp = rtw_read8(padapter, REG_APSD_CTRL); - rtw_write8(padapter, REG_APSD_CTRL, bytetmp & ~BIT6); - - rtw_mdelay_os(10); - - // Set BB reset at first - rtw_write8(padapter, REG_SYS_FUNC_EN, 0x17 );//0x16 - - // Enable TX - rtw_write8(padapter, REG_TXPAUSE, 0x0); - } - //Adapter->HalFunc.InitializeAdapterHandler(Adapter, Adapter->MgntInfo.dot11CurrentChannelNumber); - //CardSelectiveSuspendLeave(Adapter); -#endif - -} - - - -void _ps_close_RF(_adapter *padapter) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 value8; - DBG_8192C("==> %s \n",__FUNCTION__); - -#if (CU_SS_MODE == 1) - // 1. Set BB/RF to shutdown. - // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving - // (2) Reg878[21:19]= 0 //Turn off RF-B - // (3) RegC04[7:4]= 0 // turn off all paths for packet detection - // (4) Reg800[1] = 1 // enable preamble power saving - pwrpriv->PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(padapter,rFPGA0_XAB_RFParameter, bMaskDWord); - pwrpriv->PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(padapter,rOFDM0_TRxPathEnable, bMaskDWord); - pwrpriv->PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(padapter,rFPGA0_RFMOD, bMaskDWord); - - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 0); - } - else if (pHalData->rf_type == RF_1T1R) - { - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 0); - } - PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 0); - PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1,1); - - // 2 .AFE control register to power down. bit[30:22] - pwrpriv->PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(padapter,0x0e70, bMaskDWord); - PHY_SetBBReg(padapter,0x0e70,bMaskDWord,0x001B25A0); - - // 3. issue 3-wire command that RF set to power down. - PHY_SetRFReg(padapter,RF90_PATH_A, 0, bMaskDWord, 0); - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetRFReg(padapter,RF90_PATH_B, 0, bRFRegOffsetMask,0); - } - - // 4. Force PFM , disable SPS18_LDO_Marco_Block - //rtw_write8(padapter,REG_SPS0_CTRL,rtw_read8(padapter,REG_SPS0_CTRL) & ~(BIT(0)|BIT(3))); - value8 = rtw_read8(padapter,REG_SPS0_CTRL) ; - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - value8 &= ~(BIT0);//PWM - else - value8 &= ~(BIT0|BIT3);//PFM - - rtw_write8(padapter, REG_SPS0_CTRL, value8 ); - - - - // 5. gated MAC Clock - //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); - //delay_us(WAIT_US_WRITE_POWERON); - - // 6. Because Alfred said that USB SS mode will cause the power domain to being shut down. All the - // 8051 function will be turned off. So we need to prevent the situation. Designer provide three ways - // for us to test. But only one WOL can work now. - // Solution A: Enable WOL - rtw_write8(padapter, 0x690, rtw_read8(padapter, 0x690)|BIT1); - -#elif (CU_SS_MODE == 2) - { - u8 eRFPath = RF90_PATH_A,value8 = 0, u1bTmp; - rtw_write8(padapter, REG_TXPAUSE, 0xFF); - PHY_SetRFReg(padapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); - // 2010/08/12 MH Add for B path under SS test. - //if (pHalData->rf_type == RF_2T2R) - //PHY_SetRFReg(Adapter, RF90_PATH_B, 0x0, bMaskByte0, 0x0); - - value8 |= APSDOFF; - rtw_write8(padapter,REG_APSD_CTRL, value8);//0x40 - - // After switch APSD, we need to delay for stability - rtw_mdelay_os(10); - - // Set BB reset at first - value8 = 0 ; - value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn); - rtw_write8(padapter, REG_SYS_FUNC_EN,value8 );//0x16 - } - - // Disable RF and BB only for SelectSuspend. - - // 1. Set BB/RF to shutdown. - // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving - // (2)Reg878[21:19]= 0 //Turn off RF-B - // (3) RegC04[7:4]= 0 // turn off all paths for packet detection - // (4) Reg800[1] = 1 // enable preamble power saving - - pwrpriv->PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(padapter, rFPGA0_XAB_RFParameter, bMaskDWord); - pwrpriv->PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(padapter, rOFDM0_TRxPathEnable, bMaskDWord); - pwrpriv->PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(padapter, rFPGA0_RFMOD, bMaskDWord); - - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x380038, 0); - } - else if (pHalData->rf_type == RF_1T1R) - { - PHY_SetBBReg(padapter, rFPGA0_XAB_RFParameter, 0x38, 0); - } - - PHY_SetBBReg(padapter, rOFDM0_TRxPathEnable, 0xf0, 0); - PHY_SetBBReg(padapter, rFPGA0_RFMOD, BIT1,1); - - // 2 .AFE control register to power down. bit[30:22] - pwrpriv->PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(padapter, 0xe70, bMaskDWord); - PHY_SetBBReg(padapter, 0x0e70, bMaskDWord ,0x001B25A0); - - // 3. issue 3-wire command that RF set to power down. - PHY_SetRFReg(padapter,RF90_PATH_A, 0, bRFRegOffsetMask,0); - if (pHalData->rf_type == RF_2T2R) - { - PHY_SetRFReg(padapter,RF90_PATH_B, 0, bRFRegOffsetMask,0); - } - - // 4. Force PFM , disable SPS18_LDO_Marco_Block - //rtw_write8(padapter, REG_SPS0_CTRL, rtw_read8(padapter,REG_SPS0_CTRL) & ~(BIT0|BIT3)); - value8 = rtw_read8(padapter,REG_SPS0_CTRL) ; - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - value8 &= ~(BIT0);//PWM - else - value8 &= ~(BIT0|BIT3);//PFM - - rtw_write8(padapter, REG_SPS0_CTRL, value8 ); - - //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL - rtw_write8(padapter, REG_AFE_PLL_CTRL, 0x80); - rtw_mdelay_os(1); - - // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK - rtw_write16(padapter, REG_AFE_XTAL_CTRL, 0xA80F); - - - // 5. gated MAC Clock - //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); - //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)& ~(BIT3)) - - // 6. Because Alfred said that USB SS mode will cause the power domain to being shut down. All the - // 8051 function will be turned off. So we need to prevent the situation. Designer provide three ways - // for us to test. But only one WOL can work now. - // Solution A: Enable WOL - rtw_write8(padapter, 0x690,rtw_read8(padapter, 0x690)|BIT1); - -#endif -} -#endif - - - -static VOID -_DisableGPIO( - IN PADAPTER Adapter - ) -{ -/*************************************** -j. GPIO_PIN_CTRL 0x44[31:0]=0x000 // -k. Value = GPIO_PIN_CTRL[7:0] -l. GPIO_PIN_CTRL 0x44[31:0] = 0x00FF0000 | (value <<8); //write external PIN level -m. GPIO_MUXCFG 0x42 [15:0] = 0x0780 -n. LEDCFG 0x4C[15:0] = 0x8080 -***************************************/ - u8 value8; - u16 value16; - u32 value32; - - //1. Disable GPIO[7:0] - rtw_write16(Adapter, REG_GPIO_PIN_CTRL+2, 0x0000); - value32 = rtw_read32(Adapter, REG_GPIO_PIN_CTRL) & 0xFFFF00FF; - value8 = (u8) (value32&0x000000FF); - value32 |= ((value8<<8) | 0x00FF0000); - rtw_write32(Adapter, REG_GPIO_PIN_CTRL, value32); - - //2. Disable GPIO[10:8] - rtw_write8(Adapter, REG_GPIO_MUXCFG+3, 0x00); - value16 = rtw_read16(Adapter, REG_GPIO_MUXCFG+2) & 0xFF0F; - value8 = (u8) (value16&0x000F); - value16 |= ((value8<<4) | 0x0780); - rtw_write16(Adapter, REG_GPIO_MUXCFG+2, value16); - - //3. Disable LED0 & 1 - rtw_write16(Adapter, REG_LEDCFG0, 0x8080); - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable GPIO and LED.\n")); - -} //end of _DisableGPIO() - -static VOID -_ResetFWDownloadRegister( - IN PADAPTER Adapter - ) -{ - u32 value32; - - value32 = rtw_read32(Adapter, REG_MCUFWDL); - value32 &= ~(MCUFWDL_EN | MCUFWDL_RDY); - rtw_write32(Adapter, REG_MCUFWDL, value32); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset FW download register.\n")); -} - - -static int -_DisableRF_AFE( - IN PADAPTER Adapter - ) -{ - int rtStatus = _SUCCESS; - u32 pollingCount = 0; - u8 value8; - - //disable RF/ AFE AD/DA - value8 = APSDOFF; - rtw_write8(Adapter, REG_APSD_CTRL, value8); - - -#if (RTL8192CU_ASIC_VERIFICATION) - - do - { - if(rtw_read8(Adapter, REG_APSD_CTRL) & APSDOFF_STATUS){ - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE, AD, DA Done!\n")); - break; - } - - if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ - //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Failed to polling APSDOFF_STATUS done!\n")); - return _FAIL; - } - - }while(_TRUE); - -#endif - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE,AD, DA.\n")); - return rtStatus; - -} - -static VOID -_ResetBB( - IN PADAPTER Adapter - ) -{ - u16 value16; - - //reset BB - value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); - value16 &= ~(FEN_BBRSTB | FEN_BB_GLB_RSTn); - rtw_write16(Adapter, REG_SYS_FUNC_EN, value16); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset BB.\n")); -} - -static VOID -_ResetMCU( - IN PADAPTER Adapter - ) -{ - u16 value16; - - // reset MCU - value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); - value16 &= ~FEN_CPUEN; - rtw_write16(Adapter, REG_SYS_FUNC_EN, value16); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset MCU.\n")); -} - -static VOID -_DisableMAC_AFE_PLL( - IN PADAPTER Adapter - ) -{ - u32 value32; - - //disable MAC/ AFE PLL - value32 = rtw_read32(Adapter, REG_APS_FSMCO); - value32 |= APDM_MAC; - rtw_write32(Adapter, REG_APS_FSMCO, value32); - - value32 |= APFM_OFF; - rtw_write32(Adapter, REG_APS_FSMCO, value32); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable MAC, AFE PLL.\n")); -} - -static VOID -_AutoPowerDownToHostOff( - IN PADAPTER Adapter - ) -{ - u32 value32; - rtw_write8(Adapter, REG_SPS0_CTRL, 0x22); - - value32 = rtw_read32(Adapter, REG_APS_FSMCO); - - value32 |= APDM_HOST;//card disable - rtw_write32(Adapter, REG_APS_FSMCO, value32); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Auto Power Down to Host-off state.\n")); - - // set USB suspend - value32 = rtw_read32(Adapter, REG_APS_FSMCO); - value32 &= ~AFSM_PCIE; - rtw_write32(Adapter, REG_APS_FSMCO, value32); - -} - -static VOID -_SetUsbSuspend( - IN PADAPTER Adapter - ) -{ - u32 value32; - - value32 = rtw_read32(Adapter, REG_APS_FSMCO); - - // set USB suspend - value32 |= AFSM_HSUS; - rtw_write32(Adapter, REG_APS_FSMCO, value32); - - //RT_ASSERT(0 == (rtw_read32(Adapter, REG_APS_FSMCO) & BIT(12)),("")); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Set USB suspend.\n")); - -} - -static VOID -_DisableRFAFEAndResetBB( - IN PADAPTER Adapter - ) -{ -/************************************** -a. TXPAUSE 0x522[7:0] = 0xFF //Pause MAC TX queue -b. RF path 0 offset 0x00 = 0x00 // disable RF -c. APSD_CTRL 0x600[7:0] = 0x40 -d. SYS_FUNC_EN 0x02[7:0] = 0x16 //reset BB state machine -e. SYS_FUNC_EN 0x02[7:0] = 0x14 //reset BB state machine -***************************************/ - u8 eRFPath = 0,value8 = 0; - rtw_write8(Adapter, REG_TXPAUSE, 0xFF); - PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); - - value8 |= APSDOFF; - rtw_write8(Adapter, REG_APSD_CTRL, value8);//0x40 - - value8 = 0 ; - value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn); - rtw_write8(Adapter, REG_SYS_FUNC_EN,value8 );//0x16 - - value8 &=( ~FEN_BB_GLB_RSTn ); - rtw_write8(Adapter, REG_SYS_FUNC_EN, value8); //0x14 - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> RF off and reset BB.\n")); -} - -static VOID -_ResetDigitalProcedure1( - IN PADAPTER Adapter, - IN BOOLEAN bWithoutHWSM - ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(pHalData->FirmwareVersion <= 0x20){ - #if 0 - /***************************** - f. SYS_FUNC_EN 0x03[7:0]=0x54 // reset MAC register, DCORE - g. MCUFWDL 0x80[7:0]=0 // reset MCU ready status - ******************************/ - u4Byte value32 = 0; - PlatformIOWrite1Byte(Adapter, REG_SYS_FUNC_EN+1, 0x54); - PlatformIOWrite1Byte(Adapter, REG_MCUFWDL, 0); - #else - /***************************** - f. MCUFWDL 0x80[7:0]=0 // reset MCU ready status - g. SYS_FUNC_EN 0x02[10]= 0 // reset MCU register, (8051 reset) - h. SYS_FUNC_EN 0x02[15-12]= 5 // reset MAC register, DCORE - i. SYS_FUNC_EN 0x02[10]= 1 // enable MCU register, (8051 enable) - ******************************/ - u16 valu16 = 0; - rtw_write8(Adapter, REG_MCUFWDL, 0); - - valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); - rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 & (~FEN_CPUEN)));//reset MCU ,8051 - - valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN)&0x0FFF; - rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 |(FEN_HWPDN|FEN_ELDR)));//reset MAC - - #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE - { - u8 val; - if( (val=rtw_read8(Adapter, REG_MCUFWDL))) - DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); - } - #endif - - - valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); - rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 | FEN_CPUEN));//enable MCU ,8051 - - - #endif - } - else{ - u8 retry_cnts = 0; - - if(rtw_read8(Adapter, REG_MCUFWDL) & BIT1) - { //IF fw in RAM code, do reset - - rtw_write8(Adapter, REG_MCUFWDL, 0); - if(Adapter->bFWReady){ - // 2010/08/25 MH Accordign to RD alfred's suggestion, we need to disable other - // HRCV INT to influence 8051 reset. - rtw_write8(Adapter, REG_FWIMR, 0x20); - - rtw_write8(Adapter, REG_HMETFR+3, 0x20);//8051 reset by self - - while( (retry_cnts++ <100) && (FEN_CPUEN &rtw_read16(Adapter, REG_SYS_FUNC_EN))) - { - rtw_udelay_os(50);//PlatformStallExecution(50);//us - } - - if(retry_cnts >= 100){ - DBG_8192C("%s #####=> 8051 reset failed!.........................\n", __FUNCTION__); - // if 8051 reset fail we trigger GPIO 0 for LA - //PlatformEFIOWrite4Byte( Adapter, - // REG_GPIO_PIN_CTRL, - // 0x00010100); - // 2010/08/31 MH According to Filen's info, if 8051 reset fail, reset MAC directly. - rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x50); //Reset MAC and Enable 8051 - rtw_mdelay_os(10); - } - else { - //DBG_871X("%s =====> 8051 reset success (%d) .\n", __FUNCTION__, retry_cnts); - } - } - else { - DBG_871X("%s =====> 8051 in RAM but !Adapter->bFWReady\n", __FUNCTION__); - } - } - else{ - //DBG_871X("%s =====> 8051 in ROM.\n", __FUNCTION__); - } - - #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE - { - u8 val; - if( (val=rtw_read8(Adapter, REG_MCUFWDL))) - DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); - } - #endif - - rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x54); //Reset MAC and Enable 8051 - } - - // Clear rpwm value for initial toggle bit trigger. - rtw_write8(Adapter, REG_USB_HRPWM, 0x00); - - if(bWithoutHWSM){ - /***************************** - Without HW auto state machine - g. SYS_CLKR 0x08[15:0] = 0x30A3 //disable MAC clock - h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL - i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK - j. SYS_ISO_CTRL 0x00[7:0] = 0xF9 // isolated digital to PON - ******************************/ - //rtw_write16(Adapter, REG_SYS_CLKR, 0x30A3); - rtw_write16(Adapter, REG_SYS_CLKR, 0x70A3);//modify to 0x70A3 by Scott. - rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x80); - rtw_write16(Adapter, REG_AFE_XTAL_CTRL, 0x880F); - rtw_write8(Adapter, REG_SYS_ISO_CTRL, 0xF9); - } - else - { - // Disable all RF/BB power - rtw_write8(Adapter, REG_RF_CTRL, 0x00); - } - //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Reset Digital.\n")); - -} - -static VOID -_ResetDigitalProcedure2( - IN PADAPTER Adapter -) -{ -/***************************** -k. SYS_FUNC_EN 0x03[7:0] = 0x44 // disable ELDR runction -l. SYS_CLKR 0x08[15:0] = 0x3083 // disable ELDR clock -m. SYS_ISO_CTRL 0x01[7:0] = 0x83 // isolated ELDR to PON -******************************/ - //rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x44);//marked by Scott. - //rtw_write16(Adapter, REG_SYS_CLKR, 0x3083); - //rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x83); - - rtw_write16(Adapter, REG_SYS_CLKR, 0x70a3); //modify to 0x70a3 by Scott. - rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x82); //modify to 0x82 by Scott. -} - -static VOID -_DisableAnalog( - IN PADAPTER Adapter, - IN BOOLEAN bWithoutHWSM - ) -{ - u16 value16 = 0; - u8 value8=0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(bWithoutHWSM){ - /***************************** - n. LDOA15_CTRL 0x20[7:0] = 0x04 // disable A15 power - o. LDOV12D_CTRL 0x21[7:0] = 0x54 // disable digital core power - r. When driver call disable, the ASIC will turn off remaining clock automatically - ******************************/ - - rtw_write8(Adapter, REG_LDOA15_CTRL, 0x04); - //PlatformIOWrite1Byte(Adapter, REG_LDOV12D_CTRL, 0x54); - - value8 = rtw_read8(Adapter, REG_LDOV12D_CTRL); - value8 &= (~LDV12_EN); - rtw_write8(Adapter, REG_LDOV12D_CTRL, value8); - //RT_TRACE(COMP_INIT, DBG_LOUD, (" REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8)); - } - -/***************************** -h. SPS0_CTRL 0x11[7:0] = 0x23 //enter PFM mode -i. APS_FSMCO 0x04[15:0] = 0x4802 // set USB suspend -******************************/ - - - value8 = 0x23; - if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) - value8 |= BIT3; - - rtw_write8(Adapter, REG_SPS0_CTRL, value8); - - - if(bWithoutHWSM) - { - //value16 |= (APDM_HOST | /*AFSM_HSUS |*/PFM_ALDN); - // 2010/08/31 According to Filen description, we need to use HW to shut down 8051 automatically. - // Becasue suspend operatione need the asistance of 8051 to wait for 3ms. - value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN); - } - else - { - value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN); - } - - rtw_write16(Adapter, REG_APS_FSMCO,value16 );//0x4802 - - rtw_write8(Adapter, REG_RSV_CTRL, 0x0e); - - #if 0 - //tynli_test for suspend mode. - if(!bWithoutHWSM){ - rtw_write8(Adapter, 0xfe10, 0x19); - } -#endif - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable Analog Reg0x04:0x%04x.\n",value16)); -} - -static int -CardDisableHWSM( // HW Auto state machine - IN PADAPTER Adapter, - IN BOOLEAN resetMCU - ) -{ - int rtStatus = _SUCCESS; - if(Adapter->bSurpriseRemoved){ - return rtStatus; - } -#if 1 - //==== RF Off Sequence ==== - _DisableRFAFEAndResetBB(Adapter); - - // ==== Reset digital sequence ====== - _ResetDigitalProcedure1(Adapter, _FALSE); - - // ==== Pull GPIO PIN to balance level and LED control ====== - _DisableGPIO(Adapter); - - // ==== Disable analog sequence === - _DisableAnalog(Adapter, _FALSE); - - RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("======> Card disable finished.\n")); -#else - _DisableGPIO(Adapter); - - //reset FW download register - _ResetFWDownloadRegister(Adapter); - - - //disable RF/ AFE AD/DA - rtStatus = _DisableRF_AFE(Adapter); - if(RT_STATUS_SUCCESS != rtStatus){ - RT_TRACE(COMP_INIT, DBG_SERIOUS, ("_DisableRF_AFE failed!\n")); - goto Exit; - } - _ResetBB(Adapter); - - if(resetMCU){ - _ResetMCU(Adapter); - } - - _AutoPowerDownToHostOff(Adapter); - //_DisableMAC_AFE_PLL(Adapter); - - _SetUsbSuspend(Adapter); -Exit: -#endif - return rtStatus; - -} - -static int -CardDisableWithoutHWSM( // without HW Auto state machine - IN PADAPTER Adapter - ) -{ - int rtStatus = _SUCCESS; - - if(Adapter->bSurpriseRemoved){ - return rtStatus; - } - //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Card Disable Without HWSM .\n")); - //==== RF Off Sequence ==== - _DisableRFAFEAndResetBB(Adapter); - - // ==== Reset digital sequence ====== - _ResetDigitalProcedure1(Adapter, _TRUE); - - // ==== Pull GPIO PIN to balance level and LED control ====== - _DisableGPIO(Adapter); - - // ==== Reset digital sequence ====== - _ResetDigitalProcedure2(Adapter); - - // ==== Disable analog sequence === - _DisableAnalog(Adapter, _TRUE); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("<====== Card Disable Without HWSM .\n")); - return rtStatus; -} - -static void rtl8192cu_hw_power_down(_adapter *padapter) -{ - // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. - // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. - - // Enable register area 0x0-0xc. - rtw_write8(padapter,REG_RSV_CTRL, 0x0); - rtw_write16(padapter, REG_APS_FSMCO, 0x8812); -} - -u32 rtl8192cu_hal_deinit(PADAPTER Adapter) - { - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //DBG_8192C("==> %s \n",__FUNCTION__); - // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in - // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all - // IC. Accord to johnny's opinion, only RU need the support. - if (IS_HARDWARE_TYPE_8192C(Adapter) && (pHalData->BoardType == BOARD_USB_High_PA)) - rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)|BIT1); - - #ifdef SUPPORT_HW_RFOFF_DETECTED - //DBG_8192C("bkeepfwalive(%x)\n",Adapter->pwrctrlpriv.bkeepfwalive); - if(Adapter->pwrctrlpriv.bkeepfwalive) - { - _ps_close_RF(Adapter); - if((Adapter->pwrctrlpriv.bHWPwrPindetect) && (Adapter->pwrctrlpriv.bHWPowerdown)) - rtl8192cu_hw_power_down(Adapter); - } - else -#endif - { - if( Adapter->bCardDisableWOHSM == _FALSE) - { - //DBG_8192C("card disble HWSM...........\n"); - CardDisableHWSM(Adapter, _FALSE); - } - else - { - DBG_8192C("card disble without HWSM...........\n"); - CardDisableWithoutHWSM(Adapter); // without HW Auto state machine - - if((Adapter->pwrctrlpriv.bHWPwrPindetect ) && (Adapter->pwrctrlpriv.bHWPowerdown)) - rtl8192cu_hw_power_down(Adapter); - } - } - - return _SUCCESS; - } - - -unsigned int rtl8192cu_inirp_init(PADAPTER Adapter) -{ - u8 i; - struct recv_buf *precvbuf; - uint status; - struct dvobj_priv *pdev=&Adapter->dvobjpriv; - struct intf_hdl * pintfhdl=&Adapter->iopriv.intf; - struct recv_priv *precvpriv = &(Adapter->recvpriv); - u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); -#endif - -_func_enter_; - - _read_port = pintfhdl->io_ops._read_port; - - status = _SUCCESS; - - RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("===> usb_inirp_init \n")); - - precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR; - - //issue Rx irp to receive data - precvbuf = (struct recv_buf *)precvpriv->precv_buf; - for(i=0; iff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE ) - { - RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_port error \n")); - status = _FAIL; - goto exit; - } - - precvbuf++; - precvpriv->free_recv_buf_queue_cnt--; - } - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - _read_interrupt = pintfhdl->io_ops._read_interrupt; - if(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE ) - { - RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_interrupt error \n")); - status = _FAIL; - } -#endif - -exit: - - RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("<=== usb_inirp_init \n")); - -_func_exit_; - - return status; - -} - -unsigned int rtl8192cu_inirp_deinit(PADAPTER Adapter) -{ - RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n ===> usb_rx_deinit \n")); - - read_port_cancel(Adapter); - - RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n <=== usb_rx_deinit \n")); - - return _SUCCESS; -} - -//------------------------------------------------------------------------- -// -// Channel Plan -// -//------------------------------------------------------------------------- - -static VOID -ReadChannelPlan( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoLoadFail - ) -{ - -#define EEPROM_TEST_CHANNEL_PLAN (0x7D) -#define EEPROM_NORMAL_CHANNEL_PLAN (0x75) - - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u8 channelPlan; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(AutoLoadFail){ - channelPlan = CHPL_FCC; - } - else{ - if(IS_NORMAL_CHIP(pHalData->VersionID)) - channelPlan = PROMContent[EEPROM_NORMAL_CHANNEL_PLAN]; - else - channelPlan = PROMContent[EEPROM_TEST_CHANNEL_PLAN]; - } - - if((pregistrypriv->channel_plan>= RT_CHANNEL_DOMAIN_MAX) || (channelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)) - { - pmlmepriv->ChannelPlan = _HalMapChannelPlan8192C(Adapter, (channelPlan & (~(EEPROM_CHANNEL_PLAN_BY_HW_MASK)))); - //pMgntInfo->bChnlPlanFromHW = (channelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) ? _TRUE : _FALSE; // User cannot change channel plan. - } - else - { - pmlmepriv->ChannelPlan = (RT_CHANNEL_DOMAIN)pregistrypriv->channel_plan; - } - -#if 0 //todo: - switch(pMgntInfo->ChannelPlan) - { - case RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN: - { - PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo); - - pDot11dInfo->bEnabled = _TRUE; - } - //RT_TRACE(COMP_INIT, DBG_LOUD, ("Enable dot11d when RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN!\n")); - break; - } -#endif - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegChannelPlan(%d) EEPROMChannelPlan(%ld)", pMgntInfo->RegChannelPlan, (u4Byte)channelPlan)); - //RT_TRACE(COMP_INIT, DBG_LOUD, ("ChannelPlan = %d\n" , pMgntInfo->ChannelPlan)); - - //MSG_8192C("RT_ChannelPlan: 0x%02x\n", pmlmepriv->ChannelPlan); - -} - - -//------------------------------------------------------------------------- -// -// EEPROM Power index mapping -// -//------------------------------------------------------------------------- - - static VOID -_ReadPowerValueFromPROM( - IN PTxPowerInfo pwrInfo, - IN u8* PROMContent, - IN BOOLEAN AutoLoadFail - ) -{ - u32 rfPath, eeAddr, group; - - _rtw_memset(pwrInfo, 0, sizeof(TxPowerInfo)); - - if(AutoLoadFail){ - for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ - for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ - pwrInfo->CCKIndex[rfPath][group] = EEPROM_Default_TxPowerLevel; - pwrInfo->HT40_1SIndex[rfPath][group] = EEPROM_Default_TxPowerLevel; - pwrInfo->HT40_2SIndexDiff[rfPath][group]= EEPROM_Default_HT40_2SDiff; - pwrInfo->HT20IndexDiff[rfPath][group] = EEPROM_Default_HT20_Diff; - pwrInfo->OFDMIndexDiff[rfPath][group] = EEPROM_Default_LegacyHTTxPowerDiff; - pwrInfo->HT40MaxOffset[rfPath][group] = EEPROM_Default_HT40_PwrMaxOffset; - pwrInfo->HT20MaxOffset[rfPath][group] = EEPROM_Default_HT20_PwrMaxOffset; - } - } - - pwrInfo->TSSI_A = EEPROM_Default_TSSI; - pwrInfo->TSSI_B = EEPROM_Default_TSSI; - - return; - } - - for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ - for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ - eeAddr = EEPROM_CCK_TX_PWR_INX + (rfPath * 3) + group; - pwrInfo->CCKIndex[rfPath][group] = PROMContent[eeAddr]; - - eeAddr = EEPROM_HT40_1S_TX_PWR_INX + (rfPath * 3) + group; - pwrInfo->HT40_1SIndex[rfPath][group] = PROMContent[eeAddr]; - } - } - - for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ - for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ - pwrInfo->HT40_2SIndexDiff[rfPath][group] = - (PROMContent[EEPROM_HT40_2S_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; - -#if 1 - pwrInfo->HT20IndexDiff[rfPath][group] = - (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; - if(pwrInfo->HT20IndexDiff[rfPath][group] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo->HT20IndexDiff[rfPath][group] |= 0xF0; -#else - pwrInfo->HT20IndexDiff[rfPath][group] = - (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; -#endif - - pwrInfo->OFDMIndexDiff[rfPath][group] = - (PROMContent[EEPROM_OFDM_TX_PWR_INX_DIFF+ group] >> (rfPath * 4)) & 0xF; - - pwrInfo->HT40MaxOffset[rfPath][group] = - (PROMContent[EEPROM_HT40_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF; - - pwrInfo->HT20MaxOffset[rfPath][group] = - (PROMContent[EEPROM_HT20_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF; - } - } - - pwrInfo->TSSI_A = PROMContent[EEPROM_TSSI_A]; - pwrInfo->TSSI_B = PROMContent[EEPROM_TSSI_B]; - -} - - -static u32 -_GetChannelGroup( - IN u32 channel - ) -{ - //RT_ASSERT((channel < 14), ("Channel %d no is supported!\n")); - - if(channel < 3){ // Channel 1~3 - return 0; - } - else if(channel < 9){ // Channel 4~9 - return 1; - } - - return 2; // Channel 10~14 -} - - -static VOID -ReadTxPowerInfo( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoLoadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - TxPowerInfo pwrInfo; - u32 rfPath, ch, group; - u8 pwr, diff; - - _ReadPowerValueFromPROM(&pwrInfo, PROMContent, AutoLoadFail); - - if(!AutoLoadFail) - pHalData->bTXPowerDataReadFromEEPORM = _TRUE; - - for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ - for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ - group = _GetChannelGroup(ch); - - pHalData->TxPwrLevelCck[rfPath][ch] = pwrInfo.CCKIndex[rfPath][group]; - pHalData->TxPwrLevelHT40_1S[rfPath][ch] = pwrInfo.HT40_1SIndex[rfPath][group]; - - pHalData->TxPwrHt20Diff[rfPath][ch] = pwrInfo.HT20IndexDiff[rfPath][group]; - pHalData->TxPwrLegacyHtDiff[rfPath][ch] = pwrInfo.OFDMIndexDiff[rfPath][group]; - pHalData->PwrGroupHT20[rfPath][ch] = pwrInfo.HT20MaxOffset[rfPath][group]; - pHalData->PwrGroupHT40[rfPath][ch] = pwrInfo.HT40MaxOffset[rfPath][group]; - - pwr = pwrInfo.HT40_1SIndex[rfPath][group]; - diff = pwrInfo.HT40_2SIndexDiff[rfPath][group]; - - pHalData->TxPwrLevelHT40_2S[rfPath][ch] = (pwr > diff) ? (pwr - diff) : 0; - } - } - -#if DBG - - for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ - for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ - RTPRINT(FINIT, INIT_TxPower, - ("RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n", - rfPath, ch, pHalData->TxPwrLevelCck[rfPath][ch], - pHalData->TxPwrLevelHT40_1S[rfPath][ch], - pHalData->TxPwrLevelHT40_2S[rfPath][ch])); - - } - } - - for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ - RTPRINT(FINIT, INIT_TxPower, ("RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF90_PATH_A][ch])); - } - - for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ - RTPRINT(FINIT, INIT_TxPower, ("RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF90_PATH_A][ch])); - } - - for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ - RTPRINT(FINIT, INIT_TxPower, ("RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF90_PATH_B][ch])); - } - - for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ - RTPRINT(FINIT, INIT_TxPower, ("RF-B Legacy to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF90_PATH_B][ch])); - } - -#endif - // 2010/10/19 MH Add Regulator recognize for CU. - if(!AutoLoadFail) - { - pHalData->EEPROMRegulatory = (PROMContent[RF_OPTION1]&0x7); //bit0~2 - } - else - { - pHalData->EEPROMRegulatory = 0; - } - //DBG_8192C("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); - -} - - -//------------------------------------------------------------------- -// -// EEPROM/EFUSE Content Parsing -// -//------------------------------------------------------------------- -static void -_ReadIDs( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(_FALSE == AutoloadFail){ - // VID, PID - pHalData->EEPROMVID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_VID]); - pHalData->EEPROMPID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_PID]); - - // Customer ID, 0x00 and 0xff are reserved for Realtek. - pHalData->EEPROMCustomerID = *(u8 *)&PROMContent[EEPROM_CUSTOMER_ID]; - pHalData->EEPROMSubCustomerID = *(u8 *)&PROMContent[EEPROM_SUBCUSTOMER_ID]; - - } - else{ - pHalData->EEPROMVID = EEPROM_Default_VID; - pHalData->EEPROMPID = EEPROM_Default_PID; - - // Customer ID, 0x00 and 0xff are reserved for Realtek. - pHalData->EEPROMCustomerID = EEPROM_Default_CustomerID; - pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; - - } - - // For customized behavior. - if((pHalData->EEPROMVID == 0x103C) && (pHalData->EEPROMVID == 0x1629))// HP Lite-On for RTL8188CUS Slim Combo. - pHalData->CustomerID = RT_CID_819x_HP; - - // Decide CustomerID according to VID/DID or EEPROM - switch(pHalData->EEPROMCustomerID) - { - case EEPROM_CID_DEFAULT: - if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308)) - pHalData->CustomerID = RT_CID_DLINK; - else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309)) - pHalData->CustomerID = RT_CID_DLINK; - else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a)) - pHalData->CustomerID = RT_CID_DLINK; - break; - case EEPROM_CID_WHQL: -/* - Adapter->bInHctTest = TRUE; - - pMgntInfo->bSupportTurboMode = FALSE; - pMgntInfo->bAutoTurboBy8186 = FALSE; - - pMgntInfo->PowerSaveControl.bInactivePs = FALSE; - pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE; - pMgntInfo->PowerSaveControl.bLeisurePs = FALSE; - - pMgntInfo->keepAliveLevel = 0; - - Adapter->bUnloadDriverwhenS3S4 = FALSE; -*/ - break; - default: - pHalData->CustomerID = RT_CID_DEFAULT; - break; - - } - - //MSG_8192C("EEPROMVID = 0x%04x\n", pHalData->EEPROMVID); - //MSG_8192C("EEPROMPID = 0x%04x\n", pHalData->EEPROMPID); - //MSG_8192C("EEPROMCustomerID : 0x%02x\n", pHalData->EEPROMCustomerID); - //MSG_8192C("EEPROMSubCustomerID: 0x%02x\n", pHalData->EEPROMSubCustomerID); - - //MSG_8192C("RT_CustomerID: 0x%02x\n", pHalData->CustomerID); - -} - - -static VOID -_ReadMACAddress( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - - if(_FALSE == AutoloadFail){ - //Read Permanent MAC address and set value to hardware - _rtw_memcpy(pEEPROM->mac_addr, &PROMContent[EEPROM_MAC_ADDR], ETH_ALEN); - } - else{ - //Random assigh MAC address - u8 sMacAddr[MAC_ADDR_LEN] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00}; - //sMacAddr[5] = (u8)GetRandomNumber(1, 254); - _rtw_memcpy(pEEPROM->mac_addr, sMacAddr, ETH_ALEN); - } - //DBG_8192C("%s MAC Address from EFUSE = "MAC_FMT"\n",__FUNCTION__, MAC_ARG(pEEPROM->mac_addr)); - //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); - //RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "MAC Addr: %s", Adapter->PermanentAddress); - -} - -static VOID -_ReadBoardType( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); - u32 value32; - u8 boardType = BOARD_USB_DONGLE; -#if 0 - if(isNormal) - { - value32 = rtw_read32(Adapter, REG_HPON_FSM); - - DBG_8192C("first value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); - - if(!IS_92C_SERIAL(pHalData->VersionID)) - { - if(CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_88C_USB_MCARD) - { - pHalData->BoardType = BOARD_MINICARD; - DBG_8192C("value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); - } - else if(CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_88C_USB_HP) - { - pHalData->BoardType = BOARD_USB_High_PA; - DBG_8192C("value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); - } - } - } -#endif - - if(AutoloadFail){ - if(IS_8723_SERIES(pHalData->VersionID)) - pHalData->rf_type = RF_1T1R; - else - pHalData->rf_type = RF_2T2R; - - pHalData->BluetoothCoexist = _FALSE; - pHalData->BoardType = boardType; - return; - } - - if(isNormal) - { - boardType = PROMContent[EEPROM_NORMAL_BoardType]; - boardType &= BOARD_TYPE_NORMAL_MASK;//bit[7:5] - boardType >>= 5; - } - else - { - boardType = PROMContent[EEPROM_RF_OPT4]; - boardType &= BOARD_TYPE_TEST_MASK; - } - - pHalData->BoardType = boardType; - //MSG_8192C("_ReadBoardType(%x)\n",pHalData->BoardType); - - if (boardType == BOARD_USB_High_PA) - pHalData->ExternalPA = 1; -} - - -static VOID -_ReadLEDSetting( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - struct led_priv *pledpriv = &(Adapter->ledpriv); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); -#ifdef CONFIG_SW_LED - pledpriv->bRegUseLed = _TRUE; - - // - // Led mode - // - switch(pHalData->CustomerID) - { - case RT_CID_DEFAULT: - pledpriv->LedStrategy = SW_LED_MODE1; - pledpriv->bRegUseLed = _TRUE; - break; - - case RT_CID_819x_HP: - pledpriv->LedStrategy = SW_LED_MODE6; - break; - - default: - pledpriv->LedStrategy = SW_LED_MODE1; - break; - } - - if( BOARD_MINICARD == pHalData->BoardType ) - { - pledpriv->LedStrategy = SW_LED_MODE6; - } - pHalData->bLedOpenDrain = _TRUE;// Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. -#else // HW LED - pledpriv->LedStrategy = HW_LED; -#endif //CONFIG_SW_LED -} - -static VOID -_ReadThermalMeter( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 tempval; - - // - // ThermalMeter from EEPROM - // - if(!AutoloadFail) - tempval = PROMContent[EEPROM_THERMAL_METER]; - else - tempval = EEPROM_Default_ThermalMeter; - - pHalData->EEPROMThermalMeter = (tempval&0x1f); //[4:0] - - if(pHalData->EEPROMThermalMeter == 0x1f || AutoloadFail) - pdmpriv->bAPKThermalMeterIgnore = _TRUE; - -#if 0 - if(pHalData->EEPROMThermalMeter < 0x06 || pHalData->EEPROMThermalMeter > 0x1c) - pHalData->EEPROMThermalMeter = 0x12; -#endif - - pdmpriv->ThermalMeter[0] = pHalData->EEPROMThermalMeter; - - //RTPRINT(FINIT, INIT_TxPower, ("ThermalMeter = 0x%x\n", pHalData->EEPROMThermalMeter)); - -} - -static VOID -_ReadRFSetting( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ -} - -static void -_ReadPROMVersion( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(AutoloadFail){ - pHalData->EEPROMVersion = EEPROM_Default_Version; - } - else{ - pHalData->EEPROMVersion = *(u8 *)&PROMContent[EEPROM_VERSION]; - } -} - -static VOID -readAntennaDiversity( - IN PADAPTER pAdapter, - IN u8 *hwinfo, - IN BOOLEAN AutoLoadFail - ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct registry_priv *registry_par = &pAdapter->registrypriv; - - if(!AutoLoadFail) - { - // Antenna Diversity setting. - if(registry_par->antdiv_cfg == 2) // 2: From Efuse - pHalData->AntDivCfg = (hwinfo[EEPROM_RF_OPT1]&0x18)>>3; - else - pHalData->AntDivCfg = registry_par->antdiv_cfg ; // 0:OFF , 1:ON, - - //DBG_8192C("### AntDivCfg(%x)\n",pHalData->AntDivCfg); - - //if(pHalData->EEPROMBluetoothCoexist!=0 && pHalData->EEPROMBluetoothAntNum==Ant_x1) - // pHalData->AntDivCfg = 0; - } - else - { - pHalData->AntDivCfg = 0; - } - -} - -static VOID -hal_InitPGData( - IN PADAPTER pAdapter, - IN OUT u8 *PROMContent - ) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - u32 i; - u16 value16; - - if(_FALSE == pEEPROM->bautoload_fail_flag) - { // autoload OK. - if (_TRUE == pEEPROM->EepromOrEfuse) - { - // Read all Content from EEPROM or EFUSE. - for(i = 0; i < HWSET_MAX_SIZE; i += 2) - { - //value16 = EF2Byte(ReadEEprom(pAdapter, (u2Byte) (i>>1))); - //*((u16 *)(&PROMContent[i])) = value16; - } - } - else - { - // Read EFUSE real map to shadow. - EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE); - _rtw_memcpy((void*)PROMContent, (void*)pEEPROM->efuse_eeprom_data, HWSET_MAX_SIZE); - } - } - else - {//autoload fail - //RT_TRACE(COMP_INIT, DBG_LOUD, ("AutoLoad Fail reported from CR9346!!\n")); - pEEPROM->bautoload_fail_flag = _TRUE; - //update to default value 0xFF - if (_FALSE == pEEPROM->EepromOrEfuse) - EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE); - } -} -// Read HW power down mode selection -static void _ReadPSSetting(IN PADAPTER Adapter,IN u8*PROMContent,IN u8 AutoloadFail) -{ - if(AutoloadFail){ - Adapter->pwrctrlpriv.bHWPowerdown = _FALSE; - Adapter->pwrctrlpriv.bSupportRemoteWakeup = _FALSE; - } - else { - //if(SUPPORT_HW_RADIO_DETECT(Adapter)) - Adapter->pwrctrlpriv.bHWPwrPindetect = Adapter->registrypriv.hwpwrp_detect; - //else - //Adapter->pwrctrlpriv.bHWPwrPindetect = _FALSE;//dongle not support new - - - //hw power down mode selection , 0:rf-off / 1:power down - - if(Adapter->registrypriv.hwpdn_mode==2) - Adapter->pwrctrlpriv.bHWPowerdown = (PROMContent[EEPROM_RF_OPT3] & BIT4); - else - Adapter->pwrctrlpriv.bHWPowerdown = Adapter->registrypriv.hwpdn_mode; - - // decide hw if support remote wakeup function - // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume - Adapter->pwrctrlpriv.bSupportRemoteWakeup = (PROMContent[EEPROM_TEST_USB_OPT] & BIT1)?_TRUE :_FALSE; - - //if(SUPPORT_HW_RADIO_DETECT(Adapter)) - //Adapter->registrypriv.usbss_enable = Adapter->pwrctrlpriv.bSupportRemoteWakeup ; - - //DBG_8192C("%s...bHWPwrPindetect(%x)-bHWPowerdown(%x) ,bSupportRemoteWakeup(%x)\n",__FUNCTION__, - //Adapter->pwrctrlpriv.bHWPwrPindetect,Adapter->pwrctrlpriv.bHWPowerdown ,Adapter->pwrctrlpriv.bSupportRemoteWakeup); - - //DBG_8192C("### PS params=> power_mgnt(%x),usbss_enable(%x) ###\n",Adapter->registrypriv.power_mgnt,Adapter->registrypriv.usbss_enable); - - } - -} - -static VOID -readAdapterInfo_8192CU( - IN PADAPTER Adapter - ) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - u8 PROMContent[HWSET_MAX_SIZE]={0}; - - hal_InitPGData(Adapter, PROMContent); - rtl8192c_EfuseParseIDCode(Adapter, PROMContent); - - _ReadPROMVersion(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - _ReadIDs(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - _ReadMACAddress(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - ReadTxPowerInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - _ReadBoardType(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - -#ifdef CONFIG_BT_COEXIST - // - // Read Bluetooth co-exist and initialize - // - rtl8192c_ReadBluetoothCoexistInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); -#endif - - ReadChannelPlan(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - _ReadThermalMeter(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - _ReadLEDSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - _ReadRFSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - _ReadPSSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - readAntennaDiversity(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); - - //hal_CustomizedBehavior_8723U(Adapter); - - Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1; - //DBG_8192C("%s(): REPLACEMENT = %x\n",__FUNCTION__,Adapter->bDongle); -} - -static void _ReadPROMContent( - IN PADAPTER Adapter - ) -{ - EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 PROMContent[HWSET_MAX_SIZE]={0}; - u8 eeValue; - u32 i; - u16 value16; - - eeValue = rtw_read8(Adapter, REG_9346CR); - // To check system boot selection. - pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; - pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE; - - - //DBG_8192C("Boot from %s, Autoload %s !\n", (pEEPROM->EepromOrEfuse ? "EEPROM" : "EFUSE"), - //(pEEPROM->bautoload_fail_flag ? "Fail" : "OK") ); - - //pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE; - - //if(IS_HARDWARE_TYPE_8723(Adapter)) - // readAdapterInfo_8723U(Adapter); - //else - readAdapterInfo_8192CU(Adapter); -} - - -static VOID -_InitOtherVariable( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - //if(Adapter->bInHctTest){ - // pMgntInfo->PowerSaveControl.bInactivePs = FALSE; - // pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE; - // pMgntInfo->PowerSaveControl.bLeisurePs = FALSE; - // pMgntInfo->keepAliveLevel = 0; - //} - - // 2009/06/10 MH For 92S 1*1=1R/ 1*2&2*2 use 2R. We default set 1*1 use radio A - // So if you want to use radio B. Please modify RF path enable bit for correct signal - // strength calculate. - if (pHalData->rf_type == RF_1T1R){ - pHalData->bRFPathRxEnable[0] = _TRUE; - } - else{ - pHalData->bRFPathRxEnable[0] = pHalData->bRFPathRxEnable[1] = _TRUE; - } - -} - -static VOID -_ReadRFType( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - -#if DISABLE_BB_RF - pHalData->rf_chip = RF_PSEUDO_11N; -#else - pHalData->rf_chip = RF_6052; -#endif -} - -void _ReadSilmComboMode(PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - pHalData->SlimComboDbg = _FALSE; // Default is not debug mode. - - // 2010/11/22 MH We need to enter debug mode for TSMA and UMC A cut - if ((Adapter->chip_type == RTL8188C_8192C) && - (pHalData->BoardType == BOARD_USB_COMBO)) - { - switch (pHalData->VersionID) - { - case VERSION_NORMAL_TSMC_CHIP_88C: - case VERSION_NORMAL_TSMC_CHIP_92C: - case VERSION_NORMAL_TSMC_CHIP_92C_1T2R: - case VERSION_NORMAL_UMC_CHIP_88C_A_CUT: - case VERSION_NORMAL_UMC_CHIP_92C_A_CUT: - case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT: - if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20) - pHalData->SlimComboDbg = _TRUE; - - break; - - case VERSION_NORMAL_UMC_CHIP_88C_B_CUT: - case VERSION_NORMAL_UMC_CHIP_92C_B_CUT: - case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT: - // 2011/02/15 MH UNC-B cut ECO fail, we need to support slim combo debug mode. - if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20) - pHalData->SlimComboDbg = _TRUE; - break; - - default: - break; - } - - } - -} -static int _ReadAdapterInfo8192CU(PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 start=rtw_get_current_time(); - - //MSG_8192C("====> ReadAdapterInfo8192C\n"); - - //Efuse_InitSomeVar(Adapter); - - //if(IS_HARDWARE_TYPE_8723(Adapter)) - // _EfuseCellSel(Adapter); - - _ReadRFType(Adapter);//rf_chip -> _InitRFType() - _ReadPROMContent(Adapter); - - // 2010/10/25 MH THe function must be called after borad_type & IC-Version recognize. - _ReadSilmComboMode(Adapter); - - _InitOtherVariable(Adapter); - - //MSG_8192C("%s()(done), rf_chip=0x%x, rf_type=0x%x\n", __FUNCTION__, pHalData->rf_chip, pHalData->rf_type); - - //MSG_8192C("<==== ReadAdapterInfo8192C in %d ms\n", rtw_get_passing_time_ms(start)); - - return _SUCCESS; -} - - -static void ReadAdapterInfo8192CU(PADAPTER Adapter) -{ - // Read EEPROM size before call any EEPROM function - //Adapter->EepromAddressSize=Adapter->HalFunc.GetEEPROMSizeHandler(Adapter); - Adapter->EepromAddressSize = GetEEPROMSize8192C(Adapter); - - _ReadAdapterInfo8192CU(Adapter); -} - - -#define GPIO_DEBUG_PORT_NUM 0 -static void rtl8192cu_trigger_gpio_0(_adapter *padapter) -{ - - u32 gpioctrl; - DBG_8192C("==> trigger_gpio_0...\n"); - rtw_write16_async(padapter,REG_GPIO_PIN_CTRL,0); - rtw_write8_async(padapter,REG_GPIO_PIN_CTRL+2,0xFF); - gpioctrl = (BIT(GPIO_DEBUG_PORT_NUM)<<24 )|(BIT(GPIO_DEBUG_PORT_NUM)<<16); - rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl); - gpioctrl |= (BIT(GPIO_DEBUG_PORT_NUM)<<8); - rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl); - DBG_8192C("<=== trigger_gpio_0...\n"); - -} - -static void ResumeTxBeacon(_adapter *padapter) -{ - HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter); - - // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value - // which should be read from register to a global variable. - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6); - pHalData->RegFwHwTxQCtrl |= BIT6; - rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0xff); - pHalData->RegReg542 |= BIT0; - rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542); - } - else - { - pHalData->RegTxPause = rtw_read8(padapter, REG_TXPAUSE); - rtw_write8(padapter, REG_TXPAUSE, pHalData->RegTxPause & (~BIT6)); - } - -} - -static void StopTxBeacon(_adapter *padapter) -{ - HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter); - - // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value - // which should be read from register to a global variable. - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6)); - pHalData->RegFwHwTxQCtrl &= (~BIT6); - rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0x64); - pHalData->RegReg542 &= ~(BIT0); - rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542); - } - else - { - pHalData->RegTxPause = rtw_read8(padapter, REG_TXPAUSE); - rtw_write8(padapter, REG_TXPAUSE, pHalData->RegTxPause | BIT6); - } - - //todo: CheckFwRsvdPageContent(Adapter); // 2010.06.23. Added by tynli. - -} - - -void SetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - -_func_enter_; - - switch(variable) - { - case HW_VAR_MEDIA_STATUS: - { - u8 val8; - - val8 = rtw_read8(Adapter, MSR)&0x0c; - val8 |= *((u8 *)val); - rtw_write8(Adapter, MSR, val8); - } - break; - case HW_VAR_MEDIA_STATUS1: - { - u8 val8; - - val8 = rtw_read8(Adapter, MSR)&0x03; - val8 |= *((u8 *)val) <<2; - rtw_write8(Adapter, MSR, val8); - } - break; - case HW_VAR_SET_OPMODE: - { - u8 val8; - u8 mode = *((u8 *)val); - - if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) - { - StopTxBeacon(Adapter); - rtw_write8(Adapter,REG_BCN_CTRL, 0x18); - } - else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/) - { - ResumeTxBeacon(Adapter); - rtw_write8(Adapter,REG_BCN_CTRL, 0x1a); - } - else if(mode == _HW_STATE_AP_) - { - ResumeTxBeacon(Adapter); - - rtw_write8(Adapter, REG_BCN_CTRL, 0x12); - - - //Set RCR - //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0 - rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0 - //enable to rx data frame - rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); - //enable to rx ps-poll - rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400); - - //Beacon Control related register for first time - rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms - rtw_write8(Adapter, REG_DRVERLYINT, 0x05);// 5ms - //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); - rtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms - rtw_write16(Adapter, REG_BCNTCFG, 0x00); - rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0x6404); - - //reset TSF - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); - - //enable TSF Function for if1 - rtw_write8(Adapter, REG_BCN_CTRL, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); - - //enable update TSF for if1 - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); - } - else - { - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); - } - - } - - val8 = rtw_read8(Adapter, MSR)&0x0c; - val8 |= mode; - rtw_write8(Adapter, MSR, val8); - } - break; - case HW_VAR_BSSID: - { - u8 idx = 0; - for(idx = 0 ; idx < 6; idx++) - { - rtw_write8(Adapter, (REG_BSSID+idx), val[idx]); - } - } - break; - case HW_VAR_BASIC_RATE: - { - u16 BrateCfg = 0; - u8 RateIndex = 0; - - // 2007.01.16, by Emily - // Select RRSR (in Legacy-OFDM and CCK) - // For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate. - // We do not use other rates. - rtl8192c_HalSetBrateCfg( Adapter, val, &BrateCfg ); - - //2011.03.30 add by Luke Lee - //CCK 2M ACK should be disabled for some BCM and Atheros AP IOT - //because CCK 2M has poor TXEVM - //CCK 5.5M & 11M ACK should be enabled for better performance - - pHalData->BasicRateSet = BrateCfg = (BrateCfg |0xd) & 0x15d; - - BrateCfg |= 0x01; // default enable 1M ACK rate - - //DBG_8192C("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg); - - // Set RRSR rate table. - rtw_write8(Adapter, REG_RRSR, BrateCfg&0xff); - rtw_write8(Adapter, REG_RRSR+1, (BrateCfg>>8)&0xff); - - // Set RTS initial rate - while(BrateCfg > 0x1) - { - BrateCfg = (BrateCfg>> 1); - RateIndex++; - } - // Ziv - Check - rtw_write8(Adapter, REG_INIRTS_RATE_SEL, RateIndex); - } - break; - case HW_VAR_TXPAUSE: - rtw_write8(Adapter, REG_TXPAUSE, *((u8 *)val)); - break; - case HW_VAR_BCN_FUNC: - if(*((u8 *)val)) - { - rtw_write8(Adapter, REG_BCN_CTRL, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); - } - else - { - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(EN_BCN_FUNCTION | EN_TXBCN_RPT))); - } - break; - case HW_VAR_CORRECT_TSF: - { - u64 tsf; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us - tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pHalData->RegTxPause |= STOP_BCNQ;BIT(6) - //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6))); - StopTxBeacon(Adapter); - } - - //disable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3))); - - rtw_write32(Adapter, REG_TSFTR, tsf); - rtw_write32(Adapter, REG_TSFTR+4, tsf>>32); - - //enable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3)); - - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pHalData->RegTxPause &= (~STOP_BCNQ); - //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6)))); - ResumeTxBeacon(Adapter); - } - } - break; - case HW_VAR_CHECK_BSSID: - if(*((u8 *)val)) - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); - } - else - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); - } - } - else - { - u32 val32; - - val32 = rtw_read32(Adapter, REG_RCR); - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - val32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN); - } - else - { - val32 &= 0xfffff7bf; - } - - rtw_write32(Adapter, REG_RCR, val32); - } - break; - case HW_VAR_MLME_DISCONNECT: - { - //Set RCR to not to receive data frame when NO LINK state - //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR) & ~RCR_ADF); - //reject all data frames - rtw_write16(Adapter, REG_RXFLTMAP2,0x00); - - //reset TSF - rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); - - //disable update TSF - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); - } - else - { - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); - } - } - break; - case HW_VAR_MLME_SITESURVEY: - if(*((u8 *)val))//under sitesurvey - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - //config RCR to receive different BSSID & not to receive data frame - //pHalData->ReceiveConfig &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); - u32 v = rtw_read32(Adapter, REG_RCR); - v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF - rtw_write32(Adapter, REG_RCR, v); - //reject all data frame - rtw_write16(Adapter, REG_RXFLTMAP2,0x00); - - //disable update TSF - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); - } - else - { - //config RCR to receive different BSSID & not to receive data frame - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) & 0xfffff7bf); - - - //disable update TSF - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); - } - } - else//sitesurvey done - { - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if ((is_client_associated_to_ap(Adapter) == _TRUE) || - ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) ) - { - //enable to rx data frame - //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); - rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); - - //enable update TSF - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); - } - else - { - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); - } - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_ADF); - - //enable update TSF - if(IS_NORMAL_CHIP(pHalData->VersionID)) - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); - else - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); - } - - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN); - else - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); - } - else - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); - } - } - break; - case HW_VAR_MLME_JOIN: - { - u8 RetryLimit = 0x30; - u8 type = *((u8 *)val); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - - if(type == 0) // prepare to join - { - //enable to rx data frame.Accept all data frame - //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); - rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); - - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); - } - else - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); - } - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; - } - else // Ad-hoc Mode - { - RetryLimit = 0x7; - } - } - else if(type == 1) //joinbss_event call back when join res < 0 - { - //if(IS_NORMAL_CHIP(pHalData->VersionID)) - //{ - //config RCR to receive different BSSID & not to receive data frame during linking - // u32 v = rtw_read32(Adapter, REG_RCR); - // v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF - // rtw_write32(Adapter, REG_RCR, v); - //} - //else - //{ - //config RCR to receive different BSSID & not to receive data frame during linking - // rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) & 0xfffff7bf); - //} - - rtw_write16(Adapter, REG_RXFLTMAP2,0x00); - } - else if(type == 2) //sta add event call back - { - if(IS_NORMAL_CHIP(pHalData->VersionID)) - { - //enable update TSF - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); - } - else - { - //enable update TSF - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); - } - - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) - { - //fixed beacon issue for 8191su........... - rtw_write8(Adapter,0x542 ,0x02); - RetryLimit = 0x7; - } - } - - rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT); - } - break; - case HW_VAR_BEACON_INTERVAL: - rtw_write16(Adapter, REG_BCN_INTERVAL, *((u16 *)val)); - break; - case HW_VAR_SLOT_TIME: - { - u8 u1bAIFS, aSifsTime; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - rtw_write8(Adapter, REG_SLOT, val[0]); - - if(pmlmeinfo->WMM_enable == 0) - { - if( pmlmeext->cur_wireless_mode == WIRELESS_11B) - aSifsTime = 10; - else - aSifsTime = 16; - - u1bAIFS = aSifsTime + (2 * pmlmeinfo->slotTime); - - // Temporary removed, 2008.06.20. - rtw_write8(Adapter, REG_EDCA_VO_PARAM, u1bAIFS); - rtw_write8(Adapter, REG_EDCA_VI_PARAM, u1bAIFS); - rtw_write8(Adapter, REG_EDCA_BE_PARAM, u1bAIFS); - rtw_write8(Adapter, REG_EDCA_BK_PARAM, u1bAIFS); - } - } - break; - case HW_VAR_SIFS: - { - // SIFS for OFDM Data ACK - rtw_write8(Adapter, REG_SIFS_CTX+1, val[0]); - // SIFS for OFDM consecutive tx like CTS data! - rtw_write8(Adapter, REG_SIFS_TRX+1, val[1]); - - rtw_write8(Adapter,REG_SPEC_SIFS+1, val[0]); - rtw_write8(Adapter,REG_MAC_SPEC_SIFS+1, val[0]); - - // 20100719 Joseph: Revise SIFS setting due to Hardware register definition change. - rtw_write8(Adapter, REG_R2T_SIFS+1, val[0]); - rtw_write8(Adapter, REG_T2T_SIFS+1, val[0]); - } - break; - case HW_VAR_ACK_PREAMBLE: - { - u8 regTmp; - u8 bShortPreamble = *( (PBOOLEAN)val ); - // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) - //regTmp = (pHalData->nCur40MhzPrimeSC)<<5; - regTmp = 0; - if(bShortPreamble) - regTmp |= 0x80; - - rtw_write8(Adapter, REG_RRSR+2, regTmp); - } - break; - case HW_VAR_SEC_CFG: - rtw_write8(Adapter, REG_SECCFG, *((u8 *)val)); - break; - case HW_VAR_DM_FLAG: - pdmpriv->DMFlag = *((u8 *)val); - break; - case HW_VAR_DM_FUNC_OP: - if(val[0]) - {// save dm flag - pdmpriv->DMFlag_tmp = pdmpriv->DMFlag; - } - else - {// restore dm flag - pdmpriv->DMFlag = pdmpriv->DMFlag_tmp; - } - break; - case HW_VAR_DM_FUNC_SET: - pdmpriv->DMFlag |= *((u8 *)val); - break; - case HW_VAR_DM_FUNC_CLR: - pdmpriv->DMFlag &= *((u8 *)val); - break; - case HW_VAR_CAM_EMPTY_ENTRY: - { - u8 ucIndex = *((u8 *)val); - u8 i; - u32 ulCommand=0; - u32 ulContent=0; - u32 ulEncAlgo=CAM_AES; - - for(i=0;iAcParam_BE = ((u32 *)(val))[0]; - rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]); - break; - case HW_VAR_AC_PARAM_BK: - rtw_write32(Adapter, REG_EDCA_BK_PARAM, ((u32 *)(val))[0]); - break; - case HW_VAR_AMPDU_MIN_SPACE: - { - u8 MinSpacingToSet; - u8 SecMinSpace; - - MinSpacingToSet = *((u8 *)val); - if(MinSpacingToSet <= 7) - { - switch(Adapter->securitypriv.dot11PrivacyAlgrthm) - { - case _NO_PRIVACY_: - case _AES_: - SecMinSpace = 0; - break; - - case _WEP40_: - case _WEP104_: - case _TKIP_: - case _TKIP_WTMIC_: - SecMinSpace = 6; - break; - default: - SecMinSpace = 7; - break; - } - - if(MinSpacingToSet < SecMinSpace){ - MinSpacingToSet = SecMinSpace; - } - - //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", Adapter->MgntInfo.MinSpaceCfg)); - rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet); - } - } - break; - case HW_VAR_AMPDU_FACTOR: - { - u8 RegToSet_Normal[4]={0x41,0xa8,0x72, 0xb9}; - u8 RegToSet_BT[4]={0x31,0x74,0x42, 0x97}; - u8 FactorToSet; - u8 *pRegToSet; - u8 index = 0; - -#ifdef CONFIG_BT_COEXIST - if( (pHalData->bt_coexist.BT_Coexist) && - (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) ) - pRegToSet = RegToSet_BT; // 0x97427431; - else -#endif - pRegToSet = RegToSet_Normal; // 0xb972a841; - - FactorToSet = *((u8 *)val); - if(FactorToSet <= 3) - { - FactorToSet = (1<<(FactorToSet + 2)); - if(FactorToSet>0xf) - FactorToSet = 0xf; - - for(index=0; index<4; index++) - { - if((pRegToSet[index] & 0xf0) > (FactorToSet<<4)) - pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet<<4); - - if((pRegToSet[index] & 0x0f) > FactorToSet) - pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet); - - rtw_write8(Adapter, (REG_AGGLEN_LMT+index), pRegToSet[index]); - } - - //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_FACTOR: %#x\n", FactorToSet)); - } - } - break; - case HW_VAR_RXDMA_AGG_PG_TH: - rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, *((u8 *)val)); - break; - case HW_VAR_SET_RPWM: - rtw_write8(Adapter, REG_USB_HRPWM, *((u8 *)val)); - break; - case HW_VAR_H2C_FW_PWRMODE: - { - u8 psmode = (*(u8 *)val); - - // Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power - // saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang. - if( (psmode != PS_MODE_ACTIVE) && (!IS_92C_SERIAL(pHalData->VersionID))) - { - rtl8192c_dm_RF_Saving(Adapter, _TRUE); - } - rtl8192c_set_FwPwrMode_cmd(Adapter, psmode); - } - break; - case HW_VAR_H2C_FW_JOINBSSRPT: - { - u8 mstatus = (*(u8 *)val); - rtl8192c_set_FwJoinBssReport_cmd(Adapter, mstatus); - } - break; -#ifdef CONFIG_P2P - case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: - { - u8 p2p_ps_state = (*(u8 *)val); - rtl8192c_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state); - } - break; -#endif //CONFIG_P2P - case HW_VAR_INITIAL_GAIN: - PHY_SetBBReg(Adapter, rOFDM0_XAAGCCore1, 0x7f, ((u32 *)(val))[0]); - PHY_SetBBReg(Adapter, rOFDM0_XBAGCCore1, 0x7f, ((u32 *)(val))[0]); - break; - case HW_VAR_TRIGGER_GPIO_0: - rtl8192cu_trigger_gpio_0(Adapter); - break; -#ifdef CONFIG_BT_COEXIST - case HW_VAR_BT_SET_COEXIST: - { - u8 bStart = (*(u8 *)val); - rtl8192c_set_dm_bt_coexist(Adapter, bStart); - } - break; - case HW_VAR_BT_ISSUE_DELBA: - { - u8 dir = (*(u8 *)val); - rtl8192c_issue_delete_ba(Adapter, dir); - } - break; -#endif -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - - case HW_VAR_ANTENNA_DIVERSITY_LINK: - SwAntDivRestAfterLink8192C(Adapter); - break; - case HW_VAR_ANTENNA_DIVERSITY_SELECT: - { - u8 Optimum_antenna = (*(u8 *)val); - //switch antenna to Optimum_antenna - // DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); - if(pHalData->CurAntenna != Optimum_antenna) - { - PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, Optimum_antenna); - pHalData->CurAntenna = Optimum_antenna ; - //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); - } - } - break; -#endif - case HW_VAR_EFUSE_BYTES: // To set EFUE total used bytes, added by Roger, 2008.12.22. - pHalData->EfuseUsedBytes = *((u16 *)val); - break; - case HW_VAR_FIFO_CLEARN_UP: - { - #define RW_RELEASE_EN BIT18 - #define RXDMA_IDLE BIT17 - - struct pwrctrl_priv *pwrpriv = &Adapter->pwrctrlpriv; - u8 trycnt = 100; - - //pause tx - rtw_write8(Adapter,REG_TXPAUSE,0xff); - - //keep sn - Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter,REG_NQOS_SEQ); - - if(pwrpriv->bkeepfwalive != _TRUE) - { - //RX DMA stop - rtw_write32(Adapter,REG_RXPKT_NUM,(rtw_read32(Adapter,REG_RXPKT_NUM)|RW_RELEASE_EN)); - do{ - if(!(rtw_read32(Adapter,REG_RXPKT_NUM)&RXDMA_IDLE)) - break; - }while(trycnt--); - if(trycnt ==0) - DBG_8192C("Stop RX DMA failed...... \n"); - - //RQPN Load 0 - rtw_write16(Adapter,REG_RQPN_NPQ,0x0); - rtw_write32(Adapter,REG_RQPN,0x80000000); - rtw_mdelay_os(10); - } - } - break; - default: - break; - } - -_func_exit_; -} - -void GetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - -_func_enter_; - - switch(variable) - { - case HW_VAR_BASIC_RATE: - *((u16 *)(val)) = pHalData->BasicRateSet; - case HW_VAR_TXPAUSE: - val[0] = rtw_read8(Adapter, REG_TXPAUSE); - break; - case HW_VAR_TX_BCN_DONE: - { - u32 xmitbcnDown; - xmitbcnDown= rtw_read32(Adapter, REG_TDECTRL); - if(xmitbcnDown & BCN_VALID ){ - rtw_write32(Adapter,REG_TDECTRL, xmitbcnDown | BCN_VALID ); // write 1 to clear, Clear by sw - val[0] = _TRUE; - } - } - break; - case HW_VAR_DM_FLAG: - val[0] = pHalData->dmpriv.DMFlag; - break; - case HW_VAR_RF_TYPE: - val[0] = pHalData->rf_type; - break; - case HW_VAR_FWLPS_RF_ON: - { - //When we halt NIC, we should check if FW LPS is leave. - u32 valRCR; - - if(Adapter->pwrctrlpriv.rf_pwrstate == rf_off) - { - // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, - // because Fw is unload. - val[0] = _TRUE; - } - else - { - valRCR = rtw_read32(Adapter, REG_RCR); - valRCR &= 0x00070000; - if(valRCR) - val[0] = _FALSE; - else - val[0] = _TRUE; - } - } - break; -#ifdef CONFIG_ANTENNA_DIVERSITY - case HW_VAR_CURRENT_ANTENNA: - val[0] = pHalData->CurAntenna; - break; -#endif - case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22. - *((u16 *)(val)) = pHalData->EfuseUsedBytes; - break; - default: - break; - } - -_func_exit_; -} - -// -// Description: -// Query setting of specified variable. -// -u8 -GetHalDefVar8192CUsb( - IN PADAPTER Adapter, - IN HAL_DEF_VARIABLE eVariable, - IN PVOID pValue - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 bResult = _TRUE; - - switch(eVariable) - { - case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB: - *((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB; - break; - case HAL_DEF_IS_SUPPORT_ANT_DIV: - #ifdef CONFIG_ANTENNA_DIVERSITY - *((u8 *)pValue) = (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))?_FALSE:_TRUE; - #endif - break; - case HAL_DEF_CURRENT_ANTENNA: - #ifdef CONFIG_ANTENNA_DIVERSITY - *(( u8*)pValue) = pHalData->CurAntenna; - #endif - break; - case HAL_DEF_DRVINFO_SZ: - *(( u32*)pValue) = DRVINFO_SZ; - break; - case HAL_DEF_MAX_RECVBUF_SZ: - *(( u32*)pValue) = MAX_RECVBUF_SZ; - break; - case HAL_DEF_RX_PACKET_OFFSET: - *(( u32*)pValue) = RXDESC_SIZE + DRVINFO_SZ; - break; - case HAL_DEF_DBG_DUMP_RXPKT: - *(( u8*)pValue) = pHalData->bDumpRxPkt; - break; - case HAL_DEF_DBG_DM_FUNC: - *(( u8*)pValue) = pHalData->dmpriv.DMFlag; - break; - default: - //RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8192CUsb(): Unkown variable: %d!\n", eVariable)); - bResult = _FALSE; - break; - } - - return bResult; -} - - - - -// -// Description: -// Change default setting of specified variable. -// -u8 -SetHalDefVar8192CUsb( - IN PADAPTER Adapter, - IN HAL_DEF_VARIABLE eVariable, - IN PVOID pValue - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 bResult = _TRUE; - - switch(eVariable) - { - case HAL_DEF_DBG_DUMP_RXPKT: - pHalData->bDumpRxPkt = *(( u8*)pValue); - break; - case HAL_DEF_DBG_DM_FUNC: - { - u8 dm_func = *(( u8*)pValue); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - - if(dm_func == 0){ //disable all dynamic func - pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; - DBG_8192C("==> Disable all dynamic function...\n"); - } - else if(dm_func == 1){//disable DIG - pdmpriv->DMFlag &= (~DYNAMIC_FUNC_DIG); - DBG_8192C("==> Disable DIG...\n"); - } - else if(dm_func == 2){//disable High power - pdmpriv->DMFlag &= (~DYNAMIC_FUNC_HP); - } - else if(dm_func == 3){//disable tx power tracking - pdmpriv->DMFlag &= (~DYNAMIC_FUNC_SS); - DBG_8192C("==> Disable tx power tracking...\n"); - } - else if(dm_func == 4){//disable BT coexistence - pdmpriv->DMFlag &= (~DYNAMIC_FUNC_BT); - } - else if(dm_func == 5){//disable antenna diversity - pdmpriv->DMFlag &= (~DYNAMIC_FUNC_ANT_DIV); - } - else if(dm_func == 6){//turn on all dynamic func - if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG)) - { - struct dm_priv *pdmpriv = &pHalData->dmpriv; - DIG_T *pDigTable = &pdmpriv->DM_DigTable; - pDigTable->PreIGValue = rtw_read8(Adapter,0xc50); - } - - pdmpriv->DMFlag |= (DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS| - DYNAMIC_FUNC_BT|DYNAMIC_FUNC_ANT_DIV) ; - DBG_8192C("==> Turn on all dynamic function...\n"); - } - } - break; - default: - //RT_TRACE(COMP_INIT, DBG_TRACE, ("SetHalDefVar819xUsb(): Unkown variable: %d!\n", eVariable)); - bResult = _FALSE; - break; - } - - return bResult; -} - -u32 _update_92cu_basic_rate(_adapter *padapter, unsigned int mask) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); -#endif - unsigned int BrateCfg = 0; - -#ifdef CONFIG_BT_COEXIST - if( (pbtpriv->BT_Coexist) && (pbtpriv->BT_CoexistType == BT_CSR_BC4) ) - { - BrateCfg = mask & 0x151; - //DBG_8192C("BT temp disable cck 2/5.5/11M, (0x%x = 0x%x)\n", REG_RRSR, BrateCfg & 0x151); - } - else -#endif - { - if(pHalData->VersionID != VERSION_TEST_CHIP_88C) - BrateCfg = mask & 0x15F; - else //for 88CU 46PING setting, Disable CCK 2M, 5.5M, Others must tuning - BrateCfg = mask & 0x159; - } - - BrateCfg |= 0x01; // default enable 1M ACK rate - - return BrateCfg; -} - -void _update_response_rate(_adapter *padapter,unsigned int mask) -{ - u8 RateIndex = 0; - // Set RRSR rate table. - rtw_write8(padapter, REG_RRSR, mask&0xff); - rtw_write8(padapter,REG_RRSR+1, (mask>>8)&0xff); - - // Set RTS initial rate - while(mask > 0x1) - { - mask = (mask>> 1); - RateIndex++; - } - rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex); -} - -void UpdateHalRAMask8192CUsb(PADAPTER padapter, u32 mac_id) -{ - //volatile unsigned int result; - u8 init_rate=0; - u8 networkType, raid; - u32 mask; - u8 shortGIrate = _FALSE; - int supportRateNum = 0; - struct sta_info *psta; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dm_priv *pdmpriv = &pHalData->dmpriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); -#endif - - if (mac_id >= NUM_STA) //CAM_SIZE - { - return; - } - - psta = pmlmeinfo->FW_sta_info[mac_id].psta; - if(psta == NULL) - { - return; - } - - switch (mac_id) - { - case 0:// for infra mode - supportRateNum = rtw_get_rateset_len(cur_network->SupportedRates); - networkType = judge_network_type(padapter, cur_network->SupportedRates, supportRateNum) & 0xf; - //pmlmeext->cur_wireless_mode = networkType; - raid = networktype_to_raid(networkType); - - mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); - mask |= (pmlmeinfo->HT_enable)? update_MSC_rate(&(pmlmeinfo->HT_caps)): 0; - mask |= ((raid<<28)&0xf0000000); - - if (support_short_GI(padapter, &(pmlmeinfo->HT_caps))) - { - shortGIrate = _TRUE; - } - - break; - - case 1://for broadcast/multicast - supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); - if(pmlmeext->cur_wireless_mode & WIRELESS_11B) - networkType = WIRELESS_11B; - else - networkType = WIRELESS_11G; - raid = networktype_to_raid(networkType); - - mask = update_basic_rate(cur_network->SupportedRates, supportRateNum); - mask |= ((raid<<28)&0xf0000000); - - break; - - default: //for each sta in IBSS - supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); - networkType = judge_network_type(padapter, pmlmeinfo->FW_sta_info[mac_id].SupportedRates, supportRateNum) & 0xf; - //pmlmeext->cur_wireless_mode = networkType; - raid = networktype_to_raid(networkType); - - mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); - mask |= ((raid<<28)&0xf0000000); - - //todo: support HT in IBSS - - break; - } - -#ifdef CONFIG_BT_COEXIST - if( (pbtpriv->BT_Coexist) && - (pbtpriv->BT_CoexistType == BT_CSR_BC4) && - (pbtpriv->BT_CUR_State) && - (pbtpriv->BT_Ant_isolation) && - ((pbtpriv->BT_Service==BT_SCO)|| - (pbtpriv->BT_Service==BT_Busy)) ) - mask &= 0xffffcfc0; - else -#endif - mask &=0xffffffff; - - - init_rate = get_highest_rate_idx(mask)&0x3f; - - if(pHalData->fw_ractrl == _TRUE) - { - u8 arg = 0; - - //arg = (cam_idx-4)&0x1f;//MACID - arg = mac_id&0x1f;//MACID - - arg |= BIT(7); - - if (shortGIrate==_TRUE) - arg |= BIT(5); - - //DBG_871X("update raid entry, mask=0x%x, arg=0x%x\n", mask, arg); - - rtl8192c_set_raid_cmd(padapter, mask, arg); - - } - else - { - if (shortGIrate==_TRUE) - init_rate |= BIT(6); - - rtw_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id), init_rate); - } - - - //set ra_id - psta->raid = raid; - psta->init_rate = init_rate; - - //set correct initial date rate for each mac_id - pdmpriv->INIDATA_RATE[mac_id] = init_rate; -} - -void SetBeaconRelatedRegisters8192CUsb(PADAPTER padapter) -{ - u32 value32; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //reset TSF, enable update TSF, correcting TSF On Beacon - - //REG_BCN_INTERVAL - //REG_BCNDMATIM - //REG_ATIMWND - //REG_TBTT_PROHIBIT - //REG_DRVERLYINT - //REG_BCN_MAX_ERR - //REG_BCNTCFG //(0x510) - //REG_DUAL_TSF_RST - //REG_BCN_CTRL //(0x550) - - //BCN interval - rtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval); - rtw_write8(padapter, REG_ATIMWND, 0x02);// 2ms - - _InitBeaconParameters(padapter); - - rtw_write8(padapter, REG_SLOT, 0x09); - - value32 =rtw_read32(padapter, REG_TCR); - value32 &= ~TSFRST; - rtw_write32(padapter, REG_TCR, value32); - - value32 |= TSFRST; - rtw_write32(padapter, REG_TCR, value32); - - // NOTE: Fix test chip's bug (about contention windows's randomness) - rtw_write8(padapter, REG_RXTSF_OFFSET_CCK, 0x50); - rtw_write8(padapter, REG_RXTSF_OFFSET_OFDM, 0x50); - - _BeaconFunctionEnable(padapter, _TRUE, _TRUE); - - ResumeTxBeacon(padapter); - - //rtw_write8(padapter, 0x422, rtw_read8(padapter, 0x422)|BIT(6)); - - //rtw_write8(padapter, 0x541, 0xff); - - //rtw_write8(padapter, 0x542, rtw_read8(padapter, 0x541)|BIT(0)); - - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(1)); - -} - -static void rtl8192cu_init_default_value(_adapter * padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - struct dm_priv *pdmpriv = &pHalData->dmpriv; - u8 i; - - //init default value - pHalData->fw_ractrl = _FALSE; - pHalData->bIQKInitialized = _FALSE; - if(!pwrctrlpriv->bkeepfwalive) - pHalData->LastHMEBoxNum = 0; - - pHalData->bIQKInitialized = _FALSE; - //init dm default value - pdmpriv->TM_Trigger = 0; - pdmpriv->binitialized = _FALSE; - pdmpriv->prv_traffic_idx = 3; - pdmpriv->initialize = 0; - - pdmpriv->ThermalValue_HP_index = 0; - for(i = 0; i < HP_THERMAL_NUM; i++) - pdmpriv->ThermalValue_HP[i] = 0; -} -static u8 rtl8192cu_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val) -{ - u8 bResult = _TRUE; - switch(efunc_id){ - - #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) - case HAL_USB_SELECT_SUSPEND: - { - u8 bfwpoll = *(( u8*)val); - rtl8192c_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect - } - break; - #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED - - default: - break; - } - return bResult; -} -void rtl8192cu_set_hal_ops(_adapter * padapter) -{ - struct hal_ops *pHalFunc = &padapter->HalFunc; - -_func_enter_; - - padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE)); - if(padapter->HalData == NULL){ - DBG_8192C("cant not alloc memory for HAL DATA \n"); - } - //_rtw_memset(padapter->HalData, 0, sizeof(HAL_DATA_TYPE)); - - pHalFunc->hal_init = &rtl8192cu_hal_init; - pHalFunc->hal_deinit = &rtl8192cu_hal_deinit; - - //pHalFunc->free_hal_data = &rtl8192c_free_hal_data; - - pHalFunc->inirp_init = &rtl8192cu_inirp_init; - pHalFunc->inirp_deinit = &rtl8192cu_inirp_deinit; - - pHalFunc->init_xmit_priv = &rtl8192cu_init_xmit_priv; - pHalFunc->free_xmit_priv = &rtl8192cu_free_xmit_priv; - - pHalFunc->init_recv_priv = &rtl8192cu_init_recv_priv; - pHalFunc->free_recv_priv = &rtl8192cu_free_recv_priv; -#ifdef CONFIG_SW_LED - pHalFunc->InitSwLeds = &rtl8192cu_InitSwLeds; - pHalFunc->DeInitSwLeds = &rtl8192cu_DeInitSwLeds; -#else //case of hw led or no led - pHalFunc->InitSwLeds = NULL; - pHalFunc->DeInitSwLeds = NULL; -#endif//CONFIG_SW_LED - - //pHalFunc->dm_init = &rtl8192c_init_dm_priv; - //pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv; - - pHalFunc->init_default_value = &rtl8192cu_init_default_value; - pHalFunc->intf_chip_configure = &rtl8192cu_interface_configure; - pHalFunc->read_adapter_info = &ReadAdapterInfo8192CU; - - //pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C; - //pHalFunc->set_channel_handler = &PHY_SwChnl8192C; - - //pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog; - - pHalFunc->SetHwRegHandler = &SetHwReg8192CU; - pHalFunc->GetHwRegHandler = &GetHwReg8192CU; - pHalFunc->GetHalDefVarHandler = &GetHalDefVar8192CUsb; - pHalFunc->SetHalDefVarHandler = &SetHalDefVar8192CUsb; - - pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8192CUsb; - pHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8192CUsb; - - //pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid; - -//#ifdef CONFIG_SW_ANTENNA_DIVERSITY - //pHalFunc->SwAntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C; - //pHalFunc->SwAntDivCompareHandler = &SwAntDivCompare8192C; -//#endif - - pHalFunc->hal_xmit = &rtl8192cu_hal_xmit; - pHalFunc->mgnt_xmit = &rtl8192cu_mgnt_xmit; - - //pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg; - //pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg; - //pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg; - //pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg; - -#ifdef CONFIG_HOSTAPD_MLME - pHalFunc->hostap_mgnt_xmit_entry = &rtl8192cu_hostap_mgnt_xmit_entry; -#endif - pHalFunc->interface_ps_func = &rtl8192cu_ps_func; - - rtl8192c_set_hal_ops(pHalFunc); -_func_exit_; - -} - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c deleted file mode 100755 index 4d01b3cd38ca..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c +++ /dev/null @@ -1,1208 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _HCI_OPS_OS_C_ - -#include -#include -#include -#include - -#ifndef PLATFORM_OS_CE - #error "PLATFORM_OS_CE shall be set \n" -#endif - -#ifndef CONFIG_USB_HCI - #error "CONFIG_USB_HCI shall be on!\n" -#endif - -#include -#include - -#include - - -struct zero_bulkout_context -{ - void *pbuf; - void *purb; - void *pirp; - void *padapter; -}; - - - -#define PUSB_ERROR LPDWORD -#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) - - -USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr); - - -static NTSTATUS usb_async_interrupt_in_complete( LPVOID Context ); -static NTSTATUS usb_async_interrupt_out_complete( LPVOID Context ); - -DWORD usb_write_port_complete( LPVOID Context ); -DWORD usb_read_port_complete( LPVOID Context ); - -void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ -_func_enter_; - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); -_func_exit_; -} - - - -BOOL -CloseTransferHandle( - LPCUSB_FUNCS pUsbFuncs, - USB_TRANSFER hTransfer - ) -{ - BOOL bRc = TRUE; - - // This assert may fail on suprise remove, - // but should pass during normal I/O. - // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) ); - - // CloseTransfer aborts any pending transfers - if ( !pUsbFuncs->lpCloseTransfer(hTransfer) ) { - - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError())); - bRc = FALSE; - } - - return bRc; -} - - -BOOL -GetTransferStatus( - LPCUSB_FUNCS pUsbFuncs, - USB_TRANSFER hTransfer, - LPDWORD pBytesTransferred , // OPTIONAL returns number of bytes transferred - PUSB_ERROR pUsbError // returns USB error code - ) -{ - - BOOL bRc = TRUE; - - if ( pUsbFuncs->lpGetTransferStatus(hTransfer, pBytesTransferred, pUsbError) ) { - if ( USB_NO_ERROR != *pUsbError ) { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError())); - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("GetTransferStatus (BytesTransferred:%d, UsbError:0x%x)\n", pBytesTransferred?*pBytesTransferred:-1, pUsbError?*pUsbError:-1 )); - } - } else { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_,("*** GetTransferStatus ERROR:%d ***\n", GetLastError())); - *pUsbError = USB_CANCELED_ERROR; - bRc = FALSE; - } - - return bRc; -} - - -// The driver should never read RxCmd register. We have to set -// RCR CMDHAT0 (bit6) to append Rx status before the Rx frame. -// -// |<-------- pBulkUrb->TransferBufferLength ------------>| -// +------------------+-------------------+------------+ -// | Rx status (16 bytes) | Rx frame ..... | CRC(4 bytes) | -// +------------------+-------------------+------------+ -// ^ -// ^pRfd->Buffer.VirtualAddress -// -/*! \brief USB RX IRP Complete Routine. - @param Context pointer of RT_RFD -*/ -u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - struct intf_priv *pintfpriv = pintfhdl->pintfpriv; - struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; - _adapter *adapter = (_adapter *)pdvobj_priv->padapter; - - struct recv_priv *precvpriv = &adapter->recvpriv; - - struct recv_buf *precvbuf = (struct recv_buf *)rmem; - DWORD dwErr = ERROR_SUCCESS ; - DWORD dwBytesTransferred = 0 ; - USB_TRANSFER hTransfer = NULL; - USB_PIPE hPipe; - LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; - -_func_enter_; - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__)); - -#if (CONFIG_PWRCTRL == 1) - if (adapter->pwrctrlpriv.pnp_bstop_trx) - { - return _FALSE; - } -#endif - - if(adapter->bDriverStopped || adapter->bSurpriseRemoved) - { - RT_TRACE(_module_hci_ops_os_c_, _drv_info_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved)!!!\n")); - return _FALSE; - } - - if(precvbuf !=NULL) - { - - // get a recv buffer - rtl8192cu_init_recvbuf(adapter, precvbuf); - - - - _rtw_spinlock(&precvpriv->lock); - precvpriv->rx_pending_cnt++; - precvbuf->irp_pending = _TRUE; - _rtw_spinunlock(&precvpriv->lock); - - - //translate DMA FIFO addr to pipehandle - hPipe = ffaddr2pipehdl(pdvobj_priv, addr); - - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__)); - - precvbuf->usb_transfer_read_port = (*usb_funcs_vp->lpIssueBulkTransfer)( - hPipe, - usb_read_port_complete, - precvbuf, - USB_IN_TRANSFER|USB_SHORT_TRANSFER_OK, - MAX_RECVBUF_SZ, - precvbuf->pbuf, - 0); - - - if(precvbuf->usb_transfer_read_port) - { - - // GetTransferStatus(usb_funcs_vp, hTransfer, &dwBytesTransferred,&UsbRc); - - // CloseTransferHandle(usb_funcs_vp, hTransfer); - - } - else - { - - dwErr = GetLastError(); - //RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr)); - - } - -// if ( USB_NO_ERROR != UsbRc && ERROR_SUCCESS == dwErr) { -// dwErr = ERROR_GEN_FAILURE; -// } - - - if ( ERROR_SUCCESS != dwErr ) { - - SetLastError(dwErr); - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr)); - } - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port(%u)\n", __LINE__)); - - } - else // if(precvbuf !=NULL) - { - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n")); - } - - return _TRUE; - -} - -DWORD usb_read_port_complete( PVOID context ) -{ - struct recv_buf *precvbuf = (struct recv_buf *)context; - _adapter *adapter = (_adapter *)precvbuf->adapter; - struct recv_priv *precvpriv = &adapter->recvpriv; - - - struct intf_hdl *pintfhdl = &adapter->pio_queue->intf; - struct intf_priv *pintfpriv = pintfhdl->pintfpriv; - struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; - - - LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; - - DWORD dwBytesTransferred = 0; - DWORD dwErr = USB_CANCELED_ERROR; - - uint isevt, *pbuf; - int fComplete =_FALSE; - - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_complete(%u)\n", __LINE__)); - -_func_enter_; - - - _rtw_spinlock_ex(&precvpriv->lock); - precvbuf->irp_pending=_FALSE; - precvpriv->rx_pending_cnt --; - _rtw_spinunlock_ex(&precvpriv->lock); - - -#if 1 - - (*usb_funcs_vp->lpGetTransferStatus)(precvbuf->usb_transfer_read_port, &dwBytesTransferred, &dwErr); - fComplete = (*usb_funcs_vp->lpIsTransferComplete)(precvbuf->usb_transfer_read_port); - if(fComplete!=_TRUE) - { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete CloseTransfer before complete\n")); - } - (*usb_funcs_vp->lpCloseTransfer)(precvbuf->usb_transfer_read_port); - - -#endif - - - if(USB_NO_ERROR != dwErr) - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete Fail :%d\n",dwErr)); - - { - - if ( dwBytesTransferred > MAX_RECVBUF_SZ || dwBytesTransferred < RXDESC_SIZE ) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_, - ("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE): %d\n",dwBytesTransferred)); - rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - - //usb_read_port(pintfhdl, 0, 0, (unsigned char *)precvframe); - } - else - { - precvbuf->transfer_len = dwBytesTransferred; - - pbuf = (uint*)precvbuf->pbuf; - - if((isevt = *(pbuf+1)&0x1ff) == 0x1ff) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_info_, - ("\n usb_read_port_complete: get a event\n")); - rxcmd_event_hdl(adapter, pbuf);//rx c2h events - - rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - else - { - if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets - { - //precvbuf->reuse = _TRUE; - rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - } - } - } - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port_complete(%u)\n", __LINE__)); - -_func_exit_; - return ERROR_SUCCESS; -// return STATUS_MORE_PROCESSING_REQUIRED; -} - -void usb_read_port_cancel(_adapter *padapter){ - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_cancel(%u)\n",__FUNCTION__, __LINE__)); -} - -DWORD usb_write_mem_complete( LPVOID Context ) -{ - int fComplete =_FALSE; - DWORD dwBytes = 0; - DWORD dwErr = USB_CANCELED_ERROR; - - _irqL irqL; - _list *head; - _list *plist; - struct io_req *pio_req; - struct io_queue *pio_q = (struct io_queue *) Context; - struct intf_hdl *pintf = &(pio_q->intf); - struct intf_priv *pintfpriv = pintf->pintfpriv; - _adapter *padapter = (_adapter *)pintf->adapter; - NTSTATUS status = STATUS_SUCCESS; - struct xmit_priv * pxmitpriv = &padapter->xmitpriv; - - struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; - - USB_HANDLE usbHandle = pdvobj_priv->usb_extension._hDevice; - LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; - - // get the head from the processing io_queue - head = &(pio_q->processing); - -_func_enter_; - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_mem_complete %p\n", Context)); - -#if 1 - _enter_critical_bh(&(pio_q->lock), &irqL); - - - //free irp in processing list... - while(rtw_is_list_empty(head) != _TRUE) - { - plist = get_next(head); - rtw_list_delete(plist); - pio_req = LIST_CONTAINOR(plist, struct io_req, list); - _rtw_up_sema(&pio_req->sema); - } - - _exit_critical_bh(&(pio_q->lock), &irqL); -#endif - - -#if 1 - - (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr); - fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem); - if(fComplete!=_TRUE) - { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem_complete CloseTransfer before complete\n")); - } - (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem ); - -#endif - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem_complete\n")); - -_func_exit_; - - - return STATUS_MORE_PROCESSING_REQUIRED; - -} - - -void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - - NTSTATUS NtStatus = STATUS_SUCCESS; - USB_PIPE hPipe; - _irqL irqL; - - int fComplete = _FALSE; - DWORD dwBytes = 0; - DWORD dwErr = USB_CANCELED_ERROR; - - - struct io_req *pio_req; - - _adapter *adapter = (_adapter *)pintfhdl->adapter; - struct intf_priv *pintfpriv = pintfhdl->pintfpriv; - struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; - - - struct xmit_priv *pxmitpriv = &adapter->xmitpriv; - struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - - LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; - - -_func_enter_; - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_mem(%u) pintfhdl %p wmem %p\n", __LINE__, pintfhdl, wmem)); - - // fetch a io_request from the io_queue - pio_req = alloc_ioreq(pio_queue); - - if ((pio_req == NULL)||(adapter->bSurpriseRemoved)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved )); - goto exit; - } - - _enter_critical_bh(&(pio_queue->lock), &irqL); - - - // insert the io_request into processing io_queue - rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing)); - - - if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); - goto exit; - } - - //translate DMA FIFO addr to pipehandle - hPipe = ffaddr2pipehdl(pdvobj_priv, addr); - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_,("usb_write_mem(%u)\n",__LINE__)); - - pio_req->usb_transfer_write_mem = (*usb_funcs_vp->lpIssueBulkTransfer)( - hPipe, - usb_write_mem_complete, - pio_queue, - USB_OUT_TRANSFER, - cnt, - wmem, - 0); - -#if 0 - - (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr); - - while( fComplete != _TRUE) - { - fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem); - if(fComplete==_TRUE) - { - (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem ); - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem finished\n")); - break; - } - else - { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, - ("usb_write_mem not yet finished %X\n", - pio_req->usb_transfer_write_mem)); - rtw_msleep_os(10); - } - - } - -#endif - - -// _rtw_down_sema(&pio_req->sema); - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem(%X)\n",pio_req->usb_transfer_write_mem)); - - _exit_critical_bh(&(pio_queue->lock), &irqL); - - _rtw_down_sema(&pio_req->sema); - free_ioreq(pio_req, pio_queue); - -exit: -_func_exit_; - return; -} - -u32 usb_write_cnt=0; -u32 usb_complete_cnt=0; - -USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr) -{ - USB_PIPE PipeHandle = NULL; - _adapter *padapter = pNdisCEDvice->padapter; - - - if(pNdisCEDvice->nr_endpoint == 11) - { - switch(addr) - { - case RTL8712_DMA_BEQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[3] ; - break; - case RTL8712_DMA_BKQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[4]; - break; - case RTL8712_DMA_VIQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[2]; - break; - case RTL8712_DMA_VOQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[1]; - break; - case RTL8712_DMA_BCNQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[6]; - break; - case RTL8712_DMA_BMCQ: //HI Queue - PipeHandle= padapter->halpriv.pipehdls_r8712[7]; - break; - case RTL8712_DMA_MGTQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[8]; - break; - case RTL8712_DMA_RX0FF: - PipeHandle= padapter->halpriv.pipehdls_r8712[0]; - break; - case RTL8712_DMA_C2HCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[5]; - break; - case RTL8712_DMA_H2CCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[9]; - break; - - } - - } - else if(pNdisCEDvice->nr_endpoint == 6) - { - switch(addr) - { - case RTL8712_DMA_BEQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[3]; - break; - case RTL8712_DMA_BKQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[4]; - break; - case RTL8712_DMA_VIQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[2]; - break; - case RTL8712_DMA_VOQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[1]; - break; - case RTL8712_DMA_RX0FF: - case RTL8712_DMA_C2HCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[0]; - break; - case RTL8712_DMA_H2CCMD: - case RTL8712_DMA_BCNQ: - case RTL8712_DMA_BMCQ: - case RTL8712_DMA_MGTQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[5]; - break; - - } - - } - else if(pNdisCEDvice->nr_endpoint == 4) - { - switch(addr) - { - case RTL8712_DMA_BEQ: - case RTL8712_DMA_BKQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[2]; - break; - case RTL8712_DMA_VIQ: - case RTL8712_DMA_VOQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[1]; - break; - case RTL8712_DMA_RX0FF: - case RTL8712_DMA_C2HCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[0]; - break; - case RTL8712_DMA_H2CCMD: - case RTL8712_DMA_BCNQ: - case RTL8712_DMA_BMCQ: - case RTL8712_DMA_MGTQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[3]; - break; - } - - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint)); - } - - return PipeHandle; - -} - -DWORD usb_bulkout_zero_complete( LPVOID pZeroContext ) -{ - struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext; - _adapter * padapter = pcontext->padapter; - struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; - LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; - struct xmit_priv * pxmitpriv = &padapter->xmitpriv; - - int fComplete =_FALSE; - DWORD dwBytesTransferred = 0; - DWORD dwErr = USB_CANCELED_ERROR; - -_func_enter_; - -#if 1 - - (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr); - fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port); - if(fComplete!=_TRUE) - { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_bulkout_zero_complete CloseTransfer before complete\n")); - } - (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); - -#endif - - if(pcontext) - { - if(pcontext->pbuf) - { - rtw_mfree(pcontext->pbuf, sizeof(int)); - } - - rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); - } - -_func_exit_; - - return ERROR_SUCCESS; - - -} - -u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) -{ - struct zero_bulkout_context *pcontext; - unsigned char *pbuf; - u8 len = 0 ; - _adapter *padapter = (_adapter *)pintfhdl->adapter; - struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; - struct xmit_priv * pxmitpriv = &padapter->xmitpriv; - - - LPCUSB_FUNCS usb_funcs_vp = pdvobj->usb_extension._lpUsbFuncs; - - USB_PIPE hPipe; - -_func_enter_; - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - return _FAIL; - } - - - pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); - - pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); - - len = 0; - - pcontext->pbuf = pbuf; - pcontext->purb = NULL; - pcontext->pirp = NULL; - pcontext->padapter = padapter; - - -//translate DMA FIFO addr to pipehandle - hPipe = ffaddr2pipehdl(pdvobj, addr); - - - - - pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)( - hPipe, usb_bulkout_zero_complete, - pcontext, USB_OUT_TRANSFER, - len, pbuf, 0); - - -_func_exit_; - - return _SUCCESS; - -} - -u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - - u32 i, bwritezero = _FALSE; - u32 ac_tag = addr; - - u8* ptr; - - struct intf_priv * pintfpriv = pintfhdl->pintfpriv; - struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; - _adapter * padapter = pdvobj_priv->padapter; - - struct xmit_priv * pxmitpriv = &padapter->xmitpriv; - struct xmit_frame * pxmitframe = (struct xmit_frame *)wmem; - - LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; - - USB_PIPE hPipe; - - u32 bResult = _FALSE; - -_func_enter_; - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_port\n")); - -#if (CONFIG_PWRCTRL == 1) - if(padapter->pwrctrlpriv.pnp_bstop_trx==_TRUE){ - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); - - } -#endif - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - bResult = _FALSE; - goto exit; - } - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port(%u)\n", __LINE__)); - - for(i=0; i<8; i++) - { - if(pxmitframe->bpending[i] == _FALSE) - { - _rtw_spinlock(&pxmitpriv->lock); - pxmitpriv->txirp_cnt++; - pxmitframe->bpending[i] = _TRUE; - _rtw_spinunlock(&pxmitpriv->lock); - - pxmitframe->sz[i] = cnt; - pxmitframe->ac_tag[i] = ac_tag; - - break; - } - } - - - //TODO: - if (pdvobj_priv->ishighspeed) - { - if(cnt> 0 && cnt%512 == 0) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt)); - // cnt=cnt+1; - bwritezero = _TRUE; - - } - } - else - { - if(cnt > 0 && cnt%64 == 0) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("cnt=%d\n", cnt)); - // cnt=cnt+1; - bwritezero = _TRUE; - - } - } - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port: pipe handle convert\n")); - - //translate DMA FIFO addr to pipehandle - hPipe = ffaddr2pipehdl(pdvobj_priv, addr); - - -#if 0 - // for tx fifo, the maximum payload number is 8, - // we workaround this issue here by separate whole fifo into 8 segments. - if (cnt <= 500) - cnt = 500; -#endif - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, - ("usb_write_port(%u): pxmitframe %X pxmitframe->padapter %X\n",__LINE__, pxmitframe, pxmitframe->padapter)); - - pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)( - hPipe, usb_write_port_complete, - pxmitframe, USB_OUT_TRANSFER, - cnt, pxmitframe->mem_addr, 0); - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - - ptr=(u8 *)&pxmitframe->mem; - -#if 0 - if (pdvobj_priv->ishighspeed) - { - ptr=ptr+512; - } - else - { - ptr=ptr+64; - - } -#endif - if(bwritezero == _TRUE) - { - usb_bulkout_zero(pintfhdl, addr); - } - -// if (!pxmitframe->usb_transfer_xmit) -// padapter->bSurpriseRemoved=_TRUE; - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - bResult = _SUCCESS; - -exit: -_func_exit_; - return bResult; -} - -DWORD usb_write_port_complete( LPVOID Context ) -{ - -// u8 *ptr; - - struct xmit_frame * pxmitframe = (struct xmit_frame *) Context; - _adapter * padapter = pxmitframe->padapter; - struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; - struct xmit_priv * pxmitpriv = &padapter->xmitpriv; - struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; - LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; - - int fComplete =_FALSE; - DWORD dwBytesTransferred = 0; - DWORD dwErr = USB_CANCELED_ERROR; - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u), pxmitframe %X\n",__FUNCTION__, __LINE__, Context)); - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("+usb_write_port_complete\n")); - - _rtw_spinlock_ex(&pxmitpriv->lock); - pxmitpriv->txirp_cnt--; - _rtw_spinunlock_ex(&pxmitpriv->lock); - - if(pxmitpriv->txirp_cnt==0){ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); - _rtw_up_sema(&(pxmitpriv->tx_retevt)); - } - - - //not to consider tx fragment - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - - -#if 1 - - (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr); - fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port); - if(fComplete!=_TRUE) - { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_port_complete CloseTransfer before complete\n")); - } - (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); - -#else - - if((*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port)) - { - (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); - } - -#endif - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, - ("%s(%u): pxmitpriv %X pxmitpriv->free_xmitframe_cnt %X pxmitframe->padapter %X pxmitframe->padapter %X\n", - __LINE__, pxmitpriv, pxmitpriv->free_xmitframe_cnt, pxmitframe->padapter)); - - rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf); - -_func_exit_; - - return STATUS_SUCCESS; -} - -DWORD usb_write_scsi_complete(LPVOID pTxContext) -{ -#ifndef PLATFORM_OS_CE - struct SCSI_BUFFER_ENTRY *psb_entry = (struct SCSI_BUFFER_ENTRY *)pTxContext; - _adapter *padapter = psb_entry->padapter; - struct SCSI_BUFFER *psb = padapter->pscsi_buf; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct dvobj_priv *pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; - LPCUSB_FUNCS lpUsbFuncs = pdvobj_priv->pUsbExtension->_lpUsbFuncs; - - int fComplete =_FALSE; - DWORD dwBytesTransferred = 0; - DWORD dwErr = USB_CANCELED_ERROR; - -_func_enter_; - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u): circ_space = %d\n",__FUNCTION__, __LINE__, CIRC_SPACE( psb->head,psb->tail, SCSI_BUFFER_NUMBER))); - -#if 1 - - (*lpUsbFuncs->lpGetTransferStatus)(psb_entry->usb_transfer_scsi_txcmd, &dwBytesTransferred, &dwErr); - fComplete = (*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd); - if(fComplete!=_TRUE) - { - RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_scsi_complete CloseTransfer before complete\n")); - } - (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd); - -#else - - if((*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd)) - (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd); -#endif - - memset(psb_entry->entry_memory, 0, 8); - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - if((psb->tail+1)==SCSI_BUFFER_NUMBER) - psb->tail=0; - else - psb->tail++; - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - if(CIRC_CNT(psb->head,psb->tail,SCSI_BUFFER_NUMBER)==0){ - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("write_txcmd_scsififo_callback: up_sema\n")); - _rtw_up_sema(&pxmitpriv->xmit_sema); - } - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - if(padapter->bSurpriseRemoved) { - return STATUS_MORE_PROCESSING_REQUIRED; - } - -_func_exit_; -#endif - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - return STATUS_MORE_PROCESSING_REQUIRED; -} - -uint usb_write_scsi(struct intf_hdl *pintfhdl, u32 cnt, u8 *wmem) -{ - -#ifndef PLATFORM_OS_CE - - _adapter *padapter = (_adapter *)pintfhdl->adapter; - struct dvobj_priv *pdev = (struct dvobj_priv*)&padapter->dvobjpriv; - - struct SCSI_BUFFER *psb =padapter->pscsi_buf; - struct SCSI_BUFFER_ENTRY *psb_entry=LIST_CONTAINOR(wmem,struct SCSI_BUFFER_ENTRY,entry_memory); - -_func_enter_; - if(padapter->bSurpriseRemoved||padapter->bDriverStopped) - return 0; - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - psb_entry->usb_transfer_scsi_txcmd=pdev->pUsbExtension->_lpUsbFuncs->lpIssueBulkTransfer( - pdev->scsi_out_pipehandle, - usb_write_scsi_complete, - psb_entry, - USB_OUT_TRANSFER, - cnt, - wmem, - 0); - -_func_exit_; -#endif - - return _SUCCESS; -} - - -/* - */ -uint usb_init_intf_priv(struct intf_priv *pintfpriv) -{ - // get the dvobj_priv object - struct dvobj_priv * pNdisCEDvice = (struct dvobj_priv *) pintfpriv->intf_dev; - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); - // set init intf_priv init status as _IOREADY - pintfpriv->intf_status = _IOREADY; - - // determine the max io size by dvobj_priv.ishighspeed - if(pNdisCEDvice->ishighspeed) - pintfpriv->max_iosz = 128; - else - pintfpriv->max_iosz = 64; - - // read/write size set as 0 - pintfpriv->io_wsz = 0; - pintfpriv->io_rsz = 0; - - // init io_rwmem buffer - pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4); - if (pintfpriv->allocated_io_rwmem == NULL) - { - rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4); - return _FAIL; - } - else - { - // word align the io_rwmem - pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 - ( (u32)(pintfpriv->allocated_io_rwmem) & 3); - } - -#ifndef PLATFORM_OS_CE - - // init io_r_mem buffer - pintfpriv->allocated_io_r_mem = rtw_zmalloc(pintfpriv->max_iosz +4); - if (pintfpriv->allocated_io_r_mem == NULL) - { - rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz +4); - return _FAIL; - } - else - { - // word align the io_rwmem - pintfpriv->io_r_mem = pintfpriv->allocated_io_r_mem + 4 - ( (u32)(pintfpriv->allocated_io_r_mem) & 3); - } -#endif - - return _SUCCESS; -} - -void usb_unload_intf_priv(struct intf_priv *pintfpriv) -{ -#ifndef PLATFORM_OS_CE - - rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4); - rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz+4); -#endif - - RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); -} - - - -void usb_write_port_cancel(_adapter *padapter) -{ - - sint i,j; - struct dvobj_priv *pdev = &padapter->dvobjpriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - struct xmit_frame *pxmitframe; - - _rtw_spinlock(&pxmitpriv->lock); - pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++ - _rtw_spinunlock(&pxmitpriv->lock); - - if (pxmitpriv->txirp_cnt) - { - // Canceling Pending Recv Irp - pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; - - for( i = 0; i < NR_XMITFRAME; i++ ) - { - for(j=0;j<8;j++) - { - if (pxmitframe->bpending[j]==_TRUE) - { - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n")); - - } - } - - pxmitframe++; - } - - _rtw_down_sema(&(pxmitpriv->tx_retevt)); - - } - -} - -DWORD usbctrl_vendorreq_complete(LPVOID lpvNotifyParameter) -{ - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv*)lpvNotifyParameter; - - RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq_complete\n")); - - return STATUS_SUCCESS; -} - - -int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - u8 ret=_TRUE; -// NTSTATUS ntstatus; -// int fComplete; -// LPCUSB_DEVICE lpDeviceInfo; - - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev; - - USB_TRANSFER usbTrans; - USB_DEVICE_REQUEST usb_device_req; - USB_HANDLE usbHandle = pdvobjpriv->usb_extension._hDevice; - LPCUSB_FUNCS usbFuncs = pdvobjpriv->usb_extension._lpUsbFuncs; - - u32 transfer_flags = 0; - - _func_enter_; - - memset( &usb_device_req, 0, sizeof( USB_DEVICE_REQUEST ) ); - - if( 0x01 == requesttype ) - { - usb_device_req.bmRequestType = USB_REQUEST_DEVICE_TO_HOST | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE; - } - else - { - usb_device_req.bmRequestType = USB_REQUEST_HOST_TO_DEVICE | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE; - } - - usb_device_req.bRequest = request; - usb_device_req.wValue = value; - usb_device_req.wIndex = index; - usb_device_req.wLength = len; - - if (requesttype == 0x01) - { - transfer_flags = USB_IN_TRANSFER;//read_in - } - else - { - transfer_flags= USB_OUT_TRANSFER;//write_out - } - - RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq\n",__FUNCTION__,__LINE__)); - -#if 0 - // Remember to add callback for sync - usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle, - usbctrl_vendorreq_complete, pdvobjpriv, - transfer_flags, &usb_device_req, pdata, 0); -#else - // Remember to add callback for sync - usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle, - NULL, 0, - transfer_flags, &usb_device_req, pdata, 0); -#endif - -// rtw_usleep_os(10); - - if ( usbTrans ) - { - DWORD dwBytes = 0; - DWORD dwErr = USB_CANCELED_ERROR; - int fComplete; - - (*usbFuncs->lpGetTransferStatus)(usbTrans, &dwBytes, &dwErr); - - fComplete = (*usbFuncs->lpIsTransferComplete)(usbTrans); - - if (fComplete== _TRUE) - { - (*usbFuncs->lpCloseTransfer)(usbTrans); - RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("usbctrl_vendorreq lpCloseTransfer\n")); - } - - if ( dwErr != USB_NO_ERROR || fComplete != _TRUE) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq lpCloseTransfer without complete\n")); - ret = _FALSE; - goto exit; - } - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq without usbTrans\n")); - ret = _FALSE; - goto exit; - - } - -exit: - RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("-usbctrl_vendorreq\n")); -_func_exit_; - - return ret; - -} - - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c deleted file mode 100755 index bcb79c79f9ab..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c +++ /dev/null @@ -1,1997 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _HCI_OPS_OS_C_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -struct zero_bulkout_context{ - void *pbuf; - void *purb; - void *pirp; - void *padapter; -}; - -#define REALTEK_USB_VENQT_MAX_BUF_SIZE 254 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)) -//#define USB_CONTROL_MSG_TIMEOUT 500 //ms -#define USB_CONTROL_MSG_TIMEOUT 5000 //ms -#else -//#define USB_CONTROL_MSG_TIMEOUT HZ/2 //jiffies -#define USB_CONTROL_MSG_TIMEOUT 5*HZ //jiffies -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) -#define _usbctrl_vendorreq_async_callback(urb, regs) _usbctrl_vendorreq_async_callback(urb) -#define usb_bulkout_zero_complete(purb, regs) usb_bulkout_zero_complete(purb) -#define usb_write_mem_complete(purb, regs) usb_write_mem_complete(purb) -#define usb_write_port_complete(purb, regs) usb_write_port_complete(purb) -#define usb_read_port_complete(purb, regs) usb_read_port_complete(purb) -#define usb_read_interrupt_complete(purb, regs) usb_read_interrupt_complete(purb) -#endif - -#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC -static int usbctrl_vendorreq(struct dvobj_priv *pdvobjpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - unsigned int pipe; - int status = 0; - u32 tmp_buflen=0; - u8 reqtype; - u8 *pIo_buf; - _adapter *padapter = pdvobjpriv->padapter ; - struct usb_device *udev=pdvobjpriv->pusbdev; - - if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - return _FAIL; - } - - if(len>MAX_VENDOR_REQ_CMD_SIZE) - { - DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ ); - return(-1); - } - - if ( pdvobjpriv->usb_vendor_req_buf== NULL) - { - DBG_8192C( "[%s] usb_vendor_req_buf == NULL \n", __FUNCTION__ ); - return(-1); - } - - _enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); - - pIo_buf = pdvobjpriv->usb_vendor_req_buf; - _rtw_memset(pIo_buf, 0, MAX_VENDOR_REQ_CMD_SIZE); - - if (requesttype == 0x01) - { - pipe = usb_rcvctrlpipe(udev, 0);//read_in - reqtype = REALTEK_USB_VENQT_READ; - } - else - { - pipe = usb_sndctrlpipe(udev, 0);//write_out - reqtype = REALTEK_USB_VENQT_WRITE; - _rtw_memcpy( pIo_buf, pdata, len); - } - - status = usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, USB_CONTROL_MSG_TIMEOUT); - - if (status < 0) - { - if(status == (-ESHUTDOWN) || status == (-ENODEV)) - { - DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); - padapter->bDriverStopped=_TRUE; - padapter->bSurpriseRemoved=_TRUE; - } - else{ - DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - _adapter *padapter = pdvobjpriv->padapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL; - } -#endif - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value, status, *(u32*)pdata)); - } - } - else if ( status > 0 ) // Success this control transfer. - { - if ( requesttype == 0x01 ) - { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. - _rtw_memcpy( pdata, pIo_buf, status ); - } - } - _exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); - return status; - -} -#else // CONFIG_USB_VENDOR_REQ_PREALLOC - -static int usbctrl_vendorreq(struct dvobj_priv *pdvobjpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - unsigned int pipe; - int status = 0; - u32 tmp_buflen=0; - u8 reqtype; - - -#ifndef CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD - - u8 tmp_buf[MAX_USB_IO_CTL_SIZE]; -#endif - - struct usb_device *udev=pdvobjpriv->pusbdev; - - // Added by Albert 2010/02/09 - // For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment. - // Trying to fix it here. - - u8 *palloc_buf, *pIo_buf; - - _adapter *padapter = pdvobjpriv->padapter ; - if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - return _FAIL; - } - - - if(len>MAX_VENDOR_REQ_CMD_SIZE) - { - DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ ); - return(-1); - } - -#ifdef CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD - palloc_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT); - tmp_buflen = (u32)len + ALIGNMENT_UNIT; -#else - palloc_buf = tmp_buf; - tmp_buflen = MAX_USB_IO_CTL_SIZE; -#endif - - if ( palloc_buf== NULL) - { - DBG_8192C( "[%s] Can't alloc memory for vendor request\n", __FUNCTION__ ); - return(-1); - } - - _rtw_memset(palloc_buf, 0, tmp_buflen); - - pIo_buf = palloc_buf + ALIGNMENT_UNIT -((SIZE_PTR)(palloc_buf) & 0x0f ); - - - if (requesttype == 0x01) - { - pipe = usb_rcvctrlpipe(udev, 0);//read_in - reqtype = REALTEK_USB_VENQT_READ; - } - else - { - pipe = usb_sndctrlpipe(udev, 0);//write_out - reqtype = REALTEK_USB_VENQT_WRITE; - _rtw_memcpy( pIo_buf, pdata, len); - } - - status = usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, USB_CONTROL_MSG_TIMEOUT); - - if (status < 0) - { - if(status == (-ESHUTDOWN) - || status == -ENODEV ) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); - DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); - padapter->bDriverStopped=_TRUE; - } - else{ - DBG_8192C("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value,(requesttype == 0x01)?"read":"write" , status, *(u32*)pdata); -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - _adapter *padapter = pdvobjpriv->padapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL; - } -#endif - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("reg 0x%x, usb %s fail ,status:%d value=0x%x\n", value, status, *(u32*)pdata)); - } - } - else if ( status > 0 ) // Success this control transfer. - { - if ( requesttype == 0x01 ) - { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. - _rtw_memcpy( pdata, pIo_buf, status ); - } - } - -#ifdef CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD - rtw_mfree( palloc_buf,tmp_buflen); -#endif - - return status; - -} -#endif // CONFIG_USB_VENDOR_REQ_PREALLOC - -static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u32 data=0; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - - _func_enter_; - - request = 0x05; - requesttype = 0x01;//read_in - index = 0;//n/a - - wvalue = (u16)(addr&0x0000ffff); - len = 1; - - usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); - - _func_exit_; - - return (u8)(le32_to_cpu(data)&0x0ff); - -} - -static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u32 data=0; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - - _func_enter_; - - request = 0x05; - requesttype = 0x01;//read_in - index = 0;//n/a - - wvalue = (u16)(addr&0x0000ffff); - len = 2; - - usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); - - _func_exit_; - - return (u16)(le32_to_cpu(data)&0xffff); - -} - -static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u32 data=0; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - - _func_enter_; - - request = 0x05; - requesttype = 0x01;//read_in - index = 0;//n/a - - wvalue = (u16)(addr&0x0000ffff); - len = 4; - - usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); - - _func_exit_; - - return le32_to_cpu(data); - -} - -static void usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u32 data; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - - _func_enter_; - - request = 0x05; - requesttype = 0x00;//write_out - index = 0;//n/a - - wvalue = (u16)(addr&0x0000ffff); - len = 1; - - data = val; - data = cpu_to_le32(data&0x000000ff); - - usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); - - _func_exit_; - -} - -static void usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u32 data; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - - _func_enter_; - - request = 0x05; - requesttype = 0x00;//write_out - index = 0;//n/a - - wvalue = (u16)(addr&0x0000ffff); - len = 2; - - data = val; - data = cpu_to_le32(data&0x0000ffff); - - usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); - - _func_exit_; - -} - -static void usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u32 data; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - - _func_enter_; - - request = 0x05; - requesttype = 0x00;//write_out - index = 0;//n/a - - wvalue = (u16)(addr&0x0000ffff); - len = 4; - data = cpu_to_le32(val); - - usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); - - _func_exit_; - -} -#define VENDOR_CMD_MAX_DATA_LEN 254 -void usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u8 buf[VENDOR_CMD_MAX_DATA_LEN]={0}; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - - _func_enter_; - - request = 0x05; - requesttype = 0x00;//write_out - index = 0;//n/a - - wvalue = (u16)(addr&0x0000ffff); - len = length; - _rtw_memcpy(buf, pdata, len ); - - usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, buf, len, requesttype); - - _func_exit_; - -} - -#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ -static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs) -{ - if(urb){ - if(urb->context){ - kfree(urb->context); - } - usb_free_urb(urb); - } -} - -static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - - int rc; - unsigned int pipe; - u8 reqtype; - struct usb_ctrlrequest *dr; - struct urb *urb; - struct rtl819x_async_write_data { - u8 data[REALTEK_USB_VENQT_MAX_BUF_SIZE]; - struct usb_ctrlrequest dr; - } *buf; - - if (requesttype == VENDOR_READ){ - pipe = usb_rcvctrlpipe(udev, 0);//read_in - reqtype = REALTEK_USB_VENQT_READ; - } - else { - pipe = usb_sndctrlpipe(udev, 0);//write_out - reqtype = REALTEK_USB_VENQT_WRITE; - } - - //buf = kmalloc(sizeof(*buf), GFP_ATOMIC); - buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf)); - if (!buf) - return -ENOMEM; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - rtw_mfree((u8*)buf,sizeof(*buf)); - return -ENOMEM; - } - - dr = &buf->dr; - - dr->bRequestType = reqtype; - dr->bRequest = request; - dr->wValue = cpu_to_le16(value); - dr->wIndex = cpu_to_le16(index); - dr->wLength = cpu_to_le16(len); - - _rtw_memcpy(buf, pdata, len); - - usb_fill_control_urb(urb, udev, pipe, - (unsigned char *)dr, buf, len, - _usbctrl_vendorreq_async_callback, buf); - - rc = usb_submit_urb(urb, GFP_ATOMIC); - if (rc < 0) { - rtw_mfree((u8*)buf,sizeof(*buf)); - usb_free_urb(urb); - } - return rc; - -} - -static void usb_write_async(struct usb_device *udev, u32 addr, u32 val, u16 len) -{ - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u32 data; - - requesttype = VENDOR_WRITE;//write_out - request = REALTEK_USB_VENQT_CMD_REQ; - index = REALTEK_USB_VENQT_CMD_IDX;//n/a - - wvalue = (u16)(addr&0x0000ffff); - data = val & (0xffffffff >> ((4 - len) * 8)); - data = cpu_to_le32(data); - - _usbctrl_vendorreq_async_write(udev, request, wvalue, index, &data, len, requesttype); -} -static void usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) -{ - u32 data; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = cpu_to_le32(val & 0xFF); - usb_write_async(udev, addr, val, 1); - _func_exit_; -} - -static void usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) -{ - u32 data; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = cpu_to_le32(val & 0xFFFF); - usb_write_async(udev, addr, val, 2); - _func_exit_; -} -static void usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) -{ - u32 data; - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; - struct usb_device *udev=pdvobjpriv->pusbdev; - - _func_enter_; - data = cpu_to_le32(val); - usb_write_async(udev, addr, val, 4); - _func_exit_; -} -#endif - -static int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) -{ - int pipe=0, ep_num=0; - _adapter *padapter = pdvobj->padapter; - struct usb_device *pusbd = pdvobj->pusbdev; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if(addr == RECV_BULK_IN_ADDR) - { - pipe=usb_rcvbulkpipe(pusbd, 0x01); - - return pipe; - } - - if(addr == RECV_INT_IN_ADDR) - { - pipe=usb_rcvbulkpipe(pusbd, 0x04); - - return pipe; - } - - if(addr < HW_QUEUE_ENTRY) - { - ep_num = (pHalData->Queue2EPNum[(u8)addr] & 0x0f); - - pipe = usb_sndbulkpipe(pusbd, ep_num); - - return pipe; - } - - return pipe; - -} - -static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs) -{ - struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context; - - //DBG_8192C("+usb_bulkout_zero_complete\n"); - - if(pcontext) - { - if(pcontext->pbuf) - { - rtw_mfree(pcontext->pbuf, sizeof(int)); - } - - if(pcontext->purb && (pcontext->purb==purb)) - { - usb_free_urb(pcontext->purb); - } - - - rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); - } - - -} - -static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) -{ - int pipe, status, len; - u32 ret; - unsigned char *pbuf; - struct zero_bulkout_context *pcontext; - PURB purb = NULL; - _adapter *padapter = (_adapter *)pintfhdl->padapter; - struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; - struct usb_device *pusbd = pdvobj->pusbdev; - - //DBG_8192C("+usb_bulkout_zero\n"); - - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - return _FAIL; - } - - - pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); - - pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); - purb = usb_alloc_urb(0, GFP_ATOMIC); - - len = 0; - pcontext->pbuf = pbuf; - pcontext->purb = purb; - pcontext->pirp = NULL; - pcontext->padapter = padapter; - - - //translate DMA FIFO addr to pipehandle - //pipe = ffaddr2pipehdl(pdvobj, addr); - - usb_fill_bulk_urb(purb, pusbd, pipe, - pbuf, - len, - usb_bulkout_zero_complete, - pcontext);//context is pcontext - - status = usb_submit_urb(purb, GFP_ATOMIC); - - if (!status) - { - ret= _SUCCESS; - } - else - { - ret= _FAIL; - } - - - return _SUCCESS; - -} - -static void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - -} - -static void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - -} - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE -static void usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs) -{ - int err; - _adapter *padapter = (_adapter *)purb->context; - - if(purb->status==0)//SUCCESS - { - if (purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX)) - { - DBG_8192C("usb_read_interrupt_complete: purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX) \n"); - } - - err = usb_submit_urb(purb, GFP_ATOMIC); - if((err) && (err != (-EPERM))) - { - DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, purb->status); - } - } - else - { - DBG_8192C("###=> usb_read_interrupt_complete => urb status(%d)\n", purb->status); - - switch(purb->status) { - case -EINVAL: - case -EPIPE: - case -ENODEV: - case -ESHUTDOWN: - //padapter->bSurpriseRemoved=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); - case -ENOENT: - padapter->bDriverStopped=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); - break; - case -EPROTO: - break; - case -EINPROGRESS: - DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); - break; - default: - break; - } - } - -} - -static u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr) -{ - int err, pipe; - u32 ret = _SUCCESS; - struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; - _adapter *adapter = (_adapter *)pdvobj->padapter; - struct recv_priv *precvpriv = &adapter->recvpriv; - struct usb_device *pusbd = pdvobj->pusbdev; - -_func_enter_; - - //translate DMA FIFO addr to pipehandle - pipe = ffaddr2pipehdl(pdvobj, addr); - - usb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe, - precvpriv->int_in_buf, - sizeof(INTERRUPT_MSG_FORMAT_EX), - usb_read_interrupt_complete, - adapter, - 1); - - err = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC); - if((err) && (err != (-EPERM))) - { - DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, precvpriv->int_in_urb->status); - ret = _FAIL; - } - -_func_exit_; - - return ret; -} -#endif - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX -static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf) -{ - u8 *pbuf; - u8 frag, mf, shift_sz = 0; - u16 pkt_cnt, drvinfo_sz; - u32 pkt_len, pkt_offset, skb_len, alloc_sz; - s32 transfer_len; - struct recv_stat *prxstat; - _pkt *pkt_copy = NULL; - union recv_frame *precvframe = NULL; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct recv_priv *precvpriv = &padapter->recvpriv; - _queue *pfree_recv_queue = &precvpriv->free_recv_queue; - - - transfer_len = (s32)precvbuf->transfer_len; - pbuf = precvbuf->pbuf; - - prxstat = (struct recv_stat *)pbuf; - pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; - -#if 0 //temp remove when disable usb rx aggregation - if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_lenrxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4)); - - prxstat = (struct recv_stat *)pbuf; - pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff; - - - mf = (le32_to_cpu(prxstat->rxdw1) >> 27) & 0x1;//more fragment bit - frag = (le32_to_cpu(prxstat->rxdw2) >> 12) & 0xf;//fragmentation number - - drvinfo_sz = (le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16; - drvinfo_sz = drvinfo_sz << 3;//uint (2^3) = 8 bytes; REG_RX_DRVINFO_SZ - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: DRV_INFO_SIZE=%d\n", drvinfo_sz)); - - pkt_offset = pkt_len + drvinfo_sz + RXDESC_SIZE; - - if((pkt_len<=0) || (pkt_offset>transfer_len)) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n")); - goto _exit_recvbuf2recvframe; - } - - // Modified by Albert 20101213 - // For 8 bytes IP header alignment. - if ( ( le32_to_cpu( prxstat->rxdw0 ) >> 23 ) & 0x01 ) // Qos data, wireless lan header length is 26 - { - shift_sz = 6; - } - else - { - shift_sz = 0; - } - - precvframe = rtw_alloc_recvframe(pfree_recv_queue); - if(precvframe==NULL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n")); - goto _exit_recvbuf2recvframe; - } - - _rtw_init_listhead(&precvframe->u.hdr.list); - precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch. - precvframe->u.hdr.len=0; - - //skb_len = pkt_offset; - skb_len = pkt_len; - - // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. - // modify alloc_sz for recvive crc error packet by thomas 2011-06-02 - if((mf ==1)&&(frag == 0)){ - //alloc_sz = 1664; //1664 is 128 alignment. - if(skb_len <= 1650) - alloc_sz = 1664; - else - alloc_sz = skb_len + 14; - } - else { - alloc_sz = skb_len; - // 6 is for IP header 8 bytes alignment in QoS packet case. - // 8 is for skb->data 4 bytes alignment. - alloc_sz += 14; - } - - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pkt_copy = dev_alloc_skb(alloc_sz); -#else - pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); -#endif - if(pkt_copy) - { - pkt_copy->dev = padapter->pnetdev; - precvframe->u.hdr.pkt = pkt_copy; - skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address - skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz. - _rtw_memcpy(pkt_copy->data, (pbuf + drvinfo_sz + RXDESC_SIZE), skb_len); - precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data; - precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz; - } - else - { - DBG_8192C("recvbuf2recvframe:can not allocate memory for skb copy\n"); - //precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); - //precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf; - //precvframe->u.hdr.rx_end = pbuf + (pkt_offset>1612?pkt_offset:1612); - - precvframe->u.hdr.pkt = NULL; - rtw_free_recvframe(precvframe, pfree_recv_queue); - - goto _exit_recvbuf2recvframe; - } - - recvframe_put(precvframe, skb_len); - //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); - -#ifdef CONFIG_USB_RX_AGGREGATION - switch(pHalData->UsbRxAggMode) - { - case USB_RX_AGG_DMA: - case USB_RX_AGG_MIX: - pkt_offset = (u16)_RND128(pkt_offset); - break; - case USB_RX_AGG_USB: - pkt_offset = (u16)_RND4(pkt_offset); - break; - case USB_RX_AGG_DISABLE: - default: - break; - } -#endif - - //because the endian issue, driver avoid reference to the rxstat after calling update_recvframe_attrib_from_recvstat(); - rtl8192cu_update_recvframe_attrib_from_recvstat(precvframe, prxstat); - - if(rtw_recv_entry(precvframe) != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); - } - - pkt_cnt--; - transfer_len -= pkt_offset; - pbuf += pkt_offset; - precvframe = NULL; - pkt_copy = NULL; - - if(transfer_len>0 && pkt_cnt==0) - pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; - - }while((transfer_len>0) && (pkt_cnt>0)); - -_exit_recvbuf2recvframe: - - return _SUCCESS; -} - -void rtl8192cu_recv_tasklet(void *priv) -{ - struct recv_buf *precvbuf = NULL; - _adapter *padapter = (_adapter*)priv; - struct recv_priv *precvpriv = &padapter->recvpriv; - - while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) - { - if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) - { - DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); - - break; - } - - - recvbuf2recvframe(padapter, precvbuf); - - rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - -} - -static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) -{ - struct recv_buf *precvbuf = (struct recv_buf *)purb->context; - _adapter *padapter =(_adapter *)precvbuf->adapter; - struct recv_priv *precvpriv = &padapter->recvpriv; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); - - precvpriv->rx_pending_cnt --; - - if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - - goto exit; - } - - if(purb->status==0)//SUCCESS - { - if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n")); - - rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - else - { - ATOMIC_SET(&padapter->dvobjpriv.continual_urb_error, 0); - - precvbuf->transfer_len = purb->actual_length; - - //rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf); - rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue); - - tasklet_schedule(&precvpriv->recv_tasklet); - } - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status)); - - DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); - - switch(purb->status) { - case -EINVAL: - case -EPIPE: - case -ENODEV: - case -ESHUTDOWN: - //padapter->bSurpriseRemoved=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); - case -ENOENT: - padapter->bDriverStopped=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); - break; - case -EPROTO: - #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL; - } - #endif - - if(ATOMIC_INC_RETURN(&padapter->dvobjpriv.continual_urb_error) > MAX_CONTINUAL_URB_ERR) { - DBG_871X("continual_urb_error > %d\n", MAX_CONTINUAL_URB_ERR); - break; - } - rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - break; - case -EINPROGRESS: - DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); - break; - default: - break; - } - - } - -exit: - -_func_exit_; - -} - -static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - int err, pipe; - u32 ret = _SUCCESS; - PURB purb = NULL; - struct recv_buf *precvbuf = (struct recv_buf *)rmem; - struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; - _adapter *adapter = (_adapter *)pdvobj->padapter; - struct recv_priv *precvpriv = &adapter->recvpriv; - struct usb_device *pusbd = pdvobj->pusbdev; - -_func_enter_; - - if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - return _FAIL; - } - - if(precvbuf !=NULL) - { - rtl8192cu_init_recvbuf(adapter, precvbuf); - - if(precvbuf->pbuf) - { - precvpriv->rx_pending_cnt++; - - purb = precvbuf->purb; - - //translate DMA FIFO addr to pipehandle - pipe = ffaddr2pipehdl(pdvobj, addr); - - usb_fill_bulk_urb(purb, pusbd, pipe, - precvbuf->pbuf, - MAX_RECVBUF_SZ, - usb_read_port_complete, - precvbuf);//context is precvbuf - - purb->transfer_dma = precvbuf->dma_transfer_addr; - purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - - err = usb_submit_urb(purb, GFP_ATOMIC); - if((err) && (err != (-EPERM))) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status)); - DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status); - ret = _FAIL; - } - - } - - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n")); - ret = _FAIL; - } - -_func_exit_; - - return ret; -} -#else // CONFIG_USE_USB_BUFFER_ALLOC_RX -static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb) -{ - u8 *pbuf; - u8 frag, mf, shift_sz = 0; - u16 pkt_cnt, drvinfo_sz; - u32 pkt_len, pkt_offset, skb_len, alloc_sz; - s32 transfer_len; - struct recv_stat *prxstat; - _pkt *pkt_copy = NULL; - union recv_frame *precvframe = NULL; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct recv_priv *precvpriv = &padapter->recvpriv; - _queue *pfree_recv_queue = &precvpriv->free_recv_queue; - - - transfer_len = (s32)pskb->len; - pbuf = pskb->data; - - prxstat = (struct recv_stat *)pbuf; - pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; - -#if 0 //temp remove when disable usb rx aggregation - if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_lenrxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4)); - - prxstat = (struct recv_stat *)pbuf; - pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff; - - mf = (le32_to_cpu(prxstat->rxdw1) >> 27) & 0x1;//more fragment bit - frag = (le32_to_cpu(prxstat->rxdw2) >> 12) & 0xf;//fragmentation number - - drvinfo_sz = (le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16; - drvinfo_sz = drvinfo_sz << 3;//uint (2^3) = 8 bytes; REG_RX_DRVINFO_SZ - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: DRV_INFO_SIZE=%d\n", drvinfo_sz)); - - pkt_offset = pkt_len + drvinfo_sz + RXDESC_SIZE; - - if((pkt_len<=0) || (pkt_offset>transfer_len)) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n")); - goto _exit_recvbuf2recvframe; - } - - // Modified by Albert 20101213 - // For 8 bytes IP header alignment. - if ( ( le32_to_cpu( prxstat->rxdw0 ) >> 23 ) & 0x01 ) // Qos data, wireless lan header length is 26 - { - shift_sz = 6; - } - else - { - shift_sz = 0; - } - - precvframe = rtw_alloc_recvframe(pfree_recv_queue); - if(precvframe==NULL) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n")); - goto _exit_recvbuf2recvframe; - } - - _rtw_init_listhead(&precvframe->u.hdr.list); - precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch. - precvframe->u.hdr.len=0; - - //skb_len = pkt_offset; - skb_len = pkt_len; - - // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. - // modify alloc_sz for recvive crc error packet by thomas 2011-06-02 - if((mf ==1)&&(frag == 0)){ - //alloc_sz = 1664; //1664 is 128 alignment. - if(skb_len <= 1650) - alloc_sz = 1664; - else - alloc_sz = skb_len + 14; - } - else { - alloc_sz = skb_len; - // 6 is for IP header 8 bytes alignment in QoS packet case. - // 8 is for skb->data 4 bytes alignment. - alloc_sz += 14; - } - - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - pkt_copy = dev_alloc_skb(alloc_sz); -#else - pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); -#endif - if(pkt_copy) - { - pkt_copy->dev = padapter->pnetdev; - precvframe->u.hdr.pkt = pkt_copy; - skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address - skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz. - _rtw_memcpy(pkt_copy->data, (pbuf + drvinfo_sz + RXDESC_SIZE), skb_len); - precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data; - precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz; - } - else - { - precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); - if(pkt_copy) - { - precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf; - precvframe->u.hdr.rx_end = pbuf + alloc_sz; - } - else - { - DBG_8192C("recvbuf2recvframe: skb_clone fail\n"); - goto _exit_recvbuf2recvframe; - } - } - - recvframe_put(precvframe, skb_len); - //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); - -#ifdef CONFIG_USB_RX_AGGREGATION - switch(pHalData->UsbRxAggMode) - { - case USB_RX_AGG_DMA: - case USB_RX_AGG_MIX: - pkt_offset = (u16)_RND128(pkt_offset); - break; - case USB_RX_AGG_USB: - pkt_offset = (u16)_RND4(pkt_offset); - break; - case USB_RX_AGG_DISABLE: - default: - break; - } -#endif - - //because the endian issue, driver avoid reference to the rxstat after calling update_recvframe_attrib_from_recvstat(); - rtl8192cu_update_recvframe_attrib_from_recvstat(precvframe, prxstat); - - if(rtw_recv_entry(precvframe) != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); - } - - pkt_cnt--; - transfer_len -= pkt_offset; - pbuf += pkt_offset; - precvframe = NULL; - pkt_copy = NULL; - - if(transfer_len>0 && pkt_cnt==0) - pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; - - }while((transfer_len>0) && (pkt_cnt>0)); - -_exit_recvbuf2recvframe: - - return _SUCCESS; -} - -void rtl8192cu_recv_tasklet(void *priv) -{ - _pkt *pskb; - _adapter *padapter = (_adapter*)priv; - struct recv_priv *precvpriv = &padapter->recvpriv; - - while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) - { - if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) - { - DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); - dev_kfree_skb_any(pskb); - break; - } - - recvbuf2recvframe(padapter, pskb); - -#ifdef CONFIG_PREALLOC_RECV_SKB - -#ifdef NET_SKBUFF_DATA_USES_OFFSET - skb_reset_tail_pointer(pskb); -#else - pskb->tail = pskb->data; -#endif - pskb->len = 0; - - skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); - -#else - dev_kfree_skb_any(pskb); -#endif - - } - -} - - -static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) -{ - _irqL irqL; - uint isevt, *pbuf; - struct recv_buf *precvbuf = (struct recv_buf *)purb->context; - _adapter *padapter =(_adapter *)precvbuf->adapter; - struct recv_priv *precvpriv = &padapter->recvpriv; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); - - //_enter_critical(&precvpriv->lock, &irqL); - //precvbuf->irp_pending=_FALSE; - //precvpriv->rx_pending_cnt --; - //_exit_critical(&precvpriv->lock, &irqL); - - precvpriv->rx_pending_cnt --; - - //if(precvpriv->rx_pending_cnt== 0) - //{ - // RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n")); - // _rtw_up_sema(&precvpriv->allrxreturnevt); - //} - - if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - - #ifdef CONFIG_PREALLOC_RECV_SKB - precvbuf->reuse = _TRUE; - #else - if(precvbuf->pskb){ - DBG_8192C("==> free skb(%p)\n",precvbuf->pskb); - dev_kfree_skb_any(precvbuf->pskb); - } - #endif - - goto exit; - } - - if(purb->status==0)//SUCCESS - { - if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n")); - precvbuf->reuse = _TRUE; - rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - else - { - ATOMIC_SET(&padapter->dvobjpriv.continual_urb_error, 0); - - precvbuf->transfer_len = purb->actual_length; - - skb_put(precvbuf->pskb, purb->actual_length); - skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb); - - if (skb_queue_len(&precvpriv->rx_skb_queue)<=1) - tasklet_schedule(&precvpriv->recv_tasklet); - - precvbuf->pskb = NULL; - precvbuf->reuse = _FALSE; - rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status)); - - DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); - - switch(purb->status) { - case -EINVAL: - case -EPIPE: - case -ENODEV: - case -ESHUTDOWN: - //padapter->bSurpriseRemoved=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); - case -ENOENT: - padapter->bDriverStopped=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); - break; - case -EPROTO: - #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL; - } - #endif - - if(ATOMIC_INC_RETURN(&padapter->dvobjpriv.continual_urb_error) > MAX_CONTINUAL_URB_ERR) { - DBG_871X("continual_urb_error > %d\n", MAX_CONTINUAL_URB_ERR); - break; - } - - precvbuf->reuse = _TRUE; - rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - break; - case -EINPROGRESS: - DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); - break; - default: - break; - } - - } - -exit: - -_func_exit_; - -} - -static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - _irqL irqL; - int err, pipe; - SIZE_PTR tmpaddr=0; - SIZE_PTR alignment=0; - u32 ret = _SUCCESS; - PURB purb = NULL; - struct recv_buf *precvbuf = (struct recv_buf *)rmem; - struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; - _adapter *adapter = (_adapter *)pdvobj->padapter; - struct recv_priv *precvpriv = &adapter->recvpriv; - struct usb_device *pusbd = pdvobj->pusbdev; - - -_func_enter_; - - if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - return _FAIL; - } - -#ifdef CONFIG_PREALLOC_RECV_SKB - if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) - { - if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue))) - { - precvbuf->reuse = _TRUE; - } - } -#endif - - - if(precvbuf !=NULL) - { - rtl8192cu_init_recvbuf(adapter, precvbuf); - - //re-assign for linux based on skb - if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) - { - //precvbuf->pskb = alloc_skb(MAX_RECVBUF_SZ, GFP_ATOMIC);//don't use this after v2.6.25 -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html - precvbuf->pskb = dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); -#else - precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); -#endif - if(precvbuf->pskb == NULL) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("init_recvbuf(): alloc_skb fail!\n")); - return _FAIL; - } - - tmpaddr = (SIZE_PTR)precvbuf->pskb->data; - alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); - skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); - - precvbuf->phead = precvbuf->pskb->head; - precvbuf->pdata = precvbuf->pskb->data; - -#ifdef NET_SKBUFF_DATA_USES_OFFSET - precvbuf->ptail = precvbuf->pskb->head + precvbuf->pskb->tail; - precvbuf->pend = precvbuf->ptail + (MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); -#else - precvbuf->ptail = precvbuf->pskb->tail; - precvbuf->pend = precvbuf->pskb->end; -#endif - precvbuf->pbuf = precvbuf->pskb->data; - } - else//reuse skb - { - precvbuf->phead = precvbuf->pskb->head; - precvbuf->pdata = precvbuf->pskb->data; - -#ifdef NET_SKBUFF_DATA_USES_OFFSET - precvbuf->ptail = precvbuf->pskb->head + precvbuf->pskb->tail; - precvbuf->pend = precvbuf->ptail + (MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); -#else - precvbuf->ptail = precvbuf->pskb->tail; - precvbuf->pend = precvbuf->pskb->end; -#endif - precvbuf->pbuf = precvbuf->pskb->data; - - precvbuf->reuse = _FALSE; - } - - //_enter_critical(&precvpriv->lock, &irqL); - //precvpriv->rx_pending_cnt++; - //precvbuf->irp_pending = _TRUE; - //_exit_critical(&precvpriv->lock, &irqL); - - precvpriv->rx_pending_cnt++; - - purb = precvbuf->purb; - - //translate DMA FIFO addr to pipehandle - pipe = ffaddr2pipehdl(pdvobj, addr); - - usb_fill_bulk_urb(purb, pusbd, pipe, - precvbuf->pbuf, - MAX_RECVBUF_SZ, - usb_read_port_complete, - precvbuf);//context is precvbuf - - err = usb_submit_urb(purb, GFP_ATOMIC); - if((err) && (err != (-EPERM))) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status)); - DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status); - ret = _FAIL; - } - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n")); - ret = _FAIL; - } - -_func_exit_; - - return ret; -} -#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX - -static void usb_read_port_cancel(struct intf_hdl *pintfhdl) -{ - int i; - struct recv_buf *precvbuf; - _adapter *padapter = pintfhdl->padapter; - precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; - - //DBG_8192C("usb_read_port_cancel \n"); - - padapter->bReadPortCancel = _TRUE; - - for(i=0; i < NR_RECVBUFF ; i++) - { - precvbuf->reuse = _TRUE; - if(precvbuf->purb) - { - //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); - usb_kill_urb(precvbuf->purb); - } - - precvbuf++; - } - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - usb_kill_urb(padapter->recvpriv.int_in_urb); -#endif -} - -void rtl8192cu_xmit_tasklet(void *priv) -{ - int ret = _FALSE; - _adapter *padapter = (_adapter*)priv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - if(check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE) - return; - - while(1) - { - if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE) || (padapter->bWritePortCancel == _TRUE)) - { - DBG_8192C("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n"); - break; - } - - ret = rtl8192cu_xmitframe_complete(padapter, pxmitpriv, NULL); - - if(ret==_FALSE) - break; - - } - -} - -static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) -{ - _irqL irqL; - int i; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; - //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; - //_adapter *padapter = pxmitframe->padapter; - _adapter *padapter = pxmitbuf->padapter; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - //struct pkt_attrib *pattrib = &pxmitframe->attrib; - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port_complete\n")); - - - switch(pxmitbuf->flags) - { - case XMIT_VO_QUEUE: - pxmitpriv->voq_cnt--; - break; - case XMIT_VI_QUEUE: - pxmitpriv->viq_cnt--; - break; - case XMIT_BE_QUEUE: - pxmitpriv->beq_cnt--; - break; - case XMIT_BK_QUEUE: - pxmitpriv->bkq_cnt--; - break; - case HIGH_QUEUE_INX: -#ifdef CONFIG_AP_MODE - rtw_chk_hi_queue_cmd(padapter); -#endif - break; - default: - break; - } - - -/* - _enter_critical(&pxmitpriv->lock, &irqL); - - pxmitpriv->txirp_cnt--; - - switch(pattrib->priority) - { - case 1: - case 2: - pxmitpriv->bkq_cnt--; - //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt); - break; - case 4: - case 5: - pxmitpriv->viq_cnt--; - //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt); - break; - case 6: - case 7: - pxmitpriv->voq_cnt--; - //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt); - break; - case 0: - case 3: - default: - pxmitpriv->beq_cnt--; - //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt); - break; - - } - - _exit_critical(&pxmitpriv->lock, &irqL); - - - if(pxmitpriv->txirp_cnt==0) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); - _rtw_up_sema(&(pxmitpriv->tx_retevt)); - } -*/ - //rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - - if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - goto exit; - } - - - if(purb->status==0) - { - - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status)); - DBG_8192C("###=> urb_write_port_complete status(%d)\n",purb->status); - if((purb->status==-EPIPE)||(purb->status==-EPROTO)) - { - //usb_clear_halt(pusbdev, purb->pipe); - //msleep(10); - #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.Wifi_Error_Status = USB_WRITE_PORT_FAIL; - } - #endif - } - else if(purb->status == -EINPROGRESS) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n")); - } - else if(purb->status == (-ESHUTDOWN)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); - - padapter->bDriverStopped=_TRUE; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n")); - - goto exit; - } - else - { - padapter->bSurpriseRemoved=_TRUE; - DBG_8192C("bSurpriseRemoved=TRUE\n"); - //rtl8192cu_trigger_gpio_0(padapter); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); - - goto exit; - } - - - - } - - #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time(); - } - #endif - - //if(rtw_txframes_pending(padapter)) - { - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - } - - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port_complete\n")); - -exit: - -_func_exit_; - -} - -static u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - _irqL irqL; - int pipe, status; - u32 ret, bwritezero = _FALSE; - PURB purb = NULL; - _adapter *padapter = (_adapter *)pintfhdl->padapter; - struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; - struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; - struct usb_device *pusbd = pdvobj->pusbdev; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n")); - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - #ifdef DBG_TX - DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__ - ,padapter->bDriverStopped, padapter->bSurpriseRemoved, padapter->pwrctrlpriv.pnp_bstop_trx ); - #endif - - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - return _FAIL; - } - - _enter_critical(&pxmitpriv->lock, &irqL); - - switch(addr) - { - case VO_QUEUE_INX: - pxmitpriv->voq_cnt++; - pxmitbuf->flags = XMIT_VO_QUEUE; - break; - case VI_QUEUE_INX: - pxmitpriv->viq_cnt++; - pxmitbuf->flags = XMIT_VI_QUEUE; - break; - case BE_QUEUE_INX: - pxmitpriv->beq_cnt++; - pxmitbuf->flags = XMIT_BE_QUEUE; - break; - case BK_QUEUE_INX: - pxmitpriv->bkq_cnt++; - pxmitbuf->flags = XMIT_BK_QUEUE; - break; - case HIGH_QUEUE_INX: - pxmitbuf->flags = HIGH_QUEUE_INX; - break; - default: - pxmitbuf->flags = XMIT_VO_QUEUE; - break; - } - - _exit_critical(&pxmitpriv->lock, &irqL); - -/* - _enter_critical(&pxmitpriv->lock, &irqL); - - //total irp - pxmitpriv->txirp_cnt++; - - //per ac irp - switch(pattrib->priority) - { - case 1: - case 2: - pxmitpriv->bkq_cnt++; - break; - case 4: - case 5: - pxmitpriv->viq_cnt++; - break; - case 6: - case 7: - pxmitpriv->voq_cnt++; - break; - case 0: - case 3: - default: - pxmitpriv->beq_cnt++; - break; - } - - - _exit_critical(&pxmitpriv->lock, &irqL); -*/ - - purb = pxmitbuf->pxmit_urb[0]; - -#if 0 - if(pdvobj->ishighspeed) - { - if(cnt> 0 && cnt%512 == 0) - { - //DBG_8192C("ishighspeed, cnt=%d\n", cnt); - bwritezero = _TRUE; - } - } - else - { - if(cnt > 0 && cnt%64 == 0) - { - //DBG_8192C("cnt=%d\n", cnt); - bwritezero = _TRUE; - } - } -#endif - - //translate DMA FIFO addr to pipehandle - pipe = ffaddr2pipehdl(pdvobj, addr); - -#ifdef CONFIG_REDUCE_USB_TX_INT - if ( pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0 - || pxmitbuf->ext_tag ) - { - purb->transfer_flags &= (~URB_NO_INTERRUPT); - } else { - purb->transfer_flags |= URB_NO_INTERRUPT; - //DBG_8192C("URB_NO_INTERRUPT "); - } -#endif - - - usb_fill_bulk_urb(purb, pusbd, pipe, - pxmitframe->buf_addr, //= pxmitbuf->pbuf - cnt, - usb_write_port_complete, - pxmitbuf);//context is pxmitbuf - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX - purb->transfer_dma = pxmitbuf->dma_transfer_addr; - purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - purb->transfer_flags |= URB_ZERO_PACKET; -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - -#if 0 - if (bwritezero) - { - purb->transfer_flags |= URB_ZERO_PACKET; - } -#endif - - status = usb_submit_urb(purb, GFP_ATOMIC); - - if (!status) - { - ret= _SUCCESS; - #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - pHalData->srestpriv.last_tx_time = rtw_get_current_time(); - } - #endif - } - else - { - DBG_8192C("usb_write_port, status=%d\n", status); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status)); - ret= _FAIL; - } - -// Commented by Albert 2009/10/13 -// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. -/* - if(bwritezero == _TRUE) - { - usb_bulkout_zero(pintfhdl, addr); - } -*/ - -_func_exit_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n")); - - return ret; - -} - -static void usb_write_port_cancel(struct intf_hdl *pintfhdl) -{ - int i, j; - _adapter *padapter = pintfhdl->padapter; - struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; - - //DBG_8192C("usb_write_port_cancel \n"); - - padapter->bWritePortCancel = _TRUE; - - for(i=0; ipxmit_urb[j]) - { - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } - } - - pxmitbuf++; - } - -} - -void rtl8192cu_set_intf_ops(struct _io_ops *pops) -{ - _func_enter_; - - _rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops)); - - pops->_read8 = &usb_read8; - pops->_read16 = &usb_read16; - pops->_read32 = &usb_read32; - pops->_read_mem = &usb_read_mem; - pops->_read_port = &usb_read_port; - - pops->_write8 = &usb_write8; - pops->_write16 = &usb_write16; - pops->_write32 = &usb_write32; - pops->_writeN = &usb_writeN; - -#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ - pops->_write8_async= &usb_async_write8; - pops->_write16_async = &usb_async_write16; - pops->_write32_async = &usb_async_write32; -#endif - pops->_write_mem = &usb_write_mem; - pops->_write_port = &usb_write_port; - - pops->_read_port_cancel = &usb_read_port_cancel; - pops->_write_port_cancel = &usb_write_port_cancel; - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - pops->_read_interrupt = &usb_read_interrupt; -#endif - - _func_exit_; - -} - diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c deleted file mode 100755 index 82adeffd07ec..000000000000 --- a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c +++ /dev/null @@ -1,1266 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _HCI_OPS_OS_C_ - -#include -#include -#include -#include -#include - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - #error "Shall be Linux or Windows, but not both!\n" -#endif - -#ifndef CONFIG_USB_HCI - #error "CONFIG_USB_HCI shall be on!\n" -#endif - - -#include -#include -#include - -#include -#include - -#include - - -struct zero_bulkout_context -{ - void *pbuf; - void *purb; - void *pirp; - void *padapter; -}; - -#define usb_write_cmd usb_write_mem -#define usb_read_cmd usb_read_mem -#define usb_write_cmd_complete usb_write_mem_complete -//#define usb_read_cmd_complete usb_read_mem_complete - - - -uint usb_init_intf_priv(struct intf_priv *pintfpriv) -{ - - PURB piorw_urb; - u8 NextDeviceStackSize; - struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; - _adapter * padapter=pdev->padapter; - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n +usb_init_intf_priv\n")); - - pintfpriv->intf_status = _IOREADY; - - if(pdev->ishighspeed) pintfpriv->max_iosz = 128; - else pintfpriv->max_iosz = 64; - - - _init_timer(&pintfpriv->io_timer, padapter->hndis_adapter, io_irp_timeout_handler, pintfpriv); - - - RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("usb_init_intf_priv:pintfpriv->max_iosz:%d\n",pintfpriv->max_iosz)); - - pintfpriv->io_wsz = 0; - pintfpriv->io_rsz = 0; - - pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4); - - if (pintfpriv->allocated_io_rwmem == NULL){ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_init_intf_priv:pintfpriv->allocated_io_rwmem == NULL\n")); - goto usb_init_intf_priv_fail; - } - - pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 \ - -( (u32)(pintfpriv->allocated_io_rwmem) & 3); - - - - NextDeviceStackSize = (u8)pdev->nextdevstacksz;//pintfpriv->pUsbDevObj->StackSize + 1; - - piorw_urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB) ); - if(piorw_urb == NULL) - goto usb_init_intf_priv_fail; - - pintfpriv->piorw_urb = piorw_urb; - - pintfpriv->piorw_irp = IoAllocateIrp(NextDeviceStackSize , FALSE); - - - pintfpriv->io_irp_cnt=1; - pintfpriv->bio_irp_pending=_FALSE; - - _rtw_init_sema(&(pintfpriv->io_retevt), 0);//NdisInitializeEvent(&pintfpriv->io_irp_return_evt); - -_func_exit_; - return _SUCCESS; - -usb_init_intf_priv_fail: - - if (pintfpriv->allocated_io_rwmem) - rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4); - - if(piorw_urb) - ExFreePool(piorw_urb); - - RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n -usb_init_intf_priv(usb_init_intf_priv_fail)\n")); - -_func_exit_; - return _FAIL; - -} - -void usb_unload_intf_priv(struct intf_priv *pintfpriv) -{ - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n+usb_unload_intf_priv\n")); - - rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4); - -#ifdef PLATFORM_WINDOWS - if(pintfpriv->piorw_urb) - ExFreePool(pintfpriv->piorw_urb); - - if(pintfpriv->piorw_irp) - IoFreeIrp(pintfpriv->piorw_irp); -#endif - - -#ifdef PLATFORM_LINUX - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npintfpriv->io_irp_cnt=%d\n",pintfpriv->io_irp_cnt)); - pintfpriv->io_irp_cnt--; - if(pintfpriv->io_irp_cnt){ - if(pintfpriv->bio_irp_pending==_TRUE){ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\nkill iorw_urb\n")); - usb_kill_urb(pintfpriv->piorw_urb); - } - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n wait io_retevt\n")); - _rtw_down_sema(&(pintfpriv->io_retevt)); - } - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n cancel io_urb ok\n")); -#endif - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n-usb_unload_intf_priv\n")); - -_func_exit_; - -} - -void *ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr) -{ - HANDLE PipeHandle = NULL; - _adapter *padapter = pNdisCEDvice->padapter; - - - if(pNdisCEDvice->nr_endpoint == 11) - { - switch(addr) - { - case RTL8712_DMA_BEQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[3] ; - break; - case RTL8712_DMA_BKQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[4]; - break; - case RTL8712_DMA_VIQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[2]; - break; - case RTL8712_DMA_VOQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[1]; - break; - case RTL8712_DMA_BCNQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[6]; - break; - case RTL8712_DMA_BMCQ: //HI Queue - PipeHandle= padapter->halpriv.pipehdls_r8712[7]; - break; - case RTL8712_DMA_MGTQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[8]; - break; - case RTL8712_DMA_RX0FF: - PipeHandle= padapter->halpriv.pipehdls_r8712[0]; - break; - case RTL8712_DMA_C2HCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[5]; - break; - case RTL8712_DMA_H2CCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[9]; - break; - - } - - } - else if(pNdisCEDvice->nr_endpoint == 6) - { - switch(addr) - { - case RTL8712_DMA_BEQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[3]; - break; - case RTL8712_DMA_BKQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[4]; - break; - case RTL8712_DMA_VIQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[2]; - break; - case RTL8712_DMA_VOQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[1]; - break; - case RTL8712_DMA_RX0FF: - case RTL8712_DMA_C2HCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[0]; - break; - case RTL8712_DMA_H2CCMD: - case RTL8712_DMA_BCNQ: - case RTL8712_DMA_BMCQ: - case RTL8712_DMA_MGTQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[5]; - break; - - } - - } - else if(pNdisCEDvice->nr_endpoint == 4) - { - switch(addr) - { - case RTL8712_DMA_BEQ: - //case RTL8712_DMA_BKQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[2]; - break; - //case RTL8712_DMA_VIQ: - case RTL8712_DMA_VOQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[1]; - break; - case RTL8712_DMA_RX0FF: - case RTL8712_DMA_C2HCMD: - PipeHandle= padapter->halpriv.pipehdls_r8712[0]; - break; - case RTL8712_DMA_H2CCMD: - case RTL8712_DMA_BCNQ: - case RTL8712_DMA_BMCQ: - case RTL8712_DMA_MGTQ: - PipeHandle= padapter->halpriv.pipehdls_r8712[3]; - break; - } - - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint)); - } - - return PipeHandle; - -} - - -NTSTATUS usb_bulkout_zero_complete( - PDEVICE_OBJECT pUsbDevObj, - PIRP pIrp, void* pZeroContext) -{ - struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext; - -_func_enter_; - - if(pcontext) - { - if(pcontext->pbuf) - { - ExFreePool(pcontext->pbuf); - } - - if(pcontext->purb) - { - ExFreePool(pcontext->purb); - } - - if(pcontext->pirp && (pIrp ==pcontext->pirp)) - { - IoFreeIrp(pIrp); - } - - ExFreePool(pcontext); - } - -_func_exit_; - - return STATUS_MORE_PROCESSING_REQUIRED; - - -} - -u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) -{ - struct zero_bulkout_context *pcontext; - unsigned char *pbuf; - char NextDeviceStackSize, len; - PIO_STACK_LOCATION nextStack; - USBD_STATUS usbdstatus; - HANDLE PipeHandle; - PIRP pirp = NULL; - PURB purb = NULL; - NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; - _adapter *padapter = (_adapter *)pintfhdl->adapter; - struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; - - -_func_enter_; - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - return _FAIL; - } - - len = 0; - NextDeviceStackSize = (char)pdvobj->nextdevstacksz; - - pcontext = (struct zero_bulkout_context *)ExAllocatePool(NonPagedPool, sizeof(struct zero_bulkout_context)); - pbuf = (unsigned char *)ExAllocatePool(NonPagedPool, sizeof(int)); - purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB)); - pirp = IoAllocateIrp(NextDeviceStackSize, FALSE); - - pcontext->pbuf = pbuf; - pcontext->purb = purb; - pcontext->pirp = pirp; - pcontext->padapter = padapter; - - //translate DMA FIFO addr to pipehandle - PipeHandle = ffaddr2pipehdl(pdvobj, addr); - - - // Build our URB for USBD - UsbBuildInterruptOrBulkTransferRequest( - purb, - sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), - PipeHandle, - pbuf, - NULL, - len, - 0, - NULL); - - // - // call the calss driver to perform the operation - // pass the URB to the USB driver stack - // - nextStack = IoGetNextIrpStackLocation(pirp); - nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; - nextStack->Parameters.Others.Argument1 = purb; - nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; - - //Set Completion Routine - IoSetCompletionRoutine(pirp, // irp to use - usb_bulkout_zero_complete, // callback routine - pcontext, // context - TRUE, // call on success - TRUE, // call on error - TRUE); // call on cancel - - - // Call IoCallDriver to send the irp to the usb bus driver - // - ndisStatus = IoCallDriver(pdvobj->pnextdevobj, pirp); - usbdstatus = URB_STATUS(purb); - - if( USBD_HALTED(usbdstatus) ) - { - padapter->bDriverStopped=_TRUE; - padapter->bSurpriseRemoved=_TRUE; - } - - // - // The usb bus driver should always return STATUS_PENDING when bulk out irp async - // - if ( ndisStatus != STATUS_PENDING ) - { - return _FAIL; - } - -_func_exit_; - - return _SUCCESS; - -} - -void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - _func_enter_; - - - - _func_exit_; -} - -NTSTATUS usb_write_mem_complete(PDEVICE_OBJECT pUsbDevObj, PIRP piowrite_irp, PVOID pusb_cnxt) -{ - - _irqL irqL; - _list *head, *plist; - struct io_req *pio_req; - struct io_queue *pio_q = (struct io_queue *) pusb_cnxt; - struct intf_hdl *pintf = &(pio_q->intf); - struct intf_priv *pintfpriv = pintf->pintfpriv; - _adapter *padapter = (_adapter *)pintf->adapter; - NTSTATUS status = STATUS_SUCCESS; - - head = &(pio_q->processing); - - _func_enter_; - - _enter_critical_bh(&(pio_q->lock), &irqL); - - pintfpriv->io_irp_cnt--; - if(pintfpriv->io_irp_cnt ==0){ - _rtw_up_sema(&(pintfpriv->io_retevt)); - } - - pintfpriv->bio_irp_pending=_FALSE; - - switch(piowrite_irp->IoStatus.Status) - { - case STATUS_SUCCESS: - break; - - default: - padapter->bSurpriseRemoved=_TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usbAsynIntOutComplete:pioread_irp->IoStatus.Status !=STATUS_SUCCESS\n")); - break; - } - - //free irp in processing list... - while(rtw_is_list_empty(head) != _TRUE) - { - plist = get_next(head); - rtw_list_delete(plist); - pio_req = LIST_CONTAINOR(plist, struct io_req, list); - _rtw_up_sema(&pio_req->sema); - } - - _exit_critical_bh(&(pio_q->lock), &irqL); - - _func_exit_; - - return STATUS_MORE_PROCESSING_REQUIRED; - -} - -void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - u32 bwritezero; - _irqL irqL; - USBD_STATUS usbdstatus; - PIO_STACK_LOCATION nextStack; - HANDLE PipeHandle; - struct io_req *pio_req; - - _adapter *adapter = (_adapter *)pintfhdl->adapter; - struct intf_priv *pintfpriv = pintfhdl->pintfpriv; - struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; - PURB piorw_urb = pintfpriv->piorw_urb; - PIRP piorw_irp = pintfpriv->piorw_irp; - struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; - NTSTATUS NtStatus = STATUS_SUCCESS; - - _func_enter_; - - pio_req = alloc_ioreq(pio_queue); - - if ((pio_req == NULL)||(adapter->bSurpriseRemoved)){ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved )); - goto exit; - } - - _enter_critical_bh(&(pio_queue->lock), &irqL); - - rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing)); - - -#ifdef NDIS51_MINIPORT - IoReuseIrp(piorw_irp, STATUS_SUCCESS); -#else - piorw_irp->Cancel = _FALSE; -#endif - - if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); - _func_exit_; - return; - } - - //translate DMA FIFO addr to pipehandle - PipeHandle = ffaddr2pipehdl(pdev, addr); - - - pintfpriv->io_irp_cnt++; - pintfpriv->bio_irp_pending=_TRUE; - // Build our URB for USBD - UsbBuildInterruptOrBulkTransferRequest( - piorw_urb, - sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), - PipeHandle, - (PVOID)wmem, - NULL, - cnt, - 0, - NULL); - - // - // call the calss driver to perform the operation - // pass the URB to the USB driver stack - // - nextStack = IoGetNextIrpStackLocation(piorw_irp); - nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; - nextStack->Parameters.Others.Argument1 = (PURB)piorw_urb; - nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; - - IoSetCompletionRoutine( - piorw_irp, // irp to use - usb_write_mem_complete, // routine to call when irp is done - pio_queue, // context to pass routine - TRUE, // call on success - TRUE, // call on error - TRUE); // call on cancel - - // - // Call IoCallDriver to send the irp to the usb port - // - NtStatus = IoCallDriver(pdev->pnextdevobj, piorw_irp); - usbdstatus = URB_STATUS(piorw_urb); - - // - // The USB driver should always return STATUS_PENDING when - // it receives a write irp - // - if ((NtStatus != STATUS_PENDING) || USBD_HALTED(usbdstatus) ) { - - if( USBD_HALTED(usbdstatus) ) { - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_mem():USBD_HALTED(usbdstatus)=%X!\n",USBD_HALTED(usbdstatus)) ); - } - _func_exit_; - return;//STATUS_UNSUCCESSFUL; - } - - _exit_critical_bh(&(pio_queue->lock), &irqL); - - _rtw_down_sema(&pio_req->sema); - free_ioreq(pio_req, pio_queue); - - - bwritezero = _FALSE; - if (pdev->ishighspeed) - { - if(cnt> 0 && cnt%512 == 0) - bwritezero = _TRUE; - - } - else - { - if(cnt > 0 && cnt%64 == 0) - bwritezero = _TRUE; - } - - - if(bwritezero == _TRUE) - { - usb_bulkout_zero(pintfhdl, addr); - } - -exit: - - _func_exit_; - -} - -NTSTATUS usb_read_port_complete(PDEVICE_OBJECT pUsbDevObj, PIRP pIrp, PVOID context) -{ - uint isevt, *pbuf; - struct _URB_BULK_OR_INTERRUPT_TRANSFER *pbulkurb; - USBD_STATUS usbdstatus; - struct recv_buf *precvbuf = (struct recv_buf *)context; - _adapter *adapter =(_adapter *)precvbuf->adapter; - struct recv_priv *precvpriv = &adapter->recvpriv; - struct dvobj_priv *dev = (struct dvobj_priv *)&adapter->dvobjpriv; - PURB purb = precvbuf->purb; - struct intf_hdl *pintfhdl = &adapter->pio_queue->intf; - - //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); - - usbdstatus = URB_STATUS(purb); - - _rtw_spinlock_ex(&precvpriv->lock); - precvbuf->irp_pending=_FALSE; - precvpriv->rx_pending_cnt --; - _rtw_spinunlock_ex(&precvpriv->lock); - - if(precvpriv->rx_pending_cnt== 0) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n")); - _rtw_up_sema(&precvpriv->allrxreturnevt); - } - - - if( pIrp->Cancel == _TRUE ) { - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: One IRP has been cancelled succesfully\n")); - return STATUS_MORE_PROCESSING_REQUIRED; - } - if(adapter->bSurpriseRemoved) { - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); - return STATUS_MORE_PROCESSING_REQUIRED; - } - - switch(pIrp->IoStatus.Status) - { - case STATUS_SUCCESS: - - pbulkurb = &(precvbuf->purb)->UrbBulkOrInterruptTransfer; - if((pbulkurb->TransferBufferLength >(MAX_RECVBUF_SZ)) || (pbulkurb->TransferBufferLength < RXDESC_SIZE) ) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE)\n")); - rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - else - { - precvbuf->transfer_len = pbulkurb->TransferBufferLength; - - pbuf = (uint*)precvbuf->pbuf; - - if((isevt = *(pbuf+1)&0x1ff) == 0x1ff) - { - rxcmd_event_hdl(adapter, pbuf);//rx c2h events - - rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - else - { - if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets - { - //precvbuf->reuse = _TRUE; - rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - } - - } - - break; - - default: - - if( !USBD_HALTED(usbdstatus) ) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete():USBD_HALTED(usbdstatus)=%x (need to handle ) \n",USBD_HALTED(usbdstatus))); - - } - else - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus)) ); - adapter->bDriverStopped = _TRUE; - adapter->bSurpriseRemoved = _TRUE; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus))) ; - } - - break; - - } - - return STATUS_MORE_PROCESSING_REQUIRED; - -} - -u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) -{ - u8 *pdata; - u16 size; - PURB purb; - PIRP pirp; - PIO_STACK_LOCATION nextStack; - NTSTATUS ntstatus; - USBD_STATUS usbdstatus; - HANDLE PipeHandle; - struct recv_buf *precvbuf = (struct recv_buf *)rmem; - struct intf_priv *pintfpriv = pintfhdl->pintfpriv; - struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; - _adapter *adapter = (_adapter *)pdev->padapter; - struct recv_priv *precvpriv = &adapter->recvpriv; - u32 bResult = _FALSE; - -_func_enter_; - - if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - return bResult; - } - - if(precvbuf !=NULL) - { - - rtl8192cu_init_recvbuf(adapter, precvbuf); - - _rtw_spinlock(&precvpriv->lock); - precvpriv->rx_pending_cnt++; - precvbuf->irp_pending = _TRUE; - _rtw_spinunlock(&precvpriv->lock); - - pdata = (u8*)precvbuf->pbuf; - - size = sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ); - purb = precvbuf->purb; - - //translate DMA FIFO addr to pipehandle - PipeHandle = ffaddr2pipehdl(pdev, addr); - - UsbBuildInterruptOrBulkTransferRequest( - purb, - (USHORT)size, - PipeHandle, - pdata, - NULL, - MAX_RECVBUF_SZ, - USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK, - NULL - ); - - pirp = precvbuf->pirp; - -#if NDIS51_MINIPORT - IoReuseIrp(pirp, STATUS_SUCCESS); -#else - pirp->Cancel = _FALSE; -#endif - - // call the class driver to perform the operation - // and pass the URB to the USB driver stack - nextStack = IoGetNextIrpStackLocation(pirp); - nextStack->Parameters.Others.Argument1 = purb; - nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; - nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; - - IoSetCompletionRoutine( - pirp, // irp to use - usb_read_port_complete, // routine to call when irp is done - precvbuf, // context to pass routine - TRUE, // call on success - TRUE, // call on error - TRUE); // call on cancel - - // - // The IoCallDriver routine - // sends an IRP to the driver associated with a specified device object. - // - ntstatus = IoCallDriver(pdev->pnextdevobj, pirp); - usbdstatus = URB_STATUS(purb); - - if( USBD_HALTED(usbdstatus) ) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port(): USBD_HALTED(usbdstatus=0x%.8x)=%.8x \n\n", usbdstatus, USBD_HALTED(usbdstatus))); - pdev->padapter->bDriverStopped=_TRUE; - pdev->padapter->bSurpriseRemoved=_TRUE; - } - - if( ntstatus == STATUS_PENDING ) - { - bResult = _TRUE;// The IRP is pended in USBD as we expected. - } - else { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! IRP STATUS: %X\n", ntstatus)); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! USB STATUS: %X\n", usbdstatus)); - } - - } - else{ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n")); - } - -_func_exit_; - - return bResult; - -} - -void usb_read_port_cancel(_adapter *padapter) -{ - struct recv_buf *precvbuf; - sint i; - struct dvobj_priv *pdev = &padapter->dvobjpriv; - struct recv_priv *precvpriv=&padapter->recvpriv; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n ==>usb_read_port_cancel\n")); - - _rtw_spinlock(&precvpriv->lock); - precvpriv->rx_pending_cnt--; //decrease 1 for Initialize ++ - _rtw_spinunlock(&precvpriv->lock); - - if (precvpriv->rx_pending_cnt) - { - // Canceling Pending Recv Irp - precvbuf = (struct recv_buf *)precvpriv->precv_buf; - - for( i = 0; i < NR_RECVBUFF; i++ ) - { - if (precvbuf->irp_pending == _TRUE) - { - IoCancelIrp(precvbuf->pirp); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel() :IoCancelIrp\n")); - } - - precvbuf++; - } - - _rtw_down_sema(&precvpriv->allrxreturnevt); - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel:down sema\n")); - - } - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("<==usb_read_port_cancel\n")); - -} - -NTSTATUS usb_write_port_complete( - PDEVICE_OBJECT pUsbDevObj, - PIRP pIrp, - PVOID pTxContext -) -{ - u32 i, bIrpSuccess, sz; - NTSTATUS status = STATUS_SUCCESS; - u8 *ptr; - struct xmit_frame *pxmitframe = (struct xmit_frame *) pTxContext; - struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; - _adapter *padapter = pxmitframe->padapter; - struct dvobj_priv *pdev = (struct dvobj_priv *)&padapter->dvobjpriv; - struct io_queue *pio_queue = (struct io_queue *)padapter->pio_queue; - struct intf_hdl *pintfhdl = &(pio_queue->intf); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - -_func_enter_; - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port_complete\n")); - - _rtw_spinlock_ex(&pxmitpriv->lock); - pxmitpriv->txirp_cnt--; - _rtw_spinunlock_ex(&pxmitpriv->lock); - - if(pxmitpriv->txirp_cnt==0){ - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); - _rtw_up_sema(&(pxmitpriv->tx_retevt)); - } - - status = pIrp->IoStatus.Status; - - if( status == STATUS_SUCCESS ) - bIrpSuccess = _TRUE; - else - bIrpSuccess = _FALSE; - - if( pIrp->Cancel == _TRUE ) - { - if(pxmitframe !=NULL) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pIrp->Cancel == _TRUE,(pxmitframe !=NULL\n")); - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - } - - return STATUS_MORE_PROCESSING_REQUIRED; - } - - if(padapter->bSurpriseRemoved) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); - return STATUS_MORE_PROCESSING_REQUIRED; - } - - - // - // Send 0-byte here if necessary. - // - // - // 1. We MUST keep at most one IRP pending in each endpoint, otherwise USB host controler driver will hang. - // Besides, even 0-byte IRP shall be count into #IRP sent down, so, we send 0-byte here instead of TxFillDescriptor8187(). - // 2. If we don't count 0-byte IRP into an #IRP sent down, Tx will stuck when we download files via BT and - // play online video on XP SP1 EHCU. - // 2005.12.26, by rcnjko. - // - - - for(i=0; i< 8; i++) - { - if(pIrp == pxmitframe->pxmit_irp[i]) - { - pxmitframe->bpending[i] = _FALSE;// - //ac_tag = pxmitframe->ac_tag[i]; - sz = pxmitframe->sz[i]; - break; - } - } - -#if 0 - pxmitframe->fragcnt--; - if(pxmitframe->fragcnt == 0)// if((pxmitframe->fragcnt == 0) && (pxmitframe->irpcnt == 8)){ - { - //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pxmitframe->fragcnt == 0\n")); - rtw_free_xmitframe(pxmitpriv,pxmitframe); - } -#else - - //not to consider tx fragment - rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); - -#endif - - rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf); - -_func_exit_; - - return STATUS_MORE_PROCESSING_REQUIRED; - -} - -u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) -{ - u32 i, bwritezero; - u8 *ptr; - PIO_STACK_LOCATION nextStack; - USBD_STATUS usbdstatus; - HANDLE PipeHandle; - PIRP pirp = NULL; - PURB purb = NULL; - NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; - _adapter *padapter = (_adapter *)pintfhdl->adapter; - struct dvobj_priv *pNdisCEDvice = (struct dvobj_priv *)&padapter->dvobjpriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct xmit_frame *pxmitframe = (struct xmit_frame *)wmem; - -_func_enter_; - - if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); - return _FAIL; - } - - - for(i=0; i<8; i++) - { - if(pxmitframe->bpending[i] == _FALSE) - { - _rtw_spinlock(&pxmitpriv->lock); - pxmitpriv->txirp_cnt++; - pxmitframe->bpending[i] = _TRUE; - _rtw_spinunlock(&pxmitpriv->lock); - - pxmitframe->sz[i] = cnt; - purb = pxmitframe->pxmit_urb[i]; - pirp = pxmitframe->pxmit_irp[i]; - - //pxmitframe->ac_tag[i] = ac_tag; - - break; - } - } - - bwritezero = _FALSE; - if (pNdisCEDvice->ishighspeed) - { - if(cnt> 0 && cnt%512 == 0) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt)); - //cnt=cnt+1; - bwritezero = _TRUE; - } - } - else - { - if(cnt > 0 && cnt%64 == 0) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cnt=%d\n", cnt)); - //cnt=cnt+1; - bwritezero = _TRUE; - } - } - - -#ifdef NDIS51_MINIPORT - IoReuseIrp(pirp, STATUS_SUCCESS); -#else - pirp->Cancel = _FALSE; -#endif - - - //translate DMA FIFO addr to pipehandle - PipeHandle = ffaddr2pipehdl(pNdisCEDvice, addr); - - - // Build our URB for USBD - UsbBuildInterruptOrBulkTransferRequest( - purb, - sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), - PipeHandle, - pxmitframe->mem_addr, - NULL, - cnt, - 0, - NULL); - - // - // call the calss driver to perform the operation - // pass the URB to the USB driver stack - // - nextStack = IoGetNextIrpStackLocation(pirp); - nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; - nextStack->Parameters.Others.Argument1 = purb; - nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; - - //Set Completion Routine - IoSetCompletionRoutine(pirp, // irp to use - usb_write_port_complete, // callback routine - pxmitframe, // context - TRUE, // call on success - TRUE, // call on error - TRUE); // call on cancel - - - // Call IoCallDriver to send the irp to the usb bus driver - // - ndisStatus = IoCallDriver(pNdisCEDvice->pnextdevobj, pirp); - usbdstatus = URB_STATUS(purb); - - if( USBD_HALTED(usbdstatus) ) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): USBD_HALTED(usbdstatus)=%x set bDriverStopped TRUE!\n\n",USBD_HALTED(usbdstatus)) ); - padapter->bDriverStopped=_TRUE; - padapter->bSurpriseRemoved=_TRUE; - } - - // - // The usb bus driver should always return STATUS_PENDING when bulk out irp async - // - if ( ndisStatus != STATUS_PENDING ) - { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): ndisStatus(%x) != STATUS_PENDING!\n\n", ndisStatus)); - - _func_exit_; - - return _FAIL; - } - - if(bwritezero == _TRUE) - { - usb_bulkout_zero(pintfhdl, addr); - } - - -_func_exit_; - - return _SUCCESS; - -} - - -void usb_write_port_cancel(_adapter *padapter) -{ - - sint i,j; - struct dvobj_priv *pdev = &padapter->dvobjpriv; - struct xmit_priv *pxmitpriv=&padapter->xmitpriv; - struct xmit_frame *pxmitframe; - - _rtw_spinlock(&pxmitpriv->lock); - pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++ - _rtw_spinunlock(&pxmitpriv->lock); - - if (pxmitpriv->txirp_cnt) - { - // Canceling Pending Recv Irp - pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; - - for( i = 0; i < NR_XMITFRAME; i++ ) - { - for(j=0;j<8;j++) - { - if (pxmitframe->bpending[j]==_TRUE) - { - IoCancelIrp(pxmitframe->pxmit_irp[j]); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n")); - - } - } - - pxmitframe++; - } - - _rtw_down_sema(&(pxmitpriv->tx_retevt)); - - } - -} - - -/*! \brief Wrap the pUrb to an IRP and send this IRP to Bus Driver. Then wait for this IRP completion. - The Caller shall be at Passive Level. -*/ -NTSTATUS sync_callusbd(struct dvobj_priv *pdvobjpriv, PURB purb) -{ - - KEVENT kevent; - PIRP irp; - IO_STATUS_BLOCK iostatusblock; - PIO_STACK_LOCATION nextstack; - USBD_STATUS usbdstatus; - LARGE_INTEGER waittime; - NTSTATUS ntstatus = STATUS_SUCCESS; - _adapter *padapter = pdvobjpriv->padapter; - - - _func_enter_; - -// if(padapter->bDriverStopped) { -// goto exit; -// } - - KeInitializeEvent(&kevent, NotificationEvent, _FALSE); - irp = IoBuildDeviceIoControlRequest( - IOCTL_INTERNAL_USB_SUBMIT_URB, - pdvobjpriv->pphysdevobj,//CEdevice->pUsbDevObj, - NULL, - 0, - NULL, - 0, - _TRUE, - &kevent, - &iostatusblock); - - if(irp == NULL) { - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: memory alloc for irp failed\n")); - ntstatus=STATUS_INSUFFICIENT_RESOURCES; - goto exit; - } - - nextstack = IoGetNextIrpStackLocation(irp); - if(nextstack == NULL) - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("IoGetNextIrpStackLocation fail\n")); - - nextstack->Parameters.Others.Argument1 = purb; - - // Issue an IRP for Sync IO. - ntstatus = IoCallDriver(pdvobjpriv->pphysdevobj, irp); - usbdstatus = URB_STATUS(purb); - - if(ntstatus == STATUS_PENDING) - { - // Method 1 - waittime.QuadPart = -10000 * 50000; - ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, &waittime); //8150 code - - // Method 2 - //ntStatus = KeWaitForSingleObject(&Kevent, Executive, KernelMode, FALSE, NULL); //DDK sample - - usbdstatus = URB_STATUS(purb); - - if(ntstatus == STATUS_TIMEOUT) - { - //usbdevice->nIoStuckCnt++; - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: TIMEOUT....5000ms\n")); - - // Method 2 - IoCancelIrp(irp); - ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, NULL); //DDK sample - usbdstatus = URB_STATUS(purb); - - usbdstatus = USBD_STATUS_SUCCESS; - } - - } - -exit: - - _func_exit_; - - return ntstatus; - -} -int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) -{ - PURB purb; - u8 ret; - unsigned long transferflags; - NTSTATUS ntstatus; - - struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev; - - _func_enter_; - - ret=_TRUE; - purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST) ); - if(purb == NULL) { - - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq(): Failed to allocate urb !!!\n")); - ret =_FALSE; - goto exit; - } - - if (requesttype == 0x01) { - transferflags = USBD_TRANSFER_DIRECTION_IN;//read_in - } else { - transferflags= 0;//write_out - } - - UsbBuildVendorRequest( - purb, //Pointer to an URB that is to be formatted as a vendor or class request. - URB_FUNCTION_VENDOR_DEVICE, //Indicates the URB is a vendor-defined request for a USB device. - sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), //Specifies the length, in bytes, of the URB. - transferflags, //TransferFlags - 0, //ReservedBits - request, //Request - value, //Value - index, //Index - pdata, //TransferBuffer - NULL, //TransferBufferMDL - len, //TransferBufferLength - NULL //Link - ); - - ntstatus = sync_callusbd(pdvobjpriv, purb); - if(!NT_SUCCESS(ntstatus)) - { - ExFreePool(purb); - RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usbctrl_vendorreq() : SOMETHING WRONG\n") ); - ret = _FALSE; - goto exit; - } - - ExFreePool(purb); - -exit: - _func_exit_; - - return ret; - -} - diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h deleted file mode 100755 index c3e7f9e8a885..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8192CE_FW_IMG_H -#define __INC_HAL8192CE_FW_IMG_H - -#include - -/*Created on 2011/ 6/15, 5:45*/ - -#define TSMCImgArrayLength 14964 //v75 2011-06-15 -extern u8 Rtl8192CEFwTSMCImgArray[TSMCImgArrayLength]; -#define UMCACutImgArrayLength 14964 //v75 2011-06-15 -extern u8 Rtl8192CEFwUMCACutImgArray[UMCACutImgArrayLength]; -#define UMCBCutImgArrayLength 14946 //v75 2011-06-15 -extern u8 Rtl8192CEFwUMCBCutImgArray[UMCBCutImgArrayLength]; -#define PHY_REG_2TArrayLength 374 -extern u32 Rtl8192CEPHY_REG_2TArray[PHY_REG_2TArrayLength]; -#define PHY_REG_1TArrayLength 374 -extern u32 Rtl8192CEPHY_REG_1TArray[PHY_REG_1TArrayLength]; -#define PHY_ChangeTo_1T1RArrayLength 1 -extern u32 Rtl8192CEPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength]; -#define PHY_ChangeTo_1T2RArrayLength 1 -extern u32 Rtl8192CEPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength]; -#define PHY_ChangeTo_2T2RArrayLength 1 -extern u32 Rtl8192CEPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength]; -#define PHY_REG_Array_PGLength 336 -extern u32 Rtl8192CEPHY_REG_Array_PG[PHY_REG_Array_PGLength]; -#define PHY_REG_Array_MPLength 4 -extern u32 Rtl8192CEPHY_REG_Array_MP[PHY_REG_Array_MPLength]; -#define RadioA_2TArrayLength 282 -extern u32 Rtl8192CERadioA_2TArray[RadioA_2TArrayLength]; -#define RadioB_2TArrayLength 78 -extern u32 Rtl8192CERadioB_2TArray[RadioB_2TArrayLength]; -#define RadioA_1TArrayLength 282 -extern u32 Rtl8192CERadioA_1TArray[RadioA_1TArrayLength]; -#define RadioB_1TArrayLength 1 -extern u32 Rtl8192CERadioB_1TArray[RadioB_1TArrayLength]; -#define RadioB_GM_ArrayLength 1 -extern u32 Rtl8192CERadioB_GM_Array[RadioB_GM_ArrayLength]; -#define MAC_2T_ArrayLength 172 -extern u32 Rtl8192CEMAC_2T_Array[MAC_2T_ArrayLength]; -#define MACPHY_Array_PGLength 1 -extern u32 Rtl8192CEMACPHY_Array_PG[MACPHY_Array_PGLength]; -#define AGCTAB_2TArrayLength 320 -extern u32 Rtl8192CEAGCTAB_2TArray[AGCTAB_2TArrayLength]; -#define AGCTAB_1TArrayLength 320 -extern u32 Rtl8192CEAGCTAB_1TArray[AGCTAB_1TArrayLength]; - -#endif //__INC_HAL8192CE_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h deleted file mode 100755 index 2e76d2ab4367..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h +++ /dev/null @@ -1,451 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/***************************************************************************** - * Module: __INC_HAL8192CPHYCFG_H - * - * - * Note: - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * - *****************************************************************************/ - /* Check to see if the file has been included already. */ -#ifndef __INC_HAL8192CPHYCFG_H -#define __INC_HAL8192CPHYCFG_H - - -/*--------------------------Define Parameters-------------------------------*/ -#define LOOP_LIMIT 5 -#define MAX_STALL_TIME 50 //us -#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) -#define MAX_TXPWR_IDX_NMODE_92S 63 -#define Reset_Cnt_Limit 3 - -#define IQK_MAC_REG_NUM 4 -#define IQK_ADDA_REG_NUM 16 -#define IQK_BB_REG_NUM 9 -#define HP_THERMAL_NUM 8 - -#ifdef CONFIG_PCI_HCI -#define MAX_AGGR_NUM 0x0A0A -#else -#define MAX_AGGR_NUM 0x0909 -#endif - -#ifdef CONFIG_PCI_HCI -#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \ -{ \ - u1Byte u1bTmp; \ - u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \ - u1bTmp |= BIT0; \ - PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \ - PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \ - PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ - delay_us(100); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ - PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \ - delay_us(10); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \ - delay_us(10); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ - delay_us(10); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ -} -#endif - - -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ -typedef enum _SwChnlCmdID{ - CmdID_End, - CmdID_SetTxPowerLevel, - CmdID_BBRegWrite10, - CmdID_WritePortUlong, - CmdID_WritePortUshort, - CmdID_WritePortUchar, - CmdID_RF_WriteReg, -}SwChnlCmdID; - - -/* 1. Switch channel related */ -typedef struct _SwChnlCmd{ - SwChnlCmdID CmdID; - u32 Para1; - u32 Para2; - u32 msDelay; -}SwChnlCmd; - -typedef enum _HW90_BLOCK{ - HW90_BLOCK_MAC = 0, - HW90_BLOCK_PHY0 = 1, - HW90_BLOCK_PHY1 = 2, - HW90_BLOCK_RF = 3, - HW90_BLOCK_MAXIMUM = 4, // Never use this -}HW90_BLOCK_E, *PHW90_BLOCK_E; - -typedef enum _RF90_RADIO_PATH{ - RF90_PATH_A = 0, //Radio Path A - RF90_PATH_B = 1, //Radio Path B - RF90_PATH_C = 2, //Radio Path C - RF90_PATH_D = 3, //Radio Path D - //RF90_PATH_MAX //Max RF number 90 support -}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E; - -#define RF90_PATH_MAX 2 - -#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number -#define CHANNEL_GROUP_MAX 3 // ch1~3, ch4~9, ch10~14 total three groups - -typedef enum _WIRELESS_MODE { - WIRELESS_MODE_UNKNOWN = 0x00, - WIRELESS_MODE_A = 0x01, - WIRELESS_MODE_B = 0x02, - WIRELESS_MODE_G = 0x04, - WIRELESS_MODE_AUTO = 0x08, - WIRELESS_MODE_N_24G = 0x10, - WIRELESS_MODE_N_5G = 0x20 -} WIRELESS_MODE; - -typedef enum _BaseBand_Config_Type{ - BaseBand_Config_PHY_REG = 0, //Radio Path A - BaseBand_Config_AGC_TAB = 1, //Radio Path B -}BaseBand_Config_Type, *PBaseBand_Config_Type; - - -typedef enum _PHY_Rate_Tx_Power_Offset_Area{ - RA_OFFSET_LEGACY_OFDM1, - RA_OFFSET_LEGACY_OFDM2, - RA_OFFSET_HT_OFDM1, - RA_OFFSET_HT_OFDM2, - RA_OFFSET_HT_OFDM3, - RA_OFFSET_HT_OFDM4, - RA_OFFSET_HT_CCK, -}RA_OFFSET_AREA,*PRA_OFFSET_AREA; - - -/* BB/RF related */ -typedef enum _RF_TYPE_8190P{ - RF_TYPE_MIN, // 0 - RF_8225=1, // 1 11b/g RF for verification only - RF_8256=2, // 2 11b/g/n - RF_8258=3, // 3 11a/b/g/n RF - RF_6052=4, // 4 11b/g/n RF - //RF_6052=5, // 4 11b/g/n RF - // TODO: We sholud remove this psudo PHY RF after we get new RF. - RF_PSEUDO_11N=5, // 5, It is a temporality RF. -}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; - - -typedef enum _RATR_TABLE_MODE_8192C{ - RATR_INX_WIRELESS_NGB = 0, - RATR_INX_WIRELESS_NG = 1, - RATR_INX_WIRELESS_NB = 2, - RATR_INX_WIRELESS_N = 3, - RATR_INX_WIRELESS_GB = 4, - RATR_INX_WIRELESS_G = 5, - RATR_INX_WIRELESS_B = 6, - RATR_INX_WIRELESS_MC = 7, - RATR_INX_WIRELESS_A = 8, -}RATR_TABLE_MODE_8192C, *PRATR_TABLE_MODE_8192C; - -typedef struct _BB_REGISTER_DEFINITION{ - u32 rfintfs; // set software control: - // 0x870~0x877[8 bytes] - - u32 rfintfi; // readback data: - // 0x8e0~0x8e7[8 bytes] - - u32 rfintfo; // output data: - // 0x860~0x86f [16 bytes] - - u32 rfintfe; // output enable: - // 0x860~0x86f [16 bytes] - - u32 rf3wireOffset; // LSSI data: - // 0x840~0x84f [16 bytes] - - u32 rfLSSI_Select; // BB Band Select: - // 0x878~0x87f [8 bytes] - - u32 rfTxGainStage; // Tx gain stage: - // 0x80c~0x80f [4 bytes] - - u32 rfHSSIPara1; // wire parameter control1 : - // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] - - u32 rfHSSIPara2; // wire parameter control2 : - // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] - - u32 rfSwitchControl; //Tx Rx antenna control : - // 0x858~0x85f [16 bytes] - - u32 rfAGCControl1; //AGC parameter control1 : - // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] - - u32 rfAGCControl2; //AGC parameter control2 : - // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] - - u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : - // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] - - u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : - // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] - - u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix - // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] - - u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type - // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] - - u32 rfLSSIReadBack; //LSSI RF readback data SI mode - // 0x8a0~0x8af [16 bytes] - - u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B - -}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; - -#ifdef CONFIG_MP_INCLUDED -typedef enum _ANTENNA_PATH{ - ANTENNA_NONE = 0x00, - ANTENNA_D , - ANTENNA_C , - ANTENNA_CD , - ANTENNA_B , - ANTENNA_BD , - ANTENNA_BC , - ANTENNA_BCD , - ANTENNA_A , - ANTENNA_AD , - ANTENNA_AC , - ANTENNA_ACD , - ANTENNA_AB , - ANTENNA_ABD , - ANTENNA_ABC , - ANTENNA_ABCD -} ANTENNA_PATH; -#endif - -typedef struct _R_ANTENNA_SELECT_OFDM{ - u32 r_tx_antenna:4; - u32 r_ant_l:4; - u32 r_ant_non_ht:4; - u32 r_ant_ht1:4; - u32 r_ant_ht2:4; - u32 r_ant_ht_s1:4; - u32 r_ant_non_ht_s1:4; - u32 OFDM_TXSC:2; - u32 Reserved:2; -}R_ANTENNA_SELECT_OFDM; - -typedef struct _R_ANTENNA_SELECT_CCK{ - u8 r_cckrx_enable_2:2; - u8 r_cckrx_enable:2; - u8 r_ccktx_enable:4; -}R_ANTENNA_SELECT_CCK; - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ -// -// BB and RF register read/write -// -u32 rtl8192c_PHY_QueryBBReg( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask ); -void rtl8192c_PHY_SetBBReg( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); -u32 rtl8192c_PHY_QueryRFReg( IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask ); -void rtl8192c_PHY_SetRFReg( IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -int PHY_MACConfig8192C( IN PADAPTER Adapter ); -int PHY_BBConfig8192C( IN PADAPTER Adapter ); -int PHY_RFConfig8192C( IN PADAPTER Adapter ); -/* RF config */ -int rtl8192c_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter, - IN u8* pFileName, - IN RF90_RADIO_PATH_E eRFPath); -int rtl8192c_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath); - -/* BB/RF readback check for making sure init OK */ -int rtl8192c_PHY_CheckBBAndRFOK( IN PADAPTER Adapter, - IN HW90_BLOCK_E CheckBlock, - IN RF90_RADIO_PATH_E eRFPath ); -/* Read initi reg value for tx power setting. */ -void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); - -// -// RF Power setting -// -//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, -// IN RT_RF_POWER_STATE eRFPowerState); - -// -// BB TX Power R/W -// -void PHY_GetTxPowerLevel8192C( IN PADAPTER Adapter, - OUT u32* powerlevel ); -void PHY_SetTxPowerLevel8192C( IN PADAPTER Adapter, - IN u8 channel ); -BOOLEAN PHY_UpdateTxPowerDbm8192C( IN PADAPTER Adapter, - IN int powerInDbm ); - -// -VOID -PHY_ScanOperationBackup8192C(IN PADAPTER Adapter, - IN u8 Operation ); - -// -// Switch bandwidth for 8192S -// -//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SetBWMode8192C( IN PADAPTER pAdapter, - IN HT_CHANNEL_WIDTH ChnlWidth, - IN unsigned char Offset ); - -// -// Set FW CMD IO for 8192S. -// -//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, -// IN IO_TYPE IOType); - -// -// Set A2 entry to fw for 8192S -// -extern void FillA2Entry8192C( IN PADAPTER Adapter, - IN u8 index, - IN u8* val); - - -// -// channel switch related funciton -// -//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SwChnl8192C( IN PADAPTER pAdapter, - IN u8 channel ); - // Call after initialization -void PHY_SwChnlPhy8192C( IN PADAPTER pAdapter, - IN u8 channel ); - -void ChkFwCmdIoDone( IN PADAPTER Adapter); - -#ifdef USE_WORKITEM -//extern void SetIOWorkItemCallback( IN PVOID pContext ); -#else -//extern void SetIOTimerCallback( IN PRT_TIMER pTimer); -#endif - -// -// BB/MAC/RF other monitor API -// -void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter, - IN BOOLEAN bEnableMonitorMode ); - -BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter, - IN u32 eRFPath ); - -// -// IQ calibrate -// -VOID rtl8192c_PHY_IQCalibrate( IN PADAPTER pAdapter , IN BOOLEAN bReCovery); - -// -// LC calibrate -// -VOID rtl8192c_PHY_LCCalibrate(IN PADAPTER pAdapter); - -// -// AP calibrate -// -VOID rtl8192c_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta); - -VOID rtl8192c_PHY_DigitalPredistortion(IN PADAPTER pAdapter); - -VOID rtl8192c_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain); - -// -// Modify the value of the hw register when beacon interval be changed. -// -void -rtl8192c_PHY_SetBeaconHwReg( IN PADAPTER Adapter, - IN u16 BeaconInterval ); - - -extern VOID -PHY_SwitchEphyParameter( - IN PADAPTER Adapter - ); - -extern VOID -PHY_EnableHostClkReq( - IN PADAPTER Adapter - ); - -BOOLEAN -SetAntennaConfig92C( - IN PADAPTER Adapter, - IN u8 DefaultAnt - ); - - -/*--------------------------Exported Function prototype---------------------*/ - -#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192c_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) -#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192c_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) -#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192c_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) -#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192c_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) - -#define PHY_SetMacReg PHY_SetBBReg - -#endif // __INC_HAL8192CPHYCFG_H - diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h deleted file mode 100755 index 295f587efc08..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h +++ /dev/null @@ -1,1052 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/***************************************************************************** - * - * Module: __INC_HAL8192CPHYREG_H - * - * - * Note: 1. Define PMAC/BB register map - * 2. Define RF register map - * 3. PMAC/BB register bit mask. - * 4. RF reg bit mask. - * 5. Other BB/RF relative definition. - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * 09/25/2008 MH 1. Add RL6052 register definition - * - *****************************************************************************/ -#ifndef __INC_HAL8192CPHYREG_H -#define __INC_HAL8192CPHYREG_H - - -/*--------------------------Define Parameters-------------------------------*/ - -//============================================================ -// 8192S Regsiter offset definition -//============================================================ - -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 2. Page2(0x200) -// -// The following two definition are only used for USB interface. -#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. -#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c - -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 // Useless now -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback -#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxIQExtAnta 0xca0 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -#define rZebra1_Channel 0x7 // RF channel switch - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_POW_ABILITY 0x17 // -#define RF_MODE_AG 0x18 // -#define rRfChannel 0x18 // RF channel and BW switch -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -#define RF_T_METER 0x24 // - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control - -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bAntennaSelect 0x0300 - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 - -#define bLSSIReadAddress 0x7f800000 // T65 RF - -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal - -#define bLSSIReadBackData 0xfffff // T65 RF - -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - -//for PutRFRegsetting & GetRFRegSetting BitMask -//#define bMask12Bits 0xfffff // RF Reg mask bits -//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF -#define bRFRegOffsetMask 0xfffff - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#define PathA 0x0 // Useless -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif //__INC_HAL8192SPHYREG_H - diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h deleted file mode 100755 index 97b1c2fa429d..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h +++ /dev/null @@ -1,92 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8192CU_FW_IMG_H -#define __INC_HAL8192CU_FW_IMG_H - -/*Created on 2011/ 6/15, 5:45*/ - -#ifdef CONFIG_BT_COEXISTENCE -#define TSMCImgArrayLength 14964 //Normal v75 2011-06-15 -#else -#define TSMCImgArrayLength 15290 //P2P_PS v75 2011-06-15 -#endif - -extern u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength]; - -#define UMCACutImgArrayLength 14964 //v75 2011-06-15 -extern u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength]; - -#define UMCBCutImgArrayLength 14946 //v75 2011-06-15 -extern u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] ; - -#define UMC8723ImgArrayLength 16288 -extern u8 Rtl8192CUFwUMC8723ImgArray[UMC8723ImgArrayLength]; -#define PHY_REG_2TArrayLength 374 -extern u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength]; -#define PHY_REG_1TArrayLength 374 -extern u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength]; -#define PHY_ChangeTo_1T1RArrayLength 1 -extern u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength]; -#define PHY_ChangeTo_1T2RArrayLength 1 -extern u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength]; -#define PHY_ChangeTo_2T2RArrayLength 1 -extern u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength]; -#define PHY_REG_Array_PGLength 336 -extern u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength]; -#define PHY_REG_Array_PG_mCardLength 336 -extern u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength]; -#define PHY_REG_Array_MPLength 4 -extern u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength]; -#define PHY_REG_1T_HPArrayLength 378 -extern u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength]; -#define PHY_REG_1T_mCardArrayLength 374 -extern u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength]; -#define PHY_REG_2T_mCardArrayLength 374 -extern u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength]; -#define PHY_REG_Array_PG_HPLength 336 -extern u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength]; -#define RadioA_2TArrayLength 282 -extern u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength]; -#define RadioB_2TArrayLength 78 -extern u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength]; -#define RadioA_1TArrayLength 282 -extern u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength]; -#define RadioB_1TArrayLength 1 -extern u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength]; -#define RadioA_1T_mCardArrayLength 282 -extern u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength]; -#define RadioB_1T_mCardArrayLength 1 -extern u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength]; -#define RadioA_1T_HPArrayLength 282 -extern u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength]; -#define RadioB_GM_ArrayLength 1 -extern u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength]; -#define MAC_2T_ArrayLength 172 -extern u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength]; -#define MACPHY_Array_PGLength 1 -extern u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength]; -#define AGCTAB_2TArrayLength 320 -extern u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength]; -#define AGCTAB_1TArrayLength 320 -extern u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength]; -#define AGCTAB_1T_HPArrayLength 320 -extern u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength]; - -#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h deleted file mode 100755 index e376143a326f..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8192DU_FW_IMG_H -#define __INC_HAL8192DU_FW_IMG_H - -#include - -/*Created on 2011/ 6/22, 2:27*/ - -#define ImgArrayLength 29642 -extern u8 Rtl8192DEFwImgArray[ImgArrayLength]; -#define MainArrayLength 1 -extern u8 Rtl8192DEFwMainArray[MainArrayLength]; -#define DataArrayLength 1 -extern u8 Rtl8192DEFwDataArray[DataArrayLength]; -#define PHY_REG_2TArrayLength 380 -extern u32 Rtl8192DEPHY_REG_2TArray[PHY_REG_2TArrayLength]; -#define PHY_REG_1TArrayLength 1 -extern u32 Rtl8192DEPHY_REG_1TArray[PHY_REG_1TArrayLength]; -#define PHY_REG_Array_PGLength 624 -extern u32 Rtl8192DEPHY_REG_Array_PG[PHY_REG_Array_PGLength]; -#define PHY_REG_Array_MPLength 10 -extern u32 Rtl8192DEPHY_REG_Array_MP[PHY_REG_Array_MPLength]; -#define RadioA_2TArrayLength 378 -extern u32 Rtl8192DERadioA_2TArray[RadioA_2TArrayLength]; -#define RadioB_2TArrayLength 384 -extern u32 Rtl8192DERadioB_2TArray[RadioB_2TArrayLength]; -#define RadioA_1TArrayLength 1 -extern u32 Rtl8192DERadioA_1TArray[RadioA_1TArrayLength]; -#define RadioB_1TArrayLength 1 -extern u32 Rtl8192DERadioB_1TArray[RadioB_1TArrayLength]; -#define RadioA_2T_intPAArrayLength 378 -extern u32 Rtl8192DERadioA_2T_intPAArray[RadioA_2T_intPAArrayLength]; -#define RadioB_2T_intPAArrayLength 384 -extern u32 Rtl8192DERadioB_2T_intPAArray[RadioB_2T_intPAArrayLength]; -#define MAC_2TArrayLength 160 -extern u32 Rtl8192DEMAC_2TArray[MAC_2TArrayLength]; -#define AGCTAB_ArrayLength 386 -extern u32 Rtl8192DEAGCTAB_Array[AGCTAB_ArrayLength]; -#define AGCTAB_5GArrayLength 194 -extern u32 Rtl8192DEAGCTAB_5GArray[AGCTAB_5GArrayLength]; -#define AGCTAB_2GArrayLength 194 -extern u32 Rtl8192DEAGCTAB_2GArray[AGCTAB_2GArrayLength]; -#define AGCTAB_2TArrayLength 1 -extern u32 Rtl8192DEAGCTAB_2TArray[AGCTAB_2TArrayLength]; -#define AGCTAB_1TArrayLength 1 -extern u32 Rtl8192DEAGCTAB_1TArray[AGCTAB_1TArrayLength]; - -#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h deleted file mode 100755 index 0cb96e51d648..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8192DETEST_FW_IMG_H -#define __INC_HAL8192DETEST_FW_IMG_H - -#include - -/*Created on 2010/ 5/27, 8: 6*/ - -#define Rtl8192DTestImgArrayLength 15054 -extern u8 Rtl8192DTestFwImgArray[Rtl8192DTestImgArrayLength]; -#define Rtl8192DTestMainArrayLength 1 -extern u8 Rtl8192DTestFwMainArray[Rtl8192DTestMainArrayLength]; -#define Rtl8192DTestDataArrayLength 1 -extern u8 Rtl8192DTestFwDataArray[Rtl8192DTestDataArrayLength]; -#define Rtl8192DTestPHY_REG_2TArrayLength 376 -extern u32 Rtl8192DTestPHY_REG_2TArray[Rtl8192DTestPHY_REG_2TArrayLength]; -#define Rtl8192DTestPHY_REG_1TArrayLength 1 -extern u32 Rtl8192DTestPHY_REG_1TArray[Rtl8192DTestPHY_REG_1TArrayLength]; -#define Rtl8192DTestPHY_REG_Array_PGLength 1 -extern u32 Rtl8192DTestPHY_REG_Array_PG[Rtl8192DTestPHY_REG_Array_PGLength]; -#define Rtl8192DTestRadioA_2TArrayLength 340 -extern u32 Rtl8192DTestRadioA_2TArray[Rtl8192DTestRadioA_2TArrayLength]; -#define Rtl8192DTestRadioB_2TArrayLength 340 -extern u32 Rtl8192DTestRadioB_2TArray[Rtl8192DTestRadioB_2TArrayLength]; -#define Rtl8192DTestRadioA_1TArrayLength 1 -extern u32 Rtl8192DTestRadioA_1TArray[Rtl8192DTestRadioA_1TArrayLength]; -#define Rtl8192DTestRadioB_1TArrayLength 1 -extern u32 Rtl8192DTestRadioB_1TArray[Rtl8192DTestRadioB_1TArrayLength]; -#define Rtl8192DTestMAC_2TArrayLength 174 -extern u32 Rtl8192DTestMAC_2TArray[Rtl8192DTestMAC_2TArrayLength]; -#define Rtl8192DTestAGCTAB_5GArrayLength 514 -extern u32 Rtl8192DTestAGCTAB_5GArray[Rtl8192DTestAGCTAB_5GArrayLength]; -#define Rtl8192DTestAGCTAB_2GArrayLength 514 -extern u32 Rtl8192DTestAGCTAB_2GArray[Rtl8192DTestAGCTAB_2GArrayLength]; - -#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h deleted file mode 100755 index 736189ed1bdf..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h +++ /dev/null @@ -1,545 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/***************************************************************************** - * - * Module: __INC_HAL8192DPHYCFG_H - * - * - * Note: - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * - *****************************************************************************/ - /* Check to see if the file has been included already. */ -#ifndef __INC_HAL8192DPHYCFG_H -#define __INC_HAL8192DPHYCFG_H - - -/*--------------------------Define Parameters-------------------------------*/ -#define LOOP_LIMIT 5 -#define MAX_STALL_TIME 50 //us -#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) -#define MAX_TXPWR_IDX_NMODE_92S 63 -#define Reset_Cnt_Limit 3 - - -#define IQK_MAC_REG_NUM 4 -#define IQK_ADDA_REG_NUM 16 -#define IQK_BB_REG_NUM 10 -#define IQK_BB_REG_NUM_test 6 -#define index_mapping_NUM 13 -#define Rx_index_mapping_NUM 15 -#define AVG_THERMAL_NUM 8 -#define IQK_Matrix_REG_NUM 8 -#define IQK_Matrix_Settings_NUM 1+24+21 - -#ifdef CONFIG_PCI_HCI -#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \ -{ \ - u1Byte u1bTmp; \ - u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \ - u1bTmp |= BIT0; \ - PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \ - PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \ - PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ - delay_us(100); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ - PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \ - delay_us(10); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \ - delay_us(10); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ - delay_us(10); \ - PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ -} -#endif - - -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ -typedef enum _SwChnlCmdID{ - CmdID_End, - CmdID_SetTxPowerLevel, - CmdID_BBRegWrite10, - CmdID_WritePortUlong, - CmdID_WritePortUshort, - CmdID_WritePortUchar, - CmdID_RF_WriteReg, -}SwChnlCmdID; - - -/* 1. Switch channel related */ -typedef struct _SwChnlCmd{ - SwChnlCmdID CmdID; - u32 Para1; - u32 Para2; - u32 msDelay; -}SwChnlCmd; - -typedef enum _HW90_BLOCK{ - HW90_BLOCK_MAC = 0, - HW90_BLOCK_PHY0 = 1, - HW90_BLOCK_PHY1 = 2, - HW90_BLOCK_RF = 3, - HW90_BLOCK_MAXIMUM = 4, // Never use this -}HW90_BLOCK_E, *PHW90_BLOCK_E; - -//vivi added this for read parameter from header, 20100908 -typedef enum _RF_CONTENT{ - radioa_txt = 0x1000, - radiob_txt = 0x1001, - radioc_txt = 0x1002, - radiod_txt = 0x1003 -} RF_CONTENT; - -typedef enum _RF90_RADIO_PATH{ - RF90_PATH_A = 0, //Radio Path A - RF90_PATH_B = 1, //Radio Path B - RF90_PATH_C = 2, //Radio Path C - RF90_PATH_D = 3, //Radio Path D - //RF90_PATH_MAX //Max RF number 90 support -}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E; - -#define RF90_PATH_MAX 2 - - -typedef enum _WIRELESS_MODE { - WIRELESS_MODE_UNKNOWN = 0x00, - WIRELESS_MODE_A = 0x01, - WIRELESS_MODE_B = 0x02, - WIRELESS_MODE_G = 0x04, - WIRELESS_MODE_AUTO = 0x08, - WIRELESS_MODE_N_24G = 0x10, - WIRELESS_MODE_N_5G = 0x20 -} WIRELESS_MODE; - - -#if(TX_POWER_FOR_5G_BAND == 1) -#define CHANNEL_MAX_NUMBER 14+24+21 // 14 is the max channel number -#define CHANNEL_GROUP_MAX 3+9 // ch1~3, ch4~9, ch10~14 total three groups -#define MAX_PG_GROUP 13 -#else -#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number -#define CHANNEL_GROUP_MAX 3 // ch1~3, ch4~9, ch10~14 total three groups -#define MAX_PG_GROUP 7 -#endif -#define CHANNEL_GROUP_MAX_2G 3 -#define CHANNEL_GROUP_IDX_5GL 3 -#define CHANNEL_GROUP_IDX_5GM 6 -#define CHANNEL_GROUP_IDX_5GH 9 -#define CHANNEL_GROUP_MAX_5G 9 -#define CHANNEL_MAX_NUMBER_2G 14 - -#if (RTL8192D_DUAL_MAC_MODE_SWITCH == 1) -typedef enum _BaseBand_Config_Type{ - BaseBand_Config_PHY_REG = 0, - BaseBand_Config_AGC_TAB = 1, - BaseBand_Config_AGC_TAB_2G = 2, - BaseBand_Config_AGC_TAB_5G = 3, -}BaseBand_Config_Type, *PBaseBand_Config_Type; -#else -typedef enum _BaseBand_Config_Type{ - BaseBand_Config_PHY_REG = 0, //Radio Path A - BaseBand_Config_AGC_TAB = 1, //Radio Path B -}BaseBand_Config_Type, *PBaseBand_Config_Type; -#endif - - -typedef enum _MACPHY_MODE_8192D{ - DUALMAC_DUALPHY, - DUALMAC_SINGLEPHY, - SINGLEMAC_SINGLEPHY -}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; - -typedef enum _BAND_TYPE{ - BAND_ON_2_4G = 0, - BAND_ON_5G, - BAND_ON_BOTH, - BANDMAX -}BAND_TYPE,*PBAND_TYPE; - -typedef enum _PHY_Rate_Tx_Power_Offset_Area{ - RA_OFFSET_LEGACY_OFDM1, - RA_OFFSET_LEGACY_OFDM2, - RA_OFFSET_HT_OFDM1, - RA_OFFSET_HT_OFDM2, - RA_OFFSET_HT_OFDM3, - RA_OFFSET_HT_OFDM4, - RA_OFFSET_HT_CCK, -}RA_OFFSET_AREA,*PRA_OFFSET_AREA; - - -/* BB/RF related */ -typedef enum _RF_TYPE_8190P{ - RF_TYPE_MIN, // 0 - RF_8225=1, // 1 11b/g RF for verification only - RF_8256=2, // 2 11b/g/n - RF_8258=3, // 3 11a/b/g/n RF - RF_6052=4, // 4 11b/g/n RF - //RF_6052=5, // 4 11b/g/n RF - // TODO: We sholud remove this psudo PHY RF after we get new RF. - RF_PSEUDO_11N=5, // 5, It is a temporality RF. -}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; - - -typedef enum _RATR_TABLE_MODE_8192C{ - RATR_INX_WIRELESS_NGB = 0, - RATR_INX_WIRELESS_NG = 1, - RATR_INX_WIRELESS_NB = 2, - RATR_INX_WIRELESS_N = 3, - RATR_INX_WIRELESS_GB = 4, - RATR_INX_WIRELESS_G = 5, - RATR_INX_WIRELESS_B = 6, - RATR_INX_WIRELESS_MC = 7, - RATR_INX_WIRELESS_A = 8, -}RATR_TABLE_MODE_8192C, *PRATR_TABLE_MODE_8192C; - -typedef struct _BB_REGISTER_DEFINITION{ - u32 rfintfs; // set software control: - // 0x870~0x877[8 bytes] - - u32 rfintfi; // readback data: - // 0x8e0~0x8e7[8 bytes] - - u32 rfintfo; // output data: - // 0x860~0x86f [16 bytes] - - u32 rfintfe; // output enable: - // 0x860~0x86f [16 bytes] - - u32 rf3wireOffset; // LSSI data: - // 0x840~0x84f [16 bytes] - - u32 rfLSSI_Select; // BB Band Select: - // 0x878~0x87f [8 bytes] - - u32 rfTxGainStage; // Tx gain stage: - // 0x80c~0x80f [4 bytes] - - u32 rfHSSIPara1; // wire parameter control1 : - // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] - - u32 rfHSSIPara2; // wire parameter control2 : - // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] - - u32 rfSwitchControl; //Tx Rx antenna control : - // 0x858~0x85f [16 bytes] - - u32 rfAGCControl1; //AGC parameter control1 : - // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] - - u32 rfAGCControl2; //AGC parameter control2 : - // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] - - u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : - // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] - - u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : - // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] - - u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix - // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] - - u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type - // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] - - u32 rfLSSIReadBack; //LSSI RF readback data SI mode - // 0x8a0~0x8af [16 bytes] - - u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B - -}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; - -#ifdef CONFIG_MP_INCLUDED -typedef enum _ANTENNA_PATH{ - ANTENNA_NONE = 0x00, - ANTENNA_D , - ANTENNA_C , - ANTENNA_CD , - ANTENNA_B , - ANTENNA_BD , - ANTENNA_BC , - ANTENNA_BCD , - ANTENNA_A , - ANTENNA_AD , - ANTENNA_AC , - ANTENNA_ACD , - ANTENNA_AB , - ANTENNA_ABD , - ANTENNA_ABC , - ANTENNA_ABCD -} ANTENNA_PATH; -#endif - -typedef struct _R_ANTENNA_SELECT_OFDM{ - u32 r_tx_antenna:4; - u32 r_ant_l:4; - u32 r_ant_non_ht:4; - u32 r_ant_ht1:4; - u32 r_ant_ht2:4; - u32 r_ant_ht_s1:4; - u32 r_ant_non_ht_s1:4; - u32 OFDM_TXSC:2; - u32 Reserved:2; -}R_ANTENNA_SELECT_OFDM; - -typedef struct _R_ANTENNA_SELECT_CCK{ - u8 r_cckrx_enable_2:2; - u8 r_cckrx_enable:2; - u8 r_ccktx_enable:4; -}R_ANTENNA_SELECT_CCK; - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - - -/*------------------------Export Marco Definition---------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ - -//Added for TX Power -//u8 GetRightChnlPlace(u8 chnl); -u8 rtl8192d_GetRightChnlPlaceforIQK(u8 chnl); -u8 rtl8192d_getChnlGroupfromArray(u8 chnl); -/*--------------------------Exported Function prototype---------------------*/ -// -// BB and RF register read/write -// -void rtl8192d_PHY_SetBBReg1Byte( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); -u32 rtl8192d_PHY_QueryBBReg( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask ); -void rtl8192d_PHY_SetBBReg( IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); -u32 rtl8192d_PHY_QueryRFReg( IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask ); -void rtl8192d_PHY_SetRFReg( IN PADAPTER Adapter, - IN RF90_RADIO_PATH_E eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data ); - -// -// Initialization related function -// -/* MAC/BB/RF HAL config */ -extern int PHY_MACConfig8192D( IN PADAPTER Adapter ); -extern int PHY_BBConfig8192D( IN PADAPTER Adapter ); -extern int PHY_RFConfig8192D( IN PADAPTER Adapter ); -/* RF config */ -int rtl8192d_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter, - IN u8* pFileName, - IN RF90_RADIO_PATH_E eRFPath); -int rtl8192d_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, - IN RF_CONTENT Content, - IN RF90_RADIO_PATH_E eRFPath); -/* BB/RF readback check for making sure init OK */ -int rtl8192d_PHY_CheckBBAndRFOK( IN PADAPTER Adapter, - IN HW90_BLOCK_E CheckBlock, - IN RF90_RADIO_PATH_E eRFPath ); -/* Read initi reg value for tx power setting. */ -void rtl8192d_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); - -// -// RF Power setting -// -//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, -// IN RT_RF_POWER_STATE eRFPowerState); - -// -// BB TX Power R/W -// -void PHY_GetTxPowerLevel8192D( IN PADAPTER Adapter, - OUT u32* powerlevel ); -void PHY_SetTxPowerLevel8192D( IN PADAPTER Adapter, - IN u8 channel ); -BOOLEAN PHY_UpdateTxPowerDbm8192D( IN PADAPTER Adapter, - IN int powerInDbm ); - -// -VOID -PHY_ScanOperationBackup8192D(IN PADAPTER Adapter, - IN u8 Operation ); - -// -// Switch bandwidth for 8192S -// -//void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SetBWMode8192D( IN PADAPTER pAdapter, - IN HT_CHANNEL_WIDTH ChnlWidth, - IN unsigned char Offset ); - -// -// Set FW CMD IO for 8192S. -// -//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, -// IN IO_TYPE IOType); - -// -// Set A2 entry to fw for 8192S -// -extern void FillA2Entry8192C( IN PADAPTER Adapter, - IN u8 index, - IN u8* val); - - -// -// channel switch related funciton -// -//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); -void PHY_SwChnl8192D( IN PADAPTER pAdapter, - IN u8 channel ); - // Call after initialization -void PHY_SwChnlPhy8192D( IN PADAPTER pAdapter, - IN u8 channel ); - -extern void ChkFwCmdIoDone( IN PADAPTER Adapter); - -#ifdef USE_WORKITEM -//extern void SetIOWorkItemCallback( IN PVOID pContext ); -#else -//extern void SetIOTimerCallback( IN PRT_TIMER pTimer); -#endif - -// -// BB/MAC/RF other monitor API -// -void PHY_SetMonitorMode8192D(IN PADAPTER pAdapter, - IN BOOLEAN bEnableMonitorMode ); - -BOOLEAN PHY_CheckIsLegalRfPath8192D(IN PADAPTER pAdapter, - IN u32 eRFPath ); - -// -// IQ calibrate -// -void rtl8192d_PHY_IQCalibrate( IN PADAPTER pAdapter); - - -// -// LC calibrate -// -void rtl8192d_PHY_LCCalibrate(IN PADAPTER pAdapter); - -// -// AP calibrate -// -void rtl8192d_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta); - - -// -// Modify the value of the hw register when beacon interval be changed. -// -void -rtl8192d_PHY_SetBeaconHwReg( IN PADAPTER Adapter, - IN u16 BeaconInterval ); - - -extern VOID -PHY_SwitchEphyParameter( - IN PADAPTER Adapter - ); - -extern VOID -PHY_EnableHostClkReq( - IN PADAPTER Adapter - ); - -BOOLEAN -SetAntennaConfig92C( - IN PADAPTER Adapter, - IN u8 DefaultAnt - ); - -VOID -PHY_UpdateBBRFConfiguration8192D( - IN PADAPTER Adapter, - IN BOOLEAN bisBandSwitch -); - -VOID PHY_ReadMacPhyMode92D( - IN PADAPTER Adapter, - IN BOOLEAN AutoloadFail -); - -VOID PHY_ConfigMacPhyMode92D( - IN PADAPTER Adapter -); - -VOID PHY_ConfigMacPhyModeInfo92D( - IN PADAPTER Adapter -); - -VOID PHY_ConfigMacCoexist_RFPage92D( - IN PADAPTER Adapter -); - -VOID -rtl8192d_PHY_InitRxSetting( - IN PADAPTER Adapter -); - -VOID -rtl8192d_PHY_ResetIQKResult( - IN PADAPTER Adapter -); - - -VOID -rtl8192d_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain); - -VOID -HalChangeCCKStatus8192D( - IN PADAPTER Adapter, - IN BOOLEAN bCCKDisable -); - -/*--------------------------Exported Function prototype---------------------*/ - -#define PHY_SetBBReg1Byte(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg1Byte((Adapter), (RegAddr), (BitMask), (Data)) -#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192d_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) -#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) -#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192d_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) -#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192d_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) - -#define PHY_SetMacReg PHY_SetBBReg - -#endif // __INC_HAL8192SPHYCFG_H - diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h deleted file mode 100755 index d07bc1ff0579..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h +++ /dev/null @@ -1,1059 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/***************************************************************************** - * - * Module: __INC_HAL8192DPHYREG_H - * - * - * Note: 1. Define PMAC/BB register map - * 2. Define RF register map - * 3. PMAC/BB register bit mask. - * 4. RF reg bit mask. - * 5. Other BB/RF relative definition. - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * 09/25/2008 MH 1. Add RL6052 register definition - * - *****************************************************************************/ -#ifndef __INC_HAL8192DPHYREG_H -#define __INC_HAL8192DPHYREG_H - - -/*--------------------------Define Parameters-------------------------------*/ - -//============================================================ -// 8192S Regsiter offset definition -//============================================================ - -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 2. Page2(0x200) -// -// The following two definition are only used for USB interface. -#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. -#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c - -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 -#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback -#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c - -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 - - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_A_Rate18_06 0xe00 -#define rTxAGC_A_Rate54_24 0xe04 -#define rTxAGC_A_CCK1_Mcs32 0xe08 -#define rTxAGC_A_Mcs03_Mcs00 0xe10 -#define rTxAGC_A_Mcs07_Mcs04 0xe14 -#define rTxAGC_A_Mcs11_Mcs08 0xe18 -#define rTxAGC_A_Mcs15_Mcs12 0xe1c - -#define rTxAGC_B_Rate18_06 0x830 -#define rTxAGC_B_Rate54_24 0x834 -#define rTxAGC_B_CCK1_55_Mcs32 0x838 -#define rTxAGC_B_Mcs03_Mcs00 0x83c -#define rTxAGC_B_Mcs07_Mcs04 0x848 -#define rTxAGC_B_Mcs11_Mcs08 0x84c -#define rTxAGC_B_Mcs15_Mcs12 0x868 -#define rTxAGC_B_CCK11_A_CCK2_11 0x86c - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -#define rZebra1_Channel 0x7 // RF channel switch - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_POW_ABILITY 0x17 // -#define RF_MODE_AG 0x18 // -#define rRfChannel 0x18 // RF channel and BW switch -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -#define RF_T_METER 0x42 // - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control - -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bAntennaSelect 0x0300 - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 - -#define bLSSIReadAddress 0x7f800000 // T65 RF - -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal - -#define bLSSIReadBackData 0xfffff // T65 RF - -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMask12Bits 0xfff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f - -//for PutRFRegsetting & GetRFRegSetting BitMask -//#define bMask12Bits 0xfffff // RF Reg mask bits -//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF -#define bRFRegOffsetMask 0xfffff -//#define bRFRegOffsetMask 0xfff - -//MAC0 will wirte PHY1 -#define MAC0_ACCESS_PHY1 0x4000 -//MAC1 will wirte PHY0 -#define MAC1_ACCESS_PHY0 0x2000 - -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#define PathA 0x0 // Useless -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif //__INC_HAL8192SPHYREG_H - diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h deleted file mode 100755 index a6e1db2784c1..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8192DU_FW_IMG_H -#define __INC_HAL8192DU_FW_IMG_H - -#include - -/*Created on 2011/ 6/22, 2:27*/ - -#define ImgArrayLength 29642 -extern u8 Rtl8192DUFwImgArray[ImgArrayLength]; -#define MainArrayLength 1 -extern u8 Rtl8192DUFwMainArray[MainArrayLength]; -#define DataArrayLength 1 -extern u8 Rtl8192DUFwDataArray[DataArrayLength]; -#define PHY_REG_2TArrayLength 380 -extern u32 Rtl8192DUPHY_REG_2TArray[PHY_REG_2TArrayLength]; -#define PHY_REG_1TArrayLength 1 -extern u32 Rtl8192DUPHY_REG_1TArray[PHY_REG_1TArrayLength]; -#define PHY_REG_Array_PGLength 624 -extern u32 Rtl8192DUPHY_REG_Array_PG[PHY_REG_Array_PGLength]; -#define PHY_REG_Array_MPLength 10 -extern u32 Rtl8192DUPHY_REG_Array_MP[PHY_REG_Array_MPLength]; -#define RadioA_2TArrayLength 378 -extern u32 Rtl8192DURadioA_2TArray[RadioA_2TArrayLength]; -#define RadioB_2TArrayLength 384 -extern u32 Rtl8192DURadioB_2TArray[RadioB_2TArrayLength]; -#define RadioA_1TArrayLength 1 -extern u32 Rtl8192DURadioA_1TArray[RadioA_1TArrayLength]; -#define RadioB_1TArrayLength 1 -extern u32 Rtl8192DURadioB_1TArray[RadioB_1TArrayLength]; -#define RadioA_2T_intPAArrayLength 378 -extern u32 Rtl8192DURadioA_2T_intPAArray[RadioA_2T_intPAArrayLength]; -#define RadioB_2T_intPAArrayLength 384 -extern u32 Rtl8192DURadioB_2T_intPAArray[RadioB_2T_intPAArrayLength]; -#define MAC_2TArrayLength 160 -extern u32 Rtl8192DUMAC_2TArray[MAC_2TArrayLength]; -#define AGCTAB_ArrayLength 386 -extern u32 Rtl8192DUAGCTAB_Array[AGCTAB_ArrayLength]; -#define AGCTAB_5GArrayLength 194 -extern u32 Rtl8192DUAGCTAB_5GArray[AGCTAB_5GArrayLength]; -#define AGCTAB_2GArrayLength 194 -extern u32 Rtl8192DUAGCTAB_2GArray[AGCTAB_2GArrayLength]; -#define AGCTAB_2TArrayLength 1 -extern u32 Rtl8192DUAGCTAB_2TArray[AGCTAB_2TArrayLength]; -#define AGCTAB_1TArrayLength 1 -extern u32 Rtl8192DUAGCTAB_1TArray[AGCTAB_1TArrayLength]; - -#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h deleted file mode 100755 index 3ce7a3d80983..000000000000 --- a/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_HAL8192DUTEST_FW_IMG_H -#define __INC_HAL8192DUTEST_FW_IMG_H - -#include - -/*Created on 2010/ 5/27, 9:49*/ - -#define Rtl8192DTestImgArrayLength 15054 -extern u8 Rtl8192DTestFwImgArray[Rtl8192DTestImgArrayLength]; -#define Rtl8192DTestMainArrayLength 1 -extern u8 Rtl8192DTestFwMainArray[Rtl8192DTestMainArrayLength]; -#define Rtl8192DTestDataArrayLength 1 -extern u8 Rtl8192DTestFwDataArray[Rtl8192DTestDataArrayLength]; -#define Rtl8192DTestPHY_REG_2TArrayLength 376 -extern u32 Rtl8192DTestPHY_REG_2TArray[Rtl8192DTestPHY_REG_2TArrayLength]; -#define Rtl8192DTestPHY_REG_1TArrayLength 1 -extern u32 Rtl8192DTestPHY_REG_1TArray[Rtl8192DTestPHY_REG_1TArrayLength]; -#define Rtl8192DTestPHY_REG_Array_PGLength 1 -extern u32 Rtl8192DTestPHY_REG_Array_PG[Rtl8192DTestPHY_REG_Array_PGLength]; -#define Rtl8192DTestRadioA_2TArrayLength 340 -extern u32 Rtl8192DTestRadioA_2TArray[Rtl8192DTestRadioA_2TArrayLength]; -#define Rtl8192DTestRadioB_2TArrayLength 340 -extern u32 Rtl8192DTestRadioB_2TArray[Rtl8192DTestRadioB_2TArrayLength]; -#define Rtl8192DTestRadioA_1TArrayLength 1 -extern u32 Rtl8192DTestRadioA_1TArray[Rtl8192DTestRadioA_1TArrayLength]; -#define Rtl8192DTestRadioB_1TArrayLength 1 -extern u32 Rtl8192DTestRadioB_1TArray[Rtl8192DTestRadioB_1TArrayLength]; -#define Rtl8192DTestMAC_2TArrayLength 174 -extern u32 Rtl8192DTestMAC_2TArray[Rtl8192DTestMAC_2TArrayLength]; -#define Rtl8192DTestAGCTAB_5GArrayLength 514 -extern u32 Rtl8192DTestAGCTAB_5GArray[Rtl8192DTestAGCTAB_5GArrayLength]; -#define Rtl8192DTestAGCTAB_2GArrayLength 514 -extern u32 Rtl8192DTestAGCTAB_2GArray[Rtl8192DTestAGCTAB_2GArrayLength]; - -#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/autoconf.h b/drivers/net/wireless/rtl8192c/include/autoconf.h deleted file mode 100755 index 9949bc07ab83..000000000000 --- a/drivers/net/wireless/rtl8192c/include/autoconf.h +++ /dev/null @@ -1,216 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -/* - * Public General Config - */ -#define AUTOCONF_INCLUDED -#define RTL871X_MODULE_NAME "92CU" -#define DRV_NAME "rtl8192cu" - -#define CONFIG_USB_HCI 1 - -#define CONFIG_RTL8192C 1 - -#define PLATFORM_LINUX 1 - - -/* - * Internal General Config - */ -//#define CONFIG_PWRCTRL -//#define CONFIG_H2CLBK - -#define CONFIG_EMBEDDED_FWIMG 1 - -#define CONFIG_R871X_TEST 1 - -#define CONFIG_80211N_HT 1 - -#define CONFIG_RECV_REORDERING_CTRL 1 - -//#define CONFIG_TCP_CSUM_OFFLOAD_RX 1 - -//#define CONFIG_DRVEXT_MODULE 1 - -#ifndef CONFIG_MP_INCLUDED -//#define CONFIG_IPS 1 /* modified by gwl, we'd better comment out the IPS function if we use lower speed IO interface. */ -#ifdef CONFIG_IPS - //#define CONFIG_IPS_LEVEL_2 1 //enable this to set default IPS mode to IPS_LEVEL_2 (added by gwl) -#endif -#define SUPPORT_HW_RFOFF_DETECTED 1 - -#define CONFIG_LPS 1 -//#define CONFIG_BT_COEXIST 1 -//befor link -#define CONFIG_ANTENNA_DIVERSITY -//after link -#ifdef CONFIG_ANTENNA_DIVERSITY -#define CONFIG_SW_ANTENNA_DIVERSITY -//#define CONFIG_HW_ANTENNA_DIVERSITY -#endif - -#else -#define CONFIG_MP_IWPRIV_SUPPORT 1 -#endif - -#define CONFIG_AP_MODE 1 -#define CONFIG_NATIVEAP_MLME 1 - -// Added by Albert 20110314 -//#define CONFIG_P2P 1 - -// Added by Kurt 20110511 -//#define CONFIG_TDLS 1 - -#ifdef CONFIG_AP_MODE - #ifndef CONFIG_NATIVEAP_MLME - #define CONFIG_HOSTAPD_MLME 1 - #endif - #define CONFIG_FIND_BEST_CHANNEL 1//added by gwl -#endif - -#define CONFIG_SKB_COPY 1//for amsdu - -#define CONFIG_LED -#ifdef CONFIG_LED - #define CONFIG_SW_LED -#endif //CONFIG_LED - -#define CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP - -#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface -#define CONFIG_GLOBAL_UI_PID - -#define CONFIG_LAYER2_ROAMING -#define CONFIG_LAYER2_ROAMING_RESUME -//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general... -//#define CONFIG_RESUME_IN_WORKQUEUE -//#define CONFIG_SET_SCAN_DENY_TIMER -#define CONFIG_LONG_DELAY_ISSUE -#define CONFIG_NEW_SIGNAL_STAT_PROCESS - -/* - * Interface Related Config - */ -//#define CONFIG_USB_INTERRUPT_IN_PIPE 1 - -#ifndef CONFIG_MINIMAL_MEMORY_USAGE - #define CONFIG_USB_TX_AGGREGATION 1 - #define CONFIG_USB_RX_AGGREGATION 1 -#endif - -#define CONFIG_PREALLOC_RECV_SKB 1 -#define CONFIG_REDUCE_USB_TX_INT 1 -//#define CONFIG_EASY_REPLACEMENT 1 - -/* - * CONFIG_USE_USB_BUFFER_ALLOC_XX uses Linux USB Buffer alloc API and is for Linux platform only now! - */ -//#define CONFIG_USE_USB_BUFFER_ALLOC_TX 1 // For TX path -//#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1 // For RX path - -#define CONFIG_USB_VENDOR_REQ_PREALLOC 1 - -//#define CONFIG_USB_SUPPORT_ASYNC_VDN_REQ 1 - - -/* - * HAL Related Config - */ - -#define RTL8192C_RX_PACKET_NO_INCLUDE_CRC 1 - -#define SUPPORTED_BLOCK_IO - - - -#define RTL8192CU_FW_DOWNLOAD_ENABLE 1 - -#define CONFIG_ONLY_ONE_OUT_EP_TO_LOW 0 - -#define CONFIG_OUT_EP_WIFI_MODE 0 - -#define ENABLE_USB_DROP_INCORRECT_OUT 0 - -#define RTL8192CU_ASIC_VERIFICATION 0 // For ASIC verification. - -#define RTL8192CU_ADHOC_WORKAROUND_SETTING 1 - -#define DISABLE_BB_RF 0 - -#define RTL8191C_FPGA_NETWORKTYPE_ADHOC 0 - -#ifdef CONFIG_MP_INCLUDED - #define MP_DRIVER 1 - #undef CONFIG_USB_TX_AGGREGATION - #undef CONFIG_USB_RX_AGGREGATION -#else - #define MP_DRIVER 0 -#endif - - -/* - * Platform Related Config - */ -#ifdef CONFIG_PLATFORM_MN10300 -#define CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV - -#if defined (CONFIG_SW_ANTENNA_DIVERSITY) - #undef CONFIG_SW_ANTENNA_DIVERSITY - #define CONFIG_HW_ANTENNA_DIVERSITY -#endif - -#endif - -#ifndef CONFIG_WISTRON_PLATFORM -//#define CONFIG_DYNAMIC_ALLOCIATE_VENDOR_CMD 1 -#define SILENT_RESET_FOR_SPECIFIC_PLATFOM 1 -#endif - -#ifdef CONFIG_PLATFORM_TI_DM365 -#define CONFIG_SPECIFIC_URB_NUM -#endif - - -/* - * Debug Related Config - */ -//#define CONFIG_DEBUG_RTL871X - -#define DBG 0 -#define CONFIG_DEBUG_RTL819X - -#define CONFIG_PROC_DEBUG 1 - -//#define DBG_IO -//#define DBG_DELAY_OS -//#define DBG_MEM_ALLOC -//#define DBG_IOCTL - -//#define DBG_TX -//#define DBG_XMIT_BUF -//#define DBG_TX_DROP_FRAME - -//#define DBG_RX_DROP_FRAME -//#define DBG_RX_SEQ - -//#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE - diff --git a/drivers/net/wireless/rtl8192c/include/basic_types.h b/drivers/net/wireless/rtl8192c/include/basic_types.h deleted file mode 100755 index f8802240f509..000000000000 --- a/drivers/net/wireless/rtl8192c/include/basic_types.h +++ /dev/null @@ -1,276 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __BASIC_TYPES_H__ -#define __BASIC_TYPES_H__ - -#include - - -#define SUCCESS 0 -#define FAIL (-1) - -#ifndef TRUE - #define _TRUE 1 -#else - #define _TRUE TRUE -#endif - -#ifndef FALSE - #define _FALSE 0 -#else - #define _FALSE FALSE -#endif - -#ifdef PLATFORM_WINDOWS - - typedef signed char s8; - typedef unsigned char u8; - - typedef signed short s16; - typedef unsigned short u16; - - typedef signed long s32; - typedef unsigned long u32; - - typedef unsigned int uint; - typedef signed int sint; - - - typedef signed long long s64; - typedef unsigned long long u64; - - #ifdef NDIS50_MINIPORT - - #define NDIS_MAJOR_VERSION 5 - #define NDIS_MINOR_VERSION 0 - - #endif - - #ifdef NDIS51_MINIPORT - - #define NDIS_MAJOR_VERSION 5 - #define NDIS_MINOR_VERSION 1 - - #endif - - typedef NDIS_PROC proc_t; - - typedef LONG atomic_t; - -#endif - - -#ifdef PLATFORM_LINUX - - #include - #define IN - #define OUT - #define VOID void - #define NDIS_OID uint - #define NDIS_STATUS uint - - typedef signed int sint; - - #ifndef PVOID - typedef void * PVOID; - //#define PVOID (void *) - #endif - - #define UCHAR u8 - #define USHORT u16 - #define UINT u32 - #define ULONG u32 - - typedef void (*proc_t)(void*); - - typedef __kernel_size_t SIZE_T; - typedef __kernel_ssize_t SSIZE_T; - #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) - -#endif - -#define MEM_ALIGNMENT_OFFSET (sizeof (SIZE_T)) -#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1) - -#define SIZE_PTR SIZE_T -#define SSIZE_PTR SSIZE_T - -//port from fw by thomas -// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness - -/* - * Call endian free function when - * 1. Read/write packet content. - * 2. Before write integer to IO. - * 3. After read integer from IO. -*/ - -// -// Byte Swapping routine. -// -#define EF1Byte -#define EF2Byte le16_to_cpu -#define EF4Byte le32_to_cpu - -// -// Read LE format data from memory -// -#define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr))) -#define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr))) -#define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr))) - -// -// Write LE data to memory -// -#define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr)))=EF1Byte(_val) -#define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr)))=EF2Byte(_val) -#define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr)))=EF4Byte(_val) - -// -// Example: -// BIT_LEN_MASK_32(0) => 0x00000000 -// BIT_LEN_MASK_32(1) => 0x00000001 -// BIT_LEN_MASK_32(2) => 0x00000003 -// BIT_LEN_MASK_32(32) => 0xFFFFFFFF -// -#define BIT_LEN_MASK_32(__BitLen) \ - (0xFFFFFFFF >> (32 - (__BitLen))) -// -// Example: -// BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 -// BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 -// -#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \ - (BIT_LEN_MASK_32(__BitLen) << (__BitOffset)) - -// -// Description: -// Return 4-byte value in host byte ordering from -// 4-byte pointer in litten-endian system. -// -#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ - (EF4Byte(*((u32 *)(__pStart)))) - -// -// Description: -// Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to -// 4-byte value in host byte ordering. -// -#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ - ( \ - ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \ - & \ - BIT_LEN_MASK_32(__BitLen) \ - ) - -// -// Description: -// Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering -// and return the result in 4-byte value in host byte ordering. -// -#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ - ( \ - LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ - & \ - ( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \ - ) - -// -// Description: -// Set subfield of little-endian 4-byte value to specified value. -// -#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \ - *((u32 *)(__pStart)) = \ - EF4Byte( \ - LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ - | \ - ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \ - ); - - -#define BIT_LEN_MASK_16(__BitLen) \ - (0xFFFF >> (16 - (__BitLen))) - -#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \ - (BIT_LEN_MASK_16(__BitLen) << (__BitOffset)) - -#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ - (EF2Byte(*((u16 *)(__pStart)))) - -#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ - ( \ - ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \ - & \ - BIT_LEN_MASK_16(__BitLen) \ - ) - -#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ - ( \ - LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ - & \ - ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \ - ) - -#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ - *((u16 *)(__pStart)) = \ - EF2Byte( \ - LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ - | \ - ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \ - ); - -#define BIT_LEN_MASK_8(__BitLen) \ - (0xFF >> (8 - (__BitLen))) - -#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \ - (BIT_LEN_MASK_8(__BitLen) << (__BitOffset)) - -#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ - (EF1Byte(*((u8 *)(__pStart)))) - -#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ - ( \ - ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \ - & \ - BIT_LEN_MASK_8(__BitLen) \ - ) - -#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ - ( \ - LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ - & \ - ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \ - ) - -#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \ - *((u8 *)(__pStart)) = \ - EF1Byte( \ - LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ - | \ - ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \ - ); - -// Get the N-bytes aligment offset from the current length -#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment)) - -typedef unsigned char BOOLEAN,*PBOOLEAN; - -#endif //__BASIC_TYPES_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h b/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h deleted file mode 100755 index eca68a6569f6..000000000000 --- a/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h +++ /dev/null @@ -1,87 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef _LINUX_BYTEORDER_BIG_ENDIAN_H -#define _LINUX_BYTEORDER_BIG_ENDIAN_H - -#ifndef __BIG_ENDIAN -#define __BIG_ENDIAN 4321 -#endif -#ifndef __BIG_ENDIAN_BITFIELD -#define __BIG_ENDIAN_BITFIELD -#endif - -#include - -#define __constant_htonl(x) ((__u32)(x)) -#define __constant_ntohl(x) ((__u32)(x)) -#define __constant_htons(x) ((__u16)(x)) -#define __constant_ntohs(x) ((__u16)(x)) -#define __constant_cpu_to_le64(x) ___constant_swab64((x)) -#define __constant_le64_to_cpu(x) ___constant_swab64((x)) -#define __constant_cpu_to_le32(x) ___constant_swab32((x)) -#define __constant_le32_to_cpu(x) ___constant_swab32((x)) -#define __constant_cpu_to_le16(x) ___constant_swab16((x)) -#define __constant_le16_to_cpu(x) ___constant_swab16((x)) -#define __constant_cpu_to_be64(x) ((__u64)(x)) -#define __constant_be64_to_cpu(x) ((__u64)(x)) -#define __constant_cpu_to_be32(x) ((__u32)(x)) -#define __constant_be32_to_cpu(x) ((__u32)(x)) -#define __constant_cpu_to_be16(x) ((__u16)(x)) -#define __constant_be16_to_cpu(x) ((__u16)(x)) -#define __cpu_to_le64(x) __swab64((x)) -#define __le64_to_cpu(x) __swab64((x)) -#define __cpu_to_le32(x) __swab32((x)) -#define __le32_to_cpu(x) __swab32((x)) -#define __cpu_to_le16(x) __swab16((x)) -#define __le16_to_cpu(x) __swab16((x)) -#define __cpu_to_be64(x) ((__u64)(x)) -#define __be64_to_cpu(x) ((__u64)(x)) -#define __cpu_to_be32(x) ((__u32)(x)) -#define __be32_to_cpu(x) ((__u32)(x)) -#define __cpu_to_be16(x) ((__u16)(x)) -#define __be16_to_cpu(x) ((__u16)(x)) -#define __cpu_to_le64p(x) __swab64p((x)) -#define __le64_to_cpup(x) __swab64p((x)) -#define __cpu_to_le32p(x) __swab32p((x)) -#define __le32_to_cpup(x) __swab32p((x)) -#define __cpu_to_le16p(x) __swab16p((x)) -#define __le16_to_cpup(x) __swab16p((x)) -#define __cpu_to_be64p(x) (*(__u64*)(x)) -#define __be64_to_cpup(x) (*(__u64*)(x)) -#define __cpu_to_be32p(x) (*(__u32*)(x)) -#define __be32_to_cpup(x) (*(__u32*)(x)) -#define __cpu_to_be16p(x) (*(__u16*)(x)) -#define __be16_to_cpup(x) (*(__u16*)(x)) -#define __cpu_to_le64s(x) __swab64s((x)) -#define __le64_to_cpus(x) __swab64s((x)) -#define __cpu_to_le32s(x) __swab32s((x)) -#define __le32_to_cpus(x) __swab32s((x)) -#define __cpu_to_le16s(x) __swab16s((x)) -#define __le16_to_cpus(x) __swab16s((x)) -#define __cpu_to_be64s(x) do {} while (0) -#define __be64_to_cpus(x) do {} while (0) -#define __cpu_to_be32s(x) do {} while (0) -#define __be32_to_cpus(x) do {} while (0) -#define __cpu_to_be16s(x) do {} while (0) -#define __be16_to_cpus(x) do {} while (0) - -#include - -#endif /* _LINUX_BYTEORDER_BIG_ENDIAN_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/generic.h b/drivers/net/wireless/rtl8192c/include/byteorder/generic.h deleted file mode 100755 index 246ba892906d..000000000000 --- a/drivers/net/wireless/rtl8192c/include/byteorder/generic.h +++ /dev/null @@ -1,209 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef _LINUX_BYTEORDER_GENERIC_H -#define _LINUX_BYTEORDER_GENERIC_H - -/* - * linux/byteorder_generic.h - * Generic Byte-reordering support - * - * Francois-Rene Rideau 19970707 - * gathered all the good ideas from all asm-foo/byteorder.h into one file, - * cleaned them up. - * I hope it is compliant with non-GCC compilers. - * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h, - * because I wasn't sure it would be ok to put it in types.h - * Upgraded it to 2.1.43 - * Francois-Rene Rideau 19971012 - * Upgraded it to 2.1.57 - * to please Linus T., replaced huge #ifdef's between little/big endian - * by nestedly #include'd files. - * Francois-Rene Rideau 19971205 - * Made it to 2.1.71; now a facelift: - * Put files under include/linux/byteorder/ - * Split swab from generic support. - * - * TODO: - * = Regular kernel maintainers could also replace all these manual - * byteswap macros that remain, disseminated among drivers, - * after some grep or the sources... - * = Linus might want to rename all these macros and files to fit his taste, - * to fit his personal naming scheme. - * = it seems that a few drivers would also appreciate - * nybble swapping support... - * = every architecture could add their byteswap macro in asm/byteorder.h - * see how some architectures already do (i386, alpha, ppc, etc) - * = cpu_to_beXX and beXX_to_cpu might some day need to be well - * distinguished throughout the kernel. This is not the case currently, - * since little endian, big endian, and pdp endian machines needn't it. - * But this might be the case for, say, a port of Linux to 20/21 bit - * architectures (and F21 Linux addict around?). - */ - -/* - * The following macros are to be defined by : - * - * Conversion of long and short int between network and host format - * ntohl(__u32 x) - * ntohs(__u16 x) - * htonl(__u32 x) - * htons(__u16 x) - * It seems that some programs (which? where? or perhaps a standard? POSIX?) - * might like the above to be functions, not macros (why?). - * if that's true, then detect them, and take measures. - * Anyway, the measure is: define only ___ntohl as a macro instead, - * and in a separate file, have - * unsigned long inline ntohl(x){return ___ntohl(x);} - * - * The same for constant arguments - * __constant_ntohl(__u32 x) - * __constant_ntohs(__u16 x) - * __constant_htonl(__u32 x) - * __constant_htons(__u16 x) - * - * Conversion of XX-bit integers (16- 32- or 64-) - * between native CPU format and little/big endian format - * 64-bit stuff only defined for proper architectures - * cpu_to_[bl]eXX(__uXX x) - * [bl]eXX_to_cpu(__uXX x) - * - * The same, but takes a pointer to the value to convert - * cpu_to_[bl]eXXp(__uXX x) - * [bl]eXX_to_cpup(__uXX x) - * - * The same, but change in situ - * cpu_to_[bl]eXXs(__uXX x) - * [bl]eXX_to_cpus(__uXX x) - * - * See asm-foo/byteorder.h for examples of how to provide - * architecture-optimized versions - * - */ - - -#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) -/* - * inside the kernel, we can use nicknames; - * outside of it, we must avoid POSIX namespace pollution... - */ -#define cpu_to_le64 __cpu_to_le64 -#define le64_to_cpu __le64_to_cpu -#define cpu_to_le32 __cpu_to_le32 -#define le32_to_cpu __le32_to_cpu -#define cpu_to_le16 __cpu_to_le16 -#define le16_to_cpu __le16_to_cpu -#define cpu_to_be64 __cpu_to_be64 -#define be64_to_cpu __be64_to_cpu -#define cpu_to_be32 __cpu_to_be32 -#define be32_to_cpu __be32_to_cpu -#define cpu_to_be16 __cpu_to_be16 -#define be16_to_cpu __be16_to_cpu -#define cpu_to_le64p __cpu_to_le64p -#define le64_to_cpup __le64_to_cpup -#define cpu_to_le32p __cpu_to_le32p -#define le32_to_cpup __le32_to_cpup -#define cpu_to_le16p __cpu_to_le16p -#define le16_to_cpup __le16_to_cpup -#define cpu_to_be64p __cpu_to_be64p -#define be64_to_cpup __be64_to_cpup -#define cpu_to_be32p __cpu_to_be32p -#define be32_to_cpup __be32_to_cpup -#define cpu_to_be16p __cpu_to_be16p -#define be16_to_cpup __be16_to_cpup -#define cpu_to_le64s __cpu_to_le64s -#define le64_to_cpus __le64_to_cpus -#define cpu_to_le32s __cpu_to_le32s -#define le32_to_cpus __le32_to_cpus -#define cpu_to_le16s __cpu_to_le16s -#define le16_to_cpus __le16_to_cpus -#define cpu_to_be64s __cpu_to_be64s -#define be64_to_cpus __be64_to_cpus -#define cpu_to_be32s __cpu_to_be32s -#define be32_to_cpus __be32_to_cpus -#define cpu_to_be16s __cpu_to_be16s -#define be16_to_cpus __be16_to_cpus -#endif - - -/* - * Handle ntohl and suches. These have various compatibility - * issues - like we want to give the prototype even though we - * also have a macro for them in case some strange program - * wants to take the address of the thing or something.. - * - * Note that these used to return a "long" in libc5, even though - * long is often 64-bit these days.. Thus the casts. - * - * They have to be macros in order to do the constant folding - * correctly - if the argument passed into a inline function - * it is no longer constant according to gcc.. - */ - -#undef ntohl -#undef ntohs -#undef htonl -#undef htons - -/* - * Do the prototypes. Somebody might want to take the - * address or some such sick thing.. - */ -#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) -extern __u32 ntohl(__u32); -extern __u32 htonl(__u32); -#else -extern unsigned long int ntohl(unsigned long int); -extern unsigned long int htonl(unsigned long int); -#endif -extern unsigned short int ntohs(unsigned short int); -extern unsigned short int htons(unsigned short int); - - -#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) || defined(PLATFORM_MPIXEL) - -#define ___htonl(x) __cpu_to_be32(x) -#define ___htons(x) __cpu_to_be16(x) -#define ___ntohl(x) __be32_to_cpu(x) -#define ___ntohs(x) __be16_to_cpu(x) - -#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) -#define htonl(x) ___htonl(x) -#define ntohl(x) ___ntohl(x) -#else -#define htonl(x) ((unsigned long)___htonl(x)) -#define ntohl(x) ((unsigned long)___ntohl(x)) -#endif -#define htons(x) ___htons(x) -#define ntohs(x) ___ntohs(x) - -#endif /* OPTIMIZE */ - - -#if defined (PLATFORM_WINDOWS) - -#define htonl(x) __cpu_to_be32(x) -#define ntohl(x) __be32_to_cpu(x) -#define htons(x) __cpu_to_be16(x) -#define ntohs(x) __be16_to_cpu(x) - - -#endif - -#endif /* _LINUX_BYTEORDER_GENERIC_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h b/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h deleted file mode 100755 index 433045e46939..000000000000 --- a/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h +++ /dev/null @@ -1,89 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef _LINUX_BYTEORDER_LITTLE_ENDIAN_H -#define _LINUX_BYTEORDER_LITTLE_ENDIAN_H - -#ifndef __LITTLE_ENDIAN -#define __LITTLE_ENDIAN 1234 -#endif -#ifndef __LITTLE_ENDIAN_BITFIELD -#define __LITTLE_ENDIAN_BITFIELD -#endif - -#include - -#ifndef __constant_htonl -#define __constant_htonl(x) ___constant_swab32((x)) -#define __constant_ntohl(x) ___constant_swab32((x)) -#define __constant_htons(x) ___constant_swab16((x)) -#define __constant_ntohs(x) ___constant_swab16((x)) -#define __constant_cpu_to_le64(x) ((__u64)(x)) -#define __constant_le64_to_cpu(x) ((__u64)(x)) -#define __constant_cpu_to_le32(x) ((__u32)(x)) -#define __constant_le32_to_cpu(x) ((__u32)(x)) -#define __constant_cpu_to_le16(x) ((__u16)(x)) -#define __constant_le16_to_cpu(x) ((__u16)(x)) -#define __constant_cpu_to_be64(x) ___constant_swab64((x)) -#define __constant_be64_to_cpu(x) ___constant_swab64((x)) -#define __constant_cpu_to_be32(x) ___constant_swab32((x)) -#define __constant_be32_to_cpu(x) ___constant_swab32((x)) -#define __constant_cpu_to_be16(x) ___constant_swab16((x)) -#define __constant_be16_to_cpu(x) ___constant_swab16((x)) -#define __cpu_to_le64(x) ((__u64)(x)) -#define __le64_to_cpu(x) ((__u64)(x)) -#define __cpu_to_le32(x) ((__u32)(x)) -#define __le32_to_cpu(x) ((__u32)(x)) -#define __cpu_to_le16(x) ((__u16)(x)) -#define __le16_to_cpu(x) ((__u16)(x)) -#define __cpu_to_be64(x) __swab64((x)) -#define __be64_to_cpu(x) __swab64((x)) -#define __cpu_to_be32(x) __swab32((x)) -#define __be32_to_cpu(x) __swab32((x)) -#define __cpu_to_be16(x) __swab16((x)) -#define __be16_to_cpu(x) __swab16((x)) -#define __cpu_to_le64p(x) (*(__u64*)(x)) -#define __le64_to_cpup(x) (*(__u64*)(x)) -#define __cpu_to_le32p(x) (*(__u32*)(x)) -#define __le32_to_cpup(x) (*(__u32*)(x)) -#define __cpu_to_le16p(x) (*(__u16*)(x)) -#define __le16_to_cpup(x) (*(__u16*)(x)) -#define __cpu_to_be64p(x) __swab64p((x)) -#define __be64_to_cpup(x) __swab64p((x)) -#define __cpu_to_be32p(x) __swab32p((x)) -#define __be32_to_cpup(x) __swab32p((x)) -#define __cpu_to_be16p(x) __swab16p((x)) -#define __be16_to_cpup(x) __swab16p((x)) -#define __cpu_to_le64s(x) do {} while (0) -#define __le64_to_cpus(x) do {} while (0) -#define __cpu_to_le32s(x) do {} while (0) -#define __le32_to_cpus(x) do {} while (0) -#define __cpu_to_le16s(x) do {} while (0) -#define __le16_to_cpus(x) do {} while (0) -#define __cpu_to_be64s(x) __swab64s((x)) -#define __be64_to_cpus(x) __swab64s((x)) -#define __cpu_to_be32s(x) __swab32s((x)) -#define __be32_to_cpus(x) __swab32s((x)) -#define __cpu_to_be16s(x) __swab16s((x)) -#define __be16_to_cpus(x) __swab16s((x)) -#endif // __constant_htonl - -#include - -#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/swab.h b/drivers/net/wireless/rtl8192c/include/byteorder/swab.h deleted file mode 100755 index 117c84deea5e..000000000000 --- a/drivers/net/wireless/rtl8192c/include/byteorder/swab.h +++ /dev/null @@ -1,133 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _LINUX_BYTEORDER_SWAB_H -#define _LINUX_BYTEORDER_SWAB_H - -#if !defined(CONFIG_PLATFORM_MSTAR_TITANIA12) -#ifndef __u16 -typedef unsigned short __u16; -#endif - -#ifndef __u32 -typedef unsigned int __u32; -#endif - -#ifndef __u8 -typedef unsigned char __u8; -#endif - -#ifndef __u64 -typedef unsigned long long __u64; -#endif - - -__inline static __u16 ___swab16(__u16 x) -{ - __u16 __x = x; - return - ((__u16)( - (((__u16)(__x) & (__u16)0x00ffU) << 8) | - (((__u16)(__x) & (__u16)0xff00U) >> 8) )); - -} - -__inline static __u32 ___swab32(__u32 x) -{ - __u32 __x = (x); - return ((__u32)( - (((__u32)(__x) & (__u32)0x000000ffUL) << 24) | - (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) | - (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) | - (((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); -} - -__inline static __u64 ___swab64(__u64 x) -{ - __u64 __x = (x); - - return - ((__u64)( \ - (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \ - (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \ - (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \ - (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \ - (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \ - (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ - (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \ - (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \ -} -#endif // CONFIG_PLATFORM_MSTAR_TITANIA12 - -#ifndef __arch__swab16 -__inline static __u16 __arch__swab16(__u16 x) -{ - return ___swab16(x); -} - -#endif - -#ifndef __arch__swab32 -__inline static __u32 __arch__swab32(__u32 x) -{ - __u32 __tmp = (x) ; - return ___swab32(__tmp); -} -#endif - -#ifndef __arch__swab64 - -__inline static __u64 __arch__swab64(__u64 x) -{ - __u64 __tmp = (x) ; - return ___swab64(__tmp); -} - - -#endif - -#ifndef __swab16 -#define __swab16(x) __fswab16(x) -#define __swab32(x) __fswab32(x) -#define __swab64(x) __fswab64(x) -#endif // __swab16 - -__inline static const __u16 __fswab16(__u16 x) -{ - return __arch__swab16(x); -} -__inline static const __u32 __fswab32(__u32 x) -{ - return __arch__swab32(x); -} - -#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) -#define swab16 __swab16 -#define swab32 __swab32 -#define swab64 __swab64 -#define swab16p __swab16p -#define swab32p __swab32p -#define swab64p __swab64p -#define swab16s __swab16s -#define swab32s __swab32s -#define swab64s __swab64s -#endif - -#endif /* _LINUX_BYTEORDER_SWAB_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h b/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h deleted file mode 100755 index 1735349f82ca..000000000000 --- a/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h +++ /dev/null @@ -1,157 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _LINUX_BYTEORDER_SWABB_H -#define _LINUX_BYTEORDER_SWABB_H - -/* - * linux/byteorder/swabb.h - * SWAp Bytes Bizarrely - * swaHHXX[ps]?(foo) - * - * Support for obNUXIous pdp-endian and other bizarre architectures. - * Will Linux ever run on such ancient beasts? if not, this file - * will be but a programming pearl. Still, it's a reminder that we - * shouldn't be making too many assumptions when trying to be portable. - * - */ - -/* - * Meaning of the names I chose (vaxlinux people feel free to correct them): - * swahw32 swap 16-bit half-words in a 32-bit word - * swahb32 swap 8-bit halves of each 16-bit half-word in a 32-bit word - * - * No 64-bit support yet. I don't know NUXI conventions for long longs. - * I guarantee it will be a mess when it's there, though :-> - * It will be even worse if there are conflicting 64-bit conventions. - * Hopefully, no one ever used 64-bit objects on NUXI machines. - * - */ - -#define ___swahw32(x) \ -({ \ - __u32 __x = (x); \ - ((__u32)( \ - (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \ - (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \ -}) -#define ___swahb32(x) \ -({ \ - __u32 __x = (x); \ - ((__u32)( \ - (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \ - (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \ -}) - -#define ___constant_swahw32(x) \ - ((__u32)( \ - (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ - (((__u32)(x) & (__u32)0xffff0000UL) >> 16) )) -#define ___constant_swahb32(x) \ - ((__u32)( \ - (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ - (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) )) - -/* - * provide defaults when no architecture-specific optimization is detected - */ -#ifndef __arch__swahw32 -# define __arch__swahw32(x) ___swahw32(x) -#endif -#ifndef __arch__swahb32 -# define __arch__swahb32(x) ___swahb32(x) -#endif - -#ifndef __arch__swahw32p -# define __arch__swahw32p(x) __swahw32(*(x)) -#endif -#ifndef __arch__swahb32p -# define __arch__swahb32p(x) __swahb32(*(x)) -#endif - -#ifndef __arch__swahw32s -# define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0) -#endif -#ifndef __arch__swahb32s -# define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0) -#endif - - -/* - * Allow constant folding - */ -#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) -# define __swahw32(x) \ -(__builtin_constant_p((__u32)(x)) ? \ - ___swahw32((x)) : \ - __fswahw32((x))) -# define __swahb32(x) \ -(__builtin_constant_p((__u32)(x)) ? \ - ___swahb32((x)) : \ - __fswahb32((x))) -#else -# define __swahw32(x) __fswahw32(x) -# define __swahb32(x) __fswahb32(x) -#endif /* OPTIMIZE */ - - -__inline static__ __const__ __u32 __fswahw32(__u32 x) -{ - return __arch__swahw32(x); -} -__inline static__ __u32 __swahw32p(__u32 *x) -{ - return __arch__swahw32p(x); -} -__inline static__ void __swahw32s(__u32 *addr) -{ - __arch__swahw32s(addr); -} - - -__inline static__ __const__ __u32 __fswahb32(__u32 x) -{ - return __arch__swahb32(x); -} -__inline static__ __u32 __swahb32p(__u32 *x) -{ - return __arch__swahb32p(x); -} -__inline static__ void __swahb32s(__u32 *addr) -{ - __arch__swahb32s(addr); -} - -#ifdef __BYTEORDER_HAS_U64__ -/* - * Not supported yet - */ -#endif /* __BYTEORDER_HAS_U64__ */ - -#if defined(PLATFORM_LINUX) -#define swahw32 __swahw32 -#define swahb32 __swahb32 -#define swahw32p __swahw32p -#define swahb32p __swahb32p -#define swahw32s __swahw32s -#define swahb32s __swahb32s -#endif - -#endif /* _LINUX_BYTEORDER_SWABB_H */ diff --git a/drivers/net/wireless/rtl8192c/include/circ_buf.h b/drivers/net/wireless/rtl8192c/include/circ_buf.h deleted file mode 100755 index 1bd4704a7c33..000000000000 --- a/drivers/net/wireless/rtl8192c/include/circ_buf.h +++ /dev/null @@ -1,27 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __CIRC_BUF_H_ -#define __CIRC_BUF_H_ 1 - -#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1)) - -#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size)) - -#endif //_CIRC_BUF_H_ diff --git a/drivers/net/wireless/rtl8192c/include/cmd_osdep.h b/drivers/net/wireless/rtl8192c/include/cmd_osdep.h deleted file mode 100755 index 077efa731f9a..000000000000 --- a/drivers/net/wireless/rtl8192c/include/cmd_osdep.h +++ /dev/null @@ -1,36 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __CMD_OSDEP_H_ -#define __CMD_OSDEP_H_ - - -#include -#include -#include - -extern sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); -extern sint _rtw_init_evt_priv(struct evt_priv *pevtpriv); -extern void _rtw_free_evt_priv (struct evt_priv *pevtpriv); -extern void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv); -extern sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj); -extern struct cmd_obj *_rtw_dequeue_cmd(_queue *queue); - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/drv_conf.h b/drivers/net/wireless/rtl8192c/include/drv_conf.h deleted file mode 100755 index b6d2acdc8afe..000000000000 --- a/drivers/net/wireless/rtl8192c/include/drv_conf.h +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_CONF_H__ -#define __DRV_CONF_H__ -#include "autoconf.h" - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -//Rockchips' android kernel doesn't has CONFIG_ANDROID defined, -//add this to force CONFIG_ANDROID defined -#ifdef CONFIG_PLATFORM_ANDROID -//#define CONFIG_ANDROID -#endif - -#if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE) - #warning "You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically.\n" - #undef CONFIG_RESUME_IN_WORKQUEUE -#endif - -#if defined(CONFIG_ANDROID_POWER) && defined (CONFIG_RESUME_IN_WORKQUEUE) - #warning "You have CONFIG_ANDROID_POWER enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically.\n" - #undef CONFIG_RESUME_IN_WORKQUEUE -#endif - -#ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this... - #if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER) - #error "enable CONFIG_RESUME_IN_WORKQUEUE without CONFIG_WAKELOCK or CONFIG_ANDROID_POWER will suffer from the danger of wifi's unfunctionality...\n" - #error "If you still want to enable CONFIG_RESUME_IN_WORKQUEUE in this case, mask this preprossor checking and GOOD LUCK...\n" - #endif -#endif - - -//#include - -#endif // __DRV_CONF_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/drv_types.h b/drivers/net/wireless/rtl8192c/include/drv_types.h deleted file mode 100755 index 2a6757d18630..000000000000 --- a/drivers/net/wireless/rtl8192c/include/drv_types.h +++ /dev/null @@ -1,432 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/*------------------------------------------------------------------------------- - - For type defines and data structure defines - ---------------------------------------------------------------------------------*/ - - -#ifndef __DRV_TYPES_H__ -#define __DRV_TYPES_H__ - -#include -#include -#include - - -#ifdef PLATFORM_OS_XP -#include -#endif - -#ifdef PLATFORM_OS_CE -#include -#endif - -#ifdef PLATFORM_LINUX -#include -#endif - -enum _NIC_VERSION { - - RTL8711_NIC, - RTL8712_NIC, - RTL8713_NIC, - RTL8716_NIC - -}; - -enum{ - UP_LINK, - DOWN_LINK, -}; -typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER; - -#ifdef CONFIG_80211N_HT -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_DRVEXT_MODULE -#include -#endif - -#ifdef CONFIG_MP_INCLUDED -#include -#endif - -#define SPEC_DEV_ID_NONE BIT(0) -#define SPEC_DEV_ID_DISABLE_HT BIT(1) -#define SPEC_DEV_ID_ENABLE_PS BIT(2) -#define SPEC_DEV_ID_RF_CONFIG_1T1R BIT(3) -#define SPEC_DEV_ID_RF_CONFIG_2T2R BIT(4) -#define SPEC_DEV_ID_ASSIGN_IFNAME BIT(5) - -struct specific_device_id{ - - u32 flags; - - u16 idVendor; - u16 idProduct; - -}; - -struct registry_priv -{ - u8 chip_version; - u8 rfintfs; - u8 lbkmode; - u8 hci; - NDIS_802_11_SSID ssid; - u8 network_mode; //infra, ad-hoc, auto - u8 channel;//ad-hoc support requirement - u8 wireless_mode;//A, B, G, auto - u8 scan_mode;//active, passive - u8 radio_enable; - u8 preamble;//long, short, auto - u8 vrtl_carrier_sense;//Enable, Disable, Auto - u8 vcs_type;//RTS/CTS, CTS-to-self - u16 rts_thresh; - u16 frag_thresh; - u8 adhoc_tx_pwr; - u8 soft_ap; - u8 power_mgnt; - u8 ips_mode; - u8 smart_ps; - u8 long_retry_lmt; - u8 short_retry_lmt; - u16 busy_thresh; - u8 ack_policy; - u8 mp_mode; - u8 software_encrypt; - u8 software_decrypt; - - //UAPSD - u8 wmm_enable; - u8 uapsd_enable; - u8 uapsd_max_sp; - u8 uapsd_acbk_en; - u8 uapsd_acbe_en; - u8 uapsd_acvi_en; - u8 uapsd_acvo_en; - - WLAN_BSSID_EX dev_network; - -#ifdef CONFIG_80211N_HT - u8 ht_enable; - u8 cbw40_enable; - u8 ampdu_enable;//for tx -#endif - u8 rf_config ; - u8 low_power ; - - u8 wifi_spec;// !turbo_mode - - u8 channel_plan; -#ifdef CONFIG_BT_COEXIST - u8 bt_iso; - u8 bt_sco; - u8 bt_ampdu; -#endif - BOOLEAN bAcceptAddbaReq; - - u8 antdiv_cfg; - - u8 usbss_enable;//0:disable,1:enable - u8 hwpdn_mode;//0:disable,1:enable,2:deside by EFUSE config - u8 hwpwrp_detect;//0:disable,1:enable - - u8 hw_wps_pbc;//0:disable,1:enable - -#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - char adaptor_info_caching_file_path[PATH_LENGTH_MAX]; -#endif - -#ifdef CONFIG_LAYER2_ROAMING - u8 max_roaming_times; // the max number driver will try to roaming -#endif -}; - - -//For registry parameters -#define RGTRY_OFT(field) ((ULONG)FIELD_OFFSET(struct registry_priv,field)) -#define RGTRY_SZ(field) sizeof(((struct registry_priv*) 0)->field) -#define BSSID_OFT(field) ((ULONG)FIELD_OFFSET(WLAN_BSSID_EX,field)) -#define BSSID_SZ(field) sizeof(((PWLAN_BSSID_EX) 0)->field) - -#define MAX_CONTINUAL_URB_ERR 4 - -struct dvobj_priv { - - _adapter * padapter; - - //For 92D, DMDP have 2 interface. - u8 InterfaceNumber; - u8 NumInterfaces; - -/*-------- below is for SDIO INTERFACE --------*/ - -#ifdef CONFIG_SDIO_HCI - -#ifdef PLATFORM_OS_XP - PDEVICE_OBJECT pphysdevobj;//pPhysDevObj; - PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj; - PDEVICE_OBJECT pnextdevobj;//pNextDevObj; - SDBUS_INTERFACE_STANDARD sdbusinft;//SdBusInterface; - u8 nextdevstacksz;//unsigned char NextDeviceStackSize; -#endif//PLATFORM_OS_XP - -#ifdef PLATFORM_OS_CE - SD_DEVICE_HANDLE hDevice; - SD_CARD_RCA sd_rca; - SD_CARD_INTERFACE card_intf; - BOOLEAN enableIsarWithStatus; - WCHAR active_path[MAX_ACTIVE_REG_PATH]; - SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; -#endif//PLATFORM_OS_CE - -#ifdef PLATFORM_LINUX - struct sdio_func *func; -#endif//PLATFORM_LINUX - - u8 func_number;//unsigned char FunctionNumber; - u32 block_transfer_len;//unsigned long BLOCK_TRANSFER_LEN; - u32 blk_shiftbits; - u16 driver_version; - u16 rxblknum; - u16 rxblknum_rd; - u16 c2hblknum; - u8 tx_block_mode; - u8 rx_block_mode; - u8 cmdfifo_cnt; - u8 rxfifo_cnt; - u16 sdio_hisr; - u16 sdio_himr; -#endif// CONFIG_SDIO_HCI - -/*-------- below is for USB INTERFACE --------*/ - -#ifdef CONFIG_USB_HCI - - u8 nr_endpoint; - u8 ishighspeed; - u8 RtNumInPipes; - u8 RtNumOutPipes; - int ep_num[5]; //endpoint number - - int RegUsbSS; - - _sema usb_suspend_sema; -#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC - _mutex usb_vendor_req_mutex; - u8 * usb_alloc_vendor_req_buf; - u8 * usb_vendor_req_buf; -#endif -#ifdef PLATFORM_WINDOWS - //related device objects - PDEVICE_OBJECT pphysdevobj;//pPhysDevObj; - PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj; - PDEVICE_OBJECT pnextdevobj;//pNextDevObj; - - u8 nextdevstacksz;//unsigned char NextDeviceStackSize; //= (CHAR)CEdevice->pUsbDevObj->StackSize + 1; - - //urb for control diescriptor request - -#ifdef PLATFORM_OS_XP - struct _URB_CONTROL_DESCRIPTOR_REQUEST descriptor_urb; - PUSB_CONFIGURATION_DESCRIPTOR pconfig_descriptor;//UsbConfigurationDescriptor; -#endif - -#ifdef PLATFORM_OS_CE - WCHAR active_path[MAX_ACTIVE_REG_PATH]; // adapter regpath - USB_EXTENSION usb_extension; - - _nic_hdl pipehdls_r8192c[0x10]; -#endif - - u32 config_descriptor_len;//ULONG UsbConfigurationDescriptorLength; -#endif//PLATFORM_WINDOWS - -#ifdef PLATFORM_LINUX - struct usb_interface *pusbintf; - struct usb_device *pusbdev; -#endif//PLATFORM_LINUX - - ATOMIC_T continual_urb_error; -#endif//CONFIG_USB_HCI - -/*-------- below is for PCIE INTERFACE --------*/ - -#ifdef CONFIG_PCI_HCI - -#ifdef PLATFORM_LINUX - struct pci_dev *ppcidev; - - //PCI MEM map - unsigned long pci_mem_end; /* shared mem end */ - unsigned long pci_mem_start; /* shared mem start */ - - //PCI IO map - unsigned long pci_base_addr; /* device I/O address */ - - //PciBridge - struct pci_priv pcipriv; - - u16 irqline; - u8 irq_enabled; - u8 irq_alloc; - RT_ISR_CONTENT isr_content; - _lock irq_th_lock; - - //ASPM - u8 const_pci_aspm; - u8 const_amdpci_aspm; - u8 const_hwsw_rfoff_d3; - u8 const_support_pciaspm; - // pci-e bridge */ - u8 const_hostpci_aspm_setting; - // pci-e device */ - u8 const_devicepci_aspm_setting; - u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. - u8 b_support_backdoor; -#endif//PLATFORM_LINUX - -#endif//CONFIG_PCI_HCI -}; - -typedef enum _DRIVER_STATE{ - DRIVER_NORMAL = 0, - DRIVER_DISAPPEAR = 1, - DRIVER_REPLACE_DONGLE = 2, -}DRIVER_STATE; - -struct _ADAPTER{ - int DriverState;// for disable driver using module, use dongle to replace module. - int pid[3];//process id from UI, 0:wpa_supplicant, 1:hostapd, 2:dhcpcd - int bDongle;//build-in module or external dongle - u16 chip_type; - u16 HardwareType; - u16 interface_type;//USB,SDIO,PCI - - struct dvobj_priv dvobjpriv; - struct mlme_priv mlmepriv; - struct mlme_ext_priv mlmeextpriv; - struct cmd_priv cmdpriv; - struct evt_priv evtpriv; - //struct io_queue *pio_queue; - struct io_priv iopriv; - struct xmit_priv xmitpriv; - struct recv_priv recvpriv; - struct sta_priv stapriv; - struct security_priv securitypriv; - struct registry_priv registrypriv; - struct wlan_acl_pool acl_list; - struct pwrctrl_priv pwrctrlpriv; - struct eeprom_priv eeprompriv; - struct led_priv ledpriv; - -#ifdef CONFIG_DRVEXT_MODULE - struct drvext_priv drvextpriv; -#endif - -#ifdef CONFIG_AP_MODE - struct hostapd_priv *phostapdpriv; -#endif - -#ifdef CONFIG_P2P - struct wifidirect_info wdinfo; -#endif //CONFIG_P2P - - PVOID HalData; - struct hal_ops HalFunc; - -#ifdef CONFIG_BT_COEXIST - //struct btcoexist_priv bt_coexist; -#endif - s32 bDriverStopped; - s32 bSurpriseRemoved; - s32 bCardDisableWOHSM; - - u32 IsrContent; - u32 ImrContent; - - u8 EepromAddressSize; - u8 hw_init_completed; - u8 init_adpt_in_progress; - u8 bfirst_init; - - _thread_hdl_ cmdThread; - _thread_hdl_ evtThread; - _thread_hdl_ xmitThread; - _thread_hdl_ recvThread; - - - NDIS_STATUS (*dvobj_init)(_adapter * adapter); - void (*dvobj_deinit)(_adapter * adapter); - - void (*intf_start)(_adapter * adapter); - void (*intf_stop)(_adapter * adapter); - -#ifdef PLATFORM_LINUX - _nic_hdl pnetdev; - _nic_hdl old_pnetdev; // used for rtw_change_ifname - int bup; - struct net_device_stats stats; - struct iw_statistics iwstats; - struct proc_dir_entry *dir_dev;// for proc directory -#endif //end of PLATFORM_LINUX - - int net_closed; - - u8 bFWReady; - u8 bReadPortCancel; - u8 bWritePortCancel; - u8 bRxRSSIDisplay; -#ifdef CONFIG_AUTOSUSPEND - u8 bDisableAutosuspend; -#endif -}; - -__inline static u8 *myid(struct eeprom_priv *peepriv) -{ - return (peepriv->mac_addr); -} - - -#endif //__DRV_TYPES_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_ce.h b/drivers/net/wireless/rtl8192c/include/drv_types_ce.h deleted file mode 100755 index be0459dcb219..000000000000 --- a/drivers/net/wireless/rtl8192c/include/drv_types_ce.h +++ /dev/null @@ -1,92 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_CE_H__ -#define __DRV_TYPES_CE_H__ - -#include -#include - -#include - -#define MAX_ACTIVE_REG_PATH 256 - -#define MAX_MCAST_LIST_NUM 32 - - - -//for ioctl -#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer) - -#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h -#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h -#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h -#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h -#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h - -typedef struct _MP_REG_ENTRY -{ - - NDIS_STRING RegName; // variable name text - BOOLEAN bRequired; // 1 -> required, 0 -> optional - - u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString - uint FieldOffset; // offset to MP_ADAPTER field - uint FieldSize; // size (in bytes) of the field - -#ifdef UNDER_AMD64 - u64 Default; -#else - u32 Default; // default value to use -#endif - - u32 Min; // minimum value allowed - u32 Max; // maximum value allowed -} MP_REG_ENTRY, *PMP_REG_ENTRY; - -#ifdef CONFIG_USB_HCI -typedef struct _USB_EXTENSION { - LPCUSB_FUNCS _lpUsbFuncs; - USB_HANDLE _hDevice; - PVOID pAdapter; - -#if 0 - USB_ENDPOINT_DESCRIPTOR _endpACLIn; - USB_ENDPOINT_DESCRIPTOR _endpACLOutHigh; - USB_ENDPOINT_DESCRIPTOR _endpACLOutNormal; - - USB_PIPE pPipeIn; - USB_PIPE pPipeOutNormal; - USB_PIPE pPipeOutHigh; -#endif - -} USB_EXTENSION, *PUSB_EXTENSION; -#endif - - -typedef struct _OCTET_STRING{ - u8 *Octet; - u16 Length; -} OCTET_STRING, *POCTET_STRING; - - - - - -#endif diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_linux.h b/drivers/net/wireless/rtl8192c/include/drv_types_linux.h deleted file mode 100755 index db1c585690ff..000000000000 --- a/drivers/net/wireless/rtl8192c/include/drv_types_linux.h +++ /dev/null @@ -1,25 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_LINUX_H__ -#define __DRV_TYPES_LINUX_H__ - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_xp.h b/drivers/net/wireless/rtl8192c/include/drv_types_xp.h deleted file mode 100755 index 2d51b1db13b0..000000000000 --- a/drivers/net/wireless/rtl8192c/include/drv_types_xp.h +++ /dev/null @@ -1,95 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __DRV_TYPES_XP_H__ -#define __DRV_TYPES_XP_H__ - -#include -#include - - - -#define MAX_MCAST_LIST_NUM 32 - - - -//for ioctl -#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer) - -#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h -#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h -#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h -#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h -#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h - - -#undef ON_VISTA -//added by Jackson -#ifndef ON_VISTA -// -// Bus driver versions -// - -#define SDBUS_DRIVER_VERSION_1 0x100 -#define SDBUS_DRIVER_VERSION_2 0x200 - -#define SDP_FUNCTION_TYPE 4 -#define SDP_BUS_DRIVER_VERSION 5 -#define SDP_BUS_WIDTH 6 -#define SDP_BUS_CLOCK 7 -#define SDP_BUS_INTERFACE_CONTROL 8 -#define SDP_HOST_BLOCK_LENGTH 9 -#define SDP_FUNCTION_BLOCK_LENGTH 10 -#define SDP_FN0_BLOCK_LENGTH 11 -#define SDP_FUNCTION_INT_ENABLE 12 -#endif - - -typedef struct _MP_REG_ENTRY -{ - - NDIS_STRING RegName; // variable name text - BOOLEAN bRequired; // 1 -> required, 0 -> optional - - u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString - uint FieldOffset; // offset to MP_ADAPTER field - uint FieldSize; // size (in bytes) of the field - -#ifdef UNDER_AMD64 - u64 Default; -#else - u32 Default; // default value to use -#endif - - u32 Min; // minimum value allowed - u32 Max; // maximum value allowed -} MP_REG_ENTRY, *PMP_REG_ENTRY; - - -typedef struct _OCTET_STRING{ - u8 *Octet; - u16 Length; -} OCTET_STRING, *POCTET_STRING; - - - - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/ethernet.h b/drivers/net/wireless/rtl8192c/include/ethernet.h deleted file mode 100755 index 36e29c060d3f..000000000000 --- a/drivers/net/wireless/rtl8192c/include/ethernet.h +++ /dev/null @@ -1,41 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -/*! \file */ -#ifndef __INC_ETHERNET_H -#define __INC_ETHERNET_H - -#define ETHERNET_ADDRESS_LENGTH 6 //!< Ethernet Address Length -#define ETHERNET_HEADER_SIZE 14 //!< Ethernet Header Length -#define LLC_HEADER_SIZE 6 //!< LLC Header Length -#define TYPE_LENGTH_FIELD_SIZE 2 //!< Type/Length Size -#define MINIMUM_ETHERNET_PACKET_SIZE 60 //!< Minimum Ethernet Packet Size -#define MAXIMUM_ETHERNET_PACKET_SIZE 1514 //!< Maximum Ethernet Packet Size - -#define RT_ETH_IS_MULTICAST(_pAddr) ((((UCHAR *)(_pAddr))[0]&0x01)!=0) //!< Is Multicast Address? -#define RT_ETH_IS_BROADCAST(_pAddr) ( \ - ((UCHAR *)(_pAddr))[0]==0xff && \ - ((UCHAR *)(_pAddr))[1]==0xff && \ - ((UCHAR *)(_pAddr))[2]==0xff && \ - ((UCHAR *)(_pAddr))[3]==0xff && \ - ((UCHAR *)(_pAddr))[4]==0xff && \ - ((UCHAR *)(_pAddr))[5]==0xff ) //!< Is Broadcast Address? - - -#endif // #ifndef __INC_ETHERNET_H diff --git a/drivers/net/wireless/rtl8192c/include/farray.h b/drivers/net/wireless/rtl8192c/include/farray.h deleted file mode 100755 index 79d2a4284598..000000000000 --- a/drivers/net/wireless/rtl8192c/include/farray.h +++ /dev/null @@ -1,31480 +0,0 @@ -unsigned char f_array[125912] = { -0x12,0x87,0x09,0x10, -0x30,0x00,0x00,0x00, -0x08,0xF8,0x00,0x00, -0x50,0xF3,0x00,0x00, -0x30,0x00,0x00,0x00, -0xB8,0xF1,0x00,0x00, -0x00,0x00,0x00,0x00, -0x10,0x27,0x17,0x41, -0x87,0x12,0x12,0x01, -0x00,0x00,0x12,0x06, -0x00,0x00,0x00,0x00, -0x00,0x07,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x01,0x01,0x00,0x01, -0x01,0x01,0x00,0x00, -0x01,0x00,0x01,0x00, -0x00,0x00,0x01,0x01, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x7F,0x00,0x00,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x1F,0x00,0x00,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x1A,0x3C, -0x80,0x03,0x5A,0x37, -0x00,0x80,0x1B,0x3C, -0x80,0x00,0x7B,0x37, -0x00,0x00,0x5B,0xAF, -0x25,0xB0,0x1A,0x3C, -0x18,0x03,0x5A,0x37, -0x00,0x80,0x1B,0x3C, -0x80,0x00,0x7B,0x37, -0x00,0x00,0x5B,0xAF, -0x01,0x80,0x1A,0x3C, -0x90,0xEE,0x5A,0x27, -0x08,0x00,0x40,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x04,0x00,0xA1,0xAF, -0x08,0x00,0xA2,0xAF, -0x0C,0x00,0xA3,0xAF, -0x10,0x00,0xA4,0xAF, -0x14,0x00,0xA5,0xAF, -0x18,0x00,0xA6,0xAF, -0x1C,0x00,0xA7,0xAF, -0x20,0x00,0xA8,0xAF, -0x24,0x00,0xA9,0xAF, -0x28,0x00,0xAA,0xAF, -0x2C,0x00,0xAB,0xAF, -0x30,0x00,0xAC,0xAF, -0x34,0x00,0xAD,0xAF, -0x38,0x00,0xAE,0xAF, -0x3C,0x00,0xAF,0xAF, -0x12,0x40,0x00,0x00, -0x10,0x48,0x00,0x00, -0x00,0x70,0x0A,0x40, -0x40,0x00,0xB0,0xAF, -0x44,0x00,0xB1,0xAF, -0x48,0x00,0xB2,0xAF, -0x4C,0x00,0xB3,0xAF, -0x50,0x00,0xB4,0xAF, -0x54,0x00,0xB5,0xAF, -0x58,0x00,0xB6,0xAF, -0x5C,0x00,0xB7,0xAF, -0x60,0x00,0xB8,0xAF, -0x64,0x00,0xB9,0xAF, -0x68,0x00,0xBC,0xAF, -0x6C,0x00,0xBD,0xAF, -0x70,0x00,0xBE,0xAF, -0x74,0x00,0xBF,0xAF, -0x78,0x00,0xA8,0xAF, -0x7C,0x00,0xA9,0xAF, -0x80,0x00,0xAA,0xAF, -0x32,0x3B,0x00,0x08, -0x21,0x20,0xA0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x05,0x3C, -0x00,0x80,0x02,0x3C, -0xE0,0xFF,0xBD,0x27, -0x18,0x03,0xA3,0x34, -0x00,0x03,0x42,0x24, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x62,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x42,0xB0,0x02,0x3C, -0x03,0x00,0x46,0x34, -0x00,0x00,0xC3,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x70,0x30, -0x10,0x00,0x02,0x32, -0x18,0x00,0x40,0x10, -0x02,0x80,0x11,0x3C, -0x30,0x1F,0x27,0x26, -0x78,0x36,0xE4,0x94, -0x10,0x00,0x02,0x24, -0x00,0x00,0xC2,0xA0, -0x08,0x00,0x80,0x10, -0x1C,0x03,0xA3,0x34, -0x7C,0x36,0xE2,0x94, -0xB0,0x03,0xA4,0x34, -0x00,0x00,0x62,0xAC, -0x00,0x00,0x80,0xAC, -0x78,0x36,0xE0,0xA4, -0x7C,0x36,0xE0,0xA4, -0x00,0x00,0x04,0x24, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x06,0x3C, -0x14,0x5E,0xA2,0x8C, -0x18,0x5F,0xC3,0x8C, -0x01,0x00,0x84,0x24, -0x01,0x00,0x42,0x24, -0x01,0x00,0x63,0x24, -0x78,0x36,0xE4,0xA4, -0x14,0x5E,0xA2,0xAC, -0x18,0x5F,0xC3,0xAC, -0x00,0x16,0x10,0x00, -0x03,0x16,0x02,0x00, -0x7B,0x00,0x40,0x04, -0x42,0xB0,0x02,0x3C, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x40,0x00,0x02,0x32, -0x16,0x00,0x40,0x10, -0x30,0x1F,0x24,0x26, -0x42,0xB0,0x0B,0x3C, -0x03,0x00,0x62,0x35, -0x40,0x00,0x03,0x24, -0x00,0x00,0x43,0xA0, -0x02,0x80,0x03,0x3C, -0x12,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x1A,0x00,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x12,0x5F,0x60,0xA0, -0x02,0x80,0x04,0x3C, -0x0E,0x5F,0x83,0x90, -0xFD,0xFF,0x02,0x24, -0x24,0x18,0x62,0x00, -0x0E,0x5F,0x83,0xA0, -0x0E,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x42,0x30, -0x5D,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x24,0x26, -0xE0,0x1B,0x83,0x94, -0xDC,0x1B,0x85,0x94, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x80,0x00,0x63,0x30, -0x41,0xB0,0x02,0x3C, -0x25,0x18,0x65,0x00, -0x08,0x00,0x42,0x34, -0x20,0x00,0xBD,0x27, -0x00,0x00,0x43,0xA4, -0x08,0x00,0xE0,0x03, -0xDC,0x1B,0x83,0xA4, -0xFA,0x5E,0x82,0x90, -0x02,0x80,0x05,0x3C, -0x01,0x00,0x42,0x24, -0xFA,0x5E,0x82,0xA0, -0x0E,0x5F,0xA3,0x90, -0xEF,0xFF,0x02,0x24, -0x24,0x18,0x62,0x00, -0x0E,0x5F,0xA3,0xA0, -0xFA,0x5E,0x82,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x2C, -0x32,0x00,0x40,0x10, -0x30,0x1F,0x23,0x26, -0x25,0xB0,0x06,0x3C, -0x84,0x00,0xC4,0x34, -0x80,0x00,0xC6,0x34, -0x00,0x00,0x82,0x8C, -0x00,0x00,0xC4,0x8C, -0x02,0x80,0x08,0x3C, -0x21,0x10,0x00,0x00, -0x1C,0x5F,0x06,0x8D, -0x25,0x10,0x44,0x00, -0x02,0x80,0x04,0x3C, -0x20,0x5F,0x88,0x8C, -0x24,0x5F,0x89,0x8C, -0x00,0x00,0x65,0x91, -0x21,0x10,0x46,0x00, -0xFB,0xFF,0x04,0x24, -0x24,0x28,0xA4,0x00, -0x23,0x40,0x02,0x01, -0x00,0x00,0x65,0xA1, -0x04,0x00,0x00,0x11, -0x01,0x00,0x06,0x24, -0x80,0x10,0x08,0x00, -0x21,0x10,0x48,0x00, -0x80,0x30,0x02,0x00, -0x01,0x00,0x04,0x24, -0x8C,0x23,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x42,0xB0,0x02,0x3C, -0x22,0x00,0x04,0x24, -0x03,0x00,0x42,0x34, -0x00,0x00,0x44,0xA0, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x64,0x90, -0x01,0x00,0x05,0x24, -0x64,0x31,0x00,0x0C, -0xFF,0x00,0x84,0x30, -0x30,0x1F,0x24,0x26, -0xE0,0x1B,0x83,0x94, -0xDC,0x1B,0x85,0x94, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x80,0x00,0x63,0x30, -0x41,0xB0,0x02,0x3C, -0x25,0x18,0x65,0x00, -0x08,0x00,0x42,0x34, -0x20,0x00,0xBD,0x27, -0x00,0x00,0x43,0xA4, -0x08,0x00,0xE0,0x03, -0xDC,0x1B,0x83,0xA4, -0xB0,0x1B,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x16,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x15,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0xAB,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x15,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x15,0x5F,0x62,0xA0, -0x0B,0x01,0x00,0x08, -0x30,0x1F,0x24,0x26, -0x0C,0x5F,0x40,0xA0, -0x44,0x01,0x00,0x08, -0x02,0x80,0x03,0x3C, -0x80,0xFF,0x03,0x24, -0x03,0x00,0x42,0x34, -0x00,0x00,0x43,0xA0, -0x9E,0x25,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEF,0x00,0x00,0x08, -0x00,0x00,0x00,0x00, -0x15,0x5F,0x40,0xA0, -0x0B,0x01,0x00,0x08, -0x30,0x1F,0x24,0x26, -0xFF,0x00,0x84,0x30, -0x0B,0x00,0x82,0x2C, -0xFF,0xFF,0xE7,0x30, -0x10,0x00,0xA8,0x93, -0x19,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x80,0x10,0x04,0x00, -0xD8,0xE9,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x43,0xB0,0x02,0x3C, -0x78,0x00,0x44,0x34, -0x07,0x00,0xE2,0x30, -0x00,0x00,0x85,0xAC, -0x04,0x00,0x86,0xAC, -0x04,0x00,0x40,0x18, -0x00,0x00,0x00,0x00, -0xF8,0xFF,0xE2,0x30, -0x08,0x00,0x42,0x24, -0xFF,0xFF,0x47,0x30, -0x21,0x10,0xE8,0x00, -0x00,0x80,0x03,0x3C, -0x08,0x00,0x82,0xAC, -0x25,0x10,0x43,0x00, -0x08,0x00,0x82,0xAC, -0x01,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x6C,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x60,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x54,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x48,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x3C,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x30,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x24,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x18,0x00,0x44,0x34, -0x43,0xB0,0x02,0x3C, -0x83,0x01,0x00,0x08, -0x0C,0x00,0x44,0x34, -0x83,0x01,0x00,0x08, -0x43,0xB0,0x04,0x3C, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x18,0x03,0x42,0x34, -0xC0,0x06,0x63,0x24, -0x00,0x00,0x43,0xAC, -0x01,0x00,0x05,0x24, -0x43,0xB0,0x02,0x3C, -0x04,0x28,0x85,0x00, -0x88,0x00,0x44,0x34, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0xFF,0x42,0x30, -0x05,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x00,0x00,0x82,0x94, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x42,0x30, -0x24,0x10,0x45,0x00, -0xF5,0xFF,0x40,0x1C, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x08,0x3C, -0x00,0x80,0x02,0x3C, -0xC8,0xFF,0xBD,0x27, -0x18,0x03,0x03,0x35, -0x1C,0x07,0x42,0x24, -0x00,0x00,0x62,0xAC, -0x30,0x00,0xB6,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x1C,0x00,0xB1,0xAF, -0x34,0x00,0xBF,0xAF, -0x2C,0x00,0xB5,0xAF, -0x20,0x00,0xB2,0xAF, -0x18,0x00,0xB0,0xAF, -0x0C,0x00,0xF2,0x84, -0x08,0x00,0xF5,0x8C, -0xFF,0x00,0xC6,0x30, -0x00,0x01,0x02,0x24, -0x23,0x10,0x46,0x00, -0xFF,0xFF,0x51,0x30, -0xD0,0x03,0x08,0x35, -0xFF,0x00,0x96,0x30, -0x00,0x00,0x12,0xAD, -0x21,0xA0,0xA0,0x00, -0x21,0x30,0xC5,0x00, -0x00,0x00,0x15,0xAD, -0x21,0x20,0xC0,0x02, -0x21,0x28,0xA0,0x02, -0x21,0x38,0x20,0x02, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x23,0x18,0x51,0x02, -0xFF,0xFF,0x82,0x32, -0x00,0x94,0x03,0x00, -0x03,0x94,0x12,0x00, -0x09,0x02,0x00,0x08, -0x02,0x9A,0x02,0x00, -0x28,0xB0,0x03,0x3C, -0xC0,0x10,0x13,0x00, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x90, -0x25,0xB0,0x10,0x3C, -0x20,0x10,0x02,0x3C, -0xFF,0x00,0x93,0x30, -0x00,0x22,0x13,0x00, -0xFF,0xFF,0x43,0x32, -0x01,0x01,0x45,0x2A, -0x21,0xA0,0x82,0x00, -0x21,0xA8,0xB1,0x02, -0xD0,0x03,0x02,0x36, -0x00,0x01,0x11,0x24, -0x0B,0x88,0x65,0x00, -0x21,0x20,0xC0,0x02, -0x00,0x00,0x53,0xAC, -0xB0,0x01,0x00,0x0C, -0xB0,0x03,0x10,0x36, -0x21,0x30,0x80,0x02, -0x21,0x20,0xC0,0x02, -0x21,0x28,0xA0,0x02, -0x21,0x38,0x20,0x02, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x23,0x18,0x51,0x02, -0x00,0x94,0x03,0x00, -0x03,0x94,0x12,0x00, -0x00,0x00,0x12,0xAE, -0xE2,0xFF,0x40,0x1E, -0x00,0x00,0x00,0x00, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x20,0x00,0xB2,0xAF, -0x18,0x00,0xB0,0xAF, -0x24,0x00,0xBF,0xAF, -0x1C,0x00,0xB1,0xAF, -0x04,0x00,0x8B,0x8C, -0x21,0x80,0x80,0x00, -0x08,0x00,0x84,0x8C, -0x0E,0x00,0x07,0x96, -0xFF,0xE0,0x02,0x3C, -0x10,0x00,0x08,0x8E, -0x1F,0x00,0x6A,0x31, -0xFF,0xFF,0x42,0x34, -0x24,0x20,0x82,0x00, -0x00,0x1E,0x0A,0x00, -0x25,0x48,0x83,0x00, -0x21,0x90,0xA0,0x00, -0x21,0x60,0xC0,0x00, -0x10,0x01,0x00,0x05, -0x07,0x00,0xE7,0x30, -0x00,0x00,0x02,0x96, -0x00,0x00,0x00,0x00, -0xFD,0x0F,0x42,0x28, -0xC0,0x00,0x40,0x14, -0x02,0x80,0x11,0x3C, -0xFF,0xDF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x48,0x22,0x01, -0x1C,0x00,0x02,0x8E, -0x00,0x40,0x03,0x3C, -0x25,0x48,0x23,0x01, -0x02,0x80,0x11,0x3C, -0xC5,0x00,0x40,0x04, -0x08,0x00,0x09,0xAE, -0xC0,0x30,0x0A,0x00, -0x21,0x10,0xCA,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x4A,0x00, -0x80,0x10,0x02,0x00, -0x30,0x1F,0x27,0x26, -0x21,0x28,0x47,0x00, -0x1C,0x24,0xA3,0x8C, -0x01,0x00,0x0A,0x24, -0x02,0x13,0x03,0x00, -0x01,0x00,0x42,0x30, -0xDB,0x00,0x4A,0x10, -0x42,0x18,0x03,0x00, -0x82,0x11,0x09,0x00, -0x01,0x00,0x42,0x30, -0x06,0x00,0x40,0x14, -0x02,0x80,0x02,0x3C, -0xC0,0xFF,0x02,0x24, -0x24,0x10,0x22,0x01, -0x04,0x00,0x49,0x34, -0x08,0x00,0x09,0xAE, -0x02,0x80,0x02,0x3C, -0xE9,0x5D,0x43,0x90, -0x00,0x00,0x00,0x00, -0x6C,0x00,0x60,0x14, -0x21,0x28,0xC7,0x00, -0xE8,0x22,0xA4,0x8C, -0x10,0x00,0x02,0x8E, -0xBF,0xFF,0x03,0x24, -0x40,0x00,0x84,0x30, -0x24,0x10,0x43,0x00, -0x25,0x40,0x44,0x00, -0x10,0x00,0x08,0xAE, -0xE8,0x22,0xA3,0x8C, -0x7F,0xF8,0x02,0x24, -0x24,0x10,0x02,0x01, -0x80,0x07,0x63,0x30, -0x42,0x27,0x09,0x00, -0x25,0x40,0x43,0x00, -0x01,0x00,0x84,0x30, -0xE1,0x00,0x8A,0x10, -0x10,0x00,0x08,0xAE, -0x30,0x1F,0x24,0x26, -0x21,0x20,0xC4,0x00, -0xE8,0x22,0x83,0x8C, -0xFF,0xF7,0x02,0x24, -0x24,0x10,0x02,0x01, -0x00,0x08,0x63,0x30, -0x25,0x40,0x43,0x00, -0x10,0x00,0x08,0xAE, -0xE8,0x22,0x83,0x8C, -0xFF,0xEF,0x02,0x24, -0x24,0x10,0x02,0x01, -0x00,0x10,0x63,0x30, -0x30,0x1F,0x25,0x26, -0x25,0x40,0x43,0x00, -0x10,0x00,0x08,0xAE, -0x21,0x30,0xC5,0x00, -0xE8,0x22,0xC4,0x8C, -0xFD,0xFF,0x02,0x3C, -0x02,0x00,0x03,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x20,0x83,0x00, -0x24,0x10,0x02,0x01, -0x25,0x40,0x44,0x00, -0x10,0x00,0x08,0xAE, -0xB0,0x1B,0xA3,0x94, -0xFB,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xC2,0x1B,0x03,0x00, -0x24,0x10,0x02,0x01, -0x80,0x1C,0x03,0x00, -0x25,0x40,0x43,0x00, -0x10,0x00,0x08,0xAE, -0x8F,0x3E,0xA3,0x90, -0xE7,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x03,0x00,0x63,0x30, -0x24,0x10,0x02,0x01, -0xC0,0x1C,0x03,0x00, -0x25,0x40,0x43,0x00, -0x10,0x00,0x08,0xAE, -0xE8,0x22,0xC4,0x8C, -0xFF,0xFD,0x02,0x3C, -0x00,0x02,0x03,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x20,0x83,0x00, -0x24,0x10,0x02,0x01, -0x25,0x40,0x44,0x00, -0x10,0x00,0x08,0xAE, -0xB0,0x1B,0xA3,0x94, -0xFF,0xFB,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xC2,0x1B,0x03,0x00, -0x24,0x10,0x02,0x01, -0x80,0x1E,0x03,0x00, -0x25,0x40,0x43,0x00, -0x10,0x00,0x08,0xAE, -0x8F,0x3E,0xA3,0x90, -0xFF,0xE7,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x03,0x00,0x63,0x30, -0x24,0x10,0x02,0x01, -0xC0,0x1E,0x03,0x00, -0x25,0x40,0x43,0x00, -0x10,0x00,0x08,0xAE, -0xE8,0x22,0xC3,0x8C, -0xC0,0xFF,0x02,0x24, -0x24,0x10,0x02,0x01, -0x3F,0x00,0x63,0x30, -0x25,0x10,0x43,0x00, -0x10,0x00,0x02,0xAE, -0xEC,0x22,0xC5,0x8C, -0x14,0x00,0x03,0x8E, -0xFF,0xFF,0x04,0x3C, -0xFF,0x7F,0x84,0x34, -0x24,0x18,0x64,0x00, -0x00,0x80,0xA5,0x30, -0x25,0x18,0x65,0x00, -0x14,0x00,0x03,0xAE, -0xEC,0x22,0xC2,0x8C, -0x24,0x18,0x64,0x00, -0x00,0x80,0x42,0x30, -0x25,0x18,0x62,0x00, -0x14,0x00,0x03,0xAE, -0xEE,0x22,0xC4,0x94, -0xE0,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x1F,0x00,0x84,0x30, -0x24,0x18,0x62,0x00, -0x00,0x24,0x04,0x00, -0x25,0x18,0x64,0x00, -0x14,0x00,0x03,0xAE, -0x02,0x00,0x02,0x92, -0x02,0x24,0x0B,0x00, -0x02,0x80,0x03,0x3C, -0x21,0x10,0x4C,0x00, -0xFF,0xFF,0x42,0x30, -0x01,0x00,0x84,0x30, -0x6A,0x00,0x80,0x10, -0x25,0x30,0x43,0x00, -0x30,0x1F,0x23,0x26, -0xF8,0x1D,0x62,0x94, -0x00,0x00,0x00,0x00, -0xFF,0x0F,0x45,0x30, -0x01,0x00,0x42,0x24, -0xF8,0x1D,0x62,0xA4, -0x0C,0x00,0x03,0x8E, -0x00,0xF0,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x00,0x24,0x05,0x00, -0x24,0x18,0x62,0x00, -0x25,0x18,0x64,0x00, -0x0C,0x00,0x03,0xAE, -0x16,0x00,0xC2,0x94, -0x00,0x19,0x05,0x00, -0x02,0x00,0x04,0x24, -0x0F,0x00,0x42,0x30, -0x25,0x10,0x43,0x00, -0x16,0x00,0xC2,0xA4, -0x21,0x28,0x80,0x01, -0x21,0x30,0x40,0x02, -0x80,0x00,0x07,0x24, -0x01,0x00,0x02,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x52,0xAC, -0xB0,0x01,0x00,0x0C, -0x02,0x00,0x04,0x24, -0x30,0x1F,0x24,0x26, -0x00,0x00,0x03,0x96, -0x94,0x3E,0x82,0x8C, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x21,0x10,0x43,0x00, -0x28,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x94,0x3E,0x82,0xAC, -0x08,0x00,0x09,0xAE, -0x30,0x1F,0x22,0x26, -0x1A,0x3E,0x43,0x90, -0xFF,0xDF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x07,0x18,0xE3,0x00, -0x01,0x00,0x63,0x30, -0x24,0x10,0x22,0x01, -0x40,0x1F,0x03,0x00, -0x25,0x48,0x43,0x00, -0x1C,0x00,0x02,0x8E, -0x00,0x00,0x00,0x00, -0x3D,0xFF,0x41,0x04, -0x08,0x00,0x09,0xAE, -0x1E,0x00,0x02,0x92, -0x04,0x00,0x03,0x24, -0x21,0x30,0x50,0x00, -0x00,0x00,0xC4,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x82,0x30, -0x02,0x29,0x02,0x00, -0x50,0x00,0xA3,0x10, -0x06,0x00,0x02,0x24, -0x32,0xFF,0xA2,0x14, -0x00,0x00,0x00,0x00, -0x1A,0x00,0x02,0x96, -0x00,0x00,0x00,0x00, -0x39,0x00,0xC2,0xA0, -0x1E,0x00,0x03,0x92, -0x1A,0x00,0x02,0x96, -0x21,0x18,0x70,0x00, -0x03,0x12,0x02,0x00, -0x38,0x00,0x62,0xA0, -0x04,0x00,0x0B,0x8E, -0x08,0x00,0x09,0x8E, -0xC0,0x30,0x0A,0x00, -0x21,0x10,0xCA,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x4A,0x00, -0x80,0x10,0x02,0x00, -0x30,0x1F,0x27,0x26, -0x21,0x28,0x47,0x00, -0x1C,0x24,0xA3,0x8C, -0x01,0x00,0x0A,0x24, -0x02,0x13,0x03,0x00, -0x01,0x00,0x42,0x30, -0x29,0xFF,0x4A,0x14, -0x82,0x11,0x09,0x00, -0x42,0x18,0x03,0x00, -0x7F,0xFF,0x02,0x24, -0x24,0x10,0x22,0x01, -0x80,0x00,0x63,0x30, -0x25,0x48,0x43,0x00, -0x08,0x00,0x09,0xAE, -0x1C,0x24,0xA3,0x8C, -0x10,0x00,0x04,0x8E, -0xFF,0xFF,0x02,0x3C, -0x07,0x00,0x63,0x30, -0xFF,0x1F,0x42,0x34, -0x24,0x20,0x82,0x00, -0x40,0x1B,0x03,0x00, -0x25,0x40,0x83,0x00, -0x44,0x02,0x00,0x08, -0x10,0x00,0x08,0xAE, -0x0E,0x00,0x02,0x96, -0x30,0x1F,0x23,0x26, -0x07,0x00,0x42,0x30, -0x40,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0xE8,0x1D,0x44,0x94, -0x00,0x00,0x00,0x00, -0x01,0x00,0x83,0x24, -0xFF,0x0F,0x85,0x30, -0xCA,0x02,0x00,0x08, -0xE8,0x1D,0x43,0xA4, -0x14,0x00,0x02,0x8E, -0x00,0x00,0x00,0x00, -0x42,0x12,0x02,0x00, -0x3F,0x00,0x42,0x30, -0x0C,0x00,0x42,0x28, -0xF1,0xFE,0x40,0x14, -0xFF,0xDF,0x02,0x3C, -0x29,0x02,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xE6,0x5D,0x43,0x90, -0x00,0x00,0x00,0x00, -0x1D,0xFF,0x64,0x14, -0x30,0x1F,0x24,0x26, -0x90,0x3E,0xE2,0x90, -0xFF,0xF7,0x03,0x24, -0x24,0x18,0x03,0x01, -0x01,0x00,0x42,0x30, -0xC0,0x12,0x02,0x00, -0x25,0x40,0x62,0x00, -0x10,0x00,0x08,0xAE, -0x91,0x3E,0xE2,0x90, -0xFF,0xEF,0x03,0x24, -0x24,0x18,0x03,0x01, -0x01,0x00,0x42,0x30, -0x6D,0x02,0x00,0x08, -0x00,0x13,0x02,0x00, -0x1A,0x00,0x05,0x96, -0x0F,0x00,0x84,0x30, -0x80,0x20,0x04,0x00, -0x21,0x18,0xC4,0x00, -0x11,0x00,0x65,0xA0, -0x1E,0x00,0x02,0x92, -0x1A,0x00,0x03,0x96, -0x21,0x10,0x50,0x00, -0x21,0x10,0x44,0x00, -0x03,0x1A,0x03,0x00, -0x10,0x00,0x43,0xA0, -0x04,0x00,0x0B,0x8E, -0x08,0x00,0x09,0x8E, -0x11,0x03,0x00,0x08, -0xC0,0x30,0x0A,0x00, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x88,0x0D,0x63,0x24, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x04,0x3C, -0x00,0x80,0x02,0x3C, -0xC0,0xFF,0xBD,0x27, -0x18,0x03,0x83,0x34, -0xA4,0x0D,0x42,0x24, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x34,0x00,0xB7,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x00,0x00,0x62,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x02,0x80,0x02,0x3C, -0xB0,0x03,0x9E,0x34, -0x98,0x03,0x00,0x08, -0x30,0x1F,0x55,0x24, -0x08,0x00,0x04,0xAE, -0x14,0x37,0x46,0x8E, -0x21,0x28,0x60,0x02, -0x80,0x00,0x07,0x24, -0x01,0x00,0x04,0x24, -0x01,0x00,0x14,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xB4,0xAF, -0x14,0x37,0x43,0x8E, -0x01,0x00,0x04,0x24, -0x00,0x00,0xC3,0xAE, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0x1C,0x42,0x92, -0x00,0x00,0x00,0x00, -0x5F,0x00,0x40,0x10, -0x2A,0xB0,0x02,0x3C, -0x09,0x00,0x42,0x34, -0x02,0x00,0x03,0x24, -0x00,0x00,0x54,0xA0, -0x00,0x00,0x43,0xA0, -0xFF,0x00,0x03,0x24, -0x74,0x00,0x23,0x12, -0x00,0x00,0x00,0x00, -0x10,0x37,0xA2,0x8E, -0x7C,0x37,0xB3,0x8E, -0x01,0x00,0x04,0x24, -0x00,0x00,0xC2,0xAF, -0x14,0x37,0xA2,0xAE, -0x00,0x00,0xD3,0xAF, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x7C,0x37,0xA4,0x8E, -0x80,0x37,0xA3,0x8E, -0x02,0x80,0x02,0x3C, -0x04,0xEA,0x42,0x24, -0x00,0x00,0x52,0x8C, -0x80,0x00,0x84,0x24, -0xFF,0x00,0x62,0x24, -0x2B,0x10,0x44,0x00, -0x0A,0x18,0x82,0x00, -0x7C,0x37,0xA3,0xAE, -0x02,0x80,0x03,0x3C, -0x08,0xEA,0x63,0x24, -0x7C,0x37,0x42,0x8E, -0x00,0x00,0x76,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC2,0xAE, -0x02,0x80,0x17,0x3C, -0xFF,0xFF,0x62,0x32, -0x25,0x80,0x57,0x00, -0x00,0x00,0xD0,0xAE, -0x0C,0x00,0x02,0x92, -0x21,0x28,0x00,0x00, -0x00,0x00,0xC2,0xAE, -0x02,0x00,0x04,0x92, -0x00,0x00,0x00,0x00, -0x21,0x20,0x93,0x00, -0xFF,0xFF,0x84,0x30, -0xFB,0x60,0x00,0x0C, -0x25,0x20,0x97,0x00, -0x0C,0x00,0x11,0x92, -0x20,0x10,0x02,0x3C, -0x01,0x00,0x04,0x24, -0x00,0x1A,0x11,0x00, -0x21,0x18,0x62,0x00, -0xFF,0x00,0x02,0x24, -0x21,0x30,0x60,0x00, -0x06,0x00,0x22,0x12, -0x80,0x00,0x07,0x24, -0x7C,0x37,0x45,0x8E, -0x10,0x37,0x43,0xAE, -0xB4,0x36,0x51,0xA2, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x04,0x00,0x04,0x8E, -0x08,0x00,0x03,0x8E, -0xFF,0xE0,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x1F,0x00,0x84,0x30, -0x24,0x18,0x62,0x00, -0x00,0x26,0x04,0x00, -0xFF,0xDF,0x02,0x3C, -0x25,0x18,0x64,0x00, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x00,0x40,0x04,0x3C, -0x25,0x18,0x64,0x00, -0xC0,0xFF,0x05,0x24, -0x82,0x11,0x03,0x00, -0x24,0x20,0x65,0x00, -0x01,0x00,0x42,0x30, -0xA3,0xFF,0x40,0x10, -0x04,0x00,0x84,0x34, -0x08,0x00,0x03,0xAE, -0x14,0x37,0x46,0x8E, -0x21,0x28,0x60,0x02, -0x80,0x00,0x07,0x24, -0x01,0x00,0x04,0x24, -0x01,0x00,0x14,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xB4,0xAF, -0x14,0x37,0x43,0x8E, -0x01,0x00,0x04,0x24, -0x00,0x00,0xC3,0xAE, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0x1C,0x42,0x92, -0x00,0x00,0x00,0x00, -0xA3,0xFF,0x40,0x14, -0x2A,0xB0,0x02,0x3C, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x2A,0x1C,0x54,0xA2, -0x02,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0x21,0x10,0x53,0x00, -0xFF,0xFF,0x42,0x30, -0x25,0x10,0x57,0x00, -0x02,0x00,0x43,0x94, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x64,0x30, -0x00,0xC0,0x84,0x24, -0xFF,0xFF,0x84,0x30, -0xC2,0x34,0x00,0x0C, -0x2B,0x1C,0x43,0xA2, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x2A,0xB0,0x02,0x3C, -0x09,0x00,0x42,0x34, -0x02,0x00,0x03,0x24, -0x00,0x00,0x54,0xA0, -0x00,0x00,0x43,0xA0, -0xFF,0x00,0x03,0x24, -0x8E,0xFF,0x23,0x16, -0x00,0x00,0x00,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x62,0x24, -0xD0,0x1B,0x43,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x00,0x38,0x63,0x34, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x83,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0x43,0xAC, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x88,0x10,0x63,0x24, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xC0,0xFF,0xBD,0x27, -0x34,0x00,0xB7,0xAF, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x06,0x3C, -0xCC,0x5E,0xC5,0x90, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x18,0x03,0x42,0x34, -0xA4,0x10,0x63,0x24, -0x40,0x00,0xA4,0x30, -0x00,0x00,0x43,0xAC, -0x21,0xB8,0x00,0x00, -0x03,0x00,0x80,0x10, -0x7F,0x00,0xA2,0x30, -0xBF,0x00,0xA2,0x30, -0x01,0x00,0x17,0x24, -0xCC,0x5E,0xC2,0xA0, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x02,0x80,0x1E,0x3C, -0x25,0xB0,0x02,0x3C, -0x30,0x1F,0xD3,0x27, -0xB0,0x03,0x55,0x34, -0x6A,0x04,0x00,0x08, -0x02,0x80,0x16,0x3C, -0x90,0x36,0x91,0xA2, -0x30,0x1F,0xC2,0x27, -0xC8,0x36,0x46,0x8C, -0x34,0x37,0x45,0x8C, -0x03,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x30,0x1F,0xD4,0x27, -0xCC,0x36,0x85,0x8E, -0x21,0x20,0x00,0x02, -0x15,0x02,0x00,0x0C, -0x21,0x30,0x40,0x02, -0x2A,0xB0,0x07,0x3C, -0x0D,0x00,0xE2,0x34, -0x04,0x00,0x43,0x24, -0x0B,0x10,0x77,0x00, -0x01,0x00,0x04,0x24, -0x02,0x00,0x03,0x24, -0x00,0x00,0x44,0xA0, -0x00,0x00,0x43,0xA0, -0x1A,0x5E,0xC4,0x96, -0x25,0xB0,0x06,0x3C, -0x66,0x03,0xC5,0x34, -0x01,0x00,0x84,0x24, -0x1A,0x5E,0xC4,0xA6, -0x1A,0x5E,0xC2,0x96, -0xFF,0x00,0x03,0x24, -0x00,0x00,0xA2,0xA4, -0x2F,0x00,0x23,0x12, -0x00,0x00,0x00,0x00, -0xC8,0x36,0x62,0x8E, -0x34,0x37,0x72,0x8E, -0x03,0x00,0x04,0x24, -0x00,0x00,0xA2,0xAE, -0xCC,0x36,0x62,0xAE, -0x00,0x00,0xB2,0xAE, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x34,0x37,0x64,0x8E, -0x38,0x37,0x63,0x8E, -0x02,0x80,0x02,0x3C, -0x0C,0xEA,0x42,0x24, -0x00,0x00,0x54,0x8C, -0x80,0x00,0x84,0x24, -0xFF,0x00,0x62,0x24, -0x2B,0x10,0x44,0x00, -0x0A,0x18,0x82,0x00, -0x34,0x37,0x63,0xAE, -0x34,0x37,0x82,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0xAE, -0x02,0x80,0x03,0x3C, -0xFF,0xFF,0x42,0x32, -0x25,0x80,0x43,0x00, -0x00,0x00,0xB0,0xAE, -0x0C,0x00,0x02,0x92, -0x01,0x00,0x05,0x24, -0x00,0x00,0xA2,0xAE, -0x02,0x00,0x04,0x92, -0x00,0x00,0x00,0x00, -0x21,0x20,0x92,0x00, -0xFF,0xFF,0x84,0x30, -0xFB,0x60,0x00,0x0C, -0x25,0x20,0x83,0x00, -0x0C,0x00,0x11,0x92, -0x20,0x10,0x02,0x3C, -0xFF,0x00,0x03,0x24, -0x00,0x22,0x11,0x00, -0xC2,0xFF,0x23,0x12, -0x21,0x20,0x82,0x00, -0xB8,0xFF,0xE0,0x16, -0xC8,0x36,0x84,0xAE, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x4C,0x04,0x00,0x08, -0x8C,0x36,0x51,0xA0, -0x21,0x00,0xE0,0x12, -0x40,0x00,0xE4,0x34, -0x90,0x36,0x83,0x92, -0x41,0x00,0xE4,0x34, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA4,0x8C, -0x01,0x00,0x02,0x3C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x00,0x80,0x42,0x34, -0x25,0x20,0x82,0x00, -0x41,0xB0,0x03,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x64,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA4,0xAC, -0x8C,0x36,0x83,0x92, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA4,0x8C, -0x01,0x00,0x02,0x3C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x00,0x80,0x42,0x34, -0x25,0x20,0x82,0x00, -0x41,0xB0,0x03,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x64,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA4,0xAC, -0xC0,0xFF,0xBD,0x27, -0x34,0x00,0xB7,0xAF, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x06,0x3C, -0xCC,0x5E,0xC5,0x90, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x18,0x03,0x42,0x34, -0x64,0x13,0x63,0x24, -0x10,0x00,0xA4,0x30, -0x00,0x00,0x43,0xAC, -0x21,0xB8,0x00,0x00, -0x03,0x00,0x80,0x10, -0xDF,0x00,0xA2,0x30, -0xEF,0x00,0xA2,0x30, -0x01,0x00,0x17,0x24, -0xCC,0x5E,0xC2,0xA0, -0xCC,0x5E,0xC3,0x90, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x00,0x00,0x43,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x02,0x80,0x1E,0x3C, -0x30,0x1F,0xD3,0x27, -0x21,0xA8,0x40,0x00, -0x1E,0x05,0x00,0x08, -0x02,0x80,0x16,0x3C, -0x98,0x36,0x91,0xA2, -0x30,0x1F,0xC2,0x27, -0xD4,0x36,0x46,0x8C, -0x40,0x37,0x45,0x8C, -0x04,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x30,0x1F,0xD4,0x27, -0xD8,0x36,0x85,0x8E, -0x21,0x20,0x00,0x02, -0x15,0x02,0x00,0x0C, -0x21,0x30,0x40,0x02, -0x2A,0xB0,0x07,0x3C, -0x15,0x00,0xE2,0x34, -0x04,0x00,0x43,0x24, -0x0B,0x10,0x77,0x00, -0x01,0x00,0x04,0x24, -0x02,0x00,0x03,0x24, -0x00,0x00,0x44,0xA0, -0x00,0x00,0x43,0xA0, -0x1A,0x5E,0xC4,0x96, -0x25,0xB0,0x06,0x3C, -0x66,0x03,0xC5,0x34, -0x01,0x00,0x84,0x24, -0x1A,0x5E,0xC4,0xA6, -0x1A,0x5E,0xC2,0x96, -0xFF,0x00,0x03,0x24, -0x00,0x00,0xA2,0xA4, -0x2F,0x00,0x23,0x12, -0x00,0x00,0x00,0x00, -0xD4,0x36,0x62,0x8E, -0x40,0x37,0x72,0x8E, -0x04,0x00,0x04,0x24, -0x00,0x00,0xA2,0xAE, -0xD8,0x36,0x62,0xAE, -0x00,0x00,0xB2,0xAE, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x40,0x37,0x64,0x8E, -0x44,0x37,0x63,0x8E, -0x02,0x80,0x02,0x3C, -0x10,0xEA,0x42,0x24, -0x00,0x00,0x54,0x8C, -0x80,0x00,0x84,0x24, -0xFF,0x00,0x62,0x24, -0x2B,0x10,0x44,0x00, -0x0A,0x18,0x82,0x00, -0x40,0x37,0x63,0xAE, -0x40,0x37,0x82,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0xAE, -0x02,0x80,0x03,0x3C, -0xFF,0xFF,0x42,0x32, -0x25,0x80,0x43,0x00, -0x00,0x00,0xB0,0xAE, -0x0C,0x00,0x02,0x92, -0x02,0x00,0x05,0x24, -0x00,0x00,0xA2,0xAE, -0x02,0x00,0x04,0x92, -0x00,0x00,0x00,0x00, -0x21,0x20,0x92,0x00, -0xFF,0xFF,0x84,0x30, -0xFB,0x60,0x00,0x0C, -0x25,0x20,0x83,0x00, -0x0C,0x00,0x11,0x92, -0x20,0x10,0x02,0x3C, -0xFF,0x00,0x03,0x24, -0x00,0x22,0x11,0x00, -0xC2,0xFF,0x23,0x12, -0x21,0x20,0x82,0x00, -0xB8,0xFF,0xE0,0x16, -0xD4,0x36,0x84,0xAE, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x00,0x05,0x00,0x08, -0x94,0x36,0x51,0xA0, -0x20,0x00,0xE0,0x12, -0x42,0x00,0xE4,0x34, -0x98,0x36,0x83,0x92, -0x43,0x00,0xE4,0x34, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA2,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x06,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x82,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA2,0xAC, -0x94,0x36,0x83,0x92, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA2,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x06,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x82,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA2,0xAC, -0xC0,0xFF,0xBD,0x27, -0x34,0x00,0xB7,0xAF, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x06,0x3C, -0xCC,0x5E,0xC5,0x90, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x18,0x03,0x42,0x34, -0x2C,0x16,0x63,0x24, -0x01,0x00,0xA4,0x30, -0x00,0x00,0x43,0xAC, -0x21,0xB8,0x00,0x00, -0x03,0x00,0x80,0x10, -0xF7,0x00,0xA2,0x30, -0xFE,0x00,0xA2,0x30, -0x01,0x00,0x17,0x24, -0xCC,0x5E,0xC2,0xA0, -0xCC,0x5E,0xC3,0x90, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x02,0x80,0x1E,0x3C, -0x30,0x1F,0xD3,0x27, -0x21,0xA8,0x40,0x00, -0xCF,0x05,0x00,0x08, -0x02,0x80,0x16,0x3C, -0xA8,0x36,0x91,0xA2, -0x30,0x1F,0xC2,0x27, -0xE0,0x36,0x46,0x8C, -0x4C,0x37,0x45,0x8C, -0x05,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x30,0x1F,0xD4,0x27, -0xE4,0x36,0x85,0x8E, -0x21,0x20,0x00,0x02, -0x15,0x02,0x00,0x0C, -0x21,0x30,0x40,0x02, -0x2A,0xB0,0x07,0x3C, -0x1D,0x00,0xE2,0x34, -0x04,0x00,0x43,0x24, -0x0B,0x10,0x77,0x00, -0x01,0x00,0x04,0x24, -0x02,0x00,0x03,0x24, -0x00,0x00,0x44,0xA0, -0x00,0x00,0x43,0xA0, -0x1A,0x5E,0xC4,0x96, -0x25,0xB0,0x06,0x3C, -0x66,0x03,0xC5,0x34, -0x01,0x00,0x84,0x24, -0x1A,0x5E,0xC4,0xA6, -0x1A,0x5E,0xC2,0x96, -0xFF,0x00,0x03,0x24, -0x00,0x00,0xA2,0xA4, -0x2F,0x00,0x23,0x12, -0x00,0x00,0x00,0x00, -0xE0,0x36,0x62,0x8E, -0x4C,0x37,0x72,0x8E, -0x05,0x00,0x04,0x24, -0x00,0x00,0xA2,0xAE, -0xE4,0x36,0x62,0xAE, -0x00,0x00,0xB2,0xAE, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x4C,0x37,0x64,0x8E, -0x50,0x37,0x63,0x8E, -0x02,0x80,0x02,0x3C, -0x14,0xEA,0x42,0x24, -0x00,0x00,0x54,0x8C, -0x80,0x00,0x84,0x24, -0xFF,0x00,0x62,0x24, -0x2B,0x10,0x44,0x00, -0x0A,0x18,0x82,0x00, -0x4C,0x37,0x63,0xAE, -0x4C,0x37,0x82,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0xAE, -0x02,0x80,0x03,0x3C, -0xFF,0xFF,0x42,0x32, -0x25,0x80,0x43,0x00, -0x00,0x00,0xB0,0xAE, -0x0C,0x00,0x02,0x92, -0x08,0x00,0x05,0x24, -0x00,0x00,0xA2,0xAE, -0x02,0x00,0x04,0x92, -0x00,0x00,0x00,0x00, -0x21,0x20,0x92,0x00, -0xFF,0xFF,0x84,0x30, -0xFB,0x60,0x00,0x0C, -0x25,0x20,0x83,0x00, -0x0C,0x00,0x11,0x92, -0x20,0x10,0x02,0x3C, -0xFF,0x00,0x03,0x24, -0x00,0x22,0x11,0x00, -0xC2,0xFF,0x23,0x12, -0x21,0x20,0x82,0x00, -0xB8,0xFF,0xE0,0x16, -0xE0,0x36,0x84,0xAE, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0xB1,0x05,0x00,0x08, -0x9C,0x36,0x51,0xA0, -0x20,0x00,0xE0,0x12, -0x44,0x00,0xE4,0x34, -0xA8,0x36,0x83,0x92, -0x45,0x00,0xE4,0x34, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA2,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x18,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x82,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA2,0xAC, -0x9C,0x36,0x83,0x92, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA2,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x18,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x82,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA2,0xAC, -0xC0,0xFF,0xBD,0x27, -0x34,0x00,0xB7,0xAF, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x06,0x3C, -0xCC,0x5E,0xC5,0x90, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x18,0x03,0x42,0x34, -0xF0,0x18,0x63,0x24, -0x02,0x00,0xA4,0x30, -0x00,0x00,0x43,0xAC, -0x21,0xB8,0x00,0x00, -0x03,0x00,0x80,0x10, -0xFB,0x00,0xA2,0x30, -0xFD,0x00,0xA2,0x30, -0x01,0x00,0x17,0x24, -0xCC,0x5E,0xC2,0xA0, -0xCC,0x5E,0xC3,0x90, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x02,0x80,0x1E,0x3C, -0x30,0x1F,0xD3,0x27, -0x21,0xA8,0x40,0x00, -0x80,0x06,0x00,0x08, -0x02,0x80,0x16,0x3C, -0xA4,0x36,0x91,0xA2, -0x30,0x1F,0xC2,0x27, -0xEC,0x36,0x46,0x8C, -0x58,0x37,0x45,0x8C, -0x06,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x30,0x1F,0xD4,0x27, -0xF0,0x36,0x85,0x8E, -0x21,0x20,0x00,0x02, -0x15,0x02,0x00,0x0C, -0x21,0x30,0x40,0x02, -0x2A,0xB0,0x07,0x3C, -0x25,0x00,0xE2,0x34, -0x04,0x00,0x43,0x24, -0x0B,0x10,0x77,0x00, -0x01,0x00,0x04,0x24, -0x02,0x00,0x03,0x24, -0x00,0x00,0x44,0xA0, -0x00,0x00,0x43,0xA0, -0x1A,0x5E,0xC4,0x96, -0x25,0xB0,0x06,0x3C, -0x66,0x03,0xC5,0x34, -0x01,0x00,0x84,0x24, -0x1A,0x5E,0xC4,0xA6, -0x1A,0x5E,0xC2,0x96, -0xFF,0x00,0x03,0x24, -0x00,0x00,0xA2,0xA4, -0x2F,0x00,0x23,0x12, -0x00,0x00,0x00,0x00, -0xEC,0x36,0x62,0x8E, -0x58,0x37,0x72,0x8E, -0x06,0x00,0x04,0x24, -0x00,0x00,0xA2,0xAE, -0xF0,0x36,0x62,0xAE, -0x00,0x00,0xB2,0xAE, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x58,0x37,0x64,0x8E, -0x5C,0x37,0x63,0x8E, -0x02,0x80,0x02,0x3C, -0x18,0xEA,0x42,0x24, -0x00,0x00,0x54,0x8C, -0x80,0x00,0x84,0x24, -0xFF,0x00,0x62,0x24, -0x2B,0x10,0x44,0x00, -0x0A,0x18,0x82,0x00, -0x58,0x37,0x63,0xAE, -0x58,0x37,0x82,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0xAE, -0x02,0x80,0x03,0x3C, -0xFF,0xFF,0x42,0x32, -0x25,0x80,0x43,0x00, -0x00,0x00,0xB0,0xAE, -0x0C,0x00,0x02,0x92, -0x04,0x00,0x05,0x24, -0x00,0x00,0xA2,0xAE, -0x02,0x00,0x04,0x92, -0x00,0x00,0x00,0x00, -0x21,0x20,0x92,0x00, -0xFF,0xFF,0x84,0x30, -0xFB,0x60,0x00,0x0C, -0x25,0x20,0x83,0x00, -0x0C,0x00,0x11,0x92, -0x20,0x10,0x02,0x3C, -0xFF,0x00,0x03,0x24, -0x00,0x22,0x11,0x00, -0xC2,0xFF,0x23,0x12, -0x21,0x20,0x82,0x00, -0xB8,0xFF,0xE0,0x16, -0xEC,0x36,0x84,0xAE, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x62,0x06,0x00,0x08, -0xA0,0x36,0x51,0xA0, -0x20,0x00,0xE0,0x12, -0x46,0x00,0xE4,0x34, -0xA4,0x36,0x83,0x92, -0x47,0x00,0xE4,0x34, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA2,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x60,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x82,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA2,0xAC, -0xA0,0x36,0x83,0x92, -0xB0,0x03,0xC5,0x34, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xA3,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA2,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x60,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x82,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA2,0xAC, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0xB4,0x1B,0x63,0x24, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x05,0x3C, -0x30,0x1F,0xA5,0x24, -0xD8,0x1B,0xA2,0x8C, -0xD0,0x1B,0xA4,0x8C, -0x00,0x08,0x03,0x3C, -0x24,0x10,0x43,0x00, -0x25,0x20,0x82,0x00, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x64,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA4,0xAC, -0x25,0xB0,0x04,0x3C, -0x00,0x80,0x02,0x3C, -0xC8,0xFF,0xBD,0x27, -0x18,0x03,0x83,0x34, -0x10,0x1C,0x42,0x24, -0x30,0x00,0xBF,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x00,0x00,0x62,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x02,0x80,0x14,0x3C, -0x30,0x1F,0x93,0x26, -0xFC,0x00,0x82,0x34, -0x00,0x00,0x45,0x8C, -0xAC,0x1B,0x66,0x96, -0xD8,0x37,0x63,0x96, -0xD0,0x37,0x67,0x8E, -0x23,0x28,0xA6,0x00, -0x21,0x10,0xA3,0x00, -0x23,0x88,0x47,0x00, -0xB0,0x03,0x84,0x34, -0x23,0x30,0x23,0x02, -0x2B,0x10,0x71,0x00, -0x00,0x00,0x83,0xAC, -0x00,0x00,0x91,0xAC, -0x0B,0x88,0xC2,0x00, -0x21,0x20,0x20,0x02, -0x25,0x24,0x00,0x0C, -0xD4,0x37,0x65,0xAE, -0x4B,0x00,0x40,0x10, -0x21,0x90,0x40,0x00, -0x0C,0x00,0x51,0xAC, -0xD0,0x37,0x68,0x8E, -0xD4,0x37,0x62,0x8E, -0x08,0x00,0x45,0x8E, -0x20,0xBD,0x03,0x3C, -0x88,0x03,0x63,0x34, -0x2B,0x10,0x48,0x00, -0x40,0x10,0x15,0x3C, -0x21,0x20,0x00,0x00, -0xFF,0xFF,0x27,0x32, -0x00,0x00,0x65,0xAC, -0x28,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0xAC,0x1B,0x66,0x96, -0x08,0x00,0x42,0x96, -0x40,0x10,0x05,0x3C, -0x21,0x20,0x00,0x00, -0x21,0x30,0x06,0x01, -0x25,0x28,0x45,0x00, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x02,0x3C, -0x64,0x57,0x42,0x24, -0x30,0x1F,0x84,0x26, -0xD4,0x37,0x83,0x8C, -0x04,0x00,0x45,0x8C, -0xD0,0x37,0x83,0xAC, -0x00,0x00,0x42,0xAE, -0x04,0x00,0x52,0xAC, -0x00,0x00,0xB2,0xAC, -0x04,0x00,0x45,0xAE, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0x85,0x26, -0xD8,0x1B,0xA2,0x8C, -0xD0,0x1B,0xA3,0x8C, -0x30,0x00,0xBF,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x04,0x00,0x42,0x30, -0x25,0x18,0x62,0x00, -0x41,0xB0,0x04,0x3C, -0x38,0x00,0xBD,0x27, -0x00,0x00,0x83,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA3,0xAC, -0xD8,0x37,0x70,0x8E, -0x08,0x00,0x45,0x96, -0xAC,0x1B,0x66,0x96, -0x23,0x80,0x08,0x02, -0xFF,0xFF,0x10,0x32, -0x21,0x30,0x06,0x01, -0x25,0x28,0xB5,0x00, -0x21,0x38,0x00,0x02, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xB0,0x01,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x08,0x00,0x45,0x96, -0xAC,0x1B,0x62,0x96, -0x23,0x38,0x30,0x02, -0x25,0x28,0xB5,0x00, -0x21,0x10,0x06,0x3C, -0x21,0x28,0xB0,0x00, -0x21,0x30,0x46,0x00, -0xFF,0xFF,0xE7,0x30, -0x3C,0x07,0x00,0x08, -0x21,0x20,0x00,0x00, -0x00,0x60,0x02,0x40, -0x01,0x00,0x41,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x04,0x3C, -0xD0,0x5E,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x10,0x63,0x34, -0xD0,0x5E,0x83,0xAC, -0x00,0x60,0x82,0x40, -0x48,0x07,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x04,0x3C, -0x00,0x80,0x02,0x3C, -0xC0,0xFF,0xBD,0x27, -0x18,0x03,0x83,0x34, -0xFC,0x1D,0x42,0x24, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x34,0x00,0xB7,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x00,0x00,0x62,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x02,0x80,0x1E,0x3C, -0x02,0x80,0x02,0x3C, -0x2A,0xB0,0x03,0x3C, -0xB0,0x03,0x96,0x34, -0x80,0xD5,0x57,0x24, -0x2C,0x00,0x73,0x34, -0x30,0x1F,0xD1,0x27, -0x02,0x80,0x15,0x3C, -0xD1,0x07,0x00,0x08, -0x02,0x80,0x14,0x3C, -0x54,0xF3,0x90,0xAE, -0x02,0x80,0x04,0x3C, -0x03,0x00,0xC3,0x90, -0x7C,0xD5,0x82,0x90, -0x7F,0x00,0x63,0x30, -0xFF,0x00,0x42,0x30, -0x6B,0x00,0x62,0x10, -0x08,0x00,0x10,0x26, -0x02,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x37,0x00,0x42,0x28, -0x5E,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x02,0x00,0xC5,0x90, -0x03,0x00,0xC3,0x90, -0xFF,0x00,0xA5,0x30, -0x7F,0x00,0x63,0x30, -0x7C,0xD5,0x83,0xA0, -0x02,0x00,0xC2,0x90, -0x0E,0x00,0xA5,0x38, -0x0A,0x80,0xE5,0x00, -0xFF,0x00,0x42,0x30, -0xC0,0x10,0x02,0x00, -0x21,0x10,0x57,0x00, -0x04,0x00,0x43,0x8C, -0x02,0x80,0x04,0x3C, -0x8C,0xD7,0x84,0x24, -0x4C,0xF3,0xA3,0xAE, -0x02,0x00,0xC5,0x90, -0x2F,0x55,0x00,0x0C, -0xFF,0x00,0xA5,0x30, -0x4C,0xF3,0xA2,0x8E, -0x00,0x00,0x00,0x00, -0x09,0xF8,0x40,0x00, -0x21,0x20,0x00,0x02, -0x01,0x00,0x02,0x24, -0x02,0x00,0x03,0x24, -0x01,0x00,0x62,0xA2, -0x01,0x00,0x63,0xA2, -0x2B,0x00,0x40,0x12, -0x00,0x00,0x00,0x00, -0xB8,0x36,0x22,0x92, -0x20,0x10,0x03,0x3C, -0x88,0x37,0x25,0x8E, -0x00,0x12,0x02,0x00, -0x21,0x10,0x43,0x00, -0x21,0x30,0x40,0x00, -0x0A,0x00,0x04,0x24, -0x00,0x01,0x07,0x24, -0x1C,0x37,0x22,0xAE, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x88,0x37,0x30,0x8E, -0xB0,0x01,0x00,0x0C, -0x0A,0x00,0x04,0x24, -0xFF,0xFF,0x10,0x32, -0x02,0x80,0x02,0x3C, -0x25,0x80,0x02,0x02, -0x0C,0x00,0x04,0x92, -0xFF,0x00,0x02,0x24, -0x21,0x38,0x00,0x02, -0xFF,0x00,0x83,0x30, -0x20,0x00,0x10,0x26, -0x04,0x00,0x62,0x10, -0x21,0x90,0x00,0x00, -0xB8,0x36,0x24,0xA2, -0x01,0x00,0x12,0x24, -0x00,0x00,0xC3,0xAE, -0x04,0x00,0xE2,0x8C, -0x13,0x00,0x03,0x24, -0x02,0x12,0x02,0x00, -0x1F,0x00,0x45,0x30, -0xB6,0xFF,0xA3,0x10, -0x21,0x30,0x00,0x02, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x38,0xD7,0x84,0x24, -0x01,0x00,0x02,0x24, -0x02,0x00,0x03,0x24, -0x01,0x00,0x62,0xA2, -0x01,0x00,0x63,0xA2, -0xD7,0xFF,0x40,0x16, -0x00,0x00,0x00,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA2,0x8C, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x00,0x04,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x41,0xB0,0x04,0x3C, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x82,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA2,0xAC, -0x02,0x00,0xC5,0x90, -0x02,0x80,0x04,0x3C, -0x78,0xD7,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0xFF,0x00,0xA5,0x30, -0xEB,0x07,0x00,0x08, -0x01,0x00,0x02,0x24, -0x02,0x00,0xC5,0x90, -0x02,0x00,0xC6,0x90, -0x7C,0xD5,0x87,0x90, -0x02,0x80,0x04,0x3C, -0x48,0xD7,0x84,0x24, -0xFF,0x00,0xA5,0x30, -0xFF,0x00,0xC6,0x30, -0x2F,0x55,0x00,0x0C, -0xFF,0x00,0xE7,0x30, -0xC1,0x07,0x00,0x08, -0x01,0x00,0x02,0x24, -0xC8,0xFF,0xBD,0x27, -0xFF,0xFF,0xA8,0x30, -0x02,0x80,0x02,0x3C, -0x25,0x40,0x02,0x01, -0x30,0x00,0xB6,0xAF, -0x20,0x00,0xB2,0xAF, -0x34,0x00,0xBF,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x00,0x00,0x03,0x8D, -0xFF,0xFF,0xD2,0x30, -0x21,0xB0,0xA0,0x00, -0x00,0xC0,0x02,0x24, -0x08,0x00,0x45,0x26, -0x04,0x00,0x06,0x8D, -0x24,0x18,0x62,0x00, -0xFF,0x3F,0xA5,0x30, -0xF0,0xFF,0x02,0x3C, -0x25,0x18,0x65,0x00, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x00,0x80,0x05,0x3C, -0x25,0x18,0x65,0x00, -0xFF,0x01,0xC6,0x34, -0x00,0x00,0x03,0xAD, -0x04,0x00,0x06,0xAD, -0x21,0x48,0x80,0x00, -0xFF,0xFF,0xE7,0x30, -0x18,0x00,0x12,0xA5, -0x1A,0x00,0x07,0xA1, -0x18,0x00,0x03,0x8D, -0xFF,0x7F,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x02,0x80,0x15,0x3C, -0x18,0x00,0x03,0xAD, -0x30,0x1F,0xA5,0x26, -0x7A,0x36,0xA3,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x62,0x24, -0x7A,0x36,0xA2,0xA0, -0x18,0x00,0x04,0x8D, -0xFF,0x80,0x02,0x3C, -0x20,0x00,0x45,0x26, -0xFF,0xFF,0x42,0x34, -0x7F,0x00,0x63,0x30, -0xFF,0xFF,0xB2,0x30, -0x24,0x20,0x82,0x00, -0x00,0x1E,0x03,0x00, -0x25,0xB0,0x02,0x3C, -0xC0,0x00,0x42,0x34, -0x25,0x20,0x83,0x00, -0x07,0x00,0x45,0x32, -0x18,0x00,0x04,0xAD, -0x00,0x00,0x52,0xA4, -0x03,0x00,0xA0,0x10, -0xFF,0xFF,0x42,0x32, -0x08,0x00,0x42,0x26, -0xFF,0xFF,0x42,0x30, -0x30,0x1F,0xB4,0x26, -0xF8,0x37,0x86,0x8E, -0xFC,0x37,0x90,0x8E, -0xF8,0xFF,0x52,0x30, -0x21,0x10,0xD2,0x00, -0x2B,0x10,0x02,0x02, -0x31,0x00,0x40,0x10, -0xFF,0x00,0x33,0x31, -0x23,0x80,0x06,0x02, -0x21,0x28,0xC0,0x02, -0xFF,0xFF,0x07,0x32, -0x01,0x00,0x11,0x24, -0x21,0x20,0x60,0x02, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xB1,0xAF, -0x23,0x18,0x50,0x02, -0xFF,0xFF,0x72,0x30, -0x22,0x10,0x02,0x3C, -0x21,0x10,0x42,0x02, -0x21,0x20,0x60,0x02, -0xB0,0x01,0x00,0x0C, -0xF8,0x37,0x82,0xAE, -0x21,0x28,0xD0,0x02, -0x21,0x38,0x40,0x02, -0x21,0x20,0x60,0x02, -0x10,0x00,0xB1,0xAF, -0x22,0x10,0x06,0x3C, -0x73,0x01,0x00,0x0C, -0x30,0x1F,0xB1,0x26, -0xF8,0x37,0x23,0x8E, -0x25,0xB0,0x10,0x3C, -0xB0,0x03,0x02,0x36, -0x21,0x20,0x60,0x02, -0x00,0x00,0x43,0xAC, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xF8,0x37,0x25,0x8E, -0xEC,0x00,0x02,0x36, -0xBD,0x00,0x04,0x36, -0x00,0x00,0x45,0xAC, -0x00,0x00,0x83,0x90, -0xC2,0x00,0x10,0x36, -0x34,0x00,0xBF,0x8F, -0x10,0x00,0x63,0x34, -0x00,0x00,0x83,0xA0, -0x30,0x00,0xB6,0x8F, -0x00,0x00,0x05,0xA6, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x21,0x28,0xC0,0x02, -0x21,0x20,0x60,0x02, -0x21,0x38,0x40,0x02, -0x01,0x00,0x02,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0xF8,0x37,0x83,0x8E, -0x30,0x1F,0xB1,0x26, -0x25,0xB0,0x10,0x3C, -0x21,0x18,0x72,0x00, -0xF8,0x37,0x83,0xAE, -0xF8,0x37,0x23,0x8E, -0xB0,0x03,0x02,0x36, -0x21,0x20,0x60,0x02, -0x00,0x00,0x43,0xAC, -0xB0,0x01,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xF8,0x37,0x25,0x8E, -0xEC,0x00,0x02,0x36, -0xBD,0x00,0x04,0x36, -0x00,0x00,0x45,0xAC, -0x00,0x00,0x83,0x90, -0xC2,0x00,0x10,0x36, -0x34,0x00,0xBF,0x8F, -0x10,0x00,0x63,0x34, -0x00,0x00,0x83,0xA0, -0x30,0x00,0xB6,0x8F, -0x00,0x00,0x05,0xA6, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x18,0x00,0xB0,0xAF, -0x34,0x00,0xBF,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x21,0x80,0x80,0x00, -0x00,0x60,0x14,0x40, -0x01,0x00,0x81,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x14,0x00,0x83,0x8C, -0x02,0x80,0x15,0x3C, -0x16,0x00,0x02,0x24, -0x30,0x1F,0xB3,0x26, -0x21,0x28,0x00,0x00, -0x1D,0x00,0x62,0x10, -0x08,0x00,0x06,0x24, -0x08,0x00,0x82,0x94, -0x02,0x80,0x04,0x3C, -0x08,0x52,0x00,0x0C, -0x25,0x20,0x44,0x00, -0x08,0x00,0x05,0x8E, -0x0C,0x00,0x06,0x96, -0x14,0x00,0x07,0x96, -0x19,0x08,0x00,0x0C, -0x09,0x00,0x04,0x24, -0x04,0x00,0x02,0x8E, -0x00,0x00,0x03,0x8E, -0x21,0x20,0x00,0x02, -0x00,0x00,0x43,0xAC, -0x04,0x00,0x62,0xAC, -0x00,0x00,0x10,0xAE, -0x3D,0x24,0x00,0x0C, -0x04,0x00,0x10,0xAE, -0x00,0x60,0x94,0x40, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0xF8,0x37,0x68,0x8E, -0x0C,0x00,0x11,0x8E, -0xFC,0x37,0x62,0x8E, -0x25,0xB0,0x03,0x3C, -0x21,0x28,0x11,0x01, -0xC0,0x00,0x63,0x34, -0x23,0x90,0x48,0x00, -0x2B,0x10,0x45,0x00, -0x01,0x00,0x16,0x24, -0x09,0x00,0x04,0x24, -0xFF,0xFF,0x27,0x32, -0x21,0x30,0x00,0x01, -0x00,0x00,0x71,0xA4, -0x33,0x00,0x40,0x10, -0x01,0x00,0x02,0x24, -0x08,0x00,0x05,0x8E, -0xFF,0xFF,0x47,0x32, -0x23,0x88,0x32,0x02, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xB6,0xAF, -0x22,0x10,0x03,0x3C, -0x21,0x18,0x23,0x02, -0x09,0x00,0x04,0x24, -0xB0,0x01,0x00,0x0C, -0xF8,0x37,0x63,0xAE, -0x08,0x00,0x05,0x8E, -0xFF,0xFF,0x27,0x32, -0x09,0x00,0x04,0x24, -0x21,0x28,0xB2,0x00, -0x22,0x10,0x06,0x3C, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xB6,0xAF, -0xB0,0x01,0x00,0x0C, -0x09,0x00,0x04,0x24, -0x30,0x1F,0xA2,0x26, -0xF8,0x37,0x46,0x8C, -0x25,0xB0,0x03,0x3C, -0xEC,0x00,0x64,0x34, -0x00,0x00,0x86,0xAC, -0xBD,0x00,0x65,0x34, -0x00,0x00,0xA2,0x90, -0xC2,0x00,0x63,0x34, -0x21,0x20,0x00,0x02, -0x10,0x00,0x42,0x34, -0x00,0x00,0xA2,0xA0, -0x00,0x00,0x66,0xA4, -0x04,0x00,0x02,0x8E, -0x00,0x00,0x03,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x00,0x43,0xAC, -0x04,0x00,0x62,0xAC, -0x00,0x00,0x10,0xAE, -0x3D,0x24,0x00,0x0C, -0x04,0x00,0x10,0xAE, -0x00,0x60,0x94,0x40, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x08,0x00,0x05,0x8E, -0x21,0x30,0x00,0x01, -0x09,0x00,0x04,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0xF8,0x37,0x63,0x8E, -0x00,0x00,0x00,0x00, -0x21,0x18,0x71,0x00, -0x05,0x09,0x00,0x08, -0xF8,0x37,0x63,0xAE, -0xE8,0xFF,0xBD,0x27, -0x14,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x28,0x80,0x00, -0x00,0x60,0x10,0x40, -0x01,0x00,0x01,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x25,0xB0,0x02,0x3C, -0xBF,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x04,0x00,0x63,0x2C, -0x05,0x00,0x60,0x10, -0x02,0x80,0x06,0x3C, -0x6C,0x57,0xC3,0x8C, -0x6C,0x57,0xC2,0x24, -0x0C,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x6C,0x57,0xC2,0x24, -0x04,0x00,0x43,0x8C, -0x00,0x00,0xA2,0xAC, -0x04,0x00,0x45,0xAC, -0x00,0x00,0x65,0xAC, -0x04,0x00,0xA3,0xAC, -0x00,0x60,0x90,0x40, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xB4,0x08,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x60,0x90,0x40, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x02,0x80,0x04,0x3C, -0x98,0xD7,0x84,0x24, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x2F,0x55,0x00,0x0C, -0x14,0x00,0xB1,0xAF, -0x00,0x00,0x04,0x96, -0x00,0x00,0x00,0x00, -0x20,0x00,0x83,0x24, -0x07,0x00,0x62,0x30, -0x49,0x00,0x40,0x10, -0xC2,0x10,0x03,0x00, -0x28,0x00,0x82,0x24, -0xC2,0x10,0x02,0x00, -0x25,0x24,0x00,0x0C, -0xC0,0x20,0x02,0x00, -0x47,0x00,0x40,0x10, -0x21,0x88,0x40,0x00, -0x02,0x80,0x12,0x3C, -0x30,0x1F,0x50,0x26, -0x1C,0x37,0x05,0x8E, -0x0A,0x00,0x04,0x24, -0x28,0x00,0x06,0x24, -0xC7,0x01,0x00,0x0C, -0x21,0x38,0x40,0x00, -0xB0,0x1B,0x03,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x62,0x30, -0x47,0x00,0x40,0x14, -0x01,0x00,0x62,0x30, -0x02,0x80,0x02,0x3C, -0xEA,0x5D,0x48,0x90, -0x25,0xB0,0x04,0x3C, -0x2F,0x00,0x02,0x3C, -0xD0,0x01,0x85,0x34, -0x17,0x32,0x42,0x34, -0x00,0x00,0xA2,0xAC, -0x5E,0x00,0x03,0x3C, -0x10,0x00,0x02,0x3C, -0xDC,0x01,0x87,0x34, -0xD4,0x01,0x86,0x34, -0x17,0x43,0x63,0x34, -0x20,0x53,0x42,0x34, -0xD8,0x01,0x84,0x34, -0x00,0x00,0xC3,0xAC, -0x30,0x1F,0x49,0x26, -0x00,0x00,0x82,0xAC, -0x44,0xA4,0x03,0x34, -0x01,0x00,0x02,0x24, -0x00,0x00,0xE3,0xAC, -0xEC,0x38,0x20,0xAD, -0x08,0x39,0x20,0xAD, -0x50,0x3E,0x20,0xAD, -0x10,0x3E,0x20,0xAD, -0x51,0x00,0x02,0x11, -0x1A,0x3E,0x20,0xA1, -0x10,0x23,0x22,0x8D, -0xFF,0xF7,0x03,0x24, -0xFF,0xEF,0x04,0x24, -0x24,0x10,0x43,0x00, -0x24,0x10,0x44,0x00, -0x10,0x23,0x22,0xAD, -0xB0,0x01,0x00,0x0C, -0x0A,0x00,0x04,0x24, -0x08,0x00,0x22,0x96, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x04,0x3C, -0x25,0x28,0x45,0x00, -0xDC,0x01,0x06,0x24, -0x10,0x52,0x00,0x0C, -0x84,0x58,0x84,0x24, -0x3D,0x24,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x30,0x1F,0x43,0x26, -0x9C,0x39,0x62,0x8C, -0xD1,0x11,0x00,0x0C, -0x30,0x3B,0x62,0xA0, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x25,0x24,0x00,0x0C, -0xC0,0x20,0x02,0x00, -0xBB,0xFF,0x40,0x14, -0x21,0x88,0x40,0x00, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0xA8,0xD7,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x1C,0xEA,0xA5,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x32,0x00,0x40,0x14, -0x02,0x80,0x04,0x3C, -0xA3,0x51,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xB0,0x1B,0x02,0x96, -0x25,0xB0,0x03,0x3C, -0x4C,0x00,0x63,0x34, -0xFF,0xFE,0x42,0x30, -0xB0,0x1B,0x02,0xA6, -0x00,0x00,0x60,0xA0, -0x02,0x80,0x02,0x3C, -0xEA,0x5D,0x48,0x90, -0x25,0xB0,0x04,0x3C, -0x2F,0x00,0x02,0x3C, -0xD0,0x01,0x85,0x34, -0x17,0x32,0x42,0x34, -0x00,0x00,0xA2,0xAC, -0x5E,0x00,0x03,0x3C, -0x10,0x00,0x02,0x3C, -0xDC,0x01,0x87,0x34, -0xD4,0x01,0x86,0x34, -0x17,0x43,0x63,0x34, -0x20,0x53,0x42,0x34, -0xD8,0x01,0x84,0x34, -0x00,0x00,0xC3,0xAC, -0x30,0x1F,0x49,0x26, -0x00,0x00,0x82,0xAC, -0x44,0xA4,0x03,0x34, -0x01,0x00,0x02,0x24, -0x00,0x00,0xE3,0xAC, -0xEC,0x38,0x20,0xAD, -0x08,0x39,0x20,0xAD, -0x50,0x3E,0x20,0xAD, -0x10,0x3E,0x20,0xAD, -0xB1,0xFF,0x02,0x15, -0x1A,0x3E,0x20,0xA1, -0x02,0x80,0x02,0x3C, -0xEB,0x5D,0x44,0x90, -0x02,0x00,0x03,0x24, -0x06,0x00,0x83,0x10, -0xFF,0xF7,0x03,0x24, -0x10,0x23,0x22,0x8D, -0x00,0x00,0x00,0x00, -0x24,0x10,0x43,0x00, -0x95,0x09,0x00,0x08, -0x00,0x10,0x42,0x34, -0x10,0x23,0x22,0x8D, -0xFF,0xEF,0x03,0x24, -0x00,0x08,0x42,0x34, -0x95,0x09,0x00,0x08, -0x24,0x10,0x43,0x00, -0x88,0x58,0x84,0x24, -0x6C,0x4C,0x00,0x0C, -0x03,0x00,0x05,0x24, -0xBE,0x09,0x00,0x08, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xD8,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x02,0x80,0x12,0x3C, -0x1C,0x00,0xB3,0xAF, -0x24,0x00,0xBF,0xAF, -0x20,0x00,0xB4,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x43,0x26, -0xB0,0x1B,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0x10,0x42,0x30, -0x76,0x00,0x40,0x14, -0x21,0x98,0x80,0x00, -0x00,0x60,0x10,0x40, -0x01,0x00,0x01,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x14,0x3C, -0xF6,0x5E,0x82,0x92, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x04,0x00,0x42,0x28, -0x74,0x00,0x40,0x14, -0x04,0x00,0x04,0x24, -0x00,0x60,0x90,0x40, -0x30,0x1F,0x42,0x8E, -0xFF,0xF0,0x03,0x24, -0x0F,0xFF,0x04,0x24, -0x24,0x10,0x43,0x00, -0x24,0x10,0x44,0x00, -0x25,0xB0,0x05,0x3C, -0xF0,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x64,0x03,0xA4,0x34, -0x17,0x00,0x03,0x24, -0x00,0x00,0x80,0xA0, -0x50,0x0C,0xA3,0xA0, -0x30,0x1F,0x42,0xAE, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x25,0xB0,0x02,0x3C, -0x17,0x00,0x03,0x24, -0x58,0x0C,0x43,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x51,0x26, -0xB0,0x1B,0x22,0x96, -0x02,0x80,0x04,0x3C, -0xB4,0xD7,0x84,0x24, -0x00,0x10,0x42,0x34, -0x2F,0x55,0x00,0x0C, -0xB0,0x1B,0x22,0xA6, -0x01,0x00,0x02,0x24, -0x25,0xB0,0x03,0x3C, -0x6C,0x3B,0x22,0xAE, -0x4C,0x00,0x63,0x34, -0x08,0x00,0x66,0x8E, -0x00,0x00,0x67,0x90, -0xB0,0x1B,0x22,0x96, -0x30,0x3B,0x28,0x92, -0x31,0x3B,0x29,0x92, -0x8F,0x3E,0x2A,0x92, -0x38,0x3B,0x2B,0x92, -0x67,0x3B,0x2C,0x92, -0x74,0x3B,0x26,0xAE, -0x00,0x80,0x42,0x30, -0xA1,0x3B,0x27,0xA2, -0x21,0x20,0x00,0x00, -0x00,0x00,0x60,0xA0, -0x21,0x28,0x00,0x00, -0x99,0x3B,0x28,0xA2, -0x9A,0x3B,0x29,0xA2, -0x9E,0x3B,0x22,0xA6, -0xA0,0x3B,0x2A,0xA2, -0x30,0x3B,0x2B,0xA2, -0x31,0x3B,0x2C,0xA2, -0xA4,0x3B,0x20,0xAE, -0xA8,0x3B,0x20,0xAE, -0x9C,0x3B,0x20,0xA2, -0x12,0x0D,0x00,0x0C, -0x9B,0x3B,0x20,0xA2, -0x08,0x00,0x66,0x8E, -0x00,0x00,0x00,0x00, -0x33,0x00,0xC0,0x14, -0x0C,0x00,0x70,0x26, -0x00,0x00,0x62,0x8E, -0x21,0x20,0x20,0x02, -0xAC,0x3B,0x23,0x26, -0x70,0x3B,0x22,0xAE, -0x3F,0x00,0x02,0x24, -0xFF,0xFF,0x42,0x24, -0x00,0x00,0x60,0xA0, -0xFD,0xFF,0x41,0x04, -0x07,0x00,0x63,0x24, -0xB0,0x1B,0x83,0x94, -0x00,0x00,0x00,0x00, -0x00,0x01,0x62,0x30, -0x09,0x00,0x40,0x10, -0x30,0x1F,0x50,0x26, -0x01,0x00,0x62,0x30, -0x06,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x82,0x92, -0x0C,0x00,0x03,0x24, -0x0F,0x00,0x42,0x30, -0x2C,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0x30,0x3B,0x04,0x92, -0x4F,0x0C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x04,0x3C, -0x48,0x00,0x84,0x34, -0x00,0x00,0x83,0x8C, -0x70,0x3B,0x05,0x8E, -0x7B,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x01,0x00,0x02,0x24, -0x00,0x00,0x83,0xAC, -0x19,0x00,0xA2,0x10, -0x3C,0x00,0x02,0x24, -0x98,0x38,0x02,0xAE, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x64,0x31,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x0F,0x0A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x21,0x28,0x00,0x02, -0x10,0x52,0x00,0x0C, -0xA8,0x5A,0x84,0x24, -0x02,0x80,0x04,0x3C, -0xC4,0xD7,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x21,0x28,0x00,0x02, -0x54,0x0A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x13,0x0F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x3C,0x00,0x02,0x24, -0x79,0x0A,0x00,0x08, -0x98,0x38,0x02,0xAE, -0xCD,0x4E,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x6A,0x0A,0x00,0x08, -0x30,0x1F,0x50,0x26, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x21,0x80,0x80,0x00, -0x00,0x00,0x02,0x92, -0x02,0x80,0x04,0x3C, -0x21,0x28,0x40,0x00, -0x03,0x00,0x42,0x2C, -0x06,0x00,0x40,0x14, -0xD0,0xD7,0x84,0x24, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x03,0x92, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x02,0x80,0x02,0x3C, -0xA8,0x5C,0x43,0xAC, -0x18,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0xD0,0xFF,0xBD,0x27, -0x18,0x03,0x42,0x34, -0xC8,0x2A,0x63,0x24, -0x24,0x00,0xB3,0xAF, -0x28,0x00,0xBF,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x00,0x00,0x43,0xAC, -0x02,0x80,0x04,0x3C, -0xF4,0x5E,0x82,0x90, -0x00,0x00,0x00,0x00, -0x12,0x00,0x40,0x10, -0x02,0x80,0x13,0x3C, -0x02,0x80,0x02,0x3C, -0x0D,0x5F,0x43,0x90, -0x00,0x00,0x00,0x00, -0x66,0x00,0x60,0x14, -0x01,0x00,0x04,0x24, -0x02,0x80,0x02,0x3C, -0x16,0x5F,0x44,0xA0, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x64,0x90, -0x01,0x00,0x05,0x24, -0x64,0x31,0x00,0x0C, -0xFF,0x00,0x84,0x30, -0x02,0x80,0x02,0x3C, -0x74,0x57,0x43,0x8C, -0x74,0x57,0x42,0x24, -0xA7,0x00,0x62,0x10, -0x02,0x80,0x13,0x3C, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x2A,0xB0,0x02,0x3C, -0x36,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x30,0x1F,0x66,0x26, -0x00,0x38,0xC5,0x8C, -0xC0,0x18,0x03,0x00, -0x23,0xB0,0x04,0x3C, -0xF0,0x07,0x63,0x30, -0xFF,0x1F,0x02,0x3C, -0x21,0x18,0x64,0x00, -0xFF,0xFF,0x42,0x34, -0x24,0x20,0x62,0x00, -0x23,0x88,0x85,0x00, -0x00,0x04,0x22,0x26, -0x2B,0x28,0x85,0x00, -0xA4,0x37,0xC3,0x8C, -0x0B,0x88,0x45,0x00, -0xE1,0x01,0x22,0x2E, -0xA0,0x37,0xC3,0xAC, -0x04,0x38,0xC4,0xAC, -0xAA,0x37,0xC0,0xA4, -0x14,0x00,0x40,0x14, -0xA9,0x37,0xC0,0xA0, -0x20,0xFE,0x82,0x24, -0x20,0x02,0x83,0x24, -0x0A,0x18,0x45,0x00, -0x23,0x10,0x02,0x3C, -0xFF,0x03,0x42,0x34, -0x2B,0x10,0x43,0x00, -0x21,0x28,0x60,0x00, -0x34,0x00,0x40,0x14, -0x00,0x38,0xC3,0xAC, -0x04,0x38,0xC2,0x8C, -0x00,0x00,0x00,0x00, -0x2B,0x18,0x45,0x00, -0x23,0x88,0x45,0x00, -0x03,0x00,0x60,0x10, -0xE1,0x01,0x22,0x2E, -0x00,0x04,0x31,0x26, -0xE1,0x01,0x22,0x2E, -0x0E,0x00,0x40,0x10, -0x30,0x1F,0x70,0x26, -0x30,0x1F,0x70,0x26, -0x04,0x38,0x03,0x8E, -0x00,0x38,0x04,0x8E, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x83,0x00, -0x2E,0x00,0x40,0x14, -0x2B,0x10,0x64,0x00, -0x5A,0x00,0x40,0x14, -0x25,0xB0,0x02,0x3C, -0x80,0x00,0x03,0x24, -0xD0,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x30,0x1F,0x70,0x26, -0x00,0x38,0x03,0x96, -0x2A,0xB0,0x02,0x3C, -0x35,0x00,0x42,0x34, -0xC2,0x88,0x03,0x00, -0x00,0x00,0x51,0xA0, -0x5D,0x27,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xAA,0x37,0x03,0x96, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xD0,0x1B,0x02,0x8E, -0x80,0x00,0x03,0x3C, -0x41,0xB0,0x04,0x3C, -0x25,0x10,0x43,0x00, -0x00,0x00,0x82,0xAC, -0x28,0x00,0xBF,0x8F, -0xD0,0x1B,0x02,0xAE, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x00,0xFC,0xA5,0x24, -0xF6,0x0A,0x00,0x08, -0x00,0x38,0xC5,0xAC, -0x17,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x9F,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x0D,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xCF,0x0A,0x00,0x08, -0x02,0x80,0x02,0x3C, -0xA0,0x37,0x05,0x8E, -0x21,0x30,0x80,0x00, -0xFF,0xFF,0x27,0x32, -0x09,0x00,0x04,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xA0,0x37,0x03,0x8E, -0xAA,0x37,0x05,0x96, -0x00,0x38,0x02,0x8E, -0x21,0x18,0x71,0x00, -0x21,0x28,0x25,0x02, -0x21,0x10,0x51,0x00, -0x09,0x00,0x04,0x24, -0x00,0x38,0x02,0xAE, -0xA0,0x37,0x03,0xAE, -0xB0,0x01,0x00,0x0C, -0xAA,0x37,0x05,0xA6, -0x30,0x1F,0x70,0x26, -0x00,0x38,0x03,0x96, -0x2A,0xB0,0x02,0x3C, -0x35,0x00,0x42,0x34, -0xC2,0x88,0x03,0x00, -0x00,0x00,0x51,0xA0, -0x5D,0x27,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xAA,0x37,0x03,0x96, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xD0,0x1B,0x02,0x8E, -0x80,0x00,0x03,0x3C, -0x41,0xB0,0x04,0x3C, -0x25,0x10,0x43,0x00, -0x00,0x00,0x82,0xAC, -0x28,0x00,0xBF,0x8F, -0xD0,0x1B,0x02,0xAE, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x08,0x38,0x02,0x8E, -0xA0,0x37,0x05,0x8E, -0x21,0x30,0x80,0x00, -0x23,0x88,0x44,0x00, -0xFF,0xFF,0x27,0x32, -0x09,0x00,0x04,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xA0,0x37,0x03,0x8E, -0xAA,0x37,0x02,0x96, -0x04,0x38,0x12,0x96, -0x21,0x18,0x71,0x00, -0x21,0x10,0x22,0x02, -0x23,0x10,0x11,0x3C, -0xA0,0x37,0x03,0xAE, -0xAA,0x37,0x02,0xA6, -0x15,0x00,0x40,0x16, -0x00,0x38,0x11,0xAE, -0x09,0x00,0x04,0x24, -0xB0,0x01,0x00,0x0C, -0x30,0x1F,0x70,0x26, -0x46,0x0B,0x00,0x08, -0x00,0x00,0x00,0x00, -0x17,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x57,0xFF,0x40,0x10, -0x30,0x1F,0x63,0x26, -0x2A,0x1C,0x62,0x90, -0x00,0x00,0x00,0x00, -0x53,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x50,0x39,0x64,0x94, -0x2A,0x1C,0x60,0xA0, -0x00,0xC0,0x84,0x24, -0xC2,0x34,0x00,0x0C, -0xFF,0xFF,0x84,0x30, -0xD3,0x0A,0x00,0x08, -0x00,0x00,0x00,0x00, -0xB0,0x01,0x00,0x0C, -0x09,0x00,0x04,0x24, -0xA0,0x37,0x05,0x8E, -0x09,0x00,0x04,0x24, -0x23,0x10,0x06,0x3C, -0x21,0x38,0x40,0x02, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xA0,0x37,0x03,0x8E, -0xAA,0x37,0x02,0x96, -0x21,0x20,0x51,0x02, -0x21,0x18,0x72,0x00, -0x21,0x10,0x42,0x02, -0x00,0x38,0x04,0xAE, -0x09,0x00,0x04,0x24, -0xA0,0x37,0x03,0xAE, -0x75,0x0B,0x00,0x08, -0xAA,0x37,0x02,0xA6, -0xFF,0x00,0x86,0x30, -0x02,0x80,0x02,0x3C, -0x40,0x00,0xC3,0x2C, -0x4A,0xF3,0x47,0x90, -0x00,0x00,0x63,0x38, -0x3F,0x00,0x02,0x24, -0x0A,0x30,0x43,0x00, -0x01,0x00,0x02,0x24, -0x08,0x0E,0x04,0x24, -0x00,0x7F,0x05,0x24, -0x03,0x00,0xE2,0x10, -0x31,0x00,0xC3,0x2C, -0xA9,0x45,0x00,0x08, -0x00,0x00,0x00,0x00, -0x30,0x00,0x02,0x24, -0xA9,0x45,0x00,0x08, -0x0A,0x30,0x43,0x00, -0xC0,0xFF,0xBD,0x27, -0x02,0x80,0x03,0x3C, -0x38,0x00,0xB4,0xAF, -0x34,0x00,0xB3,0xAF, -0x30,0x00,0xB2,0xAF, -0x2C,0x00,0xB1,0xAF, -0x28,0x00,0xB0,0xAF, -0x28,0xEA,0x62,0x24, -0x3C,0x00,0xBF,0xAF, -0x0A,0x00,0x4A,0x94, -0x02,0x00,0x48,0x94, -0x06,0x00,0x49,0x94, -0xFF,0x00,0x84,0x30, -0xFF,0x00,0xA5,0x30, -0x28,0xEA,0x6B,0x94, -0x04,0x00,0x4C,0x94, -0x08,0x00,0x4D,0x94, -0x00,0x1C,0x05,0x00, -0x00,0x14,0x04,0x00, -0x00,0x3E,0x05,0x00, -0x00,0x36,0x04,0x00, -0x25,0x38,0xE3,0x00, -0x25,0x30,0xC2,0x00, -0x00,0x44,0x08,0x00, -0x00,0x12,0x05,0x00, -0x00,0x4C,0x09,0x00, -0x00,0x54,0x0A,0x00, -0x00,0x1A,0x04,0x00, -0x25,0x38,0xE2,0x00, -0x25,0x40,0x0B,0x01, -0x25,0x48,0x2C,0x01, -0x25,0x50,0x4D,0x01, -0x25,0x30,0xC3,0x00, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xA8,0xAF, -0x14,0x00,0xA9,0xAF, -0x18,0x00,0xAA,0xAF, -0x25,0x98,0xE5,0x00, -0x25,0x90,0xC4,0x00, -0x30,0x1F,0x54,0x24, -0x21,0x80,0x00,0x00, -0x10,0x00,0xB1,0x27, -0x02,0x00,0x02,0x2E, -0x32,0x00,0x40,0x10, -0x80,0x10,0x10,0x00, -0x21,0x10,0x54,0x00, -0xF0,0x1C,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x21,0x40,0x73,0x00, -0x21,0x38,0x00,0x00, -0x7F,0x00,0x09,0x24, -0xC0,0x20,0x07,0x00, -0x04,0x10,0x89,0x00, -0x24,0x10,0x48,0x00, -0x06,0x10,0x82,0x00, -0x01,0x00,0xE5,0x24, -0xFF,0x00,0x43,0x30, -0x21,0x30,0x27,0x02, -0x40,0x00,0x63,0x2C, -0xFF,0x00,0xA7,0x30, -0x02,0x00,0x60,0x14, -0x04,0x00,0xE4,0x2C, -0x3F,0x00,0x02,0x24, -0xF3,0xFF,0x80,0x14, -0x10,0x00,0xC2,0xA0, -0x23,0x00,0xA6,0x93, -0x22,0x00,0xA2,0x93, -0x21,0x00,0xA5,0x93, -0x40,0x18,0x10,0x00, -0x00,0x14,0x02,0x00, -0x21,0x18,0x71,0x00, -0x20,0x00,0xA7,0x93, -0x00,0x36,0x06,0x00, -0x25,0x30,0xC2,0x00, -0x00,0x2A,0x05,0x00, -0x00,0x00,0x64,0x94, -0x25,0x30,0xC5,0x00, -0x7F,0x7F,0x05,0x3C, -0x25,0x30,0xC7,0x00, -0xA9,0x45,0x00,0x0C, -0x7F,0x7F,0xA5,0x34, -0x01,0x00,0x02,0x26, -0xFF,0x00,0x50,0x30, -0x06,0x00,0x03,0x2E, -0xD5,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xB4,0x8F, -0x34,0x00,0xB3,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x40,0x00,0xBD,0x27, -0x21,0x10,0x54,0x00, -0xF0,0x1C,0x43,0x8C, -0xDC,0x0B,0x00,0x08, -0x21,0x40,0x72,0x00, -0xD8,0xFF,0xBD,0x27, -0x02,0x80,0x09,0x3C, -0x1C,0x00,0xB3,0xAF, -0x10,0x00,0xB0,0xAF, -0x20,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x30,0x1F,0x27,0x25, -0x02,0x80,0x02,0x3C, -0xB0,0x1B,0xE3,0x94, -0xDE,0x5D,0x46,0x90, -0xFF,0x00,0x90,0x30, -0x00,0x10,0x63,0x30, -0x20,0x00,0xC5,0x30, -0x21,0x20,0x07,0x02, -0x10,0x00,0xC6,0x30, -0x02,0x00,0x60,0x14, -0x3F,0x00,0x13,0x24, -0x63,0x1D,0x93,0x90, -0x28,0x00,0xC0,0x10, -0x30,0x1F,0x22,0x25, -0x8D,0x1D,0x82,0x90, -0x7F,0x1D,0x83,0x90, -0x00,0x00,0x00,0x00, -0x23,0x10,0x43,0x00, -0x00,0x46,0x02,0x00, -0x03,0x46,0x08,0x00, -0xFF,0x00,0x71,0x30, -0x30,0x1F,0x27,0x25, -0x0F,0x00,0x08,0x31, -0x21,0x30,0x00,0x01, -0x21,0x40,0x07,0x02, -0xB7,0x1D,0x02,0x91, -0xB0,0x1B,0xE3,0x84, -0x0F,0x00,0x05,0x3C, -0x0F,0x00,0x42,0x30, -0x21,0x10,0x51,0x00, -0x0C,0x08,0x04,0x24, -0x00,0xFF,0xA5,0x34, -0x06,0x00,0x60,0x04, -0xFF,0x00,0x52,0x30, -0xC5,0x1D,0x02,0x91, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x21,0x10,0x51,0x00, -0xFF,0x00,0x51,0x30, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x9A,0x0B,0x00,0x0C, -0x21,0x20,0x60,0x02, -0x21,0x20,0x20,0x02, -0x21,0x28,0x40,0x02, -0x21,0x30,0x00,0x02, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xAB,0x0B,0x00,0x08, -0x28,0x00,0xBD,0x27, -0xDF,0xFF,0xA0,0x10, -0x21,0x18,0x02,0x02, -0xA9,0x1D,0x62,0x90, -0x9B,0x1D,0x63,0x90, -0x26,0x0C,0x00,0x08, -0x23,0x10,0x43,0x00, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x02,0x3C, -0x18,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0xE9,0x5D,0x43,0x90, -0x01,0x00,0x02,0x24, -0x0D,0x00,0x62,0x10, -0xFF,0x00,0x91,0x30, -0x0D,0x0C,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x21,0x30,0x20,0x02, -0x18,0x00,0x04,0x24, -0x5F,0x47,0x00,0x0C, -0xFF,0x03,0x05,0x24, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x0A,0x00,0x04,0x24, -0x25,0x22,0x00,0x08, -0x20,0x00,0xBD,0x27, -0x1A,0x00,0x23,0x12, -0x0B,0x00,0x02,0x24, -0x1D,0x00,0x22,0x12, -0x0F,0x00,0x05,0x3C, -0xFF,0xFF,0xA5,0x34, -0x15,0x00,0x04,0x24, -0xF4,0xF8,0x06,0x34, -0x5F,0x47,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x48,0xF3,0x44,0x90, -0xFE,0x00,0x03,0x24, -0xE9,0xFF,0x83,0x14, -0x0F,0x00,0x10,0x3C, -0xFF,0xFF,0x05,0x36, -0x8A,0x47,0x00,0x0C, -0x15,0x00,0x04,0x24, -0xFF,0x00,0x46,0x30, -0x00,0xFF,0x03,0x36, -0x24,0x10,0x43,0x00, -0x01,0x00,0xC6,0x24, -0x25,0x30,0x46,0x00, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x15,0x00,0x04,0x24, -0x5B,0x0C,0x00,0x08, -0x21,0x30,0x20,0x02, -0x0F,0x00,0x05,0x3C, -0xFF,0xFF,0xA5,0x34, -0x15,0x00,0x04,0x24, -0x6B,0x0C,0x00,0x08, -0xF4,0xA8,0x06,0x34, -0xFF,0xFF,0xA5,0x34, -0x15,0x00,0x04,0x24, -0x6B,0x0C,0x00,0x08, -0xF5,0xF8,0x06,0x34, -0xFC,0x00,0x84,0x30, -0x50,0x00,0x02,0x24, -0x11,0x00,0x82,0x10, -0x05,0x00,0x03,0x24, -0x51,0x00,0x82,0x28, -0x10,0x00,0x40,0x10, -0xA0,0x00,0x02,0x24, -0x20,0x00,0x02,0x24, -0x0B,0x00,0x82,0x10, -0x02,0x00,0x03,0x24, -0x21,0x00,0x82,0x28, -0x15,0x00,0x40,0x14, -0x30,0x00,0x02,0x24, -0x06,0x00,0x82,0x10, -0x03,0x00,0x03,0x24, -0x04,0x00,0x03,0x24, -0x40,0x00,0x02,0x24, -0x02,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0x0C,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0xFD,0xFF,0x82,0x10, -0x08,0x00,0x03,0x24, -0xA1,0x00,0x82,0x28, -0x0C,0x00,0x40,0x10, -0xC0,0x00,0x02,0x24, -0x80,0x00,0x02,0x24, -0xF7,0xFF,0x82,0x10, -0x06,0x00,0x03,0x24, -0x07,0x00,0x03,0x24, -0x99,0x0C,0x00,0x08, -0x90,0x00,0x02,0x24, -0xF2,0xFF,0x80,0x10, -0x21,0x18,0x00,0x00, -0x01,0x00,0x03,0x24, -0x99,0x0C,0x00,0x08, -0x10,0x00,0x02,0x24, -0xED,0xFF,0x82,0x10, -0x0A,0x00,0x03,0x24, -0xC1,0x00,0x82,0x28, -0x04,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x09,0x00,0x03,0x24, -0x99,0x0C,0x00,0x08, -0xB0,0x00,0x02,0x24, -0x0B,0x00,0x03,0x24, -0x99,0x0C,0x00,0x08, -0xD0,0x00,0x02,0x24, -0xD8,0xFF,0xBD,0x27, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x20,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x08,0x00,0x83,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x08,0x00,0x90,0x94, -0x02,0x80,0x02,0x3C, -0x21,0x98,0x80,0x00, -0x25,0x80,0x02,0x02, -0x21,0x20,0x00,0x02, -0xFF,0x00,0xB2,0x30, -0xFF,0x00,0xD1,0x30, -0x21,0x28,0x00,0x00, -0x08,0x52,0x00,0x0C, -0x08,0x00,0x06,0x24, -0x08,0x00,0x04,0x8E, -0x04,0x00,0x05,0x8E, -0xFF,0xDF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xFF,0xE0,0x03,0x24, -0x24,0x20,0x82,0x00, -0x00,0x40,0x02,0x3C, -0x10,0x00,0x06,0x8E, -0x24,0x28,0xA3,0x00, -0x25,0x20,0x82,0x00, -0x3F,0xFF,0x02,0x3C, -0x0C,0x00,0x67,0x8E, -0x7F,0xFF,0x03,0x24, -0xFF,0xFF,0x42,0x34, -0x00,0x12,0xA5,0x34, -0x01,0x00,0x52,0x32, -0x03,0x00,0x31,0x32, -0x24,0x20,0x83,0x00, -0x24,0x28,0xA2,0x00, -0xC0,0x91,0x12,0x00, -0x80,0x8D,0x11,0x00, -0x00,0x80,0x02,0x3C, -0x25,0x30,0xC2,0x00, -0x25,0x20,0x92,0x00, -0x25,0x28,0xB1,0x00, -0x20,0x00,0x02,0x24, -0x10,0x00,0x06,0xAE, -0x02,0x00,0x02,0xA2, -0x08,0x00,0x04,0xAE, -0x04,0x00,0x05,0xAE, -0x00,0x00,0x07,0xA6, -0x02,0x80,0x02,0x3C, -0xE0,0x3A,0x43,0x94, -0xFB,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xC2,0x1B,0x03,0x00, -0x24,0x30,0xC2,0x00, -0x80,0x1C,0x03,0x00, -0x25,0x30,0xC3,0x00, -0x14,0x00,0x05,0x8E, -0x82,0x24,0x06,0x00, -0x01,0x00,0x84,0x30, -0x0C,0x00,0x02,0x24, -0x0A,0x10,0x04,0x00, -0xFF,0x81,0x03,0x24, -0x24,0x28,0xA3,0x00, -0x40,0x12,0x02,0x00, -0x25,0x28,0xA2,0x00, -0x14,0x00,0x05,0xAE, -0x10,0x00,0x06,0xAE, -0x00,0x60,0x03,0x40, -0x01,0x00,0x61,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x02,0x3C, -0x74,0x57,0x42,0x24, -0x04,0x00,0x44,0x8C, -0x00,0x00,0x62,0xAE, -0x04,0x00,0x53,0xAC, -0x00,0x00,0x93,0xAC, -0x04,0x00,0x64,0xAE, -0x00,0x60,0x83,0x40, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x20,0x00,0xBF,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0xFF,0xFF,0x83,0x30, -0xFF,0x00,0xB1,0x30, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x13,0x3C, -0x30,0x1F,0x70,0x26, -0xB0,0x1B,0x02,0x96, -0x00,0x00,0x00,0x00, -0x00,0x80,0x42,0x30, -0x2F,0x00,0x43,0x10, -0x02,0x80,0x04,0x3C, -0x00,0x80,0x02,0x34, -0x50,0xDF,0x84,0x24, -0x33,0x00,0x62,0x10, -0x21,0x30,0x20,0x02, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x30,0x3B,0x04,0x92, -0x4F,0x0C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0x03,0x02,0x63,0x34, -0x00,0x00,0x62,0x90, -0x00,0x08,0x04,0x24, -0x01,0x00,0x05,0x24, -0x04,0x00,0x42,0x30, -0x00,0x00,0x62,0xA0, -0x1B,0x47,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x09,0x04,0x24, -0x01,0x00,0x05,0x24, -0x1B,0x47,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x84,0x08,0x04,0x24, -0xFF,0xFF,0x05,0x24, -0x1B,0x47,0x00,0x0C, -0x58,0x00,0x06,0x24, -0x00,0x0C,0x05,0x24, -0x01,0x00,0x06,0x24, -0x5F,0x47,0x00,0x0C, -0x18,0x00,0x04,0x24, -0xB0,0x1B,0x02,0x96, -0x8F,0x3E,0x11,0xA2, -0xFF,0x7F,0x42,0x30, -0xB0,0x1B,0x02,0xA6, -0x30,0x1F,0x62,0x26, -0x30,0x3B,0x44,0x90, -0x0D,0x0C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x60,0x92,0x40, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x00,0x60,0x92,0x40, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x30,0x3B,0x05,0x92, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x30,0xDF,0x84,0x24, -0x01,0x00,0x02,0x24, -0x2C,0x00,0x22,0x12, -0x00,0x00,0x00,0x00, -0x30,0x3B,0x04,0x92, -0x00,0x00,0x00,0x00, -0xFE,0xFF,0x84,0x24, -0x4F,0x0C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x07,0x3C, -0x03,0x02,0xE7,0x34, -0x00,0x00,0xE2,0x90, -0xFB,0xFF,0x03,0x24, -0x00,0x08,0x04,0x24, -0x24,0x10,0x43,0x00, -0x00,0x00,0xE2,0xA0, -0x01,0x00,0x05,0x24, -0x1B,0x47,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x03,0x00,0x30,0x32, -0x00,0x09,0x04,0x24, -0x01,0x00,0x05,0x24, -0x1B,0x47,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0A,0x04,0x24, -0x10,0x00,0x05,0x24, -0x1B,0x47,0x00,0x0C, -0x42,0x30,0x10,0x00, -0x21,0x30,0x00,0x02, -0x00,0x0D,0x04,0x24, -0x1B,0x47,0x00,0x0C, -0x00,0x0C,0x05,0x24, -0x84,0x08,0x04,0x24, -0xFF,0xFF,0x05,0x24, -0x1B,0x47,0x00,0x0C, -0x18,0x00,0x06,0x24, -0x18,0x00,0x04,0x24, -0x00,0x0C,0x05,0x24, -0x5F,0x47,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x30,0x1F,0x64,0x26, -0xB0,0x1B,0x82,0x94, -0x00,0x80,0x03,0x24, -0x8F,0x3E,0x91,0xA0, -0x25,0x10,0x43,0x00, -0x47,0x0D,0x00,0x08, -0xB0,0x1B,0x82,0xA4, -0x30,0x3B,0x04,0x92, -0x65,0x0D,0x00,0x08, -0x02,0x00,0x84,0x24, -0xC8,0xFF,0xBD,0x27, -0x02,0x80,0x03,0x3C, -0x34,0x00,0xBF,0xAF, -0x30,0x00,0xB2,0xAF, -0x2C,0x00,0xB1,0xAF, -0x28,0x00,0xB0,0xAF, -0x34,0xEA,0x62,0x24, -0x01,0x00,0x44,0x90, -0x05,0x00,0x45,0x90, -0x09,0x00,0x46,0x90, -0x0D,0x00,0x47,0x90, -0x04,0x00,0x51,0x90, -0x08,0x00,0x50,0x90, -0x34,0xEA,0x72,0x90, -0x02,0x00,0x4F,0x90, -0x0C,0x00,0x43,0x90, -0x06,0x00,0x4E,0x90, -0x0A,0x00,0x4D,0x90, -0x0E,0x00,0x48,0x90, -0x03,0x00,0x49,0x90, -0x07,0x00,0x4A,0x90, -0x0B,0x00,0x4B,0x90, -0x0F,0x00,0x4C,0x90, -0x00,0x22,0x04,0x00, -0x00,0x2A,0x05,0x00, -0x00,0x32,0x06,0x00, -0x00,0x3A,0x07,0x00, -0x02,0x80,0x18,0x3C, -0x25,0x28,0xB1,0x00, -0x25,0x30,0xD0,0x00, -0x25,0x38,0xE3,0x00, -0x25,0x20,0x92,0x00, -0x11,0x00,0x51,0x90, -0x10,0x00,0x50,0x90, -0x30,0x1F,0x03,0x27, -0x00,0x7C,0x0F,0x00, -0x00,0x74,0x0E,0x00, -0x00,0x6C,0x0D,0x00, -0x00,0x44,0x08,0x00, -0x25,0x78,0xE4,0x01, -0x25,0x70,0xC5,0x01, -0x25,0x68,0xA6,0x01, -0x25,0x40,0x07,0x01, -0x5A,0x3E,0x66,0x90, -0x00,0x4E,0x09,0x00, -0x00,0x56,0x0A,0x00, -0x00,0x5E,0x0B,0x00, -0x00,0x66,0x0C,0x00, -0x25,0x48,0x2F,0x01, -0x25,0x50,0x4E,0x01, -0x25,0x58,0x6D,0x01, -0x25,0x60,0x88,0x01, -0x25,0xB0,0x05,0x3C, -0x37,0x02,0xA5,0x34, -0x10,0x00,0xA9,0xAF, -0x14,0x00,0xAA,0xAF, -0x18,0x00,0xAB,0xAF, -0x1C,0x00,0xAC,0xAF, -0x20,0x00,0xB0,0xA3, -0x21,0x00,0xB1,0xA3, -0x03,0x00,0xC7,0x30, -0x00,0x00,0xA4,0x90, -0x02,0x00,0xE2,0x24, -0x01,0x00,0x03,0x24, -0x04,0x18,0x43,0x00, -0x1C,0x00,0xC6,0x30, -0xF8,0xFF,0x02,0x24, -0x24,0x20,0x82,0x00, -0xFF,0x00,0x67,0x30, -0x82,0x30,0x06,0x00, -0x10,0x00,0xE3,0x2C, -0x25,0x20,0x86,0x00, -0x0F,0x00,0x02,0x24, -0x00,0x00,0xA4,0xA0, -0x0A,0x38,0x43,0x00, -0x21,0x28,0x00,0x00, -0x10,0x00,0xA3,0x27, -0x21,0x30,0x65,0x00, -0x00,0x00,0xC2,0x90, -0x01,0x00,0xA5,0x24, -0x2B,0x10,0xE2,0x00, -0x02,0x00,0x40,0x10, -0x11,0x00,0xA4,0x2C, -0x00,0x00,0xC7,0xA0, -0xF8,0xFF,0x80,0x14, -0x21,0x30,0x60,0x00, -0x21,0x28,0x00,0x00, -0x25,0xB0,0x07,0x3C, -0x01,0x00,0xC2,0x90, -0x00,0x00,0xC3,0x90, -0x21,0x20,0xA7,0x00, -0x00,0x11,0x02,0x00, -0x25,0x10,0x43,0x00, -0x01,0x00,0xA5,0x24, -0xFF,0x00,0x42,0x30, -0x08,0x00,0xA3,0x2C, -0xA8,0x01,0x82,0xA0, -0xF6,0xFF,0x60,0x14, -0x02,0x00,0xC6,0x24, -0x21,0x00,0xA2,0x93, -0x20,0x00,0xA4,0x93, -0x02,0x80,0x03,0x3C, -0x00,0x11,0x02,0x00, -0xF1,0x5D,0x65,0x90, -0x25,0x10,0x44,0x00, -0xFF,0x00,0x42,0x30, -0xA7,0x01,0xE3,0x34, -0x00,0x00,0x62,0xA0, -0x01,0x00,0x02,0x24, -0x07,0x00,0xA2,0x10, -0x30,0x1F,0x03,0x27, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x58,0x3E,0x62,0x94, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x30, -0xF6,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x79,0x3E,0x63,0x90, -0x00,0x00,0x00,0x00, -0x04,0x00,0x62,0x30, -0xF1,0xFF,0x40,0x10, -0x03,0x00,0x63,0x30, -0x0C,0x00,0x65,0x10, -0x03,0x00,0x02,0x24, -0x05,0x00,0x62,0x10, -0x21,0x20,0x00,0x00, -0x12,0x0D,0x00,0x0C, -0x21,0x28,0x00,0x00, -0xFF,0x0D,0x00,0x08, -0x00,0x00,0x00,0x00, -0x00,0x80,0x04,0x34, -0x12,0x0D,0x00,0x0C, -0x02,0x00,0x05,0x24, -0xFF,0x0D,0x00,0x08, -0x00,0x00,0x00,0x00, -0x00,0x80,0x04,0x34, -0x12,0x0D,0x00,0x0C, -0x01,0x00,0x05,0x24, -0xFF,0x0D,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x02,0x80,0x06,0x3C, -0x14,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x88,0x58,0xC2,0x24, -0x01,0x00,0x44,0x90, -0x88,0x58,0xC3,0x90, -0x02,0x00,0x45,0x90, -0x03,0x00,0x46,0x90, -0x05,0x00,0x47,0x90, -0x04,0x00,0x48,0x90, -0x00,0x22,0x04,0x00, -0x25,0x18,0x64,0x00, -0x00,0x2C,0x05,0x00, -0x25,0xB0,0x10,0x3C, -0x25,0x18,0x65,0x00, -0x00,0x36,0x06,0x00, -0x00,0x3A,0x07,0x00, -0x25,0x18,0x66,0x00, -0x58,0x00,0x02,0x36, -0x5C,0x00,0x05,0x36, -0x25,0x40,0x07,0x01, -0x02,0x80,0x04,0x3C, -0x00,0x00,0x43,0xAC, -0x84,0x58,0x84,0x24, -0x00,0x00,0xA8,0xAC, -0x19,0x4F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x94,0x00,0x03,0x36, -0x00,0x00,0x62,0xA4, -0x48,0x00,0x10,0x36, -0x00,0x00,0x02,0x8E, -0x04,0x00,0x03,0x3C, -0x14,0x00,0xBF,0x8F, -0x25,0x10,0x43,0x00, -0x00,0x00,0x02,0xAE, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x21,0x90,0x80,0x00, -0x18,0x02,0x04,0x24, -0x14,0x00,0xB1,0xAF, -0x1C,0x00,0xBF,0xAF, -0x25,0x24,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x04,0x3C, -0x21,0x88,0x40,0x00, -0x84,0x58,0xA5,0x24, -0xDC,0x01,0x06,0x24, -0x18,0x00,0x40,0x10, -0x98,0xDF,0x84,0x24, -0x08,0x00,0x50,0x94, -0xF8,0x01,0x02,0x24, -0x0C,0x00,0x22,0xAE, -0x02,0x80,0x02,0x3C, -0x0A,0x00,0x03,0x24, -0x25,0x80,0x02,0x02, -0x14,0x00,0x23,0xAE, -0x3C,0x00,0x04,0x26, -0x10,0x52,0x00,0x0C, -0x20,0x00,0x10,0x26, -0x18,0x00,0x12,0xAE, -0x21,0x20,0x20,0x02, -0x30,0x09,0x00,0x0C, -0x14,0x00,0x12,0xAE, -0x02,0x80,0x04,0x3C, -0x21,0x28,0x40,0x02, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xA4,0xDF,0x84,0x24, -0x2F,0x55,0x00,0x08, -0x20,0x00,0xBD,0x27, -0x02,0x80,0x05,0x3C, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x5C,0xEA,0xA5,0x24, -0x2F,0x55,0x00,0x08, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x14,0x00,0xB1,0xAF, -0x18,0x00,0xBF,0xAF, -0x25,0x24,0x00,0x0C, -0x28,0x00,0x04,0x24, -0x02,0x80,0x04,0x3C, -0x21,0x88,0x40,0x00, -0x21,0x28,0x00,0x02, -0x06,0x00,0x06,0x24, -0x15,0x00,0x40,0x10, -0xB4,0xDF,0x84,0x24, -0x08,0x00,0x44,0x94, -0x08,0x00,0x02,0x24, -0x0C,0x00,0x22,0xAE, -0x02,0x80,0x02,0x3C, -0x0C,0x00,0x03,0x24, -0x25,0x20,0x82,0x00, -0x14,0x00,0x23,0xAE, -0x10,0x52,0x00,0x0C, -0x20,0x00,0x84,0x24, -0x30,0x09,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0xC0,0xDF,0x84,0x24, -0x21,0x10,0x00,0x00, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x02,0x80,0x05,0x3C, -0x2F,0x55,0x00,0x0C, -0x6C,0xEA,0xA5,0x24, -0x92,0x0E,0x00,0x08, -0xFF,0xFF,0x02,0x24, -0xD8,0xFF,0xBD,0x27, -0x1C,0x00,0xB3,0xAF, -0x21,0x98,0x80,0x00, -0x2C,0x00,0x04,0x24, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x21,0x90,0xA0,0x00, -0x20,0x00,0xBF,0xAF, -0x25,0x24,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x21,0x88,0x40,0x00, -0xD8,0xDF,0x84,0x24, -0x21,0x30,0x40,0x02, -0x19,0x00,0x40,0x10, -0x84,0xEA,0xA5,0x24, -0x05,0x00,0x65,0x92, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x30,0x96, -0x02,0x80,0x02,0x3C, -0x0B,0x00,0x03,0x24, -0x25,0x80,0x02,0x02, -0x20,0x00,0x10,0x26, -0x0C,0x00,0x02,0x24, -0x21,0x20,0x00,0x02, -0x0C,0x00,0x22,0xAE, -0x14,0x00,0x23,0xAE, -0x21,0x28,0x60,0x02, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x08,0x00,0x12,0xAE, -0x21,0x20,0x20,0x02, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x30,0x09,0x00,0x08, -0x28,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xCC,0xDF,0x84,0x24, -0x2F,0x55,0x00,0x08, -0x28,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x18,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x02,0x3C, -0xF6,0x5E,0x43,0x90, -0x02,0x80,0x11,0x3C, -0x04,0x00,0x04,0x24, -0x0F,0x00,0x63,0x30, -0x04,0x00,0x63,0x28, -0x36,0x00,0x60,0x14, -0x01,0x00,0x05,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x50,0x24, -0x2C,0xE0,0x22,0x8E, -0x0F,0x00,0x05,0x3C, -0xFF,0xFF,0xA5,0x34, -0x24,0x00,0x04,0x24, -0x12,0x00,0x40,0x14, -0x60,0x00,0x06,0x24, -0x0F,0x00,0x05,0x3C, -0x5F,0x47,0x00,0x0C, -0xFF,0xFF,0xA5,0x34, -0x01,0x00,0x02,0x24, -0x2C,0xE0,0x22,0xAE, -0xD0,0x07,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x70,0x58,0x43,0xAC, -0x02,0x80,0x02,0x3C, -0xF5,0x5E,0x44,0x90, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x05,0x24, -0xFF,0x00,0x84,0x30, -0x64,0x31,0x00,0x08, -0x20,0x00,0xBD,0x27, -0x8A,0x47,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x9C,0x3E,0x04,0x92, -0xFF,0x00,0x43,0x30, -0x00,0x2C,0x03,0x00, -0x0A,0x00,0x64,0x10, -0x9D,0x3E,0x02,0xA2, -0x02,0x80,0x02,0x3C, -0x49,0xF3,0x44,0x90, -0x00,0x00,0x00,0x00, -0x00,0x22,0x04,0x00, -0x6B,0x1E,0x00,0x0C, -0x25,0x20,0xA4,0x00, -0x9D,0x3E,0x03,0x92, -0x00,0x00,0x00,0x00, -0x9C,0x3E,0x03,0xA2, -0x10,0x27,0x02,0x24, -0x40,0x39,0x02,0xAE, -0x02,0x80,0x02,0x3C, -0xF5,0x5E,0x44,0x90, -0x2C,0xE0,0x20,0xAE, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x05,0x24, -0xFF,0x00,0x84,0x30, -0x64,0x31,0x00,0x08, -0x20,0x00,0xBD,0x27, -0x64,0x31,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xDB,0x0E,0x00,0x08, -0x02,0x80,0x02,0x3C, -0xB8,0xFF,0xBD,0x27, -0x00,0x01,0x04,0x24, -0x3C,0x00,0xB3,0xAF, -0x38,0x00,0xB2,0xAF, -0x34,0x00,0xB1,0xAF, -0x40,0x00,0xBF,0xAF, -0x30,0x00,0xB0,0xAF, -0x25,0x24,0x00,0x0C, -0x02,0x80,0x13,0x3C, -0x02,0x80,0x04,0x3C, -0x21,0x88,0x40,0x00, -0xF0,0xDD,0x65,0x26, -0x06,0x00,0x06,0x24, -0x0C,0x00,0x52,0x24, -0x4C,0x00,0x40,0x10, -0x30,0xE0,0x84,0x24, -0x08,0x00,0x50,0x94, -0x02,0x80,0x02,0x3C, -0x25,0x80,0x02,0x02, -0x24,0x00,0x04,0x26, -0x10,0x52,0x00,0x0C, -0x20,0x00,0x00,0xA6, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x04,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x30,0x00,0x04,0x26, -0xF0,0xDD,0x65,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x20,0x00,0x03,0x96, -0x18,0x00,0x02,0x24, -0x02,0x80,0x04,0x3C, -0x03,0xFF,0x63,0x30, -0x40,0x00,0x63,0x34, -0x20,0x00,0x03,0xA6, -0x30,0x1F,0x84,0x24, -0x0C,0x00,0x22,0xAE, -0xF8,0x1D,0x82,0x94, -0x20,0x00,0x06,0x26, -0x02,0x80,0x07,0x3C, -0xFF,0x0F,0x43,0x30, -0x00,0x19,0x03,0x00, -0x02,0x2A,0x03,0x00, -0x01,0x00,0x42,0x24, -0xF8,0x1D,0x82,0xA4, -0x16,0x00,0xC3,0xA0, -0x17,0x00,0xC5,0xA0, -0x74,0x3B,0x86,0x8C, -0xA8,0x5A,0xE7,0x24, -0x38,0x00,0x04,0x26, -0x21,0x28,0x00,0x00, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB2,0xAF, -0x18,0x00,0xA4,0x27, -0x28,0x00,0xA5,0x27, -0x21,0x50,0x00,0x0C, -0x21,0x80,0x40,0x00, -0x28,0x00,0xA3,0x8F, -0x21,0x20,0x00,0x02, -0x18,0x00,0xA7,0x27, -0x09,0x00,0x62,0x28, -0x01,0x00,0x05,0x24, -0x12,0x00,0x40,0x10, -0x08,0x00,0x06,0x24, -0x21,0x20,0x00,0x02, -0x21,0x30,0x60,0x00, -0x01,0x00,0x05,0x24, -0x18,0x00,0xA7,0x27, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB2,0xAF, -0x21,0x20,0x20,0x02, -0x01,0x00,0x05,0x24, -0xB9,0x0C,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x40,0x00,0xBF,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB2,0xAF, -0x28,0x00,0xA6,0x8F, -0x21,0x20,0x40,0x00, -0x32,0x00,0x05,0x24, -0xF8,0xFF,0xC6,0x24, -0x59,0x0F,0x00,0x08, -0x20,0x00,0xA7,0x27, -0x02,0x80,0x05,0x3C, -0x2F,0x55,0x00,0x0C, -0x9C,0xEA,0xA5,0x24, -0x40,0x00,0xBF,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x34,0x00,0xBF,0xAF, -0x30,0x00,0xBE,0xAF, -0x2C,0x00,0xB7,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x21,0x80,0x80,0x00, -0x45,0x00,0xA0,0x14, -0x21,0x90,0x00,0x00, -0x08,0x00,0x82,0x90, -0x02,0x80,0x13,0x3C, -0x30,0x1F,0x63,0x26, -0x0F,0x00,0x42,0x30, -0x14,0x3E,0x62,0xAC, -0x25,0xB0,0x02,0x3C, -0x0A,0x00,0x10,0x26, -0xD0,0x01,0x57,0x34, -0x02,0x80,0x14,0x3C, -0xD8,0x01,0x5E,0x34, -0xDC,0x01,0x55,0x34, -0xD4,0x01,0x56,0x34, -0x03,0x00,0x11,0x24, -0x00,0x00,0x06,0x92, -0x30,0x1F,0x62,0x26, -0x0C,0x3E,0x47,0x90, -0x0F,0x00,0xC3,0x30, -0x01,0x00,0x05,0x92, -0x18,0x00,0x67,0x00, -0x03,0x00,0x04,0x92, -0x02,0x00,0x02,0x92, -0x0F,0x00,0xA7,0x30, -0x00,0x3A,0x07,0x00, -0x02,0x29,0x05,0x00, -0x00,0x22,0x04,0x00, -0x25,0x20,0x82,0x00, -0x00,0x2B,0x05,0x00, -0x42,0x11,0x06,0x00, -0x00,0x24,0x04,0x00, -0x03,0x00,0x49,0x30, -0x02,0x31,0x06,0x00, -0x01,0x00,0x02,0x24, -0x01,0x00,0xC6,0x30, -0x12,0x18,0x00,0x00, -0x0A,0x00,0x63,0x24, -0xFF,0x00,0x63,0x30, -0x25,0x18,0x67,0x00, -0x25,0x18,0x65,0x00, -0x30,0x00,0x22,0x11, -0x25,0x38,0x64,0x00, -0x02,0x00,0x22,0x29, -0x3E,0x00,0x40,0x14, -0x02,0x00,0x02,0x24, -0x38,0x00,0x22,0x11, -0x03,0x00,0x02,0x24, -0x40,0x00,0x22,0x11, -0x00,0x00,0x00,0x00, -0x21,0x28,0x20,0x01, -0x3C,0xE0,0x84,0x26, -0x2F,0x55,0x00,0x0C, -0xFF,0xFF,0x31,0x26, -0xD9,0xFF,0x21,0x06, -0x04,0x00,0x10,0x26, -0x25,0xB0,0x02,0x3C, -0xE7,0x01,0x42,0x34, -0x00,0x00,0x52,0xA0, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xBE,0x8F, -0x2C,0x00,0xB7,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x02,0x80,0x13,0x3C, -0x08,0x00,0x83,0x90, -0x30,0x1F,0x62,0x26, -0x14,0x3E,0x44,0x8C, -0x0F,0x00,0x63,0x30, -0xBB,0xFF,0x83,0x14, -0x00,0x00,0x00,0x00, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xBE,0x8F, -0x2C,0x00,0xB7,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x00,0x00,0xA7,0xAE, -0x21,0x20,0x00,0x00, -0x25,0xB0,0x08,0x3C, -0x07,0x10,0x92,0x00, -0x01,0x00,0x42,0x30, -0x01,0x00,0x84,0x24, -0x02,0x00,0x40,0x10, -0x03,0x00,0x85,0x2C, -0xD0,0x01,0x07,0xAD, -0xF9,0xFF,0xA0,0x14, -0x04,0x00,0x08,0x25, -0xB6,0x0F,0x00,0x08, -0x21,0x28,0x20,0x01, -0x0D,0x00,0xC0,0x10, -0x00,0x00,0x00,0x00, -0xB5,0x0F,0x00,0x08, -0x02,0x00,0x52,0x36, -0xC7,0xFF,0x20,0x15, -0x21,0x28,0x20,0x01, -0x0D,0x00,0xC0,0x10, -0x00,0x00,0x00,0x00, -0xB6,0x0F,0x00,0x08, -0x04,0x00,0x52,0x36, -0x06,0x00,0xC0,0x10, -0x00,0x00,0x00,0x00, -0xB5,0x0F,0x00,0x08, -0x01,0x00,0x52,0x36, -0x00,0x00,0xC7,0xAE, -0xB6,0x0F,0x00,0x08, -0x21,0x28,0x20,0x01, -0x00,0x00,0xE7,0xAE, -0xB6,0x0F,0x00,0x08, -0x21,0x28,0x20,0x01, -0x00,0x00,0xC7,0xAF, -0xB6,0x0F,0x00,0x08, -0x21,0x28,0x20,0x01, -0xC8,0xFF,0xBD,0x27, -0x1C,0x00,0xB1,0xAF, -0x02,0x80,0x02,0x3C, -0x21,0x88,0x80,0x00, -0x00,0x01,0x04,0x24, -0x30,0x00,0xB6,0xAF, -0x24,0x00,0xB3,0xAF, -0x34,0x00,0xBF,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x20,0x00,0xB2,0xAF, -0x18,0x00,0xB0,0xAF, -0x25,0x24,0x00,0x0C, -0x84,0x58,0x56,0x24, -0x74,0x00,0x40,0x10, -0x21,0x98,0x40,0x00, -0x08,0x00,0x50,0x94, -0x02,0x80,0x02,0x3C, -0x21,0x28,0x20,0x02, -0x25,0x80,0x02,0x02, -0x24,0x00,0x04,0x26, -0x20,0x00,0x00,0xA6, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x04,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x06,0x00,0x06,0x24, -0x30,0x00,0x04,0x26, -0x10,0x52,0x00,0x0C, -0x88,0x58,0xA5,0x24, -0x20,0x00,0x03,0x96, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x84,0x24, -0x03,0xFF,0x63,0x30, -0x50,0x00,0x63,0x34, -0x20,0x00,0x03,0xA6, -0xF8,0x1D,0x82,0x94, -0x20,0x00,0x12,0x26, -0x74,0x00,0xD1,0x26, -0xFF,0x0F,0x43,0x30, -0x00,0x19,0x03,0x00, -0x01,0x00,0x42,0x24, -0xF8,0x1D,0x82,0xA4, -0x02,0x2A,0x03,0x00, -0x20,0x00,0x02,0x24, -0x16,0x00,0x43,0xA2, -0x17,0x00,0x45,0xA2, -0x21,0x20,0x20,0x02, -0x17,0x4F,0x00,0x0C, -0x0C,0x00,0x62,0xAE, -0x40,0x00,0x12,0x26, -0x21,0x20,0x40,0x02, -0x21,0x28,0x40,0x00, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x0C,0x00,0x63,0x8E, -0x21,0x20,0x20,0x02, -0x42,0x00,0x12,0x26, -0x02,0x00,0x63,0x24, -0x32,0x4F,0x00,0x0C, -0x0C,0x00,0x63,0xAE, -0x21,0x28,0x40,0x00, -0x21,0x20,0x40,0x02, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x0C,0x00,0x63,0x8E, -0x44,0x00,0x04,0x26, -0x0C,0x00,0x75,0x26, -0x02,0x00,0x63,0x24, -0x0C,0x00,0x63,0xAE, -0x0C,0x00,0xC6,0x8E, -0x21,0x28,0x00,0x00, -0x10,0x00,0xC7,0x26, -0x60,0x00,0xD0,0x26, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB5,0xAF, -0x21,0x20,0x00,0x02, -0x37,0x50,0x00,0x0C, -0x21,0x90,0x40,0x00, -0x09,0x00,0x51,0x2C, -0x08,0x00,0x06,0x24, -0x21,0x20,0x40,0x02, -0x0B,0x30,0x51,0x00, -0x21,0x38,0x00,0x02, -0x01,0x00,0x05,0x24, -0x21,0xA0,0x40,0x00, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB5,0xAF, -0x21,0x20,0x40,0x00, -0x03,0x00,0x05,0x24, -0x01,0x00,0x06,0x24, -0x48,0x00,0xC7,0x26, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB5,0xAF, -0x0D,0x00,0x20,0x12, -0x21,0x20,0x60,0x02, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x01,0x00,0x05,0x24, -0x21,0x30,0x00,0x00, -0xB9,0x0C,0x00,0x08, -0x38,0x00,0xBD,0x27, -0xF8,0xFF,0x86,0x26, -0x21,0x20,0x40,0x00, -0x68,0x00,0xC7,0x26, -0x32,0x00,0x05,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB5,0xAF, -0x21,0x20,0x60,0x02, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x01,0x00,0x05,0x24, -0x21,0x30,0x00,0x00, -0xB9,0x0C,0x00,0x08, -0x38,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x98,0xE0,0x84,0x24, -0xAC,0xEA,0xA5,0x24, -0x2F,0x55,0x00,0x08, -0x38,0x00,0xBD,0x27, -0xB0,0xFF,0xBD,0x27, -0x50,0x00,0xA4,0xAF, -0xFC,0x01,0x04,0x24, -0x4C,0x00,0xBF,0xAF, -0x48,0x00,0xBE,0xAF, -0x44,0x00,0xB7,0xAF, -0x40,0x00,0xB6,0xAF, -0x3C,0x00,0xB5,0xAF, -0x38,0x00,0xB4,0xAF, -0x34,0x00,0xB3,0xAF, -0x30,0x00,0xB2,0xAF, -0x2C,0x00,0xB1,0xAF, -0x25,0x24,0x00,0x0C, -0x28,0x00,0xB0,0xAF, -0xE3,0x00,0x40,0x10, -0x1C,0x00,0xA2,0xAF, -0x50,0x00,0xA6,0x8F, -0x02,0x80,0x03,0x3C, -0xD0,0xEA,0x62,0x24, -0xD0,0xEA,0x68,0x90, -0x01,0x00,0x44,0x90, -0x02,0x00,0xC3,0x90, -0x02,0x00,0x45,0x90, -0x03,0x00,0x46,0x90, -0x1C,0x00,0xA2,0x8F, -0x00,0x22,0x04,0x00, -0x25,0x20,0x88,0x00, -0x08,0x00,0x47,0x94, -0x50,0x00,0xA2,0x8F, -0x00,0x2C,0x05,0x00, -0x0F,0x00,0x63,0x30, -0x00,0x00,0x48,0x8C, -0x02,0x80,0x02,0x3C, -0x25,0x38,0xE2,0x00, -0x50,0x00,0xA2,0x8F, -0x25,0x28,0xA4,0x00, -0x00,0x36,0x06,0x00, -0xC0,0x18,0x03,0x00, -0x21,0x18,0x62,0x00, -0x25,0x30,0xC5,0x00, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xA6,0xAF, -0xDD,0x5A,0x55,0x24, -0x22,0x00,0x66,0x24, -0x18,0x00,0x62,0x24, -0x28,0x00,0x76,0x24, -0x02,0x80,0x03,0x3C, -0x20,0x00,0xF7,0x24, -0xFF,0x3F,0x1E,0x31, -0x21,0x90,0x00,0x00, -0x30,0x1F,0x73,0x24, -0x01,0x00,0x14,0x24, -0x21,0x80,0x00,0x00, -0x24,0x00,0xA6,0xAF, -0xD0,0x10,0x00,0x08, -0x20,0x00,0xA2,0xAF, -0x39,0x52,0x00,0x0C, -0x07,0x00,0x10,0x26, -0x19,0x00,0x40,0x10, -0x40,0x00,0x43,0x2A, -0x0E,0x00,0x60,0x10, -0xE8,0xFF,0xC2,0x27, -0x21,0x88,0x13,0x02, -0xAC,0x3B,0x22,0x92, -0x01,0x00,0x52,0x26, -0x21,0x20,0x15,0x02, -0x21,0x28,0xC0,0x02, -0xF4,0xFF,0x54,0x10, -0x06,0x00,0x06,0x24, -0x21,0x20,0x15,0x02, -0x21,0x28,0xC0,0x02, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xAC,0x3B,0x34,0xA2, -0xE8,0xFF,0xC2,0x27, -0x69,0x01,0x43,0x28, -0x16,0x00,0x60,0x14, -0x18,0x00,0xA2,0xAF, -0x02,0x80,0x06,0x3C, -0x30,0x1F,0xC3,0x24, -0xA8,0x3B,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xA8,0x3B,0x62,0xAC, -0x1C,0x00,0xA4,0x8F, -0x3D,0x24,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x4C,0x00,0xBF,0x8F, -0x48,0x00,0xBE,0x8F, -0x44,0x00,0xB7,0x8F, -0x40,0x00,0xB6,0x8F, -0x3C,0x00,0xB5,0x8F, -0x38,0x00,0xB4,0x8F, -0x34,0x00,0xB3,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x50,0x00,0xBD,0x27, -0x21,0x20,0xE0,0x02, -0x21,0x28,0x00,0x00, -0xFF,0x51,0x00,0x0C, -0xDC,0x01,0x06,0x24, -0x20,0x00,0xA2,0x8F, -0x74,0x00,0xF4,0x26, -0x21,0x20,0x80,0x02, -0x18,0x00,0x45,0x24, -0x18,0x00,0xA2,0x8F, -0x80,0x00,0xF1,0x26, -0x74,0x00,0x42,0x24, -0x00,0x00,0xE2,0xAE, -0x18,0x00,0xA3,0x8F, -0x00,0x00,0x00,0x00, -0x21,0x30,0x60,0x00, -0x10,0x52,0x00,0x0C, -0x70,0x00,0xE3,0xAE, -0x70,0x00,0xE7,0x8E, -0x21,0x20,0x20,0x02, -0x21,0x28,0x00,0x00, -0xF4,0xFF,0xE7,0x24, -0x55,0x1D,0x00,0x0C, -0x18,0x00,0xA6,0x27, -0xD9,0xFF,0x40,0x10, -0x21,0x80,0x40,0x00, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x62,0x24, -0x74,0x3B,0x46,0x8C, -0x00,0x00,0x00,0x00, -0x0A,0x00,0xC0,0x18, -0x00,0x00,0x00,0x00, -0x18,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0xCF,0xFF,0xC2,0x14, -0x02,0x80,0x04,0x3C, -0xA8,0x5A,0x84,0x24, -0x39,0x52,0x00,0x0C, -0x02,0x00,0x05,0x26, -0xCA,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x01,0x00,0x06,0x92, -0x00,0x00,0x00,0x00, -0x77,0x00,0xC0,0x14, -0x10,0x00,0xE4,0x26, -0x0C,0x00,0xE0,0xAE, -0x50,0x00,0xA6,0x8F, -0x00,0x00,0x00,0x00, -0x02,0x00,0xC2,0x94, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x04,0x00,0x42,0x28, -0x68,0x00,0x40,0x10, -0x21,0x20,0xC0,0x00, -0x34,0x00,0xE0,0xAE, -0x60,0x00,0xF3,0x26, -0x21,0x20,0x60,0x02, -0x21,0x28,0x00,0x00, -0xFF,0x51,0x00,0x0C, -0x10,0x00,0x06,0x24, -0x70,0x00,0xE7,0x8E, -0x21,0x20,0x20,0x02, -0x01,0x00,0x05,0x24, -0xF4,0xFF,0xE7,0x24, -0x55,0x1D,0x00,0x0C, -0x18,0x00,0xA6,0x27, -0x06,0x00,0x40,0x10, -0x21,0x90,0x00,0x00, -0x18,0x00,0xA6,0x8F, -0x02,0x00,0x45,0x24, -0x10,0x52,0x00,0x0C, -0x21,0x20,0x60,0x02, -0x18,0x00,0xB2,0x8F, -0x70,0x00,0xE7,0x8E, -0x21,0x20,0x20,0x02, -0x32,0x00,0x05,0x24, -0xF4,0xFF,0xE7,0x24, -0x55,0x1D,0x00,0x0C, -0x18,0x00,0xA6,0x27, -0x05,0x00,0x40,0x10, -0x21,0x20,0xF2,0x02, -0x18,0x00,0xA6,0x8F, -0x60,0x00,0x84,0x24, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x45,0x24, -0x18,0x00,0xA5,0x8F, -0x21,0x20,0x60,0x02, -0x7D,0x50,0x00,0x0C, -0x21,0x28,0xB2,0x00, -0x21,0x18,0x40,0x00, -0x01,0x00,0x02,0x24, -0x3F,0x00,0x62,0x10, -0x03,0x00,0x02,0x24, -0x38,0x00,0xE2,0xAE, -0x70,0x00,0xE7,0x8E, -0x21,0x20,0x20,0x02, -0x03,0x00,0x05,0x24, -0xF4,0xFF,0xE7,0x24, -0x55,0x1D,0x00,0x0C, -0x18,0x00,0xA6,0x27, -0x48,0x00,0xE0,0xAE, -0x04,0x00,0x40,0x10, -0x3C,0x00,0xE0,0xAE, -0x02,0x00,0x42,0x90, -0x00,0x00,0x00,0x00, -0x48,0x00,0xE2,0xAE, -0x17,0x4F,0x00,0x0C, -0x21,0x20,0x80,0x02, -0x21,0x28,0x40,0x00, -0x40,0x00,0xE4,0x26, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x34,0x4F,0x00,0x0C, -0x21,0x20,0xE0,0x02, -0xFF,0xFF,0x50,0x30, -0x01,0x00,0x02,0x32, -0x22,0x00,0x40,0x10, -0x21,0x28,0xC0,0x02, -0x01,0x00,0x02,0x24, -0x5C,0x00,0xE2,0xAE, -0x24,0x00,0xA5,0x8F, -0x04,0x00,0xE4,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x10,0x00,0x02,0x32, -0x1B,0x00,0x40,0x10, -0x01,0x00,0x02,0x24, -0x30,0x00,0xE2,0xAE, -0x02,0x80,0x02,0x3C, -0x44,0x00,0xE0,0xAE, -0x30,0x1F,0x44,0x24, -0xA4,0x3B,0x82,0x8C, -0x1C,0x00,0xA6,0x8F, -0xDC,0x01,0x03,0x24, -0x01,0x00,0x42,0x24, -0xA4,0x3B,0x82,0xAC, -0x08,0x00,0x02,0x24, -0x0C,0x00,0xC3,0xAC, -0x14,0x00,0xC2,0xAC, -0x1C,0x00,0xA4,0x8F, -0x30,0x09,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xE9,0x10,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0xA4,0xE0,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0xBC,0xEA,0xA5,0x24, -0xE9,0x10,0x00,0x08, -0x00,0x00,0x00,0x00, -0x6D,0x11,0x00,0x08, -0x5C,0x00,0xE0,0xAE, -0x74,0x11,0x00,0x08, -0x30,0x00,0xE0,0xAE, -0x52,0x11,0x00,0x08, -0x38,0x00,0xE3,0xAE, -0xF7,0x19,0x00,0x0C, -0x18,0x00,0xC5,0x24, -0x4C,0x1A,0x00,0x0C, -0x21,0x20,0x40,0x00, -0x2B,0x11,0x00,0x08, -0x34,0x00,0xE2,0xAE, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x05,0x26, -0x01,0x00,0x03,0x92, -0x22,0x11,0x00,0x08, -0x0C,0x00,0xE3,0xAE, -0x02,0x80,0x04,0x3C, -0x84,0x58,0x84,0x24, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xBF,0xAF, -0x17,0x4F,0x00,0x0C, -0x74,0x00,0x84,0x24, -0x21,0x28,0x40,0x00, -0x10,0x00,0xA4,0x27, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x10,0x00,0xA2,0x97, -0x25,0xB0,0x04,0x3C, -0x94,0x00,0x85,0x34, -0x9A,0x00,0x87,0x34, -0x26,0xB0,0x06,0x3C, -0x00,0x08,0x03,0x24, -0x00,0x00,0xA2,0xA4, -0x0A,0x00,0x0B,0x24, -0x00,0x00,0xE3,0xA4, -0x98,0x00,0x88,0x34, -0x96,0x00,0x89,0x34, -0x7A,0x00,0xCA,0x34, -0x50,0x00,0x02,0x24, -0x04,0x00,0x03,0x24, -0x00,0x00,0x02,0xA5, -0x00,0x00,0x2B,0xA5, -0x00,0x00,0x43,0xA1, -0x10,0x00,0xA2,0x97, -0x89,0x00,0x83,0x34, -0x14,0x00,0x07,0x24, -0x40,0x11,0x02,0x00, -0xA0,0xFF,0x42,0x24, -0xFF,0xFF,0x42,0x30, -0x9C,0x00,0x85,0x34, -0x7C,0x00,0xC6,0x34, -0x00,0x00,0xC2,0xA4, -0x44,0x00,0x84,0x34, -0x00,0x00,0x67,0xA0, -0x00,0x00,0xAB,0xA0, -0x00,0x00,0x82,0x94, -0xFF,0xFD,0x03,0x24, -0x18,0x00,0xBF,0x8F, -0x24,0x10,0x43,0x00, -0x00,0x00,0x82,0xA4, -0x00,0x00,0x83,0x94, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x00,0x02,0x63,0x34, -0x20,0x00,0xBD,0x27, -0x8E,0x3E,0x40,0xA0, -0x00,0x00,0x83,0xA4, -0x08,0x00,0xE0,0x03, -0x0C,0x3E,0x47,0xA0, -0xD8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x10,0x3C, -0x84,0x58,0x04,0x26, -0x24,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x34,0x4F,0x00,0x0C, -0x18,0x00,0xB2,0xAF, -0xFF,0xFF,0x51,0x30, -0x84,0x58,0x04,0x26, -0x19,0x4F,0x00,0x0C, -0x02,0x80,0x10,0x3C, -0x30,0x1F,0x03,0x26, -0x01,0x00,0x24,0x32, -0x08,0x3E,0x62,0xA4, -0x03,0x00,0x80,0x14, -0x02,0x00,0x05,0x24, -0x40,0x10,0x11,0x00, -0x04,0x00,0x45,0x30, -0x02,0x00,0x02,0x24, -0x59,0x00,0xA2,0x10, -0x30,0x1F,0x02,0x26, -0x0F,0x00,0x80,0x10, -0x02,0x00,0x03,0x24, -0x04,0x00,0x02,0x24, -0x11,0x00,0x62,0x10, -0x30,0x1F,0x13,0x26, -0x02,0x80,0x04,0x3C, -0x21,0x28,0x20,0x02, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x18,0xE1,0x84,0x24, -0x2F,0x55,0x00,0x08, -0x28,0x00,0xBD,0x27, -0x40,0x10,0x11,0x00, -0x04,0x00,0x43,0x30, -0x04,0x00,0x02,0x24, -0xF1,0xFF,0x62,0x14, -0x30,0x1F,0x13,0x26, -0x08,0x3E,0x66,0x96, -0x30,0x3B,0x65,0x92, -0x02,0x80,0x04,0x3C, -0xB0,0x1B,0x63,0xA6, -0xD4,0xE0,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x25,0xB0,0x10,0x3C, -0x50,0x02,0x03,0x36, -0x0F,0x00,0x02,0x24, -0x00,0x00,0x62,0xA0, -0x21,0x28,0x00,0x00, -0x12,0x0D,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x30,0x3B,0x64,0x92, -0x01,0x00,0x14,0x24, -0x4F,0x0C,0x00,0x0C, -0x4C,0x00,0x10,0x36, -0x02,0x80,0x11,0x3C, -0x00,0x00,0x14,0xA2, -0x21,0x0E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x37,0x50,0x00,0x0C, -0xE4,0x58,0x24,0x26, -0x21,0x28,0x40,0x00, -0xE4,0x58,0x24,0x26, -0x7D,0x50,0x00,0x0C, -0x21,0x90,0x40,0x00, -0x0F,0x00,0x50,0x30, -0xE4,0x58,0x24,0x26, -0x96,0x50,0x00,0x0C, -0x21,0x28,0x40,0x02, -0x40,0x02,0x10,0x36, -0x02,0x80,0x04,0x3C, -0x21,0x88,0x40,0x00, -0x21,0x30,0x40,0x00, -0x21,0x28,0x00,0x02, -0x2F,0x55,0x00,0x0C, -0x04,0xE1,0x84,0x24, -0x21,0x20,0x00,0x02, -0xC1,0x5B,0x00,0x0C, -0x21,0x28,0x20,0x02, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0xF3,0x3D,0x84,0x24, -0x88,0x58,0xA5,0x24, -0x06,0x00,0x06,0x24, -0x10,0x52,0x00,0x0C, -0xC2,0x1E,0x74,0xA2, -0x0F,0x48,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x9C,0x11,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xB0,0x1B,0x62,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x34, -0x53,0x1E,0x00,0x0C, -0xB0,0x1B,0x62,0xA6, -0xEC,0x38,0x62,0xAE, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x04,0x24, -0x48,0x0E,0x00,0x08, -0x28,0x00,0xBD,0x27, -0x78,0x3D,0x44,0x8C, -0x01,0x20,0x03,0x24, -0xB0,0x1B,0x43,0xA4, -0x02,0x00,0x85,0x10, -0x0C,0x00,0x03,0x24, -0x0F,0x00,0x03,0x24, -0x25,0xB0,0x02,0x3C, -0x50,0x02,0x42,0x34, -0x00,0x00,0x43,0xA0, -0x30,0x1F,0x10,0x26, -0xB0,0x1B,0x02,0x96, -0x08,0x3E,0x06,0x96, -0x30,0x3B,0x05,0x92, -0x10,0x00,0x42,0x34, -0x02,0x80,0x04,0x3C, -0xB0,0x1B,0x02,0xA6, -0x2F,0x55,0x00,0x0C, -0xB0,0xE0,0x84,0x24, -0x21,0x28,0x00,0x00, -0x12,0x0D,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x30,0x3B,0x04,0x92, -0x4F,0x0C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x53,0x1E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEC,0x38,0x02,0xAE, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x65,0x24, -0x50,0x3E,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x1F,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x0A,0x3E,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x42,0x2C, -0x1A,0x00,0x40,0x10, -0x21,0x38,0xA0,0x00, -0x98,0x3E,0xA4,0x8C, -0x94,0x3E,0xA5,0x8C, -0x21,0x30,0x00,0x00, -0x80,0x10,0x04,0x00, -0x80,0x18,0x05,0x00, -0x2B,0x10,0x45,0x00, -0x04,0x00,0x40,0x14, -0x2B,0x18,0x64,0x00, -0x01,0x00,0x06,0x24, -0x02,0x00,0x02,0x24, -0x0A,0x30,0x43,0x00, -0x0A,0x3E,0xE2,0x90, -0x94,0x3E,0xE0,0xAC, -0x98,0x3E,0xE0,0xAC, -0x40,0x18,0x02,0x00, -0x21,0x18,0x62,0x00, -0x21,0x18,0x66,0x00, -0x02,0x80,0x02,0x3C, -0x48,0xDD,0x42,0x24, -0x80,0x18,0x03,0x00, -0x21,0x18,0x62,0x00, -0x00,0x00,0x64,0x8C, -0x25,0xB0,0x02,0x3C, -0xD8,0x01,0x42,0x34, -0x00,0x00,0x44,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x21,0x80,0x80,0x00, -0x02,0x00,0x84,0x90, -0x02,0x80,0x05,0x3C, -0x18,0x3B,0xA5,0x24, -0x0F,0x00,0x84,0x30, -0xC0,0x20,0x04,0x00, -0x21,0x20,0x90,0x00, -0x1C,0x00,0x84,0x24, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x06,0x00,0x40,0x10, -0x21,0x20,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x92,0x10,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x80,0xFF,0xBD,0x27, -0x02,0x80,0x06,0x3C, -0x02,0x80,0x08,0x3C, -0x78,0x00,0xBE,0xAF, -0x7C,0x00,0xBF,0xAF, -0x74,0x00,0xB7,0xAF, -0x70,0x00,0xB6,0xAF, -0x6C,0x00,0xB5,0xAF, -0x68,0x00,0xB4,0xAF, -0x64,0x00,0xB3,0xAF, -0x60,0x00,0xB2,0xAF, -0x5C,0x00,0xB1,0xAF, -0x58,0x00,0xB0,0xAF, -0xD0,0xEA,0xC2,0x24, -0xE4,0xEA,0x03,0x25, -0x01,0x00,0x44,0x90, -0x01,0x00,0x65,0x90, -0xD0,0xEA,0xCB,0x90, -0xE4,0xEA,0x0A,0x91, -0x02,0x00,0x47,0x90, -0x02,0x00,0x66,0x90, -0x03,0x00,0x48,0x90, -0x03,0x00,0x69,0x90, -0x00,0x22,0x04,0x00, -0x00,0x2A,0x05,0x00, -0x25,0x20,0x8B,0x00, -0x25,0x28,0xAA,0x00, -0x00,0x3C,0x07,0x00, -0x00,0x34,0x06,0x00, -0x25,0x38,0xE4,0x00, -0x25,0x30,0xC5,0x00, -0x00,0x46,0x08,0x00, -0x00,0x4E,0x09,0x00, -0x25,0x40,0x07,0x01, -0x25,0x48,0x26,0x01, -0x00,0x02,0x04,0x24, -0x40,0x00,0xA8,0xAF, -0x25,0x24,0x00,0x0C, -0x48,0x00,0xA9,0xAF, -0xB0,0x01,0x40,0x10, -0x21,0xF0,0x40,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x52,0x24, -0xC4,0x39,0x45,0x8E, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x34,0xE1,0x84,0x24, -0x08,0x00,0xD1,0x97, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x10,0x3C, -0x25,0x88,0x22,0x02, -0x88,0x58,0x10,0x26, -0x24,0x00,0x24,0x26, -0x21,0x28,0x00,0x02, -0x20,0x00,0x20,0xA6, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x24,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x21,0x28,0x00,0x02, -0x06,0x00,0x06,0x24, -0x10,0x52,0x00,0x0C, -0x30,0x00,0x24,0x26, -0x18,0x00,0x03,0x24, -0x0C,0x00,0xC3,0xAF, -0xF8,0x1D,0x42,0x96, -0x20,0x00,0x25,0x26, -0x38,0x00,0x37,0x26, -0xFF,0x0F,0x43,0x30, -0x00,0x19,0x03,0x00, -0x02,0x22,0x03,0x00, -0x01,0x00,0x42,0x24, -0xF8,0x1D,0x42,0xA6, -0x17,0x00,0xA4,0xA0, -0x02,0x80,0x04,0x3C, -0x16,0x00,0xA3,0xA0, -0x32,0x4F,0x00,0x0C, -0xF8,0x58,0x84,0x24, -0x21,0x28,0x40,0x00, -0x21,0x20,0xE0,0x02, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x3A,0x00,0x24,0x26, -0x18,0x00,0xA5,0x27, -0x02,0x00,0x06,0x24, -0x03,0x00,0x02,0x24, -0x10,0x52,0x00,0x0C, -0x18,0x00,0xA2,0xA7, -0x0C,0x00,0xC3,0x8F, -0x02,0x80,0x07,0x3C, -0x3C,0x00,0x24,0x26, -0x04,0x00,0x63,0x24, -0x0C,0x00,0xC3,0xAF, -0x60,0x39,0x46,0x8E, -0x0C,0x00,0xC2,0x27, -0x94,0x58,0xE7,0x24, -0x21,0x28,0x00,0x00, -0x54,0x00,0xA2,0xAF, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x20,0x00,0xA4,0x27, -0x50,0x00,0xA5,0x27, -0x21,0x50,0x00,0x0C, -0x21,0xB8,0x40,0x00, -0x50,0x00,0xA8,0x8F, -0x21,0x88,0x00,0x00, -0x52,0x00,0x00,0x11, -0x21,0x80,0x00,0x00, -0x21,0x38,0x40,0x02, -0x18,0x00,0xA9,0x27, -0x21,0x10,0x31,0x01, -0x08,0x00,0x46,0x90, -0x21,0x20,0x00,0x00, -0x7F,0x00,0xC5,0x30, -0x21,0x10,0x87,0x00, -0xB4,0x39,0x43,0x90, -0x01,0x00,0x84,0x24, -0x7F,0x00,0x63,0x30, -0x3D,0x00,0xA3,0x10, -0x0D,0x00,0x82,0x2C, -0xFA,0xFF,0x40,0x14, -0x21,0x10,0x87,0x00, -0x01,0x00,0x31,0x26, -0x2B,0x10,0x28,0x02, -0xF2,0xFF,0x40,0x14, -0x21,0x10,0x31,0x01, -0x09,0x00,0x02,0x2E, -0x3D,0x00,0x40,0x14, -0x21,0x20,0xE0,0x02, -0x54,0x00,0xA2,0x8F, -0x01,0x00,0x05,0x24, -0x08,0x00,0x06,0x24, -0x30,0x00,0xA7,0x27, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x21,0x20,0x40,0x00, -0x54,0x00,0xA2,0x8F, -0xF8,0xFF,0x06,0x26, -0x32,0x00,0x05,0x24, -0x38,0x00,0xA7,0x27, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x21,0xB8,0x40,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x44,0x24, -0x78,0x3D,0x83,0x8C, -0x02,0x00,0x02,0x24, -0x37,0x00,0x62,0x14, -0x00,0x00,0x00,0x00, -0xC4,0x39,0x83,0x8C, -0x0C,0x00,0x11,0x24, -0x2B,0x10,0x23,0x02, -0x32,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xF8,0x58,0x46,0x24, -0x21,0x20,0x60,0x00, -0x4D,0x13,0x00,0x08, -0x30,0x00,0x05,0x24, -0x01,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x21,0x10,0x51,0x00, -0x02,0x00,0x51,0x24, -0x2B,0x18,0x24,0x02, -0x27,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0x21,0x18,0x26,0x02, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0xF5,0xFF,0x45,0x14, -0x02,0x80,0x07,0x3C, -0x01,0x00,0x66,0x90, -0x54,0x00,0xA2,0x8F, -0xFA,0x58,0xE7,0x24, -0x21,0x20,0xE0,0x02, -0x21,0x38,0x27,0x02, -0x30,0x00,0x05,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x73,0x13,0x00,0x08, -0x21,0xB8,0x40,0x00, -0x21,0x10,0x30,0x01, -0x18,0x00,0x46,0xA0, -0x50,0x00,0xA8,0x8F, -0x01,0x00,0x31,0x26, -0x2B,0x10,0x28,0x02, -0xB4,0xFF,0x40,0x14, -0x01,0x00,0x10,0x26, -0x27,0x13,0x00,0x08, -0x09,0x00,0x02,0x2E, -0x54,0x00,0xA2,0x8F, -0x21,0x20,0xE0,0x02, -0x21,0x30,0x00,0x02, -0x01,0x00,0x05,0x24, -0x30,0x00,0xA7,0x27, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x21,0xB8,0x40,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x44,0x24, -0x78,0x3D,0x83,0x8C, -0x02,0x00,0x02,0x24, -0xCB,0xFF,0x62,0x10, -0x00,0x00,0x00,0x00, -0xD5,0x1D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x16,0x00,0x40,0x14, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x43,0x24, -0xC4,0x39,0x62,0x8C, -0x0C,0x00,0x11,0x24, -0x2B,0x10,0x22,0x02, -0x10,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xF8,0x58,0x52,0x24, -0x21,0x80,0x60,0x00, -0x02,0x80,0x13,0x3C, -0x21,0x20,0x32,0x02, -0x00,0x00,0x83,0x90, -0x2D,0x00,0x02,0x24, -0xCB,0x00,0x62,0x10, -0x02,0x80,0x05,0x3C, -0x01,0x00,0x82,0x90, -0xC4,0x39,0x03,0x8E, -0x21,0x10,0x51,0x00, -0x02,0x00,0x51,0x24, -0x2B,0x18,0x23,0x02, -0xF6,0xFF,0x60,0x14, -0x21,0x20,0x32,0x02, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x44,0x24, -0x78,0x3D,0x83,0x8C, -0x02,0x00,0x02,0x24, -0x82,0x00,0x62,0x10, -0x0C,0x00,0x11,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x43,0x24, -0xC4,0x39,0x62,0x8C, -0x0C,0x00,0x11,0x24, -0x2B,0x10,0x22,0x02, -0x26,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xF8,0x58,0x56,0x24, -0x21,0xA8,0x60,0x00, -0xDD,0x00,0x14,0x24, -0xA5,0x13,0x00,0x08, -0x02,0x80,0x13,0x3C, -0x01,0x00,0x02,0x92, -0xC4,0x39,0xA3,0x8E, -0x21,0x10,0x51,0x00, -0x02,0x00,0x51,0x24, -0x2B,0x18,0x23,0x02, -0x1B,0x00,0x60,0x10, -0x02,0x80,0x02,0x3C, -0x21,0x80,0x36,0x02, -0x00,0x00,0x02,0x92, -0x02,0x00,0x12,0x26, -0x21,0x20,0x40,0x02, -0xD0,0xDD,0x65,0x26, -0xF3,0xFF,0x54,0x14, -0x06,0x00,0x06,0x24, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEF,0xFF,0x40,0x14, -0x21,0x20,0xE0,0x02, -0x54,0x00,0xA2,0x8F, -0xDD,0x00,0x05,0x24, -0x21,0x38,0x40,0x02, -0x07,0x00,0x06,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x08,0x00,0x04,0x92, -0x21,0xB8,0x40,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x45,0x24, -0x01,0x00,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x0F,0x5F,0x44,0xA0, -0x10,0x3E,0xA3,0xAC, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x44,0x24, -0xC4,0x39,0x82,0x8C, -0x0C,0x00,0x11,0x24, -0x2B,0x10,0x22,0x02, -0x20,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xF8,0x58,0x56,0x24, -0xFA,0x58,0x75,0x24, -0x21,0xA0,0x80,0x00, -0xD2,0x13,0x00,0x08, -0xDD,0x00,0x13,0x24, -0x01,0x00,0x02,0x92, -0xC4,0x39,0x83,0x8E, -0x21,0x10,0x51,0x00, -0x02,0x00,0x51,0x24, -0x2B,0x18,0x23,0x02, -0x14,0x00,0x60,0x10, -0x02,0x80,0x02,0x3C, -0x21,0x80,0x36,0x02, -0x00,0x00,0x02,0x92, -0x21,0x90,0x35,0x02, -0x21,0x20,0x40,0x02, -0x48,0x00,0xA5,0x27, -0xF3,0xFF,0x53,0x14, -0x04,0x00,0x06,0x24, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEF,0xFF,0x40,0x14, -0x21,0x20,0xE0,0x02, -0x01,0x00,0x06,0x92, -0x54,0x00,0xA2,0x8F, -0x21,0x38,0x40,0x02, -0xDD,0x00,0x05,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x21,0xB8,0x40,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x50,0x24, -0x0A,0x3E,0x02,0x92, -0x50,0x3E,0x03,0x8E, -0x05,0x00,0x42,0x38, -0x01,0x00,0x63,0x38, -0x01,0x00,0x42,0x2C, -0x01,0x00,0x63,0x2C, -0x24,0x10,0x43,0x00, -0x58,0x00,0x40,0x14, -0x02,0x80,0x07,0x3C, -0xC4,0x39,0x05,0x8E, -0x0C,0x00,0x11,0x24, -0x2B,0x10,0x25,0x02, -0x0F,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xF8,0x58,0x46,0x24, -0x44,0x00,0x04,0x24, -0x21,0x80,0x26,0x02, -0x00,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0x3E,0x00,0x44,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0x21,0x10,0x51,0x00, -0x02,0x00,0x51,0x24, -0x2B,0x18,0x25,0x02, -0xF6,0xFF,0x60,0x14, -0x21,0x80,0x26,0x02, -0x21,0x20,0xC0,0x03, -0x21,0x28,0x00,0x00, -0xB9,0x0C,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x21,0x10,0x00,0x00, -0x7C,0x00,0xBF,0x8F, -0x78,0x00,0xBE,0x8F, -0x74,0x00,0xB7,0x8F, -0x70,0x00,0xB6,0x8F, -0x6C,0x00,0xB5,0x8F, -0x68,0x00,0xB4,0x8F, -0x64,0x00,0xB3,0x8F, -0x60,0x00,0xB2,0x8F, -0x5C,0x00,0xB1,0x8F, -0x58,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x80,0x00,0xBD,0x27, -0xC4,0x39,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x22,0x02, -0x7B,0xFF,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xF8,0x58,0x56,0x24, -0xFA,0x58,0x75,0x24, -0x21,0xA0,0x80,0x00, -0x25,0x14,0x00,0x08, -0xDD,0x00,0x13,0x24, -0x01,0x00,0x02,0x92, -0xC4,0x39,0x83,0x8E, -0x21,0x10,0x51,0x00, -0x02,0x00,0x51,0x24, -0x2B,0x18,0x23,0x02, -0x6F,0xFF,0x60,0x10, -0x02,0x80,0x02,0x3C, -0x21,0x80,0x36,0x02, -0x00,0x00,0x02,0x92, -0x21,0x90,0x35,0x02, -0x21,0x20,0x40,0x02, -0x40,0x00,0xA5,0x27, -0xF3,0xFF,0x53,0x14, -0x04,0x00,0x06,0x24, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEF,0xFF,0x40,0x14, -0x21,0x20,0xE0,0x02, -0x01,0x00,0x06,0x92, -0x54,0x00,0xA2,0x8F, -0x21,0x38,0x40,0x02, -0xDD,0x00,0x05,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x92,0x13,0x00,0x08, -0x21,0xB8,0x40,0x00, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x48,0xE1,0x84,0x24, -0x01,0x00,0x06,0x92, -0x54,0x00,0xA2,0x8F, -0x02,0x80,0x07,0x3C, -0xFA,0x58,0xE7,0x24, -0x21,0x38,0x27,0x02, -0x21,0x20,0xE0,0x02, -0x44,0x00,0x05,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x03,0x14,0x00,0x08, -0x21,0x20,0xC0,0x03, -0x54,0x00,0xA2,0x8F, -0x21,0x20,0xE0,0x02, -0x9C,0xDD,0xE7,0x24, -0xDD,0x00,0x05,0x24, -0x06,0x00,0x06,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0xEF,0x13,0x00,0x08, -0x21,0xB8,0x40,0x00, -0x02,0x80,0x14,0x3C, -0xFA,0x58,0xA5,0x24, -0x21,0x28,0x25,0x02, -0x88,0x5D,0x84,0x26, -0x10,0x52,0x00,0x0C, -0x20,0x00,0x06,0x24, -0x02,0x80,0x03,0x3C, -0xF1,0x5D,0x62,0x90, -0x00,0x00,0x00,0x00, -0x1D,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x58,0x3E,0x02,0x96, -0x00,0x00,0x00,0x00, -0xBD,0xFF,0x42,0x30, -0x58,0x3E,0x02,0xA6, -0x02,0x80,0x02,0x3C, -0x58,0x3E,0x03,0x96, -0xDE,0x5D,0x44,0x90, -0x0C,0x00,0x63,0x34, -0x01,0x00,0x84,0x30, -0x15,0x00,0x80,0x10, -0x58,0x3E,0x03,0xA6, -0x02,0x80,0x05,0x3C, -0x8B,0x5D,0x64,0x26, -0x3C,0xE3,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x10,0x00,0x06,0x24, -0x21,0x10,0x32,0x02, -0x01,0x00,0x46,0x90, -0x54,0x00,0xA2,0x8F, -0x21,0x20,0xE0,0x02, -0x88,0x5D,0x87,0x26, -0x2D,0x00,0x05,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x21,0xB8,0x40,0x00, -0x01,0x00,0x02,0x24, -0x8C,0x13,0x00,0x08, -0x50,0x3E,0x02,0xAE, -0x58,0x3E,0x02,0x96, -0x5D,0x14,0x00,0x08, -0x02,0x00,0x42,0x34, -0x02,0x80,0x05,0x3C, -0x8B,0x5D,0x64,0x26, -0x68,0x14,0x00,0x08, -0x4C,0xE3,0xA5,0x24, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x28,0xE1,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0xD4,0xEA,0xA5,0x24, -0x07,0x14,0x00,0x08, -0xFF,0xFF,0x02,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0xB0,0x1B,0x43,0x94, -0xC8,0x00,0x04,0x24, -0xD0,0x38,0x44,0xAC, -0x9F,0xFE,0x63,0x30, -0x80,0x00,0x63,0x34, -0xB0,0x1B,0x43,0xA4, -0x6C,0x3D,0x40,0xAC, -0x70,0x3D,0x40,0xAC, -0xA5,0x12,0x00,0x08, -0xB4,0x38,0x40,0xAC, -0xD8,0xFF,0xBD,0x27, -0x28,0x00,0xA4,0xA3, -0x00,0x01,0x04,0x24, -0x18,0x00,0xB2,0xAF, -0x20,0x00,0xBF,0xAF, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x2C,0x00,0xA5,0xA3, -0x25,0x24,0x00,0x0C, -0x30,0x00,0xA6,0xA7, -0x94,0x00,0x40,0x10, -0x21,0x90,0x40,0x00, -0x30,0x00,0xA7,0x97, -0x28,0x00,0xA5,0x93, -0x2C,0x00,0xA6,0x93, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x68,0xE1,0x84,0x24, -0x08,0x00,0x50,0x96, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x11,0x3C, -0x25,0x80,0x02,0x02, -0x88,0x58,0x31,0x26, -0x21,0x28,0x20,0x02, -0x24,0x00,0x04,0x26, -0x06,0x00,0x06,0x24, -0x10,0x52,0x00,0x0C, -0x20,0x00,0x00,0xA6, -0x02,0x80,0x05,0x3C, -0x18,0x3B,0xA5,0x24, -0x2A,0x00,0x04,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x21,0x28,0x20,0x02, -0x30,0x00,0x04,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x20,0x00,0x03,0x96, -0x18,0x00,0x02,0x24, -0x20,0x00,0x05,0x26, -0x03,0xFF,0x63,0x30, -0xD0,0x00,0x63,0x34, -0x20,0x00,0x03,0xA6, -0x02,0x80,0x03,0x3C, -0x0C,0x00,0x42,0xAE, -0x30,0x1F,0x73,0x24, -0xF8,0x1D,0x62,0x96, -0x0C,0x00,0x51,0x26, -0x28,0x00,0xA6,0x27, -0xFF,0x0F,0x43,0x30, -0x00,0x19,0x03,0x00, -0x02,0x22,0x03,0x00, -0x01,0x00,0x42,0x24, -0xF8,0x1D,0x62,0xA6, -0x21,0x38,0x20,0x02, -0x16,0x00,0xA3,0xA0, -0x17,0x00,0xA4,0xA0, -0x38,0x00,0x04,0x26, -0x68,0x4F,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x21,0x20,0x40,0x00, -0x01,0x00,0x05,0x24, -0x2C,0x00,0xA6,0x27, -0x68,0x4F,0x00,0x0C, -0x21,0x38,0x20,0x02, -0x28,0x00,0xA3,0x93, -0x21,0x20,0x40,0x00, -0x03,0x00,0x02,0x24, -0x0C,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x21,0x20,0x40,0x02, -0x21,0x28,0x00,0x00, -0xB9,0x0C,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x2C,0x00,0xA3,0x93, -0x00,0x00,0x00,0x00, -0x2E,0x00,0x60,0x14, -0x01,0x00,0x02,0x24, -0x19,0x3E,0x63,0x92, -0x21,0x80,0x60,0x02, -0x01,0x00,0x68,0x24, -0xFF,0x00,0x02,0x31, -0xFD,0xFF,0x40,0x10, -0x21,0x18,0x00,0x01, -0x02,0x80,0x06,0x3C, -0x19,0x3E,0x08,0xA2, -0x21,0x38,0x20,0x02, -0x49,0x5D,0xC6,0x24, -0x68,0x4F,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x30,0x00,0xA3,0x97, -0x02,0x80,0x06,0x3C, -0x21,0x38,0x20,0x02, -0x0F,0x00,0x63,0x30, -0x80,0x18,0x03,0x00, -0x02,0x08,0x63,0x34, -0x1C,0x3E,0x03,0xA6, -0x4C,0x5D,0xC6,0x24, -0x21,0x20,0x40,0x00, -0x68,0x4F,0x00,0x0C, -0x02,0x00,0x05,0x24, -0x02,0x80,0x06,0x3C, -0x21,0x38,0x20,0x02, -0x4E,0x5D,0xC6,0x24, -0x21,0x20,0x40,0x00, -0x02,0x00,0x05,0x24, -0x68,0x4F,0x00,0x0C, -0x1E,0x3E,0x00,0xA6, -0x30,0x00,0xA3,0x97, -0x21,0x20,0x40,0x00, -0x02,0x80,0x06,0x3C, -0x07,0x00,0x63,0x30, -0x40,0x18,0x03,0x00, -0x21,0x18,0x70,0x00, -0xE8,0x1D,0x62,0x94, -0x50,0x5D,0xC6,0x24, -0x21,0x38,0x20,0x02, -0x00,0x11,0x02,0x00, -0x02,0x00,0x05,0x24, -0x68,0x4F,0x00,0x0C, -0x20,0x3E,0x02,0xA6, -0xD8,0x14,0x00,0x08, -0x21,0x20,0x40,0x02, -0xC3,0xFF,0x62,0x14, -0x02,0x80,0x06,0x3C, -0x21,0x38,0x20,0x02, -0x48,0x5D,0xC6,0x24, -0x68,0x4F,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x21,0x20,0x40,0x00, -0x30,0x00,0xA6,0x27, -0x21,0x38,0x20,0x02, -0x68,0x4F,0x00,0x0C, -0x02,0x00,0x05,0x24, -0x1C,0x3E,0x63,0x96, -0x02,0x80,0x06,0x3C, -0x21,0x38,0x20,0x02, -0x3F,0x00,0x63,0x30, -0x00,0x08,0x63,0x34, -0x21,0x20,0x40,0x00, -0x4C,0x5D,0xC6,0x24, -0x02,0x00,0x05,0x24, -0x68,0x4F,0x00,0x0C, -0x1C,0x3E,0x63,0xA6, -0x02,0x80,0x06,0x3C, -0x21,0x20,0x40,0x00, -0x4E,0x5D,0xC6,0x24, -0x21,0x38,0x20,0x02, -0x68,0x4F,0x00,0x0C, -0x02,0x00,0x05,0x24, -0xD8,0x14,0x00,0x08, -0x21,0x20,0x40,0x02, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x5C,0xE1,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0xE8,0xEA,0xA5,0x24, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x00,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0xE0,0xFF,0xBD,0x27, -0x18,0x03,0x42,0x34, -0xF0,0x54,0x63,0x24, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x00,0x00,0x43,0xAC, -0x02,0x00,0x82,0x90, -0x02,0x80,0x05,0x3C, -0x88,0x58,0xA5,0x24, -0x0F,0x00,0x42,0x30, -0xC0,0x10,0x02,0x00, -0x21,0x80,0x44,0x00, -0x28,0x00,0x04,0x26, -0x06,0x00,0x06,0x24, -0x39,0x52,0x00,0x0C, -0x18,0x00,0x11,0x26, -0x08,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x55,0x50,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x02,0x80,0x04,0x3C, -0x18,0x3B,0x84,0x24, -0x21,0x28,0x40,0x00, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xF1,0xFF,0x40,0x14, -0x03,0x00,0x02,0x24, -0x30,0x00,0x03,0x92, -0x00,0x00,0x00,0x00, -0xED,0xFF,0x62,0x14, -0x30,0x00,0x07,0x26, -0x02,0x80,0x06,0x3C, -0x30,0x1F,0xC8,0x24, -0x50,0x3E,0x02,0x8D, -0x00,0x00,0x00,0x00, -0xE7,0xFF,0x40,0x10, -0x01,0x00,0x05,0x24, -0x01,0x00,0xE3,0x90, -0x00,0x00,0x00,0x00, -0x1A,0x00,0x65,0x10, -0x02,0x00,0x62,0x28, -0x2E,0x00,0x40,0x14, -0x02,0x00,0x02,0x24, -0xDF,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x03,0x00,0xE3,0x90, -0x00,0x00,0x00,0x00, -0x08,0x00,0x62,0x30, -0x0A,0x00,0x40,0x14, -0x02,0x11,0x03,0x00, -0x1A,0x3E,0x03,0x91, -0x04,0x10,0x45,0x00, -0x27,0x10,0x02,0x00, -0x24,0x10,0x43,0x00, -0x1A,0x3E,0x02,0xA1, -0x05,0x00,0xE3,0x90, -0x04,0x00,0xE2,0x90, -0x00,0x1A,0x03,0x00, -0x25,0x90,0x62,0x00, -0x1A,0x3E,0x05,0x91, -0x02,0x80,0x04,0x3C, -0x94,0xE1,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x21,0x30,0x40,0x02, -0x52,0x15,0x00,0x08, -0x00,0x00,0x00,0x00, -0x04,0x00,0xE2,0x90, -0x03,0x00,0xE4,0x90, -0x05,0x00,0xE3,0x90, -0x00,0x12,0x02,0x00, -0x25,0x10,0x44,0x00, -0x82,0x18,0x03,0x00, -0x27,0x00,0x40,0x14, -0x07,0x00,0x64,0x30, -0x1A,0x3E,0x03,0x91, -0x04,0x10,0x85,0x00, -0x25,0x10,0x43,0x00, -0x1A,0x3E,0x02,0xA1, -0x30,0x1F,0xC2,0x24, -0x4C,0x3E,0x43,0x90, -0x1A,0x3E,0x45,0x90, -0x02,0x80,0x04,0x3C, -0x21,0x18,0x62,0x00, -0x84,0xE1,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x44,0x3E,0x60,0xA0, -0x52,0x15,0x00,0x08, -0x00,0x00,0x00,0x00, -0xB2,0xFF,0x60,0x14, -0x03,0x00,0x04,0x24, -0x02,0x00,0xE2,0x90, -0x01,0x00,0x05,0x24, -0x18,0x3E,0x02,0xA1, -0x04,0x00,0xE3,0x90, -0x03,0x00,0xE2,0x90, -0x21,0x30,0x00,0x00, -0x00,0x1A,0x03,0x00, -0x25,0x18,0x62,0x00, -0x1C,0x3E,0x03,0xA5, -0x06,0x00,0xE2,0x90, -0x05,0x00,0xE3,0x90, -0x00,0x12,0x02,0x00, -0x25,0x10,0x43,0x00, -0x1E,0x3E,0x02,0xA5, -0x08,0x00,0xE3,0x90, -0x07,0x00,0xE2,0x90, -0x00,0x1A,0x03,0x00, -0x25,0x18,0x62,0x00, -0x90,0x14,0x00,0x0C, -0x20,0x3E,0x03,0xA5, -0x52,0x15,0x00,0x08, -0x00,0x00,0x00,0x00, -0x1A,0x3E,0x03,0x91, -0x04,0x10,0x85,0x00, -0x27,0x10,0x02,0x00, -0x94,0x15,0x00,0x08, -0x24,0x10,0x43,0x00, -0xC0,0xFF,0xBD,0x27, -0x34,0x00,0xB5,0xAF, -0xFF,0xFF,0x95,0x30, -0x00,0x01,0x04,0x24, -0x38,0x00,0xB6,0xAF, -0x28,0x00,0xB2,0xAF, -0x3C,0x00,0xBF,0xAF, -0x30,0x00,0xB4,0xAF, -0x2C,0x00,0xB3,0xAF, -0x24,0x00,0xB1,0xAF, -0x25,0x24,0x00,0x0C, -0x20,0x00,0xB0,0xAF, -0x21,0x90,0x40,0x00, -0x7A,0x00,0x40,0x10, -0x21,0xB0,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0xB0,0xE1,0x84,0x24, -0x08,0x00,0x50,0x96, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x11,0x3C, -0x25,0x80,0x02,0x02, -0x88,0x58,0x31,0x26, -0x24,0x00,0x04,0x26, -0x21,0x28,0x20,0x02, -0x20,0x00,0x00,0xA6, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x04,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x30,0x00,0x04,0x26, -0x21,0x28,0x20,0x02, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x20,0x00,0x03,0x96, -0x18,0x00,0x02,0x24, -0x02,0x80,0x13,0x3C, -0x03,0xFF,0x63,0x30, -0xB0,0x00,0x63,0x34, -0x20,0x00,0x03,0xA6, -0x30,0x1F,0x68,0x26, -0x0C,0x00,0x42,0xAE, -0xF8,0x1D,0x02,0x95, -0x20,0x00,0x14,0x26, -0x0C,0x00,0x51,0x26, -0xFF,0x0F,0x43,0x30, -0x00,0x19,0x03,0x00, -0x02,0x22,0x03,0x00, -0x01,0x00,0x42,0x24, -0xF8,0x1D,0x02,0xA5, -0x17,0x00,0x84,0xA2, -0x16,0x00,0x83,0xA2, -0x74,0x3D,0x04,0x8D, -0x03,0x00,0x02,0x24, -0x3C,0x00,0x82,0x10, -0x38,0x00,0x10,0x26, -0x30,0x1F,0x73,0x26, -0x78,0x3D,0x62,0x8E, -0x21,0x20,0x00,0x02, -0x02,0x00,0x05,0x24, -0x01,0x00,0x42,0x38, -0x01,0x00,0x42,0x2C, -0x18,0x00,0xA6,0x27, -0x21,0x38,0x20,0x02, -0x68,0x4F,0x00,0x0C, -0x18,0x00,0xA2,0xA7, -0x74,0x3D,0x63,0x8E, -0x21,0x20,0x40,0x00, -0x02,0x00,0x05,0x24, -0x18,0x00,0xA6,0x27, -0x21,0x38,0x20,0x02, -0x68,0x4F,0x00,0x0C, -0x18,0x00,0xA3,0xA7, -0x21,0x20,0x40,0x00, -0x02,0x00,0x05,0x24, -0x18,0x00,0xA6,0x27, -0x21,0x38,0x20,0x02, -0x68,0x4F,0x00,0x0C, -0x18,0x00,0xB5,0xA7, -0x74,0x3D,0x63,0x8E, -0x21,0x80,0x40,0x00, -0x03,0x00,0x02,0x24, -0x0F,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x21,0x20,0x40,0x02, -0x21,0x30,0xC0,0x02, -0xB9,0x0C,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xB6,0x8F, -0x34,0x00,0xB5,0x8F, -0x30,0x00,0xB4,0x8F, -0x2C,0x00,0xB3,0x8F, -0x28,0x00,0xB2,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x40,0x00,0xBD,0x27, -0xB0,0x1B,0x62,0x96, -0x00,0x00,0x00,0x00, -0x40,0x00,0x42,0x30, -0xEF,0xFF,0x40,0x10, -0x21,0x20,0x40,0x02, -0x02,0x80,0x07,0x3C, -0x21,0x20,0x00,0x02, -0xB8,0x5C,0xE7,0x24, -0x10,0x00,0x05,0x24, -0x80,0x00,0x06,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB1,0xAF, -0x00,0x00,0x83,0x96, -0x01,0x00,0x16,0x24, -0x00,0x40,0x63,0x34, -0x13,0x16,0x00,0x08, -0x00,0x00,0x83,0xA6, -0xB0,0x1B,0x02,0x95, -0x00,0x00,0x00,0x00, -0x40,0x00,0x42,0x30, -0xC1,0xFF,0x40,0x10, -0x21,0x20,0x00,0x02, -0x80,0x3D,0x03,0x8D, -0x84,0x3D,0x02,0x8D, -0x80,0x1F,0x03,0x00, -0x25,0x18,0x43,0x00, -0x04,0x00,0x05,0x24, -0x01,0x00,0x42,0x24, -0x1C,0x00,0xA6,0x27, -0x21,0x38,0x20,0x02, -0x84,0x3D,0x02,0xAD, -0x68,0x4F,0x00,0x0C, -0x1C,0x00,0xA3,0xAF, -0xF7,0x15,0x00,0x08, -0x21,0x80,0x40,0x00, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0xA4,0xE1,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0xF8,0xEA,0xA5,0x24, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xB6,0x8F, -0x34,0x00,0xB5,0x8F, -0x30,0x00,0xB4,0x8F, -0x2C,0x00,0xB3,0x8F, -0x28,0x00,0xB2,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x40,0x00,0xBD,0x27, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x63,0x24, -0xB0,0x1B,0x62,0x94, -0x01,0x00,0x05,0x24, -0x21,0x20,0x00,0x00, -0xEF,0xFF,0x42,0x30, -0x20,0x00,0x42,0x34, -0xB0,0x1B,0x62,0xA4, -0xC8,0x00,0x02,0x24, -0x74,0x3D,0x65,0xAC, -0xB4,0x38,0x62,0xAC, -0xD0,0x38,0x60,0xAC, -0x6C,0x3D,0x60,0xAC, -0xBC,0x15,0x00,0x08, -0x70,0x3D,0x60,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xA8,0xFF,0xBD,0x27, -0x50,0x00,0xBE,0xAF, -0x40,0x00,0xB4,0xAF, -0x3C,0x00,0xB3,0xAF, -0x54,0x00,0xBF,0xAF, -0x4C,0x00,0xB7,0xAF, -0x48,0x00,0xB6,0xAF, -0x44,0x00,0xB5,0xAF, -0x38,0x00,0xB2,0xAF, -0x34,0x00,0xB1,0xAF, -0x30,0x00,0xB0,0xAF, -0x21,0xA0,0x80,0x00, -0x02,0x00,0x84,0x90, -0x21,0xF0,0x00,0x00, -0x24,0x00,0xA0,0xAF, -0x0F,0x00,0x84,0x30, -0xC0,0x20,0x04,0x00, -0x21,0x20,0x94,0x00, -0x18,0x00,0x93,0x24, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x15,0x3C, -0x28,0x00,0x84,0x24, -0x88,0x58,0xA5,0x26, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x0F,0x00,0x40,0x14, -0x02,0x80,0x16,0x3C, -0xF4,0x5E,0xC2,0x92, -0x00,0x00,0x00,0x00, -0x29,0x00,0x40,0x14, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0xC2,0x92, -0x00,0x00,0x00,0x00, -0x07,0x00,0x40,0x14, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x50,0x24, -0xB0,0x1B,0x02,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x3C,0x01,0x40,0x14, -0x05,0x00,0x05,0x24, -0x00,0x60,0x92,0x40, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x70,0x24, -0xB0,0x1B,0x03,0x96, -0x00,0x00,0x00,0x00, -0x00,0x10,0x62,0x30, -0x24,0x01,0x40,0x14, -0x10,0x00,0x62,0x30, -0xCB,0x00,0x40,0x14, -0x10,0x00,0x64,0x26, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x92,0x24, -0xB0,0x1B,0x42,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x4E,0x01,0x40,0x14, -0x21,0x18,0x00,0x00, -0x54,0x00,0xBF,0x8F, -0x50,0x00,0xBE,0x8F, -0x4C,0x00,0xB7,0x8F, -0x48,0x00,0xB6,0x8F, -0x44,0x00,0xB5,0x8F, -0x40,0x00,0xB4,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x58,0x00,0xBD,0x27, -0x30,0x1F,0x43,0x24, -0xB0,0x1B,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0xD3,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x6C,0x3B,0x62,0x8C, -0x00,0x00,0x00,0x00, -0xCF,0xFF,0x40,0x14, -0x02,0x80,0x0B,0x3C, -0x15,0x5F,0x62,0x91, -0x00,0x00,0x00,0x00, -0x55,0x01,0x40,0x14, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xFA,0x5E,0x40,0xA0, -0x1C,0x5F,0x60,0xAC, -0x02,0x80,0x03,0x3C, -0x0E,0x5F,0x62,0x90, -0xFD,0xFF,0x03,0x24, -0x02,0x80,0x04,0x3C, -0x24,0x10,0x43,0x00, -0x0E,0x5F,0x82,0xA0, -0x42,0xB0,0x17,0x3C, -0x00,0x00,0xE3,0x92, -0xEF,0xFF,0x02,0x24, -0x03,0x00,0xE4,0x36, -0x24,0x18,0x62,0x00, -0x40,0x00,0x02,0x24, -0x00,0x00,0xE3,0xA2, -0x00,0x00,0x82,0xA0, -0x02,0x80,0x04,0x3C, -0xFC,0x5E,0x82,0x94, -0x20,0x00,0x63,0x96, -0xFF,0xFF,0x42,0x30, -0x0A,0x00,0x43,0x10, -0x02,0x80,0x07,0x3C, -0x25,0xB0,0x02,0x3C, -0x94,0x00,0x42,0x34, -0xFC,0x5E,0x83,0xA4, -0x00,0x00,0x43,0xA4, -0xFC,0x5E,0x83,0x94, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x63,0x30, -0x80,0x1A,0x03,0x00, -0x00,0x5F,0xE3,0xAC, -0x25,0xB0,0x04,0x3C, -0x84,0x00,0x82,0x34, -0x00,0x00,0x50,0x8C, -0x80,0x00,0x84,0x34, -0x00,0x00,0x82,0x8C, -0x21,0x18,0x00,0x00, -0x00,0x5F,0xE6,0x8C, -0x00,0x88,0x10,0x00, -0x21,0x80,0x00,0x00, -0x25,0x80,0x02,0x02, -0x25,0x88,0x23,0x02, -0x21,0x20,0x00,0x02, -0x21,0x28,0x20,0x02, -0x28,0x00,0xA7,0xAF, -0xBA,0x34,0x00,0x0C, -0x2C,0x00,0xAB,0xAF, -0x28,0x00,0xA7,0x8F, -0x02,0x80,0x0A,0x3C, -0x21,0x28,0x00,0x00, -0x00,0x5F,0xE8,0x8C, -0x04,0x5F,0x43,0x95, -0x21,0x28,0xB1,0x00, -0x23,0x48,0x02,0x01, -0x21,0x20,0x30,0x01, -0x2B,0x10,0x90,0x00, -0xFF,0xFF,0x63,0x30, -0x80,0x1A,0x03,0x00, -0x21,0x28,0xA2,0x00, -0x21,0x38,0x00,0x00, -0x2B,0x40,0x83,0x00, -0x23,0x28,0xA7,0x00, -0x23,0x20,0x83,0x00, -0x23,0x28,0xA8,0x00, -0x02,0x80,0x03,0x3C, -0x20,0x5F,0x64,0xAC, -0x24,0x5F,0x65,0xAC, -0x04,0x5F,0x42,0x95, -0x2C,0x00,0xAB,0x8F, -0xFF,0xFF,0x42,0x30, -0x80,0x12,0x02,0x00, -0x2B,0x10,0x49,0x00, -0x31,0x01,0x40,0x10, -0x00,0x00,0x00,0x00, -0x04,0x5F,0x42,0x95, -0x00,0x00,0xE4,0x92, -0xFB,0xFF,0x03,0x24, -0xFF,0xFF,0x42,0x30, -0x80,0x12,0x02,0x00, -0x24,0x20,0x83,0x00, -0x23,0x48,0x22,0x01, -0x00,0x00,0xE4,0xA2, -0x01,0x00,0x06,0x24, -0x04,0x00,0x20,0x11, -0x01,0x00,0x04,0x24, -0x80,0x10,0x09,0x00, -0x21,0x10,0x49,0x00, -0x80,0x30,0x02,0x00, -0x8C,0x23,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x42,0xB0,0x02,0x3C, -0x22,0x00,0x03,0x24, -0x03,0x00,0x42,0x34, -0x00,0x00,0x43,0xA0, -0x00,0x00,0x87,0x8E, -0x05,0x00,0x05,0x24, -0x24,0x00,0x64,0x26, -0xFF,0x3F,0xE7,0x30, -0xDC,0xFF,0xE7,0x24, -0x55,0x1D,0x00,0x0C, -0x20,0x00,0xA6,0x27, -0x2E,0x00,0x40,0x10, -0x21,0x28,0x40,0x00, -0xF4,0x5E,0xC2,0x92, -0x02,0x00,0x03,0x24, -0xFF,0x00,0x42,0x30, -0x45,0x01,0x43,0x10, -0x02,0x80,0x07,0x3C, -0x02,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x08,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x04,0x00,0xA3,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x62,0x30, -0x04,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x01,0x00,0x1E,0x24, -0x12,0x5F,0x5E,0xA0, -0x04,0x00,0xA3,0x90, -0x20,0x00,0xA7,0x8F, -0x00,0x00,0x00,0x00, -0x04,0x00,0xE2,0x28, -0x18,0x00,0x40,0x14, -0xFE,0x00,0x66,0x30, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x43,0x24, -0x50,0x39,0x64,0x94, -0xC0,0x10,0x06,0x00, -0x2A,0x10,0x82,0x00, -0x12,0x00,0x40,0x14, -0x02,0x80,0x03,0x3C, -0x21,0x10,0xC7,0x00, -0xFD,0xFF,0x42,0x24, -0xC0,0x10,0x02,0x00, -0x2A,0x10,0x44,0x00, -0x0C,0x00,0x40,0x14, -0xC2,0x10,0x04,0x00, -0x23,0x30,0x46,0x00, -0x21,0x18,0xA6,0x00, -0x05,0x00,0x62,0x90, -0x07,0x00,0x84,0x30, -0x01,0x00,0x03,0x24, -0x07,0x10,0x82,0x00, -0x24,0x00,0xA4,0x8F, -0x01,0x00,0x42,0x30, -0x0B,0x20,0x62,0x00, -0x24,0x00,0xA4,0xAF, -0x02,0x80,0x03,0x3C, -0x0E,0x5F,0x62,0x90, -0xEF,0xFF,0x03,0x24, -0x02,0x80,0x04,0x3C, -0x24,0x10,0x43,0x00, -0x0E,0x5F,0x82,0xA0, -0xF4,0x5E,0xC3,0x92, -0x02,0x80,0x02,0x3C, -0x24,0xE9,0x42,0x24, -0xFF,0x00,0x63,0x30, -0x80,0x18,0x03,0x00, -0x21,0x18,0x62,0x00, -0x00,0x00,0x66,0x8C, -0x24,0x00,0xA5,0x8F, -0x09,0xF8,0xC0,0x00, -0x21,0x20,0xC0,0x03, -0x90,0x16,0x00,0x08, -0x00,0x00,0x00,0x00, -0x88,0x58,0xA5,0x26, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x33,0xFF,0x40,0x14, -0x02,0x80,0x04,0x3C, -0x06,0x00,0x02,0x24, -0x0A,0x3E,0x02,0xA2, -0xEC,0x38,0x00,0xAE, -0x00,0x00,0x84,0x8E, -0x0C,0x00,0x12,0x24, -0xFF,0x3F,0x82,0x30, -0xE8,0xFF,0x42,0x24, -0x2A,0x10,0x42,0x02, -0xA4,0x00,0x40,0x10, -0x21,0xA8,0x00,0x02, -0x7D,0x17,0x00,0x08, -0x21,0x80,0x72,0x02, -0x19,0x00,0x03,0x92, -0xFF,0x3F,0x82,0x30, -0xE8,0xFF,0x42,0x24, -0x21,0x18,0x72,0x00, -0x02,0x00,0x72,0x24, -0x2A,0x10,0x42,0x02, -0x9A,0x00,0x40,0x10, -0x21,0x80,0x72,0x02, -0x18,0x00,0x03,0x92, -0xDD,0x00,0x02,0x24, -0xF5,0xFF,0x62,0x14, -0x1A,0x00,0x11,0x26, -0x02,0x80,0x05,0x3C, -0xC4,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x20,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0xC0,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x1A,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0xBC,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x0F,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0xB8,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x09,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0xB4,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x03,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0xAC,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x64,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0xA8,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x57,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0xB0,0xDD,0xA5,0x24, -0x21,0x20,0x20,0x02, -0x39,0x52,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x4A,0x01,0x40,0x10, -0x02,0x80,0x05,0x3C, -0x21,0x20,0x20,0x02, -0x9C,0xDD,0xA5,0x24, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x3E,0x01,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x00,0x00,0x84,0x8E, -0x75,0x17,0x00,0x08, -0x00,0x00,0x00,0x00, -0x92,0x10,0x00,0x0C, -0x21,0x20,0x80,0x02, -0x21,0x18,0x00,0x00, -0x54,0x00,0xBF,0x8F, -0x50,0x00,0xBE,0x8F, -0x4C,0x00,0xB7,0x8F, -0x48,0x00,0xB6,0x8F, -0x44,0x00,0xB5,0x8F, -0x40,0x00,0xB4,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x58,0x00,0xBD,0x27, -0x00,0x00,0x87,0x8E, -0x24,0x00,0x64,0x26, -0xFF,0x3F,0xE7,0x30, -0xDC,0xFF,0xE7,0x24, -0x55,0x1D,0x00,0x0C, -0x20,0x00,0xA6,0x27, -0xBE,0xFE,0x40,0x10, -0x21,0x28,0x40,0x00, -0x20,0x00,0xA7,0x8F, -0x04,0x00,0x42,0x90, -0x04,0x00,0xE3,0x28, -0xB9,0xFE,0x60,0x14, -0xFE,0x00,0x46,0x30, -0x50,0x39,0x04,0x96, -0xC0,0x10,0x06,0x00, -0x2A,0x10,0x82,0x00, -0xB4,0xFE,0x40,0x14, -0x21,0x10,0xC7,0x00, -0xFD,0xFF,0x42,0x24, -0xC0,0x10,0x02,0x00, -0x2A,0x10,0x44,0x00, -0xAF,0xFE,0x40,0x14, -0xC2,0x10,0x04,0x00, -0x23,0x30,0x46,0x00, -0x21,0x18,0xA6,0x00, -0x05,0x00,0x62,0x90, -0x07,0x00,0x84,0x30, -0x07,0x10,0x82,0x00, -0x01,0x00,0x42,0x30, -0xA7,0xFE,0x40,0x10, -0x00,0x00,0x00,0x00, -0xCD,0x4E,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x90,0x16,0x00,0x08, -0x00,0x00,0x00,0x00, -0x88,0x58,0xA5,0x26, -0x10,0x00,0x64,0x26, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xCB,0xFF,0x40,0x14, -0x21,0x18,0x00,0x00, -0xB0,0x1B,0x43,0x96, -0x00,0x00,0x00,0x00, -0x01,0x00,0x62,0x30, -0x0D,0x00,0x40,0x14, -0x04,0x00,0x62,0x30, -0x83,0x00,0x40,0x14, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x70,0x24, -0x0B,0x3E,0x02,0x92, -0x00,0x00,0x00,0x00, -0x01,0x00,0x44,0x24, -0xFF,0x00,0x83,0x30, -0x0B,0x00,0x02,0x24, -0x45,0x00,0x62,0x10, -0x21,0x18,0x00,0x00, -0xA1,0x16,0x00,0x08, -0x0B,0x3E,0x04,0xA2, -0x00,0x60,0x03,0x40, -0x01,0x00,0x61,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xD4,0x1E,0x42,0x8E, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xD4,0x1E,0x42,0xAE, -0x00,0x60,0x83,0x40, -0xFB,0x17,0x00,0x08, -0x02,0x80,0x03,0x3C, -0x15,0x5F,0x62,0x91, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x42,0x24, -0x15,0x5F,0x62,0xA1, -0xBD,0x16,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x04,0x3C, -0xFC,0xE2,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xE6,0x5D,0x46,0x90, -0x01,0x00,0x03,0x24, -0x10,0x00,0xC3,0x10, -0x02,0x80,0x03,0x3C, -0x53,0x16,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x54,0x00,0xBF,0x8F, -0x50,0x00,0xBE,0x8F, -0x4C,0x00,0xB7,0x8F, -0x48,0x00,0xB6,0x8F, -0x44,0x00,0xB5,0x8F, -0x40,0x00,0xB4,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x58,0x00,0xBD,0x27, -0x30,0x1F,0x64,0x24, -0x0A,0x3E,0x83,0x90, -0x03,0x00,0x02,0x24, -0x62,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x91,0x3E,0x86,0xA0, -0x53,0x16,0x00,0x0C, -0x90,0x3E,0x80,0xA0, -0x21,0x18,0x00,0x08, -0x00,0x00,0x00,0x00, -0x15,0x5F,0x62,0x91, -0x00,0x00,0x00,0x00, -0x05,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x15,0x5F,0x62,0x91, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x15,0x5F,0x62,0xA1, -0x00,0x00,0xE2,0x92, -0xFB,0xFF,0x03,0x24, -0x01,0x00,0x06,0x24, -0x24,0x10,0x43,0x00, -0x00,0x00,0xE2,0xA2, -0x11,0x17,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xE6,0x5D,0x43,0x90, -0x01,0x00,0x11,0x24, -0x53,0x00,0x71,0x10, -0x0B,0x3E,0x00,0xA2, -0x02,0x80,0x02,0x3C, -0xEA,0x5D,0x44,0x90, -0x02,0x00,0x03,0x24, -0x6E,0xFF,0x83,0x14, -0x21,0x18,0x00,0x00, -0x00,0x00,0x87,0x8E, -0x24,0x00,0x64,0x26, -0x2A,0x00,0x05,0x24, -0xFF,0x3F,0xE7,0x30, -0xDC,0xFF,0xE7,0x24, -0x55,0x1D,0x00,0x0C, -0x20,0x00,0xA6,0x27, -0x65,0xFF,0x40,0x10, -0x21,0x18,0x00,0x00, -0x02,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x62,0x30, -0x4D,0x00,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x01,0x00,0x62,0x30, -0x4B,0x00,0x40,0x14, -0x30,0x1F,0x85,0x24, -0x02,0x80,0x02,0x3C, -0xEB,0x5D,0x43,0x90, -0x00,0x00,0x00,0x00, -0xAA,0x00,0x71,0x10, -0x00,0x00,0x00,0x00, -0x10,0x23,0x02,0x8E, -0xFF,0xEF,0x03,0x24, -0x00,0x08,0x42,0x34, -0x24,0x10,0x43,0x00, -0x10,0x23,0x02,0xAE, -0xBE,0x17,0x00,0x08, -0x21,0x18,0x00,0x00, -0x03,0x00,0xA2,0x90, -0x02,0x80,0x04,0x3C, -0x10,0x5F,0xE2,0xA0, -0x02,0x00,0xA3,0x90, -0x21,0x30,0x80,0x00, -0x11,0x5F,0x83,0xA0, -0x11,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0x22,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x10,0x5F,0xE2,0x90, -0x00,0x00,0x00,0x00, -0x11,0x5F,0xC2,0xA0, -0x2A,0x17,0x00,0x08, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x76,0x26, -0x3B,0x51,0x00,0x0C, -0x21,0x20,0xC0,0x02, -0x20,0x00,0x10,0x24, -0x32,0x00,0x50,0x10, -0x21,0xA8,0x40,0x00, -0x00,0x60,0x05,0x40, -0x01,0x00,0xA1,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x80,0x18,0x15,0x00, -0x21,0x18,0x75,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x44,0x24, -0xC0,0x18,0x03,0x00, -0x21,0x18,0x64,0x00, -0x0C,0x1E,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x0C,0x1E,0x62,0xAC, -0x00,0x60,0x85,0x40, -0xBE,0x17,0x00,0x08, -0x21,0x18,0x00,0x00, -0x90,0x3E,0x86,0xA0, -0x53,0x16,0x00,0x0C, -0x91,0x3E,0x80,0xA0, -0x21,0x18,0x00,0x08, -0x00,0x00,0x00,0x00, -0x11,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0x11,0x5F,0xC2,0xA0, -0x2A,0x17,0x00,0x08, -0x00,0x00,0x00,0x00, -0x64,0x12,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x4D,0x18,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x04,0x3C, -0x01,0x00,0x02,0x24, -0x90,0xE2,0x84,0x24, -0x18,0x18,0x00,0x08, -0x0A,0x3E,0xA2,0xA2, -0x02,0x80,0x04,0x3C, -0x78,0xE2,0x84,0x24, -0x18,0x18,0x00,0x08, -0x0A,0x3E,0xA0,0xA2, -0x30,0x1F,0x85,0x24, -0x10,0x23,0xA2,0x8C, -0xFF,0xEF,0x03,0x24, -0xFF,0xF7,0x04,0x24, -0x24,0x10,0x43,0x00, -0x24,0x10,0x44,0x00, -0x21,0x18,0x00,0x00, -0xBE,0x17,0x00,0x08, -0x10,0x23,0xA2,0xAC, -0xFF,0xFF,0x04,0x24, -0xE3,0x50,0x00,0x0C, -0x21,0x28,0xC0,0x02, -0xCB,0xFF,0x50,0x10, -0x21,0xA8,0x40,0x00, -0x00,0x00,0x87,0x8E, -0x24,0x00,0x70,0x26, -0x21,0x20,0x00,0x02, -0xFF,0x3F,0xE7,0x30, -0xDC,0xFF,0xE7,0x24, -0x01,0x00,0x05,0x24, -0x55,0x1D,0x00,0x0C, -0x20,0x00,0xA6,0x27, -0xDF,0xFD,0x40,0x10, -0x21,0x18,0x00,0x00, -0x20,0x00,0xA6,0x8F, -0x02,0x00,0x45,0x24, -0x10,0x52,0x00,0x0C, -0x10,0x00,0xA4,0x27, -0x00,0x00,0x87,0x8E, -0x21,0x20,0x00,0x02, -0x32,0x00,0x05,0x24, -0xFF,0x3F,0xE7,0x30, -0xDC,0xFF,0xE7,0x24, -0x20,0x00,0xB1,0x8F, -0x55,0x1D,0x00,0x0C, -0x20,0x00,0xA6,0x27, -0x09,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x20,0x00,0xA6,0x8F, -0x10,0x00,0xA4,0x27, -0x21,0x20,0x91,0x00, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x45,0x24, -0x20,0x00,0xA3,0x8F, -0x00,0x00,0x00,0x00, -0x21,0x88,0x23,0x02, -0x10,0x00,0xA4,0x27, -0x7D,0x50,0x00,0x0C, -0x21,0x28,0x20,0x02, -0x0F,0x00,0x42,0x30, -0x00,0x81,0x15,0x00, -0x21,0x28,0x20,0x02, -0x10,0x00,0xA4,0x27, -0x25,0x80,0x02,0x02, -0xC2,0x50,0x00,0x0C, -0xFF,0xFF,0x10,0x32, -0x02,0x80,0x04,0x3C, -0x21,0x88,0x40,0x00, -0x21,0x38,0x40,0x00, -0x21,0x28,0xA0,0x02, -0x21,0x30,0x00,0x02, -0x2F,0x55,0x00,0x0C, -0x10,0xE3,0x84,0x24, -0x21,0x20,0x00,0x02, -0xC1,0x5B,0x00,0x0C, -0x21,0x28,0x20,0x02, -0x8E,0x3E,0x42,0x92, -0x21,0x20,0xC0,0x02, -0x21,0x28,0xA0,0x02, -0x01,0x00,0x42,0x24, -0x9C,0x0E,0x00,0x0C, -0x8E,0x3E,0x42,0xA2, -0x83,0x18,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x43,0x24, -0xE4,0xE2,0x84,0x24, -0x05,0x00,0x02,0x24, -0x18,0x18,0x00,0x08, -0x0A,0x3E,0x62,0xA0, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x43,0x24, -0xD0,0xE2,0x84,0x24, -0x02,0x00,0x02,0x24, -0x18,0x18,0x00,0x08, -0x0A,0x3E,0x62,0xA0, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x43,0x24, -0xBC,0xE2,0x84,0x24, -0x04,0x00,0x02,0x24, -0x18,0x18,0x00,0x08, -0x0A,0x3E,0x62,0xA0, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x43,0x24, -0xA8,0xE2,0x84,0x24, -0x03,0x00,0x02,0x24, -0x18,0x18,0x00,0x08, -0x0A,0x3E,0x62,0xA0, -0x10,0x23,0x02,0x8E, -0xFF,0xF7,0x03,0x24, -0x24,0x10,0x43,0x00, -0x00,0x10,0x42,0x34, -0x6C,0x18,0x00,0x08, -0x10,0x23,0x02,0xAE, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x10,0x3C, -0x30,0x1F,0x02,0x26, -0x14,0x00,0xBF,0xAF, -0xB0,0x1B,0x43,0x94, -0x21,0x28,0x00,0x00, -0x00,0x01,0x62,0x30, -0x03,0x00,0x40,0x10, -0x01,0x00,0x64,0x30, -0x06,0x00,0x80,0x14, -0x00,0x10,0x62,0x30, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0xA0,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x08,0x00,0x40,0x14, -0x02,0x00,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xF6,0x5E,0x43,0x90, -0x0C,0x00,0x02,0x24, -0x0F,0x00,0x63,0x30, -0x0A,0x00,0x62,0x10, -0x21,0x20,0x00,0x00, -0x02,0x00,0x03,0x3C, -0x30,0x1F,0x04,0x26, -0x20,0xBF,0x63,0x34, -0x08,0x39,0x83,0xAC, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0xA0,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xCD,0x4E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x00,0x03,0x3C, -0x30,0x1F,0x04,0x26, -0x20,0xBF,0x63,0x34, -0x33,0x19,0x00,0x08, -0x08,0x39,0x83,0xAC, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x11,0x3C, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x25,0x26, -0x6C,0x3B,0xA2,0x8C, -0x00,0x10,0x03,0x3C, -0x24,0x10,0x43,0x00, -0x21,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x9B,0x3B,0xA6,0x90, -0x9C,0x3B,0xA4,0x90, -0xFF,0x00,0xC3,0x30, -0x40,0x10,0x03,0x00, -0x21,0x10,0x43,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x01,0x00,0x84,0x24, -0x80,0x10,0x02,0x00, -0xFF,0x00,0x83,0x30, -0x21,0x10,0x45,0x00, -0x21,0x10,0x43,0x00, -0x9C,0x3B,0xA4,0xA0, -0x38,0x3B,0x43,0x90, -0x00,0x00,0x00,0x00, -0x21,0x00,0x60,0x10, -0x01,0x00,0xC2,0x24, -0xFF,0x00,0xC2,0x30, -0x22,0x00,0x40,0x14, -0x30,0x1F,0x30,0x26, -0x9C,0x3B,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x21,0x10,0x45,0x00, -0x38,0x3B,0x43,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x64,0x30, -0x1A,0x00,0x80,0x10, -0x00,0x00,0x00,0x00, -0x67,0x3B,0xA2,0x90, -0x30,0x3B,0xA3,0xA0, -0x4F,0x0C,0x00,0x0C, -0x31,0x3B,0xA2,0xA0, -0x30,0x1F,0x30,0x26, -0x70,0x3B,0x03,0x8E, -0x01,0x00,0x02,0x24, -0x7C,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x6C,0x3B,0x03,0x8E, -0x00,0x10,0x02,0x3C, -0x3C,0x00,0x04,0x24, -0x26,0x18,0x62,0x00, -0x98,0x38,0x04,0xAE, -0x6C,0x3B,0x03,0xAE, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x21,0x30,0x40,0x00, -0x9B,0x3B,0xA2,0xA0, -0x5C,0x19,0x00,0x08, -0x9C,0x3B,0xA0,0xA0, -0x99,0x3B,0x03,0x92, -0x9A,0x3B,0x02,0x92, -0xFF,0x00,0x64,0x30, -0x30,0x3B,0x03,0xA2, -0x4F,0x0C,0x00,0x0C, -0x31,0x3B,0x02,0xA2, -0xB0,0x1B,0x03,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x62,0x30, -0x09,0x00,0x40,0x10, -0x01,0x00,0x62,0x30, -0x08,0x00,0x40,0x10, -0x30,0x1F,0x30,0x26, -0x02,0x80,0x02,0x3C, -0xF6,0x5E,0x43,0x90, -0x0C,0x00,0x02,0x24, -0x0F,0x00,0x63,0x30, -0x61,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x30,0x26, -0x9E,0x3B,0x04,0x96, -0xA0,0x3B,0x05,0x92, -0x12,0x0D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xC1,0x48,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x6C,0x3B,0x00,0xAE, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xB0,0x1B,0x02,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x3F,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0x43,0x90, -0x00,0x00,0x00,0x00, -0x3C,0x00,0x60,0x10, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xF6,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x04,0x00,0x42,0x28, -0x41,0x00,0x40,0x14, -0x04,0x00,0x04,0x24, -0x02,0x80,0x03,0x3C, -0x15,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x05,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x15,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x15,0x5F,0x62,0xA0, -0x00,0x60,0x92,0x40, -0x25,0xB0,0x07,0x3C, -0x30,0x1F,0x30,0x26, -0xB0,0x1B,0x04,0x96, -0x48,0x00,0xE6,0x34, -0x00,0x00,0xC3,0x8C, -0xFF,0xEF,0x84,0x30, -0x80,0x00,0x02,0x3C, -0x25,0x18,0x62,0x00, -0x00,0x01,0x85,0x30, -0x00,0x00,0xC3,0xAC, -0x02,0x80,0x08,0x3C, -0x05,0x00,0xA0,0x10, -0xB0,0x1B,0x04,0xA6, -0x00,0x00,0xC2,0x8C, -0x04,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x00,0x00,0xC2,0xAC, -0x30,0x1F,0x02,0x8D, -0xFF,0xF0,0x03,0x24, -0xA1,0x3B,0x05,0x92, -0x24,0x10,0x43,0x00, -0x00,0x01,0x42,0x34, -0x0F,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x10,0x00,0x42,0x34, -0xF0,0xFF,0x03,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x24,0x10,0x43,0x00, -0x4C,0x00,0xE3,0x34, -0x01,0x00,0x42,0x34, -0x00,0x00,0x65,0xA0, -0x64,0x03,0xE4,0x34, -0x07,0x00,0x03,0x24, -0x20,0x00,0xBD,0x27, -0x30,0x1F,0x02,0xAD, -0x00,0x00,0x83,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x15,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x64,0x90, -0x01,0x00,0x05,0x24, -0x64,0x31,0x00,0x0C, -0xFF,0x00,0x84,0x30, -0xB8,0x19,0x00,0x08, -0x00,0x00,0x00,0x00, -0x13,0x0F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x70,0x19,0x00,0x08, -0x00,0x00,0x00,0x00, -0x64,0x31,0x00,0x0C, -0x01,0x00,0x05,0x24, -0xB0,0x19,0x00,0x08, -0x02,0x80,0x03,0x3C, -0xCD,0x4E,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x94,0x19,0x00,0x08, -0x30,0x1F,0x30,0x26, -0x0C,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x3F,0x00,0x42,0x30, -0x04,0x00,0x42,0x28, -0x17,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x24,0x08,0x42,0x34, -0x00,0x00,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x02,0x63,0x30, -0x15,0x00,0x60,0x14, -0x01,0x00,0x02,0x24, -0x05,0x00,0xA3,0x90, -0x00,0x00,0x00,0x00, -0x82,0x21,0x03,0x00, -0x28,0x00,0x82,0x10, -0xF5,0xFF,0x02,0x24, -0x02,0x00,0x82,0x28, -0x3B,0x00,0x40,0x14, -0x02,0x00,0x02,0x24, -0x2F,0x00,0x82,0x10, -0xE9,0xFF,0x02,0x24, -0x03,0x00,0x02,0x24, -0x24,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x05,0x00,0xC2,0x24, -0x04,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x42,0x10,0x02,0x00, -0x08,0x00,0xE0,0x03, -0x96,0xFF,0x42,0x24, -0x05,0x00,0xA3,0x90, -0x00,0x00,0x00,0x00, -0x60,0x00,0x64,0x30, -0x42,0x21,0x04,0x00, -0x0F,0x00,0x82,0x10, -0x1F,0x00,0x62,0x30, -0x02,0x00,0x82,0x28, -0x1F,0x00,0x40,0x14, -0x02,0x00,0x02,0x24, -0x16,0x00,0x82,0x10, -0x1F,0x00,0x62,0x30, -0x03,0x00,0x02,0x24, -0xEC,0xFF,0x82,0x14, -0x00,0x00,0x00,0x00, -0x1F,0x00,0x62,0x30, -0x40,0x10,0x02,0x00, -0xDD,0xFF,0x03,0x24, -0x23,0x30,0x62,0x00, -0x08,0x00,0xE0,0x03, -0x05,0x00,0xC2,0x24, -0x40,0x10,0x02,0x00, -0xF5,0xFF,0x03,0x24, -0x2A,0x1A,0x00,0x08, -0x23,0x30,0x62,0x00, -0x3E,0x00,0x63,0x30, -0x23,0x30,0x43,0x00, -0x08,0x00,0xE0,0x03, -0x05,0x00,0xC2,0x24, -0x3E,0x00,0x63,0x30, -0xDD,0xFF,0x02,0x24, -0x32,0x1A,0x00,0x08, -0x23,0x30,0x43,0x00, -0x40,0x10,0x02,0x00, -0xE9,0xFF,0x03,0x24, -0x2A,0x1A,0x00,0x08, -0x23,0x30,0x62,0x00, -0x3E,0x00,0x63,0x30, -0x32,0x1A,0x00,0x08, -0x23,0x30,0x43,0x00, -0xD1,0xFF,0x80,0x14, -0x00,0x00,0x00,0x00, -0x1F,0x00,0x62,0x30, -0x40,0x10,0x02,0x00, -0xF8,0xFF,0x03,0x24, -0x2A,0x1A,0x00,0x08, -0x23,0x30,0x62,0x00, -0xCA,0xFF,0x80,0x14, -0x00,0x00,0x00,0x00, -0x3E,0x00,0x63,0x30, -0xF8,0xFF,0x02,0x24, -0x32,0x1A,0x00,0x08, -0x23,0x30,0x43,0x00, -0x63,0x00,0x82,0x24, -0x77,0x00,0x42,0x2C, -0x00,0x00,0x85,0x28, -0x04,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0x64,0x00,0x82,0x24, -0x64,0x00,0x03,0x24, -0x0B,0x18,0x45,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x02,0x80,0x09,0x3C, -0x30,0x1F,0x28,0x25, -0x80,0x36,0x06,0x8D, -0xFF,0xFF,0x02,0x34, -0x3F,0x00,0xC2,0x10, -0x21,0x38,0x80,0x00, -0x2B,0x10,0xC7,0x00, -0x30,0x00,0x40,0x10, -0x02,0x19,0x06,0x00, -0x21,0x10,0xC7,0x00, -0x23,0x10,0x43,0x00, -0x10,0x00,0x46,0x24, -0x80,0x36,0x06,0xAD, -0x30,0x1F,0x26,0x25, -0x04,0x00,0xC4,0x8C, -0x84,0x36,0x02,0xAD, -0xFF,0xFF,0x02,0x34, -0x2F,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x87,0x00, -0x1F,0x00,0x40,0x10, -0x02,0x19,0x04,0x00, -0x21,0x10,0x87,0x00, -0x23,0x10,0x43,0x00, -0x10,0x00,0x44,0x24, -0x04,0x00,0xC4,0xAC, -0x84,0x36,0xC2,0xAC, -0xC0,0x10,0x05,0x00, -0x21,0x10,0x45,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x45,0x00, -0x30,0x1F,0x23,0x25, -0x80,0x10,0x02,0x00, -0x21,0x28,0x43,0x00, -0x0C,0x24,0xA6,0x8C, -0x00,0x21,0x07,0x00, -0xFF,0xFF,0xC2,0x38, -0x0A,0x30,0x82,0x00, -0x2B,0x18,0xC7,0x00, -0x07,0x00,0x60,0x10, -0x21,0x10,0xC7,0x00, -0x02,0x19,0x06,0x00, -0x23,0x10,0x43,0x00, -0x10,0x00,0x46,0x24, -0x0C,0x24,0xA6,0xAC, -0x08,0x00,0xE0,0x03, -0x10,0x24,0xA2,0xAC, -0x02,0x19,0x06,0x00, -0x23,0x10,0x43,0x00, -0x0C,0x24,0xA2,0xAC, -0x08,0x00,0xE0,0x03, -0x10,0x24,0xA2,0xAC, -0x21,0x10,0x87,0x00, -0x23,0x10,0x43,0x00, -0x70,0x1A,0x00,0x08, -0x04,0x00,0xC2,0xAC, -0x21,0x10,0xC7,0x00, -0x30,0x1F,0x26,0x25, -0x04,0x00,0xC4,0x8C, -0x23,0x10,0x43,0x00, -0x80,0x36,0x02,0xAD, -0x84,0x36,0x02,0xAD, -0xFF,0xFF,0x02,0x34, -0xD4,0xFF,0x82,0x14, -0x2B,0x10,0x87,0x00, -0x00,0x21,0x07,0x00, -0x69,0x1A,0x00,0x08, -0x04,0x00,0xC4,0xAC, -0x00,0x31,0x04,0x00, -0x5C,0x1A,0x00,0x08, -0x80,0x36,0x06,0xAD, -0xA0,0xFF,0xBD,0x27, -0x54,0x00,0xB7,0xAF, -0x5C,0x00,0xBF,0xAF, -0x58,0x00,0xBE,0xAF, -0x50,0x00,0xB6,0xAF, -0x4C,0x00,0xB5,0xAF, -0x48,0x00,0xB4,0xAF, -0x44,0x00,0xB3,0xAF, -0x40,0x00,0xB2,0xAF, -0x3C,0x00,0xB1,0xAF, -0x38,0x00,0xB0,0xAF, -0x02,0x80,0x17,0x3C, -0x02,0x80,0x02,0x3C, -0x64,0x57,0x45,0x8C, -0x00,0x80,0x04,0x3C, -0x74,0x6A,0x83,0x24, -0x64,0x57,0x44,0x24, -0x25,0xB0,0x02,0x3C, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x7F,0x00,0xA4,0x10, -0x02,0x80,0x09,0x3C, -0x02,0x80,0x02,0x3C, -0x40,0xEB,0x29,0x25, -0x44,0xEB,0x42,0x24, -0x00,0x00,0x35,0x8D, -0x00,0x00,0x53,0x8C, -0x02,0x80,0x03,0x3C, -0x48,0xEB,0x63,0x24, -0x00,0x00,0x7E,0x8C, -0x34,0x38,0xB4,0x8E, -0x21,0x20,0x00,0x00, -0x21,0xB0,0x00,0x00, -0x08,0x00,0x82,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x00,0x62,0xAE, -0x08,0x00,0x83,0x96, -0x02,0x80,0x02,0x3C, -0xB0,0x01,0x00,0x0C, -0x25,0x90,0x62,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xAC,0x1B,0xA3,0x96, -0xD0,0x37,0xA2,0x8E, -0x00,0x00,0x00,0x00, -0x21,0x10,0x43,0x00, -0x00,0x00,0xC2,0xAF, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0xF4,0x1A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x17,0x00,0xC7,0x90, -0x16,0x00,0xC8,0x90, -0x32,0x3B,0xA2,0x96, -0xFF,0x00,0xE3,0x30, -0x00,0x1A,0x03,0x00, -0xFF,0x00,0x05,0x31, -0x25,0x18,0x65,0x00, -0xB7,0x00,0x43,0x10, -0x24,0xE3,0x24,0x25, -0xFF,0x00,0xE2,0x30, -0xFF,0x00,0x03,0x31, -0x00,0x12,0x02,0x00, -0x25,0x10,0x43,0x00, -0x32,0x3B,0xA2,0xA6, -0x01,0x00,0xC4,0x90, -0x00,0x00,0xC2,0x90, -0x00,0x22,0x04,0x00, -0x88,0x0C,0x00,0x0C, -0x25,0x20,0x82,0x00, -0x40,0x18,0x02,0x00, -0x21,0x18,0x62,0x00, -0x80,0x18,0x03,0x00, -0x94,0xDE,0xE2,0x26, -0x21,0x18,0x62,0x00, -0x08,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x09,0xF8,0x40,0x00, -0x21,0x20,0x20,0x02, -0x0C,0x00,0x82,0x8E, -0x00,0x00,0x00,0x00, -0x2B,0x10,0xC2,0x02, -0x2C,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0x42,0x8E, -0x21,0x88,0x40,0x02, -0x42,0x1B,0x02,0x00, -0x78,0x00,0x63,0x30, -0x02,0x26,0x02,0x00, -0xFF,0x3F,0x42,0x30, -0x21,0x10,0x43,0x00, -0x03,0x00,0x84,0x30, -0x21,0x10,0x44,0x00, -0x18,0x00,0x42,0x24, -0xFF,0xFF,0x50,0x30, -0x7F,0x00,0x02,0x32, -0x80,0x00,0x03,0x26, -0x00,0x00,0x70,0xAE, -0x02,0x00,0x40,0x10, -0x80,0xFF,0x05,0x32, -0x80,0xFF,0x65,0x30, -0x00,0x00,0x65,0xAE, -0x02,0x00,0x22,0x96, -0x21,0x18,0xC5,0x02, -0xFF,0xFF,0x76,0x30, -0x0F,0x00,0x42,0x30, -0x00,0x00,0x62,0xAE, -0x00,0x00,0x23,0x8E, -0x21,0x90,0x45,0x02, -0x42,0x13,0x03,0x00, -0x78,0x00,0x42,0x30, -0x02,0x1E,0x03,0x00, -0x21,0x10,0x51,0x00, -0x03,0x00,0x63,0x30, -0x21,0x10,0x43,0x00, -0x18,0x00,0x46,0x24, -0x00,0x00,0x66,0xAE, -0x01,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0x00,0x12,0x02,0x00, -0x00,0x08,0x42,0x30, -0xB9,0xFF,0x40,0x14, -0x02,0x80,0x09,0x3C, -0x16,0x00,0xC8,0x90, -0x17,0x00,0xC7,0x90, -0xDD,0x1A,0x00,0x08, -0xFF,0x00,0xE2,0x30, -0x00,0x60,0x10,0x40, -0x01,0x00,0x01,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x04,0x00,0x83,0x8E, -0x00,0x00,0x82,0x8E, -0x21,0x20,0x80,0x02, -0x00,0x00,0x62,0xAC, -0x04,0x00,0x43,0xAC, -0x00,0x00,0x94,0xAE, -0x3D,0x24,0x00,0x0C, -0x04,0x00,0x94,0xAE, -0x00,0x60,0x90,0x40, -0x02,0x80,0x02,0x3C, -0x64,0x57,0x43,0x8C, -0x64,0x57,0x42,0x24, -0x8B,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x40,0xEB,0x63,0x24, -0x00,0x00,0x71,0x8C, -0x25,0xB0,0x10,0x3C, -0x04,0x01,0x02,0x36, -0x00,0x00,0x43,0x8C, -0xE8,0x37,0x27,0x8E, -0x00,0x00,0x00,0x00, -0xC8,0x00,0xE3,0x10, -0xEC,0x37,0x23,0xAE, -0x2B,0x10,0x67,0x00, -0xD2,0x00,0x40,0x14, -0x2B,0x10,0xE3,0x00, -0x08,0x01,0x40,0x14, -0x02,0x80,0x09,0x3C, -0x30,0x1F,0x24,0x25, -0xBC,0x37,0x83,0x94, -0x02,0x80,0x02,0x3C, -0x21,0x80,0x00,0x00, -0x2F,0x00,0xC0,0x1A, -0x25,0xA8,0x62,0x00, -0x21,0x98,0x80,0x00, -0x21,0x90,0x00,0x00, -0x01,0x00,0x1E,0x24, -0x21,0x88,0x55,0x02, -0x00,0x00,0x22,0x8E, -0x98,0x3E,0x63,0x8E, -0xFF,0x3F,0x42,0x30, -0x21,0x18,0x62,0x00, -0x98,0x3E,0x63,0xAE, -0x00,0x60,0x04,0x40, -0x01,0x00,0x81,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xD4,0x1E,0x62,0x8E, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xD4,0x1E,0x62,0xAE, -0x00,0x60,0x84,0x40, -0x04,0x00,0x22,0x8E, -0x02,0x00,0x03,0x24, -0x02,0x17,0x02,0x00, -0x03,0x00,0x42,0x30, -0x39,0x00,0x43,0x10, -0x02,0x80,0x03,0x3C, -0x21,0x10,0x55,0x02, -0x00,0x00,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x60,0x10, -0x01,0x00,0x02,0x26, -0x04,0x00,0x22,0x8E, -0x00,0xF0,0x03,0x3C, -0x00,0x20,0x04,0x3C, -0x24,0x10,0x43,0x00, -0x10,0x00,0x44,0x10, -0x02,0x80,0x09,0x3C, -0x06,0x00,0x02,0x26, -0x00,0x00,0x23,0x8E, -0xFF,0xFF,0x50,0x30, -0x82,0x16,0x03,0x00, -0x01,0x00,0x42,0x30, -0x52,0x00,0x5E,0x10, -0x02,0x80,0x04,0x3C, -0x80,0x90,0x10,0x00, -0x2A,0x10,0x56,0x02, -0xD7,0xFF,0x40,0x14, -0x21,0x88,0x55,0x02, -0x3D,0x24,0x00,0x0C, -0x21,0x20,0x80,0x02, -0x08,0x1C,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x40,0xEB,0x29,0x25, -0x00,0x00,0x25,0x8D, -0x00,0x00,0x00,0x00, -0xD4,0x1D,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xD4,0x1D,0xA2,0xAC, -0x0C,0x00,0x24,0x8E, -0x0C,0x00,0x02,0x24, -0x3F,0x00,0x83,0x30, -0xBD,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x02,0x24, -0xB3,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x3F,0x00,0x83,0x30, -0x0E,0x00,0x02,0x24, -0xE0,0xFF,0x62,0x14, -0x06,0x00,0x02,0x26, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x63,0x24, -0xE0,0x1D,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x69,0x1B,0x00,0x08, -0xE0,0x1D,0x62,0xAC, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEF,0x1A,0x00,0x08, -0x00,0x00,0x00,0x00, -0xF4,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0xC6,0xFF,0x40,0x10, -0x21,0x10,0x55,0x02, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xF4,0x5E,0x62,0x90, -0x02,0x80,0x04,0x3C, -0xF8,0xE8,0x85,0x24, -0xFF,0x00,0x42,0x30, -0x80,0x10,0x02,0x00, -0x21,0x10,0x45,0x00, -0x00,0x00,0x43,0x8C, -0x00,0x00,0x24,0x8E, -0x04,0x00,0x25,0x8E, -0x09,0xF8,0x60,0x00, -0x00,0x00,0x00,0x00, -0x02,0x80,0x09,0x3C, -0xF6,0x5E,0x22,0x91, -0x0C,0x00,0x03,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x10, -0x02,0x80,0x03,0x3C, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x5F,0x1B,0x00,0x08, -0x21,0x10,0x55,0x02, -0x0D,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0xF8,0xFF,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x13,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x13,0x5F,0x82,0xA0, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x5F,0x1B,0x00,0x08, -0x21,0x10,0x55,0x02, -0x30,0x1F,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x02,0x12,0x02,0x00, -0x0F,0x00,0x42,0x30, -0x05,0x00,0x5E,0x10, -0xC2,0x13,0x03,0x00, -0x1E,0x00,0x42,0x30, -0x21,0x10,0x50,0x00, -0x70,0x1B,0x00,0x08, -0xFF,0xFF,0x50,0x30, -0x02,0x00,0x62,0x92, -0x00,0x00,0x00,0x00, -0x1C,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x04,0x00,0x23,0x8E, -0x00,0x00,0x00,0x00, -0x02,0x14,0x03,0x00, -0x0F,0x00,0x42,0x30, -0x14,0x00,0x40,0x14, -0x02,0x17,0x03,0x00, -0x03,0x00,0x44,0x30, -0x08,0x00,0x80,0x10, -0x00,0xC0,0x02,0x3C, -0x24,0x10,0x62,0x00, -0x0E,0x00,0x40,0x14, -0x03,0x00,0x02,0x24, -0x0C,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x80,0x10, -0x00,0x00,0x00,0x00, -0x80,0x28,0x10,0x00, -0x21,0x28,0xB5,0x00, -0xF7,0x19,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x4C,0x1A,0x00,0x0C, -0x21,0x20,0x40,0x00, -0x21,0x20,0x40,0x00, -0x56,0x1A,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x02,0x00,0x62,0x92, -0x00,0x00,0x00,0x00, -0x8B,0x00,0x5E,0x10, -0x00,0x00,0x00,0x00, -0x02,0x00,0x63,0x92, -0x02,0x00,0x02,0x24, -0x71,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x4C,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x63,0x30, -0x08,0x00,0x7E,0x10, -0xD0,0x02,0x02,0x24, -0x00,0x00,0x23,0x8E, -0x00,0x00,0x00,0x00, -0xC2,0x13,0x03,0x00, -0x1E,0x00,0x42,0x30, -0x21,0x10,0x50,0x00, -0x70,0x1B,0x00,0x08, -0xFF,0xFF,0x50,0x30, -0x80,0x36,0x62,0xAE, -0x00,0x00,0x23,0x8E, -0xFA,0x1B,0x00,0x08, -0xC2,0x13,0x03,0x00, -0x02,0x80,0x09,0x3C, -0x00,0x01,0x02,0x36, -0x30,0x1F,0x29,0x25, -0x00,0x00,0x47,0xAC, -0xE8,0x37,0x27,0xAD, -0x02,0x80,0x02,0x3C, -0x08,0x04,0x44,0x24, -0x21,0x28,0x00,0x00, -0x21,0x30,0x00,0x00, -0x91,0x3C,0x00,0x0C, -0x21,0x38,0x00,0x00, -0xAA,0x1A,0x00,0x08, -0x02,0x80,0x02,0x3C, -0xF0,0x37,0x22,0x8E, -0xFF,0xFF,0x73,0x30, -0x23,0x10,0x47,0x00, -0xFF,0xFF,0x52,0x30, -0x21,0x18,0x53,0x02, -0xFF,0xFF,0x76,0x30, -0x25,0x24,0x00,0x0C, -0x21,0x20,0xC0,0x02, -0xEF,0xFF,0x40,0x10, -0x21,0xA0,0x40,0x00, -0x08,0x00,0x42,0x8C, -0xE8,0x37,0x26,0x8E, -0x21,0x38,0x40,0x02, -0x21,0x18,0x56,0x00, -0xB8,0x37,0x23,0xAE, -0x21,0x28,0x40,0x00, -0x08,0x00,0x04,0x24, -0xBC,0x37,0x22,0xAE, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xB0,0x01,0x00,0x0C, -0x08,0x00,0x04,0x24, -0xBC,0x37,0x25,0x8E, -0x24,0x10,0x02,0x3C, -0x00,0x01,0x10,0x36, -0x00,0x00,0x02,0xAE, -0x21,0x38,0x60,0x02, -0x21,0x28,0xB2,0x00, -0x08,0x00,0x04,0x24, -0x24,0x10,0x06,0x3C, -0xE8,0x37,0x22,0xAE, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xEC,0x37,0x23,0x8E, -0x08,0x00,0x04,0x24, -0xB0,0x01,0x00,0x0C, -0xE8,0x37,0x23,0xAE, -0xE8,0x37,0x22,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x00,0x02,0xAE, -0x40,0x1B,0x00,0x08, -0x02,0x80,0x09,0x3C, -0xDC,0x1D,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xDC,0x1D,0xA2,0xAC, -0x0C,0x00,0x24,0x8E, -0x88,0x1B,0x00,0x08, -0x3F,0x00,0x83,0x30, -0xD8,0x1D,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xD8,0x1D,0xA2,0xAC, -0x0C,0x00,0x24,0x8E, -0x84,0x1B,0x00,0x08, -0x3F,0x00,0x83,0x30, -0x23,0x10,0x67,0x00, -0xFF,0xFF,0x56,0x30, -0x25,0x24,0x00,0x0C, -0x21,0x20,0xC0,0x02, -0x4A,0x00,0x40,0x10, -0x21,0xA0,0x40,0x00, -0x08,0x00,0x42,0x8C, -0xE8,0x37,0x26,0x8E, -0x08,0x00,0x04,0x24, -0x21,0x18,0x56,0x00, -0xB8,0x37,0x23,0xAE, -0x21,0x28,0x40,0x00, -0x21,0x38,0xC0,0x02, -0xBC,0x37,0x22,0xAE, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xEC,0x37,0x23,0x8E, -0x08,0x00,0x04,0x24, -0xB0,0x01,0x00,0x0C, -0xE8,0x37,0x23,0xAE, -0xE8,0x37,0x23,0x8E, -0x00,0x01,0x02,0x36, -0x00,0x00,0x43,0xAC, -0x40,0x1B,0x00,0x08, -0x02,0x80,0x09,0x3C, -0x04,0x00,0x23,0x8E, -0x00,0x00,0x00,0x00, -0x02,0x14,0x03,0x00, -0x0F,0x00,0x42,0x30, -0x08,0x00,0x42,0x28, -0x8B,0xFF,0x40,0x10, -0x25,0xB0,0x02,0x3C, -0x02,0x17,0x03,0x00, -0x03,0x00,0x42,0x30, -0x86,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x80,0x28,0x10,0x00, -0x21,0x28,0xB5,0x00, -0xF7,0x19,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x4C,0x1A,0x00,0x0C, -0x21,0x20,0x40,0x00, -0x21,0x20,0x40,0x00, -0x56,0x1A,0x00,0x0C, -0x21,0x28,0x00,0x00, -0xF1,0x1B,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x04,0x00,0x23,0x8E, -0x00,0x00,0x00,0x00, -0x02,0x14,0x03,0x00, -0x0F,0x00,0x42,0x30, -0x08,0x00,0x42,0x28, -0x06,0x00,0x40,0x10, -0x00,0xC0,0x02,0x3C, -0x02,0x17,0x03,0x00, -0x03,0x00,0x42,0x30, -0x0C,0x00,0x40,0x10, -0x80,0x28,0x10,0x00, -0x00,0xC0,0x02,0x3C, -0x24,0x10,0x62,0x00, -0x68,0xFF,0x40,0x14, -0x02,0x17,0x03,0x00, -0x03,0x00,0x42,0x30, -0x03,0x00,0x03,0x24, -0x64,0xFF,0x43,0x10, -0x00,0x00,0x00,0x00, -0x62,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x80,0x28,0x10,0x00, -0x21,0x28,0xB5,0x00, -0xF7,0x19,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x4C,0x1A,0x00,0x0C, -0x21,0x20,0x40,0x00, -0x21,0x20,0x40,0x00, -0x56,0x1A,0x00,0x0C, -0x21,0x28,0x00,0x00, -0xEC,0x1B,0x00,0x08, -0x00,0x00,0x00,0x00, -0xEC,0x37,0x23,0x8E, -0x00,0x01,0x02,0x36, -0x00,0x00,0x43,0xAC, -0x07,0x1C,0x00,0x08, -0xE8,0x37,0x23,0xAE, -0xB8,0xFF,0xBD,0x27, -0x25,0xB0,0x03,0x3C, -0x44,0x00,0xBF,0xAF, -0x40,0x00,0xBE,0xAF, -0x3C,0x00,0xB7,0xAF, -0x38,0x00,0xB6,0xAF, -0x34,0x00,0xB5,0xAF, -0x30,0x00,0xB4,0xAF, -0x2C,0x00,0xB3,0xAF, -0x28,0x00,0xB2,0xAF, -0x24,0x00,0xB1,0xAF, -0x20,0x00,0xB0,0xAF, -0x44,0x00,0x63,0x34, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0x0E,0x00,0x40,0x04, -0x18,0x00,0xA0,0xAF, -0x21,0x20,0x60,0x00, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0xFF,0x42,0x30, -0x64,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0xF6,0xFF,0x41,0x04, -0x21,0x10,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x74,0x57,0x43,0x8C, -0x00,0x80,0x06,0x3C, -0x6C,0x72,0xC2,0x24, -0x25,0xB0,0x05,0x3C, -0x02,0x80,0x06,0x3C, -0x18,0x03,0xA4,0x34, -0x74,0x57,0xD2,0x24, -0x00,0x00,0x82,0xAC, -0x67,0x00,0x72,0x10, -0x01,0x00,0x16,0x24, -0x11,0x11,0x02,0x3C, -0x2A,0xB0,0x03,0x3C, -0x22,0x22,0x5E,0x34, -0x02,0x80,0x02,0x3C, -0x21,0xB8,0x80,0x00, -0x05,0x00,0x74,0x34, -0x30,0x1F,0x55,0x24, -0x01,0x00,0x13,0x24, -0x00,0x00,0xFE,0xAE, -0x21,0x00,0xC0,0x12, -0x2A,0xB0,0x03,0x3C, -0x02,0x80,0x03,0x3C, -0xF4,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x1B,0x00,0x40,0x10, -0x21,0xB0,0x00,0x00, -0x01,0x00,0x06,0x24, -0x18,0x00,0xA6,0xAF, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x03,0x3C, -0xF6,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x04,0x00,0x42,0x28, -0x5F,0x00,0x40,0x14, -0x04,0x00,0x04,0x24, -0x02,0x80,0x06,0x3C, -0xDE,0x5D,0xC2,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x30, -0x55,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0x08,0x04,0x24, -0x00,0x02,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x2A,0xB0,0x03,0x3C, -0x06,0x00,0x63,0x34, -0x00,0x00,0x62,0x94, -0x44,0x38,0xB1,0x8E, -0x25,0xB0,0x06,0x3C, -0xB0,0x03,0xC6,0x34, -0x00,0xFF,0x42,0x30, -0x00,0x00,0xD1,0xAC, -0x0F,0x00,0x40,0x18, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x4C,0xEB,0x42,0x24, -0x50,0xEB,0x63,0x24, -0x00,0x00,0x45,0x8C, -0x00,0x00,0x64,0x8C, -0x02,0x80,0x06,0x3C, -0x54,0xEB,0xC6,0x24, -0x00,0x00,0xC3,0x8C, -0x00,0x00,0xA4,0xAC, -0x00,0x00,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0xFF,0x42,0x30, -0xFB,0xFF,0x40,0x1C, -0x00,0x00,0x00,0x00, -0x0C,0x00,0x23,0x8E, -0x00,0x00,0x00,0x00, -0x07,0x00,0x62,0x30, -0x47,0x00,0x40,0x14, -0x08,0x00,0x62,0x24, -0xC2,0x10,0x03,0x00, -0x08,0x00,0x25,0x8E, -0x04,0x37,0xA6,0x8E, -0xC0,0x10,0x02,0x00, -0x20,0x00,0x42,0x24, -0xFF,0xFF,0x47,0x30, -0x01,0x00,0x04,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xB3,0xAF, -0xB0,0x01,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x02,0x00,0x02,0x24, -0x00,0x00,0x93,0xA2, -0x00,0x00,0x82,0xA2, -0x00,0x60,0x10,0x40, -0x01,0x00,0x01,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x04,0x00,0x23,0x8E, -0x00,0x00,0x22,0x8E, -0x21,0x20,0x20,0x02, -0x00,0x00,0x62,0xAC, -0x04,0x00,0x43,0xAC, -0x00,0x00,0x31,0xAE, -0x3D,0x24,0x00,0x0C, -0x04,0x00,0x31,0xAE, -0x00,0x60,0x90,0x40, -0x00,0x00,0x42,0x8E, -0x00,0x00,0x00,0x00, -0xA3,0xFF,0x52,0x14, -0x00,0x00,0x00,0x00, -0x18,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0x07,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xF4,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x11,0x00,0x40,0x14, -0x18,0x00,0xA0,0xAF, -0x02,0x80,0x02,0x3C, -0x08,0x08,0x44,0x24, -0x21,0x28,0x00,0x00, -0x21,0x30,0x00,0x00, -0x91,0x3C,0x00,0x0C, -0x21,0x38,0x00,0x00, -0xBC,0x1C,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x9B,0x30,0x00,0x0C, -0x01,0x00,0x04,0x24, -0xEA,0x1C,0x00,0x08, -0x00,0x08,0x04,0x24, -0x64,0x31,0x00,0x0C, -0x01,0x00,0x05,0x24, -0xE4,0x1C,0x00,0x08, -0x02,0x80,0x06,0x3C, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x06,0x3C, -0xF5,0x5E,0xC4,0x90, -0x01,0x00,0x05,0x24, -0x64,0x31,0x00,0x0C, -0xFF,0x00,0x84,0x30, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x36,0x1D,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x0E,0x1D,0x00,0x08, -0xC2,0x10,0x02,0x00, -0x10,0x00,0xE0,0x18, -0x21,0x18,0x00,0x00, -0x00,0x00,0xC0,0xAC, -0x21,0x40,0x00,0x00, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0x0C,0x00,0x45,0x10, -0x21,0x18,0x80,0x00, -0x01,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0x21,0x18,0x48,0x00, -0x02,0x00,0x68,0x24, -0x21,0x10,0x82,0x00, -0x2B,0x18,0x07,0x01, -0xF5,0xFF,0x60,0x14, -0x02,0x00,0x44,0x24, -0x21,0x18,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x01,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC2,0xAC, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x02,0x80,0x07,0x3C, -0x30,0x1F,0xE5,0x24, -0x22,0x3E,0xA3,0x90, -0xFF,0x00,0x84,0x30, -0x80,0x10,0x04,0x00, -0x0C,0x00,0x60,0x14, -0x21,0x30,0x45,0x00, -0xC8,0x00,0x02,0x24, -0x24,0x39,0xA2,0xAC, -0x01,0x00,0x03,0x24, -0x30,0x1F,0xE2,0x24, -0x04,0x18,0x83,0x00, -0x4C,0x3E,0xA4,0xA0, -0x22,0x3E,0x44,0x90, -0x00,0x00,0x00,0x00, -0x25,0x18,0x64,0x00, -0x08,0x00,0xE0,0x03, -0x22,0x3E,0x43,0xA0, -0x24,0x39,0xA3,0x8C, -0xC8,0x00,0x02,0x24, -0x23,0x10,0x43,0x00, -0x24,0x3E,0xC2,0xAC, -0x01,0x00,0x03,0x24, -0x30,0x1F,0xE2,0x24, -0x04,0x18,0x83,0x00, -0x22,0x3E,0x44,0x90, -0x00,0x00,0x00,0x00, -0x25,0x18,0x64,0x00, -0x08,0x00,0xE0,0x03, -0x22,0x3E,0x43,0xA0, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x11,0x3C, -0x10,0x00,0xB0,0xAF, -0x18,0x00,0xBF,0xAF, -0x30,0x1F,0x25,0x26, -0x4C,0x3E,0xA6,0x90, -0x01,0x00,0x02,0x24, -0x04,0x10,0xC2,0x00, -0x06,0x00,0x40,0x14, -0xC9,0x00,0x10,0x24, -0x1A,0x3E,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x30, -0x23,0x00,0x40,0x14, -0x21,0x20,0xC5,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x46,0x24, -0x21,0x20,0x00,0x00, -0x24,0x3E,0xC5,0x24, -0x00,0x00,0xA2,0x8C, -0x04,0x00,0xA5,0x24, -0x05,0x00,0x40,0x10, -0x2B,0x18,0x50,0x00, -0x03,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0x21,0x80,0x40,0x00, -0x4C,0x3E,0xC4,0xA0, -0x01,0x00,0x84,0x24, -0x08,0x00,0x82,0x2C, -0xF5,0xFF,0x40,0x14, -0xC9,0x00,0x02,0x24, -0x21,0x00,0x02,0x12, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x45,0x24, -0x07,0x00,0x04,0x24, -0x24,0x3E,0xA2,0x8C, -0xFF,0xFF,0x84,0x24, -0x02,0x00,0x40,0x10, -0x23,0x18,0x50,0x00, -0x24,0x3E,0xA3,0xAC, -0xFA,0xFF,0x81,0x04, -0x04,0x00,0xA5,0x24, -0x30,0x1F,0x22,0x26, -0x24,0x39,0x50,0xAC, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x44,0x3E,0x83,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x63,0x24, -0xFF,0x00,0x62,0x30, -0x03,0x00,0x42,0x2C, -0xD8,0xFF,0x40,0x10, -0x44,0x3E,0x83,0xA0, -0x80,0x18,0x06,0x00, -0x21,0x18,0x65,0x00, -0xC8,0x00,0x02,0x24, -0x03,0x00,0x04,0x24, -0x21,0x28,0x00,0x00, -0x90,0x14,0x00,0x0C, -0x24,0x3E,0x62,0xAC, -0x9C,0x1D,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x22,0x26, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x20,0x00,0xBD,0x27, -0x22,0x3E,0x40,0xA0, -0x08,0x00,0xE0,0x03, -0x24,0x39,0x40,0xAC, -0xB8,0xFF,0xBD,0x27, -0x02,0x80,0x08,0x3C, -0x02,0x80,0x0B,0x3C, -0x02,0x80,0x0C,0x3C, -0x40,0x00,0xBF,0xAF, -0x3C,0x00,0xB5,0xAF, -0x38,0x00,0xB4,0xAF, -0x34,0x00,0xB3,0xAF, -0x30,0x00,0xB2,0xAF, -0x2C,0x00,0xB1,0xAF, -0x28,0x00,0xB0,0xAF, -0x40,0xED,0x63,0x25, -0x3C,0xED,0x02,0x25, -0x44,0xED,0x84,0x25, -0x01,0x00,0x45,0x90, -0x01,0x00,0x66,0x90, -0x01,0x00,0x87,0x90, -0x3C,0xED,0x0F,0x91, -0x02,0x00,0x4A,0x90, -0x40,0xED,0x6E,0x91, -0x02,0x00,0x69,0x90, -0x44,0xED,0x8D,0x91, -0x02,0x00,0x88,0x90, -0x03,0x00,0x4B,0x90, -0x03,0x00,0x6C,0x90, -0x03,0x00,0x82,0x90, -0x00,0x2A,0x05,0x00, -0x00,0x32,0x06,0x00, -0x00,0x3A,0x07,0x00, -0x25,0x28,0xAF,0x00, -0x25,0x30,0xCE,0x00, -0x25,0x38,0xED,0x00, -0x00,0x54,0x0A,0x00, -0x00,0x4C,0x09,0x00, -0x00,0x44,0x08,0x00, -0x25,0x50,0x45,0x01, -0x25,0x48,0x26,0x01, -0x25,0x40,0x07,0x01, -0x00,0x5E,0x0B,0x00, -0x00,0x66,0x0C,0x00, -0x00,0x16,0x02,0x00, -0x02,0x80,0x04,0x3C, -0x25,0x58,0x6A,0x01, -0x25,0x60,0x89,0x01, -0x25,0x10,0x48,0x00, -0x84,0x58,0x84,0x24, -0x10,0x00,0xAB,0xAF, -0x18,0x00,0xAC,0xAF, -0x34,0x4F,0x00,0x0C, -0x20,0x00,0xA2,0xAF, -0x10,0x00,0x42,0x30, -0x29,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0x02,0x80,0x13,0x3C, -0x30,0x1F,0x63,0x26, -0xC4,0x39,0x62,0x8C, -0x0C,0x00,0x10,0x24, -0x2B,0x10,0x02,0x02, -0x2C,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xF8,0x58,0x51,0x24, -0x02,0x59,0x72,0x24, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xFA,0x58,0x54,0x24, -0x26,0x1E,0x00,0x08, -0x06,0x59,0x75,0x24, -0xDD,0x00,0x02,0x24, -0x21,0x20,0x14,0x02, -0x2B,0x00,0x62,0x10, -0x10,0x00,0xA5,0x27, -0x21,0x10,0x11,0x02, -0x01,0x00,0x43,0x90, -0x30,0x1F,0x64,0x26, -0xC4,0x39,0x82,0x8C, -0x21,0x18,0x70,0x00, -0x02,0x00,0x70,0x24, -0x2B,0x10,0x02,0x02, -0x17,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x21,0x10,0x11,0x02, -0x00,0x00,0x43,0x90, -0x30,0x00,0x02,0x24, -0x21,0x20,0x12,0x02, -0x20,0x00,0xA5,0x27, -0xED,0xFF,0x62,0x14, -0x04,0x00,0x06,0x24, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEE,0xFF,0x40,0x14, -0x21,0x10,0x11,0x02, -0x01,0x00,0x03,0x24, -0x40,0x00,0xBF,0x8F, -0x3C,0x00,0xB5,0x8F, -0x38,0x00,0xB4,0x8F, -0x34,0x00,0xB3,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0x40,0x00,0xBF,0x8F, -0x3C,0x00,0xB5,0x8F, -0x38,0x00,0xB4,0x8F, -0x34,0x00,0xB3,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x21,0x18,0x00,0x00, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0x20,0x15,0x02, -0x18,0x00,0xA5,0x27, -0xD1,0xFF,0x40,0x14, -0x04,0x00,0x06,0x24, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xCE,0xFF,0x40,0x14, -0x21,0x10,0x11,0x02, -0x32,0x1E,0x00,0x08, -0x01,0x00,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x38,0x5D,0x43,0x94, -0x00,0x00,0x00,0x00, -0x80,0x18,0x03,0x00, -0xB8,0x0B,0x62,0x28, -0x04,0x00,0x40,0x14, -0xB8,0x0B,0x04,0x24, -0x21,0x4E,0x62,0x28, -0x20,0x4E,0x04,0x24, -0x0B,0x20,0x62,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0x21,0x38,0x80,0x00, -0x08,0x00,0xC0,0x10, -0xFF,0xFF,0xC3,0x24, -0xFF,0xFF,0x06,0x24, -0x00,0x00,0xA2,0x8C, -0xFF,0xFF,0x63,0x24, -0x04,0x00,0xA5,0x24, -0x00,0x00,0xE2,0xAC, -0xFB,0xFF,0x66,0x14, -0x04,0x00,0xE7,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0x25,0xB0,0x03,0x3C, -0xD8,0xFF,0xBD,0x27, -0x20,0x00,0xBF,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x94,0x0E,0x65,0x34, -0x9C,0x0E,0x66,0x34, -0xA4,0x0E,0x67,0x34, -0xAC,0x0E,0x68,0x34, -0x02,0x80,0x02,0x3C, -0x00,0x00,0xA9,0x8C, -0x30,0x1F,0x58,0x24, -0x00,0x00,0xCC,0x8C, -0x00,0x00,0xF1,0x8C, -0x00,0x00,0x05,0x8D, -0x0C,0x00,0x07,0x8F, -0x10,0x00,0x08,0x8F, -0xFF,0x03,0x0A,0x3C, -0xB4,0x0E,0x62,0x34, -0x00,0x00,0x4B,0x8C, -0x24,0x48,0x2A,0x01, -0x00,0xFC,0x02,0x24, -0x24,0x28,0xAA,0x00, -0xBC,0x0E,0x66,0x34, -0x24,0x40,0x02,0x01, -0x02,0x4C,0x09,0x00, -0x24,0x38,0xE2,0x00, -0x02,0x2C,0x05,0x00, -0xF0,0xFF,0x02,0x3C, -0x00,0x00,0xD0,0x8C, -0xFF,0x03,0x42,0x34, -0xCC,0x0E,0x66,0x34, -0x25,0x38,0xE9,0x00, -0xC4,0x0E,0x63,0x34, -0x25,0x40,0x05,0x01, -0x08,0x00,0x0D,0x8F, -0x00,0x00,0x6F,0x8C, -0x24,0x40,0x02,0x01, -0x00,0x00,0xCE,0x8C, -0x24,0x38,0xE2,0x00, -0x24,0x60,0x8A,0x01, -0x24,0x58,0x6A,0x01, -0xFF,0x9F,0x02,0x3C, -0x82,0x61,0x0C,0x00, -0x82,0x59,0x0B,0x00, -0xFF,0xFF,0x42,0x34, -0x0F,0xC0,0x05,0x3C, -0xFF,0xFF,0xA5,0x34, -0x25,0x38,0xEC,0x00, -0x25,0x40,0x0B,0x01, -0x24,0x68,0xA2,0x01, -0xFF,0x00,0x0B,0x3C, -0x00,0xFF,0x82,0x30, -0x24,0x88,0x2A,0x02, -0x24,0x80,0x0A,0x02, -0x24,0x18,0x8B,0x00, -0x24,0x40,0x05,0x01, -0x21,0x48,0x80,0x00, -0x02,0x62,0x02,0x00, -0x24,0x38,0xE5,0x00, -0x00,0x20,0x02,0x3C, -0x24,0x70,0xCA,0x01, -0x00,0x89,0x11,0x00, -0x00,0x81,0x10,0x00, -0x24,0x78,0xEA,0x01, -0x00,0xFF,0x6B,0x35, -0x25,0x68,0xA2,0x01, -0x02,0x1C,0x03,0x00, -0x02,0x80,0x04,0x3C, -0x25,0x38,0xF1,0x00, -0x25,0x40,0x10,0x01, -0x02,0x7C,0x0F,0x00, -0x02,0x74,0x0E,0x00, -0x24,0x48,0x2B,0x01, -0xDC,0xE3,0x84,0x24, -0x21,0x28,0x80,0x01, -0x21,0x30,0x60,0x00, -0x12,0x00,0x02,0x24, -0x08,0x00,0x0D,0xAF, -0x0C,0x00,0x07,0xAF, -0x10,0x00,0x08,0xAF, -0x14,0x00,0x0F,0xA7, -0x0A,0x00,0x20,0x15, -0x16,0x00,0x0E,0xA7, -0x10,0x00,0xA4,0x27, -0xC7,0x02,0x02,0xA3, -0xC8,0x5C,0x00,0x0C, -0xC3,0x02,0x02,0xA3, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xC7,0x02,0x03,0xA3, -0x2F,0x55,0x00,0x0C, -0xC3,0x02,0x0C,0xA3, -0xC8,0x5C,0x00,0x0C, -0x10,0x00,0xA4,0x27, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x28,0x00,0xB6,0xAF, -0x25,0xB0,0x02,0x3C, -0x00,0x80,0x16,0x3C, -0x48,0x7B,0xC3,0x26, -0x18,0x03,0x42,0x34, -0x30,0x00,0xBE,0xAF, -0x2C,0x00,0xB7,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x34,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x43,0xAC, -0x21,0x98,0x00,0x00, -0x02,0x80,0x15,0x3C, -0x00,0x80,0x1E,0x3C, -0x02,0x80,0x14,0x3C, -0x02,0x80,0x17,0x3C, -0x25,0xB0,0x10,0x3C, -0x18,0x03,0x02,0x36, -0x48,0x7B,0xC3,0x26, -0x00,0x00,0x43,0xAC, -0x30,0x1F,0xB1,0x26, -0x7C,0x36,0x24,0x96, -0x70,0x03,0x05,0x36, -0x00,0x00,0xB2,0x8C, -0x01,0x00,0x84,0x24, -0x03,0x00,0x40,0x12, -0x7C,0x36,0x24,0xA6, -0x01,0x00,0x62,0x26, -0xFF,0xFF,0x53,0x30, -0xFF,0x00,0x04,0x3C, -0xFF,0xFF,0x82,0x34, -0x2B,0x10,0x52,0x00, -0x47,0x00,0x40,0x10, -0x00,0x50,0x62,0x2E, -0x00,0xFF,0x06,0x3C, -0xFF,0x00,0xC2,0x34, -0x00,0xFD,0x05,0x3C, -0x24,0x18,0x42,0x02, -0x29,0x00,0xA2,0x34, -0xA7,0x01,0x62,0x10, -0x2B,0x10,0x43,0x00, -0x46,0x00,0x40,0x14, -0xAC,0x00,0xA2,0x34, -0x00,0xF2,0x06,0x3C, -0x01,0x00,0xC2,0x34, -0xB8,0x01,0x62,0x10, -0x2B,0x10,0x43,0x00, -0x7D,0x00,0x40,0x14, -0x07,0x00,0xA2,0x34, -0x00,0xF0,0x05,0x3C, -0x03,0x00,0xA2,0x34, -0xD5,0x01,0x62,0x10, -0x2B,0x10,0x43,0x00, -0xC8,0x00,0x40,0x14, -0x00,0xF1,0x07,0x3C, -0x21,0x02,0x65,0x10, -0x00,0xFF,0x82,0x34, -0x2B,0x10,0xA3,0x00, -0x48,0x01,0x40,0x14, -0x01,0x00,0xA2,0x34, -0x00,0xE0,0x02,0x3C, -0x73,0x01,0x62,0x10, -0x00,0xFF,0x48,0x32, -0x25,0xB0,0x02,0x3C, -0x70,0x03,0x42,0x34, -0x21,0x98,0x00,0x00, -0x00,0x00,0x40,0xAC, -0x25,0xB0,0x04,0x3C, -0x18,0x03,0x82,0x34, -0x48,0x7C,0xC3,0x27, -0x00,0x00,0x43,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x6C,0x57,0x82,0x8E, -0x6C,0x57,0x83,0x26, -0x10,0x00,0x43,0x10, -0x02,0x80,0x02,0x3C, -0xBF,0x00,0x92,0x34, -0x30,0x1F,0x51,0x24, -0x21,0x80,0x60,0x00, -0x00,0x00,0x42,0x92, -0x00,0x00,0x00,0x00, -0x04,0x00,0x42,0x2C, -0x08,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x3C,0x38,0x24,0x8E, -0xB4,0x08,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x6C,0x57,0x83,0x8E, -0x00,0x00,0x00,0x00, -0xF5,0xFF,0x70,0x14, -0x00,0x00,0x00,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x21,0x28,0x00,0x00, -0x08,0x10,0xE4,0x26, -0x21,0x30,0x00,0x00, -0x91,0x3C,0x00,0x0C, -0x21,0x38,0x00,0x00, -0xE8,0x1E,0x00,0x08, -0x25,0xB0,0x10,0x3C, -0xDA,0xFF,0x40,0x14, -0x74,0x03,0x03,0x36, -0xFF,0xFF,0x02,0x24, -0x21,0x98,0x00,0x00, -0x00,0x00,0xA0,0xAC, -0x00,0x00,0x62,0xAC, -0x1B,0x1F,0x00,0x08, -0x25,0xB0,0x04,0x3C, -0x84,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0x1E,0x00,0x40,0x14, -0x00,0xFE,0x07,0x3C, -0xA4,0x00,0xA2,0x34, -0x8F,0x01,0x62,0x10, -0x2B,0x10,0x43,0x00, -0x47,0x00,0x40,0x14, -0xA7,0x00,0xA2,0x34, -0xA1,0x00,0xA2,0x34, -0xEA,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0xAD,0x00,0x40,0x14, -0xA2,0x00,0xA2,0x34, -0xA0,0x00,0xA2,0x34, -0xBE,0xFF,0x62,0x14, -0x25,0xB0,0x02,0x3C, -0x00,0x0F,0x42,0x32, -0x02,0x22,0x02,0x00, -0x01,0x00,0x03,0x24, -0x96,0x02,0x83,0x10, -0x00,0x00,0x00,0x00, -0x02,0x00,0x02,0x24, -0x8F,0x02,0x82,0x10, -0x00,0x00,0x00,0x00, -0x03,0x00,0x02,0x24, -0x88,0x02,0x82,0x10, -0x00,0x00,0x00,0x00, -0xCD,0x5A,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x12,0x00,0xE2,0x34, -0x65,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0x37,0x00,0x40,0x14, -0x1A,0x00,0xE2,0x34, -0xAF,0x00,0xA2,0x34, -0xC8,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0x97,0x00,0x40,0x14, -0x10,0x00,0xE2,0x34, -0xAD,0x00,0xA2,0x34, -0x44,0x02,0x62,0x10, -0x00,0x00,0x00,0x00, -0xAE,0x00,0xA2,0x34, -0x9C,0xFF,0x62,0x14, -0x02,0x24,0x12,0x00, -0x00,0xFF,0x45,0x32, -0xFF,0x00,0x84,0x30, -0x58,0x5A,0x00,0x0C, -0x02,0x2A,0x05,0x00, -0x25,0xB0,0x03,0x3C, -0x74,0x03,0x63,0x34, -0x00,0x00,0x62,0xA0, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x73,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0x35,0x00,0x40,0x14, -0x18,0x00,0xA2,0x34, -0x00,0xF8,0x04,0x3C, -0x16,0x00,0x82,0x34, -0xB6,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0x90,0x00,0x40,0x14, -0x17,0x00,0x82,0x34, -0x15,0x00,0x82,0x34, -0x84,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0xA7,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x6A,0x01,0x62,0x10, -0x2B,0x10,0x43,0x00, -0xB7,0x00,0x40,0x14, -0xAA,0x00,0xA2,0x34, -0xA5,0x00,0xA2,0x34, -0x35,0x02,0x62,0x10, -0x24,0x20,0x44,0x02, -0xA6,0x00,0xA2,0x34, -0x76,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0xF7,0x5B,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x75,0x01,0x62,0x10, -0x2B,0x10,0x43,0x00, -0x80,0x00,0x40,0x14, -0x0F,0x00,0xC2,0x34, -0x18,0x00,0xE2,0x34, -0xC1,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x19,0x00,0xE2,0x34, -0x68,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xA2,0x26, -0x2A,0x1C,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x74,0x03,0x63,0x34, -0x00,0x00,0x64,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x3E,0x01,0x62,0x10, -0x2B,0x10,0x43,0x00, -0x74,0x00,0x40,0x14, -0x19,0x00,0xA2,0x34, -0x14,0x00,0xA2,0x34, -0x96,0x01,0x62,0x10, -0x17,0x00,0xA2,0x34, -0x51,0xFF,0x62,0x14, -0x25,0xB0,0x04,0x3C, -0x68,0x03,0x85,0x34, -0x00,0x00,0xA3,0x8C, -0x00,0xFF,0x42,0x32, -0x00,0x12,0x02,0x00, -0xFF,0xFF,0x73,0x30, -0x25,0x10,0x53,0x00, -0x00,0x00,0xA2,0xAC, -0x64,0x03,0x84,0x34, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x53,0x30, -0x40,0x00,0x63,0x36, -0x00,0x00,0x83,0xA0, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x02,0x00,0xE2,0x34, -0x3F,0xFF,0x62,0x10, -0x2B,0x10,0x43,0x00, -0x9B,0x00,0x40,0x14, -0x04,0x00,0xE2,0x34, -0x08,0x00,0xA2,0x34, -0xA3,0x01,0x62,0x10, -0x00,0xFF,0x42,0x32, -0x38,0xFF,0x67,0x14, -0x25,0xB0,0x04,0x3C, -0xFF,0x00,0x05,0x3C, -0x00,0xFF,0xA5,0x34, -0x24,0x28,0x45,0x02, -0x02,0x2A,0x05,0x00, -0x94,0x00,0x83,0x34, -0x40,0x11,0x05,0x00, -0x26,0xB0,0x06,0x3C, -0x00,0x00,0x65,0xA4, -0xC0,0xFF,0x53,0x24, -0x7C,0x00,0xCC,0x34, -0x04,0x00,0x07,0x24, -0x9A,0x00,0x88,0x34, -0x98,0x00,0x89,0x34, -0x96,0x00,0x8A,0x34, -0x7A,0x00,0xC6,0x34, -0xB0,0x03,0x8B,0x34, -0x00,0x04,0x02,0x24, -0xA0,0x00,0x03,0x24, -0x00,0x00,0x02,0xA5, -0x44,0x00,0x84,0x34, -0x00,0x00,0x23,0xA5, -0x00,0x00,0x47,0xA5, -0x00,0x00,0xC7,0xA0, -0x00,0x00,0x73,0xAD, -0x00,0x00,0x93,0xA5, -0x00,0x00,0x83,0x94, -0xFF,0xFD,0x02,0x24, -0x30,0x1F,0xA6,0x26, -0x24,0x18,0x62,0x00, -0x00,0x00,0x83,0xA4, -0x00,0x00,0x82,0x94, -0xBA,0x1B,0xC5,0xA4, -0x00,0x02,0x42,0x34, -0x00,0x00,0x82,0xA4, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xBF,0x01,0x62,0x10, -0x25,0xB0,0x02,0x3C, -0xA3,0x00,0xA2,0x34, -0x10,0xFF,0x62,0x14, -0x25,0xB0,0x02,0x3C, -0x30,0x1F,0xA2,0x26, -0x16,0x1F,0x00,0x08, -0x30,0x38,0x40,0xAC, -0x3A,0x01,0x62,0x10, -0x11,0x00,0xE2,0x34, -0x08,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xFF,0x00,0x04,0x3C, -0x00,0xFF,0x84,0x34, -0x24,0x20,0x44,0x02, -0x30,0x1F,0xA2,0x26, -0x02,0x22,0x04,0x00, -0xC2,0x34,0x00,0x0C, -0x2A,0x1C,0x40,0xA0, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x9F,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0x18,0x00,0x82,0x34, -0xF3,0xFE,0x62,0x14, -0x00,0x00,0x00,0x00, -0x0A,0x23,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x4E,0x01,0x62,0x10, -0x10,0x00,0xC2,0x34, -0xEC,0xFE,0x62,0x14, -0x25,0xB0,0x02,0x3C, -0x00,0xFF,0x43,0x32, -0x00,0xFF,0x02,0x34, -0xDA,0xFF,0x62,0x14, -0x30,0x1F,0xA2,0x26, -0x30,0x1F,0xA3,0x26, -0xFF,0xFF,0x02,0x34, -0x16,0x1F,0x00,0x08, -0x30,0x38,0x62,0xAC, -0x96,0x01,0x62,0x10, -0x25,0xB0,0x02,0x3C, -0x28,0x00,0xA2,0x34, -0xDE,0xFE,0x62,0x14, -0x0F,0x00,0x10,0x3C, -0xFF,0xFF,0x05,0x36, -0x60,0x00,0x06,0x24, -0x5F,0x47,0x00,0x0C, -0x24,0x00,0x04,0x24, -0x25,0x22,0x00,0x0C, -0xE8,0x03,0x04,0x24, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x24,0x00,0x04,0x24, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x05,0x36, -0x1F,0x00,0x53,0x30, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x25,0xB0,0x02,0x3C, -0x74,0x03,0x42,0x34, -0x00,0x00,0x53,0xA0, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x84,0x01,0x62,0x10, -0x00,0x00,0x00,0x00, -0xAB,0x00,0xA2,0x34, -0xC1,0xFE,0x62,0x14, -0x00,0x00,0x00,0x00, -0xE6,0x5F,0x00,0x0C, -0x21,0x20,0x40,0x02, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x4C,0x01,0x62,0x10, -0x25,0xB0,0x02,0x3C, -0x02,0x00,0xA2,0x34, -0xB9,0xFE,0x62,0x14, -0x25,0xB0,0x02,0x3C, -0x02,0x14,0x12,0x00, -0x00,0xFF,0x43,0x32, -0xFF,0x00,0x45,0x30, -0x04,0x00,0xA0,0x10, -0x02,0x92,0x03,0x00, -0x01,0x00,0x02,0x24, -0x02,0x00,0xA2,0x10, -0x01,0x00,0x04,0x24, -0x21,0x20,0x00,0x00, -0xE6,0x44,0x00,0x0C, -0x0F,0x00,0x10,0x3C, -0xFF,0xFF,0x05,0x36, -0x8A,0x47,0x00,0x0C, -0x21,0x20,0x40,0x02, -0xFF,0xFF,0x10,0x36, -0x24,0x98,0x50,0x00, -0x25,0xB0,0x02,0x3C, -0x74,0x03,0x42,0x34, -0x00,0x00,0x53,0xAC, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x15,0x01,0x62,0x10, -0x24,0x10,0x44,0x02, -0xA0,0xFE,0x66,0x14, -0x25,0xB0,0x02,0x3C, -0x25,0xB0,0x05,0x3C, -0x74,0x03,0xA3,0x34, -0x00,0x00,0x64,0x8C, -0xFF,0x0F,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x90,0x82,0x00, -0x01,0x00,0x03,0x3C, -0x2B,0x18,0x72,0x00, -0x95,0xFE,0x60,0x10, -0x00,0xB0,0x02,0x3C, -0x25,0x90,0x42,0x02, -0x00,0x00,0x53,0x8E, -0x78,0x03,0xA2,0x34, -0x00,0x00,0x53,0xAC, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x02,0x1A,0x08,0x00, -0xFF,0x00,0x02,0x24, -0x56,0x01,0x62,0x10, -0x25,0xB0,0x05,0x3C, -0x0E,0x00,0x60,0x14, -0x00,0xCC,0x02,0x34, -0x25,0xB0,0x04,0x3C, -0x64,0x03,0x84,0x34, -0x30,0x1F,0xA7,0x26, -0x00,0x00,0x85,0x94, -0xE4,0x02,0xE6,0x8C, -0xFF,0xCF,0x02,0x3C, -0xFF,0xFE,0x03,0x24, -0xFF,0xFF,0x42,0x34, -0x24,0x28,0xA3,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x00,0x85,0xA4, -0xE4,0x02,0xE6,0xAC, -0x00,0xCC,0x02,0x34, -0x7B,0xFE,0x02,0x15, -0x25,0xB0,0x02,0x3C, -0x30,0x1F,0xA5,0x26, -0xE4,0x02,0xA3,0x8C, -0xFF,0xCF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x00,0x10,0x04,0x3C, -0x25,0x18,0x64,0x00, -0x16,0x1F,0x00,0x08, -0xE4,0x02,0xA3,0xAC, -0x02,0x14,0x12,0x00, -0x00,0x1F,0x43,0x32, -0x02,0x9A,0x03,0x00, -0x3F,0x00,0x42,0x30, -0xC1,0x02,0x22,0xA2, -0xBC,0x02,0x33,0xA2, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x76,0x2C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0x98,0x40,0x00, -0x74,0x03,0x02,0x36, -0x00,0x00,0x53,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x03,0x00,0x22,0x92, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x16,0x1F,0x00,0x08, -0x03,0x00,0x22,0xA2, -0x74,0x03,0x03,0x36, -0x00,0x00,0x64,0x8C, -0xFF,0x0F,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x90,0x82,0x00, -0x01,0x00,0x03,0x3C, -0x2B,0x18,0x72,0x00, -0x51,0xFE,0x60,0x10, -0x78,0x03,0x02,0x36, -0x00,0x00,0x53,0x8C, -0x00,0xB0,0x03,0x3C, -0x25,0x90,0x43,0x02, -0x00,0x00,0x53,0xAE, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xBE,0x59,0x00,0x0C, -0x21,0x20,0x40,0x02, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x00,0xFF,0x82,0x34, -0x24,0x10,0x42,0x02, -0x02,0x2A,0x02,0x00, -0x2B,0x1C,0x25,0xA2, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xFF,0xFF,0x02,0x34, -0x16,0x1F,0x00,0x08, -0x30,0x38,0x22,0xAE, -0x24,0x10,0x44,0x02, -0x00,0xFF,0x43,0x32, -0x02,0x2C,0x02,0x00, -0x04,0x00,0xA0,0x10, -0x02,0x92,0x03,0x00, -0x01,0x00,0x02,0x24, -0x02,0x00,0xA2,0x10, -0x01,0x00,0x04,0x24, -0x21,0x20,0x00,0x00, -0x25,0xB0,0x10,0x3C, -0xE6,0x44,0x00,0x0C, -0x74,0x03,0x10,0x36, -0x00,0x00,0x13,0x8E, -0x0F,0x00,0x11,0x3C, -0x21,0x20,0x40,0x02, -0x21,0x30,0x60,0x02, -0x5F,0x47,0x00,0x0C, -0xFF,0xFF,0x25,0x36, -0x21,0x20,0x40,0x02, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x25,0x36, -0x00,0x00,0x02,0xAE, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x85,0x5F,0x00,0x0C, -0x21,0x20,0x40,0x02, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x08,0x00,0x23,0x8E, -0xFF,0x9F,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x16,0x1F,0x00,0x08, -0x08,0x00,0x23,0xAE, -0x00,0xFF,0x42,0x32, -0x24,0x18,0x44,0x02, -0x02,0x9A,0x02,0x00, -0x01,0x00,0x02,0x24, -0x95,0x00,0x62,0x12, -0x02,0x1C,0x03,0x00, -0x02,0x00,0x02,0x24, -0xA9,0x00,0x62,0x12, -0xC0,0x10,0x03,0x00, -0x03,0x00,0x02,0x24, -0x09,0xFE,0x62,0x16, -0xC0,0x10,0x03,0x00, -0x21,0x10,0x43,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x02,0x80,0x04,0x3C, -0x4C,0x43,0x83,0x24, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x25,0xB0,0x03,0x3C, -0x74,0x03,0x63,0x34, -0x00,0x00,0x64,0xAC, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0xFF,0x82,0x34, -0x24,0x10,0x42,0x02, -0x02,0x2A,0x02,0x00, -0x01,0x00,0x03,0x24, -0x77,0x00,0xA3,0x10, -0x74,0x03,0x02,0x36, -0x02,0x00,0xA2,0x28, -0xB7,0x00,0x40,0x14, -0x03,0x00,0x02,0x24, -0x06,0x00,0xA2,0x10, -0x00,0x00,0x00,0x00, -0x30,0x1F,0xA2,0x26, -0x24,0x1C,0x44,0x94, -0x25,0xB0,0x03,0x3C, -0x18,0x21,0x00,0x08, -0x74,0x03,0x63,0x34, -0x30,0x1F,0xA2,0x26, -0x26,0x1C,0x44,0x94, -0x25,0xB0,0x03,0x3C, -0x18,0x21,0x00,0x08, -0x74,0x03,0x63,0x34, -0x24,0x10,0x42,0x02, -0x02,0x92,0x02,0x00, -0x21,0x18,0x50,0x02, -0x00,0x00,0x73,0x8C, -0x74,0x03,0x02,0x36, -0x00,0x00,0x53,0xAC, -0x00,0x00,0x73,0x8C, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xA6,0x5A,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x24,0x20,0x44,0x02, -0x56,0x25,0x00,0x0C, -0x02,0x24,0x04,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xD7,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xA3,0x26, -0x2A,0x1C,0x62,0x90, -0x00,0x00,0x00,0x00, -0x6A,0xFE,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0xFF,0x82,0x34, -0x24,0x10,0x42,0x02, -0x02,0x2A,0x02,0x00, -0x01,0x00,0x02,0x24, -0x21,0x20,0xA0,0x00, -0x2A,0x1C,0x62,0xA0, -0xC2,0x34,0x00,0x0C, -0x2B,0x1C,0x65,0xA0, -0x1A,0x20,0x00,0x08, -0x00,0x00,0x00,0x00, -0x00,0xFF,0x82,0x34, -0x24,0x10,0x42,0x02, -0xBB,0xFD,0x40,0x10, -0x25,0xB0,0x02,0x3C, -0x30,0x1F,0xA3,0x26, -0x04,0x03,0x66,0x90, -0x24,0x20,0x44,0x02, -0x00,0xFF,0x45,0x32, -0x02,0x24,0x04,0x00, -0x02,0x2A,0x05,0x00, -0x00,0x01,0xC6,0x34, -0xFB,0xFF,0x87,0x24, -0xFB,0xFF,0xA2,0x24, -0x1F,0x03,0x62,0xA0, -0x04,0x03,0x66,0xAC, -0x1D,0x03,0x67,0xA0, -0x1C,0x03,0x64,0xA0, -0x16,0x1F,0x00,0x08, -0x1E,0x03,0x65,0xA0, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x30,0x1F,0xA2,0x26, -0x2B,0x1C,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x74,0x03,0x63,0x34, -0x00,0x00,0x64,0xAC, -0xB8,0x1F,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0xFF,0x00,0x02,0x24, -0x56,0x01,0x63,0x34, -0x00,0x00,0x62,0xA4, -0x01,0x00,0x04,0x24, -0x02,0x80,0x02,0x3C, -0x16,0x1F,0x00,0x08, -0x08,0x5E,0x44,0xA0, -0x02,0x92,0x02,0x00, -0x05,0x00,0x40,0x12, -0x21,0x20,0x00,0x00, -0x01,0x00,0x02,0x24, -0x02,0x00,0x42,0x12, -0x01,0x00,0x04,0x24, -0x21,0x20,0x00,0x00, -0xE6,0x44,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x02,0x9C,0x02,0x00, -0x00,0xFF,0x43,0x32, -0x07,0x00,0x62,0x2E, -0x88,0xFD,0x40,0x10, -0x02,0x2A,0x03,0x00, -0x02,0x80,0x04,0x3C, -0x50,0xED,0x83,0x24, -0x80,0x10,0x13,0x00, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x22,0x1C,0x23,0x96, -0x00,0x00,0x00,0x00, -0x00,0x00,0x43,0xAC, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xC0,0x10,0x03,0x00, -0x21,0x10,0x43,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x51,0x00, -0x14,0x24,0x44,0x8C, -0x74,0x03,0x03,0x36, -0x00,0x00,0x64,0xAC, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0xFF,0x83,0x34, -0x74,0x03,0x44,0x34, -0x00,0x00,0x93,0x8C, -0x24,0x18,0x43,0x02, -0x02,0x92,0x03,0x00, -0x21,0x10,0x42,0x02, -0x00,0x00,0x53,0xAC, -0x00,0x00,0x53,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x93,0xAC, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x21,0x10,0x43,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x51,0x00, -0x18,0x24,0x44,0x8C, -0xA4,0x21,0x00,0x08, -0x74,0x03,0x03,0x36, -0xCD,0x59,0x00,0x0C, -0x21,0x20,0x40,0x02, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x3D,0x23,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x74,0x03,0x42,0x34, -0x00,0x00,0x45,0x8C, -0x00,0xFF,0x84,0x34, -0x24,0x20,0x44,0x02, -0xC1,0x5B,0x00,0x0C, -0x02,0x22,0x04,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x70,0x03,0x42,0x34, -0x21,0x20,0x40,0x02, -0x00,0x00,0x40,0xAC, -0x6B,0x1E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xF5,0x5B,0x00,0x0C, -0x02,0x24,0x04,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x60,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x4B,0xFF,0xA0,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0xA2,0x26, -0x20,0x1C,0x44,0x94, -0x25,0xB0,0x03,0x3C, -0x18,0x21,0x00,0x08, -0x74,0x03,0x63,0x34, -0x64,0x03,0xA5,0x34, -0x30,0x1F,0xA6,0x26, -0x00,0x00,0xA3,0x94, -0xE4,0x02,0xC4,0x8C, -0xFF,0xCF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x20,0x82,0x00, -0x00,0x01,0x63,0x34, -0x00,0x00,0xA3,0xA4, -0x9A,0x20,0x00,0x08, -0xE4,0x02,0xC4,0xAC, -0xCD,0x5A,0x00,0x0C, -0x03,0x00,0x04,0x24, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xCD,0x5A,0x00,0x0C, -0x02,0x00,0x04,0x24, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0xCD,0x5A,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x19,0x05,0x00, -0x30,0x1F,0xA2,0x26, -0x21,0x18,0x62,0x00, -0x36,0x03,0x64,0x94, -0x25,0xB0,0x02,0x3C, -0x74,0x03,0x42,0x34, -0x00,0x00,0x44,0xAC, -0x17,0x1F,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x19,0x05,0x00, -0x30,0x1F,0xA2,0x26, -0x21,0x18,0x62,0x00, -0x35,0x03,0x64,0x90, -0xFD,0x21,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x19,0x05,0x00, -0x30,0x1F,0xA2,0x26, -0x21,0x18,0x62,0x00, -0x34,0x03,0x64,0x90, -0xFD,0x21,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x19,0x05,0x00, -0x30,0x1F,0xA2,0x26, -0x21,0x18,0x62,0x00, -0x32,0x03,0x64,0x94, -0xFD,0x21,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x19,0x05,0x00, -0x30,0x1F,0xA2,0x26, -0x21,0x18,0x62,0x00, -0x30,0x03,0x64,0x94, -0xFD,0x21,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x00,0x11,0x05,0x00, -0x30,0x1F,0xA3,0x26, -0x21,0x10,0x43,0x00, -0x2C,0x03,0x44,0x8C, -0xFC,0x21,0x00,0x08, -0x42,0x26,0x04,0x00, -0x00,0x11,0x05,0x00, -0x30,0x1F,0xA3,0x26, -0x21,0x10,0x43,0x00, -0x2F,0x03,0x44,0x90, -0xFC,0x21,0x00,0x08, -0x01,0x00,0x84,0x30, -0x01,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x18,0x03,0x42,0x34, -0x94,0x88,0x63,0x24, -0x00,0x00,0x43,0xAC, -0x02,0x80,0x05,0x3C, -0xD4,0x5E,0xA5,0x8C, -0x04,0x00,0x02,0x24, -0x1E,0x00,0xA2,0x10, -0x05,0x00,0xA2,0x2C, -0x10,0x00,0x40,0x10, -0x05,0x00,0x02,0x24, -0x03,0x00,0x02,0x24, -0x08,0x00,0xA2,0x10, -0x00,0x19,0x04,0x00, -0x80,0x10,0x04,0x00, -0x21,0x10,0x44,0x00, -0xC0,0x10,0x02,0x00, -0x23,0x10,0x44,0x00, -0x00,0x11,0x02,0x00, -0x21,0x10,0x44,0x00, -0x40,0x19,0x02,0x00, -0xFF,0xFF,0x63,0x24, -0xFE,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xF3,0xFF,0xA2,0x10, -0x06,0x00,0x02,0x24, -0xF2,0xFF,0xA2,0x14, -0x80,0x10,0x04,0x00, -0x40,0x11,0x04,0x00, -0x23,0x10,0x44,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x44,0x00, -0x00,0x19,0x02,0x00, -0x23,0x18,0x62,0x00, -0x3B,0x22,0x00,0x08, -0x00,0x19,0x03,0x00, -0x80,0x10,0x04,0x00, -0x21,0x10,0x44,0x00, -0xC0,0x10,0x02,0x00, -0x23,0x10,0x44,0x00, -0x00,0x11,0x02,0x00, -0x21,0x10,0x44,0x00, -0x3B,0x22,0x00,0x08, -0x00,0x19,0x02,0x00, -0x01,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x50,0x89,0x63,0x24, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x02,0x80,0x05,0x3C, -0xD4,0x5E,0xA3,0x8C, -0x05,0x00,0x02,0x24, -0x06,0x00,0x62,0x10, -0x06,0x00,0x62,0x2C, -0x0C,0x00,0x40,0x10, -0x06,0x00,0x02,0x24, -0x04,0x00,0x02,0x24, -0x0E,0x00,0x62,0x10, -0x80,0x10,0x04,0x00, -0x80,0x10,0x04,0x00, -0x21,0x10,0x44,0x00, -0x80,0x10,0x02,0x00, -0xFF,0xFF,0x42,0x24, -0xFE,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xF7,0xFF,0x62,0x14, -0x00,0x11,0x04,0x00, -0x23,0x10,0x44,0x00, -0x66,0x22,0x00,0x08, -0x40,0x10,0x02,0x00, -0x21,0x10,0x44,0x00, -0x66,0x22,0x00,0x08, -0x40,0x10,0x02,0x00, -0xFF,0xFF,0x85,0x30, -0x21,0x30,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0x2A,0xB0,0x04,0x3C, -0xB4,0x00,0x63,0x34, -0x01,0x00,0xA2,0x24, -0x31,0x00,0x84,0x34, -0x00,0x00,0x65,0xA0, -0x00,0x00,0x85,0xA0, -0xFF,0xFF,0x45,0x30, -0x12,0x00,0xA0,0x10, -0x01,0x00,0x03,0x24, -0x28,0xB0,0x07,0x3C, -0x88,0x22,0x00,0x08, -0xFF,0xFF,0x08,0x24, -0x00,0x00,0x83,0xA0, -0x01,0x00,0x63,0x24, -0xFF,0xFF,0x63,0x30, -0x2B,0x10,0xA3,0x00, -0x09,0x00,0x40,0x14, -0x08,0x00,0xC6,0x24, -0xF9,0xFF,0x65,0x14, -0x21,0x20,0xC7,0x00, -0x01,0x00,0x63,0x24, -0xFF,0xFF,0x63,0x30, -0x2B,0x10,0xA3,0x00, -0x00,0x00,0x88,0xA0, -0xF9,0xFF,0x40,0x10, -0x08,0x00,0xC6,0x24, -0x00,0x01,0xA2,0x2C, -0x13,0x00,0x40,0x10, -0x21,0x18,0xA0,0x00, -0xFF,0x00,0x08,0x24, -0x28,0xB0,0x07,0x3C, -0x9C,0x22,0x00,0x08, -0xFF,0xFF,0x09,0x24, -0xFF,0xFF,0x43,0x30, -0x00,0x00,0xA2,0xA0, -0x00,0x01,0x62,0x2C, -0x0A,0x00,0x40,0x10, -0x08,0x00,0xC6,0x24, -0x01,0x00,0x62,0x24, -0xF9,0xFF,0x68,0x14, -0x21,0x28,0xC7,0x00, -0x00,0x01,0x02,0x24, -0xFF,0xFF,0x43,0x30, -0x00,0x01,0x62,0x2C, -0x00,0x00,0xA9,0xA0, -0xF8,0xFF,0x40,0x14, -0x08,0x00,0xC6,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xD0,0xFF,0xBD,0x27, -0x2C,0x00,0xBF,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x25,0xB0,0x10,0x3C, -0x40,0x00,0x03,0x36, -0x00,0x00,0x60,0xA4, -0xA8,0x00,0x13,0x36, -0xA0,0x00,0x12,0x36, -0xA4,0x00,0x10,0x36, -0x00,0x00,0x55,0x8E, -0x00,0x00,0x16,0x8E, -0x00,0x00,0x71,0x8E, -0x00,0x80,0x14,0x3C, -0xFC,0x37,0x02,0x24, -0x00,0x00,0x40,0xAE, -0xFD,0x00,0x04,0x24, -0x00,0x00,0x00,0xAE, -0x21,0x88,0x34,0x02, -0x00,0x00,0x74,0xAE, -0x00,0x00,0x62,0xA4, -0x73,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x55,0xAE, -0x00,0x00,0x16,0xAE, -0x00,0x00,0x71,0xAE, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x2C,0x00,0xBF,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x25,0xB0,0x10,0x3C, -0x40,0x00,0x05,0x36, -0x00,0x00,0xA2,0x94, -0x24,0xFA,0x03,0x24, -0xA8,0x00,0x13,0x36, -0x24,0x10,0x43,0x00, -0x00,0x00,0xA2,0xA4, -0xA0,0x00,0x12,0x36, -0xA4,0x00,0x10,0x36, -0x00,0x00,0x55,0x8E, -0x00,0x00,0x16,0x8E, -0x00,0x00,0x71,0x8E, -0x00,0x80,0x14,0x3C, -0xFC,0x37,0x02,0x24, -0x00,0x00,0x40,0xAE, -0xFD,0x00,0x04,0x24, -0x00,0x00,0x00,0xAE, -0x21,0x88,0x34,0x02, -0x00,0x00,0x74,0xAE, -0x00,0x00,0xA2,0xA4, -0x73,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x55,0xAE, -0x00,0x00,0x16,0xAE, -0x00,0x00,0x71,0xAE, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x2C,0x00,0xBF,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x25,0xB0,0x10,0x3C, -0x40,0x00,0x05,0x36, -0x00,0x00,0xA2,0x94, -0xAF,0xFF,0x03,0x24, -0xA8,0x00,0x13,0x36, -0x24,0x10,0x43,0x00, -0x00,0x00,0xA2,0xA4, -0xA0,0x00,0x12,0x36, -0xA4,0x00,0x10,0x36, -0x00,0x00,0x55,0x8E, -0x00,0x00,0x16,0x8E, -0x00,0x00,0x71,0x8E, -0x00,0x80,0x14,0x3C, -0xFC,0x37,0x02,0x24, -0x00,0x00,0x40,0xAE, -0xFD,0x00,0x04,0x24, -0x00,0x00,0x00,0xAE, -0x21,0x88,0x34,0x02, -0x00,0x00,0x74,0xAE, -0x00,0x00,0xA2,0xA4, -0x73,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x55,0xAE, -0x00,0x00,0x16,0xAE, -0x00,0x00,0x71,0xAE, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x25,0xB0,0x04,0x3C, -0x40,0x00,0x84,0x34, -0x00,0x00,0x82,0x94, -0xD8,0xFD,0x03,0x24, -0x24,0x10,0x43,0x00, -0xFC,0x37,0x03,0x24, -0x00,0x00,0x82,0xA4, -0x00,0x00,0x83,0xA4, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x84,0x30, -0xFF,0xFF,0xAC,0x30, -0xC0,0x48,0x04,0x00, -0x00,0x60,0x0E,0x40, -0x01,0x00,0xC1,0x35, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x25,0xB0,0x02,0x3C, -0x40,0x02,0x4D,0x34, -0xF8,0xFF,0xE7,0x24, -0x21,0x40,0x00,0x00, -0x01,0x00,0x0F,0x24, -0x44,0x02,0x4B,0x34, -0x72,0x23,0x00,0x08, -0x01,0x80,0x0A,0x3C, -0x28,0x00,0x0F,0x11, -0x00,0x00,0x00,0x00, -0x01,0x00,0xE2,0x90, -0x00,0x00,0xE4,0x90, -0x02,0x00,0xE3,0x90, -0x03,0x00,0xE5,0x90, -0x00,0x12,0x02,0x00, -0x25,0x20,0x82,0x00, -0x00,0x1C,0x03,0x00, -0x25,0x20,0x83,0x00, -0x21,0x10,0x28,0x01, -0x00,0x2E,0x05,0x00, -0x01,0x00,0x08,0x25, -0x25,0x20,0x85,0x00, -0x25,0x10,0x4A,0x00, -0x06,0x00,0x03,0x2D, -0x00,0x00,0x64,0xAD, -0x04,0x00,0xE7,0x24, -0x00,0x00,0xA2,0xAD, -0x12,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0xEA,0xFF,0x00,0x15, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC2,0x90, -0x01,0x00,0xC3,0x90, -0x04,0x00,0xE7,0x24, -0x00,0x14,0x02,0x00, -0x25,0x10,0x82,0x01, -0x00,0x1E,0x03,0x00, -0x25,0x20,0x43,0x00, -0x21,0x10,0x28,0x01, -0x01,0x00,0x08,0x25, -0x25,0x10,0x4A,0x00, -0x06,0x00,0x03,0x2D, -0x00,0x00,0x64,0xAD, -0x00,0x00,0xA2,0xAD, -0xF0,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x00,0x60,0x8E,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x03,0x00,0xC2,0x90, -0x02,0x00,0xC4,0x90, -0x04,0x00,0xC3,0x90, -0x05,0x00,0xC5,0x90, -0x64,0x23,0x00,0x08, -0x00,0x12,0x02,0x00, -0xFF,0xFF,0x84,0x30, -0x42,0xB0,0x08,0x3C, -0x80,0x10,0x04,0x00, -0x21,0x10,0x48,0x00, -0x04,0x00,0x46,0xAC, -0x00,0x00,0x07,0x91, -0x40,0x18,0x04,0x00, -0x03,0x00,0x06,0x24, -0xFF,0x00,0xE7,0x30, -0x04,0x30,0x66,0x00, -0x01,0x00,0x02,0x24, -0x04,0x10,0x62,0x00, -0x25,0x30,0xC7,0x00, -0xFF,0xFF,0xA5,0x30, -0x25,0x10,0x47,0x00, -0x02,0x00,0xA0,0x14, -0xFF,0x00,0xC7,0x30, -0xFF,0x00,0x47,0x30, -0x42,0xB0,0x02,0x3C, -0x00,0x00,0x47,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x14,0x00,0x83,0x90, -0x01,0x00,0x02,0x24, -0x08,0x00,0x86,0xAC, -0x18,0x00,0x85,0xAC, -0x00,0x00,0x84,0xAC, -0x03,0x00,0x62,0x10, -0x04,0x00,0x84,0xAC, -0x99,0x59,0x00,0x08, -0x0C,0x00,0x80,0xAC, -0x0C,0x00,0x82,0x8C, -0x99,0x59,0x00,0x08, -0x10,0x00,0x82,0xAC, -0xC8,0xFF,0xBD,0x27, -0x28,0x00,0xB6,0xAF, -0x25,0xB0,0x02,0x3C, -0x02,0x80,0x16,0x3C, -0x2C,0x00,0xB7,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x30,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x18,0x03,0x55,0x34, -0x01,0x80,0x17,0x3C, -0x02,0x80,0x13,0x3C, -0x02,0x80,0x14,0x3C, -0x08,0xE4,0xD2,0x26, -0xB8,0x8E,0xE2,0x26, -0x00,0x00,0xA2,0xAE, -0x08,0xE4,0xD0,0x8E, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x14,0x5E,0x71,0x8E, -0x00,0x00,0x00,0x00, -0x25,0x00,0x20,0x12, -0x00,0x00,0x00,0x00, -0x14,0x5E,0x60,0xAE, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x23,0x00,0x12,0x12, -0x08,0x0C,0x84,0x26, -0x14,0x00,0x03,0x92, -0x01,0x00,0x02,0x24, -0x2B,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x60,0x14, -0x02,0x00,0x02,0x24, -0x0C,0x00,0x03,0x8E, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x23,0x02, -0x1E,0x00,0x40,0x10, -0x23,0x10,0x71,0x00, -0x0C,0x00,0x02,0xAE, -0x00,0x00,0x10,0x8E, -0xCE,0x23,0x00,0x08, -0x00,0x00,0x00,0x00, -0xFC,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x0C,0x00,0x03,0x8E, -0x00,0x00,0x00,0x00, -0xF8,0xFF,0x60,0x10, -0x2B,0x10,0x23,0x02, -0xF5,0xFF,0x40,0x14, -0x23,0x10,0x71,0x00, -0x08,0x00,0x02,0x8E, -0x18,0x00,0x04,0x8E, -0x09,0xF8,0x40,0x00, -0x0C,0x00,0x00,0xAE, -0x00,0x00,0x10,0x8E, -0xCE,0x23,0x00,0x08, -0x00,0x00,0x00,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x08,0x0C,0x84,0x26, -0x21,0x28,0x00,0x00, -0x21,0x30,0x00,0x00, -0x91,0x3C,0x00,0x0C, -0x21,0x38,0x00,0x00, -0xC0,0x23,0x00,0x08, -0xB8,0x8E,0xE2,0x26, -0x08,0x00,0x02,0x8E, -0x18,0x00,0x04,0x8E, -0x09,0xF8,0x40,0x00, -0x00,0x00,0x00,0x00, -0xDC,0x23,0x00,0x08, -0x0C,0x00,0x02,0xAE, -0x0C,0x00,0x03,0x8E, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x23,0x02, -0xD9,0xFF,0x40,0x14, -0x23,0x10,0x71,0x00, -0x08,0x00,0x02,0x8E, -0x18,0x00,0x04,0x8E, -0x09,0xF8,0x40,0x00, -0x00,0x00,0x00,0x00, -0x10,0x00,0x03,0x8E, -0x00,0x00,0x00,0x00, -0x0C,0x00,0x03,0xAE, -0x00,0x00,0x10,0x8E, -0xCE,0x23,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x9C,0x57,0x42,0x24, -0xC0,0x20,0x04,0x00, -0x21,0x20,0x82,0x00, -0x21,0x28,0x00,0x00, -0x00,0x60,0x06,0x40, -0x01,0x00,0xC1,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x00,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x09,0x00,0x44,0x10, -0x00,0x00,0x00,0x00, -0x04,0x00,0x43,0x8C, -0x21,0x28,0x40,0x00, -0x00,0x00,0x42,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x62,0xAC, -0x04,0x00,0x43,0xAC, -0x00,0x00,0xA5,0xAC, -0x04,0x00,0xA5,0xAC, -0x00,0x60,0x86,0x40, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x21,0x18,0x80,0x00, -0xE8,0xFF,0xBD,0x27, -0x01,0x01,0x62,0x2C, -0x10,0x00,0xBF,0xAF, -0x01,0x00,0x04,0x24, -0x01,0x02,0x65,0x2C, -0x0A,0x00,0x40,0x14, -0x21,0x30,0x00,0x00, -0x02,0x00,0x04,0x24, -0x07,0x00,0xA0,0x14, -0x01,0x08,0x62,0x2C, -0x05,0x00,0x40,0x14, -0x03,0x00,0x04,0x24, -0x10,0x00,0xBF,0x8F, -0x21,0x10,0xC0,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x0D,0x24,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x10,0x00,0xBF,0x8F, -0x21,0x30,0x40,0x00, -0x21,0x10,0xC0,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x00,0x60,0x06,0x40, -0x01,0x00,0xC1,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x10,0x00,0x83,0x8C, -0x02,0x80,0x02,0x3C, -0x9C,0x57,0x42,0x24, -0xC0,0x18,0x03,0x00, -0x21,0x18,0x62,0x00, -0x00,0x00,0x65,0x8C, -0x02,0x80,0x07,0x3C, -0x02,0x80,0x08,0x3C, -0x00,0x00,0x85,0xAC, -0x04,0x00,0xA4,0xAC, -0x04,0x00,0x83,0xAC, -0xD0,0x5E,0xE5,0x8C, -0x00,0x00,0x00,0x00, -0x05,0x00,0xA0,0x10, -0x00,0x00,0x64,0xAC, -0xBC,0x5E,0x02,0x8D, -0xD0,0x5E,0xE0,0xAC, -0x25,0x10,0x45,0x00, -0xBC,0x5E,0x02,0xAD, -0x00,0x60,0x86,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0x00,0xA5,0x30, -0x25,0xB0,0x02,0x3C, -0x21,0x28,0xA2,0x00, -0xFF,0x00,0x84,0x30, -0x60,0x01,0xA4,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x84,0x30, -0x01,0x00,0x03,0x24, -0x10,0x00,0x02,0x3C, -0x04,0x18,0x83,0x00, -0xF0,0x70,0x42,0x34, -0x15,0x00,0x84,0x2C, -0x06,0x00,0x80,0x10, -0x24,0x28,0x62,0x00, -0x0F,0x00,0x63,0x30, -0x04,0x00,0xA0,0x14, -0x01,0x00,0x02,0x24, -0x02,0x00,0x60,0x14, -0x02,0x00,0x02,0x24, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0x00,0xA5,0x30, -0x04,0x00,0xA2,0x2C, -0x14,0x00,0x40,0x10, -0xFF,0x00,0x84,0x30, -0x02,0x80,0x03,0x3C, -0xDE,0x5D,0x62,0x90, -0x00,0x00,0x00,0x00, -0xEF,0xFF,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x02,0x00,0x42,0x2C, -0x0E,0x00,0x40,0x10, -0x02,0x00,0x03,0x24, -0x24,0x00,0x83,0x10, -0x0F,0x10,0x02,0x3C, -0x03,0x00,0x82,0x28, -0x14,0x00,0x40,0x10, -0x03,0x00,0x02,0x24, -0x01,0x00,0x02,0x24, -0x2F,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0xFF,0x1F,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0xFF,0xFF,0x42,0x34, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x35,0x00,0x83,0x10, -0x0F,0x1F,0x02,0x3C, -0x03,0x00,0x82,0x28, -0x16,0x00,0x40,0x10, -0x03,0x00,0x02,0x24, -0x01,0x00,0x02,0x24, -0xF4,0xFF,0x82,0x14, -0x00,0x00,0x00,0x00, -0x0F,0x1F,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x00,0x80,0x42,0x34, -0xF0,0xFF,0x82,0x14, -0xFF,0x1F,0x02,0x3C, -0x01,0x00,0x02,0x24, -0x29,0x00,0xA2,0x10, -0x0F,0x10,0x02,0x3C, -0x02,0x00,0xA2,0x28, -0x1F,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x28,0x00,0xA3,0x10, -0x00,0x00,0x00,0x00, -0xE5,0xFF,0xA4,0x14, -0x00,0x00,0x00,0x00, -0x0F,0x10,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x00,0xF0,0x42,0x34, -0xE1,0xFF,0x82,0x14, -0xFF,0x1F,0x02,0x3C, -0x01,0x00,0x02,0x24, -0x1C,0x00,0xA2,0x10, -0x0F,0x00,0x02,0x3C, -0x02,0x00,0xA2,0x28, -0x0B,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x1C,0x00,0xA3,0x10, -0x00,0x00,0x00,0x00, -0xD6,0xFF,0xA4,0x14, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x00,0xF0,0x42,0x34, -0x0F,0x10,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x00,0x80,0x42,0x34, -0xCE,0xFF,0xA0,0x14, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x15,0xF0,0x42,0x34, -0xC9,0xFF,0xA0,0x14, -0x00,0x00,0x00,0x00, -0x0F,0x10,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x15,0xF0,0x42,0x34, -0x08,0x00,0xE0,0x03, -0x00,0xF0,0x42,0x34, -0x08,0x00,0xE0,0x03, -0x10,0xF0,0x42,0x34, -0x08,0x00,0xE0,0x03, -0x10,0xF0,0x42,0x34, -0x0F,0x10,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x05,0xF0,0x42,0x34, -0x0F,0x00,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x05,0xF0,0x42,0x34, -0xC0,0x40,0x04,0x00, -0x21,0x18,0x04,0x01, -0x80,0x18,0x03,0x00, -0x21,0x18,0x64,0x00, -0x02,0x80,0x02,0x3C, -0x80,0x18,0x03,0x00, -0x30,0x1F,0x42,0x24, -0x21,0x18,0x62,0x00, -0x18,0x24,0x66,0x8C, -0x21,0x38,0x60,0x00, -0x1E,0x24,0x60,0xA0, -0x1F,0x24,0x60,0xA0, -0x1C,0x00,0x05,0x24, -0xDA,0x24,0x00,0x08, -0x01,0x00,0x03,0x24, -0x08,0x00,0xA0,0x04, -0x21,0x10,0x04,0x01, -0x04,0x10,0xA3,0x00, -0x24,0x10,0xC2,0x00, -0xFB,0xFF,0x40,0x10, -0xFF,0xFF,0xA5,0x24, -0x01,0x00,0xA5,0x24, -0x1E,0x24,0xE5,0xA0, -0x21,0x10,0x04,0x01, -0x80,0x10,0x02,0x00, -0x21,0x10,0x44,0x00, -0x02,0x80,0x03,0x3C, -0x80,0x10,0x02,0x00, -0x30,0x1F,0x63,0x24, -0x21,0x18,0x43,0x00, -0x18,0x24,0x66,0x8C, -0x21,0x28,0x00,0x00, -0xEE,0x24,0x00,0x08, -0x01,0x00,0x07,0x24, -0x1D,0x00,0xA2,0x28, -0x08,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x04,0x10,0xA7,0x00, -0x24,0x10,0xC2,0x00, -0xFA,0xFF,0x40,0x10, -0x01,0x00,0xA5,0x24, -0xFF,0xFF,0xA5,0x24, -0x08,0x00,0xE0,0x03, -0x1F,0x24,0x65,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xD8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x88,0x00,0x00, -0x30,0x1F,0x50,0x24, -0xFF,0xF1,0x14,0x24, -0x25,0xB0,0x13,0x3C, -0x24,0x00,0xBF,0xAF, -0x08,0x25,0x00,0x08, -0x18,0x00,0xB2,0xAF, -0x01,0x00,0x31,0x26, -0x20,0x00,0x22,0x2E, -0x2A,0x00,0x40,0x10, -0x94,0x00,0x10,0x26, -0x1C,0x24,0x06,0x8E, -0x01,0x00,0x03,0x24, -0x02,0x13,0x06,0x00, -0x01,0x00,0x45,0x30, -0xF7,0xFF,0xA3,0x14, -0x42,0x1A,0x06,0x00, -0x0C,0x24,0x02,0x8E, -0x07,0x00,0x64,0x30, -0x02,0x11,0x02,0x00, -0x7F,0x00,0x43,0x30, -0x27,0x00,0x85,0x10, -0x07,0x00,0xD2,0x30, -0x02,0x00,0x82,0x28, -0x31,0x00,0x40,0x14, -0x02,0x00,0x02,0x24, -0x28,0x00,0x82,0x10, -0x03,0x00,0x02,0x24, -0x31,0x00,0x82,0x10, -0x1A,0x00,0x62,0x2C, -0x1C,0x24,0x02,0x8E, -0x04,0x00,0x43,0x2E, -0x42,0x12,0x02,0x00, -0x0A,0x00,0x60,0x10, -0x07,0x00,0x44,0x30, -0x6E,0x24,0x00,0x0C, -0x21,0x28,0x40,0x02, -0x80,0x18,0x12,0x00, -0x21,0x18,0x73,0x00, -0x14,0x24,0x04,0x8E, -0x84,0x01,0x65,0x8C, -0x24,0x20,0x82,0x00, -0x24,0x28,0xA4,0x00, -0x18,0x24,0x05,0xAE, -0xC9,0x24,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x21,0x10,0x33,0x02, -0x01,0x00,0x31,0x26, -0x60,0x01,0x43,0x90, -0x20,0x00,0x22,0x2E, -0xD8,0xFF,0x40,0x14, -0x94,0x00,0x10,0x26, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x32,0x00,0x62,0x2C, -0xDF,0xFF,0x40,0x10, -0x24,0x10,0xD4,0x00, -0x00,0x04,0x42,0x34, -0x1B,0x25,0x00,0x08, -0x1C,0x24,0x02,0xAE, -0x38,0x00,0x62,0x2C, -0x0D,0x00,0x40,0x14, -0x14,0x00,0x62,0x2C, -0x24,0x10,0xD4,0x00, -0x00,0x02,0x42,0x34, -0x1B,0x25,0x00,0x08, -0x1C,0x24,0x02,0xAE, -0xD3,0xFF,0x80,0x14, -0x24,0x10,0xD4,0x00, -0x1B,0x25,0x00,0x08, -0x1C,0x24,0x02,0xAE, -0xCF,0xFF,0x40,0x14, -0x24,0x10,0xD4,0x00, -0x3E,0x25,0x00,0x08, -0x00,0x04,0x42,0x34, -0xCB,0xFF,0x40,0x10, -0x24,0x10,0xD4,0x00, -0x00,0x06,0x42,0x34, -0x1B,0x25,0x00,0x08, -0x1C,0x24,0x02,0xAE, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0xC0,0x80,0x04,0x00, -0x21,0x80,0x04,0x02, -0x80,0x80,0x10,0x00, -0x21,0x80,0x04,0x02, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x80,0x10,0x00, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x21,0x80,0x02,0x02, -0x1C,0x24,0x03,0x8E, -0x25,0xB0,0x02,0x3C, -0x80,0x01,0x45,0x34, -0x07,0x00,0x63,0x30, -0x80,0x18,0x03,0x00, -0x21,0x18,0x62,0x00, -0x00,0x00,0xA6,0x90, -0x14,0x24,0x05,0x8E, -0x84,0x01,0x62,0x8C, -0x21,0x88,0x80,0x00, -0x24,0x10,0x45,0x00, -0xC9,0x24,0x00,0x0C, -0x18,0x24,0x02,0xAE, -0x1E,0x24,0x04,0x92, -0xFF,0x00,0x25,0x32, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x57,0x24,0x00,0x08, -0x20,0x00,0xBD,0x27, -0xFF,0xFF,0x84,0x30, -0x00,0x02,0x82,0x30, -0x07,0x00,0x03,0x24, -0x0D,0x00,0x40,0x14, -0x0B,0x00,0x84,0x30, -0x0C,0x00,0x82,0x2C, -0x0A,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x80,0x10,0x04,0x00, -0x74,0xED,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x07,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x06,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x05,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x04,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x03,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x02,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x01,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x21,0x18,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0xA8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x50,0x00,0xBE,0xAF, -0x4C,0x00,0xB7,0xAF, -0x48,0x00,0xB6,0xAF, -0x44,0x00,0xB5,0xAF, -0x3C,0x00,0xB3,0xAF, -0x38,0x00,0xB2,0xAF, -0x54,0x00,0xBF,0xAF, -0x40,0x00,0xB4,0xAF, -0x34,0x00,0xB1,0xAF, -0x30,0x00,0xB0,0xAF, -0xA4,0xED,0x42,0x24, -0x00,0x00,0x54,0x8C, -0x21,0x98,0x00,0x00, -0x21,0xA8,0x00,0x00, -0x21,0xB0,0x00,0x00, -0x10,0x00,0xA0,0xAF, -0x21,0xB8,0x00,0x00, -0x14,0x00,0xA0,0xAF, -0x21,0xF0,0x00,0x00, -0x18,0x00,0xA0,0xAF, -0x1C,0x00,0xA0,0xAF, -0x20,0x00,0xA0,0xAF, -0x24,0x00,0xA0,0xAF, -0x28,0x00,0xA0,0xAF, -0x2C,0x00,0xA0,0xAF, -0x21,0x90,0x80,0x02, -0x1C,0x24,0x42,0x8E, -0x00,0x00,0x00,0x00, -0x02,0x13,0x02,0x00, -0x01,0x00,0x42,0x30, -0x68,0x00,0x40,0x10, -0x25,0xB0,0x02,0x3C, -0x21,0x10,0x62,0x02, -0x60,0x01,0x44,0x90, -0x04,0x24,0x43,0x8E, -0x00,0x24,0x46,0x8E, -0xFF,0x00,0x8B,0x30, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x84,0x24, -0x21,0x10,0x64,0x01, -0xE7,0x04,0x44,0x90, -0xCA,0x04,0x45,0x90, -0xE8,0x23,0x47,0x8E, -0x18,0x00,0x64,0x00, -0x12,0x18,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x18,0x00,0xC5,0x00, -0x12,0x30,0x00,0x00, -0x21,0x30,0xC3,0x00, -0x2B,0x10,0xE6,0x00, -0x02,0x01,0x40,0x14, -0x23,0x10,0xE6,0x00, -0xE8,0x23,0x42,0xAE, -0x04,0x24,0x44,0x8E, -0x00,0x24,0x47,0x8E, -0xEC,0x23,0x48,0x8E, -0xF0,0x23,0x45,0x8E, -0xF8,0x23,0x46,0x8E, -0xFC,0x23,0x43,0x8E, -0x21,0x38,0xE4,0x00, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x84,0x24, -0x21,0x10,0x64,0x01, -0x21,0x40,0x05,0x01, -0x21,0x30,0xC3,0x00, -0x3E,0x05,0x42,0x90, -0xE8,0x23,0x4A,0x8E, -0x0C,0x00,0xE0,0x10, -0x21,0x48,0x00,0x00, -0x2B,0x48,0x47,0x00, -0x0B,0x00,0x20,0x15, -0x02,0x80,0x02,0x3C, -0x07,0x00,0x62,0x2D, -0x4B,0x01,0x40,0x14, -0xC0,0x10,0x07,0x00, -0x0C,0x00,0x02,0x24, -0x47,0x01,0x62,0x11, -0x0D,0x00,0x02,0x24, -0x46,0x01,0x62,0x11, -0xC0,0x10,0x07,0x00, -0x6C,0x00,0x20,0x11, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x0B,0x00, -0x21,0x18,0x62,0x00, -0x21,0x20,0x4B,0x02, -0x5A,0x24,0x85,0x90, -0x60,0x05,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x04,0x10,0xA2,0x00, -0x2B,0x10,0x4A,0x00, -0x61,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x78,0x24,0x42,0x8E, -0x01,0x00,0x07,0x24, -0x04,0x18,0x67,0x01, -0x24,0x10,0x43,0x00, -0xE1,0x00,0x40,0x10, -0x1C,0x00,0x62,0x2D, -0x21,0x28,0x4B,0x02, -0x20,0x24,0xA6,0x90, -0x5A,0x24,0xA2,0x90, -0x0A,0x00,0x04,0x24, -0xFF,0x00,0xC3,0x30, -0x04,0x20,0x44,0x00, -0x2A,0x18,0x64,0x00, -0xD8,0x00,0x60,0x10, -0x1C,0x00,0x62,0x2D, -0x01,0x00,0xC2,0x24, -0xFF,0x00,0x43,0x30, -0x37,0x01,0x64,0x10, -0x20,0x24,0xA2,0xA0, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x85,0x24, -0x80,0x10,0x0B,0x00, -0x21,0x10,0x45,0x00, -0xD4,0x05,0x44,0x8C, -0x60,0x05,0x43,0x8C, -0x18,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0x21,0x30,0x45,0x00, -0x40,0x10,0x04,0x00, -0x21,0x10,0x44,0x00, -0x21,0x18,0x62,0x00, -0x82,0x50,0x03,0x00, -0xE8,0x23,0xCA,0xAC, -0x30,0x38,0xA3,0x8C, -0xFF,0xFF,0x02,0x34, -0x03,0x00,0x62,0x10, -0x21,0x20,0x60,0x01, -0x57,0x24,0x00,0x0C, -0xFF,0x00,0x65,0x32, -0x9E,0x00,0x60,0x12, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x82,0x24, -0x21,0x10,0xA2,0x02, -0xFC,0x23,0x40,0xAC, -0x00,0x24,0x40,0xAC, -0x04,0x24,0x40,0xAC, -0xEC,0x23,0x40,0xAC, -0xF0,0x23,0x40,0xAC, -0xF4,0x23,0x40,0xAC, -0xF8,0x23,0x40,0xAC, -0x2C,0x00,0xA2,0x8F, -0x28,0x00,0xA4,0x8F, -0x01,0x00,0x73,0x26, -0x94,0x00,0x42,0x24, -0x94,0x00,0x84,0x24, -0x2C,0x00,0xA2,0xAF, -0x28,0x00,0xA4,0xAF, -0x24,0x00,0xA2,0x8F, -0x20,0x00,0xA4,0x8F, -0x20,0x00,0x63,0x2A, -0x94,0x00,0x42,0x24, -0x94,0x00,0x84,0x24, -0x24,0x00,0xA2,0xAF, -0x20,0x00,0xA4,0xAF, -0x1C,0x00,0xA2,0x8F, -0x18,0x00,0xA4,0x8F, -0x94,0x00,0x52,0x26, -0x94,0x00,0x42,0x24, -0x94,0x00,0x84,0x24, -0x1C,0x00,0xA2,0xAF, -0x18,0x00,0xA4,0xAF, -0x14,0x00,0xA2,0x8F, -0x10,0x00,0xA4,0x8F, -0x94,0x00,0xDE,0x27, -0x94,0x00,0x42,0x24, -0x94,0x00,0x84,0x24, -0x14,0x00,0xA2,0xAF, -0x94,0x00,0xF7,0x26, -0x10,0x00,0xA4,0xAF, -0x94,0x00,0x94,0x26, -0x94,0x00,0xD6,0x26, -0x69,0xFF,0x60,0x14, -0x94,0x00,0xB5,0x26, -0x54,0x00,0xBF,0x8F, -0x50,0x00,0xBE,0x8F, -0x4C,0x00,0xB7,0x8F, -0x48,0x00,0xB6,0x8F, -0x44,0x00,0xB5,0x8F, -0x40,0x00,0xB4,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x58,0x00,0xBD,0x27, -0x79,0x00,0xE0,0x10, -0x00,0x00,0x00,0x00, -0x79,0x00,0x20,0x15, -0x02,0x80,0x03,0x3C, -0x40,0x10,0x07,0x00, -0x21,0x10,0x47,0x00, -0x82,0x10,0x02,0x00, -0x2B,0x10,0x46,0x00, -0xBE,0xFF,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x88,0x24, -0x21,0x20,0xC8,0x03, -0x21,0x30,0x8B,0x00, -0x78,0x24,0x83,0x8C, -0x01,0x00,0x05,0x24, -0x04,0x10,0x65,0x01, -0x3D,0x24,0xC7,0x90, -0x27,0x10,0x02,0x00, -0x24,0x18,0x62,0x00, -0x78,0x24,0x83,0xAC, -0x09,0x00,0xE5,0x10, -0x20,0x24,0xC0,0xA0, -0x14,0x00,0xA2,0x8F, -0x21,0x38,0x00,0x00, -0x21,0x20,0x48,0x00, -0x21,0x18,0x87,0x00, -0x01,0x00,0xE7,0x24, -0x1D,0x00,0xE2,0x28, -0xFC,0xFF,0x40,0x14, -0x5A,0x24,0x60,0xA0, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x83,0x24, -0x21,0x10,0xE3,0x02, -0x21,0x10,0x4B,0x00, -0x3D,0x24,0x40,0xA0, -0x21,0x50,0x60,0x00, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x78,0xE8,0x49,0x24, -0x04,0xE8,0x68,0x24, -0x21,0x38,0x00,0x00, -0x80,0x18,0x07,0x00, -0x21,0x10,0x69,0x00, -0x21,0x20,0x68,0x00, -0x00,0x00,0x46,0x8C, -0x00,0x00,0x85,0x8C, -0x01,0x00,0xE7,0x24, -0x21,0x18,0x6A,0x00, -0x1D,0x00,0xE2,0x28, -0x60,0x05,0x65,0xAC, -0xF6,0xFF,0x40,0x14, -0xD4,0x05,0x66,0xAC, -0x15,0x00,0x60,0x11, -0x02,0x80,0x04,0x3C, -0x1F,0x24,0x82,0x92, -0xFF,0xFF,0x67,0x25, -0x2A,0x10,0xE2,0x00, -0x10,0x00,0x40,0x14, -0x02,0x80,0x03,0x3C, -0x10,0x00,0xA4,0x8F, -0x30,0x1F,0x62,0x24, -0x21,0x10,0x82,0x00, -0x1F,0x24,0x45,0x90, -0x18,0x24,0x44,0x8C, -0x01,0x00,0x06,0x24, -0x04,0x18,0xE6,0x00, -0x24,0x10,0x83,0x00, -0xB9,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0xE7,0x24, -0x2A,0x10,0xE5,0x00, -0xFA,0xFF,0x40,0x10, -0x04,0x18,0xE6,0x00, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x83,0x24, -0x80,0x10,0x0B,0x00, -0x21,0x10,0x43,0x00, -0xD4,0x05,0x45,0x8C, -0x60,0x05,0x44,0x8C, -0x02,0x80,0x03,0x3C, -0x40,0x10,0x05,0x00, -0xDE,0x5D,0x66,0x90, -0x21,0x10,0x45,0x00, -0x21,0x20,0x82,0x00, -0x22,0x00,0x02,0x24, -0x9D,0x00,0xC2,0x10, -0x82,0x50,0x04,0x00, -0x78,0x24,0x83,0x8E, -0x01,0x00,0x02,0x24, -0x04,0x10,0x62,0x01, -0x25,0x18,0x62,0x00, -0x78,0x24,0x83,0xAE, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x43,0x24, -0x21,0x10,0xC3,0x02, -0xE8,0x23,0x4A,0xAC, -0x30,0x38,0x64,0x8C, -0xFF,0xFF,0x02,0x34, -0x62,0xFF,0x82,0x14, -0x21,0x20,0x60,0x01, -0x64,0xFF,0x60,0x16, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x70,0x24, -0xF0,0x23,0x05,0x96, -0xEC,0x23,0x02,0x96, -0x25,0xB0,0x11,0x3C, -0x00,0x2C,0x05,0x00, -0x21,0x28,0x45,0x00, -0xB5,0x59,0x00,0x0C, -0x68,0x0C,0x24,0x36, -0xFC,0x23,0x02,0x8E, -0xF8,0x23,0x05,0x8E, -0xF4,0x23,0x03,0x96, -0x6C,0x0C,0x24,0x36, -0x21,0x28,0xA2,0x00, -0x00,0x2C,0x05,0x00, -0xB5,0x59,0x00,0x0C, -0x21,0x28,0x65,0x00, -0x28,0x26,0x00,0x08, -0x02,0x80,0x04,0x3C, -0xD6,0x25,0x00,0x08, -0xE8,0x23,0x40,0xAE, -0x4C,0xFF,0x20,0x11, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x62,0x24, -0x80,0x18,0x0B,0x00, -0x21,0x18,0x62,0x00, -0xD4,0x05,0x64,0x8C, -0x00,0x00,0x00,0x00, -0x2B,0x20,0x44,0x01, -0x44,0xFF,0x80,0x10, -0x02,0x80,0x04,0x3C, -0x69,0x26,0x00,0x08, -0x30,0x1F,0x88,0x24, -0x2D,0xFF,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x21,0x20,0x4B,0x02, -0x3D,0x24,0x83,0x90, -0x01,0x00,0x02,0x24, -0x53,0x00,0x62,0x10, -0x02,0x80,0x02,0x3C, -0x2C,0x00,0xA3,0x8F, -0x30,0x1F,0x42,0x24, -0x21,0x38,0x00,0x00, -0x21,0x20,0x62,0x00, -0x21,0x18,0x87,0x00, -0x01,0x00,0xE7,0x24, -0x1D,0x00,0xE2,0x28, -0xFC,0xFF,0x40,0x14, -0x5A,0x24,0x60,0xA0, -0x28,0x00,0xA4,0x8F, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x65,0x24, -0x21,0x30,0x85,0x00, -0x78,0x24,0xC2,0x8C, -0x01,0x00,0x03,0x24, -0x04,0x18,0x63,0x01, -0x27,0x18,0x03,0x00, -0x21,0x20,0xCB,0x00, -0x24,0x10,0x43,0x00, -0x3D,0x24,0x80,0xA0, -0x78,0x24,0xC2,0xAC, -0x12,0x00,0x60,0x15, -0x20,0x24,0x80,0xA0, -0x1E,0x24,0xC2,0x90, -0x00,0x00,0x00,0x00, -0x0E,0x00,0x40,0x10, -0x01,0x00,0x07,0x24, -0x24,0x00,0xA3,0x8F, -0x01,0x00,0x06,0x24, -0x21,0x10,0x65,0x00, -0x1E,0x24,0x44,0x90, -0x18,0x24,0x45,0x8C, -0x04,0x18,0xE6,0x00, -0x24,0x10,0xA3,0x00, -0x4B,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0xE7,0x24, -0x2A,0x10,0x87,0x00, -0xFA,0xFF,0x40,0x10, -0x04,0x18,0xE6,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x44,0x24, -0x20,0x00,0xA2,0x8F, -0x01,0x00,0x67,0x25, -0x21,0x18,0x44,0x00, -0x1E,0x24,0x62,0x90, -0x00,0x00,0x00,0x00, -0x2A,0x10,0x47,0x00, -0x0E,0x00,0x40,0x14, -0x01,0x00,0x06,0x24, -0x1C,0x00,0xA3,0x8F, -0x00,0x00,0x00,0x00, -0x21,0x10,0x64,0x00, -0x1E,0x24,0x45,0x90, -0x18,0x24,0x44,0x8C, -0x04,0x18,0xE6,0x00, -0x24,0x10,0x83,0x00, -0x31,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0xE7,0x24, -0x2A,0x10,0xA7,0x00, -0xFA,0xFF,0x40,0x10, -0x04,0x18,0xE6,0x00, -0x02,0x80,0x02,0x3C, -0xDE,0x5D,0x44,0x90, -0x22,0x00,0x03,0x24, -0xE4,0xFE,0x83,0x14, -0x02,0x80,0x04,0x3C, -0xEE,0xFF,0x62,0x25, -0xFF,0x00,0x42,0x30, -0x02,0x00,0x42,0x2C, -0x18,0x00,0x03,0x24, -0x12,0x26,0x00,0x08, -0x0B,0x58,0x62,0x00, -0xC0,0x10,0x07,0x00, -0x23,0x10,0x47,0x00, -0xC2,0x10,0x02,0x00, -0x2B,0x10,0x48,0x00, -0xC4,0xFE,0x40,0x14, -0x00,0x00,0x00,0x00, -0xF1,0x25,0x00,0x08, -0x00,0x00,0x00,0x00, -0x18,0x00,0x62,0x2D, -0x0A,0x00,0x40,0x14, -0x05,0x00,0x62,0x2D, -0x5A,0x24,0x83,0x90, -0x00,0x00,0x00,0x00, -0x05,0x00,0x62,0x2C, -0xB0,0xFF,0x40,0x10, -0x01,0x00,0x62,0x24, -0xF4,0x26,0x00,0x08, -0x5A,0x24,0x82,0xA0, -0x11,0x26,0x00,0x08, -0x3D,0x24,0xA7,0xA0, -0x04,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x5A,0x24,0x83,0x90, -0x43,0x27,0x00,0x08, -0x03,0x00,0x62,0x2C, -0x5A,0x24,0x83,0x90, -0x43,0x27,0x00,0x08, -0x04,0x00,0x62,0x2C, -0x13,0x00,0x02,0x24, -0x62,0xFF,0x62,0x15, -0x02,0x80,0x02,0x3C, -0xBC,0x26,0x00,0x08, -0x30,0x1F,0x43,0x24, -0xFF,0x00,0xEB,0x30, -0x2B,0x27,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x13,0x27,0x00,0x08, -0xFF,0x00,0xEB,0x30, -0xA7,0x26,0x00,0x08, -0xFF,0x00,0xEB,0x30, -0xD8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x14,0x00,0xB1,0xAF, -0x24,0x00,0xBF,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x45,0x24, -0xA9,0x37,0xA4,0x90, -0xA4,0x37,0xA3,0x8C, -0xA0,0x37,0xA2,0x8C, -0x21,0x88,0x64,0x00, -0x2B,0x10,0x22,0x02, -0x60,0x00,0x40,0x10, -0x21,0x80,0xA0,0x00, -0x02,0x80,0x14,0x3C, -0x21,0x98,0xA0,0x00, -0x76,0x27,0x00,0x08, -0x21,0x90,0xA0,0x00, -0xA0,0x37,0x42,0x8E, -0x10,0x00,0x31,0x26, -0x2B,0x10,0x22,0x02, -0x57,0x00,0x40,0x10, -0x21,0x80,0x40,0x02, -0xA9,0x37,0x02,0x92, -0xFF,0xFF,0x23,0x32, -0x02,0x80,0x05,0x3C, -0x10,0x00,0x42,0x24, -0x25,0x28,0x65,0x00, -0x98,0x55,0x84,0x26, -0x10,0x00,0x06,0x24, -0x10,0x52,0x00,0x0C, -0xA9,0x37,0x02,0xA2, -0x6C,0x36,0x06,0x8E, -0x00,0x00,0x00,0x00, -0x42,0x24,0x06,0x00, -0x1F,0x00,0x84,0x30, -0xC0,0x10,0x04,0x00, -0x21,0x10,0x44,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x44,0x00, -0x80,0x10,0x02,0x00, -0x21,0x38,0x50,0x00, -0x1C,0x24,0xE3,0x8C, -0x00,0x00,0x00,0x00, -0x02,0x1B,0x03,0x00, -0x01,0x00,0x63,0x30, -0xE3,0xFF,0x60,0x10, -0x25,0xB0,0x02,0x3C, -0x68,0x36,0x05,0x8E, -0x21,0x10,0x82,0x00, -0x60,0x01,0x44,0x90, -0x82,0x1D,0x05,0x00, -0x3F,0x00,0x63,0x30, -0x04,0x00,0x0A,0x24, -0x05,0x00,0x62,0x28, -0x21,0x40,0x40,0x01, -0x0B,0x40,0x62,0x00, -0x07,0x00,0xA0,0x04, -0xFF,0x00,0x89,0x30, -0x08,0x24,0xE2,0x8C, -0x04,0x00,0x08,0x24, -0x01,0x00,0x42,0x24, -0x08,0x24,0xE2,0xAC, -0x6C,0x36,0x66,0x8E, -0x00,0x00,0x00,0x00, -0x02,0x13,0x06,0x00, -0x1F,0x00,0x42,0x30, -0x08,0x00,0x42,0x28, -0xCD,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x68,0x36,0x62,0x8E, -0x00,0x00,0x00,0x00, -0x3F,0x00,0x42,0x30, -0xC8,0xFF,0x49,0x14, -0x00,0x00,0x00,0x00, -0x29,0x00,0x00,0x11, -0x01,0x00,0x02,0x24, -0x2E,0x00,0x02,0x11, -0x02,0x00,0x02,0x24, -0x33,0x00,0x02,0x11, -0x03,0x00,0x02,0x24, -0x38,0x00,0x02,0x11, -0x00,0x00,0x00,0x00, -0x3B,0x00,0x0A,0x11, -0x00,0x00,0x00,0x00, -0x0C,0x24,0xE2,0x8C, -0x21,0x18,0x33,0x01, -0x04,0x05,0x64,0x90, -0x02,0x11,0x02,0x00, -0x2B,0x10,0x44,0x00, -0x3E,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0x24,0xE3,0x8C, -0x80,0x10,0x09,0x00, -0x21,0x10,0x49,0x00, -0x01,0x00,0x63,0x24, -0x21,0x10,0x53,0x00, -0x00,0x24,0xE3,0xAC, -0x21,0x10,0x48,0x00, -0xA8,0x03,0x44,0x90, -0xE8,0x23,0xE3,0x8C, -0x00,0x00,0x00,0x00, -0x21,0x18,0x64,0x00, -0xE8,0x23,0xE3,0xAC, -0xA0,0x37,0x42,0x8E, -0x10,0x00,0x31,0x26, -0x2B,0x10,0x22,0x02, -0xAB,0xFF,0x40,0x14, -0x21,0x80,0x40,0x02, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xEC,0x23,0xE2,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xEC,0x23,0xE2,0xAC, -0x01,0x00,0x02,0x24, -0xD4,0xFF,0x02,0x15, -0x02,0x00,0x02,0x24, -0xF0,0x23,0xE2,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xF0,0x23,0xE2,0xAC, -0x02,0x00,0x02,0x24, -0xCF,0xFF,0x02,0x15, -0x03,0x00,0x02,0x24, -0xF4,0x23,0xE2,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xF4,0x23,0xE2,0xAC, -0x03,0x00,0x02,0x24, -0xCA,0xFF,0x02,0x15, -0x00,0x00,0x00,0x00, -0xF8,0x23,0xE2,0x8C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0xC7,0xFF,0x0A,0x15, -0xF8,0x23,0xE2,0xAC, -0xFC,0x23,0xE2,0x8C, -0x21,0x18,0x33,0x01, -0x01,0x00,0x42,0x24, -0xFC,0x23,0xE2,0xAC, -0x0C,0x24,0xE2,0x8C, -0x04,0x05,0x64,0x90, -0x02,0x11,0x02,0x00, -0x2B,0x10,0x44,0x00, -0xC4,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x04,0x24,0xE3,0x8C, -0x80,0x10,0x09,0x00, -0x21,0x10,0x49,0x00, -0x01,0x00,0x63,0x24, -0x21,0x10,0x53,0x00, -0x04,0x24,0xE3,0xAC, -0x21,0x10,0x48,0x00, -0x39,0x04,0x44,0x90, -0xE8,0x23,0xE3,0x8C, -0x00,0x00,0x00,0x00, -0x21,0x18,0x64,0x00, -0xC7,0x27,0x00,0x08, -0xE8,0x23,0xE3,0xAC, -0x23,0x10,0xA4,0x00, -0x2B,0x18,0xA4,0x00, -0x23,0x20,0x85,0x00, -0x08,0x00,0xE0,0x03, -0x0B,0x10,0x83,0x00, -0x20,0xFF,0xBD,0x27, -0xCC,0x00,0xB5,0xAF, -0xDC,0x00,0xBF,0xAF, -0xD8,0x00,0xBE,0xAF, -0xD4,0x00,0xB7,0xAF, -0xD0,0x00,0xB6,0xAF, -0xC8,0x00,0xB4,0xAF, -0xC4,0x00,0xB3,0xAF, -0xC0,0x00,0xB2,0xAF, -0xBC,0x00,0xB1,0xAF, -0xB8,0x00,0xB0,0xAF, -0x21,0xA8,0x00,0x00, -0x40,0x11,0x15,0x00, -0x10,0x00,0xA3,0x27, -0x21,0x10,0x43,0x00, -0x07,0x00,0x16,0x24, -0xFF,0xFF,0xD6,0x26, -0x00,0x00,0x40,0xAC, -0xFD,0xFF,0xC1,0x06, -0x04,0x00,0x42,0x24, -0x01,0x00,0xB5,0x26, -0x03,0x00,0xA2,0x2E, -0xF6,0xFF,0x40,0x14, -0x40,0x11,0x15,0x00, -0x25,0xB0,0x10,0x3C, -0xC4,0x02,0x02,0x36, -0x00,0x00,0x40,0xAC, -0x04,0x00,0x03,0x36, -0x00,0x00,0x62,0x8C, -0x04,0x0C,0x03,0x36, -0x00,0x00,0x63,0x8C, -0x08,0x0C,0x04,0x36, -0x0F,0x00,0x11,0x3C, -0xAC,0x00,0xA3,0xAF, -0x00,0x00,0x84,0x8C, -0x24,0x10,0x51,0x00, -0x02,0xF4,0x02,0x00, -0xB0,0x00,0xA4,0xAF, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x21,0x20,0x00,0x00, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x25,0x36, -0x70,0x00,0xA2,0xAF, -0x00,0x60,0x92,0x40, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x21,0x20,0x00,0x00, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x25,0x36, -0x74,0x00,0xA2,0xAF, -0x00,0x60,0x92,0x40, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0xE0,0x0E,0x02,0x36, -0x21,0x20,0x40,0x00, -0x00,0x00,0x42,0x8C, -0xDC,0x0E,0x12,0x36, -0x70,0x0E,0x13,0x36, -0x78,0x00,0xA2,0xAF, -0x00,0x00,0x42,0x8E, -0x74,0x0E,0x14,0x36, -0x78,0x0E,0x15,0x36, -0x7C,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8E, -0x7C,0x0E,0x16,0x36, -0x80,0x0E,0x17,0x36, -0x80,0x00,0xA3,0xAF, -0x00,0x00,0x82,0x8E, -0xD4,0x0E,0x10,0x36, -0xED,0x3F,0x11,0x3C, -0x84,0x00,0xA2,0xAF, -0x00,0x00,0xA3,0x8E, -0xFB,0x92,0x25,0x36, -0x88,0x00,0xA3,0xAF, -0x00,0x00,0xC2,0x8E, -0x00,0x00,0x00,0x00, -0x8C,0x00,0xA2,0xAF, -0x00,0x00,0xE3,0x8E, -0x25,0xB0,0x02,0x3C, -0x84,0x0E,0x42,0x34, -0x90,0x00,0xA3,0xAF, -0x00,0x00,0x42,0x8C, -0x25,0xB0,0x03,0x3C, -0x88,0x0E,0x63,0x34, -0x94,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8C, -0x25,0xB0,0x02,0x3C, -0x8C,0x0E,0x42,0x34, -0x98,0x00,0xA3,0xAF, -0x00,0x00,0x42,0x8C, -0x25,0xB0,0x03,0x3C, -0xD0,0x0E,0x63,0x34, -0x9C,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8C, -0x00,0x00,0x00,0x00, -0xA0,0x00,0xA3,0xAF, -0x00,0x00,0x02,0x8E, -0x25,0xB0,0x03,0x3C, -0xD8,0x0E,0x63,0x34, -0xA4,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8C, -0x02,0x5C,0x00,0x0C, -0xA8,0x00,0xA3,0xAF, -0x21,0x20,0x40,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x21,0x20,0x60,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x21,0x20,0x80,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x21,0x20,0xA0,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x21,0x20,0xC0,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x21,0x20,0xE0,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x02,0x80,0x02,0x3C, -0xA8,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x25,0xB0,0x13,0x3C, -0x02,0x80,0x03,0x3C, -0xAC,0xED,0x63,0x24, -0x00,0x00,0x64,0x8C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x21,0xB0,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xB0,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0xFF,0x03,0x14,0x3C, -0x02,0x80,0x03,0x3C, -0xB4,0xED,0x63,0x24, -0x00,0x00,0x64,0x8C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x10,0x00,0xB7,0x27, -0x21,0x20,0x00,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x02,0x80,0x02,0x3C, -0xB8,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0xE4,0x28,0x00,0x08, -0x21,0xA8,0x00,0x00, -0x6E,0x00,0xC2,0x13, -0x02,0x80,0x02,0x3C, -0xAC,0x0E,0x62,0x36, -0x94,0x0E,0x63,0x36, -0x00,0x00,0x48,0x8C, -0x00,0x00,0x64,0x8C, -0xB4,0x0E,0x62,0x36, -0x9C,0x0E,0x63,0x36, -0x00,0x00,0x45,0x8C, -0x00,0x00,0x66,0x8C, -0x25,0xB0,0x03,0x3C, -0xBC,0x0E,0x63,0x34, -0x00,0x00,0x67,0x8C, -0x24,0x20,0x94,0x00, -0x00,0xD8,0x02,0x3C, -0x24,0x10,0x02,0x01, -0x24,0x28,0xB4,0x00, -0x24,0x30,0xD4,0x00, -0x24,0x38,0xF4,0x00, -0x02,0x24,0x04,0x00, -0x20,0x01,0x03,0x24, -0x01,0x00,0x42,0x2C, -0x02,0x2C,0x05,0x00, -0x02,0x34,0x06,0x00, -0xE8,0x00,0x83,0x10, -0x02,0x3C,0x07,0x00, -0xE6,0x00,0xA3,0x10, -0x20,0x00,0x03,0x24, -0xE4,0x00,0xC3,0x10, -0x00,0x00,0x00,0x00, -0xE2,0x00,0xE3,0x10, -0x01,0x00,0x08,0x24, -0x80,0x00,0x03,0x24, -0x08,0x00,0x83,0x10, -0x21,0x20,0x00,0x00, -0x06,0x00,0xA3,0x10, -0x21,0x20,0x00,0x00, -0xE0,0x03,0x03,0x24, -0x03,0x00,0xC3,0x10, -0x00,0x00,0x00,0x00, -0xDB,0x00,0xE3,0x10, -0x01,0x00,0x04,0x24, -0x05,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x03,0x00,0x00,0x11, -0x00,0x00,0x00,0x00, -0xD7,0x00,0x80,0x14, -0x94,0x0E,0x63,0x36, -0x01,0x00,0xB5,0x26, -0x0A,0x00,0xA2,0x2E, -0x01,0x01,0x40,0x10, -0x00,0x00,0x00,0x00, -0xCB,0xFF,0xC0,0x17, -0x01,0x00,0x02,0x24, -0xA0,0x00,0x03,0x3C, -0x30,0x54,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x04,0x0C,0x64,0x36, -0x08,0x00,0x05,0x3C, -0xE4,0x00,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x08,0x0C,0x64,0x36, -0x28,0x0E,0x64,0x36, -0x02,0x5C,0x00,0x0C, -0x80,0x80,0x05,0x3C, -0x14,0x02,0x02,0x3C, -0x48,0x01,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x40,0x0E,0x64,0x36, -0x16,0x68,0x05,0x3C, -0xA2,0x04,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x44,0x0E,0x64,0x36, -0x4C,0x0E,0x64,0x36, -0x02,0x5C,0x00,0x0C, -0xD1,0x28,0x05,0x24, -0x14,0x02,0x03,0x3C, -0x4D,0x01,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x60,0x0E,0x64,0x36, -0x16,0x28,0x05,0x3C, -0xBA,0x08,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x64,0x0E,0x64,0x36, -0x6C,0x0E,0x64,0x36, -0x02,0x5C,0x00,0x0C, -0xD1,0x28,0x05,0x24, -0x00,0xFB,0x05,0x3C, -0x01,0x00,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0x64,0x36, -0x00,0xF8,0x05,0x3C, -0x01,0x00,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0x64,0x36, -0x25,0x22,0x00,0x0C, -0x03,0x00,0x04,0x24, -0xA0,0x00,0x02,0x3C, -0x33,0x54,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x04,0x0C,0x64,0x36, -0x08,0x0C,0x64,0x36, -0x02,0x5C,0x00,0x0C, -0xE4,0x00,0x05,0x24, -0x28,0x0E,0x64,0x36, -0x02,0x5C,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x01,0x00,0x02,0x24, -0x96,0xFF,0xC2,0x17, -0xAC,0x0E,0x62,0x36, -0x02,0x80,0x02,0x3C, -0xBC,0xED,0x42,0x24, -0x25,0xB0,0x03,0x3C, -0x00,0x00,0x44,0x8C, -0x20,0x08,0x63,0x34, -0x00,0x00,0x71,0x8C, -0x00,0x01,0x03,0x3C, -0x00,0x01,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x25,0xB0,0x12,0x3C, -0x00,0x01,0x02,0x3C, -0x00,0x01,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x28,0x08,0x44,0x36, -0xA0,0x00,0x03,0x3C, -0x30,0x54,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x04,0x0C,0x44,0x36, -0x08,0x00,0x05,0x3C, -0xE4,0x00,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x08,0x0C,0x44,0x36, -0x28,0x0E,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0x80,0x80,0x05,0x3C, -0x00,0x01,0x02,0x3C, -0x00,0x7C,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x30,0x0E,0x44,0x36, -0x00,0x01,0x03,0x3C, -0x00,0x48,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x34,0x0E,0x44,0x36, -0x00,0x10,0x02,0x3C, -0x1F,0xDC,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x38,0x0E,0x44,0x36, -0x00,0x10,0x03,0x3C, -0x1F,0x8C,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x3C,0x0E,0x44,0x36, -0x14,0x02,0x02,0x3C, -0x02,0x01,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x40,0x0E,0x44,0x36, -0x16,0x68,0x05,0x3C, -0xC7,0x04,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x44,0x0E,0x44,0x36, -0x4C,0x0E,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0xD1,0x28,0x05,0x24, -0x6C,0x0E,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0xD1,0x28,0x05,0x24, -0x00,0x01,0x03,0x3C, -0x00,0x7C,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x50,0x0E,0x44,0x36, -0x00,0x01,0x02,0x3C, -0x00,0x48,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x54,0x0E,0x44,0x36, -0x00,0x10,0x03,0x3C, -0x23,0xDC,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x58,0x0E,0x44,0x36, -0x00,0x10,0x02,0x3C, -0x23,0x8C,0x45,0x34, -0x02,0x5C,0x00,0x0C, -0x5C,0x0E,0x44,0x36, -0x14,0x02,0x03,0x3C, -0x02,0x01,0x65,0x34, -0x02,0x5C,0x00,0x0C, -0x60,0x0E,0x44,0x36, -0x16,0x28,0x05,0x3C, -0x07,0x0D,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x64,0x0E,0x44,0x36, -0x48,0x0E,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0xFB,0x05,0x3C, -0x00,0xF8,0x05,0x3C, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0x44,0x36, -0x00,0x02,0x10,0x3C, -0x25,0x22,0x00,0x0C, -0x03,0x00,0x04,0x24, -0x4C,0x0E,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0xD1,0x28,0x05,0x36, -0xD1,0x28,0x05,0x36, -0x02,0x5C,0x00,0x0C, -0x6C,0x0E,0x44,0x36, -0x48,0x0E,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0xFB,0x05,0x3C, -0x00,0xF8,0x05,0x3C, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0x44,0x36, -0x25,0x22,0x00,0x0C, -0x03,0x00,0x04,0x24, -0xAC,0x00,0xA5,0x8F, -0x04,0x0C,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x31,0x32, -0xB0,0x00,0xA5,0x8F, -0x08,0x0C,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0x2B,0x88,0x11,0x00, -0x28,0x0E,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x23,0xFF,0x20,0x16, -0xAC,0x0E,0x62,0x36, -0x02,0x80,0x02,0x3C, -0xBC,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x05,0x3C, -0x28,0x08,0x44,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x05,0x3C, -0xAC,0x0E,0x62,0x36, -0x94,0x0E,0x63,0x36, -0x00,0x00,0x48,0x8C, -0x00,0x00,0x64,0x8C, -0xB4,0x0E,0x62,0x36, -0x9C,0x0E,0x63,0x36, -0x00,0x00,0x45,0x8C, -0x00,0x00,0x66,0x8C, -0x25,0xB0,0x03,0x3C, -0xBC,0x0E,0x63,0x34, -0x00,0x00,0x67,0x8C, -0x24,0x20,0x94,0x00, -0x00,0xD8,0x02,0x3C, -0x24,0x10,0x02,0x01, -0x24,0x28,0xB4,0x00, -0x24,0x30,0xD4,0x00, -0x24,0x38,0xF4,0x00, -0x02,0x24,0x04,0x00, -0x20,0x01,0x03,0x24, -0x01,0x00,0x42,0x2C, -0x02,0x2C,0x05,0x00, -0x02,0x34,0x06,0x00, -0x1A,0xFF,0x83,0x14, -0x02,0x3C,0x07,0x00, -0x80,0x00,0x03,0x24, -0x20,0xFF,0x83,0x14, -0x21,0x40,0x00,0x00, -0xDA,0x28,0x00,0x08, -0x21,0x20,0x00,0x00, -0x00,0x00,0x62,0x8C, -0x9C,0x0E,0x65,0x36, -0xA4,0x0E,0x66,0x36, -0x24,0x10,0x54,0x00, -0x02,0x14,0x02,0x00, -0x00,0x00,0xE2,0xAE, -0x00,0x00,0xA4,0x8C, -0xAC,0x0E,0x67,0x36, -0xB4,0x0E,0x65,0x36, -0x24,0x20,0x94,0x00, -0x02,0x24,0x04,0x00, -0x04,0x00,0xE4,0xAE, -0x00,0x00,0xC3,0x8C, -0xC4,0x0E,0x64,0x36, -0x24,0x18,0x74,0x00, -0x02,0x1C,0x03,0x00, -0x08,0x00,0xE3,0xAE, -0x00,0x00,0xE2,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x54,0x00, -0x02,0x14,0x02,0x00, -0x0C,0x00,0xE2,0xAE, -0x00,0x00,0xA3,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x18,0x74,0x00, -0x02,0x1C,0x03,0x00, -0x10,0x00,0xE3,0xAE, -0x25,0xB0,0x03,0x3C, -0xBC,0x0E,0x63,0x34, -0x00,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x54,0x00, -0x02,0x14,0x02,0x00, -0x14,0x00,0xE2,0xAE, -0x00,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x18,0x74,0x00, -0x02,0x1C,0x03,0x00, -0x18,0x00,0xE3,0xAE, -0x25,0xB0,0x03,0x3C, -0xCC,0x0E,0x63,0x34, -0x00,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x54,0x00, -0x02,0x14,0x02,0x00, -0x1C,0x00,0xE2,0xAE, -0x01,0x00,0xD6,0x26, -0x03,0x00,0xC2,0x2E, -0xC7,0xFE,0x40,0x14, -0x20,0x00,0xF7,0x26, -0x10,0x00,0xB0,0x8F, -0x00,0x00,0x00,0x00, -0x49,0x01,0x00,0x16, -0x00,0x00,0x00,0x00, -0x30,0x00,0xB1,0x8F, -0x00,0x00,0x00,0x00, -0x06,0x00,0x20,0x16, -0x21,0x20,0x00,0x02, -0x50,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0x29,0x00,0x40,0x10, -0xFF,0x00,0x05,0x24, -0x21,0x20,0x00,0x02, -0x05,0x28,0x00,0x0C, -0x21,0x28,0x20,0x02, -0x03,0x00,0x42,0x2C, -0x08,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x34,0x00,0xA5,0x8F, -0x14,0x00,0xA4,0x8F, -0x05,0x28,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x03,0x00,0x42,0x2C, -0x1C,0x00,0x40,0x14, -0x21,0x28,0x00,0x00, -0x50,0x00,0xB2,0x8F, -0x21,0x20,0x00,0x02, -0x05,0x28,0x00,0x0C, -0x21,0x28,0x40,0x02, -0x03,0x00,0x42,0x2C, -0x09,0x00,0x40,0x10, -0x21,0x20,0x20,0x02, -0x54,0x00,0xA5,0x8F, -0x14,0x00,0xA4,0x8F, -0x05,0x28,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x03,0x00,0x42,0x2C, -0x0E,0x00,0x40,0x14, -0x21,0x28,0x00,0x00, -0x21,0x20,0x20,0x02, -0x05,0x28,0x00,0x0C, -0x21,0x28,0x40,0x02, -0x03,0x00,0x42,0x2C, -0xE0,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x54,0x00,0xA5,0x8F, -0x34,0x00,0xA4,0x8F, -0x05,0x28,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x03,0x00,0x42,0x2C, -0xD9,0x00,0x40,0x10, -0x01,0x00,0x05,0x24, -0xFF,0x00,0x02,0x24, -0xDB,0x00,0xA2,0x10, -0x25,0xB0,0x03,0x3C, -0x10,0x00,0xA2,0x27, -0x40,0x29,0x05,0x00, -0x02,0x80,0x0F,0x3C, -0x21,0x28,0xA2,0x00, -0x30,0x1F,0xEC,0x25, -0x00,0x00,0xA6,0x8C, -0x0C,0x00,0xA7,0x8C, -0x0C,0x00,0x83,0x8D, -0x10,0x00,0x84,0x8D, -0x04,0x00,0xA8,0x8C, -0x10,0x00,0xA9,0x8C, -0x00,0xFC,0x02,0x24, -0x08,0x00,0xAA,0x8C, -0x14,0x00,0xAB,0x8C, -0x24,0x20,0x82,0x00, -0xFF,0x03,0xC6,0x30, -0x24,0x18,0x62,0x00, -0xFF,0x03,0xE7,0x30, -0xF0,0xFF,0x02,0x3C, -0xFF,0x03,0x42,0x34, -0x25,0x18,0x66,0x00, -0x25,0x20,0x87,0x00, -0xFF,0x03,0x08,0x31, -0xFF,0x03,0x29,0x31, -0x24,0x20,0x82,0x00, -0x24,0x18,0x62,0x00, -0x80,0x42,0x08,0x00, -0x80,0x4A,0x09,0x00, -0x0F,0xC0,0x02,0x3C, -0x1C,0x00,0xA6,0x8C, -0x18,0x00,0xA7,0x8C, -0xFF,0xFF,0x42,0x34, -0x25,0x18,0x68,0x00, -0x25,0x20,0x89,0x00, -0xFF,0x03,0x4A,0x31, -0xFF,0x03,0x6B,0x31, -0x24,0x20,0x82,0x00, -0x00,0x55,0x0A,0x00, -0x24,0x18,0x62,0x00, -0x00,0x5D,0x0B,0x00, -0x25,0x18,0x6A,0x00, -0x25,0x20,0x8B,0x00, -0x16,0x00,0x86,0xA5, -0x0C,0x00,0x83,0xAD, -0x10,0x00,0x84,0xAD, -0x14,0x00,0x87,0xA5, -0x30,0x1F,0xF1,0x25, -0x10,0x00,0x22,0x8E, -0x01,0x00,0x03,0x24, -0x82,0x17,0x02,0x00, -0x4D,0x00,0x43,0x10, -0x25,0xB0,0x12,0x3C, -0x0C,0x00,0x23,0x8E, -0x80,0x0C,0x44,0x36, -0x00,0x00,0x88,0x8C, -0x00,0x02,0x62,0x30, -0xC0,0xFF,0x13,0x3C, -0x82,0x6D,0x08,0x00, -0x03,0x00,0x40,0x10, -0xFF,0x03,0x65,0x30, -0x00,0xFC,0x02,0x24, -0x25,0x28,0xA2,0x00, -0x18,0x00,0xAD,0x00, -0x82,0x62,0x03,0x00, -0xFF,0x03,0x8C,0x31, -0x00,0x02,0x83,0x31, -0x12,0x10,0x00,0x00, -0x02,0x12,0x02,0x00, -0x03,0x00,0x60,0x10, -0xFF,0x03,0x46,0x30, -0x00,0xFC,0x02,0x24, -0x25,0x60,0x82,0x01, -0x18,0x00,0x8D,0x01, -0x00,0xFC,0x74,0x36, -0x24,0x28,0x14,0x01, -0x12,0x80,0x00,0x00, -0x02,0x82,0x10,0x00, -0x3F,0x00,0x02,0x32, -0x00,0x14,0x02,0x00, -0x25,0x28,0xA2,0x00, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0xA6,0x00, -0x94,0x0C,0x44,0x36, -0x00,0x00,0x85,0x8C, -0xFF,0x0F,0x02,0x3C, -0xFF,0xFF,0x55,0x34, -0xC0,0x03,0x10,0x32, -0x24,0x28,0xB5,0x00, -0x80,0x85,0x10,0x00, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0xB0,0x00, -0x10,0x00,0x2C,0x8E, -0x88,0x0C,0x44,0x36, -0x00,0x00,0x88,0x8C, -0x82,0x2A,0x0C,0x00, -0xFF,0x03,0xA5,0x30, -0x24,0x10,0x13,0x01, -0x00,0x02,0xA3,0x30, -0x03,0x00,0x60,0x10, -0x82,0x6D,0x02,0x00, -0x00,0xFC,0x02,0x24, -0x25,0x28,0xA2,0x00, -0x18,0x00,0xAD,0x00, -0x02,0x65,0x0C,0x00, -0xFF,0x03,0x8C,0x31, -0x00,0x02,0x83,0x31, -0x12,0x10,0x00,0x00, -0x02,0x12,0x02,0x00, -0x03,0x00,0x60,0x10, -0xFF,0x03,0x46,0x30, -0x00,0xFC,0x02,0x24, -0x25,0x60,0x82,0x01, -0x18,0x00,0x8D,0x01, -0x24,0x28,0x14,0x01, -0x12,0x80,0x00,0x00, -0x02,0x82,0x10,0x00, -0x3F,0x00,0x02,0x32, -0x00,0x14,0x02,0x00, -0x25,0x28,0xA2,0x00, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0xA6,0x00, -0x9C,0x0C,0x44,0x36, -0x00,0x00,0x85,0x8C, -0xC0,0x03,0x10,0x32, -0x80,0x85,0x10,0x00, -0x24,0x28,0xB5,0x00, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0xB0,0x00, -0x78,0x00,0xA5,0x8F, -0x25,0xB0,0x10,0x3C, -0x02,0x5C,0x00,0x0C, -0xE0,0x0E,0x04,0x36, -0x7C,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0xDC,0x0E,0x04,0x36, -0x80,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x70,0x0E,0x04,0x36, -0x84,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x74,0x0E,0x04,0x36, -0x88,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x78,0x0E,0x04,0x36, -0x8C,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x7C,0x0E,0x04,0x36, -0x90,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x80,0x0E,0x04,0x36, -0x94,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x84,0x0E,0x04,0x36, -0x98,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x88,0x0E,0x04,0x36, -0x9C,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x8C,0x0E,0x04,0x36, -0xA0,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0xD0,0x0E,0x04,0x36, -0xA4,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0xD4,0x0E,0x04,0x36, -0xA8,0x00,0xA5,0x8F, -0x88,0x0E,0x04,0x36, -0x02,0x5C,0x00,0x0C, -0x0F,0x00,0x10,0x3C, -0x70,0x00,0xA6,0x8F, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x74,0x00,0xA6,0x8F, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0xFF,0xFF,0x05,0x36, -0x8A,0x47,0x00,0x0C, -0x1E,0x00,0x04,0x24, -0x21,0x88,0x40,0x00, -0xFD,0xFF,0x06,0x24, -0x01,0x00,0x42,0x34, -0x24,0x30,0x46,0x00, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x1E,0x00,0x04,0x24, -0x25,0x22,0x00,0x0C, -0x03,0x00,0x04,0x24, -0xFF,0xFF,0x05,0x36, -0x03,0x00,0x26,0x36, -0x5F,0x47,0x00,0x0C, -0x1E,0x00,0x04,0x24, -0xDC,0x00,0xBF,0x8F, -0xD8,0x00,0xBE,0x8F, -0xD4,0x00,0xB7,0x8F, -0xD0,0x00,0xB6,0x8F, -0xCC,0x00,0xB5,0x8F, -0xC8,0x00,0xB4,0x8F, -0xC4,0x00,0xB3,0x8F, -0xC0,0x00,0xB2,0x8F, -0xBC,0x00,0xB1,0x8F, -0xB8,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0xE0,0x00,0xBD,0x27, -0xFF,0x00,0x05,0x24, -0xFF,0x00,0x02,0x24, -0x29,0xFF,0xA2,0x14, -0x10,0x00,0xA2,0x27, -0x25,0xB0,0x03,0x3C, -0x94,0x0E,0x62,0x34, -0x9C,0x0E,0x64,0x34, -0xA4,0x0E,0x65,0x34, -0xAC,0x0E,0x66,0x34, -0x02,0x80,0x0F,0x3C, -0x00,0x00,0x49,0x8C, -0x30,0x1F,0xED,0x25, -0x00,0x00,0x8C,0x8C, -0x00,0x00,0xAE,0x8C, -0x00,0x00,0xC7,0x8C, -0xB4,0x0E,0x62,0x34, -0x0C,0x00,0xA4,0x8D, -0x10,0x00,0xA5,0x8D, -0x00,0x00,0x4A,0x8C, -0xFF,0x03,0x06,0x3C, -0x00,0xFC,0x08,0x24, -0xBC,0x0E,0x62,0x34, -0x24,0x48,0x26,0x01, -0x24,0x38,0xE6,0x00, -0x00,0x00,0x4B,0x8C, -0x24,0x28,0xA8,0x00, -0x24,0x20,0x88,0x00, -0x02,0x3C,0x07,0x00, -0xCC,0x0E,0x68,0x34, -0x02,0x4C,0x09,0x00, -0xC4,0x0E,0x63,0x34, -0xF0,0xFF,0x02,0x3C, -0xFF,0x03,0x42,0x34, -0x25,0x28,0xA7,0x00, -0x25,0x20,0x89,0x00, -0x00,0x00,0x67,0x8C, -0x24,0x60,0x86,0x01, -0x00,0x00,0x03,0x8D, -0x24,0x50,0x46,0x01, -0x24,0x28,0xA2,0x00, -0x24,0x20,0x82,0x00, -0x82,0x61,0x0C,0x00, -0x82,0x51,0x0A,0x00, -0x0F,0xC0,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x25,0x20,0x8C,0x00, -0x25,0x28,0xAA,0x00, -0x24,0x70,0xC6,0x01, -0x24,0x58,0x66,0x01, -0x24,0x28,0xA2,0x00, -0x24,0x18,0x66,0x00, -0x00,0x71,0x0E,0x00, -0x24,0x20,0x82,0x00, -0x00,0x59,0x0B,0x00, -0x24,0x38,0xE6,0x00, -0x25,0x20,0x8E,0x00, -0x25,0x28,0xAB,0x00, -0x02,0x3C,0x07,0x00, -0x02,0x1C,0x03,0x00, -0x16,0x00,0xA3,0xA5, -0x0C,0x00,0xA4,0xAD, -0x10,0x00,0xA5,0xAD, -0x4D,0x2A,0x00,0x08, -0x14,0x00,0xA7,0xA5, -0x30,0x00,0xB1,0x8F, -0xF5,0x29,0x00,0x08, -0x21,0x20,0x00,0x02, -0x25,0xB0,0x05,0x3C, -0x4C,0x00,0xA2,0x34, -0x02,0x80,0x07,0x3C, -0x00,0x00,0x43,0x90, -0x30,0x1F,0xE4,0x24, -0xC1,0x1B,0x82,0x90, -0x03,0x00,0x66,0x30, -0x24,0x00,0x46,0x10, -0x00,0x00,0x00,0x00, -0x18,0x00,0xC0,0x14, -0x25,0xB0,0x03,0x3C, -0xE6,0x02,0x82,0x90, -0x00,0x00,0x00,0x00, -0x15,0x00,0x40,0x14, -0x58,0x00,0x62,0x34, -0x1C,0x00,0x02,0x24, -0x50,0x0C,0xA3,0x34, -0x00,0x00,0x62,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x25,0xB0,0x02,0x3C, -0x58,0x0C,0x42,0x34, -0x1C,0x00,0x03,0x24, -0x00,0x00,0x43,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x25,0xB0,0x03,0x3C, -0x58,0x00,0x62,0x34, -0x00,0x00,0x45,0x8C, -0x29,0xB0,0x04,0x3C, -0x5C,0x00,0x63,0x34, -0x00,0x00,0x85,0xAC, -0x00,0x00,0x65,0x8C, -0x30,0x1F,0xE2,0x24, -0x04,0x00,0x84,0x34, -0xC1,0x1B,0x46,0xA0, -0x00,0x00,0x85,0xAC, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x2D,0x0A,0x46,0x34, -0xA2,0x0D,0x43,0x34, -0xA4,0x0D,0x44,0x34, -0xA6,0x0D,0x45,0x34, -0xA8,0x0D,0x42,0x34, -0x00,0x00,0x67,0x94, -0x00,0x00,0x88,0x94, -0x00,0x00,0xA9,0x94, -0x00,0x00,0x44,0x94, -0x00,0x00,0xC3,0x90, -0x02,0x80,0x0A,0x3C, -0x30,0x1F,0x42,0x25, -0x40,0x00,0x63,0x34, -0xFF,0x00,0x63,0x30, -0xDE,0x02,0x44,0xA4, -0x00,0x00,0xC3,0xA0, -0xD8,0x02,0x47,0xA4, -0xDA,0x02,0x48,0xA4, -0xDC,0x02,0x49,0xA4, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x25,0xB0,0x07,0x3C, -0x5B,0x0A,0xE2,0x34, -0x00,0x00,0x44,0x90, -0x30,0x1F,0x46,0x25, -0x5C,0x0A,0xE2,0x34, -0x00,0x00,0x45,0x90, -0xD8,0x02,0xC3,0x94, -0xDA,0x02,0xC2,0x94, -0xDC,0x02,0xC9,0x94, -0xDE,0x02,0xC8,0x94, -0xFF,0x00,0x84,0x30, -0x21,0x18,0x62,0x00, -0x00,0x22,0x04,0x00, -0xFF,0x00,0xA5,0x30, -0x21,0x20,0x85,0x00, -0x21,0x18,0x69,0x00, -0xFF,0xFF,0x82,0x30, -0x21,0x18,0x68,0x00, -0x21,0x18,0x62,0x00, -0x64,0x0C,0xE7,0x34, -0xFF,0xFF,0x42,0x30, -0xE0,0x02,0xC3,0xAC, -0x00,0x00,0xE2,0xA4, -0xE4,0x02,0xC4,0xA4, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x42,0x8D, -0x01,0x00,0x03,0x24, -0x0F,0x00,0x44,0x30, -0x07,0x00,0x83,0x10, -0x30,0x1F,0x45,0x25, -0xB6,0x5F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x10,0x00,0xBF,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE4,0x02,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x02,0x17,0x02,0x00, -0x03,0x00,0x42,0x30, -0xF5,0xFF,0x40,0x14, -0x25,0xB0,0x02,0x3C, -0x4C,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x63,0x30, -0x3F,0x00,0x64,0x10, -0x30,0x1F,0x44,0x25, -0xE6,0x02,0x82,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x40,0x14, -0x01,0x00,0x03,0x24, -0x30,0x1F,0x42,0x8D, -0x00,0x00,0x00,0x00, -0x02,0x12,0x02,0x00, -0x0F,0x00,0x42,0x30, -0x3C,0x00,0x43,0x10, -0x25,0xB0,0x02,0x3C, -0x30,0x1F,0x45,0x25, -0xE6,0x02,0xA3,0x90, -0xFF,0x00,0x02,0x24, -0xE0,0xFF,0x62,0x14, -0x25,0xB0,0x03,0x3C, -0xC8,0x02,0xA2,0x94, -0xE0,0x02,0xA6,0x8C, -0x50,0x0C,0x63,0x34, -0x00,0x00,0x64,0x90, -0x2B,0x10,0xC2,0x00, -0x85,0x00,0x40,0x10, -0x7F,0x00,0x84,0x30, -0xFF,0xFF,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x30,0x1F,0x45,0x25, -0xD0,0x02,0xA3,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x64,0x00, -0x78,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x21,0x20,0x60,0x00, -0x30,0x1F,0x43,0x25, -0xE0,0x02,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x11,0x27,0x42,0x2C, -0x6D,0x00,0x40,0x14, -0x3A,0x00,0x82,0x2C, -0x32,0x00,0x04,0x24, -0x44,0x00,0x03,0x24, -0x25,0xB0,0x02,0x3C, -0x30,0x0C,0x42,0x34, -0x00,0x00,0x43,0xA0, -0x25,0xB0,0x02,0x3C, -0x50,0x0C,0x42,0x34, -0x00,0x00,0x44,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x25,0xB0,0x02,0x3C, -0x58,0x0C,0x42,0x34, -0x00,0x00,0x44,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0xA4,0x2B,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE6,0x02,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xBF,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x02,0x24, -0xB6,0x2B,0x00,0x08, -0xE6,0x02,0xA2,0xA0, -0x4C,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x63,0x30, -0xA4,0xFF,0x60,0x10, -0xFF,0xFF,0x02,0x34, -0x80,0x36,0x83,0x8C, -0x00,0x00,0x00,0x00, -0xA0,0xFF,0x62,0x10, -0x00,0x00,0x00,0x00, -0xE0,0x02,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x65,0x00,0x62,0x2C, -0x59,0x00,0x40,0x14, -0x28,0x00,0x62,0x2C, -0xD2,0x02,0x83,0x90, -0x00,0x00,0x00,0x00, -0x00,0x16,0x03,0x00, -0x03,0x16,0x02,0x00, -0xFE,0xFF,0x42,0x24, -0xFC,0xFF,0x42,0x28, -0x02,0x00,0x40,0x10, -0xFE,0xFF,0x62,0x24, -0xFC,0xFF,0x02,0x24, -0xD2,0x02,0x82,0xA0, -0x30,0x1F,0x45,0x25, -0x80,0x36,0xA2,0x8C, -0xD2,0x02,0xA3,0x90, -0xCE,0x02,0xA6,0x90, -0x02,0x11,0x02,0x00, -0x7F,0x00,0x42,0x30, -0x0A,0x00,0x44,0x24, -0x23,0x18,0x83,0x00, -0x00,0x26,0x03,0x00, -0x03,0x26,0x04,0x00, -0xFF,0x00,0xC2,0x30, -0x2A,0x10,0x44,0x00, -0x4D,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x00,0x26,0x06,0x00, -0x03,0x26,0x04,0x00, -0x30,0x1F,0x43,0x25, -0xE0,0x02,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x11,0x27,0x42,0x2C, -0x33,0x00,0x40,0x14, -0x3A,0x00,0x82,0x28, -0x32,0x00,0x82,0x28, -0x30,0x00,0x40,0x10, -0x3A,0x00,0x82,0x28, -0x32,0x00,0x04,0x24, -0x44,0x00,0x03,0x24, -0x25,0xB0,0x02,0x3C, -0x30,0x0C,0x42,0x34, -0x00,0x00,0x43,0xA0, -0x25,0xB0,0x02,0x3C, -0x50,0x0C,0x42,0x34, -0xFF,0x00,0x84,0x30, -0x00,0x00,0x44,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x25,0xB0,0x02,0x3C, -0x58,0x0C,0x42,0x34, -0x00,0x00,0x44,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0xA4,0x2B,0x00,0x08, -0x00,0x00,0x00,0x00, -0x95,0xFF,0x40,0x10, -0x48,0x00,0x03,0x24, -0xDD,0x2B,0x00,0x08, -0x44,0x00,0x03,0x24, -0xD1,0x02,0xA3,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x83,0x00, -0xD5,0x2B,0x00,0x08, -0x0B,0x20,0x62,0x00, -0xCA,0x02,0xA2,0x94, -0x00,0x00,0x00,0x00, -0x2B,0x10,0xC2,0x00, -0x7A,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0xCC,0x02,0xA2,0x94, -0x00,0x00,0x00,0x00, -0x2B,0x10,0xC2,0x00, -0x07,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xCD,0x2B,0x00,0x08, -0x01,0x00,0x82,0x24, -0xD2,0xFF,0x40,0x10, -0x48,0x00,0x03,0x24, -0x2F,0x2C,0x00,0x08, -0x44,0x00,0x03,0x24, -0xCD,0x2B,0x00,0x08, -0x02,0x00,0x82,0x24, -0xB2,0xFF,0x40,0x10, -0x30,0x1F,0x45,0x25, -0xD2,0x02,0x83,0x90, -0x00,0x00,0x00,0x00, -0x00,0x16,0x03,0x00, -0x03,0x16,0x02,0x00, -0x02,0x00,0x42,0x24, -0x0D,0x00,0x42,0x28, -0x09,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x13,0x2C,0x00,0x08, -0x0C,0x00,0x02,0x24, -0xCF,0x02,0xA3,0x80, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x62,0x30, -0x2A,0x10,0x82,0x00, -0x24,0x2C,0x00,0x08, -0x0B,0x20,0x62,0x00, -0x13,0x2C,0x00,0x08, -0x02,0x00,0x62,0x24, -0xC0,0xFF,0xBD,0x27, -0x28,0x00,0xB4,0xAF, -0x25,0xB0,0x14,0x3C, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x34,0x00,0xB7,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x24,0x00,0xB3,0xAF, -0xD8,0x00,0x86,0x36, -0x00,0x00,0xC3,0x90, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x51,0x24, -0x2A,0xB0,0x10,0x3C, -0xA0,0xFF,0x02,0x24, -0x25,0x18,0x62,0x00, -0x34,0x00,0x05,0x36, -0xFE,0xFF,0x02,0x24, -0xBC,0x02,0x33,0x92, -0x40,0x00,0x04,0x24, -0x00,0x00,0xC3,0xA0, -0x00,0x00,0xA2,0xA0, -0x25,0x24,0x00,0x0C, -0x00,0x9E,0x13,0x00, -0x21,0x90,0x40,0x00, -0x8A,0x00,0x40,0x12, -0x00,0x40,0x02,0x3C, -0x08,0x00,0x43,0x8E, -0xB0,0x03,0x82,0x36, -0x25,0xB0,0x1E,0x3C, -0x21,0x20,0x40,0x02, -0x00,0x00,0x43,0xAC, -0x0C,0x4D,0x00,0x0C, -0x21,0xB8,0x20,0x02, -0x42,0x00,0xD5,0x37, -0x03,0x0C,0xD1,0x37, -0x17,0x0E,0xD6,0x37, -0x04,0x00,0x14,0x24, -0x2A,0xB0,0x03,0x3C, -0x06,0x00,0x63,0x34, -0x00,0x00,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0xFF,0x42,0x30, -0x0A,0x00,0x40,0x18, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x8C,0xF0,0x84,0x24, -0x00,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0xFF,0x42,0x30, -0xFC,0xFF,0x40,0x1C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x45,0x8E, -0x20,0x10,0x06,0x3C, -0x01,0x00,0x04,0x24, -0x00,0xFE,0xC6,0x34, -0x40,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA4,0xAF, -0xB0,0x01,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x02,0x80,0x02,0x3C, -0x90,0xF0,0x42,0x24, -0x00,0x00,0x45,0x8C, -0x01,0x00,0x03,0x24, -0x21,0x20,0x00,0x00, -0x00,0x00,0xA3,0xA0, -0xFF,0xFF,0x03,0x24, -0x00,0x00,0xA3,0xA2, -0x00,0x00,0x22,0x92, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x40,0x00,0x42,0x34, -0x00,0x00,0x22,0xA2, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x02,0x00,0x02,0x24, -0x02,0x80,0x04,0x3C, -0x00,0x00,0xA2,0xA0, -0x30,0x1F,0x83,0x24, -0xC1,0x02,0x62,0x90, -0x00,0x00,0xC4,0x92, -0x21,0x28,0x00,0x00, -0x00,0x00,0xC2,0xA2, -0xFF,0x00,0x90,0x30, -0x01,0x00,0xA2,0x24, -0xFF,0x00,0x45,0x30, -0x06,0x00,0xA3,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0xA2,0x24, -0xEF,0xFF,0x02,0x24, -0x64,0x00,0x04,0x24, -0x00,0x00,0xA2,0xA2, -0x54,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x22,0x92, -0x21,0x20,0x00,0x00, -0xBF,0x00,0x42,0x30, -0x00,0x00,0x22,0xA2, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x54,0x22,0x00,0x0C, -0x84,0x03,0x04,0x24, -0xF4,0x08,0xC2,0x37, -0x00,0x00,0x43,0x8C, -0x00,0x80,0x04,0x3C, -0xDF,0x07,0x84,0x34, -0x00,0x00,0xD0,0xA2, -0x21,0x10,0x00,0x00, -0x24,0x28,0x64,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x00,0x00,0xA0,0xA2, -0x00,0x00,0x22,0x92, -0x21,0x20,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x40,0x00,0x42,0x34, -0x00,0x00,0x22,0xA2, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0xBE,0x02,0xE2,0x92, -0x1F,0x00,0xA3,0x30, -0x2B,0x10,0x62,0x00, -0x0A,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xBF,0x02,0xE2,0x92, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0x05,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x01,0x00,0x02,0x3C, -0x25,0x10,0x62,0x00, -0x21,0x98,0x62,0x02, -0x02,0x80,0x02,0x3C, -0xDE,0x5D,0x43,0x90, -0x22,0x00,0x02,0x24, -0x19,0x00,0x62,0x10, -0x92,0x00,0x02,0x24, -0x18,0x00,0x62,0x10, -0x02,0x80,0x03,0x3C, -0xFF,0xFF,0x94,0x26, -0x54,0x22,0x00,0x0C, -0xF4,0x01,0x04,0x24, -0x89,0xFF,0x81,0x06, -0x2A,0xB0,0x03,0x3C, -0x04,0x00,0x40,0x12, -0x21,0x10,0x60,0x02, -0x3D,0x24,0x00,0x0C, -0x21,0x20,0x40,0x02, -0x21,0x10,0x60,0x02, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x40,0x00,0xBD,0x27, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x63,0x24, -0xBE,0x02,0x62,0x90, -0xC0,0x07,0xA3,0x30, -0x82,0x19,0x03,0x00, -0x2B,0x10,0x62,0x00, -0xE3,0xFF,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x84,0x24, -0xBF,0x02,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x43,0x00, -0xDD,0xFF,0x40,0x10, -0x00,0x12,0x03,0x00, -0x10,0x00,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x13,0x2D,0x00,0x08, -0x21,0x98,0x62,0x02, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x0F,0x00,0x10,0x3C, -0xFF,0xFF,0x05,0x36, -0xF0,0xF8,0x06,0x34, -0x15,0x00,0x04,0x24, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x5F,0x47,0x00,0x0C, -0x14,0x00,0xB1,0xAF, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x02,0x80,0x12,0x3C, -0xFF,0xFF,0x05,0x36, -0x56,0x30,0x06,0x24, -0x5F,0x47,0x00,0x0C, -0x1A,0x00,0x04,0x24, -0x30,0x1F,0x51,0x26, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x04,0x03,0x23,0x92, -0x04,0x00,0x02,0x24, -0x20,0x00,0x62,0x10, -0x25,0xB0,0x02,0x3C, -0x14,0x03,0x25,0x8E, -0x25,0xB0,0x10,0x3C, -0x43,0x60,0x00,0x0C, -0x00,0x0E,0x04,0x36, -0x14,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x04,0x0E,0x04,0x36, -0x18,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x08,0x0E,0x04,0x36, -0x14,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x10,0x0E,0x04,0x36, -0x14,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x14,0x0E,0x04,0x36, -0x14,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x18,0x0E,0x04,0x36, -0x14,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x1C,0x0E,0x04,0x36, -0x30,0x1F,0x43,0x26, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x04,0x00,0x02,0x24, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x04,0x03,0x62,0xA0, -0x00,0x0E,0x42,0x34, -0x00,0x00,0x43,0x8C, -0x14,0x03,0x25,0x8E, -0x00,0x00,0x00,0x00, -0xDE,0xFF,0x65,0x14, -0x25,0xB0,0x10,0x3C, -0x6A,0x2D,0x00,0x08, -0x30,0x1F,0x43,0x26, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x0F,0x00,0x10,0x3C, -0xFF,0xFF,0x05,0x36, -0xF0,0xF8,0x06,0x34, -0x15,0x00,0x04,0x24, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x5F,0x47,0x00,0x0C, -0x14,0x00,0xB1,0xAF, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xFF,0xFF,0x05,0x36, -0x56,0x30,0x06,0x24, -0x5F,0x47,0x00,0x0C, -0x1A,0x00,0x04,0x24, -0x02,0x80,0x10,0x3C, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x30,0x1F,0x02,0x26, -0x04,0x03,0x46,0x90, -0x25,0xB0,0x11,0x3C, -0x10,0x10,0x12,0x3C, -0x01,0x00,0x03,0x24, -0x00,0x0E,0x24,0x36, -0x1E,0x00,0xC3,0x10, -0x10,0x10,0x45,0x36, -0x43,0x60,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x04,0x0E,0x24,0x36, -0x43,0x60,0x00,0x0C, -0x10,0x10,0x45,0x36, -0x08,0x0E,0x24,0x36, -0x43,0x60,0x00,0x0C, -0x10,0x10,0x05,0x24, -0x10,0x0E,0x24,0x36, -0x43,0x60,0x00,0x0C, -0x10,0x10,0x45,0x36, -0x14,0x0E,0x24,0x36, -0x43,0x60,0x00,0x0C, -0x10,0x10,0x45,0x36, -0x18,0x0E,0x24,0x36, -0x43,0x60,0x00,0x0C, -0x10,0x10,0x45,0x36, -0x1C,0x0E,0x24,0x36, -0x43,0x60,0x00,0x0C, -0x10,0x10,0x45,0x36, -0x30,0x1F,0x03,0x26, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x02,0x24, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x04,0x03,0x62,0xA0, -0x00,0x00,0x86,0x8C, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xC5,0x14, -0x30,0x1F,0x03,0x26, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x02,0x24, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x04,0x03,0x62,0xA0, -0xD8,0xFF,0xBD,0x27, -0x1C,0x00,0xB3,0xAF, -0x02,0x80,0x13,0x3C, -0x14,0x00,0xB1,0xAF, -0x30,0x1F,0x71,0x26, -0x0C,0x03,0x26,0x8E, -0x10,0x00,0xB0,0xAF, -0x0F,0x00,0x10,0x3C, -0xFF,0xFF,0x05,0x36, -0x15,0x00,0x04,0x24, -0x20,0x00,0xBF,0xAF, -0x5F,0x47,0x00,0x0C, -0x18,0x00,0xB2,0xAF, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x10,0x03,0x26,0x8E, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x1A,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x04,0x03,0x22,0x92, -0x25,0xB0,0x12,0x3C, -0x08,0x00,0x40,0x14, -0x08,0x0E,0x44,0x36, -0x25,0xB0,0x02,0x3C, -0x00,0x0E,0x42,0x34, -0x00,0x00,0x45,0x8C, -0xEC,0x02,0x23,0x8E, -0x00,0x00,0x00,0x00, -0x17,0x00,0xA3,0x10, -0x30,0x1F,0x62,0x26, -0xE8,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEC,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x00,0x0E,0x44,0x36, -0xF0,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x04,0x0E,0x44,0x36, -0xF4,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x10,0x0E,0x44,0x36, -0xF8,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x14,0x0E,0x44,0x36, -0xFC,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x18,0x0E,0x44,0x36, -0x00,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x1C,0x0E,0x44,0x36, -0x30,0x1F,0x62,0x26, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x28,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x04,0x03,0x40,0xA0, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x02,0x80,0x12,0x3C, -0x14,0x00,0xB1,0xAF, -0x30,0x1F,0x51,0x26, -0x0C,0x03,0x26,0x8E, -0x10,0x00,0xB0,0xAF, -0x0F,0x00,0x10,0x3C, -0xFF,0xFF,0x05,0x36, -0x1C,0x00,0xBF,0xAF, -0x5F,0x47,0x00,0x0C, -0x15,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x10,0x03,0x26,0x8E, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x1A,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x04,0x03,0x23,0x92, -0x03,0x00,0x02,0x24, -0x2C,0x00,0x62,0x10, -0x25,0xB0,0x02,0x3C, -0xEC,0x02,0x25,0x8E, -0x25,0xB0,0x10,0x3C, -0x43,0x60,0x00,0x0C, -0x00,0x0E,0x04,0x36, -0xF0,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x04,0x0E,0x04,0x36, -0xF4,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x10,0x0E,0x04,0x36, -0xF8,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x14,0x0E,0x04,0x36, -0xFC,0x02,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x18,0x0E,0x04,0x36, -0x00,0x03,0x25,0x8E, -0x43,0x60,0x00,0x0C, -0x1C,0x0E,0x04,0x36, -0x08,0x03,0x24,0x8E, -0xE8,0x02,0x22,0x8E, -0x00,0x00,0x00,0x00, -0x21,0x28,0x44,0x00, -0x00,0xFF,0xA3,0x30, -0xFF,0xFF,0x02,0x3C, -0xFF,0x00,0x42,0x34, -0x01,0x3F,0x63,0x2C, -0x24,0x10,0xA2,0x00, -0x0C,0x00,0x60,0x10, -0x08,0x0E,0x04,0x36, -0x43,0x60,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x43,0x26, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x03,0x00,0x02,0x24, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x04,0x03,0x62,0xA0, -0x32,0x2E,0x00,0x08, -0x00,0x3F,0x45,0x34, -0x00,0x0E,0x42,0x34, -0x00,0x00,0x43,0x8C, -0xEC,0x02,0x25,0x8E, -0x00,0x00,0x00,0x00, -0xD2,0xFF,0x65,0x14, -0x25,0xB0,0x10,0x3C, -0x35,0x2E,0x00,0x08, -0x30,0x1F,0x43,0x26, -0xD8,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x02,0x80,0x12,0x3C, -0x20,0x00,0xB4,0xAF, -0x24,0x00,0xBF,0xAF, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x44,0x26, -0x0C,0x24,0x82,0x8C, -0x30,0x1F,0x43,0x8E, -0x04,0x03,0x93,0x90, -0x02,0x11,0x02,0x00, -0x7F,0x00,0x54,0x30, -0xF0,0xF0,0x63,0x30, -0x00,0x10,0x02,0x24, -0x6A,0x00,0x62,0x10, -0x01,0x00,0x02,0x24, -0x25,0xB0,0x08,0x3C, -0x4C,0x00,0x03,0x35, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x42,0x30, -0x08,0x00,0x40,0x10, -0x30,0x1F,0x45,0x26, -0x30,0x1F,0x42,0x8E, -0x00,0x00,0x00,0x00, -0x02,0x13,0x02,0x00, -0x0F,0x00,0x42,0x30, -0x2F,0x00,0x40,0x10, -0x00,0x0E,0x05,0x35, -0x30,0x1F,0x45,0x26, -0x04,0x03,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x02,0x12,0x02,0x00, -0x0F,0x00,0x40,0x14, -0x30,0x1F,0x42,0x26, -0x25,0xB0,0x02,0x3C, -0x84,0x01,0x42,0x34, -0x00,0x00,0x44,0x8C, -0x0D,0x00,0x03,0x24, -0x7C,0x00,0x83,0x10, -0x3E,0x00,0x02,0x24, -0x4A,0x00,0x03,0x24, -0x1F,0x03,0xA2,0xA0, -0x1C,0x03,0xA3,0xA0, -0x45,0x00,0x02,0x24, -0x43,0x00,0x03,0x24, -0x1D,0x03,0xA2,0xA0, -0x1E,0x03,0xA3,0xA0, -0x30,0x1F,0x42,0x26, -0x0C,0x24,0x43,0x8C, -0x25,0xB0,0x02,0x3C, -0x60,0x0C,0x42,0x34, -0x02,0x19,0x03,0x00, -0xFF,0x00,0x63,0x30, -0x00,0x00,0x43,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x45,0x8E, -0x10,0x10,0x02,0x24, -0xF0,0xF0,0xA3,0x30, -0x3F,0x00,0x62,0x10, -0x30,0x1F,0x44,0x26, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x00,0x00,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x5F,0x00,0x40,0x10, -0x10,0x0E,0x07,0x35, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x08,0x0E,0x02,0x35, -0x04,0x0E,0x03,0x35, -0x00,0x00,0x44,0x8C, -0x00,0x00,0xA5,0x8C, -0x00,0x00,0x66,0x8C, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x49,0x24, -0xE8,0x02,0x24,0xAD, -0xEC,0x02,0x25,0xAD, -0xF0,0x02,0x26,0xAD, -0x14,0x0E,0x04,0x35, -0x02,0x80,0x02,0x3C, -0x18,0x0E,0x05,0x35, -0x00,0x00,0xE7,0x8C, -0x1C,0x0E,0x06,0x35, -0x00,0x00,0x83,0x8C, -0xDE,0x5D,0x4A,0x90, -0x00,0x00,0xA2,0x8C, -0x00,0x00,0xC4,0x8C, -0xF4,0x02,0x27,0xAD, -0xFC,0x02,0x22,0xAD, -0x22,0x00,0x02,0x24, -0xF8,0x02,0x23,0xAD, -0x5B,0x00,0x42,0x11, -0x00,0x03,0x24,0xAD, -0x92,0x00,0x02,0x24, -0x59,0x00,0x42,0x11, -0x0D,0x08,0x02,0x35, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x30,0x1F,0x43,0x8E, -0xFF,0xFF,0x02,0x3C, -0xFF,0x0F,0x42,0x34, -0x24,0x18,0x62,0x00, -0x00,0x10,0x63,0x34, -0x66,0x2E,0x00,0x08, -0x30,0x1F,0x43,0xAE, -0x3A,0x00,0x62,0x12, -0x04,0x00,0x02,0x24, -0x38,0x00,0x62,0x12, -0x30,0x1F,0x43,0x26, -0xFF,0xFF,0x02,0x24, -0x59,0x2E,0x00,0x08, -0x04,0x03,0x62,0xA0, -0x0C,0x24,0x83,0x8C, -0xFF,0xFF,0x02,0x34, -0xBF,0xFF,0x62,0x10, -0x02,0x12,0x05,0x00, -0x0F,0x00,0x45,0x30, -0x01,0x00,0x03,0x24, -0xBB,0xFF,0xA3,0x14, -0x25,0xB0,0x02,0x3C, -0x4C,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x63,0x30, -0xB5,0xFF,0x60,0x10, -0x03,0x00,0x02,0x24, -0x65,0x00,0x62,0x12, -0x04,0x00,0x62,0x2A, -0x47,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x6A,0x00,0x60,0x12, -0x00,0x00,0x00,0x00, -0xAD,0xFF,0x65,0x16, -0x00,0x00,0x00,0x00, -0x1C,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x82,0x02, -0x56,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x1F,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x54,0x00, -0x48,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0xBE,0x2D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x8B,0x2E,0x00,0x08, -0x00,0x00,0x00,0x00, -0x3B,0x00,0x02,0x24, -0x46,0x00,0x03,0x24, -0x1F,0x03,0xA2,0xA0, -0x1C,0x03,0xA3,0xA0, -0x41,0x00,0x02,0x24, -0x40,0x00,0x03,0x24, -0x1D,0x03,0xA2,0xA0, -0x79,0x2E,0x00,0x08, -0x1E,0x03,0xA3,0xA0, -0x00,0x00,0xE3,0x8C, -0x3F,0x3F,0x02,0x3C, -0x3F,0x3F,0x42,0x34, -0x9E,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x67,0x2E,0x00,0x08, -0x30,0x1F,0x45,0x26, -0x0F,0x00,0x10,0x3C, -0x01,0x00,0x11,0x3C, -0xFF,0xFF,0x05,0x36, -0xF4,0x98,0x26,0x36, -0x5F,0x47,0x00,0x0C, -0x15,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xFF,0xFF,0x05,0x36, -0x56,0x30,0x26,0x36, -0x5F,0x47,0x00,0x0C, -0x1A,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x30,0x1F,0x43,0x26, -0xFF,0xFF,0x02,0x24, -0x59,0x2E,0x00,0x08, -0x04,0x03,0x62,0xA0, -0x0D,0x08,0x02,0x35, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x63,0x30, -0x08,0x00,0x62,0x2C, -0x0F,0x00,0x63,0x38, -0xA2,0xFF,0x40,0x14, -0x01,0x00,0x65,0x24, -0x00,0x16,0x05,0x00, -0x00,0x24,0x05,0x00, -0x00,0x1A,0x05,0x00, -0x25,0x10,0x44,0x00, -0x25,0x10,0x43,0x00, -0x25,0x10,0x45,0x00, -0x25,0x18,0x65,0x00, -0x18,0x03,0x23,0xAD, -0xB8,0x2E,0x00,0x08, -0x14,0x03,0x22,0xAD, -0x04,0x00,0x02,0x24, -0x11,0x00,0x62,0x12, -0xFF,0x00,0x02,0x24, -0x66,0xFF,0x62,0x16, -0x00,0x00,0x00,0x00, -0x1E,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x82,0x02, -0x21,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x1C,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x82,0x02, -0x0A,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x7A,0x2D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x8B,0x2E,0x00,0x08, -0x00,0x00,0x00,0x00, -0x1D,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x54,0x00, -0xF8,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x3B,0x2D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x8B,0x2E,0x00,0x08, -0x00,0x00,0x00,0x00, -0x20,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x82,0x02, -0xA8,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0xFC,0x2D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x8B,0x2E,0x00,0x08, -0x00,0x00,0x00,0x00, -0x1E,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x82,0x02, -0xE6,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x21,0x03,0x82,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x54,0x00, -0x9A,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0xFC,0x2D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x8B,0x2E,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x08,0x3C, -0x30,0x1F,0x05,0x25, -0x80,0x36,0xA4,0x8C, -0xE6,0x02,0xA3,0x90, -0x02,0x11,0x04,0x00, -0x26,0x00,0x60,0x14, -0x7F,0x00,0x46,0x30, -0x25,0xB0,0x07,0x3C, -0x4C,0x00,0xE2,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x20,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x02,0x34, -0x1D,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0x00,0x08,0xE3,0x34, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x30, -0x19,0x00,0x40,0x10, -0x4B,0x00,0xC2,0x2C, -0x3E,0x00,0x40,0x10, -0x01,0x00,0x04,0x24, -0xD8,0xFF,0xC2,0x24, -0x1E,0x00,0x42,0x2C, -0x49,0x00,0x40,0x10, -0x23,0x00,0xC2,0x2C, -0x30,0x1F,0x04,0x25, -0xD3,0x02,0x82,0x90, -0x00,0x00,0x00,0x00, -0x44,0x00,0x40,0x10, -0x23,0x00,0xC2,0x2C, -0x25,0xB0,0x02,0x3C, -0x87,0x0C,0x42,0x34, -0x20,0x00,0x03,0x24, -0x00,0x00,0x43,0xA0, -0xD3,0x02,0x80,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x17,0x00,0x40,0x10, -0x01,0x00,0x04,0x24, -0xD8,0xFF,0xC2,0x24, -0x1E,0x00,0x42,0x2C, -0x44,0x00,0x40,0x10, -0x23,0x00,0xC2,0x2C, -0x30,0x1F,0x04,0x25, -0xD3,0x02,0x82,0x90, -0x00,0x00,0x00,0x00, -0x3F,0x00,0x40,0x10, -0x23,0x00,0xC2,0x2C, -0x25,0xB0,0x02,0x3C, -0x30,0x0C,0x42,0x34, -0x44,0x00,0x03,0x24, -0x00,0x00,0x43,0xA0, -0xD3,0x02,0x80,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xD3,0x02,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xE7,0xFF,0x44,0x10, -0x43,0x00,0x02,0x24, -0x30,0x0C,0xE3,0x34, -0xD3,0x02,0xA4,0xA0, -0x00,0x00,0x62,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xD3,0x02,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xC0,0xFF,0x44,0x10, -0x10,0x00,0x02,0x24, -0x87,0x0C,0xE3,0x34, -0xD3,0x02,0xA4,0xA0, -0x00,0x00,0x62,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xC7,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x04,0x25, -0xD3,0x02,0x82,0x90, -0x02,0x00,0x03,0x24, -0xC2,0xFF,0x43,0x10, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x87,0x0C,0x42,0x34, -0xD3,0x02,0x83,0xA0, -0x00,0x00,0x40,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xB4,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x04,0x25, -0xD3,0x02,0x82,0x90, -0x02,0x00,0x03,0x24, -0xAF,0xFF,0x43,0x10, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0xD3,0x02,0x83,0xA0, -0x30,0x0C,0x42,0x34, -0x42,0x00,0x03,0x24, -0x00,0x00,0x43,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0x01,0x80,0x02,0x3C, -0x18,0x03,0x64,0x34, -0x7C,0xBF,0x42,0x24, -0x00,0x00,0x82,0xAC, -0x00,0x60,0x07,0x40, -0x01,0x00,0xE1,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x20,0x80,0x02,0x3C, -0x30,0x03,0x63,0x34, -0x00,0x00,0x62,0xAC, -0x25,0xB0,0x06,0x3C, -0x01,0x80,0x02,0x3C, -0x7D,0xBF,0x45,0x24, -0x33,0x03,0xC3,0x34, -0x00,0x00,0x85,0xAC, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x40,0x00,0x42,0x30, -0xFB,0xFF,0x40,0x10, -0x30,0x03,0xC2,0x34, -0x00,0x00,0x45,0x8C, -0x0F,0x00,0x03,0x3C, -0xFF,0xFF,0x63,0x34, -0x24,0x28,0xA3,0x00, -0x40,0x11,0x05,0x00, -0x23,0x10,0x45,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x45,0x00, -0xAF,0x0F,0x04,0x3C, -0xC0,0x10,0x02,0x00, -0x00,0xA0,0x84,0x34, -0x1B,0x00,0x82,0x00, -0x02,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x63,0x24, -0xC2,0x28,0x05,0x00, -0xA0,0x3E,0x65,0xAC, -0x12,0x20,0x00,0x00, -0xA4,0x3E,0x64,0xAC, -0x00,0x60,0x87,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x01,0x00,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x14,0x5F,0x43,0xA0, -0xD0,0x07,0x04,0x24, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xE4,0x5E,0x44,0xAC, -0x13,0x5F,0x60,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x04,0x3C, -0x28,0x00,0x85,0x34, -0x02,0x00,0x82,0x94, -0x04,0x00,0x84,0x24, -0x05,0x00,0x40,0x14, -0x2B,0x18,0xA4,0x00, -0xFB,0xFF,0x60,0x10, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0xBE,0x00,0x63,0x34, -0x00,0x00,0x62,0x94, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x42,0x2C, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x17,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x19,0x00,0x40,0x10, -0x74,0x57,0x64,0x24, -0x74,0x57,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x15,0x00,0x44,0x14, -0x02,0x80,0x02,0x3C, -0x14,0x5F,0x43,0x90, -0x01,0x00,0x02,0x24, -0xFF,0x00,0x63,0x30, -0x10,0x00,0x62,0x10, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x05,0x00,0x42,0x28, -0x0A,0x00,0x40,0x10, -0x01,0x00,0x04,0x24, -0x02,0x80,0x02,0x3C, -0x9C,0x5A,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x05,0x00,0x60,0x14, -0x21,0x10,0x80,0x00, -0x10,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x10,0x00,0xBF,0x8F, -0x21,0x20,0x00,0x00, -0x21,0x10,0x80,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x17,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2C,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x74,0x57,0x43,0x8C, -0x74,0x57,0x42,0x24, -0x28,0x00,0x62,0x14, -0x02,0x80,0x03,0x3C, -0x0C,0x5F,0x62,0x90, -0x01,0x00,0x04,0x24, -0xFF,0x00,0x42,0x30, -0x23,0x00,0x44,0x10, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x03,0x00,0x42,0x28, -0x1D,0x00,0x40,0x10, -0x02,0x80,0x03,0x3C, -0x0E,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x04,0x00,0x42,0x30, -0x18,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x0E,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x10,0x00,0x42,0x30, -0x13,0x00,0x40,0x14, -0x02,0x80,0x03,0x3C, -0x14,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x0E,0x00,0x44,0x10, -0x02,0x80,0x02,0x3C, -0x15,0x5F,0x43,0x90, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x60,0x14, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x6C,0x3B,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x06,0x00,0x60,0x14, -0x21,0x18,0x00,0x00, -0x40,0x39,0x42,0x8C, -0x00,0x00,0x00,0x00, -0x02,0x00,0x40,0x14, -0x01,0x00,0x03,0x24, -0x21,0x18,0x00,0x00, -0x10,0x00,0xBF,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x23,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x0E,0x00,0x40,0x10, -0x6C,0x57,0x65,0x24, -0x6C,0x57,0x62,0x8C, -0x02,0x80,0x04,0x3C, -0x64,0x57,0x86,0x24, -0x09,0x00,0x45,0x14, -0x01,0x00,0x03,0x24, -0x64,0x57,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x05,0x00,0x46,0x14, -0x21,0x10,0x60,0x00, -0x10,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x10,0x00,0xBF,0x8F, -0x21,0x18,0x00,0x00, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x20,0x00,0xBF,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0xFF,0x00,0x84,0x30, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x0E,0x00,0x80,0x10, -0x02,0x80,0x13,0x3C, -0x44,0x5F,0x62,0x92, -0x01,0x00,0x03,0x24, -0xFF,0x00,0x42,0x30, -0x39,0x00,0x43,0x10, -0x25,0xB0,0x03,0x3C, -0x00,0x60,0x92,0x40, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x44,0x5F,0x62,0x92, -0x02,0x00,0x03,0x24, -0xFF,0x00,0x42,0x30, -0xF4,0xFF,0x43,0x14, -0x44,0x08,0x04,0x24, -0x94,0x60,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0x04,0x0C,0x62,0x90, -0x21,0x20,0x00,0x00, -0xFD,0x00,0x42,0x30, -0x04,0x0C,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x25,0xB0,0x03,0x3C, -0x04,0x0D,0x62,0x90, -0x21,0x20,0x00,0x00, -0xFD,0x00,0x42,0x30, -0x04,0x0D,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x25,0xB0,0x11,0x3C, -0x70,0x0E,0x25,0x8E, -0x7F,0xFE,0x10,0x3C, -0xFF,0xFF,0x10,0x36, -0x24,0x28,0xB0,0x00, -0x94,0x60,0x00,0x0C, -0x70,0x0E,0x04,0x24, -0x8C,0x0E,0x25,0x8E, -0x8C,0x0E,0x04,0x24, -0x94,0x60,0x00,0x0C, -0x24,0x28,0xB0,0x00, -0x01,0x00,0x02,0x24, -0x44,0x5F,0x62,0xA2, -0x00,0x60,0x92,0x40, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x04,0x0C,0x62,0x90, -0x21,0x20,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x02,0x00,0x42,0x34, -0x04,0x0C,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x25,0xB0,0x03,0x3C, -0x04,0x0D,0x62,0x90, -0x21,0x20,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x02,0x00,0x42,0x34, -0x04,0x0D,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x25,0xB0,0x10,0x3C, -0x70,0x0E,0x05,0x8E, -0x80,0x01,0x11,0x3C, -0x70,0x0E,0x04,0x24, -0x94,0x60,0x00,0x0C, -0x25,0x28,0xB1,0x00, -0x8C,0x0E,0x05,0x8E, -0x8C,0x0E,0x04,0x24, -0x94,0x60,0x00,0x0C, -0x25,0x28,0xB1,0x00, -0x03,0x00,0x05,0x3C, -0x59,0x01,0xA5,0x34, -0x94,0x60,0x00,0x0C, -0x44,0x08,0x04,0x24, -0x02,0x00,0x02,0x24, -0x44,0x5F,0x62,0xA2, -0xDD,0x30,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0xFC,0x37,0x02,0x24, -0x40,0x00,0x64,0x34, -0x00,0x00,0x82,0xA4, -0x42,0x00,0x65,0x34, -0x03,0x00,0x02,0x24, -0x00,0x00,0xA0,0xA0, -0x03,0x08,0x62,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0x43,0x90, -0x00,0x00,0x00,0x00, -0x0B,0x00,0x60,0x10, -0x25,0xB0,0x10,0x3C, -0x02,0x80,0x03,0x3C, -0xDE,0x5D,0x62,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x30, -0x32,0x00,0x40,0x14, -0x00,0x02,0x05,0x3C, -0x00,0x08,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x25,0xB0,0x10,0x3C, -0x21,0x00,0x06,0x36, -0x00,0x00,0xC2,0x90, -0x18,0x00,0x03,0x36, -0x42,0x00,0x05,0x36, -0x01,0x00,0x42,0x34, -0x00,0x00,0xC2,0xA0, -0x40,0x00,0x11,0x36, -0x00,0x00,0x60,0xA0, -0xFF,0xFF,0x02,0x24, -0xFC,0x57,0x03,0x24, -0x00,0x00,0xA2,0xA0, -0x64,0x00,0x04,0x24, -0x00,0x00,0x23,0xA6, -0x54,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xFC,0x77,0x02,0x24, -0x00,0x00,0x22,0xA6, -0x54,0x22,0x00,0x0C, -0x0A,0x00,0x04,0x24, -0x03,0x08,0x00,0xA2, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x0A,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x25,0xB0,0x10,0x3C, -0x40,0x00,0x10,0x36, -0xFC,0x37,0x02,0x24, -0x00,0x00,0x02,0xA6, -0x54,0x22,0x00,0x0C, -0x0A,0x00,0x04,0x24, -0xFC,0x77,0x02,0x24, -0x00,0x00,0x02,0xA6, -0x54,0x22,0x00,0x0C, -0x0A,0x00,0x04,0x24, -0xFC,0x57,0x02,0x24, -0x00,0x00,0x02,0xA6, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x9B,0x30,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x00,0x08,0x04,0x24, -0x00,0x02,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x2F,0x31,0x00,0x08, -0x25,0xB0,0x10,0x3C, -0xC0,0xFF,0xBD,0x27, -0x28,0x00,0xB4,0xAF, -0x20,0x00,0xB2,0xAF, -0x18,0x00,0xB0,0xAF, -0x3C,0x00,0xBF,0xAF, -0x38,0x00,0xBE,0xAF, -0x34,0x00,0xB7,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x24,0x00,0xB3,0xAF, -0x1C,0x00,0xB1,0xAF, -0xFF,0x00,0x90,0x30, -0xFF,0x00,0xB2,0x30, -0x21,0xA0,0x00,0x00, -0x00,0x60,0x16,0x40, -0x01,0x00,0xC1,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x13,0x3C, -0xF6,0x5E,0x62,0x92, -0x0F,0x00,0x11,0x32, -0x0F,0x00,0x42,0x30, -0x12,0x00,0x51,0x10, -0x04,0x00,0x02,0x32, -0x40,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x62,0x92, -0x0C,0x00,0x03,0x24, -0x0F,0x00,0x42,0x30, -0x8F,0x00,0x43,0x10, -0x08,0x00,0x02,0x32, -0xF6,0x5E,0x62,0x92, -0x04,0x00,0x03,0x24, -0x0F,0x00,0x42,0x30, -0xD2,0x01,0x43,0x10, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x62,0x92, -0x02,0x00,0x03,0x24, -0x0F,0x00,0x42,0x30, -0x9B,0x00,0x43,0x10, -0x06,0x00,0x02,0x32, -0x02,0x80,0x10,0x3C, -0xF5,0x5E,0x03,0x92, -0xF6,0x5E,0x62,0x92, -0x0F,0x00,0x63,0x30, -0x0F,0x00,0x42,0x30, -0x2A,0x10,0x43,0x00, -0x1C,0x00,0x40,0x14, -0x02,0x80,0x12,0x3C, -0xF5,0x5E,0x02,0x92, -0x00,0x00,0x00,0x00, -0x40,0x00,0x42,0x30, -0x17,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xDA,0x5D,0x42,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x43,0x30, -0x52,0x00,0x60,0x14, -0x04,0x00,0x42,0x30, -0x10,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x43,0x92, -0x02,0x80,0x06,0x3C, -0x5C,0xE9,0xC5,0x90, -0x0F,0x00,0x63,0x30, -0x25,0xB0,0x02,0x3C, -0x25,0x18,0x65,0x00, -0xDD,0x02,0x42,0x34, -0x00,0x00,0x43,0xA0, -0xF5,0x5E,0x04,0x92, -0x80,0xFF,0x02,0x24, -0xBF,0xFF,0x03,0x24, -0x26,0x28,0xA2,0x00, -0x24,0x20,0x83,0x00, -0x5C,0xE9,0xC5,0xA0, -0xF5,0x5E,0x04,0xA2, -0x00,0x60,0x96,0x40, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x40,0x00,0xBD,0x27, -0xF6,0x5E,0x62,0x92, -0x00,0x00,0x00,0x00, -0x04,0x00,0x42,0x30, -0x4C,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x62,0x92, -0x00,0x00,0x00,0x00, -0x08,0x00,0x42,0x30, -0x03,0x00,0x40,0x10, -0x08,0x00,0x02,0x32, -0x1B,0x00,0x40,0x10, -0x02,0x80,0x03,0x3C, -0xF6,0x5E,0x62,0x92, -0x00,0x00,0x00,0x00, -0x08,0x00,0x42,0x30, -0x0C,0x00,0x40,0x14, -0x08,0x00,0x02,0x32, -0x0A,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0x40,0x12, -0x02,0x80,0x03,0x3C, -0xE0,0x3A,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x03,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xCD,0x4E,0x00,0x0C, -0x21,0x20,0x00,0x00, -0xF6,0x5E,0x62,0x92, -0xF0,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0xF6,0x5E,0x62,0xA2, -0xF6,0x5E,0x63,0x92, -0x00,0x00,0x00,0x00, -0x25,0x18,0x23,0x02, -0xF6,0x5E,0x63,0xA2, -0x8E,0x31,0x00,0x08, -0x02,0x80,0x10,0x3C, -0xE0,0x3A,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0xF2,0xFF,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x14,0x5F,0x43,0x90, -0x00,0x00,0x00,0x00, -0xA2,0xFF,0x60,0x14, -0x01,0x00,0x04,0x24, -0xCD,0x4E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xD9,0x31,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0x24,0x00,0x0C, -0x24,0x00,0x04,0x24, -0x76,0x01,0x40,0x10, -0x21,0x88,0x40,0x00, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0x45,0x90, -0xF6,0x5E,0x44,0x92, -0xF5,0x5E,0x02,0x92, -0xBF,0xFF,0x03,0x24, -0x0F,0x00,0x84,0x30, -0x24,0x10,0x43,0x00, -0xF5,0x5E,0x02,0xA2, -0x10,0x00,0xA5,0xA3, -0x11,0x00,0xA4,0xA3, -0x08,0x00,0x24,0x96, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xA5,0x27, -0x25,0x20,0x82,0x00, -0x20,0x00,0x84,0x24, -0x5F,0x1E,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x04,0x00,0x03,0x24, -0x17,0x00,0x02,0x24, -0x0C,0x00,0x23,0xAE, -0x14,0x00,0x22,0xAE, -0x30,0x09,0x00,0x0C, -0x21,0x20,0x20,0x02, -0xB0,0x31,0x00,0x08, -0x00,0x00,0x00,0x00, -0x0C,0x31,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xC2,0x31,0x00,0x08, -0x00,0x00,0x00,0x00, -0x71,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x28,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x77,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x62,0x92, -0xF0,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0xF6,0x5E,0x62,0xA2, -0x02,0x80,0x03,0x3C, -0xF6,0x5E,0x62,0x92, -0xE0,0x3A,0x64,0x94, -0x04,0x00,0x42,0x34, -0x00,0x01,0x84,0x30, -0xF6,0x5E,0x62,0xA2, -0x61,0xFF,0x80,0x10, -0x00,0x00,0x00,0x00, -0xCD,0x4E,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x83,0x31,0x00,0x08, -0x00,0x00,0x00,0x00, -0x65,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x82,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x61,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x62,0x92, -0xF0,0xFF,0x03,0x24, -0x41,0xB0,0x04,0x3C, -0x24,0x10,0x43,0x00, -0xF6,0x5E,0x62,0xA2, -0xF6,0x5E,0x63,0x92, -0x08,0x00,0x85,0x34, -0x82,0x00,0x02,0x24, -0x01,0x00,0x63,0x34, -0x02,0x80,0x1E,0x3C, -0xF6,0x5E,0x63,0xA2, -0x00,0x00,0x80,0xAC, -0x00,0x00,0xA2,0xA4, -0x42,0xB0,0x04,0x3C, -0x30,0x1F,0xC2,0x27, -0xB0,0x1B,0x45,0x94, -0x00,0x00,0x83,0x90, -0xBE,0xFF,0x02,0x24, -0x03,0x00,0x86,0x34, -0x24,0x18,0x62,0x00, -0x00,0x01,0xA5,0x30, -0x90,0xFF,0x02,0x24, -0x00,0x00,0x83,0xA0, -0x00,0x00,0xC2,0xA0, -0x38,0x00,0xA0,0x10, -0x25,0xB0,0x06,0x3C, -0x25,0xB0,0x04,0x3C, -0x84,0x00,0x82,0x34, -0x00,0x00,0x46,0x8C, -0x80,0x00,0x84,0x34, -0x00,0x00,0x82,0x8C, -0x02,0x80,0x0B,0x3C, -0x1C,0x5F,0x64,0x8D, -0x00,0x38,0x06,0x00, -0x21,0x30,0x00,0x00, -0x25,0xA0,0xC2,0x00, -0x21,0x18,0x00,0x00, -0x02,0x80,0x0A,0x3C, -0x25,0xA8,0xE3,0x00, -0x21,0x28,0x00,0x00, -0x24,0x5F,0x42,0x8D, -0x21,0x20,0x94,0x00, -0x2B,0x18,0x94,0x00, -0x21,0x28,0xB5,0x00, -0x21,0x28,0xA3,0x00, -0x2B,0x10,0xA2,0x00, -0x24,0x01,0x40,0x14, -0x00,0x00,0x00,0x00, -0x24,0x5F,0x42,0x8D, -0x00,0x00,0x00,0x00, -0x10,0x01,0x45,0x10, -0x01,0x00,0x05,0x24, -0x30,0x1F,0xC2,0x27, -0xA4,0x3E,0x43,0x8C, -0x42,0xB0,0x07,0x3C, -0x00,0x00,0xE6,0x90, -0x18,0x00,0x65,0x00, -0xFB,0xFF,0x02,0x24, -0x24,0x30,0xC2,0x00, -0x00,0x00,0xE6,0xA0, -0x67,0x46,0x06,0x3C, -0xCF,0xAC,0xC6,0x34, -0x01,0x00,0x04,0x24, -0x21,0x28,0x00,0x00, -0x12,0x18,0x00,0x00, -0x82,0x1A,0x03,0x00, -0x40,0x10,0x03,0x00, -0x21,0x10,0x43,0x00, -0xC0,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x80,0x10,0x02,0x00, -0x19,0x00,0x46,0x00, -0x10,0x30,0x00,0x00, -0x23,0x10,0x46,0x00, -0x42,0x10,0x02,0x00, -0x21,0x30,0xC2,0x00, -0x02,0x33,0x06,0x00, -0x01,0x00,0x02,0x24, -0x8C,0x23,0x00,0x0C, -0x0A,0x30,0x46,0x00, -0x25,0xB0,0x06,0x3C, -0xF2,0x02,0xC3,0x34, -0x88,0xFF,0x02,0x24, -0x00,0x00,0x62,0xA0, -0x11,0x00,0xC7,0x34, -0x00,0x00,0xE2,0x90, -0x08,0x00,0xC5,0x34, -0x30,0x1F,0xC4,0x27, -0x01,0x00,0x42,0x34, -0x00,0x00,0xE2,0xA0, -0x00,0x00,0xA3,0x94, -0xB0,0x1B,0x82,0x94, -0xFF,0xFF,0x64,0x30, -0x10,0x00,0x84,0x34, -0x00,0x00,0xA4,0xA4, -0xFB,0xFF,0x84,0x30, -0x00,0x00,0xA4,0xA4, -0x00,0x01,0x42,0x30, -0x02,0x00,0x84,0x34, -0x00,0x00,0xA4,0xA4, -0x04,0x00,0x40,0x10, -0x42,0xB0,0x02,0x3C, -0x22,0x00,0x03,0x24, -0x03,0x00,0x42,0x34, -0x00,0x00,0x43,0xA0, -0xFF,0xF7,0x84,0x30, -0x00,0x00,0xA4,0xA4, -0x28,0x00,0xC4,0x34, -0x00,0x00,0x83,0x94, -0xEF,0xFE,0x02,0x24, -0xFE,0xFF,0x08,0x24, -0x24,0x18,0x62,0x00, -0x00,0x00,0x83,0xA4, -0x00,0x00,0x82,0x94, -0x26,0x00,0xC5,0x34, -0x02,0x80,0x03,0x3C, -0x24,0x10,0x48,0x00, -0x00,0x00,0x82,0xA4, -0xDA,0x5D,0x64,0x90, -0x00,0x00,0xA2,0x94, -0x04,0x00,0x84,0x30, -0x00,0x24,0x42,0x34, -0x00,0x00,0xA2,0xA4, -0x09,0x00,0x80,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0x94, -0x00,0x00,0x00,0x00, -0x24,0x10,0x48,0x00, -0x00,0x00,0xA2,0xA4, -0x00,0x00,0xE3,0x90, -0xFD,0xFF,0x02,0x24, -0x24,0x18,0x62,0x00, -0x00,0x00,0xE3,0xA0, -0x00,0x68,0x02,0x40, -0x00,0x08,0x42,0x30, -0xFD,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x12,0x3C, -0x11,0x00,0x43,0x36, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x34, -0x00,0x00,0x62,0xA0, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x26,0x00,0x44,0x36, -0x00,0x00,0x82,0x94, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x34, -0x00,0x00,0x82,0xA4, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x83,0x94, -0xFF,0xDB,0x02,0x24, -0x28,0x00,0x45,0x36, -0x24,0x18,0x62,0x00, -0x00,0x00,0x83,0xA4, -0x00,0x00,0xA2,0x94, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x34, -0x00,0x00,0xA2,0xA4, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0x94, -0x00,0x00,0x00,0x00, -0x10,0x01,0x42,0x34, -0x00,0x00,0xA2,0xA4, -0x08,0x00,0x51,0x36, -0x00,0x00,0x23,0x96, -0x30,0x1F,0xD7,0x27, -0xB0,0x1B,0xE2,0x96, -0xFF,0xFF,0x70,0x30, -0x00,0x18,0x10,0x36, -0x00,0x00,0x30,0xA6, -0x00,0x01,0x42,0x30, -0xFD,0xFF,0x10,0x32, -0x00,0x00,0x30,0xA6, -0x05,0x00,0x40,0x10, -0x42,0xB0,0x02,0x3C, -0x00,0x00,0x43,0x90, -0xFB,0xFF,0x04,0x24, -0x24,0x18,0x64,0x00, -0x00,0x00,0x43,0xA0, -0x04,0x00,0x10,0x36, -0x54,0x22,0x00,0x0C, -0x32,0x00,0x04,0x24, -0x00,0x00,0x30,0xA6, -0x22,0x00,0x02,0x24, -0xF2,0x02,0x43,0x36, -0xEF,0xFF,0x10,0x32, -0x00,0x00,0x30,0xA6, -0xC8,0x00,0x04,0x24, -0x00,0x00,0x62,0xA0, -0x54,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xB0,0x1B,0xE2,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x41,0x00,0x40,0x10, -0x42,0xB0,0x06,0x3C, -0x84,0x00,0x42,0x36, -0x00,0x00,0x44,0x8C, -0x80,0x00,0x46,0x36, -0x00,0x00,0xC2,0x8C, -0x00,0x28,0x04,0x00, -0x21,0x18,0x00,0x00, -0x21,0x20,0x00,0x00, -0x25,0x30,0x82,0x00, -0x25,0x38,0xA3,0x00, -0xA4,0x3E,0xE3,0x8E, -0x23,0x28,0xD4,0x00, -0x80,0x12,0x05,0x00, -0x1B,0x00,0x43,0x00, -0x02,0x00,0x60,0x14, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x02,0x80,0x0B,0x3C, -0x1C,0x5F,0x63,0x8D, -0x12,0x10,0x00,0x00, -0x23,0x10,0x45,0x00, -0x21,0x10,0x43,0x00, -0x1C,0x5F,0x62,0xAD, -0x1C,0x5F,0x63,0x8D, -0x42,0xB0,0x02,0x3C, -0x03,0x00,0x42,0x34, -0xC4,0x09,0x63,0x24, -0x1C,0x5F,0x63,0xAD, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x20,0x00,0x63,0x30, -0x20,0x00,0x60,0x14, -0x00,0x00,0x00,0x00, -0x1C,0x5F,0x62,0x8D, -0x02,0x80,0x0A,0x3C, -0x24,0x5F,0x44,0x8D, -0x21,0x40,0x46,0x00, -0x2B,0x28,0x06,0x01, -0x21,0x48,0x67,0x00, -0x21,0x48,0x25,0x01, -0x2B,0x20,0x24,0x01, -0x59,0x00,0x80,0x14, -0x00,0x00,0x00,0x00, -0x24,0x5F,0x42,0x8D, -0x00,0x00,0x00,0x00, -0x47,0x00,0x49,0x10, -0x01,0x00,0x05,0x24, -0x42,0xB0,0x02,0x3C, -0x00,0x00,0x43,0x90, -0xFB,0xFF,0x04,0x24, -0x01,0x00,0x06,0x24, -0x24,0x18,0x64,0x00, -0x00,0x00,0x43,0xA0, -0x04,0x00,0xA0,0x10, -0x01,0x00,0x04,0x24, -0x80,0x10,0x05,0x00, -0x21,0x10,0x45,0x00, -0x80,0x30,0x02,0x00, -0x8C,0x23,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x42,0xB0,0x02,0x3C, -0x22,0x00,0x03,0x24, -0x03,0x00,0x42,0x34, -0x00,0x00,0x43,0xA0, -0x42,0xB0,0x06,0x3C, -0x00,0x00,0xC2,0x90, -0x30,0x1F,0xC5,0x27, -0xD0,0x1B,0xA8,0x8C, -0xDC,0x1B,0xA7,0x94, -0x41,0xB0,0x03,0x3C, -0x41,0x00,0x42,0x34, -0x08,0x00,0x64,0x34, -0x00,0x00,0xC2,0xA0, -0x00,0x00,0x68,0xAC, -0x00,0x00,0x87,0xA4, -0xF6,0x5E,0x63,0x92, -0xF0,0xFF,0x02,0x24, -0xDC,0x1B,0xA7,0xA4, -0x24,0x18,0x62,0x00, -0xF6,0x5E,0x63,0xA2, -0xF6,0x5E,0x62,0x92, -0xD0,0x1B,0xA8,0xAC, -0x02,0x00,0x42,0x34, -0xF6,0x5E,0x62,0xA2, -0x8E,0x31,0x00,0x08, -0x02,0x80,0x10,0x3C, -0x4C,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x31,0xFE,0x40,0x10, -0x00,0x00,0x00,0x00, -0x1C,0x31,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xF6,0x5E,0x62,0x92, -0xF0,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0xF6,0x5E,0x62,0xA2, -0xF6,0x5E,0x63,0x92, -0x00,0x00,0x00,0x00, -0x02,0x00,0x63,0x34, -0xF6,0x5E,0x63,0xA2, -0x88,0x31,0x00,0x08, -0x00,0x00,0x00,0x00, -0x99,0x99,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x97,0x99,0x63,0x34, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0xB0,0x31,0x00,0x08, -0x00,0x00,0x00,0x00, -0x20,0x5F,0x42,0x8D, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x82,0x00, -0x0C,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x20,0x5F,0x42,0x8D, -0x61,0x32,0x00,0x08, -0x01,0x00,0x05,0x24, -0x20,0x5F,0x42,0x8D, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x02,0x01, -0x0A,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x20,0x5F,0x42,0x8D, -0x32,0x33,0x00,0x08, -0x01,0x00,0x05,0x24, -0x20,0x5F,0x42,0x8D, -0x24,0x5F,0x43,0x8D, -0x1C,0x5F,0x64,0x8D, -0x23,0x10,0x54,0x00, -0x61,0x32,0x00,0x08, -0x23,0x28,0x44,0x00, -0x20,0x5F,0x42,0x8D, -0x24,0x5F,0x43,0x8D, -0x1C,0x5F,0x64,0x8D, -0x23,0x10,0x46,0x00, -0x32,0x33,0x00,0x08, -0x23,0x28,0x44,0x00, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0x43,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x60,0x10, -0x02,0x80,0x02,0x3C, -0xF6,0x5E,0x43,0x90, -0x04,0x00,0x04,0x24, -0x0F,0x00,0x63,0x30, -0x04,0x00,0x63,0x28, -0x03,0x00,0x60,0x14, -0x01,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x64,0x31,0x00,0x08, -0x00,0x00,0x00,0x00, -0x01,0x80,0x02,0x3C, -0x25,0xB0,0x03,0x3C, -0xE8,0xFF,0xBD,0x27, -0x6C,0xCE,0x42,0x24, -0x18,0x03,0x63,0x34, -0x14,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x62,0xAC, -0x00,0x60,0x10,0x40, -0x01,0x00,0x01,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x04,0x3C, -0x13,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0x0B,0x00,0x40,0x10, -0x01,0x00,0x05,0x24, -0xD0,0x07,0x03,0x24, -0x02,0x80,0x02,0x3C, -0xE4,0x5E,0x43,0xAC, -0x13,0x5F,0x80,0xA0, -0x00,0x60,0x90,0x40, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x03,0x3C, -0x01,0x00,0x04,0x24, -0x02,0x80,0x02,0x3C, -0x16,0x5F,0x44,0xA0, -0x14,0x5F,0x60,0xA0, -0x02,0x80,0x02,0x3C, -0xF5,0x5E,0x44,0x90, -0x64,0x31,0x00,0x0C, -0xFF,0x00,0x84,0x30, -0x00,0x60,0x90,0x40, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x42,0x11,0x05,0x00, -0x0F,0x00,0x46,0x30, -0xE8,0xFF,0xBD,0x27, -0x09,0x00,0xC3,0x28, -0x14,0x00,0xBF,0xAF, -0x15,0x00,0x60,0x10, -0x10,0x00,0xB0,0xAF, -0x82,0x16,0x05,0x00, -0x01,0x00,0x42,0x30, -0x15,0x00,0x40,0x10, -0x00,0xC0,0x02,0x3C, -0x24,0x10,0xA2,0x00, -0x48,0x00,0x40,0x14, -0xC2,0x15,0x04,0x00, -0x01,0x00,0x42,0x30, -0x55,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x50,0xE9,0x63,0x24, -0x21,0x18,0xC3,0x00, -0x02,0x80,0x04,0x3C, -0x0F,0x5F,0x85,0x90, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x24,0x10,0x45,0x00, -0x4B,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x24,0x10,0xA2,0x00, -0x20,0x00,0x40,0x14, -0xC2,0x15,0x04,0x00, -0x01,0x00,0x42,0x30, -0x0B,0x00,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x03,0x3C, -0x50,0xE9,0x63,0x24, -0x21,0x18,0xC3,0x00, -0x02,0x80,0x04,0x3C, -0x0F,0x5F,0x85,0x90, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x24,0x10,0x45,0x00, -0x3C,0x00,0x40,0x14, -0x02,0x80,0x04,0x3C, -0x0E,0x5F,0x82,0x90, -0xFE,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x0E,0x5F,0x82,0xA0, -0x0E,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x42,0x30, -0xE4,0xFF,0x40,0x14, -0x02,0x80,0x02,0x3C, -0x0C,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x64,0x90, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x05,0x24, -0xFF,0x00,0x84,0x30, -0x64,0x31,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x0E,0x5F,0x82,0x90, -0xFD,0xFF,0x03,0x24, -0x14,0x00,0xBF,0x8F, -0x24,0x10,0x43,0x00, -0x02,0x80,0x03,0x3C, -0x0E,0x5F,0x82,0xA0, -0x12,0x5F,0x60,0xA0, -0x42,0xB0,0x04,0x3C, -0x00,0x00,0x82,0x90, -0x10,0x00,0xB0,0x8F, -0xEF,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x03,0x00,0x85,0x34, -0x40,0x00,0x03,0x24, -0x18,0x00,0xBD,0x27, -0x00,0x00,0x82,0xA0, -0x00,0x00,0xA3,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x42,0xB0,0x07,0x3C, -0x00,0x00,0xE3,0x90, -0xEF,0xFF,0x02,0x24, -0x03,0x00,0xF0,0x34, -0x24,0x18,0x62,0x00, -0x40,0x00,0x02,0x24, -0x00,0x00,0xE3,0xA0, -0x02,0x00,0x04,0x24, -0x00,0x00,0x02,0xA2, -0x21,0x28,0x00,0x00, -0x8C,0x23,0x00,0x0C, -0x00,0xF0,0x06,0x34, -0x44,0x00,0x02,0x24, -0x00,0x00,0x02,0xA2, -0xE0,0x33,0x00,0x08, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x04,0x24, -0xFE,0x4E,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x0E,0x5F,0x82,0x90, -0xF6,0x33,0x00,0x08, -0xFB,0xFF,0x03,0x24, -0x82,0x16,0x05,0x00, -0xE8,0xFF,0xBD,0x27, -0x01,0x00,0x42,0x30, -0x14,0x00,0xBF,0xAF, -0x0E,0x00,0x40,0x10, -0x10,0x00,0xB0,0xAF, -0x00,0xC0,0x02,0x3C, -0x24,0x10,0xA2,0x00, -0x37,0x00,0x40,0x14, -0x02,0x80,0x02,0x3C, -0x0D,0x5F,0x43,0x90, -0x02,0x00,0x02,0x24, -0xFF,0x00,0x63,0x30, -0x44,0x00,0x62,0x10, -0x01,0x00,0x04,0x24, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0xFE,0x4E,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x00,0xC0,0x02,0x3C, -0x24,0x10,0xA2,0x00, -0x0E,0x00,0x40,0x14, -0x02,0x80,0x06,0x3C, -0x0E,0x5F,0xC2,0x90, -0xFE,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x0E,0x5F,0xC2,0xA0, -0x0E,0x5F,0xC2,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x42,0x30, -0x18,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x0E,0x5F,0xC2,0x90, -0xFD,0xFF,0x03,0x24, -0x42,0xB0,0x04,0x3C, -0x24,0x10,0x43,0x00, -0x02,0x80,0x03,0x3C, -0x0E,0x5F,0xC2,0xA0, -0x12,0x5F,0x60,0xA0, -0x00,0x00,0x82,0x90, -0xEF,0xFF,0x03,0x24, -0x03,0x00,0x85,0x34, -0x24,0x10,0x43,0x00, -0x40,0x00,0x03,0x24, -0x00,0x00,0x82,0xA0, -0x00,0x00,0xA3,0xA0, -0x0E,0x5F,0xC2,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x42,0x30, -0xEA,0xFF,0x40,0x14, -0x02,0x80,0x02,0x3C, -0x0C,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x64,0x90, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x05,0x24, -0xFF,0x00,0x84,0x30, -0x64,0x31,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x42,0xB0,0x07,0x3C, -0x00,0x00,0xE3,0x90, -0xEF,0xFF,0x02,0x24, -0x03,0x00,0xF0,0x34, -0x24,0x18,0x62,0x00, -0x40,0x00,0x02,0x24, -0x00,0x00,0xE3,0xA0, -0x02,0x00,0x04,0x24, -0x00,0x00,0x02,0xA2, -0x21,0x28,0x00,0x00, -0x8C,0x23,0x00,0x0C, -0x00,0xF0,0x06,0x34, -0x44,0x00,0x02,0x24, -0x00,0x00,0x02,0xA2, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x0D,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x0C,0x00,0x04,0x24, -0x01,0x00,0x05,0x24, -0x64,0x31,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x01,0x80,0x02,0x3C, -0x25,0xB0,0x03,0x3C, -0xE8,0xFF,0xBD,0x27, -0x30,0xD2,0x42,0x24, -0x18,0x03,0x63,0x34, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x62,0xAC, -0x02,0x80,0x10,0x3C, -0xF5,0x5E,0x02,0x92, -0x14,0x00,0xBF,0xAF, -0x0F,0x00,0x42,0x30, -0x03,0x00,0x42,0x28, -0x05,0x00,0x40,0x10, -0x01,0x00,0x05,0x24, -0x4C,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x04,0x00,0x40,0x10, -0x01,0x00,0x05,0x24, -0xF5,0x5E,0x04,0x92, -0x64,0x31,0x00,0x0C, -0xFF,0x00,0x84,0x30, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x84,0x24, -0xE0,0x1B,0x83,0x94, -0xDC,0x1B,0x85,0x94, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x02,0x00,0x63,0x30, -0x41,0xB0,0x02,0x3C, -0x25,0x18,0x65,0x00, -0x08,0x00,0x42,0x34, -0x18,0x00,0xBD,0x27, -0x00,0x00,0x43,0xA4, -0x08,0x00,0xE0,0x03, -0xDC,0x1B,0x83,0xA4, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x02,0x80,0x10,0x3C, -0x08,0x14,0x04,0x26, -0x21,0x28,0x00,0x00, -0x21,0x30,0x00,0x00, -0x91,0x3C,0x00,0x0C, -0x21,0x38,0x00,0x00, -0xB4,0x34,0x00,0x08, -0x08,0x14,0x04,0x26, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0xCF,0x61,0x00,0x0C, -0x21,0x38,0x00,0x00, -0x10,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xFF,0xFF,0x8D,0x30, -0x00,0x60,0x0F,0x40, -0x01,0x00,0xE1,0x35, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x06,0x3C, -0x30,0x1F,0xCE,0x24, -0x2A,0x1C,0xC2,0x91, -0x00,0x00,0x00,0x00, -0x1D,0x00,0x40,0x10, -0x25,0xB0,0x03,0x3C, -0x38,0x02,0x64,0x34, -0x80,0xFF,0x02,0x24, -0x00,0x00,0x82,0xA0, -0x34,0x02,0x6A,0x34, -0xD2,0x01,0x65,0x34, -0xD6,0x01,0x66,0x34, -0xDA,0x01,0x67,0x34, -0xDE,0x01,0x63,0x34, -0x00,0x00,0xA8,0x94, -0x00,0x00,0xC9,0x94, -0x00,0x00,0xEB,0x94, -0x00,0x00,0x6C,0x94, -0x00,0x00,0x44,0x95, -0xB0,0xFE,0xA2,0x25, -0xFF,0xFF,0x4D,0x30, -0x28,0x1C,0xC4,0xA5, -0x00,0x00,0xA0,0xA4, -0x20,0x1C,0xC8,0xA5, -0x00,0x00,0xC0,0xA4, -0x22,0x1C,0xC9,0xA5, -0x00,0x00,0xE0,0xA4, -0x24,0x1C,0xCB,0xA5, -0x00,0x00,0x60,0xA4, -0x00,0x00,0x4D,0xA5, -0x26,0x1C,0xCC,0xA5, -0x00,0x60,0x8F,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x02,0x3C, -0x0A,0x00,0x45,0x34, -0x63,0x00,0x03,0x24, -0xFF,0xFF,0x04,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x40,0x10, -0x30,0x1F,0xC2,0x24, -0x64,0x00,0x02,0x24, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x42,0x30, -0xFE,0xFF,0x40,0x14, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x62,0x24, -0xFF,0xFF,0x43,0x30, -0xF4,0xFF,0x64,0x14, -0x30,0x1F,0xC2,0x24, -0x28,0x1C,0x48,0x94, -0x26,0x1C,0x47,0x94, -0x20,0x1C,0x49,0x94, -0x22,0x1C,0x4A,0x94, -0x24,0x1C,0x4B,0x94, -0x25,0xB0,0x03,0x3C, -0x38,0x02,0x6C,0x34, -0x34,0x02,0x62,0x34, -0xD2,0x01,0x64,0x34, -0xD6,0x01,0x65,0x34, -0xDA,0x01,0x66,0x34, -0xDE,0x01,0x63,0x34, -0x00,0x00,0x48,0xA4, -0x00,0x00,0x89,0xA4, -0x00,0x00,0xAA,0xA4, -0x00,0x00,0xCB,0xA4, -0x00,0x00,0x67,0xA4, -0x00,0x00,0x80,0xA1, -0x00,0x60,0x8F,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xD0,0xFF,0xBD,0x27, -0x28,0x00,0xB4,0xAF, -0x2C,0x00,0xBF,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0xFF,0xFF,0x14,0x24, -0x02,0x80,0x13,0x3C, -0x41,0xB0,0x02,0x3C, -0x30,0x1F,0x63,0x26, -0x04,0x00,0x42,0x34, -0x00,0x00,0x45,0x8C, -0xD4,0x1B,0x64,0x8C, -0xD0,0x1B,0x66,0x8C, -0x02,0x80,0x02,0x3C, -0x08,0x5E,0x47,0x90, -0x25,0xB0,0x08,0x3C, -0xB0,0x03,0x02,0x35, -0x25,0x90,0x85,0x00, -0x00,0x00,0x52,0xAC, -0x00,0x00,0x46,0xAC, -0x01,0x00,0x02,0x24, -0x8D,0x03,0xE2,0x10, -0xD4,0x1B,0x72,0xAC, -0x30,0x1F,0x64,0x26, -0xD0,0x1B,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x52,0x00, -0x01,0x00,0x42,0x30, -0x0E,0x00,0x40,0x10, -0x30,0x1F,0x67,0x26, -0x25,0xB0,0x10,0x3C, -0xB0,0x03,0x02,0x36, -0x01,0x00,0x05,0x24, -0x00,0x00,0x45,0xAC, -0x04,0x00,0x0B,0x36, -0xD4,0x1B,0x83,0x8C, -0x00,0x00,0x69,0x8D, -0x40,0x00,0x02,0x3C, -0x01,0x00,0x63,0x38, -0x24,0x10,0x22,0x01, -0x2A,0x01,0x40,0x10, -0xD4,0x1B,0x83,0xAC, -0x30,0x1F,0x67,0x26, -0xD0,0x1B,0xE8,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x12,0x01, -0x04,0x00,0x42,0x30, -0x18,0x00,0x40,0x10, -0x30,0x1F,0x71,0x26, -0x25,0xB0,0x03,0x3C, -0xB0,0x03,0x64,0x34, -0x04,0x00,0x02,0x24, -0x00,0x00,0x82,0xAC, -0xD4,0x1B,0xE2,0x8C, -0xFC,0x00,0x63,0x34, -0xAC,0x1B,0xE5,0x94, -0xD0,0x37,0xE4,0x8C, -0x00,0x00,0x66,0x8C, -0x04,0x00,0x42,0x38, -0x21,0x48,0x85,0x00, -0x0A,0x00,0xC9,0x10, -0xD4,0x1B,0xE2,0xAC, -0x02,0x80,0x05,0x3C, -0xBC,0x5E,0xA2,0x8C, -0xFB,0xFF,0x04,0x24, -0x24,0x20,0x04,0x01, -0x00,0x10,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0xBC,0x5E,0xA2,0xAC, -0x00,0x00,0x64,0xAC, -0xD0,0x1B,0xE4,0xAC, -0x30,0x1F,0x71,0x26, -0xD0,0x1B,0x22,0x8E, -0x00,0x00,0x00,0x00, -0x24,0x10,0x52,0x00, -0x08,0x00,0x42,0x30, -0x0A,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xB0,0x1B,0x22,0x96, -0x00,0x00,0x00,0x00, -0x04,0x00,0x42,0x30, -0x5D,0x03,0x40,0x14, -0x00,0x80,0x02,0x3C, -0xD4,0x1B,0x22,0x8E, -0x00,0x00,0x00,0x00, -0x08,0x00,0x42,0x38, -0xD4,0x1B,0x22,0xAE, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x00,0x00,0x00,0x00, -0x24,0x20,0x52,0x00, -0x00,0x08,0x83,0x30, -0x06,0x00,0x60,0x10, -0x00,0x10,0x82,0x30, -0xD4,0x1B,0x02,0x8E, -0x00,0x00,0x00,0x00, -0x00,0x08,0x42,0x38, -0xD4,0x1B,0x02,0xAE, -0x00,0x10,0x82,0x30, -0x05,0x03,0x40,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x03,0x8E, -0x00,0x00,0x00,0x00, -0x24,0x10,0x72,0x00, -0x00,0x20,0x42,0x30, -0xF7,0x02,0x40,0x14, -0x00,0x00,0x00,0x00, -0x24,0x10,0x72,0x00, -0x00,0x80,0x42,0x30, -0xB9,0x01,0x40,0x14, -0x01,0x00,0x03,0x3C, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x00,0x00,0x00,0x00, -0x24,0x10,0x52,0x00, -0x24,0x10,0x54,0x00, -0x24,0x10,0x43,0x00, -0xF1,0x01,0x40,0x14, -0x00,0x00,0x00,0x00, -0xD0,0x1B,0x02,0x8E, -0x02,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x43,0x00, -0x28,0x02,0x40,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x04,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x54,0x00, -0x24,0x10,0x43,0x00, -0x62,0x02,0x40,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x08,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x43,0x00, -0x9B,0x02,0x40,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x10,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x54,0x00, -0x24,0x10,0x43,0x00, -0x5A,0x01,0x40,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x20,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x43,0x00, -0x18,0x01,0x40,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x40,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x54,0x00, -0x24,0x10,0x43,0x00, -0xD6,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x65,0x26, -0xD0,0x1B,0xA2,0x8C, -0x00,0x04,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x43,0x00, -0x3D,0x00,0x40,0x10, -0x30,0x1F,0x66,0x26, -0x2A,0xB0,0x02,0x3C, -0x2C,0x00,0x43,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x02,0x24, -0xFF,0x00,0x24,0x31, -0x29,0x03,0x82,0x10, -0x00,0x80,0x22,0x31, -0xF9,0x02,0x40,0x14, -0x00,0x80,0x02,0x3C, -0x00,0xFF,0x02,0x3C, -0x24,0x10,0x22,0x01, -0x0B,0x00,0x40,0x10, -0xFF,0x00,0x02,0x24, -0xB8,0x36,0xA2,0x90, -0x20,0xB0,0x03,0x3C, -0x00,0x12,0x02,0x00, -0x21,0x10,0x43,0x00, -0x0C,0x00,0x49,0x8C, -0x25,0xB0,0x03,0x3C, -0xB0,0x03,0x63,0x34, -0x00,0x00,0x69,0xAC, -0xFF,0x00,0x24,0x31, -0xFF,0x00,0x02,0x24, -0x1B,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x88,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0x1C,0x37,0x03,0xAE, -0x0A,0x00,0x04,0x24, -0xB8,0x36,0x09,0xA2, -0x00,0x01,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xD0,0x1B,0x05,0x8E, -0x02,0x80,0x06,0x3C, -0xBC,0x5E,0xC4,0x8C, -0x00,0x04,0x02,0x3C, -0x27,0x10,0x02,0x00, -0x24,0x28,0xA2,0x00, -0x25,0xB0,0x02,0x3C, -0x00,0x40,0x84,0x34, -0xB0,0x03,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x44,0xAC, -0x00,0x00,0x65,0xAC, -0xBC,0x5E,0xC4,0xAC, -0xD0,0x1B,0x05,0xAE, -0x30,0x1F,0x65,0x26, -0xD4,0x1B,0xA4,0x8C, -0x00,0x04,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x26,0x20,0x83,0x00, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x44,0xAC, -0xD4,0x1B,0xA4,0xAC, -0x30,0x1F,0x66,0x26, -0xD0,0x1B,0xC7,0x8C, -0x00,0x08,0x04,0x3C, -0x24,0x28,0xF2,0x00, -0x24,0x10,0xA4,0x00, -0x08,0x00,0x40,0x10, -0x80,0x00,0x08,0x3C, -0xD4,0x1B,0xC3,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0x26,0x18,0x64,0x00, -0x00,0x00,0x44,0xAC, -0xD4,0x1B,0xC3,0xAC, -0x80,0x00,0x08,0x3C, -0x24,0x10,0xA8,0x00, -0x21,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xD4,0x1B,0xC3,0x8C, -0x25,0xB0,0x09,0x3C, -0xB0,0x03,0x2A,0x35, -0x2A,0xB0,0x02,0x3C, -0x00,0x00,0x43,0xAD, -0x36,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x23,0xB0,0x04,0x3C, -0xFF,0x1F,0x02,0x3C, -0xC0,0x18,0x03,0x00, -0xF0,0x07,0x63,0x30, -0x00,0x38,0xC5,0x8C, -0x21,0x18,0x64,0x00, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0xCE,0x02,0x65,0x10, -0x04,0x38,0xC3,0xAC, -0x02,0x80,0x05,0x3C, -0xBC,0x5E,0xA3,0x8C, -0x27,0x20,0x08,0x00, -0x24,0x20,0xE4,0x00, -0x00,0x08,0x63,0x34, -0x41,0xB0,0x02,0x3C, -0x00,0x00,0x43,0xAD, -0x00,0x00,0x44,0xAC, -0xBC,0x5E,0xA3,0xAC, -0xD0,0x1B,0xC4,0xAC, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x80,0x00,0x04,0x3C, -0x26,0x18,0x64,0x00, -0xD4,0x1B,0x43,0xAC, -0x30,0x1F,0x66,0x26, -0xD0,0x1B,0xC3,0x8C, -0x00,0x01,0x05,0x3C, -0x24,0x20,0x72,0x00, -0x24,0x10,0x85,0x00, -0x06,0x00,0x40,0x10, -0x25,0xB0,0x02,0x3C, -0xD4,0x1B,0xC3,0x8C, -0xB0,0x03,0x42,0x34, -0x26,0x18,0x65,0x00, -0x00,0x00,0x45,0xAC, -0xD4,0x1B,0xC3,0xAC, -0x00,0x02,0x05,0x3C, -0x24,0x10,0x85,0x00, -0x06,0x00,0x40,0x10, -0x25,0xB0,0x02,0x3C, -0xD4,0x1B,0xC3,0x8C, -0xB0,0x03,0x42,0x34, -0x26,0x18,0x65,0x00, -0x00,0x00,0x45,0xAC, -0xD4,0x1B,0xC3,0xAC, -0x00,0x10,0x05,0x3C, -0x24,0x10,0x85,0x00, -0x0C,0x00,0x40,0x10, -0x30,0x1F,0x63,0x26, -0xB0,0x1B,0xC3,0x94, -0x00,0x00,0x00,0x00, -0x04,0x00,0x62,0x30, -0x02,0x00,0x40,0x10, -0x00,0x08,0x62,0x34, -0xB0,0x1B,0xC2,0xA4, -0xD4,0x1B,0xC2,0x8C, -0x00,0x00,0x00,0x00, -0x26,0x10,0x45,0x00, -0xD4,0x1B,0xC2,0xAC, -0x30,0x1F,0x63,0x26, -0xD0,0x1B,0x62,0x8C, -0x00,0x20,0x05,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x45,0x00, -0x0B,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xB0,0x1B,0x64,0x94, -0x00,0x00,0x00,0x00, -0x04,0x00,0x82,0x30, -0x02,0x00,0x40,0x10, -0xFF,0xF7,0x82,0x30, -0xB0,0x1B,0x62,0xA4, -0xD4,0x1B,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x26,0x10,0x45,0x00, -0xD4,0x1B,0x62,0xAC, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x20,0xBD,0x02,0x3C, -0xEC,0x02,0x03,0x36, -0x4D,0x00,0x07,0x36, -0xF1,0x02,0x08,0x36, -0x08,0x00,0x06,0x24, -0x78,0x02,0x42,0x34, -0x00,0x00,0x45,0xA4, -0x00,0x00,0xE0,0xA0, -0x00,0x00,0x06,0xA1, -0x00,0x00,0x60,0xAC, -0x00,0x00,0x62,0x8C, -0xFF,0x00,0x04,0x3C, -0x00,0x00,0xE0,0xA0, -0xFF,0x00,0x49,0x30, -0x25,0x48,0x24,0x01, -0x00,0x00,0x06,0xA1, -0xF2,0x02,0x05,0x36, -0x00,0x00,0x64,0xAC, -0x0A,0x00,0x0A,0x36, -0x00,0x00,0x69,0xAC, -0x80,0xFF,0x03,0x24, -0x00,0x00,0xA0,0xA0, -0x00,0x00,0x43,0xA1, -0x00,0x00,0x62,0x8D, -0x80,0x00,0x03,0x3C, -0x24,0x10,0x43,0x00, -0x02,0x00,0x40,0x10, -0x84,0xFF,0x02,0x24, -0x00,0x00,0x42,0xA1, -0x25,0x22,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x02,0x00,0x02,0x36, -0x00,0x00,0x43,0x94, -0xFF,0xBF,0x04,0x24, -0x24,0x18,0x64,0x00, -0x00,0x00,0x43,0xA4, -0x3C,0x35,0x00,0x08, -0x30,0x1F,0x67,0x26, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x2A,0xB0,0x06,0x3C, -0xB0,0x03,0x42,0x34, -0x00,0x00,0x54,0xAC, -0x28,0x00,0xC3,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x05,0x24, -0xFF,0x00,0x24,0x31, -0x6D,0x03,0x85,0x10, -0x25,0xBD,0x02,0x3C, -0x00,0x80,0x22,0x31, -0x59,0x02,0x40,0x10, -0x00,0xFF,0x02,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x00,0x62,0xAC, -0xFF,0x00,0x02,0x24, -0x21,0x00,0x82,0x10, -0xFF,0x00,0x23,0x31, -0x30,0x1F,0x70,0x26, -0x58,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0xA4,0x36,0x09,0xA2, -0xEC,0x36,0x03,0xAE, -0x06,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x09,0x3C, -0xCC,0x5E,0x27,0x91, -0x02,0x80,0x08,0x3C, -0xBC,0x5E,0x05,0x8D, -0xD0,0x1B,0x06,0x8E, -0x60,0x00,0x02,0x3C, -0x02,0x00,0xE7,0x34, -0x27,0x10,0x02,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x04,0xA5,0x34, -0x00,0x26,0x07,0x00, -0x25,0xB0,0x02,0x3C, -0x25,0x20,0x85,0x00, -0x80,0x03,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x44,0xAC, -0x00,0x00,0x66,0xAC, -0xBC,0x5E,0x05,0xAD, -0xCC,0x5E,0x27,0xA1, -0xD0,0x1B,0x06,0xAE, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x40,0x00,0x04,0x3C, -0x26,0x18,0x64,0x00, -0xB5,0x35,0x00,0x08, -0xD4,0x1B,0x43,0xAC, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x05,0x3C, -0x24,0x00,0xA3,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x06,0x24, -0xFF,0x00,0x24,0x31, -0x48,0x03,0x86,0x10, -0x25,0xB0,0x02,0x3C, -0x00,0x80,0x22,0x31, -0x64,0x02,0x40,0x10, -0x00,0xFF,0x02,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x00,0x62,0xAC, -0xFF,0x00,0x02,0x24, -0x25,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x58,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0xA0,0x36,0x09,0xA2, -0xEC,0x36,0x03,0xAE, -0x06,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x0A,0x3C, -0xCC,0x5E,0x47,0x91, -0x02,0x80,0x09,0x3C, -0xBC,0x5E,0x25,0x8D, -0xD0,0x1B,0x06,0x8E, -0x60,0x00,0x02,0x3C, -0x04,0x00,0xE7,0x34, -0x27,0x10,0x02,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x04,0xA5,0x34, -0x25,0xB0,0x03,0x3C, -0x40,0x00,0x02,0x3C, -0x00,0x26,0x07,0x00, -0x26,0xA0,0x82,0x02, -0xB0,0x03,0x68,0x34, -0x25,0x20,0x85,0x00, -0x80,0x03,0x63,0x34, -0x41,0xB0,0x02,0x3C, -0x00,0x00,0x64,0xAC, -0x00,0x00,0x46,0xAC, -0xBC,0x5E,0x25,0xAD, -0xCC,0x5E,0x47,0xA1, -0xD0,0x1B,0x06,0xAE, -0x00,0x00,0x14,0xAD, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x20,0x00,0x04,0x3C, -0x26,0x18,0x64,0x00, -0xAD,0x35,0x00,0x08, -0xD4,0x1B,0x43,0xAC, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x05,0x3C, -0xB0,0x03,0xA2,0x34, -0x2A,0xB0,0x07,0x3C, -0x00,0x00,0x54,0xAC, -0x20,0x00,0xE3,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x06,0x24, -0xFF,0x00,0x24,0x31, -0x07,0x03,0x86,0x10, -0x90,0x03,0xA2,0x34, -0x00,0x80,0x22,0x31, -0x05,0x02,0x40,0x10, -0x00,0xFF,0x02,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x00,0x62,0xAC, -0xFF,0x00,0x02,0x24, -0x21,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x4C,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0xA8,0x36,0x09,0xA2, -0xE0,0x36,0x03,0xAE, -0x05,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x09,0x3C, -0xCC,0x5E,0x27,0x91, -0x02,0x80,0x08,0x3C, -0xBC,0x5E,0x05,0x8D, -0xD0,0x1B,0x06,0x8E, -0x18,0x00,0x02,0x3C, -0x01,0x00,0xE7,0x34, -0x27,0x10,0x02,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x02,0xA5,0x34, -0x00,0x26,0x07,0x00, -0x25,0xB0,0x02,0x3C, -0x25,0x20,0x85,0x00, -0x80,0x03,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x44,0xAC, -0x00,0x00,0x66,0xAC, -0xBC,0x5E,0x05,0xAD, -0xCC,0x5E,0x27,0xA1, -0xD0,0x1B,0x06,0xAE, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x10,0x00,0x04,0x3C, -0x26,0x18,0x64,0x00, -0xA6,0x35,0x00,0x08, -0xD4,0x1B,0x43,0xAC, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x05,0x3C, -0x0C,0x00,0xA3,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x06,0x24, -0xFF,0x00,0x24,0x31, -0xC6,0x02,0x86,0x10, -0x00,0x80,0x22,0x31, -0x54,0x02,0x40,0x10, -0x00,0xFF,0x02,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x00,0x62,0xAC, -0xFF,0x00,0x02,0x24, -0x24,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x34,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0x8C,0x36,0x09,0xA2, -0xC8,0x36,0x03,0xAE, -0x03,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x0A,0x3C, -0xCC,0x5E,0x47,0x91, -0x02,0x80,0x09,0x3C, -0xBC,0x5E,0x25,0x8D, -0xD0,0x1B,0x06,0x8E, -0x01,0x00,0x08,0x3C, -0x80,0xFF,0x02,0x24, -0x25,0x38,0xE2,0x00, -0x00,0x80,0x03,0x35, -0x80,0x00,0xA5,0x34, -0x27,0x18,0x03,0x00, -0x00,0x26,0x07,0x00, -0x25,0xB0,0x02,0x3C, -0x24,0x30,0xC3,0x00, -0x25,0x20,0x85,0x00, -0x80,0x03,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x44,0xAC, -0x27,0xA0,0x08,0x00, -0x00,0x00,0x66,0xAC, -0xBC,0x5E,0x25,0xAD, -0xCC,0x5E,0x47,0xA1, -0xD0,0x1B,0x06,0xAE, -0x30,0x1F,0x63,0x26, -0xD4,0x1B,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x80,0x42,0x38, -0xD4,0x1B,0x62,0xAC, -0x30,0x1F,0x70,0x26, -0xD0,0x1B,0x02,0x8E, -0x01,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x54,0x00, -0x24,0x10,0x43,0x00, -0x11,0xFE,0x40,0x10, -0x00,0x00,0x00,0x00, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x05,0x3C, -0x10,0x00,0xA3,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x06,0x24, -0xFF,0x00,0x24,0x31, -0x7C,0x02,0x86,0x10, -0x25,0xB0,0x02,0x3C, -0x00,0x80,0x22,0x31, -0xD0,0x01,0x40,0x10, -0x00,0x80,0x02,0x3C, -0x00,0x00,0x62,0xAC, -0xFF,0x00,0x02,0x24, -0x22,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x34,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0x90,0x36,0x09,0xA2, -0xC8,0x36,0x03,0xAE, -0x03,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x09,0x3C, -0xCC,0x5E,0x27,0x91, -0x02,0x80,0x08,0x3C, -0xBC,0x5E,0x05,0x8D, -0xD0,0x1B,0x06,0x8E, -0x01,0x00,0x02,0x3C, -0x00,0x80,0x42,0x34, -0x40,0x00,0xE7,0x34, -0x27,0x10,0x02,0x00, -0x24,0x30,0xC2,0x00, -0x80,0x00,0xA5,0x34, -0x00,0x26,0x07,0x00, -0x25,0xB0,0x02,0x3C, -0x25,0x20,0x85,0x00, -0x80,0x03,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x44,0xAC, -0x00,0x00,0x66,0xAC, -0xBC,0x5E,0x05,0xAD, -0xCC,0x5E,0x27,0xA1, -0xD0,0x1B,0x06,0xAE, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x01,0x00,0x04,0x3C, -0x30,0x1F,0x70,0x26, -0x26,0x18,0x64,0x00, -0xD4,0x1B,0x43,0xAC, -0xD0,0x1B,0x02,0x8E, -0x02,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x43,0x00, -0xDB,0xFD,0x40,0x10, -0x00,0x00,0x00,0x00, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x05,0x3C, -0x14,0x00,0xA3,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x06,0x24, -0xFF,0x00,0x24,0x31, -0x64,0x02,0x86,0x10, -0x25,0xB0,0x02,0x3C, -0x00,0x80,0x22,0x31, -0xFA,0x01,0x40,0x10, -0x00,0xFF,0x02,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x00,0x62,0xAC, -0xFF,0x00,0x02,0x24, -0x25,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x40,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0x94,0x36,0x09,0xA2, -0xD4,0x36,0x03,0xAE, -0x04,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x0A,0x3C, -0xCC,0x5E,0x47,0x91, -0x02,0x80,0x09,0x3C, -0xBC,0x5E,0x25,0x8D, -0xD0,0x1B,0x06,0x8E, -0x06,0x00,0x02,0x3C, -0x20,0x00,0xE7,0x34, -0x27,0x10,0x02,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x01,0xA5,0x34, -0x25,0xB0,0x03,0x3C, -0x04,0x00,0x02,0x3C, -0x00,0x26,0x07,0x00, -0x26,0xA0,0x82,0x02, -0xB0,0x03,0x68,0x34, -0x25,0x20,0x85,0x00, -0x80,0x03,0x63,0x34, -0x41,0xB0,0x02,0x3C, -0x00,0x00,0x64,0xAC, -0x00,0x00,0x46,0xAC, -0xBC,0x5E,0x25,0xAD, -0xCC,0x5E,0x47,0xA1, -0xD0,0x1B,0x06,0xAE, -0x00,0x00,0x14,0xAD, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x02,0x00,0x04,0x3C, -0x30,0x1F,0x70,0x26, -0x26,0x18,0x64,0x00, -0xD4,0x1B,0x43,0xAC, -0xD0,0x1B,0x02,0x8E, -0x04,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x54,0x00, -0x24,0x10,0x43,0x00, -0xA1,0xFD,0x40,0x10, -0x00,0x00,0x00,0x00, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0xB0,0x03,0x62,0x34, -0x2A,0xB0,0x07,0x3C, -0x00,0x00,0x54,0xAC, -0x18,0x00,0xE5,0x34, -0x00,0x00,0xA9,0x8C, -0xFF,0x00,0x06,0x24, -0xFF,0x00,0x24,0x31, -0x16,0x02,0x86,0x10, -0x04,0x00,0x02,0x24, -0x00,0x80,0x22,0x31, -0xD6,0x01,0x40,0x10, -0x00,0xFF,0x02,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x00,0xA2,0xAC, -0xFF,0x00,0x02,0x24, -0x21,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x40,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0x98,0x36,0x09,0xA2, -0xD4,0x36,0x03,0xAE, -0x04,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x09,0x3C, -0xCC,0x5E,0x27,0x91, -0x02,0x80,0x08,0x3C, -0xBC,0x5E,0x05,0x8D, -0xD0,0x1B,0x06,0x8E, -0x06,0x00,0x02,0x3C, -0x10,0x00,0xE7,0x34, -0x27,0x10,0x02,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x01,0xA5,0x34, -0x00,0x26,0x07,0x00, -0x25,0xB0,0x02,0x3C, -0x25,0x20,0x85,0x00, -0x80,0x03,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x44,0xAC, -0x00,0x00,0x66,0xAC, -0xBC,0x5E,0x05,0xAD, -0xCC,0x5E,0x27,0xA1, -0xD0,0x1B,0x06,0xAE, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x04,0x00,0x04,0x3C, -0x30,0x1F,0x70,0x26, -0x26,0x18,0x64,0x00, -0xD4,0x1B,0x43,0xAC, -0xD0,0x1B,0x02,0x8E, -0x08,0x00,0x03,0x3C, -0x24,0x10,0x52,0x00, -0x24,0x10,0x43,0x00, -0x68,0xFD,0x40,0x10, -0x00,0x00,0x00,0x00, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x05,0x3C, -0x1C,0x00,0xA3,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x06,0x24, -0xFF,0x00,0x24,0x31, -0xDD,0x01,0x86,0x10, -0x25,0xB0,0x02,0x3C, -0x00,0x80,0x22,0x31, -0x33,0x01,0x40,0x10, -0x00,0xFF,0x02,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x00,0x62,0xAC, -0xFF,0x00,0x02,0x24, -0x25,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x4C,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0x9C,0x36,0x09,0xA2, -0xE0,0x36,0x03,0xAE, -0x05,0x00,0x04,0x24, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0x02,0x80,0x0A,0x3C, -0xCC,0x5E,0x47,0x91, -0x02,0x80,0x09,0x3C, -0xBC,0x5E,0x25,0x8D, -0xD0,0x1B,0x06,0x8E, -0x18,0x00,0x02,0x3C, -0x08,0x00,0xE7,0x34, -0x27,0x10,0x02,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x02,0xA5,0x34, -0x25,0xB0,0x03,0x3C, -0x10,0x00,0x02,0x3C, -0x00,0x26,0x07,0x00, -0x26,0xA0,0x82,0x02, -0xB0,0x03,0x68,0x34, -0x25,0x20,0x85,0x00, -0x80,0x03,0x63,0x34, -0x41,0xB0,0x02,0x3C, -0x00,0x00,0x64,0xAC, -0x00,0x00,0x46,0xAC, -0xBC,0x5E,0x25,0xAD, -0xCC,0x5E,0x47,0xA1, -0xD0,0x1B,0x06,0xAE, -0x00,0x00,0x14,0xAD, -0x30,0x1F,0x62,0x26, -0xD4,0x1B,0x43,0x8C, -0x08,0x00,0x04,0x3C, -0x26,0x18,0x64,0x00, -0x9E,0x35,0x00,0x08, -0xD4,0x1B,0x43,0xAC, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xD4,0x1B,0x02,0x8E, -0xD0,0x1B,0x03,0x8E, -0x00,0x20,0x42,0x38, -0x7D,0x35,0x00,0x08, -0xD4,0x1B,0x02,0xAE, -0x8C,0x33,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x2A,0xB0,0x02,0x3C, -0x08,0x00,0x43,0x34, -0x00,0x00,0x69,0x8C, -0xFF,0x00,0x02,0x24, -0xFF,0x00,0x24,0x31, -0x2C,0x00,0x82,0x10, -0x00,0x80,0x22,0x31, -0x34,0x01,0x40,0x14, -0x00,0x80,0x02,0x3C, -0x00,0xFF,0x02,0x3C, -0x24,0x10,0x22,0x01, -0x0B,0x00,0x40,0x10, -0xFF,0x00,0x02,0x24, -0xB4,0x36,0x02,0x92, -0x20,0xB0,0x03,0x3C, -0x00,0x12,0x02,0x00, -0x21,0x10,0x43,0x00, -0x0C,0x00,0x49,0x8C, -0x25,0xB0,0x03,0x3C, -0xB0,0x03,0x63,0x34, -0x00,0x00,0x69,0xAC, -0xFF,0x00,0x24,0x31, -0xFF,0x00,0x02,0x24, -0x1A,0x00,0x82,0x10, -0x30,0x1F,0x70,0x26, -0xFF,0x00,0x23,0x31, -0x7C,0x37,0x05,0x8E, -0x20,0x10,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x21,0x30,0x60,0x00, -0x10,0x37,0x03,0xAE, -0x01,0x00,0x04,0x24, -0xB4,0x36,0x09,0xA2, -0x80,0x00,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA0,0xAF, -0xD0,0x1B,0x05,0x8E, -0x02,0x80,0x06,0x3C, -0xBC,0x5E,0xC4,0x8C, -0xFF,0xC7,0x02,0x24, -0x24,0x28,0xA2,0x00, -0x25,0xB0,0x02,0x3C, -0x10,0x00,0x84,0x34, -0x80,0x03,0x42,0x34, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x44,0xAC, -0x00,0x00,0x65,0xAC, -0xBC,0x5E,0xC4,0xAC, -0xD0,0x1B,0x05,0xAE, -0x30,0x1F,0x63,0x26, -0xD4,0x1B,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x10,0x42,0x38, -0x76,0x35,0x00,0x08, -0xD4,0x1B,0x62,0xAC, -0x56,0x01,0x02,0x35, -0x00,0x00,0x43,0x94, -0x00,0x00,0x00,0x00, -0x70,0xFC,0x60,0x10, -0x00,0x00,0x00,0x00, -0x93,0x55,0x00,0x0C, -0x07,0x00,0x04,0x24, -0x29,0x35,0x00,0x08, -0x30,0x1F,0x64,0x26, -0x00,0x00,0x62,0xAC, -0xD3,0x35,0x00,0x08, -0xFF,0x00,0x02,0x24, -0xF8,0x1D,0x24,0x96, -0x64,0x37,0x25,0x8E, -0xFF,0x0F,0x83,0x30, -0x25,0x28,0xA2,0x00, -0x00,0x19,0x03,0x00, -0x20,0x00,0xA6,0x24, -0x02,0x12,0x03,0x00, -0x01,0x00,0x84,0x24, -0xF8,0x1D,0x24,0xA6, -0x17,0x00,0xC2,0xA0, -0x16,0x00,0xC3,0xA0, -0x0C,0x00,0xA4,0x8C, -0x00,0xF0,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xFF,0x0F,0x63,0x30, -0x00,0x1C,0x03,0x00, -0x24,0x20,0x82,0x00, -0x25,0x20,0x83,0x00, -0x0C,0x00,0xA4,0xAC, -0x64,0x37,0x25,0x8E, -0x01,0x00,0x10,0x24, -0x01,0x00,0x04,0x24, -0x31,0x10,0x06,0x3C, -0x00,0x01,0x07,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0xB0,0x01,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x2A,0xB0,0x02,0x3C, -0x01,0x00,0x42,0x34, -0x02,0x00,0x03,0x24, -0x00,0x00,0x50,0xA0, -0x00,0x00,0x43,0xA0, -0xD4,0x1B,0x22,0x8E, -0x00,0x00,0x00,0x00, -0x08,0x00,0x42,0x38, -0x68,0x35,0x00,0x08, -0xD4,0x1B,0x22,0xAE, -0xD0,0x03,0x23,0x35, -0x80,0x00,0x02,0x24, -0x00,0x00,0x62,0xAC, -0x24,0x36,0x00,0x08, -0x30,0x1F,0x62,0x26, -0x25,0xB0,0x02,0x3C, -0x01,0x00,0x03,0x24, -0x90,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0xF0,0x35,0x00,0x08, -0x30,0x1F,0x65,0x26, -0x24,0x10,0x22,0x01, -0xA9,0xFD,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x47,0x00,0xC6,0x34, -0x00,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x85,0x10, -0x30,0x1F,0x62,0x26, -0xA4,0x36,0x04,0xA2, -0x00,0x00,0xC2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x07,0x00,0x83,0x10, -0x21,0x38,0x00,0x02, -0x21,0x28,0xC0,0x00, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0xA4,0x36,0xE3,0xA0, -0x30,0x1F,0x62,0x26, -0xA4,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0x9C,0x36,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x24,0x10,0x22,0x01, -0xFD,0xFD,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x45,0x00,0xE5,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x86,0x10, -0x30,0x1F,0x62,0x26, -0xA8,0x36,0x04,0xA2, -0x00,0x00,0xA2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x08,0x00,0x83,0x10, -0x30,0x1F,0x62,0x26, -0x21,0x30,0x00,0x02, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0xA8,0x36,0xC3,0xA0, -0x30,0x1F,0x62,0x26, -0xA8,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0x11,0x37,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x24,0x10,0x22,0x01, -0x9E,0xFD,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x46,0x00,0xA5,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x86,0x10, -0x30,0x1F,0x62,0x26, -0xA0,0x36,0x04,0xA2, -0x00,0x00,0xA2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x08,0x00,0x83,0x10, -0x30,0x1F,0x62,0x26, -0x21,0x30,0x00,0x02, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0xA0,0x36,0xC3,0xA0, -0x30,0x1F,0x62,0x26, -0xA0,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0xD3,0x36,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x00,0xFF,0x02,0x3C, -0x24,0x10,0x22,0x01, -0x30,0xFE,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x41,0x00,0xA5,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x86,0x10, -0x30,0x1F,0x62,0x26, -0x90,0x36,0x04,0xA2, -0x00,0x00,0xA2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x08,0x00,0x83,0x10, -0x30,0x1F,0x62,0x26, -0x21,0x30,0x00,0x02, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0x90,0x36,0xC3,0xA0, -0x30,0x1F,0x62,0x26, -0x90,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0x87,0x37,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x24,0x10,0x22,0x01, -0xCF,0xFE,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x44,0x00,0xA5,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x86,0x10, -0x30,0x1F,0x62,0x26, -0x9C,0x36,0x04,0xA2, -0x00,0x00,0xA2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x08,0x00,0x83,0x10, -0x30,0x1F,0x62,0x26, -0x21,0x30,0x00,0x02, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0x9C,0x36,0xC3,0xA0, -0x30,0x1F,0x62,0x26, -0x9C,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0x47,0x38,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x24,0x10,0x22,0x01, -0xAE,0xFD,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x40,0x00,0xA5,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x86,0x10, -0x30,0x1F,0x62,0x26, -0x8C,0x36,0x04,0xA2, -0x00,0x00,0xA2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x08,0x00,0x83,0x10, -0x30,0x1F,0x62,0x26, -0x21,0x30,0x00,0x02, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0x8C,0x36,0xC3,0xA0, -0x30,0x1F,0x62,0x26, -0x8C,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0x47,0x37,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x00,0x00,0x62,0xAC, -0x93,0x38,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x24,0x10,0x22,0x01, -0x08,0xFE,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x42,0x00,0xA5,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x86,0x10, -0x30,0x1F,0x62,0x26, -0x94,0x36,0x04,0xA2, -0x00,0x00,0xA2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x08,0x00,0x83,0x10, -0x30,0x1F,0x62,0x26, -0x21,0x30,0x00,0x02, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0x94,0x36,0xC3,0xA0, -0x30,0x1F,0x62,0x26, -0x94,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0xC5,0x37,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x24,0x10,0x22,0x01, -0x2C,0xFE,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x43,0x00,0xE5,0x34, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x0E,0x00,0x86,0x10, -0x30,0x1F,0x62,0x26, -0x98,0x36,0x04,0xA2, -0x00,0x00,0xA2,0x90, -0xFF,0x00,0x83,0x30, -0xFF,0x00,0x44,0x30, -0x08,0x00,0x83,0x10, -0x30,0x1F,0x62,0x26, -0x21,0x30,0x00,0x02, -0x00,0x00,0xA2,0x90, -0x21,0x18,0x80,0x00, -0xFD,0xFF,0x62,0x14, -0xFF,0x00,0x44,0x30, -0x98,0x36,0xC3,0xA0, -0x30,0x1F,0x62,0x26, -0x98,0x36,0x43,0x90, -0x20,0xB0,0x02,0x3C, -0x00,0x1A,0x03,0x00, -0x21,0x18,0x62,0x00, -0x0C,0x00,0x69,0x8C, -0x25,0xB0,0x02,0x3C, -0xB0,0x03,0x42,0x34, -0xFF,0x00,0x24,0x31, -0x00,0x00,0x49,0xAC, -0x0A,0x38,0x00,0x08, -0xFF,0x00,0x02,0x24, -0x06,0x00,0x03,0x24, -0x90,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0xAB,0x37,0x00,0x08, -0x30,0x1F,0x62,0x26, -0x01,0x00,0x03,0x24, -0x90,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0xBF,0x36,0x00,0x08, -0x30,0x1F,0x62,0x26, -0x25,0xB0,0x02,0x3C, -0x07,0x00,0x03,0x24, -0x90,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x30,0x1F,0x63,0x26, -0xD4,0x1B,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x80,0x42,0x38, -0x71,0x37,0x00,0x08, -0xD4,0x1B,0x62,0xAC, -0x00,0x00,0x40,0xAC, -0x34,0x37,0x00,0x08, -0x30,0x1F,0x62,0x26, -0x02,0x00,0x03,0x24, -0x90,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0xFA,0x36,0x00,0x08, -0x30,0x1F,0x62,0x26, -0x90,0x03,0x63,0x34, -0x00,0x00,0x62,0xAC, -0x2D,0x38,0x00,0x08, -0x30,0x1F,0x62,0x26, -0x03,0x00,0x03,0x24, -0x90,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x6E,0x38,0x00,0x08, -0x30,0x1F,0x62,0x26, -0x05,0x00,0x03,0x24, -0x90,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0xEC,0x37,0x00,0x08, -0x30,0x1F,0x62,0x26, -0xE0,0xFF,0xBD,0x27, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x25,0xB0,0x0C,0x3C, -0x01,0x80,0x02,0x3C, -0x18,0x03,0x83,0x35, -0x9C,0xE8,0x42,0x24, -0x02,0x80,0x12,0x3C, -0x41,0xB0,0x0B,0x3C, -0x00,0x00,0x62,0xAC, -0x30,0x1F,0x4A,0x26, -0x0A,0x00,0x62,0x35, -0x00,0x00,0x44,0x94, -0xDE,0x1B,0x43,0x95, -0xDC,0x1B,0x49,0x95, -0x25,0x30,0x64,0x00, -0xFF,0xFF,0xD0,0x30, -0x24,0x10,0x09,0x02, -0x02,0x00,0x42,0x30, -0xC2,0x00,0x40,0x10, -0xC0,0x03,0x83,0x35, -0x02,0x00,0x02,0x24, -0x00,0x00,0x62,0xAC, -0x02,0x80,0x08,0x3C, -0xBC,0x5E,0x04,0x8D, -0xDC,0x02,0x82,0x35, -0x00,0x00,0x47,0x90, -0xFD,0xFF,0x03,0x24, -0x00,0x80,0x02,0x3C, -0x24,0x18,0x23,0x01, -0x25,0x20,0x82,0x00, -0x02,0x00,0xC6,0x38, -0x08,0x00,0x65,0x35, -0x02,0x80,0x02,0x3C, -0xF5,0x5E,0x47,0xA0, -0xBC,0x5E,0x04,0xAD, -0xDE,0x1B,0x46,0xA5, -0x21,0x48,0x60,0x00, -0x00,0x00,0xA3,0xA4, -0xDC,0x1B,0x43,0xA5, -0x24,0x38,0x09,0x02, -0x04,0x00,0xE2,0x30, -0x0A,0x00,0x40,0x10, -0x08,0x00,0xE2,0x30, -0xDE,0x1B,0x43,0x95, -0x0C,0x00,0x64,0x35, -0xC0,0x03,0x85,0x35, -0x04,0x00,0x63,0x38, -0x04,0x00,0x02,0x24, -0x00,0x00,0x86,0x8C, -0x00,0x00,0xA2,0xAC, -0xDE,0x1B,0x43,0xA5, -0x08,0x00,0xE2,0x30, -0x08,0x00,0x40,0x10, -0x10,0x00,0xE2,0x30, -0xDE,0x1B,0x42,0x95, -0xC0,0x03,0x84,0x35, -0x08,0x00,0x03,0x24, -0x08,0x00,0x42,0x38, -0x00,0x00,0x83,0xAC, -0xDE,0x1B,0x42,0xA5, -0x10,0x00,0xE2,0x30, -0x08,0x00,0x40,0x10, -0x20,0x00,0xE2,0x30, -0xDE,0x1B,0x42,0x95, -0xC0,0x03,0x84,0x35, -0x10,0x00,0x03,0x24, -0x10,0x00,0x42,0x38, -0x00,0x00,0x83,0xAC, -0xDE,0x1B,0x42,0xA5, -0x20,0x00,0xE2,0x30, -0x08,0x00,0x40,0x10, -0x80,0x00,0xE2,0x30, -0xDE,0x1B,0x42,0x95, -0xC0,0x03,0x84,0x35, -0x20,0x00,0x03,0x24, -0x20,0x00,0x42,0x38, -0x00,0x00,0x83,0xAC, -0xDE,0x1B,0x42,0xA5, -0x80,0x00,0xE2,0x30, -0x74,0x00,0x40,0x10, -0x30,0x1F,0x47,0x26, -0xC0,0x03,0x83,0x35, -0x80,0x00,0x02,0x24, -0x42,0xB0,0x0B,0x3C, -0x00,0x00,0x62,0xAC, -0x03,0x00,0x71,0x35, -0xDE,0x1B,0x42,0x95, -0x00,0x00,0x23,0x92, -0x80,0x00,0x42,0x38, -0x20,0x00,0x63,0x30, -0x59,0x00,0x60,0x10, -0xDE,0x1B,0x42,0xA5, -0x20,0x00,0x02,0x24, -0x00,0x00,0x22,0xA2, -0x02,0x80,0x03,0x3C, -0x16,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x75,0x00,0x40,0x14, -0x21,0x40,0x00,0x00, -0xB0,0x1B,0x42,0x95, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x4E,0x00,0x40,0x10, -0x02,0x80,0x06,0x3C, -0x02,0x80,0x07,0x3C, -0xF4,0x5E,0xE2,0x90, -0x00,0x00,0x00,0x00, -0x49,0x00,0x40,0x10, -0x02,0x80,0x09,0x3C, -0x02,0x80,0x04,0x3C, -0x00,0x5F,0x82,0x8C, -0x20,0x5F,0x24,0x8D, -0x24,0x5F,0x25,0x8D, -0x21,0x18,0x00,0x00, -0x21,0x10,0x44,0x00, -0x2B,0x30,0x44,0x00, -0x21,0x18,0x65,0x00, -0x21,0x18,0x66,0x00, -0x20,0x5F,0x22,0xAD, -0x24,0x5F,0x23,0xAD, -0xF4,0x5E,0xE4,0x90, -0x02,0x00,0x02,0x24, -0xFF,0x00,0x84,0x30, -0x07,0x00,0x82,0x10, -0x02,0x80,0x04,0x3C, -0xF4,0x5E,0xE2,0x90, -0x03,0x00,0x03,0x24, -0xFF,0x00,0x42,0x30, -0x5A,0x00,0x43,0x14, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x04,0x3C, -0x11,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x42,0x24, -0x11,0x5F,0x82,0xA0, -0x11,0x5F,0x83,0x90, -0x00,0x00,0x00,0x00, -0x07,0x00,0x60,0x10, -0x02,0x80,0x02,0x3C, -0xFA,0x5E,0x43,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x60,0x14, -0x00,0x00,0x00,0x00, -0x5B,0x00,0x00,0x11, -0x80,0x00,0x86,0x35, -0x11,0x5F,0x82,0x90, -0x00,0x00,0x00,0x00, -0x06,0x00,0x40,0x14, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x02,0x3C, -0x10,0x5F,0x43,0x90, -0x00,0x00,0x00,0x00, -0x11,0x5F,0x83,0xA0, -0x02,0x80,0x05,0x3C, -0x0E,0x5F,0xA2,0x90, -0x02,0x80,0x03,0x3C, -0x02,0x00,0x04,0x24, -0x10,0x00,0x42,0x34, -0x0E,0x5F,0xA2,0xA0, -0xF9,0x5E,0x62,0x90, -0x21,0x28,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x80,0x30,0x02,0x00, -0x21,0x30,0xC2,0x00, -0x8C,0x23,0x00,0x0C, -0x00,0x33,0x06,0x00, -0x42,0xB0,0x02,0x3C, -0x44,0x00,0x04,0x24, -0x03,0x00,0x42,0x34, -0x00,0x00,0x44,0xA0, -0x02,0x80,0x03,0x3C, -0xF6,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x04,0x00,0x42,0x28, -0x05,0x00,0x40,0x10, -0x02,0x80,0x06,0x3C, -0x04,0x00,0x04,0x24, -0x64,0x31,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x02,0x80,0x06,0x3C, -0xBC,0x5E,0xC4,0x8C, -0x30,0x1F,0x47,0x26, -0xDC,0x1B,0xE5,0x94, -0x08,0x00,0x02,0x3C, -0x25,0x20,0x82,0x00, -0x41,0xB0,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x7F,0xFF,0xA5,0x30, -0xB0,0x03,0x42,0x34, -0x08,0x00,0x63,0x34, -0x00,0x00,0x44,0xAC, -0x00,0x00,0x65,0xA4, -0xBC,0x5E,0xC4,0xAC, -0xDC,0x1B,0xE5,0xA4, -0x30,0x1F,0x47,0x26, -0xDC,0x1B,0xE2,0x94, -0x00,0x00,0x00,0x00, -0x24,0x10,0x50,0x00, -0x00,0x30,0x42,0x30, -0x06,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xDE,0x1B,0xE2,0x94, -0x00,0x00,0x00,0x00, -0x00,0x10,0x42,0x38, -0x00,0x20,0x42,0x34, -0xDE,0x1B,0xE2,0xA4, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x51,0x3A,0x00,0x08, -0xDE,0x1B,0x46,0xA5, -0x01,0x00,0x08,0x24, -0x16,0x5F,0x60,0xA0, -0x8D,0x3A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x0E,0x5F,0xA2,0x90, -0x02,0x80,0x03,0x3C, -0x02,0x00,0x04,0x24, -0x10,0x00,0x42,0x34, -0x0E,0x5F,0xA2,0xA0, -0xF9,0x5E,0x62,0x90, -0x21,0x28,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x80,0x30,0x02,0x00, -0x21,0x30,0xC2,0x00, -0x8C,0x23,0x00,0x0C, -0x00,0x33,0x06,0x00, -0x44,0x00,0x02,0x24, -0x00,0x00,0x22,0xA2, -0xD5,0x3A,0x00,0x08, -0x02,0x80,0x03,0x3C, -0x84,0x00,0x84,0x35, -0x00,0x00,0x82,0x8C, -0x02,0x80,0x08,0x3C, -0x00,0x00,0xC4,0x8C, -0x1C,0x5F,0x06,0x8D, -0x21,0x10,0x00,0x00, -0x20,0x5F,0x28,0x8D, -0x24,0x5F,0x29,0x8D, -0x00,0x00,0x65,0x91, -0x25,0x10,0x44,0x00, -0x21,0x10,0x46,0x00, -0xFB,0xFF,0x04,0x24, -0x24,0x28,0xA4,0x00, -0x23,0x40,0x02,0x01, -0x00,0x00,0x65,0xA1, -0x04,0x00,0x00,0x11, -0x01,0x00,0x06,0x24, -0x80,0x10,0x08,0x00, -0x21,0x10,0x48,0x00, -0x80,0x30,0x02,0x00, -0x01,0x00,0x04,0x24, -0x8C,0x23,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x42,0xB0,0x02,0x3C, -0x22,0x00,0x03,0x24, -0x03,0x00,0x42,0x34, -0x00,0x00,0x43,0xA0, -0xDF,0x3A,0x00,0x08, -0x02,0x80,0x06,0x3C, -0xF0,0xFF,0xBD,0x27, -0x08,0x00,0xB2,0xAF, -0x04,0x00,0xB1,0xAF, -0x00,0x00,0xB0,0xAF, -0x00,0x40,0x09,0x40, -0x00,0x68,0x0A,0x40, -0x00,0x70,0x02,0x40, -0x00,0x60,0x0B,0x40, -0x25,0xB0,0x05,0x3C, -0x18,0x03,0xA7,0x34, -0x00,0x00,0xE6,0x8C, -0x01,0x80,0x02,0x3C, -0x1C,0x03,0xA3,0x34, -0xC8,0xEC,0x42,0x24, -0x00,0x00,0x66,0xAC, -0x00,0x00,0xE2,0xAC, -0x80,0x00,0x83,0x8C, -0x7C,0x02,0xA2,0x34, -0x80,0x02,0xA6,0x34, -0x84,0x02,0xA7,0x34, -0x88,0x02,0xA8,0x34, -0x00,0x00,0x43,0xAC, -0x00,0x00,0xC9,0xAC, -0x00,0x00,0xEA,0xAC, -0x00,0x00,0x0B,0xAD, -0x74,0x00,0x83,0x8C, -0x8C,0x02,0xA2,0x34, -0x90,0x02,0xA7,0x34, -0x00,0x00,0x43,0xAC, -0x08,0x00,0x86,0x8C, -0x94,0x02,0xA8,0x34, -0x98,0x02,0xA9,0x34, -0x00,0x00,0xE6,0xAC, -0x0C,0x00,0x82,0x8C, -0x9C,0x02,0xA6,0x34, -0xA0,0x02,0xA7,0x34, -0x00,0x00,0x02,0xAD, -0x10,0x00,0x83,0x8C, -0xA4,0x02,0xA8,0x34, -0xA8,0x02,0xAA,0x34, -0x00,0x00,0x23,0xAD, -0x14,0x00,0x82,0x8C, -0xAC,0x02,0xA9,0x34, -0xB0,0x02,0xAB,0x34, -0x00,0x00,0xC2,0xAC, -0x18,0x00,0x83,0x8C, -0xB4,0x02,0xAC,0x34, -0xB8,0x02,0xAD,0x34, -0x00,0x00,0xE3,0xAC, -0x1C,0x00,0x82,0x8C, -0xBC,0x02,0xA7,0x34, -0xC0,0x02,0xAE,0x34, -0x00,0x00,0x02,0xAD, -0x20,0x00,0x83,0x8C, -0xC4,0x02,0xA8,0x34, -0xC8,0x02,0xAF,0x34, -0x00,0x00,0x43,0xAD, -0x24,0x00,0x82,0x8C, -0xCC,0x02,0xAA,0x34, -0xD0,0x02,0xB0,0x34, -0x00,0x00,0x22,0xAD, -0x28,0x00,0x83,0x8C, -0xD4,0x02,0xA9,0x34, -0xD8,0x02,0xB1,0x34, -0x00,0x00,0x63,0xAD, -0x2C,0x00,0x86,0x8C, -0x70,0x02,0xAB,0x34, -0x74,0x02,0xB2,0x34, -0x00,0x00,0x86,0xAD, -0x30,0x00,0x82,0x8C, -0x78,0x02,0xA6,0x34, -0x6C,0x03,0xAC,0x34, -0x00,0x00,0xA2,0xAD, -0x34,0x00,0x83,0x8C, -0x02,0x80,0x02,0x3C, -0x00,0x00,0xE3,0xAC, -0x38,0x00,0x85,0x8C, -0x28,0xC7,0x47,0x8C, -0x00,0x00,0xC5,0xAD, -0x3C,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x02,0xAD, -0x40,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0xE3,0xAD, -0x44,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x42,0xAD, -0x48,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x03,0xAE, -0x4C,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x22,0xAD, -0x50,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x23,0xAE, -0x54,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x62,0xAD, -0x58,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x43,0xAE, -0x5C,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC2,0xAC, -0x21,0x10,0xE0,0x00, -0x00,0x00,0x82,0xAD, -0x01,0x00,0xE7,0x24, -0x21,0x10,0xE0,0x00, -0x01,0x00,0xE7,0x24, -0x00,0x00,0x82,0xAD, -0x9D,0x3B,0x00,0x08, -0x21,0x10,0xE0,0x00, -0x01,0x80,0x1B,0x3C, -0x90,0xEE,0x7B,0x27, -0x25,0xB0,0x1A,0x3C, -0x18,0x03,0x5A,0x27, -0x00,0x00,0x5B,0xAF, -0x21,0xD8,0xA0,0x03, -0x82,0xDA,0x1B,0x00, -0x80,0xDA,0x1B,0x00, -0x08,0x00,0x7B,0x27, -0x04,0x00,0x61,0xAF, -0x08,0x00,0x62,0xAF, -0x0C,0x00,0x63,0xAF, -0x10,0x00,0x64,0xAF, -0x14,0x00,0x65,0xAF, -0x18,0x00,0x66,0xAF, -0x1C,0x00,0x67,0xAF, -0x20,0x00,0x68,0xAF, -0x24,0x00,0x69,0xAF, -0x28,0x00,0x6A,0xAF, -0x2C,0x00,0x6B,0xAF, -0x30,0x00,0x6C,0xAF, -0x34,0x00,0x6D,0xAF, -0x38,0x00,0x6E,0xAF, -0x3C,0x00,0x6F,0xAF, -0x12,0x40,0x00,0x00, -0x10,0x48,0x00,0x00, -0x00,0x70,0x0A,0x40, -0x40,0x00,0x70,0xAF, -0x44,0x00,0x71,0xAF, -0x48,0x00,0x72,0xAF, -0x4C,0x00,0x73,0xAF, -0x50,0x00,0x74,0xAF, -0x54,0x00,0x75,0xAF, -0x58,0x00,0x76,0xAF, -0x5C,0x00,0x77,0xAF, -0x60,0x00,0x78,0xAF, -0x64,0x00,0x79,0xAF, -0x68,0x00,0x7C,0xAF, -0x6C,0x00,0x7D,0xAF, -0x70,0x00,0x7E,0xAF, -0x74,0x00,0x7F,0xAF, -0x78,0x00,0x68,0xAF, -0x7C,0x00,0x69,0xAF, -0x80,0x00,0x6A,0xAF, -0x00,0x68,0x1A,0x40, -0x25,0xB0,0x1B,0x3C, -0x1C,0x03,0x7B,0x37, -0x00,0x00,0x00,0x00, -0x00,0x00,0x7A,0xAF, -0x7F,0x00,0x5B,0x33, -0x30,0x00,0x60,0x13, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x1B,0x3C, -0x30,0x03,0x7B,0x37, -0x00,0x00,0x00,0x00, -0x00,0x00,0x7A,0xAF, -0x00,0x00,0x00,0x00, -0x21,0xD8,0xA0,0x03, -0x82,0xDA,0x1B,0x00, -0x80,0xDA,0x1B,0x00, -0x08,0x00,0x7B,0x27, -0x04,0x00,0x61,0xAF, -0x08,0x00,0x62,0xAF, -0x0C,0x00,0x63,0xAF, -0x10,0x00,0x64,0xAF, -0x14,0x00,0x65,0xAF, -0x18,0x00,0x66,0xAF, -0x1C,0x00,0x67,0xAF, -0x20,0x00,0x68,0xAF, -0x24,0x00,0x69,0xAF, -0x28,0x00,0x6A,0xAF, -0x2C,0x00,0x6B,0xAF, -0x30,0x00,0x6C,0xAF, -0x34,0x00,0x6D,0xAF, -0x38,0x00,0x6E,0xAF, -0x3C,0x00,0x6F,0xAF, -0x12,0x40,0x00,0x00, -0x10,0x48,0x00,0x00, -0x00,0x70,0x0A,0x40, -0x40,0x00,0x70,0xAF, -0x44,0x00,0x71,0xAF, -0x48,0x00,0x72,0xAF, -0x4C,0x00,0x73,0xAF, -0x50,0x00,0x74,0xAF, -0x54,0x00,0x75,0xAF, -0x58,0x00,0x76,0xAF, -0x5C,0x00,0x77,0xAF, -0x60,0x00,0x78,0xAF, -0x64,0x00,0x79,0xAF, -0x68,0x00,0x7C,0xAF, -0x6C,0x00,0x7D,0xAF, -0x70,0x00,0x7E,0xAF, -0x74,0x00,0x7F,0xAF, -0x78,0x00,0x68,0xAF, -0x7C,0x00,0x69,0xAF, -0x80,0x00,0x6A,0xAF, -0x32,0x3B,0x00,0x08, -0x21,0x20,0x60,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x08,0x3C, -0x20,0x03,0x08,0x35, -0x00,0x00,0x00,0x00, -0x00,0x00,0x1A,0xAD, -0x00,0x04,0x5B,0x33, -0x0A,0x00,0x60,0x13, -0x00,0x00,0x00,0x00, -0x01,0x80,0x08,0x3C, -0x3C,0xD4,0x08,0x25, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x1B,0x3C, -0x24,0x03,0x7B,0x37, -0x00,0x00,0x00,0x00, -0x00,0x00,0x68,0xAF, -0x09,0xF8,0x00,0x01, -0x00,0x00,0x00,0x00, -0x00,0x08,0x5B,0x33, -0x25,0xB0,0x08,0x3C, -0x28,0x03,0x08,0x35, -0x00,0x00,0x00,0x00, -0x00,0x00,0x1B,0xAD, -0x06,0x00,0x60,0x13, -0x00,0x00,0x00,0x00, -0x01,0x80,0x08,0x3C, -0x9C,0xE8,0x08,0x25, -0x00,0x00,0x00,0x00, -0x09,0xF8,0x00,0x01, -0x00,0x00,0x00,0x00, -0x02,0x80,0x1A,0x3C, -0xBC,0x5E,0x5A,0x27, -0x04,0x00,0x5B,0x97, -0x25,0xB0,0x08,0x3C, -0x30,0x03,0x08,0x35, -0x00,0x00,0x00,0x00, -0x00,0x00,0x1B,0xAD, -0x18,0x00,0x60,0x13, -0x00,0x00,0x00,0x00, -0x08,0xE4,0x9B,0x27, -0x00,0x00,0x00,0x00, -0x04,0x00,0x61,0x8F, -0xFC,0x03,0x70,0x7B, -0x7C,0x00,0x62,0x7B, -0xBC,0x00,0x64,0x7B, -0xFC,0x00,0x66,0x7B, -0x3C,0x01,0x68,0x7B, -0x13,0x00,0x00,0x02, -0x11,0x00,0x20,0x02, -0x7C,0x01,0x6A,0x7B, -0xBC,0x01,0x6C,0x7B, -0xFC,0x01,0x6E,0x7B, -0x3C,0x02,0x70,0x7B, -0x7C,0x02,0x72,0x7B, -0xBC,0x02,0x74,0x7B, -0xFC,0x02,0x76,0x7B, -0x3C,0x03,0x78,0x7B, -0x7C,0x03,0x7C,0x7B, -0xBC,0x03,0x7E,0x7B, -0x80,0x00,0x7B,0x8F, -0x8F,0x3C,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0xD8,0xA0,0x03, -0x82,0xDA,0x1B,0x00, -0x80,0xDA,0x1B,0x00, -0x08,0x00,0x7B,0x27, -0x08,0x00,0x5B,0xAF, -0xFC,0xE7,0x9D,0x27, -0x00,0x00,0x4A,0x8F, -0x00,0x00,0x00,0x00, -0x21,0x00,0x40,0x11, -0x00,0x00,0x00,0x00, -0x02,0x80,0x08,0x3C, -0x1C,0x5E,0x08,0x25, -0x21,0x48,0x00,0x00, -0x21,0x58,0x00,0x00, -0x01,0x00,0x6B,0x25, -0x1A,0x00,0x40,0x11, -0x24,0x70,0x4B,0x01, -0x14,0x00,0xC0,0x11, -0x01,0x00,0x04,0x24, -0x00,0x00,0x00,0x00, -0x04,0x00,0x44,0xA3, -0x26,0x50,0x4B,0x01, -0x00,0x00,0x4A,0xAF, -0x80,0x80,0x09,0x00, -0x21,0x80,0x08,0x02, -0x00,0x00,0x10,0x8E, -0x00,0x00,0x00,0x00, -0x09,0xF8,0x00,0x02, -0x00,0x00,0x00,0x00, -0x01,0x80,0x1B,0x3C, -0x68,0xF1,0x7B,0x27, -0x25,0xB0,0x1A,0x3C, -0x18,0x03,0x5A,0x27, -0x00,0x00,0x5B,0xAF, -0x02,0x80,0x1A,0x3C, -0xBC,0x5E,0x5A,0x27, -0xE1,0xFF,0x00,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0x29,0x25, -0x40,0x58,0x0B,0x00, -0x52,0x3C,0x00,0x08, -0x00,0x00,0x00,0x00, -0x02,0x80,0x1B,0x3C, -0xBC,0x5E,0x7B,0x27, -0x21,0x60,0x00,0x00, -0x04,0x00,0x6C,0xA7, -0x08,0x00,0x7A,0x8F, -0x00,0x00,0x00,0x00, -0xF8,0xFF,0x5A,0x27, -0x00,0x00,0x5A,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0x5A,0x27, -0x84,0x00,0x44,0x8F, -0x00,0x00,0x00,0x00, -0xF9,0xFF,0x80,0x10, -0x00,0x00,0x00,0x00, -0x04,0x00,0x41,0x8F, -0xFC,0x03,0x50,0x7B, -0x7C,0x00,0x42,0x7B, -0xBC,0x00,0x44,0x7B, -0xFC,0x00,0x46,0x7B, -0x3C,0x01,0x48,0x7B, -0x13,0x00,0x00,0x02, -0x11,0x00,0x20,0x02, -0x7C,0x01,0x4A,0x7B, -0xBC,0x01,0x4C,0x7B, -0xFC,0x01,0x4E,0x7B, -0x3C,0x02,0x50,0x7B, -0x7C,0x02,0x52,0x7B, -0xBC,0x02,0x54,0x7B, -0xFC,0x02,0x56,0x7B, -0x3C,0x03,0x58,0x7B, -0x7C,0x03,0x5C,0x7B, -0xBC,0x03,0x5E,0x7B, -0x80,0x00,0x5B,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0x60,0x03, -0x10,0x00,0x00,0x42, -0x00,0x60,0x05,0x40, -0x42,0x28,0x05,0x00, -0x40,0x28,0x05,0x00, -0x00,0x60,0x85,0x40, -0x04,0x00,0x81,0xAC, -0x08,0x00,0x82,0xAC, -0x0C,0x00,0x83,0xAC, -0x20,0x00,0x88,0xAC, -0x24,0x00,0x89,0xAC, -0x28,0x00,0x8A,0xAC, -0x2C,0x00,0x8B,0xAC, -0x30,0x00,0x8C,0xAC, -0x34,0x00,0x8D,0xAC, -0x38,0x00,0x8E,0xAC, -0x3C,0x00,0x8F,0xAC, -0x12,0x40,0x00,0x00, -0x10,0x48,0x00,0x00, -0x40,0x00,0x90,0xAC, -0x44,0x00,0x91,0xAC, -0x48,0x00,0x92,0xAC, -0x4C,0x00,0x93,0xAC, -0x50,0x00,0x94,0xAC, -0x54,0x00,0x95,0xAC, -0x58,0x00,0x96,0xAC, -0x5C,0x00,0x97,0xAC, -0x60,0x00,0x98,0xAC, -0x64,0x00,0x99,0xAC, -0x68,0x00,0x9C,0xAC, -0x6C,0x00,0x9D,0xAC, -0x70,0x00,0x9E,0xAC, -0x74,0x00,0x9F,0xAC, -0x78,0x00,0x88,0xAC, -0x7C,0x00,0x89,0xAC, -0x80,0x00,0x9F,0xAC, -0xF8,0xFF,0x84,0x24, -0x00,0x00,0x84,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x84,0x24, -0x84,0x00,0x86,0x8C, -0x00,0x00,0x00,0x00, -0xF9,0xFF,0xC0,0x10, -0x00,0x00,0x00,0x00, -0x21,0xD8,0x80,0x00, -0x01,0x00,0xBA,0x34, -0x04,0x00,0x61,0x8F, -0xFC,0x03,0x70,0x7B, -0x7C,0x00,0x62,0x7B, -0xBC,0x00,0x64,0x7B, -0xFC,0x00,0x66,0x7B, -0x3C,0x01,0x68,0x7B, -0x13,0x00,0x00,0x02, -0x11,0x00,0x20,0x02, -0x7C,0x01,0x6A,0x7B, -0xBC,0x01,0x6C,0x7B, -0xFC,0x01,0x6E,0x7B, -0x3C,0x02,0x70,0x7B, -0x7C,0x02,0x72,0x7B, -0xBC,0x02,0x74,0x7B, -0xFC,0x02,0x76,0x7B, -0x3C,0x03,0x78,0x7B, -0x7C,0x03,0x7C,0x7B, -0xBC,0x03,0x7E,0x7B, -0x80,0x00,0x7B,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0x60,0x03, -0x00,0x60,0x9A,0x40, -0x00,0x60,0x05,0x40, -0x42,0x28,0x05,0x00, -0x40,0x28,0x05,0x00, -0x00,0x60,0x85,0x40, -0x04,0x00,0x81,0xAC, -0x08,0x00,0x82,0xAC, -0x0C,0x00,0x83,0xAC, -0x20,0x00,0x88,0xAC, -0x24,0x00,0x89,0xAC, -0x28,0x00,0x8A,0xAC, -0x2C,0x00,0x8B,0xAC, -0x30,0x00,0x8C,0xAC, -0x34,0x00,0x8D,0xAC, -0x38,0x00,0x8E,0xAC, -0x3C,0x00,0x8F,0xAC, -0x12,0x40,0x00,0x00, -0x10,0x48,0x00,0x00, -0x40,0x00,0x90,0xAC, -0x44,0x00,0x91,0xAC, -0x48,0x00,0x92,0xAC, -0x4C,0x00,0x93,0xAC, -0x50,0x00,0x94,0xAC, -0x54,0x00,0x94,0xAC, -0x58,0x00,0x96,0xAC, -0x5C,0x00,0x96,0xAC, -0x60,0x00,0x98,0xAC, -0x64,0x00,0x99,0xAC, -0x68,0x00,0x9C,0xAC, -0x6C,0x00,0x9D,0xAC, -0x70,0x00,0x9E,0xAC, -0x78,0x00,0x88,0xAC, -0x7C,0x00,0x89,0xAC, -0x80,0x00,0x9F,0xAC, -0x84,0x00,0x80,0xAC, -0xF8,0xFF,0x84,0x24, -0x00,0x00,0x84,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x84,0x24, -0x84,0x00,0x86,0x8C, -0xFA,0xFF,0xC0,0x10, -0x00,0x00,0x00,0x00, -0x21,0xD8,0x80,0x00, -0x01,0x00,0xBA,0x24, -0x04,0x00,0x61,0x8F, -0xFC,0x03,0x70,0x7B, -0x7C,0x00,0x62,0x7B, -0xBC,0x00,0x64,0x7B, -0xFC,0x00,0x66,0x7B, -0x3C,0x01,0x68,0x7B, -0x13,0x00,0x00,0x02, -0x11,0x00,0x20,0x02, -0x7C,0x01,0x6A,0x7B, -0xBC,0x01,0x6C,0x7B, -0xFC,0x01,0x6E,0x7B, -0x3C,0x02,0x70,0x7B, -0x7C,0x02,0x72,0x7B, -0xBC,0x02,0x74,0x7B, -0xFC,0x02,0x76,0x7B, -0x3C,0x03,0x78,0x7B, -0x7C,0x03,0x7C,0x7B, -0xBC,0x03,0x7E,0x7B, -0x80,0x00,0x7B,0x8F, -0x08,0x00,0x60,0x03, -0x00,0x60,0x9A,0x40, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x83,0x4E,0x00,0x00, -0x00,0x00,0x00,0x00, -0x01,0x80,0x1B,0x3C, -0x00,0x00,0x7B,0x27, -0x25,0xB0,0x1A,0x3C, -0x18,0x03,0x5A,0x27, -0x00,0x00,0x5B,0xAF, -0x00,0x00,0x05,0x24, -0x03,0x00,0xA4,0x24, -0x00,0xA0,0x80,0x40, -0x00,0xA0,0x84,0x40, -0x01,0x80,0x04,0x3C, -0x40,0x00,0x84,0x24, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x01,0x80,0x1B,0x3C, -0x40,0x00,0x7B,0x27, -0x25,0xB0,0x1A,0x3C, -0x18,0x03,0x5A,0x27, -0x00,0x00,0x5B,0xAF, -0x02,0x80,0x1A,0x3C, -0x00,0x00,0x5A,0x27, -0xFC,0x03,0x5D,0x27, -0x02,0x80,0x1C,0x3C, -0x00,0x1C,0x9C,0x27, -0x00,0xF0,0x08,0x3C, -0x00,0x0C,0x08,0x35, -0x00,0x60,0x88,0x40, -0x02,0x80,0x04,0x3C, -0x00,0x00,0x84,0x24, -0xFF,0x7F,0x05,0x3C, -0xFF,0xFF,0xA5,0x34, -0x24,0x20,0x85,0x00, -0x00,0x20,0x84,0x4C, -0xFF,0xFF,0x05,0x34, -0x21,0x28,0xA4,0x00, -0x00,0x28,0x85,0x4C, -0x02,0x80,0x08,0x3C, -0x00,0x00,0x08,0x25, -0x00,0x00,0x00,0xAD, -0x03,0x80,0x09,0x3C, -0xFC,0xCC,0x29,0x25, -0x04,0x00,0x08,0x25, -0xFE,0xFF,0x09,0x15, -0x00,0x00,0x00,0xAD, -0x00,0x80,0x04,0x3C, -0x00,0x00,0x84,0x24, -0xFF,0x7F,0x05,0x3C, -0xFF,0xFF,0xA5,0x34, -0x24,0x20,0x85,0x00, -0x00,0x00,0x84,0x4C, -0xFF,0xFF,0x06,0x34, -0x21,0x30,0xC4,0x00, -0x24,0x30,0xC5,0x00, -0x00,0x08,0x86,0x4C, -0x00,0xA0,0x04,0x40, -0x10,0x00,0x84,0x34, -0x00,0xA0,0x84,0x40, -0x01,0x80,0x1B,0x3C, -0xEC,0x00,0x7B,0x27, -0x25,0xB0,0x1A,0x3C, -0x18,0x03,0x5A,0x27, -0x00,0x00,0x5B,0xAF, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x04,0x3C, -0x44,0x00,0x84,0x34, -0x00,0x00,0x85,0x84, -0x20,0x00,0x06,0x24, -0x25,0x28,0xA6,0x00, -0x00,0x00,0x85,0xA4, -0x01,0x80,0x1B,0x3C, -0x1C,0x01,0x7B,0x27, -0x25,0xB0,0x1A,0x3C, -0x18,0x03,0x5A,0x27, -0x00,0x00,0x5B,0xAF, -0x25,0xB0,0x04,0x3C, -0x44,0x00,0x84,0x34, -0x00,0x00,0x85,0x8C, -0x00,0x00,0x00,0x00, -0x10,0x00,0xA5,0x30, -0xFC,0xFF,0xA0,0x10, -0x00,0x00,0x00,0x00, -0xFF,0x1F,0x07,0x3C, -0xFF,0xFF,0xE7,0x34, -0x02,0x80,0x05,0x3C, -0xD8,0x5D,0xA5,0x24, -0xFF,0xFF,0xA5,0x30, -0x40,0xB0,0x04,0x3C, -0x25,0x28,0xA4,0x00, -0x24,0x28,0xA7,0x00, -0x21,0x30,0x00,0x00, -0x43,0xB0,0x02,0x3C, -0x00,0x80,0x04,0x3C, -0x40,0x00,0x84,0x34, -0x00,0x00,0x45,0xAC, -0x04,0x00,0x46,0xAC, -0x08,0x00,0x44,0xAC, -0xEA,0x65,0x00,0x08, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x09,0x00,0x02,0x24, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x41,0x04, -0xFF,0xFF,0x42,0x24, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x42,0x24, -0x00,0x60,0x02,0x40, -0x01,0x00,0x41,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x82,0xAC, -0x00,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x21,0x18,0x40,0x00, -0x00,0x60,0x83,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x82,0xAC, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x00,0x60,0x81,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x01,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x0C,0x02,0x63,0x24, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x04,0x00,0x85,0x8C, -0x00,0xA0,0x03,0x3C, -0x01,0x00,0x02,0x24, -0x25,0x28,0xA3,0x00, -0x00,0x00,0xA4,0x8C, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x01,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x3C,0x02,0x63,0x24, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x04,0x00,0x82,0x8C, -0x02,0x00,0x83,0x94, -0x00,0xA0,0x07,0x3C, -0x25,0x28,0x47,0x00, -0x00,0x00,0xA2,0x8C, -0x10,0x00,0x02,0x24, -0x13,0x00,0x62,0x10, -0x11,0x00,0x66,0x28, -0x06,0x00,0xC0,0x10, -0x20,0x00,0x02,0x24, -0x08,0x00,0x02,0x24, -0x17,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0xFD,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA3,0xAC, -0x04,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x25,0x10,0x47,0x00, -0x00,0x00,0x42,0x8C, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0xA4, -0x04,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x25,0x18,0x67,0x00, -0x00,0x00,0x62,0x94, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0xA0, -0x04,0x00,0x83,0x8C, -0x00,0x00,0x00,0x00, -0x25,0x18,0x67,0x00, -0x00,0x00,0x62,0x90, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x47,0x24, -0x30,0x37,0xE3,0x90, -0xFF,0xFF,0xA5,0x30, -0x09,0x00,0xA3,0x10, -0x21,0x20,0xC0,0x00, -0xA0,0x37,0xE2,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0xC2,0xAC, -0xAA,0x37,0xE3,0x94, -0x0E,0x00,0x02,0x24, -0x14,0x00,0xC2,0xAC, -0x30,0x09,0x00,0x08, -0x0C,0x00,0xC3,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x11,0x3C, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x31,0x26, -0x88,0x37,0x30,0x96, -0x02,0x80,0x02,0x3C, -0x01,0x80,0x03,0x3C, -0x25,0x80,0x02,0x02, -0x25,0xB0,0x02,0x3C, -0x40,0x03,0x63,0x24, -0x18,0x03,0x42,0x34, -0x60,0x00,0x04,0x26, -0x80,0x00,0x05,0x26, -0x00,0x00,0x43,0xAC, -0x5F,0x1E,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x21,0x20,0x00,0x02, -0x21,0x28,0x00,0x00, -0x08,0x52,0x00,0x0C, -0x08,0x00,0x06,0x24, -0x88,0x37,0x22,0x8E, -0x0C,0x00,0x03,0x24, -0x0C,0x00,0x43,0xAE, -0x08,0x00,0x42,0xAE, -0x12,0x00,0x02,0x24, -0x14,0x00,0x42,0xAE, -0x21,0x20,0x40,0x02, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x30,0x09,0x00,0x08, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x1C,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x30,0x80,0x00, -0x21,0x90,0x00,0x00, -0x00,0x60,0x11,0x40, -0x01,0x00,0x21,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x0D,0x00,0x83,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x60,0x14, -0x02,0x80,0x02,0x3C, -0x01,0x00,0x03,0x24, -0xF8,0x5E,0x43,0xA0, -0x0C,0x00,0xC2,0x90, -0x02,0x80,0x05,0x3C, -0x0D,0x5F,0xA2,0xA0, -0x00,0x00,0xC4,0x90, -0x05,0x00,0x02,0x24, -0xFF,0x00,0x83,0x30, -0x41,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x03,0x00,0x02,0x24, -0x31,0x00,0x62,0x10, -0xFF,0x00,0x84,0x30, -0x09,0x00,0x82,0x2C, -0x25,0x00,0x40,0x10, -0x02,0x80,0x10,0x3C, -0xF4,0x5E,0x02,0x92, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x21,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0xB6,0x60,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xF4,0x5E,0x02,0x92, -0x00,0x00,0x00,0x00, -0x34,0x00,0x40,0x10, -0x02,0x80,0x03,0x3C, -0xE0,0x3A,0x62,0x94, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x51,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x15,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x11,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x15,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x15,0x5F,0x62,0xA0, -0x02,0x80,0x03,0x3C, -0xF6,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x04,0x00,0x42,0x28, -0x06,0x00,0x40,0x10, -0x04,0x00,0x04,0x24, -0x64,0x31,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x40,0x41,0x00,0x08, -0x00,0x00,0x00,0x00, -0x04,0x00,0x12,0x24, -0x00,0x60,0x91,0x40, -0x21,0x10,0x40,0x02, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x0B,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x40,0x14, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x03,0x3C, -0x01,0x00,0x02,0x24, -0x10,0x5F,0x62,0xA0, -0x10,0x5F,0x63,0x90, -0x02,0x80,0x02,0x3C, -0x11,0x5F,0x43,0xA0, -0x00,0x00,0xC4,0x90, -0x18,0x41,0x00,0x08, -0xFF,0x00,0x84,0x30, -0x0D,0x5F,0xA0,0xA0, -0x00,0x00,0xC4,0x90, -0x15,0x41,0x00,0x08, -0xFF,0x00,0x83,0x30, -0x42,0xB0,0x06,0x3C, -0x00,0x00,0xC3,0x90, -0xEF,0xFF,0x02,0x24, -0x03,0x00,0xC7,0x34, -0x24,0x18,0x62,0x00, -0x40,0x00,0x02,0x24, -0x00,0x00,0xC3,0xA0, -0x0C,0x00,0x04,0x24, -0x00,0x00,0xE2,0xA0, -0x64,0x31,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x02,0x80,0x03,0x3C, -0xDE,0x5D,0x62,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x30, -0x15,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0x08,0x04,0x24, -0x00,0x02,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x2A,0x1C,0x43,0x90, -0x00,0x00,0x00,0x00, -0xCD,0xFF,0x60,0x10, -0x00,0x00,0x00,0x00, -0x50,0x39,0x44,0x94, -0x2A,0x1C,0x40,0xA0, -0x00,0xC0,0x84,0x24, -0xC2,0x34,0x00,0x0C, -0xFF,0xFF,0x84,0x30, -0x40,0x41,0x00,0x08, -0x00,0x00,0x00,0x00, -0x15,0x5F,0x40,0xA0, -0x40,0x41,0x00,0x08, -0x00,0x00,0x00,0x00, -0x9B,0x30,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x6B,0x41,0x00,0x08, -0x00,0x08,0x04,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x11,0x3C, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x30,0x26, -0xB0,0x1B,0x07,0x96, -0x18,0x00,0xBF,0xAF, -0xFF,0xFF,0xE3,0x30, -0x00,0x01,0x62,0x30, -0x0E,0x00,0x40,0x10, -0x01,0x00,0x66,0x30, -0x02,0x80,0x04,0x3C, -0x88,0x58,0x84,0x24, -0x03,0x00,0x05,0x24, -0x17,0x00,0xC0,0x14, -0x04,0x00,0x62,0x30, -0x02,0x00,0x40,0x10, -0xFB,0xF6,0xE3,0x30, -0xB0,0x1B,0x03,0xA6, -0xA3,0x51,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x4C,0x00,0x42,0x34, -0x00,0x00,0x40,0xA0, -0x21,0x20,0x00,0x00, -0x12,0x0D,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x30,0x1F,0x23,0x26, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x20,0x00,0xBD,0x27, -0x10,0x3E,0x60,0xAC, -0xEC,0x38,0x60,0xAC, -0x08,0x39,0x60,0xAC, -0x08,0x00,0xE0,0x03, -0x50,0x3E,0x60,0xAC, -0x6C,0x4C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xB0,0x1B,0x02,0x96, -0x00,0x00,0x00,0x00, -0xFE,0xFE,0x42,0x30, -0xA3,0x51,0x00,0x0C, -0xB0,0x1B,0x02,0xA6, -0x25,0xB0,0x02,0x3C, -0x4C,0x00,0x42,0x34, -0x00,0x00,0x40,0xA0, -0x9D,0x41,0x00,0x08, -0x21,0x20,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x01,0x00,0x83,0x90, -0x02,0x80,0x02,0x3C, -0x21,0x38,0x80,0x00, -0xB0,0x5C,0x43,0xAC, -0x01,0x00,0x84,0x90, -0x00,0x00,0xE2,0x90, -0x02,0x80,0x06,0x3C, -0xFF,0x00,0x85,0x30, -0x80,0x10,0x02,0x00, -0x25,0x28,0xA2,0x00, -0xE8,0xDD,0xC6,0x24, -0xFF,0x00,0x84,0x30, -0x00,0x80,0xA5,0x34, -0x4E,0x23,0x00,0x0C, -0x03,0x00,0xE7,0x24, -0x10,0x00,0xBF,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x03,0x3C, -0x1C,0x00,0xBF,0xAF, -0xE0,0x3A,0x62,0x94, -0x00,0x00,0x00,0x00, -0x01,0x00,0x43,0x30, -0x00,0x01,0x42,0x30, -0x04,0x00,0x40,0x10, -0x21,0x80,0x80,0x00, -0x02,0x80,0x04,0x3C, -0x06,0x00,0x60,0x14, -0xE0,0xD7,0x84,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x06,0x00,0x07,0x92, -0x07,0x00,0x02,0x26, -0x21,0x20,0x00,0x02, -0x80,0x38,0x07,0x00, -0x00,0x80,0xE7,0x34, -0x05,0x00,0x05,0x24, -0x21,0x30,0x00,0x00, -0x1E,0x51,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x30,0x1F,0x45,0x24, -0x50,0x3E,0xA3,0x8C, -0x00,0x00,0x00,0x00, -0x06,0x00,0x60,0x14, -0x21,0x80,0x80,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x4C,0x3E,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x21,0x10,0x45,0x00, -0x44,0x3E,0x40,0xA0, -0x00,0x00,0x84,0x8C, -0x6D,0x1D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x06,0x8E, -0x03,0x00,0x04,0x24, -0x90,0x14,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x00,0x00,0x84,0x90, -0x4F,0x0C,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x86,0x90, -0x21,0x80,0x80,0x00, -0x00,0x7F,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x08,0x0E,0x04,0x24, -0x00,0x00,0x05,0x92, -0x7F,0x7F,0x11,0x3C, -0x00,0x0E,0x04,0x24, -0x00,0x14,0x05,0x00, -0x00,0x86,0x05,0x00, -0x00,0x1A,0x05,0x00, -0x25,0x80,0x02,0x02, -0x25,0x80,0x03,0x02, -0x25,0x80,0x05,0x02, -0x21,0x30,0x00,0x02, -0xA9,0x45,0x00,0x0C, -0x7F,0x7F,0x25,0x36, -0x7F,0x7F,0x25,0x36, -0x21,0x30,0x00,0x02, -0xA9,0x45,0x00,0x0C, -0x04,0x0E,0x04,0x24, -0x7F,0x7F,0x25,0x36, -0x21,0x30,0x00,0x02, -0xA9,0x45,0x00,0x0C, -0x10,0x0E,0x04,0x24, -0x7F,0x7F,0x25,0x36, -0x21,0x30,0x00,0x02, -0xA9,0x45,0x00,0x0C, -0x14,0x0E,0x04,0x24, -0x7F,0x7F,0x25,0x36, -0x21,0x30,0x00,0x02, -0xA9,0x45,0x00,0x0C, -0x18,0x0E,0x04,0x24, -0x7F,0x7F,0x25,0x36, -0x21,0x30,0x00,0x02, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x1C,0x0E,0x04,0x24, -0xA9,0x45,0x00,0x08, -0x20,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x28,0x00,0xBF,0xAF, -0x00,0x00,0x85,0x94, -0x02,0x00,0x02,0x24, -0x21,0x98,0x80,0x00, -0x10,0x00,0xA0,0xA3, -0x21,0x80,0x00,0x00, -0x21,0x30,0x00,0x00, -0x21,0x88,0x00,0x00, -0x66,0x00,0xA2,0x10, -0x10,0x00,0xB2,0x27, -0x03,0x00,0xA2,0x28, -0x26,0x00,0x40,0x14, -0x01,0x00,0x02,0x24, -0x03,0x00,0x02,0x24, -0x75,0x00,0xA2,0x10, -0x24,0x08,0x04,0x24, -0x0C,0x09,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x04,0x08,0x04,0x24, -0x21,0x30,0x00,0x02, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x05,0x24, -0x02,0x00,0x64,0x96, -0x02,0x00,0x02,0x24, -0x35,0x00,0x82,0x10, -0x03,0x00,0x82,0x28, -0x4B,0x00,0x40,0x10, -0x03,0x00,0x02,0x24, -0x01,0x00,0x02,0x24, -0x60,0x00,0x82,0x10, -0x21,0x30,0x20,0x02, -0x04,0x0C,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x05,0x24, -0x21,0x30,0x20,0x02, -0x04,0x0D,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x05,0x24, -0x10,0x00,0xA6,0x93, -0x04,0x0A,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x00,0xFF,0x05,0x3C, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xDE,0xFF,0xA2,0x14, -0x0C,0x09,0x04,0x24, -0x24,0x08,0x04,0x24, -0x0E,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x2C,0x08,0x04,0x24, -0x01,0x00,0x06,0x24, -0xA9,0x45,0x00,0x0C, -0x0E,0x00,0x05,0x24, -0x10,0x00,0xA2,0x93, -0x80,0xFF,0x03,0x24, -0x11,0x11,0x04,0x3C, -0x0F,0x00,0x42,0x30, -0x25,0x10,0x43,0x00, -0x11,0x11,0x86,0x34, -0x03,0x00,0x10,0x24, -0x10,0x00,0xA2,0xA3, -0x0C,0x09,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x04,0x08,0x04,0x24, -0x21,0x30,0x00,0x02, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x05,0x24, -0x02,0x00,0x64,0x96, -0x02,0x00,0x02,0x24, -0xCD,0xFF,0x82,0x14, -0x03,0x00,0x82,0x28, -0x00,0x00,0x42,0x92, -0x02,0x00,0x11,0x24, -0xF5,0x00,0x42,0x30, -0x05,0x00,0x42,0x34, -0x00,0x00,0x42,0xA2, -0x21,0x30,0x20,0x02, -0x04,0x0C,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x05,0x24, -0x21,0x30,0x20,0x02, -0x04,0x0D,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x05,0x24, -0x10,0x00,0xA6,0x93, -0x04,0x0A,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x00,0xFF,0x05,0x3C, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xB8,0xFF,0x82,0x14, -0x21,0x30,0x20,0x02, -0x00,0x00,0x42,0x92, -0x03,0x00,0x11,0x24, -0xF0,0x00,0x42,0x30, -0x01,0x00,0x42,0x34, -0xD4,0x42,0x00,0x08, -0x00,0x00,0x42,0xA2, -0x24,0x08,0x04,0x24, -0x0E,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x02,0x00,0x06,0x24, -0x2C,0x08,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x0E,0x00,0x05,0x24, -0x10,0x00,0xA2,0x93, -0x22,0x22,0x03,0x3C, -0x22,0x22,0x66,0x34, -0x0F,0x00,0x42,0x30, -0x40,0x00,0x42,0x34, -0x03,0x00,0x10,0x24, -0xC4,0x42,0x00,0x08, -0x10,0x00,0xA2,0xA3, -0x00,0x00,0x42,0x92, -0x01,0x00,0x11,0x24, -0xF0,0x00,0x42,0x30, -0xD4,0x42,0x00,0x08, -0x00,0x00,0x42,0xA2, -0x0E,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x02,0x00,0x06,0x24, -0x2C,0x08,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x0E,0x00,0x05,0x24, -0x10,0x00,0xA2,0x93, -0xC0,0xFF,0x03,0x24, -0x03,0x00,0x10,0x24, -0x0F,0x00,0x42,0x30, -0x25,0x10,0x43,0x00, -0x32,0x03,0x03,0x3C, -0x33,0x13,0x66,0x34, -0x90,0x42,0x00,0x08, -0x10,0x00,0xA2,0xA3, -0x00,0x00,0x86,0x8C, -0x00,0x0F,0x05,0x3C, -0xA9,0x45,0x00,0x08, -0x80,0x08,0x04,0x24, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x02,0x80,0x04,0x3C, -0x14,0x00,0xBF,0xAF, -0x2F,0x55,0x00,0x0C, -0xF0,0xD7,0x84,0x24, -0x00,0x00,0x02,0x92, -0x00,0x0D,0x04,0x24, -0x00,0x10,0x05,0x3C, -0x21,0x00,0x40,0x10, -0x21,0x30,0x00,0x00, -0x00,0x08,0x04,0x24, -0xCB,0x45,0x00,0x0C, -0x00,0x02,0x05,0x3C, -0x00,0x08,0x04,0x24, -0x00,0x02,0x05,0x3C, -0x32,0x00,0x40,0x10, -0x01,0x00,0x06,0x24, -0x00,0x0A,0x04,0x24, -0x03,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x08,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x10,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x20,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x40,0x05,0x3C, -0x21,0x30,0x00,0x00, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x20,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x40,0x05,0x3C, -0x21,0x30,0x00,0x00, -0xA9,0x45,0x00,0x0C, -0x00,0x0D,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x10,0x27,0x04,0x24, -0x00,0x0F,0x04,0x24, -0x00,0x01,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0F,0x04,0x24, -0x00,0x01,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x03,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x08,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x10,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x20,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x40,0x05,0x3C, -0x3E,0x43,0x00,0x08, -0x21,0x30,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x02,0x80,0x04,0x3C, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x1C,0x00,0xBF,0xAF, -0x2F,0x55,0x00,0x0C, -0x08,0xD8,0x84,0x24, -0x00,0x00,0x02,0x92, -0x0F,0x00,0x12,0x3C, -0x0F,0x00,0x11,0x3C, -0x00,0x08,0x04,0x24, -0x00,0x01,0x05,0x3C, -0x20,0x00,0x40,0x10, -0x21,0x30,0x00,0x00, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x02,0x05,0x3C, -0x21,0x30,0x00,0x00, -0xA9,0x45,0x00,0x0C, -0x00,0x08,0x04,0x24, -0x01,0x00,0x04,0x92, -0xE6,0x44,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x06,0x3C, -0xFF,0xFF,0x45,0x36, -0x00,0x40,0xC6,0x34, -0x5F,0x47,0x00,0x0C, -0x21,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x02,0x00,0x06,0x3C, -0xFF,0xFF,0x45,0x36, -0x1F,0x00,0xC6,0x34, -0x5F,0x47,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x02,0x05,0x3C, -0x01,0x00,0x06,0x24, -0xA9,0x45,0x00,0x0C, -0x00,0x08,0x04,0x24, -0x01,0x00,0x04,0x92, -0xE6,0x44,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x05,0x00,0x06,0x3C, -0xFF,0xFF,0x25,0x36, -0x00,0x40,0xC6,0x34, -0x5F,0x47,0x00,0x0C, -0x21,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xFF,0xFF,0x25,0x36, -0x21,0x20,0x00,0x00, -0x5F,0x47,0x00,0x0C, -0x03,0x00,0x06,0x3C, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x02,0x80,0x04,0x3C, -0x14,0x00,0xBF,0xAF, -0x2F,0x55,0x00,0x0C, -0x20,0xD8,0x84,0x24, -0x00,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x40,0x10, -0x00,0x0A,0x04,0x24, -0x04,0x00,0x02,0x8E, -0x00,0x08,0x04,0x24, -0x04,0x00,0x42,0x2C, -0x1C,0x00,0x40,0x14, -0x00,0x01,0x05,0x3C, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x04,0x00,0x02,0x8E, -0x03,0x00,0x05,0x24, -0x04,0x00,0x42,0x2C, -0xF8,0xFF,0x40,0x10, -0x21,0x30,0x00,0x00, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x08,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0F,0x04,0x24, -0x00,0x01,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0F,0x04,0x24, -0x00,0x01,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xCB,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x08,0x04,0x24, -0x00,0x01,0x05,0x3C, -0x1B,0x00,0x40,0x10, -0x01,0x00,0x06,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x10,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x20,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x40,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x03,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x00,0x0A,0x04,0x24, -0x08,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x00,0x30,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0xE4,0x43,0x00,0x08, -0x00,0x00,0x00,0x00, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xEF,0x43,0x00,0x08, -0x00,0x0D,0x04,0x24, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x02,0x80,0x04,0x3C, -0x14,0x00,0xBF,0xAF, -0x2F,0x55,0x00,0x0C, -0x40,0xD8,0x84,0x24, -0x04,0x00,0x03,0x8E, -0x00,0x00,0x00,0x00, -0x04,0x00,0x62,0x2C, -0x2C,0x00,0x40,0x14, -0xFC,0xFF,0x62,0x24, -0x18,0x00,0x42,0x2C, -0x05,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x6C,0xD8,0x84,0x24, -0x00,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0x54,0x00,0x40,0x10, -0x00,0x0D,0x04,0x24, -0x00,0x08,0x04,0x24, -0xCB,0x45,0x00,0x0C, -0x00,0x02,0x05,0x3C, -0x63,0x00,0x40,0x10, -0x00,0x08,0x04,0x24, -0x00,0x0A,0x04,0x24, -0x03,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x08,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x10,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x20,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x40,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x58,0xD8,0x84,0x24, -0x00,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0x21,0x00,0x40,0x10, -0x00,0x0A,0x04,0x24, -0x00,0x08,0x04,0x24, -0xCB,0x45,0x00,0x0C, -0x00,0x01,0x05,0x3C, -0x3A,0x00,0x40,0x10, -0x00,0x08,0x04,0x24, -0x00,0x0D,0x04,0x24, -0x00,0x10,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x20,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x40,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x04,0x00,0x06,0x8E, -0x00,0x0A,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0x00,0x30,0x05,0x24, -0x00,0x0A,0x04,0x24, -0x03,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x00,0x0A,0x04,0x24, -0x08,0x00,0x05,0x24, -0x01,0x00,0x06,0x24, -0xA9,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x3F,0x44,0x00,0x08, -0x00,0x00,0x00,0x00, -0x03,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0A,0x04,0x24, -0x08,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0F,0x04,0x24, -0x00,0x01,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0F,0x04,0x24, -0x00,0x01,0x05,0x24, -0x66,0x44,0x00,0x08, -0x01,0x00,0x06,0x24, -0x00,0x10,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x20,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x40,0x05,0x3C, -0x21,0x30,0x00,0x00, -0xA9,0x45,0x00,0x0C, -0x00,0x0D,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x10,0x27,0x04,0x24, -0x72,0x44,0x00,0x08, -0x00,0x0F,0x04,0x24, -0x00,0x01,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x50,0x44,0x00,0x08, -0x00,0x0D,0x04,0x24, -0x00,0x02,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x2C,0x44,0x00,0x08, -0x00,0x0A,0x04,0x24, -0xE8,0xFF,0xBD,0x27, -0x25,0xB0,0x02,0x3C, -0x14,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x03,0x02,0x42,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x90,0x90, -0x25,0xB0,0x02,0x3C, -0xFF,0x00,0x63,0x30, -0xFB,0x00,0x65,0x30, -0x00,0x00,0x04,0x3A, -0x04,0x00,0x63,0x34, -0x0B,0x18,0xA4,0x00, -0x03,0x02,0x42,0x34, -0x00,0x00,0x43,0xA0, -0x12,0x00,0x00,0x12, -0x01,0x00,0x02,0x24, -0x22,0x00,0x02,0x12, -0x00,0x08,0x04,0x24, -0x1A,0x00,0x00,0x12, -0x01,0x00,0x02,0x24, -0x08,0x00,0x02,0x16, -0x00,0x00,0x00,0x00, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x18,0x00,0x04,0x24, -0x00,0x0C,0x05,0x24, -0x21,0x30,0x00,0x00, -0x5F,0x47,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x00,0x08,0x04,0x24, -0x01,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x09,0x04,0x24, -0x01,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x84,0x08,0x04,0x24, -0xFF,0xFF,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x58,0x00,0x06,0x24, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x18,0x00,0x04,0x24, -0x00,0x0C,0x05,0x24, -0xAE,0x44,0x00,0x08, -0x01,0x00,0x06,0x24, -0x01,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x09,0x04,0x24, -0x01,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x0A,0x04,0x24, -0x10,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x0D,0x04,0x24, -0x00,0x0C,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x84,0x08,0x04,0x24, -0xFF,0xFF,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x18,0x00,0x06,0x24, -0xA5,0x44,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x21,0x20,0x82,0x00, -0x00,0x00,0x85,0xAC, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x05,0x3C, -0x01,0x80,0x03,0x3C, -0x21,0x38,0x80,0x00, -0x18,0x03,0xA2,0x34, -0x98,0x13,0x63,0x24, -0x01,0x00,0x04,0x24, -0x00,0x00,0x43,0xAC, -0x35,0x00,0xE4,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x10, -0x20,0x08,0xA2,0x34, -0x02,0x00,0x02,0x24, -0x83,0x00,0xE2,0x10, -0x03,0x00,0x02,0x24, -0x5A,0x00,0xE2,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x00,0x00,0x44,0x8C, -0x30,0x1F,0x66,0x24, -0x70,0x08,0x02,0x24, -0xE0,0x08,0x03,0x24, -0x34,0x1C,0xC2,0xAC, -0x40,0x08,0x02,0x24, -0x38,0x1C,0xC3,0xAC, -0x44,0x1C,0xC2,0xAC, -0x78,0x08,0x03,0x24, -0x0C,0x08,0x02,0x24, -0x48,0x1C,0xC3,0xAC, -0x4C,0x1C,0xC2,0xAC, -0x10,0x08,0x03,0x24, -0x20,0x08,0x02,0x24, -0x50,0x1C,0xC3,0xAC, -0x54,0x1C,0xC2,0xAC, -0x24,0x08,0x03,0x24, -0x58,0x08,0x02,0x24, -0x58,0x1C,0xC3,0xAC, -0x5C,0x1C,0xC2,0xAC, -0x50,0x0C,0x03,0x24, -0x54,0x0C,0x02,0x24, -0x60,0x1C,0xC3,0xAC, -0x64,0x1C,0xC2,0xAC, -0x14,0x0C,0x03,0x24, -0x10,0x0C,0x02,0x24, -0x60,0x08,0x05,0x24, -0x68,0x1C,0xC3,0xAC, -0x6C,0x1C,0xC2,0xAC, -0x80,0x0C,0x03,0x24, -0x84,0x0C,0x02,0x24, -0x00,0x01,0x84,0x30, -0x74,0x1C,0xC2,0xAC, -0x40,0x1C,0xC5,0xAC, -0x70,0x1C,0xC3,0xAC, -0x31,0x1C,0xC0,0xA0, -0x3C,0x1C,0xC5,0xAC, -0x02,0x00,0x80,0x10, -0xA0,0x08,0x02,0x24, -0xB8,0x08,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x78,0x1C,0xC2,0xAC, -0x28,0x08,0xA2,0x34, -0x02,0x80,0x03,0x3C, -0x00,0x00,0x44,0x8C, -0x30,0x1F,0x66,0x24, -0x70,0x08,0x02,0x24, -0xE0,0x08,0x03,0x24, -0x34,0x1C,0xC2,0xAC, -0x44,0x08,0x02,0x24, -0x38,0x1C,0xC3,0xAC, -0x44,0x1C,0xC2,0xAC, -0x78,0x08,0x03,0x24, -0x0C,0x08,0x02,0x24, -0x48,0x1C,0xC3,0xAC, -0x4C,0x1C,0xC2,0xAC, -0x14,0x08,0x03,0x24, -0x28,0x08,0x02,0x24, -0x50,0x1C,0xC3,0xAC, -0x54,0x1C,0xC2,0xAC, -0x2C,0x08,0x03,0x24, -0x58,0x08,0x02,0x24, -0x58,0x1C,0xC3,0xAC, -0x5C,0x1C,0xC2,0xAC, -0x58,0x0C,0x03,0x24, -0x5C,0x0C,0x02,0x24, -0x60,0x1C,0xC3,0xAC, -0x64,0x1C,0xC2,0xAC, -0x1C,0x0C,0x03,0x24, -0x18,0x0C,0x02,0x24, -0x64,0x08,0x05,0x24, -0x68,0x1C,0xC3,0xAC, -0x6C,0x1C,0xC2,0xAC, -0x88,0x0C,0x03,0x24, -0x8C,0x0C,0x02,0x24, -0x00,0x01,0x84,0x30, -0x74,0x1C,0xC2,0xAC, -0x31,0x1C,0xC7,0xA0, -0x40,0x1C,0xC5,0xAC, -0x70,0x1C,0xC3,0xAC, -0x3C,0x1C,0xC5,0xAC, -0xD6,0xFF,0x80,0x10, -0xA4,0x08,0x02,0x24, -0xBC,0x08,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x78,0x1C,0xC2,0xAC, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0xAC,0x08,0x03,0x24, -0x78,0x1C,0x43,0xAC, -0x74,0x08,0x03,0x24, -0xE4,0x08,0x04,0x24, -0x34,0x1C,0x43,0xAC, -0x4C,0x08,0x03,0x24, -0x38,0x1C,0x44,0xAC, -0x44,0x1C,0x43,0xAC, -0x7C,0x08,0x04,0x24, -0x0C,0x08,0x03,0x24, -0x48,0x1C,0x44,0xAC, -0x4C,0x1C,0x43,0xAC, -0x1C,0x08,0x04,0x24, -0x38,0x08,0x03,0x24, -0x50,0x1C,0x44,0xAC, -0x54,0x1C,0x43,0xAC, -0x3C,0x08,0x04,0x24, -0x5C,0x08,0x03,0x24, -0x58,0x1C,0x44,0xAC, -0x5C,0x1C,0x43,0xAC, -0x68,0x0C,0x04,0x24, -0x6C,0x0C,0x03,0x24, -0x60,0x1C,0x44,0xAC, -0x64,0x1C,0x43,0xAC, -0x2C,0x0C,0x04,0x24, -0x28,0x0C,0x03,0x24, -0x6C,0x08,0x05,0x24, -0x68,0x1C,0x44,0xAC, -0x6C,0x1C,0x43,0xAC, -0x98,0x0C,0x04,0x24, -0x9C,0x0C,0x03,0x24, -0x31,0x1C,0x47,0xA0, -0x40,0x1C,0x45,0xAC, -0x70,0x1C,0x44,0xAC, -0x74,0x1C,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x3C,0x1C,0x45,0xAC, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0xA8,0x08,0x03,0x24, -0x78,0x1C,0x43,0xAC, -0x74,0x08,0x03,0x24, -0xE4,0x08,0x04,0x24, -0x34,0x1C,0x43,0xAC, -0x48,0x08,0x03,0x24, -0x38,0x1C,0x44,0xAC, -0x44,0x1C,0x43,0xAC, -0x7C,0x08,0x04,0x24, -0x0C,0x08,0x03,0x24, -0x48,0x1C,0x44,0xAC, -0x4C,0x1C,0x43,0xAC, -0x18,0x08,0x04,0x24, -0x30,0x08,0x03,0x24, -0x50,0x1C,0x44,0xAC, -0x54,0x1C,0x43,0xAC, -0x34,0x08,0x04,0x24, -0x5C,0x08,0x03,0x24, -0x58,0x1C,0x44,0xAC, -0x5C,0x1C,0x43,0xAC, -0x60,0x0C,0x04,0x24, -0x64,0x0C,0x03,0x24, -0x60,0x1C,0x44,0xAC, -0x64,0x1C,0x43,0xAC, -0x24,0x0C,0x04,0x24, -0x20,0x0C,0x03,0x24, -0x68,0x08,0x05,0x24, -0x68,0x1C,0x44,0xAC, -0x6C,0x1C,0x43,0xAC, -0x90,0x0C,0x04,0x24, -0x94,0x0C,0x03,0x24, -0x31,0x1C,0x47,0xA0, -0x40,0x1C,0x45,0xAC, -0x70,0x1C,0x44,0xAC, -0x74,0x1C,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x3C,0x1C,0x45,0xAC, -0xA2,0x45,0x00,0x08, -0x21,0x18,0x00,0x00, -0x20,0x00,0x62,0x2C, -0x06,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x06,0x10,0x64,0x00, -0x01,0x00,0x42,0x30, -0xFA,0xFF,0x40,0x10, -0x01,0x00,0x63,0x24, -0xFF,0xFF,0x63,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0xD8,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x25,0xB0,0x02,0x3C, -0x21,0x88,0xA0,0x00, -0xFF,0xFF,0x03,0x24, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x20,0x00,0xBF,0xAF, -0x21,0x98,0xC0,0x00, -0x21,0x28,0xC0,0x00, -0x21,0x90,0x80,0x00, -0x09,0x00,0x23,0x12, -0x21,0x80,0x82,0x00, -0x00,0x00,0x10,0x8E, -0x9D,0x45,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x27,0x28,0x11,0x00, -0x24,0x28,0xB0,0x00, -0x04,0x10,0x53,0x00, -0x25,0x28,0xA2,0x00, -0x21,0x20,0x40,0x02, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xDB,0x44,0x00,0x08, -0x28,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x21,0x30,0x80,0x00, -0x74,0x3B,0x44,0x8C, -0xA9,0x45,0x00,0x08, -0xFF,0xFF,0x05,0x24, -0xE0,0xFF,0xBD,0x27, -0x25,0xB0,0x02,0x3C, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x20,0x82,0x00, -0x00,0x00,0x90,0x8C, -0x21,0x88,0xA0,0x00, -0x9D,0x45,0x00,0x0C, -0x21,0x20,0xA0,0x00, -0x24,0x80,0x11,0x02, -0x06,0x10,0x50,0x00, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x11,0x3C, -0x20,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x1C,0x00,0xB3,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x31,0x26, -0x58,0x1C,0x23,0x8E, -0x25,0xB0,0x02,0x3C, -0x24,0x08,0x53,0x8C, -0x21,0x18,0x62,0x00, -0x00,0x00,0x70,0x8C, -0x7F,0x80,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xFF,0x7F,0x05,0x3C, -0x24,0x80,0x02,0x02, -0xC0,0x25,0x04,0x00, -0xFF,0xFF,0xA5,0x34, -0x24,0x28,0x65,0x02, -0x25,0x80,0x04,0x02, -0xDB,0x44,0x00,0x0C, -0x24,0x08,0x04,0x24, -0x25,0x22,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x00,0x80,0x12,0x3C, -0x58,0x1C,0x24,0x8E, -0x25,0x80,0x12,0x02, -0xDB,0x44,0x00,0x0C, -0x21,0x28,0x00,0x02, -0x25,0x22,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x25,0x28,0x72,0x02, -0xDB,0x44,0x00,0x0C, -0x24,0x08,0x04,0x24, -0x25,0x22,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x78,0x1C,0x24,0x8E, -0x0F,0x00,0x05,0x3C, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xFF,0xFF,0xA5,0x34, -0xCB,0x45,0x00,0x08, -0x28,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x11,0x3C, -0x10,0x00,0xB0,0xAF, -0x18,0x00,0xBF,0xAF, -0x30,0x1F,0x27,0x26, -0x33,0x1C,0xE5,0x90, -0x01,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x2C,0x18,0x63,0x24, -0x18,0x03,0x42,0x34, -0x02,0x00,0x06,0x24, -0x00,0x00,0x43,0xAC, -0x34,0x00,0xA6,0x10, -0x21,0x80,0x80,0x00, -0x03,0x00,0x03,0x24, -0x3A,0x00,0xA3,0x10, -0x2E,0x00,0x02,0x2E, -0x10,0x00,0x02,0x2E, -0x07,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x04,0x32, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xDC,0x45,0x00,0x08, -0x20,0x00,0xBD,0x27, -0xFA,0xFF,0xA6,0x14, -0xFF,0x00,0x04,0x32, -0x31,0x1C,0xE4,0x90, -0x01,0x00,0x02,0x24, -0x33,0x00,0x82,0x10, -0x02,0x00,0x82,0x28, -0x38,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x38,0x00,0x85,0x10, -0x30,0x1F,0x22,0x26, -0x2E,0x00,0x83,0x10, -0x00,0x00,0x00,0x00, -0x00,0x08,0x04,0x24, -0xCB,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0xFF,0xFC,0x06,0x3C, -0xFF,0xFF,0xC6,0x34, -0x24,0x30,0x46,0x00, -0x00,0x08,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x30,0x1F,0x22,0x26, -0x31,0x1C,0x44,0x90, -0x01,0x00,0x03,0x24, -0x07,0x00,0x83,0x10, -0x02,0x00,0x82,0x28, -0x2C,0x00,0x40,0x14, -0x02,0x00,0x02,0x24, -0x2C,0x00,0x82,0x10, -0x03,0x00,0x02,0x24, -0xDB,0xFF,0x82,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x21,0x46,0x00,0x08, -0xFF,0x00,0x04,0x32, -0x25,0x00,0x82,0x2C, -0xCC,0xFF,0x40,0x14, -0x03,0x00,0x03,0x24, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xC7,0xFF,0x40,0x14, -0x10,0x00,0x02,0x2E, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x06,0x24, -0x33,0x46,0x00,0x08, -0x00,0x08,0x04,0x24, -0xCC,0xFF,0x80,0x14, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x06,0x24, -0x33,0x46,0x00,0x08, -0x00,0x08,0x04,0x24, -0xB2,0xFF,0x80,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x21,0x46,0x00,0x08, -0xFF,0x00,0x04,0x32, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x02,0x80,0x11,0x3C, -0x30,0x1F,0x28,0x26, -0x33,0x1C,0x06,0x91, -0x01,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0xD8,0x19,0x63,0x24, -0x18,0x03,0x42,0x34, -0x02,0x00,0x07,0x24, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x1C,0x00,0xBF,0xAF, -0x00,0x00,0x43,0xAC, -0x21,0x90,0xA0,0x00, -0x39,0x00,0xC7,0x10, -0xFF,0x00,0x90,0x30, -0x03,0x00,0x03,0x24, -0x3F,0x00,0xC3,0x10, -0x2E,0x00,0x02,0x2E, -0x10,0x00,0x02,0x2E, -0x0C,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x04,0x3C, -0xFF,0xFF,0x84,0x34, -0x24,0x20,0x44,0x02, -0x00,0x15,0x10,0x00, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x25,0x20,0x44,0x00, -0xC6,0x45,0x00,0x08, -0x20,0x00,0xBD,0x27, -0xF5,0xFF,0xC7,0x14, -0x0F,0x00,0x04,0x3C, -0x31,0x1C,0x04,0x91, -0x01,0x00,0x02,0x24, -0x33,0x00,0x82,0x10, -0x02,0x00,0x82,0x28, -0x38,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x38,0x00,0x86,0x10, -0x30,0x1F,0x22,0x26, -0x2E,0x00,0x83,0x10, -0x00,0x00,0x00,0x00, -0x00,0x08,0x04,0x24, -0xCB,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0xFF,0xFC,0x06,0x3C, -0xFF,0xFF,0xC6,0x34, -0x24,0x30,0x46,0x00, -0x00,0x08,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x30,0x1F,0x22,0x26, -0x31,0x1C,0x44,0x90, -0x01,0x00,0x03,0x24, -0x07,0x00,0x83,0x10, -0x02,0x00,0x82,0x28, -0x2C,0x00,0x40,0x14, -0x02,0x00,0x02,0x24, -0x2C,0x00,0x82,0x10, -0x03,0x00,0x02,0x24, -0xD6,0xFF,0x82,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x8E,0x46,0x00,0x08, -0x0F,0x00,0x04,0x3C, -0x25,0x00,0x02,0x2E, -0xC7,0xFF,0x40,0x14, -0x03,0x00,0x03,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xC1,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x06,0x24, -0xA5,0x46,0x00,0x08, -0x00,0x08,0x04,0x24, -0xCC,0xFF,0x80,0x14, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x0F,0x00,0x06,0x24, -0xA5,0x46,0x00,0x08, -0x00,0x08,0x04,0x24, -0xAD,0xFF,0x80,0x14, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x22,0x26, -0x34,0x1C,0x44,0x8C, -0x0F,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x8E,0x46,0x00,0x08, -0x0F,0x00,0x04,0x3C, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x14,0x00,0xBF,0xAF, -0xDC,0x45,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x40,0x01,0x44,0x34, -0x21,0x18,0x40,0x00, -0x1F,0x00,0x02,0x2E, -0x00,0x23,0x04,0x00, -0x10,0x00,0x40,0x10, -0x10,0x00,0x05,0x2E, -0x00,0x01,0x64,0x34, -0x06,0x00,0xA0,0x10, -0x00,0x23,0x04,0x00, -0x21,0x10,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xC6,0x45,0x00,0x0C, -0xF1,0xFF,0x10,0x26, -0x21,0x10,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xC6,0x45,0x00,0x0C, -0xE2,0xFF,0x10,0x26, -0x21,0x10,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x25,0xB0,0x02,0x3C, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x20,0x82,0x00, -0x00,0x00,0x90,0x8C, -0x21,0x88,0xA0,0x00, -0x9D,0x45,0x00,0x0C, -0x21,0x20,0xA0,0x00, -0x24,0x80,0x11,0x02, -0x06,0x10,0x50,0x00, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x25,0xB0,0x02,0x3C, -0x18,0x00,0xB2,0xAF, -0x21,0x90,0x82,0x00, -0xFF,0xFF,0x02,0x24, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x20,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x88,0xA0,0x00, -0x21,0x20,0xA0,0x00, -0x21,0x18,0x40,0x02, -0x10,0x00,0xA2,0x10, -0x21,0x98,0xC0,0x00, -0x00,0x00,0x50,0x8E, -0x9D,0x45,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x27,0x18,0x11,0x00, -0x24,0x18,0x70,0x00, -0x04,0x10,0x53,0x00, -0x25,0x18,0x62,0x00, -0x00,0x00,0x43,0xAE, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x28,0x00,0xBD,0x27, -0x00,0x00,0x66,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x21,0x38,0x82,0x00, -0xFF,0xFF,0x02,0x24, -0x27,0x40,0x05,0x00, -0x08,0x00,0xA2,0x10, -0x24,0x18,0xC5,0x00, -0x00,0x00,0xE2,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x02,0x01, -0x25,0x10,0x43,0x00, -0x00,0x00,0xE2,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0xE6,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x21,0x38,0xA0,0x00, -0x25,0xB0,0x02,0x3C, -0xFF,0xFF,0x03,0x24, -0x27,0x48,0x05,0x00, -0x24,0x40,0xC7,0x00, -0x21,0x28,0xC0,0x00, -0x05,0x00,0xE3,0x10, -0x21,0x30,0x82,0x00, -0x00,0x00,0xC5,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x28,0x25,0x01, -0x25,0x28,0xA8,0x00, -0xDB,0x44,0x00,0x08, -0x00,0x00,0x00,0x00, -0x01,0x80,0x02,0x3C, -0x25,0xB0,0x03,0x3C, -0xD8,0xFF,0xBD,0x27, -0x7C,0x1D,0x42,0x24, -0x18,0x03,0x63,0x34, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x24,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x62,0xAC, -0x21,0x88,0xA0,0x00, -0x21,0x98,0xC0,0x00, -0x21,0xA0,0x80,0x00, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x0F,0x00,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x0A,0x00,0x22,0x12, -0x21,0x28,0xC0,0x00, -0x0B,0x46,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0x20,0x20,0x02, -0x9D,0x45,0x00,0x0C, -0x21,0x80,0x40,0x00, -0x27,0x28,0x11,0x00, -0x24,0x28,0xB0,0x00, -0x04,0x10,0x53,0x00, -0x25,0x28,0xA2,0x00, -0x76,0x46,0x00,0x0C, -0xFF,0x00,0x84,0x32, -0x00,0x60,0x92,0x40, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x01,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x28,0x1E,0x63,0x24, -0x18,0x03,0x42,0x34, -0xE0,0xFF,0xBD,0x27, -0x00,0x00,0x43,0xAC, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x0B,0x46,0x00,0x0C, -0x21,0x88,0xA0,0x00, -0x21,0x80,0x40,0x00, -0x9D,0x45,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x24,0x80,0x11,0x02, -0x06,0x10,0x50,0x00, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x24,0x00,0xB5,0xAF, -0xFF,0x00,0x84,0x30, -0x21,0xA8,0xC0,0x00, -0x28,0x00,0xB6,0xAF, -0x1C,0x00,0xB3,0xAF, -0x2C,0x00,0xBF,0xAF, -0x20,0x00,0xB4,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0xB0,0xA0,0x00, -0xE6,0x44,0x00,0x0C, -0x21,0x98,0x00,0x00, -0x21,0x00,0xA0,0x16, -0x80,0x10,0x13,0x00, -0xDD,0x47,0x00,0x08, -0x00,0x00,0x00,0x00, -0xFD,0x00,0x02,0x24, -0x23,0x00,0x02,0x12, -0x05,0x00,0x04,0x24, -0xFC,0x00,0x02,0x24, -0x37,0x00,0x02,0x12, -0x00,0x00,0x00,0x00, -0xFB,0x00,0x02,0x24, -0x30,0x00,0x02,0x12, -0x32,0x00,0x04,0x24, -0xFA,0x00,0x02,0x24, -0x2D,0x00,0x02,0x12, -0x05,0x00,0x04,0x24, -0xF9,0x00,0x02,0x24, -0x29,0x00,0x02,0x12, -0x0F,0x00,0x05,0x3C, -0x04,0x00,0xD1,0x8C, -0xFF,0xFF,0xA5,0x34, -0x21,0x20,0x00,0x02, -0x5F,0x47,0x00,0x0C, -0x21,0x30,0x20,0x02, -0x25,0x22,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x19,0x00,0x02,0x24, -0x28,0x00,0x02,0x12, -0x21,0x90,0x00,0x00, -0x02,0x00,0x62,0x26, -0xFF,0x00,0x53,0x30, -0x2B,0x18,0x75,0x02, -0x0F,0x00,0x60,0x10, -0x80,0x10,0x13,0x00, -0x21,0x30,0x56,0x00, -0x00,0x00,0xD0,0x8C, -0xFF,0x00,0x02,0x24, -0x0A,0x00,0x02,0x12, -0xFE,0x00,0x02,0x24, -0xDC,0xFF,0x02,0x16, -0x32,0x00,0x04,0x24, -0x25,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x00,0x62,0x26, -0xFF,0x00,0x53,0x30, -0x2B,0x18,0x75,0x02, -0xF3,0xFF,0x60,0x14, -0x80,0x10,0x13,0x00, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x01,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xCB,0x47,0x00,0x08, -0x02,0x00,0x62,0x26, -0x25,0x22,0x00,0x0C, -0x01,0x00,0x04,0x24, -0xD9,0x47,0x00,0x08, -0x02,0x00,0x62,0x26, -0x0F,0x00,0x14,0x3C, -0x21,0x20,0x00,0x02, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x85,0x36, -0x21,0x20,0x00,0x02, -0xFF,0xFF,0x85,0x36, -0xD2,0xFF,0x51,0x10, -0x21,0x30,0x20,0x02, -0x5F,0x47,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x25,0x22,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x01,0x00,0x42,0x26, -0xFF,0x00,0x52,0x30, -0x0A,0x00,0x43,0x2E, -0xF2,0xFF,0x60,0x14, -0x21,0x20,0x00,0x02, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xB8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x44,0x00,0xBF,0xAF, -0x40,0x00,0xBE,0xAF, -0x3C,0x00,0xB7,0xAF, -0x38,0x00,0xB6,0xAF, -0x34,0x00,0xB5,0xAF, -0x30,0x00,0xB4,0xAF, -0x2C,0x00,0xB3,0xAF, -0x28,0x00,0xB2,0xAF, -0x24,0x00,0xB1,0xAF, -0x20,0x00,0xB0,0xAF, -0x30,0x1F,0x57,0x24, -0x64,0x37,0xE3,0x96, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x05,0x3C, -0x25,0xA0,0x62,0x00, -0xF0,0xDD,0xA5,0x24, -0x24,0x00,0x84,0x26, -0x06,0x00,0x06,0x24, -0x02,0x80,0x02,0x3C, -0x20,0x00,0x80,0xA6, -0x10,0x52,0x00,0x0C, -0x84,0x58,0x56,0x24, -0x02,0x80,0x05,0x3C, -0x18,0x3B,0xA5,0x24, -0x2A,0x00,0x84,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x88,0x58,0xA5,0x24, -0x06,0x00,0x06,0x24, -0x10,0x52,0x00,0x0C, -0x30,0x00,0x84,0x26, -0x20,0x00,0x83,0x96, -0x74,0x00,0xD0,0x26, -0x21,0x20,0x00,0x02, -0x03,0xFF,0x63,0x30, -0x80,0x00,0x63,0x34, -0x20,0x00,0x83,0xA6, -0x20,0x00,0x1E,0x24, -0x40,0x00,0x93,0x26, -0x17,0x4F,0x00,0x0C, -0x1C,0x00,0xBE,0xAF, -0x21,0x28,0x40,0x00, -0x21,0x20,0x60,0x02, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x1C,0x00,0xA2,0x8F, -0x21,0x20,0x00,0x02, -0x42,0x00,0x93,0x26, -0x02,0x00,0x42,0x24, -0x32,0x4F,0x00,0x0C, -0x1C,0x00,0xA2,0xAF, -0x21,0x28,0x40,0x00, -0x21,0x20,0x60,0x02, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x1C,0x00,0xA2,0x8F, -0x0C,0x00,0xC6,0x8E, -0x1C,0x00,0xB0,0x27, -0x21,0x28,0x00,0x00, -0x10,0x00,0xC7,0x26, -0x02,0x00,0x42,0x24, -0x44,0x00,0x84,0x26, -0x60,0x00,0xD1,0x26, -0x1C,0x00,0xA2,0xAF, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x21,0x20,0x20,0x02, -0x37,0x50,0x00,0x0C, -0x21,0x98,0x40,0x00, -0x09,0x00,0x52,0x2C, -0x08,0x00,0x06,0x24, -0x21,0x20,0x60,0x02, -0x0B,0x30,0x52,0x00, -0x21,0x38,0x20,0x02, -0x01,0x00,0x05,0x24, -0x21,0xA8,0x40,0x00, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x21,0x20,0x40,0x00, -0x03,0x00,0x05,0x24, -0x01,0x00,0x06,0x24, -0x48,0x00,0xC7,0x26, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x21,0x20,0x40,0x00, -0x06,0x00,0x05,0x24, -0x02,0x00,0x06,0x24, -0x18,0x00,0xA7,0x27, -0x18,0x00,0xA0,0xA7, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x18,0x00,0xA5,0x97, -0x02,0x80,0x04,0x3C, -0x68,0xDF,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x21,0x98,0x40,0x00, -0x13,0x00,0x40,0x12, -0x21,0x20,0x60,0x02, -0x1C,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0x20,0x00,0x42,0x24, -0x01,0x01,0x42,0x2C, -0x18,0x00,0x40,0x14, -0x21,0x20,0x80,0x02, -0x44,0x00,0xBF,0x8F, -0x40,0x00,0xBE,0x8F, -0x3C,0x00,0xB7,0x8F, -0x38,0x00,0xB6,0x8F, -0x34,0x00,0xB5,0x8F, -0x30,0x00,0xB4,0x8F, -0x2C,0x00,0xB3,0x8F, -0x28,0x00,0xB2,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0xF8,0xFF,0xA6,0x26, -0x68,0x00,0xC7,0x26, -0x32,0x00,0x05,0x24, -0x41,0x4F,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x1C,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0x20,0x00,0x42,0x24, -0x01,0x01,0x42,0x2C, -0xEA,0xFF,0x40,0x10, -0x21,0x20,0x80,0x02, -0x21,0x28,0x00,0x00, -0x08,0x52,0x00,0x0C, -0x08,0x00,0x06,0x24, -0x08,0x00,0x84,0x8E, -0x04,0x00,0x85,0x8E, -0xFF,0xDF,0x02,0x3C, -0x10,0x00,0x86,0x8E, -0x14,0x00,0x87,0x8E, -0xFF,0xFF,0x42,0x34, -0x1C,0x00,0xA8,0x8F, -0x24,0x20,0x82,0x00, -0x00,0x40,0x03,0x3C, -0xFF,0xE0,0x02,0x24, -0x24,0x28,0xA2,0x00, -0x25,0x20,0x83,0x00, -0x00,0x80,0x02,0x3C, -0xFF,0x81,0x03,0x24, -0x24,0x38,0xE3,0x00, -0x25,0x30,0xC2,0x00, -0x00,0x10,0xA5,0x34, -0x80,0x00,0x84,0x34, -0x08,0x00,0x84,0xAE, -0x00,0x00,0x88,0xA6, -0x02,0x00,0x9E,0xA2, -0x14,0x00,0x87,0xAE, -0x04,0x00,0x85,0xAE, -0x10,0x00,0x86,0xAE, -0xF8,0x36,0xE6,0x8E, -0x64,0x37,0xE5,0x8E, -0x01,0x00,0x04,0x24, -0x00,0x01,0x07,0x24, -0x01,0x00,0x02,0x24, -0x73,0x01,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0xB0,0x01,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x44,0x00,0xBF,0x8F, -0x40,0x00,0xBE,0x8F, -0x3C,0x00,0xB7,0x8F, -0x38,0x00,0xB6,0x8F, -0x34,0x00,0xB5,0x8F, -0x30,0x00,0xB4,0x8F, -0x2C,0x00,0xB3,0x8F, -0x28,0x00,0xB2,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x25,0x24,0x00,0x0C, -0x24,0x00,0x04,0x24, -0x21,0x30,0x40,0x00, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x50,0x24, -0x21,0x20,0xC0,0x00, -0x13,0x00,0xC0,0x10, -0x48,0xEA,0xA5,0x24, -0x04,0x00,0x02,0x24, -0x09,0x00,0x03,0x24, -0x0C,0x00,0xC2,0xAC, -0x14,0x00,0xC3,0xAC, -0x08,0x00,0xC5,0x94, -0xA4,0x3B,0x03,0x8E, -0x02,0x80,0x02,0x3C, -0x25,0x28,0xA2,0x00, -0x30,0x09,0x00,0x0C, -0x20,0x00,0xA3,0xAC, -0xA8,0x3B,0x06,0x8E, -0xA4,0x3B,0x05,0x8E, -0x02,0x80,0x04,0x3C, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x80,0xDF,0x84,0x24, -0x2F,0x55,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x74,0xDF,0x84,0x24, -0x2F,0x55,0x00,0x08, -0x18,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x24,0x00,0xBF,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x02,0x00,0x82,0x90, -0x02,0x80,0x12,0x3C, -0x30,0x1F,0x51,0x26, -0xB0,0x1B,0x25,0x96, -0x0F,0x00,0x42,0x30, -0xC0,0x10,0x02,0x00, -0x21,0x80,0x44,0x00, -0x00,0x01,0xA3,0x30, -0x04,0x00,0x60,0x10, -0x18,0x00,0x04,0x26, -0x00,0x10,0xA2,0x30, -0x0B,0x00,0x40,0x10, -0x04,0x00,0xA2,0x30, -0x21,0x18,0x00,0x00, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xF5,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x55,0x50,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x18,0x3B,0x84,0x24, -0x21,0x28,0x40,0x00, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xED,0xFF,0x40,0x14, -0x21,0x18,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x88,0x58,0x53,0x24, -0x22,0x00,0x14,0x26, -0x21,0x20,0x80,0x02, -0x21,0x28,0x60,0x02, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xE4,0xFF,0x40,0x14, -0x21,0x18,0x00,0x00, -0x28,0x00,0x04,0x26, -0x21,0x28,0x60,0x02, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xDE,0xFF,0x40,0x14, -0x21,0x18,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0xE8,0xDF,0x84,0x24, -0xB0,0x1B,0x24,0x96, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x83,0x30, -0x01,0x00,0x62,0x30, -0x08,0x00,0x40,0x10, -0x00,0x20,0x62,0x30, -0x15,0x00,0x40,0x10, -0xFF,0xDE,0x82,0x30, -0xFE,0xFF,0x04,0x24, -0xB0,0x1B,0x22,0xA6, -0xD0,0x38,0x20,0xAE, -0x48,0x0E,0x00,0x0C, -0xB4,0x38,0x20,0xAE, -0x25,0xB0,0x02,0x3C, -0x30,0x1F,0x50,0x26, -0x4C,0x00,0x42,0x34, -0x00,0x00,0x40,0xA0, -0x21,0x20,0x00,0x00, -0x21,0x28,0x00,0x00, -0x12,0x0D,0x00,0x0C, -0xA1,0x3B,0x00,0xA2, -0x10,0x3E,0x00,0xAE, -0xEC,0x38,0x00,0xAE, -0x08,0x39,0x00,0xAE, -0xA3,0x51,0x00,0x0C, -0x50,0x3E,0x00,0xAE, -0xFA,0x48,0x00,0x08, -0x21,0x18,0x00,0x00, -0x76,0x0E,0x00,0x0C, -0x21,0x20,0x80,0x02, -0xBB,0xFF,0x40,0x14, -0xFF,0xFF,0x03,0x24, -0xB0,0x1B,0x22,0x96, -0x00,0x00,0x00,0x00, -0xFF,0xFE,0x42,0x30, -0x2D,0x49,0x00,0x08, -0xB0,0x1B,0x22,0xA6, -0xD0,0xFF,0xBD,0x27, -0x20,0x00,0xB4,0xAF, -0x02,0x80,0x14,0x3C, -0x14,0x00,0xB1,0xAF, -0x28,0x00,0xBF,0xAF, -0x24,0x00,0xB5,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x91,0x26, -0xB0,0x1B,0x23,0x96, -0x00,0x00,0x00,0x00, -0x10,0x00,0x62,0x30, -0x3A,0x00,0x40,0x14, -0x00,0x01,0x62,0x30, -0x2E,0x00,0x40,0x10, -0x00,0x10,0x62,0x30, -0x29,0x00,0x40,0x14, -0x01,0x00,0x62,0x30, -0x1D,0x00,0x40,0x14, -0x04,0x00,0x62,0x30, -0x25,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x21,0x90,0x20,0x02, -0x2B,0x3D,0x55,0x24, -0x01,0x00,0x13,0x24, -0xF0,0x00,0x10,0x24, -0x65,0x49,0x00,0x08, -0x19,0x00,0x11,0x24, -0xFF,0xFF,0x31,0x26, -0x1C,0x00,0x20,0x06, -0x28,0x00,0x10,0x26, -0x21,0x18,0x12,0x02, -0xFA,0x1D,0x62,0x90, -0x00,0x00,0x00,0x00, -0xF9,0xFF,0x53,0x14, -0x00,0x00,0x00,0x00, -0x0C,0x1E,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x33,0x00,0x40,0x10, -0x21,0x20,0x15,0x02, -0x00,0x60,0x02,0x40, -0x01,0x00,0x41,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x0C,0x1E,0x60,0xAC, -0x00,0x60,0x82,0x40, -0x63,0x49,0x00,0x08, -0xFF,0xFF,0x31,0x26, -0xD4,0x1E,0x22,0x8E, -0x00,0x00,0x00,0x00, -0x2F,0x00,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x00,0x60,0x02,0x40, -0x01,0x00,0x41,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0xD4,0x1E,0x20,0xAE, -0x00,0x60,0x82,0x40, -0x53,0x1E,0x00,0x0C, -0x30,0x1F,0x90,0x26, -0xEC,0x38,0x02,0xAE, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0xF8,0xDF,0x84,0x24, -0xB0,0x1B,0x22,0x96, -0xEC,0x38,0x20,0xAE, -0xFD,0xFF,0x04,0x24, -0xEF,0xDF,0x42,0x30, -0x48,0x0E,0x00,0x0C, -0xB0,0x1B,0x22,0xA6, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x8E,0x3E,0x42,0x92, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x42,0x24, -0x8E,0x3E,0x42,0xA2, -0x76,0x0E,0x00,0x0C, -0xFA,0x1D,0x60,0xA0, -0x63,0x49,0x00,0x08, -0xFF,0xFF,0x31,0x26, -0x2F,0x55,0x00,0x0C, -0x18,0xE0,0x84,0x24, -0xB0,0x1B,0x23,0x96, -0x25,0xB0,0x02,0x3C, -0x4C,0x00,0x42,0x34, -0xFE,0xFE,0x63,0x30, -0xB0,0x1B,0x23,0xA6, -0x21,0x20,0x00,0x00, -0x00,0x00,0x40,0xA0, -0x21,0x28,0x00,0x00, -0xA1,0x3B,0x20,0xA2, -0x12,0x0D,0x00,0x0C, -0xC2,0x1E,0x20,0xA2, -0x02,0x80,0x04,0x3C, -0x76,0x0E,0x00,0x0C, -0x88,0x58,0x84,0x24, -0x83,0x49,0x00,0x08, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xA8,0xFF,0xBD,0x27, -0x48,0x00,0xB6,0xAF, -0x3C,0x00,0xB3,0xAF, -0x38,0x00,0xB2,0xAF, -0x30,0x00,0xB0,0xAF, -0x54,0x00,0xBF,0xAF, -0x50,0x00,0xBE,0xAF, -0x4C,0x00,0xB7,0xAF, -0x44,0x00,0xB5,0xAF, -0x40,0x00,0xB4,0xAF, -0x34,0x00,0xB1,0xAF, -0x02,0x00,0x82,0x90, -0x00,0x00,0x83,0x8C, -0x21,0xB0,0x00,0x00, -0x0F,0x00,0x42,0x30, -0xC0,0x10,0x02,0x00, -0x21,0x80,0x44,0x00, -0x18,0x00,0x12,0x26, -0x21,0x20,0x40,0x02, -0x55,0x50,0x00,0x0C, -0xFF,0x3F,0x73,0x30, -0x02,0x80,0x04,0x3C, -0x18,0x3B,0x84,0x24, -0x21,0x28,0x40,0x00, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x0B,0x00,0x40,0x14, -0x02,0x80,0x15,0x3C, -0x30,0x1F,0xB1,0x26, -0xB0,0x1B,0x23,0x96, -0x00,0x00,0x00,0x00, -0x01,0x00,0x62,0x30, -0x05,0x00,0x40,0x10, -0x00,0x10,0x62,0x30, -0x03,0x00,0x40,0x14, -0x00,0x01,0x62,0x30, -0x0E,0x00,0x40,0x10, -0x20,0x00,0xB4,0x27, -0x54,0x00,0xBF,0x8F, -0x50,0x00,0xBE,0x8F, -0x4C,0x00,0xB7,0x8F, -0x48,0x00,0xB6,0x8F, -0x44,0x00,0xB5,0x8F, -0x40,0x00,0xB4,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x58,0x00,0xBD,0x27, -0x32,0x00,0x05,0x26, -0x21,0x20,0x80,0x02, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x20,0x00,0xA5,0x97, -0x00,0x00,0x00,0x00, -0xC2,0x00,0xA0,0x14, -0x02,0x80,0x04,0x3C, -0x21,0x20,0x80,0x02, -0x34,0x00,0x05,0x26, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x20,0x00,0xA2,0x97, -0x21,0x20,0x80,0x02, -0x30,0x00,0x05,0x26, -0xFF,0x3F,0x42,0x30, -0x02,0x00,0x06,0x24, -0x50,0x39,0x22,0xA6, -0x10,0x52,0x00,0x0C, -0x28,0x00,0xA2,0xAF, -0x20,0x00,0xA3,0x97, -0x21,0x40,0x20,0x02, -0x00,0x04,0x63,0x30, -0x02,0x00,0x60,0x14, -0x09,0x00,0x02,0x24, -0x14,0x00,0x02,0x24, -0x1E,0x00,0x5E,0x26, -0xE2,0xFF,0x74,0x26, -0x21,0x20,0xC0,0x03, -0x01,0x00,0x05,0x24, -0x24,0x00,0xA6,0x27, -0x21,0x38,0x80,0x02, -0x55,0x1D,0x00,0x0C, -0x0C,0x3E,0x02,0xA1, -0xA8,0x00,0x40,0x10, -0x02,0x00,0x45,0x24, -0x24,0x00,0xA6,0x8F, -0x10,0x52,0x00,0x0C, -0x10,0x00,0xA4,0x27, -0x21,0x20,0xC0,0x03, -0x32,0x00,0x05,0x24, -0x24,0x00,0xA6,0x27, -0x24,0x00,0xB7,0x8F, -0x55,0x1D,0x00,0x0C, -0x21,0x38,0x80,0x02, -0x08,0x00,0x40,0x10, -0x10,0x00,0xA4,0x27, -0x24,0x00,0xA6,0x8F, -0x21,0x20,0x97,0x00, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x45,0x24, -0x24,0x00,0xA3,0x8F, -0x00,0x00,0x00,0x00, -0x21,0xB8,0xE3,0x02, -0x02,0x80,0x02,0x3C, -0xEA,0x5D,0x44,0x90, -0x02,0x00,0x03,0x24, -0xE5,0x00,0x83,0x10, -0x21,0x20,0xC0,0x03, -0x30,0x1F,0xA4,0x26, -0x10,0x3E,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x22,0x00,0x40,0x10, -0x30,0x1F,0xB1,0x26, -0x02,0x80,0x02,0x3C, -0xE6,0x5D,0x43,0x90, -0x00,0x00,0x00,0x00, -0x1D,0x00,0x60,0x14, -0x23,0x10,0xD2,0x03, -0x2B,0x10,0x53,0x00, -0x1A,0x00,0x40,0x10, -0x21,0x80,0xC0,0x03, -0x02,0x80,0x11,0x3C, -0x21,0x20,0x00,0x02, -0xDD,0x00,0x05,0x24, -0x24,0x00,0xA6,0x27, -0x55,0x1D,0x00,0x0C, -0x21,0x38,0x80,0x02, -0x21,0x80,0x40,0x00, -0x02,0x00,0x44,0x24, -0xC8,0xDD,0x25,0x26, -0x0E,0x01,0x40,0x10, -0x06,0x00,0x06,0x24, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x10,0x01,0x40,0x10, -0x00,0x00,0x00,0x00, -0x24,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0x21,0x18,0x02,0x02, -0x02,0x00,0x70,0x24, -0x23,0x20,0x12,0x02, -0x03,0x01,0x40,0x10, -0x2B,0x20,0x93,0x00, -0xEB,0xFF,0x80,0x14, -0x21,0x20,0x00,0x02, -0x30,0x1F,0xB1,0x26, -0x50,0x3E,0x22,0x8E, -0x00,0x00,0x00,0x00, -0x6A,0x00,0x40,0x14, -0x24,0x00,0xA6,0x27, -0x53,0x1E,0x00,0x0C, -0x30,0x1F,0xB2,0x26, -0x25,0xB0,0x14,0x3C, -0xB0,0x1B,0x45,0x96, -0x02,0x00,0x03,0x24, -0x4C,0x00,0x84,0x36, -0x00,0x00,0x83,0xA0, -0xEC,0x38,0x42,0xAE, -0x02,0x00,0x02,0x3C, -0x00,0x01,0xA5,0x34, -0x20,0xBF,0x42,0x34, -0x08,0x39,0x42,0xAE, -0x21,0x0E,0x00,0x0C, -0xB0,0x1B,0x45,0xA6, -0x10,0x00,0xA4,0x27, -0x7D,0x50,0x00,0x0C, -0x21,0x28,0xE0,0x02, -0x0F,0x00,0x50,0x30, -0x10,0x00,0xA4,0x27, -0x96,0x50,0x00,0x0C, -0x21,0x28,0xE0,0x02, -0x40,0x02,0x13,0x36, -0x02,0x80,0x04,0x3C, -0x21,0x88,0x40,0x00, -0x21,0x30,0x40,0x00, -0x21,0x28,0x60,0x02, -0x2F,0x55,0x00,0x0C, -0x6C,0xE0,0x84,0x24, -0x21,0x20,0x60,0x02, -0xC1,0x5B,0x00,0x0C, -0x21,0x28,0x20,0x02, -0x21,0x28,0xE0,0x02, -0xC2,0x50,0x00,0x0C, -0x10,0x00,0xA4,0x27, -0x21,0x88,0x40,0x00, -0x50,0x3E,0x42,0x8E, -0x00,0x00,0x00,0x00, -0x16,0x00,0x40,0x10, -0x50,0x00,0x13,0x36, -0x5B,0x3E,0x42,0x92, -0x5C,0x3E,0x43,0x92, -0x0A,0x3E,0x44,0x92, -0x00,0x13,0x02,0x00, -0x00,0x1D,0x03,0x00, -0x25,0x10,0x43,0x00, -0x04,0x00,0x03,0x24, -0xA0,0x00,0x83,0x10, -0x25,0x88,0x22,0x02, -0x54,0x3E,0x43,0x8E, -0x00,0x00,0x00,0x00, -0x07,0x00,0x60,0x14, -0x01,0x00,0x02,0x24, -0x58,0x3E,0x42,0x96, -0x00,0x00,0x00,0x00, -0x20,0x00,0x42,0x30, -0xA1,0x00,0x40,0x14, -0x00,0x10,0x02,0x3C, -0x01,0x00,0x02,0x24, -0x98,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x80,0xE0,0x84,0x24, -0x21,0x28,0x60,0x02, -0x21,0x38,0xC0,0x02, -0x2F,0x55,0x00,0x0C, -0x21,0x30,0x20,0x02, -0x21,0x20,0x60,0x02, -0xC1,0x5B,0x00,0x0C, -0x21,0x28,0x20,0x02, -0x30,0x1F,0xA2,0x26, -0xB0,0x1B,0x43,0x94, -0x0A,0x3E,0x44,0x90, -0xB4,0x38,0x40,0xAC, -0xFF,0xDF,0x63,0x30, -0xB0,0x1B,0x43,0xA4, -0x04,0x00,0x03,0x24, -0xD0,0x38,0x40,0xAC, -0x94,0x3E,0x40,0xAC, -0x06,0x00,0x83,0x10, -0x98,0x3E,0x40,0xAC, -0x28,0x00,0xA4,0x8F, -0x48,0x0E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xE2,0x49,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x06,0x3C, -0x64,0x03,0xC6,0x34, -0x30,0x1F,0xA4,0x8E, -0x00,0x00,0xC5,0x90, -0x0F,0xFF,0x02,0x24, -0xFD,0xFF,0x03,0x24, -0x24,0x20,0x82,0x00, -0x24,0x28,0xA3,0x00, -0x30,0x1F,0xA4,0xAE, -0x00,0x00,0xC5,0xA0, -0x28,0x00,0xA4,0x8F, -0x48,0x0E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xE2,0x49,0x00,0x08, -0x00,0x00,0x00,0x00, -0x2F,0x55,0x00,0x0C, -0x50,0xE0,0x84,0x24, -0xFF,0xFF,0x02,0x24, -0x99,0x4A,0x00,0x08, -0x28,0x00,0xA2,0xAF, -0x21,0x20,0xC0,0x03, -0x2D,0x00,0x05,0x24, -0x55,0x1D,0x00,0x0C, -0x21,0x38,0x80,0x02, -0x91,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x24,0x00,0xAB,0x8F, -0x00,0x00,0x00,0x00, -0x1F,0x00,0x60,0x19, -0x21,0x40,0x00,0x00, -0x02,0x00,0x49,0x24, -0x21,0x50,0x20,0x02, -0x02,0x00,0x0C,0x24, -0xD5,0x4A,0x00,0x08, -0x21,0x68,0x20,0x01, -0x58,0x3E,0x82,0x90, -0x00,0x00,0x23,0x91, -0x00,0x00,0x00,0x00, -0x24,0x10,0x43,0x00, -0x58,0x3E,0x82,0xA0, -0x01,0x00,0x08,0x25, -0x2A,0x10,0x0B,0x01, -0x11,0x00,0x40,0x10, -0x01,0x00,0x29,0x25, -0xF6,0xFF,0x0C,0x15, -0x21,0x20,0x0A,0x01, -0x5A,0x3E,0x43,0x91, -0x00,0x00,0x25,0x91, -0x02,0x00,0xA2,0x91, -0x1C,0x00,0x64,0x30, -0x1C,0x00,0xA5,0x30, -0x03,0x00,0x42,0x30, -0x03,0x00,0x63,0x30, -0x2A,0x30,0x43,0x00, -0x2A,0x38,0xA4,0x00, -0x0A,0x10,0x66,0x00, -0x0A,0x20,0xA7,0x00, -0x25,0x10,0x44,0x00, -0xD1,0x4A,0x00,0x08, -0x5A,0x3E,0x42,0xA1, -0x02,0x80,0x02,0x3C, -0xDE,0x5D,0x43,0x90, -0x02,0x80,0x02,0x3C, -0x3C,0xE3,0x47,0x24, -0x10,0x00,0x65,0x30, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x4C,0xE3,0x66,0x24, -0x30,0x1F,0x44,0x24, -0xF8,0x4A,0x00,0x08, -0x21,0x40,0x00,0x00, -0x00,0x00,0x43,0x90, -0x5B,0x3E,0x82,0x90, -0x01,0x00,0x08,0x25, -0x24,0x10,0x43,0x00, -0x5B,0x3E,0x82,0xA0, -0x10,0x00,0x02,0x29, -0x07,0x00,0x40,0x10, -0x01,0x00,0x84,0x24, -0x21,0x10,0x07,0x01, -0xF6,0xFF,0xA0,0x14, -0x21,0x18,0x06,0x01, -0x00,0x00,0x63,0x90, -0xF1,0x4A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0x20,0xC0,0x03, -0x21,0x38,0x80,0x02, -0x3D,0x00,0x05,0x24, -0x55,0x1D,0x00,0x0C, -0x24,0x00,0xA6,0x27, -0x48,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x24,0x00,0xA6,0x8F, -0x02,0x80,0x04,0x3C, -0xA8,0x5D,0x84,0x24, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x45,0x24, -0x90,0x0D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x54,0x4A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x2A,0x00,0x05,0x24, -0x24,0x00,0xA6,0x27, -0x55,0x1D,0x00,0x0C, -0x21,0x38,0x80,0x02, -0x30,0x00,0x40,0x10, -0x30,0x1F,0xA5,0x26, -0x02,0x00,0x42,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x30, -0x2B,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0xEB,0x5D,0x44,0x90, -0x01,0x00,0x03,0x24, -0x3E,0x00,0x83,0x10, -0x30,0x1F,0xA2,0x26, -0x10,0x23,0x43,0x8C, -0xFF,0xEF,0x04,0x24, -0x00,0x08,0x63,0x34, -0x24,0x18,0x64,0x00, -0x2A,0x4A,0x00,0x08, -0x10,0x23,0x43,0xAC, -0xF6,0x01,0x82,0x36, -0x00,0x00,0x40,0xA4, -0x91,0x4A,0x00,0x08, -0x02,0x80,0x04,0x3C, -0x58,0x3E,0x42,0x96, -0x00,0x00,0x00,0x00, -0x40,0x00,0x42,0x30, -0x66,0xFF,0x40,0x10, -0x02,0x80,0x04,0x3C, -0x00,0x10,0x02,0x3C, -0x25,0x88,0x22,0x02, -0x0F,0x00,0x08,0x24, -0x01,0x00,0x03,0x24, -0x0C,0x00,0x02,0x25, -0x04,0x10,0x43,0x00, -0x24,0x10,0x51,0x00, -0x16,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x08,0x25, -0xFA,0xFF,0x01,0x05, -0x0C,0x00,0x02,0x25, -0x00,0x12,0x16,0x00, -0x00,0x1B,0x16,0x00, -0x25,0x18,0x62,0x00, -0x00,0x21,0x16,0x00, -0x25,0x18,0x64,0x00, -0x25,0xB0,0x02,0x3C, -0x25,0x18,0x76,0x00, -0xF6,0x01,0x42,0x34, -0x00,0x00,0x43,0xA4, -0x91,0x4A,0x00,0x08, -0x02,0x80,0x04,0x3C, -0x10,0x23,0xA2,0x8C, -0xFF,0xF7,0x03,0x24, -0xFF,0xEF,0x04,0x24, -0x24,0x10,0x43,0x00, -0x24,0x10,0x44,0x00, -0x2A,0x4A,0x00,0x08, -0x10,0x23,0xA2,0xAC, -0x38,0x4B,0x00,0x08, -0xFF,0x00,0x16,0x31, -0x30,0x1F,0xA2,0x26, -0x54,0x4A,0x00,0x08, -0x50,0x3E,0x40,0xAC, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x4F,0x4A,0x00,0x08, -0x10,0x3E,0x40,0xAC, -0x54,0x4A,0x00,0x08, -0x50,0x3E,0x20,0xAE, -0x21,0x20,0x00,0x02, -0x78,0x0F,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x50,0x4A,0x00,0x08, -0x30,0x1F,0xB1,0x26, -0x10,0x23,0x43,0x8C, -0xFF,0xF7,0x04,0x24, -0x24,0x18,0x64,0x00, -0x00,0x10,0x63,0x34, -0x2A,0x4A,0x00,0x08, -0x10,0x23,0x43,0xAC, -0xD8,0xFF,0xBD,0x27, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x20,0x00,0xBF,0xAF, -0x02,0x00,0x82,0x90, -0x02,0x80,0x03,0x3C, -0xE0,0x3A,0x65,0x94, -0x0F,0x00,0x42,0x30, -0x00,0x00,0x83,0x8C, -0xC0,0x10,0x02,0x00, -0x21,0x20,0x44,0x00, -0x00,0x10,0xA8,0x30, -0x02,0x80,0x02,0x3C, -0x00,0x08,0xA5,0x30, -0x84,0x58,0x51,0x24, -0xFF,0x3F,0x63,0x30, -0x06,0x00,0xA0,0x10, -0x18,0x00,0x90,0x24, -0xE8,0xFF,0x67,0x24, -0x30,0x00,0x84,0x24, -0x21,0x28,0x00,0x00, -0x07,0x00,0x00,0x11, -0x10,0x00,0xA6,0x27, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x55,0x1D,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xF7,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x02,0x00,0x44,0x24, -0x10,0x00,0xA2,0x8F, -0x00,0x00,0x00,0x00, -0x06,0x00,0x40,0x10, -0x10,0x00,0x25,0x26, -0x0C,0x00,0x26,0x8E, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xED,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x42,0x50,0x00,0x0C, -0x21,0x20,0x00,0x02, -0x01,0x10,0x00,0x0C, -0x21,0x20,0x40,0x00, -0x77,0x4B,0x00,0x08, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0xE5,0x48,0x00,0x0C, -0xFE,0xFF,0x05,0x24, -0x10,0x00,0xBF,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0xE5,0x48,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x10,0x00,0xBF,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x25,0xB0,0x03,0x3C, -0x01,0x80,0x02,0x3C, -0xB0,0x03,0x65,0x34, -0x8C,0x2E,0x42,0x24, -0x18,0x03,0x63,0x34, -0x00,0x00,0x62,0xAC, -0x00,0x00,0xA4,0xAC, -0x00,0x00,0x83,0x8C, -0x21,0x10,0x00,0x00, -0xFF,0x3F,0x63,0x30, -0x00,0x00,0xA3,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x30,0x1F,0x50,0x24, -0x70,0x3D,0x03,0x8E, -0xFE,0xFF,0x04,0x24, -0x01,0x00,0x63,0x24, -0x05,0x00,0x62,0x2C, -0x12,0x00,0x40,0x10, -0x70,0x3D,0x03,0xAE, -0xB0,0x1B,0x02,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x30, -0x05,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xA5,0x12,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xC8,0x00,0x03,0x24, -0xD0,0x38,0x03,0xAE, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xB0,0x1B,0x02,0x96, -0x00,0x00,0x00,0x00, -0xFF,0xDF,0x42,0x30, -0x48,0x0E,0x00,0x0C, -0xB0,0x1B,0x02,0xA6, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x2C,0x00,0xBF,0xAF, -0x02,0x00,0x82,0x90, -0x02,0x80,0x14,0x3C, -0x30,0x1F,0x92,0x26, -0xB0,0x1B,0x43,0x96, -0x00,0x00,0x85,0x8C, -0x0F,0x00,0x42,0x30, -0xC0,0x10,0x02,0x00, -0x21,0x80,0x44,0x00, -0x01,0x00,0x63,0x30, -0xFF,0x3F,0xB3,0x30, -0x18,0x00,0x11,0x26, -0x0A,0x00,0x60,0x14, -0x21,0x20,0x00,0x00, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x21,0x10,0x80,0x00, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x55,0x50,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x02,0x80,0x04,0x3C, -0x18,0x3B,0x84,0x24, -0x21,0x28,0x40,0x00, -0x39,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xEF,0xFF,0x40,0x14, -0x21,0x20,0x00,0x00, -0xB0,0x1B,0x42,0x96, -0x00,0x00,0x00,0x00, -0x00,0x10,0x42,0x30, -0xEA,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x18,0x00,0x03,0x96, -0x04,0x00,0x04,0x24, -0x21,0x10,0x80,0x00, -0x00,0x40,0x63,0x30, -0x0A,0x10,0x03,0x00, -0x21,0x10,0x22,0x02, -0x1C,0x00,0x43,0x94, -0x1A,0x00,0x45,0x94, -0x2F,0x00,0x60,0x14, -0x02,0x00,0x02,0x24, -0x14,0x00,0xA2,0x10, -0x01,0x00,0x02,0x24, -0x0E,0x00,0xA4,0x14, -0x02,0x80,0x04,0x3C, -0x78,0x3D,0x43,0x8E, -0x00,0x00,0x00,0x00, -0x06,0x00,0x62,0x10, -0x30,0x1F,0x83,0x26, -0xB0,0x1B,0x62,0x94, -0xFF,0xFF,0x04,0x24, -0xFF,0xDF,0x42,0x30, -0xE9,0x4B,0x00,0x08, -0xB0,0x1B,0x62,0xA4, -0x84,0x14,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xE9,0x4B,0x00,0x08, -0x21,0x20,0x00,0x00, -0x2F,0x55,0x00,0x0C, -0xEC,0xE1,0x84,0x24, -0x12,0x4C,0x00,0x08, -0x30,0x1F,0x83,0x26, -0x78,0x3D,0x43,0x8E, -0x00,0x00,0x00,0x00, -0xF5,0xFF,0x62,0x14, -0xE2,0xFF,0x67,0x26, -0x36,0x00,0x04,0x26, -0x10,0x00,0x05,0x24, -0x55,0x1D,0x00,0x0C, -0x10,0x00,0xA6,0x27, -0x16,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x10,0x00,0xA6,0x8F, -0x02,0x80,0x04,0x3C, -0xB8,0x5C,0x84,0x24, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x45,0x24, -0xB0,0x1B,0x43,0x96, -0x21,0x20,0x00,0x00, -0x03,0x00,0x02,0x24, -0xDF,0xFF,0x63,0x30, -0x40,0x00,0x63,0x34, -0xB0,0x1B,0x43,0xA6, -0xBC,0x15,0x00,0x0C, -0x74,0x3D,0x42,0xAE, -0xE9,0x4B,0x00,0x08, -0x21,0x20,0x00,0x00, -0x02,0x80,0x04,0x3C, -0xBC,0xE1,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x21,0x28,0x60,0x00, -0x12,0x4C,0x00,0x08, -0x30,0x1F,0x83,0x26, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0xD8,0xE1,0x84,0x24, -0x12,0x4C,0x00,0x08, -0x30,0x1F,0x83,0x26, -0xE8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x30,0x1F,0x50,0x24, -0x6C,0x3D,0x03,0x8E, -0xFF,0xFF,0x04,0x24, -0x01,0x00,0x63,0x24, -0x05,0x00,0x62,0x2C, -0x16,0x00,0x40,0x10, -0x6C,0x3D,0x03,0xAE, -0xB0,0x1B,0x03,0x96, -0xBF,0xFF,0x02,0x24, -0x21,0x20,0x00,0x00, -0x24,0x10,0x62,0x00, -0x80,0x00,0x63,0x30, -0x05,0x00,0x60,0x10, -0x20,0x00,0x45,0x34, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x01,0x00,0x02,0x24, -0x74,0x3D,0x02,0xAE, -0xBC,0x15,0x00,0x0C, -0xB0,0x1B,0x05,0xA6, -0xC8,0x00,0x03,0x24, -0xB4,0x38,0x03,0xAE, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xB0,0x1B,0x02,0x96, -0x00,0x00,0x00,0x00, -0xFF,0xDF,0x42,0x30, -0x48,0x0E,0x00,0x0C, -0xB0,0x1B,0x02,0xA6, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x20,0x00,0xB2,0xAF, -0x21,0x90,0x80,0x00, -0x00,0x01,0x04,0x24, -0x24,0x00,0xB3,0xAF, -0x1C,0x00,0xB1,0xAF, -0x21,0x98,0xA0,0x00, -0x28,0x00,0xBF,0xAF, -0x25,0x24,0x00,0x0C, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x21,0x88,0x40,0x00, -0x20,0xE2,0x84,0x24, -0x37,0x00,0x40,0x10, -0x04,0xEB,0xA5,0x24, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x30,0x96, -0x02,0x80,0x02,0x3C, -0x21,0x28,0x40,0x02, -0x25,0x80,0x02,0x02, -0x24,0x00,0x04,0x26, -0x20,0x00,0x00,0xA6, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x04,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x30,0x00,0x04,0x26, -0x88,0x58,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x20,0x00,0x03,0x96, -0x18,0x00,0x02,0x24, -0x02,0x80,0x05,0x3C, -0x03,0xFF,0x63,0x30, -0xC0,0x00,0x63,0x34, -0x20,0x00,0x03,0xA6, -0x30,0x1F,0xA5,0x24, -0x0C,0x00,0x22,0xAE, -0xF8,0x1D,0xA3,0x94, -0x20,0x00,0x07,0x26, -0x38,0x00,0x04,0x26, -0xFF,0x0F,0x62,0x30, -0x00,0x11,0x02,0x00, -0x02,0x32,0x02,0x00, -0x01,0x00,0x63,0x24, -0xF8,0x1D,0xA3,0xA4, -0x17,0x00,0xE6,0xA0, -0x16,0x00,0xE2,0xA0, -0x10,0x00,0xA6,0x27, -0x0C,0x00,0x27,0x26, -0x02,0x00,0x05,0x24, -0x68,0x4F,0x00,0x0C, -0x10,0x00,0xB3,0xA7, -0x21,0x20,0x20,0x02, -0x21,0x28,0x00,0x00, -0xB9,0x0C,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x14,0xE2,0x84,0x24, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x20,0x00,0xB2,0xAF, -0x21,0x90,0x80,0x00, -0x00,0x01,0x04,0x24, -0x24,0x00,0xB3,0xAF, -0x1C,0x00,0xB1,0xAF, -0x21,0x98,0xA0,0x00, -0x28,0x00,0xBF,0xAF, -0x25,0x24,0x00,0x0C, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x21,0x88,0x40,0x00, -0x3C,0xE2,0x84,0x24, -0x37,0x00,0x40,0x10, -0x14,0xEB,0xA5,0x24, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x30,0x96, -0x02,0x80,0x02,0x3C, -0x21,0x28,0x40,0x02, -0x25,0x80,0x02,0x02, -0x24,0x00,0x04,0x26, -0x20,0x00,0x00,0xA6, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x04,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x30,0x00,0x04,0x26, -0x88,0x58,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x20,0x00,0x03,0x96, -0x18,0x00,0x02,0x24, -0x02,0x80,0x05,0x3C, -0x03,0xFF,0x63,0x30, -0xA0,0x00,0x63,0x34, -0x20,0x00,0x03,0xA6, -0x30,0x1F,0xA5,0x24, -0x0C,0x00,0x22,0xAE, -0xF8,0x1D,0xA3,0x94, -0x20,0x00,0x07,0x26, -0x38,0x00,0x04,0x26, -0xFF,0x0F,0x62,0x30, -0x00,0x11,0x02,0x00, -0x02,0x32,0x02,0x00, -0x01,0x00,0x63,0x24, -0xF8,0x1D,0xA3,0xA4, -0x17,0x00,0xE6,0xA0, -0x16,0x00,0xE2,0xA0, -0x10,0x00,0xA6,0x27, -0x0C,0x00,0x27,0x26, -0x02,0x00,0x05,0x24, -0x68,0x4F,0x00,0x0C, -0x10,0x00,0xB3,0xA7, -0x21,0x20,0x20,0x02, -0x21,0x28,0x00,0x00, -0xB9,0x0C,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x30,0xE2,0x84,0x24, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x2C,0x00,0xB1,0xAF, -0xFF,0xFF,0x05,0x24, -0x21,0x88,0x80,0x00, -0x02,0x00,0x06,0x24, -0x10,0x00,0xA4,0x27, -0x34,0x00,0xBF,0xAF, -0x30,0x00,0xB2,0xAF, -0x08,0x52,0x00,0x0C, -0x28,0x00,0xB0,0xAF, -0x08,0x00,0x30,0x96, -0x02,0x80,0x02,0x3C, -0x21,0x28,0x00,0x00, -0x25,0x80,0x02,0x02, -0x21,0x20,0x00,0x02, -0x08,0x52,0x00,0x0C, -0x10,0x00,0x06,0x24, -0x20,0x00,0x02,0x96, -0x24,0x00,0x04,0x26, -0x10,0x00,0xA5,0x27, -0x03,0xFF,0x42,0x30, -0xC8,0x00,0x42,0x34, -0x20,0x00,0x02,0xA6, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x25,0xB0,0x03,0x3C, -0x50,0x00,0x62,0x34, -0x00,0x00,0x44,0x8C, -0x54,0x00,0x65,0x34, -0x58,0x00,0x66,0x34, -0x18,0x00,0xA4,0xAF, -0x00,0x00,0xA2,0x8C, -0x5C,0x00,0x63,0x34, -0x2A,0x00,0x04,0x26, -0x1C,0x00,0xA2,0xAF, -0x00,0x00,0xC7,0x8C, -0x18,0x00,0xA5,0x27, -0x06,0x00,0x06,0x24, -0x20,0x00,0xA7,0xAF, -0x00,0x00,0x62,0x8C, -0x1A,0x00,0x12,0x24, -0x10,0x52,0x00,0x0C, -0x24,0x00,0xA2,0xAF, -0x30,0x00,0x04,0x26, -0x20,0x00,0xA5,0x27, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x13,0x00,0x03,0x24, -0x14,0x00,0x23,0xAE, -0x0C,0x00,0x32,0xAE, -0x08,0x00,0x05,0x8E, -0x04,0x00,0x04,0x8E, -0xFF,0xDF,0x02,0x3C, -0x14,0x00,0x06,0x8E, -0xFF,0xFF,0x42,0x34, -0x10,0x00,0x07,0x8E, -0xFF,0xE0,0x03,0x24, -0x24,0x28,0xA2,0x00, -0x00,0x40,0x02,0x3C, -0x24,0x20,0x83,0x00, -0x25,0x28,0xA2,0x00, -0xFF,0x81,0x03,0x24, -0xFE,0xFF,0x02,0x3C, -0x24,0x30,0xC3,0x00, -0xFF,0xFF,0x42,0x34, -0x00,0x12,0x84,0x34, -0x00,0x80,0x03,0x3C, -0x24,0x20,0x82,0x00, -0x25,0x38,0xE3,0x00, -0x00,0x26,0xC6,0x34, -0x80,0x00,0xA5,0x34, -0x20,0x00,0x02,0x24, -0x00,0x00,0x12,0xA6, -0x10,0x00,0x07,0xAE, -0x02,0x00,0x02,0xA2, -0x14,0x00,0x06,0xAE, -0x04,0x00,0x04,0xAE, -0x08,0x00,0x05,0xAE, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x1C,0x00,0xB1,0xAF, -0x01,0x80,0x02,0x3C, -0x25,0xB0,0x11,0x3C, -0x18,0x03,0x23,0x36, -0x80,0x35,0x42,0x24, -0x28,0x00,0xB4,0xAF, -0x20,0x00,0xB2,0xAF, -0x21,0xA0,0x80,0x00, -0x48,0x00,0xB2,0x93, -0xFF,0x00,0xE4,0x30, -0x00,0x00,0x62,0xAC, -0x24,0x00,0xB3,0xAF, -0x18,0x00,0xB0,0xAF, -0x30,0x00,0xBF,0xAF, -0x2C,0x00,0xB5,0xAF, -0xFF,0x00,0xB3,0x30, -0x0D,0x24,0x00,0x0C, -0xFF,0x00,0xD0,0x30, -0x66,0x00,0x40,0x10, -0x10,0x00,0xA2,0xAF, -0x08,0x00,0x44,0x8C, -0xB0,0x03,0x22,0x36, -0x00,0x00,0x44,0xAC, -0x10,0x00,0xA3,0x8F, -0x02,0x80,0x02,0x3C, -0x08,0x00,0x64,0x94, -0x00,0x00,0x00,0x00, -0x25,0x88,0x82,0x00, -0x41,0x00,0x40,0x16, -0x20,0x00,0x24,0x26, -0x48,0x00,0x02,0x24, -0x43,0x00,0x02,0x12, -0x20,0x00,0x30,0xA6, -0x04,0x00,0x02,0x24, -0x47,0x00,0x62,0x16, -0x21,0x28,0x80,0x02, -0xA4,0x00,0x02,0x24, -0x61,0x00,0x02,0x12, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xA2,0x8F, -0x25,0xB0,0x10,0x3C, -0xB0,0x03,0x10,0x36, -0x0C,0x00,0x55,0xAC, -0x10,0x00,0xA2,0x8F, -0x12,0x00,0x03,0x24, -0x21,0x28,0x00,0x00, -0x14,0x00,0x43,0xAC, -0x00,0x00,0x15,0xAE, -0x10,0x00,0xA2,0x8F, -0x08,0x00,0x06,0x24, -0x08,0x00,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x03,0xAE, -0x10,0x00,0xA2,0x8F, -0x02,0x80,0x03,0x3C, -0x08,0x00,0x44,0x94, -0x00,0x00,0x00,0x00, -0x25,0x88,0x83,0x00, -0x08,0x52,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x14,0x00,0x25,0x8E, -0x08,0x00,0x24,0x8E, -0xFF,0xDF,0x02,0x3C, -0xFF,0x81,0x03,0x24, -0xFF,0xFF,0x42,0x34, -0x24,0x28,0xA3,0x00, -0x24,0x20,0x82,0x00, -0x00,0x40,0x03,0x3C, -0x25,0x20,0x83,0x00, -0x20,0x00,0x02,0x24, -0x00,0x24,0xA5,0x34, -0x00,0x00,0x35,0xA6, -0x02,0x00,0x22,0xA2, -0x08,0x00,0x24,0xAE, -0x14,0x00,0x25,0xAE, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xA3,0x8F, -0x74,0x57,0x42,0x24, -0x04,0x00,0x44,0x8C, -0x00,0x00,0x62,0xAC, -0x04,0x00,0x43,0xAC, -0x10,0x00,0xA2,0x27, -0x00,0x00,0x83,0xAC, -0x04,0x00,0x64,0xAC, -0x30,0x00,0xBF,0x8F, -0x00,0x00,0x02,0xAE, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x00,0x10,0x02,0x36, -0x20,0x00,0x22,0xA6, -0x48,0x00,0x02,0x24, -0xC0,0xFF,0x02,0x16, -0x04,0x00,0x02,0x24, -0x20,0x00,0x22,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x42,0x34, -0x20,0x00,0x22,0xA6, -0x04,0x00,0x02,0x24, -0xBB,0xFF,0x62,0x12, -0x21,0x28,0x80,0x02, -0x24,0x00,0x24,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x18,0x3B,0xA5,0x24, -0x2A,0x00,0x24,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x30,0x00,0x24,0x26, -0x88,0x58,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x88,0x4D,0x00,0x08, -0x18,0x00,0x15,0x24, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x4C,0xE2,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x24,0xEB,0xA5,0x24, -0x30,0x00,0xBF,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x80,0x58,0x43,0x94, -0x02,0x80,0x05,0x3C, -0x88,0x58,0xA5,0x24, -0x00,0xC0,0x63,0x24, -0xFF,0xFF,0x63,0x30, -0x02,0x12,0x03,0x00, -0x02,0x00,0x83,0xA0, -0x03,0x00,0x82,0xA0, -0x06,0x00,0x06,0x24, -0x10,0x52,0x00,0x0C, -0x24,0x00,0x24,0x26, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x24,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x88,0x4D,0x00,0x08, -0x18,0x00,0x15,0x24, -0xB0,0xFF,0xBD,0x27, -0x3C,0x00,0xB5,0xAF, -0x38,0x00,0xB4,0xAF, -0xFF,0xFF,0xF5,0x30, -0x25,0xB0,0x14,0x3C, -0x01,0x80,0x02,0x3C, -0x2C,0x00,0xB1,0xAF, -0x18,0x03,0x83,0x36, -0xE8,0x37,0x42,0x24, -0x20,0x00,0xB1,0x26, -0x44,0x00,0xB7,0xAF, -0x34,0x00,0xB3,0xAF, -0x21,0xB8,0x80,0x00, -0x60,0x00,0xB3,0x93, -0x21,0x20,0x20,0x02, -0x00,0x00,0x62,0xAC, -0x40,0x00,0xB6,0xAF, -0x30,0x00,0xB2,0xAF, -0x48,0x00,0xBF,0xAF, -0x28,0x00,0xB0,0xAF, -0xFF,0x00,0xB6,0x30, -0x25,0x24,0x00,0x0C, -0xFF,0x00,0xD2,0x30, -0x11,0x00,0x40,0x14, -0x20,0x00,0xA2,0xAF, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x58,0xE2,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x30,0xEB,0xA5,0x24, -0x48,0x00,0xBF,0x8F, -0x44,0x00,0xB7,0x8F, -0x40,0x00,0xB6,0x8F, -0x3C,0x00,0xB5,0x8F, -0x38,0x00,0xB4,0x8F, -0x34,0x00,0xB3,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x50,0x00,0xBD,0x27, -0x08,0x00,0x43,0x8C, -0xB0,0x03,0x82,0x36, -0x02,0x80,0x10,0x3C, -0x00,0x00,0x43,0xAC, -0x20,0x00,0xA2,0x8F, -0x21,0x30,0x20,0x02, -0x21,0x28,0x00,0x00, -0x08,0x00,0x44,0x94, -0xFF,0x51,0x00,0x0C, -0x25,0x20,0x90,0x00, -0x20,0x00,0xA3,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0x62,0x94, -0x00,0x00,0x00,0x00, -0x25,0x88,0x50,0x00, -0x51,0x00,0x60,0x16, -0x20,0x00,0x30,0x26, -0x20,0x00,0x32,0xA6, -0x48,0x00,0x02,0x24, -0x6C,0x00,0x42,0x12, -0x50,0x00,0x82,0x36, -0x04,0x00,0x02,0x24, -0x4D,0x00,0xC2,0x16, -0x21,0x28,0xE0,0x02, -0xA4,0x00,0x02,0x24, -0x7E,0x00,0x42,0x12, -0x02,0x80,0x02,0x3C, -0x20,0x00,0xA2,0x8F, -0x25,0xB0,0x10,0x3C, -0xB0,0x03,0x10,0x36, -0x0C,0x00,0x55,0xAC, -0x20,0x00,0xA2,0x8F, -0x12,0x00,0x03,0x24, -0x21,0x28,0x00,0x00, -0x14,0x00,0x43,0xAC, -0x00,0x00,0x15,0xAE, -0x20,0x00,0xA2,0x8F, -0x08,0x00,0x06,0x24, -0x08,0x00,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x03,0xAE, -0x20,0x00,0xA2,0x8F, -0x02,0x80,0x03,0x3C, -0x08,0x00,0x44,0x94, -0x00,0x00,0x00,0x00, -0x25,0x88,0x83,0x00, -0x08,0x52,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x04,0x00,0x25,0x8E, -0x08,0x00,0x26,0x8E, -0x14,0x00,0x27,0x8E, -0x10,0x00,0x24,0x8E, -0xFF,0xE0,0x03,0x24, -0xFF,0xDF,0x02,0x3C, -0x24,0x28,0xA3,0x00, -0xFF,0xFF,0x42,0x34, -0xFF,0x81,0x03,0x24, -0x24,0x38,0xE3,0x00, -0x24,0x30,0xC2,0x00, -0x00,0x80,0x03,0x3C, -0x00,0x40,0x02,0x3C, -0x25,0x30,0xC2,0x00, -0x25,0x20,0x83,0x00, -0x00,0x12,0xA5,0x34, -0x20,0x00,0x02,0x24, -0x10,0x00,0x24,0xAE, -0x00,0x00,0x35,0xA6, -0x02,0x00,0x22,0xA2, -0x04,0x00,0x25,0xAE, -0x14,0x00,0x27,0xAE, -0x08,0x00,0x26,0xAE, -0x00,0x60,0x05,0x40, -0x01,0x00,0xA1,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x02,0x3C, -0x20,0x00,0xA3,0x8F, -0x74,0x57,0x42,0x24, -0x04,0x00,0x44,0x8C, -0x00,0x00,0x62,0xAC, -0x04,0x00,0x43,0xAC, -0x20,0x00,0xA2,0x27, -0x00,0x00,0x83,0xAC, -0x04,0x00,0x64,0xAC, -0x00,0x00,0x02,0xAE, -0x00,0x60,0x85,0x40, -0x48,0x00,0xBF,0x8F, -0x44,0x00,0xB7,0x8F, -0x40,0x00,0xB6,0x8F, -0x3C,0x00,0xB5,0x8F, -0x38,0x00,0xB4,0x8F, -0x34,0x00,0xB3,0x8F, -0x30,0x00,0xB2,0x8F, -0x2C,0x00,0xB1,0x8F, -0x28,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x50,0x00,0xBD,0x27, -0x00,0x10,0x42,0x36, -0x35,0x4E,0x00,0x08, -0x20,0x00,0x22,0xA6, -0x24,0x00,0x24,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x18,0x3B,0xA5,0x24, -0x2A,0x00,0x24,0x26, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x30,0x00,0x24,0x26, -0x88,0x58,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x30,0x1F,0xA5,0x24, -0xF8,0x1D,0xA6,0x94, -0x00,0x00,0x00,0x00, -0x01,0x00,0xC2,0x24, -0x00,0x21,0x06,0x00, -0xFF,0xFF,0x46,0x30, -0xFF,0xFF,0x84,0x30, -0x00,0x10,0xC2,0x2C, -0x0A,0x30,0x02,0x00, -0x02,0x1A,0x04,0x00, -0x17,0x00,0x03,0xA2, -0x16,0x00,0x04,0xA2, -0x3E,0x4E,0x00,0x08, -0xF8,0x1D,0xA6,0xA4, -0x00,0x00,0x43,0x8C, -0x54,0x00,0x84,0x36, -0x58,0x00,0x85,0x36, -0x10,0x00,0xA3,0xAF, -0x00,0x00,0x82,0x8C, -0x5C,0x00,0x87,0x36, -0x2A,0x00,0x24,0x26, -0x14,0x00,0xA2,0xAF, -0x00,0x00,0xA3,0x8C, -0x06,0x00,0x06,0x24, -0x10,0x00,0xA5,0x27, -0x18,0x00,0xA3,0xAF, -0x00,0x00,0xE2,0x8C, -0x10,0x52,0x00,0x0C, -0x1C,0x00,0xA2,0xAF, -0x30,0x00,0x24,0x26, -0x18,0x00,0xA5,0x27, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x20,0x00,0x23,0x96, -0x00,0x00,0x00,0x00, -0x00,0x01,0x63,0x34, -0x38,0x4E,0x00,0x08, -0x20,0x00,0x23,0xA6, -0x80,0x58,0x43,0x94, -0x02,0x80,0x05,0x3C, -0x24,0x00,0x24,0x26, -0x00,0xC0,0x63,0x24, -0xFF,0xFF,0x63,0x30, -0x02,0x12,0x03,0x00, -0x88,0x58,0xA5,0x24, -0x03,0x00,0x02,0xA2, -0x02,0x00,0x03,0xA2, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x02,0x80,0x05,0x3C, -0x2A,0x00,0x24,0x26, -0x18,0x3B,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x3E,0x4E,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB0,0xAF, -0xFF,0x00,0x90,0x30, -0x02,0x80,0x04,0x3C, -0x21,0x28,0x00,0x02, -0x1C,0x00,0xBF,0xAF, -0x2F,0x55,0x00,0x0C, -0x64,0xE2,0x84,0x24, -0x02,0x80,0x04,0x3C, -0x88,0x58,0x84,0x24, -0x08,0x00,0x05,0x24, -0x48,0x00,0x06,0x24, -0x18,0x00,0x07,0x24, -0xFA,0x4D,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x01,0x00,0x02,0x24, -0x21,0x28,0x00,0x00, -0x90,0x00,0x06,0x24, -0x21,0x38,0x00,0x00, -0x18,0x00,0xBF,0xAF, -0x60,0x4D,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x20,0x00,0xB0,0xAF, -0xFF,0xFF,0x05,0x24, -0xFF,0x00,0x90,0x30, -0x02,0x00,0x06,0x24, -0x24,0x00,0xBF,0xAF, -0x08,0x52,0x00,0x0C, -0x18,0x00,0xA4,0x27, -0x18,0x00,0xA4,0x27, -0x08,0x00,0x05,0x24, -0xC8,0x00,0x06,0x24, -0x21,0x38,0x00,0x00, -0x60,0x4D,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x02,0x80,0x05,0x3C, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB0,0xAF, -0x30,0x1F,0xA5,0x24, -0x50,0x39,0xA2,0x94, -0x01,0x00,0x03,0x24, -0xFF,0x00,0x90,0x30, -0x00,0xC0,0x42,0x24, -0xFF,0xFF,0x44,0x30, -0xC2,0x34,0x00,0x0C, -0x2A,0x1C,0xA3,0xA0, -0x02,0x80,0x04,0x3C, -0x88,0x58,0x84,0x24, -0x04,0x00,0x05,0x24, -0xA4,0x00,0x06,0x24, -0x10,0x00,0x07,0x24, -0xFA,0x4D,0x00,0x0C, -0x10,0x00,0xB0,0xAF, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0x08,0x00,0xE0,0x03, -0x08,0x00,0x82,0x24, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xBF,0xAF, -0x17,0x4F,0x00,0x0C, -0x74,0x00,0x84,0x24, -0x21,0x28,0x40,0x00, -0x10,0x00,0xA4,0x27, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x10,0x00,0xA2,0x97, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xBF,0xAF, -0x17,0x4F,0x00,0x0C, -0x10,0x00,0xA5,0xA7, -0x21,0x20,0x40,0x00, -0x10,0x00,0xA5,0x27, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x0A,0x00,0x82,0x24, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xBF,0xAF, -0x32,0x4F,0x00,0x0C, -0x74,0x00,0x84,0x24, -0x21,0x28,0x40,0x00, -0x10,0x00,0xA4,0x27, -0x10,0x52,0x00,0x0C, -0x02,0x00,0x06,0x24, -0x10,0x00,0xA2,0x97, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0x80,0x00, -0x00,0x00,0x05,0xA2, -0x01,0x00,0x06,0xA2, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x1C,0x00,0xBF,0xAF, -0x21,0x88,0xC0,0x00, -0x02,0x00,0x84,0x24, -0x30,0x00,0xB2,0x8F, -0x0D,0x00,0xC0,0x14, -0x21,0x28,0xE0,0x00, -0x00,0x00,0x43,0x8E, -0x21,0x10,0x11,0x02, -0x1C,0x00,0xBF,0x8F, -0x21,0x18,0x71,0x00, -0x02,0x00,0x63,0x24, -0x00,0x00,0x43,0xAE, -0x14,0x00,0xB1,0x8F, -0x18,0x00,0xB2,0x8F, -0x10,0x00,0xB0,0x8F, -0x02,0x00,0x42,0x24, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x10,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x00,0x43,0x8E, -0x21,0x10,0x11,0x02, -0x1C,0x00,0xBF,0x8F, -0x21,0x18,0x71,0x00, -0x02,0x00,0x63,0x24, -0x00,0x00,0x43,0xAE, -0x14,0x00,0xB1,0x8F, -0x18,0x00,0xB2,0x8F, -0x10,0x00,0xB0,0x8F, -0x02,0x00,0x42,0x24, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0xA0,0x00, -0x18,0x00,0xB2,0xAF, -0x21,0x28,0xC0,0x00, -0x21,0x90,0xE0,0x00, -0x21,0x30,0x00,0x02, -0x1C,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x52,0x00,0x0C, -0x21,0x88,0x80,0x00, -0x00,0x00,0x43,0x8E, -0x21,0x10,0x30,0x02, -0x1C,0x00,0xBF,0x8F, -0x21,0x18,0x70,0x00, -0x00,0x00,0x43,0xAE, -0x14,0x00,0xB1,0x8F, -0x18,0x00,0xB2,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x7F,0x00,0x84,0x30, -0x6D,0x00,0x82,0x2C, -0x0A,0x00,0x40,0x10, -0x21,0x28,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x80,0x10,0x04,0x00, -0x58,0xEB,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x21,0x28,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x0B,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x0A,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x09,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x08,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x07,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x06,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x03,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x05,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x04,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x02,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x01,0x00,0x05,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x7F,0x00,0x84,0x30, -0x0C,0x00,0x82,0x2C, -0x0A,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x80,0x10,0x04,0x00, -0x0C,0xED,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x6C,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x60,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x48,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x30,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x24,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x18,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x12,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x0C,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x16,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x0B,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x04,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x02,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0xC8,0xFF,0xBD,0x27, -0x24,0x00,0xB5,0xAF, -0x02,0x80,0x15,0x3C, -0x2C,0x00,0xB7,0xAF, -0x28,0x00,0xB6,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x30,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0xB8,0x80,0x00, -0x21,0xA0,0x00,0x00, -0x21,0x98,0x00,0x00, -0x30,0x1F,0xB6,0x26, -0x30,0x1F,0xA2,0x26, -0x21,0x10,0x62,0x02, -0xFB,0x1B,0x51,0x90, -0xFE,0x00,0x03,0x24, -0x1E,0x00,0x23,0x12, -0xFF,0x00,0x02,0x24, -0x21,0x00,0x22,0x12, -0x21,0x10,0x80,0x02, -0xAD,0x4F,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x21,0x88,0x40,0x00, -0x21,0x80,0x00,0x00, -0x21,0x90,0xC0,0x02, -0x21,0x10,0x12,0x02, -0xEE,0x1B,0x44,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x82,0x24, -0xFF,0x00,0x42,0x30, -0x02,0x00,0x42,0x2C, -0x05,0x00,0x40,0x14, -0x01,0x00,0x10,0x26, -0xAD,0x4F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x05,0x00,0x51,0x10, -0x01,0x00,0x03,0x24, -0x0D,0x00,0x02,0x2A, -0xF3,0xFF,0x40,0x14, -0x21,0x10,0x12,0x02, -0x21,0x18,0x00,0x00, -0x01,0x00,0x02,0x24, -0x14,0x00,0x62,0x10, -0xFF,0x00,0x22,0x32, -0x21,0x10,0xF4,0x02, -0x00,0x00,0x51,0xA0, -0x01,0x00,0x94,0x26, -0x01,0x00,0x73,0x26, -0x0D,0x00,0x62,0x2A, -0xDB,0xFF,0x40,0x14, -0x30,0x1F,0xA2,0x26, -0x21,0x10,0x80,0x02, -0x30,0x00,0xBF,0x8F, -0x2C,0x00,0xB7,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x0C,0x50,0x00,0x08, -0x80,0x00,0x51,0x34, -0xD0,0xFF,0xBD,0x27, -0x24,0x00,0xB1,0xAF, -0x20,0x00,0xB0,0xAF, -0x21,0x88,0x80,0x00, -0x21,0x80,0xA0,0x00, -0x0D,0x00,0x06,0x24, -0x21,0x28,0x00,0x00, -0x28,0x00,0xBF,0xAF, -0xFF,0x51,0x00,0x0C, -0x10,0x00,0xA4,0x27, -0xDD,0x4F,0x00,0x0C, -0x10,0x00,0xA4,0x27, -0x00,0x00,0x02,0xAE, -0x21,0x20,0x20,0x02, -0x10,0x00,0xA5,0x27, -0x10,0x52,0x00,0x0C, -0x21,0x30,0x40,0x00, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x21,0x28,0x00,0x00, -0x21,0x10,0x85,0x00, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x04,0x00,0x60,0x10, -0x0D,0x00,0xA2,0x2C, -0xFA,0xFF,0x40,0x14, -0x01,0x00,0xA5,0x24, -0xFF,0xFF,0xA5,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x00,0x00,0x82,0x94, -0x21,0x30,0x80,0x00, -0x10,0x00,0x85,0x24, -0x42,0x1A,0x02,0x00, -0xC2,0x11,0x02,0x00, -0x02,0x00,0x42,0x30, -0x01,0x00,0x63,0x30, -0x25,0x18,0x43,0x00, -0x01,0x00,0x04,0x24, -0x07,0x00,0x64,0x10, -0x00,0x00,0x00,0x00, -0x05,0x00,0x60,0x10, -0x0A,0x00,0xC5,0x24, -0x02,0x00,0x02,0x24, -0x02,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x18,0x00,0xC5,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x00,0x00,0x82,0x94, -0x21,0x30,0x80,0x00, -0x04,0x00,0x85,0x24, -0x42,0x1A,0x02,0x00, -0xC2,0x11,0x02,0x00, -0x02,0x00,0x42,0x30, -0x01,0x00,0x63,0x30, -0x25,0x18,0x43,0x00, -0x01,0x00,0x04,0x24, -0x04,0x00,0x64,0x10, -0x00,0x00,0x00,0x00, -0x02,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0x10,0x00,0xC5,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xA0,0x00, -0x13,0x00,0xA0,0x18, -0x21,0x30,0x00,0x00, -0x02,0x00,0x07,0x24, -0x04,0x00,0x08,0x24, -0x0B,0x00,0x09,0x24, -0x16,0x00,0x0A,0x24, -0x21,0x10,0x86,0x00, -0x00,0x00,0x43,0x90, -0x01,0x00,0xC6,0x24, -0x7F,0x00,0x63,0x30, -0x07,0x00,0x67,0x10, -0x2A,0x10,0xC5,0x00, -0x05,0x00,0x68,0x10, -0x00,0x00,0x00,0x00, -0x03,0x00,0x69,0x10, -0x00,0x00,0x00,0x00, -0x05,0x00,0x6A,0x14, -0x00,0x00,0x00,0x00, -0xF3,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x02,0x80,0x02,0x3C, -0x80,0x5D,0x43,0x8C, -0x08,0x00,0x10,0x24, -0x06,0x00,0xA0,0x14, -0x0A,0x80,0x03,0x00, -0x21,0x10,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x65,0x50,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x03,0x36, -0x01,0x00,0x42,0x38, -0x03,0x00,0x04,0x36, -0x21,0x80,0x60,0x00, -0x0B,0x80,0x82,0x00, -0x21,0x10,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x0E,0x00,0xA3,0x2C, -0x21,0x88,0xA0,0x00, -0x0D,0x00,0x02,0x24, -0x0A,0x88,0x43,0x00, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x24,0x00,0xBF,0xAF, -0x20,0x00,0xB4,0xAF, -0x21,0x98,0x80,0x00, -0x21,0x90,0x00,0x00, -0x15,0x00,0x20,0x12, -0x21,0x80,0x00,0x00, -0xAA,0x50,0x00,0x08, -0x01,0x00,0x14,0x24, -0x2B,0x10,0x11,0x02, -0x11,0x00,0x40,0x10, -0x21,0x10,0x40,0x02, -0x21,0x18,0x70,0x02, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x44,0x30, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0xF6,0xFF,0x41,0x04, -0x01,0x00,0x10,0x26, -0x7D,0x4F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x04,0x10,0x54,0x00, -0x25,0x90,0x42,0x02, -0x2B,0x10,0x11,0x02, -0xF3,0xFF,0x40,0x14, -0x21,0x18,0x70,0x02, -0x21,0x10,0x40,0x02, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x0E,0x00,0xA3,0x2C, -0x21,0x88,0xA0,0x00, -0x0D,0x00,0x02,0x24, -0x0A,0x88,0x43,0x00, -0x20,0x00,0xB4,0xAF, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x24,0x00,0xBF,0xAF, -0x1C,0x00,0xB3,0xAF, -0x21,0xA0,0x80,0x00, -0x21,0x90,0x00,0x00, -0x0A,0x00,0x20,0x12, -0x21,0x80,0x00,0x00, -0x01,0x00,0x13,0x24, -0x21,0x10,0x90,0x02, -0x00,0x00,0x44,0x90, -0x7D,0x4F,0x00,0x0C, -0x01,0x00,0x10,0x26, -0x04,0x10,0x53,0x00, -0x2B,0x18,0x11,0x02, -0xF9,0xFF,0x60,0x14, -0x25,0x90,0x42,0x02, -0x21,0x10,0x40,0x02, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xE8,0xFF,0xBD,0x27, -0xFF,0xFF,0x02,0x24, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x21,0x30,0xA0,0x00, -0x1B,0x00,0x82,0x10, -0x20,0x00,0x10,0x24, -0x20,0x00,0x82,0x28, -0x06,0x00,0x40,0x14, -0x80,0x18,0x04,0x00, -0x21,0x10,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x21,0x18,0x64,0x00, -0x21,0x80,0x80,0x00, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x04,0x3C, -0xC0,0x18,0x03,0x00, -0x30,0x1F,0x42,0x24, -0x2B,0x3D,0x84,0x24, -0x21,0x20,0x64,0x00, -0x21,0x18,0x62,0x00, -0x01,0x00,0x02,0x24, -0x06,0x00,0x06,0x24, -0x10,0x52,0x00,0x0C, -0xFA,0x1D,0x62,0xA0, -0x21,0x10,0x00,0x02, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0xC8,0x00,0x47,0x24, -0x05,0x00,0x10,0x24, -0xC2,0x1E,0x43,0x24, -0x10,0x51,0x00,0x08, -0xC8,0x00,0x05,0x24, -0x01,0x00,0x10,0x26, -0x20,0x00,0x02,0x2E, -0x28,0x00,0xA5,0x24, -0xDE,0xFF,0x40,0x10, -0x28,0x00,0xE7,0x24, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0xF8,0xFF,0x40,0x14, -0x28,0x00,0x63,0x24, -0x02,0x80,0x04,0x3C, -0x2B,0x3D,0x84,0x24, -0x01,0x00,0x02,0x24, -0x21,0x20,0xA4,0x00, -0xFA,0x1D,0xE2,0xA0, -0x21,0x28,0xC0,0x00, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x00,0x51,0x00,0x08, -0x21,0x10,0x00,0x02, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x30,0x00,0xB2,0x8F, -0x21,0x88,0x80,0x00, -0x21,0x20,0xA0,0x00, -0x21,0x28,0x20,0x02, -0x10,0x00,0xB0,0xAF, -0x1C,0x00,0xBF,0xAF, -0xE3,0x50,0x00,0x0C, -0xFF,0xFF,0xF0,0x30, -0x20,0x00,0x03,0x24, -0x21,0x20,0x40,0x00, -0x21,0x28,0x00,0x02, -0x21,0x30,0x20,0x02, -0x07,0x00,0x43,0x10, -0x21,0x38,0x40,0x02, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x4E,0x23,0x00,0x08, -0x20,0x00,0xBD,0x27, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0xA8,0x80,0x00, -0x30,0x1F,0x54,0x24, -0x2B,0x3D,0x73,0x24, -0x05,0x00,0x11,0x24, -0x01,0x00,0x12,0x24, -0xC8,0x00,0x10,0x24, -0x50,0x51,0x00,0x08, -0x28,0x00,0xBF,0xAF, -0x01,0x00,0x31,0x26, -0x20,0x00,0x22,0x2A, -0x0E,0x00,0x40,0x10, -0x21,0x10,0x20,0x02, -0x21,0x10,0x14,0x02, -0xFA,0x1D,0x43,0x90, -0x21,0x20,0x13,0x02, -0x21,0x28,0xA0,0x02, -0x06,0x00,0x06,0x24, -0xF6,0xFF,0x72,0x14, -0x28,0x00,0x10,0x26, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xF3,0xFF,0x40,0x14, -0x01,0x00,0x31,0x26, -0xFF,0xFF,0x31,0x26, -0x21,0x10,0x20,0x02, -0x28,0x00,0xBF,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x98,0x80,0x00, -0x30,0x1F,0x56,0x24, -0x2B,0x3D,0x75,0x24, -0x21,0x88,0x00,0x00, -0x01,0x00,0x14,0x24, -0x21,0x80,0x00,0x00, -0x2C,0x00,0xBF,0xAF, -0x7C,0x51,0x00,0x08, -0x18,0x00,0xB2,0xAF, -0x01,0x00,0x31,0x26, -0x20,0x00,0x22,0x2A, -0x1E,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x21,0x90,0x16,0x02, -0xFA,0x1D,0x42,0x92, -0x21,0x20,0x15,0x02, -0x21,0x28,0x60,0x02, -0x06,0x00,0x06,0x24, -0xF6,0xFF,0x54,0x14, -0x28,0x00,0x10,0x26, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xF3,0xFF,0x40,0x14, -0x01,0x00,0x31,0x26, -0xFF,0xFF,0x31,0x26, -0x02,0x80,0x06,0x3C, -0x02,0x80,0x07,0x3C, -0x21,0x20,0x20,0x02, -0xFA,0x1D,0x40,0xA2, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xE8,0xDD,0xC6,0x24, -0xD8,0xDD,0xE7,0x24, -0x21,0x28,0x00,0x00, -0x4E,0x23,0x00,0x08, -0x30,0x00,0xBD,0x27, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x18,0x00,0xB2,0xAF, -0x30,0x1F,0x52,0x24, -0x30,0x00,0xBE,0xAF, -0x2C,0x00,0xB7,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x34,0x00,0xBF,0xAF, -0x21,0x80,0x00,0x00, -0x02,0x80,0x1E,0x3C, -0x02,0x80,0x17,0x3C, -0x02,0x80,0x16,0x3C, -0x01,0x00,0x13,0x24, -0xFF,0xF7,0x15,0x24, -0xFF,0xEF,0x14,0x24, -0x21,0x88,0x40,0x02, -0xFA,0x1D,0x22,0x92, -0xC0,0x48,0x10,0x00, -0xEA,0x5D,0xC7,0x93, -0x41,0x00,0x53,0x10, -0x21,0x30,0x32,0x01, -0xE8,0x22,0xC2,0x8C, -0xBF,0xFF,0x03,0x24, -0x24,0x28,0x43,0x00, -0x80,0x07,0xA3,0x34, -0x24,0x10,0x75,0x00, -0x31,0x00,0xF3,0x10, -0x24,0x10,0x54,0x00, -0xE8,0x22,0xC2,0xAC, -0x21,0x48,0x32,0x01, -0xE8,0x22,0x23,0x8D, -0xFD,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0xFB,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0xE7,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0xFF,0xFD,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xEC,0x22,0x28,0x8D, -0x24,0x18,0x62,0x00, -0xFF,0xFB,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0xFF,0xE7,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x1F,0x00,0x06,0x3C, -0x00,0x80,0x08,0x35, -0x24,0x18,0x62,0x00, -0x25,0x40,0x06,0x01, -0x21,0x20,0x00,0x02, -0xE8,0x22,0x23,0xAD, -0x01,0x00,0x10,0x26, -0x21,0x28,0x00,0x00, -0xE8,0xDD,0xE6,0x26, -0xD8,0xDD,0xC7,0x26, -0x4E,0x23,0x00,0x0C, -0xEC,0x22,0x28,0xAD, -0x20,0x00,0x03,0x2A, -0xD1,0xFF,0x60,0x14, -0x28,0x00,0x31,0x26, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xBE,0x8F, -0x2C,0x00,0xB7,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0xEB,0x5D,0x44,0x90, -0x24,0x18,0x75,0x00, -0x80,0x0F,0xA2,0x34, -0x00,0x10,0x63,0x34, -0xCA,0xFF,0x87,0x14, -0x24,0x10,0x54,0x00, -0xC5,0x51,0x00,0x08, -0xE8,0x22,0xC3,0xAC, -0xBD,0x51,0x00,0x08, -0xFA,0x1D,0x20,0xA2, -0x04,0x52,0x00,0x08, -0xFF,0x00,0xA5,0x30, -0x00,0x00,0x85,0xA0, -0xFF,0xFF,0xC6,0x24, -0x01,0x00,0x84,0x24, -0xFC,0xFF,0xC0,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x05,0x00,0xC0,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0x85,0xAC, -0xFF,0xFF,0xC6,0x24, -0xFD,0xFF,0xC0,0x14, -0x04,0x00,0x84,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x21,0x38,0x80,0x00, -0x08,0x00,0xC0,0x10, -0xFF,0xFF,0xC3,0x24, -0xFF,0xFF,0x06,0x24, -0x00,0x00,0xA2,0x90, -0xFF,0xFF,0x63,0x24, -0x01,0x00,0xA5,0x24, -0x00,0x00,0xE2,0xA0, -0xFB,0xFF,0x66,0x14, -0x01,0x00,0xE7,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0x2B,0x10,0xA4,0x00, -0x0D,0x00,0x40,0x14, -0xFF,0xFF,0x02,0x24, -0xFF,0xFF,0xC6,0x24, -0x08,0x00,0xC2,0x10, -0x21,0x18,0x80,0x00, -0xFF,0xFF,0x07,0x24, -0x00,0x00,0xA2,0x90, -0xFF,0xFF,0xC6,0x24, -0x01,0x00,0xA5,0x24, -0x00,0x00,0x62,0xA0, -0xFB,0xFF,0xC7,0x14, -0x01,0x00,0x63,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0x21,0x28,0xA6,0x00, -0x21,0x18,0x86,0x00, -0xFF,0xFF,0xC6,0x24, -0xFA,0xFF,0xC2,0x10, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x07,0x24, -0xFF,0xFF,0xA5,0x24, -0x00,0x00,0xA2,0x90, -0xFF,0xFF,0x63,0x24, -0xFF,0xFF,0xC6,0x24, -0xFB,0xFF,0xC7,0x14, -0x00,0x00,0x62,0xA0, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0x0C,0x00,0xC0,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0x82,0x90, -0x00,0x00,0xA3,0x90, -0x01,0x00,0x84,0x24, -0x23,0x10,0x43,0x00, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0x04,0x00,0x40,0x14, -0x01,0x00,0xA5,0x24, -0xFF,0xFF,0xC6,0x24, -0xF6,0xFF,0xC0,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xC0,0x00, -0x4F,0x52,0x00,0x08, -0x21,0x18,0x86,0x00, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0x04,0x00,0x45,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0x84,0x24, -0xFA,0xFF,0x83,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0x09,0x00,0xC0,0x10, -0xFF,0xFF,0xC3,0x24, -0xFF,0x00,0xA5,0x30, -0xFF,0xFF,0x06,0x24, -0x00,0x00,0x82,0x90, -0xFF,0xFF,0x63,0x24, -0x05,0x00,0x45,0x10, -0x01,0x00,0x84,0x24, -0xFB,0xFF,0x66,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0xFF,0xFF,0x82,0x24, -0x21,0x38,0x00,0x00, -0x1F,0x00,0xC0,0x10, -0x21,0x18,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x40,0xF2,0x4B,0x24, -0x00,0x00,0x87,0x90, -0x00,0x00,0xA3,0x90, -0xFF,0xFF,0xC6,0x24, -0x01,0x00,0x84,0x24, -0x21,0x10,0xEB,0x00, -0x16,0x00,0xE0,0x10, -0x01,0x00,0xA5,0x24, -0x14,0x00,0x60,0x10, -0x21,0x48,0x6B,0x00, -0x10,0x00,0xE3,0x10, -0x20,0x00,0xE8,0x24, -0x00,0x00,0x42,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x30, -0x02,0x00,0x40,0x10, -0x20,0x00,0x6A,0x24, -0xFF,0x00,0x07,0x31, -0x00,0x00,0x22,0x91, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x30, -0x02,0x00,0x40,0x10, -0xFF,0x00,0xE7,0x30, -0xFF,0x00,0x43,0x31, -0xFF,0x00,0x63,0x30, -0x03,0x00,0xE3,0x14, -0x00,0x00,0x00,0x00, -0xE5,0xFF,0xC0,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x23,0x10,0xE3,0x00, -0x21,0x18,0x80,0x00, -0x00,0x00,0xA2,0x90, -0x01,0x00,0xA5,0x24, -0x00,0x00,0x82,0xA0, -0xFC,0xFF,0x40,0x14, -0x01,0x00,0x84,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x21,0x38,0x80,0x00, -0xFF,0xFF,0x03,0x24, -0xFF,0xFF,0xC6,0x24, -0x06,0x00,0xC3,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0x90, -0x01,0x00,0xA5,0x24, -0x00,0x00,0x82,0xA0, -0xF9,0xFF,0x40,0x14, -0x01,0x00,0x84,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xE0,0x00, -0x00,0x00,0x82,0x80, -0x9E,0x52,0x00,0x08, -0x21,0x18,0x80,0x00, -0x01,0x00,0x84,0x24, -0x00,0x00,0x82,0x80, -0x00,0x00,0x00,0x00, -0xFC,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0x90, -0x01,0x00,0xA5,0x24, -0x00,0x00,0x82,0xA0, -0xFC,0xFF,0x40,0x14, -0x01,0x00,0x84,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x12,0x00,0xC0,0x10, -0x21,0x18,0x80,0x00, -0x00,0x00,0x82,0x80, -0xAF,0x52,0x00,0x08, -0x00,0x00,0x00,0x00, -0x01,0x00,0x84,0x24, -0x00,0x00,0x82,0x80, -0x00,0x00,0x00,0x00, -0xFC,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0x90, -0x01,0x00,0xA5,0x24, -0x00,0x00,0x82,0xA0, -0x05,0x00,0x40,0x10, -0x01,0x00,0x84,0x24, -0xFF,0xFF,0xC6,0x24, -0xF9,0xFF,0xC0,0x14, -0x00,0x00,0x00,0x00, -0x00,0x00,0x80,0xA0, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x00,0x00,0x83,0x90, -0x00,0x00,0xA2,0x90, -0x01,0x00,0x84,0x24, -0x23,0x10,0x62,0x00, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0x03,0x00,0x40,0x14, -0x01,0x00,0xA5,0x24, -0xF7,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x21,0x10,0x00,0x00, -0x0B,0x00,0xC0,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0x90, -0x00,0x00,0x83,0x90, -0xFF,0xFF,0xC6,0x24, -0x23,0x10,0x62,0x00, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0x03,0x00,0x40,0x14, -0x01,0x00,0xA5,0x24, -0xF5,0xFF,0x60,0x14, -0x01,0x00,0x84,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x83,0x80, -0x00,0x2E,0x05,0x00, -0x21,0x10,0x80,0x00, -0xE0,0x52,0x00,0x08, -0x03,0x2E,0x05,0x00, -0x07,0x00,0x60,0x10, -0x01,0x00,0x42,0x24, -0x00,0x00,0x43,0x80, -0x00,0x00,0x00,0x00, -0xFB,0xFF,0x65,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x00,0x00,0x82,0x80, -0xEC,0x52,0x00,0x08, -0x21,0x18,0x80,0x00, -0x01,0x00,0x63,0x24, -0x00,0x00,0x62,0x80, -0x00,0x00,0x00,0x00, -0xFC,0xFF,0x40,0x14, -0x23,0x10,0x64,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x21,0x80,0xA0,0x00, -0x14,0x00,0xB1,0xAF, -0x18,0x00,0xBF,0xAF, -0x21,0x88,0x80,0x00, -0xE6,0x52,0x00,0x0C, -0x00,0x86,0x10,0x00, -0x21,0x18,0x51,0x00, -0x03,0x86,0x10,0x00, -0x00,0x00,0x62,0x80, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x50,0x10, -0x21,0x10,0x60,0x00, -0xFF,0xFF,0x63,0x24, -0x2B,0x10,0x71,0x00, -0xF9,0xFF,0x40,0x10, -0x21,0x10,0x00,0x00, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x21,0x30,0x80,0x00, -0x0D,0x00,0xA0,0x10, -0xFF,0xFF,0xA3,0x24, -0x00,0x00,0x82,0x80, -0x00,0x00,0x00,0x00, -0x09,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x05,0x24, -0xFF,0xFF,0x63,0x24, -0x05,0x00,0x65,0x10, -0x01,0x00,0xC6,0x24, -0x00,0x00,0xC2,0x80, -0x00,0x00,0x00,0x00, -0xFA,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x23,0x10,0xC4,0x00, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0x19,0x00,0x40,0x10, -0x21,0x40,0x00,0x00, -0x00,0x00,0xA9,0x80, -0x00,0x00,0x00,0x00, -0x17,0x00,0x20,0x11, -0x21,0x30,0xA0,0x00, -0x00,0x3E,0x02,0x00, -0x03,0x3E,0x07,0x00, -0x21,0x18,0x20,0x01, -0x15,0x00,0xE3,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0xC6,0x24, -0x00,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0x00,0x1E,0x02,0x00, -0x03,0x1E,0x03,0x00, -0xF8,0xFF,0x60,0x14, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0x06,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0x84,0x24, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0xEB,0xFF,0x40,0x14, -0x01,0x00,0x08,0x25, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x01, -0x00,0x00,0xA2,0x90, -0x31,0x53,0x00,0x08, -0x00,0x16,0x02,0x00, -0x00,0x00,0xC2,0x90, -0x31,0x53,0x00,0x08, -0x00,0x16,0x02,0x00, -0x00,0x00,0x87,0x90, -0x00,0x00,0x00,0x00, -0x14,0x00,0xE0,0x10, -0x21,0x10,0x80,0x00, -0x00,0x00,0xA4,0x90, -0x00,0x00,0x00,0x00, -0x00,0x1E,0x04,0x00, -0x03,0x1E,0x03,0x00, -0x09,0x00,0x60,0x10, -0x21,0x30,0xA0,0x00, -0x00,0x3E,0x07,0x00, -0x03,0x3E,0x07,0x00, -0x0B,0x00,0xE3,0x10, -0x01,0x00,0xC6,0x24, -0x00,0x00,0xC3,0x80, -0x00,0x00,0x00,0x00, -0xFB,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x24, -0x00,0x00,0x47,0x90, -0x00,0x00,0x00,0x00, -0xF0,0xFF,0xE0,0x14, -0x00,0x00,0x00,0x00, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x18,0x00,0xBF,0xAF, -0x21,0x80,0x80,0x00, -0x1D,0x00,0x80,0x10, -0x21,0x88,0xA0,0x00, -0x1D,0x53,0x00,0x0C, -0x21,0x20,0x00,0x02, -0x21,0x80,0x02,0x02, -0x00,0x00,0x02,0x82, -0x21,0x28,0x20,0x02, -0x21,0x20,0x00,0x02, -0x22,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0x41,0x53,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x05,0x00,0x40,0x10, -0x21,0x18,0x40,0x00, -0x00,0x00,0x42,0x80, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x5C,0xF3,0x43,0xAC, -0x21,0x18,0x00,0x02, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x00,0x00,0x60,0xA0, -0x72,0x53,0x00,0x08, -0x01,0x00,0x63,0x24, -0x02,0x80,0x02,0x3C, -0x5C,0xF3,0x50,0x8C, -0x00,0x00,0x00,0x00, -0xF3,0xFF,0x00,0x12, -0x21,0x18,0x00,0x00, -0x1D,0x53,0x00,0x0C, -0x21,0x20,0x00,0x02, -0x21,0x80,0x02,0x02, -0x00,0x00,0x02,0x82, -0x21,0x28,0x20,0x02, -0x21,0x20,0x00,0x02, -0xE0,0xFF,0x40,0x14, -0x21,0x18,0x00,0x00, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x02,0x80,0x02,0x3C, -0x5C,0xF3,0x40,0xAC, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x1C,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x90,0x8C, -0x21,0x90,0x80,0x00, -0x21,0x88,0xA0,0x00, -0x21,0x18,0x00,0x00, -0x0F,0x00,0x00,0x12, -0x21,0x20,0x00,0x02, -0x1D,0x53,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0x80,0x02,0x02, -0x00,0x00,0x02,0x82, -0x21,0x28,0x20,0x02, -0x21,0x20,0x00,0x02, -0x07,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0x41,0x53,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0x18,0x40,0x00, -0x09,0x00,0x40,0x14, -0x00,0x00,0x42,0xAE, -0x21,0x18,0x00,0x02, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x00,0x00,0x42,0x80, -0x00,0x00,0x00,0x00, -0xF5,0xFF,0x40,0x10, -0x01,0x00,0x64,0x24, -0x00,0x00,0x60,0xA0, -0xAB,0x53,0x00,0x08, -0x00,0x00,0x44,0xAE, -0xD8,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x21,0x88,0x80,0x00, -0x21,0x20,0xA0,0x00, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x20,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0xE6,0x52,0x00,0x0C, -0x21,0x98,0xA0,0x00, -0x21,0x90,0x40,0x00, -0x08,0x00,0x40,0x16, -0x21,0x10,0x20,0x02, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xE6,0x52,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x21,0x80,0x40,0x00, -0x2A,0x10,0x52,0x00, -0x0A,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x21,0x20,0x20,0x02, -0x21,0x28,0x60,0x02, -0x21,0x30,0x40,0x02, -0x39,0x52,0x00,0x0C, -0xFF,0xFF,0x10,0x26, -0x0B,0x00,0x40,0x10, -0x2A,0x18,0x12,0x02, -0xF8,0xFF,0x60,0x10, -0x01,0x00,0x31,0x26, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xC7,0x53,0x00,0x08, -0x21,0x10,0x20,0x02, -0x00,0x00,0x87,0x90, -0x00,0x00,0x00,0x00, -0x27,0x00,0xE0,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA6,0x90, -0x00,0x00,0x00,0x00, -0x0A,0x00,0xC0,0x10, -0xDF,0xFF,0x02,0x24, -0x24,0x18,0xC2,0x00, -0x24,0x10,0xE2,0x00, -0x00,0x16,0x02,0x00, -0x00,0x1E,0x03,0x00, -0x03,0x16,0x02,0x00, -0x03,0x1E,0x03,0x00, -0x0A,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0xDF,0xFF,0x02,0x24, -0x24,0x18,0xC2,0x00, -0x24,0x10,0xE2,0x00, -0x00,0x16,0x02,0x00, -0x00,0x1E,0x03,0x00, -0x03,0x1E,0x03,0x00, -0x03,0x16,0x02,0x00, -0x08,0x00,0xE0,0x03, -0x23,0x10,0x43,0x00, -0x0A,0x54,0x00,0x08, -0xDF,0xFF,0x08,0x24, -0x00,0x00,0xA6,0x90, -0x00,0x00,0x00,0x00, -0x24,0x10,0x06,0x01, -0x00,0x16,0x02,0x00, -0xF0,0xFF,0xC0,0x10, -0x03,0x16,0x02,0x00, -0xEF,0xFF,0x62,0x14, -0xDF,0xFF,0x02,0x24, -0x01,0x00,0x84,0x24, -0x00,0x00,0x87,0x90, -0x01,0x00,0xA5,0x24, -0x24,0x10,0x07,0x01, -0x00,0x1E,0x02,0x00, -0xF2,0xFF,0xE0,0x14, -0x03,0x1E,0x03,0x00, -0x00,0x00,0xA6,0x90, -0xDF,0xFF,0x02,0x24, -0x24,0x18,0xC2,0x00, -0x24,0x10,0xE2,0x00, -0x00,0x16,0x02,0x00, -0x00,0x1E,0x03,0x00, -0x03,0x1E,0x03,0x00, -0x03,0x16,0x02,0x00, -0x08,0x00,0xE0,0x03, -0x23,0x10,0x43,0x00, -0xA8,0xFF,0xBD,0x27, -0x44,0x00,0xB5,0xAF, -0x40,0x00,0xB4,0xAF, -0x38,0x00,0xB2,0xAF, -0x34,0x00,0xB1,0xAF, -0x54,0x00,0xBF,0xAF, -0x50,0x00,0xBE,0xAF, -0x4C,0x00,0xB7,0xAF, -0x48,0x00,0xB6,0xAF, -0x3C,0x00,0xB3,0xAF, -0x30,0x00,0xB0,0xAF, -0x21,0x90,0xA0,0x00, -0x00,0x00,0xA5,0x90, -0x21,0xA0,0x80,0x00, -0x21,0xA8,0xC0,0x00, -0x00,0x26,0x05,0x00, -0x03,0x26,0x04,0x00, -0x11,0x00,0x80,0x10, -0x21,0x88,0x80,0x02, -0x25,0x00,0x02,0x24, -0x29,0x00,0x82,0x10, -0x0A,0x00,0x02,0x24, -0x1B,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0x1E,0x00,0x80,0x12, -0x00,0x00,0x00,0x00, -0x00,0x00,0x25,0xA2, -0x01,0x00,0x31,0x26, -0x01,0x00,0x52,0x26, -0x00,0x00,0x45,0x92, -0x00,0x00,0x00,0x00, -0x00,0x26,0x05,0x00, -0x03,0x26,0x04,0x00, -0xF2,0xFF,0x80,0x14, -0x25,0x00,0x02,0x24, -0x02,0x00,0x80,0x12, -0x23,0x10,0x34,0x02, -0x00,0x00,0x20,0xA2, -0x54,0x00,0xBF,0x8F, -0x50,0x00,0xBE,0x8F, -0x4C,0x00,0xB7,0x8F, -0x48,0x00,0xB6,0x8F, -0x44,0x00,0xB5,0x8F, -0x40,0x00,0xB4,0x8F, -0x3C,0x00,0xB3,0x8F, -0x38,0x00,0xB2,0x8F, -0x34,0x00,0xB1,0x8F, -0x30,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x58,0x00,0xBD,0x27, -0xE7,0xFF,0x80,0x16, -0x00,0x00,0x00,0x00, -0x77,0x55,0x00,0x0C, -0x0D,0x00,0x04,0x24, -0x0A,0x00,0x04,0x24, -0x77,0x55,0x00,0x0C, -0x01,0x00,0x52,0x26, -0x00,0x00,0x45,0x92, -0x00,0x00,0x00,0x00, -0x00,0x26,0x05,0x00, -0x3C,0x54,0x00,0x08, -0x03,0x26,0x04,0x00, -0x01,0x00,0x52,0x26, -0x00,0x00,0x45,0x92, -0x73,0x00,0x02,0x24, -0x00,0x1E,0x05,0x00, -0x03,0x1E,0x03,0x00, -0x2C,0x00,0x62,0x10, -0x10,0x00,0xB3,0x27, -0x23,0x00,0x02,0x24, -0x21,0xF0,0x60,0x02, -0x21,0x38,0x00,0x00, -0x34,0x00,0x62,0x10, -0x1C,0x00,0x04,0x24, -0x00,0x16,0x05,0x00, -0x03,0x16,0x02,0x00, -0x68,0x00,0x03,0x24, -0x36,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0x00,0x16,0x05,0x00, -0x03,0x16,0x02,0x00, -0x39,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0x20,0x00,0xA2,0x34, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0x78,0x00,0x03,0x24, -0x3C,0x00,0x43,0x10, -0x20,0x00,0xA6,0x30, -0x00,0x1E,0x05,0x00, -0x03,0x1E,0x03,0x00, -0x64,0x00,0x02,0x24, -0x49,0x00,0x62,0x10, -0x40,0x00,0x02,0x24, -0x81,0x00,0x62,0x10, -0x21,0x00,0x02,0x24, -0x92,0x00,0x62,0x10, -0x63,0x00,0x02,0x24, -0xA2,0x00,0x62,0x10, -0x11,0x00,0xB3,0x27, -0x10,0x00,0xA5,0xA3, -0x21,0x80,0xC0,0x03, -0x2B,0x10,0x13,0x02, -0xB4,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x6C,0x00,0x80,0x12, -0x00,0x00,0x00,0x00, -0x00,0x00,0x02,0x92, -0x01,0x00,0x10,0x26, -0x00,0x00,0x22,0xA2, -0x81,0x54,0x00,0x08, -0x01,0x00,0x31,0x26, -0x00,0x00,0xA2,0x8E, -0x04,0x00,0xB5,0x26, -0x21,0x80,0x40,0x00, -0x00,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0xA6,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x63,0x00,0x80,0x12, -0x00,0x00,0x00,0x00, -0x00,0x00,0x22,0xA2, -0x01,0x00,0x10,0x26, -0x8E,0x54,0x00,0x08, -0x01,0x00,0x31,0x26, -0x01,0x00,0x52,0x26, -0x00,0x00,0x45,0x92, -0x68,0x00,0x03,0x24, -0x00,0x16,0x05,0x00, -0x03,0x16,0x02,0x00, -0xCC,0xFF,0x43,0x14, -0x01,0x00,0x07,0x24, -0x01,0x00,0x52,0x26, -0x00,0x00,0x45,0x92, -0x00,0x00,0x00,0x00, -0x00,0x16,0x05,0x00, -0x03,0x16,0x02,0x00, -0xC9,0xFF,0x43,0x14, -0x0C,0x00,0x04,0x24, -0x01,0x00,0x52,0x26, -0x00,0x00,0x45,0x92, -0x78,0x00,0x03,0x24, -0x20,0x00,0xA2,0x34, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0xC7,0xFF,0x43,0x14, -0x04,0x00,0x04,0x24, -0x20,0x00,0xA6,0x30, -0x00,0x00,0xA5,0x8E, -0x35,0x00,0xE0,0x14, -0x04,0x00,0xB5,0x26, -0xCD,0xFF,0x80,0x04, -0x02,0x80,0x02,0x3C, -0x48,0xED,0x42,0x24, -0x00,0x00,0x47,0x8C, -0x07,0x10,0x85,0x00, -0x0F,0x00,0x42,0x30, -0x21,0x10,0x47,0x00, -0x00,0x00,0x43,0x90, -0xFC,0xFF,0x84,0x24, -0x25,0x18,0xC3,0x00, -0x00,0x00,0x63,0xA2, -0xF8,0xFF,0x81,0x04, -0x01,0x00,0x73,0x26, -0x81,0x54,0x00,0x08, -0x21,0x80,0xC0,0x03, -0x00,0x00,0xA2,0x8E, -0x04,0x00,0xB5,0x26, -0x28,0x00,0x40,0x04, -0x21,0x28,0x40,0x00, -0x21,0x80,0x60,0x02, -0x02,0x80,0x02,0x3C, -0x4C,0xED,0x42,0x24, -0x00,0x00,0x46,0x8C, -0x00,0x00,0x00,0x00, -0x18,0x00,0xA6,0x00, -0xC3,0x27,0x05,0x00, -0x10,0x10,0x00,0x00, -0x83,0x10,0x02,0x00, -0x23,0x10,0x44,0x00, -0x80,0x18,0x02,0x00, -0x21,0x18,0x62,0x00, -0x40,0x18,0x03,0x00, -0x23,0x18,0xA3,0x00, -0x30,0x00,0x63,0x24, -0x00,0x00,0x63,0xA2, -0x21,0x28,0x40,0x00, -0xF3,0xFF,0x40,0x14, -0x01,0x00,0x73,0x26, -0xE1,0x54,0x00,0x08, -0xFF,0xFF,0x63,0x26, -0x00,0x00,0x65,0x80, -0x00,0x00,0x02,0x92, -0x00,0x00,0x00,0x00, -0x00,0x00,0x62,0xA0, -0x00,0x00,0x05,0xA2, -0xFF,0xFF,0x63,0x24, -0x01,0x00,0x10,0x26, -0x2B,0x10,0x03,0x02, -0xF7,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x81,0x54,0x00,0x08, -0x21,0x80,0xC0,0x03, -0x58,0x00,0xC3,0x34, -0x30,0x00,0x02,0x24, -0x12,0x00,0xB3,0x27, -0x10,0x00,0xA2,0xA3, -0xB2,0x54,0x00,0x08, -0x11,0x00,0xA3,0xA3, -0x2D,0x00,0x02,0x24, -0x23,0x28,0x05,0x00, -0x11,0x00,0xB3,0x27, -0xC5,0x54,0x00,0x08, -0x10,0x00,0xA2,0xA3, -0x00,0x00,0x04,0x82, -0x77,0x55,0x00,0x0C, -0x01,0x00,0x10,0x26, -0x82,0x54,0x00,0x08, -0x2B,0x10,0x13,0x02, -0x00,0x00,0x04,0x82, -0x77,0x55,0x00,0x0C, -0x01,0x00,0x10,0x26, -0x8E,0x54,0x00,0x08, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA3,0x8E, -0x28,0x00,0xB0,0x27, -0x2C,0x00,0xA4,0x27, -0x2B,0x10,0x04,0x02, -0x28,0x00,0xA3,0xAF, -0x0B,0x00,0x40,0x10, -0x04,0x00,0xB5,0x26, -0x21,0xB8,0x80,0x00, -0x02,0x80,0x16,0x3C, -0x00,0x00,0x06,0x92, -0x21,0x20,0x60,0x02, -0x01,0x00,0x10,0x26, -0x24,0x55,0x00,0x0C, -0xD0,0xE3,0xC5,0x26, -0x2B,0x18,0x17,0x02, -0xF9,0xFF,0x60,0x14, -0x21,0x98,0x62,0x02, -0x80,0x54,0x00,0x08, -0xFF,0xFF,0x73,0x26, -0x00,0x00,0xA2,0x8E, -0x00,0x00,0x00,0x00, -0x06,0x00,0x56,0x24, -0x21,0x80,0x40,0x00, -0x2B,0x10,0x56,0x00, -0xF8,0xFF,0x40,0x10, -0x04,0x00,0xB5,0x26, -0x02,0x80,0x17,0x3C, -0x00,0x00,0x06,0x82, -0x21,0x20,0x60,0x02, -0x01,0x00,0x10,0x26, -0x24,0x55,0x00,0x0C, -0xD4,0xE3,0xE5,0x26, -0x2B,0x18,0x16,0x02, -0xF9,0xFF,0x60,0x14, -0x21,0x98,0x62,0x02, -0x80,0x54,0x00,0x08, -0xFF,0xFF,0x73,0x26, -0x00,0x00,0xA2,0x8E, -0x04,0x00,0xB5,0x26, -0x80,0x54,0x00,0x08, -0x10,0x00,0xA2,0xA3, -0xE8,0xFF,0xBD,0x27, -0x20,0x00,0xA6,0xAF, -0x20,0x00,0xA6,0x27, -0x10,0x00,0xBF,0xAF, -0x24,0x00,0xA7,0xAF, -0x1B,0x54,0x00,0x0C, -0x1C,0x00,0xA5,0xAF, -0x10,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x24,0x00,0xA5,0xAF, -0x28,0x00,0xA6,0xAF, -0x2C,0x00,0xA7,0xAF, -0x20,0x00,0xA4,0xAF, -0x00,0x60,0x11,0x40, -0x01,0x00,0x21,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x25,0x24,0x00,0x0C, -0xA0,0x00,0x04,0x24, -0x19,0x00,0x40,0x10, -0x21,0x80,0x40,0x00, -0x08,0x00,0x44,0x94, -0x20,0x00,0xA5,0x8F, -0x02,0x80,0x02,0x3C, -0x25,0x20,0x82,0x00, -0x20,0x00,0x84,0x24, -0x1B,0x54,0x00,0x0C, -0x24,0x00,0xA6,0x27, -0x01,0x00,0x42,0x24, -0x13,0x00,0x03,0x24, -0x81,0x00,0x44,0x2C, -0x14,0x00,0x03,0xAE, -0x17,0x00,0x80,0x14, -0x0C,0x00,0x02,0xAE, -0x00,0x60,0x01,0x40, -0x01,0x00,0x21,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x88,0x88,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x88,0x88,0x63,0x34, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x55,0x55,0x00,0x08, -0x00,0x00,0x00,0x00, -0x00,0x60,0x91,0x40, -0x99,0x99,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x99,0x99,0x63,0x34, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x30,0x09,0x00,0x0C, -0x21,0x20,0x00,0x02, -0x00,0x60,0x91,0x40, -0x5D,0x55,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x02,0x80,0x06,0x3C, -0x60,0xF3,0xC5,0x8C, -0x02,0x80,0x02,0x3C, -0x40,0xF3,0x42,0x24, -0x03,0x00,0xA3,0x30, -0x21,0x18,0x62,0x00, -0x00,0x00,0x64,0x80, -0x01,0x00,0xA5,0x24, -0x77,0x55,0x00,0x0C, -0x60,0xF3,0xC5,0xAC, -0x10,0x00,0xBF,0x8F, -0x08,0x00,0x04,0x24, -0x77,0x55,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x00,0x26,0x04,0x00, -0x03,0x26,0x04,0x00, -0x00,0x00,0x84,0x48, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x26,0x04,0x00, -0x03,0x26,0x04,0x00, -0xF7,0xFF,0x82,0x24, -0x05,0x00,0x42,0x2C, -0x06,0x00,0x40,0x14, -0x21,0x18,0x00,0x00, -0x20,0x00,0x02,0x24, -0x03,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x01,0x00,0x03,0x24, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0x00,0x60,0x02,0x40, -0x01,0x00,0x41,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x03,0x3C, -0xD4,0x5E,0x64,0xAC, -0x00,0x60,0x82,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x05,0x3C, -0x01,0x00,0x06,0x24, -0x01,0x80,0x02,0x3C, -0x04,0x30,0x86,0x00, -0xF1,0x02,0xA7,0x34, -0xED,0x02,0xA4,0x34, -0x4C,0x56,0x42,0x24, -0x18,0x03,0xA5,0x34, -0x08,0x00,0x03,0x24, -0x00,0x00,0xA2,0xAC, -0x00,0x00,0xE3,0xA0, -0x00,0x00,0x80,0xA0, -0x00,0x00,0x86,0xA0, -0x00,0x00,0x80,0xA0, -0x00,0x00,0x86,0xA0, -0x00,0x00,0x80,0xA0, -0x00,0x00,0x86,0xA0, -0x00,0x00,0x80,0xA0, -0x00,0x00,0x86,0xA0, -0x00,0x00,0x80,0xA0, -0x00,0x00,0xE0,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x82,0x8C, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0xC6,0x30, -0x10,0x00,0x02,0x24, -0x0C,0x00,0xC2,0x10, -0x11,0x00,0xC3,0x28, -0x06,0x00,0x60,0x10, -0x20,0x00,0x02,0x24, -0x08,0x00,0x02,0x24, -0x0D,0x00,0xC2,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x06,0x00,0xC2,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x85,0xA4, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x85,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x85,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x0A,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0xFF,0xFF,0xA5,0x24, -0x00,0x2C,0x05,0x00, -0xFD,0x00,0x63,0x30, -0x03,0x2C,0x05,0x00, -0xFF,0xFF,0x87,0x30, -0x00,0x00,0x43,0xA0, -0x1A,0x00,0xA0,0x04, -0x00,0x00,0x00,0x00, -0x21,0x30,0x40,0x00, -0x07,0x10,0xA7,0x00, -0x01,0x00,0x42,0x30, -0xFD,0x00,0x64,0x30, -0x00,0x00,0x42,0x38, -0x02,0x00,0x63,0x34, -0x0A,0x18,0x82,0x00, -0x00,0x00,0xC3,0xA0, -0x04,0x00,0x63,0x34, -0x00,0x00,0xC3,0xA0, -0x09,0x00,0x02,0x24, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x41,0x04, -0xFF,0xFF,0x42,0x24, -0xFB,0x00,0x63,0x30, -0x00,0x00,0xC3,0xA0, -0x04,0x00,0x02,0x24, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x41,0x04, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0xA2,0x24, -0x00,0x2C,0x02,0x00, -0x03,0x2C,0x05,0x00, -0xEA,0xFF,0xA1,0x04, -0x07,0x10,0xA7,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x0A,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0xFF,0xFF,0x84,0x24, -0x00,0x24,0x04,0x00, -0x03,0x24,0x04,0x00, -0xFF,0x00,0x65,0x30, -0x1D,0x00,0x80,0x04, -0x21,0x38,0x00,0x00, -0x21,0x30,0x40,0x00, -0x01,0x00,0x08,0x24, -0x04,0x00,0xA5,0x34, -0x00,0x00,0xC5,0xA0, -0x00,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x45,0x30, -0x01,0x00,0xA3,0x30, -0x05,0x00,0x60,0x10, -0x04,0x00,0x02,0x24, -0x04,0x10,0x88,0x00, -0x25,0x10,0x47,0x00, -0xFF,0xFF,0x47,0x30, -0x04,0x00,0x02,0x24, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x41,0x04, -0xFF,0xFF,0x42,0x24, -0xFB,0x00,0xA5,0x30, -0x00,0x00,0xC5,0xA0, -0x09,0x00,0x02,0x24, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x41,0x04, -0xFF,0xFF,0x42,0x24, -0xFF,0xFF,0x82,0x24, -0x00,0x24,0x02,0x00, -0x03,0x24,0x04,0x00, -0xE7,0xFF,0x81,0x04, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xE0,0x00, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x25,0xB0,0x10,0x3C, -0x0A,0x00,0x10,0x36, -0x18,0x00,0xBF,0xAF, -0x14,0x00,0xB1,0xAF, -0x00,0x00,0x02,0x92, -0xFF,0xFF,0x91,0x30, -0x03,0x00,0x05,0x24, -0xC0,0x00,0x42,0x30, -0x80,0x00,0x43,0x34, -0x00,0x00,0x03,0xA2, -0x04,0x00,0x63,0x34, -0x00,0x00,0x03,0xA2, -0xFB,0x00,0x63,0x30, -0x00,0x00,0x03,0xA2, -0x08,0x00,0x63,0x34, -0x00,0x00,0x03,0xA2, -0x04,0x00,0x63,0x34, -0x00,0x00,0x03,0xA2, -0xFB,0x00,0x63,0x30, -0x00,0x00,0x03,0xA2, -0xC9,0x55,0x00,0x0C, -0x06,0x00,0x04,0x24, -0x42,0x20,0x11,0x00, -0xC9,0x55,0x00,0x0C, -0x06,0x00,0x05,0x24, -0xEF,0x55,0x00,0x0C, -0x10,0x00,0x04,0x24, -0x00,0x00,0x03,0x92, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0xC0,0x00,0x63,0x30, -0x00,0x00,0x03,0xA2, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0xFF,0xFF,0xB1,0x30, -0x18,0x00,0xB2,0xAF, -0x10,0x00,0xB0,0xAF, -0x1C,0x00,0xBF,0xAF, -0x21,0x90,0xC0,0x00, -0x0A,0x00,0x20,0x12, -0xFF,0xFF,0x90,0x30, -0x16,0x56,0x00,0x0C, -0x21,0x20,0x00,0x02, -0xFE,0xFF,0x23,0x26, -0x02,0x00,0x04,0x26, -0x00,0x00,0x42,0xA6, -0xFF,0xFF,0x71,0x30, -0xFF,0xFF,0x90,0x30, -0xF8,0xFF,0x20,0x16, -0x02,0x00,0x52,0x26, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x25,0xB0,0x03,0x3C, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x34,0x00,0xBF,0xAF, -0x30,0x00,0xBE,0xAF, -0x2C,0x00,0xB7,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x0A,0x00,0x67,0x34, -0x00,0x00,0xE2,0x90, -0xFF,0xFF,0xB2,0x30, -0x21,0x98,0xC0,0x00, -0xFF,0x00,0x91,0x30, -0x20,0x00,0x40,0x12, -0xFF,0x00,0x50,0x30, -0x21,0xA0,0xE0,0x00, -0x0C,0x00,0x77,0x34, -0x0B,0x00,0x76,0x34, -0x21,0xF0,0xE0,0x00, -0xC0,0xFF,0x15,0x24, -0x25,0x10,0x15,0x02, -0xFF,0x00,0x50,0x30, -0x00,0x00,0xD1,0xA2, -0x00,0x00,0x90,0xA2, -0x00,0x00,0x82,0x92, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x50,0x30, -0xC0,0x00,0x03,0x32, -0x07,0x00,0x60,0x10, -0x21,0x20,0xC0,0x03, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x50,0x30, -0xC0,0x00,0x03,0x32, -0xFB,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x00,0x00,0xE2,0x8E, -0x04,0x00,0x23,0x26, -0x64,0x00,0x04,0x24, -0x00,0x00,0x62,0xAE, -0x25,0x22,0x00,0x0C, -0xFF,0x00,0x71,0x30, -0xFC,0xFF,0x42,0x26, -0xFF,0xFF,0x52,0x30, -0xE7,0xFF,0x40,0x16, -0x04,0x00,0x73,0x26, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xBE,0x8F, -0x2C,0x00,0xB7,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x25,0xB0,0x06,0x3C, -0x31,0x00,0xC2,0x34, -0xFF,0xFF,0x84,0x30, -0x00,0x00,0x44,0xA0, -0x32,0x00,0xC7,0x34, -0x00,0x00,0xE3,0x90, -0xFC,0xFF,0x02,0x24, -0x02,0x22,0x04,0x00, -0x24,0x18,0x62,0x00, -0x03,0x00,0x84,0x30, -0x25,0x20,0x83,0x00, -0x33,0x00,0xC6,0x34, -0x72,0x00,0x02,0x24, -0x00,0x00,0xE4,0xA0, -0x00,0x00,0xC2,0xA0, -0x00,0x00,0xC3,0x90, -0x00,0x00,0x00,0x00, -0x00,0x1E,0x03,0x00, -0x03,0x1E,0x03,0x00, -0x05,0x00,0x61,0x04, -0x21,0x10,0x00,0x00, -0xB5,0x56,0x00,0x08, -0x25,0xB0,0x02,0x3C, -0x11,0x00,0x80,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC3,0x90, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x00,0x1E,0x03,0x00, -0x03,0x1E,0x03,0x00, -0xF8,0xFF,0x61,0x04, -0x64,0x00,0x44,0x2C, -0x64,0x00,0x44,0x2C, -0x07,0x00,0x80,0x10, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x30,0x00,0x42,0x34, -0x00,0x00,0x43,0x90, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0xA3,0xA0, -0xFF,0xFF,0x02,0x24, -0x00,0x00,0xA2,0xA0, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x25,0xB0,0x06,0x3C, -0x31,0x00,0xC2,0x34, -0xFF,0xFF,0x84,0x30, -0x00,0x00,0x44,0xA0, -0x32,0x00,0xC3,0x34, -0x00,0x00,0x62,0x90, -0x02,0x22,0x04,0x00, -0x03,0x00,0x84,0x30, -0x25,0x20,0x82,0x00, -0x00,0x00,0x64,0xA0, -0x33,0x00,0xC7,0x34, -0xFF,0x00,0xA5,0x30, -0x30,0x00,0xC6,0x34, -0xF2,0xFF,0x03,0x24, -0x00,0x00,0xC5,0xA0, -0x00,0x00,0xE3,0xA0, -0x00,0x00,0xE2,0x90, -0x00,0x00,0x00,0x00, -0x00,0x16,0x02,0x00, -0x03,0x16,0x02,0x00, -0x03,0x00,0x40,0x04, -0x21,0x20,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x01,0x00,0x02,0x24, -0xDA,0x56,0x00,0x08, -0x21,0x30,0xE0,0x00, -0x0B,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC3,0x90, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x00,0x1E,0x03,0x00, -0x03,0x1E,0x03,0x00, -0xF8,0xFF,0x60,0x04, -0x64,0x00,0x82,0x2C, -0x64,0x00,0x82,0x2C, -0xF1,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x25,0xB0,0x02,0x3C, -0x18,0x00,0xB0,0xAF, -0xF8,0x02,0x45,0x34, -0x25,0xB0,0x10,0x3C, -0xFF,0x00,0x83,0x30, -0x01,0x00,0x02,0x24, -0x1C,0x00,0xBF,0xAF, -0x03,0x00,0x06,0x36, -0x0A,0x00,0x62,0x10, -0x0A,0x00,0x04,0x24, -0x00,0x00,0xA2,0x90, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB0,0x8F, -0xFE,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x20,0x00,0xBD,0x27, -0x00,0x00,0xA2,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x20,0x00,0x43,0x34, -0x20,0x00,0x42,0x30, -0x02,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC3,0xA0, -0x25,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x04,0x36, -0x00,0x00,0x82,0x90, -0xFE,0xFF,0x03,0x24, -0xF8,0x02,0x06,0x36, -0x24,0x10,0x43,0x00, -0x00,0x00,0x82,0xA0, -0x00,0x00,0xC3,0x90, -0x10,0x00,0xA5,0x27, -0x21,0x20,0x00,0x00, -0x03,0x00,0x63,0x34, -0x00,0x00,0xC3,0xA0, -0x91,0x56,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xFF,0x00,0x84,0x30, -0x21,0x38,0x00,0x00, -0x21,0x28,0x00,0x00, -0x01,0x00,0xA3,0x24, -0x07,0x10,0xA4,0x00, -0x01,0x00,0x42,0x30, -0xFF,0x00,0x65,0x30, -0x01,0x00,0xE6,0x24, -0x02,0x00,0x40,0x14, -0x04,0x00,0xA3,0x2C, -0xFF,0x00,0xC7,0x30, -0xF7,0xFF,0x60,0x14, -0x21,0x10,0xE0,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x8C,0x30, -0x21,0x48,0x00,0x00, -0x21,0x38,0x00,0x00, -0x40,0x10,0x07,0x00, -0xFF,0x00,0x42,0x30, -0x21,0x50,0x46,0x00, -0x01,0x00,0xE3,0x24, -0x07,0x10,0xEC,0x00, -0x01,0x00,0x42,0x30, -0xFF,0x00,0x67,0x30, -0x21,0x58,0x25,0x01, -0x01,0x00,0x24,0x25, -0x09,0x00,0x40,0x14, -0x04,0x00,0xE8,0x2C, -0x00,0x00,0x63,0x91, -0xFF,0x00,0x89,0x30, -0x21,0x20,0x25,0x01, -0x00,0x00,0x43,0xA1, -0x00,0x00,0x83,0x90, -0x01,0x00,0x22,0x25, -0xFF,0x00,0x49,0x30, -0x01,0x00,0x43,0xA1, -0xED,0xFF,0x00,0x15, -0x40,0x10,0x07,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xD8,0xFF,0xBD,0x27, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x24,0x00,0xBF,0xAF, -0x01,0x00,0x12,0x24, -0x21,0x80,0x00,0x00, -0x57,0x57,0x00,0x08, -0xFF,0x00,0x11,0x24, -0x91,0x56,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x10,0x00,0x40,0x10, -0x00,0x02,0x03,0x2E, -0x0F,0x00,0x60,0x10, -0x21,0x10,0x00,0x02, -0x10,0x00,0xA2,0x93, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x51,0x10, -0x0F,0x00,0x44,0x30, -0x15,0x57,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x40,0x10,0x02,0x00, -0x21,0x10,0x50,0x00, -0x01,0x00,0x42,0x24, -0xFF,0xFF,0x50,0x30, -0x21,0x20,0x00,0x02, -0xEE,0xFF,0x40,0x16, -0x10,0x00,0xA5,0x27, -0x21,0x10,0x00,0x02, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xB8,0xFF,0xBD,0x27, -0x3C,0x00,0xB7,0xAF, -0x38,0x00,0xB6,0xAF, -0x34,0x00,0xB5,0xAF, -0x30,0x00,0xB4,0xAF, -0x2C,0x00,0xB3,0xAF, -0x24,0x00,0xB1,0xAF, -0x20,0x00,0xB0,0xAF, -0x44,0x00,0xBF,0xAF, -0x40,0x00,0xBE,0xAF, -0x28,0x00,0xB2,0xAF, -0x21,0x98,0xA0,0x00, -0xFF,0x00,0x96,0x30, -0x01,0x00,0x10,0x24, -0x01,0x00,0x17,0x24, -0x21,0xA0,0x00,0x00, -0x21,0x88,0x00,0x00, -0x21,0xA8,0x00,0x00, -0x04,0x00,0xA0,0x10, -0x21,0x18,0x00,0x00, -0x10,0x00,0xC2,0x2E, -0x0E,0x00,0x40,0x14, -0x21,0x20,0xA0,0x00, -0x44,0x00,0xBF,0x8F, -0x40,0x00,0xBE,0x8F, -0x3C,0x00,0xB7,0x8F, -0x38,0x00,0xB6,0x8F, -0x34,0x00,0xB5,0x8F, -0x30,0x00,0xB4,0x8F, -0x2C,0x00,0xB3,0x8F, -0x28,0x00,0xB2,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0x08,0x00,0x06,0x24, -0xFF,0x51,0x00,0x0C, -0xFF,0x00,0x05,0x24, -0x18,0x00,0xA4,0x27, -0xFF,0x00,0x05,0x24, -0xFF,0x51,0x00,0x0C, -0x08,0x00,0x06,0x24, -0xE6,0x56,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x96,0x57,0x00,0x08, -0x10,0x00,0xBE,0x27, -0x1C,0x00,0x40,0x14, -0x21,0x20,0xA0,0x02, -0x37,0x00,0xE0,0x12, -0x00,0x02,0x22,0x2E, -0x35,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0x02,0x32, -0xF8,0xFF,0x40,0x10, -0x20,0x00,0x02,0x32, -0x21,0x20,0x20,0x02, -0x91,0x56,0x00,0x0C, -0x10,0x00,0xA5,0x27, -0x2D,0x00,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x10,0x00,0xB0,0x93, -0x00,0x00,0x00,0x00, -0x29,0x00,0x02,0x12, -0x0F,0x00,0x15,0x32, -0x15,0x57,0x00,0x0C, -0x21,0x20,0xA0,0x02, -0x02,0x81,0x10,0x00, -0x10,0x00,0x16,0x12, -0x21,0xA0,0x40,0x00, -0x40,0x10,0x14,0x00, -0x21,0x10,0x51,0x00, -0x01,0x00,0x42,0x24, -0xFF,0xFF,0x51,0x30, -0x92,0x57,0x00,0x08, -0x01,0x00,0x10,0x24, -0x18,0x00,0xA5,0x27, -0x24,0x57,0x00,0x0C, -0x21,0x30,0x60,0x02, -0x40,0x10,0x14,0x00, -0x21,0x10,0x51,0x00, -0x01,0x00,0x42,0x24, -0xFF,0xFF,0x51,0x30, -0x92,0x57,0x00,0x08, -0x01,0x00,0x10,0x24, -0x40,0x90,0x02,0x00, -0x10,0x00,0x40,0x1A, -0x21,0x80,0x00,0x00, -0x21,0x20,0x30,0x02, -0x01,0x00,0x84,0x24, -0xFF,0xFF,0x84,0x30, -0x91,0x56,0x00,0x0C, -0x10,0x00,0xA5,0x27, -0x01,0x00,0x03,0x26, -0x21,0x20,0xD0,0x03, -0xFF,0x00,0x70,0x30, -0x04,0x00,0x40,0x10, -0x2A,0x18,0x12,0x02, -0x10,0x00,0xA2,0x93, -0x00,0x00,0x00,0x00, -0x08,0x00,0x82,0xA0, -0xF3,0xFF,0x60,0x14, -0x21,0x20,0x30,0x02, -0x92,0x57,0x00,0x08, -0x20,0x00,0x10,0x24, -0xE6,0x56,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x00,0x00,0x63,0x92, -0xFF,0x00,0x02,0x24, -0x0F,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x01,0x00,0x03,0x24, -0x44,0x00,0xBF,0x8F, -0x40,0x00,0xBE,0x8F, -0x3C,0x00,0xB7,0x8F, -0x38,0x00,0xB6,0x8F, -0x34,0x00,0xB5,0x8F, -0x30,0x00,0xB4,0x8F, -0x2C,0x00,0xB3,0x8F, -0x28,0x00,0xB2,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0x01,0x00,0x62,0x92, -0x00,0x00,0x00,0x00, -0xF0,0xFF,0x43,0x14, -0x01,0x00,0x03,0x24, -0x02,0x00,0x63,0x92, -0x00,0x00,0x00,0x00, -0xEB,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x03,0x00,0x62,0x92, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0x43,0x14, -0x01,0x00,0x03,0x24, -0x04,0x00,0x63,0x92, -0x00,0x00,0x00,0x00, -0xE3,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x05,0x00,0x62,0x92, -0x00,0x00,0x00,0x00, -0xDF,0xFF,0x43,0x14, -0x00,0x00,0x00,0x00, -0x06,0x00,0x67,0x92, -0x00,0x00,0x00,0x00, -0xDC,0xFF,0xE2,0x14, -0x01,0x00,0x03,0x24, -0x07,0x00,0x62,0x92, -0x00,0x00,0x00,0x00, -0x7F,0xFF,0x47,0x10, -0x21,0x18,0x00,0x00, -0xD1,0x57,0x00,0x08, -0x01,0x00,0x03,0x24, -0xC0,0xFF,0xBD,0x27, -0x38,0x00,0xBE,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x21,0xF0,0xC0,0x00, -0xFF,0x00,0xB6,0x30, -0xFF,0xFF,0x95,0x30, -0xFF,0x00,0x05,0x24, -0x10,0x00,0xA4,0x27, -0x08,0x00,0x06,0x24, -0x34,0x00,0xB7,0xAF, -0x24,0x00,0xB3,0xAF, -0x3C,0x00,0xBF,0xAF, -0x28,0x00,0xB4,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0xFF,0x51,0x00,0x0C, -0x0F,0x00,0x17,0x24, -0x21,0x98,0x00,0x00, -0x40,0x10,0x13,0x00, -0xFF,0x00,0x52,0x30, -0x07,0x10,0x76,0x02, -0x01,0x00,0x42,0x30, -0x21,0xA0,0x5E,0x02, -0x21,0x88,0xA0,0x02, -0x21,0x20,0xA0,0x02, -0x13,0x00,0x40,0x10, -0x01,0x00,0xA3,0x26, -0x01,0x00,0x62,0x26, -0xFF,0x00,0x53,0x30, -0x04,0x00,0x63,0x2E, -0xF4,0xFF,0x60,0x14, -0x40,0x10,0x13,0x00, -0x21,0x10,0xE0,0x02, -0x3C,0x00,0xBF,0x8F, -0x38,0x00,0xBE,0x8F, -0x34,0x00,0xB7,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x40,0x00,0xBD,0x27, -0x00,0x00,0x85,0x92, -0xFF,0xFF,0x75,0x30, -0xBE,0x56,0x00,0x0C, -0x21,0x80,0xA0,0x02, -0x01,0x00,0x85,0x92, -0x21,0x20,0xA0,0x02, -0x01,0x00,0xA2,0x26, -0xBE,0x56,0x00,0x0C, -0xFF,0xFF,0x55,0x30, -0x10,0x00,0xA3,0x27, -0x21,0x90,0x72,0x00, -0x21,0x20,0x20,0x02, -0x91,0x56,0x00,0x0C, -0x21,0x28,0x40,0x02, -0x21,0x20,0x00,0x02, -0x91,0x56,0x00,0x0C, -0x01,0x00,0x45,0x26, -0x00,0x00,0x84,0x92, -0x00,0x00,0x42,0x92, -0x01,0x00,0x03,0x24, -0x04,0x18,0x63,0x02, -0x03,0x00,0x82,0x10, -0x27,0x30,0x03,0x00, -0x19,0x58,0x00,0x08, -0x24,0xB8,0xD7,0x00, -0x01,0x00,0x83,0x92, -0x01,0x00,0x42,0x92, -0x00,0x00,0x00,0x00, -0xD2,0xFF,0x62,0x10, -0x01,0x00,0x62,0x26, -0x1A,0x58,0x00,0x08, -0x24,0xB8,0xD7,0x00, -0x98,0xFF,0xBD,0x27, -0x50,0x00,0xB4,0xAF, -0xFF,0x00,0x94,0x30, -0x01,0x00,0x04,0x24, -0x64,0x00,0xBF,0xAF, -0x60,0x00,0xBE,0xAF, -0x5C,0x00,0xB7,0xAF, -0x58,0x00,0xB6,0xAF, -0x4C,0x00,0xB3,0xAF, -0x48,0x00,0xB2,0xAF, -0x44,0x00,0xB1,0xAF, -0x21,0x98,0xC0,0x00, -0xFF,0x00,0xB1,0x30, -0x54,0x00,0xB5,0xAF, -0xE6,0x56,0x00,0x0C, -0x40,0x00,0xB0,0xAF, -0x3E,0x57,0x00,0x0C, -0x01,0x00,0x16,0x24, -0x21,0x18,0x40,0x00, -0xFF,0x01,0x42,0x2C, -0x01,0x00,0x17,0x24, -0x01,0x00,0x1E,0x24, -0x21,0x90,0x00,0x00, -0x0E,0x00,0x40,0x14, -0x21,0x20,0x00,0x00, -0x64,0x00,0xBF,0x8F, -0x60,0x00,0xBE,0x8F, -0x5C,0x00,0xB7,0x8F, -0x58,0x00,0xB6,0x8F, -0x54,0x00,0xB5,0x8F, -0x50,0x00,0xB4,0x8F, -0x4C,0x00,0xB3,0x8F, -0x48,0x00,0xB2,0x8F, -0x44,0x00,0xB1,0x8F, -0x40,0x00,0xB0,0x8F, -0x21,0x10,0x80,0x00, -0x08,0x00,0xE0,0x03, -0x68,0x00,0xBD,0x27, -0xFF,0x01,0x02,0x24, -0x23,0x10,0x43,0x00, -0x1A,0x00,0xA4,0x27, -0xFF,0x00,0x05,0x24, -0x08,0x00,0x06,0x24, -0xFF,0xFF,0x50,0x30, -0x18,0x00,0xB4,0xA3, -0xFF,0x51,0x00,0x0C, -0x19,0x00,0xB1,0xA3, -0x21,0x20,0x20,0x02, -0x21,0x28,0x60,0x02, -0x24,0x57,0x00,0x0C, -0x1A,0x00,0xA6,0x27, -0x19,0x00,0xA4,0x93, -0x15,0x57,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0xA8,0x40,0x00, -0xFF,0xFF,0x42,0x30, -0x2B,0x10,0x02,0x02, -0xDF,0xFF,0x40,0x14, -0x21,0x20,0x00,0x00, -0x01,0x00,0x02,0x24, -0x09,0x00,0xC2,0x12, -0x20,0x00,0x02,0x24, -0x22,0x00,0xC2,0x12, -0x00,0x00,0x00,0x00, -0x3B,0x00,0xE0,0x12, -0x00,0x02,0x42,0x2E, -0x39,0x00,0x40,0x10, -0x01,0x00,0x02,0x24, -0xF9,0xFF,0xC2,0x16, -0x20,0x00,0x02,0x24, -0x21,0x20,0x40,0x02, -0x10,0x00,0xA5,0x27, -0x91,0x56,0x00,0x0C, -0x01,0x00,0x13,0x24, -0x41,0x00,0x40,0x10, -0xFF,0x00,0x02,0x24, -0x10,0x00,0xA5,0x93, -0x00,0x00,0x00,0x00, -0xFF,0x00,0xA4,0x30, -0x3C,0x00,0x82,0x10, -0x0F,0x00,0xA3,0x30, -0x02,0x11,0x04,0x00, -0x21,0x20,0x60,0x00, -0x29,0x00,0xA3,0xA3, -0x28,0x00,0xA2,0xA3, -0x15,0x57,0x00,0x0C, -0x11,0x00,0xA5,0xA3, -0x21,0x80,0x40,0x00, -0x28,0x00,0xA3,0x93, -0x18,0x00,0xA2,0x93, -0x00,0x00,0x00,0x00, -0x5F,0x00,0x62,0x10, -0x40,0x10,0x10,0x00, -0x21,0x10,0x52,0x00, -0x01,0x00,0x42,0x24, -0x8B,0x58,0x00,0x08, -0xFF,0xFF,0x52,0x30, -0x19,0x00,0xA5,0x93, -0x01,0x00,0x44,0x26, -0xFF,0xFF,0x84,0x30, -0xFC,0x57,0x00,0x0C, -0x1A,0x00,0xA6,0x27, -0x21,0x28,0x40,0x00, -0x0F,0x00,0x43,0x30, -0x0F,0x00,0x02,0x24, -0x12,0x00,0x62,0x10, -0x40,0x10,0x15,0x00, -0x21,0x10,0x52,0x00, -0x01,0x00,0x42,0x24, -0x21,0x20,0xA0,0x00, -0xFF,0xFF,0x52,0x30, -0x18,0x00,0xB4,0xA3, -0x15,0x57,0x00,0x0C, -0x19,0x00,0xA5,0xA3, -0x21,0xA8,0x40,0x00, -0x02,0x80,0x03,0x3C, -0x04,0xE4,0x62,0x8C, -0x02,0x80,0x04,0x3C, -0x01,0x00,0x16,0x24, -0x01,0x00,0x42,0x24, -0x04,0x00,0x43,0x28, -0xC6,0xFF,0x60,0x14, -0x04,0xE4,0x82,0xAC, -0x21,0xF0,0x00,0x00, -0xE6,0x56,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x21,0x20,0xC0,0x03, -0x64,0x00,0xBF,0x8F, -0x60,0x00,0xBE,0x8F, -0x5C,0x00,0xB7,0x8F, -0x58,0x00,0xB6,0x8F, -0x54,0x00,0xB5,0x8F, -0x50,0x00,0xB4,0x8F, -0x4C,0x00,0xB3,0x8F, -0x48,0x00,0xB2,0x8F, -0x44,0x00,0xB1,0x8F, -0x40,0x00,0xB0,0x8F, -0x21,0x10,0x80,0x00, -0x08,0x00,0xE0,0x03, -0x68,0x00,0xBD,0x27, -0x3E,0x57,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xFF,0x01,0x03,0x24, -0x23,0x18,0x62,0x00, -0xFF,0xFF,0x70,0x30, -0xFF,0xFF,0xA2,0x32, -0x2B,0x10,0x02,0x02, -0xE7,0xFF,0x40,0x14, -0x21,0x20,0x40,0x02, -0x18,0x00,0xB0,0x93, -0x19,0x00,0xA2,0x93, -0x00,0x81,0x10,0x00, -0x25,0x80,0x02,0x02, -0xFF,0x00,0x10,0x32, -0xBE,0x56,0x00,0x0C, -0x21,0x28,0x00,0x02, -0x21,0x20,0x40,0x02, -0x91,0x56,0x00,0x0C, -0x11,0x00,0xA5,0x27, -0x11,0x00,0xA3,0x93, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x64,0x30, -0x9D,0xFF,0x90,0x10, -0x20,0x00,0x16,0x24, -0xFF,0x00,0x02,0x24, -0xCD,0xFF,0x82,0x10, -0x0F,0x00,0x63,0x30, -0x02,0x11,0x04,0x00, -0x21,0x20,0x60,0x00, -0x29,0x00,0xA3,0xA3, -0x15,0x57,0x00,0x0C, -0x28,0x00,0xA2,0xA3, -0x38,0x00,0xA4,0x27, -0xFF,0x00,0x05,0x24, -0x08,0x00,0x06,0x24, -0xFF,0x51,0x00,0x0C, -0x21,0x80,0x40,0x00, -0x28,0x00,0xA4,0x93, -0x61,0x57,0x00,0x0C, -0x38,0x00,0xA5,0x27, -0x1F,0x00,0x40,0x14, -0x01,0x00,0x44,0x26, -0x40,0x10,0x10,0x00, -0x21,0x10,0x52,0x00, -0x01,0x00,0x42,0x24, -0xBE,0x58,0x00,0x08, -0xFF,0xFF,0x52,0x30, -0x40,0x88,0x10,0x00, -0x27,0x00,0x20,0x1A, -0x21,0x80,0x00,0x00, -0xFF,0x00,0x16,0x24, -0x21,0x20,0x50,0x02, -0x01,0x00,0x84,0x24, -0xFF,0xFF,0x84,0x30, -0x91,0x56,0x00,0x0C, -0x10,0x00,0xA5,0x27, -0x01,0x00,0x03,0x26, -0xFF,0x00,0x70,0x30, -0x05,0x00,0x40,0x10, -0x2A,0x18,0x11,0x02, -0x10,0x00,0xA2,0x93, -0x00,0x00,0x00,0x00, -0x26,0x10,0x56,0x00, -0x0B,0x98,0x02,0x00, -0xF3,0xFF,0x60,0x14, -0x21,0x20,0x50,0x02, -0x15,0x00,0x60,0x16, -0x21,0x10,0x32,0x02, -0x01,0x00,0x42,0x24, -0xFF,0xFF,0x52,0x30, -0x8B,0x58,0x00,0x08, -0x01,0x00,0x16,0x24, -0x29,0x00,0xA5,0x93, -0xFF,0xFF,0x84,0x30, -0xFC,0x57,0x00,0x0C, -0x38,0x00,0xA6,0x27, -0x21,0x28,0x40,0x00, -0x0F,0x00,0x43,0x30, -0x0F,0x00,0x02,0x24, -0xDB,0xFF,0x62,0x10, -0x40,0x10,0x10,0x00, -0x28,0x00,0xA4,0x93, -0x4B,0x58,0x00,0x0C, -0x38,0x00,0xA6,0x27, -0x3E,0x57,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xBE,0x58,0x00,0x08, -0x21,0x90,0x40,0x00, -0x19,0x00,0xA3,0x93, -0x29,0x00,0xA6,0x93, -0x0F,0x00,0x13,0x24, -0x0E,0x00,0x10,0x24, -0x25,0x18,0x66,0x00, -0x01,0x00,0x62,0x30, -0x0A,0x98,0x02,0x02, -0x02,0x00,0x64,0x30, -0xFD,0x00,0x62,0x32, -0x0A,0x98,0x44,0x00, -0x04,0x00,0x65,0x30, -0xFB,0x00,0x62,0x32, -0x0A,0x98,0x45,0x00, -0x08,0x00,0x63,0x30, -0xF7,0x00,0x62,0x32, -0x0A,0x98,0x43,0x00, -0x0F,0x00,0x64,0x32, -0x0F,0x00,0x16,0x24, -0x25,0x00,0x96,0x10, -0x21,0x28,0xC0,0x00, -0x01,0x00,0x44,0x26, -0xFF,0xFF,0x84,0x30, -0xFC,0x57,0x00,0x0C, -0x1A,0x00,0xA6,0x27, -0x21,0x28,0x40,0x00, -0x0F,0x00,0x42,0x30, -0x03,0x00,0x56,0x10, -0x21,0x20,0x80,0x02, -0x4B,0x58,0x00,0x0C, -0x38,0x00,0xA6,0x27, -0x19,0x00,0xA5,0x93, -0x00,0x00,0x00,0x00, -0x26,0x10,0x65,0x02, -0x01,0x00,0x42,0x30, -0x0A,0x80,0xC2,0x02, -0x26,0x18,0x65,0x02, -0x02,0x00,0x63,0x30, -0xFD,0x00,0x04,0x32, -0x0B,0x80,0x83,0x00, -0x26,0x10,0x65,0x02, -0x04,0x00,0x42,0x30, -0xFB,0x00,0x03,0x32, -0x0B,0x80,0x62,0x00, -0x26,0x28,0x65,0x02, -0x08,0x00,0xA5,0x30, -0xF7,0x00,0x02,0x32, -0x0B,0x80,0x45,0x00, -0x0F,0x00,0x03,0x32, -0x0D,0x00,0x76,0x10, -0x00,0x00,0x00,0x00, -0x3E,0x57,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0x90,0x40,0x00, -0x19,0x00,0xB0,0xA3, -0xBE,0x58,0x00,0x08, -0x18,0x00,0xB4,0xA3, -0x21,0x10,0x32,0x02, -0x01,0x00,0x42,0x24, -0xFF,0xFF,0x52,0x30, -0x01,0x00,0x16,0x24, -0x8B,0x58,0x00,0x08, -0x18,0x00,0xB4,0xA3, -0xBE,0x58,0x00,0x08, -0x21,0xB8,0x00,0x00, -0x01,0x80,0x02,0x3C, -0x25,0xB0,0x03,0x3C, -0xBC,0x65,0x42,0x24, -0x18,0x03,0x63,0x34, -0x00,0x00,0x62,0xAC, -0x00,0x00,0x83,0x90, -0x30,0x00,0x02,0x24, -0x05,0x00,0x62,0x10, -0x21,0x20,0x00,0x00, -0x31,0x00,0x02,0x24, -0x02,0x00,0x62,0x10, -0x01,0x00,0x04,0x24, -0x07,0x00,0x04,0x24, -0x93,0x55,0x00,0x08, -0x00,0x00,0x00,0x00, -0x01,0x80,0x02,0x3C, -0x25,0xB0,0x03,0x3C, -0xF8,0x65,0x42,0x24, -0x18,0x03,0x63,0x34, -0x02,0x80,0x04,0x3C, -0x00,0x00,0x62,0xAC, -0x08,0x00,0xE0,0x03, -0x14,0x5E,0x80,0xAC, -0x42,0xB0,0x02,0x3C, -0x03,0x00,0x47,0x34, -0x00,0x00,0xE3,0x90, -0xFF,0x00,0x84,0x30, -0x04,0x00,0x84,0x24, -0xFF,0x00,0x65,0x30, -0x01,0x00,0x02,0x24, -0x04,0x30,0x82,0x00, -0x07,0x18,0x85,0x00, -0x25,0xB0,0x02,0x3C, -0xE8,0x03,0x42,0x34, -0x01,0x00,0x63,0x30, -0x21,0x20,0xC0,0x00, -0x00,0x00,0x45,0xA0, -0x02,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xE6,0xA0, -0x08,0x00,0xE0,0x03, -0x24,0x10,0x85,0x00, -0x00,0x60,0x03,0x40, -0x01,0x00,0x61,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x02,0x80,0x02,0x3C, -0x08,0xE4,0x42,0x24, -0x04,0x00,0x45,0x8C, -0x00,0x00,0x82,0xAC, -0x04,0x00,0x44,0xAC, -0x00,0x00,0xA4,0xAC, -0x04,0x00,0x85,0xAC, -0x00,0x60,0x83,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x60,0x03,0x40, -0x01,0x00,0x61,0x34, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x04,0x00,0x85,0x8C, -0x00,0x00,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA2,0xAC, -0x04,0x00,0x45,0xAC, -0x00,0x00,0x84,0xAC, -0x04,0x00,0x84,0xAC, -0x00,0x60,0x83,0x40, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x85,0xAC, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x24,0x04,0x00, -0xFF,0x00,0x84,0x30, -0xC0,0x18,0x04,0x00, -0x21,0x18,0x64,0x00, -0x80,0x18,0x03,0x00, -0x21,0x18,0x64,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x21,0x18,0x62,0x00, -0x1C,0x24,0x64,0x8C, -0xFF,0xF1,0x02,0x24, -0x24,0x20,0x82,0x00, -0x08,0x00,0xE0,0x03, -0x1C,0x24,0x64,0xAC, -0x02,0x24,0x04,0x00, -0xFF,0x00,0x84,0x30, -0xC0,0x18,0x04,0x00, -0x21,0x18,0x64,0x00, -0x80,0x18,0x03,0x00, -0x21,0x18,0x64,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x21,0x18,0x62,0x00, -0x1C,0x24,0x64,0x8C, -0xFF,0xF1,0x02,0x24, -0x24,0x20,0x82,0x00, -0x00,0x02,0x84,0x34, -0x08,0x00,0xE0,0x03, -0x1C,0x24,0x64,0xAC, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0xC0,0x80,0x04,0x00, -0x21,0x80,0x04,0x02, -0x80,0x80,0x10,0x00, -0x21,0x80,0x04,0x02, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x80,0x10,0x00, -0x21,0x80,0x02,0x02, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x1C,0x24,0x05,0x8E, -0xFF,0x1F,0x02,0x3C, -0x25,0xB0,0x12,0x3C, -0xFF,0xFF,0x42,0x34, -0x14,0x24,0x02,0xAE, -0x84,0x01,0x43,0x36, -0xF8,0xFF,0x02,0x24, -0x00,0x00,0x66,0x8C, -0x24,0x28,0xA2,0x00, -0xFF,0xFE,0x02,0x24, -0x24,0x28,0xA2,0x00, -0xFF,0xEF,0x03,0x24, -0x24,0x28,0xA3,0x00, -0x18,0x24,0x06,0xAE, -0x1C,0x24,0x05,0xAE, -0xC9,0x24,0x00,0x0C, -0x21,0x88,0x80,0x00, -0x1E,0x24,0x02,0x92, -0x21,0x88,0x32,0x02, -0x1C,0x00,0xBF,0x8F, -0x60,0x01,0x22,0xA2, -0x18,0x00,0xB2,0x8F, -0x08,0x24,0x00,0xAE, -0xEC,0x23,0x00,0xAE, -0xF0,0x23,0x00,0xAE, -0xF4,0x23,0x00,0xAE, -0xF8,0x23,0x00,0xAE, -0xFC,0x23,0x00,0xAE, -0x00,0x24,0x00,0xAE, -0x04,0x24,0x00,0xAE, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xFF,0x00,0xA5,0x30, -0xC0,0x10,0x05,0x00, -0x21,0x10,0x45,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x45,0x00, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x63,0x24, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x1C,0x24,0x43,0x8C, -0x25,0xB0,0x05,0x3C, -0xFF,0x00,0xC6,0x30, -0x21,0x30,0xC5,0x00, -0xAF,0x01,0xC2,0x90, -0x07,0x00,0x63,0x30, -0x80,0x18,0x03,0x00, -0x21,0x18,0x65,0x00, -0xFF,0x00,0x88,0x30, -0xFF,0x00,0x49,0x30, -0x84,0x01,0x66,0x8C, -0x21,0x50,0x00,0x00, -0x21,0x58,0x00,0x00, -0x2B,0x00,0x20,0x11, -0x21,0x20,0x00,0x01, -0x2B,0x00,0xC0,0x10, -0x2B,0x10,0x09,0x01, -0x21,0x28,0x00,0x00, -0x2D,0x5A,0x00,0x08, -0x01,0x00,0x07,0x24, -0xFF,0x00,0x65,0x30, -0x1D,0x00,0xA2,0x2C, -0x07,0x00,0x40,0x10, -0xFF,0xFF,0x02,0x25, -0x04,0x10,0xA7,0x00, -0x24,0x10,0x46,0x00, -0xF9,0xFF,0x40,0x10, -0x01,0x00,0xA3,0x24, -0x21,0x58,0xA0,0x00, -0xFF,0xFF,0x02,0x25, -0xFF,0x00,0x45,0x30, -0x2B,0x18,0xAB,0x00, -0x0F,0x00,0x60,0x14, -0x2B,0x10,0x49,0x01, -0x01,0x00,0x04,0x24, -0x04,0x10,0xA4,0x00, -0x24,0x10,0x46,0x00, -0xFF,0xFF,0xA7,0x24, -0x04,0x00,0x40,0x10, -0x01,0x00,0x43,0x25, -0x17,0x00,0x49,0x11, -0xFF,0x00,0x6A,0x30, -0x21,0x40,0xA0,0x00, -0xFF,0x00,0xE5,0x30, -0x2B,0x10,0xAB,0x00, -0xF6,0xFF,0x40,0x10, -0x04,0x10,0xA4,0x00, -0x2B,0x10,0x49,0x01, -0x08,0x00,0x40,0x10, -0x21,0x20,0x00,0x01, -0x23,0x10,0x2A,0x01, -0x2A,0x10,0x62,0x01, -0x04,0x00,0x40,0x14, -0x21,0x20,0x00,0x00, -0x23,0x10,0x69,0x01, -0x21,0x10,0x4A,0x00, -0xFF,0x00,0x44,0x30, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0xFD,0xFF,0x40,0x14, -0x21,0x20,0x00,0x00, -0x23,0x10,0x09,0x01, -0x4E,0x5A,0x00,0x08, -0xFF,0x00,0x44,0x30, -0x21,0x20,0x00,0x01, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0xFF,0x00,0x84,0x30, -0xC0,0x10,0x04,0x00, -0x21,0x10,0x44,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x44,0x00, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x63,0x24, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x25,0xB0,0x06,0x3C, -0x1C,0x24,0x43,0x8C, -0xFF,0x00,0xA5,0x30, -0x21,0x20,0x86,0x00, -0x21,0x28,0xA6,0x00, -0x60,0x01,0x82,0x90, -0xAF,0x01,0xA4,0x90, -0x07,0x00,0x63,0x30, -0x80,0x18,0x03,0x00, -0x21,0x18,0x66,0x00, -0xFF,0x00,0x48,0x30, -0xFF,0x00,0x89,0x30, -0x84,0x01,0x66,0x8C, -0x21,0x50,0x00,0x00, -0x21,0x58,0x00,0x00, -0x2B,0x00,0x20,0x11, -0x21,0x20,0x00,0x01, -0x2B,0x00,0xC0,0x10, -0x2B,0x10,0x09,0x01, -0x21,0x28,0x00,0x00, -0x7B,0x5A,0x00,0x08, -0x01,0x00,0x07,0x24, -0xFF,0x00,0x65,0x30, -0x1D,0x00,0xA2,0x2C, -0x07,0x00,0x40,0x10, -0xFF,0xFF,0x02,0x25, -0x04,0x10,0xA7,0x00, -0x24,0x10,0x46,0x00, -0xF9,0xFF,0x40,0x10, -0x01,0x00,0xA3,0x24, -0x21,0x58,0xA0,0x00, -0xFF,0xFF,0x02,0x25, -0xFF,0x00,0x45,0x30, -0x2B,0x18,0xAB,0x00, -0x0F,0x00,0x60,0x14, -0x2B,0x10,0x49,0x01, -0x01,0x00,0x04,0x24, -0x04,0x10,0xA4,0x00, -0x24,0x10,0x46,0x00, -0xFF,0xFF,0xA7,0x24, -0x04,0x00,0x40,0x10, -0x01,0x00,0x43,0x25, -0x17,0x00,0x49,0x11, -0xFF,0x00,0x6A,0x30, -0x21,0x40,0xA0,0x00, -0xFF,0x00,0xE5,0x30, -0x2B,0x10,0xAB,0x00, -0xF6,0xFF,0x40,0x10, -0x04,0x10,0xA4,0x00, -0x2B,0x10,0x49,0x01, -0x08,0x00,0x40,0x10, -0x21,0x20,0x00,0x01, -0x23,0x10,0x2A,0x01, -0x2A,0x10,0x62,0x01, -0x04,0x00,0x40,0x14, -0x21,0x20,0x00,0x00, -0x23,0x10,0x69,0x01, -0x21,0x10,0x4A,0x00, -0xFF,0x00,0x44,0x30, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0xFD,0xFF,0x40,0x14, -0x21,0x20,0x00,0x00, -0x23,0x10,0x09,0x01, -0x9C,0x5A,0x00,0x08, -0xFF,0x00,0x44,0x30, -0x21,0x20,0x00,0x01, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x80,0x00, -0xE0,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x10,0x00,0xB0,0xAF, -0x30,0x1F,0x50,0x24, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x1C,0x00,0xBF,0xAF, -0x21,0x88,0x00,0x00, -0x21,0x90,0x00,0x02, -0xDD,0x59,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x1E,0x24,0x02,0x92, -0x21,0x28,0x00,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x52,0x00, -0x60,0x05,0x44,0x8C, -0xD4,0x05,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x21,0x18,0x64,0x00, -0x42,0x18,0x03,0x00, -0xE8,0x23,0x03,0xAE, -0x21,0x10,0x05,0x02, -0x01,0x00,0xA5,0x24, -0x1D,0x00,0xA3,0x28, -0x5A,0x24,0x40,0xA0, -0x20,0x24,0x40,0xA0, -0xFA,0xFF,0x60,0x14, -0x3D,0x24,0x40,0xA0, -0x01,0x00,0x31,0x26, -0x20,0x00,0x22,0x2A, -0x78,0x24,0x00,0xAE, -0xE9,0xFF,0x40,0x14, -0x94,0x00,0x10,0x26, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x28,0x00,0xB6,0xAF, -0x02,0x80,0x16,0x3C, -0x24,0x00,0xB5,0xAF, -0x30,0x1F,0xC6,0x26, -0x2C,0x00,0xBF,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x30,0x38,0xC2,0x8C, -0xFF,0x00,0x8D,0x30, -0xFF,0x00,0x03,0x24, -0xFF,0xFF,0x42,0x38, -0x21,0xA8,0x00,0x00, -0xFF,0xFF,0x04,0x34, -0x0A,0xA8,0x62,0x00, -0xA4,0x00,0xA0,0x11, -0x30,0x38,0xC4,0xAC, -0x02,0x80,0x02,0x3C, -0xE4,0xE7,0x45,0x24, -0x04,0x05,0xC4,0x24, -0xEB,0x5A,0x00,0x08, -0x21,0x80,0x00,0x00, -0x01,0x00,0x10,0x26, -0x00,0x00,0x82,0xA0, -0x1D,0x00,0x02,0x2A, -0x0B,0x00,0x40,0x10, -0x01,0x00,0x84,0x24, -0x21,0x10,0x05,0x02, -0x00,0x00,0x42,0x90, -0x00,0x00,0x00,0x00, -0xF7,0xFF,0x40,0x10, -0xFD,0xFF,0x43,0x24, -0x01,0x00,0x10,0x26, -0x1D,0x00,0x02,0x2A, -0x00,0x00,0x83,0xA0, -0xF7,0xFF,0x40,0x14, -0x01,0x00,0x84,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x4A,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x7C,0xE5,0x6C,0x24, -0x04,0xE5,0x4B,0x24, -0x21,0x80,0x00,0x00, -0x21,0x48,0x00,0x00, -0x21,0x30,0x00,0x00, -0x21,0x40,0x2A,0x01, -0x21,0x38,0x2C,0x01, -0x21,0x10,0xE6,0x00, -0x91,0x00,0x44,0x90, -0x00,0x00,0x45,0x90, -0x21,0x18,0x06,0x01, -0x01,0x00,0xC6,0x24, -0x05,0x00,0xC2,0x28, -0x39,0x04,0x64,0xA0, -0xF8,0xFF,0x40,0x14, -0xA8,0x03,0x65,0xA0, -0x21,0x10,0x0B,0x02, -0x1D,0x00,0x44,0x90, -0x00,0x00,0x45,0x90, -0x21,0x18,0x0A,0x02, -0x01,0x00,0x10,0x26, -0x1D,0x00,0x02,0x2A, -0xE7,0x04,0x64,0xA0, -0xCA,0x04,0x65,0xA0, -0xEB,0xFF,0x40,0x14, -0x05,0x00,0x29,0x25, -0x9A,0x00,0xA0,0x11, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x48,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x78,0xE8,0x69,0x24, -0x04,0xE8,0x47,0x24, -0x21,0x80,0x00,0x00, -0x80,0x18,0x10,0x00, -0x21,0x10,0x69,0x00, -0x21,0x20,0x67,0x00, -0x00,0x00,0x46,0x8C, -0x00,0x00,0x85,0x8C, -0x01,0x00,0x10,0x26, -0x21,0x18,0x68,0x00, -0x04,0x00,0x02,0x2A, -0x60,0x05,0x65,0xAC, -0xF6,0xFF,0x40,0x14, -0xD4,0x05,0x66,0xAC, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x49,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x78,0xE8,0x68,0x24, -0x04,0xE8,0x47,0x24, -0x04,0x00,0x10,0x24, -0x80,0x20,0x10,0x00, -0x21,0x10,0x88,0x00, -0x21,0x30,0x87,0x00, -0x00,0x00,0x45,0x8C, -0x00,0x00,0xC3,0x8C, -0x01,0x00,0x10,0x26, -0x21,0x20,0x89,0x00, -0x82,0x28,0x05,0x00, -0x82,0x18,0x03,0x00, -0x1D,0x00,0x02,0x2A, -0x60,0x05,0x83,0xAC, -0xF4,0xFF,0x40,0x14, -0xD4,0x05,0x85,0xAC, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x53,0x24, -0x21,0x80,0x00,0x00, -0x21,0xA0,0x60,0x02, -0x21,0x90,0x00,0x00, -0x46,0x5B,0x00,0x08, -0x21,0x88,0x60,0x02, -0x01,0x00,0x10,0x26, -0x20,0x00,0x02,0x2A, -0x94,0x00,0x31,0x26, -0x32,0x00,0x40,0x10, -0x94,0x00,0x52,0x26, -0x1C,0x24,0x24,0x8E, -0x01,0x00,0x03,0x24, -0x02,0x13,0x04,0x00, -0x01,0x00,0x42,0x30, -0xF6,0xFF,0x43,0x14, -0x07,0x00,0x82,0x30, -0x25,0xB0,0x03,0x3C, -0x80,0x10,0x02,0x00, -0x21,0x10,0x43,0x00, -0x84,0x01,0x45,0x8C, -0x14,0x24,0x23,0x8E, -0x21,0x20,0x00,0x02, -0x24,0x28,0xA3,0x00, -0xC9,0x24,0x00,0x0C, -0x18,0x24,0x25,0xAE, -0x1E,0x24,0x24,0x92, -0x57,0x24,0x00,0x0C, -0xFF,0x00,0x05,0x32, -0x1E,0x24,0x23,0x92, -0xEC,0x23,0x20,0xAE, -0xF0,0x23,0x20,0xAE, -0x80,0x18,0x03,0x00, -0xF4,0x23,0x20,0xAE, -0xF8,0x23,0x20,0xAE, -0xFC,0x23,0x20,0xAE, -0x00,0x24,0x20,0xAE, -0x04,0x24,0x20,0xAE, -0x08,0x24,0x20,0xAE, -0x21,0x18,0x74,0x00, -0x60,0x05,0x64,0x8C, -0xD4,0x05,0x62,0x8C, -0x21,0x30,0x00,0x00, -0x21,0x28,0x53,0x02, -0x21,0x10,0x44,0x00, -0x42,0x10,0x02,0x00, -0xE8,0x23,0x22,0xAE, -0x21,0x10,0xA6,0x00, -0x01,0x00,0xC6,0x24, -0x1D,0x00,0xC3,0x28, -0x5A,0x24,0x40,0xA0, -0x20,0x24,0x40,0xA0, -0xFA,0xFF,0x60,0x14, -0x3D,0x24,0x40,0xA0, -0x01,0x00,0x10,0x26, -0x20,0x00,0x02,0x2A, -0x78,0x24,0xA0,0xAC, -0x94,0x00,0x31,0x26, -0xD0,0xFF,0x40,0x14, -0x94,0x00,0x52,0x26, -0x02,0x00,0xA0,0x16, -0x30,0x1F,0xC2,0x26, -0x30,0x38,0x40,0xAC, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0xE4,0xE7,0x45,0x24, -0x04,0x05,0xC4,0x24, -0x21,0x80,0x00,0x00, -0x21,0x10,0x05,0x02, -0x00,0x00,0x43,0x90, -0x01,0x00,0x10,0x26, -0x1D,0x00,0x02,0x2A, -0x00,0x00,0x83,0xA0, -0xFA,0xFF,0x40,0x14, -0x01,0x00,0x84,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x4A,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xA0,0xE6,0x6C,0x24, -0x40,0xE5,0x4B,0x24, -0x21,0x80,0x00,0x00, -0x21,0x48,0x00,0x00, -0x21,0x30,0x00,0x00, -0x21,0x40,0x2A,0x01, -0x21,0x38,0x2C,0x01, -0x21,0x10,0xE6,0x00, -0x91,0x00,0x44,0x90, -0x00,0x00,0x45,0x90, -0x21,0x18,0x06,0x01, -0x01,0x00,0xC6,0x24, -0x05,0x00,0xC2,0x28, -0x39,0x04,0x64,0xA0, -0xF8,0xFF,0x40,0x14, -0xA8,0x03,0x65,0xA0, -0x21,0x10,0x0B,0x02, -0x1D,0x00,0x44,0x90, -0x00,0x00,0x45,0x90, -0x21,0x18,0x0A,0x02, -0x01,0x00,0x10,0x26, -0x1D,0x00,0x02,0x2A, -0xE7,0x04,0x64,0xA0, -0xCA,0x04,0x65,0xA0, -0xEB,0xFF,0x40,0x14, -0x05,0x00,0x29,0x25, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x49,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x78,0xE8,0x68,0x24, -0x04,0xE8,0x47,0x24, -0x21,0x80,0x00,0x00, -0x80,0x18,0x10,0x00, -0x21,0x10,0x68,0x00, -0x21,0x20,0x67,0x00, -0x00,0x00,0x46,0x8C, -0x00,0x00,0x85,0x8C, -0x01,0x00,0x10,0x26, -0x21,0x18,0x69,0x00, -0x1D,0x00,0x02,0x2A, -0x60,0x05,0x65,0xAC, -0xF6,0xFF,0x40,0x14, -0xD4,0x05,0x66,0xAC, -0x3B,0x5B,0x00,0x08, -0x02,0x80,0x02,0x3C, -0xD8,0xFF,0xBD,0x27, -0xFF,0xFF,0x84,0x30, -0x18,0x00,0xB2,0xAF, -0xF0,0x01,0x92,0x30, -0x02,0x91,0x12,0x00, -0x14,0x00,0xB1,0xAF, -0xC0,0x88,0x12,0x00, -0x21,0x88,0x32,0x02, -0x80,0x88,0x11,0x00, -0x21,0x88,0x32,0x02, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x88,0x11,0x00, -0x21,0x88,0x22,0x02, -0x20,0x00,0xBF,0xAF, -0x1C,0x00,0xB3,0xAF, -0x10,0x00,0xB0,0xAF, -0x1C,0x24,0x30,0x8E, -0x00,0x02,0x82,0x30, -0xFF,0xFE,0x03,0x24, -0x2B,0x10,0x02,0x00, -0x00,0x10,0x10,0x36, -0x24,0x80,0x03,0x02, -0x00,0x12,0x02,0x00, -0x25,0x80,0x02,0x02, -0x14,0x24,0x25,0xAE, -0x1C,0x24,0x30,0xAE, -0x76,0x25,0x00,0x0C, -0x21,0x98,0xA0,0x00, -0xF8,0xFF,0x03,0x24, -0x24,0x80,0x03,0x02, -0x07,0x00,0x42,0x30, -0x25,0x80,0x02,0x02, -0x07,0x00,0x03,0x32, -0x25,0xB0,0x02,0x3C, -0x80,0x18,0x03,0x00, -0x1C,0x24,0x30,0xAE, -0x21,0x18,0x62,0x00, -0x84,0x01,0x62,0x8C, -0x21,0x20,0x40,0x02, -0x24,0x10,0x53,0x00, -0xC9,0x24,0x00,0x0C, -0x18,0x24,0x22,0xAE, -0x1E,0x24,0x24,0x92, -0x21,0x28,0x40,0x02, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x57,0x24,0x00,0x08, -0x28,0x00,0xBD,0x27, -0xDD,0x59,0x00,0x08, -0xFF,0x00,0x84,0x30, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x43,0x24, -0x1F,0x00,0x04,0x24, -0x1C,0x24,0x62,0x8C, -0xFF,0xFF,0x84,0x24, -0x00,0x10,0x42,0x34, -0x1C,0x24,0x62,0xAC, -0xFB,0xFF,0x81,0x04, -0x94,0x00,0x63,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x00,0x00,0x85,0xAC, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x44,0x00,0x02,0x24, -0x10,0x00,0xA2,0xA3, -0x49,0x00,0x03,0x24, -0x47,0x00,0x02,0x24, -0x02,0x80,0x07,0x3C, -0xD4,0xF3,0xE7,0x24, -0x11,0x00,0xA3,0xA3, -0x12,0x00,0xA2,0xA3, -0x10,0x27,0x03,0x24, -0x01,0x00,0x02,0x24, -0x01,0x80,0x06,0x3C, -0x10,0x00,0xA5,0x27, -0x21,0x20,0xE0,0x00, -0x20,0x73,0xC6,0x24, -0x0C,0x00,0xE3,0xAC, -0x14,0x00,0xE2,0xA0, -0x18,0x00,0xBF,0xAF, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD0,0xFF,0xBD,0x27, -0x25,0xB0,0x03,0x3C, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x2C,0x00,0xBF,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x03,0x0D,0x64,0x34, -0x00,0x00,0x82,0x90, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x54,0x30, -0x70,0x00,0x93,0x32, -0x5D,0x00,0x60,0x12, -0x42,0x00,0x63,0x34, -0x8F,0x00,0x82,0x32, -0x00,0x00,0x82,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x55,0x00,0x60,0x12, -0x00,0x00,0x00,0x00, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x0F,0x00,0x11,0x3C, -0x21,0x20,0x00,0x00, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x25,0x36, -0x21,0xA8,0x40,0x00, -0x00,0x60,0x92,0x40, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x21,0x20,0x00,0x00, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x25,0x36, -0x21,0xB0,0x40,0x00, -0x00,0x60,0x92,0x40, -0x64,0x00,0x04,0x24, -0x54,0x22,0x00,0x0C, -0x08,0x00,0x10,0x3C, -0xFF,0xFF,0x10,0x36, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x01,0x00,0x12,0x3C, -0x24,0x30,0xB0,0x02, -0x25,0x30,0xD2,0x00, -0xFF,0xFF,0x25,0x36, -0x5F,0x47,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x24,0x80,0xD0,0x02, -0xE6,0x44,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x25,0x30,0x12,0x02, -0xFF,0xFF,0x25,0x36, -0x5F,0x47,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x0F,0x00,0x10,0x3C, -0x18,0x00,0x04,0x24, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x05,0x36, -0x21,0x88,0x40,0x00, -0x00,0x60,0x92,0x40, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x18,0x00,0x04,0x24, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x00,0x80,0x26,0x36, -0x25,0x22,0x00,0x0C, -0x03,0x00,0x04,0x24, -0x25,0x00,0x60,0x16, -0x25,0xB0,0x02,0x3C, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x25,0xB0,0x02,0x3C, -0x42,0x00,0x42,0x34, -0x30,0x00,0xBD,0x27, -0x00,0x00,0x40,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x02,0x24, -0x00,0x00,0x62,0xA0, -0x00,0x60,0x12,0x40, -0x01,0x00,0x41,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x0F,0x00,0x10,0x3C, -0x18,0x00,0x04,0x24, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x05,0x36, -0x21,0x88,0x40,0x00, -0x00,0x60,0x92,0x40, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x18,0x00,0x04,0x24, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x00,0x80,0x26,0x36, -0x25,0x22,0x00,0x0C, -0x03,0x00,0x04,0x24, -0xDD,0xFF,0x60,0x12, -0x25,0xB0,0x02,0x3C, -0x03,0x0D,0x42,0x34, -0x00,0x00,0x54,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x0F,0x00,0x10,0x3C, -0x21,0x30,0xA0,0x02, -0xFF,0xFF,0x05,0x36, -0x5F,0x47,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x01,0x00,0x04,0x24, -0xFF,0xFF,0x05,0x36, -0x21,0x30,0xC0,0x02, -0x5F,0x47,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x20,0x00,0x00, -0xE6,0x44,0x00,0x08, -0x30,0x00,0xBD,0x27, -0xC8,0xFF,0xBD,0x27, -0x28,0x00,0xB4,0xAF, -0x02,0x80,0x14,0x3C, -0x30,0x00,0xB6,0xAF, -0x34,0x00,0xBF,0xAF, -0x2C,0x00,0xB5,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x30,0x1F,0x85,0x26, -0x0C,0x00,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x82,0x17,0x02,0x00, -0x01,0x00,0x42,0x30, -0x08,0x00,0x40,0x14, -0x06,0x00,0x16,0x24, -0x08,0x00,0xA2,0x8C, -0x01,0x00,0x03,0x24, -0x42,0x17,0x02,0x00, -0x03,0x00,0x42,0x30, -0x57,0x00,0x43,0x10, -0x25,0xB0,0x02,0x3C, -0x30,0x1F,0x85,0x26, -0x0C,0x00,0xA2,0x8C, -0x01,0x00,0x03,0x24, -0x82,0x17,0x02,0x00, -0x01,0x00,0x44,0x30, -0x0B,0x00,0x83,0x10, -0x21,0x10,0x00,0x00, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x08,0x00,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x42,0x17,0x02,0x00, -0x03,0x00,0x43,0x30, -0xF1,0xFF,0x64,0x14, -0x21,0x10,0x00,0x00, -0x10,0x00,0xA2,0x8C, -0x00,0x00,0x00,0x00, -0x82,0x17,0x02,0x00, -0x50,0x02,0x43,0x10, -0x25,0xB0,0x02,0x3C, -0xC7,0x02,0xB3,0x90, -0x62,0x0C,0x42,0x34, -0xFF,0x00,0x63,0x32, -0x00,0x00,0x43,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x90,0x26, -0xC6,0x02,0x02,0x92, -0x00,0x00,0x00,0x00, -0x83,0x00,0x40,0x10, -0x01,0x00,0x02,0x24, -0x25,0xB0,0x11,0x3C, -0x03,0x0D,0x23,0x36, -0x00,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x70,0x00,0x42,0x30, -0xA9,0x00,0x40,0x14, -0xCC,0x00,0x02,0x24, -0xC4,0x02,0x02,0x96, -0x00,0x00,0x00,0x00, -0x23,0x20,0x53,0x00, -0x2B,0x18,0x53,0x00, -0x23,0x10,0x62,0x02, -0x0A,0x10,0x83,0x00, -0x03,0x00,0x42,0x2C, -0x76,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xC4,0x02,0x03,0x92, -0x63,0x0C,0x22,0x36, -0x21,0x20,0x00,0x00, -0x00,0x00,0x43,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x30,0x1F,0x83,0x26, -0xC3,0x02,0x62,0x90, -0x08,0x00,0x66,0x8C, -0xC2,0x02,0x73,0xA0, -0x23,0x20,0x53,0x00, -0x02,0x2C,0x06,0x00, -0x2B,0x40,0x62,0x02, -0x23,0x90,0x62,0x02, -0x0B,0x90,0x88,0x00, -0x3F,0x00,0xA7,0x30, -0x3F,0x00,0xC6,0x30, -0x24,0x00,0x02,0x24, -0x20,0x00,0x03,0x24, -0x23,0x10,0x46,0x00, -0x91,0x00,0x40,0x16, -0x23,0x20,0x67,0x00, -0xE6,0x5C,0x00,0x08, -0x00,0x00,0x00,0x00, -0x80,0x0C,0x42,0x34, -0x00,0x00,0x43,0x8C, -0x21,0x30,0xA0,0x00, -0xC0,0xFF,0x02,0x3C, -0x24,0x20,0x62,0x00, -0x21,0x88,0x00,0x00, -0xC0,0xFF,0x05,0x3C, -0x42,0x5D,0x00,0x08, -0x18,0x00,0xC3,0x24, -0x01,0x00,0x31,0x26, -0x25,0x00,0x22,0x2E, -0x0D,0x00,0x40,0x10, -0x02,0x80,0x02,0x3C, -0x00,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x45,0x00, -0xF8,0xFF,0x44,0x14, -0x04,0x00,0x63,0x24, -0x08,0x00,0xC2,0x8C, -0xC0,0xFF,0x03,0x24, -0x3F,0x00,0x24,0x32, -0x24,0x10,0x43,0x00, -0x25,0x10,0x44,0x00, -0x08,0x00,0xC2,0xAC, -0x02,0x80,0x02,0x3C, -0xDE,0x5D,0x44,0x90, -0x22,0x00,0x03,0x24, -0x42,0x00,0x83,0x10, -0x92,0x00,0x02,0x24, -0x41,0x00,0x82,0x10, -0x25,0xB0,0x02,0x3C, -0x25,0xB0,0x02,0x3C, -0x24,0x0A,0x42,0x34, -0x00,0x00,0x44,0x8C, -0x3F,0x3F,0x03,0x3C, -0x3F,0x3F,0x63,0x34, -0x24,0x20,0x83,0x00, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xDE,0x1F,0x53,0x24, -0xE6,0x20,0x72,0x24, -0x21,0x88,0x00,0x00, -0x69,0x5D,0x00,0x08, -0x10,0x00,0xA4,0xAF, -0x39,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x4B,0x00,0x40,0x10, -0x30,0x1F,0x85,0x26, -0x01,0x00,0x31,0x26, -0x21,0x00,0x22,0x2E, -0x17,0x00,0x40,0x10, -0x30,0x1F,0x82,0x26, -0xC0,0x80,0x11,0x00, -0x10,0x00,0xA4,0x27, -0x21,0x28,0x13,0x02, -0x39,0x52,0x00,0x0C, -0x04,0x00,0x06,0x24, -0x21,0x28,0x12,0x02, -0x10,0x00,0xA4,0x27, -0xF0,0xFF,0x40,0x14, -0x04,0x00,0x06,0x24, -0x30,0x1F,0x85,0x26, -0x08,0x00,0xA3,0x8C, -0xC0,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x3F,0x00,0x24,0x32, -0x24,0x18,0x62,0x00, -0x00,0x24,0x04,0x00, -0xFF,0x7F,0x02,0x3C, -0x25,0x18,0x64,0x00, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x08,0x00,0xA3,0xAC, -0x30,0x1F,0x82,0x26, -0x0C,0x00,0x43,0x8C, -0x00,0x40,0x04,0x3C, -0x30,0x1F,0x85,0x26, -0x25,0x18,0x64,0x00, -0x0C,0x00,0x43,0xAC, -0x0C,0x00,0xA2,0x8C, -0x01,0x00,0x03,0x24, -0x82,0x17,0x02,0x00, -0x01,0x00,0x44,0x30, -0x5D,0xFF,0x83,0x14, -0x21,0x10,0x00,0x00, -0xF0,0x5C,0x00,0x08, -0x00,0x00,0x00,0x00, -0xC6,0x02,0x02,0xA2, -0x0A,0x5D,0x00,0x08, -0xC4,0x02,0x13,0xA6, -0x23,0x5C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x1A,0x5D,0x00,0x08, -0xC4,0x02,0x13,0xA6, -0x25,0xB0,0x02,0x3C, -0x88,0x0C,0x42,0x34, -0x00,0x00,0x44,0x8C, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x66,0x24, -0xC0,0xFF,0x02,0x3C, -0x24,0x20,0x82,0x00, -0x21,0x88,0x00,0x00, -0xC0,0xFF,0x05,0x3C, -0xA2,0x5D,0x00,0x08, -0x18,0x00,0xC3,0x24, -0x01,0x00,0x31,0x26, -0x25,0x00,0x22,0x2E, -0xB4,0xFF,0x40,0x10, -0x25,0xB0,0x02,0x3C, -0x00,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x24,0x10,0x45,0x00, -0xF8,0xFF,0x44,0x14, -0x04,0x00,0x63,0x24, -0x08,0x00,0xC2,0x8C, -0x3F,0x00,0x23,0x32, -0xFF,0xC0,0x04,0x24, -0x24,0x10,0x44,0x00, -0x00,0x1A,0x03,0x00, -0x25,0x10,0x43,0x00, -0x54,0x5D,0x00,0x08, -0x08,0x00,0xC2,0xAC, -0x08,0x00,0xA3,0x8C, -0xC0,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x3F,0x00,0x24,0x32, -0x24,0x18,0x62,0x00, -0x00,0x24,0x04,0x00, -0x25,0x18,0x64,0x00, -0x00,0x80,0x02,0x3C, -0x7D,0x5D,0x00,0x08, -0x25,0x18,0x62,0x00, -0x63,0x0C,0x23,0x36, -0x00,0x00,0x62,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x24,0x5D,0x00,0x08, -0x30,0x1F,0x83,0x26, -0x71,0x01,0x00,0x11, -0x23,0x28,0xF2,0x00, -0x2B,0x10,0x42,0x02, -0x21,0x18,0xD2,0x00, -0x00,0x00,0x42,0x38, -0x24,0x00,0x08,0x24, -0x2B,0x20,0x44,0x02, -0x0B,0x40,0x62,0x00, -0x06,0x00,0x80,0x10, -0x20,0x00,0x15,0x24, -0x30,0x1F,0x83,0x26, -0x0A,0x00,0x62,0x94, -0x00,0x00,0x00,0x00, -0x3F,0x00,0x42,0x30, -0x21,0xA8,0x52,0x00, -0x2B,0x28,0xC8,0x02, -0x5E,0x01,0xA0,0x10, -0x30,0x1F,0x82,0x26, -0x80,0x10,0x08,0x00, -0x30,0x1F,0x83,0x26, -0x21,0x10,0x43,0x00, -0x18,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x82,0x25,0x04,0x00, -0x30,0x1F,0x86,0x26, -0x0C,0x00,0xC3,0x8C, -0x00,0x00,0x00,0x00, -0xFF,0x03,0x67,0x30, -0x47,0x01,0xE0,0x10, -0x00,0x02,0x62,0x30, -0x04,0x00,0x40,0x10, -0x18,0x00,0xE4,0x00, -0x00,0xFC,0x02,0x24, -0x25,0x38,0xE2,0x00, -0x18,0x00,0xE4,0x00, -0x82,0x82,0x03,0x00, -0xFF,0x03,0x10,0x32, -0x00,0x02,0x03,0x32, -0x12,0x10,0x00,0x00, -0x02,0x12,0x02,0x00, -0x03,0x00,0x60,0x10, -0xFF,0x03,0x45,0x30, -0x00,0xFC,0x02,0x24, -0x25,0x80,0x02,0x02, -0x18,0x00,0x04,0x02, -0x80,0x1D,0x04,0x00, -0x25,0xB0,0x11,0x3C, -0x80,0x0C,0x24,0x36, -0x94,0x0C,0x31,0x36, -0x12,0x80,0x00,0x00, -0x02,0x82,0x10,0x00, -0x3F,0x00,0x02,0x32, -0x00,0x14,0x02,0x00, -0x25,0x18,0x62,0x00, -0x25,0x18,0x65,0x00, -0x21,0x28,0x60,0x00, -0x02,0x5C,0x00,0x0C, -0x10,0x00,0xA3,0xAF, -0x00,0x00,0x23,0x8E, -0xFF,0x0F,0x02,0x3C, -0xC0,0x03,0x10,0x32, -0xFF,0xFF,0x42,0x34, -0x24,0x18,0x62,0x00, -0x80,0x85,0x10,0x00, -0x25,0x18,0x70,0x00, -0x21,0x20,0x20,0x02, -0x21,0x28,0x60,0x00, -0x10,0x00,0xA3,0xAF, -0x02,0x5C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x83,0x26, -0x08,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0xB9,0x00,0x40,0x04, -0xC0,0x28,0x15,0x00, -0x21,0x10,0xA3,0x00, -0xAC,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x22,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xAD,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x23,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xAE,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x24,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xAF,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x25,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB0,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x26,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB1,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x27,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB2,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x28,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB3,0x00,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x29,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x02,0x80,0x02,0x3C, -0xDE,0x5D,0x44,0x90, -0x22,0x00,0x03,0x24, -0x03,0x00,0x83,0x10, -0x92,0x00,0x02,0x24, -0x73,0xFE,0x82,0x14, -0x21,0x10,0x00,0x00, -0x30,0x1F,0x82,0x26, -0x08,0x00,0x43,0x8C, -0x01,0x00,0x44,0x3A, -0x24,0x00,0x02,0x24, -0x02,0x1A,0x03,0x00, -0x3F,0x00,0x63,0x30, -0x01,0x00,0x84,0x30, -0xF3,0x00,0x80,0x10, -0x23,0x28,0x43,0x00, -0x42,0x18,0x12,0x00, -0x40,0x10,0x03,0x00, -0x21,0x90,0x43,0x00, -0x30,0x1F,0x83,0x26, -0xC3,0x02,0x62,0x90, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x62,0x02, -0xB8,0x00,0x40,0x10, -0x2B,0x10,0x45,0x02, -0x06,0x00,0x40,0x10, -0x24,0x00,0x06,0x24, -0x08,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x02,0x12,0x02,0x00, -0x3F,0x00,0x42,0x30, -0x21,0x30,0x52,0x00, -0x2B,0x28,0xC6,0x02, -0xB8,0x00,0xA0,0x10, -0x30,0x1F,0x82,0x26, -0x80,0x10,0x06,0x00, -0x30,0x1F,0x83,0x26, -0x21,0x10,0x43,0x00, -0x18,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x82,0x25,0x04,0x00, -0x30,0x1F,0x83,0x26, -0x10,0x00,0x70,0x8C, -0x00,0x00,0x00,0x00, -0x82,0x3A,0x10,0x00, -0xFF,0x03,0xE7,0x30, -0xC5,0x00,0xE0,0x10, -0x00,0x02,0xE2,0x30, -0x04,0x00,0x40,0x10, -0x18,0x00,0xE4,0x00, -0x00,0xFC,0x02,0x24, -0x25,0x38,0xE2,0x00, -0x18,0x00,0xE4,0x00, -0x02,0x85,0x10,0x00, -0xFF,0x03,0x10,0x32, -0x00,0x02,0x03,0x32, -0x12,0x10,0x00,0x00, -0x02,0x12,0x02,0x00, -0x03,0x00,0x60,0x10, -0xFF,0x03,0x45,0x30, -0x00,0xFC,0x02,0x24, -0x25,0x80,0x02,0x02, -0x18,0x00,0x04,0x02, -0x80,0x1D,0x04,0x00, -0x25,0xB0,0x11,0x3C, -0x88,0x0C,0x24,0x36, -0x9C,0x0C,0x31,0x36, -0x12,0x80,0x00,0x00, -0x02,0x82,0x10,0x00, -0x3F,0x00,0x02,0x32, -0x00,0x14,0x02,0x00, -0x25,0x18,0x62,0x00, -0x25,0x18,0x65,0x00, -0x21,0x28,0x60,0x00, -0x02,0x5C,0x00,0x0C, -0x10,0x00,0xA3,0xAF, -0x00,0x00,0x23,0x8E, -0xFF,0x0F,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xC0,0x03,0x10,0x32, -0x24,0x18,0x62,0x00, -0x80,0x85,0x10,0x00, -0x25,0x18,0x70,0x00, -0x21,0x20,0x20,0x02, -0x21,0x28,0x60,0x00, -0x02,0x5C,0x00,0x0C, -0x10,0x00,0xA3,0xAF, -0xE6,0x5C,0x00,0x08, -0x21,0x10,0x00,0x00, -0x21,0x10,0xA3,0x00, -0xB4,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x22,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB5,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x23,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB6,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x24,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB7,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x25,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB8,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x26,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xB9,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x27,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xBA,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x28,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x42,0x24, -0x30,0x1F,0x82,0x26, -0x21,0x10,0xA2,0x00, -0xBB,0x01,0x44,0x90, -0x25,0xB0,0x03,0x3C, -0x29,0x0A,0x63,0x34, -0x00,0x00,0x64,0xA0, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x6E,0x5E,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x36,0x00,0xA0,0x10, -0x80,0x10,0x08,0x00, -0x21,0x10,0x46,0x00, -0x18,0x00,0x45,0x8C, -0x25,0xB0,0x04,0x3C, -0x02,0x5C,0x00,0x0C, -0x80,0x0C,0x84,0x34, -0x25,0xB0,0x04,0x3C, -0x94,0x0C,0x84,0x34, -0x07,0x5E,0x00,0x08, -0x21,0x28,0x00,0x00, -0x30,0x00,0x43,0x8C, -0xDB,0x5D,0x00,0x08, -0x82,0x25,0x03,0x00, -0x23,0x20,0xD2,0x00, -0x2B,0x10,0x46,0x02, -0x2B,0x18,0x47,0x02, -0x21,0x40,0x00,0x00, -0x21,0xA8,0x00,0x00, -0x0B,0x40,0x82,0x00, -0xD2,0x5D,0x00,0x08, -0x0B,0xA8,0xA3,0x00, -0x08,0x00,0x62,0x8C, -0x00,0x00,0x00,0x00, -0x02,0x12,0x02,0x00, -0x3F,0x00,0x42,0x30, -0x2B,0x18,0x42,0x02, -0x4A,0xFF,0x60,0x14, -0x23,0x30,0x52,0x00, -0x21,0x30,0x00,0x00, -0x21,0x28,0x00,0x00, -0x30,0x1F,0x82,0x26, -0x30,0x00,0x43,0x8C, -0x96,0x5E,0x00,0x08, -0x82,0x25,0x03,0x00, -0x0F,0x00,0x11,0x3C, -0xFF,0xFF,0x25,0x36, -0x60,0x00,0x06,0x24, -0x5F,0x47,0x00,0x0C, -0x24,0x00,0x04,0x24, -0x25,0x22,0x00,0x0C, -0xE8,0x03,0x04,0x24, -0x00,0x60,0x10,0x40, -0x01,0x00,0x01,0x36, -0x01,0x00,0x21,0x38, -0x00,0x60,0x81,0x40, -0x24,0x00,0x04,0x24, -0x8A,0x47,0x00,0x0C, -0xFF,0xFF,0x25,0x36, -0x1F,0x00,0x53,0x30, -0x00,0x60,0x90,0x40, -0x54,0x22,0x00,0x0C, -0x64,0x00,0x04,0x24, -0x06,0x5D,0x00,0x08, -0x30,0x1F,0x90,0x26, -0x30,0x00,0xC5,0x8C, -0x2C,0x5F,0x00,0x08, -0x25,0xB0,0x04,0x3C, -0x13,0x00,0xA0,0x10, -0x00,0x00,0x00,0x00, -0x80,0x10,0x06,0x00, -0x21,0x10,0x43,0x00, -0x18,0x00,0x45,0x8C, -0x25,0xB0,0x04,0x3C, -0x02,0x5C,0x00,0x0C, -0x88,0x0C,0x84,0x34, -0x25,0xB0,0x04,0x3C, -0x9C,0x0C,0x84,0x34, -0x02,0x5C,0x00,0x0C, -0x21,0x28,0x00,0x00, -0xE6,0x5C,0x00,0x08, -0x21,0x10,0x00,0x00, -0xFF,0xFF,0x43,0x26, -0x42,0x18,0x03,0x00, -0x40,0x10,0x03,0x00, -0x21,0x10,0x43,0x00, -0x80,0x5E,0x00,0x08, -0x01,0x00,0x52,0x24, -0x30,0x00,0x65,0x8C, -0x67,0x5F,0x00,0x08, -0x25,0xB0,0x04,0x3C, -0x00,0xFF,0x84,0x30, -0x02,0x22,0x04,0x00, -0x08,0x00,0x80,0x10, -0x02,0x80,0x02,0x3C, -0xFF,0x00,0x02,0x24, -0x04,0x00,0x82,0x10, -0xCC,0xFF,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x16,0x22,0x43,0xA0, -0x02,0x80,0x02,0x3C, -0x08,0x00,0xE0,0x03, -0x16,0x22,0x44,0xA0, -0x02,0x24,0x04,0x00, -0xFF,0x00,0x84,0x30, -0xC0,0x10,0x04,0x00, -0x21,0x10,0x44,0x00, -0x80,0x10,0x02,0x00, -0x21,0x10,0x44,0x00, -0x02,0x80,0x03,0x3C, -0x80,0x10,0x02,0x00, -0x30,0x1F,0x63,0x24, -0x20,0x00,0x84,0x2C, -0x09,0x00,0x80,0x10, -0x21,0x10,0x43,0x00, -0x0C,0x24,0x43,0x8C, -0x25,0xB0,0x02,0x3C, -0x74,0x03,0x42,0x34, -0x02,0x19,0x03,0x00, -0x7F,0x00,0x63,0x30, -0x00,0x00,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xB0,0x55,0x43,0x8C, -0x25,0xB0,0x02,0x3C, -0x74,0x03,0x42,0x34, -0x02,0x19,0x03,0x00, -0x7F,0x00,0x63,0x30, -0x00,0x00,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x85,0x30, -0xD2,0xFF,0xA3,0x24, -0xFE,0xFF,0xA2,0x24, -0xDA,0xFF,0xA4,0x24, -0x04,0x00,0x63,0x2C, -0x08,0x00,0x84,0x2C, -0x06,0x00,0x60,0x14, -0xFF,0x00,0x42,0x30, -0xF0,0xFF,0xA2,0x24, -0xFC,0xFF,0xA3,0x24, -0x16,0x00,0x46,0x2C, -0x03,0x00,0x80,0x10, -0xFF,0x00,0x62,0x30, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xFA,0xFF,0xA3,0x24, -0xFC,0xFF,0xC0,0x10, -0x21,0x10,0xA0,0x00, -0x08,0x00,0xE0,0x03, -0xFF,0x00,0x62,0x30, -0x25,0xB0,0x03,0x3C, -0x03,0x0D,0x63,0x34, -0x00,0x00,0x62,0x90, -0x21,0x20,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x08,0x00,0x42,0x34, -0x00,0x00,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x25,0xB0,0x03,0x3C, -0x03,0x0D,0x63,0x34, -0x00,0x00,0x62,0x90, -0x21,0x20,0x00,0x00, -0xF7,0x00,0x42,0x30, -0x00,0x00,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x25,0xB0,0x03,0x3C, -0x2D,0x0A,0x63,0x34, -0x00,0x00,0x62,0x90, -0x21,0x20,0x00,0x00, -0x3F,0x00,0x42,0x30, -0x00,0x00,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x82,0x24, -0x25,0xB0,0x03,0x3C, -0x2D,0x0A,0x63,0x34, -0x00,0x00,0x62,0x90, -0x21,0x20,0x00,0x00, -0xFF,0x00,0x42,0x30, -0x80,0x00,0x42,0x34, -0x00,0x00,0x62,0xA0, -0x01,0x00,0x82,0x24, -0xFF,0x00,0x44,0x30, -0x06,0x00,0x83,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0xFF,0x00,0x03,0x3C, -0x82,0x01,0x49,0x34, -0x81,0x01,0x48,0x34, -0x24,0x10,0x83,0x00, -0x02,0x3C,0x02,0x00, -0x00,0xFF,0x63,0x34, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x45,0x24, -0x02,0x32,0x04,0x00, -0x01,0x00,0x02,0x24, -0x24,0x20,0x83,0x00, -0xE6,0x1D,0xA2,0xA0, -0xD4,0x1D,0xA0,0xAC, -0xD8,0x1D,0xA0,0xAC, -0xDC,0x1D,0xA0,0xAC, -0x06,0x00,0x80,0x14, -0xE0,0x1D,0xA0,0xAC, -0x00,0x00,0x02,0x91, -0x00,0x00,0x23,0x91, -0xE4,0x1D,0xA2,0xA0, -0x08,0x00,0xE0,0x03, -0xE5,0x1D,0xA3,0xA0, -0xE5,0x1D,0xA7,0xA0, -0x08,0x00,0xE0,0x03, -0xE4,0x1D,0xA6,0xA0, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x63,0x24, -0xE5,0x1D,0x66,0x90, -0xE4,0x1D,0x65,0x90, -0x25,0xB0,0x02,0x3C, -0x82,0x01,0x44,0x34, -0x81,0x01,0x42,0x34, -0x00,0x00,0x45,0xA0, -0x00,0x00,0x86,0xA0, -0x08,0x00,0xE0,0x03, -0xE6,0x1D,0x60,0xA0, -0x02,0x80,0x08,0x3C, -0x30,0x1F,0x04,0x25, -0xE6,0x1D,0x82,0x90, -0x00,0x00,0x00,0x00, -0x15,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0xD8,0x1D,0x82,0x8C, -0xD4,0x1D,0x85,0x8C, -0x25,0xB0,0x03,0x3C, -0x40,0x11,0x02,0x00, -0x2B,0x10,0xA2,0x00, -0x82,0x01,0x67,0x34, -0x0F,0x00,0x40,0x10, -0x81,0x01,0x66,0x34, -0xE5,0x1D,0x83,0x90, -0xE4,0x1D,0x82,0x90, -0xF0,0x00,0x63,0x30, -0x1F,0x00,0x42,0x30, -0x00,0x00,0xC2,0xA0, -0x00,0x00,0xE3,0xA0, -0x30,0x1F,0x02,0x25, -0x01,0x00,0x03,0x24, -0xE0,0x1D,0x40,0xAC, -0xD4,0x1D,0x40,0xAC, -0xD8,0x1D,0x40,0xAC, -0xDC,0x1D,0x40,0xAC, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x60,0x00, -0xDC,0x1D,0x82,0x8C, -0x25,0xB0,0x03,0x3C, -0x82,0x01,0x69,0x34, -0x40,0x11,0x02,0x00, -0x2B,0x10,0xA2,0x00, -0x0E,0x00,0x40,0x14, -0x81,0x01,0x66,0x34, -0xE0,0x1D,0x82,0x8C, -0x00,0x00,0x00,0x00, -0x40,0x11,0x02,0x00, -0x2B,0x10,0xA2,0x00, -0x08,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0xE5,0x1D,0x83,0x90, -0xE4,0x1D,0x82,0x90, -0x00,0x00,0x00,0x00, -0x00,0x00,0xC2,0xA0, -0x00,0x00,0x23,0xA1, -0x20,0x60,0x00,0x08, -0x30,0x1F,0x02,0x25, -0xE5,0x1D,0x83,0x90, -0xE4,0x1D,0x82,0x90, -0xF0,0x00,0x63,0x30, -0x7F,0x00,0x42,0x30, -0x00,0x00,0xC2,0xA0, -0x00,0x00,0x23,0xA1, -0x20,0x60,0x00,0x08, -0x30,0x1F,0x02,0x25, -0x00,0x00,0x85,0xAC, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x03,0x3C, -0x33,0x02,0x65,0x34, -0x00,0x11,0x04,0x00, -0x00,0x00,0xA2,0xA0, -0x30,0x02,0x63,0x34, -0x00,0x00,0x65,0x8C, -0x0F,0x00,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x28,0xA2,0x00, -0x01,0x00,0x03,0x24, -0x04,0x18,0x83,0x00, -0x02,0x00,0xA0,0x10, -0x21,0x10,0x00,0x00, -0xFF,0xFF,0x62,0x30, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x25,0xB0,0x11,0x3C, -0x18,0x00,0xB2,0xAF, -0x4C,0x00,0x22,0x36, -0x1C,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0x44,0x90, -0x02,0x80,0x03,0x3C, -0x02,0x00,0x02,0x24, -0xFF,0x00,0x84,0x30, -0x07,0x00,0x82,0x10, -0x30,0x1F,0x72,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x8A,0x36,0x43,0x96, -0x01,0x00,0x02,0x24, -0xF7,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0x43,0x90, -0x00,0x00,0x00,0x00, -0xF2,0xFF,0x60,0x14, -0x21,0x20,0x00,0x00, -0x4C,0x60,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x04,0x00,0x04,0x24, -0x4C,0x60,0x00,0x0C, -0x21,0x80,0x40,0x00, -0x25,0x80,0x02,0x02, -0x02,0x80,0x04,0x3C, -0x33,0x02,0x23,0x36, -0x08,0x00,0x02,0x24, -0xFF,0xFF,0x10,0x32, -0x40,0x00,0x27,0x36, -0xEC,0xE8,0x84,0x24, -0x00,0x00,0x62,0xA0, -0xE3,0xFF,0x00,0x16, -0x00,0x00,0x00,0x00, -0x00,0x00,0xE2,0x94, -0x88,0x36,0x43,0x96, -0xFF,0xDF,0x42,0x30, -0x01,0x00,0x63,0x24, -0x00,0x20,0x46,0x34, -0x88,0x36,0x43,0xA6, -0xFF,0xFF,0x65,0x30, -0x00,0x00,0xE2,0xA4, -0x00,0x00,0xE6,0xA4, -0x2F,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x69,0x60,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0x21,0x20,0x82,0x00, -0x00,0x00,0x85,0xAC, -0x21,0x10,0x00,0x00, -0x01,0x00,0x42,0x24, -0xFF,0x00,0x42,0x30, -0x06,0x00,0x43,0x2C, -0xFC,0xFF,0x60,0x14, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0xDF,0x2F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x10,0x00,0xBF,0x8F, -0x02,0x80,0x02,0x3C, -0xE8,0x03,0x03,0x24, -0x34,0x5F,0x43,0xAC, -0x18,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xFA,0x5E,0x40,0xA0, -0xFF,0x00,0x85,0x30, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x0C,0x5F,0x60,0xA0, -0x08,0x00,0xA4,0x2C, -0x0E,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x16,0x5F,0x60,0xA0, -0xF4,0x5E,0x45,0xA0, -0x2C,0x00,0x80,0x10, -0x02,0x80,0x03,0x3C, -0x80,0x10,0x05,0x00, -0x94,0xF0,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x02,0x80,0x05,0x3C, -0x30,0x1F,0xA5,0x24, -0xD0,0x1B,0xA4,0x8C, -0x00,0x70,0x02,0x3C, -0x02,0x00,0x42,0x34, -0x25,0x20,0x82,0x00, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x64,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA4,0xAC, -0x02,0x80,0x05,0x3C, -0x30,0x1F,0xA5,0x24, -0xD0,0x1B,0xA4,0x8C, -0x00,0x70,0x02,0x3C, -0x02,0x00,0x42,0x34, -0x27,0x10,0x02,0x00, -0x24,0x20,0x82,0x00, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x64,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA4,0xAC, -0x02,0x80,0x05,0x3C, -0x30,0x1F,0xA5,0x24, -0xD0,0x1B,0xA4,0x8C, -0x00,0x70,0x02,0x3C, -0x27,0x10,0x02,0x00, -0x24,0x20,0x82,0x00, -0x02,0x80,0x07,0x3C, -0x41,0xB0,0x02,0x3C, -0x01,0x00,0x03,0x24, -0x00,0x00,0x44,0xAC, -0x10,0x5F,0xE3,0xA0, -0x10,0x5F,0xE6,0x90, -0x02,0x80,0x02,0x3C, -0xD0,0x1B,0xA4,0xAC, -0x11,0x5F,0x46,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x80,0x05,0x3C, -0x30,0x1F,0xA5,0x24, -0xD0,0x1B,0xA4,0x8C, -0x00,0x70,0x02,0x3C, -0x27,0x10,0x02,0x00, -0x24,0x20,0x82,0x00, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x64,0xAC, -0x08,0x00,0xE0,0x03, -0xD0,0x1B,0xA4,0xAC, -0xE0,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x10,0x3C, -0xF4,0x5E,0x02,0x92, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x1C,0x00,0xBF,0xAF, -0x21,0x90,0x80,0x00, -0x1C,0x00,0x40,0x10, -0xFF,0x00,0xB1,0x30, -0x02,0x80,0x03,0x3C, -0xDE,0x5D,0x62,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0x42,0x30, -0x1C,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x00,0x08,0x04,0x24, -0x00,0x02,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x02,0x80,0x03,0x3C, -0xF6,0x5E,0x62,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x42,0x30, -0x0C,0x00,0x42,0x28, -0x06,0x00,0x40,0x10, -0x08,0x00,0x02,0x24, -0x00,0x00,0x44,0x96, -0x00,0x00,0x00,0x00, -0x0C,0x00,0x83,0x30, -0x1B,0x00,0x62,0x10, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0x02,0x92, -0x05,0x00,0x03,0x24, -0xFF,0x00,0x42,0x30, -0x0B,0x00,0x43,0x10, -0x02,0x80,0x03,0x3C, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x9B,0x30,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x0C,0x61,0x00,0x08, -0x00,0x08,0x04,0x24, -0x0F,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x24,0x10,0x22,0x02, -0xF2,0xFF,0x40,0x10, -0x02,0x80,0x03,0x3C, -0x0E,0x5F,0x62,0x90, -0x00,0x00,0x00,0x00, -0x04,0x00,0x42,0x34, -0x0E,0x5F,0x62,0xA0, -0x20,0x61,0x00,0x08, -0x00,0x00,0x00,0x00, -0x0D,0x5F,0x43,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x60,0x14, -0x00,0x10,0x82,0x34, -0x1B,0x61,0x00,0x08, -0x00,0x00,0x42,0xA6, -0x0C,0x00,0x04,0x24, -0x64,0x31,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x1B,0x61,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0xFF,0x00,0xA5,0x30, -0x10,0x00,0xB0,0xAF, -0x14,0x00,0xBF,0xAF, -0x18,0x00,0xA0,0x14, -0xFF,0x00,0x90,0x30, -0x2C,0x00,0x00,0x12, -0x01,0x00,0x05,0x24, -0x02,0x80,0x03,0x3C, -0x01,0x00,0x07,0x24, -0x0C,0x5F,0x67,0xA0, -0x02,0x80,0x08,0x3C, -0x0E,0x5F,0x02,0x91, -0x02,0x00,0x04,0x24, -0x21,0x28,0x00,0x00, -0x02,0x00,0x42,0x34, -0x00,0xF0,0x06,0x34, -0x0E,0x5F,0x02,0xA1, -0x8C,0x23,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x42,0xB0,0x02,0x3C, -0x44,0x00,0x03,0x24, -0x03,0x00,0x42,0x34, -0x18,0x00,0xBD,0x27, -0x00,0x00,0x43,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x01,0x00,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x0C,0x5F,0x43,0xA0, -0x02,0x80,0x02,0x3C, -0x0F,0x5F,0x43,0x90, -0x0F,0x00,0x02,0x24, -0x02,0x80,0x05,0x3C, -0x0F,0x00,0x63,0x30, -0x07,0x00,0x62,0x10, -0x01,0x00,0x04,0x24, -0x0E,0x5F,0xA2,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x34, -0x0E,0x5F,0xA2,0xA0, -0xFE,0x4E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xDB,0xFF,0x00,0x16, -0x02,0x80,0x03,0x3C, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x0C,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x64,0x90, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0xFF,0x00,0x84,0x30, -0x64,0x31,0x00,0x08, -0x18,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0xFF,0x00,0xA5,0x30, -0x14,0x00,0xB1,0xAF, -0x18,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x03,0x00,0xA0,0x14, -0xFF,0x00,0x91,0x30, -0x3A,0x00,0x20,0x12, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x10,0x3C, -0x0E,0x5F,0x02,0x92, -0xFB,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x0E,0x5F,0x02,0xA2, -0x10,0x00,0xA0,0x14, -0x02,0x80,0x03,0x3C, -0x0E,0x5F,0x02,0x92, -0xFE,0xFF,0x03,0x24, -0x24,0x10,0x43,0x00, -0x0E,0x5F,0x02,0xA2, -0x19,0x00,0x20,0x16, -0x02,0x80,0x02,0x3C, -0x0E,0x5F,0x02,0x92, -0xFD,0xFF,0x03,0x24, -0x18,0x00,0xBF,0x8F, -0x24,0x10,0x43,0x00, -0x0E,0x5F,0x02,0xA2, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x01,0x00,0x04,0x24, -0x0C,0x5F,0x64,0xA0, -0x0E,0x5F,0x02,0x92, -0x02,0x80,0x03,0x3C, -0x01,0x00,0x42,0x34, -0x0E,0x5F,0x02,0xA2, -0x0D,0x5F,0x62,0x90, -0x02,0x00,0x03,0x24, -0xFF,0x00,0x42,0x30, -0x23,0x00,0x43,0x10, -0x00,0x00,0x00,0x00, -0xFE,0x4E,0x00,0x0C, -0x01,0x00,0x04,0x24, -0xE9,0xFF,0x20,0x12, -0x02,0x80,0x02,0x3C, -0x01,0x00,0x04,0x24, -0x0C,0x5F,0x44,0xA0, -0x0E,0x5F,0x03,0x92, -0x02,0x00,0x04,0x24, -0x21,0x28,0x00,0x00, -0x02,0x00,0x63,0x34, -0x00,0xF0,0x06,0x34, -0x0E,0x5F,0x03,0xA2, -0x8C,0x23,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x42,0xB0,0x02,0x3C, -0x44,0x00,0x03,0x24, -0x03,0x00,0x42,0x34, -0x20,0x00,0xBD,0x27, -0x00,0x00,0x43,0xA0, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x0C,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0xF5,0x5E,0x64,0x90, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x05,0x24, -0xFF,0x00,0x84,0x30, -0x64,0x31,0x00,0x08, -0x20,0x00,0xBD,0x27, -0x0D,0x30,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x0C,0x00,0x04,0x24, -0x64,0x31,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x90,0x61,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB2,0xAF, -0x0C,0x00,0xB1,0xAF, -0x08,0x00,0xB0,0xAF, -0x21,0x40,0xE0,0x00, -0x21,0x90,0xA0,0x03, -0x21,0x60,0xC0,0x00, -0x21,0x78,0x80,0x00, -0x45,0x00,0xE0,0x14, -0x21,0x50,0xA0,0x00, -0x2B,0x10,0xA6,0x00, -0x78,0x00,0x40,0x10, -0xFF,0xFF,0x02,0x34, -0x2B,0x10,0x46,0x00, -0x8F,0x01,0x40,0x10, -0x21,0x28,0xC0,0x00, -0xFF,0x00,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x10,0x00,0x03,0x24, -0x2B,0x10,0x46,0x00, -0x18,0x00,0x04,0x24, -0x21,0x30,0x60,0x00, -0x0B,0x30,0x82,0x00, -0x02,0x80,0x03,0x3C, -0x06,0x10,0xC5,0x00, -0xB4,0xF0,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x90, -0x20,0x00,0x02,0x24, -0x21,0x20,0x86,0x00, -0x23,0x30,0x44,0x00, -0x08,0x00,0xC0,0x10, -0x02,0x4C,0x0C,0x00, -0x23,0x10,0x46,0x00, -0x06,0x10,0x4F,0x00, -0x04,0x18,0xCA,0x00, -0x25,0x50,0x62,0x00, -0x04,0x60,0xCC,0x00, -0x04,0x78,0xCF,0x00, -0x02,0x4C,0x0C,0x00, -0x1B,0x00,0x49,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0x87,0x31, -0x02,0x24,0x0F,0x00, -0x12,0x18,0x00,0x00, -0x10,0x28,0x00,0x00, -0x00,0x14,0x05,0x00, -0x25,0x28,0x44,0x00, -0x18,0x00,0x67,0x00, -0x12,0x58,0x00,0x00, -0x2B,0x18,0xAB,0x00, -0x00,0x00,0x00,0x00, -0x1B,0x00,0x49,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x08,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0x21,0x28,0xAC,0x00, -0x2B,0x10,0xAC,0x00, -0x04,0x00,0x40,0x14, -0x2B,0x10,0xAB,0x00, -0x00,0x00,0x42,0x38, -0x21,0x18,0xAC,0x00, -0x0B,0x28,0x62,0x00, -0x23,0x28,0xAB,0x00, -0x1B,0x00,0xA9,0x00, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0xE4,0x31, -0x12,0x18,0x00,0x00, -0x10,0x40,0x00,0x00, -0x00,0x00,0x00,0x00, -0x8F,0x62,0x00,0x08, -0x18,0x00,0x67,0x00, -0x2B,0x10,0xA7,0x00, -0x0A,0x00,0x40,0x10, -0xFF,0xFF,0x02,0x34, -0x10,0x00,0xB2,0x8F, -0x0C,0x00,0xB1,0x8F, -0x08,0x00,0xB0,0x8F, -0x21,0x10,0x80,0x00, -0x21,0x18,0xA0,0x00, -0x00,0x00,0xA4,0xAF, -0x04,0x00,0xA5,0xAF, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x2B,0x10,0x47,0x00, -0xD2,0x00,0x40,0x10, -0x00,0x01,0xE3,0x2C, -0xFF,0x00,0x02,0x3C, -0x10,0x00,0x03,0x24, -0xFF,0xFF,0x42,0x34, -0x2B,0x10,0x47,0x00, -0x18,0x00,0x04,0x24, -0x21,0x28,0x60,0x00, -0x0B,0x28,0x82,0x00, -0x06,0x10,0xA8,0x00, -0x02,0x80,0x03,0x3C, -0xB4,0xF0,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x90, -0x20,0x00,0x02,0x24, -0x21,0x20,0x85,0x00, -0x23,0x30,0x44,0x00, -0xCE,0x00,0xC0,0x14, -0x23,0x38,0x46,0x00, -0x2B,0x10,0x0A,0x01, -0x04,0x00,0x40,0x14, -0x23,0x20,0xEC,0x01, -0x2B,0x10,0xEC,0x01, -0x05,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x2B,0x10,0xE4,0x01, -0x23,0x18,0x48,0x01, -0x23,0x50,0x62,0x00, -0x21,0x78,0x80,0x00, -0x04,0x00,0x40,0x12, -0x21,0xC0,0xE0,0x01, -0x21,0xC8,0x40,0x01, -0x00,0x00,0x58,0xAE, -0x04,0x00,0x59,0xAE, -0x00,0x00,0xA2,0x8F, -0x04,0x00,0xA3,0x8F, -0x10,0x00,0xB2,0x8F, -0x0C,0x00,0xB1,0x8F, -0x08,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x53,0x00,0xC0,0x10, -0x01,0x00,0x02,0x24, -0xFF,0xFF,0x02,0x34, -0x2B,0x10,0x4C,0x00, -0x59,0x00,0x40,0x14, -0xFF,0x00,0x02,0x3C, -0x00,0x01,0x83,0x2D, -0x08,0x00,0x02,0x24, -0x21,0x28,0x00,0x00, -0x0A,0x28,0x43,0x00, -0x06,0x10,0xAC,0x00, -0x02,0x80,0x03,0x3C, -0xB4,0xF0,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x90, -0x20,0x00,0x02,0x24, -0x21,0x20,0x85,0x00, -0x23,0x30,0x44,0x00, -0x5B,0x00,0xC0,0x14, -0x00,0x00,0x00,0x00, -0x23,0x50,0x4C,0x01, -0x02,0x4C,0x0C,0x00, -0xFF,0xFF,0x8D,0x31, -0x1B,0x00,0x49,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x02,0x24,0x0F,0x00, -0x12,0x18,0x00,0x00, -0x10,0x28,0x00,0x00, -0x00,0x14,0x05,0x00, -0x25,0x28,0x44,0x00, -0x18,0x00,0x6D,0x00, -0x12,0x58,0x00,0x00, -0x2B,0x18,0xAB,0x00, -0x00,0x00,0x00,0x00, -0x1B,0x00,0x49,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x08,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0x21,0x28,0xAC,0x00, -0x2B,0x10,0xAC,0x00, -0x04,0x00,0x40,0x14, -0x2B,0x10,0xAB,0x00, -0x00,0x00,0x42,0x38, -0x21,0x18,0xAC,0x00, -0x0B,0x28,0x62,0x00, -0x23,0x28,0xAB,0x00, -0x1B,0x00,0xA9,0x00, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0xE4,0x31, -0x12,0x18,0x00,0x00, -0x10,0x40,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x18,0x00,0x6D,0x00, -0x00,0x14,0x08,0x00, -0x12,0x58,0x00,0x00, -0x25,0x40,0x44,0x00, -0x2B,0x18,0x0B,0x01, -0x1B,0x00,0xA9,0x00, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x08,0x00,0x60,0x10, -0x00,0x00,0x00,0x00, -0x21,0x40,0x0C,0x01, -0x2B,0x10,0x0C,0x01, -0x04,0x00,0x40,0x14, -0x2B,0x10,0x0B,0x01, -0x21,0x18,0x0C,0x01, -0x00,0x00,0x42,0x38, -0x0B,0x40,0x62,0x00, -0xAB,0xFF,0x40,0x12, -0x23,0x78,0x0B,0x01, -0x06,0xC0,0xCF,0x00, -0x21,0xC8,0x00,0x00, -0x00,0x00,0x58,0xAE, -0x4C,0x62,0x00,0x08, -0x04,0x00,0x59,0xAE, -0x1B,0x00,0x47,0x00, -0x02,0x00,0xE0,0x14, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0x02,0x34, -0x12,0x60,0x00,0x00, -0x2B,0x10,0x4C,0x00, -0xAB,0xFF,0x40,0x10, -0x00,0x01,0x83,0x2D, -0xFF,0x00,0x02,0x3C, -0x10,0x00,0x03,0x24, -0xFF,0xFF,0x42,0x34, -0x2B,0x10,0x4C,0x00, -0x18,0x00,0x04,0x24, -0x21,0x28,0x60,0x00, -0x0B,0x28,0x82,0x00, -0x02,0x80,0x03,0x3C, -0x06,0x10,0xAC,0x00, -0xB4,0xF0,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x90, -0x20,0x00,0x02,0x24, -0x21,0x20,0x85,0x00, -0x23,0x30,0x44,0x00, -0xA7,0xFF,0xC0,0x10, -0x00,0x00,0x00,0x00, -0x23,0x38,0x46,0x00, -0x04,0x60,0xCC,0x00, -0x06,0x58,0xEA,0x00, -0x02,0x4C,0x0C,0x00, -0x1B,0x00,0x69,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0x8D,0x31, -0x06,0x18,0xEF,0x00, -0x04,0x10,0xCA,0x00, -0x25,0x50,0x43,0x00, -0x02,0x24,0x0A,0x00, -0x12,0x28,0x00,0x00, -0x10,0x40,0x00,0x00, -0x00,0x14,0x08,0x00, -0x25,0x40,0x44,0x00, -0x18,0x00,0xAD,0x00, -0x12,0x28,0x00,0x00, -0x2B,0x18,0x05,0x01, -0x00,0x00,0x00,0x00, -0x1B,0x00,0x69,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x05,0x00,0x60,0x10, -0x04,0x78,0xCF,0x00, -0x21,0x40,0x0C,0x01, -0x2B,0x10,0x0C,0x01, -0x93,0x00,0x40,0x10, -0x2B,0x10,0x05,0x01, -0x23,0x40,0x05,0x01, -0x1B,0x00,0x09,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0x44,0x31, -0x12,0x18,0x00,0x00, -0x10,0x58,0x00,0x00, -0x00,0x14,0x0B,0x00, -0x25,0x58,0x44,0x00, -0x18,0x00,0x6D,0x00, -0x12,0x28,0x00,0x00, -0x2B,0x18,0x65,0x01, -0x00,0x00,0x00,0x00, -0x1B,0x00,0x09,0x01, -0x02,0x00,0x20,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x77,0xFF,0x60,0x10, -0x23,0x50,0x65,0x01, -0x21,0x58,0x6C,0x01, -0x2B,0x10,0x6C,0x01, -0x04,0x00,0x40,0x14, -0x2B,0x10,0x65,0x01, -0x00,0x00,0x42,0x38, -0x21,0x18,0x6C,0x01, -0x0B,0x58,0x62,0x00, -0x6A,0x62,0x00,0x08, -0x23,0x50,0x65,0x01, -0x08,0x00,0x02,0x24, -0x21,0x28,0x00,0x00, -0x0A,0x28,0x43,0x00, -0x02,0x80,0x03,0x3C, -0x06,0x10,0xA8,0x00, -0xB4,0xF0,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x90, -0x20,0x00,0x02,0x24, -0x21,0x20,0x85,0x00, -0x23,0x30,0x44,0x00, -0x34,0xFF,0xC0,0x10, -0x23,0x38,0x46,0x00, -0x06,0x10,0xEC,0x00, -0x04,0x18,0xC8,0x00, -0x25,0x40,0x62,0x00, -0x06,0x58,0xEA,0x00, -0x02,0x6C,0x08,0x00, -0x1B,0x00,0x6D,0x01, -0x02,0x00,0xA0,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0x11,0x31, -0x06,0x10,0xEF,0x00, -0x04,0x18,0xCA,0x00, -0x25,0x50,0x62,0x00, -0x02,0x24,0x0A,0x00, -0x04,0x60,0xCC,0x00, -0x12,0x80,0x00,0x00, -0x10,0x48,0x00,0x00, -0x00,0x14,0x09,0x00, -0x25,0x48,0x44,0x00, -0x12,0x28,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x18,0x00,0x11,0x02, -0x12,0x70,0x00,0x00, -0x2B,0x18,0x2E,0x01, -0x00,0x00,0x00,0x00, -0x1B,0x00,0x6D,0x01, -0x02,0x00,0xA0,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x0A,0x00,0x60,0x10, -0x04,0x78,0xCF,0x00, -0x21,0x48,0x28,0x01, -0x2B,0x10,0x28,0x01, -0x06,0x00,0x40,0x14, -0xFF,0xFF,0xB0,0x24, -0x2B,0x10,0x2E,0x01, -0x03,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x10,0x26, -0x21,0x48,0x28,0x01, -0x23,0x48,0x2E,0x01, -0x1B,0x00,0x2D,0x01, -0x02,0x00,0xA0,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0xFF,0xFF,0x44,0x31, -0x12,0x28,0x00,0x00, -0x10,0x58,0x00,0x00, -0x00,0x14,0x0B,0x00, -0x25,0x58,0x44,0x00, -0x18,0x00,0xB1,0x00, -0x12,0x70,0x00,0x00, -0x2B,0x18,0x6E,0x01, -0x00,0x00,0x00,0x00, -0x1B,0x00,0x2D,0x01, -0x02,0x00,0xA0,0x15, -0x00,0x00,0x00,0x00, -0x0D,0x00,0x07,0x00, -0x0B,0x00,0x60,0x10, -0x00,0x14,0x10,0x00, -0x21,0x58,0x68,0x01, -0x2B,0x10,0x68,0x01, -0x06,0x00,0x40,0x14, -0xFF,0xFF,0xA5,0x24, -0x2B,0x10,0x6E,0x01, -0x04,0x00,0x40,0x10, -0x00,0x14,0x10,0x00, -0xFF,0xFF,0xA5,0x24, -0x21,0x58,0x68,0x01, -0x00,0x14,0x10,0x00, -0x25,0x10,0x45,0x00, -0x23,0x58,0x6E,0x01, -0x19,0x00,0x4C,0x00, -0x10,0x28,0x00,0x00, -0x2B,0x18,0x65,0x01, -0x12,0x48,0x00,0x00, -0x05,0x00,0x60,0x14, -0x23,0x20,0x2C,0x01, -0x07,0x00,0xAB,0x14, -0x2B,0x10,0xE9,0x01, -0x05,0x00,0x40,0x10, -0x00,0x00,0x00,0x00, -0x2B,0x10,0x24,0x01, -0x23,0x18,0xA8,0x00, -0x23,0x28,0x62,0x00, -0x21,0x48,0x80,0x00, -0xEA,0xFE,0x40,0x12, -0x23,0x18,0xE9,0x01, -0x23,0x20,0x65,0x01, -0x2B,0x10,0xE3,0x01, -0x23,0x50,0x82,0x00, -0x04,0x28,0xEA,0x00, -0x06,0x18,0xC3,0x00, -0x25,0xC0,0xA3,0x00, -0x06,0xC8,0xCA,0x00, -0x00,0x00,0x58,0xAE, -0x4C,0x62,0x00,0x08, -0x04,0x00,0x59,0xAE, -0x00,0x01,0xC3,0x2C, -0x08,0x00,0x02,0x24, -0x21,0x30,0x00,0x00, -0xE6,0x61,0x00,0x08, -0x0A,0x30,0x43,0x00, -0x00,0x00,0x42,0x38, -0x21,0x18,0x0C,0x01, -0xE0,0x62,0x00,0x08, -0x0B,0x40,0x62,0x00, -0x25,0xB0,0x02,0x3C, -0xFF,0x00,0x03,0x3C, -0xEC,0x02,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0xF0,0x8D,0x63,0x24, -0x18,0x03,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x7F,0x00,0x02,0x3C, -0x0D,0xB8,0x44,0x34, -0x80,0x04,0x03,0x3C, -0x25,0x20,0x83,0x00, -0x00,0x08,0x02,0x3C, -0x25,0x20,0x82,0x00, -0x00,0x30,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x25,0x20,0x83,0x00, -0x41,0xB0,0x03,0x3C, -0x00,0x00,0x64,0xAC, -0xD8,0x1B,0x44,0xAC, -0xD0,0x1B,0x44,0xAC, -0x08,0x00,0x63,0x34, -0x86,0x00,0x04,0x24, -0x00,0x00,0x64,0xA4, -0xDC,0x1B,0x44,0xA4, -0xD4,0x1B,0x40,0xAC, -0xDE,0x1B,0x40,0xA4, -0x08,0x00,0xE0,0x03, -0xE0,0x1B,0x44,0xA4, -0x99,0x63,0x00,0x08, -0x00,0x00,0x00,0x00, -0x42,0xB0,0x03,0x3C, -0x01,0x00,0x63,0x34, -0x02,0x00,0x02,0x24, -0xE8,0xFF,0xBD,0x27, -0x00,0x00,0x62,0xA0, -0x10,0x00,0xBF,0xAF, -0xDF,0x2F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x21,0x20,0x00,0x00, -0x01,0x00,0x05,0x24, -0x8C,0x23,0x00,0x0C, -0x00,0x50,0x06,0x24, -0x1F,0x00,0x06,0x3C, -0x10,0x00,0xBF,0x8F, -0x00,0x40,0xC6,0x34, -0x03,0x00,0x04,0x24, -0x01,0x00,0x05,0x24, -0x8C,0x23,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x25,0xB0,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xC8,0xFF,0xBD,0x27, -0x18,0x03,0x64,0x34, -0xB8,0x8E,0x42,0x24, -0x00,0x00,0x82,0xAC, -0x30,0x00,0xBE,0xAF, -0x2C,0x00,0xB7,0xAF, -0x28,0x00,0xB6,0xAF, -0x24,0x00,0xB5,0xAF, -0x20,0x00,0xB4,0xAF, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x34,0x00,0xBF,0xAF, -0xB6,0x00,0x63,0x34, -0x00,0x00,0x62,0x90, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x70,0x24, -0xAB,0x1B,0x02,0xA2, -0x28,0x6B,0x00,0x0C, -0x7A,0x36,0x00,0xA2, -0x48,0x01,0x03,0x24, -0x84,0x36,0x03,0xAE, -0x80,0x36,0x03,0xAE, -0xFD,0xFF,0x02,0x3C, -0xFB,0xFF,0x03,0x3C, -0x21,0x98,0x00,0x02, -0x21,0xA0,0x00,0x02, -0xFF,0xFF,0x55,0x34, -0xFF,0xFF,0x76,0x34, -0x21,0x88,0x00,0x00, -0x02,0x80,0x1E,0x3C, -0x02,0x80,0x17,0x3C, -0x21,0x90,0x00,0x02, -0x80,0x10,0x11,0x00, -0x21,0x10,0x51,0x00, -0xC0,0x10,0x02,0x00, -0x21,0x10,0x53,0x00, -0xE8,0x1D,0x42,0x24, -0x07,0x00,0x03,0x24, -0xFF,0xFF,0x63,0x24, -0x00,0x00,0x40,0xA4, -0xFD,0xFF,0x61,0x04, -0x02,0x00,0x42,0x24, -0xC0,0x80,0x11,0x00, -0x18,0x42,0xC4,0x27, -0x21,0x20,0x04,0x02, -0x21,0x28,0x00,0x00, -0x02,0x00,0x06,0x24, -0xF8,0x1D,0x40,0xA6, -0x08,0x52,0x00,0x0C, -0xFA,0x1D,0x40,0xA2, -0x21,0x20,0x13,0x02, -0xE8,0x22,0x83,0x8C, -0xEA,0x5D,0xE7,0x92, -0xBF,0xFF,0x02,0x24, -0x24,0x28,0x62,0x00, -0x01,0x00,0x02,0x24, -0x63,0x00,0xE2,0x10, -0x80,0x07,0xA6,0x34, -0xFF,0xF7,0x03,0x24, -0x24,0x10,0xC3,0x00, -0xFF,0xEF,0x03,0x24, -0x24,0x10,0x43,0x00, -0xE8,0x22,0x82,0xAC, -0x21,0x30,0x14,0x02, -0xE8,0x22,0xC4,0x8C, -0xE7,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x24,0x20,0x95,0x00, -0x24,0x20,0x96,0x00, -0xFF,0xFD,0x03,0x3C, -0x24,0x20,0x82,0x00, -0xFF,0xFF,0x63,0x34, -0xFF,0xFB,0x02,0x3C, -0x24,0x20,0x83,0x00, -0xEC,0x22,0xC5,0x8C, -0xFF,0xFF,0x42,0x34, -0xFF,0xE7,0x03,0x3C, -0x24,0x20,0x82,0x00, -0xFF,0xFF,0x63,0x34, -0xFF,0xFF,0x02,0x3C, -0x24,0x20,0x83,0x00, -0xFF,0x7F,0x42,0x34, -0xC0,0xFF,0x03,0x24, -0x24,0x28,0xA2,0x00, -0x24,0x20,0x83,0x00, -0x1F,0x00,0x02,0x3C, -0x01,0x00,0x31,0x26, -0x25,0x28,0xA2,0x00, -0x08,0x00,0x84,0x34, -0x20,0x00,0x22,0x2A, -0xE8,0x22,0xC4,0xAC, -0xEC,0x22,0xC5,0xAC, -0xC3,0xFF,0x40,0x14, -0x28,0x00,0x52,0x26, -0x25,0xB0,0x02,0x3C, -0x10,0x00,0x03,0x24, -0xB0,0x03,0x42,0x34, -0x02,0x80,0x04,0x3C, -0x00,0x00,0x43,0xAC, -0x58,0x22,0x84,0x24, -0x21,0x28,0x00,0x00, -0x08,0x52,0x00,0x0C, -0x20,0x00,0x06,0x24, -0x02,0x80,0x02,0x3C, -0xE9,0x5D,0x43,0x90, -0x00,0x00,0x00,0x00, -0x3A,0x00,0x60,0x10, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x50,0x24, -0x24,0x03,0x00,0xA2, -0x38,0x70,0x00,0x0C, -0x25,0x03,0x00,0xA2, -0x02,0x80,0x09,0x3C, -0x64,0x57,0x22,0x25, -0x02,0x80,0x0A,0x3C, -0x02,0x80,0x0B,0x3C, -0x02,0x80,0x0C,0x3C, -0x02,0x80,0x0D,0x3C, -0x02,0x80,0x0E,0x3C, -0x02,0x80,0x0F,0x3C, -0x04,0x00,0x42,0xAC, -0x64,0x57,0x22,0xAD, -0x6C,0x57,0x43,0x25, -0x74,0x57,0x64,0x25, -0x7C,0x57,0x85,0x25, -0x84,0x57,0xA6,0x25, -0x8C,0x57,0xC7,0x25, -0x94,0x57,0xE8,0x25, -0x09,0x00,0x02,0x24, -0x04,0x00,0x63,0xAC, -0x6C,0x57,0x43,0xAD, -0x04,0x00,0x84,0xAC, -0x74,0x57,0x64,0xAD, -0x04,0x00,0xA5,0xAC, -0x7C,0x57,0x85,0xAD, -0x04,0x00,0xC6,0xAC, -0x84,0x57,0xA6,0xAD, -0x04,0x00,0xE7,0xAC, -0x8C,0x57,0xC7,0xAD, -0x94,0x57,0xE8,0xAD, -0x04,0x00,0x08,0xAD, -0x34,0x00,0xBF,0x8F, -0x0C,0x3E,0x02,0xA2, -0x32,0x3B,0x00,0xA6, -0x8E,0x3E,0x00,0xA2, -0x30,0x00,0xBE,0x8F, -0x2C,0x00,0xB7,0x8F, -0x28,0x00,0xB6,0x8F, -0x24,0x00,0xB5,0x8F, -0x20,0x00,0xB4,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0xEB,0x5D,0x43,0x90, -0x00,0x00,0x00,0x00, -0x9C,0xFF,0x67,0x14, -0x80,0x0F,0xA2,0x34, -0xFF,0xF7,0x03,0x24, -0x24,0x10,0xC3,0x00, -0xF0,0x63,0x00,0x08, -0x00,0x10,0x42,0x34, -0xFA,0x6B,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x50,0x6E,0x00,0x0C, -0x30,0x38,0x80,0xAE, -0x6E,0x6F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x03,0x3C, -0xDE,0x5D,0x64,0x90, -0x92,0x00,0x02,0x24, -0x03,0x00,0x82,0x10, -0x00,0x00,0x00,0x00, -0xCA,0x6F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xB0,0x6F,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x6A,0x6E,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x01,0x00,0x03,0x24, -0x8A,0x36,0x83,0xA6, -0x1E,0x70,0x00,0x0C, -0x88,0x36,0x80,0xA6, -0x1E,0x64,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0xC8,0xFF,0xBD,0x27, -0xB8,0x91,0x63,0x24, -0x18,0x03,0x42,0x34, -0x18,0x00,0xB0,0xAF, -0x34,0x00,0xBF,0xAF, -0x30,0x00,0xB6,0xAF, -0x2C,0x00,0xB5,0xAF, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x20,0x00,0xB2,0xAF, -0x1C,0x00,0xB1,0xAF, -0x00,0x00,0x43,0xAC, -0x21,0x80,0x00,0x00, -0x01,0x00,0x02,0x26, -0xFF,0xFF,0x50,0x30, -0x64,0x00,0x03,0x2E, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0x02,0x26, -0x02,0x80,0x03,0x3C, -0xDB,0x5D,0x68,0x90, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xD8,0x5D,0x4B,0x94, -0xF3,0x5D,0x6A,0x90, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x14,0x3C, -0xFA,0x5D,0x67,0x90, -0xE8,0x5D,0x49,0x90, -0xDA,0x5D,0x83,0x92, -0x02,0x80,0x0C,0x3C, -0x02,0x80,0x02,0x3C, -0xF5,0x5D,0x46,0x90, -0xF8,0x5D,0x85,0x91, -0x25,0xB0,0x04,0x3C, -0xB0,0x03,0x82,0x34, -0x00,0x00,0x4B,0xAC, -0x00,0x00,0x48,0xAC, -0x00,0x00,0x49,0xAC, -0x00,0x00,0x43,0xAC, -0x02,0x80,0x03,0x3C, -0x00,0x00,0x4A,0xAC, -0x0A,0x00,0x88,0x34, -0x00,0x00,0x46,0xAC, -0x00,0x00,0x45,0xAC, -0x00,0x00,0x47,0xAC, -0x1A,0x5E,0x60,0xA4, -0x00,0x00,0x06,0x91, -0x02,0x80,0x02,0x3C, -0x0B,0x00,0x04,0x24, -0x02,0x80,0x16,0x3C, -0xE5,0x5D,0x44,0xA0, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0xC5,0x26, -0x00,0x78,0x03,0x24, -0x08,0x5E,0x40,0xA0, -0xF0,0xFF,0x02,0x24, -0x01,0x00,0x07,0x24, -0x02,0x80,0x15,0x3C, -0xAC,0x1B,0xA3,0xA4, -0xAA,0x1B,0xA2,0xA0, -0xFF,0x07,0x03,0x24, -0xFF,0xFF,0x02,0x24, -0x20,0x00,0xC6,0x30, -0xF8,0x5D,0x87,0xA1, -0xA8,0x1B,0xA7,0xA0, -0xAE,0x1B,0xA3,0xA4, -0x48,0xF3,0xA2,0xA2, -0xB1,0x00,0xC0,0x10, -0xB0,0x1B,0xA0,0xA4, -0x00,0x00,0x02,0x91, -0x00,0x00,0x00,0x00, -0x10,0x00,0x42,0x30, -0xFB,0x00,0x40,0x14, -0x02,0x80,0x13,0x3C, -0x21,0x80,0x00,0x00, -0x21,0x88,0x00,0x00, -0xB8,0xF1,0x72,0x26, -0xFF,0x00,0x24,0x32, -0x61,0x57,0x00,0x0C, -0x21,0x28,0x12,0x02, -0x08,0x00,0x03,0x26, -0xFF,0xFF,0x70,0x30, -0x01,0x00,0x22,0x26, -0x80,0x00,0x03,0x2E, -0xF8,0xFF,0x60,0x14, -0xFF,0xFF,0x51,0x30, -0xDA,0x5D,0x83,0x92, -0x00,0x00,0x00,0x00, -0x02,0x00,0x62,0x30, -0xC1,0x00,0x40,0x14, -0x04,0x00,0x62,0x30, -0x9A,0x00,0x40,0x10, -0x25,0xB0,0x03,0x3C, -0x25,0xB0,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x06,0x00,0x06,0x24, -0x50,0x00,0x84,0x34, -0x10,0x52,0x00,0x0C, -0x07,0xF2,0xA5,0x24, -0xB8,0xF1,0x63,0x26, -0x7B,0x00,0x66,0x90, -0x00,0x00,0x00,0x00, -0x02,0x00,0xC2,0x2C, -0x04,0x00,0x40,0x14, -0x02,0x00,0x0B,0x24, -0x79,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x03,0x00,0x4B,0x30, -0x04,0x00,0xC2,0x2C, -0xDC,0x00,0x40,0x10, -0xB8,0xF1,0x62,0x26, -0x02,0x80,0x02,0x3C, -0x4A,0xF3,0x40,0xA0, -0x02,0x80,0x02,0x3C, -0xE7,0x5D,0x43,0x90, -0x01,0x00,0x02,0x24, -0x02,0x00,0x62,0x10, -0xFC,0xFF,0x08,0x24, -0x21,0x40,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xB8,0xF1,0x4A,0x24, -0x30,0x1F,0x69,0x24, -0x21,0x60,0x00,0x00, -0x21,0x80,0x00,0x00, -0x01,0x00,0x02,0x26, -0x21,0x30,0x30,0x01, -0x03,0x00,0x03,0x2E, -0x08,0x00,0x04,0x2E, -0xFF,0xFF,0x50,0x30, -0x0E,0x00,0x07,0x2E, -0x04,0x00,0x60,0x14, -0x21,0x88,0x00,0x00, -0x01,0x00,0x11,0x24, -0x02,0x00,0x02,0x24, -0x0A,0x88,0x44,0x00, -0x21,0x10,0x51,0x01, -0x61,0x00,0x43,0x90, -0x55,0x00,0x44,0x90, -0x5B,0x00,0x45,0x90, -0x21,0x18,0x03,0x01, -0x21,0x20,0x04,0x01, -0x21,0x28,0x05,0x01, -0x9C,0x1D,0xC3,0xA0, -0x64,0x1D,0xC4,0xA0, -0xEB,0xFF,0xE0,0x14, -0x80,0x1D,0xC5,0xA0, -0x01,0x00,0x8C,0x25, -0x02,0x00,0x82,0x2D, -0x0E,0x00,0x29,0x25, -0xE5,0xFF,0x40,0x14, -0x03,0x00,0x4A,0x25, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x47,0x24, -0xB8,0xF1,0x66,0x24, -0x21,0x80,0x00,0x00, -0x03,0x00,0x02,0x2E, -0x21,0x20,0x07,0x02, -0xB9,0x00,0x40,0x10, -0x08,0x00,0x03,0x2E, -0x71,0x00,0xC3,0x90, -0x6E,0x00,0xC2,0x90, -0x00,0x00,0x00,0x00, -0xC6,0x1D,0x82,0xA0, -0xB8,0x1D,0x83,0xA0, -0x01,0x00,0x02,0x26, -0xFF,0xFF,0x50,0x30, -0x0E,0x00,0x03,0x2E, -0xF4,0xFF,0x60,0x14, -0x03,0x00,0x02,0x2E, -0x03,0x00,0x02,0x24, -0x2A,0x00,0x62,0x15, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xB8,0xF1,0x4E,0x24, -0x34,0xD9,0x6F,0x24, -0x21,0x60,0x00,0x00, -0x21,0x68,0x00,0x00, -0x21,0x10,0xAE,0x01, -0x74,0x00,0x43,0x90, -0x21,0x80,0x00,0x00, -0x0F,0x00,0x6A,0x30, -0x02,0x49,0x03,0x00, -0x21,0x10,0xB0,0x01, -0x00,0x11,0x02,0x00, -0x21,0x58,0x4F,0x00, -0x21,0x38,0x00,0x00, -0x21,0x40,0x67,0x01, -0x00,0x00,0x03,0x91, -0x00,0x31,0x09,0x00, -0x01,0x00,0xE7,0x24, -0x02,0x11,0x03,0x00, -0x00,0x21,0x02,0x00, -0x0F,0x00,0x63,0x30, -0x2B,0x10,0x49,0x00, -0x0A,0x20,0xC2,0x00, -0x2B,0x28,0x6A,0x00, -0x00,0x00,0xA5,0x38, -0x25,0x18,0x83,0x00, -0xFF,0xFF,0xE7,0x30, -0x25,0x20,0x8A,0x00, -0x0A,0x18,0x85,0x00, -0x10,0x00,0xE2,0x2C, -0xEF,0xFF,0x40,0x14, -0x00,0x00,0x03,0xA1, -0x01,0x00,0x02,0x26, -0xFF,0xFF,0x50,0x30, -0x03,0x00,0x03,0x2E, -0xE7,0xFF,0x60,0x14, -0x21,0x10,0xB0,0x01, -0x01,0x00,0x8C,0x25, -0x02,0x00,0x82,0x2D, -0xDD,0xFF,0x40,0x14, -0x03,0x00,0xAD,0x25, -0xE6,0x56,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x48,0xF3,0xA5,0x26, -0x91,0x56,0x00,0x0C, -0xFA,0x01,0x04,0x24, -0xE6,0x56,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x25,0xB0,0x05,0x3C, -0x18,0x3B,0x84,0x24, -0x50,0x00,0xA5,0x34, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0x30,0x1F,0xC5,0x26, -0x01,0x00,0x02,0x24, -0x06,0x00,0x03,0x24, -0x05,0x00,0x04,0x24, -0x33,0x1C,0xA2,0xA0, -0x8A,0x55,0x00,0x0C, -0x30,0x3B,0xA3,0xA0, -0x34,0x00,0xBF,0x8F, -0x30,0x00,0xB6,0x8F, -0x2C,0x00,0xB5,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x38,0x00,0xBD,0x27, -0x25,0xB0,0x03,0x3C, -0x4C,0x87,0x02,0x3C, -0x54,0x00,0x65,0x34, -0x00,0xE0,0x42,0x34, -0x50,0x00,0x63,0x34, -0x00,0x00,0x62,0xAC, -0x12,0x01,0x04,0x24, -0x02,0x80,0x02,0x3C, -0x00,0x00,0xA4,0xAC, -0x30,0x1F,0x46,0x24, -0x21,0x60,0x00,0x00, -0x10,0x00,0x05,0x24, -0x21,0x80,0x00,0x00, -0x01,0x00,0x02,0x26, -0x21,0x18,0xD0,0x00, -0xFF,0xFF,0x50,0x30, -0x0E,0x00,0x04,0x2E, -0x80,0x1D,0x65,0xA0, -0x64,0x1D,0x65,0xA0, -0xF9,0xFF,0x80,0x14, -0x9C,0x1D,0x65,0xA0, -0x01,0x00,0x8C,0x25, -0x02,0x00,0x82,0x2D, -0xF4,0xFF,0x40,0x14, -0x0E,0x00,0xC6,0x24, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x46,0x24, -0x21,0x80,0x00,0x00, -0x04,0x00,0x05,0x24, -0x01,0x00,0x02,0x26, -0x21,0x18,0x06,0x02, -0xFF,0xFF,0x50,0x30, -0x0E,0x00,0x04,0x2E, -0xC6,0x1D,0x60,0xA0, -0xFA,0xFF,0x80,0x14, -0xB8,0x1D,0x65,0xA0, -0x48,0x65,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x50,0x00,0x84,0x34, -0xCA,0xF1,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x06,0x00,0x06,0x24, -0xB8,0xF1,0x62,0x92, -0xB8,0xF1,0x64,0x26, -0x01,0x00,0x85,0x90, -0x21,0x18,0x40,0x00, -0x10,0x00,0xA2,0xA3, -0x29,0x00,0x02,0x24, -0x11,0x00,0xA5,0xA3, -0x50,0x00,0x86,0x90, -0x3B,0x00,0x62,0x10, -0xFF,0x00,0xA3,0x30, -0xB8,0xF1,0x65,0x26, -0x68,0x00,0xA2,0x90, -0x02,0x80,0x03,0x3C, -0x04,0x00,0xC4,0x2C, -0x1F,0x00,0x42,0x30, -0x24,0x00,0x80,0x14, -0x49,0xF3,0x62,0xA0, -0x7A,0x00,0xA2,0x90, -0x79,0x00,0xA4,0x90, -0x02,0x80,0x03,0x3C, -0x04,0x00,0x42,0x30, -0x83,0x10,0x02,0x00, -0x03,0x00,0x8B,0x30, -0x4A,0xF3,0x62,0xA0, -0x06,0x00,0xC2,0x2C, -0x37,0xFF,0x40,0x14, -0x02,0x80,0x02,0x3C, -0xB8,0xF1,0x63,0x26, -0x69,0x00,0x62,0x90, -0x00,0x00,0x00,0x00, -0x01,0x00,0x42,0x30, -0x31,0xFF,0x40,0x14, -0x02,0x80,0x02,0x3C, -0xE8,0x64,0x00,0x08, -0x21,0x40,0x00,0x00, -0x21,0x20,0x00,0x00, -0x80,0x00,0x05,0x24, -0x53,0x56,0x00,0x0C, -0xB8,0xF1,0x66,0x26, -0xC7,0x64,0x00,0x08, -0x00,0x00,0x00,0x00, -0x7D,0x00,0x43,0x90, -0x69,0x00,0x44,0x90, -0x02,0x80,0x02,0x3C, -0x04,0x00,0x63,0x30, -0x01,0x00,0x84,0x30, -0x83,0x18,0x03,0x00, -0x01,0x00,0x84,0x2C, -0x1F,0xFF,0x80,0x10, -0x4A,0xF3,0x43,0xA0, -0xE8,0x64,0x00,0x08, -0x21,0x40,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x02,0x00,0x0B,0x24, -0xAA,0x65,0x00,0x08, -0x4A,0xF3,0x40,0xA0, -0x21,0x28,0x07,0x02, -0x06,0x00,0x60,0x10, -0x21,0x20,0xA0,0x00, -0x67,0x00,0xC3,0x90, -0x6F,0x00,0xC2,0x90, -0xB8,0x1D,0xA3,0xA0, -0x17,0x65,0x00,0x08, -0xC6,0x1D,0xA2,0xA0, -0x72,0x00,0xC3,0x90, -0x70,0x00,0xC2,0x90, -0x16,0x65,0x00,0x08, -0xC6,0x1D,0x82,0xA0, -0x81,0x00,0x02,0x24, -0xC4,0xFF,0x62,0x14, -0x01,0x00,0x02,0x24, -0x54,0x00,0x83,0x90, -0x00,0x00,0x00,0x00, -0x0A,0x00,0x62,0x10, -0x02,0x00,0x02,0x24, -0x04,0x00,0x62,0x10, -0x11,0x00,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x9C,0x65,0x00,0x08, -0xDE,0x5D,0x43,0xA0, -0x22,0x00,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x9C,0x65,0x00,0x08, -0xDE,0x5D,0x43,0xA0, -0x12,0x00,0x03,0x24, -0x02,0x80,0x02,0x3C, -0x9C,0x65,0x00,0x08, -0xDE,0x5D,0x43,0xA0, -0xD8,0xFF,0xBD,0x27, -0x18,0x00,0xB0,0xAF, -0x02,0x80,0x02,0x3C, -0x25,0xB0,0x10,0x3C, -0x18,0x03,0x03,0x36, -0xA8,0x97,0x42,0x24, -0x00,0x00,0x62,0xAC, -0x20,0x00,0xB2,0xAF, -0x02,0x80,0x12,0x3C, -0x24,0x00,0xBF,0xAF, -0x6E,0x64,0x00,0x0C, -0x1C,0x00,0xB1,0xAF, -0x9C,0x66,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x36,0x69,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x1A,0x6A,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x7C,0x6C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x82,0x69,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x30,0x1F,0x43,0x26, -0x30,0x3B,0x64,0x90, -0x0D,0x0C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x76,0x63,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x64,0x40,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x44,0x00,0x03,0x36, -0x00,0x00,0x62,0x94, -0x00,0x00,0x00,0x00, -0x40,0x00,0x42,0x34, -0x00,0x00,0x62,0xA4, -0xAE,0x63,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x7C,0x63,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x9B,0x63,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xE6,0x69,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xA3,0x69,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x00,0x80,0x04,0x3C, -0x74,0x6A,0x84,0x24, -0x03,0x6A,0x00,0x0C, -0x01,0x00,0x05,0x24, -0x00,0x80,0x04,0x3C, -0x6C,0x72,0x84,0x24, -0x03,0x6A,0x00,0x0C, -0x02,0x00,0x05,0x24, -0x00,0x80,0x04,0x3C, -0x48,0x7B,0x84,0x24, -0x03,0x6A,0x00,0x0C, -0x04,0x00,0x05,0x24, -0x7E,0x59,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x01,0x80,0x04,0x3C, -0xB8,0x8E,0x84,0x24, -0x03,0x6A,0x00,0x0C, -0x03,0x00,0x05,0x24, -0x02,0x80,0x03,0x3C, -0xE8,0x5D,0x63,0x90, -0x00,0x00,0x00,0x00, -0x60,0x00,0x60,0x10, -0x43,0x00,0x02,0x36, -0x07,0x00,0x02,0x24, -0x0C,0x00,0x62,0x10, -0x03,0x00,0x02,0x24, -0x25,0xB0,0x04,0x3C, -0x43,0x00,0x85,0x34, -0x10,0x02,0x86,0x34, -0x10,0x00,0x03,0x24, -0x00,0x00,0xA2,0xA0, -0xD8,0x00,0x84,0x34, -0x00,0x00,0xC3,0xA0, -0x00,0x00,0x82,0x90, -0x80,0xFF,0x03,0x24, -0x25,0x10,0x43,0x00, -0x00,0x00,0x82,0xA0, -0xE0,0x6A,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x42,0xB0,0x03,0x3C, -0x00,0x00,0x62,0x90, -0x25,0xB0,0x10,0x3C, -0x02,0x80,0x11,0x3C, -0x01,0x00,0x42,0x34, -0x00,0x00,0x62,0xA0, -0x83,0x63,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x44,0x00,0x05,0x36, -0x00,0x00,0xA2,0x94, -0x02,0x80,0x03,0x3C, -0x8C,0xC6,0x64,0x8C, -0xC0,0x00,0x42,0x34, -0x00,0x00,0xA2,0xA4, -0x2F,0x55,0x00,0x0C, -0x80,0x0C,0x10,0x36, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xDA,0x5D,0x45,0x90, -0xDF,0x5D,0x66,0x90, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x90,0xC6,0x84,0x24, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xDE,0x5D,0x45,0x90, -0x48,0xF3,0x66,0x90, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xE7,0x5D,0x47,0x90, -0x4A,0xF3,0x62,0x90, -0x02,0x80,0x04,0x3C, -0xA4,0xC6,0x84,0x24, -0x2F,0x55,0x00,0x0C, -0x10,0x00,0xA2,0xAF, -0x02,0x80,0x02,0x3C, -0x00,0x00,0x07,0x8E, -0xE6,0x5D,0x46,0x90, -0xE9,0x5D,0x25,0x92, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0xC0,0xC6,0x84,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xEB,0x5D,0x66,0x90, -0xEA,0x5D,0x45,0x90, -0x02,0x80,0x04,0x3C, -0x30,0x1F,0x50,0x26, -0x2F,0x55,0x00,0x0C, -0xDC,0xC6,0x84,0x24, -0xA0,0x3E,0x06,0x8E, -0xA4,0x3E,0x05,0x8E, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0xF0,0xC6,0x84,0x24, -0x02,0x80,0x02,0x3C, -0x49,0xF3,0x45,0x90, -0x02,0x80,0x04,0x3C, -0x2F,0x55,0x00,0x0C, -0x10,0xC7,0x84,0x24, -0xE9,0x5D,0x23,0x92, -0x10,0x27,0x02,0x24, -0x02,0x80,0x04,0x3C, -0x0B,0x10,0x03,0x00, -0x40,0x39,0x02,0xAE, -0x08,0x00,0x84,0x24, -0x21,0x28,0x00,0x00, -0x21,0x30,0x00,0x00, -0x91,0x3C,0x00,0x0C, -0x21,0x38,0x00,0x00, -0x99,0x63,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x24,0x00,0xBF,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xD8,0x00,0x04,0x36, -0x00,0x00,0x40,0xA0, -0x38,0x66,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0x20,0x00,0x00, -0x20,0xB0,0x06,0x3C, -0xFF,0xFF,0x05,0x34, -0x21,0x18,0x86,0x00, -0x04,0x00,0x84,0x24, -0x2A,0x10,0xA4,0x00, -0x00,0x00,0x60,0xAC, -0xFB,0xFF,0x40,0x10, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xB8,0xFF,0xBD,0x27, -0x24,0x00,0xB1,0xAF, -0x44,0x00,0xBF,0xAF, -0x40,0x00,0xBE,0xAF, -0x3C,0x00,0xB7,0xAF, -0x38,0x00,0xB6,0xAF, -0x34,0x00,0xB5,0xAF, -0x30,0x00,0xB4,0xAF, -0x2C,0x00,0xB3,0xAF, -0x28,0x00,0xB2,0xAF, -0x20,0x00,0xB0,0xAF, -0x02,0x80,0x02,0x3C, -0xDA,0x5D,0x42,0x90, -0x25,0xB0,0x11,0x3C, -0x58,0x00,0x25,0x36, -0x10,0x00,0xA2,0xAF, -0x4C,0x81,0x02,0x3C, -0x00,0xE0,0x42,0x34, -0x00,0x00,0xA2,0xAC, -0xFF,0xFF,0x04,0x24, -0x96,0x01,0x03,0x24, -0x28,0x28,0x02,0x24, -0x5C,0x00,0x26,0x36, -0x60,0x00,0x27,0x36, -0x64,0x00,0x28,0x36, -0x8A,0x00,0x29,0x36, -0x00,0x00,0xC3,0xAC, -0x00,0x00,0xE4,0xAC, -0x00,0x00,0x04,0xAD, -0x00,0x00,0x22,0xA5, -0x0E,0x0E,0x02,0x3C, -0x09,0x00,0x03,0x24, -0x0A,0x0A,0x42,0x34, -0x89,0x00,0x2A,0x36, -0x8C,0x00,0x2B,0x36, -0x00,0x00,0x43,0xA1, -0x90,0x00,0x2C,0x36, -0x00,0x00,0x62,0xAD, -0x13,0x00,0x03,0x24, -0x30,0x00,0x02,0x24, -0x91,0x00,0x2D,0x36, -0x00,0x00,0x83,0xA1, -0x92,0x00,0x2E,0x36, -0x00,0x00,0xA2,0xA1, -0x3A,0x01,0x03,0x24, -0x21,0x00,0x02,0x24, -0xB5,0x00,0x2F,0x36, -0x00,0x00,0xC3,0xA5, -0x00,0x00,0xE2,0xA1, -0x10,0x00,0xA2,0x8F, -0x12,0x00,0x03,0x24, -0x89,0x01,0x43,0x10, -0x07,0x07,0x02,0x3C, -0x07,0x07,0x42,0x34, -0xA0,0x00,0x24,0x36, -0x00,0x00,0x82,0xAC, -0xA4,0x00,0x25,0x36, -0x00,0x07,0x03,0x24, -0x00,0xC0,0x02,0x3C, -0xA8,0x00,0x26,0x36, -0x00,0x00,0xA3,0xAC, -0x00,0xC4,0x42,0x34, -0x00,0x00,0xC2,0xAC, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x62,0x24, -0xAC,0x1B,0x45,0x94, -0xAE,0x1B,0x46,0x94, -0xAA,0x1B,0x42,0x90, -0x02,0x80,0x03,0x3C, -0x21,0xB0,0x07,0x3C, -0x14,0x00,0xA2,0xA3, -0xE9,0x5D,0x63,0x90, -0x20,0xB0,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x18,0x00,0xA3,0xAF, -0x23,0xB0,0x03,0x3C, -0xFF,0xFF,0x63,0x34, -0x24,0xB0,0x08,0x3C, -0xFF,0x1F,0x04,0x3C, -0x25,0xB0,0x1E,0x3C, -0xFF,0xFF,0x84,0x34, -0x21,0x38,0xA7,0x00, -0x21,0x40,0xC8,0x00, -0x21,0x28,0xA2,0x00, -0x21,0x30,0xC3,0x00, -0x24,0x40,0x04,0x01, -0x24,0x28,0xA4,0x00, -0x24,0x38,0xE4,0x00, -0x24,0x30,0xC4,0x00, -0x35,0x00,0x02,0x24, -0x20,0x00,0xC4,0x37, -0x00,0x00,0x82,0xA0, -0x22,0x00,0x03,0x24, -0x09,0x00,0x02,0x24, -0x03,0x05,0xC9,0x37, -0x60,0x05,0xCA,0x37, -0xAC,0x00,0xCB,0x37, -0xF8,0x00,0xCC,0x37, -0xB0,0x00,0xCD,0x37, -0x08,0x01,0xCE,0x37, -0xD8,0x00,0xCF,0x37, -0x00,0x00,0x23,0xA1, -0x00,0x00,0x42,0xA1, -0x00,0x00,0x65,0xAD, -0x00,0x00,0x87,0xAD, -0x00,0x00,0xA6,0xAD, -0x00,0x00,0xC8,0xAD, -0x00,0x00,0xE0,0xA1, -0x14,0x00,0xA3,0x93, -0x25,0xB0,0x02,0x3C, -0xB4,0x00,0x42,0x34, -0x00,0x00,0x43,0xA0, -0xB6,0x00,0xD1,0x37, -0x04,0x00,0x02,0x24, -0x25,0xB0,0x03,0x3C, -0x00,0x00,0x22,0xA2, -0xB9,0x00,0x63,0x34, -0xFF,0xFF,0x02,0x24, -0x00,0x00,0x62,0xA0, -0x25,0xB0,0x03,0x3C, -0x0F,0x00,0x02,0x24, -0xBA,0x00,0x63,0x34, -0x00,0x00,0x62,0xA4, -0x16,0x01,0xD4,0x37, -0x3F,0x3F,0x03,0x24, -0x2F,0x00,0x02,0x3C, -0x00,0x00,0x83,0xA6, -0x17,0x32,0x42,0x34, -0xFF,0xCF,0x03,0x24, -0x18,0x01,0xD5,0x37, -0x1A,0x01,0xD6,0x37, -0xDC,0x00,0xD7,0x37, -0xD0,0x01,0xD8,0x37, -0x00,0x00,0xA0,0xA6, -0x00,0x00,0xC0,0xA6, -0x00,0x00,0xE3,0xAE, -0x00,0x00,0x02,0xAF, -0x5E,0x00,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x17,0x43,0x63,0x34, -0xD4,0x01,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x10,0x00,0x02,0x3C, -0x20,0x53,0x42,0x34, -0xD8,0x01,0xDF,0x37, -0x00,0x00,0xE2,0xAF, -0x25,0xB0,0x02,0x3C, -0x44,0xA4,0x03,0x34, -0xDC,0x01,0x42,0x34, -0x00,0x00,0x43,0xAC, -0x25,0xB0,0x03,0x3C, -0x1A,0x06,0x02,0x24, -0xE0,0x01,0x63,0x34, -0x00,0x00,0x62,0xA4, -0xC2,0x00,0x02,0x3C, -0x30,0x30,0x03,0x24, -0x51,0x10,0x42,0x34, -0xF4,0x01,0xD0,0x37, -0xF8,0x01,0xD3,0x37, -0x00,0x00,0x03,0xA6, -0x00,0x02,0xD2,0x37, -0x00,0x00,0x62,0xAE, -0x26,0x00,0x03,0x24, -0x03,0x02,0xD9,0x37, -0x04,0x00,0x02,0x24, -0x00,0x00,0x43,0xA6, -0x00,0x00,0x22,0xA3, -0x18,0x00,0xA3,0x8F, -0x00,0x00,0x00,0x00, -0xE5,0x00,0x60,0x14, -0x36,0x02,0xC2,0x37, -0x04,0x00,0x03,0x24, -0x00,0x00,0x43,0xA0, -0x02,0x80,0x0B,0x3C, -0xDE,0x5D,0x66,0x91, -0x25,0xB0,0x09,0x3C, -0x80,0x00,0x02,0x24, -0x34,0x02,0x24,0x35, -0x00,0x00,0x82,0xA4, -0x37,0x02,0x25,0x35, -0x53,0x00,0x03,0x24, -0x22,0x00,0x02,0x24, -0x00,0x00,0xA3,0xA0, -0xE6,0x00,0xC2,0x10, -0x1B,0x1B,0x02,0x3C, -0x13,0x13,0x02,0x3C, -0x13,0x13,0x42,0x34, -0x60,0x01,0x23,0x35, -0x64,0x01,0x24,0x35, -0x68,0x01,0x25,0x35, -0x7C,0x01,0x2A,0x35, -0x6C,0x01,0x26,0x35, -0x70,0x01,0x27,0x35, -0x74,0x01,0x28,0x35, -0x78,0x01,0x29,0x35, -0x00,0x00,0x62,0xAC, -0x00,0x00,0x82,0xAC, -0x00,0x00,0xA2,0xAC, -0x00,0x00,0xC2,0xAC, -0x00,0x00,0xE2,0xAC, -0x00,0x00,0x02,0xAD, -0x00,0x00,0x22,0xAD, -0x00,0x00,0x42,0xAD, -0xDE,0x5D,0x65,0x91, -0x25,0xB0,0x0C,0x3C, -0x01,0x00,0x03,0x3C, -0x80,0x01,0x82,0x35, -0x08,0x5F,0x63,0x34, -0x22,0x00,0x04,0x24, -0x00,0x00,0x43,0xAC, -0xE5,0x00,0xA4,0x10, -0x0F,0x1F,0x02,0x3C, -0x92,0x00,0x02,0x24, -0xE2,0x00,0xA2,0x10, -0x0F,0x1F,0x02,0x3C, -0x0F,0x10,0x02,0x3C, -0x00,0xF0,0x4F,0x34, -0xF7,0x01,0x91,0x35, -0x15,0xF0,0x4D,0x34, -0x77,0x00,0x0E,0x24, -0x84,0x01,0x87,0x35, -0x88,0x01,0x88,0x35, -0x10,0xF0,0x44,0x34, -0x8C,0x01,0x85,0x35, -0x05,0xF0,0x42,0x34, -0x00,0x00,0xED,0xAC, -0x90,0x01,0x83,0x35, -0x00,0x00,0x04,0xAD, -0x94,0x01,0x86,0x35, -0x00,0x00,0xA2,0xAC, -0xF5,0x0F,0x02,0x24, -0x00,0x00,0x6F,0xAC, -0x98,0x01,0x89,0x35, -0x00,0x00,0xC2,0xAC, -0x9C,0x01,0x8A,0x35, -0xA0,0x01,0x8B,0x35, -0xF0,0x0F,0x03,0x24, -0xF6,0x01,0x8C,0x35, -0x0D,0x00,0x02,0x24, -0x00,0x00,0x23,0xAD, -0x00,0x00,0x42,0xAD, -0x00,0x00,0x6D,0xAD, -0x02,0x80,0x02,0x3C, -0x00,0x00,0x8E,0xA1, -0x00,0x00,0x2E,0xA2, -0xFB,0x5D,0x42,0x90, -0x25,0xB0,0x1F,0x3C, -0xA7,0x01,0xE7,0x37, -0x1C,0x00,0xA2,0xAF, -0xFF,0xFF,0x02,0x24, -0x00,0x00,0xE2,0xA0, -0x05,0x06,0x03,0x3C, -0x25,0xB0,0x02,0x3C, -0x03,0x04,0x63,0x34, -0x0C,0x00,0x04,0x24, -0xFF,0xFF,0x05,0x24, -0x01,0x02,0x06,0x3C, -0xC2,0x01,0x42,0x34, -0xA8,0x01,0xE8,0x37, -0xAC,0x01,0xE9,0x37, -0xB0,0x01,0xEA,0x37, -0xB4,0x01,0xEB,0x37, -0xB8,0x01,0xEC,0x37, -0xBC,0x01,0xED,0x37, -0xC0,0x01,0xEE,0x37, -0xC1,0x01,0xEF,0x37, -0x00,0x00,0x05,0xAD, -0x00,0x00,0x25,0xAD, -0x00,0x00,0x46,0xAD, -0x00,0x00,0x63,0xAD, -0x00,0x00,0x86,0xAD, -0x00,0x00,0xA3,0xAD, -0x00,0x00,0xC4,0xA1, -0x25,0xB0,0x03,0x3C, -0x00,0x00,0xE4,0xA1, -0x00,0x00,0x44,0xA0, -0x25,0xB0,0x02,0x3C, -0x0D,0x00,0x17,0x24, -0x0E,0x00,0x18,0x24, -0xC4,0x01,0x63,0x34, -0xC5,0x01,0x42,0x34, -0xC3,0x01,0xF1,0x37, -0x00,0x00,0x37,0xA2, -0xC6,0x01,0xF4,0x37, -0x00,0x00,0x77,0xA0, -0xC7,0x01,0xF5,0x37, -0x00,0x00,0x58,0xA0, -0x0F,0x00,0x02,0x24, -0x00,0x00,0x98,0xA2, -0x00,0x00,0xA2,0xA2, -0xD3,0x01,0x02,0x3C, -0x46,0x00,0xF6,0x37, -0x48,0x00,0xFE,0x37, -0x0E,0xF0,0x42,0x34, -0x00,0x00,0xC0,0xA6, -0x00,0x00,0xC2,0xAF, -0x1C,0x00,0xA3,0x8F, -0x00,0x00,0x00,0x00, -0x09,0x00,0x60,0x10, -0x44,0x00,0xF7,0x37, -0x00,0x00,0xE2,0x8E, -0x00,0x02,0x03,0x3C, -0x25,0x10,0x43,0x00, -0x00,0x00,0xE2,0xAE, -0x00,0x00,0xC3,0x8F, -0x00,0x04,0x02,0x3C, -0x25,0x18,0x62,0x00, -0x00,0x00,0xC3,0xAF, -0x4C,0x00,0xE2,0x37, -0x00,0x00,0x40,0xA0, -0x4D,0x00,0xE3,0x37, -0xF1,0x02,0xE4,0x37, -0x08,0x00,0x02,0x24, -0x00,0x00,0x60,0xA0, -0x40,0x00,0xE6,0x37, -0x00,0x00,0x82,0xA0, -0x64,0x03,0xE5,0x37, -0xBC,0x00,0x03,0x24, -0xFC,0x37,0x02,0x24, -0x00,0x00,0xC3,0xA4, -0x00,0x00,0xA0,0xA0, -0x00,0x00,0xC2,0xA4, -0x02,0x80,0x02,0x3C, -0xD8,0x00,0xE9,0x37, -0x30,0x1F,0x43,0x24, -0x00,0x00,0x26,0x91, -0xAA,0x1B,0x64,0x90, -0x2A,0xB0,0x05,0x3C, -0xA0,0xFF,0x02,0x24, -0x26,0xB0,0x07,0x3C, -0x25,0x30,0xC2,0x00, -0x30,0x00,0xAD,0x34, -0x34,0x00,0xA8,0x34, -0x01,0x00,0x83,0x24, -0x38,0x00,0xA5,0x34, -0x20,0x20,0x02,0x24, -0x00,0x00,0x26,0xA1, -0x79,0x00,0xEA,0x34, -0x00,0x00,0x03,0xA1, -0x00,0x00,0xA2,0xA4, -0x40,0x00,0x03,0x24, -0x16,0x00,0x02,0x24, -0x00,0x00,0xA3,0xA1, -0x94,0x00,0xEB,0x37, -0x00,0x00,0x42,0xA1, -0x98,0x00,0xEC,0x37, -0x64,0x00,0x03,0x24, -0x22,0x00,0x02,0x24, -0x00,0x00,0x63,0xA5, -0x7C,0x00,0xF4,0x34, -0x00,0x00,0x82,0xA5, -0x7A,0x00,0xE7,0x34, -0x04,0x00,0x03,0x24, -0x20,0x0C,0x02,0x24, -0x00,0x00,0xE3,0xA0, -0x9C,0x00,0xEE,0x37, -0x00,0x00,0x82,0xA6, -0x9A,0x00,0xEF,0x37, -0x0A,0x00,0x03,0x24, -0xFF,0x03,0x02,0x24, -0x00,0x00,0xC3,0xA1, -0x00,0x00,0xE2,0xA5, -0x25,0xB0,0x02,0x3C, -0x02,0x00,0x03,0x24, -0x96,0x00,0x42,0x34, -0x00,0x00,0x43,0xA4, -0x89,0x00,0xF5,0x37, -0xB7,0x00,0xF1,0x37, -0x20,0x00,0x02,0x24, -0x09,0x00,0x03,0x24, -0x00,0x00,0x22,0xA2, -0x00,0x00,0xA3,0xA2, -0x00,0x00,0xE2,0x96, -0xFF,0xFD,0x03,0x24, -0x04,0x02,0x05,0x24, -0x24,0x10,0x43,0x00, -0x00,0x00,0xE2,0xA6, -0x00,0x00,0xE3,0x96, -0x29,0xB0,0x02,0x3C, -0x40,0x00,0x42,0x34, -0x00,0x02,0x63,0x34, -0x00,0x00,0xE3,0xA6, -0xFF,0x00,0x84,0x30, -0x00,0x00,0x45,0xA4, -0x73,0x22,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x44,0x00,0xBF,0x8F, -0x40,0x00,0xBE,0x8F, -0x3C,0x00,0xB7,0x8F, -0x38,0x00,0xB6,0x8F, -0x34,0x00,0xB5,0x8F, -0x30,0x00,0xB4,0x8F, -0x2C,0x00,0xB3,0x8F, -0x28,0x00,0xB2,0x8F, -0x24,0x00,0xB1,0x8F, -0x20,0x00,0xB0,0x8F, -0x01,0x00,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x48,0x00,0xBD,0x27, -0xFF,0xFF,0x03,0x24, -0x00,0x00,0x43,0xA0, -0x02,0x80,0x0B,0x3C, -0xDE,0x5D,0x66,0x91, -0x25,0xB0,0x09,0x3C, -0x80,0x00,0x02,0x24, -0x34,0x02,0x24,0x35, -0x00,0x00,0x82,0xA4, -0x37,0x02,0x25,0x35, -0x53,0x00,0x03,0x24, -0x22,0x00,0x02,0x24, -0x00,0x00,0xA3,0xA0, -0x1E,0xFF,0xC2,0x14, -0x13,0x13,0x02,0x3C, -0x1B,0x1B,0x02,0x3C, -0x1B,0x1B,0x42,0x34, -0x60,0x01,0x23,0x35, -0x64,0x01,0x24,0x35, -0x68,0x01,0x25,0x35, -0x7C,0x01,0x2A,0x35, -0x6C,0x01,0x26,0x35, -0x70,0x01,0x27,0x35, -0x74,0x01,0x28,0x35, -0x78,0x01,0x29,0x35, -0x00,0x00,0x62,0xAC, -0x00,0x00,0x82,0xAC, -0x00,0x00,0xA2,0xAC, -0x00,0x00,0xC2,0xAC, -0x00,0x00,0xE2,0xAC, -0x00,0x00,0x02,0xAD, -0x00,0x00,0x22,0xAD, -0x00,0x00,0x42,0xAD, -0xDE,0x5D,0x65,0x91, -0x25,0xB0,0x0C,0x3C, -0x01,0x00,0x03,0x3C, -0x80,0x01,0x82,0x35, -0x08,0x5F,0x63,0x34, -0x22,0x00,0x04,0x24, -0x00,0x00,0x43,0xAC, -0x1D,0xFF,0xA4,0x14, -0x0F,0x1F,0x02,0x3C, -0x00,0xF0,0x4F,0x34, -0xF7,0x01,0x91,0x35, -0x15,0xF0,0x4D,0x34, -0x78,0x67,0x00,0x08, -0xFF,0xFF,0x0E,0x24, -0x02,0x80,0x02,0x3C, -0xDF,0x5D,0x44,0x90, -0x06,0x00,0x03,0x24, -0x0C,0x00,0x83,0x10, -0x00,0x1C,0x02,0x3C, -0x00,0x1C,0x42,0x34, -0xA0,0x00,0x24,0x36, -0x00,0x00,0x82,0xAC, -0x00,0xE0,0x02,0x3C, -0xA4,0x00,0x25,0x36, -0x00,0x04,0x03,0x24, -0xA8,0x00,0x26,0x36, -0x00,0xB0,0x42,0x34, -0x00,0x00,0xA3,0xAC, -0xDA,0x66,0x00,0x08, -0x00,0x00,0x00,0x00, -0x16,0x16,0x02,0x3C, -0x07,0x07,0x42,0x34, -0xA0,0x00,0x23,0x36, -0x00,0x00,0x62,0xAC, -0x00,0xC0,0x02,0x3C, -0xA8,0x00,0x25,0x36, -0xA4,0x00,0x24,0x36, -0x00,0xB4,0x42,0x34, -0x00,0x00,0x80,0xAC, -0x00,0x00,0xA2,0xAC, -0xDC,0x66,0x00,0x08, -0x02,0x80,0x03,0x3C, -0xE8,0xFF,0xBD,0x27, -0x01,0x00,0x06,0x24, -0xE8,0x0E,0x04,0x24, -0x10,0x00,0xBF,0xAF, -0xA9,0x45,0x00,0x0C, -0x00,0x10,0x05,0x3C, -0x60,0x08,0x04,0x24, -0xCB,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x20,0x04,0x06,0x3C, -0x20,0x04,0xC6,0x34, -0x25,0x30,0x46,0x00, -0x60,0x08,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x70,0x08,0x04,0x24, -0x00,0x04,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x00,0x20,0x06,0x3C, -0x80,0x00,0xC6,0x34, -0x80,0x0C,0x04,0x24, -0xA9,0x45,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0x00,0x40,0x06,0x3C, -0x10,0x00,0xBF,0x8F, -0x00,0x01,0xC6,0x34, -0x88,0x0C,0x04,0x24, -0xFF,0xFF,0x05,0x24, -0xA9,0x45,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x10,0x00,0xA0,0x10, -0x21,0x38,0x00,0x00, -0x25,0xB0,0x08,0x3C, -0x00,0x00,0x82,0x8C, -0x04,0x00,0x83,0x8C, -0x21,0x30,0x00,0x00, -0x21,0x10,0x48,0x00, -0x00,0x00,0x43,0xAC, -0x01,0x00,0xC2,0x24, -0xFF,0x00,0x46,0x30, -0x06,0x00,0xC3,0x2C, -0xFD,0xFF,0x60,0x14, -0x01,0x00,0xC2,0x24, -0x02,0x00,0xE7,0x24, -0x2B,0x10,0xE5,0x00, -0xF3,0xFF,0x40,0x14, -0x08,0x00,0x84,0x24, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x1C,0x00,0xBF,0xAF, -0x10,0x00,0xB0,0xAF, -0x21,0x90,0xA0,0x00, -0x0B,0x00,0xA0,0x10, -0x21,0x88,0x00,0x00, -0x21,0x80,0x80,0x00, -0x00,0x00,0x04,0x8E, -0x04,0x00,0x05,0x8E, -0x08,0x00,0x06,0x8E, -0x03,0x00,0x31,0x26, -0xA9,0x45,0x00,0x0C, -0x0C,0x00,0x10,0x26, -0x2B,0x10,0x32,0x02, -0xF8,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x21,0x40,0x80,0x00, -0x21,0x48,0x00,0x00, -0x1E,0x00,0xA0,0x10, -0x21,0x38,0x00,0x00, -0x80,0x30,0x07,0x00, -0x21,0x10,0xC8,0x00, -0x00,0x00,0x43,0x8C, -0x00,0x00,0x00,0x00, -0x00,0xF2,0x63,0x24, -0x1D,0x00,0x62,0x2C, -0x12,0x00,0x40,0x10, -0x80,0x10,0x03,0x00, -0x02,0x80,0x03,0x3C, -0x64,0xE9,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x8C, -0x00,0x00,0x00,0x00, -0x08,0x00,0x80,0x00, -0x00,0x00,0x00,0x00, -0x21,0x10,0xC8,0x00, -0xC0,0x18,0x09,0x00, -0x23,0x18,0x69,0x00, -0x08,0x00,0x44,0x8C, -0x02,0x80,0x02,0x3C, -0x80,0x18,0x03,0x00, -0x30,0x1F,0x42,0x24, -0x21,0x18,0x62,0x00, -0x04,0x1D,0x64,0xAC, -0x01,0x00,0x29,0x25, -0x03,0x00,0xE7,0x24, -0x2B,0x10,0xE5,0x00, -0xE5,0xFF,0x40,0x14, -0x80,0x30,0x07,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x21,0x10,0xC8,0x00, -0xC0,0x18,0x09,0x00, -0x08,0x00,0x44,0x8C, -0x23,0x18,0x69,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x03,0x00,0xE7,0x24, -0x21,0x18,0x62,0x00, -0x2B,0x10,0xE5,0x00, -0xD6,0xFF,0x40,0x14, -0x00,0x1D,0x64,0xAC, -0xE0,0x68,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0x10,0xC8,0x00, -0xC0,0x18,0x09,0x00, -0x08,0x00,0x44,0x8C, -0x23,0x18,0x69,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x03,0x00,0xE7,0x24, -0x21,0x18,0x62,0x00, -0x2B,0x10,0xE5,0x00, -0xC8,0xFF,0x40,0x14, -0xFC,0x1C,0x64,0xAC, -0xE0,0x68,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0x10,0xC8,0x00, -0xC0,0x18,0x09,0x00, -0x08,0x00,0x44,0x8C, -0x23,0x18,0x69,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x03,0x00,0xE7,0x24, -0x21,0x18,0x62,0x00, -0x2B,0x10,0xE5,0x00, -0xBA,0xFF,0x40,0x14, -0xF8,0x1C,0x64,0xAC, -0xE0,0x68,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0x10,0xC8,0x00, -0xC0,0x18,0x09,0x00, -0x08,0x00,0x44,0x8C, -0x23,0x18,0x69,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x03,0x00,0xE7,0x24, -0x21,0x18,0x62,0x00, -0x2B,0x10,0xE5,0x00, -0xAC,0xFF,0x40,0x14, -0x08,0x1D,0x64,0xAC, -0xE0,0x68,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0x10,0xC8,0x00, -0xC0,0x18,0x09,0x00, -0x08,0x00,0x44,0x8C, -0x23,0x18,0x69,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x03,0x00,0xE7,0x24, -0x21,0x18,0x62,0x00, -0x2B,0x10,0xE5,0x00, -0x9E,0xFF,0x40,0x14, -0xF4,0x1C,0x64,0xAC, -0xE0,0x68,0x00,0x08, -0x00,0x00,0x00,0x00, -0x21,0x10,0xC8,0x00, -0xC0,0x18,0x09,0x00, -0x08,0x00,0x44,0x8C, -0x23,0x18,0x69,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x80,0x18,0x03,0x00, -0x03,0x00,0xE7,0x24, -0x21,0x18,0x62,0x00, -0x2B,0x10,0xE5,0x00, -0x90,0xFF,0x40,0x14, -0xF0,0x1C,0x64,0xAC, -0xE0,0x68,0x00,0x08, -0x00,0x00,0x00,0x00, -0x25,0xB0,0x02,0x3C, -0xFC,0x37,0x03,0x24, -0x40,0x00,0x42,0x34, -0x02,0x80,0x04,0x3C, -0x00,0x00,0x43,0xA4, -0xE8,0xFF,0xBD,0x27, -0xA4,0xCF,0x84,0x24, -0x10,0x00,0xBF,0xAF, -0x94,0x68,0x00,0x0C, -0x74,0x01,0x05,0x24, -0x02,0x80,0x02,0x3C, -0xDE,0x5D,0x44,0x90, -0x12,0x00,0x03,0x24, -0x34,0x00,0x83,0x10, -0x13,0x00,0x82,0x28, -0x17,0x00,0x40,0x14, -0x11,0x00,0x02,0x24, -0x22,0x00,0x02,0x24, -0x36,0x00,0x82,0x10, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x04,0x3C, -0x2C,0xCC,0x84,0x24, -0xBF,0x68,0x00,0x0C, -0x54,0x00,0x05,0x24, -0x02,0x80,0x02,0x3C, -0x4A,0xF3,0x44,0x90, -0x01,0x00,0x03,0x24, -0x1A,0x00,0x83,0x10, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x2C,0xC7,0x84,0x24, -0x94,0x68,0x00,0x0C, -0x40,0x01,0x05,0x24, -0x10,0x00,0xBF,0x8F, -0x84,0x08,0x04,0x24, -0xFF,0x00,0x05,0x24, -0x58,0x00,0x06,0x24, -0x1B,0x47,0x00,0x08, -0x18,0x00,0xBD,0x27, -0xED,0xFF,0x82,0x14, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x04,0x3C, -0xE4,0xCE,0x84,0x24, -0xA7,0x68,0x00,0x0C, -0x30,0x00,0x05,0x24, -0x02,0x80,0x04,0x3C, -0x2C,0xCC,0x84,0x24, -0xBF,0x68,0x00,0x0C, -0x54,0x00,0x05,0x24, -0x02,0x80,0x02,0x3C, -0x4A,0xF3,0x44,0x90, -0x01,0x00,0x03,0x24, -0xE8,0xFF,0x83,0x14, -0x00,0x00,0x00,0x00, -0x75,0x68,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x2C,0xC7,0x84,0x24, -0x94,0x68,0x00,0x0C, -0x40,0x01,0x05,0x24, -0x10,0x00,0xBF,0x8F, -0x84,0x08,0x04,0x24, -0xFF,0x00,0x05,0x24, -0x58,0x00,0x06,0x24, -0x1B,0x47,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x04,0x3C, -0x30,0xCE,0x84,0x24, -0x2D,0x00,0x05,0x24, -0xA7,0x68,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x64,0x69,0x00,0x08, -0x02,0x80,0x04,0x3C, -0x7C,0xCD,0x84,0x24, -0x7B,0x69,0x00,0x08, -0x2D,0x00,0x05,0x24, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xB0,0xAF, -0x50,0x0C,0x04,0x24, -0xFF,0x00,0x05,0x24, -0x02,0x80,0x10,0x3C, -0x14,0x00,0xBF,0xAF, -0x0A,0x47,0x00,0x0C, -0x30,0x1F,0x10,0x26, -0x60,0x1D,0x02,0xA2, -0x58,0x0C,0x04,0x24, -0x0A,0x47,0x00,0x0C, -0xFF,0x00,0x05,0x24, -0x61,0x1D,0x02,0xA2, -0x60,0x0C,0x04,0x24, -0x0A,0x47,0x00,0x0C, -0xFF,0x00,0x05,0x24, -0x62,0x1D,0x02,0xA2, -0x68,0x0C,0x04,0x24, -0x0A,0x47,0x00,0x0C, -0xFF,0x00,0x05,0x24, -0x63,0x1D,0x02,0xA2, -0x38,0x0C,0x04,0x24, -0x0A,0x47,0x00,0x0C, -0xFF,0x00,0x05,0x24, -0xE8,0x1C,0x02,0xA2, -0x34,0x0C,0x04,0x24, -0x0A,0x47,0x00,0x0C, -0xFF,0xFF,0x05,0x24, -0xEC,0x1C,0x02,0xAE, -0x14,0x00,0xBF,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x03,0x3C, -0x84,0xA7,0x42,0x24, -0xBC,0x5E,0x60,0xAC, -0x1C,0x5E,0xA2,0xAC, -0x02,0x80,0x03,0x3C, -0x00,0x80,0x02,0x3C, -0xC0,0x5E,0x60,0xA4, -0x1C,0x5E,0xA4,0x24, -0x88,0x0D,0x42,0x24, -0x02,0x80,0x03,0x3C, -0xC2,0x5E,0x60,0xA4, -0x08,0x00,0x82,0xAC, -0x00,0x80,0x03,0x3C, -0x00,0x80,0x02,0x3C, -0x02,0x80,0x06,0x3C, -0x88,0x10,0x42,0x24, -0xA4,0x0D,0x63,0x24, -0xC4,0x5E,0xC7,0x24, -0x14,0x00,0x82,0xAC, -0x10,0x00,0x83,0xAC, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xC4,0x5E,0xC0,0xAC, -0x04,0x00,0xE0,0xAC, -0xCC,0x5E,0x40,0xA0, -0xD0,0x5E,0x60,0xAC, -0x01,0x80,0x02,0x3C, -0x30,0xD2,0x42,0x24, -0x7C,0x00,0x82,0xAC, -0x00,0x80,0x03,0x3C, -0x00,0x80,0x02,0x3C, -0xA4,0x10,0x63,0x24, -0x64,0x13,0x42,0x24, -0x1C,0x00,0x83,0xAC, -0x20,0x00,0x82,0xAC, -0x00,0x80,0x03,0x3C, -0x00,0x80,0x02,0x3C, -0x2C,0x16,0x63,0x24, -0xF0,0x18,0x42,0x24, -0x24,0x00,0x83,0xAC, -0x28,0x00,0x82,0xAC, -0x00,0x80,0x03,0x3C, -0x01,0x80,0x02,0x3C, -0xC8,0x2A,0x63,0x24, -0x98,0x01,0x42,0x24, -0x2C,0x00,0x83,0xAC, -0x50,0x00,0x82,0xAC, -0x00,0x80,0x03,0x3C, -0x00,0x80,0x02,0x3C, -0x10,0x1C,0x63,0x24, -0xFC,0x1D,0x42,0x24, -0x30,0x00,0x83,0xAC, -0x38,0x00,0x82,0xAC, -0x00,0x80,0x03,0x3C, -0x00,0x80,0x02,0x3C, -0x00,0x03,0x63,0x24, -0xB4,0x1B,0x42,0x24, -0x4C,0x00,0x83,0xAC, -0x08,0x00,0xE0,0x03, -0x3C,0x00,0x82,0xAC, -0x25,0xB0,0x02,0x3C, -0x08,0x00,0x42,0x34, -0x00,0x00,0x43,0x8C, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0x02,0x80,0x0E,0x3C, -0x02,0x80,0x08,0x3C, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0xF8,0x03,0x4D,0x24, -0x00,0x1C,0x6C,0x24, -0x01,0x00,0x07,0x24, -0x00,0x00,0xCB,0x25, -0xFF,0xFF,0x0A,0x24, -0x00,0x04,0x09,0x25, -0x80,0x1A,0x07,0x00, -0x21,0x10,0x6B,0x00, -0x00,0x00,0x42,0xAC, -0x90,0x00,0x4A,0xAC, -0x00,0x04,0x04,0x8D, -0x01,0x00,0xE7,0x24, -0x08,0x00,0x45,0x24, -0x21,0x18,0x6D,0x00, -0x07,0x00,0xE6,0x28, -0x04,0x00,0x82,0xAC, -0x00,0x00,0x44,0xAC, -0x04,0x00,0x49,0xAC, -0x00,0x04,0x02,0xAD, -0x8C,0x00,0x40,0xAC, -0x6C,0x00,0xA3,0xAC, -0xF0,0xFF,0xC0,0x14, -0x68,0x00,0xAC,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0xC9,0xAD, -0x07,0x00,0xA2,0x2C, -0x13,0x00,0x40,0x10, -0xFF,0xFF,0x07,0x24, -0x02,0x80,0x02,0x3C, -0x80,0x1A,0x05,0x00, -0x00,0x00,0x42,0x24, -0x0E,0x00,0xA0,0x10, -0x21,0x30,0x62,0x00, -0x90,0x00,0xC3,0x8C, -0xFF,0xFF,0x02,0x24, -0x0A,0x00,0x62,0x14, -0x00,0x00,0x00,0x00, -0x8C,0x00,0xC2,0x8C, -0x00,0x00,0x00,0x00, -0x06,0x00,0x40,0x14, -0x00,0x00,0x00,0x00, -0x01,0x00,0x02,0x24, -0x88,0x00,0xC4,0xAC, -0x8C,0x00,0xC2,0xAC, -0x90,0x00,0xC5,0xAC, -0x21,0x38,0xA0,0x00, -0x08,0x00,0xE0,0x03, -0x21,0x10,0xE0,0x00, -0x25,0xB0,0x06,0x3C, -0x02,0x80,0x02,0x3C, -0xE0,0xFF,0xBD,0x27, -0x68,0xA8,0x42,0x24, -0xDB,0xFF,0x03,0x24, -0x18,0x03,0xC4,0x34, -0x27,0x00,0xC5,0x34, -0x00,0x00,0x82,0xAC, -0x1C,0x00,0xBF,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x00,0x00,0xA3,0xA0, -0x06,0x00,0xC2,0x34, -0x00,0x00,0x43,0x90, -0x00,0x00,0x00,0x00, -0x0F,0x00,0x63,0x30, -0x5A,0x00,0x60,0x14, -0x01,0x00,0x02,0x24, -0x1B,0x00,0xC3,0x34, -0x07,0x00,0x02,0x24, -0x00,0x00,0x62,0xA0, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x50,0x24, -0x34,0x1C,0x04,0x8E, -0xCB,0x45,0x00,0x0C, -0x10,0x00,0x05,0x24, -0x40,0x1C,0x04,0x8E, -0x10,0x00,0x05,0x3C, -0x01,0x00,0x06,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x90,0x40,0x00, -0x3C,0x1C,0x04,0x8E, -0x10,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x58,0x1C,0x04,0x8E, -0x00,0x04,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x58,0x1C,0x04,0x8E, -0x00,0x08,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x02,0x80,0x05,0x3C, -0xEC,0xD9,0xA5,0x24, -0x21,0x20,0x00,0x00, -0x9F,0x47,0x00,0x0C, -0xCA,0x00,0x06,0x24, -0x31,0x00,0x40,0x10, -0x21,0x18,0x00,0x00, -0x02,0x80,0x02,0x3C, -0xE7,0x5D,0x43,0x90, -0x01,0x00,0x11,0x24, -0x57,0x00,0x71,0x10, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x02,0x3C, -0x4A,0xF3,0x43,0x90, -0x00,0x00,0x00,0x00, -0x58,0x00,0x71,0x10, -0x02,0x80,0x05,0x3C, -0x34,0x1C,0x04,0x8E, -0x21,0x30,0x40,0x02, -0x10,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x02,0x80,0x11,0x3C, -0xDE,0x5D,0x23,0x92, -0x11,0x00,0x02,0x24, -0x2E,0x00,0x62,0x10, -0x00,0x08,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x01,0x00,0x04,0x24, -0x34,0x1C,0x04,0x8E, -0xCB,0x45,0x00,0x0C, -0x10,0x00,0x05,0x3C, -0x40,0x1C,0x04,0x8E, -0x10,0x00,0x05,0x3C, -0x01,0x00,0x06,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x90,0x40,0x00, -0x3C,0x1C,0x04,0x8E, -0x10,0x00,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x58,0x1C,0x04,0x8E, -0x00,0x04,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x58,0x1C,0x04,0x8E, -0x00,0x08,0x05,0x24, -0xA9,0x45,0x00,0x0C, -0x21,0x30,0x00,0x00, -0x02,0x80,0x05,0x3C, -0x94,0xD9,0xA5,0x24, -0x01,0x00,0x04,0x24, -0x9F,0x47,0x00,0x0C, -0x16,0x00,0x06,0x24, -0x0C,0x00,0x40,0x14, -0x21,0x18,0x00,0x00, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xA9,0xFF,0x62,0x14, -0x1F,0x00,0xC3,0x34, -0x2F,0x6A,0x00,0x08, -0x07,0x00,0x02,0x24, -0x34,0x1C,0x04,0x8E, -0x21,0x30,0x40,0x02, -0xA9,0x45,0x00,0x0C, -0x10,0x00,0x05,0x3C, -0x00,0x08,0x04,0x24, -0x00,0x01,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0x00,0x08,0x04,0x24, -0x00,0x02,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x01,0x00,0x06,0x24, -0xDE,0x5D,0x23,0x92, -0x11,0x00,0x02,0x24, -0x1D,0x00,0x62,0x10, -0x00,0x08,0x04,0x24, -0xE6,0x44,0x00,0x0C, -0x21,0x20,0x00,0x00, -0x0F,0x00,0x05,0x3C, -0x0C,0x00,0x06,0x3C, -0xFF,0xFF,0xA5,0x34, -0x00,0xB4,0xC6,0x34, -0x5F,0x47,0x00,0x0C, -0x08,0x00,0x04,0x24, -0x1C,0x00,0xBF,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x01,0x00,0x03,0x24, -0x21,0x10,0x60,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x84,0xD8,0xA5,0x24, -0x21,0x20,0x00,0x00, -0x9F,0x47,0x00,0x0C, -0x16,0x00,0x06,0x24, -0x55,0x6A,0x00,0x08, -0x02,0x80,0x02,0x3C, -0xDC,0xD8,0xA5,0x24, -0x21,0x20,0x00,0x00, -0x9F,0x47,0x00,0x0C, -0x16,0x00,0x06,0x24, -0x59,0x6A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x00,0xFF,0x05,0x3C, -0xA9,0x45,0x00,0x0C, -0x03,0x00,0x06,0x24, -0x9A,0x6A,0x00,0x08, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x02,0x80,0x02,0x3C, -0x61,0x5A,0x47,0x90, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x03,0x00,0x03,0x24, -0x1E,0x3B,0x84,0x24, -0xAC,0xE3,0xA5,0x24, -0x0F,0x00,0xE3,0x10, -0x0D,0x00,0x06,0x24, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x1E,0x3B,0x84,0x24, -0x5C,0xE3,0xA5,0x24, -0x10,0x52,0x00,0x0C, -0x0D,0x00,0x06,0x24, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x10,0x00,0xBF,0x8F, -0x2B,0x3B,0x84,0x24, -0x6C,0xE3,0xA5,0x24, -0x0D,0x00,0x06,0x24, -0x10,0x52,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x10,0x52,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0x10,0x00,0xBF,0x8F, -0x2B,0x3B,0x84,0x24, -0x9C,0xE3,0xA5,0x24, -0x0D,0x00,0x06,0x24, -0x10,0x52,0x00,0x08, -0x18,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x02,0x80,0x11,0x3C, -0x02,0x80,0x05,0x3C, -0x02,0x80,0x10,0x3C, -0x30,0x1F,0x10,0x26, -0x64,0x5A,0x24,0x26, -0x14,0xDD,0xA5,0x24, -0x34,0x00,0x06,0x24, -0x18,0x00,0xBF,0xAF, -0x10,0x52,0x00,0x0C, -0x64,0x5A,0x31,0x26, -0xBD,0x6A,0x00,0x0C, -0x68,0x3B,0x11,0xAE, -0x02,0x00,0x11,0x24, -0x02,0x80,0x04,0x3C, -0x00,0x80,0x06,0x3C, -0xA0,0x38,0x11,0xA2, -0xBC,0x57,0x84,0x24, -0xFC,0x64,0xC6,0x24, -0x21,0x28,0x00,0x00, -0xA2,0x23,0x00,0x0C, -0x98,0x38,0x00,0xAE, -0x02,0x80,0x04,0x3C, -0x01,0x80,0x06,0x3C, -0xBC,0x38,0x11,0xA2, -0xD8,0x57,0x84,0x24, -0x0C,0x31,0xC6,0x24, -0x21,0x28,0x00,0x00, -0xA2,0x23,0x00,0x0C, -0xB4,0x38,0x00,0xAE, -0x02,0x80,0x04,0x3C, -0x01,0x80,0x06,0x3C, -0xD8,0x38,0x11,0xA2, -0xF4,0x57,0x84,0x24, -0xC0,0x2E,0xC6,0x24, -0x21,0x28,0x00,0x00, -0xA2,0x23,0x00,0x0C, -0xD0,0x38,0x00,0xAE, -0x02,0x80,0x04,0x3C, -0x01,0x80,0x06,0x3C, -0xF4,0x38,0x11,0xA2, -0x10,0x58,0x84,0x24, -0x14,0x25,0xC6,0x24, -0x21,0x28,0x00,0x00, -0xA2,0x23,0x00,0x0C, -0xEC,0x38,0x00,0xAE, -0x02,0x80,0x04,0x3C, -0x00,0x80,0x06,0x3C, -0x10,0x39,0x11,0xA2, -0x2C,0x58,0x84,0x24, -0x58,0x64,0xC6,0x24, -0x21,0x28,0x00,0x00, -0xA2,0x23,0x00,0x0C, -0x08,0x39,0x00,0xAE, -0x02,0x80,0x04,0x3C, -0x00,0x80,0x06,0x3C, -0x48,0x39,0x11,0xA2, -0x40,0x39,0x00,0xAE, -0x64,0x58,0x84,0x24, -0x38,0x3B,0xC6,0x24, -0xA2,0x23,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x02,0x80,0x02,0x3C, -0x49,0xF3,0x43,0x90, -0x18,0x00,0xBF,0x8F, -0x14,0x00,0xB1,0x8F, -0x9C,0x3E,0x03,0xA2, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x03,0x80,0x05,0x3C, -0x00,0x80,0xA5,0x24, -0x40,0x10,0x0D,0x3C, -0xFF,0xFF,0xA5,0x30, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x42,0x24, -0x25,0xC8,0xAD,0x00, -0x38,0x37,0x59,0xAC, -0x00,0x01,0x39,0x27, -0xE0,0xFF,0xBD,0x27, -0x44,0x37,0x59,0xAC, -0x00,0x01,0x39,0x27, -0x1C,0x00,0xB7,0xAF, -0x18,0x00,0xB6,0xAF, -0x14,0x00,0xB5,0xAF, -0x10,0x00,0xB4,0xAF, -0x0C,0x00,0xB3,0xAF, -0x08,0x00,0xB2,0xAF, -0x04,0x00,0xB1,0xAF, -0x00,0x00,0xB0,0xAF, -0x50,0x37,0x59,0xAC, -0x00,0x01,0x39,0x27, -0x5C,0x37,0x59,0xAC, -0xAA,0x1B,0x44,0x90, -0x00,0x01,0x39,0x27, -0x68,0x37,0x59,0xAC, -0x00,0x01,0x39,0x27, -0x74,0x37,0x59,0xAC, -0x20,0xB0,0x06,0x3C, -0x44,0x37,0x48,0x8C, -0x50,0x37,0x49,0x8C, -0x5C,0x37,0x4A,0x8C, -0x68,0x37,0x4B,0x8C, -0x74,0x37,0x4C,0x8C, -0x00,0x22,0x04,0x00, -0x00,0x01,0xC7,0x34, -0xFF,0x1F,0x03,0x3C, -0x00,0x01,0x39,0x27, -0xFF,0xFF,0x63,0x34, -0x21,0x38,0x87,0x00, -0x21,0x20,0x86,0x00, -0x24,0x38,0xE3,0x00, -0x20,0x10,0x06,0x3C, -0x24,0x20,0x83,0x00, -0x80,0x37,0x59,0xAC, -0x21,0x78,0x20,0x03, -0x25,0x28,0xAD,0x00, -0x25,0xB0,0x0E,0x3C, -0x00,0x01,0x39,0x27, -0x34,0x37,0x45,0xAC, -0x40,0x37,0x48,0xAC, -0x4C,0x37,0x49,0xAC, -0x58,0x37,0x4A,0xAC, -0xF8,0x36,0x44,0xAC, -0x64,0x37,0x4B,0xAC, -0x04,0x37,0x47,0xAC, -0x70,0x37,0x4C,0xAC, -0xAC,0x00,0xC3,0x35, -0xCC,0x36,0x46,0xAC, -0xC8,0x36,0x46,0xAC, -0xD8,0x36,0x46,0xAC, -0xD4,0x36,0x46,0xAC, -0xE4,0x36,0x46,0xAC, -0x8C,0x37,0x59,0xAC, -0xFC,0x36,0x44,0xAC, -0x08,0x37,0x47,0xAC, -0x7C,0x37,0x4F,0xAC, -0xE0,0x36,0x46,0xAC, -0xF0,0x36,0x46,0xAC, -0xEC,0x36,0x46,0xAC, -0x14,0x37,0x46,0xAC, -0x10,0x37,0x46,0xAC, -0x00,0x02,0x39,0x27, -0x00,0x00,0x68,0x8C, -0xAC,0x1B,0x47,0x94, -0xA4,0x37,0x59,0xAC, -0xB0,0x00,0xC3,0x35, -0x00,0x00,0x75,0x8C, -0x21,0x10,0x05,0x3C, -0x8C,0x37,0x52,0x8C, -0x23,0x10,0x0B,0x3C, -0x22,0x10,0x0F,0x3C, -0x02,0x80,0x14,0x3C, -0x02,0x80,0x16,0x3C, -0x02,0x80,0x17,0x3C, -0x02,0x80,0x18,0x3C, -0x00,0x80,0xA4,0x34, -0x21,0x98,0x20,0x03, -0x23,0x20,0x87,0x00, -0x00,0x04,0x39,0x27, -0x24,0x10,0x07,0x3C, -0x9C,0x57,0x8A,0x26, -0xA4,0x57,0xC9,0x26, -0xAC,0x57,0xEC,0x26, -0xB4,0x57,0x0D,0x27, -0x00,0x04,0x70,0x35, -0x01,0x00,0x08,0x25, -0x00,0x40,0xF1,0x35, -0x00,0x01,0xCE,0x35, -0x01,0x00,0x03,0x24, -0x88,0x37,0x52,0xAC, -0x91,0x37,0x43,0xA0, -0xA0,0x37,0x53,0xAC, -0x08,0x38,0x50,0xAC, -0xCC,0x37,0x48,0xAC, -0xD8,0x37,0x44,0xAC, -0xFC,0x37,0x51,0xAC, -0xF0,0x37,0x55,0xAC, -0x00,0x00,0xC7,0xAD, -0xEC,0x37,0x47,0xAC, -0x0C,0x38,0x46,0xAC, -0x20,0x37,0x46,0xAC, -0x1C,0x37,0x46,0xAC, -0xAA,0x37,0x40,0xA4, -0xA9,0x37,0x40,0xA0, -0xA8,0x37,0x40,0xA0, -0x00,0x38,0x4B,0xAC, -0x04,0x38,0x4B,0xAC, -0xC4,0x37,0x45,0xAC, -0xC8,0x37,0x45,0xAC, -0xD0,0x37,0x45,0xAC, -0xD4,0x37,0x45,0xAC, -0xF4,0x37,0x4F,0xAC, -0xF8,0x37,0x4F,0xAC, -0xE8,0x37,0x47,0xAC, -0x10,0x38,0x46,0xAC, -0x1C,0x38,0x59,0xAC, -0x18,0x38,0x59,0xAC, -0x04,0x00,0x4A,0xAD, -0x9C,0x57,0x8A,0xAE, -0x04,0x00,0x8C,0xAD, -0xA4,0x57,0xC9,0xAE, -0x04,0x00,0xAD,0xAD, -0xAC,0x57,0xEC,0xAE, -0xB4,0x57,0x0D,0xAF, -0x04,0x00,0x29,0xAD, -0x02,0x80,0x02,0x3C, -0x00,0x1C,0x43,0x24, -0x01,0x00,0x05,0x24, -0x21,0x20,0x20,0x01, -0x0F,0x00,0x06,0x24, -0x21,0x10,0x80,0x00, -0xFF,0xFF,0xC6,0x24, -0x08,0x00,0x79,0xAC, -0x00,0x00,0x63,0xAC, -0x10,0x00,0x65,0xAC, -0x00,0x00,0x69,0xAC, -0x21,0x20,0x60,0x00, -0x04,0x00,0x62,0xAC, -0x00,0x00,0x43,0xAC, -0x00,0x01,0x39,0x27, -0xF5,0xFF,0xC1,0x04, -0x18,0x00,0x63,0x24, -0x02,0x80,0x02,0x3C, -0xAC,0x57,0x48,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x04,0x00,0x07,0x8D, -0x80,0x1D,0x4B,0x24, -0x04,0x00,0x24,0xAD, -0x00,0x1C,0x6A,0x24, -0x02,0x00,0x09,0x24, -0x21,0x28,0x00,0x00, -0x0F,0x00,0x06,0x24, -0x21,0x20,0xAB,0x00, -0x21,0x10,0xAA,0x00, -0xFF,0xFF,0xC6,0x24, -0x88,0x01,0x59,0xAC, -0x90,0x01,0x49,0xAC, -0x18,0x00,0xA5,0x24, -0x00,0x00,0x88,0xAC, -0x04,0x00,0x87,0xAC, -0x00,0x00,0xE4,0xAC, -0x00,0x02,0x39,0x27, -0xF5,0xFF,0xC1,0x04, -0x21,0x38,0x80,0x00, -0x02,0x80,0x02,0x3C, -0xB4,0x57,0x49,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x04,0x00,0x27,0x8D, -0x00,0x1F,0x4B,0x24, -0x04,0x00,0x04,0xAD, -0x00,0x1C,0x6A,0x24, -0x03,0x00,0x08,0x24, -0x21,0x28,0x00,0x00, -0x01,0x00,0x06,0x24, -0x21,0x20,0xAB,0x00, -0x21,0x10,0xAA,0x00, -0xFF,0xFF,0xC6,0x24, -0x08,0x03,0x59,0xAC, -0x10,0x03,0x48,0xAC, -0x18,0x00,0xA5,0x24, -0x00,0x00,0x89,0xAC, -0x04,0x00,0x87,0xAC, -0x00,0x00,0xE4,0xAC, -0x00,0x08,0x39,0x27, -0xF5,0xFF,0xC1,0x04, -0x21,0x38,0x80,0x00, -0x1C,0x00,0xB7,0x8F, -0x18,0x00,0xB6,0x8F, -0x14,0x00,0xB5,0x8F, -0x10,0x00,0xB4,0x8F, -0x0C,0x00,0xB3,0x8F, -0x08,0x00,0xB2,0x8F, -0x04,0x00,0xB1,0x8F, -0x00,0x00,0xB0,0x8F, -0x20,0x00,0xBD,0x27, -0x08,0x00,0xE0,0x03, -0x04,0x00,0x24,0xAD, -0xD0,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x20,0x00,0xB2,0xAF, -0x02,0x80,0x03,0x3C, -0x78,0xE8,0x52,0x24, -0x02,0x80,0x02,0x3C, -0x28,0x00,0xB4,0xAF, -0x24,0x00,0xB3,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x2C,0x00,0xBF,0xAF, -0x04,0xE8,0x73,0x24, -0x30,0x1F,0x50,0x24, -0x21,0x88,0x00,0x00, -0x02,0x80,0x14,0x3C, -0xDD,0x59,0x00,0x0C, -0x21,0x20,0x20,0x02, -0x1C,0x24,0x05,0x8E, -0x6C,0x00,0x66,0x8E, -0xE4,0xE7,0x82,0x26, -0x6C,0x00,0x43,0x8E, -0x1B,0x00,0x44,0x90, -0xFF,0xF1,0x02,0x24, -0x21,0x18,0x66,0x00, -0x24,0x28,0xA2,0x00, -0x00,0x21,0x04,0x00, -0x42,0x18,0x03,0x00, -0x00,0x02,0xA5,0x34, -0xE8,0x23,0x03,0xAE, -0x0C,0x24,0x04,0xAE, -0x1C,0x24,0x05,0xAE, -0x10,0x24,0x04,0xAE, -0x21,0x30,0x00,0x00, -0x21,0x10,0x06,0x02, -0x01,0x00,0xC6,0x24, -0x1D,0x00,0xC3,0x28, -0x3D,0x24,0x40,0xA0, -0x20,0x24,0x40,0xA0, -0xFA,0xFF,0x60,0x14, -0x5A,0x24,0x40,0xA0, -0x01,0x00,0x31,0x26, -0x20,0x00,0x22,0x2A, -0x78,0x24,0x00,0xAE, -0xE3,0xFF,0x40,0x14, -0x94,0x00,0x10,0x26, -0x02,0x80,0x02,0x3C, -0x02,0x80,0x03,0x3C, -0x30,0x1F,0x4B,0x24, -0x02,0x80,0x02,0x3C, -0x78,0xE8,0x6F,0x24, -0x04,0xE8,0x4D,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xE4,0xE7,0x6E,0x24, -0xC4,0xE7,0x4C,0x24, -0x21,0x88,0x00,0x00, -0x80,0x18,0x11,0x00, -0x21,0x20,0x6D,0x00, -0x21,0x10,0x6F,0x00, -0x21,0x28,0x2E,0x02, -0x21,0x30,0x2C,0x02, -0x00,0x00,0x88,0x8C, -0x00,0x00,0xA9,0x90, -0x00,0x00,0xC7,0x90, -0x00,0x00,0x4A,0x8C, -0x21,0x10,0x2B,0x02, -0x01,0x00,0x31,0x26, -0x21,0x18,0x6B,0x00, -0x1D,0x00,0x24,0x2A, -0x60,0x05,0x68,0xAC, -0x3E,0x05,0x47,0xA0, -0xD4,0x05,0x6A,0xAC, -0xEF,0xFF,0x80,0x14, -0x04,0x05,0x49,0xA0, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x4A,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xA0,0xE6,0x6B,0x24, -0x40,0xE5,0x4C,0x24, -0x21,0x88,0x00,0x00, -0x21,0x48,0x00,0x00, -0x21,0x30,0x00,0x00, -0x21,0x40,0x2A,0x01, -0x21,0x38,0x2B,0x01, -0x21,0x10,0xE6,0x00, -0x91,0x00,0x44,0x90, -0x00,0x00,0x45,0x90, -0x21,0x18,0x06,0x01, -0x01,0x00,0xC6,0x24, -0x05,0x00,0xC2,0x28, -0x39,0x04,0x64,0xA0, -0xF8,0xFF,0x40,0x14, -0xA8,0x03,0x65,0xA0, -0x21,0x10,0x2C,0x02, -0x1D,0x00,0x44,0x90, -0x00,0x00,0x45,0x90, -0x21,0x18,0x2A,0x02, -0x01,0x00,0x31,0x26, -0x1D,0x00,0x22,0x2A, -0xE7,0x04,0x64,0xA0, -0xCA,0x04,0x65,0xA0, -0xEB,0xFF,0x40,0x14, -0x05,0x00,0x29,0x25, -0x52,0x00,0x02,0x24, -0x10,0x00,0xA2,0xA3, -0x41,0x00,0x03,0x24, -0x4D,0x00,0x02,0x24, -0x02,0x80,0x07,0x3C, -0x64,0xF3,0xE7,0x24, -0x11,0x00,0xA3,0xA3, -0x12,0x00,0xA2,0xA3, -0xE8,0x03,0x03,0x24, -0x01,0x00,0x02,0x24, -0x01,0x80,0x06,0x3C, -0x10,0x00,0xA5,0x27, -0x21,0x20,0xE0,0x00, -0xDC,0x93,0xC6,0x24, -0x0C,0x00,0xE3,0xAC, -0x14,0x00,0xE2,0xA0, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x2C,0x00,0xBF,0x8F, -0x28,0x00,0xB4,0x8F, -0x24,0x00,0xB3,0x8F, -0x20,0x00,0xB2,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x30,0x00,0xBD,0x27, -0x90,0xFF,0xBD,0x27, -0x48,0x00,0xB0,0xAF, -0x25,0xB0,0x10,0x3C, -0x6C,0x00,0xBF,0xAF, -0x68,0x00,0xBE,0xAF, -0x64,0x00,0xB7,0xAF, -0x58,0x00,0xB4,0xAF, -0x54,0x00,0xB3,0xAF, -0x50,0x00,0xB2,0xAF, -0x4C,0x00,0xB1,0xAF, -0x60,0x00,0xB6,0xAF, -0x5C,0x00,0xB5,0xAF, -0xE0,0x0E,0x02,0x36, -0x21,0x20,0x40,0x00, -0x00,0x00,0x42,0x8C, -0xDC,0x0E,0x12,0x36, -0x70,0x0E,0x13,0x36, -0x10,0x00,0xA2,0xAF, -0x00,0x00,0x42,0x8E, -0x78,0x0E,0x1E,0x36, -0x7C,0x0E,0x14,0x36, -0x14,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8E, -0x25,0xB0,0x02,0x3C, -0x74,0x0E,0x42,0x34, -0x18,0x00,0xA3,0xAF, -0x00,0x00,0x42,0x8C, -0xD4,0x0E,0x10,0x36, -0xED,0x3F,0x11,0x3C, -0x1C,0x00,0xA2,0xAF, -0x00,0x00,0xC3,0x8F, -0xFB,0x92,0x25,0x36, -0x25,0xB0,0x17,0x3C, -0x20,0x00,0xA3,0xAF, -0x00,0x00,0x82,0x8E, -0x25,0xB0,0x03,0x3C, -0x80,0x0E,0x63,0x34, -0x24,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8C, -0x25,0xB0,0x02,0x3C, -0x84,0x0E,0x42,0x34, -0x28,0x00,0xA3,0xAF, -0x00,0x00,0x42,0x8C, -0x25,0xB0,0x03,0x3C, -0x88,0x0E,0x63,0x34, -0x2C,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8C, -0x25,0xB0,0x02,0x3C, -0x8C,0x0E,0x42,0x34, -0x30,0x00,0xA3,0xAF, -0x00,0x00,0x42,0x8C, -0x25,0xB0,0x03,0x3C, -0xD0,0x0E,0x63,0x34, -0x34,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8C, -0x00,0x00,0x00,0x00, -0x38,0x00,0xA3,0xAF, -0x00,0x00,0x02,0x8E, -0x25,0xB0,0x03,0x3C, -0xD8,0x0E,0x63,0x34, -0x3C,0x00,0xA2,0xAF, -0x00,0x00,0x63,0x8C, -0x02,0x5C,0x00,0x0C, -0x40,0x00,0xA3,0xAF, -0x21,0x20,0x40,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x21,0x20,0x60,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x02,0x80,0x05,0x3C, -0xC0,0xED,0xA5,0x24, -0x00,0x00,0xA4,0x8C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x13,0x3C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x21,0x20,0xC0,0x03, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x21,0x20,0x80,0x02, -0x02,0x80,0x02,0x3C, -0xC4,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0xA0,0x00,0x12,0x3C, -0x02,0x80,0x03,0x3C, -0xC8,0xED,0x63,0x24, -0x00,0x00,0x64,0x8C, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x02,0x80,0x05,0x3C, -0xCC,0xED,0xA5,0x24, -0x00,0x00,0xA4,0x8C, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x02,0x80,0x02,0x3C, -0xD0,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x02,0x80,0x03,0x3C, -0xD4,0xED,0x63,0x24, -0x00,0x00,0x64,0x8C, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x21,0x20,0x00,0x02, -0x02,0x5C,0x00,0x0C, -0xFB,0x92,0x25,0x36, -0x02,0x80,0x05,0x3C, -0xD8,0xED,0xA5,0x24, -0x00,0x00,0xA4,0x8C, -0xFB,0x92,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x21,0x80,0x00,0x00, -0x14,0x02,0x11,0x3C, -0x20,0x08,0xE4,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x65,0x36, -0x28,0x08,0xE4,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x65,0x36, -0x30,0x54,0x45,0x36, -0x02,0x5C,0x00,0x0C, -0x04,0x0C,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x08,0x00,0x05,0x3C, -0xE4,0x00,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x08,0x0C,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x80,0x80,0x05,0x3C, -0x02,0x5C,0x00,0x0C, -0x28,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x02,0x01,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x40,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x16,0x68,0x05,0x3C, -0xC2,0x04,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x44,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0xD1,0x28,0x05,0x24, -0x02,0x5C,0x00,0x0C, -0x4C,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x02,0x01,0x25,0x36, -0x02,0x5C,0x00,0x0C, -0x60,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x16,0x28,0x05,0x3C, -0x05,0x0D,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x64,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x00,0xFB,0x05,0x3C, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x00,0xF8,0x05,0x3C, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x25,0x22,0x00,0x0C, -0x02,0x00,0x04,0x24, -0x00,0x02,0x05,0x3C, -0xD1,0x28,0xA5,0x34, -0x02,0x5C,0x00,0x0C, -0x6C,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x00,0xFB,0x05,0x3C, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x00,0xF8,0x05,0x3C, -0x02,0x5C,0x00,0x0C, -0x48,0x0E,0xE4,0x36, -0x25,0x22,0x00,0x0C, -0x02,0x00,0x04,0x24, -0x33,0x54,0x45,0x36, -0x02,0x5C,0x00,0x0C, -0x04,0x0C,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0xE4,0x00,0x05,0x24, -0x02,0x5C,0x00,0x0C, -0x08,0x0C,0xE4,0x36, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x28,0x0E,0xE4,0x36, -0x02,0x5C,0x00,0x0C, -0x21,0x28,0x00,0x00, -0x20,0x08,0xE4,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x05,0x3C, -0x28,0x08,0xE4,0x36, -0x02,0x5C,0x00,0x0C, -0x00,0x01,0x05,0x3C, -0x25,0xB0,0x02,0x3C, -0xAC,0x0E,0x42,0x34, -0x00,0x00,0x5E,0x8C, -0x00,0xD8,0x02,0x3C, -0x24,0x10,0xC2,0x03, -0x37,0x00,0x40,0x10, -0x01,0x00,0x10,0x26, -0x0A,0x00,0x02,0x2E, -0x97,0xFF,0x40,0x14, -0x00,0x00,0x00,0x00, -0x10,0x00,0xA5,0x8F, -0x25,0xB0,0x10,0x3C, -0x02,0x5C,0x00,0x0C, -0xE0,0x0E,0x04,0x36, -0x14,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0xDC,0x0E,0x04,0x36, -0x18,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x70,0x0E,0x04,0x36, -0x1C,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x74,0x0E,0x04,0x36, -0x20,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x78,0x0E,0x04,0x36, -0x24,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x7C,0x0E,0x04,0x36, -0x28,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x80,0x0E,0x04,0x36, -0x2C,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x84,0x0E,0x04,0x36, -0x30,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x88,0x0E,0x04,0x36, -0x34,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0x8C,0x0E,0x04,0x36, -0x38,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0xD0,0x0E,0x04,0x36, -0x3C,0x00,0xA5,0x8F, -0x02,0x5C,0x00,0x0C, -0xD4,0x0E,0x04,0x36, -0x40,0x00,0xA5,0x8F, -0x88,0x0E,0x04,0x36, -0x6C,0x00,0xBF,0x8F, -0x68,0x00,0xBE,0x8F, -0x64,0x00,0xB7,0x8F, -0x60,0x00,0xB6,0x8F, -0x5C,0x00,0xB5,0x8F, -0x58,0x00,0xB4,0x8F, -0x54,0x00,0xB3,0x8F, -0x50,0x00,0xB2,0x8F, -0x4C,0x00,0xB1,0x8F, -0x48,0x00,0xB0,0x8F, -0x02,0x5C,0x00,0x08, -0x70,0x00,0xBD,0x27, -0x80,0x0C,0xF1,0x36, -0x94,0x0E,0xE3,0x36, -0x00,0x00,0x24,0x8E, -0x00,0x00,0x62,0x8C, -0xFF,0x03,0x03,0x3C, -0xFF,0x03,0x95,0x30, -0x24,0x10,0x43,0x00, -0x02,0x14,0x02,0x00, -0x18,0x00,0x55,0x00, -0x02,0x80,0x10,0x3C, -0x30,0x1F,0x10,0x26, -0x0C,0x00,0x02,0x8E, -0x00,0xFC,0x12,0x24, -0x00,0x00,0x3E,0x8E, -0x24,0x10,0x52,0x00, -0x21,0x20,0x20,0x02, -0x24,0x30,0xD2,0x03, -0xFF,0xFF,0x13,0x3C, -0xFF,0x03,0x73,0x36, -0x12,0x18,0x00,0x00, -0x02,0x1A,0x03,0x00, -0xFF,0x03,0x63,0x30, -0x25,0x10,0x43,0x00, -0xFF,0x03,0x45,0x30, -0x25,0x28,0xC5,0x00, -0x02,0x5C,0x00,0x0C, -0x0C,0x00,0x02,0xAE, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x9C,0x0E,0xE3,0x36, -0x00,0x00,0x62,0x8C, -0xFF,0x03,0x03,0x3C, -0x0C,0x00,0x06,0x8E, -0x24,0x10,0x43,0x00, -0x02,0xB4,0x02,0x00, -0x18,0x00,0xD5,0x02, -0xF0,0xFF,0x02,0x3C, -0xFF,0x03,0x42,0x34, -0x24,0x30,0xC2,0x00, -0x00,0x00,0x3E,0x8E, -0xC0,0xFF,0x04,0x3C, -0xFF,0xFF,0x84,0x34, -0x24,0x10,0xC4,0x03, -0x21,0x20,0x20,0x02, -0xFF,0x0F,0x11,0x3C, -0xFF,0xFF,0x31,0x36, -0x12,0x18,0x00,0x00, -0x02,0x1A,0x03,0x00, -0xFF,0x03,0x63,0x30, -0x80,0x1A,0x03,0x00, -0x25,0x30,0xC3,0x00, -0x82,0x2A,0x06,0x00, -0x3F,0x00,0xA5,0x30, -0x00,0x2C,0x05,0x00, -0x0C,0x00,0x06,0xAE, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0x45,0x00, -0x94,0x0C,0xE4,0x36, -0x00,0x00,0x9E,0x8C, -0x82,0x29,0x16,0x00, -0x00,0x2F,0x05,0x00, -0x24,0x10,0xD1,0x03, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0x45,0x00, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x25,0xB0,0x05,0x3C, -0xA4,0x0E,0xE3,0x36, -0x14,0x0C,0xA5,0x34, -0x00,0x00,0xBE,0x8C, -0x00,0x00,0x62,0x8C, -0xFF,0x03,0x05,0x3C, -0x02,0x80,0x03,0x3C, -0xDC,0xED,0x63,0x24, -0x24,0x10,0x45,0x00, -0x00,0x00,0x64,0x8C, -0x02,0x14,0x02,0x00, -0x24,0x18,0xD2,0x03, -0x25,0xF0,0x62,0x00, -0x02,0x5C,0x00,0x0C, -0x21,0x28,0xC0,0x03, -0x25,0xB0,0x02,0x3C, -0xAC,0x0E,0x42,0x34, -0x00,0x00,0x45,0x8C, -0x3F,0x00,0x03,0x3C, -0x24,0x10,0xD3,0x03, -0x24,0x28,0xA3,0x00, -0x82,0x29,0x05,0x00, -0x25,0x28,0x45,0x00, -0x02,0x80,0x02,0x3C, -0xDC,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0x02,0x5C,0x00,0x0C, -0x00,0x00,0x00,0x00, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x25,0xB0,0x05,0x3C, -0xB4,0x0E,0xE3,0x36, -0x88,0x0C,0xA5,0x34, -0x00,0x00,0xA4,0x8C, -0x00,0x00,0x62,0x8C, -0xFF,0x03,0x03,0x3C, -0xFF,0x03,0x95,0x30, -0x24,0x10,0x43,0x00, -0x02,0x14,0x02,0x00, -0x18,0x00,0x55,0x00, -0x0C,0x00,0x06,0x8E, -0x00,0x00,0xBE,0x8C, -0x02,0x80,0x02,0x3C, -0x24,0x30,0xD2,0x00, -0xE0,0xED,0x42,0x24, -0x00,0x00,0x44,0x8C, -0x24,0x10,0xD2,0x03, -0x12,0x18,0x00,0x00, -0x02,0x1A,0x03,0x00, -0xFF,0x03,0x63,0x30, -0x25,0x30,0xC3,0x00, -0xFF,0x03,0xC5,0x30, -0x25,0x28,0x45,0x00, -0x02,0x5C,0x00,0x0C, -0x0C,0x00,0x06,0xAE, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0xBC,0x0E,0xE2,0x36, -0x00,0x00,0x43,0x8C, -0xFF,0x03,0x05,0x3C, -0x0C,0x00,0x06,0x8E, -0x24,0x18,0x65,0x00, -0x02,0xB4,0x03,0x00, -0x18,0x00,0xD5,0x02, -0x25,0xB0,0x04,0x3C, -0x88,0x0C,0x84,0x34, -0xF0,0xFF,0x03,0x3C, -0x00,0x00,0x9E,0x8C, -0xFF,0x03,0x63,0x34, -0x24,0x30,0xC3,0x00, -0xC0,0xFF,0x04,0x3C, -0x02,0x80,0x05,0x3C, -0xFF,0xFF,0x84,0x34, -0xE0,0xED,0xA5,0x24, -0x24,0xF0,0xC4,0x03, -0x00,0x00,0xA4,0x8C, -0x44,0x00,0xBE,0xAF, -0x12,0x10,0x00,0x00, -0x02,0x12,0x02,0x00, -0xFF,0x03,0x42,0x30, -0x80,0x12,0x02,0x00, -0x25,0x30,0xC2,0x00, -0x82,0x2A,0x06,0x00, -0x3F,0x00,0xA5,0x30, -0x00,0x2C,0x05,0x00, -0x0C,0x00,0x06,0xAE, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0xC5,0x03, -0x9C,0x0C,0xE4,0x36, -0x00,0x00,0x9E,0x8C, -0x82,0x29,0x16,0x00, -0x00,0x2F,0x05,0x00, -0x24,0x88,0xD1,0x03, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0x25,0x02, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x25,0xB0,0x02,0x3C, -0xC4,0x0E,0xE3,0x36, -0x1C,0x0C,0x42,0x34, -0x00,0x00,0x5E,0x8C, -0x00,0x00,0x62,0x8C, -0xFF,0x03,0x05,0x3C, -0x02,0x80,0x03,0x3C, -0xE4,0xED,0x63,0x24, -0x24,0x10,0x45,0x00, -0x00,0x00,0x64,0x8C, -0x02,0x14,0x02,0x00, -0x24,0x90,0xD2,0x03, -0x25,0xF0,0x42,0x02, -0x02,0x5C,0x00,0x0C, -0x21,0x28,0xC0,0x03, -0xCC,0x0E,0xE2,0x36, -0x00,0x00,0x45,0x8C, -0x02,0x80,0x02,0x3C, -0xE4,0xED,0x42,0x24, -0x3F,0x00,0x03,0x3C, -0x00,0x00,0x44,0x8C, -0x24,0x28,0xA3,0x00, -0x24,0x98,0xD3,0x03, -0x82,0x29,0x05,0x00, -0x02,0x5C,0x00,0x0C, -0x25,0x28,0x65,0x02, -0x54,0x22,0x00,0x0C, -0x05,0x00,0x04,0x24, -0x5C,0x6D,0x00,0x08, -0x00,0x00,0x00,0x00, -0xE0,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x42,0x00,0x03,0x24, -0x10,0x00,0xA3,0xA3, -0xF1,0x3A,0x40,0xA0, -0x4E,0x00,0x03,0x24, -0x43,0x00,0x02,0x24, -0x02,0x80,0x07,0x3C, -0x9C,0xF3,0xE7,0x24, -0x11,0x00,0xA2,0xA3, -0x12,0x00,0xA3,0xA3, -0xD0,0x07,0x02,0x24, -0x01,0x00,0x03,0x24, -0x01,0x80,0x06,0x3C, -0x10,0x00,0xA5,0x27, -0x21,0x20,0xE0,0x00, -0xDC,0xAC,0xC6,0x24, -0x0C,0x00,0xE2,0xAC, -0x14,0x00,0xE3,0xA0, -0x18,0x00,0xBF,0xAF, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x48,0xFD,0xBD,0x27, -0xE8,0xED,0x46,0x24, -0x02,0x80,0x03,0x3C, -0xB0,0x02,0xB2,0xAF, -0xAC,0x02,0xB1,0xAF, -0xA8,0x02,0xB0,0xAF, -0x33,0x1F,0x60,0xA0, -0x21,0x38,0xA0,0x03, -0x90,0x00,0xC8,0x24, -0x00,0x00,0xC2,0x8C, -0x04,0x00,0xC3,0x8C, -0x08,0x00,0xC4,0x8C, -0x0C,0x00,0xC5,0x8C, -0x10,0x00,0xC6,0x24, -0x00,0x00,0xE2,0xAC, -0x04,0x00,0xE3,0xAC, -0x08,0x00,0xE4,0xAC, -0x0C,0x00,0xE5,0xAC, -0xF6,0xFF,0xC8,0x14, -0x10,0x00,0xE7,0x24, -0x00,0x00,0xC3,0x8C, -0x02,0x80,0x02,0x3C, -0x7C,0xEE,0x58,0x24, -0x00,0x00,0xE3,0xAC, -0x98,0x00,0xB9,0x27, -0x00,0x01,0x12,0x27, -0x01,0x00,0x02,0x93, -0x05,0x00,0x03,0x93, -0x09,0x00,0x04,0x93, -0x0D,0x00,0x05,0x93, -0x00,0x00,0x11,0x93, -0x02,0x00,0x0D,0x93, -0x04,0x00,0x10,0x93, -0x06,0x00,0x0C,0x93, -0x08,0x00,0x0F,0x93, -0x0A,0x00,0x07,0x93, -0x0C,0x00,0x0E,0x93, -0x0E,0x00,0x06,0x93, -0x03,0x00,0x08,0x93, -0x07,0x00,0x09,0x93, -0x0B,0x00,0x0A,0x93, -0x0F,0x00,0x0B,0x93, -0x00,0x12,0x02,0x00, -0x00,0x1A,0x03,0x00, -0x00,0x22,0x04,0x00, -0x00,0x2A,0x05,0x00, -0x25,0x10,0x51,0x00, -0x25,0x18,0x70,0x00, -0x25,0x20,0x8F,0x00, -0x25,0x28,0xAE,0x00, -0x00,0x6C,0x0D,0x00, -0x00,0x64,0x0C,0x00, -0x00,0x3C,0x07,0x00, -0x00,0x34,0x06,0x00, -0x25,0x68,0xA2,0x01, -0x25,0x60,0x83,0x01, -0x25,0x38,0xE4,0x00, -0x25,0x30,0xC5,0x00, -0x00,0x46,0x08,0x00, -0x00,0x4E,0x09,0x00, -0x00,0x56,0x0A,0x00, -0x00,0x5E,0x0B,0x00, -0x25,0x40,0x0D,0x01, -0x25,0x48,0x2C,0x01, -0x25,0x50,0x47,0x01, -0x25,0x58,0x66,0x01, -0x10,0x00,0x18,0x27, -0x00,0x00,0x28,0xAF, -0x04,0x00,0x29,0xAF, -0x08,0x00,0x2A,0xAF, -0x0C,0x00,0x2B,0xAF, -0xD2,0xFF,0x12,0x17, -0x10,0x00,0x39,0x27, -0x01,0x00,0x02,0x93, -0x05,0x00,0x03,0x93, -0x00,0x00,0x09,0x93, -0x02,0x00,0x04,0x93, -0x04,0x00,0x08,0x93, -0x06,0x00,0x05,0x93, -0x07,0x00,0x06,0x93, -0x03,0x00,0x07,0x93, -0x00,0x12,0x02,0x00, -0x00,0x1A,0x03,0x00, -0x25,0x10,0x49,0x00, -0x25,0x18,0x68,0x00, -0x00,0x24,0x04,0x00, -0x00,0x2C,0x05,0x00, -0x25,0x20,0x82,0x00, -0x25,0x28,0xA3,0x00, -0x00,0x3E,0x07,0x00, -0x00,0x36,0x06,0x00, -0x02,0x80,0x02,0x3C, -0x25,0x38,0xE4,0x00, -0x25,0x30,0xC5,0x00, -0x84,0xEF,0x58,0x24, -0x04,0x00,0x26,0xAF, -0x00,0x00,0x27,0xAF, -0x00,0x01,0x12,0x27, -0xA0,0x01,0xB9,0x27, -0x01,0x00,0x02,0x93, -0x05,0x00,0x03,0x93, -0x09,0x00,0x04,0x93, -0x0D,0x00,0x05,0x93, -0x00,0x00,0x11,0x93, -0x02,0x00,0x0D,0x93, -0x04,0x00,0x10,0x93, -0x06,0x00,0x0C,0x93, -0x08,0x00,0x0F,0x93, -0x0A,0x00,0x07,0x93, -0x0C,0x00,0x0E,0x93, -0x0E,0x00,0x06,0x93, -0x03,0x00,0x08,0x93, -0x07,0x00,0x09,0x93, -0x0B,0x00,0x0A,0x93, -0x0F,0x00,0x0B,0x93, -0x00,0x12,0x02,0x00, -0x00,0x1A,0x03,0x00, -0x00,0x22,0x04,0x00, -0x00,0x2A,0x05,0x00, -0x25,0x10,0x51,0x00, -0x25,0x18,0x70,0x00, -0x25,0x20,0x8F,0x00, -0x25,0x28,0xAE,0x00, -0x00,0x6C,0x0D,0x00, -0x00,0x64,0x0C,0x00, -0x00,0x3C,0x07,0x00, -0x00,0x34,0x06,0x00, -0x25,0x68,0xA2,0x01, -0x25,0x60,0x83,0x01, -0x25,0x38,0xE4,0x00, -0x25,0x30,0xC5,0x00, -0x00,0x46,0x08,0x00, -0x00,0x4E,0x09,0x00, -0x00,0x56,0x0A,0x00, -0x00,0x5E,0x0B,0x00, -0x25,0x40,0x0D,0x01, -0x25,0x48,0x2C,0x01, -0x25,0x50,0x47,0x01, -0x25,0x58,0x66,0x01, -0x10,0x00,0x18,0x27, -0x00,0x00,0x28,0xAF, -0x04,0x00,0x29,0xAF, -0x08,0x00,0x2A,0xAF, -0x0C,0x00,0x2B,0xAF, -0xD2,0xFF,0x12,0x17, -0x10,0x00,0x39,0x27, -0x01,0x00,0x02,0x93, -0x05,0x00,0x03,0x93, -0x00,0x00,0x09,0x93, -0x02,0x00,0x04,0x93, -0x04,0x00,0x08,0x93, -0x06,0x00,0x05,0x93, -0x07,0x00,0x06,0x93, -0x03,0x00,0x07,0x93, -0x00,0x12,0x02,0x00, -0x00,0x1A,0x03,0x00, -0x25,0x10,0x49,0x00, -0x25,0x18,0x68,0x00, -0x00,0x24,0x04,0x00, -0x00,0x2C,0x05,0x00, -0x25,0x20,0x82,0x00, -0x25,0x28,0xA3,0x00, -0x00,0x3E,0x07,0x00, -0x00,0x36,0x06,0x00, -0x25,0x30,0xC5,0x00, -0x25,0x38,0xE4,0x00, -0x02,0x80,0x02,0x3C, -0x04,0x00,0x26,0xAF, -0x00,0x00,0x27,0xAF, -0x30,0x1F,0x46,0x24, -0x21,0x50,0x00,0x00, -0x80,0x20,0x0A,0x00, -0x21,0x10,0x9D,0x00, -0x00,0x00,0x45,0x8C, -0x01,0x00,0x43,0x25, -0xFF,0x00,0x6A,0x30, -0x21,0x20,0x86,0x00, -0x25,0x00,0x42,0x2D, -0xF8,0xFF,0x40,0x14, -0x18,0x00,0x85,0xAC, -0x02,0x80,0x02,0x3C, -0x30,0x1F,0x4B,0x24, -0x21,0x50,0x00,0x00, -0xC0,0x10,0x0A,0x00, -0x21,0x48,0x5D,0x00, -0x21,0x38,0x00,0x00, -0x21,0x40,0x4B,0x00, -0x21,0x10,0x27,0x01, -0xA0,0x01,0x46,0x90, -0x98,0x00,0x45,0x90, -0x01,0x00,0xE4,0x24, -0x21,0x18,0x07,0x01, -0xFF,0x00,0x87,0x30, -0x08,0x00,0xE2,0x2C, -0xB4,0x01,0x66,0xA0, -0xF7,0xFF,0x40,0x14, -0xAC,0x00,0x65,0xA0, -0x01,0x00,0x42,0x25, -0xFF,0x00,0x4A,0x30, -0x21,0x00,0x43,0x2D, -0xEF,0xFF,0x60,0x14, -0xC0,0x10,0x0A,0x00, -0x08,0x00,0x64,0x8D, -0xFF,0x7F,0x07,0x3C, -0xFF,0xFF,0xE7,0x34, -0xC0,0xFF,0x02,0x24, -0x24,0x20,0x87,0x00, -0x24,0x20,0x82,0x00, -0x0C,0x00,0x84,0x34, -0xFF,0xC0,0x02,0x24, -0x24,0x20,0x82,0x00, -0xC0,0xFF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x00,0x18,0x84,0x34, -0xBF,0xFF,0x03,0x3C, -0x24,0x20,0x82,0x00, -0xFF,0xFF,0x63,0x34, -0x7F,0xFF,0x02,0x3C, -0x24,0x20,0x83,0x00, -0xFF,0xFF,0x42,0x34, -0x24,0x20,0x82,0x00, -0x0C,0x00,0x65,0x8D, -0x7F,0xFF,0x03,0x24, -0x40,0x40,0x84,0x34, -0xFF,0xFF,0x02,0x3C, -0x24,0x20,0x83,0x00, -0xFF,0x7F,0x42,0x34, -0xFF,0xBF,0x03,0x3C, -0x10,0x00,0x66,0x8D, -0x24,0x20,0x82,0x00, -0xFF,0xFF,0x63,0x34, -0xFF,0x9F,0x02,0x3C, -0x24,0x28,0xA3,0x00, -0xFF,0xFF,0x42,0x34, -0xFF,0x3F,0x03,0x3C, -0x24,0x20,0x82,0x00, -0xFF,0xFF,0x63,0x34, -0x12,0x00,0x02,0x24, -0xB0,0x02,0xB2,0x8F, -0xAC,0x02,0xB1,0x8F, -0xA8,0x02,0xB0,0x8F, -0x24,0x30,0xC3,0x00, -0xC7,0x02,0x62,0xA1, -0x1F,0x00,0x03,0x24, -0x01,0x00,0x02,0x24, -0x24,0x28,0xA7,0x00, -0xBE,0x02,0x63,0xA1, -0xC0,0x02,0x62,0xA1, -0xFF,0x00,0x03,0x24, -0xFF,0xFF,0x02,0x24, -0xB8,0x02,0xBD,0x27, -0x08,0x00,0x64,0xAD, -0x10,0x00,0x66,0xAD, -0x0C,0x00,0x65,0xAD, -0xC2,0x02,0x62,0xA1, -0xC4,0x02,0x63,0xA5, -0xBF,0x02,0x60,0xA1, -0x08,0x00,0xE0,0x03, -0xC6,0x02,0x60,0xA1, -0x02,0x80,0x0B,0x3C, -0x30,0x1F,0x67,0x25, -0xE0,0xFF,0xBD,0x27, -0xE6,0x02,0xE0,0xA0, -0x18,0x00,0xBF,0xAF, -0xE4,0x02,0xE8,0x8C, -0xFF,0xCF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x30,0x1F,0x69,0x8D, -0x24,0x40,0x02,0x01, -0xFF,0xBF,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0xF0,0xFF,0x03,0x24, -0x24,0x40,0x02,0x01, -0xFF,0x7F,0x02,0x3C, -0x24,0x48,0x23,0x01, -0xFF,0xFF,0x42,0x34, -0xFF,0xF0,0x03,0x24, -0x24,0x48,0x23,0x01, -0x24,0x40,0x02,0x01, -0x20,0x00,0x03,0x24, -0x0A,0x00,0x02,0x24, -0x30,0x1F,0x69,0xAD, -0xD2,0x02,0xE2,0xA0, -0xD7,0x02,0xE3,0xA0, -0x20,0x00,0x02,0x24, -0x00,0x01,0x03,0x24, -0xC8,0x02,0xE2,0xA4, -0xCA,0x02,0xE3,0xA4, -0x00,0x02,0x02,0x24, -0x49,0x00,0x03,0x24, -0x02,0x80,0x0A,0x3C, -0xE4,0x02,0xE8,0xAC, -0x80,0xF3,0x4A,0x25, -0xFF,0xFF,0x0D,0x34, -0x3E,0x00,0x0E,0x24, -0x1C,0x00,0x0F,0x24, -0x01,0x00,0x0C,0x24, -0x11,0x00,0xA3,0xA3, -0xCC,0x02,0xE2,0xA4, -0xD0,0x07,0x03,0x24, -0x44,0x00,0x02,0x24, -0x01,0x80,0x06,0x3C, -0x10,0x00,0xA2,0xA3, -0x10,0x00,0xA5,0x27, -0x47,0x00,0x02,0x24, -0x21,0x20,0x40,0x01, -0x94,0xAD,0xC6,0x24, -0x04,0x00,0xED,0xAC, -0xD0,0x02,0xEE,0xA0, -0xD1,0x02,0xEF,0xA0, -0x02,0x00,0xEC,0xA0, -0x0C,0x00,0x43,0xAD, -0x14,0x00,0x4C,0xA1, -0x80,0x36,0xED,0xAC, -0xCE,0x02,0xEE,0xA0, -0xCF,0x02,0xEF,0xA0, -0xD6,0x02,0xE0,0xA0, -0xD4,0x02,0xE0,0xA0, -0x12,0x00,0xA2,0xA3, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x50,0x00,0x03,0x24, -0x10,0x00,0xA3,0xA3, -0x16,0x3D,0x40,0xA0, -0x41,0x00,0x03,0x24, -0x52,0x00,0x02,0x24, -0x02,0x80,0x07,0x3C, -0x0C,0xF4,0xE7,0x24, -0x11,0x00,0xA2,0xA3, -0x12,0x00,0xA3,0xA3, -0xD0,0x07,0x02,0x24, -0x01,0x00,0x03,0x24, -0x02,0x80,0x06,0x3C, -0x10,0x00,0xA5,0x27, -0x21,0x20,0xE0,0x00, -0x2C,0x80,0xC6,0x24, -0x0C,0x00,0xE2,0xAC, -0x14,0x00,0xE3,0xA0, -0x18,0x00,0xBF,0xAF, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0x02,0x80,0x09,0x3C, -0x30,0x1F,0x23,0x8D, -0xFF,0xFF,0x02,0x24, -0xFF,0x00,0x4B,0x30, -0x0F,0xFF,0x02,0x24, -0x24,0x18,0x62,0x00, -0xFF,0xFF,0x02,0x3C, -0xFF,0x0F,0x42,0x34, -0x24,0x18,0x62,0x00, -0xD8,0xFF,0xBD,0x27, -0x30,0x1F,0x23,0xAD, -0x47,0x00,0x02,0x24, -0x3B,0x00,0x03,0x24, -0x02,0x80,0x08,0x3C, -0x28,0xF4,0x08,0x25, -0x18,0x00,0xB0,0xAF, -0x10,0x00,0xA2,0xA3, -0x30,0x1F,0x30,0x25, -0x11,0x00,0xA3,0xA3, -0xD0,0x07,0x02,0x24, -0x01,0x00,0x03,0x24, -0x01,0x00,0x07,0x3C, -0x01,0x80,0x06,0x3C, -0x04,0x03,0x0B,0xAE, -0x1C,0x00,0xB1,0xAF, -0x56,0x30,0xEA,0x34, -0x43,0x00,0x11,0x24, -0xF4,0x98,0xE7,0x34, -0x10,0x00,0xA5,0x27, -0x0C,0x00,0x02,0xAD, -0x14,0x00,0x03,0xA1, -0x21,0x20,0x00,0x01, -0x1C,0xB9,0xC6,0x24, -0x20,0x00,0xBF,0xAF, -0x12,0x00,0xB1,0xA3, -0x0C,0x03,0x07,0xAE, -0x10,0x03,0x0A,0xAE, -0x13,0x00,0xA0,0xA3, -0x08,0x03,0x00,0xAE, -0x14,0x03,0x00,0xAE, -0xA2,0x23,0x00,0x0C, -0x18,0x03,0x00,0xAE, -0x1E,0x00,0x02,0x24, -0x21,0x03,0x02,0xA2, -0x4A,0x00,0x03,0x24, -0x45,0x00,0x02,0x24, -0x1C,0x03,0x03,0xA2, -0x1D,0x03,0x02,0xA2, -0x23,0x00,0x03,0x24, -0x3E,0x00,0x02,0x24, -0x1E,0x03,0x11,0xA2, -0x1F,0x03,0x02,0xA2, -0x20,0x03,0x03,0xA2, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x3B,0x00,0x02,0x24, -0x43,0x00,0x03,0x24, -0x10,0x00,0xA2,0xA3, -0x11,0x00,0xA3,0xA3, -0x36,0x00,0x02,0x24, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x07,0x3C, -0x44,0xF4,0xE7,0x24, -0x12,0x00,0xA2,0xA3, -0x03,0x22,0x60,0xA0, -0xD0,0x07,0x02,0x24, -0x01,0x00,0x03,0x24, -0x01,0x80,0x06,0x3C, -0x10,0x00,0xA5,0x27, -0x21,0x20,0xE0,0x00, -0x50,0xBD,0xC6,0x24, -0x0C,0x00,0xE2,0xAC, -0x14,0x00,0xE3,0xA0, -0x18,0x00,0xBF,0xAF, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xE0,0xFF,0xBD,0x27, -0x02,0x80,0x02,0x3C, -0x52,0x00,0x03,0x24, -0x10,0x00,0xA3,0xA3, -0xB8,0x55,0x40,0xA4, -0x54,0x00,0x03,0x24, -0x53,0x00,0x02,0x24, -0x02,0x80,0x07,0x3C, -0x7C,0xF4,0xE7,0x24, -0x11,0x00,0xA2,0xA3, -0x12,0x00,0xA3,0xA3, -0xF4,0x01,0x02,0x24, -0x01,0x00,0x03,0x24, -0x02,0x80,0x06,0x3C, -0x10,0x00,0xA5,0x27, -0x21,0x20,0xE0,0x00, -0x70,0x81,0xC6,0x24, -0x0C,0x00,0xE2,0xAC, -0x14,0x00,0xE3,0xA0, -0x18,0x00,0xBF,0xAF, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x18,0x00,0xBF,0x8F, -0x00,0x00,0x00,0x00, -0x08,0x00,0xE0,0x03, -0x20,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x02,0x80,0x03,0x3C, -0x20,0x00,0xBF,0xAF, -0x1C,0x00,0xB1,0xAF, -0x18,0x00,0xB0,0xAF, -0x58,0xE9,0x62,0x24, -0x58,0xE9,0x67,0x94, -0x02,0x00,0x48,0x90, -0x02,0x80,0x02,0x3C, -0xD8,0x5E,0x42,0x24, -0x02,0x00,0x11,0x24, -0x01,0x80,0x06,0x3C, -0x21,0x20,0x40,0x00, -0x14,0x00,0x51,0xA0, -0x10,0x00,0xA5,0x27, -0x6C,0xCE,0xC6,0x24, -0x02,0x80,0x10,0x3C, -0x10,0x00,0xA7,0xA7, -0x28,0x5F,0x10,0x26, -0x12,0x00,0xA8,0xA3, -0xA2,0x23,0x00,0x0C, -0x13,0x00,0xA0,0xA3, -0x02,0x80,0x06,0x3C, -0x21,0x20,0x00,0x02, -0x10,0x00,0xA5,0x27, -0x14,0x00,0x11,0xA2, -0xA2,0x23,0x00,0x0C, -0x7C,0x82,0xC6,0x24, -0x02,0x80,0x03,0x3C, -0xDE,0x5D,0x62,0x90, -0x02,0x00,0x07,0x24, -0x0C,0x00,0x04,0x24, -0x02,0x00,0x42,0x30, -0x01,0x00,0x42,0x2C, -0x23,0x38,0xE2,0x00, -0xE8,0x03,0x02,0x24, -0x0C,0x00,0x02,0xAE, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xF4,0x5E,0x60,0xA0, -0xF5,0x5E,0x44,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xF6,0x5E,0x64,0xA0, -0x0D,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x13,0x5F,0x60,0xA0, -0x01,0x00,0x06,0x24, -0x14,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xF8,0x5E,0x66,0xA0, -0x0F,0x00,0x04,0x24, -0x15,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0xF7,0x5E,0x66,0xA0, -0xF9,0x5E,0x44,0xA0, -0x02,0x80,0x03,0x3C, -0x08,0x00,0x04,0x24, -0x02,0x80,0x02,0x3C, -0xFA,0x5E,0x60,0xA0, -0x64,0x00,0x05,0x24, -0x04,0x5F,0x44,0xA4, -0x02,0x80,0x03,0x3C, -0x01,0x00,0x02,0x3C, -0xFC,0x5E,0x65,0xA4, -0x00,0x90,0x42,0x34, -0x02,0x80,0x03,0x3C, -0x00,0x5F,0x62,0xAC, -0x02,0x80,0x04,0x3C, -0x02,0x80,0x02,0x3C, -0x08,0x5F,0x80,0xAC, -0x02,0x80,0x03,0x3C, -0x0C,0x5F,0x40,0xA0, -0x02,0x80,0x02,0x3C, -0x0E,0x5F,0x60,0xA0, -0x16,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x44,0x5F,0x67,0xA0, -0x20,0x00,0xBF,0x8F, -0x0F,0x5F,0x40,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x1C,0x00,0xB1,0x8F, -0x18,0x00,0xB0,0x8F, -0x10,0x5F,0x66,0xA0, -0x11,0x5F,0x46,0xA0, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x12,0x5F,0x60,0xA0, -0x21,0x20,0x00,0x00, -0x18,0x5F,0x40,0xAC, -0x02,0x80,0x03,0x3C, -0x02,0x80,0x02,0x3C, -0x21,0x28,0x00,0x00, -0x28,0x00,0xBD,0x27, -0x1C,0x5F,0x60,0xAC, -0x20,0x5F,0x44,0xAC, -0x24,0x5F,0x45,0xAC, -0x08,0x00,0xE0,0x03, -0x00,0x00,0x00,0x00, -0xD8,0xFF,0xBD,0x27, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x20,0x00,0xBF,0xAF, -0x21,0x80,0x80,0x00, -0x21,0x98,0xA0,0x00, -0x21,0x88,0xC0,0x00, -0x21,0x90,0x00,0x00, -0x00,0x00,0x04,0x82, -0x7C,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xFC,0xFF,0x40,0x14, -0x01,0x00,0x10,0x26, -0xFF,0xFF,0x10,0x26, -0x00,0x00,0x04,0x92, -0x2B,0x00,0x02,0x24, -0x00,0x1E,0x04,0x00, -0x03,0x1E,0x03,0x00, -0x41,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x10,0x00,0x02,0x24, -0x30,0x00,0x22,0x12, -0x00,0x1E,0x04,0x00, -0x07,0x00,0x20,0x16, -0x21,0x18,0x80,0x00, -0x00,0x1E,0x04,0x00, -0x03,0x1E,0x03,0x00, -0x30,0x00,0x02,0x24, -0x3B,0x00,0x62,0x10, -0x0A,0x00,0x11,0x24, -0x21,0x18,0x80,0x00, -0x00,0x16,0x03,0x00, -0x03,0x16,0x02,0x00, -0x1A,0x00,0x40,0x10, -0xFF,0x00,0x64,0x30, -0xA9,0xFF,0x82,0x24, -0x61,0x00,0x83,0x2C, -0xFF,0x00,0x45,0x30, -0x09,0x00,0x60,0x10, -0x41,0x00,0x86,0x2C, -0xC9,0xFF,0x82,0x24, -0xFF,0x00,0x45,0x30, -0x05,0x00,0xC0,0x10, -0x3A,0x00,0x87,0x2C, -0xD0,0xFF,0x82,0x24, -0x02,0x00,0xE0,0x10, -0xFF,0x00,0x05,0x24, -0xFF,0x00,0x45,0x30, -0x2A,0x10,0xB1,0x00, -0x0A,0x00,0x40,0x10, -0x18,0x00,0x51,0x02, -0x01,0x00,0x10,0x26, -0x12,0x10,0x00,0x00, -0x2B,0x18,0x52,0x00, -0x23,0x00,0x60,0x14, -0x21,0x90,0xA2,0x00, -0x00,0x00,0x03,0x92, -0x00,0x00,0x00,0x00, -0xE8,0xFF,0x60,0x14, -0xFF,0x00,0x64,0x30, -0x02,0x00,0x60,0x12, -0x21,0x10,0x40,0x02, -0x00,0x00,0x70,0xAE, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x03,0x1E,0x03,0x00, -0x30,0x00,0x02,0x24, -0xCE,0xFF,0x62,0x14, -0x00,0x00,0x00,0x00, -0x01,0x00,0x03,0x82, -0x78,0x00,0x02,0x24, -0x03,0x00,0x62,0x10, -0x58,0x00,0x02,0x24, -0xD0,0xFF,0x62,0x14, -0x21,0x18,0x80,0x00, -0x02,0x00,0x10,0x26, -0x00,0x00,0x04,0x92, -0xC0,0x70,0x00,0x08, -0x10,0x00,0x11,0x24, -0x01,0x00,0x10,0x26, -0x00,0x00,0x04,0x92, -0xB7,0x70,0x00,0x08, -0x10,0x00,0x02,0x24, -0xEC,0x70,0x00,0x08, -0x08,0x00,0x11,0x24, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xFF,0xFF,0x02,0x24, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x21,0x48,0x80,0x00, -0x31,0x00,0xC0,0x14, -0x21,0x50,0x00,0x00, -0x00,0x00,0x87,0x90, -0x30,0x00,0x02,0x24, -0x00,0x1E,0x07,0x00, -0x03,0x1E,0x03,0x00, -0x2E,0x00,0x62,0x10, -0x0A,0x00,0x06,0x24, -0x02,0x80,0x02,0x3C, -0x40,0xF2,0x4B,0x24, -0xFF,0x00,0xE8,0x30, -0x21,0x10,0x0B,0x01, -0x00,0x00,0x44,0x90, -0x00,0x1E,0x07,0x00, -0x03,0x1E,0x03,0x00, -0x44,0x00,0x82,0x30, -0x02,0x00,0x87,0x30, -0xD0,0xFF,0x63,0x24, -0x1A,0x00,0x40,0x10, -0x04,0x00,0x84,0x30, -0x07,0x00,0x80,0x14, -0x2B,0x10,0x66,0x00, -0x21,0x10,0x00,0x01, -0x02,0x00,0xE0,0x10, -0xE0,0xFF,0x03,0x25, -0xFF,0x00,0x62,0x30, -0xC9,0xFF,0x43,0x24, -0x2B,0x10,0x66,0x00, -0x10,0x00,0x40,0x10, -0x18,0x00,0x46,0x01, -0x01,0x00,0x29,0x25, -0x00,0x00,0x27,0x91, -0x00,0x00,0x00,0x00, -0xFF,0x00,0xE8,0x30, -0x12,0x10,0x00,0x00, -0x21,0x50,0x43,0x00, -0x21,0x10,0x0B,0x01, -0x00,0x00,0x44,0x90, -0x00,0x1E,0x07,0x00, -0x03,0x1E,0x03,0x00, -0x44,0x00,0x82,0x30, -0x02,0x00,0x87,0x30, -0xD0,0xFF,0x63,0x24, -0xE8,0xFF,0x40,0x14, -0x04,0x00,0x84,0x30, -0x02,0x00,0xA0,0x10, -0x00,0x00,0x00,0x00, -0x00,0x00,0xA9,0xAC, -0x08,0x00,0xE0,0x03, -0x21,0x10,0x40,0x01, -0x00,0x00,0x87,0x90, -0x0E,0x71,0x00,0x08, -0x02,0x80,0x02,0x3C, -0x01,0x00,0x89,0x24, -0x00,0x00,0x27,0x91, -0x78,0x00,0x02,0x24, -0x00,0x1E,0x07,0x00, -0x03,0x1E,0x03,0x00, -0xCD,0xFF,0x62,0x14, -0x08,0x00,0x06,0x24, -0x01,0x00,0x22,0x91, -0x02,0x80,0x03,0x3C, -0x40,0xF2,0x63,0x24, -0x21,0x10,0x43,0x00, -0x00,0x00,0x44,0x90, -0x00,0x00,0x00,0x00, -0x44,0x00,0x84,0x30, -0xC5,0xFF,0x80,0x10, -0x02,0x80,0x02,0x3C, -0x01,0x00,0x29,0x25, -0x00,0x00,0x27,0x91, -0x0E,0x71,0x00,0x08, -0x10,0x00,0x06,0x24, -0xE8,0xFF,0xBD,0x27, -0x10,0x00,0xBF,0xAF, -0x00,0x00,0x83,0x80, -0x2D,0x00,0x02,0x24, -0x04,0x00,0x62,0x10, -0x00,0x00,0x00,0x00, -0x10,0x00,0xBF,0x8F, -0x04,0x71,0x00,0x08, -0x18,0x00,0xBD,0x27, -0x04,0x71,0x00,0x0C, -0x01,0x00,0x84,0x24, -0x10,0x00,0xBF,0x8F, -0x23,0x10,0x02,0x00, -0x08,0x00,0xE0,0x03, -0x18,0x00,0xBD,0x27, -0xD8,0xFF,0xBD,0x27, -0x1C,0x00,0xB3,0xAF, -0x18,0x00,0xB2,0xAF, -0x14,0x00,0xB1,0xAF, -0x10,0x00,0xB0,0xAF, -0x20,0x00,0xBF,0xAF, -0x21,0x80,0x80,0x00, -0x21,0x90,0xA0,0x00, -0x21,0x98,0xC0,0x00, -0x21,0x88,0x00,0x00, -0x00,0x00,0x04,0x82, -0x7C,0x55,0x00,0x0C, -0x00,0x00,0x00,0x00, -0xFC,0xFF,0x40,0x14, -0x01,0x00,0x10,0x26, -0xFF,0xFF,0x10,0x26, -0x00,0x00,0x03,0x82, -0x2D,0x00,0x02,0x24, -0x0F,0x00,0x62,0x10, -0x21,0x20,0x00,0x02, -0x21,0x28,0x40,0x02, -0xA0,0x70,0x00,0x0C, -0x21,0x30,0x60,0x02, -0x12,0x00,0x40,0x04, -0x21,0x18,0x40,0x00, -0x23,0x10,0x02,0x00, -0x0A,0x10,0x71,0x00, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x01,0x00,0x10,0x26, -0x21,0x20,0x00,0x02, -0x21,0x28,0x40,0x02, -0xA0,0x70,0x00,0x0C, -0x21,0x30,0x60,0x02, -0xFF,0xFF,0x11,0x24, -0xF0,0xFF,0x41,0x04, -0x21,0x18,0x40,0x00, -0xF0,0xFF,0x20,0x16, -0x00,0x80,0x02,0x3C, -0x20,0x00,0xBF,0x8F, -0x1C,0x00,0xB3,0x8F, -0x18,0x00,0xB2,0x8F, -0x14,0x00,0xB1,0x8F, -0x10,0x00,0xB0,0x8F, -0xFF,0x7F,0x02,0x3C, -0xFF,0xFF,0x42,0x34, -0x08,0x00,0xE0,0x03, -0x28,0x00,0xBD,0x27, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x52,0x54,0x4C,0x38, -0x37,0x31,0x32,0x20, -0x46,0x57,0x20,0x76, -0x65,0x72,0x73,0x69, -0x6F,0x6E,0x20,0x30, -0x2E,0x30,0x2E,0x31, -0x23,0x20,0xE4,0xB8, -0x89,0x20,0x31,0x30, -0xE6,0x9C,0x88,0x20, -0x32,0x38,0x20,0x31, -0x37,0x3A,0x34,0x31, -0x3A,0x34,0x37,0x20, -0x43,0x53,0x54,0x20, -0x32,0x30,0x30,0x39, -0x0A,0x00,0x00,0x00, -0x50,0xC6,0x01,0x80, -0x48,0x43,0x49,0x20, -0x74,0x79,0x70,0x65, -0x3A,0x20,0x25,0x78, -0x28,0x25,0x78,0x29, -0x0A,0x00,0x00,0x00, -0x72,0x66,0x5F,0x63, -0x6F,0x66,0x69,0x67, -0x3A,0x20,0x25,0x78, -0x28,0x25,0x78,0x2C, -0x20,0x25,0x78,0x2C, -0x20,0x25,0x78,0x29, -0x0A,0x00,0x00,0x00, -0x6D,0x70,0x5F,0x6D, -0x6F,0x64,0x65,0x3A, -0x20,0x25,0x78,0x28, -0x25,0x78,0x29,0x2C, -0x20,0x49,0x51,0x4B, -0x3A,0x20,0x25,0x78, -0x0A,0x00,0x00,0x00, -0x76,0x63,0x73,0x20, -0x74,0x79,0x70,0x65, -0x3A,0x20,0x25,0x78, -0x28,0x25,0x78,0x29, -0x0A,0x00,0x00,0x00, -0x33,0x32,0x6B,0x20, -0x63,0x61,0x6C,0x69, -0x62,0x72,0x61,0x3A, -0x20,0x25,0x64,0x2C, -0x20,0x33,0x32,0x4B, -0x20,0x54,0x53,0x46, -0x3A,0x20,0x25,0x78, -0x00,0x00,0x00,0x00, -0x74,0x61,0x72,0x67, -0x65,0x74,0x20,0x74, -0x68,0x65,0x72,0x6D, -0x61,0x6C,0x3A,0x20, -0x25,0x78,0x0A,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x00,0x7F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x01,0x7F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x02,0x7E, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x03,0x7D, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x04,0x7C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x05,0x7B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x06,0x7A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x07,0x79, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x08,0x78, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x09,0x77, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x0A,0x76, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x0B,0x75, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x0C,0x74, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x0D,0x73, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x0E,0x72, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x0F,0x71, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x10,0x70, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x11,0x6F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x12,0x6F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x13,0x6E, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x14,0x6D, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x15,0x6D, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x16,0x6C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x17,0x6B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x18,0x6A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x19,0x6A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x1A,0x69, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x1B,0x68, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x1C,0x67, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x1D,0x66, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x1E,0x65, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x1F,0x64, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x20,0x63, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x21,0x4C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x22,0x4B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x23,0x4A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x24,0x49, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x25,0x48, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x26,0x47, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x27,0x46, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x28,0x45, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x29,0x44, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x2A,0x2C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x2B,0x2B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x2C,0x2A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x2D,0x29, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x2E,0x28, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x2F,0x27, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x30,0x26, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x31,0x25, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x32,0x24, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x33,0x23, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x34,0x22, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x35,0x09, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x36,0x08, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x37,0x07, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x38,0x06, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x39,0x05, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x3A,0x04, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x3B,0x03, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x3C,0x02, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x3D,0x01, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x3E,0x00, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x3F,0x00, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x40,0x7F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x41,0x7F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x42,0x7E, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x43,0x7D, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x44,0x7C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x45,0x7B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x46,0x7A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x47,0x79, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x48,0x78, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x49,0x77, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x4A,0x76, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x4B,0x75, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x4C,0x74, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x4D,0x73, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x4E,0x72, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x4F,0x71, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x50,0x70, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x51,0x6F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x52,0x6F, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x53,0x6E, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x54,0x6D, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x55,0x6D, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x56,0x6C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x57,0x6B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x58,0x6A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x59,0x6A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x5A,0x69, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x5B,0x68, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x5C,0x67, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x5D,0x66, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x5E,0x65, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x5F,0x64, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x60,0x63, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x61,0x4C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x62,0x4B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x63,0x4A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x64,0x49, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x65,0x48, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x66,0x47, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x67,0x46, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x68,0x45, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x69,0x44, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x6A,0x2C, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x6B,0x2B, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x6C,0x2A, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x6D,0x29, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x6E,0x28, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x6F,0x27, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x70,0x26, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x71,0x25, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x72,0x24, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x73,0x23, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x74,0x22, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x75,0x09, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x76,0x08, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x77,0x07, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x78,0x06, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x79,0x05, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x7A,0x04, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x7B,0x03, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x7C,0x02, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x7D,0x01, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x7E,0x00, -0x78,0x0C,0x00,0x00, -0x01,0x00,0x7F,0x00, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x00,0x30, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x01,0x30, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x02,0x30, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x03,0x30, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x04,0x30, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x05,0x34, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x06,0x38, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x07,0x3E, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x08,0x3E, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x09,0x44, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x0A,0x46, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x0B,0x48, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x0C,0x48, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x0D,0x4E, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x0E,0x56, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x0F,0x5A, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x10,0x5E, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x11,0x62, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x12,0x6C, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x13,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x14,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x15,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x16,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x17,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x18,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x19,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x1A,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x1B,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x1C,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x1D,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x1E,0x72, -0x78,0x0C,0x00,0x00, -0x1E,0x00,0x1F,0x72, -0x00,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x06,0x06,0x06,0x04, -0x04,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x04,0x02,0x02,0x00, -0x08,0x0E,0x00,0x00, -0x00,0xFF,0x00,0x00, -0x00,0x00,0x00,0x00, -0x10,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x0A,0x08,0x08,0x04, -0x14,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x04,0x02,0x02,0x00, -0x18,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x0A,0x08,0x08,0x04, -0x1C,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x04,0x02,0x02,0x00, -0x00,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x04,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x08,0x0E,0x00,0x00, -0x00,0xFF,0x00,0x00, -0x00,0x00,0x00,0x00, -0x10,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x14,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x18,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x1C,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x00,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x04,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x08,0x0E,0x00,0x00, -0x00,0xFF,0x00,0x00, -0x00,0x00,0x00,0x00, -0x10,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x14,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x18,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x1C,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x00,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x04,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x08,0x0E,0x00,0x00, -0x00,0xFF,0x00,0x00, -0x00,0x00,0x00,0x00, -0x10,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x14,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x18,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x1C,0x0E,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x00, -0x04,0x08,0x00,0x00, -0x0F,0x00,0x00,0x00, -0x03,0x00,0x00,0x00, -0x24,0x08,0x00,0x00, -0x0F,0x00,0xF0,0x00, -0x04,0x00,0x30,0x00, -0x2C,0x08,0x00,0x00, -0x0F,0x00,0xF0,0x00, -0x04,0x00,0x30,0x00, -0x70,0x08,0x00,0x00, -0x00,0x00,0x00,0x04, -0x01,0x00,0x00,0x00, -0x64,0x08,0x00,0x00, -0x00,0x04,0x00,0x00, -0x01,0x00,0x00,0x00, -0x78,0x08,0x00,0x00, -0x0F,0x00,0x0F,0x00, -0x02,0x00,0x02,0x00, -0x74,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x06,0x00,0x00,0x00, -0x78,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x06,0x00,0x00,0x00, -0x7C,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x06,0x00,0x00,0x00, -0x80,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x06,0x00,0x00,0x00, -0x0C,0x09,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x33,0x00,0x00,0x00, -0x04,0x0C,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x33,0x00,0x00,0x00, -0x04,0x0D,0x00,0x00, -0x0F,0x00,0x00,0x00, -0x03,0x00,0x00,0x00, -0xF4,0x01,0x00,0x00, -0x00,0x00,0xFF,0xFF, -0xFF,0xFF,0x00,0x00, -0x34,0x02,0x00,0x00, -0x00,0x00,0x00,0xF8, -0x13,0x00,0x00,0x00, -0x04,0x08,0x00,0x00, -0x0F,0x00,0x00,0x00, -0x03,0x00,0x00,0x00, -0x24,0x08,0x00,0x00, -0x0F,0x00,0xF0,0x00, -0x04,0x00,0x30,0x00, -0x2C,0x08,0x00,0x00, -0x0F,0x00,0xF0,0x00, -0x02,0x00,0x30,0x00, -0x70,0x08,0x00,0x00, -0x00,0x00,0x00,0x04, -0x01,0x00,0x00,0x00, -0x64,0x08,0x00,0x00, -0x00,0x04,0x00,0x00, -0x00,0x00,0x00,0x00, -0x78,0x08,0x00,0x00, -0x0F,0x00,0x0F,0x00, -0x02,0x00,0x00,0x00, -0x74,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x78,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x7C,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x80,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x0C,0x09,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x11,0x00,0x00,0x00, -0x04,0x0C,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x33,0x00,0x00,0x00, -0x04,0x0D,0x00,0x00, -0x0F,0x00,0x00,0x00, -0x03,0x00,0x00,0x00, -0xF4,0x01,0x00,0x00, -0x00,0x00,0xFF,0xFF, -0x77,0x77,0x00,0x00, -0x34,0x02,0x00,0x00, -0x00,0x00,0x00,0xF8, -0x0A,0x00,0x00,0x00, -0x44,0x08,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x01,0x00, -0x04,0x08,0x00,0x00, -0x0F,0x00,0x00,0x00, -0x01,0x00,0x00,0x00, -0x24,0x08,0x00,0x00, -0x0F,0x00,0xF0,0x00, -0x04,0x00,0x30,0x00, -0x2C,0x08,0x00,0x00, -0x0F,0x00,0xF0,0x00, -0x02,0x00,0x10,0x00, -0x70,0x08,0x00,0x00, -0x00,0x00,0x00,0x04, -0x01,0x00,0x00,0x00, -0x64,0x08,0x00,0x00, -0x00,0x04,0x00,0x00, -0x00,0x00,0x00,0x00, -0x78,0x08,0x00,0x00, -0x0F,0x00,0x0F,0x00, -0x02,0x00,0x00,0x00, -0x74,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x78,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x7C,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x80,0x0E,0x00,0x00, -0x00,0x00,0x00,0x0F, -0x02,0x00,0x00,0x00, -0x0C,0x09,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x11,0x00,0x00,0x00, -0x04,0x0C,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x11,0x00,0x00,0x00, -0x04,0x0D,0x00,0x00, -0x0F,0x00,0x00,0x00, -0x01,0x00,0x00,0x00, -0xF4,0x01,0x00,0x00, -0x00,0x00,0xFF,0xFF, -0x77,0x77,0x00,0x00, -0x34,0x02,0x00,0x00, -0x00,0x00,0x00,0xF8, -0x0A,0x00,0x00,0x00, -0x1C,0x00,0x00,0x00, -0x00,0x00,0x00,0x07, -0x00,0x08,0x00,0x00, -0x00,0x00,0x04,0x00, -0x04,0x08,0x00,0x00, -0x03,0x80,0x00,0x00, -0x08,0x08,0x00,0x00, -0x00,0xFC,0x00,0x00, -0x0C,0x08,0x00,0x00, -0x0A,0x00,0x00,0x00, -0x10,0x08,0x00,0x00, -0x88,0x50,0x00,0x10, -0x14,0x08,0x00,0x00, -0x10,0x3D,0x0C,0x02, -0x18,0x08,0x00,0x00, -0x85,0x01,0x20,0x00, -0x1C,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0x20,0x08,0x00,0x00, -0x00,0x00,0x00,0x01, -0x24,0x08,0x00,0x00, -0x04,0x00,0x39,0x00, -0x28,0x08,0x00,0x00, -0x00,0x00,0x00,0x01, -0x2C,0x08,0x00,0x00, -0x04,0x00,0x39,0x00, -0x30,0x08,0x00,0x00, -0x04,0x00,0x00,0x00, -0x34,0x08,0x00,0x00, -0x00,0x02,0x69,0x00, -0x38,0x08,0x00,0x00, -0x04,0x00,0x00,0x00, -0x3C,0x08,0x00,0x00, -0x00,0x02,0x69,0x00, -0x40,0x08,0x00,0x00, -0x00,0x00,0x01,0x00, -0x44,0x08,0x00,0x00, -0x00,0x00,0x01,0x00, -0x48,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0x4C,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0x50,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0x54,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0x58,0x08,0x00,0x00, -0x48,0x48,0x48,0x48, -0x5C,0x08,0x00,0x00, -0xA9,0x65,0xA9,0x65, -0x60,0x08,0x00,0x00, -0x30,0x01,0x7F,0x0F, -0x64,0x08,0x00,0x00, -0x30,0x01,0x7F,0x0F, -0x68,0x08,0x00,0x00, -0x30,0x01,0x7F,0x0F, -0x6C,0x08,0x00,0x00, -0x30,0x01,0x7F,0x0F, -0x70,0x08,0x00,0x00, -0x00,0x07,0x00,0x03, -0x74,0x08,0x00,0x00, -0x00,0x03,0x00,0x03, -0x78,0x08,0x00,0x00, -0x02,0x00,0x02,0x00, -0x7C,0x08,0x00,0x00, -0x01,0x02,0x4F,0x00, -0x80,0x08,0x00,0x00, -0xC1,0x0A,0x30,0xA8, -0x84,0x08,0x00,0x00, -0x58,0x00,0x00,0x00, -0x88,0x08,0x00,0x00, -0x08,0x00,0x00,0x00, -0x8C,0x08,0x00,0x00, -0x04,0x00,0x00,0x00, -0x90,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0x94,0x08,0x00,0x00, -0xFE,0xFF,0xFF,0xFF, -0x98,0x08,0x00,0x00, -0x10,0x20,0x30,0x40, -0x9C,0x08,0x00,0x00, -0x50,0x60,0x70,0x00, -0xB0,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0xE0,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0xE4,0x08,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x0E,0x00,0x00, -0x33,0x33,0x33,0x30, -0x04,0x0E,0x00,0x00, -0x2F,0x2E,0x2D,0x2A, -0x08,0x0E,0x00,0x00, -0x32,0x32,0x00,0x00, -0x10,0x0E,0x00,0x00, -0x33,0x33,0x33,0x30, -0x14,0x0E,0x00,0x00, -0x2F,0x2E,0x2D,0x2A, -0x18,0x0E,0x00,0x00, -0x33,0x33,0x33,0x30, -0x1C,0x0E,0x00,0x00, -0x2F,0x2E,0x2D,0x2A, -0x30,0x0E,0x00,0x00, -0x00,0x7C,0x00,0x01, -0x34,0x0E,0x00,0x00, -0x00,0x48,0x00,0x01, -0x38,0x0E,0x00,0x00, -0x1F,0xDC,0x00,0x10, -0x3C,0x0E,0x00,0x00, -0x1F,0x8C,0x00,0x10, -0x40,0x0E,0x00,0x00, -0xA0,0x00,0x14,0x02, -0x44,0x0E,0x00,0x00, -0xA0,0x00,0x16,0x28, -0x48,0x0E,0x00,0x00, -0x01,0x00,0x00,0xF8, -0x4C,0x0E,0x00,0x00, -0x10,0x29,0x00,0x00, -0x50,0x0E,0x00,0x00, -0x00,0x7C,0x00,0x01, -0x54,0x0E,0x00,0x00, -0x00,0x48,0x00,0x01, -0x58,0x0E,0x00,0x00, -0x1F,0xDC,0x00,0x10, -0x5C,0x0E,0x00,0x00, -0x1F,0x8C,0x00,0x10, -0x60,0x0E,0x00,0x00, -0xA0,0x00,0x14,0x02, -0x64,0x0E,0x00,0x00, -0xA0,0x00,0x16,0x28, -0x6C,0x0E,0x00,0x00, -0x10,0x29,0x00,0x00, -0x70,0x0E,0x00,0x00, -0xFB,0x92,0xED,0x31, -0x74,0x0E,0x00,0x00, -0xFB,0x36,0x15,0x36, -0x78,0x0E,0x00,0x00, -0xFB,0x36,0x15,0x36, -0x7C,0x0E,0x00,0x00, -0xFB,0x36,0x15,0x36, -0x80,0x0E,0x00,0x00, -0xFB,0x36,0x15,0x36, -0x84,0x0E,0x00,0x00, -0xFB,0x92,0x0D,0x00, -0x88,0x0E,0x00,0x00, -0xFB,0x92,0x0D,0x00, -0x8C,0x0E,0x00,0x00, -0xFB,0x92,0xED,0x31, -0xD0,0x0E,0x00,0x00, -0xFB,0x92,0xED,0x31, -0xD4,0x0E,0x00,0x00, -0xFB,0x92,0xED,0x31, -0xD8,0x0E,0x00,0x00, -0xFB,0x92,0x0D,0x00, -0xDC,0x0E,0x00,0x00, -0xFB,0x92,0x0D,0x00, -0xE0,0x0E,0x00,0x00, -0xFB,0x92,0x0D,0x00, -0xE4,0x0E,0x00,0x00, -0x48,0x54,0x5E,0x01, -0xE8,0x0E,0x00,0x00, -0x48,0x54,0x55,0x21, -0x00,0x09,0x00,0x00, -0x00,0x00,0x00,0x00, -0x04,0x09,0x00,0x00, -0x23,0x00,0x00,0x00, -0x08,0x09,0x00,0x00, -0x00,0x00,0x00,0x00, -0x0C,0x09,0x00,0x00, -0x13,0x13,0x12,0x01, -0x00,0x0A,0x00,0x00, -0xC8,0x47,0xD0,0x00, -0x04,0x0A,0x00,0x00, -0x08,0x00,0xFF,0x80, -0x08,0x0A,0x00,0x00, -0x00,0x83,0xCD,0x88, -0x0C,0x0A,0x00,0x00, -0x0F,0x12,0x62,0x2E, -0x10,0x0A,0x00,0x00, -0x78,0xBB,0x00,0x95, -0x14,0x0A,0x00,0x00, -0x28,0x40,0x14,0x11, -0x18,0x0A,0x00,0x00, -0x17,0x11,0x88,0x00, -0x1C,0x0A,0x00,0x00, -0x00,0x0F,0x14,0x89, -0x20,0x0A,0x00,0x00, -0x00,0x00,0x1B,0x1A, -0x24,0x0A,0x00,0x00, -0x17,0x13,0x0E,0x09, -0x28,0x0A,0x00,0x00, -0x04,0x02,0x00,0x00, -0x2C,0x0A,0x00,0x00, -0x00,0x00,0xD3,0x10, -0x00,0x0C,0x00,0x00, -0x40,0x1D,0x07,0x40, -0x04,0x0C,0x00,0x00, -0x33,0x56,0xA0,0x00, -0x08,0x0C,0x00,0x00, -0xE4,0x00,0x00,0x00, -0x0C,0x0C,0x00,0x00, -0x6C,0x6C,0x6C,0x6C, -0x10,0x0C,0x00,0x00, -0x00,0x00,0x80,0x08, -0x14,0x0C,0x00,0x00, -0x00,0x01,0x00,0x40, -0x18,0x0C,0x00,0x00, -0x00,0x00,0x00,0x08, -0x1C,0x0C,0x00,0x00, -0x00,0x01,0x00,0x40, -0x20,0x0C,0x00,0x00, -0x00,0x00,0x00,0x08, -0x24,0x0C,0x00,0x00, -0x00,0x01,0x00,0x40, -0x28,0x0C,0x00,0x00, -0x00,0x00,0x00,0x08, -0x2C,0x0C,0x00,0x00, -0x00,0x01,0x00,0x40, -0x30,0x0C,0x00,0x00, -0x44,0xAC,0xE9,0x6D, -0x34,0x0C,0x00,0x00, -0xCF,0x52,0x96,0x46, -0x38,0x0C,0x00,0x00, -0x94,0x59,0x79,0x49, -0x3C,0x0C,0x00,0x00, -0x64,0x97,0x97,0x0A, -0x40,0x0C,0x00,0x00, -0x3F,0x40,0x7C,0x1F, -0x44,0x0C,0x00,0x00, -0xB7,0x00,0x01,0x00, -0x48,0x0C,0x00,0x00, -0x00,0x00,0x02,0xEC, -0x4C,0x0C,0x00,0x00, -0x7F,0x03,0x7F,0x00, -0x50,0x0C,0x00,0x00, -0x20,0x34,0x54,0x69, -0x54,0x0C,0x00,0x00, -0x94,0x00,0x3C,0x43, -0x58,0x0C,0x00,0x00, -0x20,0x34,0x54,0x69, -0x5C,0x0C,0x00,0x00, -0x94,0x00,0x3C,0x43, -0x60,0x0C,0x00,0x00, -0x20,0x34,0x54,0x69, -0x64,0x0C,0x00,0x00, -0x94,0x00,0x3C,0x43, -0x68,0x0C,0x00,0x00, -0x20,0x34,0x54,0x69, -0x6C,0x0C,0x00,0x00, -0x94,0x00,0x3C,0x43, -0x70,0x0C,0x00,0x00, -0x0D,0x00,0x7F,0x2C, -0x74,0x0C,0x00,0x00, -0x5B,0x17,0x86,0x01, -0x78,0x0C,0x00,0x00, -0x1F,0x00,0x00,0x00, -0x7C,0x0C,0x00,0x00, -0x12,0x16,0xB9,0x00, -0x80,0x0C,0x00,0x00, -0x00,0x01,0x00,0x40, -0x84,0x0C,0x00,0x00, -0x00,0x00,0xF6,0x20, -0x88,0x0C,0x00,0x00, -0x80,0x00,0x00,0x20, -0x8C,0x0C,0x00,0x00, -0x00,0x00,0x20,0x20, -0x90,0x0C,0x00,0x00, -0x00,0x01,0x00,0x40, -0x94,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0x98,0x0C,0x00,0x00, -0x00,0x01,0x00,0x40, -0x9C,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xA0,0x0C,0x00,0x00, -0x92,0x24,0x49,0x00, -0xA4,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xA8,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xAC,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xB0,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xB4,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xB8,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xBC,0x0C,0x00,0x00, -0x00,0x00,0x00,0x28, -0xC0,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xC4,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xC8,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xCC,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xD0,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xD4,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xD8,0x0C,0x00,0x00, -0x27,0x24,0xB2,0x64, -0xDC,0x0C,0x00,0x00, -0x32,0x69,0x76,0x00, -0xE0,0x0C,0x00,0x00, -0x22,0x22,0x22,0x00, -0xE4,0x0C,0x00,0x00, -0x00,0x00,0x00,0x00, -0xE8,0x0C,0x00,0x00, -0x02,0x43,0x64,0x37, -0xEC,0x0C,0x00,0x00, -0x0C,0xD4,0x97,0x2F, -0x00,0x0D,0x00,0x00, -0x50,0x07,0x00,0x00, -0x04,0x0D,0x00,0x00, -0x03,0x04,0x00,0x00, -0x08,0x0D,0x00,0x00, -0x7F,0x90,0x00,0x00, -0x0C,0x0D,0x00,0x00, -0x01,0x00,0x00,0x00, -0x10,0x0D,0x00,0x00, -0x33,0x33,0x63,0xA0, -0x14,0x0D,0x00,0x00, -0x63,0x3C,0x33,0x33, -0x18,0x0D,0x00,0x00, -0x6B,0x5B,0x8F,0x6A, -0x1C,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x20,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x24,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x28,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x2C,0x0D,0x00,0x00, -0x75,0x99,0x97,0xCC, -0x30,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x34,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x38,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x3C,0x0D,0x00,0x00, -0x93,0x72,0x02,0x00, -0x40,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x44,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x48,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x50,0x0D,0x00,0x00, -0x0A,0x14,0x37,0x64, -0x54,0x0D,0x00,0x00, -0x02,0xBD,0x4D,0x02, -0x58,0x0D,0x00,0x00, -0x00,0x00,0x00,0x00, -0x5C,0x0D,0x00,0x00, -0x64,0x20,0x03,0x30, -0x60,0x0D,0x00,0x00, -0x68,0xDE,0x53,0x46, -0x64,0x0D,0x00,0x00, -0x3C,0x8A,0x51,0x00, -0x68,0x0D,0x00,0x00, -0x01,0x21,0x00,0x00, -0x14,0x0F,0x00,0x00, -0x03,0x00,0x00,0x00, -0x4C,0x0F,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x0F,0x00,0x00, -0x00,0x03,0x00,0x00, -0x40,0x01,0x00,0x00, -0x04,0x00,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x10,0x00,0x00,0x00, -0x0C,0x02,0x01,0x80, -0x10,0x00,0x00,0x00, -0x3C,0x02,0x01,0x80, -0x10,0x00,0x00,0x00, -0x2C,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x34,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x3C,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x44,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x1C,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x24,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x7C,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x84,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0xE0,0x03,0x01,0x80, -0x10,0x00,0x00,0x00, -0xD8,0x03,0x01,0x80, -0x10,0x00,0x00,0x00, -0x8C,0x08,0x01,0x80, -0x10,0x00,0x00,0x00, -0x94,0x08,0x01,0x80, -0xDC,0x01,0x00,0x00, -0x54,0x25,0x00,0x80, -0x04,0x00,0x00,0x00, -0x10,0x06,0x01,0x80, -0xDC,0x01,0x00,0x00, -0x54,0x25,0x00,0x80, -0x04,0x00,0x00,0x00, -0xD0,0x27,0x00,0x80, -0x30,0x00,0x00,0x00, -0xD8,0x27,0x00,0x80, -0x04,0x00,0x00,0x00, -0x64,0x2A,0x00,0x80, -0x13,0x00,0x00,0x00, -0xE8,0x06,0x01,0x80, -0x17,0x00,0x00,0x00, -0x3C,0x07,0x01,0x80, -0x06,0x00,0x00,0x00, -0xC4,0x07,0x01,0x80, -0x06,0x00,0x00,0x00, -0xCC,0x07,0x01,0x80, -0x08,0x00,0x00,0x00, -0xD4,0x07,0x01,0x80, -0x0C,0x00,0x00,0x00, -0xDC,0x07,0x01,0x80, -0x04,0x00,0x00,0x00, -0xE4,0x07,0x01,0x80, -0x0E,0x00,0x00,0x00, -0xEC,0x07,0x01,0x80, -0x01,0x00,0x00,0x00, -0xF4,0x07,0x01,0x80, -0x38,0x00,0x00,0x00, -0xFC,0x07,0x01,0x80, -0x04,0x00,0x00,0x00, -0x04,0x08,0x01,0x80, -0x02,0x00,0x00,0x00, -0x0C,0x08,0x01,0x80, -0x04,0x00,0x00,0x00, -0x14,0x08,0x01,0x80, -0x01,0x00,0x00,0x00, -0x54,0x08,0x01,0x80, -0x01,0x00,0x00,0x00, -0x5C,0x08,0x01,0x80, -0x0C,0x00,0x00,0x00, -0xE8,0x03,0x01,0x80, -0x0E,0x00,0x00,0x00, -0xF0,0x03,0x01,0x80, -0x0C,0x00,0x00,0x00, -0x08,0x06,0x01,0x80, -0x34,0x00,0x00,0x00, -0x64,0x08,0x01,0x80, -0x04,0x00,0x00,0x00, -0x6C,0x08,0x01,0x80, -0x04,0x00,0x00,0x00, -0x9C,0x08,0x01,0x80, -0x04,0x00,0x00,0x00, -0xA4,0x08,0x01,0x80, -0x04,0x00,0x00,0x00, -0xAC,0x08,0x01,0x80, -0x04,0x00,0x00,0x00, -0x74,0x08,0x01,0x80, -0x08,0x00,0x00,0x00, -0x40,0x03,0x01,0x80, -0x04,0x00,0x00,0x00, -0xB4,0x08,0x01,0x80, -0x04,0x00,0x00,0x00, -0x2C,0x09,0x01,0x80, -0x04,0x00,0x00,0x00, -0x38,0x09,0x01,0x80, -0x04,0x00,0x00,0x00, -0xEC,0x09,0x01,0x80, -0x04,0x00,0x00,0x00, -0x50,0x0C,0x01,0x80, -0x04,0x00,0x00,0x00, -0x60,0x0C,0x01,0x80, -0x04,0x00,0x00,0x00, -0xC8,0x0D,0x01,0x80, -0x04,0x00,0x00,0x00, -0xF4,0x0E,0x01,0x80, -0x04,0x00,0x00,0x00, -0x30,0x10,0x01,0x80, -0x04,0x00,0x00,0x00, -0x48,0x12,0x01,0x80, -0x51,0x73,0x65,0x6C, -0x20,0x45,0x72,0x72, -0x6F,0x72,0x2C,0x20, -0x25,0x78,0x00,0x00, -0x72,0x65,0x70,0x65, -0x61,0x74,0x65,0x64, -0x20,0x65,0x6C,0x65, -0x6D,0x65,0x6E,0x74, -0x20,0x49,0x44,0x3A, -0x20,0x25,0x78,0x2C, -0x20,0x63,0x6D,0x64, -0x20,0x73,0x65,0x71, -0x3D,0x25,0x78,0x2C, -0x20,0x68,0x32,0x64, -0x73,0x65,0x71,0x3D, -0x25,0x78,0x0A,0x00, -0x69,0x6E,0x76,0x61, -0x6C,0x69,0x64,0x20, -0x63,0x6D,0x64,0x20, -0x69,0x64,0x3A,0x20, -0x25,0x78,0x0A,0x00, -0x48,0x32,0x43,0x3A, -0x20,0x25,0x78,0x0A, -0x00,0x00,0x00,0x00, -0x67,0x65,0x74,0x20, -0x6A,0x6F,0x69,0x6E, -0x20,0x63,0x6D,0x64, -0x0A,0x00,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x67,0x65,0x74,0x20, -0x73,0x75,0x72,0x76, -0x65,0x79,0x20,0x63, -0x6D,0x64,0x0A,0x00, -0x53,0x53,0x49,0x44, -0x3A,0x20,0x25,0x73, -0x0A,0x00,0x00,0x00, -0x73,0x65,0x74,0x41, -0x75,0x74,0x68,0x3A, -0x20,0x25,0x78,0x0A, -0x00,0x00,0x00,0x00, -0x72,0x63,0x76,0x20, -0x73,0x65,0x74,0x5F, -0x73,0x74,0x61,0x6B, -0x65,0x79,0x0A,0x00, -0x53,0x65,0x74,0x53, -0x69,0x6E,0x67,0x6C, -0x65,0x43,0x61,0x72, -0x72,0x69,0x65,0x72, -0x54,0x78,0x5F,0x68, -0x64,0x6C,0x0A,0x00, -0x53,0x65,0x74,0x53, -0x69,0x6E,0x67,0x6C, -0x65,0x54,0x6F,0x6E, -0x65,0x54,0x78,0x5F, -0x68,0x64,0x6C,0x0A, -0x00,0x00,0x00,0x00, -0x53,0x65,0x74,0x43, -0x61,0x72,0x72,0x69, -0x65,0x72,0x53,0x75, -0x70,0x70,0x72,0x65, -0x73,0x73,0x69,0x6F, -0x6E,0x54,0x78,0x5F, -0x68,0x64,0x6C,0x0A, -0x00,0x00,0x00,0x00, -0x53,0x65,0x74,0x43, -0x6F,0x6E,0x74,0x69, -0x6E,0x75,0x6F,0x75, -0x73,0x54,0x78,0x5F, -0x68,0x64,0x6C,0x0A, -0x00,0x00,0x00,0x00, -0x53,0x65,0x74,0x43, -0x43,0x4B,0x43,0x6F, -0x6E,0x74,0x69,0x6E, -0x75,0x6F,0x75,0x73, -0x54,0x78,0x0A,0x00, -0x53,0x65,0x74,0x4F, -0x46,0x44,0x4D,0x43, -0x6F,0x6E,0x74,0x69, -0x6E,0x75,0x6F,0x75, -0x73,0x54,0x78,0x0A, -0x00,0x00,0x00,0x00, -0x13,0x00,0x00,0x00, -0xF8,0x9E,0x02,0x00, -0x13,0x00,0x00,0x00, -0xC8,0x5E,0x02,0x00, -0x13,0x00,0x00,0x00, -0xF8,0x0E,0x02,0x00, -0x13,0x00,0x00,0x00, -0xC8,0xCE,0x01,0x00, -0x13,0x00,0x00,0x00, -0xD4,0x8E,0x01,0x00, -0x13,0x00,0x00,0x00, -0xA4,0x4E,0x01,0x00, -0x13,0x00,0x00,0x00, -0xD0,0x0E,0x01,0x00, -0x13,0x00,0x00,0x00, -0xA0,0xCE,0x00,0x00, -0x13,0x00,0x00,0x00, -0xD0,0x86,0x00,0x00, -0x13,0x00,0x00,0x00, -0xA0,0x46,0x00,0x00, -0x13,0x00,0x00,0x00, -0x70,0x06,0x00,0x00, -0x13,0x00,0x00,0x00, -0xA4,0x9E,0x02,0x00, -0x13,0x00,0x00,0x00, -0x74,0x5E,0x02,0x00, -0x13,0x00,0x00,0x00, -0xA4,0x0E,0x02,0x00, -0x13,0x00,0x00,0x00, -0xD0,0xCE,0x01,0x00, -0x13,0x00,0x00,0x00, -0x40,0x9F,0x01,0x00, -0x13,0x00,0x00,0x00, -0x70,0x4E,0x01,0x00, -0x13,0x00,0x00,0x00, -0xA0,0x06,0x01,0x00, -0x13,0x00,0x00,0x00, -0x70,0xC6,0x00,0x00, -0x13,0x00,0x00,0x00, -0xA0,0x82,0x00,0x00, -0x13,0x00,0x00,0x00, -0x70,0x42,0x00,0x00, -0x13,0x00,0x00,0x00, -0x40,0x02,0x00,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0xAA,0x88,0x88,0x44, -0x44,0x22,0x22,0x00, -0x00,0x00,0x00,0x00, -0x59,0x01,0x03,0x00, -0x01,0x00,0x00,0x00, -0x41,0x10,0x00,0x00, -0x02,0x00,0x00,0x00, -0x00,0x10,0x01,0x00, -0x05,0x00,0x00,0x00, -0xC0,0x0F,0x08,0x00, -0x07,0x00,0x00,0x00, -0x03,0xC8,0x0F,0x00, -0x13,0x00,0x00,0x00, -0xB0,0x7C,0x01,0x00, -0x13,0x00,0x00,0x00, -0xC0,0x1C,0x01,0x00, -0x13,0x00,0x00,0x00, -0x60,0xDC,0x00,0x00, -0x13,0x00,0x00,0x00, -0x60,0x8C,0x00,0x00, -0x13,0x00,0x00,0x00, -0x50,0x44,0x00,0x00, -0x13,0x00,0x00,0x00, -0x20,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x59,0x01,0x03,0x00, -0x01,0x00,0x00,0x00, -0x50,0x02,0x03,0x00, -0x02,0x00,0x00,0x00, -0x00,0x00,0x01,0x00, -0x10,0x00,0x00,0x00, -0x0F,0x00,0x08,0x00, -0x11,0x00,0x00,0x00, -0xFC,0x31,0x02,0x00, -0x10,0x00,0x00,0x00, -0x0F,0x00,0x0C,0x00, -0x11,0x00,0x00,0x00, -0xF8,0xF9,0x03,0x00, -0x10,0x00,0x00,0x00, -0x0F,0x00,0x02,0x00, -0x11,0x00,0x00,0x00, -0x01,0x01,0x02,0x00, -0x14,0x00,0x00,0x00, -0x3E,0x09,0x01,0x00, -0x14,0x00,0x00,0x00, -0x3E,0x09,0x09,0x00, -0x15,0x00,0x00,0x00, -0xF4,0x98,0x01,0x00, -0x17,0x00,0x00,0x00, -0x00,0x65,0x0F,0x00, -0x1A,0x00,0x00,0x00, -0x56,0x30,0x01,0x00, -0x1B,0x00,0x00,0x00, -0x00,0x00,0x06,0x00, -0x1C,0x00,0x00,0x00, -0x00,0x03,0x00,0x00, -0x1E,0x00,0x00,0x00, -0x59,0x10,0x03,0x00, -0x21,0x00,0x00,0x00, -0x00,0x40,0x05,0x00, -0x22,0x00,0x00,0x00, -0x3C,0x08,0x00,0x00, -0x23,0x00,0x00,0x00, -0x58,0x15,0x00,0x00, -0x24,0x00,0x00,0x00, -0x60,0x00,0x00,0x00, -0x25,0x00,0x00,0x00, -0x83,0x25,0x02,0x00, -0x26,0x00,0x00,0x00, -0x00,0xF2,0x00,0x00, -0x27,0x00,0x00,0x00, -0xF1,0xAC,0x0E,0x00, -0x28,0x00,0x00,0x00, -0x54,0xBD,0x09,0x00, -0x29,0x00,0x00,0x00, -0x82,0x45,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x01,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x34,0x13,0x02,0x00, -0x2A,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x0A,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x01,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x08,0x08,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0x33,0x05,0x00, -0x2C,0x00,0x00,0x00, -0x0C,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x02,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x08,0x08,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0xB3,0x05,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x03,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x08,0x08,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0x33,0x06,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x04,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x08,0x08,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0xB3,0x06,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x05,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x09,0x07,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0x33,0x05,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x06,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x09,0x07,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0xB3,0x05,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x07,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x09,0x07,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0x33,0x06,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x08,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x09,0x07,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0xB3,0x06,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x09,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x0A,0x06,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0x33,0x05,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x0A,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x0A,0x06,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0xB3,0x05,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x0B,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x0A,0x06,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0x33,0x06,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x0C,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x0A,0x06,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0xB3,0x06,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x0B,0x05,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x33,0x33,0x05,0x00, -0x2C,0x00,0x00,0x00, -0x0D,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x0E,0x00,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x0B,0x05,0x00,0x00, -0x2B,0x00,0x00,0x00, -0x23,0x66,0x06,0x00, -0x2C,0x00,0x00,0x00, -0x1A,0x00,0x00,0x00, -0x2A,0x00,0x00,0x00, -0x00,0x40,0x0E,0x00, -0x30,0x00,0x00,0x00, -0x00,0x00,0x02,0x00, -0x31,0x00,0x00,0x00, -0x31,0x96,0x0B,0x00, -0x32,0x00,0x00,0x00, -0x0D,0x13,0x00,0x00, -0x33,0x00,0x00,0x00, -0x87,0x01,0x00,0x00, -0x13,0x00,0x00,0x00, -0x6C,0x9E,0x01,0x00, -0x13,0x00,0x00,0x00, -0x94,0x5E,0x01,0x00, -0x00,0x00,0x00,0x00, -0x59,0x01,0x01,0x00, -0x18,0x00,0x00,0x00, -0x01,0xF4,0x00,0x00, -0xFE,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x1E,0x00,0x00,0x00, -0x5B,0x10,0x03,0x00, -0xFE,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x59,0x01,0x03,0x00, -0x10,0x00,0x00,0x00, -0x0F,0x00,0x04,0x00, -0x11,0x00,0x00,0x00, -0xF9,0x03,0x02,0x00, -0x6C,0x09,0x00,0x00, -0x01,0x02,0x03,0x04, -0x05,0x06,0x07,0x08, -0x09,0x0A,0x0B,0x00, -0x00,0x00,0x00,0x12, -0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12, -0x12,0x12,0x00,0x00, -0x00,0x00,0x0F,0x0F, -0x0F,0x0F,0x0F,0x0F, -0x0F,0x0F,0x0F,0x0F, -0x0F,0x00,0x00,0x00, -0x00,0x17,0x05,0x03, -0x22,0x43,0x5E,0x00, -0x4F,0xA4,0x00,0x00, -0x4F,0xA4,0x00,0x00, -0x22,0x43,0x5E,0x00, -0x4F,0xA4,0x00,0x00, -0x22,0x43,0x5E,0x00, -0x4F,0xA4,0x3E,0x00, -0x30,0xA6,0x00,0x00, -0x4F,0xA4,0x3E,0x00, -0x2B,0xA4,0x5E,0x00, -0x2B,0xA4,0x00,0x00, -0x2B,0xA4,0x5E,0x00, -0x22,0xA4,0x5E,0x00, -0x4F,0xA4,0x00,0x00, -0x4F,0xA4,0x00,0x00, -0x4F,0xA4,0x5E,0x00, -0x4F,0xA4,0x5E,0x00, -0x4F,0xA4,0x5E,0x00, -0x4F,0xA4,0x5E,0x00, -0x4F,0xA4,0x00,0x00, -0x4F,0xA4,0x5E,0x00, -0x00,0xE0,0x4C,0x02, -0x01,0x20,0x00,0x00, -0x00,0xE0,0x4C,0x00, -0x00,0x0C,0x43,0x00, -0x00,0x50,0x43,0x00, -0x00,0x40,0x96,0x00, -0x00,0x05,0xB5,0x00, -0x00,0x0A,0xF7,0x00, -0x00,0x10,0x18,0x00, -0x00,0x13,0x74,0x00, -0x00,0x03,0x7F,0x00, -0x00,0x50,0xF2,0x02, -0x01,0x01,0x00,0x00, -0x00,0x50,0xF2,0x02, -0x00,0x01,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0x00,0x00, -0x4F,0x6E,0x41,0x73, -0x73,0x6F,0x63,0x52, -0x65,0x71,0x00,0x00, -0x4F,0x6E,0x41,0x73, -0x73,0x6F,0x63,0x52, -0x73,0x70,0x00,0x00, -0x4F,0x6E,0x52,0x65, -0x41,0x73,0x73,0x6F, -0x63,0x52,0x65,0x71, -0x00,0x00,0x00,0x00, -0x4F,0x6E,0x52,0x65, -0x41,0x73,0x73,0x6F, -0x63,0x52,0x73,0x70, -0x00,0x00,0x00,0x00, -0x4F,0x6E,0x50,0x72, -0x6F,0x62,0x65,0x52, -0x65,0x71,0x00,0x00, -0x4F,0x6E,0x50,0x72, -0x6F,0x62,0x65,0x52, -0x73,0x70,0x00,0x00, -0x4F,0x6E,0x42,0x65, -0x61,0x63,0x6F,0x6E, -0x00,0x00,0x00,0x00, -0x4F,0x6E,0x41,0x54, -0x49,0x4D,0x00,0x00, -0x4F,0x6E,0x44,0x69, -0x73,0x61,0x73,0x73, -0x6F,0x63,0x00,0x00, -0x4F,0x6E,0x41,0x75, -0x74,0x68,0x00,0x00, -0x4F,0x6E,0x44,0x65, -0x41,0x75,0x74,0x68, -0x00,0x00,0x00,0x00, -0x4F,0x6E,0x41,0x63, -0x74,0x69,0x6F,0x6E, -0x00,0x00,0x00,0x00, -0x4F,0x6E,0x45,0x78, -0x63,0x65,0x70,0x74, -0x69,0x6F,0x6E,0x00, -0x00,0x00,0x00,0x00, -0xF8,0xDD,0x01,0x80, -0xE8,0x26,0x01,0x80, -0x10,0x00,0x00,0x00, -0x04,0xDE,0x01,0x80, -0xF0,0x26,0x01,0x80, -0x20,0x00,0x00,0x00, -0x10,0xDE,0x01,0x80, -0xE8,0x26,0x01,0x80, -0x30,0x00,0x00,0x00, -0x20,0xDE,0x01,0x80, -0xF0,0x26,0x01,0x80, -0x40,0x00,0x00,0x00, -0x30,0xDE,0x01,0x80, -0x80,0x2D,0x01,0x80, -0x50,0x00,0x00,0x00, -0x3C,0xDE,0x01,0x80, -0x28,0x4A,0x00,0x80, -0x80,0x00,0x00,0x00, -0x48,0xDE,0x01,0x80, -0x90,0x59,0x00,0x80, -0x90,0x00,0x00,0x00, -0x54,0xDE,0x01,0x80, -0x44,0x2E,0x01,0x80, -0xA0,0x00,0x00,0x00, -0x5C,0xDE,0x01,0x80, -0x4C,0x2E,0x01,0x80, -0xB0,0x00,0x00,0x00, -0x68,0xDE,0x01,0x80, -0x54,0x2F,0x01,0x80, -0xC0,0x00,0x00,0x00, -0x70,0xDE,0x01,0x80, -0x6C,0x2E,0x01,0x80, -0xD0,0x00,0x00,0x00, -0x7C,0xDE,0x01,0x80, -0xF0,0x54,0x00,0x80, -0x0C,0x00,0x00,0x00, -0x88,0xDE,0x01,0x80, -0x8C,0x2E,0x01,0x80, -0x73,0x77,0x69,0x74, -0x63,0x68,0x20,0x74, -0x6F,0x20,0x34,0x30, -0x4D,0x20,0x48,0x7A, -0x20,0x6D,0x6F,0x64, -0x65,0x28,0x25,0x78, -0x2C,0x20,0x25,0x78, -0x29,0x0A,0x00,0x00, -0x73,0x77,0x69,0x74, -0x63,0x68,0x20,0x74, -0x6F,0x20,0x32,0x30, -0x4D,0x20,0x48,0x7A, -0x20,0x6D,0x6F,0x64, -0x65,0x0A,0x00,0x00, -0x41,0x54,0x49,0x4D, -0x3A,0x20,0x25,0x78, -0x0A,0x00,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x73,0x75,0x72,0x76, -0x65,0x79,0x20,0x64, -0x6F,0x6E,0x65,0x28, -0x25,0x78,0x2C,0x20, -0x25,0x78,0x29,0x0A, -0x00,0x00,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x6A,0x6F,0x69,0x6E, -0x20,0x72,0x65,0x73, -0x28,0x25,0x78,0x29, -0x0A,0x00,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x64,0x65,0x6C,0x20, -0x73,0x74,0x61,0x0A, -0x00,0x00,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x61,0x64,0x64,0x20, -0x73,0x74,0x61,0x3A, -0x25,0x78,0x2C,0x20, -0x25,0x78,0x0A,0x00, -0x72,0x63,0x76,0x20, -0x64,0x69,0x73,0x63, -0x6F,0x6E,0x6E,0x65, -0x63,0x74,0x0A,0x00, -0x64,0x69,0x73,0x63, -0x6F,0x6E,0x6E,0x65, -0x63,0x74,0x20,0x74, -0x69,0x6D,0x65,0x72, -0x3A,0x20,0x6E,0x6F, -0x20,0x62,0x65,0x61, -0x63,0x6F,0x6E,0x0A, -0x00,0x00,0x00,0x00, -0x64,0x69,0x73,0x63, -0x6F,0x6E,0x6E,0x65, -0x63,0x74,0x20,0x74, -0x69,0x6D,0x65,0x72, -0x0A,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x40, -0x25,0x73,0x0A,0x00, -0x57,0x4D,0x4D,0x28, -0x25,0x78,0x29,0x3A, -0x20,0x25,0x78,0x2C, -0x20,0x25,0x78,0x0A, -0x00,0x00,0x00,0x00, -0x61,0x73,0x73,0x6F, -0x63,0x20,0x72,0x65, -0x6A,0x65,0x63,0x74, -0x2C,0x20,0x73,0x74, -0x61,0x74,0x75,0x73, -0x3A,0x20,0x25,0x64, -0x0A,0x00,0x00,0x00, -0x6D,0x61,0x63,0x20, -0x69,0x64,0x20,0x23, -0x34,0x3A,0x20,0x25, -0x78,0x2C,0x20,0x25, -0x78,0x0A,0x00,0x00, -0x6D,0x61,0x63,0x20, -0x69,0x64,0x20,0x23, -0x35,0x3A,0x20,0x25, -0x78,0x2C,0x20,0x25, -0x78,0x2C,0x20,0x25, -0x78,0x0A,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x40, -0x25,0x73,0x0A,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x63,0x75,0x72,0x20, -0x63,0x68,0x61,0x6E, -0x6E,0x65,0x6C,0x3A, -0x20,0x25,0x78,0x2C, -0x20,0x62,0x63,0x6E, -0x20,0x69,0x6E,0x74, -0x65,0x72,0x76,0x61, -0x6C,0x3A,0x20,0x25, -0x78,0x0A,0x00,0x00, -0x49,0x42,0x53,0x53, -0x20,0x6D,0x6F,0x64, -0x65,0x2C,0x20,0x63, -0x75,0x72,0x20,0x63, -0x68,0x61,0x6E,0x6E, -0x65,0x6C,0x3A,0x20, -0x25,0x78,0x2C,0x20, -0x62,0x63,0x6E,0x20, -0x69,0x6E,0x74,0x65, -0x72,0x76,0x61,0x6C, -0x3A,0x20,0x25,0x78, -0x0A,0x00,0x00,0x00, -0x6D,0x61,0x63,0x20, -0x69,0x64,0x20,0x23, -0x34,0x3A,0x20,0x25, -0x78,0x2C,0x20,0x25, -0x78,0x0A,0x00,0x00, -0x69,0x6E,0x76,0x61, -0x6C,0x69,0x64,0x20, -0x63,0x61,0x70,0x3A, -0x25,0x78,0x0A,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x20,0x61,0x73, -0x73,0x6F,0x63,0x72, -0x65,0x71,0x28,0x25, -0x78,0x29,0x0A,0x00, -0x5B,0x57,0x41,0x50, -0x49,0x5D,0x20,0x67, -0x65,0x74,0x20,0x77, -0x61,0x70,0x69,0x20, -0x49,0x45,0x0A,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x20,0x61,0x63, -0x74,0x69,0x6F,0x6E, -0x3A,0x20,0x25,0x78, -0x2C,0x20,0x25,0x78, -0x2C,0x20,0x25,0x78, -0x20,0x0A,0x00,0x00, -0x41,0x44,0x44,0x42, -0x41,0x20,0x52,0x53, -0x50,0x3A,0x20,0x25, -0x78,0x0A,0x00,0x00, -0x44,0x45,0x4C,0x42, -0x41,0x3A,0x20,0x25, -0x78,0x28,0x25,0x78, -0x29,0x0A,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x20,0x61,0x75, -0x74,0x68,0x0A,0x00, -0x63,0x6C,0x6E,0x74, -0x20,0x61,0x75,0x74, -0x68,0x20,0x66,0x61, -0x69,0x6C,0x2C,0x20, -0x73,0x74,0x61,0x74, -0x75,0x73,0x3A,0x20, -0x25,0x64,0x0A,0x00, -0x6E,0x6F,0x20,0x63, -0x68,0x61,0x6C,0x6C, -0x65,0x6E,0x67,0x65, -0x20,0x74,0x65,0x78, -0x74,0x3F,0x0A,0x00, -0x63,0x6C,0x6E,0x74, -0x20,0x61,0x75,0x74, -0x68,0x20,0x66,0x61, -0x69,0x6C,0x65,0x64, -0x20,0x64,0x75,0x65, -0x20,0x74,0x6F,0x20, -0x69,0x6C,0x6C,0x65, -0x67,0x61,0x6C,0x20, -0x73,0x65,0x71,0x3D, -0x25,0x78,0x0A,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x64,0x65, -0x61,0x75,0x74,0x68, -0x0A,0x00,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x64,0x69, -0x73,0x61,0x73,0x73, -0x6F,0x63,0x0A,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x4E,0x6F,0x20,0x69, -0x72,0x70,0x20,0x25, -0x73,0x0A,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x20,0x6E,0x75, -0x6C,0x6C,0x20,0x64, -0x61,0x74,0x61,0x28, -0x25,0x64,0x29,0x00, -0x6C,0x69,0x6E,0x6B, -0x20,0x74,0x6F,0x20, -0x41,0x72,0x74,0x68, -0x65,0x72,0x6F,0x73, -0x20,0x41,0x50,0x0A, -0x00,0x00,0x00,0x00, -0x6C,0x69,0x6E,0x6B, -0x20,0x74,0x6F,0x20, -0x42,0x72,0x6F,0x61, -0x64,0x63,0x6F,0x6D, -0x20,0x41,0x50,0x0A, -0x00,0x00,0x00,0x00, -0x6C,0x69,0x6E,0x6B, -0x20,0x74,0x6F,0x20, -0x4D,0x61,0x72,0x76, -0x65,0x6C,0x6C,0x20, -0x41,0x50,0x0A,0x00, -0x6C,0x69,0x6E,0x6B, -0x20,0x74,0x6F,0x20, -0x52,0x61,0x6C,0x69, -0x6E,0x6B,0x20,0x41, -0x50,0x0A,0x00,0x00, -0x6C,0x69,0x6E,0x6B, -0x20,0x74,0x6F,0x20, -0x43,0x69,0x73,0x63, -0x6F,0x20,0x41,0x50, -0x0A,0x00,0x00,0x00, -0x6C,0x69,0x6E,0x6B, -0x20,0x74,0x6F,0x20, -0x52,0x65,0x61,0x6C, -0x74,0x65,0x6B,0x20, -0x39,0x36,0x42,0x20, -0x41,0x50,0x0A,0x00, -0x6C,0x69,0x6E,0x6B, -0x20,0x74,0x6F,0x20, -0x75,0x6E,0x6B,0x6E, -0x6F,0x77,0x6E,0x20, -0x41,0x50,0x0A,0x00, -0x6D,0x61,0x63,0x20, -0x69,0x64,0x20,0x23, -0x25,0x78,0x3A,0x20, -0x25,0x78,0x2C,0x20, -0x25,0x78,0x0A,0x00, -0x64,0x72,0x6F,0x70, -0x20,0x64,0x75,0x65, -0x20,0x74,0x6F,0x20, -0x64,0x65,0x63,0x61, -0x63,0x68,0x65,0x0A, -0x00,0x00,0x00,0x00, -0xFF,0x00,0x00,0x00, -0x01,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0xFF,0xFF,0x00,0x00, -0x01,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x01,0x02,0x03, -0xFF,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x01,0x02,0x03, -0x04,0x05,0x06,0x07, -0x08,0x09,0x0A,0x0B, -0xFF,0x00,0x00,0x00, -0x04,0x05,0x06,0x07, -0x08,0x09,0x0A,0x0B, -0xFF,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x04,0x05,0x06,0x07, -0x08,0xFF,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x01,0x02,0x03, -0xFF,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x01,0x01,0x03, -0xFF,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x30,0x31,0x32,0x33, -0x34,0x35,0x36,0x37, -0x38,0x39,0x41,0x42, -0x43,0x44,0x45,0x46, -0x00,0x00,0x00,0x00, -0x25,0x64,0x2E,0x00, -0x25,0x68,0x68,0x58, -0x3A,0x00,0x00,0x00, -0x74,0x61,0x72,0x67, -0x65,0x74,0x20,0x74, -0x68,0x65,0x72,0x6D, -0x61,0x6C,0x3A,0x20, -0x25,0x78,0x2C,0x20, -0x63,0x75,0x72,0x20, -0x74,0x68,0x65,0x72, -0x6D,0x61,0x6C,0x3A, -0x20,0x25,0x78,0x0A, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x08,0xE4,0x01,0x80, -0x08,0xE4,0x01,0x80, -0x31,0x10,0x10,0x00, -0x00,0x30,0x00,0x00, -0x31,0x20,0x10,0x00, -0x00,0x30,0x00,0x00, -0x31,0x28,0x10,0x00, -0x00,0x30,0x00,0x00, -0x31,0x2C,0x10,0x10, -0x00,0x30,0x00,0x00, -0x31,0x2F,0x10,0x10, -0x00,0x30,0x00,0x00, -0x31,0x30,0x18,0x00, -0x00,0x30,0x00,0x00, -0x31,0x30,0x20,0x10, -0x00,0x30,0x00,0x00, -0x22,0x20,0x18,0x08, -0x00,0x20,0x00,0x00, -0x22,0x21,0x14,0x08, -0x00,0x20,0x00,0x00, -0x22,0x21,0x1C,0x08, -0x00,0x20,0x00,0x00, -0x22,0x21,0x20,0x08, -0x00,0x20,0x00,0x00, -0x22,0x21,0x20,0x10, -0x00,0x20,0x00,0x00, -0x22,0x21,0x20,0x18, -0x00,0x20,0x00,0x00, -0x1A,0x19,0x18,0x10, -0x00,0x18,0x00,0x00, -0x12,0x11,0x10,0x08, -0x00,0x10,0x00,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x08,0x00,0x00, -0x0A,0x09,0x08,0x02, -0x00,0x08,0x00,0x00, -0x0A,0x09,0x08,0x04, -0x00,0x08,0x00,0x00, -0x0A,0x09,0x08,0x06, -0x00,0x08,0x00,0x00, -0x08,0x07,0x06,0x04, -0x00,0x06,0x00,0x00, -0x06,0x05,0x04,0x02, -0x00,0x04,0x00,0x00, -0x06,0x05,0x04,0x03, -0x00,0x04,0x00,0x00, -0x05,0x04,0x03,0x02, -0x00,0x03,0x00,0x00, -0x09,0x08,0x07,0x06, -0x07,0x06,0x06,0x05, -0x05,0x04,0x04,0x03, -0x06,0x05,0x05,0x04, -0x04,0x03,0x03,0x03, -0x05,0x04,0x04,0x03, -0x03,0x02,0x02,0x02, -0x00,0x09,0x08,0x07, -0x06,0x07,0x06,0x06, -0x05,0x05,0x04,0x04, -0x03,0x05,0x04,0x04, -0x03,0x03,0x02,0x02, -0x02,0x04,0x03,0x03, -0x02,0x02,0x01,0x01, -0x01,0x00,0x00,0x00, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x10,0x10,0x20, -0x08,0x08,0x08,0x08, -0x20,0x20,0x20,0x20, -0x08,0x08,0x08,0x08, -0x08,0x20,0x20,0x20, -0x30,0x08,0x08,0x08, -0x08,0x18,0x18,0x18, -0x18,0x18,0x20,0x30, -0x30,0x10,0x20,0x20, -0x20,0x20,0x20,0x30, -0x30,0x08,0x10,0x20, -0x30,0x30,0x30,0x30, -0x30,0x30,0x00,0x00, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x10,0x10,0x20, -0x08,0x08,0x08,0x08, -0x08,0x20,0x20,0x20, -0x08,0x08,0x08,0x08, -0x08,0x20,0x20,0x20, -0x20,0x08,0x08,0x08, -0x08,0x18,0x18,0x18, -0x18,0x18,0x20,0x30, -0x30,0x10,0x20,0x20, -0x20,0x20,0x20,0x30, -0x30,0x08,0x10,0x20, -0x30,0x30,0x30,0x30, -0x30,0x30,0x00,0x00, -0x0A,0x09,0x08,0x04, -0x00,0x0A,0x09,0x08, -0x04,0x00,0x0A,0x09, -0x08,0x04,0x00,0x0A, -0x09,0x08,0x04,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x0A,0x09,0x08, -0x00,0x00,0x0A,0x09, -0x08,0x00,0x00,0x0A, -0x09,0x08,0x00,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x12,0x11,0x10, -0x08,0x00,0x12,0x11, -0x10,0x08,0x00,0x22, -0x21,0x20,0x18,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x0A,0x09,0x08, -0x00,0x00,0x0A,0x09, -0x08,0x00,0x00,0x0A, -0x09,0x08,0x00,0x00, -0x22,0x21,0x20,0x18, -0x00,0x22,0x21,0x20, -0x18,0x00,0x22,0x21, -0x1C,0x08,0x00,0x22, -0x20,0x18,0x08,0x00, -0x0A,0x09,0x08,0x02, -0x00,0x0A,0x09,0x08, -0x02,0x00,0x0A,0x09, -0x08,0x02,0x00,0x0A, -0x09,0x08,0x02,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x22,0x21,0x20, -0x10,0x00,0x22,0x21, -0x20,0x08,0x00,0x22, -0x21,0x1C,0x08,0x00, -0x31,0x30,0x18,0x00, -0x00,0x0A,0x09,0x08, -0x04,0x00,0x0A,0x09, -0x08,0x04,0x00,0x0A, -0x09,0x08,0x04,0x00, -0x0A,0x09,0x08,0x04, -0x00,0x1A,0x19,0x18, -0x10,0x00,0x1A,0x19, -0x18,0x10,0x00,0x1A, -0x19,0x18,0x10,0x00, -0x1A,0x19,0x18,0x10, -0x00,0x1A,0x19,0x18, -0x10,0x00,0x22,0x21, -0x20,0x08,0x00,0x31, -0x2C,0x10,0x10,0x00, -0x31,0x28,0x10,0x00, -0x00,0x12,0x11,0x10, -0x08,0x00,0x22,0x21, -0x20,0x18,0x00,0x22, -0x21,0x20,0x18,0x00, -0x22,0x21,0x20,0x08, -0x00,0x22,0x21,0x14, -0x08,0x00,0x22,0x20, -0x18,0x08,0x00,0x31, -0x30,0x20,0x10,0x00, -0x31,0x2C,0x10,0x10, -0x00,0x0A,0x09,0x08, -0x00,0x00,0x12,0x11, -0x10,0x08,0x00,0x22, -0x21,0x20,0x18,0x00, -0x22,0x21,0x20,0x18, -0x00,0x31,0x30,0x20, -0x10,0x00,0x31,0x2F, -0x10,0x10,0x00,0x31, -0x2F,0x10,0x10,0x00, -0x31,0x10,0x10,0x00, -0x00,0x31,0x2C,0x10, -0x10,0x00,0x00,0x00, -0x0A,0x09,0x08,0x04, -0x00,0x0A,0x09,0x08, -0x04,0x00,0x0A,0x09, -0x08,0x04,0x00,0x0A, -0x09,0x08,0x04,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x0A,0x09,0x08, -0x00,0x00,0x0A,0x09, -0x08,0x00,0x00,0x0A, -0x09,0x08,0x00,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x12,0x11,0x10, -0x08,0x00,0x12,0x11, -0x10,0x08,0x00,0x22, -0x21,0x20,0x18,0x00, -0x0A,0x09,0x08,0x04, -0x00,0x0A,0x09,0x08, -0x04,0x00,0x0A,0x09, -0x08,0x02,0x00,0x0A, -0x09,0x08,0x00,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x22,0x21,0x20, -0x18,0x00,0x22,0x21, -0x1C,0x08,0x00,0x22, -0x21,0x14,0x08,0x00, -0x0A,0x09,0x08,0x02, -0x00,0x0A,0x09,0x08, -0x02,0x00,0x0A,0x09, -0x08,0x02,0x00,0x0A, -0x09,0x08,0x02,0x00, -0x0A,0x09,0x08,0x00, -0x00,0x22,0x21,0x20, -0x10,0x00,0x22,0x21, -0x20,0x08,0x00,0x22, -0x21,0x14,0x08,0x00, -0x22,0x21,0x14,0x08, -0x00,0x0A,0x09,0x08, -0x04,0x00,0x0A,0x09, -0x08,0x04,0x00,0x0A, -0x09,0x08,0x04,0x00, -0x0A,0x09,0x08,0x04, -0x00,0x1A,0x19,0x18, -0x10,0x00,0x1A,0x19, -0x18,0x10,0x00,0x1A, -0x19,0x18,0x10,0x00, -0x1A,0x19,0x18,0x10, -0x00,0x1A,0x19,0x18, -0x10,0x00,0x22,0x21, -0x20,0x08,0x00,0x31, -0x2C,0x10,0x10,0x00, -0x31,0x28,0x10,0x00, -0x00,0x12,0x11,0x10, -0x08,0x00,0x22,0x21, -0x20,0x18,0x00,0x22, -0x21,0x20,0x18,0x00, -0x22,0x21,0x20,0x08, -0x00,0x22,0x21,0x14, -0x08,0x00,0x22,0x20, -0x18,0x08,0x00,0x31, -0x30,0x20,0x10,0x00, -0x31,0x2C,0x10,0x10, -0x00,0x0A,0x09,0x08, -0x00,0x00,0x12,0x11, -0x10,0x08,0x00,0x22, -0x21,0x20,0x18,0x00, -0x22,0x21,0x20,0x18, -0x00,0x31,0x30,0x20, -0x10,0x00,0x31,0x2F, -0x10,0x10,0x00,0x31, -0x2F,0x10,0x10,0x00, -0x31,0x10,0x10,0x00, -0x00,0x31,0x2C,0x10, -0x10,0x00,0x00,0x00, -0x01,0x02,0x04,0x08, -0x02,0x04,0x08,0x0C, -0x10,0x18,0x20,0x30, -0x02,0x04,0x08,0x0C, -0x10,0x18,0x20,0x30, -0x06,0x0C,0x10,0x18, -0x24,0x30,0x3C,0x48, -0x48,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x25,0x27,0x2C, -0x19,0x1B,0x1E,0x20, -0x23,0x29,0x2A,0x2B, -0x00,0x00,0x00,0x00, -0x25,0x29,0x2B,0x2E, -0x2E,0x00,0x00,0x00, -0x04,0x00,0x00,0x00, -0x04,0x00,0x00,0x00, -0x08,0x00,0x00,0x00, -0x10,0x00,0x00,0x00, -0x18,0x00,0x00,0x00, -0x24,0x00,0x00,0x00, -0x30,0x00,0x00,0x00, -0x48,0x00,0x00,0x00, -0x60,0x00,0x00,0x00, -0x90,0x00,0x00,0x00, -0xC0,0x00,0x00,0x00, -0xD8,0x00,0x00,0x00, -0x50,0x00,0x00,0x00, -0x78,0x00,0x00,0x00, -0xA0,0x00,0x00,0x00, -0xC8,0x00,0x00,0x00, -0x40,0x01,0x00,0x00, -0x90,0x01,0x00,0x00, -0xE0,0x01,0x00,0x00, -0x30,0x02,0x00,0x00, -0x2C,0x01,0x00,0x00, -0x40,0x01,0x00,0x00, -0xE0,0x01,0x00,0x00, -0xD0,0x02,0x00,0x00, -0x80,0x0C,0x00,0x00, -0x80,0x0C,0x00,0x00, -0x80,0x0C,0x00,0x00, -0xA0,0x0F,0x00,0x00, -0xA0,0x0F,0x00,0x00, -0x02,0x00,0x00,0x00, -0x02,0x00,0x00,0x00, -0x04,0x00,0x00,0x00, -0x08,0x00,0x00,0x00, -0x0C,0x00,0x00,0x00, -0x12,0x00,0x00,0x00, -0x18,0x00,0x00,0x00, -0x24,0x00,0x00,0x00, -0x30,0x00,0x00,0x00, -0x48,0x00,0x00,0x00, -0x60,0x00,0x00,0x00, -0x6C,0x00,0x00,0x00, -0x28,0x00,0x00,0x00, -0x3C,0x00,0x00,0x00, -0x50,0x00,0x00,0x00, -0x64,0x00,0x00,0x00, -0xA0,0x00,0x00,0x00, -0xC8,0x00,0x00,0x00, -0xF0,0x00,0x00,0x00, -0x18,0x01,0x00,0x00, -0x64,0x00,0x00,0x00, -0xA0,0x00,0x00,0x00, -0xF0,0x00,0x00,0x00, -0x68,0x01,0x00,0x00, -0x40,0x06,0x00,0x00, -0x40,0x06,0x00,0x00, -0x40,0x06,0x00,0x00, -0xD0,0x07,0x00,0x00, -0xD0,0x07,0x00,0x00, -0x72,0x65,0x73,0x65, -0x74,0x28,0x25,0x78, -0x29,0x0A,0x00,0x00, -0xC8,0x82,0x01,0x80, -0xC8,0xD0,0x00,0x80, -0xC8,0xD0,0x00,0x80, -0xC8,0xD0,0x00,0x80, -0xC8,0xD0,0x00,0x80, -0x14,0xCF,0x00,0x80, -0xD0,0x82,0x01,0x80, -0xC8,0x82,0x01,0x80, -0xC8,0x82,0x01,0x80, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0xF0,0x85,0x01,0x80, -0xF0,0x85,0x01,0x80, -0xF0,0x85,0x01,0x80, -0xF0,0x85,0x01,0x80, -0xA8,0x82,0x01,0x80, -0x00,0x85,0x01,0x80, -0xB0,0x82,0x01,0x80, -0xB8,0x82,0x01,0x80, -0xC0,0x82,0x01,0x80, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x08,0x04,0x04,0x08, -0x02,0x02,0x01,0x01, -0x50,0x53,0x00,0x00, -0x80,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0xA0,0xA4,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x68,0xA4,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x30,0xA4,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0xF8,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0xC0,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x88,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x70,0xA3,0x01,0x80, -0x48,0xA3,0x01,0x80, -0xB8,0x06,0x00,0x80, -0xAC,0x06,0x00,0x80, -0xA0,0x06,0x00,0x80, -0x94,0x06,0x00,0x80, -0x88,0x06,0x00,0x80, -0x7C,0x06,0x00,0x80, -0x70,0x06,0x00,0x80, -0x64,0x06,0x00,0x80, -0x58,0x06,0x00,0x80, -0x4C,0x06,0x00,0x80, -0x04,0x06,0x00,0x80, -0x30,0x1F,0x02,0x80, -0xB0,0x03,0x25,0xB0, -0x30,0x1F,0x02,0x80, -0x30,0x1F,0x02,0x80, -0x30,0x1F,0x02,0x80, -0x30,0x1F,0x02,0x80, -0x6A,0x6F,0x69,0x6E, -0x62,0x73,0x73,0x5F, -0x68,0x64,0x6C,0x00, -0x00,0x0E,0x04,0x0E, -0x10,0x0E,0x14,0x0E, -0x18,0x0E,0x1C,0x0E, -0x02,0x04,0x04,0x07, -0x07,0x0D,0x0D,0x0D, -0x02,0x07,0x07,0x0D, -0x0D,0x0F,0x0F,0x0F, -0x0F,0x00,0x00,0x00, -0x72,0x65,0x70,0x6F, -0x72,0x74,0x5F,0x73, -0x75,0x72,0x76,0x65, -0x79,0x5F,0x64,0x6F, -0x6E,0x65,0x00,0x00, -0x72,0x65,0x70,0x6F, -0x72,0x74,0x5F,0x6A, -0x6F,0x69,0x6E,0x5F, -0x72,0x65,0x73,0x00, -0x72,0x65,0x70,0x6F, -0x72,0x74,0x5F,0x64, -0x65,0x6C,0x5F,0x73, -0x74,0x61,0x5F,0x65, -0x76,0x65,0x6E,0x74, -0x00,0x00,0x00,0x00, -0x72,0x65,0x70,0x6F, -0x72,0x74,0x5F,0x61, -0x64,0x64,0x5F,0x73, -0x74,0x61,0x5F,0x65, -0x76,0x65,0x6E,0x74, -0x00,0x00,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x70,0x72, -0x6F,0x62,0x65,0x72, -0x65,0x71,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x70,0x72, -0x6F,0x62,0x65,0x72, -0x73,0x70,0x00,0x00, -0x72,0x65,0x70,0x6F, -0x72,0x74,0x5F,0x42, -0x53,0x53,0x49,0x44, -0x5F,0x69,0x6E,0x66, -0x6F,0x00,0x00,0x00, -0x00,0x50,0xF2,0x01, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x61,0x73, -0x73,0x6F,0x63,0x72, -0x65,0x71,0x00,0x00, -0x00,0x50,0xF2,0x04, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x61,0x63, -0x74,0x69,0x6F,0x6E, -0x00,0x00,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x61,0x75, -0x74,0x68,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x64,0x65, -0x61,0x75,0x74,0x68, -0x00,0x00,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x64,0x69, -0x73,0x61,0x73,0x73, -0x6F,0x63,0x00,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x66,0x72, -0x61,0x6D,0x65,0x00, -0x69,0x73,0x73,0x75, -0x65,0x5F,0x66,0x72, -0x61,0x6D,0x65,0x5F, -0x6C,0x65,0x6E,0x00, -0x30,0x1F,0x02,0x80, -0xB0,0x03,0x25,0xB0, -0xF8,0x00,0x25,0xB0, -0x18,0x03,0x25,0xB0, -0x44,0x44,0x33,0x33, -0x06,0x00,0x2A,0xB0, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x24,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0xA8,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x9C,0x3E,0x01,0x80, -0x90,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x84,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x78,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x6C,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x60,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x54,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x48,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x3C,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x28,0x3E,0x01,0x80, -0x30,0x3E,0x01,0x80, -0x68,0x3F,0x01,0x80, -0x5C,0x3F,0x01,0x80, -0x50,0x3F,0x01,0x80, -0x44,0x3F,0x01,0x80, -0x38,0x3F,0x01,0x80, -0x2C,0x3F,0x01,0x80, -0x20,0x3F,0x01,0x80, -0x14,0x3F,0x01,0x80, -0x08,0x3F,0x01,0x80, -0xFC,0x3E,0x01,0x80, -0xF0,0x3E,0x01,0x80, -0xE4,0x3E,0x01,0x80, -0x00,0x50,0xF2,0x01, -0x00,0x50,0xF2,0x02, -0x00,0x0F,0xAC,0x02, -0xBC,0xE3,0x01,0x80, -0x67,0x66,0x66,0x66, -0x7C,0x88,0x00,0x80, -0x64,0x88,0x00,0x80, -0x4C,0x88,0x00,0x80, -0x34,0x88,0x00,0x80, -0x1C,0x88,0x00,0x80, -0x04,0x88,0x00,0x80, -0xE0,0x87,0x00,0x80, -0x00,0x02,0x00,0x00, -0x08,0x09,0x00,0x00, -0x18,0x96,0x00,0x80, -0x24,0x96,0x00,0x80, -0x30,0x96,0x00,0x80, -0x3C,0x96,0x00,0x80, -0x18,0x96,0x00,0x80, -0x18,0x96,0x00,0x80, -0x18,0x96,0x00,0x80, -0x18,0x96,0x00,0x80, -0x48,0x96,0x00,0x80, -0x54,0x96,0x00,0x80, -0x60,0x96,0x00,0x80, -0x6C,0x96,0x00,0x80, -0x30,0x1F,0x02,0x80, -0x84,0x0E,0x25,0xB0, -0x88,0x0E,0x25,0xB0, -0x8C,0x0E,0x25,0xB0, -0xD0,0x0E,0x25,0xB0, -0xD8,0x0E,0x25,0xB0, -0x20,0x08,0x25,0xB0, -0x74,0x0E,0x25,0xB0, -0x80,0x0E,0x25,0xB0, -0x84,0x0E,0x25,0xB0, -0x88,0x0E,0x25,0xB0, -0x8C,0x0E,0x25,0xB0, -0xD0,0x0E,0x25,0xB0, -0xD8,0x0E,0x25,0xB0, -0x14,0x0C,0x25,0xB0, -0x88,0x0C,0x25,0xB0, -0x1C,0x0C,0x25,0xB0, -0xFE,0x01,0x80,0x7F, -0xE2,0x01,0x80,0x78, -0xC7,0x01,0xC0,0x71, -0xAE,0x01,0x80,0x6B, -0x95,0x01,0x40,0x65, -0x7F,0x01,0xC0,0x5F, -0x69,0x01,0x40,0x5A, -0x55,0x01,0x40,0x55, -0x42,0x01,0x80,0x50, -0x30,0x01,0x00,0x4C, -0x1F,0x01,0xC0,0x47, -0x0F,0x01,0xC0,0x43, -0x00,0x01,0x00,0x40, -0xF2,0x00,0x80,0x3C, -0xE4,0x00,0x00,0x39, -0xD7,0x00,0xC0,0x35, -0xCB,0x00,0xC0,0x32, -0xC0,0x00,0x00,0x30, -0xB5,0x00,0x40,0x2D, -0xAB,0x00,0xC0,0x2A, -0xA2,0x00,0x80,0x28, -0x98,0x00,0x00,0x26, -0x90,0x00,0x00,0x24, -0x88,0x00,0x00,0x22, -0x80,0x00,0x00,0x20, -0x79,0x00,0x40,0x1E, -0x72,0x00,0x80,0x1C, -0x6C,0x00,0x00,0x1B, -0x66,0x00,0x80,0x19, -0x60,0x00,0x00,0x18, -0x5B,0x00,0xC0,0x16, -0x56,0x00,0x80,0x15, -0x51,0x00,0x40,0x14, -0x4C,0x00,0x00,0x13, -0x48,0x00,0x00,0x12, -0x44,0x00,0x00,0x11, -0x40,0x00,0x00,0x10, -0x36,0x35,0x2E,0x25, -0x1C,0x12,0x09,0x04, -0x33,0x32,0x2B,0x23, -0x1A,0x11,0x08,0x04, -0x30,0x2F,0x29,0x21, -0x19,0x10,0x08,0x03, -0x2D,0x2D,0x27,0x1F, -0x18,0x0F,0x08,0x03, -0x2B,0x2A,0x25,0x1E, -0x16,0x0E,0x07,0x03, -0x28,0x28,0x22,0x1C, -0x15,0x0D,0x07,0x03, -0x26,0x25,0x21,0x1B, -0x14,0x0D,0x06,0x03, -0x24,0x23,0x1F,0x19, -0x13,0x0C,0x06,0x03, -0x22,0x21,0x1D,0x18, -0x11,0x0B,0x06,0x02, -0x20,0x20,0x1B,0x16, -0x11,0x08,0x05,0x02, -0x1F,0x1E,0x1A,0x15, -0x10,0x0A,0x05,0x02, -0x1D,0x1C,0x18,0x14, -0x0F,0x0A,0x05,0x02, -0x1B,0x1A,0x17,0x13, -0x0E,0x09,0x04,0x02, -0x1A,0x19,0x16,0x12, -0x0D,0x09,0x04,0x02, -0x18,0x17,0x15,0x11, -0x0C,0x08,0x04,0x02, -0x17,0x16,0x13,0x10, -0x0C,0x08,0x04,0x02, -0x16,0x15,0x12,0x0F, -0x0B,0x07,0x04,0x01, -0x14,0x14,0x11,0x0E, -0x0B,0x07,0x03,0x02, -0x13,0x13,0x10,0x0D, -0x0A,0x06,0x03,0x01, -0x12,0x12,0x0F,0x0C, -0x09,0x06,0x03,0x01, -0x11,0x11,0x0F,0x0C, -0x09,0x06,0x03,0x01, -0x10,0x10,0x0E,0x0B, -0x08,0x05,0x03,0x01, -0x0F,0x0F,0x0D,0x0B, -0x08,0x05,0x03,0x01, -0x0E,0x0E,0x0C,0x0A, -0x08,0x05,0x02,0x01, -0x0D,0x0D,0x0C,0x0A, -0x07,0x05,0x02,0x01, -0x0D,0x0C,0x0B,0x09, -0x07,0x04,0x02,0x01, -0x0C,0x0C,0x0A,0x09, -0x06,0x04,0x02,0x01, -0x0B,0x0B,0x0A,0x08, -0x06,0x04,0x02,0x01, -0x0B,0x0A,0x09,0x08, -0x06,0x04,0x02,0x01, -0x0A,0x0A,0x09,0x07, -0x05,0x03,0x02,0x01, -0x0A,0x09,0x08,0x07, -0x05,0x03,0x02,0x01, -0x09,0x09,0x08,0x06, -0x05,0x03,0x01,0x01, -0x09,0x08,0x07,0x06, -0x04,0x03,0x01,0x01, -0x36,0x35,0x2E,0x1B, -0x00,0x00,0x00,0x00, -0x33,0x32,0x2B,0x19, -0x00,0x00,0x00,0x00, -0x30,0x2F,0x29,0x18, -0x00,0x00,0x00,0x00, -0x2D,0x2D,0x17,0x17, -0x00,0x00,0x00,0x00, -0x2B,0x2A,0x25,0x15, -0x00,0x00,0x00,0x00, -0x28,0x28,0x24,0x14, -0x00,0x00,0x00,0x00, -0x26,0x25,0x21,0x13, -0x00,0x00,0x00,0x00, -0x24,0x23,0x1F,0x12, -0x00,0x00,0x00,0x00, -0x22,0x21,0x1D,0x11, -0x00,0x00,0x00,0x00, -0x20,0x20,0x1B,0x10, -0x00,0x00,0x00,0x00, -0x1F,0x1E,0x1A,0x0F, -0x00,0x00,0x00,0x00, -0x1D,0x1C,0x18,0x0E, -0x00,0x00,0x00,0x00, -0x1B,0x1A,0x17,0x0E, -0x00,0x00,0x00,0x00, -0x1A,0x19,0x16,0x0D, -0x00,0x00,0x00,0x00, -0x18,0x17,0x15,0x0C, -0x00,0x00,0x00,0x00, -0x17,0x16,0x13,0x0B, -0x00,0x00,0x00,0x00, -0x16,0x15,0x12,0x0B, -0x00,0x00,0x00,0x00, -0x14,0x14,0x11,0x0A, -0x00,0x00,0x00,0x00, -0x13,0x13,0x10,0x0A, -0x00,0x00,0x00,0x00, -0x12,0x12,0x0F,0x09, -0x00,0x00,0x00,0x00, -0x11,0x11,0x0F,0x09, -0x00,0x00,0x00,0x00, -0x10,0x10,0x0E,0x08, -0x00,0x00,0x00,0x00, -0x0F,0x0F,0x0D,0x08, -0x00,0x00,0x00,0x00, -0x0E,0x0E,0x0C,0x07, -0x00,0x00,0x00,0x00, -0x0D,0x0D,0x0C,0x07, -0x00,0x00,0x00,0x00, -0x0D,0x0C,0x0B,0x06, -0x00,0x00,0x00,0x00, -0x0C,0x0C,0x0A,0x06, -0x00,0x00,0x00,0x00, -0x0B,0x0B,0x0A,0x06, -0x00,0x00,0x00,0x00, -0x0B,0x0A,0x09,0x05, -0x00,0x00,0x00,0x00, -0x0A,0x0A,0x09,0x05, -0x00,0x00,0x00,0x00, -0x0A,0x09,0x08,0x05, -0x00,0x00,0x00,0x00, -0x09,0x09,0x08,0x05, -0x00,0x00,0x00,0x00, -0x09,0x08,0x07,0x04, -0x00,0x00,0x00,0x00, -0x06,0x00,0x2A,0xB0, -0x05,0x00,0x2A,0xB0, -0x54,0x83,0x01,0x80, -0xC4,0x83,0x01,0x80, -0x80,0x83,0x01,0x80, -0xC4,0x83,0x01,0x80, -0xC4,0x83,0x01,0x80, -0xC4,0x83,0x01,0x80, -0xC4,0x83,0x01,0x80, -0x2C,0x83,0x01,0x80, -0x00,0x01,0x02,0x02, -0x03,0x03,0x03,0x03, -0x04,0x04,0x04,0x04, -0x04,0x04,0x04,0x04, -0x05,0x05,0x05,0x05, -0x05,0x05,0x05,0x05, -0x05,0x05,0x05,0x05, -0x05,0x05,0x05,0x05, -0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x28,0x28,0x28, -0x28,0x28,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08, -0xA0,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x04,0x04,0x04,0x04, -0x04,0x04,0x04,0x04, -0x04,0x04,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x41,0x41,0x41, -0x41,0x41,0x41,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x10, -0x10,0x10,0x10,0x10, -0x10,0x42,0x42,0x42, -0x42,0x42,0x42,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x10, -0x10,0x10,0x10,0x08, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0xA0,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x10, -0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x10, -0x02,0x02,0x02,0x02, -0x02,0x02,0x02,0x00, -0x2D,0x5C,0x7C,0x2F, -0x00,0x00,0x00,0x00, -0xFD,0xFA,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x45,0xC4,0xF0, -0x00,0x45,0xC4,0xF0, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x00,0x45,0xB5,0x60, -0xFF,0xFF,0xFF,0xFF, -0x00,0x00,0x00,0x02, -0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00, -0x08,0xFB,0x90,0xB8, -0xFF,0xFF,0xFF,0xFF, -}; diff --git a/drivers/net/wireless/rtl8192c/include/h2clbk.h b/drivers/net/wireless/rtl8192c/include/h2clbk.h deleted file mode 100755 index 359c9e7a8f24..000000000000 --- a/drivers/net/wireless/rtl8192c/include/h2clbk.h +++ /dev/null @@ -1,35 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#define _H2CLBK_H_ - - -#include -#include - - -void _lbk_cmd(PADAPTER Adapter); - -void _lbk_rsp(PADAPTER Adapter); - -void _lbk_evt(IN PADAPTER Adapter); - -void h2c_event_callback(unsigned char *dev, unsigned char *pbuf); diff --git a/drivers/net/wireless/rtl8192c/include/hal_init.h b/drivers/net/wireless/rtl8192c/include/hal_init.h deleted file mode 100755 index c05e6bfb2424..000000000000 --- a/drivers/net/wireless/rtl8192c/include/hal_init.h +++ /dev/null @@ -1,272 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __HAL_INIT_H__ -#define __HAL_INIT_H__ - -#include -#include -#include - -#ifdef CONFIG_PCI_HCI -#include -#endif - - -enum RTL871X_HCI_TYPE { - - RTW_SDIO, - RTW_USB, - RTW_PCIE -}; - -enum _CHIP_TYPE { - - NULL_CHIP_TYPE, - RTL8712_8188S_8191S_8192S, - RTL8188C_8192C, - RTL8192D, - MAX_CHIP_TYPE -}; - - -typedef enum _HW_VARIABLES{ - HW_VAR_MEDIA_STATUS, - HW_VAR_MEDIA_STATUS1, - HW_VAR_SET_OPMODE, - HW_VAR_BSSID, - HW_VAR_INIT_RTS_RATE, - HW_VAR_BASIC_RATE, - HW_VAR_TXPAUSE, - HW_VAR_BCN_FUNC, - HW_VAR_CORRECT_TSF, - HW_VAR_CHECK_BSSID, - HW_VAR_MLME_DISCONNECT, - HW_VAR_MLME_SITESURVEY, - HW_VAR_MLME_JOIN, - HW_VAR_BEACON_INTERVAL, - HW_VAR_SLOT_TIME, - HW_VAR_SIFS, - HW_VAR_ACK_PREAMBLE, - HW_VAR_SEC_CFG, - HW_VAR_TX_BCN_DONE, - HW_VAR_RF_TYPE, - HW_VAR_DM_FLAG, - HW_VAR_DM_FUNC_OP, - HW_VAR_DM_FUNC_SET, - HW_VAR_DM_FUNC_CLR, - HW_VAR_CAM_EMPTY_ENTRY, - HW_VAR_CAM_INVALID_ALL, - HW_VAR_CAM_WRITE, - HW_VAR_AC_PARAM_VO, - HW_VAR_AC_PARAM_VI, - HW_VAR_AC_PARAM_BE, - HW_VAR_AC_PARAM_BK, - HW_VAR_AMPDU_MIN_SPACE, - HW_VAR_AMPDU_FACTOR, - HW_VAR_RXDMA_AGG_PG_TH, - HW_VAR_SET_RPWM, - HW_VAR_H2C_FW_PWRMODE, - HW_VAR_H2C_FW_JOINBSSRPT, - HW_VAR_FWLPS_RF_ON, - HW_VAR_H2C_FW_P2P_PS_OFFLOAD, - HW_VAR_INITIAL_GAIN, - HW_VAR_TRIGGER_GPIO_0, - HW_VAR_BT_SET_COEXIST, - HW_VAR_BT_ISSUE_DELBA, - HW_VAR_CURRENT_ANTENNA, - HW_VAR_ANTENNA_DIVERSITY_LINK, - HW_VAR_ANTENNA_DIVERSITY_SELECT, - HW_VAR_SWITCH_EPHY_WoWLAN, - HW_VAR_EFUSE_BYTES, - HW_VAR_FIFO_CLEARN_UP, -}HW_VARIABLES; - -typedef enum _HAL_DEF_VARIABLE{ - HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, - HAL_DEF_IS_SUPPORT_ANT_DIV, - HAL_DEF_CURRENT_ANTENNA, - HAL_DEF_DRVINFO_SZ, - HAL_DEF_MAX_RECVBUF_SZ, - HAL_DEF_RX_PACKET_OFFSET, - HAL_DEF_DBG_DUMP_RXPKT,//for dbg - HAL_DEF_DBG_DM_FUNC,//for dbg -}HAL_DEF_VARIABLE; - -typedef enum _HAL_INTF_PS_FUNC{ - HAL_USB_SELECT_SUSPEND, - HAL_MAX_ID, -}HAL_INTF_PS_FUNC; - -struct hal_ops { - u32 (*hal_init)(PADAPTER Adapter); - u32 (*hal_deinit)(PADAPTER Adapter); - - void (*free_hal_data)(PADAPTER Adapter); - - u32 (*inirp_init)(PADAPTER Adapter); - u32 (*inirp_deinit)(PADAPTER Adapter); - - s32 (*init_xmit_priv)(PADAPTER Adapter); - void (*free_xmit_priv)(PADAPTER Adapter); - - s32 (*init_recv_priv)(PADAPTER Adapter); - void (*free_recv_priv)(PADAPTER Adapter); - - void (*InitSwLeds)(PADAPTER Adapter); - void (*DeInitSwLeds)(PADAPTER Adapter); - - void (*dm_init)(PADAPTER Adapter); - void (*dm_deinit)(PADAPTER Adapter); - void (*read_chip_version)(PADAPTER Adapter); - - void (*init_default_value)(PADAPTER Adapter); - - void (*intf_chip_configure)(PADAPTER Adapter); - - void (*read_adapter_info)(PADAPTER Adapter); - - void (*enable_interrupt)(PADAPTER Adapter); - void (*disable_interrupt)(PADAPTER Adapter); - s32 (*interrupt_handler)(PADAPTER Adapter); - - void (*set_bwmode_handler)(PADAPTER Adapter, HT_CHANNEL_WIDTH Bandwidth, u8 Offset); - void (*set_channel_handler)(PADAPTER Adapter, u8 channel); - - void (*hal_dm_watchdog)(PADAPTER Adapter); - - void (*SetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val); - void (*GetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val); - - u8 (*GetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); - u8 (*SetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); - - void (*UpdateRAMaskHandler)(PADAPTER Adapter, u32 mac_id); - void (*SetBeaconRelatedRegistersHandler)(PADAPTER Adapter); - - void (*Add_RateATid)(PADAPTER Adapter, u32 bitmap, u8 arg); - -#ifdef CONFIG_ANTENNA_DIVERSITY - u8 (*SwAntDivBeforeLinkHandler)(PADAPTER Adapter); - void (*SwAntDivCompareHandler)(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -#endif - u8 (*interface_ps_func)(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8* val); - - s32 (*hal_xmit)(PADAPTER Adapter, struct xmit_frame *pxmitframe); - void (*mgnt_xmit)(PADAPTER Adapter, struct xmit_frame *pmgntframe); - - u32 (*read_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask); - void (*write_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask, u32 Data); - u32 (*read_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask); - void (*write_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data); - -#ifdef CONFIG_HOSTAPD_MLME - s32 (*hostap_mgnt_xmit_entry)(PADAPTER Adapter, _pkt *pkt); -#endif - void (*EfusePowerSwitch)(PADAPTER pAdapter, u8 bWrite, u8 PwrState); - void (*ReadEFuse)(PADAPTER Adapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, BOOLEAN bPseudoTest); - void (*EFUSEGetEfuseDefinition)(PADAPTER pAdapter, u8 efuseType, u8 type, PVOID *pOut, BOOLEAN bPseudoTest); - u16 (*EfuseGetCurrentSize)(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); - int (*Efuse_PgPacketRead)(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest); - int (*Efuse_PgPacketWrite)(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest); - u8 (*Efuse_WordEnableDataWrite)(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest); - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - void (*sreset_init_value)(_adapter *padapter); - void (*sreset_reset_value)(_adapter *padapter); - void (*silentreset)(_adapter *padapter); - void (*sreset_xmit_status_check)(_adapter *padapter); - void (*sreset_linked_status_check) (_adapter *padapter); - u8 (*sreset_get_wifi_status)(_adapter *padapter); -#endif -}; - -typedef enum _RT_EEPROM_TYPE{ - EEPROM_93C46, - EEPROM_93C56, - EEPROM_BOOT_EFUSE, -}RT_EEPROM_TYPE,*PRT_EEPROM_TYPE; - -#define USB_HIGH_SPEED_BULK_SIZE 512 -#define USB_FULL_SPEED_BULK_SIZE 64 - -#define RF_CHANGE_BY_INIT 0 -#define RF_CHANGE_BY_IPS BIT28 -#define RF_CHANGE_BY_PS BIT29 -#define RF_CHANGE_BY_HW BIT30 -#define RF_CHANGE_BY_SW BIT31 - -typedef enum _HARDWARE_TYPE{ - HARDWARE_TYPE_RTL8180, - HARDWARE_TYPE_RTL8185, - HARDWARE_TYPE_RTL8187, - HARDWARE_TYPE_RTL8188, - HARDWARE_TYPE_RTL8190P, - HARDWARE_TYPE_RTL8192E, - HARDWARE_TYPE_RTL819xU, - HARDWARE_TYPE_RTL8192SE, - HARDWARE_TYPE_RTL8192SU, - HARDWARE_TYPE_RTL8192CE, - HARDWARE_TYPE_RTL8192CU, - HARDWARE_TYPE_RTL8192DE, - HARDWARE_TYPE_RTL8192DU, - HARDWARE_TYPE_RTL8723E, - HARDWARE_TYPE_RTL8723U, -}HARDWARE_TYPE; - -#define IS_HARDWARE_TYPE_8192CE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CE) -#define IS_HARDWARE_TYPE_8192CU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CU) - -#define IS_HARDWARE_TYPE_8192DE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DE) -#define IS_HARDWARE_TYPE_8192DU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DU) - -#define IS_HARDWARE_TYPE_8723E(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723E) -#define IS_HARDWARE_TYPE_8723U(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723U) - -#define IS_HARDWARE_TYPE_8192C(_Adapter) \ -(IS_HARDWARE_TYPE_8192CE(_Adapter) || IS_HARDWARE_TYPE_8192CU(_Adapter)) - -#define IS_HARDWARE_TYPE_8192D(_Adapter) \ -(IS_HARDWARE_TYPE_8192DE(_Adapter) || IS_HARDWARE_TYPE_8192DU(_Adapter)) - -#define IS_HARDWARE_TYPE_8723(_Adapter) \ -(IS_HARDWARE_TYPE_8723E(_Adapter) || IS_HARDWARE_TYPE_8723U(_Adapter)) - - -typedef struct eeprom_priv EEPROM_EFUSE_PRIV, *PEEPROM_EFUSE_PRIV; -#define GET_EEPROM_EFUSE_PRIV(priv) (&priv->eeprompriv) - - -void rtw_dm_init(_adapter *padapter); -void rtw_sw_led_init(_adapter *padapter); -void rtw_sw_led_deinit(_adapter *padapter); - -uint rtw_hal_init(_adapter *padapter); -uint rtw_hal_deinit(_adapter *padapter); -void rtw_hal_stop(_adapter *padapter); - -void intf_chip_configure(_adapter *padapter); -void intf_read_chip_info(_adapter *padapter); -void intf_read_chip_version(_adapter *padapter); -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM -void rtw_sreset_init(_adapter *padapter); -#endif - -#endif //__HAL_INIT_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/ieee80211.h b/drivers/net/wireless/rtl8192c/include/ieee80211.h deleted file mode 100755 index 885bc276daea..000000000000 --- a/drivers/net/wireless/rtl8192c/include/ieee80211.h +++ /dev/null @@ -1,1432 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __IEEE80211_H -#define __IEEE80211_H - - -#ifndef CONFIG_RTL8711FW - - #include - #include - #include - #include "wifi.h" - - #if defined PLATFORM_OS_XP - #include - #endif - #if defined PLATFORM_LINUX - #include - #endif -#else - - #include - -#endif - -#define MGMT_QUEUE_NUM 5 - -#define ETH_ALEN 6 - -#ifdef CONFIG_AP_MODE - -#define RTL_IOCTL_HOSTAPD (SIOCIWFIRSTPRIV + 28) - -/* RTL871X_IOCTL_HOSTAPD ioctl() cmd: */ -enum { - RTL871X_HOSTAPD_FLUSH = 1, - RTL871X_HOSTAPD_ADD_STA = 2, - RTL871X_HOSTAPD_REMOVE_STA = 3, - RTL871X_HOSTAPD_GET_INFO_STA = 4, - /* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */ - RTL871X_HOSTAPD_GET_WPAIE_STA = 5, - RTL871X_SET_ENCRYPTION = 6, - RTL871X_GET_ENCRYPTION = 7, - RTL871X_HOSTAPD_SET_FLAGS_STA = 8, - RTL871X_HOSTAPD_GET_RID = 9, - RTL871X_HOSTAPD_SET_RID = 10, - RTL871X_HOSTAPD_SET_ASSOC_AP_ADDR = 11, - RTL871X_HOSTAPD_SET_GENERIC_ELEMENT = 12, - RTL871X_HOSTAPD_MLME = 13, - RTL871X_HOSTAPD_SCAN_REQ = 14, - RTL871X_HOSTAPD_STA_CLEAR_STATS = 15, - RTL871X_HOSTAPD_SET_BEACON=16, - RTL871X_HOSTAPD_SET_WPS_BEACON = 17, - RTL871X_HOSTAPD_SET_WPS_PROBE_RESP = 18, - RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP = 19, -}; - -/* STA flags */ -#define WLAN_STA_AUTH BIT(0) -#define WLAN_STA_ASSOC BIT(1) -#define WLAN_STA_PS BIT(2) -#define WLAN_STA_TIM BIT(3) -#define WLAN_STA_PERM BIT(4) -#define WLAN_STA_AUTHORIZED BIT(5) -#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */ -#define WLAN_STA_SHORT_PREAMBLE BIT(7) -#define WLAN_STA_PREAUTH BIT(8) -#define WLAN_STA_WME BIT(9) -#define WLAN_STA_MFP BIT(10) -#define WLAN_STA_HT BIT(11) -#define WLAN_STA_WPS BIT(12) -#define WLAN_STA_MAYBE_WPS BIT(13) -#define WLAN_STA_NONERP BIT(31) - -#endif - -#define IEEE_CMD_SET_WPA_PARAM 1 -#define IEEE_CMD_SET_WPA_IE 2 -#define IEEE_CMD_SET_ENCRYPTION 3 -#define IEEE_CMD_MLME 4 - -#define IEEE_PARAM_WPA_ENABLED 1 -#define IEEE_PARAM_TKIP_COUNTERMEASURES 2 -#define IEEE_PARAM_DROP_UNENCRYPTED 3 -#define IEEE_PARAM_PRIVACY_INVOKED 4 -#define IEEE_PARAM_AUTH_ALGS 5 -#define IEEE_PARAM_IEEE_802_1X 6 -#define IEEE_PARAM_WPAX_SELECT 7 - -#define AUTH_ALG_OPEN_SYSTEM 0x1 -#define AUTH_ALG_SHARED_KEY 0x2 -#define AUTH_ALG_LEAP 0x00000004 - -#define IEEE_MLME_STA_DEAUTH 1 -#define IEEE_MLME_STA_DISASSOC 2 - -#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2 -#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3 -#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4 -#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5 -#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6 -#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7 - - -#define IEEE_CRYPT_ALG_NAME_LEN 16 - -#define WPA_CIPHER_NONE BIT(0) -#define WPA_CIPHER_WEP40 BIT(1) -#define WPA_CIPHER_WEP104 BIT(2) -#define WPA_CIPHER_TKIP BIT(3) -#define WPA_CIPHER_CCMP BIT(4) - - - -#define WPA_SELECTOR_LEN 4 -static u8 WPA_OUI_TYPE[] = { 0x00, 0x50, 0xf2, 1 }; -static u16 WPA_VERSION = 1; -static u8 WPA_AUTH_KEY_MGMT_NONE[] = { 0x00, 0x50, 0xf2, 0 }; -static u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x50, 0xf2, 1 }; -static u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x50, 0xf2, 2 }; -static u8 WPA_CIPHER_SUITE_NONE[] = { 0x00, 0x50, 0xf2, 0 }; -static u8 WPA_CIPHER_SUITE_WEP40[] = { 0x00, 0x50, 0xf2, 1 }; -static u8 WPA_CIPHER_SUITE_TKIP[] = { 0x00, 0x50, 0xf2, 2 }; -//static u8 WPA_CIPHER_SUITE_WRAP[] = { 0x00, 0x50, 0xf2, 3 }; -static u8 WPA_CIPHER_SUITE_CCMP[] = { 0x00, 0x50, 0xf2, 4 }; -static u8 WPA_CIPHER_SUITE_WEP104[] = { 0x00, 0x50, 0xf2, 5 }; - - -#define RSN_HEADER_LEN 4 -#define RSN_SELECTOR_LEN 4 -static u16 RSN_VERSION = 1; -static u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x0f, 0xac, 1 }; -static u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x0f, 0xac, 2 }; -static u8 RSN_CIPHER_SUITE_NONE[] = { 0x00, 0x0f, 0xac, 0 }; -static u8 RSN_CIPHER_SUITE_WEP40[] = { 0x00, 0x0f, 0xac, 1 }; -static u8 RSN_CIPHER_SUITE_TKIP[] = { 0x00, 0x0f, 0xac, 2 }; -//static u8 RSN_CIPHER_SUITE_WRAP[] = { 0x00, 0x0f, 0xac, 3 }; -static u8 RSN_CIPHER_SUITE_CCMP[] = { 0x00, 0x0f, 0xac, 4 }; -static u8 RSN_CIPHER_SUITE_WEP104[] = { 0x00, 0x0f, 0xac, 5 }; - - -enum NETWORK_TYPE -{ - WIRELESS_INVALID = 0, - //Sub-Element - WIRELESS_11B = BIT(0), // tx: cck only , rx: cck only, hw: cck - WIRELESS_11G = BIT(1), // tx: ofdm only, rx: ofdm & cck, hw: cck & ofdm - WIRELESS_11A = BIT(2), // tx: ofdm only, rx: ofdm only, hw: ofdm only - WIRELESS_11_24N = BIT(3), // tx: MCS only, rx: MCS & cck, hw: MCS & cck - WIRELESS_11_5N = BIT(4), // tx: MCS only, rx: MCS & ofdm, hw: ofdm only - - //Combination - WIRELESS_11BG = (WIRELESS_11B|WIRELESS_11G), // tx: cck & ofdm, rx: cck & ofdm & MCS, hw: cck & ofdm - WIRELESS_11G_24N = (WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & MCS, rx: ofdm & cck & MCS, hw: cck & ofdm - WIRELESS_11A_5N = (WIRELESS_11A|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only - WIRELESS_11BG_24N = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck - WIRELESS_11ABGN = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), -}; - -#define SUPPORTED_24G_NETTYPE_MSK (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N) -#define SUPPORTED_5G_NETTYPE_MSK (WIRELESS_11A | WIRELESS_11_5N) - -#define IsSupported24G(NetType) ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? _TRUE : _FALSE) -#define IsSupported5G(NetType) ((NetType) & SUPPORTED_5G_NETTYPE_MSK ? _TRUE : _FALSE) - -#define IsEnableHWCCK(NetType) IsSupported24G(NetType) -#define IsEnableHWOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11_24N|SUPPORTED_5G_NETTYPE_MSK) ? _TRUE : _FALSE) - -#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType) -#define IsSupportedRxOFDM(NetType) IsEnableHWOFDM(NetType) -#define IsSupportedRxMCS(NetType) IsEnableHWOFDM(NetType) - -#define IsSupportedTxCCK(NetType) ((NetType) & (WIRELESS_11B) ? _TRUE : _FALSE) -#define IsSupportedTxOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11A) ? _TRUE : _FALSE) -#define IsSupportedTxMCS(NetType) ((NetType) & (WIRELESS_11_24N|WIRELESS_11_5N) ? _TRUE : _FALSE) - - -typedef struct ieee_param { - u32 cmd; - u8 sta_addr[ETH_ALEN]; - union { - struct { - u8 name; - u32 value; - } wpa_param; - struct { - u32 len; - u8 reserved[32]; - u8 data[0]; - } wpa_ie; - struct{ - int command; - int reason_code; - } mlme; - struct { - u8 alg[IEEE_CRYPT_ALG_NAME_LEN]; - u8 set_tx; - u32 err; - u8 idx; - u8 seq[8]; /* sequence counter (set: RX, get: TX) */ - u16 key_len; - u8 key[0]; - } crypt; -#ifdef CONFIG_AP_MODE - struct { - u16 aid; - u16 capability; - int flags; - u8 tx_supp_rates[16]; - struct ieee80211_ht_cap ht_cap; - } add_sta; - struct { - u8 reserved[2];//for set max_num_sta - u8 buf[0]; - } bcn_ie; -#endif - - } u; -}ieee_param; - - -#if WIRELESS_EXT < 17 -#define IW_QUAL_QUAL_INVALID 0x10 -#define IW_QUAL_LEVEL_INVALID 0x20 -#define IW_QUAL_NOISE_INVALID 0x40 -#define IW_QUAL_QUAL_UPDATED 0x1 -#define IW_QUAL_LEVEL_UPDATED 0x2 -#define IW_QUAL_NOISE_UPDATED 0x4 -#endif - -#define IEEE80211_DATA_LEN 2304 -/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section - 6.2.1.1.2. - - The figure in section 7.1.2 suggests a body size of up to 2312 - bytes is allowed, which is a bit confusing, I suspect this - represents the 2304 bytes of real data, plus a possible 8 bytes of - WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ - - -#define IEEE80211_HLEN 30 -#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) - - -/* this is stolen from ipw2200 driver */ -#define IEEE_IBSS_MAC_HASH_SIZE 31 - -struct ieee_ibss_seq { - u8 mac[ETH_ALEN]; - u16 seq_num; - u16 frag_num; - unsigned long packet_time; - _list list; -}; - -#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) - -struct ieee80211_hdr { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u8 addr4[ETH_ALEN]; -} __attribute__ ((packed)); - -struct ieee80211_hdr_3addr { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; -} __attribute__ ((packed)); - - -struct ieee80211_hdr_qos { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u8 addr4[ETH_ALEN]; - u16 qc; -} __attribute__ ((packed)); - -struct ieee80211_hdr_3addr_qos { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u16 qc; -} __attribute__ ((packed)); - -struct eapol { - u8 snap[6]; - u16 ethertype; - u8 version; - u8 type; - u16 length; -} __attribute__ ((packed)); - -#endif - - - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) -struct ieee80211_hdr { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u8 addr4[ETH_ALEN]; -}; - -struct ieee80211_hdr_3addr { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; -}; - - -struct ieee80211_hdr_qos { - struct ieee80211_hdr wlan_hdr; - u16 qc; -}; - -struct ieee80211_hdr_3addr_qos { - struct ieee80211_hdr_3addr wlan_hdr; - u16 qc; -}; - -struct eapol { - u8 snap[6]; - u16 ethertype; - u8 version; - u8 type; - u16 length; -}; -#pragma pack() - -#endif - - - -enum eap_type { - EAP_PACKET = 0, - EAPOL_START, - EAPOL_LOGOFF, - EAPOL_KEY, - EAPOL_ENCAP_ASF_ALERT -}; - -#define IEEE80211_3ADDR_LEN 24 -#define IEEE80211_4ADDR_LEN 30 -#define IEEE80211_FCS_LEN 4 - -#define MIN_FRAG_THRESHOLD 256U -#define MAX_FRAG_THRESHOLD 2346U - -/* Frame control field constants */ -#define IEEE80211_FCTL_VERS 0x0002 -#define IEEE80211_FCTL_FTYPE 0x000c -#define IEEE80211_FCTL_STYPE 0x00f0 -#define IEEE80211_FCTL_TODS 0x0100 -#define IEEE80211_FCTL_FROMDS 0x0200 -#define IEEE80211_FCTL_MOREFRAGS 0x0400 -#define IEEE80211_FCTL_RETRY 0x0800 -#define IEEE80211_FCTL_PM 0x1000 -#define IEEE80211_FCTL_MOREDATA 0x2000 -#define IEEE80211_FCTL_WEP 0x4000 -#define IEEE80211_FCTL_ORDER 0x8000 - -#define IEEE80211_FTYPE_MGMT 0x0000 -#define IEEE80211_FTYPE_CTL 0x0004 -#define IEEE80211_FTYPE_DATA 0x0008 - -/* management */ -#define IEEE80211_STYPE_ASSOC_REQ 0x0000 -#define IEEE80211_STYPE_ASSOC_RESP 0x0010 -#define IEEE80211_STYPE_REASSOC_REQ 0x0020 -#define IEEE80211_STYPE_REASSOC_RESP 0x0030 -#define IEEE80211_STYPE_PROBE_REQ 0x0040 -#define IEEE80211_STYPE_PROBE_RESP 0x0050 -#define IEEE80211_STYPE_BEACON 0x0080 -#define IEEE80211_STYPE_ATIM 0x0090 -#define IEEE80211_STYPE_DISASSOC 0x00A0 -#define IEEE80211_STYPE_AUTH 0x00B0 -#define IEEE80211_STYPE_DEAUTH 0x00C0 - -/* control */ -#define IEEE80211_STYPE_PSPOLL 0x00A0 -#define IEEE80211_STYPE_RTS 0x00B0 -#define IEEE80211_STYPE_CTS 0x00C0 -#define IEEE80211_STYPE_ACK 0x00D0 -#define IEEE80211_STYPE_CFEND 0x00E0 -#define IEEE80211_STYPE_CFENDACK 0x00F0 - -/* data */ -#define IEEE80211_STYPE_DATA 0x0000 -#define IEEE80211_STYPE_DATA_CFACK 0x0010 -#define IEEE80211_STYPE_DATA_CFPOLL 0x0020 -#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030 -#define IEEE80211_STYPE_NULLFUNC 0x0040 -#define IEEE80211_STYPE_CFACK 0x0050 -#define IEEE80211_STYPE_CFPOLL 0x0060 -#define IEEE80211_STYPE_CFACKPOLL 0x0070 -#define IEEE80211_QOS_DATAGRP 0x0080 -#define IEEE80211_QoS_DATAGRP IEEE80211_QOS_DATAGRP - -#define IEEE80211_SCTL_FRAG 0x000F -#define IEEE80211_SCTL_SEQ 0xFFF0 - -/* QoS,QOS */ -#define NORMAL_ACK 0 -#define NO_ACK 1 -#define NON_EXPLICIT_ACK 2 -#define BLOCK_ACK 3 - -#ifndef ETH_P_PAE -#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ -#endif /* ETH_P_PAE */ - -#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ - -#define ETH_P_ECONET 0x0018 - -#ifndef ETH_P_80211_RAW -#define ETH_P_80211_RAW (ETH_P_ECONET + 1) -#endif - -/* IEEE 802.11 defines */ - -#define P80211_OUI_LEN 3 - -#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) - -struct ieee80211_snap_hdr { - - u8 dsap; /* always 0xAA */ - u8 ssap; /* always 0xAA */ - u8 ctrl; /* always 0x03 */ - u8 oui[P80211_OUI_LEN]; /* organizational universal id */ - -} __attribute__ ((packed)); - -#endif - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) -struct ieee80211_snap_hdr { - - u8 dsap; /* always 0xAA */ - u8 ssap; /* always 0xAA */ - u8 ctrl; /* always 0x03 */ - u8 oui[P80211_OUI_LEN]; /* organizational universal id */ - -}; -#pragma pack() - -#endif - - -#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) - -#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) -#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE) - -#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f) - -#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG) -#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE80211_SCTL_SEQ) - -/* Authentication algorithms */ -#define WLAN_AUTH_OPEN 0 -#define WLAN_AUTH_SHARED_KEY 1 - -#define WLAN_AUTH_CHALLENGE_LEN 128 - -#define WLAN_CAPABILITY_BSS (1<<0) -#define WLAN_CAPABILITY_IBSS (1<<1) -#define WLAN_CAPABILITY_CF_POLLABLE (1<<2) -#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) -#define WLAN_CAPABILITY_PRIVACY (1<<4) -#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) -#define WLAN_CAPABILITY_PBCC (1<<6) -#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7) -#define WLAN_CAPABILITY_SHORT_SLOT (1<<10) - -/* Status codes */ -#define WLAN_STATUS_SUCCESS 0 -#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 -#define WLAN_STATUS_CAPS_UNSUPPORTED 10 -#define WLAN_STATUS_REASSOC_NO_ASSOC 11 -#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 -#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 -#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 -#define WLAN_STATUS_CHALLENGE_FAIL 15 -#define WLAN_STATUS_AUTH_TIMEOUT 16 -#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 -#define WLAN_STATUS_ASSOC_DENIED_RATES 18 -/* 802.11b */ -#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 -#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 -#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 - -/* Reason codes */ -#define WLAN_REASON_UNSPECIFIED 1 -#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 -#define WLAN_REASON_DEAUTH_LEAVING 3 -#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 -#define WLAN_REASON_DISASSOC_AP_BUSY 5 -#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 -#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 -#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 -#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 - - -/* Information Element IDs */ -#define WLAN_EID_SSID 0 -#define WLAN_EID_SUPP_RATES 1 -#define WLAN_EID_FH_PARAMS 2 -#define WLAN_EID_DS_PARAMS 3 -#define WLAN_EID_CF_PARAMS 4 -#define WLAN_EID_TIM 5 -#define WLAN_EID_IBSS_PARAMS 6 -#define WLAN_EID_CHALLENGE 16 -/* EIDs defined by IEEE 802.11h - START */ -#define WLAN_EID_PWR_CONSTRAINT 32 -#define WLAN_EID_PWR_CAPABILITY 33 -#define WLAN_EID_TPC_REQUEST 34 -#define WLAN_EID_TPC_REPORT 35 -#define WLAN_EID_SUPPORTED_CHANNELS 36 -#define WLAN_EID_CHANNEL_SWITCH 37 -#define WLAN_EID_MEASURE_REQUEST 38 -#define WLAN_EID_MEASURE_REPORT 39 -#define WLAN_EID_QUITE 40 -#define WLAN_EID_IBSS_DFS 41 -/* EIDs defined by IEEE 802.11h - END */ -#define WLAN_EID_ERP_INFO 42 -#define WLAN_EID_HT_CAP 45 -#define WLAN_EID_RSN 48 -#define WLAN_EID_EXT_SUPP_RATES 50 -#define WLAN_EID_MOBILITY_DOMAIN 54 -#define WLAN_EID_FAST_BSS_TRANSITION 55 -#define WLAN_EID_TIMEOUT_INTERVAL 56 -#define WLAN_EID_RIC_DATA 57 -#define WLAN_EID_HT_OPERATION 61 -#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62 -#define WLAN_EID_20_40_BSS_COEXISTENCE 72 -#define WLAN_EID_20_40_BSS_INTOLERANT 73 -#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74 -#define WLAN_EID_MMIE 76 -#define WLAN_EID_VENDOR_SPECIFIC 221 -#define WLAN_EID_GENERIC (WLAN_EID_VENDOR_SPECIFIC) - -#define IEEE80211_MGMT_HDR_LEN 24 -#define IEEE80211_DATA_HDR3_LEN 24 -#define IEEE80211_DATA_HDR4_LEN 30 - - -#define IEEE80211_STATMASK_SIGNAL (1<<0) -#define IEEE80211_STATMASK_RSSI (1<<1) -#define IEEE80211_STATMASK_NOISE (1<<2) -#define IEEE80211_STATMASK_RATE (1<<3) -#define IEEE80211_STATMASK_WEMASK 0x7 - - -#define IEEE80211_CCK_MODULATION (1<<0) -#define IEEE80211_OFDM_MODULATION (1<<1) - -#define IEEE80211_24GHZ_BAND (1<<0) -#define IEEE80211_52GHZ_BAND (1<<1) - -#define IEEE80211_CCK_RATE_LEN 4 -#define IEEE80211_NUM_OFDM_RATESLEN 8 - - -#define IEEE80211_CCK_RATE_1MB 0x02 -#define IEEE80211_CCK_RATE_2MB 0x04 -#define IEEE80211_CCK_RATE_5MB 0x0B -#define IEEE80211_CCK_RATE_11MB 0x16 -#define IEEE80211_OFDM_RATE_LEN 8 -#define IEEE80211_OFDM_RATE_6MB 0x0C -#define IEEE80211_OFDM_RATE_9MB 0x12 -#define IEEE80211_OFDM_RATE_12MB 0x18 -#define IEEE80211_OFDM_RATE_18MB 0x24 -#define IEEE80211_OFDM_RATE_24MB 0x30 -#define IEEE80211_OFDM_RATE_36MB 0x48 -#define IEEE80211_OFDM_RATE_48MB 0x60 -#define IEEE80211_OFDM_RATE_54MB 0x6C -#define IEEE80211_BASIC_RATE_MASK 0x80 - -#define IEEE80211_CCK_RATE_1MB_MASK (1<<0) -#define IEEE80211_CCK_RATE_2MB_MASK (1<<1) -#define IEEE80211_CCK_RATE_5MB_MASK (1<<2) -#define IEEE80211_CCK_RATE_11MB_MASK (1<<3) -#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) -#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) -#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) -#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) -#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) -#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) -#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) -#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) - -#define IEEE80211_CCK_RATES_MASK 0x0000000F -#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ - IEEE80211_CCK_RATE_2MB_MASK) -#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ - IEEE80211_CCK_RATE_5MB_MASK | \ - IEEE80211_CCK_RATE_11MB_MASK) - -#define IEEE80211_OFDM_RATES_MASK 0x00000FF0 -#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ - IEEE80211_OFDM_RATE_12MB_MASK | \ - IEEE80211_OFDM_RATE_24MB_MASK) -#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ - IEEE80211_OFDM_RATE_9MB_MASK | \ - IEEE80211_OFDM_RATE_18MB_MASK | \ - IEEE80211_OFDM_RATE_36MB_MASK | \ - IEEE80211_OFDM_RATE_48MB_MASK | \ - IEEE80211_OFDM_RATE_54MB_MASK) -#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ - IEEE80211_CCK_DEFAULT_RATES_MASK) - -#define IEEE80211_NUM_OFDM_RATES 8 -#define IEEE80211_NUM_CCK_RATES 4 -#define IEEE80211_OFDM_SHIFT_MASK_A 4 - - - - -/* NOTE: This data is for statistical purposes; not all hardware provides this - * information for frames received. Not setting these will not cause - * any adverse affects. */ -struct ieee80211_rx_stats { - //u32 mac_time[2]; - s8 rssi; - u8 signal; - u8 noise; - u8 received_channel; - u16 rate; /* in 100 kbps */ - //u8 control; - u8 mask; - u8 freq; - u16 len; -}; - -/* IEEE 802.11 requires that STA supports concurrent reception of at least - * three fragmented frames. This define can be increased to support more - * concurrent frames, but it should be noted that each entry can consume about - * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ -#define IEEE80211_FRAG_CACHE_LEN 4 - -struct ieee80211_frag_entry { - u32 first_frag_time; - uint seq; - uint last_frag; - uint qos; //jackson - uint tid; //jackson - struct sk_buff *skb; - u8 src_addr[ETH_ALEN]; - u8 dst_addr[ETH_ALEN]; -}; - -struct ieee80211_stats { - uint tx_unicast_frames; - uint tx_multicast_frames; - uint tx_fragments; - uint tx_unicast_octets; - uint tx_multicast_octets; - uint tx_deferred_transmissions; - uint tx_single_retry_frames; - uint tx_multiple_retry_frames; - uint tx_retry_limit_exceeded; - uint tx_discards; - uint rx_unicast_frames; - uint rx_multicast_frames; - uint rx_fragments; - uint rx_unicast_octets; - uint rx_multicast_octets; - uint rx_fcs_errors; - uint rx_discards_no_buffer; - uint tx_discards_wrong_sa; - uint rx_discards_undecryptable; - uint rx_message_in_msg_fragments; - uint rx_message_in_bad_msg_fragments; -}; - -struct ieee80211_softmac_stats{ - uint rx_ass_ok; - uint rx_ass_err; - uint rx_probe_rq; - uint tx_probe_rs; - uint tx_beacons; - uint rx_auth_rq; - uint rx_auth_rs_ok; - uint rx_auth_rs_err; - uint tx_auth_rq; - uint no_auth_rs; - uint no_ass_rs; - uint tx_ass_rq; - uint rx_ass_rq; - uint tx_probe_rq; - uint reassoc; - uint swtxstop; - uint swtxawake; -}; - -#define SEC_KEY_1 (1<<0) -#define SEC_KEY_2 (1<<1) -#define SEC_KEY_3 (1<<2) -#define SEC_KEY_4 (1<<3) -#define SEC_ACTIVE_KEY (1<<4) -#define SEC_AUTH_MODE (1<<5) -#define SEC_UNICAST_GROUP (1<<6) -#define SEC_LEVEL (1<<7) -#define SEC_ENABLED (1<<8) - -#define SEC_LEVEL_0 0 /* None */ -#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ -#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ -#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ -#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ - -#define WEP_KEYS 4 -#define WEP_KEY_LEN 13 - - - -#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) - -struct ieee80211_security { - u16 active_key:2, - enabled:1, - auth_mode:2, - auth_algo:4, - unicast_uses_group:1; - u8 key_sizes[WEP_KEYS]; - u8 keys[WEP_KEYS][WEP_KEY_LEN]; - u8 level; - u16 flags; -} __attribute__ ((packed)); - -#endif - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) -struct ieee80211_security { - u16 active_key:2, - enabled:1, - auth_mode:2, - auth_algo:4, - unicast_uses_group:1; - u8 key_sizes[WEP_KEYS]; - u8 keys[WEP_KEYS][WEP_KEY_LEN]; - u8 level; - u16 flags; -} ; -#pragma pack() - -#endif - -/* - - 802.11 data frame from AP - - ,-------------------------------------------------------------------. -Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | - |------|------|---------|---------|---------|------|---------|------| -Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | - | | tion | (BSSID) | | | ence | data | | - `-------------------------------------------------------------------' - -Total: 28-2340 bytes - -*/ - -struct ieee80211_header_data { - u16 frame_ctl; - u16 duration_id; - u8 addr1[6]; - u8 addr2[6]; - u8 addr3[6]; - u16 seq_ctrl; -}; - -#define BEACON_PROBE_SSID_ID_POSITION 12 - -/* Management Frame Information Element Types */ -#define MFIE_TYPE_SSID 0 -#define MFIE_TYPE_RATES 1 -#define MFIE_TYPE_FH_SET 2 -#define MFIE_TYPE_DS_SET 3 -#define MFIE_TYPE_CF_SET 4 -#define MFIE_TYPE_TIM 5 -#define MFIE_TYPE_IBSS_SET 6 -#define MFIE_TYPE_CHALLENGE 16 -#define MFIE_TYPE_ERP 42 -#define MFIE_TYPE_RSN 48 -#define MFIE_TYPE_RATES_EX 50 -#define MFIE_TYPE_GENERIC 221 - -#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) - -struct ieee80211_info_element_hdr { - u8 id; - u8 len; -} __attribute__ ((packed)); - -struct ieee80211_info_element { - u8 id; - u8 len; - u8 data[0]; -} __attribute__ ((packed)); -#endif - -#ifdef CONFIG_TDLS -/* TDLS */ -#define TDLS_MIC_LEN 16 -#define WPA_NONCE_LEN 32 -#define TDLS_TIMEOUT_LEN 4 - -struct wpa_tdls_ftie { - u8 ie_type; /* FTIE */ - u8 ie_len; - u8 mic_ctrl[2]; - u8 mic[TDLS_MIC_LEN]; - u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ - u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ - /* followed by optional elements */ -} ; - -struct wpa_tdls_timeoutie { - u8 ie_type; /* Timeout IE */ - u8 ie_len; - u8 interval_type; - u8 value[TDLS_TIMEOUT_LEN]; -} ; - -struct wpa_tdls_lnkid { - u8 ie_type; /* Link Identifier IE */ - u8 ie_len; - u8 bssid[ETH_ALEN]; - u8 init_sta[ETH_ALEN]; - u8 resp_sta[ETH_ALEN]; -} ; -#endif - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) -struct ieee80211_info_element_hdr { - u8 id; - u8 len; -} ; - -struct ieee80211_info_element { - u8 id; - u8 len; - u8 data[0]; -} ; -#pragma pack() - -#endif - - -/* - * These are the data types that can make up management packets - * - u16 auth_algorithm; - u16 auth_sequence; - u16 beacon_interval; - u16 capability; - u8 current_ap[ETH_ALEN]; - u16 listen_interval; - struct { - u16 association_id:14, reserved:2; - } __attribute__ ((packed)); - u32 time_stamp[2]; - u16 reason; - u16 status; -*/ - -#define IEEE80211_DEFAULT_TX_ESSID "Penguin" -#define IEEE80211_DEFAULT_BASIC_RATE 10 - - -#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) - - -struct ieee80211_authentication { - struct ieee80211_header_data header; - u16 algorithm; - u16 transaction; - u16 status; - //struct ieee80211_info_element_hdr info_element; -} __attribute__ ((packed)); - - -struct ieee80211_probe_response { - struct ieee80211_header_data header; - u32 time_stamp[2]; - u16 beacon_interval; - u16 capability; - struct ieee80211_info_element info_element; -} __attribute__ ((packed)); - -struct ieee80211_probe_request { - struct ieee80211_header_data header; - /*struct ieee80211_info_element info_element;*/ -} __attribute__ ((packed)); - -struct ieee80211_assoc_request_frame { - struct ieee80211_hdr_3addr header; - u16 capability; - u16 listen_interval; - //u8 current_ap[ETH_ALEN]; - struct ieee80211_info_element_hdr info_element; -} __attribute__ ((packed)); - -struct ieee80211_assoc_response_frame { - struct ieee80211_hdr_3addr header; - u16 capability; - u16 status; - u16 aid; -// struct ieee80211_info_element info_element; /* supported rates */ -} __attribute__ ((packed)); -#endif - - - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct ieee80211_authentication { - struct ieee80211_header_data header; - u16 algorithm; - u16 transaction; - u16 status; - //struct ieee80211_info_element_hdr info_element; -} ; - - -struct ieee80211_probe_response { - struct ieee80211_header_data header; - u32 time_stamp[2]; - u16 beacon_interval; - u16 capability; - struct ieee80211_info_element info_element; -} ; - -struct ieee80211_probe_request { - struct ieee80211_header_data header; - /*struct ieee80211_info_element info_element;*/ -} ; - -struct ieee80211_assoc_request_frame { - struct ieee80211_hdr_3addr header; - u16 capability; - u16 listen_interval; - //u8 current_ap[ETH_ALEN]; - struct ieee80211_info_element_hdr info_element; -} ; - -struct ieee80211_assoc_response_frame { - struct ieee80211_hdr_3addr header; - u16 capability; - u16 status; - u16 aid; -// struct ieee80211_info_element info_element; /* supported rates */ -}; - -#pragma pack() - -#endif - - - - -struct ieee80211_txb { - u8 nr_frags; - u8 encrypted; - u16 reserved; - u16 frag_size; - u16 payload_size; - struct sk_buff *fragments[0]; -}; - - -/* SWEEP TABLE ENTRIES NUMBER*/ -#define MAX_SWEEP_TAB_ENTRIES 42 -#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 -/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs - * only use 8, and then use extended rates for the remaining supported - * rates. Other APs, however, stick all of their supported rates on the - * main rates information element... */ -#define MAX_RATES_LENGTH ((u8)12) -#define MAX_RATES_EX_LENGTH ((u8)16) -#define MAX_NETWORK_COUNT 128 -#define MAX_CHANNEL_NUMBER 161 -#define IEEE80211_SOFTMAC_SCAN_TIME 400 -//(HZ / 2) -#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) - -#define CRC_LENGTH 4U - -#define MAX_WPA_IE_LEN (128) -#define MAX_WPS_IE_LEN (512) -#define MAX_P2P_IE_LEN (256) - -#define NETWORK_EMPTY_ESSID (1<<0) -#define NETWORK_HAS_OFDM (1<<1) -#define NETWORK_HAS_CCK (1<<2) - -#define IEEE80211_DTIM_MBCAST 4 -#define IEEE80211_DTIM_UCAST 2 -#define IEEE80211_DTIM_VALID 1 -#define IEEE80211_DTIM_INVALID 0 - -#define IEEE80211_PS_DISABLED 0 -#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST -#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST -#define IW_ESSID_MAX_SIZE 32 -#if 0 -struct ieee80211_network { - /* These entries are used to identify a unique network */ - u8 bssid[ETH_ALEN]; - u8 channel; - /* Ensure null-terminated for any debug msgs */ - u8 ssid[IW_ESSID_MAX_SIZE + 1]; - u8 ssid_len; - u8 rssi; //relative signal strength - u8 sq; //signal quality - - /* These are network statistics */ - //struct ieee80211_rx_stats stats; - u16 capability; - u16 aid; - u8 rates[MAX_RATES_LENGTH]; - u8 rates_len; - u8 rates_ex[MAX_RATES_EX_LENGTH]; - u8 rates_ex_len; - - u8 edca_parmsets[18]; - - u8 mode; - u8 flags; - u8 time_stamp[8]; - u16 beacon_interval; - u16 listen_interval; - u16 atim_window; - u8 wpa_ie[MAX_WPA_IE_LEN]; - size_t wpa_ie_len; - u8 rsn_ie[MAX_WPA_IE_LEN]; - size_t rsn_ie_len; - u8 country[6]; - u8 dtim_period; - u8 dtim_data; - u8 power_constraint; - u8 qosinfo; - u8 qbssload[5]; - u8 network_type; - int join_res; - unsigned long last_scanned; -}; -#endif -/* -join_res: --1: authentication fail --2: association fail -> 0: TID -*/ - -enum ieee80211_state { - - /* the card is not linked at all */ - IEEE80211_NOLINK = 0, - - /* IEEE80211_ASSOCIATING* are for BSS client mode - * the driver shall not perform RX filtering unless - * the state is LINKED. - * The driver shall just check for the state LINKED and - * defaults to NOLINK for ALL the other states (including - * LINKED_SCANNING) - */ - - /* the association procedure will start (wq scheduling)*/ - IEEE80211_ASSOCIATING, - IEEE80211_ASSOCIATING_RETRY, - - /* the association procedure is sending AUTH request*/ - IEEE80211_ASSOCIATING_AUTHENTICATING, - - /* the association procedure has successfully authentcated - * and is sending association request - */ - IEEE80211_ASSOCIATING_AUTHENTICATED, - - /* the link is ok. the card associated to a BSS or linked - * to a ibss cell or acting as an AP and creating the bss - */ - IEEE80211_LINKED, - - /* same as LINKED, but the driver shall apply RX filter - * rules as we are in NO_LINK mode. As the card is still - * logically linked, but it is doing a syncro site survey - * then it will be back to LINKED state. - */ - IEEE80211_LINKED_SCANNING, - -}; - -#define DEFAULT_MAX_SCAN_AGE (15 * HZ) -#define DEFAULT_FTS 2346 -#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" -#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] - -extern __inline int is_multicast_mac_addr(const u8 *addr) -{ - return ((addr[0] != 0xff) && (0x01 & addr[0])); -} - -extern __inline int is_broadcast_mac_addr(const u8 *addr) -{ - return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ - (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); -} - -#define CFG_IEEE80211_RESERVE_FCS (1<<0) -#define CFG_IEEE80211_COMPUTE_FCS (1<<1) - -typedef struct tx_pending_t{ - int frag; - struct ieee80211_txb *txb; -}tx_pending_t; - - - -#define MAXTID 16 - -#define IEEE_A (1<<0) -#define IEEE_B (1<<1) -#define IEEE_G (1<<2) -#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) - -extern __inline int ieee80211_is_empty_essid(const char *essid, int essid_len) -{ - /* Single white space is for Linksys APs */ - if (essid_len == 1 && essid[0] == ' ') - return 1; - - /* Otherwise, if the entire essid is 0, we assume it is hidden */ - while (essid_len) { - essid_len--; - if (essid[essid_len] != '\0') - return 0; - } - - return 1; -} - -extern __inline int ieee80211_get_hdrlen(u16 fc) -{ - int hdrlen = 24; - - switch (WLAN_FC_GET_TYPE(fc)) { - case IEEE80211_FTYPE_DATA: - if (fc & IEEE80211_QOS_DATAGRP) - hdrlen += 2; - if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) - hdrlen += 6; /* Addr4 */ - break; - case IEEE80211_FTYPE_CTL: - switch (WLAN_FC_GET_STYPE(fc)) { - case IEEE80211_STYPE_CTS: - case IEEE80211_STYPE_ACK: - hdrlen = 10; - break; - default: - hdrlen = 16; - break; - } - break; - } - - return hdrlen; -} - -#if 0 -/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */ -#define WLAN_ACTION_SPECTRUM_MGMT 0 -#define WLAN_ACTION_QOS 1 -#define WLAN_ACTION_DLS 2 -#define WLAN_ACTION_BLOCK_ACK 3 -#define WLAN_ACTION_RADIO_MEASUREMENT 5 -#define WLAN_ACTION_FT 6 -#define WLAN_ACTION_SA_QUERY 8 -#define WLAN_ACTION_WMM 17 -#endif - - -/* Action category code */ -enum ieee80211_category { - WLAN_CATEGORY_SPECTRUM_MGMT = 0, - WLAN_CATEGORY_QOS = 1, - WLAN_CATEGORY_DLS = 2, - WLAN_CATEGORY_BACK = 3, - WLAN_CATEGORY_PUBLIC = 4, //IEEE 802.11 public action frames - WLAN_CATEGORY_RADIO_MEASUREMENT = 5, - WLAN_CATEGORY_FT = 6, - WLAN_CATEGORY_HT = 7, - WLAN_CATEGORY_SA_QUERY = 8, - WLAN_CATEGORY_TDLS = 12, - WLAN_CATEGORY_WMM = 17, - WLAN_CATEGORY_P2P = 0x7f,//P2P action frames -}; - -/* SPECTRUM_MGMT action code */ -enum ieee80211_spectrum_mgmt_actioncode { - WLAN_ACTION_SPCT_MSR_REQ = 0, - WLAN_ACTION_SPCT_MSR_RPRT = 1, - WLAN_ACTION_SPCT_TPC_REQ = 2, - WLAN_ACTION_SPCT_TPC_RPRT = 3, - WLAN_ACTION_SPCT_CHL_SWITCH = 4, - WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, -}; - -enum _PUBLIC_ACTION{ - ACT_PUBLIC_BSSCOEXIST = 0, // 20/40 BSS Coexistence - ACT_PUBLIC_MP = 7, // Measurement Pilot - ACT_PUBLIC_P2P = 9, // WIFI_DIRECT -}; - -#ifdef CONFIG_TDLS -enum TDLS_ACTION_FIELD{ - TDLS_SETUP_REQUEST = 0, - TDLS_SETUP_RESPONSE = 1, - TDLS_SETUP_CONFIRM = 2, - TDLS_TEARDOWN = 3, - TDLS_PEER_TRAFFIC_INDICATION = 4, - TDLS_CHANNEL_SWITCH_REQUEST = 5, - TDLS_CHANNEL_SWITCH_RESPONSE = 6, - TDLS_PEER_PSM_REQUEST = 7, - TDLS_PEER_PSM_RESPONSE = 8, - TDLS_PEER_TRAFFIC_RESPONSE = 9, - TDLS_DISCOVERY_REQUEST = 10, - TDLS_DISCOVERY_RESPONSE = 14, //it's used in public action frame -}; -#endif - -/* BACK action code */ -enum ieee80211_back_actioncode { - WLAN_ACTION_ADDBA_REQ = 0, - WLAN_ACTION_ADDBA_RESP = 1, - WLAN_ACTION_DELBA = 2, -}; - -/* HT features action code */ -enum ieee80211_ht_actioncode { - WLAN_ACTION_NOTIFY_CH_WIDTH = 0, - WLAN_ACTION_SM_PS = 1, - WLAN_ACTION_PSPM = 2, - WLAN_ACTION_PCO_PHASE = 3, - WLAN_ACTION_MIMO_CSI_MX = 4, - WLAN_ACTION_MIMO_NONCP_BF = 5, - WLAN_ACTION_MIMP_CP_BF = 6, - WLAN_ACTION_ASEL_INDICATES_FB = 7, - WLAN_ACTION_HI_INFO_EXCHG = 8, -}; - -/* BACK (block-ack) parties */ -enum ieee80211_back_parties { - WLAN_BACK_RECIPIENT = 0, - WLAN_BACK_INITIATOR = 1, - WLAN_BACK_TIMER = 2, -}; - - -#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs) - * 00:50:F2 */ - -#define WME_OUI_TYPE 2 -#define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0 -#define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1 -#define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2 -#define WME_VERSION 1 - -#define WME_ACTION_CODE_SETUP_REQUEST 0 -#define WME_ACTION_CODE_SETUP_RESPONSE 1 -#define WME_ACTION_CODE_TEARDOWN 2 - -#define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0 -#define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1 -#define WME_SETUP_RESPONSE_STATUS_REFUSED 3 - -#define WME_TSPEC_DIRECTION_UPLINK 0 -#define WME_TSPEC_DIRECTION_DOWNLINK 1 -#define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3 - - -#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */ - -#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */ - -/* Parsed Information Elements */ -struct ieee802_11_elems { - u8 *ssid; - u8 ssid_len; - u8 *supp_rates; - u8 supp_rates_len; - u8 *fh_params; - u8 fh_params_len; - u8 *ds_params; - u8 ds_params_len; - u8 *cf_params; - u8 cf_params_len; - u8 *tim; - u8 tim_len; - u8 *ibss_params; - u8 ibss_params_len; - u8 *challenge; - u8 challenge_len; - u8 *erp_info; - u8 erp_info_len; - u8 *ext_supp_rates; - u8 ext_supp_rates_len; - u8 *wpa_ie; - u8 wpa_ie_len; - u8 *rsn_ie; - u8 rsn_ie_len; - u8 *wme; - u8 wme_len; - u8 *wme_tspec; - u8 wme_tspec_len; - u8 *wps_ie; - u8 wps_ie_len; - u8 *power_cap; - u8 power_cap_len; - u8 *supp_channels; - u8 supp_channels_len; - u8 *mdie; - u8 mdie_len; - u8 *ftie; - u8 ftie_len; - u8 *timeout_int; - u8 timeout_int_len; - u8 *ht_capabilities; - u8 ht_capabilities_len; - u8 *ht_operation; - u8 ht_operation_len; - u8 *vendor_ht_cap; - u8 vendor_ht_cap_len; -}; - -typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes; - -ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, - struct ieee802_11_elems *elems, - int show_errors); - -u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, unsigned int *frlen); -u8 *rtw_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen); -u8 *rtw_get_ie(u8*pbuf, sint index, sint *len, sint limit); -void rtw_set_supported_rate(u8* SupportedRates, uint mode) ; - -unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit); -unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit); -int rtw_get_wpa_cipher_suite(u8 *s); -int rtw_get_wpa2_cipher_suite(u8 *s); -int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher); -int rtw_parse_wpa2_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher); - -int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len); -u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); -u8 is_wps_ie(u8 *ie_ptr, uint *wps_ielen); - -int rtw_get_p2p_ie(u8 *in_ie, uint in_len, u8 *p2p_ie, uint *p2p_ielen); -int rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen); -u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr); -int rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *attr_content, uint *attr_contentlen); -int rtw_get_wps_ie_p2p(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); - -uint rtw_get_rateset_len(u8 *rateset); - -struct registry_priv; -int rtw_generate_ie(struct registry_priv *pregistrypriv); - - -int rtw_get_bit_value_from_ieee_value(u8 val); - -uint rtw_is_cckrates_included(u8 *rate); - -uint rtw_is_cckratesonly_included(u8 *rate); - -int rtw_check_network_type(unsigned char *rate, int ratelen, int channel); - -void rtw_macaddr_cfg(u8 *mac_addr); -#endif /* IEEE80211_H */ - diff --git a/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h b/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h deleted file mode 100755 index 0a966fa5d03a..000000000000 --- a/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h +++ /dev/null @@ -1,477 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __IEEE80211_EXT_H -#define __IEEE80211_EXT_H - -#include -#include -#include - -#define WMM_OUI_TYPE 2 -#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 -#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 -#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 -#define WMM_VERSION 1 - -#define WPA_PROTO_WPA BIT(0) -#define WPA_PROTO_RSN BIT(1) - -#define WPA_KEY_MGMT_IEEE8021X BIT(0) -#define WPA_KEY_MGMT_PSK BIT(1) -#define WPA_KEY_MGMT_NONE BIT(2) -#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) -#define WPA_KEY_MGMT_WPA_NONE BIT(4) - - -#define WPA_CAPABILITY_PREAUTH BIT(0) -#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) -#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) - - -#define PMKID_LEN 16 - - -#ifdef PLATFORM_LINUX -struct wpa_ie_hdr { - u8 elem_id; - u8 len; - u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ - u8 version[2]; /* little endian */ -}__attribute__ ((packed)); - -struct rsn_ie_hdr { - u8 elem_id; /* WLAN_EID_RSN */ - u8 len; - u8 version[2]; /* little endian */ -}__attribute__ ((packed)); - -struct wme_ac_parameter { -#if defined(CONFIG_LITTLE_ENDIAN) - /* byte 1 */ - u8 aifsn:4, - acm:1, - aci:2, - reserved:1; - - /* byte 2 */ - u8 eCWmin:4, - eCWmax:4; -#elif defined(CONFIG_BIG_ENDIAN) - /* byte 1 */ - u8 reserved:1, - aci:2, - acm:1, - aifsn:4; - - /* byte 2 */ - u8 eCWmax:4, - eCWmin:4; -#else -#error "Please fix " -#endif - - /* bytes 3 & 4 */ - u16 txopLimit; -} __attribute__ ((packed)); - -struct wme_parameter_element { - /* required fields for WME version 1 */ - u8 oui[3]; - u8 oui_type; - u8 oui_subtype; - u8 version; - u8 acInfo; - u8 reserved; - struct wme_ac_parameter ac[4]; - -} __attribute__ ((packed)); - -#endif - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct wpa_ie_hdr { - u8 elem_id; - u8 len; - u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ - u8 version[2]; /* little endian */ -}; - -struct rsn_ie_hdr { - u8 elem_id; /* WLAN_EID_RSN */ - u8 len; - u8 version[2]; /* little endian */ -}; - -#pragma pack() - -#endif - -#define WPA_PUT_LE16(a, val) \ - do { \ - (a)[1] = ((u16) (val)) >> 8; \ - (a)[0] = ((u16) (val)) & 0xff; \ - } while (0) - -#define WPA_PUT_BE32(a, val) \ - do { \ - (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[3] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define WPA_PUT_LE32(a, val) \ - do { \ - (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[0] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) -//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) - - - -/* Action category code */ -enum ieee80211_category { - WLAN_CATEGORY_SPECTRUM_MGMT = 0, - WLAN_CATEGORY_QOS = 1, - WLAN_CATEGORY_DLS = 2, - WLAN_CATEGORY_BACK = 3, - WLAN_CATEGORY_HT = 7, - WLAN_CATEGORY_WMM = 17, -}; - -/* SPECTRUM_MGMT action code */ -enum ieee80211_spectrum_mgmt_actioncode { - WLAN_ACTION_SPCT_MSR_REQ = 0, - WLAN_ACTION_SPCT_MSR_RPRT = 1, - WLAN_ACTION_SPCT_TPC_REQ = 2, - WLAN_ACTION_SPCT_TPC_RPRT = 3, - WLAN_ACTION_SPCT_CHL_SWITCH = 4, - WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, -}; - -/* BACK action code */ -enum ieee80211_back_actioncode { - WLAN_ACTION_ADDBA_REQ = 0, - WLAN_ACTION_ADDBA_RESP = 1, - WLAN_ACTION_DELBA = 2, -}; - -/* HT features action code */ -enum ieee80211_ht_actioncode { - WLAN_ACTION_NOTIFY_CH_WIDTH = 0, - WLAN_ACTION_SM_PS = 1, - WLAN_ACTION_PSPM = 2, - WLAN_ACTION_PCO_PHASE = 3, - WLAN_ACTION_MIMO_CSI_MX = 4, - WLAN_ACTION_MIMO_NONCP_BF = 5, - WLAN_ACTION_MIMP_CP_BF = 6, - WLAN_ACTION_ASEL_INDICATES_FB = 7, - WLAN_ACTION_HI_INFO_EXCHG = 8, -}; - -/* BACK (block-ack) parties */ -enum ieee80211_back_parties { - WLAN_BACK_RECIPIENT = 0, - WLAN_BACK_INITIATOR = 1, - WLAN_BACK_TIMER = 2, -}; - -#ifdef PLATFORM_LINUX - -struct ieee80211_mgmt { - u16 frame_control; - u16 duration; - u8 da[6]; - u8 sa[6]; - u8 bssid[6]; - u16 seq_ctrl; - union { - struct { - u16 auth_alg; - u16 auth_transaction; - u16 status_code; - /* possibly followed by Challenge text */ - u8 variable[0]; - } __attribute__ ((packed)) auth; - struct { - u16 reason_code; - } __attribute__ ((packed)) deauth; - struct { - u16 capab_info; - u16 listen_interval; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) assoc_req; - struct { - u16 capab_info; - u16 status_code; - u16 aid; - /* followed by Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) assoc_resp, reassoc_resp; - struct { - u16 capab_info; - u16 listen_interval; - u8 current_ap[6]; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) reassoc_req; - struct { - u16 reason_code; - } __attribute__ ((packed)) disassoc; - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params, TIM */ - u8 variable[0]; - } __attribute__ ((packed)) beacon; - struct { - /* only variable items: SSID, Supported rates */ - u8 variable[0]; - } __attribute__ ((packed)) probe_req; - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params */ - u8 variable[0]; - } __attribute__ ((packed)) probe_resp; - struct { - u8 category; - union { - struct { - u8 action_code; - u8 dialog_token; - u8 status_code; - u8 variable[0]; - } __attribute__ ((packed)) wme_action; -#if 0 - struct{ - u8 action_code; - u8 element_id; - u8 length; - struct ieee80211_channel_sw_ie sw_elem; - } __attribute__ ((packed)) chan_switch; - struct{ - u8 action_code; - u8 dialog_token; - u8 element_id; - u8 length; - struct ieee80211_msrment_ie msr_elem; - } __attribute__ ((packed)) measurement; -#endif - struct{ - u8 action_code; - u8 dialog_token; - u16 capab; - u16 timeout; - u16 start_seq_num; - } __attribute__ ((packed)) addba_req; - struct{ - u8 action_code; - u8 dialog_token; - u16 status; - u16 capab; - u16 timeout; - } __attribute__ ((packed)) addba_resp; - struct{ - u8 action_code; - u16 params; - u16 reason_code; - } __attribute__ ((packed)) delba; - struct{ - u8 action_code; - /* capab_info for open and confirm, - * reason for close - */ - u16 aux; - /* Followed in plink_confirm by status - * code, AID and supported rates, - * and directly by supported rates in - * plink_open and plink_close - */ - u8 variable[0]; - } __attribute__ ((packed)) plink_action; - struct{ - u8 action_code; - u8 variable[0]; - } __attribute__ ((packed)) mesh_action; - } __attribute__ ((packed)) u; - } __attribute__ ((packed)) action; - } __attribute__ ((packed)) u; -}__attribute__ ((packed)); - -#endif - - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct ieee80211_mgmt { - u16 frame_control; - u16 duration; - u8 da[6]; - u8 sa[6]; - u8 bssid[6]; - u16 seq_ctrl; - union { - struct { - u16 auth_alg; - u16 auth_transaction; - u16 status_code; - /* possibly followed by Challenge text */ - u8 variable[0]; - } auth; - struct { - u16 reason_code; - } deauth; - struct { - u16 capab_info; - u16 listen_interval; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } assoc_req; - struct { - u16 capab_info; - u16 status_code; - u16 aid; - /* followed by Supported rates */ - u8 variable[0]; - } assoc_resp, reassoc_resp; - struct { - u16 capab_info; - u16 listen_interval; - u8 current_ap[6]; - /* followed by SSID and Supported rates */ - u8 variable[0]; - } reassoc_req; - struct { - u16 reason_code; - } disassoc; -#if 0 - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params, TIM */ - u8 variable[0]; - } beacon; - struct { - /* only variable items: SSID, Supported rates */ - u8 variable[0]; - } probe_req; - - struct { - __le64 timestamp; - u16 beacon_int; - u16 capab_info; - /* followed by some of SSID, Supported rates, - * FH Params, DS Params, CF Params, IBSS Params */ - u8 variable[0]; - } probe_resp; -#endif - struct { - u8 category; - union { - struct { - u8 action_code; - u8 dialog_token; - u8 status_code; - u8 variable[0]; - } wme_action; -/* - struct{ - u8 action_code; - u8 element_id; - u8 length; - struct ieee80211_channel_sw_ie sw_elem; - } chan_switch; - struct{ - u8 action_code; - u8 dialog_token; - u8 element_id; - u8 length; - struct ieee80211_msrment_ie msr_elem; - } measurement; -*/ - struct{ - u8 action_code; - u8 dialog_token; - u16 capab; - u16 timeout; - u16 start_seq_num; - } addba_req; - struct{ - u8 action_code; - u8 dialog_token; - u16 status; - u16 capab; - u16 timeout; - } addba_resp; - struct{ - u8 action_code; - u16 params; - u16 reason_code; - } delba; - struct{ - u8 action_code; - /* capab_info for open and confirm, - * reason for close - */ - u16 aux; - /* Followed in plink_confirm by status - * code, AID and supported rates, - * and directly by supported rates in - * plink_open and plink_close - */ - u8 variable[0]; - } plink_action; - struct{ - u8 action_code; - u8 variable[0]; - } mesh_action; - } u; - } action; - } u; -} ; - -#pragma pack() - -#endif - -/* mgmt header + 1 byte category code */ -#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) - - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/if_ether.h b/drivers/net/wireless/rtl8192c/include/if_ether.h deleted file mode 100755 index 045c06775823..000000000000 --- a/drivers/net/wireless/rtl8192c/include/if_ether.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Global definitions for the Ethernet IEEE 802.3 interface. - * - * Version: @(#)if_ether.h 1.0.1a 02/08/94 - * - * Author: Fred N. van Kempen, - * Donald Becker, - * Alan Cox, - * Steve Whitehouse, - * - * 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. - */ - -#ifndef _LINUX_IF_ETHER_H -#define _LINUX_IF_ETHER_H - -/* - * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble - * and FCS/CRC (frame check sequence). - */ - -#define ETH_ALEN 6 /* Octets in one ethernet addr */ -#define ETH_HLEN 14 /* Total octets in header. */ -#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */ -#define ETH_DATA_LEN 1500 /* Max. octets in payload */ -#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */ - -/* - * These are the defined Ethernet Protocol ID's. - */ - -#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */ -#define ETH_P_PUP 0x0200 /* Xerox PUP packet */ -#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */ -#define ETH_P_IP 0x0800 /* Internet Protocol packet */ -#define ETH_P_X25 0x0805 /* CCITT X.25 */ -#define ETH_P_ARP 0x0806 /* Address Resolution packet */ -#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */ -#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */ -#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */ -#define ETH_P_DEC 0x6000 /* DEC Assigned proto */ -#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */ -#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */ -#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */ -#define ETH_P_LAT 0x6004 /* DEC LAT */ -#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */ -#define ETH_P_CUST 0x6006 /* DEC Customer use */ -#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */ -#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */ -#define ETH_P_ATALK 0x809B /* Appletalk DDP */ -#define ETH_P_AARP 0x80F3 /* Appletalk AARP */ -#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */ -#define ETH_P_IPX 0x8137 /* IPX over DIX */ -#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */ -#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */ -#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */ -#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */ -#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport - * over Ethernet - */ - -/* - * Non DIX types. Won't clash for 1500 types. - */ - -#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */ -#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */ -#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */ -#define ETH_P_802_2 0x0004 /* 802.2 frames */ -#define ETH_P_SNAP 0x0005 /* Internal only */ -#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */ -#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ -#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ -#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ -#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ -#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ -#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ -#define ETH_P_CONTROL 0x0016 /* Card specific control frames */ -#define ETH_P_IRDA 0x0017 /* Linux-IrDA */ -#define ETH_P_ECONET 0x0018 /* Acorn Econet */ - -/* - * This is an Ethernet frame header. - */ - -struct ethhdr -{ - unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ - unsigned char h_source[ETH_ALEN]; /* source ether addr */ - unsigned short h_proto; /* packet type ID field */ -}; - -struct _vlan { - unsigned short h_vlan_TCI; // Encapsulates priority and VLAN ID - unsigned short h_vlan_encapsulated_proto; -}; - - - -#define get_vlan_id(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI)) & 0xfff) -#define get_vlan_priority(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI))>>13) -#define get_vlan_encap_proto(pvlan) (ntohs((unsigned short )pvlan->h_vlan_encapsulated_proto)) - - -#endif /* _LINUX_IF_ETHER_H */ diff --git a/drivers/net/wireless/rtl8192c/include/ip.h b/drivers/net/wireless/rtl8192c/include/ip.h deleted file mode 100755 index 5846347a07d2..000000000000 --- a/drivers/net/wireless/rtl8192c/include/ip.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * INET An implementation of the TCP/IP protocol suite for the LINUX - * operating system. INET is implemented using the BSD Socket - * interface as the means of communication with the user level. - * - * Definitions for the IP protocol. - * - * Version: @(#)ip.h 1.0.2 04/28/93 - * - * Authors: Fred N. van Kempen, - * - * 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. - */ -#ifndef _LINUX_IP_H -#define _LINUX_IP_H -#include - -/* SOL_IP socket options */ - -#define IPTOS_TOS_MASK 0x1E -#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) -#define IPTOS_LOWDELAY 0x10 -#define IPTOS_THROUGHPUT 0x08 -#define IPTOS_RELIABILITY 0x04 -#define IPTOS_MINCOST 0x02 - -#define IPTOS_PREC_MASK 0xE0 -#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) -#define IPTOS_PREC_NETCONTROL 0xe0 -#define IPTOS_PREC_INTERNETCONTROL 0xc0 -#define IPTOS_PREC_CRITIC_ECP 0xa0 -#define IPTOS_PREC_FLASHOVERRIDE 0x80 -#define IPTOS_PREC_FLASH 0x60 -#define IPTOS_PREC_IMMEDIATE 0x40 -#define IPTOS_PREC_PRIORITY 0x20 -#define IPTOS_PREC_ROUTINE 0x00 - - -/* IP options */ -#define IPOPT_COPY 0x80 -#define IPOPT_CLASS_MASK 0x60 -#define IPOPT_NUMBER_MASK 0x1f - -#define IPOPT_COPIED(o) ((o)&IPOPT_COPY) -#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) -#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) - -#define IPOPT_CONTROL 0x00 -#define IPOPT_RESERVED1 0x20 -#define IPOPT_MEASUREMENT 0x40 -#define IPOPT_RESERVED2 0x60 - -#define IPOPT_END (0 |IPOPT_CONTROL) -#define IPOPT_NOOP (1 |IPOPT_CONTROL) -#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) -#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) -#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) -#define IPOPT_RR (7 |IPOPT_CONTROL) -#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) -#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) -#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) - -#define IPVERSION 4 -#define MAXTTL 255 -#define IPDEFTTL 64 - -/* struct timestamp, struct route and MAX_ROUTES are removed. - - REASONS: it is clear that nobody used them because: - - MAX_ROUTES value was wrong. - - "struct route" was wrong. - - "struct timestamp" had fatally misaligned bitfields and was completely unusable. - */ - -#define IPOPT_OPTVAL 0 -#define IPOPT_OLEN 1 -#define IPOPT_OFFSET 2 -#define IPOPT_MINOFF 4 -#define MAX_IPOPTLEN 40 -#define IPOPT_NOP IPOPT_NOOP -#define IPOPT_EOL IPOPT_END -#define IPOPT_TS IPOPT_TIMESTAMP - -#define IPOPT_TS_TSONLY 0 /* timestamps only */ -#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ -#define IPOPT_TS_PRESPEC 3 /* specified modules only */ - -#ifdef PLATFORM_LINUX - -struct ip_options { - __u32 faddr; /* Saved first hop address */ - unsigned char optlen; - unsigned char srr; - unsigned char rr; - unsigned char ts; - unsigned char is_setbyuser:1, /* Set by setsockopt? */ - is_data:1, /* Options in __data, rather than skb */ - is_strictroute:1, /* Strict source route */ - srr_is_hit:1, /* Packet destination addr was our one */ - is_changed:1, /* IP checksum more not valid */ - rr_needaddr:1, /* Need to record addr of outgoing dev */ - ts_needtime:1, /* Need to record timestamp */ - ts_needaddr:1; /* Need to record addr of outgoing dev */ - unsigned char router_alert; - unsigned char __pad1; - unsigned char __pad2; - unsigned char __data[0]; -}; - -#define optlength(opt) (sizeof(struct ip_options) + opt->optlen) -#endif - -struct iphdr { -#if defined(__LITTLE_ENDIAN_BITFIELD) - __u8 ihl:4, - version:4; -#elif defined (__BIG_ENDIAN_BITFIELD) - __u8 version:4, - ihl:4; -#else -#error "Please fix " -#endif - __u8 tos; - __u16 tot_len; - __u16 id; - __u16 frag_off; - __u8 ttl; - __u8 protocol; - __u16 check; - __u32 saddr; - __u32 daddr; - /*The options start here. */ -}; - -#endif /* _LINUX_IP_H */ diff --git a/drivers/net/wireless/rtl8192c/include/mlme_osdep.h b/drivers/net/wireless/rtl8192c/include/mlme_osdep.h deleted file mode 100755 index 28912f0e7ed2..000000000000 --- a/drivers/net/wireless/rtl8192c/include/mlme_osdep.h +++ /dev/null @@ -1,43 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __MLME_OSDEP_H_ -#define __MLME_OSDEP_H_ - -#include -#include -#include - -#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) -extern int time_after(u32 now, u32 old); -#endif - -extern void rtw_init_mlme_timer(_adapter *padapter); -extern void rtw_os_indicate_disconnect( _adapter *adapter ); -extern void rtw_os_indicate_connect( _adapter *adapter ); -extern void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie); - -#ifdef CONFIG_AP_MODE -void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); -void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); -#endif -void rtw_reset_securitypriv( _adapter *adapter ); - -#endif //_MLME_OSDEP_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h b/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h deleted file mode 100755 index 5f8673811fb5..000000000000 --- a/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h +++ /dev/null @@ -1,353 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __CUSTOM_OID_H -#define __CUSTOM_OID_H - -// by Owen -// 0xFF818000 - 0xFF81802F RTL8180 Mass Production Kit -// 0xFF818500 - 0xFF81850F RTL8185 Setup Utility -// 0xFF818580 - 0xFF81858F RTL8185 Phy Status Utility - -// - -// by Owen for Production Kit -// For Production Kit with Agilent Equipments -// in order to make our custom oids hopefully somewhat unique -// we will use 0xFF (indicating implementation specific OID) -// 81(first byte of non zero Realtek unique identifier) -// 80 (second byte of non zero Realtek unique identifier) -// XX (the custom OID number - providing 255 possible custom oids) - -#define OID_RT_PRO_RESET_DUT 0xFF818000 -#define OID_RT_PRO_SET_DATA_RATE 0xFF818001 -#define OID_RT_PRO_START_TEST 0xFF818002 -#define OID_RT_PRO_STOP_TEST 0xFF818003 -#define OID_RT_PRO_SET_PREAMBLE 0xFF818004 -#define OID_RT_PRO_SET_SCRAMBLER 0xFF818005 -#define OID_RT_PRO_SET_FILTER_BB 0xFF818006 -#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB 0xFF818007 -#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL 0xFF818008 -#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL 0xFF818009 -#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL 0xFF81800A - -#define OID_RT_PRO_SET_TX_ANTENNA_BB 0xFF81800D -#define OID_RT_PRO_SET_ANTENNA_BB 0xFF81800E -#define OID_RT_PRO_SET_CR_SCRAMBLER 0xFF81800F -#define OID_RT_PRO_SET_CR_NEW_FILTER 0xFF818010 -#define OID_RT_PRO_SET_TX_POWER_CONTROL 0xFF818011 -#define OID_RT_PRO_SET_CR_TX_CONFIG 0xFF818012 -#define OID_RT_PRO_GET_TX_POWER_CONTROL 0xFF818013 -#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY 0xFF818014 -#define OID_RT_PRO_SET_CR_SETPOINT 0xFF818015 -#define OID_RT_PRO_SET_INTEGRATOR 0xFF818016 -#define OID_RT_PRO_SET_SIGNAL_QUALITY 0xFF818017 -#define OID_RT_PRO_GET_INTEGRATOR 0xFF818018 -#define OID_RT_PRO_GET_SIGNAL_QUALITY 0xFF818019 -#define OID_RT_PRO_QUERY_EEPROM_TYPE 0xFF81801A -#define OID_RT_PRO_WRITE_MAC_ADDRESS 0xFF81801B -#define OID_RT_PRO_READ_MAC_ADDRESS 0xFF81801C -#define OID_RT_PRO_WRITE_CIS_DATA 0xFF81801D -#define OID_RT_PRO_READ_CIS_DATA 0xFF81801E -#define OID_RT_PRO_WRITE_POWER_CONTROL 0xFF81801F -#define OID_RT_PRO_READ_POWER_CONTROL 0xFF818020 -#define OID_RT_PRO_WRITE_EEPROM 0xFF818021 -#define OID_RT_PRO_READ_EEPROM 0xFF818022 -#define OID_RT_PRO_RESET_TX_PACKET_SENT 0xFF818023 -#define OID_RT_PRO_QUERY_TX_PACKET_SENT 0xFF818024 -#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED 0xFF818025 -#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED 0xFF818026 -#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR 0xFF818027 -#define OID_RT_PRO_QUERY_CURRENT_ADDRESS 0xFF818028 -#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS 0xFF818029 -#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS 0xFF81802A -#define OID_RT_PRO_RECEIVE_PACKET 0xFF81802C -// added by Owen on 04/08/03 for Cameo's request -#define OID_RT_PRO_WRITE_EEPROM_BYTE 0xFF81802D -#define OID_RT_PRO_READ_EEPROM_BYTE 0xFF81802E -#define OID_RT_PRO_SET_MODULATION 0xFF81802F -// - -//Sean -#define OID_RT_DRIVER_OPTION 0xFF818080 -#define OID_RT_RF_OFF 0xFF818081 -#define OID_RT_AUTH_STATUS 0xFF818082 - -//======================================================================== -#define OID_RT_PRO_SET_CONTINUOUS_TX 0xFF81800B -#define OID_RT_PRO_SET_SINGLE_CARRIER_TX 0xFF81800C -#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX 0xFF81802B -#define OID_RT_PRO_SET_SINGLE_TONE_TX 0xFF818043 -//======================================================================== - - -// by Owen for RTL8185 Phy Status Report Utility -#define OID_RT_UTILITY_FALSE_ALARM_COUNTERS 0xFF818580 -#define OID_RT_UTILITY_SELECT_DEBUG_MODE 0xFF818581 -#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER 0xFF818582 -#define OID_RT_UTILITY_GET_RSSI_STATUS 0xFF818583 -#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS 0xFF818584 -#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS 0xFF818585 -#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS 0xFF818586 -// - -// by Owen on 03/09/19-03/09/22 for RTL8185 -#define OID_RT_WIRELESS_MODE 0xFF818500 -#define OID_RT_SUPPORTED_RATES 0xFF818501 -#define OID_RT_DESIRED_RATES 0xFF818502 -#define OID_RT_WIRELESS_MODE_STARTING_ADHOC 0xFF818503 -// - -#define OID_RT_GET_CONNECT_STATE 0xFF030001 -#define OID_RT_RESCAN 0xFF030002 -#define OID_RT_SET_KEY_LENGTH 0xFF030003 -#define OID_RT_SET_DEFAULT_KEY_ID 0xFF030004 - -#define OID_RT_SET_CHANNEL 0xFF010182 -#define OID_RT_SET_SNIFFER_MODE 0xFF010183 -#define OID_RT_GET_SIGNAL_QUALITY 0xFF010184 -#define OID_RT_GET_SMALL_PACKET_CRC 0xFF010185 -#define OID_RT_GET_MIDDLE_PACKET_CRC 0xFF010186 -#define OID_RT_GET_LARGE_PACKET_CRC 0xFF010187 -#define OID_RT_GET_TX_RETRY 0xFF010188 -#define OID_RT_GET_RX_RETRY 0xFF010189 -#define OID_RT_PRO_SET_FW_DIG_STATE 0xFF01018A//S -#define OID_RT_PRO_SET_FW_RA_STATE 0xFF01018B//S - -#define OID_RT_GET_RX_TOTAL_PACKET 0xFF010190 -#define OID_RT_GET_TX_BEACON_OK 0xFF010191 -#define OID_RT_GET_TX_BEACON_ERR 0xFF010192 -#define OID_RT_GET_RX_ICV_ERR 0xFF010193 -#define OID_RT_SET_ENCRYPTION_ALGORITHM 0xFF010194 -#define OID_RT_SET_NO_AUTO_RESCAN 0xFF010195 -#define OID_RT_GET_PREAMBLE_MODE 0xFF010196 -#define OID_RT_GET_DRIVER_UP_DELTA_TIME 0xFF010197 -#define OID_RT_GET_AP_IP 0xFF010198 -#define OID_RT_GET_CHANNELPLAN 0xFF010199 -#define OID_RT_SET_PREAMBLE_MODE 0xFF01019A -#define OID_RT_SET_BCN_INTVL 0xFF01019B -#define OID_RT_GET_RF_VENDER 0xFF01019C -#define OID_RT_DEDICATE_PROBE 0xFF01019D -#define OID_RT_PRO_RX_FILTER_PATTERN 0xFF01019E - -#define OID_RT_GET_DCST_CURRENT_THRESHOLD 0xFF01019F - -#define OID_RT_GET_CCA_ERR 0xFF0101A0 -#define OID_RT_GET_CCA_UPGRADE_THRESHOLD 0xFF0101A1 -#define OID_RT_GET_CCA_FALLBACK_THRESHOLD 0xFF0101A2 - -#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES 0xFF0101A3 -#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES 0xFF0101A4 - -// by Owen on 03/31/03 for Cameo's request -#define OID_RT_SET_RATE_ADAPTIVE 0xFF0101A5 -// -#define OID_RT_GET_DCST_EVALUATE_PERIOD 0xFF0101A5 -#define OID_RT_GET_DCST_TIME_UNIT_INDEX 0xFF0101A6 -#define OID_RT_GET_TOTAL_TX_BYTES 0xFF0101A7 -#define OID_RT_GET_TOTAL_RX_BYTES 0xFF0101A8 -#define OID_RT_CURRENT_TX_POWER_LEVEL 0xFF0101A9 -#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT 0xFF0101AA -#define OID_RT_GET_ENC_KEY_MATCH_COUNT 0xFF0101AB -#define OID_RT_GET_CHANNEL 0xFF0101AC - -#define OID_RT_SET_CHANNELPLAN 0xFF0101AD -#define OID_RT_GET_HARDWARE_RADIO_OFF 0xFF0101AE -#define OID_RT_CHANNELPLAN_BY_COUNTRY 0xFF0101AF -#define OID_RT_SCAN_AVAILABLE_BSSID 0xFF0101B0 -#define OID_RT_GET_HARDWARE_VERSION 0xFF0101B1 -#define OID_RT_GET_IS_ROAMING 0xFF0101B2 -#define OID_RT_GET_IS_PRIVACY 0xFF0101B3 -#define OID_RT_GET_KEY_MISMATCH 0xFF0101B4 -#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH 0xFF0101B5 -#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH 0xFF0101B6 -#define OID_RT_RESET_LOG 0xFF0101B7 -#define OID_RT_GET_LOG 0xFF0101B8 -#define OID_RT_SET_INDICATE_HIDDEN_AP 0xFF0101B9 -#define OID_RT_GET_HEADER_FAIL 0xFF0101BA -#define OID_RT_SUPPORTED_WIRELESS_MODE 0xFF0101BB -#define OID_RT_GET_CHANNEL_LIST 0xFF0101BC -#define OID_RT_GET_SCAN_IN_PROGRESS 0xFF0101BD -#define OID_RT_GET_TX_INFO 0xFF0101BE -#define OID_RT_RF_READ_WRITE_OFFSET 0xFF0101BF -#define OID_RT_RF_READ_WRITE 0xFF0101C0 - -// For Netgear request. 2005.01.13, by rcnjko. -#define OID_RT_FORCED_DATA_RATE 0xFF0101C1 -#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST 0xFF0101C2 -// For Netgear request. 2005.02.17, by rcnjko. -#define OID_RT_GET_BSS_WIRELESS_MODE 0xFF0101C3 -// For AZ project. 2005.06.27, by rcnjko. -#define OID_RT_SCAN_WITH_MAGIC_PACKET 0xFF0101C4 - -// Vincent 8185MP -#define OID_RT_PRO_RX_FILTER 0xFF0111C0 - -//Andy TEST -//#define OID_RT_PRO_WRITE_REGISTRY 0xFF0111C1 -//#define OID_RT_PRO_READ_REGISTRY 0xFF0111C2 -#define OID_CE_USB_WRITE_REGISTRY 0xFF0111C1 -#define OID_CE_USB_READ_REGISTRY 0xFF0111C2 - - -#define OID_RT_PRO_SET_INITIAL_GAIN 0xFF0111C3 -#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE 0xFF0111C4 -#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE 0xFF0111C5 -#define OID_RT_PRO_SET_TX_CHARGE_PUMP 0xFF0111C6 -#define OID_RT_PRO_SET_RX_CHARGE_PUMP 0xFF0111C7 -#define OID_RT_PRO_RF_WRITE_REGISTRY 0xFF0111C8 -#define OID_RT_PRO_RF_READ_REGISTRY 0xFF0111C9 -#define OID_RT_PRO_QUERY_RF_TYPE 0xFF0111CA - -// AP OID -#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST 0xFF010300 -#define OID_RT_AP_GET_CURRENT_TIME_STAMP 0xFF010301 -#define OID_RT_AP_SWITCH_INTO_AP_MODE 0xFF010302 -#define OID_RT_AP_SET_DTIM_PERIOD 0xFF010303 -#define OID_RT_AP_SUPPORTED 0xFF010304 // Determine if driver supports AP mode. 2004.08.27, by rcnjko. -#define OID_RT_AP_SET_PASSPHRASE 0xFF010305 // Set WPA-PSK passphrase into authenticator. 2005.07.08, byrcnjko. - -// 8187MP. 2004.09.06, by rcnjko. -#define OID_RT_PRO8187_WI_POLL 0xFF818780 -#define OID_RT_PRO_WRITE_BB_REG 0xFF818781 -#define OID_RT_PRO_READ_BB_REG 0xFF818782 -#define OID_RT_PRO_WRITE_RF_REG 0xFF818783 -#define OID_RT_PRO_READ_RF_REG 0xFF818784 - -// Meeting House. added by Annie, 2005-07-20. -#define OID_RT_MH_VENDER_ID 0xFFEDC100 - -//8711 MP OID added 20051230. -#define OID_RT_PRO8711_JOIN_BSS 0xFF871100//S - -#define OID_RT_PRO_READ_REGISTER 0xFF871101 //Q -#define OID_RT_PRO_WRITE_REGISTER 0xFF871102 //S - -#define OID_RT_PRO_BURST_READ_REGISTER 0xFF871103 //Q -#define OID_RT_PRO_BURST_WRITE_REGISTER 0xFF871104 //S - -#define OID_RT_PRO_WRITE_TXCMD 0xFF871105 //S - -#define OID_RT_PRO_READ16_EEPROM 0xFF871106 //Q -#define OID_RT_PRO_WRITE16_EEPROM 0xFF871107 //S - -#define OID_RT_PRO_H2C_SET_COMMAND 0xFF871108 //S -#define OID_RT_PRO_H2C_QUERY_RESULT 0xFF871109 //Q - -#define OID_RT_PRO8711_WI_POLL 0xFF87110A //Q -#define OID_RT_PRO8711_PKT_LOSS 0xFF87110B //Q -#define OID_RT_RD_ATTRIB_MEM 0xFF87110C//Q -#define OID_RT_WR_ATTRIB_MEM 0xFF87110D//S - - -//Method 2 for H2C/C2H -#define OID_RT_PRO_H2C_CMD_MODE 0xFF871110 //S -#define OID_RT_PRO_H2C_CMD_RSP_MODE 0xFF871111 //Q -#define OID_RT_PRO_H2C_CMD_EVENT_MODE 0xFF871112 //S -#define OID_RT_PRO_WAIT_C2H_EVENT 0xFF871113 //Q -#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST 0xFF871114//Q - -#define OID_RT_PRO_SCSI_ACCESS_TEST 0xFF871115 //Q, S - -#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT 0xFF871116 //S -#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN 0xFF871117 //Q,S -#define OID_RT_RRO_RX_PKT_VIA_IOCTRL 0xFF871118 //Q -#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL 0xFF871119 //Q - -#define OID_RT_RPO_SET_PWRMGT_TEST 0xFF87111A //S -#define OID_RT_PRO_QRY_PWRMGT_TEST 0XFF87111B //Q -#define OID_RT_RPO_ASYNC_RWIO_TEST 0xFF87111C //S -#define OID_RT_RPO_ASYNC_RWIO_POLL 0xFF87111D //Q -#define OID_RT_PRO_SET_RF_INTFS 0xFF87111E //S -#define OID_RT_POLL_RX_STATUS 0xFF87111F //Q - -#define OID_RT_PRO_CFG_DEBUG_MESSAGE 0xFF871120 //Q,S -#define OID_RT_PRO_SET_DATA_RATE_EX 0xFF871121//S -#define OID_RT_PRO_SET_BASIC_RATE 0xFF871122//S -#define OID_RT_PRO_READ_TSSI 0xFF871123//S -#define OID_RT_PRO_SET_POWER_TRACKING 0xFF871124//S - - -#define OID_RT_PRO_QRY_PWRSTATE 0xFF871150 //Q -#define OID_RT_PRO_SET_PWRSTATE 0xFF871151 //S - -//Method 2 , using workitem -#define OID_RT_SET_READ_REG 0xFF871181 //S -#define OID_RT_SET_WRITE_REG 0xFF871182 //S -#define OID_RT_SET_BURST_READ_REG 0xFF871183 //S -#define OID_RT_SET_BURST_WRITE_REG 0xFF871184 //S -#define OID_RT_SET_WRITE_TXCMD 0xFF871185 //S -#define OID_RT_SET_READ16_EEPROM 0xFF871186 //S -#define OID_RT_SET_WRITE16_EEPROM 0xFF871187 //S -#define OID_RT_QRY_POLL_WKITEM 0xFF871188 //Q - -//For SDIO INTERFACE only -#define OID_RT_PRO_SYNCPAGERW_SRAM 0xFF8711A0 //Q, S -#define OID_RT_PRO_871X_DRV_EXT 0xFF8711A1 - -//For USB INTERFACE only -#define OID_RT_PRO_USB_VENDOR_REQ 0xFF8711B0 //Q, S -#define OID_RT_PRO_SCSI_AUTO_TEST 0xFF8711B1 //S -#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE 0xFF8711B2 //S -#define OID_RT_PRO_USB_MAC_RX_FIFO_READ 0xFF8711B3 //Q -#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING 0xFF8711B4 //Q - -#define OID_RT_PRO_H2C_SET_RATE_TABLE 0xFF8711FB //S -#define OID_RT_PRO_H2C_GET_RATE_TABLE 0xFF8711FC //S -#define OID_RT_PRO_H2C_C2H_LBK_TEST 0xFF8711FE - -#define OID_RT_PRO_ENCRYPTION_CTRL 0xFF871200 //Q, S -#define OID_RT_PRO_ADD_STA_INFO 0xFF871201 //S -#define OID_RT_PRO_DELE_STA_INFO 0xFF871202 //S -#define OID_RT_PRO_QUERY_DR_VARIABLE 0xFF871203 //Q - -#define OID_RT_PRO_RX_PACKET_TYPE 0xFF871204 //Q, S - -#define OID_RT_PRO_READ_EFUSE 0xFF871205 //Q -#define OID_RT_PRO_WRITE_EFUSE 0xFF871206 //S -#define OID_RT_PRO_RW_EFUSE_PGPKT 0xFF871207 //Q, S -#define OID_RT_GET_EFUSE_CURRENT_SIZE 0xFF871208 //Q - -#define OID_RT_SET_BANDWIDTH 0xFF871209 //S -#define OID_RT_SET_CRYSTAL_CAP 0xFF87120A //S - -#define OID_RT_SET_RX_PACKET_TYPE 0xFF87120B //S - -#define OID_RT_GET_EFUSE_MAX_SIZE 0xFF87120C //Q - -#define OID_RT_PRO_SET_TX_AGC_OFFSET 0xFF87120D //S - -#define OID_RT_PRO_SET_PKT_TEST_MODE 0xFF87120E //S - -#define OID_RT_PRO_FOR_EVM_TEST_SETTING 0xFF87120F //S - -#define OID_RT_PRO_GET_THERMAL_METER 0xFF871210 //Q - -#define OID_RT_RESET_PHY_RX_PACKET_COUNT 0xFF871211 //S -#define OID_RT_GET_PHY_RX_PACKET_RECEIVED 0xFF871212 //Q -#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR 0xFF871213 //Q - -#define OID_RT_SET_POWER_DOWN 0xFF871214 //S - -#define OID_RT_GET_POWER_MODE 0xFF871215 //Q - -#define OID_RT_PRO_EFUSE 0xFF871216 //Q, S -#define OID_RT_PRO_EFUSE_MAP 0xFF871217 //Q, S - -#endif //#ifndef __CUSTOM_OID_H diff --git a/drivers/net/wireless/rtl8192c/include/nic_spec.h b/drivers/net/wireless/rtl8192c/include/nic_spec.h deleted file mode 100755 index 18e7b2c09671..000000000000 --- a/drivers/net/wireless/rtl8192c/include/nic_spec.h +++ /dev/null @@ -1,47 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#ifndef __NIC_SPEC_H__ -#define __NIC_SPEC_H__ - -#include - -#define RTL8711_MCTRL_ (0x20000) -#define RTL8711_UART_ (0x30000) -#define RTL8711_TIMER_ (0x40000) -#define RTL8711_FINT_ (0x50000) -#define RTL8711_HINT_ (0x50000) -#define RTL8711_GPIO_ (0x60000) -#define RTL8711_WLANCTRL_ (0x200000) -#define RTL8711_WLANFF_ (0xe00000) -#define RTL8711_HCICTRL_ (0x600000) -#define RTL8711_SYSCFG_ (0x620000) -#define RTL8711_SYSCTRL_ (0x620000) -#define RTL8711_MCCTRL_ (0x020000) - - -#include - -#include - - -#endif // __RTL8711_SPEC_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h b/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h deleted file mode 100755 index 5f7c3e65103a..000000000000 --- a/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h +++ /dev/null @@ -1,171 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __OSDEP_CE_SERVICE_H_ -#define __OSDEP_CE_SERVICE_H_ - - -#include -#include - -#ifdef CONFIG_SDIO_HCI -#include "SDCardDDK.h" -#endif - -#ifdef CONFIG_USB_HCI -#include -#endif - -typedef HANDLE _sema; -typedef LIST_ENTRY _list; -typedef NDIS_STATUS _OS_STATUS; - -typedef NDIS_SPIN_LOCK _lock; - -typedef HANDLE _rwlock; //Mutex - -typedef u32 _irqL; - -typedef NDIS_HANDLE _nic_hdl; - - -typedef NDIS_MINIPORT_TIMER _timer; - -struct __queue { - LIST_ENTRY queue; - _lock lock; -}; - -typedef NDIS_PACKET _pkt; -typedef NDIS_BUFFER _buffer; -typedef struct __queue _queue; - -typedef HANDLE _thread_hdl_; -typedef DWORD thread_return; -typedef void* thread_context; -typedef NDIS_WORK_ITEM _workitem; - -#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; - - -#define SEMA_UPBND (0x7FFFFFFF) //8192 - -__inline static _list *get_prev(_list *list) -{ - return list->Blink; -} - -__inline static _list *get_next(_list *list) -{ - return list->Flink; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - -#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - NdisAcquireSpinLock(plock); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - NdisReleaseSpinLock(plock); -} - -__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - - -__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - WaitForSingleObject(*prwlock, INFINITE ); - -} - -__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) -{ - ReleaseMutex(*prwlock); -} - -__inline static void rtw_list_delete(_list *plist) -{ - RemoveEntryList(plist); - InitializeListHead(plist); -} - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) -{ - NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - NdisMSetTimer(ptimer,delay_time); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - NdisMCancelTimer(ptimer,bcancelled); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - - NdisInitializeWorkItem(pwork, pfunc, cntx); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - NdisScheduleWorkItem(pwork); -} - -#define ATOMIC_INIT(i) { (i) } - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ - { \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ - NdisMSleep(10000); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ -} -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/osdep_intf.h b/drivers/net/wireless/rtl8192c/include/osdep_intf.h deleted file mode 100755 index 86b3f1fd93fe..000000000000 --- a/drivers/net/wireless/rtl8192c/include/osdep_intf.h +++ /dev/null @@ -1,128 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __OSDEP_INTF_H_ -#define __OSDEP_INTF_H_ - -#include -#include -#include - -#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2) - - -struct intf_priv { - - u8 *intf_dev; - u32 max_iosz; //USB2.0: 128, USB1.1: 64, SDIO:64 - u32 max_xmitsz; //USB2.0: unlimited, SDIO:512 - u32 max_recvsz; //USB2.0: unlimited, SDIO:512 - - volatile u8 *io_rwmem; - volatile u8 *allocated_io_rwmem; - u32 io_wsz; //unit: 4bytes - u32 io_rsz;//unit: 4bytes - u8 intf_status; - - void (*_bus_io)(u8 *priv); - -/* -Under Sync. IRP (SDIO/USB) -A protection mechanism is necessary for the io_rwmem(read/write protocol) - -Under Async. IRP (SDIO/USB) -The protection mechanism is through the pending queue. -*/ - - _mutex ioctl_mutex; - - -#ifdef PLATFORM_LINUX - #ifdef CONFIG_USB_HCI - // when in USB, IO is through interrupt in/out endpoints - struct usb_device *udev; - PURB piorw_urb; - u8 io_irp_cnt; - u8 bio_irp_pending; - _sema io_retevt; - _timer io_timer; - u8 bio_irp_timeout; - u8 bio_timer_cancel; - #endif -#endif - -#ifdef PLATFORM_OS_XP - #ifdef CONFIG_SDIO_HCI - // below is for io_rwmem... - PMDL pmdl; - PSDBUS_REQUEST_PACKET sdrp; - PSDBUS_REQUEST_PACKET recv_sdrp; - PSDBUS_REQUEST_PACKET xmit_sdrp; - - PIRP piorw_irp; - - #endif - #ifdef CONFIG_USB_HCI - PURB piorw_urb; - PIRP piorw_irp; - u8 io_irp_cnt; - u8 bio_irp_pending; - _sema io_retevt; - #endif -#endif - -}; - - -#ifdef CONFIG_R871X_TEST -int rtw_start_pseudo_adhoc(_adapter *padapter); -int rtw_stop_pseudo_adhoc(_adapter *padapter); -#endif - -u8 rtw_init_drv_sw(_adapter *padapter); -u8 rtw_free_drv_sw(_adapter *padapter); -u8 rtw_reset_drv_sw(_adapter *padapter); - -u32 rtw_start_drv_threads(_adapter *padapter); -void rtw_stop_drv_threads (_adapter *padapter); -void rtw_cancel_all_timer(_adapter *padapter); - -#ifdef PLATFORM_LINUX -int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); - -int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname); -struct net_device *rtw_init_netdev(_adapter *padapter); - -#ifdef CONFIG_PROC_DEBUG -void rtw_proc_init_one(struct net_device *dev); -void rtw_proc_remove_one(struct net_device *dev); -#endif -#endif - - -void rtw_ips_dev_unload(_adapter *padapter); -#ifdef CONFIG_IPS -int rtw_ips_pwr_up(_adapter *padapter); -void rtw_ips_pwr_down(_adapter *padapter); -#endif - - -#endif //_OSDEP_INTF_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/osdep_service.h b/drivers/net/wireless/rtl8192c/include/osdep_service.h deleted file mode 100755 index 4aa6478e3a59..000000000000 --- a/drivers/net/wireless/rtl8192c/include/osdep_service.h +++ /dev/null @@ -1,808 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __OSDEP_SERVICE_H_ -#define __OSDEP_SERVICE_H_ - -#include -#include -//#include - -#define _SUCCESS 1 -#define _FAIL 0 - -#undef _TRUE -#define _TRUE 1 - -#undef _FALSE -#define _FALSE 0 - - -#ifdef PLATFORM_LINUX - #include - #include - #include - #include - #include - #include - #include - #include -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5)) - #include -#endif - #include - #include - #include - #include - #include - #include - #include - #include -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) - #include -#else - #include -#endif - #include - #include - #include - #include - #include - #include - #include - #include - #include // Necessary because we use the proc fs - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - #include - #include - #include -#endif - -#ifdef CONFIG_USB_HCI - #include -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) - #include -#else - #include -#endif -#endif - -#ifdef CONFIG_SDIO_HCI - #include - #include -#endif - -#ifdef CONFIG_PCI_HCI - #include -#endif - - -#ifdef CONFIG_USB_HCI - typedef struct urb * PURB; -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) -#ifdef CONFIG_USB_SUSPEND -#define CONFIG_AUTOSUSPEND 1 -#endif -#endif -#endif - - typedef struct semaphore _sema; - typedef spinlock_t _lock; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - typedef struct mutex _mutex; -#else - typedef struct semaphore _mutex; -#endif - typedef struct timer_list _timer; - - struct __queue { - struct list_head queue; - _lock lock; - }; - - typedef struct sk_buff _pkt; - typedef unsigned char _buffer; - - typedef struct __queue _queue; - typedef struct list_head _list; - typedef int _OS_STATUS; - //typedef u32 _irqL; - typedef unsigned long _irqL; - typedef struct net_device * _nic_hdl; - - typedef pid_t _thread_hdl_; - typedef int thread_return; - typedef void* thread_context; - - #define thread_exit() complete_and_exit(NULL, 0) - - typedef void timer_hdl_return; - typedef void* timer_hdl_context; - typedef struct work_struct _workitem; - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) - #define skb_tail_pointer(skb) skb->tail -#endif - -__inline static _list *get_next(_list *list) -{ - return list->next; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - - -#define LIST_CONTAINOR(ptr, type, member) \ - ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) - - -__inline static void _enter_critical(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_lock_irqsave(plock, *pirqL); -} - -__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - spin_unlock_irqrestore(plock, *pirqL); -} - -__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_lock_bh(plock); -} - -__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) -{ - spin_unlock_bh(plock); -} - -__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - mutex_lock(pmutex); -#else - down(pmutex); -#endif -} - - -__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - mutex_unlock(pmutex); -#else - up(pmutex); -#endif -} - -__inline static void rtw_list_delete(_list *plist) -{ - list_del_init(plist); -} - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,void* cntx) -{ - //setup_timer(ptimer, pfunc,(u32)cntx); - ptimer->function = pfunc; - ptimer->data = (unsigned long)cntx; - init_timer(ptimer); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - del_timer_sync(ptimer); - *bcancelled= _TRUE;//TRUE ==1; FALSE==0 -} - -#ifdef PLATFORM_LINUX -#define RTW_TIMER_HDL_ARGS void *FunctionContext -#elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS) -#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 -#endif - -#define RTW_TIMER_HDL_NAME(name) rtw_##name##_timer_hdl -#define RTW_DECLARE_TIMER_HDL(name) void RTW_TIMER_HDL_NAME(name)(RTW_TIMER_HDL_ARGS) - - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) - INIT_WORK(pwork, pfunc); -#else - INIT_WORK(pwork, pfunc,pwork); -#endif -} - -__inline static void _set_workitem(_workitem *pwork) -{ - schedule_work(pwork); -} - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\ - { \ - atomic_dec((atomic_t *)&(_MutexCounter)); \ - msleep(10); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - atomic_dec((atomic_t *)&(_MutexCounter)); \ -} - -#endif // PLATFORM_LINUX - - -#ifdef PLATFORM_OS_XP - - #include - #include - #include - #include - #include - -#ifdef CONFIG_USB_HCI - #include - #include - #include -#endif - - typedef KSEMAPHORE _sema; - typedef LIST_ENTRY _list; - typedef NDIS_STATUS _OS_STATUS; - - - typedef NDIS_SPIN_LOCK _lock; - - typedef KMUTEX _mutex; - - typedef KIRQL _irqL; - - // USB_PIPE for WINCE , but handle can be use just integer under windows - typedef NDIS_HANDLE _nic_hdl; - - - typedef NDIS_MINIPORT_TIMER _timer; - - struct __queue { - LIST_ENTRY queue; - _lock lock; - }; - - typedef NDIS_PACKET _pkt; - typedef NDIS_BUFFER _buffer; - typedef struct __queue _queue; - - typedef PKTHREAD _thread_hdl_; - typedef void thread_return; - typedef void* thread_context; - - typedef NDIS_WORK_ITEM _workitem; - - #define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS); - - #define HZ 10000000 - #define SEMA_UPBND (0x7FFFFFFF) //8192 - -__inline static _list *get_next(_list *list) -{ - return list->Flink; -} - -__inline static _list *get_list_head(_queue *queue) -{ - return (&(queue->queue)); -} - - -#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) - - -__inline static _enter_critical(_lock *plock, _irqL *pirqL) -{ - NdisAcquireSpinLock(plock); -} - -__inline static _exit_critical(_lock *plock, _irqL *pirqL) -{ - NdisReleaseSpinLock(plock); -} - - -__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - -__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) -{ - NdisDprAcquireSpinLock(plock); -} - -__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) -{ - NdisDprReleaseSpinLock(plock); -} - -__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - KeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL); -} - - -__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) -{ - KeReleaseMutex(pmutex, FALSE); -} - - -__inline static void rtw_list_delete(_list *plist) -{ - RemoveEntryList(plist); - InitializeListHead(plist); -} - -__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) -{ - NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); -} - -__inline static void _set_timer(_timer *ptimer,u32 delay_time) -{ - NdisMSetTimer(ptimer,delay_time); -} - -__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) -{ - NdisMCancelTimer(ptimer,bcancelled); -} - -__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) -{ - - NdisInitializeWorkItem(pwork, pfunc, cntx); -} - -__inline static void _set_workitem(_workitem *pwork) -{ - NdisScheduleWorkItem(pwork); -} - - -#define ATOMIC_INIT(i) { (i) } - -// -// Global Mutex: can only be used at PASSIVE level. -// - -#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ - { \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ - NdisMSleep(10000); \ - } \ -} - -#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ -{ \ - NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ -} - -#endif // PLATFORM_OS_XP - - -#ifdef PLATFORM_OS_CE -#include -#endif - -#include - -#ifndef BIT - #define BIT(x) ( 1 << (x)) -#endif - -#ifdef DBG_MEM_ALLOC -void rtw_dump_mem_stat (void); -extern u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line); -extern u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line); -extern void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line); -extern u8* dbg_rtw_malloc(u32 sz, const char *func, int line); -extern u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line); -extern void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line); -#define rtw_vmalloc(sz) dbg_rtw_vmalloc((sz), __FUNCTION__, __LINE__) -#define rtw_zvmalloc(sz) dbg_rtw_zvmalloc((sz), __FUNCTION__, __LINE__) -#define rtw_vmfree(pbuf, sz) dbg_rtw_vmfree((pbuf), (sz), __FUNCTION__, __LINE__) -#define rtw_malloc(sz) dbg_rtw_malloc((sz), __FUNCTION__, __LINE__) -#define rtw_zmalloc(sz) dbg_rtw_zmalloc((sz), __FUNCTION__, __LINE__) -#define rtw_mfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), __FUNCTION__, __LINE__) -#else -extern u8* _rtw_vmalloc(u32 sz); -extern u8* _rtw_zvmalloc(u32 sz); -extern void _rtw_vmfree(u8 *pbuf, u32 sz); -extern u8* _rtw_zmalloc(u32 sz); -extern u8* _rtw_malloc(u32 sz); -extern void _rtw_mfree(u8 *pbuf, u32 sz); -#define rtw_vmalloc(sz) _rtw_vmalloc((sz)) -#define rtw_zvmalloc(sz) _rtw_zvmalloc((sz)) -#define rtw_vmfree(pbuf, sz) _rtw_vmfree((pbuf), (sz)) -#define rtw_malloc(sz) _rtw_malloc((sz)) -#define rtw_zmalloc(sz) _rtw_zmalloc((sz)) -#define rtw_mfree(pbuf, sz) _rtw_mfree((pbuf), (sz)) -#endif - -extern void _rtw_memcpy(void* dec, void* sour, u32 sz); -extern int _rtw_memcmp(void *dst, void *src, u32 sz); -extern void _rtw_memset(void *pbuf, int c, u32 sz); - -extern void _rtw_init_listhead(_list *list); -extern u32 rtw_is_list_empty(_list *phead); -extern void rtw_list_insert_tail(_list *plist, _list *phead); -extern void rtw_list_delete(_list *plist); - -extern void _rtw_init_sema(_sema *sema, int init_val); -extern void _rtw_free_sema(_sema *sema); -extern void _rtw_up_sema(_sema *sema); -extern u32 _rtw_down_sema(_sema *sema); -extern void _rtw_mutex_init(_mutex *pmutex); -extern void _rtw_spinlock_init(_lock *plock); -extern void _rtw_spinlock_free(_lock *plock); -extern void _rtw_spinlock(_lock *plock); -extern void _rtw_spinunlock(_lock *plock); -extern void _rtw_spinlock_ex(_lock *plock); -extern void _rtw_spinunlock_ex(_lock *plock); - -extern void _rtw_init_queue(_queue *pqueue); -extern u32 _rtw_queue_empty(_queue *pqueue); -extern u32 rtw_end_of_queue_search(_list *queue, _list *pelement); - -extern u32 rtw_get_current_time(void); -extern u32 rtw_systime_to_ms(u32 systime); -extern s32 rtw_get_passing_time_ms(u32 start); -extern s32 rtw_get_time_interval_ms(u32 start, u32 end); - -extern void rtw_sleep_schedulable(int ms); - -extern void rtw_msleep_os(int ms); -extern void rtw_usleep_os(int us); - -#ifdef DBG_DELAY_OS -#define rtw_mdelay_os(ms) _rtw_mdelay_os((ms), __FUNCTION__, __LINE__) -#define rtw_udelay_os(ms) _rtw_udelay_os((ms), __FUNCTION__, __LINE__) -extern void _rtw_mdelay_os(int ms, const char *func, const int line); -extern void _rtw_udelay_os(int us, const char *func, const int line); -#else -extern void rtw_mdelay_os(int ms); -extern void rtw_udelay_os(int us); -#endif - - - -__inline static unsigned char _cancel_timer_ex(_timer *ptimer) -{ -#ifdef PLATFORM_LINUX - return del_timer_sync(ptimer); -#endif - -#ifdef PLATFORM_WINDOWS - u8 bcancelled; - - _cancel_timer(ptimer, &bcancelled); - - return bcancelled; -#endif -} - -__inline static void thread_enter(void *context) -{ -#ifdef PLATFORM_LINUX - //struct net_device *pnetdev = (struct net_device *)context; - //daemonize("%s", pnetdev->name); - daemonize("%s", "RTKTHREAD"); - allow_signal(SIGTERM); -#endif -} - -__inline static void flush_signals_thread(void) -{ -#ifdef PLATFORM_LINUX - if (signal_pending (current)) - { - flush_signals(current); - } -#endif -} - -__inline static _OS_STATUS res_to_status(sint res) -{ - - -#if defined (PLATFORM_LINUX) || defined (PLATFORM_MPIXEL) - return res; -#endif - -#ifdef PLATFORM_WINDOWS - - if (res == _SUCCESS) - return NDIS_STATUS_SUCCESS; - else - return NDIS_STATUS_FAILURE; - -#endif - -} - -__inline static u32 _RND4(u32 sz) -{ - - u32 val; - - val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2; - - return val; - -} - -__inline static u32 _RND8(u32 sz) -{ - - u32 val; - - val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3; - - return val; - -} - -__inline static u32 _RND128(u32 sz) -{ - - u32 val; - - val = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7; - - return val; - -} - -__inline static u32 _RND256(u32 sz) -{ - - u32 val; - - val = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8; - - return val; - -} - -__inline static u32 _RND512(u32 sz) -{ - - u32 val; - - val = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9; - - return val; - -} - -__inline static u32 bitshift(u32 bitmask) -{ - u32 i; - - for (i = 0; i <= 31; i++) - if (((bitmask>>i) & 0x1) == 1) break; - - return i; -} - -#ifndef MAC_FMT -#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" -#endif -#ifndef MAC_ARG -#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] -#endif - -//#ifdef __GNUC__ -#ifdef PLATFORM_LINUX -#define STRUCT_PACKED __attribute__ ((packed)) -#else -#define STRUCT_PACKED -#endif - - -// limitation of path length -#ifdef PLATFORM_LINUX - #define PATH_LENGTH_MAX PATH_MAX -#elif defined(PLATFORM_WINDOWS) - #define PATH_LENGTH_MAX MAX_PATH -#endif - - -// Suspend lock prevent system from going suspend -#ifdef CONFIG_WAKELOCK -#include -#elif defined(CONFIG_ANDROID_POWER) -#include -#endif - -extern void rtw_suspend_lock_init(void); -extern void rtw_suspend_lock_uninit(void); -extern void rtw_lock_suspend(void); -extern void rtw_unlock_suspend(void); - - -//Atomic integer operations -#ifdef PLATFORM_LINUX - #define ATOMIC_T atomic_t -#elif defined(PLATFORM_WINDOWS) - #define ATOMIC_T LONG -#endif - -extern void ATOMIC_SET(ATOMIC_T *v, int i); -extern int ATOMIC_READ(ATOMIC_T *v); -extern void ATOMIC_ADD(ATOMIC_T *v, int i); -extern void ATOMIC_SUB(ATOMIC_T *v, int i); -extern void ATOMIC_INC(ATOMIC_T *v); -extern void ATOMIC_DEC(ATOMIC_T *v); -extern int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i); -extern int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i); -extern int ATOMIC_INC_RETURN(ATOMIC_T *v); -extern int ATOMIC_DEC_RETURN(ATOMIC_T *v); - -//File operation APIs, just for linux now -#ifdef PLATFORM_LINUX -extern int openFile(struct file **fpp, char *path,int flag,int mode); -extern int closeFile(struct file *fp); -extern int readFile(struct file *fp,char *buf,int len); -extern int writeFile(struct file *fp,char *buf,int len); -#endif - - -#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR -struct rtw_netdev_priv_indicator { - void *priv; - u32 sizeof_priv; -}; -struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv); -extern struct net_device * rtw_alloc_etherdev(int sizeof_priv); -#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv ) -extern void rtw_free_netdev(struct net_device * netdev); -#else -#define rtw_alloc_etherdev(sizeof_priv) alloc_etherdev((sizeof_priv)) -#define rtw_netdev_priv(netdev) netdev_priv((netdev)) -#define rtw_free_netdev(netdev) free_netdev((netdev)) -#endif - -#ifdef PLATFORM_LINUX -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) -#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1) -#else -#define rtw_signal_process(pid, sig) kill_proc((pid), (sig), 1) -#endif -#endif //PLATFORM_LINUX - -extern u64 rtw_modular64(u64 x, u64 y); -extern u64 rtw_division64(u64 x, u64 y); - - -/* Macros for handling unaligned memory accesses */ - -#define RTW_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) -#define RTW_PUT_BE16(a, val) \ - do { \ - (a)[0] = ((u16) (val)) >> 8; \ - (a)[1] = ((u16) (val)) & 0xff; \ - } while (0) - -#define RTW_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0])) -#define RTW_PUT_LE16(a, val) \ - do { \ - (a)[1] = ((u16) (val)) >> 8; \ - (a)[0] = ((u16) (val)) & 0xff; \ - } while (0) - -#define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ - ((u32) (a)[2])) -#define RTW_PUT_BE24(a, val) \ - do { \ - (a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[2] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define RTW_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ - (((u32) (a)[2]) << 8) | ((u32) (a)[3])) -#define RTW_PUT_BE32(a, val) \ - do { \ - (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[3] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define RTW_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \ - (((u32) (a)[1]) << 8) | ((u32) (a)[0])) -#define RTW_PUT_LE32(a, val) \ - do { \ - (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[0] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define RTW_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \ - (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \ - (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \ - (((u64) (a)[6]) << 8) | ((u64) (a)[7])) -#define RTW_PUT_BE64(a, val) \ - do { \ - (a)[0] = (u8) (((u64) (val)) >> 56); \ - (a)[1] = (u8) (((u64) (val)) >> 48); \ - (a)[2] = (u8) (((u64) (val)) >> 40); \ - (a)[3] = (u8) (((u64) (val)) >> 32); \ - (a)[4] = (u8) (((u64) (val)) >> 24); \ - (a)[5] = (u8) (((u64) (val)) >> 16); \ - (a)[6] = (u8) (((u64) (val)) >> 8); \ - (a)[7] = (u8) (((u64) (val)) & 0xff); \ - } while (0) - -#define RTW_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \ - (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \ - (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \ - (((u64) (a)[1]) << 8) | ((u64) (a)[0])) - -#endif - - diff --git a/drivers/net/wireless/rtl8192c/include/pci_hal.h b/drivers/net/wireless/rtl8192c/include/pci_hal.h deleted file mode 100755 index 1ee0ee2c226b..000000000000 --- a/drivers/net/wireless/rtl8192c/include/pci_hal.h +++ /dev/null @@ -1,168 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __PCI_HAL_H__ -#define __PCI_HAL_H__ - - -#define INTEL_VENDOR_ID 0x8086 -#define SIS_VENDOR_ID 0x1039 -#define ATI_VENDOR_ID 0x1002 -#define ATI_DEVICE_ID 0x7914 -#define AMD_VENDOR_ID 0x1022 - -#define PCI_MAX_BRIDGE_NUMBER 255 -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 - -#define PCI_CONF_ADDRESS 0x0CF8 // PCI Configuration Space Address -#define PCI_CONF_DATA 0x0CFC // PCI Configuration Space Data - -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 - -#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 - -#define U1DONTCARE 0xFF -#define U2DONTCARE 0xFFFF -#define U4DONTCARE 0xFFFFFFFF - -#define PCI_VENDER_ID_REALTEK 0x10ec - -#define HAL_HW_PCI_8180_DEVICE_ID 0x8180 -#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 //8185 or 8185b -#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 //8185b -#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 //8185b -#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 //8190 -#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 //8723E -#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 //8192 PCI-E -#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 //8192 SE -#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 //8192 SE -#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 //8191 SE Crab -#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 //8191 SE RE -#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 //8191 SE Unicron -#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 //8190 PCI for Ceraga -#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 //8190 Cardbus for Ceraga -#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 //8192e PCIE for Ceraga -#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 //8192e Express Card for Ceraga -#define HAL_HW_PCI_700F_DEVICE_ID 0x700F -#define HAL_HW_PCI_701F_DEVICE_ID 0x701F -#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304 -#define HAL_HW_PCI_8192CET_DEVICE_ID 0x8191 //8192ce -#define HAL_HW_PCI_8192CE_DEVICE_ID 0x8178 //8192ce -#define HAL_HW_PCI_8191CE_DEVICE_ID 0x8177 //8192ce -#define HAL_HW_PCI_8188CE_DEVICE_ID 0x8176 //8192ce -#define HAL_HW_PCI_8192CU_DEVICE_ID 0x8191 //8192ce -#define HAL_HW_PCI_8192DE_DEVICE_ID 0x8193 //8192de -#define HAL_HW_PCI_002B_DEVICE_ID 0x002B //8192de, provided by HW SD - -#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 //8190 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 //8192 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 //8192 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8192SE 0x10 -#define HAL_HW_PCI_REVISION_ID_8192CE 0x1 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 //8192 support 16 pages of IO registers -#define HAL_HW_PCI_REVISION_ID_8192DE 0x0 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 //8192 support 16 pages of IO registers - -enum pci_bridge_vendor { - PCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001 - PCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010 - PCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100 - PCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000 - PCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000 - PCI_BRIDGE_VENDOR_MAX ,//= 0x80 -} ; - -struct rt_pci_capabilities_header { - u8 capability_id; - u8 next; -}; - -struct pci_priv{ - u8 linkctrl_reg; - - u8 busnumber; - u8 devnumber; - u8 funcnumber; - - u8 pcibridge_busnum; - u8 pcibridge_devnum; - u8 pcibridge_funcnum; - u8 pcibridge_vendor; - u16 pcibridge_vendorid; - u16 pcibridge_deviceid; - u8 pcibridge_pciehdr_offset; - u8 pcibridge_linkctrlreg; - - u8 amd_l1_patch; -}; - -typedef struct _RT_ISR_CONTENT -{ - union{ - u32 IntArray[2]; - u32 IntReg4Byte; - u16 IntReg2Byte; - }; -}RT_ISR_CONTENT, *PRT_ISR_CONTENT; - -//#define RegAddr(addr) (addr + 0xB2000000UL) -//some platform macros will def here -static inline void NdisRawWritePortUlong(u32 port, u32 val) -{ - outl(val, port); - //writel(val, (u8 *)RegAddr(port)); -} - -static inline void NdisRawWritePortUchar(u32 port, u8 val) -{ - outb(val, port); - //writeb(val, (u8 *)RegAddr(port)); -} - -static inline void NdisRawReadPortUchar(u32 port, u8 *pval) -{ - *pval = inb(port); - //*pval = readb((u8 *)RegAddr(port)); -} - -static inline void NdisRawReadPortUshort(u32 port, u16 *pval) -{ - *pval = inw(port); - //*pval = readw((u8 *)RegAddr(port)); -} - -static inline void NdisRawReadPortUlong(u32 port, u32 *pval) -{ - *pval = inl(port); - //*pval = readl((u8 *)RegAddr(port)); -} - -#ifdef CONFIG_RTL8192C -void rtl8192ce_set_hal_ops(_adapter * padapter); -#endif -#ifdef CONFIG_RTL8192D -void rtl8192de_set_hal_ops(_adapter * padapter); -#endif - -#endif //__PCIE_HAL_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/pci_ops.h b/drivers/net/wireless/rtl8192c/include/pci_ops.h deleted file mode 100755 index dd63f5f87d43..000000000000 --- a/drivers/net/wireless/rtl8192c/include/pci_ops.h +++ /dev/null @@ -1,58 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __PCI_OPS_H_ -#define __PCI_OPS_H_ - -#include -#include -#include -#include - -#ifdef CONFIG_RTL8192C -u32 rtl8192ce_init_desc_ring(_adapter * padapter); -u32 rtl8192ce_free_desc_ring(_adapter * padapter); -void rtl8192ce_reset_desc_ring(_adapter * padapter); -#ifdef CONFIG_64BIT_DMA -u8 PlatformEnable92CEDMA64(PADAPTER Adapter); -#endif -int rtl8192ce_interrupt(PADAPTER Adapter); -void rtl8192ce_xmit_tasklet(void *priv); -void rtl8192ce_recv_tasklet(void *priv); -void rtl8192ce_prepare_bcn_tasklet(void *priv); -void rtl8192ce_set_intf_ops(struct _io_ops *pops); -#endif - -#ifdef CONFIG_RTL8192D -u32 rtl8192de_init_desc_ring(_adapter * padapter); -u32 rtl8192de_free_desc_ring(_adapter * padapter); -void rtl8192de_reset_desc_ring(_adapter * padapter); -#ifdef CONFIG_64BIT_DMA -u8 PlatformEnable92DEDMA64(PADAPTER Adapter); -#endif -int rtl8192de_interrupt(PADAPTER Adapter); -void rtl8192de_xmit_tasklet(void *priv); -void rtl8192de_recv_tasklet(void *priv); -void rtl8192de_prepare_bcn_tasklet(void *priv); -void rtl8192de_set_intf_ops(struct _io_ops *pops); -u32 MpReadPCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u8 Direct); -void MpWritePCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u32 Value, IN u8 Direct); -#endif - -#endif diff --git a/drivers/net/wireless/rtl8192c/include/pci_osintf.h b/drivers/net/wireless/rtl8192c/include/pci_osintf.h deleted file mode 100755 index 09715af43781..000000000000 --- a/drivers/net/wireless/rtl8192c/include/pci_osintf.h +++ /dev/null @@ -1,33 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __PCI_OSINTF_H -#define __PCI_OSINTF_H - -#include -#include -#include - - -void rtw_pci_disable_aspm(_adapter *padapter); -void rtw_pci_enable_aspm(_adapter *padapter); - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/recv_osdep.h b/drivers/net/wireless/rtl8192c/include/recv_osdep.h deleted file mode 100755 index 536ed3100ae2..000000000000 --- a/drivers/net/wireless/rtl8192c/include/recv_osdep.h +++ /dev/null @@ -1,58 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RECV_OSDEP_H_ -#define __RECV_OSDEP_H_ - -#include -#include -#include - - -extern sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); -extern void _rtw_free_recv_priv (struct recv_priv *precvpriv); - - -extern s32 rtw_recv_entry(union recv_frame *precv_frame); -extern int rtw_recv_indicatepkt(_adapter *adapter, union recv_frame *precv_frame); -extern void rtw_recv_returnpacket(IN _nic_hdl cnxt, IN _pkt *preturnedpkt); - -extern void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame); -extern void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup); - - -int rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); -void rtw_free_recv_priv (struct recv_priv *precvpriv); - - -int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter); -int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe); -void rtw_os_recv_resource_free(struct recv_priv *precvpriv); - - -int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf); -int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf); - -void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf); - -void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl); - - -#endif // - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h deleted file mode 100755 index c6f177348b5b..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h +++ /dev/null @@ -1,98 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192C_CMD_H_ -#define __RTL8192C_CMD_H_ - - -enum cmd_msg_element_id -{ - NONE_CMDMSG_EID, - AP_OFFLOAD_EID=0, - SET_PWRMODE_EID=1, - JOINBSS_RPT_EID=2, - RSVD_PAGE_EID=3, - RSSI_4_EID = 4, - RSSI_SETTING_EID=5, - MACID_CONFIG_EID=6, - MACID_PS_MODE_EID=7, - P2P_PS_OFFLOAD_EID=8, - SELECTIVE_SUSPEND_ROF_CMD=9, - P2P_PS_CTW_CMD_EID=32, - MAX_CMDMSG_EID -}; - -struct cmd_msg_parm { - u8 eid; //element id - u8 sz; // sz - u8 buf[6]; -}; - -typedef struct _SETPWRMODE_PARM{ - u8 Mode; - u8 SmartPS; - u8 BcnPassTime; // unit: 100ms -}SETPWRMODE_PARM, *PSETPWRMODE_PARM; - -struct H2C_SS_RFOFF_PARAM{ - u8 ROFOn; // 1: on, 0:off - u16 gpio_period; // unit: 1024 us -}__attribute__ ((packed)); - - -typedef struct JOINBSSRPT_PARM{ - u8 OpMode; // RT_MEDIA_STATUS -}JOINBSSRPT_PARM, *PJOINBSSRPT_PARM; - -typedef struct _RSVDPAGE_LOC{ - u8 LocProbeRsp; - u8 LocPsPoll; - u8 LocNullData; -}RSVDPAGE_LOC, *PRSVDPAGE_LOC; - -struct P2P_PS_Offload_t { - unsigned char Offload_En:1; - unsigned char role:1; // 1: Owner, 0: Client - unsigned char CTWindow_En:1; - unsigned char NoA0_En:1; - unsigned char NoA1_En:1; - unsigned char AllStaSleep:1; // Only valid in Owner - unsigned char discovery:1; - unsigned char rsvd:1; -}; - -struct P2P_PS_CTWPeriod_t { - unsigned char CTWPeriod; //TU -}; - -// host message to firmware cmd -void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode); -void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus); -u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param); -u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg); -void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg); -u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter*padapter,u8 bfwpoll, u16 period); -#ifdef CONFIG_P2P -void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state); -#endif //CONFIG_P2P - -#endif - - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h deleted file mode 100755 index 2e208adb9694..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h +++ /dev/null @@ -1,608 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192C_DM_H__ -#define __RTL8192C_DM_H__ -//============================================================ -// Description: -// -// This file is for 92CE/92CU dynamic mechanism only -// -// -//============================================================ - -#define RSSI_CCK 0 -#define RSSI_OFDM 1 - -#define OFDM_TABLE_SIZE 37 -#define CCK_TABLE_SIZE 33 - -static u32 OFDMSwingTable[OFDM_TABLE_SIZE] = { - 0x7f8001fe, // 0, +6.0dB - 0x788001e2, // 1, +5.5dB - 0x71c001c7, // 2, +5.0dB - 0x6b8001ae, // 3, +4.5dB - 0x65400195, // 4, +4.0dB - 0x5fc0017f, // 5, +3.5dB - 0x5a400169, // 6, +3.0dB - 0x55400155, // 7, +2.5dB - 0x50800142, // 8, +2.0dB - 0x4c000130, // 9, +1.5dB - 0x47c0011f, // 10, +1.0dB - 0x43c0010f, // 11, +0.5dB - 0x40000100, // 12, +0dB - 0x3c8000f2, // 13, -0.5dB - 0x390000e4, // 14, -1.0dB - 0x35c000d7, // 15, -1.5dB - 0x32c000cb, // 16, -2.0dB - 0x300000c0, // 17, -2.5dB - 0x2d4000b5, // 18, -3.0dB - 0x2ac000ab, // 19, -3.5dB - 0x288000a2, // 20, -4.0dB - 0x26000098, // 21, -4.5dB - 0x24000090, // 22, -5.0dB - 0x22000088, // 23, -5.5dB - 0x20000080, // 24, -6.0dB - 0x1e400079, // 25, -6.5dB - 0x1c800072, // 26, -7.0dB - 0x1b00006c, // 27. -7.5dB - 0x19800066, // 28, -8.0dB - 0x18000060, // 29, -8.5dB - 0x16c0005b, // 30, -9.0dB - 0x15800056, // 31, -9.5dB - 0x14400051, // 32, -10.0dB - 0x1300004c, // 33, -10.5dB - 0x12000048, // 34, -11.0dB - 0x11000044, // 35, -11.5dB - 0x10000040, // 36, -12.0dB -}; - -static u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = { -{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB -{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB -{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB -{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB -{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB -{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB -{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB -{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB -{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB -{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB -{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB -{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB -{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB -{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB -{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB -{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB -{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB -{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB -{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB -{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB -{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB -{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB -{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB -{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB -{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB -{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB -{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB -{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB -{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB -{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB -{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB -{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB -{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB -}; - -static u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= { -{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB -{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB -{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB -{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB -{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB -{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB -{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB -{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB -{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB -{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB -{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB -{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB -{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB -{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB -{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB -{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB -{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB -{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB -{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB -{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB -{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB -{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB -{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB -{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB -{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB -{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB -{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB -{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB -{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB -{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB -{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB -{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB -{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB -}; - -//============================================================ -// structure and define -//============================================================ - -typedef struct _FALSE_ALARM_STATISTICS{ - u32 Cnt_Parity_Fail; - u32 Cnt_Rate_Illegal; - u32 Cnt_Crc8_fail; - u32 Cnt_Mcs_fail; - u32 Cnt_Ofdm_fail; - u32 Cnt_Cck_fail; - u32 Cnt_all; - u32 Cnt_Fast_Fsync; - u32 Cnt_SB_Search_fail; -}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; - -typedef struct _Dynamic_Power_Saving_ -{ - u8 PreCCAState; - u8 CurCCAState; - - u8 PreRFState; - u8 CurRFState; - - s32 Rssi_val_min; - -}PS_T; - -typedef struct _Dynamic_Initial_Gain_Threshold_ -{ - u8 Dig_Enable_Flag; - u8 Dig_Ext_Port_Stage; - - int RssiLowThresh; - int RssiHighThresh; - - u32 FALowThresh; - u32 FAHighThresh; - - u8 CurSTAConnectState; - u8 PreSTAConnectState; - u8 CurMultiSTAConnectState; - - u8 PreIGValue; - u8 CurIGValue; - - char BackoffVal; - char BackoffVal_range_max; - char BackoffVal_range_min; - u8 rx_gain_range_max; - u8 rx_gain_range_min; - u8 Rssi_val_min; - - u8 PreCCKPDState; - u8 CurCCKPDState; - u8 PreCCKFAState; - u8 CurCCKFAState; - u8 PreCCAState; - u8 CurCCAState; - - u8 LargeFAHit; - u8 ForbiddenIGI; - u32 Recover_cnt; - -}DIG_T; - -typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition -{ - DIG_TYPE_THRESH_HIGH = 0, - DIG_TYPE_THRESH_LOW = 1, - DIG_TYPE_BACKOFF = 2, - DIG_TYPE_RX_GAIN_MIN = 3, - DIG_TYPE_RX_GAIN_MAX = 4, - DIG_TYPE_ENABLE = 5, - DIG_TYPE_DISABLE = 6, - DIG_OP_TYPE_MAX -}DM_DIG_OP_E; - -typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition -{ - CCK_PD_STAGE_LowRssi = 0, - CCK_PD_STAGE_HighRssi = 1, - CCK_PD_STAGE_MAX = 3, -}DM_CCK_PDTH_E; - -typedef enum tag_1R_CCA_Type_Definition -{ - CCA_1R =0, - CCA_2R = 1, - CCA_MAX = 2, -}DM_1R_CCA_E; - -typedef enum tag_RF_Type_Definition -{ - RF_Save =0, - RF_Normal = 1, - RF_MAX = 2, -}DM_RF_E; - -typedef enum tag_DIG_EXT_PORT_ALGO_Definition -{ - DIG_EXT_PORT_STAGE_0 = 0, - DIG_EXT_PORT_STAGE_1 = 1, - DIG_EXT_PORT_STAGE_2 = 2, - DIG_EXT_PORT_STAGE_3 = 3, - DIG_EXT_PORT_STAGE_MAX = 4, -}DM_DIG_EXT_PORT_ALG_E; - - -typedef enum tag_DIG_Connect_Definition -{ - DIG_STA_DISCONNECT = 0, - DIG_STA_CONNECT = 1, - DIG_STA_BEFORE_CONNECT = 2, - DIG_MultiSTA_DISCONNECT = 3, - DIG_MultiSTA_CONNECT = 4, - DIG_CONNECT_MAX -}DM_DIG_CONNECT_E; - - - -typedef enum _BT_Ant_NUM{ - Ant_x2 = 0, - Ant_x1 = 1 -} BT_Ant_NUM, *PBT_Ant_NUM; - -typedef enum _BT_CoType{ - BT_2Wire = 0, - BT_ISSC_3Wire = 1, - BT_Accel = 2, - BT_CSR_BC4 = 3, - BT_CSR_BC8 = 4, - BT_RTL8756 = 5, -} BT_CoType, *PBT_CoType; - -typedef enum _BT_CurState{ - BT_OFF = 0, - BT_ON = 1, -} BT_CurState, *PBT_CurState; - -typedef enum _BT_ServiceType{ - BT_SCO = 0, - BT_A2DP = 1, - BT_HID = 2, - BT_HID_Idle = 3, - BT_Scan = 4, - BT_Idle = 5, - BT_OtherAction = 6, - BT_Busy = 7, - BT_OtherBusy = 8, - BT_PAN = 9, -} BT_ServiceType, *PBT_ServiceType; - -typedef enum _BT_RadioShared{ - BT_Radio_Shared = 0, - BT_Radio_Individual = 1, -} BT_RadioShared, *PBT_RadioShared; - -struct btcoexist_priv { - u8 BT_Coexist; - u8 BT_Ant_Num; - u8 BT_CoexistType; - u8 BT_State; - u8 BT_CUR_State; //0:on, 1:off - u8 BT_Ant_isolation; //0:good, 1:bad - u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic - u8 BT_Service; - u8 BT_Ampdu; // 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. - u8 BT_RadioSharedType; - u32 Ratio_Tx; - u32 Ratio_PRI; - u8 BtRfRegOrigin1E; - u8 BtRfRegOrigin1F; - u8 BtRssiState; - u32 BtEdcaUL; - u32 BtEdcaDL; - u32 BT_EDCA[2]; - u8 bCOBT; - - u8 bInitSet; - u8 bBTBusyTraffic; - u8 bBTTrafficModeSet; - u8 bBTNonTrafficModeSet; - //BTTraffic BT21TrafficStatistics; - u32 CurrentState; - u32 PreviousState; - u8 BtPreRssiState; - u8 bFWCoexistAllOff; - u8 bSWCoexistAllOff; -}; - -#define BW_AUTO_SWITCH_HIGH_LOW 25 -#define BW_AUTO_SWITCH_LOW_HIGH 30 - -#define DM_DIG_THRESH_HIGH 40 -#define DM_DIG_THRESH_LOW 35 - -#define DM_FALSEALARM_THRESH_LOW 400 -#define DM_FALSEALARM_THRESH_HIGH 1000 - -#define DM_DIG_MAX 0x3e -#define DM_DIG_MIN 0x1e //0x22//0x1c - -#define DM_DIG_FA_UPPER 0x32 -#define DM_DIG_FA_LOWER 0x20 -#define DM_DIG_FA_TH0 0x20 -#define DM_DIG_FA_TH1 0x100 -#define DM_DIG_FA_TH2 0x200 - -#define DM_DIG_BACKOFF_MAX 12 -#define DM_DIG_BACKOFF_MIN (-4) -#define DM_DIG_BACKOFF_DEFAULT 10 - -#define RxPathSelection_SS_TH_low 30 -#define RxPathSelection_diff_TH 18 - -#define DM_RATR_STA_INIT 0 -#define DM_RATR_STA_HIGH 1 -#define DM_RATR_STA_MIDDLE 2 -#define DM_RATR_STA_LOW 3 - -#define CTSToSelfTHVal 30 -#define RegC38_TH 20 - -#define WAIotTHVal 25 - -//Dynamic Tx Power Control Threshold -#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 -#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 - -#define TxHighPwrLevel_Normal 0 -#define TxHighPwrLevel_Level1 1 -#define TxHighPwrLevel_Level2 2 -#define TxHighPwrLevel_BT1 3 -#define TxHighPwrLevel_BT2 4 - -#define DM_Type_ByFW 0 -#define DM_Type_ByDriver 1 - - -typedef struct _RATE_ADAPTIVE -{ - u8 RateAdaptiveDisabled; - u8 RATRState; - u16 reserve; - - u32 HighRSSIThreshForRA; - u32 High2LowRSSIThreshForRA; - u8 Low2HighRSSIThreshForRA40M; - u32 LowRSSIThreshForRA40M; - u8 Low2HighRSSIThreshForRA20M; - u32 LowRSSIThreshForRA20M; - u32 UpperRSSIThresholdRATR; - u32 MiddleRSSIThresholdRATR; - u32 LowRSSIThresholdRATR; - u32 LowRSSIThresholdRATR40M; - u32 LowRSSIThresholdRATR20M; - u8 PingRSSIEnable; //cosa add for Netcore long range ping issue - u32 PingRSSIRATR; //cosa add for Netcore long range ping issue - u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue - u32 LastRATR; - u8 PreRATRState; - -} RATE_ADAPTIVE, *PRATE_ADAPTIVE; - -typedef enum tag_SW_Antenna_Switch_Definition -{ - Antenna_B = 1, - Antenna_A = 2, - Antenna_MAX = 3, -}DM_SWAS_E; - -#ifdef CONFIG_ANTENNA_DIVERSITY -// This indicates two different the steps. -// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. -// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK -// with original RSSI to determine if it is necessary to switch antenna. -#define SWAW_STEP_PEAK 0 -#define SWAW_STEP_DETERMINE 1 - -#define TP_MODE 0 -#define RSSI_MODE 1 -#define TRAFFIC_LOW 0 -#define TRAFFIC_HIGH 1 - -typedef struct _SW_Antenna_Switch_ -{ - u8 try_flag; - s32 PreRSSI; - u8 CurAntenna; - u8 PreAntenna; - u8 RSSI_Trying; - u8 TestMode; - u8 bTriggerAntennaSwitch; - u8 SelectAntennaMap; - // Before link Antenna Switch check - u8 SWAS_NoLink_State; - -}SWAT_T; - - -#endif - - -struct dm_priv -{ - u8 DM_Type; - u8 DMFlag, DMFlag_tmp; - - - //for DIG - u8 bDMInitialGainEnable; - u8 binitialized; // for dm_initial_gain_Multi_STA use. - DIG_T DM_DigTable; - - PS_T DM_PSTable; - - FALSE_ALARM_STATISTICS FalseAlmCnt; - - //for rate adaptive, in fact, 88c/92c fw will handle this - u8 bUseRAMask; - RATE_ADAPTIVE RateAdaptive; - - //* Upper and Lower Signal threshold for Rate Adaptive*/ - int UndecoratedSmoothedPWDB; - int UndecoratedSmoothedCCK; - int EntryMinUndecoratedSmoothedPWDB; - int EntryMaxUndecoratedSmoothedPWDB; - - - //for High Power - u8 bDynamicTxPowerEnable; - u8 LastDTPLvl; - u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 - - //for tx power tracking - //u8 bTXPowerTracking; - u8 TXPowercount; - u8 bTXPowerTrackingInit; - u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default - u8 TM_Trigger; - - u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 - u8 ThermalValue; - u8 ThermalValue_LCK; - u8 ThermalValue_IQK; - u8 ThermalValue_DPK; - - u8 bRfPiEnable; - - //for APK - u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a - u8 bAPKdone; - u8 bAPKThermalMeterIgnore; - u8 bDPdone; - u8 bDPPathAOK; - u8 bDPPathBOK; - - //for IQK - u32 RegC04; - u32 Reg874; - u32 RegC08; - u32 RegB68; - u32 RegB6C; - u32 Reg870; - u32 Reg860; - u32 Reg864; - u32 ADDA_backup[IQK_ADDA_REG_NUM]; - u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; - u32 IQK_BB_backup_recover[9]; - u32 IQK_BB_backup[IQK_BB_REG_NUM]; - u8 PowerIndex_backup[6]; - - u8 bCCKinCH14; - - char CCK_index; - char OFDM_index[2]; - - BOOLEAN bDoneTxpower; - char CCK_index_HP; - char OFDM_index_HP[2]; - u8 ThermalValue_HP[HP_THERMAL_NUM]; - u8 ThermalValue_HP_index; - - //for TxPwrTracking - int RegE94; - int RegE9C; - int RegEB4; - int RegEBC; - - u32 TXPowerTrackingCallbackCnt; //cosa add for debug - - u32 prv_traffic_idx; // edca turbo - - // for dm_RF_Saving - u8 initialize; - u32 rf_saving_Reg874; - u32 rf_saving_RegC70; - u32 rf_saving_Reg85C; - u32 rf_saving_RegA74; - - //for Antenna diversity -#ifdef CONFIG_ANTENNA_DIVERSITY - SWAT_T DM_SWAT_Table; -#endif -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - _timer SwAntennaSwitchTimer; - - u64 lastTxOkCnt; - u64 lastRxOkCnt; - u64 TXByteCnt_A; - u64 TXByteCnt_B; - u64 RXByteCnt_A; - u64 RXByteCnt_B; - u8 DoubleComfirm; - u8 TrafficLoad; -#endif - - s32 OFDM_Pkt_Cnt; - u8 RSSI_Select; - u8 DIG_Dynamic_MIN ; - - // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas - u8 INIDATA_RATE[32]; -}; - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ -//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} - - -//============================================================ -// function prototype -//============================================================ -void rtl8192c_init_dm_priv(IN PADAPTER Adapter); -void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter); -void rtl8192c_InitHalDm(IN PADAPTER Adapter); -void rtl8192c_HalDmWatchDog(IN PADAPTER Adapter); - -VOID rtl8192c_dm_CheckTXPowerTracking(IN PADAPTER Adapter); - -void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal); - -#ifdef CONFIG_BT_COEXIST -void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart); -void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir); -#endif - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY -void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll); -void SwAntDivRestAfterLink8192C(IN PADAPTER Adapter); -#endif -#ifdef CONFIG_ANTENNA_DIVERSITY -void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter); -#endif - -#endif //__HAL8190PCIDM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h deleted file mode 100755 index a43f99f2d2a9..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h +++ /dev/null @@ -1,29 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTL8192C_EVENT_H_ -#define _RTL8192C_EVENT_H_ - - - - -#endif - - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h deleted file mode 100755 index 85ce86e8d229..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h +++ /dev/null @@ -1,879 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192C_HAL_H__ -#define __RTL8192C_HAL_H__ - -#include "rtl8192c_spec.h" -#include "Hal8192CPhyReg.h" -#include "Hal8192CPhyCfg.h" -#include "rtl8192c_rf.h" -#include "rtl8192c_dm.h" -#include "rtl8192c_recv.h" -#include "rtl8192c_xmit.h" -#include "rtl8192c_cmd.h" -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM -#include "rtl8192c_sreset.h" -#endif - -#ifdef CONFIG_PCI_HCI - - #include "Hal8192CEHWImg.h" - - #define RTL819X_DEFAULT_RF_TYPE RF_2T2R - //#define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - - //2TODO: The following need to check!! - #define RTL8192C_FW_TSMC_IMG "rtl8192CE\\rtl8192cfwT.bin" - #define RTL8192C_FW_UMC_IMG "rtl8192CE\\rtl8192cfwU.bin" - #define RTL8192C_FW_UMC_B_IMG "rtl8192CE\\rtl8192cfwU_B.bin" - - #define RTL8188C_PHY_REG "rtl8192CE\\PHY_REG_1T.txt" - #define RTL8188C_PHY_RADIO_A "rtl8192CE\\radio_a_1T.txt" - #define RTL8188C_PHY_RADIO_B "rtl8192CE\\radio_b_1T.txt" - #define RTL8188C_AGC_TAB "rtl8192CE\\AGC_TAB_1T.txt" - #define RTL8188C_PHY_MACREG "rtl8192CE\\MACREG_1T.txt" - - #define RTL8192C_PHY_REG "rtl8192CE\\PHY_REG_2T.txt" - #define RTL8192C_PHY_RADIO_A "rtl8192CE\\radio_a_2T.txt" - #define RTL8192C_PHY_RADIO_B "rtl8192CE\\radio_b_2T.txt" - #define RTL8192C_AGC_TAB "rtl8192CE\\AGC_TAB_2T.txt" - #define RTL8192C_PHY_MACREG "rtl8192CE\\MACREG_2T.txt" - - #define RTL819X_PHY_MACPHY_REG "rtl8192CE\\MACPHY_reg.txt" - #define RTL819X_PHY_MACPHY_REG_PG "rtl8192CE\\MACPHY_reg_PG.txt" - #define RTL819X_PHY_MACREG "rtl8192CE\\MAC_REG.txt" - #define RTL819X_PHY_REG "rtl8192CE\\PHY_REG.txt" - #define RTL819X_PHY_REG_1T2R "rtl8192CE\\PHY_REG_1T2R.txt" - #define RTL819X_PHY_REG_to1T1R "rtl8192CE\\phy_to1T1R_a.txt" - #define RTL819X_PHY_REG_to1T2R "rtl8192CE\\phy_to1T2R.txt" - #define RTL819X_PHY_REG_to2T2R "rtl8192CE\\phy_to2T2R.txt" - #define RTL819X_PHY_REG_PG "rtl8192CE\\PHY_REG_PG.txt" - #define RTL819X_AGC_TAB "rtl8192CE\\AGC_TAB.txt" - #define RTL819X_PHY_RADIO_A "rtl8192CE\\radio_a.txt" - #define RTL819X_PHY_RADIO_A_1T "rtl8192CE\\radio_a_1t.txt" - #define RTL819X_PHY_RADIO_A_2T "rtl8192CE\\radio_a_2t.txt" - #define RTL819X_PHY_RADIO_B "rtl8192CE\\radio_b.txt" - #define RTL819X_PHY_RADIO_B_GM "rtl8192CE\\radio_b_gm.txt" - #define RTL819X_PHY_RADIO_C "rtl8192CE\\radio_c.txt" - #define RTL819X_PHY_RADIO_D "rtl8192CE\\radio_d.txt" - #define RTL819X_EEPROM_MAP "rtl8192CE\\8192ce.map" - #define RTL819X_EFUSE_MAP "rtl8192CE\\8192ce.map" - -//--------------------------------------------------------------------- -// RTL8723E From file -//--------------------------------------------------------------------- - #define RTL8723_FW_UMC_IMG "rtl8723E\\rtl8723fw.bin" - #define RTL8723_PHY_REG "rtl8723E\\PHY_REG_1T.txt" - #define RTL8723_PHY_RADIO_A "rtl8723E\\radio_a_1T.txt" - #define RTL8723_PHY_RADIO_B "rtl8723E\\radio_b_1T.txt" - #define RTL8723_AGC_TAB "rtl8723E\\AGC_TAB_1T.txt" - #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt" - #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt" - #define RTL8723_PHY_REG_PG "rtl8723E\\PHY_REG_PG.txt" - #define RTL8723_PHY_REG_MP "rtl8723E\\PHY_REG_MP.txt" - - // The file name "_2T" is for 92CE, "_1T" is for 88CE. Modified by tynli. 2009.11.24. - #define Rtl819XFwTSMCImageArray Rtl8192CEFwTSMCImgArray - #define Rtl819XFwUMCACutImageArray Rtl8192CEFwUMCACutImgArray - #define Rtl819XFwUMCBCutImageArray Rtl8192CEFwUMCBCutImgArray - - #define Rtl8723FwUMCImageArray Rtl8192CEFwUMC8723ImgArray - #define Rtl819XMAC_Array Rtl8192CEMAC_2T_Array - #define Rtl819XAGCTAB_2TArray Rtl8192CEAGCTAB_2TArray - #define Rtl819XAGCTAB_1TArray Rtl8192CEAGCTAB_1TArray - #define Rtl819XPHY_REG_2TArray Rtl8192CEPHY_REG_2TArray - #define Rtl819XPHY_REG_1TArray Rtl8192CEPHY_REG_1TArray - #define Rtl819XRadioA_2TArray Rtl8192CERadioA_2TArray - #define Rtl819XRadioA_1TArray Rtl8192CERadioA_1TArray - #define Rtl819XRadioB_2TArray Rtl8192CERadioB_2TArray - #define Rtl819XRadioB_1TArray Rtl8192CERadioB_1TArray - #define Rtl819XPHY_REG_Array_PG Rtl8192CEPHY_REG_Array_PG - #define Rtl819XPHY_REG_Array_MP Rtl8192CEPHY_REG_Array_MP - -#elif defined(CONFIG_USB_HCI) - - #include "Hal8192CUHWImg.h" - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - - //TODO: The following need to check!! - #define RTL8192C_FW_TSMC_IMG "rtl8192CU\\rtl8192cfwT.bin" - #define RTL8192C_FW_UMC_IMG "rtl8192CU\\rtl8192cfwU.bin" - #define RTL8192C_FW_UMC_B_IMG "rtl8192CU\\rtl8192cfwU_B.bin" - - //#define RTL819X_FW_BOOT_IMG "rtl8192CU\\boot.img" - //#define RTL819X_FW_MAIN_IMG "rtl8192CU\\main.img" - //#define RTL819X_FW_DATA_IMG "rtl8192CU\\data.img" - - #define RTL8188C_PHY_REG "rtl8188CU\\PHY_REG.txt" - #define RTL8188C_PHY_RADIO_A "rtl8188CU\\radio_a.txt" - #define RTL8188C_PHY_RADIO_B "rtl8188CU\\radio_b.txt" - #define RTL8188C_PHY_RADIO_A_mCard "rtl8192CU\\radio_a_1T_mCard.txt" - #define RTL8188C_PHY_RADIO_B_mCard "rtl8192CU\\radio_b_1T_mCard.txt" - #define RTL8188C_PHY_RADIO_A_HP "rtl8192CU\\radio_a_1T_HP.txt" - #define RTL8188C_AGC_TAB "rtl8188CU\\AGC_TAB.txt" - #define RTL8188C_PHY_MACREG "rtl8188CU\\MACREG.txt" - - #define RTL8192C_PHY_REG "rtl8192CU\\PHY_REG.txt" - #define RTL8192C_PHY_RADIO_A "rtl8192CU\\radio_a.txt" - #define RTL8192C_PHY_RADIO_B "rtl8192CU\\radio_b.txt" - #define RTL8192C_AGC_TAB "rtl8192CU\\AGC_TAB.txt" - #define RTL8192C_PHY_MACREG "rtl8192CU\\MACREG.txt" - - #define RTL819X_PHY_REG_PG "rtl8192CU\\PHY_REG_PG.txt" - -//--------------------------------------------------------------------- -// RTL8723U From file -//--------------------------------------------------------------------- - #define RTL8723_FW_UMC_IMG "rtl8723U\\rtl8723fw.bin" - #define RTL8723_PHY_REG "rtl8723U\\PHY_REG_1T.txt" - #define RTL8723_PHY_RADIO_A "rtl8723U\\radio_a_1T.txt" - #define RTL8723_PHY_RADIO_B "rtl8723U\\radio_b_1T.txt" - #define RTL8723_AGC_TAB "rtl8723U\\AGC_TAB_1T.txt" - #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt" - #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt" - #define RTL8723_PHY_REG_PG "rtl8723U\\PHY_REG_PG.txt" - #define RTL8723_PHY_REG_MP "rtl8723U\\PHY_REG_MP.txt" - - // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24. - #define Rtl819XFwImageArray Rtl8192CUFwTSMCImgArray - #define Rtl819XFwTSMCImageArray Rtl8192CUFwTSMCImgArray - #define Rtl819XFwUMCACutImageArray Rtl8192CUFwUMCACutImgArray - #define Rtl819XFwUMCBCutImageArray Rtl8192CUFwUMCBCutImgArray - - #define Rtl819XMAC_Array Rtl8192CUMAC_2T_Array - #define Rtl819XAGCTAB_2TArray Rtl8192CUAGCTAB_2TArray - #define Rtl819XAGCTAB_1TArray Rtl8192CUAGCTAB_1TArray - #define Rtl819XAGCTAB_1T_HPArray Rtl8192CUAGCTAB_1T_HPArray - #define Rtl819XPHY_REG_2TArray Rtl8192CUPHY_REG_2TArray - #define Rtl819XPHY_REG_1TArray Rtl8192CUPHY_REG_1TArray - #define Rtl819XPHY_REG_1T_mCardArray Rtl8192CUPHY_REG_1T_mCardArray - #define Rtl819XPHY_REG_2T_mCardArray Rtl8192CUPHY_REG_2T_mCardArray - #define Rtl819XPHY_REG_1T_HPArray Rtl8192CUPHY_REG_1T_HPArray - #define Rtl819XRadioA_2TArray Rtl8192CURadioA_2TArray - #define Rtl819XRadioA_1TArray Rtl8192CURadioA_1TArray - #define Rtl819XRadioA_1T_mCardArray Rtl8192CURadioA_1T_mCardArray - #define Rtl819XRadioB_2TArray Rtl8192CURadioB_2TArray - #define Rtl819XRadioB_1TArray Rtl8192CURadioB_1TArray - #define Rtl819XRadioB_1T_mCardArray Rtl8192CURadioB_1T_mCardArray - #define Rtl819XRadioA_1T_HPArray Rtl8192CURadioA_1T_HPArray - #define Rtl819XPHY_REG_Array_PG Rtl8192CUPHY_REG_Array_PG - #define Rtl819XPHY_REG_Array_PG_mCard Rtl8192CUPHY_REG_Array_PG_mCard - #define Rtl819XPHY_REG_Array_PG_HP Rtl8192CUPHY_REG_Array_PG_HP - #define Rtl819XPHY_REG_Array_MP Rtl8192CUPHY_REG_Array_MP -#endif - -#define DRVINFO_SZ 4 // unit is 8bytes -#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) - -#define FW_8192C_SIZE 16384+32//16k -#define FW_8192C_START_ADDRESS 0x1000 -#define FW_8192C_END_ADDRESS 0x3FFF - -#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes - -#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300) - -typedef enum _FIRMWARE_SOURCE{ - FW_SOURCE_IMG_FILE = 0, - FW_SOURCE_HEADER_FILE = 1, //from header file -}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; - -typedef struct _RT_FIRMWARE{ - FIRMWARE_SOURCE eFWSource; - #ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; - #else - u8 szFwBuffer[FW_8192C_SIZE]; - #endif - u32 ulFwLength; -}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92C, *PRT_FIRMWARE_92C; - -// -// This structure must be cared byte-ordering -// -// Added by tynli. 2009.12.04. -typedef struct _RT_8192C_FIRMWARE_HDR {//8-byte alinment required - - //--- LONG WORD 0 ---- - u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut - u8 Category; // AP/NIC and USB/PCI - u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions - u16 Version; // FW Version - u8 Subversion; // FW Subversion, default 0x00 - u16 Rsvd1; - - - //--- LONG WORD 1 ---- - u8 Month; // Release time Month field - u8 Date; // Release time Date field - u8 Hour; // Release time Hour field - u8 Minute; // Release time Minute field - u16 RamCodeSize; // The size of RAM code - u16 Rsvd2; - - //--- LONG WORD 2 ---- - u32 SvnIdx; // The SVN entry index - u32 Rsvd3; - - //--- LONG WORD 3 ---- - u32 Rsvd4; - u32 Rsvd5; - -}RT_8192C_FIRMWARE_HDR, *PRT_8192C_FIRMWARE_HDR; - -#define DRIVER_EARLY_INT_TIME 0x05 -#define BCN_DMA_ATIME_INT_TIME 0x02 - -#ifdef CONFIG_USB_RX_AGGREGATION - -typedef enum _USB_RX_AGG_MODE{ - USB_RX_AGG_DISABLE, - USB_RX_AGG_DMA, - USB_RX_AGG_USB, - USB_RX_AGG_MIX -}USB_RX_AGG_MODE; - -#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer - -#endif - - -#define TX_SELE_HQ BIT(0) // High Queue -#define TX_SELE_LQ BIT(1) // Low Queue -#define TX_SELE_NQ BIT(2) // Normal Queue - - -// Note: We will divide number of page equally for each queue other than public queue! - -#define TX_TOTAL_PAGE_NUMBER 0xF8 -#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) - -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER -#define NORMAL_PAGE_NUM_PUBQ 0xE7 -#define NORMAL_PAGE_NUM_HPQ 0x0C -#define NORMAL_PAGE_NUM_LPQ 0x02 -#define NORMAL_PAGE_NUM_NPQ 0x02 - - -// For Test Chip Setting -// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER -#define TEST_PAGE_NUM_PUBQ 0x7E - - -// For Test Chip Setting -#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 -#define WMM_TEST_PAGE_NUM_HPQ 0x29 -#define WMM_TEST_PAGE_NUM_LPQ 0x29 - - -//Note: For Normal Chip Setting ,modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 -#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 -#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C -#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C - -//------------------------------------------------------------------------- -// Chip specific -//------------------------------------------------------------------------- -#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) -#define CHIP_BONDING_92C_1T2R 0x1 -#define CHIP_BONDING_88C_USB_MCARD 0x2 -#define CHIP_BONDING_88C_USB_HP 0x1 - -// -// 2011.01.06. Define new structure of chip version for RTL8723 and so on. Added by tynli. -// -/* - | BIT15:12 | BIT11:8 | BIT 7 | BIT6:4 | BIT3 | BIT2:0 | - |-------------+-----------+-----------+-------+-----------+-------| - | IC version(CUT) | ROM version | Manufacturer | RF type | Chip type | IC Type | - | | | TSMC/UMC | | TEST/NORMAL| | -*/ -// [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3 -// [7] Manufacturer: TSMC=0, UMC=1 -// [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2 -// [3] Chip type: TEST=0, NORMAL=1 -// [2:0] IC type: 81xxC=0, 8723=1, 92D=2 - -#define CHIP_8723 BIT(0) -#define CHIP_92D BIT(1) -#define NORMAL_CHIP BIT(3) -#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6))) -#define RF_TYPE_1T2R BIT(4) -#define RF_TYPE_2T2R BIT(5) -#define CHIP_VENDOR_UMC BIT(7) -#define B_CUT_VERSION BIT(12) -#define C_CUT_VERSION BIT(13) -#define D_CUT_VERSION ((BIT(13)|BIT(14))) - - -// MASK -#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2)) -#define CHIP_TYPE_MASK BIT(3) -#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6)) -#define MANUFACTUER_MASK BIT(7) -#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8)) -#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12)) - -// Get element -#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK) -#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK) -#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK) -#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK) -#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK) -#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK) - -#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0)? _TRUE : _FALSE) -#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723)? _TRUE : _FALSE) -#define IS_92D(version) ((GET_CVID_IC_TYPE(version) == CHIP_92D)? _TRUE : _FALSE) -#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version))? _FALSE : _TRUE) -#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? _TRUE : _FALSE) -#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? _TRUE : _FALSE) -#define IS_NORMAL_CHIP(version) ((GET_CVID_CHIP_TYPE(version))? _TRUE: _FALSE) -#define IS_CHIP_VENDOR_UMC(version) ((GET_CVID_MANUFACTUER(version))? _TRUE: _FALSE) - -#define IS_81XXC_TEST_CHIP(version) ((IS_81XXC(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE) -#define IS_92D_TEST_CHIP(version) ((IS_92D(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE) -#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ? _TRUE : _FALSE) -#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE) -#define IS_VENDOR_8723_A_CUT(version) ((IS_8723_SERIES(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE) -// 88/92C UMC B-cut vendor is set to TSMC so we need to check CHIP_VENDOR_UMC bit is not 1. -#define IS_81xxC_VENDOR_UMC_B_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? _TRUE : _FALSE):_FALSE) -#define IS_92D_SINGLEPHY(version) ((IS_92D(version)) ? (IS_2T2R(version) ? _TRUE: _FALSE) : _FALSE) -#define IS_92D_C_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x2) ? _TRUE : _FALSE) : _FALSE) -#define IS_92D_D_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x3) ? _TRUE : _FALSE) : _FALSE) - -typedef enum _VERSION_8192C{ - VERSION_TEST_CHIP_88C = 0x0000, - VERSION_TEST_CHIP_92C = 0x0020, - VERSION_TEST_UMC_CHIP_8723 = 0x0081, - VERSION_NORMAL_TSMC_CHIP_88C = 0x0008, - VERSION_NORMAL_TSMC_CHIP_92C = 0x0028, - VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x0018, - VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x0088, - VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x00a8, - VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x0098, - VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x0089, - VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x1089, - VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x1088, - VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x10a8, - VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x1090, - VERSION_TEST_CHIP_92D_SINGLEPHY= 0x0022, - VERSION_TEST_CHIP_92D_DUALPHY = 0x0002, - VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x002a, - VERSION_NORMAL_CHIP_92D_DUALPHY = 0x000a, - VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x202a, - VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x200a, - VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0x302a, - VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x300a, -}VERSION_8192C,*PVERSION_8192C; - - - -//------------------------------------------------------------------------- -// Channel Plan -//------------------------------------------------------------------------- -enum ChannelPlan{ - CHPL_FCC = 0, - CHPL_IC = 1, - CHPL_ETSI = 2, - CHPL_SPAIN = 3, - CHPL_FRANCE = 4, - CHPL_MKK = 5, - CHPL_MKK1 = 6, - CHPL_ISRAEL = 7, - CHPL_TELEC = 8, - CHPL_GLOBAL = 9, - CHPL_WORLD = 10, -}; - -typedef struct _TxPowerInfo{ - u8 CCKIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT40_1SIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT40_2SIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT20IndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 OFDMIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT40MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT20MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 TSSI_A; - u8 TSSI_B; -}TxPowerInfo, *PTxPowerInfo; - -#define EFUSE_REAL_CONTENT_LEN 512 -#define EFUSE_MAP_LEN 128 -#define EFUSE_MAX_SECTION 16 -#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. -#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) -// -// To prevent out of boundary programming case, leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 1byte|----8bytes----|1byte|--5bytes--| -// | | Reserved(14bytes) | -// -#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. - - -#define EFUSE_MAP_LEN_8723 256 -#define EFUSE_MAX_SECTION_8723 32 - -//======================================================== -// EFUSE for BT definition -//======================================================== -#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 -#define EFUSE_BT_MAP_LEN 1024 // 1k bytes -#define EFUSE_BT_MAX_SECTION 128 // 1024/8 - -#define EFUSE_PROTECT_BYTES_BANK 16 - -// -// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. -// -typedef enum _RT_MULTI_FUNC{ - RT_MULTI_FUNC_NONE = 0x00, - RT_MULTI_FUNC_WIFI = 0x01, - RT_MULTI_FUNC_BT = 0x02, - RT_MULTI_FUNC_GPS = 0x04, -}RT_MULTI_FUNC,*PRT_MULTI_FUNC; - -// -// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. -// -typedef enum _RT_POLARITY_CTL{ - RT_POLARITY_LOW_ACT = 0, - RT_POLARITY_HIGH_ACT = 1, -}RT_POLARITY_CTL,*PRT_POLARITY_CTL; - -// For RTL8723 regulator mode. by tynli. 2011.01.14. -typedef enum _RT_REGULATOR_MODE{ - RT_SWITCHING_REGULATOR = 0, - RT_LDO_REGULATOR = 1, -}RT_REGULATOR_MODE,*PRT_REGULATOR_MODE; - -#ifdef CONFIG_PCI_HCI -struct hal_data_8192ce -{ - VERSION_8192C VersionID; - RT_MULTI_FUNC MultiFunc; // For multi-function consideration. - RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. - RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO - u16 CustomerID; - - u16 FirmwareVersion; - u16 FirmwareVersionRev; - u16 FirmwareSubVersion; - - u32 IntrMask[2]; - u32 IntrMaskToSet[2]; - - u32 DisabledFunctions; - - //current WIFI_PHY values - u32 ReceiveConfig; - u32 TransmitConfig; - WIRELESS_MODE CurrentWirelessMode; - HT_CHANNEL_WIDTH CurrentChannelBW; - u8 CurrentChannel; - u8 nCur40MhzPrimeSC;// Control channel sub-carrier - - u16 BasicRateSet; - - //rf_ctrl - _lock rf_lock; - u8 rf_chip; - u8 rf_type; - u8 NumTotalRFPath; - - INTERFACE_SELECT_8192CPCIe InterfaceSel; - - // - // EEPROM setting. - // - u16 EEPROMVID; - u16 EEPROMDID; - u16 EEPROMSVID; - u16 EEPROMSMID; - u16 EEPROMChannelPlan; - u16 EEPROMVersion; - - u8 EEPROMChnlAreaTxPwrCCK[2][3]; - u8 EEPROMChnlAreaTxPwrHT40_1S[2][3]; - u8 EEPROMChnlAreaTxPwrHT40_2SDiff[2][3]; - u8 EEPROMPwrLimitHT20[3]; - u8 EEPROMPwrLimitHT40[3]; - - u8 bTXPowerDataReadFromEEPORM; - u8 EEPROMThermalMeter; - u8 EEPROMTSSI[2]; - - u8 EEPROMCustomerID; - u8 EEPROMBoardType; - u8 EEPROMRegulatory; - - u8 bDefaultAntenna; - u8 bIQKInitialized; - - u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff - u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff - // For power group - u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - - u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff - -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv bt_coexist; -#endif - - // Read/write are allow for following hardware information variables - u8 framesync; - u32 framesyncC34; - u8 framesyncMonitor; - u8 DefaultInitialGain[4]; - u8 pwrGroupCnt; - u32 MCSTxPowerLevelOriginalOffset[7][16]; - u32 CCKTxPowerLevelOriginalOffset; - - u32 AntennaTxPath; // Antenna path Tx - u32 AntennaRxPath; // Antenna path Rx - u8 BluetoothCoexist; - u8 ExternalPA; - - //u32 LedControlNum; - //u32 LedControlMode; - u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. - //u32 TxPowerTrackControl; - u8 b1x1RecvCombine; // for 1T1R receive combining - - u8 bCurrentTurboEDCA; - u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. - - //vivi, for tx power tracking, 20080407 - //u16 TSSI_13dBm; - //u32 Pwr_Track; - // The current Tx Power Level - u8 CurrentCckTxPwrIdx; - u8 CurrentOfdm24GTxPwrIdx; - - BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D - - BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. - - u32 RfRegChnlVal[2]; - - u8 bCckHighPower; - - //RDG enable - BOOLEAN bRDGEnable; - - //for host message to fw - u8 LastHMEBoxNum; - - u8 fw_ractrl; - u8 RegTxPause; - // Beacon function related global variable. - u32 RegBcnCtrlVal; - u8 RegFwHwTxQCtrl; - u8 RegReg542; - u8 CurAntenna; - u8 AntDivCfg; - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - //SW Antenna Switch - s32 RSSI_sum_A; - s32 RSSI_sum_B; - s32 RSSI_cnt_A; - s32 RSSI_cnt_B; - BOOLEAN RSSI_test; -#endif -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - //Hybrid Antenna Diversity - u32 CCK_Ant1_Cnt; - u32 CCK_Ant2_Cnt; - u32 OFDM_Ant1_Cnt; - u32 OFDM_Ant2_Cnt; -#endif - - struct dm_priv dmpriv; - u8 bDumpRxPkt;//for debug -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - struct sreset_priv srestpriv; -#endif - u8 bInterruptMigration; - u8 bDisableTxInt; - u8 bGpioHwWpsPbc; - - u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. - - u16 EfuseUsedBytes; - -#ifdef CONFIG_P2P - struct P2P_PS_Offload_t p2p_ps_offload; -#endif //CONFIG_P2P -}; - -typedef struct hal_data_8192ce HAL_DATA_TYPE, *PHAL_DATA_TYPE; - -// -// Function disabled. -// -#define DF_TX_BIT BIT0 -#define DF_RX_BIT BIT1 -#define DF_IO_BIT BIT2 -#define DF_IO_D3_BIT BIT3 - -#define RT_DF_TYPE u32 -#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits))) -#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits)))) -#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) -#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) - -void InterruptRecognized8192CE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); -VOID UpdateInterruptMask8192CE(PADAPTER Adapter, u32 AddMSR, u32 RemoveMSR); -#endif - -#ifdef CONFIG_USB_HCI -struct hal_data_8192cu -{ - VERSION_8192C VersionID; - RT_MULTI_FUNC MultiFunc; // For multi-function consideration. - RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. - RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO - u16 CustomerID; - - u16 FirmwareVersion; - u16 FirmwareVersionRev; - u16 FirmwareSubVersion; - - //current WIFI_PHY values - u32 ReceiveConfig; - WIRELESS_MODE CurrentWirelessMode; - HT_CHANNEL_WIDTH CurrentChannelBW; - u8 CurrentChannel; - u8 nCur40MhzPrimeSC;// Control channel sub-carrier - - u16 BasicRateSet; - - //rf_ctrl - u8 rf_chip; - u8 rf_type; - u8 NumTotalRFPath; - - u8 BoardType; - //INTERFACE_SELECT_8192CUSB InterfaceSel; - - // - // EEPROM setting. - // - u16 EEPROMVID; - u16 EEPROMPID; - u16 EEPROMSVID; - u16 EEPROMSDID; - u8 EEPROMCustomerID; - u8 EEPROMSubCustomerID; - u8 EEPROMVersion; - u8 EEPROMRegulatory; - - u8 bTXPowerDataReadFromEEPORM; - u8 EEPROMThermalMeter; - - u8 bIQKInitialized; - - u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff - u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff - // For power group - u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - - u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff - - // Read/write are allow for following hardware information variables - u8 framesync; - u32 framesyncC34; - u8 framesyncMonitor; - u8 DefaultInitialGain[4]; - u8 pwrGroupCnt; - u32 MCSTxPowerLevelOriginalOffset[7][16]; - u32 CCKTxPowerLevelOriginalOffset; - - u32 AntennaTxPath; // Antenna path Tx - u32 AntennaRxPath; // Antenna path Rx - u8 BluetoothCoexist; - u8 ExternalPA; - - u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. - - //u32 LedControlNum; - //u32 LedControlMode; - //u32 TxPowerTrackControl; - u8 b1x1RecvCombine; // for 1T1R receive combining - - u8 bCurrentTurboEDCA; - u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. - - //vivi, for tx power tracking, 20080407 - //u16 TSSI_13dBm; - //u32 Pwr_Track; - // The current Tx Power Level - u8 CurrentCckTxPwrIdx; - u8 CurrentOfdm24GTxPwrIdx; - - BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D - - BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. - - u32 RfRegChnlVal[2]; - - u8 bCckHighPower; - - //RDG enable - BOOLEAN bRDGEnable; - - //for host message to fw - u8 LastHMEBoxNum; - - u8 fw_ractrl; - u8 RegTxPause; - // Beacon function related global variable. - u32 RegBcnCtrlVal; - u8 RegFwHwTxQCtrl; - u8 RegReg542; - - struct dm_priv dmpriv; -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - struct sreset_priv srestpriv; -#endif - -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv bt_coexist; -#endif - u8 CurAntenna; - u8 AntDivCfg; - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - //SW Antenna Switch - s32 RSSI_sum_A; - s32 RSSI_sum_B; - s32 RSSI_cnt_A; - s32 RSSI_cnt_B; - BOOLEAN RSSI_test; -#endif -#ifdef CONFIG_HW_ANTENNA_DIVERSITY - //Hybrid Antenna Diversity - u32 CCK_Ant1_Cnt; - u32 CCK_Ant2_Cnt; - u32 OFDM_Ant1_Cnt; - u32 OFDM_Ant2_Cnt; -#endif - - u8 bDumpRxPkt;//for debug - u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. - - // 2010/08/09 MH Add CU power down mode. - BOOLEAN pwrdown; - - // For 92C USB endpoint setting - // - - u32 UsbBulkOutSize; - - int RtBulkOutPipe[3]; - int RtBulkInPipe; - int RtIntInPipe; - // Add for dual MAC 0--Mac0 1--Mac1 - u32 interfaceIndex; - - u8 OutEpQueueSel; - u8 OutEpNumber; - - u8 Queue2EPNum[8];//for out endpoint number mapping - -#ifdef CONFIG_USB_TX_AGGREGATION - u8 UsbTxAggMode; - u8 UsbTxAggDescNum; -#endif -#ifdef CONFIG_USB_RX_AGGREGATION - u16 HwRxPageSize; // Hardware setting - u32 MaxUsbRxAggBlock; - - USB_RX_AGG_MODE UsbRxAggMode; - u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed - u8 UsbRxAggBlockTimeout; - u8 UsbRxAggPageCount; // 8192C DMA page count - u8 UsbRxAggPageTimeout; -#endif - - // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. - BOOLEAN UsbRxHighSpeedMode; - - // 2010/11/22 MH Add for slim combo debug mode selective. - // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. - BOOLEAN SlimComboDbg; - - u16 EfuseUsedBytes; - -#ifdef CONFIG_P2P - struct P2P_PS_Offload_t p2p_ps_offload; -#endif //CONFIG_P2P -}; - -typedef struct hal_data_8192cu HAL_DATA_TYPE, *PHAL_DATA_TYPE; -#endif - -#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) -#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) - -VOID rtl8192c_FirmwareSelfReset(IN PADAPTER Adapter); -int FirmwareDownload92C(IN PADAPTER Adapter); -VOID InitializeFirmwareVars92C(PADAPTER Adapter); -u8 GetEEPROMSize8192C(PADAPTER Adapter); -RT_CHANNEL_DOMAIN _HalMapChannelPlan8192C(PADAPTER Adapter, u8 HalChannelPlan); -VERSION_8192C rtl8192c_ReadChipVersion(IN PADAPTER Adapter); -void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail); -void rtl8192c_HalSetBrateCfg(PADAPTER Adapter, u8 *mBratesOS, u16 *pBrateCfg); -//void rtl8192c_free_hal_data(_adapter * padapter); -VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo); -void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc); - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h deleted file mode 100755 index 4ddd9c855d58..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h +++ /dev/null @@ -1,43 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192C_LED_H_ -#define __RTL8192C_LED_H_ - -#include -#include -#include - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8192cu_InitSwLeds(_adapter *padapter); -void rtl8192cu_DeInitSwLeds(_adapter *padapter); -#endif -#ifdef CONFIG_PCI_HCI -void rtl8192ce_gen_RefreshLedState(PADAPTER Adapter); -void rtl8192ce_InitSwLeds(_adapter *padapter); -void rtl8192ce_DeInitSwLeds(_adapter *padapter); -#endif - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h deleted file mode 100755 index 99805f455fae..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h +++ /dev/null @@ -1,182 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTL8192C_RECV_H_ -#define _RTL8192C_RECV_H_ - -#include -#include -#include - - -#ifdef PLATFORM_OS_XP - #define NR_RECVBUFF (16) -#elif defined(PLATFORM_OS_CE) - #define NR_RECVBUFF (4) -#else -#ifdef CONFIG_SPECIFIC_URB_NUM - #define NR_RECVBUFF (1) -#else - #define NR_RECVBUFF (4) -#endif - #define NR_PREALLOC_RECV_SKB (8) -#endif - - -#define RECV_BLK_SZ 512 -#define RECV_BLK_CNT 16 -#define RECV_BLK_TH RECV_BLK_CNT - -#if defined(CONFIG_USB_HCI) - -#ifdef PLATFORM_OS_CE -#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k -#else - #ifndef CONFIG_MINIMAL_MEMORY_USAGE - //#define MAX_RECVBUF_SZ (32768) // 32k - //#define MAX_RECVBUF_SZ (16384) //16K - //#define MAX_RECVBUF_SZ (10240) //10K - #define MAX_RECVBUF_SZ (15360) // 15k < 16k - //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k - #else - #define MAX_RECVBUF_SZ (4000) // about 4K - #endif -#endif - -#elif defined(CONFIG_PCI_HCI) -#ifndef CONFIG_MINIMAL_MEMORY_USAGE - #define MAX_RECVBUF_SZ (9100) -#else - #define MAX_RECVBUF_SZ (4000) // about 4K -#endif - -#define RX_MPDU_QUEUE 0 -#define RX_CMD_QUEUE 1 -#define RX_MAX_QUEUE 2 -#endif - - -#define RECV_BULK_IN_ADDR 0x80 -#define RECV_INT_IN_ADDR 0x81 - -#define PHY_RSSI_SLID_WIN_MAX 100 -#define PHY_LINKQUALITY_SLID_WIN_MAX 20 - - -struct phy_stat -{ - unsigned int phydw0; - - unsigned int phydw1; - - unsigned int phydw2; - - unsigned int phydw3; - - unsigned int phydw4; - - unsigned int phydw5; - - unsigned int phydw6; - - unsigned int phydw7; -}; - -typedef struct _Phy_OFDM_Rx_Status_Report_8192cd -{ - unsigned char trsw_gain_X[4]; - unsigned char pwdb_all; - unsigned char cfosho_X[4]; - unsigned char cfotail_X[4]; - unsigned char rxevm_X[2]; - unsigned char rxsnr_X[4]; - unsigned char pdsnr_X[2]; - unsigned char csi_current_X[2]; - unsigned char csi_target_X[2]; - unsigned char sigevm; - unsigned char max_ex_pwr; -//#ifdef RTL8192SE -#ifdef CONFIG_LITTLE_ENDIAN - unsigned char ex_intf_flg:1; - unsigned char sgi_en:1; - unsigned char rxsc:2; - //unsigned char rsvd:4; - unsigned char idle_long:1; - unsigned char r_ant_train_en:1; - unsigned char ANTSELB:1; - unsigned char ANTSEL:1; -#else // _BIG_ENDIAN_ - //unsigned char rsvd:4; - unsigned char ANTSEL:1; - unsigned char ANTSELB:1; - unsigned char r_ant_train_en:1; - unsigned char idle_long:1; - unsigned char rxsc:2; - unsigned char sgi_en:1; - unsigned char ex_intf_flg:1; -#endif -//#else // RTL8190, RTL8192E -// unsigned char sgi_en; -// unsigned char rxsc_sgien_exflg; -//#endif -} __attribute__ ((packed))PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD; - -typedef struct _Phy_CCK_Rx_Status_Report_8192cd -{ - /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend - 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */ - u8 adc_pwdb_X[4]; - u8 SQ_rpt; - u8 cck_agc_rpt; -} PHY_STS_CCK_8192CD_T; - - -// Rx smooth factor -#define Rx_Smooth_Factor (20) - - -#ifdef CONFIG_USB_HCI -typedef struct _INTERRUPT_MSG_FORMAT_EX{ - unsigned int C2H_MSG0; - unsigned int C2H_MSG1; - unsigned int C2H_MSG2; - unsigned int C2H_MSG3; - unsigned int HISR; // from HISR Reg0x124, read to clear - unsigned int HISRE;// from HISRE Reg0x12c, read to clear - unsigned int MSG_EX; -}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX; - -void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); -int rtl8192cu_init_recv_priv(_adapter * padapter); -void rtl8192cu_free_recv_priv(_adapter * padapter); -void rtl8192cu_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); -#endif - -#ifdef CONFIG_PCI_HCI -int rtl8192ce_init_recv_priv(_adapter * padapter); -void rtl8192ce_free_recv_priv(_adapter * padapter); -void rtl8192ce_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); -#endif - -void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); -void rtl8192c_process_phy_info(_adapter *padapter, void *prframe); - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h deleted file mode 100755 index 76c8a7880ac7..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h +++ /dev/null @@ -1,93 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -/****************************************************************************** - * - * - * Module: rtl8192c_rf.h ( Header File) - * - * Note: Collect every HAL RF type exter API or constant. - * - * Function: - * - * Export: - * - * Abbrev: - * - * History: - * Data Who Remark - * - * 09/25/2008 MHC Create initial version. - * - * -******************************************************************************/ -#ifndef _RTL8192C_RF_H_ -#define _RTL8192C_RF_H_ -/* Check to see if the file has been included already. */ - - -/*--------------------------Define Parameters-------------------------------*/ - -// -// For RF 6052 Series -// -#define RF6052_MAX_TX_PWR 0x3F -#define RF6052_MAX_REG 0x3F -#define RF6052_MAX_PATH 2 -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ - -// -// RF RL6052 Series API -// -void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, - IN u16 DataRate); -void rtl8192c_PHY_RF6052SetBandwidth( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth); -VOID rtl8192c_PHY_RF6052SetCckTxPower( - IN PADAPTER Adapter, - IN u8* pPowerlevel); -VOID rtl8192c_PHY_RF6052SetOFDMTxPower( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel); -int PHY_RF6052_Config8192C( IN PADAPTER Adapter ); - -/*--------------------------Exported Function prototype---------------------*/ - - -#endif/* End of HalRf.h */ - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h deleted file mode 100755 index cabd8b8f7851..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h +++ /dev/null @@ -1,1898 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192C_SPEC_H__ -#define __RTL8192C_SPEC_H__ - -#include - -#ifndef BIT -#define BIT(x) (1 << (x)) -#endif - -#define BIT0 0x00000001 -#define BIT1 0x00000002 -#define BIT2 0x00000004 -#define BIT3 0x00000008 -#define BIT4 0x00000010 -#define BIT5 0x00000020 -#define BIT6 0x00000040 -#define BIT7 0x00000080 -#define BIT8 0x00000100 -#define BIT9 0x00000200 -#define BIT10 0x00000400 -#define BIT11 0x00000800 -#define BIT12 0x00001000 -#define BIT13 0x00002000 -#define BIT14 0x00004000 -#define BIT15 0x00008000 -#define BIT16 0x00010000 -#define BIT17 0x00020000 -#define BIT18 0x00040000 -#define BIT19 0x00080000 -#define BIT20 0x00100000 -#define BIT21 0x00200000 -#define BIT22 0x00400000 -#define BIT23 0x00800000 -#define BIT24 0x01000000 -#define BIT25 0x02000000 -#define BIT26 0x04000000 -#define BIT27 0x08000000 -#define BIT28 0x10000000 -#define BIT29 0x20000000 -#define BIT30 0x40000000 -#define BIT31 0x80000000 - - -//============================================================ -// 8192C Regsiter offset definition -//============================================================ - - -//============================================================ -// -//============================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- -#define REG_SYS_ISO_CTRL 0x0000 -#define REG_SYS_FUNC_EN 0x0002 -#define REG_APS_FSMCO 0x0004 -#define REG_SYS_CLKR 0x0008 -#define REG_9346CR 0x000A -#define REG_EE_VPD 0x000C -#define REG_AFE_MISC 0x0010 -#define REG_SPS0_CTRL 0x0011 -#define REG_SPS_OCP_CFG 0x0018 -#define REG_RSV_CTRL 0x001C -#define REG_RF_CTRL 0x001F -#define REG_LDOA15_CTRL 0x0020 -#define REG_LDOV12D_CTRL 0x0021 -#define REG_LDOHCI12_CTRL 0x0022 -#define REG_LPLDO_CTRL 0x0023 -#define REG_AFE_XTAL_CTRL 0x0024 -#define REG_AFE_PLL_CTRL 0x0028 -#define REG_EFUSE_CTRL 0x0030 -#define REG_EFUSE_TEST 0x0034 -#define REG_PWR_DATA 0x0038 -#define REG_CAL_TIMER 0x003C -#define REG_ACLK_MON 0x003E -#define REG_GPIO_MUXCFG 0x0040 -#define REG_GPIO_IO_SEL 0x0042 -#define REG_MAC_PINMUX_CFG 0x0043 -#define REG_GPIO_PIN_CTRL 0x0044 -#define REG_GPIO_INTM 0x0048 -#define REG_LEDCFG0 0x004C -#define REG_LEDCFG1 0x004D -#define REG_LEDCFG2 0x004E -#define REG_LEDCFG3 0x004F -#define REG_LEDCFG REG_LEDCFG2 -#define REG_FSIMR 0x0050 -#define REG_FSISR 0x0054 -#define REG_HSIMR 0x0058 -#define REG_HSISR 0x005c -#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control. -#define REG_GPIO_IO_SEL_2 0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select. -#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source. -#define REG_MCUFWDL 0x0080 -#define REG_HMEBOX_EXT_0 0x0088 -#define REG_HMEBOX_EXT_1 0x008A -#define REG_HMEBOX_EXT_2 0x008C -#define REG_HMEBOX_EXT_3 0x008E -#define REG_HOST_SUSP_CNT 0x00BC // Host suspend counter on FPGA platform -#define REG_EFUSE_ACCESS 0x00CF // Efuse access protection for RTL8723 -#define REG_BIST_SCAN 0x00D0 -#define REG_BIST_RPT 0x00D4 -#define REG_BIST_ROM_RPT 0x00D8 -#define REG_USB_SIE_INTF 0x00E0 -#define REG_PCIE_MIO_INTF 0x00E4 -#define REG_PCIE_MIO_INTD 0x00E8 -#define REG_HPON_FSM 0x00EC -#define REG_SYS_CFG 0x00F0 -#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only. - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_CR 0x0100 -#define REG_PBP 0x0104 -#define REG_TRXDMA_CTRL 0x010C -#define REG_TRXFF_BNDY 0x0114 -#define REG_TRXFF_STATUS 0x0118 -#define REG_RXFF_PTR 0x011C -#define REG_HIMR 0x0120 -#define REG_HISR 0x0124 -#define REG_HIMRE 0x0128 -#define REG_HISRE 0x012C -#define REG_CPWM 0x012F -#define REG_FWIMR 0x0130 -#define REG_FWISR 0x0134 -#define REG_PKTBUF_DBG_CTRL 0x0140 -#define REG_PKTBUF_DBG_DATA_L 0x0144 -#define REG_PKTBUF_DBG_DATA_H 0x0148 - -#define REG_TC0_CTRL 0x0150 -#define REG_TC1_CTRL 0x0154 -#define REG_TC2_CTRL 0x0158 -#define REG_TC3_CTRL 0x015C -#define REG_TC4_CTRL 0x0160 -#define REG_TCUNIT_BASE 0x0164 -#define REG_MBIST_START 0x0174 -#define REG_MBIST_DONE 0x0178 -#define REG_MBIST_FAIL 0x017C -#define REG_C2HEVT_MSG_NORMAL 0x01A0 -#define REG_C2HEVT_CLEAR 0x01AF -#define REG_C2HEVT_MSG_TEST 0x01B8 -#define REG_MCUTST_1 0x01c0 -#define REG_FMETHR 0x01C8 -#define REG_HMETFR 0x01CC -#define REG_HMEBOX_0 0x01D0 -#define REG_HMEBOX_1 0x01D4 -#define REG_HMEBOX_2 0x01D8 -#define REG_HMEBOX_3 0x01DC - -#define REG_LLT_INIT 0x01E0 -#define REG_BB_ACCEESS_CTRL 0x01E8 -#define REG_BB_ACCESS_DATA 0x01EC - - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -#define REG_RQPN 0x0200 -#define REG_FIFOPAGE 0x0204 -#define REG_TDECTRL 0x0208 -#define REG_TXDMA_OFFSET_CHK 0x020C -#define REG_TXDMA_STATUS 0x0210 -#define REG_RQPN_NPQ 0x0214 - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- -#define REG_RXDMA_AGG_PG_TH 0x0280 -#define REG_RXPKT_NUM 0x0284 -#define REG_RXDMA_STATUS 0x0288 - - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- -#define REG_PCIE_CTRL_REG 0x0300 -#define REG_INT_MIG 0x0304 // Interrupt Migration -#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address -#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address -#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address -#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address -#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address -#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address -#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address -#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address -#define REG_DBI 0x0348 // Backdoor REG for Access Configuration -#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY -#define REG_DBG_SEL 0x0360 // Debug Selection Register -#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM -#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM -#define REG_UART_CTRL 0x0364 // UART Control -#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address -#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address - - -// spec version 11 -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -#define REG_VOQ_INFORMATION 0x0400 -#define REG_VIQ_INFORMATION 0x0404 -#define REG_BEQ_INFORMATION 0x0408 -#define REG_BKQ_INFORMATION 0x040C -#define REG_MGQ_INFORMATION 0x0410 -#define REG_HGQ_INFORMATION 0x0414 -#define REG_BCNQ_INFORMATION 0x0418 - - -#define REG_CPU_MGQ_INFORMATION 0x041C -#define REG_FWHW_TXQ_CTRL 0x0420 -#define REG_HWSEQ_CTRL 0x0423 -#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 -#define REG_TXPKTBUF_MGQ_BDNY 0x0425 -#define REG_MULTI_BCNQ_EN 0x0426 -#define REG_MULTI_BCNQ_OFFSET 0x0427 -#define REG_SPEC_SIFS 0x0428 -#define REG_RL 0x042A -#define REG_DARFRC 0x0430 -#define REG_RARFRC 0x0438 -#define REG_RRSR 0x0440 -#define REG_ARFR0 0x0444 -#define REG_ARFR1 0x0448 -#define REG_ARFR2 0x044C -#define REG_ARFR3 0x0450 -#define REG_AGGLEN_LMT 0x0458 -#define REG_AMPDU_MIN_SPACE 0x045C -#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D -#define REG_FAST_EDCA_CTRL 0x0460 -#define REG_RD_RESP_PKT_TH 0x0463 -#define REG_INIRTS_RATE_SEL 0x0480 -#define REG_INIDATA_RATE_SEL 0x0484 -#define REG_POWER_STATUS 0x04A4 -#define REG_POWER_STAGE1 0x04B4 -#define REG_POWER_STAGE2 0x04B8 -#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 -#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 -#define REG_STBC_SETTING 0x04C4 -#define REG_PROT_MODE_CTRL 0x04C8 -#define REG_MAX_AGGR_NUM 0x04CA -#define REG_RTS_MAX_AGGR_NUM 0x04CB -#define REG_BAR_MODE_CTRL 0x04CC -#define REG_RA_TRY_RATE_AGG_LMT 0x04CF -#define REG_NQOS_SEQ 0x04DC -#define REG_QOS_SEQ 0x04DE -#define REG_NEED_CPU_HANDLE 0x04E0 -#define REG_PKT_LOSE_RPT 0x04E1 -#define REG_PTCL_ERR_STATUS 0x04E2 -#define REG_DUMMY 0x04FC - - - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- -#define REG_EDCA_VO_PARAM 0x0500 -#define REG_EDCA_VI_PARAM 0x0504 -#define REG_EDCA_BE_PARAM 0x0508 -#define REG_EDCA_BK_PARAM 0x050C -#define REG_BCNTCFG 0x0510 -#define REG_PIFS 0x0512 -#define REG_RDG_PIFS 0x0513 -#define REG_SIFS_CCK 0x0514 -#define REG_SIFS_OFDM 0x0516 -#define REG_SIFS_CTX 0x0514 -#define REG_SIFS_TRX 0x0516 -#define REG_AGGR_BREAK_TIME 0x051A -#define REG_SLOT 0x051B -#define REG_TX_PTCL_CTRL 0x0520 -#define REG_TXPAUSE 0x0522 -#define REG_DIS_TXREQ_CLR 0x0523 -#define REG_RD_CTRL 0x0524 -#define REG_TBTT_PROHIBIT 0x0540 -#define REG_RD_NAV_NXT 0x0544 -#define REG_NAV_PROT_LEN 0x0546 -#define REG_BCN_CTRL 0x0550 -#define REG_BCN_CTRL_1 0x0551 -#define REG_MBID_NUM 0x0552 -#define REG_DUAL_TSF_RST 0x0553 -#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE -#define REG_MBSSID_BCN_SPACE 0x0554 -#define REG_DRVERLYINT 0x0558 -#define REG_BCNDMATIM 0x0559 -#define REG_ATIMWND 0x055A -#define REG_BCN_MAX_ERR 0x055D -#define REG_RXTSF_OFFSET_CCK 0x055E -#define REG_RXTSF_OFFSET_OFDM 0x055F -#define REG_TSFTR 0x0560 -#define REG_INIT_TSFTR 0x0564 -#define REG_PSTIMER 0x0580 -#define REG_TIMER0 0x0584 -#define REG_TIMER1 0x0588 -#define REG_ACMHWCTRL 0x05C0 -#define REG_ACMRSTCTRL 0x05C1 -#define REG_ACMAVG 0x05C2 -#define REG_VO_ADMTIME 0x05C4 -#define REG_VI_ADMTIME 0x05C6 -#define REG_BE_ADMTIME 0x05C8 -#define REG_EDCA_RANDOM_GEN 0x05CC -#define REG_SCH_TXCMD 0x05D0 - - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -#define REG_APSD_CTRL 0x0600 -#define REG_BWOPMODE 0x0603 -#define REG_TCR 0x0604 -#define REG_RCR 0x0608 -#define REG_RX_PKT_LIMIT 0x060C -#define REG_RX_DLK_TIME 0x060D -#define REG_RX_DRVINFO_SZ 0x060F - -#define REG_MACID 0x0610 -#define REG_BSSID 0x0618 -#define REG_MAR 0x0620 -#define REG_MBIDCAMCFG 0x0628 - -#define REG_USTIME_EDCA 0x0638 -#define REG_MAC_SPEC_SIFS 0x063A - -// 20100719 Joseph: Hardware register definition change. (HW datasheet v54) -#define REG_R2T_SIFS 0x063C // [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK -#define REG_T2T_SIFS 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK -#define REG_ACKTO 0x0640 -#define REG_CTS2TO 0x0641 -#define REG_EIFS 0x0642 - -//WMA, BA, CCX -#define REG_NAV_CTRL 0x0650 -#define REG_BACAMCMD 0x0654 -#define REG_BACAMCONTENT 0x0658 -#define REG_LBDLY 0x0660 -#define REG_FWDLY 0x0661 -#define REG_RXERR_RPT 0x0664 -#define REG_WMAC_TRXPTCL_CTL 0x0668 - - -// Security -#define REG_CAMCMD 0x0670 -#define REG_CAMWRITE 0x0674 -#define REG_CAMREAD 0x0678 -#define REG_CAMDBG 0x067C -#define REG_SECCFG 0x0680 - -// Power -#define REG_WOW_CTRL 0x0690 -#define REG_PSSTATUS 0x0691 -#define REG_PS_RX_INFO 0x0692 -#define REG_LPNAV_CTRL 0x0694 -#define REG_WKFMCAM_CMD 0x0698 -#define REG_WKFMCAM_RWD 0x069C -#define REG_RXFLTMAP0 0x06A0 -#define REG_RXFLTMAP1 0x06A2 -#define REG_RXFLTMAP2 0x06A4 -#define REG_BCN_PSR_RPT 0x06A8 -#define REG_CALB32K_CTRL 0x06AC -#define REG_PKT_MON_CTRL 0x06B4 -#define REG_BT_COEX_TABLE 0x06C0 -#define REG_WMAC_RESP_TXINFO 0x06D8 - - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- -#define REG_USB_INFO 0xFE17 -#define REG_USB_SPECIAL_OPTION 0xFE55 -#define REG_USB_DMA_AGG_TO 0xFE5B -#define REG_USB_AGG_TO 0xFE5C -#define REG_USB_AGG_TH 0xFE5D - -// For test chip -#define REG_TEST_USB_TXQS 0xFE48 -#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61 -#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63 -#define REG_TEST_SIE_OPTIONAL 0xFE64 -#define REG_TEST_SIE_CHIRP_K 0xFE65 -#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B -#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 -#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 - - -// For normal chip -#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 -#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 -#define REG_NORMAL_SIE_OPTIONAL 0xFE64 -#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 -#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B -#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C -#define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only. -#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 -#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF - - -//----------------------------------------------------- -// -// Redifine 8192C register definition for compatibility -// -//----------------------------------------------------- - -// TODO: use these definition when using REG_xxx naming rule. -// NOTE: DO NOT Remove these definition. Use later. - -#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control. -#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable. -#define SYS_CLK REG_SYS_CLKR -#define CR9346 REG_9346CR // 93C46/93C56 Command Register. -#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. -#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. -#define MSR (REG_CR + 2) // Media Status register -#define ISR REG_HISR -#define TSFR REG_TSFTR // Timing Sync Function Timer Register. - -#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 -#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 - -#define PBP REG_PBP - -// Redifine MACID register, to compatible prior ICs. -#define IDR0 MACIDR0 -#define IDR4 MACIDR4 - - -// -// 9. Security Control Registers (Offset: ) -// -#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd -#define WCAMI REG_CAMWRITE // Software write CAM input content -#define RCAMO REG_CAMREAD // Software read/write CAM config -#define CAMDBG REG_CAMDBG -#define SECR REG_SECCFG //Security Configuration Register - -// Unused register -#define UnusedRegister 0x1BF -#define DCAM UnusedRegister -#define PSR UnusedRegister -#define BBAddr UnusedRegister -#define PhyDataR UnusedRegister - -#define InvalidBBRFValue 0x12345678 - -// Min Spacing related settings. -#define MAX_MSS_DENSITY_2T 0x13 -#define MAX_MSS_DENSITY_1T 0x0A - -//---------------------------------------------------------------------------- -// 8192C Cmd9346CR bits (Offset 0xA, 16bit) -//---------------------------------------------------------------------------- -#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 -#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 -#define Cmd9346CR_9356SEL BIT4 -#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL) -#define AutoLoadEFUSE CmdEEPROM_En - -//---------------------------------------------------------------------------- -// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) -//---------------------------------------------------------------------------- -#define GPIOSEL_GPIO 0 -#define GPIOSEL_ENBT BIT5 - -//---------------------------------------------------------------------------- -// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) -//---------------------------------------------------------------------------- -#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value -#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value -#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. -#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) - -//---------------------------------------------------------------------------- -// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) -//---------------------------------------------------------------------------- -/* -Network Type -00: No link -01: Link in ad hoc network -10: Link in infrastructure network -11: AP mode -Default: 00b. -*/ -#define MSR_NOLINK 0x00 -#define MSR_ADHOC 0x01 -#define MSR_INFRA 0x02 -#define MSR_AP 0x03 - -// -// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) -// -//---------------------------------------------------------------------------- -// 8192C Response Rate Set Register (offset 0x181, 24bits) -//---------------------------------------------------------------------------- -#define RRSR_RSC_OFFSET 21 -#define RRSR_SHORT_OFFSET 23 -#define RRSR_RSC_BW_40M 0x600000 -#define RRSR_RSC_UPSUBCHNL 0x400000 -#define RRSR_RSC_LOWSUBCHNL 0x200000 -#define RRSR_SHORT 0x800000 -#define RRSR_1M BIT0 -#define RRSR_2M BIT1 -#define RRSR_5_5M BIT2 -#define RRSR_11M BIT3 -#define RRSR_6M BIT4 -#define RRSR_9M BIT5 -#define RRSR_12M BIT6 -#define RRSR_18M BIT7 -#define RRSR_24M BIT8 -#define RRSR_36M BIT9 -#define RRSR_48M BIT10 -#define RRSR_54M BIT11 -#define RRSR_MCS0 BIT12 -#define RRSR_MCS1 BIT13 -#define RRSR_MCS2 BIT14 -#define RRSR_MCS3 BIT15 -#define RRSR_MCS4 BIT16 -#define RRSR_MCS5 BIT17 -#define RRSR_MCS6 BIT18 -#define RRSR_MCS7 BIT19 -#define BRSR_AckShortPmb BIT23 -// CCK ACK: use Short Preamble or not - - -//---------------------------------------------------------------------------- -// 8192C Rate Definition -//---------------------------------------------------------------------------- -//CCK -#define RATR_1M 0x00000001 -#define RATR_2M 0x00000002 -#define RATR_55M 0x00000004 -#define RATR_11M 0x00000008 -//OFDM -#define RATR_6M 0x00000010 -#define RATR_9M 0x00000020 -#define RATR_12M 0x00000040 -#define RATR_18M 0x00000080 -#define RATR_24M 0x00000100 -#define RATR_36M 0x00000200 -#define RATR_48M 0x00000400 -#define RATR_54M 0x00000800 -//MCS 1 Spatial Stream -#define RATR_MCS0 0x00001000 -#define RATR_MCS1 0x00002000 -#define RATR_MCS2 0x00004000 -#define RATR_MCS3 0x00008000 -#define RATR_MCS4 0x00010000 -#define RATR_MCS5 0x00020000 -#define RATR_MCS6 0x00040000 -#define RATR_MCS7 0x00080000 -//MCS 2 Spatial Stream -#define RATR_MCS8 0x00100000 -#define RATR_MCS9 0x00200000 -#define RATR_MCS10 0x00400000 -#define RATR_MCS11 0x00800000 -#define RATR_MCS12 0x01000000 -#define RATR_MCS13 0x02000000 -#define RATR_MCS14 0x04000000 -#define RATR_MCS15 0x08000000 - - -// NOTE: For 92CU - Ziv -//CCK -#define RATE_1M BIT(0) -#define RATE_2M BIT(1) -#define RATE_5_5M BIT(2) -#define RATE_11M BIT(3) -//OFDM -#define RATE_6M BIT(4) -#define RATE_9M BIT(5) -#define RATE_12M BIT(6) -#define RATE_18M BIT(7) -#define RATE_24M BIT(8) -#define RATE_36M BIT(9) -#define RATE_48M BIT(10) -#define RATE_54M BIT(11) -//MCS 1 Spatial Stream -#define RATE_MCS0 BIT(12) -#define RATE_MCS1 BIT(13) -#define RATE_MCS2 BIT(14) -#define RATE_MCS3 BIT(15) -#define RATE_MCS4 BIT(16) -#define RATE_MCS5 BIT(17) -#define RATE_MCS6 BIT(18) -#define RATE_MCS7 BIT(19) -//MCS 2 Spatial Stream -#define RATE_MCS8 BIT(20) -#define RATE_MCS9 BIT(21) -#define RATE_MCS10 BIT(22) -#define RATE_MCS11 BIT(23) -#define RATE_MCS12 BIT(24) -#define RATE_MCS13 BIT(25) -#define RATE_MCS14 BIT(26) -#define RATE_MCS15 BIT(27) - - - - -// ALL CCK Rate -#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M -#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ - RATR_36M|RATR_48M|RATR_54M -#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ - RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7 -#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9 |RATR_MCS10|RATR_MCS11|\ - RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 - -//---------------------------------------------------------------------------- -// 8192C BW_OPMODE bits (Offset 0x203, 8bit) -//---------------------------------------------------------------------------- -#define BW_OPMODE_20MHZ BIT2 -#define BW_OPMODE_5G BIT1 -#define BW_OPMODE_11J BIT0 - - -//---------------------------------------------------------------------------- -// 8192C CAM Config Setting (offset 0x250, 1 byte) -//---------------------------------------------------------------------------- -#define CAM_VALID BIT15 -#define CAM_NOTVALID 0x0000 -#define CAM_USEDK BIT5 - -#define CAM_CONTENT_COUNT 8 - -#define CAM_NONE 0x0 -#define CAM_WEP40 0x01 -#define CAM_TKIP 0x02 -#define CAM_AES 0x04 -#define CAM_WEP104 0x05 - -#define TOTAL_CAM_ENTRY 32 -#define HALF_CAM_ENTRY 16 - -#define CAM_CONFIG_USEDK _TRUE -#define CAM_CONFIG_NO_USEDK _FALSE - -#define CAM_WRITE BIT16 -#define CAM_READ 0x00000000 -#define CAM_POLLINIG BIT31 - -#define SCR_UseDK 0x01 -#define SCR_TxSecEnable 0x02 -#define SCR_RxSecEnable 0x04 - - -// -// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) -// -//---------------------------------------------------------------------------- -// 8190 IMR/ISR bits (offset 0xfd, 8bits) -//---------------------------------------------------------------------------- -#define IMR8190_DISABLED 0x0 -// IMR DW0 Bit 0-31 -#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6 -#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5 -#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4 -#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3 -#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2 -#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1 -#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8 -#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7 -#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6 -#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5 -#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4 -#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3 -#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2 -#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1 -#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2 -#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1 -#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow -#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt -#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0 -#define IMR_RXFOVW BIT12 // Receive FIFO Overflow -#define IMR_RDU BIT11 // Receive Descriptor Unavailable -#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt -#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup -#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt -#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup -#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt -#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt -#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt -#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt -#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt -#define IMR_VODOK BIT1 // AC_VO DMA Interrupt -#define IMR_ROK BIT0 // Receive DMA OK Interrupt - -#define IMR_RX_MASK (IMR_ROK|IMR_RDU|IMR_RXFOVW) -#define IMR_TX_MASK (IMR_VODOK|IMR_VIDOK|IMR_BEDOK|IMR_BKDOK|IMR_MGNTDOK|IMR_HIGHDOK|IMR_BDOK) - -// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh) -#define IMR_TXERR BIT11 -#define IMR_RXERR BIT10 -#define IMR_C2HCMD BIT9 -#define IMR_CPWM BIT8 -//RSVD [2-7] -#define IMR_OCPINT BIT1 -#define IMR_WLANOFF BIT0 - - - -//---------------------------------------------------------------------------- -// 8192C EFUSE -//---------------------------------------------------------------------------- -#define HWSET_MAX_SIZE 128 - - -//---------------------------------------------------------------------------- -// 8192C EEPROM/EFUSE share register definition. -//---------------------------------------------------------------------------- - -// -// Default Value for EEPROM or EFUSE!!! -// -#define EEPROM_Default_TSSI 0x0 -#define EEPROM_Default_TxPowerDiff 0x0 -#define EEPROM_Default_CrystalCap 0x5 -#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) -#define EEPROM_Default_TxPower 0x1010 -#define EEPROM_Default_HT2T_TxPwr 0x10 - -#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 -#define EEPROM_Default_ThermalMeter 0x12 - -#define EEPROM_Default_AntTxPowerDiff 0x0 -#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 -#define EEPROM_Default_TxPowerLevel 0x22 -#define EEPROM_Default_HT40_2SDiff 0x0 -#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference -#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 -#define EEPROM_Default_HT40_PwrMaxOffset 0 -#define EEPROM_Default_HT20_PwrMaxOffset 0 - -// For debug -#define EEPROM_Default_PID 0x1234 -#define EEPROM_Default_VID 0x5678 -#define EEPROM_Default_CustomerID 0xAB -#define EEPROM_Default_SubCustomerID 0xCD -#define EEPROM_Default_Version 0 - -#define EEPROM_CHANNEL_PLAN_FCC 0x0 -#define EEPROM_CHANNEL_PLAN_IC 0x1 -#define EEPROM_CHANNEL_PLAN_ETSI 0x2 -#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 -#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 -#define EEPROM_CHANNEL_PLAN_MKK 0x5 -#define EEPROM_CHANNEL_PLAN_MKK1 0x6 -#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 -#define EEPROM_CHANNEL_PLAN_TELEC 0x8 -#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 -#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA -#define EEPROM_CHANNEL_PLAN_NCC 0xB -#define EEPROM_USB_OPTIONAL1 0xE -#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 - - -#define EEPROM_CID_DEFAULT 0x0 -#define EEPROM_CID_TOSHIBA 0x4 -#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. -#define EEPROM_CID_QMI 0x0D -#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 - - -#define RTL_EEPROM_ID 0x8129 - - -#ifdef CONFIG_PCI_HCI -#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER) -#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) -#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) - -// -// Interface type. -// -typedef enum _INTERFACE_SELECT_8192CPCIe{ - INTF_SEL0_SOLO_MINICARD = 0, // WiFi solo-mCard - INTF_SEL1_BT_COMBO_MINICARD = 1, // WiFi+BT combo-mCard - INTF_SEL2_PCIe = 2, // PCIe Card -} INTERFACE_SELECT_8192CPCIe, *PINTERFACE_SELECT_8192CPCIe; - -#define RTL8190_EEPROM_ID 0x8129 // 0-1 -#define EEPROM_HPON 0x02 // LDO settings.2-5 -#define EEPROM_CLK 0x06 // Clock settings.6-7 -#define EEPROM_TESTR 0x08 // SE Test mode.8 - -#define EEPROM_VID 0x0A // SE Vendor ID.A-B -#define EEPROM_DID 0x0C // SE Device ID. C-D -#define EEPROM_SVID 0x0E // SE Vendor ID.E-F -#define EEPROM_SMID 0x10 // SE PCI Subsystem ID. 10-11 - -#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 - -//---------------------------------------------------------------- -// Ziv - Let PCIe and USB use the same define. Modify address mapping later. -#define EEPROM_CCK_TX_PWR_INX 0x5A -#define EEPROM_HT40_1S_TX_PWR_INX 0x60 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 -#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 -#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C -#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F -#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 - -#define EEPROM_CHANNEL_PLAN 0x75 -#define EEPROM_TSSI_A 0x76 -#define EEPROM_TSSI_B 0x77 -#define EEPROM_THERMAL_METER 0x78 -#define EEPROM_RF_OPT1 0x79 -#define EEPROM_RF_OPT2 0x7A -#define EEPROM_RF_OPT3 0x7B -#define EEPROM_RF_OPT4 0x7C -#define EEPROM_VERSION 0x7E -#define EEPROM_CUSTOMER_ID 0x7F - -#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] - -#endif - -#ifdef CONFIG_USB_HCI - -//should be renamed and moved to another file -typedef enum _BOARD_TYPE_8192CUSB{ - BOARD_USB_DONGLE = 0, // USB dongle - BOARD_USB_High_PA = 1, // USB dongle with high power PA - BOARD_MINICARD = 2, // Minicard - BOARD_USB_SOLO = 3, // USB solo-Slim module - BOARD_USB_COMBO = 4, // USB Combo-Slim module -} BOARD_TYPE_8192CUSB, *PBOARD_TYPE_8192CUSB; - -#define SUPPORT_HW_RADIO_DETECT(pHalData) (pHalData->BoardType == BOARD_MINICARD||\ - pHalData->BoardType == BOARD_USB_SOLO||\ - pHalData->BoardType == BOARD_USB_COMBO) - -//--------------------------------------------------------------- -// EEPROM address for Test chip -//--------------------------------------------------------------- -#define EEPROM_TEST_USB_OPT 0x0E -#define EEPROM_TEST_CHIRP_K 0x0F -#define EEPROM_TEST_EP_SETTING 0x0E -#define EEPROM_TEST_USB_PHY 0x10 - - -//--------------------------------------------------------------- -// EEPROM address for Normal chip -//--------------------------------------------------------------- -#define EEPROM_NORMAL_USB_OPT 0x0E -#define EEPROM_NORMAL_CHIRP_K 0x0E // Changed -#define EEPROM_NORMAL_EP_SETTING 0x0F // Changed -#define EEPROM_NORMAL_USB_PHY 0x12 // Changed - - -// Test chip and normal chip common define -//--------------------------------------------------------------- -// EEPROM address for both -//--------------------------------------------------------------- -#define EEPROM_ID0 0x00 -#define EEPROM_ID1 0x01 -#define EEPROM_RTK_RSV1 0x02 -#define EEPROM_RTK_RSV2 0x03 -#define EEPROM_RTK_RSV3 0x04 -#define EEPROM_RTK_RSV4 0x05 -#define EEPROM_RTK_RSV5 0x06 -#define EEPROM_DBG_SEL 0x07 -#define EEPROM_RTK_RSV6 0x08 -#define EEPROM_VID 0x0A -#define EEPROM_PID 0x0C - -#define EEPROM_MAC_ADDR 0x16 -#define EEPROM_STRING 0x1C -#define EEPROM_SUBCUSTOMER_ID 0x59 -#define EEPROM_CCK_TX_PWR_INX 0x5A -#define EEPROM_HT40_1S_TX_PWR_INX 0x60 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 -#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 -#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C -#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F -#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 - -#define EEPROM_CHANNEL_PLAN 0x75 -#define EEPROM_TSSI_A 0x76 -#define EEPROM_TSSI_B 0x77 -#define EEPROM_THERMAL_METER 0x78 -#define EEPROM_RF_OPT1 0x79 -#define EEPROM_RF_OPT2 0x7A -#define EEPROM_RF_OPT3 0x7B -#define EEPROM_RF_OPT4 0x7C -#define EEPROM_VERSION 0x7E -#define EEPROM_CUSTOMER_ID 0x7F - -#define EEPROM_BoardType 0x54 //0x0: RTL8188SU, 0x1: RTL8191SU, 0x2: RTL8192SU, 0x3: RTL8191GU -#define EEPROM_TxPwIndex 0x5C //0x5C-0x76, Tx Power index. -#define EEPROM_PwDiff 0x67 // Difference of gain index between legacy and high throughput OFDM. - -#define EEPROM_TxPowerCCK 0x5A // CCK Tx Power - -// 2009/02/09 Cosa Add for SD3 requirement -#define EEPROM_TX_PWR_HT20_DIFF 0x6e// HT20 Tx Power Index Difference -#define DEFAULT_HT20_TXPWR_DIFF 2 // HT20<->40 default Tx Power Index Difference -#define EEPROM_TX_PWR_OFDM_DIFF 0x71// OFDM Tx Power Index Difference - -#define EEPROM_TxPWRGroup 0x73// Power diff for channel group -#define EEPROM_Regulatory 0x79// Check if power safety is need - -#define EEPROM_BLUETOOTH_COEXIST 0x7E // 92cu, 0x7E[4] -#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] -#define BOARD_TYPE_NORMAL_MASK 0xE0 -#define BOARD_TYPE_TEST_MASK 0x0F -#define EEPROM_EASY_REPLACEMENT 0x50//BIT0 1 for build-in module, 0 for external dongle -//------------------------------------------------------------- -// EEPROM content definitions -//------------------------------------------------------------- -#define OS_LINK_SPEED BIT(5) - -#define BOARD_TYPE_MASK 0xF - -#define BT_COEXISTENCE BIT(4) -#define BT_CO_SHIFT 4 - -#define EP_NUMBER_MASK 0x30 //bit 4:5 0Eh -#define EP_NUMBER_SHIFT 4 - - -#define USB_PHY_PARA_SIZE 5 - - -//------------------------------------------------------------- -// EEPROM default value definitions -//------------------------------------------------------------- -// Use 0xABCD instead of 0x8192 for debug -#define EEPROM_DEF_ID_0 0xCD // Byte 0x00 -#define EEPROM_DEF_ID_1 0xAB // Byte 0x01 - -#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03 -#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04 -#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08 - -#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A -#define EEPROM_DEF_VID_1 0x0B - -#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C -#define EEPROM_DEF_PID_1 0x81 - - -#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E -#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E - -#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F - -#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10 -#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11 -#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12 -#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13 - -#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78 -#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79 - - -#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A - -#define RF_OPTION1 0x79// Check if power safety spec is need -#define RF_OPTION2 0x7A -#define RF_OPTION3 0x7B -#define RF_OPTION4 0x7C - - -#define EEPROM_USB_SN BIT(0) -#define EEPROM_USB_REMOTE_WAKEUP BIT(1) -#define EEPROM_USB_DEVICE_PWR BIT(2) -#define EEPROM_EP_NUMBER (BIT(3)|BIT(4)) - -#if 0 -#define EEPROM_CHANNEL_PLAN_FCC 0x0 -#define EEPROM_CHANNEL_PLAN_IC 0x1 -#define EEPROM_CHANNEL_PLAN_ETSI 0x2 -#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 -#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 -#define EEPROM_CHANNEL_PLAN_MKK 0x5 -#define EEPROM_CHANNEL_PLAN_MKK1 0x6 -#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 -#define EEPROM_CHANNEL_PLAN_TELEC 0x8 -#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 -#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA -#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 - -#define EEPROM_CID_DEFAULT 0x0 - -#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 - - -#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. -#endif - -#endif - - -/*=================================================================== -===================================================================== -Here the register defines are for 92C. When the define is as same with 92C, -we will use the 92C's define for the consistency -So the following defines for 92C is not entire!!!!!! -===================================================================== -=====================================================================*/ -/* -Based on Datasheet V33---090401 -Register Summary -Current IOREG MAP -0x0000h ~ 0x00FFh System Configuration (256 Bytes) -0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) -0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) -0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) -0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) -0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) -0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) -0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) -0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) -*/ - -//---------------------------------------------------------------------------- -// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) -//---------------------------------------------------------------------------- -#define RCR_APPFCS BIT31 //WMAC append FCS after pauload -#define RCR_APP_MIC BIT30 // -#define RCR_APP_PHYSTS BIT28// -#define RCR_APP_ICV BIT29 // -#define RCR_APP_PHYST_RXFF BIT28 // -#define RCR_APP_BA_SSN BIT27 //Accept BA SSN -#define RCR_ENMBID BIT24 //Enable Multiple BssId. -#define RCR_LSIGEN BIT23 -#define RCR_MFBEN BIT22 -#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 -#define RCR_AMF BIT13 //Accept management type frame -#define RCR_ACF BIT12 //Accept control type frame -#define RCR_ADF BIT11 //Accept data type frame -#define RCR_AICV BIT9 //Accept ICV error packet -#define RCR_ACRC32 BIT8 //Accept CRC32 error packet -#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) -#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) -#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet -#define RCR_APWRMGT BIT5 //Accept power management packet -#define RCR_ADD3 BIT4 //Accept address 3 match packet -#define RCR_AB BIT3 //Accept broadcast packet -#define RCR_AM BIT2 //Accept multicast packet -#define RCR_APM BIT1 //Accept physical match packet -#define RCR_AAP BIT0 //Accept all unicast packet -#define RCR_MXDMA_OFFSET 8 -#define RCR_FIFO_OFFSET 13 - - - -//============================================================================ -// 8192c USB specific Regsiter Offset and Content definition, -// 2009.08.18, added by vivi. for merge 92c and 92C into one driver -//============================================================================ -//#define APS_FSMCO 0x0004 same with 92Ce -#define RSV_CTRL 0x001C -#define RD_CTRL 0x0524 - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- -#define REG_USB_INFO 0xFE17 -#define REG_USB_SPECIAL_OPTION 0xFE55 -#define REG_USB_DMA_AGG_TO 0xFE5B -#define REG_USB_AGG_TO 0xFE5C -#define REG_USB_AGG_TH 0xFE5D - -#define REG_USB_VID 0xFE60 -#define REG_USB_PID 0xFE62 -#define REG_USB_OPTIONAL 0xFE64 -#define REG_USB_CHIRP_K 0xFE65 -#define REG_USB_PHY 0xFE66 -#define REG_USB_MAC_ADDR 0xFE70 - -#define REG_USB_HRPWM 0xFE58 -#define REG_USB_HCPWM 0xFE57 - -#define InvalidBBRFValue 0x12345678 - -//============================================================================ -// 8192C Regsiter Bit and Content definition -//============================================================================ -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- - -//2 SPS0_CTRL -#define SW18_FPWM BIT(3) - - -//2 SYS_ISO_CTRL -#define ISO_MD2PP BIT(0) -#define ISO_UA2USB BIT(1) -#define ISO_UD2CORE BIT(2) -#define ISO_PA2PCIE BIT(3) -#define ISO_PD2CORE BIT(4) -#define ISO_IP2MAC BIT(5) -#define ISO_DIOP BIT(6) -#define ISO_DIOE BIT(7) -#define ISO_EB2CORE BIT(8) -#define ISO_DIOR BIT(9) - -#define PWC_EV25V BIT(14) -#define PWC_EV12V BIT(15) - - -//2 SYS_FUNC_EN -#define FEN_BBRSTB BIT(0) -#define FEN_BB_GLB_RSTn BIT(1) -#define FEN_USBA BIT(2) -#define FEN_UPLL BIT(3) -#define FEN_USBD BIT(4) -#define FEN_DIO_PCIE BIT(5) -#define FEN_PCIEA BIT(6) -#define FEN_PPLL BIT(7) -#define FEN_PCIED BIT(8) -#define FEN_DIOE BIT(9) -#define FEN_CPUEN BIT(10) -#define FEN_DCORE BIT(11) -#define FEN_ELDR BIT(12) -#define FEN_DIO_RF BIT(13) -#define FEN_HWPDN BIT(14) -#define FEN_MREGEN BIT(15) - -//2 APS_FSMCO -#define PFM_LDALL BIT(0) -#define PFM_ALDN BIT(1) -#define PFM_LDKP BIT(2) -#define PFM_WOWL BIT(3) -#define EnPDN BIT(4) -#define PDN_PL BIT(5) -#define APFM_ONMAC BIT(8) -#define APFM_OFF BIT(9) -#define APFM_RSM BIT(10) -#define AFSM_HSUS BIT(11) -#define AFSM_PCIE BIT(12) -#define APDM_MAC BIT(13) -#define APDM_HOST BIT(14) -#define APDM_HPDN BIT(15) -#define RDY_MACON BIT(16) -#define SUS_HOST BIT(17) -#define ROP_ALD BIT(20) -#define ROP_PWR BIT(21) -#define ROP_SPS BIT(22) -#define SOP_MRST BIT(25) -#define SOP_FUSE BIT(26) -#define SOP_ABG BIT(27) -#define SOP_AMB BIT(28) -#define SOP_RCK BIT(29) -#define SOP_A8M BIT(30) -#define XOP_BTCK BIT(31) - -//2 SYS_CLKR -#define ANAD16V_EN BIT(0) -#define ANA8M BIT(1) -#define MACSLP BIT(4) -#define LOADER_CLK_EN BIT(5) -#define _80M_SSC_DIS BIT(7) -#define _80M_SSC_EN_HO BIT(8) -#define PHY_SSC_RSTB BIT(9) -#define SEC_CLK_EN BIT(10) -#define MAC_CLK_EN BIT(11) -#define SYS_CLK_EN BIT(12) -#define RING_CLK_EN BIT(13) - - -//2 9346CR - - -#define EEDO BIT(0) -#define EEDI BIT(1) -#define EESK BIT(2) -#define EECS BIT(3) -//#define EERPROMSEL BIT(4) -//#define EEPROM_EN BIT(5) -#define BOOT_FROM_EEPROM BIT(4) -#define EEPROM_EN BIT(5) -#define EEM0 BIT(6) -#define EEM1 BIT(7) - - -//2 AFE_MISC -#define AFE_BGEN BIT(0) -#define AFE_MBEN BIT(1) -#define MAC_ID_EN BIT(7) - - -//2 SPS0_CTRL - - -//2 SPS_OCP_CFG - - -//2 RSV_CTRL -#define WLOCK_ALL BIT(0) -#define WLOCK_00 BIT(1) -#define WLOCK_04 BIT(2) -#define WLOCK_08 BIT(3) -#define WLOCK_40 BIT(4) -#define R_DIS_PRST_0 BIT(5) -#define R_DIS_PRST_1 BIT(6) -#define LOCK_ALL_EN BIT(7) - -//2 RF_CTRL -#define RF_EN BIT(0) -#define RF_RSTB BIT(1) -#define RF_SDMRSTB BIT(2) - - - -//2 LDOA15_CTRL -#define LDA15_EN BIT(0) -#define LDA15_STBY BIT(1) -#define LDA15_OBUF BIT(2) -#define LDA15_REG_VOS BIT(3) -#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) - - - -//2 LDOV12D_CTRL -#define LDV12_EN BIT(0) -#define LDV12_SDBY BIT(1) -#define LPLDO_HSM BIT(2) -#define LPLDO_LSM_DIS BIT(3) -#define _LDV12_VADJ(x) (((x) & 0xF) << 4) - - -//2 AFE_XTAL_CTRL -#define XTAL_EN BIT(0) -#define XTAL_BSEL BIT(1) -#define _XTAL_BOSC(x) (((x) & 0x3) << 2) -#define _XTAL_CADJ(x) (((x) & 0xF) << 4) -#define XTAL_GATE_USB BIT(8) -#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9) -#define XTAL_GATE_AFE BIT(11) -#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12) -#define XTAL_RF_GATE BIT(14) -#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15) -#define XTAL_GATE_DIG BIT(17) -#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18) -#define XTAL_BT_GATE BIT(20) -#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) -#define _XTAL_GPIO(x) (((x) & 0x7) << 23) - - -#define CKDLY_AFE BIT(26) -#define CKDLY_USB BIT(27) -#define CKDLY_DIG BIT(28) -#define CKDLY_BT BIT(29) - - -//2 AFE_PLL_CTRL -#define APLL_EN BIT(0) -#define APLL_320_EN BIT(1) -#define APLL_FREF_SEL BIT(2) -#define APLL_EDGE_SEL BIT(3) -#define APLL_WDOGB BIT(4) -#define APLL_LPFEN BIT(5) - -#define APLL_REF_CLK_13MHZ 0x1 -#define APLL_REF_CLK_19_2MHZ 0x2 -#define APLL_REF_CLK_20MHZ 0x3 -#define APLL_REF_CLK_25MHZ 0x4 -#define APLL_REF_CLK_26MHZ 0x5 -#define APLL_REF_CLK_38_4MHZ 0x6 -#define APLL_REF_CLK_40MHZ 0x7 - -#define APLL_320EN BIT(14) -#define APLL_80EN BIT(15) -#define APLL_1MEN BIT(24) - - -//2 EFUSE_CTRL -#define ALD_EN BIT(18) -#define EF_PD BIT(19) -#define EF_FLAG BIT(31) - -//2 EFUSE_TEST (For RTL8723 partially) -#define EF_TRPT BIT(7) -#define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 -#define LDOE25_EN BIT(31) -#define EFUSE_SEL(x) (((x) & 0x3) << 8) -#define EFUSE_SEL_MASK 0x300 -#define EFUSE_WIFI_SEL_0 0x0 -#define EFUSE_BT_SEL_0 0x1 -#define EFUSE_BT_SEL_1 0x2 -#define EFUSE_BT_SEL_2 0x3 - -#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. -#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. - -//2 PWR_DATA - -//2 CAL_TIMER - -//2 ACLK_MON -#define RSM_EN BIT(0) -#define Timer_EN BIT(4) - - -//2 GPIO_MUXCFG -#define TRSW0EN BIT(2) -#define TRSW1EN BIT(3) -#define EROM_EN BIT(4) -#define EnBT BIT(5) -#define EnUart BIT(8) -#define Uart_910 BIT(9) -#define EnPMAC BIT(10) -#define SIC_SWRST BIT(11) -#define EnSIC BIT(12) -#define SIC_23 BIT(13) -#define EnHDP BIT(14) -#define SIC_LBK BIT(15) - -//2 GPIO_PIN_CTRL - -// GPIO BIT -#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2) - -//2 GPIO_INTM - -//2 LEDCFG -#define LED0PL BIT(4) -#define LED0DIS BIT(7) -#define LED1DIS BIT(15) -#define LED1PL BIT(12) - -#define SECCAM_CLR BIT(30) - - -//2 FSIMR - -//2 FSISR - - -//2 8051FWDL -//2 MCUFWDL -#define MCUFWDL_EN BIT(0) -#define MCUFWDL_RDY BIT(1) -#define FWDL_ChkSum_rpt BIT(2) -#define MACINI_RDY BIT(3) -#define BBINI_RDY BIT(4) -#define RFINI_RDY BIT(5) -#define WINTINI_RDY BIT(6) -#define CPRST BIT(23) - -//2REG_HPON_FSM -#define BOND92CE_1T2R_CFG BIT(22) - - -//2 REG_SYS_CFG -#define XCLK_VLD BIT(0) -#define ACLK_VLD BIT(1) -#define UCLK_VLD BIT(2) -#define PCLK_VLD BIT(3) -#define PCIRSTB BIT(4) -#define V15_VLD BIT(5) -#define TRP_B15V_EN BIT(7) -#define SIC_IDLE BIT(8) -#define BD_MAC2 BIT(9) -#define BD_MAC1 BIT(10) -#define IC_MACPHY_MODE BIT(11) -#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) -#define BT_FUNC BIT(16) -#define VENDOR_ID BIT(19) -#define PAD_HWPD_IDN BIT(22) -#define TRP_VAUX_EN BIT(23) -#define TRP_BT_EN BIT(24) -#define BD_PKG_SEL BIT(25) -#define BD_HCI_SEL BIT(26) -#define TYPE_ID BIT(27) - -#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 -#define CHIP_VER_RTL_SHIFT 12 - -//2REG_GPIO_OUTSTS (For RTL8723 only) -#define EFS_HCI_SEL (BIT(0)|BIT(1)) -#define PAD_HCI_SEL (BIT(2)|BIT(3)) -#define HCI_SEL (BIT(4)|BIT(5)) -#define PKG_SEL_HCI BIT(6) -#define FEN_GPS BIT(7) -#define FEN_BT BIT(8) -#define FEN_WL BIT(9) -#define FEN_PCI BIT(10) -#define FEN_USB BIT(11) -#define BTRF_HWPDN_N BIT(12) -#define WLRF_HWPDN_N BIT(13) -#define PDN_BT_N BIT(14) -#define PDN_GPS_N BIT(15) -#define BT_CTL_HWPDN BIT(16) -#define GPS_CTL_HWPDN BIT(17) -#define PPHY_SUSB BIT(20) -#define UPHY_SUSB BIT(21) -#define PCI_SUSEN BIT(22) -#define USB_SUSEN BIT(23) -#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- - - -//2 Function Enable Registers -//2 CR - -#define REG_LBMODE (REG_CR + 3) - - -#define HCI_TXDMA_EN BIT(0) -#define HCI_RXDMA_EN BIT(1) -#define TXDMA_EN BIT(2) -#define RXDMA_EN BIT(3) -#define PROTOCOL_EN BIT(4) -#define SCHEDULE_EN BIT(5) -#define MACTXEN BIT(6) -#define MACRXEN BIT(7) -#define ENSWBCN BIT(8) -#define ENSEC BIT(9) - -// Network type -#define _NETTYPE(x) (((x) & 0x3) << 16) -#define MASK_NETTYPE 0x30000 -#define NT_NO_LINK 0x0 -#define NT_LINK_AD_HOC 0x1 -#define NT_LINK_AP 0x2 -#define NT_AS_AP 0x3 - -#define _LBMODE(x) (((x) & 0xF) << 24) -#define MASK_LBMODE 0xF000000 -#define LOOPBACK_NORMAL 0x0 -#define LOOPBACK_IMMEDIATELY 0xB -#define LOOPBACK_MAC_DELAY 0x3 -#define LOOPBACK_PHY 0x1 -#define LOOPBACK_DMA 0x7 - - -//2 PBP - Page Size Register -#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) -#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) -#define _PSRX_MASK 0xF -#define _PSTX_MASK 0xF0 -#define _PSRX(x) (x) -#define _PSTX(x) ((x) << 4) - -#define PBP_64 0x0 -#define PBP_128 0x1 -#define PBP_256 0x2 -#define PBP_512 0x3 -#define PBP_1024 0x4 - - -//2 TX/RXDMA -#define RXDMA_ARBBW_EN BIT(0) -#define RXSHFT_EN BIT(1) -#define RXDMA_AGG_EN BIT(2) -#define QS_VO_QUEUE BIT(8) -#define QS_VI_QUEUE BIT(9) -#define QS_BE_QUEUE BIT(10) -#define QS_BK_QUEUE BIT(11) -#define QS_MANAGER_QUEUE BIT(12) -#define QS_HIGH_QUEUE BIT(13) - -#define HQSEL_VOQ BIT(0) -#define HQSEL_VIQ BIT(1) -#define HQSEL_BEQ BIT(2) -#define HQSEL_BKQ BIT(3) -#define HQSEL_MGTQ BIT(4) -#define HQSEL_HIQ BIT(5) - -// For normal driver, 0x10C -#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) -#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) -#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) -#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) -#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) -#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) - -#define QUEUE_LOW 1 -#define QUEUE_NORMAL 2 -#define QUEUE_HIGH 3 - - - -//2 TRXFF_BNDY - - -//2 LLT_INIT -#define _LLT_NO_ACTIVE 0x0 -#define _LLT_WRITE_ACCESS 0x1 -#define _LLT_READ_ACCESS 0x2 - -#define _LLT_INIT_DATA(x) ((x) & 0xFF) -#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) -#define _LLT_OP(x) (((x) & 0x3) << 30) -#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) - - -//2 BB_ACCESS_CTRL -#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) -#define BB_WRITE_EN BIT(30) -#define BB_READ_EN BIT(31) -//#define BB_ADDR_MASK 0xFFF -//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK) - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -//2 RQPN -#define _HPQ(x) ((x) & 0xFF) -#define _LPQ(x) (((x) & 0xFF) << 8) -#define _PUBQ(x) (((x) & 0xFF) << 16) -#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register - - -#define HPQ_PUBLIC_DIS BIT(24) -#define LPQ_PUBLIC_DIS BIT(25) -#define LD_RQPN BIT(31) - - -//2 TDECTRL -#define BCN_VALID BIT(16) -#define BCN_HEAD(x) (((x) & 0xFF) << 8) -#define BCN_HEAD_MASK 0xFF00 - -//2 TDECTL -#define BLK_DESC_NUM_SHIFT 4 -#define BLK_DESC_NUM_MASK 0xF - - -//2 TXDMA_OFFSET_CHK -#define DROP_DATA_EN BIT(9) - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -//2 FWHW_TXQ_CTRL -#define EN_AMPDU_RTY_NEW BIT(7) - -//2 INIRTSMCS_SEL -#define _INIRTSMCS_SEL(x) ((x) & 0x3F) - - -//2 SPEC SIFS -#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) -#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) - - -//2 RRSR - -#define RATE_REG_BITMAP_ALL 0xFFFFF - -#define _RRSC_BITMAP(x) ((x) & 0xFFFFF) - -#define _RRSR_RSC(x) (((x) & 0x3) << 21) -#define RRSR_RSC_RESERVED 0x0 -#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 -#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 -#define RRSR_RSC_DUPLICATE_MODE 0x3 - - -//2 ARFR -#define USE_SHORT_G1 BIT(20) - -//2 AGGLEN_LMT_L -#define _AGGLMT_MCS0(x) ((x) & 0xF) -#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4) -#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8) -#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12) -#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16) -#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20) -#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) -#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) - - -//2 RL -#define RETRY_LIMIT_SHORT_SHIFT 8 -#define RETRY_LIMIT_LONG_SHIFT 0 - - -//2 DARFRC -#define _DARF_RC1(x) ((x) & 0x1F) -#define _DARF_RC2(x) (((x) & 0x1F) << 8) -#define _DARF_RC3(x) (((x) & 0x1F) << 16) -#define _DARF_RC4(x) (((x) & 0x1F) << 24) -// NOTE: shift starting from address (DARFRC + 4) -#define _DARF_RC5(x) ((x) & 0x1F) -#define _DARF_RC6(x) (((x) & 0x1F) << 8) -#define _DARF_RC7(x) (((x) & 0x1F) << 16) -#define _DARF_RC8(x) (((x) & 0x1F) << 24) - - -//2 RARFRC -#define _RARF_RC1(x) ((x) & 0x1F) -#define _RARF_RC2(x) (((x) & 0x1F) << 8) -#define _RARF_RC3(x) (((x) & 0x1F) << 16) -#define _RARF_RC4(x) (((x) & 0x1F) << 24) -// NOTE: shift starting from address (RARFRC + 4) -#define _RARF_RC5(x) ((x) & 0x1F) -#define _RARF_RC6(x) (((x) & 0x1F) << 8) -#define _RARF_RC7(x) (((x) & 0x1F) << 16) -#define _RARF_RC8(x) (((x) & 0x1F) << 24) - - - - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - - - -//2 EDCA setting -#define AC_PARAM_TXOP_LIMIT_OFFSET 16 -#define AC_PARAM_ECW_MAX_OFFSET 12 -#define AC_PARAM_ECW_MIN_OFFSET 8 -#define AC_PARAM_AIFS_OFFSET 0 - - -//2 EDCA_VO_PARAM -#define _AIFS(x) (x) -#define _ECW_MAX_MIN(x) ((x) << 8) -#define _TXOP_LIMIT(x) ((x) << 16) - - -#define _BCNIFS(x) ((x) & 0xFF) -#define _BCNECW(x) (((x) & 0xF))<< 8) - - -#define _LRL(x) ((x) & 0x3F) -#define _SRL(x) (((x) & 0x3F) << 8) - - -//2 SIFS_CCK -#define _SIFS_CCK_CTX(x) ((x) & 0xFF) -#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); - - -//2 SIFS_OFDM -#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) -#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); - - -//2 TBTT PROHIBIT -#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) - - -//2 REG_RD_CTRL -#define DIS_EDCA_CNT_DWN BIT(11) - - -//2 BCN_CTRL -#define EN_MBSSID BIT(1) -#define EN_TXBCN_RPT BIT(2) -#define EN_BCN_FUNCTION BIT(3) - -// The same function but different bit field. -#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) -#define DIS_TSF_UDT0_TEST_CHIP BIT(5) - -//2 ACMHWCTRL -#define AcmHw_HwEn BIT(0) -#define AcmHw_BeqEn BIT(1) -#define AcmHw_ViqEn BIT(2) -#define AcmHw_VoqEn BIT(3) -#define AcmHw_BeqStatus BIT(4) -#define AcmHw_ViqStatus BIT(5) -#define AcmHw_VoqStatus BIT(6) - - - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- - -//2 APSD_CTRL -#define APSDOFF BIT(6) -#define APSDOFF_STATUS BIT(7) - - -//2 BWOPMODE -#define BW_20MHZ BIT(2) -//#define BW_OPMODE_20MHZ BIT(2) // For compability - - -#define RATE_BITMAP_ALL 0xFFFFF - -// Only use CCK 1M rate for ACK -#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 - -//2 TCR -#define TSFRST BIT(0) -#define DIS_GCLK BIT(1) -#define PAD_SEL BIT(2) -#define PWR_ST BIT(6) -#define PWRBIT_OW_EN BIT(7) -#define ACRC BIT(8) -#define CFENDFORM BIT(9) -#define ICV BIT(10) - - - -//2 RCR -#define AAP BIT(0) -#define APM BIT(1) -#define AM BIT(2) -#define AB BIT(3) -#define ADD3 BIT(4) -#define APWRMGT BIT(5) -#define CBSSID BIT(6) -#define CBSSID_BCN BIT(7) -#define ACRC32 BIT(8) -#define AICV BIT(9) -#define ADF BIT(11) -#define ACF BIT(12) -#define AMF BIT(13) -#define HTC_LOC_CTRL BIT(14) -#define UC_DATA_EN BIT(16) -#define BM_DATA_EN BIT(17) -#define MFBEN BIT(22) -#define LSIGEN BIT(23) -#define EnMBID BIT(24) -#define APP_BASSN BIT(27) -#define APP_PHYSTS BIT(28) -#define APP_ICV BIT(29) -#define APP_MIC BIT(30) -#define APP_FCS BIT(31) - -//2 RX_PKT_LIMIT - -//2 RX_DLK_TIME - -//2 MBIDCAMCFG - - - -//2 AMPDU_MIN_SPACE -#define _MIN_SPACE(x) ((x) & 0x7) -#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) - - -//2 RXERR_RPT -#define RXERR_TYPE_OFDM_PPDU 0 -#define RXERR_TYPE_OFDM_FALSE_ALARM 1 -#define RXERR_TYPE_OFDM_MPDU_OK 2 -#define RXERR_TYPE_OFDM_MPDU_FAIL 3 -#define RXERR_TYPE_CCK_PPDU 4 -#define RXERR_TYPE_CCK_FALSE_ALARM 5 -#define RXERR_TYPE_CCK_MPDU_OK 6 -#define RXERR_TYPE_CCK_MPDU_FAIL 7 -#define RXERR_TYPE_HT_PPDU 8 -#define RXERR_TYPE_HT_FALSE_ALARM 9 -#define RXERR_TYPE_HT_MPDU_TOTAL 10 -#define RXERR_TYPE_HT_MPDU_OK 11 -#define RXERR_TYPE_HT_MPDU_FAIL 12 -#define RXERR_TYPE_RX_FULL_DROP 15 - -#define RXERR_COUNTER_MASK 0xFFFFF -#define RXERR_RPT_RST BIT(27) -#define _RXERR_RPT_SEL(type) ((type) << 28) - - -//2 SECCFG -#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key -#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key -#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption -#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption -#define SCR_SKByA2 BIT(4) //Search kEY BY A2 -#define SCR_NoSKMC BIT(5) //No Key Search Multicast - - - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- - -//2 USB Information (0xFE17) -#define USB_IS_HIGH_SPEED 0 -#define USB_IS_FULL_SPEED 1 -#define USB_SPEED_MASK BIT(5) - -#define USB_NORMAL_SIE_EP_MASK 0xF -#define USB_NORMAL_SIE_EP_SHIFT 4 - -#define USB_TEST_EP_MASK 0x30 -#define USB_TEST_EP_SHIFT 4 - -//2 Special Option -#define USB_AGG_EN BIT(3) - - -//2REG_C2HEVT_CLEAR -#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message -#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. - - -//2REG_MULTI_FUNC_CTRL(For RTL8723 Only) -#define WL_HWPDN_EN BIT0 // Enable GPIO[9] as WiFi HW PDn source -#define WL_HWPDN_SL BIT1 // WiFi HW PDn polarity control -#define WL_FUNC_EN BIT2 // WiFi function enable -#define WL_HWROF_EN BIT3 // Enable GPIO[9] as WiFi RF HW PDn source -#define BT_HWPDN_EN BIT16 // Enable GPIO[11] as BT HW PDn source -#define BT_HWPDN_SL BIT17 // BT HW PDn polarity control -#define BT_FUNC_EN BIT18 // BT function enable -#define BT_HWROF_EN BIT19 // Enable GPIO[11] as BT/GPS RF HW PDn source -#define GPS_HWPDN_EN BIT20 // Enable GPIO[10] as GPS HW PDn source -#define GPS_HWPDN_SL BIT21 // GPS HW PDn polarity control -#define GPS_FUNC_EN BIT22 // GPS function enable - -//3 REG_LIFECTRL_CTRL -#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3 -#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2 -#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1 -#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0 - -#define HAL92C_MSDU_LIFE_TIME_UNIT 128 // in us, said by Tim. - -//======================================================== -// General definitions -//======================================================== - -#define MAC_ADDR_LEN 6 -#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 - -#define POLLING_LLT_THRESHOLD 20 -#define POLLING_READY_TIMEOUT_COUNT 1000 - -// Min Spacing related settings. -#define MAX_MSS_DENSITY_2T 0x13 -#define MAX_MSS_DENSITY_1T 0x0A - -//---------------------------------------------------------------------------- -// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) -//---------------------------------------------------------------------------- -#define GPIOSEL_GPIO 0 -#define GPIOSEL_ENBT BIT5 - -//---------------------------------------------------------------------------- -// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) -//---------------------------------------------------------------------------- -#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value -#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value -#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. -#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) - - - -#include "basic_types.h" - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h deleted file mode 100755 index e74fe69685fc..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h +++ /dev/null @@ -1,54 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTL8192C_SRESET_C_ -#define _RTL8192C_SRESET_C_ - -#include -#include -#include - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM -#define WIFI_STATUS_SUCCESS 0 -#define USB_VEN_REQ_CMD_FAIL BIT0 -#define USB_READ_PORT_FAIL BIT1 -#define USB_WRITE_PORT_FAIL BIT2 -#define WIFI_MAC_TXDMA_ERROR BIT3 -#define WIFI_TX_HANG BIT4 -#define WIFI_RX_HANG BIT5 -#define WIFI_IF_NOT_EXIST BIT6 - -struct sreset_priv { - _mutex silentreset_mutex; - u8 silent_reset_inprogress; - u8 Wifi_Error_Status; - unsigned long last_tx_time; - unsigned long last_tx_complete_time; -}; - - -extern void rtl8192c_sreset_init_value(_adapter *padapter); -extern void rtl8192c_sreset_reset_value(_adapter *padapter); -extern void rtl8192c_silentreset_for_specific_platform(_adapter *padapter); -extern void rtl8192c_sreset_xmit_status_check(_adapter *padapter); -extern void rtl8192c_sreset_linked_status_check(_adapter *padapter); -extern u8 rtl8192c_sreset_get_wifi_status(_adapter *padapter); -#endif -#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h deleted file mode 100755 index f4428afd636a..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h +++ /dev/null @@ -1,91 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTL8192C_XMIT_H_ -#define _RTL8192C_XMIT_H_ - -#define VO_QUEUE_INX 0 -#define VI_QUEUE_INX 1 -#define BE_QUEUE_INX 2 -#define BK_QUEUE_INX 3 -#define BCN_QUEUE_INX 4 -#define MGT_QUEUE_INX 5 -#define HIGH_QUEUE_INX 6 -#define TXCMD_QUEUE_INX 7 - -#define HW_QUEUE_ENTRY 8 - -// -// Queue Select Value in TxDesc -// -#define QSLT_BK 0x2//0x01 -#define QSLT_BE 0x0 -#define QSLT_VI 0x5//0x4 -#define QSLT_VO 0x7//0x6 -#define QSLT_BEACON 0x10 -#define QSLT_HIGH 0x11 -#define QSLT_MGNT 0x12 -#define QSLT_CMD 0x13 - -#ifdef CONFIG_USB_HCI - -#ifdef CONFIG_USB_TX_AGGREGATION -#define MAX_TX_AGG_PACKET_NUMBER 0xFF -#endif - -s32 rtl8192cu_init_xmit_priv(_adapter * padapter); - -void rtl8192cu_free_xmit_priv(_adapter * padapter); - -void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc); - -s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); - -void rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); - -s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); - -#ifdef CONFIG_HOSTAPD_MLME -s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); -#endif - -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8192ce_init_xmit_priv(_adapter * padapter); -void rtl8192ce_free_xmit_priv(_adapter * padapter); - -s32 rtl8192ce_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf); -struct xmit_buf *rtl8192ce_dequeue_xmitbuf(struct rtw_tx_ring *ring); - -void rtl8192ce_xmitframe_resume(_adapter *padapter); - -void rtl8192ce_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); - -s32 rtl8192ce_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); - -#ifdef CONFIG_HOSTAPD_MLME -s32 rtl8192ce_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); -#endif - -#endif - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h deleted file mode 100755 index 9f9a9303e5a4..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h +++ /dev/null @@ -1,103 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192D_CMD_H_ -#define __RTL8192D_CMD_H_ - - -//-------------------------------------------- -//3 Host Message Box -//-------------------------------------------- - -// User Define Message [31:8] - -//_SETPWRMODE_PARM -#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) -#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) -#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) - -//JOINBSSRPT_PARM -#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) - -//_RSVDPAGE_LOC -#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) -#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) -#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) - -//P2P_PS_OFFLOAD - -struct P2P_PS_Offload_t { - unsigned char Offload_En:1; - unsigned char role:1; // 1: Owner, 0: Client - unsigned char CTWindow_En:1; - unsigned char NoA0_En:1; - unsigned char NoA1_En:1; - unsigned char AllStaSleep:1; // Only valid in Owner - unsigned char discovery:1; - unsigned char rsvd:1; -}; - -#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) -#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) -#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value) -#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value) -#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value) -#define SET_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value) -#define SET_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value) - -// Description: Determine the types of H2C commands that are the same in driver and Fw. -// Fisrt constructed by tynli. 2009.10.09. -typedef enum _RTL8192D_H2C_CMD -{ - H2C_AP_OFFLOAD = 0, /*0*/ - H2C_SETPWRMODE = 1, /*1*/ - H2C_JOINBSSRPT = 2, /*2*/ - H2C_RSVDPAGE = 3, - H2C_RSSI_REPORT = 5, - H2C_RA_MASK = 6, - H2C_P2P_PS_OFFLOAD = 8, - H2C_MAC_MODE_SEL = 9, - H2C_PWRM=15, - H2C_P2P_PS_CTW_CMD = 24, - H2C_CMD_MAX -}RTL8192D_H2C_CMD; - -struct cmd_msg_parm { - u8 eid; //element id - u8 sz; // sz - u8 buf[6]; -}; - - -void FillH2CCmd92D(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer); - -// host message to firmware cmd -void rtl8192d_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode); -void rtl8192d_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus); -u8 rtl8192d_set_rssi_cmd(_adapter*padapter, u8 *param); -u8 rtl8192d_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg); -void rtl8192d_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg); -#ifdef CONFIG_P2P -void rtl8192d_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state); -#endif //CONFIG_P2P - -#endif - - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h deleted file mode 100755 index 560f9578fd77..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h +++ /dev/null @@ -1,471 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192D_DM_H__ -#define __RTL8192D_DM_H__ -//============================================================ -// Description: -// -// This file is for 92CE/92CU dynamic mechanism only -// -// -//============================================================ -//============================================================ -// Global var -//============================================================ -static u32 EDCAParam[maxAP][3] = -{ // UL DL - {0x5ea322, 0x00a630, 0x00a44f}, //atheros AP - {0x5ea32b, 0x5ea42b, 0x5e4322}, //broadcom AP - {0x5ea430, 0x5ea630, 0xa430}, //cisco AP - {0x5ea44f, 0x00a44f, 0x5ea42b}, //marvell AP - {0x5ea422, 0x00a44f, 0x00a44f}, //ralink AP - //{0x5ea44f, 0x5ea44f, 0x5ea44f}, //realtek AP - {0xa44f, 0x5ea44f, 0x5e431c}, //realtek AP - {0x5ea42b, 0xa630, 0x5e431c}, //airgocap AP - {0x5ea42b, 0x5ea42b, 0x5ea42b}, //unknown AP -// {0x5e4322, 0x00a44f, 0x5ea44f}, //unknown AP -}; - -#define OFDM_TABLE_SIZE 37 -#define OFDM_TABLE_SIZE_92D 43 -#define CCK_TABLE_SIZE 33 - -static u32 OFDMSwingTable[OFDM_TABLE_SIZE_92D] = { - 0x7f8001fe, // 0, +6.0dB - 0x788001e2, // 1, +5.5dB - 0x71c001c7, // 2, +5.0dB - 0x6b8001ae, // 3, +4.5dB - 0x65400195, // 4, +4.0dB - 0x5fc0017f, // 5, +3.5dB - 0x5a400169, // 6, +3.0dB - 0x55400155, // 7, +2.5dB - 0x50800142, // 8, +2.0dB - 0x4c000130, // 9, +1.5dB - 0x47c0011f, // 10, +1.0dB - 0x43c0010f, // 11, +0.5dB - 0x40000100, // 12, +0dB - 0x3c8000f2, // 13, -0.5dB - 0x390000e4, // 14, -1.0dB - 0x35c000d7, // 15, -1.5dB - 0x32c000cb, // 16, -2.0dB - 0x300000c0, // 17, -2.5dB - 0x2d4000b5, // 18, -3.0dB - 0x2ac000ab, // 19, -3.5dB - 0x288000a2, // 20, -4.0dB - 0x26000098, // 21, -4.5dB - 0x24000090, // 22, -5.0dB - 0x22000088, // 23, -5.5dB - 0x20000080, // 24, -6.0dB - 0x1e400079, // 25, -6.5dB - 0x1c800072, // 26, -7.0dB - 0x1b00006c, // 27. -7.5dB - 0x19800066, // 28, -8.0dB - 0x18000060, // 29, -8.5dB - 0x16c0005b, // 30, -9.0dB - 0x15800056, // 31, -9.5dB - 0x14400051, // 32, -10.0dB - 0x1300004c, // 33, -10.5dB - 0x12000048, // 34, -11.0dB - 0x11000044, // 35, -11.5dB - 0x10000040, // 36, -12.0dB - 0x0f00003c,// 37, -12.5dB - 0x0e400039,// 38, -13.0dB - 0x0d800036,// 39, -13.5dB - 0x0cc00033,// 40, -14.0dB - 0x0c000030,// 41, -14.5dB - 0x0b40002d,// 42, -15.0dB -}; - -static u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = { -{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB -{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB -{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB -{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB -{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB -{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB -{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB -{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB -{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB -{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB -{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB -{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB -{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB -{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB -{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB -{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB -{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB -{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB -{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB -{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB -{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB -{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB -{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB -{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB -{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB -{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB -{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB -{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB -{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB -{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB -{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB -{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB -{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB -}; - -static u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= { -{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB -{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB -{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB -{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB -{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB -{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB -{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB -{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB -{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB -{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB -{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB -{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB -{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB -{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB -{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB -{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB -{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB -{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB -{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB -{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB -{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB -{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB -{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB -{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB -{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB -{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB -{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB -{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB -{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB -{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB -{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB -{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB -{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB -}; - -//============================================================ -// structure and define -//============================================================ - -typedef struct _FALSE_ALARM_STATISTICS{ - u32 Cnt_Parity_Fail; - u32 Cnt_Rate_Illegal; - u32 Cnt_Crc8_fail; - u32 Cnt_Mcs_fail; - u32 Cnt_Fast_Fsync_fail; - u32 Cnt_SB_Search_fail; - u32 Cnt_Ofdm_fail; - u32 Cnt_Cck_fail; - u32 Cnt_all; -}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; - -typedef struct _Dynamic_Power_Saving_ -{ - u8 PreCCAState; - u8 CurCCAState; - - u8 PreRFState; - u8 CurRFState; - - //int Rssi_val_min; - -}PS_T,*pPS_T; - -typedef struct _Dynamic_Initial_Gain_Threshold_ -{ - u8 Dig_Enable_Flag; - u8 Dig_Ext_Port_Stage; - - int RssiLowThresh; - int RssiHighThresh; - - u32 FALowThresh; - u32 FAHighThresh; - - u8 CurSTAConnectState; - u8 PreSTAConnectState; - u8 CurMultiSTAConnectState; - - u8 PreIGValue; - u8 CurIGValue; - - char BackoffVal; - char BackoffVal_range_max; - char BackoffVal_range_min; - u8 rx_gain_range_max; - u8 rx_gain_range_min; - u8 Rssi_val_min; - - u8 PreCCKPDState; - u8 CurCCKPDState; - - u8 LargeFAHit; - u8 ForbiddenIGI; - u32 Recover_cnt; - - //u8 PreCCAState; - //u8 CurCCAState; -}DIG_T; - -typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition -{ - DIG_TYPE_THRESH_HIGH = 0, - DIG_TYPE_THRESH_LOW = 1, - DIG_TYPE_BACKOFF = 2, - DIG_TYPE_RX_GAIN_MIN = 3, - DIG_TYPE_RX_GAIN_MAX = 4, - DIG_TYPE_ENABLE = 5, - DIG_TYPE_DISABLE = 6, - DIG_OP_TYPE_MAX -}DM_DIG_OP_E; - -typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition -{ - CCK_PD_STAGE_LowRssi = 0, - CCK_PD_STAGE_HighRssi = 1, - CCK_PD_STAGE_MAX = 2, -}DM_CCK_PDTH_E; - -typedef enum tag_1R_CCA_Type_Definition -{ - CCA_MIN = 0, - CCA_1R =1, - CCA_2R = 2, - CCA_MAX = 3, -}DM_1R_CCA_E; - -typedef enum tag_RF_Type_Definition -{ - RF_Save =0, - RF_Normal = 1, - RF_MAX = 2, -}DM_RF_E; - -typedef enum tag_DIG_EXT_PORT_ALGO_Definition -{ - DIG_EXT_PORT_STAGE_0 = 0, - DIG_EXT_PORT_STAGE_1 = 1, - DIG_EXT_PORT_STAGE_2 = 2, - DIG_EXT_PORT_STAGE_3 = 3, - DIG_EXT_PORT_STAGE_MAX = 4, -}DM_DIG_EXT_PORT_ALG_E; - - -typedef enum tag_DIG_Connect_Definition -{ - DIG_STA_DISCONNECT = 0, - DIG_STA_CONNECT = 1, - DIG_STA_BEFORE_CONNECT = 2, - DIG_MultiSTA_DISCONNECT = 3, - DIG_MultiSTA_CONNECT = 4, - DIG_CONNECT_MAX -}DM_DIG_CONNECT_E; - - - -#define BW_AUTO_SWITCH_HIGH_LOW 25 -#define BW_AUTO_SWITCH_LOW_HIGH 30 - -#define DM_DIG_THRESH_HIGH 40 -#define DM_DIG_THRESH_LOW 35 - -#define DM_FALSEALARM_THRESH_LOW 400 -#define DM_FALSEALARM_THRESH_HIGH 1000 - -#define DM_DIG_MAX 0x3e -#define DM_DIG_MIN 0x1c - -#define DM_DIG_FA_UPPER 0x32 -#define DM_DIG_FA_LOWER 0x20 -#define DM_DIG_FA_TH0 0x100//0x20 -#define DM_DIG_FA_TH1 0x400//0x100 -#define DM_DIG_FA_TH2 0x600//0x200 - -#define DM_DIG_BACKOFF_MAX 12 -#define DM_DIG_BACKOFF_MIN (-4) -#define DM_DIG_BACKOFF_DEFAULT 10 - -#define RxPathSelection_SS_TH_low 30 -#define RxPathSelection_diff_TH 18 - -#define DM_RATR_STA_INIT 0 -#define DM_RATR_STA_HIGH 1 -#define DM_RATR_STA_MIDDLE 2 -#define DM_RATR_STA_LOW 3 - -#define CTSToSelfTHVal 30 -#define RegC38_TH 20 - -#define WAIotTHVal 25 - -//Dynamic Tx Power Control Threshold -#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 -#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 - -#define TxHighPwrLevel_Normal 0 -#define TxHighPwrLevel_Level1 1 -#define TxHighPwrLevel_Level2 2 - -#define DM_Type_ByFW 0 -#define DM_Type_ByDriver 1 - -typedef struct _RATE_ADAPTIVE -{ - u8 RateAdaptiveDisabled; - u8 RATRState; - u16 reserve; - - u32 HighRSSIThreshForRA; - u32 High2LowRSSIThreshForRA; - u8 Low2HighRSSIThreshForRA40M; - u32 LowRSSIThreshForRA40M; - u8 Low2HighRSSIThreshForRA20M; - u32 LowRSSIThreshForRA20M; - u32 UpperRSSIThresholdRATR; - u32 MiddleRSSIThresholdRATR; - u32 LowRSSIThresholdRATR; - u32 LowRSSIThresholdRATR40M; - u32 LowRSSIThresholdRATR20M; - u8 PingRSSIEnable; //cosa add for Netcore long range ping issue - u32 PingRSSIRATR; //cosa add for Netcore long range ping issue - u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue - u32 LastRATR; - u8 PreRATRState; - -} RATE_ADAPTIVE, *PRATE_ADAPTIVE; - -struct dm_priv -{ - u8 DM_Type; - u8 DMFlag, DMFlag_tmp; - - //for DIG - u8 bDMInitialGainEnable; - //u8 binitialized; // for dm_initial_gain_Multi_STA use. - DIG_T DM_DigTable; - - PS_T DM_PSTable; - - FALSE_ALARM_STATISTICS FalseAlmCnt; - - //for rate adaptive, in fact, 88c/92c fw will handle this - u8 bUseRAMask; - RATE_ADAPTIVE RateAdaptive; - - //* Upper and Lower Signal threshold for Rate Adaptive*/ - int UndecoratedSmoothedPWDB; - int EntryMinUndecoratedSmoothedPWDB; - int EntryMaxUndecoratedSmoothedPWDB; - int MinUndecoratedPWDBForDM; - int LastMinUndecoratedPWDBForDM; - - //for High Power - u8 bDynamicTxPowerEnable; - u8 LastDTPLvl; - u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 - - //for tx power tracking - u8 bTXPowerTracking; - u8 TXPowercount; - u8 bTXPowerTrackingInit; - u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default - u8 TM_Trigger; - - u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 - u8 ThermalValue; - u8 ThermalValue_LCK; - u8 ThermalValue_IQK; - u8 ThermalValue_AVG[AVG_THERMAL_NUM]; - u8 ThermalValue_AVG_index; - u8 ThermalValue_RxGain; - u8 ThermalValue_Crystal; - u8 Delta_IQK; - u8 Delta_LCK; - u8 bRfPiEnable; - u8 bReloadtxpowerindex; - u8 bDoneTxpower; - - //for APK - u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a - u8 bAPKdone; - u8 bAPKThermalMeterIgnore; - - //for IQK - u32 Reg874; - u32 RegC08; - u32 Reg88C; - u8 Reg522; - u8 Reg550; - u8 Reg551; - u32 Reg870; - u32 ADDA_backup[IQK_ADDA_REG_NUM]; - u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; - u32 IQK_BB_backup[IQK_BB_REG_NUM]; - - u8 bCCKinCH14; - - char CCK_index; - //u8 Record_CCK_20Mindex; - //u8 Record_CCK_40Mindex; - char OFDM_index[2]; - - //for TxPwrTracking - int RegE94; - int RegE9C; - int RegEB4; - int RegEBC; -#if MP_DRIVER == 1 - u8 RegC04_MP; - u32 RegD04_MP; -#endif - u32 TXPowerTrackingCallbackCnt; //cosa add for debug - - u32 prv_traffic_idx; // edca turbo - - u32 RegRF3C[2]; //pathA / pathB - - // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas - u8 INIDATA_RATE[32]; -}; - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ -/*------------------------Export Marco Definition---------------------------*/ -//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} - - -//============================================================ -// function prototype -//============================================================ -void rtl8192d_init_dm_priv(IN PADAPTER Adapter); -void rtl8192d_deinit_dm_priv(IN PADAPTER Adapter); -void rtl8192d_InitHalDm(IN PADAPTER Adapter); -void rtl8192d_HalDmWatchDog(IN PADAPTER Adapter); - -VOID rtl8192d_dm_CheckTXPowerTracking(IN PADAPTER Adapter); - -#endif //__HAL8190PCIDM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h deleted file mode 100755 index 0996a5c2fb73..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h +++ /dev/null @@ -1,857 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192D_HAL_H__ -#define __RTL8192D_HAL_H__ - -#include "rtl8192d_spec.h" -#include "Hal8192DPhyReg.h" -#include "Hal8192DPhyCfg.h" -#include "rtl8192d_rf.h" -#include "rtl8192d_dm.h" -#include "rtl8192d_recv.h" -#include "rtl8192d_xmit.h" -#include "rtl8192d_cmd.h" - -#ifdef CONFIG_PCI_HCI - #include - #include "Hal8192DEHWImg.h" - #include "Hal8192DETestHWImg.h" - - #define RTL819X_DEFAULT_RF_TYPE RF_2T2R - //#define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - - //2TODO: The following need to check!! - #define RTL8192D_FW_IMG "rtl8192DE\\rtl8192dfw.bin" - - //For 92DE - #define RTL8192D_PHY_REG "rtl8192DE\\PHY_REG.txt" - #define RTL8192D_PHY_REG_PG "rtl8192DE\\PHY_REG_PG.txt" - #define RTL8192D_PHY_REG_MP "rtl8192DE\\PHY_REG_MP.txt" - - #define RTL8192D_AGC_TAB "rtl8192DE\\AGC_TAB.txt" - #define RTL8192D_AGC_TAB_2G "rtl8192DE\\AGC_TAB_2G.txt" - #define RTL8192D_AGC_TAB_5G "rtl8192DE\\AGC_TAB_5G.txt" - #define RTL8192D_PHY_RADIO_A "rtl8192DE\\radio_a.txt" - #define RTL8192D_PHY_RADIO_B "rtl8192DE\\radio_b.txt" - #define RTL8192D_PHY_MACREG "rtl8192DE\\MAC_REG.txt" - #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DE\\radio_a_intPA.txt" - #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DE\\radio_b_intPA.txt" - - #define RTL8192D_TEST_FW_IMG_FILE "rtl8192DE\\rtl8192dfw_test.bin" - #define RTL8192D_TEST_PHY_REG_PG_FILE "rtl8192DE\\PHY_REG_PG_test.txt" - - #define RTL8192D_TEST_PHY_REG_FILE "rtl8192DE\\PHY_REG_test.txt" - #define RTL8192D_TEST_PHY_RADIO_A_FILE "rtl8192DE\\radio_a_test.txt" - #define RTL8192D_TEST_PHY_RADIO_B_FILE "rtl8192DE\\radio_b_test.txt" - #define RTL8192D_TEST_AGC_TAB_2G "rtl8192DE\\AGC_TAB_2G_test.txt" - #define RTL8192D_TEST_AGC_TAB_5G "rtl8192DE\\AGC_TAB_5G_test.txt" - #define RTL8192D_TEST_MAC_REG_FILE "rtl8192DE\\MAC_REG_test.txt" - - // The file name "_2T" is for 92CE, "_1T" is for 88CE. Modified by tynli. 2009.11.24. - #define Rtl819XFwImageArray Rtl8192DEFwImgArray - #define Rtl819XMAC_Array Rtl8192DEMAC_2TArray - #define Rtl819XAGCTAB_Array Rtl8192DEAGCTAB_Array - #define Rtl819XAGCTAB_5GArray Rtl8192DEAGCTAB_5GArray - #define Rtl819XAGCTAB_2GArray Rtl8192DEAGCTAB_2GArray - #define Rtl819XPHY_REG_2TArray Rtl8192DEPHY_REG_2TArray - #define Rtl819XPHY_REG_1TArray Rtl8192DEPHY_REG_1TArray - #define Rtl819XRadioA_2TArray Rtl8192DERadioA_2TArray - #define Rtl819XRadioA_1TArray Rtl8192DERadioA_1TArray - #define Rtl819XRadioA_2T_intPAArray Rtl8192DERadioA_2T_intPAArray - #define Rtl819XRadioB_2TArray Rtl8192DERadioB_2TArray - #define Rtl819XRadioB_1TArray Rtl8192DERadioB_1TArray - #define Rtl819XRadioB_2T_intPAArray Rtl8192DERadioB_2T_intPAArray - #define Rtl819XPHY_REG_Array_PG Rtl8192DEPHY_REG_Array_PG - #define Rtl819XPHY_REG_Array_MP Rtl8192DEPHY_REG_Array_MP - #define Rtl819XAGCTAB_2TArray Rtl8192DEAGCTAB_2TArray - #define Rtl819XAGCTAB_1TArray Rtl8192DEAGCTAB_1TArray - -#elif defined(CONFIG_USB_HCI) - - #include "Hal8192DUHWImg.h" - #include "Hal8192DUTestHWImg.h" - - //2TODO: We should define 8192S firmware related macro settings here!! - #define RTL819X_DEFAULT_RF_TYPE RF_1T2R - #define RTL819X_TOTAL_RF_PATH 2 - - //2TODO: The following need to check!! - #define RTL8192D_FW_IMG "rtl8192DU\\rtl8192dfw.bin" - - //For 92DU - #define RTL8192D_PHY_REG "rtl8192DU\\PHY_REG.txt" - #define RTL8192D_PHY_REG_PG "rtl8192DU\\PHY_REG_PG.txt" - #define RTL8192D_PHY_REG_MP "rtl8192DU\\PHY_REG_MP.txt" - - #define RTL8192D_AGC_TAB "rtl8192DU\\AGC_TAB.txt" - #define RTL8192D_AGC_TAB_2G "rtl8192DU\\AGC_TAB_2G.txt" - #define RTL8192D_AGC_TAB_5G "rtl8192DU\\AGC_TAB_5G.txt" - #define RTL8192D_PHY_RADIO_A "rtl8192DU\\radio_a.txt" - #define RTL8192D_PHY_RADIO_B "rtl8192DU\\radio_b.txt" - #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DU\\radio_a_intPA.txt" - #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DU\\radio_b_intPA.txt" - #define RTL8192D_PHY_MACREG "rtl8192DU\\MAC_REG.txt" - - #define RTL8192D_TEST_FW_IMG_FILE "rtl8192DU\\rtl8192dfw_test.bin" - #define RTL8192D_TEST_PHY_REG_PG_FILE "rtl8192DU\\PHY_REG_PG_test.txt" - - #define RTL8192D_TEST_PHY_REG_FILE "rtl8192DU\\PHY_REG_test.txt" - #define RTL8192D_TEST_PHY_RADIO_A_FILE "rtl8192DU\\radio_a_test.txt" - #define RTL8192D_TEST_PHY_RADIO_B_FILE "rtl8192DU\\radio_b_test.txt" - #define RTL8192D_TEST_AGC_TAB_2G "rtl8192DU\\AGC_TAB_2G_test.txt" - #define RTL8192D_TEST_AGC_TAB_5G "rtl8192DU\\AGC_TAB_5G_test.txt" - #define RTL8192D_TEST_MAC_REG_FILE "rtl8192DU\\MAC_REG_test.txt" - - // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24. - #define Rtl819XFwImageArray Rtl8192DUFwImgArray - #define Rtl819XMAC_Array Rtl8192DUMAC_2TArray - #define Rtl819XAGCTAB_Array Rtl8192DUAGCTAB_Array - #define Rtl819XAGCTAB_5GArray Rtl8192DUAGCTAB_5GArray - #define Rtl819XAGCTAB_2GArray Rtl8192DUAGCTAB_2GArray - #define Rtl819XPHY_REG_2TArray Rtl8192DUPHY_REG_2TArray - #define Rtl819XPHY_REG_1TArray Rtl8192DUPHY_REG_1TArray - #define Rtl819XRadioA_2TArray Rtl8192DURadioA_2TArray - #define Rtl819XRadioA_1TArray Rtl8192DURadioA_1TArray - #define Rtl819XRadioA_2T_intPAArray Rtl8192DURadioA_2T_intPAArray - #define Rtl819XRadioB_2TArray Rtl8192DURadioB_2TArray - #define Rtl819XRadioB_1TArray Rtl8192DURadioB_1TArray - #define Rtl819XRadioB_2T_intPAArray Rtl8192DURadioB_2T_intPAArray - #define Rtl819XPHY_REG_Array_PG Rtl8192DUPHY_REG_Array_PG - #define Rtl819XPHY_REG_Array_MP Rtl8192DUPHY_REG_Array_MP - - #define Rtl819XAGCTAB_2TArray Rtl8192DUAGCTAB_2TArray - #define Rtl819XAGCTAB_1TArray Rtl8192DUAGCTAB_1TArray - -#endif - -#define DRVINFO_SZ 4 // unit is 8bytes -#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) - -// -// Check if FW header exists. We do not consider the lower 4 bits in this case. -// By tynli. 2009.12.04. -// -#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D0 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D1 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D2 ||\ - (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D3 ) - -#define FW_8192D_SIZE 0x8000 -#define FW_8192D_START_ADDRESS 0x1000 - -#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes - -typedef enum _FIRMWARE_SOURCE{ - FW_SOURCE_IMG_FILE = 0, - FW_SOURCE_HEADER_FILE = 1, //from header file -}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; - -typedef struct _RT_FIRMWARE{ - FIRMWARE_SOURCE eFWSource; - #ifdef CONFIG_EMBEDDED_FWIMG - u8* szFwBuffer; - #else - u8 szFwBuffer[FW_8192D_SIZE]; - #endif - u32 ulFwLength; -}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92D, *PRT_FIRMWARE_92D; - -// -// This structure must be cared byte-ordering -// -// Added by tynli. 2009.12.04. -typedef struct _RT_8192D_FIRMWARE_HDR {//8-byte alinment required - - //--- LONG WORD 0 ---- - u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut - u8 Category; // AP/NIC and USB/PCI - u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions - u16 Version; // FW Version - u8 Subversion; // FW Subversion, default 0x00 - u8 Rsvd1; - - - //--- LONG WORD 1 ---- - u8 Month; // Release time Month field - u8 Date; // Release time Date field - u8 Hour; // Release time Hour field - u8 Minute; // Release time Minute field - u16 RamCodeSize; // The size of RAM code - u16 Rsvd2; - - //--- LONG WORD 2 ---- - u32 SvnIdx; // The SVN entry index - u32 Rsvd3; - - //--- LONG WORD 3 ---- - u32 Rsvd4; - u32 Rsvd5; - -}RT_8192D_FIRMWARE_HDR, *PRT_8192D_FIRMWARE_HDR; - -#define DRIVER_EARLY_INT_TIME 0x05 -#define BCN_DMA_ATIME_INT_TIME 0x02 - -typedef enum _BT_CoType{ - BT_2Wire = 0, - BT_ISSC_3Wire = 1, - BT_Accel = 2, - BT_CSR = 3, - BT_CSR_ENHAN = 4, - BT_RTL8756 = 5, -} BT_CoType, *PBT_CoType; - -typedef enum _BT_CurState{ - BT_OFF = 0, - BT_ON = 1, -} BT_CurState, *PBT_CurState; - -typedef enum _BT_ServiceType{ - BT_SCO = 0, - BT_A2DP = 1, - BT_HID = 2, - BT_HID_Idle = 3, - BT_Scan = 4, - BT_Idle = 5, - BT_OtherAction = 6, - BT_Busy = 7, - BT_OtherBusy = 8, -} BT_ServiceType, *PBT_ServiceType; - -typedef enum _BT_RadioShared{ - BT_Radio_Shared = 0, - BT_Radio_Individual = 1, -} BT_RadioShared, *PBT_RadioShared; - -typedef struct _BT_COEXIST_STR{ - u8 BluetoothCoexist; - u8 BT_Ant_Num; - u8 BT_CoexistType; - u8 BT_State; - u8 BT_CUR_State; //0:on, 1:off - u8 BT_Ant_isolation; //0:good, 1:bad - u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic - u8 BT_Service; - u8 BT_RadioSharedType; - u8 Ratio_Tx; - u8 Ratio_PRI; -}BT_COEXIST_STR, *PBT_COEXIST_STR; - -//Added for 92D IQK setting. -typedef struct _IQK_MATRIX_REGS_SETTING{ - BOOLEAN bIQKDone; -#if 1 - int Value[1][IQK_Matrix_REG_NUM]; -#else - u32 Mark[IQK_Matrix_REG_NUM]; - u32 Value[IQK_Matrix_REG_NUM]; -#endif -}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING; - -#ifdef CONFIG_USB_RX_AGGREGATION - -typedef enum _USB_RX_AGG_MODE{ - USB_RX_AGG_DISABLE, - USB_RX_AGG_DMA, - USB_RX_AGG_USB, - USB_RX_AGG_DMA_USB -}USB_RX_AGG_MODE; - -#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer - -#endif - - -#define TX_SELE_HQ BIT(0) // High Queue -#define TX_SELE_LQ BIT(1) // Low Queue -#define TX_SELE_NQ BIT(2) // Normal Queue - - -// Note: We will divide number of page equally for each queue other than public queue! - -#define TX_TOTAL_PAGE_NUMBER 0xF8 -#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) - -// For Normal Chip Setting -// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER -#define NORMAL_PAGE_NUM_PUBQ 0x56 - - -// For Test Chip Setting -// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER -#define TEST_PAGE_NUM_PUBQ 0x89 -#define TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC 0x7A -#define NORMAL_PAGE_NUM_PUBQ_92D_DUAL_MAC 0x5A -#define NORMAL_PAGE_NUM_HPQ_92D_DUAL_MAC 0x10 -#define NORMAL_PAGE_NUM_LPQ_92D_DUAL_MAC 0x10 -#define NORMAL_PAGE_NUM_NORMALQ_92D_DUAL_MAC 0 - -#define TX_PAGE_BOUNDARY_DUAL_MAC (TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC + 1) - -// For Test Chip Setting -#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 -#define WMM_TEST_PAGE_NUM_HPQ 0x29 -#define WMM_TEST_PAGE_NUM_LPQ 0x29 - - -//Note: For Normal Chip Setting ,modify later -#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 -#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 - -#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 -#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 -#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C -#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C - -#define WMM_NORMAL_PAGE_NUM_PUBQ_92D 0X65//0x82 -#define WMM_NORMAL_PAGE_NUM_HPQ_92D 0X30//0x29 -#define WMM_NORMAL_PAGE_NUM_LPQ_92D 0X30 -#define WMM_NORMAL_PAGE_NUM_NPQ_92D 0X30 - -//------------------------------------------------------------------------- -// Chip specific -//------------------------------------------------------------------------- -#define CHIP_92C BIT(0) -#define CHIP_92C_1T2R BIT(1) -#define CHIP_8723 BIT(2) // RTL8723 With BT feature -#define CHIP_8723_DRV_REV BIT(3) // RTL8723 Driver Revised -#define NORMAL_CHIP BIT(4) -#define CHIP_VENDOR_UMC BIT(5) -#define CHIP_VENDOR_UMC_B_CUT BIT(6) // Chip version for ECO - -//for 92D -#define CHIP_92D BIT(8) -#define CHIP_92D_SINGLEPHY BIT(9) -#define CHIP_92D_C_CUT BIT(10) -#define CHIP_92D_D_CUT BIT(11) -#define CHIP_92D_E_CUT BIT(12) - -#define IS_NORMAL_CHIP(version) (((version) & NORMAL_CHIP) ? _TRUE : _FALSE) -#define IS_92C_SERIAL(version) (((version) & CHIP_92C) ? _TRUE : _FALSE) -#define IS_8723_SERIES(version) (((version) & CHIP_8723) ? _TRUE : _FALSE) -#define IS_92C_1T2R(version) (((version) & CHIP_92C) && ((version) & CHIP_92C_1T2R)) -#define IS_VENDOR_UMC(version) (((version) & CHIP_VENDOR_UMC) ? _TRUE : _FALSE) -#define IS_VENDOR_UMC_A_CUT(version) (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT6|BIT7)) ? _FALSE : _TRUE) : _FALSE) -#define IS_VENDOR_8723_A_CUT(version) (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT6)) ? _FALSE : _TRUE) : _FALSE) - -#define IS_92D_SINGLEPHY(version) ((version & CHIP_92D_SINGLEPHY) ? _TRUE : _FALSE) -#define IS_92D_C_CUT(version) ((version & CHIP_92D_C_CUT) ? _TRUE : _FALSE) -#define IS_92D_D_CUT(version) ((version & CHIP_92D_D_CUT) ? _TRUE : _FALSE) -#define IS_92D_E_CUT(version) ((version & CHIP_92D_E_CUT) ? _TRUE : _FALSE) - -// 20100707 Joseph: Add vendor information into chip version definition. -// 20100902 Roger: Add UMC B-Cut and RTL8723 chip info definition. -/* -| BIT 7 | BIT6 | BIT 5 | BIT 4 | BIT 3 | BIT 2 | BIT 1 | BIT 0 | -+--------+---------+---------------------- +------------ +----------- +------ +-----------------+ -|Reserved | UMC BCut |Manufacturer(TSMC/UMC) | TEST/NORMAL | 8723 Version | 8723? | 1T2R? | 88C/92C | -*/ -/* -92D chip ver: -BIT8: IS 92D -BIT9: single phy -BIT10: C-cut -BIT11: D-cut -BIT12: E-cut -*/ -typedef enum _VERSION_8192D{ - VERSION_TEST_CHIP_88C = 0x00, - VERSION_TEST_CHIP_92C = 0x01, - VERSION_NORMAL_TSMC_CHIP_88C = 0x10, - VERSION_NORMAL_TSMC_CHIP_92C = 0x11, - VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x13, - VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x30, - VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x31, - VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x33, - VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x34, - VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x3c, - VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x70, - VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x71, - VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x73, - VERSION_TEST_CHIP_92D_SINGLEPHY= 0x300, - VERSION_TEST_CHIP_92D_DUALPHY = 0x100, - VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x310, - VERSION_NORMAL_CHIP_92D_DUALPHY = 0x110, - VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x710, - VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x510, - VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0xB10, - VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x910, - VERSION_NORMAL_CHIP_92D_E_CUT_SINGLEPHY = 0x1310, - VERSION_NORMAL_CHIP_92D_E_CUT_DUALPHY = 0x1110, -}VERSION_8192D,*PVERSION_8192D; - - -//------------------------------------------------------------------------- -// Channel Plan -//------------------------------------------------------------------------- -enum ChannelPlan{ - CHPL_FCC = 0, - CHPL_IC = 1, - CHPL_ETSI = 2, - CHPL_SPAIN = 3, - CHPL_FRANCE = 4, - CHPL_MKK = 5, - CHPL_MKK1 = 6, - CHPL_ISRAEL = 7, - CHPL_TELEC = 8, - CHPL_GLOBAL = 9, - CHPL_WORLD = 10, -}; - -typedef struct _TxPowerInfo{ - u8 CCKIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT40_1SIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT40_2SIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT20IndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 OFDMIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT40MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 HT20MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; - u8 TSSI_A[3]; - u8 TSSI_B[3]; -}TxPowerInfo, *PTxPowerInfo; - -#define EFUSE_REAL_CONTENT_LEN 1024 -#define EFUSE_MAP_LEN 256 -#define EFUSE_MAX_SECTION 32 -#define EFUSE_MAX_SECTION_BASE 16 -// To prevent out of boundary programming case, leave 1byte and program full section -// 9bytes + 1byt + 5bytes and pre 1byte. -// For worst case: -// | 2byte|----8bytes----|1byte|--7bytes--| //92D -#define EFUSE_OOB_PROTECT_BYTES 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. - -#ifdef CONFIG_PCI_HCI -struct hal_data_8192de -{ - VERSION_8192D VersionID; - - // add for 92D Phy mode/mac/Band mode - MACPHY_MODE_8192D MacPhyMode92D; - BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G - BAND_TYPE BandSet92D; - BOOLEAN bIsVS; - BOOLEAN bSupportRemoteWakeUp; - u8 AutoLoadStatusFor8192D; - - u16 CustomerID; - - u16 FirmwareVersion; - u16 FirmwareVersionRev; - u16 FirmwareSubVersion; - - u32 IntrMask[2]; - u32 IntrMaskToSet[2]; - - u32 DisabledFunctions; - - //current WIFI_PHY values - u32 ReceiveConfig; - u32 TransmitConfig; - WIRELESS_MODE CurrentWirelessMode; - HT_CHANNEL_WIDTH CurrentChannelBW; - u8 CurrentChannel; - u8 nCur40MhzPrimeSC;// Control channel sub-carrier - u16 BasicRateSet; - - //rf_ctrl - u8 rf_chip; - u8 rf_type; - u8 NumTotalRFPath; - - // - // EEPROM setting. - // - u16 EEPROMVID; - u16 EEPROMDID; - u16 EEPROMSVID; - u16 EEPROMSMID; - u16 EEPROMChannelPlan; - u16 EEPROMVersion; - - u8 EEPROMCustomerID; - u8 EEPROMBoardType; - u8 EEPROMRegulatory; - - u8 EEPROMThermalMeter; - - u8 EEPROMC9; - u8 EEPROMCC; - - u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER_2G]; - u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff - u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff - // For power group - u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - - u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff - - u8 CrystalCap; // CrystalCap. - -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv bt_coexist; -#endif - - // Read/write are allow for following hardware information variables - u8 framesync; - u32 framesyncC34; - u8 framesyncMonitor; - u8 DefaultInitialGain[4]; - u8 pwrGroupCnt; - u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; - u32 CCKTxPowerLevelOriginalOffset; - - u32 AntennaTxPath; // Antenna path Tx - u32 AntennaRxPath; // Antenna path Rx - u8 BluetoothCoexist; - u8 ExternalPA; - u8 InternalPA5G[2]; //pathA / pathB - - //u32 LedControlNum; - //u32 LedControlMode; - //u32 TxPowerTrackControl; - u8 b1x1RecvCombine; // for 1T1R receive combining - - u8 bCurrentTurboEDCA; - u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. - - //vivi, for tx power tracking, 20080407 - //u16 TSSI_13dBm; - //u32 Pwr_Track; - // The current Tx Power Level - u8 CurrentCckTxPwrIdx; - u8 CurrentOfdm24GTxPwrIdx; - - BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D - - BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. - - u32 RfRegChnlVal[2]; - - u8 bCckHighPower; - - BOOLEAN bPhyValueInitReady; - - BOOLEAN bTXPowerDataReadFromEEPORM; - - BOOLEAN bInSetPower; - - //RDG enable - BOOLEAN bRDGEnable; - - BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress - BOOLEAN bNeedIQK; - - BOOLEAN bLCKInProgress; - - BOOLEAN bEarlyModeEnable; - -#if 1 - IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; -#else - //regc80regc94regc4cregc88regc9cregc14regca0regc1cregc78 - u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM]; - IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel. -#endif - - //for host message to fw - u8 LastHMEBoxNum; - - u8 fw_ractrl; - u8 RegTxPause; - // Beacon function related global variable. - u32 RegBcnCtrlVal; - u8 RegFwHwTxQCtrl; - u8 RegReg542; - - struct dm_priv dmpriv; - - u8 bInterruptMigration; - - u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. - - // Add for dual MAC 0--Mac0 1--Mac1 - u32 interfaceIndex; - - u16 RegRRSR; - - u16 EfuseUsedBytes; - u8 RTSInitRate; // 2010.11.24.by tynli. -#ifdef CONFIG_P2P - struct P2P_PS_Offload_t p2p_ps_offload; -#endif //CONFIG_P2P -}; - -typedef struct hal_data_8192de HAL_DATA_TYPE, *PHAL_DATA_TYPE; - -// -// Function disabled. -// -#define DF_TX_BIT BIT0 -#define DF_RX_BIT BIT1 -#define DF_IO_BIT BIT2 -#define DF_IO_D3_BIT BIT3 - -#define RT_DF_TYPE u32 -#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits))) -#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits)))) -#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) - -void InterruptRecognized8192DE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); -VOID UpdateInterruptMask8192DE(PADAPTER Adapter, u32 AddMSR, u32 RemoveMSR); -#endif - -#ifdef CONFIG_USB_HCI - -//should be renamed and moved to another file -typedef enum _INTERFACE_SELECT_8192DUSB{ - INTF_SEL0_USB = 0, // USB - INTF_SEL1_MINICARD = 1, // Minicard - INTF_SEL2_EKB_PRO = 2, // Eee keyboard proprietary - INTF_SEL3_PRO = 3, // Customized proprietary -} INTERFACE_SELECT_8192DUSB, *PINTERFACE_SELECT_8192DUSB; - -typedef INTERFACE_SELECT_8192DUSB INTERFACE_SELECT_USB; - -struct hal_data_8192du -{ - VERSION_8192D VersionID; - - // add for 92D Phy mode/mac/Band mode - MACPHY_MODE_8192D MacPhyMode92D; - BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G - BAND_TYPE BandSet92D; - BOOLEAN bIsVS; - - BOOLEAN bSupportRemoteWakeUp; - -#if (RTL8192D_DUAL_MAC_MODE_SWITCH == 1) - BOOLEAN bMasterOfDMSP; - BOOLEAN bSlaveOfDMSP; - - PADAPTER BuddyAdapter; -#endif - - u16 CustomerID; - - u16 FirmwareVersion; - u16 FirmwareVersionRev; - u16 FirmwareSubVersion; - - //current WIFI_PHY values - u32 ReceiveConfig; - WIRELESS_MODE CurrentWirelessMode; - HT_CHANNEL_WIDTH CurrentChannelBW; - u8 CurrentChannel; - u8 nCur40MhzPrimeSC;// Control channel sub-carrier - u16 BasicRateSet; - - INTERFACE_SELECT_8192DUSB InterfaceSel; - - //rf_ctrl - u8 rf_chip; - u8 rf_type; - u8 NumTotalRFPath; - - // - // EEPROM setting. - // - u8 EEPROMVersion; - u16 EEPROMVID; - u16 EEPROMPID; - u16 EEPROMSVID; - u16 EEPROMSDID; - u8 EEPROMCustomerID; - u8 EEPROMSubCustomerID; - u8 EEPROMRegulatory; - - u8 EEPROMThermalMeter; - - u8 EEPROMC9; - u8 EEPROMCC; - - u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER_2G]; - u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr - u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff - u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff - // For power group - u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; - - u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff - - u8 CrystalCap; // CrystalCap. - -#ifdef CONFIG_BT_COEXIST - struct btcoexist_priv bt_coexist; -#endif - - // Read/write are allow for following hardware information variables - u8 framesync; - u32 framesyncC34; - u8 framesyncMonitor; - u8 DefaultInitialGain[4]; - u8 pwrGroupCnt; - u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; - u32 CCKTxPowerLevelOriginalOffset; - - u32 AntennaTxPath; // Antenna path Tx - u32 AntennaRxPath; // Antenna path Rx - u8 BluetoothCoexist; - u8 ExternalPA; - u8 InternalPA5G[2]; //pathA / pathB - - //u32 LedControlNum; - //u32 LedControlMode; - //u32 TxPowerTrackControl; - u8 b1x1RecvCombine; // for 1T1R receive combining - - u8 bCurrentTurboEDCA; - u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. - - //vivi, for tx power tracking, 20080407 - //u16 TSSI_13dBm; - //u32 Pwr_Track; - // The current Tx Power Level - u8 CurrentCckTxPwrIdx; - u8 CurrentOfdm24GTxPwrIdx; - - BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D - - BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. - - u32 RfRegChnlVal[2]; - - u8 bCckHighPower; - - BOOLEAN bPhyValueInitReady; - - BOOLEAN bTXPowerDataReadFromEEPORM; - - BOOLEAN bInSetPower; - - //RDG enable - BOOLEAN bRDGEnable; - - BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress - BOOLEAN bNeedIQK; - - BOOLEAN bLCKInProgress; - - BOOLEAN bEarlyModeEnable; - -#if 1 - IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; -#else - //regc80regc94regc4cregc88regc9cregc14regca0regc1cregc78 - u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM]; - IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel. -#endif - - //for host message to fw - u8 LastHMEBoxNum; - - u8 fw_ractrl; - u8 RegTxPause; - // Beacon function related global variable. - u32 RegBcnCtrlVal; - u8 RegFwHwTxQCtrl; - u8 RegReg542; - - struct dm_priv dmpriv; - - u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. - - //Query RF by FW - BOOLEAN bReadRFbyFW; - - // For 92C USB endpoint setting - // - - u32 UsbBulkOutSize; - - int RtBulkOutPipe[3]; - int RtBulkInPipe; - int RtIntInPipe; - - // Add for dual MAC 0--Mac0 1--Mac1 - u32 interfaceIndex; - - u8 OutEpQueueSel; - u8 OutEpNumber; - - u8 Queue2EPNum[8];//for out endpoint number mapping - -#ifdef CONFIG_USB_TX_AGGREGATION - u8 UsbTxAggMode; - u8 UsbTxAggDescNum; -#endif -#ifdef CONFIG_USB_RX_AGGREGATION - u16 HwRxPageSize; // Hardware setting - u32 MaxUsbRxAggBlock; - - USB_RX_AGG_MODE UsbRxAggMode; - u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed - u8 UsbRxAggBlockTimeout; - u8 UsbRxAggPageCount; // 8192C DMA page count - u8 UsbRxAggPageTimeout; -#endif - - u16 RegRRSR; - - u16 EfuseUsedBytes; - u8 RTSInitRate; // 2010.11.24.by tynli. -#ifdef CONFIG_P2P - struct P2P_PS_Offload_t p2p_ps_offload; -#endif //CONFIG_P2P -}; - -typedef struct hal_data_8192du HAL_DATA_TYPE, *PHAL_DATA_TYPE; -#endif - -#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) -#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) - -int FirmwareDownload92D(IN PADAPTER Adapter); -VOID rtl8192d_FirmwareSelfReset(IN PADAPTER Adapter); -void rtl8192d_ReadChipVersion(IN PADAPTER Adapter); -VOID rtl8192d_ReadChannelPlan(PADAPTER Adapter, u8* PROMContent, BOOLEAN AutoLoadFail); -VOID rtl8192d_ReadTxPowerInfo(PADAPTER Adapter, u8* PROMContent, BOOLEAN AutoLoadFail); -VOID rtl8192d_ResetDualMacSwitchVariables(IN PADAPTER Adapter); -u8 GetEEPROMSize8192D(PADAPTER Adapter); -void rtl8192d_HalSetBrateCfg(PADAPTER Adapter, u8 *mBratesOS, u16 *pBrateCfg); -BOOLEAN PHY_CheckPowerOffFor8192D(PADAPTER Adapter); -VOID PHY_SetPowerOnFor8192D(PADAPTER Adapter); -void PHY_ConfigMacPhyMode92D(PADAPTER Adapter); -void rtl8192d_free_hal_data(_adapter * padapter); -void rtl8192d_set_hal_ops(struct hal_ops *pHalFunc); - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h deleted file mode 100755 index 95e20ac8f8a6..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h +++ /dev/null @@ -1,44 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTL8192D_LED_H_ -#define __RTL8192D_LED_H_ - -#include -#include -#include - - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ -#ifdef CONFIG_USB_HCI -void rtl8192du_InitSwLeds(_adapter *padapter); -void rtl8192du_DeInitSwLeds(_adapter *padapter); -#endif - -#ifdef CONFIG_PCI_HCI -void rtl8192de_gen_RefreshLedState(PADAPTER Adapter); -void rtl8192de_InitSwLeds(_adapter *padapter); -void rtl8192de_DeInitSwLeds(_adapter *padapter); -#endif - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h deleted file mode 100755 index 8641ddcdbcd7..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h +++ /dev/null @@ -1,182 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTL8192D_RECV_H_ -#define _RTL8192D_RECV_H_ - -#include -#include -#include - - -#ifdef PLATFORM_OS_XP - #ifdef CONFIG_SDIO_HCI - #define NR_RECVBUFF 1024//512//128 - #else - #define NR_RECVBUFF (16) - #endif -#elif defined(PLATFORM_OS_CE) - #ifdef CONFIG_SDIO_HCI - #define NR_RECVBUFF (128) - #else - #define NR_RECVBUFF (4) - #endif -#else - #define NR_RECVBUFF (4) - #define NR_PREALLOC_RECV_SKB (8) -#endif - - - -#define RECV_BLK_SZ 512 -#define RECV_BLK_CNT 16 -#define RECV_BLK_TH RECV_BLK_CNT - -#if defined(CONFIG_USB_HCI) - -#ifdef PLATFORM_OS_CE -#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k -#else - #ifndef CONFIG_MINIMAL_MEMORY_USAGE - //#define MAX_RECVBUF_SZ (32768) // 32k - //#define MAX_RECVBUF_SZ (16384) //16K - //#define MAX_RECVBUF_SZ (10240) //10K - #define MAX_RECVBUF_SZ (15360) // 15k < 16k - #else - #define MAX_RECVBUF_SZ (4000) // about 4K - #endif -#endif - -#elif defined(CONFIG_PCI_HCI) -#ifndef CONFIG_MINIMAL_MEMORY_USAGE - #define MAX_RECVBUF_SZ (9100) -#else - #define MAX_RECVBUF_SZ (4000) // about 4K -#endif - -#define RX_MPDU_QUEUE 0 -#define RX_CMD_QUEUE 1 -#define RX_MAX_QUEUE 2 -#endif - -#define RECV_BULK_IN_ADDR 0x80 -#define RECV_INT_IN_ADDR 0x81 - -#define PHY_RSSI_SLID_WIN_MAX 100 -#define PHY_LINKQUALITY_SLID_WIN_MAX 20 - -struct phy_stat -{ - unsigned int phydw0; - - unsigned int phydw1; - - unsigned int phydw2; - - unsigned int phydw3; - - unsigned int phydw4; - - unsigned int phydw5; - - unsigned int phydw6; - - unsigned int phydw7; -}; - -typedef struct _Phy_OFDM_Rx_Status_Report_8192cd -{ - unsigned char trsw_gain_X[4]; - unsigned char pwdb_all; - unsigned char cfosho_X[4]; - unsigned char cfotail_X[4]; - unsigned char rxevm_X[2]; - unsigned char rxsnr_X[4]; - unsigned char pdsnr_X[2]; - unsigned char csi_current_X[2]; - unsigned char csi_target_X[2]; - unsigned char sigevm; - unsigned char max_ex_pwr; -//#ifdef RTL8192SE -#ifdef CONFIG_LITTLE_ENDIAN - unsigned char ex_intf_flg:1; - unsigned char sgi_en:1; - unsigned char rxsc:2; - //unsigned char rsvd:4; - unsigned char idle_long:1; - unsigned char r_ant_train_en:1; - unsigned char ANTSELB:1; - unsigned char ANTSEL:1; -#else // _BIG_ENDIAN_ - //unsigned char rsvd:4; - unsigned char ANTSEL:1; - unsigned char ANTSELB:1; - unsigned char r_ant_train_en:1; - unsigned char idle_long:1; - unsigned char rxsc:2; - unsigned char sgi_en:1; - unsigned char ex_intf_flg:1; -#endif -//#else // RTL8190, RTL8192E -// unsigned char sgi_en; -// unsigned char rxsc_sgien_exflg; -//#endif -}__attribute__ ((packed)) PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD; - -typedef struct _Phy_CCK_Rx_Status_Report_8192cd -{ - /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend - 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */ - u8 adc_pwdb_X[4]; - u8 SQ_rpt; - u8 cck_agc_rpt; -} PHY_STS_CCK_8192CD_T; - -// Rx smooth factor -#define Rx_Smooth_Factor (20) - -#ifdef CONFIG_USB_HCI -typedef struct _INTERRUPT_MSG_FORMAT_EX{ - unsigned int C2H_MSG0; - unsigned int C2H_MSG1; - unsigned int C2H_MSG2; - unsigned int C2H_MSG3; - unsigned int HISR; // from HISR Reg0x124, read to clear - unsigned int HISRE;// from HISRE Reg0x12c, read to clear - unsigned int MSG_EX; -}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX; - -void rtl8192du_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); -int rtl8192du_init_recv_priv(_adapter * padapter); -void rtl8192du_free_recv_priv(_adapter * padapter); -void rtl8192du_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); -#endif - -#ifdef CONFIG_PCI_HCI -int rtl8192de_init_recv_priv(_adapter * padapter); -void rtl8192de_free_recv_priv(_adapter * padapter); -void rtl8192de_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); -#endif - -void rtl8192d_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat, BOOLEAN bPacketMatchBSSID); -void rtl8192d_process_phy_info(_adapter *padapter, void *prframe); - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h deleted file mode 100755 index eea18b94087b..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h +++ /dev/null @@ -1,98 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -/****************************************************************************** - * - * - * Module: rtl8192d_rf.h ( Header File) - * - * Note: Collect every HAL RF type exter API or constant. - * - * Function: - * - * Export: - * - * Abbrev: - * - * History: - * Data Who Remark - * - * 09/25/2008 MHC Create initial version. - * - * -******************************************************************************/ -#ifndef _RTL8192D_RF_H_ -#define _RTL8192D_RF_H_ -/* Check to see if the file has been included already. */ - - -/*--------------------------Define Parameters-------------------------------*/ - -// -// For RF 6052 Series -// -#define RF6052_MAX_TX_PWR 0x3F -#define RF6052_MAX_REG 0x3F -#define RF6052_MAX_PATH 2 -/*--------------------------Define Parameters-------------------------------*/ - - -/*------------------------------Define structure----------------------------*/ - -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -/*------------------------Export global variable----------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - -/*------------------------Export Marco Definition---------------------------*/ - - -/*--------------------------Exported Function prototype---------------------*/ - -// -// RF RL6052 Series API -// -void rtl8192d_RF_ChangeTxPath( IN PADAPTER Adapter, - IN u16 DataRate); -void rtl8192d_PHY_RF6052SetBandwidth( - IN PADAPTER Adapter, - IN HT_CHANNEL_WIDTH Bandwidth); -VOID rtl8192d_PHY_RF6052SetCckTxPower( - IN PADAPTER Adapter, - IN u8* pPowerlevel); -VOID rtl8192d_PHY_RF6052SetOFDMTxPower( - IN PADAPTER Adapter, - IN u8* pPowerLevel, - IN u8 Channel); -int PHY_RF6052_Config8192D( IN PADAPTER Adapter ); - -BOOLEAN rtl8192d_PHY_EnableAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); - -void rtl8192d_PHY_PowerDownAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); - - -/*--------------------------Exported Function prototype---------------------*/ - - -#endif/* End of HalRf.h */ - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h deleted file mode 100755 index 4e69b281ee13..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h +++ /dev/null @@ -1,1859 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ - -#ifndef __RTL8192D_SPEC_H__ -#define __RTL8192D_SPEC_H__ - -#include - -#ifndef BIT -#define BIT(x) (1 << (x)) -#endif - -#define BIT0 0x00000001 -#define BIT1 0x00000002 -#define BIT2 0x00000004 -#define BIT3 0x00000008 -#define BIT4 0x00000010 -#define BIT5 0x00000020 -#define BIT6 0x00000040 -#define BIT7 0x00000080 -#define BIT8 0x00000100 -#define BIT9 0x00000200 -#define BIT10 0x00000400 -#define BIT11 0x00000800 -#define BIT12 0x00001000 -#define BIT13 0x00002000 -#define BIT14 0x00004000 -#define BIT15 0x00008000 -#define BIT16 0x00010000 -#define BIT17 0x00020000 -#define BIT18 0x00040000 -#define BIT19 0x00080000 -#define BIT20 0x00100000 -#define BIT21 0x00200000 -#define BIT22 0x00400000 -#define BIT23 0x00800000 -#define BIT24 0x01000000 -#define BIT25 0x02000000 -#define BIT26 0x04000000 -#define BIT27 0x08000000 -#define BIT28 0x10000000 -#define BIT29 0x20000000 -#define BIT30 0x40000000 -#define BIT31 0x80000000 - - -//============================================================ -// 8192D Regsiter offset definition -//============================================================ - - -//============================================================ -// -//============================================================ - -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- -#define REG_SYS_ISO_CTRL 0x0000 -#define REG_SYS_FUNC_EN 0x0002 -#define REG_APS_FSMCO 0x0004 -#define REG_SYS_CLKR 0x0008 -#define REG_9346CR 0x000A -#define REG_EE_VPD 0x000C -#define REG_AFE_MISC 0x0010 -#define REG_SPS0_CTRL 0x0011 -#define REG_POWER_OFF_IN_PROCESS 0x0017 -#define REG_SPS_OCP_CFG 0x0018 -#define REG_RSV_CTRL 0x001C -#define REG_RF_CTRL 0x001F -#define REG_LDOA15_CTRL 0x0020 -#define REG_LDOV12D_CTRL 0x0021 -#define REG_LDOHCI12_CTRL 0x0022 -#define REG_LPLDO_CTRL 0x0023 -#define REG_AFE_XTAL_CTRL 0x0024 -#define REG_AFE_PLL_CTRL 0x0028 -#define REG_MAC_PHY_CTRL 0x002c //for 92d, DMDP,SMSP,DMSP contrl -#define REG_EFUSE_CTRL 0x0030 -#define REG_EFUSE_TEST 0x0034 -#define REG_PWR_DATA 0x0038 -#define REG_CAL_TIMER 0x003C -#define REG_ACLK_MON 0x003E -#define REG_GPIO_MUXCFG 0x0040 -//#define REG_GPIO_MUXCFG 0x0041 -#define REG_GPIO_IO_SEL 0x0042 -#define REG_MAC_PINMUX_CFG 0x0043 -#define REG_GPIO_PIN_CTRL 0x0044 -#define REG_GPIO_INTM 0x0048 -#define REG_LEDCFG0 0x004C -#define REG_LEDCFG1 0x004D -#define REG_LEDCFG2 0x004E -#define REG_LEDCFG3 0x004F -#define REG_FSIMR 0x0050 -#define REG_FSISR 0x0054 - -#define REG_MCUFWDL 0x0080 - -#define REG_HMEBOX_EXT_0 0x0088 -#define REG_HMEBOX_EXT_1 0x008A -#define REG_HMEBOX_EXT_2 0x008C -#define REG_HMEBOX_EXT_3 0x008E - -#define REG_BIST_SCAN 0x00D0 -#define REG_BIST_RPT 0x00D4 -#define REG_BIST_ROM_RPT 0x00D8 -#define REG_USB_SIE_INTF 0x00E0 -#define REG_PCIE_MIO_INTF 0x00E4 -#define REG_PCIE_MIO_INTD 0x00E8 -#define REG_HPON_FSM 0x00EC -#define REG_SYS_CFG 0x00F0 -#define REG_MAC_PHY_CTRL_NORMAL 0x00f8 - -#define REG_MAC0 0x0081 -#define REG_MAC1 0x0053 -#define FW_MAC0_ready 0x18 -#define FW_MAC1_ready 0x1A -#define MAC0_ON BIT7 -#define MAC1_ON BIT0 -#define mac0_ready BIT0 -#define mac1_ready BIT0 - - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- -#define REG_CR 0x0100 -#define REG_PBP 0x0104 -#define REG_TRXDMA_CTRL 0x010C -#define REG_TRXFF_BNDY 0x0114 -#define REG_TRXFF_STATUS 0x0118 -#define REG_RXFF_PTR 0x011C -#define REG_HIMR 0x0120 -#define REG_HISR 0x0124 -#define REG_HIMRE 0x0128 -#define REG_HISRE 0x012C -#define REG_CPWM 0x012F -#define REG_FWIMR 0x0130 -#define REG_FWISR 0x0134 -#define REG_FTIMR 0x0138 -#define REG_PKTBUF_DBG_CTRL 0x0140 -#define REG_PKTBUF_DBG_DATA_L 0x0144 -#define REG_PKTBUF_DBG_DATA_H 0x0148 - -#define REG_TC0_CTRL 0x0150 -#define REG_TC1_CTRL 0x0154 -#define REG_TC2_CTRL 0x0158 -#define REG_TC3_CTRL 0x015C -#define REG_TC4_CTRL 0x0160 -#define REG_TCUNIT_BASE 0x0164 -#define REG_MBIST_START 0x0174 -#define REG_MBIST_DONE 0x0178 -#define REG_MBIST_FAIL 0x017C -#define REG_C2HEVT_MSG_NORMAL 0x01A0 -#define REG_C2HEVT_CLEAR 0x01AF -#define REG_C2HEVT_MSG_TEST 0x01B8 -#define REG_MCUTST_1 0x01c0 -#define REG_FMETHR 0x01C8 -#define REG_HMETFR 0x01CC -#define REG_HMEBOX_0 0x01D0 -#define REG_HMEBOX_1 0x01D4 -#define REG_HMEBOX_2 0x01D8 -#define REG_HMEBOX_3 0x01DC - -#define REG_LLT_INIT 0x01E0 -#define REG_BB_ACCEESS_CTRL 0x01E8 -#define REG_BB_ACCESS_DATA 0x01EC - - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -#define REG_RQPN 0x0200 -#define REG_FIFOPAGE 0x0204 -#define REG_TDECTRL 0x0208 -#define REG_TXDMA_OFFSET_CHK 0x020C -#define REG_TXDMA_STATUS 0x0210 -#define REG_RQPN_NPQ 0x0214 - -//----------------------------------------------------- -// -// 0x0280h ~ 0x02FFh RXDMA Configuration -// -//----------------------------------------------------- -#define REG_RXDMA_AGG_PG_TH 0x0280 -#define REG_RXPKT_NUM 0x0284 -#define REG_RXDMA_STATUS 0x0288 - - -//----------------------------------------------------- -// -// 0x0300h ~ 0x03FFh PCIe -// -//----------------------------------------------------- -#define REG_PCIE_CTRL_REG 0x0300 -#define REG_INT_MIG 0x0304 // Interrupt Migration -#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address -#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address -#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address -#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address -#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address -#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address -#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address -#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address -#define REG_DBI 0x0348 // Backdoor REG for Access Configuration -//sherry added for DBI Read/Write 20091126 -#define REG_DBI_WDATA 0x0348 // Backdoor REG for Access Configuration -#define REG_DBI_RDATA 0x034C //Backdoor REG for Access Configuration -#define REG_DBI_CTRL 0x0350 //Backdoor REG for Access Configuration -#define REG_DBI_FLAG 0x0352 //Backdoor REG for Access Configuration#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY -#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY -#define REG_DBG_SEL 0x0360 // Debug Selection Register -#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM -#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM -#define REG_UART_CTRL 0x0364 // UART Control -#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address -#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address - - -// spec version 11 -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -#define REG_VOQ_INFORMATION 0x0400 -#define REG_VIQ_INFORMATION 0x0404 -#define REG_BEQ_INFORMATION 0x0408 -#define REG_BKQ_INFORMATION 0x040C -#define REG_MGQ_INFORMATION 0x0410 -#define REG_HGQ_INFORMATION 0x0414 -#define REG_BCNQ_INFORMATION 0x0418 - - -#define REG_CPU_MGQ_INFORMATION 0x041C -#define REG_FWHW_TXQ_CTRL 0x0420 -#define REG_HWSEQ_CTRL 0x0423 -#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 -#define REG_TXPKTBUF_MGQ_BDNY 0x0425 -#define REG_MULTI_BCNQ_EN 0x0426 -#define REG_MULTI_BCNQ_OFFSET 0x0427 -#define REG_SPEC_SIFS 0x0428 -#define REG_RL 0x042A -#define REG_DARFRC 0x0430 -#define REG_RARFRC 0x0438 -#define REG_RRSR 0x0440 -#define REG_ARFR0 0x0444 -#define REG_ARFR1 0x0448 -#define REG_ARFR2 0x044C -#define REG_ARFR3 0x0450 -#define REG_AGGLEN_LMT 0x0458 -#define REG_AMPDU_MIN_SPACE 0x045C -#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D -#define REG_FAST_EDCA_CTRL 0x0460 -#define REG_RD_RESP_PKT_TH 0x0463 -#define REG_INIRTS_RATE_SEL 0x0480 -#define REG_INIDATA_RATE_SEL 0x0484 -#define REG_POWER_STATUS 0x04A4 -#define REG_POWER_STAGE1 0x04B4 -#define REG_POWER_STAGE2 0x04B8 -#define REG_PKT_LIFE_TIME 0x04C0 -#define REG_STBC_SETTING 0x04C4 -#define REG_PROT_MODE_CTRL 0x04C8 -#define REG_MAX_AGGR_NUM 0x04CA -#define REG_RTS_MAX_AGGR_NUM 0x04CB -#define REG_BAR_MODE_CTRL 0x04CC -#define REG_RA_TRY_RATE_AGG_LMT 0x04CF -#define REG_EARLY_MODE_CONTROL 0x04D0 -#define REG_NQOS_SEQ 0x04DC -#define REG_QOS_SEQ 0x04DE -#define REG_NEED_CPU_HANDLE 0x04E0 -#define REG_PKT_LOSE_RPT 0x04E1 -#define REG_PTCL_ERR_STATUS 0x04E2 -#define REG_DUMMY 0x04FC - - - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- -#define REG_EDCA_VO_PARAM 0x0500 -#define REG_EDCA_VI_PARAM 0x0504 -#define REG_EDCA_BE_PARAM 0x0508 -#define REG_EDCA_BK_PARAM 0x050C -#define REG_BCNTCFG 0x0510 -#define REG_PIFS 0x0512 -#define REG_RDG_PIFS 0x0513 -#define REG_SIFS_CTX 0x0514 -#define REG_SIFS_TRX 0x0516 -#define REG_AGGR_BREAK_TIME 0x051A -#define REG_SLOT 0x051B -#define REG_TX_PTCL_CTRL 0x0520 -#define REG_TXPAUSE 0x0522 -#define REG_DIS_TXREQ_CLR 0x0523 -#define REG_RD_CTRL 0x0524 -#define REG_TBTT_PROHIBIT 0x0540 -#define REG_RD_NAV_NXT 0x0544 -#define REG_NAV_PROT_LEN 0x0546 -#define REG_BCN_CTRL 0x0550 -#define REG_USTIME_TSF 0x0551 -#define REG_MBID_NUM 0x0552 -#define REG_DUAL_TSF_RST 0x0553 -#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE -#define REG_MBSSID_BCN_SPACE 0x0554 -#define REG_DRVERLYINT 0x0558 -#define REG_BCNDMATIM 0x0559 -#define REG_ATIMWND 0x055A -#define REG_BCN_MAX_ERR 0x055D -#define REG_RXTSF_OFFSET_CCK 0x055E -#define REG_RXTSF_OFFSET_OFDM 0x055F -#define REG_TSFTR 0x0560 -#define REG_INIT_TSFTR 0x0564 -#define REG_PSTIMER 0x0580 -#define REG_TIMER0 0x0584 -#define REG_TIMER1 0x0588 -#define REG_ACMHWCTRL 0x05C0 -#define REG_ACMRSTCTRL 0x05C1 -#define REG_ACMAVG 0x05C2 -#define REG_VO_ADMTIME 0x05C4 -#define REG_VI_ADMTIME 0x05C6 -#define REG_BE_ADMTIME 0x05C8 -#define REG_EDCA_RANDOM_GEN 0x05CC -#define REG_SCH_TXCMD 0x05D0 - -#define REG_DMC 0x05F0 //Dual MAC Co-Existence Register - - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- -#define REG_APSD_CTRL 0x0600 -#define REG_BWOPMODE 0x0603 -#define REG_TCR 0x0604 -#define REG_RCR 0x0608 -#define REG_RX_PKT_LIMIT 0x060C -#define REG_RX_DLK_TIME 0x060D -#define REG_RX_DRVINFO_SZ 0x060F - -#define REG_MACID 0x0610 -#define REG_BSSID 0x0618 -#define REG_MAR 0x0620 -#define REG_MBIDCAMCFG 0x0628 - -#define REG_USTIME_EDCA 0x0638 -#define REG_MAC_SPEC_SIFS 0x063A -#define REG_RESP_SIFS_CCK 0x063C -#define REG_RESP_SIFS_OFDM 0x063E -#define REG_ACKTO 0x0640 -#define REG_CTS2TO 0x0641 -#define REG_EIFS 0x0642 - - -//WMA, BA, CCX -#define REG_NAV_CTRL 0x0650 -#define REG_BACAMCMD 0x0654 -#define REG_BACAMCONTENT 0x0658 -#define REG_LBDLY 0x0660 -#define REG_FWDLY 0x0661 -#define REG_RXERR_RPT 0x0664 -#define REG_WMAC_TRXPTCL_CTL 0x0668 - - -// Security -#define REG_CAMCMD 0x0670 -#define REG_CAMWRITE 0x0674 -#define REG_CAMREAD 0x0678 -#define REG_CAMDBG 0x067C -#define REG_SECCFG 0x0680 - -// Power -#define REG_WOW_CTRL 0x0690 -#define REG_PSSTATUS 0x0691 -#define REG_PS_RX_INFO 0x0692 -#define REG_LPNAV_CTRL 0x0694 -#define REG_WKFMCAM_CMD 0x0698 -#define REG_WKFMCAM_RWD 0x069C -#define REG_RXFLTMAP0 0x06A0 -#define REG_RXFLTMAP1 0x06A2 -#define REG_RXFLTMAP2 0x06A4 -#define REG_BCN_PSR_RPT 0x06A8 -#define REG_CALB32K_CTRL 0x06AC -#define REG_PKT_MON_CTRL 0x06B4 -#define REG_BT_COEX_TABLE 0x06C0 -#define REG_WMAC_RESP_TXINFO 0x06D8 - - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- -#define REG_USB_INFO 0xFE17 -#define REG_USB_SPECIAL_OPTION 0xFE55 -#define REG_USB_DMA_AGG_TO 0xFE5B -#define REG_USB_AGG_TO 0xFE5C -#define REG_USB_AGG_TH 0xFE5D - -// for 92DU high_Queue low_Queue Normal_Queue select -#define REG_USB_High_NORMAL_Queue_Select_MAC0 0xFE44 -//#define REG_USB_LOW_Queue_Select_MAC0 0xFE45 -#define REG_USB_High_NORMAL_Queue_Select_MAC1 0xFE47 -//#define REG_USB_LOW_Queue_Select_MAC1 0xFE48 - -// For test chip -#define REG_TEST_USB_TXQS 0xFE48 -#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61 -#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63 -#define REG_TEST_SIE_OPTIONAL 0xFE64 -#define REG_TEST_SIE_CHIRP_K 0xFE65 -#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B -#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 -#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 - - -// For normal chip -#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 -#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 -#define REG_NORMAL_SIE_OPTIONAL 0xFE64 -#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 -#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B -#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 -#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF - - -//----------------------------------------------------- -// -// Redifine 8192C register definition for compatibility -// -//----------------------------------------------------- - -// TODO: use these definition when using REG_xxx naming rule. -// NOTE: DO NOT Remove these definition. Use later. - -#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control. -#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable. -#define SYS_CLK REG_SYS_CLKR -#define CR9346 REG_9346CR // 93C46/93C56 Command Register. -#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. -#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. -#define MSR (REG_CR + 2) // Media Status register -#define ISR REG_HISR -#define TSFR REG_TSFTR // Timing Sync Function Timer Register. - -#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 -#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 - -#define PBP REG_PBP - -// Redifine MACID register, to compatible prior ICs. -#define IDR0 MACIDR0 -#define IDR4 MACIDR4 - - -// -// 9. Security Control Registers (Offset: ) -// -#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd -#define WCAMI REG_CAMWRITE // Software write CAM input content -#define RCAMO REG_CAMREAD // Software read/write CAM config -#define CAMDBG REG_CAMDBG -#define SECR REG_SECCFG //Security Configuration Register - -// Unused register -#define UnusedRegister 0x1BF -#define DCAM UnusedRegister -#define PSR UnusedRegister -#define BBAddr UnusedRegister -#define PhyDataR UnusedRegister - -#define InvalidBBRFValue 0x12345678 - -// Min Spacing related settings. -#define MAX_MSS_DENSITY_2T 0x13 -#define MAX_MSS_DENSITY_1T 0x0A - -//---------------------------------------------------------------------------- -// 8192C Cmd9346CR bits (Offset 0xA, 16bit) -//---------------------------------------------------------------------------- -#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 -#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 -#define Cmd9346CR_9356SEL BIT4 -#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL) -#define AutoLoadEFUSE CmdEEPROM_En - -// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) -//---------------------------------------------------------------------------- -#define GPIOSEL_GPIO 0 -#define GPIOSEL_ENBT BIT5 - -//---------------------------------------------------------------------------- -// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) -//---------------------------------------------------------------------------- -#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value -#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value -#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. -#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) - - -//---------------------------------------------------------------------------- -// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) -//---------------------------------------------------------------------------- -/* -Network Type -00: No link -01: Link in ad hoc network -10: Link in infrastructure network -11: AP mode -Default: 00b. -*/ -#define MSR_NOLINK 0x00 -#define MSR_ADHOC 0x01 -#define MSR_INFRA 0x02 -#define MSR_AP 0x03 - -// -// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) -// -//---------------------------------------------------------------------------- -// 8192C Response Rate Set Register (offset 0x181, 24bits) -//---------------------------------------------------------------------------- -#define RRSR_RSC_OFFSET 21 -#define RRSR_SHORT_OFFSET 23 -#define RRSR_RSC_BW_40M 0x600000 -#define RRSR_RSC_UPSUBCHNL 0x400000 -#define RRSR_RSC_LOWSUBCHNL 0x200000 -#define RRSR_SHORT 0x800000 -#define RRSR_1M BIT0 -#define RRSR_2M BIT1 -#define RRSR_5_5M BIT2 -#define RRSR_11M BIT3 -#define RRSR_6M BIT4 -#define RRSR_9M BIT5 -#define RRSR_12M BIT6 -#define RRSR_18M BIT7 -#define RRSR_24M BIT8 -#define RRSR_36M BIT9 -#define RRSR_48M BIT10 -#define RRSR_54M BIT11 -#define RRSR_MCS0 BIT12 -#define RRSR_MCS1 BIT13 -#define RRSR_MCS2 BIT14 -#define RRSR_MCS3 BIT15 -#define RRSR_MCS4 BIT16 -#define RRSR_MCS5 BIT17 -#define RRSR_MCS6 BIT18 -#define RRSR_MCS7 BIT19 -#define BRSR_AckShortPmb BIT23 -// CCK ACK: use Short Preamble or not - - -//---------------------------------------------------------------------------- -// 8192C Rate Definition -//---------------------------------------------------------------------------- -//CCK -#define RATR_1M 0x00000001 -#define RATR_2M 0x00000002 -#define RATR_55M 0x00000004 -#define RATR_11M 0x00000008 -//OFDM -#define RATR_6M 0x00000010 -#define RATR_9M 0x00000020 -#define RATR_12M 0x00000040 -#define RATR_18M 0x00000080 -#define RATR_24M 0x00000100 -#define RATR_36M 0x00000200 -#define RATR_48M 0x00000400 -#define RATR_54M 0x00000800 -//MCS 1 Spatial Stream -#define RATR_MCS0 0x00001000 -#define RATR_MCS1 0x00002000 -#define RATR_MCS2 0x00004000 -#define RATR_MCS3 0x00008000 -#define RATR_MCS4 0x00010000 -#define RATR_MCS5 0x00020000 -#define RATR_MCS6 0x00040000 -#define RATR_MCS7 0x00080000 -//MCS 2 Spatial Stream -#define RATR_MCS8 0x00100000 -#define RATR_MCS9 0x00200000 -#define RATR_MCS10 0x00400000 -#define RATR_MCS11 0x00800000 -#define RATR_MCS12 0x01000000 -#define RATR_MCS13 0x02000000 -#define RATR_MCS14 0x04000000 -#define RATR_MCS15 0x08000000 - - -// NOTE: For 92CU - Ziv -//CCK -#define RATE_1M BIT(0) -#define RATE_2M BIT(1) -#define RATE_5_5M BIT(2) -#define RATE_11M BIT(3) -//OFDM -#define RATE_6M BIT(4) -#define RATE_9M BIT(5) -#define RATE_12M BIT(6) -#define RATE_18M BIT(7) -#define RATE_24M BIT(8) -#define RATE_36M BIT(9) -#define RATE_48M BIT(10) -#define RATE_54M BIT(11) -//MCS 1 Spatial Stream -#define RATE_MCS0 BIT(12) -#define RATE_MCS1 BIT(13) -#define RATE_MCS2 BIT(14) -#define RATE_MCS3 BIT(15) -#define RATE_MCS4 BIT(16) -#define RATE_MCS5 BIT(17) -#define RATE_MCS6 BIT(18) -#define RATE_MCS7 BIT(19) -//MCS 2 Spatial Stream -#define RATE_MCS8 BIT(20) -#define RATE_MCS9 BIT(21) -#define RATE_MCS10 BIT(22) -#define RATE_MCS11 BIT(23) -#define RATE_MCS12 BIT(24) -#define RATE_MCS13 BIT(25) -#define RATE_MCS14 BIT(26) -#define RATE_MCS15 BIT(27) - - - - -// ALL CCK Rate -#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M -#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ - RATR_36M|RATR_48M|RATR_54M -#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ - RATR_MCS4|RATR_MCS5|RATR_MCS6|RATR_MCS7 -#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9|RATR_MCS10|RATR_MCS11|\ - RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 - -//---------------------------------------------------------------------------- -// 8192C BW_OPMODE bits (Offset 0x203, 8bit) -//---------------------------------------------------------------------------- -#define BW_OPMODE_20MHZ BIT2 -#define BW_OPMODE_5G BIT1 -#define BW_OPMODE_11J BIT0 - - -//---------------------------------------------------------------------------- -// 8192C CAM Config Setting (offset 0x250, 1 byte) -//---------------------------------------------------------------------------- -#define CAM_VALID BIT15 -#define CAM_NOTVALID 0x0000 -#define CAM_USEDK BIT5 - -#define CAM_CONTENT_COUNT 8 - -#define CAM_NONE 0x0 -#define CAM_WEP40 0x01 -#define CAM_TKIP 0x02 -#define CAM_AES 0x04 -#define CAM_WEP104 0x05 -#define CAM_SMS4 0x6 - - -#define TOTAL_CAM_ENTRY 32 -#define HALF_CAM_ENTRY 16 - -#define CAM_CONFIG_USEDK _TRUE -#define CAM_CONFIG_NO_USEDK _FALSE - -#define CAM_WRITE BIT16 -#define CAM_READ 0x00000000 -#define CAM_POLLINIG BIT31 - -#define SCR_UseDK 0x01 -#define SCR_TxSecEnable 0x02 -#define SCR_RxSecEnable 0x04 - - -// -// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) -// -//---------------------------------------------------------------------------- -// 8190 IMR/ISR bits (offset 0xfd, 8bits) -//---------------------------------------------------------------------------- -#define IMR8190_DISABLED 0x0 -// IMR DW0 Bit 0-31 -#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6 -#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5 -#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4 -#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3 -#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2 -#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1 -#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8 -#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7 -#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6 -#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5 -#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4 -#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3 -#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2 -#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1 -#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2 -#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1 -#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow -#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt -#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0 -#define IMR_RXFOVW BIT12 // Receive FIFO Overflow -#define IMR_RDU BIT11 // Receive Descriptor Unavailable -#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt -#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup -#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt -#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup -#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt -#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt -#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt -#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt -#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt -#define IMR_VODOK BIT1 // AC_VO DMA Interrupt -#define IMR_ROK BIT0 // Receive DMA OK Interrupt - -// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh) -#define IMR_TXERR BIT11 -#define IMR_RXERR BIT10 -#define IMR_C2HCMD BIT9 -#define IMR_CPWM BIT8 -//RSVD [2-7] -#define IMR_OCPINT BIT1 -#define IMR_WLANOFF BIT0 - - - -//---------------------------------------------------------------------------- -// 8192D EFUSE -//---------------------------------------------------------------------------- -#define HWSET_MAX_SIZE 256 - -//---------------------------------------------------------------------------- -// 8192C EEPROM/EFUSE share register definition. -//---------------------------------------------------------------------------- - -// -// Default Value for EEPROM or EFUSE!!! -// -#define EEPROM_Default_TSSI 0x0 -#define EEPROM_Default_TxPowerDiff 0x0 -#define EEPROM_Default_CrystalCap 0x0 //92D default 0x0 -#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) -#define EEPROM_Default_TxPower 0x1010 -#define EEPROM_Default_HT2T_TxPwr 0x10 - -#define EEPROM_Default_LegacyHTTxPowerDiff 0x4 -#define EEPROM_Default_ThermalMeter 0x12 - -#define EEPROM_Default_AntTxPowerDiff 0x0 -//#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 -#define EEPROM_Default_TxPowerLevel_2G 0x2C -#define EEPROM_Default_TxPowerLevel_5G 0x22 - -#define EEPROM_Default_HT40_2SDiff 0x0 -#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference -#define EEPROM_Default_LegacyHTTxPowerDiff 0x4 //OFDM Tx Power index diff -#define EEPROM_Default_HT40_PwrMaxOffset 0 -#define EEPROM_Default_HT20_PwrMaxOffset 0 - -// For debug -#define EEPROM_Default_PID 0x1234 -#define EEPROM_Default_VID 0x5678 -#define EEPROM_Default_CustomerID 0xAB -#define EEPROM_Default_SubCustomerID 0xCD -#define EEPROM_Default_Version 0 - -#define EEPROM_CHANNEL_PLAN_FCC 0x0 -#define EEPROM_CHANNEL_PLAN_IC 0x1 -#define EEPROM_CHANNEL_PLAN_ETSI 0x2 -#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 -#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 -#define EEPROM_CHANNEL_PLAN_MKK 0x5 -#define EEPROM_CHANNEL_PLAN_MKK1 0x6 -#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 -#define EEPROM_CHANNEL_PLAN_TELEC 0x8 -#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 -#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA -#define EEPROM_CHANNEL_PLAN_NCC 0xB -#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 - - -#define EEPROM_CID_DEFAULT 0x0 -#define EEPROM_CID_TOSHIBA 0x4 -#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. -#define EEPROM_CID_QMI 0x0D -#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 - - -#define RTL8192_EEPROM_ID 0x8129 -#define EEPROM_WAPI_SUPPORT 0x78 - - -#ifdef CONFIG_PCI_HCI -#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER) -#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) -#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) - -#define RTL8190_EEPROM_ID 0x8129 // 0-1 -#define EEPROM_HPON 0x02 // LDO settings.2-5 -#define EEPROM_CLK 0x06 // Clock settings.6-7 -#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 - -#define EEPROM_VID 0x28 // SE Vendor ID.A-B -#define EEPROM_DID 0x2A // SE Device ID. C-D -#define EEPROM_SVID 0x2C // SE Vendor ID.E-F -#define EEPROM_SMID 0x2E // SE PCI Subsystem ID. 10-11 - -#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 -#define EEPROM_MAC_ADDR_MAC0_92D 0x55 -#define EEPROM_MAC_ADDR_MAC1_92D 0x5B -//---------------------------------------------------------------- -// 2.4G band Tx power index setting -#define EEPROM_CCK_TX_PWR_INX_2G 0x61 -#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D -#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73 -#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76 -#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79 - -//5GL channel 32-64 -#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B -#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E - -//5GM channel 100-140 -#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D -#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3 - -//5GH channel 149-165 -#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8 - -#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels. -#define EEPROM_IQK_DELTA 0xBC -#define EEPROM_LCK_DELTA 0xBC -#define EEPROM_XTAL_K 0xBD //[7:5] -#define EEPROM_TSSI_A_5G 0xBE -#define EEPROM_TSSI_B_5G 0xBF -#define EEPROM_TSSI_AB_5G 0xC0 -#define EEPROM_THERMAL_METER 0xC3 //[4:0] -#define EEPROM_RF_OPT1 0xC4 -#define EEPROM_RF_OPT2 0xC5 -#define EEPROM_RF_OPT3 0xC6 -#define EEPROM_RF_OPT4 0xC7 -#define EEPROM_RF_OPT5 0xC8 -#define EEPROM_RF_OPT6 0xC9 -#define EEPROM_VERSION 0xCA -#define EEPROM_CUSTOMER_ID 0xCB -#define EEPROM_RF_OPT7 0xCC - -#define EEPROM_WIDIPAIRING_ADDR 0xF0 -#define EEPROM_WIDIPAIRING_KEY 0xF6 - -#define EEPROM_DEF_PART_NO 0x3FD //Byte -#define EEPROME_CHIP_VERSION_L 0x3FF -#define EEPROME_CHIP_VERSION_H 0x3FE -#endif - -#ifdef CONFIG_USB_HCI -#define RTL8190_EEPROM_ID 0x8129 // 0-1 -#define EEPROM_HPON 0x02 // LDO settings.2-5 -#define EEPROM_CLK 0x06 // Clock settings.6-7 -#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 - -#define EEPROM_VID 0xC // SE Vendor ID.A-B -#define EEPROM_PID 0xE // SE Device ID. C-D -#define EEPROM_ENDPOINT_SETTING 0x10 -#define EEPROM_CHIRP_K 0x12 // Changed -#define EEPROM_USB_PHY 0x13 // Changed -#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] -#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 -#define EEPROM_STRING 0x1F -#define EEPROM_SUBCUSTOMER_ID 0x59 - -#define EEPROM_MAC_ADDR_MAC0_92D 0x19 -#define EEPROM_MAC_ADDR_MAC1_92D 0x5B -//---------------------------------------------------------------- -// 2.4G band Tx power index setting -#define EEPROM_CCK_TX_PWR_INX_2G 0x61 -#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D -#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73 -#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76 -#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79 - -//5GL channel 32-64 -#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85 -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B -#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E - -//5GM channel 100-140 -#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97 -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D -#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3 - -//5GH channel 149-165 -#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6 -#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC -#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF -#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2 -#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5 -#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8 - -#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels. -#define EEPROM_TEST_CHANNEL_PLAN 0xBB -#define EEPROM_IQK_DELTA 0xBC -#define EEPROM_LCK_DELTA 0xBC -#define EEPROM_XTAL_K 0xBD //[7:5] -#define EEPROM_TSSI_A_5G 0xBE -#define EEPROM_TSSI_B_5G 0xBF -#define EEPROM_TSSI_AB_5G 0xC0 -#define EEPROM_THERMAL_METER 0xC3 //[4:0] -#define EEPROM_RF_OPT1 0xC4 -#define EEPROM_RF_OPT2 0xC5 -#define EEPROM_RF_OPT3 0xC6 -#define EEPROM_RF_OPT4 0xC7 -#define EEPROM_RF_OPT5 0xC8 -#define EEPROM_RF_OPT6 0xC9 -#define EEPROM_VERSION 0xCA -#define EEPROM_CUSTOMER_ID 0xCB -#define EEPROM_RF_OPT7 0xCC - -#define EEPROM_DEF_PART_NO 0x3FD //Byte -#define EEPROME_CHIP_VERSION_L 0x3FF -#define EEPROME_CHIP_VERSION_H 0x3FE - -//------------------------------------------------------------- -// EEPROM content definitions -//------------------------------------------------------------- -#define OS_LINK_SPEED_NORMAL_MASK BIT3 | BIT2 -#define OS_LINK_SPEED_TEST_MASK BIT3 | BIT4 - -#define BOARD_TYPE_NORMAL_MASK 0xE0 -#define BOARD_TYPE_TEST_MASK 0xF - -#define BT_COEXISTENCE_TEST BIT4 -#define BT_COEXISTENCE_NORMAL BIT5 - -#define BT_CO_SHIFT_TEST 4 -#define BT_CO_SHIFT_NORMAL 5 - -#define EP_NUMBER_MASK_TEST 0x30 //bit 4:5 0Eh -#define EP_NUMBER_SHIFT_TEST 4 - -#define USB_PHY_PARA_SIZE_TEST 6 -#define USB_PHY_PARA_SIZE_NORMAL 4 - -//------------------------------------------------------------- -// EEPROM default value definitions -//------------------------------------------------------------- -// Use 0xABCD instead of 0x8192 for debug -#define EEPROM_DEF_ID_0 0xCD // Byte 0x00 -#define EEPROM_DEF_ID_1 0xAB // Byte 0x01 - -#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03 -#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04 -#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08 - -#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A -#define EEPROM_DEF_VID_1 0x0B - -#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C -#define EEPROM_DEF_PID_1 0x81 - - -#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E -#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E - -#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F - -#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10 -#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11 -#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12 -#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13 - -#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78 -#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79 - - -#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A - - -#define EEPROM_USB_SN BIT(0) -#define EEPROM_USB_REMOTE_WAKEUP BIT(1) -#define EEPROM_USB_DEVICE_PWR BIT(2) -#define EEPROM_EP_NUMBER (BIT(3)|BIT(4)) - -#if 0 -#define EEPROM_CHANNEL_PLAN_FCC 0x0 -#define EEPROM_CHANNEL_PLAN_IC 0x1 -#define EEPROM_CHANNEL_PLAN_ETSI 0x2 -#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 -#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 -#define EEPROM_CHANNEL_PLAN_MKK 0x5 -#define EEPROM_CHANNEL_PLAN_MKK1 0x6 -#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 -#define EEPROM_CHANNEL_PLAN_TELEC 0x8 -#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 -#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA -#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 - -#define EEPROM_CID_DEFAULT 0x0 - -#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 - - -#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. - -#endif -#endif - - -/*=================================================================== -===================================================================== -Here the register defines are for 92C. When the define is as same with 92C, -we will use the 92C's define for the consistency -So the following defines for 92C is not entire!!!!!! -===================================================================== -=====================================================================*/ -/* -Based on Datasheet V33---090401 -Register Summary -Current IOREG MAP -0x0000h ~ 0x00FFh System Configuration (256 Bytes) -0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) -0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) -0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) -0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) -0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) -0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) -0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) -0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) -*/ - -//---------------------------------------------------------------------------- -// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) -//---------------------------------------------------------------------------- -#define RCR_APPFCS BIT31 //WMAC append FCS after pauload -#define RCR_APP_MIC BIT30 // -#define RCR_APP_ICV BIT29 // -#define RCR_APP_PHYST_RXFF BIT28 // -#define RCR_APP_BA_SSN BIT27 //Accept BA SSN -#define RCR_ENMBID BIT24 //Enable Multiple BssId. -#define RCR_LSIGEN BIT23 -#define RCR_MFBEN BIT22 -#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 -#define RCR_AMF BIT13 //Accept management type frame -#define RCR_ACF BIT12 //Accept control type frame -#define RCR_ADF BIT11 //Accept data type frame -#define RCR_AICV BIT9 //Accept ICV error packet -#define RCR_ACRC32 BIT8 //Accept CRC32 error packet -#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) -#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) -#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet -#define RCR_APWRMGT BIT5 //Accept power management packet -#define RCR_ADD3 BIT4 //Accept address 3 match packet -#define RCR_AB BIT3 //Accept broadcast packet -#define RCR_AM BIT2 //Accept multicast packet -#define RCR_APM BIT1 //Accept physical match packet -#define RCR_AAP BIT0 //Accept all unicast packet -#define RCR_MXDMA_OFFSET 8 -#define RCR_FIFO_OFFSET 13 - - - -//============================================================================ -// 8192c USB specific Regsiter Offset and Content definition, -// 2009.08.18, added by vivi. for merge 92c and 92C into one driver -//============================================================================ -//#define APS_FSMCO 0x0004 same with 92Ce -#define RSV_CTRL 0x001C -#define RD_CTRL 0x0524 - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- -#define REG_USB_INFO 0xFE17 -#define REG_USB_SPECIAL_OPTION 0xFE55 -#define REG_USB_DMA_AGG_TO 0xFE5B -#define REG_USB_AGG_TO 0xFE5C -#define REG_USB_AGG_TH 0xFE5D - -#define REG_USB_VID 0xFE60 -#define REG_USB_PID 0xFE62 -#define REG_USB_OPTIONAL 0xFE64 -#define REG_USB_CHIRP_K 0xFE65 -#define REG_USB_PHY 0xFE66 -#define REG_USB_MAC_ADDR 0xFE70 - -#define REG_USB_HRPWM 0xFE58 -#define REG_USB_HCPWM 0xFE57 - -#define InvalidBBRFValue 0x12345678 - -//============================================================================ -// 8192C Regsiter Bit and Content definition -//============================================================================ -//----------------------------------------------------- -// -// 0x0000h ~ 0x00FFh System Configuration -// -//----------------------------------------------------- - -//2 SPS0_CTRL -#define SW18_FPWM BIT(3) - - -//2 SYS_ISO_CTRL -#define ISO_MD2PP BIT(0) -#define ISO_UA2USB BIT(1) -#define ISO_UD2CORE BIT(2) -#define ISO_PA2PCIE BIT(3) -#define ISO_PD2CORE BIT(4) -#define ISO_IP2MAC BIT(5) -#define ISO_DIOP BIT(6) -#define ISO_DIOE BIT(7) -#define ISO_EB2CORE BIT(8) -#define ISO_DIOR BIT(9) - -#define PWC_EV25V BIT(14) -#define PWC_EV12V BIT(15) - - -//2 SYS_FUNC_EN -#define FEN_BBRSTB BIT(0) -#define FEN_BB_GLB_RSTn BIT(1) -#define FEN_USBA BIT(2) -#define FEN_UPLL BIT(3) -#define FEN_USBD BIT(4) -#define FEN_DIO_PCIE BIT(5) -#define FEN_PCIEA BIT(6) -#define FEN_PPLL BIT(7) -#define FEN_PCIED BIT(8) -#define FEN_DIOE BIT(9) -#define FEN_CPUEN BIT(10) -#define FEN_DCORE BIT(11) -#define FEN_ELDR BIT(12) -#define FEN_DIO_RF BIT(13) -#define FEN_HWPDN BIT(14) -#define FEN_MREGEN BIT(15) - -//2 APS_FSMCO -#define PFM_LDALL BIT(0) -#define PFM_ALDN BIT(1) -#define PFM_LDKP BIT(2) -#define PFM_WOWL BIT(3) -#define EnPDN BIT(4) -#define PDN_PL BIT(5) -#define APFM_ONMAC BIT(8) -#define APFM_OFF BIT(9) -#define APFM_RSM BIT(10) -#define AFSM_HSUS BIT(11) -#define AFSM_PCIE BIT(12) -#define APDM_MAC BIT(13) -#define APDM_HOST BIT(14) -#define APDM_HPDN BIT(15) -#define RDY_MACON BIT(16) -#define SUS_HOST BIT(17) -#define ROP_ALD BIT(20) -#define ROP_PWR BIT(21) -#define ROP_SPS BIT(22) -#define SOP_MRST BIT(25) -#define SOP_FUSE BIT(26) -#define SOP_ABG BIT(27) -#define SOP_AMB BIT(28) -#define SOP_RCK BIT(29) -#define SOP_A8M BIT(30) -#define XOP_BTCK BIT(31) - -//2 SYS_CLKR -#define ANAD16V_EN BIT(0) -#define ANA8M BIT(1) -#define MACSLP BIT(4) -#define LOADER_CLK_EN BIT(5) -#define _80M_SSC_DIS BIT(7) -#define _80M_SSC_EN_HO BIT(8) -#define PHY_SSC_RSTB BIT(9) -#define SEC_CLK_EN BIT(10) -#define MAC_CLK_EN BIT(11) -#define SYS_CLK_EN BIT(12) -#define RING_CLK_EN BIT(13) - - -//2 9346CR - -#define BOOT_FROM_EEPROM BIT(4) -#define EEPROM_EN BIT(5) - - -//2 AFE_MISC -#define AFE_BGEN BIT(0) -#define AFE_MBEN BIT(1) -#define MAC_ID_EN BIT(7) - - -//2 SPS0_CTRL - - -//2 SPS_OCP_CFG - - -//2 RSV_CTRL -#define WLOCK_ALL BIT(0) -#define WLOCK_00 BIT(1) -#define WLOCK_04 BIT(2) -#define WLOCK_08 BIT(3) -#define WLOCK_40 BIT(4) -#define R_DIS_PRST_0 BIT(5) -#define R_DIS_PRST_1 BIT(6) -#define LOCK_ALL_EN BIT(7) - -//2 RF_CTRL -#define RF_EN BIT(0) -#define RF_RSTB BIT(1) -#define RF_SDMRSTB BIT(2) - - - -//2 LDOA15_CTRL -#define LDA15_EN BIT(0) -#define LDA15_STBY BIT(1) -#define LDA15_OBUF BIT(2) -#define LDA15_REG_VOS BIT(3) -#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) - - - -//2 LDOV12D_CTRL -#define LDV12_EN BIT(0) -#define LDV12_SDBY BIT(1) -#define LPLDO_HSM BIT(2) -#define LPLDO_LSM_DIS BIT(3) -#define _LDV12_VADJ(x) (((x) & 0xF) << 4) - - -//2 AFE_XTAL_CTRL -#define XTAL_EN BIT(0) -#define XTAL_BSEL BIT(1) -#define _XTAL_BOSC(x) (((x) & 0x3) << 2) -#define _XTAL_CADJ(x) (((x) & 0xF) << 4) -#define XTAL_GATE_USB BIT(8) -#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9) -#define XTAL_GATE_AFE BIT(11) -#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12) -#define XTAL_RF_GATE BIT(14) -#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15) -#define XTAL_GATE_DIG BIT(17) -#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18) -#define XTAL_BT_GATE BIT(20) -#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) -#define _XTAL_GPIO(x) (((x) & 0x7) << 23) - - -#define CKDLY_AFE BIT(26) -#define CKDLY_USB BIT(27) -#define CKDLY_DIG BIT(28) -#define CKDLY_BT BIT(29) - - -//2 AFE_PLL_CTRL -#define APLL_EN BIT(0) -#define APLL_320_EN BIT(1) -#define APLL_FREF_SEL BIT(2) -#define APLL_EDGE_SEL BIT(3) -#define APLL_WDOGB BIT(4) -#define APLL_LPFEN BIT(5) - -#define APLL_REF_CLK_13MHZ 0x1 -#define APLL_REF_CLK_19_2MHZ 0x2 -#define APLL_REF_CLK_20MHZ 0x3 -#define APLL_REF_CLK_25MHZ 0x4 -#define APLL_REF_CLK_26MHZ 0x5 -#define APLL_REF_CLK_38_4MHZ 0x6 -#define APLL_REF_CLK_40MHZ 0x7 - -#define APLL_320EN BIT(14) -#define APLL_80EN BIT(15) -#define APLL_1MEN BIT(24) - - -//2 EFUSE_CTRL -#define ALD_EN BIT(18) -#define EF_PD BIT(19) -#define EF_FLAG BIT(31) - -//2 EFUSE_TEST -#define EF_TRPT BIT(7) -#define LDOE25_EN BIT(31) - -//2 PWR_DATA - -//2 CAL_TIMER - -//2 ACLK_MON -#define RSM_EN BIT(0) -#define Timer_EN BIT(4) - - -//2 GPIO_MUXCFG -#define TRSW0EN BIT(2) -#define TRSW1EN BIT(3) -#define EROM_EN BIT(4) -#define EnBT BIT(5) -#define EnUart BIT(8) -#define Uart_910 BIT(9) -#define EnPMAC BIT(10) -#define SIC_SWRST BIT(11) -#define EnSIC BIT(12) -#define SIC_23 BIT(13) -#define EnHDP BIT(14) -#define SIC_LBK BIT(15) - -//2 GPIO_PIN_CTRL - - - -//2 GPIO_INTM - -//2 LEDCFG -#define LED0PL BIT(4) -#define LED1PL BIT(12) -#define LED0DIS BIT(7) - -#define SECCAM_CLR BIT(30) - -//2 FSIMR - -//2 FSISR - - -//2 8051FWDL -//2 MCUFWDL -#define MCUFWDL_EN BIT(0) -#define MCUFWDL_RDY BIT(1) -#define FWDL_ChkSum_rpt BIT(2) -#define MACINI_RDY BIT(3) -#define BBINI_RDY BIT(4) -#define RFINI_RDY BIT(5) -#define WINTINI_RDY BIT(6) -#define MAC1_WINTINI_RDY BIT(11)// 0X81 BIT3 -#define CPRST BIT(23) - - - - -//2 REG_SYS_CFG -#define XCLK_VLD BIT(0) -#define ACLK_VLD BIT(1) -#define UCLK_VLD BIT(2) -#define PCLK_VLD BIT(3) -#define PCIRSTB BIT(4) -#define V15_VLD BIT(5) -#define TRP_B15V_EN BIT(7) -#define SIC_IDLE BIT(8) -#define BD_MAC2 BIT(9) -#define BD_MAC1 BIT(10) -#define IC_MACPHY_MODE BIT(11) -#define PAD_HWPD_IDN BIT(22) -#define TRP_VAUX_EN BIT(23) -#define TRP_BT_EN BIT(24) -#define BD_PKG_SEL BIT(25) -#define BD_HCI_SEL BIT(26) -#define TYPE_ID BIT(27) - -#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 -#define CHIP_VER_RTL_SHIFT 12 - -//----------------------------------------------------- -// -// 0x0100h ~ 0x01FFh MACTOP General Configuration -// -//----------------------------------------------------- - - -//2 Function Enable Registers -//2 CR - -#define REG_LBMODE (REG_CR + 3) - - -#define HCI_TXDMA_EN BIT(0) -#define HCI_RXDMA_EN BIT(1) -#define TXDMA_EN BIT(2) -#define RXDMA_EN BIT(3) -#define PROTOCOL_EN BIT(4) -#define SCHEDULE_EN BIT(5) -#define MACTXEN BIT(6) -#define MACRXEN BIT(7) -#define ENSWBCN BIT(8) -#define ENSEC BIT(9) - -// Network type -#define _NETTYPE(x) (((x) & 0x3) << 16) -#define MASK_NETTYPE 0x30000 -#define NT_NO_LINK 0x0 -#define NT_LINK_AD_HOC 0x1 -#define NT_LINK_AP 0x2 -#define NT_AS_AP 0x3 - -#define _LBMODE(x) (((x) & 0xF) << 24) -#define MASK_LBMODE 0xF000000 -#define LOOPBACK_NORMAL 0x0 -#define LOOPBACK_IMMEDIATELY 0xB -#define LOOPBACK_MAC_DELAY 0x3 -#define LOOPBACK_PHY 0x1 -#define LOOPBACK_DMA 0x7 - - -//2 PBP - Page Size Register -#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) -#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) -#define _PSRX_MASK 0xF -#define _PSTX_MASK 0xF0 -#define _PSRX(x) (x) -#define _PSTX(x) ((x) << 4) - -#define PBP_64 0x0 -#define PBP_128 0x1 -#define PBP_256 0x2 -#define PBP_512 0x3 -#define PBP_1024 0x4 - - -//2 TX/RXDMA -#define RXDMA_ARBBW_EN BIT(0) -#define RXSHFT_EN BIT(1) -#define RXDMA_AGG_EN BIT(2) -#define QS_VO_QUEUE BIT(8) -#define QS_VI_QUEUE BIT(9) -#define QS_BE_QUEUE BIT(10) -#define QS_BK_QUEUE BIT(11) -#define QS_MANAGER_QUEUE BIT(12) -#define QS_HIGH_QUEUE BIT(13) - -#define HQSEL_VOQ BIT(0) -#define HQSEL_VIQ BIT(1) -#define HQSEL_BEQ BIT(2) -#define HQSEL_BKQ BIT(3) -#define HQSEL_MGTQ BIT(4) -#define HQSEL_HIQ BIT(5) - -// For normal driver, 0x10C -#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) -#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) -#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) -#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) -#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) -#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) - -#define QUEUE_LOW 1 -#define QUEUE_NORMAL 2 -#define QUEUE_HIGH 3 - - - -//2 TRXFF_BNDY - - -//2 LLT_INIT -#define _LLT_NO_ACTIVE 0x0 -#define _LLT_WRITE_ACCESS 0x1 -#define _LLT_READ_ACCESS 0x2 - -#define _LLT_INIT_DATA(x) ((x) & 0xFF) -#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) -#define _LLT_OP(x) (((x) & 0x3) << 30) -#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) - - -//2 BB_ACCESS_CTRL -#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) -#define BB_WRITE_EN BIT(30) -#define BB_READ_EN BIT(31) -//#define BB_ADDR_MASK 0xFFF -//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK) - -//----------------------------------------------------- -// -// 0x0200h ~ 0x027Fh TXDMA Configuration -// -//----------------------------------------------------- -//2 RQPN -#define _HPQ(x) ((x) & 0xFF) -#define _LPQ(x) (((x) & 0xFF) << 8) -#define _PUBQ(x) (((x) & 0xFF) << 16) -#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register - - -#define HPQ_PUBLIC_DIS BIT(24) -#define LPQ_PUBLIC_DIS BIT(25) -#define LD_RQPN BIT(31) - - -//2 TDECTRL -#define BCN_VALID BIT(16) -#define BCN_HEAD(x) (((x) & 0xFF) << 8) -#define BCN_HEAD_MASK 0xFF00 - -//2 TDECTL -#define BLK_DESC_NUM_SHIFT 4 -#define BLK_DESC_NUM_MASK 0xF - - -//2 TXDMA_OFFSET_CHK -#define DROP_DATA_EN BIT(9) - -//----------------------------------------------------- -// -// 0x0400h ~ 0x047Fh Protocol Configuration -// -//----------------------------------------------------- -//2 FWHW_TXQ_CTRL -#define EN_AMPDU_RTY_NEW BIT(7) - -//2 INIRTSMCS_SEL -#define _INIRTSMCS_SEL(x) ((x) & 0x3F) - - -//2 SPEC SIFS -#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) -#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) - - -//2 RRSR - -#define RATE_REG_BITMAP_ALL 0xFFFFF - -#define _RRSC_BITMAP(x) ((x) & 0xFFFFF) - -#define _RRSR_RSC(x) (((x) & 0x3) << 21) -#define RRSR_RSC_RESERVED 0x0 -#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 -#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 -#define RRSR_RSC_DUPLICATE_MODE 0x3 - - -//2 ARFR -#define USE_SHORT_G1 BIT(20) - -//2 AGGLEN_LMT_L -#define _AGGLMT_MCS0(x) ((x) & 0xF) -#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4) -#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8) -#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12) -#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16) -#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20) -#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) -#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) - - -//2 RL -#define RETRY_LIMIT_SHORT_SHIFT 8 -#define RETRY_LIMIT_LONG_SHIFT 0 - - -//2 DARFRC -#define _DARF_RC1(x) ((x) & 0x1F) -#define _DARF_RC2(x) (((x) & 0x1F) << 8) -#define _DARF_RC3(x) (((x) & 0x1F) << 16) -#define _DARF_RC4(x) (((x) & 0x1F) << 24) -// NOTE: shift starting from address (DARFRC + 4) -#define _DARF_RC5(x) ((x) & 0x1F) -#define _DARF_RC6(x) (((x) & 0x1F) << 8) -#define _DARF_RC7(x) (((x) & 0x1F) << 16) -#define _DARF_RC8(x) (((x) & 0x1F) << 24) - - -//2 RARFRC -#define _RARF_RC1(x) ((x) & 0x1F) -#define _RARF_RC2(x) (((x) & 0x1F) << 8) -#define _RARF_RC3(x) (((x) & 0x1F) << 16) -#define _RARF_RC4(x) (((x) & 0x1F) << 24) -// NOTE: shift starting from address (RARFRC + 4) -#define _RARF_RC5(x) ((x) & 0x1F) -#define _RARF_RC6(x) (((x) & 0x1F) << 8) -#define _RARF_RC7(x) (((x) & 0x1F) << 16) -#define _RARF_RC8(x) (((x) & 0x1F) << 24) - - - - -//----------------------------------------------------- -// -// 0x0500h ~ 0x05FFh EDCA Configuration -// -//----------------------------------------------------- - - - -//2 EDCA setting -#define AC_PARAM_TXOP_LIMIT_OFFSET 16 -#define AC_PARAM_ECW_MAX_OFFSET 12 -#define AC_PARAM_ECW_MIN_OFFSET 8 -#define AC_PARAM_AIFS_OFFSET 0 - - -//2 EDCA_VO_PARAM -#define _AIFS(x) (x) -#define _ECW_MAX_MIN(x) ((x) << 8) -#define _TXOP_LIMIT(x) ((x) << 16) - - -#define _BCNIFS(x) ((x) & 0xFF) -#define _BCNECW(x) (((x) & 0xF))<< 8) - - -#define _LRL(x) ((x) & 0x3F) -#define _SRL(x) (((x) & 0x3F) << 8) - - -//2 SIFS_CCK -#define _SIFS_CCK_CTX(x) ((x) & 0xFF) -#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); - - -//2 SIFS_OFDM -#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) -#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); - - -//2 TBTT PROHIBIT -#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) - - -//2 REG_RD_CTRL -#define DIS_EDCA_CNT_DWN BIT(11) - - -//2 BCN_CTRL -#define EN_MBSSID BIT(1) -#define EN_TXBCN_RPT BIT(2) -#define EN_BCN_FUNCTION BIT(3) - -// The same function but different bit field. -#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) -#define DIS_TSF_UDT0_TEST_CHIP BIT(5) - -//2 ACMHWCTRL -#define AcmHw_HwEn BIT(0) -#define AcmHw_BeqEn BIT(1) -#define AcmHw_ViqEn BIT(2) -#define AcmHw_VoqEn BIT(3) -#define AcmHw_BeqStatus BIT(4) -#define AcmHw_ViqStatus BIT(5) -#define AcmHw_VoqStatus BIT(6) - - - -//----------------------------------------------------- -// -// 0x0600h ~ 0x07FFh WMAC Configuration -// -//----------------------------------------------------- - -//2 APSD_CTRL -#define APSDOFF BIT(6) -#define APSDOFF_STATUS BIT(7) - - -//2 BWOPMODE -#define BW_20MHZ BIT(2) -//#define BW_OPMODE_20MHZ BIT(2) // For compability - - -#define RATE_BITMAP_ALL 0xFFFFF - -// Only use CCK 1M rate for ACK -#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 - -//2 TCR -#define TSFRST BIT(0) -#define DIS_GCLK BIT(1) -#define PAD_SEL BIT(2) -#define PWR_ST BIT(6) -#define PWRBIT_OW_EN BIT(7) -#define ACRC BIT(8) -#define CFENDFORM BIT(9) -#define ICV BIT(10) - - - -//2 RCR -#define AAP BIT(0) -#define APM BIT(1) -#define AM BIT(2) -#define AB BIT(3) -#define ADD3 BIT(4) -#define APWRMGT BIT(5) -#define CBSSID BIT(6) -#define CBSSID_BCN BIT(7) -#define ACRC32 BIT(8) -#define AICV BIT(9) -#define ADF BIT(11) -#define ACF BIT(12) -#define AMF BIT(13) -#define HTC_LOC_CTRL BIT(14) -#define UC_DATA_EN BIT(16) -#define BM_DATA_EN BIT(17) -#define MFBEN BIT(22) -#define LSIGEN BIT(23) -#define EnMBID BIT(24) -#define APP_BASSN BIT(27) -#define APP_PHYSTS BIT(28) -#define APP_ICV BIT(29) -#define APP_MIC BIT(30) -#define APP_FCS BIT(31) - -//2 RX_PKT_LIMIT - -//2 RX_DLK_TIME - -//2 MBIDCAMCFG - - - -//2 AMPDU_MIN_SPACE -#define _MIN_SPACE(x) ((x) & 0x7) -#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) - - -//2 RXERR_RPT -#define RXERR_TYPE_OFDM_PPDU 0 -#define RXERR_TYPE_OFDM_FALSE_ALARM 1 -#define RXERR_TYPE_OFDM_MPDU_OK 2 -#define RXERR_TYPE_OFDM_MPDU_FAIL 3 -#define RXERR_TYPE_CCK_PPDU 4 -#define RXERR_TYPE_CCK_FALSE_ALARM 5 -#define RXERR_TYPE_CCK_MPDU_OK 6 -#define RXERR_TYPE_CCK_MPDU_FAIL 7 -#define RXERR_TYPE_HT_PPDU 8 -#define RXERR_TYPE_HT_FALSE_ALARM 9 -#define RXERR_TYPE_HT_MPDU_TOTAL 10 -#define RXERR_TYPE_HT_MPDU_OK 11 -#define RXERR_TYPE_HT_MPDU_FAIL 12 -#define RXERR_TYPE_RX_FULL_DROP 15 - -#define RXERR_COUNTER_MASK 0xFFFFF -#define RXERR_RPT_RST BIT(27) -#define _RXERR_RPT_SEL(type) ((type) << 28) - - -//2 SECCFG -#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key -#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key -#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption -#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption -#define SCR_SKByA2 BIT(4) //Search kEY BY A2 -#define SCR_NoSKMC BIT(5) //No Key Search Multicast -#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key -#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key - -//vivi added for new cam search flow, 20091028 -#ifdef HW_EN_DE_CRYPTION_FOR_NEW_CAM_SEARCH_FLOW -#define SCR_TxUseBroadcastDK BIT6 //Force Tx Use Broadcast Default Key -#define SCR_RxUseBroadcastDK BIT7 //Force Rx Use Broadcast Default Key -#endif - - -//----------------------------------------------------- -// -// 0xFE00h ~ 0xFE55h USB Configuration -// -//----------------------------------------------------- - -//2 USB Information (0xFE17) -#define USB_IS_HIGH_SPEED 0 -#define USB_IS_FULL_SPEED 1 -#define USB_SPEED_MASK BIT(5) - -#define USB_NORMAL_SIE_EP_MASK 0xF -#define USB_NORMAL_SIE_EP_SHIFT 4 - -#define USB_TEST_EP_MASK 0x30 -#define USB_TEST_EP_SHIFT 4 - -//2 Special Option -#define USB_AGG_EN BIT(3) - - -//2REG_C2HEVT_CLEAR -#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message -#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. - -//2 8192D PartNo. -#define PARTNO_92D_NIC (BIT7|BIT6) -#define PARTNO_92D_NIC_REMARK (BIT5|BIT4) -#define PARTNO_SINGLE_BAND_VS BIT3 -#define PARTNO_SINGLE_BAND_VS_REMARK BIT1 -#define PARTNO_CONCURRENT_BAND_VC (BIT3|BIT2) -#define PARTNO_CONCURRENT_BAND_VC_REMARK (BIT1|BIT0) -//======================================================== -// General definitions -//======================================================== - -#define MAC_ADDR_LEN 6 -#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 -#define LAST_ENTRY_OF_TX_PKT_BUFFER_DUAL_MAC 127 - -#define POLLING_LLT_THRESHOLD 20 -#define POLLING_READY_TIMEOUT_COUNT 1000 - -// Min Spacing related settings. -#define MAX_MSS_DENSITY_2T 0x13 -#define MAX_MSS_DENSITY_1T 0x0A -// GPIO BIT -#define HAL_8192C_HW_GPIO_WPS_BIT BIT2 - - -#include "basic_types.h" - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h deleted file mode 100755 index 2b1580ff2402..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h +++ /dev/null @@ -1,106 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTL8192D_XMIT_H_ -#define _RTL8192D_XMIT_H_ - -#define VO_QUEUE_INX 0 -#define VI_QUEUE_INX 1 -#define BE_QUEUE_INX 2 -#define BK_QUEUE_INX 3 -#define BCN_QUEUE_INX 4 -#define MGT_QUEUE_INX 5 -#define HIGH_QUEUE_INX 6 -#define TXCMD_QUEUE_INX 7 - -#define HW_QUEUE_ENTRY 8 - -// -// Queue Select Value in TxDesc -// -#define QSLT_BK 0x2//0x01 -#define QSLT_BE 0x0 -#define QSLT_VI 0x5//0x4 -#define QSLT_VO 0x7//0x6 -#define QSLT_BEACON 0x10 -#define QSLT_HIGH 0x11 -#define QSLT_MGNT 0x12 -#define QSLT_CMD 0x13 - -//Because we open EM for normal case, we just always insert 2*8 bytes.by wl -#define USB_92D_DUMMY_OFFSET 2 -#define USB_92D_DUMMY_LENGTH (USB_92D_DUMMY_OFFSET * PACKET_OFFSET_SZ) -#define USB_HWDESC_HEADER_LEN (TXDESC_SIZE + USB_92D_DUMMY_LENGTH) - -//For 92D early mode -#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) -#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) -#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) -#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) -#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) -#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) -#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) - -#ifdef CONFIG_USB_HCI - -#ifdef CONFIG_USB_TX_AGGREGATION -#define MAX_TX_AGG_PACKET_NUMBER 0xFF -#endif - -s32 rtl8192du_init_xmit_priv(_adapter * padapter); - -void rtl8192du_free_xmit_priv(_adapter * padapter); - -void rtl8192du_cal_txdesc_chksum(struct tx_desc *ptxdesc); - -s32 rtl8192du_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); - -void rtl8192du_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); - -s32 rtl8192du_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); - -#ifdef CONFIG_HOSTAPD_MLME -s32 rtl8192du_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); -#endif - -#endif - -#ifdef CONFIG_PCI_HCI -s32 rtl8192de_init_xmit_priv(_adapter * padapter); -void rtl8192de_free_xmit_priv(_adapter * padapter); - -s32 rtl8192de_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf); -struct xmit_buf *rtl8192de_dequeue_xmitbuf(struct rtw_tx_ring *ring); - -void rtl8192de_xmitframe_resume(_adapter *padapter); - -void rtl8192de_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); - -s32 rtl8192de_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); - -#ifdef CONFIG_HOSTAPD_MLME -s32 rtl8192de_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); -#endif - -#endif - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h b/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h deleted file mode 100755 index 1313a255fb93..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h +++ /dev/null @@ -1,41 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTL871X_BYTEORDER_H_ -#define _RTL871X_BYTEORDER_H_ - -#include - -#if defined (CONFIG_LITTLE_ENDIAN) && defined (CONFIG_BIG_ENDIAN) -#error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n" -#endif - -#if defined (CONFIG_LITTLE_ENDIAN) -#ifndef CONFIG_PLATFORM_MSTAR389 -# include -#endif -#elif defined (CONFIG_BIG_ENDIAN) -# include -#else -# error "Must be LITTLE/BIG Endian Host" -#endif - -#endif /* _RTL871X_BYTEORDER_H_ */ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_cmd.h b/drivers/net/wireless/rtl8192c/include/rtw_cmd.h deleted file mode 100755 index 58a54f50989b..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_cmd.h +++ /dev/null @@ -1,1100 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_CMD_H_ -#define __RTW_CMD_H_ - -#include -#include -#include - -#define C2H_MEM_SZ (16*1024) - -#ifndef CONFIG_RTL8711FW - - #include - #include // - - - #define FREE_CMDOBJ_SZ 128 - - #define MAX_CMDSZ 1024 - #define MAX_RSPSZ 512 - #define MAX_EVTSZ 1024 - -#ifdef PLATFORM_OS_CE - #define CMDBUFF_ALIGN_SZ 4 -#else - #define CMDBUFF_ALIGN_SZ 512 -#endif - - struct cmd_obj { - u16 cmdcode; - u8 res; - u8 *parmbuf; - u32 cmdsz; - u8 *rsp; - u32 rspsz; - //_sema cmd_sem; - _list list; - }; - - struct cmd_priv { - _sema cmd_queue_sema; - //_sema cmd_done_sema; - _sema terminate_cmdthread_sema; - _queue cmd_queue; - u8 cmd_seq; - u8 *cmd_buf; //shall be non-paged, and 4 bytes aligned - u8 *cmd_allocated_buf; - u8 *rsp_buf; //shall be non-paged, and 4 bytes aligned - u8 *rsp_allocated_buf; - u32 cmd_issued_cnt; - u32 cmd_done_cnt; - u32 rsp_cnt; - u8 cmdthd_running; - _adapter *padapter; - }; - -#ifdef CONFIG_EVENT_THREAD_MODE - struct evt_obj { - u16 evtcode; - u8 res; - u8 *parmbuf; - u32 evtsz; - _list list; - }; -#endif - - struct evt_priv { -#ifdef CONFIG_EVENT_THREAD_MODE - _sema evt_notify; - _sema terminate_evtthread_sema; - _queue evt_queue; -#endif - -#ifdef CONFIG_H2CLBK - _sema lbkevt_done; - u8 lbkevt_limit; - u8 lbkevt_num; - u8 *cmdevt_parm; -#endif - ATOMIC_T event_seq; - u8 *evt_buf; //shall be non-paged, and 4 bytes aligned - u8 *evt_allocated_buf; - u32 evt_done_cnt; -#ifdef CONFIG_SDIO_HCI - u8 *c2h_mem; - u8 *allocated_c2h_mem; -#ifdef PLATFORM_OS_XP - PMDL pc2h_mdl; -#endif -#endif - - }; - -#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \ -do {\ - _rtw_init_listhead(&pcmd->list);\ - pcmd->cmdcode = code;\ - pcmd->parmbuf = (u8 *)(pparm);\ - pcmd->cmdsz = sizeof (*pparm);\ - pcmd->rsp = NULL;\ - pcmd->rspsz = 0;\ -} while(0) - -extern u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj); -extern struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv); -extern void rtw_free_cmd_obj(struct cmd_obj *pcmd); - -#ifdef CONFIG_EVENT_THREAD_MODE -extern u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj); -extern struct evt_obj *rtw_dequeue_evt(_queue *queue); -extern void rtw_free_evt_obj(struct evt_obj *pcmd); -#endif - -thread_return rtw_cmd_thread(thread_context context); - -extern u32 rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); -extern void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv); - -extern u32 rtw_init_evt_priv (struct evt_priv *pevtpriv); -extern void rtw_free_evt_priv (struct evt_priv *pevtpriv); -extern void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv); -extern void rtw_evt_notify_isr(struct evt_priv *pevtpriv); -#ifdef CONFIG_P2P -u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ); -#endif //CONFIG_P2P - -#else - #include -#endif /* CONFIG_RTL8711FW */ - -enum rtw_drvextra_cmd_id -{ - NONE_WK_CID, - DYNAMIC_CHK_WK_CID, - DM_CTRL_WK_CID, - PBC_POLLING_WK_CID, - POWER_SAVING_CTRL_WK_CID,//IPS,AUTOSuspend - LPS_CTRL_WK_CID, - ANT_SELECT_WK_CID, - P2P_PS_WK_CID, - P2P_PROTO_WK_CID, - CHECK_HIQ_WK_CID,//for softap mode, check hi queue if empty - MAX_WK_CID -}; - -enum LPS_CTRL_TYPE -{ - LPS_CTRL_SCAN=0, - LPS_CTRL_JOINBSS=1, - LPS_CTRL_CONNECT=2, - LPS_CTRL_DISCONNECT=3, - LPS_CTRL_SPECIAL_PACKET=4, -}; - -enum RFINTFS { - SWSI, - HWSI, - HWPI, -}; - -/* -Caller Mode: Infra, Ad-HoC(C) - -Notes: To enter USB suspend mode - -Command Mode - -*/ -struct usb_suspend_parm { - u32 action;// 1: sleep, 0:resume -}; - -/* -Caller Mode: Infra, Ad-HoC - -Notes: To join a known BSS. - -Command-Event Mode - -*/ - -/* -Caller Mode: Infra, Ad-Hoc - -Notes: To join the specified bss - -Command Event Mode - -*/ -struct joinbss_parm { - WLAN_BSSID_EX network; -}; - -/* -Caller Mode: Infra, Ad-HoC(C) - -Notes: To disconnect the current associated BSS - -Command Mode - -*/ -struct disconnect_parm { - u32 rsvd; -}; - -/* -Caller Mode: AP, Ad-HoC(M) - -Notes: To create a BSS - -Command Mode -*/ -struct createbss_parm { - WLAN_BSSID_EX network; -}; - -/* -Caller Mode: AP, Ad-HoC, Infra - -Notes: To set the NIC mode of RTL8711 - -Command Mode - -The definition of mode: - -#define IW_MODE_AUTO 0 // Let the driver decides which AP to join -#define IW_MODE_ADHOC 1 // Single cell network (Ad-Hoc Clients) -#define IW_MODE_INFRA 2 // Multi cell network, roaming, .. -#define IW_MODE_MASTER 3 // Synchronisation master or Access Point -#define IW_MODE_REPEAT 4 // Wireless Repeater (forwarder) -#define IW_MODE_SECOND 5 // Secondary master/repeater (backup) -#define IW_MODE_MONITOR 6 // Passive monitor (listen only) - -*/ -struct setopmode_parm { - u8 mode; - u8 rsvd[3]; -}; - -/* -Caller Mode: AP, Ad-HoC, Infra - -Notes: To ask RTL8711 performing site-survey - -Command-Event Mode - -*/ -struct sitesurvey_parm { - sint scan_mode; //active: 1, passive: 0 - sint bsslimit; // 1 ~ 48 - sint ss_ssidlen; - u8 ss_ssid[IW_ESSID_MAX_SIZE + 1]; -}; - -/* -Caller Mode: Any - -Notes: To set the auth type of RTL8711. open/shared/802.1x - -Command Mode - -*/ -struct setauth_parm { - u8 mode; //0: legacy open, 1: legacy shared 2: 802.1x - u8 _1x; //0: PSK, 1: TLS - u8 rsvd[2]; -}; - -/* -Caller Mode: Infra - -a. algorithm: wep40, wep104, tkip & aes -b. keytype: grp key/unicast key -c. key contents - -when shared key ==> keyid is the camid -when 802.1x ==> keyid [0:1] ==> grp key -when 802.1x ==> keyid > 2 ==> unicast key - -*/ -struct setkey_parm { - u8 algorithm; // encryption algorithm, could be none, wep40, TKIP, CCMP, wep104 - u8 keyid; - u8 grpkey; // 1: this is the grpkey for 802.1x. 0: this is the unicast key for 802.1x - u8 set_tx; // 1: main tx key for wep. 0: other key. - u8 key[16]; // this could be 40 or 104 -}; - -/* -When in AP or Ad-Hoc mode, this is used to -allocate an sw/hw entry for a newly associated sta. - -Command - -when shared key ==> algorithm/keyid - -*/ -struct set_stakey_parm { - u8 addr[ETH_ALEN]; - u8 algorithm; - u8 key[16]; -}; - -struct set_stakey_rsp { - u8 addr[ETH_ALEN]; - u8 keyid; - u8 rsvd; -}; - -/* -Caller Ad-Hoc/AP - -Command -Rsp(AID == CAMID) mode - -This is to force fw to add an sta_data entry per driver's request. - -FW will write an cam entry associated with it. - -*/ -struct set_assocsta_parm { - u8 addr[ETH_ALEN]; -}; - -struct set_assocsta_rsp { - u8 cam_id; - u8 rsvd[3]; -}; - -/* - Caller Ad-Hoc/AP - - Command mode - - This is to force fw to del an sta_data entry per driver's request - - FW will invalidate the cam entry associated with it. - -*/ -struct del_assocsta_parm { - u8 addr[ETH_ALEN]; -}; - -/* -Caller Mode: AP/Ad-HoC(M) - -Notes: To notify fw that given staid has changed its power state - -Command Mode - -*/ -struct setstapwrstate_parm { - u8 staid; - u8 status; - u8 hwaddr[6]; -}; - -/* -Caller Mode: Any - -Notes: To setup the basic rate of RTL8711 - -Command Mode - -*/ -struct setbasicrate_parm { - u8 basicrates[NumRates]; -}; - -/* -Caller Mode: Any - -Notes: To read the current basic rate - -Command-Rsp Mode - -*/ -struct getbasicrate_parm { - u32 rsvd; -}; - -struct getbasicrate_rsp { - u8 basicrates[NumRates]; -}; - -/* -Caller Mode: Any - -Notes: To setup the data rate of RTL8711 - -Command Mode - -*/ -struct setdatarate_parm { -#ifdef MP_FIRMWARE_OFFLOAD - u32 curr_rateidx; -#else - u8 mac_id; - u8 datarates[NumRates]; -#endif -}; - -/* -Caller Mode: Any - -Notes: To read the current data rate - -Command-Rsp Mode - -*/ -struct getdatarate_parm { - u32 rsvd; - -}; -struct getdatarate_rsp { - u8 datarates[NumRates]; -}; - - -/* -Caller Mode: Any -AP: AP can use the info for the contents of beacon frame -Infra: STA can use the info when sitesurveying -Ad-HoC(M): Like AP -Ad-HoC(C): Like STA - - -Notes: To set the phy capability of the NIC - -Command Mode - -*/ - -struct setphyinfo_parm { - struct regulatory_class class_sets[NUM_REGULATORYS]; - u8 status; -}; - -struct getphyinfo_parm { - u32 rsvd; -}; - -struct getphyinfo_rsp { - struct regulatory_class class_sets[NUM_REGULATORYS]; - u8 status; -}; - -/* -Caller Mode: Any - -Notes: To set the channel/modem/band -This command will be used when channel/modem/band is changed. - -Command Mode - -*/ -struct setphy_parm { - u8 rfchannel; - u8 modem; -}; - -/* -Caller Mode: Any - -Notes: To get the current setting of channel/modem/band - -Command-Rsp Mode - -*/ -struct getphy_parm { - u32 rsvd; - -}; -struct getphy_rsp { - u8 rfchannel; - u8 modem; -}; - -struct readBB_parm { - u8 offset; -}; -struct readBB_rsp { - u8 value; -}; - -struct readTSSI_parm { - u8 offset; -}; -struct readTSSI_rsp { - u8 value; -}; - -struct writeBB_parm { - u8 offset; - u8 value; -}; - -struct readRF_parm { - u8 offset; -}; -struct readRF_rsp { - u32 value; -}; - -struct writeRF_parm { - u32 offset; - u32 value; -}; - -struct getrfintfs_parm { - u8 rfintfs; -}; - - -struct Tx_Beacon_param -{ - WLAN_BSSID_EX network; -}; - -/* - Notes: This command is used for H2C/C2H loopback testing - - mac[0] == 0 - ==> CMD mode, return H2C_SUCCESS. - The following condition must be ture under CMD mode - mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0; - s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7; - s2 == (b1 << 8 | b0); - - mac[0] == 1 - ==> CMD_RSP mode, return H2C_SUCCESS_RSP - - The rsp layout shall be: - rsp: parm: - mac[0] = mac[5]; - mac[1] = mac[4]; - mac[2] = mac[3]; - mac[3] = mac[2]; - mac[4] = mac[1]; - mac[5] = mac[0]; - s0 = s1; - s1 = swap16(s0); - w0 = swap32(w1); - b0 = b1 - s2 = s0 + s1 - b1 = b0 - w1 = w0 - - mac[0] == 2 - ==> CMD_EVENT mode, return H2C_SUCCESS - The event layout shall be: - event: parm: - mac[0] = mac[5]; - mac[1] = mac[4]; - mac[2] = event's sequence number, starting from 1 to parm's marc[3] - mac[3] = mac[2]; - mac[4] = mac[1]; - mac[5] = mac[0]; - s0 = swap16(s0) - event.mac[2]; - s1 = s1 + event.mac[2]; - w0 = swap32(w0); - b0 = b1 - s2 = s0 + event.mac[2] - b1 = b0 - w1 = swap32(w1) - event.mac[2]; - - parm->mac[3] is the total event counts that host requested. - - - event will be the same with the cmd's param. - -*/ - -#ifdef CONFIG_H2CLBK - -struct seth2clbk_parm { - u8 mac[6]; - u16 s0; - u16 s1; - u32 w0; - u8 b0; - u16 s2; - u8 b1; - u32 w1; -}; - -struct geth2clbk_parm { - u32 rsv; -}; - -struct geth2clbk_rsp { - u8 mac[6]; - u16 s0; - u16 s1; - u32 w0; - u8 b0; - u16 s2; - u8 b1; - u32 w1; -}; - -#endif /* CONFIG_H2CLBK */ - -// CMD param Formart for driver extra cmd handler -struct drvextra_cmd_parm { - int ec_id; //extra cmd id - int type_size; // Can use this field as the type id or command size - unsigned char *pbuf; -}; - -/*------------------- Below are used for RF/BB tunning ---------------------*/ - -struct setantenna_parm { - u8 tx_antset; - u8 rx_antset; - u8 tx_antenna; - u8 rx_antenna; -}; - -struct enrateadaptive_parm { - u32 en; -}; - -struct settxagctbl_parm { - u32 txagc[MAX_RATES_LENGTH]; -}; - -struct gettxagctbl_parm { - u32 rsvd; -}; -struct gettxagctbl_rsp { - u32 txagc[MAX_RATES_LENGTH]; -}; - -struct setagcctrl_parm { - u32 agcctrl; // 0: pure hw, 1: fw -}; - - -struct setssup_parm { - u32 ss_ForceUp[MAX_RATES_LENGTH]; -}; - -struct getssup_parm { - u32 rsvd; -}; -struct getssup_rsp { - u8 ss_ForceUp[MAX_RATES_LENGTH]; -}; - - -struct setssdlevel_parm { - u8 ss_DLevel[MAX_RATES_LENGTH]; -}; - -struct getssdlevel_parm { - u32 rsvd; -}; -struct getssdlevel_rsp { - u8 ss_DLevel[MAX_RATES_LENGTH]; -}; - -struct setssulevel_parm { - u8 ss_ULevel[MAX_RATES_LENGTH]; -}; - -struct getssulevel_parm { - u32 rsvd; -}; -struct getssulevel_rsp { - u8 ss_ULevel[MAX_RATES_LENGTH]; -}; - - -struct setcountjudge_parm { - u8 count_judge[MAX_RATES_LENGTH]; -}; - -struct getcountjudge_parm { - u32 rsvd; -}; -struct getcountjudge_rsp { - u8 count_judge[MAX_RATES_LENGTH]; -}; - - -struct setratable_parm { - u8 ss_ForceUp[NumRates]; - u8 ss_ULevel[NumRates]; - u8 ss_DLevel[NumRates]; - u8 count_judge[NumRates]; -}; - -struct getratable_parm { - uint rsvd; -}; -struct getratable_rsp { - u8 ss_ForceUp[NumRates]; - u8 ss_ULevel[NumRates]; - u8 ss_DLevel[NumRates]; - u8 count_judge[NumRates]; -}; - - -//to get TX,RX retry count -struct gettxretrycnt_parm{ - unsigned int rsvd; -}; -struct gettxretrycnt_rsp{ - unsigned long tx_retrycnt; -}; - -struct getrxretrycnt_parm{ - unsigned int rsvd; -}; -struct getrxretrycnt_rsp{ - unsigned long rx_retrycnt; -}; - -//to get BCNOK,BCNERR count -struct getbcnokcnt_parm{ - unsigned int rsvd; -}; -struct getbcnokcnt_rsp{ - unsigned long bcnokcnt; -}; - -struct getbcnerrcnt_parm{ - unsigned int rsvd; -}; -struct getbcnerrcnt_rsp{ - unsigned long bcnerrcnt; -}; - -// to get current TX power level -struct getcurtxpwrlevel_parm{ - unsigned int rsvd; -}; -struct getcurtxpwrlevel_rsp{ - unsigned short tx_power; -}; - -struct setprobereqextraie_parm { - unsigned char e_id; - unsigned char ie_len; - unsigned char ie[0]; -}; - -struct setassocreqextraie_parm { - unsigned char e_id; - unsigned char ie_len; - unsigned char ie[0]; -}; - -struct setproberspextraie_parm { - unsigned char e_id; - unsigned char ie_len; - unsigned char ie[0]; -}; - -struct setassocrspextraie_parm { - unsigned char e_id; - unsigned char ie_len; - unsigned char ie[0]; -}; - - -struct addBaReq_parm -{ - unsigned int tid; - u8 addr[ETH_ALEN]; -}; - -/*H2C Handler index: 46 */ -struct SetChannel_parm -{ - u32 curr_ch; -}; - -#ifdef MP_FIRMWARE_OFFLOAD -/*H2C Handler index: 47 */ -struct SetTxPower_parm -{ - u8 TxPower; -}; - -/*H2C Handler index: 48 */ -struct SwitchAntenna_parm -{ - u16 antenna_tx; - u16 antenna_rx; -// R_ANTENNA_SELECT_CCK cck_txrx; - u8 cck_txrx; -}; - -/*H2C Handler index: 49 */ -struct SetCrystalCap_parm -{ - u32 curr_crystalcap; -}; - -/*H2C Handler index: 50 */ -struct SetSingleCarrierTx_parm -{ - u8 bStart; -}; - -/*H2C Handler index: 51 */ -struct SetSingleToneTx_parm -{ - u8 bStart; - u8 curr_rfpath; -}; - -/*H2C Handler index: 52 */ -struct SetCarrierSuppressionTx_parm -{ - u8 bStart; - u32 curr_rateidx; -}; - -/*H2C Handler index: 53 */ -struct SetContinuousTx_parm -{ - u8 bStart; - u8 CCK_flag; /*1:CCK 2:OFDM*/ - u32 curr_rateidx; -}; - -/*H2C Handler index: 54 */ -struct SwitchBandwidth_parm -{ - u8 curr_bandwidth; -}; - -#endif /* MP_FIRMWARE_OFFLOAD */ - -/*H2C Handler index: 59 */ -struct SetChannelPlan_param -{ - u8 channel_plan; -}; - -#define GEN_CMD_CODE(cmd) cmd ## _CMD_ - - -/* - -Result: -0x00: success -0x01: sucess, and check Response. -0x02: cmd ignored due to duplicated sequcne number -0x03: cmd dropped due to invalid cmd code -0x04: reserved. - -*/ - -#define H2C_RSP_OFFSET 512 - -#define H2C_SUCCESS 0x00 -#define H2C_SUCCESS_RSP 0x01 -#define H2C_DUPLICATED 0x02 -#define H2C_DROPPED 0x03 -#define H2C_PARAMETERS_ERROR 0x04 -#define H2C_REJECTED 0x05 -#define H2C_CMD_OVERFLOW 0x06 -#define H2C_RESERVED 0x07 - -extern u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr); -extern u8 rtw_setstandby_cmd(_adapter *padapter, uint action); -extern u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *pssid); -extern u8 rtw_createbss_cmd(_adapter *padapter); -extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz); -extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch); -extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key); -extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork); -extern u8 rtw_disassoc_cmd(_adapter *padapter); -extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); -extern u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset); -extern u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset); -extern u8 rtw_setbbreg_cmd(_adapter * padapter, u8 offset, u8 val); -extern u8 rtw_setrfreg_cmd(_adapter * padapter, u8 offset, u32 val); -extern u8 rtw_getbbreg_cmd(_adapter * padapter, u8 offset, u8 * pval); -extern u8 rtw_getrfreg_cmd(_adapter * padapter, u8 offset, u8 * pval); -extern u8 rtw_setrfintfs_cmd(_adapter *padapter, u8 mode); -extern u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table); -extern u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval); - -extern u8 rtw_gettssi_cmd(_adapter *padapter, u8 offset,u8 *pval); -extern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type); -extern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type); - -extern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr); - -extern u8 rtw_dynamic_chk_wk_cmd(_adapter *adapter); - -u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue); - -#ifdef CONFIG_ANTENNA_DIVERSITY -extern u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue); -#endif - -extern u8 rtw_ps_cmd(_adapter*padapter); - - -#ifdef CONFIG_AP_MODE -u8 rtw_chk_hi_queue_cmd(_adapter*padapter); -#endif - -extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan); - -u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf); - -extern void rtw_survey_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); -extern void rtw_disassoc_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); -extern void rtw_joinbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); -extern void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); -extern void rtw_getbbrfreg_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); -extern void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd); - -extern void rtw_setstaKey_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); -extern void rtw_setassocsta_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); -extern void rtw_getrttbl_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); - - -struct _cmd_callback { - u32 cmd_code; - void (*callback)(_adapter *padapter, struct cmd_obj *cmd); -}; - -enum rtw_h2c_cmd -{ - GEN_CMD_CODE(_Read_MACREG) , /*0*/ - GEN_CMD_CODE(_Write_MACREG) , - GEN_CMD_CODE(_Read_BBREG) , - GEN_CMD_CODE(_Write_BBREG) , - GEN_CMD_CODE(_Read_RFREG) , - GEN_CMD_CODE(_Write_RFREG) , /*5*/ - GEN_CMD_CODE(_Read_EEPROM) , - GEN_CMD_CODE(_Write_EEPROM) , - GEN_CMD_CODE(_Read_EFUSE) , - GEN_CMD_CODE(_Write_EFUSE) , - - GEN_CMD_CODE(_Read_CAM) , /*10*/ - GEN_CMD_CODE(_Write_CAM) , - GEN_CMD_CODE(_setBCNITV), - GEN_CMD_CODE(_setMBIDCFG), - GEN_CMD_CODE(_JoinBss), /*14*/ - GEN_CMD_CODE(_DisConnect) , /*15*/ - GEN_CMD_CODE(_CreateBss) , - GEN_CMD_CODE(_SetOpMode) , - GEN_CMD_CODE(_SiteSurvey), /*18*/ - GEN_CMD_CODE(_SetAuth) , - - GEN_CMD_CODE(_SetKey) , /*20*/ - GEN_CMD_CODE(_SetStaKey) , - GEN_CMD_CODE(_SetAssocSta) , - GEN_CMD_CODE(_DelAssocSta) , - GEN_CMD_CODE(_SetStaPwrState) , - GEN_CMD_CODE(_SetBasicRate) , /*25*/ - GEN_CMD_CODE(_GetBasicRate) , - GEN_CMD_CODE(_SetDataRate) , - GEN_CMD_CODE(_GetDataRate) , - GEN_CMD_CODE(_SetPhyInfo) , - - GEN_CMD_CODE(_GetPhyInfo) , /*30*/ - GEN_CMD_CODE(_SetPhy) , - GEN_CMD_CODE(_GetPhy) , - GEN_CMD_CODE(_readRssi) , - GEN_CMD_CODE(_readGain) , - GEN_CMD_CODE(_SetAtim) , /*35*/ - GEN_CMD_CODE(_SetPwrMode) , - GEN_CMD_CODE(_JoinbssRpt), - GEN_CMD_CODE(_SetRaTable) , - GEN_CMD_CODE(_GetRaTable) , - - GEN_CMD_CODE(_GetCCXReport), /*40*/ - GEN_CMD_CODE(_GetDTMReport), - GEN_CMD_CODE(_GetTXRateStatistics), - GEN_CMD_CODE(_SetUsbSuspend), - GEN_CMD_CODE(_SetH2cLbk), - GEN_CMD_CODE(_AddBAReq) , /*45*/ - GEN_CMD_CODE(_SetChannel), /*46*/ - GEN_CMD_CODE(_SetTxPower), - GEN_CMD_CODE(_SwitchAntenna), - GEN_CMD_CODE(_SetCrystalCap), - GEN_CMD_CODE(_SetSingleCarrierTx), /*50*/ - - GEN_CMD_CODE(_SetSingleToneTx),/*51*/ - GEN_CMD_CODE(_SetCarrierSuppressionTx), - GEN_CMD_CODE(_SetContinuousTx), - GEN_CMD_CODE(_SwitchBandwidth), /*54*/ - GEN_CMD_CODE(_TX_Beacon), /*55*/ - - GEN_CMD_CODE(_Set_MLME_EVT), /*56*/ - GEN_CMD_CODE(_Set_Drv_Extra), /*57*/ - GEN_CMD_CODE(_Set_H2C_MSG), /*58*/ - - GEN_CMD_CODE(_SetChannelPlan), /*59*/ - - MAX_H2CCMD -}; - -#define _GetBBReg_CMD_ _Read_BBREG_CMD_ -#define _SetBBReg_CMD_ _Write_BBREG_CMD_ -#define _GetRFReg_CMD_ _Read_RFREG_CMD_ -#define _SetRFReg_CMD_ _Write_RFREG_CMD_ - -#ifdef _RTW_CMD_C_ -struct _cmd_callback rtw_cmd_callback[] = -{ - {GEN_CMD_CODE(_Read_MACREG), NULL}, /*0*/ - {GEN_CMD_CODE(_Write_MACREG), NULL}, - {GEN_CMD_CODE(_Read_BBREG), &rtw_getbbrfreg_cmdrsp_callback}, - {GEN_CMD_CODE(_Write_BBREG), NULL}, - {GEN_CMD_CODE(_Read_RFREG), &rtw_getbbrfreg_cmdrsp_callback}, - {GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/ - {GEN_CMD_CODE(_Read_EEPROM), NULL}, - {GEN_CMD_CODE(_Write_EEPROM), NULL}, - {GEN_CMD_CODE(_Read_EFUSE), NULL}, - {GEN_CMD_CODE(_Write_EFUSE), NULL}, - - {GEN_CMD_CODE(_Read_CAM), NULL}, /*10*/ - {GEN_CMD_CODE(_Write_CAM), NULL}, - {GEN_CMD_CODE(_setBCNITV), NULL}, - {GEN_CMD_CODE(_setMBIDCFG), NULL}, - {GEN_CMD_CODE(_JoinBss), &rtw_joinbss_cmd_callback}, /*14*/ - {GEN_CMD_CODE(_DisConnect), &rtw_disassoc_cmd_callback}, /*15*/ - {GEN_CMD_CODE(_CreateBss), &rtw_createbss_cmd_callback}, - {GEN_CMD_CODE(_SetOpMode), NULL}, - {GEN_CMD_CODE(_SiteSurvey), &rtw_survey_cmd_callback}, /*18*/ - {GEN_CMD_CODE(_SetAuth), NULL}, - - {GEN_CMD_CODE(_SetKey), NULL}, /*20*/ - {GEN_CMD_CODE(_SetStaKey), &rtw_setstaKey_cmdrsp_callback}, - {GEN_CMD_CODE(_SetAssocSta), &rtw_setassocsta_cmdrsp_callback}, - {GEN_CMD_CODE(_DelAssocSta), NULL}, - {GEN_CMD_CODE(_SetStaPwrState), NULL}, - {GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/ - {GEN_CMD_CODE(_GetBasicRate), NULL}, - {GEN_CMD_CODE(_SetDataRate), NULL}, - {GEN_CMD_CODE(_GetDataRate), NULL}, - {GEN_CMD_CODE(_SetPhyInfo), NULL}, - - {GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/ - {GEN_CMD_CODE(_SetPhy), NULL}, - {GEN_CMD_CODE(_GetPhy), NULL}, - {GEN_CMD_CODE(_readRssi), NULL}, - {GEN_CMD_CODE(_readGain), NULL}, - {GEN_CMD_CODE(_SetAtim), NULL}, /*35*/ - {GEN_CMD_CODE(_SetPwrMode), NULL}, - {GEN_CMD_CODE(_JoinbssRpt), NULL}, - {GEN_CMD_CODE(_SetRaTable), NULL}, - {GEN_CMD_CODE(_GetRaTable) , NULL}, - - {GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/ - {GEN_CMD_CODE(_GetDTMReport), NULL}, - {GEN_CMD_CODE(_GetTXRateStatistics), NULL}, - {GEN_CMD_CODE(_SetUsbSuspend), NULL}, - {GEN_CMD_CODE(_SetH2cLbk), NULL}, - {GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/ - {GEN_CMD_CODE(_SetChannel), NULL}, /*46*/ - {GEN_CMD_CODE(_SetTxPower), NULL}, - {GEN_CMD_CODE(_SwitchAntenna), NULL}, - {GEN_CMD_CODE(_SetCrystalCap), NULL}, - {GEN_CMD_CODE(_SetSingleCarrierTx), NULL}, /*50*/ - - {GEN_CMD_CODE(_SetSingleToneTx), NULL}, /*51*/ - {GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL}, - {GEN_CMD_CODE(_SetContinuousTx), NULL}, - {GEN_CMD_CODE(_SwitchBandwidth), NULL}, /*54*/ - {GEN_CMD_CODE(_TX_Beacon), NULL},/*55*/ - - {GEN_CMD_CODE(_Set_MLME_EVT), NULL},/*56*/ - {GEN_CMD_CODE(_Set_Drv_Extra), NULL},/*57*/ - {GEN_CMD_CODE(_Set_H2C_MSG), NULL},/*58*/ - {GEN_CMD_CODE(_SetChannelPlan), NULL},/*59*/ -}; -#endif - -#endif // _CMD_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_debug.h b/drivers/net/wireless/rtl8192c/include/rtw_debug.h deleted file mode 100755 index bd3541f240ec..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_debug.h +++ /dev/null @@ -1,374 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_DEBUG_H__ -#define __RTW_DEBUG_H__ - -#include -#include -#include - - -#define _drv_emerg_ 1 -#define _drv_alert_ 2 -#define _drv_crit_ 3 -#define _drv_err_ 4 -#define _drv_warning_ 5 -#define _drv_notice_ 6 -#define _drv_info_ 7 -#define _drv_dump_ 8 -#define _drv_debug_ 9 - - -#define _module_rtl871x_xmit_c_ BIT(0) -#define _module_xmit_osdep_c_ BIT(1) -#define _module_rtl871x_recv_c_ BIT(2) -#define _module_recv_osdep_c_ BIT(3) -#define _module_rtl871x_mlme_c_ BIT(4) -#define _module_mlme_osdep_c_ BIT(5) -#define _module_rtl871x_sta_mgt_c_ BIT(6) -#define _module_rtl871x_cmd_c_ BIT(7) -#define _module_cmd_osdep_c_ BIT(8) -#define _module_rtl871x_io_c_ BIT(9) -#define _module_io_osdep_c_ BIT(10) -#define _module_os_intfs_c_ BIT(11) -#define _module_rtl871x_security_c_ BIT(12) -#define _module_rtl871x_eeprom_c_ BIT(13) -#define _module_hal_init_c_ BIT(14) -#define _module_hci_hal_init_c_ BIT(15) -#define _module_rtl871x_ioctl_c_ BIT(16) -#define _module_rtl871x_ioctl_set_c_ BIT(17) -#define _module_rtl871x_ioctl_query_c_ BIT(18) -#define _module_rtl871x_pwrctrl_c_ BIT(19) -#define _module_hci_intfs_c_ BIT(20) -#define _module_hci_ops_c_ BIT(21) -#define _module_osdep_service_c_ BIT(22) -#define _module_mp_ BIT(23) -#define _module_hci_ops_os_c_ BIT(24) -#define _module_rtl871x_ioctl_os_c BIT(25) -#define _module_rtl8712_cmd_c_ BIT(26) -//#define _module_efuse_ BIT(27) -#define _module_rtl8192c_xmit_c_ BIT(28) -#define _module_efuse_ BIT(29) -#define _module_rtl8712_recv_c_ BIT(30) -#define _module_rtl8712_led_c_ BIT(31) - -#undef _MODULE_DEFINE_ - -#if defined _RTL871X_XMIT_C_ - #define _MODULE_DEFINE_ _module_rtl871x_xmit_c_ -#elif defined _XMIT_OSDEP_C_ - #define _MODULE_DEFINE_ _module_xmit_osdep_c_ -#elif defined _RTL871X_RECV_C_ - #define _MODULE_DEFINE_ _module_rtl871x_recv_c_ -#elif defined _RECV_OSDEP_C_ - #define _MODULE_DEFINE_ _module_recv_osdep_c_ -#elif defined _RTL871X_MLME_C_ - #define _MODULE_DEFINE_ _module_rtl871x_mlme_c_ -#elif defined _MLME_OSDEP_C_ - #define _MODULE_DEFINE_ _module_mlme_osdep_c_ -#elif defined _RTL871X_STA_MGT_C_ - #define _MODULE_DEFINE_ _module_rtl871x_sta_mgt_c_ -#elif defined _RTL871X_CMD_C_ - #define _MODULE_DEFINE_ _module_rtl871x_cmd_c_ -#elif defined _CMD_OSDEP_C_ - #define _MODULE_DEFINE_ _module_cmd_osdep_c_ -#elif defined _RTL871X_IO_C_ - #define _MODULE_DEFINE_ _module_rtl871x_io_c_ -#elif defined _IO_OSDEP_C_ - #define _MODULE_DEFINE_ _module_io_osdep_c_ -#elif defined _OS_INTFS_C_ - #define _MODULE_DEFINE_ _module_os_intfs_c_ -#elif defined _RTL871X_SECURITY_C_ - #define _MODULE_DEFINE_ _module_rtl871x_security_c_ -#elif defined _RTL871X_EEPROM_C_ - #define _MODULE_DEFINE_ _module_rtl871x_eeprom_c_ -#elif defined _HAL_INIT_C_ - #define _MODULE_DEFINE_ _module_hal_init_c_ -#elif defined _HCI_HAL_INIT_C_ - #define _MODULE_DEFINE_ _module_hci_hal_init_c_ -#elif defined _RTL871X_IOCTL_C_ - #define _MODULE_DEFINE_ _module_rtl871x_ioctl_c_ -#elif defined _RTL871X_IOCTL_SET_C_ - #define _MODULE_DEFINE_ _module_rtl871x_ioctl_set_c_ -#elif defined _RTL871X_IOCTL_QUERY_C_ - #define _MODULE_DEFINE_ _module_rtl871x_ioctl_query_c_ -#elif defined _RTL871X_PWRCTRL_C_ - #define _MODULE_DEFINE_ _module_rtl871x_pwrctrl_c_ -#elif defined _HCI_INTF_C_ - #define _MODULE_DEFINE_ _module_hci_intfs_c_ -#elif defined _HCI_OPS_C_ - #define _MODULE_DEFINE_ _module_hci_ops_c_ -#elif defined _OSDEP_HCI_INTF_C_ - #define _MODULE_DEFINE_ _module_hci_intfs_c_ -#elif defined _OSDEP_SERVICE_C_ - #define _MODULE_DEFINE_ _module_osdep_service_c_ -#elif defined _HCI_OPS_OS_C_ - #define _MODULE_DEFINE_ _module_hci_ops_os_c_ -#elif defined _RTL871X_IOCTL_LINUX_C_ - #define _MODULE_DEFINE_ _module_rtl871x_ioctl_os_c -#elif defined _RTL8712_CMD_C_ - #define _MODULE_DEFINE_ _module_rtl8712_cmd_c_ -#elif defined _RTL8192C_XMIT_C_ - #define _MODULE_DEFINE_ _module_rtl8192c_xmit_c_ -#elif defined _RTL8712_RECV_C_ - #define _MODULE_DEFINE_ _module_rtl8712_recv_c_ -#elif defined _RTL8192CU_RECV_C_ - #define _MODULE_DEFINE_ _module_rtl8712_recv_c_ -#elif defined _RTL871X_MLME_EXT_C_ - #define _MODULE_DEFINE_ _module_mlme_osdep_c_ -#elif defined _RTW_MP_C_ - #define _MODULE_DEFINE_ _module_mp_ -#elif defined _RTW_MP_IOCTL_C_ - #define _MODULE_DEFINE_ _module_mp_ -#elif defined _RTW_EFUSE_C_ - #define _MODULE_DEFINE_ _module_efuse_ -#endif - -#ifdef PLATFORM_OS_CE -extern void rtl871x_cedbg(const char *fmt, ...); -#endif - -#define RT_TRACE(_Comp, _Level, Fmt) do{}while(0) -#define _func_enter_ {} -#define _func_exit_ {} -#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) {} - -#undef _dbgdump - -#ifdef CONFIG_DEBUG_RTL871X - -#ifndef _RTL871X_DEBUG_C_ - extern u32 GlobalDebugLevel; - extern u64 GlobalDebugComponents; -#endif - -#ifdef PLATFORM_WINDOWS - - #ifdef PLATFORM_OS_XP - - #define _dbgdump DbgPrint - - #elif defined PLATFORM_OS_CE - - #define _dbgdump rtl871x_cedbg - - #endif - - #elif defined PLATFORM_LINUX - - #define _dbgdump printk - -#endif - -#endif /* CONFIG_DEBUG_RTL871X */ - - -#if defined (_dbgdump) && defined (_MODULE_DEFINE_) - - #undef RT_TRACE - #define RT_TRACE(_Comp, _Level, Fmt)\ - do {\ - if((_Comp & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) {\ - _dbgdump("%s [0x%08x,%d]", RTL871X_MODULE_NAME, (unsigned int)_Comp, _Level);\ - _dbgdump Fmt; \ - }\ - }while(0) - -#endif - - -#if defined (_dbgdump) - - #undef _func_enter_ - #define _func_enter_ \ - do { \ - if (GlobalDebugLevel >= _drv_debug_) \ - { \ - _dbgdump("\n %s : %s enters at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__);\ - } \ - } while(0) - - #undef _func_exit_ - #define _func_exit_ \ - do { \ - if (GlobalDebugLevel >= _drv_debug_) \ - { \ - _dbgdump("\n %s : %s exits at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__); \ - } \ - } while(0) - - #undef RT_PRINT_DATA - #define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) \ - if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \ - { \ - int __i; \ - u8 *ptr = (u8 *)_HexData; \ - _dbgdump("Rtl871x: "); \ - _dbgdump(_TitleString); \ - for( __i=0; __i<(int)_HexDataLen; __i++ ) \ - { \ - _dbgdump("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" "); \ - if (((__i + 1) % 16) == 0) _dbgdump("\n"); \ - } \ - _dbgdump("\n"); \ - } -#endif - - -#ifdef CONFIG_DEBUG_RTL819X - #ifdef PLATFORM_WINDOWS - - #ifdef PLATFORM_OS_XP - #define _dbgdump DbgPrint - - #elif defined PLATFORM_OS_CE - #define _dbgdump rtl871x_cedbg - - #endif - - #elif defined PLATFORM_LINUX - #define _dbgdump printk - #endif -#endif - -#ifdef PLATFORM_WINDOWS - #define DBG_871X {} - #define MSG_8192C {} - #define DBG_8192C {} - #define WRN_8192C {} - #define ERR_8192C {} -#endif - -#ifdef PLATFORM_LINUX - #define DBG_871X(x, ...) {} - #define MSG_8192C(x, ...) {} - #define DBG_8192C(x,...) {} - #define WRN_8192C(x,...) {} - #define ERR_8192C(x,...) {} -#endif - -#if defined (_dbgdump) - #undef DBG_871X - #define DBG_871X _dbgdump - - #undef MSG_8192C - #define MSG_8192C _dbgdump - - #undef DBG_8192C - #define DBG_8192C _dbgdump - - #undef WRN_8192C - #define WRN_8192C _dbgdump - - #undef ERR_8192C - #define ERR_8192C _dbgdump -#endif - - - -#ifdef CONFIG_PROC_DEBUG - - int proc_get_drv_version(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_write_reg(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_set_write_reg(struct file *file, const char *buffer, - unsigned long count, void *data); - - int proc_get_read_reg(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_set_read_reg(struct file *file, const char *buffer, - unsigned long count, void *data); - - - int proc_get_fwstate(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_sec_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_mlmext_state(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_qos_option(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_ht_option(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_rf_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_ap_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_adapter_state(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_get_trx_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - -#ifdef CONFIG_AP_MODE - - int proc_get_all_sta_info(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - -#endif - -#ifdef MEMORY_LEAK_DEBUG - int proc_get_malloc_cnt(char *page, char **start, - off_t offset, int count, - int *eof, void *data); -#endif - -#ifdef CONFIG_FIND_BEST_CHANNEL - int proc_get_best_channel(char *page, char **start, - off_t offset, int count, - int *eof, void *data); -#endif - - int proc_get_rx_signal(char *page, char **start, - off_t offset, int count, - int *eof, void *data); - - int proc_set_rx_signal(struct file *file, const char *buffer, - unsigned long count, void *data); - -#endif //CONFIG_PROC_DEBUG - -#endif //__RTW_DEBUG_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h b/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h deleted file mode 100755 index 14450d2722f8..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h +++ /dev/null @@ -1,145 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_EEPROM_H__ -#define __RTW_EEPROM_H__ - -#include -#include -#include - -#define RTL8712_EEPROM_ID 0x8712 -#define EEPROM_MAX_SIZE 256 -#define CLOCK_RATE 50 //100us - -//- EEPROM opcodes -#define EEPROM_READ_OPCODE 06 -#define EEPROM_WRITE_OPCODE 05 -#define EEPROM_ERASE_OPCODE 07 -#define EEPROM_EWEN_OPCODE 19 // Erase/write enable -#define EEPROM_EWDS_OPCODE 16 // Erase/write disable - -//Country codes -#define USA 0x555320 -#define EUROPE 0x1 //temp, should be provided later -#define JAPAN 0x2 //temp, should be provided later - -#ifdef CONFIG_SDIO_HCI -#define eeprom_cis0_sz 17 -#define eeprom_cis1_sz 50 -#endif - -#define EEPROM_CID_DEFAULT 0x0 -#define EEPROM_CID_ALPHA 0x1 -#define EEPROM_CID_Senao 0x3 -#define EEPROM_CID_NetCore 0x5 -#define EEPROM_CID_CAMEO 0X8 -#define EEPROM_CID_SITECOM 0x9 -#define EEPROM_CID_COREGA 0xB -#define EEPROM_CID_EDIMAX_BELKIN 0xC -#define EEPROM_CID_SERCOMM_BELKIN 0xE -#define EEPROM_CID_CAMEO1 0xF -#define EEPROM_CID_WNC_COREGA 0x12 -#define EEPROM_CID_CLEVO 0x13 -#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 - -// -// Customer ID, note that: -// This variable is initiailzed through EEPROM or registry, -// however, its definition may be different with that in EEPROM for -// EEPROM size consideration. So, we have to perform proper translation between them. -// Besides, CustomerID of registry has precedence of that of EEPROM. -// defined below. 060703, by rcnjko. -// -typedef enum _RT_CUSTOMER_ID -{ - RT_CID_DEFAULT = 0, - RT_CID_8187_ALPHA0 = 1, - RT_CID_8187_SERCOMM_PS = 2, - RT_CID_8187_HW_LED = 3, - RT_CID_8187_NETGEAR = 4, - RT_CID_WHQL = 5, - RT_CID_819x_CAMEO = 6, - RT_CID_819x_RUNTOP = 7, - RT_CID_819x_Senao = 8, - RT_CID_TOSHIBA = 9, // Merge by Jacken, 2008/01/31. - RT_CID_819x_Netcore = 10, - RT_CID_Nettronix = 11, - RT_CID_DLINK = 12, - RT_CID_PRONET = 13, - RT_CID_COREGA = 14, - RT_CID_CHINA_MOBILE = 15, - RT_CID_819x_ALPHA = 16, - RT_CID_819x_Sitecom = 17, - RT_CID_CCX = 18, // It's set under CCX logo test and isn't demanded for CCX functions, but for test behavior like retry limit and tx report. By Bruce, 2009-02-17. - RT_CID_819x_Lenovo = 19, - RT_CID_819x_QMI = 20, - RT_CID_819x_Edimax_Belkin = 21, - RT_CID_819x_Sercomm_Belkin = 22, - RT_CID_819x_CAMEO1 = 23, - RT_CID_819x_MSI = 24, - RT_CID_819x_Acer = 25, - RT_CID_819x_AzWave_ASUS = 26, - RT_CID_819x_AzWave = 27, // For AzWave in PCIe, The ID is AzWave use and not only Asus - RT_CID_819x_HP = 28, - RT_CID_819x_WNC_COREGA = 29, - RT_CID_819x_Arcadyan_Belkin = 30, - RT_CID_819x_SAMSUNG = 31, - RT_CID_819x_CLEVO = 32, - RT_CID_819x_DELL = 33, - RT_CID_819x_PRONETS = 34, - RT_CID_819x_Edimax_ASUS = 35, - RT_CID_819x_CAMEO_NETGEAR = 36, -}RT_CUSTOMER_ID, *PRT_CUSTOMER_ID; - -struct eeprom_priv -{ - u8 bautoload_fail_flag; - //u8 bempty; - //u8 sys_config; - u8 mac_addr[6]; //PermanentAddress - //u8 config0; - u16 channel_plan; - //u8 country_string[3]; - //u8 tx_power_b[15]; - //u8 tx_power_g[15]; - //u8 tx_power_a[201]; - - u8 EepromOrEfuse; - - u8 efuse_eeprom_data[EEPROM_MAX_SIZE]; - -#ifdef CONFIG_SDIO_HCI - u8 sdio_setting; - u32 ocr; - u8 cis0[eeprom_cis0_sz]; - u8 cis1[eeprom_cis1_sz]; -#endif -}; - - -extern void eeprom_write16(_adapter *padapter, u16 reg, u16 data); -extern u16 eeprom_read16(_adapter *padapter, u16 reg); -extern void read_eeprom_content(_adapter *padapter); -extern void eeprom_read_sz(_adapter * padapter, u16 reg,u8* data, u32 sz); - -extern void read_eeprom_content_by_attrib(_adapter * padapter ); - -#endif //__RTL871X_EEPROM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_efuse.h b/drivers/net/wireless/rtl8192c/include/rtw_efuse.h deleted file mode 100755 index 66be910ebc9c..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_efuse.h +++ /dev/null @@ -1,123 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_EFUSE_H__ -#define __RTW_EFUSE_H__ - -#include -#include - -#define EFUSE_ERROE_HANDLE 1 - -#define PG_STATE_HEADER 0x01 -#define PG_STATE_WORD_0 0x02 -#define PG_STATE_WORD_1 0x04 -#define PG_STATE_WORD_2 0x08 -#define PG_STATE_WORD_3 0x10 -#define PG_STATE_DATA 0x20 - -#define PG_SWBYTE_H 0x01 -#define PG_SWBYTE_L 0x02 - -#define PGPKT_DATA_SIZE 8 - -#define EFUSE_WIFI 0 -#define EFUSE_BT 1 - -enum _EFUSE_DEF_TYPE { - TYPE_EFUSE_MAX_SECTION = 0, - TYPE_EFUSE_REAL_CONTENT_LEN = 1, - TYPE_AVAILABLE_EFUSE_BYTES_BANK = 2, - TYPE_AVAILABLE_EFUSE_BYTES_TOTAL = 3, - TYPE_EFUSE_MAP_LEN = 4, - TYPE_EFUSE_PROTECT_BYTES_BANK = 5, -}; - -#define EFUSE_MAX_MAP_LEN 256 -#define EFUSE_MAX_HW_SIZE 512 -#define EFUSE_MAX_SECTION_BASE 16 - -#define EXT_HEADER(header) ((header & 0x1F ) == 0x0F) -#define ALL_WORDS_DISABLED(wde) ((wde & 0x0F) == 0x0F) -#define GET_HDR_OFFSET_2_0(header) ( (header & 0xE0) >> 5) - -#define EFUSE_REPEAT_THRESHOLD_ 3 - -//============================================= -// The following is for BT Efuse definition -//============================================= -#define EFUSE_BT_MAX_MAP_LEN 1024 -#define EFUSE_MAX_BANK 4 -#define EFUSE_MAX_BT_BANK (EFUSE_MAX_BANK-1) -//============================================= -/*--------------------------Define Parameters-------------------------------*/ -#define EFUSE_MAX_WORD_UNIT 4 - -/*------------------------------Define structure----------------------------*/ -typedef struct PG_PKT_STRUCT_A{ - u8 offset; - u8 word_en; - u8 data[8]; - u8 word_cnts; -}PGPKT_STRUCT,*PPGPKT_STRUCT; -/*------------------------------Define structure----------------------------*/ - - -/*------------------------Export global variable----------------------------*/ -extern u8 fakeEfuseBank; -extern u32 fakeEfuseUsedBytes; -extern u8 fakeEfuseContent[]; -extern u8 fakeEfuseInitMap[]; -extern u8 fakeEfuseModifiedMap[]; - -extern u32 BTEfuseUsedBytes; -extern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; -extern u8 BTEfuseInitMap[]; -extern u8 BTEfuseModifiedMap[]; - -extern u32 fakeBTEfuseUsedBytes; -extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; -extern u8 fakeBTEfuseInitMap[]; -extern u8 fakeBTEfuseModifiedMap[]; -/*------------------------Export global variable----------------------------*/ - -u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size); -u16 efuse_GetMaxSize(PADAPTER padapter); -u8 rtw_efuse_access(PADAPTER padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data); -u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); -u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); - -u16 Efuse_GetCurrentSize(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); -u8 Efuse_CalculateWordCnts(u8 word_en); -void ReadEFuseByte(PADAPTER Adapter, u16 _offset, u8 *pbuf, BOOLEAN bPseudoTest) ; -void EFUSE_GetEfuseDefinition(PADAPTER pAdapter, u8 efuseType, u8 type, PVOID *pOut, BOOLEAN bPseudoTest); -u8 efuse_OneByteRead(PADAPTER pAdapter, u16 addr, u8 *data, BOOLEAN bPseudoTest); -u8 efuse_OneByteWrite(PADAPTER pAdapter, u16 addr, u8 data, BOOLEAN bPseudoTest); - -void Efuse_PowerSwitch(PADAPTER pAdapter,u8 bWrite,u8 PwrState); -int Efuse_PgPacketRead(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest); -int Efuse_PgPacketWrite(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest); -void efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata); -u8 Efuse_WordEnableDataWrite(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest); - -u8 EFUSE_Read1Byte(PADAPTER pAdapter, u16 Address); -void EFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); -void EFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value); - -#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtw_event.h b/drivers/net/wireless/rtl8192c/include/rtw_event.h deleted file mode 100755 index dd9f097815ee..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_event.h +++ /dev/null @@ -1,154 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_EVENT_H_ -#define _RTW_EVENT_H_ -#include -#include - -#ifndef CONFIG_RTL8711FW -#ifdef PLATFORM_LINUX -#include -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) -#include -#else -#include -#endif -#include -#endif -#else -#include -#endif//CONFIG_RTL8711FW - - - -#ifdef CONFIG_H2CLBK -#include -#endif - -/* -Used to report a bss has been scanned - -*/ -struct survey_event { - WLAN_BSSID_EX bss; -}; - -/* -Used to report that the requested site survey has been done. - -bss_cnt indicates the number of bss that has been reported. - - -*/ -struct surveydone_event { - unsigned int bss_cnt; - -}; - -/* -Used to report the link result of joinning the given bss - - -join_res: --1: authentication fail --2: association fail -> 0: TID - -*/ -struct joinbss_event { - struct wlan_network network; -}; - -/* -Used to report a given STA has joinned the created BSS. -It is used in AP/Ad-HoC(M) mode. - - -*/ -struct stassoc_event { - unsigned char macaddr[6]; - unsigned char rsvd[2]; - int cam_id; - -}; - -struct stadel_event { - unsigned char macaddr[6]; - unsigned char rsvd[2]; -}; - -struct addba_event -{ - unsigned int tid; -}; - - -#ifdef CONFIG_H2CLBK -struct c2hlbk_event{ - unsigned char mac[6]; - unsigned short s0; - unsigned short s1; - unsigned int w0; - unsigned char b0; - unsigned short s2; - unsigned char b1; - unsigned int w1; -}; -#endif//CONFIG_H2CLBK - -#define GEN_EVT_CODE(event) event ## _EVT_ - - - -struct fwevent { - u32 parmsize; - void (*event_callback)(_adapter *dev, u8 *pbuf); -}; - - -#define C2HEVENT_SZ 32 - -struct event_node{ - unsigned char *node; - unsigned char evt_code; - unsigned short evt_sz; - volatile int *caller_ff_tail; - int caller_ff_sz; -}; - -struct c2hevent_queue { - volatile int head; - volatile int tail; - struct event_node nodes[C2HEVENT_SZ]; - unsigned char seq; -}; - -#define NETWORK_QUEUE_SZ 4 - -struct network_queue { - volatile int head; - volatile int tail; - WLAN_BSSID_EX networks[NETWORK_QUEUE_SZ]; -}; - - -#endif // _WLANEVENT_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ht.h b/drivers/net/wireless/rtl8192c/include/rtw_ht.h deleted file mode 100755 index 239c42245440..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_ht.h +++ /dev/null @@ -1,51 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_HT_H_ -#define _RTW_HT_H_ - -#include -#include -#include "wifi.h" - -struct ht_priv -{ - u32 ht_option; - u32 ampdu_enable;//for enable Tx A-MPDU - //u8 baddbareq_issued[16]; - u32 tx_amsdu_enable;//for enable Tx A-MSDU - u32 tx_amdsu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx - u32 rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback. - - u8 bwmode;// - u8 ch_offset;//PRIME_CHNL_OFFSET - u8 sgi;//short GI - - //for processing Tx A-MPDU - u8 agg_enable_bitmap; - //u8 ADDBA_retry_count; - u8 candidate_tid_bitmap; - - struct ieee80211_ht_cap ht_cap; - -}; - -#endif //_RTL871X_HT_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_io.h b/drivers/net/wireless/rtl8192c/include/rtw_io.h deleted file mode 100755 index 15065c6cbf90..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_io.h +++ /dev/null @@ -1,535 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_IO_H_ -#define _RTW_IO_H_ - -#include -#include -#include - -#ifdef PLATFORM_LINUX -#include -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) -#include -#else -#include -#endif -#include -#include -#include -#include - -#ifdef CONFIG_USB_HCI -#include -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) -#include -#else -#include -#endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) -#define rtw_usb_buffer_alloc(dev, size, mem_flags, dma) usb_alloc_coherent((dev), (size), (mem_flags), (dma)) -#define rtw_usb_buffer_free(dev, size, addr, dma) usb_free_coherent((dev), (size), (addr), (dma)) -#else -#define rtw_usb_buffer_alloc(dev, size, mem_flags, dma) usb_buffer_alloc((dev), (size), (mem_flags), (dma)) -#define rtw_usb_buffer_free(dev, size, addr, dma) usb_buffer_free((dev), (size), (addr), (dma)) -#endif - - -#endif //CONFIG_USB_HCI - -#endif //PLATFORM_LINUX - - -#define NUM_IOREQ 8 - -#ifdef PLATFORM_WINDOWS -#define MAX_PROT_SZ 64 -#endif -#ifdef PLATFORM_LINUX -#define MAX_PROT_SZ (64-16) -#endif - -#define _IOREADY 0 -#define _IO_WAIT_COMPLETE 1 -#define _IO_WAIT_RSP 2 - -// IO COMMAND TYPE -#define _IOSZ_MASK_ (0x7F) -#define _IO_WRITE_ BIT(7) -#define _IO_FIXED_ BIT(8) -#define _IO_BURST_ BIT(9) -#define _IO_BYTE_ BIT(10) -#define _IO_HW_ BIT(11) -#define _IO_WORD_ BIT(12) -#define _IO_SYNC_ BIT(13) -#define _IO_CMDMASK_ (0x1F80) - - -/* - For prompt mode accessing, caller shall free io_req - Otherwise, io_handler will free io_req -*/ - - - -// IO STATUS TYPE -#define _IO_ERR_ BIT(2) -#define _IO_SUCCESS_ BIT(1) -#define _IO_DONE_ BIT(0) - - -#define IO_RD32 (_IO_SYNC_ | _IO_WORD_) -#define IO_RD16 (_IO_SYNC_ | _IO_HW_) -#define IO_RD8 (_IO_SYNC_ | _IO_BYTE_) - -#define IO_RD32_ASYNC (_IO_WORD_) -#define IO_RD16_ASYNC (_IO_HW_) -#define IO_RD8_ASYNC (_IO_BYTE_) - -#define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_) -#define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_) -#define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_) - -#define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_) -#define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_) -#define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_) - -/* - - Only Sync. burst accessing is provided. - -*/ - -#define IO_WR_BURST(x) (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_)) -#define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_)) - - - -//below is for the intf_option bit defition... - -#define _INTF_ASYNC_ BIT(0) //support async io - -struct intf_priv; -struct intf_hdl; -struct io_queue; - -struct _io_ops { - - - uint (*_sdbus_read_bytes_to_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - uint (*_sdbus_read_blocks_to_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - - void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); - - u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); - - u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); - - - uint (*_sdbus_write_blocks_from_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); - - uint (*_sdbus_write_bytes_from_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - u8 (*_cmd52r)(struct intf_priv *pintfpriv, u32 addr); - void (*_cmd52w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); - u8 (*_cmdfunc152r)(struct intf_priv *pintfpriv, u32 addr); - void (*_cmdfunc152w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); - - - void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - void (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); - - void (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); - - void (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); - - void (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata); - - void (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); - - void (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); - - void (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); - - - void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - void (*_sync_irp_protocol_rw)(struct io_queue *pio_q); - - - u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); - - u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); - - u32 (*_write_scsi)(struct intf_hdl *pintfhdl,u32 cnt, u8 *pmem); - - - void (*_read_port_cancel)(struct intf_hdl *pintfhdl); - - void (*_write_port_cancel)(struct intf_hdl *pintfhdl); - - - - u8 (*_async_read8)(struct intf_hdl *pintfhdl, u32 addr); - - u16 (*_async_read16)(struct intf_hdl *pintfhdl, u32 addr); - - u32 (*_async_read32)(struct intf_hdl *pintfhdl, u32 addr); - - void (*_async_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); - - void (*_async_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); - - void (*_async_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); - - - - -}; - -struct io_req { - _list list; - u32 addr; - volatile u32 val; - u32 command; - u32 status; - u8 *pbuf; - _sema sema; - -#ifdef PLATFORM_OS_CE -#ifdef CONFIG_USB_HCI - // URB handler for rtw_write_mem - USB_TRANSFER usb_transfer_write_mem; -#endif -#endif - - void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt); - u8 *cnxt; - -#ifdef PLATFORM_OS_XP - PMDL pmdl; - PIRP pirp; - -#ifdef CONFIG_SDIO_HCI - PSDBUS_REQUEST_PACKET sdrp; -#endif - -#endif - - -}; - -struct intf_hdl { - -/* - u32 intf_option; - u32 bus_status; - u32 do_flush; - u8 *adapter; - u8 *intf_dev; - struct intf_priv *pintfpriv; - u8 cnt; - void (*intf_hdl_init)(u8 *priv); - void (*intf_hdl_unload)(u8 *priv); - void (*intf_hdl_open)(u8 *priv); - void (*intf_hdl_close)(u8 *priv); - struct _io_ops io_ops; - //u8 intf_status;//moved to struct intf_priv - u16 len; - u16 done_len; -*/ - _adapter *padapter; - struct dvobj_priv *pintf_dev;// pointer to &(padapter->dvobjpriv); - - struct _io_ops io_ops; - -}; - -struct reg_protocol_rd { - -#ifdef CONFIG_LITTLE_ENDIAN - - //DW1 - u32 NumOfTrans:4; - u32 Reserved1:4; - u32 Reserved2:24; - //DW2 - u32 ByteCount:7; - u32 WriteEnable:1; //0:read, 1:write - u32 FixOrContinuous:1; //0:continuous, 1: Fix - u32 BurstMode:1; - u32 Byte1Access:1; - u32 Byte2Access:1; - u32 Byte4Access:1; - u32 Reserved3:3; - u32 Reserved4:16; - //DW3 - u32 BusAddress; - //DW4 - //u32 Value; -#else - - -//DW1 - u32 Reserved1 :4; - u32 NumOfTrans :4; - - u32 Reserved2 :24; - - //DW2 - u32 WriteEnable : 1; - u32 ByteCount :7; - - - u32 Reserved3 : 3; - u32 Byte4Access : 1; - - u32 Byte2Access : 1; - u32 Byte1Access : 1; - u32 BurstMode :1 ; - u32 FixOrContinuous : 1; - - u32 Reserved4 : 16; - - //DW3 - u32 BusAddress; - - //DW4 - //u32 Value; - -#endif - -}; - - -struct reg_protocol_wt { - - -#ifdef CONFIG_LITTLE_ENDIAN - - //DW1 - u32 NumOfTrans:4; - u32 Reserved1:4; - u32 Reserved2:24; - //DW2 - u32 ByteCount:7; - u32 WriteEnable:1; //0:read, 1:write - u32 FixOrContinuous:1; //0:continuous, 1: Fix - u32 BurstMode:1; - u32 Byte1Access:1; - u32 Byte2Access:1; - u32 Byte4Access:1; - u32 Reserved3:3; - u32 Reserved4:16; - //DW3 - u32 BusAddress; - //DW4 - u32 Value; - -#else - //DW1 - u32 Reserved1 :4; - u32 NumOfTrans :4; - - u32 Reserved2 :24; - - //DW2 - u32 WriteEnable : 1; - u32 ByteCount :7; - - u32 Reserved3 : 3; - u32 Byte4Access : 1; - - u32 Byte2Access : 1; - u32 Byte1Access : 1; - u32 BurstMode :1 ; - u32 FixOrContinuous : 1; - - u32 Reserved4 : 16; - - //DW3 - u32 BusAddress; - - //DW4 - u32 Value; - -#endif - -}; - - - -/* -Below is the data structure used by _io_handler - -*/ - -struct io_queue { - _lock lock; - _list free_ioreqs; - _list pending; //The io_req list that will be served in the single protocol read/write. - _list processing; - u8 *free_ioreqs_buf; // 4-byte aligned - u8 *pallocated_free_ioreqs_buf; - struct intf_hdl intf; -}; - -struct io_priv{ - - _adapter *padapter; - - struct intf_hdl intf; - -}; - -extern uint ioreq_flush(_adapter *adapter, struct io_queue *ioqueue); -extern void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue); -extern uint sync_ioreq_flush(_adapter *adapter, struct io_queue *ioqueue); - - -extern uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue); -extern struct io_req *alloc_ioreq(struct io_queue *pio_q); - -extern uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl); -extern void unregister_intf_hdl(struct intf_hdl *pintfhdl); - -extern void rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); -extern void rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); - -extern u8 rtw_read8(_adapter *adapter, u32 addr); -extern u16 rtw_read16(_adapter *adapter, u32 addr); -extern u32 rtw_read32(_adapter *adapter, u32 addr); -extern void rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); -extern void rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); - -#ifdef DBG_IO -#define DBG_IO_WRITE_SNIFF_ADDR_START 0x80 //0x4c //0x4c // the starting address to sniff -#define DBG_IO_WRITE_SNIFF_ADDR_END 0x80 //0x4c+ 1 // the ending address to sniff -extern void _rtw_write8(_adapter *adapter, u32 addr, u8 val); -extern void _rtw_write16(_adapter *adapter, u32 addr, u16 val); -extern void _rtw_write32(_adapter *adapter, u32 addr, u32 val); -#define rtw_write8(adapter, addr, val) \ - do { \ - if((u32)(addr) + 1 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ - DBG_871X("DBG_IO %s:%d rtw_write8(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u8)(val)); \ - } \ - _rtw_write8((adapter), (addr), (val)); \ - } while(0) -#define rtw_write16(adapter, addr, val) \ - do { \ - if((u32)(addr) + 2 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ - DBG_871X("DBG_IO %s:%d rtw_write16(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u16)(val)); \ - } \ - _rtw_write16((adapter), (addr), (val)); \ - } while(0) -#define rtw_write32(adapter, addr, val) \ - do { \ - if((u32)(addr) + 4 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ - DBG_871X("DBG_IO %s:%d rtw_write32(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u32)(val)); \ - } \ - _rtw_write32((adapter), (addr), (val)); \ - } while(0) -#else //DBG_IO -extern void _rtw_write8(_adapter *adapter, u32 addr, u8 val); -extern void _rtw_write16(_adapter *adapter, u32 addr, u16 val); -extern void _rtw_write32(_adapter *adapter, u32 addr, u32 val); -#define rtw_write8(adapter, addr, val) _rtw_write8((adapter), (addr), (val)) -#define rtw_write16(adapter, addr, val) _rtw_write16((adapter), (addr), (val)) -#define rtw_write32(adapter, addr, val) _rtw_write32((adapter), (addr), (val)) -#endif //DBG_IO - -extern void rtw_writeN(_adapter *adapter, u32 addr, u32 length, u8 *pdata); - -extern void rtw_write8_async(_adapter *adapter, u32 addr, u8 val); -extern void rtw_write16_async(_adapter *adapter, u32 addr, u16 val); -extern void rtw_write32_async(_adapter *adapter, u32 addr, u32 val); - -extern void rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); -extern void rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); -extern void rtw_write_scsi(_adapter *adapter, u32 cnt, u8 *pmem); - -void write_port_cancel(_adapter *adapter); -void read_port_cancel(_adapter *adapter); - -//ioreq -extern void ioreq_read8(_adapter *adapter, u32 addr, u8 *pval); -extern void ioreq_read16(_adapter *adapter, u32 addr, u16 *pval); -extern void ioreq_read32(_adapter *adapter, u32 addr, u32 *pval); -extern void ioreq_write8(_adapter *adapter, u32 addr, u8 val); -extern void ioreq_write16(_adapter *adapter, u32 addr, u16 val); -extern void ioreq_write32(_adapter *adapter, u32 addr, u32 val); - - -extern uint async_read8(_adapter *adapter, u32 addr, u8 *pbuff, - void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); -extern uint async_read16(_adapter *adapter, u32 addr, u8 *pbuff, - void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); -extern uint async_read32(_adapter *adapter, u32 addr, u8 *pbuff, - void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); - -extern void async_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); -extern void async_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); - -extern void async_write8(_adapter *adapter, u32 addr, u8 val, - void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); -extern void async_write16(_adapter *adapter, u32 addr, u16 val, - void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); -extern void async_write32(_adapter *adapter, u32 addr, u32 val, - void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); - -extern void async_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); -extern void async_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); - - -int init_io_priv(_adapter *padapter); -extern uint alloc_io_queue(_adapter *adapter); -extern void free_io_queue(_adapter *adapter); -extern void async_bus_io(struct io_queue *pio_q); -extern void bus_sync_io(struct io_queue *pio_q); -extern u32 _ioreq2rwmem(struct io_queue *pio_q); -extern void dev_power_down(_adapter * Adapter, u8 bpwrup); - - - -#define RTL_R8(reg) rtw_read8(padapter, reg) -#define RTL_R16(reg) rtw_read16(padapter, reg) -#define RTL_R32(reg) rtw_read32(padapter, reg) -#define RTL_W8(reg, val8) rtw_write8(padapter, reg, val8) -#define RTL_W16(reg, val16) rtw_write16(padapter, reg, val16) -#define RTL_W32(reg, val32) rtw_write32(padapter, reg, val32) - -/* -#define RTL_W8_ASYNC(reg, val8) rtw_write32_async(padapter, reg, val8) -#define RTL_W16_ASYNC(reg, val16) rtw_write32_async(padapter, reg, val16) -#define RTL_W32_ASYNC(reg, val32) rtw_write32_async(padapter, reg, val32) - -#define RTL_WRITE_BB(reg, val32) phy_SetUsbBBReg(padapter, reg, val32) -#define RTL_READ_BB(reg) phy_QueryUsbBBReg(padapter, reg) -*/ - -#endif //_RTL8711_IO_H_ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h deleted file mode 100755 index 012e4bcd5bbd..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h +++ /dev/null @@ -1,271 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_IOCTL_H_ -#define _RTW_IOCTL_H_ - -#include -#include -#include - -#ifndef OID_802_11_CAPABILITY - #define OID_802_11_CAPABILITY 0x0d010122 -#endif - -#ifndef OID_802_11_PMKID - #define OID_802_11_PMKID 0x0d010123 -#endif - - -// For DDK-defined OIDs -#define OID_NDIS_SEG1 0x00010100 -#define OID_NDIS_SEG2 0x00010200 -#define OID_NDIS_SEG3 0x00020100 -#define OID_NDIS_SEG4 0x01010100 -#define OID_NDIS_SEG5 0x01020100 -#define OID_NDIS_SEG6 0x01020200 -#define OID_NDIS_SEG7 0xFD010100 -#define OID_NDIS_SEG8 0x0D010100 -#define OID_NDIS_SEG9 0x0D010200 -#define OID_NDIS_SEG10 0x0D020200 - -#define SZ_OID_NDIS_SEG1 23 -#define SZ_OID_NDIS_SEG2 3 -#define SZ_OID_NDIS_SEG3 6 -#define SZ_OID_NDIS_SEG4 6 -#define SZ_OID_NDIS_SEG5 4 -#define SZ_OID_NDIS_SEG6 8 -#define SZ_OID_NDIS_SEG7 7 -#define SZ_OID_NDIS_SEG8 36 -#define SZ_OID_NDIS_SEG9 24 -#define SZ_OID_NDIS_SEG10 19 - -// For Realtek-defined OIDs -#define OID_MP_SEG1 0xFF871100 -#define OID_MP_SEG2 0xFF818000 - -#define OID_MP_SEG3 0xFF818700 -#define OID_MP_SEG4 0xFF011100 - -#define DEBUG_OID(dbg, str) \ - if((!dbg)) \ - { \ - RT_TRACE(_module_rtl871x_ioctl_c_,_drv_info_,("%s(%d): %s", __FUNCTION__, __LINE__, str)); \ - } - - -enum oid_type -{ - QUERY_OID, - SET_OID -}; - -struct oid_funs_node { - unsigned int oid_start; //the starting number for OID - unsigned int oid_end; //the ending number for OID - struct oid_obj_priv *node_array; - unsigned int array_sz; //the size of node_array - int query_counter; //count the number of query hits for this segment - int set_counter; //count the number of set hits for this segment -}; - -struct oid_par_priv -{ - void *adapter_context; - NDIS_OID oid; - void* information_buf; - unsigned long information_buf_len; - unsigned long* bytes_rw; - unsigned long* bytes_needed; - enum oid_type type_of_oid; - unsigned int dbg; -}; - -struct oid_obj_priv { - unsigned char dbg; // 0: without OID debug message 1: with OID debug message - NDIS_STATUS (*oidfuns)(struct oid_par_priv *poid_par_priv); -}; - -#ifdef CONFIG_MP_INCLUDED -static NDIS_STATUS oid_null_function(struct oid_par_priv* poid_par_priv) -{ - _func_enter_; - _func_exit_; - return NDIS_STATUS_SUCCESS; -} -#endif - -#ifdef PLATFORM_WINDOWS - -int TranslateNdisPsToRtPs(IN NDIS_802_11_POWER_MODE ndisPsMode); - -//OID Handler for Segment 1 -NDIS_STATUS oid_gen_supported_list_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_hardware_status_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_media_supported_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_media_in_use_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_maximum_lookahead_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_maximum_frame_size_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_link_speed_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_transmit_buffer_space_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_receive_buffer_space_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_transmit_block_size_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_receive_block_size_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_vendor_id_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_vendor_description_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_current_packet_filter_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_current_lookahead_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_driver_version_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_maximum_total_size_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_protocol_options_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_mac_options_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_media_connect_status_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_maximum_send_packets_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_vendor_driver_version_hdl(struct oid_par_priv* poid_par_priv); - - -//OID Handler for Segment 2 -NDIS_STATUS oid_gen_physical_medium_hdl(struct oid_par_priv* poid_par_priv); - -//OID Handler for Segment 3 -NDIS_STATUS oid_gen_xmit_ok_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_rcv_ok_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_xmit_error_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_rcv_error_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_gen_rcv_no_buffer_hdl(struct oid_par_priv* poid_par_priv); - - -//OID Handler for Segment 4 -NDIS_STATUS oid_802_3_permanent_address_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_current_address_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_multicast_list_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_maximum_list_size_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_mac_options_hdl(struct oid_par_priv* poid_par_priv); - - - -//OID Handler for Segment 5 -NDIS_STATUS oid_802_3_rcv_error_alignment_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_xmit_one_collision_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_xmit_more_collisions_hdl(struct oid_par_priv* poid_par_priv); - - -//OID Handler for Segment 6 -NDIS_STATUS oid_802_3_xmit_deferred_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_xmit_max_collisions_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_rcv_overrun_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_xmit_underrun_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_xmit_heartbeat_failure_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_xmit_times_crs_lost_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_3_xmit_late_collisions_hdl(struct oid_par_priv* poid_par_priv); - - - -//OID Handler for Segment 7 -NDIS_STATUS oid_pnp_capabilities_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_pnp_set_power_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_pnp_query_power_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_pnp_add_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_pnp_remove_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_pnp_wake_up_pattern_list_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_pnp_enable_wake_up_hdl(struct oid_par_priv* poid_par_priv); - - - -//OID Handler for Segment 8 -NDIS_STATUS oid_802_11_bssid_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_ssid_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_infrastructure_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_add_wep_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_remove_wep_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_disassociate_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_authentication_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_privacy_filter_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_bssid_list_scan_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_encryption_status_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_reload_defaults_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_add_key_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_remove_key_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_association_information_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_test_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_media_stream_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_capability_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_pmkid_hdl(struct oid_par_priv* poid_par_priv); - - - - - -//OID Handler for Segment 9 -NDIS_STATUS oid_802_11_network_types_supported_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_network_type_in_use_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_tx_power_level_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_rssi_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_rssi_trigger_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_fragmentation_threshold_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_rts_threshold_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_number_of_antennas_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_rx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_tx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_supported_rates_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_desired_rates_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_configuration_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_power_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_802_11_bssid_list_hdl(struct oid_par_priv* poid_par_priv); - - -//OID Handler for Segment 10 -NDIS_STATUS oid_802_11_statistics_hdl(struct oid_par_priv* poid_par_priv); - - -//OID Handler for Segment ED -NDIS_STATUS oid_rt_mh_vender_id_hdl(struct oid_par_priv* poid_par_priv); - -void Set_802_3_MULTICAST_LIST(ADAPTER *pAdapter, UCHAR *MCListbuf, ULONG MCListlen, BOOLEAN bAcceptAllMulticast); - -#endif// end of PLATFORM_WINDOWS - - -#ifdef PLATFORM_LINUX - -extern struct iw_handler_def rtw_handlers_def; - -#endif - -extern NDIS_STATUS drv_query_info( - IN _nic_hdl MiniportAdapterContext, - IN NDIS_OID Oid, - IN void * InformationBuffer, - IN u32 InformationBufferLength, - OUT u32* BytesWritten, - OUT u32* BytesNeeded - ); - -extern NDIS_STATUS drv_set_info( - IN _nic_hdl MiniportAdapterContext, - IN NDIS_OID Oid, - IN void * InformationBuffer, - IN u32 InformationBufferLength, - OUT u32* BytesRead, - OUT u32* BytesNeeded - ); - -#endif // #ifndef __INC_CEINFO_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h deleted file mode 100755 index e9ad16f172fb..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h +++ /dev/null @@ -1,37 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_IOCTL_QUERY_H_ -#define _RTW_IOCTL_QUERY_H_ - -#include -#include - - -#ifdef PLATFORM_WINDOWS - -u8 query_802_11_capability(_adapter* padapter,u8* pucBuf,u32 * pulOutLen); -u8 query_802_11_association_information (_adapter * padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo); - -#endif - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h deleted file mode 100755 index 1ea8f21b02c4..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h +++ /dev/null @@ -1,84 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_IOCTL_RTL_H_ -#define _RTW_IOCTL_RTL_H_ - -#include -#include -#include - -//************** oid_rtl_seg_01_01 ************** -NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv);//84 -NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv); //8a -NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv); //8b - -NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv);//93 -NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv); - -//************** oid_rtl_seg_01_03 section start ************** -NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv); - -// oid_rtl_seg_01_11 -NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv); - -//************** oid_rtl_seg_03_00 section start ************** -NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv); - - - - -#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h deleted file mode 100755 index 15e156ac6a17..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h +++ /dev/null @@ -1,74 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_IOCTL_SET_H_ -#define __RTW_IOCTL_SET_H_ - -#include -#include - - -typedef u8 NDIS_802_11_PMKID_VALUE[16]; - -typedef struct _BSSIDInfo { - NDIS_802_11_MAC_ADDRESS BSSID; - NDIS_802_11_PMKID_VALUE PMKID; -} BSSIDInfo, *PBSSIDInfo; - - -#ifdef PLATFORM_OS_XP -typedef struct _NDIS_802_11_PMKID { - u32 Length; - u32 BSSIDInfoCount; - BSSIDInfo BSSIDInfo[1]; -} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID; -#endif - - -#ifdef PLATFORM_WINDOWS -u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults); -u8 rtw_set_802_11_test(_adapter * padapter, NDIS_802_11_TEST * test); -u8 rtw_set_802_11_pmkid(_adapter *pdapter, NDIS_802_11_PMKID *pmkid); - -u8 rtw_pnp_set_power_sleep(_adapter* padapter); -u8 rtw_pnp_set_power_wakeup(_adapter* padapter); - -void rtw_pnp_resume_wk(void *context); -void rtw_pnp_sleep_wk(void * context); - -#endif - -u8 rtw_set_802_11_add_key(_adapter * padapter, NDIS_802_11_KEY * key); -u8 rtw_set_802_11_authentication_mode(_adapter *pdapter, NDIS_802_11_AUTHENTICATION_MODE authmode); -u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid); -u8 rtw_set_802_11_add_wep(_adapter * padapter, NDIS_802_11_WEP * wep); -u8 rtw_set_802_11_disassociate(_adapter * padapter); -u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter); -u8 rtw_set_802_11_infrastructure_mode(_adapter * padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); -u8 rtw_set_802_11_remove_wep(_adapter * padapter, u32 keyindex); -u8 rtw_set_802_11_ssid(_adapter * padapter, NDIS_802_11_SSID * ssid); -u8 rtw_set_802_11_remove_key(_adapter * padapter, NDIS_802_11_REMOVE_KEY * key); - - -u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid); - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_led.h b/drivers/net/wireless/rtl8192c/include/rtw_led.h deleted file mode 100755 index 665cc4117fc3..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_led.h +++ /dev/null @@ -1,212 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_LED_H_ -#define __RTW_LED_H_ - -#include -#include -#include - -#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000) - -typedef enum _LED_CTL_MODE{ - LED_CTL_POWER_ON = 1, - LED_CTL_LINK = 2, - LED_CTL_NO_LINK = 3, - LED_CTL_TX = 4, - LED_CTL_RX = 5, - LED_CTL_SITE_SURVEY = 6, - LED_CTL_POWER_OFF = 7, - LED_CTL_START_TO_LINK = 8, - LED_CTL_START_WPS = 9, - LED_CTL_STOP_WPS = 10, - LED_CTL_START_WPS_BOTTON = 11, //added for runtop - LED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA - LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN -}LED_CTL_MODE; - - -#ifdef CONFIG_USB_HCI -//================================================================================ -// LED object. -//================================================================================ - -typedef enum _LED_STATE_871x{ - LED_UNKNOWN = 0, - LED_ON = 1, - LED_OFF = 2, - LED_BLINK_NORMAL = 3, - LED_BLINK_SLOWLY = 4, - LED_POWER_ON_BLINK = 5, - LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. - LED_NO_LINK_BLINK = 7, // LED is blinking during no link state. - LED_BLINK_StartToBlink = 8,// Customzied for Sercomm Printer Server case - LED_BLINK_WPS = 9, // LED is blinkg during WPS communication - LED_TXRX_BLINK = 10, - LED_BLINK_WPS_STOP = 11, //for ALPHA - LED_BLINK_WPS_STOP_OVERLAP = 12, //for BELKIN -}LED_STATE_871x; - -#define IS_LED_WPS_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS \ - || ((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS_STOP \ - || ((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress) - -#define IS_LED_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress \ - ||((PLED_871x)_LED_871x)->bLedScanBlinkInProgress) - -typedef enum _LED_PIN_871x{ - LED_PIN_GPIO0, - LED_PIN_LED0, - LED_PIN_LED1 -}LED_PIN_871x; - -typedef struct _LED_871x{ - _adapter *padapter; - LED_PIN_871x LedPin; // Identify how to implement this SW led. - LED_STATE_871x CurrLedState; // Current LED state. - u8 bLedOn; // true if LED is ON, false if LED is OFF. - - u8 bSWLedCtrl; - - u8 bLedBlinkInProgress; // true if it is blinking, false o.w.. - // ALPHA, added by chiyoko, 20090106 - u8 bLedNoLinkBlinkInProgress; - u8 bLedLinkBlinkInProgress; - u8 bLedStartToLinkBlinkInProgress; - u8 bLedScanBlinkInProgress; - u8 bLedWPSBlinkInProgress; - - u32 BlinkTimes; // Number of times to toggle led state for blinking. - LED_STATE_871x BlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are. - - _timer BlinkTimer; // Timer object for led blinking. -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) - _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED. -#endif -} LED_871x, *PLED_871x; - - -//================================================================================ -// LED customization. -//================================================================================ - -typedef enum _LED_STRATEGY_871x{ - SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option. - SW_LED_MODE1, // 2 LEDs, through LED0 and LED1. For ALPHA. - SW_LED_MODE2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. - SW_LED_MODE3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. - SW_LED_MODE4, //for Edimax / Belkin - SW_LED_MODE5, //for Sercomm / Belkin - SW_LED_MODE6, //for 88CU minicard, porting from ce SW_LED_MODE7 - HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.) -}LED_STRATEGY_871x, *PLED_STRATEGY_871x; -#endif //CONFIG_USB_HCI - -#ifdef CONFIG_PCI_HCI -//================================================================================ -// LED object. -//================================================================================ - -typedef enum _LED_STATE_871x{ - LED_UNKNOWN = 0, - LED_ON = 1, - LED_OFF = 2, - LED_BLINK_NORMAL = 3, - LED_BLINK_SLOWLY = 4, - LED_POWER_ON_BLINK = 5, - LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. - LED_NO_LINK_BLINK = 7, // LED is blinking during no link state. - LED_BLINK_StartToBlink = 8, - LED_BLINK_TXRX = 9, - LED_BLINK_RUNTOP = 10, // Customized for RunTop - LED_BLINK_CAMEO = 11, -}LED_STATE_871x; - -typedef enum _LED_PIN_871x{ - LED_PIN_GPIO0, - LED_PIN_LED0, - LED_PIN_LED1, - LED_PIN_LED2 -}LED_PIN_871x; - -typedef struct _LED_871x{ - _adapter *padapter; - - LED_PIN_871x LedPin; // Identify how to implement this SW led. - - LED_STATE_871x CurrLedState; // Current LED state. - u8 bLedOn; // TRUE if LED is ON, FALSE if LED is OFF. - - u8 bLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w.. - u8 bLedWPSBlinkInProgress; // TRUE if it is blinking, FALSE o.w.. - - u8 bLedSlowBlinkInProgress;//added by vivi, for led new mode - u32 BlinkTimes; // Number of times to toggle led state for blinking. - LED_STATE_871x BlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are. - - _timer BlinkTimer; // Timer object for led blinking. -} LED_871x, *PLED_871x; - - -//================================================================================ -// LED customization. -//================================================================================ - -typedef enum _LED_STRATEGY_871x{ - SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option. - SW_LED_MODE1, // SW control for PCI Express - SW_LED_MODE2, // SW control for Cameo. - SW_LED_MODE3, // SW contorl for RunTop. - SW_LED_MODE4, // SW control for Netcore - SW_LED_MODE5, //added by vivi, for led new mode, DLINK - SW_LED_MODE6, //added by vivi, for led new mode, PRONET - SW_LED_MODE7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec - SW_LED_MODE8, //added by chiyokolin, for QMI - SW_LED_MODE9, //added by chiyokolin, for BITLAND, PCI Express Minicard Spec Rev.1.1 - SW_LED_MODE10, //added by chiyokolin, for Edimax-ASUS - HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes) -}LED_STRATEGY_871x, *PLED_STRATEGY_871x; - -#define LED_CM8_BLINK_INTERVAL 500 //for QMI -#endif //CONFIG_PCI_HCI - -struct led_priv{ - /* add for led controll */ - LED_871x SwLed0; - LED_871x SwLed1; - LED_STRATEGY_871x LedStrategy; - u8 bRegUseLed; - void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction); - /* add for led controll */ -}; - -#ifdef CONFIG_SW_LED -#define rtw_led_control(adapter, LedAction) \ - do { \ - if((adapter)->ledpriv.LedControlHandler) \ - (adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \ - } while(0) -#else //CONFIG_SW_LED -#define rtw_led_control(adapter, LedAction) -#endif //CONFIG_SW_LED - -#endif //__RTW_LED_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mlme.h b/drivers/net/wireless/rtl8192c/include/rtw_mlme.h deleted file mode 100755 index 41a6c496a16b..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_mlme.h +++ /dev/null @@ -1,573 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_MLME_H_ -#define __RTW_MLME_H_ - -#include -#include -#include -#include - - -#define MAX_BSS_CNT 64 -//#define MAX_JOIN_TIMEOUT 2000 -//#define MAX_JOIN_TIMEOUT 2500 -#define MAX_JOIN_TIMEOUT 6500 - -// Commented by Albert 20101105 -// Increase the scanning timeout because of increasing the SURVEY_TO value. - -#define SCANNING_TIMEOUT 8000 - -#define SCAN_INTERVAL (30) // unit:2sec, 30*2=60sec - -#ifdef PALTFORM_OS_WINCE -#define SCANQUEUE_LIFETIME 12000000 // unit:us -#else -#define SCANQUEUE_LIFETIME 20 // unit:sec -#endif - -#define WIFI_NULL_STATE 0x00000000 -#define WIFI_ASOC_STATE 0x00000001 // Under Linked state... -#define WIFI_REASOC_STATE 0x00000002 -#define WIFI_SLEEP_STATE 0x00000004 -#define WIFI_STATION_STATE 0x00000008 -#define WIFI_AP_STATE 0x00000010 -#define WIFI_ADHOC_STATE 0x00000020 -#define WIFI_ADHOC_MASTER_STATE 0x00000040 -#define WIFI_UNDER_LINKING 0x00000080 -//#define WIFI_UNDER_CMD 0x00000200 -// ========== P2P Section Start =============== -#define WIFI_P2P_LISTEN_STATE 0x00010000 -#define WIFI_P2P_GROUP_FORMATION_STATE 0x00020000 -// ========== P2P Section End =============== -#define WIFI_SITE_MONITOR 0x00000800 //to indicate the station is under site surveying - -#ifdef WDS -#define WIFI_WDS 0x00001000 -#define WIFI_WDS_RX_BEACON 0x00002000 // already rx WDS AP beacon -#endif -#ifdef AUTO_CONFIG -#define WIFI_AUTOCONF 0x00004000 -#define WIFI_AUTOCONF_IND 0x00008000 -#endif - -//#ifdef UNDER_MPTEST -#define WIFI_MP_STATE 0x00010000 -#define WIFI_MP_CTX_BACKGROUND 0x00020000 // in continous tx background -#define WIFI_MP_CTX_ST 0x00040000 // in continous tx with single-tone -#define WIFI_MP_CTX_BACKGROUND_PENDING 0x00080000 // pending in continous tx background due to out of skb -#define WIFI_MP_CTX_CCK_HW 0x00100000 // in continous tx -#define WIFI_MP_CTX_CCK_CS 0x00200000 // in continous tx with carrier suppression -#define WIFI_MP_LPBK_STATE 0x00400000 -//#endif - -//#define _FW_UNDER_CMD WIFI_UNDER_CMD -#define _FW_UNDER_LINKING WIFI_UNDER_LINKING -#define _FW_LINKED WIFI_ASOC_STATE -#define _FW_UNDER_SURVEY WIFI_SITE_MONITOR - -enum dot11AuthAlgrthmNum { - dot11AuthAlgrthm_Open = 0, - dot11AuthAlgrthm_Shared, - dot11AuthAlgrthm_8021X, - dot11AuthAlgrthm_Auto, - dot11AuthAlgrthm_MaxNum -}; - -// Scan type including active and passive scan. -typedef enum _RT_SCAN_TYPE -{ - SCAN_PASSIVE, - SCAN_ACTIVE, - SCAN_MIX, -}RT_SCAN_TYPE, *PRT_SCAN_TYPE; - -/* - -there are several "locks" in mlme_priv, -since mlme_priv is a shared resource between many threads, -like ISR/Call-Back functions, the OID handlers, and even timer functions. - - -Each _queue has its own locks, already. -Other items are protected by mlme_priv.lock. - -To avoid possible dead lock, any thread trying to modifiying mlme_priv -SHALL not lock up more than one locks at a time! - -*/ - - -#define traffic_threshold 10 -#define traffic_scan_period 500 - -struct sitesurvey_ctrl { - u64 last_tx_pkts; - uint last_rx_pkts; - sint traffic_busy; - _timer sitesurvey_ctrl_timer; -}; - -typedef struct _RT_LINK_DETECT_T{ - u32 NumTxOkInPeriod; - u32 NumRxOkInPeriod; - u32 NumRxUnicastOkInPeriod; - BOOLEAN bBusyTraffic; - BOOLEAN bTxBusyTraffic; - BOOLEAN bRxBusyTraffic; - BOOLEAN bHigherBusyTraffic; // For interrupt migration purpose. - BOOLEAN bHigherBusyRxTraffic; // We may disable Tx interrupt according as Rx traffic. -}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T; - -struct profile_info { - u8 ssidlen; - u8 ssid[ WLAN_SSID_MAXLEN ]; - u8 peermac[ ETH_ALEN ]; -}; - -struct tx_invite_req_info{ - u8 token; - u8 ssid[ WLAN_SSID_MAXLEN ]; - u8 ssidlen; - u8 peer_operation_ch; -}; - -struct tx_invite_resp_info{ - u8 token; // Used to record the dialog token of p2p invitation request frame. -}; - -struct tx_provdisc_req_info{ - u16 wps_config_method_request; // Used when sending the provisioning request frame - u16 peer_channel_num[2]; // The channel number which the receiver stands. - NDIS_802_11_SSID ssid; - u8 peerDevAddr[ ETH_ALEN ]; // Peer device address - u8 peerIFAddr[ ETH_ALEN ]; // Peer interface address - u8 benable; // This provision discovery request frame is trigger to send or not -}; - -struct rx_provdisc_req_info{ //When peer device issue prov_disc_req first, we should store the following informations - u8 peerDevAddr[ ETH_ALEN ]; // Peer device address - u8 strconfig_method_desc_of_prov_disc_req[4]; // description for the config method located in the provisioning discovery request frame. - // The UI must know this information to know which config method the remote p2p device is requiring. -}; - -struct tx_nego_req_info{ - u16 peer_channel_num[2]; // The channel number which the receiver stands. - u8 peerDevAddr[ ETH_ALEN ]; // Peer device address - u8 benable; // This negoitation request frame is trigger to send or not -}; - -struct wifidirect_info{ - _adapter* padapter; - _timer find_phase_timer; - _timer restore_p2p_state_timer; - - // Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer. - _timer pre_tx_scan_timer; - struct tx_provdisc_req_info tx_prov_disc_info; - struct rx_provdisc_req_info rx_prov_disc_info; - struct tx_invite_req_info invitereq_info; - struct profile_info profileinfo[ P2P_MAX_PERSISTENT_GROUP_NUM ]; // Store the profile information of persistent group - struct tx_invite_resp_info inviteresp_info; - struct tx_nego_req_info nego_req_info; - enum P2P_ROLE role; - enum P2P_STATE pre_p2p_state; - enum P2P_STATE p2p_state; - u8 device_addr[ETH_ALEN]; // The device address should be the mac address of this device. - u8 interface_addr[ETH_ALEN]; - u8 social_chan[4]; - u8 listen_channel; - u8 operating_channel; - u8 listen_dwell; // This value should be between 1 and 3 - u8 support_rate[8]; - u8 p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN]; - u8 intent; // should only include the intent value. - u8 p2p_peer_interface_addr[ ETH_ALEN ]; - u8 peer_intent; // Included the intent value and tie breaker value. - u8 device_name[ WPS_MAX_DEVICE_NAME_LEN ]; // Device name for displaying on searching device screen - u8 device_name_len; - u8 profileindex; // Used to point to the index of profileinfo array - u8 peer_operating_ch; - u8 find_phase_state_exchange_cnt; - u16 device_password_id_for_nego; // The device password ID for group negotation - u8 negotiation_dialog_token; - u8 nego_ssid[ WLAN_SSID_MAXLEN ]; // SSID information for group negotitation - u8 nego_ssidlen; - u8 p2p_group_ssid[WLAN_SSID_MAXLEN]; - u8 p2p_group_ssid_len; - - enum P2P_WPSINFO ui_got_wps_info; // This field will store the WPS value (PIN value or PBC) that UI had got from the user. - u16 supported_wps_cm; // This field describes the WPS config method which this driver supported. - // The value should be the combination of config method defined in page104 of WPS v2.0 spec. - u8 channel_cnt; // This field is the count number for P2P Channel List attribute of group negotitation response frame. - u8 channel_list[13]; // This field will contain the channel number of P2P Channel List attribute of group negotitation response frame. - // We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. - u8 p2p_ps_enable; - enum P2P_PS p2p_ps; // indicate p2p ps state - u8 noa_index; // Identifies and instance of Notice of Absence timing. - u8 ctwindow; // Client traffic window. A period of time in TU after TBTT. - u8 opp_ps; // opportunistic power save. - u8 noa_num; // number of NoA descriptor in P2P IE. - u8 noa_count[P2P_MAX_NOA_NUM]; // Count for owner, Type of client. - u32 noa_duration[P2P_MAX_NOA_NUM]; // Max duration for owner, preferred or min acceptable duration for client. - u32 noa_interval[P2P_MAX_NOA_NUM]; // Length of interval for owner, preferred or max acceptable interval of client. - u32 noa_start_time[P2P_MAX_NOA_NUM]; // schedule expressed in terms of the lower 4 bytes of the TSF timer. -}; - - -struct mlme_priv { - - _lock lock; - sint fw_state; //shall we protect this variable? maybe not necessarily... - - u8 to_join; //flag - #ifdef CONFIG_LAYER2_ROAMING - u8 to_roaming; // roaming trying times - #endif - - u8 *nic_hdl; - - _list *pscanned; - _queue free_bss_pool; - _queue scanned_queue; - u8 *free_bss_buf; - u32 num_of_scanned; - - NDIS_802_11_SSID assoc_ssid; - u8 assoc_bssid[6]; - - struct wlan_network cur_network; - - //uint wireless_mode; no used, remove it - - u32 scan_interval; - - _timer assoc_timer; - - uint assoc_by_bssid; - - _timer scan_to_timer; // driver itself handles scan_timeout status. - u32 scan_start_time; // used to evaluate the time spent in scanning - - #ifdef CONFIG_SET_SCAN_DENY_TIMER - _timer set_scan_deny_timer; - ATOMIC_T set_scan_deny; //0: allowed, 1: deny - #endif - - struct qos_priv qospriv; - -#ifdef CONFIG_80211N_HT - - /* Number of non-HT AP/stations */ - int num_sta_no_ht; - - /* Number of HT AP/stations 20 MHz */ - //int num_sta_ht_20mhz; - - - int num_FortyMHzIntolerant; - - struct ht_priv htpriv; - -#endif - - RT_LINK_DETECT_T LinkDetectInfo; - _timer dynamic_chk_timer; //dynamic/periodic check timer - - u8 key_mask; //use for ips to set wep key after ips_leave - u8 ChannelPlan; - u8 scan_mode; // active: 1, passive: 0 - - - u8 probereq_wpsie[MAX_WPS_IE_LEN];//added in probe req - int probereq_wpsie_len; - -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - /* Number of associated Non-ERP stations (i.e., stations using 802.11b - * in 802.11g BSS) */ - int num_sta_non_erp; - - /* Number of associated stations that do not support Short Slot Time */ - int num_sta_no_short_slot_time; - - /* Number of associated stations that do not support Short Preamble */ - int num_sta_no_short_preamble; - - int olbc; /* Overlapping Legacy BSS Condition */ - - /* Number of HT associated stations that do not support greenfield */ - int num_sta_ht_no_gf; - - /* Number of associated non-HT stations */ - //int num_sta_no_ht; - - /* Number of HT associated stations 20 MHz */ - int num_sta_ht_20mhz; - - /* Overlapping BSS information */ - int olbc_ht; - -#ifdef CONFIG_80211N_HT - u16 ht_op_mode; -#endif /* CONFIG_80211N_HT */ - - u8 *wps_beacon_ie; - u8 *wps_probe_resp_ie; - u8 *wps_assoc_resp_ie; - u32 wps_beacon_ie_len; - u32 wps_probe_resp_ie_len; - u32 wps_assoc_resp_ie_len; - - - _lock bcn_update_lock; - u8 update_bcn; - - -#endif - -#ifdef RTK_DMP_PLATFORM - // DMP kobject_hotplug function signal need in passive level - _workitem Linkup_workitem; - _workitem Linkdown_workitem; -#endif - -}; - -#ifdef CONFIG_AP_MODE - -struct hostapd_priv -{ - _adapter *padapter; - -#ifdef CONFIG_HOSTAPD_MLME - struct net_device *pmgnt_netdev; - struct usb_anchor anchored; -#endif - -}; - -extern int hostapd_mode_init(_adapter *padapter); -extern void hostapd_mode_unload(_adapter *padapter); -#endif - -extern void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf); -extern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf); -extern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf); -extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf); -extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf); -extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf); -extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf); - -#ifdef PLATFORM_WINDOWS -extern thread_return event_thread(void *context); - -extern void rtw_join_timeout_handler ( - IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3 - ); - -extern void _rtw_scan_timeout_handler ( - IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3 - ); - -#endif - -#ifdef PLATFORM_LINUX -extern int event_thread(void *context); -extern void rtw_join_timeout_handler(void* FunctionContext); -extern void _rtw_scan_timeout_handler(void* FunctionContext); -#endif - -extern void rtw_free_network_queue(_adapter *adapter,u8 isfreeall); -extern int rtw_init_mlme_priv(_adapter *adapter);// (struct mlme_priv *pmlmepriv); - -extern void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv); - - -extern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv); -extern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx); -extern sint rtw_set_auth(_adapter *adapter,struct security_priv *psecuritypriv); - -__inline static u8 *get_bssid(struct mlme_priv *pmlmepriv) -{ //if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid - // if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address - return pmlmepriv->cur_network.network.MacAddress; -} - -__inline static sint check_fwstate(struct mlme_priv *pmlmepriv, sint state) -{ - if (pmlmepriv->fw_state & state) - return _TRUE; - - return _FALSE; -} - -__inline static sint get_fwstate(struct mlme_priv *pmlmepriv) -{ - return pmlmepriv->fw_state; -} - -/* - * No Limit on the calling context, - * therefore set it to be the critical section... - * - * ### NOTE:#### (!!!!) - * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock - */ -__inline static void set_fwstate(struct mlme_priv *pmlmepriv, sint state) -{ - pmlmepriv->fw_state |= state; -} - -__inline static void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state) -{ - pmlmepriv->fw_state &= ~state; -} - -/* - * No Limit on the calling context, - * therefore set it to be the critical section... - */ -__inline static void clr_fwstate(struct mlme_priv *pmlmepriv, sint state) -{ - _irqL irqL; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - if (check_fwstate(pmlmepriv, state) == _TRUE) - pmlmepriv->fw_state ^= state; - _exit_critical_bh(&pmlmepriv->lock, &irqL); -} - -__inline static void clr_fwstate_ex(struct mlme_priv *pmlmepriv, sint state) -{ - _irqL irqL; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - _clr_fwstate_(pmlmepriv, state); - _exit_critical_bh(&pmlmepriv->lock, &irqL); -} - -__inline static void up_scanned_network(struct mlme_priv *pmlmepriv) -{ - _irqL irqL; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - pmlmepriv->num_of_scanned++; - _exit_critical_bh(&pmlmepriv->lock, &irqL); -} - -__inline static void down_scanned_network(struct mlme_priv *pmlmepriv) -{ - _irqL irqL; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - pmlmepriv->num_of_scanned--; - _exit_critical_bh(&pmlmepriv->lock, &irqL); -} - -__inline static void set_scanned_network_val(struct mlme_priv *pmlmepriv, sint val) -{ - _irqL irqL; - - _enter_critical_bh(&pmlmepriv->lock, &irqL); - pmlmepriv->num_of_scanned = val; - _exit_critical_bh(&pmlmepriv->lock, &irqL); -} - -extern u16 rtw_get_capability(WLAN_BSSID_EX *bss); -extern void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target); -extern void rtw_disconnect_hdl_under_linked(_adapter* adapter, struct sta_info *psta, u8 free_assoc); -extern void rtw_generate_random_ibss(u8 *pibss); -extern struct wlan_network* rtw_find_network(_queue *scanned_queue, u8 *addr); -extern struct wlan_network* rtw_get_oldest_wlan_network(_queue *scanned_queue); - -extern void rtw_free_assoc_resources(_adapter* adapter); -extern void rtw_indicate_disconnect(_adapter* adapter); -extern void rtw_indicate_connect(_adapter* adapter); - -extern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len); -extern int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len); -extern void rtw_init_registrypriv_dev_network(_adapter *adapter); - -extern void rtw_update_registrypriv_dev_network(_adapter *adapter); - -extern void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter); - -extern void _rtw_join_timeout_handler(_adapter *adapter); -extern void rtw_scan_timeout_handler(_adapter *adapter); - -extern void rtw_dynamic_check_timer_handlder(_adapter *adapter); -#ifdef CONFIG_SET_SCAN_DENY_TIMER -extern void rtw_set_scan_deny_timer_hdl(_adapter *adapter); -void rtw_set_scan_deny(struct mlme_priv *mlmepriv, u32 ms); -#endif - - -extern int _rtw_init_mlme_priv(_adapter *padapter); - -extern void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv); - -extern int _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork); - -extern struct wlan_network* _rtw_dequeue_network(_queue *queue); - -extern struct wlan_network* _rtw_alloc_network(struct mlme_priv *pmlmepriv); - - -extern void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall); -extern void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork); - - -extern struct wlan_network* _rtw_find_network(_queue *scanned_queue, u8 *addr); - -extern void _rtw_free_network_queue(_adapter* padapter, u8 isfreeall); - -extern sint rtw_if_up(_adapter *padapter); - - -u8 *rtw_get_capability_from_ie(u8 *ie); -u8 *rtw_get_timestampe_from_ie(u8 *ie); -u8 *rtw_get_beacon_interval_from_ie(u8 *ie); - - -void rtw_joinbss_reset(_adapter *padapter); - -#ifdef CONFIG_80211N_HT -unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len); -void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len); -void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe); -#endif - -int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork); - -#ifdef CONFIG_LAYER2_ROAMING -void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); -void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); -#endif - -#endif //__RTL871X_MLME_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h b/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h deleted file mode 100755 index d8d3c52cc8a4..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h +++ /dev/null @@ -1,759 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_MLME_EXT_H_ -#define __RTW_MLME_EXT_H_ - -#include -#include -#include -#include - - -// Commented by Albert 20101105 -// Increase the SURVEY_TO value from 100 to 150 ( 100ms to 150ms ) -// The Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request. -// So, this driver tried to extend the dwell time for each scanning channel. -// This will increase the chance to receive the probe response from SoftAP. - -#define SURVEY_TO (100) -#define REAUTH_TO (300) //(50) -#define REASSOC_TO (300) //(50) -//#define DISCONNECT_TO (3000) -#define ADDBA_TO (2000) - -#define LINKED_TO (1) //unit:2 sec, 1x2=2 sec - -#define REAUTH_LIMIT (2) -#define REASSOC_LIMIT (2) -#define READDBA_LIMIT (2) - -//#define IOCMD_REG0 0x10250370 -//#define IOCMD_REG1 0x10250374 -//#define IOCMD_REG2 0x10250378 - -//#define FW_DYNAMIC_FUN_SWITCH 0x10250364 - -//#define WRITE_BB_CMD 0xF0000001 -//#define SET_CHANNEL_CMD 0xF3000000 -//#define UPDATE_RA_CMD 0xFD0000A2 - -#define DYNAMIC_FUNC_DISABLE (0x0) -#define DYNAMIC_FUNC_DIG BIT(0) -#define DYNAMIC_FUNC_HP BIT(1) -#define DYNAMIC_FUNC_SS BIT(2) //Tx Power Tracking -#define DYNAMIC_FUNC_BT BIT(3) -#define DYNAMIC_FUNC_ANT_DIV BIT(4) - -#define _HW_STATE_NOLINK_ 0x00 -#define _HW_STATE_ADHOC_ 0x01 -#define _HW_STATE_STATION_ 0x02 -#define _HW_STATE_AP_ 0x03 - - -#define _1M_RATE_ 0 -#define _2M_RATE_ 1 -#define _5M_RATE_ 2 -#define _11M_RATE_ 3 -#define _6M_RATE_ 4 -#define _9M_RATE_ 5 -#define _12M_RATE_ 6 -#define _18M_RATE_ 7 -#define _24M_RATE_ 8 -#define _36M_RATE_ 9 -#define _48M_RATE_ 10 -#define _54M_RATE_ 11 - - -// -// Channel Plan Type. -// Note: -// We just add new channel plan when the new channel plan is different from any of the following -// channel plan. -// If you just wnat to customize the acitions(scan period or join actions) about one of the channel plan, -// customize them in RT_CHANNEL_INFO in the RT_CHANNEL_LIST. -// -typedef enum _RT_CHANNEL_DOMAIN -{ - RT_CHANNEL_DOMAIN_FCC = 0, - RT_CHANNEL_DOMAIN_IC = 1, - RT_CHANNEL_DOMAIN_ETSI = 2, - RT_CHANNEL_DOMAIN_SPAIN = 3, - RT_CHANNEL_DOMAIN_FRANCE = 4, - RT_CHANNEL_DOMAIN_MKK = 5, - RT_CHANNEL_DOMAIN_MKK1 = 6, - RT_CHANNEL_DOMAIN_ISRAEL = 7, - RT_CHANNEL_DOMAIN_TELEC = 8, -#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ - RT_CHANNEL_DOMAIN_MIC = 9, // Be compatible with old channel plan. No good! - RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 10, // Be compatible with old channel plan. No good! - RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 11, // Be compatible with old channel plan. No good! - RT_CHANNEL_DOMAIN_TELEC_NETGEAR = 12, // Be compatible with old channel plan. No good! - RT_CHANNEL_DOMAIN_NCC = 13, -#endif /* Not using EEPROM_CHANNEL_PLAN directly */ - RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 0x09, - RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 0x0A, - RT_CHANNEL_DOMAIN_NCC = 0x0B, - RT_CHANNEL_DOMAIN_CHINA = 0x0C, - RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO = 0x0D, - RT_CHANNEL_DOMAIN_KOREA = 0x0E, - RT_CHANNEL_DOMAIN_TURKEY = 0x0F, - RT_CHANNEL_DOMAIN_JAPAN = 0x10, - RT_CHANNEL_DOMAIN_FCC_NO_DFS = 0x11, - RT_CHANNEL_DOMAIN_JAPAN_NO_DFS = 0x12, - //===== Add new channel plan above this line===============// - RT_CHANNEL_DOMAIN_MAX, -}RT_CHANNEL_DOMAIN, *PRT_CHANNEL_DOMAIN; - -// -// We now define the following channels as the max channels in each channel plan. -// 2G, total 14 chnls -// {1,2,3,4,5,6,7,8,9,10,11,12,13,14} -// 5G, total 24 chnls -// {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165} -#define MAX_CHANNEL_NUM 38//14+24 -#define MAX_SCAN_CHANNEL_NUM 54 - -typedef struct _RT_CHANNEL_PLAN -{ - unsigned char Channel[MAX_CHANNEL_NUM]; - unsigned char Len; -}RT_CHANNEL_PLAN, *PRT_CHANNEL_PLAN; - -enum Associated_AP -{ - atherosAP = 0, - broadcomAP = 1, - ciscoAP = 2, - marvellAP = 3, - ralinkAP = 4, - realtekAP = 5, - airgocapAP = 6, - unknownAP = 7, - maxAP, -}; - -enum SCAN_STATE -{ - SCAN_DISABLE = 0, - SCAN_START = 1, - SCAN_TXNULL = 2, - SCAN_PROCESS = 3, - SCAN_COMPLETE = 4, - SCAN_STATE_MAX, -}; - -struct mlme_handler { - unsigned int num; - char* str; - unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame); -}; - -struct action_handler { - unsigned int num; - char* str; - unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame); -}; - -struct ss_res -{ - int state; - int bss_cnt; - int channel_idx; - int scan_mode; - int ss_ssidlen; - unsigned char ss_ssid[IW_ESSID_MAX_SIZE + 1]; -}; - -//#define AP_MODE 0x0C -//#define STATION_MODE 0x08 -//#define AD_HOC_MODE 0x04 -//#define NO_LINK_MODE 0x00 - -#define WIFI_FW_NULL_STATE _HW_STATE_NOLINK_ -#define WIFI_FW_STATION_STATE _HW_STATE_STATION_ -#define WIFI_FW_AP_STATE _HW_STATE_AP_ -#define WIFI_FW_ADHOC_STATE _HW_STATE_ADHOC_ - -#define WIFI_FW_AUTH_NULL 0x00000100 -#define WIFI_FW_AUTH_STATE 0x00000200 -#define WIFI_FW_AUTH_SUCCESS 0x00000400 - -#define WIFI_FW_ASSOC_STATE 0x00002000 -#define WIFI_FW_ASSOC_SUCCESS 0x00004000 - -#define WIFI_FW_LINKING_STATE (WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE | WIFI_FW_AUTH_SUCCESS |WIFI_FW_ASSOC_STATE) - -#ifdef CONFIG_TDLS -/* TDLS STA state */ -#define UN_TDLS_STATE 0x00000000 //default state -#define TDLS_INITIATOR_STATE 0x10000000 -#define TDLS_RESPONDER_STATE 0x20000000 -#define TDLS_LINKED_STATE 0x40000000 -#define TDLS_CH_SWITCH_ON_STATE 0x01000000 -#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch -#define TDLS_AT_OFF_CH_STATE 0x04000000 -#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. -#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch -#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping -#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing -#define TPK_RESEND_COUNT 301 -#define CH_SWITCH_TIME 10 -#define CH_SWITCH_TIMEOUT 30 -#endif - -struct FW_Sta_Info -{ - struct sta_info *psta; - u32 status; - u32 rx_pkt; - u32 retry; - NDIS_802_11_RATES_EX SupportedRates; -}; - -struct mlme_ext_info -{ - u32 state; - u32 reauth_count; - u32 reassoc_count; - u32 link_count; - u32 auth_seq; - u32 auth_algo; // 802.11 auth, could be open, shared, auto - u32 authModeToggle; - u32 enc_algo;//encrypt algorithm; - u32 key_index; // this is only valid for legendary wep, 0~3 for key id. - u32 iv; - u8 chg_txt[128]; - u16 aid; - u16 bcn_interval; - u16 capability; - u8 assoc_AP_vendor; - u8 slotTime; - u8 preamble_mode; - u8 WMM_enable; - u8 ERP_enable; - u8 ERP_IE; - u8 HT_enable; - u8 HT_caps_enable; - u8 HT_info_enable; - u8 HT_protection; - u8 turboMode_cts2self; - u8 turboMode_rtsen; - u8 SM_PS; - u8 agg_enable_bitmap; - u8 ADDBA_retry_count; - u8 candidate_tid_bitmap; - u8 dialogToken; - // Accept ADDBA Request - BOOLEAN bAcceptAddbaReq; - u8 bwmode_updated; - -#ifdef CONFIG_TDLS - uint tdls_setup_state; - u8 tdls_sta_cnt; - u8 tdls_dis_req; - u8 tdls_cam_entry_to_write; //cam entry that is empty to write - u8 tdls_cam_entry_to_clear; //cam entry that is trying to clear, using in direct link teardown - u8 tdls_ch_sensing; - u8 tdls_cur_channel; - u8 tdls_candidate_ch; - u8 tdls_collect_pkt_num[14]; -#endif - - struct ADDBA_request ADDBA_req; - struct WMM_para_element WMM_param; - struct HT_caps_element HT_caps; - struct HT_info_element HT_info; - WLAN_BSSID_EX network;//join network or bss_network, if in ap mode, it is the same to cur_network.network - struct FW_Sta_Info FW_sta_info[NUM_STA]; -}; - -// The channel information about this channel including joining, scanning, and power constraints. -typedef struct _RT_CHANNEL_INFO -{ - u8 ChannelNum; // The channel number. - RT_SCAN_TYPE ScanType; // Scan type such as passive or active scan. - //u16 ScanPeriod; // Listen time in millisecond in this channel. - //s32 MaxTxPwrDbm; // Max allowed tx power. - //u32 ExInfo; // Extended Information for this channel. -#ifdef CONFIG_FIND_BEST_CHANNEL - u32 rx_count; -#endif -}RT_CHANNEL_INFO, *PRT_CHANNEL_INFO; - -struct mlme_ext_priv -{ - _adapter *padapter; - u8 mlmeext_init; - ATOMIC_T event_seq; - u16 mgnt_seq; - - //struct fw_priv fwpriv; - - unsigned char cur_channel; - unsigned char cur_bwmode; - unsigned char cur_ch_offset;//PRIME_CHNL_OFFSET - unsigned char cur_wireless_mode; - //unsigned char channel_set[NUM_CHANNELS]; - unsigned char max_chan_nums; - RT_CHANNEL_INFO channel_set[MAX_CHANNEL_NUM]; - unsigned char basicrate[NumRates]; - unsigned char datarate[NumRates]; - - struct ss_res sitesurvey_res; - struct mlme_ext_info mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info. - //for ap mode, network includes ap's cap_info - _timer survey_timer; - _timer link_timer; - //_timer ADDBA_timer; - u16 chan_scan_time; - - u32 linked_to;//linked timeout - u32 retry; //retry for issue probereq - - u64 TSFValue; - -#ifdef CONFIG_TDLS - _workitem TDLS_restore_workitem; -#endif - -#ifdef CONFIG_AP_MODE - unsigned char bstart_bss; -#endif - -}; - -int init_mlme_ext_priv(_adapter* padapter); -int init_hw_mlme_ext(_adapter *padapter); -void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext); -extern void init_mlme_ext_timer(_adapter *padapter); -extern void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta); - -extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv); - -//void fill_fwpriv(_adapter * padapter, struct fw_priv *pfwpriv); - -unsigned char networktype_to_raid(unsigned char network_type); -int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen); -void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len); - -void Save_DM_Func_Flag(_adapter *padapter); -void Restore_DM_Func_Flag(_adapter *padapter); -void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable); - -void Set_NETYPE1_MSR(_adapter *padapter, u8 type); -void Set_NETYPE0_MSR(_adapter *padapter, u8 type); - -void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode); -void SelectChannel(_adapter *padapter, unsigned char channel); -void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset); - -unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval); - -void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key); -void clear_cam_entry(_adapter *padapter, u8 entry); - -void invalidate_cam_all(_adapter *padapter); -void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex); - - -int allocate_fw_sta_entry(_adapter *padapter); -void flush_all_cam_entry(_adapter *padapter); - -BOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel); - -void site_survey(_adapter *padapter); -u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid); - -int get_bsstype(unsigned short capability); -u8* get_my_bssid(WLAN_BSSID_EX *pnetwork); -u16 get_beacon_interval(WLAN_BSSID_EX *bss); - -int is_client_associated_to_ap(_adapter *padapter); -int is_client_associated_to_ibss(_adapter *padapter); -int is_IBSS_empty(_adapter *padapter); - -unsigned char check_assoc_AP(u8 *pframe, uint len); - -int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); -void WMMOnAssocRsp(_adapter *padapter); - -void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); -void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); -void HTOnAssocRsp(_adapter *padapter); - -void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); -void VCS_update(_adapter *padapter, struct sta_info *psta); - -void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta); - -void update_IOT_info(_adapter *padapter); -void update_capinfo(PADAPTER Adapter, u16 updateCap); -void update_wireless_mode(_adapter * padapter); -void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id); -int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx); - -unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz); -unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz); -unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps); -void Update_RA_Entry(_adapter *padapter, u32 mac_id); -void set_sta_rate(_adapter *padapter, struct sta_info *psta); - -unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason); - -unsigned char get_highest_rate_idx(u32 mask); -int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps); -unsigned int is_ap_in_tkip(_adapter *padapter); - - -void report_join_res(_adapter *padapter, int res); -void report_survey_event(_adapter *padapter, union recv_frame *precv_frame); -void report_surveydone_event(_adapter *padapter); -void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason); -void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx); - -void beacon_timing_control(_adapter *padapter); -extern u8 set_tx_beacon_cmd(_adapter*padapter); -unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame); -void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib); -void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe); - -#ifdef CONFIG_P2P -void issue_probersp_p2p(_adapter *padapter, unsigned char *da); -void issue_p2p_provision_request( _adapter *padapter, u8* pinterface_raddr, u8* pssid, u8 ussidlen, u8* pdev_raddr); -void issue_p2p_GO_request(_adapter *padapter, u8* raddr); -void issue_probereq_p2p(_adapter *padapter); -void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success); -void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ); -#endif //CONFIG_P2P -#ifdef CONFIG_TDLS -void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode); -extern void TDLS_restore_workitem_callback(struct work_struct *work); -void init_TPK_timer(_adapter *padapter, struct sta_info *psta); -extern void TDLS_option_workitem_callback(struct work_struct *work); -void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta); -void init_base_ch_timer(_adapter *padapter, struct sta_info *psta); -void init_off_ch_timer(_adapter *padapter, struct sta_info *psta); -extern void base_channel_workitem_callback(struct work_struct *work); -extern void off_channel_workitem_callback(struct work_struct *work); -void issue_tdls_dis_req(_adapter *padapter); -void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame); -void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame); -void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame); -void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr); -void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); -void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); -void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); -sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); -#endif -void issue_beacon(_adapter *padapter); -void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq); -void issue_assocreq(_adapter *padapter); -void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type); -void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status); -// Added by Albert 2010/07/26 -// blnbc: 1 -> broadcast probe request -// blnbc: 0 -> unicast probe request. The address 1 will be the BSSID. -void issue_probereq(_adapter *padapter, u8 blnbc); -void issue_nulldata(_adapter *padapter, unsigned int power_mode); -void issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid); -void issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason); -void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status); -unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr); -unsigned int send_beacon(_adapter *padapter); - -void start_clnt_assoc(_adapter *padapter); -void start_clnt_auth(_adapter* padapter); -void start_clnt_join(_adapter* padapter); -void start_create_ibss(_adapter* padapter); - -unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame); -unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame); - -unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame); -unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame); - - -void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res); -void mlmeext_sta_del_event_callback(_adapter *padapter); -void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta); - -void linked_status_chk(_adapter *padapter); - -void survey_timer_hdl (_adapter *padapter); -void link_timer_hdl (_adapter *padapter); -void addba_timer_hdl(struct sta_info *psta); -//void reauth_timer_hdl(_adapter *padapter); -//void reassoc_timer_hdl(_adapter *padapter); - -#define set_survey_timer(mlmeext, ms) \ - do { \ - /*DBG_871X("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ - _set_timer(&(mlmeext)->survey_timer, (ms)); \ - } while(0) - -#define set_link_timer(mlmeext, ms) \ - do { \ - /*DBG_871X("%s set_link_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ - _set_timer(&(mlmeext)->link_timer, (ms)); \ - } while(0) - -extern int cckrates_included(unsigned char *rate, int ratelen); -extern int cckratesonly_included(unsigned char *rate, int ratelen); - -extern void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr); - -extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len); -extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext); - -#ifdef CONFIG_AP_MODE -void init_mlme_ap_info(_adapter *padapter); -void free_mlme_ap_info(_adapter *padapter); -//void update_BCNTIM(_adapter *padapter); -void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); -void expire_timeout_chk(_adapter *padapter); -void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); -void start_bss_network(_adapter *padapter, u8 *pbuf); -#ifdef CONFIG_NATIVEAP_MLME -void bss_cap_update(_adapter *padapter, struct sta_info *psta); -void sta_info_update(_adapter *padapter, struct sta_info *psta); -void ap_free_sta(_adapter *padapter, struct sta_info *psta); -int rtw_sta_flush(_adapter *padapter); -void start_ap_mode(_adapter *padapter); -void stop_ap_mode(_adapter *padapter); -#endif -#endif //end of CONFIG_AP_MODE - -struct cmd_hdl { - uint parmsize; - u8 (*h2cfuns)(struct _ADAPTER *padapter, u8 *pbuf); -}; - - -u8 read_macreg_hdl(_adapter *padapter, u8 *pbuf); -u8 write_macreg_hdl(_adapter *padapter, u8 *pbuf); -u8 read_bbreg_hdl(_adapter *padapter, u8 *pbuf); -u8 write_bbreg_hdl(_adapter *padapter, u8 *pbuf); -u8 read_rfreg_hdl(_adapter *padapter, u8 *pbuf); -u8 write_rfreg_hdl(_adapter *padapter, u8 *pbuf); - - -u8 NULL_hdl(_adapter *padapter, u8 *pbuf); -u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf); -u8 disconnect_hdl(_adapter *padapter, u8 *pbuf); -u8 createbss_hdl(_adapter *padapter, u8 *pbuf); -u8 setopmode_hdl(_adapter *padapter, u8 *pbuf); -u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf); -u8 setauth_hdl(_adapter *padapter, u8 *pbuf); -u8 setkey_hdl(_adapter *padapter, u8 *pbuf); -u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf); -u8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf); -u8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf); -u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf); - -u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf); -u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf); -u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf); -u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf); - -#define GEN_DRV_CMD_HANDLER(size, cmd) {size, &cmd ## _hdl}, -#define GEN_MLME_EXT_HANDLER(size, cmd) {size, cmd}, - -#ifdef _RTW_CMD_C_ - -struct cmd_hdl wlancmds[] = -{ - GEN_DRV_CMD_HANDLER(0, NULL) /*0*/ - GEN_DRV_CMD_HANDLER(0, NULL) - GEN_DRV_CMD_HANDLER(0, NULL) - GEN_DRV_CMD_HANDLER(0, NULL) - GEN_DRV_CMD_HANDLER(0, NULL) - GEN_DRV_CMD_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) /*10*/ - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct joinbss_parm), join_cmd_hdl) /*14*/ - GEN_MLME_EXT_HANDLER(sizeof (struct disconnect_parm), disconnect_hdl) - GEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), createbss_hdl) - GEN_MLME_EXT_HANDLER(sizeof (struct setopmode_parm), setopmode_hdl) - GEN_MLME_EXT_HANDLER(sizeof (struct sitesurvey_parm), sitesurvey_cmd_hdl) /*18*/ - GEN_MLME_EXT_HANDLER(sizeof (struct setauth_parm), setauth_hdl) - GEN_MLME_EXT_HANDLER(sizeof (struct setkey_parm), setkey_hdl) /*20*/ - GEN_MLME_EXT_HANDLER(sizeof (struct set_stakey_parm), set_stakey_hdl) - GEN_MLME_EXT_HANDLER(sizeof (struct set_assocsta_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct del_assocsta_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct setstapwrstate_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct setbasicrate_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct getbasicrate_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct setdatarate_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct getdatarate_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct setphyinfo_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct getphyinfo_parm), NULL) /*30*/ - GEN_MLME_EXT_HANDLER(sizeof (struct setphy_parm), NULL) - GEN_MLME_EXT_HANDLER(sizeof (struct getphy_parm), NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) /*40*/ - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), add_ba_hdl) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) /*50*/ - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(0, NULL) - GEN_MLME_EXT_HANDLER(sizeof(struct Tx_Beacon_param), tx_beacon_hdl) /*55*/ - - GEN_MLME_EXT_HANDLER(0, mlme_evt_hdl) /*56*/ - GEN_MLME_EXT_HANDLER(0, rtw_drvextra_cmd_hdl) /*57*/ - - GEN_MLME_EXT_HANDLER(0, h2c_msg_hdl) /*58*/ - GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), set_chplan_hdl) /*59*/ -}; - -#endif - -struct C2HEvent_Header -{ - -#ifdef CONFIG_LITTLE_ENDIAN - - unsigned int len:16; - unsigned int ID:8; - unsigned int seq:8; - -#elif defined(CONFIG_BIG_ENDIAN) - - unsigned int seq:8; - unsigned int ID:8; - unsigned int len:16; - -#else - -# error "Must be LITTLE or BIG Endian" - -#endif - - unsigned int rsvd; - -}; - -void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf); -void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf); - -enum rtw_c2h_event -{ - GEN_EVT_CODE(_Read_MACREG)=0, /*0*/ - GEN_EVT_CODE(_Read_BBREG), - GEN_EVT_CODE(_Read_RFREG), - GEN_EVT_CODE(_Read_EEPROM), - GEN_EVT_CODE(_Read_EFUSE), - GEN_EVT_CODE(_Read_CAM), /*5*/ - GEN_EVT_CODE(_Get_BasicRate), - GEN_EVT_CODE(_Get_DataRate), - GEN_EVT_CODE(_Survey), /*8*/ - GEN_EVT_CODE(_SurveyDone), /*9*/ - - GEN_EVT_CODE(_JoinBss) , /*10*/ - GEN_EVT_CODE(_AddSTA), - GEN_EVT_CODE(_DelSTA), - GEN_EVT_CODE(_AtimDone) , - GEN_EVT_CODE(_TX_Report), - GEN_EVT_CODE(_CCX_Report), /*15*/ - GEN_EVT_CODE(_DTM_Report), - GEN_EVT_CODE(_TX_Rate_Statistics), - GEN_EVT_CODE(_C2HLBK), - GEN_EVT_CODE(_FWDBG), - GEN_EVT_CODE(_C2HFEEDBACK), /*20*/ - GEN_EVT_CODE(_ADDBA), - GEN_EVT_CODE(_C2HBCN), - GEN_EVT_CODE(_ReportPwrState), //filen: only for PCIE, USB - GEN_EVT_CODE(_CloseRF), //filen: only for PCIE, work around ASPM - MAX_C2HEVT -}; - - -#ifdef _RTW_MLME_EXT_C_ - -static struct fwevent wlanevents[] = -{ - {0, rtw_dummy_event_callback}, /*0*/ - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, &rtw_survey_event_callback}, /*8*/ - {sizeof (struct surveydone_event), &rtw_surveydone_event_callback}, /*9*/ - - {0, &rtw_joinbss_event_callback}, /*10*/ - {sizeof(struct stassoc_event), &rtw_stassoc_event_callback}, - {sizeof(struct stadel_event), &rtw_stadel_event_callback}, - {0, &rtw_atimdone_event_callback}, - {0, rtw_dummy_event_callback}, - {0, NULL}, /*15*/ - {0, NULL}, - {0, NULL}, - {0, NULL}, - {0, rtw_fwdbg_event_callback}, - {0, NULL}, /*20*/ - {0, NULL}, - {0, NULL}, - {0, &rtw_cpwm_event_callback}, -}; - -#endif//_RTL8192C_CMD_C_ - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp.h b/drivers/net/wireless/rtl8192c/include/rtw_mp.h deleted file mode 100755 index c1e7c5a6e81a..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_mp.h +++ /dev/null @@ -1,634 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef _RTW_MP_H_ -#define _RTW_MP_H_ - -#ifndef PLATFORM_WINDOWS -// 00 - Success -// 11 - Error -#define STATUS_SUCCESS (0x00000000L) -#define STATUS_PENDING (0x00000103L) - -#define STATUS_UNSUCCESSFUL (0xC0000001L) -#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) -#define STATUS_NOT_SUPPORTED (0xC00000BBL) - -#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS) -#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING) -#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L) -#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) -#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L) -#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L) - -#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) -#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES) -#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) -#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) -#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) -#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) -#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) -#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) -#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) -#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) -#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) -#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) -#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) -#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) -#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) -#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL) -#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L) -#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L) -#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L) -#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L) -#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) -#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) -#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) -#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) -#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) -#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) -#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) -#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) -#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL) -#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL) -#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) -#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL) - -#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) -#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L) -#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L) -#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L) -#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) // cause 27 -#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) // cause 35,45 -#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) // cause 37 -#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) // cause 49 -#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) // cause 93 -#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) // cause 3 -#endif /* #ifndef PLATFORM_WINDOWS */ - -#if 0 -#define MPT_NOOP 0 -#define MPT_READ_MAC_1BYTE 1 -#define MPT_READ_MAC_2BYTE 2 -#define MPT_READ_MAC_4BYTE 3 -#define MPT_WRITE_MAC_1BYTE 4 -#define MPT_WRITE_MAC_2BYTE 5 -#define MPT_WRITE_MAC_4BYTE 6 -#define MPT_READ_BB_CCK 7 -#define MPT_WRITE_BB_CCK 8 -#define MPT_READ_BB_OFDM 9 -#define MPT_WRITE_BB_OFDM 10 -#define MPT_READ_RF 11 -#define MPT_WRITE_RF 12 -#define MPT_READ_EEPROM_1BYTE 13 -#define MPT_WRITE_EEPROM_1BYTE 14 -#define MPT_READ_EEPROM_2BYTE 15 -#define MPT_WRITE_EEPROM_2BYTE 16 -#define MPT_SET_CSTHRESHOLD 21 -#define MPT_SET_INITGAIN 22 -#define MPT_SWITCH_BAND 23 -#define MPT_SWITCH_CHANNEL 24 -#define MPT_SET_DATARATE 25 -#define MPT_SWITCH_ANTENNA 26 -#define MPT_SET_TX_POWER 27 -#define MPT_SET_CONT_TX 28 -#define MPT_SET_SINGLE_CARRIER 29 -#define MPT_SET_CARRIER_SUPPRESSION 30 -#define MPT_GET_RATE_TABLE 31 -#define MPT_READ_TSSI 32 -#define MPT_GET_THERMAL_METER 33 -#endif - -#define MAX_MP_XMITBUF_SZ 2048 -#define NR_MP_XMITFRAME 8 - -struct mp_xmit_frame -{ - _list list; - - struct pkt_attrib attrib; - - _pkt *pkt; - - int frame_tag; - - _adapter *padapter; - -#ifdef CONFIG_USB_HCI - - //insert urb, irp, and irpcnt info below... - //max frag_cnt = 8 - - u8 *mem_addr; - u32 sz[8]; - -#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) - PURB pxmit_urb[8]; -#endif - -#ifdef PLATFORM_OS_XP - PIRP pxmit_irp[8]; -#endif - - u8 bpending[8]; - sint ac_tag[8]; - sint last[8]; - uint irpcnt; - uint fragcnt; -#endif /* CONFIG_USB_HCI */ - - uint mem[(MAX_MP_XMITBUF_SZ >> 2)]; -}; - -struct mp_wiparam -{ - u32 bcompleted; - u32 act_type; - u32 io_offset; - u32 io_value; -}; - -typedef void(*wi_act_func)(void* padapter); - -#ifdef PLATFORM_WINDOWS -struct mp_wi_cntx -{ - u8 bmpdrv_unload; - - // Work Item - NDIS_WORK_ITEM mp_wi; - NDIS_EVENT mp_wi_evt; - _lock mp_wi_lock; - u8 bmp_wi_progress; - wi_act_func curractfunc; - // Variable needed in each implementation of CurrActFunc. - struct mp_wiparam param; -}; -#endif - -struct mp_tx -{ - u8 stop; - u32 count, sended; - u8 payload; - struct pkt_attrib attrib; - struct tx_desc desc; - u8 *pallocated_buf; - u8 *buf; - u32 buf_size, write_size; - _thread_hdl_ PktTxThread; -}; - -//#if (MP_DRIVER == 1) -#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) -#ifdef CONFIG_RTL8192C -#include -#endif -#ifdef CONFIG_RTL8192D -#include -#endif -#define MP_MAX_LINES 1000 -#define MP_MAX_LINES_BYTES 256 -#define u1Byte u8 -#define s1Byte s8 -#define u4Byte u32 -#define s4Byte s32 -typedef VOID (*MPT_WORK_ITEM_HANDLER)(IN PVOID Adapter); -typedef struct _MPT_CONTEXT -{ - // Indicate if we have started Mass Production Test. - BOOLEAN bMassProdTest; - - // Indicate if the driver is unloading or unloaded. - BOOLEAN bMptDrvUnload; - - /* 8190 PCI does not support NDIS_WORK_ITEM. */ - // Work Item for Mass Production Test. - //NDIS_WORK_ITEM MptWorkItem; -// RT_WORK_ITEM MptWorkItem; - // Event used to sync the case unloading driver and MptWorkItem is still in progress. -// NDIS_EVENT MptWorkItemEvent; - // To protect the following variables. -// NDIS_SPIN_LOCK MptWorkItemSpinLock; - // Indicate a MptWorkItem is scheduled and not yet finished. - BOOLEAN bMptWorkItemInProgress; - // An instance which implements function and context of MptWorkItem. - MPT_WORK_ITEM_HANDLER CurrMptAct; - - // 1=Start, 0=Stop from UI. - ULONG MptTestStart; - // _TEST_MODE, defined in MPT_Req2.h - ULONG MptTestItem; - // Variable needed in each implementation of CurrMptAct. - ULONG MptActType; // Type of action performed in CurrMptAct. - // The Offset of IO operation is depend of MptActType. - ULONG MptIoOffset; - // The Value of IO operation is depend of MptActType. - ULONG MptIoValue; - // The RfPath of IO operation is depend of MptActType. - ULONG MptRfPath; - - WIRELESS_MODE MptWirelessModeToSw; // Wireless mode to switch. - u1Byte MptChannelToSw; // Channel to switch. - u1Byte MptInitGainToSet; // Initial gain to set. - //ULONG bMptAntennaA; // TRUE if we want to use antenna A. - ULONG MptBandWidth; // bandwidth to switch. - ULONG MptRateIndex; // rate index. - // Register value kept for Single Carrier Tx test. - u1Byte btMpCckTxPower; - // Register value kept for Single Carrier Tx test. - u1Byte btMpOfdmTxPower; - // For MP Tx Power index - u1Byte TxPwrLevel[2]; // rf-A, rf-B - - // Content of RCR Regsiter for Mass Production Test. - ULONG MptRCR; - // TRUE if we only receive packets with specific pattern. - BOOLEAN bMptFilterPattern; - // Rx OK count, statistics used in Mass Production Test. - ULONG MptRxOkCnt; - // Rx CRC32 error count, statistics used in Mass Production Test. - ULONG MptRxCrcErrCnt; - - BOOLEAN bCckContTx; // TRUE if we are in CCK Continuous Tx test. - BOOLEAN bOfdmContTx; // TRUE if we are in OFDM Continuous Tx test. - BOOLEAN bStartContTx; // TRUE if we have start Continuous Tx test. - // TRUE if we are in Single Carrier Tx test. - BOOLEAN bSingleCarrier; - // TRUE if we are in Carrier Suppression Tx Test. - BOOLEAN bCarrierSuppression; - //TRUE if we are in Single Tone Tx test. - BOOLEAN bSingleTone; - - // ACK counter asked by K.Y.. - BOOLEAN bMptEnableAckCounter; - ULONG MptAckCounter; - - // SD3 Willis For 8192S to save 1T/2T RF table for ACUT Only fro ACUT delete later ~~~! - //s1Byte BufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT]; - //s1Byte BufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES]; - //s4Byte RfReadLine[2]; - - u1Byte APK_bound[2]; //for APK path A/path B - BOOLEAN bMptIndexEven; - - u1Byte backup0xc50; - u1Byte backup0xc58; - u1Byte backup0xc30; -}MPT_CONTEXT, *PMPT_CONTEXT; -#endif -//#endif - -/* E-Fuse */ -#ifdef CONFIG_RTL8192D -#define EFUSE_MAP_SIZE 255 -#endif -#ifdef CONFIG_RTL8192C -#define EFUSE_MAP_SIZE 128 -#endif -#define EFUSE_MAX_SIZE 512 - -/* end of E-Fuse */ - -struct mp_priv -{ - _adapter *papdater; - - //Testing Flag - u32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD) - - u32 prev_fw_state; - - //OID cmd handler - struct mp_wiparam workparam; -// u8 act_in_progress; - - //Tx Section - u8 TID; - u32 tx_pktcount; - struct mp_tx tx; - - //Rx Section - u32 rx_pktcount; - u32 rx_crcerrpktcount; - u32 rx_pktloss; - - struct recv_stat rxstat; - - //RF/BB relative - u8 channel; - u8 bandwidth; - u8 prime_channel_offset; - u8 txpoweridx; - u8 txpoweridx_b; - u8 rateidx; - u32 preamble; -// u8 modem; - -// u32 curr_crystalcap; - - u16 antenna_tx; - u16 antenna_rx; -// u8 curr_rfpath; - - u8 check_mp_pkt; - -// uint ForcedDataRate; - - struct wlan_network mp_network; - NDIS_802_11_MAC_ADDRESS network_macaddr; - -#ifdef PLATFORM_WINDOWS - u32 rx_testcnt; - u32 rx_testcnt1; - u32 rx_testcnt2; - u32 tx_testcnt; - u32 tx_testcnt1; - - struct mp_wi_cntx wi_cntx; - - u8 h2c_result; - u8 h2c_seqnum; - u16 h2c_cmdcode; - u8 h2c_resp_parambuf[512]; - _lock h2c_lock; - _lock wkitm_lock; - u32 h2c_cmdcnt; - NDIS_EVENT h2c_cmd_evt; - NDIS_EVENT c2h_set; - NDIS_EVENT h2c_clr; - NDIS_EVENT cpwm_int; - - NDIS_EVENT scsir_full_evt; - NDIS_EVENT scsiw_empty_evt; -#endif - - u8 *pallocated_mp_xmitframe_buf; - u8 *pmp_xmtframe_buf; - _queue free_mp_xmitqueue; - u32 free_mp_xmitframe_cnt; - - MPT_CONTEXT MptCtx; -}; - -typedef struct _IOCMD_STRUCT_ { - u8 cmdclass; - u16 value; - u8 index; -}IOCMD_STRUCT; - -struct rf_reg_param { - u32 path; - u32 offset; - u32 value; -}; - -struct bb_reg_param { - u32 offset; - u32 value; -}; -//======================================================================= - -#define LOWER _TRUE -#define RAISE _FALSE - -/* Hardware Registers */ -#if 0 -#if 0 -#define IOCMD_CTRL_REG 0x102502C0 -#define IOCMD_DATA_REG 0x102502C4 -#else -#define IOCMD_CTRL_REG 0x10250370 -#define IOCMD_DATA_REG 0x10250374 -#endif - -#define IOCMD_GET_THERMAL_METER 0xFD000028 - -#define IOCMD_CLASS_BB_RF 0xF0 -#define IOCMD_BB_READ_IDX 0x00 -#define IOCMD_BB_WRITE_IDX 0x01 -#define IOCMD_RF_READ_IDX 0x02 -#define IOCMD_RF_WRIT_IDX 0x03 -#endif -#define BB_REG_BASE_ADDR 0x800 - -/* MP variables */ -#if 0 -#define _2MAC_MODE_ 0 -#define _LOOPBOOK_MODE_ 1 -#endif -typedef enum _MP_MODE_ { - MP_OFF, - MP_ON, - MP_ERR, - MP_CONTINUOUS_TX, - MP_SINGLE_CARRIER_TX, - MP_CARRIER_SUPPRISSION_TX, - MP_SINGLE_TONE_TX, - MP_PACKET_TX, - MP_PACKET_RX -} MP_MODE; - -#ifdef CONFIG_RTL8192C -#define RF_PATH_A RF90_PATH_A -#define RF_PATH_B RF90_PATH_B -#define RF_PATH_C RF90_PATH_C -#define RF_PATH_D RF90_PATH_D - -#define MAX_RF_PATH_NUMS RF90_PATH_MAX -#else -#define RF_PATH_A 0 -#define RF_PATH_B 1 -#define RF_PATH_C 2 -#define RF_PATH_D 3 - -#define MAX_RF_PATH_NUMS 2 -#endif - -static u8 mpdatarate[NumRates] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff}; - -/* MP set force data rate base on the definition. */ -typedef enum _MPT_RATE_INDEX -{ - /* CCK rate. */ - MPT_RATE_1M, /* 0 */ - MPT_RATE_2M, - MPT_RATE_55M, - MPT_RATE_11M, /* 3 */ - - /* OFDM rate. */ - MPT_RATE_6M, /* 4 */ - MPT_RATE_9M, - MPT_RATE_12M, - MPT_RATE_18M, - MPT_RATE_24M, - MPT_RATE_36M, - MPT_RATE_48M, - MPT_RATE_54M, /* 11 */ - - /* HT rate. */ - MPT_RATE_MCS0, /* 12 */ - MPT_RATE_MCS1, - MPT_RATE_MCS2, - MPT_RATE_MCS3, - MPT_RATE_MCS4, - MPT_RATE_MCS5, - MPT_RATE_MCS6, - MPT_RATE_MCS7, /* 19 */ - MPT_RATE_MCS8, - MPT_RATE_MCS9, - MPT_RATE_MCS10, - MPT_RATE_MCS11, - MPT_RATE_MCS12, - MPT_RATE_MCS13, - MPT_RATE_MCS14, - MPT_RATE_MCS15, /* 27 */ - MPT_RATE_LAST -}MPT_RATE_E, *PMPT_RATE_E; - -#if 0 -// Represent Channel Width in HT Capabilities -typedef enum _HT_CHANNEL_WIDTH { - HT_CHANNEL_WIDTH_20 = 0, - HT_CHANNEL_WIDTH_40 = 1, -}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH; -#endif - - -#define MAX_TX_PWR_INDEX_N_MODE 64 // 0x3F - -typedef enum _POWER_MODE_ { - POWER_LOW = 0, - POWER_NORMAL -}POWER_MODE; - - -#define RX_PKT_BROADCAST 1 -#define RX_PKT_DEST_ADDR 2 -#define RX_PKT_PHY_MATCH 3 - -#if 0 -#define RPTMaxCount 0x000FFFFF; - -// parameter 1 : BitMask -// bit 0 : OFDM PPDU -// bit 1 : OFDM False Alarm -// bit 2 : OFDM MPDU OK -// bit 3 : OFDM MPDU Fail -// bit 4 : CCK PPDU -// bit 5 : CCK False Alarm -// bit 6 : CCK MPDU ok -// bit 7 : CCK MPDU fail -// bit 8 : HT PPDU counter -// bit 9 : HT false alarm -// bit 10 : HT MPDU total -// bit 11 : HT MPDU OK -// bit 12 : HT MPDU fail -// bit 15 : RX full drop -typedef enum _RXPHY_BITMASK_ -{ - OFDM_PPDU_BIT = 0, - OFDM_FALSE_BIT, - OFDM_MPDU_OK_BIT, - OFDM_MPDU_FAIL_BIT, - CCK_PPDU_BIT, - CCK_FALSE_BIT, - CCK_MPDU_OK_BIT, - CCK_MPDU_FAIL_BIT, - HT_PPDU_BIT, - HT_FALSE_BIT, - HT_MPDU_BIT, - HT_MPDU_OK_BIT, - HT_MPDU_FAIL_BIT, -} RXPHY_BITMASK; -#endif - -typedef enum _ENCRY_CTRL_STATE_ { - HW_CONTROL, //hw encryption& decryption - SW_CONTROL, //sw encryption& decryption - HW_ENCRY_SW_DECRY, //hw encryption & sw decryption - SW_ENCRY_HW_DECRY //sw encryption & hw decryption -}ENCRY_CTRL_STATE; - - -//======================================================================= -//extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv); -//extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe); - -extern s32 init_mp_priv(PADAPTER padapter); -extern void free_mp_priv(struct mp_priv *pmp_priv); -extern s32 MPT_InitializeAdapter(PADAPTER padapter, u8 Channel); -extern void MPT_DeInitAdapter(PADAPTER padapter); -extern s32 mp_start_test(PADAPTER padapter); -extern void mp_stop_test(PADAPTER padapter); - -//======================================================================= -//extern void IQCalibrateBcut(PADAPTER pAdapter); - -//extern u32 bb_reg_read(PADAPTER Adapter, u16 offset); -//extern u8 bb_reg_write(PADAPTER Adapter, u16 offset, u32 value); -//extern u32 rf_reg_read(PADAPTER Adapter, u8 path, u8 offset); -//extern u8 rf_reg_write(PADAPTER Adapter, u8 path, u8 offset, u32 value); - -//extern u32 get_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask); -//extern u8 set_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask, u32 value); -//extern u32 get_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask); -//extern u8 set_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask, u32 value); - -extern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz); -extern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz); -extern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask); -extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val); -extern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr); -extern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val); - -extern void SetChannel(PADAPTER pAdapter); -extern void SetBandwidth(PADAPTER pAdapter); -extern void SetTxPower(PADAPTER pAdapter); -extern void SetAntennaPathPower(PADAPTER pAdapter); -//extern void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset); -extern void SetDataRate(PADAPTER pAdapter); - -extern void SetAntenna(PADAPTER pAdapter); - -//extern void SetCrystalCap(PADAPTER pAdapter); - -extern s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther); -extern void GetThermalMeter(PADAPTER pAdapter, u8 *value); - -extern void SetContinuousTx(PADAPTER pAdapter, u8 bStart); -extern void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart); -extern void SetSingleToneTx(PADAPTER pAdapter, u8 bStart); -extern void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); - -extern void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc); -extern void SetPacketTx(PADAPTER padapter); -extern void SetPacketRx(PADAPTER pAdapter, u8 bStartRx); - -extern void ResetPhyRxPktCount(PADAPTER pAdapter); -extern u32 GetPhyRxPktReceived(PADAPTER pAdapter); -extern u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter); - -extern s32 SetPowerTracking(PADAPTER padapter, u8 enable); -extern void GetPowerTracking(PADAPTER padapter, u8 *enable); - -extern u32 mp_query_psd(PADAPTER pAdapter, u8 *data); - -#endif //_RTW_MP_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h b/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h deleted file mode 100755 index e16df404bf90..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h +++ /dev/null @@ -1,596 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef _RTW_MP_IOCTL_H_ -#define _RTW_MP_IOCTL_H_ - -//#include -//#include -#include -#include -#include -#include -#include -#include - -#if 0 -#define TESTFWCMDNUMBER 1000000 -#define TEST_H2CINT_WAIT_TIME 500 -#define TEST_C2HINT_WAIT_TIME 500 -#define HCI_TEST_SYSCFG_HWMASK 1 -#define _BUSCLK_40M (4 << 2) -#endif -//------------------------------------------------------------------------------ -typedef struct CFG_DBG_MSG_STRUCT { - u32 DebugLevel; - u32 DebugComponent_H32; - u32 DebugComponent_L32; -}CFG_DBG_MSG_STRUCT,*PCFG_DBG_MSG_STRUCT; - -typedef struct _RW_REG { - u32 offset; - u32 width; - u32 value; -}mp_rw_reg,RW_Reg, *pRW_Reg; - -//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM -typedef struct _EEPROM_RW_PARAM { - u32 offset; - u16 value; -}eeprom_rw_param,EEPROM_RWParam, *pEEPROM_RWParam; - -typedef struct _EFUSE_ACCESS_STRUCT_ { - u16 start_addr; - u16 cnts; - u8 data[0]; -}EFUSE_ACCESS_STRUCT, *PEFUSE_ACCESS_STRUCT; - -typedef struct _BURST_RW_REG { - u32 offset; - u32 len; - u8 Data[256]; -}burst_rw_reg,Burst_RW_Reg, *pBurst_RW_Reg; - -typedef struct _USB_VendorReq{ - u8 bRequest; - u16 wValue; - u16 wIndex; - u16 wLength; - u8 u8Dir;//0:OUT, 1:IN - u8 u8InData; -}usb_vendor_req, USB_VendorReq, *pUSB_VendorReq; - -typedef struct _DR_VARIABLE_STRUCT_ { - u8 offset; - u32 variable; -}DR_VARIABLE_STRUCT; - -//int mp_start_joinbss(_adapter *padapter, NDIS_802_11_SSID *pssid); - -//void _irqlevel_changed_(_irqL *irqlevel, /*BOOLEAN*/unsigned char bLower); -#ifdef PLATFORM_OS_XP -static void _irqlevel_changed_(_irqL *irqlevel, u8 bLower) -{ - - if (bLower == LOWER) { - *irqlevel = KeGetCurrentIrql(); - - if (*irqlevel > PASSIVE_LEVEL) { - KeLowerIrql(PASSIVE_LEVEL); - } - } else { - if (KeGetCurrentIrql() == PASSIVE_LEVEL) { - KeRaiseIrql(DISPATCH_LEVEL, irqlevel); - } - } - -} -#else -#define _irqlevel_changed_(a,b) -#endif - -//oid_rtl_seg_81_80_00 -NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv* poid_par_priv); -//oid_rtl_seg_81_80_20 -NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv* poid_par_priv); - - -//oid_rtl_seg_81_87 -NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv* poid_par_priv); - - -//oid_rtl_seg_81_85 -NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); - - -// oid_rtl_seg_87_11_00 -NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv* poid_par_priv); -// oid_rtl_seg_87_11_20 -NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv* poid_par_priv); -//oid_rtl_seg_87_11_50 -NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv* poid_par_priv); -//oid_rtl_seg_87_11_F0 -NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv* poid_par_priv); - - -//oid_rtl_seg_87_12_00 -NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); -NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv* poid_par_priv); - -NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv); - -#ifdef _RTW_MP_IOCTL_C_ - -const struct oid_obj_priv oid_rtl_seg_81_80_00[] = -{ - {1, &oid_null_function}, //0x00 OID_RT_PRO_RESET_DUT - {1, &oid_rt_pro_set_data_rate_hdl}, //0x01 - {1, &oid_rt_pro_start_test_hdl}, //0x02 - {1, &oid_rt_pro_stop_test_hdl}, //0x03 - {1, &oid_null_function}, //0x04 OID_RT_PRO_SET_PREAMBLE - {1, &oid_null_function}, //0x05 OID_RT_PRO_SET_SCRAMBLER - {1, &oid_null_function}, //0x06 OID_RT_PRO_SET_FILTER_BB - {1, &oid_null_function}, //0x07 OID_RT_PRO_SET_MANUAL_DIVERSITY_BB - {1, &oid_rt_pro_set_channel_direct_call_hdl}, //0x08 - {1, &oid_null_function}, //0x09 OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL - {1, &oid_null_function}, //0x0A OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL - {1, &oid_rt_pro_set_continuous_tx_hdl}, //0x0B OID_RT_PRO_SET_TX_CONTINUOUS_DIRECT_CALL - {1, &oid_rt_pro_set_single_carrier_tx_hdl}, //0x0C OID_RT_PRO_SET_SINGLE_CARRIER_TX_CONTINUOUS - {1, &oid_null_function}, //0x0D OID_RT_PRO_SET_TX_ANTENNA_BB - {1, &oid_rt_pro_set_antenna_bb_hdl}, //0x0E - {1, &oid_null_function}, //0x0F OID_RT_PRO_SET_CR_SCRAMBLER - {1, &oid_null_function}, //0x10 OID_RT_PRO_SET_CR_NEW_FILTER - {1, &oid_rt_pro_set_tx_power_control_hdl}, //0x11 OID_RT_PRO_SET_TX_POWER_CONTROL - {1, &oid_null_function}, //0x12 OID_RT_PRO_SET_CR_TX_CONFIG - {1, &oid_null_function}, //0x13 OID_RT_PRO_GET_TX_POWER_CONTROL - {1, &oid_null_function}, //0x14 OID_RT_PRO_GET_CR_SIGNAL_QUALITY - {1, &oid_null_function}, //0x15 OID_RT_PRO_SET_CR_SETPOINT - {1, &oid_null_function}, //0x16 OID_RT_PRO_SET_INTEGRATOR - {1, &oid_null_function}, //0x17 OID_RT_PRO_SET_SIGNAL_QUALITY - {1, &oid_null_function}, //0x18 OID_RT_PRO_GET_INTEGRATOR - {1, &oid_null_function}, //0x19 OID_RT_PRO_GET_SIGNAL_QUALITY - {1, &oid_null_function}, //0x1A OID_RT_PRO_QUERY_EEPROM_TYPE - {1, &oid_null_function}, //0x1B OID_RT_PRO_WRITE_MAC_ADDRESS - {1, &oid_null_function}, //0x1C OID_RT_PRO_READ_MAC_ADDRESS - {1, &oid_null_function}, //0x1D OID_RT_PRO_WRITE_CIS_DATA - {1, &oid_null_function}, //0x1E OID_RT_PRO_READ_CIS_DATA - {1, &oid_null_function} //0x1F OID_RT_PRO_WRITE_POWER_CONTROL - -}; - -const struct oid_obj_priv oid_rtl_seg_81_80_20[] = -{ - {1, &oid_null_function}, //0x20 OID_RT_PRO_READ_POWER_CONTROL - {1, &oid_null_function}, //0x21 OID_RT_PRO_WRITE_EEPROM - {1, &oid_null_function}, //0x22 OID_RT_PRO_READ_EEPROM - {1, &oid_rt_pro_reset_tx_packet_sent_hdl}, //0x23 - {1, &oid_rt_pro_query_tx_packet_sent_hdl}, //0x24 - {1, &oid_rt_pro_reset_rx_packet_received_hdl}, //0x25 - {1, &oid_rt_pro_query_rx_packet_received_hdl}, //0x26 - {1, &oid_rt_pro_query_rx_packet_crc32_error_hdl}, //0x27 - {1, &oid_null_function}, //0x28 OID_RT_PRO_QUERY_CURRENT_ADDRESS - {1, &oid_null_function}, //0x29 OID_RT_PRO_QUERY_PERMANENT_ADDRESS - {1, &oid_null_function}, //0x2A OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS - {1, &oid_rt_pro_set_carrier_suppression_tx_hdl},//0x2B OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX - {1, &oid_null_function}, //0x2C OID_RT_PRO_RECEIVE_PACKET - {1, &oid_null_function}, //0x2D OID_RT_PRO_WRITE_EEPROM_BYTE - {1, &oid_null_function}, //0x2E OID_RT_PRO_READ_EEPROM_BYTE - {1, &oid_rt_pro_set_modulation_hdl} //0x2F - -}; - -const struct oid_obj_priv oid_rtl_seg_81_80_40[] = -{ - {1, &oid_null_function}, //0x40 - {1, &oid_null_function}, //0x41 - {1, &oid_null_function}, //0x42 - {1, &oid_rt_pro_set_single_tone_tx_hdl}, //0x43 - {1, &oid_null_function}, //0x44 - {1, &oid_null_function} //0x45 -}; - -const struct oid_obj_priv oid_rtl_seg_81_80_80[] = -{ - {1, &oid_null_function}, //0x80 OID_RT_DRIVER_OPTION - {1, &oid_null_function}, //0x81 OID_RT_RF_OFF - {1, &oid_null_function} //0x82 OID_RT_AUTH_STATUS - -}; - -const struct oid_obj_priv oid_rtl_seg_81_85[] = -{ - {1, &oid_rt_wireless_mode_hdl} //0x00 OID_RT_WIRELESS_MODE -}; - -struct oid_obj_priv oid_rtl_seg_81_87[] = -{ - {1, &oid_null_function}, //0x80 OID_RT_PRO8187_WI_POLL - {1, &oid_rt_pro_write_bb_reg_hdl}, //0x81 - {1, &oid_rt_pro_read_bb_reg_hdl}, //0x82 - {1, &oid_rt_pro_write_rf_reg_hdl}, //0x82 - {1, &oid_rt_pro_read_rf_reg_hdl} //0x83 -}; - -struct oid_obj_priv oid_rtl_seg_87_11_00[] = -{ - {1, &oid_rt_pro8711_join_bss_hdl}, //0x00 //S - {1, &oid_rt_pro_read_register_hdl}, //0x01 - {1, &oid_rt_pro_write_register_hdl}, //0x02 - {1, &oid_rt_pro_burst_read_register_hdl}, //0x03 - {1, &oid_rt_pro_burst_write_register_hdl}, //0x04 - {1, &oid_rt_pro_write_txcmd_hdl}, //0x05 - {1, &oid_rt_pro_read16_eeprom_hdl}, //0x06 - {1, &oid_rt_pro_write16_eeprom_hdl}, //0x07 - {1, &oid_null_function}, //0x08 OID_RT_PRO_H2C_SET_COMMAND - {1, &oid_null_function}, //0x09 OID_RT_PRO_H2C_QUERY_RESULT - {1, &oid_rt_pro8711_wi_poll_hdl}, //0x0A - {1, &oid_rt_pro8711_pkt_loss_hdl}, //0x0B - {1, &oid_rt_rd_attrib_mem_hdl}, //0x0C - {1, &oid_rt_wr_attrib_mem_hdl}, //0x0D - {1, &oid_null_function}, //0x0E - {1, &oid_null_function}, //0x0F - {1, &oid_null_function}, //0x10 OID_RT_PRO_H2C_CMD_MODE - {1, &oid_null_function}, //0x11 OID_RT_PRO_H2C_CMD_RSP_MODE - {1, &oid_null_function}, //0X12 OID_RT_PRO_WAIT_C2H_EVENT - {1, &oid_null_function}, //0X13 OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST - {1, &oid_null_function}, //0X14 OID_RT_PRO_SCSI_ACCESS_TEST - {1, &oid_null_function}, //0X15 OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT - {1, &oid_null_function}, //0X16 OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN - {1, &oid_null_function}, //0X17 OID_RT_RRO_RX_PKT_VIA_IOCTRL - {1, &oid_null_function}, //0X18 OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL - {1, &oid_null_function}, //0X19 OID_RT_RPO_SET_PWRMGT_TEST - {1, &oid_null_function}, //0X1A - {1, &oid_null_function}, //0X1B OID_RT_PRO_QRY_PWRMGT_TEST - {1, &oid_null_function}, //0X1C OID_RT_RPO_ASYNC_RWIO_TEST - {1, &oid_null_function}, //0X1D OID_RT_RPO_ASYNC_RWIO_POLL - {1, &oid_rt_pro_set_rf_intfs_hdl}, //0X1E - {1, &oid_rt_poll_rx_status_hdl} //0X1F -}; - -struct oid_obj_priv oid_rtl_seg_87_11_20[] = -{ - {1, &oid_rt_pro_cfg_debug_message_hdl}, //0x20 - {1, &oid_rt_pro_set_data_rate_ex_hdl}, //0x21 - {1, &oid_rt_pro_set_basic_rate_hdl}, //0x22 - {1, &oid_rt_pro_read_tssi_hdl}, //0x23 - {1, &oid_rt_pro_set_power_tracking_hdl} //0x24 -}; - - -struct oid_obj_priv oid_rtl_seg_87_11_50[] = -{ - {1, &oid_rt_pro_qry_pwrstate_hdl}, //0x50 - {1, &oid_rt_pro_set_pwrstate_hdl} //0x51 -}; - -struct oid_obj_priv oid_rtl_seg_87_11_80[] = -{ - {1, &oid_null_function} //0x80 -}; - -struct oid_obj_priv oid_rtl_seg_87_11_B0[] = -{ - {1, &oid_null_function} //0xB0 -}; - -struct oid_obj_priv oid_rtl_seg_87_11_F0[] = -{ - {1, &oid_null_function}, //0xF0 - {1, &oid_null_function}, //0xF1 - {1, &oid_null_function}, //0xF2 - {1, &oid_null_function}, //0xF3 - {1, &oid_null_function}, //0xF4 - {1, &oid_null_function}, //0xF5 - {1, &oid_null_function}, //0xF6 - {1, &oid_null_function}, //0xF7 - {1, &oid_null_function}, //0xF8 - {1, &oid_null_function}, //0xF9 - {1, &oid_null_function}, //0xFA - {1, &oid_rt_pro_h2c_set_rate_table_hdl}, //0xFB - {1, &oid_rt_pro_h2c_get_rate_table_hdl}, //0xFC - {1, &oid_null_function}, //0xFD - {1, &oid_null_function}, //0xFE OID_RT_PRO_H2C_C2H_LBK_TEST - {1, &oid_null_function} //0xFF - -}; - -struct oid_obj_priv oid_rtl_seg_87_12_00[]= -{ - {1, &oid_rt_pro_encryption_ctrl_hdl}, //0x00 Q&S - {1, &oid_rt_pro_add_sta_info_hdl}, //0x01 S - {1, &oid_rt_pro_dele_sta_info_hdl}, //0x02 S - {1, &oid_rt_pro_query_dr_variable_hdl}, //0x03 Q - {1, &oid_rt_pro_rx_packet_type_hdl}, //0x04 Q,S - {1, &oid_rt_pro_read_efuse_hdl}, //0x05 Q OID_RT_PRO_READ_EFUSE - {1, &oid_rt_pro_write_efuse_hdl}, //0x06 S OID_RT_PRO_WRITE_EFUSE - {1, &oid_rt_pro_rw_efuse_pgpkt_hdl}, //0x07 Q,S - {1, &oid_rt_get_efuse_current_size_hdl}, //0x08 Q - {1, &oid_rt_set_bandwidth_hdl}, //0x09 - {1, &oid_rt_set_crystal_cap_hdl}, //0x0a - {1, &oid_rt_set_rx_packet_type_hdl}, //0x0b S - {1, &oid_rt_get_efuse_max_size_hdl}, //0x0c - {1, &oid_rt_pro_set_tx_agc_offset_hdl}, //0x0d - {1, &oid_rt_pro_set_pkt_test_mode_hdl}, //0x0e - {1, &oid_null_function}, //0x0f OID_RT_PRO_FOR_EVM_TEST_SETTING - {1, &oid_rt_get_thermal_meter_hdl}, //0x10 Q OID_RT_PRO_GET_THERMAL_METER - {1, &oid_rt_reset_phy_rx_packet_count_hdl}, //0x11 S OID_RT_RESET_PHY_RX_PACKET_COUNT - {1, &oid_rt_get_phy_rx_packet_received_hdl}, //0x12 Q OID_RT_GET_PHY_RX_PACKET_RECEIVED - {1, &oid_rt_get_phy_rx_packet_crc32_error_hdl}, //0x13 Q OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR - {1, &oid_rt_set_power_down_hdl}, //0x14 Q OID_RT_SET_POWER_DOWN - {1, &oid_rt_get_power_mode_hdl} //0x15 Q OID_RT_GET_POWER_MODE -}; - -#else /* _RTL871X_MP_IOCTL_C_ */ - -extern struct oid_obj_priv oid_rtl_seg_81_80_00[32]; -extern struct oid_obj_priv oid_rtl_seg_81_80_20[16]; -extern struct oid_obj_priv oid_rtl_seg_81_80_40[6]; -extern struct oid_obj_priv oid_rtl_seg_81_80_80[3]; - -extern struct oid_obj_priv oid_rtl_seg_81_85[1]; -extern struct oid_obj_priv oid_rtl_seg_81_87[5]; - -extern struct oid_obj_priv oid_rtl_seg_87_11_00[32]; -extern struct oid_obj_priv oid_rtl_seg_87_11_20[5]; -extern struct oid_obj_priv oid_rtl_seg_87_11_50[2]; -extern struct oid_obj_priv oid_rtl_seg_87_11_80[1]; -extern struct oid_obj_priv oid_rtl_seg_87_11_B0[1]; -extern struct oid_obj_priv oid_rtl_seg_87_11_F0[16]; - -extern struct oid_obj_priv oid_rtl_seg_87_12_00[32]; - -#endif /* _RTL871X_MP_IOCTL_C_ */ - -struct rwreg_param{ - u32 offset; - u32 width; - u32 value; -}; - -struct bbreg_param{ - u32 offset; - u32 phymask; - u32 value; -}; -/* -struct rfchannel_param{ - u32 ch; - u32 modem; -}; -*/ -struct txpower_param{ - u32 pwr_index; -}; - - -struct datarate_param{ - u32 rate_index; -}; - - -struct rfintfs_parm { - u32 rfintfs; -}; - -typedef struct _mp_xmit_parm_ { - u8 enable; - u32 count; - u16 length; - u8 payload_type; - u8 da[ETH_ALEN]; -}MP_XMIT_PARM, *PMP_XMIT_PARM; - -struct mp_xmit_packet { - u32 len; - u32 mem[MAX_MP_XMITBUF_SZ >> 2]; -}; - -struct psmode_param { - u32 ps_mode; - u32 smart_ps; -}; - -//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM -struct eeprom_rw_param { - u32 offset; - u16 value; -}; - -struct mp_ioctl_handler { - u32 paramsize; - u32 (*handler)(struct oid_par_priv* poid_par_priv); - u32 oid; -}; - -struct mp_ioctl_param{ - u32 subcode; - u32 len; - u8 data[0]; -}; - -#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_ - -enum RTL871X_MP_IOCTL_SUBCODE { - GEN_MP_IOCTL_SUBCODE(MP_START), /*0*/ - GEN_MP_IOCTL_SUBCODE(MP_STOP), - GEN_MP_IOCTL_SUBCODE(READ_REG), - GEN_MP_IOCTL_SUBCODE(WRITE_REG), - GEN_MP_IOCTL_SUBCODE(READ_BB_REG), - GEN_MP_IOCTL_SUBCODE(WRITE_BB_REG), /*5*/ - GEN_MP_IOCTL_SUBCODE(READ_RF_REG), - GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG), - GEN_MP_IOCTL_SUBCODE(SET_CHANNEL), - GEN_MP_IOCTL_SUBCODE(SET_TXPOWER), - GEN_MP_IOCTL_SUBCODE(SET_DATARATE), /*10*/ - GEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH), - GEN_MP_IOCTL_SUBCODE(SET_ANTENNA), - GEN_MP_IOCTL_SUBCODE(CNTU_TX), - GEN_MP_IOCTL_SUBCODE(SC_TX), - GEN_MP_IOCTL_SUBCODE(CS_TX), /*15*/ - GEN_MP_IOCTL_SUBCODE(ST_TX), - GEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET), - GEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE), - GEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT), - GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV), /*20*/ - GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR), - GEN_MP_IOCTL_SUBCODE(READ16_EEPROM), - GEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM), - GEN_MP_IOCTL_SUBCODE(EFUSE), - GEN_MP_IOCTL_SUBCODE(EFUSE_MAP), /*25*/ - GEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE), - GEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE), - GEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER), - GEN_MP_IOCTL_SUBCODE(SET_PTM), - GEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN), /*30*/ - GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO), - GEN_MP_IOCTL_SUBCODE(SET_DM_BT), /*35*/ - GEN_MP_IOCTL_SUBCODE(DEL_BA), /*36*/ - GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS), /*37*/ - MAX_MP_IOCTL_SUBCODE, -}; - -u32 mp_ioctl_xmit_packet_hdl(struct oid_par_priv* poid_par_priv); - -#ifdef _RTW_MP_IOCTL_C_ - -#define GEN_MP_IOCTL_HANDLER(sz, hdl, oid) {sz, hdl, oid}, - -#define EXT_MP_IOCTL_HANDLER(sz, subcode, oid) {sz, mp_ioctl_ ## subcode ## _hdl, oid}, - - -struct mp_ioctl_handler mp_ioctl_hdl[] = { - -/*0*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_start_test_hdl, OID_RT_PRO_START_TEST) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_stop_test_hdl, OID_RT_PRO_STOP_TEST) - - GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_read_register_hdl, OID_RT_PRO_READ_REGISTER) - GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_write_register_hdl, OID_RT_PRO_WRITE_REGISTER) - GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_read_bb_reg_hdl, OID_RT_PRO_READ_BB_REG) -/*5*/ GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_write_bb_reg_hdl, OID_RT_PRO_WRITE_BB_REG) - GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_read_rf_reg_hdl, OID_RT_PRO_RF_READ_REGISTRY) - GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_write_rf_reg_hdl, OID_RT_PRO_RF_WRITE_REGISTRY) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_channel_direct_call_hdl, OID_RT_PRO_SET_CHANNEL_DIRECT_CALL) - GEN_MP_IOCTL_HANDLER(sizeof(struct txpower_param), oid_rt_pro_set_tx_power_control_hdl, OID_RT_PRO_SET_TX_POWER_CONTROL) -/*10*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_data_rate_hdl, OID_RT_PRO_SET_DATA_RATE) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_bandwidth_hdl, OID_RT_SET_BANDWIDTH) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_antenna_bb_hdl, OID_RT_PRO_SET_ANTENNA_BB) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_continuous_tx_hdl, OID_RT_PRO_SET_CONTINUOUS_TX) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_carrier_tx_hdl, OID_RT_PRO_SET_SINGLE_CARRIER_TX) -/*15*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_carrier_suppression_tx_hdl, OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_tone_tx_hdl, OID_RT_PRO_SET_SINGLE_TONE_TX) - - EXT_MP_IOCTL_HANDLER(0, xmit_packet, 0) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_rx_packet_type_hdl, OID_RT_SET_RX_PACKET_TYPE) - GEN_MP_IOCTL_HANDLER(0, oid_rt_reset_phy_rx_packet_count_hdl, OID_RT_RESET_PHY_RX_PACKET_COUNT) -/*20*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_received_hdl, OID_RT_GET_PHY_RX_PACKET_RECEIVED) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_crc32_error_hdl, OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR) - - GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) - GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) - GEN_MP_IOCTL_HANDLER(sizeof(EFUSE_ACCESS_STRUCT), oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE) -/*25*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_efuse_map_hdl, OID_RT_PRO_EFUSE_MAP) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_max_size_hdl, OID_RT_GET_EFUSE_MAX_SIZE) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_current_size_hdl, OID_RT_GET_EFUSE_CURRENT_SIZE) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_thermal_meter_hdl, OID_RT_PRO_GET_THERMAL_METER) - GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_pro_set_power_tracking_hdl, OID_RT_PRO_SET_POWER_TRACKING) -/*30*/ GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_set_power_down_hdl, OID_RT_SET_POWER_DOWN) -/*31*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_trigger_gpio_hdl, 0) - - -}; - -#else /* _RTW_MP_IOCTL_C_ */ - -extern struct mp_ioctl_handler mp_ioctl_hdl[]; - -#endif /* _RTW_MP_IOCTL_C_ */ - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h b/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h deleted file mode 100755 index 4906005ede93..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h +++ /dev/null @@ -1,1098 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -/***************************************************************************** - * - * Module: __RTW_MP_PHY_REGDEF_H_ - * - * - * Note: 1. Define PMAC/BB register map - * 2. Define RF register map - * 3. PMAC/BB register bit mask. - * 4. RF reg bit mask. - * 5. Other BB/RF relative definition. - * - * - * Export: Constants, macro, functions(API), global variables(None). - * - * Abbrev: - * - * History: - * Data Who Remark - * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. - * 2. Reorganize code architecture. - * 09/25/2008 MH 1. Add RL6052 register definition - * - *****************************************************************************/ -#ifndef __RTW_MP_PHY_REGDEF_H_ -#define __RTW_MP_PHY_REGDEF_H_ - - -/*--------------------------Define Parameters-------------------------------*/ - -//============================================================ -// 8192S Regsiter offset definition -//============================================================ - -// -// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 -// 3. RF register 0x00-2E -// 4. Bit Mask for BB/RF register -// 5. Other defintion for BB/RF R/W -// - - -// -// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF -// 1. Page1(0x100) -// -#define rPMAC_Reset 0x100 -#define rPMAC_TxStart 0x104 -#define rPMAC_TxLegacySIG 0x108 -#define rPMAC_TxHTSIG1 0x10c -#define rPMAC_TxHTSIG2 0x110 -#define rPMAC_PHYDebug 0x114 -#define rPMAC_TxPacketNum 0x118 -#define rPMAC_TxIdle 0x11c -#define rPMAC_TxMACHeader0 0x120 -#define rPMAC_TxMACHeader1 0x124 -#define rPMAC_TxMACHeader2 0x128 -#define rPMAC_TxMACHeader3 0x12c -#define rPMAC_TxMACHeader4 0x130 -#define rPMAC_TxMACHeader5 0x134 -#define rPMAC_TxDataType 0x138 -#define rPMAC_TxRandomSeed 0x13c -#define rPMAC_CCKPLCPPreamble 0x140 -#define rPMAC_CCKPLCPHeader 0x144 -#define rPMAC_CCKCRC16 0x148 -#define rPMAC_OFDMRxCRC32OK 0x170 -#define rPMAC_OFDMRxCRC32Er 0x174 -#define rPMAC_OFDMRxParityEr 0x178 -#define rPMAC_OFDMRxCRC8Er 0x17c -#define rPMAC_CCKCRxRC16Er 0x180 -#define rPMAC_CCKCRxRC32Er 0x184 -#define rPMAC_CCKCRxRC32OK 0x188 -#define rPMAC_TxStatus 0x18c - -// -// 2. Page2(0x200) -// -// The following two definition are only used for USB interface. -//#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. -//#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. - -// -// 3. Page8(0x800) -// -#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? - -#define rFPGA0_TxInfo 0x804 // Status report?? -#define rFPGA0_PSDFunction 0x808 - -#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? - -#define rFPGA0_RFTiming1 0x810 // Useless now -#define rFPGA0_RFTiming2 0x814 -//#define rFPGA0_XC_RFTiming 0x818 -//#define rFPGA0_XD_RFTiming 0x81c - -#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register -#define rFPGA0_XA_HSSIParameter2 0x824 -#define rFPGA0_XB_HSSIParameter1 0x828 -#define rFPGA0_XB_HSSIParameter2 0x82c -#define rFPGA0_XC_HSSIParameter1 0x830 -#define rFPGA0_XC_HSSIParameter2 0x834 -#define rFPGA0_XD_HSSIParameter1 0x838 -#define rFPGA0_XD_HSSIParameter2 0x83c -#define rFPGA0_XA_LSSIParameter 0x840 -#define rFPGA0_XB_LSSIParameter 0x844 -#define rFPGA0_XC_LSSIParameter 0x848 -#define rFPGA0_XD_LSSIParameter 0x84c - -#define rFPGA0_RFWakeUpParameter 0x850 // Useless now -#define rFPGA0_RFSleepUpParameter 0x854 - -#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch -#define rFPGA0_XCD_SwitchControl 0x85c - -#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch -#define rFPGA0_XB_RFInterfaceOE 0x864 -#define rFPGA0_XC_RFInterfaceOE 0x868 -#define rFPGA0_XD_RFInterfaceOE 0x86c - -#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control -#define rFPGA0_XCD_RFInterfaceSW 0x874 - -#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter -#define rFPGA0_XCD_RFParameter 0x87c - -#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? -#define rFPGA0_AnalogParameter2 0x884 -#define rFPGA0_AnalogParameter3 0x888 // Useless now -#define rFPGA0_AnalogParameter4 0x88c - -#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback -#define rFPGA0_XB_LSSIReadBack 0x8a4 -#define rFPGA0_XC_LSSIReadBack 0x8a8 -#define rFPGA0_XD_LSSIReadBack 0x8ac - -#define rFPGA0_PSDReport 0x8b4 // Useless now -#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value -#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now - -// -// 4. Page9(0x900) -// -#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? - -#define rFPGA1_TxBlock 0x904 // Useless now -#define rFPGA1_DebugSelect 0x908 // Useless now -#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? - -// -// 5. PageA(0xA00) -// -// Set Control channel to upper or lower. These settings are required only for 40MHz -#define rCCK0_System 0xa00 - -#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI -#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain - -#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series -#define rCCK0_RxAGC2 0xa10 //AGC & DAGC - -#define rCCK0_RxHP 0xa14 - -#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold -#define rCCK0_DSPParameter2 0xa1c //SQ threshold - -#define rCCK0_TxFilter1 0xa20 -#define rCCK0_TxFilter2 0xa24 -#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 -#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report -#define rCCK0_TRSSIReport 0xa50 -#define rCCK0_RxReport 0xa54 //0xa57 -#define rCCK0_FACounterLower 0xa5c //0xa5b -#define rCCK0_FACounterUpper 0xa58 //0xa5c - -// -// 6. PageC(0xC00) -// -#define rOFDM0_LSTF 0xc00 - -#define rOFDM0_TRxPathEnable 0xc04 -#define rOFDM0_TRMuxPar 0xc08 -#define rOFDM0_TRSWIsolation 0xc0c - -#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter -#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix -#define rOFDM0_XBRxAFE 0xc18 -#define rOFDM0_XBRxIQImbalance 0xc1c -#define rOFDM0_XCRxAFE 0xc20 -#define rOFDM0_XCRxIQImbalance 0xc24 -#define rOFDM0_XDRxAFE 0xc28 -#define rOFDM0_XDRxIQImbalance 0xc2c - -#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain -#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. -#define rOFDM0_RxDetector3 0xc38 //Frame Sync. -#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI - -#define rOFDM0_RxDSP 0xc40 //Rx Sync Path -#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC -#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold -#define rOFDM0_ECCAThreshold 0xc4c // energy CCA - -#define rOFDM0_XAAGCCore1 0xc50 // DIG -#define rOFDM0_XAAGCCore2 0xc54 -#define rOFDM0_XBAGCCore1 0xc58 -#define rOFDM0_XBAGCCore2 0xc5c -#define rOFDM0_XCAGCCore1 0xc60 -#define rOFDM0_XCAGCCore2 0xc64 -#define rOFDM0_XDAGCCore1 0xc68 -#define rOFDM0_XDAGCCore2 0xc6c - -#define rOFDM0_AGCParameter1 0xc70 -#define rOFDM0_AGCParameter2 0xc74 -#define rOFDM0_AGCRSSITable 0xc78 -#define rOFDM0_HTSTFAGC 0xc7c - -#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG -#define rOFDM0_XATxAFE 0xc84 -#define rOFDM0_XBTxIQImbalance 0xc88 -#define rOFDM0_XBTxAFE 0xc8c -#define rOFDM0_XCTxIQImbalance 0xc90 -#define rOFDM0_XCTxAFE 0xc94 -#define rOFDM0_XDTxIQImbalance 0xc98 -#define rOFDM0_XDTxAFE 0xc9c -#define rOFDM0_RxIQExtAnta 0xca0 - -#define rOFDM0_RxHPParameter 0xce0 -#define rOFDM0_TxPseudoNoiseWgt 0xce4 -#define rOFDM0_FrameSync 0xcf0 -#define rOFDM0_DFSReport 0xcf4 -#define rOFDM0_TxCoeff1 0xca4 -#define rOFDM0_TxCoeff2 0xca8 -#define rOFDM0_TxCoeff3 0xcac -#define rOFDM0_TxCoeff4 0xcb0 -#define rOFDM0_TxCoeff5 0xcb4 -#define rOFDM0_TxCoeff6 0xcb8 - - -// -// 7. PageD(0xD00) -// -#define rOFDM1_LSTF 0xd00 -#define rOFDM1_TRxPathEnable 0xd04 - -#define rOFDM1_CFO 0xd08 // No setting now -#define rOFDM1_CSI1 0xd10 -#define rOFDM1_SBD 0xd14 -#define rOFDM1_CSI2 0xd18 -#define rOFDM1_CFOTracking 0xd2c -#define rOFDM1_TRxMesaure1 0xd34 -#define rOFDM1_IntfDet 0xd3c -#define rOFDM1_PseudoNoiseStateAB 0xd50 -#define rOFDM1_PseudoNoiseStateCD 0xd54 -#define rOFDM1_RxPseudoNoiseWgt 0xd58 - -#define rOFDM_PHYCounter1 0xda0 //cca, parity fail -#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail -#define rOFDM_PHYCounter3 0xda8 //MCS not support - -#define rOFDM_ShortCFOAB 0xdac // No setting now -#define rOFDM_ShortCFOCD 0xdb0 -#define rOFDM_LongCFOAB 0xdb4 -#define rOFDM_LongCFOCD 0xdb8 -#define rOFDM_TailCFOAB 0xdbc -#define rOFDM_TailCFOCD 0xdc0 -#define rOFDM_PWMeasure1 0xdc4 -#define rOFDM_PWMeasure2 0xdc8 -#define rOFDM_BWReport 0xdcc -#define rOFDM_AGCReport 0xdd0 -#define rOFDM_RxSNR 0xdd4 -#define rOFDM_RxEVMCSI 0xdd8 -#define rOFDM_SIGReport 0xddc - - -// -// 8. PageE(0xE00) -// -#define rTxAGC_Rate18_06 0xe00 -#define rTxAGC_Rate54_24 0xe04 -#define rTxAGC_CCK_Mcs32 0xe08 -#define rTxAGC_Mcs03_Mcs00 0xe10 -#define rTxAGC_Mcs07_Mcs04 0xe14 -#define rTxAGC_Mcs11_Mcs08 0xe18 -#define rTxAGC_Mcs15_Mcs12 0xe1c - -// Analog- control in RX_WAIT_CCA : REG: EE0 [Analog- Power & Control Register] -#define rRx_Wait_CCCA 0xe70 -#define rAnapar_Ctrl_BB 0xee0 - -// -// 7. RF Register 0x00-0x2E (RF 8256) -// RF-0222D 0x00-3F -// -//Zebra1 -#define RTL92SE_FPGA_VERIFY 0 -#define rZebra1_HSSIEnable 0x0 // Useless now -#define rZebra1_TRxEnable1 0x1 -#define rZebra1_TRxEnable2 0x2 -#define rZebra1_AGC 0x4 -#define rZebra1_ChargePump 0x5 -//#if (RTL92SE_FPGA_VERIFY == 1) -#define rZebra1_Channel 0x7 // RF channel switch -//#else - -//#endif -#define rZebra1_TxGain 0x8 // Useless now -#define rZebra1_TxLPF 0x9 -#define rZebra1_RxLPF 0xb -#define rZebra1_RxHPFCorner 0xc - -//Zebra4 -#define rGlobalCtrl 0 // Useless now -#define rRTL8256_TxLPF 19 -#define rRTL8256_RxLPF 11 - -//RTL8258 -#define rRTL8258_TxLPF 0x11 // Useless now -#define rRTL8258_RxLPF 0x13 -#define rRTL8258_RSSILPF 0xa - -// -// RL6052 Register definition -// -#define RF_AC 0x00 // - -#define RF_IQADJ_G1 0x01 // -#define RF_IQADJ_G2 0x02 // -#define RF_POW_TRSW 0x05 // - -#define RF_GAIN_RX 0x06 // -#define RF_GAIN_TX 0x07 // - -#define RF_TXM_IDAC 0x08 // -#define RF_BS_IQGEN 0x0F // - -#define RF_MODE1 0x10 // -#define RF_MODE2 0x11 // - -#define RF_RX_AGC_HP 0x12 // -#define RF_TX_AGC 0x13 // -#define RF_BIAS 0x14 // -#define RF_IPA 0x15 // -#define RF_POW_ABILITY 0x17 // -#define RF_MODE_AG 0x18 // -#define rRfChannel 0x18 // RF channel and BW switch -#define RF_CHNLBW 0x18 // RF channel and BW switch -#define RF_TOP 0x19 // - -#define RF_RX_G1 0x1A // -#define RF_RX_G2 0x1B // - -#define RF_RX_BB2 0x1C // -#define RF_RX_BB1 0x1D // - -#define RF_RCK1 0x1E // -#define RF_RCK2 0x1F // - -#define RF_TX_G1 0x20 // -#define RF_TX_G2 0x21 // -#define RF_TX_G3 0x22 // - -#define RF_TX_BB1 0x23 // - -#define RF_T_METER 0x24 // - -#define RF_SYN_G1 0x25 // RF TX Power control -#define RF_SYN_G2 0x26 // RF TX Power control -#define RF_SYN_G3 0x27 // RF TX Power control -#define RF_SYN_G4 0x28 // RF TX Power control -#define RF_SYN_G5 0x29 // RF TX Power control -#define RF_SYN_G6 0x2A // RF TX Power control -#define RF_SYN_G7 0x2B // RF TX Power control -#define RF_SYN_G8 0x2C // RF TX Power control - -#define RF_RCK_OS 0x30 // RF TX PA control - -#define RF_TXPA_G1 0x31 // RF TX PA control -#define RF_TXPA_G2 0x32 // RF TX PA control -#define RF_TXPA_G3 0x33 // RF TX PA control - -// -//Bit Mask -// -// 1. Page1(0x100) -#define bBBResetB 0x100 // Useless now? -#define bGlobalResetB 0x200 -#define bOFDMTxStart 0x4 -#define bCCKTxStart 0x8 -#define bCRC32Debug 0x100 -#define bPMACLoopback 0x10 -#define bTxLSIG 0xffffff -#define bOFDMTxRate 0xf -#define bOFDMTxReserved 0x10 -#define bOFDMTxLength 0x1ffe0 -#define bOFDMTxParity 0x20000 -#define bTxHTSIG1 0xffffff -#define bTxHTMCSRate 0x7f -#define bTxHTBW 0x80 -#define bTxHTLength 0xffff00 -#define bTxHTSIG2 0xffffff -#define bTxHTSmoothing 0x1 -#define bTxHTSounding 0x2 -#define bTxHTReserved 0x4 -#define bTxHTAggreation 0x8 -#define bTxHTSTBC 0x30 -#define bTxHTAdvanceCoding 0x40 -#define bTxHTShortGI 0x80 -#define bTxHTNumberHT_LTF 0x300 -#define bTxHTCRC8 0x3fc00 -#define bCounterReset 0x10000 -#define bNumOfOFDMTx 0xffff -#define bNumOfCCKTx 0xffff0000 -#define bTxIdleInterval 0xffff -#define bOFDMService 0xffff0000 -#define bTxMACHeader 0xffffffff -#define bTxDataInit 0xff -#define bTxHTMode 0x100 -#define bTxDataType 0x30000 -#define bTxRandomSeed 0xffffffff -#define bCCKTxPreamble 0x1 -#define bCCKTxSFD 0xffff0000 -#define bCCKTxSIG 0xff -#define bCCKTxService 0xff00 -#define bCCKLengthExt 0x8000 -#define bCCKTxLength 0xffff0000 -#define bCCKTxCRC16 0xffff -#define bCCKTxStatus 0x1 -#define bOFDMTxStatus 0x2 - -#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) - -// 2. Page8(0x800) -#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD -#define bJapanMode 0x2 -#define bCCKTxSC 0x30 -#define bCCKEn 0x1000000 -#define bOFDMEn 0x2000000 - -#define bOFDMRxADCPhase 0x10000 // Useless now -#define bOFDMTxDACPhase 0x40000 -#define bXATxAGC 0x3f - -#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage -#define bXCTxAGC 0xf000 -#define bXDTxAGC 0xf0000 - -#define bPAStart 0xf0000000 // Useless now -#define bTRStart 0x00f00000 -#define bRFStart 0x0000f000 -#define bBBStart 0x000000f0 -#define bBBCCKStart 0x0000000f -#define bPAEnd 0xf //Reg0x814 -#define bTREnd 0x0f000000 -#define bRFEnd 0x000f0000 -#define bCCAMask 0x000000f0 //T2R -#define bR2RCCAMask 0x00000f00 -#define bHSSI_R2TDelay 0xf8000000 -#define bHSSI_T2RDelay 0xf80000 -#define bContTxHSSI 0x400 //chane gain at continue Tx -#define bIGFromCCK 0x200 -#define bAGCAddress 0x3f -#define bRxHPTx 0x7000 -#define bRxHPT2R 0x38000 -#define bRxHPCCKIni 0xc0000 -#define bAGCTxCode 0xc00000 -#define bAGCRxCode 0x300000 - -#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 -#define b3WireAddressLength 0x400 - -#define b3WireRFPowerDown 0x1 // Useless now -//#define bHWSISelect 0x8 -#define b5GPAPEPolarity 0x40000000 -#define b2GPAPEPolarity 0x80000000 -#define bRFSW_TxDefaultAnt 0x3 -#define bRFSW_TxOptionAnt 0x30 -#define bRFSW_RxDefaultAnt 0x300 -#define bRFSW_RxOptionAnt 0x3000 -#define bRFSI_3WireData 0x1 -#define bRFSI_3WireClock 0x2 -#define bRFSI_3WireLoad 0x4 -#define bRFSI_3WireRW 0x8 -#define bRFSI_3Wire 0xf - -#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW - -#define bRFSI_TRSW 0x20 // Useless now -#define bRFSI_TRSWB 0x40 -#define bRFSI_ANTSW 0x100 -#define bRFSI_ANTSWB 0x200 -#define bRFSI_PAPE 0x400 -#define bRFSI_PAPE5G 0x800 -#define bBandSelect 0x1 -#define bHTSIG2_GI 0x80 -#define bHTSIG2_Smoothing 0x01 -#define bHTSIG2_Sounding 0x02 -#define bHTSIG2_Aggreaton 0x08 -#define bHTSIG2_STBC 0x30 -#define bHTSIG2_AdvCoding 0x40 -#define bHTSIG2_NumOfHTLTF 0x300 -#define bHTSIG2_CRC8 0x3fc -#define bHTSIG1_MCS 0x7f -#define bHTSIG1_BandWidth 0x80 -#define bHTSIG1_HTLength 0xffff -#define bLSIG_Rate 0xf -#define bLSIG_Reserved 0x10 -#define bLSIG_Length 0x1fffe -#define bLSIG_Parity 0x20 -#define bCCKRxPhase 0x4 -#if (RTL92SE_FPGA_VERIFY == 1) -#define bLSSIReadAddress 0x3f000000 //LSSI "Read" Address // Reg 0x824 rFPGA0_XA_HSSIParameter2 -#else -#define bLSSIReadAddress 0x7f800000 // T65 RF -#endif -#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal -#if (RTL92SE_FPGA_VERIFY == 1) -#define bLSSIReadBackData 0xfff // Reg 0x8a0 rFPGA0_XA_LSSIReadBack -#else -#define bLSSIReadBackData 0xfffff // T65 RF -#endif -#define bLSSIReadOKFlag 0x1000 // Useless now -#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz -#define bRegulator0Standby 0x1 -#define bRegulatorPLLStandby 0x2 -#define bRegulator1Standby 0x4 -#define bPLLPowerUp 0x8 -#define bDPLLPowerUp 0x10 -#define bDA10PowerUp 0x20 -#define bAD7PowerUp 0x200 -#define bDA6PowerUp 0x2000 -#define bXtalPowerUp 0x4000 -#define b40MDClkPowerUP 0x8000 -#define bDA6DebugMode 0x20000 -#define bDA6Swing 0x380000 - -#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ - -#define b80MClkDelay 0x18000000 // Useless -#define bAFEWatchDogEnable 0x20000000 - -#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap -#define bXtalCap23 0x3 -#define bXtalCap92x 0x0f000000 -#define bXtalCap 0x0f000000 - -#define bIntDifClkEnable 0x400 // Useless -#define bExtSigClkEnable 0x800 -#define bBandgapMbiasPowerUp 0x10000 -#define bAD11SHGain 0xc0000 -#define bAD11InputRange 0x700000 -#define bAD11OPCurrent 0x3800000 -#define bIPathLoopback 0x4000000 -#define bQPathLoopback 0x8000000 -#define bAFELoopback 0x10000000 -#define bDA10Swing 0x7e0 -#define bDA10Reverse 0x800 -#define bDAClkSource 0x1000 -#define bAD7InputRange 0x6000 -#define bAD7Gain 0x38000 -#define bAD7OutputCMMode 0x40000 -#define bAD7InputCMMode 0x380000 -#define bAD7Current 0xc00000 -#define bRegulatorAdjust 0x7000000 -#define bAD11PowerUpAtTx 0x1 -#define bDA10PSAtTx 0x10 -#define bAD11PowerUpAtRx 0x100 -#define bDA10PSAtRx 0x1000 -#define bCCKRxAGCFormat 0x200 -#define bPSDFFTSamplepPoint 0xc000 -#define bPSDAverageNum 0x3000 -#define bIQPathControl 0xc00 -#define bPSDFreq 0x3ff -#define bPSDAntennaPath 0x30 -#define bPSDIQSwitch 0x40 -#define bPSDRxTrigger 0x400000 -#define bPSDTxTrigger 0x80000000 -#define bPSDSineToneScale 0x7f000000 -#define bPSDReport 0xffff - -// 3. Page9(0x900) -#define bOFDMTxSC 0x30000000 // Useless -#define bCCKTxOn 0x1 -#define bOFDMTxOn 0x2 -#define bDebugPage 0xfff //reset debug page and also HWord, LWord -#define bDebugItem 0xff //reset debug page and LWord -#define bAntL 0x10 -#define bAntNonHT 0x100 -#define bAntHT1 0x1000 -#define bAntHT2 0x10000 -#define bAntHT1S1 0x100000 -#define bAntNonHTS1 0x1000000 - -// 4. PageA(0xA00) -#define bCCKBBMode 0x3 // Useless -#define bCCKTxPowerSaving 0x80 -#define bCCKRxPowerSaving 0x40 - -#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch - -#define bCCKScramble 0x8 // Useless -#define bCCKAntDiversity 0x8000 -#define bCCKCarrierRecovery 0x4000 -#define bCCKTxRate 0x3000 -#define bCCKDCCancel 0x0800 -#define bCCKISICancel 0x0400 -#define bCCKMatchFilter 0x0200 -#define bCCKEqualizer 0x0100 -#define bCCKPreambleDetect 0x800000 -#define bCCKFastFalseCCA 0x400000 -#define bCCKChEstStart 0x300000 -#define bCCKCCACount 0x080000 -#define bCCKcs_lim 0x070000 -#define bCCKBistMode 0x80000000 -#define bCCKCCAMask 0x40000000 -#define bCCKTxDACPhase 0x4 -#define bCCKRxADCPhase 0x20000000 //r_rx_clk -#define bCCKr_cp_mode0 0x0100 -#define bCCKTxDCOffset 0xf0 -#define bCCKRxDCOffset 0xf -#define bCCKCCAMode 0xc000 -#define bCCKFalseCS_lim 0x3f00 -#define bCCKCS_ratio 0xc00000 -#define bCCKCorgBit_sel 0x300000 -#define bCCKPD_lim 0x0f0000 -#define bCCKNewCCA 0x80000000 -#define bCCKRxHPofIG 0x8000 -#define bCCKRxIG 0x7f00 -#define bCCKLNAPolarity 0x800000 -#define bCCKRx1stGain 0x7f0000 -#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity -#define bCCKRxAGCSatLevel 0x1f000000 -#define bCCKRxAGCSatCount 0xe0 -#define bCCKRxRFSettle 0x1f //AGCsamp_dly -#define bCCKFixedRxAGC 0x8000 -//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 -#define bCCKAntennaPolarity 0x2000 -#define bCCKTxFilterType 0x0c00 -#define bCCKRxAGCReportType 0x0300 -#define bCCKRxDAGCEn 0x80000000 -#define bCCKRxDAGCPeriod 0x20000000 -#define bCCKRxDAGCSatLevel 0x1f000000 -#define bCCKTimingRecovery 0x800000 -#define bCCKTxC0 0x3f0000 -#define bCCKTxC1 0x3f000000 -#define bCCKTxC2 0x3f -#define bCCKTxC3 0x3f00 -#define bCCKTxC4 0x3f0000 -#define bCCKTxC5 0x3f000000 -#define bCCKTxC6 0x3f -#define bCCKTxC7 0x3f00 -#define bCCKDebugPort 0xff0000 -#define bCCKDACDebug 0x0f000000 -#define bCCKFalseAlarmEnable 0x8000 -#define bCCKFalseAlarmRead 0x4000 -#define bCCKTRSSI 0x7f -#define bCCKRxAGCReport 0xfe -#define bCCKRxReport_AntSel 0x80000000 -#define bCCKRxReport_MFOff 0x40000000 -#define bCCKRxRxReport_SQLoss 0x20000000 -#define bCCKRxReport_Pktloss 0x10000000 -#define bCCKRxReport_Lockedbit 0x08000000 -#define bCCKRxReport_RateError 0x04000000 -#define bCCKRxReport_RxRate 0x03000000 -#define bCCKRxFACounterLower 0xff -#define bCCKRxFACounterUpper 0xff000000 -#define bCCKRxHPAGCStart 0xe000 -#define bCCKRxHPAGCFinal 0x1c00 -#define bCCKRxFalseAlarmEnable 0x8000 -#define bCCKFACounterFreeze 0x4000 -#define bCCKTxPathSel 0x10000000 -#define bCCKDefaultRxPath 0xc000000 -#define bCCKOptionRxPath 0x3000000 - -// 5. PageC(0xC00) -#define bNumOfSTF 0x3 // Useless -#define bShift_L 0xc0 -#define bGI_TH 0xc -#define bRxPathA 0x1 -#define bRxPathB 0x2 -#define bRxPathC 0x4 -#define bRxPathD 0x8 -#define bTxPathA 0x1 -#define bTxPathB 0x2 -#define bTxPathC 0x4 -#define bTxPathD 0x8 -#define bTRSSIFreq 0x200 -#define bADCBackoff 0x3000 -#define bDFIRBackoff 0xc000 -#define bTRSSILatchPhase 0x10000 -#define bRxIDCOffset 0xff -#define bRxQDCOffset 0xff00 -#define bRxDFIRMode 0x1800000 -#define bRxDCNFType 0xe000000 -#define bRXIQImb_A 0x3ff -#define bRXIQImb_B 0xfc00 -#define bRXIQImb_C 0x3f0000 -#define bRXIQImb_D 0xffc00000 -#define bDC_dc_Notch 0x60000 -#define bRxNBINotch 0x1f000000 -#define bPD_TH 0xf -#define bPD_TH_Opt2 0xc000 -#define bPWED_TH 0x700 -#define bIfMF_Win_L 0x800 -#define bPD_Option 0x1000 -#define bMF_Win_L 0xe000 -#define bBW_Search_L 0x30000 -#define bwin_enh_L 0xc0000 -#define bBW_TH 0x700000 -#define bED_TH2 0x3800000 -#define bBW_option 0x4000000 -#define bRatio_TH 0x18000000 -#define bWindow_L 0xe0000000 -#define bSBD_Option 0x1 -#define bFrame_TH 0x1c -#define bFS_Option 0x60 -#define bDC_Slope_check 0x80 -#define bFGuard_Counter_DC_L 0xe00 -#define bFrame_Weight_Short 0x7000 -#define bSub_Tune 0xe00000 -#define bFrame_DC_Length 0xe000000 -#define bSBD_start_offset 0x30000000 -#define bFrame_TH_2 0x7 -#define bFrame_GI2_TH 0x38 -#define bGI2_Sync_en 0x40 -#define bSarch_Short_Early 0x300 -#define bSarch_Short_Late 0xc00 -#define bSarch_GI2_Late 0x70000 -#define bCFOAntSum 0x1 -#define bCFOAcc 0x2 -#define bCFOStartOffset 0xc -#define bCFOLookBack 0x70 -#define bCFOSumWeight 0x80 -#define bDAGCEnable 0x10000 -#define bTXIQImb_A 0x3ff -#define bTXIQImb_B 0xfc00 -#define bTXIQImb_C 0x3f0000 -#define bTXIQImb_D 0xffc00000 -#define bTxIDCOffset 0xff -#define bTxQDCOffset 0xff00 -#define bTxDFIRMode 0x10000 -#define bTxPesudoNoiseOn 0x4000000 -#define bTxPesudoNoise_A 0xff -#define bTxPesudoNoise_B 0xff00 -#define bTxPesudoNoise_C 0xff0000 -#define bTxPesudoNoise_D 0xff000000 -#define bCCADropOption 0x20000 -#define bCCADropThres 0xfff00000 -#define bEDCCA_H 0xf -#define bEDCCA_L 0xf0 -#define bLambda_ED 0x300 -#define bRxInitialGain 0x7f -#define bRxAntDivEn 0x80 -#define bRxAGCAddressForLNA 0x7f00 -#define bRxHighPowerFlow 0x8000 -#define bRxAGCFreezeThres 0xc0000 -#define bRxFreezeStep_AGC1 0x300000 -#define bRxFreezeStep_AGC2 0xc00000 -#define bRxFreezeStep_AGC3 0x3000000 -#define bRxFreezeStep_AGC0 0xc000000 -#define bRxRssi_Cmp_En 0x10000000 -#define bRxQuickAGCEn 0x20000000 -#define bRxAGCFreezeThresMode 0x40000000 -#define bRxOverFlowCheckType 0x80000000 -#define bRxAGCShift 0x7f -#define bTRSW_Tri_Only 0x80 -#define bPowerThres 0x300 -#define bRxAGCEn 0x1 -#define bRxAGCTogetherEn 0x2 -#define bRxAGCMin 0x4 -#define bRxHP_Ini 0x7 -#define bRxHP_TRLNA 0x70 -#define bRxHP_RSSI 0x700 -#define bRxHP_BBP1 0x7000 -#define bRxHP_BBP2 0x70000 -#define bRxHP_BBP3 0x700000 -#define bRSSI_H 0x7f0000 //the threshold for high power -#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity -#define bRxSettle_TRSW 0x7 -#define bRxSettle_LNA 0x38 -#define bRxSettle_RSSI 0x1c0 -#define bRxSettle_BBP 0xe00 -#define bRxSettle_RxHP 0x7000 -#define bRxSettle_AntSW_RSSI 0x38000 -#define bRxSettle_AntSW 0xc0000 -#define bRxProcessTime_DAGC 0x300000 -#define bRxSettle_HSSI 0x400000 -#define bRxProcessTime_BBPPW 0x800000 -#define bRxAntennaPowerShift 0x3000000 -#define bRSSITableSelect 0xc000000 -#define bRxHP_Final 0x7000000 -#define bRxHTSettle_BBP 0x7 -#define bRxHTSettle_HSSI 0x8 -#define bRxHTSettle_RxHP 0x70 -#define bRxHTSettle_BBPPW 0x80 -#define bRxHTSettle_Idle 0x300 -#define bRxHTSettle_Reserved 0x1c00 -#define bRxHTRxHPEn 0x8000 -#define bRxHTAGCFreezeThres 0x30000 -#define bRxHTAGCTogetherEn 0x40000 -#define bRxHTAGCMin 0x80000 -#define bRxHTAGCEn 0x100000 -#define bRxHTDAGCEn 0x200000 -#define bRxHTRxHP_BBP 0x1c00000 -#define bRxHTRxHP_Final 0xe0000000 -#define bRxPWRatioTH 0x3 -#define bRxPWRatioEn 0x4 -#define bRxMFHold 0x3800 -#define bRxPD_Delay_TH1 0x38 -#define bRxPD_Delay_TH2 0x1c0 -#define bRxPD_DC_COUNT_MAX 0x600 -//#define bRxMF_Hold 0x3800 -#define bRxPD_Delay_TH 0x8000 -#define bRxProcess_Delay 0xf0000 -#define bRxSearchrange_GI2_Early 0x700000 -#define bRxFrame_Guard_Counter_L 0x3800000 -#define bRxSGI_Guard_L 0xc000000 -#define bRxSGI_Search_L 0x30000000 -#define bRxSGI_TH 0xc0000000 -#define bDFSCnt0 0xff -#define bDFSCnt1 0xff00 -#define bDFSFlag 0xf0000 -#define bMFWeightSum 0x300000 -#define bMinIdxTH 0x7f000000 -#define bDAFormat 0x40000 -#define bTxChEmuEnable 0x01000000 -#define bTRSWIsolation_A 0x7f -#define bTRSWIsolation_B 0x7f00 -#define bTRSWIsolation_C 0x7f0000 -#define bTRSWIsolation_D 0x7f000000 -#define bExtLNAGain 0x7c00 - -// 6. PageE(0xE00) -#define bSTBCEn 0x4 // Useless -#define bAntennaMapping 0x10 -#define bNss 0x20 -#define bCFOAntSumD 0x200 -#define bPHYCounterReset 0x8000000 -#define bCFOReportGet 0x4000000 -#define bOFDMContinueTx 0x10000000 -#define bOFDMSingleCarrier 0x20000000 -#define bOFDMSingleTone 0x40000000 -//#define bRxPath1 0x01 -//#define bRxPath2 0x02 -//#define bRxPath3 0x04 -//#define bRxPath4 0x08 -//#define bTxPath1 0x10 -//#define bTxPath2 0x20 -#define bHTDetect 0x100 -#define bCFOEn 0x10000 -#define bCFOValue 0xfff00000 -#define bSigTone_Re 0x3f -#define bSigTone_Im 0x7f00 -#define bCounter_CCA 0xffff -#define bCounter_ParityFail 0xffff0000 -#define bCounter_RateIllegal 0xffff -#define bCounter_CRC8Fail 0xffff0000 -#define bCounter_MCSNoSupport 0xffff -#define bCounter_FastSync 0xffff -#define bShortCFO 0xfff -#define bShortCFOTLength 12 //total -#define bShortCFOFLength 11 //fraction -#define bLongCFO 0x7ff -#define bLongCFOTLength 11 -#define bLongCFOFLength 11 -#define bTailCFO 0x1fff -#define bTailCFOTLength 13 -#define bTailCFOFLength 12 -#define bmax_en_pwdB 0xffff -#define bCC_power_dB 0xffff0000 -#define bnoise_pwdB 0xffff -#define bPowerMeasTLength 10 -#define bPowerMeasFLength 3 -#define bRx_HT_BW 0x1 -#define bRxSC 0x6 -#define bRx_HT 0x8 -#define bNB_intf_det_on 0x1 -#define bIntf_win_len_cfg 0x30 -#define bNB_Intf_TH_cfg 0x1c0 -#define bRFGain 0x3f -#define bTableSel 0x40 -#define bTRSW 0x80 -#define bRxSNR_A 0xff -#define bRxSNR_B 0xff00 -#define bRxSNR_C 0xff0000 -#define bRxSNR_D 0xff000000 -#define bSNREVMTLength 8 -#define bSNREVMFLength 1 -#define bCSI1st 0xff -#define bCSI2nd 0xff00 -#define bRxEVM1st 0xff0000 -#define bRxEVM2nd 0xff000000 -#define bSIGEVM 0xff -#define bPWDB 0xff00 -#define bSGIEN 0x10000 - -#define bSFactorQAM1 0xf // Useless -#define bSFactorQAM2 0xf0 -#define bSFactorQAM3 0xf00 -#define bSFactorQAM4 0xf000 -#define bSFactorQAM5 0xf0000 -#define bSFactorQAM6 0xf0000 -#define bSFactorQAM7 0xf00000 -#define bSFactorQAM8 0xf000000 -#define bSFactorQAM9 0xf0000000 -#define bCSIScheme 0x100000 - -#define bNoiseLvlTopSet 0x3 // Useless -#define bChSmooth 0x4 -#define bChSmoothCfg1 0x38 -#define bChSmoothCfg2 0x1c0 -#define bChSmoothCfg3 0xe00 -#define bChSmoothCfg4 0x7000 -#define bMRCMode 0x800000 -#define bTHEVMCfg 0x7000000 - -#define bLoopFitType 0x1 // Useless -#define bUpdCFO 0x40 -#define bUpdCFOOffData 0x80 -#define bAdvUpdCFO 0x100 -#define bAdvTimeCtrl 0x800 -#define bUpdClko 0x1000 -#define bFC 0x6000 -#define bTrackingMode 0x8000 -#define bPhCmpEnable 0x10000 -#define bUpdClkoLTF 0x20000 -#define bComChCFO 0x40000 -#define bCSIEstiMode 0x80000 -#define bAdvUpdEqz 0x100000 -#define bUChCfg 0x7000000 -#define bUpdEqz 0x8000000 - -#define bTxAGCRate18_06 0x7f7f7f7f // Useless -#define bTxAGCRate54_24 0x7f7f7f7f -#define bTxAGCRateMCS32 0x7f -#define bTxAGCRateCCK 0x7f00 -#define bTxAGCRateMCS3_MCS0 0x7f7f7f7f -#define bTxAGCRateMCS7_MCS4 0x7f7f7f7f -#define bTxAGCRateMCS11_MCS8 0x7f7f7f7f -#define bTxAGCRateMCS15_MCS12 0x7f7f7f7f - -//Rx Pseduo noise -#define bRxPesudoNoiseOn 0x20000000 // Useless -#define bRxPesudoNoise_A 0xff -#define bRxPesudoNoise_B 0xff00 -#define bRxPesudoNoise_C 0xff0000 -#define bRxPesudoNoise_D 0xff000000 -#define bPesudoNoiseState_A 0xffff -#define bPesudoNoiseState_B 0xffff0000 -#define bPesudoNoiseState_C 0xffff -#define bPesudoNoiseState_D 0xffff0000 - -//7. RF Register -//Zebra1 -#define bZebra1_HSSIEnable 0x8 // Useless -#define bZebra1_TRxControl 0xc00 -#define bZebra1_TRxGainSetting 0x07f -#define bZebra1_RxCorner 0xc00 -#define bZebra1_TxChargePump 0x38 -#define bZebra1_RxChargePump 0x7 -#define bZebra1_ChannelNum 0xf80 -#define bZebra1_TxLPFBW 0x400 -#define bZebra1_RxLPFBW 0x600 - -//Zebra4 -#define bRTL8256RegModeCtrl1 0x100 // Useless -#define bRTL8256RegModeCtrl0 0x40 -#define bRTL8256_TxLPFBW 0x18 -#define bRTL8256_RxLPFBW 0x600 - -//RTL8258 -#define bRTL8258_TxLPFBW 0xc // Useless -#define bRTL8258_RxLPFBW 0xc00 -#define bRTL8258_RSSILPFBW 0xc0 - - -// -// Other Definition -// - -//byte endable for sb_write -#define bByte0 0x1 // Useless -#define bByte1 0x2 -#define bByte2 0x4 -#define bByte3 0x8 -#define bWord0 0x3 -#define bWord1 0xc -#define bDWord 0xf - -//for PutRegsetting & GetRegSetting BitMask -#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f -#define bMaskByte1 0xff00 -#define bMaskByte2 0xff0000 -#define bMaskByte3 0xff000000 -#define bMaskHWord 0xffff0000 -#define bMaskLWord 0x0000ffff -#define bMaskDWord 0xffffffff -#define bMaskH4Bits 0xf0000000 -#define bMaskOFDM_D 0xffc00000 -#define bMaskCCK 0x3f3f3f3f -#define bMask12Bits 0xfff - -//for PutRFRegsetting & GetRFRegSetting BitMask -#if (RTL92SE_FPGA_VERIFY == 1) -//#define bMask12Bits 0xfff // RF Reg mask bits -//#define bMask20Bits 0xfff // RF Reg mask bits T65 RF -#define bRFRegOffsetMask 0xfff -#else -//#define bMask12Bits 0xfffff // RF Reg mask bits -//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF -#define bRFRegOffsetMask 0xfffff -#endif -#define bEnable 0x1 // Useless -#define bDisable 0x0 - -#define LeftAntenna 0x0 // Useless -#define RightAntenna 0x1 - -#define tCheckTxStatus 500 //500ms // Useless -#define tUpdateRxCounter 100 //100ms - -#define rateCCK 0 // Useless -#define rateOFDM 1 -#define rateHT 2 - -//define Register-End -#define bPMAC_End 0x1ff // Useless -#define bFPGAPHY0_End 0x8ff -#define bFPGAPHY1_End 0x9ff -#define bCCKPHY0_End 0xaff -#define bOFDMPHY0_End 0xcff -#define bOFDMPHY1_End 0xdff - -//define max debug item in each debug page -//#define bMaxItem_FPGA_PHY0 0x9 -//#define bMaxItem_FPGA_PHY1 0x3 -//#define bMaxItem_PHY_11B 0x16 -//#define bMaxItem_OFDM_PHY0 0x29 -//#define bMaxItem_OFDM_PHY1 0x0 - -#define bPMACControl 0x0 // Useless -#define bWMACControl 0x1 -#define bWNICControl 0x2 - -#if 0 -#define ANTENNA_A 0x1 // Useless -#define ANTENNA_B 0x2 -#define ANTENNA_AB 0x3 // ANTENNA_A|ANTENNA_B - -#define ANTENNA_C 0x4 -#define ANTENNA_D 0x8 -#endif - -#define RCR_AAP BIT(0) // accept all physical address -#define RCR_APM BIT(1) // accept physical match -#define RCR_AM BIT(2) // accept multicast -#define RCR_AB BIT(3) // accept broadcast -#define RCR_ACRC32 BIT(5) // accept error packet -#define RCR_9356SEL BIT(6) -#define RCR_AICV BIT(12) // Accept ICV error packet -#define RCR_RXFTH0 (BIT(13)|BIT(14)|BIT(15)) // Rx FIFO threshold -#define RCR_ADF BIT(18) // Accept Data(frame type) frame -#define RCR_ACF BIT(19) // Accept control frame -#define RCR_AMF BIT(20) // Accept management frame -#define RCR_ADD3 BIT(21) -#define RCR_APWRMGT BIT(22) // Accept power management packet -#define RCR_CBSSID BIT(23) // Accept BSSID match packet -#define RCR_ENMARP BIT(28) // enable mac auto reset phy -#define RCR_EnCS1 BIT(29) // enable carrier sense method 1 -#define RCR_EnCS2 BIT(30) // enable carrier sense method 2 -#define RCR_OnlyErlPkt BIT(31) // Rx Early mode is performed for packet size greater than 1536 - -/*--------------------------Define Parameters-------------------------------*/ - - -#endif //__INC_HAL8192SPHYREG_H - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_p2p.h b/drivers/net/wireless/rtl8192c/include/rtw_p2p.h deleted file mode 100755 index 96993dbe6d6a..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_p2p.h +++ /dev/null @@ -1,48 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __RTW_P2P_H_ -#define __RTW_P2P_H_ - -#include - -u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); -u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); -u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr ); -u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code); -u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); - -u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); -u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *p2p_ie, uint p2p_ielen, struct sta_info *psta); -u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); -u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); -u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); -u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe); -u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); -u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); -u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); -u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); - -void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength); -void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state); -void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType); -u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue); - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h b/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h deleted file mode 100755 index 6ee62d6b3847..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h +++ /dev/null @@ -1,331 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_PWRCTRL_H_ -#define __RTW_PWRCTRL_H_ - -#include -#include -#include - -#ifdef CONFIG_HAS_EARLYSUSPEND -#include -#endif //CONFIG_HAS_EARLYSUSPEND - - -#define FW_PWR0 0 -#define FW_PWR1 1 -#define FW_PWR2 2 -#define FW_PWR3 3 - - -#define HW_PWR0 7 -#define HW_PWR1 6 -#define HW_PWR2 2 -#define HW_PWR3 0 -#define HW_PWR4 8 - -#define FW_PWRMSK 0x7 - - -#define XMIT_ALIVE BIT(0) -#define RECV_ALIVE BIT(1) -#define CMD_ALIVE BIT(2) -#define EVT_ALIVE BIT(3) - - -enum Power_Mgnt -{ - PS_MODE_ACTIVE = 0 , - PS_MODE_MIN , - PS_MODE_MAX , - PS_MODE_DTIM , - PS_MODE_VOIP , - PS_MODE_UAPSD_WMM , - PS_MODE_UAPSD , - PS_MODE_IBSS , - PS_MODE_WWLAN , - PM_Radio_Off , - PM_Card_Disable , - PS_MODE_NUM -}; - - -/* - BIT[2:0] = HW state - BIT[3] = Protocol PS state, 0: register active state , 1: register sleep state - BIT[4] = sub-state -*/ - -#define PS_DPS BIT(0) -#define PS_LCLK (PS_DPS) -#define PS_RF_OFF BIT(1) -#define PS_ALL_ON BIT(2) -#define PS_ST_ACTIVE BIT(3) -#define PS_LP BIT(4) // low performance - -#define PS_STATE_MASK (0x0F) -#define PS_STATE_HW_MASK (0x07) -#define PS_SEQ_MASK (0xc0) - -#define PS_STATE(x) (PS_STATE_MASK & (x)) -#define PS_STATE_HW(x) (PS_STATE_HW_MASK & (x)) -#define PS_SEQ(x) (PS_SEQ_MASK & (x)) - -#define PS_STATE_S0 (PS_DPS) -#define PS_STATE_S1 (PS_LCLK) -#define PS_STATE_S2 (PS_RF_OFF) -#define PS_STATE_S3 (PS_ALL_ON) -#define PS_STATE_S4 ((PS_ST_ACTIVE) | (PS_ALL_ON)) - - -#define PS_IS_RF_ON(x) ((x) & (PS_ALL_ON)) -#define PS_IS_ACTIVE(x) ((x) & (PS_ST_ACTIVE)) -#define CLR_PS_STATE(x) ((x) = ((x) & (0xF0))) - - -struct reportpwrstate_parm { - unsigned char mode; - unsigned char state; //the CPWM value - unsigned short rsvd; -}; - - -typedef _sema _pwrlock; - - -__inline static void _init_pwrlock(_pwrlock *plock) -{ - _rtw_init_sema(plock, 1); -} - -__inline static void _free_pwrlock(_pwrlock *plock) -{ - _rtw_free_sema(plock); -} - - -__inline static void _enter_pwrlock(_pwrlock *plock) -{ - _rtw_down_sema(plock); -} - - -__inline static void _exit_pwrlock(_pwrlock *plock) -{ - _rtw_up_sema(plock); -} - -#define LPS_DELAY_TIME 1*HZ // 1 sec - -#define EXE_PWR_NONE 0x01 -#define EXE_PWR_IPS 0x02 -#define EXE_PWR_LPS 0x04 - -// RF state. -typedef enum _rt_rf_power_state -{ - rf_on, // RF is on after RFSleep or RFOff - rf_sleep, // 802.11 Power Save mode - rf_off, // HW/SW Radio OFF or Inactive Power Save - //=====Add the new RF state above this line=====// - rf_max -}rt_rf_power_state; - -// RF Off Level for IPS or HW/SW radio off -#define RT_RF_OFF_LEVL_ASPM BIT(0) // PCI ASPM -#define RT_RF_OFF_LEVL_CLK_REQ BIT(1) // PCI clock request -#define RT_RF_OFF_LEVL_PCI_D3 BIT(2) // PCI D3 mode -#define RT_RF_OFF_LEVL_HALT_NIC BIT(3) // NIC halt, re-initialize hw parameters -#define RT_RF_OFF_LEVL_FREE_FW BIT(4) // FW free, re-download the FW -#define RT_RF_OFF_LEVL_FW_32K BIT(5) // FW in 32k -#define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6) // Always enable ASPM and Clock Req in initialization. -#define RT_RF_LPS_DISALBE_2R BIT(30) // When LPS is on, disable 2R if no packet is received or transmittd. -#define RT_RF_LPS_LEVEL_ASPM BIT(31) // LPS with ASPM - -#define RT_IN_PS_LEVEL(ppsc, _PS_FLAG) ((ppsc->cur_ps_level & _PS_FLAG) ? _TRUE : _FALSE) -#define RT_CLEAR_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level &= (~(_PS_FLAG))) -#define RT_SET_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level |= _PS_FLAG) - - -enum _PS_BBRegBackup_ { - PSBBREG_RF0 = 0, - PSBBREG_RF1, - PSBBREG_RF2, - PSBBREG_AFE0, - PSBBREG_TOTALCNT -}; - -enum { // for ips_mode - IPS_NORMAL = 0, - IPS_LEVEL_2 -}; - -struct pwrctrl_priv { - _pwrlock lock; - volatile u8 rpwm; // requested power state for fw - volatile u8 cpwm; // fw current power state. updated when 1. read from HCPWM 2. driver lowers power level - volatile u8 tog; // toggling - volatile u8 cpwm_tog; // toggling - u8 pwr_mode; - u8 smart_ps; - uint alives; - - u8 b_hw_radio_off; - u8 reg_rfoff; - u8 reg_pdnmode; //powerdown mode - u32 rfoff_reason; - - //RF OFF Level - u32 cur_ps_level; - u32 reg_rfps_level; - - - -#ifdef CONFIG_PCI_HCI - //just for PCIE ASPM - u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. - u8 b_support_backdoor; - - //just for PCIE ASPM - u8 const_amdpci_aspm; -#endif - - //u8 ips_enable;//for dbg - //u8 lps_enable;//for dbg - - uint ips_enter_cnts; - uint ips_leave_cnts; - - _timer ips_check_timer; - - u8 ips_mode; - u8 ips_mode_req; // used to accept the mode setting request, will update to ipsmode later - - u8 bLeisurePs; - u8 LpsIdleCount; - u8 power_mgnt; - u8 bFwCurrentInPSMode; - u32 DelayLPSLastTimeStamp; - - s32 pnp_current_pwr_state; - u8 pnp_bstop_trx; - - - u8 bInternalAutoSuspend; - u8 bInSuspend; - u8 bSupportRemoteWakeup; - _timer pwr_state_check_timer; - int pwr_state_check_inverval; - u8 pwr_state_check_cnts; - uint bips_processing; - - int ps_flag; - - rt_rf_power_state rf_pwrstate;//cur power state - //rt_rf_power_state current_rfpwrstate; - rt_rf_power_state change_rfpwrstate; - - u8 wepkeymask; - u8 bHWPowerdown;//if support hw power down - u8 bHWPwrPindetect; - u8 bkeepfwalive; - u8 brfoffbyhw; - unsigned long PS_BBRegBackup[PSBBREG_TOTALCNT]; - - #ifdef CONFIG_RESUME_IN_WORKQUEUE - struct workqueue_struct *rtw_workqueue; - _workitem resume_work; - #endif - - #ifdef CONFIG_HAS_EARLYSUSPEND - struct early_suspend early_suspend; - u8 do_late_resume; - #endif //CONFIG_HAS_EARLYSUSPEND - - #ifdef CONFIG_ANDROID_POWER - android_early_suspend_t early_suspend; - u8 do_late_resume; - #endif - -}; - -#define rtw_get_ips_mode_req(pwrctrlpriv) \ - (pwrctrlpriv)->ips_mode_req - -#define rtw_ips_mode_req(pwrctrlpriv, ips_mode) \ - (pwrctrlpriv)->ips_mode_req = (ips_mode) - -#define _rtw_set_pwr_state_check_timer(pwrctrlpriv, ms) \ - do { \ - /*DBG_871X("%s _rtw_set_pwr_state_check_timer(%p, %d)\n", __FUNCTION__, (pwrctrlpriv), (ms));*/ \ - _set_timer(&(pwrctrlpriv)->pwr_state_check_timer, (ms)); \ - } while(0) - -#define rtw_set_pwr_state_check_timer(pwrctrlpriv) \ - _rtw_set_pwr_state_check_timer((pwrctrlpriv), (pwrctrlpriv)->pwr_state_check_inverval) - -extern void rtw_init_pwrctrl_priv(_adapter *adapter); -extern void rtw_free_pwrctrl_priv(_adapter * adapter); -extern sint rtw_register_tx_alive(_adapter *padapter); -extern void rtw_unregister_tx_alive(_adapter *padapter); -extern sint rtw_register_rx_alive(_adapter *padapter); -extern void rtw_unregister_rx_alive(_adapter *padapter); -extern sint rtw_register_cmd_alive(_adapter *padapter); -extern void rtw_unregister_cmd_alive(_adapter *padapter); -extern sint rtw_register_evt_alive(_adapter *padapter); -extern void rtw_unregister_evt_alive(_adapter *padapter); -extern void cpwm_int_hdl(_adapter *padapter, struct reportpwrstate_parm *preportpwrstate); -extern void rtw_set_ps_mode(_adapter * padapter, u8 ps_mode, u8 smart_ps); -extern void rtw_set_rpwm(_adapter * padapter, u8 val8); -extern void LeaveAllPowerSaveMode(PADAPTER Adapter); -#ifdef CONFIG_IPS -void ips_enter(_adapter * padapter); -int ips_leave(_adapter * padapter); -#endif - -void rtw_ps_processor(_adapter*padapter); - -#ifdef CONFIG_AUTOSUSPEND -int autoresume_enter(_adapter* padapter); -#endif -#ifdef SUPPORT_HW_RFOFF_DETECTED -rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ); -#endif - - -#ifdef CONFIG_LPS -void LPS_Enter(PADAPTER padapter); -void LPS_Leave(PADAPTER padapter); -#endif - -#ifdef CONFIG_RESUME_IN_WORKQUEUE -void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv); -#endif //CONFIG_RESUME_IN_WORKQUEUE - -#if defined(CONFIG_HAS_EARLYSUSPEND ) || defined(CONFIG_ANDROID_POWER) -#define rtw_is_earlysuspend_registered(pwrpriv) (pwrpriv)->early_suspend.suspend -void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv); -void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv); -#endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER - -u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val); - -#endif //__RTL871X_PWRCTRL_H_ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_qos.h b/drivers/net/wireless/rtl8192c/include/rtw_qos.h deleted file mode 100755 index e35b77f4f9c1..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_qos.h +++ /dev/null @@ -1,41 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ - - -#ifndef _RTW_QOS_H_ -#define _RTW_QOS_H_ -#include -#include - - - - - - -struct qos_priv { - - unsigned int qos_option; //bit mask option: u-apsd, s-apsd, ts, block ack... - -}; - - -#endif //_RTL871X_QOS_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_recv.h b/drivers/net/wireless/rtl8192c/include/rtw_recv.h deleted file mode 100755 index 0562e59331ab..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_recv.h +++ /dev/null @@ -1,703 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_RECV_H_ -#define _RTW_RECV_H_ - -#include -#include -#include - - -#define NR_RECVFRAME 256 - -#define RXFRAME_ALIGN 8 -#define RXFRAME_ALIGN_SZ (1<signal_stat_timer, (recvpriv)->signal_stat_sampling_interval) -#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS - -struct sta_recv_priv { - - _lock lock; - sint option; - - //_queue blk_strms[MAX_RX_NUMBLKS]; - _queue defrag_q; //keeping the fragment frame until defrag - - struct stainfo_rxcache rxcache; - - //uint sta_rx_bytes; - //uint sta_rx_pkts; - //uint sta_rx_fail; - -}; - - -struct recv_buf{ - - _list list; - - _lock recvbuf_lock; - - u32 ref_cnt; - - _adapter *adapter; - -#ifdef CONFIG_SDIO_HCI -#ifdef PLATFORM_OS_XP - PMDL mdl_ptr; -#endif - u8 cmd_fail; -#endif - -#ifdef CONFIG_USB_HCI - - #if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) - PURB purb; - dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ - u32 alloc_sz; - #endif - - #ifdef PLATFORM_OS_XP - PIRP pirp; - #endif - - #ifdef PLATFORM_OS_CE - USB_TRANSFER usb_transfer_read_port; - #endif - - u8 irp_pending; - int transfer_len; - -#endif - -#ifdef PLATFORM_LINUX - _pkt *pskb; - u8 reuse; -#endif - - uint len; - u8 *phead; - u8 *pdata; - u8 *ptail; - u8 *pend; - - u8 *pbuf; - u8 *pallocated_buf; - -}; - - -/* - head -----> - - data -----> - - payload - - tail -----> - - - end -----> - - len = (unsigned int )(tail - data); - -*/ -struct recv_frame_hdr{ - - _list list; - _pkt *pkt; - _pkt *pkt_newalloc; - - _adapter *adapter; - - u8 fragcnt; - - int frame_tag; - - struct rx_pkt_attrib attrib; - - uint len; - u8 *rx_head; - u8 *rx_data; - u8 *rx_tail; - u8 *rx_end; - - void *precvbuf; - - - // - struct sta_info *psta; - - //for A-MPDU Rx reordering buffer control - struct recv_reorder_ctrl *preorder_ctrl; - -}; - - -union recv_frame{ - - union{ - _list list; - struct recv_frame_hdr hdr; - uint mem[RECVFRAME_HDR_ALIGN>>2]; - }u; - - //uint mem[MAX_RXSZ>>2]; - -}; - - -extern union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue -extern void rtw_init_recvframe(union recv_frame *precvframe ,struct recv_priv *precvpriv); -extern int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue); -extern union recv_frame *rtw_dequeue_recvframe (_queue *queue); -extern int rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); -extern void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue); - -sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue); -struct recv_buf *rtw_dequeue_recvbuf (_queue *queue); - -void rtw_reordering_ctrl_timeout_handler(void *pcontext); - -__inline static u8 *get_rxmem(union recv_frame *precvframe) -{ - //always return rx_head... - if(precvframe==NULL) - return NULL; - - return precvframe->u.hdr.rx_head; -} - -__inline static u8 *get_rx_status(union recv_frame *precvframe) -{ - - return get_rxmem(precvframe); - -} - -__inline static u8 *get_recvframe_data(union recv_frame *precvframe) -{ - - //alwasy return rx_data - if(precvframe==NULL) - return NULL; - - return precvframe->u.hdr.rx_data; - -} - -__inline static u8 *recvframe_push(union recv_frame *precvframe, sint sz) -{ - // append data before rx_data - - /* add data to the start of recv_frame - * - * This function extends the used data area of the recv_frame at the buffer - * start. rx_data must be still larger than rx_head, after pushing. - */ - - if(precvframe==NULL) - return NULL; - - - precvframe->u.hdr.rx_data -= sz ; - if( precvframe->u.hdr.rx_data < precvframe->u.hdr.rx_head ) - { - precvframe->u.hdr.rx_data += sz ; - return NULL; - } - - precvframe->u.hdr.len +=sz; - - return precvframe->u.hdr.rx_data; - -} - - -__inline static u8 *recvframe_pull(union recv_frame *precvframe, sint sz) -{ - // rx_data += sz; move rx_data sz bytes hereafter - - //used for extract sz bytes from rx_data, update rx_data and return the updated rx_data to the caller - - - if(precvframe==NULL) - return NULL; - - - precvframe->u.hdr.rx_data += sz; - - if(precvframe->u.hdr.rx_data > precvframe->u.hdr.rx_tail) - { - precvframe->u.hdr.rx_data -= sz; - return NULL; - } - - precvframe->u.hdr.len -=sz; - - return precvframe->u.hdr.rx_data; - -} - -__inline static u8 *recvframe_put(union recv_frame *precvframe, sint sz) -{ - // rx_tai += sz; move rx_tail sz bytes hereafter - - //used for append sz bytes from ptr to rx_tail, update rx_tail and return the updated rx_tail to the caller - //after putting, rx_tail must be still larger than rx_end. - unsigned char * prev_rx_tail; - - if(precvframe==NULL) - return NULL; - - prev_rx_tail = precvframe->u.hdr.rx_tail; - - precvframe->u.hdr.rx_tail += sz; - - if(precvframe->u.hdr.rx_tail > precvframe->u.hdr.rx_end) - { - precvframe->u.hdr.rx_tail -= sz; - return NULL; - } - - precvframe->u.hdr.len +=sz; - - return precvframe->u.hdr.rx_tail; - -} - - - -__inline static u8 *recvframe_pull_tail(union recv_frame *precvframe, sint sz) -{ - // rmv data from rx_tail (by yitsen) - - //used for extract sz bytes from rx_end, update rx_end and return the updated rx_end to the caller - //after pulling, rx_end must be still larger than rx_data. - - if(precvframe==NULL) - return NULL; - - precvframe->u.hdr.rx_tail -= sz; - - if(precvframe->u.hdr.rx_tail < precvframe->u.hdr.rx_data) - { - precvframe->u.hdr.rx_tail += sz; - return NULL; - } - - precvframe->u.hdr.len -=sz; - - return precvframe->u.hdr.rx_tail; - -} - - - -__inline static _buffer * get_rxbuf_desc(union recv_frame *precvframe) -{ - _buffer * buf_desc; - - if(precvframe==NULL) - return NULL; -#ifdef PLATFORM_WINDOWS - NdisQueryPacket(precvframe->u.hdr.pkt, NULL, NULL, &buf_desc, NULL); -#endif - - return buf_desc; -} - - -__inline static union recv_frame *rxmem_to_recvframe(u8 *rxmem) -{ - //due to the design of 2048 bytes alignment of recv_frame, we can reference the union recv_frame - //from any given member of recv_frame. - // rxmem indicates the any member/address in recv_frame - - return (union recv_frame*)(((uint)rxmem>>RXFRAME_ALIGN) <u.hdr.rx_head; - -} - -__inline static u8 *pkt_to_recvdata(_pkt *pkt) -{ - // return the rx_data - - union recv_frame * precv_frame =pkt_to_recvframe(pkt); - - return precv_frame->u.hdr.rx_data; - -} - - -__inline static sint get_recvframe_len(union recv_frame *precvframe) -{ - return precvframe->u.hdr.len; -} - -__inline static u8 query_rx_pwr_percentage(s8 antpower ) -{ - if ((antpower <= -100) || (antpower >= 20)) - { - return 0; - } - else if (antpower >= 0) - { - return 100; - } - else - { - return (100+antpower); - } -} -__inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex) -{ - s32 SignalPower; // in dBm. - - // Translate to dBm (x=0.5y-95). - SignalPower = (s32)((SignalStrengthIndex + 1) >> 1); - SignalPower -= 95; - - return SignalPower; -} - - -struct sta_info; - -extern void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv); - -extern void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame); - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_rf.h b/drivers/net/wireless/rtl8192c/include/rtw_rf.h deleted file mode 100755 index 0b139633015b..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_rf.h +++ /dev/null @@ -1,138 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_RF_H_ -#define __RTW_RF_H_ - -#include -#include - -#define OFDM_PHY 1 -#define MIXED_PHY 2 -#define CCK_PHY 3 - -#define NumRates (13) - -// slot time for 11g -#define SHORT_SLOT_TIME 9 -#define NON_SHORT_SLOT_TIME 20 - -#define RTL8711_RF_MAX_SENS 6 -#define RTL8711_RF_DEF_SENS 4 - - -#define NUM_CHANNELS 32 -//#define NUM_REGULATORYS 21 -#define NUM_REGULATORYS 1 - -//Country codes -#define USA 0x555320 -#define EUROPE 0x1 //temp, should be provided later -#define JAPAN 0x2 //temp, should be provided later - -struct regulatory_class { - u32 starting_freq; //MHz, - u8 channel_set[NUM_CHANNELS]; - u8 channel_cck_power[NUM_CHANNELS];//dbm - u8 channel_ofdm_power[NUM_CHANNELS];//dbm - u8 txpower_limit; //dbm - u8 channel_spacing; //MHz - u8 modem; -}; - -typedef enum _CAPABILITY{ - cESS = 0x0001, - cIBSS = 0x0002, - cPollable = 0x0004, - cPollReq = 0x0008, - cPrivacy = 0x0010, - cShortPreamble = 0x0020, - cPBCC = 0x0040, - cChannelAgility = 0x0080, - cSpectrumMgnt = 0x0100, - cQos = 0x0200, // For HCCA, use with CF-Pollable and CF-PollReq - cShortSlotTime = 0x0400, - cAPSD = 0x0800, - cRM = 0x1000, // RRM (Radio Request Measurement) - cDSSS_OFDM = 0x2000, - cDelayedBA = 0x4000, - cImmediateBA = 0x8000, -}CAPABILITY, *PCAPABILITY; - -enum _REG_PREAMBLE_MODE{ - PREAMBLE_LONG = 1, - PREAMBLE_AUTO = 2, - PREAMBLE_SHORT = 3, -}; - - -enum _RTL8712_RF_MIMO_CONFIG_{ - RTL8712_RFCONFIG_1T=0x10, - RTL8712_RFCONFIG_2T=0x20, - RTL8712_RFCONFIG_1R=0x01, - RTL8712_RFCONFIG_2R=0x02, - RTL8712_RFCONFIG_1T1R=0x11, - RTL8712_RFCONFIG_1T2R=0x12, - RTL8712_RFCONFIG_TURBO=0x92, - RTL8712_RFCONFIG_2T2R=0x22 -}; - - -// Bandwidth Offset -#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 -#define HAL_PRIME_CHNL_OFFSET_LOWER 1 -#define HAL_PRIME_CHNL_OFFSET_UPPER 2 - -// Represent Channel Width in HT Capabilities -// -typedef enum _HT_CHANNEL_WIDTH { - HT_CHANNEL_WIDTH_20 = 0, - HT_CHANNEL_WIDTH_40 = 1, -}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH; - -// -// Represent Extention Channel Offset in HT Capabilities -// This is available only in 40Mhz mode. -// -typedef enum _HT_EXTCHNL_OFFSET{ - HT_EXTCHNL_OFFSET_NO_EXT = 0, - HT_EXTCHNL_OFFSET_UPPER = 1, - HT_EXTCHNL_OFFSET_NO_DEF = 2, - HT_EXTCHNL_OFFSET_LOWER = 3, -}HT_EXTCHNL_OFFSET, *PHT_EXTCHNL_OFFSET; - -/* 2007/11/15 MH Define different RF type. */ -typedef enum _RT_RF_TYPE_DEFINITION -{ - RF_1T2R = 0, - RF_2T4R = 1, - RF_2T2R = 2, - RF_1T1R = 3, - RF_2T2R_GREEN = 4, - RF_819X_MAX_TYPE = 5, -}RT_RF_TYPE_DEF_E; - - -u32 rtw_ch2freq(u32 ch); -u32 rtw_freq2ch(u32 freq); - - -#endif //_RTL8711_RF_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_security.h b/drivers/net/wireless/rtl8192c/include/rtw_security.h deleted file mode 100755 index 02ef9b011b45..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_security.h +++ /dev/null @@ -1,423 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __RTW_SECURITY_H_ -#define __RTW_SECURITY_H_ - - -#include -#include -#include - - -#define _NO_PRIVACY_ 0x0 -#define _WEP40_ 0x1 -#define _TKIP_ 0x2 -#define _TKIP_WTMIC_ 0x3 -#define _AES_ 0x4 -#define _WEP104_ 0x5 - -#define _WPA_IE_ID_ 0xdd -#define _WPA2_IE_ID_ 0x30 - -#define SHA256_MAC_LEN 32 -#define AES_BLOCK_SIZE 16 -#define AES_PRIV_SIZE (4 * 44) - -#ifndef Ndis802_11AuthModeWPA2 -#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1) -#endif - -#ifndef Ndis802_11AuthModeWPA2PSK -#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2) -#endif - -union pn48 { - - u64 val; - -#ifdef CONFIG_LITTLE_ENDIAN - -struct { - u8 TSC0; - u8 TSC1; - u8 TSC2; - u8 TSC3; - u8 TSC4; - u8 TSC5; - u8 TSC6; - u8 TSC7; -} _byte_; - -#elif defined(CONFIG_BIG_ENDIAN) - -struct { - u8 TSC7; - u8 TSC6; - u8 TSC5; - u8 TSC4; - u8 TSC3; - u8 TSC2; - u8 TSC1; - u8 TSC0; -} _byte_; - -#endif - -}; - -union Keytype { - u8 skey[16]; - u32 lkey[4]; -}; - - -typedef struct _RT_PMKID_LIST -{ - u8 bUsed; - u8 Bssid[6]; - u8 PMKID[16]; - u8 SsidBuf[33]; - u8* ssid_octet; - u16 ssid_length; -} RT_PMKID_LIST, *PRT_PMKID_LIST; - - -struct security_priv -{ - u32 dot11AuthAlgrthm; // 802.11 auth, could be open, shared, 8021x and authswitch - u32 dot11PrivacyAlgrthm; // This specify the privacy for shared auth. algorithm. - - /* WEP */ - u32 dot11PrivacyKeyIndex; // this is only valid for legendary wep, 0~3 for key id. (tx key index) - union Keytype dot11DefKey[4]; // this is only valid for def. key - u32 dot11DefKeylen[4]; - - u32 dot118021XGrpPrivacy; // This specify the privacy algthm. used for Grp key - u32 dot118021XGrpKeyid; // key id used for Grp Key ( tx key index) - union Keytype dot118021XGrpKey[4]; // 802.1x Group Key, for inx0 and inx1 - union Keytype dot118021XGrptxmickey[4]; - union Keytype dot118021XGrprxmickey[4]; - union pn48 dot11Grptxpn; // PN48 used for Grp Key xmit. - union pn48 dot11Grprxpn; // PN48 used for Grp Key recv. - -#ifdef CONFIG_AP_MODE - //extend security capabilities for AP_MODE - unsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x - unsigned int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 - unsigned int wpa_group_cipher; - unsigned int wpa2_group_cipher; - unsigned int wpa_pairwise_cipher; - unsigned int wpa2_pairwise_cipher; -#endif - - u8 wps_phase;//for wps - u8 wps_ie[MAX_WPS_IE_LEN];//added in assoc req - int wps_ie_len; - - - u8 binstallGrpkey; - u8 busetkipkey; - //_timer tkip_timer; - u8 bcheck_grpkey; - u8 bgrpkey_handshake; - - //u8 packet_cnt;//unused, removed - - s32 sw_encrypt;//from registry_priv - s32 sw_decrypt;//from registry_priv - - s32 hw_decrypted;//if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready. - - - //keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc) - u32 ndisauthtype; // NDIS_802_11_AUTHENTICATION_MODE - u32 ndisencryptstatus; // NDIS_802_11_ENCRYPTION_STATUS - - WLAN_BSSID_EX sec_bss; //for joinbss (h2c buffer) usage - - NDIS_802_11_WEP ndiswep; -#ifdef PLATFORM_WINDOWS - u8 KeyMaterial[16];// variable length depending on above field. -#endif - - u8 assoc_info[600]; - u8 szofcapability[256]; //for wpa2 usage - u8 oidassociation[512]; //for wpa/wpa2 usage - u8 authenticator_ie[256]; //store ap security information element - u8 supplicant_ie[256]; //store sta security information element - - - //for tkip countermeasure - u32 last_mic_err_time; - u8 btkip_countermeasure; - u8 btkip_wait_report; - u32 btkip_countermeasure_time; - - //--------------------------------------------------------------------------- - // For WPA2 Pre-Authentication. - //--------------------------------------------------------------------------- - //u8 RegEnablePreAuth; // Default value: Pre-Authentication enabled or not, from registry "EnablePreAuth". Added by Annie, 2005-11-01. - //u8 EnablePreAuthentication; // Current Value: Pre-Authentication enabled or not. - RT_PMKID_LIST PMKIDList[NUM_PMKID_CACHE]; // Renamed from PreAuthKey[NUM_PRE_AUTH_KEY]. Annie, 2006-10-13. - u8 PMKIDIndex; - //u32 PMKIDCount; // Added by Annie, 2006-10-13. - //u8 szCapability[256]; // For WPA2-PSK using zero-config, by Annie, 2005-09-20. - -}; - -struct sha256_state { - u64 length; - u32 state[8], curlen; - u8 buf[64]; -}; - -#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\ -do{\ - switch(psecuritypriv->dot11AuthAlgrthm)\ - {\ - case dot11AuthAlgrthm_Open:\ - case dot11AuthAlgrthm_Shared:\ - case dot11AuthAlgrthm_Auto:\ - encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\ - break;\ - case dot11AuthAlgrthm_8021X:\ - if(bmcst)\ - encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\ - else\ - encry_algo =(u8) psta->dot118021XPrivacy;\ - break;\ - }\ -}while(0) - - -#define SET_ICE_IV_LEN( iv_len, icv_len, encrypt)\ -do{\ - switch(encrypt)\ - {\ - case _WEP40_:\ - case _WEP104_:\ - iv_len = 4;\ - icv_len = 4;\ - break;\ - case _TKIP_:\ - iv_len = 8;\ - icv_len = 4;\ - break;\ - case _AES_:\ - iv_len = 8;\ - icv_len = 8;\ - break;\ - default:\ - iv_len = 0;\ - icv_len = 0;\ - break;\ - }\ -}while(0) - - -#define GET_TKIP_PN(iv,dot11txpn)\ -do{\ - dot11txpn._byte_.TSC0=iv[2];\ - dot11txpn._byte_.TSC1=iv[0];\ - dot11txpn._byte_.TSC2=iv[4];\ - dot11txpn._byte_.TSC3=iv[5];\ - dot11txpn._byte_.TSC4=iv[6];\ - dot11txpn._byte_.TSC5=iv[7];\ -}while(0) - - -#define ROL32( A, n ) ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) -#define ROR32( A, n ) ROL32( (A), 32-(n) ) - -struct mic_data -{ - u32 K0, K1; // Key - u32 L, R; // Current state - u32 M; // Message accumulator (single word) - u32 nBytesInM; // # bytes in M -}; - -extern const u32 Te0[256]; -extern const u32 Te1[256]; -extern const u32 Te2[256]; -extern const u32 Te3[256]; -extern const u32 Te4[256]; -extern const u32 Td0[256]; -extern const u32 Td1[256]; -extern const u32 Td2[256]; -extern const u32 Td3[256]; -extern const u32 Td4[256]; -extern const u32 rcon[10]; -extern const u8 Td4s[256]; -extern const u8 rcons[10]; - -#define RCON(i) (rcons[(i)] << 24) - -static inline u32 rotr(u32 val, int bits) -{ - return (val >> bits) | (val << (32 - bits)); -} - -#define TE0(i) Te0[((i) >> 24) & 0xff] -#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8) -#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16) -#define TE3(i) rotr(Te0[(i) & 0xff], 24) -#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000) -#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000) -#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00) -#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff) -#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000) -#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000) -#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00) -#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff) -#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff) - -#define TD0(i) Td0[((i) >> 24) & 0xff] -#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8) -#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16) -#define TD3(i) rotr(Td0[(i) & 0xff], 24) -#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24) -#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16) -#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8) -#define TD44(i) (Td4s[(i) & 0xff]) -#define TD0_(i) Td0[(i) & 0xff] -#define TD1_(i) rotr(Td0[(i) & 0xff], 8) -#define TD2_(i) rotr(Td0[(i) & 0xff], 16) -#define TD3_(i) rotr(Td0[(i) & 0xff], 24) - -#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \ - ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) - -#define PUTU32(ct, st) { \ -(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \ -(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } - -#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ - (((u32) (a)[2]) << 8) | ((u32) (a)[3])) - -#define WPA_PUT_LE16(a, val) \ - do { \ - (a)[1] = ((u16) (val)) >> 8; \ - (a)[0] = ((u16) (val)) & 0xff; \ - } while (0) - -#define WPA_PUT_BE32(a, val) \ - do { \ - (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ - (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ - (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ - (a)[3] = (u8) (((u32) (val)) & 0xff); \ - } while (0) - -#define WPA_PUT_BE64(a, val) \ - do { \ - (a)[0] = (u8) (((u64) (val)) >> 56); \ - (a)[1] = (u8) (((u64) (val)) >> 48); \ - (a)[2] = (u8) (((u64) (val)) >> 40); \ - (a)[3] = (u8) (((u64) (val)) >> 32); \ - (a)[4] = (u8) (((u64) (val)) >> 24); \ - (a)[5] = (u8) (((u64) (val)) >> 16); \ - (a)[6] = (u8) (((u64) (val)) >> 8); \ - (a)[7] = (u8) (((u64) (val)) & 0xff); \ - } while (0) - -/* ===== start - public domain SHA256 implementation ===== */ - -/* This is based on SHA256 implementation in LibTomCrypt that was released into - * public domain by Tom St Denis. */ - -/* the K array */ -static const unsigned long K[64] = { - 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, - 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, - 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, - 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, - 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, - 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, - 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, - 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, - 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, - 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, - 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, - 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, - 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL -}; - - -/* Various logical functions */ -#define RORc(x, y) \ -( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \ - ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL) -#define Ch(x,y,z) (z ^ (x & (y ^ z))) -#define Maj(x,y,z) (((x | y) & z) | (x & y)) -#define S(x, n) RORc((x), (n)) -#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) -#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) -#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) -#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) -#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) -#ifndef MIN -#define MIN(x, y) (((x) < (y)) ? (x) : (y)) -#endif - -void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ); -void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ); -void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes ); -void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ); - -void rtw_seccalctkipmic( - u8 * key, - u8 *header, - u8 *data, - u32 data_len, - u8 *Miccode, - u8 priority); - -u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe); -u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe); -void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe); - -u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe); -u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe); -void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe); - -#ifdef CONFIG_TDLS -void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta); -int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, - u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, - u8 *mic); -int tdls_verify_mic(u8 *kck, u8 trans_seq, - u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie); -#endif - -#ifdef PLATFORM_WINDOWS -void rtw_use_tkipkey_handler ( - IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3 - ); -#endif -#ifdef PLATFORM_LINUX -void rtw_use_tkipkey_handler(void* FunctionContext); -#endif -#endif //__RTL871X_SECURITY_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/rtw_version.h b/drivers/net/wireless/rtl8192c/include/rtw_version.h deleted file mode 100644 index 4ac0ef84d93e..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_version.h +++ /dev/null @@ -1 +0,0 @@ -#define DRIVERVERSION "v3.0.2230.20110728" diff --git a/drivers/net/wireless/rtl8192c/include/rtw_xmit.h b/drivers/net/wireless/rtl8192c/include/rtw_xmit.h deleted file mode 100755 index 38676b302075..000000000000 --- a/drivers/net/wireless/rtl8192c/include/rtw_xmit.h +++ /dev/null @@ -1,665 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _RTW_XMIT_H_ -#define _RTW_XMIT_H_ - -#include -#include -#include -#include - -#ifdef CONFIG_SDIO_HCI -#define MAX_XMITBUF_SZ (30720)// (2048) -#define NR_XMITBUFF (16) - -#elif defined (CONFIG_USB_HCI) -#ifdef CONFIG_USB_TX_AGGREGATION -#define MAX_XMITBUF_SZ 20480 // 20k -#else -#define MAX_XMITBUF_SZ (2048) -#endif - -#ifdef CONFIG_SPECIFIC_URB_NUM -#define NR_XMITBUFF (1) -#else -#define NR_XMITBUFF (4) -#endif - -#elif defined (CONFIG_PCI_HCI) -#define MAX_XMITBUF_SZ (1664) -#define NR_XMITBUFF (128) -#endif - -#ifdef PLATFORM_OS_CE -#define XMITBUF_ALIGN_SZ 4 -#else -#ifdef CONFIG_PCI_HCI -#define XMITBUF_ALIGN_SZ 4 -#else -#define XMITBUF_ALIGN_SZ 512 -#endif -#endif - -// xmit extension buff defination -#define MAX_XMIT_EXTBUF_SZ (2048) - -#ifdef CONFIG_SPECIFIC_URB_NUM -#define NR_XMIT_EXTBUFF (1) -#else -#define NR_XMIT_EXTBUFF (4) -#endif - -#define MAX_NUMBLKS (1) - -#define XMIT_VO_QUEUE (0) -#define XMIT_VI_QUEUE (1) -#define XMIT_BE_QUEUE (2) -#define XMIT_BK_QUEUE (3) - -#ifdef CONFIG_PCI_HCI -#define TXDESC_NUM 64 -//#define TXDESC_NUM 128 -#define TXDESC_NUM_BE_QUEUE 128 -#endif - -#define WEP_IV(pattrib_iv, dot11txpn, keyidx)\ -do{\ - pattrib_iv[0] = dot11txpn._byte_.TSC0;\ - pattrib_iv[1] = dot11txpn._byte_.TSC1;\ - pattrib_iv[2] = dot11txpn._byte_.TSC2;\ - pattrib_iv[3] = ((keyidx & 0x3)<<6);\ - dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\ -}while(0) - - -#define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\ -do{\ - pattrib_iv[0] = dot11txpn._byte_.TSC1;\ - pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\ - pattrib_iv[2] = dot11txpn._byte_.TSC0;\ - pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ - pattrib_iv[4] = dot11txpn._byte_.TSC2;\ - pattrib_iv[5] = dot11txpn._byte_.TSC3;\ - pattrib_iv[6] = dot11txpn._byte_.TSC4;\ - pattrib_iv[7] = dot11txpn._byte_.TSC5;\ - dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ -}while(0) - -#define AES_IV(pattrib_iv, dot11txpn, keyidx)\ -do{\ - pattrib_iv[0] = dot11txpn._byte_.TSC0;\ - pattrib_iv[1] = dot11txpn._byte_.TSC1;\ - pattrib_iv[2] = 0;\ - pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ - pattrib_iv[4] = dot11txpn._byte_.TSC2;\ - pattrib_iv[5] = dot11txpn._byte_.TSC3;\ - pattrib_iv[6] = dot11txpn._byte_.TSC4;\ - pattrib_iv[7] = dot11txpn._byte_.TSC5;\ - dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ -}while(0) - - -#define HWXMIT_ENTRY 4 - -#define TXDESC_SIZE 32 -#define PACKET_OFFSET_SZ (8) - -#ifdef CONFIG_USB_HCI -#define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ) -#endif - -#ifdef CONFIG_PCI_HCI -#define TXDESC_OFFSET 0 -#define TX_DESC_NEXT_DESC_OFFSET 40 -#endif - -// -//defined for TX DESC Operation -// - -#define MAX_TID (15) - -//OFFSET 0 -#define OFFSET_SZ 0 -#define OFFSET_SHT 16 -#define BMC BIT(24) -#define LSG BIT(26) -#define FSG BIT(27) -#define OWN BIT(31) - -//OFFSET 4 -#define PKT_OFFSET_SZ 0 -#define BK BIT(6) -#define QSEL_SHT 8 -#define Rate_ID_SHT 16 -#define NAVUSEHDR BIT(20) -#define PKT_OFFSET_SHT 26 -#define HWPC BIT(31) - -//OFFSET 8 -#define AGG_EN BIT(29) - -//OFFSET 12 -#define SEQ_SHT 16 - -//OFFSET 16 -#define QoS BIT(6) -#define HW_SEQ_EN BIT(7) -#define USERATE BIT(8) -#define DISDATAFB BIT(10) -#define DATA_SHORT BIT(24) -#define DATA_BW BIT(25) - -//OFFSET 20 -#define SGI BIT(6) - -struct tx_desc{ - - //DWORD 0 - unsigned int txdw0; - - unsigned int txdw1; - - unsigned int txdw2; - - unsigned int txdw3; - - unsigned int txdw4; - - unsigned int txdw5; - - unsigned int txdw6; - - unsigned int txdw7; -#ifdef CONFIG_PCI_HCI - unsigned int txdw8; - - unsigned int txdw9; - - unsigned int txdw10; - - unsigned int txdw11; - - // 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now, our descriptor - // size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute - // memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor - // number or enlarge descriptor size as 64 bytes. - unsigned int txdw12; - - unsigned int txdw13; - - unsigned int txdw14; - - unsigned int txdw15; -#endif -}; - - -union txdesc { - struct tx_desc txdesc; - unsigned int value[TXDESC_SIZE>>2]; -}; - -#ifdef CONFIG_PCI_HCI -#define PCI_MAX_TX_QUEUE_COUNT 8 - -struct rtw_tx_ring { - struct tx_desc *desc; - dma_addr_t dma; - unsigned int idx; - unsigned int entries; - _queue queue; - u32 qlen; -}; -#endif - -struct hw_xmit { - //_lock xmit_lock; - //_list pending; - _queue *sta_queue; - //struct hw_txqueue *phwtxqueue; - //sint txcmdcnt; - int accnt; -}; - -#if 0 -struct pkt_attrib -{ - u8 type; - u8 subtype; - u8 bswenc; - u8 dhcp_pkt; - u16 ether_type; - int pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) - int pkt_hdrlen; //the original 802.3 pkt header len - int hdrlen; //the WLAN Header Len - int nr_frags; - int last_txcmdsz; - int encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith - u8 iv[8]; - int iv_len; - u8 icv[8]; - int icv_len; - int priority; - int ack_policy; - int mac_id; - int vcs_mode; //virtual carrier sense method - - u8 dst[ETH_ALEN]; - u8 src[ETH_ALEN]; - u8 ta[ETH_ALEN]; - u8 ra[ETH_ALEN]; - - u8 key_idx; - - u8 qos_en; - u8 ht_en; - u8 raid;//rate adpative id - u8 bwmode; - u8 ch_offset;//PRIME_CHNL_OFFSET - u8 sgi;//short GI - u8 ampdu_en;//tx ampdu enable - u8 mdata;//more data bit - u8 eosp; - - u8 pctrl;//per packet txdesc control enable - u8 triggered;//for ap mode handling Power Saving sta - - u32 qsel; - u16 seqnum; - - struct sta_info * psta; -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - u8 hw_tcp_csum; -#endif -}; -#else -//reduce size -struct pkt_attrib -{ - u8 type; - u8 subtype; - u8 bswenc; - u8 dhcp_pkt; - u16 ether_type; - u16 seqnum; - u16 pkt_hdrlen; //the original 802.3 pkt header len - u16 hdrlen; //the WLAN Header Len - u32 pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) - u32 last_txcmdsz; - u8 nr_frags; - u8 encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith - u8 iv_len; - u8 icv_len; - u8 iv[8]; - u8 icv[8]; - u8 priority; - u8 ack_policy; - u8 mac_id; - u8 vcs_mode; //virtual carrier sense method - u8 dst[ETH_ALEN]; - u8 src[ETH_ALEN]; - u8 ta[ETH_ALEN]; - u8 ra[ETH_ALEN]; - u8 key_idx; - u8 qos_en; - u8 ht_en; - u8 raid;//rate adpative id - u8 bwmode; - u8 ch_offset;//PRIME_CHNL_OFFSET - u8 sgi;//short GI - u8 ampdu_en;//tx ampdu enable - u8 mdata;//more data bit - u8 pctrl;//per packet txdesc control enable - u8 triggered;//for ap mode handling Power Saving sta - u8 qsel; - u8 eosp; - - struct sta_info * psta; -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - u8 hw_tcp_csum; -#endif -}; -#endif - - -#define WLANHDR_OFFSET 64 - -#define NULL_FRAMETAG (0x0) -#define DATA_FRAMETAG 0x01 -#define L2_FRAMETAG 0x02 -#define MGNT_FRAMETAG 0x03 -#define AMSDU_FRAMETAG 0x04 - -#define EII_FRAMETAG 0x05 -#define IEEE8023_FRAMETAG 0x06 - -#define MP_FRAMETAG 0x07 - -#define TXAGG_FRAMETAG 0x08 - - -struct xmit_buf -{ - _list list; - - _adapter *padapter; - - u8 *pallocated_buf; - - u8 *pbuf; - - void *priv_data; - - u16 ext_tag; // 0: Normal xmitbuf, 1: extension xmitbuf. - u16 flags; - u32 alloc_sz; - -#ifdef CONFIG_USB_HCI - - u32 sz[8]; - -#if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) - PURB pxmit_urb[8]; - dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ -#endif - -#ifdef PLATFORM_OS_XP - PIRP pxmit_irp[8]; -#endif - -#ifdef PLATFORM_OS_CE - USB_TRANSFER usb_transfer_write_port; -#endif - - u8 bpending[8]; - - sint last[8]; - -#endif - -#ifdef CONFIG_SDIO_HCI - u32 len; - u8 *phead; - u8 *pdata; - u8 *ptail; - u8 *pend; - u32 ff_hwaddr; -#ifdef PLATFORM_OS_XP - PMDL pxmitbuf_mdl; - PIRP pxmitbuf_irp; - PSDBUS_REQUEST_PACKET pxmitbuf_sdrp; -#endif -#endif - -#ifdef CONFIG_PCI_HCI - u32 len; -#endif - -#ifdef DBG_XMIT_BUF - u8 no; -#endif - -}; - -struct xmit_frame -{ - _list list; - - struct pkt_attrib attrib; - - _pkt *pkt; - - int frame_tag; - - _adapter *padapter; - - u8 *buf_addr; - - struct xmit_buf *pxmitbuf; - -#ifdef CONFIG_SDIO_HCI - u8 pg_num; -#endif - -#ifdef CONFIG_USB_HCI -#ifdef CONFIG_USB_TX_AGGREGATION - u8 agg_num; -#endif - u8 pkt_offset; -#ifdef CONFIG_RTL8192D - u8 EMPktNum; - u16 EMPktLen[5];//The max value by HW -#endif -#endif -}; - -struct tx_servq { - _list tx_pending; - _queue sta_pending; - int qcnt; -}; - - - -struct sta_xmit_priv -{ - _lock lock; - sint option; - sint apsd_setting; //When bit mask is on, the associated edca queue supports APSD. - - - //struct tx_servq blk_q[MAX_NUMBLKS]; - struct tx_servq be_q; //priority == 0,3 - struct tx_servq bk_q; //priority == 1,2 - struct tx_servq vi_q; //priority == 4,5 - struct tx_servq vo_q; //priority == 6,7 - _list legacy_dz; - _list apsd; - - u16 txseq_tid[16]; - - //uint sta_tx_bytes; - //u64 sta_tx_pkts; - //uint sta_tx_fail; - -}; - - -struct hw_txqueue { - volatile sint head; - volatile sint tail; - volatile sint free_sz; //in units of 64 bytes - volatile sint free_cmdsz; - volatile sint txsz[8]; - uint ff_hwaddr; - uint cmd_hwaddr; - sint ac_tag; -}; - - -struct xmit_priv { - - _lock lock; - - _sema xmit_sema; - _sema terminate_xmitthread_sema; - - //_queue blk_strms[MAX_NUMBLKS]; - _queue be_pending; - _queue bk_pending; - _queue vi_pending; - _queue vo_pending; - _queue bm_pending; - - //_queue legacy_dz_queue; - //_queue apsd_queue; - - u8 *pallocated_frame_buf; - u8 *pxmit_frame_buf; - uint free_xmitframe_cnt; - - //uint mapping_addr; - //uint pkt_sz; - - _queue free_xmit_queue; - - //struct hw_txqueue be_txqueue; - //struct hw_txqueue bk_txqueue; - //struct hw_txqueue vi_txqueue; - //struct hw_txqueue vo_txqueue; - //struct hw_txqueue bmc_txqueue; - - uint frag_len; - - _adapter *adapter; - - u8 vcs_setting; - u8 vcs; - u8 vcs_type; - //u16 rts_thresh; - - u64 tx_bytes; - u64 tx_pkts; - u64 tx_drop; - u64 last_tx_bytes; - u64 last_tx_pkts; - - struct hw_xmit *hwxmits; - u8 hwxmit_entry; - -#ifdef CONFIG_USB_HCI - _sema tx_retevt;//all tx return event; - u8 txirp_cnt;// - -#ifdef PLATFORM_OS_CE - USB_TRANSFER usb_transfer_write_port; -// USB_TRANSFER usb_transfer_write_mem; -#endif -#ifdef PLATFORM_LINUX - struct tasklet_struct xmit_tasklet; -#endif - //per AC pending irp - int beq_cnt; - int bkq_cnt; - int viq_cnt; - int voq_cnt; - -#endif - -#ifdef CONFIG_SDIO_HCI - u8 free_pg[8]; - u8 public_pgsz; - u8 required_pgsz; - u8 used_pgsz; - u8 init_pgsz; -#ifdef PLATFORM_OS_XP - PMDL prd_freesz_mdl[2]; - u8 brd_freesz_pending[2]; - PIRP prd_freesz_irp[2]; - PSDBUS_REQUEST_PACKET prd_freesz_sdrp[2]; - u8 rd_freesz_irp_idx; -#endif - -#endif - -#ifdef CONFIG_PCI_HCI - // Tx - struct rtw_tx_ring tx_ring[PCI_MAX_TX_QUEUE_COUNT]; - int txringcount[PCI_MAX_TX_QUEUE_COUNT]; -#ifdef PLATFORM_LINUX - struct tasklet_struct xmit_tasklet; -#endif -#endif - - _queue free_xmitbuf_queue; - _queue pending_xmitbuf_queue; // unused?? - u8 *pallocated_xmitbuf; - u8 *pxmitbuf; - uint free_xmitbuf_cnt; - - _queue free_xmit_extbuf_queue; - u8 *pallocated_xmit_extbuf; - u8 *pxmit_extbuf; - uint free_xmit_extbuf_cnt; - - u16 nqos_ssn; - ATOMIC_T HwRdyXmitData; // driver should wait hw setting done for join event callback, only for Data Frame. 1:done 0:not yet. -}; - -extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv); -extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); - -extern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv); -extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); - -void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz); -extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len); -extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib); -extern s32 rtw_put_snap(u8 *data, u16 h_proto); - -extern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv); -extern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); -extern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue); -struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac); -extern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); -extern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry); - -extern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe); -extern thread_return rtw_xmit_thread(thread_context context); -extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe); -#ifdef CONFIG_TDLS -extern void fill_tdls_dis_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); -extern s32 xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, u8 action); -void rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe); -#endif -s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag); -void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv); - - -s32 rtw_txframes_pending(_adapter *padapter); -s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib); -void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry); - - -s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter); -void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv); - - -int rtw_alloc_hwxmits(_adapter *padapter); -void rtw_free_hwxmits(_adapter *padapter); - -s32 rtw_free_xmitframe_ex(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); - -s32 rtw_xmit(_adapter *padapter, _pkt *pkt); - -#ifdef CONFIG_TDLS -sint xmit_tdls_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe); -#endif - -#ifdef CONFIG_AP_MODE -sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe); -void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta); -void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta); -#endif - -#endif //_RTL871X_XMIT_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/sdio_hal.h b/drivers/net/wireless/rtl8192c/include/sdio_hal.h deleted file mode 100755 index 51139bb30f5c..000000000000 --- a/drivers/net/wireless/rtl8192c/include/sdio_hal.h +++ /dev/null @@ -1,34 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __SDIO_HAL_H__ - -#define __SDIO_HAL_H__ - -extern u8 sd_hal_bus_init(_adapter * adapter); -extern u8 sd_hal_bus_deinit(_adapter * adapter); - - -u8 sd_int_isr (IN PADAPTER padapter); -void sd_int_dpc(PADAPTER padapter); - - -#endif //__SDIO_HAL_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops.h b/drivers/net/wireless/rtl8192c/include/sdio_ops.h deleted file mode 100755 index b1e9b63e4d5e..000000000000 --- a/drivers/net/wireless/rtl8192c/include/sdio_ops.h +++ /dev/null @@ -1,80 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __SDIO_OPS_H_ -#define __SDIO_OPS_H_ - -#include -#include -#include -#include - -#ifdef PLATFORM_LINUX -#include -#endif - - - -#ifdef PLATFORM_WINDOWS - -#ifdef PLATFORM_OS_XP -#include -struct async_context -{ - PMDL pmdl; - PSDBUS_REQUEST_PACKET sdrp; - unsigned char* r_buf; - unsigned char* padapter; -}; -#endif -#ifdef PLATFORM_OS_CE -#include -#endif -#endif - - - -extern void sdio_set_intf_option(u32 *poption); - -extern void sdio_set_intf_funs(struct intf_hdl *pintf_hdl); - -extern uint sdio_init_intf_priv(struct intf_priv *pintfpriv); - -extern void sdio_unload_intf_priv(struct intf_priv *pintfpriv); - -extern void sdio_intf_hdl_init(u8 *priv); - -extern void sdio_intf_hdl_unload(u8 *priv); - -extern void sdio_intf_hdl_open(u8 *priv); - -extern void sdio_intf_hdl_close(u8 *priv); - -extern void sdio_set_intf_ops(struct _io_ops *pops); - -//extern void sdio_set_intf_callbacks(struct _io_callbacks *pcallbacks); -extern void sdio_func1cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem); -extern void sdio_func1cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem); - -extern uint __inline _cvrt2ftaddr(const u32 addr, u32 *pftaddr) ; - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h deleted file mode 100755 index 6b0c1a29f3ee..000000000000 --- a/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _SDIO_OPS_WINCE_H_ -#define _SDIO_OPS_WINCE_H_ - -#include -#include -#include -#include - - -#ifdef PLATFORM_OS_CE - - -extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); - - -extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8); - - -uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - -extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - - -extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); - -extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); -extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); -extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); - -#endif - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h deleted file mode 100755 index c58ab080c0f3..000000000000 --- a/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h +++ /dev/null @@ -1,55 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _SDIO_OPS_LINUX_H_ -#define _SDIO_OPS_LINUX_H_ - -#include -#include -#include -#include - - -#ifdef PLATFORM_LINUX - - -extern u8 sdbus_cmd52r(struct intf_priv *pintfpriv, u32 addr); - - -extern void sdbus_cmd52w(struct intf_priv *pintfpriv, u32 addr,u8 val8); -extern u8 sdbus_direct_read8(struct intf_priv *pintfpriv, u32 addr); -extern void sdbus_direct_write8(struct intf_priv *pintfpriv, u32 addr, u8 val8); - -extern uint sdbus_read_bytes_to_recvbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -extern uint sdbus_read_blocks_to_recvbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - - -extern uint sdbus_write_blocks_from_xmitbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); - -extern uint sdbus_write_bytes_from_xmitbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - - -extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); -#endif - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h deleted file mode 100755 index 3569611a49e0..000000000000 --- a/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _SDIO_OPS_XP_H_ -#define _SDIO_OPS_XP_H_ - -#include -#include -#include -#include - - -#ifdef PLATFORM_OS_XP - - -extern u8 sdbus_cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); - - -extern void sdbus_cmd52w_xp(struct intf_priv *pintfpriv, u32 addr,u8 val8); - - -uint sdbus_read_blocks_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - -extern uint sdbus_read_bytes_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); - - -extern uint sdbus_write_blocks_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); - -extern uint sdbus_write_bytes_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); -extern u8 sdbus_func1cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); -extern void sdbus_func1cmd52w_xp(struct intf_priv *pintfpriv, u32 addr, u8 val8); -extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); -extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); - -#endif - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/sdio_osintf.h b/drivers/net/wireless/rtl8192c/include/sdio_osintf.h deleted file mode 100755 index 099262b3e47d..000000000000 --- a/drivers/net/wireless/rtl8192c/include/sdio_osintf.h +++ /dev/null @@ -1,48 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __SDIO_OSINTF_H -#define __SDIO_OSINTF_H - - -#include -#include -#include - - -extern unsigned int sd_dvobj_init(_adapter * adapter); -extern void sd_dvobj_deinit(_adapter * adapter); - -void rtl871x_intf_stop(_adapter *padapter); - -u8 sd_hal_bus_init(_adapter * padapter); -u8 sd_hal_bus_deinit(_adapter * padapter); -void update_xmit_hw_res(_adapter * padapter); -void sd_c2h_hdl( PADAPTER padapter); - -#ifdef PLATFORM_OS_CE -extern NDIS_STATUS ce_sd_get_dev_hdl(_adapter *padapter ); -SD_API_STATUS -ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, _adapter* padapter); -extern void sd_setup_irs(_adapter *padapter); -#endif - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/sta_info.h b/drivers/net/wireless/rtl8192c/include/sta_info.h deleted file mode 100755 index c71bdc44b9b3..000000000000 --- a/drivers/net/wireless/rtl8192c/include/sta_info.h +++ /dev/null @@ -1,293 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __STA_INFO_H_ -#define __STA_INFO_H_ - -#include -#include -#include -#include - -#define IBSS_START_MAC_ID 2 -#define NUM_STA 32 -#define NUM_ACL 64 - - -//if mode ==0, then the sta is allowed once the addr is hit. -//if mode ==1, then the sta is rejected once the addr is non-hit. -struct rtw_wlan_acl_node { - _list list; - u8 addr[ETH_ALEN]; - u8 mode; -}; - -struct wlan_acl_pool { - struct rtw_wlan_acl_node aclnode[NUM_ACL]; -}; - -typedef struct _RSSI_STA{ - int UndecoratedSmoothedPWDB; - int UndecoratedSmoothedCCK; -}RSSI_STA, *PRSSI_STA; - -struct stainfo_stats { - - u64 rx_pkts; - u64 rx_bytes; - u64 rx_drops; - u64 last_rx_pkts; - - u64 tx_pkts; - u64 tx_bytes; - u64 tx_drops; - -}; - -#ifdef CONFIG_TDLS -struct TDLS_PeerKey { - u8 kck[16]; /* TPK-KCK */ - u8 tk[16]; /* TPK-TK; only CCMP will be used */ -} ; -#endif - -struct sta_info { - - _lock lock; - _list list; //free_sta_queue - _list hash_list; //sta_hash - //_list asoc_list; //20061114 - //_list sleep_list;//sleep_q - //_list wakeup_list;//wakeup_q - - struct sta_xmit_priv sta_xmitpriv; - struct sta_recv_priv sta_recvpriv; - - _queue sleep_q; - unsigned int sleepq_len; - - uint state; - uint aid; - uint mac_id; - uint qos_option; - u8 hwaddr[ETH_ALEN]; - - uint ieee8021x_blocked; //0: allowed, 1:blocked - uint dot118021XPrivacy; //aes, tkip... - union Keytype dot11tkiptxmickey; - union Keytype dot11tkiprxmickey; - union Keytype dot118021x_UncstKey; - union pn48 dot11txpn; // PN48 used for Unicast xmit. - union pn48 dot11rxpn; // PN48 used for Unicast recv. - - - u8 bssrateset[16]; - u32 bssratelen; - s32 rssi; - s32 signal_quality; - - u8 cts2self; - u8 rtsen; - - u8 raid; - u8 init_rate; - - struct stainfo_stats sta_stats; - -#ifdef CONFIG_TDLS - u8 SNonce[32]; - u8 ANonce[32]; - u32 TDLS_PeerKey_Lifetime; - u16 TPK_count; - _timer TPK_timer; - struct TDLS_PeerKey tpk; - _adapter *padapter; - u8 cam_entry; - u16 stat_code; - u8 off_ch; - u16 ch_switch_time; - u16 ch_switch_timeout; - u8 option; - _workitem option_workitem; - _timer option_timer; - _workitem base_ch_workitem; - _timer base_ch_timer; - _workitem off_ch_workitem; - _timer off_ch_timer; -#endif - - //for A-MPDU TX, ADDBA timeout check - _timer addba_retry_timer; - - //for A-MPDU Rx reordering buffer control - struct recv_reorder_ctrl recvreorder_ctrl[16]; - - //for A-MPDU Tx - //unsigned char ampdu_txen_bitmap; - -#ifdef CONFIG_80211N_HT - struct ht_priv htpriv; -#endif - - //Notes: - //STA_Mode: - //curr_network(mlme_priv/security_priv/qos/ht) + sta_info: (STA & AP) CAP/INFO - //scan_q: AP CAP/INFO - - //AP_Mode: - //curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO - //sta_info: (AP & STA) CAP/INFO - -#ifdef CONFIG_AP_MODE - - _list asoc_list; - _list auth_list; - - unsigned int expire_to; - unsigned int auth_seq; - unsigned int authalg; - unsigned char chg_txt[128]; - - u16 capability; - int flags; - - int dot8021xalg;//0:disable, 1:psk, 2:802.1x - int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 - int wpa_group_cipher; - int wpa2_group_cipher; - int wpa_pairwise_cipher; - int wpa2_pairwise_cipher; - -#ifdef CONFIG_NATIVEAP_MLME - u8 wpa_ie[32]; - - u8 nonerp_set; - u8 no_short_slot_time_set; - u8 no_short_preamble_set; - u8 no_ht_gf_set; - u8 no_ht_set; - u8 ht_20mhz_set; -#endif - - unsigned int tx_ra_bitmap; - u8 qos_info; - - u8 max_sp_len; - u8 uapsd_bk;//BIT(0): Delivery enabled, BIT(1): Trigger enabled - u8 uapsd_be; - u8 uapsd_vi; - u8 uapsd_vo; - - u8 has_legacy_ac; - unsigned int sleepq_ac_len; - -#ifdef CONFIG_P2P - //p2p priv data - u8 is_p2p_device; - u8 p2p_status_code; - - //p2p client info - u8 dev_addr[ETH_ALEN]; - //u8 iface_addr[ETH_ALEN];//= hwaddr[ETH_ALEN] - u8 dev_cap; - u16 config_methods; - u8 primary_dev_type[8]; - u8 num_of_secdev_type; - u8 secdev_types_list[32];// 32/8 == 4; - u16 dev_name_len; - u8 dev_name[32]; -#endif //CONFIG_P2P -#endif - - //for DM - RSSI_STA rssi_stat; - - -}; - - - -struct sta_priv { - - u8 *pallocated_stainfo_buf; - u8 *pstainfo_buf; - _queue free_sta_queue; - - _lock sta_hash_lock; - _list sta_hash[NUM_STA]; - int asoc_sta_count; - _queue sleep_q; - _queue wakeup_q; - - _adapter *padapter; - - -#ifdef CONFIG_AP_MODE - _list asoc_list; - _list auth_list; - - unsigned int auth_to; //sec, time to expire in authenticating. - unsigned int assoc_to; //sec, time to expire before associating. - unsigned int expire_to; //sec , time to expire after associated. - - /* pointers to STA info; based on allocated AID or NULL if AID free - * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1 - * and so on - */ - struct sta_info *sta_aid[NUM_STA]; - - u16 sta_dz_bitmap;//only support 15 stations, staion aid bitmap for sleeping sta. - u16 tim_bitmap;//only support 15 stations, aid=0~15 mapping bit0~bit15 - - u16 max_num_sta; -#endif - -}; - - -__inline static u32 wifi_mac_hash(u8 *mac) -{ - u32 x; - - x = mac[0]; - x = (x << 2) ^ mac[1]; - x = (x << 2) ^ mac[2]; - x = (x << 2) ^ mac[3]; - x = (x << 2) ^ mac[4]; - x = (x << 2) ^ mac[5]; - - x ^= x >> 8; - x = x & (NUM_STA - 1); - - return x; -} - - -extern u32 _rtw_init_sta_priv(struct sta_priv *pstapriv); -extern u32 _rtw_free_sta_priv(struct sta_priv *pstapriv); -extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); -extern u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta); -extern void rtw_free_all_stainfo(_adapter *padapter); -extern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); -extern u32 rtw_init_bcmc_stainfo(_adapter* padapter); -extern struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter); -extern u8 rtw_access_ctrl(struct wlan_acl_pool* pacl_list, u8 * mac_addr); - -#endif //_STA_INFO_H_ diff --git a/drivers/net/wireless/rtl8192c/include/usb_hal.h b/drivers/net/wireless/rtl8192c/include/usb_hal.h deleted file mode 100755 index 1b15d52c8f35..000000000000 --- a/drivers/net/wireless/rtl8192c/include/usb_hal.h +++ /dev/null @@ -1,30 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __USB_HAL_H__ -#define __USB_HAL_H__ - - -void rtl8192cu_set_hal_ops(_adapter * padapter); - -void rtl8192du_set_hal_ops(_adapter * padapter); - -#endif //__USB_HAL_H__ - diff --git a/drivers/net/wireless/rtl8192c/include/usb_ops.h b/drivers/net/wireless/rtl8192c/include/usb_ops.h deleted file mode 100755 index 8253bb72c57d..000000000000 --- a/drivers/net/wireless/rtl8192c/include/usb_ops.h +++ /dev/null @@ -1,58 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __USB_OPS_H_ -#define __USB_OPS_H_ - -#include -#include -#include -#include - -#define REALTEK_USB_VENQT_READ 0xC0 -#define REALTEK_USB_VENQT_WRITE 0x40 -#define REALTEK_USB_VENQT_CMD_REQ 0x05 -#define REALTEK_USB_VENQT_CMD_IDX 0x00 - -enum{ - VENDOR_WRITE = 0x00, - VENDOR_READ = 0x01, -}; -#define ALIGNMENT_UNIT 16 -#define MAX_VENDOR_REQ_CMD_SIZE 254 //8188cu SIE Support -#define MAX_USB_IO_CTL_SIZE (MAX_VENDOR_REQ_CMD_SIZE +ALIGNMENT_UNIT) - -#ifdef CONFIG_RTL8192C -void rtl8192cu_set_intf_ops(struct _io_ops *pops); - -void rtl8192cu_recv_tasklet(void *priv); - -void rtl8192cu_xmit_tasklet(void *priv); -#endif - -#ifdef CONFIG_RTL8192D -void rtl8192du_set_intf_ops(struct _io_ops *pops); - -void rtl8192du_recv_tasklet(void *priv); - -void rtl8192du_xmit_tasklet(void *priv); -#endif - -#endif diff --git a/drivers/net/wireless/rtl8192c/include/usb_osintf.h b/drivers/net/wireless/rtl8192c/include/usb_osintf.h deleted file mode 100755 index 8642aa26e794..000000000000 --- a/drivers/net/wireless/rtl8192c/include/usb_osintf.h +++ /dev/null @@ -1,39 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __USB_OSINTF_H -#define __USB_OSINTF_H - -#include -#include -#include -#include - -#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) - - -//uint usb_dvobj_init(_adapter * adapter); -//void usb_dvobj_deinit(_adapter * adapter); - -u8 usbvendorrequest(struct dvobj_priv *pdvobjpriv, RT_USB_BREQUEST brequest, RT_USB_WVALUE wvalue, u8 windex, void* data, u8 datalen, u8 isdirectionin); - - -#endif - diff --git a/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h b/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h deleted file mode 100755 index 72864de53bd4..000000000000 --- a/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h +++ /dev/null @@ -1,60 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _USB_VENDOR_REQUEST_H_ -#define _USB_VENDOR_REQUEST_H_ - -//4 Set/Get Register related wIndex/Data -#define RT_USB_RESET_MASK_OFF 0 -#define RT_USB_RESET_MASK_ON 1 -#define RT_USB_SLEEP_MASK_OFF 0 -#define RT_USB_SLEEP_MASK_ON 1 -#define RT_USB_LDO_ON 1 -#define RT_USB_LDO_OFF 0 - -//4 Set/Get SYSCLK related wValue or Data -#define RT_USB_SYSCLK_32KHZ 0 -#define RT_USB_SYSCLK_40MHZ 1 -#define RT_USB_SYSCLK_60MHZ 2 - - -typedef enum _RT_USB_BREQUEST { - RT_USB_SET_REGISTER = 1, - RT_USB_SET_SYSCLK = 2, - RT_USB_GET_SYSCLK = 3, - RT_USB_GET_REGISTER = 4 -} RT_USB_BREQUEST; - - -typedef enum _RT_USB_WVALUE { - RT_USB_RESET_MASK = 1, - RT_USB_SLEEP_MASK = 2, - RT_USB_USB_HRCPWM = 3, - RT_USB_LDO = 4, - RT_USB_BOOT_TYPE = 5 -} RT_USB_WVALUE; - - -//BOOLEAN usbvendorrequest(PCE_USB_DEVICE CEdevice, RT_USB_BREQUEST bRequest, RT_USB_WVALUE wValue, UCHAR wIndex, PVOID Data, UCHAR DataLength, BOOLEAN isDirectionIn); -//BOOLEAN CEusbGetStatusRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT Index, PVOID Data); -//BOOLEAN CEusbFeatureRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT FeatureSelector, IN USHORT Index); -//BOOLEAN CEusbGetDescriptorRequest(PCE_USB_DEVICE CEdevice, IN short urbLength, IN UCHAR DescriptorType, IN UCHAR Index, IN USHORT LanguageId, IN PVOID TransferBuffer, IN ULONG TransferBufferLength); - -#endif diff --git a/drivers/net/wireless/rtl8192c/include/wifi.h b/drivers/net/wireless/rtl8192c/include/wifi.h deleted file mode 100755 index 80875ac6fddf..000000000000 --- a/drivers/net/wireless/rtl8192c/include/wifi.h +++ /dev/null @@ -1,1148 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef _WIFI_H_ -#define _WIFI_H_ - -#include - -#ifdef BIT -//#error "BIT define occurred earlier elsewhere!\n" -#undef BIT -#endif -#define BIT(x) (1 << (x)) - - -#define WLAN_ETHHDR_LEN 14 -#define WLAN_ETHADDR_LEN 6 -#define WLAN_IEEE_OUI_LEN 3 -#define WLAN_ADDR_LEN 6 -#define WLAN_CRC_LEN 4 -#define WLAN_BSSID_LEN 6 -#define WLAN_BSS_TS_LEN 8 -#define WLAN_HDR_A3_LEN 24 -#define WLAN_HDR_A4_LEN 30 -#define WLAN_HDR_A3_QOS_LEN 26 -#define WLAN_HDR_A4_QOS_LEN 32 -#define WLAN_SSID_MAXLEN 32 -#define WLAN_DATA_MAXLEN 2312 - -#define WLAN_A3_PN_OFFSET 24 -#define WLAN_A4_PN_OFFSET 30 - -#define WLAN_MIN_ETHFRM_LEN 60 -#define WLAN_MAX_ETHFRM_LEN 1514 -#define WLAN_ETHHDR_LEN 14 - -#define P80211CAPTURE_VERSION 0x80211001 - -#ifdef GREEN_HILL -#pragma pack(1) -#endif - -enum WIFI_FRAME_TYPE { - WIFI_MGT_TYPE = (0), - WIFI_CTRL_TYPE = (BIT(2)), - WIFI_DATA_TYPE = (BIT(3)), - WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), //!< QoS Data -}; - -enum WIFI_FRAME_SUBTYPE { - - // below is for mgt frame - WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE), - WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE), - WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE), - WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE), - WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE), - WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE), - WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE), - WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE), - WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE), - WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE), - WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE), - WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE), - - // below is for control frame - WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE), - WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), - WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE), - WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE), - WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE), - WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), - - // below is for data frame - WIFI_DATA = (0 | WIFI_DATA_TYPE), - WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE), - WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE), - WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE), - WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE), - WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE), - WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE), - WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE), - WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE), -}; - -enum WIFI_REASON_CODE { - _RSON_RESERVED_ = 0, - _RSON_UNSPECIFIED_ = 1, - _RSON_AUTH_NO_LONGER_VALID_ = 2, - _RSON_DEAUTH_STA_LEAVING_ = 3, - _RSON_INACTIVITY_ = 4, - _RSON_UNABLE_HANDLE_ = 5, - _RSON_CLS2_ = 6, - _RSON_CLS3_ = 7, - _RSON_DISAOC_STA_LEAVING_ = 8, - _RSON_ASOC_NOT_AUTH_ = 9, - - // WPA reason - _RSON_INVALID_IE_ = 13, - _RSON_MIC_FAILURE_ = 14, - _RSON_4WAY_HNDSHK_TIMEOUT_ = 15, - _RSON_GROUP_KEY_UPDATE_TIMEOUT_ = 16, - _RSON_DIFF_IE_ = 17, - _RSON_MLTCST_CIPHER_NOT_VALID_ = 18, - _RSON_UNICST_CIPHER_NOT_VALID_ = 19, - _RSON_AKMP_NOT_VALID_ = 20, - _RSON_UNSUPPORT_RSNE_VER_ = 21, - _RSON_INVALID_RSNE_CAP_ = 22, - _RSON_IEEE_802DOT1X_AUTH_FAIL_ = 23, - - //belowing are Realtek definition - _RSON_PMK_NOT_AVAILABLE_ = 24, - _RSON_TDLS_TEAR_TOOFAR_ = 25, - _RSON_TDLS_TEAR_UN_RSN_ = 26, -}; - -/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */ -#if 0 -#define WLAN_REASON_UNSPECIFIED 1 -#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 -#define WLAN_REASON_DEAUTH_LEAVING 3 -#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 -#define WLAN_REASON_DISASSOC_AP_BUSY 5 -#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 -#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 -#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 -#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 -#endif -/* IEEE 802.11h */ -#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10 -#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11 -#if 0 -/* IEEE 802.11i */ -#define WLAN_REASON_INVALID_IE 13 -#define WLAN_REASON_MICHAEL_MIC_FAILURE 14 -#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15 -#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16 -#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17 -#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18 -#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19 -#define WLAN_REASON_AKMP_NOT_VALID 20 -#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21 -#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22 -#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23 -#define WLAN_REASON_CIPHER_SUITE_REJECTED 24 -#endif - -enum WIFI_STATUS_CODE { - _STATS_SUCCESSFUL_ = 0, - _STATS_FAILURE_ = 1, - _STATS_CAP_FAIL_ = 10, - _STATS_NO_ASOC_ = 11, - _STATS_OTHER_ = 12, - _STATS_NO_SUPP_ALG_ = 13, - _STATS_OUT_OF_AUTH_SEQ_ = 14, - _STATS_CHALLENGE_FAIL_ = 15, - _STATS_AUTH_TIMEOUT_ = 16, - _STATS_UNABLE_HANDLE_STA_ = 17, - _STATS_RATE_FAIL_ = 18, -}; - -/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */ -#if 0 -#define WLAN_STATUS_SUCCESS 0 -#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 -#define WLAN_STATUS_CAPS_UNSUPPORTED 10 -#define WLAN_STATUS_REASSOC_NO_ASSOC 11 -#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 -#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 -#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 -#define WLAN_STATUS_CHALLENGE_FAIL 15 -#define WLAN_STATUS_AUTH_TIMEOUT 16 -#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 -#define WLAN_STATUS_ASSOC_DENIED_RATES 18 -#endif -//entended -/* IEEE 802.11b */ -#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 -#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 -#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 -/* IEEE 802.11h */ -#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22 -#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23 -#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24 -/* IEEE 802.11g */ -#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25 -#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26 -#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27 -/* IEEE 802.11w */ -#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30 -#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31 -/* IEEE 802.11i */ -#define WLAN_STATUS_INVALID_IE 40 -#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41 -#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42 -#define WLAN_STATUS_AKMP_NOT_VALID 43 -#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44 -#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45 -#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46 -#define WLAN_STATUS_TS_NOT_CREATED 47 -#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48 -#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49 -#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50 -#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51 -/* IEEE 802.11r */ -#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52 -#define WLAN_STATUS_INVALID_PMKID 53 -#define WLAN_STATUS_INVALID_MDIE 54 -#define WLAN_STATUS_INVALID_FTIE 55 - - -enum WIFI_REG_DOMAIN { - DOMAIN_FCC = 1, - DOMAIN_IC = 2, - DOMAIN_ETSI = 3, - DOMAIN_SPAIN = 4, - DOMAIN_FRANCE = 5, - DOMAIN_MKK = 6, - DOMAIN_ISRAEL = 7, - DOMAIN_MKK1 = 8, - DOMAIN_MKK2 = 9, - DOMAIN_MKK3 = 10, - DOMAIN_MAX -}; - -#define _TO_DS_ BIT(8) -#define _FROM_DS_ BIT(9) -#define _MORE_FRAG_ BIT(10) -#define _RETRY_ BIT(11) -#define _PWRMGT_ BIT(12) -#define _MORE_DATA_ BIT(13) -#define _PRIVACY_ BIT(14) -#define _ORDER_ BIT(15) - -#define SetToDs(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_TO_DS_); \ - } while(0) - -#define GetToDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_TO_DS_)) != 0) - -#define ClearToDs(pbuf) \ - do { \ - *(unsigned short *)(pbuf) &= (~cpu_to_le16(_TO_DS_)); \ - } while(0) - -#define SetFrDs(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_FROM_DS_); \ - } while(0) - -#define GetFrDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_FROM_DS_)) != 0) - -#define ClearFrDs(pbuf) \ - do { \ - *(unsigned short *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)); \ - } while(0) - -#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe)) - - -#define SetMFrag(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_FRAG_); \ - } while(0) - -#define GetMFrag(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_FRAG_)) != 0) - -#define ClearMFrag(pbuf) \ - do { \ - *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)); \ - } while(0) - -#define SetRetry(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_RETRY_); \ - } while(0) - -#define GetRetry(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_RETRY_)) != 0) - -#define ClearRetry(pbuf) \ - do { \ - *(unsigned short *)(pbuf) &= (~cpu_to_le16(_RETRY_)); \ - } while(0) - -#define SetPwrMgt(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_PWRMGT_); \ - } while(0) - -#define GetPwrMgt(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PWRMGT_)) != 0) - -#define ClearPwrMgt(pbuf) \ - do { \ - *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)); \ - } while(0) - -#define SetMData(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_DATA_); \ - } while(0) - -#define GetMData(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_DATA_)) != 0) - -#define ClearMData(pbuf) \ - do { \ - *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)); \ - } while(0) - -#define SetPrivacy(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_PRIVACY_); \ - } while(0) - -#define GetPrivacy(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PRIVACY_)) != 0) - -#define ClearPrivacy(pbuf) \ - do { \ - *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)); \ - } while(0) - - -#define GetOrder(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) - -#define GetFrameType(pbuf) (le16_to_cpu(*(unsigned short *)(pbuf)) & (BIT(3) | BIT(2))) - -#define SetFrameType(pbuf,type) \ - do { \ - *(unsigned short *)(pbuf) &= __constant_cpu_to_le16(~(BIT(3) | BIT(2))); \ - *(unsigned short *)(pbuf) |= __constant_cpu_to_le16(type); \ - } while(0) - -#define GetFrameSubType(pbuf) (cpu_to_le16(*(unsigned short *)(pbuf)) & (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))) - -#define SetFrameSubType(pbuf,type) \ - do { \ - *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))); \ - *(unsigned short *)(pbuf) |= cpu_to_le16(type); \ - } while(0) - -#define GetSequence(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) >> 4) - -#define GetFragNum(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & 0x0f) - -#define GetTupleCache(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22))) - -#define SetFragNum(pbuf, num) \ - do { \ - *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ - ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu(~(0x000f))) | \ - cpu_to_le16(0x0f & (num)); \ - } while(0) - -#define SetSeqNum(pbuf, num) \ - do { \ - *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ - ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu((unsigned short)~0xfff0)) | \ - le16_to_cpu((unsigned short)(0xfff0 & (num << 4))); \ - } while(0) - -#define SetDuration(pbuf, dur) \ - do { \ - *(unsigned short *)((SIZE_PTR)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)); \ - } while(0) - - -#define SetPriority(pbuf, tid) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(tid & 0xf); \ - } while(0) - -#define GetPriority(pbuf) ((le16_to_cpu(*(unsigned short *)(pbuf))) & 0xf) - -#define SetEOSP(pbuf, eosp) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16( (eosp & 1) << 4); \ - } while(0) - -#define SetAckpolicy(pbuf, ack) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16( (ack & 3) << 5); \ - } while(0) - -#define GetAckpolicy(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 5) & 0x3) - -#define GetAMsdu(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 7) & 0x1) - -#define SetAMsdu(pbuf, amsdu) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16( (amsdu & 1) << 7); \ - } while(0) - -#define GetAid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 2)) & 0x3fff) - -#define GetTid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + (((GetToDs(pbuf)<<1)|GetFrDs(pbuf))==3?30:24))) & 0x000f) - -#define GetAddr1Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 4)) - -#define GetAddr2Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 10)) - -#define GetAddr3Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 16)) - -#define GetAddr4Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 24)) - -#define MacAddr_isBcst(addr) \ -( \ - ( (addr[0] == 0xff) && (addr[1] == 0xff) && \ - (addr[2] == 0xff) && (addr[3] == 0xff) && \ - (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ -) - -__inline static int IS_MCAST(unsigned char *da) -{ - if ((*da) & 0x01) - return _TRUE; - else - return _FALSE; -} - - -__inline static unsigned char * get_da(unsigned char *pframe) -{ - unsigned char *da; - unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); - - switch (to_fr_ds) { - case 0x00: // ToDs=0, FromDs=0 - da = GetAddr1Ptr(pframe); - break; - case 0x01: // ToDs=0, FromDs=1 - da = GetAddr1Ptr(pframe); - break; - case 0x02: // ToDs=1, FromDs=0 - da = GetAddr3Ptr(pframe); - break; - default: // ToDs=1, FromDs=1 - da = GetAddr3Ptr(pframe); - break; - } - - return da; -} - - -__inline static unsigned char * get_sa(unsigned char *pframe) -{ - unsigned char *sa; - unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); - - switch (to_fr_ds) { - case 0x00: // ToDs=0, FromDs=0 - sa = GetAddr2Ptr(pframe); - break; - case 0x01: // ToDs=0, FromDs=1 - sa = GetAddr3Ptr(pframe); - break; - case 0x02: // ToDs=1, FromDs=0 - sa = GetAddr2Ptr(pframe); - break; - default: // ToDs=1, FromDs=1 - sa = GetAddr4Ptr(pframe); - break; - } - - return sa; -} - -__inline static unsigned char * get_hdr_bssid(unsigned char *pframe) -{ - unsigned char *sa; - unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); - - switch (to_fr_ds) { - case 0x00: // ToDs=0, FromDs=0 - sa = GetAddr3Ptr(pframe); - break; - case 0x01: // ToDs=0, FromDs=1 - sa = GetAddr2Ptr(pframe); - break; - case 0x02: // ToDs=1, FromDs=0 - sa = GetAddr1Ptr(pframe); - break; - case 0x03: // ToDs=1, FromDs=1 - sa = GetAddr1Ptr(pframe); - break; - default: - sa =NULL; //??????? - break; - } - - return sa; -} - - -__inline static int IsFrameTypeCtrl(unsigned char *pframe) -{ - if(WIFI_CTRL_TYPE == GetFrameType(pframe)) - return _TRUE; - else - return _FALSE; -} -/*----------------------------------------------------------------------------- - Below is for the security related definition -------------------------------------------------------------------------------*/ -#define _RESERVED_FRAME_TYPE_ 0 -#define _SKB_FRAME_TYPE_ 2 -#define _PRE_ALLOCMEM_ 1 -#define _PRE_ALLOCHDR_ 3 -#define _PRE_ALLOCLLCHDR_ 4 -#define _PRE_ALLOCICVHDR_ 5 -#define _PRE_ALLOCMICHDR_ 6 - -#define _SIFSTIME_ ((priv->pmib->dot11BssType.net_work_type&WIRELESS_11A)?16:10) -#define _ACKCTSLNG_ 14 //14 bytes long, including crclng -#define _CRCLNG_ 4 - -#define _ASOCREQ_IE_OFFSET_ 4 // excluding wlan_hdr -#define _ASOCRSP_IE_OFFSET_ 6 -#define _REASOCREQ_IE_OFFSET_ 10 -#define _REASOCRSP_IE_OFFSET_ 6 -#define _PROBEREQ_IE_OFFSET_ 0 -#define _PROBERSP_IE_OFFSET_ 12 -#define _AUTH_IE_OFFSET_ 6 -#define _DEAUTH_IE_OFFSET_ 0 -#define _BEACON_IE_OFFSET_ 12 -#define _PUBLIC_ACTION_IE_OFFSET_ 8 - -#define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_ - -#define _SSID_IE_ 0 -#define _SUPPORTEDRATES_IE_ 1 -#define _DSSET_IE_ 3 -#define _TIM_IE_ 5 -#define _IBSS_PARA_IE_ 6 -#define _COUNTRY_IE_ 7 -#define _CHLGETXT_IE_ 16 -#define _SUPPORTED_CH_IE_ 36 -#define _CH_SWTICH_ANNOUNCE_ 37 //Secondary Channel Offset -#define _RSN_IE_2_ 48 -#define _SSN_IE_1_ 221 -#define _ERPINFO_IE_ 42 -#define _EXT_SUPPORTEDRATES_IE_ 50 - -#define _HT_CAPABILITY_IE_ 45 -#define _FTIE_ 55 -#define _TIMEOUT_ITVL_IE_ 56 -#define _HT_EXTRA_INFO_IE_ 61 -#define _HT_ADD_INFO_IE_ 61 //_HT_EXTRA_INFO_IE_ - -#define EID_BSSCoexistence 72 // 20/40 BSS Coexistence -#define EID_BSSIntolerantChlReport 73 -#define _RIC_Descriptor_IE_ 75 - -#define _LINK_ID_IE_ 101 -#define _CH_SWITCH_TIMING_ 104 -#define _PTI_BUFFER_STATUS_ 106 -#define _EXT_CAP_IE_ 127 -#define _VENDOR_SPECIFIC_IE_ 221 - -#define _RESERVED47_ 47 - -/* --------------------------------------------------------------------------- - Below is the fixed elements... ------------------------------------------------------------------------------*/ -#define _AUTH_ALGM_NUM_ 2 -#define _AUTH_SEQ_NUM_ 2 -#define _BEACON_ITERVAL_ 2 -#define _CAPABILITY_ 2 -#define _CURRENT_APADDR_ 6 -#define _LISTEN_INTERVAL_ 2 -#define _RSON_CODE_ 2 -#define _ASOC_ID_ 2 -#define _STATUS_CODE_ 2 -#define _TIMESTAMP_ 8 - -#define AUTH_ODD_TO 0 -#define AUTH_EVEN_TO 1 - -#define WLAN_ETHCONV_ENCAP 1 -#define WLAN_ETHCONV_RFC1042 2 -#define WLAN_ETHCONV_8021h 3 - -#define cap_ESS BIT(0) -#define cap_IBSS BIT(1) -#define cap_CFPollable BIT(2) -#define cap_CFRequest BIT(3) -#define cap_Privacy BIT(4) -#define cap_ShortPremble BIT(5) -#define cap_PBCC BIT(6) -#define cap_ChAgility BIT(7) -#define cap_SpecMgmt BIT(8) -#define cap_QoS BIT(9) -#define cap_ShortSlot BIT(10) - -/*----------------------------------------------------------------------------- - Below is the definition for 802.11i / 802.1x -------------------------------------------------------------------------------*/ -#define _IEEE8021X_MGT_ 1 // WPA -#define _IEEE8021X_PSK_ 2 // WPA with pre-shared key - -/* -#define _NO_PRIVACY_ 0 -#define _WEP_40_PRIVACY_ 1 -#define _TKIP_PRIVACY_ 2 -#define _WRAP_PRIVACY_ 3 -#define _CCMP_PRIVACY_ 4 -#define _WEP_104_PRIVACY_ 5 -#define _WEP_WPA_MIXED_PRIVACY_ 6 // WEP + WPA -*/ - -/*----------------------------------------------------------------------------- - Below is the definition for WMM -------------------------------------------------------------------------------*/ -#define _WMM_IE_Length_ 7 // for WMM STA -#define _WMM_Para_Element_Length_ 24 - - -/*----------------------------------------------------------------------------- - Below is the definition for 802.11n -------------------------------------------------------------------------------*/ - -/* block-ack parameters */ -#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 -#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 -#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 -#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 - -//#ifdef CONFIG_80211N_HT - -#define SetOrderBit(pbuf) \ - do { \ - *(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \ - } while(0) - -#define GetOrderBit(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) - - -/** - * struct ieee80211_bar - HT Block Ack Request - * - * This structure refers to "HT BlockAckReq" as - * described in 802.11n draft section 7.2.1.7.1 - */ - #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) -struct ieee80211_bar { - unsigned short frame_control; - unsigned short duration; - unsigned char ra[6]; - unsigned char ta[6]; - unsigned short control; - unsigned short start_seq_num; -} __attribute__((packed)); - #endif - -/* 802.11 BAR control masks */ -#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000 -#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004 - - - #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) - - /** - * struct ieee80211_ht_cap - HT capabilities - * - * This structure refers to "HT capabilities element" as - * described in 802.11n draft section 7.3.2.52 - */ - -struct ieee80211_ht_cap { - unsigned short cap_info; - unsigned char ampdu_params_info; - unsigned char supp_mcs_set[16]; - unsigned short extended_ht_cap_info; - unsigned int tx_BF_cap_info; - unsigned char antenna_selection_info; -} __attribute__ ((packed)); - -/** - * struct ieee80211_ht_cap - HT additional information - * - * This structure refers to "HT information element" as - * described in 802.11n draft section 7.3.2.53 - */ -struct ieee80211_ht_addt_info { - unsigned char control_chan; - unsigned char ht_param; - unsigned short operation_mode; - unsigned short stbc_param; - unsigned char basic_set[16]; -} __attribute__ ((packed)); - - -struct HT_caps_element -{ - union - { - struct - { - unsigned short HT_caps_info; - unsigned char AMPDU_para; - unsigned char MCS_rate[16]; - unsigned short HT_ext_caps; - unsigned int Beamforming_caps; - unsigned char ASEL_caps; - } HT_cap_element; - unsigned char HT_cap[26]; - }; -} __attribute__ ((packed)); - -struct HT_info_element -{ - unsigned char primary_channel; - unsigned char infos[5]; - unsigned char MCS_rate[16]; -} __attribute__ ((packed)); - -struct AC_param -{ - unsigned char ACI_AIFSN; - unsigned char CW; - unsigned short TXOP_limit; -} __attribute__ ((packed)); - -struct WMM_para_element -{ - unsigned char QoS_info; - unsigned char reserved; - struct AC_param ac_param[4]; -} __attribute__ ((packed)); - -struct ADDBA_request -{ - unsigned char dialog_token; - unsigned short BA_para_set; - unsigned short BA_timeout_value; - unsigned short BA_starting_seqctrl; -} __attribute__ ((packed)); - - - -#endif - - -#ifdef PLATFORM_WINDOWS - -#pragma pack(1) - -struct ieee80211_ht_cap { - unsigned short cap_info; - unsigned char ampdu_params_info; - unsigned char supp_mcs_set[16]; - unsigned short extended_ht_cap_info; - unsigned int tx_BF_cap_info; - unsigned char antenna_selection_info; -}; - - -struct ieee80211_ht_addt_info { - unsigned char control_chan; - unsigned char ht_param; - unsigned short operation_mode; - unsigned short stbc_param; - unsigned char basic_set[16]; -}; - -struct HT_caps_element -{ - union - { - struct - { - unsigned short HT_caps_info; - unsigned char AMPDU_para; - unsigned char MCS_rate[16]; - unsigned short HT_ext_caps; - unsigned int Beamforming_caps; - unsigned char ASEL_caps; - } HT_cap_element; - unsigned char HT_cap[26]; - }; -}; - -struct HT_info_element -{ - unsigned char primary_channel; - unsigned char infos[5]; - unsigned char MCS_rate[16]; -}; - -struct AC_param -{ - unsigned char ACI_AIFSN; - unsigned char CW; - unsigned short TXOP_limit; -}; - -struct WMM_para_element -{ - unsigned char QoS_info; - unsigned char reserved; - struct AC_param ac_param[4]; -}; - -struct ADDBA_request -{ - unsigned char dialog_token; - unsigned short BA_para_set; - unsigned short BA_timeout_value; - unsigned short BA_starting_seqctrl; -}; - - -#pragma pack() - -#endif - - -/* 802.11n HT capabilities masks */ -#define IEEE80211_HT_CAP_SUP_WIDTH 0x0002 -#define IEEE80211_HT_CAP_SM_PS 0x000C -#define IEEE80211_HT_CAP_GRN_FLD 0x0010 -#define IEEE80211_HT_CAP_SGI_20 0x0020 -#define IEEE80211_HT_CAP_SGI_40 0x0040 -#define IEEE80211_HT_CAP_TX_STBC 0x0080 -#define IEEE80211_HT_CAP_RX_STBC 0x0300 -#define IEEE80211_HT_CAP_DELAY_BA 0x0400 -#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 -#define IEEE80211_HT_CAP_DSSSCCK40 0x1000 -/* 802.11n HT capability AMPDU settings */ -#define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03 -#define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C -/* 802.11n HT capability MSC set */ -#define IEEE80211_SUPP_MCS_SET_UEQM 4 -#define IEEE80211_HT_CAP_MAX_STREAMS 4 -#define IEEE80211_SUPP_MCS_SET_LEN 10 -/* maximum streams the spec allows */ -#define IEEE80211_HT_CAP_MCS_TX_DEFINED 0x01 -#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF 0x02 -#define IEEE80211_HT_CAP_MCS_TX_STREAMS 0x0C -#define IEEE80211_HT_CAP_MCS_TX_UEQM 0x10 -/* 802.11n HT IE masks */ -#define IEEE80211_HT_IE_CHA_SEC_OFFSET 0x03 -#define IEEE80211_HT_IE_CHA_SEC_NONE 0x00 -#define IEEE80211_HT_IE_CHA_SEC_ABOVE 0x01 -#define IEEE80211_HT_IE_CHA_SEC_BELOW 0x03 -#define IEEE80211_HT_IE_CHA_WIDTH 0x04 -#define IEEE80211_HT_IE_HT_PROTECTION 0x0003 -#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004 -#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 - -/* block-ack parameters */ -#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 -#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 -#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 -#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 - -/* - * A-PMDU buffer sizes - * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) - */ -#define IEEE80211_MIN_AMPDU_BUF 0x8 -#define IEEE80211_MAX_AMPDU_BUF 0x40 - - -/* Spatial Multiplexing Power Save Modes */ -#define WLAN_HT_CAP_SM_PS_STATIC 0 -#define WLAN_HT_CAP_SM_PS_DYNAMIC 1 -#define WLAN_HT_CAP_SM_PS_INVALID 2 -#define WLAN_HT_CAP_SM_PS_DISABLED 3 - -#ifdef CONFIG_AP_MODE -#define OP_MODE_PURE 0 -#define OP_MODE_MAY_BE_LEGACY_STAS 1 -#define OP_MODE_20MHZ_HT_STA_ASSOCED 2 -#define OP_MODE_MIXED 3 - -#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1)) -#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0)) -#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1)) -#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2)) -#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3)) -#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4)) -#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5)) - -#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \ - ((u16) (0x0001 | 0x0002)) -#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0 -#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2)) -#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3)) -#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4)) - -#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6)) -#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7)) -#define HT_INFO_STBC_PARAM_SECONDARY_BCN ((u16) BIT(8)) -#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9)) -#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10)) -#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11)) -#endif - - -//#endif - -// ===============WPS Section=============== -// For WPSv1.0 -#define WPSOUI 0x0050f204 -// WPS attribute ID -#define WPS_ATTR_VER1 0x104A -#define WPS_ATTR_SIMPLE_CONF_STATE 0x1044 -#define WPS_ATTR_RESP_TYPE 0x103B -#define WPS_ATTR_UUID_E 0x1047 -#define WPS_ATTR_MANUFACTURER 0x1021 -#define WPS_ATTR_MODEL_NAME 0x1023 -#define WPS_ATTR_MODEL_NUMBER 0x1024 -#define WPS_ATTR_SERIAL_NUMBER 0x1042 -#define WPS_ATTR_PRIMARY_DEV_TYPE 0x1054 -#define WPS_ATTR_DEVICE_NAME 0x1011 -#define WPS_ATTR_CONF_METHOD 0x1008 -#define WPS_ATTR_RF_BANDS 0x103C -#define WPS_ATTR_DEVICE_PWID 0x1012 - -// Value of WPS attribute "WPS_ATTR_DEVICE_NAME -#define WPS_MAX_DEVICE_NAME_LEN 32 - -// Value of WPS Response Type Attribute -#define WPS_RESPONSE_TYPE_INFO_ONLY 0x00 -#define WPS_RESPONSE_TYPE_8021X 0x01 -#define WPS_RESPONSE_TYPE_REGISTRAR 0x02 -#define WPS_RESPONSE_TYPE_AP 0x03 - -// Value of WPS WiFi Simple Configuration State Attribute -#define WPS_WSC_STATE_NOT_CONFIG 0x01 -#define WPS_WSC_STATE_CONFIG 0x02 - -// Value of WPS Version Attribute -#define WPS_VERSION_1 0x10 - -// Value of WPS Configuration Method Attribute -#define WPS_CONFIG_METHOD_FLASH 0x0001 -#define WPS_CONFIG_METHOD_ETHERNET 0x0002 -#define WPS_CONFIG_METHOD_LABEL 0x0004 -#define WPS_CONFIG_METHOD_DISPLAY 0x0008 -#define WPS_CONFIG_METHOD_E_NFC 0x0010 -#define WPS_CONFIG_METHOD_I_NFC 0x0020 -#define WPS_CONFIG_METHOD_NFC 0x0040 -#define WPS_CONFIG_METHOD_PBC 0x0080 -#define WPS_CONFIG_METHOD_KEYPAD 0x0100 -#define WPS_CONFIG_METHOD_VPBC 0x0280 -#define WPS_CONFIG_METHOD_PPBC 0x0480 -#define WPS_CONFIG_METHOD_VDISPLAY 0x2008 -#define WPS_CONFIG_METHOD_PDISPLAY 0x4008 - -// Value of Category ID of WPS Primary Device Type Attribute -#define WPS_PDT_CID_MULIT_MEDIA 0x0008 -#define WPS_PDT_CID_RTK_WIDI 0x001E - -// Value of Sub Category ID of WPS Primary Device Type Attribute -#define WPS_PDT_SCID_MEDIA_SERVER 0x0005 -#define WPS_PDT_SCID_RTK_DMP 0x0001 - -// Value of Device Password ID -#define WPS_DPID_PIN 0x0000 -#define WPS_DPID_USER_SPEC 0x0001 -#define WPS_DPID_MACHINE_SPEC 0x0002 -#define WPS_DPID_REKEY 0x0003 -#define WPS_DPID_PBC 0x0004 -#define WPS_DPID_REGISTRAR_SPEC 0x0005 - - -// =====================P2P Section===================== -// For P2P -#define P2POUI 0x506F9A09 - -// P2P Attribute ID -#define P2P_ATTR_STATUS 0x00 -#define P2P_ATTR_MINOR_REASON_CODE 0x01 -#define P2P_ATTR_CAPABILITY 0x02 -#define P2P_ATTR_DEVICE_ID 0x03 -#define P2P_ATTR_GO_INTENT 0x04 -#define P2P_ATTR_CONF_TIMEOUT 0x05 -#define P2P_ATTR_LISTEN_CH 0x06 -#define P2P_ATTR_GROUP_BSSID 0x07 -#define P2P_ATTR_EX_LISTEN_TIMING 0x08 -#define P2P_ATTR_INTENTED_IF_ADDR 0x09 -#define P2P_ATTR_MANAGEABILITY 0x0A -#define P2P_ATTR_CH_LIST 0x0B -#define P2P_ATTR_NOA 0x0C -#define P2P_ATTR_DEVICE_INFO 0x0D -#define P2P_ATTR_GROUP_INFO 0x0E -#define P2P_ATTR_GROUP_ID 0x0F -#define P2P_ATTR_INTERFACE 0x10 -#define P2P_ATTR_OPERATING_CH 0x11 -#define P2P_ATTR_INVITATION_FLAGS 0x12 - -// Value of Status Attribute -#define P2P_STATUS_SUCCESS 0x00 -#define P2P_STATUS_FAIL_INFO_UNAVAILABLE 0x01 -#define P2P_STATUS_FAIL_INCOMPATIBLE_PARAM 0x02 -#define P2P_STATUS_FAIL_LIMIT_REACHED 0x03 -#define P2P_STATUS_FAIL_INVALID_PARAM 0x04 -#define P2P_STATUS_FAIL_REQUEST_UNABLE 0x05 -#define P2P_STATUS_FAIL_PREVOUS_PROTO_ERR 0x06 -#define P2P_STATUS_FAIL_NO_COMMON_CH 0x07 -#define P2P_STATUS_FAIL_UNKNOWN_P2PGROUP 0x08 -#define P2P_STATUS_FAIL_BOTH_GOINTENT_15 0x09 -#define P2P_STATUS_FAIL_INCOMPATIBLE_PROVSION 0x0A -#define P2P_STATUS_FAIL_USER_REJECT 0x0B - -// Value of Inviation Flags Attribute -#define P2P_INVITATION_FLAGS_PERSISTENT BIT(0) - - -// Value of Device Capability Bitmap -#define P2P_DEVCAP_SERVICE_DISCOVERY BIT(0) -#define P2P_DEVCAP_CLIENT_DISCOVERABILITY BIT(1) -#define P2P_DEVCAP_CONCURRENT_OPERATION BIT(2) -#define P2P_DEVCAP_INFRA_MANAGED BIT(3) -#define P2P_DEVCAP_DEVICE_LIMIT BIT(4) -#define P2P_DEVCAP_INVITATION_PROC BIT(5) - -// Value of Group Capability Bitmap -#define P2P_GRPCAP_GO BIT(0) -#define P2P_GRPCAP_PERSISTENT_GROUP BIT(1) -#define P2P_GRPCAP_GROUP_LIMIT BIT(2) -#define P2P_GRPCAP_INTRABSS BIT(3) -#define P2P_GRPCAP_CROSS_CONN BIT(4) -#define P2P_GRPCAP_PERSISTENT_RECONN BIT(5) -#define P2P_GRPCAP_GROUP_FORMATION BIT(6) - -// P2P Public Action Frame ( Management Frame ) -#define P2P_PUB_ACTION_ACTION 0x09 - -// P2P Public Action Frame Type -#define P2P_GO_NEGO_REQ 0 -#define P2P_GO_NEGO_RESP 1 -#define P2P_GO_NEGO_CONF 2 -#define P2P_INVIT_REQ 3 -#define P2P_INVIT_RESP 4 -#define P2P_DEVDISC_REQ 5 -#define P2P_DEVDISC_RESP 6 -#define P2P_PROVISION_DISC_REQ 7 -#define P2P_PROVISION_DISC_RESP 8 - -// P2P Action Frame Type -#define P2P_NOTICE_OF_ABSENCE 0 -#define P2P_PRESENCE_REQUEST 1 -#define P2P_PRESENCE_RESPONSE 2 -#define P2P_GO_DISC_REQUEST 3 - - -#define P2P_MAX_PERSISTENT_GROUP_NUM 10 - -#define P2P_PROVISIONING_SCAN_CNT 3 - -#define P2P_WILDCARD_SSID_LEN 7 -#define P2P_FINDPHASE_EX_CNT 3 - -#define P2P_PROVISION_TIMEOUT 5000 // 5 seconds timeout for sending the provision discovery request -#define P2P_GO_NEGO_TIMEOUT 5000 // 5 seconds timeout for receiving the group negotation response -#define P2P_TX_PRESCAN_TIMEOUT 100 // 100ms - -#define P2P_MAX_INTENT 15 - -#define P2P_MAX_NOA_NUM 2 - -// WPS Configuration Method -#define WPS_CM_NONE 0x0000 -#define WPS_CM_LABEL 0x0004 -#define WPS_CM_DISPLYA 0x0008 -#define WPS_CM_EXTERNAL_NFC_TOKEN 0x0010 -#define WPS_CM_INTEGRATED_NFC_TOKEN 0x0020 -#define WPS_CM_NFC_INTERFACE 0x0040 -#define WPS_CM_PUSH_BUTTON 0x0080 -#define WPS_CM_KEYPAD 0x0100 -#define WPS_CM_SW_PUHS_BUTTON 0x0280 -#define WPS_CM_HW_PUHS_BUTTON 0x0480 -#define WPS_CM_SW_DISPLAY_PIN 0x2008 -#define WPS_CM_LCD_DISPLAY_PIN 0x4008 - -enum P2P_ROLE { - P2P_ROLE_DISABLE = 0, - P2P_ROLE_DEVICE = 1, - P2P_ROLE_CLIENT = 2, - P2P_ROLE_GO = 3 -}; - -enum P2P_STATE { - P2P_STATE_NONE = 0, // P2P disable - P2P_STATE_IDLE = 1, // P2P had enabled and do nothing - P2P_STATE_LISTEN = 2, // In pure listen state - P2P_STATE_SCAN = 3, // In scan phase - P2P_STATE_FIND_PHASE_LISTEN = 4, // In the listen state of find phase - P2P_STATE_FIND_PHASE_SEARCH = 5, // In the search state of find phase - P2P_STATE_TX_PROVISION_DIS_REQ = 6, // In P2P provisioning discovery - P2P_STATE_RX_PROVISION_DIS_RSP = 7, - P2P_STATE_RX_PROVISION_DIS_REQ = 8, - P2P_STATE_GONEGO_ING = 9, // Doing the group owner negoitation handshake - P2P_STATE_GONEGO_OK = 10, // finish the group negoitation handshake with success - P2P_STATE_GONEGO_FAIL = 11, // finish the group negoitation handshake with failure - P2P_STATE_RECV_INVITE_REQ = 12, // receiving the P2P Inviation request - P2P_STATE_PROVISIONING_ING = 13, // Doing the P2P WPS - P2P_STATE_PROVISIONING_DONE = 14, // Finish the P2P WPS -}; - -enum P2P_WPSINFO { - P2P_NO_WPSINFO = 0, - P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1, - P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2, - P2P_GOT_WPSINFO_PBC = 3, -}; - -#define P2P_PRIVATE_IOCTL_SET_LEN 64 - -enum P2P_PROTO_WK_ID -{ - P2P_FIND_PHASE_WK = 0, - P2P_RESTORE_STATE_WK = 1, -}; - -enum P2P_PS -{ - P2P_PS_DISABLE=0, - P2P_PS_ENABLE=1, - P2P_PS_SCAN=2, - P2P_PS_SCAN_DONE=3, - P2P_PS_ALLSTASLEEP=4, // for owner -}; - -#endif // _WIFI_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h b/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h deleted file mode 100755 index 3c6f9b3ac7dc..000000000000 --- a/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h +++ /dev/null @@ -1,435 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __WLAN_BSSDEF_H__ -#define __WLAN_BSSDEF_H__ - - -#define MAX_IE_SZ 768 - - -#ifdef PLATFORM_LINUX - -#define NDIS_802_11_LENGTH_SSID 32 -#define NDIS_802_11_LENGTH_RATES 8 -#define NDIS_802_11_LENGTH_RATES_EX 16 - -typedef unsigned char NDIS_802_11_MAC_ADDRESS[6]; -typedef long NDIS_802_11_RSSI; // in dBm -typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates -typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates - - -typedef ULONG NDIS_802_11_KEY_INDEX; -typedef unsigned long long NDIS_802_11_KEY_RSC; - - -typedef struct _NDIS_802_11_SSID -{ - ULONG SsidLength; - UCHAR Ssid[32]; -} NDIS_802_11_SSID, *PNDIS_802_11_SSID; - -typedef enum _NDIS_802_11_NETWORK_TYPE -{ - Ndis802_11FH, - Ndis802_11DS, - Ndis802_11OFDM5, - Ndis802_11OFDM24, - Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound -} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; - -typedef struct _NDIS_802_11_CONFIGURATION_FH -{ - ULONG Length; // Length of structure - ULONG HopPattern; // As defined by 802.11, MSB set - ULONG HopSet; // to one if non-802.11 - ULONG DwellTime; // units are Kusec -} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; - - -/* - FW will only save the channel number in DSConfig. - ODI Handler will convert the channel number to freq. number. -*/ -typedef struct _NDIS_802_11_CONFIGURATION -{ - ULONG Length; // Length of structure - ULONG BeaconPeriod; // units are Kusec - ULONG ATIMWindow; // units are Kusec - ULONG DSConfig; // Frequency, units are kHz - NDIS_802_11_CONFIGURATION_FH FHConfig; -} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; - - - -typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE -{ - Ndis802_11IBSS, - Ndis802_11Infrastructure, - Ndis802_11AutoUnknown, - Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound - Ndis802_11APMode -} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; - - - - - -typedef struct _NDIS_802_11_FIXED_IEs -{ - UCHAR Timestamp[8]; - USHORT BeaconInterval; - USHORT Capabilities; -} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; - - - -typedef struct _NDIS_802_11_VARIABLE_IEs -{ - UCHAR ElementID; - UCHAR Length; - UCHAR data[1]; -} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; - - - -/* - - - -Length is the 4 bytes multiples of the sume of - sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) -+ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) -+ sizeof (NDIS_802_11_RATES_EX) + IELength - -Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the -partial sum. - -*/ -#if 0 -typedef struct _NDIS_WLAN_BSSID_EX -{ - ULONG Length; - NDIS_802_11_MAC_ADDRESS MacAddress; - UCHAR Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity; - NDIS_802_11_SSID Ssid; - ULONG Privacy; - NDIS_802_11_RSSI Rssi; - NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; - NDIS_802_11_CONFIGURATION Configuration; - NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; - NDIS_802_11_RATES_EX SupportedRates; - ULONG IELength; - UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) -} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; - - -typedef struct _NDIS_802_11_BSSID_LIST_EX -{ - ULONG NumberOfItems; - NDIS_WLAN_BSSID_EX Bssid[1]; -} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; -#endif - -typedef enum _NDIS_802_11_AUTHENTICATION_MODE -{ - Ndis802_11AuthModeOpen, - Ndis802_11AuthModeShared, - Ndis802_11AuthModeAutoSwitch, - Ndis802_11AuthModeWPA, - Ndis802_11AuthModeWPAPSK, - Ndis802_11AuthModeWPANone, - Ndis802_11AuthModeMax // Not a real mode, defined as upper bound -} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; - -typedef enum _NDIS_802_11_WEP_STATUS -{ - Ndis802_11WEPEnabled, - Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, - Ndis802_11WEPDisabled, - Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, - Ndis802_11WEPKeyAbsent, - Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, - Ndis802_11WEPNotSupported, - Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, - Ndis802_11Encryption2Enabled, - Ndis802_11Encryption2KeyAbsent, - Ndis802_11Encryption3Enabled, - Ndis802_11Encryption3KeyAbsent -} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, - NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; - - -#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 -#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 -#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 - -#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 -#define NDIS_802_11_AI_RESFI_STATUSCODE 2 -#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 - -typedef struct _NDIS_802_11_AI_REQFI -{ - USHORT Capabilities; - USHORT ListenInterval; - NDIS_802_11_MAC_ADDRESS CurrentAPAddress; -} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; - -typedef struct _NDIS_802_11_AI_RESFI -{ - USHORT Capabilities; - USHORT StatusCode; - USHORT AssociationId; -} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; - -typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION -{ - ULONG Length; - USHORT AvailableRequestFixedIEs; - NDIS_802_11_AI_REQFI RequestFixedIEs; - ULONG RequestIELength; - ULONG OffsetRequestIEs; - USHORT AvailableResponseFixedIEs; - NDIS_802_11_AI_RESFI ResponseFixedIEs; - ULONG ResponseIELength; - ULONG OffsetResponseIEs; -} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; - -typedef enum _NDIS_802_11_RELOAD_DEFAULTS -{ - Ndis802_11ReloadWEPKeys -} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; - - -// Key mapping keys require a BSSID -typedef struct _NDIS_802_11_KEY -{ - ULONG Length; // Length of this structure - ULONG KeyIndex; - ULONG KeyLength; // length of key in bytes - NDIS_802_11_MAC_ADDRESS BSSID; - NDIS_802_11_KEY_RSC KeyRSC; - UCHAR KeyMaterial[32]; // variable length depending on above field -} NDIS_802_11_KEY, *PNDIS_802_11_KEY; - -typedef struct _NDIS_802_11_REMOVE_KEY -{ - ULONG Length; // Length of this structure - ULONG KeyIndex; - NDIS_802_11_MAC_ADDRESS BSSID; -} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; - -typedef struct _NDIS_802_11_WEP -{ - ULONG Length; // Length of this structure - ULONG KeyIndex; // 0 is the per-client key, 1-N are the global keys - ULONG KeyLength; // length of key in bytes - UCHAR KeyMaterial[16];// variable length depending on above field -} NDIS_802_11_WEP, *PNDIS_802_11_WEP; - -typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST -{ - ULONG Length; // Length of structure - NDIS_802_11_MAC_ADDRESS Bssid; - ULONG Flags; -} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; - -typedef enum _NDIS_802_11_STATUS_TYPE -{ - Ndis802_11StatusType_Authentication, - Ndis802_11StatusType_MediaStreamMode, - Ndis802_11StatusType_PMKID_CandidateList, - Ndis802_11StatusTypeMax // not a real type, defined as an upper bound -} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; - -typedef struct _NDIS_802_11_STATUS_INDICATION -{ - NDIS_802_11_STATUS_TYPE StatusType; -} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; - -// mask for authentication/integrity fields -#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f -#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 -#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 -#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 -#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E - -// MIC check time, 60 seconds. -#define MIC_CHECK_TIME 60000000 - -typedef struct _NDIS_802_11_AUTHENTICATION_EVENT -{ - NDIS_802_11_STATUS_INDICATION Status; - NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; -} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; - -typedef struct _NDIS_802_11_TEST -{ - ULONG Length; - ULONG Type; - union - { - NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; - NDIS_802_11_RSSI RssiTrigger; - }tt; -} NDIS_802_11_TEST, *PNDIS_802_11_TEST; - - -#endif //end of #ifdef PLATFORM_LINUX - -#ifndef Ndis802_11APMode -#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1) -#endif - -typedef struct _WLAN_PHY_INFO -{ - u8 SignalStrength;//(in percentage) - u8 SignalQuality;//(in percentage) - u8 Optimum_antenna; //for Antenna diversity - u8 Reserved_0; -}WLAN_PHY_INFO,*PWLAN_PHY_INFO; - -typedef struct _WLAN_BSSID_EX -{ - ULONG Length; - NDIS_802_11_MAC_ADDRESS MacAddress; - UCHAR Reserved[2];//[0]: IS beacon frame - NDIS_802_11_SSID Ssid; - ULONG Privacy; - NDIS_802_11_RSSI Rssi;//(in dBM,raw data ,get from PHY) - NDIS_802_11_RSSI Rssi_prev; - NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; - NDIS_802_11_CONFIGURATION Configuration; - NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; - NDIS_802_11_RATES_EX SupportedRates; - WLAN_PHY_INFO PhyInfo; - ULONG IELength; - UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) -} WLAN_BSSID_EX, *PWLAN_BSSID_EX; - -__inline static uint get_WLAN_BSSID_EX_sz(WLAN_BSSID_EX *bss) -{ - uint t_len; - - t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + - sizeof (NDIS_802_11_SSID) + sizeof (ULONG) + - sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + - sizeof (NDIS_802_11_CONFIGURATION) + - sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + - sizeof (NDIS_802_11_RATES_EX)+ - //all new member add here - sizeof(WLAN_PHY_INFO)+ - //all new member add here - sizeof (ULONG) + bss->IELength; - return t_len; - -} - -struct wlan_network { - _list list; - int network_type; //refer to ieee80211.h for WIRELESS_11A/B/G - int fixed; // set to fixed when not to be removed as site-surveying - unsigned long last_scanned; //timestamp for the network - int aid; //will only be valid when a BSS is joinned. - int join_res; - WLAN_BSSID_EX network; //must be the last item -#ifdef PLATFORM_WINDOWS - unsigned char iebuf[MAX_IE_SZ]; -#endif - -}; - -enum VRTL_CARRIER_SENSE -{ - DISABLE_VCS, - ENABLE_VCS, - AUTO_VCS -}; - -enum VCS_TYPE -{ - NONE_VCS, - RTS_CTS, - CTS_TO_SELF -}; - - - - -#define PWR_CAM 0 -#define PWR_MINPS 1 -#define PWR_MAXPS 2 -#define PWR_UAPSD 3 -#define PWR_VOIP 4 - - -enum UAPSD_MAX_SP -{ - NO_LIMIT, - TWO_MSDU, - FOUR_MSDU, - SIX_MSDU -}; - - -//john -#define NUM_PRE_AUTH_KEY 16 -#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY - -/* -* WPA2 -*/ - -#ifndef PLATFORM_OS_CE -typedef struct _PMKID_CANDIDATE { - NDIS_802_11_MAC_ADDRESS BSSID; - ULONG Flags; -} PMKID_CANDIDATE, *PPMKID_CANDIDATE; - -typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST -{ - ULONG Version; // Version of the structure - ULONG NumCandidates; // No. of pmkid candidates - PMKID_CANDIDATE CandidateList[1]; -} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST; - - -typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION -{ - NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; - NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported; - -} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION; - -typedef struct _NDIS_802_11_CAPABILITY -{ - ULONG Length; - ULONG Version; - ULONG NoOfPMKIDs; - ULONG NoOfAuthEncryptPairsSupported; - NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1]; - -} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY; -#endif - - -#endif //#ifndef WLAN_BSSDEF_H_ - diff --git a/drivers/net/wireless/rtl8192c/include/xmit_osdep.h b/drivers/net/wireless/rtl8192c/include/xmit_osdep.h deleted file mode 100755 index 7d28d43a5378..000000000000 --- a/drivers/net/wireless/rtl8192c/include/xmit_osdep.h +++ /dev/null @@ -1,90 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#ifndef __XMIT_OSDEP_H_ -#define __XMIT_OSDEP_H_ - -#include -#include -#include - -struct pkt_file { - _pkt *pkt; - SIZE_T pkt_len; //the remainder length of the open_file - _buffer *cur_buffer; - u8 *buf_start; - u8 *cur_addr; - SIZE_T buf_len; -}; - -#ifdef PLATFORM_WINDOWS - -#ifdef PLATFORM_OS_XP -#ifdef CONFIG_USB_HCI -#include -#include -#include -#endif -#endif - -#define NR_XMITFRAME 128 - -#define ETH_ALEN 6 - -extern NDIS_STATUS rtw_xmit_entry( -IN _nic_hdl cnxt, -IN NDIS_PACKET *pkt, -IN UINT flags -); - -#endif - - -#ifdef PLATFORM_LINUX - -#define NR_XMITFRAME 256 - -struct xmit_priv; -struct pkt_attrib; -struct sta_xmit_priv; -struct xmit_frame; -struct xmit_buf; - -extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); - -#endif - -void rtw_os_xmit_schedule(_adapter *padapter); - -int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz); -void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz); - -extern void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib); - -extern uint rtw_remainder_len(struct pkt_file *pfile); -extern void _rtw_open_pktfile(_pkt *pkt, struct pkt_file *pfile); -extern uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen); -extern sint rtw_endofpktfile (struct pkt_file *pfile); - -extern void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt); -extern void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe); - -#endif // - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu b/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu deleted file mode 100644 index 7bd6a80e031b..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu +++ /dev/null @@ -1,1442 +0,0 @@ -begin 644 os_dep/linux/ioctl_linux.o -M?T5,1@$!`0````````````$`*``!``````````````#LF0``````!30````` -M`"@`$0`.`#`P0.)S,._F"0!3XS``0)(>_R^183!`XG,P[^8%`%/C5P!`DA[_ -M+Y%!,$#B`RD.5L,)/E"``3 -MXP(PH!,`,((5"P``&D``$^,!```:(``3XP(```H!,*#C`#""Y00``.H0`!/C -M`S"@$P`P@A4`,*`#`#""!0``H.,>_R_A!$`MY>!"D.5L,)3E`0`3XP8```IZ -M-0'CTS"4X0`P8^(`,(+E`#"@XP0PPN4$``#J`#"@XP`P@N4$,,+E`3"@XP4P -MPN4``*#C$`"]Z![_+^$`,-#E``!3XP@```H!`%/A`P``&@@``.H,`(#B`0!3 -MX04```H,,-#E``!3X_G__QH``%/B`0"@$Q[_+^$!`*#C'O\OX>`2D.5(.@+C -MLS"1X0`P@N4``*#C!`#"Y1[_+^$$0"WEX$*0Y04PTN4``%/C!```"BHI`.,, -M-`'C`R"$YP``H.,(``#J`#"2Y0$<0^(J*`#C`@!1X14`X(,!,,.3#"0!DP(P -MA)<``*"3$`"]Z![_+^'@$I#E##0!XP,PD><`,(+E``"@XP0`PN4>_R_A!S"@ -MXP`P@N4``*#C!`#"Y0$PH.,%,,+E'O\OX0``H.,``(+E!`#"Y0$PH.,%,,+E -M'O\OX1!`+>D(T$WBX$*0Y0X`D^@`,(WE!`"@X?\_#^,/,$#C3,4#XP_@H.$, -M\)3G``"@XPC0C>(0@+WH``#@XQ[_+^$``.#C'O\OX0``H.,>_R_A``"@XQ[_ -M+^$``*#C'O\OX0``H.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A``"@ -MXQ[_+^$$0"WEX$*0Y6PPE.4!`!/C!P``&@`PH.,F)@/C`C#$YR/3`)3A)S8#XP,`Q.G@4I#E`F"@X80U`^,#$)7G`3!RX@`PH#,``%'C`3"#$P``4^,50.`3&@`` -M&@!`DN4"`%3C$```B@11A>`$4(7B!#"VY0`PA>4`,`#C`#!`XP`@EN4$(8/G -M````XP``0.,`$`#C`!!`XP0@H.$`,)7E_O__ZP!`H.,&``#J````XP``0.,` -M$`#C`!!`XP0@H.'^___K`$"@XP0`H.%P@+WH$$`MZ>!"D.4#,`'B`P!3XPP` -M`!K,`)_E_O__ZP`PH.,4*P'C`C"$YP(0H.,$($+B`A"$YP$0@>+:+T+B`A"$ -MYP-`H.$E``#J`@`1XPL```J4`)_E_O__ZP`PH.,4*P'C`C"$YP$@H.,0&P'C -M`2"$Y]H?0>(!((3G`T"@X1<``.H!`!'C"@``"A`[`>,#,)3G`P!3XP!`H(,` -M,*"3$"L!DP(PA)>H)P&3`C"$EP-`H)$*``#J!``1XP0```H```#C``!`X_[_ -M_^L`0*#C`P``Z@```.,``$#C_O__ZQ5`X.,$`*#A$("]Z"P```!\````\$\M -MZ1S03>(`0*#A$Q"@XQ<@C>(4-0/C#^"@X0/PD.<```#C``!`X_[__^L7@-WE -M`P!8XP``6!,`@*`3`8"@`P``6.,!@*`3`H"@`P!0H.,!<*#C`*``XP"@0.,` -MD`#C`)!`XP!@`.,`8$#CQ`"?Y040H.'^___K!["@X0`PH..(`8WI!8"@X09P -MH.$$8*#A`T"@X08`H.$($*#A!""@X0`PX.-(Q0/C#^"@X0SPEN<`4*#ARS^@ -MX2,_H.$#((O@`R`"X@(P8^`!`%/C`@``&@H`H.$$$*#A_O__ZP<`H.$%$*#A -M_O__ZP,P"^(!L(OB``!3XP$``!H)`*#A_O__ZP%`A.(!#%3CX?__&@A0H.$, -M@)WE!D"@X0=@H.$(<)WE`7R'X@%0A>((`%7ASO__NAS0C>+PC[WH$`$``'!` -M+>D#0*#AX%*0Y04`H.$&`)/H_S\/XP\P0.-(Q0/C#^"@X0SPE><`4*#A!`"@ -MX0`0`.,`$$#C!2"@X?[__^L``*#C<("]Z/!/+>FKWTWB`G"@X0.`H.'@HI#E -M:CT/X_\_3^,`0*#CJB^-XK-`@N%H/0_C_S]/X[-`@N&*#XWB!!"@X8`@H./^ -M___K*`"-X@00H.$"+*#C_O__ZP`0E^6T8-?A#<"@X7\]S.,_,,/C"$"3Y090 -MD>`$4-4P`$"@,P``5.,&```:"`"@X08@H.'^___K``!0XPT`X!/$`0`:!@`` -MZ@``5N,$```*"`"@X080H.'^___K#0#@X[P!`.H`0*#C%$"-Y1A`C>4<0(WE -M)("-Y>`&G^7@%I_E"""@X?[__^L$4*#A)&"-XM"6G^44L(WB`P``Z@P`5>,& -M```*!4"+YP10A>(&`*#A"1"@X?[__^L`0%#B]O__&AA0G>4``%7CH0$`"AR0 -MG>4``%GCG@$`"A1`G>4$`*#AA!:?Y?[__^L``%#C6@``&G@&G^4$$*#A_O__ -MZPH`H.$`$*#C@""@XXH_C>+^___K`0!0XQ```!I4!I_E_O__ZP@`H.$`$*#C -M!""@X_[__^M`!I_E_O__ZP@`H.$X%I_E"""@X?[__^L`4*#C++:?Y2RFG^4L -MEI_E`P``ZB@&G^7^___K#0#@XWH!`.H+`*#A!1"@X?[__^L(`*#A#!:?Y0@@ -MH.$%,*#A_O__ZXI/C>(%0(3@`&"@XPH`H.$`$-3E_O__ZP@`H.$)$*#A"""@ -MX0$PU.3^___K`6"&X@@`5N/T__\:R`6?Y?[__^L(`*#AP!6?Y0@@H.'^___K -MJB^-X@5`@N!X0$3B"```Z@H`H.$!$%3E_O__ZP@`H.$)$*#A"""@X0$P5.7^ -M___K`6"&X@%`A.(0`%;C\___&G@%G^7^___K"`"@X7`5G^4((*#A_O__ZQ!0 -MA>*``%7CRO__&E0%G^7^___K"`"@X?[__^NT`,?A``"@XSX!`.H$`*#A/!6? -MY?[__^L``%#C6```&B!`C>(%`*#A!!"@X1`@H./^___K<&#_Y@:PH.$4!9_E -M!A"@X?[__^L)`*#A!!"@X0H@H./^___K<%#_Y@``5>,G`0`*#%"-Y>P$G^4% -M$*#A_O__ZVI-#^/_3T_C`!"@XP`0C>4*`*#A`R"@XZK/C>($,(S@_O__ZP:P -MA>"J+XWBM$"2X00`6^$#``#:K`2?Y?[__^L-`.#C$@$`Z@H`H.$&$*#A!2"@ -MX8H_C>+^___K``!0XP(``!J$!)_E_O__ZP$``.I\!)_E_O__ZP@`H.$`$*#C -M!""@X_[__^L`0*#C9&2?Y8I?C>)@I)_E8)2?Y6"TG^4.``#J!@"@X000U>?^ -M___K"`"@X0H0H.$((*#A!##5Y_[__^L)`*#A_O__ZP@`H.$+$*#A"""@X?[_ -M_^L!0(3B##"=Y0,`5.'M__^Z"`"@X?[__^L!`(#BM`#'X00$G^4($*#A_O__ -MZP``H./@``#J!`"@X?`3G^7^___K``!0XST``!HH,(WB`#"-Y0H`H.$`$*#C -M`2"@X0(\H./^___K``!0XP,``!IX`Y_E_O__ZPT`X./.``#JL`.?Y?[__^L( -M`*#A`!"@XP0@H./^___K`$"@XRA0C>)08Y_E4*.?Y8R3G^6,LY_E````XP`` -M0.,$$-7G_O__ZP@`H.$`$`#C`!!`XP@@H.$$,-7G_O__ZP\P!.(/`%/C!@`` -M&@D`H.'^___K"`"@X0L0H.$((*#A_O__ZP@``.H',`3B!P!3XP4``!H&`*#A -M_O__ZP@`H.$*$*#A"""@X?[__^L!0(3B`@Q4X]___QH(`*#A_O__Z[0`Q^$` -M`*#CG0``Z@0`H.'T$I_E_O__ZP``4.,\```::DT/X_]/3^,`$*#C`!"-Y0H` -MH.$#(*#CJL^-X@0PC.#^___KJB^-XK1`DN$5`%3C`P``RH`"G^7^___K#0#@ -MXX<``.H*`*#A%A"@XP8@H..*/XWB_O__ZP``4.,"```:6`*?Y?[__^L!``#J -M4`*?Y?[__^L(`*#A`!"@XP0@H./^___K`$"@XSABG^6*7XWB-**?Y322G^4T -MLI_E!@"@X000U>?^___K"`"@X0H0H.$((*#A!##5Y_[__^L)`*#A_O__ZP@` -MH.$+$*#A"""@X?[__^L!0(3B!@!4X^[__QH(`*#A_O__Z[0`Q^$``*#C6P`` -MZ@0`H.'P$9_E_O__ZP``4.,\```::DT/X_]/3^,`$*#C`!"-Y0H`H.$#(*#C -MJL^-X@0PC.#^___KJB^-XK1`DN$)`%3C`P``RG@!G^7^___K#0#@XT4``.H* -M`*#A"A"@XP0@H..*/XWB_O__ZP``4.,"```:4`&?Y?[__^L!``#J2`&?Y?[_ -M_^L(`*#A`!"@XP0@H./^___K`$"@XS!AG^6*7XWB+*&?Y2R1G^4LL9_E!@"@ -MX000U>?^___K"`"@X0H0H.$((*#A!##5Y_[__^L)`*#A_O__ZP@`H.$+$*#A -M"""@X?[__^L!0(3B!`!4X^[__QH(`*#A_O__Z[0`Q^$``*#C&0``Z@0`H.'L -M$)_E_O__ZP``4.,``*`3$P``&@H`H.$0$(WB_O__ZPH`H.'^___K:#T/X_\_ -M3^.JSXWBLT"A``0``#````$P!``!0`0``6`$``&P!``"$`0`` -MF`$``,`!``#8`0``X`$``*`!``#,`0``Z`$``.P!```T`0``\`$``/0!``#\ -M`0``"`(``!0"```T`@``4`(``&@"``!P`@``?`(``(`"``"$`@``D`(``)@" -M``#(`@``S`(``-0"``#8`@``X`(``.@"``#P02WI"-!-X@.`H.'@($(*#C_O__ZP(``.H$`(WB!!"@X_[__^N$-0/C`S"7YP%@=N(` -M8*`S``!3XP%@AA,``%;C%4#@$RH``!H$0)WE``!4XP`PV`4$,(T%H`"?Y:`0 -MG^4$()WE_O__ZP0PG>4!`%/C"```&J@T`^,#,)?G``!3XQH```H'`*#A"1"@ -MXS/_+^$`0*#C%@``Z@(`4^,(```:J#0#XP,PE^<``%/C#P``"@<`H.$*$*#C -M,_\OX0!`H.,+``#J`P!3XP@``!JH-`/C`S"7YP``4^,$```*!P"@X0P0H.,S -M_R_A`$"@XP```.H`0*#C!`"@X0C0C>+P@;WH"`,``"````#P12WIJ=]-XN"B -MD.4`0*#C#$"-Y1!`C>440(WE:BT/X_\O3^,J'HWBLD"!X1PPC>4```#C``!` -MXT`4G^4#(*#A_O__ZQQ@C>(`<`#C`'!`XPR`C>(#``#J#`!4XP8```H$4(CG -M!$"$X@8`H.$'$*#A_O__ZP!04.+V__\:$$"=Y0``5./X```*%&"=Y0``5N/U -M```*#%"=Y04`H.$`$`#C`!!`X_[__^L``%#C/0``&@0`H.$8$(WB$""@X_[_ -M_^MP@._FN`.?Y0@0H.'^___K!@"@X?[__^N@<+#AY```"J`#G^4'$*#A_O__ -MZY@#G^4&$*#A_O__ZP!0H.,B3HWB!```Z@(`5N4!$%;E_O__ZP4`Q.'W__\Z:DT/X_]/3^,`$*#C`!"-Y0H`H.$#(*#C*LZ-X@0PC.#^ -M___K!S"(X"H>C>*T0)'A!`!3X0,``)HL`Y_E_O__ZPT`X./"``#J"@"@X0@0 -MH.%W(/_F(CZ-XO[__^L``%#C`P``&@0#G^7^___K#0#@X[<``.KX`I_E_O__ -MZP``H..S``#J!0"@X0`0`.,`$$#C_O__ZP``4.,M```:!`"@X1@0C>(0(*#C -M_O__ZW"`[^:H`I_E"!"@X?[__^L&`*#A_O__ZZ!PL.&@```*I`*?Y0<0H.'^ -M___KB`*?Y080H.'^___K`%"@XR!`C>($``#J`@!6Y0$05N7^___K!0#$YP%0 -MA>("8(;B!P!5X??__SH@,(WB`#"-Y0H`H.$!$*#C"""@X74!$-7E_O__ZP8`Q.C>*T0)'A!`!3X0,``)I8`9_E -M_O__ZPT`X.--``#J"@"@X180H.-W(/_F(CZ-XO[__^L``%#C`P``&C`!G^7^ -M___K#0#@XT(``.H```#C``!`X_[__^L``*#C/0``Z@4`H.$`$`#C`!!`X_[_ -M_^L``%#C``"@$S8``!H$`*#A_O__ZZ!PL.$Q```*V`"?Y000H.'^___K!%"@ -MX0!@H.,B3HWB!```Z@(`5>4!$%7E_O__ZP8`Q.C>*T -M0)'A!`!3X0,``)IH`)_E_O__ZPT`X.,1``#J"@"@X0H0H.-W(/_F(CZ-XO[_ -M_^L``%#C`P``&D``G^7^___K#0#@XP8``.HT`)_E_O__ZP``H.,"``#J%0#@ -MXP```.H-`.#CJ=^-XO"%O>@P````_`$```@"```H`P``/`,``%`#``!L`P`` -MD`,``*`!``"8`@``H`,``/!`+>D4T$WB`D"@X>!BD.4```#C``!`X[01G^7^ -M___K`#``XP`P0.,`4-/E``!5XP@``!H#4*#A`#``XP`P0.,%`*#A`!"3Y1`@ -MH./^___K`#"@XP\PQ>6T,-3A$`!3XU<``(H`$)3E#2"@X7\]PN,_,,/C"%"3 -MY1!`D>(%0-0P`%"@,P``5>,%```:#0"@X1`@H./^___K``!0XT@``!H$``#J -M#0"@X1`0H./^___K#4#@XT,``.H8`9_E$!&?Y10AG^4-,*#A_O__ZP8`H.$- -M$*#A_O__ZP!`4.(Y```:^`"?Y?[__^OL`)_E\!"?Y0D@H./^___K`0!0XP@` -M`!K44)_E$'#5Y:0T`^,#<,;G!@"@X?[__^L14-7E43(#XP-0QN>P4)_E#7"@ -MX04`H.$-$*#A$""@X_[__^L`,*#C#S#%Y0T`H.&4$)_E"2"@X_[__^L!`%#C -M&@``&H0`G^5L$)_E_O__ZP8`H.$!$*#C_O__ZZ@T`^,#,);G``!3XP(```H& -M`*#A!Q"@XS/_+^%$4)_EI#0#XP,@UN<0(,7E`'"@XP-PQN<&`*#A_O__ZU$R -M`^,#(-;G$2#%Y0-PQN<```#J#4#@XP0`H.$4T(WB\("]Z$0```#4`P`````` -M`/@#```4!```(`0``'!`+>D(T$WB`&"@X0)0H.$#0*#A````XP``0.-4$9_E -M`R"@X?[__^L$`*#A`!``XP`00.,$(*#C_O__ZP``4.,H```*M##5X00P0^)S -M,/_FM##%X01`A.+@4I;E`3!#X@$`4^,#```*`@!3XP!`H!,(```:`P``Z@!` -MU.4P0$3B=$#OY@,``.H``-3E`1#4Y?[__^L`0*#A"@!4XS(``(I4,@/C`S#5 -MYP0`4^$N```*``!4XP(@H!-3,@,3`R#%%P$``!H%`*#A_O__ZU0R`^,#0,7G -M`$!4X@%`H!-2,@/C`T#%YR```.H$`*#A`!``XP`00.,$(*#C_O__ZP``4.,9 -M```*M##5X00P0^*T,,7AX%*6Y0@@C>(`,*#C!#`BY00`A.(`$`#C`!!`X_[_ -M_^L$,)WE`0!3XPL``(I1(@/C`C#%YP1`G>4``%3C`"``XP`@0.,`,`#C`#!` -MXP,@H!$4`)_E%!"?Y?[__^L``*#C"-"-XG"`O>A8````;`0``&0```!P0"WI -M`T"@X>`"D.4`$)/E_O__ZP!0H.$$`*#A`!``XP`00.,%(*#A_O__ZP``H.-P -M@+WH\$+!`%3CYO__&@%;H.,`@`#C -M`(!`XP!P`.,`<$#C`*``XP"@0./$/Z#A(S^@X0,@A.`#(`+B`C!CX`$`4^," -M```:"`"@X040H.'^___K!@"@X040H.'^___K`!"@X0<`H.'^___K`P`4XP$` -M`!H*`*#A_O__ZP10A>('#53C\(>]"`%`A.+F___J$$`MZ>`"D.4&`)/H_O__ -MZP``H.,0@+WH\$\MZ2S03>+@4D3*#A -M<$!$X@\`5.,$\9^7_0(`ZB`:``"D&@``6!L``(@;``#0&P``"!P``&`<``#8 -M)0``V"4``-@E``#8)0``V"4``-@E``#8)0``V"4``*`<```"`%7C#```"@0` -M5>,3```*`0!5X^H"`!H'`*#A!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__ -MZ^$"`.H'`*#A!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__Z]@"`.H'`*#A -M!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__Z\\"`.H"`%7C$```"@0`5>,; -M```*`0!5X\D"`!H'`*#A!A"@X7,@[^;^___K!P"@X080H.'^___K`""@X0`` -M`.,``$#C!A"@X?[__^N\`@#J!P"@X080H.%S(/_F_O__ZP<`H.$&$*#A_O__ -MZP`@H.$```#C``!`XP80H.'^___KKP(`Z@<`H.$&$*#A`R"@X?[__^L'`*#A -M!A"@X?[__^L`(*#A````XP``0.,&$*#A_O__ZZ("`.H'`*#A!A"@X0`@X./5 -M/:#C#^"@X0/PE^<`(*#A````XP``0.,&$*#A_O__ZY8"`.H'`*#A!A"@X0`@ -MX.-$Q0/C#^"@X0SPE^<'`*#A!A"@X0`@X./5/:#C#^"@X0/PE^<`(*#A```` -MXP``0.,&$*#A_O__ZX0"`.H'`*#A!1"@X08@H.$`,.#C2,4#XP_@H.$,\)?G -M`#"@X0```.,``$#C!1"@X08@H.'^___K=@(`Z@`PC>4'`*#A!1"@X08@H.$` -M,.#C3,4#XP_@H.$,\)?G!P"@X040H.$&(*#A`##@XTC%`^,/X*#A#/"7YP`P -MH.$```#C``!`XP40H.$&(*#A_O__ZV`"`.H``%7C`""@`W@U`0,#(,<'6P(` -M"@$`5>-9`@`:`2"@XW@U`>,#(,?G)$"=Y60`5.-D0*`C>34!XP-`Q^=0`@#J -M"0!5X]<```H2``"*!`!5XTL```H'``"*`0!5XRT```HG```Z`@!5XS<```H# -M`%7C0P(`&CD``.H&`%7CG```"DP``#H'`%7CL0``"@@`5>,[`@`:M@``ZA(` -M5>-)`0`*"@``B@\`5>,[`0`*`@``B@P`5>,R`@`:+`$`ZA``5>-&`0`*$0!5 -MXRT"`!I)`0#J_0!5XXP!``H$``"*W0!5XT\!``KN`%7C)0(`&EL!`.K^`%7C -MG`$`"O\`5>,@`@`:J`$`Z@```.,``$#C;!"7Y?[__^L:`@#JJ#L -M-P'C`R"7YQ`[`>,#,)?G%`L!XP``E^<``(WE````XP``0./^___K#0(`Z@`` -M`.,``$#CP!F7Y?[__^L(`@#J````XP``0./$%)?E_O__ZP```.,``$#CT!27 -MY?[__^O_`0#J````XP``0..>%]?E_O__ZP```.,``$#CGQ?7Y?[__^L```#C -M``!`XZ`7U^7^___K\@$`ZE<-A^(8`(#BX!"'XO[__^L`4%#B/```"N`0U>7A -M(-7EXC#5Y>,`U>4``(WEY`#5Y00`C>7E`-7E"`"-Y0```.,``$#C_O__ZP`` -M`.,``$#C31'5Y4PAU>7^___K````XP``0./<$)7E^"65Y4\QU>7^___KT!"% -MX@X`D>A.`=7E``"-Y0```.,``$#C_O__ZP```.,``$#C#!;5Y0TFU>4.-M7E -M_O__ZP```.,``$#C_!65Y?[__^L```#C``!`XP\6U>40)M7E_O__ZV]?A>(` -M0*#C`&``XP!@0.,`,-7E``!3XP,```H&`*#A!!"@X;(@U>'^___K`4"$XD10 -MA>(0`%3C]/__&J\!`.K@$-?EX2#7Y>(PU^7C`-?E``"-Y>0`U^4$`(WEY0#7 -MY0@`C>6@!I_E_O__ZZ,!`.HC0(WB!P"@X100H.,$(*#A%#4#XP_@H.$#\)?G -M````XP``0.,C$-WE!B"@X?[__^L/$`;B(Q#-Y0```.,``$#C_O__ZP<`H.$4 -M$*#C!""@X1`U`^,/X*#A`_"7YXL!`.H```#C``!`XX@U`^,#$)?GA#4#XP,@ -ME^?^___K@P$`Z@```.,``$#CE#0!XP,0E^<%.Z#C`R"7Y_[__^L```#C``!` -MXR`U`>,#$-?G_O__ZW8!`.H```#C``!`XYPW`>.S$)?AGC=A^(HD(GB`*"@XP`P`.,` -M,$#C%#"-Y0`P`.,`,$#C&#"-Y0`P`.,`,$#C'#"-Y0>`H.&O?XKB`7"'XH=Q -MB.``0)GE`+``XP"P0.,`,`#C`#!`XQ`PC>4[``#J"&!$X@!`E.74,);E)%"= -MY04`4^$U```:X!#6Y>$@UN7B,-;EXP#6Y0``C>7D`-;E!`"-Y>4`UN4(`(WE -M%`"=Y?[__^L+`*#A31'6Y4PAUN7^___K$`"=Y=P0EN7X)9;E3S'6Y?[__^M. -M,=;E`#"-Y1@`G>70$(;B#@"1Z/[__^O0!)_E#!;6Y0TFUN4.-M;E_O__Z\`$ -MG^7\%9;E_O__Z[@$G^4/%M;E$";6Y?[__^NL!)_ES!"6Y?[__^MO;X;B`%"@ -MXP`PUN4``%/C`P``"AP`G>4%$*#ALB#6X?[__^L!4(7B1&"&XA``5>/T__\: -M!P"@X000H.'^___K``!0X[[__PH!H(KB")")XB``6N.P__\:#2"@X7\]PN,_ -M,,/C!""3Y0$@0N($((/E_O__ZP0!`.H```#C``!`XP,0H.'^___K!P"@X080 -MH.,D((WB'#4#XP_@H.$#\)?G^0``Z@``4^/W```:^`.?Y?[__^MT-0/C`S"7 -MYP``4^/Q```*!P"@X3/_+^'N``#J````XP``0.,8,@/C`Q"7Y_[__^OH``#J -M````XP``0.,`$`#C`!!`X_[__^OB``#J`0!3XP`0`!,`$$`3G!.?!0```.,` -M`$#C_O__ZR1`G>5/-@/C`T#'Y]<``.H``%/C`@``&@<`H.'^___KT@``Z@$` -M4^,"```:!P"@X?[__^O-``#J`@!3X\L``!H'`*#A_O__Z\@``.H/`%/C%P`` -M&@<`H.$'$*#C(R"-XA@U`^,/X*#A`_"7YR0#G^4C$-WE_O__ZQP#G^7^___K -M&`.?Y?[__^L4`Y_E_O__ZQ`#G^7^___K#`.?Y?[__^L(`Y_E_O__ZP0#G^7^ -M___KK@``Z@<`H.$'$*#C)""-XAPU`^,/X*#A`_"7YP<`H.$'$*#C(R"-XA@U -M`^,/X*#A`_"7YP```.,``$#C(Q#=Y?[__^N=``#J=F#OY@<`H.'%'J#C!B"@ -MX?[__^L'`*#AQ1Z@X_[__^L`$*#A````XP``0./^___K!P"@X5@<`.,&(*#A -M_O__ZP<`H.%8'`#C_O__ZP`0H.$```#C``!`X_[__^N%``#J!P"@X<4>H./^ -M___K`!"@X0```.,``$#C_O__ZP<`H.%8'`#C_O__ZP`0H.$```#C``!`X_[_ -M_^MV``#J!P"@X2$>H./^___K`!"@X0```.,``$#C_O__ZP<`H.$(%@#C_O__ -MZP`0H.$```#C``!`X_[__^L'`*#A"AV@X_[__^L`$*#A````XP``0./^___K -M!P"@X:$?H./^___K`!"@X0```.,``$#C_O__ZP<`H.&B'Z#C_O__ZP`0H.$` -M``#C``!`X_[__^L'`*#A9!8`X_[__^L`$*#A````XP``0./^___K````XP`` -M0./^___K!P"@X4,>H./^___K`!"@X0```.,``$#C_O__ZP<`H.$X%`#C_O__ -MZP`0H.$```#C``!`X_[__^L'`*#A$1V@X_[__^L`$*#A````XP``0./^___K -M!P"@X5@4`./^___K`!"@X0```.,``$#C_O__ZP<`H.&$%`#C_O__ZP`0H.$` -M``#C``!`X_[__^L'`*#AB!0`X_[__^L`$*#A````XP``0./^___K!P"@X404 -M`./^___K`!"@X0```.,``$#C_O__ZP<`H.%(%`#C_O__ZP`0H.$```#C``!` -MX_[__^L'`*#A3!0`X_[__^L`$*#A````XP``0./^___K!P"@X44>H./^___K -M`!"@X0```.,``$#C_O__ZP(``.H```#C``!`X_[__^L``*#C+-"-XO"/O>BH -M!P``)`<``$@'``!(4((WEX%*0Y0```.,``$#C_O__ZX0U`^,#()7G -M%!"=Y0$P<>(`,*`S``!2XP$P@Q,``%/C`$"@`QY@H`,%```*I```Z@8`H.'^ -M___K`4"$XF4`5.,"```*;#"5Y2(-$^/W__\:`""@XQ0PG>6V(,/A%!"=Y;0P -MT>$?`%/CE0``F@`0D>4-(*#A?SW"XS\PP^,(8)/E($"1X@9`U#``8*`S``!6 -MXP4``!HL`(WB(""@X_[__^L``%#C!0``"H4``.HL`(WB(!"@X_[__^L50.#C -M@P``ZO[__^L-$*#A?SW!XS\PP^,$()/E`2""X@0@@^6$((7B&""-Y82@E>4` -MD*#C++"-XDR`C>(<@(WE`#``XP`P0.,@,(WE&`"=Y0H0H.'^___K`0!0XT\` -M``H)0*#A"U"@X0``U>49]O_K`'!0XA```+H!`/7E%?;_ZP!@4.(,``"Z`5"% -MX@=BAN$$8,CG!`!4XP,``,H`,-7E.@!3XP0``!H!4(7B`4"$X@8`5./K__\: -M60``Z@```.,``$#C+!"-XO[__^L-$*#A?SW!XS\PP^,$()/E`2!"X@0@@^7^ -M___K%4#@XTD``.I,8-WE37#=Y4X@W>4D((WE3T#=Y0!`C>500-WE!$"-Y5%` -MW>4(0(WE(`"=Y080H.$'(*#A)#"=Y?[__^ND8(7BE""5Y08`H.%4$(WB#"!" -MXO[__^L``%#C!0``"E1`G>4``%3C`3"@$Q00G16V,,$1#@``&I0@E>4&`*#A -M5!"-X@P@0N+^___K``!0XP4```I40)WE``!4XP(@H!,4,)T5MB##$0$``!H` -MH)KEJO__Z@T0H.%_/<'C/S##XP0@D^4!($+B!""#Y?[__^L4()WEM##2X2$` -M4^,1``":``"2Y2``@.(-$*#A?SW!XS\PP^,(4)/E`4"0X@5`U#``4*`S``!5 -MXP0``!H&$(+B`2"@X_[__^L``%#C`0``"A5`X.,```#J`$"@XP0`H.%(" -M0*#AX&*0Y;10TN$``%7CH0``"@`PDN4``%/CG@``"K:PTN$%<*#A!0"@X?[_ -M_^L`H%#B"T#@`Y@```H`$)3E#2"@X7\]PN,_,,/C"("3Y0=0D>`(4-4P`("@ -M,P``6.,%```:"@"@X0<@H.'^___K``!0XXP``!H&``#J``!7XP0```H*`*#A -M!Q"@X?[__^L-0.#CAP``Z@J0H.$`4)KE(@!5XQ5`X(."``"*"("*XA`"G^40 -M$I_E_O__ZP8`5>,]```*!@``B@(`5>,.```*`P!5XR(```H``%7C!P``"E@` -M`.H?`%7C1@``"B(`5>--```*!P!5XU(``!HW``#JR`&?Y?[__^M.``#J!#"8 -MY0(`4^,(```*!`!3XPL```H!`%/C1P``&@8`H.$`$)CE_O__ZP@`B.5"``#J -M!@"@X0`0F.7^___K"`"(Y3T``.H&`*#A`!"8Y?[__^L(`(CE.```Z@0PF.4" -M`%/C"```"@0`4^,+```*`0!3XS$``!H&`*#A`!"8Y0@@V.7^___K+```Z@8` -MH.$`$)CEN"#8X?[__^LG``#J!@"@X0`0F.4(()CE_O__ZR(``.H&`*#A`!#8 -MY00@V.4`,.#C2,4#XP_@H.$,\);G"`"(Y1D``.H`$-CE!"#8Y0@PF.4`,(WE -M!@"@X0`PX.-,Q0/C#^"@X0SPEN@-0.#C````Z@!`H.,*`*#A!Q"@X?[__^OU___J\`$``'0```#4 -M#```$`T``/!'+>D0T$WBX%*0Y0-`H.$`,*#C"#"-Y;PPS>$`,(WEM##-X0T` -MH.$&$(3B!B"@X_[__^L`,)3E`0!3XR\``!H$`I_E_O__ZPT`H.$($(WB!B"@ -MX_[__^L!`%#C50``"@!@H.,-<*#A!H"@XW:0[^8&H*#A!@.%X"8,@.(5`(#B -M#1"@X0@@H.'^___K`0!0XQ$``!JT`9_E_O__ZP:CH.$09@+C!@"*X```A>`+ -M`(#B%!"$XA`@H./^___K"J"%X`9@BN`!0*#C!$#&Y020B>`4.@+C`Y#%YSD` -M`.H!8(;B$`!6X^#__QHX``#J`""@XQ0Z`N,#(,7G`4"@XS```.H"`%/C'P`` -M&D0!G^7^___K`$"@XPU@H.$&<*#C!("@X00#A>`F#(#B%0"`X@T0H.$'(*#A -M_O__ZP$`4.,-```:!(.@X1!&`N,$`(C@``"%X`4`@.(`$*#C!B"@X_[__^L( -M4(7@!$"%X``PH.,$,,3E`4"@XQ(``.H!0(3B$`!4X^7__QH-``#J`P!3XPD` -M`!HF#(7B%`"`X@`0H.,!*Z#C_O__ZP`@H.,4.@+C`R#%YP%`H.,"``#J`$"@ -MXP```.H!0*#C!`"@X1#0C>+PA[WH%&H"XWP`G^4&$-7G_O__ZP8`U><0=@+C -M``.'X```A>`%`(#B#1"@X08@H./^___K!@#5YP`#A^```(7@"P"`XA00A.(0 -M(*#C_O__ZP8PU><#,X7@!W"#X`$PH.,$,,?E!C#5YP$P@^)S,._F!C#%YQ`` -M4^/=__\:I___ZB0-``!(#0``?`T``*0-``!P0"WI`D"@X>!BD.5L();E`0`2 -MXP<``!I``!+C!0``&@``H..T`,3AMC#4X0(Y@^.V,,3A<("]Z`90U.4``%7C -M!```"@0`5>,5`."#`5!%D@(``)IP@+WHL".V$,3A<("]Z%\NA>(,((+B`B&&X+0@TN&T(,3A``!2 -MXQ@```I>'X7B`Q"!X@$2AN!?7H7B#%"%X@51AN`#`*#A!!"!X@0@E>7^___K -MMB#4X;8@Q.$0.P'C`S"6YP``4^,"*H(#MB#$`0``H`-P@+T(`0!3XP``H!,! -M*8(#MB#$`0``H`-P@+WH``"@X[0`Q.$"&8'CMA#$X7"`O>@0,*#CM##$X0H; -M@>.V$,3A``"@XW"`O>@``*#CM`#$X0(9@>.V$,3A<("]Z!!`+>D``%/B!P`` -M"@[`H..TP,+A`3"@X[8PPN$`$`#C`!!`XPP@H.'^___K``"@XQ"`O>AP0"WI -M`E"@X>!"D.5L()3E`0`2XP(``!I``!+C`$#@`P@```KH8)3EM&#%X0,`H.'L -M$(3B!B"@X?[__^L!,*#CMC#%X0!`H.,$`*#A<("]Z'!`+>G@4I#E`D"@X0$P -MH..R,,3@!`"@X0`0H.,&(*#C_O__ZVPPE>4!`!/C`P``&D``$^,!```:$``3 -MXP0```H$`*#AX!"%X@8@H./^___K`P``Z@0`H.$`$*#C!B"@X_[__^L``*#C -M<("]Z/!!+>D@T$WB`F"@X0-PH.'@0I#E````XP``0..V$-+A_O__ZP0`C>(` -M$*#C'""@X_[__^NV4-;A`@D5XP\```I``I_E_O__ZP$@H.,4.P'C`R"$YP`P -MH..L)P'C`C"$YU@@@N(",(3G7"!"X@(PA.?:+X+B`C"$YP-`H.%^``#J_U`5 -MX@4```H$`%7C%0#@@P&`19(!4*"3!@``FG<``.JP-P'C`X"4Y]P!G^4($*#A -M_O__ZP!0H..V$-;A`@H1XPT```K$`9_E_O__ZP`PH.,4*P'C`C"$Y]LO0N(" -M,(3G!"""X@(PA.=8((+B`C"$Y\,O@N(",(3G'P``Z@$)$>,/```*````XP`` -M0./^___K`""@XQ0[`>,#((3G`3"@XZ@G`>,",(3GK",",(3G#0``Z@```.,``$#C_O__ZP`PH.,4*P'C`C"$YZ@G`>,",(3G -MK",",(3G"("-Y;0PUN$``%/C!@``"@4`4^,% -M,*"3#3"@@PPPC>4,,(/B!#"-Y2$``.H`,*#C##"-Y0$`5>,=```:L#7^___K`#"5Y04`4^,"```*#0!3 -MXPH``!H$``#J`2"@XZPW`>,#((3G`$"@XQP``.H%(*#CK#(' -M$*#A#""=Y?[__^L$`*#A!1"@X?[__^L``%#C!```&J0R`^,#,)3G``!3XUY` -MX`,````*`$"@XP0`H.$@T(WB\(&]Z!@.```L#@``1`X``+0.``#P1RWI`4"@ -MX>!BD.4`,*#C(#"!Y1LPP>6^,M'A,#"#X@(`4^'8``"*!#"1Y0$`<^/5```: -MN"#1X?\_#^,#`%+AT0``&B0PT>4#`%/CS@``BEY]AN(H<(?B#%"!X@4`H.$` -M$`#C`!!`X_[__^L``%#C4```&D`#G^7^___K`""@XQ0[`>,#((;G`3"@XZPG -M`>,",(;G6"""X@(PAN.Q```*!0!5XP6@H),-H*"##)"*X@D`H.'^___K`%!0XJL```H%`*#A -M`!"@XQP@H./^___K"*"%Y0"0A>4-`%KC!3"@`ZPG`0,",(8'6"""`@(PA@<" -M,8CC!#"%Y0R@A>(*`*#A,!"$X@@@E>7^___K'##4Y0``4^,'```*@`*?Y?[_ -M_^L&`*#A!1"@X?[__^L``%#CDP``"I```.ID`I_E_O__ZP,`6...``"*7C^( -MX@,P@^(#,H;@!`"#X@H0H.$(()7E_O__ZU\^B.(,,(/B`S&&X`@@E>4$((/E -M!@"@X0<0H.$((*#A`#"@X_[__^L`0*#C?```ZJ@W`>,#,);G`@!3XW(``!IL -M();E"#``XP$P0.,#,`+@``!3XVP```I7#8;B&`"`XN`0AN+^___K`(!0XE`` -M``H%`*#AR!&?Y?[__^L``%#C`#"@$^@PB!44.P'C`S"6YP8`4^,$`%,3K#,``HK@``"&X`0`@.(0$(CB"""@X_[__^LD`-3E#@"`X@`"BN```(;@ -M!`"`XA@0B.(((*#C_O__ZP$PH.,;+*#C`C#&YR00U.6^+T+B`A"&YP8`H.$' -M$*#A)"#4Y?[__^L&`*#A_O__ZP!`4.(1```*!0"@X700G^7^___K``!0XP`P -MH!/H,(05%#L!XP,PEN<&`%/C!`!3$P8``!JL-P'C`S"6Y^PPA.4`0*#C`@`` -MZA5`X.,```#J`$"@XP0`H.'PA[WH`$"@XP```.I>0.#C!0"@X0D0H.'^___K -M]O__ZN@.```0#P``)`\``#0/``!$#P``3`\``/!'+>D`D*#A`J"@X0-@H.&V -MAP0"WI -M`%"@X0)`H.'@8I#EMC#2X0,ZH.$C.J#A"@!3XP/QGY<*``#JU#D``-0Y``#4 -M.0``U#D``!@Y``!`.0``D#D``-0Y``#4.0``$#D``-0Y``!>0.#C+P``Z@`P -MDN4``%/C`2"@$PPV`A,#(,87`$"@$P!`H`,,-@(#`T#&!R4``.H4.P'C`S"6 -MYP``4^,@```*`#"2Y0``4^,=```*`2"@XQ0[`>,#((;G`$"@XZPW`>,#0(;G -M!#@!XP-`AN>H-P'C`T"&YQ`[`>,#0(;G$0``ZFPPEN4!`!/C"```"@8`H.'^ -M___K-`"?Y300G^7^___K!@"@X?[__^L&`*#A_O__ZP4`H.$`$)3E4(,(WE`5"@X0,`4>$`$*`3`1"@`X``4N,!,*"1`3"!@P``4^,&```* -M`""@X_@X`>,#(,#G`@!1X0)`H!$50.`#R@``Z@``4N,`0*`#QP``"@2PH.$$ -M`*#A_O__ZP!@4.(+0.`#P0``"@8`H.$%$*#A"R"@X?[__^L#`%3C`$#@D\<` -M`)H$4*#A!@"@X000H.$,((WB"#"-XO[__^L!`%#C!0``&@(@H..H-P'C`R"' -MYP0@H.,0.P'C`R"'YP8`H.$%$*#A#""-X@@PC>+^___K`0!0XP4``!H"(*#C -MJ#,%\9^7,0``ZD0[``!@ -M.P``S#L``+0[``#,.P``S#L``,P[``!\.P``S#L``,P[``#,.P``S#L``,P[ -M``#,.P``S#L``)@[````(*#C!#@!XP,@A^,#((?G`""@XQ0[`>,#((?G$P``Z@(@H.,$.`'C`R"'YP0@H.,4.P'C -M`R"'YPP``.H$(*#C!#@!XP,@A^<&(*#C%#L!XP,@A^<%``#J!2"@XP0X`>,# -M((?G`""@XQ0[`>,#((?G"%"=Y0%01>(/`%7C!?&?ES(``.H@/```/#P``*P\ -M``"0/```K#P``*P\``"L/```6#P``*P\``"L/```K#P``*P\``"L/```K#P` -M`*P\``!T/````""@XZPW`>,#((?G`2"@XQ0[`>,#((?G3P``Z@$@H..L-P'C -M`R"'YP`@H.,4.P'C`R"'YT@``.H"(*#CK#,#((?G!B"@XQ0[`>,#((?G.@``Z@4@H..L-P'C`R"'YP`@ -MH.,4.P'C`R"'YS,``.H`(*#C^#@!XP,@Q^<`,`#C`#!`XY@PD^4$,(WE,@`` -MZ@6`H.$%H(;@`##:Y=T`4^,:```:`@"%X@``AN`$$(WB!""@X_[__^L!`%#C -M$P``&K``G^7^___K"H"@X0$@VN4"((+B`@Q2XP(LH*/\.@'C`R"'YV,-A^(Y -M`(#B"A"@X?[__^OX.`'C`2"@XP,@Q^=T`)_E_O__ZP!`H.,5``#J"("&X`DP -MV.<",(/B`U"%X'50_^8%`%3AV/__B@!`H.,,``#J!`"@X130C>+PC[WH`""@ -MX_@X`>,#(,?G`#``XP`P0..8,)/E!#"-Y0!0H.,!D*#CR?__Z@8`H.$+$*#A -M_O__Z^[__^J`#P``C`\``!!`+>G@`I#E`Q"@X;0@TN$%___K$("]Z/!%+>D, -MT$WB`E"@X0`PH.,$,(WEX&*0Y;(PS>$!,,WE;#"6Y0$`$^,"```:0``3XP`` -MX`-9```*5#&6Y5D/AN(M$*#C!""-X@PP0^+^___K`'!0XA````H$0)WE``!4 -MXPT```H'0*#A`@"-X@40A^("(*#C_O__ZP(P].4!(-3E`C2#X=.`X.=@`!/C -M`*"@`P&@H!,!<*#C`@``Z@!PH.,'H*#A!X"@X4`QUN4!($/B5!,=+E`2""X@$0 -M0^)Q$._F_0!1X_7__YH!`%?C(P``&@8`H.$3$*#C`2"-XA0U`^,/X*#A`_"6 -MYP%`W>4#`%3C"0``&@``6.,#```*``!:XY:@H!.'H*`##0``Z@``6N-(H*`3 -M0:"@`PD``.H``%CC!```"@XQ`.,``%KC`Z"@`4NOH!,"``#J``!:XY"@H!." -MH*`#BJ"@X2`Q"N,',$#CDPH#X``PA>4``*#C!```ZB`Q"N,',$#CDP0#X``P -MA>4``*#C#-"-XO"%O>AP0"WI(-!-XN!BD.4`0)+E!.#2Y0W`H.$P,9_E#P"3 -MZ`<`K.@`,,SE`0!TXS````JD0J#AQ3H%XWPZ0..3)(/@HS.@X6X`4^,%4*`# -M*0``"@\``(HW`%/C`E"@`R4```H%``"*"@!3XP!0H`,A```*%`!3XQX``!H5 -M``#J/`!3XP-0H`,;```*6@!3XQ@``!H1``#J\`!3XPA0H`,5```*!0``BG@` -M4^,&4*`#$0``"K0`4^,.```:"0``ZEH/4^,)4*`#"P``"AX.4^,(```:!0`` -MZ@%0H.,&``#J!%"@XP0``.H'4*#C`@``Z@I0H.,```#J"U"@XP!`H.,-`*#A -M$!"-X@#`X.,$,-#G!0!3X03`P1<"```:!##!YP``7N,"```*`4"$X@T`5./U -M__\:!@"@X1`0C>+^___K`0!0XP``H`,``.`3(-"-XG"`O>B<````\$`MZ0S0 -M3>("8*#AX$*0Y0`PH.,$,(WE;#"4Y4$`$^-/```*5#&4Y5D/A.(M$*#C!""- -MX@PP0^+^___K``!0XP!PH`,"```*!%"=Y0!P5>(!<*`3!5V$X@4`H.'^___K -M`0!0XPT``!H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^___K.P``Z@8`H.$0 -M$*#C`"``XP`@0./^___K-0``Z@4`H.'^___K`0!0XPT``!H!`%?C!0``&@8` -MH.$0$*#C`"``XP`@0./^___K*0``Z@8`H.$0$*#C`"``XP`@0./^___K(P`` -MZB@QE.4.`%/C#0``F@$`5^,%```:!@"@X1`0H.,`(`#C`"!`X_[__^L8``#J -M!@"@X1`0H.,`(`#C`"!`X_[__^L2``#J`0!7XP4``!H&`*#A$!"@XP`@`.,` -M($#C_O__ZPH``.H&`*#A$!"@XP`@`.,`($#C_O__ZP0``.H"`*#A$!"@XP`@ -M`.,`($#C_O__ZP``H.,,T(WB\("]Z/A/+>D#8*#AX$*0Y8X_H..T,,+A!@"@ -MX0`0H.,#(*#A_O__ZT`[!.-,,$#C`#"&Y60PH.,L,,;E+3#&Y2XPQN4',*#C -M+S#&Y5P@H.,P(,;E32#@XS$@QN4`4*#C,E#&Y3,PQN4$,*#C-##&Y0`P`.,` -M,$#C`'"3Y3APAN4$<)/E/'"&Y0APD^5`<(;E#'"3Y41PAN4!/*#CP#"&Y2HY -M`./$,(;EO%W&X18PH.,8,<;E$#"@XQDQQN4%<*#A"J"@XP20H..@M@CC`;!` -MXZ0WU.4``%/C"@``"B:`A^*(@8;@"C#(YZ0'U.7^___KFP``X`D`B./K__\:$SZ@X[-PAN$R -M<<;E#S"@XS0RAN4_,*#C#S#&Y0``H./XC[WH<$`MZ0)0H.'@0I#E;#"4Y0$` -M$^,*```**`&4Y?[__^N@-@CC`3!`XY,``^``,(7E`3"@X[0PQ>$H,93E!C#% -MY0D``.J>!]3E_O__ZZ`V".,!,$#CDP`#X``PA>4!,*#CM##%X9XWU.4&,,7E -M``"@XW"`O>CP3RWIQ=]-X@*PH.$#0*#A`#"@X_0RC>4"+(WBLCO"X14["./_ -M/T_COC_"X0$PH.,#+(WBL##"X0,,C>("`(#B(!"+X@8@H./^___K%&"$XC@S -MG>4&`%/A"P``FC%>C>(4(*#CM"%EX00`H.$%$*#A!""@X_[__^L$`(3B!!"% -MXA`@H./^___K!D"@X2@`B^+^___K``!0XR````H;.PCC_S]/XP(LC>*^/\+A -M`3"@XP,LC>*V,,+AN'+;X2``5^,@<*`CM'#"X0APA^('4(3@.#.=Y04`4^$0 -M``":,6Z-XK1Q9N$$<*#C!`"@X080H.$'(*#A_O__ZP<`A.`($(;B!R"@X?[_ -M_^L(`(3B+!"+X@,\C>*T(-/A_O__ZP```.H$4*#AI""+XA@@C>64,)OE`@"@ -MX2T0H..]+XWB##!#XO[__^L`8%#B%```"O1"G>4``%3C$0``"@9`H.$K#HWB -M`@"`X@40AN("(*#C_O__ZP(P].4!(-3E`C2#X=,@X.4!.PCC_S]/XP(L -MC>*^/\+A@$"+X@0`H.'^___K`0!0XPX``!H,,)WE`0!3XP4``!H##(WB$!"@ -MXP`@`.,`($#C_O__ZS@``.H##(WB$!"@XP`@`.,`($#C_O__ZS(``.H$`*#A -M_O__ZP$`4.,.```:#""=Y0$`4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^LE -M``#J`PR-XA`0H.,`(`#C`"!`X_[__^L?``#J:#";Y0X`4^,.``":##"=Y0$` -M4^,%```:`PR-XA`0H.,`(`#C`"!`X_[__^L3``#J`PR-XA`0H.,`(`#C`"!` -MX_[__^L-``#J#""=Y0$`4N,%```:`PR-XA`0H.,`(`#C`"!`X_[__^L$``#J -M`PR-XA`0H.,`(`#C`"!`X_[__^L48(7B.#.=Y08`4^$+``":,4Z-XA0@H..T -M(63A!0"@X000H.$$(*#C_O__ZP0`A>($$(3B$""@X_[__^L&4*#A!SL(X_\_ -M3^,"+(WBOC_"X9@PB^((,(WE`P"@X?[__^L`$*#AO@^-X@(`@.("(*#C_O__ -MZP(LC>*Z/]+A`P`3XQ4```H!`!/C`S"@$P`SC14!,*`#`#.-!0B@A>(X,YWE -M"@!3X0P``)HQ3HWB"""@X[0A9.$$8*#C!0"@X000H.$&(*#A_O__ZP8`A>`& -M$(3@!B"@X?[__^L```#J!:"@X6@PF^4``%/C`3"@`V@PBP4%.PCC_S]/XP(L -MC>*^/\+A:`";Y?[__^N@-@CC`3!`XY,``^``,XWE`3"@XP,LC>*T,,+A:#"; -MY08SS>4,4(KB.#.=Y04`4^$+``":,4Z-X@P@H..T(63A"@"@X000H.$$(*#C -M_O__ZP0`BN($$(3B"""@X_[__^L%H*#A*SL(X_\_3^,"+(WBOC_"X;I/TN$0 -M`!3C`CN@$P,LC1*V,,(1`CF@`P,LC0*V,,(!`#"@XP,LC>*T,,+A"%"*XC@S -MG>4%`%/A$0``FC%.C>(((*#CM"%DX01@H.,*`*#A!!"@X08@H.'^___K!@"* -MX`@0A.(&(*#A_O__ZP4`H.$L$(OB`SR-XK0@T^'^___K!:"@X:V/C>((`*#A -M0!"@XP`@`.,`($#C_O__ZX`@V^4``%+C`'"@`R,```JM3XWB`$"$X`M0H.$` -M<*#C0("(X@`P`.,`,$#C%#"-Y0`P`.,#8*#A`&!`XP"0`.,`D$#C'*"-Y2"P -MC>44L)WE!J"@X7]@`N('`%;A!G"@(0@09."F,*#A`0`2XPH@H`$+(*`1`""- -MY00`H.$)(*#A_O__ZX$@U>4!4(7B``!2XP!`A!#N__\:'*"=Y2"PG>4,()WE -M`0!2XS$``!H"/(WBLAO3X0()$>,,```*)""=Y0``4N,$```*#G$`XQ`PG>4` -M`%/C2W^@$R0``.H0()WE``!2XY!PH!."<*`#'P``ZH``$>,*```*)#"=Y0`` -M4^,#```*$""=Y0``4N,6```:$0``ZA`PG>4``%/C$```&@L``.JX!9_E_O__ -MZR0@G>4``%+C`P``"A`PG>4``%/C"0``&@0``.H0()WE``!2XP,``!I!<*#C -M!```ZH=PH.,"``#J2'"@XP```.J6<*#CAW"@X2$["./_/T_C`BR-XKX_PN$` -M,*#C!3/-Y00SS>4@,0KC!S!`XY,'`^``,XWE#%"*XC@SG>4%`%/A"P``FC%. -MC>(,(*#CM"%DX0H`H.$$$*#A!""@X_[__^L$`(KB!!"$X@@@H./^___K!:"@ -MX0`PH.,"+(WBL#O"X;PZPN&4$)OE2S^-X@`PC>4K/HWB!#"-Y0@`G>4L((WB -MJS^-XO[__^L"/(WBL$O3X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L` -M,`#C`#!`XP,`D^@#`(3H`BR-XK!+TN$``%3C$```"B-NC>(#8(;B`$"@XP!P -M`.,`<$#C2X^-X@10H.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("/(WBL$O3 -MX04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB -M_O__ZW``_^8#/(WBM`##X0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$ -M4*#C"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^-X@,\ -MC>*T(-/A_O__ZP:@H.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_" -MX;!;TN$#/(WBM%##X0A0A>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$4*#C -M"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KB2Q^-X@,\C>*T -M(-/A_O__ZP:@H.$"+(WBO$K2X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[_ -M_^L`,`#C`#!`XP,`D^@#`(3H`CR-XKQ*T^$``%3C$```"B-NC>(#8(;B`$"@ -MXP!P`.,`<$#C+("-X@10H.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("+(WB -MO$K2X04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+ -M#XWB_O__ZW``_^8#/(WBM`##X0A0@.(%8(K@.".=Y08`4N$0``":,4Z-XK11 -M9.$$4*#C"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KBBQ^- -MX@,\C>*T(-/A_O__ZP:@H.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WB -MOC_"X;Q:TN$#/(WBM%##X0A0A>(%8(K@.".=Y08`4N$0``":,4Z-XK119.$$ -M4*#C"@"@X000H.$%(*#A_O__ZP4`BN`($(3B!2"@X?[__^L(`(KB+!"-X@,\ -MC>*T(-/A_O__ZP:@H.$`,*#CK#*-Y91PF^4,<%?B.0``"@-`H.&KCXWB!2P( -MX_\O3^,,((WEOS^-X@@P@^(0,(WE`9"@XP10H.$4L(WE!["@X1APG>4%8(?@ -M!@"@X0@0H.'^___K``!0XQ\```JL0IWE`@!4XQP``)H,()WE`CR-XKXOP^&\ -M.M/A`RR-XK0PPN$(,(/B"#"-Y0-`BN`X,YWE!`!3X1```)H(()WE`CR-XKPO -MP^$*`*#AOQ^-X@0@H./^___K!`"*XA`0G>4$(*#C_O__ZP@`BN(&$*#A`SR- -MXK0@T^'^___K!*"@X04PA^`),-/G`C"#X@-0A>`%`%OAT___BA2PG>4!/`CC -M_S]/XP(LC>*^/\+A2S"@XP,SS>54,)OE``!3XU`PVP54,(L%5##;Y8,@@^!0 -M,-OE`R""X$(AH.$!(\WE5#"+Y9`PV^4`,\WE8S#@XP(SS>4(8(KB.#.=Y08` -M4^$,``":,4Z-X@@@H..T(63A!%"@XPH`H.$$$*#A!2"@X?[__^L%`(K@!1"$ -MX`4@H.'^___K!J"@X0H`H.'%WXWB\(^]Z%P0``#P3RWI'-!-XA00C>4,((WE -M$#"-Y>"2D.6T<-+A!W"#X+`R`^,#,-GG``!3XP0```J$-0/C`S"9YP``4^,5 -M0.`3-@``&O[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^6$@(GBA$"9Y7J^ -MB>($L(OB$&"=Y?^B`.,(`*#A!!"@X?[__^L!`%#C%@``"@6T8,+A`#"@X[8P -MPN$$`*#A'-"-XO"/O>AP0"WIX%*0Y0!`4^(/```*L##4X0``4^,#```*`0!3 -MXUY`X!,,```:!```Z@4`H.'^___K``!0XP0```H%``#J!0"@X?[__^L``%#C -M`0``&@!`X.,```#J`$"@XP0`H.%P@+WH,$`MZ1303>(`4*#A#4"@X0T`H.$` -M$*#C$""@X_[__^L!,*#CL##-X0(`C>(`$*#C!B"@X_[__^N\-0/C`P"5YQ4; -M".,-(*#A`#"@X_[__^L4T(WB,("]Z#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@ -MXQ`@H./^___K`3"@X[`PS>$"`(WBX!"%X@8@H./^___KO#4#XP,`E><5&PCC -M#2"@X0`PH./^___K%-"-XC"`O>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0 -M(*#C_O__Z[PU`^,#`)7G&1L(XPT@H.$`,*#C_O__ZQ30C>(P@+WH\$]Z*P````00"WI!2!"XG(@[^8(`%+C`$"@@P#``),`P$"3 -M`B",D,1`TI4$(*#AMO__ZQ"`O>AP0"WI"-!-X@%@H.$"4*#A`!``XP`00./0 -M,)'E!#"-Y>!"D.4```#C``!`X]00@>+^___K;#"4Y1``$^,50.`#(@``"@Y0 -M1>)P!Y3E``!0XP,```I\%Y3E_O__ZP`PH.-P-X3E``!5XP!`H-,7``#:!0"@ -MX?[__^MP!X3E?%>$Y0``4.,%```:3`"?Y4P0G^51*@'C_O__ZQ5`X.,+``#J -M#A"&X@4@H.'^___K!`"@X=T0H.,$((WB`3"@X_[__^L!(*#C2SV@XP,@Q.<` -M0*#C!`"@X0C0C>)P@+WHI!```-0```#P3RWI3-!-X@!@H.$!<*#A`$"@X>`B -MM.69-0/C`S#2YP``4^,`0.`#^P0`"@`PD>4``%/C%4#@`_<$``JT`-'A_O__ -MZQ``C>4`@*#A``!0XPM`X`/P!``*`!"7Y;20U^$-(*#A?SW"XS\PP^,(H)/E -M"5"1X`I0U3``H*`S``!:XP0``!H)(*#A_O__ZP``4.,$```:"```Z@``6>,& -M```*"1"@X?[__^L0`)WEM!#7X?[__^L-0.#CUP0`ZL@/G^7('Y_E`""8Y?[_ -M_^L`$)CE`3!!XA(`4^,#\9^7M`0`ZIQ5``#$50``U%8``"1H```49@``G%T` -M`"1H```D:```)&@``"1H```D:```)&@``"1H```D:```)&@``'!7``#<9@`` -M]&8``(QG````0)3E7`^?Y5P?G^7^___K!`"@X?[__^L$`*#A_O__ZP!`H.&; -M!`#J`%"4Y;P0V.$$(-CE!3#8Y08`V.4``(WE!P#8Y00`C>4(`-CE"`"-Y0D` -MV.4,`(WE$`^?Y?[__^ML,)7E$0`3XS````H$,)CE`0!SXP,``!JX(-CA`3B# -MX@,`4N$I```*5PV%XA@`@.($$(CB_O__ZP!`4.(+0.`#?`0`"A!@F.6\,-CA -MU#"$Y1,.A.(4$(CB$""@X_[__^L"#!;C`3"@$]PPA!4`,*`#W#"$!<0TE>4` -M`%/CW#"$!0(+%N,`,*`#^#6$!0<```H!,*#C^#6$Y=PPA.5A#H3B`P"`X"00 -MB.(:(*#C_O__Z]`TE>4``%/C^#6$!04`H.$$$*#A_O__ZP!`H.-9!`#J%4#@ -MXU<$`.H`4)3E!!#8Y04@V.4&,-CE!P#8Y0``C>4(`-CE!`"-Y0D`V.4(`(WE -M#`Z?Y?[__^ML,)7E$0`3XQ4```H$,)CE`0!SXP,``!JX(-CA`3B#X@,`4N$. -M```*5PV%XA@`@.($$(CB_O__ZP!`4.($```*!0"@X000H.'^___K`$"@XS8$ -M`.JT#9_E_O__ZP!`H.,R!`#J%4#@XS`$`.JT8-?A`#"@XT`PC>64/9_E%"&3 -MY30@C>4L((WB1A^#X@,`D>@$`(+DL!#"X0!0E.7,#9_E$AZ#X@8@H.'^___K -M;#"5Y1``$^-U`0`*H$`,$(CB`B"@X_[__^NT,)7A`3!#XG,P_^8? -M`%/C!#"@@2`@H(.S((6!#F!&XE1AA>4##%;C"T#@@PP$`(I63X7B!`"@X0`0 -MH.,#+*#C_O__ZP0`H.$.$(CB5"&5Y?[__^L\,97E!`!3XU@!`!H`D*#C$)&% -MY>``A>++'87B'1"!X@8@H./^___K!`"@X?[__^L!(-#E`##0Y0(T@^$@,87E -M`2#4Y5@QU>4"-(/A%#"-Y0Q@A.)`H(WB5#&5Y08`H.$)$*#A"B"@X0PP0^+^ -M___K`)!0X@P```I`0)WE``!4XPD```KH`(7B`!"@XR0@H./^___K[`"%X@(0 -MB>)`()WE_O__ZT!`G>7H0(7E`#"@XQPQA>54,97E!@"@X0,0H.,*(*#A##!# -MXO[__^L`D%#B`P``"D!`G>4``%3C`K#9%0```!H`L*#C*+&%Y1P`C>(`$*#C -M$""@X_[__^M4,97E!@"@X0$0H.,*(*#A##!#XO[__^L`0%#B`)"@`P0```H< -M`(WB`A"$XD`@G>7^___K0)"=Y50QE>4&`*#A,A"@XPH@H.$,,$/B_O__ZP!` -M4.(&```*'`"-X@D`@.`"$(3B0""=Y?[__^M`0)WE!)")X!P`C>()$*#A"R"@ -MX?[__^MPD._F!0V%X@D0H.'^___K5#&5Y08`H.$J$*#C"B"@X0PP0^+^___K -M`+!0X@4```I`0)WE``!4XP(```H%`*#A"Q"@X?[__^M4,97E!@"@X2T0H.,* -M(*#A##!#XO[__^L`L%#B%P``"D!`G>4``%3C%```"@B0B>,%`*#A$Q"@XT<@ -MC>(4-0/C#^"@X0/PE>='0-WE`P!4XP)`BP(`,.`#`S#$!0$P@P($,,0%3@Z% -MX@D`@.("$(OB0""=Y?[__^L!L*#C````Z@"PH.,+`%GC$0``BGE`K^8!,*#C -M$T2@X0P\`.,`,$#C`S`$X```4^,#,*`3&#&%%0D``!H0`!3C`C"@$Q@QA14% -M```:`@`4XP$P@Q(8,845`0``&@,PH.,8,87ER)"%Y10PG>40`!/C`3"@$PPQ -MA14`,*`###&%!0`PH./D*`'C`C"%YSPPC>4X,(WE""""X@(PA><(((+B`C"% -MYU0QE>4&`*#A,!"@XPH@H.$,,$/B_O__ZP!`4.(9```*0!"=Y0``4>,6```* -M!`"@X0(0@>(\((WB.#"-XO[__^L!`%#C#P``&@(@H..H-P'C`R"%YP$@H.-. -M/X/B`R"%YP0P@^(#()7G`B""XP,@A><\0)WE"#"#X@-`A><`,*#C0#"-Y3PPC>4X,(WEZ"@!XP(PA><(((+B`C"%YP9`H.'=D*#C5#&5 -MY0XP0^($`*#A"1"@X0H@H.%`0)WE`S!DX/[__^L`0%#B(0``"@(`A.(T$(WB -M!""@X_[__^L``%#C)P,`"@0`H.%`0)WE`A"$XCP@C>(X,(WB_O__ZP$`4.,3 -M```:`B"@XZ@W`>,#((7G`2"@XTX_@^(#((7G!#"#X@,@E>4$,(/B`T"%YSA`G>4(,(/B`T"%YP(``.H",(/B`T"$X-/__^H`,*#C0#"- -MY<0TA>5:.@+C`S#5YP``4^,:```*W9"@XU0QE>4.,$/B!@"@X0D0H.$*(*#A -M0$"=Y0,P9.#^___K`$!0X@\```H"`(3B+!"-X@8@H./^___K``!0X_<"``H! -M,*#CQ#2%Y0@P].6#/.#AHSS@X0`PQ.4"``#J`C"#X@-@A.#E___J`#"@X]`T -MA>7@/0+C`S#5YP``4^,`L*`#`;`+$@``6^,&```*`3"@X]`TA>7$-(7EXCT" -MXP,PU>5X,(/B!1"@X=PPH>4%`*#A_O__ZU=MA>(88(;B -MX$"%X@8`H.$$$*#A_O__ZP``4.,$```:!@"@X000H.'^___K``!0XP4```H% -M`*#A_O__ZP$PH./8,(7E`$"@XZ<"`.H50.#CI0(`ZK10U^$`0)3E6`>?Y6P7 -MG^7^___K`#"@XR`PB.4;,,CEOC+8X4`P@^(#`%7AQ`(`&@10H.$$,)CE`0!S -MXP<``!JX(-CA`3B#X@,`4N$#```:)Y0,`5N.Y`@"*"0``ZE<-A>(8`(#B -M!!"(XO[__^L`8%#BJ`(`&@0'G^7^___K`$"@XX,"`.H,0(CB!`"@X?`6G^7^ -M___K``!0XP0``!KD!I_E!A"@X?[__^L`0*#C>`(`Z@0`H.$H%Y_E_O__ZP$` -M<.(``*`S``!0XP!@H`,!,*`#9```"K`&G^7^___K)Y;ZBV.&D!I_E!A"@ -MX0H@H.'^___K`3!ZX@`PH#,#`%;C`3"#@P``4^.,`@`:``!:XP!`H`,1```* -M!0!:XP6@H),-H*"##)"*X@D`H.'^___K`$!0X@,``!I4!I_E_O__ZP!`H.-2 -M`@#J!`"@X0`0H.,<(*#C_O__ZPB@A.4`D(3E!&"$Y0R0A.()`*#A,!"(X@@@ -ME.7^___K'##8Y0``4^,D```*#`:?Y?[__^L`(*#C%#L!XP,@A>=8((+B`C"%YP@PE.4-`%/C!3"@`U@@0@(",(4'6"""`@(PA0>P-P'C -M`V"%YUX_AN(#,(/B`S*%X`0`@^()$*#A"""4Y?[__^M?/H;B##"#X@,QA>`( -M()3E!""#Y04`H.$,$(3B""#4Y08PH.'I_/_KCP$`ZGP%G^7^___K7C^&X@,P -M@^(#,H7@!`"#X@D0H.$(()3E_O__ZU\^AN(,,(/B`S&%X`@@E.4$((/E!0"@ -MX0P0A.(((-3E!C"@X=7\_^M[`0#J``!3XWH```IL,)7E$``3XW<```H<,-CE -M`0!3XRL"`!H``%#C%```"@@%G^7@%)_E_O__ZR0`V.4``H7@OB+8X08+@.(, -M`(#B,!"(XA``4N,0(*`C_O__ZP$@H.,$.`'C`R"%Y[XRV.$-`%/C!"""`@0X -M`0,#((4'1```Z@0`H.&T%)_E_O__ZP``4.,D```:J`2?Y7@4G^7^___K`B"@ -MXP0X`>,#((7G)`#8Y0`"A>`P0(CBOB+8X08+@.(,`(#B!!"@X1``4N,0(*`C -M_O__ZR0`V.4*`(#BJ&`$`(#B&!"$X@@@H./^___K`2"@XP$[`>,#(,7G&@``Z@0` -MH.$4%)_E_O__ZP``4.,/```:"`2?Y=`3G^7^___K!""@XP0X`>,#((7G)`#8 -MY0`"A>"^(MCA!@N`X@P`@.(P$(CB$`!2XQ`@H"/^___K!0``ZLP#G^60$Y_E -M_O__ZP`@H.,$.`'C`R"%YR0@V.4(.`'C`R"%YP$@H..^/X/B`R#%Y[\_0^(# -M()7G6#!#X@,@A><%`*#A,!"(XG(@[^8D,-CE(_S_ZP4`H.'^___K`&!0XKP! -M``H`0*#CZ$"&Y00X`>,#,)7G[#"&Y8T!`.JH-P'C`S"5YP(`4^,`,*`3`3"@ -M`P``5N,`,*`#``!3XZT!``IL,)7E$``3XZH!``H<,-CE`0!3XV,``!HPH(CB -MOB+8X1$.AN(*$*#A$`!2XQ`@H"/^___K!`"@X203G^7^___K``!0XPD``!KH -M`I_EJ!*?Y?[__^L!,*#C[#"&Y;XRV.$-`%/C!3"@`^PPA@4E``#J!`"@X:@2 -MG^7^___K``!0XQ```!JP`I_E;!*?Y?[__^L",*#C[#"&Y?``AN(0$(KB"""@ -MX_[__^L!#(;B&!"*X@@@H./^___K`2"@XP$[`>,#(,7G#P``Z@0`H.%8$I_E -M_O__ZP``4.,%```:7`*?Y102G^7^___K!#"@X^PPAN4$``#J2`*?Y?P1G^7^ -M___K`#"@X^PPAN4<`*#C_O__ZP"0H.$``%#C'P``"A<`H./^___K`*!0X@,` -M`!H)`*#A'!"@X_[__^L7``#J%`")XO[__^L5(*#CL"#)X02@B>47,*#C"#") -MY0`PH.,,,(GE$#")Y>PPEN4&,,KE"@"@X>`0AN(&(*#C_O__ZP<`BN(1'H;B -M$""@X_[__^M+#87B"`"`X@D0H.'^___K`$"@X^A`AN4:`0#J``!0XQ$```HD -M`-CE``*%X+XBV.$&"X#B#`"`XC`0B.(0`%+C$""@(_[__^L!(*#C!#@!XP,@ -MA>>^,MCA#0!3XP0@@@($.`$#`R"%!UX``.H$`*#A(!&?Y?[__^L``%#C(0`` -M&@(@H.,$.`'C`R"%YR0`V.4``H7@,$"(XKXBV.$&"X#B#`"`X@00H.$0`%+C -M$""@(_[__^LD`-CE"@"`XJAG`>,``H;@``"%X`0`@.(0$(3B"""@X_[__^LD -M`-CE#@"`X@`"AN```(7@!`"`XA@0A.(((*#C_O__ZP$@H.,!.P'C`R#%YS<` -M`.H$`*#AC!"?Y?[__^L``%#C+P``&@0@H.,$.`'C`R"%YR0`V.4``H7@OB+8 -MX08+@.(,`(#B,!"(XA``4N,0(*`C_O__ZR4``.K$$```Z````/`!``#\```` -MT!````01```P$0```````#`!``!T$0``1`\``+P1``#H$0``$!(``$`2```D -M#P``-`\``'`2``!,#P``B!(``%0/``"D$@``P!(``-P2``#X$@``%!,``#`3 -M``!,$P``B!,``$0!``"8$```I!```%P!``"@$P``Y`X````@H.,$.`'C`R"% -MYR0@V.4(.`'C`R"%YP$@H..^/X/B`R#%Y[\_0^(#()7G6#!#X@,@A><%`*#A -M,!"(XG(@[^8D,-CE)/O_ZP4`H.'^___K`&!0XKT```H`0*#CZ$"&Y00X`>,# -M,)7G[#"&Y8X``.H``%3CC```"@0`H.$,$(KB_O__ZP!`H..'``#J`$"4Y000 -MV.4%(-CE!C#8Y0<`V.4``(WE"`#8Y00`C>4)`-CE"`"-Y=P`'^7^___K;#"4 -MY1$`$^,@```*!#"8Y0$`<^,#```:N"#8X0$X@^(#`%+A&0``"E<-A.(8`(#B -M!!"(XO[__^L`0%#B`$#@`VH```KH-M3EW0!3XS``4Q,*```:Z2;4Y0(@@N(@ -M`%+C(""@(PP@B.40`(CB;AZ$X@@0@>+^___K`$"@XUL``.I@`1_E_O__ZP!` -MH.-7``#J%4#@XU4``.H&`*#A"!"@X;0@U^$G^__K`$"@X4\``.JT4-?A`$"4 -MY9`!'^68$1_E!2"@X?[__^ML,)3E$``3XQ5`X`-%```*#E!%XG0'E.4``%#C -M`P``"H`7E.7^___K`#"@XW0WA.4``%7C`$"@TSH``-H%`*#A_O__ZW0'A.6` -M5X3E``!0XP4``!KP`1_E_!$?Y7PJ`>/^___K%4#@XRX``.H.$(CB!2"@X?[_ -M_^L`0*#C*0``ZK10U^$`0)3E*`(?Y202'^4%(*#A_O__ZVPPE.40`!/C%4#@ -M`Q\```H.4$7B>`>4Y0``4.,#```*A!>4Y?[__^L`,*#C>#>$Y0``5>,`0*#3 -M%```V@4`H.'^___K>`>$Y817A.4``%#C!0``&H@"'^6($A_EH2H!X_[__^L5 -M0.#C"```Z@X0B.(%(*#A_O__ZP!`H.,#``#JK`(?Y?[__^M>0.#C$@``Z@`` -M5.,0```:``"7Y;1@U^$-(*#A?SW"XS\PP^,(H)/E!E"0X`I0U3``H*`S``!: -MXP,``!H($*#A!B"@X?[__^L`8*#A``!6XPU`X!,0`)WEM!#7X?[__^L$`*#A -M3-"-XO"/O>A`,)WE``!3X^W\_QKO_/_J0#"=Y0``4^,+_?\:#?W_Z@Q`B.($ -M`*#A1!,?Y?[__^L!`'#B``"@,P`PH./+_?_J`$"@X]3__^H50.#CTO__ZO!' -M+>D`8*#A`4"@X?P[".,#`%+AG@``"OX[".,#`%+A7F#@$YT``!JT`='A/P!0 -MXY4``)H0,)'E``!3XY(```K^___K`("@X0"0H.$``%#C"V#@`Y$```H0$)3E -MM*'4X0T@H.%_/<+C/S##XPAPD^4*4)'@!U#5,`!PH#,``%?C!```&@H@H.'^ -M___K``!0XPD```H#``#J``!:XP8```H*$*#A_O__ZP@`H.&T$=3A_O__ZPU@ -MX.-X``#J`!"9Y0$P0>(#`%/C`_&?EU(``.K(:0``@&H``)AJ``"P:@``$!"9 -MY>!2EN4,,-GE!P!3XP@``(K<,-GA`2"@XQ(SH.'<`!/C(0``&B``$^,;```: -M`@`3XP$``!I>8.#C0P``Z@(@H..H-P'C`R"%Y_\0`>(!`%'C`@``"@(`4>$3 -M```:!@``Z@0PH.,0*P'C`C"%YQ0K`>,",(7G`&"@XS,``.H'(*#C$#L!XP,@ -MA><&(*#C%#L!XP,@A><`8*#C*P``Z@8`H.%)YO_K`&"@X2<``.H`8*#C)0`` -MZN`"EN4P$(GBO"#9X=7S_^L`8*#A'P``Z@8`H.$)$*#AM"'4X3WR_^L`8*#A -M&0``ZN!2EN4,,)GE`0!3XP,```H"`%/C7F#@$Q(``!H$``#J!0"@X?[__^L` -M`%#C!```&@4``.H%`*#A_O__ZP``4.,!```*`&"@XP8``.H`8.#C!```Z@`` -M`.,``$#C_O__ZUY@X.,2``#J``!6XQ```!H0`)3EM*'4X0T@H.%_/<+C/S## -MXPAPD^4*4)#@!U#5,`!PH#,``%?C`P``&@D0H.$*(*#A_O__ZP"@H.$``%KC -M#6#@$P@`H.&T$=3A_O__ZP0``.H58.#C`@``ZA`0@>(Z^O_K`&"@X08`H.'P -MA[WH$$`MZ0!``.,`0$#C`#"@XQ0PA.5D`*#C_O__ZQ1`E.4"`%3C`0``&@P` -MG^7^___K!`"?Y?[__^L0@+WH&````'!`+>D`0`#C`$!`XQA0A.(%`*#A`!"@ -MXP`@`.,`($#C_O__ZP4`H.'^___K`C"@XQ0PA.5P@+WH$$`MZ6`R`^,#,)#G -M_S3#X_\PP^,!"%/C(P``"E0R`^,#,-#G``!3XR$```IA,@/C`S#0YP$`4^,# -M```:2#8#XP,PD.("4*#A`V"@X>!"D.4$`*#A_O__ZP``4.,$```:D`&?Y9`1G^7^ -M___K`$#@XUT``.K$-0/C`S"4YP``4^,$```:=`&?Y6P1G^7^___K`$#@XU0` -M`.JT@-7A(`!8XP0``)I8`9_E3!&?Y?[__^L&0.#C3```ZFPPE.40`!/C!``` -M"CP!G^4L$9_E_O__ZP!`X.-$``#J$#L!XP.@E.>V,-7A``!3XSX```H``%CC -M/```"B``6.,@@*`C!%"-X@4`H.$`$*#C)""@X_[__^LH<(WB)(`GY00`A>(& -M$*#A"""@X?[__^N$8(3BA#"4Y7@PA.4$<(?B!@"@X7@0E.7^___K`0!0XQT` -M``IX4)3E!0"@X2PPD.1X,(3E!Q"@X00@G>7^___K`0!0X_'__QHH()7E!#"= -MY0,`4N'M__\:;#"4Y2``$^,#```*?""5Y3PQE.4#`%+AYO__&@0`H.%\$)7E -M_O__ZP``4.,$```:5`"?Y4`0G^7^___K`$#@XPD``.H$`*#A"A"@X?[__^L$ -M`*#A!!"-XO[__^L``%#C`$#@`P````H`0*#C!`"@X2S0C>+PA;WH_!,``'0! -M```8%```-!0``%@4``"$%```\$\MZ2S03>("4*#A`V"@X>!"D.4$`*#A_O__ -MZP``4..9```*A#4#XP,0E.<``%'C`P``"F`"G^7^___K`$#@XY(``.K$-0/C -M`S"4YP``4^.-```*F34#XP,PU.<``%/CB0``"A`UU.4!`%/C`P``&@0`H.'^ -M___K`$"@XX,``.IL,)3E(@T3XP,```H$`*#A_O__ZP!`H.-\``#JM##5X4\/ -M4^,K```:MC#5X0(`$^,A```*`7#6Y2``5^,@<*"C!("-X@@`H.$`$*#C)""@ -MX_[__^L44(;B!`"(X@40H.$'(*#A_O__ZP1PC>6L`9_E!1"@X0$@UN7^___K -M_O__ZPTPH.%_74!,(/B!#"%Y00`H.$($*#A_O__ZP!`H.$$ -M,)7E`3!#X@0PA>7^___K4```Z@`PUN4!`%/C4```&E0!G^7^___K`$#@XTT` -M`.H+`%/C1```F@8`H.$\$9_E#""@X_[__^L!`%#C/@``&K1PU>$,<$?B#&"& -MX@0`C>(`$*#C)""@X_[__^L0H9_E"("-X@R1G^4,L9_E(```Z@8`H.$`$`#C -M`!!`XP,@C>+^___K`U#=Y5,`5>,:```:`6"&X@H`H.'^___K`7!'XL=?Q^$& -M`*#AT!"?Y0(@C>+^___K`6"&X@%01>("(-WE`@!5X0<``+H$((WE"`"@X080 -MH.'^___K"0"@X0L0H.$((*#A_O__ZP)PW>4'8(;@!7!GX```5^/<___*_O__ -MZPTPH.%_74!,(/B!#"%Y00`H.$$$(WB_O__ZP!`H.$$,)7E -M`3!#X@0PA>7^___K`@``Z@0`H.'^___K`$"@X0``5.,`0*`3````&@!`X.,$ -M`*#A+-"-XO"/O>BT%```R!0``/`4``"(`0``,!4``$P5``"8`0``+!4``/!/ -M+>E9WTWB`+"@X1`0C>4"@*#A%#"-Y>"2D.6T8-+A!J"@X08`H.'^___K`%!0 -MX@M`X`."`0`*`!"8Y0T`H.%_/<#C/S##XPAPD^4&0)'@!T#4,`!PH#,``%?C -M!0``&@4`H.$&(*#A_O__ZP``4.,*```*!```Z@``5N,'```*!0"@X080H.'^ -M___K!0"@X0H0H.'^___K#4#@XV@!`.JV(-CA9C<(XP,`4N$`,*`3`3"@`P@` -M5N,`,*#3``!3XQ8```H`,`#C`#!`XZ@QD^4\,(WE`##5Y=T`4^-4`0`:`@"% -MXCP0C>($(*#C_O__ZP$`4.-.`0`:`@Q6XP)LH*,5#8GB"P"`X@40H.$&(*#A -M_O__ZTQGB>4`0*#C10$`Z@L`5N,#``#*``!6XP!`H,,-``#*%0``Z@4`H.$, -M%9_E#""@X_[__^L!`%#C]?__&@L`H.$0$)WE"""@X04PH.'W_O_K`$"@X3(! -M`.H$,-7G82!#XG(@[^89`%+C(#!#D@0PQ9*R$(#A"P"@X0(<".-, -M((WB_O__ZP4`H.$`$`#C`!!`XP,@H./^___KP@``Z@```.,``$#C_O__ZUPP -MC>(`(`#C`"!`XP,`DN@#(*#A!`""Y``0PN7P+@_C_R]/XP00H.,6#HWBLA"` -MX0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`00.,#(*#C_O__ZP`P`.,`,$#C -M%$"3Y0(`5..E```:`T"@X1@`@^+^___K`3"@XQ0PA.6?``#J;#"9Y0$`$^,& -M```*!0"@X0`0`.,`$$#C>C4!X],@F>'^___KE0``Z@4`H.$`$`#C`!!`XP,@ -MH./^___KCP``Z@L`H.$0$)WE+""-XA0PG>4U\O_K``!0XP!`H!,L()T%@SX- -M`QLS1`.3$L,`PB^@`4-)8@`%`*#A`!``XP`00.,$(*#A_O__ZWP``.I`$9OE -M`"#1Y0$PT>4"`-'E``"-Y0,`T>4$`(WE!`#1Y0@`C>4%$-'E#!"-Y04`H.$` -M$`#C`!!`X_[__^ML``#J`3"@XTHUR>4%`*#A`!``XP`00.,#(*#C_O__ZV0` -M`.H`,*#C2C7)Y04`H.$`$`#C`!!`XP,@H./^___K7```ZCQ`C>(%`*#A`!`` -MXP`00.,$(*#A_O__ZP0`H.$`$`#C`!!`X_[__^L``%#C`#"@`T@PC043```* -M/`"-X@`0`.,`$$#C_O__ZP``4.,",*`#2#"-!0L```H\`(WB`!``XP`00./^ -M___K``!0XP4PH`-(,(T%`P``"H0!G^6$$9_E/""-XO[__^L`,`#C`#!`XTA` -MG>4`0,/E'$"-X@0`H.%($(WB!""@X_[__^L+`*#A$!"=Y00@H.$4,)WE[>O_ -MZP``4.,"```*/`&?Y301G^7^___K````XP``0.-($)WE_O__ZP4`H.$`$`#C -M`!!`XP,@H./^___K'0``Z@`P`.,`,$#C`##3Y0``4^,%```*`@!3XPU`H`,# -M```*!0!3XPY`H`,````*"T"@XP4`H.$`$`#C`!!`XP0@H.'^___K`#``XP`P -M0.,```#C``!`XP00H.$`(-/E_O__ZP0``.H%`*#A`!``XP`00.,#(*#C_O__ -MZP"0F.6T0-CA!0"@X?[__^L!<(#B=W#_Y@<`5.$$<*`Q#2"@X7\]PN,_,,/C -M"&"3Y0=`F>`&0-0P`&"@,P``5N,$```:"0"@X040H.$'(*#A_O__ZP!PH.$` -M`%?C#4#@$P```!H`0*#C!0"@X0H0H.'^___K!`"@X5G?C>+PC[WHB`$``#`` -M``"8%0```````%06``"L`0``D"8*#AX$*0Y00`H.'^___K``!0 -MXP0``!KP`)_E\!"?Y?[__^L`0.#C-@``ZL0U`^,#,)3G``!3XR\```JP,-;A -M`0!3XP0```K(`)_EP!"?Y?[__^L50.#C*@``ZA`[`>,#H)3GA'"$XH0PE.5X -M,(3E`F"&X@:`H.,'`*#A>!"4Y?[__^L!`%#C!0``&@0`H.$&$*#A_O__ZP`` -M4.,6```*%P``ZGA0E.4%`*#A(#"0Y'@PA.4&$*#A"""@X?[__^L!`%#CZ___ -M&@0`H.%\$)7E_O__ZP``4.,'```*!`"@X0H0H.'^___K!`"@X080H.'^___K -M``!0XP$``!H`0.#C````Z@!`H.,$`*#A\(>]Z/P3``"\`0``"!<``'!`+>D" -M4*#AX$*0Y00`H.'^___K``!0XP!`H`,?```*F34#XP,PU.<``%/C&@``"@`P -ME>4#`%/C`_&?EP,``.I$>0``/'D``%1Y``!,>0``%4#@XQ$``.H`4*#C!``` -MZ@)0H.,"``#J!%"@XP```.H!4*#C!`"@X040H.'^___K``!0XP0```H$`*#A -M!1"@X?[__^L`0*#C````Z@!`X.,$`*#A<("]Z$!"#P"`A!X`8.Q3`,#8IP"` -MC5L`0%2)```;MP"`J!(!`#9N`0!1)0(`;-P"@/DW`\`5``#P%0``,!<``#@7 -M``!$%P``3!<``%@7``!H%P``%]S971?875T:```4/($"PH)"`<&!00#`@$`_P```'-E=%]G+ -M```!2```9V5T7W-E;G-I=&EV:71Y`.B+```!2```=W!S7W!R;V)?J+```!2```8VAA;FYE;%]P;&%N -M`````.N+```"2```9&)G`````````````````.R+```#2```%T*``!W<&%?"`` -M(#!X)3`X>"``````"@```#!X)3`U>```)7,Z(&EN/25S"@``+````')E86QM -M87``"D*`"5S(`H`````"2`@"4P,G@``"5S(#!X)3`R6````"`````E``*"0``)7,*"0````!M86,`=FED<&ED``!A8FQEF5=(#T@)60`6R5S72!W<'-?```"CT] -M/3T]/3T@0D(@4D5'(#T]/3T]/3T*``````H]/3T]/3T]($U!0R!214<@/3T] -M/3T]/0H```!R='=?"D],'@E>`H```!R='=?"5X*3TP>"5X"@!R96%D7V)B"5X*3TP>"5X"@!R96%D(%)&7W)E9R!P871H*#!X)3`R>"DL -M;V9F"D*`````'=R:71E(%)&7W)E9R!P -M871H*#!X)3`R>"DL;V9F"D*````9G=S -M=&%T93TP>"5X"@```&%U=&A?86QG/3!X)7@L(&5N8U]A;&<],'@E>"P@875T -M:%]T>7!E/3!X)7@L(&5N8U]T>7!E/3!X)7@*`'!M;&UE:6YF;RT^`H``'%O#HE,#)X.B4P,G@Z)3`R>#HE,#)X.B4P,G@*`````')T`H``'1I9#TE9"P@:6YD:6-A=&5?"5X+"!A`H````H02E$349L86<],'@E>`H`8E-U&UI=&)U9E]C;G0] -M)60L(&9R965?>&UI=&9R86UE7V-N=#TE9`H`"5X+"!T:6U?8FET;6%P/3!X)7@*```` -M`'-L965P<5]L96X])60*``!D=6UP(')X('!A8VME="`H)60I"@`````C(R,C -M(R,@2!F=6YC=&EO;@H````@/3T]($1-1FQA9R@P>"4P,G@I(#T]/2`*```` -M97AT6YA;6EC(&9U;F,@"@!E -M>'1R85]A'1R85]A&ES=&5N -M8V4@+2!"250H,RD*````97AT'1R85]A"5X"@!W&,U."D],'@E>`H`"5X"@!D -M8F#8P."D],'@E>`H`````9&)G*#!X -M,C@P*3TP>"5X"@````!D8F#(X."D] -M,'@E>`H`````9&)G*#!X-C8T*3TP>"5X"@````!D8F#0S."D],'@E>`H`````9&)G*#!X-#0P*3TP>"5X"@````!D -M8F#0X-"D],'@E>`H`````9&)G*#!X -M-#@X*3TP>"5X"@````!D8F#0T."D] -M,'@E>`H`````9&)G*#!X-#1C*3TP>"5X"@````!D8F#HE -M,#)X.B4P,G@Z)3`R>`H`````.#%]D2!F;W(@;F]R -M;6%L(&UO9&4L(&-A;B=T(&5N=&5R(&UP(&UO9&4*````/3T^('1R:6=G97(@ -M9W!I;R`P"@!;%]S971?<&UK:61=($E77U!-2U-!7U)%34]612$*```` -M`%MR='=?=WA?2!I;F1E>"`] -M("5D(&9O`H`````16YC#TE9`H``'=E<"P@#TP"@``;F]N90````!42TE0`````$-#35``````)7,N+BYC86QL -M(')T=U]I;F1I8V%T95]D:7-C;VYN96-T"B``4T54(%=04U])10H`4T54(%=0 -M4U])12P@=W!S7W!H87-E/3U?5%)510H```!)145%(#@P,BXQ,6)N````245% -M12`X,#(N,3%B`````$E%144@.#`R+C$Q8F=N``!)145%(#@P,BXQ,6)G```` -M245%12`X,#(N,3%A;@```$E%144@.#`R+C$Q80````!)145%(#@P,BXQ,6=N -M````245%12`X,#(N,3%G`````'5N87-S;V-I871E9``````@4F%T97,@*$UB -M+W,I.B```````"XU```E9"5S(````'=X7V=E=%]S8V%N+"!M8W-?`H``'=P85]I93T`)3`R>`````!R#HE,#)X.B4P -M,G@Z)3`R>`H``')T=U]D96Q?#HE,#)X.B4P,G@Z)3`R -M>#HE,#)X"@``7!T:6]N+"!C%]S971?96YC5]I9'@])60L -M(&QE;CTE9`H````@2P@5T50"@`E2P@5$M)4`H`````)7,L('-E="!G2P@5T50"@``)7,L('-E="!P86ER=VES92!K97DL(%1+25`*`"5S -M+"!S970@<&%I2P@;F]N90H`#HE,#)X.B4P,G@Z)3`R>`H`#HE,#)X.B4P,G@Z)3`R>#HE,#)X.B4P,G@` -M)2IS("5S``!54P``154``$I0```E6UT86(`+G-T0`````````````$`````````!L````)``````````````#(S```&"L```\` -M```!````!`````@````I`````0````,`````````P'D``+P!```````````` -M``0`````````)0````D``````````````.#W``"(`@``#P````,````$```` -M"````"\````(`````P````````"`>P``8```````````````"``````````T -M`````0````(`````````@'L```P```````````````0`````````0P````$` -M`'""`````````(Q[``!0`@```0`````````$`````````#\````)```````` -M``````!H^@``:`(```\````'````!`````@```!.`````0````(````````` -MW'T``,0#``````````````0`````````5@````$````R`````````*"!``"` -M%P`````````````$`````0```&4````!```````````````@F0``$@`````` -M`````````0````````!N`````0``````````````,ID````````````````` -M``$`````````?@````,``'```````````#*9```K```````````````!```` -M`````!$````#``````````````!=F0``C@```````````````0`````````! -M`````@``````````````E)P``+`>```0````=0$```0````0````"0````,` -M`````````````$2[``"!$0`````````````!```````````````````````` -M```````!```````````````$`/'_`````````````````P`!```````````` -M``````,``P`````````````````#``4`#P````````!``````@`!`!D````` -M`````````````0`````````````````#``8``````````````````P`'`!P` -M``!`````"`````(``0`9````0`````````````$`+````$@```!0`````@`! -M`!D```!(`````````````0`\````F````%`````"``$`&0```)@````````` -M```!`!D```#H`````````````0!,````+`$``!P````"``$`&0```"P!```` -M```````!`%L```!(`0``5`````(``0`9````2`$```````````$`:P```)P! -M```<`````@`!`!D```"<`0```````````0![````N`$``!P````"``$`&0`` -M`+@!```````````!`(P```#4`0``&`````(``0`9````U`$```````````$` -MG0```.P!```X`````@`!`!D```#L`0```````````0"M````)`(```@````" -M``$`&0```"0"```````````!`+X````L`@``"`````(``0`9````+`(````` -M``````$`Q````#0"```(`````@`!`!D````T`@```````````0#@````/`(` -M``@````"``$`&0```#P"```````````!`/<```!$`@``"`````(``0`9```` -M1`(```````````$`#0$``$P"```(`````@`!`!D```!,`@```````````0`< -M`0``5`(```@````"``$`&0```%0"```````````!`"@!``!<`@``"`````(` -M`0`9````7`(```````````$`-`$``&0"```(`````@`!`!D```!D`@`````` -M`````0!!`0``;`(```@````"``$`&0```&P"```````````!`$H!``!T`@`` -M@`````(``0`9````=`(```````````$`80$``/0"``"D`````@`!`!D```#T -M`@```````````0!M`0````````````````H`<@$````````````````)`'P! -M```4````````````"@"!`0``F`,``/`````"``$`&0```)@#```````````! -M`),!``"T````````````"@"8`0``V`````````````H`G0$``(`$```````` -M```!`!D```"(!````````````0"@`0``]`````````````H`I0$``"`!```` -M```````*`*H!```T`0``````````"@"P`0``*`$```````````H`G0$``,`% -M```````````!`+4!``#$!0``2`````(``0`9````Q`4```````````$`Q`$` -M`#@!```````````*`,H!```,!@``1`@```(``0`9````#`8```````````$` -MVP$``+@"```````````*`.$!``#``@``````````"@"=`0``P`T````````` -M``$`YP$``%`.``!$`0```@`!`!D```!0#@```````````0"=`0``C`\````` -M``````$`]0$``)0/``"L!````@`!`!D```"4#P```````````0`&`@``0`$` -M``````````H`#`(``$P!```````````*`!("```@`P``````````"@`8`@`` -MB`,```````````H`'@(``-0"```````````*`"0"```H`P``````````"@`J -M`@``;`,```````````H`,`(``-@"```````````*`)T!```4%``````````` -M`0`V`@``0!0``.P!```"``$`&0```$`4```````````!`$@"``#``P`````` -M````"@!.`@````````````````4`G0$``!06```````````!`%@"```L%@`` -MA`$```(``0`9````+!8```````````$`8P(``"P$```````````*`&D"``!` -M!```````````"@!O`@``2`0```````````H`=0(``%`$```````````*`'L" -M``!@!```````````"@"!`@``5`0```````````H`G0$``*07```````````! -M`(<"``"P%P``-`````(``0`9````L!<```````````$`E0(``'0$```````` -M```*`!D```#D%P```````````0";`@``?`0```````````H`H0(``&@"```` -M```````*`!D```!\&````````````0"G`@``F`0```````````H`K0(``)09 -M```8`````@`!`!D```"4&0```````````0"\`@``K!D``(`,```"``$`&0`` -M`*P9```````````!`)T!``#@&0```````````0`9````(!H```````````$` -MR0(``+0$```````````*`,\"``#,!```````````"@#5`@``Y`0````````` -M``H`VP(``/P$```````````*`.$"```4!0``````````"@#G`@``+`4````` -M``````H`[0(``$0%```````````*`/,"``!````````````0"2!P``Y'@``*@````"``$`&0```.1X```````````! -M`)T!```D>0```````````0`9````-'D```````````$````````````````` -M`P`)`*('````````#`````$`"0"Q!P``#````!$````!``D`P`<``"`````. -M`````0`)`,\'```P````$0````$`"0#>!P``1````!(````!``D`[0<``%@` -M```+`````0`)`/P'``!D````#P````$`"0`+"```=````!$````!``D`&@@` -M`(@````0`````0`)`"D(``"8````!`````$`"0"=`0``F`````````````D` -M-0@``)P````-`````0`)`$$(``"L````#@````$`"0!0"```O`````4````! -M``D`6P@``,0````)`````0`)`&8(``#0````!`````$`"0!R"```U````!,` -M```!``D`@0@``.@````2`````0`)`)`(``#\````%@````$`"0"?"```%`$` -M``0````!``D`JP@``!@!```&`````0`)`+<(```@`0``#P````$`"0#&"``` -M,`$``!,````!``D`U0@``$0!```7`````0`)`.0(``!<`0``%P````$`"0#S -M"```=`$``!$````!``D``@D``)@!```0`````0`)`!$)``"H`0``!`````$` -M"0`="0``K`$``!`````!``D`+`D``+P!```/`````0`)`#L)``#,`0``^`$` -M``$`"0"=`0````````````````,`3`D``&P```#@`````0`#`%D)``!,`0`` -M<`````$``P`````````````````#``H`G0$````````````````%`&T)```` -M````$`````$`!0!^"0``$`````$````!``4`DPD``!$````!`````0`%`*8) -M```8````2`````$`!0`````````````````#``P``````````````````P`+ -M``````````````````,`#0"["0`````````````0````T@D``.@```!$```` -M$@`!`.\)`````````````!````#V"0`````````````0````_0D``(@$```\ -M`0``$@`!``D*`````````````!`````1"@`````````````0````'0H````` -M````````$````"X*`````````````!`````X"@`````````````0````/PH` -M````````````$````$8*`````````````!````!9"@`````````````0```` -M8`H`````````````$````&\*`````````````!````"("@`````````````0 -M````F0H`````````````$````*X*`````````````!````"_"@`````````` -M```0````S0H`````````````$````.$*`````````````!````#X"@`````` -M```````0````_PH`````````````$`````<+`````````````!`````9"P`` -M```````````0````)0L`````````````$````#4+`````````````!````!, -M"P`````````````0````7@L`````````````$````&P+`````````````!`` -M``"""P`````````````0````B0L`````````````$````)0+``#D%P``F``` -M`!(``0"@"P``?!@``!@!```2``$`K0L`````````````$````+H+```````` -M`````!````#$"P`````````````0````SPL`````````````$````-L+```` -M`````````!````#H"P`````````````0````^`L`````````````$`````D, -M`````````````!`````A#``````````````0````,0P`````````````$``` -M`$0,`````````````!````!2#``````````````0````80P````````````` -M$````'$,`````````````!````"`#``````````````0````C`P````````` -M````$````)<,`````````````!````"C#``````````````0````N@P````` -M````````$````,8,`````````````!````#8#``````````````0````[0P` -M````````````$````/X,`````````````!`````6#0`````````````0```` -M+PT`````````````$````#P-`````````````!````!-#0`````````````0 -M````7PT`````````````$````&H-`````````````!````!^#0`````````` -M```0````FPT`````````````$````*0-`````````````!````"]#0`````` -M```````0````R0T`````````````$````-`-`````````````!````#B#0`` -M```````````0````_0T`````````````$`````P.`````````````!`````6 -M#@`````````````0````,@X``'11``!8````$@`!`%$.`````````````!`` -M``!E#@``S%$``%@````2``$`@0X``"12``!`````$@`!`*$.```````````` -M`!````"T#@`````````````0````Q`X`````````````$````-(.```````` -M`````!````#F#@`````````````0````]`X`````````````$`````L/```` -M`````````!`````7#P`````````````0````-P\`````````````$````$X/ -M`````````````!````!E#P`````````````0````=`\`````````````$``` -M`(8/`````````````!````"8#P`````````````0````K0\``.AH``"H`@`` -M$@`!`+%]S971?9G)E<0!R='=?=WA?9V5T7VUO9&4`%]G971?%]S971?9G)A9P!R='=?=WA?9V5T7V9R -M86<`0!R='=?=WA?9V5T7W!O=V5R`')T=U]W>%]W -M%]S971?;71K -M7W=P%]S -M971?;71K7W=P%]W%]G971?96YC`')T=U]W>%]G971?;FEC:P`N3$,Q-3(`%]S971?96YC7V5X=``N3$,Q-C4`+DQ#,38V`"Y,0S$V-P!R='=?=WA? -M%]S971?%]S971?97-S:60`%-I>F4`:V5Y7S)C:&%R,FYU;0!R='=?969U0!R='=? -M=F%L:61A=&5?%]D:7-A%]A%]S8V%N7V-O;7!L971E7V5V96YT`%]R='=?:6YI=%]L:7-T:&5A9`!R -M='=?96YQ=65U95]C;60`=7!D871E7V)E86-O;@!F;'5S:%]A;&Q?8V%M7V5N -M=')Y`')T=U]S=&%?9FQU`,``"PV``!\`P``*S4``(`#```L-0``B`,` -M`!QX`0"P`P``''@!`.P#```<>`$`5`0``"LY``!8!```+#D``%P$```<>`$` -M:`0``"LZ``!L!```+#H``'`$```<>`$`@`0```)L`0"$!````FP!`*@$```K -M/0``K`0``"P]``"P!```''@!`-P$```K/@``X`0``"P^``#D!```*S\``.@$ -M```L/P``[`0``"M```#P!```+$```/P$```<>`$`8`4``!QX`0!L!0``''@! -M`(0%```<>`$`P`4```)L`0#T!0``*T0``/@%```L1`````8``!QZ`0!,!@`` -M''L!`%P&```<>P$`E`8``!Q\`0"X!@``''T!`.0&```<>`$`%`<``!Q^`0!$ -M!P``''\!`%@'```<>`$`;`<``!R``0!\!P``''@!`(P'```<>P$`E`<``!QX -M`0"D!P``''H!`,`'```<>`$`U`<``!QX`0#H!P``''H!```(```<>`$`%`@` -M`!QZ`0`H"```''@!`#@(```<>@$`5`@``!QX`0!H"```''H!`(`(```<>`$` -MD`@``!QZ`0"D"```''@!`*P(```<@0$`Q`@``!Q_`0#@"```'((!`/0(```< -M>`$`!`D``!R"`0`@"0``''@!`$0)```<@P$`8`D``!QX`0!\"0``'(`!`(P) -M```<>`$`F`D``!QX`0"H"0``''L!`-`)```<>`$`Y`D``!QZ`0#L"0``''@! -M`/P)```<>@$`%`H``!R!`0`H"@``''@!`#P*````$`D`H``!Q[`0"L"@``*T<``+`*```L1P``N`H``!QX`0#` -M"@``*T@``,0*```L2```T`H``!QZ`0#D"@``''@!`/0*```<>@$`#`L``!QX -M`0`<"P``''H!`#`+```<@0$`2`L``!Q_`0!T"P``'(,!`(P+```<>`$`J`L` -M`!R``0"X"P``''@!`,0+```<>`$`U`L``!Q[`0#X"P``''@!``P,```<>@$` -M%`P``!QX`0`D#```''H!`#@,```<@0$`4`P``!Q_`0!\#```'(,!`)0,```< -M>`$`L`P``!R``0#`#```''@!`,P,```<>`$`W`P``!Q[`0``#0``''@!`!0- -M```<>@$`'`T``!QX`0`L#0``''H!`$`-```<@0$`6`T``!Q_`0!P#0``'(4! -M`'@-````$`:!```!R!`0!\ -M$```''@!`(@0```<>`$`H!```!R'`0#8$```'(,!`/00```<>`$`$!$``!R( -M`0`@$0``''@!`#`1```<>`$`0!$``"M2``!$$0``+%(``$@1````$`$!(``"M3```4$@``+%,``!@2```< -M?P$`*!(``!R!`0!$$@``''@!`%`2```K5```5!(``"Q4``!<$@``''@!`'02 -M````$`9!,``!R'`0"<$P``'(,!`+@3```<>`$`U!,``!R(`0#D -M$P``''@!`/03```<>`$`%!0```))`0`8%````FP!`!P4```";`$`(!0```)L -M`0`D%````FP!`"@4```";`$`+!0```)L`0`P%````FP!`#04```";`$`.!0` -M``)L`0`\%````FP!`%`4```K6@``5!0``"Q:``!<%```''@!`&`4```K6P`` -M9!0``"Q;``!X%```*XH!`'P4```LB@$`C!0``!R+`0#4%```''P!`.P4```< -M?0$`"!4``!QX`0`4%0``'(P!`"05```<>`$`-!4``!R-`0!4%0``'(X!`'@5 -M```!<``"MC``!\%P``+&,``(`7```K9```A!<` -M`"QD``"4%P``''@!`*07```"20$`J!<```)L`0"L%P```DD!`,`7```@$`[!<``"MJ``#P%P``+&H``/07```< -M>`$``!@``"MK```$&```+&L```@8```K0```#!@``"Q````0&```*S\``!08 -M```L/P``/!@``!QX`0!(&```')0!`%08```<>`$`9!@``!QX`0"$&```*VT` -M`(@8```L;0``C!@``!QX`0"8&```*VL``)P8```L:P``H!@``"M```"D&``` -M+$```*@8```K/P``K!@``"P_``#4&```''@!`.`8````$`8!D``!R4`0!L&0``''@!`'P9```<>`$`H!D` -M`!R7`0#@&0```@(``.09```"`@``Z!D```("``#L&0```@(``/`9```"`@`` -M]!D```("``#X&0```@(``/P9```"`@```!H```("```$&@```@(```@:```" -M`@``#!H```("```0&@```@(``!0:```"`@``&!H```("```<&@```@(``$`: -M````$`9!H``!R9`0!L&@``*W4` -M`'`:```L=0``>!H``!QX`0"(&@``')0!`)`:```K=@``E!H``"QV``"<&@`` -M''@!`,@:````$`,!L``!R7 -M`0`\&P``')0!`$0;```K>0``2!L``"QY``!0&P``''@!`'0;```K>@``>!L` -M`"QZ``"`&P``''@!`+P;```K>P``P!L``"Q[``#(&P``''@!`/`;```K?``` -M]!L``"Q\````'```''@!`$@<```K?0``3!P``"Q]``!8'```''@!`&0=```K -M?@``:!T``"Q^``!P'0``''@!`)P=```K?P``H!T``"Q_``"D'0``''@!`*P= -M```K@```L!T``"R```"X'0``''@!`,`=```K@0``Q!T``"R!``#,'0``''@! -M`-`=```K@@``U!T``"R"``#<'0``''@!`.0=```K@P``Z!T``"R#``#P'0`` -M''@!`/0=```KA```^!T``"R$````'@``''@!``0>```KA0``"!X``"R%```0 -M'@``''@!`"0>``````<>`$`8!X``"N' -M``!D'@``+(<``'`>```<>`$`=!X``"N(``!X'@``+(@``(@>```<>`$`G!X` -M`"N)``"@'@``+(D``*0>```<>`$`J!X``"N*``"L'@``+(H``+P>```<>`$` -MP!X``"N+``#$'@``+(L``,P>```<>`$`T!X``"N,``#4'@``+(P``.`>```< -M>`$`[!X``"N-``#P'@``+(T```P?```<>`$`3!\``!QX`0!P'P``*XX``'0? -M```LC@``@!\``!QX`0",'P``*X\``)`?```LCP``E!\``!QX`0"T'P``*Y`` -M`+@?```LD```S!\``!QX`0#4'P``*Y$``-@?```LD0``[!\``!QX`0#P'P`` -M*Y(``/0?```LD@```"```!QX`0`((```*Y,```P@```LDP``("```!QX`0`D -M(```')T!`$P@```KA@``4"```"R&``!8(```*XD``%P@```LB0``9"```"N- -M``!H(```+(T``(0@```KAP``B"```"R'``",(```*X@``)`@```LB```W"`` -M`!QX`0#L(```''@!```A```<>`$`&"$``!QX`0`L(0``''@!`#@A```<>`$` -M2"$``!QX`0!4(0``''@!`'@A```<>`$`E"$``!R>`0#((0``')\!`-`A```K -ME```U"$``"R4``#<(0``''@!``@B```<>`$`*"(``"N5```L(@``+)4``#@B -M```<>`$`0"(``"N6``!$(@``+)8``$@B```KEP``3"(``"R7``!0(@``''@! -M`%PB```KF```8"(``"R8``!H(@``*YD``&PB```LF0``<"(``!QX`0"0(@`` -M')8!`*0B````$`^"(``!QX`0`` -M(P``''@!``@C```<>`$`$",``!QX`0`8(P``''@!`"`C```<>`$`6",``"N: -M``!<(P``+)H``&0C```<>`$`?",``!R:`0"((P``')@!`)`C```KFP``E",` -M`"R;``"8(P``''@!`*@C`````#\(P``+)X````D```<>`$`$"0``!R4`0`8)```*Y\``!PD -M```LGP``("0``!QX`0`L)```')0!`#0D```KH```."0``"R@```\)```''@! -M`$@D````$`9"0``!R4`0!L)``` -M*Z(``'`D```LH@``="0``!QX`0"`)```')0!`(@D```KHP``C"0``"RC``"0 -M)```''@!`)PD````$`L"0``"L_ -M``"T)```+#\``+@D```<>`$`Q"0``!R4`0#,)```*Z4``-`D```LI0``U"0` -M`!QX`0#@)```')0!`.@D```KI@``["0``"RF``#P)```''@!`/PD````$`&"4``!R4`0`@)0``*Z@``"0E```L -MJ```*"4``!QX`0`T)0``')0!`#PE```KJ0``0"4``"RI``!$)0``''@!`%`E -M````$`;"4``!R4`0!T)0``*ZL` -M`'@E```LJP``?"4``!QX`0"()0``')0!`)`E```KK```E"4``"RL``"8)0`` -M''@!`*0E````$`P"4``!R4`0#( -M)0``*ZX``,PE```LK@``T"4``!QX`0#8)0``*Z\``-PE```LKP``X"4``!QX -M`0#P)0```FP!`/0E```";`$`^"4```)L`0#\)0```FP!```F```";`$`!"8` -M``)L`0`()@```FP!``PF```";`$`$"8```)L`0`4)@```FP!`!@F```";`$` -M'"8```)L`0`@)@```FP!`"0F```";`$`*"8```)L`0!`)@``'*`!`&0F```K -MM0``:"8``"RU``!L)@``''@!`*0F````$`#"@``!R?`0!0*```''@!`&@H````$`I"H``!R8`0"X*@``')D!`,PJ````$` -MH"P``!R-`0#4+```'(T!`.0L```<>`$`!"T``!RG`0!8+0``''@!`(`M```< -MC0$`J"T``!Q[`0#L+0``''L!`"@N```<>`$`2"X``!RG`0!D+@``'*P$`'#$``"O+```@,0``+,L``"@Q```<>`$`.#$``!Q[ -M`0!,,0``''@!`+@Q```<>`$`T#$``!QX`0`,,@``*\P``!`R```LS```%#(` -M`!QX`0!,,@``*\T``%`R```LS0``5#(``!QX`0#@,@``''@!`%0S````$`3#0``!QX`0!X-```'*4!`)`T -M```<>P$`S#0``!RG`0#@-```''@!`.PT````$`+#T``!RG`0!`/0``''@!`(@]```K-0``C#T``"PU``"L -M/0``'*8!`+0]```";`$`N#T```)L`0`@/@``'+(!`$@^```P$`P$(``"OZ``#$0@`` -M+/H``#Q#````$`Q$H` -M`!RX`0#42@``'+@!``Q+```@$`I$L``!Q[`0"\2P``'($!`/A+```< -MN`$`"$P``!RX`0`<3```'+@!`#!,```<>P$`?$P``!RX`0",3```'+@!`*!, -M```@$`/$T``!Q[`0!430``'($!`)!-```P$`%$X``!RX`0`D3@``'+@!`#A.```P$`P%$``!R_`0#H40``''L!``!2```%(``"L0`0!\4@``+!`!`(12```< -M>`$`C%(``!RO`0"H4@``'*\!`+Q2```%4```("``!\50```@(``(!5```"`@``A%4```("``"(50```@(``(Q5```" -M`@``D%4```("``"450```@(``)A5```"`@``J%4``!QX`0"P50``',4!`+A5 -M````$`.%<``!R<`0!,5P``',@!`%Q7```<>`$`K%<``!QX`0#,5P`` -M'*P$`(%@``!RG`0!(6```'*`$`"%X``!R<`0`87@``''@!`#!> -M``````<>`$`D%X``!QX`0#,7@``'*4! -M`-Q>```<>`$`]%X``!Q[`0`47P``'*`$`B%\``!RG`0"\7P`` -M''@!`-A?````$`>&$``!RG -M`0"(80``''@!`-AA````$`F&(` -M`!Q_`0"L8@``''@!`,1B````$` -M'&,``!QX`0`L8P``'*\!`$!C````$`,&<``!RF`0!,9P``'*4!`&QG```<>`$`@&<``!RG`0"@9P``''@! -M`,AG````$`&&T``!QX`0`X;0``''@!`%AM```<>`$`F&T``!Q[`0"P;0``'*`$`6&X``!S<`0!D;@`` -M'-T!`(1N```";`$`B&X```))`0",;@```FP!`)!N```";`$`E&X```)L`0"8 -M;@```FP!`+1N````$`F&\``!R=`0"\;P``'-X!`-!O```P$`2'```"LL`0!,<```+"P!`%1P````$`8',` -M`"M;``!D`$` -MM',``!S2`0#('0``!RX`0!\=```*UL` -M`(!T```L6P``F'0``!S3`0"X=```*S`$`B'8``"L^`0",=@``+#X!`)1V -M```<>`$`G'8``"LT`0"@=@``+#0!`*AV``````''@!`$AX``````'(T!`)AX``````'.4!`-AX```";`$`W'@```))`0#@>````FP!`/1X```< -MV`$`)'D```("```H>0```@(``"QY```"`@``,'D```("``!@>0``'-L!`'1Y -M````````(>``!\ -M`````@D``(`````"^P``A`````)%`0"(`````@L``(P````"'@``D`````(- -M``"8`````O@``)P````"+@$`K`````(>``"P`````AX``+P````"0@$`P``` -M``+'``#$`````@D!`,@````"'@``S`````(J`0#0`````@```(`0```AX```P! -M```"'@``$`$```(6```4`0```LD``!@!```"O@``'`$```(>```@`0```A@` -M`"P!```"Y@``-`$```+:```\`0```M,``$0!```"NP``3`$```)N``!0`0`` -M`F8``%0!```")@``6`$```*X``!<`0```K,``&`!```",@``9`$```)*``!H -M`0```B(``&P!```"(```<`$```(D``!T`0```K$``'@!```"<```?`$```(: -M``"``0```D(``(0!```"'```B`$```(<``",`0```B@``)`!```"*@``E`$` -M``(L``"<`0```BX``*`!```"'```I`$```)=``"H`0```AP``*P!```"6``` -ML`$```(<``"T`0```DT``+@!```"10```````"H"`````````'4!``@````J -M`@``$````"H"```8````*@(``"`````J`@``*````"H"```P````*@(``#@` -M```J`@``0````"H"``!(````*@(``%`````J`@``6````"H"``!@````*@(` -M`&@````J`@``<````"H"``!X````*@(``(`````J`@``B````"H"``"0```` -M*@(``)@````J`@``H````"H"``"H````*@(``+`````J`@``N````"H"``#` -M````*@(``,@````J`@``T````"H"``#8````*@(``.`````J`@``X`````") -M`0#D````*@<``.@````J`@``\````"H"``#X````*@(````!```J`@``"`$` -M`"H"```0`0``*@(``!@!```J`@``(`$``"H"```H`0``*@(``#`!```J`@`` -M.`$``"H"``!``0``*@(``$@!```J`@``4`$``"H"``!8`0``*@(``&`!```J -M`@``:`$``"H"``!P`0``*@(``'@!```J`@``@`$``"H"``"(`0``*@(``)`! -M```J`@``F`$``"H"``"@`0``*@(``*@!```J`@``L`$``"H"``"X`0``*@(` -M`,`!```J`@``R`$``"H"``#0`0``*@(``-@!```J`@``X`$``"H"``#H`0`` -M*@(``/`!```J`@``^`$``"H"`````@``*@(```@"```J`@``$`(``"H"```8 -M`@``*@(``"`"```J`@``*`(``"H"```P`@``*@(``#@"```J`@``0`(``"H" -*``!(`@``*@(````` -` -end diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c deleted file mode 100755 index 9f4f3fef874f..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c +++ /dev/null @@ -1,781 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#define _MLME_OSDEP_C_ - -#include -#include -#include -#include - - -#ifdef RTK_DMP_PLATFORM -void Linkup_workitem_callback(struct work_struct *work) -{ - struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkup_workitem); - _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv); - -_func_enter_; - - RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkup_workitem_callback\n")); - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) - kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKUP); -#else - kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKUP); -#endif - -_func_exit_; -} - -void Linkdown_workitem_callback(struct work_struct *work) -{ - struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkdown_workitem); - _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv); - -_func_enter_; - - RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkdown_workitem_callback\n")); - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) - kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKDOWN); -#else - kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKDOWN); -#endif - -_func_exit_; -} -#endif - - -/* -void sitesurvey_ctrl_handler(void *FunctionContext) -{ - _adapter *adapter = (_adapter *)FunctionContext; - - _sitesurvey_ctrl_handler(adapter); - - _set_timer(&adapter->mlmepriv.sitesurveyctrl.sitesurvey_ctrl_timer, 3000); -} -*/ - -void rtw_join_timeout_handler (void *FunctionContext) -{ - _adapter *adapter = (_adapter *)FunctionContext; - _rtw_join_timeout_handler(adapter); -} - - -void _rtw_scan_timeout_handler (void *FunctionContext) -{ - _adapter *adapter = (_adapter *)FunctionContext; - rtw_scan_timeout_handler(adapter); -} - - -void _dynamic_check_timer_handlder (void *FunctionContext) -{ - _adapter *adapter = (_adapter *)FunctionContext; - - rtw_dynamic_check_timer_handlder(adapter); - - _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); -} - -#ifdef CONFIG_SET_SCAN_DENY_TIMER -void _rtw_set_scan_deny_timer_hdl(void *FunctionContext) -{ - _adapter *adapter = (_adapter *)FunctionContext; - rtw_set_scan_deny_timer_hdl(adapter); -} -#endif - - -void rtw_init_mlme_timer(_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - _init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev, rtw_join_timeout_handler, padapter); - //_init_timer(&(pmlmepriv->sitesurveyctrl.sitesurvey_ctrl_timer), padapter->pnetdev, sitesurvey_ctrl_handler, padapter); - _init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev, _rtw_scan_timeout_handler, padapter); - - _init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, _dynamic_check_timer_handlder, padapter); - - #ifdef CONFIG_SET_SCAN_DENY_TIMER - _init_timer(&(pmlmepriv->set_scan_deny_timer), padapter->pnetdev, _rtw_set_scan_deny_timer_hdl, padapter); - #endif - -#ifdef RTK_DMP_PLATFORM - _init_workitem(&(pmlmepriv->Linkup_workitem), Linkup_workitem_callback, padapter); - _init_workitem(&(pmlmepriv->Linkdown_workitem), Linkdown_workitem_callback, padapter); -#endif - -} - -extern void rtw_indicate_wx_assoc_event(_adapter *padapter); -extern void rtw_indicate_wx_disassoc_event(_adapter *padapter); - -void rtw_os_indicate_connect(_adapter *adapter) -{ - -_func_enter_; - - rtw_indicate_wx_assoc_event(adapter); - netif_carrier_on(adapter->pnetdev); - - if(adapter->pid[2] !=0) - rtw_signal_process(adapter->pid[2], SIGALRM); - -#ifdef RTK_DMP_PLATFORM - _set_workitem(&adapter->mlmepriv.Linkup_workitem); -#endif - -_func_exit_; - -} - -static RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ]; -void rtw_reset_securitypriv( _adapter *adapter ) -{ - u8 backupPMKIDIndex = 0; - u8 backupTKIPCountermeasure = 0x00; - - if(adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)//802.1x - { - // Added by Albert 2009/02/18 - // We have to backup the PMK information for WiFi PMK Caching test item. - // - // Backup the btkip_countermeasure information. - // When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. - - _rtw_memset( &backupPMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); - - _rtw_memcpy( &backupPMKIDList[ 0 ], &adapter->securitypriv.PMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); - backupPMKIDIndex = adapter->securitypriv.PMKIDIndex; - backupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure; - - _rtw_memset((unsigned char *)&adapter->securitypriv, 0, sizeof (struct security_priv)); - //_init_timer(&(adapter->securitypriv.tkip_timer),adapter->pnetdev, rtw_use_tkipkey_handler, adapter); - - // Added by Albert 2009/02/18 - // Restore the PMK information to securitypriv structure for the following connection. - _rtw_memcpy( &adapter->securitypriv.PMKIDList[ 0 ], &backupPMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); - adapter->securitypriv.PMKIDIndex = backupPMKIDIndex; - adapter->securitypriv.btkip_countermeasure = backupTKIPCountermeasure; - - adapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; - adapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; - - } - else //reset values in securitypriv - { - //if(adapter->mlmepriv.fw_state & WIFI_STATION_STATE) - //{ - struct security_priv *psec_priv=&adapter->securitypriv; - - psec_priv->dot11AuthAlgrthm =dot11AuthAlgrthm_Open; //open system - psec_priv->dot11PrivacyAlgrthm = _NO_PRIVACY_; - psec_priv->dot11PrivacyKeyIndex = 0; - - psec_priv->dot118021XGrpPrivacy = _NO_PRIVACY_; - psec_priv->dot118021XGrpKeyid = 1; - - psec_priv->ndisauthtype = Ndis802_11AuthModeOpen; - psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled; - psec_priv->wps_phase = _FALSE; - //} - } -} - -void rtw_os_indicate_disconnect( _adapter *adapter ) -{ - //RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ]; - -_func_enter_; - - rtw_indicate_wx_disassoc_event(adapter); - netif_carrier_off(adapter->pnetdev); - -#ifdef RTK_DMP_PLATFORM - _set_workitem(&adapter->mlmepriv.Linkdown_workitem); -#endif - rtw_reset_securitypriv( adapter ); - -_func_exit_; - -} - -void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie) -{ - uint len; - u8 *buff,*p,i; - union iwreq_data wrqu; - -_func_enter_; - - RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+rtw_report_sec_ie, authmode=%d\n", authmode)); - - buff = NULL; - if(authmode==_WPA_IE_ID_) - { - RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("rtw_report_sec_ie, authmode=%d\n", authmode)); - - buff = rtw_malloc(IW_CUSTOM_MAX); - - _rtw_memset(buff,0,IW_CUSTOM_MAX); - - p=buff; - - p+=sprintf(p,"ASSOCINFO(ReqIEs="); - - len = sec_ie[1]+2; - len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX; - - for(i=0;ipnetdev,IWEVCUSTOM,&wrqu,buff); - - if(buff) - rtw_mfree(buff, IW_CUSTOM_MAX); - - } - -_func_exit_; - -} - -void _survey_timer_hdl (void *FunctionContext) -{ - _adapter *padapter = (_adapter *)FunctionContext; - - survey_timer_hdl(padapter); -} - -void _link_timer_hdl (void *FunctionContext) -{ - _adapter *padapter = (_adapter *)FunctionContext; - link_timer_hdl(padapter); -} - -void _addba_timer_hdl(void *FunctionContext) -{ - struct sta_info *psta = (struct sta_info *)FunctionContext; - addba_timer_hdl(psta); -} - -void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta) -{ - - _init_timer(&psta->addba_retry_timer, padapter->pnetdev, _addba_timer_hdl, psta); -} - -#ifdef CONFIG_TDLS -void TDLS_restore_workitem_callback(struct work_struct *work) -{ - struct mlme_ext_priv*pmlmeext = container_of(work, struct mlme_ext_priv, TDLS_restore_workitem); - _adapter *padapter = pmlmeext->padapter; - u32 bit_6=1<<6; - - rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)|(bit_6)); - DBG_8192C("wirte 0x0608, set bit6 on\n"); -} - - -void _TPK_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - - ptdls_sta->TPK_count++; - //TPK_timer set 1000 as default - //retry timer should set at least 301 sec. - if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ - ptdls_sta->TPK_count=0; - issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr); - } - - _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); -} - -void init_TPK_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - - _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta); -} - -// 1: write RCR DATA BIT -// 2: issue peer traffic indication -// 3: go back to the channel linked with AP, terminating channel switch procedure -// 4: init channel sensing, receive all data and mgnt frame -// 5: channel sensing and report candidate channel -// 6: first time set channel to off channel -// 7: go back tp the channel linked with AP when set base channel as target channel -void TDLS_option_workitem_callback(struct work_struct *work) -{ - struct sta_info *ptdls_sta = container_of(work, struct sta_info, option_workitem); - _adapter *padapter = ptdls_sta->padapter; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u32 bit_6=1<<6, bit_7=1<<7, bit_4=1<<4; - u8 survey_channel, i, min; - - switch(ptdls_sta->option){ - case 1: - //As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0 - //such we can receive all kinds of data frames. - rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)&(~bit_6)); - DBG_8192C("wirte 0x0608, set bit6 off\n"); - break; - case 2: - issue_tdls_peer_traffic_indication(padapter, ptdls_sta); - break; - case 3: - _cancel_timer_ex(&ptdls_sta->base_ch_timer); - _cancel_timer_ex(&ptdls_sta->off_ch_timer); - SelectChannel(padapter, pmlmeext->cur_channel); - ptdls_sta->state &= ~(TDLS_CH_SWITCH_ON_STATE | - TDLS_PEER_AT_OFF_STATE | - TDLS_AT_OFF_CH_STATE); - DBG_8192C("go back to base channel\n "); - issue_nulldata(padapter, 0); - break; - case 4: - rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)&(~bit_6)&(~bit_7)); - rtw_write16(padapter, 0x06A4,0xffff); //maybe don't need to write here - - //disable update TSF - rtw_write8(padapter, 0x0550, rtw_read8(padapter, 0x0550)|bit_4); - - pmlmeext->sitesurvey_res.channel_idx = 0; - ptdls_sta->option = 5; - _set_workitem(&ptdls_sta->option_workitem); - break; - case 5: - survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; - if(survey_channel){ - SelectChannel(padapter, survey_channel); - pmlmeinfo->tdls_cur_channel = survey_channel; - pmlmeext->sitesurvey_res.channel_idx++; - _set_timer(&ptdls_sta->option_timer, SURVEY_TO); - }else{ - SelectChannel(padapter, pmlmeext->cur_channel); - - //enable update TSF - rtw_write8(padapter, 0x0550, rtw_read8(padapter, 0x0550)&(~bit_4)); - rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)|(bit_7)); - - if(pmlmeinfo->tdls_ch_sensing==1){ - pmlmeinfo->tdls_ch_sensing=0; - pmlmeinfo->tdls_cur_channel=1; - min=pmlmeinfo->tdls_collect_pkt_num[0]; - for(i=1; i<14-1; i++){ - if(min > pmlmeinfo->tdls_collect_pkt_num[i]){ - pmlmeinfo->tdls_cur_channel=i+1; - min=pmlmeinfo->tdls_collect_pkt_num[i]; - } - pmlmeinfo->tdls_collect_pkt_num[i]=0; - } - pmlmeinfo->tdls_collect_pkt_num[0]=0; - pmlmeinfo->tdls_candidate_ch=pmlmeinfo->tdls_cur_channel; - DBG_8192C("TDLS channel sensing done, candidate channel: %02x\n", pmlmeinfo->tdls_candidate_ch); - pmlmeinfo->tdls_cur_channel=0; - - } - - if(ptdls_sta->state & TDLS_PEER_SLEEP_STATE){ - ptdls_sta->state |= TDLS_APSD_CHSW_STATE; - }else{ - //send null data with pwrbit==1 before send ch_switching_req to peer STA. - issue_nulldata(padapter, 1); - - ptdls_sta->state |= TDLS_CH_SW_INITIATOR_STATE; - - issue_tdls_ch_switch_req(padapter, ptdls_sta->hwaddr); - DBG_8192C("issue tdls ch switch req\n"); - } - } - break; - case 6: - issue_nulldata(padapter, 1); - SelectChannel(padapter, ptdls_sta->off_ch); - - DBG_8192C("change channel to tar ch:%02x\n", ptdls_sta->off_ch); - ptdls_sta->state |= TDLS_AT_OFF_CH_STATE; - ptdls_sta->state &= ~(TDLS_PEER_AT_OFF_STATE); - _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); - break; - case 7: - _cancel_timer_ex(&ptdls_sta->base_ch_timer); - _cancel_timer_ex(&ptdls_sta->off_ch_timer); - SelectChannel(padapter, pmlmeext->cur_channel); - ptdls_sta->state &= ~(TDLS_CH_SWITCH_ON_STATE | - TDLS_PEER_AT_OFF_STATE | - TDLS_AT_OFF_CH_STATE); - DBG_8192C("go back to base channel\n "); - issue_nulldata(padapter, 0); - _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); - break; - } - -} - -// 5: channel sensing and report candidate channel -// 6: first time set channel to off channel -// 7: whab go back tp the channel linked with AP, send null data to peer STA as an indication -void _ch_switch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - - if(ptdls_sta->option==5){ - _set_workitem(&ptdls_sta->option_workitem); - }else if(ptdls_sta->option==6){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); - _set_timer(&ptdls_sta->base_ch_timer, 500); - }else if(ptdls_sta->option==7){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); - } -} - -void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta); -} - -//Set channel back to base channel -void base_channel_workitem_callback(struct work_struct *work) -{ - struct sta_info *ptdls_sta = container_of(work, struct sta_info, base_ch_workitem); - _adapter *padapter = ptdls_sta->padapter; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - SelectChannel(ptdls_sta->padapter, pmlmeext->cur_channel); - issue_nulldata(ptdls_sta->padapter, 0); - - DBG_8192C("change channel to base ch:%02x\n", pmlmeext->cur_channel); - - ptdls_sta->state &= ~(TDLS_PEER_AT_OFF_STATE| TDLS_AT_OFF_CH_STATE); - - _set_timer(&ptdls_sta->off_ch_timer, 500); - -} - -void _base_ch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _set_workitem(&ptdls_sta->base_ch_workitem); -} - -void init_base_ch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta); -} - -//Set channel back to off channel -void off_channel_workitem_callback(struct work_struct *work) -{ - struct sta_info *ptdls_sta = container_of(work, struct sta_info, off_ch_workitem); - _adapter *padapter = ptdls_sta->padapter; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - issue_nulldata(ptdls_sta->padapter, 1); - - SelectChannel(ptdls_sta->padapter, ptdls_sta->off_ch); - - DBG_8192C("change channel to off ch:%02x\n", ptdls_sta->off_ch); - ptdls_sta->state |= TDLS_AT_OFF_CH_STATE; - - if((ptdls_sta->state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){ - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); - } - - _set_timer(&ptdls_sta->base_ch_timer, 500); -} - -void _off_ch_timer_hdl(void *FunctionContext) -{ - struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; - _set_workitem(&ptdls_sta->off_ch_workitem); -} - -void init_off_ch_timer(_adapter *padapter, struct sta_info *psta) -{ - psta->padapter=padapter; - _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta); -} -#endif - -/* -void _reauth_timer_hdl(void *FunctionContext) -{ - _adapter *padapter = (_adapter *)FunctionContext; - reauth_timer_hdl(padapter); -} - -void _reassoc_timer_hdl(void *FunctionContext) -{ - _adapter *padapter = (_adapter *)FunctionContext; - reassoc_timer_hdl(padapter); -} -*/ - -void init_mlme_ext_timer(_adapter *padapter) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - _init_timer(&pmlmeext->survey_timer, padapter->pnetdev, _survey_timer_hdl, padapter); - _init_timer(&pmlmeext->link_timer, padapter->pnetdev, _link_timer_hdl, padapter); - //_init_timer(&pmlmeext->ADDBA_timer, padapter->pnetdev, _addba_timer_hdl, padapter); - - //_init_timer(&pmlmeext->reauth_timer, padapter->pnetdev, _reauth_timer_hdl, padapter); - //_init_timer(&pmlmeext->reassoc_timer, padapter->pnetdev, _reassoc_timer_hdl, padapter); -} - -#ifdef CONFIG_AP_MODE - -void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta) -{ - union iwreq_data wrqu; - struct sta_priv *pstapriv = &padapter->stapriv; - - if(psta==NULL) - return; - - if(psta->aid > NUM_STA) - return; - - if(pstapriv->sta_aid[psta->aid - 1] != psta) - return; - - - wrqu.addr.sa_family = ARPHRD_ETHER; - - _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); - - DBG_871X("+rtw_indicate_sta_assoc_event\n"); - - wireless_send_event(padapter->pnetdev, IWEVREGISTERED, &wrqu, NULL); - -} - -void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta) -{ - union iwreq_data wrqu; - struct sta_priv *pstapriv = &padapter->stapriv; - - if(psta==NULL) - return; - - if(psta->aid > NUM_STA) - return; - - if(pstapriv->sta_aid[psta->aid - 1] != psta) - return; - - - wrqu.addr.sa_family = ARPHRD_ETHER; - - _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); - - DBG_871X("+rtw_indicate_sta_disassoc_event\n"); - - wireless_send_event(padapter->pnetdev, IWEVEXPIRED, &wrqu, NULL); - -} - - -#ifdef CONFIG_HOSTAPD_MLME - -static int mgnt_xmit_entry(struct sk_buff *skb, struct net_device *pnetdev) -{ - struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); - _adapter *padapter = (_adapter *)phostapdpriv->padapter; - - //DBG_8192C("%s\n", __FUNCTION__); - - return padapter->HalFunc.hostap_mgnt_xmit_entry(padapter, skb); -} - -static int mgnt_netdev_open(struct net_device *pnetdev) -{ - struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); - - DBG_8192C("mgnt_netdev_open: MAC Address:" MAC_FMT "\n", MAC_ARG(pnetdev->dev_addr)); - - - init_usb_anchor(&phostapdpriv->anchored); - - if(!netif_queue_stopped(pnetdev)) - netif_start_queue(pnetdev); - else - netif_wake_queue(pnetdev); - - - netif_carrier_on(pnetdev); - - //rtw_write16(phostapdpriv->padapter, 0x0116, 0x0100);//only excluding beacon - - return 0; -} -static int mgnt_netdev_close(struct net_device *pnetdev) -{ - struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); - - DBG_8192C("%s\n", __FUNCTION__); - - usb_kill_anchored_urbs(&phostapdpriv->anchored); - - netif_carrier_off(pnetdev); - - if (!netif_queue_stopped(pnetdev)) - netif_stop_queue(pnetdev); - - //rtw_write16(phostapdpriv->padapter, 0x0116, 0x3f3f); - - return 0; -} - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) -static const struct net_device_ops rtl871x_mgnt_netdev_ops = { - .ndo_open = mgnt_netdev_open, - .ndo_stop = mgnt_netdev_close, - .ndo_start_xmit = mgnt_xmit_entry, - //.ndo_set_mac_address = r871x_net_set_mac_address, - //.ndo_get_stats = r871x_net_get_stats, - //.ndo_do_ioctl = r871x_mp_ioctl, -}; -#endif - -int hostapd_mode_init(_adapter *padapter) -{ - unsigned char mac[ETH_ALEN]; - struct hostapd_priv *phostapdpriv; - struct net_device *pnetdev; - - pnetdev = rtw_alloc_etherdev(sizeof(struct hostapd_priv)); - if (!pnetdev) - return -ENOMEM; - - //SET_MODULE_OWNER(pnetdev); - ether_setup(pnetdev); - - //pnetdev->type = ARPHRD_IEEE80211; - - phostapdpriv = rtw_netdev_priv(pnetdev); - phostapdpriv->pmgnt_netdev = pnetdev; - phostapdpriv->padapter= padapter; - padapter->phostapdpriv = phostapdpriv; - - //pnetdev->init = NULL; - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) - - DBG_8192C("register rtl871x_mgnt_netdev_ops to netdev_ops\n"); - - pnetdev->netdev_ops = &rtl871x_mgnt_netdev_ops; - -#else - - pnetdev->open = mgnt_netdev_open; - - pnetdev->stop = mgnt_netdev_close; - - pnetdev->hard_start_xmit = mgnt_xmit_entry; - - //pnetdev->set_mac_address = r871x_net_set_mac_address; - - //pnetdev->get_stats = r871x_net_get_stats; - - //pnetdev->do_ioctl = r871x_mp_ioctl; - -#endif - - pnetdev->watchdog_timeo = HZ; /* 1 second timeout */ - - //pnetdev->wireless_handlers = NULL; - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - pnetdev->features |= NETIF_F_IP_CSUM; -#endif - - - - if(dev_alloc_name(pnetdev,"mgnt.wlan%d") < 0) - { - DBG_8192C("hostapd_mode_init(): dev_alloc_name, fail! \n"); - } - - - //SET_NETDEV_DEV(pnetdev, pintfpriv->udev); - - - mac[0]=0x00; - mac[1]=0xe0; - mac[2]=0x4c; - mac[3]=0x87; - mac[4]=0x11; - mac[5]=0x12; - - _rtw_memcpy(pnetdev->dev_addr, mac, ETH_ALEN); - - - netif_carrier_off(pnetdev); - - - /* Tell the network stack we exist */ - if (register_netdev(pnetdev) != 0) - { - DBG_8192C("hostapd_mode_init(): register_netdev fail!\n"); - - if(pnetdev) - { - rtw_free_netdev(pnetdev); - } - } - - return 0; - -} - -void hostapd_mode_unload(_adapter *padapter) -{ - struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; - struct net_device *pnetdev = phostapdpriv->pmgnt_netdev; - - unregister_netdev(pnetdev); - rtw_free_netdev(pnetdev); - -} - -#endif -#endif - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c b/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c deleted file mode 100755 index a0f522b7359f..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c +++ /dev/null @@ -1,1343 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _OS_INTFS_C_ - -#include - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_SDIO_HCI -#include -#endif - -#ifdef CONFIG_USB_HCI -#include -#endif - -#ifdef CONFIG_PCI_HCI -#include -#endif - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); -MODULE_AUTHOR("Realtek Semiconductor Corp."); -MODULE_VERSION(DRIVERVERSION); - -/* module param defaults */ -int rtw_chip_version = 0x00; -int rtw_rfintfs = HWPI; -int rtw_lbkmode = 0;//RTL8712_AIR_TRX; - - -int rtw_network_mode = Ndis802_11IBSS;//Ndis802_11Infrastructure;//infra, ad-hoc, auto -//NDIS_802_11_SSID ssid; -int rtw_channel = 1;//ad-hoc support requirement -int rtw_wireless_mode = WIRELESS_11BG_24N; -int rtw_vrtl_carrier_sense = AUTO_VCS; -int rtw_vcs_type = RTS_CTS;//* -int rtw_rts_thresh = 2347;//* -int rtw_frag_thresh = 2346;//* -int rtw_preamble = PREAMBLE_LONG;//long, short, auto -int rtw_scan_mode = 1;//active, passive -int rtw_adhoc_tx_pwr = 1; -int rtw_soft_ap = 0; -//int smart_ps = 1; -#ifdef CONFIG_POWER_SAVING -int rtw_power_mgnt = 1; -#else -int rtw_power_mgnt = PS_MODE_ACTIVE; -#endif - -#ifdef CONFIG_IPS_LEVEL_2 -int rtw_ips_mode = IPS_LEVEL_2; -#else -int rtw_ips_mode = IPS_NORMAL; -#endif -module_param(rtw_ips_mode, int, 0644); - -int rtw_radio_enable = 1; -int rtw_long_retry_lmt = 7; -int rtw_short_retry_lmt = 7; -int rtw_busy_thresh = 40; -//int qos_enable = 0; //* -int rtw_ack_policy = NORMAL_ACK; -#ifdef CONFIG_MP_INCLUDED -int rtw_mp_mode = 1; -#else -int rtw_mp_mode = 0; -#endif -int rtw_software_encrypt = 0; -int rtw_software_decrypt = 0; - -int rtw_wmm_enable = 1;// default is set to enable the wmm. -int rtw_uapsd_enable = 0; -int rtw_uapsd_max_sp = NO_LIMIT; -int rtw_uapsd_acbk_en = 0; -int rtw_uapsd_acbe_en = 0; -int rtw_uapsd_acvi_en = 0; -int rtw_uapsd_acvo_en = 0; - -#ifdef CONFIG_80211N_HT -int rtw_ht_enable = 1; -int rtw_cbw40_enable = 1; -int rtw_ampdu_enable = 1;//for enable tx_ampdu -#endif -//int rf_config = RF_1T2R; // 1T2R -int rtw_rf_config = RF_819X_MAX_TYPE; //auto -int rtw_low_power = 0; -#ifdef CONFIG_WIFI_TEST -int rtw_wifi_spec = 1;//for wifi test -#else -int rtw_wifi_spec = 0; -#endif -int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX; - -#ifdef CONFIG_BT_COEXIST -int rtw_bt_iso = 2;// 0:Low, 1:High, 2:From Efuse -int rtw_bt_sco = 3;// 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy -int rtw_bt_ampdu =1 ;// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. -#endif -int rtw_AcceptAddbaReq = _TRUE;// 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. - -int rtw_antdiv_cfg = 2; // 0:OFF , 1:ON, 2:decide by Efuse config - -#ifdef CONFIG_USB_AUTOSUSPEND -int rtw_enusbss = 1;//0:disable,1:enable -#else -int rtw_enusbss = 0;//0:disable,1:enable -#endif - -int rtw_hwpdn_mode=2;//0:disable,1:enable,2: by EFUSE config - -#ifdef CONFIG_HW_PWRP_DETECTION -int rtw_hwpwrp_detect = 1; -#else -int rtw_hwpwrp_detect = 0; //HW power ping detect 0:disable , 1:enable -#endif - -#ifdef CONFIG_USB_HCI -int rtw_hw_wps_pbc = 0; //There is no PBC hardware -#else -int rtw_hw_wps_pbc = 0; -#endif - -char* ifname = "wlan%d"; - -char* rtw_initmac = 0; // temp mac address if users want to use instead of the mac address in Efuse - -module_param(ifname, charp, 0644); -module_param(rtw_initmac, charp, 0644); -module_param(rtw_channel_plan, int, 0644); -module_param(rtw_chip_version, int, 0644); -module_param(rtw_rfintfs, int, 0644); -module_param(rtw_lbkmode, int, 0644); -module_param(rtw_network_mode, int, 0644); -module_param(rtw_channel, int, 0644); -module_param(rtw_mp_mode, int, 0644); -module_param(rtw_wmm_enable, int, 0644); -module_param(rtw_vrtl_carrier_sense, int, 0644); -module_param(rtw_vcs_type, int, 0644); -module_param(rtw_busy_thresh, int, 0644); -#ifdef CONFIG_80211N_HT -module_param(rtw_ht_enable, int, 0644); -module_param(rtw_cbw40_enable, int, 0644); -module_param(rtw_ampdu_enable, int, 0644); -#endif -module_param(rtw_rf_config, int, 0644); -module_param(rtw_power_mgnt, int, 0644); -module_param(rtw_low_power, int, 0644); -module_param(rtw_wifi_spec, int, 0644); - -module_param(rtw_antdiv_cfg, int, 0644); - - -module_param(rtw_enusbss, int, 0644); -module_param(rtw_hwpdn_mode, int, 0644); -module_param(rtw_hwpwrp_detect, int, 0644); - -#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE -char *rtw_adaptor_info_caching_file_path= "/data/misc/wifi/rtw_cache"; -module_param(rtw_adaptor_info_caching_file_path, charp, 0644); -#endif - -#ifdef CONFIG_LAYER2_ROAMING -uint rtw_max_roaming_times=2; -module_param(rtw_max_roaming_times, uint, 0644); -#endif - -static uint loadparam( _adapter *padapter, _nic_hdl pnetdev); -static int netdev_open (struct net_device *pnetdev); -static int netdev_close (struct net_device *pnetdev); - -//#ifdef RTK_DMP_PLATFORM -#ifdef CONFIG_PROC_DEBUG -#define RTL8192C_PROC_NAME "rtl819xC" -#define RTL8192D_PROC_NAME "rtl819xD" -static char rtw_proc_name[IFNAMSIZ]; -static struct proc_dir_entry *rtw_proc = NULL; -static int rtw_proc_cnt = 0; - -void rtw_proc_init_one(struct net_device *dev) -{ - struct proc_dir_entry *dir_dev = NULL; - struct proc_dir_entry *entry=NULL; - _adapter *padapter = rtw_netdev_priv(dev); - - if(rtw_proc == NULL) - { - if(padapter->chip_type == RTL8188C_8192C) - { - _rtw_memcpy(rtw_proc_name, RTL8192C_PROC_NAME, sizeof(RTL8192C_PROC_NAME)); - } - else if(padapter->chip_type == RTL8192D) - { - _rtw_memcpy(rtw_proc_name, RTL8192D_PROC_NAME, sizeof(RTL8192D_PROC_NAME)); - } - -#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, proc_net); -#else - rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net); -#endif - if (rtw_proc == NULL) { - DBG_8192C(KERN_ERR "Unable to create rtw_proc directory\n"); - return; - } - - entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - } - - - - if(padapter->dir_dev == NULL) - { - padapter->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, - rtw_proc); - - dir_dev = padapter->dir_dev; - - if(dir_dev==NULL) - { - if(rtw_proc_cnt == 0) - { - if(rtw_proc){ -#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - remove_proc_entry(rtw_proc_name, proc_net); -#else - remove_proc_entry(rtw_proc_name, init_net.proc_net); -#endif - rtw_proc = NULL; - } - } - - DBG_8192C("Unable to create dir_dev directory\n"); - return; - } - } - else - { - return; - } - - rtw_proc_cnt++; - - entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO, - dir_dev, proc_get_write_reg, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - entry->write_proc = proc_set_write_reg; - - entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO, - dir_dev, proc_get_read_reg, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - entry->write_proc = proc_set_read_reg; - - - entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO, - dir_dev, proc_get_fwstate, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - - entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO, - dir_dev, proc_get_sec_info, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - - entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO, - dir_dev, proc_get_mlmext_state, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - - entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO, - dir_dev, proc_get_qos_option, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO, - dir_dev, proc_get_ht_option, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO, - dir_dev, proc_get_rf_info, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO, - dir_dev, proc_get_ap_info, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO, - dir_dev, proc_get_adapter_state, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - - entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO, - dir_dev, proc_get_trx_info, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - -#ifdef CONFIG_AP_MODE - - entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO, - dir_dev, proc_get_all_sta_info, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } -#endif - -#ifdef MEMORY_LEAK_DEBUG - entry = create_proc_read_entry("_malloc_cnt", S_IFREG | S_IRUGO, - dir_dev, proc_get_malloc_cnt, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } -#endif - -#ifdef CONFIG_FIND_BEST_CHANNEL - entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO, - dir_dev, proc_get_best_channel, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } -#endif - - entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO, - dir_dev, proc_get_rx_signal, dev); - if (!entry) { - DBG_871X("Unable to create_proc_read_entry!\n"); - return; - } - entry->write_proc = proc_set_rx_signal; - -} - -void rtw_proc_remove_one(struct net_device *dev) -{ - struct proc_dir_entry *dir_dev = NULL; - _adapter *padapter = rtw_netdev_priv(dev); - - - dir_dev = padapter->dir_dev; - padapter->dir_dev = NULL; - - if (dir_dev) { - - remove_proc_entry("write_reg", dir_dev); - remove_proc_entry("read_reg", dir_dev); - remove_proc_entry("fwstate", dir_dev); - remove_proc_entry("sec_info", dir_dev); - remove_proc_entry("mlmext_state", dir_dev); - remove_proc_entry("qos_option", dir_dev); - remove_proc_entry("ht_option", dir_dev); - remove_proc_entry("rf_info", dir_dev); - remove_proc_entry("ap_info", dir_dev); - remove_proc_entry("adapter_state", dir_dev); - remove_proc_entry("trx_info", dir_dev); - -#ifdef CONFIG_AP_MODE - remove_proc_entry("all_sta_info", dir_dev); -#endif - -#ifdef MEMORY_LEAK_DEBUG - remove_proc_entry("_malloc_cnt", dir_dev); -#endif - -#ifdef CONFIG_FIND_BEST_CHANNEL - remove_proc_entry("best_channel", dir_dev); -#endif - remove_proc_entry("rx_signal", dir_dev); - - remove_proc_entry(dev->name, rtw_proc); - dir_dev = NULL; - - } - else - { - return; - } - - rtw_proc_cnt--; - - if(rtw_proc_cnt == 0) - { - if(rtw_proc){ - remove_proc_entry("ver_info", rtw_proc); - -#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - remove_proc_entry(rtw_proc_name, proc_net); -#else - remove_proc_entry(rtw_proc_name, init_net.proc_net); -#endif - rtw_proc = NULL; - } - } -} -#endif - -uint loadparam( _adapter *padapter, _nic_hdl pnetdev) -{ - - uint status = _SUCCESS; - struct registry_priv *registry_par = &padapter->registrypriv; - -_func_enter_; - - registry_par->chip_version = (u8)rtw_chip_version; - registry_par->rfintfs = (u8)rtw_rfintfs; - registry_par->lbkmode = (u8)rtw_lbkmode; - //registry_par->hci = (u8)hci; - registry_par->network_mode = (u8)rtw_network_mode; - - _rtw_memcpy(registry_par->ssid.Ssid, "ANY", 3); - registry_par->ssid.SsidLength = 3; - - registry_par->channel = (u8)rtw_channel; - registry_par->wireless_mode = (u8)rtw_wireless_mode; - registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ; - registry_par->vcs_type = (u8)rtw_vcs_type; - registry_par->rts_thresh=(u16)rtw_rts_thresh; - registry_par->frag_thresh=(u16)rtw_frag_thresh; - registry_par->preamble = (u8)rtw_preamble; - registry_par->scan_mode = (u8)rtw_scan_mode; - registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr; - registry_par->soft_ap= (u8)rtw_soft_ap; - //registry_par->smart_ps = (u8)rtw_smart_ps; - registry_par->power_mgnt = (u8)rtw_power_mgnt; - registry_par->ips_mode = (u8)rtw_ips_mode; - registry_par->radio_enable = (u8)rtw_radio_enable; - registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt; - registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt; - registry_par->busy_thresh = (u16)rtw_busy_thresh; - //registry_par->qos_enable = (u8)rtw_qos_enable; - registry_par->ack_policy = (u8)rtw_ack_policy; - registry_par->mp_mode = (u8)rtw_mp_mode; - registry_par->software_encrypt = (u8)rtw_software_encrypt; - registry_par->software_decrypt = (u8)rtw_software_decrypt; - - //UAPSD - registry_par->wmm_enable = (u8)rtw_wmm_enable; - registry_par->uapsd_enable = (u8)rtw_uapsd_enable; - registry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp; - registry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en; - registry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en; - registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en; - registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en; - -#ifdef CONFIG_80211N_HT - registry_par->ht_enable = (u8)rtw_ht_enable; - registry_par->cbw40_enable = (u8)rtw_cbw40_enable; - registry_par->ampdu_enable = (u8)rtw_ampdu_enable; -#endif - - registry_par->rf_config = (u8)rtw_rf_config; - registry_par->low_power = (u8)rtw_low_power; - - - registry_par->wifi_spec = (u8)rtw_wifi_spec; - - registry_par->channel_plan = (u8)rtw_channel_plan; - -#ifdef CONFIG_BT_COEXIST - registry_par->bt_iso = (u8)rtw_bt_iso; - registry_par->bt_sco = (u8)rtw_bt_sco; - registry_par->bt_ampdu = (u8)rtw_bt_ampdu; -#endif - registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq; - - registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg; - -#ifdef CONFIG_AUTOSUSPEND - registry_par->usbss_enable = (u8)rtw_enusbss;//0:disable,1:enable -#endif -#ifdef SUPPORT_HW_RFOFF_DETECTED - registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;//0:disable,1:enable,2:by EFUSE config - registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;//0:disable,1:enable -#endif - - registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc; - -#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE - snprintf(registry_par->adaptor_info_caching_file_path, PATH_LENGTH_MAX, "%s",rtw_adaptor_info_caching_file_path); - registry_par->adaptor_info_caching_file_path[PATH_LENGTH_MAX-1]=0; -#endif - -#ifdef CONFIG_LAYER2_ROAMING - registry_par->max_roaming_times = (u8)rtw_max_roaming_times; -#endif - -_func_exit_; - - return status; - -} - -static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); - struct sockaddr *addr = p; - - if(padapter->bup == _FALSE) - { - //DBG_8192C("r8711_net_set_mac_address(), MAC=%x:%x:%x:%x:%x:%x\n", addr->sa_data[0], addr->sa_data[1], addr->sa_data[2], addr->sa_data[3], - //addr->sa_data[4], addr->sa_data[5]); - _rtw_memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN); - //_rtw_memcpy(pnetdev->dev_addr, addr->sa_data, ETH_ALEN); - //padapter->bset_hwaddr = _TRUE; - } - - return 0; -} - -static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - struct recv_priv *precvpriv = &(padapter->recvpriv); - - padapter->stats.tx_packets = pxmitpriv->tx_pkts;//pxmitpriv->tx_pkts++; - padapter->stats.rx_packets = precvpriv->rx_pkts;//precvpriv->rx_pkts++; - padapter->stats.tx_dropped = pxmitpriv->tx_drop; - padapter->stats.rx_dropped = precvpriv->rx_drop; - padapter->stats.tx_bytes = pxmitpriv->tx_bytes; - padapter->stats.rx_bytes = precvpriv->rx_bytes; - - return &padapter->stats; -} - -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) -static const struct net_device_ops rtw_netdev_ops = { - .ndo_open = netdev_open, - .ndo_stop = netdev_close, - .ndo_start_xmit = rtw_xmit_entry, - .ndo_set_mac_address = rtw_net_set_mac_address, - .ndo_get_stats = rtw_net_get_stats, - .ndo_do_ioctl = rtw_ioctl, -}; -#endif - -int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname) -{ - _adapter *padapter = rtw_netdev_priv(pnetdev); - -#ifdef CONFIG_EASY_REPLACEMENT - struct net_device *TargetNetdev = NULL; - _adapter *TargetAdapter = NULL; - struct net *devnet = NULL; - - if(padapter->bDongle == 1) - { -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - TargetNetdev = dev_get_by_name("wlan0"); -#else - #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) - devnet = pnetdev->nd_net; - #else - devnet = dev_net(pnetdev); - #endif - TargetNetdev = dev_get_by_name(devnet, "wlan0"); -#endif - if(TargetNetdev) { - DBG_8192C("Force onboard module driver disappear !!!\n"); - TargetAdapter = rtw_netdev_priv(TargetNetdev); - TargetAdapter->DriverState = DRIVER_DISAPPEAR; - - padapter->pid[0] = TargetAdapter->pid[0]; - padapter->pid[1] = TargetAdapter->pid[1]; - padapter->pid[2] = TargetAdapter->pid[2]; - - dev_put(TargetNetdev); - unregister_netdev(TargetNetdev); -#ifdef CONFIG_PROC_DEBUG - if(TargetAdapter->chip_type == padapter->chip_type) - rtw_proc_remove_one(TargetNetdev); -#endif - padapter->DriverState = DRIVER_REPLACE_DONGLE; - } - } -#endif - - if(dev_alloc_name(pnetdev, ifname) < 0) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("dev_alloc_name, fail! \n")); - } - - netif_carrier_off(pnetdev); - //netif_stop_queue(pnetdev); - - return 0; -} - -struct net_device *rtw_init_netdev(_adapter *old_padapter) -{ - _adapter *padapter; - struct net_device *pnetdev; - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("+init_net_dev\n")); - - if(old_padapter != NULL) - pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(_adapter), (void *)old_padapter); - else - pnetdev = rtw_alloc_etherdev(sizeof(_adapter)); - - if (!pnetdev) - return NULL; - - padapter = rtw_netdev_priv(pnetdev); - padapter->pnetdev = pnetdev; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - SET_MODULE_OWNER(pnetdev); -#endif - - //pnetdev->init = NULL; -#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) - - DBG_8192C("register rtw_netdev_ops to netdev_ops\n"); - pnetdev->netdev_ops = &rtw_netdev_ops; - -#else - pnetdev->open = netdev_open; - pnetdev->stop = netdev_close; - - pnetdev->hard_start_xmit = rtw_xmit_entry; - - pnetdev->set_mac_address = rtw_net_set_mac_address; - pnetdev->get_stats = rtw_net_get_stats; - - pnetdev->do_ioctl = rtw_ioctl; - -#endif - - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - pnetdev->features |= NETIF_F_IP_CSUM; -#endif - //pnetdev->tx_timeout = NULL; - pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */ - - pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def; - -#ifdef WIRELESS_SPY - //priv->wireless_data.spy_data = &priv->spy_data; - //pnetdev->wireless_data = &priv->wireless_data; -#endif - - //step 2. - loadparam(padapter, pnetdev); - - return pnetdev; - -} - -u32 rtw_start_drv_threads(_adapter *padapter) -{ - - u32 _status = _SUCCESS; - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_start_drv_threads\n")); - -#ifdef CONFIG_SDIO_HCI - padapter->xmitThread = kernel_thread(rtw_xmit_thread, padapter, CLONE_FS|CLONE_FILES); - if(padapter->xmitThread < 0) - _status = _FAIL; -#endif - -#ifdef CONFIG_RECV_THREAD_MODE - padapter->recvThread = kernel_thread(recv_thread, padapter, CLONE_FS|CLONE_FILES); - if(padapter->recvThread < 0) - _status = _FAIL; -#endif - - padapter->cmdThread = kernel_thread(rtw_cmd_thread, padapter, CLONE_FS|CLONE_FILES); - if(padapter->cmdThread < 0) - _status = _FAIL; - -#ifdef CONFIG_EVENT_THREAD_MODE - padapter->evtThread = kernel_thread(event_thread, padapter, CLONE_FS|CLONE_FILES); - if(padapter->evtThread < 0) - _status = _FAIL; -#endif - - return _status; - -} - -void rtw_stop_drv_threads (_adapter *padapter) -{ - RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_stop_drv_threads\n")); - - //Below is to termindate rtw_cmd_thread & event_thread... - _rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema); - //_rtw_up_sema(&padapter->cmdpriv.cmd_done_sema); - if(padapter->cmdThread){ - _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); - } - -#ifdef CONFIG_EVENT_THREAD_MODE - _rtw_up_sema(&padapter->evtpriv.evt_notify); - if(padapter->evtThread){ - _rtw_down_sema(&padapter->evtpriv.terminate_evtthread_sema); - } -#endif - -#ifdef CONFIG_XMIT_THREAD_MODE - // Below is to termindate tx_thread... - _rtw_up_sema(&padapter->xmitpriv.xmit_sema); - _rtw_down_sema(&padapter->xmitpriv.terminate_xmitthread_sema); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt: rtw_xmit_thread can be terminated ! \n")); -#endif - -#ifdef CONFIG_RECV_THREAD_MODE - // Below is to termindate rx_thread... - _rtw_up_sema(&padapter->recvpriv.recv_sema); - _rtw_down_sema(&padapter->recvpriv.terminate_recvthread_sema); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt:recv_thread can be terminated! \n")); -#endif - - -} - -u8 rtw_init_default_value(_adapter *padapter) -{ - u8 ret = _SUCCESS; - struct registry_priv* pregistrypriv = &padapter->registrypriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct recv_priv *precvpriv = &padapter->recvpriv; - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - //xmit_priv - pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; - pxmitpriv->vcs = pregistrypriv->vcs_type; - pxmitpriv->vcs_type = pregistrypriv->vcs_type; - //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; - pxmitpriv->frag_len = pregistrypriv->frag_thresh; - - - - //recv_priv - - - //mlme_priv - pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec - pmlmepriv->scan_mode = SCAN_ACTIVE; - - //qos_priv - //pmlmepriv->qospriv.qos_option = pregistrypriv->wmm_enable; - - //ht_priv -#ifdef CONFIG_80211N_HT - pmlmepriv->htpriv.ampdu_enable = _FALSE;//set to disabled -#endif - - //security_priv - //rtw_get_encrypt_decrypt_from_registrypriv(padapter); - psecuritypriv->binstallGrpkey = _FAIL; - psecuritypriv->sw_encrypt=pregistrypriv->software_encrypt; - psecuritypriv->sw_decrypt=pregistrypriv->software_decrypt; - - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system - psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; - - psecuritypriv->dot11PrivacyKeyIndex = 0; - - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; - psecuritypriv->dot118021XGrpKeyid = 1; - - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled; - - - //pwrctrl_priv - - - //registry_priv - rtw_init_registrypriv_dev_network(padapter); - rtw_update_registrypriv_dev_network(padapter); - - - //hal_priv - padapter->HalFunc.init_default_value(padapter); - - //misc. - padapter->bReadPortCancel = _FALSE; - padapter->bWritePortCancel = _FALSE; - padapter->bRxRSSIDisplay = 0; - - return ret; -} - -u8 rtw_reset_drv_sw(_adapter *padapter) -{ - u8 ret8=_SUCCESS; - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - - //hal_priv - padapter->HalFunc.init_default_value(padapter); - padapter->bReadPortCancel = _FALSE; - padapter->bWritePortCancel = _FALSE; - padapter->bRxRSSIDisplay = 0; - pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec - pmlmepriv->scan_mode = SCAN_ACTIVE; // 1: active scan ,0 passive scan - - pwrctrlpriv->bips_processing = _FALSE; - pwrctrlpriv->rf_pwrstate = rf_on; - pwrctrlpriv->bInSuspend = _FALSE; - - padapter->xmitpriv.tx_pkts = 0; - padapter->recvpriv.rx_pkts = 0; - - pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; - - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY |_FW_UNDER_LINKING); - -#ifdef CONFIG_AUTOSUSPEND - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) - padapter->dvobjpriv.pusbdev->autosuspend_disabled = 1;//autosuspend disabled by the user - #endif -#endif - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - if(padapter->HalFunc.sreset_reset_value) - padapter->HalFunc.sreset_reset_value(padapter); -#endif - pwrctrlpriv->pwr_state_check_cnts = 0; - - //mlmeextpriv - padapter->mlmeextpriv.sitesurvey_res.state= SCAN_DISABLE; - -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - rtw_set_signal_stat_timer(&padapter->recvpriv); -#endif - - return ret8; -} - - -u8 rtw_init_drv_sw(_adapter *padapter) -{ - - u8 ret8=_SUCCESS; - -_func_enter_; - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_init_drv_sw\n")); - - if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init cmd_priv\n")); - ret8=_FAIL; - goto exit; - } - - padapter->cmdpriv.padapter=padapter; - - if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init evt_priv\n")); - ret8=_FAIL; - goto exit; - } - - - if (rtw_init_mlme_priv(padapter) == _FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_priv\n")); - ret8=_FAIL; - goto exit; - } - - if(init_mlme_ext_priv(padapter) == _FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_ext_priv\n")); - ret8=_FAIL; - goto exit; - } - - if(_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) - { - DBG_871X("Can't _rtw_init_xmit_priv\n"); - ret8=_FAIL; - goto exit; - } - - if(_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) - { - DBG_871X("Can't _rtw_init_recv_priv\n"); - ret8=_FAIL; - goto exit; - } - - _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); - //_init_timer(&(padapter->securitypriv.tkip_timer), padapter->pnetdev, rtw_use_tkipkey_handler, padapter); - - if(_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) - { - DBG_871X("Can't _rtw_init_sta_priv\n"); - ret8=_FAIL; - goto exit; - } - - padapter->stapriv.padapter = padapter; - - rtw_init_bcmc_stainfo(padapter); - - rtw_init_pwrctrl_priv(padapter); - - //_rtw_memset((u8 *)&padapter->qospriv, 0, sizeof (struct qos_priv));//move to mlme_priv - -#ifdef CONFIG_MP_INCLUDED - if (init_mp_priv(padapter) == _FAIL) { - ERR_8192C("%s: initialize MP private data Fail!\n", __func__); - } -#endif - - ret8 = rtw_init_default_value(padapter); - - rtw_dm_init(padapter); - rtw_sw_led_init(padapter); - -#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM - rtw_sreset_init(padapter); -#endif//SILENT_RESET_FOR_SPECIFIC_PLATFOM - -exit: - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_init_drv_sw\n")); - - _func_exit_; - - return ret8; - -} - -void rtw_cancel_all_timer(_adapter *padapter) -{ - RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_cancel_all_timer\n")); - - _cancel_timer_ex(&padapter->mlmepriv.assoc_timer); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel association timer complete! \n")); - - //_cancel_timer_ex(&padapter->securitypriv.tkip_timer); - //RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel tkip_timer! \n")); - - _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel scan_to_timer! \n")); - - _cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel dynamic_chk_timer! \n")); - - // cancel sw led timer - rtw_sw_led_deinit(padapter); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel DeInitSwLeds! \n")); - - _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer); - - -#ifdef CONFIG_SET_SCAN_DENY_TIMER - _cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer); - RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel set_scan_deny_timer! \n")); -#endif - -#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS - _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer); -#endif - - // cancel dm timer - padapter->HalFunc.dm_deinit(padapter); - -} - -u8 rtw_free_drv_sw(_adapter *padapter) -{ - - - struct net_device *pnetdev = (struct net_device*)padapter->pnetdev; - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("==>rtw_free_drv_sw")); - - free_mlme_ext_priv(&padapter->mlmeextpriv); - - rtw_free_cmd_priv(&padapter->cmdpriv); - - rtw_free_evt_priv(&padapter->evtpriv); - - rtw_free_mlme_priv(&padapter->mlmepriv); - - //free_io_queue(padapter); - - _rtw_free_xmit_priv(&padapter->xmitpriv); - - _rtw_free_sta_priv(&padapter->stapriv); //will free bcmc_stainfo here - - _rtw_free_recv_priv(&padapter->recvpriv); - - rtw_free_pwrctrl_priv(padapter); - - //rtw_mfree((void *)padapter, sizeof (padapter)); - -#ifdef CONFIG_DRVEXT_MODULE - free_drvext(&padapter->drvextpriv); -#endif - - padapter->HalFunc.free_hal_data(padapter); - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("<==rtw_free_drv_sw\n")); - - //free the old_pnetdev - if(padapter->old_pnetdev) { - free_netdev(padapter->old_pnetdev); - padapter->old_pnetdev = NULL; - } - - if(pnetdev) - { - rtw_free_netdev(pnetdev); - } - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_free_drv_sw\n")); - - return _SUCCESS; - -} - -static int netdev_open(struct net_device *pnetdev) -{ - uint status; - _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - dev_open\n")); - //DBG_8192C("+871x_drv - drv_open, bup=%d\n", padapter->bup); - - if(pwrctrlpriv->ps_flag == _TRUE){ - padapter->net_closed = _FALSE; - goto netdev_open_normal_process; - } - - if(padapter->bup == _FALSE) - { - padapter->bDriverStopped = _FALSE; - padapter->bSurpriseRemoved = _FALSE; - padapter->bCardDisableWOHSM = _FALSE; - - status = rtw_hal_init(padapter); - if (status ==_FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("rtl871x_hal_init(): Can't init h/w!\n")); - goto netdev_open_error; - } - - DBG_8192C("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr)); - - - status=rtw_start_drv_threads(padapter); - if(status ==_FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n")); - goto netdev_open_error; - } - - - if (init_hw_mlme_ext(padapter) == _FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("can't init mlme_ext_priv\n")); - goto netdev_open_error; - } - - -#ifdef CONFIG_DRVEXT_MODULE - init_drvext(padapter); -#endif - - if(padapter->intf_start) - { - padapter->intf_start(padapter); - } - -#ifdef CONFIG_PROC_DEBUG -#ifndef RTK_DMP_PLATFORM - rtw_proc_init_one(pnetdev); -#endif -#endif - padapter->bup = _TRUE; - } - padapter->net_closed = _FALSE; - - _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); - - if(( pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE ) ||(padapter->pwrctrlpriv.bHWPwrPindetect)) - { - padapter->pwrctrlpriv.bips_processing = _FALSE; - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); - } - - //netif_carrier_on(pnetdev);//call this func when rtw_joinbss_event_callback return success - if(!netif_queue_stopped(pnetdev)) - netif_start_queue(pnetdev); - else - netif_wake_queue(pnetdev); - -netdev_open_normal_process: - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - dev_open\n")); - //DBG_8192C("-871x_drv - drv_open, bup=%d\n", padapter->bup); - - return 0; - -netdev_open_error: - - padapter->bup = _FALSE; - - netif_carrier_off(pnetdev); - netif_stop_queue(pnetdev); - - RT_TRACE(_module_os_intfs_c_,_drv_err_,("-871x_drv - dev_open, fail!\n")); - //DBG_8192C("-871x_drv - drv_open fail, bup=%d\n", padapter->bup); - - return (-1); - -} - - - -#ifdef CONFIG_IPS -int ips_netdrv_open(_adapter *padapter) -{ - int status = _SUCCESS; - padapter->net_closed = _FALSE; - DBG_8192C("===> %s.........\n",__FUNCTION__); - - - padapter->bDriverStopped = _FALSE; - padapter->bSurpriseRemoved = _FALSE; - padapter->bCardDisableWOHSM = _FALSE; - padapter->bup = _TRUE; - - status = rtw_hal_init(padapter); - if (status ==_FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("ips_netdrv_open(): Can't init h/w!\n")); - goto netdev_open_error; - } - - if(padapter->intf_start) - { - padapter->intf_start(padapter); - } - - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); - _set_timer(&padapter->mlmepriv.dynamic_chk_timer,5000); - - return _SUCCESS; - -netdev_open_error: - padapter->bup = _FALSE; - DBG_8192C("-ips_netdrv_open - drv_open failure, bup=%d\n", padapter->bup); - - return _FAIL; -} - - -int rtw_ips_pwr_up(_adapter *padapter) -{ - int result; - u32 start_time = rtw_get_current_time(); - DBG_8192C("===> rtw_ips_pwr_up..............\n"); - rtw_reset_drv_sw(padapter); - result = ips_netdrv_open(padapter); - DBG_8192C("<=== rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time)); - return result; - -} - -void rtw_ips_pwr_down(_adapter *padapter) -{ - u32 start_time = rtw_get_current_time(); - DBG_8192C("===> rtw_ips_pwr_down...................\n"); - - padapter->bCardDisableWOHSM = _TRUE; - padapter->net_closed = _TRUE; - - rtw_led_control(padapter, LED_CTL_NO_LINK); - - rtw_ips_dev_unload(padapter); - padapter->bCardDisableWOHSM = _FALSE; - DBG_8192C("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time)); -} -#endif -void rtw_ips_dev_unload(_adapter *padapter) -{ - struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; - struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); - DBG_8192C("====> %s...\n",__FUNCTION__); - - padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_FIFO_CLEARN_UP, 0); - - if(padapter->intf_stop) - { - padapter->intf_stop(padapter); - } - - //s5. - if(padapter->bSurpriseRemoved == _FALSE) - { - rtw_hal_deinit(padapter); - } - -} - -int pm_netdev_open(struct net_device *pnetdev,u8 bnormal) -{ - int status; - if(bnormal) - status = netdev_open(pnetdev); -#ifdef CONFIG_IPS - else - status = (_SUCCESS == ips_netdrv_open((_adapter *)rtw_netdev_priv(pnetdev)))?(0):(-1); -#endif - - return status; -} -//extern int rfpwrstate_check(_adapter *padapter); -static int netdev_close(struct net_device *pnetdev) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("+871x_drv - drv_close\n")); - - if(padapter->pwrctrlpriv.bInternalAutoSuspend == _TRUE) - { - //rfpwrstate_check(padapter); - if(padapter->pwrctrlpriv.rf_pwrstate == rf_off) - padapter->pwrctrlpriv.ps_flag = _TRUE; - } - padapter->net_closed = _TRUE; - -/* if(!padapter->hw_init_completed) - { - DBG_8192C("(1)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed); - - padapter->bDriverStopped = _TRUE; - - rtw_dev_unload(padapter); - } - else*/ - if(padapter->pwrctrlpriv.rf_pwrstate == rf_on){ - //DBG_8192C("(2)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed); - - //s1. - if(pnetdev) - { - if (!netif_queue_stopped(pnetdev)) - netif_stop_queue(pnetdev); - } - -#ifndef CONFIG_ANDROID - //s2. - //s2-1. issue rtw_disassoc_cmd to fw - rtw_disassoc_cmd(padapter); - //s2-2. indicate disconnect to os - rtw_indicate_disconnect(padapter); - //s2-3. - rtw_free_assoc_resources(padapter); - //s2-4. - rtw_free_network_queue(padapter,_TRUE); -#endif - // Close LED - rtw_led_control(padapter, LED_CTL_POWER_OFF); - } - - RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - drv_close\n")); - //DBG_8192C("-871x_drv - drv_close, bup=%d\n", padapter->bup); - - return 0; - -} - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c deleted file mode 100755 index 02bceb48a96e..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c +++ /dev/null @@ -1,391 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RECV_OSDEP_C_ - -#include -#include -#include - -#include -#include - -#include -#include - -#ifdef CONFIG_USB_HCI -#include -#endif - -//init os related resource in struct recv_priv -int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter) -{ - int res=_SUCCESS; - - return res; -} - -//alloc os related resource in union recv_frame -int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe) -{ - int res=_SUCCESS; - - precvframe->u.hdr.pkt_newalloc = precvframe->u.hdr.pkt = NULL; - - return res; - -} - -//free os related resource in union recv_frame -void rtw_os_recv_resource_free(struct recv_priv *precvpriv) -{ - -} - - -//alloc os related resource in struct recv_buf -int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf) -{ - int res=_SUCCESS; - -#ifdef CONFIG_USB_HCI - struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; - struct usb_device *pusbd = pdvobjpriv->pusbdev; - - precvbuf->irp_pending = _FALSE; - precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL); - if(precvbuf->purb == NULL){ - res = _FAIL; - } - - precvbuf->pskb = NULL; - - precvbuf->reuse = _FALSE; - - precvbuf->pallocated_buf = precvbuf->pbuf = NULL; - - precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL; - - precvbuf->transfer_len = 0; - - precvbuf->len = 0; - - #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - precvbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)precvbuf->alloc_sz, GFP_ATOMIC, &precvbuf->dma_transfer_addr); - precvbuf->pbuf = precvbuf->pallocated_buf; - if(precvbuf->pallocated_buf == NULL) - return _FAIL; - #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX - -#endif //CONFIG_USB_HCI - - -#ifdef CONFIG_SDIO_HCI - precvbuf->pskb = NULL; - - precvbuf->pallocated_buf = precvbuf->pbuf = NULL; - - precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL; - - precvbuf->len = 0; -#endif - return res; - -} - -//free os related resource in struct recv_buf -int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf) -{ - int ret = _SUCCESS; - -#ifdef CONFIG_USB_HCI - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - - struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; - struct usb_device *pusbd = pdvobjpriv->pusbdev; - - rtw_usb_buffer_free(pusbd, (size_t)precvbuf->alloc_sz, precvbuf->pallocated_buf, precvbuf->dma_transfer_addr); - precvbuf->pallocated_buf = NULL; - precvbuf->dma_transfer_addr = 0; - -#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX - - if(precvbuf->purb) - { - //usb_kill_urb(precvbuf->purb); - usb_free_urb(precvbuf->purb); - } - -#endif - - - if(precvbuf->pskb) - dev_kfree_skb_any(precvbuf->pskb); - - - return ret; - -} - -void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup) -{ - union iwreq_data wrqu; - struct iw_michaelmicfailure ev; - struct mlme_priv* pmlmepriv = &padapter->mlmepriv; - - - _rtw_memset( &ev, 0x00, sizeof( ev ) ); - if ( bgroup ) - { - ev.flags |= IW_MICFAILURE_GROUP; - } - else - { - ev.flags |= IW_MICFAILURE_PAIRWISE; - } - - ev.src_addr.sa_family = ARPHRD_ETHER; - _rtw_memcpy( ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); - - _rtw_memset( &wrqu, 0x00, sizeof( wrqu ) ); - wrqu.data.length = sizeof( ev ); - - wireless_send_event( padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu, (char*) &ev ); -} - -void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame) -{ -#ifdef CONFIG_HOSTAPD_MLME - _pkt *skb; - struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; - struct net_device *pmgnt_netdev = phostapdpriv->pmgnt_netdev; - - RT_TRACE(_module_recv_osdep_c_, _drv_info_, ("+rtw_hostapd_mlme_rx\n")); - - skb = precv_frame->u.hdr.pkt; - - if (skb == NULL) - return; - - skb->data = precv_frame->u.hdr.rx_data; - skb->tail = precv_frame->u.hdr.rx_tail; - skb->len = precv_frame->u.hdr.len; - - //pskb_copy = skb_copy(skb, GFP_ATOMIC); -// if(skb == NULL) goto _exit; - - skb->dev = pmgnt_netdev; - skb->ip_summed = CHECKSUM_NONE; - skb->pkt_type = PACKET_OTHERHOST; - //skb->protocol = __constant_htons(0x0019); /*ETH_P_80211_RAW*/ - skb->protocol = __constant_htons(0x0003); /*ETH_P_80211_RAW*/ - - //DBG_8192C("(1)data=0x%x, head=0x%x, tail=0x%x, mac_header=0x%x, len=%d\n", skb->data, skb->head, skb->tail, skb->mac_header, skb->len); - - //skb->mac.raw = skb->data; - skb_reset_mac_header(skb); - - //skb_pull(skb, 24); - _rtw_memset(skb->cb, 0, sizeof(skb->cb)); - - netif_rx(skb); - - precv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call netif_rx() -#endif -} - -int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame) -{ - struct recv_priv *precvpriv; - _queue *pfree_recv_queue; - _pkt *skb; - struct mlme_priv*pmlmepriv = &padapter->mlmepriv; -#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX - struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; -#endif - -_func_enter_; - - precvpriv = &(padapter->recvpriv); - pfree_recv_queue = &(precvpriv->free_recv_queue); - -#ifdef CONFIG_DRVEXT_MODULE - if (drvext_rx_handler(padapter, precv_frame->u.hdr.rx_data, precv_frame->u.hdr.len) == _SUCCESS) - { - goto _recv_indicatepkt_drop; - } -#endif - - skb = precv_frame->u.hdr.pkt; - if(skb == NULL) - { - RT_TRACE(_module_recv_osdep_c_,_drv_err_,("rtw_recv_indicatepkt():skb==NULL something wrong!!!!\n")); - goto _recv_indicatepkt_drop; - } - - RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():skb != NULL !!!\n")); - RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():precv_frame->u.hdr.rx_head=%p precv_frame->hdr.rx_data=%p\n", precv_frame->u.hdr.rx_head, precv_frame->u.hdr.rx_data)); - RT_TRACE(_module_recv_osdep_c_,_drv_info_,("precv_frame->hdr.rx_tail=%p precv_frame->u.hdr.rx_end=%p precv_frame->hdr.len=%d \n", precv_frame->u.hdr.rx_tail, precv_frame->u.hdr.rx_end, precv_frame->u.hdr.len)); - - skb->data = precv_frame->u.hdr.rx_data; - -#ifdef NET_SKBUFF_DATA_USES_OFFSET - skb_set_tail_pointer(skb, precv_frame->u.hdr.len); -#else - skb->tail = precv_frame->u.hdr.rx_tail; -#endif - - skb->len = precv_frame->u.hdr.len; - - RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n skb->head=%p skb->data=%p skb->tail=%p skb->end=%p skb->len=%d\n", skb->head, skb->data, skb->tail, skb->end, skb->len)); - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) - { - _pkt *pskb2=NULL; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; - int bmcast = IS_MCAST(pattrib->dst); - - //DBG_871X("bmcast=%d\n", bmcast); - - if(_rtw_memcmp(pattrib->dst, myid(&padapter->eeprompriv), ETH_ALEN)==_FALSE) - { - //DBG_871X("not ap psta=%p, addr=%pM\n", psta, pattrib->dst); - - if(bmcast) - { - psta = rtw_get_bcmc_stainfo(padapter); - pskb2 = skb_clone(skb, GFP_ATOMIC); - } else { - psta = rtw_get_stainfo(pstapriv, pattrib->dst); - } - - if(psta) - { - //DBG_871X("directly forwarding to the rtw_xmit_entry\n"); - - //skb->ip_summed = CHECKSUM_NONE; - //skb->protocol = eth_type_trans(skb, pnetdev); - - skb->dev = padapter->pnetdev; - rtw_xmit_entry(skb, padapter->pnetdev); - - if(bmcast) - skb = pskb2; - else - goto _recv_indicatepkt_end; - } - - - } - else// to APself - { - //DBG_871X("to APSelf\n"); - } - } - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX - if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) { - skb->ip_summed = CHECKSUM_UNNECESSARY; - //DBG_8192C("CHECKSUM_UNNECESSARY \n"); - } else { - skb->ip_summed = CHECKSUM_NONE; - //DBG_8192C("CHECKSUM_NONE(%d, %d) \n", pattrib->tcpchk_valid, pattrib->tcp_chkrpt); - } -#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */ - - skb->ip_summed = CHECKSUM_NONE; - -#endif - - skb->dev = padapter->pnetdev; - skb->protocol = eth_type_trans(skb, padapter->pnetdev); - - netif_rx(skb); - -_recv_indicatepkt_end: - - precv_frame->u.hdr.pkt = NULL; // pointers to NULL before rtw_free_recvframe() - - rtw_free_recvframe(precv_frame, pfree_recv_queue); - - RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after netif_rx!!!!\n")); - -_func_exit_; - - return _SUCCESS; - -_recv_indicatepkt_drop: - - //enqueue back to free_recv_queue - if(precv_frame) - rtw_free_recvframe(precv_frame, pfree_recv_queue); - - - precvpriv->rx_drop++; - - return _FAIL; - -_func_exit_; - -} - -void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf) -{ - struct recv_priv *precvpriv = &padapter->recvpriv; - -#ifdef CONFIG_USB_HCI - - precvbuf->ref_cnt--; - - //free skb in recv_buf - dev_kfree_skb_any(precvbuf->pskb); - - precvbuf->pskb = NULL; - precvbuf->reuse = _FALSE; - - if(precvbuf->irp_pending == _FALSE) - { - rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); - } - - -#endif -#ifdef CONFIG_SDIO_HCI - precvbuf->pskb = NULL; -#endif - -} -void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext); -void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext) -{ - struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)FunctionContext; - rtw_reordering_ctrl_timeout_handler(preorder_ctrl); -} - -void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl) -{ - _adapter *padapter = preorder_ctrl->padapter; - - _init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, _rtw_reordering_ctrl_timeout_handler, preorder_ctrl); - -} - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c deleted file mode 100755 index b56b65c26736..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c +++ /dev/null @@ -1,1474 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _HCI_INTF_C_ - -#include -#include -#include -#include -#include -#include -#include - -#ifndef CONFIG_USB_HCI - -#error "CONFIG_USB_HCI shall be on!\n" - -#endif - -#include "wifi_power.h" -#include -#include -#include -#include -#ifdef CONFIG_PLATFORM_RTK_DMP -#include -#endif - -#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) - -#error "Shall be Linux or Windows, but not both!\n" - -#endif - -#ifdef CONFIG_80211N_HT -extern int rtw_ht_enable; -extern int rtw_cbw40_enable; -extern int rtw_ampdu_enable;//for enable tx_ampdu -#endif - -static struct usb_interface *pintf; - -#ifdef CONFIG_GLOBAL_UI_PID -int ui_pid[3] = {0, 0, 0}; -#endif -int sleep_resume = 1; - -extern void rtl8188_power_save_exit(void); -extern void rtl8188_power_save_init(void); - -extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal); -static int rtw_suspend(struct usb_interface *intf, pm_message_t message); -static int rtw_resume(struct usb_interface *intf); -int rtw_resume_process(struct usb_interface *pusb_intf); - - -static int rtw_drv_init(struct usb_interface *pusb_intf,const struct usb_device_id *pdid); -static void rtw_dev_remove(struct usb_interface *pusb_intf); - -#define USB_VENDER_ID_REALTEK 0x0BDA - -//DID_USB_V77_20110721 -static struct usb_device_id rtw_usb_id_tbl[] ={ -#ifdef CONFIG_RTL8192C - /*=== Realtek demoboard ===*/ - {USB_DEVICE(0x0BDA, 0x8191)},//Default ID - - /****** 8188CUS ********/ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8176)},//8188cu 1*1 dongole - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8170)},//8188CE-VAU USB minCard - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817E)},//8188CE-VAU USB minCard - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817A)},//8188cu Slim Solo - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817B)},//8188cu Slim Combo - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817D)},//8188RU High-power USB Dongle - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8754)},//8188 Combo for BC4 - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817F)},//8188RU - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x818A)},//8188CUS-VL - - /****** 8192CUS ********/ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8177)},//8191cu 1*2 - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8178)},//8192cu 2*2 - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817C)},//8192CE-VAU USB minCard - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8186)},//8192CE-VAU USB minCard - - /*=== Customer ID ===*/ - /****** 8188CUS Dongle ********/ - {USB_DEVICE(0x2019, 0xED17)},//PCI - Edimax - {USB_DEVICE(0x0DF6, 0x0052)},//Sitecom - Edimax - {USB_DEVICE(0x7392, 0x7811)},//Edimax - Edimax - {USB_DEVICE(0x07B8, 0x8189)},//Abocom - Abocom - {USB_DEVICE(0x0EB0, 0x9071)},//NO Brand - Etop - {USB_DEVICE(0x06F8, 0xE033)},//Hercules - Edimax - {USB_DEVICE(0x103C, 0x1629)},//HP - Lite-On ,8188CUS Slim Combo - {USB_DEVICE(0x2001, 0x3308)},//D-Link - Alpha - {USB_DEVICE(0x050D, 0x1102)},//Belkin - Edimax - {USB_DEVICE(0x2019, 0xAB2A)},//Planex - Abocom - {USB_DEVICE(0x20F4, 0x648B)},//TRENDnet - Cameo - {USB_DEVICE(0x4855, 0x0090)},// - Feixun - {USB_DEVICE(0x13D3, 0x3357)},// - AzureWave - {USB_DEVICE(0x0DF6, 0x005C)},//Sitecom - Edimax - {USB_DEVICE(0x0BDA, 0x5088)},//Thinkware - CC&C - {USB_DEVICE(0x4856, 0x0091)},//NetweeN - Feixun - {USB_DEVICE(0x9846, 0x9041)},//Netgear - Cameo - {USB_DEVICE(0x0846, 0x9041)},//Netgear - Cameo - {USB_DEVICE(0x2019, 0x4902)},//Planex - Etop - {USB_DEVICE(0x2019, 0xAB2E)},//SW-WF02-AD15 -Abocom - - /****** 8188CE-VAU ********/ - {USB_DEVICE(0x13D3, 0x3359)},// - Azwave - {USB_DEVICE(0x13D3, 0x3358)},// - Azwave - - /****** 8188CUS Slim Solo********/ - {USB_DEVICE(0x04F2, 0xAFF7)},//XAVI - XAVI - {USB_DEVICE(0x04F2, 0xAFF9)},//XAVI - XAVI - {USB_DEVICE(0x04F2, 0xAFFA)},//XAVI - XAVI - {USB_DEVICE(0x2019, 0x1201)},//Planex - Vencer - - /****** 8188CUS Slim Combo ********/ - {USB_DEVICE(0x04F2, 0xAFF8)},//XAVI - XAVI - {USB_DEVICE(0x04F2, 0xAFFB)},//XAVI - XAVI - {USB_DEVICE(0x04F2, 0xAFFC)},//XAVI - XAVI - {USB_DEVICE(0x2019, 0x1201)},//Planex - Vencer - - /****** 8192CUS Dongle ********/ - {USB_DEVICE(0x2001, 0x3307)},//D-Link - Cameo - {USB_DEVICE(0x2001, 0x330A)},//D-Link - Alpha - {USB_DEVICE(0x2001, 0x3309)},//D-Link - Alpha - {USB_DEVICE(0x0586, 0x341F)},//Zyxel - Abocom - {USB_DEVICE(0x7392, 0x7822)},//Edimax - Edimax - {USB_DEVICE(0x2019, 0xAB2B)},//Planex - Abocom - {USB_DEVICE(0x07B8, 0x8178)},//Abocom - Abocom - {USB_DEVICE(0x07AA, 0x0056)},//ATKK - Gemtek - {USB_DEVICE(0x4855, 0x0091)},// - Feixun - {USB_DEVICE(0x050D, 0x2102)},//Belkin - Sercomm - {USB_DEVICE(0x050D, 0x2102)},//Belkin - Sercomm - {USB_DEVICE(0x050D, 0x2103)},//Belkin - Edimax - {USB_DEVICE(0x20F4, 0x624D)},//TRENDnet - {USB_DEVICE(0x0DF6, 0x0061)},//Sitecom - Edimax - {USB_DEVICE(0x0B05, 0x17AB)},//ASUS - Edimax - {USB_DEVICE(0x0846, 0x9021)},//Netgear - Sercomm -#endif -#ifdef CONFIG_RTL8192D - /*=== Realtek demoboard ===*/ - /****** 8192DU ********/ - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8193)},//8192DU-VC - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8194)},//8192DU-VS - {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8111)},//Realtek 5G dongle for WiFi Display - - /*=== Customer ID ===*/ - /****** 8192DU-VC ********/ - {USB_DEVICE(0x2019, 0xAB2C)},//PCI - Abocm - {USB_DEVICE(0x2019, 0x4903)},//PCI - ETOP - {USB_DEVICE(0x2019, 0x4904)},//PCI - ETOP - {USB_DEVICE(0x07B8, 0x8193)},//Abocom - Abocom - - /****** 8192DU-VS ********/ - {USB_DEVICE(0x20F4, 0x664B)},//TRENDnet - - /****** 8192DU-WiFi Display Dongle ********/ - {USB_DEVICE(0x2019, 0xAB2D)},//Planex - Abocom ,5G dongle for WiFi Display -#endif - {} /* Terminating entry */ -}; - -int const rtw_usb_id_len = sizeof(rtw_usb_id_tbl) / sizeof(struct usb_device_id); - -static struct specific_device_id specific_device_id_tbl[] = { - {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8177, .flags=SPEC_DEV_ID_DISABLE_HT},//8188cu 1*1 dongole, (b/g mode only) - {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x817E, .flags=SPEC_DEV_ID_DISABLE_HT},//8188CE-VAU USB minCard (b/g mode only) - {.idVendor=0x0b05, .idProduct=0x1791, .flags=SPEC_DEV_ID_DISABLE_HT}, - {.idVendor=0x13D3, .idProduct=0x3311, .flags=SPEC_DEV_ID_DISABLE_HT}, - {.idVendor=0x13D3, .idProduct=0x3359, .flags=SPEC_DEV_ID_DISABLE_HT},//Russian customer -Azwave (8188CE-VAU g mode) -#ifdef RTK_DMP_PLATFORM - {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8111, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // Realtek 5G dongle for WiFi Display - {.idVendor=0x2019, .idProduct=0xAB2D, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // PCI-Abocom 5G dongle for WiFi Display -#endif /* RTK_DMP_PLATFORM */ - {} -}; - -typedef struct _driver_priv{ - - struct usb_driver rtw_usb_drv; - int drv_registered; - -}drv_priv, *pdrv_priv; - - -static drv_priv drvpriv = { - .rtw_usb_drv.name = (char*)DRV_NAME, - .rtw_usb_drv.probe = rtw_drv_init, - .rtw_usb_drv.disconnect = rtw_dev_remove, - .rtw_usb_drv.id_table = rtw_usb_id_tbl, - .rtw_usb_drv.suspend = rtw_suspend, - .rtw_usb_drv.resume = rtw_resume, -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22)) - .rtw_usb_drv.reset_resume = rtw_resume, -#endif -#ifdef CONFIG_AUTOSUSPEND - .rtw_usb_drv.supports_autosuspend = 1, -#endif -}; - -MODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl); - - -static inline int RT_usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) -{ - return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); -} - -static inline int RT_usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd) -{ - return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); -} - -static inline int RT_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) -{ - return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT); -} - -static inline int RT_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) -{ - return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK); -} - -static inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd) -{ - return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_in(epd)); -} - -static inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd) -{ - return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_out(epd)); -} - -static inline int RT_usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd) -{ - return (RT_usb_endpoint_xfer_int(epd) && RT_usb_endpoint_dir_in(epd)); -} - -static inline int RT_usb_endpoint_num(const struct usb_endpoint_descriptor *epd) -{ - return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; -} - -#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC -u8 rtw_init_intf_priv(_adapter * padapter) -{ - u8 rst = _SUCCESS; - - _rtw_mutex_init(&padapter->dvobjpriv.usb_vendor_req_mutex); - - padapter->dvobjpriv.usb_alloc_vendor_req_buf = rtw_zmalloc(MAX_USB_IO_CTL_SIZE); - - if (padapter->dvobjpriv.usb_alloc_vendor_req_buf == NULL){ - padapter->dvobjpriv.usb_alloc_vendor_req_buf =NULL; - printk("alloc usb_vendor_req_buf failed... /n"); - rst = _FAIL; - goto exit; - } - padapter->dvobjpriv.usb_vendor_req_buf = - (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(padapter->dvobjpriv.usb_alloc_vendor_req_buf ), ALIGNMENT_UNIT); -exit: - return rst; - -} - -u8 rtw_deinit_intf_priv(_adapter * padapter) -{ - u8 rst = _SUCCESS; - - if(padapter->dvobjpriv.usb_vendor_req_buf) - { - rtw_mfree(padapter->dvobjpriv.usb_alloc_vendor_req_buf,MAX_USB_IO_CTL_SIZE); - } - - return rst; - -} -#endif -static u32 usb_dvobj_init(_adapter *padapter) -{ - int i; - u8 val8; - int status = _SUCCESS; - struct usb_device_descriptor *pdev_desc; - struct usb_host_config *phost_conf; - struct usb_config_descriptor *pconf_desc; - struct usb_host_interface *phost_iface; - struct usb_interface_descriptor *piface_desc; - struct usb_host_endpoint *phost_endp; - struct usb_endpoint_descriptor *pendp_desc; - struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; - struct usb_device *pusbd = pdvobjpriv->pusbdev; - -_func_enter_; - - pdvobjpriv->padapter = padapter; - - pdvobjpriv->RtNumInPipes = 0; - pdvobjpriv->RtNumOutPipes = 0; - - //padapter->EepromAddressSize = 6; - //pdvobjpriv->nr_endpoint = 6; - - pdev_desc = &pusbd->descriptor; - -#if 0 - DBG_8192C("\n8712_usb_device_descriptor:\n"); - DBG_8192C("bLength=%x\n", pdev_desc->bLength); - DBG_8192C("bDescriptorType=%x\n", pdev_desc->bDescriptorType); - DBG_8192C("bcdUSB=%x\n", pdev_desc->bcdUSB); - DBG_8192C("bDeviceClass=%x\n", pdev_desc->bDeviceClass); - DBG_8192C("bDeviceSubClass=%x\n", pdev_desc->bDeviceSubClass); - DBG_8192C("bDeviceProtocol=%x\n", pdev_desc->bDeviceProtocol); - DBG_8192C("bMaxPacketSize0=%x\n", pdev_desc->bMaxPacketSize0); - DBG_8192C("idVendor=%x\n", pdev_desc->idVendor); - DBG_8192C("idProduct=%x\n", pdev_desc->idProduct); - DBG_8192C("bcdDevice=%x\n", pdev_desc->bcdDevice); - DBG_8192C("iManufacturer=%x\n", pdev_desc->iManufacturer); - DBG_8192C("iProduct=%x\n", pdev_desc->iProduct); - DBG_8192C("iSerialNumber=%x\n", pdev_desc->iSerialNumber); - DBG_8192C("bNumConfigurations=%x\n", pdev_desc->bNumConfigurations); -#endif - - phost_conf = pusbd->actconfig; - pconf_desc = &phost_conf->desc; - -#if 0 - DBG_8192C("\n8712_usb_configuration_descriptor:\n"); - DBG_8192C("bLength=%x\n", pconf_desc->bLength); - DBG_8192C("bDescriptorType=%x\n", pconf_desc->bDescriptorType); - DBG_8192C("wTotalLength=%x\n", pconf_desc->wTotalLength); - DBG_8192C("bNumInterfaces=%x\n", pconf_desc->bNumInterfaces); - DBG_8192C("bConfigurationValue=%x\n", pconf_desc->bConfigurationValue); - DBG_8192C("iConfiguration=%x\n", pconf_desc->iConfiguration); - DBG_8192C("bmAttributes=%x\n", pconf_desc->bmAttributes); - DBG_8192C("bMaxPower=%x\n", pconf_desc->bMaxPower); -#endif - - //DBG_8192C("\n/****** num of altsetting = (%d) ******/\n", pintf->num_altsetting); - - phost_iface = &pintf->altsetting[0]; - piface_desc = &phost_iface->desc; - -#if 0 - DBG_8192C("\n8712_usb_interface_descriptor:\n"); - DBG_8192C("bLength=%x\n", piface_desc->bLength); - DBG_8192C("bDescriptorType=%x\n", piface_desc->bDescriptorType); - DBG_8192C("bInterfaceNumber=%x\n", piface_desc->bInterfaceNumber); - DBG_8192C("bAlternateSetting=%x\n", piface_desc->bAlternateSetting); - DBG_8192C("bNumEndpoints=%x\n", piface_desc->bNumEndpoints); - DBG_8192C("bInterfaceClass=%x\n", piface_desc->bInterfaceClass); - DBG_8192C("bInterfaceSubClass=%x\n", piface_desc->bInterfaceSubClass); - DBG_8192C("bInterfaceProtocol=%x\n", piface_desc->bInterfaceProtocol); - DBG_8192C("iInterface=%x\n", piface_desc->iInterface); -#endif - - pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces; - pdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber; - pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints; - - //DBG_8192C("\ndump usb_endpoint_descriptor:\n"); - - for (i = 0; i < pdvobjpriv->nr_endpoint; i++) - { - phost_endp = phost_iface->endpoint + i; - if (phost_endp) - { - pendp_desc = &phost_endp->desc; - - //DBG_8192C("\nusb_endpoint_descriptor(%d):\n", i); - //DBG_8192C("bLength=%x\n",pendp_desc->bLength); - //DBG_8192C("bDescriptorType=%x\n",pendp_desc->bDescriptorType); - //DBG_8192C("bEndpointAddress=%x\n",pendp_desc->bEndpointAddress); - //DBG_8192C("bmAttributes=%x\n",pendp_desc->bmAttributes); - //DBG_8192C("wMaxPacketSize=%x\n",pendp_desc->wMaxPacketSize); - //DBG_8192C("wMaxPacketSize=%x\n",le16_to_cpu(pendp_desc->wMaxPacketSize)); - //DBG_8192C("bInterval=%x\n",pendp_desc->bInterval); - //DBG_8192C("bRefresh=%x\n",pendp_desc->bRefresh); - //DBG_8192C("bSynchAddress=%x\n",pendp_desc->bSynchAddress); - - if (RT_usb_endpoint_is_bulk_in(pendp_desc)) - { - //DBG_8192C("RT_usb_endpoint_is_bulk_in = %x\n", RT_usb_endpoint_num(pendp_desc)); - pdvobjpriv->RtNumInPipes++; - } - else if (RT_usb_endpoint_is_int_in(pendp_desc)) - { - //DBG_8192C("RT_usb_endpoint_is_int_in = %x, Interval = %x\n", RT_usb_endpoint_num(pendp_desc),pendp_desc->bInterval); - pdvobjpriv->RtNumInPipes++; - } - else if (RT_usb_endpoint_is_bulk_out(pendp_desc)) - { - //DBG_8192C("RT_usb_endpoint_is_bulk_out = %x\n", RT_usb_endpoint_num(pendp_desc)); - pdvobjpriv->RtNumOutPipes++; - } - pdvobjpriv->ep_num[i] = RT_usb_endpoint_num(pendp_desc); - } - } - - DBG_8192C("nr_endpoint=%d, in_num=%d, out_num=%d\n", pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); - - if (pusbd->speed == USB_SPEED_HIGH) - { - pdvobjpriv->ishighspeed = _TRUE; - DBG_8192C("USB_SPEED_HIGH\n"); - } - else - { - pdvobjpriv->ishighspeed = _FALSE; - DBG_8192C("NON USB_SPEED_HIGH\n"); - } - - //.2 - if ((init_io_priv(padapter)) == _FAIL) - { - RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n")); - status = _FAIL; - } -#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC - if((rtw_init_intf_priv(padapter) )== _FAIL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't INIT rtw_init_intf_priv\n")); - status = _FAIL; - } -#endif - //.3 misc - _rtw_init_sema(&(padapter->dvobjpriv.usb_suspend_sema), 0); - - intf_read_chip_version(padapter); - - //.4 usb endpoint mapping - intf_chip_configure(padapter); - - ATOMIC_SET(&pdvobjpriv->continual_urb_error, 0); - -_func_exit_; - - return status; -} - -static void usb_dvobj_deinit(_adapter * padapter){ - - struct dvobj_priv *pdvobjpriv=&padapter->dvobjpriv; - - _func_enter_; -#ifdef CONFIG_USB_VENDOR_REQ_PREALLOC - rtw_deinit_intf_priv(padapter); -#endif - _func_exit_; -} - -static void decide_chip_type_by_usb_device_id(_adapter *padapter, const struct usb_device_id *pdid) -{ - //u32 i; - //u16 vid, pid; - - padapter->chip_type = NULL_CHIP_TYPE; - - //vid = pdid->idVendor; - //pid = pdid->idProduct; - - //TODO: dynamic judge 92c or 92d according to usb vid and pid. -#ifdef CONFIG_RTL8192C - padapter->chip_type = RTL8188C_8192C; - padapter->HardwareType = HARDWARE_TYPE_RTL8192CU; - DBG_8192C("CHIP TYPE: RTL8188C_8192C\n"); -#endif - -#ifdef CONFIG_RTL8192D - padapter->chip_type = RTL8192D; - padapter->HardwareType = HARDWARE_TYPE_RTL8192DU; - DBG_8192C("CHIP TYPE: RTL8192D\n"); -#endif - -} - -static void usb_intf_start(_adapter *padapter) -{ - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_start\n")); - - if(padapter->HalFunc.inirp_init == NULL) - { - RT_TRACE(_module_os_intfs_c_,_drv_err_,("Initialize dvobjpriv.inirp_init error!!!\n")); - } - else - { - padapter->HalFunc.inirp_init(padapter); - } - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_start\n")); - -} - -static void usb_intf_stop(_adapter *padapter) -{ - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_stop\n")); - - //disabel_hw_interrupt - if(padapter->bSurpriseRemoved == _FALSE) - { - //device still exists, so driver can do i/o operation - //TODO: - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("SurpriseRemoved==_FALSE\n")); - } - - //cancel in irp - if(padapter->HalFunc.inirp_deinit !=NULL) - { - padapter->HalFunc.inirp_deinit(padapter); - } - - //cancel out irp - write_port_cancel(padapter); - - //todo:cancel other irps - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_stop\n")); - -} - -static void rtw_dev_unload(_adapter *padapter) -{ - struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; - u8 val8; - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_dev_unload\n")); - - if(padapter->bup == _TRUE) - { - //DBG_8192C("===> rtw_dev_unload\n"); - - padapter->bDriverStopped = _TRUE; - - //s3. - if(padapter->intf_stop) - { - padapter->intf_stop(padapter); - } - - //s4. - if(!padapter->pwrctrlpriv.bInternalAutoSuspend ) - rtw_stop_drv_threads(padapter); - - - //s5. - if(padapter->bSurpriseRemoved == _FALSE) - { - //DBG_8192C("r871x_dev_unload()->rtl871x_hal_deinit()\n"); - #ifdef CONFIG_WOWLAN - if(padapter->pwrctrlpriv.bSupportWakeOnWlan==_TRUE){ - //DBG_8192C("%s bSupportWakeOnWlan==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__); - } - else - #endif - { - rtw_hal_deinit(padapter); - } - padapter->bSurpriseRemoved = _TRUE; - } - - padapter->bup = _FALSE; - - } - else - { - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("r871x_dev_unload():padapter->bup == _FALSE\n" )); - } - - //DBG_8192C("<=== rtw_dev_unload\n"); - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-rtw_dev_unload\n")); - -} - -static void process_spec_devid(const struct usb_device_id *pdid) -{ - u16 vid, pid; - u32 flags; - int i; - int num = sizeof(specific_device_id_tbl)/sizeof(struct specific_device_id); - - for(i=0; iidVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_DISABLE_HT)) - { - rtw_ht_enable = 0; - rtw_cbw40_enable = 0; - rtw_ampdu_enable = 0; - } -#endif - -#ifdef RTK_DMP_PLATFORM - // Change the ifname to wlan10 when PC side WFD dongle plugin on DMP platform. - // It is used to distinguish between normal and PC-side wifi dongle/module. - if((pdid->idVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_ASSIGN_IFNAME)) - { - extern char* ifname; - strncpy(ifname, "wlan10", 6); - //DBG_8192C("%s()-%d: ifname=%s, vid=%04X, pid=%04X\n", __FUNCTION__, __LINE__, ifname, vid, pid); - } -#endif /* RTK_DMP_PLATFORM */ - - } -} - -#ifdef SUPPORT_HW_RFOFF_DETECTED -extern u8 disconnect_hdl(_adapter *padapter, u8 *pbuf); -extern void rtw_os_indicate_disconnect( _adapter *adapter ); - -int rtw_hw_suspend(_adapter *padapter ) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct usb_interface *pusb_intf = padapter->dvobjpriv.pusbintf; - struct net_device *pnetdev=usb_get_intfdata(pusb_intf); - - _func_enter_; - - if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) - { - //DBG_8192C("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", - //padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); - goto error_exit; - } - - if(padapter)//system suspend - { - LeaveAllPowerSaveMode(padapter); - - DBG_8192C("==> rtw_hw_suspend\n"); - _enter_pwrlock(&pwrpriv->lock); - pwrpriv->bips_processing = _TRUE; - //padapter->net_closed = _TRUE; - //s1. - if(pnetdev) - { - netif_carrier_off(pnetdev); - netif_stop_queue(pnetdev); - } - - //s2. - //s2-1. issue rtw_disassoc_cmd to fw - //rtw_disassoc_cmd(padapter);//donnot enqueue cmd - disconnect_hdl(padapter, NULL); - - //s2-2. indicate disconnect to os - //rtw_indicate_disconnect(padapter); - { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - if(check_fwstate(pmlmepriv, _FW_LINKED)) - { - _clr_fwstate_(pmlmepriv, _FW_LINKED); - - rtw_led_control(padapter, LED_CTL_NO_LINK); - - rtw_os_indicate_disconnect(padapter); - - //donnot enqueue cmd - rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 0); - - } - - } - //s2-3. - rtw_free_assoc_resources(padapter); - - //s2-4. - rtw_free_network_queue(padapter,_TRUE); - - rtw_ips_dev_unload(padapter); - - pwrpriv->rf_pwrstate = rf_off; - pwrpriv->bips_processing = _FALSE; - - _exit_pwrlock(&pwrpriv->lock); - } - else - goto error_exit; - - _func_exit_; - return 0; - -error_exit: - DBG_8192C("%s, failed \n",__FUNCTION__); - return (-1); - -} - -int rtw_hw_resume(_adapter *padapter) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct usb_interface *pusb_intf = padapter->dvobjpriv.pusbintf; - struct net_device *pnetdev=usb_get_intfdata(pusb_intf); - - _func_enter_; - - if(padapter)//system resume - { - //DBG_8192C("==> rtw_hw_resume\n"); - _enter_pwrlock(&pwrpriv->lock); - pwrpriv->bips_processing = _TRUE; - rtw_reset_drv_sw(padapter); - - if(pm_netdev_open(pnetdev,_FALSE) != 0) - { - _exit_pwrlock(&pwrpriv->lock); - goto error_exit; - } - - netif_device_attach(pnetdev); - netif_carrier_on(pnetdev); - - if(!netif_queue_stopped(pnetdev)) - netif_start_queue(pnetdev); - else - netif_wake_queue(pnetdev); - - pwrpriv->bkeepfwalive = _FALSE; - pwrpriv->brfoffbyhw = _FALSE; - - pwrpriv->rf_pwrstate = rf_on; - pwrpriv->bips_processing = _FALSE; - - _exit_pwrlock(&pwrpriv->lock); - } - else - { - goto error_exit; - } - - _func_exit_; - - return 0; -error_exit: - DBG_8192C("%s, Open net dev failed \n",__FUNCTION__); - return (-1); -} -#endif - -static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) -{ - struct net_device *pnetdev=usb_get_intfdata(pusb_intf); - _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct usb_device *usb_dev = interface_to_usbdev(pusb_intf); - - _func_enter_; - - if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) - { - //DBG_8192C("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", - //padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); - return 0; - } - sleep_resume = 0; - DBG_8192C("########### rtw_suspend #################\n"); - - if(padapter)//system suspend - { - if(pwrpriv->bInternalAutoSuspend ) - { - #ifdef CONFIG_AUTOSUSPEND - #ifdef SUPPORT_HW_RFOFF_DETECTED - // The FW command register update must after MAC and FW init ready. - if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) - { - u8 bOpen = _TRUE; - rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); - //rtl8192c_set_FwSelectSuspend_cmd(padapter,_TRUE ,500);//note fw to support hw power down ping detect - } - #endif - #endif - } - pwrpriv->bInSuspend = _TRUE; - rtw_cancel_all_timer(padapter); - LeaveAllPowerSaveMode(padapter); - - _enter_pwrlock(&pwrpriv->lock); - //padapter->net_closed = _TRUE; - //s1. - if(pnetdev) - { - netif_carrier_off(pnetdev); - netif_stop_queue(pnetdev); - } -#ifdef CONFIG_WOWLAN - padapter->pwrctrlpriv.bSupportWakeOnWlan=_TRUE; -#else - //s2. - //s2-1. issue rtw_disassoc_cmd to fw - disconnect_hdl(padapter, NULL); - //rtw_disassoc_cmd(padapter); -#endif - -#ifdef CONFIG_LAYER2_ROAMING_RESUME - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) ) - { - //printk("%s:%d assoc_ssid:%s\n", __FUNCTION__, __LINE__, pmlmepriv->assoc_ssid.Ssid); - DBG_871X("%s:%d %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, __LINE__, - pmlmepriv->cur_network.network.Ssid.Ssid, - MAC_ARG(pmlmepriv->cur_network.network.MacAddress), - pmlmepriv->cur_network.network.Ssid.SsidLength, - pmlmepriv->assoc_ssid.SsidLength); - - pmlmepriv->to_roaming = 1; - } -#endif - //s2-2. indicate disconnect to os - rtw_indicate_disconnect(padapter); - //s2-3. - rtw_free_assoc_resources(padapter); -#ifdef CONFIG_AUTOSUSPEND - if(!pwrpriv->bInternalAutoSuspend ) -#endif - //s2-4. - rtw_free_network_queue(padapter, _TRUE); - - rtw_dev_unload(padapter); -#ifdef CONFIG_AUTOSUSPEND - pwrpriv->rf_pwrstate = rf_off; - pwrpriv->bips_processing = _FALSE; -#endif - _exit_pwrlock(&pwrpriv->lock); - } - else - goto error_exit; - - DBG_871X("########### rtw_suspend done #################\n"); - - _func_exit_; - return 0; - -error_exit: - DBG_871X("########### rtw_suspend fail !! #################\n"); - return (-1); - -} - -static int rtw_resume(struct usb_interface *pusb_intf) -{ - struct net_device *pnetdev=usb_get_intfdata(pusb_intf); - _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - int ret = 0; - - if(pwrpriv->bInternalAutoSuspend ){ - ret = rtw_resume_process(pusb_intf); - } else { -#ifdef CONFIG_RESUME_IN_WORKQUEUE - rtw_resume_in_workqueue(pwrpriv); -#elif defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) - if(rtw_is_earlysuspend_registered(pwrpriv)) { - //jeff: bypass resume here, do in late_resume - pwrpriv->do_late_resume = _TRUE; - } else { - ret = rtw_resume_process(pusb_intf); - } -#else // Normal resume process - ret = rtw_resume_process(pusb_intf); -#endif //CONFIG_RESUME_IN_WORKQUEUE - } - - return ret; - -} - - -int rtw_resume_process(struct usb_interface *pusb_intf) -{ - struct net_device *pnetdev; - struct usb_device *usb_dev; - _adapter *padapter; - struct pwrctrl_priv *pwrpriv; - - _func_enter_; - - DBG_8192C("########### rtw_resume #################\n"); - - if(pusb_intf) { - pnetdev=usb_get_intfdata(pusb_intf); - usb_dev = interface_to_usbdev(pusb_intf); - } else { - goto error_exit; - } - - padapter = (_adapter*)rtw_netdev_priv(pnetdev); - pwrpriv = &padapter->pwrctrlpriv; - - if(padapter)//system resume - { - _enter_pwrlock(&pwrpriv->lock); - rtw_reset_drv_sw(padapter); - pwrpriv->bkeepfwalive = _FALSE; - - //DBG_8192C("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); - if(pm_netdev_open(pnetdev,_TRUE) != 0) - goto error_exit; - - netif_device_attach(pnetdev); - netif_carrier_on(pnetdev); - -#ifdef CONFIG_AUTOSUSPEND - if(pwrpriv->bInternalAutoSuspend ) - { - #ifdef CONFIG_AUTOSUSPEND - #ifdef SUPPORT_HW_RFOFF_DETECTED - // The FW command register update must after MAC and FW init ready. - if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) - { - //rtl8192c_set_FwSelectSuspend_cmd(padapter,_FALSE ,500);//note fw to support hw power down ping detect - u8 bOpen = _FALSE; - rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); - } - #endif - #endif - - pwrpriv->bInternalAutoSuspend = _FALSE; - pwrpriv->brfoffbyhw = _FALSE; - { - //DBG_8192C("enc_algorithm(%x),wepkeymask(%x)\n", - padapter->securitypriv.dot11PrivacyAlgrthm,pwrpriv->wepkeymask); - if( (_WEP40_ == padapter->securitypriv.dot11PrivacyAlgrthm) || - (_WEP104_ == padapter->securitypriv.dot11PrivacyAlgrthm)) - { - sint keyid; - - for(keyid=0;keyid<4;keyid++){ - if(pwrpriv->wepkeymask & BIT(keyid)) { - if(keyid == padapter->securitypriv.dot11PrivacyKeyIndex) - rtw_set_key(padapter,&padapter->securitypriv, keyid, 1); - else - rtw_set_key(padapter,&padapter->securitypriv, keyid, 0); - } - } - } - } - } -#endif - _exit_pwrlock(&pwrpriv->lock); - } - else - { - goto error_exit; - } - - if( padapter->pid[1]!=0) { - DBG_871X("pid[1]:%d\n",padapter->pid[1]); - rtw_signal_process(padapter->pid[1], SIGUSR2); - } - -#ifdef CONFIG_LAYER2_ROAMING_RESUME - rtw_roaming(padapter, NULL); -#endif - - DBG_871X("########### rtw_resume done#################\n"); - sleep_resume = 1; - - #ifdef CONFIG_RESUME_IN_WORKQUEUE - rtw_unlock_suspend(); - #endif //CONFIG_RESUME_IN_WORKQUEUE - - _func_exit_; - - return 0; -error_exit: - DBG_8192C("%s, Open net dev failed \n",__FUNCTION__); - - //DBG_871X("########### rtw_resume done with error#################\n"); - - #ifdef CONFIG_RESUME_IN_WORKQUEUE - rtw_unlock_suspend(); - #endif //CONFIG_RESUME_IN_WORKQUEUE - - _func_exit_; - - return (-1); -} - -#ifdef CONFIG_AUTOSUSPEND -void autosuspend_enter(_adapter* padapter) -{ - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - pwrpriv->bInternalAutoSuspend = _TRUE; - pwrpriv->bips_processing = _TRUE; - - //DBG_8192C("==>autosuspend_enter...........\n"); - - if(rf_off == pwrpriv->change_rfpwrstate ) - { - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) - usb_enable_autosuspend(padapter->dvobjpriv.pusbdev); - #else - padapter->dvobjpriv.pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user - #endif - - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) - usb_autopm_put_interface(padapter->dvobjpriv.pusbintf); - #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) - usb_autopm_enable(padapter->dvobjpriv.pusbintf); - #else - usb_autosuspend_device(padapter->dvobjpriv.pusbdev, 1); - #endif - } - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) - DBG_8192C("...pm_usage_cnt(%d).....\n",atomic_read(&(padapter->dvobjpriv.pusbintf->pm_usage_cnt))); - #else - DBG_8192C("...pm_usage_cnt(%d).....\n",padapter->dvobjpriv.pusbintf->pm_usage_cnt); - #endif - -} -int autoresume_enter(_adapter* padapter) -{ - int result = _SUCCESS; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - struct security_priv* psecuritypriv=&(padapter->securitypriv); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - //DBG_8192C("====> autoresume_enter \n"); - - if(rf_off == pwrpriv->rf_pwrstate ) - { - pwrpriv->ps_flag = _FALSE; - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) - if (usb_autopm_get_interface( padapter->dvobjpriv.pusbintf) < 0) - { - DBG_8192C( "can't get autopm: %d\n", result); - result = _FAIL; - goto error_exit; - } - #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) - usb_autopm_disable(padapter->dvobjpriv.pusbintf); - #else - usb_autoresume_device(padapter->dvobjpriv.pusbdev, 1); - #endif - - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) - //DBG_8192C("...pm_usage_cnt(%d).....\n",atomic_read(&(padapter->dvobjpriv.pusbintf->pm_usage_cnt))); - #else - //DBG_8192C("...pm_usage_cnt(%d).....\n",padapter->dvobjpriv.pusbintf->pm_usage_cnt); - #endif - } - //DBG_8192C("<==== autoresume_enter \n"); -error_exit: - - return result; -} -#endif - -extern char* ifname; -/* - * drv_init() - a device potentially for us - * - * notes: drv_init() is called when the bus driver has located a card for us to support. - * We accept the new device by returning 0. -*/ -static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid) -{ - int i; - - uint status; - _adapter *padapter = NULL; - struct dvobj_priv *pdvobjpriv; - struct net_device *pnetdev; - - RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n")); - //DBG_8192C("+rtw_drv_init\n"); - - //2009.8.13, by Thomas - // In this probe function, O.S. will provide the usb interface pointer to driver. - // We have to increase the reference count of the usb device structure by using the usb_get_dev function. - usb_get_dev(interface_to_usbdev(pusb_intf)); - - pintf = pusb_intf; - - //step 0. - process_spec_devid(pdid); - - //step 1. set USB interface data - // init data - pnetdev = rtw_init_netdev(NULL); - if (!pnetdev) - goto error; - - SET_NETDEV_DEV(pnetdev, &pusb_intf->dev); - - padapter = rtw_netdev_priv(pnetdev); - padapter->bDriverStopped=_TRUE; - pdvobjpriv = &padapter->dvobjpriv; - pdvobjpriv->padapter = padapter; - pdvobjpriv->pusbintf = pusb_intf ; - pdvobjpriv->pusbdev = interface_to_usbdev(pusb_intf); - - // set data - usb_set_intfdata(pusb_intf, pnetdev); - - //set interface_type to usb - padapter->interface_type = RTW_USB; - - //step 1-1., decide the chip_type via vid/pid - decide_chip_type_by_usb_device_id(padapter, pdid); - - //step 2. - if(padapter->chip_type == RTL8188C_8192C) - { -#ifdef CONFIG_RTL8192C - rtl8192cu_set_hal_ops(padapter); -#endif - } - else if(padapter->chip_type == RTL8192D) - { -#ifdef CONFIG_RTL8192D - rtl8192du_set_hal_ops(padapter); -#endif - } - else - { - //DBG_8192C("Detect NULL_CHIP_TYPE\n"); - status = _FAIL; - goto error; - } - - //step 3. initialize the dvobj_priv - padapter->dvobj_init=&usb_dvobj_init; - padapter->dvobj_deinit=&usb_dvobj_deinit; - padapter->intf_start=&usb_intf_start; - padapter->intf_stop=&usb_intf_stop; - - //step 3. - //initialize the dvobj_priv ,include Chip version - if (padapter->dvobj_init == NULL){ - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("\n Initialize dvobjpriv.dvobj_init error!!!\n")); - goto error; - } - - status = padapter->dvobj_init(padapter); - if (status != _SUCCESS) { - RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("initialize device object priv Failed!\n")); - goto error; - } - - //step 4. read efuse/eeprom data and get mac_addr - intf_read_chip_info(padapter); - - //step 5. - status = rtw_init_drv_sw(padapter); - if(status ==_FAIL){ - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n")); - goto error; - } - -#ifdef CONFIG_PM -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) - if(padapter->pwrctrlpriv.bSupportRemoteWakeup) - { - pdvobjpriv->pusbdev->do_remote_wakeup=1; - pusb_intf->needs_remote_wakeup = 1; - device_init_wakeup(&pusb_intf->dev, 1); - //DBG_8192C("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); - //DBG_8192C("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev)); - } -#endif -#endif - -#ifdef CONFIG_AUTOSUSPEND - if( padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE ) - { - if(padapter->registrypriv.usbss_enable ){ /* autosuspend (2s delay) */ - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,38)) - pdvobjpriv->pusbdev->dev.power.autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time - #else - pdvobjpriv->pusbdev->autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time - #endif - - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) - usb_enable_autosuspend(padapter->dvobjpriv.pusbdev); - #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) - padapter->bDisableAutosuspend = padapter->dvobjpriv.pusbdev->autosuspend_disabled ; - padapter->dvobjpriv.pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user - #endif - - usb_autopm_get_interface(padapter->dvobjpriv.pusbintf );//init pm_usage_cnt ,let it start from 1 - - #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) - //DBG_8192C("%s...pm_usage_cnt(%d).....\n",__FUNCTION__,atomic_read(&(pdvobjpriv->pusbintf ->pm_usage_cnt))); - #else - //DBG_8192C("%s...pm_usage_cnt(%d).....\n",__FUNCTION__,pdvobjpriv->pusbintf ->pm_usage_cnt); - #endif - } - } -#endif - // alloc dev name after read efuse. - rtw_init_netdev_name(pnetdev, ifname); - - rtw_macaddr_cfg(padapter->eeprompriv.mac_addr); - - _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); - //DBG_8192C("MAC Address from pnetdev->dev_addr= " MAC_FMT "\n", MAC_ARG(pnetdev->dev_addr)); - - - //step 6. - /* Tell the network stack we exist */ - if (register_netdev(pnetdev) != 0) { - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n")); - goto error; - } - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-drv_init - Adapter->bDriverStopped=%d, Adapter->bSurpriseRemoved=%d\n",padapter->bDriverStopped, padapter->bSurpriseRemoved)); - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_drv - drv_init, success!\n")); - //DBG_8192C("-871x_drv - drv_init, success!\n"); - -#ifdef CONFIG_PROC_DEBUG -#ifdef RTK_DMP_PLATFORM - rtw_proc_init_one(pnetdev); -#endif -#endif - -#ifdef CONFIG_HOSTAPD_MLME - hostapd_mode_init(padapter); -#endif - -#ifdef CONFIG_PLATFORM_RTD2880B - //DBG_8192C("wlan link up\n"); - rtd2885_wlan_netlink_sendMsg("linkup", "8712"); -#endif - - -#ifdef CONFIG_GLOBAL_UI_PID - if(ui_pid[1]!=0) { - DBG_871X("ui_pid[1]:%d\n",ui_pid[1]); - rtw_signal_process(ui_pid[1], SIGUSR2); - } -#endif - - //DBG_8192C("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n" - //,padapter->bDriverStopped - //,padapter->bSurpriseRemoved - //,padapter->bup - //,padapter->hw_init_completed - //); - rtl8188_power_save_init(); - - return 0; - -error: - - usb_put_dev(interface_to_usbdev(pusb_intf));//decrease the reference count of the usb device structure if driver fail on initialzation - - usb_set_intfdata(pusb_intf, NULL); - - usb_dvobj_deinit(padapter); - - if (pnetdev) - { - //unregister_netdev(pnetdev); - rtw_free_netdev(pnetdev); - } - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_usb - drv_init, fail!\n")); - //DBG_8192C("-871x_usb - drv_init, fail!\n"); - - return -ENODEV; -} - -/* - * dev_remove() - our device is being removed -*/ -//rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both -static void rtw_dev_remove(struct usb_interface *pusb_intf) -{ - struct net_device *pnetdev=usb_get_intfdata(pusb_intf); - _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); - struct mlme_priv *pmlmepriv= &padapter->mlmepriv; - struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; - u8 bResetDevice = _FALSE; - -_func_exit_; - - usb_set_intfdata(pusb_intf, NULL); - - if(padapter) - { - //DBG_8192C("+rtw_dev_remove\n"); - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+dev_remove()\n")); - -#ifdef CONFIG_HOSTAPD_MLME - hostapd_mode_unload(padapter); -#endif - LeaveAllPowerSaveMode(padapter); - - if(check_fwstate(pmlmepriv, _FW_LINKED)) - disconnect_hdl(padapter, NULL); - - if(drvpriv.drv_registered == _TRUE) - { - //DBG_8192C("r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\n"); - padapter->bSurpriseRemoved = _TRUE; - } - /*else - { - //DBG_8192C("r871xu_dev_remove():module removed\n"); - padapter->hw_init_completed = _FALSE; - }*/ - - if(padapter->DriverState != DRIVER_DISAPPEAR) - { - if(pnetdev) { - unregister_netdev(pnetdev); //will call netdev_close() -#ifdef CONFIG_PROC_DEBUG - rtw_proc_remove_one(pnetdev); -#endif - } - } - - rtw_cancel_all_timer(padapter); - - rtw_dev_unload(padapter); - - //DBG_8192C("+r871xu_dev_remove, hw_init_completed=%d\n", padapter->hw_init_completed); - - //Modify condition for 92DU DMDP 2010.11.18, by Thomas - //move code to here, avoid access null pointer. 2011.05.25. - if((pdvobjpriv->NumInterfaces != 2) || (pdvobjpriv->InterfaceNumber == 1)) - bResetDevice = _TRUE; - - //s6. - if(padapter->dvobj_deinit) - { - padapter->dvobj_deinit(padapter); - } - else - { - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize hcipriv.hci_priv_init error!!!\n")); - } - - //after rtw_free_drv_sw(), padapter has beed freed, don't refer to it. - rtw_free_drv_sw(padapter); - - } - - usb_put_dev(interface_to_usbdev(pusb_intf));//decrease the reference count of the usb device structure when disconnect - - //If we didn't unplug usb dongle and remove/insert modlue, driver fails on sitesurvey for the first time when device is up . - //Reset usb port for sitesurvey fail issue. 2009.8.13, by Thomas - if(_TRUE == bResetDevice) - { - if(interface_to_usbdev(pusb_intf)->state != USB_STATE_NOTATTACHED) - { - //DBG_8192C("usb attached..., try to reset usb device\n"); - usb_reset_device(interface_to_usbdev(pusb_intf)); - } - } - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-dev_remove()\n")); - //DBG_8192C("-r871xu_dev_remove, done\n"); - -#ifdef CONFIG_PLATFORM_RTD2880B - DBG_8192C("wlan link down\n"); - rtd2885_wlan_netlink_sendMsg("linkdown", "8712"); -#endif - - #ifdef DBG_MEM_ALLOC - rtw_dump_mem_stat (); - #endif -_func_exit_; - rtl8188_power_save_exit(); - - return; - -} -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) -extern int console_suspend_enabled; -#endif - -static int rtw_drv_entry(void) -{ -#ifdef CONFIG_PLATFORM_RTK_DMP - u32 tmp; - tmp=readl((volatile unsigned int*)0xb801a608); - tmp &= 0xffffff00; - tmp |= 0x55; - writel(tmp,(volatile unsigned int*)0xb801a608);//write dummy register for 1055 -#endif - - - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n")); - - DBG_8192C("rtw driver version=%s\n", DRIVERVERSION); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) - //console_suspend_enabled=0; -#endif - - rtw_suspend_lock_init(); - - drvpriv.drv_registered = _TRUE; - return usb_register(&drvpriv.rtw_usb_drv); -} - -static void rtw_drv_halt(void) -{ - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n")); - //DBG_8192C("+rtw_drv_halt\n"); - - rtw_suspend_lock_uninit(); - - drvpriv.drv_registered = _FALSE; - usb_deregister(&drvpriv.rtw_usb_drv); - //DBG_8192C("-rtw_drv_halt\n"); -} - - -//module_init(rtw_drv_entry); -//module_exit(rtw_drv_halt); - -#include "wifi_version.h" - -int mv88w8686_if_sdio_init_module(void) -{ - printk("RTL8192/RTL8188 USB WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8192_DRV_VERSION); - - wifi_usb_init(); - wifi_activate_usb(); - - return rtw_drv_entry(); -} - -void mv88w8686_if_sdio_exit_module(void) -{ - rtw_drv_halt(); - wifi_deactivate_usb(); -} - -EXPORT_SYMBOL(mv88w8686_if_sdio_init_module); -EXPORT_SYMBOL(mv88w8686_if_sdio_exit_module); - -int rockchip_wifi_init_module(void) -{ - return mv88w8686_if_sdio_init_module(); -} - -void rockchip_wifi_exit_module(void) -{ - mv88w8686_if_sdio_exit_module(); -} - -EXPORT_SYMBOL(rockchip_wifi_init_module); -EXPORT_SYMBOL(rockchip_wifi_exit_module); diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c deleted file mode 100644 index 58d277a10e5f..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * wifi_power.c - * - * Power control for WIFI module. - * - * Yongle Lai @ Rockchip - * - * There are Power supply and Power Up/Down controls for WIFI typically. - */ -#include -#include -#include -#include - -#include "wifi_power.h" - -/* - * rtw_channel_plan : The initialization parameter of wifi channel, - * Allow number is "0" "2" and "5". - * 0 => 11 ( channel 1 ~ 11 is SCAN_ACTIVE ) - * 2 => 13 ( channel 1 ~ 13 is SCAN_ACTIVE ) - * 5 => 14 ( channel 1 ~ 14 is SCAN_ACTIVE ) - * default number is "2". - */ -char init_channel_plan = 2; - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -/* - * GPIO to control LDO/DCDC. - * - * 用于控制WIFI的电源,通常是3.3V和1.8V,可能1.2V也在其中。 - * - * 如果是扩展IO,请参考下面的例子: - * POWER_USE_EXT_GPIO, 0, 0, 0, PCA9554_Pin1, GPIO_HIGH - */ -struct wifi_power power_gpio = -{ - //POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 - - // RBOX - //POWER_USE_GPIO, POWER_GPIO_IOMUX, - //GPIO5D6_SDMMC1PWREN_NAME, GPIO5H_GPIO5D6, RK29_PIN5_PD6, GPIO_HIGH - - /*// YIFANG M803 - POWER_USE_GPIO, 0, - 0, 0, GPIO_WIFI_POWER, GPIO_HIGH - */ - //SDK - POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 -}; - -/* - * GPIO to control WIFI PowerDOWN/RESET. - * - * 控制WIFI的PowerDown脚。有些模组PowerDown脚是和Reset脚短接在一起。 - */ -struct wifi_power power_save_gpio = -{ - POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 -}; - -/* - * GPIO to reset WIFI. Keep this as NULL normally. - * - * 控制WIFI的Reset脚,通常WiFi模组没有用到这个引脚。 - */ -struct wifi_power power_reset_gpio = -{ - POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 -}; - -/* - * 在WIFI被上电前,会调用这个函数。 - */ -void wifi_turn_on_callback(void) -{ -} - -/* - * 在WIFI被下电后,会调用这个函数。 - */ -void wifi_turn_off_callback(void) -{ -} - -/* - * If external GPIO chip such as PCA9554 is being used, please - * implement the following 2 function. - * - * id: is GPIO identifier, such as GPIOPortF_Pin0, or external - * name defined in struct wifi_power. - * sens: the value should be set to GPIO, usually is GPIO_HIGH or GPIO_LOW. - * - * 如果有用扩展GPIO来控制WIFI,请实现下面的函数: - * 函数的功能是:控制指定的IO口id,使其状态切换为要求的sens状态。 - * id : 是IO的标识号,以整数的形式标识。 - * sens: 是要求的IO状态,为高或低。 - */ -void wifi_extgpio_operation(u8 id, u8 sens) -{ - //pca955x_gpio_direction_output(id, sens); -} - -/* - * 在系统中如果要调用WIFI的IO控制,将WIFI下电,可以调用如下接口: - * void rockchip_wifi_shutdown(void); - * 但注意需要在宏WIFI_GPIO_POWER_CONTROL的控制下。 - */ - -#endif /* WIFI_GPIO_POWER_CONTROL */ - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h deleted file mode 100644 index be89742c471f..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * wifi_power.h - * - * WIFI power control. - * - * Yongle Lai - */ - -#ifndef WIFI_POWER_H -#define WIFI_POWER_H - -#include - -#define DONT_SWITCH_USB 0 /* Don't switch USB automaticately. */ -#define WIFI_USE_OTG 1 /* WiFi will be connected to USB OTG. */ -#define WIFI_USE_HOST11 2 /* WiFi will be connected to USB HOST 1.1. */ - -#define WIFI_USE_IFACE WIFI_USE_HOST11 /* Select USB Controler */ -#define WIFI_GPIO_POWER_CONTROL 1 /* Enable GPIO Control Power */ - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) -#include -#include -#else -#include -#include -#endif - -#define WIFI_CHIP_MV8686 0 -#define WIFI_CHIP_AR6002 1 -#define WIFI_CHIP_BCM4319 2 -#define WIFI_CHIP_NRX700 3 -#define WIFI_CHIP_RT3070 4 -#define WIFI_CHIP_RTL8192C 5 - -#define POWER_NOT_USE_GPIO 0 -#define POWER_USE_GPIO 1 -#define POWER_USE_EXT_GPIO 2 /* External GPIO chip is used, such as PCA9554. */ - -#define POWER_GPIO_NOT_IOMUX 0 -#define POWER_GPIO_IOMUX 1 - -#define GPIO_SWITCH_OFF 0 -#define GPIO_SWITCH_ON 1 - -struct wifi_power -{ - u8 use_gpio; /* If uses GPIO to control wifi power supply. 0 - no, 1 - yes. */ - u8 gpio_iomux; /* If the GPIO is iomux. 0 - no, 1 - yes. */ - char *iomux_name; /* IOMUX name */ - u8 iomux_value; /* IOMUX value - which function is choosen. */ - u8 gpio_id; /* GPIO number */ - u8 sensi_level; /* GPIO sensitive level. */ -}; - -int wifi_turn_on_card(int module); -int wifi_turn_off_card(void); -int wifi_reset_card(void); -void wifi_extgpio_operation(u8 id, u8 sens); - -void rockchip_wifi_shutdown(void); - -#endif /* WIFI_GPIO_POWER_CONTROL */ - -#define WIFI_NETWORK_BUSY 0 -#define WIFI_NETWORK_IDLE 1 - -int wifi_power_save_init(void); -int wifi_power_save_exit(void); -int wifi_power_save_stop(void); -int wifi_power_save_state(void); -void wifi_power_save_suspend(void); -void wifi_power_save_resume(void); -int wifi_power_save_register_callback(int (*callback)(int status)); - -void wifi_turn_on_callback(void); -void wifi_turn_off_callback(void); - -/* usb wifi */ -int wifi_activate_usb(void); -int wifi_deactivate_usb(void); -void wifi_usb_init(void); - -#endif /* WIFI_POWER_H */ - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c deleted file mode 100644 index 4096bdac15fd..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * wifi_power.c - * - * Yongle Lai @ Rockchip Fuzhou @ 20100303. - * - * Power control for WIFI module. - * - * There are Power supply and Power Up/Down controls for WIFI typically. - */ -#include -#include -#include -#include - -#include "wifi_power.h" - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) -#include -#include -#else -#include -#include -#endif - - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -extern struct wifi_power power_gpio; -extern struct wifi_power power_save_gpio; -extern struct wifi_power power_reset_gpio; - -#define OS_IOMUX(name, value) rk29_mux_api_set((name), (value)); - -int wifi_gpio_operate(struct wifi_power *gpio, int flag) -{ - int sensitive; - - if (gpio->use_gpio == POWER_NOT_USE_GPIO) - return 0; - - if (gpio->gpio_iomux == POWER_GPIO_IOMUX) - { - OS_IOMUX(gpio->iomux_name, gpio->iomux_value); - } - - if (flag == GPIO_SWITCH_ON) - sensitive = gpio->sensi_level; - else - sensitive = 1 - gpio->sensi_level; - - if (gpio->use_gpio == POWER_USE_EXT_GPIO) - { - wifi_extgpio_operation(gpio->gpio_id, sensitive); - } - else - { - int ret; - - ret = gpio_request(gpio->gpio_id, NULL); - if (ret != 0) - printk("Request GPIO for WIFI POWER error!\n"); - - gpio_direction_output(gpio->gpio_id, sensitive); - gpio_set_value(gpio->gpio_id, sensitive); - - gpio_free(gpio->gpio_id); - } - - return 0; -} - -/* - * WiFi power up sequence - */ -int wifi_turn_on_rtl8192c_card(void) -{ - wifi_gpio_operate(&power_gpio, GPIO_SWITCH_ON); - if (power_gpio.use_gpio != POWER_NOT_USE_GPIO) - msleep(1000); - - return 0; -} - -int wifi_turn_on_card(int module) -{ - wifi_turn_on_callback(); - - wifi_turn_on_rtl8192c_card(); - - return 0; -} - -int wifi_turn_off_card(void) -{ - wifi_gpio_operate(&power_gpio, GPIO_SWITCH_OFF); - msleep(5); - - wifi_turn_off_callback(); - - return 0; -} - -void rockchip_wifi_shutdown(void) -{ - printk("rockchip_wifi_shutdown....\n"); - - wifi_turn_off_card(); -} -EXPORT_SYMBOL(rockchip_wifi_shutdown); - -#endif /* WIFI_GPIO_POWER_CONTROL */ - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c deleted file mode 100644 index c979cc34958c..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * wifi_power.c - * - * Power control for WIFI module. - * - * There are Power supply and Power Up/Down controls for WIFI typically. - */ -#include -#include -#include -#include - -#include "wifi_power.h" - -#if (WIFI_GPIO_POWER_CONTROL == 1) - -int wifi_change_usb_mode = 0; -int usb_wifi_status = 0; - -void wifi_usb_init(void) -{ - wifi_change_usb_mode = 0; - usb_wifi_status = 0; -} - -#if (WIFI_USE_IFACE == WIFI_USE_OTG) - -#define USB_NORMAL 0 -#define USB_FORCE_HOST 1 -#define USB_FORCE_DEVICE 2 - -extern int usb_force_usb_for_wifi(int mode); - -/* - * Change USB mode to HOST. - */ -int wifi_activate_usb(void) -{ - wifi_turn_on_card(WIFI_CHIP_RTL8192C); - - wifi_change_usb_mode = usb_force_usb_for_wifi(USB_FORCE_HOST); - msleep(1000); - - usb_wifi_status = 1; - - return 0; -} - -/* - * Change USB mode to be original. - */ -int wifi_deactivate_usb(void) -{ - if (wifi_change_usb_mode == 1) - { - usb_force_usb_for_wifi(USB_FORCE_DEVICE); - msleep(1000); - usb_force_usb_for_wifi(USB_NORMAL); - msleep(1000); - } - wifi_turn_off_card(); - - usb_wifi_status = 0; - - return 0; -} - -#elif (WIFI_USE_IFACE == WIFI_USE_HOST11) - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) -extern int usb_switch_usb_host11_for_wifi(int enabled); -#endif - -int wifi_deactivate_usb(void) -{ -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) - usb_switch_usb_host11_for_wifi(0); - msleep(1000); -#endif - - wifi_turn_off_card(); - msleep(100); - - return 0; -} - -int wifi_activate_usb(void) -{ - wifi_turn_on_card(WIFI_CHIP_RTL8192C); - msleep(100); - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) - usb_switch_usb_host11_for_wifi(1); - msleep(1000); -#endif - - return 0; -} - -#else - -int wifi_deactivate_usb(void) -{ - wifi_turn_off_card(); - msleep(1000); - return 0; -} - -int wifi_activate_usb(void) -{ - wifi_turn_on_card(WIFI_CHIP_RTL8192C); - msleep(1000); - return 0; -} -#endif - -#endif /* WIFI_GPIO_POWER_CONTROL */ - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h deleted file mode 100755 index 3690f4b0687c..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Yongle Lai @ Rockchip - */ -#ifndef WIFI_BCM4319_VERSION_H -#define WIFI_BCM4319_VERSION_H - -/* - * Broadcom BCM4319 driver version. - */ -#define RTL8192_DRV_VERSION "3.12" - -#endif /* WIFI_BCM4319_VERSION_H */ - diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c deleted file mode 100755 index 9ca715116aaf..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c +++ /dev/null @@ -1,291 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - -******************************************************************************/ -#define _XMIT_OSDEP_C_ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -uint rtw_remainder_len(struct pkt_file *pfile) -{ - return (pfile->buf_len - ((SIZE_PTR)(pfile->cur_addr) - (SIZE_PTR)(pfile->buf_start))); -} - -void _rtw_open_pktfile (_pkt *pktptr, struct pkt_file *pfile) -{ -_func_enter_; - - pfile->pkt = pktptr; - pfile->cur_addr = pfile->buf_start = pktptr->data; - pfile->pkt_len = pfile->buf_len = pktptr->len; - - pfile->cur_buffer = pfile->buf_start ; - -_func_exit_; -} - -uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen) -{ - uint len = 0; - -_func_enter_; - - len = rtw_remainder_len(pfile); - len = (rlen > len)? len: rlen; - - if(rmem) - skb_copy_bits(pfile->pkt, pfile->buf_len-pfile->pkt_len, rmem, len); - - pfile->cur_addr += len; - pfile->pkt_len -= len; - -_func_exit_; - - return len; -} - -sint rtw_endofpktfile(struct pkt_file *pfile) -{ -_func_enter_; - - if (pfile->pkt_len == 0) { -_func_exit_; - return _TRUE; - } - -_func_exit_; - - return _FALSE; -} - -void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib) -{ - -#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX - struct sk_buff *skb = (struct sk_buff *)pkt; - pattrib->hw_tcp_csum = 0; - - if (skb->ip_summed == CHECKSUM_PARTIAL) { - if (skb_shinfo(skb)->nr_frags == 0) - { - const struct iphdr *ip = ip_hdr(skb); - if (ip->protocol == IPPROTO_TCP) { - // TCP checksum offload by HW - DBG_8192C("CHECKSUM_PARTIAL TCP\n"); - pattrib->hw_tcp_csum = 1; - //skb_checksum_help(skb); - } else if (ip->protocol == IPPROTO_UDP) { - //DBG_8192C("CHECKSUM_PARTIAL UDP\n"); -#if 1 - skb_checksum_help(skb); -#else - // Set UDP checksum = 0 to skip checksum check - struct udphdr *udp = skb_transport_header(skb); - udp->check = 0; -#endif - } else { - DBG_8192C("%s-%d TCP CSUM offload Error!!\n", __FUNCTION__, __LINE__); - WARN_ON(1); /* we need a WARN() */ - } - } - else { // IP fragmentation case - DBG_8192C("%s-%d nr_frags != 0, using skb_checksum_help(skb);!!\n", __FUNCTION__, __LINE__); - skb_checksum_help(skb); - } - } -#endif - -} - -int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz) -{ -#ifdef CONFIG_USB_HCI - int i; - struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; - struct usb_device *pusbd = pdvobjpriv->pusbdev; - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX - pxmitbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)alloc_sz, GFP_ATOMIC, &pxmitbuf->dma_transfer_addr); - pxmitbuf->pbuf = pxmitbuf->pallocated_buf; - if(pxmitbuf->pallocated_buf == NULL) - return _FAIL; -#else // CONFIG_USE_USB_BUFFER_ALLOC_TX - - pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz); - if (pxmitbuf->pallocated_buf == NULL) - { - return _FAIL; - } - - pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); - pxmitbuf->dma_transfer_addr = 0; - -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - - for(i=0; i<8; i++) - { - pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL); - if(pxmitbuf->pxmit_urb[i] == NULL) - { - DBG_8192C("pxmitbuf->pxmit_urb[i]==NULL"); - return _FAIL; - } - - } -#endif -#ifdef CONFIG_PCI_HCI - pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz); - if (pxmitbuf->pallocated_buf == NULL) - { - return _FAIL; - } - - pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); -#endif - - return _SUCCESS; -} - -void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz) -{ -#ifdef CONFIG_USB_HCI - int i; - struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; - struct usb_device *pusbd = pdvobjpriv->pusbdev; - - - for(i=0; i<8; i++) - { - if(pxmitbuf->pxmit_urb[i]) - { - //usb_kill_urb(pxmitbuf->pxmit_urb[i]); - usb_free_urb(pxmitbuf->pxmit_urb[i]); - } - } - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX - rtw_usb_buffer_free(pusbd, (size_t)free_sz, pxmitbuf->pallocated_buf, pxmitbuf->dma_transfer_addr); - pxmitbuf->pallocated_buf = NULL; - pxmitbuf->dma_transfer_addr = 0; -#else // CONFIG_USE_USB_BUFFER_ALLOC_TX - if(pxmitbuf->pallocated_buf) - rtw_mfree(pxmitbuf->pallocated_buf, free_sz); -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - -#endif -#ifdef CONFIG_PCI_HCI - if(pxmitbuf->pallocated_buf) - rtw_mfree(pxmitbuf->pallocated_buf, free_sz); -#endif -} - -void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt) -{ - if (netif_queue_stopped(padapter->pnetdev)) - netif_wake_queue(padapter->pnetdev); - - dev_kfree_skb_any(pkt); -} - -void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe) -{ - if(pxframe->pkt) - { - //RT_TRACE(_module_xmit_osdep_c_,_drv_err_,("linux : rtw_os_xmit_complete, dev_kfree_skb()\n")); - - //dev_kfree_skb_any(pxframe->pkt); - rtw_os_pkt_complete(padapter, pxframe->pkt); - - } - - pxframe->pkt = NULL; -} - -void rtw_os_xmit_schedule(_adapter *padapter) -{ - _irqL irqL; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - _enter_critical_bh(&pxmitpriv->lock, &irqL); - - if(rtw_txframes_pending(padapter)) - { - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - } - - _exit_critical_bh(&pxmitpriv->lock, &irqL); -} - - -int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) -{ - _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - s32 res = 0; - int ret = 0; - -_func_enter_; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n")); - - if (rtw_if_up(padapter) == _FALSE) { - RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n")); - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__); - #endif - goto drop_packet; - } - - res = rtw_xmit(padapter, pkt); - if (res < 0) { - #ifdef DBG_TX_DROP_FRAME - DBG_871X("DBG_TX_DROP_FRAME %s rtw_xmit fail\n", __FUNCTION__); - #endif - goto drop_packet; - } - - pxmitpriv->tx_pkts++; - RT_TRACE(_module_xmit_osdep_c_, _drv_info_, ("rtw_xmit_entry: tx_pkts=%d\n", (u32)pxmitpriv->tx_pkts)); - goto exit; - -drop_packet: - pxmitpriv->tx_drop++; - dev_kfree_skb_any(pkt); - RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, ("rtw_xmit_entry: drop, tx_drop=%d\n", (u32)pxmitpriv->tx_drop)); - -exit: - -_func_exit_; - - return 0; -} - diff --git a/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c b/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c deleted file mode 100755 index 84fb20b18029..000000000000 --- a/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c +++ /dev/null @@ -1,1346 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - - -#define _OSDEP_SERVICE_C_ - -#include -#include -#include -#include -#include - -#ifdef RTK_DMP_PLATFORM -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) -#include -#endif -#endif - -#define RT_TAG '1178' - -#ifdef MEMORY_LEAK_DEBUG -#ifdef PLATFORM_LINUX -#include -atomic_t _malloc_cnt = ATOMIC_INIT(0); -atomic_t _malloc_size = ATOMIC_INIT(0); -#endif -#endif /* MEMORY_LEAK_DEBUG */ - - -inline u8* _rtw_vmalloc(u32 sz) -{ - u8 *pbuf; -#ifdef PLATFORM_LINUX - pbuf = vmalloc(sz); -#endif - -#ifdef PLATFORM_WINDOWS - NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); -#endif - - return pbuf; -} - -inline u8* _rtw_zvmalloc(u32 sz) -{ - u8 *pbuf; -#ifdef PLATFORM_LINUX - pbuf = _rtw_vmalloc(sz); - if (pbuf != NULL) - memset(pbuf, 0, sz); -#endif - -#ifdef PLATFORM_WINDOWS - NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); - if (pbuf != NULL) - NdisFillMemory(pbuf, sz, 0); -#endif - - return pbuf; -} - -inline void _rtw_vmfree(u8 *pbuf, u32 sz) -{ -#ifdef PLATFORM_LINUX - vfree(pbuf); -#endif - -#ifdef PLATFORM_WINDOWS - NdisFreeMemory(pbuf,sz, 0); -#endif -} - -u8* _rtw_malloc(u32 sz) -{ - - u8 *pbuf=NULL; - -#ifdef PLATFORM_LINUX -#ifdef RTK_DMP_PLATFORM - if(sz > 0x4000) - pbuf = (u8 *)dvr_malloc(sz); - else -#endif - pbuf = kmalloc(sz, /*GFP_KERNEL*/GFP_ATOMIC); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); - -#endif - -#ifdef MEMORY_LEAK_DEBUG -#ifdef PLATFORM_LINUX - if ( pbuf != NULL) { - atomic_inc(&_malloc_cnt); - atomic_add(sz, &_malloc_size); - } -#endif -#endif /* MEMORY_LEAK_DEBUG */ - - return pbuf; - -} - - -u8* _rtw_zmalloc(u32 sz) -{ - u8 *pbuf = _rtw_malloc(sz); - - if (pbuf != NULL) { - -#ifdef PLATFORM_LINUX - memset(pbuf, 0, sz); -#endif - -#ifdef PLATFORM_WINDOWS - NdisFillMemory(pbuf, sz, 0); -#endif - - } - - return pbuf; - -} - -void _rtw_mfree(u8 *pbuf, u32 sz) -{ - -#ifdef PLATFORM_LINUX -#ifdef RTK_DMP_PLATFORM - if(sz > 0x4000) - dvr_free(pbuf); - else -#endif - kfree(pbuf); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisFreeMemory(pbuf,sz, 0); - -#endif - -#ifdef MEMORY_LEAK_DEBUG -#ifdef PLATFORM_LINUX - atomic_dec(&_malloc_cnt); - atomic_sub(sz, &_malloc_size); -#endif -#endif /* MEMORY_LEAK_DEBUG */ - -} - - -#ifdef DBG_MEM_ALLOC - -struct rtw_dbg_mem_stat { - ATOMIC_T vir_alloc; // the memory bytes we allocate now - ATOMIC_T vir_peak; // the peak memory bytes we allocate - ATOMIC_T vir_alloc_err; // the error times we fail to allocate memory - - ATOMIC_T phy_alloc; - ATOMIC_T phy_peak; - ATOMIC_T phy_alloc_err; -} rtw_dbg_mem_stat; - -enum { - MEM_STAT_VIR_ALLOC_SUCCESS, - MEM_STAT_VIR_ALLOC_FAIL, - MEM_STAT_VIR_FREE, - MEM_STAT_PHY_ALLOC_SUCCESS, - MEM_STAT_PHY_ALLOC_FAIL, - MEM_STAT_PHY_FREE -}; - -void rtw_dump_mem_stat (void) -{ - int vir_alloc, vir_peak, vir_alloc_err, phy_alloc, phy_peak, phy_alloc_err; - - vir_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc); - vir_peak=ATOMIC_READ(&rtw_dbg_mem_stat.vir_peak); - vir_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc_err); - - phy_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc); - phy_peak=ATOMIC_READ(&rtw_dbg_mem_stat.phy_peak); - phy_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc_err); - - DBG_871X("vir_alloc:%d, vir_peak:%d,vir_alloc_err:%d, phy_alloc:%d, phy_peak:%d, phy_alloc_err:%d\n" - , vir_alloc, vir_peak, vir_alloc_err - , phy_alloc, phy_peak, phy_alloc_err - ); -} - -void rtw_update_mem_stat(u8 flag, u32 sz) -{ - static u32 update_time = 0; - int peak, alloc; - - if(!update_time) { - ATOMIC_SET(&rtw_dbg_mem_stat.vir_alloc,0); - ATOMIC_SET(&rtw_dbg_mem_stat.vir_peak,0); - ATOMIC_SET(&rtw_dbg_mem_stat.vir_alloc_err,0); - ATOMIC_SET(&rtw_dbg_mem_stat.phy_alloc,0); - ATOMIC_SET(&rtw_dbg_mem_stat.phy_peak,0); - ATOMIC_SET(&rtw_dbg_mem_stat.phy_alloc_err,0); - } - - switch(flag) { - case MEM_STAT_VIR_ALLOC_SUCCESS: - alloc = ATOMIC_ADD_RETURN(&rtw_dbg_mem_stat.vir_alloc, sz); - peak=ATOMIC_READ(&rtw_dbg_mem_stat.vir_peak); - if (peak 5000) { - rtw_dump_mem_stat(); - update_time=rtw_get_current_time(); - } - - -} - - -inline u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line) -{ - u8 *p; - DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); - - p=_rtw_vmalloc((sz)); - - rtw_update_mem_stat( - p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL - , sz - ); - - return p; -} - -inline u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line) -{ - u8 *p; - DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); - - p=_rtw_zvmalloc((sz)); - - rtw_update_mem_stat( - p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL - , sz - ); - - return p; -} - -inline void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line) -{ - DBG_871X("DBG_MEM_ALLOC %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); - - _rtw_vmfree((pbuf), (sz)); - - rtw_update_mem_stat( - MEM_STAT_VIR_FREE - , sz - ); - -} - -inline u8* dbg_rtw_malloc(u32 sz, const char *func, int line) -{ - u8 *p; - - if((sz)>4096) - DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); - - p=_rtw_malloc((sz)); - - rtw_update_mem_stat( - p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL - , sz - ); - - return p; -} - -inline u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line) -{ - u8 *p; - - if((sz)>4096) - DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); - - p = _rtw_zmalloc((sz)); - - rtw_update_mem_stat( - p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL - , sz - ); - - return p; - -} - -inline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line) -{ - if((sz)>4096) - DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); - - _rtw_mfree((pbuf), (sz)); - - rtw_update_mem_stat( - MEM_STAT_PHY_FREE - , sz - ); -} -#endif - - -void _rtw_memcpy(void* dst, void* src, u32 sz) -{ - -#ifdef PLATFORM_LINUX - - memcpy(dst, src, sz); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisMoveMemory(dst, src, sz); - -#endif - -} - -int _rtw_memcmp(void *dst, void *src, u32 sz) -{ - -#ifdef PLATFORM_LINUX -//under Linux/GNU/GLibc, the return value of memcmp for two same mem. chunk is 0 - - if (!(memcmp(dst, src, sz))) - return _TRUE; - else - return _FALSE; -#endif - - -#ifdef PLATFORM_WINDOWS -//under Windows, the return value of NdisEqualMemory for two same mem. chunk is 1 - - if (NdisEqualMemory (dst, src, sz)) - return _TRUE; - else - return _FALSE; - -#endif - - - -} - -void _rtw_memset(void *pbuf, int c, u32 sz) -{ - -#ifdef PLATFORM_LINUX - - memset(pbuf, c, sz); - -#endif - -#ifdef PLATFORM_WINDOWS -#if 0 - NdisZeroMemory(pbuf, sz); - if (c != 0) memset(pbuf, c, sz); -#else - NdisFillMemory(pbuf, sz, c); -#endif -#endif - -} - -void _rtw_init_listhead(_list *list) -{ - -#ifdef PLATFORM_LINUX - - INIT_LIST_HEAD(list); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisInitializeListHead(list); - -#endif - -} - - -/* -For the following list_xxx operations, -caller must guarantee the atomic context. -Otherwise, there will be racing condition. -*/ -u32 rtw_is_list_empty(_list *phead) -{ - -#ifdef PLATFORM_LINUX - - if (list_empty(phead)) - return _TRUE; - else - return _FALSE; - -#endif - - -#ifdef PLATFORM_WINDOWS - - if (IsListEmpty(phead)) - return _TRUE; - else - return _FALSE; - -#endif - - -} - - -void rtw_list_insert_tail(_list *plist, _list *phead) -{ - -#ifdef PLATFORM_LINUX - - list_add_tail(plist, phead); - -#endif - -#ifdef PLATFORM_WINDOWS - - InsertTailList(phead, plist); - -#endif - -} - - -/* - -Caller must check if the list is empty before calling rtw_list_delete - -*/ - - -void _rtw_init_sema(_sema *sema, int init_val) -{ - -#ifdef PLATFORM_LINUX - - sema_init(sema, init_val); - -#endif - -#ifdef PLATFORM_OS_XP - - KeInitializeSemaphore(sema, init_val, SEMA_UPBND); // count=0; - -#endif - -#ifdef PLATFORM_OS_CE - if(*sema == NULL) - *sema = CreateSemaphore(NULL, init_val, SEMA_UPBND, NULL); -#endif - -} - -void _rtw_free_sema(_sema *sema) -{ - -#ifdef PLATFORM_OS_CE - CloseHandle(*sema); -#endif - -} - -void _rtw_up_sema(_sema *sema) -{ - -#ifdef PLATFORM_LINUX - - up(sema); - -#endif - -#ifdef PLATFORM_OS_XP - - KeReleaseSemaphore(sema, IO_NETWORK_INCREMENT, 1, FALSE ); - -#endif - -#ifdef PLATFORM_OS_CE - ReleaseSemaphore(*sema, 1, NULL ); -#endif -} - -u32 _rtw_down_sema(_sema *sema) -{ - -#ifdef PLATFORM_LINUX - - if (down_interruptible(sema)) - return _FAIL; - else - return _SUCCESS; - -#endif - -#ifdef PLATFORM_OS_XP - - if(STATUS_SUCCESS == KeWaitForSingleObject(sema, Executive, KernelMode, TRUE, NULL)) - return _SUCCESS; - else - return _FAIL; -#endif - -#ifdef PLATFORM_OS_CE - if(WAIT_OBJECT_0 == WaitForSingleObject(*sema, INFINITE )) - return _SUCCESS; - else - return _FAIL; -#endif -} - - - -void _rtw_mutex_init(_mutex *pmutex) -{ -#ifdef PLATFORM_LINUX - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - mutex_init(pmutex); -#else - init_MUTEX(pmutex); -#endif - -#endif - -#ifdef PLATFORM_OS_XP - - KeInitializeMutex(pmutex, 0); - -#endif - -#ifdef PLATFORM_OS_CE - *pmutex = CreateMutex( NULL, _FALSE, NULL); -#endif -} - - -void _rtw_mutex_free(_mutex *pmutex) -{ -#ifdef PLATFORM_LINUX - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) - mutex_destroy(pmutex); -#else -#endif - -#endif - -#ifdef PLATFORM_OS_XP - -#endif - -#ifdef PLATFORM_OS_CE - -#endif -} - -void _rtw_spinlock_init(_lock *plock) -{ - -#ifdef PLATFORM_LINUX - - spin_lock_init(plock); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisAllocateSpinLock(plock); - -#endif - -} - -void _rtw_spinlock_free(_lock *plock) -{ - - -#ifdef PLATFORM_WINDOWS - - NdisFreeSpinLock(plock); - -#endif - -} - - -void _rtw_spinlock(_lock *plock) -{ - -#ifdef PLATFORM_LINUX - - spin_lock(plock); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisAcquireSpinLock(plock); - -#endif - -} - -void _rtw_spinunlock(_lock *plock) -{ - -#ifdef PLATFORM_LINUX - - spin_unlock(plock); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisReleaseSpinLock(plock); - -#endif -} - - -void _rtw_spinlock_ex(_lock *plock) -{ - -#ifdef PLATFORM_LINUX - - spin_lock(plock); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisDprAcquireSpinLock(plock); - -#endif - -} - -void _rtw_spinunlock_ex(_lock *plock) -{ - -#ifdef PLATFORM_LINUX - - spin_unlock(plock); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisDprReleaseSpinLock(plock); - -#endif -} - - - -void _rtw_init_queue(_queue *pqueue) -{ - - _rtw_init_listhead(&(pqueue->queue)); - - _rtw_spinlock_init(&(pqueue->lock)); - -} - -u32 _rtw_queue_empty(_queue *pqueue) -{ - return (rtw_is_list_empty(&(pqueue->queue))); -} - - -u32 rtw_end_of_queue_search(_list *head, _list *plist) -{ - if (head == plist) - return _TRUE; - else - return _FALSE; -} - - -u32 rtw_get_current_time(void) -{ - -#ifdef PLATFORM_LINUX - return jiffies; -#endif - -#ifdef PLATFORM_WINDOWS - LARGE_INTEGER SystemTime; - NdisGetCurrentSystemTime(&SystemTime); - return (u32)(SystemTime.LowPart);// count of 100-nanosecond intervals -#endif -} - -inline u32 rtw_systime_to_ms(u32 systime) -{ -#ifdef PLATFORM_LINUX - return systime*1000/HZ; -#endif - -#ifdef PLATFORM_WINDOWS - return systime /10000 ; -#endif -} - -// the input parameter start use the same unit as returned by rtw_get_current_time -inline s32 rtw_get_passing_time_ms(u32 start) -{ -#ifdef PLATFORM_LINUX - return rtw_systime_to_ms(jiffies-start); -#endif - -#ifdef PLATFORM_WINDOWS - LARGE_INTEGER SystemTime; - NdisGetCurrentSystemTime(&SystemTime); - return rtw_systime_to_ms((u32)(SystemTime.LowPart) - start) ; -#endif -} - -inline s32 rtw_get_time_interval_ms(u32 start, u32 end) -{ -#ifdef PLATFORM_LINUX - return rtw_systime_to_ms(end-start); -#endif - -#ifdef PLATFORM_WINDOWS - return rtw_systime_to_ms(end-start); -#endif -} - - -void rtw_sleep_schedulable(int ms) -{ - -#ifdef PLATFORM_LINUX - - u32 delta; - - delta = (ms * HZ)/1000;//(ms) - if (delta == 0) { - delta = 1;// 1 ms - } - set_current_state(TASK_INTERRUPTIBLE); - if (schedule_timeout(delta) != 0) { - return ; - } - return; - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisMSleep(ms*1000); //(us)*1000=(ms) - -#endif - -} - - -void rtw_msleep_os(int ms) -{ - -#ifdef PLATFORM_LINUX - - msleep((unsigned int)ms); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisMSleep(ms*1000); //(us)*1000=(ms) - -#endif - - -} -void rtw_usleep_os(int us) -{ - -#ifdef PLATFORM_LINUX - - // msleep((unsigned int)us); - if ( 1 < (us/1000) ) - msleep(1); - else - msleep( (us/1000) + 1); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisMSleep(us); //(us) - -#endif - - -} - - -#ifdef DBG_DELAY_OS -void _rtw_mdelay_os(int ms, const char *func, const int line) -{ - if(ms>10) - DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms); - rtw_msleep_os(ms); - return; - - - DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms); - -#if defined(PLATFORM_LINUX) - - mdelay((unsigned long)ms); - -#elif defined(PLATFORM_WINDOWS) - - NdisStallExecution(ms*1000); //(us)*1000=(ms) - -#endif - - -} -void _rtw_udelay_os(int us, const char *func, const int line) -{ - - if(us > 1000) { - DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); - rtw_usleep_os(us); - return; - } - - - //DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); - - -#if defined(PLATFORM_LINUX) - - udelay((unsigned long)us); - -#elif defined(PLATFORM_WINDOWS) - - NdisStallExecution(us); //(us) - -#endif - -} -#else -void rtw_mdelay_os(int ms) -{ - -#ifdef PLATFORM_LINUX - - mdelay((unsigned long)ms); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisStallExecution(ms*1000); //(us)*1000=(ms) - -#endif - - -} -void rtw_udelay_os(int us) -{ - -#ifdef PLATFORM_LINUX - - udelay((unsigned long)us); - -#endif - -#ifdef PLATFORM_WINDOWS - - NdisStallExecution(us); //(us) - -#endif - -} -#endif - -#define RTW_SUSPEND_LOCK_NAME "rtw_wifi" - -#ifdef CONFIG_WAKELOCK -static struct wake_lock rtw_suspend_lock; -#elif defined(CONFIG_ANDROID_POWER) -static android_suspend_lock_t rtw_suspend_lock ={ - .name = RTW_SUSPEND_LOCK_NAME -}; -#endif - -inline void rtw_suspend_lock_init() -{ - #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) - //DBG_871X("##########%s ###########\n", __FUNCTION__); - #endif - - #ifdef CONFIG_WAKELOCK - wake_lock_init(&rtw_suspend_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_LOCK_NAME); - #elif defined(CONFIG_ANDROID_POWER) - android_init_suspend_lock(&rtw_suspend_lock); - #endif - -} - -inline void rtw_suspend_lock_uninit() -{ - - #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) - //DBG_871X("##########%s###########\n", __FUNCTION__); - if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { - DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); - return; - } - #endif - - #ifdef CONFIG_WAKELOCK - wake_lock_destroy(&rtw_suspend_lock); - #elif defined(CONFIG_ANDROID_POWER) - android_uninit_suspend_lock(&rtw_suspend_lock); - #endif -} - - -inline void rtw_lock_suspend() -{ - - #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) - //DBG_871X("##########%s###########\n", __FUNCTION__); - if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { - DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); - return; - } - #endif - - #ifdef CONFIG_WAKELOCK - wake_lock(&rtw_suspend_lock); - #elif defined(CONFIG_ANDROID_POWER) - android_lock_suspend(&rtw_suspend_lock); - #endif -} - -inline void rtw_unlock_suspend() -{ - #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) - //DBG_871X("##########%s###########\n", __FUNCTION__); - if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { - DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); - return; - } - #endif - - #ifdef CONFIG_WAKELOCK - wake_unlock(&rtw_suspend_lock); - #elif defined(CONFIG_ANDROID_POWER) - android_unlock_suspend(&rtw_suspend_lock); - #endif -} - - -inline void ATOMIC_SET(ATOMIC_T *v, int i) -{ - #ifdef PLATFORM_LINUX - atomic_set(v,i); - #elif defined(PLATFORM_WINDOWS) - *v=i;// other choice???? - #endif -} - -inline int ATOMIC_READ(ATOMIC_T *v) -{ - #ifdef PLATFORM_LINUX - return atomic_read(v); - #elif defined(PLATFORM_WINDOWS) - return *v; // other choice???? - #endif -} - -inline void ATOMIC_ADD(ATOMIC_T *v, int i) -{ - #ifdef PLATFORM_LINUX - atomic_add(i,v); - #elif defined(PLATFORM_WINDOWS) - InterlockedAdd(v,i); - #endif -} -inline void ATOMIC_SUB(ATOMIC_T *v, int i) -{ - #ifdef PLATFORM_LINUX - atomic_sub(i,v); - #elif defined(PLATFORM_WINDOWS) - InterlockedAdd(v,-i); - #endif -} - -inline void ATOMIC_INC(ATOMIC_T *v) -{ - #ifdef PLATFORM_LINUX - atomic_inc(v); - #elif defined(PLATFORM_WINDOWS) - InterlockedIncrement(v); - #endif -} - -inline void ATOMIC_DEC(ATOMIC_T *v) -{ - #ifdef PLATFORM_LINUX - atomic_dec(v); - #elif defined(PLATFORM_WINDOWS) - InterlockedDecrement(v); - #endif -} - -inline int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i) -{ - #ifdef PLATFORM_LINUX - return atomic_add_return(i,v); - #elif defined(PLATFORM_WINDOWS) - return InterlockedAdd(v,i); - #endif -} - -inline int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i) -{ - #ifdef PLATFORM_LINUX - return atomic_sub_return(i,v); - #elif defined(PLATFORM_WINDOWS) - return InterlockedAdd(v,-i); - #endif -} - -inline int ATOMIC_INC_RETURN(ATOMIC_T *v) -{ - #ifdef PLATFORM_LINUX - return atomic_inc_return(v); - #elif defined(PLATFORM_WINDOWS) - return InterlockedIncrement(v); - #endif -} - -inline int ATOMIC_DEC_RETURN(ATOMIC_T *v) -{ - #ifdef PLATFORM_LINUX - return atomic_dec_return(v); - #elif defined(PLATFORM_WINDOWS) - return InterlockedDecrement(v); - #endif -} - - -#ifdef PLATFORM_LINUX -int openFile(struct file **fpp, char *path,int flag,int mode) -{ - struct file *fp; - - fp=filp_open(path, flag, mode); - if(IS_ERR(fp)) { - *fpp=NULL; - return PTR_ERR(fp); - } - else { - *fpp=fp; - return 0; - } -} - -int closeFile(struct file *fp) -{ - filp_close(fp,NULL); - return 0; -} - -int readFile(struct file *fp,char *buf,int len) -{ - int rlen=0, sum=0; - - if (!fp->f_op || !fp->f_op->read) - return -EPERM; - - while(sumf_op->read(fp,buf+sum,len-sum, &fp->f_pos); - if(rlen>0) - sum+=rlen; - else if(0 != rlen) - return rlen; - else - break; - } - - return sum; - -} - -int writeFile(struct file *fp,char *buf,int len) -{ - int wlen=0, sum=0; - - if (!fp->f_op || !fp->f_op->write) - return -EPERM; - - while(sumf_op->write(fp,buf+sum,len-sum, &fp->f_pos); - if(wlen>0) - sum+=wlen; - else if(0 != wlen) - return wlen; - else - break; - } - - return sum; - -} -#endif - -#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR -#ifdef PLATFORM_LINUX -struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv) -{ - struct net_device *pnetdev; - struct rtw_netdev_priv_indicator *pnpi; - - pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); - if (!pnetdev) - goto RETURN; - - pnpi = netdev_priv(pnetdev); - pnpi->priv=old_priv; - pnpi->sizeof_priv=sizeof_priv; - -RETURN: - return pnetdev; -} - -struct net_device *rtw_alloc_etherdev(int sizeof_priv) -{ - struct net_device *pnetdev; - struct rtw_netdev_priv_indicator *pnpi; - - pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); - if (!pnetdev) - goto RETURN; - - pnpi = netdev_priv(pnetdev); - - pnpi->priv = rtw_zvmalloc(sizeof_priv); - if (!pnpi->priv) { - free_netdev(pnetdev); - pnetdev = NULL; - goto RETURN; - } - - pnpi->sizeof_priv=sizeof_priv; -RETURN: - return pnetdev; -} - -void rtw_free_netdev(struct net_device * netdev) -{ - struct rtw_netdev_priv_indicator *pnpi; - - if(!netdev) - goto RETURN; - - pnpi = netdev_priv(netdev); - - if(!pnpi->priv) - goto RETURN; - - rtw_vmfree(pnpi->priv, pnpi->sizeof_priv); - free_netdev(netdev); - -RETURN: - return; -} - -/* -* Jeff: this function should be called under ioctl (rtnl_lock is accquired) while -* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) -*/ -int rtw_change_ifname(_adapter *padapter, const char *ifname) -{ - struct net_device *pnetdev; - struct net_device *cur_pnetdev = padapter->pnetdev; - int ret; - - if(!padapter) - goto error; - - //free the old_pnetdev - if(padapter->old_pnetdev) { - free_netdev(padapter->old_pnetdev); - padapter->old_pnetdev = NULL; - } - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) - if(!rtnl_is_locked()) - unregister_netdev(cur_pnetdev); - else -#endif - unregister_netdevice(cur_pnetdev); - - #ifdef CONFIG_PROC_DEBUG - rtw_proc_remove_one(cur_pnetdev); - #endif //CONFIG_PROC_DEBUG - - padapter->old_pnetdev=cur_pnetdev; - - pnetdev = rtw_init_netdev(padapter); - if (!pnetdev) { - ret = -1; - goto error; - } - -#ifdef CONFIG_USB_HCI - - SET_NETDEV_DEV(pnetdev, &padapter->dvobjpriv.pusbintf->dev); - - usb_set_intfdata(padapter->dvobjpriv.pusbintf, pnetdev); - -#elif defined(CONFIG_PCI_HCI) - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) - SET_NETDEV_DEV(pnetdev, &padapter->dvobjpriv.ppcidev->dev); -#endif - - pci_set_drvdata(padapter->dvobjpriv.ppcidev, pnetdev); - -#endif - - rtw_init_netdev_name(pnetdev, ifname); - - _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) - if(!rtnl_is_locked()) - ret = register_netdev(pnetdev); - else -#endif - ret = register_netdevice(pnetdev); - - if ( ret != 0) { - RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n")); - goto error; - } - - #ifdef CONFIG_PROC_DEBUG - rtw_proc_init_one(pnetdev); - #endif //CONFIG_PROC_DEBUG - - return 0; - -error: - - return -1; - -} -#endif -#endif //MEM_ALLOC_REFINE_ADAPTOR - -u64 rtw_modular64(u64 x, u64 y) -{ -#ifdef PLATFORM_LINUX - return do_div(x, y); -#elif defined(PLATFORM_WINDOWS) - return (x % y); -#endif -} - -u64 rtw_division64(u64 x, u64 y) -{ -#ifdef PLATFORM_LINUX - do_div(x, y); - return x; -#elif defined(PLATFORM_WINDOWS) - return (x / y); -#endif -} - From 20e6fe9c5fb4b3e678b2a749bd6734a20455d349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Sat, 24 Sep 2011 21:18:49 +0800 Subject: [PATCH 149/150] Promote the capacity of WiFi connect AP.(V3.20) --- drivers/net/wireless/rtl8192c/Kconfig | 6 + drivers/net/wireless/rtl8192c/Makefile | 202 + .../wireless/rtl8192c/core/efuse/rtw_efuse.c | 1042 + drivers/net/wireless/rtl8192c/core/rtw_cmd.c | 2359 ++ .../net/wireless/rtl8192c/core/rtw_debug.c | 611 + .../net/wireless/rtl8192c/core/rtw_eeprom.c | 424 + .../wireless/rtl8192c/core/rtw_ieee80211.c | 1307 + .../wireless/rtl8192c/core/rtw_intel_widi.c | 525 + drivers/net/wireless/rtl8192c/core/rtw_io.c | 436 + .../wireless/rtl8192c/core/rtw_ioctl_query.c | 197 + .../wireless/rtl8192c/core/rtw_ioctl_rtl.c | 1032 + .../wireless/rtl8192c/core/rtw_ioctl_set.uu | 170 + drivers/net/wireless/rtl8192c/core/rtw_mlme.c | 3681 ++ .../net/wireless/rtl8192c/core/rtw_mlme_ext.c | 11006 ++++++ drivers/net/wireless/rtl8192c/core/rtw_mp.c | 1294 + .../net/wireless/rtl8192c/core/rtw_mp_ioctl.c | 2841 ++ drivers/net/wireless/rtl8192c/core/rtw_p2p.c | 2142 ++ .../net/wireless/rtl8192c/core/rtw_pwrctrl.c | 1126 + drivers/net/wireless/rtl8192c/core/rtw_recv.c | 4440 +++ drivers/net/wireless/rtl8192c/core/rtw_rf.c | 96 + .../net/wireless/rtl8192c/core/rtw_security.c | 2811 ++ .../net/wireless/rtl8192c/core/rtw_sta_mgt.c | 654 + .../wireless/rtl8192c/core/rtw_wlan_util.c | 1747 + drivers/net/wireless/rtl8192c/core/rtw_xmit.c | 3835 ++ drivers/net/wireless/rtl8192c/hal/hal_init.c | 122 + .../rtl8192c/hal/rtl8192c/rtl8192c_cmd.c | 1134 + .../rtl8192c/hal/rtl8192c/rtl8192c_dm.c | 4684 +++ .../rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c | 3592 ++ .../rtl8192c/hal/rtl8192c/rtl8192c_mp.c | 1234 + .../rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c | 5409 +++ .../rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c | 1047 + .../rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c | 752 + .../rtl8192c/hal/rtl8192c/rtl8192c_sreset.c | 285 + .../hal/rtl8192c/usb/Hal8192CUHWImg.c | 7346 ++++ .../rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c | 2676 ++ .../hal/rtl8192c/usb/rtl8192cu_recv.c | 380 + .../hal/rtl8192c/usb/rtl8192cu_xmit.c | 1336 + .../rtl8192c/hal/rtl8192c/usb/usb_halinit.c | 5469 +++ .../rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c | 1208 + .../rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c | 1980 + .../rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c | 1266 + .../rtl8192c/include/Hal8192CEHWImg.h | 66 + .../rtl8192c/include/Hal8192CPhyCfg.h | 451 + .../rtl8192c/include/Hal8192CPhyReg.h | 1102 + .../rtl8192c/include/Hal8192CUHWImg.h | 92 + .../rtl8192c/include/Hal8192DEHWImg.h | 66 + .../rtl8192c/include/Hal8192DETestHWImg.h | 54 + .../rtl8192c/include/Hal8192DPhyCfg.h | 545 + .../rtl8192c/include/Hal8192DPhyReg.h | 1059 + .../rtl8192c/include/Hal8192DUHWImg.h | 66 + .../rtl8192c/include/Hal8192DUTestHWImg.h | 54 + .../net/wireless/rtl8192c/include/autoconf.h | 231 + .../wireless/rtl8192c/include/basic_types.h | 276 + .../rtl8192c/include/byteorder/big_endian.h | 87 + .../rtl8192c/include/byteorder/generic.h | 209 + .../include/byteorder/little_endian.h | 89 + .../rtl8192c/include/byteorder/swab.h | 133 + .../rtl8192c/include/byteorder/swabb.h | 157 + .../net/wireless/rtl8192c/include/circ_buf.h | 27 + .../net/wireless/rtl8192c/include/cmd_osdep.h | 36 + .../net/wireless/rtl8192c/include/drv_conf.h | 69 + .../net/wireless/rtl8192c/include/drv_types.h | 456 + .../wireless/rtl8192c/include/drv_types_ce.h | 92 + .../rtl8192c/include/drv_types_linux.h | 25 + .../wireless/rtl8192c/include/drv_types_xp.h | 95 + .../net/wireless/rtl8192c/include/ethernet.h | 41 + .../net/wireless/rtl8192c/include/farray.h | 31480 ++++++++++++++++ .../net/wireless/rtl8192c/include/h2clbk.h | 35 + .../net/wireless/rtl8192c/include/hal_init.h | 272 + .../net/wireless/rtl8192c/include/ieee80211.h | 1437 + .../wireless/rtl8192c/include/ieee80211_ext.h | 477 + .../net/wireless/rtl8192c/include/if_ether.h | 112 + drivers/net/wireless/rtl8192c/include/ip.h | 138 + .../wireless/rtl8192c/include/mlme_osdep.h | 43 + .../wireless/rtl8192c/include/mp_custom_oid.h | 353 + .../net/wireless/rtl8192c/include/nic_spec.h | 47 + .../rtl8192c/include/osdep_ce_service.h | 171 + .../wireless/rtl8192c/include/osdep_intf.h | 128 + .../wireless/rtl8192c/include/osdep_service.h | 826 + .../net/wireless/rtl8192c/include/pci_hal.h | 168 + .../net/wireless/rtl8192c/include/pci_ops.h | 58 + .../wireless/rtl8192c/include/pci_osintf.h | 33 + .../wireless/rtl8192c/include/recv_osdep.h | 58 + .../wireless/rtl8192c/include/rtl8192c_cmd.h | 98 + .../wireless/rtl8192c/include/rtl8192c_dm.h | 608 + .../rtl8192c/include/rtl8192c_event.h | 29 + .../wireless/rtl8192c/include/rtl8192c_hal.h | 912 + .../wireless/rtl8192c/include/rtl8192c_led.h | 43 + .../wireless/rtl8192c/include/rtl8192c_recv.h | 180 + .../wireless/rtl8192c/include/rtl8192c_rf.h | 93 + .../wireless/rtl8192c/include/rtl8192c_spec.h | 1898 + .../rtl8192c/include/rtl8192c_sreset.h | 54 + .../wireless/rtl8192c/include/rtl8192c_xmit.h | 91 + .../wireless/rtl8192c/include/rtl8192d_cmd.h | 104 + .../wireless/rtl8192c/include/rtl8192d_dm.h | 400 + .../wireless/rtl8192c/include/rtl8192d_hal.h | 892 + .../wireless/rtl8192c/include/rtl8192d_led.h | 44 + .../wireless/rtl8192c/include/rtl8192d_recv.h | 182 + .../wireless/rtl8192c/include/rtl8192d_rf.h | 98 + .../wireless/rtl8192c/include/rtl8192d_spec.h | 1862 + .../wireless/rtl8192c/include/rtl8192d_xmit.h | 106 + .../wireless/rtl8192c/include/rtw_byteorder.h | 41 + .../net/wireless/rtl8192c/include/rtw_cmd.h | 1100 + .../net/wireless/rtl8192c/include/rtw_debug.h | 374 + .../wireless/rtl8192c/include/rtw_eeprom.h | 145 + .../net/wireless/rtl8192c/include/rtw_efuse.h | 123 + .../net/wireless/rtl8192c/include/rtw_event.h | 154 + .../net/wireless/rtl8192c/include/rtw_ht.h | 51 + .../net/wireless/rtl8192c/include/rtw_io.h | 574 + .../net/wireless/rtl8192c/include/rtw_ioctl.h | 271 + .../rtl8192c/include/rtw_ioctl_query.h | 37 + .../wireless/rtl8192c/include/rtw_ioctl_rtl.h | 84 + .../wireless/rtl8192c/include/rtw_ioctl_set.h | 74 + .../net/wireless/rtl8192c/include/rtw_led.h | 212 + .../net/wireless/rtl8192c/include/rtw_mlme.h | 585 + .../wireless/rtl8192c/include/rtw_mlme_ext.h | 752 + .../net/wireless/rtl8192c/include/rtw_mp.h | 638 + .../wireless/rtl8192c/include/rtw_mp_ioctl.h | 596 + .../rtl8192c/include/rtw_mp_phy_regdef.h | 1098 + .../net/wireless/rtl8192c/include/rtw_p2p.h | 54 + .../wireless/rtl8192c/include/rtw_pwrctrl.h | 332 + .../net/wireless/rtl8192c/include/rtw_qos.h | 41 + .../net/wireless/rtl8192c/include/rtw_recv.h | 703 + .../net/wireless/rtl8192c/include/rtw_rf.h | 144 + .../wireless/rtl8192c/include/rtw_security.h | 423 + .../wireless/rtl8192c/include/rtw_version.h | 1 + .../net/wireless/rtl8192c/include/rtw_xmit.h | 657 + .../net/wireless/rtl8192c/include/sdio_hal.h | 34 + .../net/wireless/rtl8192c/include/sdio_ops.h | 80 + .../wireless/rtl8192c/include/sdio_ops_ce.h | 56 + .../rtl8192c/include/sdio_ops_linux.h | 55 + .../wireless/rtl8192c/include/sdio_ops_xp.h | 56 + .../wireless/rtl8192c/include/sdio_osintf.h | 48 + .../net/wireless/rtl8192c/include/sta_info.h | 294 + .../net/wireless/rtl8192c/include/usb_hal.h | 30 + .../net/wireless/rtl8192c/include/usb_ops.h | 95 + .../wireless/rtl8192c/include/usb_osintf.h | 39 + .../rtl8192c/include/usb_vendor_req.h | 60 + drivers/net/wireless/rtl8192c/include/wifi.h | 1169 + .../wireless/rtl8192c/include/wlan_bssdef.h | 445 + .../wireless/rtl8192c/include/xmit_osdep.h | 90 + .../rtl8192c/os_dep/linux/ioctl_linux.uu | 997 + .../rtl8192c/os_dep/linux/mlme_linux.c | 781 + .../wireless/rtl8192c/os_dep/linux/os_intfs.c | 1356 + .../rtl8192c/os_dep/linux/recv_linux.c | 391 + .../wireless/rtl8192c/os_dep/linux/usb_intf.c | 1497 + .../rtl8192c/os_dep/linux/wifi_power.c | 114 + .../rtl8192c/os_dep/linux/wifi_power.h | 87 + .../rtl8192c/os_dep/linux/wifi_power_ops.c | 112 + .../rtl8192c/os_dep/linux/wifi_power_usb.c | 118 + .../rtl8192c/os_dep/linux/wifi_version.h | 13 + .../rtl8192c/os_dep/linux/xmit_linux.c | 291 + .../wireless/rtl8192c/os_dep/osdep_service.c | 1369 + 153 files changed, 151953 insertions(+) create mode 100755 drivers/net/wireless/rtl8192c/Kconfig create mode 100755 drivers/net/wireless/rtl8192c/Makefile create mode 100755 drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_cmd.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_debug.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_eeprom.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_intel_widi.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_io.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c create mode 100644 drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mlme.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mp.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_p2p.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_recv.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_rf.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_security.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c create mode 100755 drivers/net/wireless/rtl8192c/core/rtw_xmit.c create mode 100755 drivers/net/wireless/rtl8192c/hal/hal_init.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_mp.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c create mode 100755 drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h create mode 100755 drivers/net/wireless/rtl8192c/include/autoconf.h create mode 100755 drivers/net/wireless/rtl8192c/include/basic_types.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/generic.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/swab.h create mode 100755 drivers/net/wireless/rtl8192c/include/byteorder/swabb.h create mode 100755 drivers/net/wireless/rtl8192c/include/circ_buf.h create mode 100755 drivers/net/wireless/rtl8192c/include/cmd_osdep.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_conf.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_ce.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_linux.h create mode 100755 drivers/net/wireless/rtl8192c/include/drv_types_xp.h create mode 100755 drivers/net/wireless/rtl8192c/include/ethernet.h create mode 100755 drivers/net/wireless/rtl8192c/include/farray.h create mode 100755 drivers/net/wireless/rtl8192c/include/h2clbk.h create mode 100755 drivers/net/wireless/rtl8192c/include/hal_init.h create mode 100755 drivers/net/wireless/rtl8192c/include/ieee80211.h create mode 100755 drivers/net/wireless/rtl8192c/include/ieee80211_ext.h create mode 100755 drivers/net/wireless/rtl8192c/include/if_ether.h create mode 100755 drivers/net/wireless/rtl8192c/include/ip.h create mode 100755 drivers/net/wireless/rtl8192c/include/mlme_osdep.h create mode 100755 drivers/net/wireless/rtl8192c/include/mp_custom_oid.h create mode 100755 drivers/net/wireless/rtl8192c/include/nic_spec.h create mode 100755 drivers/net/wireless/rtl8192c/include/osdep_ce_service.h create mode 100755 drivers/net/wireless/rtl8192c/include/osdep_intf.h create mode 100755 drivers/net/wireless/rtl8192c/include/osdep_service.h create mode 100755 drivers/net/wireless/rtl8192c/include/pci_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/pci_ops.h create mode 100755 drivers/net/wireless/rtl8192c/include/pci_osintf.h create mode 100755 drivers/net/wireless/rtl8192c/include/recv_osdep.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_event.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_led.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_led.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_byteorder.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_cmd.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_debug.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_eeprom.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_efuse.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_event.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ht.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_io.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_led.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mlme.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_p2p.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_qos.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_recv.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_rf.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_security.h create mode 100644 drivers/net/wireless/rtl8192c/include/rtw_version.h create mode 100755 drivers/net/wireless/rtl8192c/include/rtw_xmit.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h create mode 100755 drivers/net/wireless/rtl8192c/include/sdio_osintf.h create mode 100755 drivers/net/wireless/rtl8192c/include/sta_info.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_hal.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_ops.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_osintf.h create mode 100755 drivers/net/wireless/rtl8192c/include/usb_vendor_req.h create mode 100755 drivers/net/wireless/rtl8192c/include/wifi.h create mode 100755 drivers/net/wireless/rtl8192c/include/wlan_bssdef.h create mode 100755 drivers/net/wireless/rtl8192c/include/xmit_osdep.h create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c create mode 100644 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h create mode 100755 drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c create mode 100755 drivers/net/wireless/rtl8192c/os_dep/osdep_service.c diff --git a/drivers/net/wireless/rtl8192c/Kconfig b/drivers/net/wireless/rtl8192c/Kconfig new file mode 100755 index 000000000000..bee5ed626452 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/Kconfig @@ -0,0 +1,6 @@ +config RTL8192CU + tristate "Realtek 8192C USB WiFi" + depends on USB + ---help--- + Help message of RTL8192CU + diff --git a/drivers/net/wireless/rtl8192c/Makefile b/drivers/net/wireless/rtl8192c/Makefile new file mode 100755 index 000000000000..3adb4e66761c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/Makefile @@ -0,0 +1,202 @@ +# +# Makefile for RTL8188/8192 USB WiFi +# + +EXTRA_CFLAGS += -O1 +#EXTRA_CFLAGS += -O3 +EXTRA_CFLAGS += -Wall +#EXTRA_CFLAGS += -Wextra +#EXTRA_CFLAGS += -Werror +#EXTRA_CFLAGS += -pedantic +#EXTRA_CFLAGS += -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes + +EXTRA_CFLAGS += -Wno-unused-variable +EXTRA_CFLAGS += -Wno-unused-value +EXTRA_CFLAGS += -Wno-unused-label +EXTRA_CFLAGS += -Wno-unused-parameter +EXTRA_CFLAGS += -Wno-unused-function +EXTRA_CFLAGS += -Wno-unused + +EXTRA_CFLAGS += -Wno-uninitialized + +EXTRA_CFLAGS += -I$(src)/include + +CONFIG_AUTOCFG_CP = n + +CONFIG_RTL8192C = y +CONFIG_RTL8192D = n + +CONFIG_USB_HCI = y +CONFIG_PCI_HCI = n +CONFIG_SDIO_HCI = n + +CONFIG_MP_INCLUDED = n +CONFIG_POWER_SAVING = n +CONFIG_USB_AUTOSUSPEND = n +CONFIG_HW_PWRP_DETECTION = n +CONFIG_WIFI_TEST = n +CONFIG_BT_COEXISTENCE = n +CONFIG_RTL8192CU_REDEFINE_1X1 = n + +CONFIG_PLATFORM_ARM_RK2918 = y + +CONFIG_DRVEXT_MODULE = n + +export TopDIR ?= $(shell pwd) + + +ifeq ($(CONFIG_RTL8192C), y) + +RTL871X = rtl8192c + +ifeq ($(CONFIG_USB_HCI), y) +MODULE_NAME = 8192cu +FW_FILES := hal/$(RTL871X)/usb/Hal8192CUHWImg.o +endif + +CHIP_FILES := hal/$(RTL871X)/$(RTL871X)_sreset.o +CHIP_FILES += $(FW_FILES) +endif + +os_dep/linux/ioctl_linux.o: os_dep/linux/ioctl_linux.uu + @echo "UUDE os_dep/linux/ioctl_linux.uu" + @uudecode os_dep/linux/ioctl_linux.uu -o os_dep/linux/ioctl_linux.o + +ifeq ($(CONFIG_USB_HCI), y) + +HCI_NAME = usb + +_OS_INTFS_FILES := os_dep/osdep_service.o \ + os_dep/linux/os_intfs.o \ + os_dep/linux/$(HCI_NAME)_intf.o \ + os_dep/linux/ioctl_linux.o \ + os_dep/linux/xmit_linux.o \ + os_dep/linux/ioctl_linux.o \ + os_dep/linux/mlme_linux.o \ + os_dep/linux/recv_linux.o + +_HAL_INTFS_FILES := hal/hal_init.o \ + hal/$(RTL871X)/$(RTL871X)_hal_init.o \ + hal/$(RTL871X)/$(RTL871X)_phycfg.o \ + hal/$(RTL871X)/$(RTL871X)_rf6052.o \ + hal/$(RTL871X)/$(RTL871X)_dm.o \ + hal/$(RTL871X)/$(RTL871X)_rxdesc.o \ + hal/$(RTL871X)/$(RTL871X)_cmd.o \ + hal/$(RTL871X)/usb/usb_ops_linux.o \ + hal/$(RTL871X)/usb/usb_halinit.o \ + hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_led.o \ + hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_xmit.o \ + hal/$(RTL871X)/usb/rtl$(MODULE_NAME)_recv.o + +_HAL_INTFS_FILES += $(CHIP_FILES) + +endif + +ifeq ($(CONFIG_AUTOCFG_CP), y) +$(shell cp $(TopDIR)/autoconf_$(RTL871X)_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h) +endif + + +ifeq ($(CONFIG_USB_HCI), y) +ifeq ($(CONFIG_USB_AUTOSUSPEND), y) +EXTRA_CFLAGS += -DCONFIG_USB_AUTOSUSPEND +endif +endif + +ifeq ($(CONFIG_POWER_SAVING), y) +EXTRA_CFLAGS += -DCONFIG_POWER_SAVING +endif + +ifeq ($(CONFIG_HW_PWRP_DETECTION), y) +EXTRA_CFLAGS += -DCONFIG_HW_PWRP_DETECTION +endif + +ifeq ($(CONFIG_WIFI_TEST), y) +EXTRA_CFLAGS += -DCONFIG_WIFI_TEST +endif + +ifeq ($(CONFIG_BT_COEXISTENCE), y) +EXTRA_CFLAGS += -DCONFIG_BT_COEXISTENCE +endif + +ifeq ($(CONFIG_RTL8192CU_REDEFINE_1X1), y) +EXTRA_CFLAGS += -DRTL8192C_RECONFIG_TO_1T1R +endif + +ifeq ($(CONFIG_PLATFORM_ARM_RK2918), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS +ARCH := arm +CROSS_COMPILE := /opt/toolchain/arm-eabi-4.4.0/bin/arm-eabi- +KSRC := 2.6.25.1 +#MODULE_NAME := wlan0 +endif + +# +# Add minimize memory usage. +# +EXTRA_CFLAGS += -DCONFIG_MINIMAL_MEMORY_USAGE + +ifneq ($(KERNELRELEASE),) + + +rtk_core := core/rtw_cmd.o \ + core/rtw_security.o \ + core/rtw_debug.o \ + core/rtw_io.o \ + core/rtw_ioctl_query.o \ + core/rtw_ioctl_set.o \ + core/rtw_ieee80211.o \ + core/rtw_mlme.o \ + core/rtw_mlme_ext.o \ + core/rtw_wlan_util.o \ + core/rtw_pwrctrl.o \ + core/rtw_rf.o \ + core/rtw_recv.o \ + core/rtw_sta_mgt.o \ + core/rtw_xmit.o \ + core/rtw_p2p.o + +rtl$(MODULE_NAME)-y += $(rtk_core) + +rtl$(MODULE_NAME)-y += core/efuse/rtw_efuse.o + +rtl$(MODULE_NAME)-y += $(_HAL_INTFS_FILES) + +rtl$(MODULE_NAME)-y += $(_OS_INTFS_FILES) + +core/rtw_ioctl_set.o: core/rtw_ioctl_set.uu + @echo "UUDE core/rtw_ioctl_set.uu" + @uudecode core/rtw_ioctl_set.uu -o core/rtw_ioctl_set.o + +rtl$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o \ + core/rtw_mp_ioctl.o \ + core/rtw_ioctl_rtl.o + +rk_cfg := \ + os_dep/linux/wifi_power.o \ + os_dep/linux/wifi_power_usb.o \ + os_dep/linux/wifi_power_ops.o + +rkcfg-y += $(rk_cfg) +obj-$(CONFIG_RTL8192CU) := rtl$(MODULE_NAME).o rkcfg.o + +else + +export CONFIG_RTL8192CU = m + +all: modules + +modules: + $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd) modules + +strip: + $(CROSS_COMPILE)strip $(MODULE_NAME).ko --strip-unneeded + +config_r: + @echo "make config" + /bin/bash script/Configure script/config.in + +.PHONY: modules clean + +endif + diff --git a/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c b/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c new file mode 100755 index 000000000000..2d90a4c5963f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/efuse/rtw_efuse.c @@ -0,0 +1,1042 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_EFUSE_C_ + +#include +#include +#include + +#include + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE +extern int storeAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path); +extern int retriveAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path); +#endif + + +/*------------------------Define local variable------------------------------*/ +u8 fakeEfuseBank=0; +u32 fakeEfuseUsedBytes=0; +u8 fakeEfuseContent[EFUSE_MAX_HW_SIZE]={0}; +u8 fakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0}; +u8 fakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0}; + +u32 BTEfuseUsedBytes=0; +u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +u8 BTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; +u8 BTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; + +u32 fakeBTEfuseUsedBytes=0; +u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +u8 fakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0}; +u8 fakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0}; +/*------------------------Define local variable------------------------------*/ + +//------------------------------------------------------------------------------ +#define REG_EFUSE_CTRL 0x0030 +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. +//------------------------------------------------------------------------------ + +BOOLEAN +Efuse_Read1ByteFromFakeContent( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u8 *Value ) +{ + if(Offset >= EFUSE_MAX_HW_SIZE) + { + return _FALSE; + } + //DbgPrint("Read fake content, offset = %d\n", Offset); + if(fakeEfuseBank == 0) + *Value = fakeEfuseContent[Offset]; + else + *Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset]; + return _TRUE; +} +BOOLEAN +Efuse_Write1ByteToFakeContent( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u8 Value ) +{ + if(Offset >= EFUSE_MAX_HW_SIZE) + { + return _FALSE; + } + if(fakeEfuseBank == 0) + fakeEfuseContent[Offset] = Value; + else + { + fakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value; + } + return _TRUE; +} + +/*----------------------------------------------------------------------------- + * Function: Efuse_PowerSwitch + * + * Overview: When we want to enable write operation, we should change to + * pwr on state. When we stop write, we should switch to 500k mode + * and disable LDO 2.5V. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/17/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +VOID +Efuse_PowerSwitch( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + pAdapter->HalFunc.EfusePowerSwitch(pAdapter, bWrite, PwrState); +} + +/*----------------------------------------------------------------------------- + * Function: efuse_GetCurrentSize + * + * Overview: Get current efuse size!!! + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/16/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +u16 +Efuse_GetCurrentSize( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest) +{ + u16 ret=0; + + ret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest); + + return ret; +} + +/* 11/16/2008 MH Add description. Get current efuse area enabled word!!. */ +u8 +Efuse_CalculateWordCnts(IN u8 word_en) +{ + u8 word_cnts = 0; + if(!(word_en & BIT(0))) word_cnts++; // 0 : write enable + if(!(word_en & BIT(1))) word_cnts++; + if(!(word_en & BIT(2))) word_cnts++; + if(!(word_en & BIT(3))) word_cnts++; + return word_cnts; +} + +// +// Description: +// Execute E-Fuse read byte operation. +// Refered from SD1 Richard. +// +// Assumption: +// 1. Boot from E-Fuse and successfully auto-load. +// 2. PASSIVE_LEVEL (USB interface) +// +// Created by Roger, 2008.10.21. +// +VOID +ReadEFuseByte( + PADAPTER Adapter, + u16 _offset, + u8 *pbuf, + IN BOOLEAN bPseudoTest) +{ + u32 value32; + u8 readbyte; + u16 retry; + //u32 start=rtw_get_current_time(); + + if(bPseudoTest) + { + Efuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf); + return; + } + + //Write Address + rtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff)); + readbyte = rtw_read8(Adapter, EFUSE_CTRL+2); + rtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc)); + + //Write bit 32 0 + readbyte = rtw_read8(Adapter, EFUSE_CTRL+3); + rtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f)); + + //Check bit 32 read-ready + retry = 0; + value32 = rtw_read32(Adapter, EFUSE_CTRL); + //while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10)) + while(!(((value32 >> 24) & 0xff) & 0x80) && (retry<10000)) + { + value32 = rtw_read32(Adapter, EFUSE_CTRL); + retry++; + } + + // 20100205 Joseph: Add delay suggested by SD1 Victor. + // This fix the problem that Efuse read error in high temperature condition. + // Designer says that there shall be some delay after ready bit is set, or the + // result will always stay on last data we read. + rtw_udelay_os(50); + value32 = rtw_read32(Adapter, EFUSE_CTRL); + + *pbuf = (u8)(value32 & 0xff); + //MSG_8192C("ReadEFuseByte _offset:%08u, in %d ms\n",_offset ,rtw_get_passing_time_ms(start)); + +} + + +// +// Description: +// 1. Execute E-Fuse read byte operation according as map offset and +// save to E-Fuse table. +// 2. Refered from SD1 Richard. +// +// Assumption: +// 1. Boot from E-Fuse and successfully auto-load. +// 2. PASSIVE_LEVEL (USB interface) +// +// Created by Roger, 2008.10.21. +// +// 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. +// 2. Add efuse utilization collect. +// 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 +// write addr must be after sec5. +// +VOID +efuse_ReadEFuse( + PADAPTER Adapter, + u8 efuseType, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + Adapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest); +} + +VOID +EFUSE_GetEfuseDefinition( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u8 type, + OUT PVOID *pOut, + IN BOOLEAN bPseudoTest + ) +{ + pAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest); +} + +/*----------------------------------------------------------------------------- + * Function: EFUSE_Read1Byte + * + * Overview: Copy from WMAC fot EFUSE read 1 byte. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 09/23/2008 MHC Copy from WMAC. + * + *---------------------------------------------------------------------------*/ +u8 +EFUSE_Read1Byte( + IN PADAPTER Adapter, + IN u16 Address) +{ + u8 data; + u8 Bytetemp = {0x00}; + u8 temp = {0x00}; + u32 k=0; + u16 contentLen=0; + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); + + if (Address < contentLen) //E-fuse 512Byte + { + //Write E-fuse Register address bit0~7 + temp = Address & 0xFF; + rtw_write8(Adapter, EFUSE_CTRL+1, temp); + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); + //Write E-fuse Register address bit8~9 + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); + rtw_write8(Adapter, EFUSE_CTRL+2, temp); + + //Write 0x30[31]=0 + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + temp = Bytetemp & 0x7F; + rtw_write8(Adapter, EFUSE_CTRL+3, temp); + + //Wait Write-ready (0x30[31]=1) + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + while(!(Bytetemp & 0x80)) + { + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + k++; + if(k==1000) + { + k=0; + break; + } + } + data=rtw_read8(Adapter, EFUSE_CTRL); + return data; + } + else + return 0xFF; + +}/* EFUSE_Read1Byte */ + +/*----------------------------------------------------------------------------- + * Function: EFUSE_Write1Byte + * + * Overview: Copy from WMAC fot EFUSE write 1 byte. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 09/23/2008 MHC Copy from WMAC. + * + *---------------------------------------------------------------------------*/ +void +EFUSE_Write1Byte( + IN PADAPTER Adapter, + IN u16 Address, + IN u8 Value) +{ + u8 Bytetemp = {0x00}; + u8 temp = {0x00}; + u32 k=0; + u16 contentLen=0; + + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr=%x Data =%x\n", Address, Value)); + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE); + + if( Address < contentLen) //E-fuse 512Byte + { + rtw_write8(Adapter, EFUSE_CTRL, Value); + + //Write E-fuse Register address bit0~7 + temp = Address & 0xFF; + rtw_write8(Adapter, EFUSE_CTRL+1, temp); + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+2); + + //Write E-fuse Register address bit8~9 + temp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC); + rtw_write8(Adapter, EFUSE_CTRL+2, temp); + + //Write 0x30[31]=1 + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + temp = Bytetemp | 0x80; + rtw_write8(Adapter, EFUSE_CTRL+3, temp); + + //Wait Write-ready (0x30[31]=0) + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + while(Bytetemp & 0x80) + { + Bytetemp = rtw_read8(Adapter, EFUSE_CTRL+3); + k++; + if(k==100) + { + k=0; + break; + } + } + } +}/* EFUSE_Write1Byte */ + +/* 11/16/2008 MH Read one byte from real Efuse. */ +u8 +efuse_OneByteRead( + IN PADAPTER pAdapter, + IN u16 addr, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 tmpidx = 0; + u8 bResult; + + if(bPseudoTest) + { + bResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data); + return bResult; + } + // -----------------e-fuse reg ctrl --------------------------------- + //address + rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff)); + rtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) | + (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )); + + rtw_write8(pAdapter, EFUSE_CTRL+3, 0x72);//read cmd + + while(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<100)) + { + tmpidx++; + } + if(tmpidx<100) + { + *data=rtw_read8(pAdapter, EFUSE_CTRL); + bResult = _TRUE; + } + else + { + *data = 0xff; + bResult = _FALSE; + } + return bResult; +} + +/* 11/16/2008 MH Write one byte to reald Efuse. */ +u8 +efuse_OneByteWrite( + IN PADAPTER pAdapter, + IN u16 addr, + IN u8 data, + IN BOOLEAN bPseudoTest) +{ + u8 tmpidx = 0; + u8 bResult; + + if(bPseudoTest) + { + bResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data); + return bResult; + } + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("Addr = %x Data=%x\n", addr, data)); + + //return 0; + + // -----------------e-fuse reg ctrl --------------------------------- + //address + rtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff)); + rtw_write8(pAdapter, EFUSE_CTRL+2, + (rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC )|(u8)((addr>>8)&0x03) ); + rtw_write8(pAdapter, EFUSE_CTRL, data);//data + + rtw_write8(pAdapter, EFUSE_CTRL+3, 0xF2);//write cmd + + while((0x80 & rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){ + tmpidx++; + } + + if(tmpidx<100) + { + bResult = _TRUE; + } + else + { + bResult = _FALSE; + } + + return bResult; +} + +int +Efuse_PgPacketRead( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + ret = pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest); + + return ret; +} + +int +Efuse_PgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret; + + ret = pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest); + + return ret; +} + +/*----------------------------------------------------------------------------- + * Function: efuse_WordEnableDataRead + * + * Overview: Read allowed word in current efuse section data. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/16/2008 MHC Create Version 0. + * 11/21/2008 MHC Fix Write bug when we only enable late word. + * + *---------------------------------------------------------------------------*/ +void +efuse_WordEnableDataRead(IN u8 word_en, + IN u8 *sourdata, + IN u8 *targetdata) +{ + if (!(word_en&BIT(0))) + { + targetdata[0] = sourdata[0]; + targetdata[1] = sourdata[1]; + } + if (!(word_en&BIT(1))) + { + targetdata[2] = sourdata[2]; + targetdata[3] = sourdata[3]; + } + if (!(word_en&BIT(2))) + { + targetdata[4] = sourdata[4]; + targetdata[5] = sourdata[5]; + } + if (!(word_en&BIT(3))) + { + targetdata[6] = sourdata[6]; + targetdata[7] = sourdata[7]; + } +} + + +u8 +Efuse_WordEnableDataWrite( IN PADAPTER pAdapter, + IN u16 efuse_addr, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 ret=0; + + ret = pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest); + + return ret; +} + +static u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value) +{ + return efuse_OneByteRead(padapter,address, value, _FALSE); +} + +static u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value) +{ + return efuse_OneByteWrite(padapter,address, *value, _FALSE); +} + +/* + * read/wirte raw efuse data + */ +u8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data) +{ + int i = 0; + u16 real_content_len = 0, max_available_size = 0; + u8 res = _FAIL ; + u8 (*rw8)(PADAPTER, u16, u8*); + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE); + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); + + if (start_addr > real_content_len) + return _FAIL; + + if (_TRUE == bWrite) { + if ((start_addr + cnts) > max_available_size) + return _FAIL; + rw8 = &efuse_write8; + } else + rw8 = &efuse_read8; + + Efuse_PowerSwitch(padapter, bWrite, _TRUE); + + // e-fuse one byte read / write + for (i = 0; i < cnts; i++) { + if (start_addr >= real_content_len) { + res = _FAIL; + break; + } + + res = rw8(padapter, start_addr++, data++); + if (_FAIL == res) break; + } + + Efuse_PowerSwitch(padapter, bWrite, _FALSE); + + return res; +} +//------------------------------------------------------------------------------ +u16 efuse_GetMaxSize(PADAPTER padapter) +{ + u16 max_size; + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); + return max_size; +} +//------------------------------------------------------------------------------ +u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size) +{ + Efuse_PowerSwitch(padapter, _FALSE, _TRUE); + *size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE); + Efuse_PowerSwitch(padapter, _FALSE, _FALSE); + + return _SUCCESS; +} +//------------------------------------------------------------------------------ +u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) +{ + u16 mapLen=0; + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + if ((addr + cnts) > mapLen) + return _FAIL; + + Efuse_PowerSwitch(padapter, _FALSE, _TRUE); + + efuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE); + + Efuse_PowerSwitch(padapter, _FALSE, _FALSE); + + return _SUCCESS; +} +//------------------------------------------------------------------------------ +u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) +{ + u8 offset, word_en; + u8 *map; + u8 newdata[PGPKT_DATA_SIZE]; + s32 i, j, idx; + u8 ret = _SUCCESS; + u16 mapLen=0; + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + if ((addr + cnts) > mapLen) + return _FAIL; + + map = rtw_zmalloc(mapLen); + if(map == NULL){ + return _FAIL; + } + + ret = rtw_efuse_map_read(padapter, 0, mapLen, map); + if (ret == _FAIL) goto exit; + + Efuse_PowerSwitch(padapter, _TRUE, _TRUE); + + offset = (addr >> 3); + word_en = 0xF; + _rtw_memset(newdata, 0xFF, PGPKT_DATA_SIZE); + i = addr & 0x7; // index of one package + j = 0; // index of new package + idx = 0; // data index + + if (i & 0x1) { + // odd start + if (data[idx] != map[addr+idx]) { + word_en &= ~BIT(i >> 1); + newdata[i-1] = map[addr+idx-1]; + newdata[i] = data[idx]; + } + i++; + idx++; + } + do { + for (; i < PGPKT_DATA_SIZE; i += 2) + { + if (cnts == idx) break; + if ((cnts - idx) == 1) { + if (data[idx] != map[addr+idx]) { + word_en &= ~BIT(i >> 1); + newdata[i] = data[idx]; + newdata[i+1] = map[addr+idx+1]; + } + idx++; + break; + } else { + if ((data[idx] != map[addr+idx]) || + (data[idx+1] != map[addr+idx+1])) + { + word_en &= ~BIT(i >> 1); + newdata[i] = data[idx]; + newdata[i+1] = data[idx + 1]; + } + idx += 2; + } + if (idx == cnts) break; + } + + if (word_en != 0xF) { + ret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE); + DBG_8192C("offset=%x \n",offset); + DBG_8192C("word_en=%x \n",word_en); + + for(i=0;iefuse_eeprom_data[Offset]; + +} // EFUSE_ShadowRead1Byte + +//---------------Read Two Bytes +static VOID +efuse_ShadowRead2Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u16 *Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + *Value = pEEPROM->efuse_eeprom_data[Offset]; + *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; + +} // EFUSE_ShadowRead2Byte + +//---------------Read Four Bytes +static VOID +efuse_ShadowRead4Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN OUT u32 *Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + *Value = pEEPROM->efuse_eeprom_data[Offset]; + *Value |= pEEPROM->efuse_eeprom_data[Offset+1]<<8; + *Value |= pEEPROM->efuse_eeprom_data[Offset+2]<<16; + *Value |= pEEPROM->efuse_eeprom_data[Offset+3]<<24; + +} // efuse_ShadowRead4Byte + + +/*----------------------------------------------------------------------------- + * Function: efuse_ShadowWrite1Byte + * efuse_ShadowWrite2Byte + * efuse_ShadowWrite4Byte + * + * Overview: Write efuse modify map by one/two/four byte. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +efuse_ShadowWrite1Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u8 Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + pEEPROM->efuse_eeprom_data[Offset] = Value; + +} // efuse_ShadowWrite1Byte + +//---------------Write Two Bytes +static VOID +efuse_ShadowWrite2Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u16 Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + pEEPROM->efuse_eeprom_data[Offset] = Value&0x00FF; + pEEPROM->efuse_eeprom_data[Offset+1] = Value>>8; + +} // efuse_ShadowWrite1Byte + +//---------------Write Four Bytes +static VOID +efuse_ShadowWrite4Byte( + IN PADAPTER pAdapter, + IN u16 Offset, + IN u32 Value) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + + pEEPROM->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF); + pEEPROM->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF); + pEEPROM->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF); + pEEPROM->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF); + +} // efuse_ShadowWrite1Byte + +/*----------------------------------------------------------------------------- + * Function: EFUSE_ShadowMapUpdate + * + * Overview: Transfer current EFUSE content to shadow init and modify map. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/13/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +void EFUSE_ShadowMapUpdate( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + u16 mapLen=0; + + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest); + + if (pEEPROM->bautoload_fail_flag == _TRUE) + { + _rtw_memset(pEEPROM->efuse_eeprom_data, 0xFF, mapLen); + } + else + { + #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + if(0 != retriveAdaptorInfoFile(pEEPROM, pAdapter->registrypriv.adaptor_info_caching_file_path)) { + #endif + + Efuse_ReadAllMap(pAdapter, efuseType, pEEPROM->efuse_eeprom_data, bPseudoTest); + + #ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + storeAdaptorInfoFile(pEEPROM, pAdapter->registrypriv.adaptor_info_caching_file_path); + } + #endif + } + + //PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], + //(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen); +}// EFUSE_ShadowMapUpdate + + +/*----------------------------------------------------------------------------- + * Function: EFUSE_ShadowRead + * + * Overview: Read from efuse init map !!!!! + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +void +EFUSE_ShadowRead( + IN PADAPTER pAdapter, + IN u8 Type, + IN u16 Offset, + IN OUT u32 *Value ) +{ + if (Type == 1) + efuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value); + else if (Type == 2) + efuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value); + else if (Type == 4) + efuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value); + +} // EFUSE_ShadowRead + +/*----------------------------------------------------------------------------- + * Function: EFUSE_ShadowWrite + * + * Overview: Write efuse modify map for later update operation to use!!!!! + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +extern VOID +EFUSE_ShadowWrite( + IN PADAPTER pAdapter, + IN u8 Type, + IN u16 Offset, + IN OUT u32 Value) +{ +#if (MP_DRIVER == 0) + return; +#endif + + if (Type == 1) + efuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value); + else if (Type == 2) + efuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value); + else if (Type == 4) + efuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value); + +} // EFUSE_ShadowWrite + +VOID +Efuse_InitSomeVar( + IN PADAPTER pAdapter + ) +{ + u8 i; + + _rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE); + _rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN); + _rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN); + + for(i=0; i +#include +#include +#include +#include +#include +#include + +/* +Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. +No irqsave is necessary. +*/ + +sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv) +{ + sint res=_SUCCESS; + +_func_enter_; + + _rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0); + //_rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0); + _rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0); + + + _rtw_init_queue(&(pcmdpriv->cmd_queue)); + + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + + pcmdpriv->cmd_seq = 1; + + pcmdpriv->cmd_allocated_buf = rtw_zmalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ); + + if (pcmdpriv->cmd_allocated_buf == NULL){ + res= _FAIL; + goto exit; + } + + //pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ( (SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ-1)); + pcmdpriv->cmd_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pcmdpriv->cmd_allocated_buf ), CMDBUFF_ALIGN_SZ); + + pcmdpriv->rsp_allocated_buf = rtw_zmalloc(MAX_RSPSZ + 4); + + if (pcmdpriv->rsp_allocated_buf == NULL){ + res= _FAIL; + goto exit; + } + + //pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ( (SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3); + pcmdpriv->rsp_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pcmdpriv->rsp_allocated_buf ), 4); + + pcmdpriv->cmd_issued_cnt = pcmdpriv->cmd_done_cnt = pcmdpriv->rsp_cnt = 0; + +exit: + +_func_exit_; + + return res; + +} + + +sint _rtw_init_evt_priv(struct evt_priv *pevtpriv) +{ + sint res=_SUCCESS; + +_func_enter_; + +#ifdef CONFIG_H2CLBK + _rtw_init_sema(&(pevtpriv->lbkevt_done), 0); + pevtpriv->lbkevt_limit = 0; + pevtpriv->lbkevt_num = 0; + pevtpriv->cmdevt_parm = NULL; +#endif + + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + ATOMIC_SET(&pevtpriv->event_seq, 0); + pevtpriv->evt_done_cnt = 0; + +#ifdef CONFIG_EVENT_THREAD_MODE + + _rtw_init_sema(&(pevtpriv->evt_notify), 0); + _rtw_init_sema(&(pevtpriv->terminate_evtthread_sema), 0); + + pevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4); + if (pevtpriv->evt_allocated_buf == NULL){ + res= _FAIL; + goto exit; + } + //pevtpriv->evt_buf = pevtpriv->evt_allocated_buf + 4 - ((unsigned int)(pevtpriv->evt_allocated_buf) & 3); + pevtpriv->evt_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pevtpriv->evt_allocated_buf ), 4); + + +#ifdef CONFIG_SDIO_HCI + pevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ +4); + + if (pevtpriv->allocated_c2h_mem == NULL){ + res= _FAIL; + goto exit; + } + + //pevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem + 4 + //- ( (u32)(pevtpriv->allocated_c2h_mem) & 3); + pevtpriv->c2h_mem = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pevtpriv->allocated_c2h_mem ), 4); + +#ifdef PLATFORM_OS_XP + pevtpriv->pc2h_mdl= IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL); + + if(pevtpriv->pc2h_mdl == NULL){ + res= _FAIL; + goto exit; + } + MmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl); +#endif +#endif //end of CONFIG_SDIO_HCI + + _rtw_init_queue(&(pevtpriv->evt_queue)); + +exit: + +#endif //end of CONFIG_EVENT_THREAD_MODE + +_func_exit_; + + return res; +} + +void _rtw_free_evt_priv (struct evt_priv *pevtpriv) +{ +_func_enter_; + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("+_rtw_free_evt_priv \n")); + +#ifdef CONFIG_EVENT_THREAD_MODE + _rtw_free_sema(&(pevtpriv->evt_notify)); + _rtw_free_sema(&(pevtpriv->terminate_evtthread_sema)); + + + if (pevtpriv->evt_allocated_buf) + rtw_mfree(pevtpriv->evt_allocated_buf, MAX_EVTSZ + 4); +#endif + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("-_rtw_free_evt_priv \n")); + +_func_exit_; + +} + +void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) +{ +_func_enter_; + + if(pcmdpriv){ + _rtw_spinlock_free(&(pcmdpriv->cmd_queue.lock)); + _rtw_free_sema(&(pcmdpriv->cmd_queue_sema)); + //_rtw_free_sema(&(pcmdpriv->cmd_done_sema)); + _rtw_free_sema(&(pcmdpriv->terminate_cmdthread_sema)); + + if (pcmdpriv->cmd_allocated_buf) + rtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ); + + if (pcmdpriv->rsp_allocated_buf) + rtw_mfree(pcmdpriv->rsp_allocated_buf, MAX_RSPSZ + 4); + } +_func_exit_; +} + +/* +Calling Context: + +rtw_enqueue_cmd can only be called between kernel thread, +since only spin_lock is used. + +ISR/Call-Back functions can't call this sub-function. + +*/ + +sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj) +{ + _irqL irqL; + +_func_enter_; + + if (obj == NULL) + goto exit; + + //_enter_critical_bh(&queue->lock, &irqL); + _enter_critical(&queue->lock, &irqL); + + rtw_list_insert_tail(&obj->list, &queue->queue); + + //_exit_critical_bh(&queue->lock, &irqL); + _exit_critical(&queue->lock, &irqL); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +struct cmd_obj *_rtw_dequeue_cmd(_queue *queue) +{ + _irqL irqL; + struct cmd_obj *obj; + +_func_enter_; + + //_enter_critical_bh(&(queue->lock), &irqL); + _enter_critical(&(queue->lock), &irqL); + + if (rtw_is_list_empty(&(queue->queue))) + obj = NULL; + else + { + obj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list); + rtw_list_delete(&obj->list); + } + + //_exit_critical_bh(&(queue->lock), &irqL); + _exit_critical(&(queue->lock), &irqL); + +_func_exit_; + + return obj; +} + +u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) +{ + u32 res; +_func_enter_; + res = _rtw_init_cmd_priv (pcmdpriv); +_func_exit_; + return res; +} + +u32 rtw_init_evt_priv (struct evt_priv *pevtpriv) +{ + int res; +_func_enter_; + res = _rtw_init_evt_priv(pevtpriv); +_func_exit_; + return res; +} + +void rtw_free_evt_priv (struct evt_priv *pevtpriv) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_evt_priv\n")); + _rtw_free_evt_priv(pevtpriv); +_func_exit_; +} + +void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_cmd_priv\n")); + _rtw_free_cmd_priv(pcmdpriv); +_func_exit_; +} + +int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) +{ + u8 bAllow = _FALSE; //set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE + + #ifdef SUPPORT_HW_RFOFF_DETECTED + //To decide allow or not + if( (pcmdpriv->padapter->pwrctrlpriv.bHWPwrPindetect) + &&(!pcmdpriv->padapter->registrypriv.usbss_enable) + ) + { + if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) ) + { + struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; + if(pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID) + { + //DBG_8192C("==>enqueue POWER_SAVING_CTRL_WK_CID\n"); + bAllow = _TRUE; + } + } + } +#endif + + if( (pcmdpriv->padapter->hw_init_completed==_FALSE && bAllow == _FALSE) + || pcmdpriv->cmdthd_running== _FALSE //com_thread not running + ) + { + //DBG_871X("%s: hw_init_completed:%u, cmdthd_running:%u\n", __FUNCTION__, + // pcmdpriv->padapter->hw_init_completed, + // pcmdpriv->cmdthd_running + //); + return _FAIL; + } + return _SUCCESS; +} + + + +u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) +{ + int res = _FAIL; + +_func_enter_; + + if (cmd_obj == NULL) { + goto exit; + } + + if( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) { + rtw_free_cmd_obj(cmd_obj); + goto exit; + } + + res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj); + + if(res == _SUCCESS) + _rtw_up_sema(&pcmdpriv->cmd_queue_sema); + +exit: + +_func_exit_; + + return res; +} + +struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv) +{ + struct cmd_obj *cmd_obj; + +_func_enter_; + + cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue); + +_func_exit_; + return cmd_obj; +} + +void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv) +{ +_func_enter_; + pcmdpriv->cmd_done_cnt++; + //_rtw_up_sema(&(pcmdpriv->cmd_done_sema)); +_func_exit_; +} + +void rtw_free_cmd_obj(struct cmd_obj *pcmd) +{ +_func_enter_; + + if((pcmd->cmdcode!=_JoinBss_CMD_) &&(pcmd->cmdcode!= _CreateBss_CMD_)) + { + //free parmbuf in cmd_obj + rtw_mfree((unsigned char*)pcmd->parmbuf, pcmd->cmdsz); + } + + if(pcmd->rsp!=NULL) + { + if(pcmd->rspsz!= 0) + { + //free rsp in cmd_obj + rtw_mfree((unsigned char*)pcmd->rsp, pcmd->rspsz); + } + } + + //free cmd_obj + rtw_mfree((unsigned char*)pcmd, sizeof(struct cmd_obj)); + +_func_exit_; +} + + +thread_return rtw_cmd_thread(thread_context context) +{ + u8 ret; + struct cmd_obj *pcmd; + u8 *pcmdbuf, *prspbuf; + u8 (*cmd_hdl)(_adapter *padapter, u8* pbuf); + void (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd); + _adapter *padapter = (_adapter *)context; + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + +_func_enter_; + + thread_enter(padapter); + + pcmdbuf = pcmdpriv->cmd_buf; + prspbuf = pcmdpriv->rsp_buf; + + pcmdpriv->cmdthd_running=_TRUE; + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n")); + + while(1) + { + if ((_rtw_down_sema(&(pcmdpriv->cmd_queue_sema))) == _FAIL) + break; + + if (rtw_register_cmd_alive(padapter) != _SUCCESS) + { + continue; + } + +_next: + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) + { + DBG_8192C("###> rtw_cmd_thread break.................\n"); + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("rtw_cmd_thread:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + break; + } + + if(!(pcmd = rtw_dequeue_cmd(pcmdpriv))) { + rtw_unregister_cmd_alive(padapter); + continue; + } + + if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) ) { + rtw_free_cmd_obj(pcmd); + continue; + } + + pcmdpriv->cmd_issued_cnt++; + + pcmd->cmdsz = _RND4((pcmd->cmdsz));//_RND4 + + _rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz); + + if(pcmd->cmdcode <= (sizeof(wlancmds) /sizeof(struct cmd_hdl))) + { + cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns; + + if (cmd_hdl) + { + ret = cmd_hdl(padapter, pcmdbuf); + pcmd->res = ret; + } + + //invoke cmd->callback function + pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback; + if(pcmd_callback == NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("mlme_cmd_hdl(): pcmd_callback=0x%p, cmdcode=0x%x\n", pcmd_callback, pcmd->cmdcode)); + rtw_free_cmd_obj(pcmd); + } + else + { + //todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL) + + pcmd_callback(padapter, pcmd);//need conider that free cmd_obj in rtw_cmd_callback + } + + pcmdpriv->cmd_seq++; + } + + cmd_hdl = NULL; + + flush_signals_thread(); + + goto _next; + + } + pcmdpriv->cmdthd_running=_FALSE; + + + // free all cmd_obj resources + do{ + pcmd = rtw_dequeue_cmd(pcmdpriv); + if(pcmd==NULL) + break; + + rtw_free_cmd_obj(pcmd); + }while(1); + + _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema); + +_func_exit_; + + thread_exit(); + +} + + +#ifdef CONFIG_EVENT_THREAD_MODE +u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj) +{ + _irqL irqL; + int res; + _queue *queue = &pevtpriv->evt_queue; + +_func_enter_; + + res = _SUCCESS; + + if (obj == NULL) { + res = _FAIL; + goto exit; + } + + _enter_critical_bh(&queue->lock, &irqL); + + rtw_list_insert_tail(&obj->list, &queue->queue); + + _exit_critical_bh(&queue->lock, &irqL); + + //rtw_evt_notify_isr(pevtpriv); + +exit: + +_func_exit_; + + return res; +} + +struct evt_obj *rtw_dequeue_evt(_queue *queue) +{ + _irqL irqL; + struct evt_obj *pevtobj; + +_func_enter_; + + _enter_critical_bh(&queue->lock, &irqL); + + if (rtw_is_list_empty(&(queue->queue))) + pevtobj = NULL; + else + { + pevtobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct evt_obj, list); + rtw_list_delete(&pevtobj->list); + } + + _exit_critical_bh(&queue->lock, &irqL); + +_func_exit_; + + return pevtobj; +} + +void rtw_free_evt_obj(struct evt_obj *pevtobj) +{ +_func_enter_; + + if(pevtobj->parmbuf) + rtw_mfree((unsigned char*)pevtobj->parmbuf, pevtobj->evtsz); + + rtw_mfree((unsigned char*)pevtobj, sizeof(struct evt_obj)); + +_func_exit_; +} + +void rtw_evt_notify_isr(struct evt_priv *pevtpriv) +{ +_func_enter_; + pevtpriv->evt_done_cnt++; + _rtw_up_sema(&(pevtpriv->evt_notify)); +_func_exit_; +} +#endif + + +/* +u8 rtw_setstandby_cmd(unsigned char *adapter) +*/ +u8 rtw_setstandby_cmd(_adapter *padapter, uint action) +{ + struct cmd_obj* ph2c; + struct usb_suspend_parm* psetusbsuspend; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + + u8 ret = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + ret = _FAIL; + goto exit; + } + + psetusbsuspend = (struct usb_suspend_parm*)rtw_zmalloc(sizeof(struct usb_suspend_parm)); + if (psetusbsuspend == NULL) { + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + ret = _FAIL; + goto exit; + } + + psetusbsuspend->action = action; + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend)); + + ret = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return ret; +} + +/* +rtw_sitesurvey_cmd(~) + ### NOTE:#### (!!!!) + MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock +*/ +u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *pssid) +{ + u8 res = _FAIL; + struct cmd_obj *ph2c; + struct sitesurvey_parm *psurveyPara; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); +#endif //CONFIG_P2P + +_func_enter_; + +#ifdef CONFIG_LPS + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){ + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1); + } +#endif + +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1); +#endif //CONFIG_P2P + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) + return _FAIL; + + psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm)); + if (psurveyPara == NULL) { + rtw_mfree((unsigned char*) ph2c, sizeof(struct cmd_obj)); + return _FAIL; + } + + rtw_free_network_queue(padapter, _FALSE); + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("\nflush network queue\n\n")); + + init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); + + psurveyPara->bsslimit = cpu_to_le32(48); + psurveyPara->scan_mode = cpu_to_le32(pmlmepriv->scan_mode); + psurveyPara->ss_ssidlen= cpu_to_le32(0);// pssid->SsidLength; + _rtw_memset(psurveyPara->ss_ssid, 0, IW_ESSID_MAX_SIZE + 1); + if ((pssid != NULL) && (pssid->SsidLength)) { + _rtw_memcpy(psurveyPara->ss_ssid, pssid->Ssid, pssid->SsidLength); + psurveyPara->ss_ssidlen = cpu_to_le32(pssid->SsidLength); + } + + set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + + if(res == _SUCCESS) { + + pmlmepriv->scan_start_time = rtw_get_current_time(); + + _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT); + + rtw_led_control(padapter, LED_CTL_SITE_SURVEY); + + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + } else { + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + } + +_func_exit_; + + return res; +} + +u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset) +{ + struct cmd_obj* ph2c; + struct setdatarate_parm* pbsetdataratepara; + struct cmd_priv* pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; + goto exit; + } + + pbsetdataratepara = (struct setdatarate_parm*)rtw_zmalloc(sizeof(struct setdatarate_parm)); + if (pbsetdataratepara == NULL) { + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate)); +#ifdef MP_FIRMWARE_OFFLOAD + pbsetdataratepara->curr_rateidx = *(u32*)rateset; +// _rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32)); +#else + pbsetdataratepara->mac_id = 5; + _rtw_memcpy(pbsetdataratepara->datarates, rateset, NumRates); +#endif + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset) +{ + struct cmd_obj* ph2c; + struct setbasicrate_parm* pssetbasicratepara; + struct cmd_priv* pcmdpriv=&padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res= _FAIL; + goto exit; + } + pssetbasicratepara = (struct setbasicrate_parm*)rtw_zmalloc(sizeof(struct setbasicrate_parm)); + + if (pssetbasicratepara == NULL) { + rtw_mfree((u8*) ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_); + + _rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: + +_func_exit_; + + return res; +} + + +/* +unsigned char rtw_setphy_cmd(unsigned char *adapter) + +1. be called only after rtw_update_registrypriv_dev_network( ~) or mp testing program +2. for AdHoc/Ap mode or mp mode? + +*/ +u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch) +{ + struct cmd_obj* ph2c; + struct setphy_parm* psetphypara; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; +// struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +// struct registry_priv* pregistry_priv = &padapter->registrypriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + psetphypara = (struct setphy_parm*)rtw_zmalloc(sizeof(struct setphy_parm)); + + if(psetphypara==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_); + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("CH=%d, modem=%d", ch, modem)); + + psetphypara->modem = modem; + psetphypara->rfchannel = ch; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_setbbreg_cmd(_adapter*padapter, u8 offset, u8 val) +{ + struct cmd_obj* ph2c; + struct writeBB_parm* pwritebbparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + pwritebbparm = (struct writeBB_parm*)rtw_zmalloc(sizeof(struct writeBB_parm)); + + if(pwritebbparm==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg)); + + pwritebbparm->offset = offset; + pwritebbparm->value = val; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_getbbreg_cmd(_adapter *padapter, u8 offset, u8 *pval) +{ + struct cmd_obj* ph2c; + struct readBB_parm* prdbbparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res=_FAIL; + goto exit; + } + prdbbparm = (struct readBB_parm*)rtw_zmalloc(sizeof(struct readBB_parm)); + + if(prdbbparm ==NULL){ + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); + return _FAIL; + } + + _rtw_init_listhead(&ph2c->list); + ph2c->cmdcode =GEN_CMD_CODE(_GetBBReg); + ph2c->parmbuf = (unsigned char *)prdbbparm; + ph2c->cmdsz = sizeof(struct readBB_parm); + ph2c->rsp = pval; + ph2c->rspsz = sizeof(struct readBB_rsp); + + prdbbparm ->offset = offset; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_setrfreg_cmd(_adapter *padapter, u8 offset, u32 val) +{ + struct cmd_obj* ph2c; + struct writeRF_parm* pwriterfparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + pwriterfparm = (struct writeRF_parm*)rtw_zmalloc(sizeof(struct writeRF_parm)); + + if(pwriterfparm==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg)); + + pwriterfparm->offset = offset; + pwriterfparm->value = val; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; +} + +u8 rtw_getrfreg_cmd(_adapter *padapter, u8 offset, u8 *pval) +{ + struct cmd_obj* ph2c; + struct readRF_parm* prdrfparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + prdrfparm = (struct readRF_parm*)rtw_zmalloc(sizeof(struct readRF_parm)); + if(prdrfparm ==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_init_listhead(&ph2c->list); + ph2c->cmdcode =GEN_CMD_CODE(_GetRFReg); + ph2c->parmbuf = (unsigned char *)prdrfparm; + ph2c->cmdsz = sizeof(struct readRF_parm); + ph2c->rsp = pval; + ph2c->rspsz = sizeof(struct readRF_rsp); + + prdrfparm ->offset = offset; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +void rtw_getbbrfreg_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _func_enter_; + + //rtw_free_cmd_obj(pcmd); + rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); + rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); + +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.workparam.bcompleted= _TRUE; +#endif +_func_exit_; +} + +void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _func_enter_; + + rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz); + rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj)); + +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.workparam.bcompleted= _TRUE; +#endif + +_func_exit_; +} + +u8 rtw_createbss_cmd(_adapter *padapter) +{ + struct cmd_obj* pcmd; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network; + u8 res=_SUCCESS; + +_func_enter_; + + rtw_led_control(padapter, LED_CTL_START_TO_LINK); + + if (pmlmepriv->assoc_ssid.SsidLength == 0){ + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for Any SSid:%s\n",pmlmepriv->assoc_ssid.Ssid)); + } else { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); + } + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; + goto exit; + } + + _rtw_init_listhead(&pcmd->list); + pcmd->cmdcode = _CreateBss_CMD_; + pcmd->parmbuf = (unsigned char *)pdev_network; + pcmd->cmdsz = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX*)pdev_network); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + pdev_network->Length = pcmd->cmdsz; + +#ifdef CONFIG_RTL8712 + //notes: translate IELength & Length after assign the Length to cmdsz; + pdev_network->Length = cpu_to_le32(pcmd->cmdsz); + pdev_network->IELength = cpu_to_le32(pdev_network->IELength); + pdev_network->Ssid.SsidLength = cpu_to_le32(pdev_network->Ssid.SsidLength); +#endif + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz) +{ + struct cmd_obj* pcmd; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; + goto exit; + } + + _rtw_init_listhead(&pcmd->list); + pcmd->cmdcode = GEN_CMD_CODE(_CreateBss); + pcmd->parmbuf = pbss; + pcmd->cmdsz = sz; + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork) +{ + u8 *auth, res = _SUCCESS; + uint t_len = 0; + WLAN_BSSID_EX *psecnetwork; + struct cmd_obj *pcmd; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode; + +_func_enter_; + + rtw_led_control(padapter, LED_CTL_START_TO_LINK); + + if (pmlmepriv->assoc_ssid.SsidLength == 0){ + RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("+Join cmd: Any SSid\n")); + } else { + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+Join cmd: SSid=[%s]\n", pmlmepriv->assoc_ssid.Ssid)); + } + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res=_FAIL; + RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd: memory allocate for cmd_obj fail!!!\n")); + goto exit; + } + /* // for IEs is pointer + t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) + + sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + + sizeof (NDIS_802_11_CONFIGURATION) + + sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + + sizeof (NDIS_802_11_RATES_EX)+ sizeof(WLAN_PHY_INFO)+ sizeof (ULONG) + MAX_IE_SZ; + */ + //for IEs is fix buf size + t_len = sizeof(WLAN_BSSID_EX); + + + //for hidden ap to set fw_state here + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != _TRUE) + { + switch(ndis_network_mode) + { + case Ndis802_11IBSS: + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + break; + + case Ndis802_11Infrastructure: + set_fwstate(pmlmepriv, WIFI_STATION_STATE); + break; + + case Ndis802_11APMode: + case Ndis802_11AutoUnknown: + case Ndis802_11InfrastructureMax: + break; + + } + } + + psecnetwork=(WLAN_BSSID_EX *)&psecuritypriv->sec_bss; + if(psecnetwork==NULL) + { + if(pcmd !=NULL) + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + + res=_FAIL; + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd :psecnetwork==NULL!!!\n")); + + goto exit; + } + + _rtw_memset(psecnetwork, 0, t_len); + + _rtw_memcpy(psecnetwork, &pnetwork->network, get_WLAN_BSSID_EX_sz(&pnetwork->network)); + + auth=&psecuritypriv->authenticator_ie[0]; + psecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength; + + if((psecnetwork->IELength-12) < (256-1)) { + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12); + } else { + _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1)); + } + + psecnetwork->IELength = 0; + // Added by Albert 2009/02/18 + // If the the driver wants to use the bssid to create the connection. + // If not, we have to copy the connecting AP's MAC address to it so that + // the driver just has the bssid information for PMKIDList searching. + + if ( pmlmepriv->assoc_by_bssid == _FALSE ) + { + _rtw_memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN ); + } + + psecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength); + + + pqospriv->qos_option = 0; + + if(pregistrypriv->wmm_enable) + { + u32 tmp_len; + + tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength); + + if (psecnetwork->IELength != tmp_len) + { + psecnetwork->IELength = tmp_len; + pqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon + } + else + { + pqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon + } + } + +#ifdef CONFIG_80211N_HT + phtpriv->ht_option = _FALSE; + if(pregistrypriv->ht_enable) + { + // Added by Albert 2010/06/23 + // For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. + // Especially for Realtek 8192u SoftAP. + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_ ) && + ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_ ) && + ( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ )) + { + //rtw_restructure_ht_ie + rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], + pnetwork->network.IELength, &psecnetwork->IELength); + } + } + +#endif + + psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength; + + if(psecnetwork->IELength < (256-1)) + { + _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength); + } + else + { + _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1)); + } + + pcmd->cmdsz = get_WLAN_BSSID_EX_sz(psecnetwork);//get cmdsz before endian conversion + +#ifdef CONFIG_RTL8712 + //wlan_network endian conversion + psecnetwork->Length = cpu_to_le32(psecnetwork->Length); + psecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength); + psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy); + psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi); + psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse); + psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow); + psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod); + psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig); + psecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime); + psecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern); + psecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet); + psecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length); + psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length); + psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode); + psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength); +#endif + + _rtw_init_listhead(&pcmd->list); + pcmd->cmdcode = _JoinBss_CMD_;//GEN_CMD_CODE(_JoinBss) + pcmd->parmbuf = (unsigned char *)psecnetwork; + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_disassoc_cmd(_adapter*padapter) // for sta_mode +{ + struct cmd_obj* pdisconnect_cmd; + struct disconnect_parm* pdisconnect; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + u8 res=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_disassoc_cmd\n")); + + //if ((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) { + + pdisconnect_cmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pdisconnect_cmd == NULL){ + res=_FAIL; + goto exit; + } + + pdisconnect = (struct disconnect_parm*)rtw_zmalloc(sizeof(struct disconnect_parm)); + if(pdisconnect == NULL) { + rtw_mfree((u8 *)pdisconnect_cmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(pdisconnect_cmd, pdisconnect, _DisConnect_CMD_); + res = rtw_enqueue_cmd(pcmdpriv, pdisconnect_cmd); + //} + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype) +{ + struct cmd_obj* ph2c; + struct setopmode_parm* psetop; + + struct cmd_priv *pcmdpriv= &padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FALSE; + goto exit; + } + psetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm)); + + if(psetop==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FALSE; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_); + psetop->mode = (u8)networktype; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key) +{ + struct cmd_obj* ph2c; + struct set_stakey_parm *psetstakey_para; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct set_stakey_rsp *psetstakey_rsp = NULL; + + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct sta_info* sta = (struct sta_info* )psta; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if ( ph2c == NULL){ + res= _FAIL; + goto exit; + } + + psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm)); + if(psetstakey_para==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FAIL; + goto exit; + } + + psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); + if(psetstakey_rsp == NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm)); + res=_FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); + ph2c->rsp = (u8 *) psetstakey_rsp; + ph2c->rspsz = sizeof(struct set_stakey_rsp); + + _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN); + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){ +#ifdef CONFIG_TDLS + if((sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) + psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy; + else +#endif + psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm; + }else{ + GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE); + } + + if (unicast_key == _TRUE) { +#ifdef CONFIG_TDLS + if((sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) + _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16); + else +#endif + _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16); + } else { + _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16); + } + + //jeff: set this becasue at least sw key is ready + padapter->securitypriv.busetkipkey=_TRUE; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table) +{ + struct cmd_obj* ph2c; + struct setratable_parm * psetrttblparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + psetrttblparm = (struct setratable_parm*)rtw_zmalloc(sizeof(struct setratable_parm)); + + if(psetrttblparm==NULL){ + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); + + _rtw_memcpy(psetrttblparm,prate_table,sizeof(struct setratable_parm)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; + +} + +u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval) +{ + struct cmd_obj* ph2c; + struct getratable_parm * pgetrttblparm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + pgetrttblparm = (struct getratable_parm*)rtw_zmalloc(sizeof(struct getratable_parm)); + + if(pgetrttblparm==NULL){ + rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + +// init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable)); + + _rtw_init_listhead(&ph2c->list); + ph2c->cmdcode =GEN_CMD_CODE(_GetRaTable); + ph2c->parmbuf = (unsigned char *)pgetrttblparm; + ph2c->cmdsz = sizeof(struct getratable_parm); + ph2c->rsp = (u8*)pval; + ph2c->rspsz = sizeof(struct getratable_rsp); + + pgetrttblparm ->rsvd = 0x0; + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); +exit: +_func_exit_; + return res; + +} + +u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr) +{ + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_obj* ph2c; + struct set_assocsta_parm *psetassocsta_para; + struct set_stakey_rsp *psetassocsta_rsp = NULL; + + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + psetassocsta_para = (struct set_assocsta_parm*)rtw_zmalloc(sizeof(struct set_assocsta_parm)); + if(psetassocsta_para==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + res=_FAIL; + goto exit; + } + + psetassocsta_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_assocsta_rsp)); + if(psetassocsta_rsp==NULL){ + rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *) psetassocsta_para, sizeof(struct set_assocsta_parm)); + return _FAIL; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_); + ph2c->rsp = (u8 *) psetassocsta_rsp; + ph2c->rspsz = sizeof(struct set_assocsta_rsp); + + _rtw_memcpy(psetassocsta_para->addr, mac_addr,ETH_ALEN); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + } + +u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr) +{ + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_obj* ph2c; + struct addBaReq_parm *paddbareq_parm; + + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + paddbareq_parm = (struct addBaReq_parm*)rtw_zmalloc(sizeof(struct addBaReq_parm)); + if(paddbareq_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + paddbareq_parm->tid = tid; + _rtw_memcpy(paddbareq_parm->addr, addr, ETH_ALEN); + + init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq)); + + //DBG_8192C("rtw_addbareq_cmd, tid=%d\n", tid); + + //rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} + +u8 rtw_dynamic_chk_wk_cmd(_adapter*padapter) +{ + struct cmd_obj* ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + u8 res=_SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = DYNAMIC_CHK_WK_CID; + pdrvextra_cmd_parm->type_size = 0; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + + //rtw_enqueue_cmd(pcmdpriv, ph2c); + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + +} + +u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan) +{ + struct cmd_obj* pcmdobj; + struct SetChannelPlan_param *setChannelPlan_param; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + u8 res=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_chplan_cmd\n")); + + pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmdobj == NULL){ + res=_FAIL; + goto exit; + } + + setChannelPlan_param = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(struct SetChannelPlan_param)); + if(setChannelPlan_param == NULL) { + rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + setChannelPlan_param->channel_plan=chplan; + + init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelPlan_param, GEN_CMD_CODE(_SetChannelPlan)); + res = rtw_enqueue_cmd(pcmdpriv, pcmdobj); + +exit: + +_func_exit_; + + return res; +} + +static void traffic_status_watchdog(_adapter *padapter) +{ +#ifdef CONFIG_LPS + u8 bEnterPS; +#endif + u8 bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE; + u8 bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + // + // Determine if our traffic is busy now + // + if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) + { + + if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 100 || + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 100 ) + { + bBusyTraffic = _TRUE; + + if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 100) + bRxBusyTraffic = _TRUE; + + if(pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 100) + bTxBusyTraffic = _TRUE; + } + + // Higher Tx/Rx data. + if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 || + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000 ) + { + bHigherBusyTraffic = _TRUE; + + // Extremely high Rx data. + if(pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 5000) + bHigherBusyRxTraffic = _TRUE; + + // Extremely high Tx data. + if(pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 5000) + bHigherBusyTxTraffic = _TRUE; + } + +#ifdef CONFIG_LPS + // check traffic for powersaving. + if( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) || + (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) ) + { + //DBG_8192C("Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod); + bEnterPS= _FALSE; + } + else + { + bEnterPS= _TRUE; + } + + // LeisurePS only work in infra mode. + if(bEnterPS) + { + LPS_Enter(padapter); + } + else + { + LPS_Leave(padapter); + } +#endif + } + else + { +#ifdef CONFIG_LPS + LPS_Leave(padapter); +#endif + } + + pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0; + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0; + pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0; + pmlmepriv->LinkDetectInfo.bBusyTraffic = bBusyTraffic; + pmlmepriv->LinkDetectInfo.bTxBusyTraffic = bTxBusyTraffic; + pmlmepriv->LinkDetectInfo.bRxBusyTraffic = bRxBusyTraffic; + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic; + pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic; +} + +void dynamic_chk_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + //struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + if(padapter->HalFunc.sreset_xmit_status_check) + padapter->HalFunc.sreset_xmit_status_check(padapter); + #endif + + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE) + { + //if(pmlmeext->linked_to > 0) + //{ + // pmlmeext->linked_to--; + // if(pmlmeext->linked_to==0) + linked_status_chk(padapter); + //} + + traffic_status_watchdog(padapter); + } + + padapter->HalFunc.hal_dm_watchdog(padapter); + + //check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + +} + +#ifdef CONFIG_LPS +void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 mstatus; + +_func_enter_; + + if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) + || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) + { + return; + } + + switch(lps_ctrl_type) + { + case LPS_CTRL_SCAN: + //DBG_8192C("LPS_CTRL_SCAN \n"); + LeaveAllPowerSaveMode(padapter); + break; + case LPS_CTRL_JOINBSS: + //DBG_8192C("LPS_CTRL_JOINBSS \n"); + LPS_Leave(padapter); + break; + case LPS_CTRL_CONNECT: + //DBG_8192C("LPS_CTRL_CONNECT \n"); + mstatus = 1; + // Reset LPS Setting + padapter->pwrctrlpriv.LpsIdleCount = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); + break; + case LPS_CTRL_DISCONNECT: + //DBG_8192C("LPS_CTRL_DISCONNECT \n"); + mstatus = 0; + LPS_Leave(padapter); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); + break; + case LPS_CTRL_SPECIAL_PACKET: + //DBG_8192C("LPS_CTRL_SPECIAL_PACKET \n"); + pwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time(); + LPS_Leave(padapter); + break; + + default: + break; + } + +_func_exit_; +} + +u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + u8 res = _SUCCESS; + +_func_enter_; + + //if(!pwrctrlpriv->bLeisurePs) + // return res; + + if(enqueue) + { + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = LPS_CTRL_WK_CID; + pdrvextra_cmd_parm->type_size = lps_ctrl_type; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else + { + lps_ctrl_wk_hdl(padapter, lps_ctrl_type); + } + +exit: + +_func_exit_; + + return res; + +} + +#endif +#ifdef CONFIG_ANTENNA_DIVERSITY + +void antenna_select_wk_hdl(_adapter *padapter, u8 antenna) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); +} + +u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 bSupportAntDiv = _FALSE; + u8 res = _SUCCESS; + +_func_enter_; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); + if(_FALSE == bSupportAntDiv ) return res; + + if(_TRUE == enqueue) + { + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = ANT_SELECT_WK_CID; + pdrvextra_cmd_parm->type_size = antenna; + pdrvextra_cmd_parm->pbuf = NULL; + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else{ + antenna_select_wk_hdl(padapter,antenna ); + } +exit: + +_func_exit_; + + return res; + +} +#endif + +void power_saving_wk_hdl(_adapter *padapter, u8 *pbuf, int sz) +{ + rtw_ps_processor(padapter); +} + +#ifdef CONFIG_P2P +u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + if ( pwdinfo->p2p_state == P2P_STATE_NONE ) + { + return res; + } + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID; + pdrvextra_cmd_parm->type_size = intCmdType; // As the command tppe. + pdrvextra_cmd_parm->pbuf = NULL; // Must be NULL here + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + +} +#endif //CONFIG_P2P + +u8 rtw_ps_cmd(_adapter*padapter) +{ + struct cmd_obj *ppscmd; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + u8 res = _SUCCESS; +_func_enter_; + + ppscmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ppscmd==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ppscmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = POWER_SAVING_CTRL_WK_CID; + pdrvextra_cmd_parm->pbuf = NULL; + DBG_8192C("==> %s , enqueue CMD \n",__FUNCTION__); + init_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ppscmd); + +exit: + +_func_exit_; + + return res; + +} + +#ifdef CONFIG_AP_MODE + +static void rtw_chk_hi_queue_hdl(_adapter *padapter) +{ + int cnt=0; + struct sta_info *psta_bmc; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(!psta_bmc) + return; + + + if(psta_bmc->sleepq_len==0) + { + while((rtw_read32(padapter, 0x414)&0x00ffff00)!=0) + { + rtw_msleep_os(100); + + cnt++; + + if(cnt>10) + break; + } + + if(cnt<=10) + { + pstapriv->tim_bitmap &= ~BIT(0); + + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + } + +} + +u8 rtw_chk_hi_queue_cmd(_adapter*padapter) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = CHECK_HIQ_WK_CID; + pdrvextra_cmd_parm->type_size = 0; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + + return res; + +} +#endif + +u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct drvextra_cmd_parm *pdrvextra_cmd; + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + pdrvextra_cmd = (struct drvextra_cmd_parm*)pbuf; + + switch(pdrvextra_cmd->ec_id) + { + case DYNAMIC_CHK_WK_CID: + dynamic_chk_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + break; + case POWER_SAVING_CTRL_WK_CID: + power_saving_wk_hdl(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + break; +#ifdef CONFIG_LPS + case LPS_CTRL_WK_CID: + lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type_size); + break; +#endif +#ifdef CONFIG_ANTENNA_DIVERSITY + case ANT_SELECT_WK_CID: + antenna_select_wk_hdl(padapter, pdrvextra_cmd->type_size); + break; +#endif +#ifdef CONFIG_P2P + case P2P_PS_WK_CID: + p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type_size); + break; + case P2P_PROTO_WK_CID: + // Commented by Albert 2011/07/01 + // I used the type_size as the type command + p2p_protocol_wk_hdl( padapter, pdrvextra_cmd->type_size ); + break; +#endif //CONFIG_P2P +#ifdef CONFIG_AP_MODE + case CHECK_HIQ_WK_CID: + rtw_chk_hi_queue_hdl(padapter); + break; +#endif //CONFIG_AP_MODE + default: + break; + + } + + + if(pdrvextra_cmd->pbuf && pdrvextra_cmd->type_size>0) + { + rtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->type_size); + } + + + return H2C_SUCCESS; + +} + +void rtw_survey_cmd_callback(_adapter* padapter , struct cmd_obj *pcmd) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + if (pcmd->res != H2C_SUCCESS) { + clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY); + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nrtw_survey_cmd_callback : clr _FW_UNDER_SURVEY ")); + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: MgntActrtw_set_802_11_bssid_LIST_SCAN Fail ************\n\n.")); + } + + // free cmd + rtw_free_cmd_obj(pcmd); + +_func_exit_; +} +void rtw_disassoc_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + if (pcmd->res != H2C_SUCCESS) + { + _enter_critical_bh(&pmlmepriv->lock, &irqL); + set_fwstate(pmlmepriv, _FW_LINKED); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ***Error: disconnect_cmd_callback Fail ***\n.")); + + goto exit; + } + + // free cmd + rtw_free_cmd_obj(pcmd); + +exit: + +_func_exit_; +} + + +void rtw_joinbss_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + if((pcmd->res != H2C_SUCCESS)) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("********Error:rtw_select_and_join_from_scanned_queue Wait Sema Fail ************\n")); + _set_timer(&pmlmepriv->assoc_timer, 1); + } + + rtw_free_cmd_obj(pcmd); + +_func_exit_; +} + +void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd) +{ + _irqL irqL; + u8 timer_cancelled; + struct sta_info *psta = NULL; + struct wlan_network *pwlan = NULL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)pcmd->parmbuf; + struct wlan_network *tgt_network = &(pmlmepriv->cur_network); + +_func_enter_; + + if((pcmd->res != H2C_SUCCESS)) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: rtw_createbss_cmd_callback Fail ************\n\n.")); + _set_timer(&pmlmepriv->assoc_timer, 1 ); + } + + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); + + //endian_convert + pnetwork->Length = le32_to_cpu(pnetwork->Length); + pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); + pnetwork->Privacy =le32_to_cpu(pnetwork->Privacy); + pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); + pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); + pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); + //pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); + pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); + pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); + pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); + pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); + pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); + pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); + pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); + pnetwork->IELength = le32_to_cpu(pnetwork->IELength); + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) ) + { + psta = rtw_get_stainfo(&padapter->stapriv, pnetwork->MacAddress); + if(!psta) + { + psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); + if (psta == NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n")); + goto createbss_cmd_fail ; + } + } + + rtw_indicate_connect( padapter); + } + else + { + pwlan = _rtw_alloc_network(pmlmepriv); + + if ( pwlan == NULL) + { + pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue); + if( pwlan == NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n Error: can't get pwlan in rtw_joinbss_event_callback \n")); + goto createbss_cmd_fail; + } + pwlan->last_scanned = rtw_get_current_time(); + } + else + { + rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); + } + + pnetwork->Length = get_WLAN_BSSID_EX_sz(pnetwork); + _rtw_memcpy(&(pwlan->network), pnetwork, pnetwork->Length); + //pwlan->fixed = _TRUE; + + //rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); + + // copy pdev_network information to pmlmepriv->cur_network + _rtw_memcpy(&tgt_network->network, pnetwork, (get_WLAN_BSSID_EX_sz(pnetwork))); + + // reset DSConfig + //tgt_network->network.Configuration.DSConfig = (u32)rtw_ch2freq(pnetwork->Configuration.DSConfig); + + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + +#if 0 + if((pmlmepriv->fw_state) & WIFI_AP_STATE) + { + psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); + + if (psta == NULL) { // for AP Mode & Adhoc Master Mode + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n")); + goto createbss_cmd_fail ; + } + + rtw_indicate_connect( padapter); + } + else { + + //rtw_indicate_disconnect(dev); + } +#endif + + // we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback) + + } + +createbss_cmd_fail: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + rtw_free_cmd_obj(pcmd); + +_func_exit_; + +} + + + +void rtw_setstaKey_cmdrsp_callback(_adapter* padapter , struct cmd_obj *pcmd) +{ + + struct sta_priv * pstapriv = &padapter->stapriv; + struct set_stakey_rsp* psetstakey_rsp = (struct set_stakey_rsp*) (pcmd->rsp); + struct sta_info* psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr); + +_func_enter_; + + if(psta==NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: rtw_setstaKey_cmdrsp_callback => can't get sta_info \n\n")); + goto exit; + } + + //psta->aid = psta->mac_id = psetstakey_rsp->keyid; //CAM_ID(CAM_ENTRY) + +exit: + + rtw_free_cmd_obj(pcmd); + +_func_exit_; + +} +void rtw_setassocsta_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ + _irqL irqL; + struct sta_priv * pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct set_assocsta_parm* passocsta_parm = (struct set_assocsta_parm*)(pcmd->parmbuf); + struct set_assocsta_rsp* passocsta_rsp = (struct set_assocsta_rsp*) (pcmd->rsp); + struct sta_info* psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr); + +_func_enter_; + + if(psta==NULL) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: setassocsta_cmdrsp_callbac => can't get sta_info \n\n")); + goto exit; + } + + psta->aid = psta->mac_id = passocsta_rsp->cam_id; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)) + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + + set_fwstate(pmlmepriv, _FW_LINKED); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + rtw_free_cmd_obj(pcmd); +exit: +_func_exit_; +} + +void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd) +{ +_func_enter_; + + rtw_free_cmd_obj(pcmd); +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.workparam.bcompleted=_TRUE; +#endif + +_func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_debug.c b/drivers/net/wireless/rtl8192c/core/rtw_debug.c new file mode 100755 index 000000000000..8fc8756e2095 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_debug.c @@ -0,0 +1,611 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_DEBUG_C_ + + +#include + +#ifdef CONFIG_DEBUG_RTL871X + + u32 GlobalDebugLevel = _drv_info_; + + u64 GlobalDebugComponents = \ + _module_rtl871x_xmit_c_ | + _module_xmit_osdep_c_ | + _module_rtl871x_recv_c_ | + _module_recv_osdep_c_ | + _module_rtl871x_mlme_c_ | + _module_mlme_osdep_c_ | + _module_rtl871x_sta_mgt_c_ | + _module_rtl871x_cmd_c_ | + _module_cmd_osdep_c_ | + _module_rtl871x_io_c_ | + _module_io_osdep_c_ | + _module_os_intfs_c_| + _module_rtl871x_security_c_| + _module_rtl871x_eeprom_c_| + _module_hal_init_c_| + _module_hci_hal_init_c_| + _module_rtl871x_ioctl_c_| + _module_rtl871x_ioctl_set_c_| + _module_rtl871x_ioctl_query_c_| + _module_rtl871x_pwrctrl_c_| + _module_hci_intfs_c_| + _module_hci_ops_c_| + _module_hci_ops_os_c_| + _module_rtl871x_ioctl_os_c| + _module_rtl8712_cmd_c_| + _module_rtl8192c_xmit_c_| + _module_rtl8712_recv_c_ | + _module_mp_ | + _module_efuse_; + +#endif + +#ifdef CONFIG_PROC_DEBUG +#include + +int proc_get_drv_version(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + + int len = 0; + + len += snprintf(page + len, count - len, "%s\n", DRIVERVERSION); + + *eof = 1; + return len; +} + +int proc_get_write_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + *eof = 1; + return 0; +} + +int proc_set_write_reg(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + u32 addr, val, len; + + if (count < 3) + { + DBG_8192C("argument size is less than 3\n"); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%x %x %x", &addr, &val, &len); + + if (num != 3) { + DBG_8192C("invalid write_reg parameter!\n"); + return count; + } + + switch(len) + { + case 1: + rtw_write8(padapter, addr, (u8)val); + break; + case 2: + rtw_write16(padapter, addr, (u16)val); + break; + case 4: + rtw_write32(padapter, addr, val); + break; + default: + DBG_8192C("error write length=%d", len); + break; + } + + } + + return count; + +} + +static u32 proc_get_read_addr=0xeeeeeeee; +static u32 proc_get_read_len=0x4; + +int proc_get_read_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + + int len = 0; + + if(proc_get_read_addr==0xeeeeeeee) + { + *eof = 1; + return len; + } + + switch(proc_get_read_len) + { + case 1: + len += snprintf(page + len, count - len, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr)); + break; + case 2: + len += snprintf(page + len, count - len, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr)); + break; + case 4: + len += snprintf(page + len, count - len, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr)); + break; + default: + len += snprintf(page + len, count - len, "error read length=%d\n", proc_get_read_len); + break; + } + + *eof = 1; + return len; + +} + +int proc_set_read_reg(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[16]; + u32 addr, len; + + if (count < 2) + { + DBG_8192C("argument size is less than 2\n"); + return -EFAULT; + } + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%x %x", &addr, &len); + + if (num != 2) { + DBG_8192C("invalid read_reg parameter!\n"); + return count; + } + + proc_get_read_addr = addr; + + proc_get_read_len = len; + } + + return count; + +} + +int proc_get_fwstate(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, "fwstate=0x%x\n", get_fwstate(pmlmepriv)); + + *eof = 1; + return len; +} + +int proc_get_sec_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct security_priv *psecuritypriv = &padapter->securitypriv; + + int len = 0; + + len += snprintf(page + len, count - len, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n", + psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, + psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus); + + *eof = 1; + return len; +} + +int proc_get_mlmext_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + int len = 0; + + len += snprintf(page + len, count - len, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state); + + *eof = 1; + return len; +} + +int proc_get_qos_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, "qos_option=%d\n", pmlmepriv->qospriv.qos_option); + + *eof = 1; + return len; + +} + +int proc_get_ht_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, "ht_option=%d\n", pmlmepriv->htpriv.ht_option); + + *eof = 1; + return len; +} + +int proc_get_rf_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + int len = 0; + + len += snprintf(page + len, count - len, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n", + pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset); + + + *eof = 1; + return len; + +} + +int proc_get_ap_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct sta_info *psta; + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct sta_priv *pstapriv = &padapter->stapriv; + int len = 0; + + psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); + if(psta) + { + int i; + struct recv_reorder_ctrl *preorder_ctrl; + + len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); + len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); + len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); + len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); + len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); + len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); + len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); + + for(i=0;i<16;i++) + { + preorder_ctrl = &psta->recvreorder_ctrl[i]; + if(preorder_ctrl->enable) + { + len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq); + } + } + + } + else + { + len += snprintf(page + len, count - len, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress)); + } + + *eof = 1; + return len; + +} + +int proc_get_adapter_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + int len = 0; + + len += snprintf(page + len, count - len, "bSurpriseRemoved=%d, bDriverStopped=%d\n", + padapter->bSurpriseRemoved, padapter->bDriverStopped); + + *eof = 1; + return len; + +} + +int proc_get_trx_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct recv_priv *precvpriv = &padapter->recvpriv; + int len = 0; + + len += snprintf(page + len, count - len, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n", + pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt); +#ifdef CONFIG_USB_HCI + len += snprintf(page + len, count - len, "rx_urb_pending_cn=%d\n", precvpriv->rx_pending_cnt); +#endif + + *eof = 1; + return len; + +} + + +int proc_get_rx_signal(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + int len = 0; + + len += snprintf(page + len, count - len, + "rssi:%d\n" + "rxpwdb:%d\n" + "signal_strength:%u\n" + "signal_qual:%u\n" + "noise:%u\n", + padapter->recvpriv.rssi, + padapter->recvpriv.rxpwdb, + padapter->recvpriv.signal_strength, + padapter->recvpriv.signal_qual, + padapter->recvpriv.noise + ); + + *eof = 1; + return len; +} + +int proc_set_rx_signal(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct net_device *dev = (struct net_device *)data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + char tmp[32]; + u32 is_signal_dbg, signal_strength; + + if (count < 1) + return -EFAULT; + + if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { + + int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength); + + is_signal_dbg = is_signal_dbg==0?0:1; + + if(is_signal_dbg && num!=2) + return count; + + signal_strength = signal_strength>100?100:signal_strength; + signal_strength = signal_strength<0?0:signal_strength; + + padapter->recvpriv.is_signal_dbg = is_signal_dbg; + padapter->recvpriv.signal_strength_dbg=signal_strength; + + if(is_signal_dbg) + DBG_871X("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength); + else + DBG_871X("set %s\n", "HW_SIGNAL_STRENGTH"); + + } + + return count; + +} + + +#ifdef CONFIG_AP_MODE + +int proc_get_all_sta_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + _irqL irqL; + struct sta_info *psta; + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct sta_priv *pstapriv = &padapter->stapriv; + int i, j; + _list *plist, *phead; + struct recv_reorder_ctrl *preorder_ctrl; + int len = 0; + + + len += snprintf(page + len, count - len, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap); + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + for(i=0; i< NUM_STA; i++) + { + phead = &(pstapriv->sta_hash[i]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + + plist = get_next(plist); + + //if(extra_arg == psta->aid) + { + len += snprintf(page + len, count - len, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr)); + len += snprintf(page + len, count - len, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self); + len += snprintf(page + len, count - len, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate); + len += snprintf(page + len, count - len, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid); + len += snprintf(page + len, count - len, "bwmode=%d, ch_offset=%d, sgi=%d\n", psta->htpriv.bwmode, psta->htpriv.ch_offset, psta->htpriv.sgi); + len += snprintf(page + len, count - len, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable); + len += snprintf(page + len, count - len, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap); + len += snprintf(page + len, count - len, "sleepq_len=%d\n", psta->sleepq_len); + len += snprintf(page + len, count - len, "capability=0x%x\n", psta->capability); + len += snprintf(page + len, count - len, "flags=0x%x\n", psta->flags); + len += snprintf(page + len, count - len, "wpa_psk=0x%x\n", psta->wpa_psk); + len += snprintf(page + len, count - len, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher); + len += snprintf(page + len, count - len, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher); + len += snprintf(page + len, count - len, "qos_info=0x%x\n", psta->qos_info); + len += snprintf(page + len, count - len, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy); + + for(j=0;j<16;j++) + { + preorder_ctrl = &psta->recvreorder_ctrl[j]; + if(preorder_ctrl->enable) + { + len += snprintf(page + len, count - len, "tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq); + } + } + + } + + } + + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + *eof = 1; + return len; + +} + +#endif + +#ifdef MEMORY_LEAK_DEBUG +#include +extern atomic_t _malloc_cnt;; +extern atomic_t _malloc_size;; + +int proc_get_malloc_cnt(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + + int len = 0; + + len += snprintf(page + len, count - len, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt)); + len += snprintf(page + len, count - len, "_malloc_size=%d\n", atomic_read(&_malloc_size)); + + *eof = 1; + return len; +} +#endif /* MEMORY_LEAK_DEBUG */ + +#ifdef CONFIG_FIND_BEST_CHANNEL +int proc_get_best_channel(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + int len = 0; + u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0; + + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + if ( pmlmeext->channel_set[i].ChannelNum == 1) + index_24G = i; + if ( pmlmeext->channel_set[i].ChannelNum == 36) + index_5G = i; + } + + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + // 2.4G + if ( pmlmeext->channel_set[i].ChannelNum == 6 ) { + if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) { + index_24G = i; + best_channel_24G = pmlmeext->channel_set[i].ChannelNum; + } + } + + // 5G + if ( pmlmeext->channel_set[i].ChannelNum >= 36 + && pmlmeext->channel_set[i].ChannelNum < 140 ) { + // Find primary channel + if ( (( pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0) + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) { + index_5G = i; + best_channel_5G = pmlmeext->channel_set[i].ChannelNum; + } + } + + if ( pmlmeext->channel_set[i].ChannelNum >= 149 + && pmlmeext->channel_set[i].ChannelNum < 165) { + // find primary channel + if ( (( pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0) + && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) { + index_5G = i; + best_channel_5G = pmlmeext->channel_set[i].ChannelNum; + } + } +#if 1 // debug + len += snprintf(page + len, count - len, "The rx cnt of channel %3d = %d\n", + pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count); +#endif + } + + len += snprintf(page + len, count - len, "best_channel_5G = %d\n", best_channel_5G); + len += snprintf(page + len, count - len, "best_channel_24G = %d\n", best_channel_24G); + + *eof = 1; + return len; + +} +#endif /* CONFIG_FIND_BEST_CHANNEL */ + +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c b/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c new file mode 100755 index 000000000000..4a0832bcb8c9 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_eeprom.c @@ -0,0 +1,424 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_EEPROM_C_ + +#include +#include +#include + +void up_clk(_adapter* padapter, u16 *x) +{ +_func_enter_; + *x = *x | _EESK; + rtw_write8(padapter, EE_9346CR, (u8)*x); + rtw_udelay_os(CLOCK_RATE); + +_func_exit_; + +} + +void down_clk(_adapter * padapter, u16 *x ) +{ +_func_enter_; + *x = *x & ~_EESK; + rtw_write8(padapter, EE_9346CR, (u8)*x); + rtw_udelay_os(CLOCK_RATE); +_func_exit_; +} + +void shift_out_bits(_adapter * padapter, u16 data, u16 count) +{ + u16 x,mask; +_func_enter_; + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + mask = 0x01 << (count - 1); + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EEDO | _EEDI); + + do + { + x &= ~_EEDI; + if(data & mask) + x |= _EEDI; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + rtw_write8(padapter, EE_9346CR, (u8)x); + rtw_udelay_os(CLOCK_RATE); + up_clk(padapter, &x); + down_clk(padapter, &x); + mask = mask >> 1; + } while(mask); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x &= ~_EEDI; + rtw_write8(padapter, EE_9346CR, (u8)x); +out: +_func_exit_; +} + +u16 shift_in_bits (_adapter * padapter) +{ + u16 x,d=0,i; +_func_enter_; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x = rtw_read8(padapter, EE_9346CR); + + x &= ~( _EEDO | _EEDI); + d = 0; + + for(i=0; i<16; i++) + { + d = d << 1; + up_clk(padapter, &x); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EEDI); + if(x & _EEDO) + d |= 1; + + down_clk(padapter, &x); + } +out: +_func_exit_; + + return d; +} + +void standby(_adapter * padapter ) +{ + u8 x; +_func_enter_; + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EECS | _EESK); + rtw_write8(padapter, EE_9346CR,x); + + rtw_udelay_os(CLOCK_RATE); + x |= _EECS; + rtw_write8(padapter, EE_9346CR, x); + rtw_udelay_os(CLOCK_RATE); +_func_exit_; +} + +u16 wait_eeprom_cmd_done(_adapter* padapter) +{ + u8 x; + u16 i,res=_FALSE; +_func_enter_; + standby(padapter ); + for (i=0; i<200; i++) + { + x = rtw_read8(padapter, EE_9346CR); + if (x & _EEDO){ + res=_TRUE; + goto exit; + } + rtw_udelay_os(CLOCK_RATE); + } +exit: +_func_exit_; + return res; +} + +void eeprom_clean(_adapter * padapter) +{ + u16 x; +_func_enter_; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x = rtw_read8(padapter, EE_9346CR); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + x &= ~(_EECS | _EEDI); + rtw_write8(padapter, EE_9346CR, (u8)x); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + up_clk(padapter, &x); + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + down_clk(padapter, &x); +out: +_func_exit_; +} + +void eeprom_write16(_adapter * padapter, u16 reg, u16 data) +{ + u8 x; +#ifdef CONFIG_RTL8712 + u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; + tmp8_ori=rtw_read8(padapter, 0x102502f1); + tmp8_new=tmp8_ori & 0xf7; + if(tmp8_ori != tmp8_new){ + rtw_write8(padapter, 0x102502f1, tmp8_new); + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); + } + tmp8_clk_ori=rtw_read8(padapter,0x10250003); + tmp8_clk_new=tmp8_clk_ori|0x20; + if(tmp8_clk_new!=tmp8_clk_ori){ + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); + rtw_write8(padapter, 0x10250003, tmp8_clk_new); + } +#endif +_func_enter_; + + x = rtw_read8(padapter, EE_9346CR); + + x &= ~(_EEDI | _EEDO | _EESK | _EEM0); + x |= _EEM1 | _EECS; + rtw_write8(padapter, EE_9346CR, x); + + shift_out_bits(padapter, EEPROM_EWEN_OPCODE, 5); + + if(padapter->EepromAddressSize==8) //CF+ and SDIO + shift_out_bits(padapter, 0, 6); + else //USB + shift_out_bits(padapter, 0, 4); + + standby( padapter); + +// Commented out by rcnjko, 2004.0 +// // Erase this particular word. Write the erase opcode and register +// // number in that order. The opcode is 3bits in length; reg is 6 bits long. +// shift_out_bits(Adapter, EEPROM_ERASE_OPCODE, 3); +// shift_out_bits(Adapter, reg, Adapter->EepromAddressSize); +// +// if (wait_eeprom_cmd_done(Adapter ) == FALSE) +// { +// return; +// } + + + standby(padapter ); + + // write the new word to the EEPROM + + // send the write opcode the EEPORM + shift_out_bits(padapter, EEPROM_WRITE_OPCODE, 3); + + // select which word in the EEPROM that we are writing to. + shift_out_bits(padapter, reg, padapter->EepromAddressSize); + + // write the data to the selected EEPROM word. + shift_out_bits(padapter, data, 16); + + if (wait_eeprom_cmd_done(padapter ) == _FALSE) + { + + goto exit; + } + + standby(padapter ); + + shift_out_bits(padapter, EEPROM_EWDS_OPCODE, 5); + shift_out_bits(padapter, reg, 4); + + eeprom_clean(padapter ); +exit: +#ifdef CONFIG_RTL8712 + if(tmp8_clk_new!=tmp8_clk_ori) + rtw_write8(padapter, 0x10250003, tmp8_clk_ori); + if(tmp8_new!=tmp8_ori) + rtw_write8(padapter, 0x102502f1, tmp8_ori); + +#endif +_func_exit_; + return; +} + +u16 eeprom_read16(_adapter * padapter, u16 reg) //ReadEEprom +{ + + u16 x; + u16 data=0; +#ifdef CONFIG_RTL8712 + u8 tmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new; + tmp8_ori= rtw_read8(padapter, 0x102502f1); + tmp8_new = tmp8_ori & 0xf7; + if(tmp8_ori != tmp8_new){ + rtw_write8(padapter, 0x102502f1, tmp8_new); + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x102502f1=====\n")); + } + tmp8_clk_ori=rtw_read8(padapter,0x10250003); + tmp8_clk_new=tmp8_clk_ori|0x20; + if(tmp8_clk_new!=tmp8_clk_ori){ + RT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,("====write 0x10250003=====\n")); + rtw_write8(padapter, 0x10250003, tmp8_clk_new); + } +#endif +_func_enter_; + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + // select EEPROM, reset bits, set _EECS + x = rtw_read8(padapter, EE_9346CR); + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + + x &= ~(_EEDI | _EEDO | _EESK | _EEM0); + x |= _EEM1 | _EECS; + rtw_write8(padapter, EE_9346CR, (unsigned char)x); + + // write the read opcode and register number in that order + // The opcode is 3bits in length, reg is 6 bits long + shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); + shift_out_bits(padapter, reg, padapter->EepromAddressSize); + + // Now read the data (16 bits) in from the selected EEPROM word + data = shift_in_bits(padapter); + + eeprom_clean(padapter); +out: +#ifdef CONFIG_RTL8712 + if(tmp8_clk_new!=tmp8_clk_ori) + rtw_write8(padapter, 0x10250003, tmp8_clk_ori); + if(tmp8_new!=tmp8_ori) + rtw_write8(padapter, 0x102502f1, tmp8_ori); + +#endif +_func_exit_; + return data; + + +} + + + + +//From even offset +void eeprom_read_sz(_adapter * padapter, u16 reg, u8* data, u32 sz) +{ + + u16 x, data16; + u32 i; +_func_enter_; + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + // select EEPROM, reset bits, set _EECS + x = rtw_read8(padapter, EE_9346CR); + + if(padapter->bSurpriseRemoved==_TRUE){ + RT_TRACE(_module_rtl871x_eeprom_c_,_drv_err_,("padapter->bSurpriseRemoved==_TRUE")); + goto out; + } + + x &= ~(_EEDI | _EEDO | _EESK | _EEM0); + x |= _EEM1 | _EECS; + rtw_write8(padapter, EE_9346CR, (unsigned char)x); + + // write the read opcode and register number in that order + // The opcode is 3bits in length, reg is 6 bits long + shift_out_bits(padapter, EEPROM_READ_OPCODE, 3); + shift_out_bits(padapter, reg, padapter->EepromAddressSize); + + + for(i=0; i>8; + } + + eeprom_clean(padapter); +out: +_func_exit_; + + + +} + + +//addr_off : address offset of the entry in eeprom (not the tuple number of eeprom (reg); that is addr_off !=reg) +u8 eeprom_read(_adapter * padapter, u32 addr_off, u8 sz, u8* rbuf) +{ + u8 quotient, remainder, addr_2align_odd; + u16 reg, stmp , i=0, idx = 0; +_func_enter_; + reg = (u16)(addr_off >> 1); + addr_2align_odd = (u8)(addr_off & 0x1); + + if(addr_2align_odd) //read that start at high part: e.g 1,3,5,7,9,... + { + stmp = eeprom_read16(padapter, reg); + rbuf[idx++] = (u8) ((stmp>>8)&0xff); //return hogh-part of the short + reg++; sz--; + } + + quotient = sz >> 1; + remainder = sz & 0x1; + + for( i=0 ; i < quotient; i++) + { + stmp = eeprom_read16(padapter, reg+i); + rbuf[idx++] = (u8) (stmp&0xff); + rbuf[idx++] = (u8) ((stmp>>8)&0xff); + } + + reg = reg+i; + if(remainder){ //end of read at lower part of short : 0,2,4,6,... + stmp = eeprom_read16(padapter, reg); + rbuf[idx] = (u8)(stmp & 0xff); + } +_func_exit_; + return _TRUE; +} + + + +VOID read_eeprom_content(_adapter * padapter) +{ + +_func_enter_; + + +_func_exit_; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c b/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c new file mode 100755 index 000000000000..4812536512e9 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ieee80211.c @@ -0,0 +1,1307 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _IEEE80211_C + +#include +#include +#include +#include +#include + + +//----------------------------------------------------------- +// for adhoc-master to generate ie and provide supported-rate to fw +//----------------------------------------------------------- + +static u8 WIFI_CCKRATES[] = +{(IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK), + (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK)}; + +static u8 WIFI_OFDMRATES[] = +{(IEEE80211_OFDM_RATE_6MB), + (IEEE80211_OFDM_RATE_9MB), + (IEEE80211_OFDM_RATE_12MB), + (IEEE80211_OFDM_RATE_18MB), + (IEEE80211_OFDM_RATE_24MB), + IEEE80211_OFDM_RATE_36MB, + IEEE80211_OFDM_RATE_48MB, + IEEE80211_OFDM_RATE_54MB}; + + +int rtw_get_bit_value_from_ieee_value(u8 val) +{ + unsigned char dot11_rate_table[]={2,4,11,22,12,18,24,36,48,72,96,108,0}; // last element must be zero!! + + int i=0; + while(dot11_rate_table[i] != 0) { + if (dot11_rate_table[i] == val) + return BIT(i); + i++; + } + return 0; +} + +uint rtw_is_cckrates_included(u8 *rate) +{ + u32 i = 0; + + while(rate[i]!=0) + { + if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) + return _TRUE; + i++; + } + + return _FALSE; +} + +uint rtw_is_cckratesonly_included(u8 *rate) +{ + u32 i = 0; + + + while(rate[i]!=0) + { + if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) + + return _FALSE; + + i++; + } + + return _TRUE; + +} + +int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) +{ + if (channel > 14) + { + if ((rtw_is_cckrates_included(rate)) == _TRUE) + return WIRELESS_INVALID; + else + return WIRELESS_11A; + } + else // could be pure B, pure G, or B/G + { + if ((rtw_is_cckratesonly_included(rate)) == _TRUE) + return WIRELESS_11B; + else if((rtw_is_cckrates_included(rate)) == _TRUE) + return WIRELESS_11BG; + else + return WIRELESS_11G; + } + +} + +u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, + unsigned int *frlen) +{ + _rtw_memcpy((void *)pbuf, (void *)source, len); + *frlen = *frlen + len; + return (pbuf + len); +} + +// rtw_set_ie will update frame length +u8 *rtw_set_ie +( + u8 *pbuf, + sint index, + uint len, + u8 *source, + uint *frlen //frame length +) +{ +_func_enter_; + *pbuf = (u8)index; + + *(pbuf + 1) = (u8)len; + + if (len > 0) + _rtw_memcpy((void *)(pbuf + 2), (void *)source, len); + + *frlen = *frlen + (len + 2); + + return (pbuf + len + 2); +_func_exit_; +} + + + +/*---------------------------------------------------------------------------- +index: the information element id index, limit is the limit for search +-----------------------------------------------------------------------------*/ +u8 *rtw_get_ie(u8 *pbuf, sint index, sint *len, sint limit) +{ + sint tmp,i; + u8 *p; +_func_enter_; + if (limit < 1){ + _func_exit_; + return NULL; + } + + p = pbuf; + i = 0; + *len = 0; + while(1) + { + if (*p == index) + { + *len = *(p + 1); + return (p); + } + else + { + tmp = *(p + 1); + p += (tmp + 2); + i += (tmp + 2); + } + if (i >= limit) + break; + } +_func_exit_; + return NULL; +} + +void rtw_set_supported_rate(u8* SupportedRates, uint mode) +{ +_func_enter_; + + _rtw_memset(SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); + + switch (mode) + { + case WIRELESS_11B: + _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); + break; + + case WIRELESS_11G: + case WIRELESS_11A: + case WIRELESS_11_5N: + case WIRELESS_11A_5N://Todo: no basic rate for ofdm ? + _rtw_memcpy(SupportedRates, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); + break; + + case WIRELESS_11BG: + case WIRELESS_11G_24N: + case WIRELESS_11_24N: + case WIRELESS_11BG_24N: + _rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN); + _rtw_memcpy(SupportedRates + IEEE80211_CCK_RATE_LEN, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN); + break; + + } +_func_exit_; +} + +uint rtw_get_rateset_len(u8 *rateset) +{ + uint i = 0; +_func_enter_; + while(1) + { + if ((rateset[i]) == 0) + break; + + if (i > 12) + break; + + i++; + } +_func_exit_; + return i; +} + +int rtw_generate_ie(struct registry_priv *pregistrypriv) +{ + u8 wireless_mode; + int sz = 0, rateLen; + WLAN_BSSID_EX* pdev_network = &pregistrypriv->dev_network; + u8* ie = pdev_network->IEs; + +_func_enter_; + + //timestamp will be inserted by hardware + sz += 8; + ie += sz; + + //beacon interval : 2bytes + *(u16*)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);//BCN_INTERVAL; + sz += 2; + ie += 2; + + //capability info + *(u16*)ie = 0; + + *(u16*)ie |= cpu_to_le16(cap_IBSS); + + if(pregistrypriv->preamble == PREAMBLE_SHORT) + *(u16*)ie |= cpu_to_le16(cap_ShortPremble); + + if (pdev_network->Privacy) + *(u16*)ie |= cpu_to_le16(cap_Privacy); + + sz += 2; + ie += 2; + + //SSID + ie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz); + + //supported rates + if(pregistrypriv->wireless_mode == WIRELESS_11ABGN) + { + if(pdev_network->Configuration.DSConfig > 14) + wireless_mode = WIRELESS_11A_5N; + else + wireless_mode = WIRELESS_11BG_24N; + } + else + { + wireless_mode = pregistrypriv->wireless_mode; + } + + rtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode) ; + + rateLen = rtw_get_rateset_len(pdev_network->SupportedRates); + + if (rateLen > 8) + { + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, pdev_network->SupportedRates, &sz); + //ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); + } + else + { + ie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, pdev_network->SupportedRates, &sz); + } + + //DS parameter set + ie = rtw_set_ie(ie, _DSSET_IE_, 1, (u8 *)&(pdev_network->Configuration.DSConfig), &sz); + + + //IBSS Parameter Set + + ie = rtw_set_ie(ie, _IBSS_PARA_IE_, 2, (u8 *)&(pdev_network->Configuration.ATIMWindow), &sz); + + if (rateLen > 8) + { + ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz); + } + + + //HT Cap. + if(((pregistrypriv->wireless_mode&WIRELESS_11_5N)||(pregistrypriv->wireless_mode&WIRELESS_11_24N)) + && (pregistrypriv->ht_enable==_TRUE)) + { + //todo: + } + + //pdev_network->IELength = sz; //update IELength + +_func_exit_; + + //return _SUCCESS; + + return sz; + +} + +unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) +{ + int len; + u16 val16; + unsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01}; + u8 *pbuf = pie; + + while(1) + { + pbuf = rtw_get_ie(pbuf, _WPA_IE_ID_, &len, limit); + + if (pbuf) { + + //check if oui matches... + if (_rtw_memcmp((pbuf + 2), wpa_oui_type, sizeof (wpa_oui_type)) == _FALSE) { + + goto check_next_ie; + } + + //check version... + _rtw_memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16)); + + val16 = le16_to_cpu(val16); + if (val16 != 0x0001) + goto check_next_ie; + + *wpa_ie_len = *(pbuf + 1); + + return pbuf; + + } + else { + + *wpa_ie_len = 0; + return NULL; + } + +check_next_ie: + + limit = limit - (pbuf - pie) - 2 - len; + + if (limit <= 0) + break; + + pbuf += (2 + len); + + } + + *wpa_ie_len = 0; + + return NULL; + +} + +unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit) +{ + + return rtw_get_ie(pie, _WPA2_IE_ID_,rsn_ie_len, limit); + +} + +int rtw_get_wpa_cipher_suite(u8 *s) +{ + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_NONE, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_NONE; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP40, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP40; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_TKIP, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_TKIP; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_CCMP, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_CCMP; + if (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP104, WPA_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP104; + + return 0; +} + +int rtw_get_wpa2_cipher_suite(u8 *s) +{ + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_NONE, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_NONE; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP40, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP40; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_TKIP, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_TKIP; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_CCMP, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_CCMP; + if (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP104, RSN_SELECTOR_LEN) == _TRUE) + return WPA_CIPHER_WEP104; + + return 0; +} + + +int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher) +{ + int i, ret=_SUCCESS; + int left, count; + u8 *pos; + + if (wpa_ie_len <= 0) { + /* No WPA IE - fail silently */ + return _FAIL; + } + + + if ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) || + (_rtw_memcmp(wpa_ie+2, WPA_OUI_TYPE, WPA_SELECTOR_LEN) != _TRUE) ) + { + return _FAIL; + } + + pos = wpa_ie; + + pos += 8; + left = wpa_ie_len - 8; + + + //group_cipher + if (left >= WPA_SELECTOR_LEN) { + + *group_cipher = rtw_get_wpa_cipher_suite(pos); + + pos += WPA_SELECTOR_LEN; + left -= WPA_SELECTOR_LEN; + + } + else if (left > 0) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); + + return _FAIL; + } + + + //pairwise_cipher + if (left >= 2) + { + //count = le16_to_cpu(*(u16*)pos); + count = RTW_GET_LE16(pos); + pos += 2; + left -= 2; + + if (count == 0 || left < count * WPA_SELECTOR_LEN) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " + "count %u left %u", __FUNCTION__, count, left)); + return _FAIL; + } + + for (i = 0; i < count; i++) + { + *pairwise_cipher |= rtw_get_wpa_cipher_suite(pos); + + pos += WPA_SELECTOR_LEN; + left -= WPA_SELECTOR_LEN; + } + + } + else if (left == 1) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); + return _FAIL; + } + + + return ret; + +} + +int rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher) +{ + int i, ret=_SUCCESS; + int left, count; + u8 *pos; + + if (rsn_ie_len <= 0) { + /* No RSN IE - fail silently */ + return _FAIL; + } + + + if ((*rsn_ie!= _WPA2_IE_ID_) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2))) + { + return _FAIL; + } + + pos = rsn_ie; + pos += 4; + left = rsn_ie_len - 4; + + //group_cipher + if (left >= RSN_SELECTOR_LEN) { + + *group_cipher = rtw_get_wpa2_cipher_suite(pos); + + pos += RSN_SELECTOR_LEN; + left -= RSN_SELECTOR_LEN; + + } else if (left > 0) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie length mismatch, %u too much", __FUNCTION__, left)); + return _FAIL; + } + + //pairwise_cipher + if (left >= 2) + { + //count = le16_to_cpu(*(u16*)pos); + count = RTW_GET_LE16(pos); + pos += 2; + left -= 2; + + if (count == 0 || left < count * RSN_SELECTOR_LEN) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie count botch (pairwise), " + "count %u left %u", __FUNCTION__, count, left)); + return _FAIL; + } + + for (i = 0; i < count; i++) + { + *pairwise_cipher |= rtw_get_wpa2_cipher_suite(pos); + + pos += RSN_SELECTOR_LEN; + left -= RSN_SELECTOR_LEN; + } + + } + else if (left == 1) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s: ie too short (for key mgmt)", __FUNCTION__)); + + return _FAIL; + } + + + return ret; + +} + +int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len) +{ + u8 authmode, sec_idx, i; + u8 wpa_oui[4]={0x0,0x50,0xf2,0x01}; + uint cnt; + +_func_enter_; + + //Search required WPA or WPA2 IE and copy to sec_ie[ ] + + cnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_); + + sec_idx=0; + + while(cnt found WPS_IE.....\n"); + *wps_ielen = ie_ptr[1]+2; + match=_TRUE; + } + return match; +} + +u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) +{ + //int match; + uint cnt; + u8 *wpsie_ptr=NULL; + u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04}; + + cnt=_FIXED_IE_LENGTH_; + //match=_FALSE; + while(cntwpa_ie = pos; + elems->wpa_ie_len = elen; + break; + case WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */ + if (elen < 5) { + DBG_871X("short WME " + "information element ignored " + "(len=%lu)\n", + (unsigned long) elen); + return -1; + } + switch (pos[4]) { + case WME_OUI_SUBTYPE_INFORMATION_ELEMENT: + case WME_OUI_SUBTYPE_PARAMETER_ELEMENT: + elems->wme = pos; + elems->wme_len = elen; + break; + case WME_OUI_SUBTYPE_TSPEC_ELEMENT: + elems->wme_tspec = pos; + elems->wme_tspec_len = elen; + break; + default: + DBG_871X("unknown WME " + "information element ignored " + "(subtype=%d len=%lu)\n", + pos[4], (unsigned long) elen); + return -1; + } + break; + case 4: + /* Wi-Fi Protected Setup (WPS) IE */ + elems->wps_ie = pos; + elems->wps_ie_len = elen; + break; + default: + DBG_871X("Unknown Microsoft " + "information element ignored " + "(type=%d len=%lu)\n", + pos[3], (unsigned long) elen); + return -1; + } + break; + + case OUI_BROADCOM: + switch (pos[3]) { + case VENDOR_HT_CAPAB_OUI_TYPE: + elems->vendor_ht_cap = pos; + elems->vendor_ht_cap_len = elen; + break; + default: + DBG_871X("Unknown Broadcom " + "information element ignored " + "(type=%d len=%lu)\n", + pos[3], (unsigned long) elen); + return -1; + } + break; + + default: + DBG_871X("unknown vendor specific information " + "element ignored (vendor OUI %02x:%02x:%02x " + "len=%lu)\n", + pos[0], pos[1], pos[2], (unsigned long) elen); + return -1; + } + + return 0; + +} + +/** + * ieee802_11_parse_elems - Parse information elements in management frames + * @start: Pointer to the start of IEs + * @len: Length of IE buffer in octets + * @elems: Data structure for parsed elements + * @show_errors: Whether to show parsing errors in debug log + * Returns: Parsing result + */ +ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, + struct ieee802_11_elems *elems, + int show_errors) +{ + uint left = len; + u8 *pos = start; + int unknown = 0; + + _rtw_memset(elems, 0, sizeof(*elems)); + + while (left >= 2) { + u8 id, elen; + + id = *pos++; + elen = *pos++; + left -= 2; + + if (elen > left) { + if (show_errors) { + DBG_871X("IEEE 802.11 element " + "parse failed (id=%d elen=%d " + "left=%lu)\n", + id, elen, (unsigned long) left); + } + return ParseFailed; + } + + switch (id) { + case WLAN_EID_SSID: + elems->ssid = pos; + elems->ssid_len = elen; + break; + case WLAN_EID_SUPP_RATES: + elems->supp_rates = pos; + elems->supp_rates_len = elen; + break; + case WLAN_EID_FH_PARAMS: + elems->fh_params = pos; + elems->fh_params_len = elen; + break; + case WLAN_EID_DS_PARAMS: + elems->ds_params = pos; + elems->ds_params_len = elen; + break; + case WLAN_EID_CF_PARAMS: + elems->cf_params = pos; + elems->cf_params_len = elen; + break; + case WLAN_EID_TIM: + elems->tim = pos; + elems->tim_len = elen; + break; + case WLAN_EID_IBSS_PARAMS: + elems->ibss_params = pos; + elems->ibss_params_len = elen; + break; + case WLAN_EID_CHALLENGE: + elems->challenge = pos; + elems->challenge_len = elen; + break; + case WLAN_EID_ERP_INFO: + elems->erp_info = pos; + elems->erp_info_len = elen; + break; + case WLAN_EID_EXT_SUPP_RATES: + elems->ext_supp_rates = pos; + elems->ext_supp_rates_len = elen; + break; + case WLAN_EID_VENDOR_SPECIFIC: + if (rtw_ieee802_11_parse_vendor_specific(pos, elen, + elems, + show_errors)) + unknown++; + break; + case WLAN_EID_RSN: + elems->rsn_ie = pos; + elems->rsn_ie_len = elen; + break; + case WLAN_EID_PWR_CAPABILITY: + elems->power_cap = pos; + elems->power_cap_len = elen; + break; + case WLAN_EID_SUPPORTED_CHANNELS: + elems->supp_channels = pos; + elems->supp_channels_len = elen; + break; + case WLAN_EID_MOBILITY_DOMAIN: + elems->mdie = pos; + elems->mdie_len = elen; + break; + case WLAN_EID_FAST_BSS_TRANSITION: + elems->ftie = pos; + elems->ftie_len = elen; + break; + case WLAN_EID_TIMEOUT_INTERVAL: + elems->timeout_int = pos; + elems->timeout_int_len = elen; + break; + case WLAN_EID_HT_CAP: + elems->ht_capabilities = pos; + elems->ht_capabilities_len = elen; + break; + case WLAN_EID_HT_OPERATION: + elems->ht_operation = pos; + elems->ht_operation_len = elen; + break; + default: + unknown++; + if (!show_errors) + break; + DBG_871X("IEEE 802.11 element parse " + "ignored unknown element (id=%d elen=%d)\n", + id, elen); + break; + } + + left -= elen; + pos += elen; + } + + if (left) + return ParseFailed; + + return unknown ? ParseUnknown : ParseOK; + +} + +u8 key_char2num(u8 ch) +{ + if((ch>='0')&&(ch<='9')) + return ch - '0'; + else if ((ch>='a')&&(ch<='f')) + return ch - 'a' + 10; + else if ((ch>='A')&&(ch<='F')) + return ch - 'A' + 10; + else + return 0xff; +} + +u8 str_2char2num(u8 hch, u8 lch) +{ + return ((key_char2num(hch) * 10 ) + key_char2num(lch)); +} + +u8 key_2char2num(u8 hch, u8 lch) +{ + return ((key_char2num(hch) << 4) | key_char2num(lch)); +} + +extern char* rtw_initmac; +void rtw_macaddr_cfg(u8 *mac_addr) +{ + u8 mac[ETH_ALEN]; + if(mac_addr == NULL) return; + + if ( rtw_initmac ) + { // Users specify the mac address + int jj,kk; + + for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 ) + { + mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk+ 1]); + } + _rtw_memcpy(mac_addr, mac, ETH_ALEN); + } + else + { // Use the mac address stored in the Efuse + _rtw_memcpy(mac, mac_addr, ETH_ALEN); + } + + if (((mac[0]==0xff) &&(mac[1]==0xff) && (mac[2]==0xff) && + (mac[3]==0xff) && (mac[4]==0xff) &&(mac[5]==0xff)) || + ((mac[0]==0x0) && (mac[1]==0x0) && (mac[2]==0x0) && + (mac[3]==0x0) && (mac[4]==0x0) &&(mac[5]==0x0))) + { + mac[0] = 0x00; + mac[1] = 0xe0; + mac[2] = 0x4c; + mac[3] = 0x87; + mac[4] = 0x00; + mac[5] = 0x00; + // use default mac addresss + _rtw_memcpy(mac_addr, mac, ETH_ALEN); + DBG_8192C("MAC Address from efuse error, assign default one !!!\n"); + } + + DBG_8192C("rtw_macaddr_cfg MAC Address = "MAC_FMT"\n", MAC_ARG(mac_addr)); +} + +#ifdef CONFIG_P2P +// Added by Albert 20100910 +// The input buffer in_ie should be pointer to the address of any information element of management frame. +// The p2p_ie buffer will contain "whole" the P2P IE, include the Element ID, Length, P2P OUI and P2P Attributes. +// The p2p_ielen will be the length of p2p_ie buffer. +// The return value will be the offset for the next IE. + +int rtw_get_p2p_ie(u8 *in_ie, uint in_len, u8 *p2p_ie, uint *p2p_ielen) +{ + int match; + uint cnt = 0; + u8 eid, p2p_oui[4]={0x50,0x6F,0x9A,0x09}; + + + match=_FALSE; + while(cnt 1 byte for attribute ID field, 2 bytes for length field + if(attr_content) + _rtw_memcpy( attr_content, &p2p_ie[ cnt + 3 ], attrlen ); + + if(attr_contentlen) + *attr_contentlen = attrlen; + + cnt += attrlen + 3; + + match = _TRUE; + break; + } + else + { + cnt += attrlen + 3; //goto next + } + + } + + return match; + +} + +u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr) +{ + u32 a_len; + + *pbuf = attr_id; + + //*(u16*)(pbuf + 1) = cpu_to_le16(attr_len); + RTW_PUT_LE16(pbuf + 1, attr_len); + + if(pdata_attr) + _rtw_memcpy(pbuf + 3, pdata_attr, attr_len); + + a_len = attr_len + 3; + + return a_len; +} + +// Noted by Albert 20100910 +// 1. WPS uses the TLV format to store the attribute contents. +// T: Type, 2bytes length +// L: Length, 2bytes length +// V: Value, variable length +// 2. WPS uses the big endian to store the WPS attribute contents. + +// attr_content: The output buffer, contains the "value part" of WPS attribute field. +// attr_contentlen: The data length of the "value part" of WPS attribute field. + +int rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *attr_content, uint *attr_contentlen) +{ + int match; + uint cnt = 0; + u8 wps_oui[4]={0x00,0x50,0xF2,0x04}; + u16 attr_id; + + + match=_FALSE; + + if ( ( wps_ie[ 0 ] != _VENDOR_SPECIFIC_IE_ ) || + ( _rtw_memcmp( wps_ie + 2, wps_oui , 4 ) != _TRUE ) ) + { + return( match ); + } + + // 1 ( WPS IE ) + 1 ( Length ) + 4 ( WPS OUI ) + cnt = 6; + while( cnt < wps_ielen ) + { + // 2 -> the length of WPS attribute type field. + //u16 attrlen = be16_to_cpu(*(u16*)(wps_ie + cnt + 2 )); + u16 attrlen = RTW_GET_BE16(wps_ie + cnt + 2); + + //attr_id = be16_to_cpu( *(u16*) ( wps_ie + cnt ) ); + attr_id = RTW_GET_BE16(wps_ie + cnt); + if( attr_id == target_attr_id ) + { + // 3 -> 1 byte for attribute ID field, 2 bytes for length field + _rtw_memcpy( attr_content, &wps_ie[ cnt + 4 ], attrlen ); + + *attr_contentlen = attrlen; + + cnt += attrlen + 4; + + match = _TRUE; + break; + } + else + { + cnt += attrlen + 4; //goto next + } + + } + + return match; + +} + +// Commented by Albert 20110520 +// This function is only used by P2P +int rtw_get_wps_ie_p2p(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) +{ + int match; + uint cnt = 0; + u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04}; + + match=_FALSE; + while(cnt 1 byte for attribute ID field, 1 bytes for length field + if(attr_content) + _rtw_memcpy( attr_content, &wfd_ie[ cnt + 2 ], attrlen ); + + if(attr_contentlen) + *attr_contentlen = attrlen; + + cnt += attrlen + 2; + + match = _TRUE; + break; + } + else + { + cnt += attrlen + 2; //goto next + } + + } + + return match; + +} + + +#endif // CONFIG_WFD +#endif // CONFIG_P2P + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_intel_widi.c b/drivers/net/wireless/rtl8192c/core/rtw_intel_widi.c new file mode 100755 index 000000000000..b71260e1a3aa --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_intel_widi.c @@ -0,0 +1,525 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_INTEL_WIDI_C_ + +#include +#include + +#ifdef CONFIG_INTEL_WIDI +#include + +void intel_widi_listen_timer_hdl(void *FunctionContext); + +void rtw_init_intel_widi( _adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + pmlmepriv->widi_state = INTEL_WIDI_STATE_NONE; + + _init_timer(&pmlmepriv->listen_timer, padapter->pnetdev, intel_widi_listen_timer_hdl, padapter); +} + +void rtw_free_intel_widi( _adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if (padapter->bDriverStopped == _TRUE) + { + _cancel_timer_ex(&pmlmepriv->listen_timer); + } +} + +void issue_probereq_widi(_adapter *padapter, l2_msg_t *l2_msg) +{ + u8 wpsie[256]; + u16 wpsielen = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + _rtw_memcpy(get_my_bssid(&(pmlmeinfo->network)), l2_msg->u.l2sd_service_msg.dst_mac, ETH_ALEN); + + //add wps_ie for WiDi + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Request Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_REQUEST_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_REQ_TYPE_ENROLLEE_INFO_ONLY; + + // Config Method + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC | WPS_CONFIG_METHOD_DISPLAY| WPS_CONFIG_METHOD_LABEL ); + wpsielen += 2; + + // UUID-E + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + wpsielen += 0x10; + + // Primary Device Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( L2SDTA_PRIMARY_DEV_LEN ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, l2_msg->u.l2sd_service_msg.sa_primary_dev, L2SDTA_PRIMARY_DEV_LEN ); + wpsielen += L2SDTA_PRIMARY_DEV_LEN; + + // RF Bands + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RF_BANDS ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_RF_BANDS_2_4_GHZ; // 2.4GHz + + // Association State + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_ASSOCIATION_STATE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ASSOC_STATE_NOT_ASSOCIATED); + wpsielen += 2; + + // Configuration Error + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONFIG_ERROR); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0000); + wpsielen += 2; + + // Device Password ID + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PIN); + wpsielen += 2; + + // Device Name + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( L2SDTA_DEVICE_NAME_LEN ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, l2_msg->u.l2sd_service_msg.sa_device_name, L2SDTA_DEVICE_NAME_LEN ); + wpsielen += L2SDTA_DEVICE_NAME_LEN; + + // Vendor Extension + _rtw_memcpy( wpsie + wpsielen, l2_msg->u.l2sd_service_msg.sa_ext, L2SDTA_SERVICE_VE_LEN ); + wpsielen += L2SDTA_SERVICE_VE_LEN; + + pmlmepriv->probereq_wpsie[0] = 0xdd; + pmlmepriv->probereq_wpsie[1] = wpsielen; + pmlmepriv->probereq_wpsie_len = wpsielen + 2; + _rtw_memcpy(&pmlmepriv->probereq_wpsie[2], wpsie, wpsielen); + + //DBG_871X("WiDi wps ie length = %d\n",wpsielen); + + // driver should issue probe request in the right channel + if( l2_msg->u.l2sd_service_msg.channel == pmlmeext->channel_set[pmlmepriv->channel_idx].ChannelNum) + { + issue_probereq(padapter, 0); + } + + //clear wps ie length after send probe request. + pmlmepriv->probereq_wpsie_len = 0; +} + +static void indicate_widi_msg(_adapter *padapter, _pkt *skb) +{ + skb->dev = padapter->pnetdev; + skb->ip_summed = CHECKSUM_NONE; + skb->protocol = eth_type_trans(skb, padapter->pnetdev); + skb->protocol = htons(ETH_P_WIDI_NOTIF); + netif_rx(skb); +} + +void process_intel_widi_assoc_status(_adapter *padapter, u8 assoc_status) +{ + _pkt *skb; + l2_msg_t *l2_notif; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + skb = dev_alloc_skb(sizeof(l2_msg_t)); +#else + skb = netdev_alloc_skb(padapter->pnetdev, sizeof(l2_msg_t)); +#endif + if(skb != NULL) + { + l2_notif = (l2_msg_t *)skb->data; + _rtw_memset(l2_notif, 0, sizeof(l2_msg_t)); + skb_put(skb, sizeof(struct l2sd_assoc_msg_t)+1); + l2_notif->msg_type = L2SDTA_MSG_TYPE_ASSOC_STATUS; + _rtw_memcpy(l2_notif->u.l2sd_assoc_msg.peer_mac, get_my_bssid(cur_network), ETH_ALEN); + l2_notif->u.l2sd_assoc_msg.assoc_stat = assoc_status; + + DBG_871X("indicate_widi_assoc_status %d\n",assoc_status); + indicate_widi_msg(padapter, skb); + } +} + +void process_intel_widi_disconnect(_adapter *padapter, u8 bdisassoc) +{ + if(padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_CONNECTED) + { + padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_DISASSOCIATED; + process_intel_widi_assoc_status(padapter, L2SDTA_DISASSOCIATED); + } +} + +void process_intel_widi_wps_status(_adapter *padapter, u8 wps_status) +{ + if ( wps_status == 2 ) // WPS Stop because of wps success + { + DBG_871X("Intel WiDi WPS Success with RDS Source\n"); + process_intel_widi_assoc_status(padapter, L2SDTA_WPS_STATUS_SUCCESS); + } + else if ( wps_status == 3 ) // WPS Stop because of wps fail + { + DBG_871X("Intel WiDi WPS Fail with RDS Source\n"); + process_intel_widi_assoc_status(padapter, L2SDTA_WPS_STATUS_FAIL); + } +} + +int process_intel_widi_query_or_tigger(_adapter *padapter, WLAN_BSSID_EX *bssid) +{ + u8 *wps_ie, *wps_attr; + u32 wps_len, wps_attr_len; + _pkt *skb; + l2_msg_t *l2_notif; + struct l2sd_wps_attrib_hdr_t *l2sd_attr; + + if(padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_LISTEN) + return 0; + + wps_ie = rtw_get_wps_ie(bssid->IEs, bssid->IELength, NULL, &wps_len); + if(wps_ie && wps_len>0) + { + wps_attr = rtw_get_wps_attr_ie(wps_ie, wps_len, WPS_ATTR_VENDOR_EXT, NULL, &wps_attr_len); + if(wps_attr && wps_attr_len>0) + { + l2sd_attr = (struct l2sd_wps_attrib_hdr_t *)wps_attr; + if(IS_INTEL_SMI(l2sd_attr->smi_intel)) + { + DBG_871X("Get WPS Vendor extension IE from Intel, length = %d\n",wps_attr_len); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + skb = dev_alloc_skb(sizeof(l2_msg_t)); +#else + skb = netdev_alloc_skb(padapter->pnetdev, sizeof(l2_msg_t)); +#endif + if(skb != NULL) + { + l2_notif = (l2_msg_t *)skb->data; + _rtw_memset(l2_notif, 0, sizeof(l2_msg_t)); + skb_put(skb, sizeof(struct l2sd_query_or_trig_msg_t)+1); + l2_notif->msg_type = L2SDTA_MSG_TYPE_QUERY_OR_TRIGGER; + _rtw_memcpy(l2_notif->u.l2sd_query_or_trig_msg.src_mac, bssid->MacAddress, ETH_ALEN); + l2_notif->u.l2sd_query_or_trig_msg.channel = bssid->Configuration.DSConfig; + l2_notif->u.l2sd_query_or_trig_msg.ssid_len = bssid->Ssid.SsidLength; + _rtw_memcpy(l2_notif->u.l2sd_query_or_trig_msg.ssid, bssid->Ssid.Ssid, bssid->Ssid.SsidLength); + _rtw_memcpy(l2_notif->u.l2sd_query_or_trig_msg.qa_ta_ext, wps_attr, wps_attr_len+4); + + DBG_871X("Recvive WIDI Query or Trigger Msg\n"); + indicate_widi_msg(padapter, skb); + } + } + } + } + + return 1; +} + +void process_intel_widi_cmd(_adapter*padapter, u8 *cmd) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + DBG_8192C( "[%s] cmd = %s\n", __FUNCTION__, cmd ); + + if( _rtw_memcmp( cmd, "enable", 6 ) ) + { + DBG_871X("Intel WiDi Enable\n"); + } + else if ( _rtw_memcmp( cmd, "disable", 7 ) ) + { + DBG_871X("Intel WiDi Disable\n"); + pmlmepriv->widi_state = INTEL_WIDI_STATE_NONE; + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK); + } + else if ( _rtw_memcmp( cmd, "listen", 6 ) ) + { + DBG_871X("Intel WiDi start listening for RDS Source\n"); + pmlmepriv->widi_state = INTEL_WIDI_STATE_LISTEN; + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_WK); + } + else if ( _rtw_memcmp( cmd, "wps_start", 9 ) ) + { + DBG_871X("Intel WiDi start WPS with RDS Source\n"); + pmlmepriv->widi_state = INTEL_WIDI_STATE_WPS; + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK); + } + else if ( _rtw_memcmp( cmd, "associate", 9 ) ) + { + DBG_871X("Intel WiDi is ready to associate with RDS Source\n"); + pmlmepriv->widi_state = INTEL_WIDI_STATE_ASSOICATE; + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK); + } + else if ( _rtw_memcmp( cmd, "connected", 9 ) ) + { + DBG_871X("Intel WiDi is connected with RDS Source\n"); + pmlmepriv->widi_state = INTEL_WIDI_STATE_CONNECTED; + process_intel_widi_assoc_status(padapter, L2SDTA_ASSOCIATED); + } +} + +void intel_widi_listen_timer_hdl(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if(pmlmepriv->listen_state == INTEL_WIDI_LISTEN_PROCESS) + { + pmlmepriv->channel_idx++; + } + + intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_WK); +} + +void intel_widi_listen_stop_handler(_adapter *padapter) +{ + u8 val8; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pmlmepriv->listen_state == INTEL_WIDI_LISTEN_STOP) + return; + + DBG_871X("Leave WiDi Listen Mode\n"); + + _cancel_timer_ex(&(pmlmepriv->listen_timer)); + + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + //config MSR + Set_MSR(padapter, (pmlmeinfo->state & 0x3)); + + //turn on dynamic functions + Restore_DM_Func_Flag(padapter); + + pmlmepriv->listen_state = INTEL_WIDI_LISTEN_STOP; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; +} + +void intel_widi_listen_handler(_adapter *padapter) +{ + u8 listen_channel, val8; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + + if(pmlmepriv->widi_state != INTEL_WIDI_STATE_LISTEN) + { + if(pmlmepriv->listen_state != INTEL_WIDI_LISTEN_STOP) + { + intel_widi_listen_stop_handler(padapter); + } + return; + } + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + { + _set_timer(&(pmlmepriv->listen_timer), 1000); + return; + } + + if(pmlmepriv->listen_state == INTEL_WIDI_LISTEN_STOP) + { + pmlmepriv->channel_idx = 0; + + _rtw_memset(pmlmeext->sitesurvey_res.ss_ssid, 0, (IW_ESSID_MAX_SIZE + 1)); + pmlmeext->sitesurvey_res.ss_ssidlen = 0; + + //disable dynamic functions, such as high power, DIG + Save_DM_Func_Flag(padapter); + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //set MSR to no link state + Set_MSR(padapter, _HW_STATE_NOLINK_); + + val8 = 1; //before site survey + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + pmlmepriv->listen_state = INTEL_WIDI_LISTEN_PROCESS; + pmlmeext->sitesurvey_res.state = SCAN_PROCESS; + } + + listen_channel = pmlmeext->channel_set[pmlmepriv->channel_idx].ChannelNum; + + if(listen_channel == 0) + { + // Get Back to first channel + pmlmepriv->channel_idx = 0; + listen_channel = pmlmeext->channel_set[pmlmepriv->channel_idx].ChannelNum; + } + + if(pmlmepriv->channel_idx == 0) + { + set_channel_bwmode(padapter, listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + else + { + SelectChannel(padapter, listen_channel); + } + + _set_timer(&(pmlmepriv->listen_timer), SURVEY_TO); +} + +void intel_widi_wk_hdl(_adapter *padapter, u8 intel_widi_state) +{ +_func_enter_; + + switch(intel_widi_state) + { + case INTEL_WIDI_LISTEN_WK: + intel_widi_listen_handler(padapter); + break; + case INTEL_WIDI_LISTEN_STOP_WK: + intel_widi_listen_stop_handler(padapter); + break; + default: + break; + } + +_func_exit_; +} + +u8 intel_widi_wk_cmd(_adapter*padapter, u8 intel_widi_state) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = INTEl_WIDI_WK_CID; + pdrvextra_cmd_parm->type_size = intel_widi_state; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; + +} +#endif //CONFIG_INTEL_WIDI + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_io.c b/drivers/net/wireless/rtl8192c/core/rtw_io.c new file mode 100755 index 000000000000..18bbece8143b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_io.c @@ -0,0 +1,436 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/* + +The purpose of rtw_io.c + +a. provides the API + +b. provides the protocol engine + +c. provides the software interface between caller and the hardware interface + + +Compiler Flag Option: + +1. CONFIG_SDIO_HCI: + a. USE_SYNC_IRP: Only sync operations are provided. + b. USE_ASYNC_IRP:Both sync/async operations are provided. + +2. CONFIG_USB_HCI: + a. USE_ASYNC_IRP: Both sync/async operations are provided. + +3. CONFIG_CFIO_HCI: + b. USE_SYNC_IRP: Only sync operations are provided. + + +Only sync read/rtw_write_mem operations are provided. + +jackson@realtek.com.tw + +*/ + +#define _RTW_IO_C_ +#include +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#error "Shall be Linux or Windows, but not both!\n" +#endif + +#ifdef CONFIG_SDIO_HCI +#include +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +#ifdef CONFIG_PCI_HCI +#include +#endif + + +u8 _rtw_read8(_adapter *adapter, u32 addr) +{ + u8 r_val; + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); + _func_enter_; + _read8 = pintfhdl->io_ops._read8; + + r_val = _read8(pintfhdl, addr); + _func_exit_; + return r_val; +} + +u16 _rtw_read16(_adapter *adapter, u32 addr) +{ + u16 r_val; + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); + _func_enter_; + _read16 = pintfhdl->io_ops._read16; + + r_val = _read16(pintfhdl, addr); + _func_exit_; + return r_val; +} + +u32 _rtw_read32(_adapter *adapter, u32 addr) +{ + u32 r_val; + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); + _func_enter_; + _read32 = pintfhdl->io_ops._read32; + + r_val = _read32(pintfhdl, addr); + _func_exit_; + return r_val; + +} + +int _rtw_write8(_adapter *adapter, u32 addr, u8 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + int ret; + _func_enter_; + _write8 = pintfhdl->io_ops._write8; + + ret = _write8(pintfhdl, addr, val); + _func_exit_; + + return RTW_STATUS_CODE(ret); +} +int _rtw_write16(_adapter *adapter, u32 addr, u16 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + int ret; + _func_enter_; + _write16 = pintfhdl->io_ops._write16; + + ret = _write16(pintfhdl, addr, val); + _func_exit_; + + return RTW_STATUS_CODE(ret); +} +int _rtw_write32(_adapter *adapter, u32 addr, u32 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + int ret; + _func_enter_; + _write32 = pintfhdl->io_ops._write32; + + ret = _write32(pintfhdl, addr, val); + _func_exit_; + + return RTW_STATUS_CODE(ret); +} + +int _rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *pdata) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = (struct intf_hdl*)(&(pio_priv->intf)); + int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr,u32 length, u8 *pdata); + int ret; + _func_enter_; + _writeN = pintfhdl->io_ops._writeN; + + ret = _writeN(pintfhdl, addr,length,pdata); + _func_exit_; + + return RTW_STATUS_CODE(ret); +} +int _rtw_write8_async(_adapter *adapter, u32 addr, u8 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + int ret; + _func_enter_; + _write8_async = pintfhdl->io_ops._write8_async; + + ret = _write8_async(pintfhdl, addr, val); + _func_exit_; + + return RTW_STATUS_CODE(ret); +} +int _rtw_write16_async(_adapter *adapter, u32 addr, u16 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + int ret; + _func_enter_; + _write16_async = pintfhdl->io_ops._write16_async; + + ret = _write16_async(pintfhdl, addr, val); + _func_exit_; + + return RTW_STATUS_CODE(ret); +} +int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val) +{ + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + int ret; + _func_enter_; + _write32_async = pintfhdl->io_ops._write32_async; + + ret = _write32_async(pintfhdl, addr, val); + _func_exit_; + + return RTW_STATUS_CODE(ret); +} +void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE)) + { + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_mem:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); + return; + } + + _read_mem = pintfhdl->io_ops._read_mem; + + _read_mem(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _write_mem = pintfhdl->io_ops._write_mem; + + _write_mem(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + if( (adapter->bDriverStopped ==_TRUE) || (adapter->bSurpriseRemoved == _TRUE)) + { + RT_TRACE(_module_rtl871x_io_c_, _drv_info_, ("rtw_read_port:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); + return; + } + + _read_port = pintfhdl->io_ops._read_port; + + _read_port(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void _rtw_read_port_cancel(_adapter *adapter) +{ + void (*_read_port_cancel)(struct intf_hdl *pintfhdl); + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _read_port_cancel = pintfhdl->io_ops._read_port_cancel; + + if(_read_port_cancel) + _read_port_cancel(pintfhdl); + +} + +void _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem) +{ + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _write_port = pintfhdl->io_ops._write_port; + + _write_port(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +} + +void _rtw_write_port_cancel(_adapter *adapter) +{ + void (*_write_port_cancel)(struct intf_hdl *pintfhdl); + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _write_port_cancel = pintfhdl->io_ops._write_port_cancel; + + if(_write_port_cancel) + _write_port_cancel(pintfhdl); + +} + + +void _rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem){ +#ifdef CONFIG_SDIO_HCI + void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _attrib_read= pintfhdl->io_ops._attrib_read; + + _attrib_read(pintfhdl, addr, cnt, pmem); + + _func_exit_; +#endif +} + +void _rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem){ +#ifdef CONFIG_SDIO_HCI + void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + //struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + struct io_priv *pio_priv = &adapter->iopriv; + struct intf_hdl *pintfhdl = &(pio_priv->intf); + + _func_enter_; + + _attrib_write= pintfhdl->io_ops._attrib_write; + + _attrib_write(pintfhdl, addr, cnt, pmem); + + _func_exit_; + +#endif +} + +int rtw_init_io_priv(_adapter *padapter) +{ + void (*set_intf_ops)(struct _io_ops *pops); + struct io_priv *piopriv = &padapter->iopriv; + struct intf_hdl *pintf = &piopriv->intf; + + piopriv->padapter = padapter; + pintf->padapter = padapter; + pintf->pintf_dev = &padapter->dvobjpriv; + + +#ifdef CONFIG_SDIO_HCI + set_intf_ops = &sdio_set_intf_ops; +#endif //END OF CONFIG_SDIO_HCI + + +#ifdef CONFIG_USB_HCI + + if(padapter->chip_type == RTL8188C_8192C) + { +#ifdef CONFIG_RTL8192C + set_intf_ops = &rtl8192cu_set_intf_ops; +#endif + } + else if(padapter->chip_type == RTL8192D) + { +#ifdef CONFIG_RTL8192D + set_intf_ops = &rtl8192du_set_intf_ops; +#endif + } + else + { + set_intf_ops = NULL; + } +#endif //END OF CONFIG_USB_HCI + +#ifdef CONFIG_PCI_HCI + + if(padapter->chip_type == RTL8188C_8192C) + { +#ifdef CONFIG_RTL8192C + set_intf_ops = &rtl8192ce_set_intf_ops; +#endif + } + else if(padapter->chip_type == RTL8192D) + { +#ifdef CONFIG_RTL8192D + set_intf_ops = &rtl8192de_set_intf_ops; +#endif + } + else + { + set_intf_ops = NULL; + } +#endif //END OF CONFIG_PCI_HCI + + + if(set_intf_ops==NULL) + return _FAIL; + + set_intf_ops(&pintf->io_ops); + + return _SUCCESS; + +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c new file mode 100755 index 000000000000..156640cf351a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_query.c @@ -0,0 +1,197 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_IOCTL_QUERY_C_ + +#include +#include +#include +#include +#include + + +#ifdef PLATFORM_WINDOWS +// +// Added for WPA2-PSK, by Annie, 2005-09-20. +// +u8 +query_802_11_capability( + _adapter* Adapter, + u8* pucBuf, + u32 * pulOutLen +) +{ + static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = + { + {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled}, + {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled}, + {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled}, + {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled}, + {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled}, + {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled}, + {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled} + }; + static ULONG ulNumOfPairSupported = sizeof(szAuthEnc)/sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); + NDIS_802_11_CAPABILITY * pCap = (NDIS_802_11_CAPABILITY *)pucBuf; + u8* pucAuthEncryptionSupported = (u8*) pCap->AuthenticationEncryptionSupported; + + + pCap->Length = sizeof(NDIS_802_11_CAPABILITY); + if(ulNumOfPairSupported > 1 ) + pCap->Length += (ulNumOfPairSupported-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION); + + pCap->Version = 2; + pCap->NoOfPMKIDs = NUM_PMKID_CACHE; + pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported; + + if( sizeof (szAuthEnc) <= 240 ) // 240 = 256 - 4*4 // SecurityInfo.szCapability: only 256 bytes in size. + { + _rtw_memcpy( pucAuthEncryptionSupported, (u8*)szAuthEnc, sizeof (szAuthEnc) ); + *pulOutLen = pCap->Length; + return _TRUE; + } + else + { + *pulOutLen = 0; + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("_query_802_11_capability(): szAuthEnc size is too large.\n")); + return _FALSE; + } +} + +u8 query_802_11_association_information( _adapter *padapter,PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo) +{ + struct wlan_network *tgt_network; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv=&(padapter->securitypriv); + WLAN_BSSID_EX *psecnetwork=(WLAN_BSSID_EX*)&(psecuritypriv->sec_bss); + u8 * pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + unsigned char i,*auth_ie,*supp_ie; + + //NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); + _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); + //pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + + //------------------------------------------------------ + // Association Request related information + //------------------------------------------------------ + // Req_1. AvailableRequestFixedIEs + if(psecnetwork!=NULL){ + + pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES|NDIS_802_11_AI_REQFI_CURRENTAPADDRESS; + pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short)* & psecnetwork->IEs[10]; + _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress, + & psecnetwork->MacAddress, 6); + + pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + + if(check_fwstate( pmlmepriv, _FW_UNDER_LINKING|_FW_LINKED)==_TRUE) + { + + if(psecuritypriv->ndisauthtype>=Ndis802_11AuthModeWPA2) + pDest[0] =48; //RSN Information Element + else + pDest[0] =221; //WPA(SSN) Information Element + + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n Adapter->ndisauthtype==Ndis802_11AuthModeWPA)?0xdd:0x30 [%d]",pDest[0])); + supp_ie=&psecuritypriv->supplicant_ie[0]; + for(i=0;inetwork.IELength=%d\n\n", i,(int)psecnetwork->IELength)); + while((iRequestIELength += (2 + supp_ie[1+i]);// (2 + psecnetwork->IEs[1+i]+4); + + } + + + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n psecnetwork != NULL,fwstate==_FW_UNDER_LINKING \n")); + + } + + + //------------------------------------------------------ + // Association Response related information + //------------------------------------------------------ + + if(check_fwstate( pmlmepriv, _FW_LINKED)==_TRUE) + { + tgt_network =&(pmlmepriv->cur_network); + if(tgt_network!=NULL){ + pAssocInfo->AvailableResponseFixedIEs = + NDIS_802_11_AI_RESFI_CAPABILITIES + |NDIS_802_11_AI_RESFI_ASSOCIATIONID + ; + + pAssocInfo->ResponseFixedIEs.Capabilities =(unsigned short)* & tgt_network->network.IEs[10]; + pAssocInfo->ResponseFixedIEs.StatusCode = 0; + pAssocInfo->ResponseFixedIEs.AssociationId =(unsigned short) tgt_network->aid; + + pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)+pAssocInfo->RequestIELength; + auth_ie=&psecuritypriv->authenticator_ie[0]; + + for(i=0;i0){ + _rtw_memcpy((u8 *)&pDest[0],&auth_ie[1],i); + pAssocInfo->ResponseIELength =i; + } + + + pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength; + + + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n tgt_network != NULL,fwstate==_FW_LINKED \n")); + } + } + RT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,("\n exit query_802_11_association_information \n")); +_func_exit_; + + return _TRUE; +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c new file mode 100755 index 000000000000..87348a291b4b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_rtl.c @@ -0,0 +1,1032 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_IOCTL_RTL_C_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_MP_INCLUDED +#include +#include +#endif + +struct oid_obj_priv oid_rtl_seg_01_01[] = +{ + {1, &oid_null_function}, //0x80 + {1, &oid_null_function}, //0x81 + {1, &oid_null_function}, //0x82 + {1, &oid_null_function}, //0x83//OID_RT_SET_SNIFFER_MODE + {1, &oid_rt_get_signal_quality_hdl}, //0x84 + {1, &oid_rt_get_small_packet_crc_hdl}, //0x85 + {1, &oid_rt_get_middle_packet_crc_hdl}, //0x86 + {1, &oid_rt_get_large_packet_crc_hdl}, //0x87 + {1, &oid_rt_get_tx_retry_hdl}, //0x88 + {1, &oid_rt_get_rx_retry_hdl}, //0x89 + {1, &oid_rt_pro_set_fw_dig_state_hdl}, //0x8A + {1, &oid_rt_pro_set_fw_ra_state_hdl} , //0x8B + {1, &oid_null_function}, //0x8C + {1, &oid_null_function}, //0x8D + {1, &oid_null_function}, //0x8E + {1, &oid_null_function}, //0x8F + {1, &oid_rt_get_rx_total_packet_hdl}, //0x90 + {1, &oid_rt_get_tx_beacon_ok_hdl}, //0x91 + {1, &oid_rt_get_tx_beacon_err_hdl}, //0x92 + {1, &oid_rt_get_rx_icv_err_hdl}, //0x93 + {1, &oid_rt_set_encryption_algorithm_hdl}, //0x94 + {1, &oid_null_function}, //0x95 + {1, &oid_rt_get_preamble_mode_hdl}, //0x96 + {1, &oid_null_function}, //0x97 + {1, &oid_rt_get_ap_ip_hdl}, //0x98 + {1, &oid_rt_get_channelplan_hdl}, //0x99 + {1, &oid_rt_set_preamble_mode_hdl}, //0x9A + {1, &oid_rt_set_bcn_intvl_hdl}, //0x9B + {1, &oid_null_function}, //0x9C + {1, &oid_rt_dedicate_probe_hdl}, //0x9D + {1, &oid_null_function}, //0x9E + {1, &oid_null_function}, //0x9F + {1, &oid_null_function}, //0xA0 + {1, &oid_null_function}, //0xA1 + {1, &oid_null_function}, //0xA2 + {1, &oid_null_function}, //0xA3 + {1, &oid_null_function}, //0xA4 + {1, &oid_null_function}, //0xA5 + {1, &oid_null_function}, //0xA6 + {1, &oid_rt_get_total_tx_bytes_hdl}, //0xA7 + {1, &oid_rt_get_total_rx_bytes_hdl}, //0xA8 + {1, &oid_rt_current_tx_power_level_hdl}, //0xA9 + {1, &oid_rt_get_enc_key_mismatch_count_hdl}, //0xAA + {1, &oid_rt_get_enc_key_match_count_hdl}, //0xAB + {1, &oid_rt_get_channel_hdl}, //0xAC + {1, &oid_rt_set_channelplan_hdl}, //0xAD + {1, &oid_rt_get_hardware_radio_off_hdl}, //0xAE + {1, &oid_null_function}, //0xAF + {1, &oid_null_function}, //0xB0 + {1, &oid_null_function}, //0xB1 + {1, &oid_null_function}, //0xB2 + {1, &oid_null_function}, //0xB3 + {1, &oid_rt_get_key_mismatch_hdl}, //0xB4 + {1, &oid_null_function}, //0xB5 + {1, &oid_null_function}, //0xB6 + {1, &oid_null_function}, //0xB7 + {1, &oid_null_function}, //0xB8 + {1, &oid_null_function}, //0xB9 + {1, &oid_null_function}, //0xBA + {1, &oid_rt_supported_wireless_mode_hdl}, //0xBB + {1, &oid_rt_get_channel_list_hdl}, //0xBC + {1, &oid_rt_get_scan_in_progress_hdl}, //0xBD + {1, &oid_null_function}, //0xBE + {1, &oid_null_function}, //0xBF + {1, &oid_null_function}, //0xC0 + {1, &oid_rt_forced_data_rate_hdl}, //0xC1 + {1, &oid_rt_wireless_mode_for_scan_list_hdl}, //0xC2 + {1, &oid_rt_get_bss_wireless_mode_hdl}, //0xC3 + {1, &oid_rt_scan_with_magic_packet_hdl}, //0xC4 + {1, &oid_null_function}, //0xC5 + {1, &oid_null_function}, //0xC6 + {1, &oid_null_function}, //0xC7 + {1, &oid_null_function}, //0xC8 + {1, &oid_null_function}, //0xC9 + {1, &oid_null_function}, //0xCA + {1, &oid_null_function}, //0xCB + {1, &oid_null_function}, //0xCC + {1, &oid_null_function}, //0xCD + {1, &oid_null_function}, //0xCE + {1, &oid_null_function}, //0xCF + +}; + +struct oid_obj_priv oid_rtl_seg_01_03[] = +{ + {1, &oid_rt_ap_get_associated_station_list_hdl}, //0x00 + {1, &oid_null_function}, //0x01 + {1, &oid_rt_ap_switch_into_ap_mode_hdl}, //0x02 + {1, &oid_null_function}, //0x03 + {1, &oid_rt_ap_supported_hdl}, //0x04 + {1, &oid_rt_ap_set_passphrase_hdl}, //0x05 + +}; + +struct oid_obj_priv oid_rtl_seg_01_11[] = +{ + {1, &oid_null_function}, //0xC0 OID_RT_PRO_RX_FILTER + {1, &oid_null_function}, //0xC1 OID_CE_USB_WRITE_REGISTRY + {1, &oid_null_function}, //0xC2 OID_CE_USB_READ_REGISTRY + {1, &oid_null_function}, //0xC3 OID_RT_PRO_SET_INITIAL_GAIN + {1, &oid_null_function}, //0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE + {1, &oid_null_function}, //0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE + {1, &oid_null_function}, //0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP + {1, &oid_null_function}, //0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP + {1, &oid_rt_pro_rf_write_registry_hdl}, //0xC8 + {1, &oid_rt_pro_rf_read_registry_hdl}, //0xC9 + {1, &oid_null_function} //0xCA OID_RT_PRO_QUERY_RF_TYPE + +}; + +struct oid_obj_priv oid_rtl_seg_03_00[] = +{ + {1, &oid_null_function}, //0x00 + {1, &oid_rt_get_connect_state_hdl}, //0x01 + {1, &oid_null_function}, //0x02 + {1, &oid_null_function}, //0x03 + {1, &oid_rt_set_default_key_id_hdl}, //0x04 + + +}; + + +//************** oid_rtl_seg_01_01 section start ************** + +NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + + _func_enter_; + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql,LOWER); + if(poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) + { + //DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); + if(!rtw_setfwdig_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + + } + else{ + status = NDIS_STATUS_NOT_ACCEPTED; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; +#endif + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv) +{ + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + + _func_enter_; + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + + _irqlevel_changed_(&oldirql,LOWER); + + if(poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) + { + //DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); + if(!rtw_setfwra_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf ))) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + + } + else{ + status = NDIS_STATUS_NOT_ACCEPTED; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; +#endif + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + //DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl \n")); + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + +#if 0 + if(pMgntInfo->mAssoc || pMgntInfo->mIbss) + { + ulInfo = pAdapter->RxStats.SignalQuality; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + ulInfo = 0xffffffff; // It stands for -1 in 4-byte integer. + } + break; +#endif + + return status; +} + +//------------------------------------------------------------------------------ + +NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len >= sizeof(ULONG) ) + { + *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(u32)) + { + //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); + *(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG preamblemode = 0 ; + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + if(padapter->registrypriv.preamble == PREAMBLE_LONG) + preamblemode = 0; + else if (padapter->registrypriv.preamble == PREAMBLE_AUTO) + preamblemode = 1; + else if (padapter->registrypriv.preamble == PREAMBLE_SHORT) + preamblemode = 2; + + + *(ULONG *)poid_par_priv->information_buf = preamblemode ; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + +NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + struct eeprom_priv* peeprompriv = &padapter->eeprompriv; + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + *(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan ; + + return status; +} +NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + struct eeprom_priv* peeprompriv = &padapter->eeprompriv; + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf ; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG preamblemode = 0; + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + preamblemode = *(ULONG *)poid_par_priv->information_buf ; + if( preamblemode == 0) + padapter->registrypriv.preamble = PREAMBLE_LONG; + else if (preamblemode==1 ) + padapter->registrypriv.preamble = PREAMBLE_AUTO; + else if ( preamblemode==2 ) + padapter->registrypriv.preamble = PREAMBLE_SHORT; + + *(ULONG *)poid_par_priv->information_buf = preamblemode ; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len>= sizeof(ULONG)) + { + //_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); + *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else + { + status = NDIS_STATUS_INVALID_LENGTH ; + } + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + NDIS_802_11_CONFIGURATION *pnic_Config; + + ULONG channelnum; + + _func_enter_; + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) + pnic_Config = &pmlmepriv->cur_network.network.Configuration; + else + pnic_Config = &padapter->registrypriv.dev_network.Configuration; + + channelnum = pnic_Config->DSConfig; + *(ULONG *)poid_par_priv->information_buf = channelnum; + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + _func_exit_; + + + + return status; +} +NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + ULONG ulInfo = 0 ; + //DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl \n")); + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if(poid_par_priv->information_buf_len >= sizeof(ULONG)){ + ulInfo |= 0x0100; //WIRELESS_MODE_B + ulInfo |= 0x0200; //WIRELESS_MODE_G + ulInfo |= 0x0400; //WIRELESS_MODE_A + + *(ULONG *) poid_par_priv->information_buf = ulInfo; + //DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo)); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } + else{ + status = NDIS_STATUS_INVALID_LENGTH; + } + + return status; +} +NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + + +NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + +NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +//************** oid_rtl_seg_01_01 section end ************** + +//************** oid_rtl_seg_01_03 section start ************** +NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + return status; +} +NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} + +//************** oid_rtl_seg_01_03 section end ************** + +//**************** oid_rtl_seg_01_11 section start **************** +NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + _func_enter_; + //DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl \n")); + if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql,LOWER); + if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) + { + //RegOffsetValue - The offset of RF register to write. + //RegDataWidth - The data width of RF register to write. + //RegDataValue - The value to write. + //RegOffsetValue = *((unsigned long*)InformationBuffer); + //RegDataWidth = *((unsigned long*)InformationBuffer+1); + //RegDataValue = *((unsigned long*)InformationBuffer+2); + if(!rtw_setrfreg_cmd(Adapter, + *(unsigned char*)poid_par_priv->information_buf, + (unsigned long)(*((unsigned long*)poid_par_priv->information_buf+2)))) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + + } + else{ + status = NDIS_STATUS_INVALID_LENGTH; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + _func_enter_; + + //DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl \n")); + if(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql,LOWER); + if(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3)) + { + if(Adapter->mppriv.act_in_progress == _TRUE) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + else + { + //init workparam + Adapter->mppriv.act_in_progress = _TRUE; + Adapter->mppriv.workparam.bcompleted= _FALSE; + Adapter->mppriv.workparam.act_type = MPT_READ_RF; + Adapter->mppriv.workparam.io_offset = *(unsigned long*)poid_par_priv->information_buf; + Adapter->mppriv.workparam.io_value = 0xcccccccc; + + //RegOffsetValue - The offset of RF register to read. + //RegDataWidth - The data width of RF register to read. + //RegDataValue - The value to read. + //RegOffsetValue = *((unsigned long*)InformationBuffer); + //RegDataWidth = *((unsigned long*)InformationBuffer+1); + //RegDataValue = *((unsigned long*)InformationBuffer+2); + if(!rtw_getrfreg_cmd(Adapter, + *(unsigned char*)poid_par_priv->information_buf, + (unsigned char*)&Adapter->mppriv.workparam.io_value)) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + } + + + } + else { + status = NDIS_STATUS_INVALID_LENGTH; + } + _irqlevel_changed_(&oldirql,RAISE); + _func_exit_; +#endif + return status; +} + +//**************** oid_rtl_seg_01_11 section end**************** + + +//************** oid_rtl_seg_03_00 section start ************** +enum _CONNECT_STATE_{ + CHECKINGSTATUS, + ASSOCIATED, + ADHOCMODE, + NOTASSOCIATED +}; + +NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + ULONG ulInfo; + + if(poid_par_priv->type_of_oid != QUERY_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + // nStatus==0 CheckingStatus + // nStatus==1 Associated + // nStatus==2 AdHocMode + // nStatus==3 NotAssociated + + if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) + ulInfo = CHECKINGSTATUS; + else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + ulInfo = ASSOCIATED; + else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)== _TRUE) + ulInfo = ADHOCMODE; + else + ulInfo = NOTASSOCIATED ; + + *(ULONG *)poid_par_priv->information_buf = ulInfo; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +#if 0 + // Rearrange the order to let the UI still shows connection when scan is in progress + RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("===> Query OID_RT_GET_CONNECT_STATE.\n")); + if(pMgntInfo->mAssoc) + ulInfo = 1; + else if(pMgntInfo->mIbss) + ulInfo = 2; + else if(pMgntInfo->bScanInProgress) + ulInfo = 0; + else + ulInfo = 3; + ulInfoLen = sizeof(ULONG); + RT_TRACE(COMP_OID_QUERY, DBG_LOUD, ("<=== Query OID_RT_GET_CONNECT_STATE: %d\n", ulInfo)); +#endif + + return status; +} + +NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + + if(poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + return status; +} +//************** oid_rtl_seg_03_00 section end ************** diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu new file mode 100644 index 000000000000..6d0fe423d5ed --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu @@ -0,0 +1,170 @@ +begin 644 core/rtw_ioctl_set.o +M?T5,1@$!`0````````````$`*``!``````````````!<$```````!30````` +M`"@`$``-``1`+>4`()#E(`!2XQ0``(H``%+C%```"@0PT.4@,$/B4-$=+C$P``&@$#$N,'```:!CN`X@0P@^(#(`+B`@*#X``0H.,0 +M(*#C_O__ZPD``.I7#8#B$`"`XN`0@^+^___K`$!0X@,```H1#H3B`!"@XQ`@ +MH./^___K`0"@XQ"`O>CP02WI`4"@X0%@H.$`4*#A`0!PX@``H#.A#Y#A%0`` +M&@,`4>,3``"*7GV%XBP`A^(!`H#@`!"@XQ`@H./^___K!0"@X2`0A^($(*#A +M`#"@X_[__^M?3H3B"D"$X@1!A>`$0(3B`#"@XP`PA.4#0%#@`4"@$P```.H` +M0*#C!`"@X?"!O>AP0"WI`$"@X0%0H.$$8)'E`V'&XP0`5N,`0*##(0``R@@P +MD>4%`%/C`2"@`Z0W`0,#((0'!@``"@T`4^,`(*`3I#,#8(3G!`"@X5X=A.(@$('B!B"@X0$PH./^___K`$!0X@%`H!,$ +M`*#A<("]Z/!'+>D(T$WB`$"@X0%0H.$$,)'E``!3XP(``+H!`1/C+@``"D(! +M`.H!`1/C*P``"E<-@.(0`(#BX!"$XO[__^L`8%#B!```"J`W`>,#,)3G`@!3 +MX^Q@E@4!```*I#4@`%/C)0$`&DP``.H$`%;C"0``&@@PE>40 +M`%/C!@``"B``4^,=`0`:$#"@XP@PA>4`<*#C!X"@X40``.H%`%;C`0!6$Q4! +M``H\``#J"#L!XP,PE.<#`%/C$P``BOPW`>,#,)3G``!3XP\``!H(,)7E!0!3 +MXP$@H`.D-P$#`R"$!P8```H-`%/C`""@$Z0W`1,#((07!2"@`Z0W`0,#((0' +MI#`H!$#```*`P``Z@!PH.,'@*#A````Z@&`H..@-P'C +M`S"4YP(`4^,E```*!0!6XP$`5A,B```:"""5Y2`@@N*(/@'C`R"$YP1@E>4" +M8<;CC#X!XP-@A.<(()7ED#X!XP,@A.<@<(7B>HV$XA0`B.('$*#A"""5Y?[_ +M_^L&`H3@7@V`XBP`@.('$*#A"""5Y?[__^M?/H;B"C"#X@,QA.`(()7E!""# +MY:@W`>,#8(3G!`"@X0@0B.+^___K`4"@XZH``.H$,)7E`@(3XQL```H!`%CC +M#```&M@!Q>$`(.#C_S\/XP`@`N`!,`/@"!"-XO@@8>%C#83B$`"`X@T0H.$( +M(*#C_O__ZPX``.K8`<7A`"#@X_\_#^,`(`+@`3`#X`@0C>+X(&'A8PV$X@@` +M@.(-$*#A"""@X_[__^M0``#J`0!8XTX``!H!`%?C!"#5!08[H`,#((0'!#"5 +MY0,`$^.!```*!FN$X@1@AN(#,`/B`P*&X``0H.,0(*#C_O__ZV%]A.($<(?B +M!`#5Y0,``.(``H?@`!"@XQ`@H./^___K8HV$X@2`B.($`-7E`P``X@`"B.`` +M$*#C$""@X_[__^L$,)7E`0(3XPL```H#,`/B`P*'X#`0A>(((*#C_O__ZP0` +MU>4#``#B``*(X#@0A>(((*#C_O__ZPH``.H#,`/B`P*'X#@0A>(((*#C_O__ +MZP0`U>4#``#B``*(X#`0A>(((*#C_O__ZP0`U>4#``#B``*&X"`0A>((()7E +M_O__ZP0PE>4#,`/B!#"%Y0$PH./X*@'C`C#$YP`0H./Z*@'C`A#$YP0`H.%> +M'83B(!"!X@0@E>7^___K`$!0X@%`H!,Z``#J5PV$XA``@.+@$(3B_O__ZP"` +M4.(!0*`#,P``"A&NB.(*`*#A`!"@XQ`@H./^___K()"%X@H`H.$)$*#A$""@ +MX_[__^L"`%;C%@``&@`@H./Y.@'C`R#$YP0PE>4!`A/C"```"O``B.(0$(GB +M"""@X_[__^L!#(CB&!")X@@@H./^___K!P``ZO``B.(8$(GB"""@X_[__^L! +M#(CB$!")X@@@H./^___K``!7XP4```H$`*#A"!"@X0`@H./^___K`$"@X00` +M`.H$`*#A"!"@X0$@H./^___K`$"@X0!`5.(!0*`3````Z@!`H.,$`*#A"-"- +MXO"'O>@"`%;CU/[_&L_^_^H00"WI7DV`XB!`A.((.P'C`Q"`YP,`4>,"(*"# +MH#AP0"WI*-!-X@!`4.(> +M```*=34#XP,PU.<``%/C&@``"FPPE.4B#1/C&0``&@PUU.4!`%/C%@``"O[_ +M_^L-,*#A?VW#XS]@QN,$,);E`3"#X@0PAN4$4(WB!0"@X0`0H.,D(*#C_O__ +MZP0`H.$%$*#A_O__ZP!`H.$$,);E`3!#X@0PAN7^___K`@``Z@!`H.,```#J +M`4"@XP0`H.$HT(WB<("]Z!!`+>D`0*#A_O__ZPT@H.%_/<+C/S##XP0@D^4! +M((+B!""#Y6PPE.4!`!/C!0``"@0`H.'^___K!`"@X?[__^L$`*#A_O__ZPT@ +MH.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L!`*#C$("]Z'!`+>D`0*#A`5"@ +MX3@QD.4!`%/A/@``"O[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^5L,)3E +M`0`3XP(``!HX(93E``!2XP0``!H$`*#A_O__ZVPPE.4!`!/C`0``&D``$^,$ +M```*!`"@X?[__^ML,)3E`0`3XP0``!HX,93E`0!3XP$```H``%/C`0``&@0` +MH.'^___K.#&4Y00`4^,#```:`##@X]@PA.4$`*#A_O__ZSA1A.5L,)3E>### +MXVPPA.4!`%7C"#"#`VPPA`4(```*(#"#,VPPA#4%```Z!`!5XP,``!H0,(/C +M;#"$Y00`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP$`H.-P +M@+WH<$`MZ0!`H.&$4)#E`3#@X]@P@.5L,)#E@#"#XVPP@.5X4(#E`3"@XW`P +MP.6$`(#B_O__ZP$`4.,-```:;#"4Y8`PP^-L,(3E##74Y0``4^,"```*<3#4 +MY0``4^,\```*!`"@X900A.+^___K`$"@X3@``.IL`(3B_O__ZP$`4.,+```: +M`#"@XW`PQ.4`,`#C`#!`XP`0D^5%#H3B"`"`XJ(?@>("$('B_O__ZP%`H.,H +M``#J;#"4Y2``$^,7```*0#"@XVPPA.6I;83B)5"&X@4`H.$`$*#C)""@X_[_ +M_^L%`*#AE!"$XB0@H./^___K!`"@X?[__^L=`(;B_O__ZP0`H.'^___K`0!0 +MXP!`H!,`,*`#<##$!0%`H`,-``#J@###XVPPA.4,-=3E``!3XP(```IQ,-3E +M``!3XP0```H$`*#AE!"$XO[__^L`0*#A````Z@%`H.,$`*#A<("]Z/!!+>D` +M4*#A`7"@X74U`^,#,-#G``!3XP!`H`-O```*;#"0Y8``$^,!0*`3:P``&@(+ +M$^-K```:$```ZFPPE>4""Q/C!0``"@8`H.'^___K`4!$X@$`=./W__\:`0`` +MZ@``5.,%``#*C`&?Y8P1G^7^___K;$"5Y=1#X.=0``#J_O__ZPT@H.%_/<+C +M/S##XP0@D^4!((+B!""#Y6PPE>5!`!/C,P``"I0@E>4`,)?E`P!2X2$``!J8 +M`(7B!!"'XO[__^L!`%#C'```&FPPE>4(`!/C%```&@4`H.'`$(7B_O__ZP`` +M4.,!0*`3-```&@4`H.'^___K;#"5Y0$`$^,!```*!0"@X?[__^L%`*#A_O__ +MZVPPE>5``!/C0###$R`P@Q-L,(45$@``Z@4`H.$!$*#C`2"@X?[__^L-``#J +M!0"@X?[__^ML,)7E`0`3XP$```H%`*#A_O__ZP4`H.'^___K;#"5Y4``$^-` +M,,,3(#"#$VPPA14F/*#C`S#5YP$`4^,-```*!P"@X?[__^L``%#C"0``"I0` +MA>('$*#A)""@X_[__^L`,*#CB#2%Y04`H.'^___K`$"@X0```.H`0*#C#2"@ +MX7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP0`H.'P@;WH9`"@X_[__^LP0*#C +M9&"@XX___^H``````````'!`+>D`0*#A`5"@X0`PT>4``%/C#P``&@$@T>4` +M`%+C#```&@(PT>4``%/C&@``&@,PT>4``%/C%P``&@0PT>4``%/C%```&@4P +MT>4``%/C$0``&D<``.K_`%/C#@``&@$PU>7_`%/C"P``&@(PU>7_`%/C"``` +M&@,PU>7_`%/C!0``&@0PU>7_`%/C`@``&@4PU>7_`%/C-@``"O[__^L-(*#A +M?SW"XS\PP^,$()/E`2""X@0@@^5L,)3E(@T3X]-#X!@` +M````L+"@@'P```"PL*B`Z````+"PK(!L`0``L+"J@!P"``"PK@&`;`<``+"P +MJ("H!P``L*H)@$P(``"PL*B`N`@``+"PJH#4"0``L+"J@#0+``"PL*R`.`T` +M`+"PJH!R='=?'0`+F1A=&$`+F)S +M@````,``'`````` +M`````*8/```K```````````````!`````````!$````#``````````````#1 +M#P``B@```````````````0`````````!`````@``````````````W!(``!`$ +M```/````&@````0````0````"0````,``````````````.P6```C`P`````` +M```````!```````````````````````````````!```````````````$`/'_ +M`````````````````P`!``````````````````,``P`````````````````# +M``0`$0`````````````````!``````````````````,`!0`````````````` +M```#``8`$0```'P````````````!`!$```#H`````````````0`1````;`$` +M``````````$`$0```!P"```````````!`!$```!L!P```````````0`1```` +MJ`<```````````$`$0```$P(```````````!`!$```"X"````````````0`1 +M````U`D```````````$`$0```#0+```````````!`!0````P#0`````````` +M`0`1````.`T```````````$``````````````````P`(`!<`````````%``` +M``$`"``````````````````#``D``````````````````P`+```````````` +M``````,`"@`````````````````#``P`)@````````!\````$@`!`#@````` +M`````````!````!/````?````&P````2``$`:0``````````````$````'4` +M`````````````!````"%````Z````(0````2``$`GP``````````````$``` +M`*L```!L`0``L````!(``0#"```````````````0````S@```!P"``!0!0`` +M$@`!`.4``````````````!````#W````;`<``#P````2``$`&@$````````` +M````$````"0!R +M='=?0!R='=? +M`P``!PL``",#```'"T``)0,```< +M+@``P`P``!P:``#8#```'"(``.@,```<,@``$`T``!PJ```@#0``'#L``#`- +M```"%@``-`T```(4``#4#0``'"@``!0.````X``!PB``"(#@``'#(``*@.```<*@```````"H"```````` +M`!L```@````J`@``$````"H"```8````*@(``"`````J`@``*````"H"```P +M````*@(``#@````J`@``0````"H"``!(````*@(``%`````J`@``6````"H" +"```` +` +end diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mlme.c b/drivers/net/wireless/rtl8192c/core/rtw_mlme.c new file mode 100755 index 000000000000..8a1fc90638d7 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mlme.c @@ -0,0 +1,3681 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_MLME_C_ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern void indicate_wx_scan_complete_event(_adapter *padapter); +extern u8 rtw_do_join(_adapter * padapter); + +sint _rtw_init_mlme_priv (_adapter* padapter) +{ + sint i; + u8 *pbuf; + extern char init_channel_plan;// wifi_power.c (add by gwl) + struct wlan_network *pnetwork; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + sint res = _SUCCESS; + +_func_enter_; + + _rtw_memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv)); + pmlmepriv->nic_hdl = (u8 *)padapter; + + pmlmepriv->pscanned = NULL; + pmlmepriv->fw_state = 0; + pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; + pmlmepriv->scan_mode=SCAN_ACTIVE;// 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) + pmlmepriv->ChannelPlan = init_channel_plan; //initialize channel plan parameter (add by gwl) + + _rtw_spinlock_init(&(pmlmepriv->lock)); + _rtw_init_queue(&(pmlmepriv->free_bss_pool)); + _rtw_init_queue(&(pmlmepriv->scanned_queue)); + + set_scanned_network_val(pmlmepriv, 0); + + _rtw_memset(&pmlmepriv->assoc_ssid,0,sizeof(NDIS_802_11_SSID)); + + pbuf = rtw_zvmalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); + + if (pbuf == NULL){ + res=_FAIL; + goto exit; + } + pmlmepriv->free_bss_buf = pbuf; + + pnetwork = (struct wlan_network *)pbuf; + + for(i = 0; i < MAX_BSS_CNT; i++) + { + _rtw_init_listhead(&(pnetwork->list)); + + rtw_list_insert_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue)); + + pnetwork++; + } + + //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + ATOMIC_SET(&pmlmepriv->set_scan_deny, 0); + #endif + + rtw_init_mlme_timer(padapter); + +exit: + +_func_exit_; + + return res; +} + +void rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv) +{ + _rtw_spinlock_free(&pmlmepriv->lock); + _rtw_spinlock_free(&(pmlmepriv->free_bss_pool.lock)); + _rtw_spinlock_free(&(pmlmepriv->scanned_queue.lock)); +} + +void _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) +{ +_func_enter_; + + if(pmlmepriv){ + rtw_mfree_mlme_priv_lock (pmlmepriv); + + if (pmlmepriv->free_bss_buf) { + rtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network)); + } + } +_func_exit_; +} + +sint _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) +{ + _irqL irqL; + +_func_enter_; + + if (pnetwork == NULL) + goto exit; + + _enter_critical_bh(&queue->lock, &irqL); + + rtw_list_insert_tail(&pnetwork->list, &queue->queue); + + _exit_critical_bh(&queue->lock, &irqL); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +struct wlan_network *_rtw_dequeue_network(_queue *queue) +{ + _irqL irqL; + + struct wlan_network *pnetwork; + +_func_enter_; + + _enter_critical_bh(&queue->lock, &irqL); + + if (_rtw_queue_empty(queue) == _TRUE) + + pnetwork = NULL; + + else + { + pnetwork = LIST_CONTAINOR(get_next(&queue->queue), struct wlan_network, list); + + rtw_list_delete(&(pnetwork->list)); + } + + _exit_critical_bh(&queue->lock, &irqL); + +_func_exit_; + + return pnetwork; +} + +struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) +{ + _irqL irqL; + struct wlan_network *pnetwork; + _queue *free_queue = &pmlmepriv->free_bss_pool; + _list* plist = NULL; + +_func_enter_; + + _enter_critical_bh(&free_queue->lock, &irqL); + + if (_rtw_queue_empty(free_queue) == _TRUE) { + pnetwork=NULL; + goto exit; + } + plist = get_next(&(free_queue->queue)); + + pnetwork = LIST_CONTAINOR(plist , struct wlan_network, list); + + rtw_list_delete(&pnetwork->list); + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("_rtw_alloc_network: ptr=%p\n", plist)); + pnetwork->network_type = 0; + pnetwork->fixed = _FALSE; + pnetwork->last_scanned = rtw_get_current_time(); + pnetwork->aid=0; + pnetwork->join_res=0; + + pmlmepriv->num_of_scanned ++; + +exit: + _exit_critical_bh(&free_queue->lock, &irqL); + +_func_exit_; + + return pnetwork; +} + +void _rtw_free_network(struct mlme_priv *pmlmepriv ,struct wlan_network *pnetwork, u8 isfreeall) +{ + u32 curr_time, delta_time; + u32 lifetime = SCANQUEUE_LIFETIME; + _irqL irqL; + _queue *free_queue = &(pmlmepriv->free_bss_pool); + +_func_enter_; + + if (pnetwork == NULL) + goto exit; + + if (pnetwork->fixed == _TRUE) + goto exit; + + curr_time = rtw_get_current_time(); + + if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) + lifetime = 1; + + if(!isfreeall) + { +#ifdef PLATFORM_WINDOWS + + delta_time = (curr_time -pnetwork->last_scanned)/10; + + if(delta_time < lifetime*1000000)// unit:usec + { + goto exit; + } + +#endif + +#ifdef PLATFORM_LINUX + + delta_time = (curr_time -pnetwork->last_scanned)/HZ; + + if(delta_time < lifetime)// unit:sec + { + goto exit; + } + +#endif + } + + _enter_critical_bh(&free_queue->lock, &irqL); + + rtw_list_delete(&(pnetwork->list)); + + rtw_list_insert_tail(&(pnetwork->list),&(free_queue->queue)); + + pmlmepriv->num_of_scanned --; + + + //DBG_871X("_rtw_free_network:SSID=%s\n", pnetwork->network.Ssid.Ssid); + + _exit_critical_bh(&free_queue->lock, &irqL); + +exit: + +_func_exit_; + +} + +void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork) +{ + + _queue *free_queue = &(pmlmepriv->free_bss_pool); + +_func_enter_; + + if (pnetwork == NULL) + goto exit; + + if (pnetwork->fixed == _TRUE) + goto exit; + + //_enter_critical(&free_queue->lock, &irqL); + + rtw_list_delete(&(pnetwork->list)); + + rtw_list_insert_tail(&(pnetwork->list), get_list_head(free_queue)); + + pmlmepriv->num_of_scanned --; + + //_exit_critical(&free_queue->lock, &irqL); + +exit: + +_func_exit_; + +} + + +/* + return the wlan_network with the matching addr + + Shall be calle under atomic context... to avoid possible racing condition... +*/ +struct wlan_network *_rtw_find_network(_queue *scanned_queue, u8 *addr) +{ + + _irqL irqL; + _list *phead, *plist; + struct wlan_network *pnetwork = NULL; + u8 zero_addr[ETH_ALEN] = {0,0,0,0,0,0}; + +_func_enter_; + + if(_rtw_memcmp(zero_addr, addr, ETH_ALEN)){ + pnetwork=NULL; + goto exit; + } + + _enter_critical_bh(&scanned_queue->lock, &irqL); + + phead = get_list_head(scanned_queue); + plist = get_next(phead); + + while (plist != phead) + { + pnetwork = LIST_CONTAINOR(plist, struct wlan_network ,list); + + if (_rtw_memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE) + break; + + plist = get_next(plist); + } + + if(plist == phead) + pnetwork = NULL; + + _exit_critical_bh(&scanned_queue->lock, &irqL); + +exit: + +_func_exit_; + + return pnetwork; + +} + + +void _rtw_free_network_queue(_adapter *padapter, u8 isfreeall) +{ + _irqL irqL; + _list *phead, *plist; + struct wlan_network *pnetwork; + struct mlme_priv* pmlmepriv = &padapter->mlmepriv; + _queue *scanned_queue = &pmlmepriv->scanned_queue; + _queue *free_queue = &pmlmepriv->free_bss_pool; + u8 *mybssid = get_bssid(pmlmepriv); + +_func_enter_; + + + _enter_critical_bh(&scanned_queue->lock, &irqL); + + phead = get_list_head(scanned_queue); + plist = get_next(phead); + + while (rtw_end_of_queue_search(phead, plist) == _FALSE) + { + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + plist = get_next(plist); + + _rtw_free_network(pmlmepriv,pnetwork, isfreeall); + + } + + _exit_critical_bh(&scanned_queue->lock, &irqL); + +_func_exit_; + +} + + + + +sint rtw_if_up(_adapter *padapter) { + + sint res; +_func_enter_; + + if( padapter->bDriverStopped || padapter->bSurpriseRemoved || + (check_fwstate(&padapter->mlmepriv, _FW_LINKED)== _FALSE)){ + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_if_up:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + res=_FALSE; + } + else + res= _TRUE; + +_func_exit_; + return res; +} + + +void rtw_generate_random_ibss(u8* pibss) +{ + u32 curtime = rtw_get_current_time(); + +_func_enter_; + pibss[0] = 0x02; //in ad-hoc mode bit1 must set to 1 + pibss[1] = 0x11; + pibss[2] = 0x87; + pibss[3] = (u8)(curtime & 0xff) ;//p[0]; + pibss[4] = (u8)((curtime>>8) & 0xff) ;//p[1]; + pibss[5] = (u8)((curtime>>16) & 0xff) ;//p[2]; +_func_exit_; + return; +} + +u8 *rtw_get_capability_from_ie(u8 *ie) +{ + return (ie + 8 + 2); +} + + +u16 rtw_get_capability(WLAN_BSSID_EX *bss) +{ + u16 val; +_func_enter_; + + _rtw_memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2); + +_func_exit_; + return le16_to_cpu(val); +} + +u8 *rtw_get_timestampe_from_ie(u8 *ie) +{ + return (ie + 0); +} + +u8 *rtw_get_beacon_interval_from_ie(u8 *ie) +{ + return (ie + 8); +} + + +int rtw_init_mlme_priv (_adapter *padapter)//(struct mlme_priv *pmlmepriv) +{ + int res; +_func_enter_; + res = _rtw_init_mlme_priv(padapter);// (pmlmepriv); +_func_exit_; + return res; +} + +void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_mlme_priv\n")); + _rtw_free_mlme_priv (pmlmepriv); +_func_exit_; +} + +int rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork) +{ + int res; +_func_enter_; + res = _rtw_enqueue_network(queue, pnetwork); +_func_exit_; + return res; +} + + + +static struct wlan_network *rtw_dequeue_network(_queue *queue) +{ + struct wlan_network *pnetwork; +_func_enter_; + pnetwork = _rtw_dequeue_network(queue); +_func_exit_; + return pnetwork; +} + + +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv )//(_queue *free_queue) +{ + struct wlan_network *pnetwork; +_func_enter_; + pnetwork = _rtw_alloc_network(pmlmepriv); +_func_exit_; + return pnetwork; +} + +void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 is_freeall)//(struct wlan_network *pnetwork, _queue *free_queue) +{ +_func_enter_; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); + _rtw_free_network(pmlmepriv, pnetwork, is_freeall); +_func_exit_; +} + + +void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork ) +{ +_func_enter_; + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid)); + _rtw_free_network_nolock(pmlmepriv, pnetwork); +_func_exit_; +} + + +void rtw_free_network_queue(_adapter* dev, u8 isfreeall) +{ +_func_enter_; + _rtw_free_network_queue(dev, isfreeall); +_func_exit_; +} + +/* + return the wlan_network with the matching addr + + Shall be calle under atomic context... to avoid possible racing condition... +*/ +struct wlan_network *rtw_find_network(_queue *scanned_queue, u8 *addr) +{ + struct wlan_network *pnetwork = _rtw_find_network(scanned_queue, addr); + + return pnetwork; +} + +int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork) +{ + int ret=_TRUE; + struct security_priv *psecuritypriv = &adapter->securitypriv; + + if ( (psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ ) && + ( pnetwork->network.Privacy == 0 ) ) + { + ret=_FALSE; + } + else if((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_ ) && + ( pnetwork->network.Privacy == 1 ) ) + { + ret=_FALSE; + } + else + { + ret=_TRUE; + } + + return ret; + +} + +inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b) +{ + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(%s,%d)(%s,%d)\n", + // a->Ssid.Ssid,a->Ssid.SsidLength,b->Ssid.Ssid,b->Ssid.SsidLength)); + return (a->Ssid.SsidLength == b->Ssid.SsidLength) + && _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE; +} + +static int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst) +{ + u16 s_cap, d_cap; + +_func_enter_; + +#ifdef PLATFORM_OS_XP + if ( ((uint)dst) <= 0x7fffffff || + ((uint)src) <= 0x7fffffff || + ((uint)&s_cap) <= 0x7fffffff || + ((uint)&d_cap) <= 0x7fffffff) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n@@@@ error address of dst\n")); + + KeBugCheckEx(0x87110000, (ULONG_PTR)dst, (ULONG_PTR)src,(ULONG_PTR)&s_cap, (ULONG_PTR)&d_cap); + + return _FALSE; + } +#endif + + + _rtw_memcpy((u8 *)&s_cap, rtw_get_capability_from_ie(src->IEs), 2); + _rtw_memcpy((u8 *)&d_cap, rtw_get_capability_from_ie(dst->IEs), 2); + + + s_cap = le16_to_cpu(s_cap); + d_cap = le16_to_cpu(d_cap); + +_func_exit_; + + return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) && + (src->Configuration.DSConfig == dst->Configuration.DSConfig) && + ( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) && + ( (_rtw_memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength)) == _TRUE) && + ((s_cap & WLAN_CAPABILITY_IBSS) == + (d_cap & WLAN_CAPABILITY_IBSS)) && + ((s_cap & WLAN_CAPABILITY_BSS) == + (d_cap & WLAN_CAPABILITY_BSS))); + +} + +struct wlan_network * rtw_get_oldest_wlan_network(_queue *scanned_queue) +{ + _list *plist, *phead; + + + struct wlan_network *pwlan = NULL; + struct wlan_network *oldest = NULL; +_func_enter_; + phead = get_list_head(scanned_queue); + + plist = get_next(phead); + + while(1) + { + + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pwlan= LIST_CONTAINOR(plist, struct wlan_network, list); + + if(pwlan->fixed!=_TRUE) + { + if (oldest == NULL ||time_after(oldest->last_scanned, pwlan->last_scanned)) + oldest = pwlan; + } + + plist = get_next(plist); + } +_func_exit_; + return oldest; + +} + +static void update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src,_adapter * padapter) +{ + u32 last_evm = 0, tmpVal; + +_func_enter_; + +#ifdef CONFIG_ANTENNA_DIVERSITY + padapter->HalFunc.SwAntDivCompareHandler(padapter, dst, src); +#endif + + + //Update signal strength first. Alwlays using the newest value will cause large vibration of scan result's signal strength + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) { + //Because we've process the rx phy info in rtl8192c_process_phy_info/rtl8192d_process_phy_info, + //we can just take the recvpriv's value + src->PhyInfo.SignalStrength = padapter->recvpriv.signal_strength; + src->PhyInfo.SignalQuality = padapter->recvpriv.signal_qual; + src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal_strength); + } + else { + src->PhyInfo.SignalStrength = (src->PhyInfo.SignalStrength+dst->PhyInfo.SignalStrength*4)/5; + src->PhyInfo.SignalQuality = (src->PhyInfo.SignalQuality+dst->PhyInfo.SignalQuality*4)/5; + src->Rssi=(src->Rssi+dst->Rssi*4)/5; + } + + + _rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src)); + + #if 0 + if(dst->Ssid.Ssid[0]=='j') { + DBG_871X("%s %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, rssi:%d\n", __FUNCTION__ + , dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, (int)dst->Rssi); + } + #endif + +#if 0 // old codes, may be useful one day... +// DBG_8192C("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi); + if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) + { + + //DBG_8192C("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal); + if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) + { + padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; + last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; + padapter->recvpriv.signal_qual_data.total_val -= last_evm; + } + padapter->recvpriv.signal_qual_data.total_val += query_rx_pwr_percentage(src->Rssi); + + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = query_rx_pwr_percentage(src->Rssi); + if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) + padapter->recvpriv.signal_qual_data.index = 0; + + //DBG_8192C("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, src->Rssi); + + // <1> Showed on UI for user,in percentage. + tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; + padapter->recvpriv.signal=(u8)tmpVal;//Link quality + + src->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal) ; + } + else{ +// DBG_8192C("ELSE:ssid=%s update_network: src->rssi=0x%d dst->rssi=%d\n",src->Ssid.Ssid,src->Rssi,dst->Rssi); + src->Rssi=(src->Rssi +dst->Rssi)/2;//dBM + } + +// DBG_8192C("a:update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Rssi,padapter->recvpriv.signal); + +#endif + +_func_exit_; +} + +static void update_current_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) +{ + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + +_func_enter_; + +#ifdef PLATFORM_OS_XP + if ((unsigned long)(&(pmlmepriv->cur_network.network)) < 0x7ffffff) + { + KeBugCheckEx(0x87111c1c, (ULONG_PTR)(&(pmlmepriv->cur_network.network)), 0, 0,0); + } +#endif + + if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork))) + { + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n"); + + //if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength) + { + update_network(&(pmlmepriv->cur_network.network), pnetwork,adapter); + rtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), + pmlmepriv->cur_network.network.IELength); + } + } + +_func_exit_; + +} + + +/* + +Caller must hold pmlmepriv->lock first. + + +*/ +void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target) +{ + _list *plist, *phead; + ULONG bssid_ex_sz; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + struct wlan_network *oldest = NULL; + +_func_enter_; + + phead = get_list_head(queue); + plist = get_next(phead); + + while(1) + { + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + if ((unsigned long)(pnetwork) < 0x7ffffff) + { +#ifdef PLATFORM_OS_XP + KeBugCheckEx(0x87111c1c, (ULONG_PTR)pnetwork, 0, 0,0); +#endif + } + + if (is_same_network(&(pnetwork->network), target)) + break; + + if ((oldest == ((struct wlan_network *)0)) || + time_after(oldest->last_scanned, pnetwork->last_scanned)) + oldest = pnetwork; + + plist = get_next(plist); + + } + + + /* If we didn't find a match, then get a new network slot to initialize + * with this beacon's information */ + if (rtw_end_of_queue_search(phead,plist)== _TRUE) { + + if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) { + /* If there are no more slots, expire the oldest */ + //list_del_init(&oldest->list); + pnetwork = oldest; + +#ifdef CONFIG_ANTENNA_DIVERSITY + //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); +#endif + _rtw_memcpy(&(pnetwork->network), target, get_WLAN_BSSID_EX_sz(target)); + pnetwork->last_scanned = rtw_get_current_time(); + //variable initialize + pnetwork->fixed = _FALSE; + pnetwork->last_scanned = rtw_get_current_time(); + + pnetwork->network_type = 0; + pnetwork->aid=0; + pnetwork->join_res=0; + } + else { + /* Otherwise just pull from the free list */ + + pnetwork = rtw_alloc_network(pmlmepriv); // will update scan_time + + if(pnetwork==NULL){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n\nsomething wrong here\n\n\n")); + goto exit; + } + + bssid_ex_sz = get_WLAN_BSSID_EX_sz(target); + target->Length = bssid_ex_sz; +#ifdef CONFIG_ANTENNA_DIVERSITY + //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna; + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); +#endif + _rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz ); + + rtw_list_insert_tail(&(pnetwork->list),&(queue->queue)); + + } + } + else { + /* we have an entry and we are going to update it. But this entry may + * be already expired. In this case we do the same as we found a new + * net and call the new_net handler + */ + + //target.Reserved[0]==1, means that scaned network is a bcn frame. + if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1)) + goto exit; + + update_network(&(pnetwork->network),target,adapter); + + pnetwork->last_scanned = rtw_get_current_time(); + + } + +exit: + +_func_exit_; + +} + + +void rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(((_adapter *)adapter)->mlmepriv); + _queue *queue = &(pmlmepriv->scanned_queue); + +_func_enter_; + + _enter_critical_bh(&queue->lock, &irqL); + + update_current_network(adapter, pnetwork); + + rtw_update_scanned_network(adapter, pnetwork); + + _exit_critical_bh(&queue->lock, &irqL); + +_func_exit_; +} + +//select the desired network based on the capability of the (i)bss. +// check items: (1) security +// (2) network_type +// (3) WMM +// (4) HT +// (5) others +int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork) +{ + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + u32 desired_encmode; + u32 privacy; + + //u8 wps_ie[512]; + uint wps_ielen; + + int bselected = _TRUE; + + desired_encmode = psecuritypriv->ndisencryptstatus; + privacy = pnetwork->network.Privacy; + + if(psecuritypriv->wps_phase == _TRUE) + { + if(rtw_get_wps_ie(pnetwork->network.IEs, pnetwork->network.IELength, NULL, &wps_ielen)!=NULL) + { + //rtw_disassoc_cmd(adapter); + //rtw_indicate_disconnect(adapter); + //rtw_free_assoc_resources(adapter); + return _TRUE; + } + else + { + return _FALSE; + } + } + if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do.... + { + if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0)) + bselected = _FALSE; + } + + + if ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) { + DBG_871X("desired_encmode: %d, privacy: %d\n", desired_encmode, privacy); + bselected = _FALSE; + } + + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) + { + if(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode) + bselected = _FALSE; + } + + + return bselected; +} + +/* TODO: Perry : For Power Management */ +void rtw_atimdone_event_callback(_adapter *adapter , u8 *pbuf) +{ + +_func_enter_; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("receive atimdone_evet\n")); +_func_exit_; + return; +} + + +void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL; + u32 len; + WLAN_BSSID_EX *pnetwork; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + +_func_enter_; + + pnetwork = (WLAN_BSSID_EX *)pbuf; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_survey_event_callback, ssid=%s\n", pnetwork->Ssid.Ssid)); + +#ifdef CONFIG_RTL8712 + //endian_convert + pnetwork->Length = le32_to_cpu(pnetwork->Length); + pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); + pnetwork->Privacy =le32_to_cpu( pnetwork->Privacy); + pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); + pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); + pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); + pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); + pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); + pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); + pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); + pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); + pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); + pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); + pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); + pnetwork->IELength = le32_to_cpu(pnetwork->IELength); +#endif + + len = get_WLAN_BSSID_EX_sz(pnetwork); + if(len > (sizeof(WLAN_BSSID_EX))) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n ****rtw_survey_event_callback: return a wrong bss ***\n")); + goto exit; + } + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + // update IBSS_network 's timestamp + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) + { + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"rtw_survey_event_callback : WIFI_ADHOC_MASTER_STATE \n\n"); + if(_rtw_memcmp(&(pmlmepriv->cur_network.network.MacAddress), pnetwork->MacAddress, ETH_ALEN)) + { + struct wlan_network* ibss_wlan = NULL; + + _rtw_memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8); + + ibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->MacAddress); + if(ibss_wlan) + { + _rtw_memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8); + goto exit; + } + } + } + + // lock pmlmepriv->lock when you accessing network_q + if ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _FALSE) + { + if( pnetwork->Ssid.Ssid[0] == 0 ) + { + pnetwork->Ssid.SsidLength = 0; + } + rtw_add_network(adapter, pnetwork); + } + +exit: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +_func_exit_; + + return; +} + + + +void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + +#ifdef CONFIG_MLME_EXT + + mlmeext_surveydone_event_callback(adapter); + +#endif + +_func_enter_; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_surveydone_event_callback: fw_state:%x\n\n", get_fwstate(pmlmepriv))); + + if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY)) + { + u8 timer_cancelled; + + _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); + + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + } + else { + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv))); + } + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + + if(pmlmepriv->to_join == _TRUE) + { + if((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) ) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)==_FALSE) + { + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); + + if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) + { + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT ); + } + else + { + WLAN_BSSID_EX *pdev_network = &(adapter->registrypriv.dev_network); + u8 *pibss = adapter->registrypriv.dev_network.MacAddress; + + //pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;//because don't set assoc_timer + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("switching to adhoc master\n")); + + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); + + rtw_update_registrypriv_dev_network(adapter); + rtw_generate_random_ibss(pibss); + + pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; + + if(rtw_createbss_cmd(adapter)!=_SUCCESS) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error=>rtw_createbss_cmd status FAIL\n")); + } + + pmlmepriv->to_join = _FALSE; + } + } + } + else + { + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); + pmlmepriv->to_join = _FALSE; + if(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS) + { + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + } + else + { + #ifdef CONFIG_LAYER2_ROAMING + DBG_871X("try_to_join, but select scanning queue fail, to_roaming:%d\n", pmlmepriv->to_roaming); + #else + DBG_871X("try_to_join, but select scanning queue fail\n"); + #endif + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming!=0) { + if( --pmlmepriv->to_roaming == 0 + || _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid) + ) { + pmlmepriv->to_roaming = 0; + rtw_free_assoc_resources(adapter); + rtw_indicate_disconnect(adapter); + } else { + pmlmepriv->to_join = _TRUE; + } + } + #endif + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + } + } + //else + { + /* + * 20110324 Commented by Jeff + * indicate the scan complete event when this scan isn't caused by join + */ + indicate_wx_scan_complete_event(adapter); + + //DBG_871X("scan complete in %dms\n",rtw_get_passing_time_ms(pmlmepriv->scan_start_time)); + + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0); +#endif //CONFIG_P2P + + rtw_os_xmit_schedule(adapter); + +#ifdef CONFIG_DRVEXT_MODULE_WSC + drvext_surveydone_callback(&adapter->drvextpriv); +#endif + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + if(pmlmeext->sitesurvey_res.bss_cnt == 0){ + if(adapter->HalFunc.silentreset) + adapter->HalFunc.silentreset(adapter); + } + } + #endif +_func_exit_; + +} + +void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf) +{ + +} + +void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf) +{ + +} + +static void free_scanqueue(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + _queue *free_queue = &pmlmepriv->free_bss_pool; + _queue *scan_queue = &pmlmepriv->scanned_queue; + _list *plist, *phead, *ptemp; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+free_scanqueue\n")); + + _enter_critical_bh(&free_queue->lock, &irqL); + + phead = get_list_head(scan_queue); + plist = get_next(phead); + + while (plist != phead) + { + ptemp = get_next(plist); + rtw_list_delete(plist); + rtw_list_insert_tail(plist, &free_queue->queue); + plist =ptemp; + pmlmepriv->num_of_scanned --; + } + + _exit_critical_bh(&free_queue->lock, &irqL); + +_func_exit_; +} + +/* +*rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock +*/ +void rtw_free_assoc_resources(_adapter *adapter ) +{ + _irqL irqL; + struct wlan_network* pwlan = NULL; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct mlme_ext_info *pmlmeinfo = &adapter->mlmeextpriv.mlmext_info; + struct sta_priv *pstapriv = &adapter->stapriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_free_assoc_resources\n")); + + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("tgt_network->network.MacAddress="MAC_FMT" ssid=%s\n", + MAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.Ssid)); + + if(check_fwstate( pmlmepriv, WIFI_STATION_STATE|WIFI_AP_STATE)) + { + struct sta_info* psta; + + psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + } + + if(check_fwstate( pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) + { + struct sta_info* psta; + + rtw_free_all_stainfo(adapter); + + psta = rtw_get_bcmc_stainfo(adapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + rtw_init_bcmc_stainfo(adapter); + } + + if(pwlan) + { + pwlan->fixed = _FALSE; + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_assoc_resources : pwlan== NULL \n\n")); + } + + + if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1)) + /*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/) + { + rtw_free_network_nolock(pmlmepriv, pwlan); + } + pmlmepriv->key_mask = 0; + +_func_exit_; + +} + +/* +*rtw_indicate_connect: the caller has to lock pmlmepriv->lock +*/ +void rtw_indicate_connect(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_connect\n")); + + pmlmepriv->to_join = _FALSE; +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ANTENNA_DIVERSITY_LINK, 0); +#endif + set_fwstate(pmlmepriv, _FW_LINKED); + + rtw_led_control(padapter, LED_CTL_LINK); + +#ifdef CONFIG_DRVEXT_MODULE + if(padapter->drvextpriv.enable_wpa) + { + indicate_l2_connect(padapter); + } + else +#endif + { + rtw_os_indicate_connect(padapter); + } + + #ifdef CONFIG_LAYER2_ROAMING + pmlmepriv->to_roaming=0; + #endif + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + rtw_set_scan_deny(pmlmepriv, 3000); + #endif + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("-rtw_indicate_connect: fw_state=0x%08x\n", get_fwstate(pmlmepriv))); + +_func_exit_; + +} + + +/* +*rtw_indicate_connect: the caller has to lock pmlmepriv->lock +*/ +void rtw_indicate_disconnect( _adapter *padapter ) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("+rtw_indicate_disconnect\n")); + + _clr_fwstate_(pmlmepriv, _FW_LINKED); + + rtw_led_control(padapter, LED_CTL_NO_LINK); + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming<=0) + #endif + rtw_os_indicate_disconnect(padapter); + +#ifdef CONFIG_LPS + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); +#endif + +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); +#endif //CONFIG_P2P + +_func_exit_; +} + +//Notes: +//pnetwork : returns from rtw_joinbss_event_callback +//ptarget_wlan: found from scanned_queue +//if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if "ptarget_sta" & "ptarget_wlan" exist. +//if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if "ptarget_wlan" exist. +//if join_res > 0, update "cur_network->network" from "pnetwork->network" if (ptarget_wlan !=NULL). +// + + +//#define REJOIN +#ifdef CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP +void joinbss_event_prehandle(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL,irqL2; + int res; + static u8 retry=0; + u8 timer_cancelled; + struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; + unsigned int the_same_macaddr = _FALSE; + +_func_enter_; + +#ifdef CONFIG_RTL8712 + //endian_convert + pnetwork->join_res = le32_to_cpu(pnetwork->join_res); + pnetwork->network_type = le32_to_cpu(pnetwork->network_type); + pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length); + pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength); + pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy); + pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi); + pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; + pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow); + pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod); + pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); + pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); + pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); + pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); + pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); + pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length); + pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode); + pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength ); +#endif + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res)); + + rtw_get_encrypt_decrypt_from_registrypriv(adapter); + + + if (pmlmepriv->assoc_ssid.SsidLength == 0) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n")); + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); + } + + the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); + + pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network); + if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n")); + goto ignore_joinbss_callback; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n")); + + if(pnetwork->join_res > 0) + { + retry = 0; + if (check_fwstate(pmlmepriv,_FW_UNDER_LINKING) ) + { + //s1. find ptarget_wlan + if(check_fwstate(pmlmepriv, _FW_LINKED) ) + { + if(the_same_macaddr == _TRUE) + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + } + else + { + pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + if(pcur_wlan) pcur_wlan->fixed = _FALSE; + + pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); + if(pcur_sta){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + rtw_free_stainfo(adapter, pcur_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + } + + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + + } + else + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + + if(ptarget_wlan == NULL) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + //s2. find ptarget_sta & update ptarget_sta + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + ptarget_sta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); + if(ptarget_sta==NULL) { + ptarget_sta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); + } + + if(ptarget_sta) //update ptarget_sta + { + ptarget_sta->aid = pnetwork->join_res; + ptarget_sta->qos_option = 1;//? + ptarget_sta->mac_id=0; + + if(adapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X) + { + adapter->securitypriv.binstallGrpkey=_FALSE; + adapter->securitypriv.busetkipkey=_FALSE; + adapter->securitypriv.bgrpkey_handshake=_FALSE; + + ptarget_sta->ieee8021x_blocked=_TRUE; + ptarget_sta->dot118021XPrivacy=adapter->securitypriv.dot11PrivacyAlgrthm; + + _rtw_memset((u8 *)&ptarget_sta->dot118021x_UncstKey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11tkiprxmickey, 0, sizeof (union Keytype)); + _rtw_memset((u8 *)&ptarget_sta->dot11tkiptxmickey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11txpn, 0, sizeof (union pn48)); + _rtw_memset((u8 *)&ptarget_sta->dot11rxpn, 0, sizeof (union pn48)); + } + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't allocate stainfo when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + } + + //s3. update cur_network & indicate connect + if(ptarget_wlan) + { + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:"MAC_FMT"\n" + ,get_fwstate(pmlmepriv), MAC_ARG(pnetwork->network.MacAddress))); + + + // why not use ptarget_wlan?? + _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); + cur_network->aid = pnetwork->join_res; + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + adapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; + adapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; + //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) + adapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + + //update fw_state //will clr _FW_UNDER_LINKING here indirectly + switch(pnetwork->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + pmlmepriv->fw_state = WIFI_STATION_STATE; + break; + case Ndis802_11IBSS: + pmlmepriv->fw_state = WIFI_ADHOC_STATE; + break; + default: + pmlmepriv->fw_state = WIFI_NULL_STATE; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n")); + break; + } + + rtw_update_protection(adapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), + (cur_network->network.IELength)); + +#ifdef CONFIG_80211N_HT + //TODO: update HT_Capability + rtw_update_ht_cap(adapter, cur_network->network.IEs, cur_network->network.IELength); +#endif + + //indicate connect + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + //Set Value to 0 for prevent xmit data frame without hw setting done. + ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 0); + rtw_indicate_connect(adapter); + } + else + { + //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); + } + + + } + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer \n")); + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); + + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv))); + goto ignore_joinbss_callback; + } + + } + else if(pnetwork->join_res == -4) + { + rtw_reset_securitypriv(adapter); + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + } + else //if join_res < 0 (join fails), then try again + { + #ifdef REJOIN + res = rtw_select_and_join_from_scanned_queue(pmlmepriv); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res)); + if (res != _SUCCESS || retry>2) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n")); + #endif + + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + #ifdef REJOIN + retry = 0; + + } + else + { + //extend time of assoc_timer + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + + retry++; + } + #endif + } + +ignore_joinbss_callback: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + _func_exit_; +} + +void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf) +{ + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + +_func_enter_; + + mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); + + //Set Value to 1 to xmit data frame. + ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 1); + rtw_os_xmit_schedule(adapter); + +_func_exit_; +} + +#else //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP +void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL,irqL2; + int res; + static u8 retry=0; + u8 timer_cancelled; + struct sta_info *ptarget_sta= NULL, *pcur_sta = NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct wlan_network *pnetwork = (struct wlan_network *)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wlan_network *pcur_wlan = NULL, *ptarget_wlan = NULL; + unsigned int the_same_macaddr = _FALSE; + +_func_enter_; + +#ifdef CONFIG_RTL8712 + //endian_convert + pnetwork->join_res = le32_to_cpu(pnetwork->join_res); + pnetwork->network_type = le32_to_cpu(pnetwork->network_type); + pnetwork->network.Length = le32_to_cpu(pnetwork->network.Length); + pnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength); + pnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy); + pnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi); + pnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ; + pnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow); + pnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod); + pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); + pnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); + pnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); + pnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); + pnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length); + pnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length); + pnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode); + pnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength ); +#endif + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("joinbss event call back received with res=%d\n", pnetwork->join_res)); + + rtw_get_encrypt_decrypt_from_registrypriv(adapter); + + + if (pmlmepriv->assoc_ssid.SsidLength == 0) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ joinbss event call back for Any SSid\n")); + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("@@@@@ rtw_joinbss_event_callback for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); + } + + the_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN); + + pnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network); + if(pnetwork->network.Length > sizeof(WLAN_BSSID_EX)) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n\n ***joinbss_evt_callback return a wrong bss ***\n\n")); + goto ignore_joinbss_callback; + } + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\n rtw_joinbss_event_callback !! _enter_critical \n")); + + if(pnetwork->join_res > 0) + { + retry = 0; + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) ) + { + //s1. find ptarget_wlan + if(check_fwstate(pmlmepriv, _FW_LINKED) ) + { + if(the_same_macaddr == _TRUE) + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + } + else + { + pcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + if(pcur_wlan) pcur_wlan->fixed = _FALSE; + + pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress); + if(pcur_sta){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + rtw_free_stainfo(adapter, pcur_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + } + + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + } + else + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){ + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + } + } + + if(ptarget_wlan == NULL) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't find ptarget_wlan when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + //s2. find ptarget_sta & update ptarget_sta + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + ptarget_sta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress); + if(ptarget_sta==NULL) + { + //DBG_8192C("==> %s #1, call rtw_alloc_stainfo\n",__FUNCTION__); + ptarget_sta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress); + } + + if(ptarget_sta) //update ptarget_sta + { + ptarget_sta->aid = pnetwork->join_res; + ptarget_sta->qos_option = 1;//? + ptarget_sta->mac_id=0; + + if(adapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X) + { + adapter->securitypriv.binstallGrpkey=_FALSE; + adapter->securitypriv.busetkipkey=_FALSE; + adapter->securitypriv.bgrpkey_handshake=_FALSE; + + ptarget_sta->ieee8021x_blocked=_TRUE; + ptarget_sta->dot118021XPrivacy=adapter->securitypriv.dot11PrivacyAlgrthm; + + _rtw_memset((u8 *)&ptarget_sta->dot118021x_UncstKey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11tkiprxmickey, 0, sizeof (union Keytype)); + _rtw_memset((u8 *)&ptarget_sta->dot11tkiptxmickey, 0, sizeof (union Keytype)); + + _rtw_memset((u8 *)&ptarget_sta->dot11txpn, 0, sizeof (union pn48)); + _rtw_memset((u8 *)&ptarget_sta->dot11rxpn, 0, sizeof (union pn48)); + } + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't allocate stainfo when joinbss_event callback\n")); + goto ignore_joinbss_callback; + } + + } + + //s3. update cur_network & indicate connect + if(ptarget_wlan) + { + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("\nfw_state:%x, BSSID:%x:%x:%x:%x:%x:%x\n",get_fwstate(pmlmepriv), + pnetwork->network.MacAddress[0], pnetwork->network.MacAddress[1], + pnetwork->network.MacAddress[2], pnetwork->network.MacAddress[3], + pnetwork->network.MacAddress[4], pnetwork->network.MacAddress[5])); + + + _rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length); + cur_network->aid = pnetwork->join_res; + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + adapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength; + adapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality; + //the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled) + adapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength); + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&adapter->recvpriv); + #endif + + //update fw_state //will clr _FW_UNDER_LINKING here indirectly + switch(pnetwork->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + pmlmepriv->fw_state = WIFI_STATION_STATE; + break; + case Ndis802_11IBSS: + pmlmepriv->fw_state = WIFI_ADHOC_STATE; + break; + default: + pmlmepriv->fw_state = WIFI_NULL_STATE; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Invalid network_mode\n")); + break; + } + + rtw_update_protection(adapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), + (cur_network->network.IELength)); + +#ifdef CONFIG_80211N_HT + //TODO: update HT_Capability + rtw_update_ht_cap(adapter, cur_network->network.IEs, cur_network->network.IELength); +#endif + + //indicate connect + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + rtw_indicate_connect(adapter); + } + else + { + //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); + } + + + } + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("Cancle assoc_timer \n")); + _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); + + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_joinbss_event_callback err: fw_state:%x", get_fwstate(pmlmepriv))); + goto ignore_joinbss_callback; + } + + } + else if(pnetwork->join_res == -4) + { + rtw_reset_securitypriv(adapter); + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + } + else //if join_res < 0 (join fails), then try again + { + #ifdef REJOIN + res = rtw_select_and_join_from_scanned_queue(pmlmepriv); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_select_and_join_from_scanned_queue again! res:%d\n",res)); + if (res != _SUCCESS || retry>2) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Set Assoc_Timer = 1; can't find match ssid in scanned_q \n")); + + #endif + _set_timer(&pmlmepriv->assoc_timer, 1); + + //rtw_free_assoc_resources(adapter); + + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + #ifdef REJOIN + retry = 0; + + } + else + { + //extend time of assoc_timer + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); + + retry++; + } + #endif + + } + +ignore_joinbss_callback: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + mlmeext_joinbss_event_callback(adapter, pnetwork->join_res); + +_func_exit_; + +} +#endif //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + +void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL; + struct sta_info *psta; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct stassoc_event *pstassoc = (struct stassoc_event*)pbuf; + struct wlan_network *cur_network = &(pmlmepriv->cur_network); + struct wlan_network *ptarget_wlan = NULL; + +_func_enter_; + + // to do: + if(rtw_access_ctrl(&adapter->acl_list, pstassoc->macaddr) == _FALSE) + return; + +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + { + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); + if(psta) + { + bss_cap_update(adapter, psta); + + sta_info_update(adapter, psta); + } + + goto exit; + } +#endif + + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); + if( psta != NULL) + { + //the sta have been in sta_info_queue => do nothing + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error: rtw_stassoc_event_callback: sta has been in sta_hash_queue \n")); + + goto exit; //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) + } + + psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr); + if (psta == NULL) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't alloc sta_info when rtw_stassoc_event_callback\n")); + goto exit; + } + + //to do : init sta_info variable + psta->qos_option = 0; + psta->mac_id = le32_to_cpu((uint)pstassoc->cam_id); + //psta->aid = (uint)pstassoc->cam_id; + + if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) + psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm; + + psta->ieee8021x_blocked = _FALSE; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) ) + { + if(adapter->stapriv.asoc_sta_count== 2) + { + ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); + if(ptarget_wlan) ptarget_wlan->fixed = _TRUE; + + // a sta + bc/mc_stainfo (not Ibss_stainfo) + rtw_indicate_connect(adapter); + } + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + + mlmeext_sta_add_event_callback(adapter, psta); + +#ifdef CONFIG_RTL8711 + //submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta + rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE); +#endif + +exit: + +_func_exit_; + +} + +void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf) +{ + _irqL irqL,irqL2; + struct sta_info *psta; + struct wlan_network* pwlan = NULL; + WLAN_BSSID_EX *pdev_network=NULL; + u8* pibss = NULL; + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + struct stadel_event *pstadel = (struct stadel_event*)pbuf; + struct sta_priv *pstapriv = &adapter->stapriv; + struct wlan_network *tgt_network = &(pmlmepriv->cur_network); + +_func_enter_; + + mlmeext_sta_del_event_callback(adapter); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) + return; + + _enter_critical_bh(&pmlmepriv->lock, &irqL2); + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) + { + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming > 0) + pmlmepriv->to_roaming--; // this stadel_event is caused by roaming, decrease to_roaming + else if(pmlmepriv->to_roaming ==0) + pmlmepriv->to_roaming= adapter->registrypriv.max_roaming_times; + + if(*((unsigned short *)(pstadel->rsvd)) !=65535 ) //if stadel_event isn't caused by no rx + pmlmepriv->to_roaming=0; // don't roam + #endif //CONFIG_LAYER2_ROAMING + + + rtw_free_assoc_resources(adapter); + rtw_indicate_disconnect(adapter); + + // remove the network entry in scanned_queue + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); + if (pwlan) { + pwlan->fixed = _FALSE; + rtw_free_network_nolock(pmlmepriv, pwlan); + } + + #ifdef CONFIG_LAYER2_ROAMING + _rtw_roaming(adapter, tgt_network); + #endif //CONFIG_LAYER2_ROAMING + + } + + if ( check_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE) || + check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) + { + psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + if(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo) + { + //rtw_indicate_disconnect(adapter);//removed@20091105 + + //free old ibss network + //pwlan = rtw_find_network(&pmlmepriv->scanned_queue, pstadel->macaddr); + pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress); + if(pwlan) + { + pwlan->fixed = _FALSE; + rtw_free_network_nolock(pmlmepriv, pwlan); + } + + //re-create ibss + pdev_network = &(adapter->registrypriv.dev_network); + pibss = adapter->registrypriv.dev_network.MacAddress; + + _rtw_memcpy(pdev_network, &tgt_network->network, get_WLAN_BSSID_EX_sz(&tgt_network->network)); + + _rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID)); + + rtw_update_registrypriv_dev_network(adapter); + + rtw_generate_random_ibss(pibss); + + if(check_fwstate(pmlmepriv,WIFI_ADHOC_STATE)) + { + set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE); + _clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE); + } + + if(rtw_createbss_cmd(adapter)!=_SUCCESS) + { + + RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>stadel_event_callback: rtw_createbss_cmd status FAIL*** \n ")); + + } + + + } + + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL2); + +_func_exit_; + +} + + +void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf) +{ + struct reportpwrstate_parm *preportpwrstate = (struct reportpwrstate_parm *)pbuf; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_cpwm_event_callback !!!\n")); +#ifdef CONFIG_PWRCTRL + preportpwrstate->state |= (u8)(adapter->pwrctrlpriv.cpwm_tog + 0x80); + cpwm_int_hdl(adapter, preportpwrstate); +#endif + +_func_exit_; + +} + +void _rtw_join_timeout_handler (_adapter *adapter) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + int do_join_r; + +#if 0 + if (adapter->bDriverStopped == _TRUE){ + _rtw_up_sema(&pmlmepriv->assoc_terminate); + return; + } +#endif + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n^^^rtw_join_timeout_handler ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_join_timeout_handler, fw_state=%x\n", get_fwstate(pmlmepriv))); + + if(adapter->bDriverStopped ||adapter->bSurpriseRemoved) + return; + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming>0) { // join timeout caused by roaming + while(1) { + pmlmepriv->to_roaming--; + if(pmlmepriv->to_roaming!=0) { //try another , + DBG_871X("%s try another roaming\n", __FUNCTION__); + if( _SUCCESS!=(do_join_r=rtw_do_join(adapter)) ) { + DBG_871X("%s roaming do_join return %d\n", __FUNCTION__ ,do_join_r); + continue; + } + break; + } else { + DBG_871X("%s We've try roaming but fail\n", __FUNCTION__); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + rtw_indicate_disconnect(adapter); + break; + } + } + + } else + #endif + { + if((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("clear _FW_UNDER_LINKING ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + } + + //Jeff: Even if not linked, we still need to reset securitypriv + //if((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) + { + rtw_os_indicate_disconnect(adapter); + _clr_fwstate_(pmlmepriv, _FW_LINKED); + } + + free_scanqueue(pmlmepriv);//??? + rtw_led_control(adapter, LED_CTL_NO_LINK); + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + +#ifdef CONFIG_DRVEXT_MODULE_WSC + drvext_assoc_fail_indicate(&adapter->drvextpriv); +#endif + +_func_exit_; + +} + +void rtw_scan_timeout_handler (_adapter *adapter) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("\n^^^rtw_scan_timeout_handler ^^^fw_state=%x\n", get_fwstate(pmlmepriv))); + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) ) + { + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("fw status =%x, rtw_scan_timeout_handler: survey done event comes too late!\n", get_fwstate(pmlmepriv))); + } + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + +} + +static void rtw_auto_scan_handler(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + + //auto site survey per 60sec + if(pmlmepriv->scan_interval >0) + { + pmlmepriv->scan_interval--; + if(pmlmepriv->scan_interval==0) + { + if( pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE ) + return; + +/* + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) + { + DBG_8192C("exit %s when _FW_UNDER_SURVEY|_FW_UNDER_LINKING -> \n", __FUNCTION__); + return; + } + + if(pmlmepriv->sitesurveyctrl.traffic_busy == _TRUE) + { + DBG_8192C("%s exit cause traffic_busy(%x)\n",__FUNCTION__, pmlmepriv->sitesurveyctrl.traffic_busy); + return; + } +*/ + + DBG_871X("%s\n", __FUNCTION__); + + rtw_set_802_11_bssid_list_scan(padapter); + + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + + } + + } + +} + +void rtw_dynamic_check_timer_handlder(_adapter *adapter) +{ +#ifdef CONFIG_AP_MODE + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; +#endif //CONFIG_AP_MODE + struct registry_priv *pregistrypriv = &adapter->registrypriv; + + if(adapter->hw_init_completed == _FALSE) + return; + + if ((adapter->bDriverStopped == _TRUE)||(adapter->bSurpriseRemoved== _TRUE)) + return; + + if(adapter->net_closed == _TRUE) + return; + + rtw_dynamic_chk_wk_cmd(adapter); + + if(pregistrypriv->wifi_spec==1) + { + //auto site survey + rtw_auto_scan_handler(adapter); + } + +#ifdef CONFIG_AP_MODE + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + expire_timeout_chk(adapter); + } +#endif + +} + + +#ifdef CONFIG_SET_SCAN_DENY_TIMER +void rtw_set_scan_deny_timer_hdl(_adapter *adapter) +{ + struct mlme_priv *mlmepriv = &adapter->mlmepriv; + + //allowed set scan + ATOMIC_SET(&mlmepriv->set_scan_deny, 0); +} + +void rtw_set_scan_deny(struct mlme_priv *mlmepriv, u32 ms) +{ + ATOMIC_SET(&mlmepriv->set_scan_deny, 1); + _set_timer(&mlmepriv->set_scan_deny_timer, ms); +} +#endif + + +/* +* Select a new join candidate from the original @param candidate and @param competitor +* @return _TRUE: candidate is updated +* @return _FALSE: candidate is not updated +*/ +static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv + , struct wlan_network **candidate, struct wlan_network *competitor) +{ + int updated = _FALSE; + _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv); + + if(pmlmepriv->assoc_by_bssid==_TRUE) { // associate with bssid + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) + && _rtw_memcmp(competitor->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE + ) { + *candidate = competitor; + updated = _TRUE; + } + } else if (pmlmepriv->assoc_ssid.SsidLength == 0 ) { // associate with ssid, but ssidlength is 0 + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) ) { + *candidate = competitor; + updated = _TRUE; + } + } else +#ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming) { // roaming + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) + && is_same_ess(&competitor->network, &pmlmepriv->cur_network.network) + //&&(!is_same_network(&competitor->network, &pmlmepriv->cur_network.network)) + && rtw_get_passing_time_ms((u32)competitor->last_scanned) < 5000 + && rtw_is_desired_network(adapter, competitor) + ) { + *candidate = competitor; + updated = _TRUE; + } + + } else +#endif + { // associate with ssid + if( (*candidate == NULL ||(*candidate)->network.Rssinetwork.Rssi ) + && (competitor->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength) + &&((_rtw_memcmp(competitor->network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE) + && rtw_is_desired_network(adapter, competitor) + ) { + *candidate = competitor; + updated = _TRUE; + } + } + + if(updated){ + DBG_871X("new candidate: %s("MAC_FMT") rssi:%d\n", + (*candidate)->network.Ssid.Ssid, + MAC_ARG((*candidate)->network.MacAddress), + (int)(*candidate)->network.Rssi + ); + } + + return updated; +} + + +/* +Calling context: +The caller of the sub-routine will be in critical section... + +The caller must hold the following spinlock + +pmlmepriv->lock + + +*/ +#if 1 +int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv ) +{ + int ret; + _list *phead; + _adapter *adapter; + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + struct wlan_network *candidate = NULL; + u8 bSupportAntDiv = _FALSE; +_func_enter_; + + phead = get_list_head(queue); + adapter = (_adapter *)pmlmepriv->nic_hdl; + + pmlmepriv->pscanned = get_next( phead ); + + while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { + + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); + if(pnetwork==NULL){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("%s return _FAIL:(pnetwork==NULL)\n", __FUNCTION__)); + ret = _FAIL; + goto exit; + } + + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); + + #if 0 + DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid); + #endif + + rtw_check_join_candidate(pmlmepriv, &candidate, pnetwork); + + } + + if(candidate == NULL) { + DBG_871X("%s: return _FAIL(candidate == NULL)\n", __FUNCTION__); + ret = _FAIL; + goto exit; + } else { + DBG_871X("%s: candidate: %s("MAC_FMT")\n", __FUNCTION__, + candidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress));; + } + + + // check for situation of _FW_LINKED + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + DBG_871X("%s: _FW_LINKED while ask_for_joinbss!!!\n", __FUNCTION__); + + if(is_same_network(&pmlmepriv->cur_network.network, &candidate->network)) + { + DBG_871X("%s: _FW_LINKED and is same network, it needn't join again\n", __FUNCTION__); + + rtw_indicate_connect(adapter);//rtw_indicate_connect again + + ret = 2; + goto exit; + } + else + { + rtw_disassoc_cmd(adapter); + rtw_indicate_disconnect(adapter); + rtw_free_assoc_resources(adapter); + } + } + + #ifdef CONFIG_ANTENNA_DIVERSITY + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); + if(_TRUE == bSupportAntDiv) + { + u8 CurrentAntenna; + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); + DBG_8192C("#### Opt_Ant_(%s) , cur_Ant(%s)\n", + (2==candidate->network.PhyInfo.Optimum_antenna)?"A":"B", + (2==CurrentAntenna)?"A":"B" + ); + } + #endif + + ret = rtw_joinbss_cmd(adapter, candidate); + +exit: +_func_exit_; + + return ret; + +} +#else +int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv ) +{ + _list *phead; + u8 CurrentAntenna; + unsigned char *dst_ssid, *src_ssid; + _adapter *adapter; + _queue *queue = &(pmlmepriv->scanned_queue); + struct wlan_network *pnetwork = NULL; + struct wlan_network *pnetwork_max_rssi = NULL; + #ifdef CONFIG_LAYER2_ROAMING + struct wlan_network * roaming_candidate=NULL; + u32 cur_time=rtw_get_current_time(); + #endif + +_func_enter_; + + phead = get_list_head(queue); + adapter = (_adapter *)pmlmepriv->nic_hdl; + + pmlmepriv->pscanned = get_next( phead ); + + while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { + + pnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list); + if(pnetwork==NULL){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("(2)rtw_select_and_join_from_scanned_queue return _FAIL:(pnetwork==NULL)\n")); + return _FAIL; + } + + dst_ssid = pnetwork->network.Ssid.Ssid; + src_ssid = pmlmepriv->assoc_ssid.Ssid; + + pmlmepriv->pscanned = get_next(pmlmepriv->pscanned); + + #if 0 + DBG_871X("MacAddress:"MAC_FMT" ssid:%s\n", MAC_ARG(pnetwork->network.MacAddress), pnetwork->network.Ssid.Ssid); + #endif + + if(pmlmepriv->assoc_by_bssid==_TRUE) + { + if(_rtw_memcmp(pnetwork->network.MacAddress, pmlmepriv->assoc_bssid, ETH_ALEN)==_TRUE) + { + //remove the condition @ 20081125 + //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)|| + // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode) + // goto ask_for_joinbss; + + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + { + //DBG_871X("select_and_join(1): _FW_LINKED and is same network, it needn't join again\n"); + + rtw_indicate_connect(adapter);//rtw_indicate_connect again + + return 2; + } + else + { + rtw_disassoc_cmd(adapter); + rtw_indicate_disconnect(adapter); + rtw_free_assoc_resources(adapter); + + goto ask_for_joinbss; + + } + } + else + { + goto ask_for_joinbss; + } + + } + + } else if (pmlmepriv->assoc_ssid.SsidLength == 0) { + goto ask_for_joinbss;//anyway, join first selected(dequeued) pnetwork if ssid_len=0 + + #ifdef CONFIG_LAYER2_ROAMING + } else if(pmlmepriv->to_roaming>0) { + + if( (roaming_candidate == NULL ||roaming_candidate->network.Rssinetwork.Rssi ) + && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network) + //&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network)) + && rtw_get_time_interval_ms((u32)pnetwork->last_scanned,cur_time) < 5000 + ) { + roaming_candidate = pnetwork; + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_, + DBG_871X + ("roaming_candidate???: %s("MAC_FMT")\n", + roaming_candidate->network.Ssid.Ssid, MAC_ARG(roaming_candidate->network.MacAddress) ) + //) + ; + } + continue; + #endif + + } else if ( (pnetwork->network.Ssid.SsidLength==pmlmepriv->assoc_ssid.SsidLength) + &&((_rtw_memcmp(dst_ssid, src_ssid, pmlmepriv->assoc_ssid.SsidLength)) == _TRUE) + ) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("dst_ssid=%s, src_ssid=%s \n", dst_ssid, src_ssid)); +#ifdef CONFIG_ANTENNA_DIVERSITY + adapter->HalFunc.GetHalDefVarHandler(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); + DBG_8192C("#### dst_ssid=(%s) Opt_Ant_(%s) , cur_Ant(%s)\n", dst_ssid, + (2==pnetwork->network.PhyInfo.Optimum_antenna)?"A":"B", + (2==CurrentAntenna)?"A":"B"); +#endif + //remove the condition @ 20081125 + //if((pmlmepriv->cur_network.network.InfrastructureMode==Ndis802_11AutoUnknown)|| + // pmlmepriv->cur_network.network.InfrastructureMode == pnetwork->network.InfrastructureMode) + //{ + // _rtw_memcpy(pmlmepriv->assoc_bssid, pnetwork->network.MacAddress, ETH_ALEN); + // goto ask_for_joinbss; + //} + + if(pmlmepriv->assoc_by_rssi==_TRUE)//if the ssid is the same, select the bss which has the max rssi + { + if( NULL==pnetwork_max_rssi|| pnetwork->network.Rssi > pnetwork_max_rssi->network.Rssi) + pnetwork_max_rssi = pnetwork; + } + else if(rtw_is_desired_network(adapter, pnetwork) == _TRUE) + { + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { +#if 0 + if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) + { + DBG_871X("select_and_join(2): _FW_LINKED and is same network, it needn't join again\n"); + + rtw_indicate_connect(adapter);//rtw_indicate_connect again + + return 2; + } + else +#endif + { + rtw_disassoc_cmd(adapter); + //rtw_indicate_disconnect(adapter);// + rtw_free_assoc_resources(adapter); + + goto ask_for_joinbss; + } + } + else + { + goto ask_for_joinbss; + } + + } + + + } + + } + + #ifdef CONFIG_LAYER2_ROAMING + if(pmlmepriv->to_roaming>0 && roaming_candidate ){ + pnetwork=roaming_candidate; + DBG_871X("select_and_join_from_scanned_queue: roaming_candidate: %s("MAC_FMT")\n", + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress)); + goto ask_for_joinbss; + } + #endif + + if((pmlmepriv->assoc_by_rssi==_TRUE) && (pnetwork_max_rssi!=NULL)) + { + pnetwork = pnetwork_max_rssi; + DBG_871X("select_and_join_from_scanned_queue: pnetwork_max_rssi: %s("MAC_FMT")\n", + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress)); + goto ask_for_joinbss; + } + + DBG_871X("(1)rtw_select_and_join_from_scanned_queue return _FAIL\n"); + +_func_exit_; + + return _FAIL; + +ask_for_joinbss: + +_func_exit_; + + return rtw_joinbss_cmd(adapter, pnetwork); + +} +#endif + + +sint rtw_set_auth(_adapter * adapter,struct security_priv *psecuritypriv) +{ + struct cmd_obj* pcmd; + struct setauth_parm *psetauthparm; + struct cmd_priv *pcmdpriv=&(adapter->cmdpriv); + sint res=_SUCCESS; + +_func_enter_; + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; //try again + goto exit; + } + + psetauthparm=(struct setauth_parm*)rtw_zmalloc(sizeof(struct setauth_parm)); + if(psetauthparm==NULL){ + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memset(psetauthparm, 0, sizeof(struct setauth_parm)); + psetauthparm->mode=(unsigned char)psecuritypriv->dot11AuthAlgrthm; + + pcmd->cmdcode = _SetAuth_CMD_; + pcmd->parmbuf = (unsigned char *)psetauthparm; + pcmd->cmdsz = (sizeof(struct setauth_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + + _rtw_init_listhead(&pcmd->list); + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("after enqueue set_auth_cmd, auth_mode=%x\n", psecuritypriv->dot11AuthAlgrthm)); + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: + +_func_exit_; + + return res; + +} + + +sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx) +{ + u8 keylen; + struct cmd_obj *pcmd; + struct setkey_parm *psetkeyparm; + struct cmd_priv *pcmdpriv = &(adapter->cmdpriv); + struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); + sint res=_SUCCESS; + +_func_enter_; + + pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(pcmd==NULL){ + res= _FAIL; //try again + goto exit; + } + psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm)); + if(psetkeyparm==NULL){ + rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); + + if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){ + psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy=%d \n", psetkeyparm->algorithm)); + } + else{ + psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm; + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm=%d \n", psetkeyparm->algorithm)); + + } + psetkeyparm->keyid = (u8)keyid;//0~3 + psetkeyparm->set_tx = set_tx; + pmlmepriv->key_mask |= BIT(psetkeyparm->keyid); +#ifdef CONFIG_AUTOSUSPEND + if( _TRUE == adapter->pwrctrlpriv.bInternalAutoSuspend) + { + adapter->pwrctrlpriv.wepkeymask = pmlmepriv->key_mask; + DBG_8192C("....AutoSuspend pwrctrlpriv.wepkeymask(%x)\n",adapter->pwrctrlpriv.wepkeymask); + } +#endif + DBG_8192C("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid,pmlmepriv->key_mask); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid)); + + switch(psetkeyparm->algorithm){ + + case _WEP40_: + keylen=5; + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); + break; + case _WEP104_: + keylen=13; + _rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen); + break; + case _TKIP_: + keylen=16; + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); + psetkeyparm->grpkey=1; + break; + case _AES_: + keylen=16; + _rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen); + psetkeyparm->grpkey=1; + break; + default: + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm)); + res= _FAIL; + goto exit; + } + + + pcmd->cmdcode = _SetKey_CMD_; + pcmd->parmbuf = (u8 *)psetkeyparm; + pcmd->cmdsz = (sizeof(struct setkey_parm)); + pcmd->rsp = NULL; + pcmd->rspsz = 0; + + + _rtw_init_listhead(&pcmd->list); + + //_rtw_init_sema(&(pcmd->cmd_sem), 0); + + res = rtw_enqueue_cmd(pcmdpriv, pcmd); + +exit: +_func_exit_; + return res; + +} + + +//adjust IEs for rtw_joinbss_cmd in WMM +int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len) +{ + unsigned int ielength=0; + unsigned int i, j; + + i = 12; //after the fixed IE + while(i=0 :if there is pre-auth key, and return the entry id +// +// + +static int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid) +{ + struct security_priv *psecuritypriv=&Adapter->securitypriv; + int i=0; + + do + { + if( ( psecuritypriv->PMKIDList[i].bUsed ) && + ( _rtw_memcmp( psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN ) == _TRUE ) ) + { + break; + } + else + { + i++; + //continue; + } + + }while(imlmepriv; + struct security_priv *psecuritypriv=&adapter->securitypriv; + uint ndisauthmode=psecuritypriv->ndisauthtype; + uint ndissecuritytype = psecuritypriv->ndisencryptstatus; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, + ("+rtw_restruct_sec_ie: ndisauthmode=%d ndissecuritytype=%d\n", + ndisauthmode, ndissecuritytype)); + + authmode = 0xFF;//init + + if((ndisauthmode==Ndis802_11AuthModeWPA)||(ndisauthmode==Ndis802_11AuthModeWPAPSK)) + { + authmode=_WPA_IE_ID_; + uncst_oui[0]=0x0; + uncst_oui[1]=0x50; + uncst_oui[2]=0xf2; + } + if((ndisauthmode==Ndis802_11AuthModeWPA2)||(ndisauthmode==Ndis802_11AuthModeWPA2PSK)) + { + authmode=_WPA2_IE_ID_; + uncst_oui[0]=0x0; + uncst_oui[1]=0x0f; + uncst_oui[2]=0xac; + } + + switch(ndissecuritytype) + { + case Ndis802_11Encryption1Enabled: + case Ndis802_11Encryption1KeyAbsent: + securitytype=_WEP40_; + uncst_oui[3]=0x1; + break; + case Ndis802_11Encryption2Enabled: + case Ndis802_11Encryption2KeyAbsent: + securitytype=_TKIP_; + uncst_oui[3]=0x2; + break; + case Ndis802_11Encryption3Enabled: + case Ndis802_11Encryption3KeyAbsent: + securitytype=_AES_; + uncst_oui[3]=0x4; + break; + default: + securitytype=_NO_PRIVACY_; + break; + } + + //Search required WPA or WPA2 IE and copy to sec_ie[ ] + cnt=12; + match=_FALSE; + while(cntdot118021XGrpPrivacy=_NO_PRIVACY_; + break; + case 0x1: //WEP_40 + psecuritypriv->dot118021XGrpPrivacy=_WEP40_; + break; + case 0x2: //TKIP + psecuritypriv->dot118021XGrpPrivacy=_TKIP_; + break; + case 0x3: //AESCCMP + case 0x4: + psecuritypriv->dot118021XGrpPrivacy=_AES_; + break; + case 0x5: //WEP_104 + psecuritypriv->dot118021XGrpPrivacy=_WEP104_; + break; + } + + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Multicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", + sec_ie[8],sec_ie[9],sec_ie[10],sec_ie[11])); + match =_FALSE; + break; + } + + if(sec_ie[12]==0x01) + { + //check the unicast encryption type + if(_rtw_memcmp(&sec_ie[14], &uncst_oui[0], 4) !=_TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Unicast error (%.2x %.2x %.2x %.2x != 00 50 F2 %.2x )! \n", + sec_ie[14],sec_ie[15],sec_ie[16],sec_ie[17],uncst_oui[3])); + match =_FALSE; + + break; + + } //else the uncst_oui is match + } + else//mixed mode, unicast_enc_type > 1 + { + //select the uncst_oui and remove the other uncst_oui + cnt=sec_ie[12]; + remove_cnt=(cnt-1)*4; + sec_ie[12]=0x01; + _rtw_memcpy(&sec_ie[14], &uncst_oui[0], 4); + + //remove the other unicast suit + _rtw_memcpy(&sec_ie[18], &sec_ie[18+remove_cnt],(sec_ie[1]-18+2-remove_cnt)); + sec_ie[1]=sec_ie[1]-remove_cnt; + } + + break; + } + } + + if(authmode==_WPA2_IE_ID_) + { + // parsing RSN IE to select required encryption algorithm, and set the bc/mc encryption algorithm + while(_TRUE) + { + if((sec_ie[2]!=0x01)||(sec_ie[3]!= 0x0)) + { + //IE Ver error + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n RSN IE :IE version error (%.2x %.2x != 01 00 )! \n",sec_ie[2],sec_ie[3])); + match=_FALSE; + break; + } + + if(_rtw_memcmp(&sec_ie[4], &uncst_oui[0], 3) ==_TRUE) + { + //get bc/mc encryption type + switch(sec_ie[7]) + { + case 0x1: //WEP_40 + psecuritypriv->dot118021XGrpPrivacy=_WEP40_; + break; + case 0x2: //TKIP + psecuritypriv->dot118021XGrpPrivacy=_TKIP_; + break; + case 0x4: //AESWRAP + psecuritypriv->dot118021XGrpPrivacy=_AES_; + break; + case 0x5: //WEP_104 + psecuritypriv->dot118021XGrpPrivacy=_WEP104_; + break; + default: //none + psecuritypriv->dot118021XGrpPrivacy=_NO_PRIVACY_; + break; + } + } + else + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n RSN IE :Multicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", + sec_ie[4],sec_ie[5],sec_ie[6],sec_ie[7])); + match=_FALSE; + break; + } + + if(sec_ie[8]==0x01) + { + //check the unicast encryption type + if(_rtw_memcmp(&sec_ie[10], &uncst_oui[0],4) !=_TRUE) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n SSN IE :Unicast error (%.2x %.2x %.2x %.2x != 00 50 F2 xx )! \n", + sec_ie[10],sec_ie[11],sec_ie[12],sec_ie[13])); + + match =_FALSE; + break; + + } //else the uncst_oui is match + } + else //mixed mode, unicast_enc_type > 1 + { + //select the uncst_oui and remove the other uncst_oui + cnt=sec_ie[8]; + remove_cnt=(cnt-1)*4; + sec_ie[8]=0x01; + _rtw_memcpy( &sec_ie[10] , &uncst_oui[0],4 ); + + //remove the other unicast suit + _rtw_memcpy(&sec_ie[14],&sec_ie[14+remove_cnt],(sec_ie[1]-14+2-remove_cnt)); + sec_ie[1]=sec_ie[1]-remove_cnt; + } + + break; + } + } + + } + + //copy fixed ie only + _rtw_memcpy(out_ie, in_ie,12); + ielength=12; + + if(psecuritypriv->wps_phase == _TRUE) + { + //DBG_871X("wps_phase == _TRUE\n"); + + _rtw_memcpy(out_ie+ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len); + + ielength += psecuritypriv->wps_ie_len; + psecuritypriv->wps_phase = _FALSE; + + } + else if((authmode==_WPA_IE_ID_)||(authmode==_WPA2_IE_ID_)) + { + //copy RSN or SSN + if(match ==_TRUE) + { + _rtw_memcpy(&out_ie[ielength], &sec_ie[0], sec_ie[1]+2); + ielength+=sec_ie[1]+2; + + if(authmode==_WPA2_IE_ID_) + { + //the Pre-Authentication bit should be zero, john + out_ie[ielength-1]= 0; + out_ie[ielength-2]= 0; + } + + rtw_report_sec_ie(adapter, authmode, sec_ie); + +#ifdef CONFIG_DRVEXT_MODULE + drvext_report_sec_ie(&adapter->drvextpriv, authmode, sec_ie); +#endif + + } + + } + else + { + + } + + iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid); + if(iEntry<0) + { + return ielength; + } + else + { + if(authmode == _WPA2_IE_ID_) + { + out_ie[ielength]=1; + ielength++; + out_ie[ielength]=0; //PMKID count = 0x0100 + ielength++; + _rtw_memcpy( &out_ie[ielength], &psecuritypriv->PMKIDList[iEntry].PMKID, 16); + + ielength+=16; + out_ie[13]+=18;//PMKID length = 2+16 + } + } + + //report_sec_ie(adapter, authmode, sec_ie); + +_func_exit_; + + return ielength; +} + +void rtw_init_registrypriv_dev_network( _adapter* adapter) +{ + struct registry_priv* pregistrypriv = &adapter->registrypriv; + struct eeprom_priv* peepriv = &adapter->eeprompriv; + WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; + u8 *myhwaddr = myid(peepriv); + +_func_enter_; + + _rtw_memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN); + + _rtw_memcpy(&pdev_network->Ssid, &pregistrypriv->ssid, sizeof(NDIS_802_11_SSID)); + + pdev_network->Configuration.Length=sizeof(NDIS_802_11_CONFIGURATION); + pdev_network->Configuration.BeaconPeriod = 100; + pdev_network->Configuration.FHConfig.Length = 0; + pdev_network->Configuration.FHConfig.HopPattern = 0; + pdev_network->Configuration.FHConfig.HopSet = 0; + pdev_network->Configuration.FHConfig.DwellTime = 0; + + +_func_exit_; + +} + +void rtw_update_registrypriv_dev_network(_adapter* adapter) +{ + int sz=0; + struct registry_priv* pregistrypriv = &adapter->registrypriv; + WLAN_BSSID_EX *pdev_network = &pregistrypriv->dev_network; + struct security_priv* psecuritypriv = &adapter->securitypriv; + struct wlan_network *cur_network = &adapter->mlmepriv.cur_network; + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + +_func_enter_; + +#if 0 + pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; + pxmitpriv->vcs = pregistrypriv->vcs_type; + pxmitpriv->vcs_type = pregistrypriv->vcs_type; + //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; + pxmitpriv->frag_len = pregistrypriv->frag_thresh; + + adapter->qospriv.qos_option = pregistrypriv->wmm_enable; +#endif + + pdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; // adhoc no 802.1x + + pdev_network->Rssi = 0; + + switch(pregistrypriv->wireless_mode) + { + case WIRELESS_11B: + pdev_network->NetworkTypeInUse = (Ndis802_11DS); + break; + case WIRELESS_11G: + case WIRELESS_11BG: + case WIRELESS_11_24N: + case WIRELESS_11G_24N: + case WIRELESS_11BG_24N: + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); + break; + case WIRELESS_11A: + case WIRELESS_11A_5N: + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); + break; + case WIRELESS_11ABGN: + if(pregistrypriv->channel > 14) + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM5); + else + pdev_network->NetworkTypeInUse = (Ndis802_11OFDM24); + break; + default : + // TODO + break; + } + + pdev_network->Configuration.DSConfig = (pregistrypriv->channel); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("pregistrypriv->channel=%d, pdev_network->Configuration.DSConfig=0x%x\n", pregistrypriv->channel, pdev_network->Configuration.DSConfig)); + + if(cur_network->network.InfrastructureMode == Ndis802_11IBSS) + pdev_network->Configuration.ATIMWindow = (0); + + pdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode); + + // 1. Supported rates + // 2. IE + + //rtw_set_supported_rate(pdev_network->SupportedRates, pregistrypriv->wireless_mode) ; // will be called in rtw_generate_ie + sz = rtw_generate_ie(pregistrypriv); + + pdev_network->IELength = sz; + + pdev_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pdev_network); + + //notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd(); + //pdev_network->IELength = cpu_to_le32(sz); + +_func_exit_; + +} + +void rtw_get_encrypt_decrypt_from_registrypriv(_adapter* adapter) +{ + u16 wpaconfig=0; + struct registry_priv* pregistrypriv = &adapter->registrypriv; + struct security_priv* psecuritypriv= &adapter->securitypriv; +_func_enter_; + + +_func_exit_; + +} + +//the fucntion is at passive_level +void rtw_joinbss_reset(_adapter *padapter) +{ + u8 threshold; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +#ifdef CONFIG_80211N_HT + struct ht_priv *phtpriv = &pmlmepriv->htpriv; +#endif + + //todo: if you want to do something io/reg/hw setting before join_bss, please add code here + + + + +#ifdef CONFIG_80211N_HT + + pmlmepriv->num_FortyMHzIntolerant = 0; + + pmlmepriv->num_sta_no_ht = 0; + + phtpriv->ampdu_enable = _FALSE;//reset to disabled + +#ifdef CONFIG_USB_HCI + // TH=1 => means that invalidate usb rx aggregation + // TH=0 => means that validate usb rx aggregation, use init value. + if(phtpriv->ht_option) + { + if(padapter->registrypriv.wifi_spec==1) + threshold = 1; + else + threshold = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } + else + { + threshold = 1; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); + } +#endif + +#endif + +} + + +#ifdef CONFIG_80211N_HT + +//the fucntion is >= passive_level +unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len) +{ + u32 ielen, out_len; + unsigned char *p, *pframe; + struct ieee80211_ht_cap ht_capie; + unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + + phtpriv->ht_option = _FALSE; + + p = rtw_get_ie(in_ie+12, _HT_CAPABILITY_IE_, &ielen, in_len-12); + + if(p && ielen>0) + { + if(pqospriv->qos_option == 0) + { + out_len = *pout_len; + pframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_, + _WMM_IE_Length_, WMM_IE, pout_len); + + pqospriv->qos_option = 1; + } + + out_len = *pout_len; + + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC | + IEEE80211_HT_CAP_DSSSCCK40; + + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) { + DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__); + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03); + + if(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ) + ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2)); + else + ht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); + + + pframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len); + + + //_rtw_memcpy(out_ie+out_len, p, ielen+2);//gtest + //*pout_len = *pout_len + (ielen+2); + + + phtpriv->ht_option = _TRUE; + + p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12); + if(p && (ielen==sizeof(struct ieee80211_ht_addt_info))) + { + out_len = *pout_len; + pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len); + } + + } + + return (phtpriv->ht_option); + +} + +//the fucntion is > passive_level (in critical_section) +void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len) +{ + u8 *p, max_ampdu_sz; + int i, len; + struct sta_info *bmc_sta, *psta; + struct ieee80211_ht_cap *pht_capie; + struct ieee80211_ht_addt_info *pht_addtinfo; + struct recv_reorder_ctrl *preorder_ctrl; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct wlan_network *pcur_network = &(pmlmepriv->cur_network); + + + if(!phtpriv->ht_option) + return; + + + //DBG_8192C("+rtw_update_ht_cap()\n"); + + //maybe needs check if ap supports rx ampdu. + if((phtpriv->ampdu_enable==_FALSE) &&(pregistrypriv->ampdu_enable==1)) + { + if(pregistrypriv->wifi_spec==1) + { + phtpriv->ampdu_enable = _FALSE; + } + else + { + phtpriv->ampdu_enable = _TRUE; + } + } + else if(pregistrypriv->ampdu_enable==2) + { + phtpriv->ampdu_enable = _TRUE; + } + + + //check Max Rx A-MPDU Size + len = 0; + p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); + if(p && len>0) + { + pht_capie = (struct ieee80211_ht_cap *)(p+2); + max_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_CAP_AMPDU_FACTOR); + max_ampdu_sz = 1 << (max_ampdu_sz+3); // max_ampdu_sz (kbytes); + + //DBG_8192C("rtw_update_ht_cap(): max_ampdu_sz=%d\n", max_ampdu_sz); + phtpriv->rx_ampdu_maxlen = max_ampdu_sz; + + } + + //for A-MPDU Rx reordering buffer control for bmc_sta & sta_info + //if A-MPDU Rx is enabled, reseting rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff + //todo: check if AP can send A-MPDU packets + bmc_sta = rtw_get_bcmc_stainfo(padapter); + if(bmc_sta) + { + for(i=0; i < 16 ; i++) + { + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + preorder_ctrl = &bmc_sta->recvreorder_ctrl[i]; + preorder_ctrl->enable = _FALSE; + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + preorder_ctrl->wend_b= 0xffff; + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 + } + } + + psta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress); + if(psta) + { + for(i=0; i < 16 ; i++) + { + //preorder_ctrl = &precvpriv->recvreorder_ctrl[i]; + preorder_ctrl = &psta->recvreorder_ctrl[i]; + preorder_ctrl->enable = _FALSE; + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + preorder_ctrl->wend_b= 0xffff; + preorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32 + } + } + + len=0; + p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_ADD_INFO_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); + if(p && len>0) + { + pht_addtinfo = (struct ieee80211_ht_addt_info *)(p+2); + } + +} + +void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + u8 issued; + int priority; + struct sta_info *psta=NULL; + struct ht_priv *phtpriv; + struct pkt_attrib *pattrib =&pxmitframe->attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + s32 bmcst = IS_MCAST(pattrib->ra); + + if(bmcst || (padapter->mlmepriv.LinkDetectInfo.bTxBusyTraffic == _FALSE)) + return; + + priority = pattrib->priority; + + if (pattrib->psta) + psta = pattrib->psta; + else + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + + if(psta==NULL) + return; + + phtpriv = &psta->htpriv; + + if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) + { + issued = (phtpriv->agg_enable_bitmap>>priority)&0x1; + issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1; + + if(0==issued) + { + DBG_871X("rtw_issue_addbareq_cmd, p=%d\n", priority); + psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); + rtw_addbareq_cmd(padapter,(u8) priority, pattrib->ra); + } + } + +} + +#endif + +#ifdef CONFIG_LAYER2_ROAMING +void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _rtw_roaming(padapter, tgt_network); + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} +void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + int do_join_r; + + struct wlan_network *pnetwork; + + if(tgt_network != NULL) + pnetwork = tgt_network; + else + pnetwork = &pmlmepriv->cur_network; + + if(0 < pmlmepriv->to_roaming) { + DBG_871X("roaming from %s("MAC_FMT"), length:%d\n", + pnetwork->network.Ssid.Ssid, MAC_ARG(pnetwork->network.MacAddress), + pnetwork->network.Ssid.SsidLength); + _rtw_memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid, sizeof(NDIS_802_11_SSID)); + + pmlmepriv->assoc_by_bssid = _FALSE; + + while(1) { + if( _SUCCESS==(do_join_r=rtw_do_join(padapter)) ) { + break; + } else { + DBG_871X("roaming do_join return %d\n", do_join_r); + pmlmepriv->to_roaming--; + + if(0< pmlmepriv->to_roaming) { + continue; + } else { + DBG_871X("%s(%d) -to roaming fail, indicate_disconnect\n", __FUNCTION__,__LINE__); + rtw_indicate_disconnect(padapter); + break; + } + } + } + } + +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c b/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c new file mode 100755 index 000000000000..11d9aac6c302 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mlme_ext.c @@ -0,0 +1,11006 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * +******************************************************************************/ +#define _RTW_MLME_EXT_C_ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct mlme_handler mlme_sta_tbl[]={ + {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, + {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, + {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, + {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, + {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, + {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, + + /*---------------------------------------------------------- + below 2 are reserved + -----------------------------------------------------------*/ + {0, "DoReserved", &DoReserved}, + {0, "DoReserved", &DoReserved}, + {WIFI_BEACON, "OnBeacon", &OnBeacon}, + {WIFI_ATIM, "OnATIM", &OnAtim}, + {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, + {WIFI_AUTH, "OnAuth", &OnAuthClient}, + {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, + {WIFI_ACTION, "OnAction", &OnAction}, +}; + +#ifdef _CONFIG_NATIVEAP_MLME_ +struct mlme_handler mlme_ap_tbl[]={ + {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, + {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, + {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, + {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, + {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, + {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, + + /*---------------------------------------------------------- + below 2 are reserved + -----------------------------------------------------------*/ + {0, "DoReserved", &DoReserved}, + {0, "DoReserved", &DoReserved}, + {WIFI_BEACON, "OnBeacon", &OnBeacon}, + {WIFI_ATIM, "OnATIM", &OnAtim}, + {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, + {WIFI_AUTH, "OnAuth", &OnAuth}, + {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, + {WIFI_ACTION, "OnAction", &OnAction}, +}; +#endif + +struct action_handler OnAction_tbl[]={ + {WLAN_CATEGORY_SPECTRUM_MGMT, "ACTION_SPECTRUM_MGMT", &DoReserved}, + {WLAN_CATEGORY_QOS, "ACTION_QOS", &OnAction_qos}, + {WLAN_CATEGORY_DLS, "ACTION_DLS", &OnAction_dls}, + {WLAN_CATEGORY_BACK, "ACTION_BACK", &OnAction_back}, + {WLAN_CATEGORY_PUBLIC, "ACTION_PUBLIC", &OnAction_public}, + {WLAN_CATEGORY_RADIO_MEASUREMENT, "ACTION_RADIO_MEASUREMENT", &DoReserved}, + {WLAN_CATEGORY_FT, "ACTION_FT", &DoReserved}, + {WLAN_CATEGORY_HT, "ACTION_HT", &OnAction_ht}, + {WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved}, + {WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm}, + {WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, +}; + + +/************************************************** +OUI definitions for the vendor specific IE +***************************************************/ +unsigned char WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01}; +unsigned char WMM_OUI[] = {0x00, 0x50, 0xf2, 0x02}; +unsigned char WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04}; + +unsigned char WMM_INFO_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; +unsigned char WMM_PARA_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + +unsigned char WPA_TKIP_CIPHER[4] = {0x00, 0x50, 0xf2, 0x02}; +unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02}; + +extern unsigned char REALTEK_96B_IE[]; + +/******************************************************** +MCS rate definitions +*********************************************************/ + +unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; +unsigned char MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + +/******************************************************** +ChannelPlan definitions +*********************************************************/ +static RT_CHANNEL_PLAN DefaultChannelPlan[RT_CHANNEL_DOMAIN_MAX] = { + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,132,136,140,149,153,157,161,165},32}, // 0x00, RT_CHANNEL_DOMAIN_FCC + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},31}, // 0x01, RT_CHANNEL_DOMAIN_IC + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x02, RT_CHANNEL_DOMAIN_ETSI + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x03, RT_CHANNEL_DOMAIN_SPAIN + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x04, RT_CHANNEL_DOMAIN_FRANCE + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x05, RT_CHANNEL_DOMAIN_MKK + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x06, RT_CHANNEL_DOMAIN_MKK1 + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x07, RT_CHANNEL_DOMAIN_ISRAEL + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22}, // 0x08, RT_CHANNEL_DOMAIN_TELEC +#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x09, RT_CHANNEL_DOMAIN_MIC + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x0A, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x0B, RT_CHANNEL_DOMAIN_WORLD_WIDE_13 + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, // 0x0C, RT_CHANNEL_DOMAIN_TELEC_NETGEAR + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, // 0x0D, RT_CHANNEL_DOMAIN_NCC +#endif /* Not using EEPROM_CHANNEL_PLAN directly */ + {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, // 0x09, RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN + {{1,2,3,4,5,6,7,8,9,10,11,12,13},13}, // 0x0A, RT_CHANNEL_DOMAIN_WORLD_WIDE_13 + {{1,2,3,4,5,6,7,8,9,10,11,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165},26}, // 0x0B, RT_CHANNEL_DOMAIN_NCC + {{1,2,3,4,5,6,7,8,9,10,11,149,153,157,161,165},16}, // 0x0C, RT_CHANNEL_DOMAIN_CHINA + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24}, // 0x0D, RT_CHANNEL_DOMAIN__SINGAPORE_INDIA_MEXICO + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165},31}, // 0x0E, RT_CHANNEL_DOMAIN_KOREA + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, // 0x0F, RT_CHANNEL_DOMAIN_TURKEY + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140},32}, // 0x10, RT_CHANNEL_DOMAIN_JAPAN + {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,149,153,157,161,165},20}, // 0x11, RT_CHANNEL_DOMAIN_FCC_NO_DFS + {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48},17}, // 0x12, RT_CHANNEL_DOMAIN_JAPAN_NO_DFS + }; + +/**************************************************************************** + +Following are the initialization functions for WiFi MLME + +*****************************************************************************/ + +extern void joinbss_event_prehandle(_adapter *adapter, u8 *pbuf); + +int init_hw_mlme_ext(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + //set_opmode_cmd(padapter, infra_client_with_mlme);//removed + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + return _SUCCESS; +} + +static void init_mlme_ext_priv_value(_adapter* padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + +#ifdef CONFIG_TDLS + u8 i; +#endif + + //unsigned char default_channel_set[MAX_CHANNEL_NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; + unsigned char mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff}; + unsigned char mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, 0xff,}; + + ATOMIC_SET(&pmlmeext->event_seq, 0); + pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode + + pmlmeext->cur_channel = padapter->registrypriv.channel; + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmlmeext->retry = 0; + + pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode; + + //_rtw_memcpy(pmlmeext->channel_set, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Channel, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Len); + //_rtw_memcpy(pmlmeext->channel_set, default_channel_set, MAX_CHANNEL_NUM); + _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates); + _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates); + + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + pmlmeext->sitesurvey_res.channel_idx = 0; + pmlmeext->sitesurvey_res.bss_cnt = 0; + +#ifdef CONFIG_TDLS + _init_workitem(&pmlmeext->TDLS_restore_workitem, TDLS_restore_workitem_callback, pmlmeext); +#endif + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + pmlmeinfo->reauth_count = 0; + pmlmeinfo->reassoc_count = 0; + pmlmeinfo->link_count = 0; + pmlmeinfo->auth_seq = 0; + pmlmeinfo->auth_algo = dot11AuthAlgrthm_Open; + pmlmeinfo->key_index = 0; + pmlmeinfo->iv = 0; + +#ifdef CONFIG_TDLS + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + pmlmeinfo->tdls_sta_cnt=0; + pmlmeinfo->tdls_dis_req=0; + pmlmeinfo->tdls_cam_entry_to_write=6; + pmlmeinfo->tdls_cam_entry_to_clear=0; + pmlmeinfo->tdls_ch_sensing=0; + pmlmeinfo->tdls_cur_channel=0; + pmlmeinfo->tdls_candidate_ch=1; //when inplement channel switching, default candidate channel is 1 + for(i=0; i<14; i++) + pmlmeinfo->tdls_collect_pkt_num[i]=0; +#endif + + pmlmeinfo->enc_algo = _NO_PRIVACY_; + pmlmeinfo->authModeToggle = 0; + + _rtw_memset(pmlmeinfo->chg_txt, 0, 128); + + pmlmeinfo->slotTime = SHORT_SLOT_TIME; + pmlmeinfo->preamble_mode = PREAMBLE_AUTO; + + pmlmeinfo->dialogToken = 0; +} + +static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set) +{ + u8 index,chanset_size = 0; + u8 b5GBand = _FALSE, b2_4GBand = _FALSE; + + _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*MAX_CHANNEL_NUM); + + if(ChannelPlan >= RT_CHANNEL_DOMAIN_MAX) + { + DBG_8192C("channel plan id error \n"); + return chanset_size; + } + + if(padapter->registrypriv.wireless_mode & WIRELESS_11G) + { + b2_4GBand = _TRUE; + } + + if(padapter->registrypriv.wireless_mode & WIRELESS_11A) + { + b5GBand = _TRUE; + } + + for(index=0;index= 1 && channel_set[chanset_size].ChannelNum <= 11) + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + else if((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) + channel_set[chanset_size].ScanType = SCAN_PASSIVE; + } + else if(RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == ChannelPlan)// channel 12~13, passive scan + { + if(channel_set[chanset_size].ChannelNum <= 11) + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + else + channel_set[chanset_size].ScanType = SCAN_PASSIVE; + } + else + { + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + } + + chanset_size++; + } + else if((DefaultChannelPlan[ChannelPlan].Channel[index] >= 36) && (b5GBand)) + { +#ifdef DFS + channel_set[chanset_size].ChannelNum = DefaultChannelPlan[ChannelPlan].Channel[index]; + if ( channel_set[chanset_size].ChannelNum <= 48 + || channel_set[chanset_size].ChannelNum >= 149 ) + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + else + channel_set[chanset_size].ScanType = SCAN_PASSIVE; + chanset_size++; +#else /* DFS */ + if ( DefaultChannelPlan[ChannelPlan].Channel[index] <= 48 + || DefaultChannelPlan[ChannelPlan].Channel[index] >= 149 ) { + channel_set[chanset_size].ChannelNum = DefaultChannelPlan[ChannelPlan].Channel[index]; + channel_set[chanset_size].ScanType = SCAN_ACTIVE; + DBG_8192C("%s(): channel_set[%d].ChannelNum = %d\n", __FUNCTION__, chanset_size, channel_set[chanset_size].ChannelNum); + chanset_size++; + } +#endif /* DFS */ + } + } + + return chanset_size; +} + +int init_mlme_ext_priv(_adapter* padapter) +{ + int res = _SUCCESS; + struct registry_priv* pregistrypriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + _rtw_memset((u8 *)pmlmeext, 0, sizeof(struct mlme_ext_priv)); + pmlmeext->padapter = padapter; + + //fill_fwpriv(padapter, &(pmlmeext->fwpriv)); + + init_mlme_ext_priv_value(padapter); + pmlmeinfo->bAcceptAddbaReq = pregistrypriv->bAcceptAddbaReq; + + init_mlme_ext_timer(padapter); + +#ifdef CONFIG_AP_MODE + init_mlme_ap_info(padapter); +#endif + + pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set); + + pmlmeext->chan_scan_time = SURVEY_TO; + pmlmeext->mlmeext_init = _TRUE; + + return res; + +} + +void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext) +{ + _adapter *padapter = pmlmeext->padapter; + + if (!padapter) + return; + + if (padapter->bDriverStopped == _TRUE) + { + _cancel_timer_ex(&pmlmeext->survey_timer); + _cancel_timer_ex(&pmlmeext->link_timer); + //_cancel_timer_ex(&pmlmeext->ADDBA_timer); + } +} + +static void UpdateBrateTbl( + IN PADAPTER Adapter, + IN u8 *mBratesOS +) +{ + u8 i; + u8 rate; + + // 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory. + for(i=0;iu.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + if(ptable->func) + { + //receive the frames that ra(a1) is my address or ra(a1) is bc address. + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) + { + return; + } + + ptable->func(padapter, precv_frame); + } + +} + +void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame) +{ + int index; + struct mlme_handler *ptable; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, + ("+mgt_dispatcher: type(0x%x) subtype(0x%x)\n", + GetFrameType(pframe), GetFrameSubType(pframe))); + +#if 0 + { + u8 *pbuf; + pbuf = GetAddr1Ptr(pframe); + DBG_8192C("A1-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + pbuf = GetAddr2Ptr(pframe); + DBG_8192C("A2-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + pbuf = GetAddr3Ptr(pframe); + DBG_8192C("A3-%x:%x:%x:%x:%x:%x\n", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5)); + } +#endif + + if (GetFrameType(pframe) != WIFI_MGT_TYPE) + { + RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("mgt_dispatcher: type(0x%x) error!\n", GetFrameType(pframe))); + return; + } + + //receive the frames that ra(a1) is my address or ra(a1) is bc address. + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && + !_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) + { + return; + } + + ptable = mlme_sta_tbl; + + index = GetFrameSubType(pframe) >> 4; + +#ifdef CONFIG_TDLS + if((index << 4)==WIFI_ACTION){ + //category==public (4), action==TDLS_DISCOVERY_RESPONSE + if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){ + DBG_8192C("recv tdls discovery response frame\n"); + On_TDLS_Dis_Rsp(padapter, precv_frame); + } + } +#endif + + if (index > 13) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Currently we do not support reserved sub-fr-type=%d\n", index)); + return; + } + ptable += index; + +#if 0//gtest + sa = get_sa(pframe); + psta = search_assoc_sta(sa, padapter); + // only check last cache seq number for management frame + if (psta != NULL) { + if (GetRetry(pframe)) { + if (GetTupleCache(pframe) == psta->rxcache->nonqos_seq){ + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n")); + return; + } + } + psta->rxcache->nonqos_seq = GetTupleCache(pframe); + } +#else + + if(GetRetry(pframe)) + { + //RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("drop due to decache!\n")); + //return; + } +#endif + +#ifdef CONFIG_AP_MODE + switch (GetFrameSubType(pframe)) + { + case WIFI_AUTH: + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + ptable->func = &OnAuth; + else + ptable->func = &OnAuthClient; + //pass through + case WIFI_ASSOCREQ: + case WIFI_REASSOCREQ: + _mgt_dispatcher(padapter, ptable, precv_frame); +#ifdef CONFIG_HOSTAPD_MLME + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + rtw_hostapd_mlme_rx(padapter, precv_frame); +#endif + break; + case WIFI_PROBEREQ: + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#ifdef CONFIG_HOSTAPD_MLME + rtw_hostapd_mlme_rx(padapter, precv_frame); +#else + _mgt_dispatcher(padapter, ptable, precv_frame); +#endif + } + else + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + case WIFI_BEACON: + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + case WIFI_ACTION: + //if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + _mgt_dispatcher(padapter, ptable, precv_frame); + break; + default: + _mgt_dispatcher(padapter, ptable, precv_frame); + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + rtw_hostapd_mlme_rx(padapter, precv_frame); + break; + } +#else + + _mgt_dispatcher(padapter, ptable, precv_frame); + +#endif + +} + +#ifdef CONFIG_P2P +u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da) +{ + issue_probersp_p2p( padapter, da); + return _SUCCESS; +} +#endif //CONFIG_P2P + + +/**************************************************************************** + +Following are the callback functions for each subtype of the management frames + +*****************************************************************************/ + +unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned int ielen; + unsigned char *p; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur = &(pmlmeinfo->network); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + u8 is_valid_p2p_probereq = _FALSE; + +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + + if ( ( pwdinfo->p2p_state != P2P_STATE_NONE ) && + ( pwdinfo->p2p_state != P2P_STATE_IDLE ) && + ( pwdinfo->role != P2P_ROLE_CLIENT ) && + ( pwdinfo->p2p_state != P2P_STATE_FIND_PHASE_SEARCH ) && + (pwdinfo->p2p_state != P2P_STATE_SCAN ) + ) + { + // Commented by Albert 2011/03/17 + // mcs_rate = 0 -> CCK 1M rate + // mcs_rate = 1 -> CCK 2M rate + // mcs_rate = 2 -> CCK 5.5M rate + // mcs_rate = 3 -> CCK 11M rate + // In the P2P mode, the driver should not support the CCK rate + if ( pattrib->mcs_rate > 3 ) + { + if((is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len)) == _TRUE) + { + if(pwdinfo->role == P2P_ROLE_DEVICE) + { + p2p_listen_state_process( padapter, get_sa(pframe)); + + return _SUCCESS; + } + + if(pwdinfo->role == P2P_ROLE_GO) + { + goto _continue; + } + } + } + } +#endif //CONFIG_P2P + +_continue: + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)) + { + return _SUCCESS; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE && + check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)==_FALSE) + { + return _SUCCESS; + } + + + //DBG_871X("+OnProbeReq\n"); + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen, + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + + + //check (wildcard) SSID + if (p != NULL) + { + if(is_valid_p2p_probereq == _TRUE) + { + goto _issue_probersp; + } + + if ((ielen != 0) && (!_rtw_memcmp((void *)(p+2), (void *)cur->Ssid.Ssid, le32_to_cpu(cur->Ssid.SsidLength)))) + { + return _SUCCESS; + } + +_issue_probersp: + + issue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq); + + } + + return _SUCCESS; + +} + +unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct sta_info *psta; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &padapter->wdinfo; +#endif + + +#ifdef CONFIG_P2P + if (P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) + { + if ( _TRUE == pwdinfo->tx_prov_disc_info.benable ) + { + if( _rtw_memcmp( pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) + { + if ( P2P_ROLE_CLIENT == pwdinfo->role ) + { + pwdinfo->tx_prov_disc_info.benable = _FALSE; + issue_p2p_provision_request( padapter, + pwdinfo->tx_prov_disc_info.peerIFAddr, + pwdinfo->tx_prov_disc_info.ssid.Ssid, + pwdinfo->tx_prov_disc_info.ssid.SsidLength, + pwdinfo->tx_prov_disc_info.peerDevAddr ); + } + else if ( ( P2P_ROLE_DEVICE == pwdinfo->role ) || ( P2P_ROLE_GO == pwdinfo->role ) ) + { + pwdinfo->tx_prov_disc_info.benable = _FALSE; + issue_p2p_provision_request( padapter, + pwdinfo->tx_prov_disc_info.peerIFAddr, + NULL, + 0, + pwdinfo->tx_prov_disc_info.peerDevAddr ); + } + } + } + return _SUCCESS; + } + else if ( P2P_STATE_GONEGO_ING == pwdinfo->p2p_state ) + { + if ( _TRUE == pwdinfo->nego_req_info.benable ) + { + printk( "[%s] P2P State is GONEGO ING!\n", __FUNCTION__ ); + if( _rtw_memcmp( pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN ) ) + { + pwdinfo->nego_req_info.benable = _FALSE; + issue_p2p_GO_request( padapter, pwdinfo->nego_req_info.peerDevAddr); + } + } + } +#endif + + + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + report_survey_event(padapter, precv_frame); + return _SUCCESS; + } + + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) + { + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + { + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) + { + psta->sta_stats.rx_pkts++; + } + } + } + + return _SUCCESS; + +} + +unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) +{ + int cam_idx; + struct sta_info *psta; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + report_survey_event(padapter, precv_frame); + + return _SUCCESS; + } + + if (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) + { + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) + { + //check the vendor of the assoc AP + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe+sizeof(struct ieee80211_hdr_3addr), len-sizeof(struct ieee80211_hdr_3addr)); + + //update TSF Value + update_TSF(pmlmeext, pframe, len); + + //start auth + start_clnt_auth(padapter); + + return _SUCCESS; + } + + if(((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) + { + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) + { + //update WMM, ERP in the beacon + //todo: the timer is used instead of the number of the beacon received + if ((psta->sta_stats.rx_pkts & 0xf) == 0) + { + //DBG_871X("update_bcn_info\n"); + update_beacon_info(padapter, pframe, len, psta); + } +#ifdef CONFIG_P2P + process_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)); +#endif //CONFIG_P2P + psta->sta_stats.rx_pkts++; + } + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) + { + //update WMM, ERP in the beacon + //todo: the timer is used instead of the number of the beacon received + if ((psta->sta_stats.rx_pkts & 0xf) == 0) + { + //DBG_871X("update_bcn_info\n"); + update_beacon_info(padapter, pframe, len, psta); + } + psta->sta_stats.rx_pkts++; + } + else + { + //allocate a new CAM entry for IBSS station + if ((cam_idx = allocate_fw_sta_entry(padapter)) == NUM_STA) + { + goto _END_ONBEACON_; + } + + //get supported rate + if (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL) + { + pmlmeinfo->FW_sta_info[cam_idx].status = 0; + goto _END_ONBEACON_; + } + + //update TSF Value + update_TSF(pmlmeext, pframe, len); + + //report sta add event + report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx); + + //pmlmeext->linked_to = LINKED_TO; + } + } + } + +_END_ONBEACON_: + + return _SUCCESS; + +} + +unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + unsigned int auth_mode, seq, ie_len; + unsigned char *sa, *p; + u16 algorithm; + int status; + static struct sta_info stat; + struct sta_info *pstat=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return _FAIL; + + DBG_871X("+OnAuth\n"); + + sa = GetAddr2Ptr(pframe); + + auth_mode = psecuritypriv->dot11AuthAlgrthm; + seq = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 2)); + algorithm = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN)); + + if (GetPrivacy(pframe)) + { +#if 0 //TODO: SW rtw_wep_decrypt + if (SWCRYPTO) + { + status = rtw_wep_decrypt(priv, pframe, pfrinfo->pktlen, + priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm); + if (status == FALSE) + { + SAVE_INT_AND_CLI(flags); + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"wep-decrypt a Auth frame error!\n"); + status = _STATS_CHALLENGE_FAIL_; + goto auth_fail; + } + } + + seq = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4 + 2)); + algorithm = cpu_to_le16(*(unsigned short *)((unsigned int)pframe + WLAN_HDR_A3_LEN + 4)); +#endif + } + + + DBG_871X("auth alg=%x, seq=%X\n", algorithm, seq); + + if (auth_mode == 2 && + psecuritypriv->dot11PrivacyAlgrthm != _WEP40_ && + psecuritypriv->dot11PrivacyAlgrthm != _WEP104_) + auth_mode = 0; + + if ((algorithm > 0 && auth_mode == 0) || // rx a shared-key auth but shared not enabled + (algorithm == 0 && auth_mode == 1) ) // rx a open-system auth but shared-key is enabled + { + DBG_871X("auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\n", + algorithm, auth_mode, sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]); + + status = _STATS_NO_SUPP_ALG_; + + goto auth_fail; + } + +#if 0 //TODO:ACL control + phead = &priv->wlan_acl_list; + plist = phead->next; + //check sa + if (acl_mode == 1) // 1: positive check, only those on acl_list can be connected. + res = FAIL; + else + res = SUCCESS; + + while(plist != phead) + { + paclnode = list_entry(plist, struct rtw_wlan_acl_node, list); + plist = plist->next; + if (!memcmp((void *)sa, paclnode->addr, 6)) { + if (paclnode->mode & 2) { // deny + res = FAIL; + break; + } + else { + res = SUCCESS; + break; + } + } + } + + if (res != SUCCESS) { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"auth abort because ACL!\n"); + return FAIL; + } +#endif + + pstat = rtw_get_stainfo(pstapriv, sa); + if (pstat == NULL) + { + // allocate a new one + DBG_871X("going to alloc stainfo for sa=%02X%02X%02X%02X%02X%02X\n", sa[0],sa[1],sa[2],sa[3],sa[4],sa[5]); + pstat = rtw_alloc_stainfo(pstapriv, sa); + if (pstat == NULL) + { + DBG_871X(" Exceed the upper limit of supported clients...\n"); + status = _STATS_UNABLE_HANDLE_STA_; + goto auth_fail; + } + + pstat->state = WIFI_FW_AUTH_NULL; + pstat->auth_seq = 0; + + //pstat->flags = 0; + //pstat->capability = 0; + } + else + { + if(rtw_is_list_empty(&pstat->asoc_list)==_FALSE) + { + rtw_list_delete(&pstat->asoc_list); + if (pstat->expire_to > 0) + { + //TODO: STA re_auth within expire_to + } + } + if (seq==1) { + //TODO: STA re_auth and auth timeout + } + } + + if (rtw_is_list_empty(&pstat->auth_list)) + { + rtw_list_insert_tail(&pstat->auth_list, &pstapriv->auth_list); + } + + + if (pstat->auth_seq == 0) + pstat->expire_to = pstapriv->auth_to; + + if ((pstat->auth_seq + 1) != seq) + { + DBG_871X("(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq+1); + status = _STATS_OUT_OF_AUTH_SEQ_; + goto auth_fail; + } + + if (algorithm==0 && (auth_mode == 0 || auth_mode == 2)) + { + if (seq == 1) + { + pstat->state &= ~WIFI_FW_AUTH_NULL; + pstat->state |= WIFI_FW_AUTH_SUCCESS; + pstat->expire_to = pstapriv->assoc_to; + pstat->authalg = algorithm; + } + else + { + DBG_871X("(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq+1); + status = _STATS_OUT_OF_AUTH_SEQ_; + goto auth_fail; + } + } + else // shared system or auto authentication + { + if (seq == 1) + { + //prepare for the challenging txt... + + //get_random_bytes((void *)pstat->chg_txt, 128);//TODO: + + pstat->state &= ~WIFI_FW_AUTH_NULL; + pstat->state |= WIFI_FW_AUTH_STATE; + pstat->authalg = algorithm; + pstat->auth_seq = 2; + } + else if (seq == 3) + { + //checking for challenging txt... + DBG_871X("checking for challenging txt...\n"); + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_ , _CHLGETXT_IE_, (int *)&ie_len, + len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4); + + if((p==NULL) || (ie_len<=0)) + { + DBG_871X("auth rejected because challenge failure!(1)\n"); + status = _STATS_CHALLENGE_FAIL_; + goto auth_fail; + } + + if (_rtw_memcmp((void *)(p + 2), pstat->chg_txt, 128)) + { + pstat->state &= (~WIFI_FW_AUTH_STATE); + pstat->state |= WIFI_FW_AUTH_SUCCESS; + // challenging txt is correct... + pstat->expire_to = pstapriv->assoc_to; + } + else + { + DBG_871X("auth rejected because challenge failure!\n"); + status = _STATS_CHALLENGE_FAIL_; + goto auth_fail; + } + } + else + { + DBG_871X("(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\n", + seq, pstat->auth_seq+1); + status = _STATS_OUT_OF_AUTH_SEQ_; + goto auth_fail; + } + } + + + // Now, we are going to issue_auth... + pstat->auth_seq = seq + 1; + +#ifdef CONFIG_NATIVEAP_MLME + issue_auth(padapter, pstat, (unsigned short)(_STATS_SUCCESSFUL_)); +#endif + + if (pstat->state & WIFI_FW_AUTH_SUCCESS) + pstat->auth_seq = 0; + + + return _SUCCESS; + +auth_fail: + + if (pstat) + { + pstat = &stat; + _rtw_memset((char *)pstat, '\0', sizeof(stat)); + pstat->auth_seq = 2; + _rtw_memcpy(pstat->hwaddr, sa, 6); + } + +#ifdef CONFIG_NATIVEAP_MLME + issue_auth(padapter, pstat, (unsigned short)status); +#endif + +#endif + return _FAIL; + +} + +unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned int seq, len, status, algthm, offset; + unsigned char *p; + unsigned int go2asoc = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pkt_len = precv_frame->u.hdr.len; + + DBG_871X("%s\n", __FUNCTION__); + + //check A1 matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + return _SUCCESS; + + if (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE)) + return _SUCCESS; + + offset = (GetPrivacy(pframe))? 4: 0; + + algthm = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset)); + seq = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2)); + status = le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 4)); + + if (status != 0) + { + DBG_871X("clnt auth fail, status: %d\n", status); + goto authclnt_fail; + } + + if (seq == 2) + { + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) + { + // legendary shared system + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len, + pkt_len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_); + + if (p == NULL) + { + //DBG_8192C("marc: no challenge text?\n"); + goto authclnt_fail; + } + + _rtw_memcpy((void *)(pmlmeinfo->chg_txt), (void *)(p + 2), len); + pmlmeinfo->auth_seq = 3; + issue_auth(padapter, NULL, 0); + set_link_timer(pmlmeext, REAUTH_TO); + + return _SUCCESS; + } + else + { + // open system + go2asoc = 1; + } + } + else if (seq == 4) + { + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) + { + go2asoc = 1; + } + else + { + goto authclnt_fail; + } + } + else + { + // this is also illegal + //DBG_8192C("marc: clnt auth failed due to illegal seq=%x\n", seq); + goto authclnt_fail; + } + + if (go2asoc) + { + start_clnt_assoc(padapter); + return _SUCCESS; + } + +authclnt_fail: + + //pmlmeinfo->state &= ~(WIFI_FW_AUTH_STATE); + + return _FAIL; + +} + +unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + u16 capab_info, listen_interval; + struct ieee802_11_elems elems; + struct sta_info *pstat; + unsigned char reassoc, *p, *pos, *wpa_ie; + unsigned char rsnie_hdr[4]={0x00, 0x50, 0xf2, 0x01}; + unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; + int i, ie_len, wpa_ie_len, left; + unsigned long flags; + unsigned char supportRate[16]; + int supportRateNum; + unsigned short status = _STATS_SUCCESSFUL_; + unsigned short frame_type, ie_offset=0; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur = &(pmlmeinfo->network); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pkt_len = precv_frame->u.hdr.len; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 p2p_status_code = P2P_STATUS_SUCCESS; + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 p2pielen = 0; +#endif //CONFIG_P2P + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return _FAIL; + + frame_type = GetFrameSubType(pframe); + if (frame_type == WIFI_ASSOCREQ) + { + reassoc = 0; + ie_offset = _ASOCREQ_IE_OFFSET_; + } + else // WIFI_REASSOCREQ + { + reassoc = 1; + ie_offset = _REASOCREQ_IE_OFFSET_; + } + + + if (pkt_len < IEEE80211_3ADDR_LEN + ie_offset) { + DBG_871X("handle_assoc(reassoc=%d) - too short payload (len=%lu)" + "\n", reassoc, (unsigned long)pkt_len); + return _FAIL; + } + + pstat = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (pstat == (struct sta_info *)NULL) + { + status = _RSON_CLS2_; + goto asoc_class2_error; + } + + capab_info = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN); + //capab_info = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + //listen_interval = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN+2)); + listen_interval = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN+2); + + left = pkt_len - (IEEE80211_3ADDR_LEN + ie_offset); + pos = pframe + (IEEE80211_3ADDR_LEN + ie_offset); + + + DBG_871X("%s\n", __FUNCTION__); + + // check if this stat has been successfully authenticated/assocated + if (!((pstat->state) & WIFI_FW_AUTH_SUCCESS)) + { + if (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS)) + { + status = _RSON_CLS2_; + goto asoc_class2_error; + } + else + { + pstat->state &= (~WIFI_FW_ASSOC_SUCCESS); + pstat->state |= WIFI_FW_ASSOC_STATE; + } + } + else + { + pstat->state &= (~WIFI_FW_AUTH_SUCCESS); + pstat->state |= WIFI_FW_ASSOC_STATE; + } + + +#if 0// todo:tkip_countermeasures + if (hapd->tkip_countermeasures) { + resp = WLAN_REASON_MICHAEL_MIC_FAILURE; + goto fail; + } +#endif + + pstat->capability = capab_info; + +#if 0//todo: + //check listen_interval + if (listen_interval > hapd->conf->max_listen_interval) { + hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, + HOSTAPD_LEVEL_DEBUG, + "Too large Listen Interval (%d)", + listen_interval); + resp = WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE; + goto fail; + } + + pstat->listen_interval = listen_interval; +#endif + + //now parse all ieee802_11 ie to point to elems + if (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed || + !elems.ssid) { + DBG_871X("STA " MAC_FMT " sent invalid association request\n", + MAC_ARG(pstat->hwaddr)); + status = _STATS_FAILURE_; + goto OnAssocReqFail; + } + + + // now we should check all the fields... + // checking SSID + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SSID_IE_, &ie_len, + pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p == NULL) + { + status = _STATS_FAILURE_; + } + + if (ie_len == 0) // broadcast ssid, however it is not allowed in assocreq + status = _STATS_FAILURE_; + else + { + // check if ssid match + if (!_rtw_memcmp((void *)(p+2), cur->Ssid.Ssid, cur->Ssid.SsidLength)) + status = _STATS_FAILURE_; + + if (ie_len != cur->Ssid.SsidLength) + status = _STATS_FAILURE_; + } + + if(_STATS_SUCCESSFUL_ != status) + goto OnAssocReqFail; + + // check if the supported rate is ok + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p == NULL) { + DBG_871X("Rx a sta assoc-req which supported rate is empty!\n"); + // use our own rate set as statoin used + //_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN); + //supportRateNum = AP_BSSRATE_LEN; + + status = _STATS_FAILURE_; + goto OnAssocReqFail; + } + else { + _rtw_memcpy(supportRate, p+2, ie_len); + supportRateNum = ie_len; + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_ , &ie_len, + pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p != NULL) { + + if(supportRateNum<=sizeof(supportRate)) + { + _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); + supportRateNum += ie_len; + } + } + } + + //todo: mask supportRate between AP & STA -> move to update raid + //get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0); + + //update station supportRate + pstat->bssratelen = supportRateNum; + _rtw_memcpy(pstat->bssrateset, supportRate, supportRateNum); + + + //check RSN/WPA/WPS + pstat->dot8021xalg = 0; + pstat->wpa_psk = 0; + pstat->wpa_group_cipher = 0; + pstat->wpa2_group_cipher = 0; + pstat->wpa_pairwise_cipher = 0; + pstat->wpa2_pairwise_cipher = 0; + _rtw_memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie)); + if((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) { + + int group_cipher=0, pairwise_cipher=0; + + wpa_ie = elems.rsn_ie; + wpa_ie_len = elems.rsn_ie_len; + + if(rtw_parse_wpa2_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) + { + pstat->dot8021xalg = 1;//psk, todo:802.1x + pstat->wpa_psk |= BIT(1); + + pstat->wpa2_group_cipher = group_cipher&psecuritypriv->wpa2_group_cipher; + pstat->wpa2_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa2_pairwise_cipher; + + if(!pstat->wpa2_group_cipher) + status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; + + if(!pstat->wpa2_pairwise_cipher) + status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; + } + else + { + status = WLAN_STATUS_INVALID_IE; + } + + } else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) { + + int group_cipher=0, pairwise_cipher=0; + + wpa_ie = elems.wpa_ie; + wpa_ie_len = elems.wpa_ie_len; + + if(rtw_parse_wpa_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) + { + pstat->dot8021xalg = 1;//psk, todo:802.1x + pstat->wpa_psk |= BIT(0); + + pstat->wpa_group_cipher = group_cipher&psecuritypriv->wpa_group_cipher; + pstat->wpa_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa_pairwise_cipher; + + if(!pstat->wpa_group_cipher) + status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; + + if(!pstat->wpa_pairwise_cipher) + status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; + + } + else + { + status = WLAN_STATUS_INVALID_IE; + } + + } else { + wpa_ie = NULL; + wpa_ie_len = 0; + } + + if(_STATS_SUCCESSFUL_ != status) + goto OnAssocReqFail; + + pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS); + //if (hapd->conf->wps_state && wpa_ie == NULL) { //todo: to check ap if supporting WPS + if(wpa_ie == NULL) { + if (elems.wps_ie) { + DBG_871X("STA included WPS IE in " + "(Re)Association Request - assume WPS is " + "used\n"); + pstat->flags |= WLAN_STA_WPS; + //wpabuf_free(sta->wps_ie); + //sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4, + // elems.wps_ie_len - 4); + } else { + DBG_871X("STA did not include WPA/RSN IE " + "in (Re)Association Request - possible WPS " + "use\n"); + pstat->flags |= WLAN_STA_MAYBE_WPS; + } + } + else + { + int copy_len; + + if(psecuritypriv->wpa_psk == 0) + { + DBG_871X("STA " MAC_FMT ": WPA/RSN IE in association " + "request, but AP don't support WPA/RSN\n", MAC_ARG(pstat->hwaddr)); + + status = WLAN_STATUS_INVALID_IE; + + goto OnAssocReqFail; + + } + + if (elems.wps_ie) { + DBG_871X("STA included WPS IE in " + "(Re)Association Request - WPS is " + "used\n"); + pstat->flags |= WLAN_STA_WPS; + copy_len=0; + } + else + { + copy_len = ((wpa_ie_len+2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)):(wpa_ie_len+2); + } + + + if(copy_len>0) + _rtw_memcpy(pstat->wpa_ie, wpa_ie-2, copy_len); + + } + + + // check if there is WMM IE & support WWM-PS + pstat->flags &= ~WLAN_STA_WME; + pstat->qos_option = 0; + pstat->qos_info = 0; + pstat->has_legacy_ac = _TRUE; + pstat->uapsd_vo = 0; + pstat->uapsd_vi = 0; + pstat->uapsd_be = 0; + pstat->uapsd_bk = 0; + if (pmlmepriv->qospriv.qos_option) + { + p = pframe + WLAN_HDR_A3_LEN + ie_offset; ie_len = 0; + for (;;) + { + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); + if (p != NULL) { + if (_rtw_memcmp(p+2, WMM_IE, 6)) { + + pstat->flags |= WLAN_STA_WME; + + pstat->qos_option = 1; + pstat->qos_info = *(p+8); + + pstat->max_sp_len = (pstat->qos_info>>5)&0x3; + + if((pstat->qos_info&0xf) !=0xf) + pstat->has_legacy_ac = _TRUE; + else + pstat->has_legacy_ac = _FALSE; + + if(pstat->qos_info&0xf) + { + if(pstat->qos_info&BIT(0)) + pstat->uapsd_vo = BIT(0)|BIT(1); + else + pstat->uapsd_vo = 0; + + if(pstat->qos_info&BIT(1)) + pstat->uapsd_vi = BIT(0)|BIT(1); + else + pstat->uapsd_vi = 0; + + if(pstat->qos_info&BIT(2)) + pstat->uapsd_bk = BIT(0)|BIT(1); + else + pstat->uapsd_bk = 0; + + if(pstat->qos_info&BIT(3)) + pstat->uapsd_be = BIT(0)|BIT(1); + else + pstat->uapsd_be = 0; + + } + + break; + } + } + else { + break; + } + p = p + ie_len + 2; + } + } + + +#ifdef CONFIG_80211N_HT + /* save HT capabilities in the sta object */ + _rtw_memset(&pstat->htpriv.ht_cap, 0, sizeof(struct ieee80211_ht_cap)); + if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct ieee80211_ht_cap)) + { + pstat->flags |= WLAN_STA_HT; + + pstat->flags |= WLAN_STA_WME; + + _rtw_memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct ieee80211_ht_cap)); + + } else + pstat->flags &= ~WLAN_STA_HT; + + + if((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT)) + { + status = _STATS_FAILURE_; + goto OnAssocReqFail; + } + + + if ((pstat->flags & WLAN_STA_HT) && + ((pstat->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || + (pstat->wpa_pairwise_cipher&WPA_CIPHER_TKIP))) + { + DBG_871X("HT: " MAC_FMT " tried to " + "use TKIP with HT association\n", MAC_ARG(pstat->hwaddr)); + + //status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY; + //goto OnAssocReqFail; + } +#endif /* CONFIG_80211N_HT */ + + // + //if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)//? + pstat->flags |= WLAN_STA_NONERP; + for (i = 0; i < pstat->bssratelen; i++) { + if ((pstat->bssrateset[i] & 0x7f) > 22) { + pstat->flags &= ~WLAN_STA_NONERP; + break; + } + } + + if (pstat->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + pstat->flags |= WLAN_STA_SHORT_PREAMBLE; + else + pstat->flags &= ~WLAN_STA_SHORT_PREAMBLE; + + + + if (status != _STATS_SUCCESSFUL_) + goto OnAssocReqFail; + +#ifdef CONFIG_P2P + pstat->is_p2p_device = _FALSE; + if(pwdinfo->role == P2P_ROLE_GO) + { + if(rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , p2pie, &p2pielen)) + { + pstat->is_p2p_device = _TRUE; + if((p2p_status_code=(u8)process_assoc_req_p2p_ie(pwdinfo, p2pie, p2pielen, pstat))>0) + { + pstat->p2p_status_code = p2p_status_code; + status = _STATS_CAP_FAIL_; + goto OnAssocReqFail; + } + } + } + pstat->p2p_status_code = p2p_status_code; +#endif //CONFIG_P2P + + //TODO: identify_proprietary_vendor_ie(); + // Realtek proprietary IE + // identify if this is Broadcom sta + // identify if this is ralink sta + // Customer proprietary IE + + + + /* get a unique AID */ + if (pstat->aid > 0) { + DBG_871X(" old AID %d\n", pstat->aid); + } else { + for (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++) + if (pstapriv->sta_aid[pstat->aid - 1] == NULL) + break; + + //if (pstat->aid > NUM_STA) { + if (pstat->aid > pstapriv->max_num_sta) { + + pstat->aid = 0; + + DBG_871X(" no room for more AIDs\n"); + + status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; + + goto OnAssocReqFail; + + + } else { + pstapriv->sta_aid[pstat->aid - 1] = pstat; + DBG_871X("allocate new AID = (%d)\n", pstat->aid); + } + } + + + pstat->state &= (~WIFI_FW_ASSOC_STATE); + pstat->state |= WIFI_FW_ASSOC_SUCCESS; + + if (!rtw_is_list_empty(&pstat->auth_list)) + { + rtw_list_delete(&pstat->auth_list); + } + if (rtw_is_list_empty(&pstat->asoc_list)) + { + pstat->expire_to = pstapriv->expire_to; + rtw_list_insert_tail(&pstat->asoc_list, &pstapriv->asoc_list); + } + + + // now the station is qualified to join our BSS... + if(pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_==status)) + { +#ifdef CONFIG_NATIVEAP_MLME + //.1 bss_cap_update + //bss_cap_update(padapter, pstat); + + + //.2 - + DBG_871X("indicate_sta_join_event to upper layer - hostapd\n"); + rtw_indicate_sta_assoc_event(padapter, pstat); + + + //.3-(1) report sta add event + report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); + + //.3 -(2) + //sta_info_update(padapter, pstat); + + if (frame_type == WIFI_ASSOCREQ) + issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); + else + issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); + +#endif + } + + return _SUCCESS; + +asoc_class2_error: + +#ifdef CONFIG_NATIVEAP_MLME + issue_deauth(padapter, (void *)GetAddr2Ptr(pframe), status); +#endif + + return _FAIL; + +OnAssocReqFail: + + +#ifdef CONFIG_NATIVEAP_MLME + pstat->aid = 0; + if (frame_type == WIFI_ASSOCREQ) + issue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP); + else + issue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP); +#endif + + +#endif /* CONFIG_AP_MODE */ + + return _FAIL; + +} + +unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame) +{ + uint i; + int res; + unsigned short status; + PNDIS_802_11_VARIABLE_IEs pIE; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pkt_len = precv_frame->u.hdr.len; + + DBG_871X("%s\n", __FUNCTION__); + + //check A1 matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + return _SUCCESS; + + if (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE))) + return _SUCCESS; + + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + return _SUCCESS; + + _cancel_timer_ex(&pmlmeext->link_timer); + + //status + if ((status = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 2))) > 0) + { + DBG_871X("assoc reject, status code: %d\n", status); + pmlmeinfo->state = WIFI_FW_NULL_STATE; + res = -4; + goto report_assoc_result; + } + + //get capabilities + pmlmeinfo->capability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + + //set slot time + pmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10))? 9: 20; + + //AID + res = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 4))&0x3fff); + + //following are moved to join event callback function + //to handle HT, WMM, rate adaptive, update MAC reg + //for not to handle the synchronous IO in the tasklet + for (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM + { + WMM_param_handler(padapter, pIE); + } + break; + + case _HT_CAPABILITY_IE_: //HT caps + HT_caps_handler(padapter, pIE); + break; + + case _HT_EXTRA_INFO_IE_: //HT info + HT_info_handler(padapter, pIE); + break; + + case _ERPINFO_IE_: + ERP_IE_handler(padapter, pIE); + + default: + break; + } + + i += (pIE->Length + 2); + } + + pmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE); + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; + + //Update Basic Rate Table for spec, 2010-12-28 , by thomas + UpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates); + +report_assoc_result: + + report_join_res(padapter, res); + + return _SUCCESS; +} + +unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned short reason; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pktlen = precv_frame->u.hdr.len; + + //check A3 + if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) + return _SUCCESS; + + reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + + DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); + +#ifdef CONFIG_AP_MODE + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#if 0 + _irqL irqL; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); +#endif + ap_free_sta(padapter, rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe))); + + return _SUCCESS; + } + else +#endif + { + receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason); + } + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; + return _SUCCESS; + +} + +unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned short reason; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + uint pktlen = precv_frame->u.hdr.len; + + //check A3 + if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) + return _SUCCESS; + + reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); + + DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); + +#ifdef CONFIG_AP_MODE + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#if 0 + _irqL irqL; + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); +#endif + + ap_free_sta(padapter, rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe))); + + return _SUCCESS; + } + else +#endif + { + receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); + } + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; + return _SUCCESS; + +} + +unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame) +{ + DBG_871X("%s\n", __FUNCTION__); + return _SUCCESS; +} + +unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame) +{ + u8 *addr; + struct sta_info *psta=NULL; + struct recv_reorder_ctrl *preorder_ctrl; + unsigned char *frame_body; + unsigned char category, action; + unsigned short tid, status, reason_code = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *pframe = precv_frame->u.hdr.rx_data; + struct sta_priv *pstapriv = &padapter->stapriv; + + uint len = precv_frame->u.hdr.len; + + //check RA matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode + return _SUCCESS; + +/* + //check A1 matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), get_da(pframe), ETH_ALEN)) + return _SUCCESS; +*/ + DBG_871X("%s\n", __FUNCTION__); + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) + return _SUCCESS; + + addr = GetAddr2Ptr(pframe); + psta = rtw_get_stainfo(pstapriv, addr); + + if(psta==NULL) + return _SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + if (category == WLAN_CATEGORY_BACK)// representing Block Ack + { + if (!pmlmeinfo->HT_enable) + { + return _SUCCESS; + } + + action = frame_body[1]; + DBG_871X("%s, action=%d\n", __FUNCTION__, action); + switch (action) + { + case WLAN_ACTION_ADDBA_REQ: //ADDBA request + + _rtw_memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request)); + //process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), GetAddr3Ptr(pframe)); + process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), addr); + + if(pmlmeinfo->bAcceptAddbaReq == _TRUE) + { + issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 0); + } + else + { + issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 37);//reject ADDBA Req + } + + break; + + case WLAN_ACTION_ADDBA_RESP: //ADDBA response + + //status = frame_body[3] | (frame_body[4] << 8); //endian issue + status = RTW_GET_LE16(&frame_body[3]); + tid = ((frame_body[5] >> 2) & 0x7); + + if (status == 0) + { //successful + DBG_871X("agg_enable for TID=%d\n", tid); + psta->htpriv.agg_enable_bitmap |= 1 << tid; + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + } + else + { + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); + } + + //DBG_8192C("marc: ADDBA RSP: %x\n", pmlmeinfo->agg_enable_bitmap); + break; + + case WLAN_ACTION_DELBA: //DELBA + if ((frame_body[3] & BIT(3)) == 0) + { + psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); + psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); + + //reason_code = frame_body[4] | (frame_body[5] << 8); + reason_code = RTW_GET_LE16(&frame_body[4]); + } + else if((frame_body[3] & BIT(3)) == BIT(3)) + { + tid = (frame_body[3] >> 4) & 0x0F; + + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + preorder_ctrl->enable = _FALSE; + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + } + + DBG_8192C("%s(): DELBA: %x(%x)\n", __FUNCTION__,pmlmeinfo->agg_enable_bitmap, reason_code); + //todo: how to notify the host while receiving DELETE BA + break; + + default: + break; + } + } + + return _SUCCESS; +} + +#ifdef CONFIG_P2P +void issue_p2p_GO_request(_adapter *padapter, u8* raddr) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_REQ; + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u8 wpsielen = 0, p2pielen = 0, i; + u16 chnum = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif //CONFIG_WFD + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + DBG_8192C( "[%s] In\n", __FUNCTION__ ); + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pwdinfo->negotiation_dialog_token = 1; // Initialize the dialog value + pframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen)); + + + + // WPS Section + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Device Password ID + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + + if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); + } + else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); + } + else if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); + } + + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110306 + // According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes + // 1. P2P Capability + // 2. Group Owner Intent + // 3. Configuration Timeout + // 4. Listen Channel + // 5. Extended Listen Timing + // 6. Intended P2P Interface Address + // 7. Channel List + // 8. P2P Device Info + // 9. Operating Channel + + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Group Owner Intent + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + // Todo the tie breaker bit. + p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) ); + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + + // Listen Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listening channel number + + + // Extended Listen Timing ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + // Value: + // Availability Period + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Availability Interval + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + + // Intended P2P Interface Address + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + chnum = ( u16 ) pmlmeext->max_chan_nums; + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + chnum ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + // Depends on the channel plan + p2pie[ p2pielen++ ] = pmlmeext->max_chan_nums; + + // Channel List + for( i = 0; i < pmlmeext->max_chan_nums; i++ ) + { + p2pie[ p2pielen++ ] = pmlmeext->channel_set[ i ].ChannelNum; + } + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + + // Operating Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + +#ifdef CONFIG_WFD + wfdielen = build_nego_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif //CONFIG_WFD + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + + +void issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint len, u8 result) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_RESP; + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u8 p2pielen = 0, i; + uint wpsielen = 0; + u16 wps_devicepassword_id = 0x0000; + uint wps_devicepassword_id_len = 0; + u16 chnum = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + DBG_8192C( "[%s] In\n", __FUNCTION__ ); + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pwdinfo->negotiation_dialog_token = frame_body[7]; // The Dialog Token of provisioning discovery request frame. + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); + + // Commented by Albert 20110328 + // Try to get the device password ID from the WPS IE of group negotiation request frame + // WiFi Direct test plan 5.1.15 + rtw_get_wps_ie_p2p( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen); + rtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len); + wps_devicepassword_id = be16_to_cpu( wps_devicepassword_id ); + + _rtw_memset( wpsie, 0x00, 255 ); + wpsielen = 0; + + // WPS Section + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Device Password ID + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + if ( wps_devicepassword_id == WPS_DPID_USER_SPEC ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC ); + } + else if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC ) + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC ); + } + else + { + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC ); + } + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20100908 + // According to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes + // 1. Status + // 2. P2P Capability + // 3. Group Owner Intent + // 4. Configuration Timeout + // 5. Operating Channel + // 6. Intended P2P Interface Address + // 7. Channel List + // 8. Device Info + // 9. Group ID ( Only GO ) + + + // ToDo: + + // P2P Status + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = result; + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + + if ( pwdinfo->role == P2P_ROLE_CLIENT ) + { + // Commented by Albert 2011/03/08 + // According to the P2P specification + // if the sending device will be client, the P2P Capability should be reserved of group negotation response frame + p2pie[ p2pielen++ ] = 0; + } + else + { + // Be group owner or meet the error case + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + } + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Group Owner Intent + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + if ( pwdinfo->peer_intent & 0x01 ) + { + // Peer's tie breaker bit is 1, our tie breaker bit should be 0 + p2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 ); + } + else + { + // Peer's tie breaker bit is 0, our tie breaker bit should be 1 + p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) ); + } + + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + // Operating Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number + + // Intended P2P Interface Address + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + chnum = ( u16 ) pmlmeext->max_chan_nums; + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + chnum ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + // Depends on the channel plan + p2pie[ p2pielen++ ] = pmlmeext->max_chan_nums; + + // Channel List + for( i = 0; i < pmlmeext->max_chan_nums; i++ ) + { + p2pie[ p2pielen++ ] = pmlmeext->channel_set[ i ].ChannelNum; + } + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + if ( pwdinfo->role == P2P_ROLE_GO ) + { + // Group ID Attribute + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); + p2pielen += 2; + + // Value: + // p2P Device Address + _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // SSID + _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); + p2pielen += pwdinfo->nego_ssidlen; + + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_NEGO_CONF; + u8 wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u8 wpsielen = 0, p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + DBG_8192C( "[%s] In\n", __FUNCTION__ ); + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen)); + + + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110306 + // According to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes + // 1. Status + // 2. P2P Capability + // 3. Operating Channel + // 4. Channel List + // 5. Group ID ( if this WiFi is GO ) + + // P2P Status + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = result; + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + + // Operating Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + if ( pwdinfo->role == P2P_ROLE_CLIENT ) + { + p2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch; + } + else + { + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // Use the listen channel as the operating channel + } + + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + pwdinfo->channel_cnt ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = pwdinfo->channel_cnt; + + // Channel List + _rtw_memcpy( p2pie + p2pielen, pwdinfo->channel_list, pwdinfo->channel_cnt ); + p2pielen += pwdinfo->channel_cnt; + + if ( pwdinfo->role == P2P_ROLE_GO ) + { + // Group ID Attribute + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen ); + p2pielen += 2; + + // Value: + // p2P Device Address + _rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // SSID + _rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen ); + p2pielen += pwdinfo->nego_ssidlen; + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_INVIT_REQ; + u8 p2pie[ 255 ] = { 0x00 }; + u8 p2pielen = 0; + u8 dialogToken = 3; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20101011 + // According to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes + // 1. Configuration Timeout + // 2. Invitation Flags + // 3. Operating Channel ( Only GO ) + // 4. P2P Group BSSID ( Only GO ) + // 5. Channel List + // 6. P2P Group ID + // 7. P2P Device Info + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + // Invitation Flags + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INVITATION_FLAGS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = P2P_INVITATION_FLAGS_PERSISTENT; + + + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 + + // Channel List + p2pie[ p2pielen++ ] = 0x01; + p2pie[ p2pielen++ ] = 0x02; + p2pie[ p2pielen++ ] = 0x03; + p2pie[ p2pielen++ ] = 0x04; + p2pie[ p2pielen++ ] = 0x05; + p2pie[ p2pielen++ ] = 0x06; + p2pie[ p2pielen++ ] = 0x07; + p2pie[ p2pielen++ ] = 0x08; + p2pie[ p2pielen++ ] = 0x09; + p2pie[ p2pielen++ ] = 0x0A; + p2pie[ p2pielen++ ] = 0x0B; + + // P2P Group ID + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 6 + pwdinfo->invitereq_info.ssidlen ); + p2pielen += 2; + + // Value: + // P2P Device Address for GO + _rtw_memcpy( p2pie + p2pielen, raddr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // SSID + _rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.ssid, pwdinfo->invitereq_info.ssidlen ); + p2pielen += pwdinfo->invitereq_info.ssidlen; + + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success) +{ + + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_INVIT_RESP; + u8 p2pie[ 255 ] = { 0x00 }; + u8 p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &( padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, raddr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + // P2P IE Section. + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20101005 + // According to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes + // 1. Status + // 2. Configuration Timeout + // 3. Operating Channel ( Only GO ) + // 4. P2P Group BSSID ( Only GO ) + // 5. Channel List + + // P2P Status + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_STATUS; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 ); + p2pielen += 2; + + // Value: + if ( success ) + { + p2pie[ p2pielen++ ] = P2P_STATUS_SUCCESS; + } + else + { + // Sent the event receiving the P2P Invitation Req frame to DMP UI. + // DMP had to compare the MAC address to find out the profile. + // So, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. + // If the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req + // to NB to rebuild the persistent group. + p2pie[ p2pielen++ ] = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + + // Configuration Timeout + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P GO + p2pie[ p2pielen++ ] = 200; // 2 seconds needed to be the P2P Client + + + if ( success ) + { + // Channel List + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0010 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Channel Entry List + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Number of Channels + p2pie[ p2pielen++ ] = 0x0B; // support channel 1 - 11 + + // Channel List + p2pie[ p2pielen++ ] = 0x01; + p2pie[ p2pielen++ ] = 0x02; + p2pie[ p2pielen++ ] = 0x03; + p2pie[ p2pielen++ ] = 0x04; + p2pie[ p2pielen++ ] = 0x05; + p2pie[ p2pielen++ ] = 0x06; + p2pie[ p2pielen++ ] = 0x07; + p2pie[ p2pielen++ ] = 0x08; + p2pie[ p2pielen++ ] = 0x09; + p2pie[ p2pielen++ ] = 0x0A; + p2pie[ p2pielen++ ] = 0x0B; + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_p2p_provision_request(_adapter *padapter, u8* pinterface_raddr, u8* pssid, u8 ussidlen, u8* pdev_raddr ) +{ + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = 1; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_REQ; + u8 wpsie[ 100 ] = { 0x00 }; + u8 wpsielen = 0; + u32 p2pielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + DBG_8192C( "[%s] In\n", __FUNCTION__ ); + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, pinterface_raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, pssid, ussidlen, pdev_raddr ); + + pframe += p2pielen; + pattrib->pktlen += p2pielen; + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Config Method + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request ); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +u8 is_matched_in_profilelist( u8* peermacaddr, struct profile_info* profileinfo ) +{ + u8 i, match_result = 0; + + DBG_8192C( "[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + peermacaddr[0], peermacaddr[1],peermacaddr[2],peermacaddr[3],peermacaddr[4],peermacaddr[5]); + + for( i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++ ) + { + DBG_8192C( "[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + profileinfo->peermac[0], profileinfo->peermac[1],profileinfo->peermac[2],profileinfo->peermac[3],profileinfo->peermac[4],profileinfo->peermac[5]); + if ( _rtw_memcmp( peermacaddr, profileinfo->peermac, ETH_ALEN ) ) + { + match_result = 1; + DBG_8192C( "[%s] Match!\n", __FUNCTION__ ); + break; + } + } + + return (match_result ); +} + +void issue_probersp_p2p(_adapter *padapter, unsigned char *da) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + //WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u16 beacon_interval = 100; + u16 capInfo = 0; + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 wpsie[255] = { 0x00 }; + u32 wpsielen = 0, p2pielen = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif //CONFIG_WFD + + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + + // Use the device address for BSSID field. + _rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = pattrib->hdrlen; + pframe += pattrib->hdrlen; + + //timestamp will be inserted by hardware + pframe += 8; + pattrib->pktlen += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); + pframe += 2; + pattrib->pktlen += 2; + + // capability info: 2 bytes + // ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec) + capInfo |= cap_ShortPremble; + capInfo |= cap_ShortSlot; + + _rtw_memcpy(pframe, (unsigned char *) &capInfo, 2); + pframe += 2; + pattrib->pktlen += 2; + + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen); + + // supported rates... + // Use the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 ) + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen); + + // Todo: WPS IE + // Noted by Albert 20100907 + // According to the WPS specification, all the WPS attribute is presented by Big Endian. + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // WiFi Simple Config State + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG; // Not Configured. + + // Response Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X; + + // UUID-E + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + wpsielen += 0x10; + + // Manufacturer + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, "Realtek", 7 ); + wpsielen += 7; + + // Model Name + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, "8192CU", 6 ); + wpsielen += 6; + + // Model Number + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[ wpsielen++ ] = 0x31; // character 1 + + // Serial Number + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, "123456" , ETH_ALEN ); + wpsielen += ETH_ALEN; + + // Primary Device Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + wpsielen += 2; + + // Value: + // Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + wpsielen += 2; + + // OUI + *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // Sub Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + wpsielen += 2; + + // Device Name + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + wpsielen += pwdinfo->device_name_len; + + // Config Method + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + wpsielen += 2; + + // Value: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + wpsielen += 2; + + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + + p2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe); + pframe += p2pielen; + pattrib->pktlen += p2pielen; + +#ifdef CONFIG_WFD + wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif //CONFIG_WFD + + pattrib->last_txcmdsz = pattrib->pktlen; + + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_probereq_p2p(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac; + unsigned char bssrate[NumRates]; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + int bssrate_len = 0; + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 wpsie[255] = { 0x00 }, p2pie[ 255 ] = { 0x00 }; + u16 wpsielen = 0, p2pielen = 0; +#ifdef CONFIG_WFD + u32 wfdielen = 0; +#endif //CONFIG_WFD + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + // broadcast probe request frame + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_PROBEREQ); + + pframe += sizeof (struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + + if ( P2P_STATE_TX_PROVISION_DIS_REQ == pwdinfo->p2p_state ) + { + pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen)); + } + // Use the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 ) + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen); + + // WPS IE + // Noted by Albert 20110221 + // According to the WPS specification, all the WPS attribute is presented by Big Endian. + + wpsielen = 0; + // WPS OUI + *(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 + + // Device Name + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len ); + wpsielen += 2; + + // Value: + _rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len ); + wpsielen += pwdinfo->device_name_len; + + // Primary Device Type + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 ); + wpsielen += 2; + + // Value: + // Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + wpsielen += 2; + + // OUI + *(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI ); + wpsielen += 4; + + // Sub Category ID + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110221 + // According to the P2P Specification, the probe request frame should contain 5 P2P attributes + // 1. P2P Capability + // 2. P2P Device ID if this probe request wants to find the specific P2P device + // 3. Listen Channel + // 4. Extended Listen Timing + // 5. Operating Channel if this WiFi is working as the group owner now + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Listen Channel + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->listen_channel; // listen channel + + + // Extended Listen Timing + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + // Value: + // Availability Period + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Availability Interval + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + if ( pwdinfo->role == P2P_ROLE_GO ) + { + // Operating Channel (if this WiFi is working as the group owner now) + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 ); + p2pielen += 2; + + // Value: + // Country String + p2pie[ p2pielen++ ] = 'U'; + p2pie[ p2pielen++ ] = 'S'; + + // The third byte should be set to 0x04. + // Described in the "Operating Channel Attribute" section. + p2pie[ p2pielen++ ] = 0x04; + + // Operating Class + p2pie[ p2pielen++ ] = 0x51; // Copy from SD7 + + // Channel Number + p2pie[ p2pielen++ ] = pwdinfo->operating_channel; // operating channel number + + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + +#ifdef CONFIG_WFD + wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe); + pframe += wfdielen; + pattrib->pktlen += wfdielen; +#endif //CONFIG_WFD + + pattrib->last_txcmdsz = pattrib->pktlen; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +#endif //CONFIG_P2P + +unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame) +{ + unsigned char *frame_body; + unsigned char category, action; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; +#ifdef CONFIG_P2P + u8 p2p_ie[ 255 ]; + u32 p2p_ielen, wps_ielen; + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + u8 result = P2P_STATUS_SUCCESS; +#endif //CONFIG_P2P + + //check RA matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode + return _SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + if(category != WLAN_CATEGORY_PUBLIC) + return _SUCCESS; + + action = frame_body[ 1 ]; + if ( action == ACT_PUBLIC_P2P ) // IEEE 802.11 P2P Public Action usage. + { +#ifdef CONFIG_P2P + // Do nothing if the driver doesn't enable the P2P function. + if ( ( pwdinfo->p2p_state == P2P_STATE_NONE ) || ( pwdinfo->p2p_state == P2P_STATE_IDLE ) ) + return _SUCCESS; + + // Commented by Albert 20100908 + // Low byte -> High byte is 0x50, 0x6F, 0x9A, 0x09 for P2P OUI. + // But the P2POUT is defined as 0x506F9A09 -> should use the cpu_to_be32 + if ( cpu_to_be32( *( ( u32* ) ( frame_body + 2 ) ) ) == P2POUI ) + { + _rtw_memset( p2p_ie, 0x00, 255 ); + p2p_ielen = 0; + + switch( frame_body[ 6 ] )//OUI Subtype + { + case P2P_GO_NEGO_REQ: + { + DBG_8192C( "[%s] Got GO Nego Req Frame\n", __FUNCTION__); + + if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_FAIL ) + { + // Commented by Albert 20110526 + // In this case, this means the previous nego fail doesn't be reset yet. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + // Restore the previous p2p state + pwdinfo->p2p_state = pwdinfo->pre_p2p_state; + printk( "[%s] Restore the previous p2p state to %d\n", __FUNCTION__, pwdinfo->p2p_state ); + } + + //20110902 Kurt + //Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. + if(pwdinfo->p2p_state != P2P_STATE_GONEGO_ING) + pwdinfo->pre_p2p_state = pwdinfo->p2p_state; + + result = process_p2p_group_negotation_req( pwdinfo, frame_body, len ); + issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result ); + // Commented by Albert 20110718 + // No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); + break; + } + case P2P_GO_NEGO_RESP: + { + DBG_8192C( "[%s] Got GO Nego Resp Frame\n", __FUNCTION__); + + if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_ING ) + { + // Commented by Albert 20110425 + // The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + result = process_p2p_group_negotation_resp( pwdinfo, frame_body, len); + + issue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result); + + // Reset the dialog token for group negotiation frames. + pwdinfo->negotiation_dialog_token = 1; + + if( pwdinfo->p2p_state == P2P_STATE_GONEGO_FAIL ) + { + _set_timer( &pwdinfo->restore_p2p_state_timer, 5000 ); + } + } + else + { + DBG_8192C( "[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __FUNCTION__); + } + + break; + } + case P2P_GO_NEGO_CONF: + { + DBG_8192C( "[%s] Got GO Nego Confirm Frame\n", __FUNCTION__); + process_p2p_group_negotation_confirm( pwdinfo, frame_body, len); + break; + } + case P2P_INVIT_REQ: + { + // Added by Albert 2010/10/05 + // Received the P2P Invite Request frame. + + DBG_8192C( "[%s] Got invite request frame!\n", __FUNCTION__ ); + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + // Parse the necessary information from the P2P Invitation Request frame. + // For example: The MAC address of sending this P2P Invitation Request frame. + u8 groupid[ 38 ] = { 0x00 }; + u32 attr_contentlen = 0; + u8 match_result = 0; + + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen); + _rtw_memcpy( pwdinfo->p2p_peer_interface_addr, groupid, ETH_ALEN ); + pwdinfo->p2p_state = P2P_STATE_RECV_INVITE_REQ; + DBG_8192C( "[%s] peer address %.2X %.2X %.2X %.2X %.2X %.2X\n", __FUNCTION__, + groupid[0], groupid[1], groupid[2], groupid[3], groupid[4], groupid[5] ); + + if ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) ) + { + match_result = 1; + } + else + { + match_result = 0; + } + + DBG_8192C( "[%s] match_result = %d\n", __FUNCTION__, match_result ); + + pwdinfo->inviteresp_info.token = frame_body[ 7 ]; + issue_p2p_invitation_response( padapter, pwdinfo->p2p_peer_interface_addr, pwdinfo->inviteresp_info.token, match_result ); + } + + break; + } + case P2P_INVIT_RESP: + { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + DBG_8192C( "[%s] Got invite response frame!\n", __FUNCTION__ ); + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + + if ( attr_contentlen == 1 ) + { + DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); + if ( attr_content == P2P_STATUS_SUCCESS ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + } + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + } + } + break; + } + case P2P_DEVDISC_REQ: + + process_p2p_devdisc_req(pwdinfo, pframe, len); + + break; + + case P2P_DEVDISC_RESP: + + process_p2p_devdisc_resp(pwdinfo, pframe, len); + + break; + + case P2P_PROVISION_DISC_REQ: + DBG_8192C( "[%s] Got Provisioning Discovery Request Frame\n", __FUNCTION__ ); + process_p2p_provdisc_req(pwdinfo, pframe, len); + _rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN); + + //20110902 Kurt + //Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. + if(pwdinfo->p2p_state != P2P_STATE_RX_PROVISION_DIS_REQ) + pwdinfo->pre_p2p_state = pwdinfo->p2p_state; + pwdinfo->p2p_state = P2P_STATE_RX_PROVISION_DIS_REQ; + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); + break; + + case P2P_PROVISION_DISC_RESP: + // Commented by Albert 20110707 + // Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? + DBG_8192C( "[%s] Got Provisioning Discovery Response Frame\n", __FUNCTION__ ); + // Commented by Albert 20110426 + // The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. + _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer ); + pwdinfo->p2p_state = P2P_STATE_RX_PROVISION_DIS_RSP; + process_p2p_provdisc_resp(pwdinfo, pframe); + _set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT ); + break; + + } + + } +#endif //CONFIG_P2P + } + + return _SUCCESS; +} + +unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame) +{ + return _SUCCESS; +} + +unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_P2P + u8 *frame_body; + u8 category, OUI_Subtype, dialogToken=0; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + + + DBG_871X("%s\n", __FUNCTION__); + + //check RA matches or not + if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode + return _SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + if(category != WLAN_CATEGORY_P2P) + return _SUCCESS; + + if ( cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ) != P2POUI ) + return _SUCCESS; + + OUI_Subtype = frame_body[5]; + dialogToken = frame_body[6]; + + switch(OUI_Subtype) + { + case P2P_NOTICE_OF_ABSENCE: + + break; + + case P2P_PRESENCE_REQUEST: + + process_p2p_presence_req(pwdinfo, pframe, len); + + break; + + case P2P_PRESENCE_RESPONSE: + + break; + + case P2P_GO_DISC_REQUEST: + + break; + + default: + break; + + } + +#endif //CONFIG_P2P + + return _SUCCESS; + +} + +unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame) +{ + int i; + unsigned char category; + struct action_handler *ptable; + unsigned char *frame_body; + u8 *pframe = precv_frame->u.hdr.rx_data; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + category = frame_body[0]; + + for(i = 0; i < sizeof(OnAction_tbl)/sizeof(struct action_handler); i++) + { + ptable = &OnAction_tbl[i]; + + if(category == ptable->num) + ptable->func(padapter, precv_frame); + + } + + return _SUCCESS; + +} + +unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame) +{ + u8 *pframe = precv_frame->u.hdr.rx_data; + uint len = precv_frame->u.hdr.len; + + //DBG_871X("rcvd mgt frame(%x, %x)\n", (GetFrameSubType(pframe) >> 4), *(unsigned int *)GetAddr1Ptr(pframe)); + return _SUCCESS; +} + +struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv) +{ + struct xmit_frame *pmgntframe; + struct xmit_buf *pxmitbuf; + + if ((pmgntframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) + { + return NULL; + } + + if ((pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv)) == NULL) + { + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + return NULL; + } + + pmgntframe->frame_tag = MGNT_FRAMETAG; + + pmgntframe->pxmitbuf = pxmitbuf; + + pmgntframe->buf_addr = pxmitbuf->pbuf; + + pxmitbuf->priv_data = pmgntframe; + + return pmgntframe; + +} + + +/**************************************************************************** + +Following are some TX fuctions for WiFi MLME + +*****************************************************************************/ + +void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + + _rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); + + pattrib->hdrlen = 24; + pattrib->nr_frags = 1; + pattrib->priority = 7; + pattrib->mac_id = 0; + pattrib->qsel = 0x12; + + pattrib->pktlen = 0; + + if(pmlmeext->cur_wireless_mode & WIRELESS_11B) + pattrib->raid = 6;//b mode + else + pattrib->raid = 5;//a/g mode + + pattrib->encrypt = _NO_PRIVACY_; + pattrib->bswenc = _FALSE; + + pattrib->qos_en = _FALSE; + pattrib->ht_en = _FALSE; + pattrib->bwmode = HT_CHANNEL_WIDTH_20; + pattrib->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pattrib->sgi = _FALSE; + + pattrib->seqnum = pmlmeext->mgnt_seq; + +} + +void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe) +{ + if(padapter->bSurpriseRemoved == _TRUE || + padapter->bDriverStopped == _TRUE) + return; + + padapter->HalFunc.mgnt_xmit(padapter, pmgntframe); +} + +//Commented by Kurt +#ifdef CONFIG_TDLS +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; +// SetToDs(fctrl); + if (power_mode) + { + SetPwrMgt(fctrl); + } + + _rtw_memcpy(pwlanhdr->addr1, ptdls_sta->hwaddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(pwlanhdr, pattrib->seqnum); + + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + +s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib) +{ + + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + + s32 res=_SUCCESS; + sint bmcast; + + bmcast = IS_MCAST(pattrib->ra); + + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + if (psta == NULL) { + res =_FAIL; + goto exit; + } + + pattrib->mac_id = psta->mac_id; + + pattrib->psta = psta; + + pattrib->ack_policy = 0; + // get ether_hdr_len + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + + if (pqospriv->qos_option && psta->qos_option) { + if(pattrib->priority==0) + pattrib->priority = 1; //tdls management frame should be AC_BK + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; + pattrib->subtype = WIFI_QOS_DATA_TYPE; + } else { + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA_TYPE; + pattrib->priority = 0; + } + + if (psta->ieee8021x_blocked == _TRUE) + { + pattrib->encrypt = 0; + } + else + { + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); + + switch(psecuritypriv->dot11AuthAlgrthm) + { + case dot11AuthAlgrthm_Open: + case dot11AuthAlgrthm_Shared: + case dot11AuthAlgrthm_Auto: + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; + break; + case dot11AuthAlgrthm_8021X: + pattrib->key_idx = 0; + break; + default: + pattrib->key_idx = 0; + break; + } + } + + switch (pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + pattrib->iv_len = 4; + pattrib->icv_len = 4; + break; + case _TKIP_: + pattrib->iv_len = 8; + pattrib->icv_len = 4; + if(padapter->securitypriv.busetkipkey==_FAIL) + { + res =_FAIL; + goto exit; + } + break; + case _AES_: + pattrib->iv_len = 8; + pattrib->icv_len = 8; + break; + default: + pattrib->iv_len = 0; + pattrib->icv_len = 0; + break; + } + + if (pattrib->encrypt && + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) + { + pattrib->bswenc = _TRUE; + } else { + pattrib->bswenc = _FALSE; + } + + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi + pattrib->qos_en = psta->qos_option; + pattrib->ht_en = psta->htpriv.ht_option; + pattrib->raid = psta->raid; + pattrib->bwmode = psta->htpriv.bwmode; + pattrib->ch_offset = psta->htpriv.ch_offset; + pattrib->sgi= psta->htpriv.sgi; + pattrib->ampdu_en = _FALSE; + + if(pattrib->ht_en && psta->htpriv.ampdu_enable) + { + if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + pattrib->ampdu_en = _TRUE; + } + +exit: + + return res; +} + +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + static u8 dialogtoken = 0; + u32 timeout_interval= TPK_RESEND_COUNT * 1000; //retry timer should set at least 301 sec, using TPK_count counting 301 times. + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + + update_tdls_attrib(padapter, pattrib); + + //init peer sta_info + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL){ + ptdls_sta = rtw_alloc_stainfo(pstapriv, mac_addr); + } + + if(ptdls_sta){ + ptdls_sta->state |= TDLS_RESPONDER_STATE; + //for tdls; ptdls_sta->aid is used to fill dialogtoken + ptdls_sta->aid = pattrib->nr_frags; + ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval; + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + } + else { + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + goto exit; + } + + pattrib->qsel=pattrib->priority; + if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + ptdls_sta = rtw_get_stainfo(pstapriv, mac_addr); + if(ptdls_sta==NULL){ + DBG_8192C("issue tdls teardown unsuccessful\n"); + return; + }else{ + ptdls_sta->state=UN_TDLS_STATE; + } + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_TEARDOWN) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + + if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ + ptdls_sta->option =3; + _set_workitem(&ptdls_sta->option_workitem); + } + + //free peer sta_info + DBG_8192C("tdls teardown, free sta_info\n"); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + //ready to clear cam + if(ptdls_sta->cam_entry!=0){ + pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; + rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); + } + _set_workitem(&pmlmeext->TDLS_restore_workitem); + rtw_free_stainfo(padapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; //tdls;kurt + +exit: + + return; +} + +void issue_tdls_dis_req(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + static u8 dialogtoken=0; + u8 mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + //for tdls; pattrib->type is used to fill status + pattrib->type = 0; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_DISCOVERY_REQUEST) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + DBG_8192C("issue tdls dis req\n"); + +exit: + + return; +} + +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = rx_pkt_pattrib->frag_num; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_RESPONSE) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + //status code!=0 ; setup unsuccess + if(ptdls_sta->stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + } + +exit: + + return; + +} + +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + _irqL irqL; + + struct rx_pkt_attrib *rx_pkt_pattrib = & precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = rx_pkt_pattrib->frag_num; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_SETUP_CONFIRM) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + pmlmeinfo->tdls_setup_state=TDLS_LINKED_STATE; + + rtw_dump_xframe(padapter, pmgntframe); + + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + + ptdls_sta->option=1; + _set_workitem(&ptdls_sta->option_workitem); + //status code!=0 ; setup unsuccess + if(ptdls_sta->stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + //ready to clear cam + if(ptdls_sta->cam_entry!=0){ + pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; + rtw_setstakey_cmd(padapter, (u8 *)ptdls_sta, _TRUE); + } + rtw_free_stainfo(padapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + } + +exit: + + return; + +} + +//TDLS Discovery Response frame is a management action frame +void issue_tdls_dis_rsp(_adapter *padapter, union recv_frame *precv_frame) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + struct rx_pkt_attrib *rx_pkt_pattrib = &precv_frame->u.hdr.attrib; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + // unicast probe request frame + _rtw_memcpy(pwlanhdr->addr1, rx_pkt_pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr3, rx_pkt_pattrib->bssid, ETH_ALEN); + _rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof (struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + //tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = rx_pkt_pattrib->frag_num; + + fill_tdls_dis_rsp_frbody(padapter, pmgntframe, pframe); + + pattrib->nr_frags = 1; + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + static u8 dialogtoken=0; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, psta->hwaddr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + //for tdls; pattrib->nr_frags is used to fill dialogtoken + pattrib->nr_frags = dialogtoken; + dialogtoken = (dialogtoken+1)%256; + //for tdls; pattrib->type is used to fill status + pattrib->type = 0; + //PTI frame's priority should be AC_VO + pattrib->priority = 7; + + update_tdls_attrib(padapter, pattrib); + pattrib->qsel=pattrib->priority; + if (xmit_tdls_coalesce(padapter, pmgntframe, TDLS_PEER_TRAFFIC_INDICATION) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; + if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_REQUEST) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + + _irqL irqL; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + + pmgntframe->frame_tag = DATA_FRAMETAG; + pattrib->ether_type = 0x890d; + pattrib->pctrl =0; + + _rtw_memcpy(pattrib->dst, mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->src, myid(&(padapter->eeprompriv)), ETH_ALEN); + + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + update_tdls_attrib(padapter, pattrib); + + pattrib->qsel=pattrib->priority; +/* + _enter_critical_bh(&pxmitpriv->lock, &irqL); + if(xmit_tdls_enqueue_for_sleeping_sta(padapter, pmgntframe)==_TRUE){ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + return _FALSE; + } +*/ + if(xmit_tdls_coalesce(padapter, pmgntframe, TDLS_CHANNEL_SWITCH_RESPONSE) !=_SUCCESS ){ + rtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pmgntframe); + } + rtw_dump_xframe(padapter, pmgntframe); + +exit: + + return; +} + +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pmlmeinfo->tdls_dis_req==1 || pmlmeinfo->tdls_dis_req==2){ + report_survey_event(adapter, precv_frame); + } + + return _FAIL; +} + +u8 collect_tdls_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid) +{ + int FIXED_IE=5; + int i; + unsigned int len; + unsigned char *p; + u8 *pframe = precv_frame->u.hdr.rx_data; + uint packet_len = precv_frame->u.hdr.len; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + +// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +// struct registry_priv *pregistrypriv = &padapter->registrypriv; + + //[-24]: mgt_frame hdrlen + len = packet_len - 24 ; + + if (len > MAX_IE_SZ) + { + DBG_8192C("TDLS dis rsp IE too long for survey event\n"); + return _FAIL; + } + + _rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX)); + + //represent tdls peer + bssid->Reserved[1] = 'T'; + + bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; + + //below is to copy the information element + bssid->IELength = len; + _rtw_memcpy(bssid->IEs, (pframe + 24), bssid->IELength); + + //get the signal strength + //bssid->Rssi = precv_frame->u.hdr.attrib.signal_strength; // 0-100 index. + bssid->Rssi = precv_frame->u.hdr.attrib.RecvSignalPower; // in dBM.raw data + bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.signal_qual;//in percentage + bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.signal_strength;//in percentage +#ifdef CONFIG_ANTENNA_DIVERSITY + //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); +#endif + + _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); + + //checking rate info... + i = 0; + p = rtw_get_ie(bssid->IEs + FIXED_IE, _SUPPORTEDRATES_IE_, &len, bssid->IELength - FIXED_IE); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates, (p + 2), len); + i = len; + } + + p = rtw_get_ie(bssid->IEs + FIXED_IE, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - FIXED_IE); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len); + } + + //pframe+10 would be src_addr + _rtw_memcpy(bssid->MacAddress, (pframe+10), ETH_ALEN); + return _SUCCESS; + +} + +#endif + +void issue_beacon(_adapter *padapter) +{ + _irqL irqL; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned int rate_len; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + + //DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); + return; + } + + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + pattrib->qsel = 0x10; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + //DBG_871X("ie len=%d\n", cur_network->IELength); +#ifdef CONFIG_P2P + // for P2P : Primary Device Type & Device Name + u32 wpsielen=0, insert_len=0; + u8 *wpsie=NULL; + wpsie = rtw_get_wps_ie(cur_network->IEs, cur_network->IELength, NULL, &wpsielen); + + if(pwdinfo->role == P2P_ROLE_GO && wpsie && wpsielen>0) + { + uint wps_offset, remainder_ielen; + u8 *premainder_ie, *pframe_wscie; + + wps_offset = (uint)(wpsie - cur_network->IEs); + + premainder_ie = wpsie + wpsielen; + + remainder_ielen = cur_network->IELength - wps_offset - wpsielen; + + pframe_wscie = pframe + wps_offset; + _rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen); + pframe += (wps_offset + wpsielen); + pattrib->pktlen += (wps_offset + wpsielen); + + //now pframe is end of wsc ie, insert Primary Device Type & Device Name + // Primary Device Type + // Type: + *(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE ); + insert_len += 2; + + // Length: + *(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 ); + insert_len += 2; + + // Value: + // Category ID + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + insert_len += 2; + + // OUI + *(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI ); + insert_len += 4; + + // Sub Category ID + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + insert_len += 2; + + + // Device Name + // Type: + *(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + insert_len += 2; + + // Length: + *(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len ); + insert_len += 2; + + // Value: + _rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len ); + insert_len += pwdinfo->device_name_len; + + + //update wsc ie length + *(pframe_wscie+1) = (wpsielen -2) + insert_len; + + //pframe move to end + pframe+=insert_len; + pattrib->pktlen += insert_len; + + //copy remainder_ie to pframe + _rtw_memcpy(pframe, premainder_ie, remainder_ielen); + pframe += remainder_ielen; + pattrib->pktlen += remainder_ielen; + + } + else +#endif //CONFIG_P2P + { + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pattrib->pktlen += cur_network->IELength; + } + +#ifdef CONFIG_P2P + if(pwdinfo->role == P2P_ROLE_GO) + { + u32 len; + + len = build_beacon_p2p_ie(pwdinfo, pframe); + + pframe += len; + pattrib->pktlen += len; +#ifdef CONFIG_WFD + len = build_beacon_wfd_ie( pwdinfo, pframe ); + pframe += len; + pattrib->pktlen += len; +#endif //CONFIG_WFD + } +#endif //CONFIG_P2P + + goto _issue_bcn; + + } + + //below for ad-hoc mode + + //timestamp will be inserted by hardware + pframe += 8; + pattrib->pktlen += 8; + + // beacon interval: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + // capability info: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); + + //if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u8 erpinfo=0; + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); + + //ERP IE + pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); + } + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); + } + + + //todo:HT for adhoc + +_issue_bcn: + + pmlmepriv->update_bcn = _FALSE; + + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + if ((pattrib->pktlen + TXDESC_SIZE) > 512) + { + DBG_871X("beacon frame too large\n"); + return; + } + + pattrib->last_txcmdsz = pattrib->pktlen; + + //DBG_871X("issue bcn_sz=%d\n", pattrib->last_txcmdsz); + + dump_mgntframe(padapter, pmgntframe); + +} + +void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq) +{ + u8 *pwps_ie; + uint wps_ielen; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac, *bssid; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + unsigned int rate_len; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + //DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__); + return; + } + + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = pattrib->hdrlen; + pframe += pattrib->hdrlen; + + + if(cur_network->IELength>MAX_IE_SZ) + return; + +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + pwps_ie = rtw_get_wps_ie(cur_network->IEs, cur_network->IELength, NULL, &wps_ielen); + + //inerset & update wps_probe_resp_ie + if((pmlmepriv->wps_probe_resp_ie!=NULL) && pwps_ie && (wps_ielen>0)) + { + uint wps_offset, remainder_ielen; + u8 *premainder_ie; + + wps_offset = (uint)(pwps_ie - cur_network->IEs); + + premainder_ie = pwps_ie + wps_ielen; + + remainder_ielen = cur_network->IELength - wps_offset - wps_ielen; + + _rtw_memcpy(pframe, cur_network->IEs, wps_offset); + pframe += wps_offset; + pattrib->pktlen += wps_offset; + + wps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];//to get ie data len + if((wps_offset+wps_ielen+2)<=MAX_IE_SZ) + { + _rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen+2); + pframe += wps_ielen+2; + pattrib->pktlen += wps_ielen+2; + } + + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) + { + _rtw_memcpy(pframe, premainder_ie, remainder_ielen); + pframe += remainder_ielen; + pattrib->pktlen += remainder_ielen; + } + } + else + { + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pattrib->pktlen += cur_network->IELength; + } + + } + else +#endif + { + + //timestamp will be inserted by hardware + pframe += 8; + pattrib->pktlen += 8; + + // beacon interval: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + // capability info: 2 bytes + + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pattrib->pktlen += 2; + + //below for ad-hoc mode + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen); + + // DS parameter set + pframe =rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u8 erpinfo=0; + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen); + + //ERP IE + pframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen); + } + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen); + } + + + //todo:HT for adhoc + + } + +#ifdef CONFIG_P2P + if(pwdinfo->role == P2P_ROLE_GO && is_valid_p2p_probereq) + { + u32 len; + + len = build_probe_resp_p2p_ie(pwdinfo, pframe); + + pframe += len; + pattrib->pktlen += len; + } +#endif //CONFIG_P2P + + + pattrib->last_txcmdsz = pattrib->pktlen; + + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +void issue_probereq(_adapter *padapter, u8 blnbc) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned char *mac; + unsigned char bssrate[NumRates]; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + int bssrate_len = 0; + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+issue_probereq\n")); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + if ( 0 == blnbc ) + { + // unicast probe request frame + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + } + else + { + // broadcast probe request frame + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN); + } + + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_PROBEREQ); + + pframe += sizeof (struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr); + + pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeext->sitesurvey_res.ss_ssidlen, pmlmeext->sitesurvey_res.ss_ssid, &(pattrib->pktlen)); + + get_rate_set(padapter, bssrate, &bssrate_len); + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + + //add wps_ie for wps2.0 + if(pmlmepriv->probereq_wpsie_len>0 && pmlmepriv->probereq_wpsie_lenprobereq_wpsie, pmlmepriv->probereq_wpsie_len); + pframe += pmlmepriv->probereq_wpsie_len; + pattrib->pktlen += pmlmepriv->probereq_wpsie_len; + //pmlmepriv->probereq_wpsie_len = 0 ;//reset to zero + } + + + pattrib->last_txcmdsz = pattrib->pktlen; + + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing probe_req, tx_len=%d\n", pattrib->last_txcmdsz)); + + dump_mgntframe(padapter, pmgntframe); + + return; +} + +// if psta == NULL, indiate we are station(client) now... +void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned int val32; + unsigned short val16; + int use_shared_key = 0; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_AUTH); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + + if(psta)// for AP mode + { +#ifdef CONFIG_NATIVEAP_MLME + + _rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + + // setting auth algo number + val16 = (u16)psta->authalg; + + if(status != _STATS_SUCCESSFUL_) + val16 = 0; + + if (val16) { + val16 = cpu_to_le16(val16); + use_shared_key = 1; + } + + pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // setting auth seq number + val16 =(u16)psta->auth_seq; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // setting status code... + val16 = status; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // added challenging text... + if ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) + { + pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, psta->chg_txt, &(pattrib->pktlen)); + } +#endif + } + else + { + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); + + // setting auth algo number + val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)? 1: 0;// 0:OPEN System, 1:Shared key + if (val16) { + val16 = cpu_to_le16(val16); + use_shared_key = 1; + } + //DBG_8192C("%s auth_algo= %s auth_seq=%d\n",__FUNCTION__,(pmlmeinfo->auth_algo==0)?"OPEN":"SHARED",pmlmeinfo->auth_seq); + + //setting IV for auth seq #3 + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) + { + //DBG_8192C("==> iv(%d),key_index(%d)\n",pmlmeinfo->iv,pmlmeinfo->key_index); + val32 = ((pmlmeinfo->iv++) | (pmlmeinfo->key_index << 30)); + val32 = cpu_to_le32(val32); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&val32, &(pattrib->pktlen)); + + pattrib->iv_len = 4; + } + + pframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // setting auth seq number + val16 = pmlmeinfo->auth_seq; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen)); + + + // setting status code... + val16 = status; + val16 = cpu_to_le16(val16); + pframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen)); + + // then checking to see if sending challenging text... + if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1)) + { + pframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, pmlmeinfo->chg_txt, &(pattrib->pktlen)); + + SetPrivacy(fctrl); + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + + pattrib->encrypt = _WEP40_; + + pattrib->icv_len = 4; + + pattrib->pktlen += pattrib->icv_len; + + } + + } + + pattrib->last_txcmdsz = pattrib->pktlen; + + rtw_wep_encrypt(padapter, (u8 *)pmgntframe); + + dump_mgntframe(padapter, pmgntframe); + + return; +} + + +void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type) +{ +#ifdef CONFIG_AP_MODE + struct xmit_frame *pmgntframe; + struct ieee80211_hdr *pwlanhdr; + struct pkt_attrib *pattrib; + unsigned char *pbuf, *pframe; + unsigned short val; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + u8 *ie = pnetwork->IEs; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN); + _rtw_memcpy((void *)GetAddr2Ptr(pwlanhdr), myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy((void *)GetAddr3Ptr(pwlanhdr), get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + if ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP)) + SetFrameSubType(pwlanhdr, pkt_type); + else + return; + + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen += pattrib->hdrlen; + pframe += pattrib->hdrlen; + + //capability + val = *(unsigned short *)rtw_get_capability_from_ie(ie); + + pframe = rtw_set_fixed_ie(pframe, _CAPABILITY_ , (unsigned char *)&val, &(pattrib->pktlen)); + + status = cpu_to_le16(status); + pframe = rtw_set_fixed_ie(pframe , _STATUS_CODE_ , (unsigned char *)&status, &(pattrib->pktlen)); + + val = cpu_to_le16(pstat->aid | BIT(14) | BIT(15)); + pframe = rtw_set_fixed_ie(pframe, _ASOC_ID_ , (unsigned char *)&val, &(pattrib->pktlen)); + + if (pstat->bssratelen <= 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, pstat->bssratelen, pstat->bssrateset, &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pstat->bssrateset, &(pattrib->pktlen)); + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (pstat->bssratelen-8), pstat->bssrateset+8, &(pattrib->pktlen)); + } + +#ifdef CONFIG_80211N_HT + if ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option)) + { + uint ie_len=0; + + //FILL HT CAP INFO IE + //p = hostapd_eid_ht_capabilities_info(hapd, p); + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if(pbuf && ie_len>0) + { + _rtw_memcpy(pframe, pbuf, ie_len+2); + pframe += (ie_len+2); + pattrib->pktlen +=(ie_len+2); + } + + //FILL HT ADD INFO IE + //p = hostapd_eid_ht_operation(hapd, p); + pbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if(pbuf && ie_len>0) + { + _rtw_memcpy(pframe, pbuf, ie_len+2); + pframe += (ie_len+2); + pattrib->pktlen +=(ie_len+2); + } + + } +#endif + + //FILL WMM IE + if ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option)) + { + uint ie_len=0; + unsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + + for (pbuf = ie + _BEACON_IE_OFFSET_; ;pbuf+= (ie_len + 2)) + { + pbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if(pbuf && _rtw_memcmp(pbuf+2, WMM_PARA_IE, 6)) + { + _rtw_memcpy(pframe, pbuf, ie_len+2); + pframe += (ie_len+2); + pattrib->pktlen +=(ie_len+2); + + break; + } + + if ((pbuf == NULL) || (ie_len == 0)) + { + break; + } + } + + } + + + if (pmlmeinfo->assoc_AP_vendor == realtekAP) + { + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); + } + + //add WPS IE ie for wps 2.0 + if(pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len>0) + { + _rtw_memcpy(pframe, pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); + + pframe += pmlmepriv->wps_assoc_resp_ie_len; + pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len; + } + +#ifdef CONFIG_P2P + if((pwdinfo->role == P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE)) + { + u32 len; + + len = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code); + + pframe += len; + pattrib->pktlen += len; + } +#endif //CONFIG_P2P + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +#endif +} + +void issue_assocreq(_adapter *padapter) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe, *p; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned short val16; + unsigned int i, ie_len; + unsigned char rf_type, bssrate[NumRates]; + PNDIS_802_11_VARIABLE_IEs pIE; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + int bssrate_len = 0; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); + u8 p2pie[ 255 ] = { 0x00 }; + u16 p2pielen = 0; +#endif //CONFIG_P2P + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ASSOCREQ); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //caps + + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + pframe += 2; + pattrib->pktlen += 2; + + //listen interval + //todo: listen interval for power saving + val16 = cpu_to_le16(3); + _rtw_memcpy(pframe ,(unsigned char *)&val16, 2); + pframe += 2; + pattrib->pktlen += 2; + + //SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &(pattrib->pktlen)); + + //supported rate & extended supported rate +#if 0 + get_rate_set(padapter, bssrate, &bssrate_len); +#else + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pmlmeinfo->network.SupportedRates[bssrate_len] == 0) break; + bssrate[bssrate_len] = pmlmeinfo->network.SupportedRates[bssrate_len]; + } +#endif + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //RSN + p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _RSN_IE_2_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if (p != NULL) + { + pframe = rtw_set_ie(pframe, _RSN_IE_2_, ie_len, (p + 2), &(pattrib->pktlen)); + } + +#ifdef CONFIG_80211N_HT + //HT caps + if(padapter->mlmepriv.htpriv.ht_option==_TRUE) + { + p = rtw_get_ie((pmlmeinfo->network.IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_CAPABILITY_IE_, &ie_len, (pmlmeinfo->network.IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if ((p != NULL) && (!(is_ap_in_tkip(padapter)))) + { + _rtw_memcpy(&(pmlmeinfo->HT_caps), (p + 2), sizeof(struct HT_caps_element)); + + //to disable 40M Hz support while gd_bw_40MHz_en = 0 + if (pregpriv->cbw40_enable == 0) + { + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info &= (~(BIT(6) | BIT(1))); + } + else + { + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= BIT(1); + } + + //todo: disable SM power save mode + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= 0x000c; + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + //switch (pregpriv->rf_config) + switch(rf_type) + { + case RF_1T1R: + + //if(pregpriv->rx_stbc) + //pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);//RX STBC One spatial stream + + _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + + if(pregpriv->rx_stbc) + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);//RX STBC One spatial stream + + _rtw_memcpy(pmlmeinfo->HT_caps.HT_cap_element.MCS_rate, MCS_rate_2R, 16); + break; + } + #ifdef RTL8192C_RECONFIG_TO_1T1R + { + //if(pregpriv->rx_stbc) + //pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info |= cpu_to_le16(0x0100);//RX STBC One spatial stream + + _rtw_memcpy(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_rate_1R, 16); + } + #endif + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info = cpu_to_le16(pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info); + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, ie_len , (u8 *)(&(pmlmeinfo->HT_caps)), &(pattrib->pktlen)); + + } + } +#endif + + //vendor specific IE, such as WPA, WMM, WPS + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, WPA_OUI, 4)) || + (_rtw_memcmp(pIE->data, WMM_OUI, 4)) || + (_rtw_memcmp(pIE->data, WPS_OUI, 4))) + { + //Commented by Kurt 20110629 + //In some older APs, WPS handshake + //would be fail if we append vender extensions informations to AP + if(_rtw_memcmp(pIE->data, WPS_OUI, 4)){ + pIE->Length=14; + } + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &(pattrib->pktlen)); + } + break; + + default: + break; + } + + i += (pIE->Length + 2); + } + + if (pmlmeinfo->assoc_AP_vendor == realtekAP) + { + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen)); + } + +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state != P2P_STATE_NONE ) && ( pwdinfo->p2p_state != P2P_STATE_IDLE ) ) + { + // Should add the P2P IE in the association request frame. + // P2P OUI + + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20101109 + // According to the P2P Specification, the association request frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. Extended Listen Timing + // 3. Device Info + // Commented by Albert 20110516 + // 4. P2P Interface + + // P2P Capability + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + // Extended Listen Timing + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + p2pielen += 2; + + // Value: + // Availability Period + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Availability Interval + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + p2pielen += 2; + + // Device Info + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, myid( &padapter->eeprompriv ), ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + if ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) || + ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) ) + { + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); + } + else + { + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); + } + + p2pielen += 2; + + // Primary Device Type + // Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + p2pielen += 2; + + // OUI + *(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + p2pielen += 4; + + // Sub Category ID + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + p2pielen += 2; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + // P2P Interface + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE; + + // Length: + *(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D ); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Device Address + p2pielen += ETH_ALEN; + + p2pie[ p2pielen++ ] = 1; // P2P Interface Address Count + + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); // P2P Interface Address List + p2pielen += ETH_ALEN; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen ); + + } +#endif //CONFIG_P2P + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + +void issue_nulldata(_adapter *padapter, unsigned int power_mode) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s:%d\n", __FUNCTION__, power_mode); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + SetFrDs(fctrl); + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + SetToDs(fctrl); + } + + if (power_mode) + { + SetPwrMgt(fctrl); + } + + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + + return; +} + + +void issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl, *qc; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + pattrib->hdrlen +=2; + pattrib->qos_en = _TRUE; + pattrib->eosp = 1; + pattrib->ack_policy = 0; + pattrib->mdata = 0; + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + SetFrDs(fctrl); + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + SetToDs(fctrl); + } + + if(pattrib->mdata) + SetMData(fctrl); + + qc = (unsigned short *)(pframe + pattrib->hdrlen - 2); + + SetPriority(qc, tid); + + SetEOSP(qc, pattrib->eosp); + + SetAckpolicy(qc, pattrib->ack_policy); + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr_qos); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr_qos); + + pattrib->last_txcmdsz = pattrib->pktlen; + dump_mgntframe(padapter, pmgntframe); + +} + +void issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_DEAUTH); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + reason = cpu_to_le16(reason); + pframe = rtw_set_fixed_ie(pframe, _RSON_CODE_ , (unsigned char *)&reason, &(pattrib->pktlen)); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); +} + +void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) +{ + u8 category = WLAN_CATEGORY_BACK; + u16 start_seq; + u16 BA_para_set; + u16 reason_code; + u16 BA_timeout_value; + u16 BA_starting_seqctrl; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + u8 *pframe; + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct registry_priv *pregpriv = &padapter->registrypriv; + + + DBG_871X("%s, category=%d, action=%d, status=%d\n", __FUNCTION__, category, action, status); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + //_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + + status = cpu_to_le16(status); + + + if (category == 3) + { + switch (action) + { + case 0: //ADDBA req + do { + pmlmeinfo->dialogToken++; + } while (pmlmeinfo->dialogToken == 0); + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->dialogToken), &(pattrib->pktlen)); + + BA_para_set = (0x1002 | ((status & 0xf) << 2)); //immediate ack & 64 buffer size + //sys_mib.BA_para_set = 0x0802; //immediate ack & 32 buffer size + BA_para_set = cpu_to_le16(BA_para_set); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + + //BA_timeout_value = 0xffff;//max: 65535 TUs(~ 65 ms) + BA_timeout_value = 5000;//~ 5ms + BA_timeout_value = cpu_to_le16(BA_timeout_value); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_timeout_value)), &(pattrib->pktlen)); + + //if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) + if ((psta = rtw_get_stainfo(pstapriv, raddr)) != NULL) + { + start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07]&0xfff) + 1; + + DBG_871X("BA_starting_seqctrl = %d for TID=%d\n", start_seq, status & 0x07); + + psta->BA_starting_seqctrl[status & 0x07] = start_seq; + + BA_starting_seqctrl = start_seq << 4; + } + + BA_starting_seqctrl = cpu_to_le16(BA_starting_seqctrl); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_starting_seqctrl)), &(pattrib->pktlen)); + break; + + case 1: //ADDBA rsp + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->ADDBA_req.dialog_token), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&status), &(pattrib->pktlen)); + + //BA_para_set = cpu_to_le16((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size + BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size + + if(pregpriv->ampdu_amsdu==0)//disabled + BA_para_set = cpu_to_le16(BA_para_set & ~BIT(0)); + else if(pregpriv->ampdu_amsdu==1)//enabled + BA_para_set = cpu_to_le16(BA_para_set | BIT(0)); + else //auto + BA_para_set = cpu_to_le16(BA_para_set); + + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen)); + break; + case 2://DELBA + BA_para_set = (status & 0x1F) << 3; + BA_para_set = cpu_to_le16(BA_para_set); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen)); + + reason_code = 37;//Requested from peer STA as it does not want to use the mechanism + reason_code = cpu_to_le16(reason_code); + pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(reason_code)), &(pattrib->pktlen)); + break; + default: + break; + } + } + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); +} + +static void issue_action_BSSCoexistPacket(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + unsigned char category, action; + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct wlan_network *pnetwork = NULL; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + _queue *queue = &(pmlmepriv->scanned_queue); + u8 InfoContent[16] = {0}; + u8 ICS[8][15]; + + if((pmlmepriv->num_FortyMHzIntolerant==0) || (pmlmepriv->num_sta_no_ht==0)) + return; + + if(_TRUE == pmlmeinfo->bwmode_updated) + return; + + + DBG_871X("%s\n", __FUNCTION__); + + + category = WLAN_CATEGORY_PUBLIC; + action = ACT_PUBLIC_BSSCOEXIST; + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + + + // + if(pmlmepriv->num_FortyMHzIntolerant>0) + { + u8 iedata=0; + + iedata |= BIT(2);//20 MHz BSS Width Request + + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + } + + + // + _rtw_memset(ICS, 0, sizeof(ICS)); + if(pmlmepriv->num_sta_no_ht>0) + { + int i; + + _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + phead = get_list_head(queue); + plist = get_next(phead); + + while(1) + { + int len; + u8 *p; + WLAN_BSSID_EX *pbss_network; + + if (rtw_end_of_queue_search(phead,plist)== _TRUE) + break; + + pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list); + + plist = get_next(plist); + + pbss_network = (WLAN_BSSID_EX *)&pnetwork->network; + + p = rtw_get_ie(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_); + if((p==NULL) || (len==0))//non-HT + { + if((pbss_network->Configuration.DSConfig<=0) || (pbss_network->Configuration.DSConfig>14)) + continue; + + ICS[0][pbss_network->Configuration.DSConfig]=1; + + if(ICS[0][0] == 0) + ICS[0][0] = 1; + } + + } + + _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); + + + for(i= 0;i<8;i++) + { + if(ICS[i][0] == 1) + { + int j, k = 0; + + InfoContent[k] = i; + //SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent,i); + k++; + + for(j=1;j<=14;j++) + { + if(ICS[i][j]==1) + { + if(k<16) + { + InfoContent[k] = j; //channel number + //SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j); + k++; + } + } + } + + pframe = rtw_set_ie(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &(pattrib->pktlen)); + + } + + } + + + } + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta = NULL; + //struct recv_reorder_ctrl *preorder_ctrl; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u16 tid; + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) + return _SUCCESS; + + psta = rtw_get_stainfo(pstapriv, addr); + if(psta==NULL) + return _SUCCESS; + + //DBG_8192C("%s:%s\n", __FUNCTION__, (initiator==0)?"RX_DIR":"TX_DIR"); + + if(initiator==0) // recipient + { + for(tid = 0;tidrecvreorder_ctrl[tid].enable == _TRUE) + { + DBG_8192C("rx agg disable tid(%d)\n",tid); + issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F)); + psta->recvreorder_ctrl[tid].enable = _FALSE; + psta->recvreorder_ctrl[tid].indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d indicate_seq:%u \n", __FUNCTION__, __LINE__, + psta->recvreorder_ctrl[tid].indicate_seq); + #endif + } + } + } + else if(initiator == 1)// originator + { + //DBG_8192C("tx agg_enable_bitmap(0x%08x)\n", psta->htpriv.agg_enable_bitmap); + for(tid = 0;tidhtpriv.agg_enable_bitmap & BIT(tid)) + { + DBG_8192C("tx agg disable tid(%d)\n",tid); + issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid <<1) |initiator)&0x1F) ); + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + + } + } + } + + return _SUCCESS; + +} + +unsigned int send_beacon(_adapter *padapter) +{ + u8 bxmitok = _FALSE; + int retry=0; + +#ifdef CONFIG_PCI_HCI + + //DBG_871X("%s\n", __FUNCTION__); + + issue_beacon(padapter); + + return _SUCCESS; + +#endif + +#ifdef CONFIG_USB_HCI + do{ + + issue_beacon(padapter); + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_TX_BCN_DONE, (u8 *)(&bxmitok)); + + }while((_FALSE == bxmitok) &&((retry++)<100 )); + + if(retry == 100) + { + DBG_871X("send_beacon, fail!\n"); + return _FAIL; + } + else + { + return _SUCCESS; + } +#endif + +} + +/**************************************************************************** + +Following are some utitity fuctions for WiFi MLME + +*****************************************************************************/ + +BOOLEAN IsLegal5GChannel( + IN PADAPTER Adapter, + IN u8 channel) +{ + + int i=0; + u8 Channel_5G[45] = {36,38,40,42,44,46,48,50,52,54,56,58, + 60,62,64,100,102,104,106,108,110,112,114,116,118,120,122, + 124,126,128,130,132,134,136,138,140,149,151,153,155,157,159, + 161,163,165}; + for(i=0;imlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + static unsigned char prev_survey_channel = 0; + static unsigned int p2p_scan_count = 0; +#endif //CONFIG_P2P + +#ifdef CONFIG_TDLS + u32 v, bit_6=1<<6; + if(pmlmeinfo->tdls_dis_req==1){ + SelectChannel(padapter, pmlmeext->cur_channel); + + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + //when we already set at a direct link and also want to dicovery TDLS STAs + //it is used to avoiding RCR DATA BIT on + v = rtw_read32(padapter, 0x0608); + v &= ~(bit_6); + rtw_write32(padapter, 0x0608, v); + + issue_tdls_dis_req(padapter); + + set_survey_timer(pmlmeext, 300); + + pmlmeinfo->tdls_dis_req=2; + return; + } + else if(pmlmeinfo->tdls_dis_req==2){ + pmlmeinfo->tdls_dis_req=3; + + //config MSR + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + //turn on dynamic functions + Restore_DM_Func_Flag(padapter); + + report_surveydone_event(padapter); + + pmlmeext->chan_scan_time = SURVEY_TO; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + return; + } +#endif + +#ifdef CONFIG_P2P + survey_channel = 0; + ScanType = SCAN_PASSIVE; + + if ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) + { + if ( pwdinfo->find_phase_state_exchange_cnt != 0 ) + { + // Commented by Albert 2011/06/03 + // The driver is in the find phase, it should go through the social channel. + survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx]; + ScanType = SCAN_ACTIVE; + } + else + { + // Commented by Albert 2011/06/03 + // The driver is in the scan phase, it should go through all the channel. + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; + ScanType = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ScanType; + } + } + else if ( ( P2P_STATE_NONE == pwdinfo->p2p_state ) || ( P2P_STATE_IDLE == pwdinfo->p2p_state ) ) + { + // Commented by Albert 20110805 + // The following code will be executed only when the P2P is disable. + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; + ScanType = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ScanType; + } +#else + { + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; + ScanType = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ScanType; + } +#endif //CONFIG_P2P + + if(survey_channel != 0) + { + + //DBG_871X("switching to channel:%d at %dms\n", + // survey_channel, rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time) + //); + //PAUSE 4-AC Queue when site_survey + //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); + //val8 |= 0x0f; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); + + if(pmlmeext->sitesurvey_res.channel_idx == 0) + { + set_channel_bwmode(padapter, survey_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } + else + { + SelectChannel(padapter, survey_channel); + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1) + pmlmeinfo->tdls_cur_channel =survey_channel; +#endif + + //DBG_871X("%s scan_mode:%d, ScanType:%d\n", __FUNCTION__, pmlmeext->sitesurvey_res.scan_mode, ScanType); + if((pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) && (ScanType == SCAN_ACTIVE)) + { + +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || + ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) + ) + { + issue_probereq_p2p(padapter); + issue_probereq_p2p(padapter); + issue_probereq_p2p(padapter); + } + else +#endif //CONFIG_P2P + { + //todo: to issue two probe req??? + issue_probereq(padapter, 1); + //rtw_msleep_os(SURVEY_TO>>1); + issue_probereq(padapter, 1); + } + } + + set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); + + } + else + { + + // channel number is 0 or this channel is not valid. +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) + { + DBG_8192C( "[%s] find phase exchange cnt = %d\n", __FUNCTION__, pwdinfo->find_phase_state_exchange_cnt ); + } + + if ( ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) && + ( pwdinfo->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_CNT ) ) + { + // Set the P2P State to the listen state of find phase and set the current channel to the listen channel + pwdinfo->p2p_state = P2P_STATE_FIND_PHASE_LISTEN; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + set_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + _set_timer( &pwdinfo->find_phase_timer, ( u32 ) ( ( u32 ) ( pwdinfo->listen_dwell ) * 100 ) ); + } + else +#endif //CONFIG_P2P + + { + +#ifdef CONFIG_ANTENNA_DIVERSITY + // 20100721:Interrupt scan operation here. + // For SW antenna diversity before link, it needs to switch to another antenna and scan again. + // It compares the scan result and select beter one to do connection. + if(padapter->HalFunc.SwAntDivBeforeLinkHandler(padapter)) + { + pmlmeext->sitesurvey_res.bss_cnt = 0; + pmlmeext->sitesurvey_res.channel_idx = -1; + pmlmeext->chan_scan_time = SURVEY_TO /2; + set_survey_timer(pmlmeext, pmlmeext->chan_scan_time); + return; + } +#endif + +#ifdef CONFIG_P2P + if ( ( pwdinfo->p2p_state == P2P_STATE_SCAN ) || ( pwdinfo->p2p_state == P2P_STATE_FIND_PHASE_SEARCH ) ) + { + pwdinfo->p2p_state = P2P_STATE_LISTEN; + } +#endif //CONFIG_P2P + + pmlmeext->sitesurvey_res.state = SCAN_COMPLETE; + + //switch back to the original channel + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); + +#ifdef CONFIG_P2P + if ( pwdinfo->p2p_state == P2P_STATE_GONEGO_OK ) + { + DBG_8192C( "[%s] In P2P WPS mode, stay in the peer operating channel = %d\n", __FUNCTION__, pwdinfo->peer_operating_ch ); + set_channel_bwmode(padapter, pwdinfo->peer_operating_ch, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + } + else +#endif //CONFIG_P2P + { + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + } + + //flush 4-AC Queue after site_survey + //val8 = 0; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8)); + + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + //config MSR + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + //turn on dynamic functions + Restore_DM_Func_Flag(padapter); + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); + + if (is_client_associated_to_ap(padapter) == _TRUE) + { + //issue null data + issue_nulldata(padapter, 0); + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1){ + u8 i, min; + pmlmeinfo->tdls_ch_sensing=0; + pmlmeinfo->tdls_cur_channel=1; + min=pmlmeinfo->tdls_collect_pkt_num[0]; + for(i=1; i<14-1; i++){ + if(min > pmlmeinfo->tdls_collect_pkt_num[i]){ + pmlmeinfo->tdls_cur_channel=i+1; + min=pmlmeinfo->tdls_collect_pkt_num[i]; + } + pmlmeinfo->tdls_collect_pkt_num[i]=0; + } + pmlmeinfo->tdls_collect_pkt_num[0]=0; + pmlmeinfo->tdls_candidate_ch=pmlmeinfo->tdls_cur_channel; + DBG_8192C("TDLS channel sensing done, candidate channel: %02x\n", pmlmeinfo->tdls_candidate_ch); + pmlmeinfo->tdls_cur_channel=0; + + // If we support TDLS, then when we finished site survey, + // we stil turn RCR_CBSSID_DATA off, + // such we can receive all kinds of data frames. + v = rtw_read32(padapter, 0x0608); + bit_6=1<<6; + v &= ~(bit_6); + rtw_write32(padapter, 0x0608, v); + } +#else + report_surveydone_event(padapter); +#endif + pmlmeext->chan_scan_time = SURVEY_TO; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + + issue_action_BSSCoexistPacket(padapter); + issue_action_BSSCoexistPacket(padapter); + issue_action_BSSCoexistPacket(padapter); + + } + + } + + return; + +} + +//collect bss info from Beacon and Probe response frames. +u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid) +{ + int i; + u32 len; + u8 *p; + u16 val16, subtype; + u8 *pframe = precv_frame->u.hdr.rx_data; + u32 packet_len = precv_frame->u.hdr.len; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + len = packet_len - sizeof(struct ieee80211_hdr_3addr); + + if (len > MAX_IE_SZ) + { + //DBG_8192C("IE too long for survey event\n"); + return _FAIL; + } + + _rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX)); + + subtype = GetFrameSubType(pframe) >> 4; + + if(subtype==WIFI_BEACON) + bssid->Reserved[0] = 1; + + bssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len; + + //below is to copy the information element + bssid->IELength = len; + _rtw_memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength); + + //get the signal strength + //bssid->Rssi = precv_frame->u.hdr.attrib.signal_strength; // 0-100 index. + bssid->Rssi = precv_frame->u.hdr.attrib.RecvSignalPower; // in dBM.raw data + bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.signal_qual;//in percentage + bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.signal_strength;//in percentage +#ifdef CONFIG_ANTENNA_DIVERSITY + //padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); +#endif + + // checking SSID + if ((p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_)) == NULL) + { + DBG_871X("marc: cannot find SSID for survey event\n"); + return _FAIL; + } + + if (*(p + 1)) + { + _rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); + bssid->Ssid.SsidLength = *(p + 1); + } + else + { + bssid->Ssid.SsidLength = 0; + } + + _rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX); + + //checking rate info... + i = 0; + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates, (p + 2), len); + i = len; + } + + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if (p != NULL) + { + _rtw_memcpy(bssid->SupportedRates + i, (p + 2), len); + } + + //todo: +#if 0 + if (judge_network_type(bssid->SupportedRates, (len + i)) == WIRELESS_11B) + { + bssid->NetworkTypeInUse = Ndis802_11DS; + } + else +#endif + { + bssid->NetworkTypeInUse = Ndis802_11OFDM24; + } + + // Checking for DSConfig + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + + bssid->Configuration.DSConfig = 0; + bssid->Configuration.Length = 0; + + if (p) + { + bssid->Configuration.DSConfig = *(p + 2); + } + else + {// In 5G, some ap do not have DSSET IE + // checking HT info for channel + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if(p) + { + struct HT_info_element *HT_info = (struct HT_info_element *)(p + 2); + bssid->Configuration.DSConfig = HT_info->primary_channel; + } + else + { // use current channel + if (padapter->mlmeextpriv.sitesurvey_res.state == SCAN_PROCESS) + bssid->Configuration.DSConfig = padapter->mlmeextpriv.channel_set[padapter->mlmeextpriv.sitesurvey_res.channel_idx].ChannelNum; + else + bssid->Configuration.DSConfig = padapter->mlmeextpriv.cur_channel; + } + } + + _rtw_memcpy(&bssid->Configuration.BeaconPeriod, rtw_get_beacon_interval_from_ie(bssid->IEs), 2); + + + bssid->Configuration.BeaconPeriod = le32_to_cpu(bssid->Configuration.BeaconPeriod); + + val16 = rtw_get_capability((WLAN_BSSID_EX *)bssid); + + if (val16 & BIT(0)) + { + bssid->InfrastructureMode = Ndis802_11Infrastructure; + _rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN); + } + else + { + bssid->InfrastructureMode = Ndis802_11IBSS; + _rtw_memcpy(bssid->MacAddress, GetAddr3Ptr(pframe), ETH_ALEN); + } + + if (val16 & BIT(4)) + bssid->Privacy = 1; + else + bssid->Privacy = 0; + + bssid->Configuration.ATIMWindow = 0; + + //20/40 BSS Coexistence check + if((pregistrypriv->wifi_spec==1) && (_FALSE == pmlmeinfo->bwmode_updated)) + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_); + if(p && len>0) + { + struct HT_caps_element *pHT_caps; + pHT_caps = (struct HT_caps_element *)(p + 2); + + if(pHT_caps->HT_cap_element.HT_caps_info&BIT(14)) + { + pmlmepriv->num_FortyMHzIntolerant++; + } + } + else + { + pmlmepriv->num_sta_no_ht++; + } + + } + + return _SUCCESS; + +} + +void start_create_ibss(_adapter* padapter) +{ + unsigned short caps; + u32 val32; + u8 val8; + u8 join_type; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; + pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); + + //update wireless mode + update_wireless_mode(padapter); + + //udpate capability + caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); + update_capinfo(padapter, caps); + if(caps&cap_IBSS)//adhoc master + { + //set_opmode_cmd(padapter, adhoc);//removed + + val8 = 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //switch channel + //SelectChannel(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE); + set_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + + beacon_timing_control(padapter); + + //set msr to WIFI_FW_ADHOC_STATE + pmlmeinfo->state = WIFI_FW_ADHOC_STATE; + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + //issue beacon + if(send_beacon(padapter)==_FAIL) + { + RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("issuing beacon frame fail....\n")); + + report_join_res(padapter, -1); + pmlmeinfo->state = WIFI_FW_NULL_STATE; + } + else + { + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress); + join_type = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + report_join_res(padapter, 1); + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; + } + } + else + { + DBG_871X("start_create_ibss, invalid cap:%x\n", caps); + return; + } + +} + +void start_clnt_join(_adapter* padapter) +{ + unsigned short caps; + u8 val8; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + + + pmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig; + pmlmeinfo->bcn_interval = get_beacon_interval(pnetwork); + + //update wireless mode + update_wireless_mode(padapter); + + //udpate capability + caps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork); + update_capinfo(padapter, caps); + if (caps&cap_ESS) + { + Set_NETYPE0_MSR(padapter, WIFI_FW_STATION_STATE); + + val8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //switch channel + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + //here wait for receiving the beacon to start auth + //and enable a timer + set_link_timer(pmlmeext, decide_wait_for_beacon_timeout(pmlmeinfo->bcn_interval)); + + pmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE; + } + else if (caps&cap_IBSS) //adhoc client + { + Set_NETYPE0_MSR(padapter, WIFI_FW_ADHOC_STATE); + + val8 = 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //switch channel + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + beacon_timing_control(padapter); + + pmlmeinfo->state = WIFI_FW_ADHOC_STATE; + + report_join_res(padapter, 1); + } + else + { + //DBG_8192C("marc: invalid cap:%x\n", caps); + return; + } + +} + +void start_clnt_auth(_adapter* padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + _cancel_timer_ex(&pmlmeext->link_timer); + + pmlmeinfo->state &= (~WIFI_FW_AUTH_NULL); + pmlmeinfo->state |= WIFI_FW_AUTH_STATE; + + pmlmeinfo->auth_seq = 1; + pmlmeinfo->reauth_count = 0; + pmlmeinfo->reassoc_count = 0; + pmlmeinfo->link_count = 0; + + issue_auth(padapter, NULL, 0); + + set_link_timer(pmlmeext, REAUTH_TO); + +} + + +void start_clnt_assoc(_adapter* padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + _cancel_timer_ex(&pmlmeext->link_timer); + + pmlmeinfo->state &= (~(WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE)); + pmlmeinfo->state |= (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE); + + issue_assocreq(padapter); + + set_link_timer(pmlmeext, REASSOC_TO); +} + +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //check A3 + if (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) + return _SUCCESS; + + DBG_871X("%s\n", __FUNCTION__); + + if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + { + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_del_sta_event(padapter, MacAddr, reason); + } + else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) + { + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_join_res(padapter, -2); + } + } + + return _SUCCESS; +} + +/**************************************************************************** + +Following are the functions to report events + +*****************************************************************************/ + +void report_survey_event(_adapter *padapter, union recv_frame *precv_frame) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct survey_event *psurvey_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + //u8 *pframe = precv_frame->u.hdr.rx_data; + //uint len = precv_frame->u.hdr.len; +#ifdef CONFIG_TDLS + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 *pframe = get_recvframe_data(precv_frame); +#endif + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct survey_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct survey_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_Survey); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + psurvey_evt = (struct survey_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + +#ifdef CONFIG_TDLS + //when tdls_dis_req is on, it would only report STAs who respond TDLS discovery response frame + if((pmlmeinfo->tdls_dis_req==1 || pmlmeinfo->tdls_dis_req==2)){ + if(*(pframe+24)==0x04 && *(pframe+25)==TDLS_DISCOVERY_RESPONSE){ + if (collect_tdls_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL){ + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pevtcmd, cmdsz); + return; + } + } + }else +#endif + if (collect_bss_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pevtcmd, cmdsz); + return; + } + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + pmlmeext->sitesurvey_res.bss_cnt++; + + return; + +} + +void report_surveydone_event(_adapter *padapter) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct surveydone_event *psurveydone_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct surveydone_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct surveydone_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_SurveyDone); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + psurveydone_evt = (struct surveydone_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + psurveydone_evt->bss_cnt = pmlmeext->sitesurvey_res.bss_cnt; + + DBG_871X("survey done event(%x)\n", psurveydone_evt->bss_cnt); + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; + +} + +void report_join_res(_adapter *padapter, int res) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct joinbss_event *pjoinbss_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct joinbss_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_JoinBss); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + pjoinbss_evt = (struct joinbss_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + _rtw_memcpy((unsigned char *)(&(pjoinbss_evt->network.network)), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); + pjoinbss_evt->network.join_res = pjoinbss_evt->network.aid = res; + + DBG_871X("report_join_res(%d)\n", res); + + #ifdef CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network); + #endif //CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; + +} + +void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct stadel_event *pdel_sta_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct stadel_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_DelSTA); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + pdel_sta_evt = (struct stadel_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + _rtw_memcpy((unsigned char *)(&(pdel_sta_evt->macaddr)), MacAddr, ETH_ALEN); + _rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd),(unsigned char *)(&reason),2); + + DBG_871X("rtl8192: delete STA\n"); + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; +} + +void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx) +{ + struct cmd_obj *pcmd_obj; + u8 *pevtcmd; + u32 cmdsz; + struct stassoc_event *padd_sta_evt; + struct C2HEvent_Header *pc2h_evt_hdr; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + + if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + cmdsz = (sizeof(struct stassoc_event) + sizeof(struct C2HEvent_Header)); + if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) + { + rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); + return; + } + + _rtw_init_listhead(&pcmd_obj->list); + + pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT); + pcmd_obj->cmdsz = cmdsz; + pcmd_obj->parmbuf = pevtcmd; + + pcmd_obj->rsp = NULL; + pcmd_obj->rspsz = 0; + + pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd); + pc2h_evt_hdr->len = sizeof(struct stassoc_event); + pc2h_evt_hdr->ID = GEN_EVT_CODE(_AddSTA); + pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq); + + padd_sta_evt = (struct stassoc_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); + _rtw_memcpy((unsigned char *)(&(padd_sta_evt->macaddr)), MacAddr, ETH_ALEN); + padd_sta_evt->cam_id = cam_idx; + + DBG_871X("report_add_sta_event: add STA\n"); + + rtw_enqueue_cmd(pcmdpriv, pcmd_obj); + + return; +} + + +/**************************************************************************** + +Following are the event callback functions + +*****************************************************************************/ + +//for sta/adhoc mode +static void update_sta_info(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //ERP + VCS_update(padapter, psta); + + + //HT + if(pmlmepriv->htpriv.ht_option) + { + psta->htpriv.ht_option = _TRUE; + + psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable; + + if (support_short_GI(padapter, &(pmlmeinfo->HT_caps))) + psta->htpriv.sgi = _TRUE; + + psta->qos_option = _TRUE; + + } + else + { + psta->htpriv.ht_option = _FALSE; + + psta->htpriv.ampdu_enable = _FALSE; + + psta->htpriv.sgi = _FALSE; + + psta->qos_option = _FALSE;//? + + } + + psta->htpriv.bwmode = pmlmeext->cur_bwmode; + psta->htpriv.ch_offset = pmlmeext->cur_ch_offset; + + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + + //QoS + if(pmlmepriv->qospriv.qos_option) + psta->qos_option = _TRUE; + + + psta->state = _FW_LINKED; + +} + +u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0}; + +void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) +{ + struct sta_info *psta, *psta_bmc; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + struct sta_priv *pstapriv = &padapter->stapriv; + u8 join_type, init_rts_rate; + + if(join_res < 0) + { + join_type = 1; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); + return; + } + + if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + //for bc/mc + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(psta_bmc) + { + pmlmeinfo->FW_sta_info[psta_bmc->mac_id].psta = psta_bmc; + update_bmc_sta_support_rate(padapter, psta_bmc->mac_id); + Update_RA_Entry(padapter, psta_bmc->mac_id); + } + } + + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); + if (psta)//only for infra. mode + { + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; + } + + //turn on dynamic functions + Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); + + // update IOT-releated issue + update_IOT_info(padapter); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates); + + //BCN interval + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval)); + + //udpate capability + update_capinfo(padapter, pmlmeinfo->capability); + + //WMM, Update EDCA param + WMMOnAssocRsp(padapter); + + //HT + HTOnAssocRsp(padapter); + + //update sta_info + if (psta) //only for infra. mode + { + //DBG_871X("set_sta_rate & update_sta_info\n"); + + //set per sta rate after updating HT cap. + set_sta_rate(padapter, psta); + + update_sta_info(padapter, psta); + } + + join_type = 2; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) + { + // correcting TSF + correct_TSF(padapter, pmlmeext); + + //set_link_timer(pmlmeext, DISCONNECT_TO); + pmlmeext->linked_to = LINKED_TO; + } + +#ifdef CONFIG_LPS + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0); +#endif + + DBG_871X("=>%s\n", __FUNCTION__); + +} + +void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 join_type; + + DBG_871X("%s\n", __FUNCTION__); + + if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + if(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)//adhoc master or sta_count>1 + { + //nothing to do + } + else//adhoc client + { + //update TSF Value + //update_TSF(pmlmeext, pframe, len); + + // correcting TSF + correct_TSF(padapter, pmlmeext); + + //start beacon + if(send_beacon(padapter)==_FAIL) + { + pmlmeinfo->FW_sta_info[psta->mac_id].status = 0; + + pmlmeinfo->state ^= WIFI_FW_ADHOC_STATE; + + return; + } + + pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; + + } + + join_type = 2; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + } + + pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; + + //rate radaptive + Update_RA_Entry(padapter, psta->mac_id); + + //update adhoc sta_info + update_sta_info(padapter, psta); + + pmlmeext->linked_to = LINKED_TO; + +} + +void mlmeext_sta_del_event_callback(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter)) + { + //set_opmode_cmd(padapter, infra_client_with_mlme); + + //switch to the 20M Hz mode after disconnect + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); + + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + flush_all_cam_entry(padapter); + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + //set MSR to no link state + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + pmlmeext->linked_to = 0; + _cancel_timer_ex(&pmlmeext->link_timer); + + } + +} + +/**************************************************************************** + +Following are the functions for the timer handlers + +*****************************************************************************/ + +void _linked_rx_signal_strehgth_display(_adapter *padapter) +{ + int UndecoratedSmoothedPWDB; + DBG_8192C("============ linked status check ===================\n"); + DBG_8192C("pathA Rx SNRdb:%d\n",padapter->recvpriv.RxSNRdB[0]); + DBG_8192C("pathA Rx PWDB:%d\n",padapter->recvpriv.rxpwdb); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB); + DBG_8192C("UndecoratedSmoothedPWDB:%d\n",UndecoratedSmoothedPWDB); + DBG_8192C("Rx RSSI:%d\n",padapter->recvpriv.rssi); + DBG_8192C("Rx Signal_strength:%d\n",padapter->recvpriv.signal_strength); + DBG_8192C("Rx Signal_qual:%d \n",padapter->recvpriv.signal_qual); + DBG_8192C("============ linked status check ===================\n"); + DBG_8192C(" DIG PATH-A(0x%02x), PATH-B(0x%02x)\n",rtw_read8(padapter,0xc50),rtw_read8(padapter,0xc58)); + DBG_8192C(" OFDM -Alarm DA2(0x%04x),DA4(0x%04x),DA6(0x%04x),DA8(0x%04x)\n", + rtw_read16(padapter,0xDA2),rtw_read16(padapter,0xDA4),rtw_read16(padapter,0xDA6),rtw_read16(padapter,0xDA8)); + + DBG_8192C(" CCK -Alarm A5B(0x%02x),A5C(0x%02x)\n",rtw_read8(padapter,0xA5B),rtw_read8(padapter,0xA5C)); + +} + +void linked_status_chk(_adapter *padapter) +{ + u32 i; + struct sta_info *psta; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct recv_priv *precvpriv = &(padapter->recvpriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + + if (is_client_associated_to_ap(padapter)) + { + if(padapter->bRxRSSIDisplay) + _linked_rx_signal_strehgth_display(padapter); + + //linked infrastructure client mode + if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) + { + /*to monitor whether the AP is alive or not*/ + if (psta->sta_stats.last_rx_pkts == psta->sta_stats.rx_pkts) + { + // Commented by Albert 2010/07/21 + // In this case, there is no any rx packet received by driver. + + #ifdef DBG_ROAMING_TEST + if(pmlmeext->retry<1) + #else + if(pmlmeext->retry<8)// Alter the retry limit to 8 + #endif + { + if(pmlmeext->retry==0) + { + _rtw_memcpy(pmlmeext->sitesurvey_res.ss_ssid, pmlmeinfo->network.Ssid.Ssid, pmlmeinfo->network.Ssid.SsidLength); + pmlmeext->sitesurvey_res.ss_ssidlen = pmlmeinfo->network.Ssid.SsidLength; + pmlmeext->sitesurvey_res.scan_mode = SCAN_ACTIVE; + pmlmeext->sitesurvey_res.state = SCAN_DISABLE; + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + if(padapter->HalFunc.sreset_linked_status_check) + padapter->HalFunc.sreset_linked_status_check(padapter); + #endif + + //DBG_871X("issue_probereq to check if ap alive, retry=%d\n", pmlmeext->retry); + + // In order to know the AP's current state, try to send the probe request + // to trigger the AP to send the probe response. + issue_probereq(padapter, 0); + issue_probereq(padapter, 0); + issue_probereq(padapter, 0); + } + + pmlmeext->retry++; + pmlmeext->linked_to = LINKED_TO; + } + else + { + pmlmeext->retry = 0; + DBG_871X("no beacon to call receive_disconnect()\n"); + receive_disconnect(padapter, pmlmeinfo->network.MacAddress + , 65535// indicate disconnect caused by no rx + ); + pmlmeinfo->link_count = 0; + return; + } + } + else + { + pmlmeext->retry = 0; + psta->sta_stats.last_rx_pkts = psta->sta_stats.rx_pkts; + //set_link_timer(pmlmeext, DISCONNECT_TO); + pmlmeext->linked_to = LINKED_TO; + } + + /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ + if (pmlmeinfo->link_count++ == 0) + { + pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; + } + else if ((pmlmeinfo->link_count & 0xf) == 0) + { + if ( pxmitpriv->last_tx_pkts == pxmitpriv->tx_pkts) + { + //DBG_871X("(Interface %d)issue nulldata to keep alive\n",padapter->dvobjpriv.InterfaceNumber); + issue_nulldata(padapter, 0); + } + + pxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts; + } + + } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) + } + else if (is_client_associated_to_ibss(padapter)) + { + //linked IBSS mode + //for each assoc list entry to check the rx pkt counter + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) + { + if (pmlmeinfo->FW_sta_info[i].status == 1) + { + psta = pmlmeinfo->FW_sta_info[i].psta; + + if(NULL==psta) continue; + + if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) + { + + if(pmlmeinfo->FW_sta_info[i].retry<3) + { + pmlmeinfo->FW_sta_info[i].retry++; + } + else + { + pmlmeinfo->FW_sta_info[i].retry = 0; + pmlmeinfo->FW_sta_info[i].status = 0; + report_del_sta_event(padapter, psta->hwaddr + , 65535// indicate disconnect caused by no rx + ); + } + } + else + { + pmlmeinfo->FW_sta_info[i].retry = 0; + pmlmeinfo->FW_sta_info[i].rx_pkt = (u32)psta->sta_stats.rx_pkts; + } + } + } + + //set_link_timer(pmlmeext, DISCONNECT_TO); + pmlmeext->linked_to = LINKED_TO; + + } + +} + +void survey_timer_hdl(_adapter *padapter) +{ + struct cmd_obj *ph2c; + struct sitesurvey_parm *psurveyPara; + struct cmd_priv *pcmdpriv=&padapter->cmdpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + //DBG_8192C("marc: survey timer\n"); + + //issue rtw_sitesurvey_cmd + if (pmlmeext->sitesurvey_res.state > SCAN_START) + { + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + pmlmeext->sitesurvey_res.channel_idx++; + + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + goto exit_survey_timer_hdl; + } + + if ((psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm))) == NULL) + { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + goto exit_survey_timer_hdl; + } + + init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); + rtw_enqueue_cmd(pcmdpriv, ph2c); + } + + +exit_survey_timer_hdl: + + return; +} + +void link_timer_hdl(_adapter *padapter) +{ + static unsigned int rx_pkt = 0; + static u64 tx_cnt = 0; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + + if (pmlmeinfo->state & WIFI_FW_AUTH_NULL) + { + DBG_871X("link_timer_hdl:no beacon while connecting\n"); + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_join_res(padapter, -3); + } + else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE) + { + //re-auth timer + if (++pmlmeinfo->reauth_count > REAUTH_LIMIT) + { + if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto) + { + pmlmeinfo->state = 0; + report_join_res(padapter, -1); + return; + } + else + { + pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; + pmlmeinfo->reauth_count = 0; + } + } + + DBG_871X("link_timer_hdl: auth timeout and try again\n"); + pmlmeinfo->auth_seq = 1; + issue_auth(padapter, NULL, 0); + set_link_timer(pmlmeext, REAUTH_TO); + } + else if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE) + { + //re-assoc timer + if (++pmlmeinfo->reassoc_count > REASSOC_LIMIT) + { + pmlmeinfo->state = WIFI_FW_NULL_STATE; + report_join_res(padapter, -2); + return; + } + + DBG_871X("link_timer_hdl: assoc timeout and try again\n"); + issue_assocreq(padapter); + set_link_timer(pmlmeext, REASSOC_TO); + } +#if 0 + else if (is_client_associated_to_ap(padapter)) + { + //linked infrastructure client mode + if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) + { + /*to monitor whether the AP is alive or not*/ + if (rx_pkt == psta->sta_stats.rx_pkts) + { + receive_disconnect(padapter, pmlmeinfo->network.MacAddress); + return; + } + else + { + rx_pkt = psta->sta_stats.rx_pkts; + set_link_timer(pmlmeext, DISCONNECT_TO); + } + + //update the EDCA paramter according to the Tx/RX mode + update_EDCA_param(padapter); + + /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ + if (pmlmeinfo->link_count++ == 0) + { + tx_cnt = pxmitpriv->tx_pkts; + } + else if ((pmlmeinfo->link_count & 0xf) == 0) + { + if (tx_cnt == pxmitpriv->tx_pkts) + { + issue_nulldata(padapter, 0); + } + + tx_cnt = pxmitpriv->tx_pkts; + } + } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) + } + else if (is_client_associated_to_ibss(padapter)) + { + //linked IBSS mode + //for each assoc list entry to check the rx pkt counter + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) + { + if (pmlmeinfo->FW_sta_info[i].status == 1) + { + psta = pmlmeinfo->FW_sta_info[i].psta; + + if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) + { + pmlmeinfo->FW_sta_info[i].status = 0; + report_del_sta_event(padapter, psta->hwaddr); + } + else + { + pmlmeinfo->FW_sta_info[i].rx_pkt = psta->sta_stats.rx_pkts; + } + } + } + + set_link_timer(pmlmeext, DISCONNECT_TO); + } +#endif + + return; +} + +void addba_timer_hdl(struct sta_info *psta) +{ + u8 bitmap; + u16 tid; + struct ht_priv *phtpriv; + + if(!psta) + return; + + phtpriv = &psta->htpriv; + + if((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) + { + if(phtpriv->candidate_tid_bitmap) + phtpriv->candidate_tid_bitmap=0x0; + + } + +} + +u8 NULL_hdl(_adapter *padapter, u8 *pbuf) +{ + return H2C_SUCCESS; +} + +u8 setopmode_hdl(_adapter *padapter, u8 *pbuf) +{ + u8 type; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct setopmode_parm *psetop = (struct setopmode_parm *)pbuf; + + if(psetop->mode == Ndis802_11APMode) + { + pmlmeinfo->state = WIFI_FW_AP_STATE; + type = _HW_STATE_AP_; +#ifdef CONFIG_NATIVEAP_MLME + //start_ap_mode(padapter); +#endif + } + else if(psetop->mode == Ndis802_11Infrastructure) + { + type = _HW_STATE_STATION_; + } + else if(psetop->mode == Ndis802_11IBSS) + { + type = _HW_STATE_ADHOC_; + } + else + { + type = _HW_STATE_NOLINK_; + } + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); + //Set_NETYPE0_MSR(padapter, type); + + return H2C_SUCCESS; + +} + +u8 createbss_hdl(_adapter *padapter, u8 *pbuf) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; + u32 initialgain; + + + if(pparm->network.InfrastructureMode == Ndis802_11APMode) + { +#ifdef CONFIG_AP_MODE + + if(pmlmeinfo->state == WIFI_FW_AP_STATE) + { + //todo: + return H2C_SUCCESS; + } +#endif + } + + //below is for ad-hoc master + if(pparm->network.InfrastructureMode == Ndis802_11IBSS) + { + rtw_joinbss_reset(padapter); + + pmlmeext->linked_to = 0; + + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmlmeinfo->ERP_enable = 0; + pmlmeinfo->WMM_enable = 0; + pmlmeinfo->HT_enable = 0; + pmlmeinfo->HT_caps_enable = 0; + pmlmeinfo->HT_info_enable = 0; + pmlmeinfo->agg_enable_bitmap = 0; + pmlmeinfo->candidate_tid_bitmap = 0; + + //disable dynamic functions, such as high power, DIG + Save_DM_Func_Flag(padapter); + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //config the initial gain under linking, need to write the BB registers + initialgain = 0x30; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + //cancel link timer + _cancel_timer_ex(&pmlmeext->link_timer); + + //clear CAM + flush_all_cam_entry(padapter); + + _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); + pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength; + + if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength + return H2C_PARAMETERS_ERROR; + + _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); + + start_create_ibss(padapter); + + } + + return H2C_SUCCESS; + +} + +u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf) +{ + u8 join_type; + PNDIS_802_11_VARIABLE_IEs pIE; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + struct joinbss_parm *pparm = (struct joinbss_parm *)pbuf; + u32 acparm, initialgain, i; + + //check already connecting to AP or not + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) + { + if (pmlmeinfo->state & WIFI_FW_STATION_STATE) + { + issue_deauth(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING); + } + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + //clear CAM + flush_all_cam_entry(padapter); + + _cancel_timer_ex(&pmlmeext->link_timer); + + //set MSR to nolink + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); + } + +#ifdef CONFIG_ANTENNA_DIVERSITY + rtw_antenna_select_cmd(padapter, pparm->network.PhyInfo.Optimum_antenna, _FALSE); +#endif + + rtw_joinbss_reset(padapter); + + pmlmeext->linked_to = 0; + + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmlmeinfo->ERP_enable = 0; + pmlmeinfo->WMM_enable = 0; + pmlmeinfo->HT_enable = 0; + pmlmeinfo->HT_caps_enable = 0; + pmlmeinfo->HT_info_enable = 0; + pmlmeinfo->agg_enable_bitmap = 0; + pmlmeinfo->candidate_tid_bitmap = 0; + pmlmeinfo->bwmode_updated = _FALSE; + //pmlmeinfo->assoc_AP_vendor = maxAP; + + _rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); + pnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength; + + if(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength + return H2C_PARAMETERS_ERROR; + + _rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); + + //Check AP vendor + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength); + + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_://Get WMM IE. + if ( _rtw_memcmp(pIE->data, WMM_OUI, 4) ) + { + pmlmeinfo->WMM_enable = 1; + } + break; + + case _HT_CAPABILITY_IE_: //Get HT Cap IE. + pmlmeinfo->HT_caps_enable = 1; + break; + + case _HT_EXTRA_INFO_IE_: //Get HT Info IE. + pmlmeinfo->HT_info_enable = 1; + + //spec case only for cisco's ap because cisco's ap issue assoc rsp using mcs rate @40MHz or @20MHz + if(pmlmeinfo->assoc_AP_vendor == ciscoAP) + { + struct HT_info_element *pht_info = (struct HT_info_element *)(pIE->data); + + if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) + { + //switch to the 40M Hz mode according to the AP + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; + switch (pht_info->infos[0] & 0x3) + { + case 1: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + DBG_871X("set ch/bw for cisco's ap before connected\n"); + } + } + break; + + default: + break; + } + + i += (pIE->Length + 2); + } +#if 0 + if (padapter->registrypriv.wifi_spec) { + // for WiFi test, follow WMM test plan spec + acparm = 0x002F431C; // VO + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E541C; // VI + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + acparm = 0x0000A525; // BE + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A549; // BK + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + + // for WiFi test, mixed mode with intel STA under bg mode throughput issue + if (padapter->mlmepriv.htpriv.ht_option == _FALSE){ + acparm = 0x00004320; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + } + } + else { + acparm = 0x002F3217; // VO + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E4317; // VI + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + acparm = 0x00105320; // BE + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A444; // BK + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + } +#endif + //disable dynamic functions, such as high power, DIG + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //config the initial gain under linking, need to write the BB registers + initialgain = 0x32; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); + join_type = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + //cancel link timer + _cancel_timer_ex(&pmlmeext->link_timer); + + start_clnt_join(padapter); + + return H2C_SUCCESS; + +} + +u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct disconnect_parm *pparm = (struct disconnect_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + u8 val8; + + if (is_client_associated_to_ap(padapter)) + { + issue_deauth(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING); + } + + //set_opmode_cmd(padapter, infra_client_with_mlme); + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + //switch to the 20M Hz mode after disconnect + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20; + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + //set MSR to no link state + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_DISCONNECT, 0); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, null_addr); + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //Stop BCN + val8 = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8)); + } + + pmlmeinfo->state = WIFI_FW_NULL_STATE; + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + flush_all_cam_entry(padapter); + + _cancel_timer_ex(&pmlmeext->link_timer); + pmlmeext->linked_to = 0; + + return H2C_SUCCESS; +} + +u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; + u8 val8; + u32 initialgain; + u32 i; +#ifdef CONFIG_TDLS + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; +#endif + +#ifdef CONFIG_P2P + struct wifidirect_info* pwdinfo = &padapter->wdinfo; +#endif + + if (pmlmeext->sitesurvey_res.state == SCAN_DISABLE) + { + //for first time sitesurvey_cmd + pmlmeext->sitesurvey_res.state = SCAN_START; + pmlmeext->sitesurvey_res.bss_cnt = 0; + pmlmeext->sitesurvey_res.channel_idx = 0; + + if (le32_to_cpu(pparm->ss_ssidlen)) + { + _rtw_memcpy(pmlmeext->sitesurvey_res.ss_ssid, pparm->ss_ssid, le32_to_cpu(pparm->ss_ssidlen)); + } + else + { + _rtw_memset(pmlmeext->sitesurvey_res.ss_ssid, 0, (IW_ESSID_MAX_SIZE + 1)); + } + + pmlmeext->sitesurvey_res.ss_ssidlen = le32_to_cpu(pparm->ss_ssidlen); + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1) + pmlmeext->sitesurvey_res.scan_mode=SCAN_PASSIVE; + else + pmlmeext->sitesurvey_res.scan_mode = le32_to_cpu(pparm->scan_mode); +#else + pmlmeext->sitesurvey_res.scan_mode = le32_to_cpu(pparm->scan_mode); +#endif + + //issue null data if associating to the AP + if (is_client_associated_to_ap(padapter) == _TRUE) + { + pmlmeext->sitesurvey_res.state = SCAN_TXNULL; + + issue_nulldata(padapter, 1); + issue_nulldata(padapter, 1); + + //delay 50ms to protect nulldata(1). + set_survey_timer(pmlmeext, 50); + + return H2C_SUCCESS; + } + } + + if ((pmlmeext->sitesurvey_res.state == SCAN_START) || (pmlmeext->sitesurvey_res.state == SCAN_TXNULL)) + { +#ifdef CONFIG_FIND_BEST_CHANNEL +#if 0 + for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) { + pmlmeext->channel_set[i].rx_count = 0; + } +#endif +#endif /* CONFIG_FIND_BEST_CHANNEL */ + + //disable dynamic functions, such as high power, DIG + Save_DM_Func_Flag(padapter); + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //config the initial gain under scaning, need to write the BB registers + initialgain = 0x20; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + //set MSR to no link state + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + + val8 = 1; //before site survey + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + + // Commented by Albert 2011/08/05 + // The pre_tx_scan_timer_process will issue the scan H2C command. + // However, the driver should NOT enter the scanning mode at that time. + pmlmeext->sitesurvey_res.state = SCAN_PROCESS; + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1){ + rtw_write16(padapter, 0x06A4,0xffff); + } +#endif + + site_survey(padapter); + + return H2C_SUCCESS; + +} + +u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct setauth_parm *pparm = (struct setauth_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (pparm->mode < 4) + { + pmlmeinfo->auth_algo = pparm->mode; + } + + return H2C_SUCCESS; +} + +u8 setkey_hdl(_adapter *padapter, u8 *pbuf) +{ + unsigned short ctrl; + struct setkey_parm *pparm = (struct setkey_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + //main tx key for wep. + if(pparm->set_tx) + pmlmeinfo->key_index = pparm->keyid; + + //write cam + ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid; + + write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key); + + return H2C_SUCCESS; +} + +u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf) +{ + unsigned short ctrl=0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct set_stakey_parm *pparm = (struct set_stakey_parm *)pbuf; +#ifdef CONFIG_TDLS + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; +#endif + + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + unsigned char cam_id;//cam_entry + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + psta = rtw_get_stainfo(pstapriv, pparm->addr); + if(psta) + { + ctrl = (BIT(15) | ((pparm->algorithm) << 2)); + + DBG_8192C("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm); + + if((psta->mac_id<1) || (psta->mac_id>(NUM_STA-4))) + { + DBG_8192C("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id); + return H2C_REJECTED; + } + + cam_id = (psta->mac_id + 3);//0~3 for default key, cmd_id=macid + 3, macid=aid+1; + + DBG_8192C("Write CAM, mac_addr=%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0], + pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4], + pparm->addr[5], cam_id); + + write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key); + + return H2C_SUCCESS_RSP; + + } + else + { + DBG_8192C("r871x_set_stakey_hdl(): sta has been free\n"); + return H2C_REJECTED; + } + + } + + //below for sta mode + + ctrl = BIT(15) | ((pparm->algorithm) << 2); + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_cam_entry_to_clear!=0){ + clear_cam_entry(padapter, pmlmeinfo->tdls_cam_entry_to_clear); + pmlmeinfo->tdls_cam_entry_to_clear=0; + + return H2C_SUCCESS; + } + + psta = rtw_get_stainfo(pstapriv, pparm->addr);//Get TDLS Peer STA + if((psta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE){ + write_cam(padapter, psta->cam_entry, ctrl, pparm->addr, pparm->key); + } + else +#endif + write_cam(padapter, 5, ctrl, pparm->addr, pparm->key); + + pmlmeinfo->enc_algo = pparm->algorithm; + + return H2C_SUCCESS; +} + +u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct addBaReq_parm *pparm = (struct addBaReq_parm *)pbuf; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, pparm->addr); + + if(!psta) + return H2C_SUCCESS; + + + if (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) || + ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pmlmeinfo->ADDBA_retry_count = 0; + //pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid); + //psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid); + issue_action_BA(padapter, pparm->addr, WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); + //_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO); + _set_timer(&psta->addba_retry_timer, ADDBA_TO); + } + else + { + psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid); + } + + return H2C_SUCCESS; +} + +u8 set_tx_beacon_cmd(_adapter* padapter) +{ + struct cmd_obj *ph2c; + struct Tx_Beacon_param *ptxBeacon_parm; + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 res = _SUCCESS; + +_func_enter_; + + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + res= _FAIL; + goto exit; + } + + if ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL) + { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + _rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX)); + init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + + +exit: + +_func_exit_; + + return res; +} + + +u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf) +{ + u8 evt_code, evt_seq; + u16 evt_sz; + uint *peventbuf; + void (*event_callback)(_adapter *dev, u8 *pbuf); + struct evt_priv *pevt_priv = &(padapter->evtpriv); + + peventbuf = (uint*)pbuf; + evt_sz = (u16)(*peventbuf&0xffff); + evt_seq = (u8)((*peventbuf>>24)&0x7f); + evt_code = (u8)((*peventbuf>>16)&0xff); + + + #ifdef CHECK_EVENT_SEQ + // checking event sequence... + if (evt_seq != (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f) ) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("Evetn Seq Error! %d vs %d\n", (evt_seq & 0x7f), (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f))); + + pevt_priv->event_seq = (evt_seq+1)&0x7f; + + goto _abort_event_; + } + #endif + + // checking if event code is valid + if (evt_code >= MAX_C2HEVT) + { + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent Code(%d) mismatch!\n", evt_code)); + goto _abort_event_; + } + + // checking if event size match the event parm size + if ((wlanevents[evt_code].parmsize != 0) && + (wlanevents[evt_code].parmsize != evt_sz)) + { + + RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nEvent(%d) Parm Size mismatch (%d vs %d)!\n", + evt_code, wlanevents[evt_code].parmsize, evt_sz)); + goto _abort_event_; + + } + + ATOMIC_INC(&pevt_priv->event_seq); + + peventbuf += 2; + + if(peventbuf) + { + event_callback = wlanevents[evt_code].event_callback; + event_callback(padapter, (u8*)peventbuf); + + pevt_priv->evt_done_cnt++; + } + + +_abort_event_: + + + return H2C_SUCCESS; + +} + +u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) +{ + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + return H2C_SUCCESS; +} + + +u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf) +{ + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + return H2C_PARAMETERS_ERROR; + } +#ifdef CONFIG_AP_MODE + else //tx bc/mc frames after update TIM + { + _irqL irqL; + struct sta_info *psta_bmc; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + //for BC/MC Frames + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(!psta_bmc) + return H2C_SUCCESS; + + if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0)) + { + + rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows + + _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta_bmc->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + psta_bmc->sleepq_len--; + if(psta_bmc->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + pxmitframe->attrib.triggered=1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + //pstapriv->tim_bitmap &= ~BIT(0); + + } + + _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + } + + } +#endif + + return H2C_SUCCESS; + +} + +#ifdef CONFIG_AP_MODE + +void init_mlme_ap_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + _rtw_spinlock_init(&pmlmepriv->bcn_update_lock); + + //pmlmeext->bstart_bss = _FALSE; + + start_ap_mode(padapter); +} + +void free_mlme_ap_info(_adapter *padapter) +{ + _irqL irqL; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //stop_ap_mode(padapter); + + pmlmepriv->update_bcn = _FALSE; + pmlmeext->bstart_bss = _FALSE; + + rtw_sta_flush(padapter); + + pmlmeinfo->state = _HW_STATE_NOLINK_; + + //free_assoc_sta_resources + rtw_free_all_stainfo(padapter); + + //free bc/mc sta_info + psta = rtw_get_bcmc_stainfo(padapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + + _rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + +} + +static void update_BCNTIM(_adapter *padapter) +{ + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); + unsigned char *src_ie = pnetwork->IEs; + unsigned int src_ielen = pnetwork->IELength; + unsigned char *dst_ie = pnetwork_mlmeext->IEs; + + + //update TIM IE + //if(pstapriv->tim_bitmap) + if(_TRUE) + { + u8 *p, ie_len; + u16 tim_bitmap_le; + u32 tmp_len, head_len=0; + + tim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap); + + //calucate head_len + head_len = _FIXED_IE_LENGTH_; + head_len += pnetwork->Ssid.SsidLength + 2; + + // get supported rates len + p = rtw_get_ie(src_ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + { + head_len += tmp_len+2; + } + + //DS Parameter Set IE, len=3 + head_len += 3; + + //copy head offset + _rtw_memcpy(dst_ie, src_ie, head_len); + + + //append TIM IE from head_len offset + dst_ie+=head_len; + + *dst_ie++=_TIM_IE_; + + if((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fc)) + ie_len = 5; + else + ie_len = 4; + + *dst_ie++= ie_len; + + *dst_ie++=0;//DTIM count + *dst_ie++=1;//DTIM peroid + + if(pstapriv->tim_bitmap&BIT(0))//for bc/mc frames + *dst_ie++ = BIT(0);//bitmap ctrl + else + *dst_ie++ = 0; + + if(ie_len==4) + { + *dst_ie++ = *(u8*)&tim_bitmap_le; + } + else if(ie_len==5) + { + _rtw_memcpy(dst_ie, &tim_bitmap_le, 2); + dst_ie+=2; + } + + //copy remainder IE + _rtw_memcpy(dst_ie, src_ie+head_len, src_ielen-head_len); + + //pnetwork_mlmeext->Length += ie_len+2; + //pnetwork_mlmeext->IELength += ie_len+2; + pnetwork_mlmeext->Length = pnetwork->Length+ie_len+2; + pnetwork_mlmeext->IELength = src_ielen+ie_len+2; + + } + else + { + _rtw_memcpy(dst_ie, src_ie, src_ielen); + pnetwork_mlmeext->Length = pnetwork->Length; + pnetwork_mlmeext->IELength = src_ielen; + } + +#ifdef CONFIG_USB_HCI + set_tx_beacon_cmd(padapter); +#endif + + +/* + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + } +*/ + +} + +u8 chk_sta_is_alive(struct sta_info *psta) +{ + struct stainfo_stats *pstats; + + pstats = &psta->sta_stats; + + if(pstats->rx_pkts == pstats->last_rx_pkts) + { + if(psta->state&WIFI_SLEEP_STATE) + return _TRUE; + else + return _FALSE; + } + else + { + pstats->last_rx_pkts = pstats->rx_pkts; + + return _TRUE; + } + +} + +void expire_timeout_chk(_adapter *padapter) +{ + _list *phead, *plist; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + phead = &pstapriv->auth_list; + plist = get_next(phead); + + //check auth_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, auth_list); + + plist = get_next(plist); + + if(psta->expire_to>0) + { + psta->expire_to--; + if (psta->expire_to == 0) + { + _irqL irqL; + + rtw_list_delete(&psta->auth_list); + + DBG_871X("auth expire %02X%02X%02X%02X%02X%02X\n", + psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + } + } + + } + + + psta = NULL; + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //check asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + if(chk_sta_is_alive(psta)) + { + psta->expire_to = pstapriv->expire_to; + } + + if(psta->expire_to>0) + { + psta->expire_to--; + if (psta->expire_to == 0) + { + _irqL irqL; + + rtw_list_delete(&psta->asoc_list); + + DBG_871X("asoc expire %02X%02X%02X%02X%02X%02X\n", + psta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]); +#if 0 + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); +#endif + ap_free_sta(padapter, psta); + + } + } + + } + +} + + +static void add_RATid(_adapter *padapter, struct sta_info *psta) +{ + int i; + u8 rf_type; + u32 init_rate=0; + unsigned char sta_band = 0, raid, shortGIrate = _FALSE; + unsigned char limit; + unsigned int tx_ra_bitmap=0; + struct ht_priv *psta_ht = NULL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + + + if(psta) + psta_ht = &psta->htpriv; + else + return; + + //b/g mode ra_bitmap + for (i=0; ibssrateset); i++) + { + if (psta->bssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + //n mode ra_bitmap + if(psta_ht->ht_option) + { + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + if(rf_type == RF_2T2R) + limit=16;// 2R + else + limit=8;// 1R + + for (i=0; iht_cap.supp_mcs_set[i/8] & BIT(i%8)) + tx_ra_bitmap |= BIT(i+12); + } + + //max short GI rate + shortGIrate = psta_ht->sgi; + } + + +#if 0//gtest + if(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R) + { + //is this a 2r STA? + if((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid))) + { + priv->pshare->has_2r_sta |= BIT(pstat->aid); + if(rtw_read16(padapter, 0x102501f6) != 0xffff) + { + rtw_write16(padapter, 0x102501f6, 0xffff); + reset_1r_sta_RA(priv, 0xffff); + Switch_1SS_Antenna(priv, 3); + } + } + else// bg or 1R STA? + { + if((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0) + { + if(rtw_read16(padapter, 0x102501f6) != 0x7777) + { // MCS7 SGI + rtw_write16(padapter, 0x102501f6,0x7777); + reset_1r_sta_RA(priv, 0x7777); + Switch_1SS_Antenna(priv, 2); + } + } + } + + } + + if ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) + { + if (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper) + pstat->rssi_level = 1; + else if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) || + ((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) && + (pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) && + (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_)))) + pstat->rssi_level = 2; + else + pstat->rssi_level = 3; + } + + // rate adaptive by rssi + if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len) + { + if ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x100f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x100ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x100ff005; + else + pstat->tx_ra_bitmap &= 0x100ff001; + + break; + } + } + else + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x1f0f0000; + break; + case 2: + pstat->tx_ra_bitmap &= 0x1f0ff000; + break; + case 3: + if (priv->pshare->is_40m_bw) + pstat->tx_ra_bitmap &= 0x000ff005; + else + pstat->tx_ra_bitmap &= 0x000ff001; + + break; + } + + // Don't need to mask high rates due to new rate adaptive parameters + //if (pstat->is_broadcom_sta) // use MCS12 as the highest rate vs. Broadcom sta + // pstat->tx_ra_bitmap &= 0x81ffffff; + + // NIC driver will report not supporting MCS15 and MCS14 in asoc req + //if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta) + // pstat->tx_ra_bitmap &= 0x83ffffff; // if Realtek 1x2 sta, don't use MCS15 and MCS14 + } + } + else if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat)) + { + switch (pstat->rssi_level) { + case 1: + pstat->tx_ra_bitmap &= 0x00000f00; + break; + case 2: + pstat->tx_ra_bitmap &= 0x00000ff0; + break; + case 3: + pstat->tx_ra_bitmap &= 0x00000ff5; + break; + } + } + else + { + pstat->tx_ra_bitmap &= 0x0000000d; + } + + // disable tx short GI when station cannot rx MCS15(AP is 2T2R) + // disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R) + // if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate + if ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) || + (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R))) + { + pstat->tx_ra_bitmap &= ~BIT(28); + } +#endif + + if ( pcur_network->Configuration.DSConfig > 14 ) { + // 5G band + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_5N | WIRELESS_11A; + else + sta_band |= WIRELESS_11A; + } else { + if (tx_ra_bitmap & 0xffff000) + sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; + else if (tx_ra_bitmap & 0xff0) + sta_band |= WIRELESS_11G |WIRELESS_11B; + else + sta_band |= WIRELESS_11B; + } + + raid = networktype_to_raid(sta_band); + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; + + if (psta->aid < NUM_STA) + { + u8 arg = 0; + + arg = psta->mac_id&0x1f; + + arg |= BIT(7); + + if (shortGIrate==_TRUE) + arg |= BIT(5); + + tx_ra_bitmap |= ((raid<<28)&0xf0000000); + + DBG_871X("update raid entry, bitmap=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); + + //bitmap[0:27] = tx_rate_bitmap + //bitmap[28:31]= Rate Adaptive id + //arg[0:4] = macid + //arg[5] = Short GI + padapter->HalFunc.Add_RateATid(padapter, tx_ra_bitmap, arg); + + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + + } + else + { + DBG_871X("station aid %d exceed the max number\n", psta->aid); + } + +} + +static void update_bmc_sta(_adapter *padapter) +{ + _irqL irqL; + u32 init_rate=0; + unsigned char network_type, raid; + unsigned short para16; + int i, supportRateNum = 0; + unsigned int tx_ra_bitmap=0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); + + if(psta) + { + psta->aid = 0;//default set to 0 + //psta->mac_id = psta->aid+4; + psta->mac_id = psta->aid + 1; + + psta->qos_option = 0; + psta->htpriv.ht_option = _FALSE; + + psta->ieee8021x_blocked = 0; + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + //psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this. + + + + //prepare for add_RATid + supportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates); + network_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, 1); + + _rtw_memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); + psta->bssratelen = supportRateNum; + + //b/g mode ra_bitmap + for (i=0; ibssrateset[i]) + tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); + } + + if ( pcur_network->Configuration.DSConfig > 14 ) { + //force to A mode. 5G doesn't support CCK rates + network_type = WIRELESS_11A; + tx_ra_bitmap = 0x150; // 6, 12, 24 Mbps + } else { + //force to b mode + network_type = WIRELESS_11B; + tx_ra_bitmap = 0xf; + } + + //tx_ra_bitmap = update_basic_rate(pcur_network->SupportedRates, supportRateNum); + + raid = networktype_to_raid(network_type); + init_rate = get_highest_rate_idx(tx_ra_bitmap&0x0fffffff)&0x3f; + + //DBG_871X("Add id %d val %08x to ratr for bmc sta\n", psta->aid, tx_ra_bitmap); + + //if(pHalData->fw_ractrl == _TRUE) + { + u8 arg = 0; + + arg = psta->mac_id&0x1f; + + arg |= BIT(7); + + //if (shortGIrate==_TRUE) + // arg |= BIT(5); + + tx_ra_bitmap |= ((raid<<28)&0xf0000000); + + DBG_871X("update_bmc_sta, mask=0x%x, arg=0x%x\n", tx_ra_bitmap, arg); + + //bitmap[0:27] = tx_rate_bitmap + //bitmap[28:31]= Rate Adaptive id + //arg[0:4] = macid + //arg[5] = Short GI + padapter->HalFunc.Add_RateATid(padapter, tx_ra_bitmap, arg); + + } + + //set ra_id, init_rate + psta->raid = raid; + psta->init_rate = init_rate; + + _enter_critical_bh(&psta->lock, &irqL); + psta->state = _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + } + else + { + DBG_871X("add_RATid_bmc_sta error!\n"); + } + +} + +//notes: +//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode +//MAC_ID = AID+1 for sta in ap/adhoc mode +//MAC_ID = 1 for bc/mc for sta/ap/adhoc +//MAC_ID = 0 for bssid for sta/ap/adhoc +//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1; + +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + struct ht_priv *phtpriv_sta = &psta->htpriv; + + //set intf_tag to if1 + //psta->intf_tag = 0; + + //psta->mac_id = psta->aid+4; + psta->mac_id = psta->aid+1; + + if(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X) + psta->ieee8021x_blocked = _TRUE; + else + psta->ieee8021x_blocked = _FALSE; + + + //update sta's cap + + //ERP + VCS_update(padapter, psta); + + //HT related cap + if(phtpriv_sta->ht_option) + { + //check if sta supports rx ampdu + phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; + + //check if sta support s Short GI + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) + { + phtpriv_sta->sgi = _TRUE; + } + + // bwmode + if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) + { + //phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40; + phtpriv_sta->bwmode = pmlmeext->cur_bwmode; + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + + } + + psta->qos_option = _TRUE; + + } + else + { + phtpriv_sta->ampdu_enable = _FALSE; + + phtpriv_sta->sgi = _FALSE; + phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + //Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + phtpriv_sta->agg_enable_bitmap = 0x0;//reset + phtpriv_sta->candidate_tid_bitmap = 0x0;//reset + + + //todo: init other variables + + _rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats)); + + + //add ratid + add_RATid(padapter, psta); + + + _enter_critical_bh(&psta->lock, &irqL); + psta->state |= _FW_LINKED; + _exit_critical_bh(&psta->lock, &irqL); + + +} + +static void start_bss_network(_adapter *padapter, u8 *pbuf) +{ + u8 *p; + u8 val8, cur_channel, cur_bwmode, cur_ch_offset; + u16 bcn_interval; + u32 acparm; + int ie_len; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct security_priv* psecuritypriv=&(padapter->securitypriv); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network); +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &(padapter->wdinfo); +#endif //CONFIG_P2P + + + //DBG_8192C("%s\n", __FUNCTION__); + + bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; + cur_channel = pnetwork->Configuration.DSConfig; + cur_bwmode = HT_CHANNEL_WIDTH_20;; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + + + //check if there is wps ie, + //if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, + //and at first time the security ie ( RSN/WPA IE) will not include in beacon. + if(NULL == rtw_get_wps_ie(pnetwork->IEs, pnetwork->IELength, NULL, &ie_len)) + { + pmlmeext->bstart_bss = _TRUE; + } + + //todo: update wmm, ht cap + //pmlmeinfo->WMM_enable; + //pmlmeinfo->HT_enable; + if(pmlmepriv->qospriv.qos_option) + pmlmeinfo->WMM_enable = _TRUE; + + if(pmlmepriv->htpriv.ht_option) + { + pmlmeinfo->WMM_enable = _TRUE; + pmlmeinfo->HT_enable = _TRUE; + } + + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + flush_all_cam_entry(padapter); //clear CAM + } + + //set MSR to AP_Mode + Set_NETYPE0_MSR(padapter, _HW_STATE_AP_); + + //Set BSSID REG + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pnetwork->MacAddress); + + //Set EDCA param reg + acparm = 0x002F3217; // VO + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); + acparm = 0x005E4317; // VI + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); + //acparm = 0x00105320; // BE + acparm = 0x005ea42b; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); + acparm = 0x0000A444; // BK + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); + + //Set Security + val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); + + //Beacon Control related register + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); + + if(pmlmepriv->cur_network.join_res != _TRUE) //setting only at first time + { + u32 initialgain; + + //disable dynamic functions, such as high power, DIG + //Save_DM_Func_Flag(padapter); + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + //turn on dynamic functions + Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, _TRUE); + + initialgain = 0x30; + //padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + + } + + //set channel, bwmode + p = rtw_get_ie((pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs))); + if( p && ie_len) + { + struct HT_info_element *pht_info = (struct HT_info_element *)(p+2); + + if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) + { + //switch to the 40M Hz mode + //pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; + cur_bwmode = HT_CHANNEL_WIDTH_40; + switch (pht_info->infos[0] & 0x3) + { + case 1: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + //pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + } + + } + + //TODO: need to judge the phy parameters on concurrent mode for single phy + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); + + DBG_871X("CH=%d, BW=%d, offset=%d\n", cur_channel, cur_bwmode, cur_ch_offset); + + // + pmlmeext->cur_channel = cur_channel; + pmlmeext->cur_bwmode = cur_bwmode; + pmlmeext->cur_ch_offset = cur_ch_offset; + pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; + + //let pnetwork_mlmeext == pnetwork_mlme. + _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); + +#ifdef CONFIG_P2P + _rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength); + pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength; +#endif //CONFIG_P2P + + + if(_TRUE == pmlmeext->bstart_bss) + { + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + + //issue beacon frame + if(send_beacon(padapter)==_FAIL) + { + DBG_871X("issue_beacon, fail!\n"); + } + } + + + //update bc/mc sta_info + update_bmc_sta(padapter); + + //pmlmeext->bstart_bss = _TRUE; + +} + +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) +{ + int ret=_SUCCESS; + u8 *p; + struct sta_info *psta = NULL; + u16 cap, ht_cap=_FALSE; + uint ie_len = 0; + int group_cipher, pairwise_cipher; + u8 channel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX]; + int supportRateNum = 0; + u8 OUI1[] = {0x00, 0x50, 0xf2,0x01}; + u8 wps_oui[4]={0x0,0x50,0xf2,0x04}; + u8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + WLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *ie = pbss_network->IEs; + + + /* SSID */ + /* Supported rates */ + /* DS Params */ + /* WLAN_EID_COUNTRY */ + /* ERP Information element */ + /* Extended supported rates */ + /* WPA/WPA2 */ + /* Wi-Fi Wireless Multimedia Extensions */ + /* ht_capab, ht_oper */ + /* WPS IE */ + + DBG_8192C("%s, len=%d\n", __FUNCTION__, len); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE) + return _FAIL; + + + if(len>MAX_IE_SZ) + return _FAIL; + + pbss_network->IELength = len; + + _rtw_memset(ie, 0, MAX_IE_SZ); + + _rtw_memcpy(ie, pbuf, pbss_network->IELength); + + + if(pbss_network->InfrastructureMode!=Ndis802_11APMode) + return _FAIL; + + pbss_network->Rssi = 0; + + _rtw_memcpy(pbss_network->MacAddress, myid(&(padapter->eeprompriv)), ETH_ALEN); + + //beacon interval + p = rtw_get_beacon_interval_from_ie(ie);//ie + 8; // 8: TimeStamp, 2: Beacon Interval 2:Capability + //pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p); + pbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p); + + //capability + //cap = *(unsigned short *)rtw_get_capability_from_ie(ie); + //cap = le16_to_cpu(cap); + cap = RTW_GET_LE16(ie); + + //SSID + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + _rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len); + pbss_network->Ssid.SsidLength = ie_len; + } + + //chnnel + channel = 0; + pbss_network->Configuration.Length = 0; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + channel = *(p + 2); + + pbss_network->Configuration.DSConfig = channel; + + + _rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX); + // get supported rates + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if (p != NULL) + { + _rtw_memcpy(supportRate, p+2, ie_len); + supportRateNum = ie_len; + } + + //get ext_supported rates + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_); + if (p != NULL) + { + _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); + supportRateNum += ie_len; + + } + + network_type = rtw_check_network_type(supportRate, supportRateNum, channel); + + rtw_set_supported_rate(pbss_network->SupportedRates, network_type); + + + //parsing ERP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + ERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p); + } + + //update privacy/security + if (cap & BIT(4)) + pbss_network->Privacy = 1; + else + pbss_network->Privacy = 0; + + psecuritypriv->wpa_psk = 0; + + //wpa2 + group_cipher = 0; pairwise_cipher = 0; + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + if(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) + { + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x + psecuritypriv->wpa_psk |= BIT(1); + + psecuritypriv->wpa2_group_cipher = group_cipher; + psecuritypriv->wpa2_pairwise_cipher = pairwise_cipher; +#if 0 + switch(group_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_group_cipher = _WEP104_; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa2_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa2_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa2_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa2_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + } + + //wpa + ie_len = 0; + group_cipher = 0; pairwise_cipher = 0; + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) + { + p = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if ((p) && (_rtw_memcmp(p+2, OUI1, 4))) + { + if(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher) == _SUCCESS) + { + psecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; + + psecuritypriv->dot8021xalg = 1;//psk, todo:802.1x + + psecuritypriv->wpa_psk |= BIT(0); + + psecuritypriv->wpa_group_cipher = group_cipher; + psecuritypriv->wpa_pairwise_cipher = pairwise_cipher; + +#if 0 + switch(group_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_group_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_group_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_group_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_group_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_group_cipher = _WEP104_; + break; + } + + switch(pairwise_cipher) + { + case WPA_CIPHER_NONE: + psecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_; + break; + case WPA_CIPHER_WEP40: + psecuritypriv->wpa_pairwise_cipher = _WEP40_; + break; + case WPA_CIPHER_TKIP: + psecuritypriv->wpa_pairwise_cipher = _TKIP_; + break; + case WPA_CIPHER_CCMP: + psecuritypriv->wpa_pairwise_cipher = _AES_; + break; + case WPA_CIPHER_WEP104: + psecuritypriv->wpa_pairwise_cipher = _WEP104_; + break; + } +#endif + } + + break; + + } + + if ((p == NULL) || (ie_len == 0)) + { + break; + } + + } + + //wmm + ie_len = 0; + pmlmepriv->qospriv.qos_option = 0; + if(pregistrypriv->wmm_enable) + { + for (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2)) + { + p = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2))); + if((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6)) + { + pmlmepriv->qospriv.qos_option = 1; + + *(p+8) |= BIT(7);//QoS Info, support U-APSD + + break; + } + + if ((p == NULL) || (ie_len == 0)) + { + break; + } + } + } + + //parsing HT_CAP_IE + p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_)); + if(p && ie_len>0) + { + u8 rf_type; + + struct ieee80211_ht_cap *pht_cap = (struct ieee80211_ht_cap *)(p+2); + + + ht_cap = _TRUE; + network_type |= WIRELESS_11_24N; + + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + if((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || + (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) + { + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2)); + } + else + { + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00); + } + + + if(rf_type == RF_1T1R) + { + pht_cap->supp_mcs_set[0] = 0xff; + pht_cap->supp_mcs_set[1] = 0x0; + } + + _rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len); + + } + + switch(network_type) + { + case WIRELESS_11B: + pbss_network->NetworkTypeInUse = Ndis802_11DS; + break; + case WIRELESS_11G: + case WIRELESS_11BG: + case WIRELESS_11G_24N: + case WIRELESS_11BG_24N: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + case WIRELESS_11A: + pbss_network->NetworkTypeInUse = Ndis802_11OFDM5; + break; + default : + pbss_network->NetworkTypeInUse = Ndis802_11OFDM24; + break; + } + + pmlmepriv->cur_network.network_type = network_type; + + + pmlmepriv->htpriv.ht_option = _FALSE; +#ifdef CONFIG_80211N_HT + if( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) || + (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP)) + { + //todo: + //ht_cap = _FALSE; + } + + //ht_cap + if(pregistrypriv->ht_enable && ht_cap==_TRUE) + { + pmlmepriv->htpriv.ht_option = _TRUE; + pmlmepriv->qospriv.qos_option = 1; + + if(pregistrypriv->ampdu_enable==1) + { + pmlmepriv->htpriv.ampdu_enable = _TRUE; + } + } +#endif + + + pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); + + //issue beacon to start bss network + start_bss_network(padapter, (u8*)pbss_network); + + + //alloc sta_info for ap itself + psta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if(!psta) + { + psta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress); + if (psta == NULL) + { + return _FAIL; + } + } + + rtw_indicate_connect( padapter); + + pmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon + + //update bc/mc sta_info + //update_bmc_sta(padapter); + + return ret; + +} + +#ifdef CONFIG_NATIVEAP_MLME + +static void update_bcn_fixed_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_erpinfo_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_htcap_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_htinfo_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_rsn_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wpa_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wmm_ie(_adapter *padapter) +{ + DBG_871X("%s\n", __FUNCTION__); + +} + +static void update_bcn_wps_ie(_adapter *padapter) +{ + int match; + u8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL; + uint wps_ielen=0, wps_offset, remainder_ielen; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network); + unsigned char *ie = pnetwork->IEs; + u32 ielen = pnetwork->IELength; + + + DBG_871X("%s\n", __FUNCTION__); + + pwps_ie = rtw_get_wps_ie(ie, ielen, NULL, &wps_ielen); + + if(pwps_ie==NULL || wps_ielen==0) + return; + + wps_offset = (uint)(pwps_ie-ie); + + premainder_ie = pwps_ie + wps_ielen; + + remainder_ielen = ielen - wps_offset - wps_ielen; + + if(remainder_ielen>0) + { + pbackup_remainder_ie = rtw_malloc(remainder_ielen); + if(pbackup_remainder_ie) + _rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen); + } + + + pwps_ie_src = pmlmepriv->wps_beacon_ie; + if(pwps_ie_src == NULL) + return; + + + wps_ielen = (uint)pwps_ie_src[1];//to get ie data len + if((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ) + { + _rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2); + pwps_ie += (wps_ielen+2); + + if(pbackup_remainder_ie) + _rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen); + + //update IELength + pnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen; + } + + if(pbackup_remainder_ie) + rtw_mfree(pbackup_remainder_ie, remainder_ielen); + +} + +static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui) +{ + DBG_871X("%s\n", __FUNCTION__); + + if(_rtw_memcmp(WPA_OUI, oui, 4)) + { + update_bcn_wpa_ie(padapter); + } + else if(_rtw_memcmp(WMM_OUI, oui, 4)) + { + update_bcn_wmm_ie(padapter); + } + else if(_rtw_memcmp(WPS_OUI, oui, 4)) + { + update_bcn_wps_ie(padapter); + } + else + { + DBG_871X("unknown OUI type!\n"); + } + + +} + +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s\n", __FUNCTION__); + + if(_FALSE == pmlmeext->bstart_bss) + return; + + _enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + + switch(ie_id) + { + case 0xFF: + + update_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability + + break; + + case _TIM_IE_: + + update_BCNTIM(padapter); + + break; + + case _ERPINFO_IE_: + + update_bcn_erpinfo_ie(padapter); + + break; + + case _HT_CAPABILITY_IE_: + + update_bcn_htcap_ie(padapter); + + break; + + case _RSN_IE_2_: + + update_bcn_rsn_ie(padapter); + + break; + + case _HT_ADD_INFO_IE_: + + update_bcn_htinfo_ie(padapter); + + break; + + case _VENDOR_SPECIFIC_IE_: + + update_bcn_vendor_spec_ie(padapter, oui); + + break; + + default: + break; + } + + pmlmepriv->update_bcn = _TRUE; + + _exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL); + +#ifdef CONFIG_USB_HCI + if(tx) + { + //send_beacon(padapter);//send_beacon must execute on TSR level + set_tx_beacon_cmd(padapter); + } +#else + { + //PCI will issue beacon when BCN interrupt occurs. + } +#endif + +} + +#ifdef CONFIG_80211N_HT + +/* +op_mode +Set to 0 (HT pure) under the followign conditions + - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or + - all STAs in the BSS are 20 MHz HT in 20 MHz BSS +Set to 1 (HT non-member protection) if there may be non-HT STAs + in both the primary and the secondary channel +Set to 2 if only HT STAs are associated in BSS, + however and at least one 20 MHz HT STA is associated +Set to 3 (HT mixed mode) when one or more non-HT STAs are associated + (currently non-GF HT station is considered as non-HT STA also) +*/ +static int rtw_ht_operation_update(_adapter *padapter) +{ + u16 cur_op_mode, new_op_mode; + int op_mode_changes = 0; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; + + if(pmlmepriv->htpriv.ht_option == _TRUE) + return 0; + + //if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) + // return 0; + + DBG_871X("%s current operation mode=0x%X\n", + __FUNCTION__, pmlmepriv->ht_op_mode); + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) + && pmlmepriv->num_sta_ht_no_gf) { + pmlmepriv->ht_op_mode |= + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) && + pmlmepriv->num_sta_ht_no_gf == 0) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT; + op_mode_changes++; + } + + if (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } else if ((pmlmepriv->ht_op_mode & + HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) && + (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) { + pmlmepriv->ht_op_mode &= + ~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT; + op_mode_changes++; + } + + /* Note: currently we switch to the MIXED op mode if HT non-greenfield + * station is associated. Probably it's a theoretical case, since + * it looks like all known HT STAs support greenfield. + */ + new_op_mode = 0; + if (pmlmepriv->num_sta_no_ht || + (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)) + new_op_mode = OP_MODE_MIXED; + else if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH) + && pmlmepriv->num_sta_ht_20mhz) + new_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED; + else if (pmlmepriv->olbc_ht) + new_op_mode = OP_MODE_MAY_BE_LEGACY_STAS; + else + new_op_mode = OP_MODE_PURE; + + cur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK; + if (cur_op_mode != new_op_mode) { + pmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK; + pmlmepriv->ht_op_mode |= new_op_mode; + op_mode_changes++; + } + + DBG_871X("%s new operation mode=0x%X changes=%d\n", + __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes); + + return op_mode_changes; + +} + +#endif /* CONFIG_80211N_HT */ + + +void bss_cap_update(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + +#if 0 + if (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) { + psta->nonerp_set = 1; + pmlmepriv->num_sta_non_erp++; + if (pmlmepriv->num_sta_non_erp == 1) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(psta->flags & WLAN_STA_NONERP) + { + if(!psta->nonerp_set) + { + psta->nonerp_set = 1; + + pmlmepriv->num_sta_non_erp++; + + if (pmlmepriv->num_sta_non_erp == 1) + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + + } + else + { + if(psta->nonerp_set) + { + psta->nonerp_set = 0; + + pmlmepriv->num_sta_non_erp--; + + if (pmlmepriv->num_sta_non_erp == 0) + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + + } + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) && + !psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 1; + pmlmepriv->num_sta_no_short_slot_time++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + if(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT)) + { + if(!psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 1; + + pmlmepriv->num_sta_no_short_slot_time++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 1)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + + } + } + else + { + if(psta->no_short_slot_time_set) + { + psta->no_short_slot_time_set = 0; + + pmlmepriv->num_sta_no_short_slot_time--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_slot_time == 0)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + } + + +#if 0 + if (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) && + !psta->no_short_preamble_set) { + psta->no_short_preamble_set = 1; + pmlmepriv->num_sta_no_short_preamble++; + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + ieee802_11_set_beacons(hapd->iface); + } +#endif + + + if(!(psta->flags & WLAN_STA_SHORT_PREAMBLE)) + { + if(!psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 1; + + pmlmepriv->num_sta_no_short_preamble++; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 1)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + + } + } + else + { + if(psta->no_short_preamble_set) + { + psta->no_short_preamble_set = 0; + + pmlmepriv->num_sta_no_short_preamble--; + + if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && + (pmlmepriv->num_sta_no_short_preamble == 0)) + update_beacon(padapter, 0xFF, NULL, _TRUE); + + } + } + + +#ifdef CONFIG_80211N_HT + + if (psta->flags & WLAN_STA_HT) + { + u16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info); + + DBG_871X("HT: STA " MAC_FMT " HT Capabilities " + "Info: 0x%04x\n", MAC_ARG(psta->hwaddr), ht_capab); + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) { + if (!psta->no_ht_gf_set) { + psta->no_ht_gf_set = 1; + pmlmepriv->num_sta_ht_no_gf++; + } + DBG_871X("%s STA " MAC_FMT " - no " + "greenfield, num of non-gf stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_no_gf); + } + + if ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) { + if (!psta->ht_20mhz_set) { + psta->ht_20mhz_set = 1; + pmlmepriv->num_sta_ht_20mhz++; + } + DBG_871X("%s STA " MAC_FMT " - 20 MHz HT, " + "num of 20MHz HT STAs %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_ht_20mhz); + } + + } + else + { + if (!psta->no_ht_set) { + psta->no_ht_set = 1; + pmlmepriv->num_sta_no_ht++; + } + if(pmlmepriv->htpriv.ht_option == _TRUE) { + DBG_871X("%s STA " MAC_FMT + " - no HT, num of non-HT stations %d\n", + __FUNCTION__, MAC_ARG(psta->hwaddr), + pmlmepriv->num_sta_no_ht); + } + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + +} + +void ap_free_sta(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct sta_priv *pstapriv = &padapter->stapriv; + + if(!psta) + return; + + + if (psta->nonerp_set) { + psta->nonerp_set = 0; + pmlmepriv->num_sta_non_erp--; + if (pmlmepriv->num_sta_non_erp == 0) + update_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE); + } + + if (psta->no_short_slot_time_set) { + psta->no_short_slot_time_set = 0; + pmlmepriv->num_sta_no_short_slot_time--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_slot_time == 0) + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + + if (psta->no_short_preamble_set) { + psta->no_short_preamble_set = 0; + pmlmepriv->num_sta_no_short_preamble--; + if (pmlmeext->cur_wireless_mode > WIRELESS_11B + && pmlmepriv->num_sta_no_short_preamble == 0) + update_beacon(padapter, 0xFF, NULL, _TRUE); + } + +#ifdef CONFIG_80211N_HT + + if (psta->no_ht_gf_set) { + psta->no_ht_gf_set = 0; + pmlmepriv->num_sta_ht_no_gf--; + } + + if (psta->no_ht_set) { + psta->no_ht_set = 0; + pmlmepriv->num_sta_no_ht--; + } + + if (psta->ht_20mhz_set) { + psta->ht_20mhz_set = 0; + pmlmepriv->num_sta_ht_20mhz--; + } + + if (rtw_ht_operation_update(padapter) > 0) + { + update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE); + update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE); + } + +#endif /* CONFIG_80211N_HT */ + + + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + + issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); + + //report_del_sta_event(padapter, psta->hwaddr); + + //clear key + //clear_cam_entry(padapter, (psta->mac_id + 3)); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + +} + +int rtw_sta_flush(_adapter *padapter) +{ + _list *phead, *plist; + int ret=0; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + + DBG_871X("%s\n", __FUNCTION__); + + if((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE) + return ret; + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //free sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + rtw_list_delete(&psta->asoc_list); + + ap_free_sta(padapter, psta); + + } + + + issue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING); + + return ret; + +} + +void sta_info_update(_adapter *padapter, struct sta_info *psta) +{ + int flags = psta->flags; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + + //update wmm cap. + if(WLAN_STA_WME&flags) + psta->qos_option = 1; + else + psta->qos_option = 0; + + if(pmlmepriv->qospriv.qos_option == 0) + psta->qos_option = 0; + + +#ifdef CONFIG_80211N_HT + //update 802.11n ht cap. + if(WLAN_STA_HT&flags) + { + psta->htpriv.ht_option = _TRUE; + psta->qos_option = 1; + } + else + { + psta->htpriv.ht_option = _FALSE; + } + + if(pmlmepriv->htpriv.ht_option == _FALSE) + psta->htpriv.ht_option = _FALSE; +#endif + + + update_sta_info_apmode(padapter, psta); + + +} + +void start_ap_mode(_adapter *padapter) +{ + int i; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + pmlmepriv->update_bcn = _FALSE; + + //init_mlme_ap_info(padapter); + pmlmeext->bstart_bss = _FALSE; + + pmlmepriv->num_sta_non_erp = 0; + + pmlmepriv->num_sta_no_short_slot_time = 0; + + pmlmepriv->num_sta_no_short_preamble = 0; + + pmlmepriv->num_sta_ht_no_gf = 0; + + pmlmepriv->num_sta_no_ht = 0; + + pmlmepriv->num_sta_ht_20mhz = 0; + + pmlmepriv->olbc = _FALSE; + + pmlmepriv->olbc_ht = _FALSE; + +#ifdef CONFIG_80211N_HT + pmlmepriv->ht_op_mode = 0; +#endif + + for(i=0; ista_aid[i] = NULL; + + pmlmepriv->wps_beacon_ie = NULL; + pmlmepriv->wps_probe_resp_ie = NULL; + pmlmepriv->wps_assoc_resp_ie = NULL; + + +} + +void stop_ap_mode(_adapter *padapter) +{ + _irqL irqL; + //_list *phead, *plist; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + pmlmepriv->update_bcn = _FALSE; + pmlmeext->bstart_bss = _FALSE; + //_rtw_spinlock_free(&pmlmepriv->bcn_update_lock); + + //phead = &pstapriv->asoc_list; + //plist = get_next(phead); + + rtw_sta_flush(padapter); + +#if 0 + //free sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + rtw_list_delete(&psta->asoc_list); + + //tear down Rx AMPDU + send_delba(padapter, 0, psta->hwaddr);// recipient + + //tear down TX AMPDU + send_delba(padapter, 1, psta->hwaddr);// // originator + psta->htpriv.agg_enable_bitmap = 0x0;//reset + psta->htpriv.candidate_tid_bitmap = 0x0;//reset + + issue_deauth(padapter, psta->hwaddr, WLAN_REASON_DEAUTH_LEAVING); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + } +#endif + + //free_assoc_sta_resources + rtw_free_all_stainfo(padapter); + + psta = rtw_get_bcmc_stainfo(padapter); + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(padapter, psta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + + rtw_init_bcmc_stainfo(padapter); + + + if(pmlmepriv->wps_beacon_ie) + { + rtw_mfree(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len); + pmlmepriv->wps_beacon_ie = NULL; + } + + if(pmlmepriv->wps_probe_resp_ie) + { + rtw_mfree(pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len); + pmlmepriv->wps_probe_resp_ie = NULL; + } + + if(pmlmepriv->wps_assoc_resp_ie) + { + rtw_mfree(pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len); + pmlmepriv->wps_assoc_resp_ie = NULL; + } + +} + + +#endif + +#endif + +u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct SetChannelPlan_param *setChannelPlan_param; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + //struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + setChannelPlan_param = (struct SetChannelPlan_param *)pbuf; + + //Jeff: We use mlmepriv->ChannelPlan to indicate channel plan, + //the setChannelPlan_param is useless now... + + pmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set); + + return H2C_SUCCESS; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mp.c b/drivers/net/wireless/rtl8192c/core/rtw_mp.c new file mode 100755 index 000000000000..7b9f81a0d781 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mp.c @@ -0,0 +1,1294 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_MP_C_ + +#include + +#ifdef CONFIG_RTL8712 +#include +#endif +#ifdef CONFIG_RTL8192C +#include +#endif +#ifdef CONFIG_RTL8192D +#include +#endif + +#ifdef CONFIG_MP_INCLUDED + +u32 read_macreg(_adapter *padapter, u32 addr, u32 sz) +{ + u32 val = 0; + + switch(sz) + { + case 1: + val = rtw_read8(padapter, addr); + break; + case 2: + val = rtw_read16(padapter, addr); + break; + case 4: + val = rtw_read32(padapter, addr); + break; + default: + val = 0xffffffff; + break; + } + + return val; + +} + +void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz) +{ + switch(sz) + { + case 1: + rtw_write8(padapter, addr, (u8)val); + break; + case 2: + rtw_write16(padapter, addr, (u16)val); + break; + case 4: + rtw_write32(padapter, addr, val); + break; + default: + break; + } + +} + +u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask) +{ + return padapter->HalFunc.read_bbreg(padapter, addr, bitmask); +} + +void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val) +{ + padapter->HalFunc.write_bbreg(padapter, addr, bitmask, val); +} + +u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask) +{ + return padapter->HalFunc.read_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bitmask); +} + +void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val) +{ + padapter->HalFunc.write_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bitmask, val); +} + +u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr) +{ + return _read_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask); +} + +void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val) +{ + _write_rfreg(padapter, (RF90_RADIO_PATH_E)rfpath, addr, bRFRegOffsetMask, val); +} + + +static void _init_mp_priv_(struct mp_priv *pmp_priv) +{ + WLAN_BSSID_EX *pnetwork; + + _rtw_memset(pmp_priv, 0, sizeof(struct mp_priv)); + + pmp_priv->mode = MP_OFF; + + pmp_priv->channel = 1; + pmp_priv->bandwidth = HT_CHANNEL_WIDTH_20; + pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + pmp_priv->rateidx = MPT_RATE_1M; + pmp_priv->txpoweridx = 0x2A; + + pmp_priv->antenna_tx = ANTENNA_A; + pmp_priv->antenna_rx = ANTENNA_AB; + + pmp_priv->check_mp_pkt = 0; + + pmp_priv->tx_pktcount = 0; + + pmp_priv->rx_pktcount = 0; + pmp_priv->rx_crcerrpktcount = 0; + + pmp_priv->network_macaddr[0] = 0x00; + pmp_priv->network_macaddr[1] = 0xE0; + pmp_priv->network_macaddr[2] = 0x4C; + pmp_priv->network_macaddr[3] = 0x87; + pmp_priv->network_macaddr[4] = 0x66; + pmp_priv->network_macaddr[5] = 0x55; + + pnetwork = &pmp_priv->mp_network.network; + _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN); + + pnetwork->Ssid.SsidLength = 8; + _rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength); +} + +#ifdef PLATFORM_WINDOWS +/* +void mp_wi_callback( + IN NDIS_WORK_ITEM* pwk_item, + IN PVOID cntx + ) +{ + _adapter* padapter =(_adapter *)cntx; + struct mp_priv *pmppriv=&padapter->mppriv; + struct mp_wi_cntx *pmp_wi_cntx=&pmppriv->wi_cntx; + + // Execute specified action. + if(pmp_wi_cntx->curractfunc != NULL) + { + LARGE_INTEGER cur_time; + ULONGLONG start_time, end_time; + NdisGetCurrentSystemTime(&cur_time); // driver version + start_time = cur_time.QuadPart/10; // The return value is in microsecond + + pmp_wi_cntx->curractfunc(padapter); + + NdisGetCurrentSystemTime(&cur_time); // driver version + end_time = cur_time.QuadPart/10; // The return value is in microsecond + + RT_TRACE(_module_mp_, _drv_info_, + ("WorkItemActType: %d, time spent: %I64d us\n", + pmp_wi_cntx->param.act_type, (end_time-start_time))); + } + + NdisAcquireSpinLock(&(pmp_wi_cntx->mp_wi_lock)); + pmp_wi_cntx->bmp_wi_progress= _FALSE; + NdisReleaseSpinLock(&(pmp_wi_cntx->mp_wi_lock)); + + if (pmp_wi_cntx->bmpdrv_unload) + { + NdisSetEvent(&(pmp_wi_cntx->mp_wi_evt)); + } + +} +*/ + +static int init_mp_priv_by_os(struct mp_priv *pmp_priv) +{ + struct mp_wi_cntx *pmp_wi_cntx; + + if (pmp_priv == NULL) return _FAIL; + + pmp_priv->rx_testcnt = 0; + pmp_priv->rx_testcnt1 = 0; + pmp_priv->rx_testcnt2 = 0; + + pmp_priv->tx_testcnt = 0; + pmp_priv->tx_testcnt1 = 0; + + pmp_wi_cntx = &pmp_priv->wi_cntx + pmp_wi_cntx->bmpdrv_unload = _FALSE; + pmp_wi_cntx->bmp_wi_progress = _FALSE; + pmp_wi_cntx->curractfunc = NULL; + + return _SUCCESS; +} +#endif + +#ifdef PLATFORM_LINUX +static int init_mp_priv_by_os(struct mp_priv *pmp_priv) +{ + int i, res; + struct mp_xmit_frame *pmp_xmitframe; + + if (pmp_priv == NULL) return _FAIL; + + _rtw_init_queue(&pmp_priv->free_mp_xmitqueue); + + pmp_priv->pallocated_mp_xmitframe_buf = NULL; + pmp_priv->pallocated_mp_xmitframe_buf = rtw_zmalloc(NR_MP_XMITFRAME * sizeof(struct mp_xmit_frame) + 4); + if (pmp_priv->pallocated_mp_xmitframe_buf == NULL) { + res = _FAIL; + goto _exit_init_mp_priv; + } + + pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((uint) (pmp_priv->pallocated_mp_xmitframe_buf) & 3); + + pmp_xmitframe = (struct mp_xmit_frame*)pmp_priv->pmp_xmtframe_buf; + + for (i = 0; i < NR_MP_XMITFRAME; i++) + { + _rtw_init_listhead(&pmp_xmitframe->list); + rtw_list_insert_tail(&pmp_xmitframe->list, &pmp_priv->free_mp_xmitqueue.queue); + + pmp_xmitframe->pkt = NULL; + pmp_xmitframe->frame_tag = MP_FRAMETAG; + pmp_xmitframe->padapter = pmp_priv->papdater; + + pmp_xmitframe++; + } + + pmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME; + + res = _SUCCESS; + +_exit_init_mp_priv: + + return res; +} +#endif + +static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter) +{ + struct pkt_attrib *pattrib; + struct tx_desc *desc; + + // init xmitframe attribute + pattrib = &pmptx->attrib; + _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib)); + desc = &pmptx->desc; + _rtw_memset(desc, 0, TXDESC_SIZE); + + pattrib->ether_type = 0x8712; + //_rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); +// _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN); +// pattrib->pctrl = 0; +// pattrib->dhcp_pkt = 0; +// pattrib->pktlen = 0; + pattrib->ack_policy = 0; +// pattrib->pkt_hdrlen = ETH_HLEN; + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA; + pattrib->priority = 0; + pattrib->qsel = pattrib->priority; +// do_queue_select(padapter, pattrib); + pattrib->nr_frags = 1; + pattrib->encrypt = 0; + pattrib->bswenc = _FALSE; + pattrib->qos_en = _FALSE; +} + +s32 init_mp_priv(PADAPTER padapter) +{ + struct mp_priv *pmppriv = &padapter->mppriv; + + _init_mp_priv_(pmppriv); + pmppriv->papdater = padapter; + + pmppriv->tx.stop = 1; + mp_init_xmit_attrib(&pmppriv->tx, padapter); + + switch (padapter->registrypriv.rf_config) { + case RF_1T1R: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_A; + break; + case RF_1T2R: + default: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T2R: + case RF_2T2R_GREEN: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T4R: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_ABCD; + break; + } + + return _SUCCESS; +} + +void free_mp_priv(struct mp_priv *pmp_priv) +{ + if (pmp_priv->pallocated_mp_xmitframe_buf) { + rtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0); + pmp_priv->pallocated_mp_xmitframe_buf = NULL; + } + pmp_priv->pmp_xmtframe_buf = NULL; +} + +#ifdef CONFIG_RTL8192C +#define PHY_IQCalibrate(a,b) rtl8192c_PHY_IQCalibrate(a,b) +#define PHY_LCCalibrate(a) rtl8192c_PHY_LCCalibrate(a) +#define dm_CheckTXPowerTracking(a) rtl8192c_dm_CheckTXPowerTracking(a) +#define PHY_SetRFPathSwitch(a,b) rtl8192c_PHY_SetRFPathSwitch(a,b) +#endif + +#ifdef CONFIG_RTL8192D +#define PHY_IQCalibrate(a) rtl8192d_PHY_IQCalibrate(a) +#define PHY_LCCalibrate(a) rtl8192d_PHY_LCCalibrate(a) +#define dm_CheckTXPowerTracking(a) rtl8192d_dm_CheckTXPowerTracking(a) +#define PHY_SetRFPathSwitch(a,b) rtl8192d_PHY_SetRFPathSwitch(a,b) +#endif + +s32 +MPT_InitializeAdapter( + IN PADAPTER pAdapter, + IN u8 Channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + s32 rtStatus = _SUCCESS; + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + u32 tmpRegA, tmpRegC, TempCCk,ledsetting; + + //------------------------------------------------------------------------- + // HW Initialization for 8190 MPT. + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + // SW Initialization for 8190 MP. + //------------------------------------------------------------------------- + pMptCtx->bMptDrvUnload = _FALSE; + pMptCtx->bMassProdTest = _FALSE; + pMptCtx->bMptIndexEven = _TRUE; //default gain index is -6.0db + + /* Init mpt event. */ +#if 0 // for Windows + NdisInitializeEvent( &(pMptCtx->MptWorkItemEvent) ); + NdisAllocateSpinLock( &(pMptCtx->MptWorkItemSpinLock) ); + + PlatformInitializeWorkItem( + Adapter, + &(pMptCtx->MptWorkItem), + (RT_WORKITEM_CALL_BACK)MPT_WorkItemCallback, + (PVOID)Adapter, + "MptWorkItem"); +#endif + pMptCtx->bMptWorkItemInProgress = _FALSE; + pMptCtx->CurrMptAct = NULL; + //------------------------------------------------------------------------- + +#if 1 + // Don't accept any packets + rtw_write32(pAdapter, REG_RCR, 0); +#else + // Accept CRC error and destination address + pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); +#endif + +#if 0 + // If EEPROM or EFUSE is empty,we assign as RF 2T2R for MP. + if (pHalData->AutoloadFailFlag == TRUE) + { + pHalData->RF_Type = RF_2T2R; + } +#endif + ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); + rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); + +#ifdef CONFIG_RTL8192C + PHY_IQCalibrate(pAdapter, _FALSE); + dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter + PHY_LCCalibrate(pAdapter); +#endif + +#ifdef CONFIG_RTL8192D + PHY_IQCalibrate(pAdapter); + dm_CheckTXPowerTracking(pAdapter); //trigger thermal meter + PHY_LCCalibrate(pAdapter); +#endif + +#ifdef CONFIG_PCI_HCI + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //Wifi default use Main +#else + +#ifdef CONFIG_RTL8192C +#if 1 + if (pHalData->BoardType == BOARD_MINICARD) + PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main +#else + if(pAdapter->HalFunc.GetInterfaceSelectionHandler(pAdapter) == INTF_SEL2_MINICARD ) + PHY_SetRFPathSwitch(Adapter, pAdapter->MgntInfo.bDefaultAntenna); //default use Main +#endif + +#endif + +#endif + + pMptCtx->backup0xc50 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0); + pMptCtx->backup0xc58 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0); + pMptCtx->backup0xc30 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_RxDetector1, bMaskByte0); + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: MPT_DeInitAdapter() + * + * Overview: Extra DeInitialization for Mass Production Test. + * + * Input: PADAPTER pAdapter + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 05/08/2007 MHC Create Version 0. + * 05/18/2007 MHC Add normal driver MPHalt code. + * + *---------------------------------------------------------------------------*/ +VOID +MPT_DeInitAdapter( + IN PADAPTER pAdapter + ) +{ + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + pMptCtx->bMptDrvUnload = _TRUE; +#if 0 // for Windows + PlatformFreeWorkItem( &(pMptCtx->MptWorkItem) ); + + while(pMptCtx->bMptWorkItemInProgress) + { + if(NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50)) + { + break; + } + } + NdisFreeSpinLock( &(pMptCtx->MptWorkItemSpinLock) ); +#endif +} + +static u8 mpt_ProStartTest(PADAPTER padapter) +{ + PMPT_CONTEXT pMptCtx = &padapter->mppriv.MptCtx; + + pMptCtx->bMassProdTest = _TRUE; + pMptCtx->bStartContTx = _FALSE; + pMptCtx->bCckContTx = _FALSE; + pMptCtx->bOfdmContTx = _FALSE; + pMptCtx->bSingleCarrier = _FALSE; + pMptCtx->bCarrierSuppression = _FALSE; + pMptCtx->bSingleTone = _FALSE; + + return _SUCCESS; +} + +/* + * General use + */ +s32 SetPowerTracking(PADAPTER padapter, u8 enable) +{ + + Hal_SetPowerTracking( padapter, enable ); + return 0; +} + +void GetPowerTracking(PADAPTER padapter, u8 *enable) +{ + Hal_GetPowerTracking( padapter, enable ); +} + +static void disable_dm(PADAPTER padapter) +{ + u8 v8; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + //3 1. disable firmware dynamic mechanism + // disable Power Training, Rate Adaptive + v8 = rtw_read8(padapter, REG_BCN_CTRL); + v8 &= ~EN_BCN_FUNCTION; + rtw_write8(padapter, REG_BCN_CTRL, v8); + + //3 2. disable driver dynamic mechanism + // disable Dynamic Initial Gain + // disable High Power + // disable Power Tracking + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + // enable APK, LCK and IQK but disable power tracking + pdmpriv->TxPowerTrackControl = _FALSE; + Switch_DM_Func(padapter, DYNAMIC_FUNC_SS, _TRUE); +} + +//This function initializes the DUT to the MP test mode +s32 mp_start_test(PADAPTER padapter) +{ + WLAN_BSSID_EX bssid; + struct sta_info *psta; + u32 length; + u8 val8; + + _irqL irqL; + s32 res = _SUCCESS; + + struct mp_priv *pmppriv = &padapter->mppriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + + + //3 disable dynamic mechanism + disable_dm(padapter); + + //3 0. update mp_priv +#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D) + if (padapter->registrypriv.rf_config == RF_819X_MAX_TYPE) { +// HAL_DATA_TYPE *phal = GET_HAL_DATA(padapter); +// switch (phal->rf_type) { + switch (GET_RF_TYPE(padapter)) { + case RF_1T1R: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_A; + break; + case RF_1T2R: + default: + pmppriv->antenna_tx = ANTENNA_A; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T2R: + case RF_2T2R_GREEN: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_AB; + break; + case RF_2T4R: + pmppriv->antenna_tx = ANTENNA_AB; + pmppriv->antenna_rx = ANTENNA_ABCD; + break; + } + } +#endif + mpt_ProStartTest(padapter); + + //3 1. initialize a new WLAN_BSSID_EX +// _rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX)); + _rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN); + bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc"); + _rtw_memcpy(bssid.Ssid.Ssid, (u8*)"mp_pseudo_adhoc", bssid.Ssid.SsidLength); + bssid.InfrastructureMode = Ndis802_11IBSS; + bssid.NetworkTypeInUse = Ndis802_11DS; + bssid.IELength = 0; + + length = get_WLAN_BSSID_EX_sz(&bssid); + if (length % 4) + bssid.Length = ((length >> 2) + 1) << 2; //round up to multiple of 4 bytes. + else + bssid.Length = length; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + goto end_of_mp_start_test; + + //init mp_start_test status + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { + rtw_disassoc_cmd(padapter); + rtw_indicate_disconnect(padapter); + rtw_free_assoc_resources(padapter); + } + pmppriv->prev_fw_state = get_fwstate(pmlmepriv); + pmlmepriv->fw_state = WIFI_MP_STATE; +#if 0 + if (pmppriv->mode == _LOOPBOOK_MODE_) { + set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc + RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in Lookback mode\n")); + } else { + RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in normal mode\n")); + } +#endif + set_fwstate(pmlmepriv, _FW_UNDER_LINKING); + + //3 2. create a new psta for mp driver + //clear psta in the cur_network, if any + psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); + if (psta) rtw_free_stainfo(padapter, psta); + + psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress); + if (psta == NULL) { + RT_TRACE(_module_mp_, _drv_err_, ("mp_start_test: Can't alloc sta_info!\n")); + pmlmepriv->fw_state = pmppriv->prev_fw_state; + res = _FAIL; + goto end_of_mp_start_test; + } + + //3 3. join psudo AdHoc + tgt_network->join_res = 1; + tgt_network->aid = psta->aid = 1; + _rtw_memcpy(&tgt_network->network, &bssid, length); + + rtw_indicate_connect(padapter); + _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); + +end_of_mp_start_test: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + if (res == _SUCCESS) + { + // set MSR to WIFI_FW_ADHOC_STATE +#if defined (CONFIG_RTL8192C) || defined (CONFIG_RTL8192D) + val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102 + val8 |= WIFI_FW_ADHOC_STATE; + rtw_write8(padapter, MSR, val8); // Link in ad hoc network +#endif + +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D) + rtw_write8(padapter, MSR, 1); // Link in ad hoc network + rtw_write8(padapter, RCR, 0); // RCR : disable all pkt, 0x10250048 + rtw_write8(padapter, RCR+2, 0x57); // RCR disable Check BSSID, 0x1025004a + + // disable RX filter map , mgt frames will put in RX FIFO 0 + rtw_write16(padapter, RXFLTMAP0, 0x0); // 0x10250116 + + val8 = rtw_read8(padapter, EE_9346CR); // 0x1025000A + if (!(val8 & _9356SEL))//boot from EFUSE + efuse_change_max_size(padapter); +#endif + } + + return res; +} +//------------------------------------------------------------------------------ +//This function change the DUT from the MP test mode into normal mode +void mp_stop_test(PADAPTER padapter) +{ + struct mp_priv *pmppriv = &padapter->mppriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + struct sta_info *psta; + + _irqL irqL; + + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE) + goto end_of_mp_stop_test; + + //3 1. disconnect psudo AdHoc + rtw_indicate_disconnect(padapter); + + //3 2. clear psta used in mp test mode. +// rtw_free_assoc_resources(padapter); + psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress); + if (psta) rtw_free_stainfo(padapter, psta); + + //3 3. return to normal state (default:station mode) + pmlmepriv->fw_state = pmppriv->prev_fw_state; // WIFI_STATION_STATE; + + //flush the cur_network + _rtw_memset(tgt_network, 0, sizeof(struct wlan_network)); + + _clr_fwstate_(pmlmepriv, WIFI_MP_STATE); + +end_of_mp_stop_test: + + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ +#if 0 +//#ifdef CONFIG_USB_HCI +static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID) +{ + u8 eRFPath; + u32 rfReg0x26; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + if (RateIdx < MPT_RATE_6M) { // CCK rate,for 88cu + rfReg0x26 = 0xf400; + } + else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {// OFDM rate,for 88cu + if ((4 == Channel) || (8 == Channel) || (12 == Channel)) + rfReg0x26 = 0xf000; + else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel)) + rfReg0x26 = 0xf400; + else + rfReg0x26 = 0x4f200; + } + else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {// MCS 20M ,for 88cu // MCS40M rate,for 88cu + + if (HT_CHANNEL_WIDTH_20 == BandWidthID) { + if ((4 == Channel) || (8 == Channel)) + rfReg0x26 = 0xf000; + else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel)) + rfReg0x26 = 0xf400; + else + rfReg0x26 = 0x4f200; + } + else{ + if ((4 == Channel) || (8 == Channel)) + rfReg0x26 = 0xf000; + else if ((5 == Channel) || (7 == Channel)) + rfReg0x26 = 0xf400; + else + rfReg0x26 = 0x4f200; + } + } + +// RT_TRACE(COMP_CMD, DBG_LOUD, ("\n mpt_AdjustRFRegByRateByChan92CU():Chan:%d Rate=%d rfReg0x26:0x%08x\n",Channel, RateIdx,rfReg0x26)); + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) { + write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26); + } +} +#endif +/*----------------------------------------------------------------------------- + * Function: mpt_SwitchRfSetting + * + * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. + * + * Input: IN PADAPTER pAdapter + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. + * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. + * + *---------------------------------------------------------------------------*/ +static void mpt_SwitchRfSetting(PADAPTER pAdapter) +{ + Hal_mpt_SwitchRfSetting(pAdapter); + } + +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ +static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) +{ + Hal_MPT_CCKTxPowerAdjust(Adapter,bInCH14); +} + +static void MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) +{ + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter,beven); + } + +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ + +/* + * SetChannel + * Description + * Use H2C command to change channel, + * not only modify rf register, but also other setting need to be done. + */ +void SetChannel(PADAPTER pAdapter) +{ + Hal_SetChannel(pAdapter); + +} + +/* + * Notice + * Switch bandwitdth may change center frequency(channel) + */ +void SetBandwidth(PADAPTER pAdapter) +{ + Hal_SetBandwidth(pAdapter); + +} + +static void SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + Hal_SetCCKTxPower(pAdapter,TxPower); +} + +static void SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + Hal_SetOFDMTxPower(pAdapter,TxPower); + } + + +void SetAntenna(PADAPTER pAdapter) + { + Hal_SetAntenna(pAdapter); +} + +void SetAntennaPathPower(PADAPTER pAdapter) +{ + Hal_SetAntennaPathPower(pAdapter); +} + +void SetTxPower(PADAPTER pAdapter) +{ + Hal_SetTxPower(pAdapter); +} + +void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) +{ + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; + + TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); + TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); + TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); + + tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); + write_bbreg(pAdapter, rFPGA0_TxGainStage, + (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); +} + +void SetDataRate(PADAPTER pAdapter) +{ + Hal_SetDataRate(pAdapter); +} + +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D) +/*------------------------------Define structure----------------------------*/ +typedef struct _R_ANTENNA_SELECT_OFDM { + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK { + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; +#endif + +s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther) +{ + return Hal_SetThermalMeter( pAdapter, target_ther); +} + +static void TriggerRFThermalMeter(PADAPTER pAdapter) +{ + Hal_TriggerRFThermalMeter(pAdapter); +} + +static u8 ReadRFThermalMeter(PADAPTER pAdapter) +{ + return Hal_ReadRFThermalMeter(pAdapter); +} + +void GetThermalMeter(PADAPTER pAdapter, u8 *value) +{ + Hal_GetThermalMeter(pAdapter,value); +} + +void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) +{ + Hal_SetSingleCarrierTx(pAdapter,bStart); +} + +void SetSingleToneTx(PADAPTER pAdapter, u8 bStart) +{ + Hal_SetSingleToneTx(pAdapter,bStart); +} + +void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) +{ + Hal_SetCarrierSuppressionTx(pAdapter, bStart); +} + +void SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + Hal_SetCCKContinuousTx(pAdapter,bStart); + } + +void SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + Hal_SetOFDMContinuousTx( pAdapter, bStart); +}/* mpt_StartOfdmContTx */ + +void SetContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + Hal_SetContinuousTx(pAdapter,bStart); +} + +//------------------------------------------------------------------------------ +void dump_mpframe(_adapter *padapter, struct xmit_frame *pmpframe) +{ + padapter->HalFunc.mgnt_xmit(padapter, pmpframe); +} + +struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv) +{ + struct xmit_frame *pmpframe; + struct xmit_buf *pxmitbuf; + + if ((pmpframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL) + { + return NULL; + } + + if ((pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL) + { + rtw_free_xmitframe_ex(pxmitpriv, pmpframe); + return NULL; + } + + pmpframe->frame_tag = MP_FRAMETAG; + + pmpframe->pxmitbuf = pxmitbuf; + + pmpframe->buf_addr = pxmitbuf->pbuf; + + pxmitbuf->priv_data = pmpframe; + + return pmpframe; + +} + +thread_return mp_xmit_packet_thread(thread_context context) +{ + struct xmit_frame *pxmitframe; + struct mp_tx *pmptx; + struct mp_priv *pmp_priv; + struct xmit_priv *pxmitpriv; + PADAPTER padapter; + + pmp_priv = (struct mp_priv *)context; + pmptx = &pmp_priv->tx; + padapter = pmp_priv->papdater; + pxmitpriv = &(padapter->xmitpriv); + + thread_enter(padapter); + + //DBG_8192C("%s:pkTx Start\n", __func__); + while (1) { + pxmitframe = alloc_mp_xmitframe(pxmitpriv); + if (pxmitframe == NULL) { + if (pmptx->stop || + padapter->bSurpriseRemoved || + padapter->bDriverStopped) { + goto exit; + } + else { + rtw_msleep_os(1); + continue; + } + } + + _rtw_memcpy((u8 *)(pxmitframe->buf_addr+TXDESC_OFFSET), pmptx->buf, pmptx->write_size); + _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib)); + + dump_mpframe(padapter, pxmitframe); + + pmptx->sended++; + pmp_priv->tx_pktcount++; + + if (pmptx->stop || + padapter->bSurpriseRemoved || + padapter->bDriverStopped) + goto exit; + if ((pmptx->count != 0) && + (pmptx->count == pmptx->sended)) + goto exit; + + flush_signals_thread(); + } + +exit: + //DBG_8192C("%s:pkTx Exit\n", __func__); + rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size); + pmptx->pallocated_buf = NULL; + pmptx->stop = 1; + + thread_exit(); +} + +void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc) +{ + struct mp_priv *pmp_priv = &padapter->mppriv; + _rtw_memcpy(ptxdesc, &(pmp_priv->tx.desc), TXDESC_SIZE); +} + +void SetPacketTx(PADAPTER padapter) +{ + u8 *ptr, *pkt_start, *pkt_end; + u32 pkt_size; + struct tx_desc *desc; + struct ieee80211_hdr *hdr; + u8 macid, payload; + s32 bmcast; + struct pkt_attrib *pattrib; + struct mp_priv *pmp_priv; + + + pmp_priv = &padapter->mppriv; + if (pmp_priv->tx.stop) return; + pmp_priv->tx.sended = 0; + pmp_priv->tx.stop = 0; + pmp_priv->tx_pktcount = 0; + + //3 1. update_attrib() + pattrib = &pmp_priv->tx.attrib; + _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + bmcast = IS_MCAST(pattrib->ra); + if (bmcast) { + pattrib->mac_id = 1; + pattrib->psta = rtw_get_bcmc_stainfo(padapter); + } else { + pattrib->mac_id = 0; + pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); + } + + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen; + + //3 2. allocate xmit buffer + pkt_size = pattrib->last_txcmdsz; + + if (pmp_priv->tx.pallocated_buf) + rtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size); + pmp_priv->tx.write_size = pkt_size; + pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ; + pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size); + if (pmp_priv->tx.pallocated_buf == NULL) { + DBG_8192C("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size); + return; + } + pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ); + ptr = pmp_priv->tx.buf; + + desc = &(pmp_priv->tx.desc); + _rtw_memset(desc, 0, TXDESC_SIZE); + pkt_start = ptr; + pkt_end = pkt_start + pkt_size; + + //3 3. init TX descriptor + // offset 0 + //desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size + //desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); + //desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc + //if (bmcast) desc->txdw0 |= cpu_to_le32(BMC); // broadcast packet + + // offset 4 + desc->txdw1 |= cpu_to_le32(BK); // don't aggregate(AMPDU) + desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x1F); //CAM_ID(MAC_ID) + desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); // Queue Select, TID + desc->txdw1 |= cpu_to_le32((pattrib->raid << Rate_ID_SHT) & 0x000F0000); // Rate Adaptive ID + + // offset 8 + // offset 12 + //desc->txdw3 |= cpu_to_le32((pattrib->seqnum << SEQ_SHT) & 0xffff0000); + + // offset 16 + //desc->txdw4 |= cpu_to_le32(QoS); + desc->txdw4 |= cpu_to_le32(HW_SEQ_EN); + desc->txdw4 |= cpu_to_le32(USERATE); + desc->txdw4 |= cpu_to_le32(DISDATAFB); + + if( pmp_priv->preamble ){ + if (pmp_priv->rateidx <= MPT_RATE_54M) + desc->txdw4 |= cpu_to_le32(DATA_SHORT); // CCK Short Preamble + } + if (pmp_priv->bandwidth == HT_CHANNEL_WIDTH_40) + desc->txdw4 |= cpu_to_le32(DATA_BW); + + // offset 20 + desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F); + + if( pmp_priv->preamble ){ + if (pmp_priv->rateidx > MPT_RATE_54M) + desc->txdw5 |= cpu_to_le32(SGI); // MCS Short Guard Interval + } + desc->txdw5 |= cpu_to_le32(0x0001FF00); // DATA/RTS Rate Fallback Limit + + //3 4. make wlan header, make_wlanhdr() + hdr = (struct ieee80211_hdr *)pkt_start; + SetFrameSubType(&hdr->frame_ctl, pattrib->subtype); + _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA + _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA + _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID + + //3 5. make payload + ptr = pkt_start + pattrib->hdrlen; + + switch (pmp_priv->tx.payload) { + case 0: + payload = 0x00; + break; + case 1: + payload = 0x5a; + break; + case 2: + payload = 0xa5; + break; + case 3: + payload = 0xff; + break; + default: + payload = 0x00; + break; + } + + _rtw_memset(ptr, payload, pkt_end - ptr); + + //3 6. start thread + pmp_priv->tx.PktTxThread = kernel_thread(mp_xmit_packet_thread, pmp_priv, CLONE_FS|CLONE_FILES); + if(pmp_priv->tx.PktTxThread < 0) + DBG_871X("Create PktTx Thread Fail !!!!!\n"); + +} + +void SetPacketRx(PADAPTER pAdapter, u8 bStartRx) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if(bStartRx) + { + // Accept CRC error and destination address + pHalData->ReceiveConfig |= (RCR_ACRC32|RCR_AAP); + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); + } + else + { + rtw_write32(pAdapter, REG_RCR, 0); + } +} + +void ResetPhyRxPktCount(PADAPTER pAdapter) +{ + u32 i, phyrx_set = 0; + + for (i = 0; i <= 0xF; i++) { + phyrx_set = 0; + phyrx_set |= _RXERR_RPT_SEL(i); //select + phyrx_set |= RXERR_RPT_RST; // set counter to zero + rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); + } +} + +static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit) +{ + //selection + u32 phyrx_set = 0, count = 0; + + phyrx_set = _RXERR_RPT_SEL(selbit & 0xF); + rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set); + + //Read packet count + count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK; + + return count; +} + +u32 GetPhyRxPktReceived(PADAPTER pAdapter) +{ + u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; + + OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK); + CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK); + HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK); + + return OFDM_cnt + CCK_cnt + HT_cnt; +} + +u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter) +{ + u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0; + + OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL); + CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL); + HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL); + + return OFDM_cnt + CCK_cnt + HT_cnt; +} + +//reg 0x808[9:0]: FFT data x +//reg 0x808[22]: 0 --> 1 to get 1 FFT data y +//reg 0x8B4[15:0]: FFT data y report +static u32 GetPSDData(PADAPTER pAdapter, u32 point) +{ + int psd_val; + + + psd_val = rtw_read32(pAdapter, 0x808); + psd_val &= 0xFFBFFC00; + psd_val |= point; + + rtw_write32(pAdapter, 0x808, psd_val); + rtw_mdelay_os(1); + psd_val |= 0x00400000; + + rtw_write32(pAdapter, 0x808, psd_val); + rtw_mdelay_os(1); + psd_val = rtw_read32(pAdapter, 0x8B4); + + psd_val &= 0x0000FFFF; + + return psd_val; +} + +/* + * pts start_point_min stop_point_max + * 128 64 64 + 128 = 192 + * 256 128 128 + 256 = 384 + * 512 256 256 + 512 = 768 + * 1024 512 512 + 1024 = 1536 + * + */ +u32 mp_query_psd(PADAPTER pAdapter, u8 *data) +{ + u8 *val; + u32 i, psd_pts=0, psd_start=0, psd_stop=0; + u32 psd_data=0; + + + if (!netif_running(pAdapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! interface not opened!\n")); + return 0; + } + + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("mp_query_psd: Fail! not in MP mode!\n")); + return 0; + } + + if (strlen(data) == 0) { //default value + psd_pts = 128; + psd_start = 64; + psd_stop = 128; + } else { + sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop); + } + + _rtw_memset(data, '\0', sizeof(data)); + + i = psd_start; + while (i < psd_stop) + { + if (i >= psd_pts) { + psd_data = GetPSDData(pAdapter, i-psd_pts); + } else { + psd_data = GetPSDData(pAdapter, i); + } + sprintf(data, "%s%x ", data, psd_data); + i++; + } + + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(100); + #else + rtw_mdelay_os(100); + #endif + + return strlen(data)+1; +} + +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c b/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c new file mode 100755 index 000000000000..1d59f13cba93 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_mp_ioctl.c @@ -0,0 +1,2841 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_MP_IOCTL_C_ + +#include +#include +#include +#include + +//#include +#include + + +//**************** oid_rtl_seg_81_85 section start **************** +NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == SET_OID) { + Adapter->registrypriv.wireless_mode = *(u8*)poid_par_priv->information_buf; + } else if (poid_par_priv->type_of_oid == QUERY_OID) { + *(u8*)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + RT_TRACE(_module_mp_, _drv_info_, ("-query Wireless Mode=%d\n", Adapter->registrypriv.wireless_mode)); + } else { + status = NDIS_STATUS_NOT_ACCEPTED; + } + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_87_80 section start **************** +NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct bb_reg_param *pbbreg; + u16 offset; + u32 value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_bb_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); + + offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff + if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; + + value = pbbreg->value; + + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_write_bb_reg_hdl: offset=0x%03X value=0x%08X\n", + offset, value)); + + _irqlevel_changed_(&oldirql, LOWER); + write_bbreg(Adapter, offset, 0xFFFFFFFF, value); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct bb_reg_param *pbbreg; + u16 offset; + u32 value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_bb_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); + + offset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff + if (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR; + + _irqlevel_changed_(&oldirql, LOWER); + value = read_bbreg(Adapter, offset, 0xFFFFFFFF); + _irqlevel_changed_(&oldirql, RAISE); + + pbbreg->value = value; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_read_bb_reg_hdl: offset=0x%03X value:0x%08X\n", + offset, value)); +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct rf_reg_param *pbbreg; + u8 path; + u8 offset; + u32 value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_write_rf_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); + + if (pbbreg->path >= MAX_RF_PATH_NUMS) + return NDIS_STATUS_NOT_ACCEPTED; + if (pbbreg->offset > 0xFF) + return NDIS_STATUS_NOT_ACCEPTED; + if (pbbreg->value > 0xFFFFF) + return NDIS_STATUS_NOT_ACCEPTED; + + path = (u8)pbbreg->path; + offset = (u8)pbbreg->offset; + value = pbbreg->value; + + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_write_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", + path, offset, value)); + + _irqlevel_changed_(&oldirql, LOWER); + write_rfreg(Adapter, path, offset, value); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + struct rf_reg_param *pbbreg; + u8 path; + u8 offset; + u32 value; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_rf_reg_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) + return NDIS_STATUS_INVALID_LENGTH; + + pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); + + if (pbbreg->path >= MAX_RF_PATH_NUMS) + return NDIS_STATUS_NOT_ACCEPTED; + if (pbbreg->offset > 0xFF) + return NDIS_STATUS_NOT_ACCEPTED; + + path = (u8)pbbreg->path; + offset = (u8)pbbreg->offset; + + _irqlevel_changed_(&oldirql, LOWER); + value = read_rfreg(Adapter, path, offset); + _irqlevel_changed_(&oldirql, RAISE); + + pbbreg->value = value; + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_read_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\n", + path, offset, value)); + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_87_00 section end**************** +//------------------------------------------------------------------------------ + +//**************** oid_rtl_seg_81_80_00 section start **************** +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 ratevalue;//4 + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_set_data_rate_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + ratevalue = *((u32*)poid_par_priv->information_buf);//4 + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_set_data_rate_hdl: data rate idx=%d\n", ratevalue)); + if (ratevalue >= MPT_RATE_LAST) + return NDIS_STATUS_INVALID_DATA; + + Adapter->mppriv.rateidx = ratevalue; + + _irqlevel_changed_(&oldirql, LOWER); + SetDataRate(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 mode; + u8 val8; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_start_test_hdl\n")); + + if (Adapter->registrypriv.mp_mode == 0) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + //IQCalibrateBcut(Adapter); + + mode = *((u32*)poid_par_priv->information_buf); + Adapter->mppriv.mode = mode;// 1 for loopback + + if (mp_start_test(Adapter) == _FAIL) { + status = NDIS_STATUS_NOT_ACCEPTED; + goto exit; + } + +exit: + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_pro_start_test_hdl: mp_mode=%d\n", Adapter->mppriv.mode)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_STOP_TEST\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + mp_stop_test(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_notice_, ("-Set OID_RT_PRO_STOP_TEST\n")); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 Channel; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_channel_direct_call_hdl\n")); + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == QUERY_OID) { + *((u32*)poid_par_priv->information_buf) = Adapter->mppriv.channel; + return NDIS_STATUS_SUCCESS; + } + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + Channel = *((u32*)poid_par_priv->information_buf); + RT_TRACE(_module_mp_, _drv_notice_, ("oid_rt_pro_set_channel_direct_call_hdl: Channel=%d\n", Channel)); + if (Channel > 14) + return NDIS_STATUS_NOT_ACCEPTED; + Adapter->mppriv.channel = Channel; + + _irqlevel_changed_(&oldirql, LOWER); + SetChannel(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u16 bandwidth, channel_offset; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, + ("+oid_rt_set_bandwidth_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + bandwidth = *((u32*)poid_par_priv->information_buf);//4 + if (bandwidth != HT_CHANNEL_WIDTH_40) + bandwidth = HT_CHANNEL_WIDTH_20; + Adapter->mppriv.bandwidth = (u8)bandwidth; + + _irqlevel_changed_(&oldirql, LOWER); + SetBandwidth(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_set_bandwidth_hdl: bandwidth=%d channel_offset=%d\n", + bandwidth, channel_offset)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 antenna; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_antenna_bb_hdl\n")); + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == SET_OID) + { + antenna = *(u32*)poid_par_priv->information_buf; + + Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16); + Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF); + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_set_antenna_bb_hdl: tx_ant=0x%04x rx_ant=0x%04x\n", + Adapter->mppriv.antenna_tx, Adapter->mppriv.antenna_rx)); + + _irqlevel_changed_(&oldirql, LOWER); + SetAntenna(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + } else { + antenna = (Adapter->mppriv.antenna_tx << 16)|Adapter->mppriv.antenna_rx; + *(u32*)poid_par_priv->information_buf = antenna; + } + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 tx_pwr_idx; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_set_tx_power_control_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len != sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + tx_pwr_idx = *((u32*)poid_par_priv->information_buf); + if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE) + return NDIS_STATUS_NOT_ACCEPTED; + + Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx; + + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_set_tx_power_control_hdl: idx=0x%2x\n", + Adapter->mppriv.txpoweridx)); + + _irqlevel_changed_(&oldirql, LOWER); + SetTxPower(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +//**************** oid_rtl_seg_81_80_20 section start **************** +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid !=QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_received_hdl.\n")); + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + RT_TRACE(_module_mp_, _drv_alert_, ("recv_ok:%d \n",Adapter->mppriv.rx_pktcount)); + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_query_rx_packet_crc32_error_hdl.\n")); + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + *(ULONG*)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + RT_TRACE(_module_mp_, _drv_alert_, ("recv_err:%d \n",Adapter->mppriv.rx_crcerrpktcount)); + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ + +NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + RT_TRACE(_module_mp_, _drv_alert_, ("===> oid_rt_pro_reset_tx_packet_sent_hdl.\n")); + Adapter->mppriv.tx_pktcount = 0; + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + if (poid_par_priv->information_buf_len == sizeof(ULONG)) { + Adapter->mppriv.rx_pktcount = 0; + Adapter->mppriv.rx_crcerrpktcount = 0; + } else { + status = NDIS_STATUS_INVALID_LENGTH; + } + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + _irqlevel_changed_(&oldirql, LOWER); + ResetPhyRxPktCount(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_received_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len != sizeof(ULONG)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, ("-oid_rt_get_phy_rx_packet_received_hdl: recv_ok=%d\n", *(ULONG*)poid_par_priv->information_buf)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_get_phy_rx_packet_crc32_error_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + + if (poid_par_priv->information_buf_len != sizeof(ULONG)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + *(ULONG*)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_get_phy_rx_packet_crc32_error_hdl: recv_err=%d\n", *(ULONG*)poid_par_priv->information_buf)); + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_80_20 section end **************** +NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_continuous_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetContinuousTx(Adapter,(u8)bStartTest); + if (bStartTest) { + struct mp_priv *pmp_priv = &Adapter->mppriv; + if (pmp_priv->tx.stop == 0) { + pmp_priv->tx.stop = 1; + DBG_8192C("%s: pkt tx is running...\n", __func__); + rtw_msleep_os(5); + } + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = 1; + SetPacketTx(Adapter); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_carrier_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetSingleCarrierTx(Adapter, (u8)bStartTest); + if (bStartTest) { + struct mp_priv *pmp_priv = &Adapter->mppriv; + if (pmp_priv->tx.stop == 0) { + pmp_priv->tx.stop = 1; + DBG_8192C("%s: pkt tx is running...\n", __func__); + rtw_msleep_os(5); + } + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = 1; + SetPacketTx(Adapter); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_set_carrier_suppression_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetCarrierSuppressionTx(Adapter, (u8)bStartTest); + if (bStartTest) { + struct mp_priv *pmp_priv = &Adapter->mppriv; + if (pmp_priv->tx.stop == 0) { + pmp_priv->tx.stop = 1; + DBG_8192C("%s: pkt tx is running...\n", __func__); + rtw_msleep_os(5); + } + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = 1; + SetPacketTx(Adapter); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u32 bStartTest; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_alert_, ("+oid_rt_pro_set_single_tone_tx_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + bStartTest = *((u32*)poid_par_priv->information_buf); + + _irqlevel_changed_(&oldirql, LOWER); + SetSingleToneTx(Adapter,(u8)bStartTest); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv) +{ + return 0; +} + +NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_TRIGGER_GPIO_0, 0); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//**************** oid_rtl_seg_81_80_00 section end **************** +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + PNDIS_802_11_SSID pssid; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = (u32)sizeof(NDIS_802_11_SSID); + *poid_par_priv->bytes_rw = 0; + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + pssid = (PNDIS_802_11_SSID)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + + if (mp_start_joinbss(Adapter, pssid) == _FAIL) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + pRW_Reg RegRWStruct; + u32 offset, width; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, + ("+oid_rt_pro_read_register_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; + offset = RegRWStruct->offset; + width = RegRWStruct->width; + + if (offset > 0xFFF) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + switch (width) { + case 1: + RegRWStruct->value = rtw_read8(Adapter, offset); + break; + case 2: + RegRWStruct->value = rtw_read16(Adapter, offset); + break; + default: + width = 4; + RegRWStruct->value = rtw_read32(Adapter, offset); + break; + } + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_read_register_hdl: offset:0x%04X value:0x%X\n", + offset, RegRWStruct->value)); + + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = width; + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + pRW_Reg RegRWStruct; + u32 offset, width, value; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, + ("+oid_rt_pro_write_register_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; + offset = RegRWStruct->offset; + width = RegRWStruct->width; + value = RegRWStruct->value; + + if (offset > 0xFFF) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + switch (RegRWStruct->width) + { + case 1: + if (value > 0xFF) { + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + rtw_write8(padapter, offset, (u8)value); + break; + case 2: + if (value > 0xFFFF) { + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + rtw_write16(padapter, offset, (u16)value); + break; + case 4: + rtw_write32(padapter, offset, value); + break; + default: + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_pro_write_register_hdl: offset=0x%08X width=%d value=0x%X\n", + offset, width, value)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pBurst_RW_Reg pBstRwReg; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_read_register_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + rtw_read_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); + _irqlevel_changed_(&oldirql,RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +#endif + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_read_register_hdl\n")); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pBurst_RW_Reg pBstRwReg; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_burst_write_register_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + rtw_write_mem(Adapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); + _irqlevel_changed_(&oldirql, RAISE); +#endif + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_burst_write_register_hdl\n")); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +/* + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + _irqL oldirql; + + TX_CMD_Desc *TxCmd_Info; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + RT_TRACE(_module_mp_, _drv_info_, ("+Set OID_RT_PRO_WRITE_TXCMD\n")); + + TxCmd_Info=(TX_CMD_Desc*)poid_par_priv->information_buf; + + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:Addr=%.8X\n", TxCmd_Info->offset)); + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:1.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[0])); + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:2.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[1])); + RT_TRACE(_module_mp_, _drv_info_, (("WRITE_TXCMD:3.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[2])); + RT_TRACE(_module_mp_, _drv_info_, ("WRITE_TXCMD:4.)%.8X\n", (ULONG)TxCmd_Info->TxCMD.value[3])); + + _irqlevel_changed_(&oldirql, LOWER); + + rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]); + rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]); + + _irqlevel_changed_(&oldirql, RAISE); +*/ + + RT_TRACE(_module_mp_, _drv_notice_, + ("-Set OID_RT_PRO_WRITE_TXCMD: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pEEPROM_RWParam pEEPROM; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+Query OID_RT_PRO_READ16_EEPROM\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + pEEPROM->value = eeprom_read16(Adapter, (u16)(pEEPROM->offset >> 1)); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-Query OID_RT_PRO_READ16_EEPROM: offset=0x%x value=0x%x\n", + pEEPROM->offset, pEEPROM->value)); +#endif +_func_exit_; + + return status; +} + +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + pEEPROM_RWParam pEEPROM; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_WRITE16_EEPROM\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + eeprom_write16(Adapter, (u16)(pEEPROM->offset >> 1), pEEPROM->value); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +#endif +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct mp_wiparam *pwi_param; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam)) + return NDIS_STATUS_INVALID_LENGTH; + + if (Adapter->mppriv.workparam.bcompleted == _FALSE) + return NDIS_STATUS_NOT_ACCEPTED; + + pwi_param = (struct mp_wiparam *)poid_par_priv->information_buf; + + _rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam)); + Adapter->mppriv.act_in_progress = _FALSE; +// RT_TRACE(_module_mp_, _drv_info_, ("rf:%x\n", pwiparam->IoValue)); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro8711_pkt_loss_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(uint)*2) { + RT_TRACE(_module_mp_, _drv_err_, ("-oid_rt_pro8711_pkt_loss_hdl: buf_len=%d\n", (int)poid_par_priv->information_buf_len)); + return NDIS_STATUS_INVALID_LENGTH; + } + + if (*(uint*)poid_par_priv->information_buf == 1)//init==1 + Adapter->mppriv.rx_pktloss = 0; + + *((uint*)poid_par_priv->information_buf+1) = Adapter->mppriv.rx_pktloss; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)( poid_par_priv->adapter_context); + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; + struct intf_hdl *pintfhdl = &pio_queue->intf; + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +#ifdef CONFIG_SDIO_HCI + void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); +#endif + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Query OID_RT_RD_ATTRIB_MEM\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + +#ifdef CONFIG_SDIO_HCI + _irqlevel_changed_(&oldirql, LOWER); +{ + u32 *plmem = (u32*)poid_par_priv->information_buf+2; + _attrib_read = pintfhdl->io_ops._attrib_read; + _attrib_read(pintfhdl, *((u32*)poid_par_priv->information_buf), + *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +} + _irqlevel_changed_(&oldirql, RAISE); +#endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; + struct intf_hdl *pintfhdl = &pio_queue->intf; + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +#ifdef CONFIG_SDIO_HCI + void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); +#endif + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + +#ifdef CONFIG_SDIO_HCI + _irqlevel_changed_(&oldirql, LOWER); +{ + u32 *plmem = (u32*)poid_par_priv->information_buf + 2; + _attrib_write = pintfhdl->io_ops._attrib_write; + _attrib_write(pintfhdl, *(u32*)poid_par_priv->information_buf, + *((u32*)poid_par_priv->information_buf+1), (u8*)plmem); +} + _irqlevel_changed_(&oldirql, RAISE); +#endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_RF_INTFS\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + if (rtw_setrfintfs_cmd(Adapter, *(unsigned char*)poid_par_priv->information_buf) == _FAIL) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _rtw_memcpy(poid_par_priv->information_buf, (unsigned char*)&Adapter->mppriv.rxstat, sizeof(struct recv_stat)); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + PCFG_DBG_MSG_STRUCT pdbg_msg; + +_func_enter_; + +// RT_TRACE(0xffffffffff,_drv_alert_,("===> oid_rt_pro_cfg_debug_message_hdl.\n")); + +#if 0//#ifdef CONFIG_DEBUG_RTL871X + + pdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf); + + if (poid_par_priv->type_of_oid == SET_OID) { + RT_TRACE(0xffffffffff, _drv_alert_, + ("===>Set level :0x%08x, H32:0x%08x L32:0x%08x\n", + pdbg_msg->DebugLevel, pdbg_msg->DebugComponent_H32, pdbg_msg->DebugComponent_L32)); + + GlobalDebugLevel = pdbg_msg->DebugLevel; + GlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32; + RT_TRACE(0xffffffffff, _drv_alert_, + ("===> Set level :0x%08x, component:0x%016x\n", + GlobalDebugLevel, (u32)GlobalDebugComponents)); + } else { + pdbg_msg->DebugLevel = GlobalDebugLevel; + pdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32); + pdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(0xffffffffff, _drv_alert_, + ("===>Query level:0x%08x H32:0x%08x L32:0x%08x\n", + (u32)pdbg_msg->DebugLevel, (u32)pdbg_msg->DebugComponent_H32, (u32)pdbg_msg->DebugComponent_L32)); + } + +#endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+OID_RT_PRO_SET_DATA_RATE_EX\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, LOWER); + + if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) !=_SUCCESS) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + u8 thermal = 0; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_get_thermal_meter_hdl\n")); + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + GetThermalMeter(Adapter, &thermal); + _irqlevel_changed_(&oldirql, RAISE); + + *(u32*)poid_par_priv->information_buf = (u32)thermal; + *poid_par_priv->bytes_rw = sizeof(u32); + +_func_exit_; + + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_read_tssi_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (Adapter->mppriv.act_in_progress == _TRUE) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + //init workparam + Adapter->mppriv.act_in_progress = _TRUE; + Adapter->mppriv.workparam.bcompleted = _FALSE; + Adapter->mppriv.workparam.act_type = MPT_READ_TSSI; + Adapter->mppriv.workparam.io_offset = 0; + Adapter->mppriv.workparam.io_value = 0xFFFFFFFF; + + _irqlevel_changed_(&oldirql, LOWER); + + if (!rtw_gettssi_cmd(Adapter,0, (u8*)&Adapter->mppriv.workparam.io_value)) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + +_func_enter_; + +// if (poid_par_priv->type_of_oid != SET_OID) +// return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + _irqlevel_changed_(&oldirql, LOWER); + if (poid_par_priv->type_of_oid == SET_OID) { + u8 enable; + + enable = *(u8*)poid_par_priv->information_buf; + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_set_power_tracking_hdl: enable=%d\n", enable)); + + SetPowerTracking(Adapter, enable); + } else { + GetPowerTracking(Adapter, (u8*)poid_par_priv->information_buf); + } + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//----------------------------------------------------------------------------- +NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + u32 ratevalue; + u8 datarates[NumRates]; + int i; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+OID_RT_PRO_SET_BASIC_RATE\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; +#if 0 + ratevalue = *((u32*)poid_par_priv->information_buf); + + for (i = 0; i < NumRates; i++) { + if (ratevalue == mpdatarate[i]) + datarates[i] = mpdatarate[i]; + else + datarates[i] = 0xff; + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_info_, ("basicrate_inx=%d\n", datarates[i])); + } + + _irqlevel_changed_(&oldirql, LOWER); + + if (rtw_setbasicrate_cmd(Adapter, datarates) != _SUCCESS) + status = NDIS_STATUS_NOT_ACCEPTED; + + _irqlevel_changed_(&oldirql, RAISE); +#endif + RT_TRACE(_module_mp_, _drv_notice_, + ("-OID_RT_PRO_SET_BASIC_RATE: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < 8) + return NDIS_STATUS_INVALID_LENGTH; + + *poid_par_priv->bytes_rw = 8; + _rtw_memcpy(poid_par_priv->information_buf, &(Adapter->pwrctrlpriv.pwr_mode), 8); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_qry_pwrstate_hdl: pwr_mode=%d smart_ps=%d\n", + Adapter->pwrctrlpriv.pwr_mode, Adapter->pwrctrlpriv.smart_ps)); + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + uint pwr_mode, smart_ps; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Set OID_RT_PRO_SET_PWRSTATE\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_rw = 0; + *poid_par_priv->bytes_needed = 8; + + if (poid_par_priv->information_buf_len < 8) + return NDIS_STATUS_INVALID_LENGTH; + + pwr_mode = *(uint *)(poid_par_priv->information_buf); + smart_ps = *(uint *)((int)poid_par_priv->information_buf + 4); + + *poid_par_priv->bytes_rw = 8; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct setratable_parm *prate_table; + u8 res; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = sizeof(struct setratable_parm); + if (poid_par_priv->information_buf_len < sizeof(struct setratable_parm)) + return NDIS_STATUS_INVALID_LENGTH; + + prate_table = (struct setratable_parm*)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + res = rtw_setrttbl_cmd(Adapter, prate_table); + _irqlevel_changed_(&oldirql, RAISE); + + if (res == _FAIL) + status = NDIS_STATUS_FAILURE; + +_func_exit_; + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + #if 0 + struct mp_wi_cntx *pmp_wi_cntx=&(Adapter->mppriv.wi_cntx); + u8 res=_SUCCESS; + DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); + + if(pmp_wi_cntx->bmp_wi_progress ==_TRUE){ + DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n")); + Status = NDIS_STATUS_NOT_ACCEPTED; + break; + } + else{ + pmp_wi_cntx->bmp_wi_progress=_TRUE; + pmp_wi_cntx->param.bcompleted=_FALSE; + pmp_wi_cntx->param.act_type=MPT_GET_RATE_TABLE; + pmp_wi_cntx->param.io_offset=0x0; + pmp_wi_cntx->param.bytes_cnt=sizeof(struct getratable_rsp); + pmp_wi_cntx->param.io_value=0xffffffff; + + res=rtw_getrttbl_cmd(Adapter,(struct getratable_rsp *)pmp_wi_cntx->param.data); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + if(res != _SUCCESS) + { + Status = NDIS_STATUS_NOT_ACCEPTED; + } + } + DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); + #endif + +_func_exit_; + + return status; +#else + return 0; +#endif +} + +//**************** oid_rtl_seg_87_12_00 section start **************** +NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + struct security_priv *psecuritypriv = &Adapter->securitypriv; + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + ENCRY_CTRL_STATE encry_mode; + + + *poid_par_priv->bytes_needed = sizeof(u8); + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + if (poid_par_priv->type_of_oid == SET_OID) + { + encry_mode = *((u8*)poid_par_priv->information_buf); + switch (encry_mode) + { + case HW_CONTROL: + #if 0 + Adapter->registrypriv.software_decrypt=_FALSE; + Adapter->registrypriv.software_encrypt=_FALSE; + #else + psecuritypriv->sw_decrypt = _FALSE; + psecuritypriv->sw_encrypt = _FALSE; + #endif + break; + case SW_CONTROL: + #if 0 + Adapter->registrypriv.software_decrypt=_TRUE; + Adapter->registrypriv.software_encrypt=_TRUE; + #else + psecuritypriv->sw_decrypt = _TRUE; + psecuritypriv->sw_encrypt = _TRUE; + #endif + break; + case HW_ENCRY_SW_DECRY: + #if 0 + Adapter->registrypriv.software_decrypt=_TRUE; + Adapter->registrypriv.software_encrypt=_FALSE; + #else + psecuritypriv->sw_decrypt = _TRUE; + psecuritypriv->sw_encrypt = _FALSE; + #endif + break; + case SW_ENCRY_HW_DECRY: + #if 0 + Adapter->registrypriv.software_decrypt=_FALSE; + Adapter->registrypriv.software_encrypt=_TRUE; + #else + psecuritypriv->sw_decrypt = _FALSE; + psecuritypriv->sw_encrypt = _TRUE; + #endif + break; + } + + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_notice_, + ("-oid_rt_pro_encryption_ctrl_hdl: SET encry_mode=0x%x sw_encrypt=0x%x sw_decrypt=0x%x\n", + encry_mode, psecuritypriv->sw_encrypt, psecuritypriv->sw_decrypt)); + } + else { + #if 0 + if (Adapter->registrypriv.software_encrypt == _FALSE) { + if (Adapter->registrypriv.software_decrypt == _FALSE) + encry_mode = HW_CONTROL; + else + encry_mode = HW_ENCRY_SW_DECRY; + } + else { + if (Adapter->registrypriv.software_decrypt == _FALSE) + encry_mode = SW_ENCRY_HW_DECRY; + else + encry_mode = SW_CONTROL; + } + #else + + if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE)) + encry_mode = HW_CONTROL; + else if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _TRUE)) + encry_mode = HW_ENCRY_SW_DECRY; + else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _FALSE)) + encry_mode = SW_ENCRY_HW_DECRY; + else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE)) + encry_mode = SW_CONTROL; + + #endif + + *(u8*)poid_par_priv->information_buf = encry_mode; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_encryption_ctrl_hdl: QUERY encry_mode=0x%x\n", + encry_mode)); + } + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct sta_info *psta = NULL; + UCHAR *macaddr; + + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = ETH_ALEN; + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + macaddr = (UCHAR *) poid_par_priv->information_buf ; + + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, + ("OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); + + _irqlevel_changed_(&oldirql, LOWER); + + psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); + + if (psta == NULL) { // the sta have been in sta_info_queue => do nothing + psta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr); + + if (psta == NULL) { + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("Can't alloc sta_info when OID_RT_PRO_ADD_STA_INFO\n")); + status = NDIS_STATUS_FAILURE; + } + } else { //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_err_, + ("Error: OID_RT_PRO_ADD_STA_INFO: sta has been in sta_hash_queue \n")); + } + + _irqlevel_changed_(&oldirql, RAISE); + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL irqL; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct sta_info *psta = NULL; + UCHAR *macaddr; + + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = ETH_ALEN; + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + macaddr = (UCHAR *) poid_par_priv->information_buf ; + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_, + ("+OID_RT_PRO_ADD_STA_INFO: addr="MAC_FMT"\n", MAC_ARG(macaddr) )); + + psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); + if (psta != NULL) { + _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); + rtw_free_stainfo(Adapter, psta); + _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); + } + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +#include +u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var) +{ +#if 0 +#ifdef CONFIG_SDIO_HCI + + if (offset == 1) { + u16 tmp_blk_num; + tmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM); + RT_TRACE(_module_mp_, _drv_err_, ("Query Information, mp_query_drv_var SDIO_RX0_RDYBLK_NUM=0x%x padapter->dvobjpriv.rxblknum=0x%x\n", tmp_blk_num, padapter->dvobjpriv.rxblknum)); + if (padapter->dvobjpriv.rxblknum != tmp_blk_num) { + RT_TRACE(_module_mp_,_drv_err_, ("Query Information, mp_query_drv_var call recv rx\n")); + // sd_recv_rxfifo(padapter); + } + } + +#if 0 + if(offset <=100){ //For setting data rate and query data rate + if(offset==100){ //For query data rate + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): query rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); + var=padapter->registrypriv.tx_rate; + + } + else if(offset<0x1d){ //For setting data rate + padapter->registrypriv.tx_rate=offset; + var=padapter->registrypriv.tx_rate; + padapter->registrypriv.use_rate=_TRUE; + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d): set rate=0x%.2x \n",offset,padapter->registrypriv.tx_rate)); + } + else{ //not use the data rate + padapter->registrypriv.use_rate=_FALSE; + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) out of rate range\n",offset)); + } + } + else if (offset<=110){ //for setting debug level + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d) for set debug level\n",offset)); + if(offset==110){ //For query data rate + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): query dbg level=0x%.2x \n",offset,padapter->registrypriv.dbg_level)); + padapter->registrypriv.dbg_level=GlobalDebugLevel; + var=padapter->registrypriv.dbg_level; + } + else if(offset<110 && offset>100){ + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var: offset(%d): set dbg level=0x%.2x \n",offset,offset-100)); + padapter->registrypriv.dbg_level=GlobalDebugLevel=offset-100; + var=padapter->registrypriv.dbg_level; + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_alert_, (" mp_query_drv_var(_drv_alert_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_crit_, (" mp_query_drv_var(_drv_crit_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_err_, (" mp_query_drv_var(_drv_err_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_warning_, (" mp_query_drv_var(_drv_warning_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_notice_, (" mp_query_drv_var(_drv_notice_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_info_, (" mp_query_drv_var(_drv_info_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + RT_TRACE(_module_mp_, _drv_debug_, (" mp_query_drv_var(_drv_debug_): offset(%d): set dbg level=0x%.2x \n",offset,GlobalDebugLevel)); + + } + } + else if(offset >110 &&offset <116){ + if(115==offset){ + RT_TRACE(_module_mp_, _drv_emerg_, (" mp_query_drv_var(_drv_emerg_): offset(%d): query TRX access type: [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + } + else { + switch(offset){ + case 111: + padapter->dvobjpriv.tx_block_mode=1; + padapter->dvobjpriv.rx_block_mode=1; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + case 112: + padapter->dvobjpriv.tx_block_mode=1; + padapter->dvobjpriv.rx_block_mode=0; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + case 113: + padapter->dvobjpriv.tx_block_mode=0; + padapter->dvobjpriv.rx_block_mode=1; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX block) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + case 114: + padapter->dvobjpriv.tx_block_mode=0; + padapter->dvobjpriv.rx_block_mode=0; + RT_TRACE(_module_mp_, _drv_emerg_, \ + (" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\n",\ + offset,padapter->dvobjpriv.tx_block_mode,padapter->dvobjpriv.rx_block_mode)); + break; + default : + break; + + } + + } + + } + else if(offset>=127){ + u64 prnt_dbg_comp; + u8 chg_idx; + u64 tmp_dbg_comp; + chg_idx=offset-0x80; + tmp_dbg_comp=BIT(chg_idx); + prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; + RT_TRACE(_module_mp_, _drv_emerg_, (" 1: mp_query_drv_var: offset(%d;0x%x):for dbg conpoment prnt_dbg_comp=0x%.16x GlobalDebugComponents=0x%.16x padapter->registrypriv.dbg_component=0x%.16x\n",offset,offset,prnt_dbg_comp,GlobalDebugComponents,padapter->registrypriv.dbg_component)); + if(offset==127){ + // prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; + var=(u32)(padapter->registrypriv.dbg_component); + RT_TRACE(0xffffffff, _drv_emerg_, ("2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) \n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + prnt_dbg_comp=GlobalDebugComponents; + RT_TRACE(0xffffffff, _drv_emerg_, ("2-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; + RT_TRACE(0xffffffff, _drv_emerg_, ("2-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + + } + else{ + RT_TRACE(0xffffffff, _drv_emerg_, ("3: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx)); + prnt_dbg_comp=GlobalDebugComponents; + RT_TRACE(0xffffffff, _drv_emerg_,("3-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));// ("3-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment=0x%x chg_idx=%d or0x%x BIT(chg_idx[%d]=0x%x)\n",offset,offset,prnt_dbg_comp,chg_idx,chg_idx,(chg_idx),tmp_dbg_comp) + prnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component; + RT_TRACE(0xffffffff, _drv_emerg_, ("3-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h)\n",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp)); + + if(GlobalDebugComponents&tmp_dbg_comp){ + //this bit is already set, now clear it + GlobalDebugComponents=GlobalDebugComponents&(~tmp_dbg_comp); + } + else{ + //this bit is not set, now set it. + GlobalDebugComponents =GlobalDebugComponents|tmp_dbg_comp; + } + RT_TRACE(0xffffffff, _drv_emerg_, ("4: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); + prnt_dbg_comp=GlobalDebugComponents; + RT_TRACE(0xffffffff, _drv_emerg_, ("4-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)",offset,offset,tmp_dbg_comp,prnt_dbg_comp)); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_emerg_, ("0: mp_query_drv_var(_module_rtl871x_xmit_c_:0): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,prnt_dbg_comp)); + RT_TRACE(_module_xmit_osdep_c_, _drv_emerg_, ("1: mp_query_drv_var(_module_xmit_osdep_c_:1): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_recv_c_, _drv_emerg_, ("2: mp_query_drv_var(_module_rtl871x_recv_c_:2): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_recv_osdep_c_, _drv_emerg_, ("3: mp_query_drv_var(_module_recv_osdep_c_:3): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_mlme_c_, _drv_emerg_, ("4: mp_query_drv_var(_module_rtl871x_mlme_c_:4): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_mlme_osdep_c_, _drv_emerg_, (" 5:mp_query_drv_var(_module_mlme_osdep_c_:5): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_emerg_, ("6: mp_query_drv_var(_module_rtl871x_sta_mgt_c_:6): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_cmd_c_, _drv_emerg_, ("7: mp_query_drv_var(_module_rtl871x_cmd_c_:7): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_cmd_osdep_c_, _drv_emerg_, ("8: mp_query_drv_var(_module_cmd_osdep_c_:8): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_io_c_, _drv_emerg_, ("9: mp_query_drv_var(_module_rtl871x_io_c_:9): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_io_osdep_c_, _drv_emerg_, ("10: mp_query_drv_var(_module_io_osdep_c_:10): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_os_intfs_c_, _drv_emerg_, ("11: mp_query_drv_var(_module_os_intfs_c_:11): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_security_c_, _drv_emerg_, ("12: mp_query_drv_var(_module_rtl871x_security_c_:12): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_eeprom_c_, _drv_emerg_, ("13: mp_query_drv_var(_module_rtl871x_eeprom_c_:13): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hal_init_c_, _drv_emerg_, ("14: mp_query_drv_var(_module_hal_init_c_:14): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_hal_init_c_, _drv_emerg_, ("15: mp_query_drv_var(_module_hci_hal_init_c_:15): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_ioctl_c_, _drv_emerg_, ("16: mp_query_drv_var(_module_rtl871x_ioctl_c_:16): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_emerg_, ("17: mp_query_drv_var(_module_rtl871x_ioctl_set_c_:17): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_ioctl_query_c_, _drv_emerg_, ("18: mp_query_drv_var(_module_rtl871x_ioctl_query_c_:18): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_emerg_, ("19: mp_query_drv_var(_module_rtl871x_pwrctrl_c_:19): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_intfs_c_, _drv_emerg_, ("20: mp_query_drv_var(_module_hci_intfs_c_:20): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_ops_c_, _drv_emerg_, ("21: mp_query_drv_var(_module_hci_ops_c_:21): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_osdep_service_c_, _drv_emerg_, ("22: mp_query_drv_var(_module_osdep_service_c_:22): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_mp_, _drv_emerg_, ("23: mp_query_drv_var(_module_mp_:23): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + RT_TRACE(_module_hci_ops_os_c_, _drv_emerg_, ("24: mp_query_drv_var(_module_hci_ops_os_c_:24): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + var=(u32)(GlobalDebugComponents); + //GlobalDebugComponents=padapter->registrypriv.dbg_component; + RT_TRACE(0xffffffff, _drv_emerg_, (" ==mp_query_drv_var(_module_mp_): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\n",offset,offset,GlobalDebugComponents)); + + } + } + else{ + RT_TRACE(_module_mp_, _drv_emerg_, ("\n mp_query_drv_var: offset(%d) >110\n",offset)); + } +#endif +#endif + + return var; +#else + return 0; +#endif +} + +NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + DR_VARIABLE_STRUCT *pdrv_var; + + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + *poid_par_priv->bytes_needed = sizeof(DR_VARIABLE_STRUCT); + if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) + return NDIS_STATUS_INVALID_LENGTH; + + RT_TRACE(_module_mp_, _drv_notice_, ("+Query Information, OID_RT_PRO_QUERY_DR_VARIABLE\n")); + + pdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + pdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset, pdrv_var->variable); + _irqlevel_changed_(&oldirql, RAISE); + + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_notice_, + ("-oid_rt_pro_query_dr_variable_hdl: offset=0x%x valule=0x%x\n", + pdrv_var->offset, pdrv_var->variable)); + + return status; +#else + return 0; +#endif +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + RT_TRACE(_module_mp_, _drv_err_, ("oid_rt_pro_rx_packet_type_hdl...................\n")); +#if 0 + + if (poid_par_priv->information_buf_len < sizeof (UCHAR)) { + status = NDIS_STATUS_INVALID_LENGTH; + *poid_par_priv->bytes_needed = sizeof(UCHAR); + return status; + } + + if (poid_par_priv->type_of_oid == SET_OID) { + Adapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf; + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n",\ + Adapter->mppriv.rx_with_status)); + + //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); + //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n", + Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\ + Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5])); + + } + else { + *(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, ("Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \n", \ + Adapter->mppriv.rx_with_status)); + + //*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); + //*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,("MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x \n", + Adapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\ + Adapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5])); + } +#endif + + return NDIS_STATUS_SUCCESS; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + PEFUSE_ACCESS_STRUCT pefuse; + u8 *data; + u16 addr = 0, cnts = 0, max_available_size = 0; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(EFUSE_ACCESS_STRUCT)) + return NDIS_STATUS_INVALID_LENGTH; + + pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; + addr = pefuse->start_addr; + cnts = pefuse->cnts; + data = pefuse->data; + + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_read_efuse_hd: buf_len=%ld addr=%d cnts=%d\n", + poid_par_priv->information_buf_len, addr, cnts)); + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); + + if ((addr + cnts) > max_available_size) { + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: parameter error!\n")); + return NDIS_STATUS_NOT_ACCEPTED; + } + + _irqlevel_changed_(&oldirql, LOWER); + if (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) { + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_read_efuse_hdl: rtw_efuse_access FAIL!\n")); + status = NDIS_STATUS_FAILURE; + } else + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ + + _irqL oldirql; + PEFUSE_ACCESS_STRUCT pefuse; + u8 *data; + u16 addr = 0, cnts = 0, max_available_size = 0; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; + addr = pefuse->start_addr; + cnts = pefuse->cnts; + data = pefuse->data; + + RT_TRACE(_module_mp_, _drv_notice_, + ("+oid_rt_pro_write_efuse_hdl: buf_len=%ld addr=0x%04x cnts=%d\n", + poid_par_priv->information_buf_len, addr, cnts)); + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); + + if ((addr + cnts) > max_available_size) { + RT_TRACE(_module_mp_, _drv_err_, ("!oid_rt_pro_write_efuse_hdl: parameter error")); + return NDIS_STATUS_NOT_ACCEPTED; + } + + _irqlevel_changed_(&oldirql, LOWER); + if (rtw_efuse_access(Adapter, _TRUE, addr, cnts, data) == _FAIL) + status = NDIS_STATUS_FAILURE; + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + PPGPKT_STRUCT ppgpkt; + u8 tmpidx; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + +// RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_rw_efuse_pgpkt_hdl\n")); + + *poid_par_priv->bytes_rw = 0; + + if (poid_par_priv->information_buf_len < sizeof(PGPKT_STRUCT)) + return NDIS_STATUS_INVALID_LENGTH; + + ppgpkt = (PPGPKT_STRUCT)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + + if (poid_par_priv->type_of_oid == QUERY_OID) + { + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_rw_efuse_pgpkt_hdl: Read offset=0x%x\n",\ + ppgpkt->offset)); + + Efuse_PowerSwitch(Adapter, _FALSE, _TRUE); + if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE) + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + else + status = NDIS_STATUS_FAILURE; + Efuse_PowerSwitch(Adapter, _FALSE, _FALSE); + } else { + RT_TRACE(_module_mp_, _drv_notice_, + ("oid_rt_pro_rw_efuse_pgpkt_hdl: Write offset=0x%x word_en=0x%x\n",\ + ppgpkt->offset, ppgpkt->word_en)); + + Efuse_PowerSwitch(Adapter, _TRUE, _TRUE); + if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE) + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + else + status = NDIS_STATUS_FAILURE; + Efuse_PowerSwitch(Adapter, _TRUE, _FALSE); + } + + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_pro_rw_efuse_pgpkt_hdl: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u16 size; + u8 ret; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len information_buf = size; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + } else + status = NDIS_STATUS_FAILURE; + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + u16 max_size; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + *(u32*)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter); + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_get_efuse_max_size_hdl: size=%d status=0x%08X\n", + *(int*)poid_par_priv->information_buf, status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_info_, ("+oid_rt_pro_efuse_hdl\n")); + + if (poid_par_priv->type_of_oid == QUERY_OID) + status = oid_rt_pro_read_efuse_hdl(poid_par_priv); + else + status = oid_rt_pro_write_efuse_hdl(poid_par_priv); + + RT_TRACE(_module_mp_, _drv_info_, ("-oid_rt_pro_efuse_hdl: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) +{ + _irqL oldirql; + u8 *data; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + u16 mapLen=0; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_pro_efuse_map_hdl\n")); + + EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); + + *poid_par_priv->bytes_rw = 0; + + if (poid_par_priv->information_buf_len < mapLen) + return NDIS_STATUS_INVALID_LENGTH; + + data = (u8*)poid_par_priv->information_buf; + + _irqlevel_changed_(&oldirql, LOWER); + + if (poid_par_priv->type_of_oid == QUERY_OID) + { + RT_TRACE(_module_mp_, _drv_info_, + ("oid_rt_pro_efuse_map_hdl: READ\n")); + + if (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS) + *poid_par_priv->bytes_rw = mapLen; + else { + RT_TRACE(_module_mp_, _drv_err_, + ("oid_rt_pro_efuse_map_hdl: READ fail\n")); + status = NDIS_STATUS_FAILURE; + } + } else { + // SET_OID + RT_TRACE(_module_mp_, _drv_info_, + ("oid_rt_pro_efuse_map_hdl: WRITE\n")); + + if (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS) + *poid_par_priv->bytes_rw = mapLen; + else { + RT_TRACE(_module_mp_, _drv_err_, + ("oid_rt_pro_efuse_map_hdl: WRITE fail\n")); + status = NDIS_STATUS_FAILURE; + } + } + + _irqlevel_changed_(&oldirql, RAISE); + + RT_TRACE(_module_mp_, _drv_info_, + ("-oid_rt_pro_efuse_map_hdl: status=0x%08X\n", status)); + +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + + u32 crystal_cap = 0; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len information_buf);//4 + if (crystal_cap > 0xf) + return NDIS_STATUS_NOT_ACCEPTED; + + Adapter->mppriv.curr_crystalcap = crystal_cap; + + _irqlevel_changed_(&oldirql,LOWER); + SetCrystalCap(Adapter); + _irqlevel_changed_(&oldirql,RAISE); + +_func_exit_; + +#endif + return status; +} + +NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + _irqL oldirql; + u8 rx_pkt_type; + u32 rcr_val32; + +_func_enter_; + + RT_TRACE(_module_mp_, _drv_notice_, ("+oid_rt_set_rx_packet_type_hdl\n")); + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u8)) + return NDIS_STATUS_INVALID_LENGTH; + + rx_pkt_type = *((u8*)poid_par_priv->information_buf);//4 + + RT_TRACE(_module_mp_, _drv_info_, ("rx_pkt_type: %x\n",rx_pkt_type )); +#if 0 + _irqlevel_changed_(&oldirql, LOWER); +#if 0 + rcr_val8 = rtw_read8(Adapter, 0x10250048);//RCR + rcr_val8 &= ~(RCR_AB|RCR_AM|RCR_APM|RCR_AAP); + + if(rx_pkt_type == RX_PKT_BROADCAST){ + rcr_val8 |= (RCR_AB | RCR_ACRC32 ); + } + else if(rx_pkt_type == RX_PKT_DEST_ADDR){ + rcr_val8 |= (RCR_AAP| RCR_AM |RCR_ACRC32); + } + else if(rx_pkt_type == RX_PKT_PHY_MATCH){ + rcr_val8 |= (RCR_APM|RCR_ACRC32); + } + else{ + rcr_val8 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); + } + rtw_write8(Adapter, 0x10250048,rcr_val8); +#else + rcr_val32 = rtw_read32(Adapter, RCR);//RCR = 0x10250048 + rcr_val32 &= ~(RCR_CBSSID|RCR_AB|RCR_AM|RCR_APM|RCR_AAP); +#if 0 + if(rx_pkt_type == RX_PKT_BROADCAST){ + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); + } + else if(rx_pkt_type == RX_PKT_DEST_ADDR){ + //rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32); + rcr_val32 |= (RCR_CBSSID|RCR_APM|RCR_ACRC32); + } + else if(rx_pkt_type == RX_PKT_PHY_MATCH){ + rcr_val32 |= (RCR_APM|RCR_ACRC32); + //rcr_val32 |= (RCR_AAP|RCR_ACRC32); + } + else{ + rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); + } +#else + switch (rx_pkt_type) + { + case RX_PKT_BROADCAST : + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); + break; + case RX_PKT_DEST_ADDR : + rcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32); + break; + case RX_PKT_PHY_MATCH: + rcr_val32 |= (RCR_APM|RCR_ACRC32); + break; + default: + rcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32); + break; + } + + if (rx_pkt_type == RX_PKT_DEST_ADDR) { + Adapter->mppriv.check_mp_pkt = 1; + } else { + Adapter->mppriv.check_mp_pkt = 0; + } +#endif + rtw_write32(Adapter, RCR, rcr_val32); + +#endif + _irqlevel_changed_(&oldirql, RAISE); +#endif +_func_exit_; + + return status; +} + +NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + _irqL oldirql; + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + u32 txagc; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len < sizeof(u32)) + return NDIS_STATUS_INVALID_LENGTH; + + txagc = *(u32*)poid_par_priv->information_buf; + RT_TRACE(_module_mp_, _drv_info_, + ("oid_rt_pro_set_tx_agc_offset_hdl: 0x%08x\n", txagc)); + + _irqlevel_changed_(&oldirql, LOWER); + SetTxAGCOffset(Adapter, txagc); + _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} + +NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + struct mp_priv *pmppriv = &Adapter->mppriv; + u32 type; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) + return NDIS_STATUS_NOT_ACCEPTED; + + if (poid_par_priv->information_buf_len information_buf; + + if (_LOOPBOOK_MODE_ == type) { + pmppriv->mode = type; + set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc + RT_TRACE(_module_mp_, _drv_info_, ("test mode change to loopback mode:0x%08x.\n", get_fwstate(pmlmepriv))); + } else if (_2MAC_MODE_ == type){ + pmppriv->mode = type; + _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE); + RT_TRACE(_module_mp_, _drv_info_, ("test mode change to 2mac mode:0x%08x.\n", get_fwstate(pmlmepriv))); + } else + status = NDIS_STATUS_NOT_ACCEPTED; + +_func_exit_; + + return status; +#else + return 0; +#endif +} + +unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) +{ + PMP_XMIT_PARM pparm; + PADAPTER padapter; + struct mp_priv *pmp_priv; + struct pkt_attrib *pattrib; + + RT_TRACE(_module_mp_, _drv_notice_, ("+%s\n", __func__)); + + pparm = (PMP_XMIT_PARM)poid_par_priv->information_buf; + padapter = (PADAPTER)poid_par_priv->adapter_context; + pmp_priv = &padapter->mppriv; + + if (poid_par_priv->type_of_oid == QUERY_OID) { + pparm->enable = !pmp_priv->tx.stop; + pparm->count = pmp_priv->tx.sended; + } else { + if (pparm->enable == 0) { + pmp_priv->tx.stop = 1; + } else if (pmp_priv->tx.stop == 1) { + pmp_priv->tx.stop = 0; + pmp_priv->tx.count = pparm->count; + pmp_priv->tx.payload = pparm->payload_type; + pattrib = &pmp_priv->tx.attrib; + pattrib->pktlen = pparm->length; + _rtw_memcpy(pattrib->dst, pparm->da, ETH_ALEN); + SetPacketTx(padapter); + } else + return NDIS_STATUS_FAILURE; + } + + return NDIS_STATUS_SUCCESS; +} + +#if 0 +unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) +{ + unsigned char *pframe, *pmp_pkt; + struct ethhdr *pethhdr; + struct pkt_attrib *pattrib; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + int llc_sz, payload_len; + struct mp_xmit_frame *pxframe= NULL; + struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet*)param; + u8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55}; + +// DBG_8192C("+mp_ioctl_xmit_packet_hdl\n"); + + pxframe = alloc_mp_xmitframe(&padapter->mppriv); + if (pxframe == NULL) + { + DEBUG_ERR(("Can't alloc pmpframe %d:%s\n", __LINE__, __FILE__)); + return -1; + } + + //mp_xmit_pkt + payload_len = pmp_xmitpkt->len - 14; + pmp_pkt = (unsigned char*)pmp_xmitpkt->mem; + pethhdr = (struct ethhdr *)pmp_pkt; + + //DBG_8192C("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem); + + //DBG_8192C("pxframe=0x%x\n", (void*)pxframe); + //DBG_8192C("pxframe->mem=0x%x\n", (void*)pxframe->mem); + + //update attribute + pattrib = &pxframe->attrib; + memset((u8 *)(pattrib), 0, sizeof (struct pkt_attrib)); + pattrib->pktlen = pmp_xmitpkt->len; + pattrib->ether_type = ntohs(pethhdr->h_proto); + pattrib->hdrlen = 24; + pattrib->nr_frags = 1; + pattrib->priority = 0; +#ifndef CONFIG_MP_LINUX + if(IS_MCAST(pethhdr->h_dest)) + pattrib->mac_id = 4; + else + pattrib->mac_id = 5; +#else + pattrib->mac_id = 5; +#endif + + // + memset(pxframe->mem, 0 , WLANHDR_OFFSET); + pframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET; + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + SetFrameSubType(pframe, WIFI_DATA); + + _rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN); + + _rtw_memcpy(pwlanhdr->addr3, addr3, ETH_ALEN); + + pwlanhdr->seq_ctl = 0; + pframe += pattrib->hdrlen; + + llc_sz= rtw_put_snap(pframe, pattrib->ether_type); + pframe += llc_sz; + + _rtw_memcpy(pframe, (void*)(pmp_pkt+14), payload_len); + + pattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len; + + DEBUG_INFO(("issuing mp_xmit_frame, tx_len=%d, ether_type=0x%x\n", pattrib->last_txcmdsz, pattrib->ether_type)); + xmit_mp_frame(padapter, pxframe); + + return _SUCCESS; +} +#endif +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) +{ + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + _irqL oldirql; + u8 bpwrup; + +_func_enter_; + + if (poid_par_priv->type_of_oid != SET_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + + RT_TRACE(_module_mp_, _drv_info_, + ("\n ===> Setoid_rt_set_power_down_hdl.\n")); + + _irqlevel_changed_(&oldirql, LOWER); + + bpwrup = *(u8 *)poid_par_priv->information_buf; + //CALL the power_down function +#ifdef PLATFORM_LINUX +#ifdef CONFIG_SDIO_HCI + dev_power_down(Adapter,bpwrup); +#endif +#endif + _irqlevel_changed_(&oldirql, RAISE); + + //DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER. + // Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value)); + +_func_exit_; + + return status; +} +//------------------------------------------------------------------------------ +NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv) +{ +#if 0 + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); +// _irqL oldirql; + +_func_enter_; + + if (poid_par_priv->type_of_oid != QUERY_OID) { + status = NDIS_STATUS_NOT_ACCEPTED; + return status; + } + if (poid_par_priv->information_buf_len < sizeof(u32)) { + status = NDIS_STATUS_INVALID_LENGTH; + return status; + } + + RT_TRACE(_module_mp_, _drv_info_, + ("\n ===> oid_rt_get_power_mode_hdl.\n")); + +// _irqlevel_changed_(&oldirql, LOWER); + *(int*)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL; + *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; +// _irqlevel_changed_(&oldirql, RAISE); + +_func_exit_; + + return status; +#else + return 0; +#endif +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_p2p.c b/drivers/net/wireless/rtl8192c/core/rtw_p2p.c new file mode 100755 index 000000000000..bcc814abdec5 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_p2p.c @@ -0,0 +1,2142 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_P2P_C_ + +#include +#include +#include + +#ifdef CONFIG_P2P + + +static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + _list *phead, *plist; + u32 len=0; + u16 attr_len = 0; + u8 tmplen, *pdata_attr, *pstart, *pcur; + struct sta_info *psta = NULL; + _adapter *padapter = pwdinfo->padapter; + struct sta_priv *pstapriv = &padapter->stapriv; + + DBG_871X("%s\n", __FUNCTION__); + + pdata_attr = rtw_zmalloc(MAX_P2P_IE_LEN); + + pstart = pdata_attr; + pcur = pdata_attr; + + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //look up sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + + if(psta->is_p2p_device) + { + tmplen = 0; + + pcur++; + + //P2P device address + _rtw_memcpy(pcur, psta->dev_addr, ETH_ALEN); + pcur += ETH_ALEN; + + //P2P interface address + _rtw_memcpy(pcur, psta->hwaddr, ETH_ALEN); + pcur += ETH_ALEN; + + *pcur = psta->dev_cap; + pcur++; + + //*(u16*)(pcur) = cpu_to_be16(psta->config_methods); + RTW_PUT_BE16(pcur, psta->config_methods); + pcur += 2; + + _rtw_memcpy(pcur, psta->primary_dev_type, 8); + pcur += 8; + + *pcur = psta->num_of_secdev_type; + pcur++; + + _rtw_memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8); + pcur += psta->num_of_secdev_type*8; + + if(psta->dev_name_len>0) + { + //*(u16*)(pcur) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + RTW_PUT_BE16(pcur, WPS_ATTR_DEVICE_NAME); + pcur += 2; + + //*(u16*)(pcur) = cpu_to_be16( psta->dev_name_len ); + RTW_PUT_BE16(pcur, psta->dev_name_len); + pcur += 2; + + _rtw_memcpy(pcur, psta->dev_name, psta->dev_name_len); + pcur += psta->dev_name_len; + } + + + tmplen = (u8)(pcur-pstart); + + *pstart = (tmplen-1); + + attr_len += tmplen; + + //pstart += tmplen; + pstart = pcur; + + } + + + } + + if(attr_len>0) + { + len = rtw_set_p2p_attr_content(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr); + } + + rtw_mfree(pdata_attr, MAX_P2P_IE_LEN); + + return len; + +} + +static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + _adapter *padapter = pwdinfo->padapter; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = WLAN_CATEGORY_P2P;//P2P action frame + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_GO_DISC_REQUEST; + u8 dialogToken=0; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //Build P2P action frame header + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + //there is no IE in this P2P action frame + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + _adapter *padapter = pwdinfo->padapter; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_DEVDISC_RESP; + u8 p2pie[8] = { 0x00 }; + u32 p2pielen = 0; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->device_addr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //Build P2P public action frame header + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + + //Build P2P IE + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // P2P_ATTR_STATUS + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method) +{ + _adapter *padapter = pwdinfo->padapter; + unsigned char category = WLAN_CATEGORY_PUBLIC; + u8 action = P2P_PUB_ACTION_ACTION; + u8 dialogToken = frame_body[7]; // The Dialog Token of provisioning discovery request frame. + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PROVISION_DISC_RESP; + u8 wpsie[ 100 ] = { 0x00 }; + u8 wpsielen = 0; + + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + wpsielen = 0; + // WPS OUI + //*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(wpsie, WPSOUI); + wpsielen += 4; + +#if 0 + // WPS version + // Type: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 ); + wpsielen += 2; + + // Length: + *(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 ); + wpsielen += 2; + + // Value: + wpsie[wpsielen++] = WPS_VERSION_1; // Version 1.0 +#endif + + // Config Method + // Type: + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD ); + RTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD); + wpsielen += 2; + + // Length: + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 ); + RTW_PUT_BE16(wpsie + wpsielen, 0x0002); + wpsielen += 2; + + // Value: + //*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method ); + RTW_PUT_BE16(wpsie + wpsielen, config_method); + wpsielen += 2; + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen ); + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + + return; + +} + +static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken) +{ + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + unsigned char *pframe; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + _adapter *padapter = pwdinfo->padapter; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + unsigned char category = WLAN_CATEGORY_P2P;//P2P action frame + u32 p2poui = cpu_to_be32(P2POUI); + u8 oui_subtype = P2P_PRESENCE_RESPONSE; + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u8 noa_attr_content[32] = { 0x00 }; + u32 p2pielen = 0; + + DBG_871X("[%s]\n", __FUNCTION__); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(padapter, pattrib); + + _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); + + pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN); + + SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_ACTION); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); + + //Build P2P action frame header + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen)); + + + //Add P2P IE header + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + //Add Status attribute in P2P IE + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status); + + //Add NoA attribute in P2P IE + noa_attr_content[0] = 0x1;//index + noa_attr_content[1] = 0x0;//CTWindow and OppPS Parameters + + //todo: Notice of Absence Descriptor(s) + + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content); + + + + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &(pattrib->pktlen)); + + + pattrib->last_txcmdsz = pattrib->pktlen; + + dump_mgntframe(padapter, pmgntframe); + +} + +u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u16 capability=0; + u32 len=0, p2pielen = 0; + + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + + // According to the P2P Specification, the beacon frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. P2P Device ID + // 3. Notice of Absence ( NOA ) + + // P2P Capability ATTR + // Type: + // Length: + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + // Group Capability Bitmap, 1 byte + capability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY; + capability |= ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8); + if(pwdinfo->p2p_state == P2P_STATE_PROVISIONING_ING) + capability |= (P2P_GRPCAP_GROUP_FORMATION<<8); + + capability = cpu_to_le16(capability); + + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability); + + + // P2P Device ID ATTR + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr); + + + // Notice of Absence ATTR + // Type: + // Length: + // Value: + + //go_add_noa_attr(pwdinfo); + + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + + return len; + +} + +#ifdef CONFIG_WFD +u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; + u32 len=0, wfdielen = 0; + _adapter *padapter = pwdinfo->padapter; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wifi_display_info* pwfd_info = &padapter->wdinfo.wfd_info; + + // WFD OUI + wfdielen = 0; + wfdie[ wfdielen++ ] = 0x50; + wfdie[ wfdielen++ ] = 0x6F; + wfdie[ wfdielen++ ] = 0x9A; + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + + // Commented by Albert 20110812 + // According to the WFD Specification, the beacon frame should contain 4 WFD attributes + // 1. WFD Device Information + // 2. Associated BSSID + // 3. Coupled Sink Information + + + // WFD Device Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 6; + + // Value1: + // WFD device information + // WFD primary sink + available for WFD session + WiFi Direct mode + RTW_PUT_BE16(wfdie + wfdielen, 0x0011); + wfdielen += 2; + + // Value2: + // Session Management Control Port + // Default TCP port for RTSP messages is 554 + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + wfdielen += 2; + + // Value3: + // WFD Device Maximum Throughput + // 300Mbps is the maximum throughput + RTW_PUT_BE16(wfdie + wfdielen, 300); + wfdielen += 2; + + // Associated BSSID ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 6; + + // Value: + // Associated BSSID + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE ) + { + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); + } + else + { + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); + } + + wfdielen += ETH_ALEN; + + // Coupled Sink Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 1; + + // Value: + // Coupled Sink Status bitmap + // Not coupled/available for Coupling + wfdie[ wfdielen++ ] = 0; + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); + + return len; + +} + +u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; + u32 len=0, wfdielen = 0; + _adapter *padapter = pwdinfo->padapter; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wifi_display_info* pwfd_info = &padapter->wdinfo.wfd_info; + + // WFD OUI + wfdielen = 0; + wfdie[ wfdielen++ ] = 0x50; + wfdie[ wfdielen++ ] = 0x6F; + wfdie[ wfdielen++ ] = 0x9A; + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + + // Commented by Albert 20110812 + // According to the WFD Specification, the probe request frame should contain 4 WFD attributes + // 1. WFD Device Information + // 2. Associated BSSID + // 3. Coupled Sink Information + + + // WFD Device Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 6; + + // Value1: + // WFD device information + // WFD primary sink + available for WFD session + WiFi Direct mode + RTW_PUT_BE16(wfdie + wfdielen, 0x0011); + wfdielen += 2; + + // Value2: + // Session Management Control Port + // Default TCP port for RTSP messages is 554 + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + wfdielen += 2; + + // Value3: + // WFD Device Maximum Throughput + // 300Mbps is the maximum throughput + RTW_PUT_BE16(wfdie + wfdielen, 300); + wfdielen += 2; + + // Associated BSSID ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 6; + + // Value: + // Associated BSSID + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE ) + { + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); + } + else + { + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); + } + + wfdielen += ETH_ALEN; + + // Coupled Sink Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 1; + + // Value: + // Coupled Sink Status bitmap + // Not coupled/available for Coupling + wfdie[ wfdielen++ ] = 0; + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); + + return len; + +} + +u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; + u32 len=0, wfdielen = 0; + _adapter *padapter = pwdinfo->padapter; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wifi_display_info* pwfd_info = &padapter->wdinfo.wfd_info; + + // WFD OUI + wfdielen = 0; + wfdie[ wfdielen++ ] = 0x50; + wfdie[ wfdielen++ ] = 0x6F; + wfdie[ wfdielen++ ] = 0x9A; + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + + // Commented by Albert 20110812 + // According to the WFD Specification, the probe response frame should contain 4 WFD attributes + // 1. WFD Device Information + // 2. Associated BSSID + // 3. Coupled Sink Information + // 4. WFD Session Information + + + // WFD Device Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 6; + + // Value1: + // WFD device information + // WFD primary sink + available for WFD session + WiFi Direct mode + RTW_PUT_BE16(wfdie + wfdielen, 0x0011); + wfdielen += 2; + + // Value2: + // Session Management Control Port + // Default TCP port for RTSP messages is 554 + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + wfdielen += 2; + + // Value3: + // WFD Device Maximum Throughput + // 300Mbps is the maximum throughput + RTW_PUT_BE16(wfdie + wfdielen, 300); + wfdielen += 2; + + // Associated BSSID ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 6; + + // Value: + // Associated BSSID + if ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE ) + { + _rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); + } + else + { + _rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN ); + } + + wfdielen += ETH_ALEN; + + // Coupled Sink Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 1; + + // Value: + // Coupled Sink Status bitmap + // Not coupled/available for Coupling + wfdie[ wfdielen++ ] = 0; + + if ( P2P_ROLE_GO == pwdinfo->role ) + { + // WFD Session Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 0; + + // Todo: to add the list of WFD device info descriptor in WFD group. + + } + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); + + return len; + +} + +u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 }; + u32 len=0, wfdielen = 0; + _adapter *padapter = pwdinfo->padapter; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wifi_display_info* pwfd_info = &padapter->wdinfo.wfd_info; + + // WFD OUI + wfdielen = 0; + wfdie[ wfdielen++ ] = 0x50; + wfdie[ wfdielen++ ] = 0x6F; + wfdie[ wfdielen++ ] = 0x9A; + wfdie[ wfdielen++ ] = 0x0A; // WFA WFD v1.0 + + // Commented by Albert 20110825 + // According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes + // 1. WFD Device Information + // 2. Associated BSSID ( Optional ) + // 3. Local IP Adress ( Optional ) + + + // WFD Device Information ATTR + // Type: + wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO; + + // Length: + // Note: In the WFD specification, the size of length field is 1. + wfdie[ wfdielen++ ] = 6; + + // Value1: + // WFD device information + // WFD primary sink + available for WFD session + WiFi Direct mode + RTW_PUT_BE16(wfdie + wfdielen, 0x0011); + wfdielen += 2; + + // Value2: + // Session Management Control Port + // Default TCP port for RTSP messages is 554 + RTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport ); + wfdielen += 2; + + // Value3: + // WFD Device Maximum Throughput + // 300Mbps is the maximum throughput + RTW_PUT_BE16(wfdie + wfdielen, 300); + wfdielen += 2; + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len); + + return len; + +} +#endif //CONFIG_WFD + +u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 len=0, p2pielen = 0; + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20100907 + // According to the P2P Specification, the probe response frame should contain 5 P2P attributes + // 1. P2P Capability + // 2. Extended Listen Timing + // 3. Notice of Absence ( NOA ) ( Only GO needs this ) + // 4. Device Info + // 5. Group Info ( Only GO need this ) + + // P2P Capability ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + RTW_PUT_LE16(p2pie + p2pielen, 0x0002); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY; + + // Group Capability Bitmap, 1 byte + if(pwdinfo->role == P2P_ROLE_GO) + { + p2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS); + + if(pwdinfo->p2p_state == P2P_STATE_PROVISIONING_ING) + p2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION; + + p2pielen++; + } + else if ( pwdinfo->role == P2P_ROLE_DEVICE ) + { + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + } + + // Extended Listen Timing ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 ); + RTW_PUT_LE16(p2pie + p2pielen, 0x0004); + p2pielen += 2; + + // Value: + // Availability Period + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); + p2pielen += 2; + + // Availability Interval + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF ); + RTW_PUT_LE16(p2pie + p2pielen, 0xFFFF); + p2pielen += 2; + + + // Notice of Absence ATTR + // Type: + // Length: + // Value: + if(pwdinfo->role == P2P_ROLE_GO) + { + //go_add_noa_attr(pwdinfo); + } + + // Device Info ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm ); + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm); + p2pielen += 2; + + // Primary Device Type + // Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_RTK_WIDI); + p2pielen += 2; + + // OUI + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); + p2pielen += 4; + + // Sub Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_RTK_DMP); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); + p2pielen += 2; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + + // Group Info ATTR + // Type: + // Length: + // Value: + if(pwdinfo->role == P2P_ROLE_GO) + { + p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen); + } + + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + + return len; + +} + +u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr ) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 len=0, p2pielen = 0; + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // Commented by Albert 20110301 + // According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes + // 1. P2P Capability + // 2. Device Info + // 3. Group ID ( When joining an operating P2P Group ) + + // P2P Capability ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 ); + RTW_PUT_LE16(p2pie + p2pielen, 0x0002); + p2pielen += 2; + + // Value: + // Device Capability Bitmap, 1 byte + // Be able to participate in additional P2P Groups and + // support the P2P Invitation Procedure + p2pie[ p2pielen++ ] = P2P_DEVCAP_INVITATION_PROC; + + // Group Capability Bitmap, 1 byte + p2pie[ p2pielen++ ] = 0x00; + + + // Device Info ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO; + + // Length: + // 21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) + // + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len ); + RTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + // P2P Device Address + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + // Config Method + // This field should be big endian. Noted by P2P specification. + if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC ) + { + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_PBC); + } + else + { + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_DISPLAY); + } + + p2pielen += 2; + + // Primary Device Type + // Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_RTK_WIDI); + p2pielen += 2; + + // OUI + //*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI ); + RTW_PUT_BE32(p2pie + p2pielen, WPSOUI); + p2pielen += 4; + + // Sub Category ID + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_RTK_DMP); + p2pielen += 2; + + // Number of Secondary Device Types + p2pie[ p2pielen++ ] = 0x00; // No Secondary Device Type List + + // Device Name + // Type: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME ); + RTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME); + p2pielen += 2; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len ); + RTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len ); + p2pielen += pwdinfo->device_name_len; + + if ( pwdinfo->role == P2P_ROLE_CLIENT ) + { + // Added by Albert 2011/05/19 + // In this case, the pdev_raddr is the device address of the group owner. + + // P2P Group ID ATTR + // Type: + p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID; + + // Length: + //*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + ussidlen ); + RTW_PUT_LE16(p2pie + p2pielen, ETH_ALEN + ussidlen); + p2pielen += 2; + + // Value: + _rtw_memcpy( p2pie + p2pielen, pdev_raddr, ETH_ALEN ); + p2pielen += ETH_ALEN; + + _rtw_memcpy( p2pie + p2pielen, pssid, ussidlen ); + p2pielen += ussidlen; + + } + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + + return len; + +} + + +u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code) +{ + u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 }; + u32 len=0, p2pielen = 0; + + // P2P OUI + p2pielen = 0; + p2pie[ p2pielen++ ] = 0x50; + p2pie[ p2pielen++ ] = 0x6F; + p2pie[ p2pielen++ ] = 0x9A; + p2pie[ p2pielen++ ] = 0x09; // WFA P2P v1.0 + + // According to the P2P Specification, the Association response frame should contain 2 P2P attributes + // 1. Status + // 2. Extended Listen Timing (optional) + + + // Status ATTR + p2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code); + + + // Extended Listen Timing ATTR + // Type: + // Length: + // Value: + + + pbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len); + + return len; + +} + +u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf) +{ + u32 len=0; + + return len; +} + +u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + u8 *p; + u32 ret=_FALSE; + u8 p2pie[ MAX_P2P_IE_LEN ] = { 0xFF }; + u32 p2pielen = 0; + int ssid_len=0, rate_cnt = 0; + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt, + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + + if ( rate_cnt <= 4 ) + { + int i, g_rate =0; + + for( i = 0; i < rate_cnt; i++ ) + { + if ( ( ( *( p + 2 + i ) & 0xff ) != 0x02 ) && + ( ( *( p + 2 + i ) & 0xff ) != 0x04 ) && + ( ( *( p + 2 + i ) & 0xff ) != 0x0B ) && + ( ( *( p + 2 + i ) & 0xff ) != 0x16 ) ) + { + g_rate = 1; + } + } + + if ( g_rate == 0 ) + { + // There is no OFDM rate included in SupportedRates IE of this probe request frame + // The driver should response this probe request. + return ret; + } + } + else + { + // rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. + // We should proceed the following check for this probe request. + } + + // Added comments by Albert 20100906 + // There are several items we should check here. + // 1. This probe request frame must contain the P2P IE. (Done) + // 2. This probe request frame must contain the wildcard SSID. (Done) + // 3. Wildcard BSSID. (Todo) + // 4. Destination Address. ( Done in mgt_dispatcher function ) + // 5. Requested Device Type in WSC IE. (Todo) + // 6. Device ID attribute in P2P IE. (Todo) + + p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len, + len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_); + + if((pwdinfo->role == P2P_ROLE_DEVICE) || (pwdinfo->role == P2P_ROLE_GO)) + { + if(rtw_get_p2p_ie( pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_ , len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_ , p2pie, &p2pielen)) + { + if ( (p != NULL) && _rtw_memcmp( ( void * ) ( p+2 ), ( void * ) pwdinfo->p2p_wildcard_ssid , 7 )) + { + //todo: + //Check Requested Device Type attributes in WSC IE. + //Check Device ID attribute in P2P IE + + ret = _TRUE; + } + } + else + { + //non -p2p device + } + + } + + + return ret; + +} + +u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *p2p_ie, uint p2p_ielen, struct sta_info *psta) +{ + u8 status_code = P2P_STATUS_SUCCESS; + u8 *pbuf, *pattr_content=NULL; + u32 attr_contentlen = 0; + u16 cap_attr=0; + + if(pwdinfo->role != P2P_ROLE_GO) + return P2P_STATUS_FAIL_REQUEST_UNABLE; + + //Check P2P Capability ATTR + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen)==_FALSE) + return P2P_STATUS_FAIL_INVALID_PARAM; + + cap_attr = le16_to_cpu(cap_attr); + psta->dev_cap = cap_attr&0xff; + + + //Check Extended Listen Timing ATTR + + + //Check P2P Device Info ATTR + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen)==_TRUE) + { + pattr_content = pbuf = rtw_zmalloc(attr_contentlen); + if(pattr_content) + { + u8 num_of_secdev_type; + u16 dev_name_len; + + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO , pattr_content, (uint*)&attr_contentlen); + + _rtw_memcpy(psta->dev_addr, pattr_content, ETH_ALEN);//P2P Device Address + + pattr_content += ETH_ALEN; + + _rtw_memcpy(&psta->config_methods, pattr_content, 2);//Config Methods + psta->config_methods = be16_to_cpu(psta->config_methods); + + pattr_content += 2; + + _rtw_memcpy(psta->primary_dev_type, pattr_content, 8); + + pattr_content += 8; + + num_of_secdev_type = *pattr_content; + pattr_content += 1; + + if(num_of_secdev_type==0) + { + psta->num_of_secdev_type = 0; + } + else + { + u32 len; + + psta->num_of_secdev_type = num_of_secdev_type; + + len = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8); + + _rtw_memcpy(psta->secdev_types_list, pattr_content, len); + + pattr_content += (num_of_secdev_type*8); + } + + + //dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8); + psta->dev_name_len=0; + if(WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content)) + { + dev_name_len = be16_to_cpu(*(u16*)(pattr_content+2)); + + psta->dev_name_len = (sizeof(psta->dev_name)dev_name):dev_name_len; + + _rtw_memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len); + } + + rtw_mfree(pbuf, attr_contentlen); + + } + + } + else + { + status_code = P2P_STATUS_FAIL_INVALID_PARAM; + } + + return status_code; + +} + +u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + u8 *frame_body; + u8 status, dialogToken; + struct sta_info *psta = NULL; + _adapter *padapter = pwdinfo->padapter; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 p2p_ie[ MAX_P2P_IE_LEN ] = { 0xFF }; + u32 p2p_ielen = 0; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + dialogToken = frame_body[7]; + status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; + + if ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + u8 groupid[ 38 ] = { 0x00 }; + u8 dev_addr[ETH_ALEN] = { 0x00 }; + u32 attr_contentlen = 0; + + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen)) + { + if(_rtw_memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) && + _rtw_memcmp(pwdinfo->p2p_group_ssid, groupid+ETH_ALEN, pwdinfo->p2p_group_ssid_len)) + { + attr_contentlen=0; + if(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen)) + { + _list *phead, *plist; + phead = &pstapriv->asoc_list; + plist = get_next(phead); + + //look up sta asoc_queue + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); + + plist = get_next(plist); + + if(psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) && + _rtw_memcmp(psta->dev_addr, dev_addr, ETH_ALEN)) + { + + //issue GO Discoverability Request + issue_group_disc_req(pwdinfo, psta->hwaddr); + + status = P2P_STATUS_SUCCESS; + + break; + } + else + { + status = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + } + + } + + } + else + { + status = P2P_STATUS_FAIL_INVALID_PARAM; + } + + } + else + { + status = P2P_STATUS_FAIL_INVALID_PARAM; + } + + } + + } + + + //issue Device Discoverability Response + issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); + + + return (status==P2P_STATUS_SUCCESS) ? _TRUE:_FALSE; + +} + +u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + return _TRUE; +} + +u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u8 *frame_body; + u8 wpsie[255] = { 0x00 }; + uint wps_ielen = 0, attr_contentlen = 0; + u16 uconfig_method = 0; + + + frame_body = (pframe + sizeof(struct ieee80211_hdr_3addr)); + + if ( rtw_get_wps_ie_p2p( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wps_ielen) ) + { + if ( rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_CONF_METHOD , ( u8* ) &uconfig_method, &attr_contentlen) ) + { + uconfig_method = be16_to_cpu( uconfig_method ); + switch( uconfig_method ) + { + case WPS_CM_DISPLYA: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3 ); + break; + } + case WPS_CM_LABEL: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "lab", 3 ); + break; + } + case WPS_CM_PUSH_BUTTON: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3 ); + break; + } + case WPS_CM_KEYPAD: + { + _rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3 ); + break; + } + } + issue_p2p_provision_resp( pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method); + } + } + DBG_8192C( "[%s] config method = %s\n", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req ); + return _TRUE; + +} + +u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe) +{ + + return _TRUE; +} + + + +u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u8 result = P2P_STATUS_SUCCESS; + u32 p2p_ielen = 0, wps_ielen = 0; + u8 p2p_ie[ 255 ] = { 0x00 }; + uint cnt = 0; +#ifdef CONFIG_WFD + u8 wfd_ie[ 128 ]; + u32 wfd_ielen; +#endif // CONFIG_WFD + + if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO ) + { + result = P2P_STATUS_FAIL_INFO_UNAVAILABLE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + return( result ); + } + + if ( rtw_get_wps_ie_p2p( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen) ) + { + + } + else + { + DBG_8192C( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + return( result ); + } + + cnt = rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ); + + if ( cnt == 0 ) + { + DBG_8192C( "[%s] P2P IE not Found!!\n", __FUNCTION__ ); + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + + while ( cnt ) + { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + pwdinfo->p2p_state = P2P_STATE_GONEGO_ING; + + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen) ) + { + DBG_8192C( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); + pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. + } + + if ( result == P2P_STATUS_SUCCESS ) + { + if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) + { + // Try to match the tie breaker value + if ( pwdinfo->intent == P2P_MAX_INTENT ) + { + pwdinfo->role = P2P_ROLE_DEVICE; + result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; + } + else + { + if ( attr_content & 0x01 ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_GO; + } + } + } + else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->role = P2P_ROLE_GO; + } + else + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + } + + attr_contentlen = 0; + + if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ) ) + { + if ( attr_contentlen != ETH_ALEN ) + { + _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); + } + } + + // Get the next P2P IE + // If the cnt is 0 -> no the next P2P IE + + _rtw_memset( p2p_ie, 0x00, 255); + p2p_ielen = 0; + cnt = rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_ + cnt, len - _PUBLIC_ACTION_IE_OFFSET_ - cnt, p2p_ie, &p2p_ielen ); + } + +#ifdef CONFIG_WFD + // Added by Albert 20110823 + // Try to get the TCP port information when receiving the negotiation request. + if ( rtw_get_wfd_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen ) ) + { + u8 attr_content[ 10 ] = { 0x00 }; + u32 attr_contentlen = 0; + + DBG_8192C( "[%s] WFD IE Found!!\n", __FUNCTION__ ); + rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen); + if ( attr_contentlen ) + { + pwdinfo->wfd_info.peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 ); + DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__, pwdinfo->wfd_info.peer_rtsp_ctrlport ); + } + } +#endif // CONFIG_WFD + + return( result ); +} + +u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u8 result = P2P_STATUS_SUCCESS; + u32 p2p_ielen, wps_ielen; + u8 p2p_ie[ 255 ]; + + + // Be able to know which one is the P2P GO and which one is P2P client. + + if ( rtw_get_wps_ie_p2p( pframe+ _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen) ) + { + + } + else + { + DBG_8192C( "[%s] WPS IE not Found!!\n", __FUNCTION__ ); + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + + if ( rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) ) + { + u8 attr_content = 0x00; + u32 attr_contentlen = 0; + + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + if ( attr_contentlen == 1 ) + { + uint ch_cnt = 0; + u8 ch_content[50] = { 0x00 }; + + DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); + if ( attr_content == P2P_STATUS_SUCCESS ) + { + + attr_contentlen = 0; + rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ); + + if ( attr_contentlen != ETH_ALEN ) + { + _rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN ); + } + + attr_content = 0x00; + attr_contentlen = 0; + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen); + DBG_8192C( "[%s] GO Intent = %d, tie = %d\n", __FUNCTION__, attr_content >> 1, attr_content & 0x01 ); + pwdinfo->peer_intent = attr_content; // include both intent and tie breaker values. + + if ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) ) + { + // Try to match the tie breaker value + if ( pwdinfo->intent == P2P_MAX_INTENT ) + { + pwdinfo->role = P2P_ROLE_DEVICE; + result = P2P_STATUS_FAIL_BOTH_GOINTENT_15; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + else + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + if ( attr_content & 0x01 ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_GO; + } + } + } + else if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + pwdinfo->role = P2P_ROLE_GO; + } + else + { + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + pwdinfo->role = P2P_ROLE_CLIENT; + } + + { + u8 operatingch_info[5] = { 0x00 }; + + attr_contentlen = 0; + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen); + DBG_8192C( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); + pwdinfo->peer_operating_ch = operatingch_info[4]; + } + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + result = attr_content; + } + + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt) ) + { + pwdinfo->channel_cnt = ch_content[ 4 ]; // Number of Channels + _rtw_memcpy( pwdinfo->channel_list, &ch_content[ 5 ], pwdinfo->channel_cnt ); // Channel List + DBG_8192C( "[%s] channel count = %d\n", __FUNCTION__, pwdinfo->channel_cnt ); + } + else + { + DBG_8192C( "[%s] channel list attribute not found!\n", __FUNCTION__); + } + } + else + { + // the length of P2P STATUS ATTRIBUTE is not 1, doesn't match with the P2P specification. + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM; + } + + return( result ); + +} + +u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ) +{ + u32 p2p_ielen = 0; + u8 p2p_ie[ 255 ] = { 0x00 }; + u8 result = P2P_STATUS_SUCCESS; + uint cnt = 0; + + cnt = rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ); + while ( cnt ) // Found the P2P IE. + { + u8 attr_content = 0x00, operatingch_info[5] = { 0x00 }; + u8 groupid[ 38 ] = { 0x00 }; + u32 attr_contentlen = 0; + + pwdinfo->negotiation_dialog_token = 1; + rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen); + if ( attr_contentlen == 1 ) + { + DBG_8192C( "[%s] Status = %d\n", __FUNCTION__, attr_content ); + result = attr_content; + + if ( attr_content == P2P_STATUS_SUCCESS ) + { + u8 bcancelled = 0; + + _cancel_timer( &pwdinfo->restore_p2p_state_timer, &bcancelled ); + + // Commented by Albert 20100911 + // Todo: Need to handle the case which both Intents are the same. + pwdinfo->p2p_state = P2P_STATE_GONEGO_OK; + if ( ( pwdinfo->intent ) > ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->role = P2P_ROLE_GO; + } + else if ( ( pwdinfo->intent ) < ( pwdinfo->peer_intent >> 1 ) ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + // Have to compare the Tie Breaker + if ( pwdinfo->peer_intent & 0x01 ) + { + pwdinfo->role = P2P_ROLE_CLIENT; + } + else + { + pwdinfo->role = P2P_ROLE_GO; + } + } + } + else + { + pwdinfo->role = P2P_ROLE_DEVICE; + pwdinfo->p2p_state = P2P_STATE_GONEGO_FAIL; + } + } + + if ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen) ) + { + DBG_8192C( "[%s] Ssid = %s, ssidlen = %d\n", __FUNCTION__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN]) ); + } + + attr_contentlen = 0; + if ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) ) + { + DBG_8192C( "[%s] Peer's operating channel = %d\n", __FUNCTION__, operatingch_info[4] ); + pwdinfo->peer_operating_ch = operatingch_info[4]; + } + + // Get the next P2P IE + // If the cnt is 0 -> no the next P2P IE + + _rtw_memset( p2p_ie, 0x00, 255); + p2p_ielen = 0; + cnt = rtw_get_p2p_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_ + cnt, len - _PUBLIC_ACTION_IE_OFFSET_ - cnt, p2p_ie, &p2p_ielen ); + + } + + return( result ); +} + +u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) +{ + u8 *frame_body; + u8 dialogToken=0; + u8 status = P2P_STATUS_SUCCESS; + + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); + + dialogToken = frame_body[6]; + + //todo: check NoA attribute + + issue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); + + return _TRUE; +} + +void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength) +{ + u32 p2p_ielen = 0; + u32 attr_contentlen = 0; + u8 p2p_ie[ MAX_P2P_IE_LEN] = { 0x00 }; + u8 noa_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2 + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + u8 find_p2p = _FALSE, find_p2p_ps = _FALSE; + u8 noa_offset, noa_num, noa_index; + u32 offset, cnt; + +_func_enter_; + + if ( pwdinfo->p2p_state == P2P_STATE_NONE ) + { + return; + } + + cnt = _BEACON_IE_OFFSET_; + while(cnt < IELength) + { + offset = rtw_get_p2p_ie( &IEs[cnt], IELength-cnt, p2p_ie, &p2p_ielen); + + if(offset) + { + find_p2p = _TRUE; + // Get Notice of Absence IE. + if(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen)) + { + find_p2p_ps = _TRUE; + noa_index = noa_attr[0]; + + if( (pwdinfo->p2p_ps_enable == _FALSE) || + (noa_index != pwdinfo->noa_index) )// if index change, driver should reconfigure related setting. + { + pwdinfo->noa_index = noa_index; + pwdinfo->opp_ps = noa_attr[1] >> 7; + pwdinfo->ctwindow = noa_attr[1] & 0x7F; + + noa_offset = 2; + noa_num = 0; + // NoA length should be n*(13) + 2 + if(attr_contentlen > 2) + { + while(noa_offset < attr_contentlen) + { + //_rtw_memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); + pwdinfo->noa_count[noa_num] = noa_attr[noa_offset]; + noa_offset += 1; + + _rtw_memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4); + noa_offset += 4; + + _rtw_memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4); + noa_offset += 4; + + _rtw_memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4); + noa_offset += 4; + + noa_num++; + } + } + pwdinfo->noa_num = noa_num; + + if( pwdinfo->opp_ps == 1 ) + { + pwdinfo->p2p_ps_enable = _TRUE; + // driver should wait LPS for entering CTWindow + if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) + { + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); + } + } + else if( pwdinfo->noa_num > 0 ) + { + pwdinfo->p2p_ps_enable = _TRUE; + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1); + } + else if( pwdinfo->p2p_ps_enable == _TRUE) + { + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); + } + } + + break; // find target, just break. + } + + cnt += offset; + } + else // No p2p IE. + { + break; + } + } + + if(find_p2p == _TRUE) + { + if( (pwdinfo->p2p_ps_enable == _TRUE) && (find_p2p_ps == _FALSE) ) + { + p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); + } + } + +_func_exit_; +} + +void find_phase_handler( _adapter* padapter ) +{ + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + NDIS_802_11_SSID ssid; + _irqL irqL; + u8 _status = 0; + +_func_enter_; + + _rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID)); + _rtw_memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN ); + ssid.SsidLength = P2P_WILDCARD_SSID_LEN; + + pwdinfo->p2p_state = P2P_STATE_FIND_PHASE_SEARCH; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _status = rtw_sitesurvey_cmd(padapter, &ssid); + _exit_critical_bh(&pmlmepriv->lock, &irqL); + + +_func_exit_; +} + +void restore_p2p_state_handler( _adapter* padapter ) +{ + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +_func_enter_; + + pwdinfo->p2p_state = pwdinfo->pre_p2p_state; + if ( pwdinfo->role != P2P_ROLE_CLIENT ) + { + // In the P2P client mode, the driver should not switch back to its listen channel + // because this P2P client should stay at the operating channel of P2P GO. + set_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + } +_func_exit_; +} + +void pre_tx_provdisc_handler( _adapter* padapter ) +{ + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + u8 val8 = 1; +_func_enter_; + + set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + issue_probereq_p2p( padapter ); + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); + +_func_exit_; +} + +void pre_tx_negoreq_handler( _adapter* padapter ) +{ + struct wifidirect_info *pwdinfo = &padapter->wdinfo; + u8 val8 = 1; +_func_enter_; + + set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); + issue_probereq_p2p( padapter ); + _set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT ); + +_func_exit_; +} + + +void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType) +{ + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + +_func_enter_; + + switch(intCmdType) + { + case P2P_FIND_PHASE_WK: + { + find_phase_handler( padapter ); + break; + } + case P2P_RESTORE_STATE_WK: + { + restore_p2p_state_handler( padapter ); + break; + } + case P2P_PRE_TX_PROVDISC_PROCESS_WK: + { + pre_tx_provdisc_handler( padapter ); + break; + } + case P2P_PRE_TX_NEGOREQ_PROCESS_WK: + { + pre_tx_negoreq_handler( padapter ); + break; + } + } + +_func_exit_; +} + + + +void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + +_func_enter_; + + // Pre action for p2p state + switch(p2p_ps_state) + { + case P2P_PS_ENABLE: + if( pwdinfo->ctwindow > 0 ) + { + if(pwrpriv->smart_ps != 0) + { + pwrpriv->smart_ps = 0; + DBG_871X("%s(): Enter CTW, change SmartPS\n", __FUNCTION__); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); + } + } + break; + default: + break; + } + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + + // clear P2P SW status + if(p2p_ps_state == P2P_PS_DISABLE) + { + pwdinfo->noa_index = 0; + pwdinfo->ctwindow = 0; + pwdinfo->opp_ps = 0; + pwdinfo->noa_num = 0; + pwdinfo->p2p_ps_enable = _FALSE; + if(padapter->pwrctrlpriv.bFwCurrentInPSMode == _TRUE) + { + if(pwrpriv->smart_ps == 0) + { + pwrpriv->smart_ps = 2; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(padapter->pwrctrlpriv.pwr_mode))); + } + } + } + +_func_exit_; +} + +u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue) +{ + struct cmd_obj *ph2c; + struct drvextra_cmd_parm *pdrvextra_cmd_parm; + struct wifidirect_info *pwdinfo= &(padapter->wdinfo); + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 res = _SUCCESS; + +_func_enter_; + + if ( (pwdinfo->p2p_state == P2P_STATE_NONE) || + ( pwdinfo->p2p_ps == p2p_ps_state ) ) + { + return res; + } + + // driver only perform p2p ps when GO have Opp_Ps or NoA + if( pwdinfo->p2p_ps_enable ) + { + pwdinfo->p2p_ps = p2p_ps_state; + + if(enqueue) + { + ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); + if(ph2c==NULL){ + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if(pdrvextra_cmd_parm==NULL){ + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res= _FAIL; + goto exit; + } + + pdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID; + pdrvextra_cmd_parm->type_size = p2p_ps_state; + pdrvextra_cmd_parm->pbuf = NULL; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + } + else + { + p2p_ps_wk_hdl(padapter, p2p_ps_state); + } + } + +exit: + +_func_exit_; + + return res; + +} + +#endif //CONFIG_P2P + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c b/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c new file mode 100755 index 000000000000..5891ba0505d3 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_pwrctrl.c @@ -0,0 +1,1126 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_PWRCTRL_C_ + +#include +#include +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include +#endif + +#ifdef CONFIG_IPS +void ips_enter(_adapter * padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + _enter_pwrlock(&pwrpriv->lock); + + pwrpriv->bips_processing = _TRUE; + + // syn ips_mode with request + pwrpriv->ips_mode = pwrpriv->ips_mode_req; + + pwrpriv->ips_enter_cnts++; + DBG_8192C("==>ips_enter cnts:%d\n",pwrpriv->ips_enter_cnts); + + if(rf_off == pwrpriv->change_rfpwrstate ) + { + DBG_8192C("==>power_saving_ctrl_wk_hdl change rf to OFF...LED(0x%08x).... \n\n",rtw_read32(padapter,0x4c)); + + if(pwrpriv->ips_mode == IPS_LEVEL_2) + pwrpriv->bkeepfwalive = _TRUE; + + rtw_ips_pwr_down(padapter); + pwrpriv->rf_pwrstate = rf_off; + } + pwrpriv->bips_processing = _FALSE; + _exit_pwrlock(&pwrpriv->lock); + +} + +int ips_leave(_adapter * padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + int result = _SUCCESS; + sint keyid; + _enter_pwrlock(&pwrpriv->lock); + if((pwrpriv->rf_pwrstate == rf_off) &&(!pwrpriv->bips_processing)) + { + pwrpriv->change_rfpwrstate = rf_on; + pwrpriv->ips_leave_cnts++; + DBG_8192C("==>ips_leave cnts:%d\n",pwrpriv->ips_leave_cnts); + + result = rtw_ips_pwr_up(padapter); + pwrpriv->bips_processing = _TRUE; + pwrpriv->rf_pwrstate = rf_on; + + if((_WEP40_ == psecuritypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == psecuritypriv->dot11PrivacyAlgrthm)) + { + DBG_8192C("==>%s,channel(%d),processing(%x)\n",__FUNCTION__,padapter->mlmeextpriv.cur_channel,pwrpriv->bips_processing); + set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); + for(keyid=0;keyid<4;keyid++){ + if(pmlmepriv->key_mask & BIT(keyid)){ + if(keyid == psecuritypriv->dot11PrivacyKeyIndex) + result=rtw_set_key(padapter,psecuritypriv, keyid, 1); + else + result=rtw_set_key(padapter,psecuritypriv, keyid, 0); + } + } + } + + DBG_8192C("==> ips_leave.....LED(0x%08x)...\n",rtw_read32(padapter,0x4c)); + pwrpriv->bips_processing = _FALSE; + + pwrpriv->bkeepfwalive = _FALSE; + + + } + _exit_pwrlock(&pwrpriv->lock); + return result; +} + + +#endif + +#ifdef CONFIG_AUTOSUSPEND +extern void autosuspend_enter(_adapter* padapter); +extern int autoresume_enter(_adapter* padapter); +#endif + +#ifdef SUPPORT_HW_RFOFF_DETECTED +int rtw_hw_suspend(_adapter *padapter ); +int rtw_hw_resume(_adapter *padapter); +#endif + +#ifdef PLATFORM_LINUX +void rtw_ps_processor(_adapter*padapter) +{ +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); +#endif //CONFIG_P2P + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + int res; + rt_rf_power_state rfpwrstate; + +#ifdef SUPPORT_HW_RFOFF_DETECTED + if(pwrpriv->bips_processing == _TRUE) return; + + //DBG_8192C("==> fw report state(0x%x)\n",rtw_read8(padapter,0x1ca)); + if(padapter->pwrctrlpriv.bHWPwrPindetect) + { + #ifdef CONFIG_AUTOSUSPEND + if(padapter->registrypriv.usbss_enable) + { + if(pwrpriv->rf_pwrstate == rf_on) + { + if(padapter->net_closed == _TRUE) + pwrpriv->ps_flag = _TRUE; + + rfpwrstate = RfOnOffDetect(padapter); + DBG_8192C("@@@@- #1 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); + if(rfpwrstate!= pwrpriv->rf_pwrstate) + { + if(rfpwrstate == rf_off) + { + pwrpriv->change_rfpwrstate = rf_off; + + pwrpriv->bkeepfwalive = _TRUE; + pwrpriv->brfoffbyhw = _TRUE; + + autosuspend_enter(padapter); + } + } + } + } + else + #endif //CONFIG_AUTOSUSPEND + { + rfpwrstate = RfOnOffDetect(padapter); + DBG_8192C("@@@@- #2 %s==> rfstate:%s \n",__FUNCTION__,(rfpwrstate==rf_on)?"rf_on":"rf_off"); + + if(rfpwrstate!= pwrpriv->rf_pwrstate) + { + if(rfpwrstate == rf_off) + { + pwrpriv->change_rfpwrstate = rf_off; + pwrpriv->brfoffbyhw = _TRUE; + padapter->bCardDisableWOHSM = _TRUE; + rtw_hw_suspend(padapter ); + } + else + { + pwrpriv->change_rfpwrstate = rf_on; + rtw_hw_resume(padapter ); + } + DBG_8192C("current rf_pwrstate(%s)\n",(pwrpriv->rf_pwrstate == rf_off)?"rf_off":"rf_on"); + } + } + pwrpriv->pwr_state_check_cnts ++; + } +#endif //SUPPORT_HW_RFOFF_DETECTED + + if( pwrpriv->power_mgnt == PS_MODE_ACTIVE ) return; + + if((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts%4)==0)) + { + if ( (check_fwstate(pmlmepriv, _FW_LINKED|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (padapter->bup == _FALSE) + #ifdef CONFIG_P2P + || (pwdinfo->p2p_state != P2P_STATE_NONE) + #endif //CONFIG_P2P + ) + { + return; + } + + DBG_8192C("==>%s .fw_state(%x)\n",__FUNCTION__,get_fwstate(pmlmepriv)); + pwrpriv->change_rfpwrstate = rf_off; + + #ifdef CONFIG_AUTOSUSPEND + if(padapter->registrypriv.usbss_enable) + { + if(padapter->pwrctrlpriv.bHWPwrPindetect) + pwrpriv->bkeepfwalive = _TRUE; + + if(padapter->net_closed == _TRUE) + pwrpriv->ps_flag = _TRUE; + + padapter->bCardDisableWOHSM = _TRUE; + autosuspend_enter(padapter); + } + else if(padapter->pwrctrlpriv.bHWPwrPindetect) + { + } + else + #endif //CONFIG_AUTOSUSPEND + { + #ifdef CONFIG_IPS + ips_enter(padapter); + #endif + } + } + + +} + +void pwr_state_check_handler(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); +#endif //CONFIG_P2P + //DBG_871X("%s\n", __FUNCTION__); + +#ifdef SUPPORT_HW_RFOFF_DETECTED + //DBG_8192C("%s...bHWPwrPindetect(%d)\n",__FUNCTION__,padapter->pwrctrlpriv.bHWPwrPindetect); + if(padapter->pwrctrlpriv.bHWPwrPindetect) + { + rtw_ps_cmd(padapter); + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + } + else +#endif + { + //if(padapter->net_closed == _TRUE) return; + //DBG_8192C("==>%s .fw_state(%x)\n", __FUNCTION__, get_fwstate(pmlmepriv)); + if ( (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, _FW_LINKED|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) || + (padapter->bup == _FALSE) +#ifdef CONFIG_P2P + || (pwdinfo->p2p_state != P2P_STATE_NONE) +#endif //CONFIG_P2P + ) + { + //other pwr ctrl.... + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + } + else + { + if((pwrpriv->rf_pwrstate == rf_on) &&(_FALSE == pwrpriv->bips_processing)) + { + pwrpriv->change_rfpwrstate = rf_off; + pwrctrlpriv->pwr_state_check_cnts = 0; + DBG_8192C("==>pwr_state_check_handler .fw_state(%x)\n",get_fwstate(pmlmepriv)); + rtw_ps_cmd(padapter); + } + + } + } + + + +} +#endif + + +#ifdef CONFIG_LPS +void rtw_set_rpwm(_adapter * padapter, u8 val8) +{ + u8 rpwm; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + +_func_enter_; + + if(pwrpriv->rpwm == val8){ + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("Already set rpwm [%d] ! \n", val8)); + return; + } + + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)){ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_set_rpwm=> bDriverStopped or bSurpriseRemoved \n")); + return; + } + rpwm = val8 |pwrpriv->tog; + + pwrpriv->rpwm = val8; + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_set_rpwm: value = %x\n", rpwm)); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); + + pwrpriv->tog += 0x80; + +_func_exit_; +} + +u8 PS_RDY_CHECK(_adapter * padapter) +{ + u32 curr_time, delta_time; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + curr_time = rtw_get_current_time(); + + delta_time = curr_time -pwrpriv->DelayLPSLastTimeStamp; + + if(delta_time < LPS_DELAY_TIME) + { + return _FALSE; + } + + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) || + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ) + return _FALSE; + + if(_TRUE == pwrpriv->bInSuspend ) + return _FALSE; + + if( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) ) + { + DBG_8192C("Group handshake still in progress !!!\n"); + return _FALSE; + } + + return _TRUE; +} + +void rtw_set_ps_mode(_adapter * padapter, u8 ps_mode, u8 smart_ps) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; +#ifdef CONFIG_P2P + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); +#endif //CONFIG_P2P + +_func_enter_; + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("========= Power Mode is :%d, Smart_PS = %d\n", ps_mode,smart_ps)); + //DBG_8192C("========= Power Mode is :%d, Smart_PS = %d\n", ps_mode,smart_ps); + + if(ps_mode > PM_Card_Disable) { + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("ps_mode:%d error\n", ps_mode)); + return; + } + + if((pwrpriv->pwr_mode == ps_mode) && + (pwrpriv->smart_ps == smart_ps)){ + return; + } + + //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) + if(ps_mode == PS_MODE_ACTIVE) + { +#ifdef CONFIG_P2P + if(pwdinfo->opp_ps == 0) +#endif //CONFIG_P2P + { + DBG_8192C("rtw_set_ps_mode(): Busy Traffic , Leave 802.11 power save..\n"); + pwrpriv->smart_ps = smart_ps; + pwrpriv->pwr_mode = ps_mode; + rtw_set_rpwm(padapter, PS_STATE_S4); + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); + pwrpriv->bFwCurrentInPSMode = _FALSE; + } + } + else + { + if(PS_RDY_CHECK(padapter)) + { + DBG_8192C("rtw_set_ps_mode(): Enter 802.11 power save mode...\n"); + pwrpriv->smart_ps = smart_ps; + pwrpriv->pwr_mode = ps_mode; + pwrpriv->bFwCurrentInPSMode = _TRUE; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); +#ifdef CONFIG_P2P + // Set CTWindow after LPS + if(pwdinfo->opp_ps == 1) + //if(pwdinfo->p2p_ps_enable == _TRUE) + p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0); +#endif //CONFIG_P2P + rtw_set_rpwm(padapter, PS_STATE_S2); + } + //else + //{ + // pwrpriv->pwr_mode = PS_MODE_ACTIVE; + //} + } + +_func_exit_; +} + + +// +// Description: +// Enter the leisure power save mode. +// +void LPS_Enter(PADAPTER padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +_func_enter_; + + //DBG_8192C("LeisurePSEnter()...\n"); + + if ( (check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) || + (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ) + return; + + if(_TRUE == pwrpriv->bInSuspend ) + return ; + + if (pwrpriv->bLeisurePs) + { + // Idle for a while if we connect to AP a while ago. + if(pwrpriv->LpsIdleCount >= 2) // 4 Sec + { + if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) + { + rtw_set_ps_mode(padapter, pwrpriv->power_mgnt, 2); + } + } + else + pwrpriv->LpsIdleCount++; + } + +_func_exit_; +} + + +// +// Description: +// Leave the leisure power save mode. +// +void LPS_Leave(PADAPTER padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + +_func_enter_; + + //DBG_8192C("LeisurePSLeave()...\n"); + + if (pwrpriv->bLeisurePs) + { + if(pwrpriv->pwr_mode != PS_MODE_ACTIVE) + { + rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0); + } + } + +_func_exit_; +} + +#endif + +// +// Description: Leave all power save mode: LPS, FwLPS, IPS if needed. +// Move code to function by tynli. 2010.03.26. +// +void LeaveAllPowerSaveMode(IN PADAPTER Adapter) +{ + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + u32 LPSLeaveTimeOut = 10000; + //u32 IPSLeaveTimeOut = 10000; + +_func_enter_; + + //DBG_8192C("%s.....\n",__FUNCTION__); + if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { //connect +#ifdef CONFIG_P2P + p2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, 0); +#endif //CONFIG_P2P +#ifdef CONFIG_LPS + //DBG_8192C("==> leave LPS.......\n"); + LPS_Leave(Adapter); + + if (Adapter->pwrctrlpriv.bLeisurePs) + { + BOOLEAN bAwake = _TRUE; + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); + while(!bAwake) + { + rtw_usleep_os(100); + LPSLeaveTimeOut--; + if(LPSLeaveTimeOut <= 0) + { + DBG_8192C("Wait for FW LPS leave too long!!! LPSLeaveTimeOut = %d\n", LPSLeaveTimeOut ); + break; + } + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bAwake)); + } + } +#endif + } + else + { + if(Adapter->pwrctrlpriv.rf_pwrstate== rf_off) + { + #ifdef CONFIG_AUTOSUSPEND + if(Adapter->registrypriv.usbss_enable) + { + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + usb_disable_autosuspend(Adapter->dvobjpriv.pusbdev); + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) + Adapter->dvobjpriv.pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user + #endif + } + else + #endif + { + /* + #ifdef CONFIG_IPS + if(_FALSE == ips_leave(Adapter)) + { + DBG_8192C("======> ips_leave fail.............\n"); + } + #endif + */ + } + } + } + +_func_exit_; +} + +#ifdef CONFIG_PWRCTRL + +/* +Caller:ISR handler... + +This will be called when CPWM interrupt is up. + +using to update cpwn of drv; and drv willl make a decision to up or down pwr level +*/ +void cpwm_int_hdl(_adapter *padapter, struct reportpwrstate_parm *preportpwrstate) +{ + struct pwrctrl_priv *pwrpriv = &(padapter->pwrctrlpriv); + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + +_func_enter_; + + if(pwrpriv->cpwm_tog == ((preportpwrstate->state)&0x80)){ + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("cpwm_int_hdl : cpwm_tog = %x this time cpwm=0x%x toggle bit didn't change !!!\n",pwrpriv->cpwm_tog ,preportpwrstate->state)); + goto exit; + } + + _enter_pwrlock(&pwrpriv->lock); + + pwrpriv->cpwm = (preportpwrstate->state)&0xf; + + if(pwrpriv->cpwm >= PS_STATE_S2){ + if(pwrpriv->alives & CMD_ALIVE) + _rtw_up_sema(&(pcmdpriv->cmd_queue_sema)); + + if(pwrpriv->alives & XMIT_ALIVE) + _rtw_up_sema(&(pxmitpriv->xmit_sema)); + } + pwrpriv->cpwm_tog= (preportpwrstate->state)&0x80; + _exit_pwrlock(&pwrpriv->lock); +exit: + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("cpwm_int_hdl : cpwm = %x !!!\n",pwrpriv->cpwm)); + +_func_exit_; + +} + + +__inline static void register_task_alive(struct pwrctrl_priv *pwrctrl, uint tag) +{ +_func_enter_; + pwrctrl->alives |= tag; +_func_exit_; +} + +__inline static void unregister_task_alive(struct pwrctrl_priv *pwrctrl, uint tag) +{ +_func_enter_; + + if (pwrctrl->alives & tag) + pwrctrl->alives ^= tag; + +_func_exit_; +} +#endif + +#ifdef CONFIG_RESUME_IN_WORKQUEUE +static void resume_workitem_callback(struct work_struct *work); +#endif //CONFIG_RESUME_IN_WORKQUEUE + +void rtw_init_pwrctrl_priv(_adapter *padapter) +{ + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + +_func_enter_; + +#ifdef PLATFORM_WINDOWS + pwrctrlpriv->pnp_current_pwr_state=NdisDeviceStateD0; +#endif + + _init_pwrlock(&pwrctrlpriv->lock); + pwrctrlpriv->rf_pwrstate = rf_on; + pwrctrlpriv->ips_enter_cnts=0; + pwrctrlpriv->ips_leave_cnts=0; + + pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode; + pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode; + + pwrctrlpriv->pwr_state_check_interval = 2000; + pwrctrlpriv->pwr_state_check_cnts = 0; + pwrctrlpriv->bInternalAutoSuspend = _FALSE; + pwrctrlpriv->bInSuspend = _FALSE; + pwrctrlpriv->bkeepfwalive = _FALSE; + +#ifdef CONFIG_AUTOSUSPEND +#ifdef SUPPORT_HW_RFOFF_DETECTED + pwrctrlpriv->pwr_state_check_interval = (pwrctrlpriv->bHWPwrPindetect) ?1000:2000; +#endif +#endif + + pwrctrlpriv->LpsIdleCount = 0; + //pwrctrlpriv->FWCtrlPSMode =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; + pwrctrlpriv->power_mgnt =padapter->registrypriv.power_mgnt;// PS_MODE_MIN; + pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE; + + pwrctrlpriv->bFwCurrentInPSMode = _FALSE; + + pwrctrlpriv->cpwm = PS_STATE_S4; + + pwrctrlpriv->pwr_mode = PS_MODE_ACTIVE; + + + pwrctrlpriv->smart_ps = 0; + + pwrctrlpriv->tog = 0x80; + +#ifdef PLATFORM_LINUX + _init_timer(&(pwrctrlpriv->pwr_state_check_timer), padapter->pnetdev, pwr_state_check_handler, (u8 *)padapter); +#endif + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + _init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL); + pwrctrlpriv->rtw_workqueue = create_singlethread_workqueue("rtw_workqueue"); + #endif //CONFIG_RESUME_IN_WORKQUEUE + + #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) + pwrctrlpriv->early_suspend.suspend = NULL; + rtw_register_early_suspend(pwrctrlpriv); + #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER + + +_func_exit_; + +} + + +void rtw_free_pwrctrl_priv(_adapter *adapter) +{ + struct pwrctrl_priv *pwrctrlpriv = &adapter->pwrctrlpriv; + +_func_enter_; + + //_rtw_memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv)); + + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + if (pwrctrlpriv->rtw_workqueue) { + flush_workqueue(pwrctrlpriv->rtw_workqueue); + destroy_workqueue(pwrctrlpriv->rtw_workqueue); + } + #endif + + + #if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) + rtw_unregister_early_suspend(pwrctrlpriv); + #endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER + + _free_pwrlock(&pwrctrlpriv->lock); + +_func_exit_; +} + + +/* +Caller: rtw_xmit_thread + +Check if the fw_pwrstate is okay for xmit. +If not (cpwm is less than P1 state), then the sub-routine +will raise the cpwm to be greater than or equal to P1. + +Calling Context: Passive + +Return Value: + +_SUCCESS: rtw_xmit_thread can write fifo/txcmd afterwards. +_FAIL: rtw_xmit_thread can not do anything. +*/ +sint rtw_register_tx_alive(_adapter *padapter) +{ + uint res = _SUCCESS; + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, XMIT_ALIVE); + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_tx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + if(pwrctrl->cpwm < PS_STATE_S2){ + rtw_set_rpwm(padapter, PS_STATE_S3); + res = _FAIL; + } + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /* CONFIG_PWRCTRL */ + + return res; + +} + +/* +Caller: rtw_cmd_thread + +Check if the fw_pwrstate is okay for issuing cmd. +If not (cpwm should be is less than P2 state), then the sub-routine +will raise the cpwm to be greater than or equal to P2. + +Calling Context: Passive + +Return Value: + +_SUCCESS: rtw_cmd_thread can issue cmds to firmware afterwards. +_FAIL: rtw_cmd_thread can not do anything. +*/ +sint rtw_register_cmd_alive(_adapter *padapter) +{ + uint res = _SUCCESS; + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, CMD_ALIVE); + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_cmd_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + if(pwrctrl->cpwm < PS_STATE_S2){ + rtw_set_rpwm(padapter, PS_STATE_S3); + res = _FAIL; + } + + _exit_pwrlock(&pwrctrl->lock); +_func_exit_; +#endif + + return res; +} + + +/* +Caller: rx_isr + +Calling Context: Dispatch/ISR + +Return Value: + +*/ +sint rtw_register_rx_alive(_adapter *padapter) +{ + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, RECV_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_register_rx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ + + return _SUCCESS; +} + + +/* +Caller: evt_isr or evt_thread + +Calling Context: Dispatch/ISR or Passive + +Return Value: +*/ +sint rtw_register_evt_alive(_adapter *padapter) +{ + +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + register_task_alive(pwrctrl, EVT_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_info_,("rtw_register_evt_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ + + return _SUCCESS; +} + + +/* +Caller: ISR + +If ISR's txdone, +No more pkts for TX, +Then driver shall call this fun. to power down firmware again. +*/ + +void rtw_unregister_tx_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, XMIT_ALIVE); + + if((pwrctrl->cpwm > PS_STATE_S2) && (pwrctrl->pwr_mode > PS_MODE_ACTIVE)){ + if(pwrctrl->alives == 0){ + rtw_set_rpwm(padapter, PS_STATE_S0); + } + } + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_tx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ +} + +/* +Caller: ISR + +If ISR's txdone, +No more pkts for TX, +Then driver shall call this fun. to power down firmware again. +*/ + +void rtw_unregister_cmd_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, CMD_ALIVE); + + if((pwrctrl->cpwm > PS_STATE_S2) && (pwrctrl->pwr_mode > PS_MODE_ACTIVE)){ + if((pwrctrl->alives == 0)&&(check_fwstate(&padapter->mlmepriv, _FW_UNDER_LINKING)!=_TRUE)){ + rtw_set_rpwm(padapter, PS_STATE_S0); + } + } + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_cmd_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ +} + + +/* + +Caller: ISR + +*/ +void rtw_unregister_rx_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, RECV_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_rx_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif +} + + +void rtw_unregister_evt_alive(_adapter *padapter) +{ +#ifdef CONFIG_PWRCTRL + + struct pwrctrl_priv *pwrctrl = &padapter->pwrctrlpriv; + +_func_enter_; + + _enter_pwrlock(&pwrctrl->lock); + + unregister_task_alive(pwrctrl, EVT_ALIVE); + + RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("rtw_unregister_evt_alive: cpwm:%d alives:%x\n", pwrctrl->cpwm, pwrctrl->alives)); + + _exit_pwrlock(&pwrctrl->lock); + +_func_exit_; + +#endif /*CONFIG_PWRCTRL*/ +} + +#ifdef CONFIG_RESUME_IN_WORKQUEUE +#ifdef CONFIG_USB_HCI +extern int rtw_resume_process(struct usb_interface *pusb_intf); +#endif +static void resume_workitem_callback(struct work_struct *work) +{ + struct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, resume_work); + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + + DBG_871X("%s\n",__FUNCTION__); + + #ifdef CONFIG_USB_HCI + rtw_resume_process(adapter->dvobjpriv.pusbintf); + #elif defined(CONFIG_PCI_HCI) + #endif + +} + +void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv) +{ + // accquire system's suspend lock preventing from falliing asleep while resume in workqueue + rtw_lock_suspend(); + + #if 1 + queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work); + #else + _set_workitem(&pwrpriv->resume_work); + #endif +} +#endif //CONFIG_RESUME_IN_WORKQUEUE + +#ifdef CONFIG_HAS_EARLYSUSPEND +#ifdef CONFIG_USB_HCI +extern int rtw_resume_process(struct usb_interface *pusb_intf); +#endif +static void rtw_early_suspend(struct early_suspend *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + DBG_871X("%s\n",__FUNCTION__); + + //jeff: do nothing but set do_late_resume to false + pwrpriv->do_late_resume = _FALSE; +} + +static void rtw_late_resume(struct early_suspend *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + + DBG_871X("%s\n",__FUNCTION__); + if(pwrpriv->do_late_resume) { + #ifdef CONFIG_USB_HCI + rtw_resume_process(adapter->dvobjpriv.pusbintf); + pwrpriv->do_late_resume = _FALSE; + #elif defined(CONFIG_PCI_HCI) + #endif + } +} + +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) +{ + DBG_871X("%s\n", __FUNCTION__); + + //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit + pwrpriv->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; + pwrpriv->early_suspend.suspend = rtw_early_suspend; + pwrpriv->early_suspend.resume = rtw_late_resume; + register_early_suspend(&pwrpriv->early_suspend); + + +} + +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) +{ + DBG_871X("%s\n", __FUNCTION__); + + if (pwrpriv->early_suspend.suspend) + unregister_early_suspend(&pwrpriv->early_suspend); + + pwrpriv->early_suspend.suspend = NULL; + pwrpriv->early_suspend.resume = NULL; +} +#endif //CONFIG_HAS_EARLYSUSPEND + +#ifdef CONFIG_ANDROID_POWER +#ifdef CONFIG_USB_HCI +extern int rtw_resume_process(struct usb_interface *pusb_intf); +#endif +static void rtw_early_suspend(android_early_suspend_t *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + DBG_871X("%s\n",__FUNCTION__); + + //jeff: do nothing but set do_late_resume to false + pwrpriv->do_late_resume = _FALSE; +} + +static void rtw_late_resume(android_early_suspend_t *h) +{ + struct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend); + _adapter *adapter = container_of(pwrpriv, _adapter, pwrctrlpriv); + + DBG_871X("%s\n",__FUNCTION__); + if(pwrpriv->do_late_resume) { + #ifdef CONFIG_USB_HCI + rtw_resume_process(adapter->dvobjpriv.pusbintf); + pwrpriv->do_late_resume = _FALSE; + #elif defined(CONFIG_PCI_HCI) + #endif + } +} + +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv) +{ + DBG_871X("%s\n", __FUNCTION__); + + //jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit + pwrpriv->early_suspend.level = ANDROID_EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20; + pwrpriv->early_suspend.suspend = rtw_early_suspend; + pwrpriv->early_suspend.resume = rtw_late_resume; + android_register_early_suspend(&pwrpriv->early_suspend); +} + +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv) +{ + DBG_871X("%s\n", __FUNCTION__); + + if (pwrpriv->early_suspend.suspend) + android_unregister_early_suspend(&pwrpriv->early_suspend); + + pwrpriv->early_suspend.suspend = NULL; + pwrpriv->early_suspend.resume = NULL; +} +#endif //CONFIG_ANDROID_POWER + +u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val) +{ + u8 bResult = _TRUE; + if(padapter->HalFunc.interface_ps_func) + { + bResult = padapter->HalFunc.interface_ps_func(padapter,efunc_id,val); + } + return bResult; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_recv.c b/drivers/net/wireless/rtl8192c/core/rtw_recv.c new file mode 100755 index 000000000000..47e6b2f46238 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_recv.c @@ -0,0 +1,4440 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_RECV_C_ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_USB_HCI +#include +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include +#include + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS +static RTW_DECLARE_TIMER_HDL(signal_stat); +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + +void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv) +{ + + +_func_enter_; + + _rtw_memset((u8 *)psta_recvpriv, 0, sizeof (struct sta_recv_priv)); + + _rtw_spinlock_init(&psta_recvpriv->lock); + + //for(i=0; iblk_strms[i]); + + _rtw_init_queue(&psta_recvpriv->defrag_q); + +_func_exit_; + +} + +sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter) +{ + sint i; + + union recv_frame *precvframe; + + sint res=_SUCCESS; + +_func_enter_; + + _rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct recv_priv)); + + _rtw_spinlock_init(&precvpriv->lock); + + _rtw_init_queue(&precvpriv->free_recv_queue); + _rtw_init_queue(&precvpriv->recv_pending_queue); + + precvpriv->adapter = padapter; + + precvpriv->free_recvframe_cnt = NR_RECVFRAME; + + rtw_os_recv_resource_init(precvpriv, padapter); + + precvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); + + if(precvpriv->pallocated_frame_buf==NULL){ + res= _FAIL; + goto exit; + } + //_rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); + + precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ); + //precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ - + // ((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1)); + + precvframe = (union recv_frame*) precvpriv->precv_frame_buf; + + + for(i=0; i < NR_RECVFRAME ; i++) + { + _rtw_init_listhead(&(precvframe->u.list)); + + rtw_list_insert_tail(&(precvframe->u.list), &(precvpriv->free_recv_queue.queue)); + + res = rtw_os_recv_resource_alloc(padapter, precvframe); + + precvframe->u.hdr.adapter =padapter; + precvframe++; + + } + +#ifdef CONFIG_USB_HCI + + precvpriv->rx_pending_cnt=1; + + _rtw_init_sema(&precvpriv->allrxreturnevt, 0); + +#endif + + res = padapter->HalFunc.init_recv_priv(padapter); + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + #ifdef PLATFORM_LINUX + _init_timer(&precvpriv->signal_stat_timer, padapter->pnetdev, RTW_TIMER_HDL_NAME(signal_stat), padapter); + #elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS) + _init_timer(&precvpriv->signal_stat_timer, padapter->hndis_adapter, RTW_TIMER_HDL_NAME(signal_stat), padapter); + #endif + + precvpriv->signal_stat_sampling_interval = 1000; //ms + //precvpriv->signal_stat_converging_constant = 5000; //ms + + rtw_set_signal_stat_timer(precvpriv); +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + +exit: + +_func_exit_; + + return res; + +} + +void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv) +{ + _rtw_spinlock_free(&precvpriv->lock); +#ifdef CONFIG_RECV_THREAD_MODE + _rtw_free_sema(&precvpriv->recv_sema); + _rtw_free_sema(&precvpriv->terminate_recvthread_sema); +#endif + + _rtw_spinlock_free(&precvpriv->free_recv_queue.lock); + _rtw_spinlock_free(&precvpriv->recv_pending_queue.lock); + + _rtw_spinlock_free(&precvpriv->free_recv_buf_queue.lock); + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + _rtw_spinlock_free(&precvpriv->recv_buf_pending_queue.lock); +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX +} + +void _rtw_free_recv_priv (struct recv_priv *precvpriv) +{ + _adapter *padapter = precvpriv->adapter; + +_func_enter_; + + rtw_mfree_recv_priv_lock(precvpriv); + + rtw_os_recv_resource_free(precvpriv); + + if(precvpriv->pallocated_frame_buf) { + rtw_vmfree(precvpriv->pallocated_frame_buf, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); + } + + padapter->HalFunc.free_recv_priv(padapter); + +_func_exit_; + +} + +union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue) +{ + _irqL irqL; + union recv_frame *precvframe; + _list *plist, *phead; + _adapter *padapter; + struct recv_priv *precvpriv; +_func_enter_; + + _enter_critical_bh(&pfree_recv_queue->lock, &irqL); + + if(_rtw_queue_empty(pfree_recv_queue) == _TRUE) + { + precvframe = NULL; + } + else + { + phead = get_list_head(pfree_recv_queue); + + plist = get_next(phead); + + precvframe = LIST_CONTAINOR(plist, union recv_frame, u); + + rtw_list_delete(&precvframe->u.hdr.list); + padapter=precvframe->u.hdr.adapter; + if(padapter !=NULL){ + precvpriv=&padapter->recvpriv; + if(pfree_recv_queue == &precvpriv->free_recv_queue) + precvpriv->free_recvframe_cnt--; + } + } + + _exit_critical_bh(&pfree_recv_queue->lock, &irqL); + +_func_exit_; + + return precvframe; + +} + + +void rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpriv) +{ + struct recv_buf *precvbuf = precvframe->u.hdr.precvbuf; + + /* Perry: This can be removed */ + _rtw_init_listhead(&precvframe->u.hdr.list); + + precvframe->u.hdr.len=0; + + +} + + +int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue) +{ + _irqL irqL; + _adapter *padapter=precvframe->u.hdr.adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + +_func_enter_; + + +#ifdef PLATFORM_WINDOWS + rtw_os_read_port(padapter, precvframe->u.hdr.precvbuf); +#endif + +#ifdef PLATFORM_LINUX + + if(precvframe->u.hdr.pkt) + { + dev_kfree_skb_any(precvframe->u.hdr.pkt);//free skb by driver + precvframe->u.hdr.pkt = NULL; + } + +#ifdef CONFIG_SDIO_HCI +{ + _irqL irql; + struct recv_buf *precvbuf=precvframe->u.hdr.precvbuf; + if(precvbuf !=NULL){ + _enter_critical_bh(&precvbuf->recvbuf_lock, &irql); + + precvbuf->ref_cnt--; + if(precvbuf->ref_cnt == 0 ){ + _enter_critical_bh(&precvpriv->free_recv_buf_queue.lock, &irqL); + rtw_list_delete(&(precvbuf->list)); + rtw_list_insert_tail(&(precvbuf->list), get_list_head(&precvpriv->free_recv_buf_queue)); + precvpriv->free_recv_buf_queue_cnt++; + _exit_critical_bh(&precvpriv->free_recv_buf_queue.lock, &irqL); + RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("rtw_os_read_port: precvbuf=0x%p enqueue:precvpriv->free_recv_buf_queue_cnt=%d\n",precvbuf,precvpriv->free_recv_buf_queue_cnt)); + } + RT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,("rtw_os_read_port: precvbuf=0x%p enqueue:precvpriv->free_recv_buf_queue_cnt=%d\n",precvbuf,precvpriv->free_recv_buf_queue_cnt)); + _exit_critical_bh(&precvbuf->recvbuf_lock, &irql); + } +} +#endif +#endif + + _enter_critical_bh(&pfree_recv_queue->lock, &irqL); + + rtw_list_delete(&(precvframe->u.hdr.list)); + + rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(pfree_recv_queue)); + + if(padapter !=NULL){ + if(pfree_recv_queue == &precvpriv->free_recv_queue) + precvpriv->free_recvframe_cnt++; + } + + _exit_critical_bh(&pfree_recv_queue->lock, &irqL); + +_func_exit_; + + return _SUCCESS; + +} + + +union recv_frame *rtw_dequeue_recvframe (_queue *queue) +{ + return rtw_alloc_recvframe(queue); +} + + +sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) +{ + _irqL irqL; + _adapter *padapter=precvframe->u.hdr.adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + +_func_enter_; + + + //_spinlock(&pfree_recv_queue->lock); + _enter_critical_bh(&queue->lock, &irqL); + + //_rtw_init_listhead(&(precvframe->u.hdr.list)); + rtw_list_delete(&(precvframe->u.hdr.list)); + + + rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(queue)); + + if (padapter != NULL) { + if (queue == &precvpriv->free_recv_queue) + precvpriv->free_recvframe_cnt++; + } + + //_rtw_spinunlock(&pfree_recv_queue->lock); + _exit_critical_bh(&queue->lock, &irqL); + + +_func_exit_; + + return _SUCCESS; +} + +/* +sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue) +{ + return rtw_free_recvframe(precvframe, queue); +} +*/ + + + + +/* +caller : defrag ; recvframe_chk_defrag in recv_thread (passive) +pframequeue: defrag_queue : will be accessed in recv_thread (passive) + +using spinlock to protect + +*/ + +void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue) +{ + union recv_frame *precvframe; + _list *plist, *phead; + +_func_enter_; + _rtw_spinlock(&pframequeue->lock); + + phead = get_list_head(pframequeue); + plist = get_next(phead); + + while(rtw_end_of_queue_search(phead, plist) == _FALSE) + { + precvframe = LIST_CONTAINOR(plist, union recv_frame, u); + + plist = get_next(plist); + + //rtw_list_delete(&precvframe->u.hdr.list); // will do this in rtw_free_recvframe() + + rtw_free_recvframe(precvframe, pfree_recv_queue); + } + + _rtw_spinunlock(&pframequeue->lock); + +_func_exit_; + +} + +sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue) +{ + _irqL irqL; + + _enter_critical(&queue->lock, &irqL); + + rtw_list_delete(&precvbuf->list); + + rtw_list_insert_tail(&precvbuf->list, get_list_head(queue)); + + _exit_critical(&queue->lock, &irqL); + + + return _SUCCESS; + +} + +struct recv_buf *rtw_dequeue_recvbuf (_queue *queue) +{ + _irqL irqL; + struct recv_buf *precvbuf; + _list *plist, *phead; + + _enter_critical(&queue->lock, &irqL); + + if(_rtw_queue_empty(queue) == _TRUE) + { + precvbuf = NULL; + } + else + { + phead = get_list_head(queue); + + plist = get_next(phead); + + precvbuf = LIST_CONTAINOR(plist, struct recv_buf, list); + + rtw_list_delete(&precvbuf->list); + + } + + _exit_critical(&queue->lock, &irqL); + + + return precvbuf; + +} + +static sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe){ + + sint i,res=_SUCCESS; + u32 datalen; + u8 miccode[8]; + u8 bmic_err=_FALSE,brpt_micerror = _TRUE; + u8 *pframe, *payload,*pframemic; + u8 *mickey,*iv,rxdata_key_idx; + struct sta_info *stainfo; + struct rx_pkt_attrib *prxattrib=&precvframe->u.hdr.attrib; + struct security_priv *psecuritypriv=&adapter->securitypriv; + + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +_func_enter_; + + stainfo=rtw_get_stainfo(&adapter->stapriv ,&prxattrib->ta[0]); + + if(prxattrib->encrypt ==_TKIP_) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:prxattrib->encrypt ==_TKIP_\n")); + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic:da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5])); + + //calculate mic code + if(stainfo!= NULL) + { + if(IS_MCAST(prxattrib->ra)) + { + //mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0]; + //iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen; + //rxdata_key_idx =( ((iv[3])>>6)&0x3) ; + mickey=&psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0]; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n recvframe_chkmic: bcmc key \n")); + //DBG_8192C("\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\n", + // psecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx); + + if(psecuritypriv->binstallGrpkey==_FALSE) + { + res=_FAIL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n")); + DBG_8192C("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n"); + goto exit; + } + } + else{ + mickey=&stainfo->dot11tkiprxmickey.skey[0]; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n recvframe_chkmic: unicast key \n")); + } + + datalen=precvframe->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len-prxattrib->icv_len-8;//icv_len included the mic code + pframe=precvframe->u.hdr.rx_data; + payload=pframe+prxattrib->hdrlen+prxattrib->iv_len; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n",prxattrib->iv_len,prxattrib->icv_len)); + + //rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data + + rtw_seccalctkipmic(mickey,pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data + + pframemic=payload+datalen; + + bmic_err=_FALSE; + + for(i=0;i<8;i++){ + if(miccode[i] != *(pframemic+i)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x) ",i,miccode[i],i,*(pframemic+i))); + bmic_err=_TRUE; + } + } + + + if(bmic_err==_TRUE){ + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + *(pframemic-8),*(pframemic-7),*(pframemic-6),*(pframemic-5),*(pframemic-4),*(pframemic-3),*(pframemic-2),*(pframemic-1))); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", + *(pframemic-16),*(pframemic-15),*(pframemic-14),*(pframemic-13),*(pframemic-12),*(pframemic-11),*(pframemic-10),*(pframemic-9))); + + { + uint i; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet (len=%d)======\n",precvframe->u.hdr.len)); + for(i=0;iu.hdr.len;i=i+8){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x", + *(precvframe->u.hdr.rx_data+i),*(precvframe->u.hdr.rx_data+i+1), + *(precvframe->u.hdr.rx_data+i+2),*(precvframe->u.hdr.rx_data+i+3), + *(precvframe->u.hdr.rx_data+i+4),*(precvframe->u.hdr.rx_data+i+5), + *(precvframe->u.hdr.rx_data+i+6),*(precvframe->u.hdr.rx_data+i+7))); + } + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ======demp packet end [len=%d]======\n",precvframe->u.hdr.len)); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n hrdlen=%d, \n",prxattrib->hdrlen)); + } + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d ", + prxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2], + prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5],psecuritypriv->binstallGrpkey)); + + // double check key_index for some timing issue , + // cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue + if((IS_MCAST(prxattrib->ra)==_TRUE) && (prxattrib->key_index != pmlmeinfo->key_index )) + brpt_micerror = _FALSE; + + if((prxattrib->bdecrypted ==_TRUE)&& (brpt_micerror == _TRUE)) + { + rtw_handle_tkip_mic_err(adapter,(u8)IS_MCAST(prxattrib->ra)); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); + DBG_8192C(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" mic error :prxattrib->bdecrypted=%d ",prxattrib->bdecrypted)); + DBG_8192C(" mic error :prxattrib->bdecrypted=%d\n",prxattrib->bdecrypted); + } + + res=_FAIL; + + } + else{ + //mic checked ok + if((psecuritypriv->bcheck_grpkey ==_FALSE)&&(IS_MCAST(prxattrib->ra)==_TRUE)){ + psecuritypriv->bcheck_grpkey =_TRUE; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->bcheck_grpkey =_TRUE")); + } + } + + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic: rtw_get_stainfo==NULL!!!\n")); + } + + recvframe_pull_tail(precvframe, 8); + + } + +exit: + +_func_exit_; + + return res; + +} + +//decrypt and set the ivlen,icvlen of the recv_frame +static union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame) +{ + + struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + union recv_frame *return_packet=precv_frame; + +_func_enter_; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt)); + + if(prxattrib->encrypt>0) + { + u8 *iv = precv_frame->u.hdr.rx_data+prxattrib->hdrlen; + prxattrib->key_index = ( ((iv[3])>>6)&0x3) ; + + if(prxattrib->key_index > WEP_KEYS) + { + DBG_871X("prxattrib->key_index(%d) > WEP_KEYS \n", prxattrib->key_index); + + switch(prxattrib->encrypt){ + case _WEP40_: + case _WEP104_: + prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex; + break; + case _TKIP_: + case _AES_: + default: + prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid; + break; + } + } + } + + if((prxattrib->encrypt>0) && ((prxattrib->bdecrypted==0) ||(psecuritypriv->sw_decrypt==_TRUE))) + { + psecuritypriv->hw_decrypted=_FALSE; + + #ifdef DBG_RX_DECRYPTOR + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n" + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); + #endif + + switch(prxattrib->encrypt){ + case _WEP40_: + case _WEP104_: + rtw_wep_decrypt(padapter, (u8 *)precv_frame); + break; + case _TKIP_: + rtw_tkip_decrypt(padapter, (u8 *)precv_frame); + break; + case _AES_: + rtw_aes_decrypt(padapter, (u8 * )precv_frame); + break; + default: + break; + } + } + else if(prxattrib->bdecrypted==1 + && prxattrib->encrypt >0 + && (psecuritypriv->busetkipkey==1 || prxattrib->encrypt !=_TKIP_ ) + ) + { +#if 0 + if((prxstat->icv==1)&&(prxattrib->encrypt!=_AES_)) + { + psecuritypriv->hw_decrypted=_FALSE; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("psecuritypriv->hw_decrypted=_FALSE")); + + rtw_free_recvframe(precv_frame, &padapter->recvpriv.free_recv_queue); + + return_packet=NULL; + + } + else +#endif + { + psecuritypriv->hw_decrypted=_TRUE; + #ifdef DBG_RX_DECRYPTOR + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n" + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); + #endif + + } + } + else { + #ifdef DBG_RX_DECRYPTOR + DBG_871X("prxstat->bdecrypted:%d, prxattrib->encrypt:%d, psecuritypriv->hw_decrypted:%d\n" + , prxattrib->bdecrypted ,prxattrib->encrypt, psecuritypriv->hw_decrypted); + #endif + } + + //recvframe_chkmic(adapter, precv_frame); //move to recvframme_defrag function + +_func_exit_; + + return return_packet; + +} +//###set the security information in the recv_frame +static union recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame) +{ + u8 *psta_addr,*ptr; + uint auth_alg; + struct recv_frame_hdr *pfhdr; + struct sta_info * psta; + struct sta_priv *pstapriv ; + union recv_frame * prtnframe; + u16 ether_type=0; + u16 eapol_type = 0x888e;//for Funia BD's WPA issue + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + +_func_enter_; + + pstapriv = &adapter->stapriv; + ptr = get_recvframe_data(precv_frame); + pfhdr = &precv_frame->u.hdr; + psta_addr = pfhdr->attrib.ta; + psta = rtw_get_stainfo(pstapriv, psta_addr); + + auth_alg = adapter->securitypriv.dot11AuthAlgrthm; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:adapter->securitypriv.dot11AuthAlgrthm= 0x%d\n",adapter->securitypriv.dot11AuthAlgrthm)); + + if(auth_alg==2) + { + if ((psta!=NULL) && (psta->ieee8021x_blocked)) + { + //blocked + //only accept EAPOL frame + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==1\n")); + + prtnframe=precv_frame; + + //get ether_type + ptr=ptr+pfhdr->attrib.hdrlen+pfhdr->attrib.iv_len+LLC_HEADER_SIZE; + _rtw_memcpy(ðer_type,ptr, 2); + ether_type= ntohs((unsigned short )ether_type); + + if (ether_type == eapol_type) { + prtnframe=precv_frame; + } + else { + //free this frame + rtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue); + prtnframe=NULL; + } + } + else + { + //allowed + //check decryption status, and decrypt the frame if needed + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("########portctrl:psta->ieee8021x_blocked==0\n")); + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:precv_frame->hdr.attrib.privacy=%x\n",precv_frame->u.hdr.attrib.privacy)); + + if(pattrib->bdecrypted==0) + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("portctrl:prxstat->decrypted=%x\n", pattrib->bdecrypted)); + + prtnframe=precv_frame; + //check is the EAPOL frame or not (Rekey) + if(ether_type == eapol_type){ + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type == 0x888e\n")); + //check Rekey + + prtnframe=precv_frame; + } + else{ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("########portctrl:ether_type = 0x%.4x\n",ether_type)); + } + } + } + else + { + prtnframe=precv_frame; + } + +_func_exit_; + + return prtnframe; + +} + +static sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache) +{ + sint tid = precv_frame->u.hdr.attrib.priority; + + u16 seq_ctrl = ( (precv_frame->u.hdr.attrib.seq_num&0xffff) << 4) | + (precv_frame->u.hdr.attrib.frag_num & 0xf); + +_func_enter_; + + if(tid>15) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, (tid>15)! seq_ctrl=0x%x, tid=0x%x\n", seq_ctrl, tid)); + + return _FAIL; + } + + if(1)//if(bretry) + { + if(seq_ctrl == prxcache->tid_rxseq[tid]) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_decache, seq_ctrl=0x%x, tid=0x%x, tid_rxseq=0x%x\n", seq_ctrl, tid, prxcache->tid_rxseq[tid])); + + return _FAIL; + } + } + + prxcache->tid_rxseq[tid] = seq_ctrl; + +_func_exit_; + + return _SUCCESS; + +} + +static void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + unsigned char pwrbit; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta=NULL; + + psta = rtw_get_stainfo(pstapriv, pattrib->src); + + pwrbit = GetPwrMgt(ptr); + + if(psta) + { + if(pwrbit) + { + psta->state |= WIFI_SLEEP_STATE; + pstapriv->sta_dz_bitmap |= BIT(psta->aid); + //DBG_871X("to sleep, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); + } + else + { + if(psta->state & WIFI_SLEEP_STATE) + { + psta->state ^= WIFI_SLEEP_STATE; + + pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); + + //DBG_871X("to wakeup, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); + wakeup_sta_to_xmit(padapter, psta); + + } + } + + } + +#endif +} + +static void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta=NULL; + + psta = rtw_get_stainfo(pstapriv, pattrib->src); + + if(!psta) return; + + if(!psta->qos_option) + return; + + if(!(psta->qos_info&0xf)) + return; + + + if(psta->state&WIFI_SLEEP_STATE) + { + u8 wmmps_ac=0; + + switch(pattrib->priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(1); + break; + } + + if(wmmps_ac) + { + if(psta->sleepq_ac_len>0) + { + //process received triggered frame + xmit_delivery_enabled_frames(padapter, psta); + } + else + { + //issue one qos null frame with More data bit = 0 and the EOSP bit set (=1) + issue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority); + } + } + + } + + +#endif + +} + +#ifdef CONFIG_TDLS +sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + u8 *psa, *pmyid; + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct security_priv *psecuritypriv = &adapter->securitypriv; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *pdialog , *prsnie, *ppairwise_cipher; + u8 i, k, pairwise_count; + u8 ccmp_have=0, rsnie_have=0; + u16 j; + u8 SNonce[32]; + u32 *timeout_interval; + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE = 5; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + pmyid=myid(&(adapter->eeprompriv)); + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + if(ptdls_sta==NULL ||(ptdls_sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE) + { + if(ptdls_sta==NULL){ + ptdls_sta = rtw_alloc_stainfo(pstapriv, psa); + }else{ + //If the direct link is already set up + //Process as re-setup after tear down + DBG_8192C("re-setup a direct link\n"); + } + + if(ptdls_sta) + { + //copy dialog token + pdialog=ptr+2; + //rx_pkt_pattrib->frag_num is used to fill dialog token + _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + rsnie_have=1; + if(prx_pkt_attrib->encrypt){ + prsnie=(u8*)pIE; + //check whether initiator STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 1); + for(k=0;kstat_code=72; + } + } + break; + case _EXT_CAP_IE_: + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + if(prx_pkt_attrib->encrypt) + _rtw_memcpy(SNonce, (ptr+j+52), 32); + break; + case _TIMEOUT_ITVL_IE_: + if(prx_pkt_attrib->encrypt) + timeout_interval = (u32 *)(ptr+j+3); + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //check status code + //if responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject + if((rsnie_have && (prx_pkt_attrib->encrypt))|| + (rsnie_have==0 && (prx_pkt_attrib->encrypt==0))){ + ptdls_sta->stat_code=0; + }else if(rsnie_have && (prx_pkt_attrib->encrypt==0)){ + //security disabled + ptdls_sta->stat_code=5; + }else if(rsnie_have==0 && (prx_pkt_attrib->encrypt)){ + //request haven't RSNIE + ptdls_sta->stat_code=38; + } + + ptdls_sta->state|= TDLS_INITIATOR_STATE; + ptdls_sta->aid=*(pdialog); + if(prx_pkt_attrib->encrypt){ + _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32); + _rtw_memcpy(&(ptdls_sta->TDLS_PeerKey_Lifetime), timeout_interval, 4); + } + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt++; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + } + else + { + goto _exit_recv_tdls_frame; + } + } + //already receiving TDLS setup request + else if(ptdls_sta->state==TDLS_INITIATOR_STATE){ + DBG_8192C("receive duplicated TDLS setup request frame in handshaking\n"); + goto _exit_recv_tdls_frame; + } + //When receiving and sending setup_req to the same link at the same time, STA with higher MAC_addr would be initiator + //following is to check out MAC_addr + else if(ptdls_sta->state==TDLS_RESPONDER_STATE){ + DBG_8192C("receive setup_req after sending setUP_req\n"); + for (i=0;i<6;i++){ + if(*(pmyid+i)==*(psa+i)){ + } + else if(*(pmyid+i)>*(psa+i)){ + goto _exit_recv_tdls_frame; + }else if(*(pmyid+i)<*(psa+i)){ + ptdls_sta->state=TDLS_INITIATOR_STATE; + ptdls_sta->aid=*(pdialog); + break; + } + } + } + + issue_tdls_setup_rsp(adapter, precv_frame); + +_exit_recv_tdls_frame: + + return _FAIL; +} + + +sint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa, *pdialog; + u16 stat_code; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + sint parsing_length; //frame body length, without icv_len + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =7; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 pairwise_count, j, k; + u8 verify_ccmp=0; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + _rtw_memcpy(&stat_code, ptr+2, 2); + + pdialog=ptr+4; + //rx_pkt_pattrib->frag_num is used to fill dialog token + _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); + + if(stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _SUPPORTEDRATES_IE_: + break; + case _COUNTRY_IE_: + break; + case _EXT_SUPPORTEDRATES_IE_: + break; + case _SUPPORTED_CH_IE_: + break; + case _RSN_IE_2_: + prsnie=(u8*)pIE; + //check whether responder STA has CCMP pairwise_cipher. + ppairwise_cipher=prsnie+10; + _rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2); + for(k=0;kANonce, (ptr+j+20), 32); + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _RIC_Descriptor_IE_: + break; + case _HT_CAPABILITY_IE_: + break; + case EID_BSSCoexistence: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + if(prx_pkt_attrib->encrypt){ + if(verify_ccmp==1){ + wpa_tdls_generate_tpk(adapter, ptdls_sta); + ptdls_sta->stat_code=0; + } + else{ + ptdls_sta->stat_code=72; //invalide contents of RSNIE + } + }else{ + ptdls_sta->stat_code=0; + } + + if(prx_pkt_attrib->encrypt){ + if(tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: valid + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + rtw_free_stainfo(adapter, ptdls_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + } + DBG_8192C("issue_tdls_setup_cfm\n"); + issue_tdls_setup_cfm(adapter, precv_frame); + + if((ptdls_sta->state&TDLS_RESPONDER_STATE)==TDLS_RESPONDER_STATE) + ptdls_sta->state |= TDLS_LINKED_STATE; + + if(prx_pkt_attrib->encrypt){ + if(ptdls_sta->cam_entry==0){ + ptdls_sta->dot118021XPrivacy=_AES_; + ptdls_sta->cam_entry=pmlmeinfo->tdls_cam_entry_to_write; + if(++pmlmeinfo->tdls_cam_entry_to_write>31) + pmlmeinfo->tdls_cam_entry_to_write=6; + } + rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); + } + + return _FAIL; +} + +sint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + _irqL irqL; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u8 *psa; + u16 stat_code; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =5; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic, *ppairwise_cipher; + u16 j, pairwise_count; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //[+1]: payload type + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + rtw_free_stainfo(adapter, ptdls_sta); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + + if(prx_pkt_attrib->encrypt){ + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _RSN_IE_2_: + prsnie=(u8*)pIE; + break; + case _VENDOR_SPECIFIC_IE_: + break; + case _FTIE_: + pftie=(u8*)pIE; + break; + case _TIMEOUT_ITVL_IE_: + ptimeout_ie=(u8*)pIE; + break; + case _HT_EXTRA_INFO_IE_: + break; + case _LINK_ID_IE_: + plinkid_ie=(u8*)pIE; + break; + default: + break; + } + + j += (pIE->Length + 2); + + } + + //verify mic in FTIE MIC field + if(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie)==0){ //0: Invalid, 1: Valid + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + rtw_free_stainfo(adapter, ptdls_sta); + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + return _FAIL; + } + + } + + pmlmeinfo->tdls_setup_state=TDLS_LINKED_STATE; + if((ptdls_sta->state & TDLS_INITIATOR_STATE)==TDLS_INITIATOR_STATE) + ptdls_sta->state|=TDLS_LINKED_STATE; + + ptdls_sta->option=1; //write RCR DATA BIT + _set_workitem(&ptdls_sta->option_workitem); + + //Write cam + //TDLS encryption(if needed) will always be CCMP + if(prx_pkt_attrib->encrypt){ + if(ptdls_sta->cam_entry==0){ + ptdls_sta->dot118021XPrivacy=_AES_; + ptdls_sta->cam_entry=pmlmeinfo->tdls_cam_entry_to_write; + if(++pmlmeinfo->tdls_cam_entry_to_write>31) + pmlmeinfo->tdls_cam_entry_to_write=6; + } + rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE); + } + + + return _FAIL; +} + +sint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *ptr = precv_frame->u.hdr.rx_data; + u8 *pdialog = NULL; + + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+8+1; + pdialog=ptr+2; + + //check frame contents + + //rx_pkt_pattrib->frag_num is used to fill dialog token + _rtw_memcpy(&(prx_pkt_attrib->frag_num), pdialog, 1); + + issue_tdls_dis_rsp(adapter, precv_frame); + + return _FAIL; + +} + +sint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame) +{ + u8 *psa; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &adapter->stapriv; + struct sta_info *ptdls_sta= NULL; + _irqL irqL; + + psa = get_sa(ptr); + + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + if(ptdls_sta!=NULL){ + + if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ + ptdls_sta->option =3; + _set_workitem(&ptdls_sta->option_workitem); + } + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + pmlmeinfo->tdls_sta_cnt--; + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); + //ready to clear cam + if(ptdls_sta->cam_entry!=0){ + pmlmeinfo->tdls_cam_entry_to_clear=ptdls_sta->cam_entry; + //it will clear cam response to ptdls_sta->cam_entry + rtw_setstakey_cmd(adapter, (u8 *)ptdls_sta, _TRUE); + } + _set_workitem(&pmlmeext->TDLS_restore_workitem); + rtw_free_stainfo(adapter, ptdls_sta); + } + if(pmlmeinfo->tdls_sta_cnt==0) + pmlmeinfo->tdls_setup_state=UN_TDLS_STATE; + + return _FAIL; + +} + +u8 TDLS_check_ch_state(uint state){ + if( (state & TDLS_CH_SWITCH_ON_STATE) && + (state & TDLS_AT_OFF_CH_STATE) && + (state & TDLS_PEER_AT_OFF_STATE) ){ + + if(state & TDLS_PEER_SLEEP_STATE) + return 2; //U-APSD + ch. switch + else + return 1; //ch. switch + }else + return 0; +} + +//we process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here +sint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + //get peer sta infomation + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + u8 wmmps_ac=0, state=TDLS_check_ch_state(ptdls_sta->state); + int i; + ptdls_sta->sta_stats.rx_pkts++; + + //receive peer traffic response frame, sleeping STA wakes up + ptdls_sta->state &= ~(TDLS_PEER_SLEEP_STATE); + + // if noticed peer STA wakes up by receiving peer traffic response + // and we want to do channel swtiching, then we will transmit channel switch request first + if(ptdls_sta->state & TDLS_APSD_CHSW_STATE){ + issue_tdls_ch_switch_req(adapter, pattrib->src); + ptdls_sta->state &= ~(TDLS_APSD_CHSW_STATE); + return _FAIL; + } + + //check 4-AC queue bit + if(ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk) + wmmps_ac=1; + + //if it's a direct link and have buffered frame + if(ptdls_sta->state & TDLS_LINKED_STATE){ + if(wmmps_ac && state) + { + _irqL irqL; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&ptdls_sta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + //transmit buffered frames + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + xmitframe_plist = get_next(xmitframe_plist); + rtw_list_delete(&pxmitframe->list); + + ptdls_sta->sleepq_len--; + if(ptdls_sta->sleepq_len>0){ + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + }else{ + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + //pxmitframe->attrib.triggered = 1; //maybe doesn't need in TDLS + if(adapter->HalFunc.hal_xmit(adapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(adapter, pxmitframe); + } + + } + + if(ptdls_sta->sleepq_len==0) + { + DBG_871X("no buffered packets to xmit\n"); + //on U-APSD + CH. switch state, when there is no buffered date to xmit, + // we should go back to base channel + if(state==2){ + ptdls_sta->option = 3; + _set_workitem(&ptdls_sta->option_workitem); + }else if(ptdls_sta->state&TDLS_SW_OFF_STATE){ + ptdls_sta->state &= ~(TDLS_SW_OFF_STATE); + pmlmeinfo->tdls_candidate_ch= pmlmeext->cur_channel; + issue_tdls_ch_switch_req(adapter, pattrib->src); + DBG_8192C("issue tdls ch switch req back to base channel\n"); + } + + } + else + { + DBG_871X("error!psta->sleepq_len=%d\n", ptdls_sta->sleepq_len); + ptdls_sta->sleepq_len=0; + } + + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + + } + + } + + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =3; + u16 j; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //[+1]: payload type + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + ptdls_sta->off_ch = *(ptr+2); + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _COUNTRY_IE_: + break; + case _CH_SWTICH_ANNOUNCE_: + break; + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&ptdls_sta->ch_switch_time, pIE->data, 2); + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, pIE->data+2, 2); + default: + break; + } + + j += (pIE->Length + 2); + + } + + //todo: check status + ptdls_sta->stat_code=0; + ptdls_sta->state|=TDLS_CH_SWITCH_ON_STATE; + + issue_nulldata(adapter, 1); + + issue_tdls_ch_switch_rsp(adapter, psa); + + DBG_8192C("issue tdls channel switch response\n"); + + if((ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE) && ptdls_sta->off_ch==pmlmeext->cur_channel){ + DBG_8192C("back to base channel\n"); + ptdls_sta->option=7; + _set_workitem(&ptdls_sta->option_workitem); + + }else{ + ptdls_sta->option=6; + _set_workitem(&ptdls_sta->option_workitem); + } + return _FAIL; +} + +sint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame) +{ + struct sta_info *ptdls_sta= NULL; + struct sta_priv *pstapriv = &adapter->stapriv; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *prx_pkt_attrib = &precv_frame->u.hdr.attrib; + u8 *psa; + sint parsing_length; + PNDIS_802_11_VARIABLE_IEs pIE; + u8 FIXED_IE =4; + u16 stat_code, j, switch_time, switch_timeout; + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + + psa = get_sa(ptr); + ptdls_sta = rtw_get_stainfo(pstapriv, psa); + + //if channel switch is running and receiving Unsolicited TDLS Channel Switch Response, + //it will go back to base channel and terminate this channel switch procedure + if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE ){ + if(pmlmeext->cur_channel==ptdls_sta->off_ch){ + DBG_8192C("back to base channel\n"); + ptdls_sta->option=7; + _set_workitem(&ptdls_sta->option_workitem); + }else{ + DBG_8192C("receive unsolicited channel switch response \n"); + ptdls_sta->option=3; + _set_workitem(&ptdls_sta->option_workitem); + } + return _FAIL; + } + + //avoiding duplicated or unconditional ch. switch. rsp + if((ptdls_sta->state & TDLS_CH_SW_INITIATOR_STATE) != TDLS_CH_SW_INITIATOR_STATE) + return _FAIL; + + //[+1]: payload type + ptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+TYPE_LENGTH_FIELD_SIZE+1; + parsing_length= ((union recv_frame *)precv_frame)->u.hdr.len + -prx_pkt_attrib->hdrlen + -prx_pkt_attrib->iv_len + -prx_pkt_attrib->icv_len + -LLC_HEADER_SIZE + -TYPE_LENGTH_FIELD_SIZE + -1 + -FIXED_IE; + + _rtw_memcpy(&stat_code, ptr+2, 2); + + if(stat_code!=0){ + return _FAIL; + } + + //parsing information element + for(j=FIXED_IE; jElementID) + { + case _LINK_ID_IE_: + break; + case _CH_SWITCH_TIMING_: + _rtw_memcpy(&switch_time, pIE->data, 2); + if(switch_time > ptdls_sta->ch_switch_time) + _rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2); + + _rtw_memcpy(&switch_timeout, pIE->data+2, 2); + if(switch_timeout > ptdls_sta->ch_switch_timeout) + _rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2); + + default: + break; + } + + j += (pIE->Length + 2); + + } + + ptdls_sta->state &= ~(TDLS_CH_SW_INITIATOR_STATE); + ptdls_sta->state |=TDLS_CH_SWITCH_ON_STATE; + + //goto set_channel_workitem_callback() + ptdls_sta->option=6; + _set_workitem(&ptdls_sta->option_workitem); + + return _FAIL; +} + +sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) +{ + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + sint ret = _SUCCESS; + u8 *paction = get_recvframe_data(precv_frame); + + //point to action field, [+8]: snap+ether_type, [+1]: payload_type, [+1]: category field + paction+=pattrib->hdrlen + pattrib->iv_len+8+1+1; + + switch(*paction){ + case TDLS_SETUP_REQUEST: + DBG_8192C("recv tdls setup request frame\n"); + ret=On_TDLS_Setup_Req(adapter, precv_frame); + break; + case TDLS_SETUP_RESPONSE: + DBG_8192C("recv tdls setup response frame\n"); + ret=On_TDLS_Setup_Rsp(adapter, precv_frame); + break; + case TDLS_SETUP_CONFIRM: + DBG_8192C("recv tdls setup confirm frame\n"); + ret=On_TDLS_Setup_Cfm(adapter, precv_frame); + break; + case TDLS_TEARDOWN: + DBG_8192C("recv tdls teardown, free sta_info\n"); + ret=On_TDLS_Teardown(adapter, precv_frame); + break; + case TDLS_DISCOVERY_REQUEST: + DBG_8192C("recv tdls discovery request frame\n"); + ret=On_TDLS_Dis_Req(adapter, precv_frame); + break; + case TDLS_PEER_TRAFFIC_RESPONSE: + DBG_8192C("recv tdls discovery response frame\n"); + ret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); + break; + case TDLS_CHANNEL_SWITCH_REQUEST: + DBG_8192C("recv tdls channel switch request frame\n"); + ret=On_TDLS_Ch_Switch_Req(adapter, precv_frame); + break; + case TDLS_CHANNEL_SWITCH_RESPONSE: + DBG_8192C("recv tdls channel switch response frame\n"); + ret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame); + break; + default: + DBG_8192C("receive TDLS frame but not supported\n"); + ret=_FAIL; + break; + } + +exit: + return ret; + +} +#endif + +static sint sta2sta_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, + struct sta_info**psta +) +{ + u8 *ptr = precv_frame->u.hdr.rx_data; + sint ret = _SUCCESS; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + u8 *mybssid = get_bssid(pmlmepriv); + u8 *myhwaddr = myid(&adapter->eeprompriv); + u8 * sta_addr = NULL; + sint bmcast = IS_MCAST(pattrib->dst); + +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_info *ptdls_sta=NULL; + u8 *psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + //frame body located after [+2]: ether-type, [+1]: payload type + u8 *pframe_body = psnap_type+2+1; +#endif + +_func_enter_; + + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) + { + + // filter packets that SA is myself or multicast or broadcast + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); + ret= _FAIL; + goto exit; + } + + if( (!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast) ){ + ret= _FAIL; + goto exit; + } + + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) { + ret= _FAIL; + goto exit; + } + + sta_addr = pattrib->src; + + } + else if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { +#ifdef CONFIG_TDLS + + //direct link data transfer + if(pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE){ + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + if(ptdls_sta==NULL){ + ret=_FAIL; + goto exit; + }else if(((ptdls_sta->state&TDLS_LINKED_STATE)!=TDLS_LINKED_STATE)&&(!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)){ + ret=_FAIL; + goto exit; + }else if((ptdls_sta->state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE){ + + //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data + if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) + { + if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) + { + ret= _FAIL; + goto exit; + } + } + // filter packets that SA is myself or multicast or broadcast + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); + ret= _FAIL; + goto exit; + } + // da should be for me + if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) + { + ret= _FAIL; + goto exit; + } + // check BSSID + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) + { + ret= _FAIL; + goto exit; + } + // if NULL-frame, check pwrbit + if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) + { + //NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA + if(GetPwrMgt(ptr)){ + ptdls_sta->state|=TDLS_PEER_SLEEP_STATE; + // it would be triggered when we are off channel and receiving NULL DATA + // we can confirm that peer STA is at off channel + }else if(ptdls_sta->state&TDLS_CH_SWITCH_ON_STATE){ + if((ptdls_sta->state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){ + issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta, 0); + ptdls_sta->state |= TDLS_PEER_AT_OFF_STATE; + On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); + } + } + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); + ret= _FAIL; + goto exit; + } + //receive some of all TDLS management frames, process it at ON_TDLS + if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))){ + ret= OnTDLS(adapter, precv_frame); + goto exit; + } + + } + } + else +#endif + // For Station mode, sa and bssid should always be BSSID, and DA is my mac-address + if(!_rtw_memcmp(pattrib->bssid, pattrib->src, ETH_ALEN) ) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("bssid != TA under STATION_MODE; drop pkt\n")); + ret= _FAIL; + goto exit; + } + + sta_addr = pattrib->bssid; + + } + else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + if (bmcast) + { + // For AP mode, if DA == MCAST, then BSSID should be also MCAST + if (!IS_MCAST(pattrib->bssid)){ + ret= _FAIL; + goto exit; + } + } + else // not mc-frame + { + // For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID + if(!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) { + ret= _FAIL; + goto exit; + } + + sta_addr = pattrib->src; + } + + } + else if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + { + _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + sta_addr = mybssid; + } + else + { + ret = _FAIL; + } + + + + if(bmcast) + *psta = rtw_get_bcmc_stainfo(adapter); + else + *psta = rtw_get_stainfo(pstapriv, sta_addr); // get ap_info + + if (*psta == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under sta2sta_data_frame ; drop pkt\n")); +#ifdef CONFIG_MP_INCLUDED + if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + adapter->mppriv.rx_pktloss++; +#endif + ret= _FAIL; + goto exit; + } + +exit: +_func_exit_; + return ret; + +} + + +static sint ap2sta_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, + struct sta_info**psta ) +{ + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + sint ret = _SUCCESS; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + u8 *mybssid = get_bssid(pmlmepriv); + u8 *myhwaddr = myid(&adapter->eeprompriv); + sint bmcast = IS_MCAST(pattrib->dst); + +_func_enter_; + + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE + || check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE ) + ) + { + + // if NULL-frame, drop packet + if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s NULL frame\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data + if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) + { + if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s drop QoS-SubType Data, including QoS NULL, excluding QoS-Data\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + } + + // filter packets that SA is myself or multicast or broadcast + if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" SA==myself \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s SA=%x:%x:%x:%x:%x:%x, myhwaddr= %x:%x:%x:%x:%x:%x\n", __FUNCTION__, + pattrib->src[0], pattrib->src[1], pattrib->src[2], + pattrib->src[3], pattrib->src[4], pattrib->src[5], + *(myhwaddr), *(myhwaddr+1), *(myhwaddr+2), + *(myhwaddr+3), *(myhwaddr+4), *(myhwaddr+5)); + #endif + ret= _FAIL; + goto exit; + } + + // da should be for me + if((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast)) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" ap2sta_data_frame: compare DA fail; DA= %x:%x:%x:%x:%x:%x \n", + pattrib->dst[0], + pattrib->dst[1], + pattrib->dst[2], + pattrib->dst[3], + pattrib->dst[4], + pattrib->dst[5])); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s compare DA fail; DA= %x:%x:%x:%x:%x:%x \n", __FUNCTION__, + pattrib->dst[0],pattrib->dst[1],pattrib->dst[2], + pattrib->dst[3],pattrib->dst[4],pattrib->dst[5]); + #endif + + ret= _FAIL; + goto exit; + } + + + // check BSSID + if( _rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) || + (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" ap2sta_data_frame: compare BSSID fail ; BSSID=%x:%x:%x:%x:%x:%x\n", + pattrib->bssid[0], + pattrib->bssid[1], + pattrib->bssid[2], + pattrib->bssid[3], + pattrib->bssid[4], + pattrib->bssid[5])); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("mybssid= %x:%x:%x:%x:%x:%x\n", + mybssid[0], + mybssid[1], + mybssid[2], + mybssid[3], + mybssid[4], + mybssid[5])); + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s compare BSSID fail ; BSSID=%x:%x:%x:%x:%x:%x, mybssid= %x:%x:%x:%x:%x:%x\n", __FUNCTION__, + pattrib->bssid[0], pattrib->bssid[1], pattrib->bssid[2], + pattrib->bssid[3], pattrib->bssid[4], pattrib->bssid[5], + mybssid[0], mybssid[1], mybssid[2], + mybssid[3], mybssid[4], mybssid[5]); + #endif + + ret= _FAIL; + goto exit; + } + + if(bmcast) + *psta = rtw_get_bcmc_stainfo(adapter); + else + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get ap_info + + if (*psta == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("ap2sta: can't get psta under STATION_MODE ; drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + } + else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && + (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ) + { + _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + + // + _rtw_memcpy(pattrib->bssid, mybssid, ETH_ALEN); + + + *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info + if (*psta == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under MP_MODE ; drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__); + #endif + ret= _FAIL; + goto exit; + } + + + } + else + { + ret = _FAIL; + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s fw_state:0x%x\n", __FUNCTION__, get_fwstate(pmlmepriv)); + #endif + } + +exit: + +_func_exit_; + + return ret; + +} + +static sint sta2ap_data_frame( + _adapter *adapter, + union recv_frame *precv_frame, + struct sta_info**psta ) +{ + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + unsigned char *mybssid = get_bssid(pmlmepriv); + sint ret=_SUCCESS; + +_func_enter_; + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + //For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR + if(!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) + { + ret= _FAIL; + goto exit; + } + + *psta = rtw_get_stainfo(pstapriv, pattrib->src); + + if (*psta == NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("can't get psta under AP_MODE; drop pkt\n")); + ret= _FAIL; + goto exit; + } + + + process_pwrbit_data(adapter, precv_frame); + + + // if NULL-frame, drop packet + if ((GetFrameSubType(ptr)) == WIFI_DATA_NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" NULL frame \n")); + + //process_null_data(adapter, precv_frame); + //process_pwrbit_data(adapter, precv_frame); + + + ret= _FAIL; + goto exit; + } + + //drop QoS-SubType Data, including QoS NULL, excluding QoS-Data + if( (GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE )== WIFI_QOS_DATA_TYPE) + { + + if(GetFrameSubType(ptr)==WIFI_QOS_DATA_NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" QoS NULL frame \n")); + + //process_null_data(adapter, precv_frame); + + ret= _FAIL; + goto exit; + } + + process_wmmps_data(adapter, precv_frame); + + /* + if(GetFrameSubType(ptr)&(BIT(4)|BIT(5)|BIT(6))) + { + process_null_data(adapter, precv_frame); + ret= _FAIL; + goto exit; + } + */ + } + + } + +exit: + +_func_exit_; + + return ret; + +} + +static sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_AP_MODE + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 *pframe = precv_frame->u.hdr.rx_data; + //uint len = precv_frame->u.hdr.len; + + //DBG_871X("+validate_recv_ctrl_frame\n"); + + if (GetFrameType(pframe) != WIFI_CTRL_TYPE) + { + return _FAIL; + } + + //receive the frames that ra(a1) is my address + if (!_rtw_memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN)) + { + return _FAIL; + } + + //only handle ps-poll + if(GetFrameSubType(pframe) == WIFI_PSPOLL) + { + u16 aid; + u8 wmmps_ac=0; + struct sta_info *psta=NULL; + + aid = GetAid(pframe); + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + + if((psta==NULL) || (psta->aid!=aid)) + { + return _FAIL; + } + + //for rx pkt statistics + psta->sta_stats.rx_pkts++; + + switch(pattrib->priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(0); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(0); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(0); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(0); + break; + } + + if(wmmps_ac) + return _FAIL; + + if((psta->state&WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap&BIT(psta->aid))) + { + _irqL irqL; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + if ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + psta->sleepq_len--; + + if(psta->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + pxmitframe->attrib.triggered = 1; + + //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if(psta->sleepq_len==0) + { + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //DBG_871X("after handling ps-poll, tim=%x\n", pstapriv->tim_bitmap); + + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + + } + else + { + //DBG_871X("no buffered packets to xmit\n"); + if(pstapriv->tim_bitmap&BIT(psta->aid)) + { + if(psta->sleepq_len==0) + { + DBG_871X("no buffered packets to xmit\n"); + } + else + { + DBG_871X("error!psta->sleepq_len=%d\n", psta->sleepq_len); + psta->sleepq_len=0; + } + + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + } + + } + +#endif + + return _FAIL; + +} + +static sint validate_recv_mgnt_frame(_adapter *adapter, union recv_frame *precv_frame) +{ + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + + if(pmlmeinfo->tdls_ch_sensing==1 && pmlmeinfo->tdls_cur_channel !=0){ + pmlmeinfo->tdls_collect_pkt_num[pmlmeinfo->tdls_cur_channel-1]++; + } +#endif + + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("+validate_recv_mgnt_frame\n")); + +#if 0 + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { +#ifdef CONFIG_NATIVEAP_MLME + mgt_dispatcher(adapter, precv_frame); +#else + rtw_hostapd_mlme_rx(adapter, precv_frame); +#endif + } + else + { + mgt_dispatcher(adapter, precv_frame); + } +#endif + +#ifdef CONFIG_AP_MODE + { + //for rx pkt statistics + struct sta_info *psta = rtw_get_stainfo(&adapter->stapriv, GetAddr2Ptr(precv_frame->u.hdr.rx_data)); + if(psta) + psta->sta_stats.rx_pkts++; + } +#endif + + mgt_dispatcher(adapter, precv_frame); + + return _SUCCESS; + +} + + +static sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame) +{ + int res; + u8 bretry; + u8 *psa, *pda, *pbssid; + struct sta_info *psta = NULL; + u8 *ptr = precv_frame->u.hdr.rx_data; + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + struct sta_priv *pstapriv = &adapter->stapriv; + struct security_priv *psecuritypriv = &adapter->securitypriv; + sint ret = _SUCCESS; +#ifdef CONFIG_TDLS + struct sta_info *ptdls_sta = NULL; + struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#endif + +_func_enter_; + + bretry = GetRetry(ptr); + pda = get_da(ptr); + psa = get_sa(ptr); + pbssid = get_hdr_bssid(ptr); + + if(pbssid == NULL){ + ret= _FAIL; + goto exit; + } + +#ifdef CONFIG_TDLS + if(pmlmeinfo->tdls_ch_sensing==1 && pmlmeinfo->tdls_cur_channel !=0){ + pmlmeinfo->tdls_collect_pkt_num[pmlmeinfo->tdls_cur_channel-1]++; + } +#endif + + _rtw_memcpy(pattrib->dst, pda, ETH_ALEN); + _rtw_memcpy(pattrib->src, psa, ETH_ALEN); + + _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN); + + switch(pattrib->to_fr_ds) + { + case 0: + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + res= sta2sta_data_frame(adapter, precv_frame, &psta); + break; + + case 1: + _rtw_memcpy(pattrib->ra, pda, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN); + res= ap2sta_data_frame(adapter, precv_frame, &psta); + break; + + case 2: + _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN); + _rtw_memcpy(pattrib->ta, psa, ETH_ALEN); + res= sta2ap_data_frame(adapter, precv_frame, &psta); + break; + + case 3: + _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); + _rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); + res=_FAIL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" case 3\n")); + break; + + default: + res=_FAIL; + break; + + } + + if(res==_FAIL){ + //RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(" after to_fr_ds_chk; res = fail \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s case:%d, res:%d\n", __FUNCTION__, pattrib->to_fr_ds, res); + #endif + ret= res; + goto exit; + } + + + if(psta==NULL){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" after to_fr_ds_chk; psta==NULL \n")); + ret= _FAIL; + goto exit; + } + + //psta->rssi = prxcmd->rssi; + //psta->signal_quality= prxcmd->sq; + precv_frame->u.hdr.psta = psta; + + + pattrib->amsdu=0; + //parsing QC field + if(pattrib->qos == 1) + { + pattrib->priority = GetPriority((ptr + 24)); + pattrib->ack_policy =GetAckpolicy((ptr + 24)); + pattrib->amsdu = GetAMsdu((ptr + 24)); + pattrib->hdrlen = pattrib->to_fr_ds==3 ? 32 : 26; + + if(pattrib->priority!=0 && pattrib->priority!=3) + { + adapter->recvpriv.bIsAnyNonBEPkts = _TRUE; + } + } + else + { + pattrib->priority=0; + pattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24; + } + + + if(pattrib->order)//HT-CTRL 11n + { + pattrib->hdrlen += 4; + } + +#ifdef CONFIG_TDLS + //checking reordering per direct link + if((pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE)&&(pattrib->to_fr_ds==0)){ + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src); + if(ptdls_sta==NULL){ + ret= _FAIL; + goto exit; + }else{ + precv_frame->u.hdr.preorder_ctrl = &ptdls_sta->recvreorder_ctrl[pattrib->priority]; + + // decache, drop duplicate recv packets + if(recv_decache(precv_frame, bretry, &ptdls_sta->sta_recvpriv.rxcache) == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n")); + ret= _FAIL; + goto exit; + } + } + if(ptdls_sta->dot118021XPrivacy==_AES_) + pattrib->encrypt=ptdls_sta->dot118021XPrivacy; + }else +#endif + { + precv_frame->u.hdr.preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority]; + + // decache, drop duplicate recv packets + if(recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decache : drop pkt\n")); + ret= _FAIL; + goto exit; + } + } + + if(pattrib->privacy){ + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("validate_recv_data_frame:pattrib->privacy=%x\n", pattrib->privacy)); + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0],IS_MCAST(pattrib->ra))); + +#ifdef CONFIG_TDLS + if(ptdls_sta==NULL) +#endif + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra)); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("\n pattrib->encrypt=%d\n",pattrib->encrypt)); + + SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt); + } + else + { + pattrib->encrypt = 0; + pattrib->iv_len = pattrib->icv_len = 0; + } + +exit: + +_func_exit_; + + return ret; +} + +static sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame) +{ + //shall check frame subtype, to / from ds, da, bssid + + //then call check if rx seq/frag. duplicated. + + u8 type; + u8 subtype; + sint retval = _SUCCESS; + + struct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib; + + u8 *ptr = precv_frame->u.hdr.rx_data; + u8 ver =(unsigned char) (*ptr)&0x3 ; +#ifdef CONFIG_FIND_BEST_CHANNEL + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; +#endif + +_func_enter_; + + +#ifdef CONFIG_FIND_BEST_CHANNEL + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { + pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].rx_count++; + } +#endif + +#if 0 +DBG_871X("\n"); +{ + int i; + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + +} +DBG_871X("\n"); +#endif + + //add version chk + if(ver!=0){ + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n")); + retval= _FAIL; + goto exit; + } + + type = GetFrameType(ptr); + subtype = GetFrameSubType(ptr); //bit(7)~bit(2) + + pattrib->to_fr_ds = get_tofr_ds(ptr); + + pattrib->frag_num = GetFragNum(ptr); + pattrib->seq_num = GetSequence(ptr); + + pattrib->pw_save = GetPwrMgt(ptr); + pattrib->mfrag = GetMFrag(ptr); + pattrib->mdata = GetMData(ptr); + pattrib->privacy = GetPrivacy(ptr); + pattrib->order = GetOrder(ptr); +#if 0 //for debug + +if(pHalData->bDumpRxPkt ==1){ + int i; + DBG_871X("############################# \n"); + + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + DBG_871X("############################# \n"); +} +else if(pHalData->bDumpRxPkt ==2){ + if(type== WIFI_MGT_TYPE){ + int i; + DBG_871X("############################# \n"); + + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + DBG_871X("############################# \n"); + } +} +else if(pHalData->bDumpRxPkt ==3){ + if(type== WIFI_DATA_TYPE){ + int i; + DBG_871X("############################# \n"); + + for(i=0; i<64;i=i+8) + DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i), + *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7)); + DBG_871X("############################# \n"); + } +} + +#endif + switch (type) + { + case WIFI_MGT_TYPE: //mgnt + retval = validate_recv_mgnt_frame(adapter, precv_frame); + if (retval == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n")); + } + retval = _FAIL; // only data frame return _SUCCESS + break; + case WIFI_CTRL_TYPE: //ctrl + retval = validate_recv_ctrl_frame(adapter, precv_frame); + if (retval == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n")); + } + retval = _FAIL; // only data frame return _SUCCESS + break; + case WIFI_DATA_TYPE: //data + rtw_led_control(adapter, LED_CTL_RX); + pattrib->qos = (subtype & BIT(7))? 1:0; + retval = validate_recv_data_frame(adapter, precv_frame); + if (retval == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n")); + } + break; + default: + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type)); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type); + #endif + retval = _FAIL; + break; + } + +exit: + +_func_exit_; + + return retval; +} + + +//remove the wlanhdr and add the eth_hdr +#if 1 +static sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) +{ + sint rmv_len; + u16 eth_type, len; + u8 bsnaphdr; + u8 *psnap_type; + struct ieee80211_snap_hdr *psnap; + + sint ret=_SUCCESS; + _adapter *adapter =precvframe->u.hdr.adapter; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + + u8 *ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field + struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; + +_func_enter_; + + if(pattrib->encrypt){ + recvframe_pull_tail(precvframe, pattrib->icv_len); + } + + psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); + psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + /* convert hdr + possible LLC headers into Ethernet header */ + //eth_type = (psnap_type[0] << 8) | psnap_type[1]; + if((_rtw_memcmp(psnap, rfc1042_header, SNAP_SIZE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && + (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )|| + //eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || + _rtw_memcmp(psnap, bridge_tunnel_header, SNAP_SIZE)){ + /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ + bsnaphdr = _TRUE; + } + else { + /* Leave Ethernet header part of hdr and full payload */ + bsnaphdr = _FALSE; + } + + rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); + len = precvframe->u.hdr.len - rmv_len; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("\n===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n\n", pattrib->hdrlen, pattrib->iv_len)); + + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)) + { + ptr += rmv_len ; + *ptr = 0x87; + *(ptr+1) = 0x12; + + eth_type = 0x8712; + // append rx status for mp test packets + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24); + _rtw_memcpy(ptr, get_rxmem(precvframe), 24); + ptr+=24; + } + else { + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0))); + } + + _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); + _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); + + if(!bsnaphdr) { + len = htons(len); + _rtw_memcpy(ptr+12, &len, 2); + } + +_func_exit_; + return ret; + +} + +#else + +sint wlanhdr_to_ethhdr ( union recv_frame *precvframe) +{ + sint rmv_len; + u16 eth_type; + u8 bsnaphdr; + u8 *psnap_type; + struct ieee80211_snap_hdr *psnap; + + sint ret=_SUCCESS; + _adapter *adapter =precvframe->u.hdr.adapter; + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + + u8* ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field + struct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib; + struct _vlan *pvlan = NULL; + +_func_enter_; + + psnap=(struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len); + psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03) + { + if (_rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)) + bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; + else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) && + _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) ) + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; + else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; + else { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n")); + ret= _FAIL; + goto exit; + } + + } else + bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; + + rmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0); + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("===pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n", pattrib->hdrlen, pattrib->iv_len)); + + if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) + { + ptr += rmv_len ; + *ptr = 0x87; + *(ptr+1) = 0x12; + + //back to original pointer + ptr -= rmv_len; + } + + ptr += rmv_len ; + + _rtw_memcpy(ð_type, ptr, 2); + eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type + ptr +=2; + + if(pattrib->encrypt){ + recvframe_pull_tail(precvframe, pattrib->icv_len); + } + + if(eth_type == 0x8100) //vlan + { + pvlan = (struct _vlan *) ptr; + + //eth_type = get_vlan_encap_proto(pvlan); + //eth_type = pvlan->h_vlan_encapsulated_proto;//? + rmv_len += 4; + ptr+=4; + } + + if(eth_type==0x0800)//ip + { + //struct iphdr* piphdr = (struct iphdr*) ptr; + //__u8 tos = (unsigned char)(pattrib->priority & 0xff); + + //piphdr->tos = tos; + + //if (piphdr->protocol == 0x06) + //{ + // RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", precvframe->u.hdr.len)); + //} + } + else if(eth_type==0x8712)// append rx status for mp test packets + { + //ptr -= 16; + //_rtw_memcpy(ptr, get_rxmem(precvframe), 16); + } + else + { +#ifdef PLATFORM_OS_XP + NDIS_PACKET_8021Q_INFO VlanPriInfo; + UINT32 UserPriority = precvframe->u.hdr.attrib.priority; + UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 ); + + VlanPriInfo.Value = // Get current value. + NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo); + + VlanPriInfo.TagHeader.UserPriority = UserPriority; + VlanPriInfo.TagHeader.VlanId = VlanID ; + + VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero. + VlanPriInfo.TagHeader.Reserved = 0; // Should be zero. + NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; +#endif + } + + if(eth_type==0x8712)// append rx status for mp test packets + { + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24); + _rtw_memcpy(ptr, get_rxmem(precvframe), 24); + ptr+=24; + } + else + ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)); + + _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN); + _rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN); + + eth_type = htons((unsigned short)eth_type) ; + _rtw_memcpy(ptr+12, ð_type, 2); + +exit: + +_func_exit_; + + return ret; +} +#endif + +static void count_rx_stats(_adapter *padapter, union recv_frame *prframe) +{ + int sz; + struct sta_info *psta = NULL; + struct stainfo_stats *pstats = NULL; + struct rx_pkt_attrib *pattrib = & prframe->u.hdr.attrib; + struct recv_priv *precvpriv = &padapter->recvpriv; + + sz = get_recvframe_len(prframe); + precvpriv->rx_bytes += sz; + + padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++; + + if( (!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst))){ + padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++; + } + + psta = prframe->u.hdr.psta; + + if(psta) + { + pstats = &psta->sta_stats; + + pstats->rx_pkts++; + pstats->rx_bytes += sz; + } + +} + + +//perform defrag +static union recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q) +{ + _list *plist, *phead; + u8 *data,wlanhdr_offset; + u8 curfragnum; + struct recv_frame_hdr *pfhdr,*pnfhdr; + union recv_frame* prframe, *pnextrframe; + _queue *pfree_recv_queue; + +_func_enter_; + + curfragnum=0; + pfree_recv_queue=&adapter->recvpriv.free_recv_queue; + + phead = get_list_head(defrag_q); + plist = get_next(phead); + prframe = LIST_CONTAINOR(plist, union recv_frame, u); + pfhdr=&prframe->u.hdr; + rtw_list_delete(&(prframe->u.list)); + + if(curfragnum!=pfhdr->attrib.frag_num) + { + //the first fragment number must be 0 + //free the whole queue + rtw_free_recvframe(prframe, pfree_recv_queue); + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); + + return NULL; + } + + curfragnum++; + + plist= get_list_head(defrag_q); + + plist = get_next(plist); + + data=get_recvframe_data(prframe); + + while(rtw_end_of_queue_search(phead, plist) == _FALSE) + { + pnextrframe = LIST_CONTAINOR(plist, union recv_frame , u); + pnfhdr=&pnextrframe->u.hdr; + + + //check the fragment sequence (2nd ~n fragment frame) + + if(curfragnum!=pnfhdr->attrib.frag_num) + { + //the fragment number must be increasing (after decache) + //release the defrag_q & prframe + rtw_free_recvframe(prframe, pfree_recv_queue); + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); + return NULL; + } + + curfragnum++; + + //copy the 2nd~n fragment frame's payload to the first fragment + //get the 2nd~last fragment frame's payload + + wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len; + + recvframe_pull(pnextrframe, wlanhdr_offset); + + //append to first fragment frame's tail (if privacy frame, pull the ICV) + recvframe_pull_tail(prframe, pfhdr->attrib.icv_len); + + //memcpy + _rtw_memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len); + + recvframe_put(prframe, pnfhdr->len); + + pfhdr->attrib.icv_len=pnfhdr->attrib.icv_len; + plist = get_next(plist); + + }; + + //free the defrag_q queue and return the prframe + rtw_free_recvframe_queue(defrag_q, pfree_recv_queue); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Performance defrag!!!!!\n")); + +_func_exit_; + + return prframe; +} + + +//check if need to defrag, if needed queue the frame to defrag_q +static union recv_frame * recvframe_chk_defrag(_adapter *padapter,union recv_frame* precv_frame) +{ + u8 ismfrag; + u8 fragnum; + u8 *psta_addr; + struct recv_frame_hdr *pfhdr; + struct sta_info * psta; + struct sta_priv *pstapriv ; + _list *phead; + union recv_frame* prtnframe=NULL; + _queue *pfree_recv_queue, *pdefrag_q; + +_func_enter_; + + pstapriv = &padapter->stapriv; + + pfhdr=&precv_frame->u.hdr; + + pfree_recv_queue=&padapter->recvpriv.free_recv_queue; + + //need to define struct of wlan header frame ctrl + ismfrag= pfhdr->attrib.mfrag; + fragnum=pfhdr->attrib.frag_num; + + psta_addr=pfhdr->attrib.ta; + psta=rtw_get_stainfo(pstapriv, psta_addr); + if (psta==NULL) + pdefrag_q = NULL; + else + pdefrag_q=&psta->sta_recvpriv.defrag_q; + + if ((ismfrag==0) && (fragnum==0)) + { + prtnframe = precv_frame;//isn't a fragment frame + } + + if (ismfrag==1) + { + //0~(n-1) fragment frame + //enqueue to defraf_g + if(pdefrag_q != NULL) + { + if(fragnum==0) + { + //the first fragment + if(_rtw_queue_empty(pdefrag_q) == _FALSE) + { + //free current defrag_q + rtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue); + } + } + + + //Then enqueue the 0~(n-1) fragment into the defrag_q + + //_rtw_spinlock(&pdefrag_q->lock); + phead = get_list_head(pdefrag_q); + rtw_list_insert_tail(&pfhdr->list, phead); + //_rtw_spinunlock(&pdefrag_q->lock); + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Enqueuq: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); + + prtnframe=NULL; + + } + else + { + //can't find this ta's defrag_queue, so free this recv_frame + rtw_free_recvframe(precv_frame, pfree_recv_queue); + prtnframe=NULL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); + } + + } + + if((ismfrag==0)&&(fragnum!=0)) + { + //the last fragment frame + //enqueue the last fragment + if(pdefrag_q != NULL) + { + //_rtw_spinlock(&pdefrag_q->lock); + phead = get_list_head(pdefrag_q); + rtw_list_insert_tail(&pfhdr->list,phead); + //_rtw_spinunlock(&pdefrag_q->lock); + + //call recvframe_defrag to defrag + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("defrag: ismfrag = %d, fragnum= %d\n", ismfrag, fragnum)); + precv_frame = recvframe_defrag(padapter, pdefrag_q); + prtnframe=precv_frame; + + } + else + { + //can't find this ta's defrag_queue, so free this recv_frame + rtw_free_recvframe(precv_frame, pfree_recv_queue); + prtnframe=NULL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\n", ismfrag,fragnum)); + } + + } + + + if((prtnframe!=NULL)&&(prtnframe->u.hdr.attrib.privacy)) + { + //after defrag we must check tkip mic code + if(recvframe_chkmic(padapter, prtnframe)==_FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chkmic(padapter, prtnframe)==_FAIL\n")); + rtw_free_recvframe(prtnframe,pfree_recv_queue); + prtnframe=NULL; + } + } + +_func_exit_; + + return prtnframe; + +} + + +static int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe) +{ +#ifdef PLATFORM_LINUX //for amsdu TP improvement,Creator: Thomas + int a_len, padding_len; + u16 eth_type, nSubframe_Length; + u8 nr_subframes, i; + unsigned char *data_ptr, *pdata; + struct rx_pkt_attrib *pattrib; + _pkt *sub_skb,*subframes[MAX_SUBFRAME_COUNT]; + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &(precvpriv->free_recv_queue); + int ret = _SUCCESS; + + nr_subframes = 0; + + pattrib = &prframe->u.hdr.attrib; + + recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen); + + if(prframe->u.hdr.attrib.iv_len >0) + { + recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len); + } + + a_len = prframe->u.hdr.len; + + pdata = prframe->u.hdr.rx_data; + + while(a_len > ETH_HLEN) { + + /* Offset 12 denote 2 mac address */ + //nSubframe_Length = *((u16*)(pdata + 12)); + //==m==>change the length order + //nSubframe_Length = (nSubframe_Length>>8) + (nSubframe_Length<<8); + //nSubframe_Length = ntohs(*((u16*)(pdata + 12))); + nSubframe_Length = RTW_GET_BE16(pdata + 12); + + //ntohs(nSubframe_Length); + + if( a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length) ) { + DBG_8192C("nRemain_Length is %d and nSubframe_Length is : %d\n",a_len,nSubframe_Length); + goto exit; + } + + /* move the data point to data content */ + pdata += ETH_HLEN; + a_len -= ETH_HLEN; + + /* Allocate new skb for releasing to upper layer */ +#ifdef CONFIG_SKB_COPY + sub_skb = dev_alloc_skb(nSubframe_Length + 12); + if(sub_skb) + { + skb_reserve(sub_skb, 12); + data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length); + _rtw_memcpy(data_ptr, pdata, nSubframe_Length); + } + else + { +#endif // CONFIG_SKB_COPY + sub_skb = skb_clone(prframe->u.hdr.pkt, GFP_ATOMIC); + if(sub_skb) + { + sub_skb->data = pdata; + sub_skb->len = nSubframe_Length; + sub_skb->tail = sub_skb->data + nSubframe_Length; + } + else + { + DBG_8192C("skb_clone() Fail!!! , nr_subframes = %d\n",nr_subframes); + break; + } + } + + //sub_skb->dev = padapter->pnetdev; + subframes[nr_subframes++] = sub_skb; + if(nr_subframes >= MAX_SUBFRAME_COUNT) { + DBG_8192C("ParseSubframe(): Too many Subframes! Packets dropped!\n"); + break; + } + + pdata += nSubframe_Length; + a_len -= nSubframe_Length; + if(a_len != 0) { + padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4-1)); + if(padding_len == 4) { + padding_len = 0; + } + + if(a_len < padding_len) { + goto exit; + } + pdata += padding_len; + a_len -= padding_len; + } + } + + for(i=0; idata[6] << 8) | sub_skb->data[7]; + //eth_type = ntohs(*(u16*)&sub_skb->data[6]); + eth_type = RTW_GET_BE16(&sub_skb->data[6]); + if (sub_skb->len >= 8 && + ((_rtw_memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) && + eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || + _rtw_memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) )) { + /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */ + skb_pull(sub_skb, SNAP_SIZE); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); + } else { + u16 len; + /* Leave Ethernet header part of hdr and full payload */ + len = htons(sub_skb->len); + _rtw_memcpy(skb_push(sub_skb, 2), &len, 2); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN); + _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN); + } + + /* Indicat the packets to upper layer */ + if (sub_skb) { + //memset(sub_skb->cb, 0, sizeof(sub_skb->cb)); + + sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev); + sub_skb->dev = padapter->pnetdev; + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) { + sub_skb->ip_summed = CHECKSUM_UNNECESSARY; + } else { + sub_skb->ip_summed = CHECKSUM_NONE; + } +#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */ + sub_skb->ip_summed = CHECKSUM_NONE; +#endif + + netif_rx(sub_skb); + } + } + +exit: + + prframe->u.hdr.len=0; + rtw_free_recvframe(prframe, pfree_recv_queue);//free this recv_frame + + return ret; +#else + _irqL irql; + unsigned char *ptr, *pdata, *pbuf, *psnap_type; + union recv_frame *pnrframe, *pnrframe_new; + int a_len, mv_len, padding_len; + u16 eth_type, type_len; + u8 bsnaphdr; + struct ieee80211_snap_hdr *psnap; + struct _vlan *pvlan; + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &(precvpriv->free_recv_queue); + int ret = _SUCCESS; +#ifdef PLATFORM_WINDOWS + struct recv_buf *precvbuf = prframe->u.hdr.precvbuf; +#endif + a_len = prframe->u.hdr.len - prframe->u.hdr.attrib.hdrlen; + + recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen); + + if(prframe->u.hdr.attrib.iv_len >0) + { + recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len); + } + + pdata = prframe->u.hdr.rx_data; + + prframe->u.hdr.len=0; + + pnrframe = prframe; + + + do{ + + mv_len=0; + pnrframe->u.hdr.rx_data = pnrframe->u.hdr.rx_tail = pdata; + ptr = pdata; + + + _rtw_memcpy(pnrframe->u.hdr.attrib.dst, ptr, ETH_ALEN); + ptr+=ETH_ALEN; + _rtw_memcpy(pnrframe->u.hdr.attrib.src, ptr, ETH_ALEN); + ptr+=ETH_ALEN; + + _rtw_memcpy(&type_len, ptr, 2); + type_len= ntohs((unsigned short )type_len); + ptr +=2; + mv_len += ETH_HLEN; + + recvframe_put(pnrframe, type_len+ETH_HLEN);//update tail; + + if(pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8) + { + //panic("pnrframe->u.hdr.rx_data >= pnrframe->u.hdr.rx_tail || type_len<8\n"); + + rtw_free_recvframe(pnrframe, pfree_recv_queue); + + goto exit; + } + + psnap=(struct ieee80211_snap_hdr *)(ptr); + psnap_type=ptr+SNAP_SIZE; + if (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03) + { + if ( _rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)) + { + bsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; + } + else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) && + _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) ) + { + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; + } + else if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN)) + { + bsnaphdr=_TRUE; //wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("drop pkt due to invalid frame format!\n")); + + //KeBugCheckEx(0x87123333, 0xe0, 0x4c, 0x87, 0xdd); + + //panic("0x87123333, 0xe0, 0x4c, 0x87, 0xdd\n"); + + rtw_free_recvframe(pnrframe, pfree_recv_queue); + + goto exit; + } + + } + else + { + bsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; + } + + ptr += (bsnaphdr?SNAP_SIZE:0); + _rtw_memcpy(ð_type, ptr, 2); + eth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type + + mv_len+= 2+(bsnaphdr?SNAP_SIZE:0); + ptr += 2;//now move to iphdr; + + pvlan = NULL; + if(eth_type == 0x8100) //vlan + { + pvlan = (struct _vlan *)ptr; + ptr+=4; + mv_len+=4; + } + + if(eth_type==0x0800)//ip + { + struct iphdr* piphdr = (struct iphdr*)ptr; + + + if (piphdr->protocol == 0x06) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("@@@===recv tcp len:%d @@@===\n", pnrframe->u.hdr.len)); + } + } +#ifdef PLATFORM_OS_XP + else + { + NDIS_PACKET_8021Q_INFO VlanPriInfo; + UINT32 UserPriority = pnrframe->u.hdr.attrib.priority; + UINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 ); + + VlanPriInfo.Value = // Get current value. + NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo); + + VlanPriInfo.TagHeader.UserPriority = UserPriority; + VlanPriInfo.TagHeader.VlanId = VlanID; + + VlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero. + VlanPriInfo.TagHeader.Reserved = 0; // Should be zero. + NDIS_PER_PACKET_INFO_FROM_PACKET(pnrframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value; + + } +#endif + + pbuf = recvframe_pull(pnrframe, (mv_len-sizeof(struct ethhdr))); + + _rtw_memcpy(pbuf, pnrframe->u.hdr.attrib.dst, ETH_ALEN); + _rtw_memcpy(pbuf+ETH_ALEN, pnrframe->u.hdr.attrib.src, ETH_ALEN); + + eth_type = htons((unsigned short)eth_type) ; + _rtw_memcpy(pbuf+12, ð_type, 2); + + padding_len = (4) - ((type_len + ETH_HLEN)&(4-1)); + + a_len -= (type_len + ETH_HLEN + padding_len) ; + + +#if 0 + + if(a_len > ETH_HLEN) + { + pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue); + if(pnrframe_new) + { + _pkt *pskb_copy; + unsigned int copy_len = pnrframe->u.hdr.len; + + _rtw_init_listhead(&pnrframe_new->u.hdr.list); + + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pskb_copy = dev_alloc_skb(copy_len+64); + #else + pskb_copy = netdev_alloc_skb(padapter->pnetdev, copy_len + 64); + #endif + if(pskb_copy==NULL) + { + DBG_8192C("amsdu_to_msdu:can not all(ocate memory for skb copy\n"); + } + + pnrframe_new->u.hdr.pkt = pskb_copy; + + _rtw_memcpy(pskb_copy->data, pnrframe->u.hdr.rx_data, copy_len); + + pnrframe_new->u.hdr.rx_data = pnrframe->u.hdr.rx_data; + pnrframe_new->u.hdr.rx_tail = pnrframe->u.hdr.rx_data + copy_len; + + + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) + { + rtw_recv_indicatepkt(padapter, pnrframe_new);//indicate this recv_frame + } + else + { + rtw_free_recvframe(pnrframe_new, pfree_recv_queue);//free this recv_frame + } + + } + else + { + DBG_8192C("amsdu_to_msdu:can not allocate memory for pnrframe_new\n"); + } + + } + else + { + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) + { + rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame + } + else + { + rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame + } + + pnrframe = NULL; + + } + +#else + + //padding_len = (4) - ((type_len + ETH_HLEN)&(4-1)); + + //a_len -= (type_len + ETH_HLEN + padding_len) ; + + pnrframe_new = NULL; + + + if(a_len > ETH_HLEN) + { + pnrframe_new = rtw_alloc_recvframe(pfree_recv_queue); + + if(pnrframe_new) + { + + + //pnrframe_new->u.hdr.precvbuf = precvbuf;//precvbuf is assigned before call rtw_init_recvframe() + //rtw_init_recvframe(pnrframe_new, precvpriv); + { + _pkt *pskb = pnrframe->u.hdr.pkt; + _rtw_init_listhead(&pnrframe_new->u.hdr.list); + + pnrframe_new->u.hdr.len=0; + +#ifdef PLATFORM_LINUX + if(pskb) + { + pnrframe_new->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + } +#endif + + } + + pdata += (type_len + ETH_HLEN + padding_len); + pnrframe_new->u.hdr.rx_head = pnrframe_new->u.hdr.rx_data = pnrframe_new->u.hdr.rx_tail = pdata; + pnrframe_new->u.hdr.rx_end = pdata + a_len + padding_len;// + +#ifdef PLATFORM_WINDOWS + pnrframe_new->u.hdr.precvbuf=precvbuf; + _enter_critical_bh(&precvbuf->recvbuf_lock, &irql); + precvbuf->ref_cnt++; + _exit_critical_bh(&precvbuf->recvbuf_lock, &irql); +#endif + + } + else + { + //panic("pnrframe_new=%x\n", pnrframe_new); + } + } + + + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE) ) + { + rtw_recv_indicatepkt(padapter, pnrframe);//indicate this recv_frame + } + else + { + rtw_free_recvframe(pnrframe, pfree_recv_queue);//free this recv_frame + } + + + pnrframe = NULL; + if(pnrframe_new) + { + pnrframe = pnrframe_new; + } + + +#endif + + }while(pnrframe); + +exit: + + return ret; +#endif +} + + +static int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num) +{ + u8 wsize = preorder_ctrl->wsize_b; + u16 wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;//% 4096; + + // Rx Reorder initialize condition. + if (preorder_ctrl->indicate_seq == 0xFFFF) + { + preorder_ctrl->indicate_seq = seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); + #endif + + //DbgPrint("check_indicate_seq, 1st->indicate_seq=%d\n", precvpriv->indicate_seq); + } + + //DbgPrint("enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + // Drop out the packet which SeqNum is smaller than WinStart + if( SN_LESS(seq_num, preorder_ctrl->indicate_seq) ) + { + //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); + //DbgPrint("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, + preorder_ctrl->indicate_seq, seq_num); + #endif + + + return _FALSE; + } + + // + // Sliding window manipulation. Conditions includes: + // 1. Incoming SeqNum is equal to WinStart =>Window shift 1 + // 2. Incoming SeqNum is larger than the WinEnd => Window shift N + // + if( SN_EQUAL(seq_num, preorder_ctrl->indicate_seq) ) + { + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); + #endif + } + else if(SN_LESS(wend, seq_num)) + { + //RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, NewSeqNum)); + //DbgPrint("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + // boundary situation, when seq_num cross 0xFFF + if(seq_num >= (wsize - 1)) + preorder_ctrl->indicate_seq = seq_num + 1 -wsize; + else + preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1; + + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, seq_num); + #endif + } + + //DbgPrint("exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); + + return _TRUE; +} + + +static int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe) +{ + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + _list *phead, *plist; + union recv_frame *pnextrframe; + struct rx_pkt_attrib *pnextattrib; + + //DbgPrint("+enqueue_reorder_recvframe()\n"); + + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + + + phead = get_list_head(ppending_recvframe_queue); + plist = get_next(phead); + + while(rtw_end_of_queue_search(phead, plist) == _FALSE) + { + pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u); + pnextattrib = &pnextrframe->u.hdr.attrib; + + if(SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) + { + plist = get_next(plist); + } + else if( SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) + { + //Duplicate entry is found!! Do not insert current entry. + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); + + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + + return _FALSE; + } + else + { + break; + } + + //DbgPrint("enqueue_reorder_recvframe():while\n"); + + } + + + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + + rtw_list_delete(&(prframe->u.hdr.list)); + + rtw_list_insert_tail(&(prframe->u.hdr.list), plist); + + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + + + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("InsertRxReorderList(): Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\n", pTS->RxIndicateSeq, SeqNum)); + return _TRUE; + +} + + +static int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced) +{ + _irqL irql; + //u8 bcancelled; + _list *phead, *plist; + union recv_frame *prframe; + struct rx_pkt_attrib *pattrib; + //u8 index = 0; + int bPktInBuf = _FALSE; + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + + //DbgPrint("+recv_indicatepkts_in_order\n"); + + //_enter_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinlock_ex(&ppending_recvframe_queue->lock); + + phead = get_list_head(ppending_recvframe_queue); + plist = get_next(phead); + +#if 0 + // Check if there is any other indication thread running. + if(pTS->RxIndicateState == RXTS_INDICATE_PROCESSING) + return; +#endif + + // Handling some condition for forced indicate case. + if(bforced==_TRUE) + { + if(rtw_is_list_empty(phead)) + { + // _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); + return _TRUE; + } + + prframe = LIST_CONTAINOR(plist, union recv_frame, u); + pattrib = &prframe->u.hdr.attrib; + preorder_ctrl->indicate_seq = pattrib->seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + } + + // Prepare indication list and indication. + // Check if there is any packet need indicate. + while(!rtw_is_list_empty(phead)) + { + + prframe = LIST_CONTAINOR(plist, union recv_frame, u); + pattrib = &prframe->u.hdr.attrib; + + if(!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, + ("recv_indicatepkts_in_order: indicate=%d seq=%d amsdu=%d\n", + preorder_ctrl->indicate_seq, pattrib->seq_num, pattrib->amsdu)); + +#if 0 + // This protect buffer from overflow. + if(index >= REORDER_WIN_SIZE) + { + RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!! \n")); + bPktInBuf = TRUE; + break; + } +#endif + + plist = get_next(plist); + rtw_list_delete(&(prframe->u.hdr.list)); + + if(SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) + { + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + } + +#if 0 + index++; + if(index==1) + { + //Cancel previous pending timer. + //PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer); + if(bforced!=_TRUE) + { + //DBG_8192C("_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\n"); + _cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled); + } + } +#endif + + //Set this as a lock to make sure that only one thread is indicating packet. + //pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; + + // Indicate packets + //RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!! \n")); + + + //indicate this recv_frame + //DbgPrint("recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\n", precvpriv->indicate_seq, pattrib->seq_num); + if(!pattrib->amsdu) + { + //DBG_8192C("recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\n", preorder_ctrl->indicate_seq, pattrib->seq_num); + + if ((padapter->bDriverStopped == _FALSE) && + (padapter->bSurpriseRemoved == _FALSE)) + { + + rtw_recv_indicatepkt(padapter, prframe); //indicate this recv_frame + + } + } + else if(pattrib->amsdu==1) + { + if(amsdu_to_msdu(padapter, prframe)!=_SUCCESS) + { + rtw_free_recvframe(prframe, &precvpriv->free_recv_queue); + } + } + else + { + //error condition; + } + + + //Update local variables. + bPktInBuf = _FALSE; + + } + else + { + bPktInBuf = _TRUE; + break; + } + + //DbgPrint("recv_indicatepkts_in_order():while\n"); + + } + + //_rtw_spinunlock_ex(&ppending_recvframe_queue->lock); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + +/* + //Release the indication lock and set to new indication step. + if(bPktInBuf) + { + // Set new pending timer. + //pTS->RxIndicateState = RXTS_INDICATE_REORDER; + //PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime); + //DBG_8192C("_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME)\n"); + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + } + else + { + //pTS->RxIndicateState = RXTS_INDICATE_IDLE; + } +*/ + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + + //return _TRUE; + return bPktInBuf; + +} + + +static int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) +{ + _irqL irql; + int retval = _SUCCESS; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + + if(!pattrib->amsdu) + { + //s1. + wlanhdr_to_ethhdr(prframe); + + if(pattrib->qos !=1 /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/) + { + if ((padapter->bDriverStopped == _FALSE) && + (padapter->bSurpriseRemoved == _FALSE)) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n" )); + + rtw_recv_indicatepkt(padapter, prframe); + return _SUCCESS; + + } + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s pattrib->qos !=1\n", __FUNCTION__); + #endif + + return _FAIL; + + } + + if (preorder_ctrl->enable == _FALSE) + { + //indicate this recv_frame + preorder_ctrl->indicate_seq = pattrib->seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + rtw_recv_indicatepkt(padapter, prframe); + + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + return _SUCCESS; + } + +#ifndef CONFIG_RECV_REORDERING_CTRL + //indicate this recv_frame + rtw_recv_indicatepkt(padapter, prframe); + return _SUCCESS; +#endif + + } + else if(pattrib->amsdu==1) //temp filter -> means didn't support A-MSDUs in a A-MPDU + { + if (preorder_ctrl->enable == _FALSE) + { + preorder_ctrl->indicate_seq = pattrib->seq_num; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + retval = amsdu_to_msdu(padapter, prframe); + + preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, pattrib->seq_num); + #endif + + if(retval != _SUCCESS){ + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); + #endif + } + + return retval; + } + } + else + { + + } + + _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); + + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, + ("recv_indicatepkt_reorder: indicate=%d seq=%d\n", + preorder_ctrl->indicate_seq, pattrib->seq_num)); + + //s2. check if winstart_b(indicate_seq) needs to been updated + if(!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) + { + //pHTInfo->RxReorderDropCounter++; + //ReturnRFDList(Adapter, pRfd); + //RT_TRACE(COMP_RX_REORDER, DBG_TRACE, ("RxReorderIndicatePacket() ==> Packet Drop!!\n")); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + //return _FAIL; + + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s check_indicate_seq fail\n", __FUNCTION__); + #endif + goto _err_exit; + } + + + //s3. Insert all packet into Reorder Queue to maintain its ordering. + if(!enqueue_reorder_recvframe(preorder_ctrl, prframe)) + { + //DbgPrint("recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\n"); + //_exit_critical_ex(&ppending_recvframe_queue->lock, &irql); + //return _FAIL; + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\n", __FUNCTION__); + #endif + goto _err_exit; + } + + + //s4. + // Indication process. + // After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets + // with the SeqNum smaller than latest WinStart and buffer other packets. + // + // For Rx Reorder condition: + // 1. All packets with SeqNum smaller than WinStart => Indicate + // 2. All packets with SeqNum larger than or equal to WinStart => Buffer it. + // + + //recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE); + if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE)==_TRUE) + { + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + } + else + { + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); + } + + + return _SUCCESS; + +_err_exit: + + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + + return _FAIL; +} + + +void rtw_reordering_ctrl_timeout_handler(void *pcontext) +{ + _irqL irql; + struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)pcontext; + _adapter *padapter = preorder_ctrl->padapter; + _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue; + + + if(padapter->bDriverStopped ||padapter->bSurpriseRemoved) + { + return; + } + + //DBG_8192C("+rtw_reordering_ctrl_timeout_handler()=>\n"); + + _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); + + if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE)==_TRUE) + { + _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + } + + _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); + +} + + +static int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe) +{ + int retval = _SUCCESS; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + +#ifdef CONFIG_80211N_HT + + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + if(phtpriv->ht_option==_TRUE) //B/G/N Mode + { + //prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; + + if(recv_indicatepkt_reorder(padapter, prframe)!=_SUCCESS)// including perform A-MPDU Rx Ordering Buffer Control + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\n", __FUNCTION__); + #endif + + if ((padapter->bDriverStopped == _FALSE) && + (padapter->bSurpriseRemoved == _FALSE)) + { + retval = _FAIL; + return retval; + } + } + } + else //B/G mode +#endif + { + retval=wlanhdr_to_ethhdr (prframe); + if(retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__); + #endif + return retval; + } + + if ((padapter->bDriverStopped ==_FALSE)&&( padapter->bSurpriseRemoved==_FALSE)) + { + //indicate this recv_frame + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n" )); + rtw_recv_indicatepkt(padapter, prframe); + + + } + else + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n" )); + + RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + retval = _FAIL; + return retval; + } + + } + + return retval; + +} + + +static int recv_func(_adapter *padapter, void *pcontext) +{ + struct rx_pkt_attrib *pattrib; + union recv_frame *prframe, *orig_prframe; + int retval = _SUCCESS; + _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TDLS + u8 *psnap_type, *pcategory; +#endif + + prframe = (union recv_frame *)pcontext; + orig_prframe = prframe; + + pattrib = &prframe->u.hdr.attrib; + +#ifdef CONFIG_MP_INCLUDED + if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0)) + { + if (pattrib->crc_err == 1) + padapter->mppriv.rx_crcerrpktcount++; + else + padapter->mppriv.rx_pktcount++; + + if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n")); + retval = _FAIL; + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + } +#endif + + //check the frame crtl field and decache + retval = validate_recv_frame(padapter, prframe); + if (retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recv_func: validate_recv_frame fail! drop pkt\n")); + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + // DATA FRAME + rtw_led_control(padapter, LED_CTL_RX); + + prframe = decryptor(padapter, prframe); + if (prframe == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("decryptor: drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__); + #endif + retval = _FAIL; + goto _exit_recv_func; + } + +#ifdef CONFIG_TDLS + //check TDLS frame + psnap_type = get_recvframe_data(orig_prframe); + psnap_type+=pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE; + //[+2]: ether_type, [+1]: payload type + pcategory = psnap_type+2+1; + if((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2))&&((*pcategory==0x0c))){ + retval = OnTDLS(padapter, prframe); //all of functions will return _FAIL + goto _exit_recv_func; + } +#endif + + prframe = recvframe_chk_defrag(padapter, prframe); + if(prframe==NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvframe_chk_defrag: drop pkt\n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__); + #endif + goto _exit_recv_func; + } + + prframe=portctrl(padapter, prframe); + if (prframe == NULL) { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("portctrl: drop pkt \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__); + #endif + retval = _FAIL; + goto _exit_recv_func; + } + + count_rx_stats(padapter, prframe); + +#ifdef CONFIG_80211N_HT + + retval = process_recv_indicatepkts(padapter, prframe); + if (retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recv_func: process_recv_indicatepkts fail! \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s recv_func: process_recv_indicatepkts fail!\n", __FUNCTION__); + #endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + +#else + + if (!pattrib->amsdu) + { + retval = wlanhdr_to_ethhdr (prframe); + if (retval != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("wlanhdr_to_ethhdr: drop pkt \n")); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__); + #endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame + goto _exit_recv_func; + } + + if ((padapter->bDriverStopped == _FALSE) && (padapter->bSurpriseRemoved == _FALSE)) + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: recv_func rtw_recv_indicatepkt\n" )); + //indicate this recv_frame + retval = rtw_recv_indicatepkt(padapter, prframe); + if (retval != _SUCCESS) + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__); + #endif + goto _exit_recv_func; + } + } + else + { + RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("@@@@ recv_func: rtw_free_recvframe\n" )); + RT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, ("recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", __FUNCTION__, + padapter->bDriverStopped, padapter->bSurpriseRemoved); + #endif + retval = _FAIL; + rtw_free_recvframe(orig_prframe, pfree_recv_queue); //free this recv_frame + } + + } + else if(pattrib->amsdu==1) + { + + retval = amsdu_to_msdu(padapter, prframe); + if(retval != _SUCCESS) + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__); + #endif + rtw_free_recvframe(orig_prframe, pfree_recv_queue); + goto _exit_recv_func; + } + } + else + { + #ifdef DBG_RX_DROP_FRAME + DBG_871X("DBG_RX_DROP_FRAME %s what is this condition??\n", __FUNCTION__); + #endif + } +#endif + + +_exit_recv_func: + + return retval; +} + + +s32 rtw_recv_entry(union recv_frame *precvframe) +{ + _adapter *padapter; + struct recv_priv *precvpriv; + //struct mlme_priv *pmlmepriv ; + //struct dvobj_priv *pdev; + //u8 *phead, *pdata, *ptail,*pend; + + //_queue *pfree_recv_queue, *ppending_recv_queue; + //u8 blk_mode = _FALSE; + s32 ret=_SUCCESS; + //struct intf_hdl * pintfhdl; + +_func_enter_; + +// RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("+rtw_recv_entry\n")); + + padapter = precvframe->u.hdr.adapter; + //pintfhdl = &padapter->iopriv.intf; + + //pdev=&padapter->dvobjpriv; + //pmlmepriv = &padapter->mlmepriv; + precvpriv = &padapter->recvpriv; + //pfree_recv_queue = &precvpriv->free_recv_queue; + //ppending_recv_queue = &precvpriv->recv_pending_queue; + + //phead = precvframe->u.hdr.rx_head; + //pdata = precvframe->u.hdr.rx_data; + //ptail = precvframe->u.hdr.rx_tail; + //pend = precvframe->u.hdr.rx_end; + + //rtw_led_control(padapter, LED_CTL_RX); + +#ifdef CONFIG_SDIO_HCI + if (precvpriv->free_recvframe_cnt <= 1) + goto _recv_entry_drop; +#endif + +#ifdef CONFIG_RECV_THREAD_MODE + if (_rtw_queue_empty(ppending_recv_queue) == _TRUE) + { + //enqueue_recvframe_usb(precvframe, ppending_recv_queue);//enqueue to recv_pending_queue + rtw_enqueue_recvframe(precvframe, ppending_recv_queue); + _rtw_up_sema(&precvpriv->recv_sema); + } + else + { + //enqueue_recvframe_usb(precvframe, ppending_recv_queue);//enqueue to recv_pending_queue + rtw_enqueue_recvframe(precvframe, ppending_recv_queue); + } +#else + if ((ret = recv_func(padapter, precvframe)) == _FAIL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("rtw_recv_entry: recv_func return fail!!!\n")); + goto _recv_entry_drop; + } +#endif + + precvpriv->rx_pkts++; + +_func_exit_; + + return ret; + +_recv_entry_drop: + + + precvpriv->rx_drop++; + +#ifdef CONFIG_MP_INCLUDED + padapter->mppriv.rx_pktloss = precvpriv->rx_drop; +#endif + + //RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("_recv_entry_drop\n")); + +_func_exit_; + + return ret; +} + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS +RTW_DECLARE_TIMER_HDL(signal_stat){ +//void rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){ + _adapter *adapter = (_adapter *)FunctionContext; + struct recv_priv *recvpriv = &adapter->recvpriv; + + u32 tmp_s, tmp_q; + u8 avg_signal_strength = 0; + u8 avg_signal_qual = 0; + u32 num_signal_strength = 0; + u32 num_signal_qual = 0; + u8 _alpha = 3; // this value is based on converging_constant = 5000 and sampling_interval = 1000 + + if(recvpriv->signal_strength_data.update_req == 0) {// update_req is clear, means we got rx + avg_signal_strength = recvpriv->signal_strength_data.avg_val; + avg_signal_qual = recvpriv->signal_qual_data.avg_val; + } + + if(recvpriv->signal_qual_data.update_req == 0) {// update_req is clear, means we got rx + num_signal_strength = recvpriv->signal_strength_data.total_num; + num_signal_qual = recvpriv->signal_qual_data.total_num; + } + + // after avg_vals are accquired, we can re-stat the signal values + recvpriv->signal_strength_data.update_req = 1; + recvpriv->signal_qual_data.update_req = 1; + + //update value of signal_strength, rssi, signal_qual + if(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _FALSE) { + tmp_s = (avg_signal_strength+(_alpha-1)*recvpriv->signal_strength); + if(tmp_s %_alpha) + tmp_s = tmp_s/_alpha + 1; + else + tmp_s = tmp_s/_alpha; + if(tmp_s>100) + tmp_s = 100; + + tmp_q = (avg_signal_qual+(_alpha-1)*recvpriv->signal_qual); + if(tmp_q %_alpha) + tmp_q = tmp_q/_alpha + 1; + else + tmp_q = tmp_q/_alpha; + if(tmp_q>100) + tmp_q = 100; + + recvpriv->signal_strength = tmp_s; + recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s); + recvpriv->signal_qual = tmp_q; + + #if 0 + DBG_871X("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u" + ", num_signal_strength:%u, num_signal_qual:%u" + "\n" + , __FUNCTION__ + , recvpriv->signal_strength + , recvpriv->rssi + , recvpriv->signal_qual + , num_signal_strength, num_signal_qual + ); + #endif + } + + rtw_set_signal_stat_timer(recvpriv); + +} +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_rf.c b/drivers/net/wireless/rtl8192c/core/rtw_rf.c new file mode 100755 index 000000000000..665c7e5b9d15 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_rf.c @@ -0,0 +1,96 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_RF_C_ + +#include +#include +#include +#include +#include + + +struct ch_freq { + u32 channel; + u32 frequency; +}; + +struct ch_freq ch_freq_map[] = { + {1, 2412},{2, 2417},{3, 2422},{4, 2427},{5, 2432}, + {6, 2437},{7, 2442},{8, 2447},{9, 2452},{10, 2457}, + {11, 2462},{12, 2467},{13, 2472},{14, 2484}, + /* UNII */ + {36, 5180},{40, 5200},{44, 5220},{48, 5240},{52, 5260}, + {56, 5280},{60, 5300},{64, 5320},{149, 5745},{153, 5765}, + {157, 5785},{161, 5805},{165, 5825},{167, 5835},{169, 5845}, + {171, 5855},{173, 5865}, + /* HiperLAN2 */ + {100, 5500},{104, 5520},{108, 5540},{112, 5560},{116, 5580}, + {120, 5600},{124, 5620},{128, 5640},{132, 5660},{136, 5680}, + {140, 5700}, + /* Japan MMAC */ + {34, 5170},{38, 5190},{42, 5210},{46, 5230}, + /* Japan */ + {184, 4920},{188, 4940},{192, 4960},{196, 4980}, + {208, 5040},/* Japan, means J08 */ + {212, 5060},/* Japan, means J12 */ + {216, 5080},/* Japan, means J16 */ +}; + +int ch_freq_map_num = (sizeof(ch_freq_map) / sizeof(struct ch_freq)); + +u32 rtw_ch2freq(u32 channel) +{ + u8 i; + u32 freq = 0; + + for (i = 0; i < ch_freq_map_num; i++) + { + if (channel == ch_freq_map[i].channel) + { + freq = ch_freq_map[i].frequency; + break; + } + } + if (i == ch_freq_map_num) + freq = 2412; + + return freq; +} + +u32 rtw_freq2ch(u32 freq) +{ + u8 i; + u32 ch = 0; + + for (i = 0; i < ch_freq_map_num; i++) + { + if (freq == ch_freq_map[i].frequency) + { + ch = ch_freq_map[i].channel; + break; + } + } + if (i == ch_freq_map_num) + ch = 1; + + return ch; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_security.c b/drivers/net/wireless/rtl8192c/core/rtw_security.c new file mode 100755 index 000000000000..ec3a98f3f43e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_security.c @@ -0,0 +1,2811 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_SECURITY_C_ + +#include +#include +#include +#include +#include + + +//=====WEP related===== + +#define CRC32_POLY 0x04c11db7 + +struct arc4context +{ + u32 x; + u32 y; + u8 state[256]; +}; + + +static void arcfour_init(struct arc4context *parc4ctx, u8 * key,u32 key_len) +{ + u32 t, u; + u32 keyindex; + u32 stateindex; + u8 * state; + u32 counter; +_func_enter_; + state = parc4ctx->state; + parc4ctx->x = 0; + parc4ctx->y = 0; + for (counter = 0; counter < 256; counter++) + state[counter] = (u8)counter; + keyindex = 0; + stateindex = 0; + for (counter = 0; counter < 256; counter++) + { + t = state[counter]; + stateindex = (stateindex + key[keyindex] + t) & 0xff; + u = state[stateindex]; + state[stateindex] = (u8)t; + state[counter] = (u8)u; + if (++keyindex >= key_len) + keyindex = 0; + } +_func_exit_; +} +static u32 arcfour_byte( struct arc4context *parc4ctx) +{ + u32 x; + u32 y; + u32 sx, sy; + u8 * state; +_func_enter_; + state = parc4ctx->state; + x = (parc4ctx->x + 1) & 0xff; + sx = state[x]; + y = (sx + parc4ctx->y) & 0xff; + sy = state[y]; + parc4ctx->x = x; + parc4ctx->y = y; + state[y] = (u8)sx; + state[x] = (u8)sy; +_func_exit_; + return state[(sx + sy) & 0xff]; +} + + +static void arcfour_encrypt( struct arc4context *parc4ctx, + u8 * dest, + u8 * src, + u32 len) +{ + u32 i; +_func_enter_; + for (i = 0; i < len; i++) + dest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx); +_func_exit_; +} + +static sint bcrc32initialized = 0; +static u32 crc32_table[256]; + + +static u8 crc32_reverseBit( u8 data) +{ + return( (u8)((data<<7)&0x80) | ((data<<5)&0x40) | ((data<<3)&0x20) | ((data<<1)&0x10) | ((data>>1)&0x08) | ((data>>3)&0x04) | ((data>>5)&0x02) | ((data>>7)&0x01) ); +} + +static void crc32_init(void) +{ +_func_enter_; + if (bcrc32initialized == 1) + goto exit; + else{ + sint i, j; + u32 c; + u8 *p=(u8 *)&c, *p1; + u8 k; + + c = 0x12340000; + + for (i = 0; i < 256; ++i) + { + k = crc32_reverseBit((u8)i); + for (c = ((u32)k) << 24, j = 8; j > 0; --j){ + c = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1); + } + p1 = (u8 *)&crc32_table[i]; + + p1[0] = crc32_reverseBit(p[3]); + p1[1] = crc32_reverseBit(p[2]); + p1[2] = crc32_reverseBit(p[1]); + p1[3] = crc32_reverseBit(p[0]); + } + bcrc32initialized= 1; + } +exit: +_func_exit_; +} + +static u32 getcrc32(u8 *buf, sint len) +{ + u8 *p; + u32 crc; +_func_enter_; + if (bcrc32initialized == 0) crc32_init(); + + crc = 0xffffffff; /* preload shift register, per CRC-32 spec */ + + for (p = buf; len > 0; ++p, --len) + { + crc = crc32_table[ (crc ^ *p) & 0xff] ^ (crc >> 8); + } +_func_exit_; + return ~crc; /* transmit complement, per CRC-32 spec */ +} + + +/* + Need to consider the fragment situation +*/ +void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe) +{ // exclude ICV + + unsigned char crc[4]; + struct arc4context mycontext; + + sint curfragnum,length; + u32 keylength; + + u8 *pframe, *payload,*iv; //,*wepkey + u8 wepkey[16]; + struct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + +_func_enter_; + + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; +#endif + + //start to encrypt each fragment + if((pattrib->encrypt==_WEP40_)||(pattrib->encrypt==_WEP104_)) + { + keylength=psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex]; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++) + { + iv=pframe+pattrib->hdrlen; + _rtw_memcpy(&wepkey[0], iv, 3); + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); + payload=pframe+pattrib->iv_len+pattrib->hdrlen; + + if((curfragnum+1)==pattrib->nr_frags) + { //the last fragment + + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; + + *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); + + arcfour_init(&mycontext, wepkey,3+keylength); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + } + else + { + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; + *((unsigned long *)crc)=cpu_to_le32(getcrc32(payload,length)); + arcfour_init(&mycontext, wepkey,3+keylength); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + pframe+=pxmitpriv->frag_len; + pframe=(u8 *)RND4((SIZE_PTR)(pframe)); + + } + + } + + } + +_func_exit_; + +} + +void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe) +{ + // exclude ICV + u8 crc[4]; + struct arc4context mycontext; + sint length; + u32 keylength; + u8 *pframe, *payload,*iv,wepkey[16]; + u8 keyindex; + struct rx_pkt_attrib *prxattrib = &(((union recv_frame*)precvframe)->u.hdr.attrib); + struct security_priv *psecuritypriv=&padapter->securitypriv; + +_func_enter_; + + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + + //start to decrypt recvframe + if((prxattrib->encrypt==_WEP40_)||(prxattrib->encrypt==_WEP104_)) + { + iv=pframe+prxattrib->hdrlen; + //keyindex=(iv[3]&0x3); + keyindex = prxattrib->key_index; + keylength=psecuritypriv->dot11DefKeylen[keyindex]; + _rtw_memcpy(&wepkey[0], iv, 3); + //_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength); + _rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0],keylength); + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + + payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; + + //decrypt payload include icv + arcfour_init(&mycontext, wepkey,3+keylength); + arcfour_encrypt(&mycontext, payload, payload, length); + + //calculate icv and compare the icv + *((unsigned long *)crc)=le32_to_cpu(getcrc32(payload,length-4)); + + if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) + { + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", + crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); + } + + } + +_func_exit_; + + return; + +} + +//3 =====TKIP related===== + +static u32 secmicgetuint32( u8 * p ) +// Convert from Byte[] to Us4Byte32 in a portable way +{ + s32 i; + u32 res = 0; +_func_enter_; + for( i=0; i<4; i++ ) + { + res |= ((u32)(*p++)) << (8*i); + } +_func_exit_; + return res; +} + +static void secmicputuint32( u8 * p, u32 val ) +// Convert from Us4Byte32 to Byte[] in a portable way +{ + long i; +_func_enter_; + for( i=0; i<4; i++ ) + { + *p++ = (u8) (val & 0xff); + val >>= 8; + } +_func_exit_; +} + +static void secmicclear(struct mic_data *pmicdata) +{ +// Reset the state to the empty message. +_func_enter_; + pmicdata->L = pmicdata->K0; + pmicdata->R = pmicdata->K1; + pmicdata->nBytesInM = 0; + pmicdata->M = 0; +_func_exit_; +} + +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ) +{ + // Set the key +_func_enter_; + pmicdata->K0 = secmicgetuint32( key ); + pmicdata->K1 = secmicgetuint32( key + 4 ); + // and reset the message + secmicclear(pmicdata); +_func_exit_; +} + +void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ) +{ +_func_enter_; + // Append the byte to our word-sized buffer + pmicdata->M |= ((unsigned long)b) << (8*pmicdata->nBytesInM); + pmicdata->nBytesInM++; + // Process the word if it is full. + if( pmicdata->nBytesInM >= 4 ) + { + pmicdata->L ^= pmicdata->M; + pmicdata->R ^= ROL32( pmicdata->L, 17 ); + pmicdata->L += pmicdata->R; + pmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8); + pmicdata->L += pmicdata->R; + pmicdata->R ^= ROL32( pmicdata->L, 3 ); + pmicdata->L += pmicdata->R; + pmicdata->R ^= ROR32( pmicdata->L, 2 ); + pmicdata->L += pmicdata->R; + // Clear the buffer + pmicdata->M = 0; + pmicdata->nBytesInM = 0; + } +_func_exit_; +} + +void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes ) +{ +_func_enter_; + // This is simple + while( nbytes > 0 ) + { + rtw_secmicappendbyte(pmicdata, *src++ ); + nbytes--; + } +_func_exit_; +} + +void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ) +{ +_func_enter_; + // Append the minimum padding + rtw_secmicappendbyte(pmicdata, 0x5a ); + rtw_secmicappendbyte(pmicdata, 0 ); + rtw_secmicappendbyte(pmicdata, 0 ); + rtw_secmicappendbyte(pmicdata, 0 ); + rtw_secmicappendbyte(pmicdata, 0 ); + // and then zeroes until the length is a multiple of 4 + while( pmicdata->nBytesInM != 0 ) + { + rtw_secmicappendbyte(pmicdata, 0 ); + } + // The appendByte function has already computed the result. + secmicputuint32( dst, pmicdata->L ); + secmicputuint32( dst+4, pmicdata->R ); + // Reset to the empty message. + secmicclear(pmicdata); +_func_exit_; +} + + +void rtw_seccalctkipmic(u8 * key,u8 *header,u8 *data,u32 data_len,u8 *mic_code, u8 pri) +{ + + struct mic_data micdata; + u8 priority[4]={0x0,0x0,0x0,0x0}; +_func_enter_; + rtw_secmicsetkey(&micdata, key); + priority[0]=pri; + + /* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */ + if(header[1]&1){ //ToDS==1 + rtw_secmicappend(&micdata, &header[16], 6); //DA + if(header[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &header[24], 6); + else + rtw_secmicappend(&micdata, &header[10], 6); + } + else{ //ToDS==0 + rtw_secmicappend(&micdata, &header[4], 6); //DA + if(header[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &header[16], 6); + else + rtw_secmicappend(&micdata, &header[10], 6); + + } + rtw_secmicappend(&micdata, &priority[0], 4); + + + rtw_secmicappend(&micdata, data, data_len); + + rtw_secgetmic(&micdata,mic_code); +_func_exit_; +} + + + + +/* macros for extraction/creation of unsigned char/unsigned short values */ +#define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15)) +#define Lo8(v16) ((u8)( (v16) & 0x00FF)) +#define Hi8(v16) ((u8)(((v16) >> 8) & 0x00FF)) +#define Lo16(v32) ((u16)( (v32) & 0xFFFF)) +#define Hi16(v32) ((u16)(((v32) >>16) & 0xFFFF)) +#define Mk16(hi,lo) ((lo) ^ (((u16)(hi)) << 8)) + +/* select the Nth 16-bit word of the temporal key unsigned char array TK[] */ +#define TK16(N) Mk16(tk[2*(N)+1],tk[2*(N)]) + +/* S-box lookup: 16 bits --> 16 bits */ +#define _S_(v16) (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)]) + +/* fixed algorithm "parameters" */ +#define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */ +#define TA_SIZE 6 /* 48-bit transmitter address */ +#define TK_SIZE 16 /* 128-bit temporal key */ +#define P1K_SIZE 10 /* 80-bit Phase1 key */ +#define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */ + + +/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */ +static const unsigned short Sbox1[2][256]= /* Sbox for hash (can be in ROM) */ +{ { + 0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154, + 0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A, + 0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B, + 0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B, + 0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F, + 0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F, + 0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5, + 0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F, + 0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB, + 0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397, + 0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED, + 0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A, + 0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194, + 0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3, + 0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104, + 0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D, + 0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39, + 0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695, + 0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83, + 0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76, + 0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4, + 0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B, + 0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0, + 0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018, + 0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751, + 0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85, + 0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12, + 0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9, + 0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7, + 0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A, + 0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8, + 0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A, + }, + + + { /* second half of table is unsigned char-reversed version of first! */ + 0xA5C6,0x84F8,0x99EE,0x8DF6,0x0DFF,0xBDD6,0xB1DE,0x5491, + 0x5060,0x0302,0xA9CE,0x7D56,0x19E7,0x62B5,0xE64D,0x9AEC, + 0x458F,0x9D1F,0x4089,0x87FA,0x15EF,0xEBB2,0xC98E,0x0BFB, + 0xEC41,0x67B3,0xFD5F,0xEA45,0xBF23,0xF753,0x96E4,0x5B9B, + 0xC275,0x1CE1,0xAE3D,0x6A4C,0x5A6C,0x417E,0x02F5,0x4F83, + 0x5C68,0xF451,0x34D1,0x08F9,0x93E2,0x73AB,0x5362,0x3F2A, + 0x0C08,0x5295,0x6546,0x5E9D,0x2830,0xA137,0x0F0A,0xB52F, + 0x090E,0x3624,0x9B1B,0x3DDF,0x26CD,0x694E,0xCD7F,0x9FEA, + 0x1B12,0x9E1D,0x7458,0x2E34,0x2D36,0xB2DC,0xEEB4,0xFB5B, + 0xF6A4,0x4D76,0x61B7,0xCE7D,0x7B52,0x3EDD,0x715E,0x9713, + 0xF5A6,0x68B9,0x0000,0x2CC1,0x6040,0x1FE3,0xC879,0xEDB6, + 0xBED4,0x468D,0xD967,0x4B72,0xDE94,0xD498,0xE8B0,0x4A85, + 0x6BBB,0x2AC5,0xE54F,0x16ED,0xC586,0xD79A,0x5566,0x9411, + 0xCF8A,0x10E9,0x0604,0x81FE,0xF0A0,0x4478,0xBA25,0xE34B, + 0xF3A2,0xFE5D,0xC080,0x8A05,0xAD3F,0xBC21,0x4870,0x04F1, + 0xDF63,0xC177,0x75AF,0x6342,0x3020,0x1AE5,0x0EFD,0x6DBF, + 0x4C81,0x1418,0x3526,0x2FC3,0xE1BE,0xA235,0xCC88,0x392E, + 0x5793,0xF255,0x82FC,0x477A,0xACC8,0xE7BA,0x2B32,0x95E6, + 0xA0C0,0x9819,0xD19E,0x7FA3,0x6644,0x7E54,0xAB3B,0x830B, + 0xCA8C,0x29C7,0xD36B,0x3C28,0x79A7,0xE2BC,0x1D16,0x76AD, + 0x3BDB,0x5664,0x4E74,0x1E14,0xDB92,0x0A0C,0x6C48,0xE4B8, + 0x5D9F,0x6EBD,0xEF43,0xA6C4,0xA839,0xA431,0x37D3,0x8BF2, + 0x32D5,0x438B,0x596E,0xB7DA,0x8C01,0x64B1,0xD29C,0xE049, + 0xB4D8,0xFAAC,0x07F3,0x25CF,0xAFCA,0x8EF4,0xE947,0x1810, + 0xD56F,0x88F0,0x6F4A,0x725C,0x2438,0xF157,0xC773,0x5197, + 0x23CB,0x7CA1,0x9CE8,0x213E,0xDD96,0xDC61,0x860D,0x850F, + 0x90E0,0x427C,0xC471,0xAACC,0xD890,0x0506,0x01F7,0x121C, + 0xA3C2,0x5F6A,0xF9AE,0xD069,0x9117,0x5899,0x273A,0xB927, + 0x38D9,0x13EB,0xB32B,0x3322,0xBBD2,0x70A9,0x8907,0xA733, + 0xB62D,0x223C,0x9215,0x20C9,0x4987,0xFFAA,0x7850,0x7AA5, + 0x8F03,0xF859,0x8009,0x171A,0xDA65,0x31D7,0xC684,0xB8D0, + 0xC382,0xB029,0x775A,0x111E,0xCB7B,0xFCA8,0xD66D,0x3A2C, + } +}; + + /* +********************************************************************** +* Routine: Phase 1 -- generate P1K, given TA, TK, IV32 +* +* Inputs: +* tk[] = temporal key [128 bits] +* ta[] = transmitter's MAC address [ 48 bits] +* iv32 = upper 32 bits of IV [ 32 bits] +* Output: +* p1k[] = Phase 1 key [ 80 bits] +* +* Note: +* This function only needs to be called every 2**16 packets, +* although in theory it could be called every packet. +* +********************************************************************** +*/ +static void phase1(u16 *p1k,const u8 *tk,const u8 *ta,u32 iv32) +{ + sint i; +_func_enter_; + /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */ + p1k[0] = Lo16(iv32); + p1k[1] = Hi16(iv32); + p1k[2] = Mk16(ta[1],ta[0]); /* use TA[] as little-endian */ + p1k[3] = Mk16(ta[3],ta[2]); + p1k[4] = Mk16(ta[5],ta[4]); + + /* Now compute an unbalanced Feistel cipher with 80-bit block */ + /* size on the 80-bit block P1K[], using the 128-bit key TK[] */ + for (i=0; i < PHASE1_LOOP_CNT ;i++) + { /* Each add operation here is mod 2**16 */ + p1k[0] += _S_(p1k[4] ^ TK16((i&1)+0)); + p1k[1] += _S_(p1k[0] ^ TK16((i&1)+2)); + p1k[2] += _S_(p1k[1] ^ TK16((i&1)+4)); + p1k[3] += _S_(p1k[2] ^ TK16((i&1)+6)); + p1k[4] += _S_(p1k[3] ^ TK16((i&1)+0)); + p1k[4] += (unsigned short)i; /* avoid "slide attacks" */ + } +_func_exit_; +} + + +/* +********************************************************************** +* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16 +* +* Inputs: +* tk[] = Temporal key [128 bits] +* p1k[] = Phase 1 output key [ 80 bits] +* iv16 = low 16 bits of IV counter [ 16 bits] +* Output: +* rc4key[] = the key used to encrypt the packet [128 bits] +* +* Note: +* The value {TA,IV32,IV16} for Phase1/Phase2 must be unique +* across all packets using the same key TK value. Then, for a +* given value of TK[], this TKIP48 construction guarantees that +* the final RC4KEY value is unique across all packets. +* +* Suggested implementation optimization: if PPK[] is "overlaid" +* appropriately on RC4KEY[], there is no need for the final +* for loop below that copies the PPK[] result into RC4KEY[]. +* +********************************************************************** +*/ +static void phase2(u8 *rc4key,const u8 *tk,const u16 *p1k,u16 iv16) +{ + sint i; + u16 PPK[6]; /* temporary key for mixing */ +_func_enter_; + /* Note: all adds in the PPK[] equations below are mod 2**16 */ + for (i=0;i<5;i++) PPK[i]=p1k[i]; /* first, copy P1K to PPK */ + PPK[5] = p1k[4] +iv16; /* next, add in IV16 */ + + /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */ + PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */ + PPK[1] += _S_(PPK[0] ^ TK16(1)); + PPK[2] += _S_(PPK[1] ^ TK16(2)); + PPK[3] += _S_(PPK[2] ^ TK16(3)); + PPK[4] += _S_(PPK[3] ^ TK16(4)); + PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */ + + /* Final sweep: bijective, "linear". Rotates kill LSB correlations */ + PPK[0] += RotR1(PPK[5] ^ TK16(6)); + PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */ + PPK[2] += RotR1(PPK[1]); + PPK[3] += RotR1(PPK[2]); + PPK[4] += RotR1(PPK[3]); + PPK[5] += RotR1(PPK[4]); + /* Note: At this point, for a given key TK[0..15], the 96-bit output */ + /* value PPK[0..5] is guaranteed to be unique, as a function */ + /* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */ + /* is now a keyed permutation of {TA,IV32,IV16}. */ + + /* Set RC4KEY[0..3], which includes "cleartext" portion of RC4 key */ + rc4key[0] = Hi8(iv16); /* RC4KEY[0..2] is the WEP IV */ + rc4key[1] =(Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys */ + rc4key[2] = Lo8(iv16); + rc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1); + + + /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */ + for (i=0;i<6;i++) + { + rc4key[4+2*i] = Lo8(PPK[i]); + rc4key[5+2*i] = Hi8(PPK[i]); + } +_func_exit_; +} + + +//The hlen isn't include the IV +u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe) +{ // exclude ICV + u16 pnl; + u32 pnh; + u8 rc4key[16]; + u8 ttkey[16]; + u8 crc[4]; + struct arc4context mycontext; + sint curfragnum,length; + u32 prwskeylen; + + u8 *pframe, *payload,*iv,*prwskey; + union pn48 dot11txpn; + struct sta_info *stainfo; + struct pkt_attrib *pattrib = &((struct xmit_frame *)pxmitframe)->attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + u32 res=_SUCCESS; +_func_enter_; + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return _FAIL; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; +#endif + + //4 start to encrypt each fragment + if(pattrib->encrypt==_TKIP_){ + + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); + } + + if (stainfo!=NULL){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo!=NULL!!!\n")); + + if(IS_MCAST(pattrib->ra)) + { + prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + } + else + { + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + } + + prwskeylen=16; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++){ + iv=pframe+pattrib->hdrlen; + payload=pframe+pattrib->iv_len+pattrib->hdrlen; + + GET_TKIP_PN(iv, dot11txpn); + + pnl=(u16)(dot11txpn.val); + pnh=(u32)(dot11txpn.val>>16); + + phase1((u16 *)&ttkey[0],prwskey,&pattrib->ta[0],pnh); + + phase2(&rc4key[0],prwskey,(u16 *)&ttkey[0],pnl); + + if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; + RT_TRACE(_module_rtl871x_security_c_,_drv_info_,("pattrib->iv_len =%x, pattrib->icv_len =%x\n", pattrib->iv_len,pattrib->icv_len)); + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ + + arcfour_init(&mycontext, rc4key,16); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + } + else{ + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; + *((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/ + arcfour_init(&mycontext,rc4key,16); + arcfour_encrypt(&mycontext, payload, payload, length); + arcfour_encrypt(&mycontext, payload+length, crc, 4); + + pframe+=pxmitpriv->frag_len; + pframe=(u8 *)RND4((SIZE_PTR)(pframe)); + + } + } + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } +_func_exit_; + return res; + +} + + +//The hlen isn't include the IV +u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe) +{ // exclude ICV + u16 pnl; + u32 pnh; + u8 rc4key[16]; + u8 ttkey[16]; + u8 crc[4]; + struct arc4context mycontext; + sint length; + u32 prwskeylen; + + u8 *pframe, *payload,*iv,*prwskey; + union pn48 dot11txpn; + struct sta_info *stainfo; + struct rx_pkt_attrib *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; +// struct recv_priv *precvpriv=&padapter->recvpriv; + u32 res=_SUCCESS; + +_func_enter_; + + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + + //4 start to decrypt recvframe + if(prxattrib->encrypt==_TKIP_){ + + stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); + if (stainfo!=NULL){ + + if(IS_MCAST(prxattrib->ra)) + { + DBG_871X("rx bc/mc packets, to perform sw rtw_tkip_decrypt\n"); + //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; + prwskeylen=16; + } + else + { + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n")); + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + prwskeylen=16; + } + + iv=pframe+prxattrib->hdrlen; + payload=pframe+prxattrib->iv_len+prxattrib->hdrlen; + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + + GET_TKIP_PN(iv, dot11txpn); + + pnl=(u16)(dot11txpn.val); + pnh=(u32)(dot11txpn.val>>16); + + phase1((u16 *)&ttkey[0],prwskey,&prxattrib->ta[0],pnh); + phase2(&rc4key[0],prwskey,(unsigned short *)&ttkey[0],pnl); + + //4 decrypt payload include icv + + arcfour_init(&mycontext, rc4key,16); + arcfour_encrypt(&mycontext, payload, payload, length); + + *((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4)); + + if(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4]) + { + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n", + crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4])); + res=_FAIL; + } + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } +_func_exit_; + return res; + +} + + +//3 =====AES related===== + + + +#define MAX_MSG_SIZE 2048 +/*****************************/ +/******** SBOX Table *********/ +/*****************************/ + + static u8 sbox_table[256] = + { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + }; + +/*****************************/ +/**** Function Prototypes ****/ +/*****************************/ + +static void bitwise_xor(u8 *ina, u8 *inb, u8 *out); +static void construct_mic_iv( + u8 *mic_header1, + sint qc_exists, + sint a4_exists, + u8 *mpdu, + uint payload_length, + u8 * pn_vector); +static void construct_mic_header1( + u8 *mic_header1, + sint header_length, + u8 *mpdu); +static void construct_mic_header2( + u8 *mic_header2, + u8 *mpdu, + sint a4_exists, + sint qc_exists); +static void construct_ctr_preload( + u8 *ctr_preload, + sint a4_exists, + sint qc_exists, + u8 *mpdu, + u8 *pn_vector, + sint c); +static void xor_128(u8 *a, u8 *b, u8 *out); +static void xor_32(u8 *a, u8 *b, u8 *out); +static u8 sbox(u8 a); +static void next_key(u8 *key, sint round); +static void byte_sub(u8 *in, u8 *out); +static void shift_row(u8 *in, u8 *out); +static void mix_column(u8 *in, u8 *out); +static void add_round_key( u8 *shiftrow_in, + u8 *mcol_in, + u8 *block_in, + sint round, + u8 *out); +static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext); + + +/****************************************/ +/* aes128k128d() */ +/* Performs a 128 bit AES encrypt with */ +/* 128 bit data. */ +/****************************************/ +static void xor_128(u8 *a, u8 *b, u8 *out) +{ + sint i; +_func_enter_; + for (i=0;i<16; i++) + { + out[i] = a[i] ^ b[i]; + } +_func_exit_; +} + + +static void xor_32(u8 *a, u8 *b, u8 *out) +{ + sint i; +_func_enter_; + for (i=0;i<4; i++) + { + out[i] = a[i] ^ b[i]; + } +_func_exit_; +} + + +static u8 sbox(u8 a) +{ + return sbox_table[(sint)a]; +} + + +static void next_key(u8 *key, sint round) +{ + u8 rcon; + u8 sbox_key[4]; + u8 rcon_table[12] = + { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x1b, 0x36, 0x36, 0x36 + }; +_func_enter_; + sbox_key[0] = sbox(key[13]); + sbox_key[1] = sbox(key[14]); + sbox_key[2] = sbox(key[15]); + sbox_key[3] = sbox(key[12]); + + rcon = rcon_table[round]; + + xor_32(&key[0], sbox_key, &key[0]); + key[0] = key[0] ^ rcon; + + xor_32(&key[4], &key[0], &key[4]); + xor_32(&key[8], &key[4], &key[8]); + xor_32(&key[12], &key[8], &key[12]); +_func_exit_; +} + + +static void byte_sub(u8 *in, u8 *out) +{ + sint i; +_func_enter_; + for (i=0; i< 16; i++) + { + out[i] = sbox(in[i]); + } +_func_exit_; +} + + +static void shift_row(u8 *in, u8 *out) +{ +_func_enter_; + out[0] = in[0]; + out[1] = in[5]; + out[2] = in[10]; + out[3] = in[15]; + out[4] = in[4]; + out[5] = in[9]; + out[6] = in[14]; + out[7] = in[3]; + out[8] = in[8]; + out[9] = in[13]; + out[10] = in[2]; + out[11] = in[7]; + out[12] = in[12]; + out[13] = in[1]; + out[14] = in[6]; + out[15] = in[11]; +_func_exit_; +} + + +static void mix_column(u8 *in, u8 *out) +{ + sint i; + u8 add1b[4]; + u8 add1bf7[4]; + u8 rotl[4]; + u8 swap_halfs[4]; + u8 andf7[4]; + u8 rotr[4]; + u8 temp[4]; + u8 tempb[4]; +_func_enter_; + for (i=0 ; i<4; i++) + { + if ((in[i] & 0x80)== 0x80) + add1b[i] = 0x1b; + else + add1b[i] = 0x00; + } + + swap_halfs[0] = in[2]; /* Swap halfs */ + swap_halfs[1] = in[3]; + swap_halfs[2] = in[0]; + swap_halfs[3] = in[1]; + + rotl[0] = in[3]; /* Rotate left 8 bits */ + rotl[1] = in[0]; + rotl[2] = in[1]; + rotl[3] = in[2]; + + andf7[0] = in[0] & 0x7f; + andf7[1] = in[1] & 0x7f; + andf7[2] = in[2] & 0x7f; + andf7[3] = in[3] & 0x7f; + + for (i = 3; i>0; i--) /* logical shift left 1 bit */ + { + andf7[i] = andf7[i] << 1; + if ((andf7[i-1] & 0x80) == 0x80) + { + andf7[i] = (andf7[i] | 0x01); + } + } + andf7[0] = andf7[0] << 1; + andf7[0] = andf7[0] & 0xfe; + + xor_32(add1b, andf7, add1bf7); + + xor_32(in, add1bf7, rotr); + + temp[0] = rotr[0]; /* Rotate right 8 bits */ + rotr[0] = rotr[1]; + rotr[1] = rotr[2]; + rotr[2] = rotr[3]; + rotr[3] = temp[0]; + + xor_32(add1bf7, rotr, temp); + xor_32(swap_halfs, rotl,tempb); + xor_32(temp, tempb, out); +_func_exit_; +} + + +static void aes128k128d(u8 *key, u8 *data, u8 *ciphertext) +{ + sint round; + sint i; + u8 intermediatea[16]; + u8 intermediateb[16]; + u8 round_key[16]; +_func_enter_; + for(i=0; i<16; i++) round_key[i] = key[i]; + + for (round = 0; round < 11; round++) + { + if (round == 0) + { + xor_128(round_key, data, ciphertext); + next_key(round_key, round); + } + else if (round == 10) + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + xor_128(intermediateb, round_key, ciphertext); + } + else /* 1 - 9 */ + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + mix_column(&intermediateb[0], &intermediatea[0]); + mix_column(&intermediateb[4], &intermediatea[4]); + mix_column(&intermediateb[8], &intermediatea[8]); + mix_column(&intermediateb[12], &intermediatea[12]); + xor_128(intermediatea, round_key, ciphertext); + next_key(round_key, round); + } + } +_func_exit_; +} + + +/************************************************/ +/* construct_mic_iv() */ +/* Builds the MIC IV from header fields and PN */ +/************************************************/ +static void construct_mic_iv( + u8 *mic_iv, + sint qc_exists, + sint a4_exists, + u8 *mpdu, + uint payload_length, + u8 *pn_vector + ) +{ + sint i; +_func_enter_; + mic_iv[0] = 0x59; + if (qc_exists && a4_exists) mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ + if (qc_exists && !a4_exists) mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ + if (!qc_exists) mic_iv[1] = 0x00; + for (i = 2; i < 8; i++) + mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ + #ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */ + #else + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ + #endif + mic_iv[14] = (unsigned char) (payload_length / 256); + mic_iv[15] = (unsigned char) (payload_length % 256); +_func_exit_; +} + + +/************************************************/ +/* construct_mic_header1() */ +/* Builds the first MIC header block from */ +/* header fields. */ +/************************************************/ +static void construct_mic_header1( + u8 *mic_header1, + sint header_length, + u8 *mpdu + ) +{ +_func_enter_; + mic_header1[0] = (u8)((header_length - 2) / 256); + mic_header1[1] = (u8)((header_length - 2) % 256); + mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ + mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ + mic_header1[4] = mpdu[4]; /* A1 */ + mic_header1[5] = mpdu[5]; + mic_header1[6] = mpdu[6]; + mic_header1[7] = mpdu[7]; + mic_header1[8] = mpdu[8]; + mic_header1[9] = mpdu[9]; + mic_header1[10] = mpdu[10]; /* A2 */ + mic_header1[11] = mpdu[11]; + mic_header1[12] = mpdu[12]; + mic_header1[13] = mpdu[13]; + mic_header1[14] = mpdu[14]; + mic_header1[15] = mpdu[15]; +_func_exit_; +} + + +/************************************************/ +/* construct_mic_header2() */ +/* Builds the last MIC header block from */ +/* header fields. */ +/************************************************/ +static void construct_mic_header2( + u8 *mic_header2, + u8 *mpdu, + sint a4_exists, + sint qc_exists + ) +{ + sint i; +_func_enter_; + for (i = 0; i<16; i++) mic_header2[i]=0x00; + + mic_header2[0] = mpdu[16]; /* A3 */ + mic_header2[1] = mpdu[17]; + mic_header2[2] = mpdu[18]; + mic_header2[3] = mpdu[19]; + mic_header2[4] = mpdu[20]; + mic_header2[5] = mpdu[21]; + + //mic_header2[6] = mpdu[22] & 0xf0; /* SC */ + mic_header2[6] = 0x00; + mic_header2[7] = 0x00; /* mpdu[23]; */ + + + if (!qc_exists && a4_exists) + { + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + + } + + if (qc_exists && !a4_exists) + { + mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ + mic_header2[9] = mpdu[25] & 0x00; + } + + if (qc_exists && a4_exists) + { + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + + mic_header2[14] = mpdu[30] & 0x0f; + mic_header2[15] = mpdu[31] & 0x00; + } + +_func_exit_; +} + + +/************************************************/ +/* construct_mic_header2() */ +/* Builds the last MIC header block from */ +/* header fields. */ +/************************************************/ +static void construct_ctr_preload( + u8 *ctr_preload, + sint a4_exists, + sint qc_exists, + u8 *mpdu, + u8 *pn_vector, + sint c + ) +{ + sint i = 0; +_func_enter_; + for (i=0; i<16; i++) ctr_preload[i] = 0x00; + i = 0; + + ctr_preload[0] = 0x01; /* flag */ + if (qc_exists && a4_exists) + ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ + if (qc_exists && !a4_exists) + ctr_preload[1] = mpdu[24] & 0x0f; + + for (i = 2; i < 8; i++) + ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ + #ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */ + #else + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ + #endif + ctr_preload[14] = (unsigned char) (c / 256); /* Ctr */ + ctr_preload[15] = (unsigned char) (c % 256); +_func_exit_; +} + + +/************************************/ +/* bitwise_xor() */ +/* A 128 bit, bitwise exclusive or */ +/************************************/ +static void bitwise_xor(u8 *ina, u8 *inb, u8 *out) +{ + sint i; +_func_enter_; + for (i=0; i<16; i++) + { + out[i] = ina[i] ^ inb[i]; + } +_func_exit_; +} + + +static sint aes_cipher(u8 *key, uint hdrlen, + u8 *pframe, uint plen) +{ +// /*static*/ unsigned char message[MAX_MSG_SIZE]; + uint qc_exists, a4_exists, i, j, payload_remainder, + num_blocks, payload_index; + + u8 pn_vector[6]; + u8 mic_iv[16]; + u8 mic_header1[16]; + u8 mic_header2[16]; + u8 ctr_preload[16]; + + /* Intermediate Buffers */ + u8 chain_buffer[16]; + u8 aes_out[16]; + u8 padded_buffer[16]; + u8 mic[8]; +// uint offset = 0; + uint frtype = GetFrameType(pframe); + uint frsubtype = GetFrameSubType(pframe); + +_func_enter_; + frsubtype=frsubtype>>4; + + + _rtw_memset((void *)mic_iv, 0, 16); + _rtw_memset((void *)mic_header1, 0, 16); + _rtw_memset((void *)mic_header2, 0, 16); + _rtw_memset((void *)ctr_preload, 0, 16); + _rtw_memset((void *)chain_buffer, 0, 16); + _rtw_memset((void *)aes_out, 0, 16); + _rtw_memset((void *)padded_buffer, 0, 16); + + if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) + a4_exists = 0; + else + a4_exists = 1; + + if ( + (frtype == WIFI_DATA_CFACK) || + (frtype == WIFI_DATA_CFPOLL)|| + (frtype == WIFI_DATA_CFACKPOLL)) + { + qc_exists = 1; + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + } + else if ( + (frsubtype == 0x08) || + (frsubtype == 0x09)|| + (frsubtype == 0x0a)|| + (frsubtype == 0x0b)) + { + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + qc_exists = 1; + } + else + qc_exists = 0; + + pn_vector[0]=pframe[hdrlen]; + pn_vector[1]=pframe[hdrlen+1]; + pn_vector[2]=pframe[hdrlen+4]; + pn_vector[3]=pframe[hdrlen+5]; + pn_vector[4]=pframe[hdrlen+6]; + pn_vector[5]=pframe[hdrlen+7]; + + construct_mic_iv( + mic_iv, + qc_exists, + a4_exists, + pframe, //message, + plen, + pn_vector + ); + + construct_mic_header1( + mic_header1, + hdrlen, + pframe //message + ); + construct_mic_header2( + mic_header2, + pframe, //message, + a4_exists, + qc_exists + ); + + + payload_remainder = plen % 16; + num_blocks = plen / 16; + + /* Find start of payload */ + payload_index = (hdrlen + 8); + + /* Calculate MIC */ + aes128k128d(key, mic_iv, aes_out); + bitwise_xor(aes_out, mic_header1, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + bitwise_xor(aes_out, mic_header2, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + + for (i = 0; i < num_blocks; i++) + { + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); + + payload_index += 16; + aes128k128d(key, chain_buffer, aes_out); + } + + /* Add on the final payload block if it needs padding */ + if (payload_remainder > 0) + { + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = pframe[payload_index++];//padded_buffer[j] = message[payload_index++]; + } + bitwise_xor(aes_out, padded_buffer, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + + } + + for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; + + /* Insert MIC into payload */ + for (j = 0; j < 8; j++) + pframe[payload_index+j] = mic[j]; //message[payload_index+j] = mic[j]; + + payload_index = hdrlen + 8; + for (i=0; i< num_blocks; i++) + { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, //message, + pn_vector, + i+1); + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer); + for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; + } + + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ + { /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, //message, + pn_vector, + num_blocks+1); + + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = pframe[payload_index+j];//padded_buffer[j] = message[payload_index+j]; + } + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, padded_buffer, chain_buffer); + for (j=0; jattrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + +// uint offset = 0; + u32 res=_SUCCESS; +_func_enter_; + + if(((struct xmit_frame*)pxmitframe)->buf_addr==NULL) + return _FAIL; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE + + (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET; +#endif + + //4 start to encrypt each fragment + if((pattrib->encrypt==_AES_)){ + + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] ); + } + + if (stainfo!=NULL){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo!=NULL!!!\n")); + + if(IS_MCAST(pattrib->ra)) + { + prwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + } + else + { + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + } + + prwskeylen=16; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++){ + + if((curfragnum+1)==pattrib->nr_frags){ //4 the last fragment + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len; + + aes_cipher(prwskey,pattrib->hdrlen,pframe, length); + } + else{ + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ; + + aes_cipher(prwskey,pattrib->hdrlen,pframe, length); + pframe+=pxmitpriv->frag_len; + pframe=(u8*)RND4((SIZE_PTR)(pframe)); + + } + } + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } + + + +_func_exit_; + return res; +} + +static sint aes_decipher(u8 *key, uint hdrlen, + u8 *pframe, uint plen) +{ + static u8 message[MAX_MSG_SIZE]; + uint qc_exists, a4_exists, i, j, payload_remainder, + num_blocks, payload_index; + + u8 pn_vector[6]; + u8 mic_iv[16]; + u8 mic_header1[16]; + u8 mic_header2[16]; + u8 ctr_preload[16]; + + /* Intermediate Buffers */ + u8 chain_buffer[16]; + u8 aes_out[16]; + u8 padded_buffer[16]; + u8 mic[8]; + + +// uint offset = 0; + uint frtype = GetFrameType(pframe); + uint frsubtype = GetFrameSubType(pframe); +_func_enter_; + frsubtype=frsubtype>>4; + + + _rtw_memset((void *)mic_iv, 0, 16); + _rtw_memset((void *)mic_header1, 0, 16); + _rtw_memset((void *)mic_header2, 0, 16); + _rtw_memset((void *)ctr_preload, 0, 16); + _rtw_memset((void *)chain_buffer, 0, 16); + _rtw_memset((void *)aes_out, 0, 16); + _rtw_memset((void *)padded_buffer, 0, 16); + + //start to decrypt the payload + + num_blocks = (plen-8) / 16; //(plen including llc, payload_length and mic ) + + payload_remainder = (plen-8) % 16; + + pn_vector[0] = pframe[hdrlen]; + pn_vector[1] = pframe[hdrlen+1]; + pn_vector[2] = pframe[hdrlen+4]; + pn_vector[3] = pframe[hdrlen+5]; + pn_vector[4] = pframe[hdrlen+6]; + pn_vector[5] = pframe[hdrlen+7]; + + if ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen == WLAN_HDR_A3_QOS_LEN)) + a4_exists = 0; + else + a4_exists = 1; + + if ( + (frtype == WIFI_DATA_CFACK) || + (frtype == WIFI_DATA_CFPOLL)|| + (frtype == WIFI_DATA_CFACKPOLL)) + { + qc_exists = 1; + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + } + else if ( + (frsubtype == 0x08) || + (frsubtype == 0x09)|| + (frsubtype == 0x0a)|| + (frsubtype == 0x0b)) + { + if(hdrlen != WLAN_HDR_A3_QOS_LEN){ + + hdrlen += 2; + } + qc_exists = 1; + } + else + qc_exists = 0; + + + // now, decrypt pframe with hdrlen offset and plen long + + payload_index = hdrlen + 8; // 8 is for extiv + + for (i=0; i< num_blocks; i++) + { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, + pn_vector, + i+1 + ); + + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &pframe[payload_index], chain_buffer); + + for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j]; + } + + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ + { /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + pframe, + pn_vector, + num_blocks+1 + ); + + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = pframe[payload_index+j]; + } + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, padded_buffer, chain_buffer); + for (j=0; j 0) + { + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = message[payload_index++]; + } + bitwise_xor(aes_out, padded_buffer, chain_buffer); + aes128k128d(key, chain_buffer, aes_out); + + } + + for (j = 0 ; j < 8; j++) mic[j] = aes_out[j]; + + /* Insert MIC into payload */ + for (j = 0; j < 8; j++) + message[payload_index+j] = mic[j]; + + payload_index = hdrlen + 8; + for (i=0; i< num_blocks; i++) + { + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + message, + pn_vector, + i+1); + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, &message[payload_index], chain_buffer); + for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j]; + } + + if (payload_remainder > 0) /* If there is a short final block, then pad it,*/ + { /* encrypt it and copy the unpadded part back */ + construct_ctr_preload( + ctr_preload, + a4_exists, + qc_exists, + message, + pn_vector, + num_blocks+1); + + for (j = 0; j < 16; j++) padded_buffer[j] = 0x00; + for (j = 0; j < payload_remainder; j++) + { + padded_buffer[j] = message[payload_index+j]; + } + aes128k128d(key, ctr_preload, aes_out); + bitwise_xor(aes_out, padded_buffer, chain_buffer); + for (j=0; ju.hdr.attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; +// struct recv_priv *precvpriv=&padapter->recvpriv; + u32 res=_SUCCESS; +_func_enter_; + pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data; + //4 start to encrypt each fragment + if((prxattrib->encrypt==_AES_)){ + + stainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] ); + if (stainfo!=NULL){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo!=NULL!!!\n")); + + if(IS_MCAST(prxattrib->ra)) + { + DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n"); + //prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey; + prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; + prwskeylen=16; + } + else + { + prwskey=&stainfo->dot118021x_UncstKey.skey[0]; + prwskeylen=16; + } + + length= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len; + + aes_decipher(prwskey,prxattrib->hdrlen,pframe, length); + + + } + else{ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n")); + res=_FAIL; + } + + } +_func_exit_; + return res; +} + +/* compress 512-bits */ +static int sha256_compress(struct sha256_state *md, unsigned char *buf) +{ + u32 S[8], W[64], t0, t1; + u32 t; + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) { + S[i] = md->state[i]; + } + + /* copy the state into 512-bits into W[0..15] */ + for (i = 0; i < 16; i++) + W[i] = WPA_GET_BE32(buf + (4 * i)); + + /* fill W[16..63] */ + for (i = 16; i < 64; i++) { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + + W[i - 16]; + } + + /* Compress */ +#define RND(a,b,c,d,e,f,g,h,i) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + + for (i = 0; i < 64; ++i) { + RND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i); + t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; + S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t; + } + + /* feedback */ + for (i = 0; i < 8; i++) { + md->state[i] = md->state[i] + S[i]; + } + return 0; +} + +/* Initialize the hash state */ +static void sha256_init(struct sha256_state *md) +{ + md->curlen = 0; + md->length = 0; + md->state[0] = 0x6A09E667UL; + md->state[1] = 0xBB67AE85UL; + md->state[2] = 0x3C6EF372UL; + md->state[3] = 0xA54FF53AUL; + md->state[4] = 0x510E527FUL; + md->state[5] = 0x9B05688CUL; + md->state[6] = 0x1F83D9ABUL; + md->state[7] = 0x5BE0CD19UL; +} + +/** + Process a block of memory though the hash + @param md The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return CRYPT_OK if successful +*/ +static int sha256_process(struct sha256_state *md, unsigned char *in, + unsigned long inlen) +{ + unsigned long n; +#define block_size 64 + + if (md->curlen > sizeof(md->buf)) + return -1; + + while (inlen > 0) { + if (md->curlen == 0 && inlen >= block_size) { + if (sha256_compress(md, (unsigned char *) in) < 0) + return -1; + md->length += block_size * 8; + in += block_size; + inlen -= block_size; + } else { + n = MIN(inlen, (block_size - md->curlen)); + _rtw_memcpy(md->buf + md->curlen, in, n); + md->curlen += n; + in += n; + inlen -= n; + if (md->curlen == block_size) { + if (sha256_compress(md, md->buf) < 0) + return -1; + md->length += 8 * block_size; + md->curlen = 0; + } + } + } + + return 0; +} + + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (32 bytes) + @return CRYPT_OK if successful +*/ +static int sha256_done(struct sha256_state *md, unsigned char *out) +{ + int i; + + if (md->curlen >= sizeof(md->buf)) + return -1; + + /* increase the length of the message */ + md->length += md->curlen * 8; + + /* append the '1' bit */ + md->buf[md->curlen++] = (unsigned char) 0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md->curlen > 56) { + while (md->curlen < 64) { + md->buf[md->curlen++] = (unsigned char) 0; + } + sha256_compress(md, md->buf); + md->curlen = 0; + } + + /* pad upto 56 bytes of zeroes */ + while (md->curlen < 56) { + md->buf[md->curlen++] = (unsigned char) 0; + } + + /* store length */ + WPA_PUT_BE64(md->buf + 56, md->length); + sha256_compress(md, md->buf); + + /* copy output */ + for (i = 0; i < 8; i++) + WPA_PUT_BE32(out + (4 * i), md->state[i]); + + return 0; +} + +/** + * sha256_vector - SHA256 hash for data vector + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash + * Returns: 0 on success, -1 of failure + */ +static int sha256_vector(size_t num_elem, u8 *addr[], size_t *len, + u8 *mac) +{ + struct sha256_state ctx; + size_t i; + + sha256_init(&ctx); + for (i = 0; i < num_elem; i++) + if (sha256_process(&ctx, addr[i], len[i])) + return -1; + if (sha256_done(&ctx, mac)) + return -1; + return 0; +} + +static u8 os_strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +static int os_memcmp(void *s1, void *s2, u8 n) +{ + unsigned char *p1 = s1, *p2 = s2; + + if (n == 0) + return 0; + + while (*p1 == *p2) { + p1++; + p2++; + n--; + if (n == 0) + return 0; + } + + return *p1 - *p2; +} + +/** + * hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104) + * @key: Key for HMAC operations + * @key_len: Length of the key in bytes + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for the hash (32 bytes) + */ +static void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem, + u8 *addr[], size_t *len, u8 *mac) +{ + unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */ + unsigned char tk[32]; + u8 *_addr[6]; + size_t _len[6], i; + + if (num_elem > 5) { + /* + * Fixed limit on the number of fragments to avoid having to + * allocate memory (which could fail). + */ + return; + } + + /* if key is longer than 64 bytes reset it to key = SHA256(key) */ + if (key_len > 64) { + sha256_vector(1, &key, &key_len, tk); + key = tk; + key_len = 32; + } + + /* the HMAC_SHA256 transform looks like: + * + * SHA256(K XOR opad, SHA256(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected */ + + /* start out by storing key in ipad */ + _rtw_memset(k_pad, 0, sizeof(k_pad)); + _rtw_memcpy(k_pad, key, key_len); + /* XOR key with ipad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x36; + + /* perform inner SHA256 */ + _addr[0] = k_pad; + _len[0] = 64; + for (i = 0; i < num_elem; i++) { + _addr[i + 1] = addr[i]; + _len[i + 1] = len[i]; + } + sha256_vector(1 + num_elem, _addr, _len, mac); + + _rtw_memset(k_pad, 0, sizeof(k_pad)); + _rtw_memcpy(k_pad, key, key_len); + /* XOR key with opad values */ + for (i = 0; i < 64; i++) + k_pad[i] ^= 0x5c; + + /* perform outer SHA256 */ + _addr[0] = k_pad; + _len[0] = 64; + _addr[1] = mac; + _len[1] = 32; + sha256_vector(2, _addr, _len, mac); +} + +/** + * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2) + * @key: Key for PRF + * @key_len: Length of the key in bytes + * @label: A unique label for each purpose of the PRF + * @data: Extra data to bind into the key + * @data_len: Length of the data + * @buf: Buffer for the generated pseudo-random key + * @buf_len: Number of bytes of key to generate + * + * This function is used to derive new, cryptographically separate keys from a + * given key. + */ +static void sha256_prf(u8 *key, size_t key_len, char *label, + u8 *data, size_t data_len, u8 *buf, size_t buf_len) +{ + u16 counter = 1; + size_t pos, plen; + u8 hash[SHA256_MAC_LEN]; + u8 *addr[4]; + size_t len[4]; + u8 counter_le[2], length_le[2]; + + addr[0] = counter_le; + len[0] = 2; + addr[1] = (u8 *) label; + len[1] = os_strlen(label); + addr[2] = data; + len[2] = data_len; + addr[3] = length_le; + len[3] = sizeof(length_le); + + WPA_PUT_LE16(length_le, buf_len * 8); + pos = 0; + while (pos < buf_len) { + plen = buf_len - pos; + WPA_PUT_LE16(counter_le, counter); + if (plen >= SHA256_MAC_LEN) { + hmac_sha256_vector(key, key_len, 4, addr, len, + &buf[pos]); + pos += SHA256_MAC_LEN; + } else { + hmac_sha256_vector(key, key_len, 4, addr, len, hash); + _rtw_memcpy(&buf[pos], hash, plen); + break; + } + counter++; + } +} + +/* AES tables*/ +const u32 Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +const u32 Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +const u8 Td4s[256] = { + 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, + 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, + 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, + 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, + 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, + 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, + 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, + 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, + 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, + 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, + 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, + 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, + 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, + 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, + 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, + 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, + 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, + 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, + 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, + 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, + 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, + 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, + 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, + 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, + 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, + 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, + 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, + 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, + 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, + 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, + 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, + 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, +}; +const u8 rcons[] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 + /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +/** + * Expand the cipher key into the encryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ +static void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[]) +{ + int i; + u32 temp; + + rk[0] = GETU32(cipherKey ); + rk[1] = GETU32(cipherKey + 4); + rk[2] = GETU32(cipherKey + 8); + rk[3] = GETU32(cipherKey + 12); + for (i = 0; i < 10; i++) { + temp = rk[3]; + rk[4] = rk[0] ^ + TE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^ + RCON(i); + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + rk += 4; + } +} + +static void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16]) +{ + u32 s0, s1, s2, s3, t0, t1, t2, t3; + int Nr = 10; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(pt ) ^ rk[0]; + s1 = GETU32(pt + 4) ^ rk[1]; + s2 = GETU32(pt + 8) ^ rk[2]; + s3 = GETU32(pt + 12) ^ rk[3]; + +#define ROUND(i,d,s) \ +d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \ +d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \ +d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \ +d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3] + +#ifdef FULL_UNROLL + + ROUND(1,t,s); + ROUND(2,s,t); + ROUND(3,t,s); + ROUND(4,s,t); + ROUND(5,t,s); + ROUND(6,s,t); + ROUND(7,t,s); + ROUND(8,s,t); + ROUND(9,t,s); + + rk += Nr << 2; + +#else /* !FULL_UNROLL */ + + /* Nr - 1 full rounds: */ + r = Nr >> 1; + for (;;) { + ROUND(1,t,s); + rk += 8; + if (--r == 0) + break; + ROUND(0,s,t); + } + +#endif /* ?FULL_UNROLL */ + +#undef ROUND + + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0]; + PUTU32(ct , s0); + s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1]; + PUTU32(ct + 4, s1); + s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2]; + PUTU32(ct + 8, s2); + s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3]; + PUTU32(ct + 12, s3); +} + +static void * aes_encrypt_init(u8 *key, size_t len) +{ + u32 *rk; + if (len != 16) + return NULL; + rk = (u32*)rtw_malloc(AES_PRIV_SIZE); + if (rk == NULL) + return NULL; + rijndaelKeySetupEnc(rk, key); + return rk; +} + +static void aes_128_encrypt(void *ctx, u8 *plain, u8 *crypt) +{ + rijndaelEncrypt(ctx, plain, crypt); +} + + +static void gf_mulx(u8 *pad) +{ + int i, carry; + + carry = pad[0] & 0x80; + for (i = 0; i < AES_BLOCK_SIZE - 1; i++) + pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7); + pad[AES_BLOCK_SIZE - 1] <<= 1; + if (carry) + pad[AES_BLOCK_SIZE - 1] ^= 0x87; +} + +static void aes_encrypt_deinit(void *ctx) +{ + _rtw_memset(ctx, 0, AES_PRIV_SIZE); + rtw_mfree(ctx, AES_PRIV_SIZE); +} + + +/** + * omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128 + * @key: 128-bit key for the hash operation + * @num_elem: Number of elements in the data vector + * @addr: Pointers to the data areas + * @len: Lengths of the data blocks + * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) + * Returns: 0 on success, -1 on failure + * + * This is a mode for using block cipher (AES in this case) for authentication. + * OMAC1 was standardized with the name CMAC by NIST in a Special Publication + * (SP) 800-38B. + */ +static int omac1_aes_128_vector(u8 *key, size_t num_elem, + u8 *addr[], size_t *len, u8 *mac) +{ + void *ctx; + u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE]; + u8 *pos, *end; + size_t i, e, left, total_len; + + ctx = aes_encrypt_init(key, 16); + if (ctx == NULL) + return -1; + _rtw_memset(cbc, 0, AES_BLOCK_SIZE); + + total_len = 0; + for (e = 0; e < num_elem; e++) + total_len += len[e]; + left = total_len; + + e = 0; + pos = addr[0]; + end = pos + len[0]; + + while (left >= AES_BLOCK_SIZE) { + for (i = 0; i < AES_BLOCK_SIZE; i++) { + cbc[i] ^= *pos++; + if (pos >= end) { + e++; + pos = addr[e]; + end = pos + len[e]; + } + } + if (left > AES_BLOCK_SIZE) + aes_128_encrypt(ctx, cbc, cbc); + left -= AES_BLOCK_SIZE; + } + + _rtw_memset(pad, 0, AES_BLOCK_SIZE); + aes_128_encrypt(ctx, pad, pad); + gf_mulx(pad); + + if (left || total_len == 0) { + for (i = 0; i < left; i++) { + cbc[i] ^= *pos++; + if (pos >= end) { + e++; + pos = addr[e]; + end = pos + len[e]; + } + } + cbc[left] ^= 0x80; + gf_mulx(pad); + } + + for (i = 0; i < AES_BLOCK_SIZE; i++) + pad[i] ^= cbc[i]; + aes_128_encrypt(ctx, pad, mac); + aes_encrypt_deinit(ctx); + return 0; +} + + +/** + * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC) + * @key: 128-bit key for the hash operation + * @data: Data buffer for which a MAC is determined + * @data_len: Length of data buffer in bytes + * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) + * Returns: 0 on success, -1 on failure + * + * This is a mode for using block cipher (AES in this case) for authentication. + * OMAC1 was standardized with the name CMAC by NIST in a Special Publication + * (SP) 800-38B. + */ +static int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac) +{ + return omac1_aes_128_vector(key, 1, &data, &data_len, mac); +} + +#ifdef CONFIG_TDLS +void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + u8 *SNonce = psta->SNonce; + u8 *ANonce = psta->ANonce; + + u8 key_input[SHA256_MAC_LEN]; + u8 *nonce[2]; + size_t len[2]; + u8 data[3 * ETH_ALEN]; + + /* IEEE Std 802.11z-2010 8.5.9.1: + * TPK-Key-Input = SHA-256(min(SNonce, ANonce) || max(SNonce, ANonce)) + */ + len[0] = 32; + len[1] = 32; + if (os_memcmp(SNonce, ANonce, 32) < 0) { + nonce[0] = SNonce; + nonce[1] = ANonce; + } else { + nonce[0] = ANonce; + nonce[1] = SNonce; + } + + sha256_vector(2, nonce, len, key_input); + + /* + * TPK-Key-Data = KDF-N_KEY(TPK-Key-Input, "TDLS PMK", + * min(MAC_I, MAC_R) || max(MAC_I, MAC_R) || BSSID || N_KEY) + * TODO: is N_KEY really included in KDF Context and if so, in which + * presentation format (little endian 16-bit?) is it used? It gets + * added by the KDF anyway.. + */ + + if (os_memcmp(myid(&(padapter->eeprompriv)), psta->hwaddr, ETH_ALEN) < 0) { + _rtw_memcpy(data, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(data + ETH_ALEN, psta->hwaddr, ETH_ALEN); + } else { + _rtw_memcpy(data, psta->hwaddr, ETH_ALEN); + _rtw_memcpy(data + ETH_ALEN, myid(&(padapter->eeprompriv)), ETH_ALEN); + } + _rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN); + + sha256_prf(key_input, SHA256_MAC_LEN, "TDLS PMK", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk)); + + +} + +/** + * wpa_tdls_ftie_mic - Calculate TDLS FTIE MIC + * @kck: TPK-KCK + * @lnkid: Pointer to the beginning of Link Identifier IE + * @rsnie: Pointer to the beginning of RSN IE used for handshake + * @timeoutie: Pointer to the beginning of Timeout IE used for handshake + * @ftie: Pointer to the beginning of FT IE + * @mic: Pointer for writing MIC + * + * Calculate MIC for TDLS frame. + */ +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, + u8 *mic) +{ + u8 *buf, *pos; + struct wpa_tdls_ftie *_ftie; + struct wpa_tdls_lnkid *_lnkid; + int ret; + int len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] + + 2 + timeoutie[1] + 2 + ftie[1]; + buf = rtw_zmalloc(len); + if (!buf) { + DBG_8192C("TDLS: No memory for MIC calculation\n"); + return -1; + } + + pos = buf; + _lnkid = (struct wpa_tdls_lnkid *) lnkid; + /* 1) TDLS initiator STA MAC address */ + _rtw_memcpy(pos, _lnkid->init_sta, ETH_ALEN); + pos += ETH_ALEN; + /* 2) TDLS responder STA MAC address */ + _rtw_memcpy(pos, _lnkid->resp_sta, ETH_ALEN); + pos += ETH_ALEN; + /* 3) Transaction Sequence number */ + *pos++ = trans_seq; + /* 4) Link Identifier IE */ + _rtw_memcpy(pos, lnkid, 2 + lnkid[1]); + pos += 2 + lnkid[1]; + /* 5) RSN IE */ + _rtw_memcpy(pos, rsnie, 2 + rsnie[1]); + pos += 2 + rsnie[1]; + /* 6) Timeout Interval IE */ + _rtw_memcpy(pos, timeoutie, 2 + timeoutie[1]); + pos += 2 + timeoutie[1]; + /* 7) FTIE, with the MIC field of the FTIE set to 0 */ + _rtw_memcpy(pos, ftie, 2 + ftie[1]); + _ftie = (struct wpa_tdls_ftie *) pos; + _rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN); + pos += 2 + ftie[1]; + + ret = omac1_aes_128(kck, buf, pos - buf, mic); + rtw_mfree(buf, len); + return ret; + +} + +int tdls_verify_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie) +{ + u8 *buf, *pos; + int len; + u8 mic[16]; + int ret; + u8 *rx_ftie, *tmp_ftie; + + if (lnkid == NULL || rsnie == NULL || + timeoutie == NULL || ftie == NULL){ + DBG_8192C("pointer fail\n"); + return 0; + } + + len = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie+1) + 2 + *(timeoutie+1) + 2 + *(ftie+1); + + buf = rtw_zmalloc(len); + if (buf == NULL) + return 0; + + pos = buf; + /* 1) TDLS initiator STA MAC address */ + _rtw_memcpy(pos, lnkid + ETH_ALEN + 2, ETH_ALEN); + pos += ETH_ALEN; + /* 2) TDLS responder STA MAC address */ + _rtw_memcpy(pos, lnkid + 2 * ETH_ALEN + 2, ETH_ALEN); + pos += ETH_ALEN; + /* 3) Transaction Sequence number */ + *pos++ = trans_seq; + /* 4) Link Identifier IE */ + _rtw_memcpy(pos, lnkid, 2 + 18); + pos += 2 + 18; + /* 5) RSN IE */ + _rtw_memcpy(pos, rsnie, 2 + *(rsnie+1)); + pos += 2 + *(rsnie+1); + /* 6) Timeout Interval IE */ + _rtw_memcpy(pos, timeoutie, 2 + *(timeoutie+1)); + pos += 2 + *(timeoutie+1); + /* 7) FTIE, with the MIC field of the FTIE set to 0 */ + _rtw_memcpy(pos, ftie, 2 + *(ftie+1)); + pos += 2; + tmp_ftie = (u8 *) (pos+2); + _rtw_memset(tmp_ftie, 0, 16); + pos += *(ftie+1); + + ret = omac1_aes_128(kck, buf, pos - buf, mic); + rtw_mfree(buf, len); + if (ret) + return 0; + rx_ftie = ftie+4; + + if (os_memcmp(mic, rx_ftie, 16) == 0) { + //Valid MIC + DBG_8192C( "[%s] Valid MIC\n", __FUNCTION__); + return 1; + } + //Invalid MIC + DBG_8192C( "[%s] Invalid MIC\n", __FUNCTION__); + return 0; + +} +#endif + +#ifdef PLATFORM_WINDOWS +void rtw_use_tkipkey_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ) +#endif +#ifdef PLATFORM_LINUX +void rtw_use_tkipkey_handler(void *FunctionContext) +#endif +{ + _adapter *padapter = (_adapter *)FunctionContext; + + +_func_enter_; + + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler ^^^\n")); + +/* + if(padapter->bDriverStopped ||padapter->bSurpriseRemoved){ + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler (padapter->bDriverStopped %d)(padapter->bSurpriseRemoved %d)^^^\n",padapter->bDriverStopped,padapter->bSurpriseRemoved)); + + return; + } + */ + + padapter->securitypriv.busetkipkey=_TRUE; + + RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("^^^rtw_use_tkipkey_handler padapter->securitypriv.busetkipkey=%d^^^\n",padapter->securitypriv.busetkipkey)); + +_func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c b/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c new file mode 100755 index 000000000000..cf478b2fe7f4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_sta_mgt.c @@ -0,0 +1,654 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_STA_MGT_C_ + +#include +#include +#include +#include +#include +#include + + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include + + +void _rtw_init_stainfo(struct sta_info *psta) +{ + +_func_enter_; + + _rtw_memset((u8 *)psta, 0, sizeof (struct sta_info)); + + _rtw_spinlock_init(&psta->lock); + _rtw_init_listhead(&psta->list); + _rtw_init_listhead(&psta->hash_list); + //_rtw_init_listhead(&psta->asoc_list); + //_rtw_init_listhead(&psta->sleep_list); + //_rtw_init_listhead(&psta->wakeup_list); + + _rtw_init_queue(&psta->sleep_q); + psta->sleepq_len = 0; + + _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); + _rtw_init_sta_recv_priv(&psta->sta_recvpriv); + +#ifdef CONFIG_AP_MODE + + _rtw_init_listhead(&psta->asoc_list); + + _rtw_init_listhead(&psta->auth_list); + + psta->expire_to = 0; + + psta->flags = 0; + + psta->capability = 0; + + +#ifdef CONFIG_NATIVEAP_MLME + psta->nonerp_set = 0; + psta->no_short_slot_time_set = 0; + psta->no_short_preamble_set = 0; + psta->no_ht_gf_set = 0; + psta->no_ht_set = 0; + psta->ht_20mhz_set = 0; +#endif + +#endif + +_func_exit_; + +} + +u32 _rtw_init_sta_priv(struct sta_priv *pstapriv) +{ + struct sta_info *psta; + s32 i; + +_func_enter_; + + pstapriv->pallocated_stainfo_buf = rtw_zvmalloc (sizeof(struct sta_info) * NUM_STA+ 4); + + if(!pstapriv->pallocated_stainfo_buf) + return _FAIL; + + pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - + ((SIZE_PTR)(pstapriv->pallocated_stainfo_buf ) & 3); + + _rtw_init_queue(&pstapriv->free_sta_queue); + + _rtw_spinlock_init(&pstapriv->sta_hash_lock); + + //_rtw_init_queue(&pstapriv->asoc_q); + pstapriv->asoc_sta_count = 0; + _rtw_init_queue(&pstapriv->sleep_q); + _rtw_init_queue(&pstapriv->wakeup_q); + + psta = (struct sta_info *)(pstapriv->pstainfo_buf); + + + for(i = 0; i < NUM_STA; i++) + { + _rtw_init_stainfo(psta); + + _rtw_init_listhead(&(pstapriv->sta_hash[i])); + + rtw_list_insert_tail(&psta->list, get_list_head(&pstapriv->free_sta_queue)); + + psta++; + } + +#ifdef CONFIG_AP_MODE + + pstapriv->sta_dz_bitmap = 0; + pstapriv->tim_bitmap = 0; + + _rtw_init_listhead(&pstapriv->asoc_list); + _rtw_init_listhead(&pstapriv->auth_list); + pstapriv->auth_to = 3; // 3*2 = 6 sec + pstapriv->assoc_to = 3; + pstapriv->expire_to = 900;// 900*2 = 1800 sec = 30 min, expire after no any traffic. + + pstapriv->max_num_sta = NUM_STA; + +#endif + +_func_exit_; + + return _SUCCESS; + +} + +void _rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv) +{ +_func_enter_; + + _rtw_spinlock_free(&psta_xmitpriv->lock); + + _rtw_spinlock_free(&(psta_xmitpriv->be_q.sta_pending.lock)); + _rtw_spinlock_free(&(psta_xmitpriv->bk_q.sta_pending.lock)); + _rtw_spinlock_free(&(psta_xmitpriv->vi_q.sta_pending.lock)); + _rtw_spinlock_free(&(psta_xmitpriv->vo_q.sta_pending.lock)); +_func_exit_; +} + +static void _rtw_free_sta_recv_priv_lock(struct sta_recv_priv *psta_recvpriv) +{ +_func_enter_; + + _rtw_spinlock_free(&psta_recvpriv->lock); + + _rtw_spinlock_free(&(psta_recvpriv->defrag_q.lock)); + +_func_exit_; + +} + +void rtw_mfree_stainfo(struct sta_info *psta) +{ +_func_enter_; + + if(&psta->lock != NULL) + _rtw_spinlock_free(&psta->lock); + + _rtw_free_sta_xmit_priv_lock(&psta->sta_xmitpriv); + _rtw_free_sta_recv_priv_lock(&psta->sta_recvpriv); + +_func_exit_; +} + + +// this function is used to free the memory of lock || sema for all stainfos +void rtw_mfree_all_stainfo(struct sta_priv *pstapriv ) +{ + _irqL irqL; + _list *plist, *phead; + struct sta_info *psta = NULL; + +_func_enter_; + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + phead = get_list_head(&pstapriv->free_sta_queue); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info ,list); + plist = get_next(plist); + + rtw_mfree_stainfo(psta); + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + +_func_exit_; + +} + + +void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv) +{ + rtw_mfree_all_stainfo(pstapriv); //be done before free sta_hash_lock + + _rtw_spinlock_free(&pstapriv->free_sta_queue.lock); + + _rtw_spinlock_free(&pstapriv->sta_hash_lock); + _rtw_spinlock_free(&pstapriv->wakeup_q.lock); + _rtw_spinlock_free(&pstapriv->sleep_q.lock); + +} + +u32 _rtw_free_sta_priv(struct sta_priv *pstapriv) +{ +_func_enter_; + if(pstapriv){ + rtw_mfree_sta_priv_lock(pstapriv); + + if(pstapriv->pallocated_stainfo_buf) { + rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4); + } + } + +_func_exit_; + return _SUCCESS; +} + + +//struct sta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr) +struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) +{ + _irqL irqL, irqL2; + uint tmp_aid; + s32 index; + _list *phash_list; + struct sta_info *psta; + _queue *pfree_sta_queue; + struct recv_reorder_ctrl *preorder_ctrl; + int i = 0; + u16 wRxSeqInitialValue = 0xffff; + +_func_enter_; + + pfree_sta_queue = &pstapriv->free_sta_queue; + + _enter_critical_bh(&(pfree_sta_queue->lock), &irqL); + + if (_rtw_queue_empty(pfree_sta_queue) == _TRUE) + { + psta = NULL; + } + else + { + psta = LIST_CONTAINOR(get_next(&pfree_sta_queue->queue), struct sta_info, list); + + rtw_list_delete(&(psta->list)); + + tmp_aid = psta->aid; + + _rtw_init_stainfo(psta); + + _rtw_memcpy(psta->hwaddr, hwaddr, ETH_ALEN); + + index = wifi_mac_hash(hwaddr); + + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("rtw_alloc_stainfo: index = %x", index)); + + if(index >= NUM_STA){ + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("ERROR=> rtw_alloc_stainfo: index >= NUM_STA")); + psta= NULL; + goto exit; + } + phash_list = &(pstapriv->sta_hash[index]); + + _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + + rtw_list_insert_tail(&psta->hash_list, phash_list); + + pstapriv->asoc_sta_count ++ ; + + _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2); + +// Commented by Albert 2009/08/13 +// For the SMC router, the sequence number of first packet of WPS handshake will be 0. +// In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable. +// So, we initialize the tid_rxseq variable as the 0xffff. + + for( i = 0; i < 16; i++ ) + { + _rtw_memcpy( &psta->sta_recvpriv.rxcache.tid_rxseq[ i ], &wRxSeqInitialValue, 2 ); + } + + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,("alloc number_%d stainfo with hwaddr = %x %x %x %x %x %x \n", + pstapriv->asoc_sta_count , hwaddr[0], hwaddr[1], hwaddr[2],hwaddr[3],hwaddr[4],hwaddr[5])); + + init_addba_retry_timer(pstapriv->padapter, psta); + +#ifdef CONFIG_TDLS + psta->padapter = pstapriv->padapter; + init_TPK_timer(pstapriv->padapter, psta); + _init_workitem(&psta->option_workitem, TDLS_option_workitem_callback, psta); + init_ch_switch_timer(pstapriv->padapter, psta); + init_base_ch_timer(pstapriv->padapter, psta); + _init_workitem(&psta->base_ch_workitem, base_channel_workitem_callback, psta); + init_off_ch_timer(pstapriv->padapter, psta); + _init_workitem(&psta->off_ch_workitem, off_channel_workitem_callback, psta); +#endif + + //for A-MPDU Rx reordering buffer control + for(i=0; i < 16 ; i++) + { + preorder_ctrl = &psta->recvreorder_ctrl[i]; + + preorder_ctrl->padapter = pstapriv->padapter; + + preorder_ctrl->enable = _FALSE; + + preorder_ctrl->indicate_seq = 0xffff; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq); + #endif + preorder_ctrl->wend_b= 0xffff; + //preorder_ctrl->wsize_b = (NR_RECVBUFF-2); + preorder_ctrl->wsize_b = 64;//64; + + _rtw_init_queue(&preorder_ctrl->pending_recvframe_queue); + + rtw_init_recv_timer(preorder_ctrl); + } + + } + +exit: + + _exit_critical_bh(&(pfree_sta_queue->lock), &irqL); + +_func_exit_; + + return psta; + + +} + + +// using pstapriv->sta_hash_lock to protect +u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta) +{ + int i; + _irqL irqL0; + _queue *pfree_sta_queue; + struct recv_reorder_ctrl *preorder_ctrl; + struct sta_xmit_priv *pstaxmitpriv; + struct xmit_priv *pxmitpriv= &padapter->xmitpriv; + struct sta_priv *pstapriv = &padapter->stapriv; + + +_func_enter_; + + if (psta == NULL) + goto exit; + + pfree_sta_queue = &pstapriv->free_sta_queue; + + + pstaxmitpriv = &psta->sta_xmitpriv; + + //rtw_list_delete(&psta->sleep_list); + + //rtw_list_delete(&psta->wakeup_list); + + rtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q); + psta->sleepq_len = 0; + + _enter_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vo_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0); + + + _enter_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vi_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0); + + + _enter_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->bk_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0); + + _enter_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); + + rtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->be_q.sta_pending); + + rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending)); + + _exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0); + + + rtw_list_delete(&psta->hash_list); + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5])); + pstapriv->asoc_sta_count --; + + + // re-init sta_info; 20061114 + _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); + _rtw_init_sta_recv_priv(&psta->sta_recvpriv); + + _cancel_timer_ex(&psta->addba_retry_timer); + +#ifdef CONFIG_TDLS + _cancel_timer_ex(&psta->TPK_timer); + _cancel_timer_ex(&psta->option_timer); + _cancel_timer_ex(&psta->base_ch_timer); + _cancel_timer_ex(&psta->off_ch_timer); +#endif + + //for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer + for(i=0; i < 16 ; i++) + { + preorder_ctrl = &psta->recvreorder_ctrl[i]; + + _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); + } + + +#ifdef CONFIG_AP_MODE + + rtw_list_delete(&psta->asoc_list); + rtw_list_delete(&psta->auth_list); + psta->expire_to = 0; + + psta->sleepq_ac_len = 0; + psta->qos_info = 0; + + psta->max_sp_len = 0; + psta->uapsd_bk = 0; + psta->uapsd_be = 0; + psta->uapsd_vi = 0; + psta->uapsd_vo = 0; + + psta->has_legacy_ac = 0; + +#ifdef CONFIG_NATIVEAP_MLME + + pstapriv->sta_dz_bitmap &=~BIT(psta->aid); + pstapriv->tim_bitmap &=~BIT(psta->aid); + + rtw_indicate_sta_disassoc_event(padapter, psta); + + if (pstapriv->sta_aid[psta->aid - 1] == psta) + { + pstapriv->sta_aid[psta->aid - 1] = NULL; + psta->aid = 0; + } + +#endif + +#endif + + _enter_critical_bh(&(pfree_sta_queue->lock), &irqL0); + rtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue)); + _exit_critical_bh(&(pfree_sta_queue->lock), &irqL0); + +exit: + +_func_exit_; + + return _SUCCESS; + +} + +// free all stainfo which in sta_hash[all] +void rtw_free_all_stainfo(_adapter *padapter) +{ + _irqL irqL; + _list *plist, *phead; + s32 index; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter); + +_func_enter_; + + if(pstapriv->asoc_sta_count==1) + goto exit; + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + for(index=0; index< NUM_STA; index++) + { + phead = &(pstapriv->sta_hash[index]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list); + + plist = get_next(plist); + + if(pbcmc_stainfo!=psta) + rtw_free_stainfo(padapter , psta); + + } + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + +exit: + +_func_exit_; + +} + +/* any station allocated can be searched by hash list */ +struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) +{ + + _irqL irqL; + + _list *plist, *phead; + + struct sta_info *psta = NULL; + + u32 index; + + u8 *addr; + + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + +_func_enter_; + + if(hwaddr==NULL) + return NULL; + + if(IS_MCAST(hwaddr)) + { + addr = bc_addr; + } + else + { + addr = hwaddr; + } + + index = wifi_mac_hash(addr); + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + phead = &(pstapriv->sta_hash[index]); + plist = get_next(phead); + + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + + if ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN))== _TRUE) + { // if found the matched address + break; + } + psta=NULL; + plist = get_next(plist); + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); +_func_exit_; + return psta; + +} + +u32 rtw_init_bcmc_stainfo(_adapter* padapter) +{ + + struct sta_info *psta; + struct tx_servq *ptxservq; + u32 res=_SUCCESS; + NDIS_802_11_MAC_ADDRESS bcast_addr= {0xff,0xff,0xff,0xff,0xff,0xff}; + + struct sta_priv *pstapriv = &padapter->stapriv; + _queue *pstapending = &padapter->xmitpriv.bm_pending; + +_func_enter_; + + psta = rtw_alloc_stainfo(pstapriv, bcast_addr); + + if(psta==NULL){ + res=_FAIL; + RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("rtw_alloc_stainfo fail")); + goto exit; + } + + // default broadcast & multicast use macid 1 + psta->mac_id = 1; + + ptxservq= &(psta->sta_xmitpriv.be_q); + +/* + _enter_critical(&pstapending->lock, &irqL0); + + if (rtw_is_list_empty(&ptxservq->tx_pending)) + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(pstapending)); + + _exit_critical(&pstapending->lock, &irqL0); +*/ + +exit: +_func_exit_; + return _SUCCESS; + +} + + +struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter) +{ + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; +_func_enter_; + psta = rtw_get_stainfo(pstapriv, bc_addr); +_func_exit_; + return psta; + +} + +u8 rtw_access_ctrl(struct wlan_acl_pool* pacl_list, u8 * mac_addr) +{ + return _TRUE; +} + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c b/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c new file mode 100755 index 000000000000..c1e0cb4792a1 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_wlan_util.c @@ -0,0 +1,1747 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTW_WLAN_UTIL_C_ + +#include +#include +#include +#include + + +unsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f}; +unsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74}; + +unsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18}; +unsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7}; +unsigned char BROADCOM_OUI3[] = {0x00, 0x05, 0xb5}; + +unsigned char CISCO_OUI[] = {0x00, 0x40, 0x96}; +unsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43}; +unsigned char RALINK_OUI[] = {0x00, 0x0c, 0x43}; +unsigned char REALTEK_OUI[] = {0x00, 0xe0, 0x4c}; +unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5}; + +unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20}; + +extern unsigned char MCS_rate_2R[16]; +extern unsigned char MCS_rate_1R[16]; +extern unsigned char WPA_OUI[]; +extern unsigned char WPA_TKIP_CIPHER[4]; +extern unsigned char RSN_TKIP_CIPHER[4]; + +#define R2T_PHY_DELAY (0) + +//#define WAIT_FOR_BCN_TO_MIN (3000) +#define WAIT_FOR_BCN_TO_MIN (6000) +#define WAIT_FOR_BCN_TO_MAX (20000) + + +int cckrates_included(unsigned char *rate, int ratelen) +{ + int i; + + for(i = 0; i < ratelen; i++) + { + if ( (((rate[i]) & 0x7f) == 2) || (((rate[i]) & 0x7f) == 4) || + (((rate[i]) & 0x7f) == 11) || (((rate[i]) & 0x7f) == 22) ) + return _TRUE; + } + + return _FALSE; + +} + +int cckratesonly_included(unsigned char *rate, int ratelen) +{ + int i; + + for(i = 0; i < ratelen; i++) + { + if ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) && + (((rate[i]) & 0x7f) != 11) && (((rate[i]) & 0x7f) != 22) ) + return _FALSE; + } + + return _TRUE; +} + +unsigned char networktype_to_raid(unsigned char network_type) +{ + unsigned char raid; + + switch(network_type) + { + case WIRELESS_11B: + raid = 6; + break; + case WIRELESS_11A: + case WIRELESS_11G: + raid = 5; + break; + case WIRELESS_11BG: + raid = 4; + break; + case WIRELESS_11_24N: + case WIRELESS_11_5N: + raid = 3; + break; + case WIRELESS_11A_5N: + case WIRELESS_11G_24N: + raid = 1; + break; + case WIRELESS_11BG_24N: + raid = 0; + break; + default: + raid = 4; + break; + + } + + return raid; + +} + +int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen) +{ + int network_type = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if(pmlmeext->cur_channel > 14) + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_5N; + } + + network_type |= WIRELESS_11A; + } + else + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_24N; + } + + if ((cckratesonly_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11B; + } + else if((cckrates_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11BG; + } + else + { + network_type |= WIRELESS_11G; + } + } + + return network_type; +} + +unsigned char ratetbl_val_2wifirate(unsigned char rate) +{ + unsigned char val = 0; + + switch (rate & 0x7f) + { + case 0: + val = IEEE80211_CCK_RATE_1MB; + break; + + case 1: + val = IEEE80211_CCK_RATE_2MB; + break; + + case 2: + val = IEEE80211_CCK_RATE_5MB; + break; + + case 3: + val = IEEE80211_CCK_RATE_11MB; + break; + + case 4: + val = IEEE80211_OFDM_RATE_6MB; + break; + + case 5: + val = IEEE80211_OFDM_RATE_9MB; + break; + + case 6: + val = IEEE80211_OFDM_RATE_12MB; + break; + + case 7: + val = IEEE80211_OFDM_RATE_18MB; + break; + + case 8: + val = IEEE80211_OFDM_RATE_24MB; + break; + + case 9: + val = IEEE80211_OFDM_RATE_36MB; + break; + + case 10: + val = IEEE80211_OFDM_RATE_48MB; + break; + + case 11: + val = IEEE80211_OFDM_RATE_54MB; + break; + + } + + return val; + +} + +int is_basicrate(_adapter *padapter, unsigned char rate) +{ + int i; + unsigned char val; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + for(i = 0; i < NumRates; i++) + { + val = pmlmeext->basicrate[i]; + + if ((val != 0xff) && (val != 0xfe)) + { + if (rate == ratetbl_val_2wifirate(val)) + { + return _TRUE; + } + } + } + + return _FALSE; +} + + +unsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset) +{ + int i; + unsigned char rate; + unsigned int len = 0; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + for (i = 0; i < NumRates; i++) + { + rate = pmlmeext->datarate[i]; + + switch (rate) + { + case 0xff: + return len; + + case 0xfe: + continue; + + default: + rate = ratetbl_val_2wifirate(rate); + + if (is_basicrate(padapter, rate) == _TRUE) + { + rate |= IEEE80211_BASIC_RATE_MASK; + } + + rateset[len] = rate; + len++; + break; + } + } + return len; +} + + +void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len) +{ + unsigned char supportedrates[NumRates]; + + _rtw_memset(supportedrates, 0, NumRates); + *bssrate_len = ratetbl2rateset(padapter, supportedrates); + _rtw_memcpy(pbssrate, supportedrates, *bssrate_len); +} + +void Save_DM_Func_Flag(_adapter *padapter) +{ + u8 bSaveFlag = _TRUE; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); +} + +void Restore_DM_Func_Flag(_adapter *padapter) +{ + u8 bSaveFlag = _FALSE; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&bSaveFlag)); +} + +void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable) +{ + if(enable == _TRUE) + { + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode)); + } + else + { + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode)); + } + +#if 0 + u8 val8; + + val8 = rtw_read8(padapter, FW_DYNAMIC_FUN_SWITCH); + + if(enable == _TRUE) + { + rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 | mode)); + } + else + { + rtw_write8(padapter, FW_DYNAMIC_FUN_SWITCH, (val8 & mode)); + } +#endif + +} + +void Set_NETYPE1_MSR(_adapter *padapter, u8 type) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MEDIA_STATUS1, (u8 *)(&type)); +} + +void Set_NETYPE0_MSR(_adapter *padapter, u8 type) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type)); +} + +void SelectChannel(_adapter *padapter, unsigned char channel) +{ + unsigned int scanMode; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + scanMode = (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE)? 1: 0;//todo: + + if(padapter->HalFunc.set_channel_handler) + padapter->HalFunc.set_channel_handler(padapter, channel); + +} + +void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset) +{ + if(padapter->HalFunc.set_bwmode_handler) + padapter->HalFunc.set_bwmode_handler(padapter, (HT_CHANNEL_WIDTH)bwmode, channel_offset); +} + +void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode) +{ + if((bwmode == HT_CHANNEL_WIDTH_20)||(channel_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)) + { + SelectChannel(padapter, channel); + } + else + { + //switch to the proper channel + if (channel_offset == HAL_PRIME_CHNL_OFFSET_LOWER) + { + SelectChannel(padapter, channel + 2); + } + else + { + SelectChannel(padapter, channel - 2); + } + } + + + SetBWMode(padapter, bwmode, channel_offset); + +} + +int get_bsstype(unsigned short capability) +{ + if (capability & BIT(0)) + { + return WIFI_FW_AP_STATE; + } + else if (capability & BIT(1)) + { + return WIFI_FW_ADHOC_STATE; + } + else + { + return 0; + } +} + +__inline u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork) +{ + return (pnetwork->MacAddress); +} + +u16 get_beacon_interval(WLAN_BSSID_EX *bss) +{ + unsigned short val; + _rtw_memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2); + + return le16_to_cpu(val); + +} + +int is_client_associated_to_ap(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)) + { + return _TRUE; + } + else + { + return _FAIL; + } +} + +int is_client_associated_to_ibss(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)) + { + return _TRUE; + } + else + { + return _FAIL; + } +} + +int is_IBSS_empty(_adapter *padapter) +{ + unsigned int i; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) + { + if (pmlmeinfo->FW_sta_info[i].status == 1) + { + return _FAIL; + } + } + + return _TRUE; + +} + +unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval) +{ + if ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN) + { + return WAIT_FOR_BCN_TO_MIN; + } + else if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX) + { + return WAIT_FOR_BCN_TO_MAX; + } + else + { + return ((bcn_interval << 2)); + } +} + +void CAM_empty_entry( + PADAPTER Adapter, + u8 ucIndex +) +{ + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex)); +} + +void invalidate_cam_all(_adapter *padapter) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_INVALID_ALL, 0); +} + +void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key) +{ + unsigned int i, val, addr, cmd; + int j; + u32 cam_val[2]; + + addr = entry << 3; + + for (j = 5; j >= 0; j--) + { + switch (j) + { + case 0: + val = (ctrl | (mac[0] << 16) | (mac[1] << 24) ); + break; + + case 1: + val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24)); + break; + + default: + i = (j - 2) << 2; + val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24)); + break; + + } + + cam_val[0] = val; + cam_val[1] = addr + (unsigned int)j; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); + + //rtw_write32(padapter, WCAMI, val); + + //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j); + //rtw_write32(padapter, RWCAM, cmd); + + //DBG_8192C("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val); + + } + +} + +void clear_cam_entry(_adapter *padapter, u8 entry) +{ +#if 0 + u32 addr, val=0; + u32 cam_val[2]; + + addr = entry << 3; + + + cam_val[0] = val; + cam_val[1] = addr + (unsigned int)0; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); + + + + cam_val[0] = val; + cam_val[1] = addr + (unsigned int)1; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val); +#else + + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00}; + + write_cam(padapter, entry, 0, null_sta, null_key); + +#endif +} + +int allocate_fw_sta_entry(_adapter *padapter) +{ + unsigned int mac_id; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++) + { + if (pmlmeinfo->FW_sta_info[mac_id].status == 0) + { + pmlmeinfo->FW_sta_info[mac_id].status = 1; + pmlmeinfo->FW_sta_info[mac_id].retry = 0; + break; + } + } + + return mac_id; +} + +void flush_all_cam_entry(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#if 0 + unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00}; + + for (i = 0; i < NUM_STA; i++) + { + write_cam(padapter, i, 0, null_sta, null_key); + } +#else + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CAM_INVALID_ALL, 0); +#endif + _rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info)); +} + +int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pmlmepriv->qospriv.qos_option==0) + { + pmlmeinfo->WMM_enable = 0; + return _FAIL; + } + + pmlmeinfo->WMM_enable = 1; + _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); + return _TRUE; + + /*if (pregpriv->wifi_spec == 1) + { + if (pmlmeinfo->WMM_enable == 1) + { + //todo: compare the parameter set count & decide wheher to update or not + return _FAIL; + } + else + { + pmlmeinfo->WMM_enable = 1; + _rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)); + return _TRUE; + } + } + else + { + pmlmeinfo->WMM_enable = 0; + return _FAIL; + }*/ + +} + +void WMMOnAssocRsp(_adapter *padapter) +{ + unsigned char ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime; + unsigned short TXOP; + unsigned int acParm, i; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (pmlmeinfo->WMM_enable == 0) + return; + + if( pmlmeext->cur_wireless_mode == WIRELESS_11B) + aSifsTime = 10; + else + aSifsTime = 16; + + for (i = 0; i < 4; i++) + { + ACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03; + ACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01; + + //AIFS = AIFSN * slot time + SIFS - r2t phy delay + AIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime; + + ECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f); + ECWMax = (pmlmeinfo->WMM_param.ac_param[i].CW & 0xf0) >> 4; + TXOP = le16_to_cpu(pmlmeinfo->WMM_param.ac_param[i].TXOP_limit); + + acParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16); + + switch (ACI) + { + case 0x0: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); + break; + + case 0x1: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm)); + break; + + case 0x2: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm)); + break; + + case 0x3: + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm)); + break; + } + + DBG_871X("WMM(%x): %x, %x\n", ACI, ACM, acParm); + } + + return; +} + +static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + unsigned char new_bwmode; + unsigned char new_ch_offset; + struct HT_info_element *pHT_info; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if(!pIE) + return; + + pHT_info = (struct HT_info_element *)pIE->data; + + if(pHT_info->infos[0] & BIT(2)) + { + new_bwmode = HT_CHANNEL_WIDTH_40; + switch (pHT_info->infos[0] & 0x3) + { + case 1: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case 3: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + } + else + { + new_bwmode = HT_CHANNEL_WIDTH_20; + new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + + if((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset)) + { + pmlmeinfo->bwmode_updated = _TRUE; + + pmlmeext->cur_bwmode = new_bwmode; + pmlmeext->cur_ch_offset = new_ch_offset; + } + else + { + pmlmeinfo->bwmode_updated = _FALSE; + } + + + if(_TRUE == pmlmeinfo->bwmode_updated) + { + struct sta_info *psta; + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + struct sta_priv *pstapriv = &padapter->stapriv; + + //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + + //update ap's stainfo + psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); + if(psta) + { + struct ht_priv *phtpriv_sta = &psta->htpriv; + + if(phtpriv_sta->ht_option) + { + // bwmode + phtpriv_sta->bwmode = pmlmeext->cur_bwmode; + phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; + } + else + { + phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; + phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + } + + } + + //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it! + + } + +} + +void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + unsigned int i; + u8 rf_type; + u8 max_AMPDU_len, min_MPDU_spacing; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + if(phtpriv->ht_option == _FALSE) return; + + pmlmeinfo->HT_caps_enable = 1; + + for (i = 0; i < (pIE->Length); i++) + { + if (i != 2) + { + // Commented by Albert 2010/07/12 + // Got the endian issue here. + pmlmeinfo->HT_caps.HT_cap[i] &= (pIE->data[i]); + } + else + { + //modify from fw by Thomas 2010/11/17 + if ((pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3)) + { + max_AMPDU_len = (pIE->data[i] & 0x3); + } + else + { + max_AMPDU_len = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x3); + } + + if ((pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c)) + { + min_MPDU_spacing = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c); + } + else + { + min_MPDU_spacing = (pIE->data[i] & 0x1c); + } + + pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing; + } + } + + // Commented by Albert 2010/07/12 + // Have to handle the endian issue after copying. + // HT_ext_caps didn't be used yet. + pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info = le16_to_cpu( pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info ); + pmlmeinfo->HT_caps.HT_cap_element.HT_ext_caps = le16_to_cpu( pmlmeinfo->HT_caps.HT_cap_element.HT_ext_caps ); + + padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + + //update the MCS rates + for (i = 0; i < 16; i++) + { + if((rf_type == RF_1T1R) || (rf_type == RF_1T2R)) + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + } + else + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i]; + } + #ifdef RTL8192C_RECONFIG_TO_1T1R + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + } + #endif + } + + return; +} + +void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + + if(phtpriv->ht_option == _FALSE) return; + + + if(pIE->Length > sizeof(struct HT_info_element)) + return; + + pmlmeinfo->HT_info_enable = 1; + _rtw_memcpy(&(pmlmeinfo->HT_info), pIE->data, pIE->Length); + + return; +} + +void HTOnAssocRsp(_adapter *padapter) +{ + unsigned char max_AMPDU_len; + unsigned char min_MPDU_spacing; + unsigned char FactorLevel[18] = {2, 4, 4, 7, 7, 13, 13, 13, 2, 7, 7, 13, 13, 15, 15, 15, 15, 0}; + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + DBG_871X("%s\n", __FUNCTION__); + + if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) + { + pmlmeinfo->HT_enable = 1; + } + else + { + pmlmeinfo->HT_enable = 0; + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + return; + } + + //handle A-MPDU parameter field + /* + AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k + AMPDU_para [4:2]:Min MPDU Start Spacing + */ + max_AMPDU_len = pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x03; + + min_MPDU_spacing = (pmlmeinfo->HT_caps.HT_cap_element.AMPDU_para & 0x1c) >> 2; + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); + + if ((pregpriv->cbw40_enable) && + (pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info & BIT(1)) && + (pmlmeinfo->HT_info.infos[0] & BIT(2))) + { + //switch to the 40M Hz mode accoring to the AP + pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_40; + switch ((pmlmeinfo->HT_info.infos[0] & 0x3)) + { + case HT_EXTCHNL_OFFSET_UPPER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case HT_EXTCHNL_OFFSET_LOWER: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } + + //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset); + } + + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + + // + // Config SM Power Save setting + // + pmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.HT_cap_element.HT_caps_info & 0x0C) >> 2; + if(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) + { + /*u8 i; + //update the MCS rates + for (i = 0; i < 16; i++) + { + pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i]; + }*/ + DBG_8192C("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__); + } + + // + // Config current HT Protection mode. + // + pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3; + +} + +void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pIE->Length>1) + return; + + pmlmeinfo->ERP_enable = 1; + _rtw_memcpy(&(pmlmeinfo->ERP_IE), pIE->data, pIE->Length); +} + +void VCS_update(_adapter *padapter, struct sta_info *psta) +{ + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + switch (pregpriv->vrtl_carrier_sense)/* 0:off 1:on 2:auto */ + { + case 0: //off + psta->rtsen = 0; + psta->cts2self = 0; + break; + + case 1: //on + if (pregpriv->vcs_type == 1) /* 1:RTS/CTS 2:CTS to self */ + { + psta->rtsen = 1; + psta->cts2self = 0; + } + else + { + psta->rtsen = 0; + psta->cts2self = 1; + } + break; + + case 2: //auto + default: + if ((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1))) + { + if (pregpriv->vcs_type == 1) + { + psta->rtsen = 1; + psta->cts2self = 0; + } + else + { + psta->rtsen = 0; + psta->cts2self = 1; + } + } + else + { + psta->rtsen = 0; + psta->cts2self = 0; + } + break; + } +} + +void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta) +{ + unsigned int i; + unsigned int len; + PNDIS_802_11_VARIABLE_IEs pIE; + + len = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN); + + for (i = 0; i < len;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i); + + switch (pIE->ElementID) + { +#if 0 + case _VENDOR_SPECIFIC_IE_: + //todo: to update WMM paramter set while receiving beacon + if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM + { + (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0; + } + break; +#endif + + case _HT_EXTRA_INFO_IE_: //HT info + //HT_info_handler(padapter, pIE); + bwmode_update_check(padapter, pIE); + break; + + case _ERPINFO_IE_: + ERP_IE_handler(padapter, pIE); + VCS_update(padapter, psta); + break; + + default: + break; + } + + i += (pIE->Length + 2); + } +} + +unsigned int is_ap_in_tkip(_adapter *padapter) +{ + u32 i; + PNDIS_802_11_VARIABLE_IEs pIE; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + if (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY) + { + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4))) + { + return _TRUE; + } + break; + + case _RSN_IE_2_: + if (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4)) + { + return _TRUE; + } + + default: + break; + } + + i += (pIE->Length + 2); + } + + return _FALSE; + } + else + { + return _FALSE; + } + +} + +int wifirate2_ratetbl_inx(unsigned char rate) +{ + int inx = 0; + rate = rate & 0x7f; + + switch (rate) + { + case 54*2: + inx = 11; + break; + + case 48*2: + inx = 10; + break; + + case 36*2: + inx = 9; + break; + + case 24*2: + inx = 8; + break; + + case 18*2: + inx = 7; + break; + + case 12*2: + inx = 6; + break; + + case 9*2: + inx = 5; + break; + + case 6*2: + inx = 4; + break; + + case 11*2: + inx = 3; + break; + case 11: + inx = 2; + break; + + case 2*2: + inx = 1; + break; + + case 1*2: + inx = 0; + break; + + } + return inx; +} + +unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz) +{ + unsigned int i, num_of_rate; + unsigned int mask = 0; + + num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; + + for (i = 0; i < num_of_rate; i++) + { + if ((*(ptn + i)) & 0x80) + { + mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); + } + } + return mask; +} + +unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz) +{ + unsigned int i, num_of_rate; + unsigned int mask = 0; + + num_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz; + + for (i = 0; i < num_of_rate; i++) + { + mask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i)); + } + + return mask; +} + +unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps) +{ + unsigned int mask = 0; + + mask = ((pHT_caps->HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->HT_cap_element.MCS_rate[1] << 20)); + + return mask; +} + +int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps) +{ + unsigned char bit_offset; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if (!(pmlmeinfo->HT_enable)) + return _FAIL; + + if ((pmlmeinfo->assoc_AP_vendor == ralinkAP)) + return _FAIL; + + bit_offset = (pmlmeext->cur_bwmode & HT_CHANNEL_WIDTH_40)? 6: 5; + + if (pHT_caps->HT_cap_element.HT_caps_info & (0x1 << bit_offset)) + { + return _SUCCESS; + } + else + { + return _FAIL; + } +} + +unsigned char get_highest_rate_idx(u32 mask) +{ + int i; + unsigned char rate_idx=0; + + for(i=27; i>=0; i--) + { + if(mask & BIT(i)) + { + rate_idx = i; + break; + } + } + + return rate_idx; +} + +unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps) +{ + int i, mcs_rate; + + mcs_rate = (pHT_caps->HT_cap_element.MCS_rate[0] | (pHT_caps->HT_cap_element.MCS_rate[1] << 8)); + + for (i = 15; i >= 0; i--) + { + if (mcs_rate & (0x1 << i)) + { + break; + } + } + + return i; +} + +void Update_RA_Entry(_adapter *padapter, u32 mac_id) +{ + padapter->HalFunc.UpdateRAMaskHandler(padapter, mac_id); +} + +void enable_rate_adaptive(_adapter *padapter, u32 mac_id) +{ + Update_RA_Entry(padapter, mac_id); +} + +void set_sta_rate(_adapter *padapter, struct sta_info *psta) +{ + //rate adaptive + enable_rate_adaptive(padapter, psta->mac_id); +} + +unsigned char check_assoc_AP(u8 *pframe, uint len) +{ + unsigned int i; + PNDIS_802_11_VARIABLE_IEs pIE; + + for (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;) + { + pIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i); + + switch (pIE->ElementID) + { + case _VENDOR_SPECIFIC_IE_: + if ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3))) + { + DBG_871X("link to Artheros AP\n"); + return atherosAP; + } + else if ((_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3)) + || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3)) + || (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3))) + { + DBG_871X("link to Broadcom AP\n"); + return broadcomAP; + } + else if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3)) + { + DBG_871X("link to Marvell AP\n"); + return marvellAP; + } + else if (_rtw_memcmp(pIE->data, RALINK_OUI, 3)) + { + DBG_871X("link to Ralink AP\n"); + return ralinkAP; + } + else if (_rtw_memcmp(pIE->data, CISCO_OUI, 3)) + { + DBG_871X("link to Cisco AP\n"); + return ciscoAP; + } + else if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3)) + { + DBG_871X("link to Realtek 96B\n"); + return realtekAP; + } + else if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI,3)) + { + DBG_871X("link to Airgo Cap\n"); + return airgocapAP; + } + else + { + break; + } + + default: + break; + } + + i += (pIE->Length + 2); + } + + DBG_871X("link to new AP\n"); + return unknownAP; +} + +void update_IOT_info(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + switch (pmlmeinfo->assoc_AP_vendor) + { + case marvellAP: + pmlmeinfo->turboMode_cts2self = 1; + pmlmeinfo->turboMode_rtsen = 0; + break; + + case ralinkAP: + pmlmeinfo->turboMode_cts2self = 0; + pmlmeinfo->turboMode_rtsen = 1; + //disable high power + Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE); + break; + case realtekAP: + //rtw_write16(padapter, 0x4cc, 0xffff); + //rtw_write16(padapter, 0x546, 0x01c0); + //disable high power + Switch_DM_Func(padapter, (~DYNAMIC_FUNC_HP), _FALSE); + break; + default: + pmlmeinfo->turboMode_cts2self = 0; + pmlmeinfo->turboMode_rtsen = 1; + break; + } + +} + +void update_capinfo(PADAPTER Adapter, u16 updateCap) +{ + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + BOOLEAN ShortPreamble; + + // Check preamble mode, 2005.01.06, by rcnjko. + // Mark to update preamble value forever, 2008.03.18 by lanhsin + //if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO ) + { + + if(updateCap & cShortPreamble) + { // Short Preamble + if(pmlmeinfo->preamble_mode != PREAMBLE_SHORT) // PREAMBLE_LONG or PREAMBLE_AUTO + { + ShortPreamble = _TRUE; + pmlmeinfo->preamble_mode = PREAMBLE_SHORT; + Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); + } + } + else + { // Long Preamble + if(pmlmeinfo->preamble_mode != PREAMBLE_LONG) // PREAMBLE_SHORT or PREAMBLE_AUTO + { + ShortPreamble = _FALSE; + pmlmeinfo->preamble_mode = PREAMBLE_LONG; + Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble ); + } + } + } + + if ( updateCap & cIBSS ) { + //Filen: See 802.11-2007 p.91 + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; + } + else + { + //Filen: See 802.11-2007 p.90 + if( pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11_24N)) + { + if( (updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */) + { // Short Slot Time + if(pmlmeinfo->slotTime != SHORT_SLOT_TIME) + { + pmlmeinfo->slotTime = SHORT_SLOT_TIME; + } + } + else + { // Long Slot Time + if(pmlmeinfo->slotTime != NON_SHORT_SLOT_TIME) + { + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; + } + } + } + else if( pmlmeext->cur_wireless_mode & (WIRELESS_11A | WIRELESS_11_5N)) + { + pmlmeinfo->slotTime = SHORT_SLOT_TIME; + } + else + { + //B Mode + pmlmeinfo->slotTime = NON_SHORT_SLOT_TIME; + } + } + + Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime ); + +} + +void update_wireless_mode(_adapter *padapter) +{ + int ratelen, network_type = 0; + u16 SIFS_Timer; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + unsigned char *rate = cur_network->SupportedRates; + + ratelen = rtw_get_rateset_len(cur_network->SupportedRates); + + if ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable)) + { + pmlmeinfo->HT_enable = 1; + } + + if(pmlmeext->cur_channel > 14) + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_5N; + } + + network_type |= WIRELESS_11A; + } + else + { + if (pmlmeinfo->HT_enable) + { + network_type = WIRELESS_11_24N; + } + + if ((cckratesonly_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11B; + } + else if((cckrates_included(rate, ratelen)) == _TRUE) + { + network_type |= WIRELESS_11BG; + } + else + { + network_type |= WIRELESS_11G; + } + } + + pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode; + if((pmlmeext->cur_wireless_mode==WIRELESS_11G) || + (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G) + SIFS_Timer = 0x0a0a; + else + SIFS_Timer = 0x0e0e;//pHalData->SifsTime; + padapter->HalFunc.SetHwRegHandler( padapter, HW_VAR_SIFS, (u8 *)&SIFS_Timer); + +} + + +void fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value) +{ +#if 0 + struct cmd_obj *ph2c; + struct reg_rw_parm *pwriteMacPara; + struct cmd_priv *pcmdpriv = &(padapter->cmdpriv); + + if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) + { + return; + } + + if ((pwriteMacPara = (struct reg_rw_parm*)rtw_malloc(sizeof(struct reg_rw_parm))) == NULL) + { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + return; + } + + pwriteMacPara->rw = 1; + pwriteMacPara->addr = addr; + pwriteMacPara->value = value; + + init_h2fwcmd_w_parm_no_rsp(ph2c, pwriteMacPara, GEN_CMD_CODE(_Write_MACREG)); + rtw_enqueue_cmd(pcmdpriv, ph2c); +#endif +} + +u8 bmc_support_rate_ofdm[4] = + {IEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK, + IEEE80211_OFDM_RATE_18MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK}; +u8 bmc_support_rate_cck[4] = + {IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK, + IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK}; + +void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if(pmlmeext->cur_wireless_mode & WIRELESS_11B) + { + // Only B, B/G, and B/G/N AP could use CCK rate + _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), bmc_support_rate_cck, 4); + } + else + { + _rtw_memcpy((pmlmeinfo->FW_sta_info[mac_id].SupportedRates), bmc_support_rate_ofdm, 4); + } +} + +int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx) +{ + unsigned int ie_len; + PNDIS_802_11_VARIABLE_IEs pIE; + int supportRateNum = 0; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len); + if (pIE == NULL) + { + return _FAIL; + } + + _rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len); + supportRateNum = ie_len; + + pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len); + if (pIE) + { + _rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); + } + + return _SUCCESS; + +} + +void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) +{ + struct sta_info *psta; + u16 tid, start_seq, param; + struct recv_reorder_ctrl *preorder_ctrl; + struct sta_priv *pstapriv = &padapter->stapriv; + struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + psta = rtw_get_stainfo(pstapriv, addr); + + if(psta) + { + start_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4; + + param = le16_to_cpu(preq->BA_para_set); + tid = (param>>2)&0x0f; + + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + + #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ + preorder_ctrl->indicate_seq = start_seq; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __FUNCTION__, __LINE__, + preorder_ctrl->indicate_seq, start_seq); + #endif + #endif + + preorder_ctrl->enable =(pmlmeinfo->bAcceptAddbaReq == _TRUE)? _TRUE :_FALSE; + } + +} + +void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) +{ + u8* pIE; + u32 *pbuf; + + pIE = pframe + sizeof(struct ieee80211_hdr_3addr); + pbuf = (u32*)pIE; + + pmlmeext->TSFValue = le32_to_cpu(*(pbuf+1)); + + pmlmeext->TSFValue = pmlmeext->TSFValue << 32; + + pmlmeext->TSFValue |= le32_to_cpu(*pbuf); +} + +void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext) +{ + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_CORRECT_TSF, 0); +} + +void beacon_timing_control(_adapter *padapter) +{ + padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter); +} + +#if 0 +unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame) +{ + unsigned short ATIMWindow; + unsigned char *pframe; + struct tx_desc *ptxdesc; + struct ieee80211_hdr *pwlanhdr; + unsigned short *fctrl; + unsigned int rate_len, len = 0; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + _rtw_memset(beacon_frame, 0, 256); + + pframe = beacon_frame + TXDESC_SIZE; + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct ieee80211_hdr_3addr); + len = sizeof(struct ieee80211_hdr_3addr); + + //timestamp will be inserted by hardware + pframe += 8; + len += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + len += 2; + + // capability info: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + len += 2; + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &len); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &len); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &len); + + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &len); + + //todo: ERP IE + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len); + } + + if ((len + TXDESC_SIZE) > 256) + { + //DBG_8192C("marc: beacon frame too large\n"); + return 0; + } + + //fill the tx descriptor + ptxdesc = (struct tx_desc *)beacon_frame; + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); //default = 32 bytes for TX Desc + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32((0x10 << QSEL_SHT) & 0x00001f00); + + //offset 8 + ptxdesc->txdw2 |= cpu_to_le32(BMC); + ptxdesc->txdw2 |= cpu_to_le32(BK); + + //offset 16 + ptxdesc->txdw4 = 0x80000000; + + //offset 20 + ptxdesc->txdw5 = 0x00000000; //1M + + return (len + TXDESC_SIZE); +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/core/rtw_xmit.c b/drivers/net/wireless/rtl8192c/core/rtw_xmit.c new file mode 100755 index 000000000000..3cea26efa6f5 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/core/rtw_xmit.c @@ -0,0 +1,3835 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * +******************************************************************************/ +#define _RTW_XMIT_C_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_TDLS +#include +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#error "Shall be Linux or Windows, but not both!\n" +#endif + +#ifdef PLATFORM_WINDOWS +#include +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + + +static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; +static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; + +#ifdef CONFIG_TDLS +extern unsigned char MCS_rate_2R[16]; +extern unsigned char MCS_rate_1R[16]; +#endif + +static void _init_txservq(struct tx_servq *ptxservq) +{ +_func_enter_; + _rtw_init_listhead(&ptxservq->tx_pending); + _rtw_init_queue(&ptxservq->sta_pending); + ptxservq->qcnt = 0; +_func_exit_; +} + + +void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv) +{ + +_func_enter_; + + _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv)); + + _rtw_spinlock_init(&psta_xmitpriv->lock); + + //for(i = 0 ; i < MAX_NUMBLKS; i++) + // _init_txservq(&(psta_xmitpriv->blk_q[i])); + + _init_txservq(&psta_xmitpriv->be_q); + _init_txservq(&psta_xmitpriv->bk_q); + _init_txservq(&psta_xmitpriv->vi_q); + _init_txservq(&psta_xmitpriv->vo_q); + _rtw_init_listhead(&psta_xmitpriv->legacy_dz); + _rtw_init_listhead(&psta_xmitpriv->apsd); + +_func_exit_; + +} + +s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter) +{ + int i; + struct xmit_buf *pxmitbuf; + struct xmit_frame *pxframe; + sint res=_SUCCESS; + +_func_enter_; + + _rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv)); + + _rtw_spinlock_init(&pxmitpriv->lock); + _rtw_init_sema(&pxmitpriv->xmit_sema, 0); + _rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0); + + ATOMIC_SET(&pxmitpriv->HwRdyXmitData, 1); + + /* + Please insert all the queue initializaiton using _rtw_init_queue below + */ + + pxmitpriv->adapter = padapter; + + //for(i = 0 ; i < MAX_NUMBLKS; i++) + // _rtw_init_queue(&pxmitpriv->blk_strms[i]); + + _rtw_init_queue(&pxmitpriv->be_pending); + _rtw_init_queue(&pxmitpriv->bk_pending); + _rtw_init_queue(&pxmitpriv->vi_pending); + _rtw_init_queue(&pxmitpriv->vo_pending); + _rtw_init_queue(&pxmitpriv->bm_pending); + + //_rtw_init_queue(&pxmitpriv->legacy_dz_queue); + //_rtw_init_queue(&pxmitpriv->apsd_queue); + + _rtw_init_queue(&pxmitpriv->free_xmit_queue); + + + /* + Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, + and initialize free_xmit_frame below. + Please also apply free_txobj to link_up all the xmit_frames... + */ + + pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4); + + if (pxmitpriv->pallocated_frame_buf == NULL){ + pxmitpriv->pxmit_frame_buf =NULL; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_frame fail!\n")); + res= _FAIL; + goto exit; + } + pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4); + //pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - + // ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3); + + pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; + + for (i = 0; i < NR_XMITFRAME; i++) + { + _rtw_init_listhead(&(pxframe->list)); + + pxframe->padapter = padapter; + pxframe->frame_tag = NULL_FRAMETAG; + + pxframe->pkt = NULL; + + pxframe->buf_addr = NULL; + pxframe->pxmitbuf = NULL; + + rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue)); + + pxframe++; + } + + pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME; + + pxmitpriv->frag_len = MAX_FRAG_THRESHOLD; + + + //init xmit_buf + _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue); + _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue); + + pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4); + + if (pxmitpriv->pallocated_xmitbuf == NULL){ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_buf fail!\n")); + res= _FAIL; + goto exit; + } + + pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4); + //pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - + // ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3); + + pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf; + + for (i = 0; i < NR_XMITBUFF; i++) + { + _rtw_init_listhead(&pxmitbuf->list); + + pxmitbuf->priv_data = NULL; + pxmitbuf->padapter = padapter; + pxmitbuf->ext_tag = _FALSE; + +/* + pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ); + if (pxmitbuf->pallocated_buf == NULL) + { + res = _FAIL; + goto exit; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); + //pxmitbuf->pbuf = pxmitbuf->pallocated_buf + XMITBUF_ALIGN_SZ -((SIZE_PTR) (pxmitbuf->pallocated_buf) &(XMITBUF_ALIGN_SZ-1)); +*/ + + if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ))) == _FAIL) { + res= _FAIL; + goto exit; + } + + pxmitbuf->flags = XMIT_VO_QUEUE; + + rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue)); + #ifdef DBG_XMIT_BUF + pxmitbuf->no=i; + #endif + + pxmitbuf++; + + } + + pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF; + + // Init xmit extension buff + _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue); + + pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); + + if (pxmitpriv->pallocated_xmit_extbuf == NULL){ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n")); + res= _FAIL; + goto exit; + } + + pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4); + + pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf; + + for (i = 0; i < NR_XMIT_EXTBUFF; i++) + { + _rtw_init_listhead(&pxmitbuf->list); + + pxmitbuf->priv_data = NULL; + pxmitbuf->padapter = padapter; + pxmitbuf->ext_tag = _TRUE; + +/* + pxmitbuf->pallocated_buf = rtw_zmalloc(MAX_XMIT_EXTBUF_SZ); + if (pxmitbuf->pallocated_buf == NULL) + { + res = _FAIL; + goto exit; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), 4); +*/ + + if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ)) == _FAIL) { + res= _FAIL; + goto exit; + } + + rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue)); + #ifdef DBG_XMIT_BUF + pxmitbuf->no=i; + #endif + pxmitbuf++; + + } + + pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF; + + rtw_alloc_hwxmits(padapter); + rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); + +#ifdef CONFIG_USB_HCI + pxmitpriv->txirp_cnt=1; + + _rtw_init_sema(&(pxmitpriv->tx_retevt), 0); + + //per AC pending irp + pxmitpriv->beq_cnt = 0; + pxmitpriv->bkq_cnt = 0; + pxmitpriv->viq_cnt = 0; + pxmitpriv->voq_cnt = 0; +#endif + + if(padapter->HalFunc.init_xmit_priv != NULL) + padapter->HalFunc.init_xmit_priv(padapter); + +exit: + +_func_exit_; + + return res; +} + +void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv) +{ + _rtw_spinlock_free(&pxmitpriv->lock); + _rtw_free_sema(&pxmitpriv->xmit_sema); + _rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema); + + _rtw_spinlock_free(&pxmitpriv->be_pending.lock); + _rtw_spinlock_free(&pxmitpriv->bk_pending.lock); + _rtw_spinlock_free(&pxmitpriv->vi_pending.lock); + _rtw_spinlock_free(&pxmitpriv->vo_pending.lock); + _rtw_spinlock_free(&pxmitpriv->bm_pending.lock); + + //_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock); + //_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock); + + _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock); + _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock); + _rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock); +} + + +void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv) +{ + int i; + _adapter *padapter = pxmitpriv->adapter; + struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf; + + _func_enter_; + + padapter->HalFunc.free_xmit_priv(padapter); + + rtw_mfree_xmit_priv_lock(pxmitpriv); + + if(pxmitpriv->pxmit_frame_buf==NULL) + goto out; + + for(i=0; ipallocated_buf) + // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ); + + pxmitbuf++; + } + + if(pxmitpriv->pallocated_frame_buf) { + rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4); + } + + + if(pxmitpriv->pallocated_xmitbuf) { + rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4); + } + + // free xmit extension buff + _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock); + + pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; + for(i=0; ipallocated_buf) + // rtw_mfree(pxmitbuf->pallocated_buf, MAX_XMIT_EXTBUF_SZ); + + pxmitbuf++; + } + + if(pxmitpriv->pallocated_xmit_extbuf) { + rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4); + } + + rtw_free_hwxmits(padapter); + +out: + +_func_exit_; + +} + +static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + u32 sz; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *psta = pattrib->psta; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + if (pattrib->nr_frags != 1) + { + sz = padapter->xmitpriv.frag_len; + } + else //no frag + { + sz = pattrib->last_txcmdsz; + } + + // (1) RTS_Threshold is compared to the MPDU, not MSDU. + // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. + // Other fragments are protected by previous fragment. + // So we only need to check the length of first fragment. + if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec) + { + if(sz > padapter->registrypriv.rts_thresh) + { + pattrib->vcs_mode = RTS_CTS; + } + else + { + if(psta->rtsen) + pattrib->vcs_mode = RTS_CTS; + else if(psta->cts2self) + pattrib->vcs_mode = CTS_TO_SELF; + else + pattrib->vcs_mode = NONE_VCS; + } + } + else + { + while (_TRUE) + { +#if 0 //Todo + //check IOT action + if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF) + { + pattrib->vcs_mode = CTS_TO_SELF; + pattrib->rts_rate = MGN_24M; + break; + } + else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE)) + { + pattrib->vcs_mode = RTS_CTS; + pattrib->rts_rate = MGN_24M; + break; + } +#endif + + //IOT action + if((pmlmeinfo->assoc_AP_vendor == atherosAP) && (pattrib->ampdu_en==_TRUE) && + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )) + { + pattrib->vcs_mode = CTS_TO_SELF; + break; + } + + + //check ERP protection + if(psta->rtsen || psta->cts2self) + { + if(psta->rtsen) + pattrib->vcs_mode = RTS_CTS; + else if(psta->cts2self) + pattrib->vcs_mode = CTS_TO_SELF; + + break; + } + + //check HT op mode + if(pattrib->ht_en) + { + u8 HTOpMode = pmlmeinfo->HT_protection; + if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) || + (!pmlmeext->cur_bwmode && HTOpMode == 3) ) + { + pattrib->vcs_mode = RTS_CTS; + break; + } + } + + //check rts + if(sz > padapter->registrypriv.rts_thresh) + { + pattrib->vcs_mode = RTS_CTS; + break; + } + + //to do list: check MIMO power save condition. + + //check AMPDU aggregation for TXOP + if(pattrib->ampdu_en==_TRUE) + { + pattrib->vcs_mode = RTS_CTS; + break; + } + + pattrib->vcs_mode = NONE_VCS; + break; + } + } +} + +static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta) +{ + /*if(psta->rtsen) + pattrib->vcs_mode = RTS_CTS; + else if(psta->cts2self) + pattrib->vcs_mode = CTS_TO_SELF; + else + pattrib->vcs_mode = NONE_VCS;*/ + + pattrib->mdata = 0; + pattrib->eosp = 0; + pattrib->triggered=0; + + //qos_en, ht_en, init rate, ,bw, ch_offset, sgi + pattrib->qos_en = psta->qos_option; + pattrib->ht_en = psta->htpriv.ht_option; + pattrib->raid = psta->raid; + pattrib->bwmode = psta->htpriv.bwmode; + pattrib->ch_offset = psta->htpriv.ch_offset; + pattrib->sgi= psta->htpriv.sgi; + pattrib->ampdu_en = _FALSE; + + //if(pattrib->ht_en && psta->htpriv.ampdu_enable) + //{ + // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + // pattrib->ampdu_en = _TRUE; + //} + +} + +static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib) +{ + struct ethhdr etherhdr; + struct iphdr ip_hdr; + s32 UserPriority = 0; + + + _rtw_open_pktfile(ppktfile->pkt, ppktfile); + _rtw_pktfile_read(ppktfile, (unsigned char*)ðerhdr, ETH_HLEN); + + // get UserPriority from IP hdr + if (pattrib->ether_type == 0x0800) { + _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr)); +// UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; + UserPriority = ip_hdr.tos >> 5; + } else if (pattrib->ether_type == 0x888e) { + // "When priority processing of data frames is supported, + // a STA's SME should send EAPOL-Key frames at the highest priority." + UserPriority = 7; + } + + pattrib->priority = UserPriority; + pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; + pattrib->subtype = WIFI_QOS_DATA_TYPE; +} + +static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib) +{ + uint i; + struct pkt_file pktfile; + struct sta_info *psta = NULL; + struct ethhdr etherhdr; + + sint bmcast; + struct sta_priv *pstapriv = &padapter->stapriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv= &pmlmepriv->qospriv; + sint res = _SUCCESS; + + _func_enter_; + + _rtw_open_pktfile(pkt, &pktfile); + i = _rtw_pktfile_read(&pktfile, (u8*)ðerhdr, ETH_HLEN); + + pattrib->ether_type = ntohs(etherhdr.h_proto); + + + _rtw_memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN); + _rtw_memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN); + + pattrib->pctrl = 0; + + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + } + else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { + _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN); + } + else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { + _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN); + } + + pattrib->pktlen = pktfile.pkt_len; // rtw_xmitframe_coalesce() overwirte this! + + if (ETH_P_IP == pattrib->ether_type) + { + // The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time + // to prevent DHCP protocol fail + u8 tmp[24]; + _rtw_pktfile_read(&pktfile, &tmp[0], 24); + pattrib->dhcp_pkt = 0; + if (pktfile.pkt_len > 282) {//MINIMUM_DHCP_PACKET_SIZE) { + if (ETH_P_IP == pattrib->ether_type) {// IP header + if (((tmp[21] == 68) && (tmp[23] == 67)) || + ((tmp[21] == 67) && (tmp[23] == 68))) { + // 68 : UDP BOOTP client + // 67 : UDP BOOTP server + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("======================update_attrib: get DHCP Packet \n")); + // Use low rate to send DHCP packet. + //if(pMgntInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom) + //{ + // tcb_desc->DataRate = MgntQuery_TxRateExcludeCCKRates(ieee);//0xc;//ofdm 6m + // tcb_desc->bTxDisableRateFallBack = false; + //} + //else + // pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate; + //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate)); + pattrib->dhcp_pkt = 1; + } + } + } + } + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + if ( (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) + { + rtw_set_scan_deny(pmlmepriv, 3000); + } + #endif + +#ifdef CONFIG_LPS + // If EAPOL , ARP , OR DHCP packet, driver must be in active mode. + if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) + { + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1); + } +#endif + + bmcast = IS_MCAST(pattrib->ra); + + // get sta_info + if (bmcast) { + psta = rtw_get_bcmc_stainfo(padapter); + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + if (psta == NULL) { // if we cannot get psta => drrp the pkt + RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra))); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); + #endif + res =_FAIL; + goto exit; + } + else if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED))) + { + res =_FAIL; + goto exit; + } + } + + if (psta) + { + pattrib->mac_id = psta->mac_id; + pattrib->psta = psta; + } + else + { + // if we cannot get psta => drop the pkt + RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra))); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra)); + #endif + res = _FAIL; + goto exit; + } + + pattrib->ack_policy = 0; + // get ether_hdr_len + pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag + + pattrib->hdrlen = WLAN_HDR_A3_LEN; + pattrib->subtype = WIFI_DATA_TYPE; + pattrib->priority = 0; + + if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) + { + if(psta->qos_option) + set_qos(&pktfile, pattrib); + } + else + { + if(pqospriv->qos_option) + set_qos(&pktfile, pattrib); + } + + //pattrib->priority = 5; //force to used VI queue, for testing + + if (psta->ieee8021x_blocked == _TRUE) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n")); + + pattrib->encrypt = 0; + + if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type)); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n", __FUNCTION__,pattrib->ether_type); + #endif + res = _FAIL; + goto exit; + } + } + else + { + GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast); + + switch(psecuritypriv->dot11AuthAlgrthm) + { + case dot11AuthAlgrthm_Open: + case dot11AuthAlgrthm_Shared: + case dot11AuthAlgrthm_Auto: + pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex; + break; + case dot11AuthAlgrthm_8021X: + if(bmcast) + pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid; + else + pattrib->key_idx = 0; + break; + default: + pattrib->key_idx = 0; + break; + } + + + } + + switch (pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + pattrib->iv_len = 4; + pattrib->icv_len = 4; + break; + + case _TKIP_: + pattrib->iv_len = 8; + pattrib->icv_len = 4; + + if(padapter->securitypriv.busetkipkey==_FAIL) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npadapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", padapter->securitypriv.busetkipkey)); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s padapter->securitypriv.busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, padapter->securitypriv.busetkipkey); + #endif + res =_FAIL; + goto exit; + } + + break; + case _AES_: + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n pattrib->encrypt=%d (_AES_)\n",pattrib->encrypt)); + pattrib->iv_len = 8; + pattrib->icv_len = 8; + break; + + default: + pattrib->iv_len = 0; + pattrib->icv_len = 0; + break; + } + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, + ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n", + pattrib->encrypt, padapter->securitypriv.sw_encrypt)); + + if (pattrib->encrypt && + ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) + { + pattrib->bswenc = _TRUE; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_, + ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n", + pattrib->encrypt, padapter->securitypriv.sw_encrypt)); + } else { + pattrib->bswenc = _FALSE; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n")); + } + + rtw_set_tx_chksum_offload(pkt, pattrib); + + update_attrib_phy_info(pattrib, psta); + +exit: + +_func_exit_; + + return res; +} + +static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){ + sint curfragnum,length; + u8 *pframe, *payload,mic[8]; + struct mic_data micdata; + struct sta_info *stainfo; + struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct security_priv *psecuritypriv=&padapter->securitypriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + u8 priority[4]={0x0,0x0,0x0,0x0}; + sint bmcst = IS_MCAST(pattrib->ra); + + if(pattrib->psta) + { + stainfo = pattrib->psta; + } + else + { + stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]); + } + + + +_func_enter_; + + if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_) + { + //encode mic code + if(stainfo!= NULL){ + u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; + +#ifdef CONFIG_USB_TX_AGGREGATION + pframe = pxmitframe->buf_addr + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); +#else + pframe = pxmitframe->buf_addr + TXDESC_OFFSET; +#endif + + if(bmcst) + { + if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){ + //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); + //rtw_msleep_os(10); + return _FAIL; + } + //start to calculate the mic code + rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey); + } + else + { + if(_rtw_memcmp(&stainfo->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){ + //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); + //rtw_msleep_os(10); + return _FAIL; + } + //start to calculate the mic code + rtw_secmicsetkey(&micdata, &stainfo->dot11tkiptxmickey.skey[0]); + } + + if(pframe[1]&1){ //ToDS==1 + rtw_secmicappend(&micdata, &pframe[16], 6); //DA + if(pframe[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &pframe[24], 6); + else + rtw_secmicappend(&micdata, &pframe[10], 6); + } + else{ //ToDS==0 + rtw_secmicappend(&micdata, &pframe[4], 6); //DA + if(pframe[1]&2) //From Ds==1 + rtw_secmicappend(&micdata, &pframe[16], 6); + else + rtw_secmicappend(&micdata, &pframe[10], 6); + + } + + //if(pqospriv->qos_option==1) + if(pattrib->qos_en) + priority[0]=(u8)pxmitframe->attrib.priority; + + + rtw_secmicappend(&micdata, &priority[0], 4); + + payload=pframe; + + for(curfragnum=0;curfragnumnr_frags;curfragnum++){ + payload=(u8 *)RND4((SIZE_PTR)(payload)); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n", + curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7))); + + payload=payload+pattrib->hdrlen+pattrib->iv_len; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len)); + if((curfragnum+1)==pattrib->nr_frags){ + length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); + rtw_secmicappend(&micdata, payload,length); + payload=payload+length; + } + else{ + length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0); + rtw_secmicappend(&micdata, payload, length); + payload=payload+length+pattrib->icv_len; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len)); + } + } + rtw_secgetmic(&micdata,&(mic[0])); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n")); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz)); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \n\ + mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n", + mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7])); + //add mic code and add the mic code length in last_txcmdsz + + _rtw_memcpy(payload, &(mic[0]),8); + pattrib->last_txcmdsz+=8; + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n")); + payload=payload-pattrib->last_txcmdsz+8; + for(curfragnum=0;curfragnumlast_txcmdsz;curfragnum=curfragnum+8) + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ", + *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3), + *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7))); + } + else{ + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n")); + } + } + +_func_exit_; + + return _SUCCESS; +} + +static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + //struct security_priv *psecuritypriv=&padapter->securitypriv; + +_func_enter_; + + //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc)) + if(pattrib->bswenc) + { + //DBG_8192C("start xmitframe_swencrypt\n"); + RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n")); + switch(pattrib->encrypt){ + case _WEP40_: + case _WEP104_: + rtw_wep_encrypt(padapter, (u8 *)pxmitframe); + break; + case _TKIP_: + rtw_tkip_encrypt(padapter, (u8 *)pxmitframe); + break; + case _AES_: + rtw_aes_encrypt(padapter, (u8 * )pxmitframe); + break; + default: + break; + } + + } else { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n")); + } + +_func_exit_; + + return _SUCCESS; +} + +s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib) +{ + u16 *qc; + + struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv = &pmlmepriv->qospriv; + u8 qos_option = _FALSE; +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta=NULL; + u8 tdls_seq=0; +#endif + +//#ifdef CONFIG_PWRCTRL +// struct pwrctrl_priv *pwrpriv = &(padapter->pwrctrlpriv); +//#endif + + sint res = _SUCCESS; + u16 *fctrl = &pwlanhdr->frame_ctl; + + struct sta_info *psta; + + sint bmcst = IS_MCAST(pattrib->ra); + +_func_enter_; + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + if(bmcst) { + psta = rtw_get_bcmc_stainfo(padapter); + } else { + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } + } + + _rtw_memset(hdr, 0, WLANHDR_OFFSET); + + SetFrameSubType(fctrl, pattrib->subtype); + + if (pattrib->subtype & WIFI_DATA_TYPE) + { + if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) { + //to_ds = 1, fr_ds = 0; +#ifdef CONFIG_TDLS + if((pmlmeinfo->tdls_setup_state==TDLS_LINKED_STATE)){ + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if((ptdls_sta!=NULL)&&((ptdls_sta->state & TDLS_LINKED_STATE)==TDLS_LINKED_STATE)&&(pattrib->ether_type!=0x0806)){ + //TDLS data transfer, ToDS=0, FrDs=0 + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); + tdls_seq=1; + }else{ + // 1.usual data transfer + // 2.Arp pkt will relayed by AP + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); + } + }else +#endif + { + //usual data transfer + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); + } + + if (pqospriv->qos_option) + qos_option = _TRUE; + + } + else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) { + //to_ds = 0, fr_ds = 1; + SetFrDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN); + + if(psta->qos_option) + qos_option = _TRUE; + } + else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) { + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); + + if(psta->qos_option) + qos_option = _TRUE; + } + else { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv))); + res = _FAIL; + goto exit; + } + +/*#ifdef CONFIG_PWRCTRL + if (pwrpriv->cpwm >= FW_PWR1 && !(padapter->mlmepriv.sitesurveyctrl.traffic_busy)) + SetPwrMgt(fctrl); +#else + if ((get_fwstate(pmlmepriv)) & WIFI_SLEEP_STATE) + SetPwrMgt(fctrl); +#endif*/ + + if(pattrib->mdata) + SetMData(fctrl); + + if (pattrib->encrypt) + SetPrivacy(fctrl); + + if (qos_option) + { + qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); + + if (pattrib->priority) + SetPriority(qc, pattrib->priority); + + + SetEOSP(qc, pattrib->eosp); + + SetAckpolicy(qc, pattrib->ack_policy); + } + + //TODO: fill HT Control Field + + //Update Seq Num will be handled by f/w + { + +#ifdef CONFIG_TDLS + // 1. update seq_num per link by sta_info + // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len + if(tdls_seq==1){ + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + + SetSeqNum(hdr, pattrib->seqnum); + + if (pattrib->encrypt){ + pattrib->encrypt= _AES_; + pattrib->iv_len=8; + pattrib->icv_len=8; + } + }else +#endif + if(psta){ + psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + + pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; + + SetSeqNum(hdr, pattrib->seqnum); + + + //check if enable ampdu + if(pattrib->ht_en && psta->htpriv.ampdu_enable) + { + if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) + pattrib->ampdu_en = _TRUE; + } + + //re-check if enable ampdu by BA_starting_seqctrl + if(pattrib->ampdu_en == _TRUE) + { + u16 tx_seq; + + tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f]; + + //check BA_starting_seqctrl + if(SN_LESS(pattrib->seqnum, tx_seq)) + { + //DBG_871X("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq); + pattrib->ampdu_en = _FALSE;//AGG BK + } + else if(SN_EQUAL(pattrib->seqnum, tx_seq)) + { + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff; + + pattrib->ampdu_en = _TRUE;//AGG EN + } + else + { + //DBG_871X("tx ampdu over run\n"); + psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff; + pattrib->ampdu_en = _TRUE;//AGG EN + } + + } + + } + } + + } + else + { + + } + +exit: + +_func_exit_; + + return res; +} + +s32 rtw_txframes_pending(_adapter *padapter) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) || + (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE)); +} + +s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib) +{ + struct sta_info *psta; + struct tx_servq *ptxservq; + int priority = pattrib->priority; + + psta = pattrib->psta; + + switch(priority) + { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + break; + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + break; + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + break; + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + break; + + } + + return ptxservq->qcnt; +} + +#ifdef CONFIG_TDLS +void fill_tdls_setup_req_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ieee80211_ht_cap ht_capie; + struct sta_priv *pstapriv=&padapter->stapriv; + struct sta_info *ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_REQUEST; + unsigned char bssrate[NumRates]; + int bssrate_len = 0, i = 0 ; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch. + //RSNIE + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + u8 iedata=0; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 time; + + //SNonce + if(pattrib->encrypt){ + for(i=0;i<8;i++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pregistrypriv->dev_network.SupportedRates[bssrate_len]== 0) break; + bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; + } + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, wmm_ie, &(pattrib->pktlen)); + + //FTIE(optional) + if(pattrib->encrypt){ + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + + } + + //Sup_reg_classes(optional) + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | + (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; + + switch(pHalData->rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_setup_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_info *ptdls_sta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ieee80211_ht_cap ht_capie; + + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_RESPONSE; + unsigned char bssrate[NumRates]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u16 *stat_code = (u16 *)&pattrib->type; + u8 *dialog_token = &pattrib->nr_frags; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch + u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + u8 iedata=0; + u8 timeout_itvl[5]; //setup response timeout interval will copy from request + u8 ANonce[32]; //maybe it can put in ontdls_req + u8 k; //for random ANonce + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + u32 time; + + ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if(pattrib->encrypt){ + for(k=0;k<8;k++){ + time=rtw_get_current_time(); + _rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4); + } + } + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + return; + + //dialog token + pframe = rtw_set_fixed_ie(pframe, 1, dialog_token, &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt ) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pregistrypriv->dev_network.SupportedRates[bssrate_len]== 0) break; + bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; + } + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //country(optional) + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + } + + //extended capabilities + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); + + //QoS capability(WMM_IE) + pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 7, wmm_ie, &(pattrib->pktlen)); + + //FTIE(optional) + if(pattrib->encrypt){ + wpa_tdls_generate_tpk(padapter, ptdls_sta); + + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //Sup_reg_classes(optional) + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | + (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; + + switch(pHalData->rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill ftie mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +} + +void fill_tdls_setup_cfm_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_SETUP_CONFIRM; + unsigned char bssrate[NumRates]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u8 *dialog_token = &pattrib->nr_frags; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 *pftie, *ptimeout_ie, *plinkid_ie, *prsnie, *pftie_mic; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status code, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, dialog_token, &(pattrib->pktlen)); + + if(ptdls_sta->stat_code!=0) //invalid setup request + return; + + //RSNIE + if(pattrib->encrypt){ + prsnie = pframe; + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + } + + //EDCA param set; WMM param ele. + if(pattrib->encrypt){ + //FTIE + pftie = pframe; + pftie_mic = pframe+4; + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + _rtw_memcpy((pframe+20), ptdls_sta->ANonce, 32); + _rtw_memcpy((pframe+52), ptdls_sta->SNonce, 32); + pframe += 84; + pattrib->pktlen += 84; + + //Timeout interval + ptimeout_ie = pframe; + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4); + ptdls_sta->TPK_count=0; + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + } + + //HT operation; todo + //Link identifier + plinkid_ie = pframe; + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //fill ftie mic + if(pattrib->encrypt) + wpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic); + +} + +void fill_tdls_teardown_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_TEARDOWN; + unsigned char reason = _RSON_TDLS_TEAR_UN_RSN_; + u8 link_id_addr[18] = {0}; + + struct sta_info *ptear_sta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(reason), &(pattrib->pktlen)); + + //Link identifier + ptear_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + if((ptear_sta->state & TDLS_INITIATOR_STATE)==TDLS_INITIATOR_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + }else if((ptear_sta->state & TDLS_RESPONDER_STATE)==TDLS_RESPONDER_STATE){ + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + } + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_dis_req_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_DISCOVERY_REQUEST; + u8 link_id_addr[18] = {0}; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_dis_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + struct ieee80211_ht_cap ht_capie; + + unsigned char category = WLAN_CATEGORY_PUBLIC; + unsigned char action = TDLS_DISCOVERY_RESPONSE; + unsigned char bssrate[NumRates]; + int bssrate_len = 0; + u8 more_supportedrates = 0; + u8 country[8] = {0}; + u8 ext_cap_ie[5] = {0x00, 0x00, 0x00, 0x50, 0x20}; //bit(28), bit(30), bit(37) + unsigned int ie_len; + unsigned char *p; + struct registry_priv *pregpriv = &padapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + u8 link_id_addr[18] = {0}; + u8 sup_ch[2]={ 1, 11 }; //First ch. no., no.of ch. + //RSNIE + u8 RSNIE[20]= + { 0x01, 0x00, //version shall be set to 1 + 0x00, 0x0f, 0xac, 0x07, //group sipher suite + 0x01, 0x00, //pairwise cipher suite count + 0x00, 0x0f, 0xac, 0x04, //pairwise cipher suite list; CCMP only + 0x01, 0x00, //AKM suite count + 0x00, 0x0f, 0xac, 0x07, //TPK Handshake + 0x00, 0x02, + //PMKID shall not be present + }; + u8 wmm_ie[7]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; //Qos info all set zero + u8 iedata=0; + u8 timeout_itvl[5]; //set timeout interval to maximum value + u32 timeout_interval= TPK_RESEND_COUNT * 1000; + + //category, action, dialog token + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //capability + _rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2); + + if(pattrib->encrypt) + *pframe =*pframe | BIT(4); + pframe += 2; + pattrib->pktlen += 2; + + //supported rates + for (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) { + if (pregistrypriv->dev_network.SupportedRates[bssrate_len] == 0) break; + bssrate[bssrate_len] = pregistrypriv->dev_network.SupportedRates[bssrate_len]; + } + + if (bssrate_len > 8) + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen)); + more_supportedrates = 1; + } + else + { + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen)); + } + + //extended supported rates + if(more_supportedrates==1){ + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen)); + } + + //supported channels + pframe = rtw_set_ie(pframe, _SUPPORTED_CH_IE_, 2, sup_ch, &(pattrib->pktlen)); + + //RSNIE + if(pattrib->encrypt) + pframe = rtw_set_ie(pframe, _RSN_IE_2_, 20, RSNIE, &(pattrib->pktlen)); + + //extended capability + pframe = rtw_set_ie(pframe, _EXT_CAP_IE_ , 5, ext_cap_ie, &(pattrib->pktlen)); + + //FTIE + if(pattrib->encrypt){ + _rtw_memset(pframe, 0, 84); //All fields except SNonce shall be set to 0 + _rtw_memset(pframe, _FTIE_, 1); //version + _rtw_memset((pframe+1), 82, 1); //length + pframe += 84; + pattrib->pktlen += 84; + //Timeout interval + timeout_itvl[0]=0x02; + _rtw_memcpy(timeout_itvl+1, &timeout_interval, 4); + pframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen)); + + } + + //Sup_reg_classes(optional) + //HT capabilities + _rtw_memset(&ht_capie, 0, sizeof(struct ieee80211_ht_cap)); + + ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH |IEEE80211_HT_CAP_SGI_20 |IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_TX_STBC |IEEE80211_HT_CAP_DSSSCCK40; + + { + u32 rx_packet_offset, max_recvbuf_sz; + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + padapter->HalFunc.GetHalDefVarHandler(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + if(max_recvbuf_sz-rx_packet_offset>(8191-256)) + ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; + } + + ht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03) | + (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00) ; + + switch(pHalData->rf_type) + { + case RF_1T1R: + ht_capie.cap_info |= 0x0100;//RX STBC One spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16); + break; + + case RF_2T2R: + case RF_1T2R: + default: + ht_capie.cap_info|= 0x0200;//RX STBC two spatial stream + _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16); + break; + } + + pframe = rtw_set_ie(pframe, _HT_CAPABILITY_IE_, + sizeof(struct ieee80211_ht_cap), (unsigned char*)&ht_capie, &(pattrib->pktlen)); + + //20/40 BSS coexistence + if(pmlmepriv->num_FortyMHzIntolerant>0) + iedata |= BIT(2);//20 MHz BSS Width Request + pframe = rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->dst, 6); + _rtw_memcpy((link_id_addr+12), pattrib->src, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + +} + +void fill_tdls_peer_traffic_indication(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_PEER_TRAFFIC_INDICATION; + u8 link_id_addr[18] = {0}; + u8 AC_queue=0; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, reason code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pattrib->nr_frags), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //PTI control + //PU buffer status + if(ptdls_sta->uapsd_bk&BIT(0)) + AC_queue=BIT(0); + if(ptdls_sta->uapsd_be&BIT(0)) + AC_queue=BIT(1); + if(ptdls_sta->uapsd_vi&BIT(0)) + AC_queue=BIT(2); + if(ptdls_sta->uapsd_vo&BIT(0)) + AC_queue=BIT(3); + pframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen)); + +} + +void fill_tdls_ch_switch_req(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_REQUEST; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 ch_switch_timing[4] = {0}; + u16 switch_time= CH_SWITCH_TIME, switch_timeout=CH_SWITCH_TIMEOUT; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, target_ch + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->tdls_candidate_ch), &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + + //update ch switch attrib to sta_info + ptdls_sta->off_ch=pmlmeinfo->tdls_candidate_ch; + ptdls_sta->ch_switch_time=switch_time; + ptdls_sta->ch_switch_timeout=switch_timeout; + +} + +void fill_tdls_ch_switch_rsp(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe) +{ + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 payload_type = 0x02; + unsigned char category = WLAN_CATEGORY_TDLS; + unsigned char action = TDLS_CHANNEL_SWITCH_RESPONSE; + u8 link_id_addr[18] = {0}; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u8 ch_switch_timing[4] = {0}; + + //payload type + pframe = rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen)); + //category, action, status_code + pframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen)); + pframe = rtw_set_fixed_ie(pframe, 2, (u8 *)&ptdls_sta->stat_code, &(pattrib->pktlen)); + + //Link identifier + _rtw_memcpy(link_id_addr, pattrib->ra, 6); + _rtw_memcpy((link_id_addr+6), pattrib->src, 6); + _rtw_memcpy((link_id_addr+12), pattrib->dst, 6); + pframe = rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen)); + + //ch switch timing + _rtw_memcpy(ch_switch_timing, &ptdls_sta->ch_switch_time, 2); + _rtw_memcpy(ch_switch_timing+2, &ptdls_sta->ch_switch_timeout, 2); + pframe = rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen)); + +} + +int fill_tdls_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, u8 action) +{ + int res=_SUCCESS; + + switch(action){ + case TDLS_SETUP_REQUEST: + fill_tdls_setup_req_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_SETUP_RESPONSE: + fill_tdls_setup_rsp_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_SETUP_CONFIRM: + fill_tdls_setup_cfm_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_TEARDOWN: + fill_tdls_teardown_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_DISCOVERY_REQUEST: + fill_tdls_dis_req_frbody(padapter, pxmitframe, pframe); + break; + case TDLS_PEER_TRAFFIC_INDICATION: + fill_tdls_peer_traffic_indication(padapter, pxmitframe, pframe); + break; + case TDLS_CHANNEL_SWITCH_REQUEST: + fill_tdls_ch_switch_req(padapter, pxmitframe, pframe); + break; + case TDLS_CHANNEL_SWITCH_RESPONSE: + fill_tdls_ch_switch_rsp(padapter, pxmitframe, pframe); + break; + default: + res=_FAIL; + break; + } + + return res; +} + +s32 make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, u8 action) +{ + u16 *qc; + struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct qos_priv *pqospriv = &pmlmepriv->qospriv; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta=NULL, *ptdls_sta=NULL; + u8 tdls_seq=0; + + sint res = _SUCCESS; + u16 *fctrl = &pwlanhdr->frame_ctl; + +_func_enter_; + + _rtw_memset(hdr, 0, WLANHDR_OFFSET); + + SetFrameSubType(fctrl, pattrib->subtype); + + switch(action){ + case TDLS_SETUP_REQUEST: + case TDLS_SETUP_RESPONSE: + case TDLS_SETUP_CONFIRM: + case TDLS_TEARDOWN: //directly to peer STA or via AP + case TDLS_PEER_TRAFFIC_INDICATION: + case TDLS_PEER_PSM_REQUEST: //directly to peer STA or via AP + case TDLS_DISCOVERY_REQUEST: //unicast: directly to peer sta, Bcast: via AP + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN); + break; + case TDLS_CHANNEL_SWITCH_REQUEST: + case TDLS_CHANNEL_SWITCH_RESPONSE: + case TDLS_PEER_PSM_RESPONSE: + case TDLS_PEER_TRAFFIC_RESPONSE: + _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); + tdls_seq=1; + break; + } + + if (pattrib->encrypt) + SetPrivacy(fctrl); + + if (pqospriv->qos_option) + { + qc = (unsigned short *)(hdr + pattrib->hdrlen - 2); + if (pattrib->priority) + SetPriority(qc, pattrib->priority); + SetAckpolicy(qc, pattrib->ack_policy); + } + + psta = pattrib->psta; + + // 1. update seq_num per link by sta_info + // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len + if(tdls_seq==1){ + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + if(ptdls_sta){ + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(hdr, pattrib->seqnum); + + if (pattrib->encrypt){ + pattrib->encrypt= _AES_; + pattrib->iv_len=8; + pattrib->icv_len=8; + } + }else{ + res=_FAIL; + goto exit; + } + }else if(psta){ + psta->sta_xmitpriv.txseq_tid[pattrib->priority]++; + psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF; + pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority]; + SetSeqNum(hdr, pattrib->seqnum); + } + + +exit: + +_func_exit_; + + return res; +} + +s32 xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, u8 action) +{ + s32 llc_sz, mem_sz; + + SIZE_PTR addr; + + u8 *pframe, *mem_start; + + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + u8 *pbuf_start; + s32 bmcst = IS_MCAST(pattrib->ra); + s32 res = _SUCCESS; + +_func_enter_; + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + if(bmcst) { + psta = rtw_get_bcmc_stainfo(padapter); + } else { + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } + } + + if(psta==NULL) + return _FAIL; + + if (pxmitframe->buf_addr == NULL) + return _FAIL; + + pbuf_start = pxmitframe->buf_addr; + mem_start = pbuf_start + TXDESC_OFFSET; + + if (make_tdls_wlanhdr(padapter, mem_start, pattrib, action) == _FAIL) { + res = _FAIL; + goto exit; + } + + pframe = mem_start; + pframe += pattrib->hdrlen; + + //adding icv, if necessary... + if (pattrib->iv_len) + { + if (psta != NULL) + { + switch(pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + break; + case _TKIP_: + if(bmcst) + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + TKIP_IV(pattrib->iv, psta->dot11txpn, 0); + break; + case _AES_: + if(bmcst) + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + AES_IV(pattrib->iv, psta->dot11txpn, 0); + break; + } + } + + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); + pframe += pattrib->iv_len; + + } + + llc_sz = rtw_put_snap(pframe, pattrib->ether_type); + pframe += llc_sz; + + //pattrib->pktlen will be counted in fill_tdls_frbody + pattrib->pktlen = 0; + + fill_tdls_frbody(padapter, pxmitframe, pframe, action); + + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + pframe += pattrib->icv_len; + } + + pattrib->nr_frags = 1; + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz + + ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen; + + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) + { + goto exit; + } + + xmitframe_swencrypt(padapter, pxmitframe); + + update_attrib_vcs_info(padapter, pxmitframe); + +exit: + +_func_exit_; + + return res; +} +#endif + +/* + +This sub-routine will perform all the following: + +1. remove 802.3 header. +2. create wlan_header, based on the info in pxmitframe +3. append sta's iv/ext-iv +4. append LLC +5. move frag chunk from pframe to pxmitframe->mem +6. apply sw-encrypt, if necessary. + +*/ +s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe) +{ + struct pkt_file pktfile; + + s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz; + + SIZE_PTR addr; + + u8 *pframe, *mem_start; + + struct sta_info *psta; + //struct sta_priv *pstapriv = &padapter->stapriv; + //struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + u8 *pbuf_start; + + s32 bmcst = IS_MCAST(pattrib->ra); + s32 res = _SUCCESS; + +_func_enter_; + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra); + } + + if(psta==NULL) + return _FAIL; + + if (pxmitframe->buf_addr == NULL) + return _FAIL; + + pbuf_start = pxmitframe->buf_addr; + +#ifdef CONFIG_USB_TX_AGGREGATION + mem_start = pbuf_start + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); +#else + mem_start = pbuf_start + TXDESC_OFFSET; +#endif + + if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n")); + res = _FAIL; + goto exit; + } + + _rtw_open_pktfile(pkt, &pktfile); + _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen); + + pattrib->pktlen = pktfile.pkt_len; + + frg_inx = 0; + frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342 + + while (1) + { + llc_sz = 0; + + mpdu_len = frg_len; + + pframe = mem_start; + + SetMFrag(mem_start); + + pframe += pattrib->hdrlen; + mpdu_len -= pattrib->hdrlen; + + //adding icv, if necessary... + if (pattrib->iv_len) + { + //if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) + // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + //else + // psta = rtw_get_stainfo(pstapriv, pattrib->ra); + + if (psta != NULL) + { + switch(pattrib->encrypt) + { + case _WEP40_: + case _WEP104_: + WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + break; + case _TKIP_: + if(bmcst) + TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + TKIP_IV(pattrib->iv, psta->dot11txpn, 0); + break; + case _AES_: + if(bmcst) + AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx); + else + AES_IV(pattrib->iv, psta->dot11txpn, 0); + break; + } + } + + _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_, + ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n", + padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3))); + + pframe += pattrib->iv_len; + + mpdu_len -= pattrib->iv_len; + } + + if (frg_inx == 0) { + llc_sz = rtw_put_snap(pframe, pattrib->ether_type); + pframe += llc_sz; + mpdu_len -= llc_sz; + } + + if ((pattrib->icv_len >0) && (pattrib->bswenc)) { + mpdu_len -= pattrib->icv_len; + } + + + if (bmcst) { + // don't do fragment to broadcat/multicast packets + mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen); + } else { + mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len); + } + + pframe += mem_sz; + + if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) { + _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); + pframe += pattrib->icv_len; + } + + frg_inx++; + + if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE)) + { + pattrib->nr_frags = frg_inx; + + pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) + + ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz; + + ClearMFrag(mem_start); + +#ifdef CONFIG_SDIO_HCI + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("coalesce: pattrib->last_txcmdsz=%d pxmitframe->pxmitbuf->phead=0x%p pxmitframe->pxmitbuf->ptail=0x%p pxmitframe->pxmitbuf->len=%d\n", pattrib->last_txcmdsz, pxmitframe->pxmitbuf->phead, pxmitframe->pxmitbuf->ptail, pxmitframe->pxmitbuf->len)); + pxmitframe->pxmitbuf->ptail = pxmitframe->buf_addr + _RND512(pframe-pxmitframe->buf_addr); + pxmitframe->pxmitbuf->len += pxmitframe->pxmitbuf->ptail - pxmitframe->buf_addr;//(pframe-mem_start); + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("coalesce: [2] pattrib->last_txcmdsz=%d pxmitframe->pxmitbuf->ptail=0x%p pxmitframe->pxmitbuf->len=%d\n", pattrib->last_txcmdsz, pxmitframe->pxmitbuf->ptail, pxmitframe->pxmitbuf->len)); +#endif + + break; + + } else { + +#ifdef CONFIG_SDIO_HCI + pxmitframe->pxmitbuf->ptail = pxmitframe->buf_addr + _RND512(pframe-pxmitframe->buf_addr); + pxmitframe->pxmitbuf->len += pxmitframe->pxmitbuf->ptail - pxmitframe->buf_addr; + pframe=pxmitframe->pxmitbuf->ptail; +#endif + } + + addr = (SIZE_PTR)(pframe); + + mem_start = (unsigned char *)RND4(addr) + TXDESC_OFFSET; + _rtw_memcpy(mem_start, pbuf_start + TXDESC_OFFSET, pattrib->hdrlen); + } + + if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) + { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n")); + res = _FAIL; + goto exit; + } + +#ifdef CONFIG_SDIO_HCI + fillin_txdesc(padapter, pxmitframe); +#endif + + xmitframe_swencrypt(padapter, pxmitframe); + + if(bmcst == _FALSE) + update_attrib_vcs_info(padapter, pxmitframe); + else + pattrib->vcs_mode = NONE_VCS; + +exit: + +_func_exit_; + + return res; +} + +/* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header + * IEEE LLC/SNAP header contains 8 octets + * First 3 octets comprise the LLC portion + * SNAP portion, 5 octets, is divided into two fields: + * Organizationally Unique Identifier(OUI), 3 octets, + * type, defined by that organization, 2 octets. + */ +s32 rtw_put_snap(u8 *data, u16 h_proto) +{ + struct ieee80211_snap_hdr *snap; + u8 *oui; + +_func_enter_; + + snap = (struct ieee80211_snap_hdr *)data; + snap->dsap = 0xaa; + snap->ssap = 0xaa; + snap->ctrl = 0x03; + + if (h_proto == 0x8137 || h_proto == 0x80f3) + oui = P802_1H_OUI; + else + oui = RFC1042_OUI; + + snap->oui[0] = oui[0]; + snap->oui[1] = oui[1]; + snap->oui[2] = oui[2]; + + *(u16 *)(data + SNAP_SIZE) = htons(h_proto); + +_func_exit_; + + return SNAP_SIZE + sizeof(u16); +} + +void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len) +{ + + uint protection; + u8 *perp; + sint erp_len; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct registry_priv *pregistrypriv = &padapter->registrypriv; + +_func_enter_; + + switch(pxmitpriv->vcs_setting) + { + case DISABLE_VCS: + pxmitpriv->vcs = NONE_VCS; + break; + + case ENABLE_VCS: + break; + + case AUTO_VCS: + default: + perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len); + if(perp == NULL) + { + pxmitpriv->vcs = NONE_VCS; + } + else + { + protection = (*(perp + 2)) & BIT(1); + if (protection) + { + if(pregistrypriv->vcs_type == RTS_CTS) + pxmitpriv->vcs = RTS_CTS; + else + pxmitpriv->vcs = CTS_TO_SELF; + } + else + pxmitpriv->vcs = NONE_VCS; + } + + break; + + } + +_func_exit_; + +} + +void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz) +{ + struct sta_info *psta = NULL; + struct stainfo_stats *pstats = NULL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) + { + pxmitpriv->tx_bytes += sz; +#ifdef CONFIG_USB_TX_AGGREGATION + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pxmitframe->agg_num; +#else + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod++; +#endif + + psta = pxmitframe->attrib.psta; + + if(psta) + { + pstats = &psta->sta_stats; +#ifdef CONFIG_USB_TX_AGGREGATION + pstats->tx_pkts += pxmitframe->agg_num; +#else + pstats->tx_pkts++; +#endif + pstats->tx_bytes += sz; + } + } + +} + +struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv) +{ + _irqL irqL; + struct xmit_buf *pxmitbuf = NULL; + _list *plist, *phead; + _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; + +_func_enter_; + + _enter_critical(&pfree_queue->lock, &irqL); + + if(_rtw_queue_empty(pfree_queue) == _TRUE) { + pxmitbuf = NULL; + } else { + + phead = get_list_head(pfree_queue); + + plist = get_next(phead); + + pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list); + + rtw_list_delete(&(pxmitbuf->list)); + } + + if (pxmitbuf != NULL) + { + pxmitpriv->free_xmit_extbuf_cnt--; + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt); + #endif + + + pxmitbuf->priv_data = NULL; + +#ifdef CONFIG_SDIO_HCI + pxmitbuf->len = 0; + pxmitbuf->phead = pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->pbuf; + pxmitbuf->pend = pxmitbuf->pbuf + (MAX_XMIT_EXTBUF_SZ-4); +#endif +#ifdef CONFIG_PCI_HCI + pxmitbuf->len = 0; +#endif + } + + _exit_critical(&pfree_queue->lock, &irqL); + +_func_exit_; + + return pxmitbuf; +} + +s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + _irqL irqL; + _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue; + +_func_enter_; + + if(pxmitbuf==NULL) + { + return _FAIL; + } + + _enter_critical(&pfree_queue->lock, &irqL); + + rtw_list_delete(&pxmitbuf->list); + + rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue)); + pxmitpriv->free_xmit_extbuf_cnt++; + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt); + #endif + + _exit_critical(&pfree_queue->lock, &irqL); + +_func_exit_; + + return _SUCCESS; +} + +struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv) +{ + _irqL irqL; + struct xmit_buf *pxmitbuf = NULL; + _list *plist, *phead; + _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; + +_func_enter_; + + //DBG_8192C("+rtw_alloc_xmitbuf\n"); + + _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); + + if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) { + pxmitbuf = NULL; + } else { + + phead = get_list_head(pfree_xmitbuf_queue); + + plist = get_next(phead); + + pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list); + + rtw_list_delete(&(pxmitbuf->list)); + } + + if (pxmitbuf != NULL) + { + pxmitpriv->free_xmitbuf_cnt--; + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt); + #endif + //DBG_8192C("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); + + pxmitbuf->priv_data = NULL; + +#ifdef CONFIG_SDIO_HCI + pxmitbuf->len = 0; + pxmitbuf->phead = pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->pbuf; + pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ; +#endif +#ifdef CONFIG_PCI_HCI + pxmitbuf->len = 0; +#endif + } + #ifdef DBG_XMIT_BUF + else + { + DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n"); + } + #endif + + _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); + +_func_exit_; + + return pxmitbuf; +} + +s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + _irqL irqL; + _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue; + +_func_enter_; + + //DBG_8192C("+rtw_free_xmitbuf\n"); + + if(pxmitbuf==NULL) + { + return _FAIL; + } + + if(pxmitbuf->ext_tag) + { + rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf); + } + else + { + _enter_critical(&pfree_xmitbuf_queue->lock, &irqL); + + rtw_list_delete(&pxmitbuf->list); + + rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue)); + + pxmitpriv->free_xmitbuf_cnt++; + //DBG_8192C("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); + #ifdef DBG_XMIT_BUF + DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt); + #endif + _exit_critical(&pfree_xmitbuf_queue->lock, &irqL); + } + +_func_exit_; + + return _SUCCESS; +} + +/* +Calling context: +1. OS_TXENTRY +2. RXENTRY (rx_thread or RX_ISR/RX_CallBack) + +If we turn on USE_RXTHREAD, then, no need for critical section. +Otherwise, we must use _enter/_exit critical to protect free_xmit_queue... + +Must be very very cautious... + +*/ + +struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue) +{ + /* + Please remember to use all the osdep_service api, + and lock/unlock or _enter/_exit critical to protect + pfree_xmit_queue + */ + + _irqL irqL; + struct xmit_frame *pxframe = NULL; + _list *plist, *phead; + _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; + _adapter *padapter = pxmitpriv->adapter; + +_func_enter_; + + _enter_critical_bh(&pfree_xmit_queue->lock, &irqL); + + if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt)); + pxframe = NULL; + } else { + phead = get_list_head(pfree_xmit_queue); + + plist = get_next(phead); + + pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list); + + rtw_list_delete(&(pxframe->list)); + } + + if (pxframe != NULL) + { + pxmitpriv->free_xmitframe_cnt--; + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); + + pxframe->buf_addr = NULL; + pxframe->pxmitbuf = NULL; + + _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib)); + //pxframe->attrib.psta = NULL; + + pxframe->frame_tag = DATA_FRAMETAG; + +#ifdef CONFIG_USB_HCI + pxframe->pkt = NULL; + pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc + +#ifdef CONFIG_USB_TX_AGGREGATION + pxframe->agg_num = 1; +#endif + +#endif //#ifdef CONFIG_USB_HCI + +#ifdef PLATFORM_LINUX + if(pxmitpriv->free_xmitframe_cnt==1) + { + if (!netif_queue_stopped(padapter->pnetdev)) + netif_stop_queue(padapter->pnetdev); + } +#endif + + } + + _exit_critical_bh(&pfree_xmit_queue->lock, &irqL); + +_func_exit_; + + return pxframe; +} + +s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) +{ + _irqL irqL; + _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue; + _adapter *padapter = pxmitpriv->adapter; + _pkt *pndis_pkt = NULL; + +_func_enter_; + + if (pxmitframe == NULL) { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n")); + goto exit; + } + + _enter_critical_bh(&pfree_xmit_queue->lock, &irqL); + + rtw_list_delete(&pxmitframe->list); + + if (pxmitframe->pkt){ + pndis_pkt = pxmitframe->pkt; + pxmitframe->pkt = NULL; + } + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(pfree_xmit_queue)); + + pxmitpriv->free_xmitframe_cnt++; + RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt)); + + _exit_critical_bh(&pfree_xmit_queue->lock, &irqL); + + + if(pndis_pkt) + rtw_os_pkt_complete(padapter, pndis_pkt); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +s32 rtw_free_xmitframe_ex(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe) +{ + +_func_enter_; + + if(pxmitframe==NULL){ + goto exit; + } + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe_ex()\n")); + + rtw_free_xmitframe(pxmitpriv, pxmitframe); + +exit: + +_func_exit_; + + return _SUCCESS; +} + +void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue) +{ + _irqL irqL; + _list *plist, *phead; + struct xmit_frame *pxmitframe; + +_func_enter_; + + _enter_critical_bh(&(pframequeue->lock), &irqL); + + phead = get_list_head(pframequeue); + plist = get_next(phead); + + while (rtw_end_of_queue_search(phead, plist) == _FALSE) + { + + pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list); + + plist = get_next(plist); + + rtw_free_xmitframe(pxmitpriv,pxmitframe); + + } + _exit_critical_bh(&(pframequeue->lock), &irqL); + +_func_exit_; +} + +s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) + { + RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, + ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n")); +// pxmitframe->pkt = NULL; + return _FAIL; + } + + return _SUCCESS; +} + +static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue) +{ + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + _adapter *padapter = pxmitpriv->adapter; +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; +#endif + + xmitframe_phead = get_list_head(pframe_queue); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + +/*#ifdef RTK_DMP_PLATFORM +#ifdef CONFIG_USB_TX_AGGREGATION + if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2)) + { + pxmitframe = NULL; + + tasklet_schedule(&pxmitpriv->xmit_tasklet); + + break; + } +#endif +#endif*/ + rtw_list_delete(&pxmitframe->list); + + ptxservq->qcnt--; + +#ifndef CONFIG_TDLS +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)==_FALSE) +#endif + { + //rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending); + + //ptxservq->qcnt--; + + break; + } +//else CONFIG_TDLS, process as TDLS Buffer STA +#else + if((pmlmeinfo->tdls_setup_state&TDLS_LINKED_STATE)!=TDLS_LINKED_STATE) + break; + if(xmit_tdls_enqueue_for_sleeping_sta(padapter, pxmitframe)==_FALSE) + break; +#endif + + + pxmitframe = NULL; + + } + + return pxmitframe; +} + +struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry) +{ + _irqL irqL0; + _list *sta_plist, *sta_phead; + struct hw_xmit *phwxmit; + struct tx_servq *ptxservq = NULL; + _queue *pframe_queue = NULL; + struct xmit_frame *pxmitframe = NULL; + _adapter *padapter = pxmitpriv->adapter; + struct registry_priv *pregpriv = &padapter->registrypriv; + int i, inx[4]; +#ifdef CONFIG_USB_HCI +// int j, tmp, acirp_cnt[4]; +#endif + +_func_enter_; + + inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3; + + if(pregpriv->wifi_spec==1) + { + int j, tmp, acirp_cnt[4]; +#if 0 + if(flagsvo, 1->vi, 2->be, 3->bk. + acirp_cnt[0] = pxmitpriv->voq_cnt; + acirp_cnt[1] = pxmitpriv->viq_cnt; + acirp_cnt[2] = pxmitpriv->beq_cnt; + acirp_cnt[3] = pxmitpriv->bkq_cnt; + + for(i=0; i<4; i++) + { + for(j=i+1; j<4; j++) + { + if(acirp_cnt[j]lock, &irqL0); + + for(i = 0; i < entry; i++) + { + phwxmit = phwxmit_i + inx[i]; + + //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + + sta_phead = get_list_head(phwxmit->sta_queue); + sta_plist = get_next(sta_phead); + + while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE) + { + + ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending); + + pframe_queue = &ptxservq->sta_pending; + + pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue); + + if(pxmitframe) + { + phwxmit->accnt--; + + //Remove sta node when there is no pending packets. + if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break + rtw_list_delete(&ptxservq->tx_pending); + + //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + + goto exit; + } + + sta_plist = get_next(sta_plist); + + } + + //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); + + } + +exit: + + _exit_critical_bh(&pxmitpriv->lock, &irqL0); + +_func_exit_; + + return pxmitframe; +} + +#if 1 +struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac) +{ + struct tx_servq *ptxservq; + +_func_enter_; + + switch (up) + { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + *(ac) = 3; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + *(ac) = 1; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + *(ac) = 0; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + *(ac) = 2; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); + break; + + } + +_func_exit_; + + return ptxservq; +} +#else +__inline static struct tx_servq *rtw_get_sta_pending + (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up) +{ + struct tx_servq *ptxservq; + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; + +_func_enter_; + +#ifdef CONFIG_RTL8711 + + if(IS_MCAST(psta->hwaddr)) + { + ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo + *ppstapending = &padapter->xmitpriv.bm_pending; + } + else +#endif + { + switch (up) + { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); + *ppstapending = &padapter->xmitpriv.bk_pending; + (phwxmits+3)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n")); + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); + *ppstapending = &padapter->xmitpriv.vi_pending; + (phwxmits+1)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n")); + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); + *ppstapending = &padapter->xmitpriv.vo_pending; + (phwxmits+0)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n")); + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); + *ppstapending = &padapter->xmitpriv.be_pending; + (phwxmits+2)->accnt++; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n")); + break; + + } + + } + +_func_exit_; + + return ptxservq; +} +#endif + +/* + * Will enqueue pxmitframe to the proper queue, + * and indicate it to xx_pending list..... + */ +s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + //_irqL irqL0; + u8 ac_index; + struct sta_info *psta; + struct tx_servq *ptxservq; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct sta_priv *pstapriv = &padapter->stapriv; + struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits; + sint res = _SUCCESS; + +_func_enter_; + + if (pattrib->psta) { + psta = pattrib->psta; + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->ra); + } + + if (psta == NULL) { + res = _FAIL; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n")); + goto exit; + } + + ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index)); + + //_enter_critical(&pstapending->lock, &irqL0); + + if (rtw_is_list_empty(&ptxservq->tx_pending)) { + rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue)); + } + + //_enter_critical(&ptxservq->sta_pending.lock, &irqL1); + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending)); + ptxservq->qcnt++; + phwxmits[ac_index].accnt++; + + //_exit_critical(&ptxservq->sta_pending.lock, &irqL1); + + //_exit_critical(&pstapending->lock, &irqL0); + +exit: + +_func_exit_; + + return res; +} + +void rtw_alloc_hwxmits(_adapter *padapter) +{ + struct hw_xmit *hwxmits; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + pxmitpriv->hwxmit_entry = HWXMIT_ENTRY; + + pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry); + + hwxmits = pxmitpriv->hwxmits; + + if(pxmitpriv->hwxmit_entry == 5) + { + //pxmitpriv->bmc_txqueue.head = 0; + //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue; + hwxmits[0] .sta_queue = &pxmitpriv->bm_pending; + + //pxmitpriv->vo_txqueue.head = 0; + //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue; + hwxmits[1] .sta_queue = &pxmitpriv->vo_pending; + + //pxmitpriv->vi_txqueue.head = 0; + //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue; + hwxmits[2] .sta_queue = &pxmitpriv->vi_pending; + + //pxmitpriv->bk_txqueue.head = 0; + //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; + hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; + + //pxmitpriv->be_txqueue.head = 0; + //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue; + hwxmits[4] .sta_queue = &pxmitpriv->be_pending; + + } + else if(pxmitpriv->hwxmit_entry == 4) + { + + //pxmitpriv->vo_txqueue.head = 0; + //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue; + hwxmits[0] .sta_queue = &pxmitpriv->vo_pending; + + //pxmitpriv->vi_txqueue.head = 0; + //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue; + hwxmits[1] .sta_queue = &pxmitpriv->vi_pending; + + //pxmitpriv->be_txqueue.head = 0; + //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue; + hwxmits[2] .sta_queue = &pxmitpriv->be_pending; + + //pxmitpriv->bk_txqueue.head = 0; + //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; + hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; + } + else + { + + + } + + +} + +void rtw_free_hwxmits(_adapter *padapter) +{ + struct hw_xmit *hwxmits; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + hwxmits = pxmitpriv->hwxmits; + if(hwxmits) + rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry)); +} + +void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry) +{ + sint i; +_func_enter_; + for(i = 0; i < entry; i++, phwxmit++) + { + //_rtw_spinlock_init(&phwxmit->xmit_lock); + //_rtw_init_listhead(&phwxmit->pending); + //phwxmit->txcmdcnt = 0; + phwxmit->accnt = 0; + } +_func_exit_; +} + +/* + * The main transmit(tx) entry + * + * Return + * 1 enqueue + * 0 success, hardware will handle this xmit frame(packet) + * <0 fail + */ +s32 rtw_xmit(_adapter *padapter, _pkt *pkt) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_frame *pxmitframe = NULL; + + s32 res; + + + pxmitframe = rtw_alloc_xmitframe(pxmitpriv); + if (pxmitframe == NULL) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n")); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe\n", __FUNCTION__); + #endif + return -1; + } + + res = update_attrib(padapter, pkt, &pxmitframe->attrib); + if (res == _FAIL) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n")); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__); + #endif + rtw_free_xmitframe(pxmitpriv, pxmitframe); + return -1; + } + pxmitframe->pkt = pkt; + + rtw_led_control(padapter, LED_CTL_TX); + + if (padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _FALSE) + return 1; + + return 0; +} + +#ifdef CONFIG_TDLS +void process_enqueue_frame(_adapter *padapter, struct xmit_frame *pxmitframe, struct sta_info *psta) +{ + _irqL irqL; + struct sta_info *ptdls_sta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + + //enqueue frame for TDLS sleeping STA + rtw_list_delete(&pxmitframe->list); + _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q)); + ptdls_sta->sleepq_len++; + + //indicate 4-AC queue bit in TDLS peer traffic indication + switch(pattrib->priority) + { + case 1: + case 2: + ptdls_sta->uapsd_bk = ptdls_sta->uapsd_bk | BIT(0); + break; + case 4: + case 5: + ptdls_sta->uapsd_vi = ptdls_sta->uapsd_vi | BIT(0); + break; + case 6: + case 7: + ptdls_sta->uapsd_vo = ptdls_sta->uapsd_vo | BIT(0); + break; + case 0: + case 3: + default: + ptdls_sta->uapsd_be = ptdls_sta->uapsd_be | BIT(0); + break; + } + + ptdls_sta->sleepq_ac_len++; + + _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL); + +} + +sint xmit_tdls_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + sint ret=_FALSE; + + _irqL irqL; + struct sta_info *ptdls_sta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + int i; + + ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst); + if(ptdls_sta==NULL){ + if(pHalData->CurrentChannel != pmlmeext->cur_channel){ + DBG_8192C("pHalData: %02x, pmlmeext: %02x ", pHalData->CurrentChannel, pmlmeext->cur_channel); + for(i=0; i<6; i++){ + DBG_8192C("%02x ", *(pattrib->dst+i)); + } + DBG_8192C("\n"); + ret = 2; //enqueue data that want to transmit via AP + } + + return ret; + }else if(ptdls_sta->state&TDLS_LINKED_STATE){ + if(ptdls_sta->state&TDLS_PEER_SLEEP_STATE) + { + process_enqueue_frame(padapter, pxmitframe, ptdls_sta); + //when sleepq_len ==1? or >=1? transmit PTI + if(ptdls_sta->sleepq_len==1) + { + //transmit TDLS PTI via AP + ptdls_sta->option=2; + _set_workitem(&ptdls_sta->option_workitem); + } + ret = _TRUE; + } + else if(ptdls_sta->state & TDLS_CH_SWITCH_ON_STATE){ + if(!((ptdls_sta->state & TDLS_AT_OFF_CH_STATE) && (ptdls_sta->state & TDLS_PEER_AT_OFF_STATE))){ + process_enqueue_frame(padapter, pxmitframe, ptdls_sta); + ret = _TRUE; + } + } + + } + return ret; + +} +#endif + +#ifdef CONFIG_AP_MODE + +sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + _irqL irqL; + sint ret=_FALSE; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + sint bmcst = IS_MCAST(pattrib->ra); + + if(pattrib->psta) + { + psta = pattrib->psta; + } + else + { + psta=rtw_get_stainfo(pstapriv, pattrib->ra); + } + + if(psta==NULL) + return ret; + + if(pattrib->triggered==1) + { + //DBG_871X("directly xmit pspoll_triggered packet\n"); + + //pattrib->triggered=0; + + if(bmcst) + pattrib->qsel = 0x11;//HIQ + + + return ret; + } + + + if(bmcst) + { + if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode + { + //pattrib->qsel = 0x11;//HIQ + + rtw_list_delete(&pxmitframe->list); + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); + + psta->sleepq_len++; + + pstapriv->tim_bitmap |= BIT(0);// + + //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + + update_beacon(padapter, _TIM_IE_, NULL, _FALSE);//tx bc/mc packets after upate bcn + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + ret = _TRUE; + + } + + return ret; + + } + + + if(psta->state&WIFI_SLEEP_STATE) + { + u8 wmmps_ac=0; + + if(pstapriv->sta_dz_bitmap&BIT(psta->aid)) + { + rtw_list_delete(&pxmitframe->list); + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); + + psta->sleepq_len++; + + switch(pattrib->priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(0); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(0); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(0); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(0); + break; + } + + if(wmmps_ac) + psta->sleepq_ac_len++; + + if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac))) + { + pstapriv->tim_bitmap |= BIT(psta->aid); + + //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); + + if(psta->sleepq_len==1) + { + //DBG_871X("sleepq_len==1, update BCNTIM\n"); + //upate BCN for TIM IE + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + //if(psta->sleepq_len > (NR_XMITFRAME>>3)) + //{ + // wakeup_sta_to_xmit(padapter, psta); + //} + + ret = _TRUE; + + } + + } + + return ret; + +} + +void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + u8 update_mask=0, wmmps_ac=0; + struct sta_info *psta_bmc; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + switch(pxmitframe->attrib.priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(1); + break; + } + + psta->sleepq_len--; + if(psta->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + if(wmmps_ac) + { + psta->sleepq_ac_len--; + if(psta->sleepq_ac_len>0) + { + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + } + else + { + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + } + + pxmitframe->attrib.triggered = 1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if(psta->sleepq_len==0) + { + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_mask = BIT(0); + } + + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + + + //for BC/MC Frames + psta_bmc = rtw_get_bcmc_stainfo(padapter); + if(!psta_bmc) + return; + + if(pstapriv->sta_dz_bitmap==0x0)//no any sta in ps mode + { + _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta_bmc->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + rtw_list_delete(&pxmitframe->list); + + psta_bmc->sleepq_len--; + if(psta_bmc->sleepq_len>0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; + + + pxmitframe->attrib.triggered = 1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if(psta_bmc->sleepq_len==0) + { + pstapriv->tim_bitmap &= ~BIT(0); + + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_mask |= BIT(1); + } + + } + + _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); + + } + + + if(update_mask) + { + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + } + +} + +void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta) +{ + _irqL irqL; + u8 wmmps_ac=0; + _list *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + _enter_critical_bh(&psta->sleep_q.lock, &irqL); + + xmitframe_phead = get_list_head(&psta->sleep_q); + xmitframe_plist = get_next(xmitframe_phead); + + while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + + xmitframe_plist = get_next(xmitframe_plist); + + switch(pxmitframe->attrib.priority) + { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk&BIT(1); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi&BIT(1); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo&BIT(1); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be&BIT(1); + break; + } + + if(!wmmps_ac) + continue; + + rtw_list_delete(&pxmitframe->list); + + psta->sleepq_len--; + psta->sleepq_ac_len--; + + if(psta->sleepq_ac_len>0) + { + pxmitframe->attrib.mdata = 1; + pxmitframe->attrib.eosp = 0; + } + else + { + pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.eosp = 1; + } + + pxmitframe->attrib.triggered = 1; + + if(padapter->HalFunc.hal_xmit(padapter, pxmitframe) == _TRUE) + { + rtw_os_xmit_complete(padapter, pxmitframe); + } + + if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac)) + { + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); + //upate BCN for TIM IE + //update_BCNTIM(padapter); + update_beacon(padapter, _TIM_IE_, NULL, _FALSE); + //update_mask = BIT(0); + } + + } + + _exit_critical_bh(&psta->sleep_q.lock, &irqL); + +} + +#endif + diff --git a/drivers/net/wireless/rtl8192c/hal/hal_init.c b/drivers/net/wireless/rtl8192c/hal/hal_init.c new file mode 100755 index 000000000000..3e54e907f6d0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/hal_init.c @@ -0,0 +1,122 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#define _HAL_INIT_C_ +#include +#include +#include +#include + +#include + +#ifdef CONFIG_SDIO_HCI + #include +#elif defined(CONFIG_USB_HCI) + #include +#endif + +void intf_chip_configure(_adapter *padapter) +{ + if(padapter->HalFunc.intf_chip_configure) + padapter->HalFunc.intf_chip_configure(padapter); +} + +void intf_read_chip_info(_adapter *padapter) +{ + if(padapter->HalFunc.read_adapter_info) + padapter->HalFunc.read_adapter_info(padapter); +} + +void intf_read_chip_version(_adapter *padapter) +{ + if(padapter->HalFunc.read_chip_version) + padapter->HalFunc.read_chip_version(padapter); +} + +void rtw_dm_init(_adapter *padapter) +{ + if(padapter->HalFunc.dm_init) + padapter->HalFunc.dm_init(padapter); +} + +void rtw_sw_led_init(_adapter *padapter) +{ + if(padapter->HalFunc.InitSwLeds) + padapter->HalFunc.InitSwLeds(padapter); +} + +void rtw_sw_led_deinit(_adapter *padapter) +{ + if(padapter->HalFunc.DeInitSwLeds) + padapter->HalFunc.DeInitSwLeds(padapter); +} + +uint rtw_hal_init(_adapter *padapter) +{ + uint status = _SUCCESS; + + padapter->hw_init_completed=_FALSE; + + padapter->bfirst_init = _TRUE; + status = padapter->HalFunc.hal_init(padapter); + + if(status == _SUCCESS){ + padapter->hw_init_completed = _TRUE; + } + else{ + padapter->hw_init_completed = _FALSE; + RT_TRACE(_module_hal_init_c_,_drv_err_,("rtw_hal_init: hal__init fail\n")); + } + padapter->bfirst_init = _FALSE; + + RT_TRACE(_module_hal_init_c_,_drv_err_,("-rtl871x_hal_init:status=0x%x\n",status)); + + return status; + +} + +uint rtw_hal_deinit(_adapter *padapter) +{ + uint status = _SUCCESS; + +_func_enter_; + + status = padapter->HalFunc.hal_deinit(padapter); + + if(status == _SUCCESS){ + padapter->hw_init_completed = _FALSE; + } + else + { + RT_TRACE(_module_hal_init_c_,_drv_err_,("\n rtw_hal_deinit: hal_init fail\n")); + } + +_func_exit_; + + return status; + +} +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +void rtw_sreset_init(_adapter *padapter) +{ + if(padapter->HalFunc.sreset_init_value) + padapter->HalFunc.sreset_init_value(padapter); +} +#endif diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c new file mode 100755 index 000000000000..b0c2b6342490 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_cmd.c @@ -0,0 +1,1134 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192C_CMD_C_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#if 0 +static BOOLEAN +CheckWriteMSG( + IN PADAPTER Adapter, + IN u8 BoxNum +) +{ + u8 valHMETFR; + BOOLEAN Result = _FALSE; + + valHMETFR = rtw_read8(Adapter, REG_HMETFR); + + //DbgPrint("CheckWriteH2C(): Reg[0x%2x] = %x\n",REG_HMETFR, valHMETFR); + + if(((valHMETFR>>BoxNum)&BIT0) == 1) + Result = _TRUE; + + return Result; + +} + +static BOOLEAN CheckFwReadLastMSG( + IN PADAPTER Adapter, + IN u8 BoxNum +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 valHMETFR, valMCUTST_1; + BOOLEAN Result = _FALSE; + + valHMETFR = rtw_read8(Adapter, REG_HMETFR); + valMCUTST_1 = rtw_read8(Adapter, (REG_MCUTST_1+BoxNum)); + + //DbgPrint("REG[%x] = %x, REG[%x] = %x\n", + // REG_HMETFR, valHMETFR, REG_MCUTST_1+BoxNum, valMCUTST_1 ); + + // Do not seperate to 91C and 88C, we use the same setting. Suggested by SD4 Filen. 2009.12.03. + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + if(((valHMETFR>>BoxNum)&BIT0) == 0) + Result = _TRUE; + } + else + { + if((((valHMETFR>>BoxNum)&BIT0) == 0) && (valMCUTST_1 == 0)) + { + Result = _TRUE; + } + } + + return Result; +} +#endif + + +#define RTL92C_MAX_H2C_BOX_NUMS 4 +#define RTL92C_MAX_CMD_LEN 5 +#define MESSAGE_BOX_SIZE 4 +#define EX_MESSAGE_BOX_SIZE 2 + + +static u8 _is_fw_read_cmd_down(_adapter* padapter, u8 isvern, u8 msgbox_num) +{ + u8 read_down = _FALSE; + int retry_cnts = 100; + + u8 valid; + +// DBG_8192C(" _is_fw_read_cmd_down ,isnormal_chip(%x),reg_1cc(%x),msg_box(%d)...\n",isvern,rtw_read8(padapter,REG_HMETFR),msgbox_num); + + do{ + valid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num); + if(isvern){ + if(0 == valid ){ + read_down = _TRUE; + } + } + else{ + if((0 == valid) && (0 == rtw_read8(padapter, REG_MCUTST_1+msgbox_num))){ + read_down = _TRUE; + } + } + }while( (!read_down) && (retry_cnts--)); + + return read_down; + +} + + +/***************************************** +* H2C Msg format : +*| 31 - 8 |7 | 6 - 0 | +*| h2c_msg |Ext_bit |CMD_ID | +* +******************************************/ +void FillH2CCmd(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer) +{ +#if 1 + u8 bcmd_down = _FALSE; + int retry_cnts = 100; + u8 h2c_box_num; + u32 msgbox_addr; + u32 msgbox_ex_addr; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 isnchip =IS_NORMAL_CHIP(pHalData->VersionID); + u32 h2c_cmd = 0; + u16 h2c_cmd_ex = 0; + + _func_enter_; + + if(!pCmdBuffer){ + return ; + } + if(CmdLen > RTL92C_MAX_CMD_LEN){ + return ; + } + //pay attention to if race condition happened in H2C cmd setting. + do{ + h2c_box_num = pHalData->LastHMEBoxNum; + + if(!_is_fw_read_cmd_down(padapter, isnchip, h2c_box_num)){ + DBG_8192C(" fw read cmd failed...\n"); + break; + } + + if(CmdLen<=3) + { + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); + } + else{ + _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer, EX_MESSAGE_BOX_SIZE); + _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer+2,( CmdLen-EX_MESSAGE_BOX_SIZE)); + *(u8*)(&h2c_cmd) |= BIT(7); + } + + *(u8*)(&h2c_cmd) |= ElementID; + + if(h2c_cmd & BIT(7)){ + msgbox_ex_addr = REG_HMEBOX_EXT_0 + (h2c_box_num *EX_MESSAGE_BOX_SIZE); + h2c_cmd_ex = cpu_to_le16( h2c_cmd_ex ); + rtw_write16(padapter, msgbox_ex_addr, h2c_cmd_ex); + } + msgbox_addr =REG_HMEBOX_0 + (h2c_box_num *MESSAGE_BOX_SIZE); + h2c_cmd = cpu_to_le32( h2c_cmd ); + rtw_write32(padapter,msgbox_addr, h2c_cmd); + + if(!isnchip){//for Test chip + if(! (rtw_read8(padapter, REG_HMETFR) & BIT(h2c_box_num))){ + DBG_8192C("Chip test - check fw write failed, write again..\n"); + continue; + } + // Fill H2C protection register. + rtw_write8(padapter,REG_MCUTST_1+h2c_box_num, 0xFF); + } + bcmd_down = _TRUE; + + // DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" + // ,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); + + pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL92C_MAX_H2C_BOX_NUMS ; + + }while((!bcmd_down) && (retry_cnts--)); +/* + if(bcmd_down) + DBG_8192C("H2C Cmd exe down. \n" ); + else + DBG_8192C("H2C Cmd exe failed. \n" ); +*/ + _func_exit_; + +#else + u8 BoxNum; + u16 BOXReg, BOXExtReg; + u8 BoxContent[4], BoxExtContent[2]; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 BufIndex=0; + u8 bWriteSucess = _FALSE; + u8 IsFwRead = _FALSE; + u8 WaitH2cLimmit = 100; + + u32 h2c_cmd = 0; + u16 h2c_cmd_ex = 0; + +_func_enter_; + + //DBG_8192C("FillH2CCmd : ElementID=%d \n",ElementID); + + while(!bWriteSucess) + { + // 2. Find the last BOX number which has been writen. + BoxNum = pHalData->LastHMEBoxNum; + switch(BoxNum) + { + case 0: + BOXReg = REG_HMEBOX_0; + BOXExtReg = REG_HMEBOX_EXT_0; + break; + case 1: + BOXReg = REG_HMEBOX_1; + BOXExtReg = REG_HMEBOX_EXT_1; + break; + case 2: + BOXReg = REG_HMEBOX_2; + BOXExtReg = REG_HMEBOX_EXT_2; + break; + case 3: + BOXReg = REG_HMEBOX_3; + BOXExtReg = REG_HMEBOX_EXT_3; + break; + default: + break; + } + + // 3. Check if the box content is empty. + IsFwRead = CheckFwReadLastMSG(padapter, BoxNum); + while(!IsFwRead) + { + //wait until Fw read + WaitH2cLimmit--; + if(WaitH2cLimmit == 0) + { + DBG_8192C("FillH2CCmd92C(): Wating too long for FW read clear HMEBox(%d)!!!\n", BoxNum); + break; + } + rtw_msleep_os(10); //us + IsFwRead = CheckFwReadLastMSG(padapter, BoxNum); + //U1btmp = PlatformEFIORead1Byte(Adapter, 0x1BF); + //RT_TRACE(COMP_CMD, DBG_LOUD, ("FillH2CCmd92C(): Wating for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n", BoxNum, U1btmp)); + } + + // If Fw has not read the last H2C cmd, break and give up this H2C. + if(!IsFwRead) + { + DBG_8192C("FillH2CCmd92C(): Write H2C register BOX[%d] fail!!!!! Fw do not read. \n", BoxNum); + break; + } + + // 4. Fill the H2C cmd into box + _rtw_memset(BoxContent, 0, sizeof(BoxContent)); + _rtw_memset(BoxExtContent, 0, sizeof(BoxExtContent)); + + BoxContent[0] = ElementID; // Fill element ID + + //DBG_8192C("FillH2CCmd92C():Write ElementID BOXReg(%4x) = %2x \n", BOXReg, ElementID); + + switch(CmdLen) + { + case 1: + { + BoxContent[0] &= ~(BIT7); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 1); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + break; + } + case 2: + { + BoxContent[0] &= ~(BIT7); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 2); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + break; + } + case 3: + { + BoxContent[0] &= ~(BIT7); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex, 3); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + break; + } + case 4: + { + BoxContent[0] |= (BIT7); + _rtw_memcpy((u8*)(BoxExtContent), pCmdBuffer+BufIndex, 2); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex+2, 2); + rtw_write16(padapter, BOXExtReg, *((u16*)BoxExtContent)); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + h2c_cmd_ex = *((u32*)BoxExtContent); + break; + } + case 5: + { + BoxContent[0] |= (BIT7); + _rtw_memcpy((u8*)(BoxExtContent), pCmdBuffer+BufIndex, 2); + _rtw_memcpy((u8*)(BoxContent)+1, pCmdBuffer+BufIndex+2, 3); + rtw_write16(padapter, BOXExtReg, *((u16*)BoxExtContent)); + rtw_write32(padapter, BOXReg, *((u32*)BoxContent)); + h2c_cmd = *((u32*)BoxContent); + h2c_cmd_ex = *((u32*)BoxExtContent); + break; + } + default: + break; + + } + + + DBG_8192C("MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" + ,pHalData->LastHMEBoxNum ,CmdLen,BOXReg,h2c_cmd,BOXExtReg,h2c_cmd_ex); + + //DBG_8192C("FillH2CCmd(): BoxExtContent=0x%x\n", *(u16*)BoxExtContent); + //DBG_8192C("FillH2CCmd(): BoxContent=0x%x\n", *(u32*)BoxContent); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + // 5. Normal chip does not need to check if the H2C cmd has be written successfully. + bWriteSucess = _TRUE; + } + else + { + // 5. Check if the H2C cmd has be written successfully. + bWriteSucess = CheckWriteMSG(padapter, BoxNum); + if(!bWriteSucess) //If not then write again. + continue; + + //6. Fill H2C protection register. + + rtw_write8(padapter, REG_MCUTST_1+BoxNum, 0xFF); + //RT_TRACE(COMP_CMD, DBG_LOUD, ("FillH2CCmd92C():Write Reg(%4x) = 0xFF \n", REG_MCUTST_1+BoxNum)); + } + + // Record the next BoxNum + pHalData->LastHMEBoxNum = BoxNum+1; + if(pHalData->LastHMEBoxNum == 4) // loop to 0 + pHalData->LastHMEBoxNum = 0; + + //DBG_8192C("FillH2CCmd92C():pHalData->LastHMEBoxNum = %d\n", pHalData->LastHMEBoxNum); + + } + +_func_exit_; + +#endif + +} + +u8 rtl8192c_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) +{ + u8 ElementID, CmdLen; + u8 *pCmdBuffer; + struct cmd_msg_parm *pcmdmsg; + + if(!pbuf) + return H2C_PARAMETERS_ERROR; + + pcmdmsg = (struct cmd_msg_parm*)pbuf; + ElementID = pcmdmsg->eid; + CmdLen = pcmdmsg->sz; + pCmdBuffer = pcmdmsg->buf; + + FillH2CCmd(padapter, ElementID, CmdLen, pCmdBuffer); + + return H2C_SUCCESS; +} + +#if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) +u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter *padapter ,u8 bfwpoll, u16 period) +{ + u8 res=_SUCCESS; + struct H2C_SS_RFOFF_PARAM param; + DBG_8192C("==>%s bfwpoll(%x)\n",__FUNCTION__,bfwpoll); + param.gpio_period = period;//Polling GPIO_11 period time + param.ROFOn = (_TRUE == bfwpoll)?1:0; + FillH2CCmd(padapter, SELECTIVE_SUSPEND_ROF_CMD, sizeof(param), (u8*)(¶m)); + return res; +} +#endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED + +u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param) +{ + u8 res=_SUCCESS; + +_func_enter_; + + *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); + + FillH2CCmd(padapter, RSSI_SETTING_EID, 3, param); + +_func_exit_; + + return res; +} + +u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg) +{ + u8 buf[5]; + u8 res=_SUCCESS; + +_func_enter_; + + _rtw_memset(buf, 0, 5); + mask = cpu_to_le32( mask ); + _rtw_memcpy(buf, &mask, 4); + buf[4] = arg; + + FillH2CCmd(padapter, MACID_CONFIG_EID, 5, buf); + +_func_exit_; + + return res; + +} + +//bitmap[0:27] = tx_rate_bitmap +//bitmap[28:31]= Rate Adaptive id +//arg[0:4] = macid +//arg[5] = Short GI +void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if(pHalData->fw_ractrl == _TRUE) + { + rtl8192c_set_raid_cmd(pAdapter, bitmap, arg); + } + else + { + u8 macid, init_rate, shortGIrate=_FALSE; + + init_rate = get_highest_rate_idx(bitmap&0x0fffffff)&0x3f; + + macid = arg&0x1f; + + shortGIrate = (arg&BIT(5)) ? _TRUE:_FALSE; + + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + rtw_write8(pAdapter, (REG_INIDATA_RATE_SEL+macid), (u8)init_rate); + } + +} + +void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode) +{ + SETPWRMODE_PARM H2CSetPwrMode; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + +_func_enter_; + + DBG_871X("%s(): Mode = %d, SmartPS = %d\n", __FUNCTION__,Mode,pwrpriv->smart_ps); + + H2CSetPwrMode.Mode = Mode; + + H2CSetPwrMode.SmartPS = pwrpriv->smart_ps; + + H2CSetPwrMode.BcnPassTime = 1;//pPSC->RegMaxLPSAwakeIntvl; + + FillH2CCmd(padapter, SET_PWRMODE_EID, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode); + +_func_exit_; +} + +void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 rate_len, pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + + _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); + + SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); + //pmlmeext->mgnt_seq++; + SetFrameSubType(pframe, WIFI_BEACON); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pktlen = sizeof (struct ieee80211_hdr_3addr); + + //timestamp will be inserted by hardware + pframe += 8; + pktlen += 8; + + // beacon interval: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + // capability info: 2 bytes + _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); + + pframe += 2; + pktlen += 2; + + if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + //DBG_871X("ie len=%d\n", cur_network->IELength); + pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); + _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); + + goto _ConstructBeacon; + } + + //below for ad-hoc mode + + // SSID + pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); + + // supported rates... + rate_len = rtw_get_rateset_len(cur_network->SupportedRates); + pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); + + // DS parameter set + pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); + + if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) + { + u32 ATIMWindow; + // IBSS Parameter Set... + //ATIMWindow = cur->Configuration.ATIMWindow; + ATIMWindow = 0; + pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); + } + + + //todo: ERP IE + + + // EXTERNDED SUPPORTED RATE + if (rate_len > 8) + { + pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); + } + + + //todo:HT for adhoc + +_ConstructBeacon: + + if ((pktlen + TXDESC_SIZE) > 512) + { + DBG_871X("beacon frame too large\n"); + return; + } + + *pLength = pktlen; + + //DBG_871X("%s bcn_sz=%d\n", __FUNCTION__, pktlen); + +} + +void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + // Frame control. + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + SetPwrMgt(fctrl); + SetFrameSubType(pframe, WIFI_PSPOLL); + + // AID. + SetDuration(pframe, (pmlmeinfo->aid | 0xc000)); + + // BSSID. + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + + // TA. + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + + *pLength = 16; +} + +void ConstructNullFunctionData(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bForcePowerSave) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u32 pktlen; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &pmlmepriv->cur_network; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //DBG_871X("%s:%d\n", __FUNCTION__, bForcePowerSave); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + if (bForcePowerSave) + { + SetPwrMgt(fctrl); + } + + switch(cur_network->network.InfrastructureMode) + { + case Ndis802_11Infrastructure: + SetToDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); + break; + case Ndis802_11APMode: + SetFrDs(fctrl); + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)), ETH_ALEN); + break; + case Ndis802_11IBSS: + default: + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); + break; + } + + SetSeqNum(pwlanhdr, 0); + + SetFrameSubType(pframe, WIFI_DATA_NULL); + + pframe += sizeof(struct ieee80211_hdr_3addr); + pktlen = sizeof(struct ieee80211_hdr_3addr); + + *pLength = pktlen; +} + +void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) +{ + struct ieee80211_hdr *pwlanhdr; + u16 *fctrl; + u8 *mac, *bssid; + u32 pktlen; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); + + + //DBG_871X("%s\n", __FUNCTION__); + + pwlanhdr = (struct ieee80211_hdr *)pframe; + + mac = myid(&(padapter->eeprompriv)); + bssid = cur_network->MacAddress; + + fctrl = &(pwlanhdr->frame_ctl); + *(fctrl) = 0; + _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); + _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); + + SetSeqNum(pwlanhdr, 0); + SetFrameSubType(fctrl, WIFI_PROBERSP); + + pktlen = sizeof(struct ieee80211_hdr_3addr); + pframe += pktlen; + + if(cur_network->IELength>MAX_IE_SZ) + return; + + _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); + pframe += cur_network->IELength; + pktlen += cur_network->IELength; + + *pLength = pktlen; +} + +// +// Description: In normal chip, we should send some packet to Hw which will be used by Fw +// in FW LPS mode. The function is to fill the Tx descriptor of this packets, then +// Fw can tell Hw to send these packet derectly. +// Added by tynli. 2009.10.15. +// +static VOID +FillFakeTxDescriptor92C( + IN PADAPTER Adapter, + IN u8* pDesc, + IN u32 BufferLen, + IN BOOLEAN IsPsPoll +) +{ + struct tx_desc *ptxdesc = (struct tx_desc *)pDesc; + + // Clear all status + _rtw_memset(pDesc, 0, 32); + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32( OWN | FSG | LSG); //own, bFirstSeg, bLastSeg; + + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(BufferLen&0x0000ffff); // Buffer size + command header + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32((QSLT_MGNT<txdw1 |= cpu_to_le32(NAVUSEHDR); + } + else + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + } + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + +#ifdef CONFIG_USB_HCI + // USB interface drop packet if the checksum of descriptor isn't correct. + // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). + rtl8192cu_cal_txdesc_chksum(ptxdesc); +#endif + + //RT_PRINT_DATA(COMP_CMD, DBG_TRACE, "TxFillCmdDesc8192C(): H2C Tx Cmd Content ----->\n", pDesc, TX_DESC_SIZE); +} + +// To check if reserved page content is destroyed by beacon beacuse beacon is too large. +// 2010.06.23. Added by tynli. +VOID +CheckFwRsvdPageContent( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); + u32 MaxBcnPageNum; + + if(pHalData->FwRsvdPageStartOffset != 0) + { + /*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize); + RT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset), + ("CheckFwRsvdPageContent(): The reserved page content has been"\ + "destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\n!", + MaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/ + } +} + +// +// Description: Fill the reserved packets that FW will use to RSVD page. +// Now we just send 4 types packet to rsvd page. +// (1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp. +// Input: +// bDLFinished - FALSE: At the first time we will send all the packets as a large packet to Hw, +// so we need to set the packet length to total lengh. +// TRUE: At the second time, we should send the first packet (default:beacon) +// to Hw again and set the lengh in descriptor to the real beacon lengh. +// 2009.10.15 by tynli. +static void SetFwRsvdPagePkt(PADAPTER Adapter, BOOLEAN bDLFinished) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct xmit_frame *pmgntframe; + struct pkt_attrib *pattrib; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + u32 BeaconLength, ProbeRspLength, PSPollLength, NullFunctionDataLength; + u8 *ReservedPagePacket; + u8 PageNum=0, U1bTmp, TxDescLen=0, TxDescOffset=0; + u16 BufIndex=0; + u32 TotalPacketLen; + RSVDPAGE_LOC RsvdPageLoc; + BOOLEAN bDLOK = _FALSE; + + DBG_871X("%s\n", __FUNCTION__); + + ReservedPagePacket = (u8*)rtw_malloc(1000); + if(ReservedPagePacket == NULL){ + DBG_871X("%s(): alloc ReservedPagePacket fail !!!\n", __FUNCTION__); + return; + } + + _rtw_memset(ReservedPagePacket, 0, 1000); + + TxDescLen = 32;//TX_DESC_SIZE; + +#ifdef CONFIG_USB_HCI + BufIndex = TXDESC_OFFSET; + TxDescOffset = TxDescLen+8; //Shift index for 8 bytes because the dummy bytes in the first descipstor. +#else + BufIndex = 0; + TxDescOffset = 0; +#endif + + //(1) beacon + ConstructBeacon(Adapter,&ReservedPagePacket[BufIndex],&BeaconLength); + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: BCN\n", &ReservedPagePacket[BufIndex], (BeaconLength+BufIndex)); + +//-------------------------------------------------------------------- + + // When we count the first page size, we need to reserve description size for the RSVD + // packet, it will be filled in front of the packet in TXPKTBUF. + U1bTmp = (u8)PageNum_128(BeaconLength+TxDescLen); + PageNum += U1bTmp; + // To reserved 2 pages for beacon buffer. 2010.06.24. + if(PageNum == 1) + PageNum+=1; + pHalData->FwRsvdPageStartOffset = PageNum; + + BufIndex = (PageNum*128) + TxDescOffset; + + //(2) ps-poll + ConstructPSPoll(Adapter, &ReservedPagePacket[BufIndex],&PSPollLength); + + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], PSPollLength, _TRUE); + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PS-POLL\n", &ReservedPagePacket[BufIndex-TxDescLen], (PSPollLength+TxDescLen)); + + RsvdPageLoc.LocPsPoll = PageNum; + +//------------------------------------------------------------------ + + U1bTmp = (u8)PageNum_128(PSPollLength+TxDescLen); + PageNum += U1bTmp; + + BufIndex = (PageNum*128) + TxDescOffset; + + //(3) null data + ConstructNullFunctionData( + Adapter, + &ReservedPagePacket[BufIndex], + &NullFunctionDataLength, + get_my_bssid(&(pmlmeinfo->network)), + _FALSE); + + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], NullFunctionDataLength, _FALSE); + + RsvdPageLoc.LocNullData = PageNum; + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: NULL DATA \n", &ReservedPagePacket[BufIndex-TxDescLen], (NullFunctionDataLength+TxDescLen)); +//------------------------------------------------------------------ + + U1bTmp = (u8)PageNum_128(NullFunctionDataLength+TxDescLen); + PageNum += U1bTmp; + + BufIndex = (PageNum*128) + TxDescOffset; + + //(4) probe response + ConstructProbeRsp( + Adapter, + &ReservedPagePacket[BufIndex], + &ProbeRspLength, + get_my_bssid(&(pmlmeinfo->network)), + _FALSE); + + FillFakeTxDescriptor92C(Adapter, &ReservedPagePacket[BufIndex-TxDescLen], ProbeRspLength, _FALSE); + + RsvdPageLoc.LocProbeRsp = PageNum; + + //DBG_8192C("SetFwRsvdPagePkt(): HW_VAR_SET_TX_CMD: PROBE RSP \n", &ReservedPagePacket[BufIndex-TxDescLen], (ProbeRspLength-TxDescLen)); + +//------------------------------------------------------------------ + + U1bTmp = (u8)PageNum_128(ProbeRspLength+TxDescLen); + + PageNum += U1bTmp; + + TotalPacketLen = (PageNum*128); + + if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) + { + return; + } + + //update attribute + pattrib = &pmgntframe->attrib; + update_mgntframe_attrib(Adapter, pattrib); + pattrib->qsel = 0x10; + pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescLen; + _rtw_memcpy(pmgntframe->buf_addr, ReservedPagePacket, TotalPacketLen); + + Adapter->HalFunc.mgnt_xmit(Adapter, pmgntframe); + + bDLOK = _TRUE; + + if(bDLOK) + { + DBG_871X("Set RSVD page location to Fw.\n"); + FillH2CCmd(Adapter, RSVD_PAGE_EID, sizeof(RsvdPageLoc), (u8 *)&RsvdPageLoc); + } + + rtw_mfree(ReservedPagePacket,1000); + +} + +void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus) +{ + JOINBSSRPT_PARM JoinBssRptParm; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + +_func_enter_; + + DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); + + if(mstatus == 1) + { + // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. + // Suggested by filen. Added by tynli. + rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); + // Do not set TSF again here or vWiFi beacon DMA INT will not work. + //correct_TSF(padapter, pmlmeext); + // Hw sequende enable by dedault. 2010.06.23. by tynli. + //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); + //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + BOOLEAN bRecover = _FALSE; + + //set REG_CR bit 8 + //U1bTmp = rtw_read8(padapter, REG_CR+1); + rtw_write8(padapter, REG_CR+1, 0x03); + + // Disable Hw protection for a time which revserd for Hw sending beacon. + // Fix download reserved page packet fail that access collision with the protection time. + // 2010.05.11. Added by tynli. + //SetBcnCtrlReg(padapter, 0, BIT3); + //SetBcnCtrlReg(padapter, BIT4, 0); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); + + // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. + if(pHalData->RegFwHwTxQCtrl&BIT6) + bRecover = _TRUE; + + // To tell Hw the packet is not a real beacon frame. + //U1bTmp = rtw_read8(padapter, REG_FWHW_TXQ_CTRL+2); + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6))); + pHalData->RegFwHwTxQCtrl &= (~BIT6); + SetFwRsvdPagePkt(padapter, 0); + + // 2010.05.11. Added by tynli. + //SetBcnCtrlReg(padapter, BIT3, 0); + //SetBcnCtrlReg(padapter, 0, BIT4); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); + + // To make sure that if there exists an adapter which would like to send beacon. + // If exists, the origianl value of 0x422[6] will be 1, we should check this to + // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause + // the beacon cannot be sent by HW. + // 2010.06.23. Added by tynli. + if(bRecover) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); + pHalData->RegFwHwTxQCtrl |= BIT6; + } + + // Clear CR[8] or beacon packet will not be send to TxBuf anymore. + rtw_write8(padapter, REG_CR+1, 0x02); + } + } + + JoinBssRptParm.OpMode = mstatus; + + FillH2CCmd(padapter, JOINBSS_RPT_EID, sizeof(JoinBssRptParm), (u8 *)&JoinBssRptParm); + +_func_exit_; +} + +#ifdef CONFIG_P2P +void rtl8192c_set_p2p_ctw_period_cmd(_adapter* padapter, u8 ctwindow) +{ + struct P2P_PS_CTWPeriod_t p2p_ps_ctw; + + p2p_ps_ctw.CTWPeriod = ctwindow; + + FillH2CCmd(padapter, P2P_PS_CTW_CMD_EID, 1, (u8 *)(&p2p_ps_ctw)); + +} + +void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); + struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload; + u8 i; + u16 ctwindow; + u32 start_time, tsf_low; + +_func_enter_; + + switch(p2p_ps_state) + { + case P2P_PS_DISABLE: + DBG_8192C("P2P_PS_DISABLE \n"); + _rtw_memset(p2p_ps_offload, 0 ,1); + break; + case P2P_PS_ENABLE: + DBG_8192C("P2P_PS_ENABLE \n"); + // update CTWindow value. + if( pwdinfo->ctwindow > 0 ) + { + p2p_ps_offload->CTWindow_En = 1; + ctwindow = pwdinfo->ctwindow; + if(IS_HARDWARE_TYPE_8723(padapter)) + { + //rtw_write16(padapter, REG_ATIMWND, ctwindow); + } + else + { + rtl8192c_set_p2p_ctw_period_cmd(padapter, ctwindow); + } + } + + // hw only support 2 set of NoA + for( i=0 ; inoa_num ; i++) + { + // To control the register setting for which NOA + rtw_write8(padapter, 0x5CF, (i << 4)); + if(i == 0) + p2p_ps_offload->NoA0_En = 1; + else + p2p_ps_offload->NoA1_En = 1; + + // config P2P NoA Descriptor Register + rtw_write32(padapter, 0x5E0, pwdinfo->noa_duration[i]); + + rtw_write32(padapter, 0x5E4, pwdinfo->noa_interval[i]); + + //Get Current TSF value + tsf_low = rtw_read32(padapter, REG_TSFTR); + + start_time = pwdinfo->noa_start_time[i]; + if(pwdinfo->noa_count[i] != 1) + { + while( start_time <= (tsf_low+(50*1024) ) ) + { + start_time += pwdinfo->noa_interval[i]; + if(pwdinfo->noa_count[i] != 255) + pwdinfo->noa_count[i]--; + } + } + //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,start_time); + rtw_write32(padapter, 0x5E8, start_time); + + rtw_write8(padapter, 0x5EC, pwdinfo->noa_count[i]); + } + + if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) + { + // rst p2p circuit + rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); + + p2p_ps_offload->Offload_En = 1; + + if(pwdinfo->role == P2P_ROLE_GO) + { + p2p_ps_offload->role= 1; + p2p_ps_offload->AllStaSleep = 0; + } + else + { + p2p_ps_offload->role= 0; + } + + p2p_ps_offload->discovery = 0; + } + break; + case P2P_PS_SCAN: + DBG_8192C("P2P_PS_SCAN \n"); + p2p_ps_offload->discovery = 1; + break; + case P2P_PS_SCAN_DONE: + DBG_8192C("P2P_PS_SCAN_DONE \n"); + p2p_ps_offload->discovery = 0; + pwdinfo->p2p_ps = P2P_PS_ENABLE; + break; + default: + break; + } + + FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload); + +_func_exit_; + +} +#endif //CONFIG_P2P + + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c new file mode 100755 index 000000000000..3fa89cd403c2 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_dm.c @@ -0,0 +1,4684 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ + +//============================================================ +// include files +//============================================================ +#include +#include +#include +#include + +#include + +//============================================================ +// Global var +//============================================================ +static u32 EDCAParam[maxAP][3] = +{ // UL DL + {0x5ea322, 0x00a630, 0x00a44f}, //atheros AP + {0x5ea32b, 0x5ea42b, 0x5e4322}, //broadcom AP + {0x3ea430, 0x00a630, 0x3ea44f}, //cisco AP + {0x5ea44f, 0x00a44f, 0x5ea42b}, //marvell AP + {0x5ea422, 0x00a44f, 0x00a44f}, //ralink AP + //{0x5ea44f, 0x5ea44f, 0x5ea44f}, //realtek AP + {0xa44f, 0x5ea44f, 0x5e431c}, //realtek AP + {0x5ea42b, 0xa630, 0x5e431c}, //airgocap AP + {0x5ea42b, 0x5ea42b, 0x5ea42b}, //unknown AP +// {0x5e4322, 0x00a44f, 0x5ea44f}, //unknown AP +}; + + +/*----------------------------------------------------------------------------- + * Function: dm_DIGInit() + * + * Overview: Set DIG scheme init value. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * + *---------------------------------------------------------------------------*/ +static void dm_DIGInit( + IN PADAPTER pAdapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + + pDigTable->Dig_Enable_Flag = _TRUE; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; + + pDigTable->CurIGValue = 0x20; + pDigTable->PreIGValue = 0x0; + + pDigTable->CurSTAConnectState = pDigTable->PreSTAConnectState = DIG_STA_DISCONNECT; + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT; + + pDigTable->RssiLowThresh = DM_DIG_THRESH_LOW; + pDigTable->RssiHighThresh = DM_DIG_THRESH_HIGH; + + pDigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW; + pDigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH; + + + pDigTable->rx_gain_range_max = DM_DIG_MAX; + pDigTable->rx_gain_range_min = DM_DIG_MIN; + + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + pDigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX; + pDigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN; + + pDigTable->PreCCKPDState = CCK_PD_STAGE_MAX; + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; + + pDigTable->ForbiddenIGI = DM_DIG_MIN; + pDigTable->LargeFAHit = 0; + pDigTable->Recover_cnt = 0; + pdmpriv->DIG_Dynamic_MIN = 0x25; //for FUNAI_TV +} + + +static u8 dm_initial_gain_MinPWDB( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + int Rssi_val_min = 0; + + if((pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) && + (pDigTable->CurSTAConnectState == DIG_STA_CONNECT) ) + { + if(pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) + Rssi_val_min = (pdmpriv->EntryMinUndecoratedSmoothedPWDB > pdmpriv->UndecoratedSmoothedPWDB)? + pdmpriv->UndecoratedSmoothedPWDB:pdmpriv->EntryMinUndecoratedSmoothedPWDB; + else + Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; + } + else if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT || + pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT) + Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; + else if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) + Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + + //printk("%s CurMultiSTAConnectState(0x%02x) UndecoratedSmoothedPWDB(%d),EntryMinUndecoratedSmoothedPWDB(%d)\n" + //,__FUNCTION__,pDigTable->CurSTAConnectState, + //pdmpriv->UndecoratedSmoothedPWDB,pdmpriv->EntryMinUndecoratedSmoothedPWDB); + + return (u8)Rssi_val_min; +} + + +static VOID +dm_FalseAlarmCounterStatistics( + IN PADAPTER Adapter + ) +{ + u32 ret_value; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter1, bMaskDWord); + FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16); + + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter2, bMaskDWord); + FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff); + FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16); + ret_value = PHY_QueryBBReg(Adapter, rOFDM_PHYCounter3, bMaskDWord); + FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff); + ret_value = PHY_QueryBBReg(Adapter, rOFDM0_FrameSync, bMaskDWord); + FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff); + FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16); + + FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal + + FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail+ + FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail; + + + //hold cck counter + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, BIT(14), 1); + + ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterLower, bMaskByte0); + FalseAlmCnt->Cnt_Cck_fail = ret_value; + + ret_value = PHY_QueryBBReg(Adapter, rCCK0_FACounterUpper, bMaskByte3); + FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8; + + FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Parity_Fail + + FalseAlmCnt->Cnt_Rate_Illegal + + FalseAlmCnt->Cnt_Crc8_fail + + FalseAlmCnt->Cnt_Mcs_fail + + FalseAlmCnt->Cnt_Cck_fail); + + //reset false alarm counter registers + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 1); + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0x08000000, 0); + //reset cck counter + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 0); + //enable cck counter + PHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport, 0x0000c000, 2); + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Parity_Fail = %ld, Cnt_Rate_Illegal = %ld, Cnt_Crc8_fail = %ld, Cnt_Mcs_fail = %ld\n", + // FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal, FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail) ); + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n", + // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) ); + //RT_TRACE( COMP_DIG, DBG_LOUD, ("Cnt_Ofdm_fail = %ld, Cnt_Cck_fail = %ld, Cnt_all = %ld\n", + // FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_all) ); +} + + +static VOID +DM_Write_DIG( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurIGValue = 0x%lx, PreIGValue = 0x%lx, BackoffVal = %d\n", + // DM_DigTable.CurIGValue, DM_DigTable.PreIGValue, DM_DigTable.BackoffVal)); + + if (pDigTable->Dig_Enable_Flag == _FALSE) + { + //RT_TRACE( COMP_DIG, DBG_LOUD, ("DIG is disabled\n")); + pDigTable->PreIGValue = 0x17; + return; + } + + if(pDigTable->PreIGValue != pDigTable->CurIGValue) + { + // Set initial gain. + //PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pDigTable->CurIGValue); + //PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pDigTable->CurIGValue); + //printk("%s DIG(0x%02x)\n",__FUNCTION__,pDigTable->CurIGValue); + PHY_SetBBReg(pAdapter, rOFDM0_XAAGCCore1, 0x7f, pDigTable->CurIGValue); + PHY_SetBBReg(pAdapter, rOFDM0_XBAGCCore1, 0x7f, pDigTable->CurIGValue); + pDigTable->PreIGValue = pDigTable->CurIGValue; + } +} + + +static VOID +dm_CtrlInitGainByFA( + IN PADAPTER pAdapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + u8 value_IGI = pDigTable->CurIGValue; + + if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH0) + value_IGI --; + else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) + value_IGI += 0; + else if(FalseAlmCnt->Cnt_all < DM_DIG_FA_TH2) + value_IGI ++; + else if(FalseAlmCnt->Cnt_all >= DM_DIG_FA_TH2) + value_IGI +=2; + + if(value_IGI > DM_DIG_FA_UPPER) + value_IGI = DM_DIG_FA_UPPER; + if(value_IGI < DM_DIG_FA_LOWER) + value_IGI = DM_DIG_FA_LOWER; + + if(FalseAlmCnt->Cnt_all > 10000) + value_IGI = 0x32; + + pDigTable->CurIGValue = value_IGI; + + DM_Write_DIG(pAdapter); + +} + +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV +VOID dm_CtrlInitGainByRssi( IN PADAPTER pAdapter) +{ + + u32 isBT; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + //modify DIG upper bound + if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX ) + pDigTable->rx_gain_range_max = DM_DIG_MAX; + else + pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20; + + //modify DIG lower bound + if((FalseAlmCnt->Cnt_all > 500)&&(pdmpriv->DIG_Dynamic_MIN < 0x25)) + pdmpriv->DIG_Dynamic_MIN++; + if((FalseAlmCnt->Cnt_all < 500)&&(pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN)) + pdmpriv->DIG_Dynamic_MIN--; + if((pDigTable->Rssi_val_min < 8) && (pdmpriv->DIG_Dynamic_MIN > DM_DIG_MIN)) + pdmpriv->DIG_Dynamic_MIN--; + + //modify DIG lower bound, deal with abnorally large false alarm + if(FalseAlmCnt->Cnt_all > 10000) + { + //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); + pDigTable->LargeFAHit++; + if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue) + { + pDigTable->ForbiddenIGI = pDigTable->CurIGValue; + pDigTable->LargeFAHit = 1; + } + if(pDigTable->LargeFAHit >= 3) + { + if((pDigTable->ForbiddenIGI+1) >pDigTable->rx_gain_range_max) + pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max; + else + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + pDigTable->Recover_cnt = 3600; //3600=2hr + } + } + else + { + //Recovery mechanism for IGI lower bound + if(pDigTable->Recover_cnt != 0){ + pDigTable->Recover_cnt --; + } + else + { + if(pDigTable->LargeFAHit == 0 ) + { + if((pDigTable->ForbiddenIGI -1) < pdmpriv->DIG_Dynamic_MIN) //DM_DIG_MIN) + { + pDigTable->ForbiddenIGI = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN; + pDigTable->rx_gain_range_min = pdmpriv->DIG_Dynamic_MIN; //DM_DIG_MIN; + } + else + { + pDigTable->ForbiddenIGI --; + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + } + } + else if(pDigTable->LargeFAHit == 3 ) + { + pDigTable->LargeFAHit = 0; + } + } + } + #ifdef CONFIG_USB_HCI + if(FalseAlmCnt->Cnt_all < 250) + { +#endif + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n"); + + isBT = rtw_read8(pAdapter, 0x4fd) & 0x01; + + if(!isBT){ + + if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh) + { + if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_min; + else + pDigTable->BackoffVal -= 2; + } + else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh) + { + if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_max; + else + pDigTable->BackoffVal +=2; + } + } + else + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + + pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal; + + //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal); +#ifdef CONFIG_USB_HCI + } + else + { + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n"); + //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min); + + //Adjust initial gain by false alarm + if(FalseAlmCnt->Cnt_all > 1000) + pDigTable->CurIGValue = pDigTable ->PreIGValue+2; + else if (FalseAlmCnt->Cnt_all > 750) + pDigTable->CurIGValue = pDigTable->PreIGValue+1; + else if(FalseAlmCnt->Cnt_all < 500) + pDigTable->CurIGValue = pDigTable->PreIGValue-1; + } +#endif + + //Check initial gain by upper/lower bound + if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max) + pDigTable->CurIGValue = pDigTable->rx_gain_range_max; + + if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min) + pDigTable->CurIGValue = pDigTable->rx_gain_range_min; + + //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__, + // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min); + //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue ); + + DM_Write_DIG(pAdapter); + +} +#else +static VOID dm_CtrlInitGainByRssi(IN PADAPTER pAdapter) +{ + u32 isBT; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + + //modify DIG upper bound + if((pDigTable->Rssi_val_min + 20) > DM_DIG_MAX ) + pDigTable->rx_gain_range_max = DM_DIG_MAX; + else + pDigTable->rx_gain_range_max = pDigTable->Rssi_val_min + 20; + //printk("%s Rssi_val_min(0x%02x),rx_gain_range_max(0x%02x)\n",__FUNCTION__,pDigTable->Rssi_val_min,pDigTable->rx_gain_range_max); + + //modify DIG lower bound, deal with abnorally large false alarm + if(FalseAlmCnt->Cnt_all > 10000) + { + //RT_TRACE(COMP_DIG, DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); + + pDigTable->LargeFAHit++; + if(pDigTable->ForbiddenIGI < pDigTable->CurIGValue) + { + pDigTable->ForbiddenIGI = pDigTable->CurIGValue; + pDigTable->LargeFAHit = 1; + } + + if(pDigTable->LargeFAHit >= 3) + { + if((pDigTable->ForbiddenIGI+1) > pDigTable->rx_gain_range_max) + pDigTable->rx_gain_range_min = pDigTable->rx_gain_range_max; + else + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + pDigTable->Recover_cnt = 3600; //3600=2hr + } + } + else + { + //Recovery mechanism for IGI lower bound + if(pDigTable->Recover_cnt != 0) + pDigTable->Recover_cnt --; + else + { + if(pDigTable->LargeFAHit == 0 ) + { + if((pDigTable->ForbiddenIGI -1) < DM_DIG_MIN) + { + pDigTable->ForbiddenIGI = DM_DIG_MIN; + pDigTable->rx_gain_range_min = DM_DIG_MIN; + } + else + { + pDigTable->ForbiddenIGI --; + pDigTable->rx_gain_range_min = (pDigTable->ForbiddenIGI + 1); + } + } + else if(pDigTable->LargeFAHit == 3 ) + { + pDigTable->LargeFAHit = 0; + } + } + } + + //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.ForbiddenIGI = 0x%x, DM_DigTable.LargeFAHit = 0x%x\n",pDigTable->ForbiddenIGI, pDigTable->LargeFAHit)); + //RT_TRACE(COMP_DIG, DBG_LOUD, ("DM_DigTable.rx_gain_range_max = 0x%x, DM_DigTable.rx_gain_range_min = 0x%x\n",pDigTable->rx_gain_range_max, pDigTable->rx_gain_range_min)); + +#ifdef CONFIG_USB_HCI + if(FalseAlmCnt->Cnt_all < 250) + { +#endif + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by SS mode\n"); + + isBT = rtw_read8(pAdapter, 0x4fd) & 0x01; + + if(!isBT){ + + if(FalseAlmCnt->Cnt_all > pDigTable->FAHighThresh) + { + if((pDigTable->BackoffVal -2) < pDigTable->BackoffVal_range_min) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_min; + else + pDigTable->BackoffVal -= 2; + } + else if(FalseAlmCnt->Cnt_all < pDigTable->FALowThresh) + { + if((pDigTable->BackoffVal+2) > pDigTable->BackoffVal_range_max) + pDigTable->BackoffVal = pDigTable->BackoffVal_range_max; + else + pDigTable->BackoffVal +=2; + } + } + else + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + + pDigTable->CurIGValue = pDigTable->Rssi_val_min+10-pDigTable->BackoffVal; + + //DBG_8192C("Rssi_val_min = %x BackoffVal %x\n",pDigTable->Rssi_val_min, pDigTable->BackoffVal); +#ifdef CONFIG_USB_HCI + } + else + { + //DBG_8192C("===> dm_CtrlInitGainByRssi, Enter DIG by FA mode\n"); + //DBG_8192C("RSSI = 0x%x", pDigTable->Rssi_val_min); + + //Adjust initial gain by false alarm + if(FalseAlmCnt->Cnt_all > 1000) + pDigTable->CurIGValue = pDigTable ->PreIGValue+2; + else if (FalseAlmCnt->Cnt_all > 750) + pDigTable->CurIGValue = pDigTable->PreIGValue+1; + else if(FalseAlmCnt->Cnt_all < 500) + pDigTable->CurIGValue = pDigTable->PreIGValue-1; + } +#endif + + //Check initial gain by upper/lower bound + if(pDigTable->CurIGValue >pDigTable->rx_gain_range_max) + pDigTable->CurIGValue = pDigTable->rx_gain_range_max; + + if(pDigTable->CurIGValue < pDigTable->rx_gain_range_min) + pDigTable->CurIGValue = pDigTable->rx_gain_range_min; + + //printk("%s => rx_gain_range_max(0x%02x) rx_gain_range_min(0x%02x)\n",__FUNCTION__, + // pDigTable->rx_gain_range_max,pDigTable->rx_gain_range_min); + //printk("%s CurIGValue(0x%02x) <====\n",__FUNCTION__,pDigTable->CurIGValue ); + + DM_Write_DIG(pAdapter); + +} +#endif + +static VOID +dm_initial_gain_Multi_STA( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + int rssi_strength = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + BOOLEAN bMulti_STA = _FALSE; + + //ADHOC and AP Mode + if(check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + bMulti_STA = _TRUE; + } + + + if((bMulti_STA == _FALSE) + || (pDigTable->CurSTAConnectState != DIG_STA_DISCONNECT)) + { + pdmpriv->binitialized = _FALSE; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; + return; + } + else if(pdmpriv->binitialized == _FALSE) + { + pdmpriv->binitialized = _TRUE; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0; + pDigTable->CurIGValue = 0x20; + DM_Write_DIG(pAdapter); + } + + // Initial gain control by ap mode + if(pDigTable->CurMultiSTAConnectState == DIG_MultiSTA_CONNECT) + { + if ( (rssi_strength < pDigTable->RssiLowThresh) && + (pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_1)) + { + // Set to dig value to 0x20 for Luke's opinion after disable dig + if(pDigTable->Dig_Ext_Port_Stage == DIG_EXT_PORT_STAGE_2) + { + pDigTable->CurIGValue = 0x20; + DM_Write_DIG(pAdapter); + } + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_1; + } + else if (rssi_strength > pDigTable->RssiHighThresh) + { + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_2; + dm_CtrlInitGainByFA(pAdapter); + } + } + else if(pDigTable->Dig_Ext_Port_Stage != DIG_EXT_PORT_STAGE_0) + { + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_0; + pDigTable->CurIGValue = 0x20; + DM_Write_DIG(pAdapter); + } + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CurMultiSTAConnectState = %x Dig_Ext_Port_Stage %x\n", + // DM_DigTable.CurMultiSTAConnectState, DM_DigTable.Dig_Ext_Port_Stage)); +} + + +static VOID +dm_initial_gain_STA( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("PreSTAConnectState = %x, CurSTAConnectState = %x\n", + // DM_DigTable.PreSTAConnectState, DM_DigTable.CurSTAConnectState)); + + + if(pDigTable->PreSTAConnectState == pDigTable->CurSTAConnectState|| + pDigTable->CurSTAConnectState == DIG_STA_BEFORE_CONNECT || + pDigTable->CurSTAConnectState == DIG_STA_CONNECT) + { + // beforeconnect -> beforeconnect or connect -> connect + // (dis)connect -> beforeconnect + // disconnect -> connecct or beforeconnect -> connect + if(pDigTable->CurSTAConnectState != DIG_STA_DISCONNECT) + { + pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter); + dm_CtrlInitGainByRssi(pAdapter); + } + } + else + { + // connect -> disconnect or beforeconnect -> disconnect + pDigTable->Rssi_val_min = 0; + pDigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX; + pDigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; + pDigTable->CurIGValue = 0x20; + pDigTable->PreIGValue = 0; + DM_Write_DIG(pAdapter); + } + +} + + +static void dm_CCK_PacketDetectionThresh( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pdmpriv->FalseAlmCnt); + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + if(pDigTable->CurSTAConnectState == DIG_STA_CONNECT) + { + pDigTable->Rssi_val_min = dm_initial_gain_MinPWDB(pAdapter); + if(pDigTable->PreCCKPDState == CCK_PD_STAGE_LowRssi) + { + if(pDigTable->Rssi_val_min <= 25) + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; + else + pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi; + } + else{ + if(pDigTable->Rssi_val_min <= 20) + pDigTable->CurCCKPDState = CCK_PD_STAGE_LowRssi; + else + pDigTable->CurCCKPDState = CCK_PD_STAGE_HighRssi; + } + } + else + pDigTable->CurCCKPDState=CCK_PD_STAGE_MAX; + + if(pDigTable->PreCCKPDState != pDigTable->CurCCKPDState) + { + if((pDigTable->CurCCKPDState == CCK_PD_STAGE_LowRssi)|| + (pDigTable->CurCCKPDState == CCK_PD_STAGE_MAX)) + { + PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0x83); + + //PHY_SetBBReg(pAdapter, rCCK0_System, bMaskByte1, 0x40); + //if(IS_92C_SERIAL(pHalData->VersionID)) + //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd7); + } + else + { + PHY_SetBBReg(pAdapter, rCCK0_CCA, bMaskByte2, 0xcd); + //PHY_SetBBReg(pAdapter,rCCK0_System, bMaskByte1, 0x47); + //if(IS_92C_SERIAL(pHalData->VersionID)) + //PHY_SetBBReg(pAdapter, rCCK0_FalseAlarmReport , bMaskByte2, 0xd3); + } + + pDigTable->PreCCKPDState = pDigTable->CurCCKPDState; + } + + //RT_TRACE( COMP_DIG, DBG_LOUD, ("CCKPDStage=%x\n",pDigTable->CurCCKPDState)); + //RT_TRACE( COMP_DIG, DBG_LOUD, ("is92C=%x\n",IS_92C_SERIAL(pHalData->VersionID))); + +} + + +static void +dm_CtrlInitGainByTwoPort( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv); + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + return; + + // Decide the current status and if modify initial gain or not + if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) + { + pDigTable->CurSTAConnectState = DIG_STA_BEFORE_CONNECT; + } + else if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + pDigTable->CurSTAConnectState = DIG_STA_CONNECT; + } + else + { + pDigTable->CurSTAConnectState = DIG_STA_DISCONNECT; + } + + + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT; + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + if((is_IBSS_empty(pAdapter)==_FAIL) && (pAdapter->stapriv.asoc_sta_count > 2)) + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT; + } + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + if(pAdapter->stapriv.asoc_sta_count > 2) + pDigTable->CurMultiSTAConnectState = DIG_MultiSTA_CONNECT; + } + + + dm_initial_gain_STA(pAdapter); + dm_initial_gain_Multi_STA(pAdapter); + dm_CCK_PacketDetectionThresh(pAdapter); + + pDigTable->PreSTAConnectState = pDigTable->CurSTAConnectState; + +} + + +static void dm_DIG( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() ==>\n")); + + if(pdmpriv->bDMInitialGainEnable == _FALSE) + return; + + //if(pDigTable->Dig_Enable_Flag == _FALSE) + // return; + + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG)) + return; + + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() progress \n")); + + dm_CtrlInitGainByTwoPort(pAdapter); + + //RTPRINT(FDM, DM_Monitor, ("dm_DIG() <==\n")); +} + +static void dm_SavePowerIndex(IN PADAPTER Adapter) +{ + u8 index; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; + + for(index = 0; index< 6; index++) + pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]); +} + +static void dm_RestorePowerIndex(IN PADAPTER Adapter) +{ + u8 index; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; + + for(index = 0; index< 6; index++) + rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]); +} + +static void dm_WritePowerIndex( + IN PADAPTER Adapter, + IN u8 Value) +{ + u8 index; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a}; + + for(index = 0; index< 6; index++) + rtw_write8(Adapter, Power_Index_REG[index], Value); +} + +static void dm_InitDynamicTxPower(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + dm_SavePowerIndex(Adapter); + pdmpriv->bDynamicTxPowerEnable = _TRUE; + } + else +#else + pdmpriv->bDynamicTxPowerEnable = _FALSE; +#endif + + pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal; + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; +} + + +static void dm_DynamicTxPower(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + int UndecoratedSmoothedPWDB; + + if(!pdmpriv->bDynamicTxPowerEnable) + return; + + // If dynamic high power is disabled. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_HP) ) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; + return; + } + + // STA not connected and AP not connected + if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) && + (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)) + { + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("Not connected to any \n")); + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; + + //the LastDTPlvl should reset when disconnect, + //otherwise the tx power level wouldn't change when disconnect and connect again. + // Maddest 20091220. + pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal; + return; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port + { + //todo: AP Mode + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) + { + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); + } + else + { + UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); + } + } + else // associated entry pwdb + { + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB)); + } + + if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n")); + } + else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) && + (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) ) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n")); + } + else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5)) + { + pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal; + //RT_TRACE(COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n")); + } + + if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) ) + { + PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel); + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal + dm_RestorePowerIndex(Adapter); + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + dm_WritePowerIndex(Adapter, 0x14); + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + dm_WritePowerIndex(Adapter, 0x10); + } + pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl; + +} + + +static VOID +DM_ChangeDynamicInitGainThresh( + IN PADAPTER pAdapter, + IN u32 DM_Type, + IN u32 DM_Value) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + + if (DM_Type == DIG_TYPE_THRESH_HIGH) + { + pDigTable->RssiHighThresh = DM_Value; + } + else if (DM_Type == DIG_TYPE_THRESH_LOW) + { + pDigTable->RssiLowThresh = DM_Value; + } + else if (DM_Type == DIG_TYPE_ENABLE) + { + pDigTable->Dig_Enable_Flag = _TRUE; + } + else if (DM_Type == DIG_TYPE_DISABLE) + { + pDigTable->Dig_Enable_Flag = _FALSE; + } + else if (DM_Type == DIG_TYPE_BACKOFF) + { + if(DM_Value > 30) + DM_Value = 30; + pDigTable->BackoffVal = (u8)DM_Value; + } + else if(DM_Type == DIG_TYPE_RX_GAIN_MIN) + { + if(DM_Value == 0) + DM_Value = 0x1; + pDigTable->rx_gain_range_min = (u8)DM_Value; + } + else if(DM_Type == DIG_TYPE_RX_GAIN_MAX) + { + if(DM_Value > 0x50) + DM_Value = 0x50; + pDigTable->rx_gain_range_max = (u8)DM_Value; + } +} /* DM_ChangeDynamicInitGainThresh */ + + +static VOID PWDB_Monitor( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + int i; + int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff; + u8 sta_cnt=0; + u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi + + if(check_fwstate(&Adapter->mlmepriv, _FW_LINKED) != _TRUE) + return; + + + if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + _irqL irqL; + _list *plist, *phead; + struct sta_info *psta; + struct sta_priv *pstapriv = &Adapter->stapriv; + u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff}; + + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + for(i=0; i< NUM_STA; i++) + { + phead = &(pstapriv->sta_hash[i]); + plist = get_next(phead); + + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) + { + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + + plist = get_next(plist); + + if(_rtw_memcmp(psta ->hwaddr, bcast_addr, ETH_ALEN) || + _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN)) + continue; + + if(psta->state & WIFI_ASOC_STATE) + { + + if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) + tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; + + if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) + tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; + + PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); + } + + } + + } + + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + + + + if(pHalData->fw_ractrl == _TRUE) + { + // Report every sta's RSSI to FW + for(i=0; i< sta_cnt; i++) + { + rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]); + } + } + + } + + + + if(tmpEntryMaxPWDB != 0) // If associated entry is found + { + pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; + } + else + { + pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; + } + + if(tmpEntryMinPWDB != 0xff) // If associated entry is found + { + pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; + } + else + { + pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; + } + + + if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) + { + + if(pHalData->fw_ractrl == _TRUE) + { + u32 param = (u32)(pdmpriv->UndecoratedSmoothedPWDB<<16); + + param |= 0;//macid=0 for sta mode; + + rtl8192c_set_rssi_cmd(Adapter, (u8*)¶m); + } + } + +} + + +static void +DM_InitEdcaTurbo( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + pHalData->bCurrentTurboEDCA = _FALSE; + Adapter->recvpriv.bIsAnyNonBEPkts = _FALSE; + +} + + +static void +dm_CheckEdcaTurbo( + IN PADAPTER Adapter + ) +{ + u32 trafficIndex; + u32 edca_param; + u64 cur_tx_bytes = 0; + u64 cur_rx_bytes = 0; + u8 bbtchange = _FALSE; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); + struct recv_priv *precvpriv = &(Adapter->recvpriv); + struct registry_priv *pregpriv = &Adapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + + + if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)) + { + goto dm_CheckEdcaTurbo_EXIT; + } + + if (pmlmeinfo->assoc_AP_vendor >= maxAP) + { + goto dm_CheckEdcaTurbo_EXIT; + } + +#ifdef CONFIG_BT_COEXIST + if(pbtpriv->BT_Coexist) + { + if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0)) + { + bbtchange = _TRUE; + } + } +#endif + + // Check if the status needs to be changed. + if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) ) + { + cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes; + cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes; + + //traffic, TX or RX + if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP)) + { + if (cur_tx_bytes > (cur_rx_bytes << 2)) + { // Uplink TP is present. + trafficIndex = UP_LINK; + } + else + { // Balance TP is present. + trafficIndex = DOWN_LINK; + } + } + else + { + if (cur_rx_bytes > (cur_tx_bytes << 2)) + { // Downlink TP is present. + trafficIndex = DOWN_LINK; + } + else + { // Balance TP is present. + trafficIndex = UP_LINK; + } + } + + if ((pdmpriv->prv_traffic_idx != trafficIndex) || (!pHalData->bCurrentTurboEDCA)) + { +#ifdef CONFIG_BT_COEXIST + if(_TRUE == bbtchange) + { + edca_param = pbtpriv->BT_EDCA[trafficIndex]; + } + else +#endif + { +#if 0 + //adjust EDCA parameter for BE queue + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; +#else + + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) + { + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; + } + else + { + edca_param = EDCAParam[unknownAP][trafficIndex]; + } +#endif + } + +#ifdef CONFIG_PCI_HCI + if(IS_92C_SERIAL(pHalData->VersionID)) + { + edca_param = 0x60a42b; + } + else + { + edca_param = 0x6ea42b; + } +#endif + rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param); + + pdmpriv->prv_traffic_idx = trafficIndex; + } + + pHalData->bCurrentTurboEDCA = _TRUE; + } + else + { + // + // Turn Off EDCA turbo here. + // Restore original EDCA according to the declaration of AP. + // + if(pHalData->bCurrentTurboEDCA) + { + rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE); + pHalData->bCurrentTurboEDCA = _FALSE; + } + } + +dm_CheckEdcaTurbo_EXIT: + // Set variables for next time. + precvpriv->bIsAnyNonBEPkts = _FALSE; + pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes; + precvpriv->last_rx_bytes = precvpriv->rx_bytes; + +} + +#define DPK_DELTA_MAPPING_NUM 13 +#define index_mapping_HP_NUM 15 +//091212 chiyokolin +static VOID +dm_TXPowerTrackingCallback_ThermalMeter_92C( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100, ThermalValue_HP_count = 0; + u32 ThermalValue_HP = 0; + s8 delta_DPK; + int ele_A, ele_D, TempCCk, X, value32; + int Y, ele_C; + s8 OFDM_index[2], CCK_index = 0, OFDM_index_old[2], CCK_index_old = 0, delta_APK; + int i = 0, CCKSwingNeedUpdate = 0; + BOOLEAN is2T = IS_92C_SERIAL(pHalData->VersionID); +#if 0 +//#ifdef CONFIG_MP_INCLUDED + PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); + pu1Byte TxPwrLevel = pMptCtx->TxPwrLevel; +#endif + + u8 OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur + u32 DPK_delta_mapping[2][DPK_DELTA_MAPPING_NUM] = { + {0x1c, 0x1c, 0x1d, 0x1d, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x01, + 0x02, 0x02, 0x03}, + {0x1c, 0x1d, 0x1e, 0x1e, 0x1e, + 0x1f, 0x00, 0x00, 0x01, 0x02, + 0x02, 0x03, 0x03}}; + + s8 index_mapping_HP[index_mapping_HP_NUM] = { + 0, 1, 3, 4, 6, + 7, 9, 10, 12, 13, + 15, 16, 18, 19, 21 + }; + + s8 index_HP; + + pdmpriv->TXPowerTrackingCallbackCnt++; //cosa add for debug + pdmpriv->bTXPowerTrackingInit = _TRUE; + + if(pHalData->CurrentChannel == 14 && !pdmpriv->bCCKinCH14) + pdmpriv->bCCKinCH14 = _TRUE; + else if(pHalData->CurrentChannel != 14 && pdmpriv->bCCKinCH14) + pdmpriv->bCCKinCH14 = _FALSE; + + //DBG_8192C("===>dm_TXPowerTrackingCallback_ThermalMeter_92C\n"); + + ThermalValue = (u8)PHY_QueryRFReg(Adapter, RF90_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0] + + //DBG_8192C("\n\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n",ThermalValue,pdmpriv->ThermalValue, pHalData->EEPROMThermalMeter); + + rtl8192c_PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter)); + rtl8192c_PHY_DigitalPredistortion(Adapter); + + if(is2T) + rf = 2; + else + rf = 1; + + if(ThermalValue) + { +// if(!pHalData->ThermalValue) + { + //Query OFDM path A default setting + ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D; + for(i=0; ibCCKinCH14) + { + if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==_TRUE) + { + CCK_index_old =(u8)i; + //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14); + break; + } + } + else + { + if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==_TRUE) + { + CCK_index_old =(u8)i; + //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14); + break; + } + } + } + + if(!pdmpriv->ThermalValue) + { + pdmpriv->ThermalValue = pHalData->EEPROMThermalMeter; + pdmpriv->ThermalValue_LCK = ThermalValue; + pdmpriv->ThermalValue_IQK = ThermalValue; + pdmpriv->ThermalValue_DPK = pHalData->EEPROMThermalMeter; + +#ifdef CONFIG_USB_HCI + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index_HP[i] = pdmpriv->OFDM_index[i] = OFDM_index_old[i]; + pdmpriv->CCK_index_HP = pdmpriv->CCK_index = CCK_index_old; +#else + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index[i] = OFDM_index_old[i]; + pdmpriv->CCK_index = CCK_index_old; +#endif + } + +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + pdmpriv->ThermalValue_HP[pdmpriv->ThermalValue_HP_index] = ThermalValue; + pdmpriv->ThermalValue_HP_index++; + if(pdmpriv->ThermalValue_HP_index == HP_THERMAL_NUM) + pdmpriv->ThermalValue_HP_index = 0; + + for(i = 0; i < HP_THERMAL_NUM; i++) + { + if(pdmpriv->ThermalValue_HP[i]) + { + ThermalValue_HP += pdmpriv->ThermalValue_HP[i]; + ThermalValue_HP_count++; + } + } + + if(ThermalValue_HP_count) + ThermalValue = (u8)(ThermalValue_HP / ThermalValue_HP_count); + } +#endif + } + + delta = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + if(pdmpriv->bDoneTxpower) + delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); + else + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + } + else +#endif + { + delta_HP = 0; + } + delta_LCK = (ThermalValue > pdmpriv->ThermalValue_LCK)?(ThermalValue - pdmpriv->ThermalValue_LCK):(pdmpriv->ThermalValue_LCK - ThermalValue); + delta_IQK = (ThermalValue > pdmpriv->ThermalValue_IQK)?(ThermalValue - pdmpriv->ThermalValue_IQK):(pdmpriv->ThermalValue_IQK - ThermalValue); + delta_DPK = pdmpriv->ThermalValue_DPK - ThermalValue; + + //DBG_8192C("Readback Thermal Meter = 0x%lx pre thermal meter 0x%lx EEPROMthermalmeter 0x%lx delta 0x%lx delta_LCK 0x%lx delta_IQK 0x%lx\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK); + + if(delta_LCK > 1) + { + pdmpriv->ThermalValue_LCK = ThermalValue; + rtl8192c_PHY_LCCalibrate(Adapter); + } + + if((delta > 0 || delta_HP > 0) && pdmpriv->TxPowerTrackControl) + { +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_USB_High_PA) + { + pdmpriv->bDoneTxpower = _TRUE; + delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue); + + if(delta_HP > index_mapping_HP_NUM-1) + index_HP = index_mapping_HP[index_mapping_HP_NUM-1]; + else + index_HP = index_mapping_HP[delta_HP]; + + if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index_HP[i] - index_HP; + CCK_index = pdmpriv->CCK_index_HP -index_HP; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index_HP[i] + index_HP; + CCK_index = pdmpriv->CCK_index_HP + index_HP; + } + + delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue); + + } + else +#endif + { + if(ThermalValue > pdmpriv->ThermalValue) + { + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index[i] -= delta; + + pdmpriv->CCK_index -= delta; + } + else + { + for(i = 0; i < rf; i++) + pdmpriv->OFDM_index[i] += delta; + + pdmpriv->CCK_index += delta; + } + } + + /* + if(is2T) + { + DBG_8192C("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", + pdmpriv->OFDM_index[0], pdmpriv->OFDM_index[1], pdmpriv->CCK_index); + } + else + { + //DBG_8192C("temp OFDM_A_index=0x%x, CCK_index=0x%x\n",pdmpriv->OFDM_index[0], pdmpriv->CCK_index); + } + */ + + //no adjust +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType != BOARD_USB_High_PA) +#endif + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index[i]+1; + CCK_index = pdmpriv->CCK_index+1; + } + else + { + for(i = 0; i < rf; i++) + OFDM_index[i] = pdmpriv->OFDM_index[i]; + CCK_index = pdmpriv->CCK_index; + } +#if 0 +//#ifdef CONFIG_MP_INCLUDED + for(i = 0; i < rf; i++) + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + OFDM_index[i] += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + OFDM_index[i] -= 1; + else + OFDM_index[i] -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + OFDM_index[i] -= 1; + } + } + + { + if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26) + { + if(ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter) + { + CCK_index += 1; + } + } + else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter) + { + if (delta < 5) + CCK_index -= 1; + else + CCK_index -= 2; + } + else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5) + { + CCK_index -= 1; + } + } +#endif + } + + for(i = 0; i < rf; i++) + { + if(OFDM_index[i] > OFDM_TABLE_SIZE-1) + OFDM_index[i] = OFDM_TABLE_SIZE-1; + else if (OFDM_index[i] < OFDM_min_index) + OFDM_index[i] = OFDM_min_index; + } + + if(CCK_index > CCK_TABLE_SIZE-1) + CCK_index = CCK_TABLE_SIZE-1; + else if (CCK_index < 0) + CCK_index = 0; + + /* + if(is2T) + { + DBG_8192C("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n", OFDM_index[0], OFDM_index[1], CCK_index); + } + else + { + //DBG_8192C("new OFDM_A_index=0x%x, CCK_index=0x%x\n", OFDM_index[0], CCK_index); + } + */ + + } + + if(pdmpriv->TxPowerTrackControl && (delta != 0 || delta_HP != 0)) + { + //Adujst OFDM Ant_A according to IQK result + ele_D = (OFDMSwingTable[(u8)OFDM_index[0]] & 0xFFC00000)>>22; + X = pdmpriv->RegE94; + Y = pdmpriv->RegE9C; + + if(X != 0) + { + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x000003FF; + + //wirte new elements A, C, D to regC80 and regC94, element B is always 0 + value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32); + + } + else + { + PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[(u8)OFDM_index[0]]); + PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00); + } + + //RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D)); + + //Adjust CCK according to IQK result + if(!pdmpriv->bCCKinCH14){ + rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][0]); + rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][1]); + rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][2]); + rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][3]); + rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][4]); + rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][5]); + rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][6]); + rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[(u8)CCK_index][7]); + } + else{ + rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch14[(u8)CCK_index][0]); + rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch14[(u8)CCK_index][1]); + rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch14[(u8)CCK_index][2]); + rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch14[(u8)CCK_index][3]); + rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch14[(u8)CCK_index][4]); + rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch14[(u8)CCK_index][5]); + rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch14[(u8)CCK_index][6]); + rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch14[(u8)CCK_index][7]); + } + + if(is2T) + { + ele_D = (OFDMSwingTable[(u8)OFDM_index[1]] & 0xFFC00000)>>22; + + //new element A = element D x X + X = pdmpriv->RegEB4; + Y = pdmpriv->RegEBC; + + if(X != 0){ + if ((X & 0x00000200) != 0) //consider minus + X = X | 0xFFFFFC00; + ele_A = ((X * ele_D)>>8)&0x000003FF; + + //new element C = element D x Y + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + ele_C = ((Y * ele_D)>>8)&0x00003FF; + + //wirte new elements A, C, D to regC88 and regC9C, element B is always 0 + value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A; + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32); + + value32 = (ele_C&0x000003C0)>>6; + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32); + + value32 = ((X * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32); + + value32 = ((Y * ele_D)>>7)&0x01; + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32); + + } + else{ + PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[(u8)OFDM_index[1]]); + PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00); + PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00); + } + + //DBG_8192C("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D); + } + + /* + DBG_8192C("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", \ + PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord),\ + PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), \ + PHY_QueryRFReg(Adapter, RF90_PATH_A, 0x24, bMaskDWord)); + */ + } + +#if MP_DRIVER == 1 + if(delta_IQK > 1) +#else + if(delta_IQK > 3) +#endif + { + pdmpriv->ThermalValue_IQK = ThermalValue; + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); + } + + if(delta_DPK != 0) + { + delta_DPK = ThermalValue - pHalData->EEPROMThermalMeter; + + //if(pdmpriv->bDPPathAOK || pdmpriv->bDPPathBOK) + // DBG_8192C("TxPwrTracking delata_DPK = %d\n", delta_DPK); + + if(pdmpriv->bDPPathAOK) + PHY_SetBBReg(Adapter, 0xb68, 0x7c00, DPK_delta_mapping[0][((delta_DPK+13)/2)]); + if(pdmpriv->bDPPathBOK) + PHY_SetBBReg(Adapter, 0xb6c, 0x7c00, DPK_delta_mapping[1][((delta_DPK+13)/2)]); + pdmpriv->ThermalValue_DPK = ThermalValue; + } + + //update thermal meter value + if(pdmpriv->TxPowerTrackControl) + pdmpriv->ThermalValue = ThermalValue; + + } + + //DBG_8192C("<===dm_TXPowerTrackingCallback_ThermalMeter_92C\n"); + + pdmpriv->TXPowercount = 0; + +} + + +static VOID +dm_InitializeTXPowerTracking_ThermalMeter( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + //pMgntInfo->bTXPowerTracking = _TRUE; + pdmpriv->TXPowercount = 0; + pdmpriv->bTXPowerTrackingInit = _FALSE; + pdmpriv->ThermalValue = 0; + +#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default + pdmpriv->TxPowerTrackControl = _TRUE; +#endif + + MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl); +} + + +static VOID +DM_InitializeTXPowerTracking( + IN PADAPTER Adapter) +{ + dm_InitializeTXPowerTracking_ThermalMeter(Adapter); +} + +// +// Description: +// - Dispatch TxPower Tracking direct call ONLY for 92s. +// - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource +// leakage under some platform. +// +// Assumption: +// PASSIVE_LEVEL when this routine is called. +// +// Added by Roger, 2009.06.18. +// +static VOID +DM_TXPowerTracking92CDirectCall( + IN PADAPTER Adapter) +{ + dm_TXPowerTrackingCallback_ThermalMeter_92C(Adapter); +} + +static VOID +dm_CheckTXPowerTracking_ThermalMeter( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + //u1Byte TxPowerCheckCnt = 5; //10 sec + + //if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/) + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_SS)) + { + return; + } + + if(!pdmpriv->TM_Trigger) //at least delay 1 sec + { + //pHalData->TxPowerCheckCnt++; //cosa add for debug + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60); + //DBG_8192C("Trigger 92C Thermal Meter!!\n"); + + pdmpriv->TM_Trigger = 1; + return; + + } + else + { + //DBG_8192C("Schedule TxPowerTracking direct call!!\n"); + DM_TXPowerTracking92CDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18. + pdmpriv->TM_Trigger = 0; + } + +} + + +VOID +rtl8192c_dm_CheckTXPowerTracking( + IN PADAPTER Adapter) +{ + dm_CheckTXPowerTracking_ThermalMeter(Adapter); +} + +#ifdef CONFIG_BT_COEXIST +static BOOLEAN BT_BTStateChange(PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + struct registry_priv *registry_par = &Adapter->registrypriv; + + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + u32 Polling, Ratio_Tx, Ratio_PRI; + u32 BT_Tx, BT_PRI; + u8 BT_State; + static u8 ServiceTypeCnt = 0; + u8 CurServiceType; + static u8 LastServiceType = BT_Idle; + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) + return _FALSE; + + BT_State = rtw_read8(Adapter, 0x4fd); +/* + temp = PlatformEFIORead4Byte(Adapter, 0x488); + BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff)); + BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff)); + + temp = PlatformEFIORead4Byte(Adapter, 0x48c); + Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) + + ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff); + +*/ + BT_Tx = rtw_read32(Adapter, 0x488); + + DBG_8192C("Ratio 0x488 =%x\n", BT_Tx); + BT_Tx =BT_Tx & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx)); + + BT_PRI = rtw_read32(Adapter, 0x48c); + + DBG_8192C("Ratio 0x48c =%x\n", BT_PRI); + BT_PRI =BT_PRI & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI)); + + + Polling = rtw_read32(Adapter, 0x490); + //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling)); + + + if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffff && BT_State==0xff) + return _FALSE; + + BT_State &= BIT0; + + if(BT_State != pbtpriv->BT_CUR_State) + { + pbtpriv->BT_CUR_State = BT_State; + + if(registry_par->bt_sco == 3) + { + ServiceTypeCnt = 0; + + pbtpriv->BT_Service = BT_Idle; + + DBG_8192C("BT_%s\n", BT_State?"ON":"OFF"); + + BT_State = BT_State | + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) |BIT2; + + rtw_write8(Adapter, 0x4fd, BT_State); + DBG_8192C("BT set 0x4fd to %x\n", BT_State); + } + + return _TRUE; + } + DBG_8192C("bRegBT_Sco = %d\n",registry_par->bt_sco); + + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pbtpriv->Ratio_Tx=Ratio_Tx; + pbtpriv->Ratio_PRI=Ratio_PRI; + + DBG_8192C("Ratio_Tx=%d\n", Ratio_Tx); + DBG_8192C("Ratio_PRI=%d\n", Ratio_PRI); + + + if(BT_State && registry_par->bt_sco==3) + { + DBG_8192C("bt_sco ==3 Follow Counter\n"); +// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff) +// { +// ServiceTypeCnt = 0; +// return FALSE; +// } +// else + { + /* + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; + + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); + + */ + if((Ratio_Tx < 30) && (Ratio_PRI < 30)) + CurServiceType = BT_Idle; + else if((Ratio_PRI > 110) && (Ratio_PRI < 250)) + CurServiceType = BT_SCO; + else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200)) + CurServiceType = BT_Busy; + else if((Ratio_Tx >=350) && (Ratio_Tx < 500)) + CurServiceType = BT_OtherBusy; + else if(Ratio_Tx >=500) + CurServiceType = BT_PAN; + else + CurServiceType=BT_OtherAction; + } + +/* if(pHalData->bt_coexist.bStopCount) + { + ServiceTypeCnt=0; + pHalData->bt_coexist.bStopCount=FALSE; + } +*/ +// if(CurServiceType == BT_OtherBusy) + { + ServiceTypeCnt=2; + LastServiceType=CurServiceType; + } +#if 0 + else if(CurServiceType == LastServiceType) + { + if(ServiceTypeCnt<3) + ServiceTypeCnt++; + } + else + { + ServiceTypeCnt = 0; + LastServiceType = CurServiceType; + } +#endif + + if(ServiceTypeCnt==2) + { + pbtpriv->BT_Service = LastServiceType; + BT_State = BT_State | + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) | + //((pbtpriv->BT_Service==BT_SCO)?0:BIT2); + ((pbtpriv->BT_Service!=BT_Idle)?0:BIT2); + + //if(pbtpriv->BT_Service==BT_Busy) + // BT_State&= ~(BIT2); + + if(pbtpriv->BT_Service==BT_SCO) + { + DBG_8192C("BT TYPE Set to ==> BT_SCO\n"); + } + else if(pbtpriv->BT_Service==BT_Idle) + { + DBG_8192C("BT TYPE Set to ==> BT_Idle\n"); + } + else if(pbtpriv->BT_Service==BT_OtherAction) + { + DBG_8192C("BT TYPE Set to ==> BT_OtherAction\n"); + } + else if(pbtpriv->BT_Service==BT_Busy) + { + DBG_8192C("BT TYPE Set to ==> BT_Busy\n"); + } + else if(pbtpriv->BT_Service==BT_PAN) + { + DBG_8192C("BT TYPE Set to ==> BT_PAN\n"); + } + else + { + DBG_8192C("BT TYPE Set to ==> BT_OtherBusy\n"); + } + + //Add interrupt migration when bt is not in idel state (no traffic). + //suggestion by Victor. + if(pbtpriv->BT_Service!=BT_Idle)//EDCA_VI_PARAM modify + { + + rtw_write16(Adapter, 0x504, 0x0ccc); + rtw_write8(Adapter, 0x506, 0x54); + rtw_write8(Adapter, 0x507, 0x54); + + } + else + { + rtw_write8(Adapter, 0x506, 0x00); + rtw_write8(Adapter, 0x507, 0x00); + } + + rtw_write8(Adapter, 0x4fd, BT_State); + DBG_8192C("BT_SCO set 0x4fd to %x\n", BT_State); + return _TRUE; + } + } + + return _FALSE; + +} + +static BOOLEAN +BT_WifiConnectChange( + IN PADAPTER Adapter + ) +{ + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); +// PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + static BOOLEAN bMediaConnect = _FALSE; + + //if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo)) + if(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) + { + bMediaConnect = _FALSE; + } + else + { + if(!bMediaConnect) + { + bMediaConnect = _TRUE; + return _TRUE; + } + bMediaConnect = _TRUE; + } + + return _FALSE; +} + +#define BT_RSSI_STATE_NORMAL_POWER BIT0 +#define BT_RSSI_STATE_AMDPU_OFF BIT1 +#define BT_RSSI_STATE_SPECIAL_LOW BIT2 +#define BT_RSSI_STATE_BG_EDCA_LOW BIT3 + +static s32 GET_UNDECORATED_AVERAGE_RSSI(PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + s32 average_rssi; + + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) + { + average_rssi = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + } + else + { + average_rssi = pdmpriv->UndecoratedSmoothedPWDB; + } + return average_rssi; +} + +static u8 BT_RssiStateChange( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + s32 UndecoratedSmoothedPWDB; + u8 CurrBtRssiState = 0x00; + + + + + //if(pMgntInfo->bMediaConnect) // Default port + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(Adapter); + } + else // associated entry pwdb + { + if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) + UndecoratedSmoothedPWDB = 100; // No any RSSI information. Assume to be MAX. + else + UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + } + + // Check RSSI to determine HighPower/NormalPower state for BT coexistence. + if(UndecoratedSmoothedPWDB >= 67) + CurrBtRssiState &= (~BT_RSSI_STATE_NORMAL_POWER); + else if(UndecoratedSmoothedPWDB < 62) + CurrBtRssiState |= BT_RSSI_STATE_NORMAL_POWER; + + // Check RSSI to determine AMPDU setting for BT coexistence. + if(UndecoratedSmoothedPWDB >= 40) + CurrBtRssiState &= (~BT_RSSI_STATE_AMDPU_OFF); + else if(UndecoratedSmoothedPWDB <= 32) + CurrBtRssiState |= BT_RSSI_STATE_AMDPU_OFF; + + // Marked RSSI state. It will be used to determine BT coexistence setting later. + if(UndecoratedSmoothedPWDB < 35) + CurrBtRssiState |= BT_RSSI_STATE_SPECIAL_LOW; + else + CurrBtRssiState &= (~BT_RSSI_STATE_SPECIAL_LOW); + + // Check BT state related to BT_Idle in B/G mode. + if(UndecoratedSmoothedPWDB < 15) + CurrBtRssiState |= BT_RSSI_STATE_BG_EDCA_LOW; + else + CurrBtRssiState &= (~BT_RSSI_STATE_BG_EDCA_LOW); + + if(CurrBtRssiState != pbtpriv->BtRssiState) + { + pbtpriv->BtRssiState = CurrBtRssiState; + return _TRUE; + } + else + { + return _FALSE; + } +} + +static void dm_BTCoexist(PADAPTER Adapter ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct mlme_ext_info *pmlmeinfo = &Adapter->mlmeextpriv.mlmext_info; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + //PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + //PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo); + + //PRX_TS_RECORD pRxTs = NULL; + u8 BT_gpio_mux; + + BOOLEAN bWifiConnectChange, bBtStateChange,bRssiStateChange; + + if(pbtpriv->bCOBT == _FALSE) return; + + if(!( pdmpriv->DMFlag & DYNAMIC_FUNC_BT)) return; + + if( (pbtpriv->BT_Coexist) &&(pbtpriv->BT_CoexistType == BT_CSR_BC4) && (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE) ) + { + bWifiConnectChange = BT_WifiConnectChange(Adapter); + bBtStateChange = BT_BTStateChange(Adapter); + bRssiStateChange = BT_RssiStateChange(Adapter); + + DBG_8192C("bWifiConnectChange %d, bBtStateChange %d,bRssiStateChange %d\n", + bWifiConnectChange,bBtStateChange,bRssiStateChange); + + // add by hpfan for debug message + BT_gpio_mux = rtw_read8(Adapter, REG_GPIO_MUXCFG); + DBG_8192C("BTCoexit Reg_0x40 (%2x)\n", BT_gpio_mux); + + if( bWifiConnectChange ||bBtStateChange ||bRssiStateChange ) + { + if(pbtpriv->BT_CUR_State) + { + + // Do not allow receiving A-MPDU aggregation. + if(pbtpriv->BT_Ampdu)// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. + { + + if(pmlmeinfo->assoc_AP_vendor == ciscoAP) + { + if(pbtpriv->BT_Service!=BT_Idle) + { + if(pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Disallow AMPDU \n"); + pmlmeinfo->bAcceptAddbaReq = _FALSE; + send_delba(Adapter,0, get_my_bssid(&(pmlmeinfo->network))); + } + } + else + { + if(!pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Allow AMPDU RSSI >=40\n"); + pmlmeinfo->bAcceptAddbaReq = _TRUE; + } + } + } + else + { + if(!pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Allow AMPDU BT Idle\n"); + pmlmeinfo->bAcceptAddbaReq = _TRUE; + } + } + } + +#if 0 + else if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy)) + { + if(pHalData->bt_coexist.BtRssiState & BT_RSSI_STATE_AMDPU_OFF) + { + if(pMgntInfo->bBT_Ampdu && pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n")); + pHTInfo->bAcceptAddbaReq = FALSE; + if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE)) + TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR); + } + } + else + { + if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n")); + pHTInfo->bAcceptAddbaReq = TRUE; + } + } + } + else + { + if(pMgntInfo->bBT_Ampdu && !pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n")); + pHTInfo->bAcceptAddbaReq = TRUE; + } + } +#endif + + if(pbtpriv->BT_Ant_isolation) + { + DBG_8192C("BT_IsolationLow\n"); + +// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3. +#if 0 + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + if(pMgntInfo->bUseRAMask) + { + // 20100407 Joseph: Fix rate adaptive modification for BT coexist. + // This fix is not complete yet. It shall also consider VWifi and Adhoc case, + // which connect with multiple STAs. + Adapter->HalFunc.UpdateHalRAMaskHandler( + Adapter, + FALSE, + 0, + NULL, + NULL, + pMgntInfo->RateAdaptive.RATRState, + RAMask_Normal); + } + else + { + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + } +#endif + + // 20100415 Joseph: Modify BT coexist mechanism suggested by Yaying. + // Now we only enable HW BT coexist when BT in "Busy" state. + if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20) + { + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && + pbtpriv->BT_Service==BT_OtherAction) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); + } + else + { + if((pbtpriv->BT_Service==BT_Busy) && + (pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER)) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); + } + else if((pbtpriv->BT_Service==BT_OtherAction) && + (pbtpriv->BtRssiState & BT_RSSI_STATE_SPECIAL_LOW)) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0xa0); + } + else if(pbtpriv->BT_Service==BT_PAN) + { + DBG_8192C("BT_Turn ON Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + } + else + { + DBG_8192C("BT_Turn OFF Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + } + } + } + else + { + DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist\n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + } + + if(1)//pMgntInfo->LinkDetectInfo.NumRecvDataInPeriod >= 20) + { + if(pbtpriv->BT_Service==BT_PAN) + { + DBG_8192C("BT_Turn ON Coexist(Reg0x44 = 0x10100)\n"); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x10100); + } + else + { + DBG_8192C("BT_Turn OFF Coexist(Reg0x44 = 0x0)\n"); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0); + } + } + else + { + DBG_8192C("BT: There is no Wifi traffic!! Turn off Coexist(Reg0x44 = 0x0)\n"); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, 0x0); + } + + // 20100430 Joseph: Integrate the BT coexistence EDCA tuning here. + if(pbtpriv->BtRssiState & BT_RSSI_STATE_NORMAL_POWER) + { + if(pbtpriv->BT_Service==BT_OtherBusy) + { + //pbtpriv->BtEdcaUL = 0x5ea72b; + //pbtpriv->BtEdcaDL = 0x5ea72b; + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72b; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72b; + + DBG_8192C("BT in BT_OtherBusy state Tx (%d) >350 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx ,REG_EDCA_BE_PARAM, 0x5ea72b); + } + else if(pbtpriv->BT_Service==BT_Busy) + { + //pbtpriv->BtEdcaUL = 0x5eb82f; + //pbtpriv->BtEdcaDL = 0x5eb82f; + + pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82f; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82f; + + DBG_8192C("BT in BT_Busy state parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82f); + } + else if(pbtpriv->BT_Service==BT_SCO) + { + if(pbtpriv->Ratio_Tx>160) + { + //pbtpriv->BtEdcaUL = 0x5ea72f; + //pbtpriv->BtEdcaDL = 0x5ea72f; + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea72f; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea72f; + DBG_8192C("BT in BT_SCO state Tx (%d) >160 parameter(0x%x) = 0x%x\n",pbtpriv->Ratio_Tx, REG_EDCA_BE_PARAM, 0x5ea72f); + } + else + { + //pbtpriv->BtEdcaUL = 0x5ea32b; + //pbtpriv->BtEdcaDL = 0x5ea42b; + + pbtpriv->BT_EDCA[UP_LINK] = 0x5ea32b; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5ea42b; + + DBG_8192C("BT in BT_SCO state Tx (%d) <160 parameter(0x%x) = 0x%x\n", pbtpriv->Ratio_Tx,REG_EDCA_BE_PARAM, 0x5ea32f); + } + } + else + { + // BT coexistence mechanism does not control EDCA parameter. + //pbtpriv->BtEdcaUL = 0; + //pbtpriv->BtEdcaDL = 0; + + pbtpriv->BT_EDCA[UP_LINK] = 0; + pbtpriv->BT_EDCA[DOWN_LINK] = 0; + DBG_8192C("BT in State %d and parameter(0x%x) use original setting.\n",pbtpriv->BT_Service, REG_EDCA_BE_PARAM); + } + + if((pbtpriv->BT_Service!=BT_Idle) && + (pmlmeext->cur_wireless_mode == WIRELESS_MODE_G) && + (pbtpriv->BtRssiState & BT_RSSI_STATE_BG_EDCA_LOW)) + { + //pbtpriv->BtEdcaUL = 0x5eb82b; + //pbtpriv->BtEdcaDL = 0x5eb82b; + + pbtpriv->BT_EDCA[UP_LINK] = 0x5eb82b; + pbtpriv->BT_EDCA[DOWN_LINK] = 0x5eb82b; + + DBG_8192C("BT set parameter(0x%x) = 0x%x\n", REG_EDCA_BE_PARAM, 0x5eb82b); + } + } + else + { + // BT coexistence mechanism does not control EDCA parameter. + //pbtpriv->BtEdcaUL = 0; + //pbtpriv->BtEdcaDL = 0; + + pbtpriv->BT_EDCA[UP_LINK] = 0; + pbtpriv->BT_EDCA[DOWN_LINK] = 0; + } + + // 20100415 Joseph: Set RF register 0x1E and 0x1F for BT coexist suggested by Yaying. + if(pbtpriv->BT_Service!=BT_Idle) + { + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf); + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, 0xf); + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1E[7:4] = 0x%x \n", 0xf)); + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, 0xf); + } + else + { + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n",pbtpriv->BtRfRegOrigin1E); + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E); + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F)); + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F); + } + } + else + { + DBG_8192C("BT_IsolationHigh\n"); + // Do nothing. + } + } + else + { + + if(pbtpriv->BT_Ampdu && !pmlmeinfo->bAcceptAddbaReq) + { + DBG_8192C("BT_Allow AMPDU bt is off\n"); + pmlmeinfo->bAcceptAddbaReq = _TRUE; + } + + DBG_8192C("BT_Turn OFF Coexist bt is off \n"); + rtw_write8(Adapter, REG_GPIO_MUXCFG, 0x00); + + DBG_8192C("BT Set RfReg0x1E[7:4] = 0x%x \n", pbtpriv->BtRfRegOrigin1E); + PHY_SetRFReg(Adapter, PathA, 0x1e, 0xf0, pbtpriv->BtRfRegOrigin1E); + //RTPRINT(FBT, BT_TRACE, ("BT Set RfReg0x1F[7:4] = 0x%x \n", pHalData->bt_coexist.BtRfRegOrigin1F)); + //PHY_SetRFReg(Adapter, PathA, 0x1f, 0xf0, pHalData->bt_coexist.BtRfRegOrigin1F); + + // BT coexistence mechanism does not control EDCA parameter since BT is disabled. + //pbtpriv->BtEdcaUL = 0; + //pbtpriv->BtEdcaDL = 0; + pbtpriv->BT_EDCA[UP_LINK] = 0; + pbtpriv->BT_EDCA[DOWN_LINK] = 0; + + +// 20100427 Joseph: Do not adjust Rate adaptive for BT coexist suggested by SD3. +#if 0 + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + if(pMgntInfo->bUseRAMask) + { + // 20100407 Joseph: Fix rate adaptive modification for BT coexist. + // This fix is not complete yet. It shall also consider VWifi and Adhoc case, + // which connect with multiple STAs. + Adapter->HalFunc.UpdateHalRAMaskHandler( + Adapter, + FALSE, + 0, + NULL, + NULL, + pMgntInfo->RateAdaptive.RATRState, + RAMask_Normal); + } + else + { + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + } +#endif + } + } + } +} + +static void dm_InitBtCoexistDM( PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + + if( !pbtpriv->BT_Coexist ) return; + + pbtpriv->BtRfRegOrigin1E = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1e, 0xf0); + pbtpriv->BtRfRegOrigin1F = (u8)PHY_QueryRFReg(Adapter, PathA, 0x1f, 0xf0); +} + +void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + + pbtpriv->bCOBT = bStart; + send_delba(padapter,0, get_my_bssid(&(pmlmeinfo->network))); + send_delba(padapter,1, get_my_bssid(&(pmlmeinfo->network))); + +} + +void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir) +{ + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + DBG_8192C("issue_delete_ba : %s...\n",(dir==0)?"RX_DIR":"TX_DIR"); + send_delba(padapter,dir, get_my_bssid(&(pmlmeinfo->network))); +} + +#endif + +#if 0//def CONFIG_PCI_HCI + +BOOLEAN +BT_BTStateChange( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + + u4Byte temp, Polling, Ratio_Tx, Ratio_PRI; + u4Byte BT_Tx, BT_PRI; + u1Byte BT_State; + static u1Byte ServiceTypeCnt = 0; + u1Byte CurServiceType; + static u1Byte LastServiceType = BT_Idle; + + if(!pMgntInfo->bMediaConnect) + return FALSE; + + BT_State = PlatformEFIORead1Byte(Adapter, 0x4fd); +/* + temp = PlatformEFIORead4Byte(Adapter, 0x488); + BT_Tx = (u2Byte)(((temp<<8)&0xff00)+((temp>>8)&0xff)); + BT_PRI = (u2Byte)(((temp>>8)&0xff00)+((temp>>24)&0xff)); + + temp = PlatformEFIORead4Byte(Adapter, 0x48c); + Polling = ((temp<<8)&0xff000000) + ((temp>>8)&0x00ff0000) + + ((temp<<8)&0x0000ff00) + ((temp>>8)&0x000000ff); + +*/ + BT_Tx = PlatformEFIORead4Byte(Adapter, 0x488); + + RTPRINT(FBT, BT_TRACE, ("Ratio 0x488 =%x\n", BT_Tx)); + BT_Tx =BT_Tx & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_Tx =%x\n", BT_Tx)); + + BT_PRI = PlatformEFIORead4Byte(Adapter, 0x48c); + + RTPRINT(FBT, BT_TRACE, ("Ratio Ratio 0x48c =%x\n", BT_PRI)); + BT_PRI =BT_PRI & 0x00ffffff; + //RTPRINT(FBT, BT_TRACE, ("Ratio BT_PRI =%x\n", BT_PRI)); + + + Polling = PlatformEFIORead4Byte(Adapter, 0x490); + //RTPRINT(FBT, BT_TRACE, ("Ratio 0x490 =%x\n", Polling)); + + + if(BT_Tx==0xffffffff && BT_PRI==0xffffffff && Polling==0xffffffffff && BT_State==0xff) + return FALSE; + + BT_State &= BIT0; + + if(BT_State != pHalData->bt_coexist.BT_CUR_State) + { + pHalData->bt_coexist.BT_CUR_State = BT_State; + + if(pMgntInfo->bRegBT_Sco == 3) + { + ServiceTypeCnt = 0; + + pHalData->bt_coexist.BT_Service = BT_Idle; + + RTPRINT(FBT, BT_TRACE, ("BT_%s\n", BT_State?"ON":"OFF")); + + BT_State = BT_State | + ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) |BIT2; + + PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State); + RTPRINT(FBT, BT_TRACE, ("BT set 0x4fd to %x\n", BT_State)); + } + + return TRUE; + } + RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco %d\n", pMgntInfo->bRegBT_Sco)); + + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; + + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); + + + if(BT_State && pMgntInfo->bRegBT_Sco==3) + { + RTPRINT(FBT, BT_TRACE, ("bRegBT_Sco ==3 Follow Counter\n")); +// if(BT_Tx==0xffff && BT_PRI==0xffff && Polling==0xffffffff) +// { +// ServiceTypeCnt = 0; +// return FALSE; +// } +// else + { + /* + Ratio_Tx = BT_Tx*1000/Polling; + Ratio_PRI = BT_PRI*1000/Polling; + + pHalData->bt_coexist.Ratio_Tx=Ratio_Tx; + pHalData->bt_coexist.Ratio_PRI=Ratio_PRI; + + RTPRINT(FBT, BT_TRACE, ("Ratio_Tx=%d\n", Ratio_Tx)); + RTPRINT(FBT, BT_TRACE, ("Ratio_PRI=%d\n", Ratio_PRI)); + + */ + if((Ratio_Tx <= 50) && (Ratio_PRI <= 50)) + CurServiceType = BT_Idle; + else if((Ratio_PRI > 150) && (Ratio_PRI < 200)) + CurServiceType = BT_SCO; + else if((Ratio_Tx >= 200)&&(Ratio_PRI >= 200)) + CurServiceType = BT_Busy; + else if(Ratio_Tx >= 350) + CurServiceType = BT_OtherBusy; + else + CurServiceType=BT_OtherAction; + + } +/* if(pHalData->bt_coexist.bStopCount) + { + ServiceTypeCnt=0; + pHalData->bt_coexist.bStopCount=FALSE; + } +*/ + if(CurServiceType == BT_OtherBusy) + { + ServiceTypeCnt=2; + LastServiceType=CurServiceType; + } + else if(CurServiceType == LastServiceType) + { + if(ServiceTypeCnt<3) + ServiceTypeCnt++; + } + else + { + ServiceTypeCnt = 0; + LastServiceType = CurServiceType; + } + + if(ServiceTypeCnt==2) + { + pHalData->bt_coexist.BT_Service = LastServiceType; + BT_State = BT_State | + ((pHalData->bt_coexist.BT_Ant_isolation==1)?0:BIT1) | + ((pHalData->bt_coexist.BT_Service==BT_SCO)?0:BIT2); + + if(pHalData->bt_coexist.BT_Service==BT_Busy) + BT_State&= ~(BIT2); + + if(pHalData->bt_coexist.BT_Service==BT_SCO) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_SCO\n")); + } + else if(pHalData->bt_coexist.BT_Service==BT_Idle) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Idle\n")); + } + else if(pHalData->bt_coexist.BT_Service==BT_OtherAction) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherAction\n")); + } + else if(pHalData->bt_coexist.BT_Service==BT_Busy) + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_Busy\n")); + } + else + { + RTPRINT(FBT, BT_TRACE, ("BT TYPE Set to ==> BT_OtherBusy\n")); + } + + //Add interrupt migration when bt is not in idel state (no traffic). + //suggestion by Victor. + if(pHalData->bt_coexist.BT_Service!=BT_Idle) + { + + PlatformEFIOWrite2Byte(Adapter, 0x504, 0x0ccc); + PlatformEFIOWrite1Byte(Adapter, 0x506, 0x54); + PlatformEFIOWrite1Byte(Adapter, 0x507, 0x54); + + } + else + { + PlatformEFIOWrite1Byte(Adapter, 0x506, 0x00); + PlatformEFIOWrite1Byte(Adapter, 0x507, 0x00); + } + + PlatformEFIOWrite1Byte(Adapter, 0x4fd, BT_State); + RTPRINT(FBT, BT_TRACE, ("BT_SCO set 0x4fd to %x\n", BT_State)); + return TRUE; + } + } + + return FALSE; + +} + +BOOLEAN +BT_WifiConnectChange( + IN PADAPTER Adapter + ) +{ + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + static BOOLEAN bMediaConnect = FALSE; + + if(!pMgntInfo->bMediaConnect || MgntRoamingInProgress(pMgntInfo)) + { + bMediaConnect = FALSE; + } + else + { + if(!bMediaConnect) + { + bMediaConnect = TRUE; + return TRUE; + } + bMediaConnect = TRUE; + } + + return FALSE; +} + +BOOLEAN +BT_RSSIChangeWithAMPDU( + IN PADAPTER Adapter + ) +{ + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(!Adapter->pNdisCommon->bRegBT_Ampdu || !Adapter->pNdisCommon->bRegAcceptAddbaReq) + return FALSE; + + RTPRINT(FBT, BT_TRACE, ("RSSI is %d\n",pHalData->UndecoratedSmoothedPWDB)); + + if((pHalData->UndecoratedSmoothedPWDB<=32) && pMgntInfo->pHTInfo->bAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32 Need change\n")); + return TRUE; + + } + else if((pHalData->UndecoratedSmoothedPWDB>=40) && !pMgntInfo->pHTInfo->bAcceptAddbaReq ) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40, Need change\n")); + return TRUE; + } + else + return FALSE; + +} + + +VOID +dm_BTCoexist( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; + static u1Byte LastTxPowerLvl = 0xff; + PRX_TS_RECORD pRxTs = NULL; + + BOOLEAN bWifiConnectChange, bBtStateChange,bRSSIChangeWithAMPDU; + + if( (pHalData->bt_coexist.BluetoothCoexist) && + (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) && + (!ACTING_AS_AP(Adapter)) ) + { + bWifiConnectChange = BT_WifiConnectChange(Adapter); + bBtStateChange = BT_BTStateChange(Adapter); + bRSSIChangeWithAMPDU = BT_RSSIChangeWithAMPDU(Adapter); + RTPRINT(FBT, BT_TRACE, ("bWifiConnectChange %d, bBtStateChange %d,LastTxPowerLvl %x, DynamicTxHighPowerLvl %x\n", + bWifiConnectChange,bBtStateChange,LastTxPowerLvl,pHalData->DynamicTxHighPowerLvl)); + if( bWifiConnectChange ||bBtStateChange || + (LastTxPowerLvl != pHalData->DynamicTxHighPowerLvl) ||bRSSIChangeWithAMPDU) + { + LastTxPowerLvl = pHalData->DynamicTxHighPowerLvl; + + if(pHalData->bt_coexist.BT_CUR_State) + { + // Do not allow receiving A-MPDU aggregation. + if((pHalData->bt_coexist.BT_Service==BT_SCO) || (pHalData->bt_coexist.BT_Service==BT_Busy)) + { + if(pHalData->UndecoratedSmoothedPWDB<=32) + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Disallow AMPDU RSSI <=32\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = FALSE; + if(GetTs(Adapter, (PTS_COMMON_INFO*)(&pRxTs), pMgntInfo->Bssid, 0, RX_DIR, FALSE)) + TsInitDelBA(Adapter, (PTS_COMMON_INFO)pRxTs, RX_DIR); + } + } + else if(pHalData->UndecoratedSmoothedPWDB>=40) + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU RSSI >=40\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; + } + } + } + else + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU BT not in SCO or BUSY\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; + } + } + + if(pHalData->bt_coexist.BT_Ant_isolation) + { + RTPRINT(FBT, BT_TRACE, ("BT_IsolationLow\n")); + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + + if(pHalData->bt_coexist.BT_Service==BT_SCO) + { + + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist with SCO \n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); + } + else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) + { + RTPRINT(FBT, BT_TRACE, ("BT_Turn ON Coexist\n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0xb4); + } + else + { + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist\n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); + } + } + else + { + RTPRINT(FBT, BT_TRACE, ("BT_IsolationHigh\n")); + // Do nothing. + } + } + else + { + if(Adapter->pNdisCommon->bRegBT_Ampdu && Adapter->pNdisCommon->bRegAcceptAddbaReq) + { + RTPRINT(FBT, BT_TRACE, ("BT_Allow AMPDU bt is off\n")); + pMgntInfo->pHTInfo->bAcceptAddbaReq = TRUE; + } + + RTPRINT(FBT, BT_TRACE, ("BT_Turn OFF Coexist bt is off \n")); + PlatformEFIOWrite1Byte(Adapter, REG_GPIO_MUXCFG, 0x14); + + RTPRINT(FBT, BT_TRACE, ("BT_Update Rate table\n")); + Adapter->HalFunc.UpdateHalRATRTableHandler( + Adapter, + &pMgntInfo->dot11OperationalRateSet, + pMgntInfo->dot11HTOperationalRateSet,NULL); + } + } + } +} +#endif + + +/*----------------------------------------------------------------------------- + * Function: dm_CheckRfCtrlGPIO() + * + * Overview: Copy 8187B template for 9xseries. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/10/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +dm_CheckRfCtrlGPIO( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) + #ifdef CONFIG_USB_HCI + // 2010/08/12 MH Add for CU selective suspend. + PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(Adapter); + #else + PRT_SDIO_DEVICE pDevice = GET_RT_SDIO_DEVICE(Adapter); + #endif +#endif + + if(!Adapter->MgntInfo.PowerSaveControl.bGpioRfSw) + return; + + RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n")); + +#if defined (CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI) + // Walk around for DTM test, we will not enable HW - radio on/off because r/w + // page 1 register before Lextra bus is enabled cause system fails when resuming + // from S4. 20080218, Emily + if(Adapter->bInHctTest) + return; + +//#if ((HAL_CODE_BASE == RTL8192_S) ) + //Adapter->HalFunc.GPIOChangeRFHandler(Adapter, GPIORF_POLLING); +//#else + // 2010/07/27 MH Only Minicard and support selective suspend, we can not turn off all MAC power to + // stop 8051. For dongle and minicard, we both support selective suspend mode. + //if(pDevice->RegUsbSS && Adapter->HalFunc.GetInterfaceSelectionHandler(Adapter) == INTF_SEL2_MINICARD) + + // + // 2010/08/12 MH We support severl power consumption combination as below. + // + // Power consumption combination + // SS Enable: (LPS disable + IPS + SW/HW radio off) + // 1. Dongle + PDN (support HW radio off) + // 2. Dongle + Normal (No HW radio off) + // 3. MiniCard + PDN (support HW radio off) + // 4. MiniCard + Normal (support HW radio off) + // + // SS Disable: (LPS + IPS + SW/HW radio off) + // 1. Dongle + PDN (support HW radio off) + // 2. Dongle + Normal (No HW radio off) + // 3. MiniCard + PDN (support HW radio off) + // 4. MiniCard + Normal (support HW radio off) + // + // For Power down module detection. We need to read power register no matter + // dongle or minicard, we will add the item is the detection method. + // + // + //vivi add du case + if ((IS_HARDWARE_TYPE_8192CU(Adapter)||IS_HARDWARE_TYPE_8192DU(Adapter)) + && pDevice->RegUsbSS) + { + RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Enabled\n")); + if (SUPPORT_HW_RADIO_DETECT(Adapter)) + { // Support HW radio detection + RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n")); + GpioDetectTimerStart(Adapter); + } + else + { // Dongle does not support HW radio detection.?? In the fufure?? + RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n")); + } + } + else if (IS_HARDWARE_TYPE_8192CU(Adapter) || + IS_HARDWARE_TYPE_8723U(Adapter)|| + IS_HARDWARE_TYPE_8192DU(Adapter) || + IS_HARDWARE_TYPE_8723S(Adapter)) + { // Not support Selective suspend + RT_TRACE(COMP_RF, DBG_LOUD, ("USB SS Disable\n")); + if (SUPPORT_HW_RADIO_DETECT(Adapter)) + { + RT_TRACE(COMP_RF, DBG_LOUD, ("USB Card Type 2/3/4 support GPIO Detect\n")); + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); + } + else + { + RT_TRACE(COMP_RF, DBG_LOUD, ("USB DONGLE Non-GPIO-Detect\n")); + } + } + else + { // CE only support noemal HW radio detection now. Support timers GPIO detection in SE/CU. + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); + } +//#endif +#else if defined CONFIG_PCI_HCI + if(Adapter->bInHctTest) + return; + + // CE only support noemal HW radio detection now. We support timers GPIO detection in SE. + PlatformScheduleWorkItem( &(pHalData->GPIOChangeRFWorkItem) ); +#endif +#endif +} /* dm_CheckRfCtrlGPIO */ + +static VOID +dm_InitRateAdaptiveMask( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pdmpriv->RateAdaptive; + + pRA->RATRState = DM_RATR_STA_INIT; + pRA->PreRATRState = DM_RATR_STA_INIT; + + if (pdmpriv->DM_Type == DM_Type_ByDriver) + pdmpriv->bUseRAMask = _TRUE; + else + pdmpriv->bUseRAMask = _FALSE; +} + +/*----------------------------------------------------------------------------- + * Function: dm_RefreshRateAdaptiveMask() + * + * Overview: Update rate table mask according to rssi + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 05/27/2009 hpfan Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +dm_RefreshRateAdaptiveMask( IN PADAPTER pAdapter) +{ +#if 0 + PADAPTER pTargetAdapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMGNT_INFO pMgntInfo = &(ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, TRUE)->MgntInfo); + PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pMgntInfo->RateAdaptive; + u4Byte LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0; + + if(pAdapter->bDriverStopped) + { + RT_TRACE(COMP_RATR, DBG_TRACE, ("<---- dm_RefreshRateAdaptiveMask(): driver is going to unload\n")); + return; + } + + if(!pMgntInfo->bUseRAMask) + { + RT_TRACE(COMP_RATR, DBG_LOUD, ("<---- dm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n")); + return; + } + + // if default port is connected, update RA table for default port (infrastructure mode only) + if(pAdapter->MgntInfo.mAssoc && (!ACTING_AS_AP(pAdapter))) + { + + // decide rastate according to rssi + switch (pRA->PreRATRState) + { + case DM_RATR_STA_HIGH: + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + break; + + case DM_RATR_STA_MIDDLE: + HighRSSIThreshForRA = 55; + LowRSSIThreshForRA = 20; + break; + + case DM_RATR_STA_LOW: + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 25; + break; + + default: + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + break; + } + + if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA) + pRA->RATRState = DM_RATR_STA_HIGH; + else if(pHalData->UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA) + pRA->RATRState = DM_RATR_STA_MIDDLE; + else + pRA->RATRState = DM_RATR_STA_LOW; + + if(pRA->PreRATRState != pRA->RATRState) + { + RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pHalData->UndecoratedSmoothedPWDB)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pRA->RATRState)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pRA->PreRATRState, pRA->RATRState)); + pAdapter->HalFunc.UpdateHalRAMaskHandler( + pAdapter, + FALSE, + 0, + NULL, + NULL, + pRA->RATRState); + pRA->PreRATRState = pRA->RATRState; + } + } + + // + // The following part configure AP/VWifi/IBSS rate adaptive mask. + // + if(ACTING_AS_AP(pAdapter) || ACTING_AS_IBSS(pAdapter)) + { + pTargetAdapter = pAdapter; + } + else + { + pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, FALSE); + if(!ACTING_AS_AP(pTargetAdapter)) + pTargetAdapter = NULL; + } + + // if extension port (softap) is started, updaet RA table for more than one clients associate + if(pTargetAdapter != NULL) + { + int i; + PRT_WLAN_STA pEntry; + PRATE_ADAPTIVE pEntryRA; + + for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++) + { + if( pTargetAdapter->MgntInfo.AsocEntry[i].bUsed && pTargetAdapter->MgntInfo.AsocEntry[i].bAssociated) + { + pEntry = pTargetAdapter->MgntInfo.AsocEntry+i; + pEntryRA = &pEntry->RateAdaptive; + + switch (pEntryRA->PreRATRState) + { + case DM_RATR_STA_HIGH: + { + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + } + break; + + case DM_RATR_STA_MIDDLE: + { + HighRSSIThreshForRA = 55; + LowRSSIThreshForRA = 20; + } + break; + + case DM_RATR_STA_LOW: + { + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 25; + } + break; + + default: + { + HighRSSIThreshForRA = 50; + LowRSSIThreshForRA = 20; + } + } + + if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)HighRSSIThreshForRA) + pEntryRA->RATRState = DM_RATR_STA_HIGH; + else if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > (s4Byte)LowRSSIThreshForRA) + pEntryRA->RATRState = DM_RATR_STA_MIDDLE; + else + pEntryRA->RATRState = DM_RATR_STA_LOW; + + if(pEntryRA->PreRATRState != pEntryRA->RATRState) + { + RT_PRINT_ADDR(COMP_RATR, DBG_LOUD, ("AsocEntry addr : "), pEntry->MacAddr); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI = %d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("RSSI_LEVEL = %d\n", pEntryRA->RATRState)); + RT_TRACE(COMP_RATR, DBG_LOUD, ("PreState = %d, CurState = %d\n", pEntryRA->PreRATRState, pEntryRA->RATRState)); + pAdapter->HalFunc.UpdateHalRAMaskHandler( + pTargetAdapter, + FALSE, + pEntry->AID+1, + pEntry->MacAddr, + pEntry, + pEntryRA->RATRState); + pEntryRA->PreRATRState = pEntryRA->RATRState; + } + + } + } + } +#endif +} + +static VOID +dm_CheckProtection( + IN PADAPTER Adapter + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u1Byte CurRate, RateThreshold; + + if(pMgntInfo->pHTInfo->bCurBW40MHz) + RateThreshold = MGN_MCS1; + else + RateThreshold = MGN_MCS3; + + if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) + { + pMgntInfo->bDmDisableProtect = TRUE; + DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } + else + { + pMgntInfo->bDmDisableProtect = FALSE; + DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); + } +#endif +} + +static VOID +dm_CheckStatistics( + IN PADAPTER Adapter + ) +{ +#if 0 + if(!Adapter->MgntInfo.bMediaConnect) + return; + + //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly. + Adapter->HalFunc.GetHwRegHandler( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) ); + + // Calculate current Tx Rate(Successful transmited!!) + + // Calculate current Rx Rate(Successful received!!) + + //for tx tx retry count + Adapter->HalFunc.GetHwRegHandler( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) ); +#endif +} + +static void dm_CheckPbcGPIO(_adapter *padapter) +{ + u8 tmp1byte; + u8 bPbcPressed = _FALSE; + + if(!padapter->registrypriv.hw_wps_pbc) + return; + +#ifdef CONFIG_USB_HCI + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode + + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level + + tmp1byte = rtw_read8(padapter, GPIO_IO_SEL); + tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT); + rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode + + tmp1byte =rtw_read8(padapter, GPIO_IN); + + if (tmp1byte == 0xff) + return ; + + if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT) + { + bPbcPressed = _TRUE; + } +#else + tmp1byte = rtw_read8(padapter, GPIO_IN); + //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte)); + + if (tmp1byte == 0xff || padapter->init_adpt_in_progress) + return ; + + if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0) + { + bPbcPressed = _TRUE; + } +#endif + + if( _TRUE == bPbcPressed) + { + // Here we only set bPbcPressed to true + // After trigger PBC, the variable will be set to false + DBG_8192C("CheckPbcGPIO - PBC is pressed\n"); + +#ifdef RTK_DMP_PLATFORM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC); +#else + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC); +#endif +#else + + if ( padapter->pid[0] == 0 ) + { // 0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver. + return; + } + +#ifdef PLATFORM_LINUX + rtw_signal_process(padapter->pid[0], SIGUSR1); +#endif +#endif + } +} + +#ifdef CONFIG_PCI_HCI +// +// Description: +// Perform interrupt migration dynamically to reduce CPU utilization. +// +// Assumption: +// 1. Do not enable migration under WIFI test. +// +// Created by Roger, 2010.03.05. +// +VOID +dm_InterruptMigration( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + BOOLEAN bCurrentIntMt, bCurrentACIntDisable; + BOOLEAN IntMtToSet = _FALSE; + BOOLEAN ACIntToSet = _FALSE; + + + // Retrieve current interrupt migration and Tx four ACs IMR settings first. + bCurrentIntMt = pHalData->bInterruptMigration; + bCurrentACIntDisable = pHalData->bDisableTxInt; + + // + // Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics + // when interrupt migration is set before. 2010.03.05. + // + if(!Adapter->registrypriv.wifi_spec && + (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && + pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) + { + IntMtToSet = _TRUE; + + // To check whether we should disable Tx interrupt or not. + if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic ) + ACIntToSet = _TRUE; + } + + //Update current settings. + if( bCurrentIntMt != IntMtToSet ){ + DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet); + if(IntMtToSet) + { + // + // Set interrrupt migration timer and corresponging Tx/Rx counter. + // timer 25ns*0xfa0=100us for 0xf packets. + // 2010.03.05. + // + rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx + pHalData->bInterruptMigration = IntMtToSet; + } + else + { + // Reset all interrupt migration settings. + rtw_write32(Adapter, REG_INT_MIG, 0); + pHalData->bInterruptMigration = IntMtToSet; + } + } + + /*if( bCurrentACIntDisable != ACIntToSet ){ + DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet); + if(ACIntToSet) // Disable four ACs interrupts. + { + // + // Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. + // When extremely highly Rx OK occurs, we will disable Tx interrupts. + // 2010.03.05. + // + UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS ); + pHalData->bDisableTxInt = ACIntToSet; + } + else// Enable four ACs interrupts. + { + UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 ); + pHalData->bDisableTxInt = ACIntToSet; + } + }*/ + +} + +#endif + +// +// Initialize GPIO setting registers +// +static void +dm_InitGPIOSetting( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + + u8 tmp1byte; + + tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); + tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); + +#ifdef CONFIG_BT_COEXIST + // UMB-B cut bug. We need to support the modification. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && + pHalData->bt_coexist.BT_Coexist) + { + tmp1byte |= (BIT5); + } +#endif + rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); + +} + +static void update_EDCA_param(_adapter *padapter) +{ + u32 trafficIndex; + u32 edca_param; + u64 cur_tx_bytes = 0; + u64 cur_rx_bytes = 0; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct recv_priv *precvpriv = &(padapter->recvpriv); + struct registry_priv *pregpriv = &padapter->registrypriv; + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + u8 bbtchange = _FALSE; +#endif + + + //DBG_871X("%s\n", __FUNCTION__); + + //associated AP + if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)) + { + return; + } + + if (pmlmeinfo->assoc_AP_vendor >= maxAP) + { + return; + } + + cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes; + cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes; + + //traffic, TX or RX + if((pmlmeinfo->assoc_AP_vendor == ralinkAP)||(pmlmeinfo->assoc_AP_vendor == atherosAP)) + { + if (cur_tx_bytes > (cur_rx_bytes << 2)) + { // Uplink TP is present. + trafficIndex = UP_LINK; + } + else + { // Balance TP is present. + trafficIndex = DOWN_LINK; + } + } + else + { + if (cur_rx_bytes > (cur_tx_bytes << 2)) + { // Downlink TP is present. + trafficIndex = DOWN_LINK; + } + else + { // Balance TP is present. + trafficIndex = UP_LINK; + } + } + +#ifdef CONFIG_BT_COEXIST + if(pbtpriv->BT_Coexist) + { + if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0)) + { + bbtchange = _TRUE; + } + } +#endif + + if (pdmpriv->prv_traffic_idx != trafficIndex) + { +#if 0 +#ifdef CONFIG_BT_COEXIST + if(_TRUE == bbtchange) + rtw_write32(padapter, REG_EDCA_BE_PARAM, pbtpriv->BT_EDCA[trafficIndex]); + else +#endif + //adjust EDCA parameter for BE queue + //fire_write_MAC_cmd(padapter, EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]); + rtw_write32(padapter, REG_EDCA_BE_PARAM, EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]); + +#else + if((pmlmeinfo->assoc_AP_vendor == ciscoAP) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N)) + { + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; + } + else if((pmlmeinfo->assoc_AP_vendor == airgocapAP) && + ((pmlmeext->cur_wireless_mode == WIRELESS_11G) ||(pmlmeext->cur_wireless_mode == WIRELESS_11BG))) + { + edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex]; + } + else + { + edca_param = EDCAParam[unknownAP][trafficIndex]; + } + +#ifdef CONFIG_BT_COEXIST + if(_TRUE == bbtchange) + edca_param = pbtpriv->BT_EDCA[trafficIndex]; +#endif + + rtw_write32(padapter, REG_EDCA_BE_PARAM, edca_param); +#endif + pdmpriv->prv_traffic_idx = trafficIndex; + } + +//exit_update_EDCA_param: + + pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes; + precvpriv->last_rx_bytes = precvpriv->rx_bytes; + + return; +} + +static void dm_InitDynamicBBPowerSaving( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + pPSTable->PreCCAState = CCA_MAX; + pPSTable->CurCCAState = CCA_MAX; + pPSTable->PreRFState = RF_MAX; + pPSTable->CurRFState = RF_MAX; + pPSTable->Rssi_val_min = 0; +} + +static void dm_1R_CCA( + IN PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + if(pPSTable->Rssi_val_min != 0) + { + if(pPSTable->PreCCAState == CCA_2R) + { + if(pPSTable->Rssi_val_min >= 35) + pPSTable->CurCCAState = CCA_1R; + else + pPSTable->CurCCAState = CCA_2R; + } + else{ + if(pPSTable->Rssi_val_min <= 30) + pPSTable->CurCCAState = CCA_2R; + else + pPSTable->CurCCAState = CCA_1R; + } + } + else + pPSTable->CurCCAState=CCA_MAX; + + if(pPSTable->PreCCAState != pPSTable->CurCCAState) + { + if(pPSTable->CurCCAState == CCA_1R) + { + if(pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x13); + PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20); + } + else + { + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable , bMaskByte0, 0x23); + PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100 + } + } + else + { + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskByte0, 0x33); + PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63); + } + pPSTable->PreCCAState = pPSTable->CurCCAState; + } + //DBG_8192C("dm_1R_CCA(): CCAStage=%x\n", pPSTable->CurCCAState); +} + +void +rtl8192c_dm_RF_Saving( + IN PADAPTER pAdapter, + IN u8 bForceInNormal + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + if(pdmpriv->initialize == 0){ + pdmpriv->rf_saving_Reg874 = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord)&0x1CC000)>>14; + pdmpriv->rf_saving_RegC70 = (PHY_QueryBBReg(pAdapter, rOFDM0_AGCParameter1, bMaskDWord)&BIT3)>>3; + pdmpriv->rf_saving_Reg85C = (PHY_QueryBBReg(pAdapter, rFPGA0_XCD_SwitchControl, bMaskDWord)&0xFF000000)>>24; + pdmpriv->rf_saving_RegA74 = (PHY_QueryBBReg(pAdapter, 0xa74, bMaskDWord)&0xF000)>>12; + //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord); + pdmpriv->initialize = 1; + } + + if(!bForceInNormal) + { + if(pPSTable->Rssi_val_min != 0) + { + + if(pPSTable->PreRFState == RF_Normal) + { + #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + if(pPSTable->Rssi_val_min >= 50) + #else + if(pPSTable->Rssi_val_min >= 30) + #endif + pPSTable->CurRFState = RF_Save; + else + pPSTable->CurRFState = RF_Normal; + } + else{ + #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + if(pPSTable->Rssi_val_min <= 45) + #else + if(pPSTable->Rssi_val_min <= 25) + #endif + pPSTable->CurRFState = RF_Normal; + else + pPSTable->CurRFState = RF_Save; + } + } + else + pPSTable->CurRFState=RF_MAX; + } + else + { + pPSTable->CurRFState = RF_Normal; + } + + if(pPSTable->PreRFState != pPSTable->CurRFState) + { + if(pPSTable->CurRFState == RF_Save) + { + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1C0000, 0x2); //Reg874[20:18]=3'b010 + PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, 0); //RegC70[3]=1'b0 + PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, 0x63); //Reg85C[31:24]=0x63 + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, 0xC000, 0x2); //Reg874[15:14]=2'b10 + PHY_SetBBReg(pAdapter, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3 + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0); //Reg818[28]=1'b0 + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x1); //Reg818[28]=1'b1 + DBG_8192C("%s(): RF_Save\n", __FUNCTION__); + } + else + { + PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW , 0x1CC000, pdmpriv->rf_saving_Reg874); + PHY_SetBBReg(pAdapter, rOFDM0_AGCParameter1, BIT3, pdmpriv->rf_saving_RegC70); + PHY_SetBBReg(pAdapter, rFPGA0_XCD_SwitchControl, 0xFF000000, pdmpriv->rf_saving_Reg85C); + PHY_SetBBReg(pAdapter, 0xa74, 0xF000, pdmpriv->rf_saving_RegA74); + PHY_SetBBReg(pAdapter, 0x818, BIT28, 0x0); + DBG_8192C("%s(): RF_Normal\n", __FUNCTION__); + } + pPSTable->PreRFState = pPSTable->CurRFState; + } +} + +static void +dm_DynamicBBPowerSaving( +IN PADAPTER pAdapter + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + PS_T *pPSTable = &pdmpriv->DM_PSTable; + + //1 1.Determine the minimum RSSI + if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) && + (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)) + { + pPSTable->Rssi_val_min = 0; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n")); + } + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port + { + //if(ACTING_AS_AP(pAdapter) || pMgntInfo->mIbss) + if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) || + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)) //todo: AP Mode + { + pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); + } + else + { + pPSTable->Rssi_val_min = pdmpriv->UndecoratedSmoothedPWDB; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); + } + } + else // associated entry pwdb + { + pPSTable->Rssi_val_min = pdmpriv->EntryMinUndecoratedSmoothedPWDB; + //RT_TRACE(COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port PWDB = 0x%lx \n", pPSTable->Rssi_val_min)); + } + + //1 2.Power Saving for 92C + if(IS_92C_SERIAL(pHalData->VersionID)) + { + //dm_1R_CCA(pAdapter); + } + + // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable. + // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns to 600ns. + //1 3.Power Saving for 88C + else + { + rtl8192c_dm_RF_Saving(pAdapter, _FALSE); + } +} + + +#ifdef CONFIG_ANTENNA_DIVERSITY +// Add new function to reset the state of antenna diversity before link. +// +void SwAntDivResetBeforeLink8192C(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + pDM_SWAT_Table->SWAS_NoLink_State = 0; +} + +// Compare RSSI for deciding antenna +void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if((0 != pHalData->AntDivCfg) && (!IS_92C_SERIAL(pHalData->VersionID)) ) + { + //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi), + // src->Rssi,query_rx_pwr_percentage(src->Rssi)); + //select optimum_antenna for before linked =>For antenna diversity + if(dst->Rssi >= src->Rssi )//keep org parameter + { + src->Rssi = dst->Rssi; + src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; + } + } +} + +// Add new function to reset the state of antenna diversity before link. +u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + // Condition that does not need to use antenna diversity. + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) + { + //DBG_8192C("SwAntDivBeforeLink8192C(): No AntDiv Mechanism.\n"); + return _FALSE; + } + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + pDM_SWAT_Table->SWAS_NoLink_State = 0; + return _FALSE; + } + // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF. +/* + if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect) + { + + + RT_TRACE(COMP_SWAS, DBG_LOUD, + ("SwAntDivCheckBeforeLink8192C(): RFChangeInProgress(%x), eRFPowerState(%x)\n", + pMgntInfo->RFChangeInProgress, + pHalData->eRFPowerState)); + + pDM_SWAT_Table->SWAS_NoLink_State = 0; + + return FALSE; + } +*/ + + if(pDM_SWAT_Table->SWAS_NoLink_State == 0){ + //switch channel + pDM_SWAT_Table->SWAS_NoLink_State = 1; + pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A; + + //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna); + rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE); + //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"); + return _TRUE; + } + else + { + pDM_SWAT_Table->SWAS_NoLink_State = 0; + return _FALSE; + } + + + +} +#endif +#ifdef CONFIG_SW_ANTENNA_DIVERSITY +// +// 20100514 Luke/Joseph: +// Add new function to reset antenna diversity state after link. +// +void +SwAntDivRestAfterLink8192C( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) + return; + + //DBG_8192C("======> SwAntDivRestAfterLink <========== \n"); + pHalData->RSSI_cnt_A= 0; + pHalData->RSSI_cnt_B= 0; + pHalData->RSSI_test = _FALSE; + + pDM_SWAT_Table->try_flag = 0xff; + pDM_SWAT_Table->RSSI_Trying = 0; + pDM_SWAT_Table->SelectAntennaMap=0xAA; + pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna; + pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna; + + pdmpriv->lastTxOkCnt=0; + pdmpriv->lastRxOkCnt=0; + + pdmpriv->TXByteCnt_A=0; + pdmpriv->TXByteCnt_B=0; + pdmpriv->RXByteCnt_A=0; + pdmpriv->RXByteCnt_B=0; + pdmpriv->DoubleComfirm=0; + pdmpriv->TrafficLoad = TRAFFIC_LOW; + +} + + +// +// 20100514 Luke/Joseph: +// Add new function for antenna diversity after link. +// This is the main function of antenna diversity after link. +// This function is called in HalDmWatchDog() and dm_SW_AntennaSwitchCallback(). +// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test. +// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing. +// After 500ms, dm_SW_AntennaSwitchCallback() calls this function to compare the signal just +// listened on the air with the RSSI of original antenna. +// It chooses the antenna with better RSSI. +// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting +// penalty to get next try. +// +static VOID +dm_SW_AntennaSwitch( + PADAPTER Adapter, + u8 Step +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + s32 curRSSI=100, RSSI_A, RSSI_B; + u64 curTxOkCnt, curRxOkCnt; + u64 CurByteCnt = 0, PreByteCnt = 0; + u8 nextAntenna = 0; + u8 Score_A=0, Score_B=0; + u8 i; + + // Condition that does not need to use antenna diversity. + if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0)) + { + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No AntDiv Mechanism.\n")); + return; + } + // If dynamic ant_div is disabled. + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_ANT_DIV) ) + { + return; + } + + if (check_fwstate(&Adapter->mlmepriv, _FW_LINKED) ==_FALSE) + return; +#if 0 //to do + // Radio off: Status reset to default and return. + if(pHalData->eRFPowerState==eRfOff) + { + SwAntDivRestAfterLink(Adapter); + return; + } +#endif + //DBG_8192C("\n............................ %s.........................\n",__FUNCTION__); + // Handling step mismatch condition. + // Peak step is not finished at last time. Recover the variable and check again. + if( Step != pDM_SWAT_Table->try_flag ) + { + SwAntDivRestAfterLink8192C(Adapter); + } + + + if(pDM_SWAT_Table->try_flag == 0xff) + { +#if 0 + // Select RSSI checking target + if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter)) + { + // Target: Infrastructure mode AP. + pHalData->RSSI_target = NULL; + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is DEF AP!\n")); + } + else + { + u8 index = 0; + PRT_WLAN_STA pEntry = NULL; + PADAPTER pTargetAdapter = NULL; + + if( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) ) + { + // Target: AP/IBSS peer. + pTargetAdapter = Adapter; + } + else if(ACTING_AS_AP(ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE))) + { + // Target: VWIFI peer. + pTargetAdapter = ADJUST_TO_ADAPTIVE_ADAPTER(Adapter, FALSE); + } + + if(pTargetAdapter != NULL) + { + for(index=0; indexbAssociated) + break; + } + } + } + + if(pEntry == NULL) + { + SwAntDivRestAfterLink(Adapter); + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): No Link.\n")); + return; + } + else + { + pHalData->RSSI_target = pEntry; + RT_TRACE(COMP_SWAS, DBG_LOUD, ("dm_SW_AntennaSwitch(): RSSI_target is PEER STA\n")); + } + } + + +#endif + + pHalData->RSSI_cnt_A= 0; + pHalData->RSSI_cnt_B= 0; + pDM_SWAT_Table->try_flag = 0; + // DBG_8192C("dm_SW_AntennaSwitch(): Set try_flag to 0 prepare for peak!\n"); + return; + } + else + { + curTxOkCnt = Adapter->xmitpriv.tx_bytes - pdmpriv->lastTxOkCnt; + curRxOkCnt = Adapter->recvpriv.rx_bytes - pdmpriv->lastRxOkCnt; + + pdmpriv->lastTxOkCnt = Adapter->xmitpriv.tx_bytes ; + pdmpriv->lastRxOkCnt = Adapter->recvpriv.rx_bytes ; + + if(pDM_SWAT_Table->try_flag == 1) + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + { + pdmpriv->TXByteCnt_A += curTxOkCnt; + pdmpriv->RXByteCnt_A += curRxOkCnt; + //DBG_8192C("##### TXByteCnt_A(%lld) , RXByteCnt_A(%lld) ####\n",pdmpriv->TXByteCnt_A,pdmpriv->RXByteCnt_A); + } + else + { + pdmpriv->TXByteCnt_B += curTxOkCnt; + pdmpriv->RXByteCnt_B += curRxOkCnt; + //DBG_8192C("##### TXByteCnt_B(%lld) , RXByteCnt_B(%lld) ####\n",pdmpriv->TXByteCnt_B,pdmpriv->RXByteCnt_B); + } + + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; + pDM_SWAT_Table->RSSI_Trying--; + //DBG_8192C("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying); + + if(pDM_SWAT_Table->RSSI_Trying == 0) + { + CurByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A) : (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B); + PreByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pdmpriv->TXByteCnt_B+pdmpriv->RXByteCnt_B) : (pdmpriv->TXByteCnt_A+pdmpriv->RXByteCnt_A); + + //DBG_8192C("CurByteCnt = %lld\n", CurByteCnt); + //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt); + + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + { + PreByteCnt = PreByteCnt*9; //normalize:Cur=90ms:Pre=10ms + } + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + { + //CurByteCnt = CurByteCnt/2; + CurByteCnt = CurByteCnt>>1;//normalize:100ms:50ms + } + + + //DBG_8192C("After DIV=>CurByteCnt = %lld\n", CurByteCnt); + //DBG_8192C("PreByteCnt = %lld\n",PreByteCnt); + + if(pHalData->RSSI_cnt_A > 0) + RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; + else + RSSI_A = 0; + if(pHalData->RSSI_cnt_B > 0) + RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; + else + RSSI_B = 0; + + curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B; + pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_B : RSSI_A; + //DBG_8192C("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI); + //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n", + //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")); + //DBG_8192C("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n", + //RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B); + } + + } + else + { + + if(pHalData->RSSI_cnt_A > 0) + RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; + else + RSSI_A = 0; + if(pHalData->RSSI_cnt_B > 0) + RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; + else + RSSI_B = 0; + curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B; + pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == Antenna_A)? RSSI_A : RSSI_B; + //DBG_8192C("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI); + //DBG_8192C("SWAS: preAntenna= %s, curAntenna= %s \n", + //(pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")); + + //DBG_8192C("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n", + // RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B); + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt)); + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt)); + } + + //1 Trying State + if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0)) + { + + if(pDM_SWAT_Table->TestMode == TP_MODE) + { + //DBG_8192C("SWAS: TestMode = TP_MODE\n"); + //DBG_8192C("TRY:CurByteCnt = %lld\n", CurByteCnt); + //DBG_8192C("TRY:PreByteCnt = %lld\n",PreByteCnt); + if(CurByteCnt < PreByteCnt) + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1; + else + pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1; + } + else + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1; + else + pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1; + } + for (i= 0; i<8; i++) + { + if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1) + Score_A++; + else + Score_B++; + } + //DBG_8192C("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap); + //DBG_8192C("Score_A=%d, Score_B=%d\n", Score_A, Score_B); + + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + { + nextAntenna = (Score_A > Score_B)?Antenna_A:Antenna_B; + } + else + { + nextAntenna = (Score_B > Score_A)?Antenna_B:Antenna_A; + } + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B")); + //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n", + //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B"))); + + if(nextAntenna != pDM_SWAT_Table->CurAntenna) + { + //DBG_8192C("SWAS: Switch back to another antenna\n"); + } + else + { + //DBG_8192C("SWAS: current anntena is good\n"); + } + } + + if(pDM_SWAT_Table->TestMode == RSSI_MODE) + { + //DBG_8192C("SWAS: TestMode = RSSI_MODE\n"); + pDM_SWAT_Table->SelectAntennaMap=0xAA; + if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna + { + //DBG_8192C("SWAS: Switch back to another antenna\n"); + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; + } + else // current anntena is good + { + nextAntenna = pDM_SWAT_Table->CurAntenna; + //DBG_8192C("SWAS: current anntena is good\n"); + } + } + pDM_SWAT_Table->try_flag = 0; + pHalData->RSSI_test = _FALSE; + pHalData->RSSI_sum_A = 0; + pHalData->RSSI_cnt_A = 0; + pHalData->RSSI_sum_B = 0; + pHalData->RSSI_cnt_B = 0; + pdmpriv->TXByteCnt_A = 0; + pdmpriv->TXByteCnt_B = 0; + pdmpriv->RXByteCnt_A = 0; + pdmpriv->RXByteCnt_B = 0; + + } + + //1 Normal State + else if(pDM_SWAT_Table->try_flag == 0) + { + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + { + if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000) + pdmpriv->TrafficLoad = TRAFFIC_HIGH; + else + pdmpriv->TrafficLoad = TRAFFIC_LOW; + } + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + { + if(((curTxOkCnt+curRxOkCnt)>>1) > 1875000) + pdmpriv->TrafficLoad = TRAFFIC_HIGH; + else + pdmpriv->TrafficLoad = TRAFFIC_LOW; + } + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + pDM_SWAT_Table->bTriggerAntennaSwitch = 0; + //DBG_8192C("Normal:TrafficLoad = %lld\n", curTxOkCnt+curRxOkCnt); + + //Prepare To Try Antenna + nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A; + pDM_SWAT_Table->try_flag = 1; + pHalData->RSSI_test = _TRUE; + if((curRxOkCnt+curTxOkCnt) > 1000) + { + pDM_SWAT_Table->RSSI_Trying = 4; + pDM_SWAT_Table->TestMode = TP_MODE; + } + else + { + pDM_SWAT_Table->RSSI_Trying = 2; + pDM_SWAT_Table->TestMode = RSSI_MODE; + + } + //DBG_8192C("SWAS: Normal State -> Begin Trying! TestMode=%s\n",(pDM_SWAT_Table->TestMode == TP_MODE)?"TP":"RSSI"); + + + pHalData->RSSI_sum_A = 0; + pHalData->RSSI_cnt_A = 0; + pHalData->RSSI_sum_B = 0; + pHalData->RSSI_cnt_B = 0; + } + } + + //1 4.Change TRX antenna + if(nextAntenna != pDM_SWAT_Table->CurAntenna) + { + //DBG_8192C("@@@@@@@@ SWAS: Change TX Antenna!\n "); + rtw_antenna_select_cmd(Adapter, nextAntenna, 1); + } + + //1 5.Reset Statistics + pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna; + pDM_SWAT_Table->CurAntenna = nextAntenna; + pDM_SWAT_Table->PreRSSI = curRSSI; + + + //1 6.Set next timer + + if(pDM_SWAT_Table->RSSI_Trying == 0) + return; + + if(pDM_SWAT_Table->RSSI_Trying%2 == 0) + { + if(pDM_SWAT_Table->TestMode == TP_MODE) + { + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer,10 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"); + } + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer, 50 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"); + } + } + else + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer, 500 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"); + } + } + else + { + if(pDM_SWAT_Table->TestMode == TP_MODE) + { + if(pdmpriv->TrafficLoad == TRAFFIC_HIGH) + _set_timer(&pdmpriv->SwAntennaSwitchTimer,90 ); //ms + else if(pdmpriv->TrafficLoad == TRAFFIC_LOW) + _set_timer(&pdmpriv->SwAntennaSwitchTimer,100 ); //ms + } + else + { + _set_timer(&pdmpriv->SwAntennaSwitchTimer,500 ); //ms + //DBG_8192C("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"); + } + } + +// RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: -----The End-----\n ")); + +} + +// +// 20100514 Luke/Joseph: +// Callback function for 500ms antenna test trying. +// +static void dm_SW_AntennaSwitchCallback(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + + if(padapter->net_closed == _TRUE) + return; + // Only + dm_SW_AntennaSwitch(padapter, SWAW_STEP_DETERMINE); +} + + +// +// 20100722 +// This function is used to gather the RSSI information for antenna testing. +// It selects the RSSI of the peer STA that we want to know. +// +void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) + return; + + if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + { + if(pDM_SWAT_Table->CurAntenna == Antenna_A) + { + pHalData->RSSI_sum_A += RxPWDBAll; + pHalData->RSSI_cnt_A++; + } + else + { + pHalData->RSSI_sum_B+= RxPWDBAll; + pHalData->RSSI_cnt_B++; + + } + //DBG_8192C("%s Ant_(%s),RSSI_sum(%d),RSSI_cnt(%d)\n",__FUNCTION__,(2==pHalData->CurAntenna)?"A":"B",pHalData->RSSI_sum,pHalData->RSSI_cnt); + } + +} + + + +static VOID +dm_SW_AntennaSwitchInit( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + SWAT_T *pDM_SWAT_Table = &pdmpriv->DM_SWAT_Table; + + pHalData->RSSI_sum_A = 0; + pHalData->RSSI_sum_B = 0; + pHalData->RSSI_cnt_A = 0; + pHalData->RSSI_cnt_B = 0; + + pDM_SWAT_Table->CurAntenna = pHalData->CurAntenna; + pDM_SWAT_Table->PreAntenna = pHalData->CurAntenna; + pDM_SWAT_Table->try_flag = 0xff; + pDM_SWAT_Table->PreRSSI = 0; + pDM_SWAT_Table->bTriggerAntennaSwitch = 0; + pDM_SWAT_Table->SelectAntennaMap=0xAA; + + // Move the timer initialization to InitializeVariables function. + //PlatformInitializeTimer(Adapter, &pMgntInfo->SwAntennaSwitchTimer, (RT_TIMER_CALL_BACK)dm_SW_AntennaSwitchCallback, NULL, "SwAntennaSwitchTimer"); +} + +#endif + +//#define RSSI_CCK 0 +//#define RSSI_OFDM 1 +static void dm_RSSIMonitorInit( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + pdmpriv->OFDM_Pkt_Cnt = 0; + pdmpriv->RSSI_Select = RSSI_CCK; +} + +static void dm_RSSIMonitorCheck( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + if(pdmpriv->OFDM_Pkt_Cnt == 0) + pdmpriv->RSSI_Select = RSSI_CCK; + else + pdmpriv->RSSI_Select = RSSI_OFDM; + + pdmpriv->OFDM_Pkt_Cnt = 0; + //DBG_8192C("RSSI_Select=%s OFDM_Pkt_Cnt(%d)\n", + //(pdmpriv->RSSI_Select == RSSI_OFDM)?"RSSI_OFDM":"RSSI_CCK", + //pdmpriv->OFDM_Pkt_Cnt); +} + +//============================================================ +// functions +//============================================================ +void rtl8192c_init_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv)); + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , dm_SW_AntennaSwitchCallback, Adapter); +#endif +} + +void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer); +#endif +} +#ifdef CONFIG_HW_ANTENNA_DIVERSITY +void dm_InitHybridAntDiv(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) + return; + + //Set OFDM HW RX Antenna Diversity + PHY_SetBBReg(Adapter,0xc50, BIT7, 1); //Enable Hardware antenna switch + PHY_SetBBReg(Adapter,0x870, BIT9|BIT8, 0); //Enable hardware control of "ANT_SEL" & "ANT_SELB" + PHY_SetBBReg(Adapter,0xCA4, BIT11, 0); //Switch to another antenna by checking pwdb threshold + PHY_SetBBReg(Adapter,0xCA4, 0x7FF, 0x080); //Pwdb threshold=8dB + PHY_SetBBReg(Adapter,0xC54, BIT23, 1); //Decide final antenna by comparing 2 antennas' pwdb + PHY_SetBBReg(Adapter,0x874, BIT23, 0); //No update ANTSEL during GNT_BT=1 + PHY_SetBBReg(Adapter,0x80C, BIT21, 1); //TX atenna selection from tx_info + //Set CCK HW RX Antenna Diversity + PHY_SetBBReg(Adapter,0xA00, BIT15, 1);//Enable antenna diversity + PHY_SetBBReg(Adapter,0xA0C, BIT4, 0); //Antenna diversity decision period = 32 sample + PHY_SetBBReg(Adapter,0xA0C, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4 + PHY_SetBBReg(Adapter,0xA10, BIT13, 1); //polarity ana_A=1 and ana_B=0 + PHY_SetBBReg(Adapter,0xA14, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16) + + pHalData->CCK_Ant1_Cnt = 0; + pHalData->CCK_Ant2_Cnt = 0; + pHalData->OFDM_Ant1_Cnt = 0; + pHalData->OFDM_Ant2_Cnt = 0; +} + + +#define RxDefaultAnt1 0x65a9 +#define RxDefaultAnt2 0x569a + +void dm_SelectRXDefault(IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(IS_92C_SERIAL(pHalData->VersionID) ||pHalData->AntDivCfg==0) + return; + + //DbgPrint(" Ant1_Cnt=%d, Ant2_Cnt=%d\n", pHalData->Ant1_Cnt, pHalData->Ant2_Cnt); + //DBG_8192C(" CCK_Ant1_Cnt = %d, CCK_Ant2_Cnt = %d\n", pHalData->CCK_Ant1_Cnt, pHalData->CCK_Ant2_Cnt); + //DBG_8192C(" OFDM_Ant1_Cnt = %d, OFDM_Ant2_Cnt = %d\n", pHalData->OFDM_Ant1_Cnt, pHalData->OFDM_Ant2_Cnt); + if((pHalData->OFDM_Ant1_Cnt == 0) && (pHalData->OFDM_Ant2_Cnt == 0)) + { + if((pHalData->CCK_Ant1_Cnt + pHalData->CCK_Ant2_Cnt) >=10 ) + { + if(pHalData->CCK_Ant1_Cnt > (5*pHalData->CCK_Ant2_Cnt)) + { + DBG_8192C(" RX Default = Ant1\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); + } + else if(pHalData->CCK_Ant2_Cnt > (5*pHalData->CCK_Ant1_Cnt)) + { + DBG_8192C(" RX Default = Ant2\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); + } + else if(pHalData->CCK_Ant1_Cnt > pHalData->CCK_Ant2_Cnt) + { + DBG_8192C(" RX Default = Ant2\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); + } + else + { + DBG_8192C(" RX Default = Ant1\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); + } + pHalData->CCK_Ant1_Cnt = 0; + pHalData->CCK_Ant2_Cnt = 0; + pHalData->OFDM_Ant1_Cnt = 0; + pHalData->OFDM_Ant2_Cnt = 0; + } + } + else + { + if(pHalData->OFDM_Ant1_Cnt > pHalData->OFDM_Ant2_Cnt) + { + DBG_8192C(" RX Default = Ant1\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt1); + } + else + { + DBG_8192C(" RX Default = Ant2\n"); + PHY_SetBBReg(Adapter, 0x858, 0xFFFF, RxDefaultAnt2); + } + pHalData->CCK_Ant1_Cnt = 0; + pHalData->CCK_Ant2_Cnt = 0; + pHalData->OFDM_Ant1_Cnt = 0; + pHalData->OFDM_Ant2_Cnt = 0; + } + + +} + +#endif + +void +rtl8192c_InitHalDm( + IN PADAPTER Adapter + ) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i; + +#ifdef CONFIG_USB_HCI + dm_InitGPIOSetting(Adapter); +#endif + + pdmpriv->DM_Type = DM_Type_ByDriver; + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; + pdmpriv->UndecoratedSmoothedPWDB = (-1); + + //.1 DIG INIT + pdmpriv->bDMInitialGainEnable = _TRUE; + pdmpriv->DMFlag |= DYNAMIC_FUNC_DIG; + dm_DIGInit(Adapter); + + //.2 DynamicTxPower INIT + pdmpriv->DMFlag |= DYNAMIC_FUNC_HP; + dm_InitDynamicTxPower(Adapter); + + //.3 + DM_InitEdcaTurbo(Adapter); + + //.4 RateAdaptive INIT + dm_InitRateAdaptiveMask(Adapter); + + //.5 Tx Power Tracking Init. + pdmpriv->DMFlag |= DYNAMIC_FUNC_SS; + DM_InitializeTXPowerTracking(Adapter); + +#ifdef CONFIG_BT_COEXIST + pdmpriv->DMFlag |= DYNAMIC_FUNC_BT; + dm_InitBtCoexistDM(Adapter); +#endif + + dm_InitDynamicBBPowerSaving(Adapter); + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV; + dm_SW_AntennaSwitchInit(Adapter); +#endif + +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + pdmpriv->DMFlag |= DYNAMIC_FUNC_ANT_DIV; + dm_InitHybridAntDiv(Adapter); +#endif + + dm_RSSIMonitorInit(Adapter); + + pdmpriv->DMFlag_tmp = pdmpriv->DMFlag; + + // Save REG_INIDATA_RATE_SEL value for TXDESC. + for(i = 0 ; i<32 ; i++) + { + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f; + } +} + +VOID +rtl8192c_HalDmWatchDog( + IN PADAPTER Adapter + ) +{ + BOOLEAN bFwCurrentInPSMode = _FALSE; + BOOLEAN bFwPSAwake = _TRUE; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + +#ifdef CONFIG_LPS + bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode; + Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake)); +#endif + +#ifdef CONFIG_P2P + // Fw is under p2p powersaving mode, driver should stop dynamic mechanism. + // modifed by thomas. 2011.06.11. + if(Adapter->wdinfo.p2p_ps_enable) + bFwPSAwake = _FALSE; +#endif //CONFIG_P2P + + // Stop dynamic mechanism when: + // 1. RF is OFF. (No need to do DM.) + // 2. Fw is under power saving mode for FwLPS. (Prevent from SW/FW I/O racing.) + // 3. IPS workitem is scheduled. (Prevent from IPS sequence to be swapped with DM. + // Sometimes DM execution time is longer than 100ms such that the assertion + // in MgntActSet_RF_State() called by InactivePsWorkItem will be triggered by + // wating to long for RFChangeInProgress.) + // 4. RFChangeInProgress is TRUE. (Prevent from broken by IPS/HW/SW Rf off.) + // Noted by tynli. 2010.06.01. + //if(rfState == eRfOn) + if( (Adapter->hw_init_completed == _TRUE) + && ((!bFwCurrentInPSMode) && bFwPSAwake)) + { + // + // Calculate Tx/Rx statistics. + // + dm_CheckStatistics(Adapter); + + // + // For PWDB monitor and record some value for later use. + // + PWDB_Monitor(Adapter); + + // + // Dynamic Initial Gain mechanism. + // +#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + dm_RSSIMonitorCheck(Adapter); +#endif + dm_FalseAlarmCounterStatistics(Adapter); + dm_DIG(Adapter); + + // + //Dynamic BB Power Saving Mechanism + // + dm_DynamicBBPowerSaving(Adapter); + + // + // Dynamic Tx Power mechanism. + // + dm_DynamicTxPower(Adapter); + + // + // Tx Power Tracking. + // + rtl8192c_dm_CheckTXPowerTracking(Adapter); + + // + // Rate Adaptive by Rx Signal Strength mechanism. + // + dm_RefreshRateAdaptiveMask(Adapter); + +#ifdef CONFIG_BT_COEXIST + //BT-Coexist + dm_BTCoexist(Adapter); +#endif + + // EDCA turbo + //update the EDCA paramter according to the Tx/RX mode + //update_EDCA_param(Adapter); + dm_CheckEdcaTurbo(Adapter); + + // + // Dynamically switch RTS/CTS protection. + // + //dm_CheckProtection(Adapter); + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + // + // Software Antenna diversity + // + dm_SW_AntennaSwitch(Adapter, SWAW_STEP_PEAK); +#endif + +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + dm_SelectRXDefault(Adapter); +#endif + +#ifdef CONFIG_PCI_HCI + // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. + // Tx Migration settings. + //dm_InterruptMigration(Adapter); + + //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) + // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); +#endif + + // Read REG_INIDATA_RATE_SEL value for TXDESC. + if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) + { + pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f; + } + else + { + u8 i; + for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++) + { + pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f; + } + } + } + + // Check GPIO to determine current RF on/off and Pbc status. + // Check Hardware Radio ON/OFF or not + //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw) + //{ + //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n")); + // dm_CheckRfCtrlGPIO(Adapter); + //} + +#ifdef CONFIG_PCI_HCI + if(pHalData->bGpioHwWpsPbc) +#endif + { + dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11 + } + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c new file mode 100755 index 000000000000..4a82e9ce8e3e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_hal_init.c @@ -0,0 +1,3592 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + +#define _RTL8192C_HAL_INIT_C_ +#include +#include +#include +#include +#include + +#include + +#ifdef CONFIG_USB_HCI +#include +#endif + +#ifdef CONFIG_PCI_HCI +#include +#endif + +#ifdef PLATFORM_LINUX +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE +#include + + int isAdaptorInfoFileValid(void) +{ + return 1; +} + +int storeAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path) +{ + int ret =0; + mm_segment_t oldfs; + struct file *fp; + if(eeprom_priv) { + + if( 0 == (ret=openFile(&fp, path, O_CREAT|O_WRONLY, 0666)) ) { + DBG_8192C("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp); + + oldfs = get_fs(); set_fs(get_ds()); + if( EEPROM_MAX_SIZE==(ret=writeFile(fp, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE)) ) { + DBG_8192C("%s writeFile OK\n",__FUNCTION__); + ret = 0; + } else { + DBG_8192C("%s writeFile Fail, ret:%d\n",__FUNCTION__, ret); + } + set_fs(oldfs); + + closeFile(fp); + } else { + DBG_8192C("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret); + } + + } else { + DBG_8192C("%s NULL pointer\n",__FUNCTION__); + ret = -EINVAL; + } + return ret; +} + +int retriveAdaptorInfoFile(struct eeprom_priv * eeprom_priv, char *path) +{ + int ret =-1; + mm_segment_t oldfs; + struct file *fp; + + if(eeprom_priv) { + + if( 0 == (ret=openFile(&fp,path, O_RDONLY, 0)) ){ + DBG_8192C("%s openFile path:%s fp=%p\n",__FUNCTION__, path ,fp); + + oldfs = get_fs(); set_fs(get_ds()); + if( EEPROM_MAX_SIZE==(ret=readFile(fp, eeprom_priv->efuse_eeprom_data, EEPROM_MAX_SIZE)) ) { + DBG_8192C("%s readFile OK\n",__FUNCTION__); + ret = 0; + } else { + DBG_8192C("%s readFile Fai, ret:%dl\n",__FUNCTION__, ret); + } + set_fs(oldfs); + + closeFile(fp); + } else { + DBG_8192C("%s openFile path:%s Fail, ret:%d\n",__FUNCTION__, path, ret); + } + + #if 0 + if(isAdaptorInfoFileValid()) { + return 0; + } else { + return -ENODATA; + } + #endif + } else { + DBG_8192C("%s NULL pointer\n",__FUNCTION__); + ret = -EINVAL; + } + return ret; +} +#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE +#endif //PLATFORM_LINUX + +static BOOLEAN +hal_EfusePgPacketWrite2ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest); +static BOOLEAN +hal_EfusePgPacketWrite1ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest); +static BOOLEAN +hal_EfusePgPacketWriteData( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest); +static BOOLEAN +hal_EfusePgPacketWrite_BT( + IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN BOOLEAN bPseudoTest); + +static VOID +_FWDownloadEnable( + IN PADAPTER Adapter, + IN BOOLEAN enable + ) +{ + u8 tmp; + + if(enable) + { + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + + // 8051 enable + tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|0x04); + + // MCU firmware download enable. + tmp = rtw_read8(Adapter, REG_MCUFWDL); + rtw_write8(Adapter, REG_MCUFWDL, tmp|0x01); + + // 8051 reset + tmp = rtw_read8(Adapter, REG_MCUFWDL+2); + rtw_write8(Adapter, REG_MCUFWDL+2, tmp&0xf7); + } + else + { + // MCU firmware download enable. + tmp = rtw_read8(Adapter, REG_MCUFWDL); + rtw_write8(Adapter, REG_MCUFWDL, tmp&0xfe); + + // Reserved for fw extension. + rtw_write8(Adapter, REG_MCUFWDL+1, 0x00); + } +} + + +#define MAX_REG_BOLCK_SIZE 196 +#define MIN_REG_BOLCK_SIZE 8 + +static int +_BlockWrite( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 size + ) +{ + int ret = _SUCCESS; + +#ifdef CONFIG_PCI_HCI + u32 blockSize = sizeof(u32); // Use 4-byte write to download FW + u8 *bufferPtr = (u8 *)buffer; + u32 *pu4BytePtr = (u32 *)buffer; + u32 i, offset, blockCount, remainSize; + + blockCount = size / blockSize; + remainSize = size % blockSize; + + for(i = 0 ; i < blockCount ; i++){ + offset = i * blockSize; + rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), *(pu4BytePtr + i)); + } + + if(remainSize){ + offset = blockCount * blockSize; + bufferPtr += offset; + + for(i = 0 ; i < remainSize ; i++){ + rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset + i), *(bufferPtr + i)); + } + } +#else + +#ifdef SUPPORTED_BLOCK_IO + u32 blockSize = MAX_REG_BOLCK_SIZE; // Use 196-byte write to download FW + u32 blockSize2 = MIN_REG_BOLCK_SIZE; +#else + u32 blockSize = sizeof(u32); // Use 4-byte write to download FW + u32* pu4BytePtr = (u32*)buffer; + u32 blockSize2 = sizeof(u8); +#endif + u8* bufferPtr = (u8*)buffer; + u32 i, offset = 0, offset2, blockCount, remainSize, remainSize2; + + blockCount = size / blockSize; + remainSize = size % blockSize; + + for(i = 0 ; i < blockCount ; i++){ + offset = i * blockSize; + #ifdef SUPPORTED_BLOCK_IO + ret = rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize, (bufferPtr + offset)); + #else + ret = rtw_write32(Adapter, (FW_8192C_START_ADDRESS + offset), le32_to_cpu(*(pu4BytePtr + i))); + #endif + + if(ret == _FAIL) + goto exit; + } + + if(remainSize){ + offset2 = blockCount * blockSize; + blockCount = remainSize / blockSize2; + remainSize2 = remainSize % blockSize2; + + for(i = 0 ; i < blockCount ; i++){ + offset = offset2 + i * blockSize2; + #ifdef SUPPORTED_BLOCK_IO + ret = rtw_writeN(Adapter, (FW_8192C_START_ADDRESS + offset), blockSize2, (bufferPtr + offset)); + #else + ret = rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset ), *(bufferPtr + offset)); + #endif + + if(ret == _FAIL) + goto exit; + } + + if(remainSize2) + { + offset += blockSize2; + bufferPtr += offset; + + for(i = 0 ; i < remainSize2 ; i++){ + ret = rtw_write8(Adapter, (FW_8192C_START_ADDRESS + offset + i), *(bufferPtr + i)); + + if(ret == _FAIL) + goto exit; + } + } + } +#endif + +exit: + return ret; +} + +static int +_PageWrite( + IN PADAPTER Adapter, + IN u32 page, + IN PVOID buffer, + IN u32 size + ) +{ + u8 value8; + u8 u8Page = (u8) (page & 0x07) ; + + value8 = (rtw_read8(Adapter, REG_MCUFWDL+2)& 0xF8 ) | u8Page ; + rtw_write8(Adapter, REG_MCUFWDL+2,value8); + return _BlockWrite(Adapter,buffer,size); +} + +static VOID +_FillDummy( + u8* pFwBuf, + u32* pFwLen + ) +{ + u32 FwLen = *pFwLen; + u8 remain = (u8)(FwLen%4); + remain = (remain==0)?0:(4-remain); + + while(remain>0) + { + pFwBuf[FwLen] = 0; + FwLen++; + remain--; + } + + *pFwLen = FwLen; +} + +static int +_WriteFW( + IN PADAPTER Adapter, + IN PVOID buffer, + IN u32 size + ) +{ + // Since we need dynamic decide method of dwonload fw, so we call this function to get chip version. + // We can remove _ReadChipVersion from ReadAdapterInfo8192C later. + + int ret = _SUCCESS; + BOOLEAN isNormalChip; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); + + if(isNormalChip){ + u32 pageNums,remainSize ; + u32 page,offset; + u8* bufferPtr = (u8*)buffer; + +#ifdef CONFIG_PCI_HCI + // 20100120 Joseph: Add for 88CE normal chip. + // Fill in zero to make firmware image to dword alignment. + _FillDummy(bufferPtr, &size); +#endif + + pageNums = size / MAX_PAGE_SIZE ; + //RT_ASSERT((pageNums <= 4), ("Page numbers should not greater then 4 \n")); + remainSize = size % MAX_PAGE_SIZE; + + for(page = 0; page < pageNums; page++){ + offset = page *MAX_PAGE_SIZE; + ret = _PageWrite(Adapter,page, (bufferPtr+offset),MAX_PAGE_SIZE); + + if(ret == _FAIL) + goto exit; + } + if(remainSize){ + offset = pageNums *MAX_PAGE_SIZE; + page = pageNums; + ret = _PageWrite(Adapter,page, (bufferPtr+offset),remainSize); + + if(ret == _FAIL) + goto exit; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_WriteFW Done- for Normal chip.\n")); + } + else { + ret = _BlockWrite(Adapter,buffer,size); + + if(ret == _FAIL) + goto exit; + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_WriteFW Done- for Test chip.\n")); + } + +exit: + return ret; +} + +static int _FWFreeToGo( + IN PADAPTER Adapter + ) +{ + u32 counter = 0; + u32 value32; + u32 restarted = _FALSE; + + // polling CheckSum report + do{ + value32 = rtw_read32(Adapter, REG_MCUFWDL); + }while((counter ++ < POLLING_READY_TIMEOUT_COUNT) && (!(value32 & FWDL_ChkSum_rpt))); + + if(counter >= POLLING_READY_TIMEOUT_COUNT){ + DBG_8192C("chksum report faill ! REG_MCUFWDL:0x%08x\n",value32); + return _FAIL; + } else { + //DBG_8192C("chksum report success ! REG_MCUFWDL:0x%08x, counter:%u\n",value32, counter); + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Checksum report OK ! REG_MCUFWDL:0x%08x .\n",value32)); + + + value32 = rtw_read32(Adapter, REG_MCUFWDL); + value32 |= MCUFWDL_RDY; + value32 &= ~WINTINI_RDY; + rtw_write32(Adapter, REG_MCUFWDL, value32); + + +POLLING_FW_READY: + // polling for FW ready + counter = 0; + do + { + if(rtw_read32(Adapter, REG_MCUFWDL) & WINTINI_RDY){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",PlatformIORead4Byte(Adapter, REG_MCUFWDL)) ); + return _SUCCESS; + } + rtw_udelay_os(5); + }while(counter++ < POLLING_READY_TIMEOUT_COUNT); + + DBG_8192C("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", rtw_read32(Adapter, REG_MCUFWDL)); + + if(restarted == _FALSE) { + u8 tmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp & ~BIT2); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp & ~BIT2); + DBG_8192C("Reset 51 write8 REG_SYS_FUNC_EN:0x%04x\n", tmp|BIT2); + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, tmp|BIT2); + restarted = _TRUE; + goto POLLING_FW_READY; + } + + + return _FAIL; + +} + + +VOID +rtl8192c_FirmwareSelfReset( + IN PADAPTER Adapter +) +{ + u8 u1bTmp; + u8 Delay = 100; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if((pHalData->FirmwareVersion > 0x21) || + (pHalData->FirmwareVersion == 0x21 && + pHalData->FirmwareSubVersion >= 0x01)) // after 88C Fw v33.1 + { + //0x1cf=0x20. Inform 8051 to reset. 2009.12.25. tynli_test + rtw_write8(Adapter, REG_HMETFR+3, 0x20); + + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + while(u1bTmp&BIT2) + { + Delay--; + if(Delay == 0) + break; + rtw_udelay_os(50); + u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); + } + + if((u1bTmp&BIT2) && (Delay == 0)) + { + DBG_8192C("FirmwareDownload92C():fw reset by itself Fail!!!!!! 0x03 = %x\n", u1bTmp); + //RT_ASSERT(FALSE, ("PowerOffAdapter8192CE(): 0x03 = %x\n", u1bTmp)); + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + rtw_write8(Adapter,REG_SYS_FUNC_EN+1,(rtw_read8(Adapter, REG_SYS_FUNC_EN+1)&~BIT2)); + } + + DBG_8192C("%s =====> 8051 reset success (%d) .\n", __FUNCTION__ ,Delay); + } +} + +// +// Description: +// Download 8192C firmware code. +// +// +int FirmwareDownload92C( + IN PADAPTER Adapter +) +{ + int rtStatus = _SUCCESS; + u8 writeFW_retry = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + s8 R92CFwImageFileName_TSMC[] ={RTL8192C_FW_TSMC_IMG}; + s8 R92CFwImageFileName_UMC[] ={RTL8192C_FW_UMC_IMG}; + s8 R92CFwImageFileName_UMC_B[] ={RTL8192C_FW_UMC_B_IMG}; + //s8 R8723FwImageFileName_UMC[] ={RTL8723_FW_UMC_IMG}; + u8* FwImage = NULL; + u32 FwImageLen = 0; + char* pFwImageFileName; + u8* pucMappedFile = NULL; + //vivi, merge 92c and 92s into one driver, 20090817 + //vivi modify this temply, consider it later!!!!!!!! + //PRT_FIRMWARE pFirmware = GET_FIRMWARE_819X(Adapter); + //PRT_FIRMWARE_92C pFirmware = GET_FIRMWARE_8192C(Adapter); + PRT_FIRMWARE_92C pFirmware = NULL; + PRT_8192C_FIRMWARE_HDR pFwHdr = NULL; + u8 *pFirmwareBuf; + u32 FirmwareLen; + + pFirmware = (PRT_FIRMWARE_92C)rtw_zvmalloc(sizeof(RT_FIRMWARE_92C)); + + if(!pFirmware) + { + rtStatus = _FAIL; + goto Exit; + } + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID)) + { + pFwImageFileName = R92CFwImageFileName_UMC; + FwImage = Rtl819XFwUMCACutImageArray; + FwImageLen = UMCACutImgArrayLength; + DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC\n"); + } + else if(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) + { + // The ROM code of UMC B-cut Fw is the same as TSMC. by tynli. 2011.01.14. + pFwImageFileName = R92CFwImageFileName_UMC_B; + FwImage = Rtl819XFwUMCBCutImageArray; + FwImageLen = UMCBCutImgArrayLength; + DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_UMC_B\n"); + } + else + { + pFwImageFileName = R92CFwImageFileName_TSMC; + FwImage = Rtl819XFwTSMCImageArray; + FwImageLen = TSMCImgArrayLength; + DBG_8192C(" ===> FirmwareDownload91C() fw:Rtl819XFwImageArray_TSMC\n"); + } + } + else + { + #if 0 + pFwImageFileName = TestChipFwFile; + FwImage = Rtl8192CTestFwImg; + FwImageLen = Rtl8192CTestFwImgLen; + RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> FirmwareDownload91C() fw:Rtl8192CTestFwImg\n")); + #endif + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, (" ===> FirmwareDownload91C() fw:%s\n", pFwImageFileName)); + +#ifdef CONFIG_EMBEDDED_FWIMG + pFirmware->eFWSource = FW_SOURCE_HEADER_FILE; +#else + pFirmware->eFWSource = FW_SOURCE_IMG_FILE; // We should decided by Reg. +#endif + + switch(pFirmware->eFWSource) + { + case FW_SOURCE_IMG_FILE: + //TODO: + //_rtw_memcpy(pFirmware->szFwBuffer, FwImage, FwImageLen); + break; + case FW_SOURCE_HEADER_FILE: + if(FwImageLen > FW_8192C_SIZE){ + rtStatus = _FAIL; + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE) ); + DBG_871X("Firmware size exceed 0x%X. Check it.\n", FW_8192C_SIZE); + goto Exit; + } + + pFirmware->szFwBuffer = FwImage; + pFirmware->ulFwLength = FwImageLen; + break; + } + + pFirmwareBuf = pFirmware->szFwBuffer; + FirmwareLen = pFirmware->ulFwLength; + + // To Check Fw header. Added by tynli. 2009.12.04. + pFwHdr = (PRT_8192C_FIRMWARE_HDR)pFirmware->szFwBuffer; + + pHalData->FirmwareVersion = le16_to_cpu(pFwHdr->Version); + pHalData->FirmwareSubVersion = le16_to_cpu(pFwHdr->Subversion); + + //RT_TRACE(COMP_INIT, DBG_LOUD, (" FirmwareVersion(%#x), Signature(%#x)\n", + // Adapter->MgntInfo.FirmwareVersion, pFwHdr->Signature)); + + DBG_8192C("fw_ver=v%d, fw_subver=%d, sig=0x%x\n", + pHalData->FirmwareVersion, pHalData->FirmwareSubVersion, le16_to_cpu(pFwHdr->Signature)&0xFFF0); + + if(IS_FW_HEADER_EXIST(pFwHdr)) + { + //RT_TRACE(COMP_INIT, DBG_LOUD,("Shift 32 bytes for FW header!!\n")); + pFirmwareBuf = pFirmwareBuf + 32; + FirmwareLen = FirmwareLen -32; + } + + // Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, + // or it will cause download Fw fail. 2010.02.01. by tynli. + if(rtw_read8(Adapter, REG_MCUFWDL)&BIT7) //8051 RAM code + { + rtl8192c_FirmwareSelfReset(Adapter); + rtw_write8(Adapter, REG_MCUFWDL, 0x00); + } + + + _FWDownloadEnable(Adapter, _TRUE); + while(1) { + u8 tmp8; + tmp8 = rtw_read8(Adapter, REG_MCUFWDL); + + //reset the FWDL chksum + rtw_write8(Adapter, REG_MCUFWDL, tmp8|FWDL_ChkSum_rpt); + + //tmp8 = rtw_read8(Adapter, REG_MCUFWDL); + //DBG_8192C("Before _WriteFW, REG_MCUFWDL:0x%02x, writeFW_retry:%u\n", tmp8, writeFW_retry); + + rtStatus = _WriteFW(Adapter, pFirmwareBuf, FirmwareLen); + + //tmp8 = rtw_read8(Adapter, REG_MCUFWDL); + //DBG_8192C("After _WriteFW, REG_MCUFWDL:0x%02x, rtStatus:%d\n", tmp8, rtStatus); + + if(rtStatus == _SUCCESS || ++writeFW_retry>3) + break; + } + _FWDownloadEnable(Adapter, _FALSE); + if(_SUCCESS != rtStatus){ + DBG_8192C("DL Firmware failed!\n"); + goto Exit; + } + + rtStatus = _FWFreeToGo(Adapter); + if(_SUCCESS != rtStatus){ + DBG_8192C("DL Firmware failed!\n"); + goto Exit; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, (" Firmware is ready to run!\n")); + +Exit: + + if(pFirmware) { + rtw_vmfree((u8*)pFirmware, sizeof(RT_FIRMWARE_92C)); + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, (" <=== FirmwareDownload91C()\n")); + return rtStatus; + +} + +VOID +InitializeFirmwareVars92C( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // Init Fw LPS related. + Adapter->pwrctrlpriv.bFwCurrentInPSMode = _FALSE; + + //Init H2C counter. by tynli. 2009.12.09. + pHalData->LastHMEBoxNum = 0; +} + +#ifdef CONFIG_BT_COEXIST +static void _update_bt_param(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + struct registry_priv *registry_par = &padapter->registrypriv; + + if(2 != registry_par->bt_iso) + pbtpriv->BT_Ant_isolation = registry_par->bt_iso;// 0:Low, 1:High, 2:From Efuse + + if(registry_par->bt_sco == 1) // 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy + pbtpriv->BT_Service = BT_OtherAction; + else if(registry_par->bt_sco==2) + pbtpriv->BT_Service = BT_SCO; + else if(registry_par->bt_sco==4) + pbtpriv->BT_Service = BT_Busy; + else if(registry_par->bt_sco==5) + pbtpriv->BT_Service = BT_OtherBusy; + else + pbtpriv->BT_Service = BT_Idle; + + pbtpriv->BT_Ampdu = registry_par->bt_ampdu; + pbtpriv->bCOBT = _TRUE; +#if 1 + DBG_8192C("BT Coexistance = %s\n", (pbtpriv->BT_Coexist==_TRUE)?"enable":"disable"); + if(pbtpriv->BT_Coexist) + { + if(pbtpriv->BT_Ant_Num == Ant_x2) + { + DBG_8192C("BlueTooth BT_Ant_Num = Antx2\n"); + } + else if(pbtpriv->BT_Ant_Num == Ant_x1) + { + DBG_8192C("BlueTooth BT_Ant_Num = Antx1\n"); + } + switch(pbtpriv->BT_CoexistType) + { + case BT_2Wire: + DBG_8192C("BlueTooth BT_CoexistType = BT_2Wire\n"); + break; + case BT_ISSC_3Wire: + DBG_8192C("BlueTooth BT_CoexistType = BT_ISSC_3Wire\n"); + break; + case BT_Accel: + DBG_8192C("BlueTooth BT_CoexistType = BT_Accel\n"); + break; + case BT_CSR_BC4: + DBG_8192C("BlueTooth BT_CoexistType = BT_CSR_BC4\n"); + break; + case BT_RTL8756: + DBG_8192C("BlueTooth BT_CoexistType = BT_RTL8756\n"); + break; + default: + DBG_8192C("BlueTooth BT_CoexistType = Unknown\n"); + break; + } + DBG_8192C("BlueTooth BT_Ant_isolation = %d\n", pbtpriv->BT_Ant_isolation); + + + switch(pbtpriv->BT_Service) + { + case BT_OtherAction: + DBG_8192C("BlueTooth BT_Service = BT_OtherAction\n"); + break; + case BT_SCO: + DBG_8192C("BlueTooth BT_Service = BT_SCO\n"); + break; + case BT_Busy: + DBG_8192C("BlueTooth BT_Service = BT_Busy\n"); + break; + case BT_OtherBusy: + DBG_8192C("BlueTooth BT_Service = BT_OtherBusy\n"); + break; + default: + DBG_8192C("BlueTooth BT_Service = BT_Idle\n"); + break; + } + + DBG_8192C("BT_RadioSharedType = 0x%x\n", pbtpriv->BT_RadioSharedType); + } +#endif + +} + + +#define GET_BT_COEXIST(priv) (&priv->bt_coexist) + +void rtl8192c_ReadBluetoothCoexistInfo( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + u8 rf_opt4; + + if(AutoloadFail){ + pbtpriv->BT_Coexist = _FALSE; + pbtpriv->BT_CoexistType= BT_2Wire; + pbtpriv->BT_Ant_Num = Ant_x2; + pbtpriv->BT_Ant_isolation= 0; + pbtpriv->BT_RadioSharedType = BT_Radio_Shared; + return; + } + + if(isNormal) + { + pbtpriv->BT_Coexist = (((PROMContent[EEPROM_RF_OPT1]&BOARD_TYPE_NORMAL_MASK)>>5) == BOARD_USB_COMBO)?_TRUE:_FALSE; // bit [7:5] + rf_opt4 = PROMContent[EEPROM_RF_OPT4]; + pbtpriv->BT_CoexistType = ((rf_opt4&0xe)>>1); // bit [3:1] + pbtpriv->BT_Ant_Num = (rf_opt4&0x1); // bit [0] + pbtpriv->BT_Ant_isolation = ((rf_opt4&0x10)>>4); // bit [4] + pbtpriv->BT_RadioSharedType = ((rf_opt4&0x20)>>5); // bit [5] + } + else + { + pbtpriv->BT_Coexist = (PROMContent[EEPROM_RF_OPT4] >> 4) ? _TRUE : _FALSE; + } + _update_bt_param(Adapter); + +} +#endif + +VERSION_8192C +rtl8192c_ReadChipVersion( + IN PADAPTER Adapter + ) +{ + u32 value32; + //VERSION_8192C version; + u32 ChipVersion=0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + value32 = rtw_read32(Adapter, REG_SYS_CFG); + + if (value32 & TRP_VAUX_EN) + { +#if 0 + // Test chip. + if(IS_HARDWARE_TYPE_8723(Adapter)) { + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + } + else { + version = (value32 & TYPE_ID) ?VERSION_TEST_CHIP_92C :VERSION_TEST_CHIP_88C; + } +#else + // tynli_test. 2011.01.10. + if(IS_HARDWARE_TYPE_8192C(Adapter)) + { + ChipVersion = (value32 & TYPE_ID) ? VERSION_TEST_CHIP_92C : VERSION_TEST_CHIP_88C; + } + else + { + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + } +#endif + } + else + { +#if 0 + // Normal mass production chip. + ChipVersion = NORMAL_CHIP; +#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION + ChipVersion |= ((value32 & TYPE_ID) ? CHIP_92C : 0); +#endif + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + if(IS_8723_SERIES(ChipVersion)) + { + if(IS_VENDOR_UMC(ChipVersion)) + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) ? CHIP_VENDOR_UMC_B_CUT : 0); + } + else + { + // Mark out by tynli. UMC B-cut IC will not set the SYS_CFG[19] to UMC + // because we do not want the custmor to know. 2011.01.11. + //if(IS_VENDOR_UMC(ChipVersion)) + { + // To check the value of B-cut. by tynli. 2011.01.11. + u1bTmp = (u1Byte)((value32 & CHIP_VER_RTL_MASK)>>12); + if(u1bTmp == 1) + { // B-cut + ChipVersion |= CHIP_VENDOR_UMC_B_CUT; + } + } + } +#else + // Normal mass production chip. + ChipVersion = NORMAL_CHIP; +//#if !RTL8723_FPGA_TRUE_PHY_VERIFICATION + ChipVersion |= ((value32 & TYPE_ID) ? RF_TYPE_2T2R : 0); //92c +//#endif + ChipVersion |= ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0); + ChipVersion |= ((value32 & BT_FUNC) ? CHIP_8723: 0); // RTL8723 with BT function. + if(IS_HARDWARE_TYPE_8192C(Adapter)) + { + // 88/92C UMC B-cut IC will not set the SYS_CFG[19] to UMC + // because we do not want the custmor to know. by tynli. 2011.01.17. + //MSG_8192C("mask result = 0x%x is_UMC %d chipversion 0x%x\n", (value32 & CHIP_VER_RTL_MASK), IS_CHIP_VENDOR_UMC(ChipVersion), ChipVersion); + if((!IS_CHIP_VENDOR_UMC(ChipVersion) )&& (value32 & CHIP_VER_RTL_MASK)) + { + //MSG_8192C("chip mask result = 0x%x\n", ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC)); + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK) | CHIP_VENDOR_UMC); // IC version (CUT) + //MSG_8192C("chip version = 0x%x\n", ChipVersion); + } + } + else + { + if(IS_CHIP_VENDOR_UMC(ChipVersion)) + ChipVersion |= ((value32 & CHIP_VER_RTL_MASK)); // IC version (CUT) + } + + if(IS_92C_SERIAL(ChipVersion)) + { + value32 = rtw_read32(Adapter, REG_HPON_FSM); + ChipVersion |= ((CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_92C_1T2R) ? RF_TYPE_1T2R : 0); + } + else if(IS_8723_SERIES(ChipVersion)) + { + //RT_ASSERT(IS_HARDWARE_TYPE_8723(Adapter), ("Incorrect chip version!!\n")); + value32 = rtw_read32(Adapter, REG_GPIO_OUTSTS); + ChipVersion |= ((value32 & RF_RL_ID)>>20); //ROM code version. + } +#endif + + } + + //version = (VERSION_8192C)ChipVersion; + + // For multi-function consideration. Added by Roger, 2010.10.06. + if(IS_8723_SERIES(ChipVersion)) + { + pHalData->MultiFunc = RT_MULTI_FUNC_NONE; + value32 = rtw_read32(Adapter, REG_MULTI_FUNC_CTRL); + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & WL_FUNC_EN) ? RT_MULTI_FUNC_WIFI : 0) ); + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & BT_FUNC_EN) ? RT_MULTI_FUNC_BT : 0) ); + pHalData->MultiFunc =(RT_MULTI_FUNC) (pHalData->MultiFunc| ((value32 & GPS_FUNC_EN) ? RT_MULTI_FUNC_GPS : 0) ); + pHalData->PolarityCtl = ((value32 & WL_HWPDN_SL) ? RT_POLARITY_HIGH_ACT : RT_POLARITY_LOW_ACT); + //MSG_8192C("ReadChipVersion(): MultiFunc(%x), PolarityCtl(%x) \n", pHalData->MultiFunc, pHalData->PolarityCtl); + + //For regulator mode. by tynli. 2011.01.14 + pHalData->RegulatorMode = ((value32 & TRP_BT_EN) ? RT_LDO_REGULATOR : RT_SWITCHING_REGULATOR); + //MSG_8192C("ReadChipVersion(): RegulatorMode(%x) \n", pHalData->RegulatorMode); + } + +//#if DBG +#if 1 + switch(ChipVersion) + { + case VERSION_NORMAL_TSMC_CHIP_92C_1T2R: + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C_1T2R.\n"); + break; + case VERSION_NORMAL_TSMC_CHIP_92C: + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_92C.\n"); + break; + case VERSION_NORMAL_TSMC_CHIP_88C: + MSG_8192C("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_88C.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_88C_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_92C_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_92C_B_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_88C_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMAL_UMC_CHIP_88C_B_CUT.\n"); + break; + case VERSION_TEST_CHIP_92C: + MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_92C.\n"); + break; + case VERSION_TEST_CHIP_88C: + MSG_8192C("Chip Version ID: VERSION_TEST_CHIP_88C.\n"); + break; + case VERSION_TEST_UMC_CHIP_8723: + MSG_8192C("Chip Version ID: VERSION_TEST_UMC_CHIP_8723.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_A_CUT.\n"); + break; + case VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT: + MSG_8192C("Chip Version ID: VERSION_NORMA_UMC_CHIP_8723_1T1R_B_CUT.\n"); + break; + default: + MSG_8192C("Chip Version ID: ???????????????.\n"); + break; + } +#endif + + pHalData->VersionID = ChipVersion; + + if(IS_1T2R(ChipVersion)) + pHalData->rf_type = RF_1T2R; + else if(IS_2T2R(ChipVersion)) + pHalData->rf_type = RF_2T2R; + else if(IS_8723_SERIES(ChipVersion)) + pHalData->rf_type = RF_1T1R; + else + pHalData->rf_type = RF_1T1R; + + MSG_8192C("RF_Type is %x!!\n", pHalData->rf_type); + + return ChipVersion; +} + + +RT_CHANNEL_DOMAIN +_HalMapChannelPlan8192C( + IN PADAPTER Adapter, + IN u8 HalChannelPlan + ) +{ + RT_CHANNEL_DOMAIN rtChannelDomain; + + switch(HalChannelPlan) + { +#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ + case EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN: + rtChannelDomain = RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN; + break; + case EEPROM_CHANNEL_PLAN_WORLD_WIDE_13: + rtChannelDomain = RT_CHANNEL_DOMAIN_WORLD_WIDE_13; + break; +#endif /* Not using EEPROM_CHANNEL_PLAN directly */ + default: + if(HalChannelPlan == 0xFF) + rtChannelDomain = RT_CHANNEL_DOMAIN_WORLD_WIDE_13; + else + rtChannelDomain = (RT_CHANNEL_DOMAIN)HalChannelPlan; + break; + } + + return rtChannelDomain; + +} + +u8 GetEEPROMSize8192C(PADAPTER Adapter) +{ + u8 size = 0; + u32 curRCR; + + curRCR = rtw_read16(Adapter, REG_9346CR); + size = (curRCR & BOOT_FROM_EEPROM) ? 6 : 4; // 6: EEPROM used is 93C46, 4: boot from E-Fuse. + + MSG_8192C("EEPROM type is %s\n", size==4 ? "E-FUSE" : "93C46"); + + return size; +} + +void rtl8192c_HalSetBrateCfg( + IN PADAPTER Adapter, + IN u8 *mBratesOS, + OUT u16 *pBrateCfg +) +{ + u8 is_brate; + u8 i; + u8 brate; + + for(i=0;i rtl8192c_free_hal_data =====\n"); + + if(padapter->HalData) + rtw_mfree(padapter->HalData, sizeof(HAL_DATA_TYPE)); + DBG_8192C("<===== rtl8192c_free_hal_data =====\n"); + +_func_exit_; +} + +//=========================================================== +// Efuse related code +//=========================================================== +enum{ + VOLTAGE_V25 = 0x03, + LDOE25_SHIFT = 28 , + }; + +static VOID +hal_EfusePowerSwitch_RTL8192C( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + u8 tempval; + u16 tmpV16; + + if (PwrState == _TRUE) + { + // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL); + if( ! (tmpV16 & PWC_EV12V ) ){ + tmpV16 |= PWC_EV12V ; + rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16); + } + // Reset: 0x0000h[28], default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN); + if( !(tmpV16 & FEN_ELDR) ){ + tmpV16 |= FEN_ELDR ; + rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); + } + + // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR); + if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){ + tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; + rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); + } + + if(bWrite == _TRUE) + { + // Enable LDO 2.5V before read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + tempval &= 0x0F; + tempval |= (VOLTAGE_V25 << 4); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); + } + } + else + { + if(bWrite == _TRUE){ + // Disable LDO 2.5V after read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); + } + } +} + +static VOID +hal_EfusePowerSwitch_RTL8723( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + u8 tempval; + u16 tmpV16; + + if (PwrState == _TRUE) + { + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); + + // 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_ISO_CTRL); + if( ! (tmpV16 & PWC_EV12V ) ){ + tmpV16 |= PWC_EV12V ; + rtw_write16(pAdapter,REG_SYS_ISO_CTRL,tmpV16); + } + // Reset: 0x0000h[28], default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_FUNC_EN); + if( !(tmpV16 & FEN_ELDR) ){ + tmpV16 |= FEN_ELDR ; + rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); + } + + // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid + tmpV16 = rtw_read16(pAdapter,REG_SYS_CLKR); + if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ){ + tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; + rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); + } + + if(bWrite == _TRUE) + { + // Enable LDO 2.5V before read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + tempval &= 0x0F; + tempval |= (VOLTAGE_V25 << 4); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); + } + } + else + { + rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF); + + if(bWrite == _TRUE){ + // Disable LDO 2.5V after read/write action + tempval = rtw_read8(pAdapter, EFUSE_TEST+3); + rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); + } + } +} + +static VOID +rtl8192c_EfusePowerSwitch( + IN PADAPTER pAdapter, + IN u8 bWrite, + IN u8 PwrState) +{ + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + hal_EfusePowerSwitch_RTL8192C(pAdapter, bWrite, PwrState); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + hal_EfusePowerSwitch_RTL8723(pAdapter, bWrite, PwrState); + } +} + +static VOID +ReadEFuse_RTL8192C( + PADAPTER Adapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + u8 efuseTbl[EFUSE_MAP_LEN]; + u8 rtemp8[1]; + u16 eFuse_Addr = 0; + u8 offset, wren; + u16 i, j; + u16 eFuseWord[EFUSE_MAX_SECTION][EFUSE_MAX_WORD_UNIT]; + u16 efuse_utilized = 0; + u8 efuse_usage = 0; + + // + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. + // + if((_offset + _size_byte)>EFUSE_MAP_LEN) + {// total E-Fuse table is 128bytes + //DBG_8192C("ReadEFuse_RTL8192C(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte); + return; + } + + // 0. Refresh efuse init map as all oxFF. + for (i = 0; i < EFUSE_MAX_SECTION; i++) + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) + eFuseWord[i][j] = 0xFFFF; + + + // + // 1. Read the first byte to check if efuse is empty!!! + // + // + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); + if(*rtemp8 != 0xFF) + { + efuse_utilized++; + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); + eFuse_Addr++; + } + + // + // 2. Read real efuse content. Filter PG header and every section data. + // + while((*rtemp8 != 0xFF) && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN)) + { + // Check PG header for section num. + offset = ((*rtemp8 >> 4) & 0x0f); + + if(offset < EFUSE_MAX_SECTION) + { + // Get word enable value from PG header + wren = (*rtemp8 & 0x0f); + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wren)); + + for(i=0; i= EFUSE_REAL_CONTENT_LEN) + break; + + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); eFuse_Addr++; + efuse_utilized++; + eFuseWord[offset][i] |= (((u16)*rtemp8 << 8) & 0xff00); + + if(eFuse_Addr >= EFUSE_REAL_CONTENT_LEN) + break; + } + + wren >>= 1; + + } + } + + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Addr=%d\n", eFuse_Addr)); + // Read next PG header + ReadEFuseByte(Adapter, eFuse_Addr, rtemp8, bPseudoTest); + if(*rtemp8 != 0xFF && (eFuse_Addr < 512)) + { + efuse_utilized++; + eFuse_Addr++; + } + } + + // + // 3. Collect 16 sections and 4 word unit into Efuse map. + // + for(i=0; i> 8) & 0xff); + } + } + + // + // 4. Copy from Efuse map to output pointer memory!!! + // + for(i=0; i<_size_byte; i++) + { + pbuf[i] = efuseTbl[_offset+i]; + } + + // + // 5. Calculate Efuse utilization. + // + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN); + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized); + //Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage); +} + +static VOID +ReadEFuse_RTL8723( + PADAPTER Adapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + u8 efuseTbl[EFUSE_MAP_LEN_8723]; + u16 eFuse_Addr = 0; + u8 offset = 0, wden = 0; + u16 i, j; + u16 eFuseWord[EFUSE_MAX_SECTION_8723][EFUSE_MAX_WORD_UNIT]; + u16 efuse_utilized = 0; + u8 efuse_usage = 0; + u8 offset_2_0=0; + u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; + // + // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. + // + if((_offset + _size_byte)>EFUSE_MAP_LEN_8723) + { + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_RTL8723(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte)); + return; + } + + // 0. Refresh efuse init map as all oxFF. + for (i = 0; i < EFUSE_MAX_SECTION_8723; i++) + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) + eFuseWord[i][j] = 0xFFFF; + + // + // 1. Read the first byte to check if efuse is empty!!! + // + // + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); + + if(efuseHeader != 0xFF) + { + efuse_utilized++; + } + else + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("EFUSE is empty\n")); + return; + } + + + // + // 2. Read real efuse content. Filter PG header and every section data. + // + while((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR(eFuse_Addr)) + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseHeader)); + + // Check PG header for section num. + if(EXT_HEADER(efuseHeader)) //extended header + { + offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader); + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("extended header offset_2_0=%x\n", offset_2_0)); + + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest); + + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse[%d]=%x\n", eFuse_Addr-1, efuseExtHdr)); + + if(efuseExtHdr != 0xff) + { + efuse_utilized++; + if(ALL_WORDS_DISABLED(efuseExtHdr)) + { + ReadEFuseByte(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); + if(efuseHeader != 0xff) + { + efuse_utilized++; + } + continue; + } + else + { + offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0; + wden = (efuseExtHdr & 0x0F); + } + } + else + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n")); + // We should handle this condition. + } + } + else + { + offset = ((efuseHeader >> 4) & 0x0f); + wden = (efuseHeader & 0x0f); + } + + if(offset < EFUSE_MAX_SECTION_8723) + { + // Get word enable value from PG header + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden)); + + for(i=0; i> 8) & 0xff); + } + } + + // + // 4. Copy from Efuse map to output pointer memory!!! + // + for(i=0; i<_size_byte; i++) + { + pbuf[i] = efuseTbl[_offset+i]; + } + + // + // 5. Calculate Efuse utilization. + // + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_REAL_CONTENT_LEN); + Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_utilized); + //Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_EFUSE_USAGE, (pu1Byte)&efuse_usage); +} + +static BOOLEAN +Hal_EfuseSwitchToBank( + IN PADAPTER pAdapter, + IN u8 bank, + IN BOOLEAN bPseudoTest + ) +{ + BOOLEAN bRet = _FALSE; + u32 value32=0; + + //RTPRINT(FEEPROM, EFUSE_PG, ("Efuse switch bank to %d\n", bank)); + if(bPseudoTest) + { + fakeEfuseBank = bank; + bRet = _TRUE; + } + else + { + if(IS_HARDWARE_TYPE_8723(pAdapter) && + INCLUDE_MULTI_FUNC_BT(pAdapter)) + { + value32 = rtw_read32(pAdapter, EFUSE_TEST); + bRet = _TRUE; + switch(bank) + { + case 0: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); + break; + case 1: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_0); + break; + case 2: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_1); + break; + case 3: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_BT_SEL_2); + break; + default: + value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); + bRet = _FALSE; + break; + } + rtw_write32(pAdapter, EFUSE_TEST, value32); + } + else + bRet = _TRUE; + } + return bRet; +} + +static VOID +ReadEFuse_BT( + PADAPTER Adapter, + u16 _offset, + u16 _size_byte, + u8 *pbuf, + IN BOOLEAN bPseudoTest + ) +{ + u8 *efuseTbl; + u16 eFuse_Addr = 0; + u8 offset = 0, wden = 0; + u16 i, j; + u16 **eFuseWord; + u16 efuse_utilized = 0; + u8 efuse_usage = 0; + u8 offset_2_0=0; + u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; + u8 bank=0; + BOOLEAN bCheckNextBank=_FALSE; + + efuseTbl = rtw_malloc(EFUSE_BT_MAP_LEN); + if(efuseTbl == NULL){ + DBG_8192C("efuseTbl malloc fail !\n"); + return; + } + + eFuseWord = (u16 **)rtw_zmalloc(sizeof(u16 *)*EFUSE_BT_MAX_SECTION); + if(eFuseWord == NULL){ + DBG_8192C("eFuseWord malloc fail !\n"); + return; + } + else{ + for(i=0;iEFUSE_BT_MAP_LEN) + { + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("ReadEFuse_BT(): Invalid offset(%#x) with read bytes(%#x)!!\n",_offset, _size_byte)); + return; + } + + // 0. Refresh efuse init map as all oxFF. + for (i = 0; i < EFUSE_BT_MAX_SECTION; i++) + for (j = 0; j < EFUSE_MAX_WORD_UNIT; j++) + eFuseWord[i][j] = 0xFFFF; + + for(bank=1; bank> 1) | offset_2_0; + wden = (efuseExtHdr & 0x0F); + } + } + else + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Error condition, extended = 0xff\n")); + // We should handle this condition. + } + } + else + { + offset = ((efuseHeader >> 4) & 0x0f); + wden = (efuseHeader & 0x0f); + } + + if(offset < EFUSE_BT_MAX_SECTION) + { + // Get word enable value from PG header + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Offset-%d Worden=%x\n", offset, wden)); + + for(i=0; i= EFUSE_REAL_CONTENT_LEN) + bCheckNextBank = _TRUE; + else + bCheckNextBank = _FALSE; + } + } + if(!bCheckNextBank) + { + //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("Stop to check next bank\n")); + break; + } + } + + // switch bank back to bank 0 for later BT and wifi use. + Hal_EfuseSwitchToBank(Adapter, 0, bPseudoTest); + + // + // 3. Collect 16 sections and 4 word unit into Efuse map. + // + for(i=0; i> 8) & 0xff); + } + } + + // + // 4. Copy from Efuse map to output pointer memory!!! + // + for(i=0; i<_size_byte; i++) + { + pbuf[i] = efuseTbl[_offset+i]; + } + + // + // 5. Calculate Efuse utilization. + // + efuse_usage = (u8)((efuse_utilized*100)/EFUSE_BT_REAL_CONTENT_LEN); + if(bPseudoTest) + { + fakeBTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1; + } + else + { + BTEfuseUsedBytes = (EFUSE_REAL_CONTENT_LEN*(bank-1))+eFuse_Addr-1; + } + + for(i=0;i>4) & 0x0F; + hworden = efuse_data & 0x0F; + word_cnts = Efuse_CalculateWordCnts(hworden); + //read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + } + else + { + bContinual = _FALSE ; + } + } + + return efuse_addr; +} + +static u16 +Hal_EfuseGetCurrentSize_BT(IN PADAPTER pAdapter, + IN BOOLEAN bPseudoTest) +{ + int bContinual = _TRUE; + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 efuse_data,word_cnts=0; + u8 bank=0, startBank=0; + u16 retU2=0; + u32 total_efuse_used=0; + + if(bPseudoTest) + { + efuse_addr = (u16)((fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN)); + startBank = (u8)(1+(fakeBTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN)); + } + else + { + efuse_addr = (u16)((BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN)); + startBank = (u8)(1+(BTEfuseUsedBytes/EFUSE_REAL_CONTENT_LEN)); + } + + if((startBank < 1) || (startBank >= EFUSE_MAX_BANK)) + DBG_8192C("Error, bank error, bank=%d\n", bank); + + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), start bank=%d, start_efuse_addr = %d\n", startBank, efuse_addr)); + + for(bank=startBank; bank> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + } + else + { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + //read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + } + else + { + bContinual = _FALSE ; + } + } + + // Check if we need to check next bank efuse + if(efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_PROTECT_BYTES_BANK)) + { + break;// don't need to check next bank. + } + } + + retU2 = ((bank-1)*EFUSE_REAL_CONTENT_LEN)+efuse_addr; + if(bPseudoTest) + { + fakeBTEfuseUsedBytes = retU2; + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", fakeBTEfuseUsedBytes)); + } + else + { + BTEfuseUsedBytes = retU2; + //RTPRINT(FEEPROM, EFUSE_PG, ("Hal_EfuseGetCurrentSize_BT(), return %d\n", BTEfuseUsedBytes)); + } + + return retU2; +} + + +static u16 +hal_EfuseGetCurrentSize_8723(IN PADAPTER pAdapter, + IN BOOLEAN bPseudoTest) +{ + int bContinual = _TRUE; + + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 efuse_data,word_cnts=0; + + if(bPseudoTest) + { + efuse_addr = (u16)(fakeEfuseUsedBytes); + } + else + { + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); + } + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), start_efuse_addr = %d\n", efuse_addr)); + + while ( bContinual && + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) && + AVAILABLE_EFUSE_ADDR(efuse_addr)) + { + if(efuse_data!=0xFF) + { + if((efuse_data&0x1F) == 0x0F) //extended header + { + hoffset = efuse_data; + efuse_addr++; + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); + if((efuse_data & 0x0F) == 0x0F) + { + efuse_addr++; + continue; + } + else + { + hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + } + else + { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + //read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + } + else + { + bContinual = _FALSE ; + } + } + + if(bPseudoTest) + { + fakeEfuseUsedBytes = efuse_addr; + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", fakeEfuseUsedBytes)); + } + else + { + pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723(), return %d\n", efuse_addr)); + } + + return efuse_addr; +} + +static u16 +Hal_EfuseGetCurrentSize_Pseudo(IN PADAPTER pAdapter, + IN BOOLEAN bPseudoTest) +{ + u16 ret=0; + + ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest); + + return ret; +} + +static u16 +rtl8192c_EfuseGetCurrentSize( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest) +{ + u16 ret=0; + + if(efuseType == EFUSE_WIFI) + { + if(bPseudoTest) + { + ret = Hal_EfuseGetCurrentSize_Pseudo(pAdapter, bPseudoTest); + } + else + { + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + ret = hal_EfuseGetCurrentSize_8192C(pAdapter, bPseudoTest); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + ret = hal_EfuseGetCurrentSize_8723(pAdapter, bPseudoTest); + } + } + } + else + { + ret = Hal_EfuseGetCurrentSize_BT(pAdapter, bPseudoTest); + } + + return ret; +} + +static int +hal_EfusePgPacketRead_8192C( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 ReadState = PG_STATE_HEADER; + + int bContinual = _TRUE; + int bDataEmpty = _TRUE ; + + u8 efuse_data,word_cnts=0; + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 tmpidx=0; + u8 tmpdata[8]; + + if(data==NULL) return _FALSE; + if(offset>15) return _FALSE; + + + _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // Skip dummy parts to prevent unexpected data read from Efuse. + // By pass right now. 2009.02.19. + // + while(bContinual && (efuse_addr < EFUSE_REAL_CONTENT_LEN) ) + { + //------- Header Read ------------- + if(ReadState & PG_STATE_HEADER) + { + if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)){ + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + word_cnts = Efuse_CalculateWordCnts(hworden); + bDataEmpty = _TRUE ; + + if(hoffset==offset){ + for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){ + if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ){ + tmpdata[tmpidx] = efuse_data; + if(efuse_data!=0xff){ + bDataEmpty = _FALSE; + } + } + } + if(bDataEmpty==_FALSE){ + ReadState = PG_STATE_DATA; + }else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + } + else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + else{ + bContinual = _FALSE ; + } + } + //------- Data section Read ------------- + else if(ReadState & PG_STATE_DATA) + { + efuse_WordEnableDataRead(hworden,tmpdata,data); + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + + if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && + (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) + return _FALSE; + else + return _TRUE; + +} + +static int +hal_EfusePgPacketRead_8723( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 ReadState = PG_STATE_HEADER; + + int bContinual = _TRUE; + int bDataEmpty = _TRUE ; + + u8 efuse_data,word_cnts=0; + u16 efuse_addr = 0; + u8 hoffset=0,hworden=0; + u8 tmpidx=0; + u8 tmpdata[8]; + u8 max_section=0; + u8 tmp_header = 0; + + EFUSE_GetEfuseDefinition(pAdapter, EFUSE_WIFI, TYPE_EFUSE_MAX_SECTION, (PVOID)&max_section, bPseudoTest); + + if(data==NULL) + return _FALSE; + if(offset>max_section) + return _FALSE; + + _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); + + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // Skip dummy parts to prevent unexpected data read from Efuse. + // By pass right now. 2009.02.19. + // + while(bContinual && AVAILABLE_EFUSE_ADDR(efuse_addr) ) + { + //------- Header Read ------------- + if(ReadState & PG_STATE_HEADER) + { + if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)) + { + if(EXT_HEADER(efuse_data)) + { + tmp_header = efuse_data; + efuse_addr++; + efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); + if(!ALL_WORDS_DISABLED(efuse_data)) + { + hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + hworden = efuse_data & 0x0F; + } + else + { + DBG_8192C("Error, All words disabled\n"); + efuse_addr++; + continue; + } + } + else + { + hoffset = (efuse_data>>4) & 0x0F; + hworden = efuse_data & 0x0F; + } + word_cnts = Efuse_CalculateWordCnts(hworden); + bDataEmpty = _TRUE ; + + if(hoffset==offset) + { + for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++) + { + if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ) + { + tmpdata[tmpidx] = efuse_data; + if(efuse_data!=0xff) + { + bDataEmpty = _FALSE; + } + } + } + if(bDataEmpty==_FALSE){ + ReadState = PG_STATE_DATA; + }else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + } + else{//read next header + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + else{ + bContinual = _FALSE ; + } + } + //------- Data section Read ------------- + else if(ReadState & PG_STATE_DATA) + { + efuse_WordEnableDataRead(hworden,tmpdata,data); + efuse_addr = efuse_addr + (word_cnts*2)+1; + ReadState = PG_STATE_HEADER; + } + + } + + if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && + (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) + return _FALSE; + else + return _TRUE; + +} + +static int +Hal_EfusePgPacketRead( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + ret = hal_EfusePgPacketRead_8192C(pAdapter, offset, data, bPseudoTest); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest); + } + + return ret; +} + +static int +Hal_EfusePgPacketRead_Pseudo( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + ret = hal_EfusePgPacketRead_8723(pAdapter, offset, data, bPseudoTest); + + return ret; +} + +static int +rtl8192c_Efuse_PgPacketRead( IN PADAPTER pAdapter, + IN u8 offset, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + if(bPseudoTest) + { + ret = Hal_EfusePgPacketRead_Pseudo(pAdapter, offset, data, bPseudoTest); + } + else + { + ret = Hal_EfusePgPacketRead(pAdapter, offset, data, bPseudoTest); + } + + return ret; +} + +static BOOLEAN +hal_EfuseFixHeaderProcess( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN PPGPKT_STRUCT pFixPkt, + IN u16 *pAddr, + IN BOOLEAN bPseudoTest +) +{ + u8 originaldata[8], badworden=0; + u16 efuse_addr=*pAddr; + u32 PgWriteSuccess=0; + + _rtw_memset((PVOID)originaldata, 0xff, 8); + + if(Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest)) + { //check if data exist + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest); + + if(badworden != 0xf) // write fail + { + if(efuseType == EFUSE_WIFI) + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); + else + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); + if(!PgWriteSuccess) + return _FALSE; + else + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); + } + else + { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + } + else + { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + *pAddr = efuse_addr; + return _TRUE; +} + +static BOOLEAN +hal_EfusePgPacketWrite2ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE, bContinual=_TRUE; + u16 efuse_addr=*pAddr, efuse_max_available_len=0; + u8 pg_header=0, tmp_header=0, pg_header_temp=0; + u8 repeatcnt=0; + + //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 2byte header\n")); + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest); + + while(efuse_addr < efuse_max_available_len) + { + pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; + //RTPRINT(FEEPROM, EFUSE_PG, ("pg_header = 0x%x\n", pg_header)); + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF) + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for pg_header!!\n")); + return _FALSE; + } + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + } + + //to write ext_header + if(tmp_header == pg_header) + { + efuse_addr++; + pg_header_temp = pg_header; + pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF) + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for ext_header!!\n")); + return _FALSE; + } + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + } + + if((tmp_header & 0x0F) == 0x0F) //word_en PG fail + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Repeat over limit for word_en!!\n")); + return _FALSE; + } + else + { + efuse_addr++; + continue; + } + } + else if(pg_header != tmp_header) //offset PG fail + { + PGPKT_STRUCT fixPkt; + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for offset PG fail, need to cover the existed data\n")); + fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1); + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) + return _FALSE; + } + else + { + bRet = _TRUE; + break; + } + } + else if ((tmp_header & 0x1F) == 0x0F) //wrong extended header + { + efuse_addr+=2; + continue; + } + } + + *pAddr = efuse_addr; + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWrite1ByteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + u8 pg_header=0, tmp_header=0; + u16 efuse_addr=*pAddr; + u8 repeatcnt=0; + + //RTPRINT(FEEPROM, EFUSE_PG, ("Wirte 1byte header\n")); + pg_header = ((pTargetPkt->offset << 4) & 0xf0) |pTargetPkt->word_en; + + efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); + + while(tmp_header == 0xFF) + { + if(repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) + { + return _FALSE; + } + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); + } + + if(pg_header == tmp_header) + { + bRet = _TRUE; + } + else + { + PGPKT_STRUCT fixPkt; + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition for fixed PG packet, need to cover the existed data\n")); + fixPkt.offset = (tmp_header>>4) & 0x0F; + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) + return _FALSE; + } + + *pAddr = efuse_addr; + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWriteData( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + u16 efuse_addr=*pAddr; + u8 badworden=0; + u32 PgWriteSuccess=0; + + badworden = 0x0f; + badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); + if(badworden == 0x0F) + { + // write ok + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData ok!!\n")); + return _TRUE; + } + else + { + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWriteData Fail!!\n")); + //reorganize other pg packet + if(efuseType == EFUSE_WIFI) + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + else + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + if(!PgWriteSuccess) + return _FALSE; + else + return _TRUE; + } + + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWriteHeader( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest) +{ + BOOLEAN bRet=_FALSE; + + if(pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE) + { + bRet = hal_EfusePgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + } + else + { + bRet = hal_EfusePgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); + } + + return bRet; +} + +static BOOLEAN +hal_EfusePgCheckAvailableAddr( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN BOOLEAN bPseudoTest + ) +{ + u16 efuse_max_available_len=0; + + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&efuse_max_available_len, bPseudoTest); + //RTPRINT(FEEPROM, EFUSE_PG, ("efuse_max_available_len = %d\n", efuse_max_available_len)); + + if(Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= efuse_max_available_len) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgCheckAvailableAddr error!!\n")); + return _FALSE; + } + return _TRUE; +} + +static VOID +hal_EfuseConstructPGPkt( + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN PPGPKT_STRUCT pTargetPkt + +) +{ + _rtw_memset((PVOID)pTargetPkt->data, 0xFF, sizeof(u8)*8); + pTargetPkt->offset = offset; + pTargetPkt->word_en= word_en; + efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data); + pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); + + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseConstructPGPkt(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\n", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts)); +} + +static BOOLEAN +hal_EfuseCheckIfDatafollowed( + IN PADAPTER pAdapter, + IN u8 word_cnts, + IN u16 startAddr, + IN BOOLEAN bPseudoTest + ) +{ + BOOLEAN bRet=_FALSE; + u8 i, efuse_data; + + for(i=0; i<(word_cnts*2) ; i++) + { + if(efuse_OneByteRead(pAdapter, (startAddr+i) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)) + bRet = _TRUE; + } + + return bRet; +} + +static BOOLEAN +wordEnMatched( + IN PPGPKT_STRUCT pTargetPkt, + IN PPGPKT_STRUCT pCurPkt, + IN u8 *pWden +) +{ + u8 match_word_en = 0x0F; // default all words are disabled + u8 i; + + // check if the same words are enabled both target and current PG packet + if( ((pTargetPkt->word_en & BIT0) == 0) && + ((pCurPkt->word_en & BIT0) == 0) ) + { + match_word_en &= ~BIT0; // enable word 0 + } + if( ((pTargetPkt->word_en & BIT1) == 0) && + ((pCurPkt->word_en & BIT1) == 0) ) + { + match_word_en &= ~BIT1; // enable word 1 + } + if( ((pTargetPkt->word_en & BIT2) == 0) && + ((pCurPkt->word_en & BIT2) == 0) ) + { + match_word_en &= ~BIT2; // enable word 2 + } + if( ((pTargetPkt->word_en & BIT3) == 0) && + ((pCurPkt->word_en & BIT3) == 0) ) + { + match_word_en &= ~BIT3; // enable word 3 + } + + *pWden = match_word_en; + + if(match_word_en != 0xf) + return _TRUE; + else + return _FALSE; +} + +static BOOLEAN +hal_EfusePartialWriteCheck( + IN PADAPTER pAdapter, + IN u8 efuseType, + IN u16 *pAddr, + IN PPGPKT_STRUCT pTargetPkt, + IN BOOLEAN bPseudoTest + ) +{ + BOOLEAN bRet=_FALSE; + u8 i, efuse_data=0, cur_header=0; + u8 new_wden=0, matched_wden=0, badworden=0; + u16 startAddr=0, efuse_max_available_len=0, efuse_max=0; + PGPKT_STRUCT curPkt; + + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, (PVOID)&efuse_max_available_len, bPseudoTest); + EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&efuse_max, bPseudoTest); + + if(efuseType == EFUSE_WIFI) + { + if(bPseudoTest) + { + startAddr = (u16)(fakeEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); + } + else + { + pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&startAddr); + startAddr%=EFUSE_REAL_CONTENT_LEN; + } + } + else + { + if(bPseudoTest) + { + startAddr = (u16)(fakeBTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); + } + else + { + startAddr = (u16)(BTEfuseUsedBytes%EFUSE_REAL_CONTENT_LEN); + } + } + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePartialWriteCheck(), startAddr=%d\n", startAddr)); + + while(1) + { + if(startAddr >= efuse_max_available_len) + { + bRet = _FALSE; + break; + } + + if(efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data!=0xFF)) + { + if(EXT_HEADER(efuse_data)) + { + cur_header = efuse_data; + startAddr++; + efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); + if(ALL_WORDS_DISABLED(efuse_data)) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Error condition, all words disabled")); + bRet = _FALSE; + break; + } + else + { + curPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); + curPkt.word_en = efuse_data & 0x0F; + } + } + else + { + cur_header = efuse_data; + curPkt.offset = (cur_header>>4) & 0x0F; + curPkt.word_en = cur_header & 0x0F; + } + + curPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en); + // if same header is found but no data followed + // write some part of data followed by the header. + if( (curPkt.offset == pTargetPkt->offset) && + (!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr+1, bPseudoTest)) && + wordEnMatched(pTargetPkt, &curPkt, &matched_wden) ) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("Need to partial write data by the previous wrote header\n")); + // Here to write partial data + badworden = Efuse_WordEnableDataWrite(pAdapter, startAddr+1, matched_wden, pTargetPkt->data, bPseudoTest); + if(badworden != 0x0F) + { + u32 PgWriteSuccess=0; + // if write fail on some words, write these bad words again + if(efuseType == EFUSE_WIFI) + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + else + PgWriteSuccess = hal_EfusePgPacketWrite_BT(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + + if(!PgWriteSuccess) + { + bRet = _FALSE; // write fail, return + break; + } + } + // partial write ok, update the target packet for later use + for(i=0; i<4; i++) + { + if((matched_wden & (0x1<word_en |= (0x1<word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); + } + // read from next header + startAddr = startAddr + (curPkt.word_cnts*2) +1; + } + else + { + // not used header, 0xff + *pAddr = startAddr; + //RTPRINT(FEEPROM, EFUSE_PG, ("Started from unused header offset=%d\n", startAddr)); + bRet = _TRUE; + break; + } + } + return bRet; +} + +static BOOLEAN +hal_EfusePgPacketWrite_BT( + IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN BOOLEAN bPseudoTest + ) +{ + PGPKT_STRUCT targetPkt; + u16 startAddr=0; + u8 efuseType=EFUSE_BT; + + if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest)) + return _FALSE; + + hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); + + if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + return _TRUE; +} + +static BOOLEAN +hal_EfusePgPacketWrite_8723( + IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *pData, + IN BOOLEAN bPseudoTest + ) +{ + PGPKT_STRUCT targetPkt; + u16 startAddr=0; + u8 efuseType=EFUSE_WIFI; + + if(!hal_EfusePgCheckAvailableAddr(pAdapter, efuseType, bPseudoTest)) + return _FALSE; + + hal_EfuseConstructPGPkt(offset, word_en, pData, &targetPkt); + + if(!hal_EfusePartialWriteCheck(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + if(!hal_EfusePgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) + return _FALSE; + + return _TRUE; +} + +static int +hal_EfusePgPacketWrite_8192C(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + u8 WriteState = PG_STATE_HEADER; + + int bContinual = _TRUE,bDataEmpty=_TRUE, bResult = _TRUE; + u16 efuse_addr = 0; + u8 efuse_data; + + u8 pg_header = 0; + + u8 tmp_word_cnts=0,target_word_cnts=0; + u8 tmp_header,match_word_en,tmp_word_en; + + PGPKT_STRUCT target_pkt; + PGPKT_STRUCT tmp_pkt; + + u8 originaldata[sizeof(u8)*8]; + u8 tmpindex = 0,badworden = 0x0F; + + static int repeat_times = 0; + u8 efuseType=EFUSE_WIFI; + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // So we have to prevent unexpected data string connection, which will cause + // incorrect data auto-load from HW. The total size is equal or smaller than 498bytes + // (i.e., offset 0~497, and dummy 1bytes) expected after CP test. + // 2009.02.19. + // + if( Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) + { + //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfusePgPacketWrite_8192C(), over size\n")); + return _FALSE; + } + + // Init the 8 bytes content as 0xff + target_pkt.offset = offset; + target_pkt.word_en= word_en; + + _rtw_memset((PVOID)target_pkt.data, 0xFF, sizeof(u8)*8); + + efuse_WordEnableDataRead(word_en,data,target_pkt.data); + target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en); + + //efuse_reg_ctrl(pAdapter,_TRUE);//power on + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE Power ON\n")); + + // + // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. + // So we have to prevent unexpected data string connection, which will cause + // incorrect data auto-load from HW. Dummy 1bytes is additional. + // 2009.02.19. + // + while( bContinual && (efuse_addr < (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) ) + { + + if(WriteState==PG_STATE_HEADER) + { + bDataEmpty=_TRUE; + badworden = 0x0F; + //************ so ******************* + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER\n")); + if ( efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest) && + (efuse_data!=0xFF)) + { + tmp_header = efuse_data; + + tmp_pkt.offset = (tmp_header>>4) & 0x0F; + tmp_pkt.word_en = tmp_header & 0x0F; + tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en); + + //************ so-1 ******************* + if(tmp_pkt.offset != target_pkt.offset) + { + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + #if (EFUSE_ERROE_HANDLE == 1) + WriteState = PG_STATE_HEADER; + #endif + } + else + { + //************ so-2 ******************* + for(tmpindex=0 ; tmpindex<(tmp_word_cnts*2) ; tmpindex++) + { + if(efuse_OneByteRead(pAdapter, (efuse_addr+1+tmpindex) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)){ + bDataEmpty = _FALSE; + } + } + //************ so-2-1 ******************* + if(bDataEmpty == _FALSE) + { + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + #endif + } + else + {//************ so-2-2 ******************* + match_word_en = 0x0F; + if( !( (target_pkt.word_en&BIT0)|(tmp_pkt.word_en&BIT0) )) + { + match_word_en &= (~BIT0); + } + if( !( (target_pkt.word_en&BIT1)|(tmp_pkt.word_en&BIT1) )) + { + match_word_en &= (~BIT1); + } + if( !( (target_pkt.word_en&BIT2)|(tmp_pkt.word_en&BIT2) )) + { + match_word_en &= (~BIT2); + } + if( !( (target_pkt.word_en&BIT3)|(tmp_pkt.word_en&BIT3) )) + { + match_word_en &= (~BIT3); + } + + //************ so-2-2-A ******************* + if((match_word_en&0x0F)!=0x0F) + { + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1, tmp_pkt.word_en ,target_pkt.data, bPseudoTest); + + //************ so-2-2-A-1 ******************* + //############################ + if(0x0F != (badworden&0x0F)) + { + u8 reorg_offset = offset; + u8 reorg_worden=badworden; + Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest); + } + //############################ + + tmp_word_en = 0x0F; + if( (target_pkt.word_en&BIT0)^(match_word_en&BIT0) ) + { + tmp_word_en &= (~BIT0); + } + if( (target_pkt.word_en&BIT1)^(match_word_en&BIT1) ) + { + tmp_word_en &= (~BIT1); + } + if( (target_pkt.word_en&BIT2)^(match_word_en&BIT2) ) + { + tmp_word_en &= (~BIT2); + } + if( (target_pkt.word_en&BIT3)^(match_word_en&BIT3) ) + { + tmp_word_en &=(~BIT3); + } + + //************ so-2-2-A-2 ******************* + if((tmp_word_en&0x0F)!=0x0F){ + //reorganize other pg packet + //efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); + //=========================== + target_pkt.offset = offset; + target_pkt.word_en= tmp_word_en; + //=========================== + }else{ + bContinual = _FALSE; + } + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + #endif + } + else{//************ so-2-2-B ******************* + //reorganize other pg packet + efuse_addr = efuse_addr + (2*tmp_word_cnts) +1;//next pg packet addr + //=========================== + target_pkt.offset = offset; + target_pkt.word_en= target_pkt.word_en; + //=========================== + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + #endif + } + } + } + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-1\n")); + } + else //************ s1: header == oxff ******************* + { + pg_header = ((target_pkt.offset << 4)&0xf0) |target_pkt.word_en; + + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); + + if(tmp_header == pg_header) + { //************ s1-1******************* + WriteState = PG_STATE_DATA; + } + #if (EFUSE_ERROE_HANDLE == 1) + else if(tmp_header == 0xFF){//************ s1-3: if Write or read func doesn't work ******************* + //efuse_addr doesn't change + WriteState = PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + } + #endif + else + {//************ s1-2 : fixed the header procedure ******************* + tmp_pkt.offset = (tmp_header>>4) & 0x0F; + tmp_pkt.word_en= tmp_header & 0x0F; + tmp_word_cnts = Efuse_CalculateWordCnts(tmp_pkt.word_en); + + //************ s1-2-A :cover the exist data ******************* + //memset(originaldata,0xff,sizeof(UINT8)*8); + _rtw_memset((PVOID)originaldata, 0xff, sizeof(u8)*8); + + if(Efuse_PgPacketRead( pAdapter, tmp_pkt.offset,originaldata, bPseudoTest)) + { //check if data exist + //efuse_reg_ctrl(pAdapter,_TRUE);//power on + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,tmp_pkt.word_en,originaldata, bPseudoTest); + //############################ + if(0x0F != (badworden&0x0F)) + { + u8 reorg_offset = tmp_pkt.offset; + u8 reorg_worden=badworden; + Efuse_PgPacketWrite(pAdapter,reorg_offset,reorg_worden,originaldata, bPseudoTest); + efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); + } + //############################ + else{ + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + } + } + //************ s1-2-B: wrong address******************* + else + { + efuse_addr = efuse_addr + (tmp_word_cnts*2) +1; //Next pg_packet + } + + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + #endif + + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-2\n")); + } + + } + + } + //write data state + else if(WriteState==PG_STATE_DATA) + { //************ s1-1 ******************* + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_DATA\n")); + badworden = 0x0f; + badworden = Efuse_WordEnableDataWrite(pAdapter,efuse_addr+1,target_pkt.word_en,target_pkt.data, bPseudoTest); + if((badworden&0x0F)==0x0F) + { //************ s1-1-A ******************* + bContinual = _FALSE; + } + else + {//reorganize other pg packet //************ s1-1-B ******************* + efuse_addr = efuse_addr + (2*target_word_cnts) +1;//next pg packet addr + + //=========================== + target_pkt.offset = offset; + target_pkt.word_en= badworden; + target_word_cnts = Efuse_CalculateWordCnts(target_pkt.word_en); + //=========================== + #if (EFUSE_ERROE_HANDLE == 1) + WriteState=PG_STATE_HEADER; + repeat_times++; + if(repeat_times>EFUSE_REPEAT_THRESHOLD_){ + bContinual = _FALSE; + bResult = _FALSE; + } + #endif + //RTPRINT(FEEPROM, EFUSE_PG, ("EFUSE PG_STATE_HEADER-3\n")); + } + } + } + + if(efuse_addr >= (EFUSE_REAL_CONTENT_LEN-EFUSE_OOB_PROTECT_BYTES)) + { + //RT_TRACE(COMP_EFUSE, DBG_LOUD, ("hal_EfusePgPacketWrite_8192C(): efuse_addr(%#x) Out of size!!\n", efuse_addr)); + } + //efuse_reg_ctrl(pAdapter,_FALSE);//power off + + return _TRUE; +} + +static int +Hal_EfusePgPacketWrite_Pseudo(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret; + + ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest); + + return ret; +} + +static int +Hal_EfusePgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret=0; + + if(IS_HARDWARE_TYPE_8192C(pAdapter)) + { + ret = hal_EfusePgPacketWrite_8192C(pAdapter, offset, word_en, data, bPseudoTest); + } + else if(IS_HARDWARE_TYPE_8723(pAdapter)) + { + ret = hal_EfusePgPacketWrite_8723(pAdapter, offset, word_en, data, bPseudoTest); + } + + return ret; +} + +static int +rtl8192c_Efuse_PgPacketWrite(IN PADAPTER pAdapter, + IN u8 offset, + IN u8 word_en, + IN u8 *data, + IN BOOLEAN bPseudoTest) +{ + int ret; + + if(bPseudoTest) + { + ret = Hal_EfusePgPacketWrite_Pseudo(pAdapter, offset, word_en, data, bPseudoTest); + } + else + { + ret = Hal_EfusePgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest); + } + return ret; +} + +VOID +rtl8192c_EfuseParseIDCode( + IN PADAPTER pAdapter, + IN u8 *hwinfo + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u16 i,EEPROMId; + + // Checl 0x8129 again for making sure autoload status!! + EEPROMId = *((u16 *)&hwinfo[0]); + if( le16_to_cpu(EEPROMId) != RTL_EEPROM_ID) + { + DBG_8192C("EEPROM ID(%#x) is invalid!!\n", EEPROMId); + pEEPROM->bautoload_fail_flag = _TRUE; + } + else + { + pEEPROM->bautoload_fail_flag = _FALSE; + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("EEPROM ID = 0x%4x\n", EEPROMId)); +} + +void rtl8192c_read_chip_version(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + pHalData->VersionID = rtl8192c_ReadChipVersion(pAdapter); +} + +void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc) +{ + pHalFunc->free_hal_data = &rtl8192c_free_hal_data; + + pHalFunc->dm_init = &rtl8192c_init_dm_priv; + pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv; + pHalFunc->read_chip_version = &rtl8192c_read_chip_version; + + pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C; + pHalFunc->set_channel_handler = &PHY_SwChnl8192C; + + pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog; + + pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid; + +#ifdef CONFIG_ANTENNA_DIVERSITY + pHalFunc->SwAntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C; + pHalFunc->SwAntDivCompareHandler = &SwAntDivCompare8192C; +#endif + + pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg; + pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg; + pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg; + pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg; + + //Efuse related function + pHalFunc->EfusePowerSwitch = &rtl8192c_EfusePowerSwitch; + pHalFunc->ReadEFuse = &rtl8192c_ReadEFuse; + pHalFunc->EFUSEGetEfuseDefinition = &rtl8192c_EFUSE_GetEfuseDefinition; + pHalFunc->EfuseGetCurrentSize = &rtl8192c_EfuseGetCurrentSize; + pHalFunc->Efuse_PgPacketRead = &rtl8192c_Efuse_PgPacketRead; + pHalFunc->Efuse_PgPacketWrite = &rtl8192c_Efuse_PgPacketWrite; + pHalFunc->Efuse_WordEnableDataWrite = &rtl8192c_Efuse_WordEnableDataWrite; + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + pHalFunc->sreset_init_value = &rtl8192c_sreset_init_value; + pHalFunc->sreset_reset_value = &rtl8192c_sreset_reset_value; + pHalFunc->silentreset = &rtl8192c_silentreset_for_specific_platform; + pHalFunc->sreset_xmit_status_check = &rtl8192c_sreset_xmit_status_check; + pHalFunc->sreset_linked_status_check = &rtl8192c_sreset_linked_status_check; + pHalFunc->sreset_get_wifi_status = &rtl8192c_sreset_get_wifi_status; +#endif + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_mp.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_mp.c new file mode 100755 index 000000000000..ef0b7bbc592b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_mp.c @@ -0,0 +1,1234 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RTW_MP_C_ + +#include + +#ifdef CONFIG_RTL8712 +#include +#endif +#ifdef CONFIG_RTL8192C +#include +#endif + +#ifdef CONFIG_MP_INCLUDED + +#include + + +s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + if (!netif_running(padapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: interface not opened!\n")); + return _FAIL; + } + + if (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n")); + return _FAIL; + } + + if (enable) + pdmpriv->TxPowerTrackControl = _TRUE; + else + pdmpriv->TxPowerTrackControl = _FALSE; + + return _SUCCESS; +} + +void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + *enable = pdmpriv->TxPowerTrackControl; +} + +static void Hal_disable_dm(PADAPTER padapter) +{ + u8 v8; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + + //3 1. disable firmware dynamic mechanism + // disable Power Training, Rate Adaptive + v8 = rtw_read8(padapter, REG_BCN_CTRL); + v8 &= ~EN_BCN_FUNCTION; + rtw_write8(padapter, REG_BCN_CTRL, v8); + + //3 2. disable driver dynamic mechanism + // disable Dynamic Initial Gain + // disable High Power + // disable Power Tracking + Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); + + // enable APK, LCK and IQK but disable power tracking + pdmpriv->TxPowerTrackControl = _FALSE; + Switch_DM_Func(padapter, DYNAMIC_FUNC_SS, _TRUE); +} + +/*----------------------------------------------------------------------------- + * Function: mpt_SwitchRfSetting + * + * Overview: Change RF Setting when we siwthc channel/rate/BW for MP. + * + * Input: IN PADAPTER pAdapter + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series. + * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3. + * + *---------------------------------------------------------------------------*/ +void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mp_priv *pmp = &pAdapter->mppriv; + u8 ChannelToSw = pmp->channel, eRFPath = RF90_PATH_A; + u8 ulRateIdx = pmp->rateidx; + u8 ulbandwidth = pmp->bandwidth; + PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); + BOOLEAN bInteralPA = _FALSE; + u32 value = 0; + printk("mpt_switch rate=%d",ulRateIdx); +#ifdef CONFIG_USB_HCI + if (IS_92C_SERIAL(pHalData->VersionID)) + { + //92CE-VAU (92cu mCard) + if( BOARD_MINICARD == pHalData->BoardType) + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else //OFDM~MCS rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); + } + } + else //92CU dongle + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else if (ChannelToSw & BIT0) // OFDM rate, odd number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + else if (ChannelToSw == 4) // OFDM rate, even number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200); + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe0004); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709); + rtw_msleep_os(1); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333); + } + else if(ChannelToSw == 10) // OFDM rate, even number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28000); + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000A); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x709); + rtw_msleep_os(1); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x7B333); + } + else if(ChannelToSw == 12) // OFDM rate, even number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x28200); + write_rfreg(pAdapter, 0, RF_SYN_G6, 0xe000C); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x50B); + rtw_msleep_os(1); + write_rfreg(pAdapter, 0, RF_SYN_G7, 0x4B333); + } + else + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + } + } + else //88cu + { + + //mcard interface + + if( BOARD_MINICARD == pHalData->BoardType) + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else //OFDM~MCS rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + + if(ChannelToSw == 6 || ChannelToSw == 8) + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F); + } + else + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x20); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x20); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30); + } + } + else + { + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else if (ChannelToSw & BIT0) // OFDM rate, odd number channel + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F200); + } + else + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); + } + } + } + +#else //PCI_INTERFACE + + if (ulRateIdx < MPT_RATE_6M) // CCK rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x0F400); + } + else //OFDM~MCS rate + { + write_rfreg(pAdapter, 0, RF_SYN_G2, 0x4F000); + } + //88CE + if(!IS_92C_SERIAL(pHalData->VersionID)) + { + if(ChannelToSw == 6 || ChannelToSw == 8) + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, 0x22); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, 0x4F); + } + else + { + write_bbreg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0, pMptCtx->backup0xc50); + write_bbreg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0, pMptCtx->backup0xc58); + write_bbreg(pAdapter, rOFDM0_RxDetector1, bMaskByte0, pMptCtx->backup0xc30); + } + } + +#endif //CONFIG_USB_HCI + + +} +/*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/ + +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ +void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) +{ + u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0; + u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12; + u8 i; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + // get current cck swing value and check 0xa22 & 0xa23 later to match the table. + CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord); + + if (!bInCH14) + { + // Readback the current bb cck swing value and compare with the table to + // get the current swing index + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ; + + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] + + (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ; + } + else + { + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) && + (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) + { + CCKSwingIndex = i; +// RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n", +// (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex)); + break; + } + } + + //Write 0xa22 0xa23 + TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] + + (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ; + + //Write 0xa24 ~ 0xa27 + TempVal2 = 0; + TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] + + (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) + + (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+ + (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24); + + //Write 0xa28 0xa29 + TempVal3 = 0; + TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] + + (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ; + } + + write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal); + write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2); + write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3); +} + +void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven) +{ + s32 TempCCk; + u8 CCK_index, CCK_index_old; + u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even + u8 TimeOut = 100; + s32 i = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + + if (!IS_92C_SERIAL(pHalData->VersionID) || !IS_NORMAL_CHIP(pHalData->VersionID)) + return; +#if 0 + while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE) + { + PlatformSleepUs(100); + TimeOut--; + if(TimeOut <= 0) + { + RTPRINT(FINIT, INIT_TxPower, + ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" )); + break; + } + } +#endif + if (beven && !pMptCtx->bMptIndexEven) //odd->even + { + Action = 2; + pMptCtx->bMptIndexEven = _TRUE; + } + else if (!beven && pMptCtx->bMptIndexEven) //even->odd + { + Action = 1; + pMptCtx->bMptIndexEven = _FALSE; + } + + if (Action != 0) + { + //Query CCK default setting From 0xa24 + TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK; + for (i = 0; i < CCK_TABLE_SIZE; i++) + { + if (pHalData->dmpriv.bCCKinCH14) + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + else + { + if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE) + { + CCK_index_old = (u8) i; +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n", +// rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14)); + break; + } + } + } + + if (Action == 1) + CCK_index = CCK_index_old - 1; + else + CCK_index = CCK_index_old + 1; + +// RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n", +// CCK_index)); + + //Adjust CCK according to gain index + if (!pHalData->dmpriv.bCCKinCH14) { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]); + } else { + rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]); + rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]); + rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]); + rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]); + rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]); + rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]); + rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]); + rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]); + } + } +#if 0 + RTPRINT(FINIT, INIT_TxPower, + ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20))); + + PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE); +#endif +} +/*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/ + +/* + * SetChannel + * Description + * Use H2C command to change channel, + * not only modify rf register, but also other setting need to be done. + */ +void Hal_SetChannel(PADAPTER pAdapter) +{ +#if 0 + struct mp_priv *pmp = &pAdapter->mppriv; + +// SelectChannel(pAdapter, pmp->channel); + set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth); +#else + u8 eRFPath; + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct mp_priv *pmp = &pAdapter->mppriv; + u8 channel = pmp->channel; + u8 bandwidth = pmp->bandwidth; + u8 rate = pmp->rateidx; + + + // set RF channel register + for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) + { + if(IS_HARDWARE_TYPE_8192D(pAdapter)) + _write_rfreg(pAdapter, (RF90_RADIO_PATH_E)eRFPath, rRfChannel, 0xFF, channel); + else + _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel); + } + Hal_mpt_SwitchRfSetting(pAdapter); + + SelectChannel(pAdapter, channel); + + if (pHalData->CurrentChannel == 14 && !pHalData->dmpriv.bCCKinCH14) { + pHalData->dmpriv.bCCKinCH14 = _TRUE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + } + else if (pHalData->CurrentChannel != 14 && pHalData->dmpriv.bCCKinCH14) { + pHalData->dmpriv.bCCKinCH14 = _FALSE; + Hal_MPT_CCKTxPowerAdjust(pAdapter, pHalData->dmpriv.bCCKinCH14); + } +#if 0 +//#ifdef CONFIG_USB_HCI + // Georgia add 2009-11-17, suggested by Edlu , for 8188CU ,46 PIN + if (!IS_92C_SERIAL(pHalData->VersionID) && !IS_NORMAL_CHIP(pHalData->VersionID)) { + mpt_AdjustRFRegByRateByChan92CU(pAdapter, rate, pHalData->CurrentChannel, bandwidth); + } +#endif + +#endif +} + +/* + * Notice + * Switch bandwitdth may change center frequency(channel) + */ +void Hal_SetBandwidth(PADAPTER pAdapter) +{ + struct mp_priv *pmp = &pAdapter->mppriv; + + + SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset); + Hal_mpt_SwitchRfSetting(pAdapter); +} + +void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 tmpval = 0; + + + // rf-A cck tx power + write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]); + tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A]; + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); + + // rf-B cck tx power + write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]); + tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B]; + write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); + + RT_TRACE(_module_mp_, _drv_notice_, + ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n", + TxPower[RF_PATH_A], TxPower[RF_PATH_B])); +} + +void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower) +{ + u32 TxAGC = 0; + u8 tmpval = 0; + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + // HT Tx-rf(A) + tmpval = TxPower[RF_PATH_A]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC); + + if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) + { + if (tmpval > pMptCtx->APK_bound[RF_PATH_A]) + write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][0]); + else + write_rfreg(pAdapter, RF_PATH_A, 0xe, pHalData->dmpriv.APKoutput[0][1]); + } + + // HT Tx-rf(B) + tmpval = TxPower[RF_PATH_B]; + TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval; + + write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC); + write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC); + + if (pHalData->dmpriv.bAPKdone && !IS_NORMAL_CHIP(pHalData->VersionID)) + { + if (tmpval > pMptCtx->APK_bound[RF_PATH_B]) + write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][0]); + else + write_rfreg(pAdapter, RF_PATH_B, 0xe, pHalData->dmpriv.APKoutput[1][1]); + } + + RT_TRACE(_module_mp_, _drv_notice_, + ("-SetOFDMTxPower: A[0x%02x] B[0x%02x]\n", + TxPower[RF_PATH_A], TxPower[RF_PATH_B])); +} + +void Hal_SetAntennaPathPower(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 TxPowerLevel[MAX_RF_PATH_NUMS]; + u8 rfPath; + + TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx; + TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + switch (pHalData->rf_chip) + { + case RF_8225: + case RF_8256: + case RF_6052: + Hal_SetCCKTxPower(pAdapter, TxPowerLevel); + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); + Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); + break; + + default: + break; + } +} + +void Hal_SetTxPower(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 TxPower = pAdapter->mppriv.txpoweridx; + u8 TxPowerLevel[MAX_RF_PATH_NUMS]; + u8 rf, rfPath; + + for (rf = 0; rf < MAX_RF_PATH_NUMS; rf++) { + TxPowerLevel[rf] = TxPower; + } + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + switch (pHalData->rf_chip) + { + // 2008/09/12 MH Test only !! We enable the TX power tracking for MP!!!!! + // We should call normal driver API later!! + case RF_8225: + case RF_8256: + case RF_6052: + Hal_SetCCKTxPower(pAdapter, TxPowerLevel); + if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate + Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0); + Hal_SetOFDMTxPower(pAdapter, TxPowerLevel); + break; + + default: + break; + } + +// SetCCKTxPower(pAdapter, TxPower); +// SetOFDMTxPower(pAdapter, TxPower); +} + +void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset) +{ + u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC; + + TxAGCOffset_B = (ulTxAGCOffset&0x000000ff); + TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8); + TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16); + + tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B); + write_bbreg(pAdapter, rFPGA0_TxGainStage, + (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC); +} + +void Hal_SetDataRate(PADAPTER pAdapter) +{ + Hal_mpt_SwitchRfSetting(pAdapter); +} + +#if !defined (CONFIG_RTL8192C) && !defined (CONFIG_RTL8192D) +/*------------------------------Define structure----------------------------*/ +typedef struct _R_ANTENNA_SELECT_OFDM { + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK { + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; +#endif + +void Hal_SetAntenna(PADAPTER pAdapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */ + R_ANTENNA_SELECT_CCK *p_cck_txrx; + + u8 r_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0; + u8 chgTx = 0, chgRx = 0; + u32 r_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0; + + + p_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val; + p_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val; + + p_ofdm_tx->r_ant_ht1 = 0x1; + p_ofdm_tx->r_ant_ht2 = 0x2; // Second TX RF path is A + p_ofdm_tx->r_ant_non_ht = 0x3; // 0x1+0x2=0x3 + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + p_ofdm_tx->r_tx_antenna = 0x1; + r_ofdm_tx_en_val = 0x1; + p_ofdm_tx->r_ant_l = 0x1; + p_ofdm_tx->r_ant_ht_s1 = 0x1; + p_ofdm_tx->r_ant_non_ht_s1 = 0x1; + p_cck_txrx->r_ccktx_enable = 0x8; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF A=TX and B as standby +// if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); + write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1); + r_ofdm_tx_en_val = 0x3; + + // Power save + //cosa r_ant_select_ofdm_val = 0x11111111; + + // We need to close RFB by SW control + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 0); + } + } + break; + + case ANTENNA_B: + p_ofdm_tx->r_tx_antenna = 0x2; + r_ofdm_tx_en_val = 0x2; + p_ofdm_tx->r_ant_l = 0x2; + p_ofdm_tx->r_ant_ht_s1 = 0x2; + p_ofdm_tx->r_ant_non_ht_s1 = 0x2; + p_cck_txrx->r_ccktx_enable = 0x4; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF A as standby + //if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); +// r_ofdm_tx_en_val = 0x3; + + // Power save + //cosa r_ant_select_ofdm_val = 0x22222222; + + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table. + // 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control + if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); + } + } + break; + + case ANTENNA_AB: // For 8192S + p_ofdm_tx->r_tx_antenna = 0x3; + r_ofdm_tx_en_val = 0x3; + p_ofdm_tx->r_ant_l = 0x3; + p_ofdm_tx->r_ant_ht_s1 = 0x3; + p_ofdm_tx->r_ant_non_ht_s1 = 0x3; + p_cck_txrx->r_ccktx_enable = 0xC; + chgTx = 1; + + // From SD3 Willis suggestion !!! Set RF B as standby + //if (IS_HARDWARE_TYPE_8192S(pAdapter)) + { + PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2); + PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2); + + // Disable Power save + //cosa r_ant_select_ofdm_val = 0x3321333; +#if 0 + // 2008/10/31 MH From SD3 Willi's suggestion. We must read RFA 2T table. + if ((pHalData->VersionID == VERSION_8192S_ACUT)) // For RTL8192SU A-Cut only, by Roger, 2008.11.07. + { + mpt_RFConfigFromPreParaArrary(pAdapter, 1, RF90_PATH_A); + } +#endif + // 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0); +// PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1); + } + } + break; + + default: + break; + } + + // + // r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D + // r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D + // r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D + // + switch (pAdapter->mppriv.antenna_rx) + { + case ANTENNA_A: + r_rx_antenna_ofdm = 0x1; // A + p_cck_txrx->r_cckrx_enable = 0x0; // default: A + p_cck_txrx->r_cckrx_enable_2 = 0x0; // option: A + chgRx = 1; + break; + + case ANTENNA_B: + r_rx_antenna_ofdm = 0x2; // B + p_cck_txrx->r_cckrx_enable = 0x1; // default: B + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option: B + chgRx = 1; + break; + + case ANTENNA_AB: + r_rx_antenna_ofdm = 0x3; // AB + p_cck_txrx->r_cckrx_enable = 0x0; // default:A + p_cck_txrx->r_cckrx_enable_2 = 0x1; // option:B + chgRx = 1; + break; + + default: + break; + } + + if (chgTx && chgRx) + { + switch(pHalData->rf_chip) + { + case RF_8225: + case RF_8256: + case RF_6052: + //r_ant_sel_cck_val = r_ant_select_cck_val; + PHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val); //OFDM Tx + PHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val); //OFDM Tx + PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx + PHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm); //OFDM Rx + PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val);//r_ant_sel_cck_val); //CCK TxRx + + break; + + default: + break; + } + } + + RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n")); +} + +s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + + if (!netif_running(pAdapter->pnetdev)) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n")); + return _FAIL; + } + + if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) { + RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n")); + return _FAIL; + } + + target_ther &= 0xff; + if (target_ther < 0x07) + target_ther = 0x07; + else if (target_ther > 0x1d) + target_ther = 0x1d; + + pHalData->EEPROMThermalMeter = target_ther; + + return _SUCCESS; +} + +void Hal_TriggerRFThermalMeter(PADAPTER pAdapter) +{ + + write_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x60); // 0x24: RF Reg[6:5] + +// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" )); +} + +u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter) +{ + u32 ThermalValue = 0; + + ThermalValue = _read_rfreg(pAdapter, RF_PATH_A, RF_T_METER, 0x1F); // 0x24: RF Reg[4:0] +// RT_TRACE(_module_mp_, _drv_alert_, ("ThermalValue = 0x%x\n", ThermalValue)); + return (u8)ThermalValue; +} + +void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value) +{ +#if 0 + fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER); + rtw_msleep_os(1000); + fw_cmd_data(pAdapter, value, 1); + *value &= 0xFF; +#else + + Hal_TriggerRFThermalMeter(pAdapter); + rtw_msleep_os(1000); + *value = Hal_ReadRFThermalMeter(pAdapter); +#endif +} + +void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + pAdapter->mppriv.MptCtx.bSingleCarrier = bStart; + if (bStart)// Start Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + + { + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + } + // 4. Turn On Single Carrier Tx and turn off the other test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bEnable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); +#ifdef CONFIG_RTL8192C + // 5. Disable TX power saving at STF & LLTF + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 1); +#endif + } + else// Stop Single Carrier. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test stop\n")); + + // Turn off all test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); +#ifdef CONFIG_RTL8192C + // Cancel disable TX power saving at STF&LLTF + write_bbreg(pAdapter, rOFDM1_LSTF, BIT22, 0); +#endif + //Delay 10 ms //delay_ms(10); + rtw_msleep_os(10); + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } +} + + +void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + u8 rfPath; + + switch (pAdapter->mppriv.antenna_tx) + { + case ANTENNA_A: + default: + rfPath = RF_PATH_A; + break; + case ANTENNA_B: + rfPath = RF_PATH_B; + break; + case ANTENNA_C: + rfPath = RF_PATH_C; + break; + } + + pAdapter->mppriv.MptCtx.bSingleTone = bStart; + if (bStart)// Start Single Tone. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test start\n")); + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0); + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0); + + if (is92C) + { + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x01); + rtw_usleep_os(100); + if (rfPath == RF_PATH_A) + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x10000); // PAD all on. + else if (rfPath == RF_PATH_B) + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x10000); // PAD all on. + } else { + write_rfreg(pAdapter, rfPath, 0x21, 0xd4000); + rtw_usleep_os(100); + } + + write_rfreg(pAdapter, rfPath, 0x00, 0x2001f); // PAD all on. + rtw_usleep_os(100); + } + else// Stop Single Tone. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleToneTx: test stop\n")); + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1); + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1); + + if (is92C) { + _write_rfreg(pAdapter, RF_PATH_A, 0x21, BIT19, 0x00); + rtw_usleep_os(100); + write_rfreg(pAdapter, RF_PATH_A, 0x00, 0x32d75); // PAD all on. + write_rfreg(pAdapter, RF_PATH_B, 0x00, 0x32d75); // PAD all on. + rtw_usleep_os(100); + } else { + write_rfreg(pAdapter, rfPath, 0x21, 0x54000); + rtw_usleep_os(100); + + write_rfreg(pAdapter, rfPath, 0x00, 0x30000); // PAD all on. + rtw_usleep_os(100); + } + } + +} + + +void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) +{ + pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart; + if (bStart) // Start Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) + { + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting + + //Set CCK Tx Test Rate + //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate); + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps + } + } + else// Stop Carrier Suppression. + { + RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n")); + //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B) + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) { + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + } + //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n"); +} + +void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + u32 cckrate; + + if (bStart) + { + RT_TRACE(_module_mp_, _drv_alert_, + ("SetCCKContinuousTx: test start\n")); + + // 1. if CCK block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on + + //Turn Off All Test Mode + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + //Set CCK Tx Test Rate + #if 0 + switch(pAdapter->mppriv.rateidx) + { + case 2: + cckrate = 0; + break; + case 4: + cckrate = 1; + break; + case 11: + cckrate = 2; + break; + case 22: + cckrate = 3; + break; + default: + cckrate = 0; + break; + } + #else + cckrate = pAdapter->mppriv.rateidx; + #endif + write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate); + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting + +#ifdef CONFIG_RTL8192C + // Patch for CCK 11M waveform + if (cckrate == MPT_RATE_1M) + write_bbreg(pAdapter, 0xA71, BIT(6), bDisable); + else + write_bbreg(pAdapter, 0xA71, BIT(6), bEnable); +#endif + + } + else { + RT_TRACE(_module_mp_, _drv_info_, + ("SetCCKContinuousTx: test stop\n")); + + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting + + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + + pAdapter->mppriv.MptCtx.bCckContTx = bStart; + pAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE; +}/* mpt_StartCckContTx */ + +void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + if (bStart) { + RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n")); + // 1. if OFDM block on? + if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn)) + write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on + { + + // 2. set CCK test mode off, set to CCK normal mode + write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable); + + // 3. turn on scramble setting + write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); + } + // 4. Turn On Continue Tx and turn off the other test modes. + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + } else { + RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n")); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable); + write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable); + //Delay 10 ms + rtw_msleep_os(10); + //BB Reset + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0); + write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1); + } + + pAdapter->mppriv.MptCtx.bCckContTx = _FALSE; + pAdapter->mppriv.MptCtx.bOfdmContTx = bStart; +}/* mpt_StartOfdmContTx */ + +void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart) +{ +#if 0 + // ADC turn off [bit24-21] adc port0 ~ port1 + if (bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF); + rtw_usleep_os(100); + } +#endif + RT_TRACE(_module_mp_, _drv_info_, + ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx)); + + pAdapter->mppriv.MptCtx.bStartContTx = bStart; + if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) + { + Hal_SetCCKContinuousTx(pAdapter, bStart); + } + else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) && + (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15)) + { + Hal_SetOFDMContinuousTx(pAdapter, bStart); + } +#if 0 + // ADC turn on [bit24-21] adc port0 ~ port1 + if (!bStart) { + write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000); + } +#endif +} + +#endif // CONFIG_MP_INCLUDE diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c new file mode 100755 index 000000000000..27a03d54d848 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_phycfg.c @@ -0,0 +1,5409 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + + Module: rtl8192c_phycfg.c + + Note: Merge 92SE/SU PHY config as below + 1. BB register R/W API + 2. RF register R/W API + 3. Initial BB/RF/MAC config by reading BB/MAC/RF txt. + 3. Power setting API + 4. Channel switch API + 5. Initial gain switch API. + 6. Other BB/MAC/RF API. + + Function: PHY: Extern function, phy: local function + + Export: PHY_FunctionName + + Abbrev: NONE + + History: + Data Who Remark + 08/08/2008 MHC 1. Port from 9x series phycfg.c + 2. Reorganize code arch and ad description. + 3. Collect similar function. + 4. Seperate extern/local API. + 08/12/2008 MHC We must merge or move USB PHY relative function later. + 10/07/2008 MHC Add IQ calibration for PHY.(Only 1T2R mode now!!!) + 11/06/2008 MHC Add TX Power index PG file to config in 0xExx register + area to map with EEPROM/EFUSE tx pwr index. + +******************************************************************************/ +#define _HAL_8192C_PHYCFG_C_ + +#include +#include +#include +#include + +#include + + +/*---------------------------Define Local Constant---------------------------*/ +/* Channel switch:The size of command tables for switch channel*/ +#define MAX_PRECMD_CNT 16 +#define MAX_RFDEPENDCMD_CNT 16 +#define MAX_POSTCMD_CNT 16 + +#define MAX_DOZE_WAITING_TIMES_9x 64 + +/*---------------------------Define Local Constant---------------------------*/ + + +/*------------------------Define global variable-----------------------------*/ + +/*------------------------Define local variable------------------------------*/ + + +/*--------------------Define export function prototype-----------------------*/ +// Please refer to header file +/*--------------------Define export function prototype-----------------------*/ + +/*----------------------------Function Body----------------------------------*/ +// +// 1. BB register R/W API +// + +/** +* Function: phy_CalculateBitShift +* +* OverView: Get shifted position of the BitMask +* +* Input: +* u4Byte BitMask, +* +* Output: none +* Return: u4Byte Return the shift bit bit position of the mask +*/ +static u32 +phy_CalculateBitShift( + u32 BitMask + ) +{ + u32 i; + + for(i=0; i<=31; i++) + { + if ( ((BitMask>>i) & 0x1 ) == 1) + break; + } + + return (i); +} + + +/** +* Function: PHY_QueryBBReg +* +* OverView: Read "sepcific bits" from BB register +* +* Input: +* PADAPTER Adapter, +* u4Byte RegAddr, //The target address to be readback +* u4Byte BitMask //The target bit position in the target address +* //to be readback +* Output: None +* Return: u4Byte Data //The readback register value +* Note: This function is equal to "GetRegSetting" in PHY programming guide +*/ +u32 +rtl8192c_PHY_QueryBBReg( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 ReturnValue = 0, OriginalValue, BitShift; + u16 BBWaitCounter = 0; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask)); + + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + ReturnValue = (OriginalValue & BitMask) >> BitShift; + + //RTPRINT(FPHY, PHY_BBR, ("BBR MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, OriginalValue)); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx), OriginalValue(%#lx)\n", RegAddr, BitMask, OriginalValue)); + + return (ReturnValue); + +} + + +/** +* Function: PHY_SetBBReg +* +* OverView: Write "Specific bits" to BB register (page 8~) +* +* Input: +* PADAPTER Adapter, +* u4Byte RegAddr, //The target address to be modified +* u4Byte BitMask //The target bit position in the target address +* //to be modified +* u4Byte Data //The new register value in the target bit position +* //of the target address +* +* Output: None +* Return: None +* Note: This function is equal to "PutRegSetting" in PHY programming guide +*/ + +VOID +rtl8192c_PHY_SetBBReg( + IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u16 BBWaitCounter = 0; + u32 OriginalValue, BitShift; + +#if (DISABLE_BB_RF == 1) + return; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); + + if(BitMask!= bMaskDWord){//if not "double word" write + OriginalValue = rtw_read32(Adapter, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + Data = ((OriginalValue & (~BitMask)) | (Data << BitShift)); + } + + rtw_write32(Adapter, RegAddr, Data); + + //RTPRINT(FPHY, PHY_BBW, ("BBW MASK=0x%lx Addr[0x%lx]=0x%lx\n", BitMask, RegAddr, Data)); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data)); + +} + + +// +// 2. RF register R/W API +// + +/*----------------------------------------------------------------------------- + * Function: phy_FwRFSerialRead() + * + * Overview: We support firmware to execute RF-R/W. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/21/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static u32 +phy_FwRFSerialRead( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset ) +{ + u32 retValue = 0; + //RT_ASSERT(FALSE,("deprecate!\n")); + return (retValue); + +} /* phy_FwRFSerialRead */ + + +/*----------------------------------------------------------------------------- + * Function: phy_FwRFSerialWrite() + * + * Overview: We support firmware to execute RF-R/W. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 01/21/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +static VOID +phy_FwRFSerialWrite( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data ) +{ + //RT_ASSERT(FALSE,("deprecate!\n")); +} + + +/** +* Function: phy_RFSerialRead +* +* OverView: Read regster from RF chips +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte Offset, //The target address to be read +* +* Output: None +* Return: u4Byte reback value +* Note: Threre are three types of serial operations: +* 1. Software serial write +* 2. Hardware LSSI-Low Speed Serial Interface +* 3. Hardware HSSI-High speed +* serial write. Driver need to implement (1) and (2). +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() +*/ +static u32 +phy_RFSerialRead( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset + ) +{ + u32 retValue = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + u32 NewOffset; + u32 tmplong,tmplong2; + u8 RfPiEnable=0; +#if 0 + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs + return retValue; + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs + return retValue; +#endif + // + // Make sure RF register offset is correct + // + Offset &= 0x3f; + + // + // Switch page for 8256 RF IC + // + NewOffset = Offset; + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RTPRINT(FPHY, PHY_RFR, ("phy_RFSerialRead return all one\n")); + // return 0xFFFFFFFF; + //} + + // For 92S LSSI Read RFLSSIRead + // For RF A/B write 0x824/82c(does not work in the future) + // We must use 0x824 for RF A and B to execute read trigger + tmplong = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord); + if(eRFPath == RF90_PATH_A) + tmplong2 = tmplong; + else + tmplong2 = PHY_QueryBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord); + + tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF + + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong&(~bLSSIReadEdge)); + rtw_udelay_os(10);// PlatformStallExecution(10); + + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, bMaskDWord, tmplong2); + rtw_udelay_os(100);//PlatformStallExecution(100); + + PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2, bMaskDWord, tmplong|bLSSIReadEdge); + rtw_udelay_os(10);//PlatformStallExecution(10); + + if(eRFPath == RF90_PATH_A) + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1, BIT8); + else if(eRFPath == RF90_PATH_B) + RfPiEnable = (u8)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1, BIT8); + + if(RfPiEnable) + { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi, bLSSIReadBackData); + //DBG_8192C("Readback from RF-PI : 0x%x\n", retValue); + } + else + { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF + retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack, bLSSIReadBackData); + //DBG_8192C("Readback from RF-SI : 0x%x\n", retValue); + } + //DBG_8192C("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rfLSSIReadBack, retValue); + + return retValue; + +} + + + +/** +* Function: phy_RFSerialWrite +* +* OverView: Write data to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte Offset, //The target address to be read +* u4Byte Data //The new register Data in the target bit position +* //of the target to be read +* +* Output: None +* Return: None +* Note: Threre are three types of serial operations: +* 1. Software serial write +* 2. Hardware LSSI-Low Speed Serial Interface +* 3. Hardware HSSI-High speed +* serial write. Driver need to implement (1) and (2). +* This function is equal to the combination of RF_ReadReg() and RFLSSIRead() + * + * Note: For RF8256 only + * The total count of RTL8256(Zebra4) register is around 36 bit it only employs + * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10]) + * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration + * programming guide" for more details. + * Thus, we define a sub-finction for RTL8526 register address conversion + * =========================================================== + * Register Mode RegCTL[1] RegCTL[0] Note + * (Reg00[12]) (Reg00[10]) + * =========================================================== + * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf) + * ------------------------------------------------------------------ + * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf) + * ------------------------------------------------------------------ + * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf) + * ------------------------------------------------------------------ + * + * 2008/09/02 MH Add 92S RF definition + * + * + * +*/ +static VOID +phy_RFSerialWrite( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data + ) +{ + u32 DataAndAddr = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; + u32 NewOffset; + +#if 0 + // We should check valid regs for RF_6052 case. + if(pHalData->RFChipID == RF_8225 && Offset > 0x24) //36 valid regs + return; + if(pHalData->RFChipID == RF_8256 && Offset > 0x2D) //45 valid regs + return; +#endif + + // 2009/06/17 MH We can not execute IO for power save or other accident mode. + //if(RT_CANNOT_IO(Adapter)) + //{ + // RTPRINT(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); + // return; + //} + + Offset &= 0x3f; + + // + // Shadow Update + // + //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); + + // + // Switch page for 8256 RF IC + // + NewOffset = Offset; + + // + // Put write addr in [5:0] and write data in [31:16] + // + //DataAndAddr = (Data<<16) | (NewOffset&0x3f); + DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF + + // + // Write Operation + // + PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); + //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr)); + +} + + +/** +* Function: PHY_QueryRFReg +* +* OverView: Query "Specific bits" to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte RegAddr, //The target address to be read +* u4Byte BitMask //The target bit position in the target address +* //to be read +* +* Output: None +* Return: u4Byte Readback value +* Note: This function is equal to "GetRFRegSetting" in PHY programming guide +*/ +u32 +rtl8192c_PHY_QueryRFReg( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask + ) +{ + u32 Original_Value, Readback_Value, BitShift; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u8 RFWaitCounter = 0; + //_irqL irqL; + +#if (DISABLE_BB_RF == 1) + return 0; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), BitMask(%#lx)\n", RegAddr, eRFPath,BitMask)); + +#ifdef CONFIG_USB_HCI + //PlatformAcquireMutex(&pHalData->mxRFOperate); +#else + //_enter_critical(&pHalData->rf_lock, &irqL); +#endif + + + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + + BitShift = phy_CalculateBitShift(BitMask); + Readback_Value = (Original_Value & BitMask) >> BitShift; + +#ifdef CONFIG_USB_HCI + //PlatformReleaseMutex(&pHalData->mxRFOperate); +#else + //_exit_critical(&pHalData->rf_lock, &irqL); +#endif + + + //RTPRINT(FPHY, PHY_RFR, ("RFR-%d MASK=0x%lx Addr[0x%lx]=0x%lx\n", eRFPath, BitMask, RegAddr, Original_Value));//BitMask(%#lx),BitMask, + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_QueryRFReg(): RegAddr(%#lx), eRFPath(%#x), Original_Value(%#lx)\n", + // RegAddr, eRFPath, Original_Value)); + + return (Readback_Value); +} + +/** +* Function: PHY_SetRFReg +* +* OverView: Write "Specific bits" to RF register (page 8~) +* +* Input: +* PADAPTER Adapter, +* RF90_RADIO_PATH_E eRFPath, //Radio path of A/B/C/D +* u4Byte RegAddr, //The target address to be modified +* u4Byte BitMask //The target bit position in the target address +* //to be modified +* u4Byte Data //The new register Data in the target bit position +* //of the target address +* +* Output: None +* Return: None +* Note: This function is equal to "PutRFRegSetting" in PHY programming guide +*/ +VOID +rtl8192c_PHY_SetRFReg( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data + ) +{ + + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //u1Byte RFWaitCounter = 0; + u32 Original_Value, BitShift; + //_irqL irqL; + +#if (DISABLE_BB_RF == 1) + return; +#endif + + //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + //RTPRINT(FINIT, INIT_RF, ("PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + + +#ifdef CONFIG_USB_HCI + //PlatformAcquireMutex(&pHalData->mxRFOperate); +#else + //_enter_critical(&pHalData->rf_lock, &irqL); +#endif + + + // RF data is 12 bits only + if (BitMask != bRFRegOffsetMask) + { + Original_Value = phy_RFSerialRead(Adapter, eRFPath, RegAddr); + BitShift = phy_CalculateBitShift(BitMask); + Data = ((Original_Value & (~BitMask)) | (Data<< BitShift)); + } + + phy_RFSerialWrite(Adapter, eRFPath, RegAddr, Data); + + + +#ifdef CONFIG_USB_HCI + //PlatformReleaseMutex(&pHalData->mxRFOperate); +#else + //_exit_critical(&pHalData->rf_lock, &irqL); +#endif + + //PHY_QueryRFReg(Adapter,eRFPath,RegAddr,BitMask); + //RT_TRACE(COMP_RF, DBG_TRACE, ("<---PHY_SetRFReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx), eRFPath(%#x)\n", + // RegAddr, BitMask, Data, eRFPath)); + +} + + +// +// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. +// + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigMACWithParaFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: The format of MACPHY_REG.txt is different from PHY and RF. + * [Register][Mask][Value] + *---------------------------------------------------------------------------*/ +static int +phy_ConfigMACWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigMACWithHeaderFile() + * + * Overview: This function read BB parameters from Header file we gen, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: The format of MACPHY_REG.txt is different from PHY and RF. + * [Register][Mask][Value] + *---------------------------------------------------------------------------*/ +static int +phy_ConfigMACWithHeaderFile( + IN PADAPTER Adapter +) +{ + u32 i = 0; + u32 ArrayLength = 0; + u32* ptrArray; + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //2008.11.06 Modified by tynli. + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read Rtl819XMACPHY_Array\n")); + ArrayLength = MAC_2T_ArrayLength; + ptrArray = Rtl819XMAC_Array; + + for(i = 0 ;i < ArrayLength;i=i+2){ // Add by tynli for 2 column + rtw_write8(Adapter, ptrArray[i], (u8)ptrArray[i+1]); + } + + return _SUCCESS; + +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_MACConfig8192C + * + * Overview: Condig MAC by header file or parameter file. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 08/12/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +int +PHY_MACConfig8192C( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + s8 *pszMACRegFile; + s8 sz88CMACRegFile[] = RTL8188C_PHY_MACREG; + s8 sz92CMACRegFile[] = RTL8192C_PHY_MACREG; + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + if(isNormal) + { + if(is92C) + pszMACRegFile = sz92CMACRegFile; + else + pszMACRegFile = sz88CMACRegFile; + } + else + { + //pszMACRegFile = TestMacRegFile; + } + + // + // Config MAC + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigMACWithHeaderFile(Adapter); +#else + + // Not make sure EEPROM, add later + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Read MACREG.txt\n")); + rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); +#endif + +#ifdef CONFIG_PCI_HCI + //this switching setting cause some 8192cu hw have redownload fw fail issue + //improve 2-stream TX EVM by Jenyu + if(isNormal && is92C) + rtw_write8(Adapter, REG_SPS0_CTRL+3,0x71); +#endif + + + // 2010.07.13 AMPDU aggregation number 9 + //rtw_write16(Adapter, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); + rtw_write8(Adapter, REG_MAX_AGGR_NUM, 0x0A); //By tynli. 2010.11.18. +#ifdef CONFIG_USB_HCI + if(is92C && (BOARD_USB_DONGLE == pHalData->BoardType)) + rtw_write8(Adapter, 0x40,0x04); +#endif + + return rtStatus; + +} + + +/** +* Function: phy_InitBBRFRegisterDefinition +* +* OverView: Initialize Register definition offset for Radio Path A/B/C/D +* +* Input: +* PADAPTER Adapter, +* +* Output: None +* Return: None +* Note: The initialization value is constant and it should never be changes +*/ +static VOID +phy_InitBBRFRegisterDefinition( + IN PADAPTER Adapter +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // RF Interface Sowrtware Control + pHalData->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 + pHalData->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) + pHalData->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 LSBs if read 32-bit from 0x874 + pHalData->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;// 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) + + // RF Interface Readback Value + pHalData->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; // 16 LSBs if read 32-bit from 0x8E0 + pHalData->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) + pHalData->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 LSBs if read 32-bit from 0x8E4 + pHalData->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;// 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) + + // RF Interface Output (and Enable) + pHalData->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 + pHalData->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 + + // RF Interface (Output and) Enable + pHalData->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) + pHalData->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) + + //Addr of LSSI. Wirte RF register by driver + pHalData->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter + pHalData->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; + + // RF parameter + pHalData->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; //BB Band Select + pHalData->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter; + pHalData->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter; + pHalData->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter; + + // Tx AGC Gain Stage (same for all path. Should we remove this?) + pHalData->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + pHalData->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; //Tx gain stage + + // Tranceiver A~D HSSI Parameter-1 + pHalData->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; //wire control parameter1 + pHalData->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; //wire control parameter1 + + // Tranceiver A~D HSSI Parameter-2 + pHalData->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2 + pHalData->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2 + + // RF switch Control + pHalData->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; //TR/Ant switch control + pHalData->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl; + pHalData->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl; + pHalData->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl; + + // AGC control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1; + pHalData->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1; + pHalData->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1; + pHalData->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1; + + // AGC control 2 + pHalData->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2; + pHalData->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2; + pHalData->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2; + pHalData->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2; + + // RX AFE control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance; + + // RX AFE control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE; + pHalData->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE; + pHalData->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE; + pHalData->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE; + + // Tx AFE control 1 + pHalData->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance; + pHalData->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance; + + // Tx AFE control 2 + pHalData->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE; + pHalData->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE; + pHalData->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE; + pHalData->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE; + + // Tranceiver LSSI Readback SI mode + pHalData->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; + pHalData->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; + pHalData->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack; + pHalData->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack; + + // Tranceiver LSSI Readback PI mode + pHalData->PHYRegDef[RF90_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; + pHalData->PHYRegDef[RF90_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; + //pHalData->PHYRegDef[RF90_PATH_C].rfLSSIReadBackPi = rFPGA0_XC_LSSIReadBack; + //pHalData->PHYRegDef[RF90_PATH_D].rfLSSIReadBackPi = rFPGA0_XD_LSSIReadBack; + +} + + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithParaFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * 2008/11/06 MH For 92S we do not support silent reset now. Disable + * parameter file compare!!!!!!?? + * + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + return rtStatus; +} + + + +//**************************************** +// The following is for High Power PA +//**************************************** +VOID +phy_ConfigBBExternalPA( + IN PADAPTER Adapter +) +{ +#ifdef CONFIG_USB_HCI + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 i=0; + u32 temp=0; + + if(!pHalData->ExternalPA) + { + return; + } + + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the + // same code as SU. It is already updated in PHY_REG_1T_HP.txt. +#if 0 + PHY_SetBBReg(Adapter, 0xee8, BIT28, 1); + temp = PHY_QueryBBReg(Adapter, 0x860, bMaskDWord); + temp |= (BIT26|BIT21|BIT10|BIT5); + PHY_SetBBReg(Adapter, 0x860, bMaskDWord, temp); + PHY_SetBBReg(Adapter, 0x870, BIT10, 0); + PHY_SetBBReg(Adapter, 0xc80, bMaskDWord, 0x20000080); + PHY_SetBBReg(Adapter, 0xc88, bMaskDWord, 0x40000100); +#endif + +#endif +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithHeaderFile() + * + * Overview: This function read BB parameters from general file format, and do register + * Read/Write + * + * Input: PADAPTER Adapter + * u1Byte ConfigType 0 => PHY_CONFIG + * 1 =>AGC_TAB + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithHeaderFile( + IN PADAPTER Adapter, + IN u8 ConfigType +) +{ + int i; + u32* Rtl819XPHY_REGArray_Table; + u32* Rtl819XAGCTAB_Array_Table; + u16 PHY_REGArrayLen, AGCTAB_ArrayLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // + // 2009.11.24. Modified by tynli. + // + if(IS_92C_SERIAL(pHalData->VersionID)) + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + AGCTAB_ArrayLen = AGCTAB_2TArrayLength; + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_2TArray; + PHY_REGArrayLen = PHY_REG_2TArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2TArray; +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_MINICARD ) + { + PHY_REGArrayLen = PHY_REG_2T_mCardArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_2T_mCardArray; + } +#endif + } + else + { + DBG_8192C(" ===> phy_ConfigBBWithHeaderFile(): do not support test chip\n"); + return _FAIL; + } + } + else + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + AGCTAB_ArrayLen = AGCTAB_1TArrayLength; + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1TArray; + PHY_REGArrayLen = PHY_REG_1TArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1TArray; +#ifdef CONFIG_USB_HCI + if(pHalData->BoardType == BOARD_MINICARD ) + { + PHY_REGArrayLen = PHY_REG_1T_mCardArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_mCardArray; + } + else if(pHalData->BoardType == BOARD_USB_High_PA) + { + AGCTAB_ArrayLen = AGCTAB_1T_HPArrayLength; + Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_1T_HPArray; + PHY_REGArrayLen = PHY_REG_1T_HPArrayLength; + Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T_HPArray; + } +#endif + } + else + { + DBG_8192C(" ===> phy_ConfigBBWithHeaderFile(): do not support test chip\n"); + return _FAIL; + } + } + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iMCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0])); + } + if(RegAddr == rTxAGC_A_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][1])); + } + if(RegAddr == rTxAGC_A_CCK1_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][6])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0xffffff00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][7])); + } + if(RegAddr == rTxAGC_A_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][2])); + } + if(RegAddr == rTxAGC_A_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][3])); + } + if(RegAddr == rTxAGC_A_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][4])); + } + if(RegAddr == rTxAGC_A_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][5])); + } + if(RegAddr == rTxAGC_B_Rate18_06) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][8])); + } + if(RegAddr == rTxAGC_B_Rate54_24) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][9])); + } + if(RegAddr == rTxAGC_B_CCK1_55_Mcs32) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][14])); + } + if(RegAddr == rTxAGC_B_CCK11_A_CCK2_11 && BitMask == 0x000000ff) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][15])); + } + if(RegAddr == rTxAGC_B_Mcs03_Mcs00) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][10])); + } + if(RegAddr == rTxAGC_B_Mcs07_Mcs04) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][11])); + } + if(RegAddr == rTxAGC_B_Mcs11_Mcs08) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][12])); + } + if(RegAddr == rTxAGC_B_Mcs15_Mcs12) + { + pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13] = Data; + //RT_TRACE(COMP_INIT, DBG_TRACE, ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%lx\n", pHalData->pwrGroupCnt, + // pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][13])); + pHalData->pwrGroupCnt++; + } +} +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithPgParaFile + * + * Overview: + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/06/2008 MHC Create Version 0. + * 2009/07/29 tynli (porting from 92SE branch)2009/03/11 Add copy parameter file to buffer for silent reset + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithPgParaFile( + IN PADAPTER Adapter, + IN u8* pFileName) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + + return rtStatus; + +} /* phy_ConfigBBWithPgParaFile */ + + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithPgHeaderFile + * + * Overview: Config PHY_REG_PG array + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/06/2008 MHC Add later!!!!!!.. Please modify for new files!!!! + * 11/10/2008 tynli Modify to mew files. + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithPgHeaderFile( + IN PADAPTER Adapter, + IN u8 ConfigType) +{ + int i; + u32* Rtl819XPHY_REGArray_Table_PG; + u16 PHY_REGArrayPGLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // Default: pHalData->RF_Type = RF_2T2R. + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + PHY_REGArrayPGLen = PHY_REG_Array_PGLength; + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG; + +#ifdef CONFIG_USB_HCI +// 2010/10/19 Chiyoko According to Alex/Willson opinion, VAU/dongle can share the same PHY_REG_PG.txt +/* + if(pHalData->BoardType == BOARD_MINICARD ) + { + PHY_REGArrayPGLen = PHY_REG_Array_PG_mCardLength; + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_mCard; + } + else */if(pHalData->BoardType ==BOARD_USB_High_PA ) + { + PHY_REGArrayPGLen = PHY_REG_Array_PG_HPLength; + Rtl819XPHY_REGArray_Table_PG = Rtl819XPHY_REG_Array_PG_HP; + } +#endif + } + else + { + DBG_8192C(" ===> phy_ConfigBBWithPgHeaderFile(): do not support test chip\n"); + return _FAIL; + } + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iBufOfLines), + MAX_LINES_HWCONFIG_TXT, + MAX_BYTES_LINE_HWCONFIG_TXT, + &nLinesRead + ); + if(rtStatus == RT_STATUS_SUCCESS) + { + PlatformMoveMemory(pHalData->BufOfLines6, pHalData->BufOfLines, nLinesRead*MAX_BYTES_LINE_HWCONFIG_TXT); + pHalData->nLinesRead6 = nLinesRead; + } + else + { + // Temporarily skip PHY_REG_MP.txt if file does not exist. + pHalData->nLinesRead6 = 0; + RT_TRACE(COMP_INIT, DBG_LOUD, ("No matched file \r\n")); + return RT_STATUS_SUCCESS; + } + } + else + { + PlatformMoveMemory(pHalData->BufOfLines, pHalData->BufOfLines6, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); + nLinesRead = pHalData->nLinesRead6; + rtStatus = RT_STATUS_SUCCESS; + } + + + if(rtStatus == RT_STATUS_SUCCESS) + { + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName)); + + for(ithLine = 0; ithLine < nLinesRead; ithLine++) + { + szLine = pHalData->BufOfLines[ithLine]; + + if(!IsCommentString(szLine)) + { + // Get 1st hex value as register offset. + if(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) + { + if(u4bRegOffset == 0xff) + { // Ending. + break; + } + else if (u4bRegOffset == 0xfe) + delay_ms(50); + else if (u4bRegOffset == 0xfd) + delay_ms(5); + else if (u4bRegOffset == 0xfc) + delay_ms(1); + else if (u4bRegOffset == 0xfb) + PlatformStallExecution(50); + else if (u4bRegOffset == 0xfa) + PlatformStallExecution(5); + else if (u4bRegOffset == 0xf9) + PlatformStallExecution(1); + + // Get 2nd hex value as register value. + szLine += u4bMove; + if(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) + { + RT_TRACE(COMP_FPGA, DBG_TRACE, ("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue)); + PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue); + + // Add 1us delay between BB/RF register setting. + PlatformStallExecution(1); + } + } + } + } + } + else + { + RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_ConfigBBWithMpParaFile(): Failed%s\n", pFileName)); + } +#endif + + return rtStatus; +} + +/*----------------------------------------------------------------------------- + * Function: phy_ConfigBBWithMpHeaderFile + * + * Overview: Config PHY_REG_MP array + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 02/04/2010 chiyokolin Modify to new files. + *---------------------------------------------------------------------------*/ +static int +phy_ConfigBBWithMpHeaderFile( + IN PADAPTER Adapter, + IN u1Byte ConfigType) +{ + int i; + u32* Rtl8192CPHY_REGArray_Table_MP; + u16 PHY_REGArrayMPLen; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + PHY_REGArrayMPLen = PHY_REG_Array_MPLength; + Rtl8192CPHY_REGArray_Table_MP = Rtl819XPHY_REG_Array_MP; + + if(ConfigType == BaseBand_Config_PHY_REG) + { + for(i=0;iphy_BB8192S_Config_ParaFile\n")); + + if(IS_92C_SERIAL(pHalData->VersionID)){ + pszBBRegFile=(u8*)&sz92CBBRegFile ; + pszAGCTableFile =(u8*)&sz92CAGCTableFile; + } + else{ + pszBBRegFile=(u8*)&sz88CBBRegFile ; + pszAGCTableFile =(u8*)&sz88CAGCTableFile; + } + + // + // 1. Read PHY_REG.TXT BB INIT!! + // We will seperate as 88C / 92C according to chip version + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithParaFile(Adapter,pszBBRegFile); +#endif + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } + +#if MP_DRIVER == 1 + // + // 1.1 Read PHY_REG_MP.TXT BB INIT!! + // We will seperate as 88C / 92C according to chip version + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithMpHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + // No matter what kind of CHIP we always read PHY_REG.txt. We must copy different + // type of parameter files to phy_reg.txt at first. + rtStatus = phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile); +#endif + + if(rtStatus != _SUCCESS){ +// RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():Write BB Reg MP Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } +#endif // #if (MP_DRIVER == 1) + + // + // 20100318 Joseph: Config 2T2R to 1T2R if necessary. + // + if(pHalData->rf_type == RF_1T2R) + { + phy_BB8192C_Config_1T(Adapter); + DBG_8192C("phy_BB8192C_Config_ParaFile():Config to 1T!!\n"); + } + + // + // 2. If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt + // + if (pEEPROM->bautoload_fail_flag == _FALSE) + { + pHalData->pwrGroupCnt = 0; + +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithPgHeaderFile(Adapter, BaseBand_Config_PHY_REG); +#else + rtStatus = phy_ConfigBBWithPgParaFile(Adapter, (u8*)&szBBRegPgFile); +#endif + } + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():BB_PG Reg Fail!!")); + goto phy_BB8190_Config_ParaFile_Fail; + } + + // + // 3. BB AGC table Initialization + // +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = phy_ConfigBBWithHeaderFile(Adapter, BaseBand_Config_AGC_TAB); +#else + //RT_TRACE(COMP_INIT, DBG_LOUD, ("phy_BB8192S_Config_ParaFile AGC_TAB.txt\n")); + rtStatus = phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile); +#endif + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_FPGA, DBG_SERIOUS, ("phy_BB8192S_Config_ParaFile():AGC Table Fail\n")); + goto phy_BB8190_Config_ParaFile_Fail; + } + + // Check if the CCK HighPower is turned ON. + // This is used to calculate PWDB. + pHalData->bCckHighPower = (BOOLEAN)(PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2, 0x200)); + +phy_BB8190_Config_ParaFile_Fail: + + return rtStatus; +} + + +int +PHY_BBConfig8192C( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 RegVal; + u8 TmpU1B=0; + u8 value8; + + phy_InitBBRFRegisterDefinition(Adapter); + + if(IS_HARDWARE_TYPE_8723(Adapter)) + { + // Suggested by Scott. tynli_test. 2010.12.30. + //1. 0x28[1] = 1 + TmpU1B = rtw_read8(Adapter, REG_AFE_PLL_CTRL); + rtw_udelay_os(2); + rtw_write8(Adapter, REG_AFE_PLL_CTRL, (TmpU1B|BIT1)); + rtw_udelay_os(2); + + //2. 0x29[7:0] = 0xFF + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xff); + rtw_udelay_os(2); + + //3. 0x02[1:0] = 2b'11 + TmpU1B = rtw_read8(Adapter, REG_SYS_FUNC_EN); + rtw_write8(Adapter, REG_SYS_FUNC_EN, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB)); + + //4. 0x25[6] = 0 + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+1); + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, (TmpU1B&(~BIT6))); + + //5. 0x24[20] = 0 //Advised by SD3 Alex Wang. 2011.02.09. + TmpU1B = rtw_read8(Adapter, REG_AFE_XTAL_CTRL+2); + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+2, (TmpU1B&(~BIT4))); + + //6. 0x1f[7:0] = 0x07 + rtw_write8(Adapter, REG_RF_CTRL, 0x07); + } + else + { + // Enable BB and RF + RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN); + rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1)); + + // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83); + rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb); + + rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB); + +#ifdef CONFIG_USB_HCI + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_USBA | FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB); +#else + rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB); +#endif + + // 2009/10/21 by SD1 Jong. Modified by tynli. Not in Documented in V8.1. + if(!IS_NORMAL_CHIP(pHalData->VersionID)) + { +#ifdef CONFIG_USB_HCI + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x1f); +#else + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x1b); +#endif + } + else + { +#ifdef CONFIG_USB_HCI + //To Fix MAC loopback mode fail. Suggested by SD4 Johnny. 2010.03.23. + rtw_write8(Adapter, REG_LDOHCI12_CTRL, 0x0f); + rtw_write8(Adapter, 0x15, 0xe9); +#endif + } + + rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80); + +#ifdef CONFIG_PCI_HCI + // Force use left antenna by default for 88C. + // if(!IS_92C_SERIAL(pHalData->VersionID) || IS_92C_1T2R(pHalData->VersionID)) + if(Adapter->ledpriv.LedStrategy != SW_LED_MODE10) + { + RegVal = rtw_read32(Adapter, REG_LEDCFG0); + rtw_write32(Adapter, REG_LEDCFG0, RegVal|BIT23); + } +#endif + } + + // + // Config BB and AGC + // + rtStatus = phy_BB8192C_Config_ParaFile(Adapter); +#if 0 + switch(Adapter->MgntInfo.bRegHwParaFile) + { + case 0: + phy_BB8190_Config_HardCode(Adapter); + break; + + case 1: + rtStatus = phy_BB8192C_Config_ParaFile(Adapter); + break; + + case 2: + // Partial Modify. + phy_BB8190_Config_HardCode(Adapter); + phy_BB8192C_Config_ParaFile(Adapter); + break; + + default: + phy_BB8190_Config_HardCode(Adapter); + break; + } +#endif +#ifdef CONFIG_USB_HCI + if(IS_HARDWARE_TYPE_8192CU(Adapter)&&IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) + &&(pHalData->BoardType == BOARD_USB_High_PA)) + rtw_write8(Adapter, 0xc72, 0x50); +#endif + + // For fix 8723 WL_TRSW bug. Suggested by Scott. 2011.01.24. + if(IS_HARDWARE_TYPE_8723(Adapter)) + { + if(!IS_NORMAL_CHIP(pHalData->VersionID)) + { + // 1. 0x40[2] = 1 + value8 = rtw_read8(Adapter, REG_GPIO_MUXCFG); + rtw_write8(Adapter, REG_GPIO_MUXCFG, (value8|BIT2)); + + // 2. 0x804[14] = 0 // BB disable TRSW control, enable SW control + PHY_SetBBReg(Adapter, rFPGA0_TxInfo, BIT14, 0x0); + + // 3. 0x870[6:5] = 2'b11 + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFInterfaceSW, (BIT5|BIT6), 0x3); + + // 4. 0x860[6:5] = 2'b00 // BB SW control TRSW pin output level + PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, (BIT5|BIT6), 0x0); + } + } +#if 0 + // Check BB/RF confiuration setting. + // We only need to configure RF which is turned on. + PathMap = (u1Byte)(PHY_QueryBBReg(Adapter, rFPGA0_TxInfo, 0xf) | + PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf)); + pHalData->RF_PathMap = PathMap; + for(index = 0; index<4; index++) + { + if((PathMap>>index)&0x1) + rf_num++; + } + + if((GET_RF_TYPE(Adapter) ==RF_1T1R && rf_num!=1) || + (GET_RF_TYPE(Adapter)==RF_1T2R && rf_num!=2) || + (GET_RF_TYPE(Adapter)==RF_2T2R && rf_num!=2) || + (GET_RF_TYPE(Adapter)==RF_2T2R_GREEN && rf_num!=2) || + (GET_RF_TYPE(Adapter)==RF_2T4R && rf_num!=4)) + { + RT_TRACE( + COMP_INIT, + DBG_LOUD, + ("PHY_BBConfig8192C: RF_Type(%x) does not match RF_Num(%x)!!\n", pHalData->RF_Type, rf_num)); + } +#endif + + return rtStatus; +} + + +int +PHY_RFConfig8192C( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // + // RF config + // + rtStatus = PHY_RF6052_Config8192C(Adapter); +#if 0 + switch(pHalData->rf_chip) + { + case RF_6052: + rtStatus = PHY_RF6052_Config(Adapter); + break; + case RF_8225: + rtStatus = PHY_RF8225_Config(Adapter); + break; + case RF_8256: + rtStatus = PHY_RF8256_Config(Adapter); + break; + case RF_8258: + break; + case RF_PSEUDO_11N: + rtStatus = PHY_RF8225_Config(Adapter); + break; + default: //for MacOs Warning: "RF_TYPE_MIN" not handled in switch + break; + } +#endif + return rtStatus; +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_ConfigRFWithParaFile() + * + * Overview: This function read RF parameters from general file format, and do RF 3-wire + * + * Input: PADAPTER Adapter + * ps1Byte pFileName + * RF90_RADIO_PATH_E eRFPath + * + * Output: NONE + * + * Return: RT_STATUS_SUCCESS: configuration file exist + * + * Note: Delay may be required for RF configuration + *---------------------------------------------------------------------------*/ +int +rtl8192c_PHY_ConfigRFWithParaFile( + IN PADAPTER Adapter, + IN u8* pFileName, + RF90_RADIO_PATH_E eRFPath +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + int rtStatus = _SUCCESS; + + + return rtStatus; + +} + +//**************************************** +// The following is for High Power PA +//**************************************** +#define HighPowerRadioAArrayLen 22 +//This is for High power PA +u32 Rtl8192S_HighPower_RadioA_Array[HighPowerRadioAArrayLen] = { +0x013,0x00029ea4, +0x013,0x00025e74, +0x013,0x00020ea4, +0x013,0x0001ced0, +0x013,0x00019f40, +0x013,0x00014e70, +0x013,0x000106a0, +0x013,0x0000c670, +0x013,0x000082a0, +0x013,0x00004270, +0x013,0x00000240, +}; + +int +PHY_ConfigRFExternalPA( + IN PADAPTER Adapter, + RF90_RADIO_PATH_E eRFPath +) +{ + int rtStatus = _SUCCESS; +#ifdef CONFIG_USB_HCI + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 i=0; + + if(!pHalData->ExternalPA) + { + return rtStatus; + } + + // 2010/10/19 MH According to Jenyu/EEChou 's opinion, we need not to execute the + // same code as SU. It is already updated in radio_a_1T_HP.txt. +#if 0 + //add for SU High Power PA + for(i = 0;iVersionID)) + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + RadioA_ArrayLen = RadioA_2TArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_2TArray; + RadioB_ArrayLen = RadioB_2TArrayLength; + Rtl819XRadioB_Array_Table = Rtl819XRadioB_2TArray; + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + else + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + RadioA_ArrayLen = RadioA_1TArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1TArray; + RadioB_ArrayLen = RadioB_1TArrayLength; + Rtl819XRadioB_Array_Table = Rtl819XRadioB_1TArray; +#ifdef CONFIG_USB_HCI + if( BOARD_MINICARD == pHalData->BoardType ) + { + RadioA_ArrayLen = RadioA_1T_mCardArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_mCardArray; + RadioB_ArrayLen = RadioB_1T_mCardArrayLength; + Rtl819XRadioB_Array_Table = Rtl819XRadioB_1T_mCardArray; + } + else if( BOARD_USB_High_PA == pHalData->BoardType ) + { + RadioA_ArrayLen = RadioA_1T_HPArrayLength; + Rtl819XRadioA_Array_Table = Rtl819XRadioA_1T_HPArray; + } +#endif + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + + switch(eRFPath){ + case RF90_PATH_A: + for(i = 0;i actually we call PlatformStallExecution()) to do NdisStallExecution() + // [busy wait] instead of NdisMSleep(). So we acquire RT_INITIAL_SPINLOCK + // to run at Dispatch level to achive it. + //cosa PlatformAcquireSpinLock(Adapter, RT_INITIAL_SPINLOCK); + WriteData[i] &= 0xfff; + PHY_SetRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bRFRegOffsetMask, WriteData[i]); + // TODO: we should not delay for such a long time. Ask SD3 + rtw_mdelay_os(10); + ulRegRead = PHY_QueryRFReg(Adapter, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord); + rtw_mdelay_os(10); + //cosa PlatformReleaseSpinLock(Adapter, RT_INITIAL_SPINLOCK); + break; + + default: + rtStatus = _FAIL; + break; + } + + + // + // Check whether readback data is correct + // + if(ulRegRead != WriteData[i]) + { + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("ulRegRead: %lx, WriteData: %lx \n", ulRegRead, WriteData[i])); + rtStatus = _FAIL; + break; + } + } + + return rtStatus; +} + + +VOID +rtl8192c_PHY_GetHWRegOriginalValue( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // read rx initial gain + pHalData->DefaultInitialGain[0] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XAAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[1] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XBAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[2] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XCAGCCore1, bMaskByte0); + pHalData->DefaultInitialGain[3] = (u8)PHY_QueryBBReg(Adapter, rOFDM0_XDAGCCore1, bMaskByte0); + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n", + //pHalData->DefaultInitialGain[0], pHalData->DefaultInitialGain[1], + //pHalData->DefaultInitialGain[2], pHalData->DefaultInitialGain[3])); + + // read framesync + pHalData->framesync = (u8)PHY_QueryBBReg(Adapter, rOFDM0_RxDetector3, bMaskByte0); + pHalData->framesyncC34 = PHY_QueryBBReg(Adapter, rOFDM0_RxDetector2, bMaskDWord); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Default framesync (0x%x) = 0x%x \n", + // rOFDM0_RxDetector3, pHalData->framesync)); +} + + +// +// Description: +// Map dBm into Tx power index according to +// current HW model, for example, RF and PA, and +// current wireless mode. +// By Bruce, 2008-01-29. +// +static u8 +phy_DbmToTxPwrIdx( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN int PowerInDbm + ) +{ + u8 TxPwrIdx = 0; + int Offset = 0; + + + // + // Tested by MP, we found that CCK Index 0 equals to 8dbm, OFDM legacy equals to + // 3dbm, and OFDM HT equals to 0dbm repectively. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + Offset = -7; + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + break; + default: + Offset = -8; + break; + } + + if((PowerInDbm - Offset) > 0) + { + TxPwrIdx = (u8)((PowerInDbm - Offset) * 2); + } + else + { + TxPwrIdx = 0; + } + + // Tx Power Index is too large. + if(TxPwrIdx > MAX_TXPWR_IDX_NMODE_92S) + TxPwrIdx = MAX_TXPWR_IDX_NMODE_92S; + + return TxPwrIdx; +} + +// +// Description: +// Map Tx power index into dBm according to +// current HW model, for example, RF and PA, and +// current wireless mode. +// By Bruce, 2008-01-29. +// +int +phy_TxPwrIdxToDbm( + IN PADAPTER Adapter, + IN WIRELESS_MODE WirelessMode, + IN u8 TxPwrIdx + ) +{ + int Offset = 0; + int PwrOutDbm = 0; + + // + // Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm. + // Note: + // The mapping may be different by different NICs. Do not use this formula for what needs accurate result. + // By Bruce, 2008-01-29. + // + switch(WirelessMode) + { + case WIRELESS_MODE_B: + Offset = -7; + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + Offset = -8; + default: + Offset = -8; + break; + } + + PwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part. + + return PwrOutDbm; +} + + +/*----------------------------------------------------------------------------- + * Function: GetTxPowerLevel8190() + * + * Overview: This function is export to "common" moudule + * + * Input: PADAPTER Adapter + * psByte Power Level + * + * Output: NONE + * + * Return: NONE + * + *---------------------------------------------------------------------------*/ +VOID +PHY_GetTxPowerLevel8192C( + IN PADAPTER Adapter, + OUT u32* powerlevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 TxPwrLevel = 0; + int TxPwrDbm; + + // + // Because the Tx power indexes are different, we report the maximum of them to + // meet the CCX TPC request. By Bruce, 2008-01-31. + // + + // CCK + TxPwrLevel = pHalData->CurrentCckTxPwrIdx; + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_B, TxPwrLevel); + + // Legacy OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx + pHalData->LegacyHTTxPowerDiff; + + // Compare with Legacy OFDM Tx power. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_G, TxPwrLevel); + + // HT OFDM + TxPwrLevel = pHalData->CurrentOfdm24GTxPwrIdx; + + // Compare with HT OFDM Tx power. + if(phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel) > TxPwrDbm) + TxPwrDbm = phy_TxPwrIdxToDbm(Adapter, WIRELESS_MODE_N_24G, TxPwrLevel); + + *powerlevel = TxPwrDbm; +} + + +static void getTxPowerIndex( + IN PADAPTER Adapter, + IN u8 channel, + IN OUT u8* cckPowerLevel, + IN OUT u8* ofdmPowerLevel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 index = (channel -1); + // 1. CCK + cckPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelCck[RF90_PATH_A][index]; //RF-A + cckPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelCck[RF90_PATH_B][index]; //RF-B + + // 2. OFDM for 1S or 2S + if (GET_RF_TYPE(Adapter) == RF_1T2R || GET_RF_TYPE(Adapter) == RF_1T1R) + { + // Read HT 40 OFDM TX power + ofdmPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelHT40_1S[RF90_PATH_A][index]; + ofdmPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelHT40_1S[RF90_PATH_B][index]; + } + else if (GET_RF_TYPE(Adapter) == RF_2T2R) + { + // Read HT 40 OFDM TX power + ofdmPowerLevel[RF90_PATH_A] = pHalData->TxPwrLevelHT40_2S[RF90_PATH_A][index]; + ofdmPowerLevel[RF90_PATH_B] = pHalData->TxPwrLevelHT40_2S[RF90_PATH_B][index]; + } + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, set tx power index !!\n", channel)); +} + +static void ccxPowerIndexCheck( + IN PADAPTER Adapter, + IN u8 channel, + IN OUT u8* cckPowerLevel, + IN OUT u8* ofdmPowerLevel + ) +{ +#if 0 + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PRT_CCX_INFO pCcxInfo = GET_CCX_INFO(pMgntInfo); + + // + // CCX 2 S31, AP control of client transmit power: + // 1. We shall not exceed Cell Power Limit as possible as we can. + // 2. Tolerance is +/- 5dB. + // 3. 802.11h Power Contraint takes higher precedence over CCX Cell Power Limit. + // + // TODO: + // 1. 802.11h power contraint + // + // 071011, by rcnjko. + // + if( pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE && + pMgntInfo->mAssoc && + pCcxInfo->bUpdateCcxPwr && + pCcxInfo->bWithCcxCellPwr && + channel == pMgntInfo->dot11CurrentChannelNumber) + { + u1Byte CckCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pCcxInfo->CcxCellPwr); + u1Byte LegacyOfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pCcxInfo->CcxCellPwr); + u1Byte OfdmCellPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pCcxInfo->CcxCellPwr); + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + pCcxInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx)); + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n", + channel, cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + + // CCK + if(cckPowerLevel[0] > CckCellPwrIdx) + cckPowerLevel[0] = CckCellPwrIdx; + // Legacy OFDM, HT OFDM + if(ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff > LegacyOfdmCellPwrIdx) + { + if((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0) + { + ofdmPowerLevel[0] = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff; + } + else + { + ofdmPowerLevel[0] = 0; + } + } + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); + } + + pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0]; + pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0]; + + RT_TRACE(COMP_TXAGC, DBG_LOUD, + ("PHY_SetTxPowerLevel8192S(): CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n", + cckPowerLevel[0], ofdmPowerLevel[0] + pHalData->LegacyHTTxPowerDiff, ofdmPowerLevel[0])); +#endif +} +/*----------------------------------------------------------------------------- + * Function: SetTxPowerLevel8190() + * + * Overview: This function is export to "HalCommon" moudule + * We must consider RF path later!!!!!!! + * + * Input: PADAPTER Adapter + * u1Byte channel + * + * Output: NONE + * + * Return: NONE + * 2008/11/04 MHC We remove EEPROM_93C56. + * We need to move CCX relative code to independet file. + * 2009/01/21 MHC Support new EEPROM format from SD3 requirement. + * + *---------------------------------------------------------------------------*/ +VOID +PHY_SetTxPowerLevel8192C( + IN PADAPTER Adapter, + IN u8 channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 cckPowerLevel[2], ofdmPowerLevel[2]; // [0]:RF-A, [1]:RF-B + +#if(MP_DRIVER == 1) + return; +#endif + + if(pHalData->bTXPowerDataReadFromEEPORM == _FALSE) + return; + + getTxPowerIndex(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); + //RTPRINT(FPHY, PHY_TXPWR, ("Channel-%d, cckPowerLevel (A / B) = 0x%x / 0x%x, ofdmPowerLevel (A / B) = 0x%x / 0x%x\n", + // channel, cckPowerLevel[0], cckPowerLevel[1], ofdmPowerLevel[0], ofdmPowerLevel[1])); + + ccxPowerIndexCheck(Adapter, channel, &cckPowerLevel[0], &ofdmPowerLevel[0]); + + rtl8192c_PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); + rtl8192c_PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); + +#if 0 + switch(pHalData->rf_chip) + { + case RF_8225: + PHY_SetRF8225CckTxPower(Adapter, cckPowerLevel[0]); + PHY_SetRF8225OfdmTxPower(Adapter, ofdmPowerLevel[0]); + break; + + case RF_8256: + PHY_SetRF8256CCKTxPower(Adapter, cckPowerLevel[0]); + PHY_SetRF8256OFDMTxPower(Adapter, ofdmPowerLevel[0]); + break; + + case RF_6052: + PHY_RF6052SetCckTxPower(Adapter, &cckPowerLevel[0]); + PHY_RF6052SetOFDMTxPower(Adapter, &ofdmPowerLevel[0], channel); + break; + + case RF_8258: + break; + } +#endif + +} + + +// +// Description: +// Update transmit power level of all channel supported. +// +// TODO: +// A mode. +// By Bruce, 2008-02-04. +// +BOOLEAN +PHY_UpdateTxPowerDbm8192C( + IN PADAPTER Adapter, + IN int powerInDbm + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 idx; + u8 rf_path; + + // TODO: A mode Tx power. + u8 CckTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, powerInDbm); + u8 OfdmTxPwrIdx = phy_DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, powerInDbm); + + if(OfdmTxPwrIdx - pHalData->LegacyHTTxPowerDiff > 0) + OfdmTxPwrIdx -= pHalData->LegacyHTTxPowerDiff; + else + OfdmTxPwrIdx = 0; + + //RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_UpdateTxPowerDbm8192S(): %ld dBm , CckTxPwrIdx = %d, OfdmTxPwrIdx = %d\n", powerInDbm, CckTxPwrIdx, OfdmTxPwrIdx)); + + for(idx = 0; idx < 14; idx++) + { + for (rf_path = 0; rf_path < 2; rf_path++) + { + pHalData->TxPwrLevelCck[rf_path][idx] = CckTxPwrIdx; + pHalData->TxPwrLevelHT40_1S[rf_path][idx] = + pHalData->TxPwrLevelHT40_2S[rf_path][idx] = OfdmTxPwrIdx; + } + } + + //Adapter->HalFunc.SetTxPowerLevelHandler(Adapter, pHalData->CurrentChannel);//gtest:todo + + return _TRUE; +} + + +/* + Description: + When beacon interval is changed, the values of the + hw registers should be modified. + By tynli, 2008.10.24. + +*/ + + +void +rtl8192c_PHY_SetBeaconHwReg( + IN PADAPTER Adapter, + IN u16 BeaconInterval + ) +{ + +} + + +VOID +PHY_ScanOperationBackup8192C( + IN PADAPTER Adapter, + IN u8 Operation + ) +{ +#if 0 + IO_TYPE IoType; + + if(!Adapter->bDriverStopped) + { + switch(Operation) + { + case SCAN_OPT_BACKUP: + IoType = IO_CMD_PAUSE_DM_BY_SCAN; + Adapter->HalFunc.SetHwRegHandler(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); + + break; + + case SCAN_OPT_RESTORE: + IoType = IO_CMD_RESUME_DM_BY_SCAN; + Adapter->HalFunc.SetHwRegHandler(Adapter,HW_VAR_IO_CMD, (pu1Byte)&IoType); + break; + + default: + RT_TRACE(COMP_SCAN, DBG_LOUD, ("Unknown Scan Backup Operation. \n")); + break; + } + } +#endif +} + +/*----------------------------------------------------------------------------- + * Function: PHY_SetBWModeCallback8192C() + * + * Overview: Timer callback function for SetSetBWMode + * + * Input: PRT_TIMER pTimer + * + * Output: NONE + * + * Return: NONE + * + * Note: (1) We do not take j mode into consideration now + * (2) Will two workitem of "switch channel" and "switch channel bandwidth" run + * concurrently? + *---------------------------------------------------------------------------*/ +static VOID +_PHY_SetBWMode92C( + IN PADAPTER Adapter +) +{ +// PADAPTER Adapter = (PADAPTER)pTimer->Adapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 regBwOpMode; + u8 regRRSR_RSC; + + //return; + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //u4Byte NowL, NowH; + //u8Byte BeginTime, EndTime; + + /*RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SetBWModeCallback8192C() Switch to %s bandwidth\n", \ + pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz"))*/ + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SetBWModeInProgress= _FALSE; + return; + } + + // There is no 40MHz mode in RF_8225. + if(pHalData->rf_chip==RF_8225) + return; + + if(Adapter->bDriverStopped) + return; + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //NowL = PlatformEFIORead4Byte(Adapter, TSFR); + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); + //BeginTime = ((u8Byte)NowH << 32) + NowL; + + //3// + //3//<1>Set MAC register + //3// + //Adapter->HalFunc.SetBWModeHandler(); + + regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE); + regRRSR_RSC = rtw_read8(Adapter, REG_RRSR+2); + //regBwOpMode = Adapter->HalFunc.GetHwRegHandler(Adapter,HW_VAR_BWMODE,(pu1Byte)®BwOpMode); + + switch(pHalData->CurrentChannelBW) + { + case HT_CHANNEL_WIDTH_20: + regBwOpMode |= BW_OPMODE_20MHZ; + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); + break; + + case HT_CHANNEL_WIDTH_40: + regBwOpMode &= ~BW_OPMODE_20MHZ; + // 2007/02/07 Mark by Emily becasue we have not verify whether this register works + rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); + + regRRSR_RSC = (regRRSR_RSC&0x90) |(pHalData->nCur40MhzPrimeSC<<5); + rtw_write8(Adapter, REG_RRSR+2, regRRSR_RSC); + break; + + default: + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): + unknown Bandwidth: %#X\n",pHalData->CurrentChannelBW));*/ + break; + } + + //3// + //3//<2>Set PHY related register + //3// + switch(pHalData->CurrentChannelBW) + { + /* 20 MHz channel*/ + case HT_CHANNEL_WIDTH_20: + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0); + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0); + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1); + + break; + + + /* 40 MHz channel*/ + case HT_CHANNEL_WIDTH_40: + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1); + PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1); + + // Set Control channel to upper or lower. These settings are required only for 40MHz + PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1)); + PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC); + PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0); + + PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1); + + break; + + + + default: + /*RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetBWModeCallback8192C(): unknown Bandwidth: %#X\n"\ + ,pHalData->CurrentChannelBW));*/ + break; + + } + //Skip over setting of J-mode in BB register here. Default value is "None J mode". Emily 20070315 + + // Added it for 20/40 mhz switch time evaluation by guangan 070531 + //NowL = PlatformEFIORead4Byte(Adapter, TSFR); + //NowH = PlatformEFIORead4Byte(Adapter, TSFR+4); + //EndTime = ((u8Byte)NowH << 32) + NowL; + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("SetBWModeCallback8190Pci: time of SetBWMode = %I64d us!\n", (EndTime - BeginTime))); + + //3<3>Set RF related register + switch(pHalData->rf_chip) + { + case RF_8225: + //PHY_SetRF8225Bandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + case RF_8256: + // Please implement this function in Hal8190PciPhy8256.c + //PHY_SetRF8256Bandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + case RF_8258: + // Please implement this function in Hal8190PciPhy8258.c + // PHY_SetRF8258Bandwidth(); + break; + + case RF_PSEUDO_11N: + // Do Nothing + break; + + case RF_6052: + rtl8192c_PHY_RF6052SetBandwidth(Adapter, pHalData->CurrentChannelBW); + break; + + default: + //RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); + break; + } + + //pHalData->SetBWModeInProgress= FALSE; + + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SetBWModeCallback8192C() \n" )); +} + + + /*----------------------------------------------------------------------------- + * Function: SetBWMode8190Pci() + * + * Overview: This function is export to "HalCommon" moudule + * + * Input: PADAPTER Adapter + * HT_CHANNEL_WIDTH Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: We do not take j mode into consideration now + *---------------------------------------------------------------------------*/ +VOID +PHY_SetBWMode8192C( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth, // 20M or 40M + IN unsigned char Offset // Upper, Lower, or Don't care +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + HT_CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW; + // Modified it for 20/40 mhz switch by guangan 070531 + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; + + //return; + + //if(pHalData->SwChnlInProgress) +// if(pMgntInfo->bScanInProgress) +// { +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s Exit because bScanInProgress!\n", +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); +// return; +// } + +// if(pHalData->SetBWModeInProgress) +// { +// // Modified it for 20/40 mhz switch by guangan 070531 +// RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() %s cancel last timer because SetBWModeInProgress!\n", +// Bandwidth == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")); +// PlatformCancelTimer(Adapter, &pHalData->SetBWModeTimer); +// //return; +// } + + //if(pHalData->SetBWModeInProgress) + // return; + + //pHalData->SetBWModeInProgress= TRUE; + + pHalData->CurrentChannelBW = Bandwidth; + +#if 0 + if(Offset==HT_EXTCHNL_OFFSET_LOWER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; + else if(Offset==HT_EXTCHNL_OFFSET_UPPER) + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; + else + pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; +#else + pHalData->nCur40MhzPrimeSC = Offset; +#endif + + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) + { +#ifdef USE_WORKITEM + //PlatformScheduleWorkItem(&(pHalData->SetBWModeWorkItem)); +#else + #if 0 + //PlatformSetTimer(Adapter, &(pHalData->SetBWModeTimer), 0); + #else + _PHY_SetBWMode92C(Adapter); + #endif +#endif + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SetBWMode8192C() SetBWModeInProgress FALSE driver sleep or unload\n")); + //pHalData->SetBWModeInProgress= FALSE; + pHalData->CurrentChannelBW = tmpBW; + } + +} + + +static void _PHY_SwChnl8192C(PADAPTER Adapter, u8 channel) +{ + u8 eRFPath; + u32 param1, param2; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //s1. pre common command - CmdID_SetTxPowerLevel + PHY_SetTxPowerLevel8192C(Adapter, channel); + + //s2. RF dependent command - CmdID_RF_WriteReg, param1=RF_CHNLBW, param2=channel + param1 = RF_CHNLBW; + param2 = channel; + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | param2); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, param1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); + } + + + //s3. post common command - CmdID_End, None + +} + +VOID +PHY_SwChnl8192C( // Call after initialization + IN PADAPTER Adapter, + IN u8 channel + ) +{ + //PADAPTER Adapter = ADJUST_TO_ADAPTIVE_ADAPTER(pAdapter, _TRUE); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 tmpchannel = pHalData->CurrentChannel; + BOOLEAN bResult = _TRUE; + + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SwChnlInProgress=FALSE; + return; //return immediately if it is peudo-phy + } + + //if(pHalData->SwChnlInProgress) + // return; + + //if(pHalData->SetBWModeInProgress) + // return; + + //-------------------------------------------- + switch(pHalData->CurrentWirelessMode) + { + case WIRELESS_MODE_A: + case WIRELESS_MODE_N_5G: + //RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14")); + break; + + case WIRELESS_MODE_B: + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_B but channel>14")); + break; + + case WIRELESS_MODE_G: + case WIRELESS_MODE_N_24G: + //RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14")); + break; + + default: + //RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode)); + break; + } + //-------------------------------------------- + + //pHalData->SwChnlInProgress = TRUE; + if(channel == 0) + channel = 1; + + pHalData->CurrentChannel=channel; + + //pHalData->SwChnlStage=0; + //pHalData->SwChnlStep=0; + + if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved)) + { +#ifdef USE_WORKITEM + //bResult = PlatformScheduleWorkItem(&(pHalData->SwChnlWorkItem)); +#else + #if 0 + //PlatformSetTimer(Adapter, &(pHalData->SwChnlTimer), 0); + #else + _PHY_SwChnl8192C(Adapter, channel); + #endif +#endif + if(bResult) + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress TRUE schdule workitem done\n")); + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE schdule workitem error\n")); + //if(IS_HARDWARE_TYPE_8192SU(Adapter)) + //{ + // pHalData->SwChnlInProgress = FALSE; + pHalData->CurrentChannel = tmpchannel; + //} + } + + } + else + { + //RT_TRACE(COMP_SCAN, DBG_LOUD, ("PHY_SwChnl8192C SwChnlInProgress FALSE driver sleep or unload\n")); + //if(IS_HARDWARE_TYPE_8192SU(Adapter)) + //{ + // pHalData->SwChnlInProgress = FALSE; + pHalData->CurrentChannel = tmpchannel; + //} + } +} + + +static BOOLEAN +phy_SwChnlStepByStep( + IN PADAPTER Adapter, + IN u8 channel, + IN u8 *stage, + IN u8 *step, + OUT u32 *delay + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PCHANNEL_ACCESS_SETTING pChnlAccessSetting; + SwChnlCmd PreCommonCmd[MAX_PRECMD_CNT]; + u4Byte PreCommonCmdCnt; + SwChnlCmd PostCommonCmd[MAX_POSTCMD_CNT]; + u4Byte PostCommonCmdCnt; + SwChnlCmd RfDependCmd[MAX_RFDEPENDCMD_CNT]; + u4Byte RfDependCmdCnt; + SwChnlCmd *CurrentCmd; + u1Byte eRFPath; + u4Byte RfTXPowerCtrl; + BOOLEAN bAdjRfTXPowerCtrl = _FALSE; + + + RT_ASSERT((Adapter != NULL), ("Adapter should not be NULL\n")); +#if(MP_DRIVER != 1) + RT_ASSERT(IsLegalChannel(Adapter, channel), ("illegal channel: %d\n", channel)); +#endif + RT_ASSERT((pHalData != NULL), ("pHalData should not be NULL\n")); + + pChnlAccessSetting = &Adapter->MgntInfo.Info8185.ChannelAccessSetting; + RT_ASSERT((pChnlAccessSetting != NULL), ("pChnlAccessSetting should not be NULL\n")); + + //for(eRFPath = RF90_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + //{ + // <1> Fill up pre common command. + PreCommonCmdCnt = 0; + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, + CmdID_SetTxPowerLevel, 0, 0, 0); + phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT, + CmdID_End, 0, 0, 0); + + // <2> Fill up post common command. + PostCommonCmdCnt = 0; + + phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT, + CmdID_End, 0, 0, 0); + + // <3> Fill up RF dependent command. + RfDependCmdCnt = 0; + switch( pHalData->RFChipID ) + { + case RF_8225: + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + // 2008/09/04 MH Change channel. + if(channel==14) channel++; + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, rZebra1_Channel, (0x10+channel-1), 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + break; + + case RF_8256: + // TEST!! This is not the table for 8256!! + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, rRfChannel, channel, 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + break; + + case RF_6052: + RT_ASSERT((channel >= 1 && channel <= 14), ("illegal channel for Zebra: %d\n", channel)); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_RF_WriteReg, RF_CHNLBW, channel, 10); + phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, + CmdID_End, 0, 0, 0); + + break; + + case RF_8258: + break; + + // For FPGA two MAC verification + case RF_PSEUDO_11N: + return TRUE; + default: + RT_ASSERT(FALSE, ("Unknown RFChipID: %d\n", pHalData->RFChipID)); + return FALSE; + break; + } + + + do{ + switch(*stage) + { + case 0: + CurrentCmd=&PreCommonCmd[*step]; + break; + case 1: + CurrentCmd=&RfDependCmd[*step]; + break; + case 2: + CurrentCmd=&PostCommonCmd[*step]; + break; + } + + if(CurrentCmd->CmdID==CmdID_End) + { + if((*stage)==2) + { + return TRUE; + } + else + { + (*stage)++; + (*step)=0; + continue; + } + } + + switch(CurrentCmd->CmdID) + { + case CmdID_SetTxPowerLevel: + PHY_SetTxPowerLevel8192C(Adapter,channel); + break; + case CmdID_WritePortUlong: + PlatformEFIOWrite4Byte(Adapter, CurrentCmd->Para1, CurrentCmd->Para2); + break; + case CmdID_WritePortUshort: + PlatformEFIOWrite2Byte(Adapter, CurrentCmd->Para1, (u2Byte)CurrentCmd->Para2); + break; + case CmdID_WritePortUchar: + PlatformEFIOWrite1Byte(Adapter, CurrentCmd->Para1, (u1Byte)CurrentCmd->Para2); + break; + case CmdID_RF_WriteReg: // Only modify channel for the register now !!!!! + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { +#if 1 + pHalData->RfRegChnlVal[eRFPath] = ((pHalData->RfRegChnlVal[eRFPath] & 0xfffffc00) | CurrentCmd->Para2); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, pHalData->RfRegChnlVal[eRFPath]); +#else + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bRFRegOffsetMask, (CurrentCmd->Para2)); +#endif + } + break; + } + + break; + }while(TRUE); + //cosa }/*for(Number of RF paths)*/ + + (*delay)=CurrentCmd->msDelay; + (*step)++; + return FALSE; +#endif + return _TRUE; +} + + +static BOOLEAN +phy_SetSwChnlCmdArray( + SwChnlCmd* CmdTable, + u32 CmdTableIdx, + u32 CmdTableSz, + SwChnlCmdID CmdID, + u32 Para1, + u32 Para2, + u32 msDelay + ) +{ + SwChnlCmd* pCmd; + + if(CmdTable == NULL) + { + //RT_ASSERT(FALSE, ("phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n")); + return _FALSE; + } + if(CmdTableIdx >= CmdTableSz) + { + //RT_ASSERT(FALSE, + // ("phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%ld, CmdTableSz:%ld\n", + // CmdTableIdx, CmdTableSz)); + return _FALSE; + } + + pCmd = CmdTable + CmdTableIdx; + pCmd->CmdID = CmdID; + pCmd->Para1 = Para1; + pCmd->Para2 = Para2; + pCmd->msDelay = msDelay; + + return _TRUE; +} + + +static void +phy_FinishSwChnlNow( // We should not call this function directly + IN PADAPTER Adapter, + IN u8 channel + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 delay; + + while(!phy_SwChnlStepByStep(Adapter,channel,&pHalData->SwChnlStage,&pHalData->SwChnlStep,&delay)) + { + if(delay>0) + rtw_mdelay_os(delay); + } +#endif +} + + + +// +// Description: +// Switch channel synchronously. Called by SwChnlByDelayHandler. +// +// Implemented by Bruce, 2008-02-14. +// The following procedure is operted according to SwChanlCallback8190Pci(). +// However, this procedure is performed synchronously which should be running under +// passive level. +// +VOID +PHY_SwChnlPhy8192C( // Only called during initialize + IN PADAPTER Adapter, + IN u8 channel + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlPhy8192S(), switch from channel %d to channel %d.\n", pHalData->CurrentChannel, channel)); + + // Cannot IO. + //if(RT_CANNOT_IO(Adapter)) + // return; + + // Channel Switching is in progress. + //if(pHalData->SwChnlInProgress) + // return; + + //return immediately if it is peudo-phy + if(pHalData->rf_chip == RF_PSEUDO_11N) + { + //pHalData->SwChnlInProgress=FALSE; + return; + } + + //pHalData->SwChnlInProgress = TRUE; + if( channel == 0) + channel = 1; + + pHalData->CurrentChannel=channel; + + //pHalData->SwChnlStage = 0; + //pHalData->SwChnlStep = 0; + + phy_FinishSwChnlNow(Adapter,channel); + + //pHalData->SwChnlInProgress = FALSE; +} + + +// +// Description: +// Configure H/W functionality to enable/disable Monitor mode. +// Note, because we possibly need to configure BB and RF in this function, +// so caller should in PASSIVE_LEVEL. 080118, by rcnjko. +// +VOID +PHY_SetMonitorMode8192C( + IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN bFilterOutNonAssociatedBSSID = FALSE; + + //2 Note: we may need to stop antenna diversity. + if(bEnableMonitorMode) + { + bFilterOutNonAssociatedBSSID = FALSE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): enable monitor mode\n")); + + pHalData->bInMonitorMode = TRUE; + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE); + pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); + } + else + { + bFilterOutNonAssociatedBSSID = TRUE; + RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8192S(): disable monitor mode\n")); + + pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE); + pHalData->bInMonitorMode = FALSE; + pAdapter->HalFunc.SetHwRegHandler(pAdapter, HW_VAR_CHECK_BSSID, (pu1Byte)&bFilterOutNonAssociatedBSSID); + } +#endif +} + + +/*----------------------------------------------------------------------------- + * Function: PHYCheckIsLegalRfPath8190Pci() + * + * Overview: Check different RF type to execute legal judgement. If RF Path is illegal + * We will return false. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/15/2007 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +BOOLEAN +PHY_CheckIsLegalRfPath8192C( + IN PADAPTER pAdapter, + IN u32 eRFPath) +{ +// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN rtValue = _TRUE; + + // NOt check RF Path now.! +#if 0 + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF90_PATH_A) + { + rtValue = FALSE; + } + if (pHalData->RF_Type == RF_1T2R && eRFPath != RF90_PATH_A) + { + + } +#endif + return rtValue; + +} /* PHY_CheckIsLegalRfPath8192C */ + +//------------------------------------------------------------------------- +// +// IQK +// +//------------------------------------------------------------------------- +#define MAX_TOLERANCE 5 +#define IQK_DELAY_TIME 1 //ms + +static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK +_PHY_PathA_IQK( + IN PADAPTER pAdapter, + IN BOOLEAN configPathB + ) +{ + u32 regEAC, regE94, regE9C, regEA4; + u8 result = 0x00; + + //RTPRINT(FINIT, INIT_IQK, ("Path A IQK!\n")); + + //path-A IQK setting + //RTPRINT(FINIT, INIT_IQK, ("Path-A IQK setting!\n")); + PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x10008c1f); + PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x10008c1f); + PHY_SetBBReg(pAdapter, 0xe38, bMaskDWord, 0x82140102); + + PHY_SetBBReg(pAdapter, 0xe3c, bMaskDWord, configPathB ? 0x28160202 : 0x28160502); + +#if 1 + //path-B IQK setting + if(configPathB) + { + PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe58, bMaskDWord, 0x82140102); + PHY_SetBBReg(pAdapter, 0xe5c, bMaskDWord, 0x28160202); + } +#endif + //LO calibration setting + //RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n")); + PHY_SetBBReg(pAdapter, 0xe4c, bMaskDWord, 0x001028d1); + + //One shot, path A LOK & IQK + //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n")); + PHY_SetBBReg(pAdapter, 0xe48, bMaskDWord, 0xf9000000); + PHY_SetBBReg(pAdapter, 0xe48, bMaskDWord, 0xf8000000); + + // delay x ms + //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME)); + rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000); + + // Check failed + regEAC = PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC)); + regE94 = PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xe94 = 0x%x\n", regE94)); + regE9C= PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xe9c = 0x%x\n", regE9C)); + regEA4= PHY_QueryBBReg(pAdapter, 0xea4, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regEA4)); + + if(!(regEAC & BIT28) && + (((regE94 & 0x03FF0000)>>16) != 0x142) && + (((regE9C & 0x03FF0000)>>16) != 0x42) ) + result |= 0x01; + else //if Tx not OK, ignore Rx + return result; + + if(!(regEAC & BIT27) && //if Tx is OK, check whether Rx is OK + (((regEA4 & 0x03FF0000)>>16) != 0x132) && + (((regEAC & 0x03FF0000)>>16) != 0x36)) + result |= 0x02; + else + DBG_8192C("Path A Rx IQK fail!!\n"); + + return result; + + +} + +static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK +_PHY_PathB_IQK( + IN PADAPTER pAdapter + ) +{ + u32 regEAC, regEB4, regEBC, regEC4, regECC; + u8 result = 0x00; + //RTPRINT(FINIT, INIT_IQK, ("Path B IQK!\n")); +#if 0 + //path-B IQK setting + RTPRINT(FINIT, INIT_IQK, ("Path-B IQK setting!\n")); + PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x10008c22); + PHY_SetBBReg(pAdapter, 0xe58, bMaskDWord, 0x82140102); + PHY_SetBBReg(pAdapter, 0xe5c, bMaskDWord, 0x28160202); + + //LO calibration setting + RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n")); + PHY_SetBBReg(pAdapter, 0xe4c, bMaskDWord, 0x001028d1); +#endif + //One shot, path B LOK & IQK + //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n")); + PHY_SetBBReg(pAdapter, 0xe60, bMaskDWord, 0x00000002); + PHY_SetBBReg(pAdapter, 0xe60, bMaskDWord, 0x00000000); + + // delay x ms + //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME)); + rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000); + + // Check failed + regEAC = PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC)); + regEB4 = PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regEB4)); + regEBC= PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xebc = 0x%x\n", regEBC)); + regEC4= PHY_QueryBBReg(pAdapter, 0xec4, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regEC4)); + regECC= PHY_QueryBBReg(pAdapter, 0xecc, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("0xecc = 0x%x\n", regECC)); + + if(!(regEAC & BIT31) && + (((regEB4 & 0x03FF0000)>>16) != 0x142) && + (((regEBC & 0x03FF0000)>>16) != 0x42)) + result |= 0x01; + else + return result; + + if(!(regEAC & BIT30) && + (((regEC4 & 0x03FF0000)>>16) != 0x132) && + (((regECC & 0x03FF0000)>>16) != 0x36)) + result |= 0x02; + else + DBG_8192C("Path B Rx IQK fail!!\n"); + + + return result; + +} + +static VOID +_PHY_PathAFillIQKMatrix( + IN PADAPTER pAdapter, + IN BOOLEAN bIQKOK, + IN int result[][8], + IN u8 final_candidate, + IN BOOLEAN bTxOnly + ) +{ + u32 Oldval_0, X, TX0_A, reg; + int Y, TX0_C; + + DBG_8192C("Path A IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"); + + if(final_candidate == 0xFF) + return; + else if(bIQKOK) + { + Oldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF; + + X = result[final_candidate][0]; + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + TX0_A = (X * Oldval_0) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX0_A = 0x%lx, Oldval_0 0x%lx\n", X, TX0_A, Oldval_0)); + PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X* Oldval_0>>7) & 0x1)); + + Y = result[final_candidate][1]; + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + TX0_C = (Y * Oldval_0) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX = 0x%lx\n", Y, TX0_C)); + PHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6)); + PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F)); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y* Oldval_0>>7) & 0x1)); + + if(bTxOnly) + { + DBG_8192C("_PHY_PathAFillIQKMatrix only Tx OK\n"); + return; + } + + reg = result[final_candidate][2]; + PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg); + + reg = result[final_candidate][3] & 0x3F; + PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg); + + reg = (result[final_candidate][3] >> 6) & 0xF; + PHY_SetBBReg(pAdapter, 0xca0, 0xF0000000, reg); + } +} + +static VOID +_PHY_PathBFillIQKMatrix( + IN PADAPTER pAdapter, + IN BOOLEAN bIQKOK, + IN int result[][8], + IN u8 final_candidate, + IN BOOLEAN bTxOnly //do Tx only + ) +{ + u32 Oldval_1, X, TX1_A, reg; + int Y, TX1_C; + + DBG_8192C("Path B IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"); + + if(final_candidate == 0xFF) + return; + else if(bIQKOK) + { + Oldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF; + + X = result[final_candidate][4]; + if ((X & 0x00000200) != 0) + X = X | 0xFFFFFC00; + TX1_A = (X * Oldval_1) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX1_A = 0x%lx\n", X, TX1_A)); + PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X* Oldval_1>>7) & 0x1)); + + Y = result[final_candidate][5]; + if ((Y & 0x00000200) != 0) + Y = Y | 0xFFFFFC00; + TX1_C = (Y * Oldval_1) >> 8; + //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX1_C = 0x%lx\n", Y, TX1_C)); + PHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6)); + PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F)); + PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y* Oldval_1>>7) & 0x1)); + + if(bTxOnly) + return; + + reg = result[final_candidate][6]; + PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg); + + reg = result[final_candidate][7] & 0x3F; + PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg); + + reg = (result[final_candidate][7] >> 6) & 0xF; + PHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg); + } +} + +static VOID +_PHY_SaveADDARegisters( + IN PADAPTER pAdapter, + IN u32* ADDAReg, + IN u32* ADDABackup, + IN u32 RegisterNum + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n")); + for( i = 0 ; i < RegisterNum ; i++){ + ADDABackup[i] = PHY_QueryBBReg(pAdapter, ADDAReg[i], bMaskDWord); + } +} + +static VOID +_PHY_SaveMACRegisters( + IN PADAPTER pAdapter, + IN u32* MACReg, + IN u32* MACBackup + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Save MAC parameters.\n")); + for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + MACBackup[i] =rtw_read8(pAdapter, MACReg[i]); + } + MACBackup[i] = rtw_read32(pAdapter, MACReg[i]); + +} + +static VOID +_PHY_ReloadADDARegisters( + IN PADAPTER pAdapter, + IN u32* ADDAReg, + IN u32* ADDABackup, + IN u32 RegiesterNum + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n")); + for(i = 0 ; i < RegiesterNum ; i++){ + PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, ADDABackup[i]); + } +} + +static VOID +_PHY_ReloadMACRegisters( + IN PADAPTER pAdapter, + IN u32* MACReg, + IN u32* MACBackup + ) +{ + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("Reload MAC parameters !\n")); + for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ + rtw_write8(pAdapter, MACReg[i], (u8)MACBackup[i]); + } + rtw_write32(pAdapter, MACReg[i], MACBackup[i]); +} + +static VOID +_PHY_PathADDAOn( + IN PADAPTER pAdapter, + IN u32* ADDAReg, + IN BOOLEAN isPathAOn, + IN BOOLEAN is2T + ) +{ + u32 pathOn; + u32 i; + + //RTPRINT(FINIT, INIT_IQK, ("ADDA ON.\n")); + + pathOn = isPathAOn ? 0x04db25a4 : 0x0b1b25a4; + if(_FALSE == is2T){ + pathOn = 0x0bdb25a0; + PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, 0x0b1b25a0); + } + else{ + PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, pathOn); + } + + for( i = 1 ; i < IQK_ADDA_REG_NUM ; i++){ + PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, pathOn); + } + +} + +static VOID +_PHY_MACSettingCalibration( + IN PADAPTER pAdapter, + IN u32* MACReg, + IN u32* MACBackup + ) +{ + u32 i = 0; + + //RTPRINT(FINIT, INIT_IQK, ("MAC settings for Calibration.\n")); + + rtw_write8(pAdapter, MACReg[i], 0x3F); + + for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){ + rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT3))); + } + rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT5))); + +} + +static VOID +_PHY_PathAStandBy( + IN PADAPTER pAdapter + ) +{ + //RTPRINT(FINIT, INIT_IQK, ("Path-A standby mode!\n")); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x0); + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80800000); +} + +static VOID +_PHY_PIModeSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN PIMode + ) +{ + u32 mode; + + //RTPRINT(FINIT, INIT_IQK, ("BB Switch to %s mode!\n", (PIMode ? "PI" : "SI"))); + + mode = PIMode ? 0x01000100 : 0x01000000; + PHY_SetBBReg(pAdapter, 0x820, bMaskDWord, mode); + PHY_SetBBReg(pAdapter, 0x828, bMaskDWord, mode); +} + +/* +return _FALSE => do IQK again +*/ +static BOOLEAN +_PHY_SimularityCompare( + IN PADAPTER pAdapter, + IN int result[][8], + IN u8 c1, + IN u8 c2 + ) +{ + u32 i, j, diff, SimularityBitMap, bound = 0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 final_candidate[2] = {0xFF, 0xFF}; //for path A and path B + BOOLEAN bResult = _TRUE, is2T = IS_92C_SERIAL( pHalData->VersionID); + + if(is2T) + bound = 8; + else + bound = 4; + + SimularityBitMap = 0; + + for( i = 0; i < bound; i++ ) + { + diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]); + if (diff > MAX_TOLERANCE) + { + if((i == 2 || i == 6) && !SimularityBitMap) + { + if(result[c1][i]+result[c1][i+1] == 0) + final_candidate[(i/4)] = c2; + else if (result[c2][i]+result[c2][i+1] == 0) + final_candidate[(i/4)] = c1; + else + SimularityBitMap = SimularityBitMap|(1<dmpriv; + u32 i; + u8 PathAOK, PathBOK; + u32 ADDA_REG[IQK_ADDA_REG_NUM] = { 0x85c, 0xe6c, 0xe70, 0xe74, + 0xe78, 0xe7c, 0xe80, 0xe84, + 0xe88, 0xe8c, 0xed0, 0xed4, + 0xed8, 0xedc, 0xee0, 0xeec }; + + u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {0x522, 0x550, 0x551,0x040}; + + u32 IQK_BB_REG[IQK_BB_REG_NUM] = { + 0xc04, 0xc08, 0x874, 0xb68, 0xb6c, + 0x870, 0x860, 0x864, 0x800 + }; + +#if MP_DRIVER + const u32 retryCount = 9; +#else + const u32 retryCount = 2; +#endif + + // Note: IQ calibration must be performed after loading + // PHY_REG.txt , and radio_a, radio_b.txt + + u32 bbvalue; + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + + if(t==0) + { + bbvalue = PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord); + //RTPRINT(FINIT, INIT_IQK, ("PHY_IQCalibrate()==>0x%08lx\n",bbvalue)); + + //RTPRINT(FINIT, INIT_IQK, ("IQ Calibration for %s\n", (is2T ? "2T2R" : "1T1R"))); + + // Save ADDA parameters, turn Path A ADDA on + _PHY_SaveADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup,IQK_ADDA_REG_NUM); + _PHY_SaveMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); + _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM); + } + _PHY_PathADDAOn(pAdapter, ADDA_REG, _TRUE, is2T); + + if(t==0) + { + pdmpriv->bRfPiEnable = (u8)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8)); + } + + if(!pdmpriv->bRfPiEnable){ + // Switch BB to PI mode to do IQ Calibration. + _PHY_PIModeSwitch(pAdapter, _TRUE); + } + + PHY_SetBBReg(pAdapter, 0x800, BIT24, 0x00); + PHY_SetBBReg(pAdapter, 0xc04, bMaskDWord, 0x03a05600); + PHY_SetBBReg(pAdapter, 0xc08, bMaskDWord, 0x000800e4); + PHY_SetBBReg(pAdapter, 0x874, bMaskDWord, 0x22204000); + PHY_SetBBReg(pAdapter, 0x870, BIT10, 0x01); + PHY_SetBBReg(pAdapter, 0x870, BIT26, 0x01); + PHY_SetBBReg(pAdapter, 0x860, BIT10, 0x00); + PHY_SetBBReg(pAdapter, 0x864, BIT10, 0x00); + + if(is2T) + { + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000); + PHY_SetBBReg(pAdapter, 0x844, bMaskDWord, 0x00010000); + } + + //MAC settings + _PHY_MACSettingCalibration(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); + + //Page B init + if(isNormal) + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00080000); + else + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0f600000); + + if(is2T) + { + if(isNormal) + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00080000); + else + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x0f600000); + } + + // IQ calibration setting + //RTPRINT(FINIT, INIT_IQK, ("IQK setting!\n")); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80800000); + PHY_SetBBReg(pAdapter, 0xe40, bMaskDWord, 0x01007c00); + PHY_SetBBReg(pAdapter, 0xe44, bMaskDWord, 0x01004800); + + for(i = 0 ; i < retryCount ; i++){ + PathAOK = _PHY_PathA_IQK(pAdapter, is2T); + if(PathAOK == 0x03){ + DBG_8192C("Path A IQK Success!!\n"); + result[t][0] = (PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord)&0x3FF0000)>>16; + result[t][1] = (PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord)&0x3FF0000)>>16; + result[t][2] = (PHY_QueryBBReg(pAdapter, 0xea4, bMaskDWord)&0x3FF0000)>>16; + result[t][3] = (PHY_QueryBBReg(pAdapter, 0xeac, bMaskDWord)&0x3FF0000)>>16; + break; + } + else if (i == (retryCount-1) && PathAOK == 0x01) //Tx IQK OK + { + DBG_8192C("Path A IQK Only Tx Success!!\n"); + + result[t][0] = (PHY_QueryBBReg(pAdapter, 0xe94, bMaskDWord)&0x3FF0000)>>16; + result[t][1] = (PHY_QueryBBReg(pAdapter, 0xe9c, bMaskDWord)&0x3FF0000)>>16; + } + } + + if(0x00 == PathAOK){ + DBG_8192C("Path A IQK failed!!\n"); + } + + if(is2T){ + _PHY_PathAStandBy(pAdapter); + + // Turn Path B ADDA on + _PHY_PathADDAOn(pAdapter, ADDA_REG, _FALSE, is2T); + + for(i = 0 ; i < retryCount ; i++){ + PathBOK = _PHY_PathB_IQK(pAdapter); + if(PathBOK == 0x03){ + DBG_8192C("Path B IQK Success!!\n"); + result[t][4] = (PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord)&0x3FF0000)>>16; + result[t][5] = (PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord)&0x3FF0000)>>16; + result[t][6] = (PHY_QueryBBReg(pAdapter, 0xec4, bMaskDWord)&0x3FF0000)>>16; + result[t][7] = (PHY_QueryBBReg(pAdapter, 0xecc, bMaskDWord)&0x3FF0000)>>16; + break; + } + else if (i == (retryCount - 1) && PathBOK == 0x01) //Tx IQK OK + { + DBG_8192C("Path B Only Tx IQK Success!!\n"); + result[t][4] = (PHY_QueryBBReg(pAdapter, 0xeb4, bMaskDWord)&0x3FF0000)>>16; + result[t][5] = (PHY_QueryBBReg(pAdapter, 0xebc, bMaskDWord)&0x3FF0000)>>16; + } + } + + if(0x00 == PathBOK){ + DBG_8192C("Path B IQK failed!!\n"); + } + } + + //Back to BB mode, load original value + //RTPRINT(FINIT, INIT_IQK, ("IQK:Back to BB mode, load original value!\n")); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0); + + if(t!=0) + { + if(!pdmpriv->bRfPiEnable){ + // Switch back BB to SI mode after finish IQ Calibration. + _PHY_PIModeSwitch(pAdapter, _FALSE); + } + + // Reload ADDA power saving parameters + _PHY_ReloadADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup, IQK_ADDA_REG_NUM); + + // Reload MAC parameters + _PHY_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup); + + // Reload BB parameters + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM); + + // Restore RX initial gain + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00032ed3); + if(is2T){ + PHY_SetBBReg(pAdapter, 0x844, bMaskDWord, 0x00032ed3); + } + + //load 0xe30 IQC default value + PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x01008c00); + PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x01008c00); + + } + //RTPRINT(FINIT, INIT_IQK, ("_PHY_IQCalibrate() <==\n")); + +} + + +static VOID +_PHY_LCCalibrate( + IN PADAPTER pAdapter, + IN BOOLEAN is2T + ) +{ + u8 tmpReg; + u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + + //Check continuous TX and Packet TX + tmpReg = rtw_read8(pAdapter, 0xd03); + + if((tmpReg&0x70) != 0) //Deal with contisuous TX case + rtw_write8(pAdapter, 0xd03, tmpReg&0x8F); //disable all continuous TX + else // Deal with Packet TX case + rtw_write8(pAdapter, REG_TXPAUSE, 0xFF); // block all queues + + if((tmpReg&0x70) != 0) + { + //1. Read original RF mode + //Path-A + RF_Amode = PHY_QueryRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits); + + //Path-B + if(is2T) + RF_Bmode = PHY_QueryRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits); + + //2. Set RF mode = standby mode + //Path-A + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000); + + //Path-B + if(is2T) + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000); + } + + //3. Read RF reg18 + LC_Cal = PHY_QueryRFReg(pAdapter, RF90_PATH_A, 0x18, bMask12Bits); + + //4. Set LC calibration begin + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x18, bMask12Bits, LC_Cal|0x08000); + + if(isNormal) { + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(100); + #else + rtw_mdelay_os(100); + #endif + } + else + rtw_mdelay_os(3); + + //Restore original situation + if((tmpReg&0x70) != 0) //Deal with contisuous TX case + { + //Path-A + rtw_write8(pAdapter, 0xd03, tmpReg); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMask12Bits, RF_Amode); + + //Path-B + if(is2T) + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x00, bMask12Bits, RF_Bmode); + } + else // Deal with Packet TX case + { + rtw_write8(pAdapter, REG_TXPAUSE, 0x00); + } + +} + + +//Analog Pre-distortion calibration +#define APK_BB_REG_NUM 8 +#define APK_CURVE_REG_NUM 4 +#define PATH_NUM 2 + +static VOID +_PHY_APCalibrate( + IN PADAPTER pAdapter, + IN char delta, + IN BOOLEAN is2T + ) +{ +#if 1//(PLATFORM == PLATFORM_WINDOWS)//??? + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + u32 regD[PATH_NUM]; + u32 tmpReg, index, offset, path, i, pathbound = PATH_NUM, apkbound; + + u32 BB_backup[APK_BB_REG_NUM]; + u32 BB_REG[APK_BB_REG_NUM] = { + 0x904, 0xc04, 0x800, 0xc08, 0x874, + 0x870, 0x860, 0x864 }; + u32 BB_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x00204000 }; + u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = { + 0x00000020, 0x00a05430, 0x02040000, + 0x000800e4, 0x22204000 }; + + u32 AFE_backup[IQK_ADDA_REG_NUM]; + u32 AFE_REG[IQK_ADDA_REG_NUM] = { + 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, + 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, + 0xed0, 0xed4, 0xed8, 0xedc, 0xee0, + 0xeec}; + + u32 MAC_backup[IQK_MAC_REG_NUM]; + u32 MAC_REG[IQK_MAC_REG_NUM] = { + 0x522, 0x550, 0x551, 0x040}; + + u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c}, + {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e} + }; + + u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { + {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings + {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c} + }; + + u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d}, + {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050} + }; + + u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings + {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a} + }; + + u32 APK_RF_value_A[PATH_NUM][APK_BB_REG_NUM] = { + {0x1adb0, 0x1adb0, 0x1ada0, 0x1ad90, 0x1ad80}, + {0x00fb0, 0x00fb0, 0x00fa0, 0x00f90, 0x00f80} + }; + + u32 AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u32 APK_offset[PATH_NUM] = { + 0xb68, 0xb6c}; + + u32 APK_normal_offset[PATH_NUM] = { + 0xb28, 0xb98}; + + u32 APK_value[PATH_NUM] = { + 0x92fc0000, 0x12fc0000}; + + u32 APK_normal_value[PATH_NUM] = { + 0x92680000, 0x12680000}; + + char APK_delta_mapping[APK_BB_REG_NUM][13] = { + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6}, + {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0} + }; + + u32 APK_normal_setting_value_1[13] = { + 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28, + 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3, + 0x12680000, 0x00880000, 0x00880000 + }; + + u32 APK_normal_setting_value_2[16] = { + 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3, + 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025, + 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008, + 0x00050006 + }; + + u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a + u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM]; + + int BB_offset, delta_V, delta_offset; + + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + +#if (MP_DRIVER == 1) + PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx; + + pMptCtx->APK_bound[0] = 45; + pMptCtx->APK_bound[1] = 52; +#endif + + //RTPRINT(FINIT, INIT_IQK, ("==>PHY_APCalibrate() delta %d\n", delta)); + + //RTPRINT(FINIT, INIT_IQK, ("AP Calibration for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip"))); + + if(!is2T) + pathbound = 1; + + //2 FOR NORMAL CHIP SETTINGS + if(isNormal) + { +// Temporarily do not allow normal driver to do the following settings because these offset +// and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal +// will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the +// root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31. +#if (MP_DRIVER != 1) + return; +#endif + + //settings adjust for normal chip + for(index = 0; index < PATH_NUM; index ++) + { + APK_offset[index] = APK_normal_offset[index]; + APK_value[index] = APK_normal_value[index]; + AFE_on_off[index] = 0x6fdb25a4; + } + + for(index = 0; index < APK_BB_REG_NUM; index ++) + { + for(path = 0; path < pathbound; path++) + { + APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index]; + APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index]; + } + BB_AP_MODE[index] = BB_normal_AP_MODE[index]; + } + + apkbound = 6; + } + else + { + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0fe00000); + if(is2T) + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x0fe00000); + apkbound = 12; + } + + //save BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0 && isNormal) //skip + continue; + BB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord); + } + + //save MAC default value + _PHY_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup); + + //save AFE default value + _PHY_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup,16); + + for(path = 0; path < pathbound; path++) + { + //save old AP curve + if(isNormal) + { + if(path == RF90_PATH_A) + { + //path A APK + //load APK setting + //path-A + offset = 0xb00; + for(index = 0; index < 11; index ++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x12680000); + + offset = 0xb68; + for(; index < 13; index ++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + + //path A + offset = 0xb00; + for(index = 0; index < 16; index++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + } + else if(path == RF90_PATH_B) + { + //path B APK + //load APK setting + //path-B + offset = 0xb70; + for(index = 0; index < 10; index ++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x12680000); + + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x12680000); + + offset = 0xb68; + index = 11; + for(; index < 13; index ++) //offset 0xb68, 0xb6c + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + + //page-B1 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + + //path B + offset = 0xb60; + for(index = 0; index < 16; index++) + { + PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); + + offset += 0x04; + } + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + } + +#if 0 + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x3, bMaskDWord); + AP_curve[path][0] = tmpReg & 0x1F; //[4:0] + + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord); + AP_curve[path][1] = (tmpReg & 0xF8000) >> 15; //[19:15] + AP_curve[path][2] = (tmpReg & 0x7C00) >> 10; //[14:10] + AP_curve[path][3] = (tmpReg & 0x3E0) >> 5; //[9:5] +#endif + } + else + { + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord); + + AP_curve[path][0] = (tmpReg & 0xF8000) >> 15; //[19:15] + AP_curve[path][1] = (tmpReg & 0x7C00) >> 10; //[14:10] + AP_curve[path][2] = (tmpReg & 0x3E0) >> 5; //[9:5] + AP_curve[path][3] = tmpReg & 0x1F; //[4:0] + } + + //save RF default value + regD[path] = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord); + + //Path A AFE all on, path B AFE All off or vise versa + for(index = 0; index < IQK_ADDA_REG_NUM ; index++) + PHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xe70 %x\n", PHY_QueryBBReg(pAdapter, 0xe70, bMaskDWord))); + + //BB to AP mode + if(path == 0) + { + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0 && isNormal) //skip + continue; + else if (index < 5) + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]); + else if (BB_REG[index] == 0x870) + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26); + else + PHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0); + } + PHY_SetBBReg(pAdapter, 0xe30, bMaskDWord, 0x01008c00); + PHY_SetBBReg(pAdapter, 0xe34, bMaskDWord, 0x01008c00); + } + else //path B + { + PHY_SetBBReg(pAdapter, 0xe50, bMaskDWord, 0x01008c00); + PHY_SetBBReg(pAdapter, 0xe54, bMaskDWord, 0x01008c00); + } + + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x800 %x\n", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord))); + + //MAC settings + _PHY_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup); + + if(path == RF90_PATH_A) //Path B to standby mode + { + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0, bMaskDWord, 0x10000); + } + else //Path A to standby mode + { + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMaskDWord, 0x10000); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x10, bMaskDWord, 0x1000f); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x11, bMaskDWord, 0x20103); + } + + delta_offset = ((delta+14)/2); + if(delta_offset < 0) + delta_offset = 0; + else if (delta_offset > 12) + delta_offset = 12; + + //AP calibration + for(index = 0; index < APK_BB_REG_NUM; index++) + { + if(index != 1 && isNormal) //only DO PA11+PAD01001, AP RF setting + continue; + + tmpReg = APK_RF_init_value[path][index]; +#if 1 + if(!pdmpriv->bAPKThermalMeterIgnore) + { + BB_offset = (tmpReg & 0xF0000) >> 16; + + if(!(tmpReg & BIT15)) //sign bit 0 + { + BB_offset = -BB_offset; + } + + delta_V = APK_delta_mapping[index][delta_offset]; + + BB_offset += delta_V; + + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() APK num %d delta_V %d delta_offset %d\n", index, delta_V, delta_offset)); + + if(BB_offset < 0) + { + tmpReg = tmpReg & (~BIT15); + BB_offset = -BB_offset; + } + else + { + tmpReg = tmpReg | BIT15; + } + tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16); + } +#endif + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xc, bMaskDWord, 0x8992e); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xc, bMaskDWord))); + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x0, bMaskDWord, APK_RF_value_0[path][index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x0, bMaskDWord))); + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord, tmpReg); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord))); + if(!isNormal) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xa, bMaskDWord, APK_RF_value_A[path][index]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xa %x\n", PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xa, bMaskDWord))); + } + + // PA11+PAD01111, one shot + i = 0; + do + { + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); + { + PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord))); + rtw_mdelay_os(3); + PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]); + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord))); + if(isNormal) { + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(20); + #else + rtw_mdelay_os(20); + #endif + } + else + rtw_mdelay_os(3); + } + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + if(!isNormal) + { + tmpReg = PHY_QueryRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xb, bMaskDWord); + tmpReg = (tmpReg & 0x3E00) >> 9; + } + else + { + if(path == RF90_PATH_A) + tmpReg = PHY_QueryBBReg(pAdapter, 0xbd8, 0x03E00000); + else + tmpReg = PHY_QueryBBReg(pAdapter, 0xbd8, 0xF8000000); + } + //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xbd8[25:21] %x\n", tmpReg)); + + i++; + } + while(tmpReg > apkbound && i < 4); + + APK_result[path][index] = tmpReg; + } + } + + //reload MAC default value + _PHY_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup); + + //reload BB default value + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(index == 0 && isNormal) //skip + continue; + PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]); + } + + //reload AFE default value + _PHY_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); + + //reload RF path default value + for(path = 0; path < pathbound; path++) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xd, bMaskDWord, regD[path]); + if(path == RF90_PATH_B) + { + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x10, bMaskDWord, 0x1000f); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x11, bMaskDWord, 0x20101); + } +#if 1 + if(!isNormal) + { + for(index = 0; index < APK_BB_REG_NUM ; index++) + { + if(APK_result[path][index] > 12) + APK_result[path][index] = AP_curve[path][index-1]; + //RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", index, APK_result[path][index])); + } + } + else + { //note no index == 0 + if (APK_result[path][1] > 6) + APK_result[path][1] = 6; + //RTPRINT(FINIT, INIT_IQK, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1])); + +#if 0 + if(APK_result[path][2] < 2) + APK_result[path][2] = 2; + else if (APK_result[path][2] > 6) + APK_result[path][2] = 6; + RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 2, APK_result[path][2])); + + if(APK_result[path][3] < 2) + APK_result[path][3] = 2; + else if (APK_result[path][3] > 6) + APK_result[path][3] = 6; + RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 3, APK_result[path][3])); + + if(APK_result[path][4] < 5) + APK_result[path][4] = 5; + else if (APK_result[path][4] > 9) + APK_result[path][4] = 9; + RTPRINT(FINIT, INIT_IQK, ("apk result %d 0x%x \t", 4, APK_result[path][4])); +#endif + + } +#endif + } + + //RTPRINT(FINIT, INIT_IQK, ("\n")); + + + for(path = 0; path < pathbound; path++) + { + if(isNormal) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x3, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1])); + if(path == RF90_PATH_A) + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05)); + else + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0x4, bMaskDWord, + ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05)); + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08)); + } + else + { + for(index = 0; index < 2; index++) + pdmpriv->APKoutput[path][index] = ((APK_result[path][index] << 15) | (APK_result[path][2] << 10) | (APK_result[path][3] << 5) | APK_result[path][4]); + +#if (MP_DRIVER == 1) + if(pMptCtx->TxPwrLevel[path] > pMptCtx->APK_bound[path]) + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + pdmpriv->APKoutput[path][0]); + } + else + { + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + pdmpriv->APKoutput[path][1]); + } +#else + PHY_SetRFReg(pAdapter, (RF90_RADIO_PATH_E)path, 0xe, bMaskDWord, + pdmpriv->APKoutput[path][0]); +#endif + } + } + + pdmpriv->bAPKdone = _TRUE; + + //RTPRINT(FINIT, INIT_IQK, ("<==PHY_APCalibrate()\n")); +#endif +} + + +#define DP_BB_REG_NUM 7 +#define DP_RF_REG_NUM 1 +#define DP_RETRY_LIMIT 10 +#define DP_PATH_NUM 2 +#define DP_DPK_NUM 3 +#define DP_DPK_VALUE_NUM 2 + +//digital predistortion +static VOID +_PHY_DigitalPredistortion( + IN PADAPTER pAdapter, + IN BOOLEAN is2T + ) +{ +#if 1//(PLATFORM == PLATFORM_WINDOWS) + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + u32 tmpReg, tmpReg2, index, offset, path, i, pathbound = PATH_NUM; + u32 AFE_backup[IQK_ADDA_REG_NUM]; + u32 AFE_REG[IQK_ADDA_REG_NUM] = { + 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, + 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, + 0xed0, 0xed4, 0xed8, 0xedc, 0xee0, + 0xeec}; + + u32 BB_backup[DP_BB_REG_NUM]; + u32 BB_REG[DP_BB_REG_NUM] = { + 0xc04, 0x800, 0xc08, 0x874, + 0x870, 0x860, 0x864}; + u32 BB_settings[DP_BB_REG_NUM] = { + 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, + 0x0, 0x0, 0x0}; + + u32 RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; + u32 RF_REG[DP_RF_REG_NUM] = { + 0x0d}; + + u32 MAC_backup[IQK_MAC_REG_NUM]; + u32 MAC_REG[IQK_MAC_REG_NUM] = { + 0x522, 0x550, 0x551, 0x040}; + + u32 Tx_AGC[DP_DPK_NUM][DP_DPK_VALUE_NUM] = { + {0x1e1e1e1e, 0x03901e1e}, + {0x18181818, 0x03901818}, + {0x0e0e0e0e, 0x03900e0e} + }; + +// u32 RF_PATHA_backup[DP_RF_REG_NUM]; +// u32 RF_REG_PATHA[DP_RF_REG_NUM] = { +// 0x00, 0x10, 0x11}; + + u32 Reg800, Reg874, Regc04, Regc08, Reg040; + + u32 AFE_on_off[PATH_NUM] = { + 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on + + u32 RetryCount = 0; + + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + + //DBG_8192C("==>_PHY_DigitalPredistortion()\n"); + + //DBG_8192C("_PHY_DigitalPredistortion for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip")); + + if(!isNormal) + return; + + //save BB default value + for(index=0; index tx_agc 1f ~11 + // PA gain = 11 & PAD2 => tx_agc 10~0e + // PA gain = 01 => tx_agc 0b~0d + // PA gain = 00 => tx_agc 0a~00 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + PHY_SetBBReg(pAdapter, 0xbc0, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 3; index++) + PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, Tx_AGC[i][0]); + PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, Tx_AGC[i][1]); + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0xe10+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02097098); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path A + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x80047788); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x00047788); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + } + + //PA gain = 11 => tx_agc = 1a + for(index = 0; index < 3; index++) + PHY_SetBBReg(pAdapter, 0xe00+index*4, bMaskDWord, 0x34343434); + PHY_SetBBReg(pAdapter, 0xe08+index*4, bMaskDWord, 0x03903434); + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0xe10+index*4, bMaskDWord, 0x34343434); + + //==================================== + // PAGE_B for Path-A DPK setting + //==================================== + // open inner loopback @ b00[19]:10 od 0xb00 0x01097018 + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02017098); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); + + //rf_lpbk_setup + //1.rf 00:5205a, rf 0d:0e52c + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x0c, bMaskDWord, 0x8992b); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x0d, bMaskDWord, 0x0e52c); + PHY_SetRFReg(pAdapter, RF90_PATH_A, 0x00, bMaskDWord, 0x5205a ); + + //----send one shot signal----// + // Path A + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + + while(RetryCount < DP_RETRY_LIMIT && !pdmpriv->bDPPathAOK) + { + //----read back measurement results----// + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x0c297018); + tmpReg = PHY_QueryBBReg(pAdapter, 0xbe0, bMaskDWord); + rtw_mdelay_os(10); + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x0c29701f); + tmpReg2 = PHY_QueryBBReg(pAdapter, 0xbe8, bMaskDWord); + rtw_mdelay_os(10); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff ) + { + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x02017098); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + RetryCount++; + DBG_8192C("path A DPK RetryCount %d 0xbe0[31:16] %x 0xbe8[31:16] %x\n", RetryCount, tmpReg, tmpReg2); + } + else + { + DBG_8192C("path A DPK Sucess\n"); + pdmpriv->bDPPathAOK = _TRUE; + break; + } + } + RetryCount = 0; + + //DPP path A + if(pdmpriv->bDPPathAOK) + { + // DP settings + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x01017098); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0x776d9f84); + PHY_SetBBReg(pAdapter, 0xb28, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb68, bMaskDWord, 0x00880000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + + for(i=0xb00; i<=0xb3c; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x40004000); + //DBG_8192C("path A ofsset = 0x%x\n", i); + } + + //pwsf + PHY_SetBBReg(pAdapter, 0xb40, bMaskDWord, 0x40404040); + PHY_SetBBReg(pAdapter, 0xb44, bMaskDWord, 0x28324040); + PHY_SetBBReg(pAdapter, 0xb48, bMaskDWord, 0x10141920); + + for(i=0xb4c; i<=0xb5c; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x0c0c0c0c); + } + + //TX_AGC boundary + PHY_SetBBReg(pAdapter, 0xbc0, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + } + else + { + PHY_SetBBReg(pAdapter, 0xb00, bMaskDWord, 0x00000000); + PHY_SetBBReg(pAdapter, 0xb04, bMaskDWord, 0x00000000); + } + + //DPK path B + if(is2T) + { + //Path A to standby mode + PHY_SetRFReg(pAdapter, RF90_PATH_A, RF_AC, bMaskDWord, 0x10000); + + // LUTs => tx_agc + // PA gain = 11 & PAD1, => tx_agc 1f ~11 + // PA gain = 11 & PAD2, => tx_agc 10 ~0e + // PA gain = 01 => tx_agc 0b ~0d + // PA gain = 00 => tx_agc 0a ~00 + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + PHY_SetBBReg(pAdapter, 0xbc4, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + //do inner loopback DPK 3 times + for(i = 0; i < 3; i++) + { + //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0x830+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x848+index*4, bMaskDWord, Tx_AGC[i][0]); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x868+index*4, bMaskDWord, Tx_AGC[i][0]); + + // PAGE_B for Path-A inner loopback DPK setting + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02097098); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); + + //----send one shot signal----// + // Path B + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x80047788); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x00047788); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + } + + // PA gain = 11 => tx_agc = 1a + for(index = 0; index < 4; index++) + PHY_SetBBReg(pAdapter, 0x830+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x848+index*4, bMaskDWord, 0x34343434); + for(index = 0; index < 2; index++) + PHY_SetBBReg(pAdapter, 0x868+index*4, bMaskDWord, 0x34343434); + + // PAGE_B for Path-B DPK setting + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02017098); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0xf76d9f84); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); + + // RF lpbk switches on + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x0101000f); + PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x01120103); + + //Path-B RF lpbk + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0c, bMaskDWord, 0x8992b); + PHY_SetRFReg(pAdapter, RF90_PATH_B, 0x0d, bMaskDWord, 0x0e52c); + PHY_SetRFReg(pAdapter, RF90_PATH_B, RF_AC, bMaskDWord, 0x5205a); + + //----send one shot signal----// + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + + while(RetryCount < DP_RETRY_LIMIT && !pdmpriv->bDPPathBOK) + { + //----read back measurement results----// + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x0c297018); + tmpReg = PHY_QueryBBReg(pAdapter, 0xbf0, bMaskDWord); + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x0c29701f); + tmpReg2 = PHY_QueryBBReg(pAdapter, 0xbf8, bMaskDWord); + + tmpReg = (tmpReg & bMaskHWord) >> 16; + tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; + + if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff) + { + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x02017098); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x80000000); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x800477c0); + rtw_mdelay_os(1); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x000477c0); + #ifdef CONFIG_LONG_DELAY_ISSUE + rtw_msleep_os(50); + #else + rtw_mdelay_os(50); + #endif + RetryCount++; + DBG_8192C("path B DPK RetryCount %d 0xbf0[31:16] %x, 0xbf8[31:16] %x\n", RetryCount , tmpReg, tmpReg2); + } + else + { + DBG_8192C("path B DPK Success\n"); + pdmpriv->bDPPathBOK = _TRUE; + break; + } + } + + //DPP path B + if(pdmpriv->bDPPathBOK) + { + // DP setting + // LUT by SRAM + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x01017098); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0x776d9f84); + PHY_SetBBReg(pAdapter, 0xb98, bMaskDWord, 0x0004ab87); + PHY_SetBBReg(pAdapter, 0xb6c, bMaskDWord, 0x00880000); + + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x40000000); + for(i=0xb60; i<=0xb9c; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x40004000); + //DBG_8192C("path B ofsset = 0x%x\n", i); + } + + // PWSF + PHY_SetBBReg(pAdapter, 0xba0, bMaskDWord, 0x40404040); + PHY_SetBBReg(pAdapter, 0xba4, bMaskDWord, 0x28324050); + PHY_SetBBReg(pAdapter, 0xba8, bMaskDWord, 0x0c141920); + + for(i=0xbac; i<=0xbbc; i+=4) + { + PHY_SetBBReg(pAdapter, i, bMaskDWord, 0x0c0c0c0c); + } + + // tx_agc boundary + PHY_SetBBReg(pAdapter, 0xbc4, bMaskDWord, 0x0005361f); + PHY_SetBBReg(pAdapter, 0xe28, bMaskDWord, 0x00000000); + + } + else + { + PHY_SetBBReg(pAdapter, 0xb70, bMaskDWord, 0x00000000); + PHY_SetBBReg(pAdapter, 0xb74, bMaskDWord, 0x00000000); + } + } + + //reload BB default value + for(index=0; indexbDPdone = _TRUE; + //DBG_8192C("<==_PHY_DigitalPredistortion()\n"); +#endif +} + + +static VOID _PHY_SetRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN bMain, + IN BOOLEAN is2T + ) +{ + u8 u1bTmp; + + if(!pAdapter->hw_init_completed) + { + u1bTmp = rtw_read8(pAdapter, REG_LEDCFG2) | BIT7; + rtw_write8(pAdapter, REG_LEDCFG2, u1bTmp); + //PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) + { + if(bMain) + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A + else + PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT + } + else + { + + if(bMain) + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x2); //Main + else + PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300, 0x1); //Aux + } + +} + +//return value TRUE => Main; FALSE => Aux + +static BOOLEAN _PHY_QueryRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN is2T + ) +{ +// if(is2T) +// return _TRUE; + + if(!pAdapter->hw_init_completed) + { + PHY_SetBBReg(pAdapter, REG_LEDCFG0, BIT23, 0x01); + PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + } + + if(is2T) + { + if(PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) + return _TRUE; + else + return _FALSE; + } + else + { + if(PHY_QueryBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, 0x300) == 0x02) + return _TRUE; + else + return _FALSE; + } +} + + +static VOID +_PHY_DumpRFReg(IN PADAPTER pAdapter) +{ + u32 rfRegValue,rfRegOffset; + + //RTPRINT(FINIT, INIT_RF, ("PHY_DumpRFReg()====>\n")); + + for(rfRegOffset = 0x00;rfRegOffset<=0x30;rfRegOffset++){ + rfRegValue = PHY_QueryRFReg(pAdapter,RF90_PATH_A, rfRegOffset, bMaskDWord); + //RTPRINT(FINIT, INIT_RF, (" 0x%02x = 0x%08x\n",rfRegOffset,rfRegValue)); + } + //RTPRINT(FINIT, INIT_RF, ("<===== PHY_DumpRFReg()\n")); +} + + +VOID +rtl8192c_PHY_IQCalibrate( + IN PADAPTER pAdapter, + IN BOOLEAN bReCovery + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u32 IQK_BB_REG[9] = { + rOFDM0_XARxIQImbalance, rOFDM0_XBRxIQImbalance, rOFDM0_ECCAThreshold, rOFDM0_AGCRSSITable, + rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance, rOFDM0_XCTxAFE, rOFDM0_XDTxAFE, rOFDM0_RxIQExtAnta}; + int result[4][8]; //last is final result + u8 i, final_candidate; + BOOLEAN bPathAOK, bPathBOK; + int RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0; + BOOLEAN is12simular, is13simular, is23simular; + + +#if (MP_DRIVER == 1) + //ignore IQK when continuous Tx + if (pAdapter->mppriv.MptCtx.bStartContTx == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bCarrierSuppression == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleCarrier == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleTone == _TRUE) + return; +#endif + +#if DISABLE_BB_RF + return; +#endif + + if(bReCovery) + { + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); + return; + } + DBG_8192C("IQK:Start!!!\n"); + + for(i = 0; i < 8; i++) + { + result[0][i] = 0; + result[1][i] = 0; + result[2][i] = 0; + result[3][i] = 0; + } + final_candidate = 0xff; + bPathAOK = _FALSE; + bPathBOK = _FALSE; + is12simular = _FALSE; + is23simular = _FALSE; + is13simular = _FALSE; + + for (i=0; i<3; i++) + { + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_IQCalibrate(pAdapter, result, i, _TRUE); + //_PHY_DumpRFReg(pAdapter); + } + else{ + // For 88C 1T1R + _PHY_IQCalibrate(pAdapter, result, i, _FALSE); + } + + if(i == 1) + { + is12simular = _PHY_SimularityCompare(pAdapter, result, 0, 1); + if(is12simular) + { + final_candidate = 0; + break; + } + } + + if(i == 2) + { + is13simular = _PHY_SimularityCompare(pAdapter, result, 0, 2); + if(is13simular) + { + final_candidate = 0; + break; + } + + is23simular = _PHY_SimularityCompare(pAdapter, result, 1, 2); + if(is23simular) + final_candidate = 1; + else + { + for(i = 0; i < 8; i++) + RegTmp += result[3][i]; + + if(RegTmp != 0) + final_candidate = 3; + else + final_candidate = 0xFF; + } + } + } + + for (i=0; i<4; i++) + { + RegE94 = result[i][0]; + RegE9C = result[i][1]; + RegEA4 = result[i][2]; + RegEAC = result[i][3]; + RegEB4 = result[i][4]; + RegEBC = result[i][5]; + RegEC4 = result[i][6]; + RegECC = result[i][7]; + //RTPRINT(FINIT, INIT_IQK, ("IQK: RegE94=%lx RegE9C=%lx RegEA4=%lx RegEAC=%lx RegEB4=%lx RegEBC=%lx RegEC4=%lx RegECC=%lx\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC)); + } + + if(final_candidate != 0xff) + { + pdmpriv->RegE94 = RegE94 = result[final_candidate][0]; + pdmpriv->RegE9C = RegE9C = result[final_candidate][1]; + RegEA4 = result[final_candidate][2]; + RegEAC = result[final_candidate][3]; + pdmpriv->RegEB4 = RegEB4 = result[final_candidate][4]; + pdmpriv->RegEBC = RegEBC = result[final_candidate][5]; + RegEC4 = result[final_candidate][6]; + RegECC = result[final_candidate][7]; + DBG_8192C("IQK: final_candidate is %x\n", final_candidate); + DBG_8192C("IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC); + bPathAOK = bPathBOK = _TRUE; + } + else + { + + #if 0 + DBG_871X("%s do _PHY_ReloadADDARegisters\n"); + _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); + return; + #else + pdmpriv->RegE94 = pdmpriv->RegEB4 = 0x100; //X default value + pdmpriv->RegE9C = pdmpriv->RegEBC = 0x0; //Y default value + #endif + } + + if((RegE94 != 0)/*&&(RegEA4 != 0)*/) + _PHY_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0)); + + if(IS_92C_SERIAL( pHalData->VersionID)){ + if((RegEB4 != 0)/*&&(RegEC4 != 0)*/) + _PHY_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0)); + } + + _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG, pdmpriv->IQK_BB_backup_recover, 9); + +} + + +VOID +rtl8192c_PHY_LCCalibrate( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + +#if (MP_DRIVER == 1) + // ignore LCK when continuous Tx + if (pAdapter->mppriv.MptCtx.bStartContTx == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bCarrierSuppression == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleCarrier == _TRUE) + return; + if (pAdapter->mppriv.MptCtx.bSingleTone == _TRUE) + return; +#endif + +#if DISABLE_BB_RF + return; +#endif + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_LCCalibrate(pAdapter, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_LCCalibrate(pAdapter, _FALSE); + } +} + +VOID +rtl8192c_PHY_APCalibrate( + IN PADAPTER pAdapter, + IN char delta + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#if DISABLE_BB_RF + return; +#endif + + if(pdmpriv->bAPKdone) + return; + +// if(IS_NORMAL_CHIP(pHalData->VersionID)) +// return; + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_APCalibrate(pAdapter, delta, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_APCalibrate(pAdapter, delta, _FALSE); + } +} + +VOID +rtl8192c_PHY_DigitalPredistortion( + IN PADAPTER pAdapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +#if DISABLE_BB_RF + return; +#endif + + return; + + if(pdmpriv->bDPdone) + return; + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_DigitalPredistortion(pAdapter, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_DigitalPredistortion(pAdapter, _FALSE); + } +} + +VOID rtl8192c_PHY_SetRFPathSwitch( + IN PADAPTER pAdapter, + IN BOOLEAN bMain + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + +#if DISABLE_BB_RF + return; +#endif + + if(IS_92C_SERIAL( pHalData->VersionID)){ + _PHY_SetRFPathSwitch(pAdapter, bMain, _TRUE); + } + else{ + // For 88C 1T1R + _PHY_SetRFPathSwitch(pAdapter, bMain, _FALSE); + } +} + +// +// Move from phycfg.c to gen.c to be code independent later +// +//-------------------------Move to other DIR later----------------------------*/ +#ifdef CONFIG_USB_HCI + +// +// Description: +// To dump all Tx FIFO LLT related link-list table. +// Added by Roger, 2009.03.10. +// +VOID +DumpBBDbgPort_92CU( + IN PADAPTER Adapter + ) +{ + + //RT_TRACE(COMP_SEND, DBG_WARNING, ("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("BaseBand Debug Ports:\n")); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0803); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0a06); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0007); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); + PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x000f0000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + PHY_SetBBReg(Adapter, 0x0908, 0xffff, 0x0100); + PHY_SetBBReg(Adapter, 0x0a28, 0x00ff0000, 0x00150000); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xdf4, PHY_QueryBBReg(Adapter, 0x0df4, bMaskDWord))); + + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x800, PHY_QueryBBReg(Adapter, 0x0800, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0x900, PHY_QueryBBReg(Adapter, 0x0900, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa00, PHY_QueryBBReg(Adapter, 0x0a00, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa54, PHY_QueryBBReg(Adapter, 0x0a54, bMaskDWord))); + //RT_TRACE(COMP_SEND, DBG_WARNING, ("Offset[%x]: %x\n", 0xa58, PHY_QueryBBReg(Adapter, 0x0a58, bMaskDWord))); + +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c new file mode 100755 index 000000000000..d17c23f9a720 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rf6052.c @@ -0,0 +1,1047 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192c_rf6052.c ( Source C File) + * + * Note: Provide RF 6052 series relative API. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * 11/05/2008 MHC Add API for tw power setting. + * + * +******************************************************************************/ + +#define _RTL8192C_RF6052_C_ + +#include +#include +#include +#include + +#include + +/*---------------------------Define Local Constant---------------------------*/ +// Define local structure for debug!!!!! +typedef struct RF_Shadow_Compare_Map { + // Shadow register value + u32 Value; + // Compare or not flag + u8 Compare; + // Record If it had ever modified unpredicted + u8 ErrorOrNot; + // Recorver Flag + u8 Recorver; + // + u8 Driver_Write; +}RF_SHADOW_T; +/*---------------------------Define Local Constant---------------------------*/ + + +/*------------------------Define global variable-----------------------------*/ +/*------------------------Define global variable-----------------------------*/ + + +/*------------------------Define local variable------------------------------*/ +// 2008/11/20 MH For Debug only, RF +//static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG] = {0}; +static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG]; +/*------------------------Define local variable------------------------------*/ + + +/*----------------------------------------------------------------------------- + * Function: RF_ChangeTxPath + * + * Overview: For RL6052, we must change some RF settign for 1T or 2T. + * + * Input: u2Byte DataRate // 0x80-8f, 0x90-9f + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 09/25/2008 MHC Create Version 0. + * Firmwaer support the utility later. + * + *---------------------------------------------------------------------------*/ +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate) +{ +// We do not support gain table change inACUT now !!!! Delete later !!! +#if 0//(RTL92SE_FPGA_VERIFY == 0) + static u1Byte RF_Path_Type = 2; // 1 = 1T 2= 2T + static u4Byte tx_gain_tbl1[6] + = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100}; + static u4Byte tx_gain_tbl2[6] + = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030}; + u1Byte i; + + if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7) + { + // Set TX SYNC power G2G3 loop filter + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x0f000); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G3, bRFRegOffsetMask, 0xeacf1); + + // Change TX AGC gain table + for (i = 0; i < 6; i++) + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl1[i]); + + // Set PA to high value + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x01e39); + } + else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8) + { + // Set TX SYNC power G2G3 loop filter + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x04440); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G3, bRFRegOffsetMask, 0xea4f1); + + // Change TX AGC gain table + for (i = 0; i < 6; i++) + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TX_AGC, bRFRegOffsetMask, tx_gain_tbl2[i]); + + // Set PA low gain + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, + RF_TXPA_G2, bRFRegOffsetMask, 0x01e19); + } +#endif + +} /* RF_ChangeTxPath */ + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetBandwidth() + * + * Overview: This function is called by SetBWModeCallback8190Pci() only + * + * Input: PADAPTER Adapter + * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M + * + * Output: NONE + * + * Return: NONE + * + * Note: For RF type 0222D + *---------------------------------------------------------------------------*/ +VOID +rtl8192c_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth) //20M or 40M +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(Bandwidth) + { + case HT_CHANNEL_WIDTH_20: + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400); + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); + break; + + case HT_CHANNEL_WIDTH_40: + pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff)); + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); + break; + + default: + //RT_TRACE(COMP_DBG, DBG_LOUD, ("PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth )); + break; + } + +} + + +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetCckTxPower + * + * Overview: + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/05/2008 MHC Simulate 8192series.. + * + *---------------------------------------------------------------------------*/ + +VOID +rtl8192c_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + //PMGNT_INFO pMgntInfo=&Adapter->MgntInfo; + u32 TxAGC[2]={0, 0}, tmpval=0; + BOOLEAN TurboScanOff = _FALSE; + u8 idx1, idx2; + u8* ptr; + + // 2010/10/18 MH Accorsing to SD3 eechou's suggestion, we need to disable turbo scan for RU. + // Otherwise, external PA will be broken if power index > 0x20. +#ifdef CONFIG_USB_HCI + if (pHalData->EEPROMRegulatory != 0 || pHalData->ExternalPA) +#else + if (pHalData->EEPROMRegulatory != 0) +#endif + { + //DbgPrint("TurboScanOff=1 EEPROMRegulatory=%d ExternalPA=%d\n", pHalData->EEPROMRegulatory, pHalData->ExternalPA); + TurboScanOff = _TRUE; + } + + if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS) + { + TxAGC[RF90_PATH_A] = 0x3f3f3f3f; + TxAGC[RF90_PATH_B] = 0x3f3f3f3f; + + TurboScanOff = _TRUE;//disable turbo scan + + if(TurboScanOff) + { + for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); +#ifdef CONFIG_USB_HCI + // 2010/10/18 MH For external PA module. We need to limit power index to be less than 0x20. + if (TxAGC[idx1] > 0x20 && pHalData->ExternalPA) + TxAGC[idx1] = 0x20; +#endif + } + } + } + else + { +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + { + TxAGC[RF90_PATH_A] = 0x10101010; + TxAGC[RF90_PATH_B] = 0x10101010; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + { + TxAGC[RF90_PATH_A] = 0x00000000; + TxAGC[RF90_PATH_B] = 0x00000000; + } + else + { + for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) + { + TxAGC[idx1] = + pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | + (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); + } + + if(pHalData->EEPROMRegulatory==0) + { + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][6]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][7]<<8); + TxAGC[RF90_PATH_A] += tmpval; + + tmpval = (pHalData->MCSTxPowerLevelOriginalOffset[0][14]) + + (pHalData->MCSTxPowerLevelOriginalOffset[0][15]<<24); + TxAGC[RF90_PATH_B] += tmpval; + } + } + } + + for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) + { + ptr = (u8*)(&(TxAGC[idx1])); + for(idx2=0; idx2<4; idx2++) + { + if(*ptr > RF6052_MAX_TX_PWR) + *ptr = RF6052_MAX_TX_PWR; + ptr++; + } + } + + // rf-A cck tx power + tmpval = TxAGC[RF90_PATH_A]&0xff; + PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); + tmpval = TxAGC[RF90_PATH_A]>>8; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + + // rf-B cck tx power + tmpval = TxAGC[RF90_PATH_B]>>24; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); + tmpval = TxAGC[RF90_PATH_B]&0x00ffffff; + PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); + //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", + // tmpval, rTxAGC_B_CCK1_55_Mcs32)); + +} /* PHY_RF6052SetCckTxPower */ + +// +// powerbase0 for OFDM rates +// powerbase1 for HT MCS rates +// +static void getPowerBase( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel, + IN OUT u32* OfdmBase, + IN OUT u32* MCSBase + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 powerBase0, powerBase1; + u8 Legacy_pwrdiff=0, HT20_pwrdiff=0; + u8 i, powerlevel[2]; + + for(i=0; i<2; i++) + { + powerlevel[i] = pPowerLevel[i]; + Legacy_pwrdiff = pHalData->TxPwrLegacyHtDiff[i][Channel-1]; + powerBase0 = powerlevel[i] + Legacy_pwrdiff; + + powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0; + *(OfdmBase+i) = powerBase0; + //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(OfdmBase+i))); + } + + for(i=0; i<2; i++) + { + //Check HT20 to HT40 diff + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) + { + HT20_pwrdiff = pHalData->TxPwrHt20Diff[i][Channel-1]; + powerlevel[i] += HT20_pwrdiff; + } + powerBase1 = powerlevel[i]; + powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1; + *(MCSBase+i) = powerBase1; + //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index rf(%c) = 0x%x]\n", ((i==0)?'A':'B'), *(MCSBase+i))); + } +} + +static void getTxPowerWriteValByRegulatory( + IN PADAPTER Adapter, + IN u8 Channel, + IN u8 index, + IN u32* powerBase0, + IN u32* powerBase1, + OUT u32* pOutWriteVal + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i, chnlGroup, pwr_diff_limit[4]; + u32 writeVal, customer_limit, rf; + + // + // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate + // + for(rf=0; rf<2; rf++) + { + switch(pHalData->EEPROMRegulatory) + { + case 0: // Realtek better performance + // increase power diff defined by Realtek for large power + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 1: // Realtek regulatory + // increase power diff defined by Realtek for regulatory + { + if(pHalData->pwrGroupCnt == 1) + chnlGroup = 0; + if(pHalData->pwrGroupCnt >= 3) + { + if(Channel <= 3) + chnlGroup = 0; + else if(Channel >= 4 && Channel <= 9) + chnlGroup = 1; + else if(Channel > 9) + chnlGroup = 2; + + if(pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20) + chnlGroup++; + else + chnlGroup+=4; + } + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + //chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + } + break; + case 2: // Better regulatory + // don't increase any power diff + writeVal = ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Better regulatory, writeVal(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + case 3: // Customer defined power diff. + // increase power diff defined by customer. + chnlGroup = 0; + //RTPRINT(FPHY, PHY_TXPWR, ("MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", + // chnlGroup, index, pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)])); + + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) + { + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 40MHz rf(%c) = 0x%x\n", + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT40[rf][Channel-1])); + } + else + { + //RTPRINT(FPHY, PHY_TXPWR, ("customer's limit, 20MHz rf(%c) = 0x%x\n", + // ((rf==0)?'A':'B'), pHalData->PwrGroupHT20[rf][Channel-1])); + } + for (i=0; i<4; i++) + { + pwr_diff_limit[i] = (u8)((pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)]&(0x7f<<(i*8)))>>(i*8)); + if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_40) + { + if(pwr_diff_limit[i] > pHalData->PwrGroupHT40[rf][Channel-1]) + pwr_diff_limit[i] = pHalData->PwrGroupHT40[rf][Channel-1]; + } + else + { + if(pwr_diff_limit[i] > pHalData->PwrGroupHT20[rf][Channel-1]) + pwr_diff_limit[i] = pHalData->PwrGroupHT20[rf][Channel-1]; + } + } + customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) | + (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer's limit rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), customer_limit)); + + writeVal = customer_limit + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("Customer, writeVal rf(%c)= 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + default: + chnlGroup = 0; + writeVal = pHalData->MCSTxPowerLevelOriginalOffset[chnlGroup][index+(rf?8:0)] + + ((index<2)?powerBase0[rf]:powerBase1[rf]); + //RTPRINT(FPHY, PHY_TXPWR, ("RTK better performance, writeVal rf(%c) = 0x%x\n", ((rf==0)?'A':'B'), writeVal)); + break; + } + +// 20100427 Joseph: Driver dynamic Tx power shall not affect Tx power. It shall be determined by power training mechanism. +// Currently, we cannot fully disable driver dynamic tx power mechanism because it is referenced by BT coexist mechanism. +// In the future, two mechanism shall be separated from each other and maintained independantly. Thanks for Lanhsin's reminder. + + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) + writeVal = 0x14141414; + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) + writeVal = 0x00000000; + + + // 20100628 Joseph: High power mode for BT-Coexist mechanism. + // This mechanism is only applied when Driver-Highpower-Mechanism is OFF. + if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT1) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-6)\n")); + writeVal = writeVal - 0x06060606; + } + else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_BT2) + { + //RTPRINT(FBT, BT_TRACE, ("Tx Power (-0)\n")); + writeVal = writeVal; + } + *(pOutWriteVal+rf) = writeVal; + } +} + +static void writeOFDMPowerReg( + IN PADAPTER Adapter, + IN u8 index, + IN u32* pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u16 RegOffset_A[6] = { rTxAGC_A_Rate18_06, rTxAGC_A_Rate54_24, + rTxAGC_A_Mcs03_Mcs00, rTxAGC_A_Mcs07_Mcs04, + rTxAGC_A_Mcs11_Mcs08, rTxAGC_A_Mcs15_Mcs12}; + u16 RegOffset_B[6] = { rTxAGC_B_Rate18_06, rTxAGC_B_Rate54_24, + rTxAGC_B_Mcs03_Mcs00, rTxAGC_B_Mcs07_Mcs04, + rTxAGC_B_Mcs11_Mcs08, rTxAGC_B_Mcs15_Mcs12}; + u8 i, rf, pwr_val[4]; + u32 writeVal; + u16 RegOffset; + + for(rf=0; rf<2; rf++) + { + writeVal = pValue[rf]; + for(i=0; i<4; i++) + { + pwr_val[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8)); + if (pwr_val[i] > RF6052_MAX_TX_PWR) + pwr_val[i] = RF6052_MAX_TX_PWR; + } + writeVal = (pwr_val[3]<<24) | (pwr_val[2]<<16) |(pwr_val[1]<<8) |pwr_val[0]; + + if(rf == 0) + RegOffset = RegOffset_A[index]; + else + RegOffset = RegOffset_B[index]; + + PHY_SetBBReg(Adapter, RegOffset, bMaskDWord, writeVal); + //RTPRINT(FPHY, PHY_TXPWR, ("Set 0x%x = %08x\n", RegOffset, writeVal)); + + // 201005115 Joseph: Set Tx Power diff for Tx power training mechanism. + if(((pHalData->rf_type == RF_2T2R) && + (RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs15_Mcs12))|| + ((pHalData->rf_type != RF_2T2R) && + (RegOffset == rTxAGC_A_Mcs07_Mcs04 || RegOffset == rTxAGC_B_Mcs07_Mcs04)) ) + { + writeVal = pwr_val[3]; + if(RegOffset == rTxAGC_A_Mcs15_Mcs12 || RegOffset == rTxAGC_A_Mcs07_Mcs04) + RegOffset = 0xc90; + if(RegOffset == rTxAGC_B_Mcs15_Mcs12 || RegOffset == rTxAGC_B_Mcs07_Mcs04) + RegOffset = 0xc98; + for(i=0; i<3; i++) + { + if(i!=2) + writeVal = (writeVal>8)?(writeVal-8):0; + else + writeVal = (writeVal>6)?(writeVal-6):0; + rtw_write8(Adapter, (u32)(RegOffset+i), (u8)writeVal); + } + } + } +} +/*----------------------------------------------------------------------------- + * Function: PHY_RF6052SetOFDMTxPower + * + * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for + * different channel and read original value in TX power register area from + * 0xe00. We increase offset and original value to be correct tx pwr. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/05/2008 MHC Simulate 8192 series method. + * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to + * A/B pwr difference or legacy/HT pwr diff. + * 2. We concern with path B legacy/HT OFDM difference. + * 01/22/2009 MHC Support new EPRO format from SD3. + * + *---------------------------------------------------------------------------*/ +VOID +rtl8192c_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel) +{ + //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 writeVal[2], powerBase0[2], powerBase1[2]; + u8 index = 0; + + getPowerBase(Adapter, pPowerLevel, Channel, &powerBase0[0], &powerBase1[0]); + + for(index=0; index<6; index++) + { + getTxPowerWriteValByRegulatory(Adapter, Channel, index, + &powerBase0[0], &powerBase1[0], &writeVal[0]); + + writeOFDMPowerReg(Adapter, index, &writeVal[0]); + } + +} + + +static VOID +phy_RF6052_Config_HardCode( + IN PADAPTER Adapter + ) +{ + + // Set Default Bandwidth to 20M + //Adapter->HalFunc .SetBWModeHandler(Adapter, HT_CHANNEL_WIDTH_20); + + // TODO: Set Default Channel to channel one for RTL8225 + +} + +static int +phy_RF6052_Config_ParaFile( + IN PADAPTER Adapter + ) +{ + u32 u4RegValue; + u8 eRFPath; + BB_REGISTER_DEFINITION_T *pPhyReg; + + int rtStatus = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + static char sz88CRadioAFile[] = RTL8188C_PHY_RADIO_A; + static char sz88CRadioBFile[] = RTL8188C_PHY_RADIO_B; +#ifdef CONFIG_USB_HCI + static char sz88CRadioAFile_mCard[] = RTL8188C_PHY_RADIO_A_mCard; + static char sz88CRadioBFile_mCard[] = RTL8188C_PHY_RADIO_B_mCard; + static char sz88CRadioAFile_HP[] = RTL8188C_PHY_RADIO_A_HP; +#endif + static char sz92CRadioAFile[] = RTL8192C_PHY_RADIO_A; + static char sz92CRadioBFile[] = RTL8192C_PHY_RADIO_B; + static char sz8723RadioAFile[] = RTL8723_PHY_RADIO_A; + static char sz8723RadioBFile[] = RTL8723_PHY_RADIO_B; + char *pszRadioAFile, *pszRadioBFile; + + + if(IS_HARDWARE_TYPE_8192C(Adapter)) + { + if(IS_92C_SERIAL( pHalData->VersionID))// 88c's IPA is different from 92c's + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + pszRadioAFile = sz92CRadioAFile; + pszRadioBFile = sz92CRadioBFile; + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + else + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + pszRadioAFile = sz88CRadioAFile; + pszRadioBFile = sz88CRadioBFile; +#ifdef CONFIG_USB_HCI + if( BOARD_MINICARD == pHalData->BoardType) + { + pszRadioAFile = sz88CRadioAFile_mCard; + pszRadioBFile = sz88CRadioBFile_mCard; + } + else if( BOARD_USB_High_PA == pHalData->BoardType) + { + pszRadioAFile = sz88CRadioAFile_HP; + } +#endif + } + else + { + rtStatus = _FAIL; + return rtStatus; + } + } + } + else if(IS_HARDWARE_TYPE_8723(Adapter)) + { + pszRadioAFile = sz8723RadioAFile; + pszRadioBFile = sz8723RadioBFile; + } + + //3//----------------------------------------------------------------- + //3// <2> Initialize RF + //3//----------------------------------------------------------------- + //for(eRFPath = RF90_PATH_A; eRFPath NumTotalRFPath; eRFPath++) + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + { + + pPhyReg = &pHalData->PHYRegDef[eRFPath]; + + /*----Store original RFENV control type----*/ + switch(eRFPath) + { + case RF90_PATH_A: + case RF90_PATH_C: + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV); + break; + case RF90_PATH_B : + case RF90_PATH_D: + u4RegValue = PHY_QueryBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16); + break; + } + + /*----Set RF_ENV enable----*/ + PHY_SetBBReg(Adapter, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1); + rtw_udelay_os(1);//PlatformStallExecution(1); + + /*----Set RF_ENV output high----*/ + PHY_SetBBReg(Adapter, pPhyReg->rfintfo, bRFSI_RFENV, 0x1); + rtw_udelay_os(1);//PlatformStallExecution(1); + + /* Set bit number of Address and Data for RF register */ + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); // Set 1 to 4 bits for 8255 + rtw_udelay_os(1);//PlatformStallExecution(1); + + PHY_SetBBReg(Adapter, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); // Set 0 to 12 bits for 8255 + rtw_udelay_os(1);//PlatformStallExecution(1); + + /*----Initialize RF fom connfiguration file----*/ + switch(eRFPath) + { + case RF90_PATH_A: +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus= rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF90_RADIO_PATH_E)eRFPath); +#else + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, (RF90_RADIO_PATH_E)eRFPath); +#endif + break; + case RF90_PATH_B: +#ifdef CONFIG_EMBEDDED_FWIMG + rtStatus = rtl8192c_PHY_ConfigRFWithHeaderFile(Adapter,(RF90_RADIO_PATH_E)eRFPath); +#else + rtStatus = rtl8192c_PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, (RF90_RADIO_PATH_E)eRFPath); +#endif + break; + case RF90_PATH_C: + break; + case RF90_PATH_D: + break; + } + + /*----Restore RFENV control type----*/; + switch(eRFPath) + { + case RF90_PATH_A: + case RF90_PATH_C: + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue); + break; + case RF90_PATH_B : + case RF90_PATH_D: + PHY_SetBBReg(Adapter, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue); + break; + } + + if(rtStatus != _SUCCESS){ + //RT_TRACE(COMP_FPGA, DBG_LOUD, ("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath)); + goto phy_RF6052_Config_ParaFile_Fail; + } + + } + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile()\n")); + return rtStatus; + +phy_RF6052_Config_ParaFile_Fail: + return rtStatus; +} + + +int +PHY_RF6052_Config8192C( + IN PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + int rtStatus = _SUCCESS; + + // + // Initialize general global value + // + // TODO: Extend RF_PATH_C and RF_PATH_D in the future + if(pHalData->rf_type == RF_1T1R) + pHalData->NumTotalRFPath = 1; + else + pHalData->NumTotalRFPath = 2; + + // + // Config BB and RF + // + rtStatus = phy_RF6052_Config_ParaFile(Adapter); +#if 0 + switch( Adapter->MgntInfo.bRegHwParaFile ) + { + case 0: + phy_RF6052_Config_HardCode(Adapter); + break; + + case 1: + rtStatus = phy_RF6052_Config_ParaFile(Adapter); + break; + + case 2: + // Partial Modify. + phy_RF6052_Config_HardCode(Adapter); + phy_RF6052_Config_ParaFile(Adapter); + break; + + default: + phy_RF6052_Config_HardCode(Adapter); + break; + } +#endif + return rtStatus; + +} + + +// +// ==> RF shadow Operation API Code Section!!! +// +/*----------------------------------------------------------------------------- + * Function: PHY_RFShadowRead + * PHY_RFShadowWrite + * PHY_RFShadowCompare + * PHY_RFShadowRecorver + * PHY_RFShadowCompareAll + * PHY_RFShadowRecorverAll + * PHY_RFShadowCompareFlagSet + * PHY_RFShadowRecorverFlagSet + * + * Overview: When we set RF register, we must write shadow at first. + * When we are running, we must compare shadow abd locate error addr. + * Decide to recorver or not. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 11/20/2008 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +u32 +PHY_RFShadowRead( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + return RF_Shadow[eRFPath][Offset].Value; + +} /* PHY_RFShadowRead */ + + +VOID +PHY_RFShadowWrite( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u32 Data) +{ + RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask); + RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE; + +} /* PHY_RFShadowWrite */ + + +BOOLEAN +PHY_RFShadowCompare( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + u32 reg; + // Check if we need to check the register + if (RF_Shadow[eRFPath][Offset].Compare == _TRUE) + { + reg = PHY_QueryRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask); + // Compare shadow and real rf register for 20bits!! + if (RF_Shadow[eRFPath][Offset].Value != reg) + { + // Locate error position. + RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE; + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n", + //eRFPath, Offset, reg)); + } + return RF_Shadow[eRFPath][Offset].ErrorOrNot ; + } + return _FALSE; +} /* PHY_RFShadowCompare */ + + +VOID +PHY_RFShadowRecorver( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset) +{ + // Check if the address is error + if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE) + { + // Check if we need to recorver the register. + if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE) + { + PHY_SetRFReg(Adapter, eRFPath, Offset, bRFRegOffsetMask, + RF_Shadow[eRFPath][Offset].Value); + //RT_TRACE(COMP_INIT, DBG_LOUD, + //("PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx", + //eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value)); + } + } + +} /* PHY_RFShadowRecorver */ + + +VOID +PHY_RFShadowCompareAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + PHY_RFShadowCompare(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset); + } + } + +} /* PHY_RFShadowCompareAll */ + + +VOID +PHY_RFShadowRecorverAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + PHY_RFShadowRecorver(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset); + } + } + +} /* PHY_RFShadowRecorverAll */ + + +VOID +PHY_RFShadowCompareFlagSet( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u8 Type) +{ + // Set True or False!!! + RF_Shadow[eRFPath][Offset].Compare = Type; + +} /* PHY_RFShadowCompareFlagSet */ + + +VOID +PHY_RFShadowRecorverFlagSet( + IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 Offset, + IN u8 Type) +{ + // Set True or False!!! + RF_Shadow[eRFPath][Offset].Recorver= Type; + +} /* PHY_RFShadowRecorverFlagSet */ + + +VOID +PHY_RFShadowCompareFlagSetAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! + if (Offset != 0x26 && Offset != 0x27) + PHY_RFShadowCompareFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _FALSE); + else + PHY_RFShadowCompareFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _TRUE); + } + } + +} /* PHY_RFShadowCompareFlagSetAll */ + + +VOID +PHY_RFShadowRecorverFlagSetAll( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! + if (Offset != 0x26 && Offset != 0x27) + PHY_RFShadowRecorverFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _FALSE); + else + PHY_RFShadowRecorverFlagSet(Adapter, (RF90_RADIO_PATH_E)eRFPath, Offset, _TRUE); + } + } + +} /* PHY_RFShadowCompareFlagSetAll */ + +VOID +PHY_RFShadowRefresh( + IN PADAPTER Adapter) +{ + u32 eRFPath; + u32 Offset; + + for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) + { + for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++) + { + RF_Shadow[eRFPath][Offset].Value = 0; + RF_Shadow[eRFPath][Offset].Compare = _FALSE; + RF_Shadow[eRFPath][Offset].Recorver = _FALSE; + RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE; + RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE; + } + } + +} /* PHY_RFShadowRead */ + +/* End of HalRf6052.c */ + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c new file mode 100755 index 000000000000..9c0f0b132cbb --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_rxdesc.c @@ -0,0 +1,752 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192C_REDESC_C_ +#include +#include +#include +#include + +static u8 evm_db2percentage(s8 value) +{ + // + // -33dB~0dB to 0%~99% + // + s8 ret_val; + + ret_val = value; + //ret_val /= 2; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("EVMdbToPercentage92S Value=%d / %x \n", ret_val, ret_val)); + + if(ret_val >= 0) + ret_val = 0; + if(ret_val <= -33) + ret_val = -33; + + ret_val = 0 - ret_val; + ret_val*=3; + + if(ret_val == 99) + ret_val = 100; + + return(ret_val); +} + + +static s32 signal_scale_mapping(_adapter *padapter, s32 cur_sig ) +{ + s32 ret_sig; + +#ifdef CONFIG_USB_HCI + if(cur_sig >= 51 && cur_sig <= 100) + { + ret_sig = 100; + } + else if(cur_sig >= 41 && cur_sig <= 50) + { + ret_sig = 80 + ((cur_sig - 40)*2); + } + else if(cur_sig >= 31 && cur_sig <= 40) + { + ret_sig = 66 + (cur_sig - 30); + } + else if(cur_sig >= 21 && cur_sig <= 30) + { + ret_sig = 54 + (cur_sig - 20); + } + else if(cur_sig >= 10 && cur_sig <= 20) + { + ret_sig = 42 + (((cur_sig - 10) * 2) / 3); + } + else if(cur_sig >= 5 && cur_sig <= 9) + { + ret_sig = 22 + (((cur_sig - 5) * 3) / 2); + } + else if(cur_sig >= 1 && cur_sig <= 4) + { + ret_sig = 6 + (((cur_sig - 1) * 3) / 2); + } + else + { + ret_sig = cur_sig; + } +#else + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + // Step 1. Scale mapping. + // 20100611 Joseph: Re-tunning RSSI presentation for Lenovo. + // 20100426 Joseph: Modify Signal strength mapping. + // This modification makes the RSSI indication similar to Intel solution. + // 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE. + if(cur_sig >= 54 && cur_sig <= 100) + { + ret_sig = 100; + } + else if(cur_sig>=42 && cur_sig <= 53 ) + { + ret_sig = 95; + } + else if(cur_sig>=36 && cur_sig <= 41 ) + { + ret_sig = 74 + ((cur_sig - 36) *20)/6; + } + else if(cur_sig>=33 && cur_sig <= 35 ) + { + ret_sig = 65 + ((cur_sig - 33) *8)/2; + } + else if(cur_sig>=18 && cur_sig <= 32 ) + { + ret_sig = 62 + ((cur_sig - 18) *2)/15; + } + else if(cur_sig>=15 && cur_sig <= 17 ) + { + ret_sig = 33 + ((cur_sig - 15) *28)/2; + } + else if(cur_sig>=10 && cur_sig <= 14 ) + { + ret_sig = 39; + } + else if(cur_sig>=8 && cur_sig <= 9 ) + { + ret_sig = 33; + } + else if(cur_sig <= 8 ) + { + ret_sig = 19; + } + } + else + { + // Step 1. Scale mapping. + if(cur_sig >= 61 && cur_sig <= 100) + { + ret_sig = 90 + ((cur_sig - 60) / 4); + } + else if(cur_sig >= 41 && cur_sig <= 60) + { + ret_sig = 78 + ((cur_sig - 40) / 2); + } + else if(cur_sig >= 31 && cur_sig <= 40) + { + ret_sig = 66 + (cur_sig - 30); + } + else if(cur_sig >= 21 && cur_sig <= 30) + { + ret_sig = 54 + (cur_sig - 20); + } + else if(cur_sig >= 5 && cur_sig <= 20) + { + ret_sig = 42 + (((cur_sig - 5) * 2) / 3); + } + else if(cur_sig == 4) + { + ret_sig = 36; + } + else if(cur_sig == 3) + { + ret_sig = 27; + } + else if(cur_sig == 2) + { + ret_sig = 18; + } + else if(cur_sig == 1) + { + ret_sig = 9; + } + else + { + ret_sig = cur_sig; + } + } +#endif + + return ret_sig; +} + + +static s32 translate2dbm(u8 signal_strength_idx) +{ + s32 signal_power; // in dBm. + + + // Translate to dBm (x=0.5y-95). + signal_power = (s32)((signal_strength_idx + 1) >> 1); + signal_power -= 95; + + return signal_power; +} + +void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat) +{ + PHY_STS_OFDM_8192CD_T *pOfdm_buf; + PHY_STS_CCK_8192CD_T *pCck_buf; + u8 i, max_spatial_stream, evm; + s8 rx_pwr[4], rx_pwr_all = 0; + u8 pwdb_all; + u32 rssi,total_rssi=0; + u8 bcck_rate=0, rf_rx_num = 0, cck_highpwr = 0; + _adapter *padapter = prframe->u.hdr.adapter; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 tmp_rxsnr; + s8 rx_snrX; + +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + PHY_RX_DRIVER_INFO_8192CD *pDrvInfo = ((PHY_RX_DRIVER_INFO_8192CD *)pphy_stat); + u8 bant1_sel = (pDrvInfo->ANTSEL == 1)?_TRUE:_FALSE; +#endif + + // Record it for next packet processing + bcck_rate=(pattrib->mcs_rate<=3? 1:0); + + if(bcck_rate) //CCK + { + u8 report; +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + if(bant1_sel == _TRUE) + pHalData->CCK_Ant1_Cnt++; + else + pHalData->CCK_Ant2_Cnt++; +#endif + + // CCK Driver info Structure is not the same as OFDM packet. + pCck_buf = (PHY_STS_CCK_8192CD_T *)pphy_stat; + //Adapter->RxStats.NumQryPhyStatusCCK++; + + // + // (1)Hardware does not provide RSSI for CCK + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) + // + + if(padapter->pwrctrlpriv.rf_pwrstate == rf_on) + cck_highpwr = (u8)pHalData->bCckHighPower; + else + cck_highpwr = _FALSE; + + if(!cck_highpwr) + { + report = pCck_buf->cck_agc_rpt&0xc0; + report = report>>6; + switch(report) + { + // 03312009 modified by cosa + // Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion + // Note: different RF with the different RNA gain. + case 0x3: + rx_pwr_all = (-46) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + case 0x2: + rx_pwr_all = (-26) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + case 0x1: + rx_pwr_all = (-12) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + case 0x0: + rx_pwr_all = (16) - (pCck_buf->cck_agc_rpt & 0x3e); + break; + } + } + else + { + report = pCck_buf->cck_agc_rpt & 0x60; + report = report>>5; + switch(report) + { + case 0x3: + rx_pwr_all = (-46) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x2: + rx_pwr_all = (-26)- ((pCck_buf->cck_agc_rpt & 0x1f)<<1); + break; + case 0x1: + rx_pwr_all = (-12) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; + break; + case 0x0: + rx_pwr_all = (16) - ((pCck_buf->cck_agc_rpt & 0x1f)<<1) ; + break; + } + } + + pwdb_all= query_rx_pwr_percentage(rx_pwr_all); + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + // CCK gain is smaller than OFDM/MCS gain, + // so we add gain diff by experiences, the val is 6 + pwdb_all+=6; + if(pwdb_all > 100) + pwdb_all = 100; + // modify the offset to make the same gain index with OFDM. + if(pwdb_all > 34 && pwdb_all <= 42) + pwdb_all -= 2; + else if(pwdb_all > 26 && pwdb_all <= 34) + pwdb_all -= 6; + else if(pwdb_all > 14 && pwdb_all <= 26) + pwdb_all -= 8; + else if(pwdb_all > 4 && pwdb_all <= 14) + pwdb_all -= 4; + } + + pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive + pattrib->RecvSignalPower = rx_pwr_all; //dBM + padapter->recvpriv.rxpwdb = rx_pwr_all; + // + // (3) Get Signal Quality (EVM) + // + //if(bPacketMatchBSSID) + { + u8 sq; + + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + // mapping to 5 bars for vista signal strength + // signal quality in driver will be displayed to signal strength + // in vista. + if(pwdb_all >= 50) + sq = 100; + else if(pwdb_all >= 35 && pwdb_all < 50) + sq = 80; + else if(pwdb_all >= 22 && pwdb_all < 35) + sq = 60; + else if(pwdb_all >= 18 && pwdb_all < 22) + sq = 40; + else + sq = 20; + } + else + { + if(pwdb_all> 40) + { + sq = 100; + } + else + { + sq = pCck_buf->SQ_rpt; + + if(pCck_buf->SQ_rpt > 64) + sq = 0; + else if (pCck_buf->SQ_rpt < 20) + sq= 100; + else + sq = ((64-sq) * 100) / 44; + + } + } + + pattrib->signal_qual=sq; + pattrib->rx_mimo_signal_qual[0]=sq; + pattrib->rx_mimo_signal_qual[1]=(-1); + } + + } + else //OFDM/HT + { +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + if(bant1_sel == _TRUE) + pHalData->OFDM_Ant1_Cnt++; + else + pHalData->OFDM_Ant2_Cnt++; +#endif + pdmpriv->OFDM_Pkt_Cnt++; + + pOfdm_buf = (PHY_STS_OFDM_8192CD_T *)pphy_stat; + + // + // (1)Get RSSI per-path + // + for(i=0; iNumTotalRFPath; i++) + { + // 2008/01/30 MH we will judge RF RX path now. + if (pHalData->bRFPathRxEnable[i]) + rf_rx_num++; + //else + //continue; + + rx_pwr[i] = ((pOfdm_buf->trsw_gain_X[i]&0x3F)*2) - 110; + + /* Translate DBM to percentage. */ + rssi=query_rx_pwr_percentage(rx_pwr[i]); + total_rssi += rssi; + + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RF-%d RXPWR=%x RSSI=%d\n", i, rx_pwr[i], rssi)); + + //Get Rx snr value in DB + tmp_rxsnr = pOfdm_buf->rxsnr_X[i]; + rx_snrX = (s8)(tmp_rxsnr); + rx_snrX >>= 1; + padapter->recvpriv.RxSNRdB[i] = (int)rx_snrX; + + /* Record Signal Strength for next packet */ + //if(bPacketMatchBSSID) + { + //pRfd->Status.RxMIMOSignalStrength[i] =(u1Byte) RSSI; + + //The following is for lenovo signal strength in vista + if(pHalData->CustomerID == RT_CID_819x_Lenovo) + { + u8 sq; + + if(i == 0) + { + // mapping to 5 bars for vista signal strength + // signal quality in driver will be displayed to signal strength + // in vista. + if(rssi >= 50) + sq = 100; + else if(rssi >= 35 && rssi < 50) + sq = 80; + else if(rssi >= 22 && rssi < 35) + sq = 60; + else if(rssi >= 18 && rssi < 22) + sq = 40; + else + sq = 20; + //DbgPrint("ofdm/mcs RSSI=%d\n", RSSI); + //pRfd->Status.SignalQuality = SQ; + //DbgPrint("ofdm/mcs SQ = %d\n", pRfd->Status.SignalQuality); + } + } + } + } + + + // + // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive),average + // + rx_pwr_all = (((pOfdm_buf->pwdb_all ) >> 1 )& 0x7f) -110;//for OFDM Average RSSI + pwdb_all = query_rx_pwr_percentage(rx_pwr_all); + + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("PWDB_ALL=%d\n", pwdb_all)); + + pattrib->RxPWDBAll = pwdb_all; //for DIG/rate adaptive + pattrib->RecvSignalPower = rx_pwr_all;//dBM + padapter->recvpriv.rxpwdb = rx_pwr_all; + // + // (3)EVM of HT rate + // + if(pHalData->CustomerID != RT_CID_819x_Lenovo) + { + if(pattrib->rxht && pattrib->mcs_rate >=20 && pattrib->mcs_rate<=27) + max_spatial_stream = 2; //both spatial stream make sense + else + max_spatial_stream = 1; //only spatial stream 1 makes sense + + for(i=0; i>= 1" because the compilor of free build environment + // fill most significant bit to "zero" when doing shifting operation which may change a negative + // value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. + evm = evm_db2percentage( (pOfdm_buf->rxevm_X[i]/*/ 2*/));//dbm + + RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("RXRATE=%x RXEVM=%x EVM=%s%d\n", + pattrib->mcs_rate, pOfdm_buf->rxevm_X[i], "%",evm)); + + //if(bPacketMatchBSSID) + { + if(i==0) // Fill value in RFD, Get the first spatial stream only + { + pattrib->signal_qual = (u8)(evm & 0xff); + } + pattrib->rx_mimo_signal_qual[i] = (u8)(evm & 0xff); + } + } + + } + + // + // 4. Record rx statistics for debug + // + + } + + + //UI BSS List signal strength(in percentage), make it good looking, from 0~100. + //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). + if(bcck_rate) + { + pattrib->signal_strength=(u8)signal_scale_mapping(padapter, pwdb_all); + } + else + { + if (rf_rx_num != 0) + { + pattrib->signal_strength= (u8)(signal_scale_mapping(padapter, total_rssi/=rf_rx_num)); + } + } + //DBG_8192C("%s,rx_pwr_all(%d),RxPWDBAll(%d)\n",__FUNCTION__,rx_pwr_all,pattrib->RxPWDBAll); + +} + + +static void process_rssi(_adapter *padapter,union recv_frame *prframe) +{ + u32 last_rssi, tmp_val; + struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + struct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //DBG_8192C("process_rssi=> pattrib->rssil(%d) signal_strength(%d)\n ",pattrib->RecvSignalPower,pattrib->signal_strength); + //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) + { + + #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + if(signal_stat->update_req) { + signal_stat->total_num = 0; + signal_stat->total_val = 0; + signal_stat->update_req = 0; + } + + signal_stat->total_num++; + signal_stat->total_val += pattrib->signal_strength; + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; + #else //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //Adapter->RxStats.RssiCalculateCnt++; //For antenna Test + if(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX) + { + padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX; + last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index]; + padapter->recvpriv.signal_strength_data.total_val -= last_rssi; + } + padapter->recvpriv.signal_strength_data.total_val +=pattrib->signal_strength; + + padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->signal_strength; + if(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX) + padapter->recvpriv.signal_strength_data.index = 0; + + + tmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num; + + if(padapter->recvpriv.is_signal_dbg) { + padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg; + padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg); + } else { + padapter->recvpriv.signal_strength= tmp_val; + padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val); + } + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num)); + #endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + } + +}// Process_UI_RSSI_8192C + + +static void process_PWDB(_adapter *padapter, union recv_frame *prframe) +{ + int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedCCK; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct rx_pkt_attrib *pattrib= &prframe->u.hdr.attrib; + struct sta_info *psta = prframe->u.hdr.psta; + u8 isCCKrate=(pattrib->mcs_rate<=3? 1:0); + + + if(psta) + { + UndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; + UndecoratedSmoothedCCK = psta->rssi_stat.UndecoratedSmoothedCCK; + } + else + { + UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB; + UndecoratedSmoothedCCK = pdmpriv->UndecoratedSmoothedCCK; + } + + //if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) + + if(!isCCKrate) + { + // Process OFDM RSSI + if(UndecoratedSmoothedPWDB < 0) // initialize + { + UndecoratedSmoothedPWDB = pattrib->RxPWDBAll; + } + + if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedPWDB) + { + UndecoratedSmoothedPWDB = + ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + + UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB + 1; + } + else + { + UndecoratedSmoothedPWDB = + ( ((UndecoratedSmoothedPWDB)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + } + } + else + { + // Process CCK RSSI + if(UndecoratedSmoothedCCK < 0) // initialize + { + UndecoratedSmoothedCCK = pattrib->RxPWDBAll; + } + + if(pattrib->RxPWDBAll > (u32)UndecoratedSmoothedCCK) + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + + UndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1; + } + else + { + UndecoratedSmoothedCCK = + ( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + + (pattrib->RxPWDBAll)) /(Rx_Smooth_Factor); + } + } + + + + if(psta) + { + //psta->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;//todo: + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + + if(pdmpriv->RSSI_Select == RSSI_OFDM) + psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + else if(pdmpriv->RSSI_Select == RSSI_CCK) + psta->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK; + + psta->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; + } + else + { + //pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + + if(pdmpriv->RSSI_Select == RSSI_OFDM) + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB; + else if(pdmpriv->RSSI_Select == RSSI_CCK) + pdmpriv->UndecoratedSmoothedPWDB = UndecoratedSmoothedCCK; + + pdmpriv->UndecoratedSmoothedCCK = UndecoratedSmoothedCCK; + } + + //UpdateRxSignalStatistics8192C(padapter, prframe); + +} + + +static void process_link_qual(_adapter *padapter,union recv_frame *prframe) +{ + u32 last_evm=0, tmpVal; + struct rx_pkt_attrib *pattrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + struct signal_stat * signal_stat; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + if(prframe == NULL || padapter==NULL){ + return; + } + + pattrib = &prframe->u.hdr.attrib; +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + signal_stat = &padapter->recvpriv.signal_qual_data; +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + + //DBG_8192C("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + if(signal_stat->update_req) { + signal_stat->total_num = 0; + signal_stat->total_val = 0; + signal_stat->update_req = 0; + } + + signal_stat->total_num++; + signal_stat->total_val += pattrib->signal_strength; + signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num; + +#else //CONFIG_NEW_SIGNAL_STAT_PROCESS + if(pattrib->signal_qual != 0) + { + // + // 1. Record the general EVM to the sliding window. + // + if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) + { + padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX; + last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index]; + padapter->recvpriv.signal_qual_data.total_val -= last_evm; + } + padapter->recvpriv.signal_qual_data.total_val += pattrib->signal_qual; + + padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->signal_qual; + if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX) + padapter->recvpriv.signal_qual_data.index = 0; + + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, pattrib->signal_qual)); + + // <1> Showed on UI for user, in percentage. + tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num; + padapter->recvpriv.signal_qual=(u8)tmpVal; + + } + else + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" pattrib->signal_qual =%d\n", pattrib->signal_qual)); + } +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + +}// Process_UiLinkQuality8192S + + +//void rtl8192c_process_phy_info(_adapter *padapter, union recv_frame *prframe) +void rtl8192c_process_phy_info(_adapter *padapter, void *prframe) +{ + union recv_frame *precvframe = (union recv_frame *)prframe; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + // If we switch to the antenna for testing, the signal strength + // of the packets in this time shall not be counted into total receiving power. + // This prevents error counting Rx signal strength and affecting other dynamic mechanism. + + // Select the packets to do RSSI checking for antenna switching. + SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll); + + if(GET_HAL_DATA(padapter)->RSSI_test == _TRUE) + return; +#endif + // + // Check RSSI + // + process_rssi(padapter, precvframe); + // + // Check PWDB. + // + process_PWDB(padapter, precvframe); + // + // Check EVM + // + process_link_qual(padapter, precvframe); + +} diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c new file mode 100755 index 000000000000..226ed8f68406 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/rtl8192c_sreset.c @@ -0,0 +1,285 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#include +#include +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +extern void rtw_cancel_all_timer(_adapter *padapter); + +void rtl8192c_sreset_init_value(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + _rtw_mutex_init(&psrtpriv->silentreset_mutex ); + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +} +void rtl8192c_sreset_reset_value(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + psrtpriv->silent_reset_inprogress = _FALSE; + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + psrtpriv->last_tx_time =0; + psrtpriv->last_tx_complete_time =0; +} + +static void _restore_security_setting(_adapter *padapter) +{ + u8 EntryId = 0; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct sta_priv * pstapriv = &padapter->stapriv; + struct sta_info *psta; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + + (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) + ? rtw_write8(padapter, REG_SECCFG, 0xcc) + : rtw_write8(padapter, REG_SECCFG, 0xcf); + + if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || + ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) + { + + for(EntryId=0; EntryId<4; EntryId++) + { + if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1); + else + rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0); + } + + } + else if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) + { + psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); + if (psta == NULL) { + //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); + } + else + { + //pairwise key + rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); + //group key + rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0); + } + } + +} + +static void _restore_network_status(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); + unsigned short caps; + u8 join_type; +#if 1 + + //======================================================= + // reset related register of Beacon control + + //set MSR to nolink + Set_NETYPE0_MSR(padapter, _HW_STATE_NOLINK_); + // reject all data frame + rtw_write16(padapter, REG_RXFLTMAP2,0x00); + //reset TSF + rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); + + //disable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); + else + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); + + //======================================================= + rtw_joinbss_reset(padapter); + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); + //pmlmeinfo->assoc_AP_vendor = maxAP; + + if (padapter->registrypriv.wifi_spec) { + // for WiFi test, follow WMM test plan spec + rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F431C); + rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E541C); + rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x0000A525); + rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A549); + + // for WiFi test, mixed mode with intel STA under bg mode throughput issue + if (padapter->mlmepriv.htpriv.ht_option == 0) + rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00004320); + + } else { + rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F3217); + rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E4317); + rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00105320); + rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A444); + } + + //disable dynamic functions, such as high power, DIG + //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); +#endif + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); + join_type = 0; + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + + Set_NETYPE0_MSR(padapter, (pmlmeinfo->state & 0x3)); + + mlmeext_joinbss_event_callback(padapter, 1); + //restore Sequence No. + rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); +} +void rtl8192c_silentreset_for_specific_platform(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + _irqL irqL; + + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + if (!netif_queue_stopped(padapter->pnetdev)) + netif_stop_queue(padapter->pnetdev); + + rtw_cancel_all_timer(padapter); + tasklet_kill(&pxmitpriv->xmit_tasklet); + + _enter_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); + psrtpriv->silent_reset_inprogress = _TRUE; + pwrpriv->change_rfpwrstate = rf_off; +#ifdef CONFIG_IPS + ips_enter(padapter); + ips_leave(padapter); +#endif + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + _restore_network_status(padapter); + _restore_security_setting(padapter); + } + + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); + + psrtpriv->silent_reset_inprogress = _FALSE; + _exit_critical_mutex(&psrtpriv->silentreset_mutex, &irqL); + + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + + if (netif_queue_stopped(padapter->pnetdev)) + netif_wake_queue(padapter->pnetdev); +} + +void rtl8192c_sreset_xmit_status_check(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + unsigned long current_time; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + unsigned int diff_time; + + if(rtw_read32(padapter, REG_TXDMA_STATUS) !=0x00){ + rtl8192c_silentreset_for_specific_platform(padapter); + } + + //total xmit irp = 4 + //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); + //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) + current_time = rtw_get_current_time(); + if(0==pxmitpriv->free_xmitbuf_cnt) + { + diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_time); + + if(diff_time > 2000){ + if(psrtpriv->last_tx_complete_time==0){ + psrtpriv->last_tx_complete_time = current_time; + } + else{ + diff_time = jiffies_to_msecs(current_time - psrtpriv->last_tx_complete_time); + if(diff_time > 4000){ + //padapter->Wifi_Error_Status = WIFI_TX_HANG; + DBG_8192C("tx hang...start reset\n"); + rtl8192c_silentreset_for_specific_platform(padapter); + } + } + } + } +} +void rtl8192c_sreset_linked_status_check(_adapter *padapter) +{ + u32 regc50,regc58,reg824,reg800; + regc50 = rtw_read32(padapter,0xc50); + regc58 = rtw_read32(padapter,0xc58); + reg824 = rtw_read32(padapter,0x824); + reg800 = rtw_read32(padapter,0x800); + if( ((regc50&0xFFFFFF00)!= 0x69543400)|| + ((regc58&0xFFFFFF00)!= 0x69543400)|| + (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| + ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) + { + rtl8192c_silentreset_for_specific_platform(padapter); + } +} + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +u8 rtl8192c_sreset_get_wifi_status(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct sreset_priv *psrtpriv = &pHalData->srestpriv; + + u8 status = WIFI_STATUS_SUCCESS; + u32 val32 = 0; + _irqL irqL; + if(psrtpriv->silent_reset_inprogress == _TRUE) + { + return status; + } + val32 =rtw_read32(padapter,REG_TXDMA_STATUS); + if(val32==0xeaeaeaea){ + psrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST; + } + else if(val32!=0){ + DBG_8192C("txdmastatu(%x)\n",val32); + psrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR; + } + + if(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status) + { + DBG_8192C("==>%s error_status(0x%x) \n",__FUNCTION__,psrtpriv->Wifi_Error_Status); + status = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL))); + } + DBG_8192C("==> %s wifi_status(0x%x)\n",__FUNCTION__,status); + + //status restore + psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS; + + return status; +} +#endif + +#endif diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c new file mode 100755 index 000000000000..a6a9bb34dbb4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/Hal8192CUHWImg.c @@ -0,0 +1,7346 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +/*Created on 2011/ 6/15, 5:45*/ + +#include +#include "Hal8192CUHWImg.h" + +#ifdef CONFIG_BT_COEXISTENCE +// =================== TSMC Normal FW V75 2011-06-15 ======================= +u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = { +0xc1,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x10,0x55,0x54,0x3a,0x00,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, +0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, +0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, +0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, +0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, +0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, +0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, +0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, +0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, +0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, +0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, +0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, +0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, +0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, +0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, +0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, +0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, +0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, +0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, +0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, +0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, +0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, +0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, +0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, +0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, +0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, +0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, +0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, +0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, +0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, +0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, +0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, +0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, +0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, +0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, +0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, +0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, +0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, +0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, +0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, +0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, +0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, +0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, +0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, +0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, +0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, +0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, +0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, +0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0xab,0x22,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75, +0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, +0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, +0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, +0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, +0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, +0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, +0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, +0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, +0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, +0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, +0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, +0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, +0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, +0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, +0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, +0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, +0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, +0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6, +0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xcf,0x90,0x97,0x93,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, +0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, +0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, +0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36, +0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, +0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, +0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, +0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, +0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x29,0xd9,0xf5, +0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, +0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, +0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, +0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, +0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, +0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, +0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, +0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, +0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, +0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, +0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, +0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, +0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, +0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, +0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, +0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, +0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, +0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, +0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, +0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, +0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, +0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, +0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, +0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, +0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, +0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, +0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, +0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, +0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, +0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, +0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, +0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, +0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, +0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, +0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, +0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, +0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, +0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, +0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, +0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, +0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, +0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, +0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, +0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, +0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, +0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, +0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, +0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, +0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, +0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, +0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, +0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, +0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0xa2, +0x12,0x5f,0xb4,0x12,0x32,0x3d,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, +0x12,0x77,0xdc,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, +0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, +0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, +0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, +0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, +0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, +0x12,0x78,0x3a,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, +0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, +0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, +0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, +0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, +0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, +0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, +0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, +0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, +0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, +0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, +0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, +0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, +0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, +0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, +0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, +0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, +0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, +0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, +0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, +0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, +0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90, +0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, +0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, +0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80, +0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, +0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, +0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, +0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, +0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, +0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, +0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, +0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, +0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, +0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, +0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, +0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, +0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, +0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, +0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, +0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, +0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, +0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, +0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, +0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, +0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x79,0x12,0x90,0x97,0x5a,0x12,0x43,0x6b, +0x02,0x77,0xa9,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x22,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, +0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, +0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, +0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, +0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, +0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, +0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, +0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, +0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, +0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, +0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, +0x82,0x8c,0x83,0xef,0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, +0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, +0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, +0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, +0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, +0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, +0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, +0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, +0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, +0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, +0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, +0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, +0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, +0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, +0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, +0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, +0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, +0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x29, +0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, +0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, +0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, +0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, +0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, +0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, +0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, +0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, +0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, +0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, +0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, +0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, +0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, +0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, +0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, +0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, +0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, +0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, +0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, +0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, +0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, +0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, +0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, +0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, +0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, +0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, +0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, +0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, +0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, +0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, +0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, +0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, +0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, +0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, +0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, +0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, +0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, +0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, +0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, +0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, +0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, +0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, +0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, +0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, +0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, +0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, +0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, +0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, +0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, +0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, +0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, +0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, +0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, +0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, +0x60,0x05,0x7f,0x01,0x12,0x76,0xfa,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, +0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, +0xfa,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, +0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, +0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, +0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, +0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, +0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, +0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, +0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, +0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, +0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, +0x14,0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, +0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, +0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, +0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, +0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, +0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, +0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, +0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, +0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, +0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, +0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, +0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, +0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, +0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, +0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, +0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, +0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, +0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, +0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, +0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, +0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, +0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b, +0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, +0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, +0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29, +0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, +0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, +0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5, +0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, +0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, +0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, +0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1b,0x9f,0xe5, +0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, +0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, +0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, +0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, +0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, +0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, +0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, +0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, +0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, +0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, +0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, +0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, +0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, +0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, +0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, +0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, +0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, +0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, +0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, +0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, +0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, +0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, +0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, +0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, +0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, +0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, +0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, +0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, +0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, +0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, +0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, +0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, +0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, +0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, +0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, +0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, +0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, +0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x26,0x22,0x12,0x29,0xd9,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, +0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, +0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, +0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, +0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, +0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, +0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, +0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66, +0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, +0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, +0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, +0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, +0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, +0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x29,0xd9,0x65, +0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x29,0xd9,0xf5,0x26, +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, +0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, +0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, +0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, +0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, +0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60,0x2c, +0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, +0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, +0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, +0x43,0x6b,0x12,0x29,0xd9,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, +0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, +0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, +0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, +0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, +0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, +0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, +0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, +0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, +0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, +0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, +0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, +0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, +0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, +0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, +0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, +0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, +0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, +0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, +0x00,0x12,0x37,0x54,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, +0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f,0xe5,0x90,0x97,0x1d,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x21, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, +0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95, +0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59, +0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x7f, +0x78,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, +0x12,0x27,0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde, +0x90,0x97,0x25,0x12,0x2a,0x7f,0x90,0x97,0x86,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d, +0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53, +0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12, +0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x53, +0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12, +0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x29,0x12,0x2a,0x7f,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81, +0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00, +0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02, +0x4f,0xe5,0x90,0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71, +0x63,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x75,0x2e,0x90,0x97,0x19,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc5, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9, +0x90,0x96,0xc9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd5,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd9,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x96,0xdd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xed,0x12,0x43, +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, +0xf1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x96,0xf5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x01,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x05, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x97,0x09,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, +0x12,0x2f,0xd9,0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97,0x15,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x2d,0x74, +0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x2e,0x7f,0x8c,0x7e, +0x08,0x12,0x27,0xde,0x90,0x97,0x19,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27, +0xde,0x90,0x96,0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x96, +0xc9,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xcd,0x12,0x2a, +0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd1,0x12,0x2a,0x7f,0x7f,0x74, +0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd5,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12, +0x27,0xde,0x90,0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x96,0xdd,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe1,0x12, +0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe5,0x12,0x2a,0x7f,0x7f, +0x88,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe9,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e, +0x12,0x27,0xde,0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde, +0x90,0x96,0xf1,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf5, +0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf9,0x12,0x2a,0x7f, +0x7f,0xdc,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xfd,0x12,0x2a,0x7f,0x7f,0xe0,0x7e, +0x0e,0x12,0x27,0xde,0x90,0x97,0x01,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27, +0xde,0x90,0x97,0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97, +0x09,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0x0d,0x12,0x2a, +0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0x11,0x12,0x2a,0x7f,0x7f,0x04, +0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x15,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, +0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44, +0xc0,0xfd,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80, +0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f, +0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4, +0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25, +0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb, +0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20, +0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, +0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, +0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e, +0x0c,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, +0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef, +0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e, +0x0d,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53, +0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f, +0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f, +0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12, +0x43,0x53,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x2a,0x7f, +0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97, +0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97, +0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90, +0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec, +0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3, +0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0, +0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x46,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x45,0x80,0x68,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8, +0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54, +0xf0,0x12,0x4f,0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0xbc,0xe0,0x60,0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90, +0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4, +0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92, +0xaf,0x22,0x8b,0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97, +0x3b,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08, +0x12,0x27,0xde,0x90,0x97,0x34,0x12,0x2a,0x7f,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8, +0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03, +0xfc,0x12,0x43,0x46,0x90,0x97,0x3e,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80, +0x2d,0xe4,0x90,0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03, +0xfc,0xec,0x44,0xc0,0xfc,0x90,0x97,0x34,0x12,0x2a,0x7f,0x90,0x97,0x34,0x12,0x43, +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97, +0x3b,0xe0,0x30,0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e, +0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x54,0xf3,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f, +0x46,0x12,0x47,0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60, +0x6a,0x24,0x02,0x60,0x02,0xe1,0xa8,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48, +0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd, +0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75, +0xe4,0x90,0x97,0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f, +0x45,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01, +0xf0,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e, +0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0, +0x44,0x10,0xfd,0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x97,0x3c,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12, +0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40, +0x7f,0x01,0x12,0x36,0xaf,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45, +0x12,0x47,0x52,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97, +0x42,0xf0,0x90,0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97, +0x44,0xf0,0x90,0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97, +0x4c,0xf0,0x90,0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00, +0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01, +0x60,0x08,0x90,0x97,0x3a,0xe0,0x60,0x02,0x21,0x11,0x90,0x97,0x2e,0xe0,0xc3,0x94, +0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50, +0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94, +0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90, +0x97,0x2e,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, +0x97,0x42,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43, +0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0, +0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42, +0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50, +0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, +0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, +0xf0,0xe4,0x90,0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, +0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12, +0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25, +0xe0,0x90,0x97,0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61, +0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63, +0xe0,0x90,0x97,0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90, +0x97,0x39,0xe0,0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90, +0x97,0x3a,0xe0,0x70,0x02,0x41,0x1c,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x1c,0x90, +0x97,0x3d,0xe0,0x70,0x02,0x41,0x1c,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2, +0xaf,0x90,0x97,0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12, +0x47,0x49,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90, +0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64, +0x80,0xf0,0x90,0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05, +0x85,0xf0,0x90,0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05, +0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0, +0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2d,0x90,0x97,0x3a,0xe0, +0x70,0x2f,0x90,0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f, +0x46,0x12,0x47,0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0, +0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92, +0xaf,0x22,0x6b,0xc3,}; +#else +// =================== TSMC FW P2P_PS V75 2011-06-15 ======================= +u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength] = { +0xc1,0x88,0x02,0x05,0x4b,0x00,0x00,0x00,0x06,0x15,0x10,0x56,0x9a,0x3b,0x00,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4a,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x58,0x29,0x00,0x00,0x00,0x00,0x00,0xa1,0x53,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04,0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05, +0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04,0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e, +0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a,0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e, +0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a, +0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00,0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04, +0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60, +0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50,0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40, +0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c,0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8, +0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c, +0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28, +0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0,0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64, +0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4,0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02, +0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c, +0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12,0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06, +0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e,0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb, +0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0, +0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0, +0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12, +0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83, +0xe4,0x73,0x74,0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xeb, +0x02,0x50,0x7f,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2, +0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33, +0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf, +0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x30,0xe4,0x7e, +0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93, +0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3, +0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca, +0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe, +0x48,0x97,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x4e,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x97,0x56,0x00,0x41,0x97,0xab,0x00,0x41,0x97, +0x68,0x80,0x41,0x97,0xad,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f, +0x54,0x7e,0x01,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x8a,0xeb,0xf0,0xa3, +0xe0,0xfb,0xa3,0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf, +0x22,0xe4,0x90,0x97,0x8b,0xf0,0x90,0x05,0x58,0xe0,0xff,0x90,0x97,0x86,0xe0,0x2f, +0x24,0xfe,0x90,0x97,0x8c,0xf0,0xe4,0xfb,0xfd,0x7f,0x50,0x7e,0x01,0x91,0x63,0x90, +0x01,0x53,0x74,0x05,0xf0,0x22,0x90,0x01,0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08, +0xf0,0xe4,0x90,0x97,0x8b,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e, +0x01,0x91,0x63,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90, +0x97,0x72,0x14,0xf0,0x90,0x97,0x74,0xe0,0x54,0x0f,0xc3,0x94,0x0c,0x50,0x11,0x7d, +0x01,0x7f,0x0c,0x12,0x49,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x03,0x12,0x4f,0x22, +0x22,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0x12,0x5a,0xf7,0x02,0x57, +0x68,0x22,0x22,0x02,0x58,0x74,0x02,0x58,0x7b,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x8d,0x71,0x7e,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0x90,0x71,0x7e,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0x90, +0xe4,0x75,0xf0,0x01,0x71,0x67,0x12,0x29,0xd9,0xff,0x90,0x97,0x8d,0xe4,0x75,0xf0, +0x01,0x71,0x67,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00, +0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07, +0x90,0x01,0xc4,0x74,0x53,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c, +0xe0,0x55,0x30,0xf5,0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5, +0x36,0xa3,0xe0,0x55,0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x53,0x90,0x01,0x3c,0x74, +0x01,0xf0,0x90,0x97,0x80,0xe0,0x30,0xe0,0x20,0x13,0x13,0x54,0x3f,0x30,0xe0,0x19, +0x90,0x97,0x82,0xe4,0xf0,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xf1, +0x79,0xef,0x70,0x05,0x7f,0x02,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0xff,0x30,0xe0, +0x1e,0x13,0x13,0x54,0x3f,0x30,0xe0,0x17,0x90,0x97,0x7c,0xe4,0xf0,0x90,0x97,0x7b, +0xe0,0x64,0x04,0x60,0x0a,0xe4,0xff,0xf1,0x79,0xef,0x70,0x03,0x12,0x57,0xb9,0xe5, +0x34,0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x5d,0x59,0xe5,0x34,0x30, +0xe2,0x35,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90, +0x97,0x8b,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91, +0x63,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x08,0x90, +0x97,0x73,0xe4,0xf0,0x12,0x4a,0x63,0xe5,0x34,0x30,0xe3,0x35,0x90,0x01,0x3c,0x74, +0x08,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x8b,0xe4,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x63,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x80,0x08,0x90,0x97,0x72,0xe4,0xf0,0x12,0x4a, +0x63,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c,0x74,0x10,0xf0,0x12,0x72,0x06,0xe5, +0x35,0x30,0xe0,0x11,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97, +0x76,0xf0,0x12,0x4a,0x63,0xe5,0x36,0x30,0xe1,0x46,0x90,0x01,0x3e,0x74,0x02,0xf0, +0x90,0x97,0x80,0xe0,0x30,0xe0,0x1a,0x90,0x97,0x84,0x74,0x01,0xf0,0x90,0x97,0x81, +0xe0,0x64,0x03,0x60,0x0c,0x7f,0x01,0xf1,0x79,0xef,0x70,0x05,0x7f,0x02,0x12,0x55, +0xcb,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x18,0x90,0x97,0x7e,0x74,0x01,0xf0,0x90,0x97, +0x7b,0xe0,0x64,0x04,0x60,0x0a,0xe4,0xff,0xf1,0x79,0xef,0x70,0x03,0x12,0x57,0xb9, +0xe5,0x36,0x30,0xe0,0x6e,0x90,0x01,0x3e,0x74,0x01,0xf0,0x90,0x97,0x80,0xe0,0x30, +0xe0,0x19,0x90,0x97,0x84,0xe4,0xf0,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0c,0x7f, +0x01,0xf1,0x79,0xef,0x60,0x05,0x7f,0x01,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0x30, +0xe0,0x41,0x90,0x97,0x7e,0xe4,0xf0,0xff,0xf1,0x79,0xef,0x60,0x36,0x12,0x74,0xad, +0x90,0x97,0x7b,0xe0,0xff,0x64,0x04,0x60,0x2a,0xef,0xb4,0x03,0x07,0xe4,0xff,0x12, +0x56,0x56,0x80,0x12,0x90,0x97,0x7b,0xe0,0xb4,0x02,0x18,0x12,0x59,0x90,0xef,0x70, +0x05,0x7f,0x01,0x12,0x56,0x56,0x90,0x97,0x76,0xe0,0xff,0x7d,0x01,0x12,0x49,0x0a, +0x12,0x4f,0x22,0x74,0x53,0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07, +0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0, +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xef,0x64,0x01,0x70,0x3d,0x90,0x97, +0x83,0xe0,0x60,0x03,0x7f,0x00,0x22,0x90,0x97,0x66,0xe0,0x60,0x03,0x7f,0x01,0x22, +0x90,0x97,0x82,0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x80,0xe0,0xff,0x13,0x13, +0x54,0x3f,0x30,0xe0,0x0b,0xef,0xc4,0x13,0x54,0x07,0x30,0xe0,0x03,0x7f,0x00,0x22, +0x90,0x97,0x84,0xe0,0x7f,0x01,0x60,0x36,0x7f,0x00,0x22,0x90,0x97,0x7d,0xe0,0x60, +0x03,0x7f,0x00,0x22,0x90,0x97,0x66,0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x7c, +0xe0,0x60,0x03,0x7f,0x01,0x22,0x90,0x97,0x7a,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0, +0x03,0x7f,0x00,0x22,0x90,0x97,0x7e,0xe0,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0xe4, +0xf5,0x23,0x7f,0x60,0x7e,0x01,0x81,0xf1,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90, +0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05,0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6, +0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7,0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f, +0x01,0xd0,0xd0,0x92,0xaf,0x22,0xe0,0xff,0x7d,0x01,0x90,0x97,0x99,0xef,0xf0,0xa3, +0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x6a,0x60,0x04,0xe4,0xff,0x11,0xbb,0x90, +0x97,0x99,0xe0,0x30,0xe0,0x09,0x90,0x97,0x9b,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90, +0x97,0x99,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25,0xef,0xf0,0x90, +0x97,0x9a,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x44,0x80,0xf0,0x90,0x97,0x9b,0xa3,0xe0,0xff,0xfd,0x24,0x08,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54, +0xf7,0xf0,0x90,0x97,0x9b,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60,0x0b,0x90,0x97, +0x67,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x67,0xe0,0xb4,0x01,0x05, +0x7f,0x01,0x12,0x75,0x21,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x74,0xd1,0xef, +0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0xe5, +0x6a,0x60,0x04,0x7f,0x01,0x11,0xbb,0x12,0x73,0x9d,0x90,0x97,0x74,0xe0,0x54,0xf0, +0xf0,0xe0,0x44,0x02,0xf0,0x22,0xe0,0xff,0x7d,0x01,0x8f,0x67,0x8d,0x68,0xe5,0x67, +0x54,0x0f,0xff,0x90,0x97,0x74,0xe0,0x54,0x0f,0x6f,0x60,0x76,0xe5,0x67,0x30,0xe2, +0x30,0x90,0x97,0x74,0xe0,0x20,0xe2,0x05,0x7f,0x01,0x12,0x5a,0xd9,0x90,0x97,0x74, +0xe0,0x30,0xe3,0x0a,0xe5,0x67,0x20,0xe3,0x05,0x12,0x5a,0xbd,0x80,0x54,0x90,0x97, +0x74,0xe0,0x20,0xe3,0x4d,0xe5,0x67,0x30,0xe3,0x48,0xaf,0x68,0x12,0x5a,0x65,0x80, +0x41,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0d,0xe5,0x67,0x20,0xe3,0x08, +0xf1,0xfb,0xef,0x60,0x2d,0x12,0x5a,0xbd,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf, +0x04,0x0d,0xe5,0x67,0x20,0xe2,0x08,0x12,0x59,0x90,0xef,0x60,0x15,0x11,0xd6,0x90, +0x97,0x74,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x09,0x12,0x59,0xf3,0xef,0x60,0x03,0x12, +0x5b,0xec,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0x90,0x97,0x76,0xe0,0x54,0x0f,0x6f, +0x70,0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x74,0xe0,0x54,0x0f,0xff,0x90,0x97,0x68, +0xe0,0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x68,0xf0,0x90,0x97, +0x76,0xe0,0x54,0xbf,0xf0,0x22,0xef,0x64,0x01,0x70,0x3b,0x7d,0x7c,0x7f,0x02,0x12, +0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01, +0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x31,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0, +0x02,0xf1,0x22,0xe4,0xff,0x11,0xbb,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06, +0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0,0xa3,0x74,0x02,0xf0, +0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6,0x90,0x06,0x04, +0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x97,0x6f,0xe0,0xa3, +0xe0,0x90,0x05,0x58,0xf0,0xe5,0x69,0x30,0xe0,0x23,0x90,0x97,0x6c,0xe0,0x70,0x22, +0xe0,0x04,0xf0,0x90,0x97,0x74,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01, +0x7f,0x04,0x31,0x0a,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x07,0xe1,0x22,0xe4,0x90,0x97, +0x6c,0xf0,0x22,0x90,0x97,0x7a,0xe0,0x90,0x97,0x76,0x30,0xe0,0x05,0xe0,0xff,0x02, +0x74,0x87,0x21,0x06,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x74,0xf0,0x74,0x4a,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0x81,0x0c,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0x61,0xc4,0xe5,0x54,0x30,0xe5,0x02,0x61,0xc4,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x52,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x52,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x52,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5e,0x41,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5d,0xfd,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x3f,0x90,0x97,0x77, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0xf1,0xde, +0xef,0x64,0x01,0x70,0x27,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x73,0xf0,0x80,0x07,0xf1,0xde,0xbf,0x01,0x02,0x51,0x63,0xe5,0x2c,0x30,0xe1, +0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3,0x5a, +0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f,0x12, +0x6f,0x15,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c,0x30, +0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5,0x24, +0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1d,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74,0x20, +0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0xf1,0x87,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0, +0xf1,0x62,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40,0xf0,0xe5, +0x2e,0x30,0xe1,0x4c,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90,0x01,0x02, +0xe0,0x54,0x03,0x64,0x01,0x70,0x29,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a,0x74,0x01, +0xf0,0x90,0x97,0x56,0xe4,0xf0,0x80,0x18,0x90,0x97,0x56,0xe0,0x04,0xf0,0xe0,0xc3, +0x94,0x0a,0x40,0x0c,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x03,0x12,0x50,0x4a, +0x90,0x97,0x85,0xe0,0xb4,0x01,0x09,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x85,0xf0, +0xe5,0x2e,0x20,0xe0,0x02,0xa1,0x74,0x90,0x97,0x66,0x74,0x01,0xf0,0x90,0x01,0x36, +0xf0,0x90,0x97,0x80,0xe0,0x30,0xe0,0x30,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x97, +0x80,0xe0,0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x1e,0x90,0x97,0x82,0x74,0x01,0xf0, +0x12,0x44,0x81,0x90,0x97,0x81,0xe0,0x64,0x03,0x60,0x0d,0x7f,0x01,0x12,0x47,0x79, +0xef,0x60,0x05,0x7f,0x01,0x12,0x55,0xcb,0x90,0x97,0x7a,0xe0,0xff,0x30,0xe0,0x4c, +0x13,0x13,0x54,0x3f,0x30,0xe0,0x45,0x90,0x97,0x7c,0x74,0x01,0xf0,0x12,0x44,0x81, +0xe4,0xff,0x12,0x47,0x79,0xef,0x60,0x34,0x12,0x74,0xad,0x90,0x97,0x7b,0xe0,0xff, +0x64,0x04,0x60,0x28,0xef,0xb4,0x03,0x07,0xe4,0xff,0x12,0x56,0x56,0x80,0x12,0x90, +0x97,0x7b,0xe0,0xb4,0x02,0x16,0x12,0x59,0x90,0xef,0x70,0x05,0x7f,0x01,0x12,0x56, +0x56,0x90,0x97,0x76,0xe0,0xff,0x7d,0x01,0x31,0x0a,0xf1,0x22,0x12,0x5c,0xb6,0x90, +0x97,0x66,0xe4,0xf0,0xe5,0x2e,0x20,0xe2,0x02,0xa1,0xfa,0x90,0x01,0x36,0x74,0x04, +0xf0,0x90,0x97,0x7a,0xe0,0x30,0xe0,0x06,0xa3,0xe0,0x64,0x04,0x60,0x6c,0xe5,0x69, +0x64,0x01,0x70,0x66,0xe5,0x6a,0x60,0x62,0xe5,0x6a,0x64,0x02,0x60,0x06,0xe5,0x6a, +0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x6a,0xf0,0x90,0x06,0xaa,0xe0, +0x90,0x97,0x75,0xf0,0x90,0x97,0x6a,0xe0,0x70,0x07,0x90,0x97,0x75,0xe0,0xff,0x80, +0x05,0x90,0x97,0x6a,0xe0,0xff,0x90,0x97,0x6a,0xef,0xf0,0x90,0x97,0x6c,0xe0,0x60, +0x03,0xe0,0x14,0xf0,0x90,0x97,0x6b,0xe4,0xf0,0x90,0x01,0x57,0xf0,0x90,0x01,0x3c, +0x74,0x02,0xf0,0x90,0x97,0x79,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0xef,0xf0,0xe5,0x6a, +0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x5c,0x1c,0xe5,0x2e,0x30,0xe3,0x28,0x90, +0x01,0x36,0x74,0x08,0xf0,0xe5,0x69,0x64,0x01,0x70,0x1c,0xe5,0x6a,0x60,0x18,0x90, +0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8b,0xe4,0x12,0x44, +0x57,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4,0x2e,0x90,0x01,0x36,0x74, +0x10,0xf0,0xe5,0x69,0x64,0x01,0x70,0x22,0xe5,0x6a,0x60,0x1e,0x90,0x01,0x57,0xe4, +0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x78,0xe4,0xf0,0x90,0x97,0x79,0xe0, +0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x02,0x51,0x63,0xe5,0x2e,0x30,0xe5,0x1f,0x90, +0x01,0x36,0x74,0x20,0xf0,0xe5,0x69,0xb4,0x01,0x14,0xe5,0x6a,0x60,0x10,0x90,0x97, +0x77,0xe0,0x64,0x02,0x60,0x05,0x12,0x5c,0x05,0x80,0x03,0x12,0x44,0xa6,0xe5,0x2e, +0x30,0xe6,0x1d,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x69,0xb4,0x01,0x12,0xe5,0x6a, +0x60,0x0e,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0x07,0x70,0x02,0x51,0x63, +0xe5,0x2f,0x30,0xe1,0x25,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x97,0x7a,0xe0,0x30, +0xe0,0x16,0xe4,0xff,0x12,0x47,0x79,0xef,0x60,0x06,0xd1,0xf0,0xf1,0x22,0x80,0x0a, +0x90,0x97,0x7f,0x74,0x01,0xf0,0x80,0x02,0xd1,0xf0,0x74,0x74,0x04,0x90,0x01,0xc4, +0xf0,0x74,0x4a,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0, +0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32, +0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0xe5,0x6a,0x14,0x24,0xfd,0x50,0x02,0x80,0x21, +0x90,0x97,0x77,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x74,0xe0, +0x54,0x0f,0xc3,0x94,0x04,0x50,0x06,0x7d,0x01,0x7f,0x04,0x31,0x0a,0xe4,0xff,0x11, +0xbb,0x22,0x90,0x97,0x7b,0xe0,0x64,0x04,0x60,0x2f,0x90,0x97,0x74,0xe0,0x54,0x0f, +0x14,0x60,0x1f,0x14,0x60,0x15,0x24,0xfe,0x60,0x0a,0x24,0xf8,0x70,0x1b,0xe4,0x90, +0x97,0x7b,0xf0,0x22,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0x90,0x97,0x7b,0x74,0x02, +0xf0,0x22,0x90,0x01,0xc6,0xe0,0x44,0x08,0xf0,0x22,0xf4,0xff,0x90,0x00,0x43,0xe0, +0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe,0xd0,0xd0,0x92, +0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0xf1,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1, +0x72,0xe4,0xfd,0x7f,0x51,0xf1,0x72,0xe4,0xfd,0x7f,0x52,0xf1,0x72,0xe4,0xfd,0x7f, +0x53,0x80,0xbf,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1,0x72,0x7d,0xff,0x7f,0x55, +0xf1,0x72,0x7d,0xff,0x7f,0x56,0xf1,0x72,0x7d,0xff,0x7f,0x57,0x80,0x94,0x90,0x04, +0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60,0x02,0x7f,0x00,0x22,0x90,0x97,0x7f, +0xe0,0xb4,0x01,0x06,0xe4,0xf0,0xd1,0xf0,0xf1,0x22,0x22,0xf1,0xde,0xef,0x64,0x01, +0x60,0x09,0x90,0x01,0xb8,0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x73,0xe0,0x60, +0x09,0x90,0x01,0xb8,0xe0,0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x72,0xe0,0x60,0x09, +0x90,0x01,0xb8,0xe0,0x44,0x04,0xf0,0x80,0x17,0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3, +0x94,0x04,0x40,0x09,0x90,0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22, +0x90,0x01,0xbb,0xe0,0x44,0x08,0xf0,0x7f,0x00,0x22,0x12,0x47,0xf8,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x48,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x30,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x73,0x1b,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x65,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x67,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x67,0xf0,0x90,0x97,0x67,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x4c,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x4c, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x67,0xef,0x12,0x75,0x18, +0x12,0x58,0x82,0x12,0x32,0x3d,0xf1,0xf9,0xf1,0xe7,0x11,0x61,0xe4,0x90,0x97,0x66, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0xf1,0xcf,0x12,0x45,0x01, +0x90,0x97,0x32,0xe5,0xd9,0xf0,0x12,0x4f,0xb3,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44, +0x40,0xf0,0x12,0x4f,0x62,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x97,0x30, +0xe0,0x64,0x01,0xf0,0x24,0x7f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3,0xf0,0xe5,0x57, +0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x31,0x8c,0xe5,0x57,0x30,0xe6, +0x0a,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x62,0x19,0x31,0x5f,0x80,0xce,0x90, +0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b,0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9, +0x7e,0x01,0x12,0x73,0x2c,0xbf,0x01,0x09,0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80, +0x05,0x80,0x00,0x02,0x73,0x0c,0xe4,0x90,0x06,0x34,0xf0,0x22,0x90,0x01,0xcc,0xe0, +0x54,0x0f,0x90,0x97,0x33,0xf0,0x90,0x97,0x33,0xe0,0xfd,0x70,0x02,0x41,0xcd,0x90, +0x97,0xab,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x41,0xc6,0x90,0x97,0xab,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x52,0xe0,0x90,0x97,0x34,0xf0,0x75,0x63,0x01, +0x75,0x64,0x97,0x75,0x65,0x34,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79,0x35,0x12, +0x45,0x09,0x90,0x97,0x35,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90,0x97,0xab, +0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x52,0xe0,0x90,0x97, +0x36,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43,0x52,0xe0, +0x90,0x97,0x37,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1,0x12,0x43, +0x52,0xe0,0x90,0x97,0x38,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2, +0x12,0x43,0x52,0xe0,0x90,0x97,0x39,0xf0,0x90,0x97,0xab,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x97,0x3a,0xf0,0x80,0x33,0xe0,0x75,0xf0,0x04, +0x90,0x01,0xd1,0x12,0x43,0x52,0xe0,0x90,0x97,0x36,0xf0,0x90,0x97,0xab,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x52,0xe0,0x90,0x97,0x37,0xf0,0x90,0x97,0xab, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x52,0xe0,0x90,0x97,0x38,0xf0,0xef, +0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x36,0x51,0xce,0x90,0x97,0x33,0xe0,0xff, +0x90,0x97,0xab,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xf4,0x5f,0x90,0x97,0x33,0xf0,0x90,0x97,0xab,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xab,0xe0,0x04,0xf0, +0xe0,0x54,0x03,0xf0,0x21,0x96,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22,0x90,0x97, +0x3b,0x12,0x43,0x7e,0xef,0x12,0x43,0x87,0x52,0xf7,0x01,0x53,0x00,0x02,0x53,0x08, +0x03,0x53,0x11,0x05,0x53,0x1a,0x06,0x53,0x43,0x07,0x53,0x23,0x08,0x53,0x2b,0x09, +0x53,0x34,0x20,0x00,0x00,0x53,0x3c,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x59,0x67, +0x90,0x97,0x3b,0x12,0x43,0x5e,0xe1,0xeb,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x70, +0x12,0x90,0x97,0x3b,0x12,0x43,0x5e,0x02,0x6e,0xe6,0x90,0x97,0x3b,0x12,0x43,0x5e, +0x02,0x6e,0xd0,0x90,0x97,0x3b,0x12,0x43,0x5e,0x80,0x19,0x90,0x97,0x3b,0x12,0x43, +0x5e,0x02,0x70,0x5a,0x90,0x97,0x3b,0x12,0x43,0x5e,0xe1,0xf1,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x3e,0x12,0x43, +0x7e,0xe4,0x90,0x97,0x41,0xf0,0x12,0x29,0xd9,0xc3,0x13,0x20,0xe0,0x02,0x81,0x8e, +0x90,0x97,0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x54,0x02,0xfe,0x90,0x97,0x80, +0xe0,0x54,0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0, +0x12,0x29,0xd9,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x97,0x80,0xf0, +0xee,0x54,0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x29,0xd9,0xfe,0x54,0x20, +0xfd,0xef,0x54,0xdf,0x4d,0xff,0x90,0x97,0x80,0xf0,0xee,0x54,0x40,0xfe,0xef,0x54, +0xbf,0x4e,0xf0,0x20,0xe0,0x02,0x81,0x7e,0x90,0x97,0x41,0x74,0x21,0xf0,0x90,0x97, +0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x13,0x13,0x54,0x01,0xfe,0x90,0x97,0x80, +0xe0,0xfd,0x13,0x13,0x54,0x01,0x6e,0x60,0x2a,0xef,0x54,0x04,0xff,0xed,0x54,0xfb, +0x4f,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x30,0xe0,0x0e,0x90,0x01,0x34,0x74,0x40,0xf0, +0xfd,0xe4,0xff,0x12,0x36,0xe6,0x80,0x0b,0xe4,0x90,0x97,0x82,0xf0,0x7d,0x40,0xff, +0x12,0x36,0x75,0x90,0x97,0x80,0xe0,0xfd,0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07, +0x90,0x97,0x41,0xe0,0x44,0x12,0xf0,0xed,0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x97, +0x41,0xe0,0x44,0x14,0xf0,0x90,0x97,0x80,0xe0,0xc4,0x13,0x54,0x07,0x30,0xe0,0x07, +0x90,0x97,0x41,0xe0,0x44,0x80,0xf0,0x90,0x97,0x80,0xe0,0xc4,0x13,0x13,0x54,0x03, +0x20,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x40,0xf0,0x90,0x97,0x41,0xe0,0x90,0x05, +0x27,0xf0,0x90,0x97,0x81,0xe0,0x70,0x04,0x7f,0x01,0xb1,0xcb,0x90,0x97,0x80,0xe0, +0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x04,0x7f,0x03,0x80,0x0e,0x7f,0x01,0x12,0x47, +0x79,0xef,0x60,0x04,0x7f,0x01,0x80,0x02,0x7f,0x02,0xb1,0xcb,0xa1,0xc6,0x90,0x97, +0x41,0x74,0x01,0xf0,0x90,0x05,0x27,0xf0,0xe4,0xff,0xb1,0xcb,0xa1,0xc4,0x90,0x97, +0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0x54,0x02,0xfe,0x90,0x97,0x7a,0xe0,0x54, +0xfd,0x4e,0xfe,0xf0,0xef,0x54,0x01,0xff,0xee,0x54,0xfe,0x4f,0xff,0xf0,0x12,0x29, +0xd9,0xfe,0x54,0x08,0xfd,0xef,0x54,0xf7,0x4d,0xff,0x90,0x97,0x7a,0xf0,0xee,0x54, +0x10,0xfe,0xef,0x54,0xef,0x4e,0xff,0xf0,0x12,0x29,0xd9,0xfe,0x54,0x40,0xfd,0xef, +0x54,0xbf,0x4d,0x90,0x97,0x7a,0xf0,0x20,0xe0,0x02,0xa1,0x97,0x90,0x97,0x41,0x74, +0x31,0xf0,0xee,0x13,0x13,0x54,0x01,0xff,0x90,0x97,0x7a,0xe0,0xfe,0x13,0x13,0x54, +0x01,0x6f,0x60,0x27,0x90,0x97,0x3e,0x12,0x43,0x5e,0x12,0x29,0xd9,0x54,0x04,0xff, +0xee,0x54,0xfb,0x4f,0x90,0x97,0x7a,0xf0,0xe0,0x13,0x13,0x54,0x3f,0x20,0xe0,0x0b, +0xe4,0x90,0x97,0x7c,0xf0,0x7d,0x40,0xff,0x12,0x36,0x75,0x90,0x97,0x7a,0xe0,0xfd, +0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x02,0xf0,0xed, +0xc4,0x54,0x0f,0x30,0xe0,0x07,0x90,0x97,0x41,0xe0,0x44,0x04,0xf0,0x90,0x97,0x41, +0xe0,0x54,0x06,0x60,0x0c,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37, +0x00,0x90,0x97,0x41,0xe0,0x90,0x05,0x27,0xf0,0x90,0x97,0x7a,0xe0,0xff,0xc4,0x13, +0x13,0x54,0x03,0x30,0xe0,0x0c,0xa3,0xe0,0x64,0x04,0x60,0x5a,0x7f,0x04,0xd1,0x56, +0x80,0x54,0x90,0x97,0x7b,0xe0,0x64,0x04,0x70,0x18,0x7f,0x01,0xd1,0x56,0xe4,0xff, +0x12,0x47,0x79,0xef,0x60,0x08,0x90,0x97,0x76,0x12,0x49,0x06,0x80,0x04,0xf1,0xb9, +0x80,0x34,0x12,0x4f,0x22,0x80,0x2f,0x90,0x97,0x41,0x74,0x01,0xf0,0x90,0x05,0x27, +0xf0,0x7d,0x03,0x7f,0x02,0x12,0x36,0x92,0x90,0x97,0x7b,0xe0,0xb4,0x04,0x04,0x7f, +0x01,0x80,0x09,0x90,0x97,0x7b,0xe0,0xb4,0x03,0x04,0xe4,0xff,0xd1,0x56,0x12,0x4f, +0xed,0x12,0x4a,0x63,0xf1,0xf9,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x97,0x81,0xe0,0xfe, +0x6f,0x60,0x60,0xef,0x14,0x60,0x1a,0x14,0x60,0x32,0x14,0x60,0x44,0x24,0x03,0x70, +0x52,0xee,0xb4,0x03,0x02,0xe1,0x75,0x90,0x97,0x81,0xe0,0x64,0x02,0x70,0x44,0xe1, +0x8b,0x90,0x97,0x81,0xe0,0xfe,0xb4,0x03,0x04,0x7f,0x01,0x80,0x37,0xee,0xb4,0x02, +0x03,0x02,0x5b,0x76,0x90,0x97,0x81,0xe0,0x70,0x29,0x80,0x37,0x90,0x97,0x81,0xe0, +0xfe,0xb4,0x03,0x06,0xe4,0xff,0xd1,0x34,0x80,0x05,0xee,0x70,0x02,0xd1,0x43,0xe1, +0xa3,0x90,0x97,0x81,0xe0,0xb4,0x02,0x03,0x02,0x44,0xfb,0x90,0x97,0x81,0xe0,0x70, +0x02,0xf1,0x95,0x22,0xef,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x81,0x74, +0x01,0xf0,0x22,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37,0x00,0x90, +0x97,0x81,0x74,0x01,0xf0,0x22,0x90,0x97,0x7b,0xe0,0xfe,0x6f,0x70,0x02,0xe1,0x20, +0xef,0x14,0x60,0x31,0x14,0x60,0x56,0x14,0x60,0x76,0x14,0x70,0x02,0xe1,0x02,0x24, +0x04,0x60,0x02,0xe1,0x20,0xee,0xb4,0x03,0x04,0x7f,0x01,0xe1,0x44,0x90,0x97,0x7b, +0xe0,0xfe,0xb4,0x04,0x06,0x7f,0x01,0xf1,0x2b,0x80,0x08,0xee,0xb4,0x02,0x04,0x7f, +0x01,0xf1,0x21,0xe1,0x5d,0x90,0x97,0x7b,0xe0,0xb4,0x03,0x04,0x7f,0x01,0xf1,0x44, +0x90,0x97,0x7b,0xe0,0x70,0x02,0xe1,0x3a,0x90,0x97,0x7b,0xe0,0xfe,0xb4,0x04,0x04, +0x7f,0x01,0x80,0x77,0xee,0x64,0x02,0x70,0x67,0x7f,0x01,0x80,0x64,0x90,0x97,0x7b, +0xe0,0xb4,0x03,0x04,0x7f,0x01,0xf1,0x44,0x90,0x97,0x7b,0xe0,0x70,0x04,0xf1,0x3a, +0x80,0x0b,0x90,0x97,0x7b,0xe0,0xb4,0x04,0x04,0xe4,0xff,0xf1,0x2b,0x02,0x74,0x70, +0x90,0x97,0x7b,0xe0,0xfe,0xb4,0x04,0x06,0xe4,0xff,0xf1,0x2b,0x80,0x08,0xee,0xb4, +0x02,0x04,0x7f,0x01,0xf1,0x21,0x90,0x97,0x7b,0xe0,0xb4,0x01,0x02,0xf1,0x5d,0x02, +0x73,0x8e,0x90,0x97,0x7b,0xe0,0xff,0x64,0x03,0x60,0x15,0xef,0x70,0x04,0xf1,0x3a, +0x80,0x0b,0x90,0x97,0x7b,0xe0,0xb4,0x02,0x04,0xe4,0xff,0xf1,0x21,0x12,0x74,0x7a, +0x22,0x12,0x5a,0xd9,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0xef,0x60,0x05,0x90,0x05, +0x22,0xe4,0xf0,0x90,0x97,0x7b,0x74,0x01,0xf0,0x22,0x12,0x5a,0xbd,0x90,0x97,0x7b, +0x74,0x01,0xf0,0x22,0x90,0x97,0xaf,0xef,0xf0,0x12,0x5a,0xf7,0x90,0x97,0xaf,0xe0, +0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0xe4,0x90,0x97,0x7b,0xf0,0x22,0x7f,0x01,0x12, +0x5a,0x65,0xe4,0x90,0x97,0x7b,0xf0,0x22,0x90,0x05,0x22,0x74,0x0f,0xf0,0x90,0x97, +0x81,0x74,0x03,0xf0,0x22,0x90,0x05,0x22,0xe4,0xf0,0x7d,0x03,0x7f,0x02,0x12,0x36, +0x92,0x90,0x05,0x27,0xe4,0xf0,0x90,0x97,0x81,0xf0,0x22,0x12,0x5a,0xf7,0x90,0x05, +0x22,0xe4,0xf0,0x80,0xe5,0x90,0x01,0x3e,0x74,0x03,0xf0,0xfd,0x7f,0x02,0x12,0x37, +0x00,0x80,0xc5,0x12,0x74,0xd1,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x12, +0x73,0x9d,0x90,0x97,0x81,0x74,0x02,0xf0,0x22,0x90,0x97,0x7b,0xe0,0xb4,0x01,0x04, +0x7f,0x02,0x80,0x08,0x90,0x97,0x7b,0xe0,0x70,0x04,0x7f,0x03,0xd1,0x56,0x22,0x75, +0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5, +0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4,0xf5,0x26,0x22,0x12,0x29,0xd9,0xf5,0x69, +0x22,0x12,0x29,0xd9,0x90,0x97,0x86,0xf0,0x22,0xe4,0x90,0x97,0x86,0xf0,0x90,0x97, +0x80,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0x90,0x97,0x7a,0xe0,0x54,0xfe,0xf0,0x54,0xfb,0xf0,0xe4,0xa3,0xf0, +0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0, +0xd0,0x75,0xd0,0x00,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x7d,0x29,0x90,0x01,0xc4,0xed, +0xf0,0x74,0x58,0xff,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xfe,0x90,0x00, +0x55,0xe0,0x5e,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x03,0x74,0x40,0xf0,0x90,0x01,0xc4, +0xed,0xf0,0xa3,0xef,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xe0,0x32,0x8f,0x1d,0x8c,0x1e,0x8d,0x1f,0x22,0x8f,0x20,0x8c,0x21,0x8d, +0x22,0x22,0xe4,0xf5,0x69,0x90,0x97,0x79,0xf0,0xf5,0x6a,0x90,0x97,0x76,0x74,0x0c, +0xf0,0x90,0x97,0x74,0xf0,0xe4,0x90,0x97,0x77,0xf0,0x90,0x97,0x73,0xf0,0x90,0x97, +0x72,0xf0,0x90,0x97,0x75,0x04,0xf0,0x90,0x97,0x6a,0xf0,0xe4,0x90,0x97,0x78,0xf0, +0x90,0x97,0x6c,0xf0,0x90,0x97,0x71,0x74,0x07,0xf0,0xe4,0x90,0x97,0x6b,0xf0,0x90, +0x97,0x6f,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x6e,0xf0,0x90,0x97,0x69,0xf0, +0x22,0xe4,0x90,0x97,0x78,0xf0,0x90,0x97,0x6b,0xf0,0x90,0x97,0x79,0xf0,0x22,0x8b, +0x11,0x8a,0x12,0x89,0x13,0x11,0xd1,0xab,0x11,0xaa,0x12,0xa9,0x13,0x12,0x29,0xd9, +0xf5,0x6a,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x41,0x7f, +0x01,0x80,0x3a,0xab,0x11,0xaa,0x12,0xa9,0x13,0x90,0x00,0x02,0x12,0x42,0x20,0xfd, +0xe4,0xff,0x31,0x41,0x80,0x27,0xab,0x11,0xaa,0x12,0xa9,0x13,0x90,0x00,0x02,0x12, +0x42,0x20,0xfd,0x7f,0x01,0x31,0x41,0x1f,0x80,0x13,0xab,0x11,0xaa,0x12,0xa9,0x13, +0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x31,0x41,0xe4,0xff,0x12,0x49,0xc6, +0x22,0xef,0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x75,0x74,0x01,0xf0,0x80, +0x11,0xed,0x90,0x97,0x75,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97, +0x75,0xe0,0x90,0x97,0x6a,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00, +0x01,0x12,0x42,0x20,0x90,0x97,0x77,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97, +0x69,0xf0,0x12,0x29,0xd9,0x65,0x6a,0x60,0x02,0x11,0xdf,0xd0,0xd0,0x92,0xaf,0x22, +0x12,0x4f,0xde,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0,0x44,0x01,0xf0,0x80, +0x48,0x90,0x97,0x79,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9,0xe0,0x44,0x02,0xf0, +0x80,0x37,0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x79,0xe0,0x30,0xe2,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x79,0xe0,0x30,0xe4,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44,0x04,0xf0, +0x7f,0x00,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x76,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x65,0xe0,0xb4,0x02,0x10,0x90,0x97,0x4c,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x6e,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5, +0x69,0xb4,0x01,0x04,0xe4,0xff,0x51,0x84,0x90,0x97,0x74,0xe0,0x54,0xf0,0xf0,0xe0, +0x44,0x0c,0xf0,0x22,0x8f,0x6c,0x12,0x47,0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x97, +0x61,0x12,0x48,0x26,0xe5,0x6c,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0x04, +0xe0,0x44,0x40,0xf0,0xe5,0x69,0xb4,0x01,0x04,0x7f,0x01,0x51,0x84,0x90,0x97,0x74, +0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x97,0xac,0xef,0xf0,0x51,0xf7, +0x90,0x97,0xac,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x74,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f, +0x62,0x90,0x97,0x1d,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e, +0x08,0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x46,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x46, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59, +0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x67, +0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd, +0x7f,0x01,0x12,0x34,0x81,0x22,0x51,0xf7,0x90,0x97,0x85,0xe0,0x64,0x01,0x60,0x0c, +0x90,0x01,0x36,0xe0,0x20,0xe0,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x81,0x74, +0x01,0xf0,0x22,0x8f,0x6b,0xe4,0x90,0x97,0xa5,0xf0,0xa3,0xf0,0x90,0x01,0x09,0xe0, +0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6b,0x60,0x3e,0xc3,0x90,0x97,0xa6, +0xe0,0x94,0x88,0x90,0x97,0xa5,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6,0xe0,0x44, +0x80,0xf0,0x22,0x90,0x97,0xa5,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f,0x14,0x7e, +0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xa6,0xe0,0x94,0x32,0x90,0x97,0xa5,0xe0,0x94, +0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x22,0x90,0x97,0x74,0xe0, +0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0,0x12,0x45,0x02,0x71,0xeb,0xe0,0x54,0xf0,0xf0, +0xe0,0x44,0x02,0xf0,0x22,0x12,0x47,0xf8,0xbf,0x01,0x10,0x90,0x97,0x60,0xe0,0xff, +0xe4,0xfd,0x12,0x48,0x2a,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x90,0x06,0xa9,0xe0, +0xf5,0x0b,0x54,0xc0,0x70,0x0e,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd, +0xf0,0x12,0x4a,0x63,0xe5,0x0b,0x30,0xe6,0x18,0x90,0x97,0x79,0xe0,0x44,0x01,0xf0, +0x90,0x97,0x77,0xe0,0x64,0x02,0x60,0x04,0x91,0x05,0x80,0x0c,0x12,0x44,0xa6,0x80, +0x07,0x90,0x97,0x79,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90,0x97,0x79,0x30,0xe7,0x18, +0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x8b,0x12,0x44,0x57,0x90,0x01,0x57,0x74,0x05, +0xf0,0x90,0x97,0x78,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0,0x22,0x8f,0x6d,0x12, +0x47,0xf8,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x62,0x12,0x48,0x26,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x2e,0xf0,0xe5,0x6a,0x70,0x02,0xa1, +0x58,0xe5,0x69,0x64,0x01,0x60,0x02,0xa1,0x58,0xe5,0x6a,0x14,0x60,0x29,0x24,0xfd, +0x60,0x25,0x24,0x02,0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x6a,0xe0,0x14,0xf0, +0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x97,0x6a,0xe0,0x70,0x0a,0x90,0x97,0x75, +0xe0,0x90,0x97,0x6a,0xf0,0x80,0x00,0x90,0x97,0x2e,0x74,0x01,0xf0,0x90,0x97,0x7a, +0xe0,0x30,0xe0,0x16,0xa3,0xe0,0xb4,0x04,0x05,0xe4,0x90,0x97,0x2e,0xf0,0xe4,0xff, +0x12,0x47,0x79,0xef,0x70,0x04,0x90,0x97,0x2e,0xf0,0x90,0x97,0x2e,0xe0,0x60,0x38, +0x90,0x97,0x79,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x8b,0xf0,0x90,0x97,0x71,0xe0, +0x90,0x97,0x8c,0x12,0x44,0x5b,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x74,0xe0, +0x54,0x0f,0xc3,0x94,0x04,0x50,0x11,0x7d,0x01,0x7f,0x04,0x12,0x49,0x0a,0x90,0x97, +0x7a,0xe0,0x30,0xe0,0x03,0x12,0x4f,0x22,0x22,0x90,0x97,0x78,0xe0,0x60,0x0e,0xe4, +0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28,0x80,0x23,0x90,0x97,0x6b, +0xe0,0x04,0xf0,0x90,0x97,0x79,0xe0,0x54,0xef,0xf0,0x90,0x97,0x6b,0xe0,0xd3,0x94, +0x01,0x40,0x0d,0xe5,0x69,0xb4,0x01,0x0b,0xa3,0xe0,0x70,0x07,0xe0,0x04,0xf0,0x22, +0x12,0x4a,0x63,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef,0x30,0xe0,0x17,0xed,0xc4, +0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0xe0,0x4d,0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xed,0xf0,0xaf,0x11,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f, +0xf5,0x10,0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0xeb, +0xc3,0x94,0x01,0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41, +0x9e,0x93,0xfc,0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe4,0xf0,0x80,0xaf,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0, +0x22,0xac,0x07,0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xff,0x74, +0xa5,0x2c,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40, +0x02,0xab,0x07,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4, +0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41, +0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff, +0xec,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef, +0xf0,0xaf,0x04,0xad,0x03,0xb1,0xe5,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1c,0x54,0x1f,0xfc,0x75,0xf0, +0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xff,0x90,0x97,0x3d,0xf0,0xed,0x25, +0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97, +0x3e,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x40,0xcb,0xf0,0xa3,0xeb,0xf0,0xec,0x25, +0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01,0x93, +0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0,0xa3, +0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xe1,0xac,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x3d,0xe0,0xff,0xeb,0xd3,0x9f,0x40, +0x02,0xe1,0xdd,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01,0x7e, +0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97, +0x3e,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50,0x39, +0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9, +0xff,0x90,0x97,0x40,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64,0x13, +0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x3e,0xe0,0x30,0xe0, +0x02,0x7b,0x18,0xac,0x03,0x8c,0x1c,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x3d,0xe0, +0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x52,0xe0,0xb4,0x01,0x0c,0xe5,0x1c, +0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1c,0x80,0x03,0xaf,0x1c,0x22,0xec,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff, +0xec,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f, +0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5, +0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3,0x9b, +0x40,0x56,0x90,0x97,0x3d,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xef,0xf0,0xac,0x07,0x8f,0x1c,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x2e,0xf5, +0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13, +0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1c,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1c,0x44,0x80,0xfd,0x12,0x5d,0xe5,0xe5,0x1c, +0x44,0x80,0xff,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x3f,0xf0,0x75,0xf0,0x09, +0xea,0x90,0x93,0x28,0x12,0x43,0x52,0xe0,0x90,0x97,0x41,0xf0,0x75,0xf0,0x09,0xea, +0x90,0x93,0x27,0x12,0x43,0x52,0xe0,0xfe,0x90,0x97,0x42,0xf0,0xea,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x43,0xcd, +0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x45,0xcd,0xf0,0xa3,0xed,0xf0,0xe9,0xd3,0x9e,0x40, +0x09,0x90,0x97,0x42,0xe0,0x90,0x97,0x3f,0xf0,0xfb,0xef,0x70,0x02,0x21,0xd1,0x90, +0x97,0x40,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x3f,0xe0,0xfb,0xa3,0xe0,0x14, +0xf0,0x90,0x97,0x40,0xe0,0x70,0x02,0x21,0xd1,0x90,0x97,0x3f,0xe0,0xff,0xd3,0x94, +0x00,0x50,0x02,0x21,0xd1,0xe4,0x90,0x97,0x3e,0xf0,0xef,0x14,0x90,0x97,0x3d,0xf0, +0x90,0x97,0x41,0xe0,0xf9,0x90,0x97,0x3d,0xe0,0xff,0xd3,0x99,0x40,0x6a,0xef,0x94, +0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x45,0xe0,0x5e,0xfe,0xa3,0xe0, +0x5f,0x4e,0x70,0x27,0x90,0x97,0x3d,0xe0,0xff,0xc3,0x94,0x10,0x50,0x32,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x43,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97,0x3d,0xe0,0xfb, +0xa3,0xe0,0x04,0xf0,0x90,0x97,0x40,0xe0,0xff,0x90,0x97,0x3e,0xe0,0x6f,0x60,0x08, +0x90,0x97,0x3d,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x40,0xe0,0xff,0x90,0x97,0x3e, +0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x3d,0xe0,0xb5,0x01,0x05,0x90,0x97,0x41,0xe0, +0xfb,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe, +0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x2e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xea,0x25, +0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf, +0x02,0xad,0x03,0x12,0x5d,0xe5,0xaf,0x03,0x22,0xe4,0xf5,0x11,0x75,0xf0,0x09,0xe5, +0x11,0x90,0x93,0x2a,0x12,0x43,0x52,0xe0,0x64,0x01,0x60,0x02,0xe1,0xe3,0xe5,0x11, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xe3,0xe5,0x11,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0xe5,0x11,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x37,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x39,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x33, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93,0x27,0x12, +0x43,0x52,0xe0,0x90,0x97,0x3c,0xf0,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xbc,0x90,0x97,0x3c,0xe0,0xff,0x90, +0x97,0x34,0xe0,0x9f,0x40,0x13,0x90,0x97,0x3c,0xe0,0x90,0x97,0x34,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x33,0xf0,0xef,0x4e,0xf0,0x90,0x97,0x34,0xe0,0xff,0x90,0x41, +0x12,0x93,0xfe,0x74,0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3, +0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80,0x07,0x90,0x97,0x34,0xe0,0x90,0x40,0xf6, +0x93,0x90,0x97,0x3b,0xf0,0x90,0x97,0x3b,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50,0xf9, +0x74,0x40,0x35,0xf0,0x75,0x13,0xff,0xf5,0x14,0x89,0x15,0x90,0x97,0x33,0xe0,0x90, +0x41,0xba,0x93,0xff,0xd3,0x90,0x97,0x3a,0xe0,0x9f,0x90,0x97,0x39,0xe0,0x94,0x00, +0x40,0x08,0xe4,0xfd,0xaf,0x11,0x11,0x94,0xe1,0x7a,0xe5,0x11,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x19,0xa3,0xe0,0xf5,0x1a,0xab,0x13, +0xaa,0x14,0xa9,0x15,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18, +0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35, +0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x42,0x20,0xff, +0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x02,0x12,0x42,0xc2,0xfd,0xac, +0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab,0x13, +0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef, +0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90, +0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee, +0x35,0x19,0xf5,0x19,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x04,0x12,0x42,0x20, +0xff,0x7e,0x00,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x08,0x12,0x42,0xc2,0xfd, +0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xab, +0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00,0x90,0x97, +0x37,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1a,0x9f,0xe5,0x19,0x9e, +0x40,0x0c,0xe5,0x1a,0x9f,0xf5,0x1a,0xe5,0x19,0x9e,0xf5,0x19,0x80,0x05,0xe4,0xf5, +0x19,0xf5,0x1a,0xe5,0x11,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xe5,0x19,0xf0,0xa3,0xe5,0x1a,0xf0,0x90,0x97,0x33,0xe0,0xf9,0x25,0xe0,0x24,0x2e, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1a,0xe4,0x93,0x95, +0x19,0x50,0x07,0xaf,0x11,0x12,0x5e,0xaa,0xe1,0x4e,0xe9,0x25,0xe0,0x24,0x66,0xf5, +0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1a,0xe4,0x93,0x95,0x19, +0x50,0x02,0xe1,0x4e,0x7d,0x01,0xaf,0x11,0x11,0x94,0xe1,0x4e,0x74,0x64,0x25,0x11, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02,0xc1,0x57,0x90, +0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x19,0x40,0x3d, +0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x11,0x40,0x2e,0x80, +0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x34,0xe0,0xc3,0x94,0x0a, +0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x34,0xe0,0xc3,0x94,0x03,0x40,0x0d, +0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0,0x74,0x43,0x25, +0x11,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1b,0x74,0x23,0x25,0x11,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02,0xc1,0x04,0x90, +0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x04,0x74,0x44,0x25,0x11,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff,0xe4,0x33,0xfe, +0x74,0x21,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd,0xd3,0x9f,0xee, +0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4,0x33,0xfe,0x74, +0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f,0xee,0x64,0x80, +0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xe0,0xff,0x90,0x97,0x34,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25,0x11,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75,0x1b,0x05,0x80, +0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1b,0x03,0x80,0x03,0x75,0x1b,0x01,0x74, +0x21,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74,0x44,0x25,0x11, +0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1b,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe4,0xf0,0x90,0x97,0x34,0xe0,0xff,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x11,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe5,0x1b,0xf0,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93,0x2b,0x12,0x43,0x52,0xe0, +0xb4,0x01,0x10,0xe4,0xf5,0x1b,0x74,0x64,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5, +0x83,0xe4,0xf0,0xad,0x1b,0xe1,0x49,0xec,0x64,0x06,0x60,0x02,0xe1,0x4e,0xf5,0x19, +0xf5,0x1a,0x90,0x41,0xdb,0x93,0xff,0x7e,0x00,0x90,0x97,0x37,0xe0,0xfc,0xa3,0xe0, +0xfd,0x12,0x29,0xf2,0x90,0x97,0x35,0xee,0xf0,0xa3,0xef,0xf0,0x74,0x43,0x25,0x11, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1b,0xe4,0xf5,0x12,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x75,0xf0,0x02,0xe5,0x12,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0xe5,0x12,0x90,0x41,0xd6,0x93,0xff,0x7e,0x00,0x12,0x29,0xf2, +0xef,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xc3,0x90,0x97,0x36,0xe0,0x95, +0x1a,0x90,0x97,0x35,0xe0,0x95,0x19,0x40,0x07,0x05,0x12,0xe5,0x12,0xb4,0x05,0xbd, +0xe5,0x12,0xc3,0x13,0xf5,0x12,0xe5,0x1b,0xb4,0x01,0x06,0xe5,0x12,0x70,0x46,0x80, +0x13,0xe5,0x1b,0xb4,0x03,0x15,0xe5,0x12,0x70,0x05,0x75,0x1b,0x03,0x80,0x39,0xe5, +0x12,0xb4,0x01,0x05,0x75,0x1b,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1b,0xb4,0x05,0x28, +0xe5,0x12,0x70,0x05,0x75,0x1b,0x05,0x80,0x0d,0xe5,0x12,0xb4,0x01,0x05,0x75,0x1b, +0x03,0x80,0x03,0x75,0x1b,0x01,0xd3,0x90,0x97,0x3a,0xe0,0x94,0x03,0x90,0x97,0x39, +0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1b,0xd3,0x90,0x97,0x3a,0xe0,0x94,0x03,0x90, +0x97,0x39,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1b,0x74,0x43,0x25,0x11,0xf5,0x82, +0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1b,0xf0,0xfd,0xaf,0x11,0x12,0x5d,0x94,0x74,0x64, +0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74,0x64,0x50, +0x0e,0x25,0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x0b,0x25, +0x11,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18, +0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x02,0xe4, +0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00, +0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0xe5,0x11,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xe5,0x11,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0, +0xa3,0xf0,0xe5,0x11,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0x05,0x11,0xe5,0x11,0xc3,0x94,0x20,0x50,0x02,0x41,0x1c,0x22,0xe4, +0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x0d,0xbd,0x10, +0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x52,0xe4,0xf0,0xa3, +0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75, +0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a, +0xed,0x90,0x90,0x06,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90, +0x90,0x08,0x12,0x43,0x52,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xed,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xed,0x25, +0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x44, +0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, +0xe4,0xf0,0x90,0x41,0x8c,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x54,0x74,0x01, +0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24, +0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x52,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x52,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x52, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x52, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x52,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x03,0x22,0x8f,0x11,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xaf,0x82,0xf5,0x13,0x8f,0x14,0xe5,0x11,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9, +0x74,0x92,0x35,0xf0,0x75,0x15,0x01,0xf5,0x16,0x89,0x17,0x75,0xf0,0x09,0xe5,0x11, +0x90,0x93,0x25,0x12,0x43,0x52,0xaf,0x82,0x85,0x83,0x18,0x8f,0x19,0xe5,0x11,0x75, +0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1a,0x01,0xf5,0x1b,0x89, +0x1c,0x74,0xc1,0x25,0x11,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x87, +0x6a,0x05,0x00,0x6a,0x1a,0x01,0x6a,0x2f,0x02,0x6a,0x44,0x03,0x6a,0x6d,0x04,0x6a, +0x82,0x05,0x6a,0x97,0x06,0x6a,0xbd,0x0c,0x6a,0xea,0x0d,0x6b,0x17,0x0e,0x6b,0x44, +0x0f,0x00,0x00,0x6b,0x78,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x11,0x25,0xe0,0x24,0xe4, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5, +0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3, +0x74,0x05,0x80,0x12,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x61,0x78,0xe5,0x11,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5, +0x80,0x27,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x11,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x61,0x78,0x90,0x04,0x47, +0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x15, +0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x14, +0x82,0x85,0x13,0x83,0xf0,0x90,0x04,0x44,0x61,0x6f,0x90,0x04,0x4b,0xe0,0xab,0x15, +0xaa,0x16,0xa9,0x17,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x15,0xaa,0x16,0xa9, +0x17,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x14,0x82,0x85,0x13, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x15,0xaa,0x16,0xa9, +0x17,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x14,0x82,0x85,0x13,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x15,0xaa,0x16,0xa9,0x17,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x14,0x82,0x85,0x13,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x14,0x82,0x85,0x13,0x83,0xa3,0xf0,0xab,0x15,0xaa,0x16,0xa9,0x17,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1a,0xaa,0x1b,0xa9,0x1c,0x12,0x29, +0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x15,0xe5,0x17,0x24, +0x01,0xf9,0xe4,0x35,0x16,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, +0xab,0x1a,0xaa,0x1b,0xa9,0x1c,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x14,0x82,0x85,0x13,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x19,0x82,0x85,0x18,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x14,0x82,0x85,0x13,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x19, +0x82,0x85,0x18,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x11, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x12,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x12,0x24,0x10, +0x80,0x5d,0x15,0x12,0xe5,0x12,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x11,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x12,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x4a,0xe5,0x12, +0xf0,0x80,0x10,0x15,0x12,0xe5,0x12,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x4a,0xf0,0xe5,0x11,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x12,0x74,0x01,0x7e,0x00,0xa8,0x12, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x4b,0xe5,0x12,0xf0,0x80,0x5b,0x05,0x12,0xe5,0x12,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x11,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x12,0x74,0x01,0x7e,0x00,0xa8,0x12,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x11,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x12,0x24,0x10,0x80,0x0a,0x05,0x12,0xe5,0x12,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x4b,0xf0,0x90,0x97,0x4a,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x11,0x90,0x93, +0x27,0x12,0x43,0x52,0xef,0xf0,0x90,0x97,0x4b,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x11, +0x90,0x93,0x28,0x12,0x43,0x52,0xee,0xf0,0x74,0x84,0x25,0x11,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x06,0x90,0x97,0x4a,0x12,0x5d,0xd4,0x74,0x84, +0x25,0x11,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x4b,0xe0,0xfe, +0xef,0xc3,0x9e,0x50,0x03,0x12,0x5d,0xd4,0x90,0x97,0x4a,0xe0,0xff,0xd3,0x94,0x13, +0x40,0x08,0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08, +0x90,0x93,0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93, +0x22,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90, +0x04,0xb1,0xf0,0x22,0x90,0x97,0x3e,0xef,0xf0,0xa3,0xed,0xf0,0xa3,0x12,0x43,0x7e, +0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x42,0x20,0x54,0xf0,0xc4,0x54, +0x0f,0x90,0x97,0x43,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54,0x40,0xc4,0x13,0x13, +0x54,0x03,0x90,0x97,0x44,0xf0,0x90,0x97,0x3e,0xe0,0xff,0x75,0xf0,0x09,0x90,0x93, +0x25,0x12,0x43,0x52,0xad,0x82,0xac,0x83,0x90,0x97,0x45,0xec,0xf0,0xa3,0xed,0xf0, +0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0xfa,0x7b,0x01,0xa3, +0x12,0x43,0x7e,0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x03,0x12,0x42,0x20,0x54, +0x0f,0xff,0x90,0x97,0x47,0x12,0x43,0x5e,0xef,0x12,0x42,0x4d,0x90,0x97,0x40,0x12, +0x43,0x5e,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x47,0x12,0x43,0x5e,0x90, +0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x40,0x12,0x43,0x5e,0x90,0x00,0x01,0x12, +0x42,0x20,0xff,0x90,0x97,0x45,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5,0x82,0x8c,0x83,0xef, +0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97,0x43,0xe0,0xfe,0x90, +0x97,0x3e,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x90, +0x97,0x3f,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12,0x43,0x52,0xee,0xf0, +0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x52,0x74,0x01,0xf0,0x90,0x97,0x44, +0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x52,0xee,0xf0,0x21,0x85, +0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54,0x20,0xc4,0x13,0x54, +0x07,0xfd,0xaf,0x06,0xa1,0xd4,0x12,0x29,0xd9,0xf5,0x11,0xc3,0x94,0x20,0x50,0x15, +0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x11,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xef,0xf0,0x22,0xe5,0x11,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20, +0x90,0x93,0x21,0xf0,0x22,0x90,0x97,0x2e,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f, +0x44,0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0x96,0x12,0x43,0x7e,0x0b, +0x7a,0x97,0x79,0x2e,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x93,0x12,0x43, +0x7e,0x90,0x97,0x65,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x65,0xe0,0x64,0x01,0x70, +0x66,0x90,0x97,0xad,0xe0,0xff,0x04,0xf0,0x90,0x97,0x93,0x12,0x43,0x5e,0x90,0x00, +0x01,0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0xf1,0xbc,0xef,0x60,0x49,0x90,0x97, +0x93,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a, +0x01,0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0x96,0x12,0x43,0x5e,0x8b,0x63,0x8a,0x64, +0x89,0x65,0x90,0x97,0x93,0x12,0x43,0x5e,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5, +0x66,0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0, +0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01, +0xc3,0xc0,0xd0,0x90,0x97,0x9d,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, +0x90,0x97,0x9d,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90, +0x97,0xa0,0xe0,0x94,0xe8,0x90,0x97,0x9f,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6, +0xe0,0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0x9f,0xe4,0x75,0xf0,0x01,0x12, +0x42,0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92, +0xaf,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90, +0x97,0x5f,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x60,0xf0, +0x90,0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x61,0xf0,0x90,0x00,0x03, +0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20, +0xff,0xae,0x05,0xed,0x2f,0x90,0x97,0x63,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0x3e,0x12,0x43,0x7e,0x90,0x97,0x3e,0x12,0x43,0x5e,0x90,0x00,0x01, +0x12,0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x3e,0x12, +0x43,0x5e,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60, +0x2c,0xb5,0x23,0x16,0x90,0x97,0x3e,0x12,0x43,0x5e,0x90,0x00,0x01,0x12,0x42,0xc2, +0x65,0x25,0x70,0x04,0xe5,0x24,0x65,0xf0,0x60,0x23,0x90,0x97,0x3e,0x12,0x43,0x5e, +0x90,0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x11,0xd2,0x80,0x10,0x90,0x97,0x3e, +0x12,0x43,0x5e,0x12,0x29,0xd9,0x65,0x23,0x60,0x03,0x12,0x47,0xef,0xd0,0xd0,0x92, +0xaf,0x22,0x90,0x97,0x41,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x23,0x01,0x8e,0x24,0xf5, +0x25,0xe4,0xfd,0x7f,0x0b,0x31,0x14,0xe4,0xfd,0x7f,0x02,0x31,0x14,0x31,0xea,0xe4, +0xff,0x31,0xde,0xe4,0xf5,0x27,0x90,0x01,0xc9,0xe5,0x27,0xf0,0x90,0x97,0x41,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x44,0xed,0xf0, +0x90,0x97,0x43,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0x62,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x43,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0x62,0x90,0x97, +0x43,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0xca,0xe5,0x26,0xf0,0xef,0x60,0x02,0x51,0x4b,0x22,0x7f,0x0b,0x51,0x6b,0xef,0x65, +0x26,0x60,0x10,0xe5,0x26,0xb4,0x01,0x05,0xe4,0xf5,0x26,0x80,0x03,0x75,0x26,0x01, +0x7f,0x01,0x22,0x7f,0x00,0x22,0xe5,0x23,0x64,0x01,0x70,0x3e,0x31,0xea,0xbf,0x01, +0x04,0x7f,0x01,0x31,0xde,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0x12,0x4f, +0x72,0x90,0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0x12,0x4f,0x72,0x90,0x00,0x46, +0xe0,0x54,0xfb,0xfd,0x7f,0x46,0x12,0x4f,0x72,0x7f,0x02,0x51,0x6b,0x8f,0x27,0x90, +0x01,0xc9,0xe5,0x27,0xf0,0xb4,0x01,0x02,0x51,0x4b,0x22,0x90,0x00,0x49,0xe0,0x90, +0x97,0xae,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49,0x12,0x4f,0x72,0x90, +0x97,0xae,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0x02,0x4f,0x72,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xb0,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01, +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f, +0xf0,0x12,0x4f,0x62,0x90,0x97,0xb0,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4, +0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8, +0xff,0x80,0x44,0x90,0x97,0xb0,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0x5a,0x90,0x97,0xb0,0xe0,0xfd,0x74, +0x01,0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff, +0x90,0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2, +0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74, +0xff,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x22,0xe4,0x90,0x97,0x64,0xf0, +0x90,0x00,0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0x02,0x4f,0x72,0x8e,0x11,0x8f,0x12, +0x8b,0x13,0x8a,0x14,0x89,0x15,0xe4,0x90,0x97,0x33,0xf0,0xef,0x90,0x00,0x31,0xf0, +0x12,0x4f,0x62,0xe5,0x11,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0, +0x12,0x4f,0x62,0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0x62,0x90,0x00,0x33, +0xe0,0x20,0xe7,0x0e,0x90,0x97,0x33,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0, +0x80,0xeb,0x90,0x97,0x33,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab, +0x13,0xaa,0x14,0xa9,0x15,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x05, +0x22,0x74,0xff,0xf0,0x71,0x9d,0x90,0x97,0x7b,0x74,0x03,0xf0,0x22,0x7f,0x78,0x7e, +0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27, +0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x97, +0x25,0x12,0x2a,0x7f,0x90,0x97,0x67,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d,0x12,0x43, +0x46,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x46,0xef,0x54, +0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9, +0x90,0x97,0x21,0x12,0x43,0x46,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x46,0xef,0x44, +0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9, +0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x29,0x12,0x2a,0x7f,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, +0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97, +0x67,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4, +0xfd,0x7f,0x01,0x12,0x34,0x81,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02,0x4f,0x62, +0x12,0x48,0xd6,0x90,0x97,0x7b,0x74,0x02,0xf0,0x22,0x90,0x05,0x22,0x74,0x0f,0xf0, +0x90,0x97,0x7b,0x74,0x04,0xf0,0x22,0xae,0x07,0xe4,0xff,0x12,0x47,0x79,0xef,0x60, +0x19,0x90,0x97,0x7a,0xe0,0xc4,0x13,0x13,0x54,0x03,0x20,0xe0,0x0d,0xaf,0x06,0x7d, +0x01,0x12,0x49,0x0a,0x12,0x4f,0x22,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x97,0x7a, +0xe0,0xff,0xc4,0x13,0x13,0x54,0x03,0x30,0xe0,0x0b,0xa3,0xe0,0x64,0x04,0x60,0x05, +0x7f,0x04,0x12,0x56,0x56,0x90,0x97,0x7b,0xe0,0x64,0x04,0x60,0x03,0x12,0x4f,0xed, +0x22,0x90,0x05,0x22,0x74,0xff,0xf0,0xe4,0x90,0x97,0xa7,0xf0,0xa3,0xf0,0x90,0x05, +0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03, +0x7f,0x01,0x22,0xd3,0x90,0x97,0xa8,0xe0,0x94,0xe8,0x90,0x97,0xa7,0xe0,0x94,0x03, +0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x37,0x54,0x90,0x97,0xa7,0xe4, +0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6,0x90,0x97,0x67,0xe0,0x90,0x97,0x2d,0xf0, +0x22,0xef,0x70,0x02,0xc1,0xd8,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x7a,0xa4,0x90, +0x97,0x19,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, +0x2f,0xd9,0x90,0x96,0xc5,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44, +0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc9,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xcd,0x12,0x43,0x46,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43, +0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, +0xd5,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x96,0xd9,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x96,0xdd,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe1,0x12,0x43,0x46,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x46, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9, +0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x96,0xed,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x96,0xf1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf5,0x12,0x43,0x46,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf9,0x12,0x43,0x46,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12, +0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x97,0x01,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x97,0x05,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x09,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x0d,0x12,0x43,0x46,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43, +0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97, +0x15,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f, +0xd9,0x90,0x97,0x2d,0x74,0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x03, +0x02,0x7a,0xa4,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x19,0x12,0x2a,0x7f, +0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x96,0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e, +0x08,0x12,0x27,0xde,0x90,0x96,0xc9,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27, +0xde,0x90,0x96,0xcd,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96, +0xd1,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd5,0x12,0x2a, +0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c, +0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xdd,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12, +0x27,0xde,0x90,0x96,0xe1,0x12,0x2a,0x7f,0x7f,0x84,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x96,0xe5,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe9,0x12, +0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f, +0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf1,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e, +0x12,0x27,0xde,0x90,0x96,0xf5,0x12,0x2a,0x7f,0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde, +0x90,0x96,0xf9,0x12,0x2a,0x7f,0x7f,0xdc,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xfd, +0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x01,0x12,0x2a,0x7f, +0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97,0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e, +0x0c,0x12,0x27,0xde,0x90,0x97,0x09,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27, +0xde,0x90,0x97,0x0d,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97, +0x11,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x15,0x12,0x2a, +0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97, +0xa1,0x12,0x43,0x46,0xed,0x44,0xc0,0xfd,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90, +0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e, +0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4, +0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25, +0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b, +0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04, +0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, +0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, +0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, +0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e, +0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f, +0x90,0x97,0xa1,0x12,0x43,0x46,0xe4,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90, +0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f, +0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c, +0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f, +0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a, +0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04, +0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xe4,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a, +0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c, +0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0xa1,0x12, +0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc, +0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46,0xed,0x44,0x10,0xfd, +0xec,0x44,0x01,0xfc,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e, +0x08,0x12,0x27,0xde,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43,0x46, +0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12,0x43, +0x46,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xa1,0x12,0x2a,0x7f,0x90,0x97,0xa1,0x12, +0x43,0x46,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4, +0x90,0x97,0x2d,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xaa,0xed, +0xf0,0x90,0x97,0xa9,0xef,0xf0,0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0, +0x12,0x4f,0x62,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x12,0x4f,0x62,0x90,0x97,0xaa, +0xe0,0x60,0x16,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x68,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01, +0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d, +0x90,0x97,0xa9,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x12,0x4f,0x5a,0x90,0x97,0xa9,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f, +0xf0,0x12,0x4f,0x62,0x90,0x97,0xaa,0xe0,0x60,0x1b,0x90,0x97,0xa9,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00, +0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xa9,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, +0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0, +0x12,0x4f,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x0e,0x38,}; +#endif + +// =================== UMC A Cut V75 2011-06-15 ===================== +u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength] = { +0xc1,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x13,0x09,0x54,0x3a,0x01,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, +0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, +0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x30,0x62,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, +0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, +0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, +0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, +0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, +0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x24,0x62,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, +0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, +0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, +0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, +0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, +0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, +0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, +0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, +0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, +0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, +0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, +0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, +0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, +0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, +0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, +0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, +0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, +0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, +0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, +0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, +0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, +0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, +0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, +0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, +0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, +0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, +0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, +0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, +0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, +0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, +0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, +0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, +0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, +0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, +0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, +0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, +0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, +0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, +0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, +0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, +0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, +0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0xab,0x22,0x7d,0x02,0x7f,0x03,0x12,0x31,0x2c, +0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, +0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, +0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, +0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, +0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, +0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, +0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, +0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, +0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, +0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, +0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, +0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, +0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, +0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, +0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, +0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, +0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, +0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x31,0x9d, +0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xcf,0x90,0x97,0x93,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, +0x12,0x31,0x2c,0x7d,0x02,0x7f,0x03,0x12,0x31,0x2c,0x90,0x01,0x57,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, +0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, +0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x31,0x9d,0x7d,0x02,0x7f,0x03,0x12,0x31, +0x9d,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, +0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, +0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, +0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, +0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x24,0x62,0xf5, +0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, +0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, +0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, +0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, +0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, +0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, +0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, +0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, +0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, +0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, +0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, +0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, +0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, +0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, +0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, +0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, +0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, +0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x30,0x62,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, +0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, +0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, +0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, +0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, +0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, +0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, +0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, +0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, +0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, +0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, +0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, +0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, +0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, +0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, +0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, +0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, +0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, +0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, +0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, +0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, +0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, +0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, +0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, +0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, +0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, +0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, +0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, +0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, +0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, +0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, +0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, +0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, +0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, +0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, +0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0xa2, +0x12,0x5f,0xb4,0x12,0x2e,0x01,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, +0x12,0x77,0xdc,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, +0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, +0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, +0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, +0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, +0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, +0x12,0x78,0x3a,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, +0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, +0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, +0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, +0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, +0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, +0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, +0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, +0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, +0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, +0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, +0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, +0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, +0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, +0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, +0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, +0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, +0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, +0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, +0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, +0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, +0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,0x90, +0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, +0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, +0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80, +0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, +0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, +0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, +0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, +0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, +0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, +0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, +0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, +0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, +0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, +0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, +0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, +0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, +0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, +0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, +0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, +0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, +0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, +0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, +0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, +0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x79,0x12,0x90,0x97,0x5a,0x12,0x43,0x6b, +0x02,0x77,0xa9,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x22,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, +0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, +0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, +0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, +0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, +0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, +0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, +0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, +0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, +0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, +0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, +0x82,0x8c,0x83,0xef,0xf0,0x12,0x24,0x62,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, +0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, +0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, +0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, +0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, +0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, +0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, +0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, +0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, +0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, +0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, +0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, +0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, +0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, +0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, +0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, +0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, +0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x24, +0x62,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, +0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x24,0x62,0xff, +0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, +0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, +0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, +0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, +0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, +0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, +0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, +0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, +0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, +0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, +0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, +0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, +0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, +0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, +0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, +0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, +0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, +0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, +0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, +0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, +0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, +0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, +0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, +0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, +0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, +0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, +0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, +0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, +0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, +0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, +0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, +0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, +0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, +0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, +0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, +0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, +0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, +0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, +0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, +0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, +0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, +0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, +0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, +0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, +0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, +0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, +0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, +0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, +0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, +0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, +0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, +0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, +0x60,0x05,0x7f,0x01,0x12,0x76,0xfa,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, +0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, +0xfa,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, +0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, +0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, +0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, +0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, +0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, +0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, +0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, +0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, +0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, +0x14,0x7e,0x00,0x12,0x32,0x15,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, +0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, +0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, +0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, +0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, +0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, +0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, +0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, +0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, +0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, +0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, +0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, +0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, +0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, +0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, +0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, +0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, +0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, +0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, +0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, +0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x24,0x62,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, +0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b, +0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, +0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, +0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24, +0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, +0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, +0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5, +0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, +0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, +0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, +0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x24,0x7b,0xd3,0xe5,0x1b,0x9f,0xe5, +0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, +0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, +0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, +0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, +0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, +0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, +0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, +0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, +0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, +0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, +0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, +0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, +0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, +0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, +0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x24,0x7b,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, +0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, +0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, +0x12,0x24,0x7b,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, +0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, +0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, +0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, +0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, +0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, +0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, +0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, +0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, +0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, +0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, +0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, +0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, +0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, +0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, +0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, +0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, +0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, +0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, +0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, +0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x26,0x22,0x12,0x24,0x62,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, +0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, +0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, +0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, +0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, +0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, +0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, +0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x24,0x62,0xff,0xc4,0x54,0x0f,0xf5,0x66, +0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, +0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, +0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, +0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, +0x81,0x7f,0x0a,0x7e,0x00,0x12,0x32,0x15,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, +0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x24,0x62,0x65, +0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x24,0x62,0xf5,0x26, +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x24,0x62,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, +0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, +0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, +0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, +0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, +0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x24,0x62,0xff,0x60,0x2c, +0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, +0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, +0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, +0x43,0x6b,0x12,0x24,0x62,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, +0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, +0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, +0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x30,0x62,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, +0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, +0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, +0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, +0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, +0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, +0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, +0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, +0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, +0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, +0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, +0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, +0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, +0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, +0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, +0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, +0x00,0x12,0x32,0x15,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, +0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x12,0x4f,0xe5,0x90,0x97,0x1d,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97,0x21, +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08, +0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08, +0x12,0x2b,0x08,0x90,0x97,0x29,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, +0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x03,0x2d,0x95, +0xe4,0xfd,0xff,0x12,0x30,0x2c,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68, +0x12,0x25,0x14,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x22,0x7f, +0x78,0x7e,0x08,0x12,0x22,0x65,0x90,0x97,0x1d,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c, +0x12,0x22,0x65,0x90,0x97,0x21,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12,0x22,0x65, +0x90,0x97,0x25,0x12,0x25,0x08,0x90,0x97,0x86,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x0d, +0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x07,0x12,0x43,0x53, +0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x08,0x12, +0x2b,0x08,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54,0x0f,0xff,0xec,0x90,0x80,0x96, +0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x90,0x97,0x25,0x12,0x43,0x53, +0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x00,0x7e,0x08,0x12, +0x2b,0x08,0x7f,0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x97,0x29,0x12,0x25,0x08,0x90, +0x80,0x96,0x12,0x25,0x14,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08, +0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff,0x12,0x30,0x2c, +0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x68,0x12,0x25,0x14,0x00,0x00,0x00, +0x00,0xe4,0xfd,0x7f,0x01,0x12,0x30,0x2c,0x90,0x00,0x11,0xe0,0x54,0xf6,0xf0,0x02, +0x4f,0xe5,0x90,0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71, +0x63,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x75,0x2e,0x90,0x97,0x19,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x96,0xc5, +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08, +0x90,0x96,0xc9,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08, +0x12,0x2b,0x08,0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, +0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x96,0x12, +0x25,0x08,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd5,0x12,0x43,0x53,0x90, +0x80,0x96,0x12,0x25,0x08,0x7f,0x74,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xd9,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12,0x2b,0x08,0x90, +0x96,0xdd,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12, +0x2b,0x08,0x90,0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80, +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25, +0x08,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80, +0x96,0x12,0x25,0x08,0x7f,0x88,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xed,0x12,0x43, +0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96, +0xf1,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x2b, +0x08,0x90,0x96,0xf5,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xd4,0x7e, +0x0e,0x12,0x2b,0x08,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, +0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x96, +0x12,0x25,0x08,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x97,0x01,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x97,0x05, +0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08, +0x90,0x97,0x09,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c, +0x12,0x2b,0x08,0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f, +0x04,0x7e,0x0d,0x12,0x2b,0x08,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x96,0x12, +0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x90,0x97,0x15,0x12,0x43,0x53,0x90, +0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97,0x2d,0x74, +0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x2e,0x7f,0x8c,0x7e, +0x08,0x12,0x22,0x65,0x90,0x97,0x19,0x12,0x25,0x08,0x7f,0x44,0x7e,0x08,0x12,0x22, +0x65,0x90,0x96,0xc5,0x12,0x25,0x08,0x7f,0x5c,0x7e,0x08,0x12,0x22,0x65,0x90,0x96, +0xc9,0x12,0x25,0x08,0x7f,0x6c,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xcd,0x12,0x25, +0x08,0x7f,0x70,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xd1,0x12,0x25,0x08,0x7f,0x74, +0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xd5,0x12,0x25,0x08,0x7f,0x78,0x7e,0x0e,0x12, +0x22,0x65,0x90,0x96,0xd9,0x12,0x25,0x08,0x7f,0x7c,0x7e,0x0e,0x12,0x22,0x65,0x90, +0x96,0xdd,0x12,0x25,0x08,0x7f,0x80,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe1,0x12, +0x25,0x08,0x7f,0x84,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe5,0x12,0x25,0x08,0x7f, +0x88,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xe9,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x0e, +0x12,0x22,0x65,0x90,0x96,0xed,0x12,0x25,0x08,0x7f,0xd0,0x7e,0x0e,0x12,0x22,0x65, +0x90,0x96,0xf1,0x12,0x25,0x08,0x7f,0xd4,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xf5, +0x12,0x25,0x08,0x7f,0xd8,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xf9,0x12,0x25,0x08, +0x7f,0xdc,0x7e,0x0e,0x12,0x22,0x65,0x90,0x96,0xfd,0x12,0x25,0x08,0x7f,0xe0,0x7e, +0x0e,0x12,0x22,0x65,0x90,0x97,0x01,0x12,0x25,0x08,0x7f,0xec,0x7e,0x0e,0x12,0x22, +0x65,0x90,0x97,0x05,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x22,0x65,0x90,0x97, +0x09,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x22,0x65,0x90,0x97,0x0d,0x12,0x25, +0x08,0x7f,0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0x11,0x12,0x25,0x08,0x7f,0x04, +0x7e,0x08,0x12,0x22,0x65,0x90,0x97,0x15,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12, +0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44, +0xc0,0xfd,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x96,0x12,0x25,0x08,0x7f,0x8c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96,0x12, +0x25,0x14,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80,0x96, +0x12,0x25,0x14,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x08,0x90,0x80, +0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x08,0x90, +0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x08, +0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2b, +0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12, +0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e, +0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e, +0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x63,0xdb,0x25,0xa4,0x7f,0x84, +0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x04,0x1b,0x25,0xa4,0x7f, +0x88,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25,0xa4, +0x7f,0x8c,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb,0x25, +0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20,0xdb, +0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14,0x20, +0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25,0x14, +0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12,0x25, +0x14,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2b,0x08,0x90,0x80,0x96,0x12, +0x25,0x14,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2b,0x08,0x7f,0x04,0x7e, +0x0c,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, +0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef, +0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, +0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x08,0x7f,0x04,0x7e, +0x0d,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53, +0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x08,0x7f, +0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0xe4,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43, +0x53,0xef,0x44,0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f, +0x0c,0x7e,0x09,0x12,0x22,0x65,0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12, +0x43,0x53,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x25,0x08, +0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97, +0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, +0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x08,0x7f,0x04,0x7e,0x08,0x12,0x22,0x65,0x90,0x97, +0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90, +0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec, +0x90,0x97,0xb3,0x12,0x25,0x08,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x96,0x12, +0x25,0x08,0x7f,0x04,0x7e,0x08,0x12,0x2b,0x08,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3, +0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0, +0xd3,0x94,0x07,0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x46,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00, +0x45,0x80,0x68,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3, +0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8, +0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54, +0xf0,0x12,0x4f,0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0xbc,0xe0,0x60,0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90, +0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4, +0x54,0xf0,0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92, +0xaf,0x22,0x8b,0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97, +0x3b,0xf0,0xe0,0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08, +0x12,0x22,0x65,0x90,0x97,0x34,0x12,0x25,0x08,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x01,0x12,0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x24,0xf5,0xa8, +0x04,0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03, +0xfc,0x12,0x43,0x46,0x90,0x97,0x3e,0x12,0x25,0x08,0x90,0x05,0x22,0xe4,0xf0,0x80, +0x2d,0xe4,0x90,0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x22,0x65,0xec,0x54,0x03, +0xfc,0xec,0x44,0xc0,0xfc,0x90,0x97,0x34,0x12,0x25,0x08,0x90,0x97,0x34,0x12,0x43, +0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x97, +0x3b,0xe0,0x30,0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e, +0x90,0x00,0x47,0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0, +0x54,0xf3,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f, +0x46,0x12,0x47,0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60, +0x6a,0x24,0x02,0x60,0x02,0xe1,0xa8,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48, +0xe0,0x44,0x0c,0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd, +0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75, +0xe4,0x90,0x97,0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25, +0x08,0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f, +0x45,0x12,0x47,0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x46,0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01, +0xf0,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08,0x7f,0x80,0x7e, +0x08,0x12,0x2b,0x08,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0, +0x44,0x10,0xfd,0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x97,0x3c,0xf0,0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12, +0xc2,0xaf,0x90,0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40, +0x7f,0x01,0x12,0x31,0x66,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45, +0x12,0x47,0x52,0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97, +0x42,0xf0,0x90,0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97, +0x44,0xf0,0x90,0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97, +0x4c,0xf0,0x90,0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00, +0x51,0xe0,0x44,0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01, +0x60,0x08,0x90,0x97,0x3a,0xe0,0x60,0x02,0x21,0x11,0x90,0x97,0x2e,0xe0,0xc3,0x94, +0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50, +0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94, +0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90, +0x97,0x2e,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, +0x97,0x42,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43, +0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0, +0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42, +0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50, +0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, +0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, +0xf0,0xe4,0x90,0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, +0xf0,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12, +0x42,0x20,0x25,0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x24,0x62,0x25,0xe0,0x25, +0xe0,0x90,0x97,0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61, +0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63, +0xe0,0x90,0x97,0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90, +0x97,0x39,0xe0,0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90, +0x97,0x3a,0xe0,0x70,0x02,0x41,0x1c,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x1c,0x90, +0x97,0x3d,0xe0,0x70,0x02,0x41,0x1c,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2, +0xaf,0x90,0x97,0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12, +0x47,0x49,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x96,0x12,0x25,0x08, +0x7f,0x80,0x7e,0x08,0x12,0x2b,0x08,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90, +0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64, +0x80,0xf0,0x90,0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05, +0x85,0xf0,0x90,0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05, +0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0, +0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x31,0xb7,0x80,0x2d,0x90,0x97,0x3a,0xe0, +0x70,0x2f,0x90,0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f, +0x46,0x12,0x47,0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0, +0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x31,0x49,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92, +0xaf,0x22,0x46,0x58,}; + +// =================== UMC B Cut V75 2011-06-15 ===================== +u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] = { +0xc2,0x88,0x02,0x00,0x4b,0x00,0x00,0x00,0x06,0x15,0x13,0x11,0x42,0x3a,0x01,0x00, +0x35,0x68,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x43,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x4b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x5f,0x14,0x00,0x00,0x00,0x00,0x00,0xa1,0xdf,0x00,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x04,0x04,0x04,0x05,0x04,0x04, +0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x04,0x04, +0x05,0x05,0x05,0x05,0x06,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x07,0x0a,0x0b, +0x0d,0x10,0x04,0x05,0x05,0x06,0x06,0x09,0x0c,0x11,0x08,0x08,0x09,0x09,0x0a,0x0c, +0x10,0x11,0x04,0x04,0x04,0x05,0x04,0x04,0x05,0x07,0x07,0x07,0x08,0x0a,0x04,0x04, +0x04,0x04,0x06,0x0a,0x0b,0x0d,0x05,0x05,0x07,0x07,0x08,0x0b,0x0d,0x0f,0x04,0x04, +0x04,0x05,0x07,0x07,0x09,0x09,0x0c,0x0e,0x10,0x12,0x04,0x04,0x05,0x05,0x06,0x0a, +0x11,0x13,0x09,0x09,0x09,0x09,0x0c,0x0e,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x04,0x04, +0x05,0x07,0x04,0x04,0x07,0x0a,0x0a,0x0c,0x0c,0x12,0x05,0x07,0x07,0x08,0x0b,0x12, +0x24,0x3c,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x20,0x1e, +0x1c,0x18,0x10,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50, +0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22, +0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22,0xbb,0x01,0x06, +0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02,0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8, +0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22, +0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2, +0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70, +0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5, +0xf0,0xa3,0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3, +0xf5,0xf0,0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01, +0x93,0x22,0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0, +0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22, +0xbb,0xfe,0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a, +0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a, +0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb, +0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29, +0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09, +0xe9,0x25,0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8, +0xf2,0xe5,0xf0,0x08,0xf2,0x22,0xef,0x4b,0xff,0xee,0x4a,0xfe,0xed,0x49,0xfd,0xec, +0x48,0xfc,0x22,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xa4, +0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xe0,0xfb,0xa3,0xe0,0xfa, +0xa3,0xe0,0xf9,0x22,0xf8,0xe0,0xfb,0xa3,0xa3,0xe0,0xf9,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0xfa,0x38,0xf0,0x22,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93, +0x70,0x0d,0xa3,0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74, +0x02,0x93,0x68,0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x02,0x43,0xf8,0x02,0x50,0x6f, +0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4, +0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f, +0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b, +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x44,0x3d,0xe4,0x7e,0x01,0x93,0x60, +0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01, +0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93, +0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8, +0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x48,0x97,0x76, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x97,0x6d,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x41,0x97,0x75,0x00,0x41,0x97,0xbd,0x00,0x41,0x97,0x87,0x80,0x41, +0x97,0xbf,0x00,0x00,0xf0,0xa3,0x74,0x03,0xf0,0xe4,0xfb,0xfd,0x7f,0x54,0x7e,0x01, +0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x9c,0xeb,0xf0,0xa3,0xe0,0xfb,0xa3, +0xe0,0xf5,0x44,0xe4,0xf5,0x45,0x12,0x35,0xab,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01, +0x5f,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0xa3,0x74, +0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05, +0xf0,0x90,0x06,0x92,0x74,0x02,0xf0,0x90,0x97,0x91,0x14,0xf0,0x90,0x97,0x93,0xe0, +0x54,0x0f,0xc3,0x94,0x0c,0x50,0x03,0x12,0x48,0xdb,0x22,0x8f,0x82,0x8e,0x83,0xa3, +0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x67,0x7f,0x60,0x7e,0x01,0x80,0xed,0x90,0x97, +0x95,0xe0,0xff,0x7d,0x01,0x02,0x48,0xdf,0xb1,0xb1,0xbf,0x01,0x0f,0x90,0x97,0x7f, +0xe0,0xff,0xe4,0xfd,0xf1,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0,0x22,0x22,0x22,0x22, +0x22,0x00,0x00,0x02,0x5f,0xa6,0x02,0x5f,0xad,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x8b,0x60,0x8a,0x61,0x89,0x62,0x90,0x97,0x9f,0x71,0x8b,0xab,0x63,0xaa,0x64,0xa9, +0x65,0x90,0x97,0xa2,0x71,0x8b,0xaf,0x66,0x15,0x66,0xef,0x60,0x1b,0x90,0x97,0xa2, +0xe4,0x75,0xf0,0x01,0x71,0x74,0x12,0x29,0xd9,0xff,0x90,0x97,0x9f,0xe4,0x75,0xf0, +0x01,0x71,0x74,0xef,0x51,0x4d,0x80,0xde,0xab,0x60,0xaa,0x61,0xa9,0x62,0xd0,0xd0, +0x92,0xaf,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0b,0x54,0xc0,0x70,0x0d,0x90,0x97,0x98, +0xe0,0x54,0xfe,0xf0,0xe0,0x54,0xfd,0xf0,0x91,0xde,0xe5,0x0b,0x30,0xe6,0x17,0x90, +0x97,0x98,0xe0,0x44,0x01,0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x04,0x91,0xe8, +0x80,0x0b,0x91,0x8e,0x80,0x07,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe5,0x0b,0x90, +0x97,0x98,0x30,0xe7,0x17,0xe0,0x44,0x02,0xf0,0xe4,0x90,0x97,0x9d,0x91,0x64,0x90, +0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x97,0x74,0x01,0xf0,0x22,0xe0,0x54,0xfd,0xf0, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x04,0x1d,0xe0,0x60,0x1a,0x90,0x05, +0x22,0xe0,0x54,0x90,0x60,0x07,0x90,0x01,0xc6,0xe0,0x44,0x40,0xf0,0x90,0x01,0xc7, +0xe0,0x30,0xe1,0xe4,0x7f,0x00,0x80,0x02,0x7f,0x01,0xd0,0xd0,0x92,0xaf,0x22,0xc0, +0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01, +0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74, +0xdf,0xf0,0x74,0x45,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5, +0x34,0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xa3,0xe0,0x55, +0x33,0xf5,0x37,0xe5,0x34,0x30,0xe0,0x06,0x90,0x01,0x3c,0x74,0x01,0xf0,0xe5,0x34, +0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x61,0x7e,0xe5,0x34,0x30,0xe2, +0x34,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x20,0x90,0x97, +0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x91,0x70, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x07,0x90,0x97, +0x92,0xe4,0xf0,0x91,0xde,0xe5,0x34,0x30,0xe3,0x34,0x90,0x01,0x3c,0x74,0x08,0xf0, +0x90,0x06,0x92,0xe0,0x30,0xe1,0x20,0x90,0x97,0x9d,0xe4,0xf0,0xa3,0x74,0x14,0xf0, +0xe4,0xfb,0xfd,0x7f,0x5c,0x7e,0x01,0x91,0x70,0x90,0x01,0x5f,0x74,0x05,0xf0,0x90, +0x06,0x92,0x74,0x02,0xf0,0x80,0x07,0x90,0x97,0x91,0xe4,0xf0,0x91,0xde,0xe5,0x34, +0x30,0xe4,0x08,0x90,0x01,0x3c,0x74,0x10,0xf0,0xf1,0x04,0xe5,0x34,0x30,0xe5,0x09, +0x90,0x01,0x3c,0x74,0x20,0xf0,0x12,0x52,0xe8,0xe5,0x35,0x30,0xe0,0x10,0x90,0x01, +0x3d,0x74,0x01,0xf0,0x90,0x00,0x83,0xe0,0x90,0x97,0x95,0xf0,0x91,0xde,0x74,0xdf, +0x04,0x90,0x01,0xc4,0xf0,0x74,0x45,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0, +0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0, +0xf0,0xd0,0xe0,0x32,0xe5,0x67,0x64,0x01,0x70,0x3d,0x12,0x6c,0xde,0xbf,0x01,0x04, +0x7f,0x01,0xf1,0xdd,0x90,0x00,0x46,0xe0,0x44,0x04,0xfd,0x7f,0x46,0xf1,0x52,0x90, +0x00,0x44,0xe0,0x54,0xfb,0xfd,0x7f,0x44,0xf1,0x52,0x90,0x00,0x46,0xe0,0x54,0xfb, +0xfd,0x7f,0x46,0xf1,0x52,0x7f,0x02,0x12,0x6c,0xfa,0x8f,0x6b,0x90,0x01,0xc9,0xe5, +0x6b,0xf0,0xb4,0x01,0x02,0xf1,0xbf,0x22,0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xfd, +0x7f,0x45,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x8f,0x82,0x75,0x83,0x00,0xed,0xf0, +0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0, +0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x54,0xf1, +0x52,0x7d,0xff,0x7f,0x55,0xf1,0x52,0x7d,0xff,0x7f,0x56,0xf1,0x52,0x7d,0xff,0x7f, +0x57,0x80,0xbf,0x90,0x01,0x30,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01, +0x38,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xfd,0x7f,0x50,0xf1,0x52,0xe4,0xfd,0x7f, +0x51,0xf1,0x52,0xe4,0xfd,0x7f,0x52,0xf1,0x52,0xe4,0xfd,0x7f,0x53,0x80,0x93,0x90, +0x00,0x49,0xe0,0x90,0x97,0xc0,0xf0,0xe0,0x54,0x0f,0xf0,0x44,0xf0,0xfd,0x7f,0x49, +0xf1,0x52,0x90,0x97,0xc0,0xe0,0x44,0xb0,0xfd,0x7f,0x49,0xe1,0x52,0x90,0x01,0xca, +0xe5,0x6a,0xf0,0xef,0x60,0x02,0xf1,0xbf,0x22,0xe4,0x90,0x97,0x83,0xf0,0x90,0x00, +0x80,0xe0,0x44,0x80,0xfd,0x7f,0x80,0xe1,0x52,0xe0,0xff,0x7d,0x01,0x90,0x97,0xab, +0xef,0xf0,0xa3,0xed,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x27,0x60,0x04,0xe4,0xff, +0x11,0x8e,0x90,0x97,0xab,0xe0,0x30,0xe0,0x09,0x90,0x97,0xad,0xe4,0xf0,0xa3,0x74, +0x80,0xf0,0x90,0x97,0xab,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0xac,0xe0,0x60,0x1f,0xa3,0xa3,0xe0,0xff,0x24,0x0f,0xf5,0x82, +0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x74,0x10,0x2f,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xad,0xa3,0xe0,0xff,0xfd,0x24,0x08, +0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4,0x34, +0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5, +0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xad,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0xef,0x60, +0x0b,0x90,0x97,0x86,0xe0,0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x6f,0x98,0x22,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75, +0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x21,0x90,0x97,0x96,0xe0,0x60,0x06,0x7d, +0x01,0x7f,0x0c,0x80,0x0f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x06, +0x7d,0x01,0x7f,0x04,0x11,0xdf,0xe4,0xff,0x11,0x8e,0x22,0x7d,0x01,0x7f,0x0c,0x8f, +0x24,0x8d,0x25,0xe5,0x24,0x54,0x0f,0xff,0x90,0x97,0x93,0xe0,0x54,0x0f,0x6f,0x60, +0x70,0xe5,0x24,0x30,0xe2,0x2d,0x90,0x97,0x93,0xe0,0x20,0xe2,0x04,0x7f,0x01,0x71, +0x0f,0x90,0x97,0x93,0xe0,0x30,0xe3,0x09,0xe5,0x24,0x20,0xe3,0x04,0x31,0x95,0x80, +0x50,0x90,0x97,0x93,0xe0,0x20,0xe3,0x49,0xe5,0x24,0x30,0xe3,0x44,0xaf,0x25,0x71, +0x2e,0x80,0x3e,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x0c,0x0c,0xe5,0x24,0x20, +0xe3,0x07,0x71,0x86,0xef,0x60,0x2a,0x31,0x95,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff, +0xbf,0x04,0x0c,0xe5,0x24,0x20,0xe2,0x07,0xf1,0xf5,0xef,0x60,0x14,0x31,0xb1,0x90, +0x97,0x93,0xe0,0x54,0x0f,0xff,0xbf,0x02,0x08,0x12,0x60,0x03,0xef,0x60,0x02,0x51, +0xf5,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x95,0xe0,0x54,0x0f,0x6f,0x70, +0x23,0xe0,0x30,0xe6,0x1f,0x90,0x97,0x93,0xe0,0x54,0x0f,0xff,0x90,0x97,0x87,0xe0, +0xfe,0x4f,0x90,0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x87,0xf0,0x90,0x97,0x95, +0xe0,0x54,0xbf,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x26,0xb4,0x01, +0x04,0x7f,0x01,0x71,0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0, +0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22,0x74,0xff,0xf0,0x12,0x6e,0x0f, +0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d,0x02,0x7f,0x03,0x12,0x36,0xe6, +0xe5,0x27,0x60,0x04,0x7f,0x01,0x11,0x8e,0x12,0x6e,0xc5,0x90,0x97,0x93,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0xef,0x64,0x01,0x70,0x2e,0x7d,0x7c,0x7f,0x02, +0x12,0x36,0x75,0x7d,0x02,0x7f,0x03,0x12,0x36,0x75,0x90,0x01,0x57,0xe4,0xf0,0x90, +0x01,0x3c,0x74,0x02,0xf0,0x11,0xdb,0xe4,0xff,0x11,0x8e,0x90,0x06,0x04,0xe0,0x54, +0x7f,0xf0,0x90,0x06,0x0a,0xe0,0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7c,0xf0, +0xa3,0x74,0x02,0xf0,0x7d,0x7c,0xff,0x12,0x36,0xe6,0x7d,0x02,0x7f,0x03,0x12,0x36, +0xe6,0x90,0x06,0x04,0xe0,0x44,0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90, +0x97,0x8e,0xe0,0xa3,0xe0,0x90,0x05,0x58,0xf0,0xe5,0x26,0x30,0xe0,0x1a,0x90,0x97, +0x8b,0xe0,0x70,0x19,0xe0,0x04,0xf0,0x90,0x97,0x93,0xe0,0x54,0x0f,0xc3,0x94,0x04, +0x50,0x0b,0x7d,0x01,0x7f,0x04,0x01,0xdf,0xe4,0x90,0x97,0x8b,0xf0,0x22,0x8b,0x12, +0x8a,0x13,0x89,0x14,0xf1,0xcf,0xab,0x12,0xaa,0x13,0xa9,0x14,0x12,0x29,0xd9,0xf5, +0x27,0x14,0x60,0x0e,0x14,0x60,0x1e,0x14,0x60,0x2f,0x24,0x03,0x70,0x40,0x7f,0x01, +0x80,0x3a,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0xfd,0xe4, +0xff,0x51,0xcf,0x80,0x27,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x02,0x12,0x42, +0x20,0xfd,0x7f,0x01,0x51,0xcf,0x1f,0x80,0x13,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90, +0x00,0x02,0x12,0x42,0x20,0xfd,0x7f,0x02,0x51,0xcf,0xe4,0xff,0x31,0xe7,0x22,0xef, +0x24,0xfe,0x60,0x0b,0x04,0x70,0x1d,0x90,0x97,0x94,0x74,0x01,0xf0,0x80,0x11,0xed, +0x90,0x97,0x94,0x70,0x05,0x74,0x05,0xf0,0x80,0x02,0xed,0xf0,0x90,0x97,0x94,0xe0, +0x90,0x97,0x89,0xf0,0x22,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0, +0x12,0x44,0xfd,0x12,0x44,0xfe,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90, +0x97,0xbe,0xef,0xf0,0x12,0x6e,0x50,0x90,0x97,0xbe,0xe0,0x60,0x05,0x90,0x05,0x22, +0xe4,0xf0,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06, +0x04,0xe0,0x54,0xbf,0xf0,0xef,0x60,0x09,0xe5,0x26,0xb4,0x01,0x04,0xe4,0xff,0x71, +0x4d,0x90,0x97,0x93,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x8f,0x6d,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x80,0x12,0x47,0xf9,0xe5,0x6d,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb8, +0xe0,0x44,0x01,0xf0,0x80,0x35,0x90,0x97,0x92,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0, +0x44,0x02,0xf0,0x80,0x26,0x90,0x97,0x91,0xe0,0x60,0x09,0x90,0x01,0xb8,0xe0,0x44, +0x04,0xf0,0x80,0x17,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x04,0x40,0x09,0x90, +0x01,0xb8,0xe0,0x44,0x08,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x08,0xf0,0x7f,0x00,0x22,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x7f,0x01,0x60, +0x02,0x7f,0x00,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0xe4,0xf0,0x74,0x4b,0xa3,0xf0,0x90,0x01,0x34,0xe0,0x55, +0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xa3,0xe0,0x55,0x2b,0xf5, +0x2f,0xe5,0x2c,0x20,0xe0,0x02,0xa1,0x7d,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1, +0x4d,0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52, +0x85,0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54, +0x20,0x6f,0x70,0x02,0xa1,0x34,0xe5,0x54,0x30,0xe5,0x02,0xa1,0x34,0xe5,0x52,0x54, +0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5,0x08, +0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42, +0x81,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34, +0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x09,0xd3,0x94,0x04,0x40,0x03, +0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75,0xf0, +0x02,0xe5,0x09,0x12,0x43,0x5f,0xe0,0xfe,0xa3,0xe0,0xff,0xe5,0x53,0x54,0x1f,0x2f, +0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0x90,0x90,0x00,0x12,0x43,0x5f,0x75, +0xf0,0x02,0xe5,0x09,0x12,0x43,0x5f,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6, +0x24,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08, +0x12,0x5b,0x3e,0x80,0x2f,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3, +0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x42,0x81,0xe5,0x4f,0x30, +0xe7,0x12,0xe5,0x4f,0x54,0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0e,0xab,0x09,0xaf, +0x08,0x12,0x5a,0xeb,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x40,0x90,0x97,0x96, +0xe0,0x60,0x32,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x04,0xf0,0x71,0xd5, +0xef,0x64,0x01,0x70,0x28,0x75,0x44,0x14,0xf5,0x45,0xfb,0xfd,0x7f,0x58,0x7e,0x01, +0x12,0x35,0xab,0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90, +0x97,0x92,0xf0,0x80,0x08,0x71,0xd5,0xbf,0x01,0x03,0x12,0x44,0xde,0xe5,0x2c,0x30, +0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x58,0x85,0xd2,0x59,0x85,0xd3, +0x5a,0x85,0xd4,0x5b,0x85,0xd5,0x5c,0x85,0xd6,0x5d,0x85,0xd7,0x5e,0x85,0xd9,0x5f, +0x12,0x69,0xe4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34,0x74,0x08,0xf0,0xe5,0x2c, +0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x57,0x10,0xe5,0x2c,0x30,0xe5, +0x25,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1e,0xe0,0x54,0xdf,0xf0,0x90,0x01,0x34,0x74, +0x20,0xf0,0x75,0xa8,0x00,0x75,0xe8,0x00,0x12,0x47,0x93,0x90,0x00,0x03,0xe0,0x54, +0xfb,0xf0,0xf1,0xe5,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74,0x40, +0xf0,0xe5,0x2e,0x30,0xe1,0x3b,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x57,0x40,0x90, +0x01,0x02,0xe0,0x54,0x03,0x64,0x01,0x70,0x28,0x90,0x01,0x37,0xe0,0x30,0xe0,0x0a, +0x74,0x01,0xf0,0x90,0x97,0x75,0xe4,0xf0,0x80,0x17,0x90,0x97,0x75,0xe0,0x04,0xf0, +0xe0,0xc3,0x94,0x0a,0x40,0x0b,0xe4,0xf0,0x90,0x04,0x19,0xe0,0x30,0xe0,0x02,0xf1, +0x9a,0xe5,0x2e,0x30,0xe0,0x12,0x90,0x97,0x85,0x74,0x01,0xf0,0x90,0x01,0x36,0xf0, +0x12,0x61,0x06,0x90,0x97,0x85,0xe4,0xf0,0xe5,0x2e,0x30,0xe2,0x72,0x90,0x01,0x36, +0x74,0x04,0xf0,0xe5,0x26,0x64,0x01,0x70,0x66,0xe5,0x27,0x60,0x62,0xe5,0x27,0x64, +0x02,0x60,0x06,0xe5,0x27,0x64,0x05,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x89, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x94,0xf0,0x90,0x97,0x89,0xe0,0x70,0x07,0x90, +0x97,0x94,0xe0,0xff,0x80,0x05,0x90,0x97,0x89,0xe0,0xff,0x90,0x97,0x89,0xef,0xf0, +0x90,0x97,0x8b,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x8a,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0xe5,0x27,0x14,0x24,0xfd,0x50,0x02,0x80,0x03,0x12,0x45,0x53,0xe5, +0x2e,0x30,0xe3,0x28,0x90,0x01,0x36,0x74,0x08,0xf0,0xe5,0x26,0x64,0x01,0x70,0x1c, +0xe5,0x27,0x60,0x18,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90, +0x97,0x9d,0xe4,0x12,0x44,0x64,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x2f,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x26,0x64,0x01,0x70,0x23,0xe5,0x27,0x60, +0x1f,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x97,0xe4, +0xf0,0x90,0x97,0x98,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x03,0x12,0x44,0xde, +0xe5,0x2e,0x30,0xe5,0x1f,0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x26,0xb4,0x01,0x14, +0xe5,0x27,0x60,0x10,0x90,0x97,0x96,0xe0,0x64,0x02,0x60,0x05,0x12,0x44,0xe8,0x80, +0x03,0x12,0x44,0x8e,0xe5,0x2e,0x30,0xe6,0x1e,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5, +0x26,0xb4,0x01,0x13,0xe5,0x27,0x60,0x0f,0x90,0x97,0x98,0xe0,0x54,0xfe,0xf0,0xe0, +0x54,0x07,0x70,0x03,0x12,0x44,0xde,0xe5,0x2f,0x30,0xe1,0x08,0x90,0x01,0x37,0x74, +0x02,0xf0,0x11,0xa9,0x74,0xe4,0x04,0x90,0x01,0xc4,0xf0,0x74,0x4b,0xa3,0xf0,0xd0, +0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0, +0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x45,0xb1,0xbf,0x01,0x10, +0x90,0x02,0x09,0xe0,0xff,0x7d,0x01,0x12,0x47,0xfd,0x90,0x04,0x1f,0x74,0x20,0xf0, +0x22,0x75,0x28,0x33,0xe4,0xf5,0x29,0x75,0x2a,0x03,0xf5,0x2b,0x90,0x01,0x30,0xe5, +0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3,0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x22,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x98,0xf0,0x22,0xf4,0xff,0x90, +0x00,0x43,0xe0,0x5f,0xf0,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x7f,0x10,0xdf,0xfe, +0xd0,0xd0,0x92,0xaf,0x22,0x71,0xd5,0xef,0x64,0x01,0x60,0x09,0x90,0x01,0xb9,0xe0, +0x44,0x01,0xf0,0x80,0x48,0x90,0x97,0x98,0xe0,0x54,0x03,0x60,0x09,0x90,0x01,0xb9, +0xe0,0x44,0x02,0xf0,0x80,0x37,0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x40, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x04,0xf0,0x80,0x23,0x90,0x97,0x98,0xe0,0x30,0xe2, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x08,0xf0,0x80,0x13,0x90,0x97,0x98,0xe0,0x30,0xe4, +0x09,0x90,0x01,0xb9,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb, +0xe0,0x44,0x04,0xf0,0x7f,0x00,0x22,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32, +0x90,0x01,0x38,0xe5,0x30,0xf0,0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x22,0xe4, +0x90,0x97,0x4f,0xf0,0xa3,0xf0,0x75,0x8e,0x02,0x12,0x47,0xe9,0x90,0x00,0x02,0xe0, +0x54,0xe0,0x90,0x97,0x84,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0,0x90, +0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x86,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90, +0x97,0x86,0xf0,0x90,0x97,0x86,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30,0xe7, +0x0c,0x90,0x97,0x6b,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97,0x6b, +0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x57,0x12,0x68,0x02,0x12,0x6f,0x8f, +0x12,0x5f,0xb4,0x12,0x32,0x3d,0x12,0x6e,0x0b,0x12,0x4f,0xb1,0xe4,0x90,0x97,0x85, +0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05,0x41,0x74,0x10,0xf0,0x90,0x05, +0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0,0xf0,0x11,0x57,0x12,0x44,0xff, +0x12,0x77,0xc9,0x90,0x97,0x51,0xe5,0xd9,0xf0,0x12,0x47,0x68,0xc2,0xaf,0x90,0x00, +0x80,0xe0,0x44,0x40,0xf0,0x12,0x4f,0xe5,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf, +0x90,0x97,0x4f,0xe0,0x64,0x01,0xf0,0x24,0x6f,0x90,0x01,0xc4,0xf0,0x74,0x50,0xa3, +0xf0,0xe5,0x57,0x30,0xe4,0x09,0xc2,0xaf,0x53,0x57,0xef,0xd2,0xaf,0x71,0x9e,0xe5, +0x57,0x30,0xe6,0x16,0xc2,0xaf,0x53,0x57,0xbf,0xd2,0xaf,0x12,0x61,0xf9,0x90,0x97, +0x3c,0xe0,0xff,0x60,0x03,0xb4,0x01,0x02,0x31,0x94,0x90,0x97,0x3c,0xe0,0x70,0x03, +0x12,0x78,0x27,0x31,0x67,0x80,0xb9,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b, +0x7b,0x01,0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x6d,0xa9,0xbf,0x01,0x09, +0x90,0x06,0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x6d,0x9b,0xe4,0x90, +0x06,0x34,0xf0,0x22,0x90,0x97,0x33,0xe0,0xc3,0x94,0x14,0x50,0x05,0xe0,0x04,0xf0, +0x41,0x4c,0x90,0x97,0x33,0xe0,0x64,0x14,0x60,0x02,0x41,0x4c,0x90,0x97,0x42,0xe0, +0x70,0x25,0x90,0x97,0x45,0xe0,0x70,0x1f,0x90,0x97,0x43,0xe0,0x70,0x19,0x90,0x97, +0x46,0xe0,0x70,0x13,0x90,0x97,0x44,0xe0,0x70,0x0d,0x90,0x97,0x47,0xe0,0x70,0x07, +0x90,0x04,0xfd,0xe0,0x54,0xfe,0xf0,0x90,0x97,0x42,0xe0,0x90,0x04,0x44,0xf0,0x90, +0x97,0x43,0xe0,0x90,0x04,0x45,0xf0,0x90,0x97,0x44,0xe0,0x90,0x04,0x46,0xf0,0xa3, +0xe4,0xf0,0x90,0x97,0x45,0xe0,0x90,0x04,0x48,0xf0,0x90,0x97,0x46,0xe0,0x90,0x04, +0x49,0xf0,0x90,0x97,0x47,0xe0,0x90,0x04,0x4a,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x2e, +0xe0,0x90,0x04,0x4c,0xf0,0x90,0x97,0x2f,0xe0,0x90,0x04,0x4d,0xf0,0x90,0x97,0x30, +0xe0,0x90,0x04,0x4e,0xf0,0x90,0x97,0x31,0xe0,0x90,0x04,0x4f,0xf0,0xe4,0x90,0x97, +0x33,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97, +0x42,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x05,0x60,0xe0, +0x90,0x97,0x52,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x53,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x54,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x4b,0xe0, +0xff,0x90,0x97,0x55,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90,0x97,0x4b,0xe0,0xc3,0x9e, +0xd3,0x94,0x01,0x40,0x10,0x90,0x97,0x39,0xe0,0xb4,0x01,0x02,0x80,0x03,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0x22,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05, +0x61,0xe0,0x90,0x97,0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05, +0x63,0xe0,0x90,0x97,0x4b,0xf0,0xc3,0x74,0xff,0x9f,0xfe,0x90,0x97,0x49,0xe0,0xd3, +0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff,0x0f,0xe4,0xf0,0xa3,0xe0,0xb4, +0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x4b,0x80,0x03,0x90,0x97,0x4a,0xe0,0x04,0xf0, +0x22,0x90,0x97,0x49,0xe0,0x2f,0xf0,0x22,0x90,0x97,0x3a,0xe0,0x64,0x01,0x60,0x02, +0x61,0x9d,0x90,0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97, +0x4c,0xe0,0x70,0x32,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x3e,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80,0x06,0x90, +0x05,0x22,0x74,0x7f,0xf0,0x90,0x97,0x39,0xe0,0xff,0x51,0x96,0x90,0x97,0x4c,0x74, +0x01,0x12,0x47,0x48,0x80,0x40,0x90,0x97,0x4c,0xe0,0x64,0x01,0x70,0x38,0x90,0x97, +0x3d,0xe0,0xff,0x51,0x96,0xe4,0x90,0x97,0x4c,0xf0,0x90,0x00,0x45,0xe0,0x44,0x01, +0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60,0x15,0x90,0x97,0x34,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x80, +0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x48, +0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x4a, +0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x01, +0xcc,0xe0,0x54,0x0f,0x90,0x97,0x52,0xf0,0x90,0x97,0x52,0xe0,0xfd,0x70,0x02,0x81, +0xdf,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x02,0x81,0xd8,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd0,0x12,0x43,0x5f,0xe0,0x90,0x97,0x53,0xf0,0x75, +0x63,0x01,0x75,0x64,0x97,0x75,0x65,0x53,0x75,0x66,0x01,0x7b,0x01,0x7a,0x97,0x79, +0x54,0x12,0x45,0x09,0x90,0x97,0x54,0xe0,0xff,0xc4,0x13,0x13,0x13,0x54,0x01,0x90, +0x97,0xbd,0x30,0xe0,0x59,0xe0,0x75,0xf0,0x02,0x90,0x00,0x88,0x12,0x43,0x5f,0xe0, +0x90,0x97,0x55,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x02,0x90,0x00,0x89,0x12,0x43, +0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd1, +0x12,0x43,0x5f,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90, +0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x58,0xf0,0x90,0x97,0xbd,0xe0,0x75,0xf0, +0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x59,0xf0,0x80,0x33,0xe0,0x75, +0xf0,0x04,0x90,0x01,0xd1,0x12,0x43,0x5f,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0xbd, +0xe0,0x75,0xf0,0x04,0x90,0x01,0xd2,0x12,0x43,0x5f,0xe0,0x90,0x97,0x56,0xf0,0x90, +0x97,0xbd,0xe0,0x75,0xf0,0x04,0x90,0x01,0xd3,0x12,0x43,0x5f,0xe0,0x90,0x97,0x57, +0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01,0x7a,0x97,0x79,0x55,0x91,0xe0,0x90,0x97,0x52, +0xe0,0xff,0x90,0x97,0xbd,0xe0,0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0x5f,0x90,0x97,0x52,0xf0,0x90,0x97,0xbd,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xbd,0xe0, +0x04,0xf0,0xe0,0x54,0x03,0xf0,0x61,0xa8,0x90,0x01,0xc6,0xe0,0x44,0x02,0xf0,0x22, +0x90,0x97,0x5a,0x12,0x43,0x8b,0xef,0x12,0x43,0x94,0x55,0x0c,0x01,0x55,0x15,0x02, +0x55,0x1e,0x03,0x55,0x27,0x05,0x55,0x30,0x06,0x55,0x63,0x07,0x55,0x38,0x09,0x55, +0x41,0x0c,0x55,0x4a,0x0d,0x55,0x53,0x0e,0x00,0x00,0x55,0x5c,0x90,0x97,0x5a,0x12, +0x43,0x6b,0x02,0x6a,0xe1,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b,0x0b,0x90,0x97, +0x5a,0x12,0x43,0x6b,0x02,0x6b,0x11,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x69,0xb5, +0x90,0x97,0x5a,0x12,0x43,0x6b,0x80,0x2c,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x6b, +0x59,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x78,0xff,0x90,0x97,0x5a,0x12,0x43,0x6b, +0x02,0x77,0x96,0x90,0x97,0x5a,0x12,0x43,0x6b,0x02,0x76,0x0f,0x90,0x01,0xc6,0xe0, +0x44,0x01,0xf0,0x22,0x90,0x00,0x04,0x12,0x42,0x20,0xff,0x54,0x1f,0xfe,0xef,0x54, +0x20,0xc4,0x13,0x54,0x07,0xfd,0xaf,0x06,0x90,0x97,0x5d,0xef,0xf0,0xa3,0xed,0xf0, +0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03,0x12,0x42,0x20, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x62,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0x54, +0x40,0xc4,0x13,0x13,0x54,0x03,0x90,0x97,0x63,0xf0,0x90,0x97,0x5d,0xe0,0xff,0x75, +0xf0,0x09,0x90,0x93,0x25,0x12,0x43,0x5f,0xad,0x82,0xac,0x83,0x90,0x97,0x64,0xec, +0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x09,0xa4,0x24,0x23,0xf9,0x74,0x93,0x35,0xf0, +0xfa,0x7b,0x01,0xa3,0x12,0x43,0x8b,0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x03, +0x12,0x42,0x20,0x54,0x0f,0xff,0x90,0x97,0x66,0x12,0x43,0x6b,0xef,0x12,0x42,0x4d, +0x90,0x97,0x5f,0x12,0x43,0x6b,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x90,0x97,0x66, +0x12,0x43,0x6b,0x90,0x00,0x01,0xef,0x12,0x42,0x5f,0x90,0x97,0x5f,0x12,0x43,0x6b, +0x90,0x00,0x01,0x12,0x42,0x20,0xff,0x90,0x97,0x64,0xe0,0xfc,0xa3,0xe0,0xfd,0xf5, +0x82,0x8c,0x83,0xef,0xf0,0x12,0x29,0xd9,0x8d,0x82,0x8c,0x83,0xa3,0xf0,0x90,0x97, +0x62,0xe0,0xfe,0x90,0x97,0x5d,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0x90,0x97,0x5e,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x29,0x12, +0x43,0x5f,0xee,0xf0,0x75,0xf0,0x09,0xef,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01, +0xf0,0x90,0x97,0x63,0xe0,0xfe,0x75,0xf0,0x09,0xef,0x90,0x93,0x2b,0x12,0x43,0x5f, +0xee,0xf0,0x8f,0x12,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xaf,0x82, +0xf5,0x14,0x8f,0x15,0xe5,0x12,0x75,0xf0,0x02,0xa4,0x24,0x81,0xf9,0x74,0x92,0x35, +0xf0,0x75,0x16,0x01,0xf5,0x17,0x89,0x18,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x25, +0x12,0x43,0x5f,0xaf,0x82,0x85,0x83,0x19,0x8f,0x1a,0xe5,0x12,0x75,0xf0,0x09,0xa4, +0x24,0x23,0xf9,0x74,0x93,0x35,0xf0,0x75,0x1b,0x01,0xf5,0x1c,0x89,0x1d,0x74,0xc1, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12,0x43,0x94,0x56,0xf2,0x00, +0x57,0x07,0x01,0x57,0x1c,0x02,0x57,0x31,0x03,0x57,0x5b,0x04,0x57,0x70,0x05,0x57, +0x85,0x06,0x57,0xac,0x0c,0x57,0xda,0x0d,0x58,0x07,0x0e,0x58,0x34,0x0f,0x00,0x00, +0x58,0x68,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74, +0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80,0x27,0xe5,0x12,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x05,0x80, +0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0xe4,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x58,0x68,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf5,0x80,0x27, +0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf0,0x80,0x12,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82, +0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x58,0x68,0x90,0x04,0x47,0xe0, +0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x46,0xe0,0xab,0x16,0xaa, +0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x45,0xe0,0x85,0x15,0x82, +0x85,0x14,0x83,0xf0,0x90,0x04,0x44,0x02,0x58,0x5f,0x90,0x04,0x4b,0xe0,0xab,0x16, +0xaa,0x17,0xa9,0x18,0x12,0x42,0x4d,0x90,0x04,0x4a,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x90,0x00,0x01,0x12,0x42,0x5f,0x90,0x04,0x49,0xe0,0x85,0x15,0x82,0x85,0x14, +0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0,0xab,0x16,0xaa,0x17,0xa9, +0x18,0x12,0x42,0x4d,0x90,0x04,0x4e,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00, +0x01,0x12,0x42,0x5f,0x90,0x04,0x4d,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90, +0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x12,0x42, +0x4d,0x90,0x04,0x52,0xe0,0xab,0x16,0xaa,0x17,0xa9,0x18,0x90,0x00,0x01,0x12,0x42, +0x5f,0x90,0x04,0x51,0xe0,0x85,0x15,0x82,0x85,0x14,0x83,0xf0,0x90,0x04,0x50,0xe0, +0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xf0,0xab,0x16,0xaa,0x17,0xa9,0x18,0xc0,0x03, +0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff,0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x12,0x29, +0xd9,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x42,0x4d,0xab,0x16,0xe5,0x18,0x24, +0x01,0xf9,0xe4,0x35,0x17,0xfa,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x29,0xd9,0xff, +0xab,0x1b,0xaa,0x1c,0xa9,0x1d,0x90,0x00,0x01,0x12,0x42,0x20,0x5f,0xd0,0x01,0xd0, +0x02,0xd0,0x03,0x12,0x42,0x4d,0x85,0x15,0x82,0x85,0x14,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x85,0x1a,0x82,0x85,0x19,0x83,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83, +0xf0,0x85,0x15,0x82,0x85,0x14,0x83,0xa3,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x1a, +0x82,0x85,0x19,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x12, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x3b,0x75,0x13,0x0b,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06,0xe5,0x13,0x24,0x10, +0x80,0x5d,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xca,0x80,0x56,0xe5,0x12,0x25, +0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e,0x60, +0x3d,0x75,0x13,0x0f,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x69,0xe5,0x13, +0xf0,0x80,0x10,0x15,0x13,0xe5,0x13,0xc3,0x94,0x00,0x50,0xc8,0x80,0x05,0xe4,0x90, +0x97,0x69,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x3b,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24, +0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x08,0x90,0x97,0x6a,0xe5,0x13,0xf0,0x80,0x5b,0x05,0x13,0xe5,0x13,0xb4,0x10,0xca, +0x80,0x52,0xe5,0x12,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0xfe,0xa3,0xe0,0x4e,0x60,0x39,0xe4,0xf5,0x13,0x74,0x01,0x7e,0x00,0xa8,0x13,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x12,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0xe5,0x13,0x24,0x10,0x80,0x0a,0x05,0x13,0xe5,0x13,0xb4,0x0c,0xcc,0x80,0x05,0xe4, +0x90,0x97,0x6a,0xf0,0x90,0x97,0x69,0xe0,0xff,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93, +0x27,0x12,0x43,0x5f,0xef,0xf0,0x90,0x97,0x6a,0xe0,0xfe,0x75,0xf0,0x09,0xe5,0x12, +0x90,0x93,0x28,0x12,0x43,0x5f,0xee,0xf0,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34, +0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x05,0x90,0x97,0x69,0x51,0xc2,0x74,0x84,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0xff,0x90,0x97,0x6a,0xe0,0xfe,0xef, +0xc3,0x9e,0x50,0x02,0x51,0xc2,0x90,0x97,0x69,0xe0,0xff,0xd3,0x94,0x13,0x40,0x08, +0x90,0x93,0x22,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08,0x90,0x93, +0x22,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93,0x22,0x74, +0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x22,0xf0,0x90,0x93,0x22,0xe0,0x90,0x04,0xb1, +0xf0,0x22,0xe0,0xfd,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xed, +0xf0,0xaf,0x12,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x74,0x84,0x2f,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xed,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xed,0x54,0x1f,0xf5,0x10, +0x74,0x01,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x0f,0x90,0x04,0xfd, +0xe0,0xb4,0x01,0x05,0x75,0x11,0x03,0x80,0x03,0x75,0x11,0x01,0xeb,0xc3,0x95,0x11, +0x40,0x02,0x80,0x2a,0xe5,0x0f,0x25,0x0e,0xfe,0xe5,0x10,0x90,0x41,0xd6,0x93,0xfc, +0xee,0xd3,0x9c,0x74,0x01,0x40,0x0c,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4, +0xf0,0x80,0xa0,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0x22,0xac,0x07, +0x75,0xf0,0x09,0xec,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x74,0xa5,0x2c,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07, +0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74, +0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xec,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x04, +0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xaa,0x07,0xaf,0x05,0x74,0x84,0x2a,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xfb,0x54,0x1f,0xf9,0x90,0x97,0x5e,0xf0, +0x75,0xf0,0x09,0xea,0x90,0x93,0x28,0x12,0x43,0x5f,0xe0,0x90,0x97,0x60,0xf0,0x75, +0xf0,0x09,0xea,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xfe,0x90,0x97,0x61,0xf0,0xea, +0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90, +0x97,0x62,0xcd,0xf0,0xa3,0xed,0xf0,0xea,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x64,0xcd,0xf0,0xa3,0xed,0xf0,0xe9, +0xd3,0x9e,0x40,0x09,0x90,0x97,0x61,0xe0,0x90,0x97,0x5e,0xf0,0xfb,0xef,0x70,0x02, +0x81,0xe4,0x90,0x97,0x5f,0xef,0xf0,0xeb,0x30,0xe6,0x09,0x90,0x97,0x5e,0xe0,0xfb, +0xa3,0xe0,0x14,0xf0,0x90,0x97,0x5f,0xe0,0x70,0x02,0x81,0xe4,0x90,0x97,0x5e,0xe0, +0xff,0xd3,0x94,0x00,0x50,0x02,0x81,0xe4,0xe4,0x90,0x97,0x5d,0xf0,0xef,0x14,0x90, +0x97,0x5c,0xf0,0x90,0x97,0x60,0xe0,0xf9,0x90,0x97,0x5c,0xe0,0xff,0xd3,0x99,0x40, +0x6a,0xef,0x94,0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x64,0xe0,0x5e, +0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x5c,0xe0,0xff,0xc3,0x94,0x10,0x50, +0x32,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x62,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x15,0x90,0x97, +0x5c,0xe0,0xfb,0xa3,0xe0,0x04,0xf0,0x90,0x97,0x5f,0xe0,0xff,0x90,0x97,0x5d,0xe0, +0x6f,0x60,0x08,0x90,0x97,0x5c,0xe0,0x14,0xf0,0x80,0x88,0x90,0x97,0x5f,0xe0,0xff, +0x90,0x97,0x5d,0xe0,0xc3,0x9f,0x50,0x0c,0x90,0x97,0x5c,0xe0,0xb5,0x01,0x05,0x90, +0x97,0x60,0xe0,0xfb,0xeb,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xea,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3, +0xef,0xf0,0xaf,0x02,0xad,0x03,0x51,0xd3,0xaf,0x03,0x22,0xad,0x07,0x74,0x84,0x2d, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0xf5,0x1d,0x54,0x1f,0xfc,0x75, +0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f,0xe0,0xff,0x90,0x97,0x5c,0xf0,0xed, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90, +0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xed,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5f,0xcb,0xf0,0xa3,0xeb,0xf0,0xec, +0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfa,0x74,0x01, +0x93,0xfb,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xea,0xf0, +0xa3,0xeb,0xf0,0xec,0xc3,0x9f,0x40,0x02,0xc1,0x2d,0x74,0xa5,0x2d,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xec,0xf0,0x04,0xfb,0x90,0x97,0x5c,0xe0,0xff,0xeb,0xd3,0x9f, +0x40,0x02,0xc1,0x5e,0xeb,0xc3,0x94,0x10,0x40,0x21,0xeb,0x24,0xf0,0xff,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x23,0xeb,0xc3,0x94,0x10,0x50, +0x39,0x74,0x01,0x7e,0x00,0xa8,0x03,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0x90,0x97,0x5f,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1c,0xeb,0x64, +0x13,0x60,0x08,0xeb,0x64,0x12,0x60,0x03,0xbb,0x11,0x09,0x90,0x97,0x5d,0xe0,0x30, +0xe0,0x02,0x7b,0x18,0xac,0x03,0x8c,0x1d,0x80,0x34,0x0b,0x80,0x8b,0x90,0x97,0x5c, +0xe0,0xfb,0x6c,0x70,0x69,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xec, +0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0xe0,0xb4,0x01,0x0c,0xe5, +0x1d,0x20,0xe6,0x07,0xec,0x44,0x40,0xf5,0x1d,0x80,0x03,0xaf,0x1d,0x22,0xec,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xec,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x80,0x5b,0xec,0xd3, +0x9b,0x40,0x56,0x90,0x97,0x5c,0xe0,0xff,0x74,0xa5,0x2d,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xef,0xf0,0xac,0x07,0x8f,0x1d,0xec,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xec,0x25,0xe0,0x24,0x66, +0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3, +0x13,0xfe,0xef,0x13,0xff,0xed,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xee,0xf0,0xa3,0xef,0xf0,0xaf,0x1d,0x22,0x74,0x01,0x2d,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xe4,0xf0,0xaf,0x05,0xe5,0x1d,0x44,0x80,0xfd,0x51,0xd3,0xe5,0x1d, +0x44,0x80,0xff,0x22,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0, +0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0, +0x07,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0x53,0x91,0xef,0x90,0x00, +0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5,0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74, +0x40,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x0b,0x90,0x97,0x38,0xe0, +0x60,0x05,0x7f,0x01,0x12,0x76,0xe7,0xe5,0x3d,0x30,0xe7,0x15,0x90,0x00,0x55,0x74, +0x80,0xf0,0x90,0x97,0x3b,0xe0,0x54,0x03,0xff,0xbf,0x03,0x05,0x7f,0x02,0x12,0x76, +0xe7,0x90,0x01,0xc4,0x74,0x14,0xf0,0x74,0x5f,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0, +0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0, +0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x8f,0x21,0x8c, +0x22,0x8d,0x23,0x22,0xe4,0xf5,0x26,0x90,0x97,0x98,0xf0,0xf5,0x27,0x90,0x97,0x95, +0x74,0x0c,0xf0,0x90,0x97,0x93,0xf0,0xe4,0x90,0x97,0x96,0xf0,0x90,0x97,0x92,0xf0, +0x90,0x97,0x91,0xf0,0x90,0x97,0x94,0x04,0xf0,0x90,0x97,0x89,0xf0,0xe4,0x90,0x97, +0x97,0xf0,0x90,0x97,0x8b,0xf0,0x90,0x97,0x90,0x74,0x07,0xf0,0xe4,0x90,0x97,0x8a, +0xf0,0x90,0x97,0x8e,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97, +0x88,0xf0,0x22,0xe5,0x57,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x01,0xf0,0x80,0x5b, +0x90,0x97,0x95,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x40,0x09,0x90,0x01,0xba,0xe0,0x44, +0x02,0xf0,0x80,0x47,0x90,0x02,0x87,0xe0,0x60,0x09,0x90,0x01,0xba,0xe0,0x44,0x04, +0xf0,0x80,0x38,0x90,0x97,0x84,0xe0,0xb4,0x02,0x10,0x90,0x97,0x6b,0xe0,0xfe,0xa3, +0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x11,0x80,0x21,0x90,0x01,0xaf,0xe0,0x60,0x09, +0x90,0x01,0xba,0xe0,0x44,0x08,0xf0,0x80,0x12,0x90,0x97,0x8d,0xe0,0x70,0x09,0x90, +0x01,0xba,0xe0,0x44,0x10,0xf0,0x80,0x03,0x7f,0x01,0x22,0x90,0x01,0xbb,0xe0,0x44, +0x02,0xf0,0x7f,0x00,0x22,0x8f,0x6c,0xe4,0x90,0x97,0xb7,0xf0,0xa3,0xf0,0x90,0x01, +0x09,0xe0,0x7f,0x00,0x30,0xe7,0x02,0x7f,0x01,0xef,0x65,0x6c,0x60,0x3e,0xc3,0x90, +0x97,0xb8,0xe0,0x94,0x88,0x90,0x97,0xb7,0xe0,0x94,0x13,0x40,0x08,0x90,0x01,0xc6, +0xe0,0x44,0x80,0xf0,0x22,0x90,0x97,0xb7,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x7f, +0x14,0x7e,0x00,0x12,0x37,0x54,0xd3,0x90,0x97,0xb8,0xe0,0x94,0x32,0x90,0x97,0xb7, +0xe0,0x94,0x00,0x40,0xb9,0x90,0x01,0xc7,0xe0,0x30,0xe0,0xb2,0x22,0x8f,0x6e,0x12, +0x45,0xb1,0xef,0x64,0x01,0x70,0x2e,0x90,0x97,0x81,0x12,0x47,0xf9,0xe5,0x6e,0x60, +0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x44,0x10,0xf0,0x80, +0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe0,0x54,0xef,0xf0,0x90, +0x04,0x1f,0x74,0x20,0xf0,0x22,0xe4,0x90,0x97,0x4d,0xf0,0xe5,0x27,0x60,0x6e,0xe5, +0x26,0x64,0x01,0x70,0x68,0xe5,0x27,0x14,0x60,0x29,0x24,0xfd,0x60,0x25,0x24,0x02, +0x24,0xfb,0x50,0x02,0x80,0x23,0x90,0x97,0x89,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3, +0xe0,0x60,0x16,0x90,0x97,0x89,0xe0,0x70,0x0a,0x90,0x97,0x94,0xe0,0x90,0x97,0x89, +0xf0,0x80,0x00,0x90,0x97,0x4d,0x74,0x01,0xf0,0x90,0x97,0x4d,0xe0,0x60,0x2e,0x90, +0x97,0x98,0xe0,0x44,0x10,0xf0,0xe4,0x90,0x97,0x9d,0xf0,0x90,0x97,0x90,0xe0,0x90, +0x97,0x9e,0x12,0x44,0x68,0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x93,0xe0,0x54, +0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x48,0xdf,0x22,0x90,0x97, +0x97,0xe0,0x60,0x0e,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x07,0x70,0x28, +0x80,0x23,0x90,0x97,0x8a,0xe0,0x04,0xf0,0x90,0x97,0x98,0xe0,0x54,0xef,0xf0,0x90, +0x97,0x8a,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x26,0xb4,0x01,0x0b,0xa3,0xe0,0x70, +0x07,0xe0,0x04,0xf0,0x22,0x12,0x44,0xde,0x22,0xef,0xc3,0x94,0x20,0x50,0x39,0xef, +0x30,0xe0,0x17,0xed,0xc4,0x54,0xf0,0xfd,0xef,0xc3,0x13,0xfe,0x24,0xa4,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x10,0xef,0xc3,0x13,0xfe,0x24,0xa4, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0xa4,0x2e,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x4d,0xf0,0x22,0xe4,0xf5,0x12,0x75,0xf0,0x09,0xe5, +0x12,0x90,0x93,0x2a,0x12,0x43,0x5f,0xe0,0x64,0x01,0x60,0x02,0xe1,0xf5,0xe5,0x12, +0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xd3, +0x94,0x00,0xee,0x94,0x00,0x50,0x02,0xe1,0xf5,0xe5,0x12,0x75,0xf0,0x0a,0xa4,0x24, +0x00,0xf9,0x74,0x90,0x35,0xf0,0x75,0x17,0x01,0xf5,0x18,0x89,0x19,0xe5,0x12,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97, +0x56,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34, +0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x58,0xcf,0xf0,0xa3,0xef,0xf0,0x74, +0x84,0x25,0x12,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x52, +0xf0,0xe0,0xfe,0x54,0x1f,0xa3,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x27,0x12, +0x43,0x5f,0xe0,0x90,0x97,0x5b,0xf0,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96, +0xf5,0x83,0xe0,0xc3,0x94,0x05,0x40,0x02,0x81,0xcf,0x90,0x97,0x5b,0xe0,0xff,0x90, +0x97,0x53,0xe0,0x9f,0x40,0x13,0x90,0x97,0x5b,0xe0,0x90,0x97,0x53,0xf0,0xee,0x54, +0x40,0xfe,0x90,0x97,0x52,0xf0,0xef,0x4e,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70, +0x29,0x90,0x97,0x53,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80, +0x30,0x90,0x97,0x53,0xe0,0x90,0x40,0xf6,0x80,0x27,0x90,0x97,0x53,0xe0,0xff,0x90, +0x41,0x4a,0x93,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x07,0x90,0x97,0x53,0xe0,0x90,0x41, +0x2e,0x93,0x90,0x97,0x5a,0xf0,0x90,0x97,0x5a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x14,0xff,0xf5,0x15,0x89,0x16,0x90,0x97,0x52,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x59,0xe0,0x9f,0x90,0x97,0x58,0xe0,0x94, +0x00,0x40,0x09,0xe4,0xfd,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x8c,0xe5,0x12,0x25,0xe0, +0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xf5,0x1a,0xa3,0xe0,0xf5,0x1b, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x12,0x29,0xd9,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18, +0xa9,0x19,0x12,0x42,0x97,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b, +0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x01,0x12,0x42, +0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x02,0x12,0x42,0xc2, +0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a, +0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x02,0x12,0x42,0x20,0xff,0x7e,0x00,0xab, +0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x04,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29, +0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9, +0x16,0x90,0x00,0x03,0x12,0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19, +0x90,0x00,0x06,0x12,0x42,0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5, +0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x04,0x12, +0x42,0x20,0xff,0x7e,0x00,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00,0x08,0x12,0x42, +0xc2,0xfd,0xac,0xf0,0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5, +0x1a,0xab,0x14,0xaa,0x15,0xa9,0x16,0x90,0x00,0x05,0x12,0x42,0x20,0xff,0x7e,0x00, +0x90,0x97,0x56,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0xd3,0xe5,0x1b,0x9f,0xe5, +0x1a,0x9e,0x40,0x0c,0xe5,0x1b,0x9f,0xf5,0x1b,0xe5,0x1a,0x9e,0xf5,0x1a,0x80,0x05, +0xe4,0xf5,0x1a,0xf5,0x1b,0xe5,0x12,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe5,0x1a,0xf0,0xa3,0xe5,0x1b,0xf0,0x90,0x97,0x52,0xe0,0xf9,0x25,0xe0, +0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xc3,0x74,0x01,0x93,0x95,0x1b,0xe4, +0x93,0x95,0x1a,0x50,0x07,0xaf,0x12,0x12,0x5d,0x2b,0xe1,0x60,0xe9,0x25,0xe0,0x24, +0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xd3,0x74,0x01,0x93,0x95,0x1b,0xe4,0x93, +0x95,0x1a,0x50,0x02,0xe1,0x60,0x7d,0x01,0xaf,0x12,0x12,0x5b,0xa7,0xe1,0x60,0x74, +0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xfc,0x64,0x05,0x60,0x02, +0xc1,0x6a,0x90,0x93,0x22,0xe0,0xff,0xb4,0x03,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x19,0x40,0x3d,0x80,0x2e,0xef,0xb4,0x02,0x0b,0x90,0x97,0x53,0xe0,0xc3,0x94,0x11, +0x40,0x2e,0x80,0x1f,0x90,0x93,0x22,0xe0,0xff,0xb4,0x01,0x0b,0x90,0x97,0x53,0xe0, +0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xef,0x70,0x11,0x90,0x97,0x53,0xe0,0xc3,0x94, +0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43,0xf0, +0x74,0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0x74,0x23, +0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30,0x50,0x02, +0xc1,0x17,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x02,0xc1,0x17,0x74,0x44,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a,0x60,0x51,0xef,0x24,0x05,0xff, +0xe4,0x33,0xfe,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd, +0xd3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x32,0xed,0x24,0x05,0xff,0xe4, +0x33,0xfe,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9f, +0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x50,0x14,0x74,0x84,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0xff,0x90,0x97,0x53,0xe0,0x6f,0x60,0x3d,0x74,0x23,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x42,0x40,0x05,0x75, +0x1c,0x05,0x80,0x0e,0xef,0xd3,0x94,0x39,0x40,0x05,0x75,0x1c,0x03,0x80,0x03,0x75, +0x1c,0x01,0x74,0x21,0x25,0x12,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xef,0xf0,0x74, +0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0x80,0x29,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0xe0,0x04,0xf0,0x80,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82, +0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x53,0xe0,0xff,0x74,0x84,0x25,0x12, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x43,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0x75,0xf0,0x09,0xe5,0x12,0x90,0x93,0x2b,0x12, +0x43,0x5f,0xe0,0xb4,0x01,0x10,0xe4,0xf5,0x1c,0x74,0x64,0x25,0x12,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe4,0xf0,0xad,0x1c,0xe1,0x5c,0xec,0x64,0x06,0x60,0x02,0xe1, +0x60,0xf5,0x1a,0xf5,0x1b,0x90,0x42,0x13,0x93,0xff,0x7e,0x00,0x90,0x97,0x56,0xe0, +0xfc,0xa3,0xe0,0xfd,0x12,0x29,0xf2,0x90,0x97,0x54,0xee,0xf0,0xa3,0xef,0xf0,0x74, +0x43,0x25,0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe0,0xf5,0x1c,0xe4,0xf5,0x13, +0xab,0x17,0xaa,0x18,0xa9,0x19,0x75,0xf0,0x02,0xe5,0x13,0xa4,0xf5,0x82,0x85,0xf0, +0x83,0x12,0x42,0xc2,0xfd,0xac,0xf0,0xe5,0x13,0x90,0x42,0x0e,0x93,0xff,0x7e,0x00, +0x12,0x29,0xf2,0xef,0x25,0x1b,0xf5,0x1b,0xee,0x35,0x1a,0xf5,0x1a,0xc3,0x90,0x97, +0x55,0xe0,0x95,0x1b,0x90,0x97,0x54,0xe0,0x95,0x1a,0x40,0x07,0x05,0x13,0xe5,0x13, +0xb4,0x05,0xbd,0xe5,0x13,0xc3,0x13,0xf5,0x13,0xe5,0x1c,0xb4,0x01,0x06,0xe5,0x13, +0x70,0x46,0x80,0x13,0xe5,0x1c,0xb4,0x03,0x15,0xe5,0x13,0x70,0x05,0x75,0x1c,0x03, +0x80,0x39,0xe5,0x13,0xb4,0x01,0x05,0x75,0x1c,0x01,0x80,0x2f,0x80,0x2a,0xe5,0x1c, +0xb4,0x05,0x28,0xe5,0x13,0x70,0x05,0x75,0x1c,0x05,0x80,0x0d,0xe5,0x13,0xb4,0x01, +0x05,0x75,0x1c,0x03,0x80,0x03,0x75,0x1c,0x01,0xd3,0x90,0x97,0x59,0xe0,0x94,0x03, +0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0xd3,0x90,0x97,0x59,0xe0, +0x94,0x03,0x90,0x97,0x58,0xe0,0x94,0x00,0x40,0x03,0xe4,0xf5,0x1c,0x74,0x43,0x25, +0x12,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe5,0x1c,0xf0,0xfd,0xaf,0x12,0x31,0xb9, +0x74,0x64,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05,0x74, +0x64,0x50,0x0e,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0b,0x25,0x12,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0xab,0x17,0xaa,0x18, +0xa9,0x19,0xe4,0xf5,0xf0,0x12,0x42,0xfa,0xab,0x17,0xaa,0x18,0xa9,0x19,0x90,0x00, +0x02,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x43,0x19, +0x90,0x00,0x06,0xe4,0xf5,0xf0,0x12,0x43,0x19,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12, +0x43,0x19,0xe5,0x12,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4, +0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0xe5,0x12,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5, +0x83,0xe4,0xf0,0xa3,0xf0,0x05,0x12,0xe5,0x12,0xc3,0x94,0x20,0x50,0x03,0x02,0x61, +0xfc,0x22,0x90,0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0, +0xa3,0xe4,0xf0,0xfd,0x74,0xa4,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0, +0x0d,0xbd,0x10,0xf0,0xe4,0xfd,0x75,0xf0,0x0a,0xed,0x90,0x90,0x00,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x02,0x12,0x43,0x5f,0xe4,0xf0, +0xa3,0xf0,0x75,0xf0,0x0a,0xed,0x90,0x90,0x04,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0, +0x75,0xf0,0x0a,0xed,0x90,0x90,0x06,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xed,0x90,0x90,0x08,0x12,0x43,0x5f,0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2d,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13,0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe4,0xf0,0x74,0x43,0x2d,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4, +0xf0,0xed,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xed,0x25,0xe0,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x74,0x44,0x2d,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2d, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2d,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41, +0x8c,0x74,0x01,0x93,0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xed, +0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0, +0x75,0xf0,0x09,0xed,0x90,0x93,0x2a,0x12,0x43,0x5f,0x74,0x01,0xf0,0x75,0xf0,0x09, +0xed,0x90,0x93,0x29,0x12,0x43,0x5f,0x74,0x01,0xf0,0x74,0xc1,0x2d,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x25,0x12,0x43, +0x5f,0x74,0xff,0xf0,0xa3,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x23,0x12,0x43,0x5f, +0xe4,0xf0,0xa3,0x74,0x0f,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x27,0x12,0x43,0x5f, +0x74,0x13,0xf0,0x75,0xf0,0x09,0xed,0x90,0x93,0x28,0x12,0x43,0x5f,0xe4,0xf0,0x74, +0x84,0x2d,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0x74,0x13,0xf0,0x0d,0xed,0x64,0x20, +0x60,0x02,0x01,0x26,0x22,0x12,0x29,0xd9,0xf5,0x12,0xc3,0x94,0x20,0x50,0x15,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0x74,0x23,0x25,0x12,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xef,0xf0,0x22,0xe5,0x12,0xb4,0x20,0x0a,0x90,0x00,0x02,0x12,0x42,0x20,0x90, +0x93,0x21,0xf0,0x22,0x90,0x97,0x4d,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x7b,0x00,0x7a,0x00,0x79,0x58,0x90,0x97,0xa8,0x12,0x43,0x8b,0x0b,0x7a, +0x97,0x79,0x4d,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0xa5,0x12,0x43,0x8b, +0x90,0x97,0x84,0xe0,0x64,0x02,0x60,0x6e,0x90,0x97,0x84,0xe0,0x64,0x01,0x70,0x66, +0x90,0x97,0xbf,0xe0,0xff,0x04,0xf0,0x90,0x97,0xa5,0x12,0x43,0x6b,0x90,0x00,0x01, +0xef,0x12,0x42,0x5f,0x7f,0xaf,0x7e,0x01,0x51,0x8b,0xef,0x60,0x49,0x90,0x97,0xa5, +0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89,0x65,0x75,0x66,0x02,0x7b,0x01,0x7a,0x01, +0x79,0xa0,0x12,0x45,0x09,0x90,0x97,0xa8,0x12,0x43,0x6b,0x8b,0x63,0x8a,0x64,0x89, +0x65,0x90,0x97,0xa5,0x12,0x43,0x6b,0x12,0x29,0xd9,0xff,0xc4,0x54,0x0f,0xf5,0x66, +0x7b,0x01,0x7a,0x01,0x79,0xa2,0x12,0x45,0x09,0x90,0x01,0xaf,0x74,0xff,0xf0,0x90, +0x01,0xcb,0xe0,0x64,0x80,0xf0,0xd0,0xd0,0x92,0xaf,0x22,0xd3,0x10,0xaf,0x01,0xc3, +0xc0,0xd0,0x90,0x97,0xaf,0xee,0xf0,0xa3,0xef,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0xaf,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x2d,0xc3,0x90,0x97, +0xb2,0xe0,0x94,0xe8,0x90,0x97,0xb1,0xe0,0x94,0x03,0x40,0x0b,0x90,0x01,0xc6,0xe0, +0x44,0x10,0xf0,0x7f,0x00,0x80,0x15,0x90,0x97,0xb1,0xe4,0x75,0xf0,0x01,0x12,0x42, +0x81,0x7f,0x0a,0x7e,0x00,0x12,0x37,0x54,0x80,0xc5,0x7f,0x01,0xd0,0xd0,0x92,0xaf, +0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x00,0x01,0x12,0x42,0x20,0x90,0x97, +0x96,0xf0,0x90,0x00,0x03,0x12,0x42,0x20,0x90,0x97,0x88,0xf0,0x12,0x29,0xd9,0x65, +0x27,0x60,0x03,0x12,0x4a,0x6e,0xd0,0xd0,0x92,0xaf,0x22,0x12,0x29,0xd9,0xf5,0x26, +0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x29,0xd9,0xfe,0xaf,0x05,0xed,0x2e,0x90,0x97, +0x7e,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x7f,0xf0,0x90, +0x00,0x02,0x12,0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x80,0xf0,0x90,0x00,0x03,0x12, +0x42,0x20,0xff,0xed,0x2f,0x90,0x97,0x81,0xf0,0x90,0x00,0x04,0x12,0x42,0x20,0xff, +0xae,0x05,0xed,0x2f,0x90,0x97,0x82,0xf0,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0, +0x90,0x97,0x5d,0x12,0x43,0x8b,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12, +0x42,0xc2,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a,0xfe,0x90,0x97,0x5d,0x12,0x43, +0x6b,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x43,0x19,0x12,0x29,0xd9,0xff,0x60,0x2c, +0xb5,0x67,0x16,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90,0x00,0x01,0x12,0x42,0xc2,0x65, +0x69,0x70,0x04,0xe5,0x68,0x65,0xf0,0x60,0x23,0x90,0x97,0x5d,0x12,0x43,0x6b,0x90, +0x00,0x01,0x12,0x42,0xc2,0xff,0xae,0xf0,0x71,0xd1,0x80,0x10,0x90,0x97,0x5d,0x12, +0x43,0x6b,0x12,0x29,0xd9,0x65,0x67,0x60,0x03,0x12,0x44,0xd5,0xd0,0xd0,0x92,0xaf, +0x22,0x90,0x97,0x60,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x67,0x01,0x8e,0x68,0xf5,0x69, +0xe4,0xfd,0x7f,0x0b,0x91,0x14,0xe4,0xfd,0x7f,0x02,0x91,0x14,0x91,0xde,0xe4,0xff, +0x12,0x47,0xdd,0xe4,0xf5,0x6b,0x90,0x01,0xc9,0xe5,0x6b,0xf0,0x90,0x97,0x60,0xe0, +0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x44,0xe4,0xf5,0x45,0x7d,0x01,0x7f,0x60,0x7e, +0x01,0x02,0x35,0xab,0xd3,0x10,0xaf,0x01,0xc3,0xc0,0xd0,0x90,0x97,0x63,0xed,0xf0, +0x90,0x97,0x62,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4f,0xa3,0xe0,0x70,0x1a,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x47,0xe0,0x5f,0xf0,0x80,0x17,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x47,0xe0,0x4f,0xf0,0x12, +0x4f,0xe5,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x5a,0x90,0x97,0x62,0xe0,0x24,0xf8,0xf0, +0xa3,0xe0,0x70,0x1d,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02, +0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x80, +0x1a,0x90,0x97,0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97, +0x62,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff, +0x90,0x00,0x43,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x7f,0x0b, +0x91,0xfa,0xef,0x65,0x6a,0x60,0x10,0xe5,0x6a,0xb4,0x01,0x05,0xe4,0xf5,0x6a,0x80, +0x03,0x75,0x6a,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0xd3,0x10,0xaf,0x01,0xc3,0xc0, +0xd0,0x90,0x97,0xc1,0xef,0xf0,0xd3,0x94,0x07,0x50,0x47,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0, +0x12,0x4f,0xe5,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05,0x08,0x80, +0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb,0xe4,0xfe, +0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8,0xf8,0xff, +0x80,0x44,0x90,0x97,0xc1,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0x12,0x4f,0xdd,0x90,0x97,0xc1,0xe0,0xfd,0x74,0x01, +0x7e,0x00,0xa8,0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x00,0x42,0xe0,0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7, +0x13,0xce,0x13,0xd8,0xf8,0xff,0xd0,0xd0,0x92,0xaf,0x22,0x90,0x06,0x34,0x74,0xff, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x8e,0x12,0x8f,0x13,0x8b,0x14,0x8a, +0x15,0x89,0x16,0xe4,0x90,0x97,0x52,0xf0,0xef,0x90,0x00,0x31,0xf0,0x12,0x4f,0xe5, +0xe5,0x12,0x54,0x03,0xff,0x90,0x00,0x32,0xe0,0x54,0xfc,0x4f,0xf0,0x12,0x4f,0xe5, +0x90,0x00,0x33,0xe0,0x54,0x7f,0xf0,0x12,0x4f,0xe5,0x90,0x00,0x33,0xe0,0x20,0xe7, +0x0e,0x90,0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0,0x04,0xf0,0x80,0xeb,0x90, +0x97,0x52,0xe0,0xc3,0x94,0x64,0x50,0x10,0x90,0x00,0x30,0xe0,0xab,0x14,0xaa,0x15, +0xa9,0x16,0x12,0x42,0x4d,0x7f,0x01,0x22,0x7f,0x00,0x22,0xe4,0xf5,0x6a,0x22,0xe4, +0x90,0x97,0xb9,0xf0,0xa3,0xf0,0x90,0x05,0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b, +0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03,0x7f,0x01,0x22,0xd3,0x90,0x97,0xba,0xe0, +0x94,0xe8,0x90,0x97,0xb9,0xe0,0x94,0x03,0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e, +0x00,0x12,0x37,0x54,0x90,0x97,0xb9,0xe4,0x75,0xf0,0x01,0x12,0x42,0x81,0x80,0xc6, +0x90,0x97,0x1d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x08, +0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x90,0x97,0x25,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x29,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12, +0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0, +0xb4,0x01,0x11,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x03,0x2d,0x95,0xe4,0xfd,0x7f, +0x01,0x12,0x34,0x81,0x22,0x7f,0x78,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x1d,0x12, +0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0x21,0x12,0x2a,0x7f,0x7f, +0x00,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0x25,0x12,0x2a,0x7f,0x90,0x97,0x86,0xe0, +0x90,0x97,0x1d,0xb4,0x01,0x0d,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xed,0x54,0xc7, +0xfd,0x80,0x07,0x12,0x43,0x53,0xef,0x54,0xc7,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x78,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x21,0x12,0x43,0x53,0xef,0x54, +0x0f,0xff,0xec,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, +0x90,0x97,0x25,0x12,0x43,0x53,0xef,0x44,0x02,0xff,0xec,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x00,0x7e,0x08,0x12,0x2f,0xd9,0x7f,0x70,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x97,0x29,0x12,0x2a,0x7f,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25,0xa0,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x59,0x12,0x2a,0x8b,0x00,0x00,0x00,0x00, +0xe4,0xfd,0xff,0x12,0x34,0x81,0x90,0x97,0x86,0xe0,0xb4,0x01,0x11,0x90,0x80,0x59, +0x12,0x2a,0x8b,0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x34,0x81,0x22,0x90, +0x97,0x86,0xe0,0x90,0x97,0x2d,0xf0,0x22,0xef,0x70,0x03,0x02,0x71,0x50,0x90,0x97, +0x2d,0xe0,0x60,0x03,0x02,0x75,0x1b,0x90,0x97,0x19,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc5,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x96,0xc9, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9, +0x90,0x96,0xcd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x6c,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x96,0xd1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd5,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xd9,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xdd,0x12, +0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x96,0xe1,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x96,0xe5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x84, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xe9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a, +0x7f,0x7f,0x88,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xed,0x12,0x43,0x53,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96,0xf1,0x12,0x43, +0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x96, +0xf5,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x96,0xf9,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xd8,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x96,0xfd,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f, +0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x01,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x05,0x12,0x43,0x53, +0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x97,0x09, +0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9, +0x90,0x97,0x0d,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d, +0x12,0x2f,0xd9,0x90,0x97,0x11,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x90,0x97,0x15,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x2d,0x74,0x01,0xf0,0x22, +0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x02,0xa1,0x1b,0x7f,0x8c,0x7e,0x08,0x12,0x27, +0xde,0x90,0x97,0x19,0x12,0x2a,0x7f,0x7f,0x44,0x7e,0x08,0x12,0x27,0xde,0x90,0x96, +0xc5,0x12,0x2a,0x7f,0x7f,0x5c,0x7e,0x08,0x12,0x27,0xde,0x90,0x96,0xc9,0x12,0x2a, +0x7f,0x7f,0x6c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xcd,0x12,0x2a,0x7f,0x7f,0x70, +0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xd1,0x12,0x2a,0x7f,0x7f,0x74,0x7e,0x0e,0x12, +0x27,0xde,0x90,0x96,0xd5,0x12,0x2a,0x7f,0x7f,0x78,0x7e,0x0e,0x12,0x27,0xde,0x90, +0x96,0xd9,0x12,0x2a,0x7f,0x7f,0x7c,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xdd,0x12, +0x2a,0x7f,0x7f,0x80,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe1,0x12,0x2a,0x7f,0x7f, +0x84,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xe5,0x12,0x2a,0x7f,0x7f,0x88,0x7e,0x0e, +0x12,0x27,0xde,0x90,0x96,0xe9,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x0e,0x12,0x27,0xde, +0x90,0x96,0xed,0x12,0x2a,0x7f,0x7f,0xd0,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf1, +0x12,0x2a,0x7f,0x7f,0xd4,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf5,0x12,0x2a,0x7f, +0x7f,0xd8,0x7e,0x0e,0x12,0x27,0xde,0x90,0x96,0xf9,0x12,0x2a,0x7f,0x7f,0xdc,0x7e, +0x0e,0x12,0x27,0xde,0x90,0x96,0xfd,0x12,0x2a,0x7f,0x7f,0xe0,0x7e,0x0e,0x12,0x27, +0xde,0x90,0x97,0x01,0x12,0x2a,0x7f,0x7f,0xec,0x7e,0x0e,0x12,0x27,0xde,0x90,0x97, +0x05,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x27,0xde,0x90,0x97,0x09,0x12,0x2a, +0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x27,0xde,0x90,0x97,0x0d,0x12,0x2a,0x7f,0x7f,0x0c, +0x7e,0x09,0x12,0x27,0xde,0x90,0x97,0x11,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x08,0x12, +0x27,0xde,0x90,0x97,0x15,0x12,0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x27,0xde,0x90, +0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed,0x44,0xc0,0xfd,0xec, +0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12, +0x2a,0x7f,0x7f,0x8c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00, +0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b, +0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a, +0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12, +0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85, +0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80, +0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e,0x12,0x2f,0xd9,0x90, +0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e,0x0e,0x12,0x2f,0xd9, +0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x80,0x7e,0x0e,0x12,0x2f, +0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x63,0xdb,0x25,0xa4,0x7f,0x84,0x7e,0x0e,0x12, +0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x04,0x1b,0x25,0xa4,0x7f,0x88,0x7e,0x0e, +0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0x8c,0x7e, +0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f,0xd0, +0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4,0x7f, +0xd4,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x20,0xdb,0x25,0xa4, +0x7f,0xd8,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b,0x25, +0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x00,0x1b, +0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x2f,0xd9,0x90,0x80,0x85,0x12,0x2a,0x8b,0x24, +0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0c,0x12,0x27, +0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xe4,0xff,0xec, +0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x11,0xff, +0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85, +0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0c,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x0d,0x12,0x27, +0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0, +0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44, +0x01,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x04,0x7e,0x0d,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09, +0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xe4, +0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44, +0x11,0xff,0xec,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90, +0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e,0x09,0x12,0x2f,0xd9,0x7f,0x0c,0x7e,0x09, +0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xed, +0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xb3,0x12,0x2a,0x7f,0x90,0x97,0xb3, +0x12,0x43,0x53,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97,0xb3,0x12,0x2a, +0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x0c,0x7e, +0x09,0x12,0x2f,0xd9,0x7f,0x04,0x7e,0x08,0x12,0x27,0xde,0x90,0x97,0xb3,0x12,0x2a, +0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x54,0xf0,0xff,0xec,0x90,0x97,0xb3,0x12, +0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0xef,0x44,0x01,0xff,0xec,0x90,0x97,0xb3, +0x12,0x2a,0x7f,0x90,0x97,0xb3,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f, +0x04,0x7e,0x08,0x12,0x2f,0xd9,0xe4,0x90,0x97,0x2d,0xf0,0x22,0xd3,0x10,0xaf,0x01, +0xc3,0xc0,0xd0,0x90,0x97,0xbc,0xed,0xf0,0x90,0x97,0xbb,0xef,0xf0,0xd3,0x94,0x07, +0x50,0x65,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4, +0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbb,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f, +0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60,0x16,0x90,0x97,0xbb,0xe0,0xff,0x74, +0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80,0x68, +0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xf4,0xff,0x90,0x00,0x45,0x80,0x6d,0x90,0x97,0xbb,0xe0,0x24,0xf8,0xf0,0xe0,0xff, +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0x12,0x4f, +0xdd,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xff,0x90,0x00,0x43,0xe0,0x4f,0xf0,0x12,0x4f,0xe5,0x90,0x97,0xbc,0xe0,0x60, +0x1b,0x90,0x97,0xbb,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xbb,0xe0, +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4, +0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x12,0x4f,0xe5,0xd0,0xd0,0x92,0xaf,0x22,0x8b, +0x12,0x8a,0x13,0x89,0x14,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3b,0xf0,0xe0, +0x30,0xe0,0x4b,0x90,0x97,0x32,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde, +0x90,0x97,0x34,0x12,0x2a,0x7f,0xab,0x12,0xaa,0x13,0xa9,0x14,0x90,0x00,0x01,0x12, +0x42,0x20,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x2a,0x6c,0xa8,0x04,0xa9,0x05, +0xaa,0x06,0xab,0x07,0x90,0x97,0x34,0x12,0x43,0x53,0xec,0x54,0x03,0xfc,0x12,0x43, +0x46,0x90,0x97,0x3e,0x12,0x2a,0x7f,0x90,0x05,0x22,0xe4,0xf0,0x80,0x2d,0xe4,0x90, +0x97,0x32,0xf0,0x7f,0x80,0x7e,0x08,0x12,0x27,0xde,0xec,0x54,0x03,0xfc,0xec,0x44, +0xc0,0xfc,0x90,0x97,0x34,0x12,0x2a,0x7f,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80, +0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f,0xd9,0x90,0x97,0x3b,0xe0,0x30, +0xe1,0x1b,0x7d,0x0c,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0,0x44,0x0c,0xfd, +0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0x80,0x1e,0x90,0x00,0x47, +0xe0,0x54,0xf3,0xfd,0x7f,0x47,0x12,0x47,0x52,0x90,0x00,0x48,0xe0,0x54,0xf3,0xfd, +0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x54,0xef,0xfd,0x7f,0x46,0x12,0x47, +0x52,0xe4,0x90,0x97,0x38,0xf0,0x22,0xef,0x14,0x60,0x32,0x14,0x60,0x6a,0x24,0x02, +0x60,0x02,0xe1,0x95,0x90,0x97,0x38,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0,0x44,0x0c, +0xfd,0x7f,0x48,0x12,0x47,0x52,0x90,0x00,0x47,0xe0,0x44,0x08,0xfd,0x7f,0x47,0x12, +0x47,0x52,0x90,0x00,0x45,0xe0,0x44,0x10,0xfd,0x7f,0x45,0x80,0x75,0xe4,0x90,0x97, +0x38,0xf0,0x90,0x97,0x34,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80, +0x7e,0x08,0x12,0x2f,0xd9,0x90,0x00,0x45,0xe0,0x44,0xef,0xfd,0x7f,0x45,0x12,0x47, +0x52,0x90,0x00,0x45,0xe0,0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46, +0xe0,0x44,0x10,0xfd,0x7f,0x46,0x80,0x3a,0x90,0x97,0x38,0x74,0x01,0xf0,0x90,0x97, +0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e,0x08,0x12,0x2f, +0xd9,0x90,0x00,0x45,0xe0,0x44,0x20,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x45, +0xe0,0x44,0x10,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x00,0x46,0xe0,0x44,0x10,0xfd, +0x7f,0x46,0x12,0x47,0x52,0x22,0x90,0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3c,0xf0, +0xe0,0x60,0x04,0xe0,0xf4,0x70,0x21,0xa2,0xaf,0xe4,0x33,0xf5,0x12,0xc2,0xaf,0x90, +0x00,0x47,0xe0,0x54,0xfb,0xfd,0x7f,0x47,0x12,0x47,0x52,0x7d,0x40,0x7f,0x01,0x12, +0x36,0xaf,0xe5,0x12,0x24,0xff,0x92,0xaf,0x22,0xe4,0xfd,0x7f,0x45,0x12,0x47,0x52, +0x90,0x04,0xfd,0xe4,0xf0,0xa3,0xf0,0x90,0x97,0x3c,0xf0,0x90,0x97,0x42,0xf0,0x90, +0x97,0x45,0xf0,0x90,0x97,0x43,0xf0,0x90,0x97,0x46,0xf0,0x90,0x97,0x44,0xf0,0x90, +0x97,0x47,0xf0,0x90,0x97,0x2e,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90, +0x97,0x33,0xf0,0x90,0x97,0x38,0xf0,0x90,0x97,0x3a,0xf0,0x90,0x97,0x4c,0xf0,0x90, +0x97,0x3d,0xf0,0x90,0x97,0x39,0xf0,0x90,0x97,0x32,0xf0,0x90,0x00,0x51,0xe0,0x44, +0xc0,0xfd,0x7f,0x51,0x02,0x47,0x52,0x90,0x97,0x4c,0xe0,0x64,0x01,0x60,0x08,0x90, +0x97,0x3a,0xe0,0x60,0x02,0x01,0xfe,0x90,0x97,0x2e,0xe0,0xc3,0x94,0xff,0x50,0x05, +0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x2f,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04, +0xf0,0xe4,0x80,0x28,0x90,0x97,0x30,0xe0,0xc3,0x94,0xff,0x50,0x0a,0xe0,0x04,0xf0, +0xe4,0x90,0x97,0x2f,0xf0,0x80,0x15,0x90,0x97,0x31,0xe0,0xc3,0x94,0xff,0x50,0x10, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x30,0xf0,0x90,0x97,0x2f,0xf0,0x90,0x97,0x2e,0xf0, +0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90,0x97,0x42,0xe0, +0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x43,0xe0,0xc3,0x94, +0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x44,0xe0,0xc3,0x94,0xff, +0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x43,0xf0,0x90,0x97,0x42,0xf0,0x90,0x00, +0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x45,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04, +0xf0,0x80,0x24,0x90,0x97,0x46,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4, +0x80,0x11,0x90,0x97,0x47,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90, +0x97,0x46,0xf0,0x90,0x97,0x45,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01,0xf0,0x22,0x90, +0x00,0x02,0x12,0x42,0x20,0x90,0x97,0x3a,0xf0,0x90,0x00,0x01,0x12,0x42,0x20,0x25, +0xe0,0x25,0xe0,0x90,0x97,0x39,0xf0,0x12,0x29,0xd9,0x25,0xe0,0x25,0xe0,0x90,0x97, +0x3d,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x48,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97, +0x49,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x4a,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97, +0x4b,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x97,0x39,0xe0, +0xff,0x12,0x52,0x96,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x90,0x97,0x3a,0xe0, +0x70,0x02,0x41,0x09,0x90,0x97,0x39,0xe0,0x70,0x02,0x41,0x09,0x90,0x97,0x3d,0xe0, +0x70,0x02,0x41,0x09,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x97, +0x4c,0x74,0x01,0xf0,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x12,0x47,0x49,0x90, +0x00,0x46,0xe0,0x44,0x01,0xfd,0x7f,0x46,0x12,0x47,0x52,0x90,0x97,0x32,0xe0,0x60, +0x15,0x90,0x97,0x3e,0x12,0x43,0x53,0x90,0x80,0x85,0x12,0x2a,0x7f,0x7f,0x80,0x7e, +0x08,0x12,0x2f,0xd9,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0, +0x54,0xef,0xfd,0x7f,0x45,0x12,0x47,0x52,0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90, +0x97,0x48,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x49,0xe0,0x90,0x05,0x85,0xf0,0x90, +0x97,0x4a,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x4b,0xe0,0x90,0x05,0x87,0xf0,0xa2, +0xaf,0xe4,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0, +0x7d,0x20,0xe4,0xff,0x12,0x37,0x00,0x80,0x2d,0x90,0x97,0x3a,0xe0,0x70,0x2f,0x90, +0x97,0x4c,0x12,0x47,0x48,0x90,0x00,0x46,0xe0,0x54,0xfe,0xfd,0x7f,0x46,0x12,0x47, +0x52,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90,0x97,0x5d,0xf0,0xc2,0xaf,0x7d, +0x20,0xe4,0xff,0x12,0x36,0x92,0x90,0x97,0x5d,0xe0,0x24,0xff,0x92,0xaf,0x22,0x00, +0xb5,0xf6,}; + + +// ===================8723========================================= +u8 Rtl8192CUFwUMC8723ImgArray[UMC8723ImgArrayLength] = { +0xc1,0x88,0x02,0x00,0x39,0x00,0x01,0x00,0x09,0x09,0x16,0x47,0x80,0x3f,0x00,0x00, +0x29,0x29,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x74,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x59,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x73,0xab,0x00,0x00,0x00,0x00,0x00,0x02,0x67,0xfe,0x00,0x00, +0x05,0x04,0x03,0x02,0x00,0x03,0x06,0x05,0x04,0x03,0x00,0x04,0x06,0x05,0x04,0x02, +0x00,0x04,0x08,0x07,0x06,0x04,0x00,0x06,0x0a,0x09,0x08,0x06,0x00,0x08,0x0a,0x09, +0x08,0x04,0x00,0x08,0x0a,0x09,0x08,0x02,0x00,0x08,0x0a,0x09,0x08,0x00,0x00,0x08, +0x12,0x11,0x10,0x08,0x00,0x10,0x1a,0x19,0x18,0x10,0x00,0x18,0x22,0x21,0x20,0x18, +0x00,0x20,0x22,0x21,0x20,0x10,0x00,0x20,0x22,0x21,0x20,0x08,0x00,0x20,0x22,0x21, +0x1c,0x08,0x00,0x20,0x22,0x21,0x14,0x08,0x00,0x20,0x22,0x20,0x18,0x08,0x00,0x20, +0x31,0x30,0x20,0x10,0x00,0x30,0x31,0x30,0x18,0x00,0x00,0x30,0x31,0x2f,0x10,0x10, +0x00,0x30,0x31,0x2c,0x10,0x10,0x00,0x30,0x31,0x28,0x10,0x00,0x00,0x30,0x31,0x20, +0x10,0x00,0x00,0x30,0x31,0x10,0x10,0x00,0x00,0x30,0x05,0x05,0x05,0x05,0x05,0x05, +0x05,0x07,0x07,0x07,0x08,0x0a,0x05,0x05,0x05,0x07,0x07,0x0a,0x0d,0x0e,0x05,0x05, +0x07,0x07,0x08,0x0c,0x14,0x14,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x0c,0x0e, +0x13,0x13,0x09,0x09,0x0a,0x0b,0x0d,0x11,0x13,0x13,0x09,0x09,0x09,0x09,0x0c,0x14, +0x15,0x15,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x05, +0x05,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05, +0x05,0x05,0x09,0x09,0x09,0x09,0x0b,0x0d,0x10,0x12,0x05,0x09,0x0a,0x0c,0x0d,0x0e, +0x10,0x12,0x09,0x09,0x0e,0x0e,0x10,0x10,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x26,0x2a,0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,0x00,0x00, +0x00,0x1f,0x23,0x28,0x2a,0x2c,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x18, +0x00,0x24,0x00,0x30,0x00,0x48,0x00,0x60,0x00,0x90,0x00,0xc0,0x00,0xd8,0x00,0x50, +0x00,0x78,0x00,0xa0,0x00,0xc8,0x01,0x40,0x01,0x90,0x01,0xe0,0x02,0x30,0x01,0x2c, +0x01,0x40,0x01,0xe0,0x02,0xd0,0x03,0xe8,0x04,0xb0,0x06,0x40,0x07,0xd0,0x00,0x02, +0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x24,0x00,0x30, +0x00,0x48,0x00,0x60,0x00,0x6c,0x00,0x28,0x00,0x3c,0x00,0x50,0x00,0x64,0x00,0xa0, +0x00,0xc8,0x00,0xf0,0x01,0x18,0x00,0x64,0x00,0xa0,0x00,0xf0,0x01,0x68,0x01,0xf4, +0x02,0x58,0x03,0x20,0x03,0xe8,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06, +0x07,0x08,0x01,0x02,0x03,0x04,0x08,0x0f,0x23,0x3c,0x05,0x06,0x07,0x0f,0x19,0x32, +0x4b,0x64,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x01,0x02, +0x03,0x04,0x05,0x06,0x07,0x08,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x22,0x1f, +0x1e,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x8f,0x17,0x74,0x42,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x20,0xf0,0x74,0x84,0x25,0x17, +0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0x90,0x97,0x54,0xf0,0xe0,0xfb, +0x54,0x1f,0xff,0xa3,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4, +0x34,0x93,0xf5,0x83,0xe0,0xfe,0x90,0x97,0x57,0xf0,0xe5,0x17,0x25,0xe0,0x24,0x81, +0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x58,0xcd,0xf0, +0xa3,0xed,0xf0,0xe5,0x17,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfd,0xa3,0xe0,0x90,0x97,0x5a,0xcd,0xf0,0xa3,0xed,0xf0,0xef,0xc3,0x9e,0x40, +0x03,0x02,0x43,0x56,0x90,0x01,0xc5,0x74,0x20,0xf0,0x90,0x97,0x55,0xe0,0xff,0x74, +0xa5,0x25,0x17,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0xef,0x04,0x90,0x97, +0x56,0xf0,0x90,0x97,0x57,0xe0,0xff,0x90,0x97,0x56,0xe0,0xfe,0xd3,0x9f,0x40,0x03, +0x02,0x43,0xa0,0xee,0xc3,0x94,0x10,0x40,0x21,0xee,0x24,0xf0,0xff,0x74,0x01,0x7e, +0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97, +0x58,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x70,0x27,0x90,0x97,0x56,0xe0,0xff,0xc3, +0x94,0x10,0x50,0x59,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce, +0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x5a,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x3c,0x90,0x97,0x56,0xe0,0xb4,0x11,0x0d,0x90,0x97,0x59,0xe0,0x30,0xe7,0x06,0x90, +0x97,0x56,0x74,0x17,0xf0,0x90,0x97,0x56,0xe0,0xff,0x64,0x13,0x60,0x04,0xef,0xb4, +0x12,0x0d,0x90,0x97,0x58,0xe0,0x30,0xe0,0x06,0x90,0x97,0x56,0x74,0x18,0xf0,0x90, +0x97,0x56,0xe0,0x90,0x97,0x55,0xf0,0x90,0x97,0x54,0xf0,0x80,0x53,0x90,0x97,0x56, +0xe0,0x04,0xf0,0x02,0x42,0xb2,0x90,0x97,0x57,0xe0,0xf9,0x90,0x97,0x55,0xe0,0xff, +0x69,0x60,0x03,0x02,0x43,0xe8,0x90,0x01,0xc5,0x74,0x40,0xf0,0x74,0xa5,0x25,0x17, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24, +0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xb4,0x01,0x14,0xeb,0x30,0xe6,0x06, +0x90,0x97,0x54,0xe0,0xff,0x22,0x90,0x97,0x55,0xe0,0x44,0x40,0x90,0x97,0x54,0xf0, +0x90,0x97,0x55,0xe0,0xff,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2d,0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0x12,0x1d,0xa9,0x80,0x71,0x90,0x97,0x55,0xe0,0xd3,0x99,0x40,0x69, +0x90,0x01,0xc5,0x74,0x60,0xf0,0x90,0x97,0x57,0xe0,0xff,0x74,0xa5,0x25,0x17,0xf5, +0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x90,0x97,0x55,0xef,0xf0,0x90,0x97,0x54, +0xf0,0xfb,0xa3,0xe0,0xff,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83, +0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd,0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34, +0x41,0xf5,0x83,0x74,0x01,0x93,0x2d,0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13, +0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0x12,0x1d,0xa9,0xaf,0x03,0x22,0x74,0x01,0x25,0x17,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x54,0xe0,0x44,0x80,0xff,0x74,0x84,0x25, +0x17,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xef,0xf0,0x22,0xef,0x14,0x60,0x20,0x14, +0x60,0x4b,0x24,0x02,0x70,0x78,0x90,0x97,0x69,0x74,0x02,0xf0,0x90,0x00,0x48,0xe0, +0x44,0x0c,0xf0,0x90,0x00,0x47,0xe0,0x44,0x08,0xf0,0x90,0x00,0x45,0x80,0x5b,0xe4, +0x90,0x97,0x69,0xf0,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, +0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90, +0x00,0x45,0xe0,0x44,0xef,0xf0,0xe0,0x54,0xef,0xf0,0xa3,0x80,0x2d,0x90,0x97,0x69, +0x74,0x01,0xf0,0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90,0x00, +0x45,0xe0,0x44,0x20,0xf0,0xe0,0x44,0x10,0xf0,0xa3,0xe0,0x44,0x10,0xf0,0x22,0xe4, +0xf5,0x61,0x22,0x02,0x7f,0x69,0x02,0x7f,0x70,0x74,0x45,0x90,0x01,0xc4,0xf0,0xa3, +0x74,0x09,0xf0,0xe4,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xff,0xc3,0x94,0x20, +0x40,0x03,0x02,0x4e,0x3a,0xef,0x75,0xf0,0x08,0xa4,0x24,0x6a,0xf5,0x82,0xe4,0x34, +0x93,0xf5,0x83,0xe0,0x64,0x01,0x60,0x03,0x02,0x4e,0x31,0x90,0x97,0x3a,0xe0,0x25, +0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0xd3,0x94, +0x00,0xec,0x94,0x00,0x50,0x03,0x02,0x4e,0x31,0xef,0x75,0xf0,0x0a,0xa4,0x24,0x00, +0xf9,0x74,0x90,0x35,0xf0,0xfa,0x7b,0x01,0x8b,0x13,0xf5,0x14,0x89,0x15,0x90,0x97, +0x3a,0xe0,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe0,0xfd,0xa3, +0xe0,0x90,0x97,0x46,0xcd,0xf0,0xa3,0xed,0xf0,0xef,0x25,0xe0,0x24,0x63,0xf5,0x82, +0xe4,0x34,0x94,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x97,0x48,0xcf,0xf0,0xa3,0xef, +0xf0,0x90,0x00,0x02,0x12,0x66,0x20,0xff,0xae,0xf0,0x12,0x65,0xf5,0x2f,0xff,0xe5, +0xf0,0x3e,0x90,0x97,0x4f,0xf0,0xa3,0xef,0xf0,0x90,0x00,0x06,0x12,0x66,0x20,0xff, +0xae,0xf0,0x90,0x00,0x04,0x12,0x66,0x20,0x2f,0xff,0xe5,0xf0,0x3e,0x90,0x97,0x4d, +0xf0,0xa3,0xef,0xf0,0x90,0x00,0x08,0x12,0x66,0x20,0xff,0x90,0x97,0x4b,0xe5,0xf0, +0xf0,0xa3,0xef,0xf0,0x90,0x97,0x3a,0xe0,0xfe,0x24,0x84,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0x3f,0x90,0x97,0x3c,0xf0,0xe0,0xfd,0x54,0x1f,0xa3,0xf0,0xee, +0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0x90,0x97, +0x51,0xf0,0x90,0x97,0x3a,0xe0,0xfb,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, +0xe0,0xc3,0x94,0x05,0x40,0x03,0x02,0x49,0xc2,0x90,0x97,0x51,0xe0,0xfe,0x90,0x97, +0x3d,0xe0,0x9e,0x40,0x13,0x90,0x97,0x51,0xe0,0x90,0x97,0x3d,0xf0,0xed,0x54,0x40, +0xfd,0x90,0x97,0x3c,0xf0,0xee,0x4d,0xf0,0x90,0x04,0xfd,0xe0,0x64,0x01,0x70,0x28, +0x90,0x97,0x3d,0xe0,0xff,0x90,0x41,0x4a,0x93,0xfe,0x74,0x23,0x2b,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0xe0,0xc3,0x9e,0x40,0x06,0xef,0x90,0x41,0x12,0x80,0x32,0x90, +0x97,0x3d,0xe0,0x90,0x41,0x2e,0x80,0x29,0x90,0x97,0x3d,0xe0,0xff,0x90,0x41,0x4a, +0x93,0xfe,0x90,0x97,0x3a,0xe0,0x24,0x23,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0, +0xc3,0x9e,0x40,0x06,0xef,0x90,0x40,0xda,0x80,0x07,0x90,0x97,0x3d,0xe0,0x90,0x40, +0xf6,0x93,0x90,0x97,0x4a,0xf0,0x90,0x97,0x4a,0xe0,0x75,0xf0,0x06,0xa4,0x24,0x50, +0xf9,0x74,0x40,0x35,0xf0,0x75,0x10,0xff,0xf5,0x11,0x89,0x12,0x90,0x97,0x3c,0xe0, +0x90,0x41,0xf2,0x93,0xff,0xd3,0x90,0x97,0x49,0xe0,0x9f,0x90,0x97,0x48,0xe0,0x94, +0x00,0x40,0x0d,0x90,0x97,0x3a,0xe0,0xff,0xe4,0xfd,0x12,0x5f,0x6d,0x02,0x4d,0xc7, +0x90,0x97,0x3a,0xe0,0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5, +0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x97,0x3e,0x12, +0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb, +0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x1c, +0xd6,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0xf5,0xfd,0xac,0xf0, +0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f, +0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9, +0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00, +0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x01,0x12, +0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0x12,0x66, +0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01, +0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97, +0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3, +0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12, +0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90, +0x00,0x04,0x12,0x66,0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03, +0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec, +0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9, +0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab,0x10, +0xaa,0x11,0xa9,0x12,0x90,0x00,0x03,0x12,0x1c,0xef,0xff,0x7e,0x00,0xab,0x13,0xaa, +0x14,0xa9,0x15,0x90,0x00,0x06,0x12,0x66,0x20,0xfd,0xac,0xf0,0x12,0x1d,0x1c,0xe4, +0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f,0xff,0xea,0x3e,0xfe, +0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9,0x90,0x97,0x3e,0xe0, +0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02, +0xc0,0x03,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x04,0x12,0x1c,0xef,0xff,0x7e, +0x00,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x08,0x12,0x66,0x20,0xfd,0xac,0xf0, +0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb,0x2f, +0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d,0xa9, +0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x05,0x12,0x1c,0xef,0xff,0x7e,0x00,0x90, +0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0x90,0x97,0x3e, +0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66,0xa4,0x90, +0x97,0x3e,0x40,0x50,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xc0, +0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00,0x05, +0x12,0x1c,0xef,0xff,0x7e,0x00,0x90,0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d, +0x1c,0xab,0x07,0xaa,0x06,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xc3,0xef,0x9b, +0xff,0xee,0x9a,0xfe,0xed,0x94,0x00,0xfd,0xec,0x94,0x00,0xfc,0x90,0x97,0x3e,0x12, +0x1d,0xa9,0x80,0x07,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0x90,0x97,0x3e,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x97,0x3a,0xe0,0x25,0xe0,0x25, +0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0x90,0x97,0x3c, +0xe0,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74, +0x01,0x93,0xff,0xe4,0xfc,0xfd,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0, +0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66,0xa4,0x40,0x0b,0x90,0x97,0x3a,0xe0,0xff,0x12, +0x42,0x20,0x02,0x4d,0x3e,0x90,0x97,0x3c,0xe0,0x25,0xe0,0x24,0x9e,0xf5,0x82,0xe4, +0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93,0xff,0xe4,0xfc,0xfd,0x90,0x97, +0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0x12,0x66,0xa4, +0x40,0x03,0x02,0x4d,0x3e,0x90,0x97,0x3a,0xe0,0xff,0x7d,0x01,0x12,0x5f,0x6d,0x02, +0x4d,0x3e,0x90,0x97,0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83, +0xe0,0x64,0x05,0x60,0x03,0x02,0x4b,0x8e,0x90,0x04,0xb3,0xe0,0x64,0x01,0x70,0x03, +0x02,0x4b,0x8e,0x90,0x93,0x62,0xe0,0xfe,0xb4,0x03,0x0b,0x90,0x97,0x3d,0xe0,0xc3, +0x94,0x19,0x40,0x3d,0x80,0x2e,0xee,0xb4,0x02,0x0b,0x90,0x97,0x3d,0xe0,0xc3,0x94, +0x11,0x40,0x2e,0x80,0x1f,0x90,0x93,0x62,0xe0,0xfe,0xb4,0x01,0x0b,0x90,0x97,0x3d, +0xe0,0xc3,0x94,0x0a,0x40,0x1b,0x80,0x0c,0xee,0x70,0x11,0x90,0x97,0x3d,0xe0,0xc3, +0x94,0x03,0x40,0x0d,0x90,0x95,0x43,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x95,0x43, +0xf0,0x74,0x23,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xc3,0x94,0x30, +0x50,0x03,0x02,0x4b,0x2d,0x90,0x95,0x43,0xe0,0x64,0x01,0x60,0x03,0x02,0x4b,0x2d, +0x90,0x97,0x3a,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x64,0x0a, +0x60,0x56,0x90,0x97,0x3a,0xe0,0xfe,0xef,0x24,0x05,0xfd,0xe4,0x33,0xfc,0x74,0x21, +0x2e,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xff,0xd3,0x9d,0xec,0x64,0x80,0xf8, +0x74,0x80,0x98,0x50,0x33,0xef,0x24,0x05,0xfd,0xe4,0x33,0xfc,0x74,0x23,0x2e,0xf5, +0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xd3,0x9d,0xec,0x64,0x80,0xf8,0x74,0x80,0x98, +0x50,0x16,0x90,0x97,0x3a,0xe0,0x24,0x84,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0, +0xff,0x90,0x97,0x3d,0xe0,0x6f,0x60,0x56,0x90,0x97,0x3a,0xe0,0x24,0x23,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xe0,0xff,0xd3,0x94,0x46,0x40,0x08,0x90,0x97,0x52,0x74, +0x05,0xf0,0x80,0x11,0xef,0xd3,0x94,0x3c,0x90,0x97,0x52,0x40,0x05,0x74,0x03,0xf0, +0x80,0x03,0x74,0x01,0xf0,0x90,0x97,0x3a,0xe0,0xff,0x24,0x23,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0xe0,0xfe,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xee, +0xf0,0x90,0x97,0x3a,0xe0,0x24,0x44,0xf5,0x82,0xe4,0x34,0x95,0x80,0x2f,0x90,0x97, +0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x44, +0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x04,0xf0,0x80,0x14,0xe4,0x90,0x97, +0x52,0xf0,0x90,0x97,0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4, +0xf0,0x90,0x97,0x3d,0xe0,0xff,0x90,0x97,0x3a,0xe0,0xfe,0x24,0x84,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xef,0xf0,0xee,0x30,0xe0,0x1e,0x90,0x97,0x52,0xe0,0xc4,0x54, +0xf0,0xf0,0x90,0x97,0x3a,0xe0,0xc3,0x13,0xff,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04, +0xf5,0x83,0xe0,0x54,0x0f,0x02,0x4d,0x21,0x90,0x97,0x3a,0xe0,0xc3,0x13,0xff,0x24, +0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0xf0,0x02,0x4d,0x21,0x90,0x97, +0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x64,0x06,0x60,0x03, +0x02,0x4d,0x3e,0x90,0x04,0xb3,0xe0,0x64,0x01,0x70,0x03,0x02,0x4d,0x3e,0x90,0x97, +0x3e,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0x90,0x42,0x13,0xe4,0x93,0xff,0x7e,0x00, +0x90,0x97,0x46,0xe0,0xfc,0xa3,0xe0,0xfd,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0x90,0x97, +0x42,0x12,0x1d,0xa9,0xe4,0x90,0x97,0x3b,0xf0,0x90,0x97,0x3e,0xe0,0xf8,0xa3,0xe0, +0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xab, +0x13,0xaa,0x14,0xa9,0x15,0x90,0x97,0x3b,0xe0,0xff,0x75,0xf0,0x02,0xa4,0xf5,0x82, +0x85,0xf0,0x83,0x12,0x66,0x20,0xfd,0xac,0xf0,0xef,0x90,0x42,0x0e,0x93,0xff,0x7e, +0x00,0x12,0x1d,0x1c,0xe4,0xfc,0xfd,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xeb, +0x2f,0xff,0xea,0x3e,0xfe,0xed,0x39,0xfd,0xec,0x38,0xfc,0x90,0x97,0x3e,0x12,0x1d, +0xa9,0x90,0x97,0x42,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, +0x97,0x3e,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0xd3,0x12,0x66, +0xa4,0x50,0x0e,0x90,0x97,0x3b,0xe0,0x04,0xf0,0xe0,0x64,0x05,0x60,0x03,0x02,0x4b, +0xd9,0x90,0x97,0x3b,0xe0,0xc3,0x13,0xf0,0x90,0x97,0x52,0xe0,0xff,0xb4,0x01,0x0d, +0x90,0x97,0x3b,0xe0,0x70,0x5d,0x90,0x97,0x52,0x04,0xf0,0x80,0x5b,0xef,0xb4,0x03, +0x1d,0x90,0x97,0x3b,0xe0,0xff,0x70,0x08,0x90,0x97,0x52,0x74,0x03,0xf0,0x80,0x48, +0xef,0xb4,0x01,0x08,0x90,0x97,0x52,0x74,0x01,0xf0,0x80,0x3c,0x80,0x35,0x90,0x97, +0x52,0xe0,0x64,0x05,0x70,0x32,0x90,0x97,0x3b,0xe0,0xff,0x70,0x08,0x90,0x97,0x52, +0x74,0x05,0xf0,0x80,0x0f,0xef,0x90,0x97,0x52,0xb4,0x01,0x05,0x74,0x03,0xf0,0x80, +0x03,0x74,0x01,0xf0,0xd3,0x90,0x97,0x49,0xe0,0x94,0x03,0x90,0x97,0x48,0xe0,0x94, +0x00,0x40,0x05,0xe4,0x90,0x97,0x52,0xf0,0xd3,0x90,0x97,0x49,0xe0,0x94,0x03,0x90, +0x97,0x48,0xe0,0x94,0x00,0x40,0x05,0xe4,0x90,0x97,0x52,0xf0,0x90,0x97,0x3a,0xe0, +0xff,0x30,0xe0,0x1a,0x90,0x97,0x52,0xe0,0xc4,0x54,0xf0,0xf0,0xef,0xc3,0x13,0xff, +0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54,0x0f,0x80,0x13,0x90,0x97, +0x3a,0xe0,0xc3,0x13,0xff,0x24,0xa4,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, +0xf0,0xf0,0x74,0xa4,0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xc0,0x83,0xc0,0x82, +0xe0,0xff,0x90,0x97,0x52,0xe0,0xfe,0xef,0x4e,0xd0,0x82,0xd0,0x83,0xf0,0x90,0x97, +0x3a,0xe0,0xff,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0xd3,0x94,0x05, +0x50,0x0f,0x74,0x64,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe0,0x04,0xf0,0x80, +0x0f,0x90,0x97,0x3a,0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0, +0x90,0x97,0x3a,0xe0,0xff,0x24,0x84,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe0,0x54, +0x1f,0xc3,0x94,0x09,0x50,0x05,0x90,0x92,0x00,0x80,0x11,0x74,0x84,0x2f,0xf5,0x82, +0xe4,0x34,0x04,0xf5,0x83,0xe0,0x90,0x92,0x00,0x20,0xe2,0x05,0x74,0x08,0xf0,0x80, +0x03,0x74,0x04,0xf0,0x90,0x97,0x3a,0xe0,0x60,0x0d,0x90,0x96,0xa4,0xe0,0xff,0x90, +0x92,0x00,0xe0,0xc3,0x9f,0x50,0x08,0x90,0x92,0x00,0xe0,0x90,0x96,0xa4,0xf0,0x90, +0x96,0xa4,0xe0,0x90,0x04,0x80,0xf0,0xab,0x13,0xaa,0x14,0xa9,0x15,0xe4,0xf5,0xf0, +0x12,0x66,0x58,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x02,0xe4,0xf5,0xf0,0x12, +0x66,0x77,0x90,0x00,0x04,0xe4,0xf5,0xf0,0x12,0x66,0x77,0x90,0x00,0x06,0xe4,0xf5, +0xf0,0x12,0x66,0x77,0x90,0x00,0x08,0xe4,0xf5,0xf0,0x12,0x66,0x77,0x90,0x97,0x3a, +0xe0,0xff,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xef,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0xef,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0,0x02,0x45,0x18,0x22,0xef,0x70,0x03,0x02,0x50, +0xa3,0x90,0x97,0x2d,0xe0,0x60,0x03,0x02,0x54,0xe5,0x90,0x97,0x19,0xe0,0xfc,0xa3, +0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c, +0x7e,0x08,0x12,0x33,0xd8,0x90,0x96,0xc5,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x44,0x7e,0x08,0x12,0x33,0xd8, +0x90,0x96,0xc9,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, +0x56,0x12,0x1d,0xa9,0x7f,0x5c,0x7e,0x08,0x12,0x33,0xd8,0x90,0x96,0xcd,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f, +0x6c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xd1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x33, +0xd8,0x90,0x96,0xd5,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, +0x81,0x56,0x12,0x1d,0xa9,0x7f,0x74,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xd9,0xe0, +0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x78,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xdd,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x7c,0x7e,0x0e,0x12, +0x33,0xd8,0x90,0x96,0xe1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff, +0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xe5, +0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d, +0xa9,0x7f,0x84,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xe9,0xe0,0xfc,0xa3,0xe0,0xfd, +0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x88,0x7e,0x0e, +0x12,0x33,0xd8,0x90,0x96,0xed,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96, +0xf1,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12, +0x1d,0xa9,0x7f,0xd0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x96,0xf5,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xd4,0x7e, +0x0e,0x12,0x33,0xd8,0x90,0x96,0xf9,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, +0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xd8,0x7e,0x0e,0x12,0x33,0xd8,0x90, +0x96,0xfd,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0xdc,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x97,0x01,0xe0,0xfc,0xa3, +0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xe0, +0x7e,0x0e,0x12,0x33,0xd8,0x90,0x97,0x05,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0xec,0x7e,0x0e,0x12,0x33,0xd8, +0x90,0x97,0x09,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, +0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x0d,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f, +0x04,0x7e,0x0d,0x12,0x33,0xd8,0x90,0x97,0x11,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33, +0xd8,0x90,0x97,0x15,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90, +0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x2d,0x74, +0x01,0xf0,0x22,0x90,0x97,0x2d,0xe0,0x64,0x01,0x60,0x03,0x02,0x54,0xe5,0x7f,0x8c, +0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x19,0x12,0x1d,0xa9,0x7f,0x44,0x7e,0x08,0x12, +0x2b,0x13,0x90,0x96,0xc5,0x12,0x1d,0xa9,0x7f,0x5c,0x7e,0x08,0x12,0x2b,0x13,0x90, +0x96,0xc9,0x12,0x1d,0xa9,0x7f,0x6c,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xcd,0x12, +0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xd1,0x12,0x1d,0xa9,0x7f, +0x74,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xd5,0x12,0x1d,0xa9,0x7f,0x78,0x7e,0x0e, +0x12,0x2b,0x13,0x90,0x96,0xd9,0x12,0x1d,0xa9,0x7f,0x7c,0x7e,0x0e,0x12,0x2b,0x13, +0x90,0x96,0xdd,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe1, +0x12,0x1d,0xa9,0x7f,0x84,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe5,0x12,0x1d,0xa9, +0x7f,0x88,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xe9,0x12,0x1d,0xa9,0x7f,0x8c,0x7e, +0x0e,0x12,0x2b,0x13,0x90,0x96,0xed,0x12,0x1d,0xa9,0x7f,0xd0,0x7e,0x0e,0x12,0x2b, +0x13,0x90,0x96,0xf1,0x12,0x1d,0xa9,0x7f,0xd4,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96, +0xf5,0x12,0x1d,0xa9,0x7f,0xd8,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xf9,0x12,0x1d, +0xa9,0x7f,0xdc,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x96,0xfd,0x12,0x1d,0xa9,0x7f,0xe0, +0x7e,0x0e,0x12,0x2b,0x13,0x90,0x97,0x01,0x12,0x1d,0xa9,0x7f,0xec,0x7e,0x0e,0x12, +0x2b,0x13,0x90,0x97,0x05,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x13,0x90, +0x97,0x09,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x13,0x90,0x97,0x0d,0x12, +0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x13,0x90,0x97,0x11,0x12,0x1d,0xa9,0x7f, +0x04,0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x15,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x08, +0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xed,0x44,0xc0,0xfd,0xec,0x90,0x97,0xa3,0x12, +0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff, +0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x8c,0x7e,0x08,0x12,0x33,0xd8,0x90,0x81,0x56, +0x12,0x1d,0xb5,0x00,0x01,0x00,0x00,0x7f,0x44,0x7e,0x08,0x12,0x33,0xd8,0x90,0x81, +0x56,0x12,0x1d,0xb5,0x00,0xdb,0x25,0xa4,0x7f,0x5c,0x7e,0x08,0x12,0x33,0xd8,0x90, +0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25,0xa4,0x7f,0x6c,0x7e,0x0e,0x12,0x33,0xd8, +0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25,0xa4,0x7f,0x70,0x7e,0x0e,0x12,0x33, +0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x74,0x7e,0x0e,0x12, +0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x78,0x7e,0x0e, +0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x7c,0x7e, +0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4,0x7f,0x80, +0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x63,0xdb,0x25,0xa4,0x7f, +0x84,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x04,0x1b,0x25,0xa4, +0x7f,0x88,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb,0x25, +0xa4,0x7f,0x8c,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20,0xdb, +0x25,0xa4,0x7f,0xd0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5,0x20, +0xdb,0x25,0xa4,0x7f,0xd4,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d,0xb5, +0x20,0xdb,0x25,0xa4,0x7f,0xd8,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12,0x1d, +0xb5,0x00,0x1b,0x25,0xa4,0x7f,0xdc,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56,0x12, +0x1d,0xb5,0x00,0x1b,0x25,0xa4,0x7f,0xe0,0x7e,0x0e,0x12,0x33,0xd8,0x90,0x81,0x56, +0x12,0x1d,0xb5,0x24,0xdb,0x25,0xa4,0x7f,0xec,0x7e,0x0e,0x12,0x33,0xd8,0x7f,0x04, +0x7e,0x0c,0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xe4,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, +0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x11,0xff,0xec, +0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33, +0xd8,0x7f,0x04,0x7e,0x0d,0x12,0x2b,0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97, +0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xf0,0xff,0xec,0x90, +0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0x44,0x01,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0, +0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x04,0x7e,0x0d,0x12,0x33,0xd8,0x7f,0x0c,0x7e,0x09,0x12,0x2b,0x13,0x90,0x97, +0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xe4, +0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd, +0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x11,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, +0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33,0xd8,0x7f,0x0c,0x7e,0x09,0x12,0x2b, +0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0xff,0xed,0x54,0x0f,0xfd,0xec,0x54,0xf0,0xfc,0x90,0x97,0xa3, +0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0xed,0x44,0x10,0xfd,0xec,0x44,0x01,0xfc,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90, +0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0x0c,0x7e,0x09,0x12,0x33,0xd8,0x7f,0x04,0x7e,0x08,0x12,0x2b, +0x13,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0x54,0xf0,0xff,0xec,0x90,0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97, +0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x44,0x01,0xff,0xec,0x90, +0x97,0xa3,0x12,0x1d,0xa9,0x90,0x97,0xa3,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x08,0x12,0x33,0xd8, +0xe4,0x90,0x97,0x2d,0xf0,0x22,0x8f,0x10,0xef,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xaf,0x82,0xf5,0x11,0x8f,0x12,0xe5,0x10,0x75,0xf0,0x02,0xa4,0x24,0x81, +0xf9,0x74,0x92,0x35,0xf0,0x75,0x13,0x01,0xf5,0x14,0x89,0x15,0xe5,0x10,0x75,0xf0, +0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4,0x34,0x93,0xaf,0x82,0xf5,0x16,0x8f,0x17,0xe5, +0x10,0x75,0xf0,0x08,0xa4,0x24,0x63,0xf9,0x74,0x93,0x35,0xf0,0x75,0x18,0x01,0xf5, +0x19,0x89,0x1a,0x74,0xc1,0x25,0x10,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x12, +0x66,0xc1,0x55,0x67,0x00,0x55,0x7c,0x01,0x55,0x91,0x02,0x55,0xa6,0x03,0x55,0xd0, +0x04,0x55,0xe5,0x05,0x55,0xfa,0x06,0x56,0x21,0x0c,0x56,0x4f,0x0d,0x56,0x7c,0x0e, +0x56,0xa9,0x0f,0x00,0x00,0x56,0xdd,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4, +0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x15,0x80,0x3c,0xe5,0x10,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0x74,0x10,0x80, +0x27,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0xf0, +0xf0,0xa3,0x74,0x05,0x80,0x12,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34, +0x95,0xf5,0x83,0x74,0xf0,0xf0,0xa3,0xe4,0xf0,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5, +0x82,0xe4,0x34,0x92,0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0x8f,0xf0,0x02,0x56,0xdd, +0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0x74,0x0f,0xf0, +0xa3,0x74,0xf5,0x80,0x27,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95, +0xf5,0x83,0x74,0x0f,0xf0,0xa3,0x74,0xf0,0x80,0x12,0xe5,0x10,0x25,0xe0,0x24,0xe4, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0x74,0x0d,0xf0,0xe5,0x10,0x25, +0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x02,0x56, +0xdd,0x90,0x04,0x47,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04, +0x46,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04, +0x45,0xe0,0x85,0x12,0x82,0x85,0x11,0x83,0xf0,0x90,0x04,0x44,0x02,0x56,0xd4,0x90, +0x04,0x4b,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x4a,0xe0, +0xab,0x13,0xaa,0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x49,0xe0, +0x85,0x12,0x82,0x85,0x11,0x83,0xf0,0x90,0x04,0x48,0x80,0x58,0x90,0x04,0x4f,0xe0, +0xab,0x13,0xaa,0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x4e,0xe0,0xab,0x13,0xaa, +0x14,0xa9,0x15,0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x4d,0xe0,0x85,0x12,0x82, +0x85,0x11,0x83,0xf0,0x90,0x04,0x4c,0x80,0x2b,0x90,0x04,0x53,0xe0,0xab,0x13,0xaa, +0x14,0xa9,0x15,0x12,0x65,0x95,0x90,0x04,0x52,0xe0,0xab,0x13,0xaa,0x14,0xa9,0x15, +0x90,0x00,0x01,0x12,0x65,0xa7,0x90,0x04,0x51,0xe0,0x85,0x12,0x82,0x85,0x11,0x83, +0xf0,0x90,0x04,0x50,0xe0,0x85,0x12,0x82,0x85,0x11,0x83,0xa3,0xf0,0xab,0x13,0xaa, +0x14,0xa9,0x15,0xc0,0x03,0xc0,0x02,0xc0,0x01,0x12,0x1c,0xd6,0xff,0xab,0x18,0xaa, +0x19,0xa9,0x1a,0x12,0x1c,0xd6,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x65,0x95, +0xab,0x13,0xe5,0x15,0x24,0x01,0xf9,0xe4,0x35,0x14,0xfa,0xc0,0x03,0xc0,0x02,0xc0, +0x01,0x12,0x1c,0xd6,0xff,0xab,0x18,0xaa,0x19,0xa9,0x1a,0x90,0x00,0x01,0x12,0x1c, +0xef,0x5f,0xd0,0x01,0xd0,0x02,0xd0,0x03,0x12,0x65,0x95,0x85,0x12,0x82,0x85,0x11, +0x83,0xc0,0x83,0xc0,0x82,0xe0,0xff,0x85,0x17,0x82,0x85,0x16,0x83,0xe0,0xfe,0xef, +0x5e,0xd0,0x82,0xd0,0x83,0xf0,0x85,0x12,0x82,0x85,0x11,0x83,0xa3,0xc0,0x83,0xc0, +0x82,0xe0,0xff,0x85,0x17,0x82,0x85,0x16,0x83,0xa3,0xe0,0xfe,0xef,0x5e,0xd0,0x82, +0xd0,0x83,0xf0,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x4c,0x90,0x97,0x51,0x74,0x0b,0xf0,0x90,0x97,0x51, +0xe0,0xff,0xc3,0x94,0x00,0x50,0x03,0x02,0x58,0x23,0x74,0x01,0x7e,0x00,0xa8,0x07, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24, +0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60, +0x0a,0x90,0x97,0x51,0xe0,0x24,0x10,0xa3,0xf0,0x80,0x68,0x90,0x97,0x51,0xe0,0x14, +0xf0,0x80,0xba,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x47,0x90,0x97,0x51,0x74,0x0f,0xf0,0x90,0x97,0x51, +0xe0,0xff,0xc3,0x94,0x00,0x40,0x3c,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97, +0x51,0xe0,0xa3,0xf0,0x80,0x0d,0x90,0x97,0x51,0xe0,0x14,0xf0,0x80,0xbf,0xe4,0x90, +0x97,0x52,0xf0,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x4e,0x60,0x47,0xe4,0x90,0x97,0x51,0xf0,0x90,0x97,0x51,0xe0, +0xff,0xc3,0x94,0x10,0x40,0x03,0x02,0x58,0xdd,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08, +0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0xe4, +0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x06, +0x90,0x97,0x51,0xe0,0x80,0x63,0x90,0x97,0x51,0xe0,0x04,0xf0,0x80,0xbe,0xe5,0x10, +0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0x4e, +0x60,0x46,0xe4,0x90,0x97,0x51,0xf0,0x90,0x97,0x51,0xe0,0xff,0xc3,0x94,0x0c,0x50, +0x3c,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8, +0xf9,0xff,0xe5,0x10,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0, +0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x08,0x90,0x97,0x51,0xe0,0x24,0x10,0x80,0x09, +0x90,0x97,0x51,0xe0,0x04,0xf0,0x80,0xbf,0xe4,0x90,0x97,0x53,0xf0,0x90,0x97,0x52, +0xe0,0xff,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34,0x93,0xf5, +0x83,0xef,0xf0,0x90,0x97,0x53,0xe0,0xfe,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x68, +0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xee,0xf0,0x74,0x84,0x25,0x10,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xe0,0xd3,0x9f,0x40,0x1f,0x90,0x97,0x52,0xe0,0xff,0x74,0x84, +0x25,0x10,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xef,0xf0,0x74,0x84,0x25,0x10,0xf5, +0x82,0xe4,0x34,0x04,0xf5,0x83,0xef,0xf0,0x90,0x97,0x52,0xe0,0xff,0xd3,0x94,0x13, +0x40,0x08,0x90,0x93,0x62,0x74,0x03,0xf0,0x80,0x21,0xef,0xd3,0x94,0x0b,0x40,0x08, +0x90,0x93,0x62,0x74,0x02,0xf0,0x80,0x13,0xef,0xd3,0x94,0x03,0x40,0x08,0x90,0x93, +0x62,0x74,0x01,0xf0,0x80,0x05,0xe4,0x90,0x93,0x62,0xf0,0x90,0x93,0x62,0xe0,0x90, +0x04,0xb1,0xf0,0xe5,0x10,0x25,0xe0,0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83, +0xe0,0xff,0xa3,0xe0,0x90,0x04,0x9c,0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x10,0x25,0xe0, +0x24,0x81,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0xff,0xa3,0xe0,0x90,0x04,0x9e, +0xcf,0xf0,0xa3,0xef,0xf0,0xe5,0x10,0x75,0xf0,0x08,0xa4,0x24,0x69,0xf5,0x82,0xe4, +0x34,0x93,0xf5,0x83,0xe0,0xc4,0x33,0x54,0xe0,0x45,0x10,0x90,0x04,0xa0,0xf0,0x74, +0xc1,0x25,0x10,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0xe0,0x90,0x04,0xa1,0xf0,0x22, +0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0, +0x01,0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4, +0x74,0xd0,0xf0,0x74,0x59,0xa3,0xf0,0x90,0x01,0x37,0xe0,0x55,0x2b,0xf5,0x2f,0x90, +0x01,0x34,0xe0,0x55,0x28,0xf5,0x2c,0x90,0x01,0x36,0xe0,0x55,0x2a,0xf5,0x2e,0xe5, +0x2c,0x20,0xe0,0x03,0x02,0x5b,0x82,0x90,0x01,0x34,0x74,0x01,0xf0,0x85,0xd1,0x4d, +0x85,0xd2,0x4e,0x85,0xd3,0x4f,0x85,0xd4,0x50,0x85,0xd5,0x51,0x85,0xd6,0x52,0x85, +0xd7,0x53,0x85,0xd9,0x54,0xe5,0x54,0x54,0x40,0xc3,0x13,0xff,0xe5,0x53,0x54,0x20, +0x6f,0x70,0x03,0x02,0x5b,0x2f,0xe5,0x54,0x30,0xe5,0x03,0x02,0x5b,0x2f,0xe5,0x52, +0x54,0x1f,0xf5,0x08,0xe5,0x4d,0x54,0x3f,0xf5,0x09,0xe5,0x51,0x54,0x1f,0xff,0xe5, +0x08,0x25,0xe0,0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f,0xf0,0x12, +0x65,0xc9,0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xc0,0xf5,0x82,0xe4, +0x34,0x91,0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x65,0xc9,0xe5,0x09,0xd3,0x94,0x04,0x40, +0x03,0x75,0x09,0x04,0x75,0xf0,0x0a,0xe5,0x08,0xa4,0x24,0x00,0xf5,0x82,0xe5,0xf0, +0x34,0x90,0xf5,0x83,0x75,0xf0,0x02,0xe5,0x09,0x12,0x66,0xb5,0xe0,0xfe,0xa3,0xe0, +0xff,0xe5,0x53,0x54,0x1f,0x2f,0xff,0xe4,0x3e,0xfe,0x75,0xf0,0x0a,0xe5,0x08,0xa4, +0x24,0x00,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0x75,0xf0,0x02,0xe5,0x09,0x12, +0x66,0xb5,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x54,0x20,0xe6,0x24,0xe5,0x53,0x54,0x1f, +0xff,0xe5,0x08,0x25,0xe0,0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0x8f, +0xf0,0x12,0x65,0xc9,0xe5,0x4f,0x30,0xe7,0x36,0xaf,0x08,0x12,0x75,0x4c,0x80,0x2f, +0xe5,0x53,0x54,0x1f,0xff,0xe5,0x08,0x25,0xe0,0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94, +0xf5,0x83,0xe4,0x8f,0xf0,0x12,0x65,0xc9,0xe5,0x4f,0x30,0xe7,0x12,0xe5,0x4f,0x54, +0x7f,0xfd,0xe5,0x53,0x54,0x1f,0xf5,0x0d,0xab,0x09,0xaf,0x08,0x12,0x76,0x52,0xe5, +0x65,0x60,0x4f,0x90,0x97,0x8d,0xe0,0x60,0x35,0x90,0x01,0x5b,0xe4,0xf0,0x90,0x01, +0x3c,0x74,0x04,0xf0,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x70,0x34,0x75,0x48, +0x14,0xf5,0x49,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x38,0xec,0x90,0x01,0x5b,0x74, +0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x90,0x97,0x87,0xf0,0x80,0x14,0x90,0x04, +0x1b,0xe0,0x54,0x7f,0xff,0xbf,0x7f,0x0a,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12, +0x6e,0xda,0xe5,0x2c,0x30,0xe1,0x21,0x90,0x01,0x34,0x74,0x02,0xf0,0x85,0xd1,0x56, +0x85,0xd2,0x57,0x85,0xd3,0x58,0x85,0xd4,0x59,0x85,0xd5,0x5a,0x85,0xd6,0x5b,0x85, +0xd7,0x5c,0x85,0xd9,0x5d,0x12,0x7d,0xc4,0xe5,0x2c,0x30,0xe3,0x06,0x90,0x01,0x34, +0x74,0x08,0xf0,0xe5,0x2c,0x30,0xe4,0x09,0x90,0x01,0x34,0x74,0x10,0xf0,0x43,0x55, +0x10,0xe5,0x2c,0x30,0xe5,0x21,0x90,0x01,0xcf,0xe0,0x30,0xe5,0x1a,0xe0,0x54,0xdf, +0xf0,0x90,0x01,0x34,0x74,0x20,0xf0,0x90,0x00,0x03,0xe0,0x54,0xfb,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x80,0xfe,0xe5,0x2c,0x30,0xe6,0x06,0x90,0x01,0x34,0x74, +0x40,0xf0,0xe5,0x2e,0x30,0xe1,0x09,0x90,0x01,0x36,0x74,0x02,0xf0,0x43,0x55,0x40, +0xe5,0x2e,0x30,0xe0,0x09,0x90,0x01,0x36,0x74,0x01,0xf0,0x12,0x76,0xd3,0xe5,0x2e, +0x30,0xe2,0x63,0x90,0x01,0x36,0x74,0x04,0xf0,0xe5,0x64,0x64,0x01,0x70,0x57,0xe5, +0x65,0x60,0x53,0xe5,0x65,0x64,0x02,0x70,0x27,0x90,0x06,0xab,0xe0,0x90,0x97,0x7f, +0xf0,0x90,0x06,0xaa,0xe0,0x90,0x97,0x8a,0xf0,0x90,0x97,0x7f,0xe0,0x70,0x07,0x90, +0x97,0x8a,0xe0,0xff,0x80,0x05,0x90,0x97,0x7f,0xe0,0xff,0x90,0x97,0x7f,0xef,0xf0, +0x90,0x97,0x81,0xe0,0x60,0x03,0xe0,0x14,0xf0,0x90,0x97,0x80,0xe4,0xf0,0x90,0x01, +0x57,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8f,0xe0,0x54,0xfd,0xf0,0xe0, +0x54,0xef,0xf0,0x12,0x77,0x49,0xe5,0x2e,0x30,0xe3,0x31,0x90,0x01,0x36,0x74,0x08, +0xf0,0xe5,0x64,0x64,0x01,0x70,0x25,0xe5,0x65,0x60,0x21,0x90,0x01,0x57,0xe4,0xf0, +0x90,0x01,0x3c,0x74,0x02,0xf0,0x75,0x48,0x03,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f, +0x54,0x7e,0x01,0x12,0x38,0xec,0x90,0x01,0x57,0x74,0x05,0xf0,0xe5,0x2e,0x30,0xe4, +0x3a,0x90,0x01,0x36,0x74,0x10,0xf0,0xe5,0x64,0x64,0x01,0x70,0x2e,0xe5,0x65,0x60, +0x2a,0x90,0x01,0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x90,0x97,0x8e,0xe4, +0xf0,0x90,0x97,0x8f,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x03,0x70,0x0e,0x90,0x97,0x89, +0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x2e,0x30,0xe5,0x12, +0x90,0x01,0x36,0x74,0x20,0xf0,0xe5,0x64,0xb4,0x01,0x07,0xe5,0x65,0x60,0x03,0x12, +0x7e,0x7e,0xe5,0x2e,0x30,0xe6,0x2a,0x90,0x01,0x36,0x74,0x40,0xf0,0xe5,0x64,0x64, +0x01,0x70,0x1e,0xe5,0x65,0x60,0x1a,0x90,0x97,0x8f,0xe0,0x54,0xfe,0xf0,0xe0,0x54, +0x03,0x70,0x0e,0x90,0x97,0x89,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e, +0xda,0xe5,0x2f,0x30,0xe1,0x09,0x90,0x01,0x37,0x74,0x02,0xf0,0x12,0x7c,0xe8,0x74, +0xd0,0x04,0x90,0x01,0xc4,0xf0,0x74,0x59,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05, +0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83, +0xd0,0xf0,0xd0,0xe0,0x32,0x74,0x5d,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x65,0xf0,0x90, +0x04,0x44,0x74,0x11,0xf0,0xa3,0x74,0xf0,0xf0,0xa3,0x74,0x0f,0xf0,0xa3,0xe4,0xf0, +0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xff,0xc3,0x94,0x10,0x50,0x14,0x74,0xa4, +0x2f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xe4,0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0, +0x80,0xe2,0xe4,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xfb,0xc3,0x94,0x20,0x40, +0x03,0x02,0x5f,0x6c,0xe0,0xff,0x75,0xf0,0x0a,0xa4,0x24,0x00,0xf5,0x82,0xe5,0xf0, +0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xef,0xa4,0x24,0x02,0xf5, +0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0,0x0a,0xef,0xa4, +0x24,0x04,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x75,0xf0, +0x0a,0xef,0xa4,0x24,0x06,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83,0xe4,0xf0,0xa3, +0xf0,0x75,0xf0,0x0a,0xef,0xa4,0x24,0x08,0xf5,0x82,0xe5,0xf0,0x34,0x90,0xf5,0x83, +0xe4,0xf0,0xa3,0xf0,0x74,0x84,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0x74,0x13, +0xf0,0x74,0x44,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xef,0x25,0xe0, +0x24,0xc0,0xf5,0x82,0xe4,0x34,0x91,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0x63,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0xe3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0xa3,0xf5,0x82,0xe4,0x34,0x94,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0x64,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0xef,0x25,0xe0, +0x24,0xa4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x74,0x44,0x2f, +0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4,0xf0,0x74,0x24,0x2f,0xf5,0x82,0xe4,0x34, +0x96,0xf5,0x83,0xe4,0xf0,0x74,0x64,0x2f,0xf5,0x82,0xe4,0x34,0x96,0xf5,0x83,0xe4, +0xf0,0x90,0x41,0xc4,0x93,0xfe,0x74,0x01,0x93,0xff,0x90,0x41,0x8c,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xeb,0x25, +0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0xeb, +0x75,0xf0,0x08,0xa4,0x24,0x6a,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01,0xf0, +0xeb,0x75,0xf0,0x08,0xa4,0x24,0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01, +0xf0,0x74,0xc1,0x2b,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x74,0x0c,0xf0,0xeb,0x75, +0xf0,0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0xff,0xf0,0xa3, +0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x63,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe4, +0xf0,0xa3,0x74,0x0f,0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5,0x82,0xe4,0x34, +0x93,0xf5,0x83,0x74,0x13,0xf0,0xeb,0x75,0xf0,0x08,0xa4,0x24,0x68,0xf5,0x82,0xe4, +0x34,0x93,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x2b,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83, +0x74,0x13,0xf0,0x90,0x97,0x3a,0xe0,0x04,0xf0,0x02,0x5d,0xa7,0x22,0x8f,0x17,0x74, +0x5f,0x90,0x01,0xc4,0xf0,0xa3,0x74,0x6d,0xf0,0x74,0x84,0x25,0x17,0xf5,0x82,0xe4, +0x34,0x04,0xf5,0x83,0xe0,0x54,0x7f,0x90,0x97,0x54,0xf0,0xe0,0x54,0x1f,0xff,0x90, +0x97,0x57,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x68,0xf5,0x82,0xe4,0x34,0x93, +0xf5,0x83,0xe0,0x90,0x97,0x59,0xf0,0xe5,0x17,0x75,0xf0,0x08,0xa4,0x24,0x67,0xf5, +0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xfe,0x90,0x97,0x5a,0xf0,0xe5,0x17,0x25,0xe0, +0x24,0xe4,0xf5,0x82,0xe4,0x34,0x95,0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5b, +0xcb,0xf0,0xa3,0xeb,0xf0,0xe5,0x17,0x25,0xe0,0x24,0x81,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe0,0xfb,0xa3,0xe0,0x90,0x97,0x5d,0xcb,0xf0,0xa3,0xeb,0xf0,0xef,0xd3, +0x9e,0x40,0x0c,0x90,0x97,0x5a,0xe0,0x90,0x97,0x57,0xf0,0x90,0x97,0x54,0xf0,0xed, +0x70,0x03,0x02,0x60,0xd9,0x90,0x97,0x58,0xed,0xf0,0x90,0x97,0x54,0xe0,0x30,0xe6, +0x0e,0x90,0x97,0x57,0xe0,0x90,0x97,0x54,0xf0,0x90,0x97,0x58,0xe0,0x14,0xf0,0x90, +0x97,0x58,0xe0,0x70,0x03,0x02,0x60,0xd9,0x90,0x97,0x57,0xe0,0xff,0xd3,0x94,0x00, +0x50,0x03,0x02,0x60,0xd9,0xe4,0x90,0x97,0x56,0xf0,0xef,0x14,0x90,0x97,0x55,0xf0, +0x90,0x97,0x59,0xe0,0xfd,0x90,0x97,0x55,0xe0,0xff,0xd3,0x9d,0x40,0x6f,0xef,0x94, +0x10,0x40,0x21,0xef,0x24,0xf0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x97,0x5d,0xe0,0x5e,0xfe,0xa3,0xe0, +0x5f,0x4e,0x70,0x27,0x90,0x97,0x55,0xe0,0xff,0xc3,0x94,0x10,0x50,0x37,0x74,0x01, +0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90, +0x97,0x5b,0xe0,0x5e,0xfe,0xa3,0xe0,0x5f,0x4e,0x60,0x1a,0x90,0x97,0x55,0xe0,0x90, +0x97,0x54,0xf0,0x90,0x97,0x56,0xe0,0x04,0xf0,0x90,0x97,0x58,0xe0,0xff,0x90,0x97, +0x56,0xe0,0x6f,0x60,0x08,0x90,0x97,0x55,0xe0,0x14,0xf0,0x80,0x83,0x90,0x97,0x58, +0xe0,0xff,0x90,0x97,0x56,0xe0,0xc3,0x9f,0x50,0x0f,0x90,0x97,0x55,0xe0,0xb5,0x05, +0x08,0x90,0x97,0x59,0xe0,0x90,0x97,0x54,0xf0,0x90,0x97,0x54,0xe0,0xff,0x25,0xe0, +0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfc,0x74,0x01,0x93,0xfd, +0xef,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93,0x2d, +0xff,0xe4,0x93,0x3c,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xe5,0x17,0x25, +0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9,0x90, +0x97,0x54,0xe0,0xff,0x74,0x84,0x25,0x17,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xef, +0xf0,0x22,0x90,0x01,0xc4,0x74,0x32,0xf0,0x74,0x61,0xa3,0xf0,0x90,0x01,0xcc,0xe0, +0x54,0x0f,0x90,0x97,0x3a,0xf0,0x90,0x97,0x3a,0xe0,0xfd,0x70,0x03,0x02,0x62,0xd2, +0x90,0x97,0xb1,0xe0,0xff,0x74,0x01,0x7e,0x00,0xa8,0x07,0x08,0x80,0x05,0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xff,0xef,0x5d,0x70,0x03,0x02,0x62,0xb3,0x90,0x97,0xb1, +0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd0,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0, +0x90,0x97,0x3b,0xf0,0xa2,0xaf,0xe4,0x33,0xa3,0xf0,0xc2,0xaf,0x75,0x24,0x01,0x75, +0x25,0x97,0x75,0x26,0x3b,0x75,0x27,0x01,0x7b,0x01,0x7a,0x97,0x79,0x3d,0x12,0x79, +0x27,0x90,0x97,0x3c,0xe0,0x24,0xff,0x92,0xaf,0xa3,0xe0,0xff,0xc4,0x13,0x13,0x13, +0x54,0x01,0x90,0x97,0xb1,0x30,0xe0,0x70,0xe0,0x75,0xf0,0x02,0xa4,0x24,0x88,0xf5, +0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe0,0x90,0x97,0x3e,0xf0,0x90,0x97,0xb1,0xe0,0x75, +0xf0,0x02,0xa4,0x24,0x89,0xf5,0x82,0xe4,0x35,0xf0,0xf5,0x83,0xe0,0x90,0x97,0x3f, +0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd1,0xf5,0x82,0xe5,0xf0,0x34, +0x01,0xf5,0x83,0xe0,0x90,0x97,0x40,0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4, +0x24,0xd2,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x41,0xf0,0x90, +0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd3,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5, +0x83,0xe0,0x90,0x97,0x42,0xf0,0x80,0x42,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd1,0xf5, +0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x3e,0xf0,0x90,0x97,0xb1,0xe0, +0x75,0xf0,0x04,0xa4,0x24,0xd2,0xf5,0x82,0xe5,0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90, +0x97,0x3f,0xf0,0x90,0x97,0xb1,0xe0,0x75,0xf0,0x04,0xa4,0x24,0xd3,0xf5,0x82,0xe5, +0xf0,0x34,0x01,0xf5,0x83,0xe0,0x90,0x97,0x40,0xf0,0xef,0x54,0x7f,0xff,0x7b,0x01, +0x7a,0x97,0x79,0x3e,0x12,0x6e,0x02,0x90,0x97,0x3a,0xe0,0xff,0x90,0x97,0xb1,0xe0, +0xfe,0x74,0x01,0xa8,0x06,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x90,0x97, +0x3a,0xf0,0x90,0x97,0xb1,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0x90,0x01,0xcc,0xf0,0x90,0x97,0xb1,0xe0,0x04,0xf0,0xe0,0x54,0x03,0xf0, +0x02,0x61,0x46,0xc2,0xaf,0x74,0x32,0x04,0x90,0x01,0xc4,0xf0,0x74,0x61,0xa3,0xf0, +0x90,0x97,0x3a,0xe0,0x90,0x01,0xc6,0xf0,0x90,0x97,0xb1,0xe0,0x90,0x01,0xc7,0xf0, +0x80,0xfe,0x22,0xe4,0x90,0x97,0x37,0xf0,0xa3,0xf0,0x12,0x7a,0x6c,0x90,0x00,0x02, +0xe0,0x54,0xe0,0x90,0x97,0x96,0x60,0x05,0x74,0x01,0xf0,0x80,0x03,0x74,0x02,0xf0, +0x90,0x00,0xf3,0xe0,0x30,0xe3,0x08,0x90,0x97,0x97,0x74,0x01,0xf0,0x80,0x05,0xe4, +0x90,0x97,0x97,0xf0,0x90,0x97,0x97,0xe0,0xb4,0x01,0x13,0x90,0x00,0xf2,0xe0,0x30, +0xe7,0x0c,0x90,0x97,0x90,0x74,0xfd,0xf0,0xa3,0x74,0x33,0xf0,0x80,0x0a,0x90,0x97, +0x90,0x74,0xfd,0xf0,0xa3,0x74,0x2f,0xf0,0xe4,0xf5,0x55,0x12,0x5d,0x65,0x12,0x7f, +0x60,0x12,0x79,0xce,0x12,0x36,0xd1,0x12,0x44,0xff,0x75,0x28,0x33,0xe4,0xf5,0x29, +0x75,0x2a,0x02,0xf5,0x2b,0x90,0x01,0x30,0xe5,0x28,0xf0,0xa3,0xe5,0x29,0xf0,0xa3, +0xe5,0x2a,0xf0,0xa3,0xe5,0x2b,0xf0,0x90,0x00,0xf3,0xe0,0x30,0xe2,0x0d,0x90,0x05, +0x41,0x74,0x10,0xf0,0x90,0x05,0x5a,0xf0,0xa3,0xe4,0xf0,0x90,0x01,0x64,0x74,0xa0, +0xf0,0x75,0x48,0xff,0xe4,0xf5,0x49,0xfb,0x7d,0x01,0x7f,0x50,0x7e,0x01,0x12,0x38, +0xec,0x75,0x30,0x1f,0x75,0x31,0x01,0xe4,0xf5,0x32,0x90,0x01,0x38,0xe5,0x30,0xf0, +0xa3,0xe5,0x31,0xf0,0xa3,0xe5,0x32,0xf0,0x12,0x78,0xd0,0x90,0x97,0x39,0xe5,0xd9, +0xf0,0x90,0x01,0x3c,0x74,0xff,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0x34,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0xaf,0x90,0x00,0x80,0xe0,0x44,0x40,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x75,0xe8,0x03,0x43,0xa8,0x85,0xd2,0xaf,0x90,0x01,0xc0, +0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x01,0xc6,0xf0,0xa3,0xf0,0x90,0x97, +0x37,0xe0,0x64,0x01,0xf0,0x24,0xd3,0x90,0x01,0xc4,0xf0,0x74,0x62,0xa3,0xf0,0xe5, +0x55,0x30,0xe6,0x17,0xc2,0xaf,0x53,0x55,0xbf,0xd2,0xaf,0x12,0x45,0x09,0x90,0x97, +0x6d,0xe0,0xff,0x60,0x03,0xb4,0x01,0x03,0x12,0x6a,0x1f,0xe5,0x55,0x30,0xe7,0x07, +0xc2,0xaf,0x53,0x55,0x7f,0xd2,0xaf,0xe5,0x55,0x30,0xe4,0x0a,0xc2,0xaf,0x53,0x55, +0xef,0xd2,0xaf,0x12,0x61,0x32,0x90,0x97,0x6d,0xe0,0x70,0x03,0x12,0x6d,0x29,0x12, +0x7d,0x45,0x80,0xaa,0x90,0x00,0x02,0x12,0x1c,0xef,0x90,0x97,0x6b,0xf0,0x90,0x00, +0x01,0x12,0x1c,0xef,0x25,0xe0,0x25,0xe0,0x90,0x97,0x6a,0xf0,0x12,0x1c,0xd6,0x25, +0xe0,0x25,0xe0,0x90,0x97,0x6e,0xf0,0x90,0x97,0x6b,0xe0,0x90,0x04,0x98,0xf0,0x90, +0x97,0x6a,0xe0,0x13,0x13,0x54,0x3f,0x90,0x04,0x99,0xf0,0x90,0x97,0x6e,0xe0,0x13, +0x13,0x54,0x3f,0x90,0x04,0x9a,0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x79,0xf0,0x90, +0x05,0x61,0xe0,0x90,0x97,0x7a,0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x7b,0xf0,0x90, +0x05,0x63,0xe0,0x90,0x97,0x7c,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x49,0xf0,0xc2, +0xaf,0x90,0x97,0x6a,0xe0,0xff,0x12,0x79,0x7c,0x90,0x97,0x49,0xe0,0x24,0xff,0x92, +0xaf,0x90,0x97,0x6b,0xe0,0x70,0x03,0x02,0x65,0x61,0x90,0x97,0x6a,0xe0,0x70,0x03, +0x02,0x65,0x61,0x90,0x97,0x6e,0xe0,0x70,0x03,0x02,0x65,0x61,0xa2,0xaf,0xe4,0x33, +0x90,0x97,0x49,0xf0,0xc2,0xaf,0x90,0x97,0x7d,0x74,0x01,0xf0,0x90,0x97,0x49,0xe0, +0x24,0xff,0x92,0xaf,0x90,0x00,0x45,0xe0,0x54,0xfe,0xf0,0xa3,0xe0,0x44,0x01,0xf0, +0x90,0x97,0x63,0xe0,0x60,0x1d,0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33, +0xd8,0x80,0x06,0x90,0x05,0x22,0x74,0x7f,0xf0,0x90,0x00,0x45,0xe0,0x54,0xef,0xf0, +0x90,0x05,0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x79,0xe0,0x90,0x05,0x84,0xf0,0x90, +0x97,0x7a,0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x7b,0xe0,0x90,0x05,0x86,0xf0,0x90, +0x97,0x7c,0xe0,0x90,0x05,0x87,0xf0,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x49,0xf0,0xc2, +0xaf,0x90,0x01,0x3c,0xe0,0x44,0x20,0xf0,0x7d,0x20,0xe4,0xff,0x12,0x3a,0x49,0x80, +0x2b,0x90,0x97,0x6b,0xe0,0x70,0x2d,0x90,0x97,0x7d,0xf0,0x90,0x00,0x45,0xe0,0x54, +0xfe,0xf0,0xa3,0xe0,0x54,0xfe,0xf0,0x90,0x05,0x22,0xe4,0xf0,0xa2,0xaf,0x33,0x90, +0x97,0x49,0xf0,0xc2,0xaf,0x7d,0x20,0xe4,0xff,0x12,0x39,0xdb,0x90,0x97,0x49,0xe0, +0x24,0xff,0x92,0xaf,0x22,0xbb,0x01,0x06,0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x02, +0xf7,0x22,0xbb,0xfe,0x01,0xf3,0x22,0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22, +0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8,0xf2,0x22,0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0, +0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0,0x38,0xf0,0x22,0xa3, +0xf8,0xe0,0xc5,0xf0,0x25,0xf0,0xf0,0xe5,0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xe0, +0xc8,0x38,0xf0,0xe8,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xe0,0xf5,0xf0,0xa3, +0xe0,0x22,0x50,0x06,0x87,0xf0,0x09,0xe7,0x19,0x22,0xbb,0xfe,0x07,0xe3,0xf5,0xf0, +0x09,0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4,0x93,0xf5,0xf0,0x74,0x01,0x93,0x22, +0xbb,0x01,0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0, +0xa3,0xe0,0x22,0x50,0x09,0xe9,0x25,0x82,0xf8,0x86,0xf0,0x08,0xe6,0x22,0xbb,0xfe, +0x0a,0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x08,0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83, +0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xf0, +0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7,0x09,0xa7,0xf0,0x19,0x22,0xbb,0xfe,0x06, +0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22,0xf8,0xbb,0x01,0x11,0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x09,0xe9,0x25, +0x82,0xc8,0xf6,0x08,0xa6,0xf0,0x22,0xbb,0xfe,0x09,0xe9,0x25,0x82,0xc8,0xf2,0xe5, +0xf0,0x08,0xf2,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0, +0xe8,0x9c,0x45,0xf0,0x22,0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83, +0x22,0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3, +0xa3,0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68, +0x60,0xef,0xa3,0xa3,0xa3,0x80,0xdf,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0,0xa3, +0xe9,0xf0,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x04, +0x12,0x1c,0xef,0xff,0x54,0x1f,0x90,0x97,0x49,0xf0,0x90,0x00,0x03,0x12,0x1c,0xef, +0x54,0xf0,0xc4,0x54,0x0f,0x90,0x97,0x4a,0xf0,0xef,0x54,0x20,0xc4,0x13,0x54,0x07, +0xa3,0xf0,0x90,0x97,0x49,0xe0,0xff,0x75,0xf0,0x08,0xa4,0x24,0x65,0xf5,0x82,0xe4, +0x34,0x93,0xad,0x82,0x90,0x97,0x4c,0xf0,0xa3,0xed,0xf0,0xef,0x75,0xf0,0x08,0xa4, +0x24,0x63,0xf9,0x74,0x93,0x35,0xf0,0xfa,0xa3,0x74,0x01,0xf0,0xa3,0xea,0xf0,0xa3, +0xe9,0xf0,0x90,0x97,0x46,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x03,0x12,0x1c, +0xef,0x54,0x0f,0xff,0x90,0x97,0x4e,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0xef, +0x12,0x65,0x95,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00, +0x02,0x12,0x1c,0xef,0xff,0x90,0x97,0x4e,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9, +0x90,0x00,0x01,0xef,0x12,0x65,0xa7,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, +0xe0,0xf9,0x90,0x00,0x01,0x12,0x1c,0xef,0xff,0x90,0x97,0x4c,0xe0,0xfc,0xa3,0xe0, +0xfd,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x12,0x1c,0xd6,0x8d,0x82,0x8c,0x83,0xa3,0xf0, +0x90,0x97,0x4a,0xe0,0xfe,0x90,0x97,0x49,0xe0,0xff,0x24,0xc1,0xf5,0x82,0xe4,0x34, +0x92,0xf5,0x83,0xee,0xf0,0x90,0x97,0x4b,0xe0,0xfe,0xef,0x75,0xf0,0x08,0xa4,0x24, +0x69,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xee,0xf0,0xef,0x75,0xf0,0x08,0xa4,0x24, +0x6a,0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0x74,0x01,0xf0,0x02,0x54,0xe6,0xc0,0xe0, +0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0, +0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xfe, +0xf0,0x74,0x67,0xa3,0xf0,0x53,0x91,0xdf,0x90,0x01,0x3c,0xe0,0x55,0x30,0xf5,0x34, +0xa3,0xe0,0x55,0x31,0xf5,0x35,0xa3,0xe0,0x55,0x32,0xf5,0x36,0xe5,0x34,0x30,0xe0, +0x0f,0x90,0x01,0x3c,0x74,0x01,0xf0,0x90,0x01,0x53,0x74,0x07,0xf0,0x43,0x55,0x80, +0xe5,0x34,0x30,0xe1,0x09,0x90,0x01,0x3c,0x74,0x02,0xf0,0x12,0x7b,0x00,0xe5,0x34, +0x30,0xe2,0x3a,0x90,0x01,0x3c,0x74,0x04,0xf0,0x90,0x06,0x92,0xe0,0x30,0xe0,0x1e, +0x75,0x48,0x14,0x75,0x49,0x00,0xe4,0xfb,0xfd,0x7f,0x58,0x7e,0x01,0x12,0x38,0xec, +0x90,0x01,0x5b,0x74,0x05,0xf0,0x90,0x06,0x92,0x74,0x01,0xf0,0x80,0x0f,0x90,0x97, +0x87,0xe4,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x34,0x30, +0xe3,0x06,0x90,0x01,0x3c,0x74,0x08,0xf0,0xe5,0x34,0x30,0xe4,0x09,0x90,0x01,0x3c, +0x74,0x10,0xf0,0x12,0x7e,0xdf,0xe5,0x34,0x30,0xe5,0x09,0x90,0x01,0x3c,0x74,0x20, +0xf0,0x12,0x6f,0xa2,0xe5,0x35,0x30,0xe0,0x15,0x90,0x01,0x3d,0x74,0x01,0xf0,0x90, +0x00,0x83,0xe0,0x90,0x97,0x8b,0xf0,0xe0,0xff,0x7d,0x01,0x12,0x6e,0xda,0xe5,0x36, +0x30,0xe3,0x06,0x90,0x01,0x3e,0x74,0x08,0xf0,0x74,0xfe,0x04,0x90,0x01,0xc4,0xf0, +0x74,0x67,0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02, +0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x8b, +0x10,0x8a,0x11,0x89,0x12,0x90,0x00,0x02,0x12,0x1c,0xef,0x90,0x97,0x6c,0xf0,0xe0, +0x90,0x04,0x94,0xf0,0x90,0x00,0x01,0x12,0x1c,0xef,0x90,0x04,0x95,0xf0,0x90,0x97, +0x6c,0xe0,0x30,0xe0,0x74,0x90,0x97,0x63,0x74,0x01,0xf0,0x7f,0x80,0x7e,0x08,0x12, +0x2b,0x13,0x90,0x97,0x65,0x12,0x1d,0xa9,0xab,0x10,0xaa,0x11,0xa9,0x12,0x90,0x00, +0x01,0x12,0x1c,0xef,0xff,0xe4,0xfc,0xfd,0xfe,0x78,0x1a,0x12,0x1d,0x96,0xa8,0x04, +0xa9,0x05,0xaa,0x06,0xab,0x07,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0, +0xfe,0xa3,0xe0,0xff,0xec,0x54,0x03,0xfc,0xeb,0x4f,0xff,0xea,0x4e,0xfe,0xe9,0x4d, +0xfd,0xe8,0x4c,0xfc,0x90,0x97,0x6f,0x12,0x1d,0xa9,0x90,0x05,0x22,0xe4,0xf0,0x90, +0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x78,0x18,0x12, +0x1d,0x83,0x90,0x04,0x96,0xef,0xf0,0x80,0x45,0xe4,0x90,0x97,0x63,0xf0,0x7f,0x80, +0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x65,0x12,0x1d,0xa9,0x90,0x97,0x65,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0xec,0x44,0xc0,0xfc,0x90,0x97,0x65, +0x12,0x1d,0xa9,0x90,0x97,0x65,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0, +0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97, +0x6c,0xe0,0x90,0x00,0x47,0x30,0xe1,0x11,0x74,0x0c,0xf0,0xa3,0xe0,0x44,0x0c,0xf0, +0x90,0x00,0x46,0xe0,0x44,0x10,0xf0,0x80,0x10,0xe0,0x54,0xf3,0xf0,0xa3,0xe0,0x54, +0xf3,0xf0,0x90,0x00,0x46,0xe0,0x54,0xef,0xf0,0xe4,0x90,0x97,0x69,0xf0,0x22,0x90, +0x97,0x64,0xe0,0xc3,0x94,0x14,0x50,0x06,0xe0,0x04,0xf0,0x02,0x6a,0xd9,0x90,0x97, +0x64,0xe0,0x64,0x14,0x60,0x03,0x02,0x6a,0xd9,0x90,0x97,0x73,0xe0,0x70,0x25,0x90, +0x97,0x76,0xe0,0x70,0x1f,0x90,0x97,0x74,0xe0,0x70,0x19,0x90,0x97,0x77,0xe0,0x70, +0x13,0x90,0x97,0x75,0xe0,0x70,0x0d,0x90,0x97,0x78,0xe0,0x70,0x07,0x90,0x04,0xfd, +0xe0,0x54,0xfe,0xf0,0x90,0x97,0x73,0xe0,0x90,0x04,0x88,0xf0,0x90,0x97,0x74,0xe0, +0x90,0x04,0x89,0xf0,0x90,0x97,0x75,0xe0,0x90,0x04,0x8a,0xf0,0xa3,0xe4,0xf0,0x90, +0x97,0x76,0xe0,0x90,0x04,0x8c,0xf0,0x90,0x97,0x77,0xe0,0x90,0x04,0x8d,0xf0,0x90, +0x97,0x78,0xe0,0x90,0x04,0x8e,0xf0,0xa3,0xe4,0xf0,0x90,0x97,0x5f,0xe0,0x90,0x04, +0x90,0xf0,0x90,0x97,0x60,0xe0,0x90,0x04,0x91,0xf0,0x90,0x97,0x61,0xe0,0x90,0x04, +0x92,0xf0,0x90,0x97,0x62,0xe0,0x90,0x04,0x93,0xf0,0xe4,0x90,0x97,0x64,0xf0,0x90, +0x97,0x5f,0x04,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97,0x73,0xf0,0xa3, +0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x97,0x64,0xe0,0x90,0x04,0x97, +0xf0,0x90,0x05,0x60,0xe0,0x90,0x97,0x3a,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x3b, +0xf0,0x90,0x05,0x62,0xe0,0x90,0x97,0x3c,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x3d, +0xf0,0x90,0x97,0x7c,0xe0,0xff,0x90,0x97,0x3d,0xe0,0xfe,0xd3,0x9f,0x50,0x0b,0x90, +0x97,0x7c,0xe0,0xc3,0x9e,0xd3,0x94,0x01,0x40,0x11,0x90,0x97,0x6a,0xe0,0xb4,0x01, +0x02,0x80,0x03,0x90,0x97,0x6e,0xe0,0xff,0x12,0x79,0x7c,0x22,0x90,0x97,0xb0,0xed, +0xf0,0x90,0x97,0xaf,0xef,0xf0,0xd3,0x94,0x07,0x50,0x6d,0xe0,0xff,0x74,0x01,0xa8, +0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0, +0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x46,0xe0,0x4f,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb0,0xe0,0x60,0x16,0x90,0x97,0xaf,0xe0,0xff, +0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90,0x00,0x45,0x80, +0x78,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8, +0xfc,0xf4,0xff,0x90,0x00,0x45,0x80,0x7d,0x90,0x97,0xaf,0xe0,0x24,0xf8,0xf0,0xe0, +0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0,0xf4, +0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97, +0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xff,0x90, +0x00,0x43,0xe0,0x4f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb0,0xe0, +0x60,0x1b,0x90,0x97,0xaf,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xc4,0x54,0xf0,0xff,0x90,0x00,0x42,0xe0,0x4f,0x80,0x1a,0x90,0x97,0xaf, +0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xc4,0x54,0xf0, +0xf4,0xff,0x90,0x00,0x42,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x22, +0x90,0x01,0xc4,0x74,0x30,0xf0,0x74,0x6c,0xa3,0xf0,0x7f,0x78,0x7e,0x08,0x12,0x2b, +0x13,0x90,0x97,0x1d,0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x2b,0x13,0x90,0x97, +0x21,0x12,0x1d,0xa9,0x7f,0x00,0x7e,0x08,0x12,0x2b,0x13,0x90,0x97,0x25,0x12,0x1d, +0xa9,0x90,0x97,0x97,0xe0,0x90,0x97,0x1d,0xb4,0x01,0x13,0xe0,0xfc,0xa3,0xe0,0xfd, +0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xc7,0xff,0xed,0x54,0xc7,0xfd,0x80,0x0d,0xe0,0xfc, +0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0xc7,0xff,0xec,0x90,0x81,0x56,0x12, +0x1d,0xa9,0x7f,0x78,0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x21,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0x54,0x0f,0xff,0xec,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x25,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3, +0xe0,0xfe,0xa3,0xe0,0x44,0x02,0xff,0xec,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x00, +0x7e,0x08,0x12,0x33,0xd8,0x7f,0x70,0x7e,0x0e,0x12,0x2b,0x13,0x90,0x97,0x29,0x12, +0x1d,0xa9,0x90,0x81,0x56,0x12,0x1d,0xb5,0x00,0x1b,0x25,0xa0,0x7f,0x70,0x7e,0x0e, +0x12,0x33,0xd8,0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x00,0x00,0x00,0xe4,0xfd,0xff, +0x12,0x38,0xb6,0x90,0x97,0x97,0xe0,0xb4,0x01,0x11,0x90,0x81,0x24,0x12,0x1d,0xb5, +0x00,0x00,0x00,0x00,0xe4,0xfd,0x7f,0x01,0x12,0x38,0xb6,0x90,0x00,0x11,0xe0,0x54, +0xf6,0xf0,0x7f,0x10,0x7e,0x00,0x02,0x3a,0xa8,0x90,0x97,0x7d,0xe0,0x64,0x01,0x60, +0x09,0x90,0x97,0x6b,0xe0,0x60,0x03,0x02,0x6e,0x01,0x90,0x97,0x5f,0xe0,0xc3,0x94, +0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x3b,0x90,0x97,0x60,0xe0,0xc3,0x94,0xff,0x50, +0x06,0xe0,0x04,0xf0,0xe4,0x80,0x28,0x90,0x97,0x61,0xe0,0xc3,0x94,0xff,0x50,0x0a, +0xe0,0x04,0xf0,0xe4,0x90,0x97,0x60,0xf0,0x80,0x15,0x90,0x97,0x62,0xe0,0xc3,0x94, +0xff,0x50,0x10,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x61,0xf0,0x90,0x97,0x60,0xf0,0x90, +0x97,0x5f,0xf0,0x90,0x00,0x44,0xe0,0x54,0x0c,0x60,0x76,0xe0,0x30,0xe2,0x32,0x90, +0x97,0x73,0xe0,0xc3,0x94,0xff,0x50,0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x74, +0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0,0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x75,0xe0, +0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04,0xf0,0xe4,0x90,0x97,0x74,0xf0,0x90,0x97,0x73, +0xf0,0x90,0x00,0x44,0xe0,0x30,0xe3,0x32,0x90,0x97,0x76,0xe0,0xc3,0x94,0xff,0x50, +0x05,0xe0,0x04,0xf0,0x80,0x24,0x90,0x97,0x77,0xe0,0xc3,0x94,0xff,0x50,0x06,0xe0, +0x04,0xf0,0xe4,0x80,0x11,0x90,0x97,0x78,0xe0,0xc3,0x94,0xff,0x50,0x0c,0xe0,0x04, +0xf0,0xe4,0x90,0x97,0x77,0xf0,0x90,0x97,0x76,0xf0,0x90,0x04,0xfd,0xe0,0x44,0x01, +0xf0,0x22,0x90,0x97,0x43,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xad,0x07,0x90, +0x01,0xc4,0x74,0x02,0xf0,0x74,0x6e,0xa3,0xf0,0xed,0x12,0x66,0xc1,0x6e,0x3f,0x01, +0x6e,0x4d,0x02,0x6e,0x5b,0x03,0x6e,0x69,0x05,0x6e,0x77,0x06,0x6e,0x85,0x07,0x6e, +0x93,0x09,0x6e,0xa1,0x0c,0x6e,0xaf,0x0d,0x6e,0xbd,0x0e,0x00,0x00,0x6e,0xcb,0x90, +0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7d,0x9d,0x90,0x97,0x43, +0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7f,0x77,0x90,0x97,0x43,0xe0,0xfb, +0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7d,0x17,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0xf9,0x02,0x7c,0x0b,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, +0xe0,0xf9,0x02,0x66,0xe7,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9, +0x02,0x7f,0x28,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x73, +0x14,0x90,0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x64,0x34,0x90, +0x97,0x43,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x7c,0x7e,0x90,0x97,0x43, +0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x02,0x69,0x0f,0xc2,0xaf,0x74,0x02,0x04, +0x90,0x01,0xc4,0xf0,0x74,0x6e,0xa3,0xf0,0x80,0xfe,0x8f,0x62,0x8d,0x63,0x90,0x01, +0xc4,0x74,0xda,0xf0,0x74,0x6e,0xa3,0xf0,0xe5,0x62,0x54,0x0f,0xff,0x90,0x97,0x88, +0xe0,0x54,0x0f,0x6f,0x60,0x78,0xe5,0x62,0x30,0xe2,0x30,0x90,0x97,0x88,0xe0,0x20, +0xe2,0x05,0x7f,0x01,0x12,0x7e,0x08,0x90,0x97,0x88,0xe0,0x30,0xe3,0x0a,0xe5,0x62, +0x20,0xe3,0x05,0x12,0x7e,0x27,0x80,0x56,0x90,0x97,0x88,0xe0,0x20,0xe3,0x4f,0xe5, +0x62,0x30,0xe3,0x4a,0xaf,0x63,0x12,0x7d,0xe8,0x80,0x43,0x90,0x97,0x88,0xe0,0x54, +0x0f,0xff,0xbf,0x0c,0x0e,0xe5,0x62,0x20,0xe3,0x09,0x12,0x7d,0x72,0xef,0x60,0x2e, +0x12,0x7e,0x27,0x90,0x97,0x88,0xe0,0x54,0x0f,0xff,0xbf,0x04,0x0e,0xe5,0x62,0x20, +0xe2,0x09,0x12,0x7b,0x8a,0xef,0x60,0x16,0x12,0x7c,0x47,0x90,0x97,0x88,0xe0,0x54, +0x0f,0xff,0xbf,0x02,0x09,0x12,0x7a,0xb8,0xef,0x60,0x03,0x12,0x7e,0x44,0x90,0x97, +0x88,0xe0,0x54,0x0f,0xff,0x90,0x97,0x8b,0xe0,0x54,0x0f,0x6f,0x70,0x23,0xe0,0x30, +0xe6,0x1f,0x90,0x97,0x88,0xe0,0x54,0x0f,0xff,0x90,0x97,0x7e,0xe0,0xfe,0x4f,0x90, +0x01,0x2f,0xf0,0xee,0x64,0x80,0x90,0x97,0x7e,0xf0,0x90,0x97,0x8b,0xe0,0x54,0xbf, +0xf0,0x22,0x90,0x97,0x6b,0xe0,0x64,0x01,0x60,0x03,0x02,0x70,0x65,0x90,0x00,0x46, +0xe0,0x44,0x01,0xf0,0x90,0x97,0x7d,0xe0,0x70,0x40,0x90,0x97,0x63,0xe0,0x60,0x1d, +0x90,0x97,0x6f,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81, +0x56,0x12,0x1d,0xa9,0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x80,0x06,0x90,0x05,0x22, +0x74,0x7f,0xf0,0x90,0x97,0x6a,0xe0,0xff,0x12,0x79,0x7c,0x90,0x97,0x7d,0x74,0x01, +0xf0,0x90,0x00,0x45,0xe0,0x54,0xfe,0xf0,0x80,0x44,0x90,0x97,0x7d,0xe0,0x64,0x01, +0x70,0x3c,0x90,0x97,0x6e,0xe0,0xff,0x12,0x79,0x7c,0xe4,0x90,0x97,0x7d,0xf0,0x90, +0x00,0x45,0xe0,0x44,0x01,0xf0,0x90,0x97,0x63,0xe0,0x60,0x1d,0x90,0x97,0x65,0xe0, +0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9, +0x7f,0x80,0x7e,0x08,0x12,0x33,0xd8,0x80,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x05, +0x87,0xe0,0x64,0x80,0xf0,0x90,0x97,0x79,0xe0,0x90,0x05,0x84,0xf0,0x90,0x97,0x7a, +0xe0,0x90,0x05,0x85,0xf0,0x90,0x97,0x7b,0xe0,0x90,0x05,0x86,0xf0,0x90,0x97,0x7c, +0xe0,0x90,0x05,0x87,0xf0,0x22,0x90,0x97,0x30,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9, +0xf0,0x90,0x97,0x96,0xe0,0x64,0x02,0x70,0x03,0x02,0x71,0x1b,0x90,0x01,0xaf,0xe0, +0x60,0x09,0x90,0x01,0xc7,0xe0,0x04,0xf0,0xf0,0x80,0xf1,0x90,0x97,0xb3,0xe0,0xff, +0x04,0xf0,0x90,0x97,0x30,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x01, +0xef,0x12,0x65,0xa7,0xa2,0xaf,0xe4,0x33,0x90,0x97,0x36,0xf0,0xc2,0xaf,0x90,0x97, +0x30,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0x8b,0x24,0x8a,0x25,0xf5,0x26,0x75,0x27, +0x02,0x7b,0x01,0x7a,0x01,0x79,0xa0,0x12,0x79,0x27,0x90,0x97,0x36,0xe0,0x24,0xff, +0x92,0xaf,0xa2,0xaf,0xe4,0x33,0xf0,0xc2,0xaf,0x90,0x97,0x33,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0x8b,0x24,0x8a,0x25,0xf5,0x26,0x90,0x97,0x30,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0xf9,0x12,0x1c,0xd6,0xff,0xc4,0x54,0x0f,0xf5,0x27,0x7b,0x01,0x7a, +0x01,0x79,0xa2,0x12,0x79,0x27,0x90,0x97,0x36,0xe0,0x24,0xff,0x92,0xaf,0x90,0x01, +0xaf,0x74,0xff,0xf0,0x90,0x01,0xcb,0xe0,0x64,0x80,0xf0,0x22,0x90,0x01,0xc4,0x74, +0x1c,0xf0,0x74,0x71,0xa3,0xf0,0x90,0x00,0x11,0xe0,0x44,0x09,0xf0,0x7f,0x10,0x7e, +0x00,0x12,0x3a,0xa8,0x90,0x97,0x1d,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3, +0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x78,0x7e,0x08,0x12,0x33,0xd8,0x90, +0x97,0x21,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56, +0x12,0x1d,0xa9,0x7f,0x04,0x7e,0x0c,0x12,0x33,0xd8,0x90,0x97,0x25,0xe0,0xfc,0xa3, +0xe0,0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x00, +0x7e,0x08,0x12,0x33,0xd8,0x90,0x97,0x29,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0xe0,0xfe, +0xa3,0xe0,0xff,0x90,0x81,0x56,0x12,0x1d,0xa9,0x7f,0x70,0x7e,0x0e,0x12,0x33,0xd8, +0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x03,0x2d,0x95,0xe4,0xfd,0xff,0x12,0x38,0xb6, +0x90,0x97,0x97,0xe0,0xb4,0x01,0x11,0x90,0x81,0x24,0x12,0x1d,0xb5,0x00,0x03,0x2d, +0x95,0xe4,0xfd,0x7f,0x01,0x12,0x38,0xb6,0x22,0x90,0x97,0x9e,0xef,0xf0,0xa3,0xed, +0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xe5,0x65,0x60,0x05,0xe4,0xff,0x12,0x7e,0x99,0x90, +0x97,0x9e,0xe0,0x30,0xe0,0x09,0x90,0x97,0xa0,0xe4,0xf0,0xa3,0x74,0x80,0xf0,0x90, +0x04,0x1d,0xe0,0x60,0x1d,0x90,0x05,0x22,0xe0,0x90,0x97,0xa2,0xf0,0xe0,0xff,0x54, +0x90,0x60,0xec,0x90,0x01,0xc8,0x74,0xfc,0xf0,0xef,0x54,0x6f,0x90,0x05,0x22,0xf0, +0x80,0xdd,0x90,0x97,0x9e,0xe0,0xff,0xc3,0x13,0x90,0xfd,0x10,0xf0,0x90,0x04,0x25, +0xef,0xf0,0x90,0x97,0x9f,0xe0,0x60,0x10,0xa3,0xa3,0xe0,0x24,0x10,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x44,0x80,0xf0,0x90,0x97,0xa0,0xa3,0xe0,0xff,0xfd,0x24, +0x08,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83,0xe4,0xf0,0x74,0x09,0x2d,0xf5,0x82,0xe4, +0x34,0xfc,0xf5,0x83,0xe0,0x54,0xf0,0xf0,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc, +0xf5,0x83,0xe0,0x54,0xf7,0xf0,0x90,0x97,0xa0,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x90, +0x97,0xb5,0xef,0xf0,0xd3,0x94,0x07,0x50,0x4a,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0xe0,0x5f,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb5,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8,0x05, +0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x44,0xe0,0xfb, +0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13,0xd8, +0xf8,0xff,0x22,0x90,0x97,0xb5,0xe0,0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07, +0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f, +0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xb5,0xe0,0xfd,0x74,0x01,0x7e,0x00,0xa8, +0x05,0x08,0x80,0x05,0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0x90,0x00,0x42,0xe0, +0xfb,0xe4,0xfe,0xef,0x5b,0xa8,0x05,0x08,0x80,0x06,0xce,0xa2,0xe7,0x13,0xce,0x13, +0xd8,0xf8,0xff,0x22,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xa2, +0xaf,0xe4,0x33,0xa3,0xf0,0xc2,0xaf,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3, +0xe0,0xf9,0x90,0x00,0x01,0x12,0x66,0x20,0xfa,0xe5,0xf0,0x24,0x00,0xff,0xe4,0x3a, +0xfe,0x90,0x97,0x46,0xa3,0xe0,0xfa,0x90,0x00,0x01,0xee,0x8f,0xf0,0x12,0x66,0x77, +0x12,0x1c,0xd6,0xff,0x60,0x37,0xb5,0x5e,0x1b,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0, +0xfa,0xa3,0xe0,0xf9,0x90,0x00,0x01,0x12,0x66,0x20,0x65,0x60,0x70,0x04,0xe5,0x5f, +0x65,0xf0,0x60,0x2e,0x90,0x97,0x46,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x90, +0x00,0x01,0x12,0x66,0x20,0xff,0xae,0xf0,0x12,0x7c,0xb4,0x80,0x15,0x90,0x97,0x46, +0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x12,0x1c,0xd6,0x65,0x5e,0x60,0x03,0x12, +0x7f,0x56,0x90,0x97,0x49,0xe0,0x24,0xff,0x92,0xaf,0x22,0xc0,0xe0,0xc0,0xf0,0xc0, +0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x00,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03, +0xc0,0x04,0xc0,0x05,0xc0,0x06,0xc0,0x07,0x90,0x01,0xc4,0x74,0xab,0xf0,0x74,0x73, +0xa3,0xf0,0x53,0x91,0xef,0x90,0x00,0x51,0xe0,0xff,0x90,0x00,0x55,0xe0,0x5f,0xf5, +0x3d,0xe5,0x3d,0x30,0xe6,0x18,0x74,0x40,0xf0,0x90,0x97,0x6c,0xe0,0x54,0x03,0xff, +0xbf,0x03,0x0b,0x90,0x97,0x69,0xe0,0x60,0x05,0x7f,0x01,0x12,0x44,0x7b,0xe5,0x3d, +0x30,0xe7,0x15,0x90,0x00,0x55,0x74,0x80,0xf0,0x90,0x97,0x6c,0xe0,0x54,0x03,0xff, +0xbf,0x03,0x05,0x7f,0x02,0x12,0x44,0x7b,0x90,0x01,0xc4,0x74,0xab,0xf0,0x74,0x73, +0xa3,0xf0,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04,0xd0,0x03,0xd0,0x02,0xd0,0x01, +0xd0,0x00,0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0xef,0x60,0x34, +0x7d,0x7d,0x7f,0x02,0x12,0x39,0xbe,0x7d,0x02,0x7f,0x03,0x12,0x39,0xbe,0x90,0x01, +0x57,0xe4,0xf0,0x90,0x01,0x3c,0x74,0x02,0xf0,0x7d,0x01,0x7f,0x0c,0x12,0x6e,0xda, +0xe4,0xff,0x12,0x7e,0x99,0x90,0x06,0x04,0xe0,0x54,0x7f,0xf0,0x90,0x06,0x0a,0xe0, +0x54,0xf8,0xf0,0x22,0x90,0x01,0x36,0x74,0x7d,0xf0,0xa3,0x74,0x02,0xf0,0x7d,0x7d, +0xff,0x12,0x3a,0x2f,0x7d,0x02,0x7f,0x03,0x12,0x3a,0x2f,0x90,0x06,0x04,0xe0,0x44, +0x80,0xf0,0x90,0x06,0x0a,0xe0,0x44,0x07,0xf0,0x90,0x97,0x83,0xe0,0xa3,0xe0,0x90, +0x05,0x58,0xf0,0xe5,0x64,0x30,0xe0,0x1b,0x90,0x97,0x81,0xe0,0x70,0x1a,0xe0,0x04, +0xf0,0x90,0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x0c,0x7d,0x01,0x7f,0x04, +0x02,0x6e,0xda,0xe4,0x90,0x97,0x81,0xf0,0x22,0x02,0x75,0x07,0x02,0x62,0xd3,0xe4, +0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2,0x08,0xdf,0xf4,0x80, +0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33,0xc4,0x54,0x0f,0x44, +0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf,0xe4,0x80,0x0b,0x01, +0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x7f,0x0e,0xe4,0x7e,0x01,0x93,0x60,0xbc, +0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x01,0x0e, +0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3, +0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5, +0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0x8f,0x0f,0x74,0x75, +0x90,0x01,0xc4,0xf0,0xa3,0x74,0x4c,0xf0,0xe5,0x0f,0x75,0xf0,0x08,0xa4,0x24,0x67, +0xf5,0x82,0xe4,0x34,0x93,0xf5,0x83,0xe0,0xff,0x74,0xa5,0x25,0x0f,0xf5,0x82,0xe4, +0x34,0x96,0xf5,0x83,0xe0,0x54,0x1f,0xfb,0xd3,0x9f,0x40,0x02,0xab,0x07,0xeb,0x25, +0xe0,0x24,0x9e,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0xe4,0x93,0xfe,0x74,0x01,0x93, +0xff,0xeb,0x25,0xe0,0x24,0x66,0xf5,0x82,0xe4,0x34,0x41,0xf5,0x83,0x74,0x01,0x93, +0x2f,0xff,0xe4,0x93,0x3e,0xc3,0x13,0xfe,0xef,0x13,0xff,0xe4,0xfc,0xfd,0xe5,0x0f, +0x25,0xe0,0x25,0xe0,0x24,0xe1,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83,0x12,0x1d,0xa9, +0x74,0x84,0x25,0x0f,0xf5,0x82,0xe4,0x34,0x04,0xf5,0x83,0xeb,0xf0,0xff,0x22,0x90, +0x97,0x4c,0xef,0xf0,0xd3,0x94,0x07,0x50,0x33,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08, +0x80,0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x47,0xe0,0x5f,0xf0,0x7f,0x10, +0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0x4c,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80, +0x02,0xc3,0x33,0xd8,0xfc,0xf4,0xff,0x90,0x00,0x46,0x80,0x3b,0x90,0x97,0x4c,0xe0, +0x24,0xf8,0xf0,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33,0xd8,0xfc, +0xc4,0x54,0xf0,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12, +0x3a,0xa8,0x90,0x97,0x4c,0xe0,0xff,0x74,0x01,0xa8,0x07,0x08,0x80,0x02,0xc3,0x33, +0xd8,0xfc,0xf4,0xff,0x90,0x00,0x43,0xe0,0x5f,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, +0xa8,0x22,0x8f,0x0a,0x8d,0x0b,0xad,0x03,0x74,0x76,0x90,0x01,0xc4,0xf0,0xa3,0x74, +0x52,0xf0,0xe5,0x0b,0x54,0x1f,0xf9,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x92, +0xf5,0x83,0xe0,0xff,0x90,0x04,0xfd,0xe0,0xb4,0x01,0x05,0x75,0x0e,0x03,0x80,0x03, +0x75,0x0e,0x01,0xed,0xd3,0x95,0x0e,0x40,0x05,0xaf,0x0a,0x02,0x75,0x4c,0x90,0x01, +0xc5,0x74,0x20,0xf0,0xe5,0x0d,0x2f,0xff,0xe9,0x90,0x41,0xd6,0x93,0xfe,0xef,0xd3, +0x9e,0x40,0x22,0x90,0x01,0xc5,0x74,0x40,0xf0,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4, +0x34,0x92,0xf5,0x83,0xe4,0xf0,0x74,0x84,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x04,0xf5, +0x83,0xe5,0x0b,0xf0,0x22,0x74,0x01,0x25,0x0a,0xf5,0x82,0xe4,0x34,0x92,0xf5,0x83, +0xef,0xf0,0x22,0xe4,0x90,0x97,0x2e,0xf0,0xe5,0x65,0x60,0x6c,0xe5,0x64,0x64,0x01, +0x70,0x66,0xe5,0x65,0x64,0x02,0x60,0x06,0xe5,0x65,0x64,0x03,0x70,0x1d,0x90,0x97, +0x7f,0xe0,0x14,0xf0,0xe0,0x60,0x04,0xa3,0xe0,0x60,0x16,0x90,0x97,0x7f,0xe0,0x70, +0x0a,0x90,0x97,0x8a,0xe0,0x90,0x97,0x7f,0xf0,0x80,0x00,0x90,0x97,0x2e,0x74,0x01, +0xf0,0x90,0x97,0x2e,0xe0,0x60,0x31,0x90,0x97,0x8f,0xe0,0x44,0x10,0xf0,0x90,0x97, +0x85,0xe0,0xf5,0x48,0xe4,0xf5,0x49,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x38,0xec, +0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50, +0x07,0x7d,0x01,0x7f,0x04,0x12,0x6e,0xda,0x22,0x90,0x06,0xa9,0xe0,0xf5,0x0a,0x54, +0xc0,0x70,0x0e,0x90,0x97,0x89,0xf0,0x90,0x97,0x8b,0xe0,0xff,0x7d,0x01,0x02,0x6e, +0xda,0xe5,0x0a,0x30,0xe6,0x12,0x90,0x97,0x89,0x74,0x01,0xf0,0x90,0x97,0x8f,0xe0, +0x44,0x01,0xf0,0x12,0x7e,0x7e,0x80,0x07,0x90,0x97,0x8f,0xe0,0x54,0xfe,0xf0,0xe5, +0x0a,0x30,0xe7,0x29,0x90,0x97,0x89,0x74,0x01,0xf0,0x90,0x97,0x8f,0xe0,0x44,0x02, +0xf0,0x75,0x48,0x03,0xe4,0xf5,0x49,0xfb,0xfd,0x7f,0x54,0x7e,0x01,0x12,0x38,0xec, +0x90,0x01,0x57,0x74,0x05,0xf0,0x90,0x97,0x8e,0x74,0x01,0xf0,0x22,0x90,0x97,0x8f, +0xe0,0x54,0xfd,0xf0,0x22,0x90,0x00,0x2b,0xe0,0x44,0x01,0xf0,0x7f,0xe8,0x7e,0x03, +0x12,0x3a,0xa8,0x90,0x00,0x08,0xe0,0x44,0x10,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, +0xa8,0x90,0x00,0x09,0xe0,0x54,0xf7,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, +0x00,0x28,0xe0,0x54,0xfe,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x20, +0xe0,0x54,0xfe,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x25,0xe0,0x44, +0x40,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x00,0x09,0xe0,0x54,0xef,0xf0, +0x7f,0x10,0x7e,0x00,0x02,0x3a,0xa8,0x8b,0x10,0x8a,0x11,0x89,0x12,0x12,0x7e,0xcd, +0xab,0x10,0xaa,0x11,0xa9,0x12,0x12,0x1c,0xd6,0xf5,0x65,0x14,0x60,0x0e,0x14,0x60, +0x0f,0x14,0x60,0x1a,0x24,0x03,0x70,0x3c,0x7f,0x01,0x80,0x35,0xe4,0xff,0x80,0x31, +0x90,0x97,0x8a,0x74,0x01,0xf0,0x90,0x97,0x7f,0xf0,0xe4,0xff,0x80,0x23,0xab,0x10, +0xaa,0x11,0xa9,0x12,0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0x90,0x97,0x8a,0x70,0x05, +0x74,0x05,0xf0,0x80,0x02,0xef,0xf0,0x90,0x97,0x8a,0xe0,0x90,0x97,0x7f,0xf0,0xe4, +0xff,0x12,0x74,0x3d,0x22,0x90,0x00,0x25,0xe0,0x54,0xbf,0xf0,0x7f,0x10,0x7e,0x00, +0x12,0x3a,0xa8,0x90,0x00,0x20,0xe0,0x44,0x01,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a, +0xa8,0x90,0x00,0x28,0xe0,0x44,0x01,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, +0x00,0xf0,0xe0,0x30,0xe1,0xf9,0x90,0x00,0x09,0xe0,0x44,0x08,0xf0,0x7f,0x10,0x7e, +0x00,0x12,0x3a,0xa8,0x90,0x00,0x08,0xe0,0x54,0xef,0xf0,0x7f,0x10,0x7e,0x00,0x12, +0x3a,0xa8,0x90,0x00,0x2b,0xe0,0x54,0xfe,0xf0,0x7f,0xe8,0x7e,0x03,0x02,0x3a,0xa8, +0x90,0x00,0x45,0xe4,0xf0,0x90,0x04,0xfd,0xf0,0xa3,0xf0,0x90,0x97,0x6d,0xf0,0x90, +0x97,0x73,0xf0,0x90,0x97,0x76,0xf0,0x90,0x97,0x74,0xf0,0x90,0x97,0x77,0xf0,0x90, +0x97,0x75,0xf0,0x90,0x97,0x78,0xf0,0x90,0x97,0x5f,0x04,0xf0,0xe4,0xa3,0xf0,0xa3, +0xf0,0xa3,0xf0,0x90,0x97,0x64,0xf0,0x90,0x97,0x69,0xf0,0x90,0x97,0x6b,0xf0,0x90, +0x97,0x7d,0xf0,0x90,0x97,0x6e,0xf0,0x90,0x97,0x6a,0xf0,0x90,0x97,0x63,0xf0,0x90, +0x00,0x51,0xe0,0x44,0xc0,0xf0,0x22,0x8b,0x21,0x8a,0x22,0x89,0x23,0x90,0x97,0x98, +0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0xa3,0xe5,0x24,0xf0,0xa3,0xe5,0x25,0xf0, +0xa3,0xe5,0x26,0xf0,0xaf,0x27,0x15,0x27,0xef,0x60,0x2a,0x90,0x97,0x9b,0xe0,0xfb, +0xa3,0xe4,0x75,0xf0,0x01,0x12,0x65,0xdf,0xa9,0xf0,0xfa,0x12,0x1c,0xd6,0xff,0x90, +0x97,0x98,0xe0,0xfb,0xa3,0xe4,0x75,0xf0,0x01,0x12,0x65,0xdf,0xa9,0xf0,0xfa,0xef, +0x12,0x65,0x95,0x80,0xcf,0xab,0x21,0xaa,0x22,0xa9,0x23,0x22,0x90,0x05,0x60,0xe0, +0x90,0x97,0x79,0xf0,0x90,0x05,0x61,0xe0,0x90,0x97,0x7a,0xf0,0x90,0x05,0x62,0xe0, +0x90,0x97,0x7b,0xf0,0x90,0x05,0x63,0xe0,0x90,0x97,0x7c,0xf0,0xc3,0x74,0xff,0x9f, +0xfe,0x90,0x97,0x7a,0xe0,0xd3,0x9e,0x40,0x1e,0xe0,0x2f,0xf0,0xa3,0xe0,0xb4,0xff, +0x0f,0xe4,0xf0,0xa3,0xe0,0xb4,0xff,0x03,0xe4,0xf0,0x22,0x90,0x97,0x7c,0x80,0x03, +0x90,0x97,0x7b,0xe0,0x04,0xf0,0x22,0x90,0x97,0x7a,0xe0,0x2f,0xf0,0x22,0xe4,0xf5, +0x64,0x90,0x97,0x8f,0xf0,0xf5,0x65,0x90,0x97,0x8b,0x74,0x0c,0xf0,0x90,0x97,0x88, +0xf0,0xe4,0x90,0x97,0x8d,0xf0,0x90,0x97,0x87,0xf0,0x90,0x97,0x86,0xf0,0x90,0x97, +0x8a,0x04,0xf0,0x90,0x97,0x7f,0xf0,0xe4,0x90,0x97,0x8e,0xf0,0x90,0x97,0x89,0xf0, +0x90,0x97,0x81,0xf0,0x90,0x97,0x85,0x74,0x07,0xf0,0xe4,0x90,0x97,0x80,0xf0,0x90, +0x97,0x83,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0x90,0x97,0x8c,0xf0,0x22,0xe4,0x90,0x97, +0xad,0xf0,0xa3,0xf0,0x90,0x01,0xc4,0x74,0x1d,0xf0,0x74,0x7a,0xa3,0xf0,0x90,0x05, +0xf8,0xe0,0x70,0x0f,0xa3,0xe0,0x70,0x0b,0xa3,0xe0,0x70,0x07,0xa3,0xe0,0x70,0x03, +0x7f,0x01,0x22,0xd3,0x90,0x97,0xae,0xe0,0x94,0xe8,0x90,0x97,0xad,0xe0,0x94,0x03, +0x40,0x03,0x7f,0x00,0x22,0x7f,0x32,0x7e,0x00,0x12,0x3a,0xa8,0x90,0x97,0xae,0xe0, +0x04,0xf0,0x70,0xca,0x90,0x97,0xad,0xe0,0x04,0xf0,0x80,0xc2,0xe4,0x90,0x97,0x95, +0xf0,0xa2,0xaf,0x33,0x90,0x97,0x3b,0xf0,0x90,0x00,0x80,0xe0,0x20,0xe1,0x1a,0x12, +0x3a,0xbe,0x12,0x3a,0xbe,0x90,0x97,0x3a,0xe0,0x64,0x01,0xf0,0xe0,0x24,0x6c,0x90, +0x01,0xc4,0xf0,0x74,0x7a,0xa3,0xf0,0x80,0xdf,0x90,0x06,0x30,0x74,0x01,0xf0,0xc2, +0xaf,0x90,0x00,0x80,0xe0,0x44,0x80,0xf0,0x7f,0x10,0x7e,0x00,0x12,0x3a,0xa8,0x90, +0x97,0x3b,0xe0,0x24,0xff,0x92,0xaf,0x22,0x90,0x01,0xc4,0x74,0xb8,0xf0,0x74,0x7a, +0xa3,0xf0,0xe5,0x55,0x70,0x37,0x90,0x97,0x8b,0xe0,0x54,0x0f,0xd3,0x94,0x01,0x50, +0x2c,0x90,0x02,0x87,0xe0,0x70,0x26,0x90,0x97,0x96,0xe0,0xb4,0x02,0x10,0x90,0x97, +0x90,0xe0,0xfe,0xa3,0xe0,0xf5,0x82,0x8e,0x83,0xe0,0x60,0x08,0x80,0x0f,0x90,0x01, +0xaf,0xe0,0x70,0x09,0x90,0x97,0x8c,0xe0,0x60,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22, +0x90,0x97,0x8e,0xe0,0x60,0x12,0xe4,0xf0,0xa3,0xe0,0x54,0xfd,0xf0,0xe0,0x54,0x03, +0x70,0x33,0x90,0x97,0x89,0xf0,0x80,0x23,0x90,0x97,0x80,0xe0,0x04,0xf0,0x90,0x97, +0x8f,0xe0,0x54,0xef,0xf0,0x90,0x97,0x80,0xe0,0xd3,0x94,0x01,0x40,0x0d,0xe5,0x64, +0xb4,0x01,0x12,0xa3,0xe0,0x70,0x0e,0xe0,0x04,0xf0,0x22,0x90,0x97,0x8b,0xe0,0xff, +0x7d,0x01,0x12,0x6e,0xda,0x22,0xe4,0x90,0x97,0x3a,0xf0,0xef,0x90,0x00,0x31,0xf0, +0xee,0x54,0x03,0xff,0xa3,0xe0,0x54,0xfc,0x4f,0xf0,0xa3,0xe0,0x54,0x7f,0xf0,0x90, +0x00,0x30,0xe0,0x20,0xe7,0x0e,0x90,0x97,0x3a,0xe0,0xc3,0x94,0x64,0x50,0x05,0xe0, +0x04,0xf0,0x80,0xeb,0x90,0x97,0x3a,0xe0,0xc3,0x94,0x64,0x50,0x0a,0x90,0x00,0x30, +0xe0,0x12,0x65,0x95,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x01,0xc4,0x74,0x8a,0xf0, +0x74,0x7b,0xa3,0xf0,0x90,0x04,0x1b,0xe0,0x54,0x7f,0x64,0x7f,0x70,0x2b,0x90,0x97, +0x89,0xe0,0x64,0x01,0x60,0x23,0x90,0x97,0x8b,0xe0,0x54,0x0f,0xd3,0x94,0x02,0x50, +0x18,0x90,0x97,0x8f,0xe0,0x20,0xe4,0x11,0x90,0x97,0x87,0xe0,0x64,0x01,0x60,0x09, +0x90,0x97,0x81,0xe0,0x70,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22,0x8f,0x66,0x90,0x01, +0xc4,0x74,0xcc,0xf0,0x74,0x7b,0xa3,0xf0,0x90,0x97,0x94,0xe0,0xff,0x7d,0x01,0x12, +0x71,0xc9,0xe5,0x66,0x60,0x10,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x44,0x10,0xf0,0x80,0x0e,0x74,0x21,0x2f,0xf5,0x82,0xe4,0x34,0xfc,0xf5,0x83, +0xe0,0x54,0xef,0xf0,0x90,0x04,0x1f,0x74,0x01,0xf0,0x22,0x12,0x1c,0xd6,0xff,0xc3, +0x94,0x20,0x50,0x15,0x90,0x00,0x02,0x12,0x1c,0xef,0xfe,0x74,0x23,0x2f,0xf5,0x82, +0xe4,0x34,0x95,0xf5,0x83,0xee,0xf0,0x80,0x0e,0xef,0xb4,0x20,0x0a,0x90,0x00,0x02, +0x12,0x1c,0xef,0x90,0x93,0x61,0xf0,0x74,0x23,0x2f,0xf5,0x82,0xe4,0x34,0x95,0xf5, +0x83,0xe0,0x90,0x04,0xb2,0xf0,0x22,0x90,0x01,0x37,0x74,0x02,0xf0,0x90,0x05,0x22, +0x74,0xff,0xf0,0x12,0x7a,0x1d,0xef,0x70,0x06,0x90,0x01,0xc8,0x74,0xfd,0xf0,0x7d, +0x02,0x7f,0x03,0x12,0x3a,0x2f,0xe5,0x65,0x60,0x05,0x7f,0x01,0x12,0x7e,0x99,0x12, +0x6c,0x30,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0,0x22,0x90,0x00, +0x02,0x12,0x1c,0xef,0x90,0x97,0x6d,0xf0,0xe0,0x90,0x04,0x9b,0xf0,0x90,0x97,0x6d, +0xe0,0x60,0x04,0xe0,0xb4,0xff,0x1c,0xa2,0xaf,0xe4,0x33,0xf5,0x10,0xc2,0xaf,0x90, +0x00,0x47,0xe0,0x54,0xfb,0xf0,0x7d,0x40,0x7f,0x01,0x12,0x39,0xf8,0xe5,0x10,0x24, +0xff,0x92,0xaf,0x22,0x90,0x97,0x4a,0xee,0xf0,0xa3,0xef,0xf0,0x75,0x5e,0x01,0x8e, +0x5f,0xf5,0x60,0x7f,0x0b,0x12,0x75,0xcf,0x12,0x7e,0x61,0xe4,0xff,0x12,0x7f,0x1b, +0x90,0x97,0x4a,0xe0,0xfc,0xa3,0xe0,0xfd,0xec,0xfb,0x8d,0x48,0xe4,0xf5,0x49,0x7d, +0x01,0x7f,0x60,0x7e,0x01,0x02,0x38,0xec,0x7d,0x02,0x7f,0x03,0x12,0x39,0xbe,0xe5, +0x65,0x60,0x23,0x90,0x97,0x8d,0xe0,0x60,0x06,0x7d,0x01,0x7f,0x0c,0x80,0x0f,0x90, +0x97,0x88,0xe0,0x54,0x0f,0xc3,0x94,0x04,0x50,0x07,0x7d,0x01,0x7f,0x04,0x12,0x6e, +0xda,0xe4,0xff,0x12,0x7e,0x99,0x22,0x90,0x02,0x09,0xe0,0xfd,0x12,0x1c,0xd6,0xfe, +0xaf,0x05,0xed,0x2e,0x90,0x97,0x92,0xf0,0x90,0x00,0x01,0x12,0x1c,0xef,0xff,0xed, +0x2f,0x90,0x97,0x93,0xf0,0x90,0x00,0x02,0x12,0x1c,0xef,0xff,0xae,0x05,0xed,0x2f, +0x90,0x97,0x94,0xf0,0x22,0x90,0x06,0x34,0xe0,0x60,0x26,0x14,0x70,0x1b,0x7b,0x01, +0x7a,0x06,0x79,0x35,0x7f,0xf9,0x7e,0x01,0x12,0x7b,0x46,0xbf,0x01,0x09,0x90,0x06, +0x35,0xe0,0x54,0x0f,0xf0,0x80,0x05,0x80,0x00,0x02,0x7f,0x00,0xe4,0x90,0x06,0x34, +0xf0,0x22,0x90,0x01,0xc4,0x74,0x72,0xf0,0x74,0x7d,0xa3,0xf0,0x90,0x04,0x1b,0xe0, +0x54,0x7f,0xff,0xbf,0x7f,0x14,0x90,0x97,0x87,0xe0,0x70,0x0e,0x90,0x97,0x8b,0xe0, +0x54,0x0f,0xd3,0x94,0x04,0x50,0x03,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x00,0x01, +0x12,0x1c,0xef,0x90,0x97,0x8d,0xf0,0x12,0x1c,0xd6,0x65,0x65,0x60,0x15,0xa2,0xaf, +0xe4,0x33,0x90,0x97,0x46,0xf0,0xc2,0xaf,0x12,0x78,0x17,0x90,0x97,0x46,0xe0,0x24, +0xff,0x92,0xaf,0x22,0x90,0x97,0x2e,0xe0,0x54,0xf0,0x44,0x03,0xf0,0x54,0x0f,0x44, +0x80,0xf0,0x90,0x97,0x33,0xe4,0xf0,0xa3,0x74,0x00,0xf0,0xa3,0x74,0x56,0xf0,0x7b, +0x01,0x7a,0x97,0x79,0x2e,0x02,0x70,0x66,0x90,0x06,0x04,0xe0,0x54,0xbf,0xf0,0xef, +0x60,0x0a,0xe5,0x64,0xb4,0x01,0x05,0xe4,0xff,0x12,0x7b,0xcc,0x90,0x97,0x88,0xe0, +0x54,0xf0,0xf0,0xe0,0x44,0x0c,0xf0,0x22,0x90,0x97,0xb2,0xef,0xf0,0x12,0x71,0x1c, +0x90,0x97,0xb2,0xe0,0x60,0x05,0x90,0x05,0x22,0xe4,0xf0,0x90,0x97,0x88,0xe0,0x54, +0xf0,0xf0,0xe0,0x44,0x04,0xf0,0x22,0x90,0x06,0x04,0xe0,0x44,0x40,0xf0,0xe5,0x64, +0xb4,0x01,0x05,0x7f,0x01,0x12,0x7b,0xcc,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0, +0x44,0x04,0xf0,0x22,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x01,0xf0,0x12, +0x77,0xb5,0x12,0x78,0x75,0x90,0x97,0x88,0xe0,0x54,0xf0,0xf0,0xe0,0x44,0x02,0xf0, +0x22,0x7f,0x0b,0x12,0x72,0x6f,0xef,0x65,0x61,0x60,0x10,0xe5,0x61,0xb4,0x01,0x05, +0xe4,0xf5,0x61,0x80,0x03,0x75,0x61,0x01,0x7f,0x01,0x22,0x7f,0x00,0x22,0x90,0x01, +0xc4,0x74,0x7e,0xf0,0x74,0x7e,0xa3,0xf0,0x90,0x97,0x93,0xe0,0xff,0xe4,0xfd,0x12, +0x71,0xc9,0x90,0x04,0x1f,0x74,0x01,0xf0,0x22,0xef,0x60,0x0b,0x90,0x97,0x97,0xe0, +0xb4,0x01,0x10,0xe4,0xff,0x80,0x09,0x90,0x97,0x97,0xe0,0xb4,0x01,0x05,0x7f,0x01, +0x12,0x4e,0x3b,0x22,0x90,0x00,0x49,0xe0,0x90,0x97,0xb4,0xf0,0xe0,0x54,0x0f,0xf0, +0xe0,0xff,0x44,0xf0,0x90,0x00,0x49,0xf0,0xef,0x44,0xb0,0xf0,0x22,0xe4,0x90,0x97, +0x8e,0xf0,0x90,0x97,0x80,0xf0,0x90,0x97,0x89,0xf0,0x90,0x97,0x8f,0xf0,0x22,0xe5, +0x5e,0xb4,0x01,0x0b,0x12,0x7e,0x61,0xbf,0x01,0x05,0x7f,0x01,0x12,0x7f,0x1b,0x22, +0x90,0x09,0x28,0xef,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22, +0x90,0x06,0x34,0x74,0xff,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x22,0x41,0x97, +0xb1,0x00,0x41,0x97,0x7e,0x80,0x41,0x97,0xb3,0x00,0x00,0x90,0x01,0xca,0xe5,0x61, +0xf0,0xef,0x60,0x03,0x12,0x7e,0xb4,0x22,0x90,0x97,0x46,0xeb,0xf0,0xa3,0xea,0xf0, +0xa3,0xe9,0xf0,0x22,0x90,0x97,0xa7,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22, +0x90,0x97,0xaa,0xeb,0xf0,0xa3,0xea,0xf0,0xa3,0xe9,0xf0,0x22,0x8f,0x82,0x8e,0x83, +0xa3,0xa3,0xa3,0xe4,0xf0,0x22,0xe4,0xf5,0x5e,0x7f,0x60,0x7e,0x01,0x02,0x7f,0x4c, +0x90,0x97,0x97,0xe0,0x90,0x97,0x2d,0xf0,0x22,0x8f,0x1b,0x8c,0x1c,0x8d,0x1d,0x22, +0x8f,0x1e,0x8c,0x1f,0x8d,0x20,0x22,0x12,0x1c,0xd6,0xf5,0x64,0x22,0x22,0x52,0x09, +}; + +u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040002, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x01000100, +0x82c,0x00390004, +0x830,0x27272727, +0x834,0x27272727, +0x838,0x27272727, +0x83c,0x27272727, +0x840,0x00010000, +0x844,0x00010000, +0x848,0x27272727, +0x84c,0x27272727, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x0c1b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x27272727, +0x86c,0x2b2b2b27, +0x870,0x07000700, +0x874,0x22184000, +0x878,0x08080808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xcc0000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121313, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05633, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x0186115b, +0xc78,0x0000001f, +0xc7c,0x00b99612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020403, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000010, +0xe68,0x001b25a4, +0xe6c,0x63db25a4, +0xe70,0x63db25a4, +0xe74,0x0c1b25a4, +0xe78,0x0c1b25a4, +0xe7c,0x0c1b25a4, +0xe80,0x0c1b25a4, +0xe84,0x63db25a4, +0xe88,0x0c1b25a4, +0xe8c,0x63db25a4, +0xed0,0x63db25a4, +0xed4,0x63db25a4, +0xed8,0x63db25a4, +0xedc,0x001b25a4, +0xee0,0x001b25a4, +0xeec,0x6fdb25a4, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000700, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength] = { +0x0, }; + +u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength] = { +0x0, }; + +u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength] = { +0x0, }; + +u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength] = { +0xe00,0xffffffff,0x07090c0c, +0xe04,0xffffffff,0x01020405, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0b0c0c0e, +0xe14,0xffffffff,0x01030506, +0xe18,0xffffffff,0x0b0c0d0e, +0xe1c,0xffffffff,0x01030509, +0x830,0xffffffff,0x07090c0c, +0x834,0xffffffff,0x01020405, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0b0c0d0e, +0x848,0xffffffff,0x01030509, +0x84c,0xffffffff,0x0b0c0d0e, +0x868,0xffffffff,0x01030509, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength] = { +0xe00,0xffffffff,0x0a0c0c0c, +0xe04,0xffffffff,0x02040608, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x0a0c0d0e, +0xe14,0xffffffff,0x02040608, +0xe18,0xffffffff,0x0a0c0d0e, +0xe1c,0xffffffff,0x02040608, +0x830,0xffffffff,0x0a0c0c0c, +0x834,0xffffffff,0x02040608, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x0a0c0d0e, +0x848,0xffffffff,0x02040608, +0x84c,0xffffffff,0x0a0c0d0e, +0x868,0xffffffff,0x02040608, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x06060606, +0xe14,0xffffffff,0x00020406, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x06060606, +0x848,0xffffffff,0x00020406, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x04040404, +0xe04,0xffffffff,0x00020204, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x04040404, +0x834,0xffffffff,0x00020204, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength] = { +0xc30,0x69e9ac4a, +0xc3c,0x0a979718, +}; + +u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength] = { +0x024,0x0011800f, +0x028,0x00ffdb83, +0x040,0x000c0004, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390204, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x20202000, +0x870,0x03000300, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00ffc3f1, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x15160000, +0xa24,0x070b0f12, +0xa28,0x00000104, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954342e, +0xc54,0x43bc0094, +0xc58,0x6954342f, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c46000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x24000090, +0xc84,0x20f60000, +0xc88,0x24000090, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x24242424, +0xe04,0x24242424, +0xe08,0x03902024, +0xe10,0x24242424, +0xe14,0x24242424, +0xe18,0x24242424, +0xe1c,0x24242424, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xee8,0x31555448, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040000, +0x804,0x00000001, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x00000000, +0x82c,0x00000000, +0x830,0x00000000, +0x834,0x00000000, +0x838,0x00000000, +0x83c,0x00000000, +0x840,0x00010000, +0x844,0x00000000, +0x848,0x00000000, +0x84c,0x00000000, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x001b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x00000000, +0x86c,0x32323200, +0x870,0x07000700, +0x874,0x22004000, +0x878,0x00000808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xccc000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121111, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05611, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020401, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000008, +0xe68,0x001b25a4, +0xe6c,0x631b25a0, +0xe70,0x631b25a0, +0xe74,0x081b25a0, +0xe78,0x081b25a0, +0xe7c,0x081b25a0, +0xe80,0x081b25a0, +0xe84,0x631b25a0, +0xe88,0x081b25a0, +0xe8c,0x631b25a0, +0xed0,0x631b25a0, +0xed4,0x631b25a0, +0xed8,0x631b25a0, +0xedc,0x001b25a0, +0xee0,0x001b25a0, +0xeec,0x6b1b25a0, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength] = { +0x024,0x0011800d, +0x028,0x00ffdb83, +0x800,0x80040002, +0x804,0x00000003, +0x808,0x0000fc00, +0x80c,0x0000000a, +0x810,0x10005388, +0x814,0x020c3d10, +0x818,0x02200385, +0x81c,0x00000000, +0x820,0x01000100, +0x824,0x00390004, +0x828,0x01000100, +0x82c,0x00390004, +0x830,0x27272727, +0x834,0x27272727, +0x838,0x27272727, +0x83c,0x27272727, +0x840,0x00010000, +0x844,0x00010000, +0x848,0x27272727, +0x84c,0x27272727, +0x850,0x00000000, +0x854,0x00000000, +0x858,0x569a569a, +0x85c,0x0c1b25a4, +0x860,0x66e60230, +0x864,0x061f0130, +0x868,0x27272727, +0x86c,0x2b2b2b27, +0x870,0x07000700, +0x874,0x22184000, +0x878,0x08080808, +0x87c,0x00000000, +0x880,0xc0083070, +0x884,0x000004d5, +0x888,0x00000000, +0x88c,0xcc0000c0, +0x890,0x00000800, +0x894,0xfffffffe, +0x898,0x40302010, +0x89c,0x00706050, +0x900,0x00000000, +0x904,0x00000023, +0x908,0x00000000, +0x90c,0x81121313, +0xa00,0x00d047c8, +0xa04,0x80ff000c, +0xa08,0x8c838300, +0xa0c,0x2e68120f, +0xa10,0x9500bb78, +0xa14,0x11144028, +0xa18,0x00881117, +0xa1c,0x89140f00, +0xa20,0x1a1b0000, +0xa24,0x090e1317, +0xa28,0x00000204, +0xa2c,0x00d30000, +0xa70,0x101fbf00, +0xa74,0x00000007, +0xc00,0x48071d40, +0xc04,0x03a05633, +0xc08,0x000000e4, +0xc0c,0x6c6c6c6c, +0xc10,0x08800000, +0xc14,0x40000100, +0xc18,0x08800000, +0xc1c,0x40000100, +0xc20,0x00000000, +0xc24,0x00000000, +0xc28,0x00000000, +0xc2c,0x00000000, +0xc30,0x69e9ac44, +0xc34,0x469652cf, +0xc38,0x49795994, +0xc3c,0x0a97971c, +0xc40,0x1f7c403f, +0xc44,0x000100b7, +0xc48,0xec020107, +0xc4c,0x007f037f, +0xc50,0x6954341e, +0xc54,0x43bc0094, +0xc58,0x6954341e, +0xc5c,0x433c0094, +0xc60,0x00000000, +0xc64,0x5116848b, +0xc68,0x47c00bff, +0xc6c,0x00000036, +0xc70,0x2c7f000d, +0xc74,0x018610db, +0xc78,0x0000001f, +0xc7c,0x00b91612, +0xc80,0x40000100, +0xc84,0x20f60000, +0xc88,0x40000100, +0xc8c,0x20200000, +0xc90,0x00121820, +0xc94,0x00000000, +0xc98,0x00121820, +0xc9c,0x00007f7f, +0xca0,0x00000000, +0xca4,0x00000080, +0xca8,0x00000000, +0xcac,0x00000000, +0xcb0,0x00000000, +0xcb4,0x00000000, +0xcb8,0x00000000, +0xcbc,0x28000000, +0xcc0,0x00000000, +0xcc4,0x00000000, +0xcc8,0x00000000, +0xccc,0x00000000, +0xcd0,0x00000000, +0xcd4,0x00000000, +0xcd8,0x64b22427, +0xcdc,0x00766932, +0xce0,0x00222222, +0xce4,0x00000000, +0xce8,0x37644302, +0xcec,0x2f97d40c, +0xd00,0x00080740, +0xd04,0x00020403, +0xd08,0x0000907f, +0xd0c,0x20010201, +0xd10,0xa0633333, +0xd14,0x3333bc43, +0xd18,0x7a8f5b6b, +0xd2c,0xcc979975, +0xd30,0x00000000, +0xd34,0x80608000, +0xd38,0x00000000, +0xd3c,0x00027293, +0xd40,0x00000000, +0xd44,0x00000000, +0xd48,0x00000000, +0xd4c,0x00000000, +0xd50,0x6437140a, +0xd54,0x00000000, +0xd58,0x00000000, +0xd5c,0x30032064, +0xd60,0x4653de68, +0xd64,0x04518a3c, +0xd68,0x00002101, +0xd6c,0x2a201c16, +0xd70,0x1812362e, +0xd74,0x322c2220, +0xd78,0x000e3c24, +0xe00,0x2a2a2a2a, +0xe04,0x2a2a2a2a, +0xe08,0x03902a2a, +0xe10,0x2a2a2a2a, +0xe14,0x2a2a2a2a, +0xe18,0x2a2a2a2a, +0xe1c,0x2a2a2a2a, +0xe28,0x00000000, +0xe30,0x1000dc1f, +0xe34,0x10008c1f, +0xe38,0x02140102, +0xe3c,0x681604c2, +0xe40,0x01007c00, +0xe44,0x01004800, +0xe48,0xfb000000, +0xe4c,0x000028d1, +0xe50,0x1000dc1f, +0xe54,0x10008c1f, +0xe58,0x02140102, +0xe5c,0x28160d05, +0xe60,0x00000010, +0xe68,0x001b25a4, +0xe6c,0x63db25a4, +0xe70,0x63db25a4, +0xe74,0x0c1b25a4, +0xe78,0x0c1b25a4, +0xe7c,0x0c1b25a4, +0xe80,0x0c1b25a4, +0xe84,0x63db25a4, +0xe88,0x0c1b25a4, +0xe8c,0x63db25a4, +0xed0,0x63db25a4, +0xed4,0x63db25a4, +0xed8,0x63db25a4, +0xedc,0x001b25a4, +0xee0,0x001b25a4, +0xeec,0x6fdb25a4, +0xf14,0x00000003, +0xf4c,0x00000000, +0xf00,0x00000300, +}; + +u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength] = { +0xe00,0xffffffff,0x06080808, +0xe04,0xffffffff,0x00040406, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x04060608, +0xe14,0xffffffff,0x00020204, +0xe18,0xffffffff,0x04060608, +0xe1c,0xffffffff,0x00020204, +0x830,0xffffffff,0x06080808, +0x834,0xffffffff,0x00040406, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x04060608, +0x848,0xffffffff,0x00020204, +0x84c,0xffffffff,0x04060608, +0x868,0xffffffff,0x00020204, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +0xe00,0xffffffff,0x00000000, +0xe04,0xffffffff,0x00000000, +0xe08,0x0000ff00,0x00000000, +0x86c,0xffffff00,0x00000000, +0xe10,0xffffffff,0x00000000, +0xe14,0xffffffff,0x00000000, +0xe18,0xffffffff,0x00000000, +0xe1c,0xffffffff,0x00000000, +0x830,0xffffffff,0x00000000, +0x834,0xffffffff,0x00000000, +0x838,0xffffff00,0x00000000, +0x86c,0x000000ff,0x00000000, +0x83c,0xffffffff,0x00000000, +0x848,0xffffffff,0x00000000, +0x84c,0xffffffff,0x00000000, +0x868,0xffffffff,0x00000000, +}; + +u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287af, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x00014297, +0x013,0x00010295, +0x013,0x0000c298, +0x013,0x0000819c, +0x013,0x000040a8, +0x013,0x0000001c, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +}; + +u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f405, +0x015,0x0004f405, +0x015,0x0008f405, +0x015,0x000cf405, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength] = { +0x0, }; + + +u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb1, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e52c, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00010255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x00000000, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f200, +0x027,0x000ec7d9, +0x028,0x000577c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x00032000, +0x012,0x00071000, +0x012,0x000b0000, +0x012,0x000fc000, +0x013,0x000287b3, +0x013,0x000244b7, +0x013,0x000204ab, +0x013,0x0001c49f, +0x013,0x00018493, +0x013,0x0001429b, +0x013,0x00010299, +0x013,0x0000c29c, +0x013,0x000081a0, +0x013,0x000040ac, +0x013,0x00000020, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f424, +0x015,0x0004f424, +0x015,0x0008f424, +0x015,0x000cf424, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength] = { +0x0, }; + +u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength] = { +0x000,0x00030159, +0x001,0x00031284, +0x002,0x00098000, +0x003,0x00018c63, +0x004,0x000210e7, +0x009,0x0002044f, +0x00a,0x0001adb0, +0x00b,0x00054867, +0x00c,0x0008992e, +0x00d,0x0000e529, +0x00e,0x00039ce7, +0x00f,0x00000451, +0x019,0x00000000, +0x01a,0x00000255, +0x01b,0x00060a00, +0x01c,0x000fc378, +0x01d,0x000a1250, +0x01e,0x0004445f, +0x01f,0x00080001, +0x020,0x0000b614, +0x021,0x0006c000, +0x022,0x0000083c, +0x023,0x00001558, +0x024,0x00000060, +0x025,0x00000483, +0x026,0x0004f000, +0x027,0x000ec7d9, +0x028,0x000977c0, +0x029,0x00004783, +0x02a,0x00000001, +0x02b,0x00021334, +0x02a,0x00000000, +0x02b,0x00000054, +0x02a,0x00000001, +0x02b,0x00000808, +0x02b,0x00053333, +0x02c,0x0000000c, +0x02a,0x00000002, +0x02b,0x00000808, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000003, +0x02b,0x00000808, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000004, +0x02b,0x00000808, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x00000005, +0x02b,0x00000808, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x00000006, +0x02b,0x00000709, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x00000007, +0x02b,0x00000709, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x00000008, +0x02b,0x0000060a, +0x02b,0x0004b333, +0x02c,0x0000000d, +0x02a,0x00000009, +0x02b,0x0000060a, +0x02b,0x00053333, +0x02c,0x0000000d, +0x02a,0x0000000a, +0x02b,0x0000060a, +0x02b,0x0005b333, +0x02c,0x0000000d, +0x02a,0x0000000b, +0x02b,0x0000060a, +0x02b,0x00063333, +0x02c,0x0000000d, +0x02a,0x0000000c, +0x02b,0x0000060a, +0x02b,0x0006b333, +0x02c,0x0000000d, +0x02a,0x0000000d, +0x02b,0x0000060a, +0x02b,0x00073333, +0x02c,0x0000000d, +0x02a,0x0000000e, +0x02b,0x0000050b, +0x02b,0x00066666, +0x02c,0x0000001a, +0x02a,0x000e0000, +0x010,0x0004000f, +0x011,0x000e31fc, +0x010,0x0006000f, +0x011,0x000ff9f8, +0x010,0x0002000f, +0x011,0x000203f9, +0x010,0x0003000f, +0x011,0x000ff500, +0x010,0x00000000, +0x011,0x00000000, +0x010,0x0008000f, +0x011,0x0003f100, +0x010,0x0009000f, +0x011,0x00023100, +0x012,0x000d8000, +0x012,0x00090000, +0x012,0x00051000, +0x012,0x00012000, +0x013,0x00028fb4, +0x013,0x00024fa8, +0x013,0x000207a4, +0x013,0x0001c798, +0x013,0x000183a4, +0x013,0x00014398, +0x013,0x000101a4, +0x013,0x0000c198, +0x013,0x000080a4, +0x013,0x00004098, +0x013,0x00000000, +0x014,0x0001944c, +0x014,0x00059444, +0x014,0x0009944c, +0x014,0x000d9444, +0x015,0x0000f405, +0x015,0x0004f405, +0x015,0x0008f405, +0x015,0x000cf405, +0x016,0x000e0330, +0x016,0x000a0330, +0x016,0x00060330, +0x016,0x00020330, +0x000,0x00010159, +0x018,0x0000f401, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01f,0x00080003, +0x0fe,0x00000000, +0x0fe,0x00000000, +0x01e,0x00044457, +0x01f,0x00080000, +0x000,0x00030159, +}; + +u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength] = { +0x0, }; + +// MAC reg V13 - 2010-12-07 +u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength] = { +0x420,0x00000080, +0x423,0x00000000, +0x430,0x00000000, +0x431,0x00000000, +0x432,0x00000000, +0x433,0x00000001, +0x434,0x00000004, +0x435,0x00000005, +0x436,0x00000006, +0x437,0x00000007, +0x438,0x00000000, +0x439,0x00000000, +0x43a,0x00000000, +0x43b,0x00000001, +0x43c,0x00000004, +0x43d,0x00000005, +0x43e,0x00000006, +0x43f,0x00000007, +0x440,0x0000005d, +0x441,0x00000001, +0x442,0x00000000, +0x444,0x00000015, +0x445,0x000000f0, +0x446,0x0000000f, +0x447,0x00000000, +0x458,0x00000041, +0x459,0x000000a8, +0x45a,0x00000072, +0x45b,0x000000b9, +0x460,0x00000066, +0x461,0x00000066, +0x462,0x00000008, +0x463,0x00000003, +0x4c8,0x000000ff, +0x4c9,0x00000008, +0x4cc,0x000000ff, +0x4cd,0x000000ff, +0x4ce,0x00000001, +0x500,0x00000026, +0x501,0x000000a2, +0x502,0x0000002f, +0x503,0x00000000, +0x504,0x00000028, +0x505,0x000000a3, +0x506,0x0000005e, +0x507,0x00000000, +0x508,0x0000002b, +0x509,0x000000a4, +0x50a,0x0000005e, +0x50b,0x00000000, +0x50c,0x0000004f, +0x50d,0x000000a4, +0x50e,0x00000000, +0x50f,0x00000000, +0x512,0x0000001c, +0x514,0x0000000a, +0x515,0x00000010, +0x516,0x0000000a, +0x517,0x00000010, +0x51a,0x00000016, +0x524,0x0000000f, +0x525,0x0000004f, +0x546,0x00000040, +0x547,0x00000000, +0x550,0x00000010, +0x551,0x00000010, +0x559,0x00000002, +0x55a,0x00000002, +0x55d,0x000000ff, +0x605,0x00000030, +0x608,0x0000000e, +0x609,0x0000002a, +0x652,0x00000020, +0x63c,0x0000000a, +0x63d,0x0000000e, +0x63e,0x0000000a, +0x63f,0x0000000e, +0x66e,0x00000005, +0x700,0x00000021, +0x701,0x00000043, +0x702,0x00000065, +0x703,0x00000087, +0x708,0x00000021, +0x709,0x00000043, +0x70a,0x00000065, +0x70b,0x00000087, +}; + +u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength] = { +0x0, }; + +u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7a060001, +0xc78,0x79070001, +0xc78,0x78080001, +0xc78,0x77090001, +0xc78,0x760a0001, +0xc78,0x750b0001, +0xc78,0x740c0001, +0xc78,0x730d0001, +0xc78,0x720e0001, +0xc78,0x710f0001, +0xc78,0x70100001, +0xc78,0x6f110001, +0xc78,0x6e120001, +0xc78,0x6d130001, +0xc78,0x6c140001, +0xc78,0x6b150001, +0xc78,0x6a160001, +0xc78,0x69170001, +0xc78,0x68180001, +0xc78,0x67190001, +0xc78,0x661a0001, +0xc78,0x651b0001, +0xc78,0x641c0001, +0xc78,0x631d0001, +0xc78,0x621e0001, +0xc78,0x611f0001, +0xc78,0x60200001, +0xc78,0x49210001, +0xc78,0x48220001, +0xc78,0x47230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7a460001, +0xc78,0x79470001, +0xc78,0x78480001, +0xc78,0x77490001, +0xc78,0x764a0001, +0xc78,0x754b0001, +0xc78,0x744c0001, +0xc78,0x734d0001, +0xc78,0x724e0001, +0xc78,0x714f0001, +0xc78,0x70500001, +0xc78,0x6f510001, +0xc78,0x6e520001, +0xc78,0x6d530001, +0xc78,0x6c540001, +0xc78,0x6b550001, +0xc78,0x6a560001, +0xc78,0x69570001, +0xc78,0x68580001, +0xc78,0x67590001, +0xc78,0x665a0001, +0xc78,0x655b0001, +0xc78,0x645c0001, +0xc78,0x635d0001, +0xc78,0x625e0001, +0xc78,0x615f0001, +0xc78,0x60600001, +0xc78,0x49610001, +0xc78,0x48620001, +0xc78,0x47630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + +u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength] = { +0xc78,0x7b000001, +0xc78,0x7b010001, +0xc78,0x7b020001, +0xc78,0x7b030001, +0xc78,0x7b040001, +0xc78,0x7b050001, +0xc78,0x7b060001, +0xc78,0x7b070001, +0xc78,0x7b080001, +0xc78,0x7a090001, +0xc78,0x790a0001, +0xc78,0x780b0001, +0xc78,0x770c0001, +0xc78,0x760d0001, +0xc78,0x750e0001, +0xc78,0x740f0001, +0xc78,0x73100001, +0xc78,0x72110001, +0xc78,0x71120001, +0xc78,0x70130001, +0xc78,0x6f140001, +0xc78,0x6e150001, +0xc78,0x6d160001, +0xc78,0x6c170001, +0xc78,0x6b180001, +0xc78,0x6a190001, +0xc78,0x691a0001, +0xc78,0x681b0001, +0xc78,0x671c0001, +0xc78,0x661d0001, +0xc78,0x651e0001, +0xc78,0x641f0001, +0xc78,0x63200001, +0xc78,0x62210001, +0xc78,0x61220001, +0xc78,0x60230001, +0xc78,0x46240001, +0xc78,0x45250001, +0xc78,0x44260001, +0xc78,0x43270001, +0xc78,0x42280001, +0xc78,0x41290001, +0xc78,0x402a0001, +0xc78,0x262b0001, +0xc78,0x252c0001, +0xc78,0x242d0001, +0xc78,0x232e0001, +0xc78,0x222f0001, +0xc78,0x21300001, +0xc78,0x20310001, +0xc78,0x06320001, +0xc78,0x05330001, +0xc78,0x04340001, +0xc78,0x03350001, +0xc78,0x02360001, +0xc78,0x01370001, +0xc78,0x00380001, +0xc78,0x00390001, +0xc78,0x003a0001, +0xc78,0x003b0001, +0xc78,0x003c0001, +0xc78,0x003d0001, +0xc78,0x003e0001, +0xc78,0x003f0001, +0xc78,0x7b400001, +0xc78,0x7b410001, +0xc78,0x7b420001, +0xc78,0x7b430001, +0xc78,0x7b440001, +0xc78,0x7b450001, +0xc78,0x7b460001, +0xc78,0x7b470001, +0xc78,0x7b480001, +0xc78,0x7a490001, +0xc78,0x794a0001, +0xc78,0x784b0001, +0xc78,0x774c0001, +0xc78,0x764d0001, +0xc78,0x754e0001, +0xc78,0x744f0001, +0xc78,0x73500001, +0xc78,0x72510001, +0xc78,0x71520001, +0xc78,0x70530001, +0xc78,0x6f540001, +0xc78,0x6e550001, +0xc78,0x6d560001, +0xc78,0x6c570001, +0xc78,0x6b580001, +0xc78,0x6a590001, +0xc78,0x695a0001, +0xc78,0x685b0001, +0xc78,0x675c0001, +0xc78,0x665d0001, +0xc78,0x655e0001, +0xc78,0x645f0001, +0xc78,0x63600001, +0xc78,0x62610001, +0xc78,0x61620001, +0xc78,0x60630001, +0xc78,0x46640001, +0xc78,0x45650001, +0xc78,0x44660001, +0xc78,0x43670001, +0xc78,0x42680001, +0xc78,0x41690001, +0xc78,0x406a0001, +0xc78,0x266b0001, +0xc78,0x256c0001, +0xc78,0x246d0001, +0xc78,0x236e0001, +0xc78,0x226f0001, +0xc78,0x21700001, +0xc78,0x20710001, +0xc78,0x06720001, +0xc78,0x05730001, +0xc78,0x04740001, +0xc78,0x03750001, +0xc78,0x02760001, +0xc78,0x01770001, +0xc78,0x00780001, +0xc78,0x00790001, +0xc78,0x007a0001, +0xc78,0x007b0001, +0xc78,0x007c0001, +0xc78,0x007d0001, +0xc78,0x007e0001, +0xc78,0x007f0001, +0xc78,0x3800001e, +0xc78,0x3801001e, +0xc78,0x3802001e, +0xc78,0x3803001e, +0xc78,0x3804001e, +0xc78,0x3805001e, +0xc78,0x3806001e, +0xc78,0x3807001e, +0xc78,0x3808001e, +0xc78,0x3c09001e, +0xc78,0x3e0a001e, +0xc78,0x400b001e, +0xc78,0x440c001e, +0xc78,0x480d001e, +0xc78,0x4c0e001e, +0xc78,0x500f001e, +0xc78,0x5210001e, +0xc78,0x5611001e, +0xc78,0x5a12001e, +0xc78,0x5e13001e, +0xc78,0x6014001e, +0xc78,0x6015001e, +0xc78,0x6016001e, +0xc78,0x6217001e, +0xc78,0x6218001e, +0xc78,0x6219001e, +0xc78,0x621a001e, +0xc78,0x621b001e, +0xc78,0x621c001e, +0xc78,0x621d001e, +0xc78,0x621e001e, +0xc78,0x621f001e, +}; + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c new file mode 100755 index 000000000000..75d921e26305 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_led.c @@ -0,0 +1,2676 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + +#include "drv_types.h" +#include "rtl8192c_hal.h" + +//================================================================================ +// Constant. +//================================================================================ + +// +// Default LED behavior. +// +#define LED_BLINK_NORMAL_INTERVAL 100 +#define LED_BLINK_SLOWLY_INTERVAL 200 +#define LED_BLINK_LONG_INTERVAL 400 + +#define LED_BLINK_NO_LINK_INTERVAL_ALPHA 1000 +#define LED_BLINK_LINK_INTERVAL_ALPHA 500 //500 +#define LED_BLINK_SCAN_INTERVAL_ALPHA 180 //150 +#define LED_BLINK_FASTER_INTERVAL_ALPHA 50 +#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA 5000 + +//================================================================================ +// LED object. +//================================================================================ + + +//================================================================================ +// Prototype of protected function. +//================================================================================ + + +static void +BlinkTimerCallback( + unsigned long data + ); + +static void +BlinkWorkItemCallback( + struct work_struct *work + ); + +//================================================================================ +// LED_819xUsb routines. +//================================================================================ + +// +// Description: +// Initialize an LED_871x object. +// +static void +InitLed871x( + _adapter *padapter, + PLED_871x pLed, + LED_PIN_871x LedPin + ) +{ + pLed->padapter = padapter; + + pLed->LedPin = LedPin; + + pLed->CurrLedState = LED_OFF; + pLed->bLedOn = _FALSE; + + pLed->bLedBlinkInProgress = _FALSE; + pLed->BlinkTimes = 0; + pLed->BlinkingLedState = LED_UNKNOWN; + + _init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed); + + _init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed); +} + + +// +// Description: +// DeInitialize an LED_871x object. +// +static void +DeInitLed871x( + PLED_871x pLed + ) +{ + _cancel_timer_ex(&(pLed->BlinkTimer)); + + // We should reset bLedBlinkInProgress if we cancel the LedControlTimer, 2005.03.10, by rcnjko. + pLed->bLedBlinkInProgress = _FALSE; +} + +// +// Description: +// Reset blinking status of LED_871x object. +// +static void +ResetLedStatus(PLED_871x pLed) { + pLed->bLedBlinkInProgress = _FALSE; // true if it is blinking, false o.w.. + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->bLedLinkBlinkInProgress = _FALSE; + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + pLed->bLedScanBlinkInProgress = _FALSE; + pLed->bLedWPSBlinkInProgress = _FALSE; + pLed->BlinkingLedState = LED_OFF; // Next state for blinking, either LED_ON or LED_OFF are. +} + +// +// Description: +// Turn on LED according to LedPin specified. +// +static void +SwLedOn( + _adapter *padapter, + PLED_871x pLed +) +{ + u8 LedCfg; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + if( (BOARD_MINICARD == pHalData->BoardType )|| + (BOARD_USB_SOLO == pHalData->BoardType)|| + (BOARD_USB_COMBO == pHalData->BoardType)) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2); + switch(pLed->LedPin) + { + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xf0)|BIT5|BIT6); // SW control led0 on. + break; + + case LED_PIN_LED1: + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0x0f)|BIT5); // SW control led1 on. + break; + + default: + break; + + } + } + else + { + switch(pLed->LedPin) + { + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + if(pHalData->AntDivCfg) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2); + rtw_write8(padapter, REG_LEDCFG2, (LedCfg&0xe0)|BIT7|BIT6|BIT5); // SW control led0 on. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2))); + } + else +#endif + { + LedCfg = rtw_read8(padapter, REG_LEDCFG0); + rtw_write8(padapter,REG_LEDCFG0, LedCfg&0x70); // SW control led0 on. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + } + break; + + case LED_PIN_LED1: + LedCfg = rtw_read8(padapter,(REG_LEDCFG1)); + rtw_write8(padapter,(REG_LEDCFG1), LedCfg&0x70); // SW control led1 on. + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOn LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + + break; + + default: + break; + } + } + pLed->bLedOn = _TRUE; + +} + + +// +// Description: +// Turn off LED according to LedPin specified. +// +static void +SwLedOff( + _adapter *padapter, + PLED_871x pLed +) +{ + u8 LedCfg; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if((padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + goto exit; + } + + if( (BOARD_MINICARD == pHalData->BoardType )|| + (BOARD_USB_SOLO == pHalData->BoardType)|| + (BOARD_USB_COMBO == pHalData->BoardType)) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2);//0x4E + + switch(pLed->LedPin) + { + + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: + if(BOARD_USB_COMBO == pHalData->BoardType) + { + LedCfg &= 0x90; // Set to software control. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3)); + LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG); + LedCfg &= 0xFE; + rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg); + } + else + { + LedCfg &= 0xf0; // Set to software control. + if(pHalData->bLedOpenDrain == _TRUE) // Open-drain arrangement for controlling the LED + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT1|BIT5|BIT6)); + else + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT5|BIT6)); + } + break; + + case LED_PIN_LED1: + LedCfg &= 0x0f; // Set to software control. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3)); + break; + + default: + break; + } + } + else + { + switch(pLed->LedPin) + { + case LED_PIN_GPIO0: + break; + + case LED_PIN_LED0: +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + if(pHalData->AntDivCfg) + { + LedCfg = rtw_read8(padapter, REG_LEDCFG2); + LedCfg &= 0xe0; // Set to software control. + rtw_write8(padapter, REG_LEDCFG2, (LedCfg|BIT3|BIT7|BIT6|BIT5)); + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%x\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG2))); + } + else +#endif + { + LedCfg = rtw_read8(padapter, REG_LEDCFG0); + LedCfg &= 0x70; // Set to software control. + rtw_write8(padapter, REG_LEDCFG0, (LedCfg|BIT3)); + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED0 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + } + break; + + case LED_PIN_LED1: + LedCfg = rtw_read8(padapter, (REG_LEDCFG1)); + LedCfg &= 0x70; // Set to software control. + rtw_write8(padapter, (REG_LEDCFG1), (LedCfg|BIT3)); + //RT_TRACE(COMP_LED, DBG_LOUD, ("SwLedOff LED1 0x%lx\n", PlatformEFIORead4Byte(Adapter, REG_LEDCFG0))); + break; + + default: + break; + } + } + +exit: + pLed->bLedOn = _FALSE; + + ResetLedStatus(pLed); + +} + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ + + +// +// Description: +// Implementation of LED blinking behavior. +// It toggle off LED and schedule corresponding timer if necessary. +// +static void +SwLedBlink( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + // Determine if we shall change LED state again. + pLed->BlinkTimes--; + switch(pLed->CurrLedState) + { + + case LED_BLINK_NORMAL: + if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_StartToBlink: + if( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) ) + { + bStopBlinking = _TRUE; + } + if( check_fwstate(pmlmepriv, _FW_LINKED) && + (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) ) + { + bStopBlinking = _TRUE; + } + else if(pLed->BlinkTimes == 0) + { + bStopBlinking = _TRUE; + } + break; + + case LED_BLINK_WPS: + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + break; + + + default: + bStopBlinking = _TRUE; + break; + + } + + if(bStopBlinking) + { + //if( padapter->pwrctrlpriv.cpwm >= PS_STATE_S2) + if(0) + { + SwLedOff(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE)) + { + SwLedOn(padapter, pLed); + } + else if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && pLed->bLedOn == _TRUE) + { + SwLedOff(padapter, pLed); + } + + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + // Assign LED state to toggle. + if( pLed->BlinkingLedState == LED_ON ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + + // Schedule a timer to toggle LED state. + switch( pLed->CurrLedState ) + { + case LED_BLINK_NORMAL: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_SLOWLY: + case LED_BLINK_StartToBlink: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + + case LED_BLINK_WPS: + { + if( pLed->BlinkingLedState == LED_ON ) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + else + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + break; + + default: + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + break; + } + } +} + + +static void +SwLedBlink1( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_871x pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,( "Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + + if(pHalData->EEPROMCustomerID == RT_CID_DEFAULT) + { + if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + if(!pLed1->bSWLedCtrl) + { + SwLedOn(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(!pLed1->bLedOn) + SwLedOn(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn on pLed1\n")); + } + else + { + if(!pLed1->bSWLedCtrl) + { + SwLedOff(padapter, pLed1); + pLed1->bSWLedCtrl = _TRUE; + } + else if(pLed1->bLedOn) + SwLedOff(padapter, pLed1); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (): turn off pLed1\n")); + } + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_NORMAL: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + break; + + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->BlinkTimes = 0; + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == LED_ON) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + default: + break; + } + +} + +static void +SwLedBlink2( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop scan blink CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("stop CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + +} + +static void +SwLedBlink3( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + if(pLed->CurrLedState != LED_BLINK_WPS_STOP) + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + + if( !pLed->bLedOn ) + SwLedOn(padapter, pLed); + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + else if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + + if( pLed->bLedOn ) + SwLedOff(padapter, pLed); + + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + break; + + case LED_BLINK_WPS_STOP: //WPS success + if(pLed->BlinkingLedState == LED_ON) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + bStopBlinking = _FALSE; + } + else + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on ) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + pLed->bLedWPSBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + +} + + +static void +SwLedBlink4( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + PLED_871x pLed1 = &(ledpriv->SwLed1); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + if(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN) + { + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + SwLedOff(padapter, pLed1); + } + + switch(pLed->CurrLedState) + { + case LED_BLINK_SLOWLY: + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_BLINK_StartToBlink: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _FALSE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _FALSE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + case LED_BLINK_WPS: + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_BLINK_WPS_STOP: //WPS authentication fail + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + break; + + case LED_BLINK_WPS_STOP_OVERLAP: //WPS session overlap + pLed->BlinkTimes--; + if(pLed->BlinkTimes == 0) + { + if(pLed->bLedOn) + { + pLed->BlinkTimes = 1; + } + else + { + bStopBlinking = _TRUE; + } + } + + if(bStopBlinking) + { + pLed->BlinkTimes = 10; + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink4 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +static void +SwLedBlink5( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + switch(pLed->CurrLedState) + { + case LED_SCAN_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedScanBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + } + break; + + + case LED_TXRX_BLINK: + pLed->BlinkTimes--; + if( pLed->BlinkTimes == 0 ) + { + bStopBlinking = _TRUE; + } + + if(bStopBlinking) + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if(pLed->bLedOn) + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if(!pLed->bLedOn) + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + + pLed->bLedBlinkInProgress = _FALSE; + } + else + { + if( padapter->pwrctrlpriv.rf_pwrstate != rf_on && padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) + { + SwLedOff(padapter, pLed); + } + else + { + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + } + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("SwLedBlink5 CurrLedState %d\n", pLed->CurrLedState)); + + +} + +static void +SwLedBlink6( + PLED_871x pLed + ) +{ + _adapter *padapter = pLed->padapter; + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + u8 bStopBlinking = _FALSE; + + // Change LED according to BlinkingLedState specified. + if( pLed->BlinkingLedState == LED_ON ) + { + SwLedOn(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn on\n", pLed->BlinkTimes)); + } + else + { + SwLedOff(padapter, pLed); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Blinktimes (%d): turn off\n", pLed->BlinkTimes)); + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("<==== blink6\n")); +} + + +// +// Description: +// Callback function of LED BlinkTimer, +// it just schedules to corresponding BlinkWorkItem. +// +static void +BlinkTimerCallback( + unsigned long data + ) +{ + PLED_871x pLed = (PLED_871x)data; + _adapter *padapter = pLed->padapter; + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + _set_workitem(&(pLed->BlinkWorkItem)); +} + + +// +// Description: +// Callback function of LED BlinkWorkItem. +// We dispatch acture LED blink action according to LedStrategy. +// +static void BlinkWorkItemCallback(struct work_struct *work) +{ + PLED_871x pLed = container_of(work, LED_871x, BlinkWorkItem); + struct led_priv *ledpriv = &(pLed->padapter->ledpriv); + _adapter *padapter = pLed->padapter; + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)) + { + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + SwLedBlink(pLed); + break; + + case SW_LED_MODE1: + SwLedBlink1(pLed); + break; + + case SW_LED_MODE2: + SwLedBlink2(pLed); + break; + + case SW_LED_MODE3: + SwLedBlink3(pLed); + break; + + case SW_LED_MODE4: + SwLedBlink4(pLed); + break; + + case SW_LED_MODE5: + SwLedBlink5(pLed); + break; + + case SW_LED_MODE6: + SwLedBlink6(pLed); + break; + + default: + //RT_TRACE(COMP_LED, DBG_LOUD, ("BlinkWorkItemCallback 0x%x \n", pHalData->LedStrategy)); + //SwLedBlink(pLed); + break; + } +} + + + +//================================================================================ +// Default LED behavior. +//================================================================================ + +// +// Description: +// Implement each led action for SW_LED_MODE0. +// This is default strategy. +// +static void +SwLedControlMode0( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_871x pLed = &(ledpriv->SwLed1); + + // Decide led state + switch(LedAction) + { + case LED_CTL_TX: + case LED_CTL_RX: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_NORMAL; + pLed->BlinkTimes = 2; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + break; + + case LED_CTL_START_TO_LINK: + if( pLed->bLedBlinkInProgress == _FALSE ) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_StartToBlink; + pLed->BlinkTimes = 24; + + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->CurrLedState = LED_BLINK_StartToBlink; + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = LED_ON; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + SwLedOn(padapter, pLed); + } + break; + + case LED_CTL_NO_LINK: + pLed->CurrLedState = LED_OFF; + if( pLed->bLedBlinkInProgress == _FALSE ) + { + SwLedOff(padapter, pLed); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + if(pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + SwLedOff(padapter, pLed); + break; + + case LED_CTL_START_WPS: + if( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == LED_ON) + { + pLed->bLedBlinkInProgress = _TRUE; + + pLed->CurrLedState = LED_BLINK_WPS; + pLed->BlinkTimes = 20; + + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedBlinkInProgress) + { + pLed->CurrLedState = LED_OFF; + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + break; + + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); + +} + + //ALPHA, added by chiyoko, 20090106 +static void +SwLedControlMode1( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct led_priv *ledpriv = &(padapter->ledpriv); + PLED_871x pLed = &(ledpriv->SwLed0); + struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + if( pLed->bLedLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_NORMAL; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + + case LED_CTL_STOP_WPS: + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress == _TRUE ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //Arcadyan/Sitecom , added by chiyoko, 20090216 +static void +SwLedControlMode2( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_STOP_WPS: + pLed->bLedWPSBlinkInProgress = _FALSE; + if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + break; + + case LED_CTL_STOP_WPS_FAIL: + pLed->bLedWPSBlinkInProgress = _FALSE; + if(padapter->pwrctrlpriv.rf_pwrstate != rf_on) + { + SwLedOff(padapter, pLed); + } + else + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); + } + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + //COREGA, added by chiyoko, 20090316 + static void + SwLedControlMode3( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_SITE_SURVEY: + if(pmlmepriv->LinkDetectInfo.bBusyTraffic) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_LINK: + if(IS_LED_WPS_BLINKING(pLed)) + return; + + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_STOP_WPS: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + else + { + pLed->bLedWPSBlinkInProgress = _TRUE; + } + + pLed->CurrLedState = LED_BLINK_WPS_STOP; + if(pLed->bLedOn) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), 0); + } + + break; + + case LED_CTL_STOP_WPS_FAIL: + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_START_TO_LINK: + case LED_CTL_NO_LINK: + if(!IS_LED_BLINKING(pLed)) + { + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), 0); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("CurrLedState %d\n", pLed->CurrLedState)); +} + + + //Edimax-Belkin, added by chiyoko, 20090413 +static void +SwLedControlMode4( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + PLED_871x pLed1 = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_START_TO_LINK: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if( pLed->bLedStartToLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedNoLinkBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + + pLed->bLedStartToLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_StartToBlink; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + //LED1 settings + if(LedAction == LED_CTL_LINK) + { + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + } + + if( pLed->bLedNoLinkBlinkInProgress == _FALSE ) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + } + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(IS_LED_WPS_BLINKING(pLed)) + return; + + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_SCAN_BLINK || IS_LED_WPS_BLINKING(pLed)) + { + return; + } + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_START_WPS: //wait until xinpin finish + case LED_CTL_START_WPS_BOTTON: + if(pLed1->bLedWPSBlinkInProgress) + { + pLed1->bLedWPSBlinkInProgress = _FALSE; + _cancel_timer_ex(&(pLed1->BlinkTimer)); + + pLed1->BlinkingLedState = LED_OFF; + pLed1->CurrLedState = LED_OFF; + + if(pLed1->bLedOn) + _set_timer(&(pLed->BlinkTimer), 0); + } + + if(pLed->bLedWPSBlinkInProgress ==_FALSE) + { + if(pLed->bLedNoLinkBlinkInProgress == _TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if(pLed->bLedScanBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + pLed->bLedWPSBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_WPS; + if( pLed->bLedOn ) + { + pLed->BlinkingLedState = LED_OFF; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); + } + else + { + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + } + } + break; + + case LED_CTL_STOP_WPS: //WPS connect success + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + break; + + case LED_CTL_STOP_WPS_FAIL: //WPS authentication fail + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = LED_OFF; + else + pLed1->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap + if(pLed->bLedWPSBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + + pLed->bLedNoLinkBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_BLINK_SLOWLY; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA); + + //LED1 settings + if(pLed1->bLedWPSBlinkInProgress) + _cancel_timer_ex(&(pLed1->BlinkTimer)); + else + pLed1->bLedWPSBlinkInProgress = _TRUE; + + pLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP; + pLed1->BlinkTimes = 10; + if( pLed1->bLedOn ) + pLed1->BlinkingLedState = LED_OFF; + else + pLed1->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); + + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + + if( pLed->bLedNoLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedNoLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedLinkBlinkInProgress = _FALSE; + } + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + if( pLed->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedWPSBlinkInProgress = _FALSE; + } + if( pLed->bLedScanBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedScanBlinkInProgress = _FALSE; + } + if( pLed->bLedStartToLinkBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedStartToLinkBlinkInProgress = _FALSE; + } + + if( pLed1->bLedWPSBlinkInProgress ) + { + _cancel_timer_ex(&(pLed1->BlinkTimer)); + pLed1->bLedWPSBlinkInProgress = _FALSE; + } + + pLed1->BlinkingLedState = LED_UNKNOWN; + SwLedOff(padapter, pLed); + SwLedOff(padapter, pLed1); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + + + //Sercomm-Belkin, added by chiyoko, 20090415 +static void +SwLedControlMode5( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed = &(ledpriv->SwLed0); + + if(pHalData->EEPROMCustomerID == RT_CID_819x_CAMEO) + pLed = &(ledpriv->SwLed1); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_NO_LINK: + case LED_CTL_LINK: //solid blue + pLed->CurrLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; + + _set_timer(&(pLed->BlinkTimer), 0); + break; + + case LED_CTL_SITE_SURVEY: + if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)) + ; + else if(pLed->bLedScanBlinkInProgress ==_FALSE) + { + if(pLed->bLedBlinkInProgress ==_TRUE) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + pLed->bLedScanBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_SCAN_BLINK; + pLed->BlinkTimes = 24; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA); + } + break; + + case LED_CTL_TX: + case LED_CTL_RX: + if(pLed->bLedBlinkInProgress ==_FALSE) + { + if(pLed->CurrLedState == LED_SCAN_BLINK) + { + return; + } + pLed->bLedBlinkInProgress = _TRUE; + pLed->CurrLedState = LED_TXRX_BLINK; + pLed->BlinkTimes = 2; + if( pLed->bLedOn ) + pLed->BlinkingLedState = LED_OFF; + else + pLed->BlinkingLedState = LED_ON; + _set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA); + } + break; + + case LED_CTL_POWER_OFF: + pLed->CurrLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; + + if( pLed->bLedBlinkInProgress) + { + _cancel_timer_ex(&(pLed->BlinkTimer)); + pLed->bLedBlinkInProgress = _FALSE; + } + + SwLedOff(padapter, pLed); + break; + + default: + break; + + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("Led %d\n", pLed->CurrLedState)); +} + + //WNC-Corega, added by chiyoko, 20090902 +static void +SwLedControlMode6( + _adapter *padapter, + LED_CTL_MODE LedAction +) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + PLED_871x pLed0 = &(ledpriv->SwLed0); + + switch(LedAction) + { + case LED_CTL_POWER_ON: + case LED_CTL_LINK: + case LED_CTL_NO_LINK: + _cancel_timer_ex(&(pLed0->BlinkTimer)); + pLed0->CurrLedState = LED_ON; + pLed0->BlinkingLedState = LED_ON; + _set_timer(&(pLed0->BlinkTimer), 0); + break; + + case LED_CTL_POWER_OFF: + SwLedOff(padapter, pLed0); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("ledcontrol 6 Led %d\n", pLed->CurrLedState)); +} + + +// +// Description: +// Dispatch LED action according to pHalData->LedStrategy. +// +static void +LedControl871x( + _adapter *padapter, + LED_CTL_MODE LedAction + ) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + + if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) + ||(padapter->hw_init_completed == _FALSE) ) + { + return; + } + + + if( ledpriv->bRegUseLed == _FALSE) + return; + + //if (!priv->up) + // return; + + //if(priv->bInHctTest) + // return; + + if( (padapter->pwrctrlpriv.rf_pwrstate != rf_on && + padapter->pwrctrlpriv.rfoff_reason > RF_CHANGE_BY_PS) && + (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || + LedAction == LED_CTL_SITE_SURVEY || + LedAction == LED_CTL_LINK || + LedAction == LED_CTL_NO_LINK || + LedAction == LED_CTL_POWER_ON) ) + { + return; + } + + switch(ledpriv->LedStrategy) + { + case SW_LED_MODE0: + //SwLedControlMode0(padapter, LedAction); + break; + + case SW_LED_MODE1: + SwLedControlMode1(padapter, LedAction); + break; + case SW_LED_MODE2: + SwLedControlMode2(padapter, LedAction); + break; + + case SW_LED_MODE3: + SwLedControlMode3(padapter, LedAction); + break; + + case SW_LED_MODE4: + SwLedControlMode4(padapter, LedAction); + break; + + case SW_LED_MODE5: + SwLedControlMode5(padapter, LedAction); + break; + + case SW_LED_MODE6: + SwLedControlMode6(padapter, LedAction); + break; + + default: + break; + } + + RT_TRACE(_module_rtl8712_led_c_,_drv_info_,("LedStrategy:%d, LedAction %d\n", ledpriv->LedStrategy,LedAction)); +} + +// +// Description: +// Initialize all LED_871x objects. +// +void +rtl8192cu_InitSwLeds( + _adapter *padapter + ) +{ + struct led_priv *pledpriv = &(padapter->ledpriv); + + pledpriv->LedControlHandler = LedControl871x; + + InitLed871x(padapter, &(pledpriv->SwLed0), LED_PIN_LED0); + + InitLed871x(padapter,&(pledpriv->SwLed1), LED_PIN_LED1); +} + + +// +// Description: +// DeInitialize all LED_819xUsb objects. +// +void +rtl8192cu_DeInitSwLeds( + _adapter *padapter + ) +{ + struct led_priv *ledpriv = &(padapter->ledpriv); + + DeInitLed871x( &(ledpriv->SwLed0) ); + DeInitLed871x( &(ledpriv->SwLed1) ); +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c new file mode 100755 index 000000000000..4285d600088c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_recv.c @@ -0,0 +1,380 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192CU_RECV_C_ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include +#include + +#include + + +void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf) +{ + + precvbuf->transfer_len = 0; + + precvbuf->len = 0; + + precvbuf->ref_cnt = 0; + + if(precvbuf->pbuf) + { + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf; + precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ; + } + +} + +int rtl8192cu_init_recv_priv(_adapter *padapter) +{ + struct recv_priv *precvpriv = &padapter->recvpriv; + int i, res = _SUCCESS; + struct recv_buf *precvbuf; + +#ifdef CONFIG_RECV_THREAD_MODE + _rtw_init_sema(&precvpriv->recv_sema, 0);//will be removed + _rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);//will be removed +#endif + +#ifdef PLATFORM_LINUX + tasklet_init(&precvpriv->recv_tasklet, + (void(*)(unsigned long))rtl8192cu_recv_tasklet, + (unsigned long)padapter); +#endif + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +#ifdef PLATFORM_LINUX + precvpriv->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); + if(precvpriv->int_in_urb == NULL){ + DBG_8192C("alloc_urb for interrupt in endpoint fail !!!!\n"); + } +#endif + precvpriv->int_in_buf = rtw_zmalloc(sizeof(INTERRUPT_MSG_FORMAT_EX)); + if(precvpriv->int_in_buf == NULL){ + DBG_8192C("alloc_mem for interrupt in endpoint fail !!!!\n"); + } +#endif + + //init recv_buf + _rtw_init_queue(&precvpriv->free_recv_buf_queue); + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + _rtw_init_queue(&precvpriv->recv_buf_pending_queue); +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX + + precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4); + if(precvpriv->pallocated_recv_buf==NULL){ + res= _FAIL; + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("alloc recv_buf fail!\n")); + goto exit; + } + _rtw_memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF *sizeof(struct recv_buf) + 4); + + precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_recv_buf), 4); + //precvpriv->precv_buf = precvpriv->pallocated_recv_buf + 4 - + // ((uint) (precvpriv->pallocated_recv_buf) &(4-1)); + + + precvbuf = (struct recv_buf*)precvpriv->precv_buf; + + for(i=0; i < NR_RECVBUFF ; i++) + { + _rtw_init_listhead(&precvbuf->list); + + _rtw_spinlock_init(&precvbuf->recvbuf_lock); + + precvbuf->alloc_sz = MAX_RECVBUF_SZ; + + res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf); + if(res==_FAIL) + break; + + precvbuf->ref_cnt = 0; + precvbuf->adapter =padapter; + + + //rtw_list_insert_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue)); + + precvbuf++; + + } + + precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF; + +#ifdef PLATFORM_LINUX + + skb_queue_head_init(&precvpriv->rx_skb_queue); + +#ifdef CONFIG_PREALLOC_RECV_SKB + { + int i; + SIZE_PTR tmpaddr=0; + SIZE_PTR alignment=0; + struct sk_buff *pskb=NULL; + + skb_queue_head_init(&precvpriv->free_recv_skb_queue); + + for(i=0; ipnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); + #endif + + if(pskb) + { + pskb->dev = padapter->pnetdev; + + tmpaddr = (SIZE_PTR)pskb->data; + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); + skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment)); + + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); + } + + pskb=NULL; + + } + } +#endif + +#endif + +exit: + + return res; + +} + +void rtl8192cu_free_recv_priv (_adapter *padapter) +{ + int i; + struct recv_buf *precvbuf; + struct recv_priv *precvpriv = &padapter->recvpriv; + + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + + for(i=0; i < NR_RECVBUFF ; i++) + { + rtw_os_recvbuf_resource_free(padapter, precvbuf); + precvbuf++; + } + + if(precvpriv->pallocated_recv_buf) + rtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4); + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +#ifdef PLATFORM_LINUX + if(precvpriv->int_in_urb) + { + usb_free_urb(precvpriv->int_in_urb); + } +#endif + if(precvpriv->int_in_buf) + rtw_mfree(precvpriv->int_in_buf, sizeof(INTERRUPT_MSG_FORMAT_EX)); +#endif + +#ifdef PLATFORM_LINUX + + if (skb_queue_len(&precvpriv->rx_skb_queue)) { + DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n"); + } + + skb_queue_purge(&precvpriv->rx_skb_queue); + +#ifdef CONFIG_PREALLOC_RECV_SKB + + if (skb_queue_len(&precvpriv->free_recv_skb_queue)) { + DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); + } + + skb_queue_purge(&precvpriv->free_recv_skb_queue); + +#endif + +#endif + +} + +void rtl8192cu_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat) +{ + u8 physt, qos, shift, icverr, htc, crcerr; + u16 drvinfo_sz=0; + struct phy_stat *pphy_info; + struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; + _adapter *padapter = precvframe->u.hdr.adapter; + u8 bPacketMatchBSSID =_FALSE; + u8 bPacketToSelf = _FALSE; + u8 bPacketBeacon = _FALSE; + + + //Offset 0 + drvinfo_sz = (le32_to_cpu(prxstat->rxdw0)&0x000f0000)>>16; + drvinfo_sz = drvinfo_sz<<3; + + pattrib->bdecrypted = ((le32_to_cpu(prxstat->rxdw0) & BIT(27)) >> 27)? 0:1; + + physt = ((le32_to_cpu(prxstat->rxdw0) & BIT(26)) >> 26)? 1:0; + + shift = (le32_to_cpu(prxstat->rxdw0)&0x03000000)>>24; + + qos = ((le32_to_cpu(prxstat->rxdw0) & BIT(23)) >> 23)? 1:0; + + icverr = ((le32_to_cpu(prxstat->rxdw0) & BIT(15)) >> 15)? 1:0; + + pattrib->crc_err = crcerr = ((le32_to_cpu(prxstat->rxdw0) & BIT(14)) >> 14 )? 1:0; + + + //Offset 4 + + //Offset 8 + + //Offset 12 +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + if ( le32_to_cpu(prxstat->rxdw3) & BIT(13)) { + pattrib->tcpchk_valid = 1; // valid + if ( le32_to_cpu(prxstat->rxdw3) & BIT(11) ) { + pattrib->tcp_chkrpt = 1; // correct + //DBG_8192C("tcp csum ok\n"); + } else + pattrib->tcp_chkrpt = 0; // incorrect + + if ( le32_to_cpu(prxstat->rxdw3) & BIT(12) ) + pattrib->ip_chkrpt = 1; // correct + else + pattrib->ip_chkrpt = 0; // incorrect + + } else { + pattrib->tcpchk_valid = 0; // invalid + } + +#endif + + pattrib->mcs_rate=(u8)((le32_to_cpu(prxstat->rxdw3))&0x3f); + pattrib->rxht=(u8)((le32_to_cpu(prxstat->rxdw3) >>6)&0x1); + + htc = (u8)((le32_to_cpu(prxstat->rxdw3) >>10)&0x1); + + //Offset 16 + //Offset 20 + + +#if 0 //dump rxdesc for debug + DBG_8192C("drvinfo_sz=%d\n", drvinfo_sz); + DBG_8192C("physt=%d\n", physt); + DBG_8192C("shift=%d\n", shift); + DBG_8192C("qos=%d\n", qos); + DBG_8192C("icverr=%d\n", icverr); + DBG_8192C("htc=%d\n", htc); + DBG_8192C("bdecrypted=%d\n", pattrib->bdecrypted); + DBG_8192C("mcs_rate=%d\n", pattrib->mcs_rate); + DBG_8192C("rxht=%d\n", pattrib->rxht); +#endif + + //phy_info + if(drvinfo_sz && physt) + { + bPacketMatchBSSID = ((!IsFrameTypeCtrl(precvframe->u.hdr.rx_data)) && !icverr && !crcerr && + _rtw_memcmp(get_hdr_bssid(precvframe->u.hdr.rx_data), get_bssid(&padapter->mlmepriv), ETH_ALEN)); + + bPacketToSelf = bPacketMatchBSSID && (_rtw_memcmp(get_da(precvframe->u.hdr.rx_data), myid(&padapter->eeprompriv), ETH_ALEN)); + + bPacketBeacon = (GetFrameSubType(precvframe->u.hdr.rx_data) == WIFI_BEACON); + + + pphy_info = (struct phy_stat *)(prxstat+1); + + //DBG_8192C("pphy_info, of0=0x%08x\n", *pphy_info); + //DBG_8192C("pphy_info, of1=0x%08x\n", *(pphy_info+1)); + //DBG_8192C("pphy_info, of2=0x%08x\n", *(pphy_info+2)); + //DBG_8192C("pphy_info, of3=0x%08x\n", *(pphy_info+3)); + //DBG_8192C("pphy_info, of4=0x%08x\n", *(pphy_info+4)); + //DBG_8192C("pphy_info, of5=0x%08x\n", *(pphy_info+5)); + //DBG_8192C("pphy_info, of6=0x%08x\n", *(pphy_info+6)); + //DBG_8192C("pphy_info, of7=0x%08x\n", *(pphy_info+7)); + + rtl8192c_query_rx_phy_status(precvframe, pphy_info); + + precvframe->u.hdr.psta = NULL; + if(bPacketMatchBSSID && check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) + { + u8 *sa; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + sa = get_sa(precvframe->u.hdr.rx_data); + + psta = rtw_get_stainfo(pstapriv, sa); + if(psta) + { + precvframe->u.hdr.psta = psta; + rtl8192c_process_phy_info(padapter, precvframe); + } + } + else if( bPacketToSelf || (bPacketBeacon && bPacketMatchBSSID) ) + { + if(check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + { + u8 *sa; + struct sta_info *psta=NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + + sa = get_sa(precvframe->u.hdr.rx_data); + + psta = rtw_get_stainfo(pstapriv, sa); + if(psta) + { + precvframe->u.hdr.psta = psta; + } + } + + rtl8192c_process_phy_info(padapter, precvframe); + } + +#if 0 //dump phy_status for debug + + DBG_8192C("signal_qual=%d\n", pattrib->signal_qual); + DBG_8192C("signal_strength=%d\n", pattrib->signal_strength); +#endif + + } + + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c new file mode 100755 index 000000000000..c1356058c094 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/rtl8192cu_xmit.c @@ -0,0 +1,1336 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _RTL8192C_XMIT_C_ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) +#error "Shall be Linux or Windows, but not both!\n" +#endif + + +s32 rtl8192cu_init_xmit_priv(_adapter *padapter) +{ + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + +#ifdef PLATFORM_LINUX + tasklet_init(&pxmitpriv->xmit_tasklet, + (void(*)(unsigned long))rtl8192cu_xmit_tasklet, + (unsigned long)padapter); +#endif + return _SUCCESS; +} + +void rtl8192cu_free_xmit_priv(_adapter *padapter) +{ +} + +u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe) +{ + u32 addr; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + switch(pattrib->qsel) + { + case 0: + case 3: + addr = BE_QUEUE_INX; + break; + case 1: + case 2: + addr = BK_QUEUE_INX; + break; + case 4: + case 5: + addr = VI_QUEUE_INX; + break; + case 6: + case 7: + addr = VO_QUEUE_INX; + break; + case 0x10: + addr = BCN_QUEUE_INX; + break; + case 0x11://BC/MC in PS (HIQ) + addr = HIGH_QUEUE_INX; + break; + case 0x12: + addr = MGT_QUEUE_INX; + break; + default: + addr = BE_QUEUE_INX; + break; + + } + + return addr; + +} + +static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib) +{ + u8 qsel; + + qsel = pattrib->priority; + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel)); + pattrib->qsel = qsel; +} + +int urb_zero_packet_chk(_adapter *padapter, int sz) +{ + int blnSetTxDescOffset; + struct dvobj_priv *pdvobj = (struct dvobj_priv*)&padapter->dvobjpriv; + + if ( pdvobj->ishighspeed ) + { + if ( ( (sz + TXDESC_SIZE) % 512 ) == 0 ) { + blnSetTxDescOffset = 1; + } else { + blnSetTxDescOffset = 0; + } + } + else + { + if ( ( (sz + TXDESC_SIZE) % 64 ) == 0 ) { + blnSetTxDescOffset = 1; + } else { + blnSetTxDescOffset = 0; + } + } + + return blnSetTxDescOffset; + +} + +void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc) +{ + u16 *usPtr = (u16*)ptxdesc; + u32 count = 16; // (32 bytes / 2 bytes per XOR) => 16 times + u32 index; + u16 checksum = 0; + + //Clear first + ptxdesc->txdw7 &= cpu_to_le32(0xffff0000); + + for(index = 0 ; index < count ; index++){ + checksum = checksum ^ le16_to_cpu(*(usPtr + index)); + } + + ptxdesc->txdw7 |= cpu_to_le32(0x0000ffff&checksum); + +} + +void fill_txdesc_sectype(struct pkt_attrib *pattrib, struct tx_desc *ptxdesc) +{ + if ((pattrib->encrypt > 0) && !pattrib->bswenc) + { + switch (pattrib->encrypt) + { + //SEC_TYPE + case _WEP40_: + case _WEP104_: + ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000); + break; + case _TKIP_: + case _TKIP_WTMIC_: + //ptxdesc->txdw1 |= cpu_to_le32((0x02<<22)&0x00c00000); + ptxdesc->txdw1 |= cpu_to_le32((0x01<<22)&0x00c00000); + break; + case _AES_: + ptxdesc->txdw1 |= cpu_to_le32((0x03<<22)&0x00c00000); + break; + case _NO_PRIVACY_: + default: + break; + + } + + } + +} + +void fill_txdesc_vcs(struct pkt_attrib *pattrib, u32 *pdw) +{ + //DBG_8192C("cvs_mode=%d\n", pattrib->vcs_mode); + + switch(pattrib->vcs_mode) + { + case RTS_CTS: + *pdw |= cpu_to_le32(BIT(12)); + break; + case CTS_TO_SELF: + *pdw |= cpu_to_le32(BIT(11)); + break; + case NONE_VCS: + default: + break; + } + + if(pattrib->vcs_mode) + { + *pdw |= cpu_to_le32(BIT(13));//ENABLE HW RTS + } + +} + +void fill_txdesc_phy(struct pkt_attrib *pattrib, u32 *pdw) +{ + //DBG_8192C("bwmode=%d, ch_off=%d\n", pattrib->bwmode, pattrib->ch_offset); + + if(pattrib->ht_en) + { + *pdw |= (pattrib->bwmode&HT_CHANNEL_WIDTH_40)? cpu_to_le32(BIT(25)):0; + + if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) + *pdw |= cpu_to_le32((0x01<<20)&0x003f0000); + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER) + *pdw |= cpu_to_le32((0x02<<20)&0x003f0000); + else if(pattrib->ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) + *pdw |= 0; + else + *pdw |= cpu_to_le32((0x03<<20)&0x003f0000); + } +} + +#ifdef CONFIG_USB_TX_AGGREGATION +static void _update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, int sz) +{ + uint qsel; + _adapter *padapter = pxmitframe->padapter; + struct ht_priv *phtpriv = &padapter->mlmepriv.htpriv; + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + sint bmcst = IS_MCAST(pattrib->ra); + struct tx_desc *ptxdesc = (struct tx_desc*)pmem; + + + _rtw_memset(ptxdesc, 0, sizeof(struct tx_desc)); + + //4 offset 0 + ptxdesc->txdw0 |= cpu_to_le32(sz & 0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000);//32 bytes for TX Desc + + if (bmcst) ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); + + RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, + ("update_txdesc: offset0=0x%08x\n", ptxdesc->txdw0)); + + //4 offset 4 + // pkt_offset, unit:8 bytes padding + if (pxmitframe->pkt_offset > 0) + ptxdesc->txdw1 |= cpu_to_le32((pxmitframe->pkt_offset << 26) & 0x7c000000); + +#ifdef CONFIG_USB_TX_AGGREGATION + if (pxmitframe->agg_num > 1) + ptxdesc->txdw5 |= cpu_to_le32((pxmitframe->agg_num << 24) & 0xff000000); +#endif + + if (pxmitframe->frame_tag == DATA_FRAMETAG) + { + //4 offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel & 0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); + + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid << 16) & 0x000f0000); + + fill_txdesc_sectype(pattrib, ptxdesc); + + if(pattrib->ampdu_en==_TRUE) + ptxdesc->txdw1 |= cpu_to_le32(BIT(5));//AGG EN + else + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + + + //4 offset 8 + + + //4 offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0xffff0000); + + + //4 offset 16 , offset 20 + if (pattrib->qos_en) + ptxdesc->txdw4 |= cpu_to_le32(BIT(6));//QoS + + if ((pattrib->ether_type != 0x888e) && + (pattrib->ether_type != 0x0806) && + (pattrib->dhcp_pkt != 1)) + { + //Non EAP & ARP & DHCP type data packet + + fill_txdesc_vcs(pattrib, &ptxdesc->txdw4); + fill_txdesc_phy(pattrib, &ptxdesc->txdw4); + + ptxdesc->txdw4 |= cpu_to_le32(0x00000008);//RTS Rate=24M + ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00); + //ptxdesc->txdw5 |= cpu_to_le32(0x0000000b);//DataRate - 54M + + //use REG_INIDATA_RATE_SEL value + ptxdesc->txdw5 |= cpu_to_le32(pdmpriv->INIDATA_RATE[pattrib->mac_id]); + + if (0)//for driver dbg + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + if (pattrib->ht_en) + ptxdesc->txdw5 |= cpu_to_le32(BIT(6));//SGI + + ptxdesc->txdw5 |= cpu_to_le32(0x00000013);//init rate - mcs7 + } + } + else + { + // EAP data packet and ARP packet. + // Use the 1M data rate to send the EAP/ARP packet. + // This will maybe make the handshake smooth. + + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + } + + + //4 offset 24 +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + if (pattrib->hw_tcp_csum == 1) { + // ptxdesc->txdw6 = 0; // clear TCP_CHECKSUM and IP_CHECKSUM. It's zero already!! + u8 ip_hdr_offset = 32 + pattrib->hdrlen + pattrib->iv_len + 8; + ptxdesc->txdw7 = (1 << 31) | (ip_hdr_offset << 16); + DBG_8192C("ptxdesc->txdw7 = %08x\n", ptxdesc->txdw7); + } +#endif + } + else if(pxmitframe->frame_tag == MGNT_FRAMETAG) + { + //DBG_8192C("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); + + //4 offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel&0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); + + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); + + //fill_txdesc_sectype(pattrib, ptxdesc); + + + //4 offset 8 + + + //4 offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + + //4 offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + + //4 offset 20 + } + else if(pxmitframe->frame_tag == TXAGG_FRAMETAG) + { + DBG_8192C("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); + } + else + { + DBG_8192C("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); + + //4 offset 4 + ptxdesc->txdw1 |= cpu_to_le32((4)&0x1f);//CAM_ID(MAC_ID) + + ptxdesc->txdw1 |= cpu_to_le32((6<< 16) & 0x000f0000);//raid + + + //4 offset 8 + + + //4 offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0xffff0000); + + + //4 offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + + //4 offset 20 + } + + // 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS. + // (1) The sequence number of each non-Qos frame / broadcast / multicast / + // mgnt frame should be controled by Hw because Fw will also send null data + // which we cannot control when Fw LPS enable. + // --> default enable non-Qos data sequense number. 2010.06.23. by tynli. + // (2) Enable HW SEQ control for beacon packet, because we use Hw beacon. + // (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets. + // 2010.06.23. Added by tynli. + if(!pattrib->qos_en) + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + } + + rtl8192cu_cal_txdesc_chksum(ptxdesc); +} +#endif + +static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz) +{ + int pull=0; + uint qsel; + _adapter *padapter = pxmitframe->padapter; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct tx_desc *ptxdesc = (struct tx_desc *)pmem; + struct ht_priv *phtpriv = &pmlmepriv->htpriv; + struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; + sint bmcst = IS_MCAST(pattrib->ra); +#ifdef CONFIG_P2P + struct wifidirect_info* pwdinfo = &padapter->wdinfo; +#endif //CONFIG_P2P + +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX + if(urb_zero_packet_chk(padapter, sz)==0) + { + ptxdesc = (struct tx_desc *)(pmem+PACKET_OFFSET_SZ); + pull = 1; + } +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + + _rtw_memset(ptxdesc, 0, sizeof(struct tx_desc)); + + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) + { + //DBG_8192C("pxmitframe->frame_tag == DATA_FRAMETAG\n"); + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel & 0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel << QSEL_SHT) & 0x00001f00); + + ptxdesc->txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); + + fill_txdesc_sectype(pattrib, ptxdesc); + + + if(pattrib->ampdu_en==_TRUE) + ptxdesc->txdw1 |= cpu_to_le32(BIT(5));//AGG EN + else + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + + //offset 8 + + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + + //offset 16 , offset 20 + if (pattrib->qos_en) + ptxdesc->txdw4 |= cpu_to_le32(BIT(6));//QoS + + if ((pattrib->ether_type != 0x888e) && (pattrib->ether_type != 0x0806) && (pattrib->dhcp_pkt != 1)) + { + //Non EAP & ARP & DHCP type data packet + + fill_txdesc_vcs(pattrib, &ptxdesc->txdw4); + fill_txdesc_phy(pattrib, &ptxdesc->txdw4); + + ptxdesc->txdw4 |= cpu_to_le32(0x00000008);//RTS Rate=24M + ptxdesc->txdw5 |= cpu_to_le32(0x0001ff00);// + //ptxdesc->txdw5 |= cpu_to_le32(0x0000000b);//DataRate - 54M + + //use REG_INIDATA_RATE_SEL value + ptxdesc->txdw5 |= cpu_to_le32(pdmpriv->INIDATA_RATE[pattrib->mac_id]); + + if(0)//for driver dbg + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + if(pattrib->ht_en) + ptxdesc->txdw5 |= cpu_to_le32(BIT(6));//SGI + + ptxdesc->txdw5 |= cpu_to_le32(0x00000013);//init rate - mcs7 + } + + } + else + { + // EAP data packet and ARP packet. + // Use the 1M data rate to send the EAP/ARP packet. + // This will maybe make the handshake smooth. + + ptxdesc->txdw1 |= cpu_to_le32(BIT(6));//AGG BK + + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + +#ifdef CONFIG_P2P + // Added by Albert 2011/03/22 + // In the P2P mode, the driver should not support the b mode. + // So, the Tx packet shouldn't use the CCK rate + if ( pwdinfo->p2p_state != P2P_STATE_NONE ) + { + ptxdesc->txdw5 |= cpu_to_le32( 0x04 ); // Use the 6M data rate. + } +#endif //CONFIG_P2P + + } + + //offset 24 + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + if ( pattrib->hw_tcp_csum == 1 ) { + // ptxdesc->txdw6 = 0; // clear TCP_CHECKSUM and IP_CHECKSUM. It's zero already!! + u8 ip_hdr_offset = 32 + pattrib->hdrlen + pattrib->iv_len + 8; + ptxdesc->txdw7 = (1 << 31) | (ip_hdr_offset << 16); + DBG_8192C("ptxdesc->txdw7 = %08x\n", ptxdesc->txdw7); + } +#endif + } + else if((pxmitframe->frame_tag&0x0f)== MGNT_FRAMETAG) + { + //DBG_8192C("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32(pattrib->mac_id&0x1f); + + qsel = (uint)(pattrib->qsel&0x0000001f); + ptxdesc->txdw1 |= cpu_to_le32((qsel<txdw1 |= cpu_to_le32((pattrib->raid<< 16) & 0x000f0000); + + //fill_txdesc_sectype(pattrib, ptxdesc); + + //offset 8 + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + //offset 20 + ptxdesc->txdw5 |= cpu_to_le32(BIT(17));//retry limit enable + ptxdesc->txdw5 |= cpu_to_le32(0x00180000);//retry limit = 6 +#ifdef CONFIG_P2P + // Added by Albert 2011/03/17 + // In the P2P mode, the driver should not support the b mode. + // So, the Tx packet shouldn't use the CCK rate + if ( pwdinfo->p2p_state != P2P_STATE_NONE ) + { + ptxdesc->txdw5 |= cpu_to_le32( 0x04 ); // Use the 6M data rate. + } +#endif //CONFIG_P2P + + } + else if((pxmitframe->frame_tag&0x0f) == TXAGG_FRAMETAG) + { + DBG_8192C("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); + } +#ifdef CONFIG_MP_INCLUDED + else if((pxmitframe->frame_tag&0x0f) == MP_FRAMETAG) + { + fill_txdesc_for_mp(padapter, ptxdesc); + } +#endif + else + { + DBG_8192C("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32((4)&0x1f);//CAM_ID(MAC_ID) + + ptxdesc->txdw1 |= cpu_to_le32((6<< 16) & 0x000f0000);//raid + + //offset 8 + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0xffff0000); + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + //offset 20 + } + + // 2009.11.05. tynli_test. Suggested by SD4 Filen for FW LPS. + // (1) The sequence number of each non-Qos frame / broadcast / multicast / + // mgnt frame should be controled by Hw because Fw will also send null data + // which we cannot control when Fw LPS enable. + // --> default enable non-Qos data sequense number. 2010.06.23. by tynli. + // (2) Enable HW SEQ control for beacon packet, because we use Hw beacon. + // (3) Use HW Qos SEQ to control the seq num of Ext port non-Qos packets. + // 2010.06.23. Added by tynli. + if(!pattrib->qos_en) + { + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + } + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32(sz&0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(BIT(24)); + } + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("offset0-txdesc=0x%x\n", ptxdesc->txdw0)); + + //offset 4 + if(!pull) ptxdesc->txdw1 |= cpu_to_le32((0x01<<26)&0xff000000);//pkt_offset, unit:8 bytes padding + + rtl8192cu_cal_txdesc_chksum(ptxdesc); + + return pull; + +} + +void rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + int t, sz, w_sz, pull=0; + u8 *mem_addr; + u32 ff_hwaddr; + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + if ((pxmitframe->frame_tag == DATA_FRAMETAG) && + (pxmitframe->attrib.ether_type != 0x0806) && + (pxmitframe->attrib.ether_type != 0x888e) && + (pxmitframe->attrib.dhcp_pkt != 1)) + { + rtw_issue_addbareq_cmd(padapter, pxmitframe); + } + + mem_addr = pxmitframe->buf_addr; + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_dump_xframe()\n")); + + for (t = 0; t < pattrib->nr_frags; t++) + { + if (t != (pattrib->nr_frags - 1)) + { + RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("pattrib->nr_frags=%d\n", pattrib->nr_frags)); + + sz = pxmitpriv->frag_len; + sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len); + } + else //no frag + { + sz = pattrib->last_txcmdsz; + } + + pull = update_txdesc(pxmitframe, mem_addr, sz); + + if(pull) + { + mem_addr += PACKET_OFFSET_SZ; //pull txdesc head + + //pxmitbuf ->pbuf = mem_addr; + pxmitframe->buf_addr = mem_addr; + + w_sz = sz + TXDESC_SIZE; + } + else + { + w_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ; + } + + ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe); + + rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf); + + rtw_count_tx_stats(padapter, pxmitframe, sz); + + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_write_port, w_sz=%d\n", w_sz)); + //DBG_8192C("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority); + + mem_addr += w_sz; + + mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr))); + + } + + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + +} + + +#ifdef CONFIG_USB_TX_AGGREGATION +static u32 xmitframe_need_length(struct xmit_frame *pxmitframe) +{ + struct pkt_attrib *pattrib = &pxmitframe->attrib; + + u32 len = 0; + + // no consider fragement + len = pattrib->hdrlen + pattrib->iv_len + + SNAP_SIZE + sizeof(u16) + + pattrib->pktlen + + ((pattrib->bswenc) ? pattrib->icv_len : 0); + + if(pattrib->encrypt ==_TKIP_) + len += 8; + + return len; +} + +#define IDEA_CONDITION 1 // check all packets before enqueue +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct xmit_frame *pxmitframe = NULL; + struct xmit_frame *pfirstframe = NULL; + + // aggregate variable +// struct hw_xmit *phwxmit; + struct sta_info *psta = NULL; + struct tx_servq *ptxservq = NULL; + + _irqL irqL; + _list *xmitframe_plist = NULL, *xmitframe_phead = NULL; + + u32 pbuf; // next pkt address + u32 pbuf_tail; // last pkt tail + u32 len; // packet length, except TXDESC_SIZE and PKT_OFFSET + + u32 bulkSize = pHalData->UsbBulkOutSize; + u8 descCount; + u32 bulkPtr; + + // dump frame variable + u32 ff_hwaddr; + +#ifndef IDEA_CONDITION + int res = _SUCCESS; +#endif + + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_info_, ("+xmitframe_complete\n")); + + + // check xmitbuffer is ok + if (pxmitbuf == NULL) { + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL) return _FALSE; + } + + + //3 1. pick up first frame + do { + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + pxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); + if (pxmitframe == NULL) { + // no more xmit frame, release xmit buffer + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + return _FALSE; + } + + +#ifndef IDEA_CONDITION + if (pxmitframe->frame_tag != DATA_FRAMETAG) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", + pxmitframe->frame_tag, DATA_FRAMETAG)); +// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } + + // TID 0~15 + if ((pxmitframe->attrib.priority < 0) || + (pxmitframe->attrib.priority > 15)) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: TID(%d) should be 0~15!\n", + pxmitframe->attrib.priority)); +// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + + pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf; + pxmitbuf->priv_data = pxmitframe; + + //pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1. + pxmitframe->pkt_offset = 1; // first frame of aggregation, reserve offset + +#ifdef IDEA_CONDITION + rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); +#else + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + if (res == _FALSE) { +// rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + + // always return ndis_packet after rtw_xmitframe_coalesce + rtw_os_xmit_complete(padapter, pxmitframe); + + break; + } while (1); + + //3 2. aggregate same priority and same DA(AP or STA) frames + pfirstframe = pxmitframe; + len = xmitframe_need_length(pfirstframe) + TXDESC_OFFSET; + pbuf_tail = len; + pbuf = _RND8(pbuf_tail); + + // check pkt amount in one bluk + descCount = 0; + bulkPtr = bulkSize; + if (pbuf < bulkPtr) + descCount++; + else { + descCount = 0; + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; // round to next bulkSize + } + + // dequeue same priority packet from station tx queue + psta = pfirstframe->attrib.psta; + switch (pfirstframe->attrib.priority) { + case 1: + case 2: + ptxservq = &(psta->sta_xmitpriv.bk_q); +// phwxmit = pxmitpriv->hwxmits + 3; + break; + + case 4: + case 5: + ptxservq = &(psta->sta_xmitpriv.vi_q); +// phwxmit = pxmitpriv->hwxmits + 1; + break; + + case 6: + case 7: + ptxservq = &(psta->sta_xmitpriv.vo_q); +// phwxmit = pxmitpriv->hwxmits; + break; + + case 0: + case 3: + default: + ptxservq = &(psta->sta_xmitpriv.be_q); +// phwxmit = pxmitpriv->hwxmits + 2; + break; + } + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + + xmitframe_phead = get_list_head(&ptxservq->sta_pending); + xmitframe_plist = get_next(xmitframe_phead); + while (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE) + { + pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); + xmitframe_plist = get_next(xmitframe_plist); + +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)==_TRUE) + { + //rtw_list_delete(&pxmitframe->list); + + ptxservq->qcnt--; + + continue; + } +#endif + + len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE; // no offset + if (pbuf + len > MAX_XMITBUF_SZ) break; + + rtw_list_delete(&pxmitframe->list); + ptxservq->qcnt--; + +#ifndef IDEA_CONDITION + // suppose only data frames would be in queue + if (pxmitframe->frame_tag != DATA_FRAMETAG) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", + pxmitframe->frame_tag, DATA_FRAMETAG)); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } + + // TID 0~15 + if ((pxmitframe->attrib.priority < 0) || + (pxmitframe->attrib.priority > 15)) { + RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, + ("xmitframe_complete: TID(%d) should be 0~15!\n", + pxmitframe->attrib.priority)); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + +// pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf + pbuf; + + pxmitframe->agg_num = 0; // not first frame of aggregation + pxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset + +#ifdef IDEA_CONDITION + rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); +#else + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + if (res == _FALSE) { + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + continue; + } +#endif + + // always return ndis_packet after rtw_xmitframe_coalesce + rtw_os_xmit_complete(padapter, pxmitframe); + + // (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz + _update_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz); + + // don't need xmitframe any more + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + // handle pointer and stop condition + pbuf_tail = pbuf + len; + pbuf = _RND8(pbuf_tail); + + pfirstframe->agg_num++; + if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num) + break; + + if (pbuf < bulkPtr) { + descCount++; + if (descCount == pHalData->UsbTxAggDescNum) + break; + } else { + descCount = 0; + bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; + } + } + if (_rtw_queue_empty(&ptxservq->sta_pending) == _TRUE) + rtw_list_delete(&ptxservq->tx_pending); + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + if ((pfirstframe->attrib.ether_type != 0x0806) && + (pfirstframe->attrib.ether_type != 0x888e) && + (pfirstframe->attrib.dhcp_pkt != 1)) + { + rtw_issue_addbareq_cmd(padapter, pfirstframe); + } + +#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX + //3 3. update first frame txdesc + if ((pbuf_tail % bulkSize) == 0) { + // remove pkt_offset + pbuf_tail -= PACKET_OFFSET_SZ; + pfirstframe->buf_addr += PACKET_OFFSET_SZ; + pfirstframe->pkt_offset = 0; + } +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + _update_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz); + + //3 4. write xmit buffer to USB FIFO + ff_hwaddr = rtw_get_ff_hwaddr(pfirstframe); + + // xmit address == ((xmit_frame*)pxmitbuf->priv_data)->buf_addr + rtw_write_port(padapter, ff_hwaddr, pbuf_tail, (u8*)pxmitbuf); + + + //3 5. update statisitc + pbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE); + if (pfirstframe->pkt_offset == 1) pbuf_tail -= PACKET_OFFSET_SZ; + + rtw_count_tx_stats(padapter, pfirstframe, pbuf_tail); + + rtw_free_xmitframe_ex(pxmitpriv, pfirstframe); + + return _TRUE; +} + +#else + +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) +{ + + struct hw_xmit *phwxmits; + sint hwentry; + struct xmit_frame *pxmitframe=NULL; + int res=_SUCCESS, xcnt = 0; + + phwxmits = pxmitpriv->hwxmits; + hwentry = pxmitpriv->hwxmit_entry; + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete()\n")); + + if(pxmitbuf==NULL) + { + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if(!pxmitbuf) + { + return _FALSE; + } + } + + + do + { + pxmitframe = rtw_dequeue_xframe(pxmitpriv, phwxmits, hwentry); + + if(pxmitframe) + { + pxmitframe->pxmitbuf = pxmitbuf; + + pxmitframe->buf_addr = pxmitbuf->pbuf; + + pxmitbuf->priv_data = pxmitframe; + + if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) + { + if(pxmitframe->attrib.priority<=15)//TID0~15 + { + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + } + + rtw_os_xmit_complete(padapter, pxmitframe);//always return ndis_packet after rtw_xmitframe_coalesce + } + + + RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete(): rtw_dump_xframe\n")); + + + if(res == _SUCCESS) + { + rtw_dump_xframe(padapter, pxmitframe); + } + else + { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + } + + xcnt++; + + } + else + { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + return _FALSE; + } + + break; + + }while(0/*xcnt < (NR_XMITFRAME >> 3)*/); + + return _TRUE; + +} +#endif + + + +static s32 xmitframe_direct(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + s32 res = _SUCCESS; + + + res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); + if (res == _SUCCESS) { + rtw_dump_xframe(padapter, pxmitframe); + } + + return res; +} + +/* + * Return + * _TRUE dump packet directly + * _FALSE enqueue packet + */ +static s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + _irqL irqL; + s32 res; + struct xmit_buf *pxmitbuf = NULL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TDLS + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#endif + + do_queue_select(padapter, pattrib); + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + +#ifndef CONFIG_TDLS +#ifdef CONFIG_AP_MODE + if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) + { + struct sta_info *psta; + struct sta_priv *pstapriv = &padapter->stapriv; + + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + if(pattrib->psta) + { + psta = pattrib->psta; + } + else + { + psta=rtw_get_stainfo(pstapriv, pattrib->ra); + } + + if(psta) + { + if(psta->sleepq_len > (NR_XMITFRAME>>3)) + { + wakeup_sta_to_xmit(padapter, psta); + } + } + + return _FALSE; + } +#endif +//else CONFIG_TDLS, process as TDLS Buffer STA +#else + if(pmlmeinfo->tdls_setup_state&TDLS_LINKED_STATE ){ //&& pattrib->ether_type!=0x0806) + res = xmit_tdls_enqueue_for_sleeping_sta(padapter, pxmitframe); + if(res==_TRUE){ + _exit_critical_bh(&pxmitpriv->lock, &irqL); + return _FALSE; + }else if(res==2){ + goto enqueue; + } + } +#endif + + if (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0) + goto enqueue; + + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) + goto enqueue; + + + pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); + if (pxmitbuf == NULL) + goto enqueue; + + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + pxmitframe->pxmitbuf = pxmitbuf; + pxmitframe->buf_addr = pxmitbuf->pbuf; + pxmitbuf->priv_data = pxmitframe; + + if (xmitframe_direct(padapter, pxmitframe) != _SUCCESS) { + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + } + + return _TRUE; + +enqueue: + res = rtw_xmitframe_enqueue(padapter, pxmitframe); + _exit_critical_bh(&pxmitpriv->lock, &irqL); + + if (res != _SUCCESS) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("pre_xmitframe: enqueue xmitframe fail\n")); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + // Trick, make the statistics correct + pxmitpriv->tx_pkts--; + pxmitpriv->tx_drop++; + return _TRUE; + } + + return _FALSE; +} + +void rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe) +{ + rtw_dump_xframe(padapter, pmgntframe); +} + +/* + * Return + * _TRUE dump packet directly ok + * _FALSE temporary can't transmit packets to hardware + */ +s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe) +{ + return pre_xmitframe(padapter, pxmitframe); +} + +#ifdef CONFIG_HOSTAPD_MLME + +static void rtl8192cu_hostap_mgnt_xmit_cb(struct urb *urb) +{ +#ifdef PLATFORM_LINUX + struct sk_buff *skb = (struct sk_buff *)urb->context; + + //DBG_8192C("%s\n", __FUNCTION__); + + dev_kfree_skb_any(skb); +#endif +} + +s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) +{ +#ifdef PLATFORM_LINUX + u16 fc; + int rc, len, pipe; + unsigned int bmcst, tid, qsel; + struct sk_buff *skb, *pxmit_skb; + struct urb *urb; + unsigned char *pxmitbuf; + struct tx_desc *ptxdesc; + struct ieee80211_hdr *tx_hdr; + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; + struct net_device *pnetdev = padapter->pnetdev; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dvobj_priv *pdvobj = &padapter->dvobjpriv; + + + //DBG_8192C("%s\n", __FUNCTION__); + + skb = pkt; + + len = skb->len; + tx_hdr = (struct ieee80211_hdr *)(skb->data); + fc = le16_to_cpu(tx_hdr->frame_ctl); + bmcst = IS_MCAST(tx_hdr->addr1); + + if ((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT) + goto _exit; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pxmit_skb = dev_alloc_skb(len + TXDESC_SIZE); +#else + pxmit_skb = netdev_alloc_skb(pnetdev, len + TXDESC_SIZE); +#endif + + if(!pxmit_skb) + goto _exit; + + pxmitbuf = pxmit_skb->data; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + goto _exit; + } + + // ----- fill tx desc ----- + ptxdesc = (struct tx_desc *)pxmitbuf; + _rtw_memset(ptxdesc, 0, sizeof(*ptxdesc)); + + //offset 0 + ptxdesc->txdw0 |= cpu_to_le32(len&0x0000ffff); + ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(OWN | FSG | LSG); + + if(bmcst) + { + ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); + } + + //offset 4 + ptxdesc->txdw1 |= cpu_to_le32(0x00);//MAC_ID + + ptxdesc->txdw1 |= cpu_to_le32((0x12<txdw1 |= cpu_to_le32((0x06<< 16) & 0x000f0000);//b mode + + //offset 8 + + //offset 12 + ptxdesc->txdw3 |= cpu_to_le32((le16_to_cpu(tx_hdr->seq_ctl)<<16)&0xffff0000); + + //offset 16 + ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate + + //offset 20 + + + //HW append seq + ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number + ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. + + + rtl8192cu_cal_txdesc_chksum(ptxdesc); + // ----- end of fill tx desc ----- + + // + skb_put(pxmit_skb, len + TXDESC_SIZE); + pxmitbuf = pxmitbuf + TXDESC_SIZE; + _rtw_memcpy(pxmitbuf, skb->data, len); + + //DBG_8192C("mgnt_xmit, len=%x\n", pxmit_skb->len); + + + // ----- prepare urb for submit ----- + + //translate DMA FIFO addr to pipehandle + //pipe = ffaddr2pipehdl(pdvobj, MGT_QUEUE_INX); + pipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f); + + usb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe, + pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb); + + urb->transfer_flags |= URB_ZERO_PACKET; + usb_anchor_urb(urb, &phostapdpriv->anchored); + rc = usb_submit_urb(urb, GFP_ATOMIC); + if (rc < 0) { + usb_unanchor_urb(urb); + kfree_skb(skb); + } + usb_free_urb(urb); + + +_exit: + + dev_kfree_skb_any(skb); + +#endif + + return 0; + +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c new file mode 100755 index 000000000000..d81ef69291d3 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_halinit.c @@ -0,0 +1,5469 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_HAL_INIT_C_ + +#include +#include +#include +#include + +#include +#include + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +#include "rtl8192c_sreset.h" +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#ifndef CONFIG_USB_HCI + +#error "CONFIG_USB_HCI shall be on!\n" + +#endif + +#include +#include +#include + +#if DISABLE_BB_RF + #define HAL_MAC_ENABLE 0 + #define HAL_BB_ENABLE 0 + #define HAL_RF_ENABLE 0 +#else + #define HAL_MAC_ENABLE 1 + #define HAL_BB_ENABLE 1 + #define HAL_RF_ENABLE 1 +#endif + +//endpoint number 1,2,3,4,5 +// bult in : 1 +// bult out: 2 (High) +// bult out: 3 (Normal) for 3 out_ep, (Low) for 2 out_ep +// interrupt in: 4 +// bult out: 5 (Low) for 3 out_ep + + +static VOID +_OneOutEpMapping( + IN HAL_DATA_TYPE *pHalData + ) +{ + //only endpoint number 0x02 + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[0];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD +} + + +static VOID +_TwoOutEpMapping( + IN BOOLEAN IsTestChip, + IN HAL_DATA_TYPE *pHalData, + IN BOOLEAN bWIFICfg + ) +{ + +/* +#define VO_QUEUE_INX 0 +#define VI_QUEUE_INX 1 +#define BE_QUEUE_INX 2 +#define BK_QUEUE_INX 3 +#define BCN_QUEUE_INX 4 +#define MGT_QUEUE_INX 5 +#define HIGH_QUEUE_INX 6 +#define TXCMD_QUEUE_INX 7 +*/ + + if(IsTestChip && bWIFICfg){ // test chip && wmm + + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 1, 0, 1, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:L (end_number=0x03) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[0];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + else if(!IsTestChip && bWIFICfg){ // Normal chip && wmm + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 0, 1, 0, 1, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:L (end_number=0x03) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[1];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[0];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + else{//typical setting + + //BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:L (end_number=0x03) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[0];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[1];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + +} + + +static VOID _ThreeOutEpMapping( + IN HAL_DATA_TYPE *pHalData, + IN BOOLEAN bWIFICfg + ) +{ + if(bWIFICfg){//for WMM + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 1, 2, 1, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05) + + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[1];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + else{//typical setting + + // BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA + //{ 2, 2, 1, 0, 0, 0, 0, 0, 0 }; + //0:H(end_number=0x02), 1:N(end_number=0x03), 2:L (end_number=0x05) + pHalData->Queue2EPNum[0] = pHalData->RtBulkOutPipe[0];//VO + pHalData->Queue2EPNum[1] = pHalData->RtBulkOutPipe[1];//VI + pHalData->Queue2EPNum[2] = pHalData->RtBulkOutPipe[2];//BE + pHalData->Queue2EPNum[3] = pHalData->RtBulkOutPipe[2];//BK + + pHalData->Queue2EPNum[4] = pHalData->RtBulkOutPipe[0];//BCN + pHalData->Queue2EPNum[5] = pHalData->RtBulkOutPipe[0];//MGT + pHalData->Queue2EPNum[6] = pHalData->RtBulkOutPipe[0];//HIGH + pHalData->Queue2EPNum[7] = pHalData->RtBulkOutPipe[0];//TXCMD + } + +} + +static BOOLEAN +_MappingOutEP( + IN PADAPTER pAdapter, + IN u8 NumOutPipe, + IN BOOLEAN IsTestChip + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct registry_priv *pregistrypriv = &pAdapter->registrypriv; + + BOOLEAN bWIFICfg = (pregistrypriv->wifi_spec) ?_TRUE:_FALSE; + + BOOLEAN result = _TRUE; + + switch(NumOutPipe) + { + case 2: + _TwoOutEpMapping(IsTestChip, pHalData, bWIFICfg); + break; + case 3: + // Test chip doesn't support three out EPs. + if(IsTestChip){ + return _FALSE; + } + _ThreeOutEpMapping(pHalData, bWIFICfg); + break; + case 1: + _OneOutEpMapping(pHalData); + break; + default: + result = _FALSE; + break; + } + + return result; + +} + +static VOID +_ConfigTestChipOutEP( + IN PADAPTER pAdapter, + IN u8 NumOutPipe + ) +{ + u8 value8,txqsele; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + pHalData->OutEpQueueSel = 0; + pHalData->OutEpNumber = 0; + + value8 = rtw_read8(pAdapter, REG_TEST_SIE_OPTIONAL); + value8 = (value8 & USB_TEST_EP_MASK) >> USB_TEST_EP_SHIFT; + + switch(value8) + { + case 0: // 2 bulk OUT, 1 bulk IN + case 3: + pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ; + pHalData->OutEpNumber = 2; + //RT_TRACE(COMP_INIT, DBG_LOUD, ("EP Config: 2 bulk OUT, 1 bulk IN\n")); + break; + case 1: // 1 bulk IN/OUT => map all endpoint to Low queue + case 2: // 1 bulk IN, 1 bulk OUT => map all endpoint to High queue + txqsele = rtw_read8(pAdapter, REG_TEST_USB_TXQS); + if(txqsele & 0x0F){//map all endpoint to High queue + pHalData->OutEpQueueSel = TX_SELE_HQ; + } + else if(txqsele&0xF0){//map all endpoint to Low queue + pHalData->OutEpQueueSel = TX_SELE_LQ; + } + pHalData->OutEpNumber = 1; + //RT_TRACE(COMP_INIT, DBG_LOUD, ("%s\n", ((1 == value8) ? "1 bulk IN/OUT" : "1 bulk IN, 1 bulk OUT"))); + break; + default: + break; + } + + // TODO: Error recovery for this case + //RT_ASSERT((NumOutPipe == pHalData->OutEpNumber), ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n", (u4Byte)NumOutPipe, (u4Byte)pHalData->OutEpNumber)); + +} + + + +static VOID +_ConfigNormalChipOutEP( + IN PADAPTER pAdapter, + IN u8 NumOutPipe + ) +{ + u8 value8; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + + pHalData->OutEpQueueSel = 0; + pHalData->OutEpNumber = 0; + + // Normal and High queue + value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 1)); + + if(value8 & USB_NORMAL_SIE_EP_MASK){ + pHalData->OutEpQueueSel |= TX_SELE_HQ; + pHalData->OutEpNumber++; + } + + if((value8 >> USB_NORMAL_SIE_EP_SHIFT) & USB_NORMAL_SIE_EP_MASK){ + pHalData->OutEpQueueSel |= TX_SELE_NQ; + pHalData->OutEpNumber++; + } + + // Low queue + value8 = rtw_read8(pAdapter, (REG_NORMAL_SIE_EP + 2)); + if(value8 & USB_NORMAL_SIE_EP_MASK){ + pHalData->OutEpQueueSel |= TX_SELE_LQ; + pHalData->OutEpNumber++; + } + + // TODO: Error recovery for this case + //RT_ASSERT((NumOutPipe == pHalData->OutEpNumber), ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n", (u4Byte)NumOutPipe, (u4Byte)pHalData->OutEpNumber)); + +} + +static BOOLEAN HalUsbSetQueuePipeMapping8192CUsb( + IN PADAPTER pAdapter, + IN u8 NumInPipe, + IN u8 NumOutPipe + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + BOOLEAN result = _FALSE; + BOOLEAN isNormalChip; + + //may be update UPHY Parameter == georgia + + + // ReadAdapterInfo8192C also call _ReadChipVersion too. + // Since we need dynamic config EP mapping, so we call this function to get chip version. + // We can remove _ReadChipVersion from ReadAdapterInfo8192C later. + //pHalData->VersionID = rtl8192c_ReadChipVersion(pAdapter); + + isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); + + if(isNormalChip){ + _ConfigNormalChipOutEP(pAdapter, NumOutPipe); + } + else{ + _ConfigTestChipOutEP(pAdapter, NumOutPipe); + } + + // Normal chip with one IN and one OUT doesn't have interrupt IN EP. + if(isNormalChip && (1 == pHalData->OutEpNumber)){ + if(1 != NumInPipe){ + return result; + } + } + + // All config other than above support one Bulk IN and one Interrupt IN. + //if(2 != NumInPipe){ + // return result; + //} + + result = _MappingOutEP(pAdapter, NumOutPipe, !isNormalChip); + + return result; + +} + +void rtl8192cu_interface_configure(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + + if (pdvobjpriv->ishighspeed == _TRUE) + { + pHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes + } + else + { + pHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes + } + + pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber; + pHalData->RtBulkInPipe = pdvobjpriv->ep_num[0]; + pHalData->RtBulkOutPipe[0] = pdvobjpriv->ep_num[1]; + pHalData->RtBulkOutPipe[1] = pdvobjpriv->ep_num[2]; + pHalData->RtIntInPipe = pdvobjpriv->ep_num[3]; + pHalData->RtBulkOutPipe[2] = pdvobjpriv->ep_num[4]; + +#ifdef CONFIG_USB_TX_AGGREGATION + pHalData->UsbTxAggMode = 1; + pHalData->UsbTxAggDescNum = 0x6; // only 4 bits +#endif + +#ifdef CONFIG_USB_RX_AGGREGATION + pHalData->UsbRxAggMode = USB_RX_AGG_DMA;// USB_RX_AGG_DMA; + pHalData->UsbRxAggBlockCount = 8; //unit : 512b + pHalData->UsbRxAggBlockTimeout = 0x6; + pHalData->UsbRxAggPageCount = 48; //uint :128 b //0x0A; // 10 = MAX_RX_DMA_BUFFER_SIZE/2/pHalData->UsbBulkOutSize + pHalData->UsbRxAggPageTimeout = 0x4; //6, absolute time = 34ms/(2^6) +#endif + + HalUsbSetQueuePipeMapping8192CUsb(padapter, + pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); + +} + +static u8 _InitPowerOn(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 ret = _SUCCESS; + u16 value16=0; + u8 value8 = 0; + u32 value32 = 0; + + // polling autoload done. + u32 pollingCount = 0; + + do + { + if(rtw_read8(padapter, REG_APS_FSMCO) & PFM_ALDN){ + //RT_TRACE(COMP_INIT,DBG_LOUD,("Autoload Done!\n")); + break; + } + + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[PFM_ALDN] done!\n")); + return _FAIL; + } + + }while(_TRUE); + + +// For hardware power on sequence. + + //0. RSV_CTRL 0x1C[7:0] = 0x00 // unlock ISO/CLK/Power control register + rtw_write8(padapter, REG_RSV_CTRL, 0x0); + // Power on when re-enter from IPS/Radio off/card disable + rtw_write8(padapter, REG_SPS0_CTRL, 0x2b);//enable SPS into PWM mode +/* + value16 = PlatformIORead2Byte(Adapter, REG_AFE_XTAL_CTRL);//enable AFE clock + value16 &= (~XTAL_GATE_AFE); + PlatformIOWrite2Byte(Adapter,REG_AFE_XTAL_CTRL, value16 ); +*/ + + rtw_udelay_os(100);//PlatformSleepUs(150);//this is not necessary when initially power on + + value8 = rtw_read8(padapter, REG_LDOV12D_CTRL); + if(0== (value8 & LDV12_EN) ){ + value8 |= LDV12_EN; + rtw_write8(padapter, REG_LDOV12D_CTRL, value8); + //RT_TRACE(COMP_INIT, DBG_LOUD, (" power-on :REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8)); + rtw_udelay_os(100);//PlatformSleepUs(100);//this is not necessary when initially power on + value8 = rtw_read8(padapter, REG_SYS_ISO_CTRL); + value8 &= ~ISO_MD2PP; + rtw_write8(padapter, REG_SYS_ISO_CTRL, value8); + } + + // auto enable WLAN + pollingCount = 0; + value16 = rtw_read16(padapter, REG_APS_FSMCO); + value16 |= APFM_ONMAC; + rtw_write16(padapter, REG_APS_FSMCO, value16); + + do + { + if(0 == (rtw_read16(padapter, REG_APS_FSMCO) & APFM_ONMAC)){ + //RT_TRACE(COMP_INIT,DBG_LOUD,("MAC auto ON okay!\n")); + break; + } + + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling REG_APS_FSMCO[APFM_ONMAC] done!\n")); + return _FAIL; + } + + }while(_TRUE); + + //Enable Radio ,GPIO ,and LED function + rtw_write16(padapter,REG_APS_FSMCO,0x0812); + +#ifdef CONFIG_AUTOSUSPEND + //for usb Combo card ,BT + if((BOARD_USB_COMBO == pHalData->BoardType)&&(padapter->registrypriv.usbss_enable)) + { + value32 = rtw_read32(padapter, REG_APS_FSMCO); + value32 |= (SOP_ABG|SOP_AMB|XOP_BTCK); + rtw_write32(padapter, REG_APS_FSMCO, value32); + } +#endif + + // release RF digital isolation + value16 = rtw_read16(padapter, REG_SYS_ISO_CTRL); + value16 &= ~ISO_DIOR; + rtw_write16(padapter, REG_SYS_ISO_CTRL, value16); + + // Enable MAC DMA/WMAC/SCHEDULE/SEC block + value16 = rtw_read16(padapter, REG_CR); + value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN + | PROTOCOL_EN | SCHEDULE_EN | MACTXEN | MACRXEN | ENSEC); + rtw_write16(padapter, REG_CR, value16); + + //tynli_test for suspend mode. + { + rtw_write8(padapter, 0xfe10, 0x19); + } + + // 2010/11/22 MH For slim combo debug mode check. + if (pHalData->BoardType == BOARD_USB_COMBO) + { + if (pHalData->SlimComboDbg == _TRUE) + { + DBG_8192C("SlimComboDbg == TRUE\n"); + + // 1. SIC?Test Mode , Debug Ports |۰ Enable, ҥH Driver Wӫ, + // nг]w 0x 00[7] -> "1", N Disable. effect if not: power consumption increase + rtw_write8(padapter, REG_SYS_ISO_CTRL, rtw_read8(padapter, REG_SYS_ISO_CTRL)|BIT7); + + // 2. SIC?Test Mode , GPIO-8?| report Power State ҥH Driver Wӫ, г]w? 0x04[6] -> "1" N Disable + // effect if not: GPIO-8 could not be GPIO or LED function + rtw_write8(padapter, REG_APS_FSMCO, rtw_read8(padapter, REG_APS_FSMCO)|BIT6); + + // 3. SIC Test Mode , EESK, EECS | report?Host Clock status, ҥH Driver Wӫ, г]w? 0x40[4] -> "1" N EEPROM ϥ Pin (autoload still from Efuse) + // effect if not:power consumption increase + value8 = rtw_read8(padapter, REG_GPIO_MUXCFG)|BIT4 ; + #ifdef CONFIG_BT_COEXIST + // 2011/01/26 MH UMB-B cut bug. We need to support the modification. + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID) && + pHalData->bt_coexist.BT_Coexist) + { + value8 |= (BIT5); + } + #endif + rtw_write8(padapter, REG_GPIO_MUXCFG,value8 ); + + + // 4. SIC Test Mode ,?SIC Debug ports |۰ Enable , ҥH Driver WӫᰨW, г]w? 0x40[15:11] -> 0x00, NDisable + // 4.1Two Steps setting for safety: 0x40[15,13,12, 11] -> "0", then ?0x40[14] -> "0" + // effect if not: Host could not transfer packets, and GPIO-3,2 will occupied by SIC then Co-exist could not work. + rtw_write16(padapter, REG_GPIO_MUXCFG, (rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF)|BIT14); + rtw_write16(padapter, REG_GPIO_MUXCFG, rtw_read16(padapter, REG_GPIO_MUXCFG)&0x07FF); + } + } + + + // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in + // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all + // IC. According to Johnny's opinion, only RU will meet the condition. + if (IS_HARDWARE_TYPE_8192C(padapter) && (pHalData->BoardType == BOARD_USB_High_PA)) + rtw_write32(padapter, rFPGA0_XCD_RFParameter, rtw_read32(padapter, rFPGA0_XCD_RFParameter)&(~BIT1)); + return ret; + +} + + +static void _dbg_dump_macreg(_adapter *padapter) +{ + u32 offset = 0; + u32 val32 = 0; + u32 index =0 ; + for(index=0;index<64;index++) + { + offset = index*4; + val32 = rtw_read32(padapter,offset); + DBG_8192C("offset : 0x%02x ,val:0x%08x\n",offset,val32); + } +} + + +static void _InitPABias(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 pa_setting; + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + BOOLEAN is92C = IS_92C_SERIAL(pHalData->VersionID); + + //FIXED PA current issue + //efuse_one_byte_read(padapter, 0x1FA, &pa_setting); + pa_setting = EFUSE_Read1Byte(padapter, 0x1FA); + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("_InitPABias 0x1FA 0x%x \n",pa_setting)); + + if(!(pa_setting & BIT0)) + { + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x0F406); + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x4F406); + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0x8F406); + PHY_SetRFReg(padapter, RF90_PATH_A, 0x15, 0x0FFFFF, 0xCF406); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path A\n")); + } + + if(!(pa_setting & BIT1) && isNormal && is92C) + { + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x0F406); + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x4F406); + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0x8F406); + PHY_SetRFReg(padapter,RF90_PATH_B, 0x15, 0x0FFFFF, 0xCF406); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("PA BIAS path B\n")); + } + + if(!(pa_setting & BIT4)) + { + pa_setting = rtw_read8(padapter, 0x16); + pa_setting &= 0x0F; + rtw_write8(padapter, 0x16, pa_setting | 0x90); + } +} +#ifdef CONFIG_BT_COEXIST +static void _InitBTCoexist(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); + u8 u1Tmp; + + if(pbtpriv->BT_Coexist && pbtpriv->BT_CoexistType == BT_CSR_BC4) + { + +#if MP_DRIVER != 1 + if(pbtpriv->BT_Ant_isolation) + { + rtw_write8( padapter,REG_GPIO_MUXCFG, 0xa0); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_GPIO_MUXCFG, 0xa0); + } +#endif + + u1Tmp = rtw_read8(padapter, 0x4fd) & BIT0; + u1Tmp = u1Tmp | + ((pbtpriv->BT_Ant_isolation==1)?0:BIT1) | + ((pbtpriv->BT_Service==BT_SCO)?0:BIT2); + rtw_write8( padapter, 0x4fd, u1Tmp); + DBG_8192C("BT write 0x%x = 0x%x for non-isolation\n", 0x4fd, u1Tmp); + + + rtw_write32(padapter, REG_BT_COEX_TABLE+4, 0xaaaa9aaa); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+4, 0xaaaa9aaa); + + rtw_write32(padapter, REG_BT_COEX_TABLE+8, 0xffbd0040); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+8, 0xffbd0040); + + rtw_write32(padapter, REG_BT_COEX_TABLE+0xc, 0x40000010); + DBG_8192C("BT write 0x%x = 0x%x\n", REG_BT_COEX_TABLE+0xc, 0x40000010); + + //Config to 1T1R + u1Tmp = rtw_read8(padapter,rOFDM0_TRxPathEnable); + u1Tmp &= ~(BIT1); + rtw_write8( padapter, rOFDM0_TRxPathEnable, u1Tmp); + DBG_8192C("BT write 0xC04 = 0x%x\n", u1Tmp); + + u1Tmp = rtw_read8(padapter, rOFDM1_TRxPathEnable); + u1Tmp &= ~(BIT1); + rtw_write8( padapter, rOFDM1_TRxPathEnable, u1Tmp); + DBG_8192C("BT write 0xD04 = 0x%x\n", u1Tmp); + + } +} +#endif + +//------------------------------------------------------------------------- +// +// LLT R/W/Init function +// +//------------------------------------------------------------------------- +static u8 _LLTWrite( + IN PADAPTER Adapter, + IN u32 address, + IN u32 data + ) +{ + u8 status = _SUCCESS; + int count = 0; + u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS); + + rtw_write32(Adapter, REG_LLT_INIT, value); + + //polling + do{ + + value = rtw_read32(Adapter, REG_LLT_INIT); + if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){ + break; + } + + if(count > POLLING_LLT_THRESHOLD){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling write LLT done at address %d!\n", address)); + status = _FAIL; + break; + } + }while(count++); + + return status; + +} + + +static u8 _LLTRead( + IN PADAPTER Adapter, + IN u32 address + ) +{ + int count = 0; + u32 value = _LLT_INIT_ADDR(address) | _LLT_OP(_LLT_READ_ACCESS); + + rtw_write32(Adapter, REG_LLT_INIT, value); + + //polling and get value + do{ + + value = rtw_read32(Adapter, REG_LLT_INIT); + if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){ + return (u8)value; + } + + if(count > POLLING_LLT_THRESHOLD){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling read LLT done at address %d!\n", address)); + break; + } + }while(count++); + + return 0xFF; + +} + + +static u8 InitLLTTable( + IN PADAPTER Adapter, + IN u32 boundary + ) +{ + u8 status = _SUCCESS; + u32 i; + + for(i = 0 ; i < (boundary - 1) ; i++){ + status = _LLTWrite(Adapter, i , i + 1); + if(_SUCCESS != status){ + return status; + } + } + + // end of list + status = _LLTWrite(Adapter, (boundary - 1), 0xFF); + if(_SUCCESS != status){ + return status; + } + + // Make the other pages as ring buffer + // This ring buffer is used as beacon buffer if we config this MAC as two MAC transfer. + // Otherwise used as local loopback buffer. + for(i = boundary ; i < LAST_ENTRY_OF_TX_PKT_BUFFER ; i++){ + status = _LLTWrite(Adapter, i, (i + 1)); + if(_SUCCESS != status){ + return status; + } + } + + // Let last entry point to the start entry of ring buffer + status = _LLTWrite(Adapter, LAST_ENTRY_OF_TX_PKT_BUFFER, boundary); + if(_SUCCESS != status){ + return status; + } + + return status; + +} + + +//--------------------------------------------------------------- +// +// MAC init functions +// +//--------------------------------------------------------------- +static VOID +_SetMacID( + IN PADAPTER Adapter, u8* MacID + ) +{ + u32 i; + for(i=0 ; i< MAC_ADDR_LEN ; i++){ + rtw_write32(Adapter, REG_MACID+i, MacID[i]); + } +} + +static VOID +_SetBSSID( + IN PADAPTER Adapter, u8* BSSID + ) +{ + u32 i; + for(i=0 ; i< MAC_ADDR_LEN ; i++){ + rtw_write32(Adapter, REG_BSSID+i, BSSID[i]); + } +} + + +// Shall USB interface init this? +static VOID +_InitInterrupt( + IN PADAPTER Adapter + ) +{ + u32 value32; + + // HISR - turn all on + value32 = 0xFFFFFFFF; + rtw_write32(Adapter, REG_HISR, value32); + + // HIMR - turn all on + rtw_write32(Adapter, REG_HIMR, value32); +} + + +static VOID +_InitQueueReservedPage( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + BOOLEAN isNormalChip = IS_NORMAL_CHIP(pHalData->VersionID); + + u32 outEPNum = (u32)pHalData->OutEpNumber; + u32 numHQ = 0; + u32 numLQ = 0; + u32 numNQ = 0; + u32 numPubQ; + u32 value32; + u8 value8; + BOOLEAN bWiFiConfig = pregistrypriv->wifi_spec; + //u32 txQPageNum, txQPageUnit,txQRemainPage; + +#if 0 + if(!pregistrypriv->wifi_spec){ + numPubQ = (isNormalChip) ? NORMAL_PAGE_NUM_PUBQ : TEST_PAGE_NUM_PUBQ; + //RT_ASSERT((numPubQ < TX_TOTAL_PAGE_NUMBER), ("Public queue page number is great than total tx page number.\n")); + txQPageNum = TX_TOTAL_PAGE_NUMBER - numPubQ; + + //RT_ASSERT((0 == txQPageNum%txQPageNum), ("Total tx page number is not dividable!\n")); + + txQPageUnit = txQPageNum/outEPNum; + txQRemainPage = txQPageNum % outEPNum; + + if(pHalData->OutEpQueueSel & TX_SELE_HQ){ + numHQ = txQPageUnit; + } + if(pHalData->OutEpQueueSel & TX_SELE_LQ){ + numLQ = txQPageUnit; + } + // HIGH priority queue always present in the configuration of 2 or 3 out-ep + // so ,remainder pages have assigned to High queue + if((outEPNum>1) && (txQRemainPage)){ + numHQ += txQRemainPage; + } + + // NOTE: This step shall be proceed before writting REG_RQPN. + if(isNormalChip){ + if(pHalData->OutEpQueueSel & TX_SELE_NQ){ + numNQ = txQPageUnit; + } + value8 = (u8)_NPQ(numNQ); + rtw_write8(Adapter, REG_RQPN_NPQ, value8); + } + //RT_ASSERT(((numHQ + numLQ + numNQ + numPubQ) < TX_PAGE_BOUNDARY), ("Total tx page number is greater than tx boundary!\n")); + } + else +#endif + { //for WMM + //RT_ASSERT((outEPNum>=2), ("for WMM ,number of out-ep must more than or equal to 2!\n")); + + numPubQ = (isNormalChip) ? ((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_PUBQ:NORMAL_PAGE_NUM_PUBQ) + :WMM_TEST_PAGE_NUM_PUBQ; + + if(pHalData->OutEpQueueSel & TX_SELE_HQ){ + numHQ = (isNormalChip)?((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_HPQ:NORMAL_PAGE_NUM_HPQ) + :WMM_TEST_PAGE_NUM_HPQ; + } + + if(pHalData->OutEpQueueSel & TX_SELE_LQ){ + numLQ = (isNormalChip)?((bWiFiConfig)?WMM_NORMAL_PAGE_NUM_LPQ:NORMAL_PAGE_NUM_LPQ) + :WMM_TEST_PAGE_NUM_LPQ; + } + // NOTE: This step shall be proceed before writting REG_RQPN. + if(isNormalChip){ + if(pHalData->OutEpQueueSel & TX_SELE_NQ){ + numNQ = (bWiFiConfig)?WMM_NORMAL_PAGE_NUM_NPQ:NORMAL_PAGE_NUM_NPQ; + } + value8 = (u8)_NPQ(numNQ); + rtw_write8(Adapter, REG_RQPN_NPQ, value8); + } + } + + // TX DMA + value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN; + rtw_write32(Adapter, REG_RQPN, value32); +} + +static void _InitID(IN PADAPTER Adapter) +{ + int i; + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + + for(i=0; i<6; i++) + { + rtw_write8(Adapter, (REG_MACID+i), pEEPROM->mac_addr[i]); + } + +/* + NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); + //Ziv test +#if 1 + { + u1Byte sMacAddr[6] = {0}; + u4Byte i; + + for(i = 0 ; i < MAC_ADDR_LEN ; i++){ + sMacAddr[i] = PlatformIORead1Byte(Adapter, (REG_MACID + i)); + } + RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "Read back MAC Addr: ", sMacAddr); + } +#endif + +#if 0 + u4Byte nMAR = 0xFFFFFFFF; + u8 m_MacID[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; + u8 m_BSSID[] = {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; + int i; + + _SetMacID(Adapter, Adapter->PermanentAddress); + _SetBSSID(Adapter, m_BSSID); + + //set MAR + PlatformIOWrite4Byte(Adapter, REG_MAR, nMAR); + PlatformIOWrite4Byte(Adapter, REG_MAR+4, nMAR); +#endif +*/ +} + + +static VOID +_InitTxBufferBoundary( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + u8 txpktbuf_bndy; + + if(!pregistrypriv->wifi_spec){ + txpktbuf_bndy = TX_PAGE_BOUNDARY; + } + else{//for WMM + txpktbuf_bndy = ( IS_NORMAL_CHIP( pHalData->VersionID))?WMM_NORMAL_TX_PAGE_BOUNDARY + :WMM_TEST_TX_PAGE_BOUNDARY; + } + + rtw_write8(Adapter, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy); + rtw_write8(Adapter, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy); + rtw_write8(Adapter, REG_TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy); + rtw_write8(Adapter, REG_TRXFF_BNDY, txpktbuf_bndy); +#if 1 + rtw_write8(Adapter, REG_TDECTRL+1, txpktbuf_bndy); +#else + txdmactrl = PlatformIORead2Byte(Adapter, REG_TDECTRL); + txdmactrl &= ~BCN_HEAD_MASK; + txdmactrl |= BCN_HEAD(txpktbuf_bndy); + PlatformIOWrite2Byte(Adapter, REG_TDECTRL, txdmactrl); +#endif +} + +static VOID +_InitPageBoundary( + IN PADAPTER Adapter + ) +{ + // RX Page Boundary + //srand(static_cast(time(NULL)) ); + u16 rxff_bndy = 0x27FF;//(rand() % 1) ? 0x27FF : 0x23FF; + + rtw_write16(Adapter, (REG_TRXFF_BNDY + 2), rxff_bndy); + + // TODO: ?? shall we set tx boundary? +} + + +static VOID +_InitNormalChipRegPriority( + IN PADAPTER Adapter, + IN u16 beQ, + IN u16 bkQ, + IN u16 viQ, + IN u16 voQ, + IN u16 mgtQ, + IN u16 hiQ + ) +{ + u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7); + + value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | + _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | + _TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ); + + rtw_write16(Adapter, REG_TRXDMA_CTRL, value16); +} + +static VOID +_InitNormalChipOneOutEpPriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + u16 value = 0; + switch(pHalData->OutEpQueueSel) + { + case TX_SELE_HQ: + value = QUEUE_HIGH; + break; + case TX_SELE_LQ: + value = QUEUE_LOW; + break; + case TX_SELE_NQ: + value = QUEUE_NORMAL; + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + + _InitNormalChipRegPriority(Adapter, + value, + value, + value, + value, + value, + value + ); + +} + +static VOID +_InitNormalChipTwoOutEpPriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; + + + u16 valueHi = 0; + u16 valueLow = 0; + + switch(pHalData->OutEpQueueSel) + { + case (TX_SELE_HQ | TX_SELE_LQ): + valueHi = QUEUE_HIGH; + valueLow = QUEUE_LOW; + break; + case (TX_SELE_NQ | TX_SELE_LQ): + valueHi = QUEUE_NORMAL; + valueLow = QUEUE_LOW; + break; + case (TX_SELE_HQ | TX_SELE_NQ): + valueHi = QUEUE_HIGH; + valueLow = QUEUE_NORMAL; + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + + if(!pregistrypriv->wifi_spec ){ + beQ = valueLow; + bkQ = valueLow; + viQ = valueHi; + voQ = valueHi; + mgtQ = valueHi; + hiQ = valueHi; + } + else{//for WMM ,CONFIG_OUT_EP_WIFI_MODE + beQ = valueLow; + bkQ = valueHi; + viQ = valueHi; + voQ = valueLow; + mgtQ = valueHi; + hiQ = valueHi; + } + + _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); + +} + +static VOID +_InitNormalChipThreeOutEpPriority( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; + + if(!pregistrypriv->wifi_spec ){// typical setting + beQ = QUEUE_LOW; + bkQ = QUEUE_LOW; + viQ = QUEUE_NORMAL; + voQ = QUEUE_HIGH; + mgtQ = QUEUE_HIGH; + hiQ = QUEUE_HIGH; + } + else{// for WMM + beQ = QUEUE_LOW; + bkQ = QUEUE_NORMAL; + viQ = QUEUE_NORMAL; + voQ = QUEUE_HIGH; + mgtQ = QUEUE_HIGH; + hiQ = QUEUE_HIGH; + } + _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); +} + +static VOID +_InitNormalChipQueuePriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + switch(pHalData->OutEpNumber) + { + case 1: + _InitNormalChipOneOutEpPriority(Adapter); + break; + case 2: + _InitNormalChipTwoOutEpPriority(Adapter); + break; + case 3: + _InitNormalChipThreeOutEpPriority(Adapter); + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + + +} + +static VOID +_InitTestChipQueuePriority( + IN PADAPTER Adapter + ) +{ + u8 hq_sele ; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + + switch(pHalData->OutEpNumber) + { + case 2: // (TX_SELE_HQ|TX_SELE_LQ) + if(!pregistrypriv->wifi_spec)//typical setting + hq_sele = HQSEL_VOQ | HQSEL_VIQ | HQSEL_MGTQ | HQSEL_HIQ ; + else //for WMM + hq_sele = HQSEL_VOQ | HQSEL_BEQ | HQSEL_MGTQ | HQSEL_HIQ ; + break; + case 1: + if(TX_SELE_LQ == pHalData->OutEpQueueSel ){//map all endpoint to Low queue + hq_sele = 0; + } + else if(TX_SELE_HQ == pHalData->OutEpQueueSel){//map all endpoint to High queue + hq_sele = HQSEL_VOQ | HQSEL_VIQ | HQSEL_BEQ | HQSEL_BKQ | HQSEL_MGTQ | HQSEL_HIQ ; + } + break; + default: + //RT_ASSERT(FALSE,("Shall not reach here!\n")); + break; + } + rtw_write8(Adapter, (REG_TRXDMA_CTRL+1), hq_sele); +} + + +static VOID +_InitQueuePriority( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(IS_NORMAL_CHIP( pHalData->VersionID)){ + _InitNormalChipQueuePriority(Adapter); + } + else{ + _InitTestChipQueuePriority(Adapter); + } +} + +static VOID +_InitHardwareDropIncorrectBulkOut( + IN PADAPTER Adapter + ) +{ + u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK); + value32 |= DROP_DATA_EN; + rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32); +} + +static VOID +_InitNetworkType( + IN PADAPTER Adapter + ) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_CR); + + // TODO: use the other function to set network type +#if RTL8191C_FPGA_NETWORKTYPE_ADHOC + value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AD_HOC); +#else + value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); +#endif + rtw_write32(Adapter, REG_CR, value32); +// RASSERT(pIoBase->rtw_read8(REG_CR + 2) == 0x2); +} + +static VOID +_InitTransferPageSize( + IN PADAPTER Adapter + ) +{ + // Tx page size is always 128. + + u8 value8; + value8 = _PSRX(PBP_128) | _PSTX(PBP_128); + rtw_write8(Adapter, REG_PBP, value8); +} + +static VOID +_InitDriverInfoSize( + IN PADAPTER Adapter, + IN u8 drvInfoSize + ) +{ + rtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize); +} + +static VOID +_InitWMACSetting( + IN PADAPTER Adapter + ) +{ + //u4Byte value32; + //u16 value16; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + //pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; + pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYSTS; +#if (0 == RTL8192C_RX_PACKET_NO_INCLUDE_CRC) + pHalData->ReceiveConfig |= ACRC32; +#endif + + // some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile() + rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); + + // Accept all multicast address + rtw_write32(Adapter, REG_MAR, 0xFFFFFFFF); + rtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF); + + + // Accept all data frames + //value16 = 0xFFFF; + //rtw_write16(Adapter, REG_RXFLTMAP2, value16); + + // 2010.09.08 hpfan + // Since ADF is removed from RCR, ps-poll will not be indicate to driver, + // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. + //value16 = 0x400; + //rtw_write16(Adapter, REG_RXFLTMAP1, value16); + + // Accept all management frames + //value16 = 0xFFFF; + //rtw_write16(Adapter, REG_RXFLTMAP0, value16); + + //enable RX_SHIFT bits + //rtw_write8(Adapter, REG_TRXDMA_CTRL, rtw_read8(Adapter, REG_TRXDMA_CTRL)|BIT(1)); + +} + +static VOID +_InitAdaptiveCtrl( + IN PADAPTER Adapter + ) +{ + u16 value16; + u32 value32; + + // Response Rate Set + value32 = rtw_read32(Adapter, REG_RRSR); + value32 &= ~RATE_BITMAP_ALL; + value32 |= RATE_RRSR_CCK_ONLY_1M; + rtw_write32(Adapter, REG_RRSR, value32); + + // CF-END Threshold + //m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1); + + // SIFS (used in NAV) + value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10); + rtw_write16(Adapter, REG_SPEC_SIFS, value16); + + // Retry Limit + value16 = _LRL(0x30) | _SRL(0x30); + rtw_write16(Adapter, REG_RL, value16); + +} + +static VOID +_InitRateFallback( + IN PADAPTER Adapter + ) +{ + // Set Data Auto Rate Fallback Retry Count register. + rtw_write32(Adapter, REG_DARFRC, 0x00000000); + rtw_write32(Adapter, REG_DARFRC+4, 0x10080404); + rtw_write32(Adapter, REG_RARFRC, 0x04030201); + rtw_write32(Adapter, REG_RARFRC+4, 0x08070605); + +} + + +static VOID +_InitEDCA( + IN PADAPTER Adapter + ) +{ + // Set Spec SIFS (used in NAV) + rtw_write16(Adapter,REG_SPEC_SIFS, 0x100a); + rtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a); + + // Set SIFS for CCK + rtw_write16(Adapter,REG_SIFS_CTX, 0x100a); + + // Set SIFS for OFDM + rtw_write16(Adapter,REG_SIFS_TRX, 0x100a); + + // TXOP + rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B); + rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F); + rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324); + rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226); +} + + +static VOID +_InitBeaconMaxError( + IN PADAPTER Adapter, + IN BOOLEAN InfraMode + ) +{ +#ifdef RTL8192CU_ADHOC_WORKAROUND_SETTING + rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); +#else + //rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10)); +#endif +} + + +#ifdef CONFIG_LED +static void _InitHWLed(PADAPTER Adapter) +{ + struct led_priv *pledpriv = &(Adapter->ledpriv); + + if( pledpriv->LedStrategy != HW_LED) + return; + +// HW led control +// to do .... +//must consider cases of antenna diversity/ commbo card/solo card/mini card + +} +#endif //CONFIG_LED + +static VOID +_InitRDGSetting( + IN PADAPTER Adapter + ) +{ + rtw_write8(Adapter,REG_RD_CTRL,0xFF); + rtw_write16(Adapter, REG_RD_NAV_NXT, 0x200); + rtw_write8(Adapter,REG_RD_RESP_PKT_TH,0x05); +} + +static VOID +_InitRxSetting( + IN PADAPTER Adapter + ) +{ + rtw_write32(Adapter, REG_MACID, 0x87654321); + rtw_write32(Adapter, 0x0700, 0x87654321); +} + +static VOID +_InitRetryFunction( + IN PADAPTER Adapter + ) +{ + u8 value8; + + value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); + value8 |= EN_AMPDU_RTY_NEW; + rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); + + // Set ACK timeout + rtw_write8(Adapter, REG_ACKTO, 0x40); +} + +/*----------------------------------------------------------------------------- + * Function: usb_AggSettingTxUpdate() + * + * Overview: Seperate TX/RX parameters update independent for TP detection and + * dynamic TX/RX aggreagtion parameters update. + * + * Input: PADAPTER + * + * Output/Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Seperate to smaller function. + * + *---------------------------------------------------------------------------*/ +static VOID +usb_AggSettingTxUpdate( + IN PADAPTER Adapter + ) +{ +#ifdef CONFIG_USB_TX_AGGREGATION + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u32 value32; + + if(Adapter->registrypriv.wifi_spec) + pHalData->UsbTxAggMode = _FALSE; + + if(pHalData->UsbTxAggMode){ + value32 = rtw_read32(Adapter, REG_TDECTRL); + value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); + value32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT); + + rtw_write32(Adapter, REG_TDECTRL, value32); + } + +#endif +} // usb_AggSettingTxUpdate + + +/*----------------------------------------------------------------------------- + * Function: usb_AggSettingRxUpdate() + * + * Overview: Seperate TX/RX parameters update independent for TP detection and + * dynamic TX/RX aggreagtion parameters update. + * + * Input: PADAPTER + * + * Output/Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Seperate to smaller function. + * + *---------------------------------------------------------------------------*/ +static VOID +usb_AggSettingRxUpdate( + IN PADAPTER Adapter + ) +{ +#ifdef CONFIG_USB_RX_AGGREGATION + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u8 valueDMA; + u8 valueUSB; + + valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL); + valueUSB = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); + + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + valueDMA |= RXDMA_AGG_EN; + valueUSB &= ~USB_AGG_EN; + break; + case USB_RX_AGG_USB: + valueDMA &= ~RXDMA_AGG_EN; + valueUSB |= USB_AGG_EN; + break; + case USB_RX_AGG_MIX: + valueDMA |= RXDMA_AGG_EN; + valueUSB |= USB_AGG_EN; + break; + case USB_RX_AGG_DISABLE: + default: + valueDMA &= ~RXDMA_AGG_EN; + valueUSB &= ~USB_AGG_EN; + break; + } + + rtw_write8(Adapter, REG_TRXDMA_CTRL, valueDMA); + rtw_write8(Adapter, REG_USB_SPECIAL_OPTION, valueUSB); + + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount); + rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout); + break; + case USB_RX_AGG_USB: + rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount); + rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout); + break; + case USB_RX_AGG_MIX: + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, pHalData->UsbRxAggPageCount); + rtw_write8(Adapter, REG_USB_DMA_AGG_TO, pHalData->UsbRxAggPageTimeout); + rtw_write8(Adapter, REG_USB_AGG_TH, pHalData->UsbRxAggBlockCount); + rtw_write8(Adapter, REG_USB_AGG_TO, pHalData->UsbRxAggBlockTimeout); + break; + case USB_RX_AGG_DISABLE: + default: + // TODO: + break; + } + + switch(PBP_128) + { + case PBP_128: + pHalData->HwRxPageSize = 128; + break; + case PBP_64: + pHalData->HwRxPageSize = 64; + break; + case PBP_256: + pHalData->HwRxPageSize = 256; + break; + case PBP_512: + pHalData->HwRxPageSize = 512; + break; + case PBP_1024: + pHalData->HwRxPageSize = 1024; + break; + default: + //RT_ASSERT(FALSE, ("RX_PAGE_SIZE_REG_VALUE definition is incorrect!\n")); + break; + } +#endif +} // usb_AggSettingRxUpdate + +static VOID +InitUsbAggregationSetting( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + // Tx aggregation setting + usb_AggSettingTxUpdate(Adapter); + + // Rx aggregation setting + usb_AggSettingRxUpdate(Adapter); + + // 201/12/10 MH Add for USB agg mode dynamic switch. + pHalData->UsbRxHighSpeedMode = _FALSE; +} + +/*----------------------------------------------------------------------------- + * Function: USB_AggModeSwitch() + * + * Overview: When RX traffic is more than 40M, we need to adjust some parameters to increase + * RX speed by increasing batch indication size. This will decrease TCP ACK speed, we + * need to monitor the influence of FTP/network share. + * For TX mode, we are still ubder investigation. + * + * Input: PADAPTER + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 12/10/2010 MHC Create Version 0. + * + *---------------------------------------------------------------------------*/ +VOID +USB_AggModeSwitch( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + + //pHalData->UsbRxHighSpeedMode = FALSE; + // How to measure the RX speed? We assume that when traffic is more than + if (pMgntInfo->bRegAggDMEnable == _FALSE) + { + return; // Inf not support. + } + + + if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _TRUE && + pHalData->UsbRxHighSpeedMode == _FALSE) + { + pHalData->UsbRxHighSpeedMode = _TRUE; + DBG_8192C("UsbAggModeSwitchCheck to HIGH\n"); + } + else if (pmlmepriv->LinkDetectInfo.bHigherBusyTraffic == _FALSE && + pHalData->UsbRxHighSpeedMode == _TRUE) + { + pHalData->UsbRxHighSpeedMode = _FALSE; + DBG_8192C("UsbAggModeSwitchCheck to LOW\n"); + } + else + { + return; + } + + // 2010/12/10 MH Add for USB Aggregation judgement we need to + //if( pMgntInfo->LinkDetectInfo.NumRxOkInPeriod > 4000 || + // pMgntInfo->LinkDetectInfo.NumTxOkInPeriod > 4000 ) + +#ifdef CONFIG_USB_TX_AGGREGATION + //usb_AggSettingTxUpdate(Adapter); +#endif + +#ifdef CONFIG_USB_RX_AGGREGATION + if (pHalData->UsbRxHighSpeedMode == _TRUE) + { + // 2010/12/10 MH The parameter is tested by SD1 engineer and SD3 channel emulator. + // USB mode + pHalData->UsbRxAggBlockCount = 40; + pHalData->UsbRxAggBlockTimeout = 5; + // Mix mode + pHalData->UsbRxAggPageCount = 72; + pHalData->UsbRxAggPageTimeout = 6; + } + else + { + // USB mode + pHalData->UsbRxAggBlockCount = pMgntInfo->RegUsbRxAggBlockCount; + pHalData->UsbRxAggBlockTimeout = pMgntInfo->RegUsbRxAggBlockTimeout; + // Mix mode + pHalData->UsbRxAggPageCount = pMgntInfo->RegUsbRxAggPageCount; + pHalData->UsbRxAggPageTimeout = pMgntInfo->RegUsbRxAggPageTimeout; + } +#endif +#endif +} // USB_AggModeSwitch + +static VOID +_InitOperationMode( + IN PADAPTER Adapter + ) +{ +#if 0//gtest + PHAL_DATA_8192CUSB pHalData = GetHalData8192CUsb(Adapter); + u1Byte regBwOpMode = 0; + u4Byte regRATR = 0, regRRSR = 0; + + + //1 This part need to modified according to the rate set we filtered!! + // + // Set RRSR, RATR, and REG_BWOPMODE registers + // + switch(Adapter->RegWirelessMode) + { + case WIRELESS_MODE_B: + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK; + regRRSR = RATE_ALL_CCK; + break; + case WIRELESS_MODE_A: + ASSERT(FALSE); +#if 0 + regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ; + regRATR = RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_OFDM_AG; +#endif + break; + case WIRELESS_MODE_G: + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + break; + case WIRELESS_MODE_AUTO: + if (Adapter->bInHctTest) + { + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + } + else + { + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + } + break; + case WIRELESS_MODE_N_24G: + // It support CCK rate by default. + // CCK rate will be filtered out only when associated AP does not support it. + regBwOpMode = BW_OPMODE_20MHZ; + regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; + break; + case WIRELESS_MODE_N_5G: + ASSERT(FALSE); +#if 0 + regBwOpMode = BW_OPMODE_5G; + regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; + regRRSR = RATE_ALL_OFDM_AG; +#endif + break; + } + + // Ziv ???????? + //PlatformEFIOWrite4Byte(Adapter, REG_INIRTS_RATE_SEL, regRRSR); + PlatformEFIOWrite1Byte(Adapter, REG_BWOPMODE, regBwOpMode); + + // For Min Spacing configuration. + switch(pHalData->RF_Type) + { + case RF_1T2R: + case RF_1T1R: + RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter: RF_Type%s\n", (pHalData->RF_Type==RF_1T1R? "(1T1R)":"(1T2R)"))); + Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3); + break; + case RF_2T2R: + case RF_2T2R_GREEN: + RT_TRACE(COMP_INIT, DBG_LOUD, ("Initializeadapter:RF_Type(2T2R)\n")); + Adapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3); + break; + } + + PlatformEFIOWrite1Byte(Adapter, REG_AMPDU_MIN_SPACE, Adapter->MgntInfo.MinSpaceCfg); +#endif +} + + + static VOID +_InitBeaconParameters( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); + + // TODO: Remove these magic number + rtw_write16(Adapter, REG_TBTT_PROHIBIT,0x6404);// ms + rtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME);// 5ms + rtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME); // 2ms + + // Suggested by designer timchen. Change beacon AIFS to the largest number + // beacause test chip does not contension before sending beacon. by tynli. 2009.11.03 + if(IS_NORMAL_CHIP( pHalData->VersionID)){ + rtw_write16(Adapter, REG_BCNTCFG, 0x660F); + } + else{ + rtw_write16(Adapter, REG_BCNTCFG, 0x66FF); + } + +} + +static VOID +_InitRFType( + IN PADAPTER Adapter + ) +{ + struct registry_priv *pregpriv = &Adapter->registrypriv; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN is92CU = IS_92C_SERIAL(pHalData->VersionID); + +#if DISABLE_BB_RF + pHalData->rf_chip = RF_PSEUDO_11N; + return; +#endif + + pHalData->rf_chip = RF_6052; + + if(_FALSE == is92CU){ + pHalData->rf_type = RF_1T1R; + DBG_8192C("Set RF Chip ID to RF_6052 and RF type to 1T1R.\n"); + return; + } + + // TODO: Consider that EEPROM set 92CU to 1T1R later. + // Force to overwrite setting according to chip version. Ignore EEPROM setting. + //pHalData->RF_Type = is92CU ? RF_2T2R : RF_1T1R; + MSG_8192C("Set RF Chip ID to RF_6052 and RF type to %d.\n", pHalData->rf_type); + +} + +static VOID _InitAdhocWorkaroundParams(IN PADAPTER Adapter) +{ +#if RTL8192CU_ADHOC_WORKAROUND_SETTING + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL); + pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); + pHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); + pHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2); +#endif +} + +static VOID +_BeaconFunctionEnable( + IN PADAPTER Adapter, + IN BOOLEAN Enable, + IN BOOLEAN Linked + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 value8 = 0; + + //value8 = Enable ? (EN_BCN_FUNCTION | EN_TXBCN_RPT) : EN_BCN_FUNCTION; + + if(_FALSE == Linked){ + if(IS_NORMAL_CHIP( pHalData->VersionID)){ + value8 |= DIS_TSF_UDT0_NORMAL_CHIP; + } + else{ + value8 |= DIS_TSF_UDT0_TEST_CHIP; + } + } + + rtw_write8(Adapter, REG_BCN_CTRL, value8); +#else + rtw_write8(Adapter, REG_BCN_CTRL, (BIT4 | BIT3 | BIT1)); + //SetBcnCtrlReg(Adapter, (BIT4 | BIT3 | BIT1), 0x00); + //RT_TRACE(COMP_BEACON, DBG_LOUD, ("_BeaconFunctionEnable 0x550 0x%x\n", PlatformEFIORead1Byte(Adapter, 0x550))); + + rtw_write8(Adapter, REG_RD_CTRL+1, 0x6F); +#endif +} + + +// Set CCK and OFDM Block "ON" +static VOID _BBTurnOnBlock( + IN PADAPTER Adapter + ) +{ +#if (DISABLE_BB_RF) + return; +#endif + + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1); + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1); +} + +static VOID _RfPowerSave( + IN PADAPTER Adapter + ) +{ +#if 0 + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + u1Byte eRFPath; + +#if (DISABLE_BB_RF) + return; +#endif + + if(pMgntInfo->RegRfOff == TRUE){ // User disable RF via registry. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\n")); + MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW); + // Those action will be discard in MgntActSet_RF_State because off the same state + for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0); + } + else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS){ // H/W or S/W RF OFF before sleep. + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\n", pMgntInfo->RfOffReason)); + MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason); + } + else{ + pHalData->eRFPowerState = eRfOn; + pMgntInfo->RfOffReason = 0; + if(Adapter->bInSetPower || Adapter->bResetInProgress) + PlatformUsbEnableInPipes(Adapter); + RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): RF is on.\n")); + } +#endif +} + +enum { + Antenna_Lfet = 1, + Antenna_Right = 2, +}; + +static VOID +_InitAntenna_Selection(IN PADAPTER Adapter) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(pHalData->AntDivCfg==0) + return; + DBG_8192C("==> %s ....\n",__FUNCTION__); + + if((RF_1T1R == pHalData->rf_type)) + { + rtw_write32(Adapter, REG_LEDCFG0, rtw_read32(Adapter, REG_LEDCFG0)|BIT23); + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); + + if(PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == Antenna_A) + pHalData->CurAntenna = Antenna_A; + else + pHalData->CurAntenna = Antenna_B; + DBG_8192C("%s,Cur_ant:(%x)%s\n",__FUNCTION__,pHalData->CurAntenna,(pHalData->CurAntenna == Antenna_A)?"Antenna_A":"Antenna_B"); + +} + + +} +// +// 2010/08/09 MH Add for power down check. +// +static BOOLEAN +HalDetectPwrDownMode( + IN PADAPTER Adapter + ) +{ + u8 tmpvalue; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + + EFUSE_ShadowRead(Adapter, 1, EEPROM_RF_OPT3, (u32 *)&tmpvalue); + + // 2010/08/25 MH INF priority > PDN Efuse value. + if(tmpvalue & BIT4 && pwrctrlpriv->reg_pdnmode) + { + pHalData->pwrdown = _TRUE; + } + else + { + pHalData->pwrdown = _FALSE; + } + + DBG_8192C("HalDetectPwrDownMode(): PDN=%d\n", pHalData->pwrdown); + return pHalData->pwrdown; + +} // HalDetectPwrDownMode + + +// +// 2010/08/26 MH Add for selective suspend mode check. +// If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and +// slim card. +// +static VOID +HalDetectSelectiveSuspendMode( + IN PADAPTER Adapter + ) +{ + u8 tmpvalue; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dvobj_priv *pdvobjpriv = &Adapter->dvobjpriv; + + // If support HW radio detect, we need to enable WOL ability, otherwise, we + // can not use FW to notify host the power state switch. + + EFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue); + + DBG_8192C("HalDetectSelectiveSuspendMode(): SS "); + if(tmpvalue & BIT1) + { + DBG_8192C("Enable\n"); + } + else + { + DBG_8192C("Disable\n"); + pdvobjpriv->RegUsbSS = _FALSE; + } + + // 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode. + if (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData)) + { + //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); + + //if (!pMgntInfo->bRegDongleSS) + //{ + // RT_TRACE(COMP_INIT, DBG_LOUD, ("Dongle disable SS\n")); + pdvobjpriv->RegUsbSS = _FALSE; + //} + } +} // HalDetectSelectiveSuspendMode +/*----------------------------------------------------------------------------- + * Function: HwSuspendModeEnable92Cu() + * + * Overview: HW suspend mode switch. + * + * Input: NONE + * + * Output: NONE + * + * Return: NONE + * + * Revised History: + * When Who Remark + * 08/23/2010 MHC HW suspend mode switch test.. + *---------------------------------------------------------------------------*/ +static VOID +HwSuspendModeEnable92Cu( + IN PADAPTER pAdapter, + IN u8 Type + ) +{ + //PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(pAdapter); + u16 reg = rtw_read16(pAdapter, REG_GPIO_MUXCFG); + + //if (!pDevice->RegUsbSS) + { + return; + } + + // + // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW + // to enter suspend mode automatically. Otherwise, it will shut down major power + // domain and 8051 will stop. When we try to enter selective suspend mode, we + // need to prevent HW to enter D2 mode aumotmatically. Another way, Host will + // issue a S10 signal to power domain. Then it will cleat SIC setting(from Yngli). + // We need to enable HW suspend mode when enter S3/S4 or disable. We need + // to disable HW suspend mode for IPS/radio_off. + // + //RT_TRACE(COMP_RF, DBG_LOUD, ("HwSuspendModeEnable92Cu = %d\n", Type)); + if (Type == _FALSE) + { + reg |= BIT14; + //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg)); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + reg |= BIT12; + //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg)); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + } + else + { + reg &= (~BIT12); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + reg &= (~BIT14); + rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg); + } + +} // HwSuspendModeEnable92Cu +rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u8 val8; + rt_rf_power_state rfpowerstate = rf_off; + + if(pAdapter->pwrctrlpriv.bHWPowerdown) + { + val8 = rtw_read8(pAdapter, REG_HSISR); + DBG_8192C("pwrdown, 0x5c(BIT7)=%02x\n", val8); + rfpowerstate = (val8 & BIT7) ? rf_off: rf_on; + } + else // rf on/off + { + rtw_write8( pAdapter, REG_MAC_PINMUX_CFG,rtw_read8(pAdapter, REG_MAC_PINMUX_CFG)&~(BIT3)); + val8 = rtw_read8(pAdapter, REG_GPIO_IO_SEL); + DBG_8192C("GPIO_IN=%02x\n", val8); + rfpowerstate = (val8 & BIT3) ? rf_on : rf_off; + } + return rfpowerstate; +} // HalDetectPwrDownMode +#ifdef SUPPORT_HW_RFOFF_DETECTED +void _ps_open_RF(_adapter *padapter); +#endif + +u32 rtl8192cu_hal_init(PADAPTER Adapter) +{ + u8 val8 = 0; + u32 boundary, status = _SUCCESS; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u8 isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + u8 is92C = IS_92C_SERIAL(pHalData->VersionID); + rt_rf_power_state eRfPowerStateToSet; +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + + u32 init_start_time = rtw_get_current_time(); + +_func_enter_; + +#ifdef SUPPORT_HW_RFOFF_DETECTED + if(Adapter->pwrctrlpriv.bkeepfwalive) + { + _ps_open_RF(Adapter); + + if(pHalData->bIQKInitialized ){ + rtl8192c_PHY_IQCalibrate(Adapter,_TRUE); + } + else{ + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); + pHalData->bIQKInitialized = _TRUE; + } + rtl8192c_dm_CheckTXPowerTracking(Adapter); + rtl8192c_PHY_LCCalibrate(Adapter); + + goto exit; + } +#endif + + status = _InitPowerOn(Adapter); + if(status == _FAIL){ + RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init power on!\n")); + goto exit; + } + + if(!pregistrypriv->wifi_spec){ + boundary = TX_PAGE_BOUNDARY; + } + else{// for WMM + boundary = (IS_NORMAL_CHIP(pHalData->VersionID)) ?WMM_NORMAL_TX_PAGE_BOUNDARY + :WMM_TEST_TX_PAGE_BOUNDARY; + } + + status = InitLLTTable(Adapter, boundary); + if(status == _FAIL){ + //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to init power on!\n")); + goto exit; + } + + _InitQueueReservedPage(Adapter); + _InitTxBufferBoundary(Adapter); + _InitQueuePriority(Adapter); + _InitPageBoundary(Adapter); + _InitTransferPageSize(Adapter); + + +#if ENABLE_USB_DROP_INCORRECT_OUT + _InitHardwareDropIncorrectBulkOut(Adapter); +#endif + + if(pHalData->bRDGEnable){ + _InitRDGSetting(Adapter); + } + +#if (1 == MP_DRIVER) + _InitRxSetting(Adapter); + // Don't Download Firmware + Adapter->bFWReady = _FALSE; +#elif RTL8192CU_FW_DOWNLOAD_ENABLE + status = FirmwareDownload92C(Adapter); + if(status != _SUCCESS) + { + + Adapter->bFWReady = _FALSE; + + pHalData->fw_ractrl = _FALSE; + + DBG_8192C("fw download fail!\n"); + + goto exit; + } + else + { + + Adapter->bFWReady = _TRUE; + + pHalData->fw_ractrl = _TRUE; + + DBG_8192C("fw download ok!\n"); + } +#endif + + InitializeFirmwareVars92C(Adapter); + + if(pwrctrlpriv->reg_rfoff == _TRUE){ + pwrctrlpriv->rf_pwrstate = rf_off; + } + + // 2010/08/09 MH We need to check if we need to turnon or off RF after detecting + // HW GPIO pin. Before PHY_RFConfig8192C. + //HalDetectPwrDownMode(Adapter); + // 2010/08/26 MH If Efuse does not support sective suspend then disable the function. + //HalDetectSelectiveSuspendMode(Adapter); + + + // Set RF type for BB/RF configuration + _InitRFType(Adapter);//->_ReadRFType() + + // Save target channel + // Current Channel will be updated again later. + pHalData->CurrentChannel = 6;//default set to 6 + +#if (HAL_MAC_ENABLE == 1) + status = PHY_MACConfig8192C(Adapter); + if(status == _FAIL) + { + goto exit; + } +#endif + // Get Rx PHY status in order to report RSSI and others. + _InitDriverInfoSize(Adapter, DRVINFO_SZ); + + _InitInterrupt(Adapter); + _InitID(Adapter);//set mac_address + _InitNetworkType(Adapter);//set msr + _InitWMACSetting(Adapter); + _InitAdaptiveCtrl(Adapter); + _InitEDCA(Adapter); + _InitRateFallback(Adapter); + _InitRetryFunction(Adapter); + InitUsbAggregationSetting(Adapter); + _InitOperationMode(Adapter);//todo + _InitBeaconParameters(Adapter); + _InitBeaconMaxError(Adapter, _TRUE); + +#ifdef CONFIG_LED + _InitHWLed(Adapter); +#endif //CONFIG_LED + + // + //d. Initialize BB related configurations. + // +#if (HAL_BB_ENABLE == 1) + status = PHY_BBConfig8192C(Adapter); + if(status == _FAIL) + { + goto exit; + } +#endif + + // 92CU use 3-wire to r/w RF + //pHalData->Rf_Mode = RF_OP_By_SW_3wire; + +#if (HAL_RF_ENABLE == 1) + status = PHY_RFConfig8192C(Adapter); + if(status == _FAIL) + { + goto exit; + } + + if(IS_VENDOR_UMC_A_CUT(pHalData->VersionID) && !IS_92C_SERIAL(pHalData->VersionID)) + { + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_RX_G1, bMaskDWord, 0x30255); + PHY_SetRFReg(Adapter, RF90_PATH_A, RF_RX_G2, bMaskDWord, 0x50a00); + } +#endif + + // + // Joseph Note: Keep RfRegChnlVal for later use. + // + pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(Adapter, (RF90_RADIO_PATH_E)0, RF_CHNLBW, bRFRegOffsetMask); + pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(Adapter, (RF90_RADIO_PATH_E)1, RF_CHNLBW, bRFRegOffsetMask); + + _BBTurnOnBlock(Adapter); + //NicIFSetMacAddress(padapter, padapter->PermanentAddress); + + invalidate_cam_all(Adapter); + + // 2010/12/17 MH We need to set TX power according to EFUSE content at first. + PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel); + +// Move by Neo for USB SS to below setp +//_RfPowerSave(Adapter); + + if (!IS_92C_SERIAL( pHalData->VersionID) && (pHalData->AntDivCfg!=0)) + { //for 88CU ,1T1R + _InitAntenna_Selection(Adapter); + } + + + // + // Disable BAR, suggested by Scott + // 2010.04.09 add by hpfan + // + rtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff); + + // HW SEQ CTRL + //set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. + rtw_write8(Adapter,REG_HWSEQ_CTRL, 0xFF); + + if(pregistrypriv->wifi_spec) + rtw_write16(Adapter,REG_FAST_EDCA_CTRL ,0); + +#if (MP_DRIVER == 1) + Adapter->mppriv.channel = pHalData->CurrentChannel; + MPT_InitializeAdapter(Adapter, Adapter->mppriv.channel); +#else + + + // + // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status + // and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not + // call init_adapter. May cause some problem?? + // + // Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed + // in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState + // is the same as eRfOff, we should change it to eRfOn after we config RF parameters. + // Added by tynli. 2010.03.30. + pwrctrlpriv->rf_pwrstate = rf_on; + +#if 0 //to do + RT_CLEAR_PS_LEVEL(pwrctrlpriv, RT_RF_OFF_LEVL_HALT_NIC); +#if 1 //Todo + // 20100326 Joseph: Copy from GPIOChangeRFWorkItemCallBack() function to check HW radio on/off. + // 20100329 Joseph: Revise and integrate the HW/SW radio off code in initialization. + + eRfPowerStateToSet = (rt_rf_power_state) RfOnOffDetect(Adapter); + pwrctrlpriv->rfoff_reason |= eRfPowerStateToSet==rf_on ? RF_CHANGE_BY_INIT : RF_CHANGE_BY_HW; + pwrctrlpriv->rfoff_reason |= (pwrctrlpriv->reg_rfoff) ? RF_CHANGE_BY_SW : 0; + + if(pwrctrlpriv->rfoff_reason&RF_CHANGE_BY_HW) + pwrctrlpriv->b_hw_radio_off = _TRUE; + + DBG_8192C("eRfPowerStateToSet=%d\n", eRfPowerStateToSet); + + if(pwrctrlpriv->reg_rfoff == _TRUE) + { // User disable RF via registry. + DBG_8192C("InitializeAdapter8192CU(): Turn off RF for RegRfOff.\n"); + //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_SW, _TRUE); + + // Those action will be discard in MgntActSet_RF_State because off the same state + //for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) + //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x4, 0xC00, 0x0); + } + else if(pwrctrlpriv->rfoff_reason > RF_CHANGE_BY_PS) + { // H/W or S/W RF OFF before sleep. + DBG_8192C(" Turn off RF for RfOffReason(%x) ----------\n", pwrctrlpriv->rfoff_reason); + //pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; + pwrctrlpriv->rf_pwrstate = rf_on; + //MgntActSet_RF_State(Adapter, rf_off, pwrctrlpriv->rfoff_reason, _TRUE); + } + else + { + // Perform GPIO polling to find out current RF state. added by Roger, 2010.04.09. + if(pHalData->BoardType == BOARD_MINICARD /*&& (Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)*/) + { + DBG_8192C("InitializeAdapter8192CU(): RF=%d \n", eRfPowerStateToSet); + if (eRfPowerStateToSet == rf_off) + { + //MgntActSet_RF_State(Adapter, rf_off, RF_CHANGE_BY_HW, _TRUE); + pwrctrlpriv->b_hw_radio_off = _TRUE; + } + else + { + pwrctrlpriv->rf_pwrstate = rf_off; + pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; + pwrctrlpriv->b_hw_radio_off = _FALSE; + //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE); + } + } + else + { + pwrctrlpriv->rf_pwrstate = rf_off; + pwrctrlpriv->rfoff_reason = RF_CHANGE_BY_INIT; + //MgntActSet_RF_State(Adapter, rf_on, pwrctrlpriv->rfoff_reason, _TRUE); + } + + pwrctrlpriv->rfoff_reason = 0; + pwrctrlpriv->b_hw_radio_off = _FALSE; + pwrctrlpriv->rf_pwrstate = rf_on; + rtw_led_control(Adapter, LED_CTL_POWER_ON); + + } + + // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. + // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. + if(pHalData->pwrdown && eRfPowerStateToSet == rf_off) + { + // Enable register area 0x0-0xc. + rtw_write8(Adapter, REG_RSV_CTRL, 0x0); + + // + // We should configure HW PDn source for WiFi ONLY, and then + // our HW will be set in power-down mode if PDn source from all functions are configured. + // 2010.10.06. + // + //if(IS_HARDWARE_TYPE_8723U(Adapter)) + //{ + // u1bTmp = rtw_read8(Adapter, REG_MULTI_FUNC_CTRL); + // rtw_write8(Adapter, REG_MULTI_FUNC_CTRL, (u1bTmp|WL_HWPDN_EN)); + //} + //else + //{ + rtw_write16(Adapter, REG_APS_FSMCO, 0x8812); + //} + } + //DrvIFIndicateCurrentPhyStatus(Adapter); // 2010/08/17 MH Disable to prevent BSOD. +#endif +#endif + // 2010/08/26 MH Merge from 8192CE. + if(pwrctrlpriv->rf_pwrstate == rf_on) + { + if(pHalData->bIQKInitialized ){ + rtl8192c_PHY_IQCalibrate(Adapter,_TRUE); + } + else + { + rtl8192c_PHY_IQCalibrate(Adapter,_FALSE); + pHalData->bIQKInitialized = _TRUE; + } + rtl8192c_dm_CheckTXPowerTracking(Adapter); + rtl8192c_PHY_LCCalibrate(Adapter); + } + +#endif /* #if (MP_DRIVER == 1) */ + +#if RTL8192CU_ADHOC_WORKAROUND_SETTING + _InitAdhocWorkaroundParams(Adapter); +#endif + + +#ifdef USB_INTERFERENCE_ISSUE + //fixed USB interface interference issue + rtw_write8(Adapter, 0xfe40, 0xe0); + rtw_write8(Adapter, 0xfe41, 0x8d); + rtw_write8(Adapter, 0xfe42, 0x80); + rtw_write32(Adapter,0x20c,0xfd0320); +#if 1 + //2011/01/07 ,suggest by Johnny,for solved the problem that too many protocol error on USB bus + if(!IS_VENDOR_UMC_A_CUT(pHalData->VersionID) )//&& !IS_92C_SERIAL(pHalData->VersionID))// TSMC , 8188 + { + // 0xE6=0x94 + rtw_write8(Adapter, 0xFE40, 0xE6); + rtw_write8(Adapter, 0xFE41, 0x94); + rtw_write8(Adapter, 0xFE42, 0x80); + + // 0xE0=0x19 + rtw_write8(Adapter, 0xFE40, 0xE0); + rtw_write8(Adapter, 0xFE41, 0x19); + rtw_write8(Adapter, 0xFE42, 0x80); + + // 0xE5=0x91 + rtw_write8(Adapter, 0xFE40, 0xE5); + rtw_write8(Adapter, 0xFE41, 0x91); + rtw_write8(Adapter, 0xFE42, 0x80); + + // 0xE2=0x81 + rtw_write8(Adapter, 0xFE40, 0xE2); + rtw_write8(Adapter, 0xFE41, 0x81); + rtw_write8(Adapter, 0xFE42, 0x80); + + } + +#endif +#endif //USB_INTERFERENCE_ISSUE + + _InitPABias(Adapter); + +#ifdef CONFIG_BT_COEXIST + _InitBTCoexist(Adapter); +#endif + + rtl8192c_InitHalDm(Adapter); + + // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter + // suspend mode automatically. + //HwSuspendModeEnable92Cu(Adapter, _FALSE); + + rtw_write8(Adapter, 0x15, 0xe9);//suggest by Johnny for lower temperature + //_dbg_dump_macreg(padapter); + + //misc + { + int i; + u8 mac_addr[6]; + for(i=0; i<6; i++) + { + mac_addr[i] = rtw_read8(Adapter, REG_MACID+i); + } + + DBG_8192C("MAC Address from REG_MACID = "MAC_FMT"\n", MAC_ARG(mac_addr)); + } + +exit: + + //DBG_871X("%s in %dms\n", __FUNCTION__, rtw_get_passing_time_ms(init_start_time)); + +_func_exit_; + + return status; +} + + +#define SYNC_SD7_20110802_phy_SsPwrSwitch92CU +#ifdef SYNC_SD7_20110802_phy_SsPwrSwitch92CU +#define PlatformEFIOWrite1Byte rtw_write8 +#define PlatformEFIOWrite2Byte rtw_write16 +#define PlatformEFIORead1Byte rtw_read8 +#define delay_ms rtw_mdelay_os +#define u1Byte u8 + +VOID +phy_SsPwrSwitch92CU( + IN PADAPTER Adapter, + IN rt_rf_power_state eRFPowerState, + IN int bRegSSPwrLvl + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u1Byte value8; + + switch( eRFPowerState ) + { + case rf_on: + if (bRegSSPwrLvl == 1) + { + // 1. Enable MAC Clock. Can not be enabled now. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); + + // 2. Force PWM, Enable SPS18_LDO_Marco_Block + PlatformEFIOWrite1Byte(Adapter, REG_SPS0_CTRL, + PlatformEFIORead1Byte(Adapter, REG_SPS0_CTRL) | (BIT0|BIT3)); + + // 3. restore BB, AFE control register. + //RF + if (pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 1); + else + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 1); + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1); + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1, 0); + + //AFE + //DbgPrint("0x0e70 = %x\n", Adapter->PS_BBRegBackup[PSBBREG_AFE0]); + //PHY_SetBBReg(Adapter, 0x0e70, bMaskDWord ,Adapter->PS_BBRegBackup[PSBBREG_AFE0] ); + //PHY_SetBBReg(Adapter, 0x0e70, bMaskDWord ,0x631B25A0 ); + if (pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x63DB25A0 ); + else if (pHalData->rf_type == RF_1T1R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x631B25A0 ); + + // 4. issue 3-wire command that RF set to Rx idle mode. This is used to re-write the RX idle mode. + // We can only prvide a usual value instead and then HW will modify the value by itself. + PHY_SetRFReg(Adapter,RF90_PATH_A, 0, bRFRegOffsetMask,0x32D95); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetRFReg(Adapter,RF90_PATH_B, 0, bRFRegOffsetMask,0x32D95); + } + } + else // Level 2 or others. + { + //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL + PlatformEFIOWrite1Byte(Adapter, REG_AFE_PLL_CTRL, 0x81); + + // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK + PlatformEFIOWrite2Byte(Adapter, REG_AFE_XTAL_CTRL, 0x800F); + delay_ms(1); + + // 1. Enable MAC Clock. Can not be enabled now. + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); + + // 2. Force PWM, Enable SPS18_LDO_Marco_Block + PlatformEFIOWrite1Byte(Adapter, REG_SPS0_CTRL, + PlatformEFIORead1Byte(Adapter, REG_SPS0_CTRL) | (BIT0|BIT3)); + + // 3. restore BB, AFE control register. + //RF + if (pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 1); + else + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 1); + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1); + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1, 0); + + //AFE + if (pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x63DB25A0 ); + else if (pHalData->rf_type == RF_1T1R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x631B25A0 ); + + // 4. issue 3-wire command that RF set to Rx idle mode. This is used to re-write the RX idle mode. + // We can only prvide a usual value instead and then HW will modify the value by itself. + PHY_SetRFReg(Adapter,RF90_PATH_A, 0, bRFRegOffsetMask,0x32D95); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetRFReg(Adapter,RF90_PATH_B, 0, bRFRegOffsetMask,0x32D95); + } + + // 5. gated MAC Clock + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); + //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)|(BIT3)); + + { + //u1Byte eRFPath = RF90_PATH_A,value8 = 0, retry = 0; + u1Byte bytetmp; + //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); + // 2010/08/12 MH Add for B path under SS test. + //if (pHalData->RF_Type == RF_2T2R) + //PHY_SetRFReg(Adapter, RF90_PATH_B, 0x0, bMaskByte0, 0x0); + + bytetmp = PlatformEFIORead1Byte(Adapter, REG_APSD_CTRL); + PlatformEFIOWrite1Byte(Adapter, REG_APSD_CTRL, bytetmp & ~BIT6); + + delay_ms(10); + + // Set BB reset at first + PlatformEFIOWrite1Byte(Adapter, REG_SYS_FUNC_EN, 0x17 );//0x16 + + // Enable TX + PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0x0); + } + //Adapter->HalFunc.InitializeAdapterHandler(Adapter, Adapter->MgntInfo.dot11CurrentChannelNumber); + //CardSelectiveSuspendLeave(Adapter); + } + + break; + + case rf_sleep: + case rf_off: + value8 = PlatformEFIORead1Byte(Adapter, REG_SPS0_CTRL) ; + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) + value8 &= ~(BIT0); + else + value8 &= ~(BIT0|BIT3); + if (bRegSSPwrLvl == 1) + { + RT_TRACE(COMP_POWER, DBG_LOUD, ("SS LVL1\n")); + // Disable RF and BB only for SelectSuspend. + + // 1. Set BB/RF to shutdown. + // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving + // (2)Reg878[21:19]= 0 //Turn off RF-B + // (3) RegC04[7:4]= 0 // turn off all paths for packet detection + // (4) Reg800[1] = 1 // enable preamble power saving + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord); + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord); + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 0); + } + else if (pHalData->rf_type == RF_1T1R) + { + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 0); + } + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0); + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1,1); + + // 2 .AFE control register to power down. bit[30:22] + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord); + if (pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x00DB25A0); + else if (pHalData->rf_type == RF_1T1R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x001B25A0); + + // 3. issue 3-wire command that RF set to power down. + PHY_SetRFReg(Adapter,RF90_PATH_A, 0, bRFRegOffsetMask,0); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetRFReg(Adapter,RF90_PATH_B, 0, bRFRegOffsetMask,0); + } + + // 4. Force PFM , disable SPS18_LDO_Marco_Block + PlatformEFIOWrite1Byte(Adapter, REG_SPS0_CTRL, value8); + + // 5. gated MAC Clock + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); + } + else // Level 2 or others. + { + RT_TRACE(COMP_POWER, DBG_LOUD, ("SS LVL2\n")); + { + u1Byte eRFPath = RF90_PATH_A,value8 = 0; + PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); + // 2010/08/12 MH Add for B path under SS test. + //if (pHalData->RF_Type == RF_2T2R) + //PHY_SetRFReg(Adapter, RF90_PATH_B, 0x0, bMaskByte0, 0x0); + + value8 |= APSDOFF; + PlatformEFIOWrite1Byte(Adapter, REG_APSD_CTRL, value8);//0x40 + + // After switch APSD, we need to delay for stability + delay_ms(10); + + // Set BB reset at first + value8 = 0 ; + value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn); + PlatformEFIOWrite1Byte(Adapter, REG_SYS_FUNC_EN,value8 );//0x16 + } + + // Disable RF and BB only for SelectSuspend. + + // 1. Set BB/RF to shutdown. + // (1) Reg878[5:3]= 0 // RF rx_code for preamble power saving + // (2)Reg878[21:19]= 0 //Turn off RF-B + // (3) RegC04[7:4]= 0 // turn off all paths for packet detection + // (4) Reg800[1] = 1 // enable preamble power saving + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] = PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter, bMaskDWord); + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] = PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable, bMaskDWord); + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] = PHY_QueryBBReg(Adapter, rFPGA0_RFMOD, bMaskDWord); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x380038, 0); + } + else if (pHalData->rf_type == RF_1T1R) + { + PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, 0x38, 0); + } + PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0); + PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT1,1); + + // 2 .AFE control register to power down. bit[30:22] + Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] = PHY_QueryBBReg(Adapter, rRx_Wait_CCA, bMaskDWord); + if (pHalData->rf_type == RF_2T2R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x00DB25A0); + else if (pHalData->rf_type == RF_1T1R) + PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord ,0x001B25A0); + + // 3. issue 3-wire command that RF set to power down. + PHY_SetRFReg(Adapter,RF90_PATH_A, 0, bRFRegOffsetMask,0); + if (pHalData->rf_type == RF_2T2R) + { + PHY_SetRFReg(Adapter,RF90_PATH_B, 0, bRFRegOffsetMask,0); + } + + // 4. Force PFM , disable SPS18_LDO_Marco_Block + PlatformEFIOWrite1Byte(Adapter, REG_SPS0_CTRL, value8); + + // 2010/10/13 MH/Isaachsu exchange sequence. + //h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL + PlatformEFIOWrite1Byte(Adapter, REG_AFE_PLL_CTRL, 0x80); + delay_ms(1); + + // i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK + PlatformEFIOWrite2Byte(Adapter, REG_AFE_XTAL_CTRL, 0xA80F); + + // 5. gated MAC Clock + //WriteXBYTE(REG_SYS_CLKR+1, ReadXBYTE(REG_SYS_CLKR+1) & ~(BIT(3))); + //PlatformEFIOWrite1Byte(Adapter, REG_SYS_CLKR+1, PlatformEFIORead1Byte(Adapter, REG_SYS_CLKR+1)& ~(BIT3)) + + //CardSelectiveSuspendEnter(Adapter); + } + + break; + + default: + break; + } + +} // phy_PowerSwitch92CU + +void _ps_open_RF(_adapter *padapter) { + //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified + phy_SsPwrSwitch92CU(padapter, rf_on, 1); +} + +void _ps_close_RF(_adapter *padapter){ + //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified + phy_SsPwrSwitch92CU(padapter, rf_off, 1); +} +#endif //SYNC_SD7_20110802_phy_SsPwrSwitch92CU + + + +static VOID +_DisableGPIO( + IN PADAPTER Adapter + ) +{ +/*************************************** +j. GPIO_PIN_CTRL 0x44[31:0]=0x000 // +k. Value = GPIO_PIN_CTRL[7:0] +l. GPIO_PIN_CTRL 0x44[31:0] = 0x00FF0000 | (value <<8); //write external PIN level +m. GPIO_MUXCFG 0x42 [15:0] = 0x0780 +n. LEDCFG 0x4C[15:0] = 0x8080 +***************************************/ + u8 value8; + u16 value16; + u32 value32; + + //1. Disable GPIO[7:0] + rtw_write16(Adapter, REG_GPIO_PIN_CTRL+2, 0x0000); + value32 = rtw_read32(Adapter, REG_GPIO_PIN_CTRL) & 0xFFFF00FF; + value8 = (u8) (value32&0x000000FF); + value32 |= ((value8<<8) | 0x00FF0000); + rtw_write32(Adapter, REG_GPIO_PIN_CTRL, value32); + + //2. Disable GPIO[10:8] + rtw_write8(Adapter, REG_GPIO_MUXCFG+3, 0x00); + value16 = rtw_read16(Adapter, REG_GPIO_MUXCFG+2) & 0xFF0F; + value8 = (u8) (value16&0x000F); + value16 |= ((value8<<4) | 0x0780); + rtw_write16(Adapter, REG_GPIO_MUXCFG+2, value16); + + //3. Disable LED0 & 1 + rtw_write16(Adapter, REG_LEDCFG0, 0x8080); + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable GPIO and LED.\n")); + +} //end of _DisableGPIO() + +static VOID +_ResetFWDownloadRegister( + IN PADAPTER Adapter + ) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_MCUFWDL); + value32 &= ~(MCUFWDL_EN | MCUFWDL_RDY); + rtw_write32(Adapter, REG_MCUFWDL, value32); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset FW download register.\n")); +} + + +static int +_DisableRF_AFE( + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + u32 pollingCount = 0; + u8 value8; + + //disable RF/ AFE AD/DA + value8 = APSDOFF; + rtw_write8(Adapter, REG_APSD_CTRL, value8); + + +#if (RTL8192CU_ASIC_VERIFICATION) + + do + { + if(rtw_read8(Adapter, REG_APSD_CTRL) & APSDOFF_STATUS){ + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE, AD, DA Done!\n")); + break; + } + + if(pollingCount++ > POLLING_READY_TIMEOUT_COUNT){ + //RT_TRACE(COMP_INIT, DBG_SERIOUS, ("Failed to polling APSDOFF_STATUS done!\n")); + return _FAIL; + } + + }while(_TRUE); + +#endif + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable RF, AFE,AD, DA.\n")); + return rtStatus; + +} + +static VOID +_ResetBB( + IN PADAPTER Adapter + ) +{ + u16 value16; + + //reset BB + value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + value16 &= ~(FEN_BBRSTB | FEN_BB_GLB_RSTn); + rtw_write16(Adapter, REG_SYS_FUNC_EN, value16); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset BB.\n")); +} + +static VOID +_ResetMCU( + IN PADAPTER Adapter + ) +{ + u16 value16; + + // reset MCU + value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + value16 &= ~FEN_CPUEN; + rtw_write16(Adapter, REG_SYS_FUNC_EN, value16); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset MCU.\n")); +} + +static VOID +_DisableMAC_AFE_PLL( + IN PADAPTER Adapter + ) +{ + u32 value32; + + //disable MAC/ AFE PLL + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + value32 |= APDM_MAC; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + + value32 |= APFM_OFF; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable MAC, AFE PLL.\n")); +} + +static VOID +_AutoPowerDownToHostOff( + IN PADAPTER Adapter + ) +{ + u32 value32; + rtw_write8(Adapter, REG_SPS0_CTRL, 0x22); + + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + + value32 |= APDM_HOST;//card disable + rtw_write32(Adapter, REG_APS_FSMCO, value32); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Auto Power Down to Host-off state.\n")); + + // set USB suspend + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + value32 &= ~AFSM_PCIE; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + +} + +static VOID +_SetUsbSuspend( + IN PADAPTER Adapter + ) +{ + u32 value32; + + value32 = rtw_read32(Adapter, REG_APS_FSMCO); + + // set USB suspend + value32 |= AFSM_HSUS; + rtw_write32(Adapter, REG_APS_FSMCO, value32); + + //RT_ASSERT(0 == (rtw_read32(Adapter, REG_APS_FSMCO) & BIT(12)),("")); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Set USB suspend.\n")); + +} + +static VOID +_DisableRFAFEAndResetBB( + IN PADAPTER Adapter + ) +{ +/************************************** +a. TXPAUSE 0x522[7:0] = 0xFF //Pause MAC TX queue +b. RF path 0 offset 0x00 = 0x00 // disable RF +c. APSD_CTRL 0x600[7:0] = 0x40 +d. SYS_FUNC_EN 0x02[7:0] = 0x16 //reset BB state machine +e. SYS_FUNC_EN 0x02[7:0] = 0x14 //reset BB state machine +***************************************/ + u8 eRFPath = 0,value8 = 0; + rtw_write8(Adapter, REG_TXPAUSE, 0xFF); + PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)eRFPath, 0x0, bMaskByte0, 0x0); + + value8 |= APSDOFF; + rtw_write8(Adapter, REG_APSD_CTRL, value8);//0x40 + + value8 = 0 ; + value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn); + rtw_write8(Adapter, REG_SYS_FUNC_EN,value8 );//0x16 + + value8 &=( ~FEN_BB_GLB_RSTn ); + rtw_write8(Adapter, REG_SYS_FUNC_EN, value8); //0x14 + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> RF off and reset BB.\n")); +} + +static VOID +_ResetDigitalProcedure1( + IN PADAPTER Adapter, + IN BOOLEAN bWithoutHWSM + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(pHalData->FirmwareVersion <= 0x20){ + #if 0 + /***************************** + f. SYS_FUNC_EN 0x03[7:0]=0x54 // reset MAC register, DCORE + g. MCUFWDL 0x80[7:0]=0 // reset MCU ready status + ******************************/ + u4Byte value32 = 0; + PlatformIOWrite1Byte(Adapter, REG_SYS_FUNC_EN+1, 0x54); + PlatformIOWrite1Byte(Adapter, REG_MCUFWDL, 0); + #else + /***************************** + f. MCUFWDL 0x80[7:0]=0 // reset MCU ready status + g. SYS_FUNC_EN 0x02[10]= 0 // reset MCU register, (8051 reset) + h. SYS_FUNC_EN 0x02[15-12]= 5 // reset MAC register, DCORE + i. SYS_FUNC_EN 0x02[10]= 1 // enable MCU register, (8051 enable) + ******************************/ + u16 valu16 = 0; + rtw_write8(Adapter, REG_MCUFWDL, 0); + + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 & (~FEN_CPUEN)));//reset MCU ,8051 + + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN)&0x0FFF; + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 |(FEN_HWPDN|FEN_ELDR)));//reset MAC + + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + + + valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN); + rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 | FEN_CPUEN));//enable MCU ,8051 + + + #endif + } + else{ + u8 retry_cnts = 0; + + if(rtw_read8(Adapter, REG_MCUFWDL) & BIT1) + { //IF fw in RAM code, do reset + + rtw_write8(Adapter, REG_MCUFWDL, 0); + if(Adapter->bFWReady){ + // 2010/08/25 MH Accordign to RD alfred's suggestion, we need to disable other + // HRCV INT to influence 8051 reset. + rtw_write8(Adapter, REG_FWIMR, 0x20); + + rtw_write8(Adapter, REG_HMETFR+3, 0x20);//8051 reset by self + + while( (retry_cnts++ <100) && (FEN_CPUEN &rtw_read16(Adapter, REG_SYS_FUNC_EN))) + { + rtw_udelay_os(50);//PlatformStallExecution(50);//us + } + + if(retry_cnts >= 100){ + DBG_8192C("%s #####=> 8051 reset failed!.........................\n", __FUNCTION__); + // if 8051 reset fail we trigger GPIO 0 for LA + //PlatformEFIOWrite4Byte( Adapter, + // REG_GPIO_PIN_CTRL, + // 0x00010100); + // 2010/08/31 MH According to Filen's info, if 8051 reset fail, reset MAC directly. + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x50); //Reset MAC and Enable 8051 + rtw_mdelay_os(10); + } + else { + //DBG_871X("%s =====> 8051 reset success (%d) .\n", __FUNCTION__, retry_cnts); + } + } + else { + DBG_871X("%s =====> 8051 in RAM but !Adapter->bFWReady\n", __FUNCTION__); + } + } + else{ + //DBG_871X("%s =====> 8051 in ROM.\n", __FUNCTION__); + } + + #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE + { + u8 val; + if( (val=rtw_read8(Adapter, REG_MCUFWDL))) + DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val); + } + #endif + + rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x54); //Reset MAC and Enable 8051 + } + + // Clear rpwm value for initial toggle bit trigger. + rtw_write8(Adapter, REG_USB_HRPWM, 0x00); + + if(bWithoutHWSM){ + /***************************** + Without HW auto state machine + g. SYS_CLKR 0x08[15:0] = 0x30A3 //disable MAC clock + h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL + i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK + j. SYS_ISO_CTRL 0x00[7:0] = 0xF9 // isolated digital to PON + ******************************/ + //rtw_write16(Adapter, REG_SYS_CLKR, 0x30A3); + rtw_write16(Adapter, REG_SYS_CLKR, 0x70A3);//modify to 0x70A3 by Scott. + rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x80); + rtw_write16(Adapter, REG_AFE_XTAL_CTRL, 0x880F); + rtw_write8(Adapter, REG_SYS_ISO_CTRL, 0xF9); + } + else + { + // Disable all RF/BB power + rtw_write8(Adapter, REG_RF_CTRL, 0x00); + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Reset Digital.\n")); + +} + +static VOID +_ResetDigitalProcedure2( + IN PADAPTER Adapter +) +{ +/***************************** +k. SYS_FUNC_EN 0x03[7:0] = 0x44 // disable ELDR runction +l. SYS_CLKR 0x08[15:0] = 0x3083 // disable ELDR clock +m. SYS_ISO_CTRL 0x01[7:0] = 0x83 // isolated ELDR to PON +******************************/ + //rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x44);//marked by Scott. + //rtw_write16(Adapter, REG_SYS_CLKR, 0x3083); + //rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x83); + + rtw_write16(Adapter, REG_SYS_CLKR, 0x70a3); //modify to 0x70a3 by Scott. + rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x82); //modify to 0x82 by Scott. +} + +static VOID +_DisableAnalog( + IN PADAPTER Adapter, + IN BOOLEAN bWithoutHWSM + ) +{ + u16 value16 = 0; + u8 value8=0; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(bWithoutHWSM){ + /***************************** + n. LDOA15_CTRL 0x20[7:0] = 0x04 // disable A15 power + o. LDOV12D_CTRL 0x21[7:0] = 0x54 // disable digital core power + r. When driver call disable, the ASIC will turn off remaining clock automatically + ******************************/ + + rtw_write8(Adapter, REG_LDOA15_CTRL, 0x04); + //PlatformIOWrite1Byte(Adapter, REG_LDOV12D_CTRL, 0x54); + + value8 = rtw_read8(Adapter, REG_LDOV12D_CTRL); + value8 &= (~LDV12_EN); + rtw_write8(Adapter, REG_LDOV12D_CTRL, value8); + //RT_TRACE(COMP_INIT, DBG_LOUD, (" REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8)); + } + +/***************************** +h. SPS0_CTRL 0x11[7:0] = 0x23 //enter PFM mode +i. APS_FSMCO 0x04[15:0] = 0x4802 // set USB suspend +******************************/ + + + value8 = 0x23; + if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)) + value8 |= BIT3; + + rtw_write8(Adapter, REG_SPS0_CTRL, value8); + + + if(bWithoutHWSM) + { + //value16 |= (APDM_HOST | /*AFSM_HSUS |*/PFM_ALDN); + // 2010/08/31 According to Filen description, we need to use HW to shut down 8051 automatically. + // Becasue suspend operatione need the asistance of 8051 to wait for 3ms. + value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN); + } + else + { + value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN); + } + + rtw_write16(Adapter, REG_APS_FSMCO,value16 );//0x4802 + + rtw_write8(Adapter, REG_RSV_CTRL, 0x0e); + + #if 0 + //tynli_test for suspend mode. + if(!bWithoutHWSM){ + rtw_write8(Adapter, 0xfe10, 0x19); + } +#endif + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable Analog Reg0x04:0x%04x.\n",value16)); +} + +static int +CardDisableHWSM( // HW Auto state machine + IN PADAPTER Adapter, + IN BOOLEAN resetMCU + ) +{ + int rtStatus = _SUCCESS; + if(Adapter->bSurpriseRemoved){ + return rtStatus; + } +#if 1 + //==== RF Off Sequence ==== + _DisableRFAFEAndResetBB(Adapter); + + // ==== Reset digital sequence ====== + _ResetDigitalProcedure1(Adapter, _FALSE); + + // ==== Pull GPIO PIN to balance level and LED control ====== + _DisableGPIO(Adapter); + + // ==== Disable analog sequence === + _DisableAnalog(Adapter, _FALSE); + + RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("======> Card disable finished.\n")); +#else + _DisableGPIO(Adapter); + + //reset FW download register + _ResetFWDownloadRegister(Adapter); + + + //disable RF/ AFE AD/DA + rtStatus = _DisableRF_AFE(Adapter); + if(RT_STATUS_SUCCESS != rtStatus){ + RT_TRACE(COMP_INIT, DBG_SERIOUS, ("_DisableRF_AFE failed!\n")); + goto Exit; + } + _ResetBB(Adapter); + + if(resetMCU){ + _ResetMCU(Adapter); + } + + _AutoPowerDownToHostOff(Adapter); + //_DisableMAC_AFE_PLL(Adapter); + + _SetUsbSuspend(Adapter); +Exit: +#endif + return rtStatus; + +} + +static int +CardDisableWithoutHWSM( // without HW Auto state machine + IN PADAPTER Adapter + ) +{ + int rtStatus = _SUCCESS; + + if(Adapter->bSurpriseRemoved){ + return rtStatus; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Card Disable Without HWSM .\n")); + //==== RF Off Sequence ==== + _DisableRFAFEAndResetBB(Adapter); + + // ==== Reset digital sequence ====== + _ResetDigitalProcedure1(Adapter, _TRUE); + + // ==== Pull GPIO PIN to balance level and LED control ====== + _DisableGPIO(Adapter); + + // ==== Reset digital sequence ====== + _ResetDigitalProcedure2(Adapter); + + // ==== Disable analog sequence === + _DisableAnalog(Adapter, _TRUE); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("<====== Card Disable Without HWSM .\n")); + return rtStatus; +} + +static void rtl8192cu_hw_power_down(_adapter *padapter) +{ + // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. + // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. + + // Enable register area 0x0-0xc. + rtw_write8(padapter,REG_RSV_CTRL, 0x0); + rtw_write16(padapter, REG_APS_FSMCO, 0x8812); +} + +u32 rtl8192cu_hal_deinit(PADAPTER Adapter) + { + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + DBG_8192C("==> %s \n",__FUNCTION__); + // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in + // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all + // IC. Accord to johnny's opinion, only RU need the support. + if (IS_HARDWARE_TYPE_8192C(Adapter) && (pHalData->BoardType == BOARD_USB_High_PA)) + rtw_write32(Adapter, rFPGA0_XCD_RFParameter, rtw_read32(Adapter, rFPGA0_XCD_RFParameter)|BIT1); + + #ifdef SUPPORT_HW_RFOFF_DETECTED + DBG_8192C("bkeepfwalive(%x)\n",Adapter->pwrctrlpriv.bkeepfwalive); + if(Adapter->pwrctrlpriv.bkeepfwalive) + { + _ps_close_RF(Adapter); + if((Adapter->pwrctrlpriv.bHWPwrPindetect) && (Adapter->pwrctrlpriv.bHWPowerdown)) + rtl8192cu_hw_power_down(Adapter); + } + else +#endif + { + if( Adapter->bCardDisableWOHSM == _FALSE) + { + DBG_8192C("card disble HWSM...........\n"); + CardDisableHWSM(Adapter, _FALSE); + } + else + { + DBG_8192C("card disble without HWSM...........\n"); + CardDisableWithoutHWSM(Adapter); // without HW Auto state machine + + if((Adapter->pwrctrlpriv.bHWPwrPindetect ) && (Adapter->pwrctrlpriv.bHWPowerdown)) + rtl8192cu_hw_power_down(Adapter); + } + } + + return _SUCCESS; + } + + +unsigned int rtl8192cu_inirp_init(PADAPTER Adapter) +{ + u8 i; + struct recv_buf *precvbuf; + uint status; + struct dvobj_priv *pdev=&Adapter->dvobjpriv; + struct intf_hdl * pintfhdl=&Adapter->iopriv.intf; + struct recv_priv *precvpriv = &(Adapter->recvpriv); + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); +#endif + +_func_enter_; + + _read_port = pintfhdl->io_ops._read_port; + + status = _SUCCESS; + + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("===> usb_inirp_init \n")); + + precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR; + + //issue Rx irp to receive data + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + for(i=0; iff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE ) + { + RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_port error \n")); + status = _FAIL; + goto exit; + } + + precvbuf++; + precvpriv->free_recv_buf_queue_cnt--; + } + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + _read_interrupt = pintfhdl->io_ops._read_interrupt; + if(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE ) + { + RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_interrupt error \n")); + status = _FAIL; + } +#endif + +exit: + + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("<=== usb_inirp_init \n")); + +_func_exit_; + + return status; + +} + +unsigned int rtl8192cu_inirp_deinit(PADAPTER Adapter) +{ + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n ===> usb_rx_deinit \n")); + + rtw_read_port_cancel(Adapter); + + RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n <=== usb_rx_deinit \n")); + + return _SUCCESS; +} + +//------------------------------------------------------------------------- +// +// Channel Plan +// +//------------------------------------------------------------------------- + +static VOID +ReadChannelPlan( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + +#define EEPROM_TEST_CHANNEL_PLAN (0x7D) +#define EEPROM_NORMAL_CHANNEL_PLAN (0x75) + + struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); + struct registry_priv *pregistrypriv = &Adapter->registrypriv; + u8 channelPlan; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(AutoLoadFail){ + channelPlan = CHPL_FCC; + } + else{ + if(IS_NORMAL_CHIP(pHalData->VersionID)) + channelPlan = PROMContent[EEPROM_NORMAL_CHANNEL_PLAN]; + else + channelPlan = PROMContent[EEPROM_TEST_CHANNEL_PLAN]; + } + + if((pregistrypriv->channel_plan>= RT_CHANNEL_DOMAIN_MAX) || (channelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)) + { + pmlmepriv->ChannelPlan = _HalMapChannelPlan8192C(Adapter, (channelPlan & (~(EEPROM_CHANNEL_PLAN_BY_HW_MASK)))); + //pMgntInfo->bChnlPlanFromHW = (channelPlan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) ? _TRUE : _FALSE; // User cannot change channel plan. + } + else + { + pmlmepriv->ChannelPlan = (RT_CHANNEL_DOMAIN)pregistrypriv->channel_plan; + } + +#if 0 //todo: + switch(pMgntInfo->ChannelPlan) + { + case RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN: + { + PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(pMgntInfo); + + pDot11dInfo->bEnabled = _TRUE; + } + //RT_TRACE(COMP_INIT, DBG_LOUD, ("Enable dot11d when RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN!\n")); + break; + } +#endif + + //RT_TRACE(COMP_INIT, DBG_LOUD, ("RegChannelPlan(%d) EEPROMChannelPlan(%ld)", pMgntInfo->RegChannelPlan, (u4Byte)channelPlan)); + //RT_TRACE(COMP_INIT, DBG_LOUD, ("ChannelPlan = %d\n" , pMgntInfo->ChannelPlan)); + + MSG_8192C("RT_ChannelPlan: 0x%02x\n", pmlmepriv->ChannelPlan); + +} + + +//------------------------------------------------------------------------- +// +// EEPROM Power index mapping +// +//------------------------------------------------------------------------- + + static VOID +_ReadPowerValueFromPROM( + IN PTxPowerInfo pwrInfo, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + u32 rfPath, eeAddr, group; + + _rtw_memset(pwrInfo, 0, sizeof(TxPowerInfo)); + + if(AutoLoadFail){ + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + pwrInfo->CCKIndex[rfPath][group] = EEPROM_Default_TxPowerLevel; + pwrInfo->HT40_1SIndex[rfPath][group] = EEPROM_Default_TxPowerLevel; + pwrInfo->HT40_2SIndexDiff[rfPath][group]= EEPROM_Default_HT40_2SDiff; + pwrInfo->HT20IndexDiff[rfPath][group] = EEPROM_Default_HT20_Diff; + pwrInfo->OFDMIndexDiff[rfPath][group] = EEPROM_Default_LegacyHTTxPowerDiff; + pwrInfo->HT40MaxOffset[rfPath][group] = EEPROM_Default_HT40_PwrMaxOffset; + pwrInfo->HT20MaxOffset[rfPath][group] = EEPROM_Default_HT20_PwrMaxOffset; + } + } + + pwrInfo->TSSI_A = EEPROM_Default_TSSI; + pwrInfo->TSSI_B = EEPROM_Default_TSSI; + + return; + } + + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ + eeAddr = EEPROM_CCK_TX_PWR_INX + (rfPath * 3) + group; + pwrInfo->CCKIndex[rfPath][group] = PROMContent[eeAddr]; + + eeAddr = EEPROM_HT40_1S_TX_PWR_INX + (rfPath * 3) + group; + pwrInfo->HT40_1SIndex[rfPath][group] = PROMContent[eeAddr]; + } + } + + for(group = 0 ; group < CHANNEL_GROUP_MAX ; group++){ + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + pwrInfo->HT40_2SIndexDiff[rfPath][group] = + (PROMContent[EEPROM_HT40_2S_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; + +#if 1 + pwrInfo->HT20IndexDiff[rfPath][group] = + (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; + if(pwrInfo->HT20IndexDiff[rfPath][group] & BIT3) //4bit sign number to 8 bit sign number + pwrInfo->HT20IndexDiff[rfPath][group] |= 0xF0; +#else + pwrInfo->HT20IndexDiff[rfPath][group] = + (PROMContent[EEPROM_HT20_TX_PWR_INX_DIFF + group] >> (rfPath * 4)) & 0xF; +#endif + + pwrInfo->OFDMIndexDiff[rfPath][group] = + (PROMContent[EEPROM_OFDM_TX_PWR_INX_DIFF+ group] >> (rfPath * 4)) & 0xF; + + pwrInfo->HT40MaxOffset[rfPath][group] = + (PROMContent[EEPROM_HT40_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF; + + pwrInfo->HT20MaxOffset[rfPath][group] = + (PROMContent[EEPROM_HT20_MAX_PWR_OFFSET+ group] >> (rfPath * 4)) & 0xF; + } + } + + pwrInfo->TSSI_A = PROMContent[EEPROM_TSSI_A]; + pwrInfo->TSSI_B = PROMContent[EEPROM_TSSI_B]; + +} + + +static u32 +_GetChannelGroup( + IN u32 channel + ) +{ + //RT_ASSERT((channel < 14), ("Channel %d no is supported!\n")); + + if(channel < 3){ // Channel 1~3 + return 0; + } + else if(channel < 9){ // Channel 4~9 + return 1; + } + + return 2; // Channel 10~14 +} + + +static VOID +ReadTxPowerInfo( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoLoadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + TxPowerInfo pwrInfo; + u32 rfPath, ch, group; + u8 pwr, diff; + + _ReadPowerValueFromPROM(&pwrInfo, PROMContent, AutoLoadFail); + + if(!AutoLoadFail) + pHalData->bTXPowerDataReadFromEEPORM = _TRUE; + + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + group = _GetChannelGroup(ch); + + pHalData->TxPwrLevelCck[rfPath][ch] = pwrInfo.CCKIndex[rfPath][group]; + pHalData->TxPwrLevelHT40_1S[rfPath][ch] = pwrInfo.HT40_1SIndex[rfPath][group]; + + pHalData->TxPwrHt20Diff[rfPath][ch] = pwrInfo.HT20IndexDiff[rfPath][group]; + pHalData->TxPwrLegacyHtDiff[rfPath][ch] = pwrInfo.OFDMIndexDiff[rfPath][group]; + pHalData->PwrGroupHT20[rfPath][ch] = pwrInfo.HT20MaxOffset[rfPath][group]; + pHalData->PwrGroupHT40[rfPath][ch] = pwrInfo.HT40MaxOffset[rfPath][group]; + + pwr = pwrInfo.HT40_1SIndex[rfPath][group]; + diff = pwrInfo.HT40_2SIndexDiff[rfPath][group]; + + pHalData->TxPwrLevelHT40_2S[rfPath][ch] = (pwr > diff) ? (pwr - diff) : 0; + } + } + +#if DBG + + for(rfPath = 0 ; rfPath < RF90_PATH_MAX ; rfPath++){ + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, + ("RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n", + rfPath, ch, pHalData->TxPwrLevelCck[rfPath][ch], + pHalData->TxPwrLevelHT40_1S[rfPath][ch], + pHalData->TxPwrLevelHT40_2S[rfPath][ch])); + + } + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF90_PATH_A][ch])); + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF90_PATH_A][ch])); + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrHt20Diff[RF90_PATH_B][ch])); + } + + for(ch = 0 ; ch < CHANNEL_MAX_NUMBER ; ch++){ + RTPRINT(FINIT, INIT_TxPower, ("RF-B Legacy to HT40 Diff[%d] = 0x%x\n", ch, pHalData->TxPwrLegacyHtDiff[RF90_PATH_B][ch])); + } + +#endif + // 2010/10/19 MH Add Regulator recognize for CU. + if(!AutoLoadFail) + { + pHalData->EEPROMRegulatory = (PROMContent[RF_OPTION1]&0x7); //bit0~2 + } + else + { + pHalData->EEPROMRegulatory = 0; + } + DBG_8192C("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); + +} + + +//------------------------------------------------------------------- +// +// EEPROM/EFUSE Content Parsing +// +//------------------------------------------------------------------- +static void +_ReadIDs( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(_FALSE == AutoloadFail){ + // VID, PID + pHalData->EEPROMVID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_VID]); + pHalData->EEPROMPID = le16_to_cpu( *(u16 *)&PROMContent[EEPROM_PID]); + + // Customer ID, 0x00 and 0xff are reserved for Realtek. + pHalData->EEPROMCustomerID = *(u8 *)&PROMContent[EEPROM_CUSTOMER_ID]; + pHalData->EEPROMSubCustomerID = *(u8 *)&PROMContent[EEPROM_SUBCUSTOMER_ID]; + + } + else{ + pHalData->EEPROMVID = EEPROM_Default_VID; + pHalData->EEPROMPID = EEPROM_Default_PID; + + // Customer ID, 0x00 and 0xff are reserved for Realtek. + pHalData->EEPROMCustomerID = EEPROM_Default_CustomerID; + pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; + + } + + // For customized behavior. + if((pHalData->EEPROMVID == 0x103C) && (pHalData->EEPROMVID == 0x1629))// HP Lite-On for RTL8188CUS Slim Combo. + pHalData->CustomerID = RT_CID_819x_HP; + + // Decide CustomerID according to VID/DID or EEPROM + switch(pHalData->EEPROMCustomerID) + { + case EEPROM_CID_DEFAULT: + if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308)) + pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309)) + pHalData->CustomerID = RT_CID_DLINK; + else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a)) + pHalData->CustomerID = RT_CID_DLINK; + break; + case EEPROM_CID_WHQL: +/* + Adapter->bInHctTest = TRUE; + + pMgntInfo->bSupportTurboMode = FALSE; + pMgntInfo->bAutoTurboBy8186 = FALSE; + + pMgntInfo->PowerSaveControl.bInactivePs = FALSE; + pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE; + pMgntInfo->PowerSaveControl.bLeisurePs = FALSE; + + pMgntInfo->keepAliveLevel = 0; + + Adapter->bUnloadDriverwhenS3S4 = FALSE; +*/ + break; + default: + pHalData->CustomerID = RT_CID_DEFAULT; + break; + + } + + MSG_8192C("EEPROMVID = 0x%04x\n", pHalData->EEPROMVID); + MSG_8192C("EEPROMPID = 0x%04x\n", pHalData->EEPROMPID); + MSG_8192C("EEPROMCustomerID : 0x%02x\n", pHalData->EEPROMCustomerID); + MSG_8192C("EEPROMSubCustomerID: 0x%02x\n", pHalData->EEPROMSubCustomerID); + + MSG_8192C("RT_CustomerID: 0x%02x\n", pHalData->CustomerID); + +} + + +static VOID +_ReadMACAddress( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + + if(_FALSE == AutoloadFail){ + //Read Permanent MAC address and set value to hardware + _rtw_memcpy(pEEPROM->mac_addr, &PROMContent[EEPROM_MAC_ADDR], ETH_ALEN); + } + else{ + //Random assigh MAC address + u8 sMacAddr[MAC_ADDR_LEN] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00}; + //sMacAddr[5] = (u8)GetRandomNumber(1, 254); + _rtw_memcpy(pEEPROM->mac_addr, sMacAddr, ETH_ALEN); + } + DBG_8192C("%s MAC Address from EFUSE = "MAC_FMT"\n",__FUNCTION__, MAC_ARG(pEEPROM->mac_addr)); + //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress); + //RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "MAC Addr: %s", Adapter->PermanentAddress); + +} + +static VOID +_ReadBoardType( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + BOOLEAN isNormal = IS_NORMAL_CHIP(pHalData->VersionID); + u32 value32; + u8 boardType = BOARD_USB_DONGLE; +#if 0 + if(isNormal) + { + value32 = rtw_read32(Adapter, REG_HPON_FSM); + + DBG_8192C("first value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); + + if(!IS_92C_SERIAL(pHalData->VersionID)) + { + if(CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_88C_USB_MCARD) + { + pHalData->BoardType = BOARD_MINICARD; + DBG_8192C("value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); + } + else if(CHIP_BONDING_IDENTIFIER(value32) == CHIP_BONDING_88C_USB_HP) + { + pHalData->BoardType = BOARD_USB_High_PA; + DBG_8192C("value 0x%x BoardType after 0x%x \n", CHIP_BONDING_IDENTIFIER(value32), pHalData->BoardType); + } + } + } +#endif + + if(AutoloadFail){ + if(IS_8723_SERIES(pHalData->VersionID)) + pHalData->rf_type = RF_1T1R; + else + pHalData->rf_type = RF_2T2R; + + pHalData->BluetoothCoexist = _FALSE; + pHalData->BoardType = boardType; + return; + } + + if(isNormal) + { + boardType = PROMContent[EEPROM_NORMAL_BoardType]; + boardType &= BOARD_TYPE_NORMAL_MASK;//bit[7:5] + boardType >>= 5; + } + else + { + boardType = PROMContent[EEPROM_RF_OPT4]; + boardType &= BOARD_TYPE_TEST_MASK; + } + + pHalData->BoardType = boardType; + MSG_8192C("_ReadBoardType(%x)\n",pHalData->BoardType); + + if (boardType == BOARD_USB_High_PA) + pHalData->ExternalPA = 1; +} + + +static VOID +_ReadLEDSetting( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + struct led_priv *pledpriv = &(Adapter->ledpriv); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); +#ifdef CONFIG_SW_LED + pledpriv->bRegUseLed = _TRUE; + + // + // Led mode + // + switch(pHalData->CustomerID) + { + case RT_CID_DEFAULT: + pledpriv->LedStrategy = SW_LED_MODE1; + pledpriv->bRegUseLed = _TRUE; + break; + + case RT_CID_819x_HP: + pledpriv->LedStrategy = SW_LED_MODE6; + break; + + default: + pledpriv->LedStrategy = SW_LED_MODE1; + break; + } + + if( BOARD_MINICARD == pHalData->BoardType ) + { + pledpriv->LedStrategy = SW_LED_MODE6; + } + pHalData->bLedOpenDrain = _TRUE;// Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. +#else // HW LED + pledpriv->LedStrategy = HW_LED; +#endif //CONFIG_SW_LED +} + +static VOID +_ReadThermalMeter( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 tempval; + + // + // ThermalMeter from EEPROM + // + if(!AutoloadFail) + tempval = PROMContent[EEPROM_THERMAL_METER]; + else + tempval = EEPROM_Default_ThermalMeter; + + pHalData->EEPROMThermalMeter = (tempval&0x1f); //[4:0] + + if(pHalData->EEPROMThermalMeter == 0x1f || AutoloadFail) + pdmpriv->bAPKThermalMeterIgnore = _TRUE; + +#if 0 + if(pHalData->EEPROMThermalMeter < 0x06 || pHalData->EEPROMThermalMeter > 0x1c) + pHalData->EEPROMThermalMeter = 0x12; +#endif + + pdmpriv->ThermalMeter[0] = pHalData->EEPROMThermalMeter; + + //RTPRINT(FINIT, INIT_TxPower, ("ThermalMeter = 0x%x\n", pHalData->EEPROMThermalMeter)); + +} + +static VOID +_ReadRFSetting( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ +} + +static void +_ReadPROMVersion( + IN PADAPTER Adapter, + IN u8* PROMContent, + IN BOOLEAN AutoloadFail + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + if(AutoloadFail){ + pHalData->EEPROMVersion = EEPROM_Default_Version; + } + else{ + pHalData->EEPROMVersion = *(u8 *)&PROMContent[EEPROM_VERSION]; + } +} + +static VOID +readAntennaDiversity( + IN PADAPTER pAdapter, + IN u8 *hwinfo, + IN BOOLEAN AutoLoadFail + ) +{ + + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + struct registry_priv *registry_par = &pAdapter->registrypriv; + + if(!AutoLoadFail) + { + // Antenna Diversity setting. + if(registry_par->antdiv_cfg == 2) // 2: From Efuse + pHalData->AntDivCfg = (hwinfo[EEPROM_RF_OPT1]&0x18)>>3; + else + pHalData->AntDivCfg = registry_par->antdiv_cfg ; // 0:OFF , 1:ON, + + DBG_8192C("### AntDivCfg(%x)\n",pHalData->AntDivCfg); + + //if(pHalData->EEPROMBluetoothCoexist!=0 && pHalData->EEPROMBluetoothAntNum==Ant_x1) + // pHalData->AntDivCfg = 0; + } + else + { + pHalData->AntDivCfg = 0; + } + +} + +static VOID +hal_InitPGData( + IN PADAPTER pAdapter, + IN OUT u8 *PROMContent + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(pAdapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + u32 i; + u16 value16; + + if(_FALSE == pEEPROM->bautoload_fail_flag) + { // autoload OK. + if (_TRUE == pEEPROM->EepromOrEfuse) + { + // Read all Content from EEPROM or EFUSE. + for(i = 0; i < HWSET_MAX_SIZE; i += 2) + { + //value16 = EF2Byte(ReadEEprom(pAdapter, (u2Byte) (i>>1))); + //*((u16 *)(&PROMContent[i])) = value16; + } + } + else + { + // Read EFUSE real map to shadow. + EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE); + _rtw_memcpy((void*)PROMContent, (void*)pEEPROM->efuse_eeprom_data, HWSET_MAX_SIZE); + } + } + else + {//autoload fail + //RT_TRACE(COMP_INIT, DBG_LOUD, ("AutoLoad Fail reported from CR9346!!\n")); + pEEPROM->bautoload_fail_flag = _TRUE; + //update to default value 0xFF + if (_FALSE == pEEPROM->EepromOrEfuse) + EFUSE_ShadowMapUpdate(pAdapter, EFUSE_WIFI, _FALSE); + } +} +// Read HW power down mode selection +static void _ReadPSSetting(IN PADAPTER Adapter,IN u8*PROMContent,IN u8 AutoloadFail) +{ + if(AutoloadFail){ + Adapter->pwrctrlpriv.bHWPowerdown = _FALSE; + Adapter->pwrctrlpriv.bSupportRemoteWakeup = _FALSE; + } + else { + //if(SUPPORT_HW_RADIO_DETECT(Adapter)) + Adapter->pwrctrlpriv.bHWPwrPindetect = Adapter->registrypriv.hwpwrp_detect; + //else + //Adapter->pwrctrlpriv.bHWPwrPindetect = _FALSE;//dongle not support new + + + //hw power down mode selection , 0:rf-off / 1:power down + + if(Adapter->registrypriv.hwpdn_mode==2) + Adapter->pwrctrlpriv.bHWPowerdown = (PROMContent[EEPROM_RF_OPT3] & BIT4); + else + Adapter->pwrctrlpriv.bHWPowerdown = Adapter->registrypriv.hwpdn_mode; + + // decide hw if support remote wakeup function + // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume + Adapter->pwrctrlpriv.bSupportRemoteWakeup = (PROMContent[EEPROM_TEST_USB_OPT] & BIT1)?_TRUE :_FALSE; + + //if(SUPPORT_HW_RADIO_DETECT(Adapter)) + //Adapter->registrypriv.usbss_enable = Adapter->pwrctrlpriv.bSupportRemoteWakeup ; + + DBG_8192C("%s...bHWPwrPindetect(%x)-bHWPowerdown(%x) ,bSupportRemoteWakeup(%x)\n",__FUNCTION__, + Adapter->pwrctrlpriv.bHWPwrPindetect,Adapter->pwrctrlpriv.bHWPowerdown ,Adapter->pwrctrlpriv.bSupportRemoteWakeup); + + DBG_8192C("### PS params=> power_mgnt(%x),usbss_enable(%x) ###\n",Adapter->registrypriv.power_mgnt,Adapter->registrypriv.usbss_enable); + + } + +} + +static VOID +readAdapterInfo_8192CU( + IN PADAPTER Adapter + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); + u8 PROMContent[HWSET_MAX_SIZE]={0}; + + hal_InitPGData(Adapter, PROMContent); + rtl8192c_EfuseParseIDCode(Adapter, PROMContent); + + _ReadPROMVersion(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadIDs(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadMACAddress(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + ReadTxPowerInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadBoardType(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + +#ifdef CONFIG_BT_COEXIST + // + // Read Bluetooth co-exist and initialize + // + rtl8192c_ReadBluetoothCoexistInfo(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); +#endif + + ReadChannelPlan(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadThermalMeter(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadLEDSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadRFSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + _ReadPSSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + readAntennaDiversity(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); + + //hal_CustomizedBehavior_8723U(Adapter); + + Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1; + DBG_8192C("%s(): REPLACEMENT = %x\n",__FUNCTION__,Adapter->bDongle); +} + +static void _ReadPROMContent( + IN PADAPTER Adapter + ) +{ + EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 PROMContent[HWSET_MAX_SIZE]={0}; + u8 eeValue; + u32 i; + u16 value16; + + eeValue = rtw_read8(Adapter, REG_9346CR); + // To check system boot selection. + pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; + pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE; + + + DBG_8192C("Boot from %s, Autoload %s !\n", (pEEPROM->EepromOrEfuse ? "EEPROM" : "EFUSE"), + (pEEPROM->bautoload_fail_flag ? "Fail" : "OK") ); + + //pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE; + + //if(IS_HARDWARE_TYPE_8723(Adapter)) + // readAdapterInfo_8723U(Adapter); + //else + readAdapterInfo_8192CU(Adapter); +} + + +static VOID +_InitOtherVariable( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + + //if(Adapter->bInHctTest){ + // pMgntInfo->PowerSaveControl.bInactivePs = FALSE; + // pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE; + // pMgntInfo->PowerSaveControl.bLeisurePs = FALSE; + // pMgntInfo->keepAliveLevel = 0; + //} + + // 2009/06/10 MH For 92S 1*1=1R/ 1*2&2*2 use 2R. We default set 1*1 use radio A + // So if you want to use radio B. Please modify RF path enable bit for correct signal + // strength calculate. + if (pHalData->rf_type == RF_1T1R){ + pHalData->bRFPathRxEnable[0] = _TRUE; + } + else{ + pHalData->bRFPathRxEnable[0] = pHalData->bRFPathRxEnable[1] = _TRUE; + } + +} + +static VOID +_ReadRFType( + IN PADAPTER Adapter + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + +#if DISABLE_BB_RF + pHalData->rf_chip = RF_PSEUDO_11N; +#else + pHalData->rf_chip = RF_6052; +#endif +} + +void _ReadSilmComboMode(PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + + pHalData->SlimComboDbg = _FALSE; // Default is not debug mode. + + // 2010/11/22 MH We need to enter debug mode for TSMA and UMC A cut + if ((Adapter->chip_type == RTL8188C_8192C) && + (pHalData->BoardType == BOARD_USB_COMBO)) + { + switch (pHalData->VersionID) + { + case VERSION_NORMAL_TSMC_CHIP_88C: + case VERSION_NORMAL_TSMC_CHIP_92C: + case VERSION_NORMAL_TSMC_CHIP_92C_1T2R: + case VERSION_NORMAL_UMC_CHIP_88C_A_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_A_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT: + if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20) + pHalData->SlimComboDbg = _TRUE; + + break; + + case VERSION_NORMAL_UMC_CHIP_88C_B_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_B_CUT: + case VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT: + // 2011/02/15 MH UNC-B cut ECO fail, we need to support slim combo debug mode. + if ((rtw_read8(Adapter, REG_SYS_CFG+3) &0xF0) == 0x20) + pHalData->SlimComboDbg = _TRUE; + break; + + default: + break; + } + + } + +} +static int _ReadAdapterInfo8192CU(PADAPTER Adapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u32 start=rtw_get_current_time(); + + MSG_8192C("====> ReadAdapterInfo8192C\n"); + + //Efuse_InitSomeVar(Adapter); + + //if(IS_HARDWARE_TYPE_8723(Adapter)) + // _EfuseCellSel(Adapter); + + _ReadRFType(Adapter);//rf_chip -> _InitRFType() + _ReadPROMContent(Adapter); + + // 2010/10/25 MH THe function must be called after borad_type & IC-Version recognize. + _ReadSilmComboMode(Adapter); + + _InitOtherVariable(Adapter); + + //MSG_8192C("%s()(done), rf_chip=0x%x, rf_type=0x%x\n", __FUNCTION__, pHalData->rf_chip, pHalData->rf_type); + + MSG_8192C("<==== ReadAdapterInfo8192C in %d ms\n", rtw_get_passing_time_ms(start)); + + return _SUCCESS; +} + + +static void ReadAdapterInfo8192CU(PADAPTER Adapter) +{ + // Read EEPROM size before call any EEPROM function + //Adapter->EepromAddressSize=Adapter->HalFunc.GetEEPROMSizeHandler(Adapter); + Adapter->EepromAddressSize = GetEEPROMSize8192C(Adapter); + + _ReadAdapterInfo8192CU(Adapter); +} + + +#define GPIO_DEBUG_PORT_NUM 0 +static void rtl8192cu_trigger_gpio_0(_adapter *padapter) +{ + + u32 gpioctrl; + DBG_8192C("==> trigger_gpio_0...\n"); + rtw_write16_async(padapter,REG_GPIO_PIN_CTRL,0); + rtw_write8_async(padapter,REG_GPIO_PIN_CTRL+2,0xFF); + gpioctrl = (BIT(GPIO_DEBUG_PORT_NUM)<<24 )|(BIT(GPIO_DEBUG_PORT_NUM)<<16); + rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl); + gpioctrl |= (BIT(GPIO_DEBUG_PORT_NUM)<<8); + rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl); + DBG_8192C("<=== trigger_gpio_0...\n"); + +} + +static void ResumeTxBeacon(_adapter *padapter) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter); + + // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value + // which should be read from register to a global variable. + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6); + pHalData->RegFwHwTxQCtrl |= BIT6; + rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0xff); + pHalData->RegReg542 |= BIT0; + rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542); + } + else + { + pHalData->RegTxPause = rtw_read8(padapter, REG_TXPAUSE); + rtw_write8(padapter, REG_TXPAUSE, pHalData->RegTxPause & (~BIT6)); + } + +} + +static void StopTxBeacon(_adapter *padapter) +{ + HAL_DATA_TYPE* pHalData = GET_HAL_DATA(padapter); + + // 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value + // which should be read from register to a global variable. + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6)); + pHalData->RegFwHwTxQCtrl &= (~BIT6); + rtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0x64); + pHalData->RegReg542 &= ~(BIT0); + rtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542); + } + else + { + pHalData->RegTxPause = rtw_read8(padapter, REG_TXPAUSE); + rtw_write8(padapter, REG_TXPAUSE, pHalData->RegTxPause | BIT6); + } + + //todo: CheckFwRsvdPageContent(Adapter); // 2010.06.23. Added by tynli. + +} + + +void SetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + +_func_enter_; + + switch(variable) + { + case HW_VAR_MEDIA_STATUS: + { + u8 val8; + + val8 = rtw_read8(Adapter, MSR)&0x0c; + val8 |= *((u8 *)val); + rtw_write8(Adapter, MSR, val8); + } + break; + case HW_VAR_MEDIA_STATUS1: + { + u8 val8; + + val8 = rtw_read8(Adapter, MSR)&0x03; + val8 |= *((u8 *)val) <<2; + rtw_write8(Adapter, MSR, val8); + } + break; + case HW_VAR_SET_OPMODE: + { + u8 val8; + u8 mode = *((u8 *)val); + + if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) + { + StopTxBeacon(Adapter); + rtw_write8(Adapter,REG_BCN_CTRL, 0x18); + } + else if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/) + { + ResumeTxBeacon(Adapter); + rtw_write8(Adapter,REG_BCN_CTRL, 0x1a); + } + else if(mode == _HW_STATE_AP_) + { + ResumeTxBeacon(Adapter); + + rtw_write8(Adapter, REG_BCN_CTRL, 0x12); + + + //Set RCR + //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0 + rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0 + //enable to rx data frame + rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); + //enable to rx ps-poll + rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400); + + //Beacon Control related register for first time + rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms + rtw_write8(Adapter, REG_DRVERLYINT, 0x05);// 5ms + //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); + rtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms + rtw_write16(Adapter, REG_BCNTCFG, 0x00); + rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0x6404); + + //reset TSF + rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); + + //enable TSF Function for if1 + rtw_write8(Adapter, REG_BCN_CTRL, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); + + //enable update TSF for if1 + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + + } + + val8 = rtw_read8(Adapter, MSR)&0x0c; + val8 |= mode; + rtw_write8(Adapter, MSR, val8); + } + break; + case HW_VAR_BSSID: + { + u8 idx = 0; + for(idx = 0 ; idx < 6; idx++) + { + rtw_write8(Adapter, (REG_BSSID+idx), val[idx]); + } + } + break; + case HW_VAR_BASIC_RATE: + { + u16 BrateCfg = 0; + u8 RateIndex = 0; + + // 2007.01.16, by Emily + // Select RRSR (in Legacy-OFDM and CCK) + // For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate. + // We do not use other rates. + rtl8192c_HalSetBrateCfg( Adapter, val, &BrateCfg ); + + //2011.03.30 add by Luke Lee + //CCK 2M ACK should be disabled for some BCM and Atheros AP IOT + //because CCK 2M has poor TXEVM + //CCK 5.5M & 11M ACK should be enabled for better performance + + pHalData->BasicRateSet = BrateCfg = (BrateCfg |0xd) & 0x15d; + + BrateCfg |= 0x01; // default enable 1M ACK rate + + DBG_8192C("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg); + + // Set RRSR rate table. + rtw_write8(Adapter, REG_RRSR, BrateCfg&0xff); + rtw_write8(Adapter, REG_RRSR+1, (BrateCfg>>8)&0xff); + + // Set RTS initial rate + while(BrateCfg > 0x1) + { + BrateCfg = (BrateCfg>> 1); + RateIndex++; + } + // Ziv - Check + rtw_write8(Adapter, REG_INIRTS_RATE_SEL, RateIndex); + } + break; + case HW_VAR_TXPAUSE: + rtw_write8(Adapter, REG_TXPAUSE, *((u8 *)val)); + break; + case HW_VAR_BCN_FUNC: + if(*((u8 *)val)) + { + rtw_write8(Adapter, REG_BCN_CTRL, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(EN_BCN_FUNCTION | EN_TXBCN_RPT))); + } + break; + case HW_VAR_CORRECT_TSF: + { + u64 tsf; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us + tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause |= STOP_BCNQ;BIT(6) + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6))); + StopTxBeacon(Adapter); + } + + //disable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3))); + + rtw_write32(Adapter, REG_TSFTR, tsf); + rtw_write32(Adapter, REG_TSFTR+4, tsf>>32); + + //enable related TSF function + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3)); + + + if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) + { + //pHalData->RegTxPause &= (~STOP_BCNQ); + //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6)))); + ResumeTxBeacon(Adapter); + } + } + break; + case HW_VAR_CHECK_BSSID: + if(*((u8 *)val)) + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); + } + else + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); + } + } + else + { + u32 val32; + + val32 = rtw_read32(Adapter, REG_RCR); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + val32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN); + } + else + { + val32 &= 0xfffff7bf; + } + + rtw_write32(Adapter, REG_RCR, val32); + } + break; + case HW_VAR_MLME_DISCONNECT: + { + //Set RCR to not to receive data frame when NO LINK state + //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR) & ~RCR_ADF); + //reject all data frames + rtw_write16(Adapter, REG_RXFLTMAP2,0x00); + + //reset TSF + rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); + + //disable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); + } + } + break; + case HW_VAR_MLME_SITESURVEY: + if(*((u8 *)val))//under sitesurvey + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + //config RCR to receive different BSSID & not to receive data frame + //pHalData->ReceiveConfig &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); + u32 v = rtw_read32(Adapter, REG_RCR); + v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF + rtw_write32(Adapter, REG_RCR, v); + //reject all data frame + rtw_write16(Adapter, REG_RXFLTMAP2,0x00); + + //disable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); + } + else + { + //config RCR to receive different BSSID & not to receive data frame + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) & 0xfffff7bf); + + + //disable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)|BIT(5)); + } + } + else//sitesurvey done + { + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + if ((is_client_associated_to_ap(Adapter) == _TRUE) || + ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) ) + { + //enable to rx data frame + //rtw_write32(Adapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); + + //enable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + } + else + { + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + } + else if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_ADF); + + //enable update TSF + if(IS_NORMAL_CHIP(pHalData->VersionID)) + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + else + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN); + else + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); + } + else + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); + } + } + break; + case HW_VAR_MLME_JOIN: + { + u8 RetryLimit = 0x30; + u8 type = *((u8 *)val); + struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; + + if(type == 0) // prepare to join + { + //enable to rx data frame.Accept all data frame + //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); + rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); + + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); + } + else + { + rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA); + } + + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) + { + RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; + } + else // Ad-hoc Mode + { + RetryLimit = 0x7; + } + } + else if(type == 1) //joinbss_event call back when join res < 0 + { + //if(IS_NORMAL_CHIP(pHalData->VersionID)) + //{ + //config RCR to receive different BSSID & not to receive data frame during linking + // u32 v = rtw_read32(Adapter, REG_RCR); + // v &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF + // rtw_write32(Adapter, REG_RCR, v); + //} + //else + //{ + //config RCR to receive different BSSID & not to receive data frame during linking + // rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) & 0xfffff7bf); + //} + + rtw_write16(Adapter, REG_RXFLTMAP2,0x00); + } + else if(type == 2) //sta add event call back + { + if(IS_NORMAL_CHIP(pHalData->VersionID)) + { + //enable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); + } + else + { + //enable update TSF + rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~(BIT(4)|BIT(5)))); + } + + if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) + { + //fixed beacon issue for 8191su........... + rtw_write8(Adapter,0x542 ,0x02); + RetryLimit = 0x7; + } + } + + rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT); + } + break; + case HW_VAR_BEACON_INTERVAL: + rtw_write16(Adapter, REG_BCN_INTERVAL, *((u16 *)val)); + break; + case HW_VAR_SLOT_TIME: + { + u8 u1bAIFS, aSifsTime; + struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + rtw_write8(Adapter, REG_SLOT, val[0]); + + if(pmlmeinfo->WMM_enable == 0) + { + if( pmlmeext->cur_wireless_mode == WIRELESS_11B) + aSifsTime = 10; + else + aSifsTime = 16; + + u1bAIFS = aSifsTime + (2 * pmlmeinfo->slotTime); + + // Temporary removed, 2008.06.20. + rtw_write8(Adapter, REG_EDCA_VO_PARAM, u1bAIFS); + rtw_write8(Adapter, REG_EDCA_VI_PARAM, u1bAIFS); + rtw_write8(Adapter, REG_EDCA_BE_PARAM, u1bAIFS); + rtw_write8(Adapter, REG_EDCA_BK_PARAM, u1bAIFS); + } + } + break; + case HW_VAR_SIFS: + { + // SIFS for OFDM Data ACK + rtw_write8(Adapter, REG_SIFS_CTX+1, val[0]); + // SIFS for OFDM consecutive tx like CTS data! + rtw_write8(Adapter, REG_SIFS_TRX+1, val[1]); + + rtw_write8(Adapter,REG_SPEC_SIFS+1, val[0]); + rtw_write8(Adapter,REG_MAC_SPEC_SIFS+1, val[0]); + + // 20100719 Joseph: Revise SIFS setting due to Hardware register definition change. + rtw_write8(Adapter, REG_R2T_SIFS+1, val[0]); + rtw_write8(Adapter, REG_T2T_SIFS+1, val[0]); + } + break; + case HW_VAR_ACK_PREAMBLE: + { + u8 regTmp; + u8 bShortPreamble = *( (PBOOLEAN)val ); + // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) + //regTmp = (pHalData->nCur40MhzPrimeSC)<<5; + regTmp = 0; + if(bShortPreamble) + regTmp |= 0x80; + + rtw_write8(Adapter, REG_RRSR+2, regTmp); + } + break; + case HW_VAR_SEC_CFG: + rtw_write8(Adapter, REG_SECCFG, *((u8 *)val)); + break; + case HW_VAR_DM_FLAG: + pdmpriv->DMFlag = *((u8 *)val); + break; + case HW_VAR_DM_FUNC_OP: + if(val[0]) + {// save dm flag + pdmpriv->DMFlag_tmp = pdmpriv->DMFlag; + } + else + {// restore dm flag + pdmpriv->DMFlag = pdmpriv->DMFlag_tmp; + } + break; + case HW_VAR_DM_FUNC_SET: + pdmpriv->DMFlag |= *((u8 *)val); + break; + case HW_VAR_DM_FUNC_CLR: + pdmpriv->DMFlag &= *((u8 *)val); + break; + case HW_VAR_CAM_EMPTY_ENTRY: + { + u8 ucIndex = *((u8 *)val); + u8 i; + u32 ulCommand=0; + u32 ulContent=0; + u32 ulEncAlgo=CAM_AES; + + for(i=0;iAcParam_BE = ((u32 *)(val))[0]; + rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]); + break; + case HW_VAR_AC_PARAM_BK: + rtw_write32(Adapter, REG_EDCA_BK_PARAM, ((u32 *)(val))[0]); + break; + case HW_VAR_AMPDU_MIN_SPACE: + { + u8 MinSpacingToSet; + u8 SecMinSpace; + + MinSpacingToSet = *((u8 *)val); + if(MinSpacingToSet <= 7) + { + switch(Adapter->securitypriv.dot11PrivacyAlgrthm) + { + case _NO_PRIVACY_: + case _AES_: + SecMinSpace = 0; + break; + + case _WEP40_: + case _WEP104_: + case _TKIP_: + case _TKIP_WTMIC_: + SecMinSpace = 6; + break; + default: + SecMinSpace = 7; + break; + } + + if(MinSpacingToSet < SecMinSpace){ + MinSpacingToSet = SecMinSpace; + } + + //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", Adapter->MgntInfo.MinSpaceCfg)); + rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet); + } + } + break; + case HW_VAR_AMPDU_FACTOR: + { + u8 RegToSet_Normal[4]={0x41,0xa8,0x72, 0xb9}; + u8 RegToSet_BT[4]={0x31,0x74,0x42, 0x97}; + u8 FactorToSet; + u8 *pRegToSet; + u8 index = 0; + +#ifdef CONFIG_BT_COEXIST + if( (pHalData->bt_coexist.BT_Coexist) && + (pHalData->bt_coexist.BT_CoexistType == BT_CSR_BC4) ) + pRegToSet = RegToSet_BT; // 0x97427431; + else +#endif + pRegToSet = RegToSet_Normal; // 0xb972a841; + + FactorToSet = *((u8 *)val); + if(FactorToSet <= 3) + { + FactorToSet = (1<<(FactorToSet + 2)); + if(FactorToSet>0xf) + FactorToSet = 0xf; + + for(index=0; index<4; index++) + { + if((pRegToSet[index] & 0xf0) > (FactorToSet<<4)) + pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet<<4); + + if((pRegToSet[index] & 0x0f) > FactorToSet) + pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet); + + rtw_write8(Adapter, (REG_AGGLEN_LMT+index), pRegToSet[index]); + } + + //RT_TRACE(COMP_MLME, DBG_LOUD, ("Set HW_VAR_AMPDU_FACTOR: %#x\n", FactorToSet)); + } + } + break; + case HW_VAR_RXDMA_AGG_PG_TH: + #ifdef CONFIG_USB_RX_AGGREGATION + { + u8 threshold = *((u8 *)val); + if( threshold == 0) + { + + threshold = pHalData->UsbRxAggPageCount; + } + rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold); + } + #endif + break; + case HW_VAR_SET_RPWM: + rtw_write8(Adapter, REG_USB_HRPWM, *((u8 *)val)); + break; + case HW_VAR_H2C_FW_PWRMODE: + { + u8 psmode = (*(u8 *)val); + + // Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power + // saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang. + if( (psmode != PS_MODE_ACTIVE) && (!IS_92C_SERIAL(pHalData->VersionID))) + { + rtl8192c_dm_RF_Saving(Adapter, _TRUE); + } + rtl8192c_set_FwPwrMode_cmd(Adapter, psmode); + } + break; + case HW_VAR_H2C_FW_JOINBSSRPT: + { + u8 mstatus = (*(u8 *)val); + rtl8192c_set_FwJoinBssReport_cmd(Adapter, mstatus); + } + break; +#ifdef CONFIG_P2P + case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: + { + u8 p2p_ps_state = (*(u8 *)val); + rtl8192c_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state); + } + break; +#endif //CONFIG_P2P + case HW_VAR_INITIAL_GAIN: + PHY_SetBBReg(Adapter, rOFDM0_XAAGCCore1, 0x7f, ((u32 *)(val))[0]); + PHY_SetBBReg(Adapter, rOFDM0_XBAGCCore1, 0x7f, ((u32 *)(val))[0]); + break; + case HW_VAR_TRIGGER_GPIO_0: + rtl8192cu_trigger_gpio_0(Adapter); + break; +#ifdef CONFIG_BT_COEXIST + case HW_VAR_BT_SET_COEXIST: + { + u8 bStart = (*(u8 *)val); + rtl8192c_set_dm_bt_coexist(Adapter, bStart); + } + break; + case HW_VAR_BT_ISSUE_DELBA: + { + u8 dir = (*(u8 *)val); + rtl8192c_issue_delete_ba(Adapter, dir); + } + break; +#endif +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + + case HW_VAR_ANTENNA_DIVERSITY_LINK: + SwAntDivRestAfterLink8192C(Adapter); + break; + case HW_VAR_ANTENNA_DIVERSITY_SELECT: + { + u8 Optimum_antenna = (*(u8 *)val); + //switch antenna to Optimum_antenna + // DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); + if(pHalData->CurAntenna != Optimum_antenna) + { + PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, Optimum_antenna); + pHalData->CurAntenna = Optimum_antenna ; + //DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); + } + } + break; +#endif + case HW_VAR_EFUSE_BYTES: // To set EFUE total used bytes, added by Roger, 2008.12.22. + pHalData->EfuseUsedBytes = *((u16 *)val); + break; + case HW_VAR_FIFO_CLEARN_UP: + { + #define RW_RELEASE_EN BIT18 + #define RXDMA_IDLE BIT17 + + struct pwrctrl_priv *pwrpriv = &Adapter->pwrctrlpriv; + u8 trycnt = 100; + + //pause tx + rtw_write8(Adapter,REG_TXPAUSE,0xff); + + //keep sn + Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter,REG_NQOS_SEQ); + + if(pwrpriv->bkeepfwalive != _TRUE) + { + //RX DMA stop + rtw_write32(Adapter,REG_RXPKT_NUM,(rtw_read32(Adapter,REG_RXPKT_NUM)|RW_RELEASE_EN)); + do{ + if(!(rtw_read32(Adapter,REG_RXPKT_NUM)&RXDMA_IDLE)) + break; + }while(trycnt--); + if(trycnt ==0) + DBG_8192C("Stop RX DMA failed...... \n"); + + //RQPN Load 0 + rtw_write16(Adapter,REG_RQPN_NPQ,0x0); + rtw_write32(Adapter,REG_RQPN,0x80000000); + rtw_mdelay_os(10); + } + } + break; + default: + break; + } + +_func_exit_; +} + +void GetHwReg8192CU(PADAPTER Adapter, u8 variable, u8* val) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + +_func_enter_; + + switch(variable) + { + case HW_VAR_BASIC_RATE: + *((u16 *)(val)) = pHalData->BasicRateSet; + case HW_VAR_TXPAUSE: + val[0] = rtw_read8(Adapter, REG_TXPAUSE); + break; + case HW_VAR_TX_BCN_DONE: + { + u32 xmitbcnDown; + xmitbcnDown= rtw_read32(Adapter, REG_TDECTRL); + if(xmitbcnDown & BCN_VALID ){ + rtw_write32(Adapter,REG_TDECTRL, xmitbcnDown | BCN_VALID ); // write 1 to clear, Clear by sw + val[0] = _TRUE; + } + } + break; + case HW_VAR_DM_FLAG: + val[0] = pHalData->dmpriv.DMFlag; + break; + case HW_VAR_RF_TYPE: + val[0] = pHalData->rf_type; + break; + case HW_VAR_FWLPS_RF_ON: + { + //When we halt NIC, we should check if FW LPS is leave. + u32 valRCR; + + if(Adapter->pwrctrlpriv.rf_pwrstate == rf_off) + { + // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, + // because Fw is unload. + val[0] = _TRUE; + } + else + { + valRCR = rtw_read32(Adapter, REG_RCR); + valRCR &= 0x00070000; + if(valRCR) + val[0] = _FALSE; + else + val[0] = _TRUE; + } + } + break; +#ifdef CONFIG_ANTENNA_DIVERSITY + case HW_VAR_CURRENT_ANTENNA: + val[0] = pHalData->CurAntenna; + break; +#endif + case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22. + *((u16 *)(val)) = pHalData->EfuseUsedBytes; + break; + default: + break; + } + +_func_exit_; +} + +// +// Description: +// Query setting of specified variable. +// +u8 +GetHalDefVar8192CUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 bResult = _TRUE; + + switch(eVariable) + { + case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB: + *((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB; + break; + case HAL_DEF_IS_SUPPORT_ANT_DIV: + #ifdef CONFIG_ANTENNA_DIVERSITY + *((u8 *)pValue) = (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))?_FALSE:_TRUE; + #endif + break; + case HAL_DEF_CURRENT_ANTENNA: + #ifdef CONFIG_ANTENNA_DIVERSITY + *(( u8*)pValue) = pHalData->CurAntenna; + #endif + break; + case HAL_DEF_DRVINFO_SZ: + *(( u32*)pValue) = DRVINFO_SZ; + break; + case HAL_DEF_MAX_RECVBUF_SZ: + *(( u32*)pValue) = MAX_RECVBUF_SZ; + break; + case HAL_DEF_RX_PACKET_OFFSET: + *(( u32*)pValue) = RXDESC_SIZE + DRVINFO_SZ; + break; + case HAL_DEF_DBG_DUMP_RXPKT: + *(( u8*)pValue) = pHalData->bDumpRxPkt; + break; + case HAL_DEF_DBG_DM_FUNC: + *(( u8*)pValue) = pHalData->dmpriv.DMFlag; + break; + default: + //RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8192CUsb(): Unkown variable: %d!\n", eVariable)); + bResult = _FALSE; + break; + } + + return bResult; +} + + + + +// +// Description: +// Change default setting of specified variable. +// +u8 +SetHalDefVar8192CUsb( + IN PADAPTER Adapter, + IN HAL_DEF_VARIABLE eVariable, + IN PVOID pValue + ) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); + u8 bResult = _TRUE; + + switch(eVariable) + { + case HAL_DEF_DBG_DUMP_RXPKT: + pHalData->bDumpRxPkt = *(( u8*)pValue); + break; + case HAL_DEF_DBG_DM_FUNC: + { + u8 dm_func = *(( u8*)pValue); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + + if(dm_func == 0){ //disable all dynamic func + pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE; + DBG_8192C("==> Disable all dynamic function...\n"); + } + else if(dm_func == 1){//disable DIG + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_DIG); + DBG_8192C("==> Disable DIG...\n"); + } + else if(dm_func == 2){//disable High power + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_HP); + } + else if(dm_func == 3){//disable tx power tracking + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_SS); + DBG_8192C("==> Disable tx power tracking...\n"); + } + else if(dm_func == 4){//disable BT coexistence + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_BT); + } + else if(dm_func == 5){//disable antenna diversity + pdmpriv->DMFlag &= (~DYNAMIC_FUNC_ANT_DIV); + } + else if(dm_func == 6){//turn on all dynamic func + if(!(pdmpriv->DMFlag & DYNAMIC_FUNC_DIG)) + { + struct dm_priv *pdmpriv = &pHalData->dmpriv; + DIG_T *pDigTable = &pdmpriv->DM_DigTable; + pDigTable->PreIGValue = rtw_read8(Adapter,0xc50); + } + + pdmpriv->DMFlag |= (DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS| + DYNAMIC_FUNC_BT|DYNAMIC_FUNC_ANT_DIV) ; + DBG_8192C("==> Turn on all dynamic function...\n"); + } + } + break; + default: + //RT_TRACE(COMP_INIT, DBG_TRACE, ("SetHalDefVar819xUsb(): Unkown variable: %d!\n", eVariable)); + bResult = _FALSE; + break; + } + + return bResult; +} + +u32 _update_92cu_basic_rate(_adapter *padapter, unsigned int mask) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + unsigned int BrateCfg = 0; + +#ifdef CONFIG_BT_COEXIST + if( (pbtpriv->BT_Coexist) && (pbtpriv->BT_CoexistType == BT_CSR_BC4) ) + { + BrateCfg = mask & 0x151; + //DBG_8192C("BT temp disable cck 2/5.5/11M, (0x%x = 0x%x)\n", REG_RRSR, BrateCfg & 0x151); + } + else +#endif + { + if(pHalData->VersionID != VERSION_TEST_CHIP_88C) + BrateCfg = mask & 0x15F; + else //for 88CU 46PING setting, Disable CCK 2M, 5.5M, Others must tuning + BrateCfg = mask & 0x159; + } + + BrateCfg |= 0x01; // default enable 1M ACK rate + + return BrateCfg; +} + +void _update_response_rate(_adapter *padapter,unsigned int mask) +{ + u8 RateIndex = 0; + // Set RRSR rate table. + rtw_write8(padapter, REG_RRSR, mask&0xff); + rtw_write8(padapter,REG_RRSR+1, (mask>>8)&0xff); + + // Set RTS initial rate + while(mask > 0x1) + { + mask = (mask>> 1); + RateIndex++; + } + rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex); +} + +void UpdateHalRAMask8192CUsb(PADAPTER padapter, u32 mac_id) +{ + //volatile unsigned int result; + u8 init_rate=0; + u8 networkType, raid; + u32 mask; + u8 shortGIrate = _FALSE; + int supportRateNum = 0; + struct sta_info *psta; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct dm_priv *pdmpriv = &pHalData->dmpriv; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist); +#endif + + if (mac_id >= NUM_STA) //CAM_SIZE + { + return; + } + + psta = pmlmeinfo->FW_sta_info[mac_id].psta; + if(psta == NULL) + { + return; + } + + switch (mac_id) + { + case 0:// for infra mode + supportRateNum = rtw_get_rateset_len(cur_network->SupportedRates); + networkType = judge_network_type(padapter, cur_network->SupportedRates, supportRateNum) & 0xf; + //pmlmeext->cur_wireless_mode = networkType; + raid = networktype_to_raid(networkType); + + mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); + mask |= (pmlmeinfo->HT_enable)? update_MSC_rate(&(pmlmeinfo->HT_caps)): 0; + mask |= ((raid<<28)&0xf0000000); + + if (support_short_GI(padapter, &(pmlmeinfo->HT_caps))) + { + shortGIrate = _TRUE; + } + + break; + + case 1://for broadcast/multicast + supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); + if(pmlmeext->cur_wireless_mode & WIRELESS_11B) + networkType = WIRELESS_11B; + else + networkType = WIRELESS_11G; + raid = networktype_to_raid(networkType); + + mask = update_basic_rate(cur_network->SupportedRates, supportRateNum); + mask |= ((raid<<28)&0xf0000000); + + break; + + default: //for each sta in IBSS + supportRateNum = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[mac_id].SupportedRates); + networkType = judge_network_type(padapter, pmlmeinfo->FW_sta_info[mac_id].SupportedRates, supportRateNum) & 0xf; + //pmlmeext->cur_wireless_mode = networkType; + raid = networktype_to_raid(networkType); + + mask = update_supported_rate(cur_network->SupportedRates, supportRateNum); + mask |= ((raid<<28)&0xf0000000); + + //todo: support HT in IBSS + + break; + } + +#ifdef CONFIG_BT_COEXIST + if( (pbtpriv->BT_Coexist) && + (pbtpriv->BT_CoexistType == BT_CSR_BC4) && + (pbtpriv->BT_CUR_State) && + (pbtpriv->BT_Ant_isolation) && + ((pbtpriv->BT_Service==BT_SCO)|| + (pbtpriv->BT_Service==BT_Busy)) ) + mask &= 0xffffcfc0; + else +#endif + mask &=0xffffffff; + + + init_rate = get_highest_rate_idx(mask)&0x3f; + + if(pHalData->fw_ractrl == _TRUE) + { + u8 arg = 0; + + //arg = (cam_idx-4)&0x1f;//MACID + arg = mac_id&0x1f;//MACID + + arg |= BIT(7); + + if (shortGIrate==_TRUE) + arg |= BIT(5); + + DBG_871X("update raid entry, mask=0x%x, arg=0x%x\n", mask, arg); + + rtl8192c_set_raid_cmd(padapter, mask, arg); + + } + else + { + if (shortGIrate==_TRUE) + init_rate |= BIT(6); + + rtw_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id), init_rate); + } + + + //set ra_id + psta->raid = raid; + psta->init_rate = init_rate; + + //set correct initial date rate for each mac_id + pdmpriv->INIDATA_RATE[mac_id] = init_rate; +} + +void SetBeaconRelatedRegisters8192CUsb(PADAPTER padapter) +{ + u32 value32; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + //reset TSF, enable update TSF, correcting TSF On Beacon + + //REG_BCN_INTERVAL + //REG_BCNDMATIM + //REG_ATIMWND + //REG_TBTT_PROHIBIT + //REG_DRVERLYINT + //REG_BCN_MAX_ERR + //REG_BCNTCFG //(0x510) + //REG_DUAL_TSF_RST + //REG_BCN_CTRL //(0x550) + + //BCN interval + rtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval); + rtw_write8(padapter, REG_ATIMWND, 0x02);// 2ms + + _InitBeaconParameters(padapter); + + rtw_write8(padapter, REG_SLOT, 0x09); + + value32 =rtw_read32(padapter, REG_TCR); + value32 &= ~TSFRST; + rtw_write32(padapter, REG_TCR, value32); + + value32 |= TSFRST; + rtw_write32(padapter, REG_TCR, value32); + + // NOTE: Fix test chip's bug (about contention windows's randomness) + rtw_write8(padapter, REG_RXTSF_OFFSET_CCK, 0x50); + rtw_write8(padapter, REG_RXTSF_OFFSET_OFDM, 0x50); + + _BeaconFunctionEnable(padapter, _TRUE, _TRUE); + + ResumeTxBeacon(padapter); + + //rtw_write8(padapter, 0x422, rtw_read8(padapter, 0x422)|BIT(6)); + + //rtw_write8(padapter, 0x541, 0xff); + + //rtw_write8(padapter, 0x542, rtw_read8(padapter, 0x541)|BIT(0)); + + rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(1)); + +} + +static void rtl8192cu_init_default_value(_adapter * padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + struct dm_priv *pdmpriv = &pHalData->dmpriv; + u8 i; + + //init default value + pHalData->fw_ractrl = _FALSE; + pHalData->bIQKInitialized = _FALSE; + if(!pwrctrlpriv->bkeepfwalive) + pHalData->LastHMEBoxNum = 0; + + pHalData->bIQKInitialized = _FALSE; + //init dm default value + pdmpriv->TM_Trigger = 0; + pdmpriv->binitialized = _FALSE; + pdmpriv->prv_traffic_idx = 3; + pdmpriv->initialize = 0; + + pdmpriv->ThermalValue_HP_index = 0; + for(i = 0; i < HP_THERMAL_NUM; i++) + pdmpriv->ThermalValue_HP[i] = 0; +} +static u8 rtl8192cu_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val) +{ + u8 bResult = _TRUE; + switch(efunc_id){ + + #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) + case HAL_USB_SELECT_SUSPEND: + { + u8 bfwpoll = *(( u8*)val); + rtl8192c_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect + } + break; + #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED + + default: + break; + } + return bResult; +} +void rtl8192cu_set_hal_ops(_adapter * padapter) +{ + struct hal_ops *pHalFunc = &padapter->HalFunc; + +_func_enter_; + + padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE)); + if(padapter->HalData == NULL){ + DBG_8192C("cant not alloc memory for HAL DATA \n"); + } + //_rtw_memset(padapter->HalData, 0, sizeof(HAL_DATA_TYPE)); + + pHalFunc->hal_init = &rtl8192cu_hal_init; + pHalFunc->hal_deinit = &rtl8192cu_hal_deinit; + + //pHalFunc->free_hal_data = &rtl8192c_free_hal_data; + + pHalFunc->inirp_init = &rtl8192cu_inirp_init; + pHalFunc->inirp_deinit = &rtl8192cu_inirp_deinit; + + pHalFunc->init_xmit_priv = &rtl8192cu_init_xmit_priv; + pHalFunc->free_xmit_priv = &rtl8192cu_free_xmit_priv; + + pHalFunc->init_recv_priv = &rtl8192cu_init_recv_priv; + pHalFunc->free_recv_priv = &rtl8192cu_free_recv_priv; +#ifdef CONFIG_SW_LED + pHalFunc->InitSwLeds = &rtl8192cu_InitSwLeds; + pHalFunc->DeInitSwLeds = &rtl8192cu_DeInitSwLeds; +#else //case of hw led or no led + pHalFunc->InitSwLeds = NULL; + pHalFunc->DeInitSwLeds = NULL; +#endif//CONFIG_SW_LED + + //pHalFunc->dm_init = &rtl8192c_init_dm_priv; + //pHalFunc->dm_deinit = &rtl8192c_deinit_dm_priv; + + pHalFunc->init_default_value = &rtl8192cu_init_default_value; + pHalFunc->intf_chip_configure = &rtl8192cu_interface_configure; + pHalFunc->read_adapter_info = &ReadAdapterInfo8192CU; + + //pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C; + //pHalFunc->set_channel_handler = &PHY_SwChnl8192C; + + //pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog; + + pHalFunc->SetHwRegHandler = &SetHwReg8192CU; + pHalFunc->GetHwRegHandler = &GetHwReg8192CU; + pHalFunc->GetHalDefVarHandler = &GetHalDefVar8192CUsb; + pHalFunc->SetHalDefVarHandler = &SetHalDefVar8192CUsb; + + pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8192CUsb; + pHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8192CUsb; + + //pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid; + +//#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //pHalFunc->SwAntDivBeforeLinkHandler = &SwAntDivBeforeLink8192C; + //pHalFunc->SwAntDivCompareHandler = &SwAntDivCompare8192C; +//#endif + + pHalFunc->hal_xmit = &rtl8192cu_hal_xmit; + pHalFunc->mgnt_xmit = &rtl8192cu_mgnt_xmit; + + //pHalFunc->read_bbreg = &rtl8192c_PHY_QueryBBReg; + //pHalFunc->write_bbreg = &rtl8192c_PHY_SetBBReg; + //pHalFunc->read_rfreg = &rtl8192c_PHY_QueryRFReg; + //pHalFunc->write_rfreg = &rtl8192c_PHY_SetRFReg; + +#ifdef CONFIG_HOSTAPD_MLME + pHalFunc->hostap_mgnt_xmit_entry = &rtl8192cu_hostap_mgnt_xmit_entry; +#endif + pHalFunc->interface_ps_func = &rtl8192cu_ps_func; + + rtl8192c_set_hal_ops(pHalFunc); +_func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c new file mode 100755 index 000000000000..4d01b3cd38ca --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_ce.c @@ -0,0 +1,1208 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_OPS_OS_C_ + +#include +#include +#include +#include + +#ifndef PLATFORM_OS_CE + #error "PLATFORM_OS_CE shall be set \n" +#endif + +#ifndef CONFIG_USB_HCI + #error "CONFIG_USB_HCI shall be on!\n" +#endif + +#include +#include + +#include + + +struct zero_bulkout_context +{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + + + +#define PUSB_ERROR LPDWORD +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) + + +USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr); + + +static NTSTATUS usb_async_interrupt_in_complete( LPVOID Context ); +static NTSTATUS usb_async_interrupt_out_complete( LPVOID Context ); + +DWORD usb_write_port_complete( LPVOID Context ); +DWORD usb_read_port_complete( LPVOID Context ); + +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); +_func_exit_; +} + + + +BOOL +CloseTransferHandle( + LPCUSB_FUNCS pUsbFuncs, + USB_TRANSFER hTransfer + ) +{ + BOOL bRc = TRUE; + + // This assert may fail on suprise remove, + // but should pass during normal I/O. + // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) ); + + // CloseTransfer aborts any pending transfers + if ( !pUsbFuncs->lpCloseTransfer(hTransfer) ) { + + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError())); + bRc = FALSE; + } + + return bRc; +} + + +BOOL +GetTransferStatus( + LPCUSB_FUNCS pUsbFuncs, + USB_TRANSFER hTransfer, + LPDWORD pBytesTransferred , // OPTIONAL returns number of bytes transferred + PUSB_ERROR pUsbError // returns USB error code + ) +{ + + BOOL bRc = TRUE; + + if ( pUsbFuncs->lpGetTransferStatus(hTransfer, pBytesTransferred, pUsbError) ) { + if ( USB_NO_ERROR != *pUsbError ) { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("*** CloseTransfer ERROR:%d ***\n", GetLastError())); + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("GetTransferStatus (BytesTransferred:%d, UsbError:0x%x)\n", pBytesTransferred?*pBytesTransferred:-1, pUsbError?*pUsbError:-1 )); + } + } else { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_,("*** GetTransferStatus ERROR:%d ***\n", GetLastError())); + *pUsbError = USB_CANCELED_ERROR; + bRc = FALSE; + } + + return bRc; +} + + +// The driver should never read RxCmd register. We have to set +// RCR CMDHAT0 (bit6) to append Rx status before the Rx frame. +// +// |<-------- pBulkUrb->TransferBufferLength ------------>| +// +------------------+-------------------+------------+ +// | Rx status (16 bytes) | Rx frame ..... | CRC(4 bytes) | +// +------------------+-------------------+------------+ +// ^ +// ^pRfd->Buffer.VirtualAddress +// +/*! \brief USB RX IRP Complete Routine. + @param Context pointer of RT_RFD +*/ +u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + _adapter *adapter = (_adapter *)pdvobj_priv->padapter; + + struct recv_priv *precvpriv = &adapter->recvpriv; + + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + DWORD dwErr = ERROR_SUCCESS ; + DWORD dwBytesTransferred = 0 ; + USB_TRANSFER hTransfer = NULL; + USB_PIPE hPipe; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__)); + +#if (CONFIG_PWRCTRL == 1) + if (adapter->pwrctrlpriv.pnp_bstop_trx) + { + return _FALSE; + } +#endif + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved) + { + RT_TRACE(_module_hci_ops_os_c_, _drv_info_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved)!!!\n")); + return _FALSE; + } + + if(precvbuf !=NULL) + { + + // get a recv buffer + rtl8192cu_init_recvbuf(adapter, precvbuf); + + + + _rtw_spinlock(&precvpriv->lock); + precvpriv->rx_pending_cnt++; + precvbuf->irp_pending = _TRUE; + _rtw_spinunlock(&precvpriv->lock); + + + //translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj_priv, addr); + + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port(%u)\n", __LINE__)); + + precvbuf->usb_transfer_read_port = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, + usb_read_port_complete, + precvbuf, + USB_IN_TRANSFER|USB_SHORT_TRANSFER_OK, + MAX_RECVBUF_SZ, + precvbuf->pbuf, + 0); + + + if(precvbuf->usb_transfer_read_port) + { + + // GetTransferStatus(usb_funcs_vp, hTransfer, &dwBytesTransferred,&UsbRc); + + // CloseTransferHandle(usb_funcs_vp, hTransfer); + + } + else + { + + dwErr = GetLastError(); + //RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr)); + + } + +// if ( USB_NO_ERROR != UsbRc && ERROR_SUCCESS == dwErr) { +// dwErr = ERROR_GEN_FAILURE; +// } + + + if ( ERROR_SUCCESS != dwErr ) { + + SetLastError(dwErr); + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port ERROR : %d\n", dwErr)); + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port(%u)\n", __LINE__)); + + } + else // if(precvbuf !=NULL) + { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n")); + } + + return _TRUE; + +} + +DWORD usb_read_port_complete( PVOID context ) +{ + struct recv_buf *precvbuf = (struct recv_buf *)context; + _adapter *adapter = (_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + + + struct intf_hdl *pintfhdl = &adapter->pio_queue->intf; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + + + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + uint isevt, *pbuf; + int fComplete =_FALSE; + + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_complete(%u)\n", __LINE__)); + +_func_enter_; + + + _rtw_spinlock_ex(&precvpriv->lock); + precvbuf->irp_pending=_FALSE; + precvpriv->rx_pending_cnt --; + _rtw_spinunlock_ex(&precvpriv->lock); + + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(precvbuf->usb_transfer_read_port, &dwBytesTransferred, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(precvbuf->usb_transfer_read_port); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(precvbuf->usb_transfer_read_port); + + +#endif + + + if(USB_NO_ERROR != dwErr) + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete Fail :%d\n",dwErr)); + + { + + if ( dwBytesTransferred > MAX_RECVBUF_SZ || dwBytesTransferred < RXDESC_SIZE ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_, + ("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE): %d\n",dwBytesTransferred)); + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + + //usb_read_port(pintfhdl, 0, 0, (unsigned char *)precvframe); + } + else + { + precvbuf->transfer_len = dwBytesTransferred; + + pbuf = (uint*)precvbuf->pbuf; + + if((isevt = *(pbuf+1)&0x1ff) == 0x1ff) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_info_, + ("\n usb_read_port_complete: get a event\n")); + rxcmd_event_hdl(adapter, pbuf);//rx c2h events + + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets + { + //precvbuf->reuse = _TRUE; + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + } + } + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_read_port_complete(%u)\n", __LINE__)); + +_func_exit_; + return ERROR_SUCCESS; +// return STATUS_MORE_PROCESSING_REQUIRED; +} + +void usb_read_port_cancel(_adapter *padapter){ + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_read_port_cancel(%u)\n",__FUNCTION__, __LINE__)); +} + +DWORD usb_write_mem_complete( LPVOID Context ) +{ + int fComplete =_FALSE; + DWORD dwBytes = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + _irqL irqL; + _list *head; + _list *plist; + struct io_req *pio_req; + struct io_queue *pio_q = (struct io_queue *) Context; + struct intf_hdl *pintf = &(pio_q->intf); + struct intf_priv *pintfpriv = pintf->pintfpriv; + _adapter *padapter = (_adapter *)pintf->adapter; + NTSTATUS status = STATUS_SUCCESS; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + + USB_HANDLE usbHandle = pdvobj_priv->usb_extension._hDevice; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + // get the head from the processing io_queue + head = &(pio_q->processing); + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_mem_complete %p\n", Context)); + +#if 1 + _enter_critical_bh(&(pio_q->lock), &irqL); + + + //free irp in processing list... + while(rtw_is_list_empty(head) != _TRUE) + { + plist = get_next(head); + rtw_list_delete(plist); + pio_req = LIST_CONTAINOR(plist, struct io_req, list); + _rtw_up_sema(&pio_req->sema); + } + + _exit_critical_bh(&(pio_q->lock), &irqL); +#endif + + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem ); + +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem_complete\n")); + +_func_exit_; + + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + + +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + + NTSTATUS NtStatus = STATUS_SUCCESS; + USB_PIPE hPipe; + _irqL irqL; + + int fComplete = _FALSE; + DWORD dwBytes = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + + struct io_req *pio_req; + + _adapter *adapter = (_adapter *)pintfhdl->adapter; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + + + struct xmit_priv *pxmitpriv = &adapter->xmitpriv; + struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_mem(%u) pintfhdl %p wmem %p\n", __LINE__, pintfhdl, wmem)); + + // fetch a io_request from the io_queue + pio_req = alloc_ioreq(pio_queue); + + if ((pio_req == NULL)||(adapter->bSurpriseRemoved)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved )); + goto exit; + } + + _enter_critical_bh(&(pio_queue->lock), &irqL); + + + // insert the io_request into processing io_queue + rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing)); + + + if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); + goto exit; + } + + //translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj_priv, addr); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_,("usb_write_mem(%u)\n",__LINE__)); + + pio_req->usb_transfer_write_mem = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, + usb_write_mem_complete, + pio_queue, + USB_OUT_TRANSFER, + cnt, + wmem, + 0); + +#if 0 + + (*usb_funcs_vp->lpGetTransferStatus)(pio_req->usb_transfer_write_mem , &dwBytes, &dwErr); + + while( fComplete != _TRUE) + { + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pio_req->usb_transfer_write_mem); + if(fComplete==_TRUE) + { + (*usb_funcs_vp->lpCloseTransfer)(pio_req->usb_transfer_write_mem ); + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_mem finished\n")); + break; + } + else + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, + ("usb_write_mem not yet finished %X\n", + pio_req->usb_transfer_write_mem)); + rtw_msleep_os(10); + } + + } + +#endif + + +// _rtw_down_sema(&pio_req->sema); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("-usb_write_mem(%X)\n",pio_req->usb_transfer_write_mem)); + + _exit_critical_bh(&(pio_queue->lock), &irqL); + + _rtw_down_sema(&pio_req->sema); + free_ioreq(pio_req, pio_queue); + +exit: +_func_exit_; + return; +} + +u32 usb_write_cnt=0; +u32 usb_complete_cnt=0; + +USB_PIPE ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr) +{ + USB_PIPE PipeHandle = NULL; + _adapter *padapter = pNdisCEDvice->padapter; + + + if(pNdisCEDvice->nr_endpoint == 11) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3] ; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_BCNQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[6]; + break; + case RTL8712_DMA_BMCQ: //HI Queue + PipeHandle= padapter->halpriv.pipehdls_r8712[7]; + break; + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[8]; + break; + case RTL8712_DMA_RX0FF: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + case RTL8712_DMA_H2CCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[9]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 6) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 4) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VIQ: + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + } + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint)); + } + + return PipeHandle; + +} + +DWORD usb_bulkout_zero_complete( LPVOID pZeroContext ) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext; + _adapter * padapter = pcontext->padapter; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + + int fComplete =_FALSE; + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + +_func_enter_; + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_bulkout_zero_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); + +#endif + + if(pcontext) + { + if(pcontext->pbuf) + { + rtw_mfree(pcontext->pbuf, sizeof(int)); + } + + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); + } + +_func_exit_; + + return ERROR_SUCCESS; + + +} + +u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + struct zero_bulkout_context *pcontext; + unsigned char *pbuf; + u8 len = 0 ; + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + + + LPCUSB_FUNCS usb_funcs_vp = pdvobj->usb_extension._lpUsbFuncs; + + USB_PIPE hPipe; + +_func_enter_; + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + return _FAIL; + } + + + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); + + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); + + len = 0; + + pcontext->pbuf = pbuf; + pcontext->purb = NULL; + pcontext->pirp = NULL; + pcontext->padapter = padapter; + + +//translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj, addr); + + + + + pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, usb_bulkout_zero_complete, + pcontext, USB_OUT_TRANSFER, + len, pbuf, 0); + + +_func_exit_; + + return _SUCCESS; + +} + +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + + u32 i, bwritezero = _FALSE; + u32 ac_tag = addr; + + u8* ptr; + + struct intf_priv * pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv*)pintfpriv->intf_dev; + _adapter * padapter = pdvobj_priv->padapter; + + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + struct xmit_frame * pxmitframe = (struct xmit_frame *)wmem; + + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + USB_PIPE hPipe; + + u32 bResult = _FALSE; + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("+usb_write_port\n")); + +#if (CONFIG_PWRCTRL == 1) + if(padapter->pwrctrlpriv.pnp_bstop_trx==_TRUE){ + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); + + } +#endif + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + bResult = _FALSE; + goto exit; + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port(%u)\n", __LINE__)); + + for(i=0; i<8; i++) + { + if(pxmitframe->bpending[i] == _FALSE) + { + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt++; + pxmitframe->bpending[i] = _TRUE; + _rtw_spinunlock(&pxmitpriv->lock); + + pxmitframe->sz[i] = cnt; + pxmitframe->ac_tag[i] = ac_tag; + + break; + } + } + + + //TODO: + if (pdvobj_priv->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt)); + // cnt=cnt+1; + bwritezero = _TRUE; + + } + } + else + { + if(cnt > 0 && cnt%64 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("cnt=%d\n", cnt)); + // cnt=cnt+1; + bwritezero = _TRUE; + + } + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("usb_write_port: pipe handle convert\n")); + + //translate DMA FIFO addr to pipehandle + hPipe = ffaddr2pipehdl(pdvobj_priv, addr); + + +#if 0 + // for tx fifo, the maximum payload number is 8, + // we workaround this issue here by separate whole fifo into 8 segments. + if (cnt <= 500) + cnt = 500; +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, + ("usb_write_port(%u): pxmitframe %X pxmitframe->padapter %X\n",__LINE__, pxmitframe, pxmitframe->padapter)); + + pxmitpriv->usb_transfer_write_port = (*usb_funcs_vp->lpIssueBulkTransfer)( + hPipe, usb_write_port_complete, + pxmitframe, USB_OUT_TRANSFER, + cnt, pxmitframe->mem_addr, 0); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + + ptr=(u8 *)&pxmitframe->mem; + +#if 0 + if (pdvobj_priv->ishighspeed) + { + ptr=ptr+512; + } + else + { + ptr=ptr+64; + + } +#endif + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } + +// if (!pxmitframe->usb_transfer_xmit) +// padapter->bSurpriseRemoved=_TRUE; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + bResult = _SUCCESS; + +exit: +_func_exit_; + return bResult; +} + +DWORD usb_write_port_complete( LPVOID Context ) +{ + +// u8 *ptr; + + struct xmit_frame * pxmitframe = (struct xmit_frame *) Context; + _adapter * padapter = pxmitframe->padapter; + struct dvobj_priv * pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv * pxmitpriv = &padapter->xmitpriv; + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; + LPCUSB_FUNCS usb_funcs_vp = pdvobj_priv->usb_extension._lpUsbFuncs; + + int fComplete =_FALSE; + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u), pxmitframe %X\n",__FUNCTION__, __LINE__, Context)); + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("+usb_write_port_complete\n")); + + _rtw_spinlock_ex(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; + _rtw_spinunlock_ex(&pxmitpriv->lock); + + if(pxmitpriv->txirp_cnt==0){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } + + + //not to consider tx fragment + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + +#if 1 + + (*usb_funcs_vp->lpGetTransferStatus)(pxmitpriv->usb_transfer_write_port, &dwBytesTransferred, &dwErr); + fComplete = (*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_port_complete CloseTransfer before complete\n")); + } + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); + +#else + + if((*usb_funcs_vp->lpIsTransferComplete)(pxmitpriv->usb_transfer_write_port)) + { + (*usb_funcs_vp->lpCloseTransfer)(pxmitpriv->usb_transfer_write_port); + } + +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, + ("%s(%u): pxmitpriv %X pxmitpriv->free_xmitframe_cnt %X pxmitframe->padapter %X pxmitframe->padapter %X\n", + __LINE__, pxmitpriv, pxmitpriv->free_xmitframe_cnt, pxmitframe->padapter)); + + rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf); + +_func_exit_; + + return STATUS_SUCCESS; +} + +DWORD usb_write_scsi_complete(LPVOID pTxContext) +{ +#ifndef PLATFORM_OS_CE + struct SCSI_BUFFER_ENTRY *psb_entry = (struct SCSI_BUFFER_ENTRY *)pTxContext; + _adapter *padapter = psb_entry->padapter; + struct SCSI_BUFFER *psb = padapter->pscsi_buf; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct dvobj_priv *pdvobj_priv = (struct dvobj_priv *)&padapter->dvobjpriv; + LPCUSB_FUNCS lpUsbFuncs = pdvobj_priv->pUsbExtension->_lpUsbFuncs; + + int fComplete =_FALSE; + DWORD dwBytesTransferred = 0; + DWORD dwErr = USB_CANCELED_ERROR; + +_func_enter_; + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u): circ_space = %d\n",__FUNCTION__, __LINE__, CIRC_SPACE( psb->head,psb->tail, SCSI_BUFFER_NUMBER))); + +#if 1 + + (*lpUsbFuncs->lpGetTransferStatus)(psb_entry->usb_transfer_scsi_txcmd, &dwBytesTransferred, &dwErr); + fComplete = (*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd); + if(fComplete!=_TRUE) + { + RT_TRACE( _module_hci_ops_os_c_, _drv_err_, ("usb_write_scsi_complete CloseTransfer before complete\n")); + } + (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd); + +#else + + if((*lpUsbFuncs->lpIsTransferComplete)(psb_entry->usb_transfer_scsi_txcmd)) + (*lpUsbFuncs->lpCloseTransfer)(psb_entry->usb_transfer_scsi_txcmd); +#endif + + memset(psb_entry->entry_memory, 0, 8); + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + if((psb->tail+1)==SCSI_BUFFER_NUMBER) + psb->tail=0; + else + psb->tail++; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + if(CIRC_CNT(psb->head,psb->tail,SCSI_BUFFER_NUMBER)==0){ + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("write_txcmd_scsififo_callback: up_sema\n")); + _rtw_up_sema(&pxmitpriv->xmit_sema); + } + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + if(padapter->bSurpriseRemoved) { + return STATUS_MORE_PROCESSING_REQUIRED; + } + +_func_exit_; +#endif + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +uint usb_write_scsi(struct intf_hdl *pintfhdl, u32 cnt, u8 *wmem) +{ + +#ifndef PLATFORM_OS_CE + + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pdev = (struct dvobj_priv*)&padapter->dvobjpriv; + + struct SCSI_BUFFER *psb =padapter->pscsi_buf; + struct SCSI_BUFFER_ENTRY *psb_entry=LIST_CONTAINOR(wmem,struct SCSI_BUFFER_ENTRY,entry_memory); + +_func_enter_; + if(padapter->bSurpriseRemoved||padapter->bDriverStopped) + return 0; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + psb_entry->usb_transfer_scsi_txcmd=pdev->pUsbExtension->_lpUsbFuncs->lpIssueBulkTransfer( + pdev->scsi_out_pipehandle, + usb_write_scsi_complete, + psb_entry, + USB_OUT_TRANSFER, + cnt, + wmem, + 0); + +_func_exit_; +#endif + + return _SUCCESS; +} + + +/* + */ +uint usb_init_intf_priv(struct intf_priv *pintfpriv) +{ + // get the dvobj_priv object + struct dvobj_priv * pNdisCEDvice = (struct dvobj_priv *) pintfpriv->intf_dev; + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); + // set init intf_priv init status as _IOREADY + pintfpriv->intf_status = _IOREADY; + + // determine the max io size by dvobj_priv.ishighspeed + if(pNdisCEDvice->ishighspeed) + pintfpriv->max_iosz = 128; + else + pintfpriv->max_iosz = 64; + + // read/write size set as 0 + pintfpriv->io_wsz = 0; + pintfpriv->io_rsz = 0; + + // init io_rwmem buffer + pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4); + if (pintfpriv->allocated_io_rwmem == NULL) + { + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4); + return _FAIL; + } + else + { + // word align the io_rwmem + pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 - ( (u32)(pintfpriv->allocated_io_rwmem) & 3); + } + +#ifndef PLATFORM_OS_CE + + // init io_r_mem buffer + pintfpriv->allocated_io_r_mem = rtw_zmalloc(pintfpriv->max_iosz +4); + if (pintfpriv->allocated_io_r_mem == NULL) + { + rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz +4); + return _FAIL; + } + else + { + // word align the io_rwmem + pintfpriv->io_r_mem = pintfpriv->allocated_io_r_mem + 4 - ( (u32)(pintfpriv->allocated_io_r_mem) & 3); + } +#endif + + return _SUCCESS; +} + +void usb_unload_intf_priv(struct intf_priv *pintfpriv) +{ +#ifndef PLATFORM_OS_CE + + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4); + rtw_mfree((u8 *)(pintfpriv->allocated_io_r_mem), pintfpriv->max_iosz+4); +#endif + + RT_TRACE( _module_hci_ops_os_c_, _drv_info_, ("%s(%u)\n",__FUNCTION__, __LINE__)); +} + + + +void usb_write_port_cancel(_adapter *padapter) +{ + + sint i,j; + struct dvobj_priv *pdev = &padapter->dvobjpriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + struct xmit_frame *pxmitframe; + + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++ + _rtw_spinunlock(&pxmitpriv->lock); + + if (pxmitpriv->txirp_cnt) + { + // Canceling Pending Recv Irp + pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; + + for( i = 0; i < NR_XMITFRAME; i++ ) + { + for(j=0;j<8;j++) + { + if (pxmitframe->bpending[j]==_TRUE) + { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n")); + + } + } + + pxmitframe++; + } + + _rtw_down_sema(&(pxmitpriv->tx_retevt)); + + } + +} + +DWORD usbctrl_vendorreq_complete(LPVOID lpvNotifyParameter) +{ + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv*)lpvNotifyParameter; + + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq_complete\n")); + + return STATUS_SUCCESS; +} + + +int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + u8 ret=_TRUE; +// NTSTATUS ntstatus; +// int fComplete; +// LPCUSB_DEVICE lpDeviceInfo; + + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev; + + USB_TRANSFER usbTrans; + USB_DEVICE_REQUEST usb_device_req; + USB_HANDLE usbHandle = pdvobjpriv->usb_extension._hDevice; + LPCUSB_FUNCS usbFuncs = pdvobjpriv->usb_extension._lpUsbFuncs; + + u32 transfer_flags = 0; + + _func_enter_; + + memset( &usb_device_req, 0, sizeof( USB_DEVICE_REQUEST ) ); + + if( 0x01 == requesttype ) + { + usb_device_req.bmRequestType = USB_REQUEST_DEVICE_TO_HOST | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE; + } + else + { + usb_device_req.bmRequestType = USB_REQUEST_HOST_TO_DEVICE | USB_REQUEST_VENDOR | USB_REQUEST_FOR_DEVICE; + } + + usb_device_req.bRequest = request; + usb_device_req.wValue = value; + usb_device_req.wIndex = index; + usb_device_req.wLength = len; + + if (requesttype == 0x01) + { + transfer_flags = USB_IN_TRANSFER;//read_in + } + else + { + transfer_flags= USB_OUT_TRANSFER;//write_out + } + + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("+usbctrl_vendorreq\n",__FUNCTION__,__LINE__)); + +#if 0 + // Remember to add callback for sync + usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle, + usbctrl_vendorreq_complete, pdvobjpriv, + transfer_flags, &usb_device_req, pdata, 0); +#else + // Remember to add callback for sync + usbTrans = (*usbFuncs->lpIssueVendorTransfer)(usbHandle, + NULL, 0, + transfer_flags, &usb_device_req, pdata, 0); +#endif + +// rtw_usleep_os(10); + + if ( usbTrans ) + { + DWORD dwBytes = 0; + DWORD dwErr = USB_CANCELED_ERROR; + int fComplete; + + (*usbFuncs->lpGetTransferStatus)(usbTrans, &dwBytes, &dwErr); + + fComplete = (*usbFuncs->lpIsTransferComplete)(usbTrans); + + if (fComplete== _TRUE) + { + (*usbFuncs->lpCloseTransfer)(usbTrans); + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("usbctrl_vendorreq lpCloseTransfer\n")); + } + + if ( dwErr != USB_NO_ERROR || fComplete != _TRUE) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq lpCloseTransfer without complete\n")); + ret = _FALSE; + goto exit; + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq without usbTrans\n")); + ret = _FALSE; + goto exit; + + } + +exit: + RT_TRACE(_module_hci_ops_os_c_,_drv_debug_,("-usbctrl_vendorreq\n")); +_func_exit_; + + return ret; + +} + + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c new file mode 100755 index 000000000000..f6ef89eb1abf --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_linux.c @@ -0,0 +1,1980 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_OPS_OS_C_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +struct zero_bulkout_context{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + +#define REALTEK_USB_VENQT_MAX_BUF_SIZE 254 + +#define RTW_USB_CONTROL_MSG_TIMEOUT_TEST 10 //ms +#define RTW_USB_CONTROL_MSG_TIMEOUT 500 //ms +//#define RTW_USB_CONTROL_MSG_TIMEOUT 5000 //ms + +#if defined(CONFIG_VENDOR_REQ_RETRY) && defined(CONFIG_USB_VENDOR_REQ_MUTEX) +//vendor req retry should be in the situation when each vendor req is atomically submitted from others +#define MAX_USBCTRL_VENDORREQ_TIMES 10 +#else +#define MAX_USBCTRL_VENDORREQ_TIMES 1 +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) +#define _usbctrl_vendorreq_async_callback(urb, regs) _usbctrl_vendorreq_async_callback(urb) +#define usb_bulkout_zero_complete(purb, regs) usb_bulkout_zero_complete(purb) +#define usb_write_mem_complete(purb, regs) usb_write_mem_complete(purb) +#define usb_write_port_complete(purb, regs) usb_write_port_complete(purb) +#define usb_read_port_complete(purb, regs) usb_read_port_complete(purb) +#define usb_read_interrupt_complete(purb, regs) usb_read_interrupt_complete(purb) +#endif + +static int usbctrl_vendorreq(struct dvobj_priv *pdvobjpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + _adapter *padapter = pdvobjpriv->padapter ; + struct usb_device *udev=pdvobjpriv->pusbdev; + + unsigned int pipe; + int status = 0; + u32 tmp_buflen=0; + u8 reqtype; + u8 *pIo_buf; + int vendorreq_times = 0; + + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE + u8 *tmp_buf; + #else // use stack memory + u8 tmp_buf[MAX_USB_IO_CTL_SIZE]; + #endif + + //DBG_871X("%s %s:%d\n",__FUNCTION__, current->comm, current->pid); + + if((padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:(padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return -EPERM; + } + + if(len>MAX_VENDOR_REQ_CMD_SIZE){ + DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ ); + return -EINVAL; + } + + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); + #endif + + + // Acquire IO memory for vendorreq +#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + pIo_buf = pdvobjpriv->usb_vendor_req_buf; +#else + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE + tmp_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT); + tmp_buflen = (u32)len + ALIGNMENT_UNIT; + #else // use stack memory + tmp_buflen = MAX_USB_IO_CTL_SIZE; + #endif + + // Added by Albert 2010/02/09 + // For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment. + // Trying to fix it here. + pIo_buf = (tmp_buf==NULL)?NULL:tmp_buf + ALIGNMENT_UNIT -((SIZE_PTR)(tmp_buf) & 0x0f ); +#endif + + if ( pIo_buf== NULL) { + DBG_8192C( "[%s] pIo_buf == NULL \n", __FUNCTION__ ); + status = -ENOMEM; + goto RELEASE_MUTEX; + } + + while(++vendorreq_times<= MAX_USBCTRL_VENDORREQ_TIMES) + { + _rtw_memset(pIo_buf, 0, len); + + if (requesttype == 0x01) + { + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else + { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + _rtw_memcpy( pIo_buf, pdata, len); + } + + #if 0 + //timeout test for firmware downloading + status = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len + , ((value >= FW_8192C_START_ADDRESS && value <= FW_8192C_END_ADDRESS) ||value!=0x1000) ?RTW_USB_CONTROL_MSG_TIMEOUT : RTW_USB_CONTROL_MSG_TIMEOUT_TEST + ); + #else + status = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT); + #endif + + if ( status == len) // Success this control transfer. + { + rtw_reset_continual_urb_error(&padapter->dvobjpriv); + if ( requesttype == 0x01 ) + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. + _rtw_memcpy( pdata, pIo_buf, len ); + } + } + else { // error cases + DBG_8192C("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n" + , value,(requesttype == 0x01)?"read":"write" , len, status, *(u32*)pdata, vendorreq_times); + + if (status < 0) { + if(status == (-ESHUTDOWN) || status == -ENODEV ) + { + padapter->bSurpriseRemoved = _TRUE; + } else { + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL; + } + #endif + } + } + else // status != len && status >= 0 + { + if(status > 0) { + if ( requesttype == 0x01 ) + { // For Control read transfer, we have to copy the read data from pIo_buf to pdata. + _rtw_memcpy( pdata, pIo_buf, len ); + } + } + } + + if(rtw_inc_and_chk_continual_urb_error(&padapter->dvobjpriv) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + break; + } + + } + + // firmware download is checksumed, don't retry + if( (value >= FW_8192C_START_ADDRESS && value <= FW_8192C_END_ADDRESS) || status == len ) + break; + + } + + // release IO memory used by vendorreq + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE + rtw_mfree(tmp_buf, tmp_buflen); + #endif + +RELEASE_MUTEX: + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL); +#endif + + return status; + +} + +static u8 usb_read8(struct intf_hdl *pintfhdl, u32 addr) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data=0; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x01;//read_in + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 1; + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return (u8)(le32_to_cpu(data)&0x0ff); + +} + +static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data=0; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x01;//read_in + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 2; + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return (u16)(le32_to_cpu(data)&0xffff); + +} + +static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data=0; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x01;//read_in + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 4; + + usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return le32_to_cpu(data); + +} + +static int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 1; + + data = val; + data = cpu_to_le32(data&0x000000ff); + + ret = usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return ret; + +} + +static int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 2; + + data = val; + data = cpu_to_le32(data&0x0000ffff); + + ret = usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return ret; + +} + +static int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = 4; + data = cpu_to_le32(val); + + + ret =usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, &data, len, requesttype); + + _func_exit_; + + return ret; + +} +#define VENDOR_CMD_MAX_DATA_LEN 254 +static int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u16 len; + u8 buf[VENDOR_CMD_MAX_DATA_LEN]={0}; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + + _func_enter_; + + request = 0x05; + requesttype = 0x00;//write_out + index = 0;//n/a + + wvalue = (u16)(addr&0x0000ffff); + len = length; + _rtw_memcpy(buf, pdata, len ); + + ret = usbctrl_vendorreq(pdvobjpriv, request, wvalue, index, buf, len, requesttype); + + _func_exit_; + + return ret; + +} + +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ +static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs) +{ + if(urb){ + if(urb->context){ + kfree(urb->context); + } + usb_free_urb(urb); + } +} + +static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + + int rc; + unsigned int pipe; + u8 reqtype; + struct usb_ctrlrequest *dr; + struct urb *urb; + struct rtl819x_async_write_data { + u8 data[REALTEK_USB_VENQT_MAX_BUF_SIZE]; + struct usb_ctrlrequest dr; + } *buf; + + if (requesttype == VENDOR_READ){ + pipe = usb_rcvctrlpipe(udev, 0);//read_in + reqtype = REALTEK_USB_VENQT_READ; + } + else { + pipe = usb_sndctrlpipe(udev, 0);//write_out + reqtype = REALTEK_USB_VENQT_WRITE; + } + + //buf = kmalloc(sizeof(*buf), GFP_ATOMIC); + buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf)); + if (!buf) + return -ENOMEM; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + rtw_mfree((u8*)buf,sizeof(*buf)); + return -ENOMEM; + } + + dr = &buf->dr; + + dr->bRequestType = reqtype; + dr->bRequest = request; + dr->wValue = cpu_to_le16(value); + dr->wIndex = cpu_to_le16(index); + dr->wLength = cpu_to_le16(len); + + _rtw_memcpy(buf, pdata, len); + + usb_fill_control_urb(urb, udev, pipe, + (unsigned char *)dr, buf, len, + _usbctrl_vendorreq_async_callback, buf); + + rc = usb_submit_urb(urb, GFP_ATOMIC); + if (rc < 0) { + rtw_mfree((u8*)buf,sizeof(*buf)); + usb_free_urb(urb); + } + return rc; + +} + +static int usb_write_async(struct usb_device *udev, u32 addr, u32 val, u16 len) +{ + u8 request; + u8 requesttype; + u16 wvalue; + u16 index; + u32 data; + int ret; + + requesttype = VENDOR_WRITE;//write_out + request = REALTEK_USB_VENQT_CMD_REQ; + index = REALTEK_USB_VENQT_CMD_IDX;//n/a + + wvalue = (u16)(addr&0x0000ffff); + data = val & (0xffffffff >> ((4 - len) * 8)); + data = cpu_to_le32(data); + + ret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, &data, len, requesttype); + + return ret; +} +static int usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val) +{ + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = cpu_to_le32(val & 0xFF); + ret = usb_write_async(udev, addr, val, 1); + _func_exit_; + + return ret; +} + +static int usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val) +{ + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = cpu_to_le32(val & 0xFFFF); + ret = usb_write_async(udev, addr, val, 2); + _func_exit_; + + return ret; +} +static int usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val) +{ + u32 data; + int ret; + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfhdl->pintf_dev; + struct usb_device *udev=pdvobjpriv->pusbdev; + + _func_enter_; + data = cpu_to_le32(val); + ret = usb_write_async(udev, addr, val, 4); + _func_exit_; + + return ret; +} +#endif + +static int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) +{ + int pipe=0, ep_num=0; + _adapter *padapter = pdvobj->padapter; + struct usb_device *pusbd = pdvobj->pusbdev; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if(addr == RECV_BULK_IN_ADDR) + { + pipe=usb_rcvbulkpipe(pusbd, 0x01); + + return pipe; + } + + if(addr == RECV_INT_IN_ADDR) + { + pipe=usb_rcvbulkpipe(pusbd, 0x04); + + return pipe; + } + + if(addr < HW_QUEUE_ENTRY) + { + ep_num = (pHalData->Queue2EPNum[(u8)addr] & 0x0f); + + pipe = usb_sndbulkpipe(pusbd, ep_num); + + return pipe; + } + + return pipe; + +} + +static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context; + + //DBG_8192C("+usb_bulkout_zero_complete\n"); + + if(pcontext) + { + if(pcontext->pbuf) + { + rtw_mfree(pcontext->pbuf, sizeof(int)); + } + + if(pcontext->purb && (pcontext->purb==purb)) + { + usb_free_urb(pcontext->purb); + } + + + rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context)); + } + + +} + +static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + int pipe, status, len; + u32 ret; + unsigned char *pbuf; + struct zero_bulkout_context *pcontext; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + + //DBG_8192C("+usb_bulkout_zero\n"); + + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + return _FAIL; + } + + + pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context)); + + pbuf = (unsigned char *)rtw_zmalloc(sizeof(int)); + purb = usb_alloc_urb(0, GFP_ATOMIC); + + len = 0; + pcontext->pbuf = pbuf; + pcontext->purb = purb; + pcontext->pirp = NULL; + pcontext->padapter = padapter; + + + //translate DMA FIFO addr to pipehandle + //pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + pbuf, + len, + usb_bulkout_zero_complete, + pcontext);//context is pcontext + + status = usb_submit_urb(purb, GFP_ATOMIC); + + if (!status) + { + ret= _SUCCESS; + } + else + { + ret= _FAIL; + } + + + return _SUCCESS; + +} + +static void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + +} + +static void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + +} + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE +static void usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs) +{ + int err; + _adapter *padapter = (_adapter *)purb->context; + + if(purb->status==0)//SUCCESS + { + if (purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX)) + { + DBG_8192C("usb_read_interrupt_complete: purb->actual_length > sizeof(INTERRUPT_MSG_FORMAT_EX) \n"); + } + + err = usb_submit_urb(purb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, purb->status); + } + } + else + { + DBG_8192C("###=> usb_read_interrupt_complete => urb status(%d)\n", purb->status); + + switch(purb->status) { + case -EINVAL: + case -EPIPE: + case -ENODEV: + case -ESHUTDOWN: + //padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); + case -ENOENT: + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); + break; + case -EPROTO: + break; + case -EINPROGRESS: + DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); + break; + default: + break; + } + } + +} + +static u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr) +{ + int err, pipe; + u32 ret = _SUCCESS; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; + _adapter *adapter = (_adapter *)pdvobj->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + +_func_enter_; + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe, + precvpriv->int_in_buf, + sizeof(INTERRUPT_MSG_FORMAT_EX), + usb_read_interrupt_complete, + adapter, + 1); + + err = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n",err, precvpriv->int_in_urb->status); + ret = _FAIL; + } + +_func_exit_; + + return ret; +} +#endif + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX +static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf) +{ + u8 *pbuf; + u8 frag, mf, shift_sz = 0; + u16 pkt_cnt, drvinfo_sz; + u32 pkt_len, pkt_offset, skb_len, alloc_sz; + s32 transfer_len; + struct recv_stat *prxstat; + _pkt *pkt_copy = NULL; + union recv_frame *precvframe = NULL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &precvpriv->free_recv_queue; + + + transfer_len = (s32)precvbuf->transfer_len; + pbuf = precvbuf->pbuf; + + prxstat = (struct recv_stat *)pbuf; + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + +#if 0 //temp remove when disable usb rx aggregation + if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_lenrxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4)); + + prxstat = (struct recv_stat *)pbuf; + pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff; + + + mf = (le32_to_cpu(prxstat->rxdw1) >> 27) & 0x1;//more fragment bit + frag = (le32_to_cpu(prxstat->rxdw2) >> 12) & 0xf;//fragmentation number + + drvinfo_sz = (le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16; + drvinfo_sz = drvinfo_sz << 3;//uint (2^3) = 8 bytes; REG_RX_DRVINFO_SZ + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: DRV_INFO_SIZE=%d\n", drvinfo_sz)); + + pkt_offset = pkt_len + drvinfo_sz + RXDESC_SIZE; + + if((pkt_len<=0) || (pkt_offset>transfer_len)) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n")); + goto _exit_recvbuf2recvframe; + } + + // Modified by Albert 20101213 + // For 8 bytes IP header alignment. + if ( ( le32_to_cpu( prxstat->rxdw0 ) >> 23 ) & 0x01 ) // Qos data, wireless lan header length is 26 + { + shift_sz = 6; + } + else + { + shift_sz = 0; + } + + precvframe = rtw_alloc_recvframe(pfree_recv_queue); + if(precvframe==NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n")); + goto _exit_recvbuf2recvframe; + } + + _rtw_init_listhead(&precvframe->u.hdr.list); + precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch. + precvframe->u.hdr.len=0; + + //skb_len = pkt_offset; + skb_len = pkt_len; + + // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. + // modify alloc_sz for recvive crc error packet by thomas 2011-06-02 + if((mf ==1)&&(frag == 0)){ + //alloc_sz = 1664; //1664 is 128 alignment. + if(skb_len <= 1650) + alloc_sz = 1664; + else + alloc_sz = skb_len + 14; + } + else { + alloc_sz = skb_len; + // 6 is for IP header 8 bytes alignment in QoS packet case. + // 8 is for skb->data 4 bytes alignment. + alloc_sz += 14; + } + + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pkt_copy = dev_alloc_skb(alloc_sz); +#else + pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); +#endif + if(pkt_copy) + { + pkt_copy->dev = padapter->pnetdev; + precvframe->u.hdr.pkt = pkt_copy; + skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address + skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz. + _rtw_memcpy(pkt_copy->data, (pbuf + drvinfo_sz + RXDESC_SIZE), skb_len); + precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data; + precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz; + } + else + { + DBG_8192C("recvbuf2recvframe:can not allocate memory for skb copy\n"); + //precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + //precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf; + //precvframe->u.hdr.rx_end = pbuf + (pkt_offset>1612?pkt_offset:1612); + + precvframe->u.hdr.pkt = NULL; + rtw_free_recvframe(precvframe, pfree_recv_queue); + + goto _exit_recvbuf2recvframe; + } + + recvframe_put(precvframe, skb_len); + //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); + +#ifdef CONFIG_USB_RX_AGGREGATION + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + case USB_RX_AGG_MIX: + pkt_offset = (u16)_RND128(pkt_offset); + break; + case USB_RX_AGG_USB: + pkt_offset = (u16)_RND4(pkt_offset); + break; + case USB_RX_AGG_DISABLE: + default: + break; + } +#endif + + //because the endian issue, driver avoid reference to the rxstat after calling update_recvframe_attrib_from_recvstat(); + rtl8192cu_update_recvframe_attrib_from_recvstat(precvframe, prxstat); + + if(rtw_recv_entry(precvframe) != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); + } + + pkt_cnt--; + transfer_len -= pkt_offset; + pbuf += pkt_offset; + precvframe = NULL; + pkt_copy = NULL; + + if(transfer_len>0 && pkt_cnt==0) + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + + }while((transfer_len>0) && (pkt_cnt>0)); + +_exit_recvbuf2recvframe: + + return _SUCCESS; +} + +void rtl8192cu_recv_tasklet(void *priv) +{ + struct recv_buf *precvbuf = NULL; + _adapter *padapter = (_adapter*)priv; + struct recv_priv *precvpriv = &padapter->recvpriv; + + while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) + { + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) + { + DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); + + break; + } + + + recvbuf2recvframe(padapter, precvbuf); + + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + +} + +static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) +{ + struct recv_buf *precvbuf = (struct recv_buf *)purb->context; + _adapter *padapter =(_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); + + precvpriv->rx_pending_cnt --; + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + + goto exit; + } + + if(purb->status==0)//SUCCESS + { + if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n")); + + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + rtw_reset_continual_urb_error(&padapter->dvobjpriv); + + precvbuf->transfer_len = purb->actual_length; + + //rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf); + rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue); + + tasklet_schedule(&precvpriv->recv_tasklet); + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status)); + + DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); + + if(rtw_inc_and_chk_continual_urb_error(&padapter->dvobjpriv) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + } + + switch(purb->status) { + case -EINVAL: + case -EPIPE: + case -ENODEV: + case -ESHUTDOWN: + //padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); + case -ENOENT: + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); + break; + case -EPROTO: + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL; + } + #endif + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + break; + case -EINPROGRESS: + DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); + break; + default: + break; + } + + } + +exit: + +_func_exit_; + +} + +static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + int err, pipe; + u32 ret = _SUCCESS; + PURB purb = NULL; + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; + _adapter *adapter = (_adapter *)pdvobj->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + +_func_enter_; + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + if(precvbuf !=NULL) + { + rtl8192cu_init_recvbuf(adapter, precvbuf); + + if(precvbuf->pbuf) + { + precvpriv->rx_pending_cnt++; + + purb = precvbuf->purb; + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + precvbuf->pbuf, + MAX_RECVBUF_SZ, + usb_read_port_complete, + precvbuf);//context is precvbuf + + purb->transfer_dma = precvbuf->dma_transfer_addr; + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + err = usb_submit_urb(purb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status)); + DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status); + ret = _FAIL; + } + + } + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n")); + ret = _FAIL; + } + +_func_exit_; + + return ret; +} +#else // CONFIG_USE_USB_BUFFER_ALLOC_RX +static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb) +{ + u8 *pbuf; + u8 frag, mf, shift_sz = 0; + u16 pkt_cnt, drvinfo_sz; + u32 pkt_len, pkt_offset, skb_len, alloc_sz; + s32 transfer_len; + struct recv_stat *prxstat; + _pkt *pkt_copy = NULL; + union recv_frame *precvframe = NULL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct recv_priv *precvpriv = &padapter->recvpriv; + _queue *pfree_recv_queue = &precvpriv->free_recv_queue; + + + transfer_len = (s32)pskb->len; + pbuf = pskb->data; + + prxstat = (struct recv_stat *)pbuf; + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + +#if 0 //temp remove when disable usb rx aggregation + if((pkt_cnt > 10) || (pkt_cnt < 1) || (transfer_lenrxdw0, prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4)); + + prxstat = (struct recv_stat *)pbuf; + pkt_len = le32_to_cpu(prxstat->rxdw0)&0x00003fff; + + mf = (le32_to_cpu(prxstat->rxdw1) >> 27) & 0x1;//more fragment bit + frag = (le32_to_cpu(prxstat->rxdw2) >> 12) & 0xf;//fragmentation number + + drvinfo_sz = (le32_to_cpu(prxstat->rxdw0) & 0x000f0000) >> 16; + drvinfo_sz = drvinfo_sz << 3;//uint (2^3) = 8 bytes; REG_RX_DRVINFO_SZ + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: DRV_INFO_SIZE=%d\n", drvinfo_sz)); + + pkt_offset = pkt_len + drvinfo_sz + RXDESC_SIZE; + + if((pkt_len<=0) || (pkt_offset>transfer_len)) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("recvbuf2recvframe: pkt_len<=0\n")); + goto _exit_recvbuf2recvframe; + } + + // Modified by Albert 20101213 + // For 8 bytes IP header alignment. + if ( ( le32_to_cpu( prxstat->rxdw0 ) >> 23 ) & 0x01 ) // Qos data, wireless lan header length is 26 + { + shift_sz = 6; + } + else + { + shift_sz = 0; + } + + precvframe = rtw_alloc_recvframe(pfree_recv_queue); + if(precvframe==NULL) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: precvframe==NULL\n")); + goto _exit_recvbuf2recvframe; + } + + _rtw_init_listhead(&precvframe->u.hdr.list); + precvframe->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch. + precvframe->u.hdr.len=0; + + //skb_len = pkt_offset; + skb_len = pkt_len; + + // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet. + // modify alloc_sz for recvive crc error packet by thomas 2011-06-02 + if((mf ==1)&&(frag == 0)){ + //alloc_sz = 1664; //1664 is 128 alignment. + if(skb_len <= 1650) + alloc_sz = 1664; + else + alloc_sz = skb_len + 14; + } + else { + alloc_sz = skb_len; + // 6 is for IP header 8 bytes alignment in QoS packet case. + // 8 is for skb->data 4 bytes alignment. + alloc_sz += 14; + } + + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + pkt_copy = dev_alloc_skb(alloc_sz); +#else + pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz); +#endif + if(pkt_copy) + { + pkt_copy->dev = padapter->pnetdev; + precvframe->u.hdr.pkt = pkt_copy; + skb_reserve( pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data ) & 7 ));//force pkt_copy->data at 8-byte alignment address + skb_reserve( pkt_copy, shift_sz );//force ip_hdr at 8-byte alignment address according to shift_sz. + _rtw_memcpy(pkt_copy->data, (pbuf + drvinfo_sz + RXDESC_SIZE), skb_len); + precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data; + precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz; + } + else + { + precvframe->u.hdr.pkt = skb_clone(pskb, GFP_ATOMIC); + if(pkt_copy) + { + precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pbuf; + precvframe->u.hdr.rx_end = pbuf + alloc_sz; + } + else + { + DBG_8192C("recvbuf2recvframe: skb_clone fail\n"); + goto _exit_recvbuf2recvframe; + } + } + + recvframe_put(precvframe, skb_len); + //recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); + +#ifdef CONFIG_USB_RX_AGGREGATION + switch(pHalData->UsbRxAggMode) + { + case USB_RX_AGG_DMA: + case USB_RX_AGG_MIX: + pkt_offset = (u16)_RND128(pkt_offset); + break; + case USB_RX_AGG_USB: + pkt_offset = (u16)_RND4(pkt_offset); + break; + case USB_RX_AGG_DISABLE: + default: + break; + } +#endif + + //because the endian issue, driver avoid reference to the rxstat after calling update_recvframe_attrib_from_recvstat(); + rtl8192cu_update_recvframe_attrib_from_recvstat(precvframe, prxstat); + + if(rtw_recv_entry(precvframe) != _SUCCESS) + { + RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); + } + + pkt_cnt--; + transfer_len -= pkt_offset; + pbuf += pkt_offset; + precvframe = NULL; + pkt_copy = NULL; + + if(transfer_len>0 && pkt_cnt==0) + pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff; + + }while((transfer_len>0) && (pkt_cnt>0)); + +_exit_recvbuf2recvframe: + + return _SUCCESS; +} + +void rtl8192cu_recv_tasklet(void *priv) +{ + _pkt *pskb; + _adapter *padapter = (_adapter*)priv; + struct recv_priv *precvpriv = &padapter->recvpriv; + + while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) + { + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) + { + DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); + dev_kfree_skb_any(pskb); + break; + } + + recvbuf2recvframe(padapter, pskb); + +#ifdef CONFIG_PREALLOC_RECV_SKB + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + skb_reset_tail_pointer(pskb); +#else + pskb->tail = pskb->data; +#endif + pskb->len = 0; + + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); + +#else + dev_kfree_skb_any(pskb); +#endif + + } + +} + + +static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) +{ + _irqL irqL; + uint isevt, *pbuf; + struct recv_buf *precvbuf = (struct recv_buf *)purb->context; + _adapter *padapter =(_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &padapter->recvpriv; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); + + //_enter_critical(&precvpriv->lock, &irqL); + //precvbuf->irp_pending=_FALSE; + //precvpriv->rx_pending_cnt --; + //_exit_critical(&precvpriv->lock, &irqL); + + precvpriv->rx_pending_cnt --; + + //if(precvpriv->rx_pending_cnt== 0) + //{ + // RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n")); + // _rtw_up_sema(&precvpriv->allrxreturnevt); + //} + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped||padapter->bReadPortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + + #ifdef CONFIG_PREALLOC_RECV_SKB + precvbuf->reuse = _TRUE; + #else + if(precvbuf->pskb){ + DBG_8192C("==> free skb(%p)\n",precvbuf->pskb); + dev_kfree_skb_any(precvbuf->pskb); + } + #endif + + goto exit; + } + + if(purb->status==0)//SUCCESS + { + if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\n")); + precvbuf->reuse = _TRUE; + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + rtw_reset_continual_urb_error(&padapter->dvobjpriv); + + precvbuf->transfer_len = purb->actual_length; + skb_put(precvbuf->pskb, purb->actual_length); + skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb); + + if (skb_queue_len(&precvpriv->rx_skb_queue)<=1) + tasklet_schedule(&precvpriv->recv_tasklet); + + precvbuf->pskb = NULL; + precvbuf->reuse = _FALSE; + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status)); + + DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status); + + if(rtw_inc_and_chk_continual_urb_error(&padapter->dvobjpriv) == _TRUE ){ + padapter->bSurpriseRemoved = _TRUE; + } + + switch(purb->status) { + case -EINVAL: + case -EPIPE: + case -ENODEV: + case -ESHUTDOWN: + //padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n")); + case -ENOENT: + padapter->bDriverStopped=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n")); + break; + case -EPROTO: + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL; + } + #endif + precvbuf->reuse = _TRUE; + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + break; + case -EINPROGRESS: + DBG_8192C("ERROR: URB IS IN PROGRESS!/n"); + break; + default: + break; + } + + } + +exit: + +_func_exit_; + +} + +static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + _irqL irqL; + int err, pipe; + SIZE_PTR tmpaddr=0; + SIZE_PTR alignment=0; + u32 ret = _SUCCESS; + PURB purb = NULL; + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)pintfhdl->pintf_dev; + _adapter *adapter = (_adapter *)pdvobj->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct usb_device *pusbd = pdvobj->pusbdev; + + +_func_enter_; + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + +#ifdef CONFIG_PREALLOC_RECV_SKB + if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) + { + if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue))) + { + precvbuf->reuse = _TRUE; + } + } +#endif + + + if(precvbuf !=NULL) + { + rtl8192cu_init_recvbuf(adapter, precvbuf); + + //re-assign for linux based on skb + if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL)) + { + //precvbuf->pskb = alloc_skb(MAX_RECVBUF_SZ, GFP_ATOMIC);//don't use this after v2.6.25 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) // http://www.mail-archive.com/netdev@vger.kernel.org/msg17214.html + precvbuf->pskb = dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#else + precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#endif + if(precvbuf->pskb == NULL) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("init_recvbuf(): alloc_skb fail!\n")); + return _FAIL; + } + + tmpaddr = (SIZE_PTR)precvbuf->pskb->data; + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1); + skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); + + precvbuf->phead = precvbuf->pskb->head; + precvbuf->pdata = precvbuf->pskb->data; + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + precvbuf->ptail = precvbuf->pskb->head + precvbuf->pskb->tail; + precvbuf->pend = precvbuf->ptail + (MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#else + precvbuf->ptail = precvbuf->pskb->tail; + precvbuf->pend = precvbuf->pskb->end; +#endif + precvbuf->pbuf = precvbuf->pskb->data; + } + else//reuse skb + { + precvbuf->phead = precvbuf->pskb->head; + precvbuf->pdata = precvbuf->pskb->data; + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + precvbuf->ptail = precvbuf->pskb->head + precvbuf->pskb->tail; + precvbuf->pend = precvbuf->ptail + (MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); +#else + precvbuf->ptail = precvbuf->pskb->tail; + precvbuf->pend = precvbuf->pskb->end; +#endif + precvbuf->pbuf = precvbuf->pskb->data; + + precvbuf->reuse = _FALSE; + } + + //_enter_critical(&precvpriv->lock, &irqL); + //precvpriv->rx_pending_cnt++; + //precvbuf->irp_pending = _TRUE; + //_exit_critical(&precvpriv->lock, &irqL); + + precvpriv->rx_pending_cnt++; + + purb = precvbuf->purb; + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + + usb_fill_bulk_urb(purb, pusbd, pipe, + precvbuf->pbuf, + MAX_RECVBUF_SZ, + usb_read_port_complete, + precvbuf);//context is precvbuf + + err = usb_submit_urb(purb, GFP_ATOMIC); + if((err) && (err != (-EPERM))) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status)); + DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status); + ret = _FAIL; + } + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precvbuf ==NULL\n")); + ret = _FAIL; + } + +_func_exit_; + + return ret; +} +#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX + +static void usb_read_port_cancel(struct intf_hdl *pintfhdl) +{ + int i; + struct recv_buf *precvbuf; + _adapter *padapter = pintfhdl->padapter; + precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; + + DBG_8192C("usb_read_port_cancel \n"); + + padapter->bReadPortCancel = _TRUE; + + for(i=0; i < NR_RECVBUFF ; i++) + { + precvbuf->reuse = _TRUE; + if(precvbuf->purb) + { + //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n"); + usb_kill_urb(precvbuf->purb); + } + + precvbuf++; + } + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + usb_kill_urb(padapter->recvpriv.int_in_urb); +#endif +} + +void rtl8192cu_xmit_tasklet(void *priv) +{ + int ret = _FALSE; + _adapter *padapter = (_adapter*)priv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + if(check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE) + return; + + while(1) + { + if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE) || (padapter->bWritePortCancel == _TRUE)) + { + DBG_8192C("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n"); + break; + } + + ret = rtl8192cu_xmitframe_complete(padapter, pxmitpriv, NULL); + + if(ret==_FALSE) + break; + + } + +} + +static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) +{ + _irqL irqL; + int i; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; + //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + //_adapter *padapter = pxmitframe->padapter; + _adapter *padapter = pxmitbuf->padapter; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + //struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port_complete\n")); + + + switch(pxmitbuf->flags) + { + case XMIT_VO_QUEUE: + pxmitpriv->voq_cnt--; + break; + case XMIT_VI_QUEUE: + pxmitpriv->viq_cnt--; + break; + case XMIT_BE_QUEUE: + pxmitpriv->beq_cnt--; + break; + case XMIT_BK_QUEUE: + pxmitpriv->bkq_cnt--; + break; + case HIGH_QUEUE_INX: +#ifdef CONFIG_AP_MODE + rtw_chk_hi_queue_cmd(padapter); +#endif + break; + default: + break; + } + + +/* + _enter_critical(&pxmitpriv->lock, &irqL); + + pxmitpriv->txirp_cnt--; + + switch(pattrib->priority) + { + case 1: + case 2: + pxmitpriv->bkq_cnt--; + //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt); + break; + case 4: + case 5: + pxmitpriv->viq_cnt--; + //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt); + break; + case 6: + case 7: + pxmitpriv->voq_cnt--; + //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt); + break; + case 0: + case 3: + default: + pxmitpriv->beq_cnt--; + //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt); + break; + + } + + _exit_critical(&pxmitpriv->lock, &irqL); + + + if(pxmitpriv->txirp_cnt==0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } +*/ + //rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + + if(padapter->bSurpriseRemoved || padapter->bDriverStopped ||padapter->bWritePortCancel) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + goto exit; + } + + + if(purb->status==0) + { + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status)); + DBG_8192C("###=> urb_write_port_complete status(%d)\n",purb->status); + if((purb->status==-EPIPE)||(purb->status==-EPROTO)) + { + //usb_clear_halt(pusbdev, purb->pipe); + //msleep(10); + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.Wifi_Error_Status = USB_WRITE_PORT_FAIL; + } + #endif + } + else if(purb->status == -EINPROGRESS) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n")); + } + else if(purb->status == (-ESHUTDOWN)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n")); + + padapter->bDriverStopped=_TRUE; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n")); + + goto exit; + } + else + { + padapter->bSurpriseRemoved=_TRUE; + DBG_8192C("bSurpriseRemoved=TRUE\n"); + //rtl8192cu_trigger_gpio_0(padapter); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n")); + + goto exit; + } + + + + } + + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time(); + } + #endif + + //if(rtw_txframes_pending(padapter)) + { + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + } + + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port_complete\n")); + +exit: + +_func_exit_; + +} + +static u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + _irqL irqL; + int pipe, status; + u32 ret, bwritezero = _FALSE; + PURB purb = NULL; + _adapter *padapter = (_adapter *)pintfhdl->padapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem; + struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; + struct usb_device *pusbd = pdvobj->pusbdev; + struct pkt_attrib *pattrib = &pxmitframe->attrib; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n")); + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + #ifdef DBG_TX + DBG_871X(" DBG_TX %s:%d bDriverStopped%d, bSurpriseRemoved:%d, pnp_bstop_trx:%d\n",__FUNCTION__, __LINE__ + ,padapter->bDriverStopped, padapter->bSurpriseRemoved, padapter->pwrctrlpriv.pnp_bstop_trx ); + #endif + + rtw_free_xmitbuf(pxmitpriv, pxmitbuf); + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + _enter_critical(&pxmitpriv->lock, &irqL); + + switch(addr) + { + case VO_QUEUE_INX: + pxmitpriv->voq_cnt++; + pxmitbuf->flags = XMIT_VO_QUEUE; + break; + case VI_QUEUE_INX: + pxmitpriv->viq_cnt++; + pxmitbuf->flags = XMIT_VI_QUEUE; + break; + case BE_QUEUE_INX: + pxmitpriv->beq_cnt++; + pxmitbuf->flags = XMIT_BE_QUEUE; + break; + case BK_QUEUE_INX: + pxmitpriv->bkq_cnt++; + pxmitbuf->flags = XMIT_BK_QUEUE; + break; + case HIGH_QUEUE_INX: + pxmitbuf->flags = HIGH_QUEUE_INX; + break; + default: + pxmitbuf->flags = XMIT_VO_QUEUE; + break; + } + + _exit_critical(&pxmitpriv->lock, &irqL); + +/* + _enter_critical(&pxmitpriv->lock, &irqL); + + //total irp + pxmitpriv->txirp_cnt++; + + //per ac irp + switch(pattrib->priority) + { + case 1: + case 2: + pxmitpriv->bkq_cnt++; + break; + case 4: + case 5: + pxmitpriv->viq_cnt++; + break; + case 6: + case 7: + pxmitpriv->voq_cnt++; + break; + case 0: + case 3: + default: + pxmitpriv->beq_cnt++; + break; + } + + + _exit_critical(&pxmitpriv->lock, &irqL); +*/ + + purb = pxmitbuf->pxmit_urb[0]; + +#if 0 + if(pdvobj->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + { + //DBG_8192C("ishighspeed, cnt=%d\n", cnt); + bwritezero = _TRUE; + } + } + else + { + if(cnt > 0 && cnt%64 == 0) + { + //DBG_8192C("cnt=%d\n", cnt); + bwritezero = _TRUE; + } + } +#endif + + //translate DMA FIFO addr to pipehandle + pipe = ffaddr2pipehdl(pdvobj, addr); + +#ifdef CONFIG_REDUCE_USB_TX_INT + if ( pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0 + || pxmitbuf->ext_tag ) + { + purb->transfer_flags &= (~URB_NO_INTERRUPT); + } else { + purb->transfer_flags |= URB_NO_INTERRUPT; + //DBG_8192C("URB_NO_INTERRUPT "); + } +#endif + + + usb_fill_bulk_urb(purb, pusbd, pipe, + pxmitframe->buf_addr, //= pxmitbuf->pbuf + cnt, + usb_write_port_complete, + pxmitbuf);//context is pxmitbuf + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + purb->transfer_dma = pxmitbuf->dma_transfer_addr; + purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + purb->transfer_flags |= URB_ZERO_PACKET; +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + +#if 0 + if (bwritezero) + { + purb->transfer_flags |= URB_ZERO_PACKET; + } +#endif + + status = usb_submit_urb(purb, GFP_ATOMIC); + + if (!status) + { + ret= _SUCCESS; + #ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + pHalData->srestpriv.last_tx_time = rtw_get_current_time(); + } + #endif + } + else + { + DBG_8192C("usb_write_port, status=%d\n", status); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status)); + ret= _FAIL; + } + +// Commented by Albert 2009/10/13 +// We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. +/* + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } +*/ + +_func_exit_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n")); + + return ret; + +} + +static void usb_write_port_cancel(struct intf_hdl *pintfhdl) +{ + int i, j; + _adapter *padapter = pintfhdl->padapter; + struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; + + DBG_8192C("usb_write_port_cancel \n"); + + padapter->bWritePortCancel = _TRUE; + + for(i=0; ipxmit_urb[j]) + { + usb_kill_urb(pxmitbuf->pxmit_urb[j]); + } + } + + pxmitbuf++; + } + +} + +void rtl8192cu_set_intf_ops(struct _io_ops *pops) +{ + _func_enter_; + + _rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops)); + + pops->_read8 = &usb_read8; + pops->_read16 = &usb_read16; + pops->_read32 = &usb_read32; + pops->_read_mem = &usb_read_mem; + pops->_read_port = &usb_read_port; + + pops->_write8 = &usb_write8; + pops->_write16 = &usb_write16; + pops->_write32 = &usb_write32; + pops->_writeN = &usb_writeN; + +#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ + pops->_write8_async= &usb_async_write8; + pops->_write16_async = &usb_async_write16; + pops->_write32_async = &usb_async_write32; +#endif + pops->_write_mem = &usb_write_mem; + pops->_write_port = &usb_write_port; + + pops->_read_port_cancel = &usb_read_port_cancel; + pops->_write_port_cancel = &usb_write_port_cancel; + +#ifdef CONFIG_USB_INTERRUPT_IN_PIPE + pops->_read_interrupt = &usb_read_interrupt; +#endif + + _func_exit_; + +} + diff --git a/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c new file mode 100755 index 000000000000..82adeffd07ec --- /dev/null +++ b/drivers/net/wireless/rtl8192c/hal/rtl8192c/usb/usb_ops_xp.c @@ -0,0 +1,1266 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_OPS_OS_C_ + +#include +#include +#include +#include +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + #error "Shall be Linux or Windows, but not both!\n" +#endif + +#ifndef CONFIG_USB_HCI + #error "CONFIG_USB_HCI shall be on!\n" +#endif + + +#include +#include +#include + +#include +#include + +#include + + +struct zero_bulkout_context +{ + void *pbuf; + void *purb; + void *pirp; + void *padapter; +}; + +#define usb_write_cmd usb_write_mem +#define usb_read_cmd usb_read_mem +#define usb_write_cmd_complete usb_write_mem_complete +//#define usb_read_cmd_complete usb_read_mem_complete + + + +uint usb_init_intf_priv(struct intf_priv *pintfpriv) +{ + + PURB piorw_urb; + u8 NextDeviceStackSize; + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; + _adapter * padapter=pdev->padapter; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n +usb_init_intf_priv\n")); + + pintfpriv->intf_status = _IOREADY; + + if(pdev->ishighspeed) pintfpriv->max_iosz = 128; + else pintfpriv->max_iosz = 64; + + + _init_timer(&pintfpriv->io_timer, padapter->hndis_adapter, io_irp_timeout_handler, pintfpriv); + + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("usb_init_intf_priv:pintfpriv->max_iosz:%d\n",pintfpriv->max_iosz)); + + pintfpriv->io_wsz = 0; + pintfpriv->io_rsz = 0; + + pintfpriv->allocated_io_rwmem = rtw_zmalloc(pintfpriv->max_iosz +4); + + if (pintfpriv->allocated_io_rwmem == NULL){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_init_intf_priv:pintfpriv->allocated_io_rwmem == NULL\n")); + goto usb_init_intf_priv_fail; + } + + pintfpriv->io_rwmem = pintfpriv->allocated_io_rwmem + 4 \ + -( (u32)(pintfpriv->allocated_io_rwmem) & 3); + + + + NextDeviceStackSize = (u8)pdev->nextdevstacksz;//pintfpriv->pUsbDevObj->StackSize + 1; + + piorw_urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB) ); + if(piorw_urb == NULL) + goto usb_init_intf_priv_fail; + + pintfpriv->piorw_urb = piorw_urb; + + pintfpriv->piorw_irp = IoAllocateIrp(NextDeviceStackSize , FALSE); + + + pintfpriv->io_irp_cnt=1; + pintfpriv->bio_irp_pending=_FALSE; + + _rtw_init_sema(&(pintfpriv->io_retevt), 0);//NdisInitializeEvent(&pintfpriv->io_irp_return_evt); + +_func_exit_; + return _SUCCESS; + +usb_init_intf_priv_fail: + + if (pintfpriv->allocated_io_rwmem) + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz +4); + + if(piorw_urb) + ExFreePool(piorw_urb); + + RT_TRACE(_module_hci_ops_os_c_,_drv_info_,("\n -usb_init_intf_priv(usb_init_intf_priv_fail)\n")); + +_func_exit_; + return _FAIL; + +} + +void usb_unload_intf_priv(struct intf_priv *pintfpriv) +{ + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n+usb_unload_intf_priv\n")); + + rtw_mfree((u8 *)(pintfpriv->allocated_io_rwmem), pintfpriv->max_iosz+4); + +#ifdef PLATFORM_WINDOWS + if(pintfpriv->piorw_urb) + ExFreePool(pintfpriv->piorw_urb); + + if(pintfpriv->piorw_irp) + IoFreeIrp(pintfpriv->piorw_irp); +#endif + + +#ifdef PLATFORM_LINUX + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npintfpriv->io_irp_cnt=%d\n",pintfpriv->io_irp_cnt)); + pintfpriv->io_irp_cnt--; + if(pintfpriv->io_irp_cnt){ + if(pintfpriv->bio_irp_pending==_TRUE){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\nkill iorw_urb\n")); + usb_kill_urb(pintfpriv->piorw_urb); + } + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n wait io_retevt\n")); + _rtw_down_sema(&(pintfpriv->io_retevt)); + } + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n cancel io_urb ok\n")); +#endif + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n-usb_unload_intf_priv\n")); + +_func_exit_; + +} + +void *ffaddr2pipehdl(struct dvobj_priv *pNdisCEDvice, u32 addr) +{ + HANDLE PipeHandle = NULL; + _adapter *padapter = pNdisCEDvice->padapter; + + + if(pNdisCEDvice->nr_endpoint == 11) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3] ; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_BCNQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[6]; + break; + case RTL8712_DMA_BMCQ: //HI Queue + PipeHandle= padapter->halpriv.pipehdls_r8712[7]; + break; + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[8]; + break; + case RTL8712_DMA_RX0FF: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + case RTL8712_DMA_H2CCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[9]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 6) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[4]; + break; + case RTL8712_DMA_VIQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[5]; + break; + + } + + } + else if(pNdisCEDvice->nr_endpoint == 4) + { + switch(addr) + { + case RTL8712_DMA_BEQ: + //case RTL8712_DMA_BKQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[2]; + break; + //case RTL8712_DMA_VIQ: + case RTL8712_DMA_VOQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[1]; + break; + case RTL8712_DMA_RX0FF: + case RTL8712_DMA_C2HCMD: + PipeHandle= padapter->halpriv.pipehdls_r8712[0]; + break; + case RTL8712_DMA_H2CCMD: + case RTL8712_DMA_BCNQ: + case RTL8712_DMA_BMCQ: + case RTL8712_DMA_MGTQ: + PipeHandle= padapter->halpriv.pipehdls_r8712[3]; + break; + } + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ffaddr2pipehdl():nr_endpoint=%d error!\n", pNdisCEDvice->nr_endpoint)); + } + + return PipeHandle; + +} + + +NTSTATUS usb_bulkout_zero_complete( + PDEVICE_OBJECT pUsbDevObj, + PIRP pIrp, void* pZeroContext) +{ + struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)pZeroContext; + +_func_enter_; + + if(pcontext) + { + if(pcontext->pbuf) + { + ExFreePool(pcontext->pbuf); + } + + if(pcontext->purb) + { + ExFreePool(pcontext->purb); + } + + if(pcontext->pirp && (pIrp ==pcontext->pirp)) + { + IoFreeIrp(pIrp); + } + + ExFreePool(pcontext); + } + +_func_exit_; + + return STATUS_MORE_PROCESSING_REQUIRED; + + +} + +u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr) +{ + struct zero_bulkout_context *pcontext; + unsigned char *pbuf; + char NextDeviceStackSize, len; + PIO_STACK_LOCATION nextStack; + USBD_STATUS usbdstatus; + HANDLE PipeHandle; + PIRP pirp = NULL; + PURB purb = NULL; + NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pdvobj = (struct dvobj_priv *)&padapter->dvobjpriv; + + +_func_enter_; + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + return _FAIL; + } + + len = 0; + NextDeviceStackSize = (char)pdvobj->nextdevstacksz; + + pcontext = (struct zero_bulkout_context *)ExAllocatePool(NonPagedPool, sizeof(struct zero_bulkout_context)); + pbuf = (unsigned char *)ExAllocatePool(NonPagedPool, sizeof(int)); + purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(URB)); + pirp = IoAllocateIrp(NextDeviceStackSize, FALSE); + + pcontext->pbuf = pbuf; + pcontext->purb = purb; + pcontext->pirp = pirp; + pcontext->padapter = padapter; + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pdvobj, addr); + + + // Build our URB for USBD + UsbBuildInterruptOrBulkTransferRequest( + purb, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + PipeHandle, + pbuf, + NULL, + len, + 0, + NULL); + + // + // call the calss driver to perform the operation + // pass the URB to the USB driver stack + // + nextStack = IoGetNextIrpStackLocation(pirp); + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + nextStack->Parameters.Others.Argument1 = purb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + + //Set Completion Routine + IoSetCompletionRoutine(pirp, // irp to use + usb_bulkout_zero_complete, // callback routine + pcontext, // context + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + + // Call IoCallDriver to send the irp to the usb bus driver + // + ndisStatus = IoCallDriver(pdvobj->pnextdevobj, pirp); + usbdstatus = URB_STATUS(purb); + + if( USBD_HALTED(usbdstatus) ) + { + padapter->bDriverStopped=_TRUE; + padapter->bSurpriseRemoved=_TRUE; + } + + // + // The usb bus driver should always return STATUS_PENDING when bulk out irp async + // + if ( ndisStatus != STATUS_PENDING ) + { + return _FAIL; + } + +_func_exit_; + + return _SUCCESS; + +} + +void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + _func_enter_; + + + + _func_exit_; +} + +NTSTATUS usb_write_mem_complete(PDEVICE_OBJECT pUsbDevObj, PIRP piowrite_irp, PVOID pusb_cnxt) +{ + + _irqL irqL; + _list *head, *plist; + struct io_req *pio_req; + struct io_queue *pio_q = (struct io_queue *) pusb_cnxt; + struct intf_hdl *pintf = &(pio_q->intf); + struct intf_priv *pintfpriv = pintf->pintfpriv; + _adapter *padapter = (_adapter *)pintf->adapter; + NTSTATUS status = STATUS_SUCCESS; + + head = &(pio_q->processing); + + _func_enter_; + + _enter_critical_bh(&(pio_q->lock), &irqL); + + pintfpriv->io_irp_cnt--; + if(pintfpriv->io_irp_cnt ==0){ + _rtw_up_sema(&(pintfpriv->io_retevt)); + } + + pintfpriv->bio_irp_pending=_FALSE; + + switch(piowrite_irp->IoStatus.Status) + { + case STATUS_SUCCESS: + break; + + default: + padapter->bSurpriseRemoved=_TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usbAsynIntOutComplete:pioread_irp->IoStatus.Status !=STATUS_SUCCESS\n")); + break; + } + + //free irp in processing list... + while(rtw_is_list_empty(head) != _TRUE) + { + plist = get_next(head); + rtw_list_delete(plist); + pio_req = LIST_CONTAINOR(plist, struct io_req, list); + _rtw_up_sema(&pio_req->sema); + } + + _exit_critical_bh(&(pio_q->lock), &irqL); + + _func_exit_; + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + +void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + u32 bwritezero; + _irqL irqL; + USBD_STATUS usbdstatus; + PIO_STACK_LOCATION nextStack; + HANDLE PipeHandle; + struct io_req *pio_req; + + _adapter *adapter = (_adapter *)pintfhdl->adapter; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; + PURB piorw_urb = pintfpriv->piorw_urb; + PIRP piorw_irp = pintfpriv->piorw_irp; + struct io_queue *pio_queue = (struct io_queue *)adapter->pio_queue; + NTSTATUS NtStatus = STATUS_SUCCESS; + + _func_enter_; + + pio_req = alloc_ioreq(pio_queue); + + if ((pio_req == NULL)||(adapter->bSurpriseRemoved)){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("async_irp_write32 : pio_req =0x%x adapter->bSurpriseRemoved=0x%x",pio_req,adapter->bSurpriseRemoved )); + goto exit; + } + + _enter_critical_bh(&(pio_queue->lock), &irqL); + + rtw_list_insert_tail(&(pio_req->list),&(pio_queue->processing)); + + +#ifdef NDIS51_MINIPORT + IoReuseIrp(piorw_irp, STATUS_SUCCESS); +#else + piorw_irp->Cancel = _FALSE; +#endif + + if((adapter->bDriverStopped) || (adapter->bSurpriseRemoved) ||(adapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\npadapter->pwrctrlpriv.pnp_bstop_trx==_TRUE\n")); + _func_exit_; + return; + } + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pdev, addr); + + + pintfpriv->io_irp_cnt++; + pintfpriv->bio_irp_pending=_TRUE; + // Build our URB for USBD + UsbBuildInterruptOrBulkTransferRequest( + piorw_urb, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + PipeHandle, + (PVOID)wmem, + NULL, + cnt, + 0, + NULL); + + // + // call the calss driver to perform the operation + // pass the URB to the USB driver stack + // + nextStack = IoGetNextIrpStackLocation(piorw_irp); + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + nextStack->Parameters.Others.Argument1 = (PURB)piorw_urb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + + IoSetCompletionRoutine( + piorw_irp, // irp to use + usb_write_mem_complete, // routine to call when irp is done + pio_queue, // context to pass routine + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + // + // Call IoCallDriver to send the irp to the usb port + // + NtStatus = IoCallDriver(pdev->pnextdevobj, piorw_irp); + usbdstatus = URB_STATUS(piorw_urb); + + // + // The USB driver should always return STATUS_PENDING when + // it receives a write irp + // + if ((NtStatus != STATUS_PENDING) || USBD_HALTED(usbdstatus) ) { + + if( USBD_HALTED(usbdstatus) ) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_mem():USBD_HALTED(usbdstatus)=%X!\n",USBD_HALTED(usbdstatus)) ); + } + _func_exit_; + return;//STATUS_UNSUCCESSFUL; + } + + _exit_critical_bh(&(pio_queue->lock), &irqL); + + _rtw_down_sema(&pio_req->sema); + free_ioreq(pio_req, pio_queue); + + + bwritezero = _FALSE; + if (pdev->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + bwritezero = _TRUE; + + } + else + { + if(cnt > 0 && cnt%64 == 0) + bwritezero = _TRUE; + } + + + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } + +exit: + + _func_exit_; + +} + +NTSTATUS usb_read_port_complete(PDEVICE_OBJECT pUsbDevObj, PIRP pIrp, PVOID context) +{ + uint isevt, *pbuf; + struct _URB_BULK_OR_INTERRUPT_TRANSFER *pbulkurb; + USBD_STATUS usbdstatus; + struct recv_buf *precvbuf = (struct recv_buf *)context; + _adapter *adapter =(_adapter *)precvbuf->adapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + struct dvobj_priv *dev = (struct dvobj_priv *)&adapter->dvobjpriv; + PURB purb = precvbuf->purb; + struct intf_hdl *pintfhdl = &adapter->pio_queue->intf; + + //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n")); + + usbdstatus = URB_STATUS(purb); + + _rtw_spinlock_ex(&precvpriv->lock); + precvbuf->irp_pending=_FALSE; + precvpriv->rx_pending_cnt --; + _rtw_spinunlock_ex(&precvpriv->lock); + + if(precvpriv->rx_pending_cnt== 0) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: rx_pending_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&precvpriv->allrxreturnevt); + } + + + if( pIrp->Cancel == _TRUE ) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete: One IRP has been cancelled succesfully\n")); + return STATUS_MORE_PROCESSING_REQUIRED; + } + if(adapter->bSurpriseRemoved) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", adapter->bDriverStopped, adapter->bSurpriseRemoved)); + return STATUS_MORE_PROCESSING_REQUIRED; + } + + switch(pIrp->IoStatus.Status) + { + case STATUS_SUCCESS: + + pbulkurb = &(precvbuf->purb)->UrbBulkOrInterruptTransfer; + if((pbulkurb->TransferBufferLength >(MAX_RECVBUF_SZ)) || (pbulkurb->TransferBufferLength < RXDESC_SIZE) ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete: (pbulkurb->TransferBufferLength > MAX_RECVBUF_SZ) || (pbulkurb->TransferBufferLength < RXDESC_SIZE)\n")); + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + precvbuf->transfer_len = pbulkurb->TransferBufferLength; + + pbuf = (uint*)precvbuf->pbuf; + + if((isevt = *(pbuf+1)&0x1ff) == 0x1ff) + { + rxcmd_event_hdl(adapter, pbuf);//rx c2h events + + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + else + { + if(recvbuf2recvframe(adapter, precvbuf)==_FAIL)//rx packets + { + //precvbuf->reuse = _TRUE; + rtw_read_port(adapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + } + + } + + break; + + default: + + if( !USBD_HALTED(usbdstatus) ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete():USBD_HALTED(usbdstatus)=%x (need to handle ) \n",USBD_HALTED(usbdstatus))); + + } + else + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus)) ); + adapter->bDriverStopped = _TRUE; + adapter->bSurpriseRemoved = _TRUE; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete(): USBD_HALTED(usbdstatus)=%x \n\n", USBD_HALTED(usbdstatus))) ; + } + + break; + + } + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + +u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem) +{ + u8 *pdata; + u16 size; + PURB purb; + PIRP pirp; + PIO_STACK_LOCATION nextStack; + NTSTATUS ntstatus; + USBD_STATUS usbdstatus; + HANDLE PipeHandle; + struct recv_buf *precvbuf = (struct recv_buf *)rmem; + struct intf_priv *pintfpriv = pintfhdl->pintfpriv; + struct dvobj_priv *pdev = (struct dvobj_priv *)pintfpriv->intf_dev; + _adapter *adapter = (_adapter *)pdev->padapter; + struct recv_priv *precvpriv = &adapter->recvpriv; + u32 bResult = _FALSE; + +_func_enter_; + + if(adapter->bDriverStopped || adapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return bResult; + } + + if(precvbuf !=NULL) + { + + rtl8192cu_init_recvbuf(adapter, precvbuf); + + _rtw_spinlock(&precvpriv->lock); + precvpriv->rx_pending_cnt++; + precvbuf->irp_pending = _TRUE; + _rtw_spinunlock(&precvpriv->lock); + + pdata = (u8*)precvbuf->pbuf; + + size = sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ); + purb = precvbuf->purb; + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pdev, addr); + + UsbBuildInterruptOrBulkTransferRequest( + purb, + (USHORT)size, + PipeHandle, + pdata, + NULL, + MAX_RECVBUF_SZ, + USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK, + NULL + ); + + pirp = precvbuf->pirp; + +#if NDIS51_MINIPORT + IoReuseIrp(pirp, STATUS_SUCCESS); +#else + pirp->Cancel = _FALSE; +#endif + + // call the class driver to perform the operation + // and pass the URB to the USB driver stack + nextStack = IoGetNextIrpStackLocation(pirp); + nextStack->Parameters.Others.Argument1 = purb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + + IoSetCompletionRoutine( + pirp, // irp to use + usb_read_port_complete, // routine to call when irp is done + precvbuf, // context to pass routine + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + // + // The IoCallDriver routine + // sends an IRP to the driver associated with a specified device object. + // + ntstatus = IoCallDriver(pdev->pnextdevobj, pirp); + usbdstatus = URB_STATUS(purb); + + if( USBD_HALTED(usbdstatus) ) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_read_port(): USBD_HALTED(usbdstatus=0x%.8x)=%.8x \n\n", usbdstatus, USBD_HALTED(usbdstatus))); + pdev->padapter->bDriverStopped=_TRUE; + pdev->padapter->bSurpriseRemoved=_TRUE; + } + + if( ntstatus == STATUS_PENDING ) + { + bResult = _TRUE;// The IRP is pended in USBD as we expected. + } + else { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! IRP STATUS: %X\n", ntstatus)); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port(): IoCallDriver failed!!! USB STATUS: %X\n", usbdstatus)); + } + + } + else{ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:precv_frame ==NULL\n")); + } + +_func_exit_; + + return bResult; + +} + +void usb_read_port_cancel(_adapter *padapter) +{ + struct recv_buf *precvbuf; + sint i; + struct dvobj_priv *pdev = &padapter->dvobjpriv; + struct recv_priv *precvpriv=&padapter->recvpriv; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n ==>usb_read_port_cancel\n")); + + _rtw_spinlock(&precvpriv->lock); + precvpriv->rx_pending_cnt--; //decrease 1 for Initialize ++ + _rtw_spinunlock(&precvpriv->lock); + + if (precvpriv->rx_pending_cnt) + { + // Canceling Pending Recv Irp + precvbuf = (struct recv_buf *)precvpriv->precv_buf; + + for( i = 0; i < NR_RECVBUFF; i++ ) + { + if (precvbuf->irp_pending == _TRUE) + { + IoCancelIrp(precvbuf->pirp); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel() :IoCancelIrp\n")); + } + + precvbuf++; + } + + _rtw_down_sema(&precvpriv->allrxreturnevt); + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_cancel:down sema\n")); + + } + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("<==usb_read_port_cancel\n")); + +} + +NTSTATUS usb_write_port_complete( + PDEVICE_OBJECT pUsbDevObj, + PIRP pIrp, + PVOID pTxContext +) +{ + u32 i, bIrpSuccess, sz; + NTSTATUS status = STATUS_SUCCESS; + u8 *ptr; + struct xmit_frame *pxmitframe = (struct xmit_frame *) pTxContext; + struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; + _adapter *padapter = pxmitframe->padapter; + struct dvobj_priv *pdev = (struct dvobj_priv *)&padapter->dvobjpriv; + struct io_queue *pio_queue = (struct io_queue *)padapter->pio_queue; + struct intf_hdl *pintfhdl = &(pio_queue->intf); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + +_func_enter_; + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port_complete\n")); + + _rtw_spinlock_ex(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; + _rtw_spinunlock_ex(&pxmitpriv->lock); + + if(pxmitpriv->txirp_cnt==0){ + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n")); + _rtw_up_sema(&(pxmitpriv->tx_retevt)); + } + + status = pIrp->IoStatus.Status; + + if( status == STATUS_SUCCESS ) + bIrpSuccess = _TRUE; + else + bIrpSuccess = _FALSE; + + if( pIrp->Cancel == _TRUE ) + { + if(pxmitframe !=NULL) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pIrp->Cancel == _TRUE,(pxmitframe !=NULL\n")); + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + } + + return STATUS_MORE_PROCESSING_REQUIRED; + } + + if(padapter->bSurpriseRemoved) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)", padapter->bDriverStopped, padapter->bSurpriseRemoved)); + return STATUS_MORE_PROCESSING_REQUIRED; + } + + + // + // Send 0-byte here if necessary. + // + // + // 1. We MUST keep at most one IRP pending in each endpoint, otherwise USB host controler driver will hang. + // Besides, even 0-byte IRP shall be count into #IRP sent down, so, we send 0-byte here instead of TxFillDescriptor8187(). + // 2. If we don't count 0-byte IRP into an #IRP sent down, Tx will stuck when we download files via BT and + // play online video on XP SP1 EHCU. + // 2005.12.26, by rcnjko. + // + + + for(i=0; i< 8; i++) + { + if(pIrp == pxmitframe->pxmit_irp[i]) + { + pxmitframe->bpending[i] = _FALSE;// + //ac_tag = pxmitframe->ac_tag[i]; + sz = pxmitframe->sz[i]; + break; + } + } + +#if 0 + pxmitframe->fragcnt--; + if(pxmitframe->fragcnt == 0)// if((pxmitframe->fragcnt == 0) && (pxmitframe->irpcnt == 8)){ + { + //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port_complete:pxmitframe->fragcnt == 0\n")); + rtw_free_xmitframe(pxmitpriv,pxmitframe); + } +#else + + //not to consider tx fragment + rtw_free_xmitframe_ex(pxmitpriv, pxmitframe); + +#endif + + rtl8192cu_xmitframe_complete(padapter, pxmitpriv, pxmitbuf); + +_func_exit_; + + return STATUS_MORE_PROCESSING_REQUIRED; + +} + +u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem) +{ + u32 i, bwritezero; + u8 *ptr; + PIO_STACK_LOCATION nextStack; + USBD_STATUS usbdstatus; + HANDLE PipeHandle; + PIRP pirp = NULL; + PURB purb = NULL; + NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; + _adapter *padapter = (_adapter *)pintfhdl->adapter; + struct dvobj_priv *pNdisCEDvice = (struct dvobj_priv *)&padapter->dvobjpriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct xmit_frame *pxmitframe = (struct xmit_frame *)wmem; + +_func_enter_; + + if((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) ||(padapter->pwrctrlpriv.pnp_bstop_trx)) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved ||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n")); + return _FAIL; + } + + + for(i=0; i<8; i++) + { + if(pxmitframe->bpending[i] == _FALSE) + { + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt++; + pxmitframe->bpending[i] = _TRUE; + _rtw_spinunlock(&pxmitpriv->lock); + + pxmitframe->sz[i] = cnt; + purb = pxmitframe->pxmit_urb[i]; + pirp = pxmitframe->pxmit_irp[i]; + + //pxmitframe->ac_tag[i] = ac_tag; + + break; + } + } + + bwritezero = _FALSE; + if (pNdisCEDvice->ishighspeed) + { + if(cnt> 0 && cnt%512 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("ishighspeed, cnt=%d\n", cnt)); + //cnt=cnt+1; + bwritezero = _TRUE; + } + } + else + { + if(cnt > 0 && cnt%64 == 0) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cnt=%d\n", cnt)); + //cnt=cnt+1; + bwritezero = _TRUE; + } + } + + +#ifdef NDIS51_MINIPORT + IoReuseIrp(pirp, STATUS_SUCCESS); +#else + pirp->Cancel = _FALSE; +#endif + + + //translate DMA FIFO addr to pipehandle + PipeHandle = ffaddr2pipehdl(pNdisCEDvice, addr); + + + // Build our URB for USBD + UsbBuildInterruptOrBulkTransferRequest( + purb, + sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), + PipeHandle, + pxmitframe->mem_addr, + NULL, + cnt, + 0, + NULL); + + // + // call the calss driver to perform the operation + // pass the URB to the USB driver stack + // + nextStack = IoGetNextIrpStackLocation(pirp); + nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + nextStack->Parameters.Others.Argument1 = purb; + nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; + + //Set Completion Routine + IoSetCompletionRoutine(pirp, // irp to use + usb_write_port_complete, // callback routine + pxmitframe, // context + TRUE, // call on success + TRUE, // call on error + TRUE); // call on cancel + + + // Call IoCallDriver to send the irp to the usb bus driver + // + ndisStatus = IoCallDriver(pNdisCEDvice->pnextdevobj, pirp); + usbdstatus = URB_STATUS(purb); + + if( USBD_HALTED(usbdstatus) ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): USBD_HALTED(usbdstatus)=%x set bDriverStopped TRUE!\n\n",USBD_HALTED(usbdstatus)) ); + padapter->bDriverStopped=_TRUE; + padapter->bSurpriseRemoved=_TRUE; + } + + // + // The usb bus driver should always return STATUS_PENDING when bulk out irp async + // + if ( ndisStatus != STATUS_PENDING ) + { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("\n usb_write_port(): ndisStatus(%x) != STATUS_PENDING!\n\n", ndisStatus)); + + _func_exit_; + + return _FAIL; + } + + if(bwritezero == _TRUE) + { + usb_bulkout_zero(pintfhdl, addr); + } + + +_func_exit_; + + return _SUCCESS; + +} + + +void usb_write_port_cancel(_adapter *padapter) +{ + + sint i,j; + struct dvobj_priv *pdev = &padapter->dvobjpriv; + struct xmit_priv *pxmitpriv=&padapter->xmitpriv; + struct xmit_frame *pxmitframe; + + _rtw_spinlock(&pxmitpriv->lock); + pxmitpriv->txirp_cnt--; //decrease 1 for Initialize ++ + _rtw_spinunlock(&pxmitpriv->lock); + + if (pxmitpriv->txirp_cnt) + { + // Canceling Pending Recv Irp + pxmitframe= (struct xmit_frame *)pxmitpriv->pxmit_frame_buf; + + for( i = 0; i < NR_XMITFRAME; i++ ) + { + for(j=0;j<8;j++) + { + if (pxmitframe->bpending[j]==_TRUE) + { + IoCancelIrp(pxmitframe->pxmit_irp[j]); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usb_write_port_cancel() :IoCancelIrp\n")); + + } + } + + pxmitframe++; + } + + _rtw_down_sema(&(pxmitpriv->tx_retevt)); + + } + +} + + +/*! \brief Wrap the pUrb to an IRP and send this IRP to Bus Driver. Then wait for this IRP completion. + The Caller shall be at Passive Level. +*/ +NTSTATUS sync_callusbd(struct dvobj_priv *pdvobjpriv, PURB purb) +{ + + KEVENT kevent; + PIRP irp; + IO_STATUS_BLOCK iostatusblock; + PIO_STACK_LOCATION nextstack; + USBD_STATUS usbdstatus; + LARGE_INTEGER waittime; + NTSTATUS ntstatus = STATUS_SUCCESS; + _adapter *padapter = pdvobjpriv->padapter; + + + _func_enter_; + +// if(padapter->bDriverStopped) { +// goto exit; +// } + + KeInitializeEvent(&kevent, NotificationEvent, _FALSE); + irp = IoBuildDeviceIoControlRequest( + IOCTL_INTERNAL_USB_SUBMIT_URB, + pdvobjpriv->pphysdevobj,//CEdevice->pUsbDevObj, + NULL, + 0, + NULL, + 0, + _TRUE, + &kevent, + &iostatusblock); + + if(irp == NULL) { + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: memory alloc for irp failed\n")); + ntstatus=STATUS_INSUFFICIENT_RESOURCES; + goto exit; + } + + nextstack = IoGetNextIrpStackLocation(irp); + if(nextstack == NULL) + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("IoGetNextIrpStackLocation fail\n")); + + nextstack->Parameters.Others.Argument1 = purb; + + // Issue an IRP for Sync IO. + ntstatus = IoCallDriver(pdvobjpriv->pphysdevobj, irp); + usbdstatus = URB_STATUS(purb); + + if(ntstatus == STATUS_PENDING) + { + // Method 1 + waittime.QuadPart = -10000 * 50000; + ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, &waittime); //8150 code + + // Method 2 + //ntStatus = KeWaitForSingleObject(&Kevent, Executive, KernelMode, FALSE, NULL); //DDK sample + + usbdstatus = URB_STATUS(purb); + + if(ntstatus == STATUS_TIMEOUT) + { + //usbdevice->nIoStuckCnt++; + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("SyncCallUSBD: TIMEOUT....5000ms\n")); + + // Method 2 + IoCancelIrp(irp); + ntstatus = KeWaitForSingleObject(&kevent, Executive, KernelMode, _FALSE, NULL); //DDK sample + usbdstatus = URB_STATUS(purb); + + usbdstatus = USBD_STATUS_SUCCESS; + } + + } + +exit: + + _func_exit_; + + return ntstatus; + +} +int usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +{ + PURB purb; + u8 ret; + unsigned long transferflags; + NTSTATUS ntstatus; + + struct dvobj_priv *pdvobjpriv = (struct dvobj_priv *)pintfpriv->intf_dev; + + _func_enter_; + + ret=_TRUE; + purb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST) ); + if(purb == NULL) { + + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq(): Failed to allocate urb !!!\n")); + ret =_FALSE; + goto exit; + } + + if (requesttype == 0x01) { + transferflags = USBD_TRANSFER_DIRECTION_IN;//read_in + } else { + transferflags= 0;//write_out + } + + UsbBuildVendorRequest( + purb, //Pointer to an URB that is to be formatted as a vendor or class request. + URB_FUNCTION_VENDOR_DEVICE, //Indicates the URB is a vendor-defined request for a USB device. + sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), //Specifies the length, in bytes, of the URB. + transferflags, //TransferFlags + 0, //ReservedBits + request, //Request + value, //Value + index, //Index + pdata, //TransferBuffer + NULL, //TransferBufferMDL + len, //TransferBufferLength + NULL //Link + ); + + ntstatus = sync_callusbd(pdvobjpriv, purb); + if(!NT_SUCCESS(ntstatus)) + { + ExFreePool(purb); + RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(" usbctrl_vendorreq() : SOMETHING WRONG\n") ); + ret = _FALSE; + goto exit; + } + + ExFreePool(purb); + +exit: + _func_exit_; + + return ret; + +} + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h new file mode 100755 index 000000000000..c3e7f9e8a885 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CEHWImg.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192CE_FW_IMG_H +#define __INC_HAL8192CE_FW_IMG_H + +#include + +/*Created on 2011/ 6/15, 5:45*/ + +#define TSMCImgArrayLength 14964 //v75 2011-06-15 +extern u8 Rtl8192CEFwTSMCImgArray[TSMCImgArrayLength]; +#define UMCACutImgArrayLength 14964 //v75 2011-06-15 +extern u8 Rtl8192CEFwUMCACutImgArray[UMCACutImgArrayLength]; +#define UMCBCutImgArrayLength 14946 //v75 2011-06-15 +extern u8 Rtl8192CEFwUMCBCutImgArray[UMCBCutImgArrayLength]; +#define PHY_REG_2TArrayLength 374 +extern u32 Rtl8192CEPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 374 +extern u32 Rtl8192CEPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_ChangeTo_1T1RArrayLength 1 +extern u32 Rtl8192CEPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength]; +#define PHY_ChangeTo_1T2RArrayLength 1 +extern u32 Rtl8192CEPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength]; +#define PHY_ChangeTo_2T2RArrayLength 1 +extern u32 Rtl8192CEPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength]; +#define PHY_REG_Array_PGLength 336 +extern u32 Rtl8192CEPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_MPLength 4 +extern u32 Rtl8192CEPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define RadioA_2TArrayLength 282 +extern u32 Rtl8192CERadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 78 +extern u32 Rtl8192CERadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 282 +extern u32 Rtl8192CERadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192CERadioB_1TArray[RadioB_1TArrayLength]; +#define RadioB_GM_ArrayLength 1 +extern u32 Rtl8192CERadioB_GM_Array[RadioB_GM_ArrayLength]; +#define MAC_2T_ArrayLength 172 +extern u32 Rtl8192CEMAC_2T_Array[MAC_2T_ArrayLength]; +#define MACPHY_Array_PGLength 1 +extern u32 Rtl8192CEMACPHY_Array_PG[MACPHY_Array_PGLength]; +#define AGCTAB_2TArrayLength 320 +extern u32 Rtl8192CEAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 320 +extern u32 Rtl8192CEAGCTAB_1TArray[AGCTAB_1TArrayLength]; + +#endif //__INC_HAL8192CE_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h new file mode 100755 index 000000000000..2e76d2ab4367 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyCfg.h @@ -0,0 +1,451 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * Module: __INC_HAL8192CPHYCFG_H + * + * + * Note: + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * + *****************************************************************************/ + /* Check to see if the file has been included already. */ +#ifndef __INC_HAL8192CPHYCFG_H +#define __INC_HAL8192CPHYCFG_H + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + +#define IQK_MAC_REG_NUM 4 +#define IQK_ADDA_REG_NUM 16 +#define IQK_BB_REG_NUM 9 +#define HP_THERMAL_NUM 8 + +#ifdef CONFIG_PCI_HCI +#define MAX_AGGR_NUM 0x0A0A +#else +#define MAX_AGGR_NUM 0x0909 +#endif + +#ifdef CONFIG_PCI_HCI +#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \ +{ \ + u1Byte u1bTmp; \ + u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \ + u1bTmp |= BIT0; \ + PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \ + PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \ + PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ + delay_us(100); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ +} +#endif + + +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ +typedef enum _SwChnlCmdID{ + CmdID_End, + CmdID_SetTxPowerLevel, + CmdID_BBRegWrite10, + CmdID_WritePortUlong, + CmdID_WritePortUshort, + CmdID_WritePortUchar, + CmdID_RF_WriteReg, +}SwChnlCmdID; + + +/* 1. Switch channel related */ +typedef struct _SwChnlCmd{ + SwChnlCmdID CmdID; + u32 Para1; + u32 Para2; + u32 msDelay; +}SwChnlCmd; + +typedef enum _HW90_BLOCK{ + HW90_BLOCK_MAC = 0, + HW90_BLOCK_PHY0 = 1, + HW90_BLOCK_PHY1 = 2, + HW90_BLOCK_RF = 3, + HW90_BLOCK_MAXIMUM = 4, // Never use this +}HW90_BLOCK_E, *PHW90_BLOCK_E; + +typedef enum _RF90_RADIO_PATH{ + RF90_PATH_A = 0, //Radio Path A + RF90_PATH_B = 1, //Radio Path B + RF90_PATH_C = 2, //Radio Path C + RF90_PATH_D = 3, //Radio Path D + //RF90_PATH_MAX //Max RF number 90 support +}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E; + +#define RF90_PATH_MAX 2 + +#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number +#define CHANNEL_GROUP_MAX 3 // ch1~3, ch4~9, ch10~14 total three groups + +typedef enum _WIRELESS_MODE { + WIRELESS_MODE_UNKNOWN = 0x00, + WIRELESS_MODE_A = 0x01, + WIRELESS_MODE_B = 0x02, + WIRELESS_MODE_G = 0x04, + WIRELESS_MODE_AUTO = 0x08, + WIRELESS_MODE_N_24G = 0x10, + WIRELESS_MODE_N_5G = 0x20 +} WIRELESS_MODE; + +typedef enum _BaseBand_Config_Type{ + BaseBand_Config_PHY_REG = 0, //Radio Path A + BaseBand_Config_AGC_TAB = 1, //Radio Path B +}BaseBand_Config_Type, *PBaseBand_Config_Type; + + +typedef enum _PHY_Rate_Tx_Power_Offset_Area{ + RA_OFFSET_LEGACY_OFDM1, + RA_OFFSET_LEGACY_OFDM2, + RA_OFFSET_HT_OFDM1, + RA_OFFSET_HT_OFDM2, + RA_OFFSET_HT_OFDM3, + RA_OFFSET_HT_OFDM4, + RA_OFFSET_HT_CCK, +}RA_OFFSET_AREA,*PRA_OFFSET_AREA; + + +/* BB/RF related */ +typedef enum _RF_TYPE_8190P{ + RF_TYPE_MIN, // 0 + RF_8225=1, // 1 11b/g RF for verification only + RF_8256=2, // 2 11b/g/n + RF_8258=3, // 3 11a/b/g/n RF + RF_6052=4, // 4 11b/g/n RF + //RF_6052=5, // 4 11b/g/n RF + // TODO: We sholud remove this psudo PHY RF after we get new RF. + RF_PSEUDO_11N=5, // 5, It is a temporality RF. +}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; + + +typedef enum _RATR_TABLE_MODE_8192C{ + RATR_INX_WIRELESS_NGB = 0, + RATR_INX_WIRELESS_NG = 1, + RATR_INX_WIRELESS_NB = 2, + RATR_INX_WIRELESS_N = 3, + RATR_INX_WIRELESS_GB = 4, + RATR_INX_WIRELESS_G = 5, + RATR_INX_WIRELESS_B = 6, + RATR_INX_WIRELESS_MC = 7, + RATR_INX_WIRELESS_A = 8, +}RATR_TABLE_MODE_8192C, *PRATR_TABLE_MODE_8192C; + +typedef struct _BB_REGISTER_DEFINITION{ + u32 rfintfs; // set software control: + // 0x870~0x877[8 bytes] + + u32 rfintfi; // readback data: + // 0x8e0~0x8e7[8 bytes] + + u32 rfintfo; // output data: + // 0x860~0x86f [16 bytes] + + u32 rfintfe; // output enable: + // 0x860~0x86f [16 bytes] + + u32 rf3wireOffset; // LSSI data: + // 0x840~0x84f [16 bytes] + + u32 rfLSSI_Select; // BB Band Select: + // 0x878~0x87f [8 bytes] + + u32 rfTxGainStage; // Tx gain stage: + // 0x80c~0x80f [4 bytes] + + u32 rfHSSIPara1; // wire parameter control1 : + // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] + + u32 rfHSSIPara2; // wire parameter control2 : + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] + + u32 rfSwitchControl; //Tx Rx antenna control : + // 0x858~0x85f [16 bytes] + + u32 rfAGCControl1; //AGC parameter control1 : + // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] + + u32 rfAGCControl2; //AGC parameter control2 : + // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] + + u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : + // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] + + u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : + // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] + + u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix + // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] + + u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type + // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] + + u32 rfLSSIReadBack; //LSSI RF readback data SI mode + // 0x8a0~0x8af [16 bytes] + + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B + +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; + +#ifdef CONFIG_MP_INCLUDED +typedef enum _ANTENNA_PATH{ + ANTENNA_NONE = 0x00, + ANTENNA_D , + ANTENNA_C , + ANTENNA_CD , + ANTENNA_B , + ANTENNA_BD , + ANTENNA_BC , + ANTENNA_BCD , + ANTENNA_A , + ANTENNA_AD , + ANTENNA_AC , + ANTENNA_ACD , + ANTENNA_AB , + ANTENNA_ABD , + ANTENNA_ABC , + ANTENNA_ABCD +} ANTENNA_PATH; +#endif + +typedef struct _R_ANTENNA_SELECT_OFDM{ + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK{ + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +u32 rtl8192c_PHY_QueryBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192c_PHY_SetBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 rtl8192c_PHY_QueryRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192c_PHY_SetRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +int PHY_MACConfig8192C( IN PADAPTER Adapter ); +int PHY_BBConfig8192C( IN PADAPTER Adapter ); +int PHY_RFConfig8192C( IN PADAPTER Adapter ); +/* RF config */ +int rtl8192c_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter, + IN u8* pFileName, + IN RF90_RADIO_PATH_E eRFPath); +int rtl8192c_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath); + +/* BB/RF readback check for making sure init OK */ +int rtl8192c_PHY_CheckBBAndRFOK( IN PADAPTER Adapter, + IN HW90_BLOCK_E CheckBlock, + IN RF90_RADIO_PATH_E eRFPath ); +/* Read initi reg value for tx power setting. */ +void rtl8192c_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); + +// +// RF Power setting +// +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, +// IN RT_RF_POWER_STATE eRFPowerState); + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8192C( IN PADAPTER Adapter, + OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8192C( IN PADAPTER Adapter, + IN u8 channel ); +BOOLEAN PHY_UpdateTxPowerDbm8192C( IN PADAPTER Adapter, + IN int powerInDbm ); + +// +VOID +PHY_ScanOperationBackup8192C(IN PADAPTER Adapter, + IN u8 Operation ); + +// +// Switch bandwidth for 8192S +// +//extern void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SetBWMode8192C( IN PADAPTER pAdapter, + IN HT_CHANNEL_WIDTH ChnlWidth, + IN unsigned char Offset ); + +// +// Set FW CMD IO for 8192S. +// +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, +// IN IO_TYPE IOType); + +// +// Set A2 entry to fw for 8192S +// +extern void FillA2Entry8192C( IN PADAPTER Adapter, + IN u8 index, + IN u8* val); + + +// +// channel switch related funciton +// +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SwChnl8192C( IN PADAPTER pAdapter, + IN u8 channel ); + // Call after initialization +void PHY_SwChnlPhy8192C( IN PADAPTER pAdapter, + IN u8 channel ); + +void ChkFwCmdIoDone( IN PADAPTER Adapter); + +#ifdef USE_WORKITEM +//extern void SetIOWorkItemCallback( IN PVOID pContext ); +#else +//extern void SetIOTimerCallback( IN PRT_TIMER pTimer); +#endif + +// +// BB/MAC/RF other monitor API +// +void PHY_SetMonitorMode8192C(IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode ); + +BOOLEAN PHY_CheckIsLegalRfPath8192C(IN PADAPTER pAdapter, + IN u32 eRFPath ); + +// +// IQ calibrate +// +VOID rtl8192c_PHY_IQCalibrate( IN PADAPTER pAdapter , IN BOOLEAN bReCovery); + +// +// LC calibrate +// +VOID rtl8192c_PHY_LCCalibrate(IN PADAPTER pAdapter); + +// +// AP calibrate +// +VOID rtl8192c_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta); + +VOID rtl8192c_PHY_DigitalPredistortion(IN PADAPTER pAdapter); + +VOID rtl8192c_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain); + +// +// Modify the value of the hw register when beacon interval be changed. +// +void +rtl8192c_PHY_SetBeaconHwReg( IN PADAPTER Adapter, + IN u16 BeaconInterval ); + + +extern VOID +PHY_SwitchEphyParameter( + IN PADAPTER Adapter + ); + +extern VOID +PHY_EnableHostClkReq( + IN PADAPTER Adapter + ); + +BOOLEAN +SetAntennaConfig92C( + IN PADAPTER Adapter, + IN u8 DefaultAnt + ); + + +/*--------------------------Exported Function prototype---------------------*/ + +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192c_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192c_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192c_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192c_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) + +#define PHY_SetMacReg PHY_SetBBReg + +#endif // __INC_HAL8192CPHYCFG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h new file mode 100755 index 000000000000..5f2d45172198 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CPhyReg.h @@ -0,0 +1,1102 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192CPHYREG_H + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __INC_HAL8192CPHYREG_H +#define __INC_HAL8192CPHYREG_H + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c + +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 // Useless now +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxIQExtAnta 0xca0 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rFPGA0_IQK 0xe28 +#define rTx_IQK_Tone_A 0xe30 +#define rRx_IQK_Tone_A 0xe34 +#define rTx_IQK_PI_A 0xe38 +#define rRx_IQK_PI_A 0xe3c + +#define rTx_IQK 0xe40 +#define rRx_IQK 0xe44 +#define rIQK_AGC_Pts 0xe48 +#define rIQK_AGC_Rsp 0xe4c +#define rTx_IQK_Tone_B 0xe50 +#define rRx_IQK_Tone_B 0xe54 +#define rTx_IQK_PI_B 0xe58 +#define rRx_IQK_PI_B 0xe5c +#define rIQK_AGC_Cont 0xe60 + +#define rBlue_Tooth 0xe6c +#define rRx_Wait_CCA 0xe70 +#define rTx_CCK_RFON 0xe74 +#define rTx_CCK_BBON 0xe78 +#define rTx_OFDM_RFON 0xe7c +#define rTx_OFDM_BBON 0xe80 +#define rTx_To_Rx 0xe84 +#define rTx_To_Tx 0xe88 +#define rRx_CCK 0xe8c + +#define rTx_Power_Before_IQK_A 0xe94 +#define rTx_Power_After_IQK_A 0xe9c + +#define rRx_Power_Before_IQK_A 0xea0 +#define rRx_Power_Before_IQK_A_2 0xea4 +#define rRx_Power_After_IQK_A 0xea8 +#define rRx_Power_After_IQK_A_2 0xeac + +#define rTx_Power_Before_IQK_B 0xeb4 +#define rTx_Power_After_IQK_B 0xebc + +#define rRx_Power_Before_IQK_B 0xec0 +#define rRx_Power_Before_IQK_B_2 0xec4 +#define rRx_Power_After_IQK_B 0xec8 +#define rRx_Power_After_IQK_B_2 0xecc + +#define rRx_OFDM 0xed0 +#define rRx_Wait_RIFS 0xed4 +#define rRx_TO_Rx 0xed8 +#define rStandby 0xedc +#define rSleep 0xee0 +#define rPMPD_ANAEN 0xeec + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x24 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h new file mode 100755 index 000000000000..97b1c2fa429d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192CUHWImg.h @@ -0,0 +1,92 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192CU_FW_IMG_H +#define __INC_HAL8192CU_FW_IMG_H + +/*Created on 2011/ 6/15, 5:45*/ + +#ifdef CONFIG_BT_COEXISTENCE +#define TSMCImgArrayLength 14964 //Normal v75 2011-06-15 +#else +#define TSMCImgArrayLength 15290 //P2P_PS v75 2011-06-15 +#endif + +extern u8 Rtl8192CUFwTSMCImgArray[TSMCImgArrayLength]; + +#define UMCACutImgArrayLength 14964 //v75 2011-06-15 +extern u8 Rtl8192CUFwUMCACutImgArray[UMCACutImgArrayLength]; + +#define UMCBCutImgArrayLength 14946 //v75 2011-06-15 +extern u8 Rtl8192CUFwUMCBCutImgArray[UMCBCutImgArrayLength] ; + +#define UMC8723ImgArrayLength 16288 +extern u8 Rtl8192CUFwUMC8723ImgArray[UMC8723ImgArrayLength]; +#define PHY_REG_2TArrayLength 374 +extern u32 Rtl8192CUPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 374 +extern u32 Rtl8192CUPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_ChangeTo_1T1RArrayLength 1 +extern u32 Rtl8192CUPHY_ChangeTo_1T1RArray[PHY_ChangeTo_1T1RArrayLength]; +#define PHY_ChangeTo_1T2RArrayLength 1 +extern u32 Rtl8192CUPHY_ChangeTo_1T2RArray[PHY_ChangeTo_1T2RArrayLength]; +#define PHY_ChangeTo_2T2RArrayLength 1 +extern u32 Rtl8192CUPHY_ChangeTo_2T2RArray[PHY_ChangeTo_2T2RArrayLength]; +#define PHY_REG_Array_PGLength 336 +extern u32 Rtl8192CUPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_PG_mCardLength 336 +extern u32 Rtl8192CUPHY_REG_Array_PG_mCard[PHY_REG_Array_PG_mCardLength]; +#define PHY_REG_Array_MPLength 4 +extern u32 Rtl8192CUPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define PHY_REG_1T_HPArrayLength 378 +extern u32 Rtl8192CUPHY_REG_1T_HPArray[PHY_REG_1T_HPArrayLength]; +#define PHY_REG_1T_mCardArrayLength 374 +extern u32 Rtl8192CUPHY_REG_1T_mCardArray[PHY_REG_1T_mCardArrayLength]; +#define PHY_REG_2T_mCardArrayLength 374 +extern u32 Rtl8192CUPHY_REG_2T_mCardArray[PHY_REG_2T_mCardArrayLength]; +#define PHY_REG_Array_PG_HPLength 336 +extern u32 Rtl8192CUPHY_REG_Array_PG_HP[PHY_REG_Array_PG_HPLength]; +#define RadioA_2TArrayLength 282 +extern u32 Rtl8192CURadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 78 +extern u32 Rtl8192CURadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 282 +extern u32 Rtl8192CURadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192CURadioB_1TArray[RadioB_1TArrayLength]; +#define RadioA_1T_mCardArrayLength 282 +extern u32 Rtl8192CURadioA_1T_mCardArray[RadioA_1T_mCardArrayLength]; +#define RadioB_1T_mCardArrayLength 1 +extern u32 Rtl8192CURadioB_1T_mCardArray[RadioB_1T_mCardArrayLength]; +#define RadioA_1T_HPArrayLength 282 +extern u32 Rtl8192CURadioA_1T_HPArray[RadioA_1T_HPArrayLength]; +#define RadioB_GM_ArrayLength 1 +extern u32 Rtl8192CURadioB_GM_Array[RadioB_GM_ArrayLength]; +#define MAC_2T_ArrayLength 172 +extern u32 Rtl8192CUMAC_2T_Array[MAC_2T_ArrayLength]; +#define MACPHY_Array_PGLength 1 +extern u32 Rtl8192CUMACPHY_Array_PG[MACPHY_Array_PGLength]; +#define AGCTAB_2TArrayLength 320 +extern u32 Rtl8192CUAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 320 +extern u32 Rtl8192CUAGCTAB_1TArray[AGCTAB_1TArrayLength]; +#define AGCTAB_1T_HPArrayLength 320 +extern u32 Rtl8192CUAGCTAB_1T_HPArray[AGCTAB_1T_HPArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h new file mode 100755 index 000000000000..d99403c7c4f9 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DEHWImg.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DU_FW_IMG_H +#define __INC_HAL8192DU_FW_IMG_H + +#include + +/*Created on 2011/ 8/ 8, 1:41*/ + +#define ImgArrayLength 29642 +extern u8 Rtl8192DEFwImgArray[ImgArrayLength]; +#define MainArrayLength 1 +extern u8 Rtl8192DEFwMainArray[MainArrayLength]; +#define DataArrayLength 1 +extern u8 Rtl8192DEFwDataArray[DataArrayLength]; +#define PHY_REG_2TArrayLength 380 +extern u32 Rtl8192DEPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 1 +extern u32 Rtl8192DEPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_REG_Array_PGLength 624 +extern u32 Rtl8192DEPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_MPLength 10 +extern u32 Rtl8192DEPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define RadioA_2TArrayLength 378 +extern u32 Rtl8192DERadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 384 +extern u32 Rtl8192DERadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 1 +extern u32 Rtl8192DERadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192DERadioB_1TArray[RadioB_1TArrayLength]; +#define RadioA_2T_intPAArrayLength 378 +extern u32 Rtl8192DERadioA_2T_intPAArray[RadioA_2T_intPAArrayLength]; +#define RadioB_2T_intPAArrayLength 384 +extern u32 Rtl8192DERadioB_2T_intPAArray[RadioB_2T_intPAArrayLength]; +#define MAC_2TArrayLength 160 +extern u32 Rtl8192DEMAC_2TArray[MAC_2TArrayLength]; +#define AGCTAB_ArrayLength 386 +extern u32 Rtl8192DEAGCTAB_Array[AGCTAB_ArrayLength]; +#define AGCTAB_5GArrayLength 194 +extern u32 Rtl8192DEAGCTAB_5GArray[AGCTAB_5GArrayLength]; +#define AGCTAB_2GArrayLength 194 +extern u32 Rtl8192DEAGCTAB_2GArray[AGCTAB_2GArrayLength]; +#define AGCTAB_2TArrayLength 1 +extern u32 Rtl8192DEAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 1 +extern u32 Rtl8192DEAGCTAB_1TArray[AGCTAB_1TArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h new file mode 100755 index 000000000000..0cb96e51d648 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DETestHWImg.h @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DETEST_FW_IMG_H +#define __INC_HAL8192DETEST_FW_IMG_H + +#include + +/*Created on 2010/ 5/27, 8: 6*/ + +#define Rtl8192DTestImgArrayLength 15054 +extern u8 Rtl8192DTestFwImgArray[Rtl8192DTestImgArrayLength]; +#define Rtl8192DTestMainArrayLength 1 +extern u8 Rtl8192DTestFwMainArray[Rtl8192DTestMainArrayLength]; +#define Rtl8192DTestDataArrayLength 1 +extern u8 Rtl8192DTestFwDataArray[Rtl8192DTestDataArrayLength]; +#define Rtl8192DTestPHY_REG_2TArrayLength 376 +extern u32 Rtl8192DTestPHY_REG_2TArray[Rtl8192DTestPHY_REG_2TArrayLength]; +#define Rtl8192DTestPHY_REG_1TArrayLength 1 +extern u32 Rtl8192DTestPHY_REG_1TArray[Rtl8192DTestPHY_REG_1TArrayLength]; +#define Rtl8192DTestPHY_REG_Array_PGLength 1 +extern u32 Rtl8192DTestPHY_REG_Array_PG[Rtl8192DTestPHY_REG_Array_PGLength]; +#define Rtl8192DTestRadioA_2TArrayLength 340 +extern u32 Rtl8192DTestRadioA_2TArray[Rtl8192DTestRadioA_2TArrayLength]; +#define Rtl8192DTestRadioB_2TArrayLength 340 +extern u32 Rtl8192DTestRadioB_2TArray[Rtl8192DTestRadioB_2TArrayLength]; +#define Rtl8192DTestRadioA_1TArrayLength 1 +extern u32 Rtl8192DTestRadioA_1TArray[Rtl8192DTestRadioA_1TArrayLength]; +#define Rtl8192DTestRadioB_1TArrayLength 1 +extern u32 Rtl8192DTestRadioB_1TArray[Rtl8192DTestRadioB_1TArrayLength]; +#define Rtl8192DTestMAC_2TArrayLength 174 +extern u32 Rtl8192DTestMAC_2TArray[Rtl8192DTestMAC_2TArrayLength]; +#define Rtl8192DTestAGCTAB_5GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_5GArray[Rtl8192DTestAGCTAB_5GArrayLength]; +#define Rtl8192DTestAGCTAB_2GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_2GArray[Rtl8192DTestAGCTAB_2GArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h new file mode 100755 index 000000000000..736189ed1bdf --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyCfg.h @@ -0,0 +1,545 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192DPHYCFG_H + * + * + * Note: + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * + *****************************************************************************/ + /* Check to see if the file has been included already. */ +#ifndef __INC_HAL8192DPHYCFG_H +#define __INC_HAL8192DPHYCFG_H + + +/*--------------------------Define Parameters-------------------------------*/ +#define LOOP_LIMIT 5 +#define MAX_STALL_TIME 50 //us +#define AntennaDiversityValue 0x80 //(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80) +#define MAX_TXPWR_IDX_NMODE_92S 63 +#define Reset_Cnt_Limit 3 + + +#define IQK_MAC_REG_NUM 4 +#define IQK_ADDA_REG_NUM 16 +#define IQK_BB_REG_NUM 10 +#define IQK_BB_REG_NUM_test 6 +#define index_mapping_NUM 13 +#define Rx_index_mapping_NUM 15 +#define AVG_THERMAL_NUM 8 +#define IQK_Matrix_REG_NUM 8 +#define IQK_Matrix_Settings_NUM 1+24+21 + +#ifdef CONFIG_PCI_HCI +#define SET_RTL8192SE_RF_SLEEP(_pAdapter) \ +{ \ + u1Byte u1bTmp; \ + u1bTmp = PlatformEFIORead1Byte(_pAdapter, REG_LDOV12D_CTRL); \ + u1bTmp |= BIT0; \ + PlatformEFIOWrite1Byte(_pAdapter, REG_LDOV12D_CTRL, u1bTmp); \ + PlatformEFIOWrite1Byte(_pAdapter, REG_SPS_OCP_CFG, 0x0); \ + PlatformEFIOWrite1Byte(_pAdapter, TXPAUSE, 0xFF); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ + delay_us(100); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + PlatformEFIOWrite1Byte(_pAdapter, PHY_CCA, 0x0); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x37FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x77FC); \ + delay_us(10); \ + PlatformEFIOWrite2Byte(_pAdapter, CMDR, 0x57FC); \ +} +#endif + + +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ +typedef enum _SwChnlCmdID{ + CmdID_End, + CmdID_SetTxPowerLevel, + CmdID_BBRegWrite10, + CmdID_WritePortUlong, + CmdID_WritePortUshort, + CmdID_WritePortUchar, + CmdID_RF_WriteReg, +}SwChnlCmdID; + + +/* 1. Switch channel related */ +typedef struct _SwChnlCmd{ + SwChnlCmdID CmdID; + u32 Para1; + u32 Para2; + u32 msDelay; +}SwChnlCmd; + +typedef enum _HW90_BLOCK{ + HW90_BLOCK_MAC = 0, + HW90_BLOCK_PHY0 = 1, + HW90_BLOCK_PHY1 = 2, + HW90_BLOCK_RF = 3, + HW90_BLOCK_MAXIMUM = 4, // Never use this +}HW90_BLOCK_E, *PHW90_BLOCK_E; + +//vivi added this for read parameter from header, 20100908 +typedef enum _RF_CONTENT{ + radioa_txt = 0x1000, + radiob_txt = 0x1001, + radioc_txt = 0x1002, + radiod_txt = 0x1003 +} RF_CONTENT; + +typedef enum _RF90_RADIO_PATH{ + RF90_PATH_A = 0, //Radio Path A + RF90_PATH_B = 1, //Radio Path B + RF90_PATH_C = 2, //Radio Path C + RF90_PATH_D = 3, //Radio Path D + //RF90_PATH_MAX //Max RF number 90 support +}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E; + +#define RF90_PATH_MAX 2 + + +typedef enum _WIRELESS_MODE { + WIRELESS_MODE_UNKNOWN = 0x00, + WIRELESS_MODE_A = 0x01, + WIRELESS_MODE_B = 0x02, + WIRELESS_MODE_G = 0x04, + WIRELESS_MODE_AUTO = 0x08, + WIRELESS_MODE_N_24G = 0x10, + WIRELESS_MODE_N_5G = 0x20 +} WIRELESS_MODE; + + +#if(TX_POWER_FOR_5G_BAND == 1) +#define CHANNEL_MAX_NUMBER 14+24+21 // 14 is the max channel number +#define CHANNEL_GROUP_MAX 3+9 // ch1~3, ch4~9, ch10~14 total three groups +#define MAX_PG_GROUP 13 +#else +#define CHANNEL_MAX_NUMBER 14 // 14 is the max channel number +#define CHANNEL_GROUP_MAX 3 // ch1~3, ch4~9, ch10~14 total three groups +#define MAX_PG_GROUP 7 +#endif +#define CHANNEL_GROUP_MAX_2G 3 +#define CHANNEL_GROUP_IDX_5GL 3 +#define CHANNEL_GROUP_IDX_5GM 6 +#define CHANNEL_GROUP_IDX_5GH 9 +#define CHANNEL_GROUP_MAX_5G 9 +#define CHANNEL_MAX_NUMBER_2G 14 + +#if (RTL8192D_DUAL_MAC_MODE_SWITCH == 1) +typedef enum _BaseBand_Config_Type{ + BaseBand_Config_PHY_REG = 0, + BaseBand_Config_AGC_TAB = 1, + BaseBand_Config_AGC_TAB_2G = 2, + BaseBand_Config_AGC_TAB_5G = 3, +}BaseBand_Config_Type, *PBaseBand_Config_Type; +#else +typedef enum _BaseBand_Config_Type{ + BaseBand_Config_PHY_REG = 0, //Radio Path A + BaseBand_Config_AGC_TAB = 1, //Radio Path B +}BaseBand_Config_Type, *PBaseBand_Config_Type; +#endif + + +typedef enum _MACPHY_MODE_8192D{ + DUALMAC_DUALPHY, + DUALMAC_SINGLEPHY, + SINGLEMAC_SINGLEPHY +}MACPHY_MODE_8192D,*PMACPHY_MODE_8192D; + +typedef enum _BAND_TYPE{ + BAND_ON_2_4G = 0, + BAND_ON_5G, + BAND_ON_BOTH, + BANDMAX +}BAND_TYPE,*PBAND_TYPE; + +typedef enum _PHY_Rate_Tx_Power_Offset_Area{ + RA_OFFSET_LEGACY_OFDM1, + RA_OFFSET_LEGACY_OFDM2, + RA_OFFSET_HT_OFDM1, + RA_OFFSET_HT_OFDM2, + RA_OFFSET_HT_OFDM3, + RA_OFFSET_HT_OFDM4, + RA_OFFSET_HT_CCK, +}RA_OFFSET_AREA,*PRA_OFFSET_AREA; + + +/* BB/RF related */ +typedef enum _RF_TYPE_8190P{ + RF_TYPE_MIN, // 0 + RF_8225=1, // 1 11b/g RF for verification only + RF_8256=2, // 2 11b/g/n + RF_8258=3, // 3 11a/b/g/n RF + RF_6052=4, // 4 11b/g/n RF + //RF_6052=5, // 4 11b/g/n RF + // TODO: We sholud remove this psudo PHY RF after we get new RF. + RF_PSEUDO_11N=5, // 5, It is a temporality RF. +}RF_TYPE_8190P_E,*PRF_TYPE_8190P_E; + + +typedef enum _RATR_TABLE_MODE_8192C{ + RATR_INX_WIRELESS_NGB = 0, + RATR_INX_WIRELESS_NG = 1, + RATR_INX_WIRELESS_NB = 2, + RATR_INX_WIRELESS_N = 3, + RATR_INX_WIRELESS_GB = 4, + RATR_INX_WIRELESS_G = 5, + RATR_INX_WIRELESS_B = 6, + RATR_INX_WIRELESS_MC = 7, + RATR_INX_WIRELESS_A = 8, +}RATR_TABLE_MODE_8192C, *PRATR_TABLE_MODE_8192C; + +typedef struct _BB_REGISTER_DEFINITION{ + u32 rfintfs; // set software control: + // 0x870~0x877[8 bytes] + + u32 rfintfi; // readback data: + // 0x8e0~0x8e7[8 bytes] + + u32 rfintfo; // output data: + // 0x860~0x86f [16 bytes] + + u32 rfintfe; // output enable: + // 0x860~0x86f [16 bytes] + + u32 rf3wireOffset; // LSSI data: + // 0x840~0x84f [16 bytes] + + u32 rfLSSI_Select; // BB Band Select: + // 0x878~0x87f [8 bytes] + + u32 rfTxGainStage; // Tx gain stage: + // 0x80c~0x80f [4 bytes] + + u32 rfHSSIPara1; // wire parameter control1 : + // 0x820~0x823,0x828~0x82b, 0x830~0x833, 0x838~0x83b [16 bytes] + + u32 rfHSSIPara2; // wire parameter control2 : + // 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] + + u32 rfSwitchControl; //Tx Rx antenna control : + // 0x858~0x85f [16 bytes] + + u32 rfAGCControl1; //AGC parameter control1 : + // 0xc50~0xc53,0xc58~0xc5b, 0xc60~0xc63, 0xc68~0xc6b [16 bytes] + + u32 rfAGCControl2; //AGC parameter control2 : + // 0xc54~0xc57,0xc5c~0xc5f, 0xc64~0xc67, 0xc6c~0xc6f [16 bytes] + + u32 rfRxIQImbalance; //OFDM Rx IQ imbalance matrix : + // 0xc14~0xc17,0xc1c~0xc1f, 0xc24~0xc27, 0xc2c~0xc2f [16 bytes] + + u32 rfRxAFE; //Rx IQ DC ofset and Rx digital filter, Rx DC notch filter : + // 0xc10~0xc13,0xc18~0xc1b, 0xc20~0xc23, 0xc28~0xc2b [16 bytes] + + u32 rfTxIQImbalance; //OFDM Tx IQ imbalance matrix + // 0xc80~0xc83,0xc88~0xc8b, 0xc90~0xc93, 0xc98~0xc9b [16 bytes] + + u32 rfTxAFE; //Tx IQ DC Offset and Tx DFIR type + // 0xc84~0xc87,0xc8c~0xc8f, 0xc94~0xc97, 0xc9c~0xc9f [16 bytes] + + u32 rfLSSIReadBack; //LSSI RF readback data SI mode + // 0x8a0~0x8af [16 bytes] + + u32 rfLSSIReadBackPi; //LSSI RF readback data PI mode 0x8b8-8bc for Path A and B + +}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; + +#ifdef CONFIG_MP_INCLUDED +typedef enum _ANTENNA_PATH{ + ANTENNA_NONE = 0x00, + ANTENNA_D , + ANTENNA_C , + ANTENNA_CD , + ANTENNA_B , + ANTENNA_BD , + ANTENNA_BC , + ANTENNA_BCD , + ANTENNA_A , + ANTENNA_AD , + ANTENNA_AC , + ANTENNA_ACD , + ANTENNA_AB , + ANTENNA_ABD , + ANTENNA_ABC , + ANTENNA_ABCD +} ANTENNA_PATH; +#endif + +typedef struct _R_ANTENNA_SELECT_OFDM{ + u32 r_tx_antenna:4; + u32 r_ant_l:4; + u32 r_ant_non_ht:4; + u32 r_ant_ht1:4; + u32 r_ant_ht2:4; + u32 r_ant_ht_s1:4; + u32 r_ant_non_ht_s1:4; + u32 OFDM_TXSC:2; + u32 Reserved:2; +}R_ANTENNA_SELECT_OFDM; + +typedef struct _R_ANTENNA_SELECT_CCK{ + u8 r_cckrx_enable_2:2; + u8 r_cckrx_enable:2; + u8 r_ccktx_enable:4; +}R_ANTENNA_SELECT_CCK; + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + + +/*------------------------Export Marco Definition---------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ + +//Added for TX Power +//u8 GetRightChnlPlace(u8 chnl); +u8 rtl8192d_GetRightChnlPlaceforIQK(u8 chnl); +u8 rtl8192d_getChnlGroupfromArray(u8 chnl); +/*--------------------------Exported Function prototype---------------------*/ +// +// BB and RF register read/write +// +void rtl8192d_PHY_SetBBReg1Byte( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 rtl8192d_PHY_QueryBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192d_PHY_SetBBReg( IN PADAPTER Adapter, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); +u32 rtl8192d_PHY_QueryRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask ); +void rtl8192d_PHY_SetRFReg( IN PADAPTER Adapter, + IN RF90_RADIO_PATH_E eRFPath, + IN u32 RegAddr, + IN u32 BitMask, + IN u32 Data ); + +// +// Initialization related function +// +/* MAC/BB/RF HAL config */ +extern int PHY_MACConfig8192D( IN PADAPTER Adapter ); +extern int PHY_BBConfig8192D( IN PADAPTER Adapter ); +extern int PHY_RFConfig8192D( IN PADAPTER Adapter ); +/* RF config */ +int rtl8192d_PHY_ConfigRFWithParaFile( IN PADAPTER Adapter, + IN u8* pFileName, + IN RF90_RADIO_PATH_E eRFPath); +int rtl8192d_PHY_ConfigRFWithHeaderFile( IN PADAPTER Adapter, + IN RF_CONTENT Content, + IN RF90_RADIO_PATH_E eRFPath); +/* BB/RF readback check for making sure init OK */ +int rtl8192d_PHY_CheckBBAndRFOK( IN PADAPTER Adapter, + IN HW90_BLOCK_E CheckBlock, + IN RF90_RADIO_PATH_E eRFPath ); +/* Read initi reg value for tx power setting. */ +void rtl8192d_PHY_GetHWRegOriginalValue( IN PADAPTER Adapter ); + +// +// RF Power setting +// +//extern BOOLEAN PHY_SetRFPowerState(IN PADAPTER Adapter, +// IN RT_RF_POWER_STATE eRFPowerState); + +// +// BB TX Power R/W +// +void PHY_GetTxPowerLevel8192D( IN PADAPTER Adapter, + OUT u32* powerlevel ); +void PHY_SetTxPowerLevel8192D( IN PADAPTER Adapter, + IN u8 channel ); +BOOLEAN PHY_UpdateTxPowerDbm8192D( IN PADAPTER Adapter, + IN int powerInDbm ); + +// +VOID +PHY_ScanOperationBackup8192D(IN PADAPTER Adapter, + IN u8 Operation ); + +// +// Switch bandwidth for 8192S +// +//void PHY_SetBWModeCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SetBWMode8192D( IN PADAPTER pAdapter, + IN HT_CHANNEL_WIDTH ChnlWidth, + IN unsigned char Offset ); + +// +// Set FW CMD IO for 8192S. +// +//extern BOOLEAN HalSetIO8192C( IN PADAPTER Adapter, +// IN IO_TYPE IOType); + +// +// Set A2 entry to fw for 8192S +// +extern void FillA2Entry8192C( IN PADAPTER Adapter, + IN u8 index, + IN u8* val); + + +// +// channel switch related funciton +// +//extern void PHY_SwChnlCallback8192C( IN PRT_TIMER pTimer ); +void PHY_SwChnl8192D( IN PADAPTER pAdapter, + IN u8 channel ); + // Call after initialization +void PHY_SwChnlPhy8192D( IN PADAPTER pAdapter, + IN u8 channel ); + +extern void ChkFwCmdIoDone( IN PADAPTER Adapter); + +#ifdef USE_WORKITEM +//extern void SetIOWorkItemCallback( IN PVOID pContext ); +#else +//extern void SetIOTimerCallback( IN PRT_TIMER pTimer); +#endif + +// +// BB/MAC/RF other monitor API +// +void PHY_SetMonitorMode8192D(IN PADAPTER pAdapter, + IN BOOLEAN bEnableMonitorMode ); + +BOOLEAN PHY_CheckIsLegalRfPath8192D(IN PADAPTER pAdapter, + IN u32 eRFPath ); + +// +// IQ calibrate +// +void rtl8192d_PHY_IQCalibrate( IN PADAPTER pAdapter); + + +// +// LC calibrate +// +void rtl8192d_PHY_LCCalibrate(IN PADAPTER pAdapter); + +// +// AP calibrate +// +void rtl8192d_PHY_APCalibrate(IN PADAPTER pAdapter, IN char delta); + + +// +// Modify the value of the hw register when beacon interval be changed. +// +void +rtl8192d_PHY_SetBeaconHwReg( IN PADAPTER Adapter, + IN u16 BeaconInterval ); + + +extern VOID +PHY_SwitchEphyParameter( + IN PADAPTER Adapter + ); + +extern VOID +PHY_EnableHostClkReq( + IN PADAPTER Adapter + ); + +BOOLEAN +SetAntennaConfig92C( + IN PADAPTER Adapter, + IN u8 DefaultAnt + ); + +VOID +PHY_UpdateBBRFConfiguration8192D( + IN PADAPTER Adapter, + IN BOOLEAN bisBandSwitch +); + +VOID PHY_ReadMacPhyMode92D( + IN PADAPTER Adapter, + IN BOOLEAN AutoloadFail +); + +VOID PHY_ConfigMacPhyMode92D( + IN PADAPTER Adapter +); + +VOID PHY_ConfigMacPhyModeInfo92D( + IN PADAPTER Adapter +); + +VOID PHY_ConfigMacCoexist_RFPage92D( + IN PADAPTER Adapter +); + +VOID +rtl8192d_PHY_InitRxSetting( + IN PADAPTER Adapter +); + +VOID +rtl8192d_PHY_ResetIQKResult( + IN PADAPTER Adapter +); + + +VOID +rtl8192d_PHY_SetRFPathSwitch(IN PADAPTER pAdapter, IN BOOLEAN bMain); + +VOID +HalChangeCCKStatus8192D( + IN PADAPTER Adapter, + IN BOOLEAN bCCKDisable +); + +/*--------------------------Exported Function prototype---------------------*/ + +#define PHY_SetBBReg1Byte(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg1Byte((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtl8192d_PHY_QueryBBReg((Adapter), (RegAddr), (BitMask)) +#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtl8192d_PHY_SetBBReg((Adapter), (RegAddr), (BitMask), (Data)) +#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtl8192d_PHY_QueryRFReg((Adapter), (eRFPath), (RegAddr), (BitMask)) +#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtl8192d_PHY_SetRFReg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data)) + +#define PHY_SetMacReg PHY_SetBBReg + +#endif // __INC_HAL8192SPHYCFG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h new file mode 100755 index 000000000000..d07bc1ff0579 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DPhyReg.h @@ -0,0 +1,1059 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/***************************************************************************** + * + * Module: __INC_HAL8192DPHYREG_H + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __INC_HAL8192DPHYREG_H +#define __INC_HAL8192DPHYREG_H + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c + +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 +#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define TransceiverA_HSPI_Readback 0x8b8 // Transceiver A HSPI Readback +#define TransceiverB_HSPI_Readback 0x8bc // Transceiver B HSPI Readback +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c + +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 + + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_A_Rate18_06 0xe00 +#define rTxAGC_A_Rate54_24 0xe04 +#define rTxAGC_A_CCK1_Mcs32 0xe08 +#define rTxAGC_A_Mcs03_Mcs00 0xe10 +#define rTxAGC_A_Mcs07_Mcs04 0xe14 +#define rTxAGC_A_Mcs11_Mcs08 0xe18 +#define rTxAGC_A_Mcs15_Mcs12 0xe1c + +#define rTxAGC_B_Rate18_06 0x830 +#define rTxAGC_B_Rate54_24 0x834 +#define rTxAGC_B_CCK1_55_Mcs32 0x838 +#define rTxAGC_B_Mcs03_Mcs00 0x83c +#define rTxAGC_B_Mcs07_Mcs04 0x848 +#define rTxAGC_B_Mcs11_Mcs08 0x84c +#define rTxAGC_B_Mcs15_Mcs12 0x868 +#define rTxAGC_B_CCK11_A_CCK2_11 0x86c + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +#define rZebra1_Channel 0x7 // RF channel switch + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x42 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bAntennaSelect 0x0300 + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 + +#define bLSSIReadAddress 0x7f800000 // T65 RF + +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal + +#define bLSSIReadBackData 0xfffff // T65 RF + +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMask12Bits 0xfff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f + +//for PutRFRegsetting & GetRFRegSetting BitMask +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff +//#define bRFRegOffsetMask 0xfff + +//MAC0 will wirte PHY1 +#define MAC0_ACCESS_PHY1 0x4000 +//MAC1 will wirte PHY0 +#define MAC1_ACCESS_PHY0 0x2000 + +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#define PathA 0x0 // Useless +#define PathB 0x1 +#define PathC 0x2 +#define PathD 0x3 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h new file mode 100755 index 000000000000..9dba96837870 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DUHWImg.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DU_FW_IMG_H +#define __INC_HAL8192DU_FW_IMG_H + +#include + +/*Created on 2011/ 8/ 8, 1:41*/ + +#define ImgArrayLength 29642 +extern u8 Rtl8192DUFwImgArray[ImgArrayLength]; +#define MainArrayLength 1 +extern u8 Rtl8192DUFwMainArray[MainArrayLength]; +#define DataArrayLength 1 +extern u8 Rtl8192DUFwDataArray[DataArrayLength]; +#define PHY_REG_2TArrayLength 380 +extern u32 Rtl8192DUPHY_REG_2TArray[PHY_REG_2TArrayLength]; +#define PHY_REG_1TArrayLength 1 +extern u32 Rtl8192DUPHY_REG_1TArray[PHY_REG_1TArrayLength]; +#define PHY_REG_Array_PGLength 624 +extern u32 Rtl8192DUPHY_REG_Array_PG[PHY_REG_Array_PGLength]; +#define PHY_REG_Array_MPLength 10 +extern u32 Rtl8192DUPHY_REG_Array_MP[PHY_REG_Array_MPLength]; +#define RadioA_2TArrayLength 378 +extern u32 Rtl8192DURadioA_2TArray[RadioA_2TArrayLength]; +#define RadioB_2TArrayLength 384 +extern u32 Rtl8192DURadioB_2TArray[RadioB_2TArrayLength]; +#define RadioA_1TArrayLength 1 +extern u32 Rtl8192DURadioA_1TArray[RadioA_1TArrayLength]; +#define RadioB_1TArrayLength 1 +extern u32 Rtl8192DURadioB_1TArray[RadioB_1TArrayLength]; +#define RadioA_2T_intPAArrayLength 378 +extern u32 Rtl8192DURadioA_2T_intPAArray[RadioA_2T_intPAArrayLength]; +#define RadioB_2T_intPAArrayLength 384 +extern u32 Rtl8192DURadioB_2T_intPAArray[RadioB_2T_intPAArrayLength]; +#define MAC_2TArrayLength 160 +extern u32 Rtl8192DUMAC_2TArray[MAC_2TArrayLength]; +#define AGCTAB_ArrayLength 386 +extern u32 Rtl8192DUAGCTAB_Array[AGCTAB_ArrayLength]; +#define AGCTAB_5GArrayLength 194 +extern u32 Rtl8192DUAGCTAB_5GArray[AGCTAB_5GArrayLength]; +#define AGCTAB_2GArrayLength 194 +extern u32 Rtl8192DUAGCTAB_2GArray[AGCTAB_2GArrayLength]; +#define AGCTAB_2TArrayLength 1 +extern u32 Rtl8192DUAGCTAB_2TArray[AGCTAB_2TArrayLength]; +#define AGCTAB_1TArrayLength 1 +extern u32 Rtl8192DUAGCTAB_1TArray[AGCTAB_1TArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h b/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h new file mode 100755 index 000000000000..3ce7a3d80983 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/Hal8192DUTestHWImg.h @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __INC_HAL8192DUTEST_FW_IMG_H +#define __INC_HAL8192DUTEST_FW_IMG_H + +#include + +/*Created on 2010/ 5/27, 9:49*/ + +#define Rtl8192DTestImgArrayLength 15054 +extern u8 Rtl8192DTestFwImgArray[Rtl8192DTestImgArrayLength]; +#define Rtl8192DTestMainArrayLength 1 +extern u8 Rtl8192DTestFwMainArray[Rtl8192DTestMainArrayLength]; +#define Rtl8192DTestDataArrayLength 1 +extern u8 Rtl8192DTestFwDataArray[Rtl8192DTestDataArrayLength]; +#define Rtl8192DTestPHY_REG_2TArrayLength 376 +extern u32 Rtl8192DTestPHY_REG_2TArray[Rtl8192DTestPHY_REG_2TArrayLength]; +#define Rtl8192DTestPHY_REG_1TArrayLength 1 +extern u32 Rtl8192DTestPHY_REG_1TArray[Rtl8192DTestPHY_REG_1TArrayLength]; +#define Rtl8192DTestPHY_REG_Array_PGLength 1 +extern u32 Rtl8192DTestPHY_REG_Array_PG[Rtl8192DTestPHY_REG_Array_PGLength]; +#define Rtl8192DTestRadioA_2TArrayLength 340 +extern u32 Rtl8192DTestRadioA_2TArray[Rtl8192DTestRadioA_2TArrayLength]; +#define Rtl8192DTestRadioB_2TArrayLength 340 +extern u32 Rtl8192DTestRadioB_2TArray[Rtl8192DTestRadioB_2TArrayLength]; +#define Rtl8192DTestRadioA_1TArrayLength 1 +extern u32 Rtl8192DTestRadioA_1TArray[Rtl8192DTestRadioA_1TArrayLength]; +#define Rtl8192DTestRadioB_1TArrayLength 1 +extern u32 Rtl8192DTestRadioB_1TArray[Rtl8192DTestRadioB_1TArrayLength]; +#define Rtl8192DTestMAC_2TArrayLength 174 +extern u32 Rtl8192DTestMAC_2TArray[Rtl8192DTestMAC_2TArrayLength]; +#define Rtl8192DTestAGCTAB_5GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_5GArray[Rtl8192DTestAGCTAB_5GArrayLength]; +#define Rtl8192DTestAGCTAB_2GArrayLength 514 +extern u32 Rtl8192DTestAGCTAB_2GArray[Rtl8192DTestAGCTAB_2GArrayLength]; + +#endif //__INC_HAL8192CU_FW_IMG_H diff --git a/drivers/net/wireless/rtl8192c/include/autoconf.h b/drivers/net/wireless/rtl8192c/include/autoconf.h new file mode 100755 index 000000000000..6b6e6caae14b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/autoconf.h @@ -0,0 +1,231 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +/* + * Public General Config + */ +#define AUTOCONF_INCLUDED +#define RTL871X_MODULE_NAME "92CU" +#define DRV_NAME "rtl8192cu" + +#define CONFIG_USB_HCI 1 + +#define CONFIG_RTL8192C 1 + +#define PLATFORM_LINUX 1 + + +/* + * Internal General Config + */ +//#define CONFIG_PWRCTRL +//#define CONFIG_H2CLBK + +#define CONFIG_EMBEDDED_FWIMG 1 + +//#define CONFIG_R871X_TEST 1 + +#define CONFIG_80211N_HT 1 + +#define CONFIG_RECV_REORDERING_CTRL 1 + +//#define CONFIG_TCP_CSUM_OFFLOAD_RX 1 + +//#define CONFIG_DRVEXT_MODULE 1 + +#ifndef CONFIG_MP_INCLUDED +//#define CONFIG_IPS 1 +/* modified by gwl, we'd better comment out the IPS function if we use lower speed IO interface. */ +#ifdef CONFIG_IPS + //#define CONFIG_IPS_LEVEL_2 1 //enable this to set default IPS mode to IPS_LEVEL_2 +#endif +#define SUPPORT_HW_RFOFF_DETECTED 1 + +#define CONFIG_LPS 1 +//#define CONFIG_BT_COEXIST 1 +//befor link +#define CONFIG_ANTENNA_DIVERSITY +//after link +#ifdef CONFIG_ANTENNA_DIVERSITY +#define CONFIG_SW_ANTENNA_DIVERSITY +//#define CONFIG_HW_ANTENNA_DIVERSITY +#endif + +#else +#define CONFIG_MP_IWPRIV_SUPPORT 1 +#endif + +#define CONFIG_AP_MODE 1 +#define CONFIG_NATIVEAP_MLME 1 + +// Added by Albert 20110314 +//#define CONFIG_P2P 1 + +// Added by Albert 20110812 +// The CONFIG_WFD is for supporting the Wi-Fi display +#ifdef CONFIG_P2P +//#define CONFIG_WFD 1 +#endif + +// Added by Kurt 20110511 +//#define CONFIG_TDLS 1 + +#ifdef CONFIG_AP_MODE + #ifndef CONFIG_NATIVEAP_MLME + #define CONFIG_HOSTAPD_MLME 1 + #endif + #define CONFIG_FIND_BEST_CHANNEL 1 +#endif + +#define CONFIG_SKB_COPY 1//for amsdu + +#define CONFIG_LED +#ifdef CONFIG_LED + #define CONFIG_SW_LED +#endif //CONFIG_LED + +#define CONFIG_HANDLE_JOINBSS_ON_ASSOC_RSP + +#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface +#define CONFIG_GLOBAL_UI_PID + +#define CONFIG_LAYER2_ROAMING +#define CONFIG_LAYER2_ROAMING_RESUME +//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general... +//#define CONFIG_RESUME_IN_WORKQUEUE +//#define CONFIG_SET_SCAN_DENY_TIMER +#define CONFIG_LONG_DELAY_ISSUE +#define CONFIG_NEW_SIGNAL_STAT_PROCESS + +/* + * Interface Related Config + */ +//#define CONFIG_USB_INTERRUPT_IN_PIPE 1 + +#ifndef CONFIG_MINIMAL_MEMORY_USAGE + #define CONFIG_USB_TX_AGGREGATION 1 + #define CONFIG_USB_RX_AGGREGATION 1 +#endif + +#define CONFIG_PREALLOC_RECV_SKB 1 +//#define CONFIG_REDUCE_USB_TX_INT 1 // Trade-off: Improve performance, but may cause TX URBs blocked by USB Host/Bus driver on few platforms. +//#define CONFIG_EASY_REPLACEMENT 1 + +/* + * CONFIG_USE_USB_BUFFER_ALLOC_XX uses Linux USB Buffer alloc API and is for Linux platform only now! + */ +#define CONFIG_USE_USB_BUFFER_ALLOC_TX 1 // Trade-off: For TX path, improve stability on some platforms, but may cause performance degrade on other platforms. +//#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1 // For RX path + +/* + * USB VENDOR REQ BUFFER ALLOCATION METHOD + * if not set we'll use function local variable (stack memory) + */ +//#define CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE +#define CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + +#define CONFIG_USB_VENDOR_REQ_MUTEX +#define CONFIG_VENDOR_REQ_RETRY + +//#define CONFIG_USB_SUPPORT_ASYNC_VDN_REQ 1 + + +/* + * HAL Related Config + */ + +#define RTL8192C_RX_PACKET_NO_INCLUDE_CRC 1 + +#define SUPPORTED_BLOCK_IO + + + +#define RTL8192CU_FW_DOWNLOAD_ENABLE 1 + +#define CONFIG_ONLY_ONE_OUT_EP_TO_LOW 0 + +#define CONFIG_OUT_EP_WIFI_MODE 0 + +#define ENABLE_USB_DROP_INCORRECT_OUT 0 + +#define RTL8192CU_ASIC_VERIFICATION 0 // For ASIC verification. + +#define RTL8192CU_ADHOC_WORKAROUND_SETTING 1 + +#define DISABLE_BB_RF 0 + +#define RTL8191C_FPGA_NETWORKTYPE_ADHOC 0 + +#ifdef CONFIG_MP_INCLUDED + #define MP_DRIVER 1 + #undef CONFIG_USB_TX_AGGREGATION + #undef CONFIG_USB_RX_AGGREGATION +#else + #define MP_DRIVER 0 +#endif + + +/* + * Platform Related Config + */ +#ifdef CONFIG_PLATFORM_MN10300 +#define CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV + +#if defined (CONFIG_SW_ANTENNA_DIVERSITY) + #undef CONFIG_SW_ANTENNA_DIVERSITY + #define CONFIG_HW_ANTENNA_DIVERSITY +#endif + +#endif + +#ifdef CONFIG_WISTRON_PLATFORM + +#endif + +#ifdef CONFIG_PLATFORM_TI_DM365 +#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1 +#endif + + +/* + * Debug Related Config + */ +//#define CONFIG_DEBUG_RTL871X + +#define DBG 0 +//#define CONFIG_DEBUG_RTL819X + +//#define CONFIG_PROC_DEBUG 1 + +//#define DBG_IO +//#define DBG_DELAY_OS +//#define DBG_MEM_ALLOC +//#define DBG_IOCTL + +//#define DBG_TX +//#define DBG_XMIT_BUF +//#define DBG_TX_DROP_FRAME + +//#define DBG_RX_DROP_FRAME +//#define DBG_RX_SEQ + +//#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE +//#define DBG_ROAMING_TEST + diff --git a/drivers/net/wireless/rtl8192c/include/basic_types.h b/drivers/net/wireless/rtl8192c/include/basic_types.h new file mode 100755 index 000000000000..f8802240f509 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/basic_types.h @@ -0,0 +1,276 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __BASIC_TYPES_H__ +#define __BASIC_TYPES_H__ + +#include + + +#define SUCCESS 0 +#define FAIL (-1) + +#ifndef TRUE + #define _TRUE 1 +#else + #define _TRUE TRUE +#endif + +#ifndef FALSE + #define _FALSE 0 +#else + #define _FALSE FALSE +#endif + +#ifdef PLATFORM_WINDOWS + + typedef signed char s8; + typedef unsigned char u8; + + typedef signed short s16; + typedef unsigned short u16; + + typedef signed long s32; + typedef unsigned long u32; + + typedef unsigned int uint; + typedef signed int sint; + + + typedef signed long long s64; + typedef unsigned long long u64; + + #ifdef NDIS50_MINIPORT + + #define NDIS_MAJOR_VERSION 5 + #define NDIS_MINOR_VERSION 0 + + #endif + + #ifdef NDIS51_MINIPORT + + #define NDIS_MAJOR_VERSION 5 + #define NDIS_MINOR_VERSION 1 + + #endif + + typedef NDIS_PROC proc_t; + + typedef LONG atomic_t; + +#endif + + +#ifdef PLATFORM_LINUX + + #include + #define IN + #define OUT + #define VOID void + #define NDIS_OID uint + #define NDIS_STATUS uint + + typedef signed int sint; + + #ifndef PVOID + typedef void * PVOID; + //#define PVOID (void *) + #endif + + #define UCHAR u8 + #define USHORT u16 + #define UINT u32 + #define ULONG u32 + + typedef void (*proc_t)(void*); + + typedef __kernel_size_t SIZE_T; + typedef __kernel_ssize_t SSIZE_T; + #define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +#endif + +#define MEM_ALIGNMENT_OFFSET (sizeof (SIZE_T)) +#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1) + +#define SIZE_PTR SIZE_T +#define SSIZE_PTR SSIZE_T + +//port from fw by thomas +// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness + +/* + * Call endian free function when + * 1. Read/write packet content. + * 2. Before write integer to IO. + * 3. After read integer from IO. +*/ + +// +// Byte Swapping routine. +// +#define EF1Byte +#define EF2Byte le16_to_cpu +#define EF4Byte le32_to_cpu + +// +// Read LE format data from memory +// +#define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr))) +#define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr))) +#define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr))) + +// +// Write LE data to memory +// +#define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr)))=EF1Byte(_val) +#define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr)))=EF2Byte(_val) +#define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr)))=EF4Byte(_val) + +// +// Example: +// BIT_LEN_MASK_32(0) => 0x00000000 +// BIT_LEN_MASK_32(1) => 0x00000001 +// BIT_LEN_MASK_32(2) => 0x00000003 +// BIT_LEN_MASK_32(32) => 0xFFFFFFFF +// +#define BIT_LEN_MASK_32(__BitLen) \ + (0xFFFFFFFF >> (32 - (__BitLen))) +// +// Example: +// BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 +// BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 +// +#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_32(__BitLen) << (__BitOffset)) + +// +// Description: +// Return 4-byte value in host byte ordering from +// 4-byte pointer in litten-endian system. +// +#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + (EF4Byte(*((u32 *)(__pStart)))) + +// +// Description: +// Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to +// 4-byte value in host byte ordering. +// +#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_32(__BitLen) \ + ) + +// +// Description: +// Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering +// and return the result in 4-byte value in host byte ordering. +// +#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \ + ) + +// +// Description: +// Set subfield of little-endian 4-byte value to specified value. +// +#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u32 *)(__pStart)) = \ + EF4Byte( \ + LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \ + ); + + +#define BIT_LEN_MASK_16(__BitLen) \ + (0xFFFF >> (16 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_16(__BitLen) << (__BitOffset)) + +#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + (EF2Byte(*((u16 *)(__pStart)))) + +#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_16(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u16 *)(__pStart)) = \ + EF2Byte( \ + LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \ + ); + +#define BIT_LEN_MASK_8(__BitLen) \ + (0xFF >> (8 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_8(__BitLen) << (__BitOffset)) + +#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + (EF1Byte(*((u8 *)(__pStart)))) + +#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_8(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u8 *)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \ + ); + +// Get the N-bytes aligment offset from the current length +#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment)) + +typedef unsigned char BOOLEAN,*PBOOLEAN; + +#endif //__BASIC_TYPES_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h b/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h new file mode 100755 index 000000000000..eca68a6569f6 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/big_endian.h @@ -0,0 +1,87 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_BIG_ENDIAN_H +#define _LINUX_BYTEORDER_BIG_ENDIAN_H + +#ifndef __BIG_ENDIAN +#define __BIG_ENDIAN 4321 +#endif +#ifndef __BIG_ENDIAN_BITFIELD +#define __BIG_ENDIAN_BITFIELD +#endif + +#include + +#define __constant_htonl(x) ((__u32)(x)) +#define __constant_ntohl(x) ((__u32)(x)) +#define __constant_htons(x) ((__u16)(x)) +#define __constant_ntohs(x) ((__u16)(x)) +#define __constant_cpu_to_le64(x) ___constant_swab64((x)) +#define __constant_le64_to_cpu(x) ___constant_swab64((x)) +#define __constant_cpu_to_le32(x) ___constant_swab32((x)) +#define __constant_le32_to_cpu(x) ___constant_swab32((x)) +#define __constant_cpu_to_le16(x) ___constant_swab16((x)) +#define __constant_le16_to_cpu(x) ___constant_swab16((x)) +#define __constant_cpu_to_be64(x) ((__u64)(x)) +#define __constant_be64_to_cpu(x) ((__u64)(x)) +#define __constant_cpu_to_be32(x) ((__u32)(x)) +#define __constant_be32_to_cpu(x) ((__u32)(x)) +#define __constant_cpu_to_be16(x) ((__u16)(x)) +#define __constant_be16_to_cpu(x) ((__u16)(x)) +#define __cpu_to_le64(x) __swab64((x)) +#define __le64_to_cpu(x) __swab64((x)) +#define __cpu_to_le32(x) __swab32((x)) +#define __le32_to_cpu(x) __swab32((x)) +#define __cpu_to_le16(x) __swab16((x)) +#define __le16_to_cpu(x) __swab16((x)) +#define __cpu_to_be64(x) ((__u64)(x)) +#define __be64_to_cpu(x) ((__u64)(x)) +#define __cpu_to_be32(x) ((__u32)(x)) +#define __be32_to_cpu(x) ((__u32)(x)) +#define __cpu_to_be16(x) ((__u16)(x)) +#define __be16_to_cpu(x) ((__u16)(x)) +#define __cpu_to_le64p(x) __swab64p((x)) +#define __le64_to_cpup(x) __swab64p((x)) +#define __cpu_to_le32p(x) __swab32p((x)) +#define __le32_to_cpup(x) __swab32p((x)) +#define __cpu_to_le16p(x) __swab16p((x)) +#define __le16_to_cpup(x) __swab16p((x)) +#define __cpu_to_be64p(x) (*(__u64*)(x)) +#define __be64_to_cpup(x) (*(__u64*)(x)) +#define __cpu_to_be32p(x) (*(__u32*)(x)) +#define __be32_to_cpup(x) (*(__u32*)(x)) +#define __cpu_to_be16p(x) (*(__u16*)(x)) +#define __be16_to_cpup(x) (*(__u16*)(x)) +#define __cpu_to_le64s(x) __swab64s((x)) +#define __le64_to_cpus(x) __swab64s((x)) +#define __cpu_to_le32s(x) __swab32s((x)) +#define __le32_to_cpus(x) __swab32s((x)) +#define __cpu_to_le16s(x) __swab16s((x)) +#define __le16_to_cpus(x) __swab16s((x)) +#define __cpu_to_be64s(x) do {} while (0) +#define __be64_to_cpus(x) do {} while (0) +#define __cpu_to_be32s(x) do {} while (0) +#define __be32_to_cpus(x) do {} while (0) +#define __cpu_to_be16s(x) do {} while (0) +#define __be16_to_cpus(x) do {} while (0) + +#include + +#endif /* _LINUX_BYTEORDER_BIG_ENDIAN_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/generic.h b/drivers/net/wireless/rtl8192c/include/byteorder/generic.h new file mode 100755 index 000000000000..246ba892906d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/generic.h @@ -0,0 +1,209 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_GENERIC_H +#define _LINUX_BYTEORDER_GENERIC_H + +/* + * linux/byteorder_generic.h + * Generic Byte-reordering support + * + * Francois-Rene Rideau 19970707 + * gathered all the good ideas from all asm-foo/byteorder.h into one file, + * cleaned them up. + * I hope it is compliant with non-GCC compilers. + * I decided to put __BYTEORDER_HAS_U64__ in byteorder.h, + * because I wasn't sure it would be ok to put it in types.h + * Upgraded it to 2.1.43 + * Francois-Rene Rideau 19971012 + * Upgraded it to 2.1.57 + * to please Linus T., replaced huge #ifdef's between little/big endian + * by nestedly #include'd files. + * Francois-Rene Rideau 19971205 + * Made it to 2.1.71; now a facelift: + * Put files under include/linux/byteorder/ + * Split swab from generic support. + * + * TODO: + * = Regular kernel maintainers could also replace all these manual + * byteswap macros that remain, disseminated among drivers, + * after some grep or the sources... + * = Linus might want to rename all these macros and files to fit his taste, + * to fit his personal naming scheme. + * = it seems that a few drivers would also appreciate + * nybble swapping support... + * = every architecture could add their byteswap macro in asm/byteorder.h + * see how some architectures already do (i386, alpha, ppc, etc) + * = cpu_to_beXX and beXX_to_cpu might some day need to be well + * distinguished throughout the kernel. This is not the case currently, + * since little endian, big endian, and pdp endian machines needn't it. + * But this might be the case for, say, a port of Linux to 20/21 bit + * architectures (and F21 Linux addict around?). + */ + +/* + * The following macros are to be defined by : + * + * Conversion of long and short int between network and host format + * ntohl(__u32 x) + * ntohs(__u16 x) + * htonl(__u32 x) + * htons(__u16 x) + * It seems that some programs (which? where? or perhaps a standard? POSIX?) + * might like the above to be functions, not macros (why?). + * if that's true, then detect them, and take measures. + * Anyway, the measure is: define only ___ntohl as a macro instead, + * and in a separate file, have + * unsigned long inline ntohl(x){return ___ntohl(x);} + * + * The same for constant arguments + * __constant_ntohl(__u32 x) + * __constant_ntohs(__u16 x) + * __constant_htonl(__u32 x) + * __constant_htons(__u16 x) + * + * Conversion of XX-bit integers (16- 32- or 64-) + * between native CPU format and little/big endian format + * 64-bit stuff only defined for proper architectures + * cpu_to_[bl]eXX(__uXX x) + * [bl]eXX_to_cpu(__uXX x) + * + * The same, but takes a pointer to the value to convert + * cpu_to_[bl]eXXp(__uXX x) + * [bl]eXX_to_cpup(__uXX x) + * + * The same, but change in situ + * cpu_to_[bl]eXXs(__uXX x) + * [bl]eXX_to_cpus(__uXX x) + * + * See asm-foo/byteorder.h for examples of how to provide + * architecture-optimized versions + * + */ + + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) +/* + * inside the kernel, we can use nicknames; + * outside of it, we must avoid POSIX namespace pollution... + */ +#define cpu_to_le64 __cpu_to_le64 +#define le64_to_cpu __le64_to_cpu +#define cpu_to_le32 __cpu_to_le32 +#define le32_to_cpu __le32_to_cpu +#define cpu_to_le16 __cpu_to_le16 +#define le16_to_cpu __le16_to_cpu +#define cpu_to_be64 __cpu_to_be64 +#define be64_to_cpu __be64_to_cpu +#define cpu_to_be32 __cpu_to_be32 +#define be32_to_cpu __be32_to_cpu +#define cpu_to_be16 __cpu_to_be16 +#define be16_to_cpu __be16_to_cpu +#define cpu_to_le64p __cpu_to_le64p +#define le64_to_cpup __le64_to_cpup +#define cpu_to_le32p __cpu_to_le32p +#define le32_to_cpup __le32_to_cpup +#define cpu_to_le16p __cpu_to_le16p +#define le16_to_cpup __le16_to_cpup +#define cpu_to_be64p __cpu_to_be64p +#define be64_to_cpup __be64_to_cpup +#define cpu_to_be32p __cpu_to_be32p +#define be32_to_cpup __be32_to_cpup +#define cpu_to_be16p __cpu_to_be16p +#define be16_to_cpup __be16_to_cpup +#define cpu_to_le64s __cpu_to_le64s +#define le64_to_cpus __le64_to_cpus +#define cpu_to_le32s __cpu_to_le32s +#define le32_to_cpus __le32_to_cpus +#define cpu_to_le16s __cpu_to_le16s +#define le16_to_cpus __le16_to_cpus +#define cpu_to_be64s __cpu_to_be64s +#define be64_to_cpus __be64_to_cpus +#define cpu_to_be32s __cpu_to_be32s +#define be32_to_cpus __be32_to_cpus +#define cpu_to_be16s __cpu_to_be16s +#define be16_to_cpus __be16_to_cpus +#endif + + +/* + * Handle ntohl and suches. These have various compatibility + * issues - like we want to give the prototype even though we + * also have a macro for them in case some strange program + * wants to take the address of the thing or something.. + * + * Note that these used to return a "long" in libc5, even though + * long is often 64-bit these days.. Thus the casts. + * + * They have to be macros in order to do the constant folding + * correctly - if the argument passed into a inline function + * it is no longer constant according to gcc.. + */ + +#undef ntohl +#undef ntohs +#undef htonl +#undef htons + +/* + * Do the prototypes. Somebody might want to take the + * address or some such sick thing.. + */ +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) +extern __u32 ntohl(__u32); +extern __u32 htonl(__u32); +#else +extern unsigned long int ntohl(unsigned long int); +extern unsigned long int htonl(unsigned long int); +#endif +extern unsigned short int ntohs(unsigned short int); +extern unsigned short int htons(unsigned short int); + + +#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) || defined(PLATFORM_MPIXEL) + +#define ___htonl(x) __cpu_to_be32(x) +#define ___htons(x) __cpu_to_be16(x) +#define ___ntohl(x) __be32_to_cpu(x) +#define ___ntohs(x) __be16_to_cpu(x) + +#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2) +#define htonl(x) ___htonl(x) +#define ntohl(x) ___ntohl(x) +#else +#define htonl(x) ((unsigned long)___htonl(x)) +#define ntohl(x) ((unsigned long)___ntohl(x)) +#endif +#define htons(x) ___htons(x) +#define ntohs(x) ___ntohs(x) + +#endif /* OPTIMIZE */ + + +#if defined (PLATFORM_WINDOWS) + +#define htonl(x) __cpu_to_be32(x) +#define ntohl(x) __be32_to_cpu(x) +#define htons(x) __cpu_to_be16(x) +#define ntohs(x) __be16_to_cpu(x) + + +#endif + +#endif /* _LINUX_BYTEORDER_GENERIC_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h b/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h new file mode 100755 index 000000000000..433045e46939 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/little_endian.h @@ -0,0 +1,89 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _LINUX_BYTEORDER_LITTLE_ENDIAN_H +#define _LINUX_BYTEORDER_LITTLE_ENDIAN_H + +#ifndef __LITTLE_ENDIAN +#define __LITTLE_ENDIAN 1234 +#endif +#ifndef __LITTLE_ENDIAN_BITFIELD +#define __LITTLE_ENDIAN_BITFIELD +#endif + +#include + +#ifndef __constant_htonl +#define __constant_htonl(x) ___constant_swab32((x)) +#define __constant_ntohl(x) ___constant_swab32((x)) +#define __constant_htons(x) ___constant_swab16((x)) +#define __constant_ntohs(x) ___constant_swab16((x)) +#define __constant_cpu_to_le64(x) ((__u64)(x)) +#define __constant_le64_to_cpu(x) ((__u64)(x)) +#define __constant_cpu_to_le32(x) ((__u32)(x)) +#define __constant_le32_to_cpu(x) ((__u32)(x)) +#define __constant_cpu_to_le16(x) ((__u16)(x)) +#define __constant_le16_to_cpu(x) ((__u16)(x)) +#define __constant_cpu_to_be64(x) ___constant_swab64((x)) +#define __constant_be64_to_cpu(x) ___constant_swab64((x)) +#define __constant_cpu_to_be32(x) ___constant_swab32((x)) +#define __constant_be32_to_cpu(x) ___constant_swab32((x)) +#define __constant_cpu_to_be16(x) ___constant_swab16((x)) +#define __constant_be16_to_cpu(x) ___constant_swab16((x)) +#define __cpu_to_le64(x) ((__u64)(x)) +#define __le64_to_cpu(x) ((__u64)(x)) +#define __cpu_to_le32(x) ((__u32)(x)) +#define __le32_to_cpu(x) ((__u32)(x)) +#define __cpu_to_le16(x) ((__u16)(x)) +#define __le16_to_cpu(x) ((__u16)(x)) +#define __cpu_to_be64(x) __swab64((x)) +#define __be64_to_cpu(x) __swab64((x)) +#define __cpu_to_be32(x) __swab32((x)) +#define __be32_to_cpu(x) __swab32((x)) +#define __cpu_to_be16(x) __swab16((x)) +#define __be16_to_cpu(x) __swab16((x)) +#define __cpu_to_le64p(x) (*(__u64*)(x)) +#define __le64_to_cpup(x) (*(__u64*)(x)) +#define __cpu_to_le32p(x) (*(__u32*)(x)) +#define __le32_to_cpup(x) (*(__u32*)(x)) +#define __cpu_to_le16p(x) (*(__u16*)(x)) +#define __le16_to_cpup(x) (*(__u16*)(x)) +#define __cpu_to_be64p(x) __swab64p((x)) +#define __be64_to_cpup(x) __swab64p((x)) +#define __cpu_to_be32p(x) __swab32p((x)) +#define __be32_to_cpup(x) __swab32p((x)) +#define __cpu_to_be16p(x) __swab16p((x)) +#define __be16_to_cpup(x) __swab16p((x)) +#define __cpu_to_le64s(x) do {} while (0) +#define __le64_to_cpus(x) do {} while (0) +#define __cpu_to_le32s(x) do {} while (0) +#define __le32_to_cpus(x) do {} while (0) +#define __cpu_to_le16s(x) do {} while (0) +#define __le16_to_cpus(x) do {} while (0) +#define __cpu_to_be64s(x) __swab64s((x)) +#define __be64_to_cpus(x) __swab64s((x)) +#define __cpu_to_be32s(x) __swab32s((x)) +#define __be32_to_cpus(x) __swab32s((x)) +#define __cpu_to_be16s(x) __swab16s((x)) +#define __be16_to_cpus(x) __swab16s((x)) +#endif // __constant_htonl + +#include + +#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/swab.h b/drivers/net/wireless/rtl8192c/include/byteorder/swab.h new file mode 100755 index 000000000000..117c84deea5e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/swab.h @@ -0,0 +1,133 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _LINUX_BYTEORDER_SWAB_H +#define _LINUX_BYTEORDER_SWAB_H + +#if !defined(CONFIG_PLATFORM_MSTAR_TITANIA12) +#ifndef __u16 +typedef unsigned short __u16; +#endif + +#ifndef __u32 +typedef unsigned int __u32; +#endif + +#ifndef __u8 +typedef unsigned char __u8; +#endif + +#ifndef __u64 +typedef unsigned long long __u64; +#endif + + +__inline static __u16 ___swab16(__u16 x) +{ + __u16 __x = x; + return + ((__u16)( + (((__u16)(__x) & (__u16)0x00ffU) << 8) | + (((__u16)(__x) & (__u16)0xff00U) >> 8) )); + +} + +__inline static __u32 ___swab32(__u32 x) +{ + __u32 __x = (x); + return ((__u32)( + (((__u32)(__x) & (__u32)0x000000ffUL) << 24) | + (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) | + (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) | + (((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); +} + +__inline static __u64 ___swab64(__u64 x) +{ + __u64 __x = (x); + + return + ((__u64)( \ + (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \ + (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \ + (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \ + (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \ + (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \ + (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \ + (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \ + (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \ +} +#endif // CONFIG_PLATFORM_MSTAR_TITANIA12 + +#ifndef __arch__swab16 +__inline static __u16 __arch__swab16(__u16 x) +{ + return ___swab16(x); +} + +#endif + +#ifndef __arch__swab32 +__inline static __u32 __arch__swab32(__u32 x) +{ + __u32 __tmp = (x) ; + return ___swab32(__tmp); +} +#endif + +#ifndef __arch__swab64 + +__inline static __u64 __arch__swab64(__u64 x) +{ + __u64 __tmp = (x) ; + return ___swab64(__tmp); +} + + +#endif + +#ifndef __swab16 +#define __swab16(x) __fswab16(x) +#define __swab32(x) __fswab32(x) +#define __swab64(x) __fswab64(x) +#endif // __swab16 + +__inline static const __u16 __fswab16(__u16 x) +{ + return __arch__swab16(x); +} +__inline static const __u32 __fswab32(__u32 x) +{ + return __arch__swab32(x); +} + +#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) +#define swab16 __swab16 +#define swab32 __swab32 +#define swab64 __swab64 +#define swab16p __swab16p +#define swab32p __swab32p +#define swab64p __swab64p +#define swab16s __swab16s +#define swab32s __swab32s +#define swab64s __swab64s +#endif + +#endif /* _LINUX_BYTEORDER_SWAB_H */ diff --git a/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h b/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h new file mode 100755 index 000000000000..1735349f82ca --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/byteorder/swabb.h @@ -0,0 +1,157 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _LINUX_BYTEORDER_SWABB_H +#define _LINUX_BYTEORDER_SWABB_H + +/* + * linux/byteorder/swabb.h + * SWAp Bytes Bizarrely + * swaHHXX[ps]?(foo) + * + * Support for obNUXIous pdp-endian and other bizarre architectures. + * Will Linux ever run on such ancient beasts? if not, this file + * will be but a programming pearl. Still, it's a reminder that we + * shouldn't be making too many assumptions when trying to be portable. + * + */ + +/* + * Meaning of the names I chose (vaxlinux people feel free to correct them): + * swahw32 swap 16-bit half-words in a 32-bit word + * swahb32 swap 8-bit halves of each 16-bit half-word in a 32-bit word + * + * No 64-bit support yet. I don't know NUXI conventions for long longs. + * I guarantee it will be a mess when it's there, though :-> + * It will be even worse if there are conflicting 64-bit conventions. + * Hopefully, no one ever used 64-bit objects on NUXI machines. + * + */ + +#define ___swahw32(x) \ +({ \ + __u32 __x = (x); \ + ((__u32)( \ + (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \ + (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \ +}) +#define ___swahb32(x) \ +({ \ + __u32 __x = (x); \ + ((__u32)( \ + (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \ + (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \ +}) + +#define ___constant_swahw32(x) \ + ((__u32)( \ + (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ + (((__u32)(x) & (__u32)0xffff0000UL) >> 16) )) +#define ___constant_swahb32(x) \ + ((__u32)( \ + (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ + (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) )) + +/* + * provide defaults when no architecture-specific optimization is detected + */ +#ifndef __arch__swahw32 +# define __arch__swahw32(x) ___swahw32(x) +#endif +#ifndef __arch__swahb32 +# define __arch__swahb32(x) ___swahb32(x) +#endif + +#ifndef __arch__swahw32p +# define __arch__swahw32p(x) __swahw32(*(x)) +#endif +#ifndef __arch__swahb32p +# define __arch__swahb32p(x) __swahb32(*(x)) +#endif + +#ifndef __arch__swahw32s +# define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0) +#endif +#ifndef __arch__swahb32s +# define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0) +#endif + + +/* + * Allow constant folding + */ +#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) +# define __swahw32(x) \ +(__builtin_constant_p((__u32)(x)) ? \ + ___swahw32((x)) : \ + __fswahw32((x))) +# define __swahb32(x) \ +(__builtin_constant_p((__u32)(x)) ? \ + ___swahb32((x)) : \ + __fswahb32((x))) +#else +# define __swahw32(x) __fswahw32(x) +# define __swahb32(x) __fswahb32(x) +#endif /* OPTIMIZE */ + + +__inline static__ __const__ __u32 __fswahw32(__u32 x) +{ + return __arch__swahw32(x); +} +__inline static__ __u32 __swahw32p(__u32 *x) +{ + return __arch__swahw32p(x); +} +__inline static__ void __swahw32s(__u32 *addr) +{ + __arch__swahw32s(addr); +} + + +__inline static__ __const__ __u32 __fswahb32(__u32 x) +{ + return __arch__swahb32(x); +} +__inline static__ __u32 __swahb32p(__u32 *x) +{ + return __arch__swahb32p(x); +} +__inline static__ void __swahb32s(__u32 *addr) +{ + __arch__swahb32s(addr); +} + +#ifdef __BYTEORDER_HAS_U64__ +/* + * Not supported yet + */ +#endif /* __BYTEORDER_HAS_U64__ */ + +#if defined(PLATFORM_LINUX) +#define swahw32 __swahw32 +#define swahb32 __swahb32 +#define swahw32p __swahw32p +#define swahb32p __swahb32p +#define swahw32s __swahw32s +#define swahb32s __swahb32s +#endif + +#endif /* _LINUX_BYTEORDER_SWABB_H */ diff --git a/drivers/net/wireless/rtl8192c/include/circ_buf.h b/drivers/net/wireless/rtl8192c/include/circ_buf.h new file mode 100755 index 000000000000..1bd4704a7c33 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/circ_buf.h @@ -0,0 +1,27 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __CIRC_BUF_H_ +#define __CIRC_BUF_H_ 1 + +#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1)) + +#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size)) + +#endif //_CIRC_BUF_H_ diff --git a/drivers/net/wireless/rtl8192c/include/cmd_osdep.h b/drivers/net/wireless/rtl8192c/include/cmd_osdep.h new file mode 100755 index 000000000000..077efa731f9a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/cmd_osdep.h @@ -0,0 +1,36 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __CMD_OSDEP_H_ +#define __CMD_OSDEP_H_ + + +#include +#include +#include + +extern sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); +extern sint _rtw_init_evt_priv(struct evt_priv *pevtpriv); +extern void _rtw_free_evt_priv (struct evt_priv *pevtpriv); +extern void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv); +extern sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj); +extern struct cmd_obj *_rtw_dequeue_cmd(_queue *queue); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/drv_conf.h b/drivers/net/wireless/rtl8192c/include/drv_conf.h new file mode 100755 index 000000000000..191364c8433e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_conf.h @@ -0,0 +1,69 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_CONF_H__ +#define __DRV_CONF_H__ +#include "autoconf.h" + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +//Older Android kernel doesn't has CONFIG_ANDROID defined, +//add this to force CONFIG_ANDROID defined +#ifdef CONFIG_PLATFORM_ANDROID +#ifndef CONFIG_ANDROID +#define CONFIG_ANDROID +#endif +#endif + +#if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE) + #warning "You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically" + #undef CONFIG_RESUME_IN_WORKQUEUE +#endif + +#if defined(CONFIG_ANDROID_POWER) && defined (CONFIG_RESUME_IN_WORKQUEUE) + #warning "You have CONFIG_ANDROID_POWER enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically" + #undef CONFIG_RESUME_IN_WORKQUEUE +#endif + +#ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this... + #if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER) + #error "enable CONFIG_RESUME_IN_WORKQUEUE without CONFIG_WAKELOCK or CONFIG_ANDROID_POWER will suffer from the danger of wifi's unfunctionality..." + #error "If you still want to enable CONFIG_RESUME_IN_WORKQUEUE in this case, mask this preprossor checking and GOOD LUCK..." + #endif +#endif + +//About USB VENDOR REQ +#if defined(CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC) && !defined(CONFIG_USB_VENDOR_REQ_MUTEX) + #warning "define CONFIG_USB_VENDOR_REQ_MUTEX for CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC automatically" + #define CONFIG_USB_VENDOR_REQ_MUTEX +#endif +#if defined(CONFIG_VENDOR_REQ_RETRY) && !defined(CONFIG_USB_VENDOR_REQ_MUTEX) + #warning "define CONFIG_USB_VENDOR_REQ_MUTEX for CONFIG_VENDOR_REQ_RETRY automatically" + #define CONFIG_USB_VENDOR_REQ_MUTEX +#endif + + +//#include + +#endif // __DRV_CONF_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/drv_types.h b/drivers/net/wireless/rtl8192c/include/drv_types.h new file mode 100755 index 000000000000..d32bfb8a96b4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types.h @@ -0,0 +1,456 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*------------------------------------------------------------------------------- + + For type defines and data structure defines + +--------------------------------------------------------------------------------*/ + + +#ifndef __DRV_TYPES_H__ +#define __DRV_TYPES_H__ + +#include +#include +#include + + +#ifdef PLATFORM_OS_XP +#include +#endif + +#ifdef PLATFORM_OS_CE +#include +#endif + +#ifdef PLATFORM_LINUX +#include +#endif + +enum _NIC_VERSION { + + RTL8711_NIC, + RTL8712_NIC, + RTL8713_NIC, + RTL8716_NIC + +}; + +enum{ + UP_LINK, + DOWN_LINK, +}; +typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER; + +#ifdef CONFIG_80211N_HT +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_DRVEXT_MODULE +#include +#endif + +#ifdef CONFIG_MP_INCLUDED +#include +#endif + +#define SPEC_DEV_ID_NONE BIT(0) +#define SPEC_DEV_ID_DISABLE_HT BIT(1) +#define SPEC_DEV_ID_ENABLE_PS BIT(2) +#define SPEC_DEV_ID_RF_CONFIG_1T1R BIT(3) +#define SPEC_DEV_ID_RF_CONFIG_2T2R BIT(4) +#define SPEC_DEV_ID_ASSIGN_IFNAME BIT(5) + +struct specific_device_id{ + + u32 flags; + + u16 idVendor; + u16 idProduct; + +}; + +struct registry_priv +{ + u8 chip_version; + u8 rfintfs; + u8 lbkmode; + u8 hci; + NDIS_802_11_SSID ssid; + u8 network_mode; //infra, ad-hoc, auto + u8 channel;//ad-hoc support requirement + u8 wireless_mode;//A, B, G, auto + u8 scan_mode;//active, passive + u8 radio_enable; + u8 preamble;//long, short, auto + u8 vrtl_carrier_sense;//Enable, Disable, Auto + u8 vcs_type;//RTS/CTS, CTS-to-self + u16 rts_thresh; + u16 frag_thresh; + u8 adhoc_tx_pwr; + u8 soft_ap; + u8 power_mgnt; + u8 ips_mode; + u8 smart_ps; + u8 long_retry_lmt; + u8 short_retry_lmt; + u16 busy_thresh; + u8 ack_policy; + u8 mp_mode; + u8 software_encrypt; + u8 software_decrypt; + + //UAPSD + u8 wmm_enable; + u8 uapsd_enable; + u8 uapsd_max_sp; + u8 uapsd_acbk_en; + u8 uapsd_acbe_en; + u8 uapsd_acvi_en; + u8 uapsd_acvo_en; + + WLAN_BSSID_EX dev_network; + +#ifdef CONFIG_80211N_HT + u8 ht_enable; + u8 cbw40_enable; + u8 ampdu_enable;//for tx + u8 rx_stbc; + u8 ampdu_amsdu;//A-MPDU Supports A-MSDU is permitted +#endif + u8 lowrate_two_xmit; + + u8 rf_config ; + u8 low_power ; + + u8 wifi_spec;// !turbo_mode + + u8 channel_plan; +#ifdef CONFIG_BT_COEXIST + u8 bt_iso; + u8 bt_sco; + u8 bt_ampdu; +#endif + BOOLEAN bAcceptAddbaReq; + + u8 antdiv_cfg; + + u8 usbss_enable;//0:disable,1:enable + u8 hwpdn_mode;//0:disable,1:enable,2:deside by EFUSE config + u8 hwpwrp_detect;//0:disable,1:enable + + u8 hw_wps_pbc;//0:disable,1:enable + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + char adaptor_info_caching_file_path[PATH_LENGTH_MAX]; +#endif + +#ifdef CONFIG_LAYER2_ROAMING + u8 max_roaming_times; // the max number driver will try to roaming +#endif +}; + + +//For registry parameters +#define RGTRY_OFT(field) ((ULONG)FIELD_OFFSET(struct registry_priv,field)) +#define RGTRY_SZ(field) sizeof(((struct registry_priv*) 0)->field) +#define BSSID_OFT(field) ((ULONG)FIELD_OFFSET(WLAN_BSSID_EX,field)) +#define BSSID_SZ(field) sizeof(((PWLAN_BSSID_EX) 0)->field) + +#define MAX_CONTINUAL_URB_ERR 4 + +struct dvobj_priv { + + _adapter * padapter; + + //For 92D, DMDP have 2 interface. + u8 InterfaceNumber; + u8 NumInterfaces; + +/*-------- below is for SDIO INTERFACE --------*/ + +#ifdef CONFIG_SDIO_HCI + +#ifdef PLATFORM_OS_XP + PDEVICE_OBJECT pphysdevobj;//pPhysDevObj; + PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj; + PDEVICE_OBJECT pnextdevobj;//pNextDevObj; + SDBUS_INTERFACE_STANDARD sdbusinft;//SdBusInterface; + u8 nextdevstacksz;//unsigned char NextDeviceStackSize; +#endif//PLATFORM_OS_XP + +#ifdef PLATFORM_OS_CE + SD_DEVICE_HANDLE hDevice; + SD_CARD_RCA sd_rca; + SD_CARD_INTERFACE card_intf; + BOOLEAN enableIsarWithStatus; + WCHAR active_path[MAX_ACTIVE_REG_PATH]; + SD_HOST_BLOCK_CAPABILITY sd_host_blk_cap; +#endif//PLATFORM_OS_CE + +#ifdef PLATFORM_LINUX + struct sdio_func *func; +#endif//PLATFORM_LINUX + + u8 func_number;//unsigned char FunctionNumber; + u32 block_transfer_len;//unsigned long BLOCK_TRANSFER_LEN; + u32 blk_shiftbits; + u16 driver_version; + u16 rxblknum; + u16 rxblknum_rd; + u16 c2hblknum; + u8 tx_block_mode; + u8 rx_block_mode; + u8 cmdfifo_cnt; + u8 rxfifo_cnt; + u16 sdio_hisr; + u16 sdio_himr; +#endif// CONFIG_SDIO_HCI + +/*-------- below is for USB INTERFACE --------*/ + +#ifdef CONFIG_USB_HCI + + u8 nr_endpoint; + u8 ishighspeed; + u8 RtNumInPipes; + u8 RtNumOutPipes; + int ep_num[5]; //endpoint number + + int RegUsbSS; + + _sema usb_suspend_sema; + +#ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _mutex usb_vendor_req_mutex; +#endif + +#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + u8 * usb_alloc_vendor_req_buf; + u8 * usb_vendor_req_buf; +#endif + +#ifdef PLATFORM_WINDOWS + //related device objects + PDEVICE_OBJECT pphysdevobj;//pPhysDevObj; + PDEVICE_OBJECT pfuncdevobj;//pFuncDevObj; + PDEVICE_OBJECT pnextdevobj;//pNextDevObj; + + u8 nextdevstacksz;//unsigned char NextDeviceStackSize; //= (CHAR)CEdevice->pUsbDevObj->StackSize + 1; + + //urb for control diescriptor request + +#ifdef PLATFORM_OS_XP + struct _URB_CONTROL_DESCRIPTOR_REQUEST descriptor_urb; + PUSB_CONFIGURATION_DESCRIPTOR pconfig_descriptor;//UsbConfigurationDescriptor; +#endif + +#ifdef PLATFORM_OS_CE + WCHAR active_path[MAX_ACTIVE_REG_PATH]; // adapter regpath + USB_EXTENSION usb_extension; + + _nic_hdl pipehdls_r8192c[0x10]; +#endif + + u32 config_descriptor_len;//ULONG UsbConfigurationDescriptorLength; +#endif//PLATFORM_WINDOWS + +#ifdef PLATFORM_LINUX + struct usb_interface *pusbintf; + struct usb_device *pusbdev; +#endif//PLATFORM_LINUX + + ATOMIC_T continual_urb_error; +#endif//CONFIG_USB_HCI + +/*-------- below is for PCIE INTERFACE --------*/ + +#ifdef CONFIG_PCI_HCI + +#ifdef PLATFORM_LINUX + struct pci_dev *ppcidev; + + //PCI MEM map + unsigned long pci_mem_end; /* shared mem end */ + unsigned long pci_mem_start; /* shared mem start */ + + //PCI IO map + unsigned long pci_base_addr; /* device I/O address */ + + //PciBridge + struct pci_priv pcipriv; + + u16 irqline; + u8 irq_enabled; + u8 irq_alloc; + RT_ISR_CONTENT isr_content; + _lock irq_th_lock; + + //ASPM + u8 const_pci_aspm; + u8 const_amdpci_aspm; + u8 const_hwsw_rfoff_d3; + u8 const_support_pciaspm; + // pci-e bridge */ + u8 const_hostpci_aspm_setting; + // pci-e device */ + u8 const_devicepci_aspm_setting; + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. + u8 b_support_backdoor; +#endif//PLATFORM_LINUX + +#endif//CONFIG_PCI_HCI +}; + +typedef enum _DRIVER_STATE{ + DRIVER_NORMAL = 0, + DRIVER_DISAPPEAR = 1, + DRIVER_REPLACE_DONGLE = 2, +}DRIVER_STATE; + +struct _ADAPTER{ + int DriverState;// for disable driver using module, use dongle to replace module. + int pid[3];//process id from UI, 0:wpa_supplicant, 1:hostapd, 2:dhcpcd + int bDongle;//build-in module or external dongle + u16 chip_type; + u16 HardwareType; + u16 interface_type;//USB,SDIO,PCI + + struct dvobj_priv dvobjpriv; + struct mlme_priv mlmepriv; + struct mlme_ext_priv mlmeextpriv; + struct cmd_priv cmdpriv; + struct evt_priv evtpriv; + //struct io_queue *pio_queue; + struct io_priv iopriv; + struct xmit_priv xmitpriv; + struct recv_priv recvpriv; + struct sta_priv stapriv; + struct security_priv securitypriv; + struct registry_priv registrypriv; + struct wlan_acl_pool acl_list; + struct pwrctrl_priv pwrctrlpriv; + struct eeprom_priv eeprompriv; + struct led_priv ledpriv; + +#ifdef CONFIG_MP_INCLUDED + struct mp_priv mppriv; +#endif + +#ifdef CONFIG_DRVEXT_MODULE + struct drvext_priv drvextpriv; +#endif + +#ifdef CONFIG_AP_MODE + struct hostapd_priv *phostapdpriv; +#endif + +#ifdef CONFIG_P2P + struct wifidirect_info wdinfo; +#endif //CONFIG_P2P + + PVOID HalData; + struct hal_ops HalFunc; + +#ifdef CONFIG_BT_COEXIST + //struct btcoexist_priv bt_coexist; +#endif + s32 bDriverStopped; + s32 bSurpriseRemoved; + s32 bCardDisableWOHSM; + + u32 IsrContent; + u32 ImrContent; + + u8 EepromAddressSize; + u8 hw_init_completed; + u8 init_adpt_in_progress; + u8 bfirst_init; + + _thread_hdl_ cmdThread; + _thread_hdl_ evtThread; + _thread_hdl_ xmitThread; + _thread_hdl_ recvThread; + + + NDIS_STATUS (*dvobj_init)(_adapter * adapter); + void (*dvobj_deinit)(_adapter * adapter); + + void (*intf_start)(_adapter * adapter); + void (*intf_stop)(_adapter * adapter); + +#ifdef PLATFORM_WINDOWS + _nic_hdl hndis_adapter;//hNdisAdapter(NDISMiniportAdapterHandle); + _nic_hdl hndis_config;//hNdisConfiguration; + NDIS_STRING fw_img; + + u32 NdisPacketFilter; + u8 MCList[MAX_MCAST_LIST_NUM][6]; + u32 MCAddrCount; +#endif //end of PLATFORM_WINDOWS + + +#ifdef PLATFORM_LINUX + _nic_hdl pnetdev; + _nic_hdl old_pnetdev; // used for rtw_change_ifname + int bup; + struct net_device_stats stats; + struct iw_statistics iwstats; + struct proc_dir_entry *dir_dev;// for proc directory +#endif //end of PLATFORM_LINUX + + int net_closed; + + u8 bFWReady; + u8 bReadPortCancel; + u8 bWritePortCancel; + u8 bRxRSSIDisplay; +#ifdef CONFIG_AUTOSUSPEND + u8 bDisableAutosuspend; +#endif +}; + +__inline static u8 *myid(struct eeprom_priv *peepriv) +{ + return (peepriv->mac_addr); +} + + +#endif //__DRV_TYPES_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_ce.h b/drivers/net/wireless/rtl8192c/include/drv_types_ce.h new file mode 100755 index 000000000000..be0459dcb219 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types_ce.h @@ -0,0 +1,92 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_CE_H__ +#define __DRV_TYPES_CE_H__ + +#include +#include + +#include + +#define MAX_ACTIVE_REG_PATH 256 + +#define MAX_MCAST_LIST_NUM 32 + + + +//for ioctl +#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer) + +#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h +#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h +#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h + +typedef struct _MP_REG_ENTRY +{ + + NDIS_STRING RegName; // variable name text + BOOLEAN bRequired; // 1 -> required, 0 -> optional + + u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString + uint FieldOffset; // offset to MP_ADAPTER field + uint FieldSize; // size (in bytes) of the field + +#ifdef UNDER_AMD64 + u64 Default; +#else + u32 Default; // default value to use +#endif + + u32 Min; // minimum value allowed + u32 Max; // maximum value allowed +} MP_REG_ENTRY, *PMP_REG_ENTRY; + +#ifdef CONFIG_USB_HCI +typedef struct _USB_EXTENSION { + LPCUSB_FUNCS _lpUsbFuncs; + USB_HANDLE _hDevice; + PVOID pAdapter; + +#if 0 + USB_ENDPOINT_DESCRIPTOR _endpACLIn; + USB_ENDPOINT_DESCRIPTOR _endpACLOutHigh; + USB_ENDPOINT_DESCRIPTOR _endpACLOutNormal; + + USB_PIPE pPipeIn; + USB_PIPE pPipeOutNormal; + USB_PIPE pPipeOutHigh; +#endif + +} USB_EXTENSION, *PUSB_EXTENSION; +#endif + + +typedef struct _OCTET_STRING{ + u8 *Octet; + u16 Length; +} OCTET_STRING, *POCTET_STRING; + + + + + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_linux.h b/drivers/net/wireless/rtl8192c/include/drv_types_linux.h new file mode 100755 index 000000000000..db1c585690ff --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types_linux.h @@ -0,0 +1,25 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_LINUX_H__ +#define __DRV_TYPES_LINUX_H__ + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/drv_types_xp.h b/drivers/net/wireless/rtl8192c/include/drv_types_xp.h new file mode 100755 index 000000000000..2d51b1db13b0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/drv_types_xp.h @@ -0,0 +1,95 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __DRV_TYPES_XP_H__ +#define __DRV_TYPES_XP_H__ + +#include +#include + + + +#define MAX_MCAST_LIST_NUM 32 + + + +//for ioctl +#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer) ((((u32)(_MainVer))<<16)+_MinorVer) + +#define NIC_HEADER_SIZE 14 //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h +#define NIC_MAX_SEND_PACKETS 10 // max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h +#define NIC_VENDOR_DRIVER_VERSION MAKE_DRIVER_VERSION(0,001) //!< can be moved to typedef.h +#define NIC_MAX_PACKET_SIZE 1514 //!< can be moved to typedef.h + + +#undef ON_VISTA +//added by Jackson +#ifndef ON_VISTA +// +// Bus driver versions +// + +#define SDBUS_DRIVER_VERSION_1 0x100 +#define SDBUS_DRIVER_VERSION_2 0x200 + +#define SDP_FUNCTION_TYPE 4 +#define SDP_BUS_DRIVER_VERSION 5 +#define SDP_BUS_WIDTH 6 +#define SDP_BUS_CLOCK 7 +#define SDP_BUS_INTERFACE_CONTROL 8 +#define SDP_HOST_BLOCK_LENGTH 9 +#define SDP_FUNCTION_BLOCK_LENGTH 10 +#define SDP_FN0_BLOCK_LENGTH 11 +#define SDP_FUNCTION_INT_ENABLE 12 +#endif + + +typedef struct _MP_REG_ENTRY +{ + + NDIS_STRING RegName; // variable name text + BOOLEAN bRequired; // 1 -> required, 0 -> optional + + u8 Type; // NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString + uint FieldOffset; // offset to MP_ADAPTER field + uint FieldSize; // size (in bytes) of the field + +#ifdef UNDER_AMD64 + u64 Default; +#else + u32 Default; // default value to use +#endif + + u32 Min; // minimum value allowed + u32 Max; // maximum value allowed +} MP_REG_ENTRY, *PMP_REG_ENTRY; + + +typedef struct _OCTET_STRING{ + u8 *Octet; + u16 Length; +} OCTET_STRING, *POCTET_STRING; + + + + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/ethernet.h b/drivers/net/wireless/rtl8192c/include/ethernet.h new file mode 100755 index 000000000000..36e29c060d3f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ethernet.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +/*! \file */ +#ifndef __INC_ETHERNET_H +#define __INC_ETHERNET_H + +#define ETHERNET_ADDRESS_LENGTH 6 //!< Ethernet Address Length +#define ETHERNET_HEADER_SIZE 14 //!< Ethernet Header Length +#define LLC_HEADER_SIZE 6 //!< LLC Header Length +#define TYPE_LENGTH_FIELD_SIZE 2 //!< Type/Length Size +#define MINIMUM_ETHERNET_PACKET_SIZE 60 //!< Minimum Ethernet Packet Size +#define MAXIMUM_ETHERNET_PACKET_SIZE 1514 //!< Maximum Ethernet Packet Size + +#define RT_ETH_IS_MULTICAST(_pAddr) ((((UCHAR *)(_pAddr))[0]&0x01)!=0) //!< Is Multicast Address? +#define RT_ETH_IS_BROADCAST(_pAddr) ( \ + ((UCHAR *)(_pAddr))[0]==0xff && \ + ((UCHAR *)(_pAddr))[1]==0xff && \ + ((UCHAR *)(_pAddr))[2]==0xff && \ + ((UCHAR *)(_pAddr))[3]==0xff && \ + ((UCHAR *)(_pAddr))[4]==0xff && \ + ((UCHAR *)(_pAddr))[5]==0xff ) //!< Is Broadcast Address? + + +#endif // #ifndef __INC_ETHERNET_H diff --git a/drivers/net/wireless/rtl8192c/include/farray.h b/drivers/net/wireless/rtl8192c/include/farray.h new file mode 100755 index 000000000000..79d2a4284598 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/farray.h @@ -0,0 +1,31480 @@ +unsigned char f_array[125912] = { +0x12,0x87,0x09,0x10, +0x30,0x00,0x00,0x00, +0x08,0xF8,0x00,0x00, +0x50,0xF3,0x00,0x00, +0x30,0x00,0x00,0x00, +0xB8,0xF1,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x27,0x17,0x41, +0x87,0x12,0x12,0x01, +0x00,0x00,0x12,0x06, +0x00,0x00,0x00,0x00, +0x00,0x07,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x01,0x01,0x00,0x01, +0x01,0x01,0x00,0x00, +0x01,0x00,0x01,0x00, +0x00,0x00,0x01,0x01, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x7F,0x00,0x00,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x00,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x1A,0x3C, +0x80,0x03,0x5A,0x37, +0x00,0x80,0x1B,0x3C, +0x80,0x00,0x7B,0x37, +0x00,0x00,0x5B,0xAF, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x37, +0x00,0x80,0x1B,0x3C, +0x80,0x00,0x7B,0x37, +0x00,0x00,0x5B,0xAF, +0x01,0x80,0x1A,0x3C, +0x90,0xEE,0x5A,0x27, +0x08,0x00,0x40,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x04,0x00,0xA1,0xAF, +0x08,0x00,0xA2,0xAF, +0x0C,0x00,0xA3,0xAF, +0x10,0x00,0xA4,0xAF, +0x14,0x00,0xA5,0xAF, +0x18,0x00,0xA6,0xAF, +0x1C,0x00,0xA7,0xAF, +0x20,0x00,0xA8,0xAF, +0x24,0x00,0xA9,0xAF, +0x28,0x00,0xAA,0xAF, +0x2C,0x00,0xAB,0xAF, +0x30,0x00,0xAC,0xAF, +0x34,0x00,0xAD,0xAF, +0x38,0x00,0xAE,0xAF, +0x3C,0x00,0xAF,0xAF, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x70,0x0A,0x40, +0x40,0x00,0xB0,0xAF, +0x44,0x00,0xB1,0xAF, +0x48,0x00,0xB2,0xAF, +0x4C,0x00,0xB3,0xAF, +0x50,0x00,0xB4,0xAF, +0x54,0x00,0xB5,0xAF, +0x58,0x00,0xB6,0xAF, +0x5C,0x00,0xB7,0xAF, +0x60,0x00,0xB8,0xAF, +0x64,0x00,0xB9,0xAF, +0x68,0x00,0xBC,0xAF, +0x6C,0x00,0xBD,0xAF, +0x70,0x00,0xBE,0xAF, +0x74,0x00,0xBF,0xAF, +0x78,0x00,0xA8,0xAF, +0x7C,0x00,0xA9,0xAF, +0x80,0x00,0xAA,0xAF, +0x32,0x3B,0x00,0x08, +0x21,0x20,0xA0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0x00,0x80,0x02,0x3C, +0xE0,0xFF,0xBD,0x27, +0x18,0x03,0xA3,0x34, +0x00,0x03,0x42,0x24, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x42,0xB0,0x02,0x3C, +0x03,0x00,0x46,0x34, +0x00,0x00,0xC3,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x70,0x30, +0x10,0x00,0x02,0x32, +0x18,0x00,0x40,0x10, +0x02,0x80,0x11,0x3C, +0x30,0x1F,0x27,0x26, +0x78,0x36,0xE4,0x94, +0x10,0x00,0x02,0x24, +0x00,0x00,0xC2,0xA0, +0x08,0x00,0x80,0x10, +0x1C,0x03,0xA3,0x34, +0x7C,0x36,0xE2,0x94, +0xB0,0x03,0xA4,0x34, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x80,0xAC, +0x78,0x36,0xE0,0xA4, +0x7C,0x36,0xE0,0xA4, +0x00,0x00,0x04,0x24, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x06,0x3C, +0x14,0x5E,0xA2,0x8C, +0x18,0x5F,0xC3,0x8C, +0x01,0x00,0x84,0x24, +0x01,0x00,0x42,0x24, +0x01,0x00,0x63,0x24, +0x78,0x36,0xE4,0xA4, +0x14,0x5E,0xA2,0xAC, +0x18,0x5F,0xC3,0xAC, +0x00,0x16,0x10,0x00, +0x03,0x16,0x02,0x00, +0x7B,0x00,0x40,0x04, +0x42,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x40,0x00,0x02,0x32, +0x16,0x00,0x40,0x10, +0x30,0x1F,0x24,0x26, +0x42,0xB0,0x0B,0x3C, +0x03,0x00,0x62,0x35, +0x40,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x02,0x80,0x03,0x3C, +0x12,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x1A,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x12,0x5F,0x60,0xA0, +0x02,0x80,0x04,0x3C, +0x0E,0x5F,0x83,0x90, +0xFD,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0x0E,0x5F,0x83,0xA0, +0x0E,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0x5D,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x24,0x26, +0xE0,0x1B,0x83,0x94, +0xDC,0x1B,0x85,0x94, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x80,0x00,0x63,0x30, +0x41,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0x08,0x00,0x42,0x34, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA4, +0x08,0x00,0xE0,0x03, +0xDC,0x1B,0x83,0xA4, +0xFA,0x5E,0x82,0x90, +0x02,0x80,0x05,0x3C, +0x01,0x00,0x42,0x24, +0xFA,0x5E,0x82,0xA0, +0x0E,0x5F,0xA3,0x90, +0xEF,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0x0E,0x5F,0xA3,0xA0, +0xFA,0x5E,0x82,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x2C, +0x32,0x00,0x40,0x10, +0x30,0x1F,0x23,0x26, +0x25,0xB0,0x06,0x3C, +0x84,0x00,0xC4,0x34, +0x80,0x00,0xC6,0x34, +0x00,0x00,0x82,0x8C, +0x00,0x00,0xC4,0x8C, +0x02,0x80,0x08,0x3C, +0x21,0x10,0x00,0x00, +0x1C,0x5F,0x06,0x8D, +0x25,0x10,0x44,0x00, +0x02,0x80,0x04,0x3C, +0x20,0x5F,0x88,0x8C, +0x24,0x5F,0x89,0x8C, +0x00,0x00,0x65,0x91, +0x21,0x10,0x46,0x00, +0xFB,0xFF,0x04,0x24, +0x24,0x28,0xA4,0x00, +0x23,0x40,0x02,0x01, +0x00,0x00,0x65,0xA1, +0x04,0x00,0x00,0x11, +0x01,0x00,0x06,0x24, +0x80,0x10,0x08,0x00, +0x21,0x10,0x48,0x00, +0x80,0x30,0x02,0x00, +0x01,0x00,0x04,0x24, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x04,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x30,0x1F,0x24,0x26, +0xE0,0x1B,0x83,0x94, +0xDC,0x1B,0x85,0x94, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x80,0x00,0x63,0x30, +0x41,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0x08,0x00,0x42,0x34, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA4, +0x08,0x00,0xE0,0x03, +0xDC,0x1B,0x83,0xA4, +0xB0,0x1B,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x16,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0xAB,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA0, +0x0B,0x01,0x00,0x08, +0x30,0x1F,0x24,0x26, +0x0C,0x5F,0x40,0xA0, +0x44,0x01,0x00,0x08, +0x02,0x80,0x03,0x3C, +0x80,0xFF,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x9E,0x25,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0x00,0x00,0x08, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x40,0xA0, +0x0B,0x01,0x00,0x08, +0x30,0x1F,0x24,0x26, +0xFF,0x00,0x84,0x30, +0x0B,0x00,0x82,0x2C, +0xFF,0xFF,0xE7,0x30, +0x10,0x00,0xA8,0x93, +0x19,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0xD8,0xE9,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x43,0xB0,0x02,0x3C, +0x78,0x00,0x44,0x34, +0x07,0x00,0xE2,0x30, +0x00,0x00,0x85,0xAC, +0x04,0x00,0x86,0xAC, +0x04,0x00,0x40,0x18, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0xE2,0x30, +0x08,0x00,0x42,0x24, +0xFF,0xFF,0x47,0x30, +0x21,0x10,0xE8,0x00, +0x00,0x80,0x03,0x3C, +0x08,0x00,0x82,0xAC, +0x25,0x10,0x43,0x00, +0x08,0x00,0x82,0xAC, +0x01,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x6C,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x60,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x54,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x48,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x3C,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x30,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x24,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x18,0x00,0x44,0x34, +0x43,0xB0,0x02,0x3C, +0x83,0x01,0x00,0x08, +0x0C,0x00,0x44,0x34, +0x83,0x01,0x00,0x08, +0x43,0xB0,0x04,0x3C, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0xC0,0x06,0x63,0x24, +0x00,0x00,0x43,0xAC, +0x01,0x00,0x05,0x24, +0x43,0xB0,0x02,0x3C, +0x04,0x28,0x85,0x00, +0x88,0x00,0x44,0x34, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0x05,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x00,0x00,0x82,0x94, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x30, +0x24,0x10,0x45,0x00, +0xF5,0xFF,0x40,0x1C, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x00,0x80,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0x18,0x03,0x03,0x35, +0x1C,0x07,0x42,0x24, +0x00,0x00,0x62,0xAC, +0x30,0x00,0xB6,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x0C,0x00,0xF2,0x84, +0x08,0x00,0xF5,0x8C, +0xFF,0x00,0xC6,0x30, +0x00,0x01,0x02,0x24, +0x23,0x10,0x46,0x00, +0xFF,0xFF,0x51,0x30, +0xD0,0x03,0x08,0x35, +0xFF,0x00,0x96,0x30, +0x00,0x00,0x12,0xAD, +0x21,0xA0,0xA0,0x00, +0x21,0x30,0xC5,0x00, +0x00,0x00,0x15,0xAD, +0x21,0x20,0xC0,0x02, +0x21,0x28,0xA0,0x02, +0x21,0x38,0x20,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x23,0x18,0x51,0x02, +0xFF,0xFF,0x82,0x32, +0x00,0x94,0x03,0x00, +0x03,0x94,0x12,0x00, +0x09,0x02,0x00,0x08, +0x02,0x9A,0x02,0x00, +0x28,0xB0,0x03,0x3C, +0xC0,0x10,0x13,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x25,0xB0,0x10,0x3C, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x93,0x30, +0x00,0x22,0x13,0x00, +0xFF,0xFF,0x43,0x32, +0x01,0x01,0x45,0x2A, +0x21,0xA0,0x82,0x00, +0x21,0xA8,0xB1,0x02, +0xD0,0x03,0x02,0x36, +0x00,0x01,0x11,0x24, +0x0B,0x88,0x65,0x00, +0x21,0x20,0xC0,0x02, +0x00,0x00,0x53,0xAC, +0xB0,0x01,0x00,0x0C, +0xB0,0x03,0x10,0x36, +0x21,0x30,0x80,0x02, +0x21,0x20,0xC0,0x02, +0x21,0x28,0xA0,0x02, +0x21,0x38,0x20,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x23,0x18,0x51,0x02, +0x00,0x94,0x03,0x00, +0x03,0x94,0x12,0x00, +0x00,0x00,0x12,0xAE, +0xE2,0xFF,0x40,0x1E, +0x00,0x00,0x00,0x00, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x1C,0x00,0xB1,0xAF, +0x04,0x00,0x8B,0x8C, +0x21,0x80,0x80,0x00, +0x08,0x00,0x84,0x8C, +0x0E,0x00,0x07,0x96, +0xFF,0xE0,0x02,0x3C, +0x10,0x00,0x08,0x8E, +0x1F,0x00,0x6A,0x31, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x82,0x00, +0x00,0x1E,0x0A,0x00, +0x25,0x48,0x83,0x00, +0x21,0x90,0xA0,0x00, +0x21,0x60,0xC0,0x00, +0x10,0x01,0x00,0x05, +0x07,0x00,0xE7,0x30, +0x00,0x00,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFD,0x0F,0x42,0x28, +0xC0,0x00,0x40,0x14, +0x02,0x80,0x11,0x3C, +0xFF,0xDF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x48,0x22,0x01, +0x1C,0x00,0x02,0x8E, +0x00,0x40,0x03,0x3C, +0x25,0x48,0x23,0x01, +0x02,0x80,0x11,0x3C, +0xC5,0x00,0x40,0x04, +0x08,0x00,0x09,0xAE, +0xC0,0x30,0x0A,0x00, +0x21,0x10,0xCA,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x4A,0x00, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x27,0x26, +0x21,0x28,0x47,0x00, +0x1C,0x24,0xA3,0x8C, +0x01,0x00,0x0A,0x24, +0x02,0x13,0x03,0x00, +0x01,0x00,0x42,0x30, +0xDB,0x00,0x4A,0x10, +0x42,0x18,0x03,0x00, +0x82,0x11,0x09,0x00, +0x01,0x00,0x42,0x30, +0x06,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xC0,0xFF,0x02,0x24, +0x24,0x10,0x22,0x01, +0x04,0x00,0x49,0x34, +0x08,0x00,0x09,0xAE, +0x02,0x80,0x02,0x3C, +0xE9,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x6C,0x00,0x60,0x14, +0x21,0x28,0xC7,0x00, +0xE8,0x22,0xA4,0x8C, +0x10,0x00,0x02,0x8E, +0xBF,0xFF,0x03,0x24, +0x40,0x00,0x84,0x30, +0x24,0x10,0x43,0x00, +0x25,0x40,0x44,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0xA3,0x8C, +0x7F,0xF8,0x02,0x24, +0x24,0x10,0x02,0x01, +0x80,0x07,0x63,0x30, +0x42,0x27,0x09,0x00, +0x25,0x40,0x43,0x00, +0x01,0x00,0x84,0x30, +0xE1,0x00,0x8A,0x10, +0x10,0x00,0x08,0xAE, +0x30,0x1F,0x24,0x26, +0x21,0x20,0xC4,0x00, +0xE8,0x22,0x83,0x8C, +0xFF,0xF7,0x02,0x24, +0x24,0x10,0x02,0x01, +0x00,0x08,0x63,0x30, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0x83,0x8C, +0xFF,0xEF,0x02,0x24, +0x24,0x10,0x02,0x01, +0x00,0x10,0x63,0x30, +0x30,0x1F,0x25,0x26, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0x21,0x30,0xC5,0x00, +0xE8,0x22,0xC4,0x8C, +0xFD,0xFF,0x02,0x3C, +0x02,0x00,0x03,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x83,0x00, +0x24,0x10,0x02,0x01, +0x25,0x40,0x44,0x00, +0x10,0x00,0x08,0xAE, +0xB0,0x1B,0xA3,0x94, +0xFB,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC2,0x1B,0x03,0x00, +0x24,0x10,0x02,0x01, +0x80,0x1C,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0x8F,0x3E,0xA3,0x90, +0xE7,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x03,0x00,0x63,0x30, +0x24,0x10,0x02,0x01, +0xC0,0x1C,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0xC4,0x8C, +0xFF,0xFD,0x02,0x3C, +0x00,0x02,0x03,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x83,0x00, +0x24,0x10,0x02,0x01, +0x25,0x40,0x44,0x00, +0x10,0x00,0x08,0xAE, +0xB0,0x1B,0xA3,0x94, +0xFF,0xFB,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC2,0x1B,0x03,0x00, +0x24,0x10,0x02,0x01, +0x80,0x1E,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0x8F,0x3E,0xA3,0x90, +0xFF,0xE7,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x03,0x00,0x63,0x30, +0x24,0x10,0x02,0x01, +0xC0,0x1E,0x03,0x00, +0x25,0x40,0x43,0x00, +0x10,0x00,0x08,0xAE, +0xE8,0x22,0xC3,0x8C, +0xC0,0xFF,0x02,0x24, +0x24,0x10,0x02,0x01, +0x3F,0x00,0x63,0x30, +0x25,0x10,0x43,0x00, +0x10,0x00,0x02,0xAE, +0xEC,0x22,0xC5,0x8C, +0x14,0x00,0x03,0x8E, +0xFF,0xFF,0x04,0x3C, +0xFF,0x7F,0x84,0x34, +0x24,0x18,0x64,0x00, +0x00,0x80,0xA5,0x30, +0x25,0x18,0x65,0x00, +0x14,0x00,0x03,0xAE, +0xEC,0x22,0xC2,0x8C, +0x24,0x18,0x64,0x00, +0x00,0x80,0x42,0x30, +0x25,0x18,0x62,0x00, +0x14,0x00,0x03,0xAE, +0xEE,0x22,0xC4,0x94, +0xE0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x1F,0x00,0x84,0x30, +0x24,0x18,0x62,0x00, +0x00,0x24,0x04,0x00, +0x25,0x18,0x64,0x00, +0x14,0x00,0x03,0xAE, +0x02,0x00,0x02,0x92, +0x02,0x24,0x0B,0x00, +0x02,0x80,0x03,0x3C, +0x21,0x10,0x4C,0x00, +0xFF,0xFF,0x42,0x30, +0x01,0x00,0x84,0x30, +0x6A,0x00,0x80,0x10, +0x25,0x30,0x43,0x00, +0x30,0x1F,0x23,0x26, +0xF8,0x1D,0x62,0x94, +0x00,0x00,0x00,0x00, +0xFF,0x0F,0x45,0x30, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x62,0xA4, +0x0C,0x00,0x03,0x8E, +0x00,0xF0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x00,0x24,0x05,0x00, +0x24,0x18,0x62,0x00, +0x25,0x18,0x64,0x00, +0x0C,0x00,0x03,0xAE, +0x16,0x00,0xC2,0x94, +0x00,0x19,0x05,0x00, +0x02,0x00,0x04,0x24, +0x0F,0x00,0x42,0x30, +0x25,0x10,0x43,0x00, +0x16,0x00,0xC2,0xA4, +0x21,0x28,0x80,0x01, +0x21,0x30,0x40,0x02, +0x80,0x00,0x07,0x24, +0x01,0x00,0x02,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x52,0xAC, +0xB0,0x01,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x30,0x1F,0x24,0x26, +0x00,0x00,0x03,0x96, +0x94,0x3E,0x82,0x8C, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x43,0x00, +0x28,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x94,0x3E,0x82,0xAC, +0x08,0x00,0x09,0xAE, +0x30,0x1F,0x22,0x26, +0x1A,0x3E,0x43,0x90, +0xFF,0xDF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x07,0x18,0xE3,0x00, +0x01,0x00,0x63,0x30, +0x24,0x10,0x22,0x01, +0x40,0x1F,0x03,0x00, +0x25,0x48,0x43,0x00, +0x1C,0x00,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x3D,0xFF,0x41,0x04, +0x08,0x00,0x09,0xAE, +0x1E,0x00,0x02,0x92, +0x04,0x00,0x03,0x24, +0x21,0x30,0x50,0x00, +0x00,0x00,0xC4,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x82,0x30, +0x02,0x29,0x02,0x00, +0x50,0x00,0xA3,0x10, +0x06,0x00,0x02,0x24, +0x32,0xFF,0xA2,0x14, +0x00,0x00,0x00,0x00, +0x1A,0x00,0x02,0x96, +0x00,0x00,0x00,0x00, +0x39,0x00,0xC2,0xA0, +0x1E,0x00,0x03,0x92, +0x1A,0x00,0x02,0x96, +0x21,0x18,0x70,0x00, +0x03,0x12,0x02,0x00, +0x38,0x00,0x62,0xA0, +0x04,0x00,0x0B,0x8E, +0x08,0x00,0x09,0x8E, +0xC0,0x30,0x0A,0x00, +0x21,0x10,0xCA,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x4A,0x00, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x27,0x26, +0x21,0x28,0x47,0x00, +0x1C,0x24,0xA3,0x8C, +0x01,0x00,0x0A,0x24, +0x02,0x13,0x03,0x00, +0x01,0x00,0x42,0x30, +0x29,0xFF,0x4A,0x14, +0x82,0x11,0x09,0x00, +0x42,0x18,0x03,0x00, +0x7F,0xFF,0x02,0x24, +0x24,0x10,0x22,0x01, +0x80,0x00,0x63,0x30, +0x25,0x48,0x43,0x00, +0x08,0x00,0x09,0xAE, +0x1C,0x24,0xA3,0x8C, +0x10,0x00,0x04,0x8E, +0xFF,0xFF,0x02,0x3C, +0x07,0x00,0x63,0x30, +0xFF,0x1F,0x42,0x34, +0x24,0x20,0x82,0x00, +0x40,0x1B,0x03,0x00, +0x25,0x40,0x83,0x00, +0x44,0x02,0x00,0x08, +0x10,0x00,0x08,0xAE, +0x0E,0x00,0x02,0x96, +0x30,0x1F,0x23,0x26, +0x07,0x00,0x42,0x30, +0x40,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0xE8,0x1D,0x44,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x83,0x24, +0xFF,0x0F,0x85,0x30, +0xCA,0x02,0x00,0x08, +0xE8,0x1D,0x43,0xA4, +0x14,0x00,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x42,0x12,0x02,0x00, +0x3F,0x00,0x42,0x30, +0x0C,0x00,0x42,0x28, +0xF1,0xFE,0x40,0x14, +0xFF,0xDF,0x02,0x3C, +0x29,0x02,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x1D,0xFF,0x64,0x14, +0x30,0x1F,0x24,0x26, +0x90,0x3E,0xE2,0x90, +0xFF,0xF7,0x03,0x24, +0x24,0x18,0x03,0x01, +0x01,0x00,0x42,0x30, +0xC0,0x12,0x02,0x00, +0x25,0x40,0x62,0x00, +0x10,0x00,0x08,0xAE, +0x91,0x3E,0xE2,0x90, +0xFF,0xEF,0x03,0x24, +0x24,0x18,0x03,0x01, +0x01,0x00,0x42,0x30, +0x6D,0x02,0x00,0x08, +0x00,0x13,0x02,0x00, +0x1A,0x00,0x05,0x96, +0x0F,0x00,0x84,0x30, +0x80,0x20,0x04,0x00, +0x21,0x18,0xC4,0x00, +0x11,0x00,0x65,0xA0, +0x1E,0x00,0x02,0x92, +0x1A,0x00,0x03,0x96, +0x21,0x10,0x50,0x00, +0x21,0x10,0x44,0x00, +0x03,0x1A,0x03,0x00, +0x10,0x00,0x43,0xA0, +0x04,0x00,0x0B,0x8E, +0x08,0x00,0x09,0x8E, +0x11,0x03,0x00,0x08, +0xC0,0x30,0x0A,0x00, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x88,0x0D,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x00,0x80,0x02,0x3C, +0xC0,0xFF,0xBD,0x27, +0x18,0x03,0x83,0x34, +0xA4,0x0D,0x42,0x24, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0xB0,0x03,0x9E,0x34, +0x98,0x03,0x00,0x08, +0x30,0x1F,0x55,0x24, +0x08,0x00,0x04,0xAE, +0x14,0x37,0x46,0x8E, +0x21,0x28,0x60,0x02, +0x80,0x00,0x07,0x24, +0x01,0x00,0x04,0x24, +0x01,0x00,0x14,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB4,0xAF, +0x14,0x37,0x43,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x00,0xC3,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0x1C,0x42,0x92, +0x00,0x00,0x00,0x00, +0x5F,0x00,0x40,0x10, +0x2A,0xB0,0x02,0x3C, +0x09,0x00,0x42,0x34, +0x02,0x00,0x03,0x24, +0x00,0x00,0x54,0xA0, +0x00,0x00,0x43,0xA0, +0xFF,0x00,0x03,0x24, +0x74,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0x10,0x37,0xA2,0x8E, +0x7C,0x37,0xB3,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x00,0xC2,0xAF, +0x14,0x37,0xA2,0xAE, +0x00,0x00,0xD3,0xAF, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x7C,0x37,0xA4,0x8E, +0x80,0x37,0xA3,0x8E, +0x02,0x80,0x02,0x3C, +0x04,0xEA,0x42,0x24, +0x00,0x00,0x52,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x7C,0x37,0xA3,0xAE, +0x02,0x80,0x03,0x3C, +0x08,0xEA,0x63,0x24, +0x7C,0x37,0x42,0x8E, +0x00,0x00,0x76,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xAE, +0x02,0x80,0x17,0x3C, +0xFF,0xFF,0x62,0x32, +0x25,0x80,0x57,0x00, +0x00,0x00,0xD0,0xAE, +0x0C,0x00,0x02,0x92, +0x21,0x28,0x00,0x00, +0x00,0x00,0xC2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x93,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x97,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0x01,0x00,0x04,0x24, +0x00,0x1A,0x11,0x00, +0x21,0x18,0x62,0x00, +0xFF,0x00,0x02,0x24, +0x21,0x30,0x60,0x00, +0x06,0x00,0x22,0x12, +0x80,0x00,0x07,0x24, +0x7C,0x37,0x45,0x8E, +0x10,0x37,0x43,0xAE, +0xB4,0x36,0x51,0xA2, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x04,0x00,0x04,0x8E, +0x08,0x00,0x03,0x8E, +0xFF,0xE0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x1F,0x00,0x84,0x30, +0x24,0x18,0x62,0x00, +0x00,0x26,0x04,0x00, +0xFF,0xDF,0x02,0x3C, +0x25,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x40,0x04,0x3C, +0x25,0x18,0x64,0x00, +0xC0,0xFF,0x05,0x24, +0x82,0x11,0x03,0x00, +0x24,0x20,0x65,0x00, +0x01,0x00,0x42,0x30, +0xA3,0xFF,0x40,0x10, +0x04,0x00,0x84,0x34, +0x08,0x00,0x03,0xAE, +0x14,0x37,0x46,0x8E, +0x21,0x28,0x60,0x02, +0x80,0x00,0x07,0x24, +0x01,0x00,0x04,0x24, +0x01,0x00,0x14,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB4,0xAF, +0x14,0x37,0x43,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x00,0xC3,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0x1C,0x42,0x92, +0x00,0x00,0x00,0x00, +0xA3,0xFF,0x40,0x14, +0x2A,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x2A,0x1C,0x54,0xA2, +0x02,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x21,0x10,0x53,0x00, +0xFF,0xFF,0x42,0x30, +0x25,0x10,0x57,0x00, +0x02,0x00,0x43,0x94, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x64,0x30, +0x00,0xC0,0x84,0x24, +0xFF,0xFF,0x84,0x30, +0xC2,0x34,0x00,0x0C, +0x2B,0x1C,0x43,0xA2, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2A,0xB0,0x02,0x3C, +0x09,0x00,0x42,0x34, +0x02,0x00,0x03,0x24, +0x00,0x00,0x54,0xA0, +0x00,0x00,0x43,0xA0, +0xFF,0x00,0x03,0x24, +0x8E,0xFF,0x23,0x16, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0xD0,0x1B,0x43,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x38,0x63,0x34, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x83,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0x43,0xAC, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x88,0x10,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0xA4,0x10,0x63,0x24, +0x40,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0x7F,0x00,0xA2,0x30, +0xBF,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xD3,0x27, +0xB0,0x03,0x55,0x34, +0x6A,0x04,0x00,0x08, +0x02,0x80,0x16,0x3C, +0x90,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xC8,0x36,0x46,0x8C, +0x34,0x37,0x45,0x8C, +0x03,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xCC,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x0D,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xC8,0x36,0x62,0x8E, +0x34,0x37,0x72,0x8E, +0x03,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xCC,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x34,0x37,0x64,0x8E, +0x38,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x0C,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x34,0x37,0x63,0xAE, +0x34,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x01,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xC8,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x4C,0x04,0x00,0x08, +0x8C,0x36,0x51,0xA0, +0x21,0x00,0xE0,0x12, +0x40,0x00,0xE4,0x34, +0x90,0x36,0x83,0x92, +0x41,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA4,0x8C, +0x01,0x00,0x02,0x3C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x80,0x42,0x34, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x8C,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA4,0x8C, +0x01,0x00,0x02,0x3C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x80,0x42,0x34, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x64,0x13,0x63,0x24, +0x10,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0xDF,0x00,0xA2,0x30, +0xEF,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0xCC,0x5E,0xC3,0x90, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x30,0x1F,0xD3,0x27, +0x21,0xA8,0x40,0x00, +0x1E,0x05,0x00,0x08, +0x02,0x80,0x16,0x3C, +0x98,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xD4,0x36,0x46,0x8C, +0x40,0x37,0x45,0x8C, +0x04,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xD8,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x15,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xD4,0x36,0x62,0x8E, +0x40,0x37,0x72,0x8E, +0x04,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xD8,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x40,0x37,0x64,0x8E, +0x44,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x10,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x40,0x37,0x63,0xAE, +0x40,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x02,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xD4,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x00,0x05,0x00,0x08, +0x94,0x36,0x51,0xA0, +0x20,0x00,0xE0,0x12, +0x42,0x00,0xE4,0x34, +0x98,0x36,0x83,0x92, +0x43,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x06,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x94,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x06,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x2C,0x16,0x63,0x24, +0x01,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0xF7,0x00,0xA2,0x30, +0xFE,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0xCC,0x5E,0xC3,0x90, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x30,0x1F,0xD3,0x27, +0x21,0xA8,0x40,0x00, +0xCF,0x05,0x00,0x08, +0x02,0x80,0x16,0x3C, +0xA8,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xE0,0x36,0x46,0x8C, +0x4C,0x37,0x45,0x8C, +0x05,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xE4,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x1D,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xE0,0x36,0x62,0x8E, +0x4C,0x37,0x72,0x8E, +0x05,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xE4,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4C,0x37,0x64,0x8E, +0x50,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x14,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x4C,0x37,0x63,0xAE, +0x4C,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x08,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xE0,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xB1,0x05,0x00,0x08, +0x9C,0x36,0x51,0xA0, +0x20,0x00,0xE0,0x12, +0x44,0x00,0xE4,0x34, +0xA8,0x36,0x83,0x92, +0x45,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x18,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x9C,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x18,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB7,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x06,0x3C, +0xCC,0x5E,0xC5,0x90, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0xF0,0x18,0x63,0x24, +0x02,0x00,0xA4,0x30, +0x00,0x00,0x43,0xAC, +0x21,0xB8,0x00,0x00, +0x03,0x00,0x80,0x10, +0xFB,0x00,0xA2,0x30, +0xFD,0x00,0xA2,0x30, +0x01,0x00,0x17,0x24, +0xCC,0x5E,0xC2,0xA0, +0xCC,0x5E,0xC3,0x90, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x30,0x1F,0xD3,0x27, +0x21,0xA8,0x40,0x00, +0x80,0x06,0x00,0x08, +0x02,0x80,0x16,0x3C, +0xA4,0x36,0x91,0xA2, +0x30,0x1F,0xC2,0x27, +0xEC,0x36,0x46,0x8C, +0x58,0x37,0x45,0x8C, +0x06,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x30,0x1F,0xD4,0x27, +0xF0,0x36,0x85,0x8E, +0x21,0x20,0x00,0x02, +0x15,0x02,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x2A,0xB0,0x07,0x3C, +0x25,0x00,0xE2,0x34, +0x04,0x00,0x43,0x24, +0x0B,0x10,0x77,0x00, +0x01,0x00,0x04,0x24, +0x02,0x00,0x03,0x24, +0x00,0x00,0x44,0xA0, +0x00,0x00,0x43,0xA0, +0x1A,0x5E,0xC4,0x96, +0x25,0xB0,0x06,0x3C, +0x66,0x03,0xC5,0x34, +0x01,0x00,0x84,0x24, +0x1A,0x5E,0xC4,0xA6, +0x1A,0x5E,0xC2,0x96, +0xFF,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x2F,0x00,0x23,0x12, +0x00,0x00,0x00,0x00, +0xEC,0x36,0x62,0x8E, +0x58,0x37,0x72,0x8E, +0x06,0x00,0x04,0x24, +0x00,0x00,0xA2,0xAE, +0xF0,0x36,0x62,0xAE, +0x00,0x00,0xB2,0xAE, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x58,0x37,0x64,0x8E, +0x5C,0x37,0x63,0x8E, +0x02,0x80,0x02,0x3C, +0x18,0xEA,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x80,0x00,0x84,0x24, +0xFF,0x00,0x62,0x24, +0x2B,0x10,0x44,0x00, +0x0A,0x18,0x82,0x00, +0x58,0x37,0x63,0xAE, +0x58,0x37,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAE, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x42,0x32, +0x25,0x80,0x43,0x00, +0x00,0x00,0xB0,0xAE, +0x0C,0x00,0x02,0x92, +0x04,0x00,0x05,0x24, +0x00,0x00,0xA2,0xAE, +0x02,0x00,0x04,0x92, +0x00,0x00,0x00,0x00, +0x21,0x20,0x92,0x00, +0xFF,0xFF,0x84,0x30, +0xFB,0x60,0x00,0x0C, +0x25,0x20,0x83,0x00, +0x0C,0x00,0x11,0x92, +0x20,0x10,0x02,0x3C, +0xFF,0x00,0x03,0x24, +0x00,0x22,0x11,0x00, +0xC2,0xFF,0x23,0x12, +0x21,0x20,0x82,0x00, +0xB8,0xFF,0xE0,0x16, +0xEC,0x36,0x84,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x62,0x06,0x00,0x08, +0xA0,0x36,0x51,0xA0, +0x20,0x00,0xE0,0x12, +0x46,0x00,0xE4,0x34, +0xA4,0x36,0x83,0x92, +0x47,0x00,0xE4,0x34, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x60,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0xA0,0x36,0x83,0x92, +0xB0,0x03,0xC5,0x34, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xA3,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x60,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xB4,0x1B,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD8,0x1B,0xA2,0x8C, +0xD0,0x1B,0xA4,0x8C, +0x00,0x08,0x03,0x3C, +0x24,0x10,0x43,0x00, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x25,0xB0,0x04,0x3C, +0x00,0x80,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0x18,0x03,0x83,0x34, +0x10,0x1C,0x42,0x24, +0x30,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x14,0x3C, +0x30,0x1F,0x93,0x26, +0xFC,0x00,0x82,0x34, +0x00,0x00,0x45,0x8C, +0xAC,0x1B,0x66,0x96, +0xD8,0x37,0x63,0x96, +0xD0,0x37,0x67,0x8E, +0x23,0x28,0xA6,0x00, +0x21,0x10,0xA3,0x00, +0x23,0x88,0x47,0x00, +0xB0,0x03,0x84,0x34, +0x23,0x30,0x23,0x02, +0x2B,0x10,0x71,0x00, +0x00,0x00,0x83,0xAC, +0x00,0x00,0x91,0xAC, +0x0B,0x88,0xC2,0x00, +0x21,0x20,0x20,0x02, +0x25,0x24,0x00,0x0C, +0xD4,0x37,0x65,0xAE, +0x4B,0x00,0x40,0x10, +0x21,0x90,0x40,0x00, +0x0C,0x00,0x51,0xAC, +0xD0,0x37,0x68,0x8E, +0xD4,0x37,0x62,0x8E, +0x08,0x00,0x45,0x8E, +0x20,0xBD,0x03,0x3C, +0x88,0x03,0x63,0x34, +0x2B,0x10,0x48,0x00, +0x40,0x10,0x15,0x3C, +0x21,0x20,0x00,0x00, +0xFF,0xFF,0x27,0x32, +0x00,0x00,0x65,0xAC, +0x28,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xAC,0x1B,0x66,0x96, +0x08,0x00,0x42,0x96, +0x40,0x10,0x05,0x3C, +0x21,0x20,0x00,0x00, +0x21,0x30,0x06,0x01, +0x25,0x28,0x45,0x00, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x02,0x3C, +0x64,0x57,0x42,0x24, +0x30,0x1F,0x84,0x26, +0xD4,0x37,0x83,0x8C, +0x04,0x00,0x45,0x8C, +0xD0,0x37,0x83,0xAC, +0x00,0x00,0x42,0xAE, +0x04,0x00,0x52,0xAC, +0x00,0x00,0xB2,0xAC, +0x04,0x00,0x45,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0x85,0x26, +0xD8,0x1B,0xA2,0x8C, +0xD0,0x1B,0xA3,0x8C, +0x30,0x00,0xBF,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x04,0x00,0x42,0x30, +0x25,0x18,0x62,0x00, +0x41,0xB0,0x04,0x3C, +0x38,0x00,0xBD,0x27, +0x00,0x00,0x83,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA3,0xAC, +0xD8,0x37,0x70,0x8E, +0x08,0x00,0x45,0x96, +0xAC,0x1B,0x66,0x96, +0x23,0x80,0x08,0x02, +0xFF,0xFF,0x10,0x32, +0x21,0x30,0x06,0x01, +0x25,0x28,0xB5,0x00, +0x21,0x38,0x00,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xB0,0x01,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x08,0x00,0x45,0x96, +0xAC,0x1B,0x62,0x96, +0x23,0x38,0x30,0x02, +0x25,0x28,0xB5,0x00, +0x21,0x10,0x06,0x3C, +0x21,0x28,0xB0,0x00, +0x21,0x30,0x46,0x00, +0xFF,0xFF,0xE7,0x30, +0x3C,0x07,0x00,0x08, +0x21,0x20,0x00,0x00, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x04,0x3C, +0xD0,0x5E,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x10,0x63,0x34, +0xD0,0x5E,0x83,0xAC, +0x00,0x60,0x82,0x40, +0x48,0x07,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x00,0x80,0x02,0x3C, +0xC0,0xFF,0xBD,0x27, +0x18,0x03,0x83,0x34, +0xFC,0x1D,0x42,0x24, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x02,0x80,0x1E,0x3C, +0x02,0x80,0x02,0x3C, +0x2A,0xB0,0x03,0x3C, +0xB0,0x03,0x96,0x34, +0x80,0xD5,0x57,0x24, +0x2C,0x00,0x73,0x34, +0x30,0x1F,0xD1,0x27, +0x02,0x80,0x15,0x3C, +0xD1,0x07,0x00,0x08, +0x02,0x80,0x14,0x3C, +0x54,0xF3,0x90,0xAE, +0x02,0x80,0x04,0x3C, +0x03,0x00,0xC3,0x90, +0x7C,0xD5,0x82,0x90, +0x7F,0x00,0x63,0x30, +0xFF,0x00,0x42,0x30, +0x6B,0x00,0x62,0x10, +0x08,0x00,0x10,0x26, +0x02,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x37,0x00,0x42,0x28, +0x5E,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0xC5,0x90, +0x03,0x00,0xC3,0x90, +0xFF,0x00,0xA5,0x30, +0x7F,0x00,0x63,0x30, +0x7C,0xD5,0x83,0xA0, +0x02,0x00,0xC2,0x90, +0x0E,0x00,0xA5,0x38, +0x0A,0x80,0xE5,0x00, +0xFF,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x10,0x57,0x00, +0x04,0x00,0x43,0x8C, +0x02,0x80,0x04,0x3C, +0x8C,0xD7,0x84,0x24, +0x4C,0xF3,0xA3,0xAE, +0x02,0x00,0xC5,0x90, +0x2F,0x55,0x00,0x0C, +0xFF,0x00,0xA5,0x30, +0x4C,0xF3,0xA2,0x8E, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x40,0x00, +0x21,0x20,0x00,0x02, +0x01,0x00,0x02,0x24, +0x02,0x00,0x03,0x24, +0x01,0x00,0x62,0xA2, +0x01,0x00,0x63,0xA2, +0x2B,0x00,0x40,0x12, +0x00,0x00,0x00,0x00, +0xB8,0x36,0x22,0x92, +0x20,0x10,0x03,0x3C, +0x88,0x37,0x25,0x8E, +0x00,0x12,0x02,0x00, +0x21,0x10,0x43,0x00, +0x21,0x30,0x40,0x00, +0x0A,0x00,0x04,0x24, +0x00,0x01,0x07,0x24, +0x1C,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x88,0x37,0x30,0x8E, +0xB0,0x01,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0xFF,0xFF,0x10,0x32, +0x02,0x80,0x02,0x3C, +0x25,0x80,0x02,0x02, +0x0C,0x00,0x04,0x92, +0xFF,0x00,0x02,0x24, +0x21,0x38,0x00,0x02, +0xFF,0x00,0x83,0x30, +0x20,0x00,0x10,0x26, +0x04,0x00,0x62,0x10, +0x21,0x90,0x00,0x00, +0xB8,0x36,0x24,0xA2, +0x01,0x00,0x12,0x24, +0x00,0x00,0xC3,0xAE, +0x04,0x00,0xE2,0x8C, +0x13,0x00,0x03,0x24, +0x02,0x12,0x02,0x00, +0x1F,0x00,0x45,0x30, +0xB6,0xFF,0xA3,0x10, +0x21,0x30,0x00,0x02, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x38,0xD7,0x84,0x24, +0x01,0x00,0x02,0x24, +0x02,0x00,0x03,0x24, +0x01,0x00,0x62,0xA2, +0x01,0x00,0x63,0xA2, +0xD7,0xFF,0x40,0x16, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA2,0x8C, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x00,0x04,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x41,0xB0,0x04,0x3C, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x82,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA2,0xAC, +0x02,0x00,0xC5,0x90, +0x02,0x80,0x04,0x3C, +0x78,0xD7,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xFF,0x00,0xA5,0x30, +0xEB,0x07,0x00,0x08, +0x01,0x00,0x02,0x24, +0x02,0x00,0xC5,0x90, +0x02,0x00,0xC6,0x90, +0x7C,0xD5,0x87,0x90, +0x02,0x80,0x04,0x3C, +0x48,0xD7,0x84,0x24, +0xFF,0x00,0xA5,0x30, +0xFF,0x00,0xC6,0x30, +0x2F,0x55,0x00,0x0C, +0xFF,0x00,0xE7,0x30, +0xC1,0x07,0x00,0x08, +0x01,0x00,0x02,0x24, +0xC8,0xFF,0xBD,0x27, +0xFF,0xFF,0xA8,0x30, +0x02,0x80,0x02,0x3C, +0x25,0x40,0x02,0x01, +0x30,0x00,0xB6,0xAF, +0x20,0x00,0xB2,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x03,0x8D, +0xFF,0xFF,0xD2,0x30, +0x21,0xB0,0xA0,0x00, +0x00,0xC0,0x02,0x24, +0x08,0x00,0x45,0x26, +0x04,0x00,0x06,0x8D, +0x24,0x18,0x62,0x00, +0xFF,0x3F,0xA5,0x30, +0xF0,0xFF,0x02,0x3C, +0x25,0x18,0x65,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x80,0x05,0x3C, +0x25,0x18,0x65,0x00, +0xFF,0x01,0xC6,0x34, +0x00,0x00,0x03,0xAD, +0x04,0x00,0x06,0xAD, +0x21,0x48,0x80,0x00, +0xFF,0xFF,0xE7,0x30, +0x18,0x00,0x12,0xA5, +0x1A,0x00,0x07,0xA1, +0x18,0x00,0x03,0x8D, +0xFF,0x7F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x02,0x80,0x15,0x3C, +0x18,0x00,0x03,0xAD, +0x30,0x1F,0xA5,0x26, +0x7A,0x36,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x24, +0x7A,0x36,0xA2,0xA0, +0x18,0x00,0x04,0x8D, +0xFF,0x80,0x02,0x3C, +0x20,0x00,0x45,0x26, +0xFF,0xFF,0x42,0x34, +0x7F,0x00,0x63,0x30, +0xFF,0xFF,0xB2,0x30, +0x24,0x20,0x82,0x00, +0x00,0x1E,0x03,0x00, +0x25,0xB0,0x02,0x3C, +0xC0,0x00,0x42,0x34, +0x25,0x20,0x83,0x00, +0x07,0x00,0x45,0x32, +0x18,0x00,0x04,0xAD, +0x00,0x00,0x52,0xA4, +0x03,0x00,0xA0,0x10, +0xFF,0xFF,0x42,0x32, +0x08,0x00,0x42,0x26, +0xFF,0xFF,0x42,0x30, +0x30,0x1F,0xB4,0x26, +0xF8,0x37,0x86,0x8E, +0xFC,0x37,0x90,0x8E, +0xF8,0xFF,0x52,0x30, +0x21,0x10,0xD2,0x00, +0x2B,0x10,0x02,0x02, +0x31,0x00,0x40,0x10, +0xFF,0x00,0x33,0x31, +0x23,0x80,0x06,0x02, +0x21,0x28,0xC0,0x02, +0xFF,0xFF,0x07,0x32, +0x01,0x00,0x11,0x24, +0x21,0x20,0x60,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB1,0xAF, +0x23,0x18,0x50,0x02, +0xFF,0xFF,0x72,0x30, +0x22,0x10,0x02,0x3C, +0x21,0x10,0x42,0x02, +0x21,0x20,0x60,0x02, +0xB0,0x01,0x00,0x0C, +0xF8,0x37,0x82,0xAE, +0x21,0x28,0xD0,0x02, +0x21,0x38,0x40,0x02, +0x21,0x20,0x60,0x02, +0x10,0x00,0xB1,0xAF, +0x22,0x10,0x06,0x3C, +0x73,0x01,0x00,0x0C, +0x30,0x1F,0xB1,0x26, +0xF8,0x37,0x23,0x8E, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x02,0x36, +0x21,0x20,0x60,0x02, +0x00,0x00,0x43,0xAC, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF8,0x37,0x25,0x8E, +0xEC,0x00,0x02,0x36, +0xBD,0x00,0x04,0x36, +0x00,0x00,0x45,0xAC, +0x00,0x00,0x83,0x90, +0xC2,0x00,0x10,0x36, +0x34,0x00,0xBF,0x8F, +0x10,0x00,0x63,0x34, +0x00,0x00,0x83,0xA0, +0x30,0x00,0xB6,0x8F, +0x00,0x00,0x05,0xA6, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x21,0x28,0xC0,0x02, +0x21,0x20,0x60,0x02, +0x21,0x38,0x40,0x02, +0x01,0x00,0x02,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xF8,0x37,0x83,0x8E, +0x30,0x1F,0xB1,0x26, +0x25,0xB0,0x10,0x3C, +0x21,0x18,0x72,0x00, +0xF8,0x37,0x83,0xAE, +0xF8,0x37,0x23,0x8E, +0xB0,0x03,0x02,0x36, +0x21,0x20,0x60,0x02, +0x00,0x00,0x43,0xAC, +0xB0,0x01,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF8,0x37,0x25,0x8E, +0xEC,0x00,0x02,0x36, +0xBD,0x00,0x04,0x36, +0x00,0x00,0x45,0xAC, +0x00,0x00,0x83,0x90, +0xC2,0x00,0x10,0x36, +0x34,0x00,0xBF,0x8F, +0x10,0x00,0x63,0x34, +0x00,0x00,0x83,0xA0, +0x30,0x00,0xB6,0x8F, +0x00,0x00,0x05,0xA6, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x21,0x80,0x80,0x00, +0x00,0x60,0x14,0x40, +0x01,0x00,0x81,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x14,0x00,0x83,0x8C, +0x02,0x80,0x15,0x3C, +0x16,0x00,0x02,0x24, +0x30,0x1F,0xB3,0x26, +0x21,0x28,0x00,0x00, +0x1D,0x00,0x62,0x10, +0x08,0x00,0x06,0x24, +0x08,0x00,0x82,0x94, +0x02,0x80,0x04,0x3C, +0x08,0x52,0x00,0x0C, +0x25,0x20,0x44,0x00, +0x08,0x00,0x05,0x8E, +0x0C,0x00,0x06,0x96, +0x14,0x00,0x07,0x96, +0x19,0x08,0x00,0x0C, +0x09,0x00,0x04,0x24, +0x04,0x00,0x02,0x8E, +0x00,0x00,0x03,0x8E, +0x21,0x20,0x00,0x02, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x62,0xAC, +0x00,0x00,0x10,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x10,0xAE, +0x00,0x60,0x94,0x40, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xF8,0x37,0x68,0x8E, +0x0C,0x00,0x11,0x8E, +0xFC,0x37,0x62,0x8E, +0x25,0xB0,0x03,0x3C, +0x21,0x28,0x11,0x01, +0xC0,0x00,0x63,0x34, +0x23,0x90,0x48,0x00, +0x2B,0x10,0x45,0x00, +0x01,0x00,0x16,0x24, +0x09,0x00,0x04,0x24, +0xFF,0xFF,0x27,0x32, +0x21,0x30,0x00,0x01, +0x00,0x00,0x71,0xA4, +0x33,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0x08,0x00,0x05,0x8E, +0xFF,0xFF,0x47,0x32, +0x23,0x88,0x32,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB6,0xAF, +0x22,0x10,0x03,0x3C, +0x21,0x18,0x23,0x02, +0x09,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0xF8,0x37,0x63,0xAE, +0x08,0x00,0x05,0x8E, +0xFF,0xFF,0x27,0x32, +0x09,0x00,0x04,0x24, +0x21,0x28,0xB2,0x00, +0x22,0x10,0x06,0x3C, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB6,0xAF, +0xB0,0x01,0x00,0x0C, +0x09,0x00,0x04,0x24, +0x30,0x1F,0xA2,0x26, +0xF8,0x37,0x46,0x8C, +0x25,0xB0,0x03,0x3C, +0xEC,0x00,0x64,0x34, +0x00,0x00,0x86,0xAC, +0xBD,0x00,0x65,0x34, +0x00,0x00,0xA2,0x90, +0xC2,0x00,0x63,0x34, +0x21,0x20,0x00,0x02, +0x10,0x00,0x42,0x34, +0x00,0x00,0xA2,0xA0, +0x00,0x00,0x66,0xA4, +0x04,0x00,0x02,0x8E, +0x00,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x62,0xAC, +0x00,0x00,0x10,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x10,0xAE, +0x00,0x60,0x94,0x40, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x08,0x00,0x05,0x8E, +0x21,0x30,0x00,0x01, +0x09,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xF8,0x37,0x63,0x8E, +0x00,0x00,0x00,0x00, +0x21,0x18,0x71,0x00, +0x05,0x09,0x00,0x08, +0xF8,0x37,0x63,0xAE, +0xE8,0xFF,0xBD,0x27, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x28,0x80,0x00, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x02,0x3C, +0xBF,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x63,0x2C, +0x05,0x00,0x60,0x10, +0x02,0x80,0x06,0x3C, +0x6C,0x57,0xC3,0x8C, +0x6C,0x57,0xC2,0x24, +0x0C,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x57,0xC2,0x24, +0x04,0x00,0x43,0x8C, +0x00,0x00,0xA2,0xAC, +0x04,0x00,0x45,0xAC, +0x00,0x00,0x65,0xAC, +0x04,0x00,0xA3,0xAC, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xB4,0x08,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x98,0xD7,0x84,0x24, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x2F,0x55,0x00,0x0C, +0x14,0x00,0xB1,0xAF, +0x00,0x00,0x04,0x96, +0x00,0x00,0x00,0x00, +0x20,0x00,0x83,0x24, +0x07,0x00,0x62,0x30, +0x49,0x00,0x40,0x10, +0xC2,0x10,0x03,0x00, +0x28,0x00,0x82,0x24, +0xC2,0x10,0x02,0x00, +0x25,0x24,0x00,0x0C, +0xC0,0x20,0x02,0x00, +0x47,0x00,0x40,0x10, +0x21,0x88,0x40,0x00, +0x02,0x80,0x12,0x3C, +0x30,0x1F,0x50,0x26, +0x1C,0x37,0x05,0x8E, +0x0A,0x00,0x04,0x24, +0x28,0x00,0x06,0x24, +0xC7,0x01,0x00,0x0C, +0x21,0x38,0x40,0x00, +0xB0,0x1B,0x03,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x62,0x30, +0x47,0x00,0x40,0x14, +0x01,0x00,0x62,0x30, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x48,0x90, +0x25,0xB0,0x04,0x3C, +0x2F,0x00,0x02,0x3C, +0xD0,0x01,0x85,0x34, +0x17,0x32,0x42,0x34, +0x00,0x00,0xA2,0xAC, +0x5E,0x00,0x03,0x3C, +0x10,0x00,0x02,0x3C, +0xDC,0x01,0x87,0x34, +0xD4,0x01,0x86,0x34, +0x17,0x43,0x63,0x34, +0x20,0x53,0x42,0x34, +0xD8,0x01,0x84,0x34, +0x00,0x00,0xC3,0xAC, +0x30,0x1F,0x49,0x26, +0x00,0x00,0x82,0xAC, +0x44,0xA4,0x03,0x34, +0x01,0x00,0x02,0x24, +0x00,0x00,0xE3,0xAC, +0xEC,0x38,0x20,0xAD, +0x08,0x39,0x20,0xAD, +0x50,0x3E,0x20,0xAD, +0x10,0x3E,0x20,0xAD, +0x51,0x00,0x02,0x11, +0x1A,0x3E,0x20,0xA1, +0x10,0x23,0x22,0x8D, +0xFF,0xF7,0x03,0x24, +0xFF,0xEF,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x10,0x23,0x22,0xAD, +0xB0,0x01,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0x08,0x00,0x22,0x96, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x04,0x3C, +0x25,0x28,0x45,0x00, +0xDC,0x01,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x84,0x58,0x84,0x24, +0x3D,0x24,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x30,0x1F,0x43,0x26, +0x9C,0x39,0x62,0x8C, +0xD1,0x11,0x00,0x0C, +0x30,0x3B,0x62,0xA0, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x25,0x24,0x00,0x0C, +0xC0,0x20,0x02,0x00, +0xBB,0xFF,0x40,0x14, +0x21,0x88,0x40,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xA8,0xD7,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x1C,0xEA,0xA5,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x32,0x00,0x40,0x14, +0x02,0x80,0x04,0x3C, +0xA3,0x51,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x02,0x96, +0x25,0xB0,0x03,0x3C, +0x4C,0x00,0x63,0x34, +0xFF,0xFE,0x42,0x30, +0xB0,0x1B,0x02,0xA6, +0x00,0x00,0x60,0xA0, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x48,0x90, +0x25,0xB0,0x04,0x3C, +0x2F,0x00,0x02,0x3C, +0xD0,0x01,0x85,0x34, +0x17,0x32,0x42,0x34, +0x00,0x00,0xA2,0xAC, +0x5E,0x00,0x03,0x3C, +0x10,0x00,0x02,0x3C, +0xDC,0x01,0x87,0x34, +0xD4,0x01,0x86,0x34, +0x17,0x43,0x63,0x34, +0x20,0x53,0x42,0x34, +0xD8,0x01,0x84,0x34, +0x00,0x00,0xC3,0xAC, +0x30,0x1F,0x49,0x26, +0x00,0x00,0x82,0xAC, +0x44,0xA4,0x03,0x34, +0x01,0x00,0x02,0x24, +0x00,0x00,0xE3,0xAC, +0xEC,0x38,0x20,0xAD, +0x08,0x39,0x20,0xAD, +0x50,0x3E,0x20,0xAD, +0x10,0x3E,0x20,0xAD, +0xB1,0xFF,0x02,0x15, +0x1A,0x3E,0x20,0xA1, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x44,0x90, +0x02,0x00,0x03,0x24, +0x06,0x00,0x83,0x10, +0xFF,0xF7,0x03,0x24, +0x10,0x23,0x22,0x8D, +0x00,0x00,0x00,0x00, +0x24,0x10,0x43,0x00, +0x95,0x09,0x00,0x08, +0x00,0x10,0x42,0x34, +0x10,0x23,0x22,0x8D, +0xFF,0xEF,0x03,0x24, +0x00,0x08,0x42,0x34, +0x95,0x09,0x00,0x08, +0x24,0x10,0x43,0x00, +0x88,0x58,0x84,0x24, +0x6C,0x4C,0x00,0x0C, +0x03,0x00,0x05,0x24, +0xBE,0x09,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x1C,0x00,0xB3,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x43,0x26, +0xB0,0x1B,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x30, +0x76,0x00,0x40,0x14, +0x21,0x98,0x80,0x00, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x14,0x3C, +0xF6,0x5E,0x82,0x92, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x74,0x00,0x40,0x14, +0x04,0x00,0x04,0x24, +0x00,0x60,0x90,0x40, +0x30,0x1F,0x42,0x8E, +0xFF,0xF0,0x03,0x24, +0x0F,0xFF,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x25,0xB0,0x05,0x3C, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x64,0x03,0xA4,0x34, +0x17,0x00,0x03,0x24, +0x00,0x00,0x80,0xA0, +0x50,0x0C,0xA3,0xA0, +0x30,0x1F,0x42,0xAE, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x17,0x00,0x03,0x24, +0x58,0x0C,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x51,0x26, +0xB0,0x1B,0x22,0x96, +0x02,0x80,0x04,0x3C, +0xB4,0xD7,0x84,0x24, +0x00,0x10,0x42,0x34, +0x2F,0x55,0x00,0x0C, +0xB0,0x1B,0x22,0xA6, +0x01,0x00,0x02,0x24, +0x25,0xB0,0x03,0x3C, +0x6C,0x3B,0x22,0xAE, +0x4C,0x00,0x63,0x34, +0x08,0x00,0x66,0x8E, +0x00,0x00,0x67,0x90, +0xB0,0x1B,0x22,0x96, +0x30,0x3B,0x28,0x92, +0x31,0x3B,0x29,0x92, +0x8F,0x3E,0x2A,0x92, +0x38,0x3B,0x2B,0x92, +0x67,0x3B,0x2C,0x92, +0x74,0x3B,0x26,0xAE, +0x00,0x80,0x42,0x30, +0xA1,0x3B,0x27,0xA2, +0x21,0x20,0x00,0x00, +0x00,0x00,0x60,0xA0, +0x21,0x28,0x00,0x00, +0x99,0x3B,0x28,0xA2, +0x9A,0x3B,0x29,0xA2, +0x9E,0x3B,0x22,0xA6, +0xA0,0x3B,0x2A,0xA2, +0x30,0x3B,0x2B,0xA2, +0x31,0x3B,0x2C,0xA2, +0xA4,0x3B,0x20,0xAE, +0xA8,0x3B,0x20,0xAE, +0x9C,0x3B,0x20,0xA2, +0x12,0x0D,0x00,0x0C, +0x9B,0x3B,0x20,0xA2, +0x08,0x00,0x66,0x8E, +0x00,0x00,0x00,0x00, +0x33,0x00,0xC0,0x14, +0x0C,0x00,0x70,0x26, +0x00,0x00,0x62,0x8E, +0x21,0x20,0x20,0x02, +0xAC,0x3B,0x23,0x26, +0x70,0x3B,0x22,0xAE, +0x3F,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0x00,0x00,0x60,0xA0, +0xFD,0xFF,0x41,0x04, +0x07,0x00,0x63,0x24, +0xB0,0x1B,0x83,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x62,0x30, +0x09,0x00,0x40,0x10, +0x30,0x1F,0x50,0x26, +0x01,0x00,0x62,0x30, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x82,0x92, +0x0C,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0x2C,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x48,0x00,0x84,0x34, +0x00,0x00,0x83,0x8C, +0x70,0x3B,0x05,0x8E, +0x7B,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x01,0x00,0x02,0x24, +0x00,0x00,0x83,0xAC, +0x19,0x00,0xA2,0x10, +0x3C,0x00,0x02,0x24, +0x98,0x38,0x02,0xAE, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x0F,0x0A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x00,0x02, +0x10,0x52,0x00,0x0C, +0xA8,0x5A,0x84,0x24, +0x02,0x80,0x04,0x3C, +0xC4,0xD7,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x28,0x00,0x02, +0x54,0x0A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x13,0x0F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x3C,0x00,0x02,0x24, +0x79,0x0A,0x00,0x08, +0x98,0x38,0x02,0xAE, +0xCD,0x4E,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x6A,0x0A,0x00,0x08, +0x30,0x1F,0x50,0x26, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x00,0x00,0x02,0x92, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x40,0x00, +0x03,0x00,0x42,0x2C, +0x06,0x00,0x40,0x14, +0xD0,0xD7,0x84,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0x92, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x80,0x02,0x3C, +0xA8,0x5C,0x43,0xAC, +0x18,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xD0,0xFF,0xBD,0x27, +0x18,0x03,0x42,0x34, +0xC8,0x2A,0x63,0x24, +0x24,0x00,0xB3,0xAF, +0x28,0x00,0xBF,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x04,0x3C, +0xF4,0x5E,0x82,0x90, +0x00,0x00,0x00,0x00, +0x12,0x00,0x40,0x10, +0x02,0x80,0x13,0x3C, +0x02,0x80,0x02,0x3C, +0x0D,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x66,0x00,0x60,0x14, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x16,0x5F,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x43,0x8C, +0x74,0x57,0x42,0x24, +0xA7,0x00,0x62,0x10, +0x02,0x80,0x13,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2A,0xB0,0x02,0x3C, +0x36,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x30,0x1F,0x66,0x26, +0x00,0x38,0xC5,0x8C, +0xC0,0x18,0x03,0x00, +0x23,0xB0,0x04,0x3C, +0xF0,0x07,0x63,0x30, +0xFF,0x1F,0x02,0x3C, +0x21,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x62,0x00, +0x23,0x88,0x85,0x00, +0x00,0x04,0x22,0x26, +0x2B,0x28,0x85,0x00, +0xA4,0x37,0xC3,0x8C, +0x0B,0x88,0x45,0x00, +0xE1,0x01,0x22,0x2E, +0xA0,0x37,0xC3,0xAC, +0x04,0x38,0xC4,0xAC, +0xAA,0x37,0xC0,0xA4, +0x14,0x00,0x40,0x14, +0xA9,0x37,0xC0,0xA0, +0x20,0xFE,0x82,0x24, +0x20,0x02,0x83,0x24, +0x0A,0x18,0x45,0x00, +0x23,0x10,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x2B,0x10,0x43,0x00, +0x21,0x28,0x60,0x00, +0x34,0x00,0x40,0x14, +0x00,0x38,0xC3,0xAC, +0x04,0x38,0xC2,0x8C, +0x00,0x00,0x00,0x00, +0x2B,0x18,0x45,0x00, +0x23,0x88,0x45,0x00, +0x03,0x00,0x60,0x10, +0xE1,0x01,0x22,0x2E, +0x00,0x04,0x31,0x26, +0xE1,0x01,0x22,0x2E, +0x0E,0x00,0x40,0x10, +0x30,0x1F,0x70,0x26, +0x30,0x1F,0x70,0x26, +0x04,0x38,0x03,0x8E, +0x00,0x38,0x04,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x83,0x00, +0x2E,0x00,0x40,0x14, +0x2B,0x10,0x64,0x00, +0x5A,0x00,0x40,0x14, +0x25,0xB0,0x02,0x3C, +0x80,0x00,0x03,0x24, +0xD0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x30,0x1F,0x70,0x26, +0x00,0x38,0x03,0x96, +0x2A,0xB0,0x02,0x3C, +0x35,0x00,0x42,0x34, +0xC2,0x88,0x03,0x00, +0x00,0x00,0x51,0xA0, +0x5D,0x27,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xAA,0x37,0x03,0x96, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD0,0x1B,0x02,0x8E, +0x80,0x00,0x03,0x3C, +0x41,0xB0,0x04,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0x82,0xAC, +0x28,0x00,0xBF,0x8F, +0xD0,0x1B,0x02,0xAE, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x00,0xFC,0xA5,0x24, +0xF6,0x0A,0x00,0x08, +0x00,0x38,0xC5,0xAC, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9F,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x0D,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xCF,0x0A,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xA0,0x37,0x05,0x8E, +0x21,0x30,0x80,0x00, +0xFF,0xFF,0x27,0x32, +0x09,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xA0,0x37,0x03,0x8E, +0xAA,0x37,0x05,0x96, +0x00,0x38,0x02,0x8E, +0x21,0x18,0x71,0x00, +0x21,0x28,0x25,0x02, +0x21,0x10,0x51,0x00, +0x09,0x00,0x04,0x24, +0x00,0x38,0x02,0xAE, +0xA0,0x37,0x03,0xAE, +0xB0,0x01,0x00,0x0C, +0xAA,0x37,0x05,0xA6, +0x30,0x1F,0x70,0x26, +0x00,0x38,0x03,0x96, +0x2A,0xB0,0x02,0x3C, +0x35,0x00,0x42,0x34, +0xC2,0x88,0x03,0x00, +0x00,0x00,0x51,0xA0, +0x5D,0x27,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xAA,0x37,0x03,0x96, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD0,0x1B,0x02,0x8E, +0x80,0x00,0x03,0x3C, +0x41,0xB0,0x04,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0x82,0xAC, +0x28,0x00,0xBF,0x8F, +0xD0,0x1B,0x02,0xAE, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x08,0x38,0x02,0x8E, +0xA0,0x37,0x05,0x8E, +0x21,0x30,0x80,0x00, +0x23,0x88,0x44,0x00, +0xFF,0xFF,0x27,0x32, +0x09,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xA0,0x37,0x03,0x8E, +0xAA,0x37,0x02,0x96, +0x04,0x38,0x12,0x96, +0x21,0x18,0x71,0x00, +0x21,0x10,0x22,0x02, +0x23,0x10,0x11,0x3C, +0xA0,0x37,0x03,0xAE, +0xAA,0x37,0x02,0xA6, +0x15,0x00,0x40,0x16, +0x00,0x38,0x11,0xAE, +0x09,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0x30,0x1F,0x70,0x26, +0x46,0x0B,0x00,0x08, +0x00,0x00,0x00,0x00, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x57,0xFF,0x40,0x10, +0x30,0x1F,0x63,0x26, +0x2A,0x1C,0x62,0x90, +0x00,0x00,0x00,0x00, +0x53,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x50,0x39,0x64,0x94, +0x2A,0x1C,0x60,0xA0, +0x00,0xC0,0x84,0x24, +0xC2,0x34,0x00,0x0C, +0xFF,0xFF,0x84,0x30, +0xD3,0x0A,0x00,0x08, +0x00,0x00,0x00,0x00, +0xB0,0x01,0x00,0x0C, +0x09,0x00,0x04,0x24, +0xA0,0x37,0x05,0x8E, +0x09,0x00,0x04,0x24, +0x23,0x10,0x06,0x3C, +0x21,0x38,0x40,0x02, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xA0,0x37,0x03,0x8E, +0xAA,0x37,0x02,0x96, +0x21,0x20,0x51,0x02, +0x21,0x18,0x72,0x00, +0x21,0x10,0x42,0x02, +0x00,0x38,0x04,0xAE, +0x09,0x00,0x04,0x24, +0xA0,0x37,0x03,0xAE, +0x75,0x0B,0x00,0x08, +0xAA,0x37,0x02,0xA6, +0xFF,0x00,0x86,0x30, +0x02,0x80,0x02,0x3C, +0x40,0x00,0xC3,0x2C, +0x4A,0xF3,0x47,0x90, +0x00,0x00,0x63,0x38, +0x3F,0x00,0x02,0x24, +0x0A,0x30,0x43,0x00, +0x01,0x00,0x02,0x24, +0x08,0x0E,0x04,0x24, +0x00,0x7F,0x05,0x24, +0x03,0x00,0xE2,0x10, +0x31,0x00,0xC3,0x2C, +0xA9,0x45,0x00,0x08, +0x00,0x00,0x00,0x00, +0x30,0x00,0x02,0x24, +0xA9,0x45,0x00,0x08, +0x0A,0x30,0x43,0x00, +0xC0,0xFF,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x38,0x00,0xB4,0xAF, +0x34,0x00,0xB3,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x28,0x00,0xB0,0xAF, +0x28,0xEA,0x62,0x24, +0x3C,0x00,0xBF,0xAF, +0x0A,0x00,0x4A,0x94, +0x02,0x00,0x48,0x94, +0x06,0x00,0x49,0x94, +0xFF,0x00,0x84,0x30, +0xFF,0x00,0xA5,0x30, +0x28,0xEA,0x6B,0x94, +0x04,0x00,0x4C,0x94, +0x08,0x00,0x4D,0x94, +0x00,0x1C,0x05,0x00, +0x00,0x14,0x04,0x00, +0x00,0x3E,0x05,0x00, +0x00,0x36,0x04,0x00, +0x25,0x38,0xE3,0x00, +0x25,0x30,0xC2,0x00, +0x00,0x44,0x08,0x00, +0x00,0x12,0x05,0x00, +0x00,0x4C,0x09,0x00, +0x00,0x54,0x0A,0x00, +0x00,0x1A,0x04,0x00, +0x25,0x38,0xE2,0x00, +0x25,0x40,0x0B,0x01, +0x25,0x48,0x2C,0x01, +0x25,0x50,0x4D,0x01, +0x25,0x30,0xC3,0x00, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA8,0xAF, +0x14,0x00,0xA9,0xAF, +0x18,0x00,0xAA,0xAF, +0x25,0x98,0xE5,0x00, +0x25,0x90,0xC4,0x00, +0x30,0x1F,0x54,0x24, +0x21,0x80,0x00,0x00, +0x10,0x00,0xB1,0x27, +0x02,0x00,0x02,0x2E, +0x32,0x00,0x40,0x10, +0x80,0x10,0x10,0x00, +0x21,0x10,0x54,0x00, +0xF0,0x1C,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x40,0x73,0x00, +0x21,0x38,0x00,0x00, +0x7F,0x00,0x09,0x24, +0xC0,0x20,0x07,0x00, +0x04,0x10,0x89,0x00, +0x24,0x10,0x48,0x00, +0x06,0x10,0x82,0x00, +0x01,0x00,0xE5,0x24, +0xFF,0x00,0x43,0x30, +0x21,0x30,0x27,0x02, +0x40,0x00,0x63,0x2C, +0xFF,0x00,0xA7,0x30, +0x02,0x00,0x60,0x14, +0x04,0x00,0xE4,0x2C, +0x3F,0x00,0x02,0x24, +0xF3,0xFF,0x80,0x14, +0x10,0x00,0xC2,0xA0, +0x23,0x00,0xA6,0x93, +0x22,0x00,0xA2,0x93, +0x21,0x00,0xA5,0x93, +0x40,0x18,0x10,0x00, +0x00,0x14,0x02,0x00, +0x21,0x18,0x71,0x00, +0x20,0x00,0xA7,0x93, +0x00,0x36,0x06,0x00, +0x25,0x30,0xC2,0x00, +0x00,0x2A,0x05,0x00, +0x00,0x00,0x64,0x94, +0x25,0x30,0xC5,0x00, +0x7F,0x7F,0x05,0x3C, +0x25,0x30,0xC7,0x00, +0xA9,0x45,0x00,0x0C, +0x7F,0x7F,0xA5,0x34, +0x01,0x00,0x02,0x26, +0xFF,0x00,0x50,0x30, +0x06,0x00,0x03,0x2E, +0xD5,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x21,0x10,0x54,0x00, +0xF0,0x1C,0x43,0x8C, +0xDC,0x0B,0x00,0x08, +0x21,0x40,0x72,0x00, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x09,0x3C, +0x1C,0x00,0xB3,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x30,0x1F,0x27,0x25, +0x02,0x80,0x02,0x3C, +0xB0,0x1B,0xE3,0x94, +0xDE,0x5D,0x46,0x90, +0xFF,0x00,0x90,0x30, +0x00,0x10,0x63,0x30, +0x20,0x00,0xC5,0x30, +0x21,0x20,0x07,0x02, +0x10,0x00,0xC6,0x30, +0x02,0x00,0x60,0x14, +0x3F,0x00,0x13,0x24, +0x63,0x1D,0x93,0x90, +0x28,0x00,0xC0,0x10, +0x30,0x1F,0x22,0x25, +0x8D,0x1D,0x82,0x90, +0x7F,0x1D,0x83,0x90, +0x00,0x00,0x00,0x00, +0x23,0x10,0x43,0x00, +0x00,0x46,0x02,0x00, +0x03,0x46,0x08,0x00, +0xFF,0x00,0x71,0x30, +0x30,0x1F,0x27,0x25, +0x0F,0x00,0x08,0x31, +0x21,0x30,0x00,0x01, +0x21,0x40,0x07,0x02, +0xB7,0x1D,0x02,0x91, +0xB0,0x1B,0xE3,0x84, +0x0F,0x00,0x05,0x3C, +0x0F,0x00,0x42,0x30, +0x21,0x10,0x51,0x00, +0x0C,0x08,0x04,0x24, +0x00,0xFF,0xA5,0x34, +0x06,0x00,0x60,0x04, +0xFF,0x00,0x52,0x30, +0xC5,0x1D,0x02,0x91, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x21,0x10,0x51,0x00, +0xFF,0x00,0x51,0x30, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9A,0x0B,0x00,0x0C, +0x21,0x20,0x60,0x02, +0x21,0x20,0x20,0x02, +0x21,0x28,0x40,0x02, +0x21,0x30,0x00,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xAB,0x0B,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xDF,0xFF,0xA0,0x10, +0x21,0x18,0x02,0x02, +0xA9,0x1D,0x62,0x90, +0x9B,0x1D,0x63,0x90, +0x26,0x0C,0x00,0x08, +0x23,0x10,0x43,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x02,0x3C, +0x18,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0xE9,0x5D,0x43,0x90, +0x01,0x00,0x02,0x24, +0x0D,0x00,0x62,0x10, +0xFF,0x00,0x91,0x30, +0x0D,0x0C,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x30,0x20,0x02, +0x18,0x00,0x04,0x24, +0x5F,0x47,0x00,0x0C, +0xFF,0x03,0x05,0x24, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x0A,0x00,0x04,0x24, +0x25,0x22,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x1A,0x00,0x23,0x12, +0x0B,0x00,0x02,0x24, +0x1D,0x00,0x22,0x12, +0x0F,0x00,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x15,0x00,0x04,0x24, +0xF4,0xF8,0x06,0x34, +0x5F,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x48,0xF3,0x44,0x90, +0xFE,0x00,0x03,0x24, +0xE9,0xFF,0x83,0x14, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x8A,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0xFF,0x00,0x46,0x30, +0x00,0xFF,0x03,0x36, +0x24,0x10,0x43,0x00, +0x01,0x00,0xC6,0x24, +0x25,0x30,0x46,0x00, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0x5B,0x0C,0x00,0x08, +0x21,0x30,0x20,0x02, +0x0F,0x00,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x15,0x00,0x04,0x24, +0x6B,0x0C,0x00,0x08, +0xF4,0xA8,0x06,0x34, +0xFF,0xFF,0xA5,0x34, +0x15,0x00,0x04,0x24, +0x6B,0x0C,0x00,0x08, +0xF5,0xF8,0x06,0x34, +0xFC,0x00,0x84,0x30, +0x50,0x00,0x02,0x24, +0x11,0x00,0x82,0x10, +0x05,0x00,0x03,0x24, +0x51,0x00,0x82,0x28, +0x10,0x00,0x40,0x10, +0xA0,0x00,0x02,0x24, +0x20,0x00,0x02,0x24, +0x0B,0x00,0x82,0x10, +0x02,0x00,0x03,0x24, +0x21,0x00,0x82,0x28, +0x15,0x00,0x40,0x14, +0x30,0x00,0x02,0x24, +0x06,0x00,0x82,0x10, +0x03,0x00,0x03,0x24, +0x04,0x00,0x03,0x24, +0x40,0x00,0x02,0x24, +0x02,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xFD,0xFF,0x82,0x10, +0x08,0x00,0x03,0x24, +0xA1,0x00,0x82,0x28, +0x0C,0x00,0x40,0x10, +0xC0,0x00,0x02,0x24, +0x80,0x00,0x02,0x24, +0xF7,0xFF,0x82,0x10, +0x06,0x00,0x03,0x24, +0x07,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0x90,0x00,0x02,0x24, +0xF2,0xFF,0x80,0x10, +0x21,0x18,0x00,0x00, +0x01,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0x10,0x00,0x02,0x24, +0xED,0xFF,0x82,0x10, +0x0A,0x00,0x03,0x24, +0xC1,0x00,0x82,0x28, +0x04,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x09,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0xB0,0x00,0x02,0x24, +0x0B,0x00,0x03,0x24, +0x99,0x0C,0x00,0x08, +0xD0,0x00,0x02,0x24, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x08,0x00,0x83,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0x90,0x94, +0x02,0x80,0x02,0x3C, +0x21,0x98,0x80,0x00, +0x25,0x80,0x02,0x02, +0x21,0x20,0x00,0x02, +0xFF,0x00,0xB2,0x30, +0xFF,0x00,0xD1,0x30, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x08,0x00,0x06,0x24, +0x08,0x00,0x04,0x8E, +0x04,0x00,0x05,0x8E, +0xFF,0xDF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xFF,0xE0,0x03,0x24, +0x24,0x20,0x82,0x00, +0x00,0x40,0x02,0x3C, +0x10,0x00,0x06,0x8E, +0x24,0x28,0xA3,0x00, +0x25,0x20,0x82,0x00, +0x3F,0xFF,0x02,0x3C, +0x0C,0x00,0x67,0x8E, +0x7F,0xFF,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x00,0x12,0xA5,0x34, +0x01,0x00,0x52,0x32, +0x03,0x00,0x31,0x32, +0x24,0x20,0x83,0x00, +0x24,0x28,0xA2,0x00, +0xC0,0x91,0x12,0x00, +0x80,0x8D,0x11,0x00, +0x00,0x80,0x02,0x3C, +0x25,0x30,0xC2,0x00, +0x25,0x20,0x92,0x00, +0x25,0x28,0xB1,0x00, +0x20,0x00,0x02,0x24, +0x10,0x00,0x06,0xAE, +0x02,0x00,0x02,0xA2, +0x08,0x00,0x04,0xAE, +0x04,0x00,0x05,0xAE, +0x00,0x00,0x07,0xA6, +0x02,0x80,0x02,0x3C, +0xE0,0x3A,0x43,0x94, +0xFB,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC2,0x1B,0x03,0x00, +0x24,0x30,0xC2,0x00, +0x80,0x1C,0x03,0x00, +0x25,0x30,0xC3,0x00, +0x14,0x00,0x05,0x8E, +0x82,0x24,0x06,0x00, +0x01,0x00,0x84,0x30, +0x0C,0x00,0x02,0x24, +0x0A,0x10,0x04,0x00, +0xFF,0x81,0x03,0x24, +0x24,0x28,0xA3,0x00, +0x40,0x12,0x02,0x00, +0x25,0x28,0xA2,0x00, +0x14,0x00,0x05,0xAE, +0x10,0x00,0x06,0xAE, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x42,0x24, +0x04,0x00,0x44,0x8C, +0x00,0x00,0x62,0xAE, +0x04,0x00,0x53,0xAC, +0x00,0x00,0x93,0xAC, +0x04,0x00,0x64,0xAE, +0x00,0x60,0x83,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0xFF,0xFF,0x83,0x30, +0xFF,0x00,0xB1,0x30, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x13,0x3C, +0x30,0x1F,0x70,0x26, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x80,0x42,0x30, +0x2F,0x00,0x43,0x10, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x02,0x34, +0x50,0xDF,0x84,0x24, +0x33,0x00,0x62,0x10, +0x21,0x30,0x20,0x02, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x03,0x02,0x63,0x34, +0x00,0x00,0x62,0x90, +0x00,0x08,0x04,0x24, +0x01,0x00,0x05,0x24, +0x04,0x00,0x42,0x30, +0x00,0x00,0x62,0xA0, +0x1B,0x47,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x58,0x00,0x06,0x24, +0x00,0x0C,0x05,0x24, +0x01,0x00,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x18,0x00,0x04,0x24, +0xB0,0x1B,0x02,0x96, +0x8F,0x3E,0x11,0xA2, +0xFF,0x7F,0x42,0x30, +0xB0,0x1B,0x02,0xA6, +0x30,0x1F,0x62,0x26, +0x30,0x3B,0x44,0x90, +0x0D,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x30,0x3B,0x05,0x92, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x30,0xDF,0x84,0x24, +0x01,0x00,0x02,0x24, +0x2C,0x00,0x22,0x12, +0x00,0x00,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x00,0x00,0x00,0x00, +0xFE,0xFF,0x84,0x24, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x07,0x3C, +0x03,0x02,0xE7,0x34, +0x00,0x00,0xE2,0x90, +0xFB,0xFF,0x03,0x24, +0x00,0x08,0x04,0x24, +0x24,0x10,0x43,0x00, +0x00,0x00,0xE2,0xA0, +0x01,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x03,0x00,0x30,0x32, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x10,0x00,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x42,0x30,0x10,0x00, +0x21,0x30,0x00,0x02, +0x00,0x0D,0x04,0x24, +0x1B,0x47,0x00,0x0C, +0x00,0x0C,0x05,0x24, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0x1B,0x47,0x00,0x0C, +0x18,0x00,0x06,0x24, +0x18,0x00,0x04,0x24, +0x00,0x0C,0x05,0x24, +0x5F,0x47,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x30,0x1F,0x64,0x26, +0xB0,0x1B,0x82,0x94, +0x00,0x80,0x03,0x24, +0x8F,0x3E,0x91,0xA0, +0x25,0x10,0x43,0x00, +0x47,0x0D,0x00,0x08, +0xB0,0x1B,0x82,0xA4, +0x30,0x3B,0x04,0x92, +0x65,0x0D,0x00,0x08, +0x02,0x00,0x84,0x24, +0xC8,0xFF,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x28,0x00,0xB0,0xAF, +0x34,0xEA,0x62,0x24, +0x01,0x00,0x44,0x90, +0x05,0x00,0x45,0x90, +0x09,0x00,0x46,0x90, +0x0D,0x00,0x47,0x90, +0x04,0x00,0x51,0x90, +0x08,0x00,0x50,0x90, +0x34,0xEA,0x72,0x90, +0x02,0x00,0x4F,0x90, +0x0C,0x00,0x43,0x90, +0x06,0x00,0x4E,0x90, +0x0A,0x00,0x4D,0x90, +0x0E,0x00,0x48,0x90, +0x03,0x00,0x49,0x90, +0x07,0x00,0x4A,0x90, +0x0B,0x00,0x4B,0x90, +0x0F,0x00,0x4C,0x90, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x00,0x32,0x06,0x00, +0x00,0x3A,0x07,0x00, +0x02,0x80,0x18,0x3C, +0x25,0x28,0xB1,0x00, +0x25,0x30,0xD0,0x00, +0x25,0x38,0xE3,0x00, +0x25,0x20,0x92,0x00, +0x11,0x00,0x51,0x90, +0x10,0x00,0x50,0x90, +0x30,0x1F,0x03,0x27, +0x00,0x7C,0x0F,0x00, +0x00,0x74,0x0E,0x00, +0x00,0x6C,0x0D,0x00, +0x00,0x44,0x08,0x00, +0x25,0x78,0xE4,0x01, +0x25,0x70,0xC5,0x01, +0x25,0x68,0xA6,0x01, +0x25,0x40,0x07,0x01, +0x5A,0x3E,0x66,0x90, +0x00,0x4E,0x09,0x00, +0x00,0x56,0x0A,0x00, +0x00,0x5E,0x0B,0x00, +0x00,0x66,0x0C,0x00, +0x25,0x48,0x2F,0x01, +0x25,0x50,0x4E,0x01, +0x25,0x58,0x6D,0x01, +0x25,0x60,0x88,0x01, +0x25,0xB0,0x05,0x3C, +0x37,0x02,0xA5,0x34, +0x10,0x00,0xA9,0xAF, +0x14,0x00,0xAA,0xAF, +0x18,0x00,0xAB,0xAF, +0x1C,0x00,0xAC,0xAF, +0x20,0x00,0xB0,0xA3, +0x21,0x00,0xB1,0xA3, +0x03,0x00,0xC7,0x30, +0x00,0x00,0xA4,0x90, +0x02,0x00,0xE2,0x24, +0x01,0x00,0x03,0x24, +0x04,0x18,0x43,0x00, +0x1C,0x00,0xC6,0x30, +0xF8,0xFF,0x02,0x24, +0x24,0x20,0x82,0x00, +0xFF,0x00,0x67,0x30, +0x82,0x30,0x06,0x00, +0x10,0x00,0xE3,0x2C, +0x25,0x20,0x86,0x00, +0x0F,0x00,0x02,0x24, +0x00,0x00,0xA4,0xA0, +0x0A,0x38,0x43,0x00, +0x21,0x28,0x00,0x00, +0x10,0x00,0xA3,0x27, +0x21,0x30,0x65,0x00, +0x00,0x00,0xC2,0x90, +0x01,0x00,0xA5,0x24, +0x2B,0x10,0xE2,0x00, +0x02,0x00,0x40,0x10, +0x11,0x00,0xA4,0x2C, +0x00,0x00,0xC7,0xA0, +0xF8,0xFF,0x80,0x14, +0x21,0x30,0x60,0x00, +0x21,0x28,0x00,0x00, +0x25,0xB0,0x07,0x3C, +0x01,0x00,0xC2,0x90, +0x00,0x00,0xC3,0x90, +0x21,0x20,0xA7,0x00, +0x00,0x11,0x02,0x00, +0x25,0x10,0x43,0x00, +0x01,0x00,0xA5,0x24, +0xFF,0x00,0x42,0x30, +0x08,0x00,0xA3,0x2C, +0xA8,0x01,0x82,0xA0, +0xF6,0xFF,0x60,0x14, +0x02,0x00,0xC6,0x24, +0x21,0x00,0xA2,0x93, +0x20,0x00,0xA4,0x93, +0x02,0x80,0x03,0x3C, +0x00,0x11,0x02,0x00, +0xF1,0x5D,0x65,0x90, +0x25,0x10,0x44,0x00, +0xFF,0x00,0x42,0x30, +0xA7,0x01,0xE3,0x34, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x02,0x24, +0x07,0x00,0xA2,0x10, +0x30,0x1F,0x03,0x27, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x58,0x3E,0x62,0x94, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0xF6,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x79,0x3E,0x63,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x62,0x30, +0xF1,0xFF,0x40,0x10, +0x03,0x00,0x63,0x30, +0x0C,0x00,0x65,0x10, +0x03,0x00,0x02,0x24, +0x05,0x00,0x62,0x10, +0x21,0x20,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xFF,0x0D,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x80,0x04,0x34, +0x12,0x0D,0x00,0x0C, +0x02,0x00,0x05,0x24, +0xFF,0x0D,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x80,0x04,0x34, +0x12,0x0D,0x00,0x0C, +0x01,0x00,0x05,0x24, +0xFF,0x0D,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x06,0x3C, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x88,0x58,0xC2,0x24, +0x01,0x00,0x44,0x90, +0x88,0x58,0xC3,0x90, +0x02,0x00,0x45,0x90, +0x03,0x00,0x46,0x90, +0x05,0x00,0x47,0x90, +0x04,0x00,0x48,0x90, +0x00,0x22,0x04,0x00, +0x25,0x18,0x64,0x00, +0x00,0x2C,0x05,0x00, +0x25,0xB0,0x10,0x3C, +0x25,0x18,0x65,0x00, +0x00,0x36,0x06,0x00, +0x00,0x3A,0x07,0x00, +0x25,0x18,0x66,0x00, +0x58,0x00,0x02,0x36, +0x5C,0x00,0x05,0x36, +0x25,0x40,0x07,0x01, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x43,0xAC, +0x84,0x58,0x84,0x24, +0x00,0x00,0xA8,0xAC, +0x19,0x4F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x94,0x00,0x03,0x36, +0x00,0x00,0x62,0xA4, +0x48,0x00,0x10,0x36, +0x00,0x00,0x02,0x8E, +0x04,0x00,0x03,0x3C, +0x14,0x00,0xBF,0x8F, +0x25,0x10,0x43,0x00, +0x00,0x00,0x02,0xAE, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x21,0x90,0x80,0x00, +0x18,0x02,0x04,0x24, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x84,0x58,0xA5,0x24, +0xDC,0x01,0x06,0x24, +0x18,0x00,0x40,0x10, +0x98,0xDF,0x84,0x24, +0x08,0x00,0x50,0x94, +0xF8,0x01,0x02,0x24, +0x0C,0x00,0x22,0xAE, +0x02,0x80,0x02,0x3C, +0x0A,0x00,0x03,0x24, +0x25,0x80,0x02,0x02, +0x14,0x00,0x23,0xAE, +0x3C,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x10,0x26, +0x18,0x00,0x12,0xAE, +0x21,0x20,0x20,0x02, +0x30,0x09,0x00,0x0C, +0x14,0x00,0x12,0xAE, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xA4,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x05,0x3C, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x5C,0xEA,0xA5,0x24, +0x2F,0x55,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x28,0x00,0x04,0x24, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x28,0x00,0x02, +0x06,0x00,0x06,0x24, +0x15,0x00,0x40,0x10, +0xB4,0xDF,0x84,0x24, +0x08,0x00,0x44,0x94, +0x08,0x00,0x02,0x24, +0x0C,0x00,0x22,0xAE, +0x02,0x80,0x02,0x3C, +0x0C,0x00,0x03,0x24, +0x25,0x20,0x82,0x00, +0x14,0x00,0x23,0xAE, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x84,0x24, +0x30,0x09,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xC0,0xDF,0x84,0x24, +0x21,0x10,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x05,0x3C, +0x2F,0x55,0x00,0x0C, +0x6C,0xEA,0xA5,0x24, +0x92,0x0E,0x00,0x08, +0xFF,0xFF,0x02,0x24, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x21,0x98,0x80,0x00, +0x2C,0x00,0x04,0x24, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x21,0x90,0xA0,0x00, +0x20,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x21,0x88,0x40,0x00, +0xD8,0xDF,0x84,0x24, +0x21,0x30,0x40,0x02, +0x19,0x00,0x40,0x10, +0x84,0xEA,0xA5,0x24, +0x05,0x00,0x65,0x92, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x0B,0x00,0x03,0x24, +0x25,0x80,0x02,0x02, +0x20,0x00,0x10,0x26, +0x0C,0x00,0x02,0x24, +0x21,0x20,0x00,0x02, +0x0C,0x00,0x22,0xAE, +0x14,0x00,0x23,0xAE, +0x21,0x28,0x60,0x02, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x08,0x00,0x12,0xAE, +0x21,0x20,0x20,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x30,0x09,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xCC,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x02,0x80,0x11,0x3C, +0x04,0x00,0x04,0x24, +0x0F,0x00,0x63,0x30, +0x04,0x00,0x63,0x28, +0x36,0x00,0x60,0x14, +0x01,0x00,0x05,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x2C,0xE0,0x22,0x8E, +0x0F,0x00,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x24,0x00,0x04,0x24, +0x12,0x00,0x40,0x14, +0x60,0x00,0x06,0x24, +0x0F,0x00,0x05,0x3C, +0x5F,0x47,0x00,0x0C, +0xFF,0xFF,0xA5,0x34, +0x01,0x00,0x02,0x24, +0x2C,0xE0,0x22,0xAE, +0xD0,0x07,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x70,0x58,0x43,0xAC, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x44,0x90, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x8A,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9C,0x3E,0x04,0x92, +0xFF,0x00,0x43,0x30, +0x00,0x2C,0x03,0x00, +0x0A,0x00,0x64,0x10, +0x9D,0x3E,0x02,0xA2, +0x02,0x80,0x02,0x3C, +0x49,0xF3,0x44,0x90, +0x00,0x00,0x00,0x00, +0x00,0x22,0x04,0x00, +0x6B,0x1E,0x00,0x0C, +0x25,0x20,0xA4,0x00, +0x9D,0x3E,0x03,0x92, +0x00,0x00,0x00,0x00, +0x9C,0x3E,0x03,0xA2, +0x10,0x27,0x02,0x24, +0x40,0x39,0x02,0xAE, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x44,0x90, +0x2C,0xE0,0x20,0xAE, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x64,0x31,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xDB,0x0E,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xB8,0xFF,0xBD,0x27, +0x00,0x01,0x04,0x24, +0x3C,0x00,0xB3,0xAF, +0x38,0x00,0xB2,0xAF, +0x34,0x00,0xB1,0xAF, +0x40,0x00,0xBF,0xAF, +0x30,0x00,0xB0,0xAF, +0x25,0x24,0x00,0x0C, +0x02,0x80,0x13,0x3C, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0xF0,0xDD,0x65,0x26, +0x06,0x00,0x06,0x24, +0x0C,0x00,0x52,0x24, +0x4C,0x00,0x40,0x10, +0x30,0xE0,0x84,0x24, +0x08,0x00,0x50,0x94, +0x02,0x80,0x02,0x3C, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x00,0xA6, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x30,0x00,0x04,0x26, +0xF0,0xDD,0x65,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x04,0x3C, +0x03,0xFF,0x63,0x30, +0x40,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0x84,0x24, +0x0C,0x00,0x22,0xAE, +0xF8,0x1D,0x82,0x94, +0x20,0x00,0x06,0x26, +0x02,0x80,0x07,0x3C, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x2A,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x82,0xA4, +0x16,0x00,0xC3,0xA0, +0x17,0x00,0xC5,0xA0, +0x74,0x3B,0x86,0x8C, +0xA8,0x5A,0xE7,0x24, +0x38,0x00,0x04,0x26, +0x21,0x28,0x00,0x00, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB2,0xAF, +0x18,0x00,0xA4,0x27, +0x28,0x00,0xA5,0x27, +0x21,0x50,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x28,0x00,0xA3,0x8F, +0x21,0x20,0x00,0x02, +0x18,0x00,0xA7,0x27, +0x09,0x00,0x62,0x28, +0x01,0x00,0x05,0x24, +0x12,0x00,0x40,0x10, +0x08,0x00,0x06,0x24, +0x21,0x20,0x00,0x02, +0x21,0x30,0x60,0x00, +0x01,0x00,0x05,0x24, +0x18,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB2,0xAF, +0x21,0x20,0x20,0x02, +0x01,0x00,0x05,0x24, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB2,0xAF, +0x28,0x00,0xA6,0x8F, +0x21,0x20,0x40,0x00, +0x32,0x00,0x05,0x24, +0xF8,0xFF,0xC6,0x24, +0x59,0x0F,0x00,0x08, +0x20,0x00,0xA7,0x27, +0x02,0x80,0x05,0x3C, +0x2F,0x55,0x00,0x0C, +0x9C,0xEA,0xA5,0x24, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x21,0x80,0x80,0x00, +0x45,0x00,0xA0,0x14, +0x21,0x90,0x00,0x00, +0x08,0x00,0x82,0x90, +0x02,0x80,0x13,0x3C, +0x30,0x1F,0x63,0x26, +0x0F,0x00,0x42,0x30, +0x14,0x3E,0x62,0xAC, +0x25,0xB0,0x02,0x3C, +0x0A,0x00,0x10,0x26, +0xD0,0x01,0x57,0x34, +0x02,0x80,0x14,0x3C, +0xD8,0x01,0x5E,0x34, +0xDC,0x01,0x55,0x34, +0xD4,0x01,0x56,0x34, +0x03,0x00,0x11,0x24, +0x00,0x00,0x06,0x92, +0x30,0x1F,0x62,0x26, +0x0C,0x3E,0x47,0x90, +0x0F,0x00,0xC3,0x30, +0x01,0x00,0x05,0x92, +0x18,0x00,0x67,0x00, +0x03,0x00,0x04,0x92, +0x02,0x00,0x02,0x92, +0x0F,0x00,0xA7,0x30, +0x00,0x3A,0x07,0x00, +0x02,0x29,0x05,0x00, +0x00,0x22,0x04,0x00, +0x25,0x20,0x82,0x00, +0x00,0x2B,0x05,0x00, +0x42,0x11,0x06,0x00, +0x00,0x24,0x04,0x00, +0x03,0x00,0x49,0x30, +0x02,0x31,0x06,0x00, +0x01,0x00,0x02,0x24, +0x01,0x00,0xC6,0x30, +0x12,0x18,0x00,0x00, +0x0A,0x00,0x63,0x24, +0xFF,0x00,0x63,0x30, +0x25,0x18,0x67,0x00, +0x25,0x18,0x65,0x00, +0x30,0x00,0x22,0x11, +0x25,0x38,0x64,0x00, +0x02,0x00,0x22,0x29, +0x3E,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x38,0x00,0x22,0x11, +0x03,0x00,0x02,0x24, +0x40,0x00,0x22,0x11, +0x00,0x00,0x00,0x00, +0x21,0x28,0x20,0x01, +0x3C,0xE0,0x84,0x26, +0x2F,0x55,0x00,0x0C, +0xFF,0xFF,0x31,0x26, +0xD9,0xFF,0x21,0x06, +0x04,0x00,0x10,0x26, +0x25,0xB0,0x02,0x3C, +0xE7,0x01,0x42,0x34, +0x00,0x00,0x52,0xA0, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x13,0x3C, +0x08,0x00,0x83,0x90, +0x30,0x1F,0x62,0x26, +0x14,0x3E,0x44,0x8C, +0x0F,0x00,0x63,0x30, +0xBB,0xFF,0x83,0x14, +0x00,0x00,0x00,0x00, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x00,0x00,0xA7,0xAE, +0x21,0x20,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x07,0x10,0x92,0x00, +0x01,0x00,0x42,0x30, +0x01,0x00,0x84,0x24, +0x02,0x00,0x40,0x10, +0x03,0x00,0x85,0x2C, +0xD0,0x01,0x07,0xAD, +0xF9,0xFF,0xA0,0x14, +0x04,0x00,0x08,0x25, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0x0D,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0xB5,0x0F,0x00,0x08, +0x02,0x00,0x52,0x36, +0xC7,0xFF,0x20,0x15, +0x21,0x28,0x20,0x01, +0x0D,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0xB6,0x0F,0x00,0x08, +0x04,0x00,0x52,0x36, +0x06,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0xB5,0x0F,0x00,0x08, +0x01,0x00,0x52,0x36, +0x00,0x00,0xC7,0xAE, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0x00,0x00,0xE7,0xAE, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0x00,0x00,0xC7,0xAF, +0xB6,0x0F,0x00,0x08, +0x21,0x28,0x20,0x01, +0xC8,0xFF,0xBD,0x27, +0x1C,0x00,0xB1,0xAF, +0x02,0x80,0x02,0x3C, +0x21,0x88,0x80,0x00, +0x00,0x01,0x04,0x24, +0x30,0x00,0xB6,0xAF, +0x24,0x00,0xB3,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x25,0x24,0x00,0x0C, +0x84,0x58,0x56,0x24, +0x74,0x00,0x40,0x10, +0x21,0x98,0x40,0x00, +0x08,0x00,0x50,0x94, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x20,0x02, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x06,0x00,0x06,0x24, +0x30,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x88,0x58,0xA5,0x24, +0x20,0x00,0x03,0x96, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0x03,0xFF,0x63,0x30, +0x50,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0xF8,0x1D,0x82,0x94, +0x20,0x00,0x12,0x26, +0x74,0x00,0xD1,0x26, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x82,0xA4, +0x02,0x2A,0x03,0x00, +0x20,0x00,0x02,0x24, +0x16,0x00,0x43,0xA2, +0x17,0x00,0x45,0xA2, +0x21,0x20,0x20,0x02, +0x17,0x4F,0x00,0x0C, +0x0C,0x00,0x62,0xAE, +0x40,0x00,0x12,0x26, +0x21,0x20,0x40,0x02, +0x21,0x28,0x40,0x00, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x0C,0x00,0x63,0x8E, +0x21,0x20,0x20,0x02, +0x42,0x00,0x12,0x26, +0x02,0x00,0x63,0x24, +0x32,0x4F,0x00,0x0C, +0x0C,0x00,0x63,0xAE, +0x21,0x28,0x40,0x00, +0x21,0x20,0x40,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x0C,0x00,0x63,0x8E, +0x44,0x00,0x04,0x26, +0x0C,0x00,0x75,0x26, +0x02,0x00,0x63,0x24, +0x0C,0x00,0x63,0xAE, +0x0C,0x00,0xC6,0x8E, +0x21,0x28,0x00,0x00, +0x10,0x00,0xC7,0x26, +0x60,0x00,0xD0,0x26, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x21,0x20,0x00,0x02, +0x37,0x50,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x09,0x00,0x51,0x2C, +0x08,0x00,0x06,0x24, +0x21,0x20,0x40,0x02, +0x0B,0x30,0x51,0x00, +0x21,0x38,0x00,0x02, +0x01,0x00,0x05,0x24, +0x21,0xA0,0x40,0x00, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x21,0x20,0x40,0x00, +0x03,0x00,0x05,0x24, +0x01,0x00,0x06,0x24, +0x48,0x00,0xC7,0x26, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x0D,0x00,0x20,0x12, +0x21,0x20,0x60,0x02, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0x21,0x30,0x00,0x00, +0xB9,0x0C,0x00,0x08, +0x38,0x00,0xBD,0x27, +0xF8,0xFF,0x86,0x26, +0x21,0x20,0x40,0x00, +0x68,0x00,0xC7,0x26, +0x32,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB5,0xAF, +0x21,0x20,0x60,0x02, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0x21,0x30,0x00,0x00, +0xB9,0x0C,0x00,0x08, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x98,0xE0,0x84,0x24, +0xAC,0xEA,0xA5,0x24, +0x2F,0x55,0x00,0x08, +0x38,0x00,0xBD,0x27, +0xB0,0xFF,0xBD,0x27, +0x50,0x00,0xA4,0xAF, +0xFC,0x01,0x04,0x24, +0x4C,0x00,0xBF,0xAF, +0x48,0x00,0xBE,0xAF, +0x44,0x00,0xB7,0xAF, +0x40,0x00,0xB6,0xAF, +0x3C,0x00,0xB5,0xAF, +0x38,0x00,0xB4,0xAF, +0x34,0x00,0xB3,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x25,0x24,0x00,0x0C, +0x28,0x00,0xB0,0xAF, +0xE3,0x00,0x40,0x10, +0x1C,0x00,0xA2,0xAF, +0x50,0x00,0xA6,0x8F, +0x02,0x80,0x03,0x3C, +0xD0,0xEA,0x62,0x24, +0xD0,0xEA,0x68,0x90, +0x01,0x00,0x44,0x90, +0x02,0x00,0xC3,0x90, +0x02,0x00,0x45,0x90, +0x03,0x00,0x46,0x90, +0x1C,0x00,0xA2,0x8F, +0x00,0x22,0x04,0x00, +0x25,0x20,0x88,0x00, +0x08,0x00,0x47,0x94, +0x50,0x00,0xA2,0x8F, +0x00,0x2C,0x05,0x00, +0x0F,0x00,0x63,0x30, +0x00,0x00,0x48,0x8C, +0x02,0x80,0x02,0x3C, +0x25,0x38,0xE2,0x00, +0x50,0x00,0xA2,0x8F, +0x25,0x28,0xA4,0x00, +0x00,0x36,0x06,0x00, +0xC0,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x25,0x30,0xC5,0x00, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA6,0xAF, +0xDD,0x5A,0x55,0x24, +0x22,0x00,0x66,0x24, +0x18,0x00,0x62,0x24, +0x28,0x00,0x76,0x24, +0x02,0x80,0x03,0x3C, +0x20,0x00,0xF7,0x24, +0xFF,0x3F,0x1E,0x31, +0x21,0x90,0x00,0x00, +0x30,0x1F,0x73,0x24, +0x01,0x00,0x14,0x24, +0x21,0x80,0x00,0x00, +0x24,0x00,0xA6,0xAF, +0xD0,0x10,0x00,0x08, +0x20,0x00,0xA2,0xAF, +0x39,0x52,0x00,0x0C, +0x07,0x00,0x10,0x26, +0x19,0x00,0x40,0x10, +0x40,0x00,0x43,0x2A, +0x0E,0x00,0x60,0x10, +0xE8,0xFF,0xC2,0x27, +0x21,0x88,0x13,0x02, +0xAC,0x3B,0x22,0x92, +0x01,0x00,0x52,0x26, +0x21,0x20,0x15,0x02, +0x21,0x28,0xC0,0x02, +0xF4,0xFF,0x54,0x10, +0x06,0x00,0x06,0x24, +0x21,0x20,0x15,0x02, +0x21,0x28,0xC0,0x02, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xAC,0x3B,0x34,0xA2, +0xE8,0xFF,0xC2,0x27, +0x69,0x01,0x43,0x28, +0x16,0x00,0x60,0x14, +0x18,0x00,0xA2,0xAF, +0x02,0x80,0x06,0x3C, +0x30,0x1F,0xC3,0x24, +0xA8,0x3B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xA8,0x3B,0x62,0xAC, +0x1C,0x00,0xA4,0x8F, +0x3D,0x24,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4C,0x00,0xBF,0x8F, +0x48,0x00,0xBE,0x8F, +0x44,0x00,0xB7,0x8F, +0x40,0x00,0xB6,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x50,0x00,0xBD,0x27, +0x21,0x20,0xE0,0x02, +0x21,0x28,0x00,0x00, +0xFF,0x51,0x00,0x0C, +0xDC,0x01,0x06,0x24, +0x20,0x00,0xA2,0x8F, +0x74,0x00,0xF4,0x26, +0x21,0x20,0x80,0x02, +0x18,0x00,0x45,0x24, +0x18,0x00,0xA2,0x8F, +0x80,0x00,0xF1,0x26, +0x74,0x00,0x42,0x24, +0x00,0x00,0xE2,0xAE, +0x18,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x30,0x60,0x00, +0x10,0x52,0x00,0x0C, +0x70,0x00,0xE3,0xAE, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x21,0x28,0x00,0x00, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0xD9,0xFF,0x40,0x10, +0x21,0x80,0x40,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0x74,0x3B,0x46,0x8C, +0x00,0x00,0x00,0x00, +0x0A,0x00,0xC0,0x18, +0x00,0x00,0x00,0x00, +0x18,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0xCF,0xFF,0xC2,0x14, +0x02,0x80,0x04,0x3C, +0xA8,0x5A,0x84,0x24, +0x39,0x52,0x00,0x0C, +0x02,0x00,0x05,0x26, +0xCA,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x06,0x92, +0x00,0x00,0x00,0x00, +0x77,0x00,0xC0,0x14, +0x10,0x00,0xE4,0x26, +0x0C,0x00,0xE0,0xAE, +0x50,0x00,0xA6,0x8F, +0x00,0x00,0x00,0x00, +0x02,0x00,0xC2,0x94, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x68,0x00,0x40,0x10, +0x21,0x20,0xC0,0x00, +0x34,0x00,0xE0,0xAE, +0x60,0x00,0xF3,0x26, +0x21,0x20,0x60,0x02, +0x21,0x28,0x00,0x00, +0xFF,0x51,0x00,0x0C, +0x10,0x00,0x06,0x24, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x01,0x00,0x05,0x24, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0x06,0x00,0x40,0x10, +0x21,0x90,0x00,0x00, +0x18,0x00,0xA6,0x8F, +0x02,0x00,0x45,0x24, +0x10,0x52,0x00,0x0C, +0x21,0x20,0x60,0x02, +0x18,0x00,0xB2,0x8F, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x32,0x00,0x05,0x24, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0x05,0x00,0x40,0x10, +0x21,0x20,0xF2,0x02, +0x18,0x00,0xA6,0x8F, +0x60,0x00,0x84,0x24, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x18,0x00,0xA5,0x8F, +0x21,0x20,0x60,0x02, +0x7D,0x50,0x00,0x0C, +0x21,0x28,0xB2,0x00, +0x21,0x18,0x40,0x00, +0x01,0x00,0x02,0x24, +0x3F,0x00,0x62,0x10, +0x03,0x00,0x02,0x24, +0x38,0x00,0xE2,0xAE, +0x70,0x00,0xE7,0x8E, +0x21,0x20,0x20,0x02, +0x03,0x00,0x05,0x24, +0xF4,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x18,0x00,0xA6,0x27, +0x48,0x00,0xE0,0xAE, +0x04,0x00,0x40,0x10, +0x3C,0x00,0xE0,0xAE, +0x02,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0x48,0x00,0xE2,0xAE, +0x17,0x4F,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x21,0x28,0x40,0x00, +0x40,0x00,0xE4,0x26, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x34,0x4F,0x00,0x0C, +0x21,0x20,0xE0,0x02, +0xFF,0xFF,0x50,0x30, +0x01,0x00,0x02,0x32, +0x22,0x00,0x40,0x10, +0x21,0x28,0xC0,0x02, +0x01,0x00,0x02,0x24, +0x5C,0x00,0xE2,0xAE, +0x24,0x00,0xA5,0x8F, +0x04,0x00,0xE4,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x10,0x00,0x02,0x32, +0x1B,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0x30,0x00,0xE2,0xAE, +0x02,0x80,0x02,0x3C, +0x44,0x00,0xE0,0xAE, +0x30,0x1F,0x44,0x24, +0xA4,0x3B,0x82,0x8C, +0x1C,0x00,0xA6,0x8F, +0xDC,0x01,0x03,0x24, +0x01,0x00,0x42,0x24, +0xA4,0x3B,0x82,0xAC, +0x08,0x00,0x02,0x24, +0x0C,0x00,0xC3,0xAC, +0x14,0x00,0xC2,0xAC, +0x1C,0x00,0xA4,0x8F, +0x30,0x09,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE9,0x10,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xA4,0xE0,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xBC,0xEA,0xA5,0x24, +0xE9,0x10,0x00,0x08, +0x00,0x00,0x00,0x00, +0x6D,0x11,0x00,0x08, +0x5C,0x00,0xE0,0xAE, +0x74,0x11,0x00,0x08, +0x30,0x00,0xE0,0xAE, +0x52,0x11,0x00,0x08, +0x38,0x00,0xE3,0xAE, +0xF7,0x19,0x00,0x0C, +0x18,0x00,0xC5,0x24, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x2B,0x11,0x00,0x08, +0x34,0x00,0xE2,0xAE, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x05,0x26, +0x01,0x00,0x03,0x92, +0x22,0x11,0x00,0x08, +0x0C,0x00,0xE3,0xAE, +0x02,0x80,0x04,0x3C, +0x84,0x58,0x84,0x24, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x17,0x4F,0x00,0x0C, +0x74,0x00,0x84,0x24, +0x21,0x28,0x40,0x00, +0x10,0x00,0xA4,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA2,0x97, +0x25,0xB0,0x04,0x3C, +0x94,0x00,0x85,0x34, +0x9A,0x00,0x87,0x34, +0x26,0xB0,0x06,0x3C, +0x00,0x08,0x03,0x24, +0x00,0x00,0xA2,0xA4, +0x0A,0x00,0x0B,0x24, +0x00,0x00,0xE3,0xA4, +0x98,0x00,0x88,0x34, +0x96,0x00,0x89,0x34, +0x7A,0x00,0xCA,0x34, +0x50,0x00,0x02,0x24, +0x04,0x00,0x03,0x24, +0x00,0x00,0x02,0xA5, +0x00,0x00,0x2B,0xA5, +0x00,0x00,0x43,0xA1, +0x10,0x00,0xA2,0x97, +0x89,0x00,0x83,0x34, +0x14,0x00,0x07,0x24, +0x40,0x11,0x02,0x00, +0xA0,0xFF,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0x9C,0x00,0x85,0x34, +0x7C,0x00,0xC6,0x34, +0x00,0x00,0xC2,0xA4, +0x44,0x00,0x84,0x34, +0x00,0x00,0x67,0xA0, +0x00,0x00,0xAB,0xA0, +0x00,0x00,0x82,0x94, +0xFF,0xFD,0x03,0x24, +0x18,0x00,0xBF,0x8F, +0x24,0x10,0x43,0x00, +0x00,0x00,0x82,0xA4, +0x00,0x00,0x83,0x94, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x00,0x02,0x63,0x34, +0x20,0x00,0xBD,0x27, +0x8E,0x3E,0x40,0xA0, +0x00,0x00,0x83,0xA4, +0x08,0x00,0xE0,0x03, +0x0C,0x3E,0x47,0xA0, +0xD8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x10,0x3C, +0x84,0x58,0x04,0x26, +0x24,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x34,0x4F,0x00,0x0C, +0x18,0x00,0xB2,0xAF, +0xFF,0xFF,0x51,0x30, +0x84,0x58,0x04,0x26, +0x19,0x4F,0x00,0x0C, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x03,0x26, +0x01,0x00,0x24,0x32, +0x08,0x3E,0x62,0xA4, +0x03,0x00,0x80,0x14, +0x02,0x00,0x05,0x24, +0x40,0x10,0x11,0x00, +0x04,0x00,0x45,0x30, +0x02,0x00,0x02,0x24, +0x59,0x00,0xA2,0x10, +0x30,0x1F,0x02,0x26, +0x0F,0x00,0x80,0x10, +0x02,0x00,0x03,0x24, +0x04,0x00,0x02,0x24, +0x11,0x00,0x62,0x10, +0x30,0x1F,0x13,0x26, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x20,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x18,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x40,0x10,0x11,0x00, +0x04,0x00,0x43,0x30, +0x04,0x00,0x02,0x24, +0xF1,0xFF,0x62,0x14, +0x30,0x1F,0x13,0x26, +0x08,0x3E,0x66,0x96, +0x30,0x3B,0x65,0x92, +0x02,0x80,0x04,0x3C, +0xB0,0x1B,0x63,0xA6, +0xD4,0xE0,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x25,0xB0,0x10,0x3C, +0x50,0x02,0x03,0x36, +0x0F,0x00,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x21,0x28,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x30,0x3B,0x64,0x92, +0x01,0x00,0x14,0x24, +0x4F,0x0C,0x00,0x0C, +0x4C,0x00,0x10,0x36, +0x02,0x80,0x11,0x3C, +0x00,0x00,0x14,0xA2, +0x21,0x0E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x37,0x50,0x00,0x0C, +0xE4,0x58,0x24,0x26, +0x21,0x28,0x40,0x00, +0xE4,0x58,0x24,0x26, +0x7D,0x50,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x0F,0x00,0x50,0x30, +0xE4,0x58,0x24,0x26, +0x96,0x50,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x40,0x02,0x10,0x36, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x30,0x40,0x00, +0x21,0x28,0x00,0x02, +0x2F,0x55,0x00,0x0C, +0x04,0xE1,0x84,0x24, +0x21,0x20,0x00,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xF3,0x3D,0x84,0x24, +0x88,0x58,0xA5,0x24, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0xC2,0x1E,0x74,0xA2, +0x0F,0x48,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9C,0x11,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x62,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x34, +0x53,0x1E,0x00,0x0C, +0xB0,0x1B,0x62,0xA6, +0xEC,0x38,0x62,0xAE, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x04,0x24, +0x48,0x0E,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x78,0x3D,0x44,0x8C, +0x01,0x20,0x03,0x24, +0xB0,0x1B,0x43,0xA4, +0x02,0x00,0x85,0x10, +0x0C,0x00,0x03,0x24, +0x0F,0x00,0x03,0x24, +0x25,0xB0,0x02,0x3C, +0x50,0x02,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x30,0x1F,0x10,0x26, +0xB0,0x1B,0x02,0x96, +0x08,0x3E,0x06,0x96, +0x30,0x3B,0x05,0x92, +0x10,0x00,0x42,0x34, +0x02,0x80,0x04,0x3C, +0xB0,0x1B,0x02,0xA6, +0x2F,0x55,0x00,0x0C, +0xB0,0xE0,0x84,0x24, +0x21,0x28,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x30,0x3B,0x04,0x92, +0x4F,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x53,0x1E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEC,0x38,0x02,0xAE, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x65,0x24, +0x50,0x3E,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x0A,0x3E,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x2C, +0x1A,0x00,0x40,0x10, +0x21,0x38,0xA0,0x00, +0x98,0x3E,0xA4,0x8C, +0x94,0x3E,0xA5,0x8C, +0x21,0x30,0x00,0x00, +0x80,0x10,0x04,0x00, +0x80,0x18,0x05,0x00, +0x2B,0x10,0x45,0x00, +0x04,0x00,0x40,0x14, +0x2B,0x18,0x64,0x00, +0x01,0x00,0x06,0x24, +0x02,0x00,0x02,0x24, +0x0A,0x30,0x43,0x00, +0x0A,0x3E,0xE2,0x90, +0x94,0x3E,0xE0,0xAC, +0x98,0x3E,0xE0,0xAC, +0x40,0x18,0x02,0x00, +0x21,0x18,0x62,0x00, +0x21,0x18,0x66,0x00, +0x02,0x80,0x02,0x3C, +0x48,0xDD,0x42,0x24, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0x64,0x8C, +0x25,0xB0,0x02,0x3C, +0xD8,0x01,0x42,0x34, +0x00,0x00,0x44,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x00,0x84,0x90, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x0F,0x00,0x84,0x30, +0xC0,0x20,0x04,0x00, +0x21,0x20,0x90,0x00, +0x1C,0x00,0x84,0x24, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x06,0x00,0x40,0x10, +0x21,0x20,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x92,0x10,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x80,0xFF,0xBD,0x27, +0x02,0x80,0x06,0x3C, +0x02,0x80,0x08,0x3C, +0x78,0x00,0xBE,0xAF, +0x7C,0x00,0xBF,0xAF, +0x74,0x00,0xB7,0xAF, +0x70,0x00,0xB6,0xAF, +0x6C,0x00,0xB5,0xAF, +0x68,0x00,0xB4,0xAF, +0x64,0x00,0xB3,0xAF, +0x60,0x00,0xB2,0xAF, +0x5C,0x00,0xB1,0xAF, +0x58,0x00,0xB0,0xAF, +0xD0,0xEA,0xC2,0x24, +0xE4,0xEA,0x03,0x25, +0x01,0x00,0x44,0x90, +0x01,0x00,0x65,0x90, +0xD0,0xEA,0xCB,0x90, +0xE4,0xEA,0x0A,0x91, +0x02,0x00,0x47,0x90, +0x02,0x00,0x66,0x90, +0x03,0x00,0x48,0x90, +0x03,0x00,0x69,0x90, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x25,0x20,0x8B,0x00, +0x25,0x28,0xAA,0x00, +0x00,0x3C,0x07,0x00, +0x00,0x34,0x06,0x00, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x00,0x46,0x08,0x00, +0x00,0x4E,0x09,0x00, +0x25,0x40,0x07,0x01, +0x25,0x48,0x26,0x01, +0x00,0x02,0x04,0x24, +0x40,0x00,0xA8,0xAF, +0x25,0x24,0x00,0x0C, +0x48,0x00,0xA9,0xAF, +0xB0,0x01,0x40,0x10, +0x21,0xF0,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x52,0x24, +0xC4,0x39,0x45,0x8E, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x34,0xE1,0x84,0x24, +0x08,0x00,0xD1,0x97, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x10,0x3C, +0x25,0x88,0x22,0x02, +0x88,0x58,0x10,0x26, +0x24,0x00,0x24,0x26, +0x21,0x28,0x00,0x02, +0x20,0x00,0x20,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x24,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x21,0x28,0x00,0x02, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x30,0x00,0x24,0x26, +0x18,0x00,0x03,0x24, +0x0C,0x00,0xC3,0xAF, +0xF8,0x1D,0x42,0x96, +0x20,0x00,0x25,0x26, +0x38,0x00,0x37,0x26, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x22,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x42,0xA6, +0x17,0x00,0xA4,0xA0, +0x02,0x80,0x04,0x3C, +0x16,0x00,0xA3,0xA0, +0x32,0x4F,0x00,0x0C, +0xF8,0x58,0x84,0x24, +0x21,0x28,0x40,0x00, +0x21,0x20,0xE0,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x3A,0x00,0x24,0x26, +0x18,0x00,0xA5,0x27, +0x02,0x00,0x06,0x24, +0x03,0x00,0x02,0x24, +0x10,0x52,0x00,0x0C, +0x18,0x00,0xA2,0xA7, +0x0C,0x00,0xC3,0x8F, +0x02,0x80,0x07,0x3C, +0x3C,0x00,0x24,0x26, +0x04,0x00,0x63,0x24, +0x0C,0x00,0xC3,0xAF, +0x60,0x39,0x46,0x8E, +0x0C,0x00,0xC2,0x27, +0x94,0x58,0xE7,0x24, +0x21,0x28,0x00,0x00, +0x54,0x00,0xA2,0xAF, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x20,0x00,0xA4,0x27, +0x50,0x00,0xA5,0x27, +0x21,0x50,0x00,0x0C, +0x21,0xB8,0x40,0x00, +0x50,0x00,0xA8,0x8F, +0x21,0x88,0x00,0x00, +0x52,0x00,0x00,0x11, +0x21,0x80,0x00,0x00, +0x21,0x38,0x40,0x02, +0x18,0x00,0xA9,0x27, +0x21,0x10,0x31,0x01, +0x08,0x00,0x46,0x90, +0x21,0x20,0x00,0x00, +0x7F,0x00,0xC5,0x30, +0x21,0x10,0x87,0x00, +0xB4,0x39,0x43,0x90, +0x01,0x00,0x84,0x24, +0x7F,0x00,0x63,0x30, +0x3D,0x00,0xA3,0x10, +0x0D,0x00,0x82,0x2C, +0xFA,0xFF,0x40,0x14, +0x21,0x10,0x87,0x00, +0x01,0x00,0x31,0x26, +0x2B,0x10,0x28,0x02, +0xF2,0xFF,0x40,0x14, +0x21,0x10,0x31,0x01, +0x09,0x00,0x02,0x2E, +0x3D,0x00,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x54,0x00,0xA2,0x8F, +0x01,0x00,0x05,0x24, +0x08,0x00,0x06,0x24, +0x30,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0x20,0x40,0x00, +0x54,0x00,0xA2,0x8F, +0xF8,0xFF,0x06,0x26, +0x32,0x00,0x05,0x24, +0x38,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x78,0x3D,0x83,0x8C, +0x02,0x00,0x02,0x24, +0x37,0x00,0x62,0x14, +0x00,0x00,0x00,0x00, +0xC4,0x39,0x83,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x23,0x02, +0x32,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x46,0x24, +0x21,0x20,0x60,0x00, +0x4D,0x13,0x00,0x08, +0x30,0x00,0x05,0x24, +0x01,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x24,0x02, +0x27,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x18,0x26,0x02, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x45,0x14, +0x02,0x80,0x07,0x3C, +0x01,0x00,0x66,0x90, +0x54,0x00,0xA2,0x8F, +0xFA,0x58,0xE7,0x24, +0x21,0x20,0xE0,0x02, +0x21,0x38,0x27,0x02, +0x30,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x73,0x13,0x00,0x08, +0x21,0xB8,0x40,0x00, +0x21,0x10,0x30,0x01, +0x18,0x00,0x46,0xA0, +0x50,0x00,0xA8,0x8F, +0x01,0x00,0x31,0x26, +0x2B,0x10,0x28,0x02, +0xB4,0xFF,0x40,0x14, +0x01,0x00,0x10,0x26, +0x27,0x13,0x00,0x08, +0x09,0x00,0x02,0x2E, +0x54,0x00,0xA2,0x8F, +0x21,0x20,0xE0,0x02, +0x21,0x30,0x00,0x02, +0x01,0x00,0x05,0x24, +0x30,0x00,0xA7,0x27, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x78,0x3D,0x83,0x8C, +0x02,0x00,0x02,0x24, +0xCB,0xFF,0x62,0x10, +0x00,0x00,0x00,0x00, +0xD5,0x1D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x16,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0xC4,0x39,0x62,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x22,0x02, +0x10,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x52,0x24, +0x21,0x80,0x60,0x00, +0x02,0x80,0x13,0x3C, +0x21,0x20,0x32,0x02, +0x00,0x00,0x83,0x90, +0x2D,0x00,0x02,0x24, +0xCB,0x00,0x62,0x10, +0x02,0x80,0x05,0x3C, +0x01,0x00,0x82,0x90, +0xC4,0x39,0x03,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0xF6,0xFF,0x60,0x14, +0x21,0x20,0x32,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x78,0x3D,0x83,0x8C, +0x02,0x00,0x02,0x24, +0x82,0x00,0x62,0x10, +0x0C,0x00,0x11,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0xC4,0x39,0x62,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x22,0x02, +0x26,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x56,0x24, +0x21,0xA8,0x60,0x00, +0xDD,0x00,0x14,0x24, +0xA5,0x13,0x00,0x08, +0x02,0x80,0x13,0x3C, +0x01,0x00,0x02,0x92, +0xC4,0x39,0xA3,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0x1B,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x36,0x02, +0x00,0x00,0x02,0x92, +0x02,0x00,0x12,0x26, +0x21,0x20,0x40,0x02, +0xD0,0xDD,0x65,0x26, +0xF3,0xFF,0x54,0x14, +0x06,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x54,0x00,0xA2,0x8F, +0xDD,0x00,0x05,0x24, +0x21,0x38,0x40,0x02, +0x07,0x00,0x06,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x08,0x00,0x04,0x92, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x45,0x24, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x0F,0x5F,0x44,0xA0, +0x10,0x3E,0xA3,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0xC4,0x39,0x82,0x8C, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x22,0x02, +0x20,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x58,0x56,0x24, +0xFA,0x58,0x75,0x24, +0x21,0xA0,0x80,0x00, +0xD2,0x13,0x00,0x08, +0xDD,0x00,0x13,0x24, +0x01,0x00,0x02,0x92, +0xC4,0x39,0x83,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0x14,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x36,0x02, +0x00,0x00,0x02,0x92, +0x21,0x90,0x35,0x02, +0x21,0x20,0x40,0x02, +0x48,0x00,0xA5,0x27, +0xF3,0xFF,0x53,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x01,0x00,0x06,0x92, +0x54,0x00,0xA2,0x8F, +0x21,0x38,0x40,0x02, +0xDD,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x0A,0x3E,0x02,0x92, +0x50,0x3E,0x03,0x8E, +0x05,0x00,0x42,0x38, +0x01,0x00,0x63,0x38, +0x01,0x00,0x42,0x2C, +0x01,0x00,0x63,0x2C, +0x24,0x10,0x43,0x00, +0x58,0x00,0x40,0x14, +0x02,0x80,0x07,0x3C, +0xC4,0x39,0x05,0x8E, +0x0C,0x00,0x11,0x24, +0x2B,0x10,0x25,0x02, +0x0F,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF8,0x58,0x46,0x24, +0x44,0x00,0x04,0x24, +0x21,0x80,0x26,0x02, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x3E,0x00,0x44,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x25,0x02, +0xF6,0xFF,0x60,0x14, +0x21,0x80,0x26,0x02, +0x21,0x20,0xC0,0x03, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x21,0x10,0x00,0x00, +0x7C,0x00,0xBF,0x8F, +0x78,0x00,0xBE,0x8F, +0x74,0x00,0xB7,0x8F, +0x70,0x00,0xB6,0x8F, +0x6C,0x00,0xB5,0x8F, +0x68,0x00,0xB4,0x8F, +0x64,0x00,0xB3,0x8F, +0x60,0x00,0xB2,0x8F, +0x5C,0x00,0xB1,0x8F, +0x58,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x80,0x00,0xBD,0x27, +0xC4,0x39,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x22,0x02, +0x7B,0xFF,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x58,0x56,0x24, +0xFA,0x58,0x75,0x24, +0x21,0xA0,0x80,0x00, +0x25,0x14,0x00,0x08, +0xDD,0x00,0x13,0x24, +0x01,0x00,0x02,0x92, +0xC4,0x39,0x83,0x8E, +0x21,0x10,0x51,0x00, +0x02,0x00,0x51,0x24, +0x2B,0x18,0x23,0x02, +0x6F,0xFF,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x36,0x02, +0x00,0x00,0x02,0x92, +0x21,0x90,0x35,0x02, +0x21,0x20,0x40,0x02, +0x40,0x00,0xA5,0x27, +0xF3,0xFF,0x53,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0xE0,0x02, +0x01,0x00,0x06,0x92, +0x54,0x00,0xA2,0x8F, +0x21,0x38,0x40,0x02, +0xDD,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x92,0x13,0x00,0x08, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x48,0xE1,0x84,0x24, +0x01,0x00,0x06,0x92, +0x54,0x00,0xA2,0x8F, +0x02,0x80,0x07,0x3C, +0xFA,0x58,0xE7,0x24, +0x21,0x38,0x27,0x02, +0x21,0x20,0xE0,0x02, +0x44,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x03,0x14,0x00,0x08, +0x21,0x20,0xC0,0x03, +0x54,0x00,0xA2,0x8F, +0x21,0x20,0xE0,0x02, +0x9C,0xDD,0xE7,0x24, +0xDD,0x00,0x05,0x24, +0x06,0x00,0x06,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xEF,0x13,0x00,0x08, +0x21,0xB8,0x40,0x00, +0x02,0x80,0x14,0x3C, +0xFA,0x58,0xA5,0x24, +0x21,0x28,0x25,0x02, +0x88,0x5D,0x84,0x26, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x06,0x24, +0x02,0x80,0x03,0x3C, +0xF1,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x1D,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x58,0x3E,0x02,0x96, +0x00,0x00,0x00,0x00, +0xBD,0xFF,0x42,0x30, +0x58,0x3E,0x02,0xA6, +0x02,0x80,0x02,0x3C, +0x58,0x3E,0x03,0x96, +0xDE,0x5D,0x44,0x90, +0x0C,0x00,0x63,0x34, +0x01,0x00,0x84,0x30, +0x15,0x00,0x80,0x10, +0x58,0x3E,0x03,0xA6, +0x02,0x80,0x05,0x3C, +0x8B,0x5D,0x64,0x26, +0x3C,0xE3,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x10,0x00,0x06,0x24, +0x21,0x10,0x32,0x02, +0x01,0x00,0x46,0x90, +0x54,0x00,0xA2,0x8F, +0x21,0x20,0xE0,0x02, +0x88,0x5D,0x87,0x26, +0x2D,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x21,0xB8,0x40,0x00, +0x01,0x00,0x02,0x24, +0x8C,0x13,0x00,0x08, +0x50,0x3E,0x02,0xAE, +0x58,0x3E,0x02,0x96, +0x5D,0x14,0x00,0x08, +0x02,0x00,0x42,0x34, +0x02,0x80,0x05,0x3C, +0x8B,0x5D,0x64,0x26, +0x68,0x14,0x00,0x08, +0x4C,0xE3,0xA5,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x28,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xD4,0xEA,0xA5,0x24, +0x07,0x14,0x00,0x08, +0xFF,0xFF,0x02,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xB0,0x1B,0x43,0x94, +0xC8,0x00,0x04,0x24, +0xD0,0x38,0x44,0xAC, +0x9F,0xFE,0x63,0x30, +0x80,0x00,0x63,0x34, +0xB0,0x1B,0x43,0xA4, +0x6C,0x3D,0x40,0xAC, +0x70,0x3D,0x40,0xAC, +0xA5,0x12,0x00,0x08, +0xB4,0x38,0x40,0xAC, +0xD8,0xFF,0xBD,0x27, +0x28,0x00,0xA4,0xA3, +0x00,0x01,0x04,0x24, +0x18,0x00,0xB2,0xAF, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x2C,0x00,0xA5,0xA3, +0x25,0x24,0x00,0x0C, +0x30,0x00,0xA6,0xA7, +0x94,0x00,0x40,0x10, +0x21,0x90,0x40,0x00, +0x30,0x00,0xA7,0x97, +0x28,0x00,0xA5,0x93, +0x2C,0x00,0xA6,0x93, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x68,0xE1,0x84,0x24, +0x08,0x00,0x50,0x96, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x11,0x3C, +0x25,0x80,0x02,0x02, +0x88,0x58,0x31,0x26, +0x21,0x28,0x20,0x02, +0x24,0x00,0x04,0x26, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x20,0x00,0x00,0xA6, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x21,0x28,0x20,0x02, +0x30,0x00,0x04,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x20,0x00,0x05,0x26, +0x03,0xFF,0x63,0x30, +0xD0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x02,0x80,0x03,0x3C, +0x0C,0x00,0x42,0xAE, +0x30,0x1F,0x73,0x24, +0xF8,0x1D,0x62,0x96, +0x0C,0x00,0x51,0x26, +0x28,0x00,0xA6,0x27, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x22,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x62,0xA6, +0x21,0x38,0x20,0x02, +0x16,0x00,0xA3,0xA0, +0x17,0x00,0xA4,0xA0, +0x38,0x00,0x04,0x26, +0x68,0x4F,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x21,0x20,0x40,0x00, +0x01,0x00,0x05,0x24, +0x2C,0x00,0xA6,0x27, +0x68,0x4F,0x00,0x0C, +0x21,0x38,0x20,0x02, +0x28,0x00,0xA3,0x93, +0x21,0x20,0x40,0x00, +0x03,0x00,0x02,0x24, +0x0C,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x21,0x20,0x40,0x02, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x2C,0x00,0xA3,0x93, +0x00,0x00,0x00,0x00, +0x2E,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x19,0x3E,0x63,0x92, +0x21,0x80,0x60,0x02, +0x01,0x00,0x68,0x24, +0xFF,0x00,0x02,0x31, +0xFD,0xFF,0x40,0x10, +0x21,0x18,0x00,0x01, +0x02,0x80,0x06,0x3C, +0x19,0x3E,0x08,0xA2, +0x21,0x38,0x20,0x02, +0x49,0x5D,0xC6,0x24, +0x68,0x4F,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x30,0x00,0xA3,0x97, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x0F,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x02,0x08,0x63,0x34, +0x1C,0x3E,0x03,0xA6, +0x4C,0x5D,0xC6,0x24, +0x21,0x20,0x40,0x00, +0x68,0x4F,0x00,0x0C, +0x02,0x00,0x05,0x24, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x4E,0x5D,0xC6,0x24, +0x21,0x20,0x40,0x00, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x1E,0x3E,0x00,0xA6, +0x30,0x00,0xA3,0x97, +0x21,0x20,0x40,0x00, +0x02,0x80,0x06,0x3C, +0x07,0x00,0x63,0x30, +0x40,0x18,0x03,0x00, +0x21,0x18,0x70,0x00, +0xE8,0x1D,0x62,0x94, +0x50,0x5D,0xC6,0x24, +0x21,0x38,0x20,0x02, +0x00,0x11,0x02,0x00, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x20,0x3E,0x02,0xA6, +0xD8,0x14,0x00,0x08, +0x21,0x20,0x40,0x02, +0xC3,0xFF,0x62,0x14, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x48,0x5D,0xC6,0x24, +0x68,0x4F,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x21,0x20,0x40,0x00, +0x30,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x02,0x00,0x05,0x24, +0x1C,0x3E,0x63,0x96, +0x02,0x80,0x06,0x3C, +0x21,0x38,0x20,0x02, +0x3F,0x00,0x63,0x30, +0x00,0x08,0x63,0x34, +0x21,0x20,0x40,0x00, +0x4C,0x5D,0xC6,0x24, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x1C,0x3E,0x63,0xA6, +0x02,0x80,0x06,0x3C, +0x21,0x20,0x40,0x00, +0x4E,0x5D,0xC6,0x24, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x02,0x00,0x05,0x24, +0xD8,0x14,0x00,0x08, +0x21,0x20,0x40,0x02, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x5C,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xE8,0xEA,0xA5,0x24, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xE0,0xFF,0xBD,0x27, +0x18,0x03,0x42,0x34, +0xF0,0x54,0x63,0x24, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x00,0x00,0x43,0xAC, +0x02,0x00,0x82,0x90, +0x02,0x80,0x05,0x3C, +0x88,0x58,0xA5,0x24, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x28,0x00,0x04,0x26, +0x06,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x18,0x00,0x11,0x26, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x55,0x50,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xF1,0xFF,0x40,0x14, +0x03,0x00,0x02,0x24, +0x30,0x00,0x03,0x92, +0x00,0x00,0x00,0x00, +0xED,0xFF,0x62,0x14, +0x30,0x00,0x07,0x26, +0x02,0x80,0x06,0x3C, +0x30,0x1F,0xC8,0x24, +0x50,0x3E,0x02,0x8D, +0x00,0x00,0x00,0x00, +0xE7,0xFF,0x40,0x10, +0x01,0x00,0x05,0x24, +0x01,0x00,0xE3,0x90, +0x00,0x00,0x00,0x00, +0x1A,0x00,0x65,0x10, +0x02,0x00,0x62,0x28, +0x2E,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0xDF,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x03,0x00,0xE3,0x90, +0x00,0x00,0x00,0x00, +0x08,0x00,0x62,0x30, +0x0A,0x00,0x40,0x14, +0x02,0x11,0x03,0x00, +0x1A,0x3E,0x03,0x91, +0x04,0x10,0x45,0x00, +0x27,0x10,0x02,0x00, +0x24,0x10,0x43,0x00, +0x1A,0x3E,0x02,0xA1, +0x05,0x00,0xE3,0x90, +0x04,0x00,0xE2,0x90, +0x00,0x1A,0x03,0x00, +0x25,0x90,0x62,0x00, +0x1A,0x3E,0x05,0x91, +0x02,0x80,0x04,0x3C, +0x94,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x30,0x40,0x02, +0x52,0x15,0x00,0x08, +0x00,0x00,0x00,0x00, +0x04,0x00,0xE2,0x90, +0x03,0x00,0xE4,0x90, +0x05,0x00,0xE3,0x90, +0x00,0x12,0x02,0x00, +0x25,0x10,0x44,0x00, +0x82,0x18,0x03,0x00, +0x27,0x00,0x40,0x14, +0x07,0x00,0x64,0x30, +0x1A,0x3E,0x03,0x91, +0x04,0x10,0x85,0x00, +0x25,0x10,0x43,0x00, +0x1A,0x3E,0x02,0xA1, +0x30,0x1F,0xC2,0x24, +0x4C,0x3E,0x43,0x90, +0x1A,0x3E,0x45,0x90, +0x02,0x80,0x04,0x3C, +0x21,0x18,0x62,0x00, +0x84,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x44,0x3E,0x60,0xA0, +0x52,0x15,0x00,0x08, +0x00,0x00,0x00,0x00, +0xB2,0xFF,0x60,0x14, +0x03,0x00,0x04,0x24, +0x02,0x00,0xE2,0x90, +0x01,0x00,0x05,0x24, +0x18,0x3E,0x02,0xA1, +0x04,0x00,0xE3,0x90, +0x03,0x00,0xE2,0x90, +0x21,0x30,0x00,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x18,0x62,0x00, +0x1C,0x3E,0x03,0xA5, +0x06,0x00,0xE2,0x90, +0x05,0x00,0xE3,0x90, +0x00,0x12,0x02,0x00, +0x25,0x10,0x43,0x00, +0x1E,0x3E,0x02,0xA5, +0x08,0x00,0xE3,0x90, +0x07,0x00,0xE2,0x90, +0x00,0x1A,0x03,0x00, +0x25,0x18,0x62,0x00, +0x90,0x14,0x00,0x0C, +0x20,0x3E,0x03,0xA5, +0x52,0x15,0x00,0x08, +0x00,0x00,0x00,0x00, +0x1A,0x3E,0x03,0x91, +0x04,0x10,0x85,0x00, +0x27,0x10,0x02,0x00, +0x94,0x15,0x00,0x08, +0x24,0x10,0x43,0x00, +0xC0,0xFF,0xBD,0x27, +0x34,0x00,0xB5,0xAF, +0xFF,0xFF,0x95,0x30, +0x00,0x01,0x04,0x24, +0x38,0x00,0xB6,0xAF, +0x28,0x00,0xB2,0xAF, +0x3C,0x00,0xBF,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x24,0x00,0xB1,0xAF, +0x25,0x24,0x00,0x0C, +0x20,0x00,0xB0,0xAF, +0x21,0x90,0x40,0x00, +0x7A,0x00,0x40,0x10, +0x21,0xB0,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xB0,0xE1,0x84,0x24, +0x08,0x00,0x50,0x96, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x11,0x3C, +0x25,0x80,0x02,0x02, +0x88,0x58,0x31,0x26, +0x24,0x00,0x04,0x26, +0x21,0x28,0x20,0x02, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x30,0x00,0x04,0x26, +0x21,0x28,0x20,0x02, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x13,0x3C, +0x03,0xFF,0x63,0x30, +0xB0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0x68,0x26, +0x0C,0x00,0x42,0xAE, +0xF8,0x1D,0x02,0x95, +0x20,0x00,0x14,0x26, +0x0C,0x00,0x51,0x26, +0xFF,0x0F,0x43,0x30, +0x00,0x19,0x03,0x00, +0x02,0x22,0x03,0x00, +0x01,0x00,0x42,0x24, +0xF8,0x1D,0x02,0xA5, +0x17,0x00,0x84,0xA2, +0x16,0x00,0x83,0xA2, +0x74,0x3D,0x04,0x8D, +0x03,0x00,0x02,0x24, +0x3C,0x00,0x82,0x10, +0x38,0x00,0x10,0x26, +0x30,0x1F,0x73,0x26, +0x78,0x3D,0x62,0x8E, +0x21,0x20,0x00,0x02, +0x02,0x00,0x05,0x24, +0x01,0x00,0x42,0x38, +0x01,0x00,0x42,0x2C, +0x18,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x18,0x00,0xA2,0xA7, +0x74,0x3D,0x63,0x8E, +0x21,0x20,0x40,0x00, +0x02,0x00,0x05,0x24, +0x18,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x18,0x00,0xA3,0xA7, +0x21,0x20,0x40,0x00, +0x02,0x00,0x05,0x24, +0x18,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x68,0x4F,0x00,0x0C, +0x18,0x00,0xB5,0xA7, +0x74,0x3D,0x63,0x8E, +0x21,0x80,0x40,0x00, +0x03,0x00,0x02,0x24, +0x0F,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x21,0x20,0x40,0x02, +0x21,0x30,0xC0,0x02, +0xB9,0x0C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0xB0,0x1B,0x62,0x96, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0xEF,0xFF,0x40,0x10, +0x21,0x20,0x40,0x02, +0x02,0x80,0x07,0x3C, +0x21,0x20,0x00,0x02, +0xB8,0x5C,0xE7,0x24, +0x10,0x00,0x05,0x24, +0x80,0x00,0x06,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB1,0xAF, +0x00,0x00,0x83,0x96, +0x01,0x00,0x16,0x24, +0x00,0x40,0x63,0x34, +0x13,0x16,0x00,0x08, +0x00,0x00,0x83,0xA6, +0xB0,0x1B,0x02,0x95, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0xC1,0xFF,0x40,0x10, +0x21,0x20,0x00,0x02, +0x80,0x3D,0x03,0x8D, +0x84,0x3D,0x02,0x8D, +0x80,0x1F,0x03,0x00, +0x25,0x18,0x43,0x00, +0x04,0x00,0x05,0x24, +0x01,0x00,0x42,0x24, +0x1C,0x00,0xA6,0x27, +0x21,0x38,0x20,0x02, +0x84,0x3D,0x02,0xAD, +0x68,0x4F,0x00,0x0C, +0x1C,0x00,0xA3,0xAF, +0xF7,0x15,0x00,0x08, +0x21,0x80,0x40,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xA4,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0xF8,0xEA,0xA5,0x24, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xB0,0x1B,0x62,0x94, +0x01,0x00,0x05,0x24, +0x21,0x20,0x00,0x00, +0xEF,0xFF,0x42,0x30, +0x20,0x00,0x42,0x34, +0xB0,0x1B,0x62,0xA4, +0xC8,0x00,0x02,0x24, +0x74,0x3D,0x65,0xAC, +0xB4,0x38,0x62,0xAC, +0xD0,0x38,0x60,0xAC, +0x6C,0x3D,0x60,0xAC, +0xBC,0x15,0x00,0x08, +0x70,0x3D,0x60,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xA8,0xFF,0xBD,0x27, +0x50,0x00,0xBE,0xAF, +0x40,0x00,0xB4,0xAF, +0x3C,0x00,0xB3,0xAF, +0x54,0x00,0xBF,0xAF, +0x4C,0x00,0xB7,0xAF, +0x48,0x00,0xB6,0xAF, +0x44,0x00,0xB5,0xAF, +0x38,0x00,0xB2,0xAF, +0x34,0x00,0xB1,0xAF, +0x30,0x00,0xB0,0xAF, +0x21,0xA0,0x80,0x00, +0x02,0x00,0x84,0x90, +0x21,0xF0,0x00,0x00, +0x24,0x00,0xA0,0xAF, +0x0F,0x00,0x84,0x30, +0xC0,0x20,0x04,0x00, +0x21,0x20,0x94,0x00, +0x18,0x00,0x93,0x24, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x15,0x3C, +0x28,0x00,0x84,0x24, +0x88,0x58,0xA5,0x26, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x0F,0x00,0x40,0x14, +0x02,0x80,0x16,0x3C, +0xF4,0x5E,0xC2,0x92, +0x00,0x00,0x00,0x00, +0x29,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0xC2,0x92, +0x00,0x00,0x00,0x00, +0x07,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x3C,0x01,0x40,0x14, +0x05,0x00,0x05,0x24, +0x00,0x60,0x92,0x40, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0xB0,0x1B,0x03,0x96, +0x00,0x00,0x00,0x00, +0x00,0x10,0x62,0x30, +0x24,0x01,0x40,0x14, +0x10,0x00,0x62,0x30, +0xCB,0x00,0x40,0x14, +0x10,0x00,0x64,0x26, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x92,0x24, +0xB0,0x1B,0x42,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x4E,0x01,0x40,0x14, +0x21,0x18,0x00,0x00, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x30,0x1F,0x43,0x24, +0xB0,0x1B,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0xD3,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x3B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0xCF,0xFF,0x40,0x14, +0x02,0x80,0x0B,0x3C, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0x55,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xFA,0x5E,0x40,0xA0, +0x1C,0x5F,0x60,0xAC, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0xFD,0xFF,0x03,0x24, +0x02,0x80,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x82,0xA0, +0x42,0xB0,0x17,0x3C, +0x00,0x00,0xE3,0x92, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xE4,0x36, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xE3,0xA2, +0x00,0x00,0x82,0xA0, +0x02,0x80,0x04,0x3C, +0xFC,0x5E,0x82,0x94, +0x20,0x00,0x63,0x96, +0xFF,0xFF,0x42,0x30, +0x0A,0x00,0x43,0x10, +0x02,0x80,0x07,0x3C, +0x25,0xB0,0x02,0x3C, +0x94,0x00,0x42,0x34, +0xFC,0x5E,0x83,0xA4, +0x00,0x00,0x43,0xA4, +0xFC,0x5E,0x83,0x94, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x63,0x30, +0x80,0x1A,0x03,0x00, +0x00,0x5F,0xE3,0xAC, +0x25,0xB0,0x04,0x3C, +0x84,0x00,0x82,0x34, +0x00,0x00,0x50,0x8C, +0x80,0x00,0x84,0x34, +0x00,0x00,0x82,0x8C, +0x21,0x18,0x00,0x00, +0x00,0x5F,0xE6,0x8C, +0x00,0x88,0x10,0x00, +0x21,0x80,0x00,0x00, +0x25,0x80,0x02,0x02, +0x25,0x88,0x23,0x02, +0x21,0x20,0x00,0x02, +0x21,0x28,0x20,0x02, +0x28,0x00,0xA7,0xAF, +0xBA,0x34,0x00,0x0C, +0x2C,0x00,0xAB,0xAF, +0x28,0x00,0xA7,0x8F, +0x02,0x80,0x0A,0x3C, +0x21,0x28,0x00,0x00, +0x00,0x5F,0xE8,0x8C, +0x04,0x5F,0x43,0x95, +0x21,0x28,0xB1,0x00, +0x23,0x48,0x02,0x01, +0x21,0x20,0x30,0x01, +0x2B,0x10,0x90,0x00, +0xFF,0xFF,0x63,0x30, +0x80,0x1A,0x03,0x00, +0x21,0x28,0xA2,0x00, +0x21,0x38,0x00,0x00, +0x2B,0x40,0x83,0x00, +0x23,0x28,0xA7,0x00, +0x23,0x20,0x83,0x00, +0x23,0x28,0xA8,0x00, +0x02,0x80,0x03,0x3C, +0x20,0x5F,0x64,0xAC, +0x24,0x5F,0x65,0xAC, +0x04,0x5F,0x42,0x95, +0x2C,0x00,0xAB,0x8F, +0xFF,0xFF,0x42,0x30, +0x80,0x12,0x02,0x00, +0x2B,0x10,0x49,0x00, +0x31,0x01,0x40,0x10, +0x00,0x00,0x00,0x00, +0x04,0x5F,0x42,0x95, +0x00,0x00,0xE4,0x92, +0xFB,0xFF,0x03,0x24, +0xFF,0xFF,0x42,0x30, +0x80,0x12,0x02,0x00, +0x24,0x20,0x83,0x00, +0x23,0x48,0x22,0x01, +0x00,0x00,0xE4,0xA2, +0x01,0x00,0x06,0x24, +0x04,0x00,0x20,0x11, +0x01,0x00,0x04,0x24, +0x80,0x10,0x09,0x00, +0x21,0x10,0x49,0x00, +0x80,0x30,0x02,0x00, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x00,0x00,0x87,0x8E, +0x05,0x00,0x05,0x24, +0x24,0x00,0x64,0x26, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0x2E,0x00,0x40,0x10, +0x21,0x28,0x40,0x00, +0xF4,0x5E,0xC2,0x92, +0x02,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x45,0x01,0x43,0x10, +0x02,0x80,0x07,0x3C, +0x02,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x08,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x04,0x00,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x30, +0x04,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x1E,0x24, +0x12,0x5F,0x5E,0xA0, +0x04,0x00,0xA3,0x90, +0x20,0x00,0xA7,0x8F, +0x00,0x00,0x00,0x00, +0x04,0x00,0xE2,0x28, +0x18,0x00,0x40,0x14, +0xFE,0x00,0x66,0x30, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0x50,0x39,0x64,0x94, +0xC0,0x10,0x06,0x00, +0x2A,0x10,0x82,0x00, +0x12,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x21,0x10,0xC7,0x00, +0xFD,0xFF,0x42,0x24, +0xC0,0x10,0x02,0x00, +0x2A,0x10,0x44,0x00, +0x0C,0x00,0x40,0x14, +0xC2,0x10,0x04,0x00, +0x23,0x30,0x46,0x00, +0x21,0x18,0xA6,0x00, +0x05,0x00,0x62,0x90, +0x07,0x00,0x84,0x30, +0x01,0x00,0x03,0x24, +0x07,0x10,0x82,0x00, +0x24,0x00,0xA4,0x8F, +0x01,0x00,0x42,0x30, +0x0B,0x20,0x62,0x00, +0x24,0x00,0xA4,0xAF, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0xEF,0xFF,0x03,0x24, +0x02,0x80,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x82,0xA0, +0xF4,0x5E,0xC3,0x92, +0x02,0x80,0x02,0x3C, +0x24,0xE9,0x42,0x24, +0xFF,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0x66,0x8C, +0x24,0x00,0xA5,0x8F, +0x09,0xF8,0xC0,0x00, +0x21,0x20,0xC0,0x03, +0x90,0x16,0x00,0x08, +0x00,0x00,0x00,0x00, +0x88,0x58,0xA5,0x26, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x33,0xFF,0x40,0x14, +0x02,0x80,0x04,0x3C, +0x06,0x00,0x02,0x24, +0x0A,0x3E,0x02,0xA2, +0xEC,0x38,0x00,0xAE, +0x00,0x00,0x84,0x8E, +0x0C,0x00,0x12,0x24, +0xFF,0x3F,0x82,0x30, +0xE8,0xFF,0x42,0x24, +0x2A,0x10,0x42,0x02, +0xA4,0x00,0x40,0x10, +0x21,0xA8,0x00,0x02, +0x7D,0x17,0x00,0x08, +0x21,0x80,0x72,0x02, +0x19,0x00,0x03,0x92, +0xFF,0x3F,0x82,0x30, +0xE8,0xFF,0x42,0x24, +0x21,0x18,0x72,0x00, +0x02,0x00,0x72,0x24, +0x2A,0x10,0x42,0x02, +0x9A,0x00,0x40,0x10, +0x21,0x80,0x72,0x02, +0x18,0x00,0x03,0x92, +0xDD,0x00,0x02,0x24, +0xF5,0xFF,0x62,0x14, +0x1A,0x00,0x11,0x26, +0x02,0x80,0x05,0x3C, +0xC4,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x20,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xC0,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x1A,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xBC,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x0F,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xB8,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x09,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xB4,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x03,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xAC,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x64,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xA8,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x57,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0xB0,0xDD,0xA5,0x24, +0x21,0x20,0x20,0x02, +0x39,0x52,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x4A,0x01,0x40,0x10, +0x02,0x80,0x05,0x3C, +0x21,0x20,0x20,0x02, +0x9C,0xDD,0xA5,0x24, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x3E,0x01,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x84,0x8E, +0x75,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x92,0x10,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x21,0x18,0x00,0x00, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x00,0x00,0x87,0x8E, +0x24,0x00,0x64,0x26, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0xBE,0xFE,0x40,0x10, +0x21,0x28,0x40,0x00, +0x20,0x00,0xA7,0x8F, +0x04,0x00,0x42,0x90, +0x04,0x00,0xE3,0x28, +0xB9,0xFE,0x60,0x14, +0xFE,0x00,0x46,0x30, +0x50,0x39,0x04,0x96, +0xC0,0x10,0x06,0x00, +0x2A,0x10,0x82,0x00, +0xB4,0xFE,0x40,0x14, +0x21,0x10,0xC7,0x00, +0xFD,0xFF,0x42,0x24, +0xC0,0x10,0x02,0x00, +0x2A,0x10,0x44,0x00, +0xAF,0xFE,0x40,0x14, +0xC2,0x10,0x04,0x00, +0x23,0x30,0x46,0x00, +0x21,0x18,0xA6,0x00, +0x05,0x00,0x62,0x90, +0x07,0x00,0x84,0x30, +0x07,0x10,0x82,0x00, +0x01,0x00,0x42,0x30, +0xA7,0xFE,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x4E,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x90,0x16,0x00,0x08, +0x00,0x00,0x00,0x00, +0x88,0x58,0xA5,0x26, +0x10,0x00,0x64,0x26, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xCB,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0xB0,0x1B,0x43,0x96, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x30, +0x0D,0x00,0x40,0x14, +0x04,0x00,0x62,0x30, +0x83,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0x0B,0x3E,0x02,0x92, +0x00,0x00,0x00,0x00, +0x01,0x00,0x44,0x24, +0xFF,0x00,0x83,0x30, +0x0B,0x00,0x02,0x24, +0x45,0x00,0x62,0x10, +0x21,0x18,0x00,0x00, +0xA1,0x16,0x00,0x08, +0x0B,0x3E,0x04,0xA2, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD4,0x1E,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD4,0x1E,0x42,0xAE, +0x00,0x60,0x83,0x40, +0xFB,0x17,0x00,0x08, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x24, +0x15,0x5F,0x62,0xA1, +0xBD,0x16,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0xFC,0xE2,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x46,0x90, +0x01,0x00,0x03,0x24, +0x10,0x00,0xC3,0x10, +0x02,0x80,0x03,0x3C, +0x53,0x16,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x30,0x1F,0x64,0x24, +0x0A,0x3E,0x83,0x90, +0x03,0x00,0x02,0x24, +0x62,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x91,0x3E,0x86,0xA0, +0x53,0x16,0x00,0x0C, +0x90,0x3E,0x80,0xA0, +0x21,0x18,0x00,0x08, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x91, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA1, +0x00,0x00,0xE2,0x92, +0xFB,0xFF,0x03,0x24, +0x01,0x00,0x06,0x24, +0x24,0x10,0x43,0x00, +0x00,0x00,0xE2,0xA2, +0x11,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x43,0x90, +0x01,0x00,0x11,0x24, +0x53,0x00,0x71,0x10, +0x0B,0x3E,0x00,0xA2, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x44,0x90, +0x02,0x00,0x03,0x24, +0x6E,0xFF,0x83,0x14, +0x21,0x18,0x00,0x00, +0x00,0x00,0x87,0x8E, +0x24,0x00,0x64,0x26, +0x2A,0x00,0x05,0x24, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0x65,0xFF,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x62,0x30, +0x4D,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x01,0x00,0x62,0x30, +0x4B,0x00,0x40,0x14, +0x30,0x1F,0x85,0x24, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0xAA,0x00,0x71,0x10, +0x00,0x00,0x00,0x00, +0x10,0x23,0x02,0x8E, +0xFF,0xEF,0x03,0x24, +0x00,0x08,0x42,0x34, +0x24,0x10,0x43,0x00, +0x10,0x23,0x02,0xAE, +0xBE,0x17,0x00,0x08, +0x21,0x18,0x00,0x00, +0x03,0x00,0xA2,0x90, +0x02,0x80,0x04,0x3C, +0x10,0x5F,0xE2,0xA0, +0x02,0x00,0xA3,0x90, +0x21,0x30,0x80,0x00, +0x11,0x5F,0x83,0xA0, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x22,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x10,0x5F,0xE2,0x90, +0x00,0x00,0x00,0x00, +0x11,0x5F,0xC2,0xA0, +0x2A,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x76,0x26, +0x3B,0x51,0x00,0x0C, +0x21,0x20,0xC0,0x02, +0x20,0x00,0x10,0x24, +0x32,0x00,0x50,0x10, +0x21,0xA8,0x40,0x00, +0x00,0x60,0x05,0x40, +0x01,0x00,0xA1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x80,0x18,0x15,0x00, +0x21,0x18,0x75,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0xC0,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x0C,0x1E,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x0C,0x1E,0x62,0xAC, +0x00,0x60,0x85,0x40, +0xBE,0x17,0x00,0x08, +0x21,0x18,0x00,0x00, +0x90,0x3E,0x86,0xA0, +0x53,0x16,0x00,0x0C, +0x91,0x3E,0x80,0xA0, +0x21,0x18,0x00,0x08, +0x00,0x00,0x00,0x00, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x11,0x5F,0xC2,0xA0, +0x2A,0x17,0x00,0x08, +0x00,0x00,0x00,0x00, +0x64,0x12,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4D,0x18,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x01,0x00,0x02,0x24, +0x90,0xE2,0x84,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0xA2,0xA2, +0x02,0x80,0x04,0x3C, +0x78,0xE2,0x84,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0xA0,0xA2, +0x30,0x1F,0x85,0x24, +0x10,0x23,0xA2,0x8C, +0xFF,0xEF,0x03,0x24, +0xFF,0xF7,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x21,0x18,0x00,0x00, +0xBE,0x17,0x00,0x08, +0x10,0x23,0xA2,0xAC, +0xFF,0xFF,0x04,0x24, +0xE3,0x50,0x00,0x0C, +0x21,0x28,0xC0,0x02, +0xCB,0xFF,0x50,0x10, +0x21,0xA8,0x40,0x00, +0x00,0x00,0x87,0x8E, +0x24,0x00,0x70,0x26, +0x21,0x20,0x00,0x02, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x01,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0xDF,0xFD,0x40,0x10, +0x21,0x18,0x00,0x00, +0x20,0x00,0xA6,0x8F, +0x02,0x00,0x45,0x24, +0x10,0x52,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x00,0x00,0x87,0x8E, +0x21,0x20,0x00,0x02, +0x32,0x00,0x05,0x24, +0xFF,0x3F,0xE7,0x30, +0xDC,0xFF,0xE7,0x24, +0x20,0x00,0xB1,0x8F, +0x55,0x1D,0x00,0x0C, +0x20,0x00,0xA6,0x27, +0x09,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x20,0x00,0xA6,0x8F, +0x10,0x00,0xA4,0x27, +0x21,0x20,0x91,0x00, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x20,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x88,0x23,0x02, +0x10,0x00,0xA4,0x27, +0x7D,0x50,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x0F,0x00,0x42,0x30, +0x00,0x81,0x15,0x00, +0x21,0x28,0x20,0x02, +0x10,0x00,0xA4,0x27, +0x25,0x80,0x02,0x02, +0xC2,0x50,0x00,0x0C, +0xFF,0xFF,0x10,0x32, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x38,0x40,0x00, +0x21,0x28,0xA0,0x02, +0x21,0x30,0x00,0x02, +0x2F,0x55,0x00,0x0C, +0x10,0xE3,0x84,0x24, +0x21,0x20,0x00,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x8E,0x3E,0x42,0x92, +0x21,0x20,0xC0,0x02, +0x21,0x28,0xA0,0x02, +0x01,0x00,0x42,0x24, +0x9C,0x0E,0x00,0x0C, +0x8E,0x3E,0x42,0xA2, +0x83,0x18,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xE4,0xE2,0x84,0x24, +0x05,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xD0,0xE2,0x84,0x24, +0x02,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xBC,0xE2,0x84,0x24, +0x04,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x43,0x24, +0xA8,0xE2,0x84,0x24, +0x03,0x00,0x02,0x24, +0x18,0x18,0x00,0x08, +0x0A,0x3E,0x62,0xA0, +0x10,0x23,0x02,0x8E, +0xFF,0xF7,0x03,0x24, +0x24,0x10,0x43,0x00, +0x00,0x10,0x42,0x34, +0x6C,0x18,0x00,0x08, +0x10,0x23,0x02,0xAE, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x02,0x26, +0x14,0x00,0xBF,0xAF, +0xB0,0x1B,0x43,0x94, +0x21,0x28,0x00,0x00, +0x00,0x01,0x62,0x30, +0x03,0x00,0x40,0x10, +0x01,0x00,0x64,0x30, +0x06,0x00,0x80,0x14, +0x00,0x10,0x62,0x30, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x08,0x00,0x40,0x14, +0x02,0x00,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x0C,0x00,0x02,0x24, +0x0F,0x00,0x63,0x30, +0x0A,0x00,0x62,0x10, +0x21,0x20,0x00,0x00, +0x02,0x00,0x03,0x3C, +0x30,0x1F,0x04,0x26, +0x20,0xBF,0x63,0x34, +0x08,0x39,0x83,0xAC, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xCD,0x4E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x00,0x03,0x3C, +0x30,0x1F,0x04,0x26, +0x20,0xBF,0x63,0x34, +0x33,0x19,0x00,0x08, +0x08,0x39,0x83,0xAC, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x25,0x26, +0x6C,0x3B,0xA2,0x8C, +0x00,0x10,0x03,0x3C, +0x24,0x10,0x43,0x00, +0x21,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x9B,0x3B,0xA6,0x90, +0x9C,0x3B,0xA4,0x90, +0xFF,0x00,0xC3,0x30, +0x40,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x01,0x00,0x84,0x24, +0x80,0x10,0x02,0x00, +0xFF,0x00,0x83,0x30, +0x21,0x10,0x45,0x00, +0x21,0x10,0x43,0x00, +0x9C,0x3B,0xA4,0xA0, +0x38,0x3B,0x43,0x90, +0x00,0x00,0x00,0x00, +0x21,0x00,0x60,0x10, +0x01,0x00,0xC2,0x24, +0xFF,0x00,0xC2,0x30, +0x22,0x00,0x40,0x14, +0x30,0x1F,0x30,0x26, +0x9C,0x3B,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x21,0x10,0x45,0x00, +0x38,0x3B,0x43,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x64,0x30, +0x1A,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x67,0x3B,0xA2,0x90, +0x30,0x3B,0xA3,0xA0, +0x4F,0x0C,0x00,0x0C, +0x31,0x3B,0xA2,0xA0, +0x30,0x1F,0x30,0x26, +0x70,0x3B,0x03,0x8E, +0x01,0x00,0x02,0x24, +0x7C,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x3B,0x03,0x8E, +0x00,0x10,0x02,0x3C, +0x3C,0x00,0x04,0x24, +0x26,0x18,0x62,0x00, +0x98,0x38,0x04,0xAE, +0x6C,0x3B,0x03,0xAE, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x21,0x30,0x40,0x00, +0x9B,0x3B,0xA2,0xA0, +0x5C,0x19,0x00,0x08, +0x9C,0x3B,0xA0,0xA0, +0x99,0x3B,0x03,0x92, +0x9A,0x3B,0x02,0x92, +0xFF,0x00,0x64,0x30, +0x30,0x3B,0x03,0xA2, +0x4F,0x0C,0x00,0x0C, +0x31,0x3B,0x02,0xA2, +0xB0,0x1B,0x03,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x62,0x30, +0x09,0x00,0x40,0x10, +0x01,0x00,0x62,0x30, +0x08,0x00,0x40,0x10, +0x30,0x1F,0x30,0x26, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x0C,0x00,0x02,0x24, +0x0F,0x00,0x63,0x30, +0x61,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x30,0x26, +0x9E,0x3B,0x04,0x96, +0xA0,0x3B,0x05,0x92, +0x12,0x0D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xC1,0x48,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x6C,0x3B,0x00,0xAE, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x3F,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x3C,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x41,0x00,0x40,0x14, +0x04,0x00,0x04,0x24, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA0, +0x00,0x60,0x92,0x40, +0x25,0xB0,0x07,0x3C, +0x30,0x1F,0x30,0x26, +0xB0,0x1B,0x04,0x96, +0x48,0x00,0xE6,0x34, +0x00,0x00,0xC3,0x8C, +0xFF,0xEF,0x84,0x30, +0x80,0x00,0x02,0x3C, +0x25,0x18,0x62,0x00, +0x00,0x01,0x85,0x30, +0x00,0x00,0xC3,0xAC, +0x02,0x80,0x08,0x3C, +0x05,0x00,0xA0,0x10, +0xB0,0x1B,0x04,0xA6, +0x00,0x00,0xC2,0x8C, +0x04,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0xC2,0xAC, +0x30,0x1F,0x02,0x8D, +0xFF,0xF0,0x03,0x24, +0xA1,0x3B,0x05,0x92, +0x24,0x10,0x43,0x00, +0x00,0x01,0x42,0x34, +0x0F,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x10,0x00,0x42,0x34, +0xF0,0xFF,0x03,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x24,0x10,0x43,0x00, +0x4C,0x00,0xE3,0x34, +0x01,0x00,0x42,0x34, +0x00,0x00,0x65,0xA0, +0x64,0x03,0xE4,0x34, +0x07,0x00,0x03,0x24, +0x20,0x00,0xBD,0x27, +0x30,0x1F,0x02,0xAD, +0x00,0x00,0x83,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x15,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0xB8,0x19,0x00,0x08, +0x00,0x00,0x00,0x00, +0x13,0x0F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x70,0x19,0x00,0x08, +0x00,0x00,0x00,0x00, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0xB0,0x19,0x00,0x08, +0x02,0x80,0x03,0x3C, +0xCD,0x4E,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x94,0x19,0x00,0x08, +0x30,0x1F,0x30,0x26, +0x0C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x17,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x24,0x08,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x02,0x63,0x30, +0x15,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x05,0x00,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x82,0x21,0x03,0x00, +0x28,0x00,0x82,0x10, +0xF5,0xFF,0x02,0x24, +0x02,0x00,0x82,0x28, +0x3B,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x2F,0x00,0x82,0x10, +0xE9,0xFF,0x02,0x24, +0x03,0x00,0x02,0x24, +0x24,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x05,0x00,0xC2,0x24, +0x04,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x42,0x10,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x96,0xFF,0x42,0x24, +0x05,0x00,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x60,0x00,0x64,0x30, +0x42,0x21,0x04,0x00, +0x0F,0x00,0x82,0x10, +0x1F,0x00,0x62,0x30, +0x02,0x00,0x82,0x28, +0x1F,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x16,0x00,0x82,0x10, +0x1F,0x00,0x62,0x30, +0x03,0x00,0x02,0x24, +0xEC,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x62,0x30, +0x40,0x10,0x02,0x00, +0xDD,0xFF,0x03,0x24, +0x23,0x30,0x62,0x00, +0x08,0x00,0xE0,0x03, +0x05,0x00,0xC2,0x24, +0x40,0x10,0x02,0x00, +0xF5,0xFF,0x03,0x24, +0x2A,0x1A,0x00,0x08, +0x23,0x30,0x62,0x00, +0x3E,0x00,0x63,0x30, +0x23,0x30,0x43,0x00, +0x08,0x00,0xE0,0x03, +0x05,0x00,0xC2,0x24, +0x3E,0x00,0x63,0x30, +0xDD,0xFF,0x02,0x24, +0x32,0x1A,0x00,0x08, +0x23,0x30,0x43,0x00, +0x40,0x10,0x02,0x00, +0xE9,0xFF,0x03,0x24, +0x2A,0x1A,0x00,0x08, +0x23,0x30,0x62,0x00, +0x3E,0x00,0x63,0x30, +0x32,0x1A,0x00,0x08, +0x23,0x30,0x43,0x00, +0xD1,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x62,0x30, +0x40,0x10,0x02,0x00, +0xF8,0xFF,0x03,0x24, +0x2A,0x1A,0x00,0x08, +0x23,0x30,0x62,0x00, +0xCA,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x3E,0x00,0x63,0x30, +0xF8,0xFF,0x02,0x24, +0x32,0x1A,0x00,0x08, +0x23,0x30,0x43,0x00, +0x63,0x00,0x82,0x24, +0x77,0x00,0x42,0x2C, +0x00,0x00,0x85,0x28, +0x04,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x64,0x00,0x82,0x24, +0x64,0x00,0x03,0x24, +0x0B,0x18,0x45,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x80,0x09,0x3C, +0x30,0x1F,0x28,0x25, +0x80,0x36,0x06,0x8D, +0xFF,0xFF,0x02,0x34, +0x3F,0x00,0xC2,0x10, +0x21,0x38,0x80,0x00, +0x2B,0x10,0xC7,0x00, +0x30,0x00,0x40,0x10, +0x02,0x19,0x06,0x00, +0x21,0x10,0xC7,0x00, +0x23,0x10,0x43,0x00, +0x10,0x00,0x46,0x24, +0x80,0x36,0x06,0xAD, +0x30,0x1F,0x26,0x25, +0x04,0x00,0xC4,0x8C, +0x84,0x36,0x02,0xAD, +0xFF,0xFF,0x02,0x34, +0x2F,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x87,0x00, +0x1F,0x00,0x40,0x10, +0x02,0x19,0x04,0x00, +0x21,0x10,0x87,0x00, +0x23,0x10,0x43,0x00, +0x10,0x00,0x44,0x24, +0x04,0x00,0xC4,0xAC, +0x84,0x36,0xC2,0xAC, +0xC0,0x10,0x05,0x00, +0x21,0x10,0x45,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0x30,0x1F,0x23,0x25, +0x80,0x10,0x02,0x00, +0x21,0x28,0x43,0x00, +0x0C,0x24,0xA6,0x8C, +0x00,0x21,0x07,0x00, +0xFF,0xFF,0xC2,0x38, +0x0A,0x30,0x82,0x00, +0x2B,0x18,0xC7,0x00, +0x07,0x00,0x60,0x10, +0x21,0x10,0xC7,0x00, +0x02,0x19,0x06,0x00, +0x23,0x10,0x43,0x00, +0x10,0x00,0x46,0x24, +0x0C,0x24,0xA6,0xAC, +0x08,0x00,0xE0,0x03, +0x10,0x24,0xA2,0xAC, +0x02,0x19,0x06,0x00, +0x23,0x10,0x43,0x00, +0x0C,0x24,0xA2,0xAC, +0x08,0x00,0xE0,0x03, +0x10,0x24,0xA2,0xAC, +0x21,0x10,0x87,0x00, +0x23,0x10,0x43,0x00, +0x70,0x1A,0x00,0x08, +0x04,0x00,0xC2,0xAC, +0x21,0x10,0xC7,0x00, +0x30,0x1F,0x26,0x25, +0x04,0x00,0xC4,0x8C, +0x23,0x10,0x43,0x00, +0x80,0x36,0x02,0xAD, +0x84,0x36,0x02,0xAD, +0xFF,0xFF,0x02,0x34, +0xD4,0xFF,0x82,0x14, +0x2B,0x10,0x87,0x00, +0x00,0x21,0x07,0x00, +0x69,0x1A,0x00,0x08, +0x04,0x00,0xC4,0xAC, +0x00,0x31,0x04,0x00, +0x5C,0x1A,0x00,0x08, +0x80,0x36,0x06,0xAD, +0xA0,0xFF,0xBD,0x27, +0x54,0x00,0xB7,0xAF, +0x5C,0x00,0xBF,0xAF, +0x58,0x00,0xBE,0xAF, +0x50,0x00,0xB6,0xAF, +0x4C,0x00,0xB5,0xAF, +0x48,0x00,0xB4,0xAF, +0x44,0x00,0xB3,0xAF, +0x40,0x00,0xB2,0xAF, +0x3C,0x00,0xB1,0xAF, +0x38,0x00,0xB0,0xAF, +0x02,0x80,0x17,0x3C, +0x02,0x80,0x02,0x3C, +0x64,0x57,0x45,0x8C, +0x00,0x80,0x04,0x3C, +0x74,0x6A,0x83,0x24, +0x64,0x57,0x44,0x24, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x7F,0x00,0xA4,0x10, +0x02,0x80,0x09,0x3C, +0x02,0x80,0x02,0x3C, +0x40,0xEB,0x29,0x25, +0x44,0xEB,0x42,0x24, +0x00,0x00,0x35,0x8D, +0x00,0x00,0x53,0x8C, +0x02,0x80,0x03,0x3C, +0x48,0xEB,0x63,0x24, +0x00,0x00,0x7E,0x8C, +0x34,0x38,0xB4,0x8E, +0x21,0x20,0x00,0x00, +0x21,0xB0,0x00,0x00, +0x08,0x00,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xAE, +0x08,0x00,0x83,0x96, +0x02,0x80,0x02,0x3C, +0xB0,0x01,0x00,0x0C, +0x25,0x90,0x62,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xAC,0x1B,0xA3,0x96, +0xD0,0x37,0xA2,0x8E, +0x00,0x00,0x00,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0xC2,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0xF4,0x1A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x17,0x00,0xC7,0x90, +0x16,0x00,0xC8,0x90, +0x32,0x3B,0xA2,0x96, +0xFF,0x00,0xE3,0x30, +0x00,0x1A,0x03,0x00, +0xFF,0x00,0x05,0x31, +0x25,0x18,0x65,0x00, +0xB7,0x00,0x43,0x10, +0x24,0xE3,0x24,0x25, +0xFF,0x00,0xE2,0x30, +0xFF,0x00,0x03,0x31, +0x00,0x12,0x02,0x00, +0x25,0x10,0x43,0x00, +0x32,0x3B,0xA2,0xA6, +0x01,0x00,0xC4,0x90, +0x00,0x00,0xC2,0x90, +0x00,0x22,0x04,0x00, +0x88,0x0C,0x00,0x0C, +0x25,0x20,0x82,0x00, +0x40,0x18,0x02,0x00, +0x21,0x18,0x62,0x00, +0x80,0x18,0x03,0x00, +0x94,0xDE,0xE2,0x26, +0x21,0x18,0x62,0x00, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x40,0x00, +0x21,0x20,0x20,0x02, +0x0C,0x00,0x82,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xC2,0x02, +0x2C,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x42,0x8E, +0x21,0x88,0x40,0x02, +0x42,0x1B,0x02,0x00, +0x78,0x00,0x63,0x30, +0x02,0x26,0x02,0x00, +0xFF,0x3F,0x42,0x30, +0x21,0x10,0x43,0x00, +0x03,0x00,0x84,0x30, +0x21,0x10,0x44,0x00, +0x18,0x00,0x42,0x24, +0xFF,0xFF,0x50,0x30, +0x7F,0x00,0x02,0x32, +0x80,0x00,0x03,0x26, +0x00,0x00,0x70,0xAE, +0x02,0x00,0x40,0x10, +0x80,0xFF,0x05,0x32, +0x80,0xFF,0x65,0x30, +0x00,0x00,0x65,0xAE, +0x02,0x00,0x22,0x96, +0x21,0x18,0xC5,0x02, +0xFF,0xFF,0x76,0x30, +0x0F,0x00,0x42,0x30, +0x00,0x00,0x62,0xAE, +0x00,0x00,0x23,0x8E, +0x21,0x90,0x45,0x02, +0x42,0x13,0x03,0x00, +0x78,0x00,0x42,0x30, +0x02,0x1E,0x03,0x00, +0x21,0x10,0x51,0x00, +0x03,0x00,0x63,0x30, +0x21,0x10,0x43,0x00, +0x18,0x00,0x46,0x24, +0x00,0x00,0x66,0xAE, +0x01,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x00,0x12,0x02,0x00, +0x00,0x08,0x42,0x30, +0xB9,0xFF,0x40,0x14, +0x02,0x80,0x09,0x3C, +0x16,0x00,0xC8,0x90, +0x17,0x00,0xC7,0x90, +0xDD,0x1A,0x00,0x08, +0xFF,0x00,0xE2,0x30, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x04,0x00,0x83,0x8E, +0x00,0x00,0x82,0x8E, +0x21,0x20,0x80,0x02, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x00,0x00,0x94,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x94,0xAE, +0x00,0x60,0x90,0x40, +0x02,0x80,0x02,0x3C, +0x64,0x57,0x43,0x8C, +0x64,0x57,0x42,0x24, +0x8B,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x40,0xEB,0x63,0x24, +0x00,0x00,0x71,0x8C, +0x25,0xB0,0x10,0x3C, +0x04,0x01,0x02,0x36, +0x00,0x00,0x43,0x8C, +0xE8,0x37,0x27,0x8E, +0x00,0x00,0x00,0x00, +0xC8,0x00,0xE3,0x10, +0xEC,0x37,0x23,0xAE, +0x2B,0x10,0x67,0x00, +0xD2,0x00,0x40,0x14, +0x2B,0x10,0xE3,0x00, +0x08,0x01,0x40,0x14, +0x02,0x80,0x09,0x3C, +0x30,0x1F,0x24,0x25, +0xBC,0x37,0x83,0x94, +0x02,0x80,0x02,0x3C, +0x21,0x80,0x00,0x00, +0x2F,0x00,0xC0,0x1A, +0x25,0xA8,0x62,0x00, +0x21,0x98,0x80,0x00, +0x21,0x90,0x00,0x00, +0x01,0x00,0x1E,0x24, +0x21,0x88,0x55,0x02, +0x00,0x00,0x22,0x8E, +0x98,0x3E,0x63,0x8E, +0xFF,0x3F,0x42,0x30, +0x21,0x18,0x62,0x00, +0x98,0x3E,0x63,0xAE, +0x00,0x60,0x04,0x40, +0x01,0x00,0x81,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD4,0x1E,0x62,0x8E, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD4,0x1E,0x62,0xAE, +0x00,0x60,0x84,0x40, +0x04,0x00,0x22,0x8E, +0x02,0x00,0x03,0x24, +0x02,0x17,0x02,0x00, +0x03,0x00,0x42,0x30, +0x39,0x00,0x43,0x10, +0x02,0x80,0x03,0x3C, +0x21,0x10,0x55,0x02, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x60,0x10, +0x01,0x00,0x02,0x26, +0x04,0x00,0x22,0x8E, +0x00,0xF0,0x03,0x3C, +0x00,0x20,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x10,0x00,0x44,0x10, +0x02,0x80,0x09,0x3C, +0x06,0x00,0x02,0x26, +0x00,0x00,0x23,0x8E, +0xFF,0xFF,0x50,0x30, +0x82,0x16,0x03,0x00, +0x01,0x00,0x42,0x30, +0x52,0x00,0x5E,0x10, +0x02,0x80,0x04,0x3C, +0x80,0x90,0x10,0x00, +0x2A,0x10,0x56,0x02, +0xD7,0xFF,0x40,0x14, +0x21,0x88,0x55,0x02, +0x3D,0x24,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x08,0x1C,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x40,0xEB,0x29,0x25, +0x00,0x00,0x25,0x8D, +0x00,0x00,0x00,0x00, +0xD4,0x1D,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD4,0x1D,0xA2,0xAC, +0x0C,0x00,0x24,0x8E, +0x0C,0x00,0x02,0x24, +0x3F,0x00,0x83,0x30, +0xBD,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x02,0x24, +0xB3,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x83,0x30, +0x0E,0x00,0x02,0x24, +0xE0,0xFF,0x62,0x14, +0x06,0x00,0x02,0x26, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xE0,0x1D,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x69,0x1B,0x00,0x08, +0xE0,0x1D,0x62,0xAC, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0x1A,0x00,0x08, +0x00,0x00,0x00,0x00, +0xF4,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0xC6,0xFF,0x40,0x10, +0x21,0x10,0x55,0x02, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xF4,0x5E,0x62,0x90, +0x02,0x80,0x04,0x3C, +0xF8,0xE8,0x85,0x24, +0xFF,0x00,0x42,0x30, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x24,0x8E, +0x04,0x00,0x25,0x8E, +0x09,0xF8,0x60,0x00, +0x00,0x00,0x00,0x00, +0x02,0x80,0x09,0x3C, +0xF6,0x5E,0x22,0x91, +0x0C,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x10, +0x02,0x80,0x03,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x5F,0x1B,0x00,0x08, +0x21,0x10,0x55,0x02, +0x0D,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x13,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x13,0x5F,0x82,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x5F,0x1B,0x00,0x08, +0x21,0x10,0x55,0x02, +0x30,0x1F,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x0F,0x00,0x42,0x30, +0x05,0x00,0x5E,0x10, +0xC2,0x13,0x03,0x00, +0x1E,0x00,0x42,0x30, +0x21,0x10,0x50,0x00, +0x70,0x1B,0x00,0x08, +0xFF,0xFF,0x50,0x30, +0x02,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0x1C,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x14,0x03,0x00, +0x0F,0x00,0x42,0x30, +0x14,0x00,0x40,0x14, +0x02,0x17,0x03,0x00, +0x03,0x00,0x44,0x30, +0x08,0x00,0x80,0x10, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0x62,0x00, +0x0E,0x00,0x40,0x14, +0x03,0x00,0x02,0x24, +0x0C,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x80,0x28,0x10,0x00, +0x21,0x28,0xB5,0x00, +0xF7,0x19,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x21,0x20,0x40,0x00, +0x56,0x1A,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x02,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0x8B,0x00,0x5E,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x63,0x92, +0x02,0x00,0x02,0x24, +0x71,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0x08,0x00,0x7E,0x10, +0xD0,0x02,0x02,0x24, +0x00,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0xC2,0x13,0x03,0x00, +0x1E,0x00,0x42,0x30, +0x21,0x10,0x50,0x00, +0x70,0x1B,0x00,0x08, +0xFF,0xFF,0x50,0x30, +0x80,0x36,0x62,0xAE, +0x00,0x00,0x23,0x8E, +0xFA,0x1B,0x00,0x08, +0xC2,0x13,0x03,0x00, +0x02,0x80,0x09,0x3C, +0x00,0x01,0x02,0x36, +0x30,0x1F,0x29,0x25, +0x00,0x00,0x47,0xAC, +0xE8,0x37,0x27,0xAD, +0x02,0x80,0x02,0x3C, +0x08,0x04,0x44,0x24, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xAA,0x1A,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xF0,0x37,0x22,0x8E, +0xFF,0xFF,0x73,0x30, +0x23,0x10,0x47,0x00, +0xFF,0xFF,0x52,0x30, +0x21,0x18,0x53,0x02, +0xFF,0xFF,0x76,0x30, +0x25,0x24,0x00,0x0C, +0x21,0x20,0xC0,0x02, +0xEF,0xFF,0x40,0x10, +0x21,0xA0,0x40,0x00, +0x08,0x00,0x42,0x8C, +0xE8,0x37,0x26,0x8E, +0x21,0x38,0x40,0x02, +0x21,0x18,0x56,0x00, +0xB8,0x37,0x23,0xAE, +0x21,0x28,0x40,0x00, +0x08,0x00,0x04,0x24, +0xBC,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xB0,0x01,0x00,0x0C, +0x08,0x00,0x04,0x24, +0xBC,0x37,0x25,0x8E, +0x24,0x10,0x02,0x3C, +0x00,0x01,0x10,0x36, +0x00,0x00,0x02,0xAE, +0x21,0x38,0x60,0x02, +0x21,0x28,0xB2,0x00, +0x08,0x00,0x04,0x24, +0x24,0x10,0x06,0x3C, +0xE8,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xEC,0x37,0x23,0x8E, +0x08,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0xE8,0x37,0x23,0xAE, +0xE8,0x37,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0xAE, +0x40,0x1B,0x00,0x08, +0x02,0x80,0x09,0x3C, +0xDC,0x1D,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xDC,0x1D,0xA2,0xAC, +0x0C,0x00,0x24,0x8E, +0x88,0x1B,0x00,0x08, +0x3F,0x00,0x83,0x30, +0xD8,0x1D,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xD8,0x1D,0xA2,0xAC, +0x0C,0x00,0x24,0x8E, +0x84,0x1B,0x00,0x08, +0x3F,0x00,0x83,0x30, +0x23,0x10,0x67,0x00, +0xFF,0xFF,0x56,0x30, +0x25,0x24,0x00,0x0C, +0x21,0x20,0xC0,0x02, +0x4A,0x00,0x40,0x10, +0x21,0xA0,0x40,0x00, +0x08,0x00,0x42,0x8C, +0xE8,0x37,0x26,0x8E, +0x08,0x00,0x04,0x24, +0x21,0x18,0x56,0x00, +0xB8,0x37,0x23,0xAE, +0x21,0x28,0x40,0x00, +0x21,0x38,0xC0,0x02, +0xBC,0x37,0x22,0xAE, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xEC,0x37,0x23,0x8E, +0x08,0x00,0x04,0x24, +0xB0,0x01,0x00,0x0C, +0xE8,0x37,0x23,0xAE, +0xE8,0x37,0x23,0x8E, +0x00,0x01,0x02,0x36, +0x00,0x00,0x43,0xAC, +0x40,0x1B,0x00,0x08, +0x02,0x80,0x09,0x3C, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x14,0x03,0x00, +0x0F,0x00,0x42,0x30, +0x08,0x00,0x42,0x28, +0x8B,0xFF,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x02,0x17,0x03,0x00, +0x03,0x00,0x42,0x30, +0x86,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x80,0x28,0x10,0x00, +0x21,0x28,0xB5,0x00, +0xF7,0x19,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x21,0x20,0x40,0x00, +0x56,0x1A,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xF1,0x1B,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x14,0x03,0x00, +0x0F,0x00,0x42,0x30, +0x08,0x00,0x42,0x28, +0x06,0x00,0x40,0x10, +0x00,0xC0,0x02,0x3C, +0x02,0x17,0x03,0x00, +0x03,0x00,0x42,0x30, +0x0C,0x00,0x40,0x10, +0x80,0x28,0x10,0x00, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0x62,0x00, +0x68,0xFF,0x40,0x14, +0x02,0x17,0x03,0x00, +0x03,0x00,0x42,0x30, +0x03,0x00,0x03,0x24, +0x64,0xFF,0x43,0x10, +0x00,0x00,0x00,0x00, +0x62,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x80,0x28,0x10,0x00, +0x21,0x28,0xB5,0x00, +0xF7,0x19,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x4C,0x1A,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x21,0x20,0x40,0x00, +0x56,0x1A,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xEC,0x1B,0x00,0x08, +0x00,0x00,0x00,0x00, +0xEC,0x37,0x23,0x8E, +0x00,0x01,0x02,0x36, +0x00,0x00,0x43,0xAC, +0x07,0x1C,0x00,0x08, +0xE8,0x37,0x23,0xAE, +0xB8,0xFF,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x28,0x00,0xB2,0xAF, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x44,0x00,0x63,0x34, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x0E,0x00,0x40,0x04, +0x18,0x00,0xA0,0xAF, +0x21,0x20,0x60,0x00, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0x64,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0xF6,0xFF,0x41,0x04, +0x21,0x10,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x43,0x8C, +0x00,0x80,0x06,0x3C, +0x6C,0x72,0xC2,0x24, +0x25,0xB0,0x05,0x3C, +0x02,0x80,0x06,0x3C, +0x18,0x03,0xA4,0x34, +0x74,0x57,0xD2,0x24, +0x00,0x00,0x82,0xAC, +0x67,0x00,0x72,0x10, +0x01,0x00,0x16,0x24, +0x11,0x11,0x02,0x3C, +0x2A,0xB0,0x03,0x3C, +0x22,0x22,0x5E,0x34, +0x02,0x80,0x02,0x3C, +0x21,0xB8,0x80,0x00, +0x05,0x00,0x74,0x34, +0x30,0x1F,0x55,0x24, +0x01,0x00,0x13,0x24, +0x00,0x00,0xFE,0xAE, +0x21,0x00,0xC0,0x12, +0x2A,0xB0,0x03,0x3C, +0x02,0x80,0x03,0x3C, +0xF4,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x40,0x10, +0x21,0xB0,0x00,0x00, +0x01,0x00,0x06,0x24, +0x18,0x00,0xA6,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x5F,0x00,0x40,0x14, +0x04,0x00,0x04,0x24, +0x02,0x80,0x06,0x3C, +0xDE,0x5D,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x55,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2A,0xB0,0x03,0x3C, +0x06,0x00,0x63,0x34, +0x00,0x00,0x62,0x94, +0x44,0x38,0xB1,0x8E, +0x25,0xB0,0x06,0x3C, +0xB0,0x03,0xC6,0x34, +0x00,0xFF,0x42,0x30, +0x00,0x00,0xD1,0xAC, +0x0F,0x00,0x40,0x18, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x4C,0xEB,0x42,0x24, +0x50,0xEB,0x63,0x24, +0x00,0x00,0x45,0x8C, +0x00,0x00,0x64,0x8C, +0x02,0x80,0x06,0x3C, +0x54,0xEB,0xC6,0x24, +0x00,0x00,0xC3,0x8C, +0x00,0x00,0xA4,0xAC, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x42,0x30, +0xFB,0xFF,0x40,0x1C, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x07,0x00,0x62,0x30, +0x47,0x00,0x40,0x14, +0x08,0x00,0x62,0x24, +0xC2,0x10,0x03,0x00, +0x08,0x00,0x25,0x8E, +0x04,0x37,0xA6,0x8E, +0xC0,0x10,0x02,0x00, +0x20,0x00,0x42,0x24, +0xFF,0xFF,0x47,0x30, +0x01,0x00,0x04,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB3,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x02,0x00,0x02,0x24, +0x00,0x00,0x93,0xA2, +0x00,0x00,0x82,0xA2, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x04,0x00,0x23,0x8E, +0x00,0x00,0x22,0x8E, +0x21,0x20,0x20,0x02, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x00,0x00,0x31,0xAE, +0x3D,0x24,0x00,0x0C, +0x04,0x00,0x31,0xAE, +0x00,0x60,0x90,0x40, +0x00,0x00,0x42,0x8E, +0x00,0x00,0x00,0x00, +0xA3,0xFF,0x52,0x14, +0x00,0x00,0x00,0x00, +0x18,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x07,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF4,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x11,0x00,0x40,0x14, +0x18,0x00,0xA0,0xAF, +0x02,0x80,0x02,0x3C, +0x08,0x08,0x44,0x24, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xBC,0x1C,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x9B,0x30,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xEA,0x1C,0x00,0x08, +0x00,0x08,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0xE4,0x1C,0x00,0x08, +0x02,0x80,0x06,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x06,0x3C, +0xF5,0x5E,0xC4,0x90, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x36,0x1D,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x0E,0x1D,0x00,0x08, +0xC2,0x10,0x02,0x00, +0x10,0x00,0xE0,0x18, +0x21,0x18,0x00,0x00, +0x00,0x00,0xC0,0xAC, +0x21,0x40,0x00,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x45,0x10, +0x21,0x18,0x80,0x00, +0x01,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x21,0x18,0x48,0x00, +0x02,0x00,0x68,0x24, +0x21,0x10,0x82,0x00, +0x2B,0x18,0x07,0x01, +0xF5,0xFF,0x60,0x14, +0x02,0x00,0x44,0x24, +0x21,0x18,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x01,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x80,0x07,0x3C, +0x30,0x1F,0xE5,0x24, +0x22,0x3E,0xA3,0x90, +0xFF,0x00,0x84,0x30, +0x80,0x10,0x04,0x00, +0x0C,0x00,0x60,0x14, +0x21,0x30,0x45,0x00, +0xC8,0x00,0x02,0x24, +0x24,0x39,0xA2,0xAC, +0x01,0x00,0x03,0x24, +0x30,0x1F,0xE2,0x24, +0x04,0x18,0x83,0x00, +0x4C,0x3E,0xA4,0xA0, +0x22,0x3E,0x44,0x90, +0x00,0x00,0x00,0x00, +0x25,0x18,0x64,0x00, +0x08,0x00,0xE0,0x03, +0x22,0x3E,0x43,0xA0, +0x24,0x39,0xA3,0x8C, +0xC8,0x00,0x02,0x24, +0x23,0x10,0x43,0x00, +0x24,0x3E,0xC2,0xAC, +0x01,0x00,0x03,0x24, +0x30,0x1F,0xE2,0x24, +0x04,0x18,0x83,0x00, +0x22,0x3E,0x44,0x90, +0x00,0x00,0x00,0x00, +0x25,0x18,0x64,0x00, +0x08,0x00,0xE0,0x03, +0x22,0x3E,0x43,0xA0, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xBF,0xAF, +0x30,0x1F,0x25,0x26, +0x4C,0x3E,0xA6,0x90, +0x01,0x00,0x02,0x24, +0x04,0x10,0xC2,0x00, +0x06,0x00,0x40,0x14, +0xC9,0x00,0x10,0x24, +0x1A,0x3E,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x23,0x00,0x40,0x14, +0x21,0x20,0xC5,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x46,0x24, +0x21,0x20,0x00,0x00, +0x24,0x3E,0xC5,0x24, +0x00,0x00,0xA2,0x8C, +0x04,0x00,0xA5,0x24, +0x05,0x00,0x40,0x10, +0x2B,0x18,0x50,0x00, +0x03,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x80,0x40,0x00, +0x4C,0x3E,0xC4,0xA0, +0x01,0x00,0x84,0x24, +0x08,0x00,0x82,0x2C, +0xF5,0xFF,0x40,0x14, +0xC9,0x00,0x02,0x24, +0x21,0x00,0x02,0x12, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x45,0x24, +0x07,0x00,0x04,0x24, +0x24,0x3E,0xA2,0x8C, +0xFF,0xFF,0x84,0x24, +0x02,0x00,0x40,0x10, +0x23,0x18,0x50,0x00, +0x24,0x3E,0xA3,0xAC, +0xFA,0xFF,0x81,0x04, +0x04,0x00,0xA5,0x24, +0x30,0x1F,0x22,0x26, +0x24,0x39,0x50,0xAC, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x44,0x3E,0x83,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x63,0x24, +0xFF,0x00,0x62,0x30, +0x03,0x00,0x42,0x2C, +0xD8,0xFF,0x40,0x10, +0x44,0x3E,0x83,0xA0, +0x80,0x18,0x06,0x00, +0x21,0x18,0x65,0x00, +0xC8,0x00,0x02,0x24, +0x03,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x90,0x14,0x00,0x0C, +0x24,0x3E,0x62,0xAC, +0x9C,0x1D,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x22,0x26, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x20,0x00,0xBD,0x27, +0x22,0x3E,0x40,0xA0, +0x08,0x00,0xE0,0x03, +0x24,0x39,0x40,0xAC, +0xB8,0xFF,0xBD,0x27, +0x02,0x80,0x08,0x3C, +0x02,0x80,0x0B,0x3C, +0x02,0x80,0x0C,0x3C, +0x40,0x00,0xBF,0xAF, +0x3C,0x00,0xB5,0xAF, +0x38,0x00,0xB4,0xAF, +0x34,0x00,0xB3,0xAF, +0x30,0x00,0xB2,0xAF, +0x2C,0x00,0xB1,0xAF, +0x28,0x00,0xB0,0xAF, +0x40,0xED,0x63,0x25, +0x3C,0xED,0x02,0x25, +0x44,0xED,0x84,0x25, +0x01,0x00,0x45,0x90, +0x01,0x00,0x66,0x90, +0x01,0x00,0x87,0x90, +0x3C,0xED,0x0F,0x91, +0x02,0x00,0x4A,0x90, +0x40,0xED,0x6E,0x91, +0x02,0x00,0x69,0x90, +0x44,0xED,0x8D,0x91, +0x02,0x00,0x88,0x90, +0x03,0x00,0x4B,0x90, +0x03,0x00,0x6C,0x90, +0x03,0x00,0x82,0x90, +0x00,0x2A,0x05,0x00, +0x00,0x32,0x06,0x00, +0x00,0x3A,0x07,0x00, +0x25,0x28,0xAF,0x00, +0x25,0x30,0xCE,0x00, +0x25,0x38,0xED,0x00, +0x00,0x54,0x0A,0x00, +0x00,0x4C,0x09,0x00, +0x00,0x44,0x08,0x00, +0x25,0x50,0x45,0x01, +0x25,0x48,0x26,0x01, +0x25,0x40,0x07,0x01, +0x00,0x5E,0x0B,0x00, +0x00,0x66,0x0C,0x00, +0x00,0x16,0x02,0x00, +0x02,0x80,0x04,0x3C, +0x25,0x58,0x6A,0x01, +0x25,0x60,0x89,0x01, +0x25,0x10,0x48,0x00, +0x84,0x58,0x84,0x24, +0x10,0x00,0xAB,0xAF, +0x18,0x00,0xAC,0xAF, +0x34,0x4F,0x00,0x0C, +0x20,0x00,0xA2,0xAF, +0x10,0x00,0x42,0x30, +0x29,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x13,0x3C, +0x30,0x1F,0x63,0x26, +0xC4,0x39,0x62,0x8C, +0x0C,0x00,0x10,0x24, +0x2B,0x10,0x02,0x02, +0x2C,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x58,0x51,0x24, +0x02,0x59,0x72,0x24, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xFA,0x58,0x54,0x24, +0x26,0x1E,0x00,0x08, +0x06,0x59,0x75,0x24, +0xDD,0x00,0x02,0x24, +0x21,0x20,0x14,0x02, +0x2B,0x00,0x62,0x10, +0x10,0x00,0xA5,0x27, +0x21,0x10,0x11,0x02, +0x01,0x00,0x43,0x90, +0x30,0x1F,0x64,0x26, +0xC4,0x39,0x82,0x8C, +0x21,0x18,0x70,0x00, +0x02,0x00,0x70,0x24, +0x2B,0x10,0x02,0x02, +0x17,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x10,0x11,0x02, +0x00,0x00,0x43,0x90, +0x30,0x00,0x02,0x24, +0x21,0x20,0x12,0x02, +0x20,0x00,0xA5,0x27, +0xED,0xFF,0x62,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEE,0xFF,0x40,0x14, +0x21,0x10,0x11,0x02, +0x01,0x00,0x03,0x24, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x40,0x00,0xBF,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x21,0x18,0x00,0x00, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x20,0x15,0x02, +0x18,0x00,0xA5,0x27, +0xD1,0xFF,0x40,0x14, +0x04,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xCE,0xFF,0x40,0x14, +0x21,0x10,0x11,0x02, +0x32,0x1E,0x00,0x08, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x38,0x5D,0x43,0x94, +0x00,0x00,0x00,0x00, +0x80,0x18,0x03,0x00, +0xB8,0x0B,0x62,0x28, +0x04,0x00,0x40,0x14, +0xB8,0x0B,0x04,0x24, +0x21,0x4E,0x62,0x28, +0x20,0x4E,0x04,0x24, +0x0B,0x20,0x62,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x21,0x38,0x80,0x00, +0x08,0x00,0xC0,0x10, +0xFF,0xFF,0xC3,0x24, +0xFF,0xFF,0x06,0x24, +0x00,0x00,0xA2,0x8C, +0xFF,0xFF,0x63,0x24, +0x04,0x00,0xA5,0x24, +0x00,0x00,0xE2,0xAC, +0xFB,0xFF,0x66,0x14, +0x04,0x00,0xE7,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x25,0xB0,0x03,0x3C, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x94,0x0E,0x65,0x34, +0x9C,0x0E,0x66,0x34, +0xA4,0x0E,0x67,0x34, +0xAC,0x0E,0x68,0x34, +0x02,0x80,0x02,0x3C, +0x00,0x00,0xA9,0x8C, +0x30,0x1F,0x58,0x24, +0x00,0x00,0xCC,0x8C, +0x00,0x00,0xF1,0x8C, +0x00,0x00,0x05,0x8D, +0x0C,0x00,0x07,0x8F, +0x10,0x00,0x08,0x8F, +0xFF,0x03,0x0A,0x3C, +0xB4,0x0E,0x62,0x34, +0x00,0x00,0x4B,0x8C, +0x24,0x48,0x2A,0x01, +0x00,0xFC,0x02,0x24, +0x24,0x28,0xAA,0x00, +0xBC,0x0E,0x66,0x34, +0x24,0x40,0x02,0x01, +0x02,0x4C,0x09,0x00, +0x24,0x38,0xE2,0x00, +0x02,0x2C,0x05,0x00, +0xF0,0xFF,0x02,0x3C, +0x00,0x00,0xD0,0x8C, +0xFF,0x03,0x42,0x34, +0xCC,0x0E,0x66,0x34, +0x25,0x38,0xE9,0x00, +0xC4,0x0E,0x63,0x34, +0x25,0x40,0x05,0x01, +0x08,0x00,0x0D,0x8F, +0x00,0x00,0x6F,0x8C, +0x24,0x40,0x02,0x01, +0x00,0x00,0xCE,0x8C, +0x24,0x38,0xE2,0x00, +0x24,0x60,0x8A,0x01, +0x24,0x58,0x6A,0x01, +0xFF,0x9F,0x02,0x3C, +0x82,0x61,0x0C,0x00, +0x82,0x59,0x0B,0x00, +0xFF,0xFF,0x42,0x34, +0x0F,0xC0,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x25,0x38,0xEC,0x00, +0x25,0x40,0x0B,0x01, +0x24,0x68,0xA2,0x01, +0xFF,0x00,0x0B,0x3C, +0x00,0xFF,0x82,0x30, +0x24,0x88,0x2A,0x02, +0x24,0x80,0x0A,0x02, +0x24,0x18,0x8B,0x00, +0x24,0x40,0x05,0x01, +0x21,0x48,0x80,0x00, +0x02,0x62,0x02,0x00, +0x24,0x38,0xE5,0x00, +0x00,0x20,0x02,0x3C, +0x24,0x70,0xCA,0x01, +0x00,0x89,0x11,0x00, +0x00,0x81,0x10,0x00, +0x24,0x78,0xEA,0x01, +0x00,0xFF,0x6B,0x35, +0x25,0x68,0xA2,0x01, +0x02,0x1C,0x03,0x00, +0x02,0x80,0x04,0x3C, +0x25,0x38,0xF1,0x00, +0x25,0x40,0x10,0x01, +0x02,0x7C,0x0F,0x00, +0x02,0x74,0x0E,0x00, +0x24,0x48,0x2B,0x01, +0xDC,0xE3,0x84,0x24, +0x21,0x28,0x80,0x01, +0x21,0x30,0x60,0x00, +0x12,0x00,0x02,0x24, +0x08,0x00,0x0D,0xAF, +0x0C,0x00,0x07,0xAF, +0x10,0x00,0x08,0xAF, +0x14,0x00,0x0F,0xA7, +0x0A,0x00,0x20,0x15, +0x16,0x00,0x0E,0xA7, +0x10,0x00,0xA4,0x27, +0xC7,0x02,0x02,0xA3, +0xC8,0x5C,0x00,0x0C, +0xC3,0x02,0x02,0xA3, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xC7,0x02,0x03,0xA3, +0x2F,0x55,0x00,0x0C, +0xC3,0x02,0x0C,0xA3, +0xC8,0x5C,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x28,0x00,0xB6,0xAF, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x16,0x3C, +0x48,0x7B,0xC3,0x26, +0x18,0x03,0x42,0x34, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x34,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x43,0xAC, +0x21,0x98,0x00,0x00, +0x02,0x80,0x15,0x3C, +0x00,0x80,0x1E,0x3C, +0x02,0x80,0x14,0x3C, +0x02,0x80,0x17,0x3C, +0x25,0xB0,0x10,0x3C, +0x18,0x03,0x02,0x36, +0x48,0x7B,0xC3,0x26, +0x00,0x00,0x43,0xAC, +0x30,0x1F,0xB1,0x26, +0x7C,0x36,0x24,0x96, +0x70,0x03,0x05,0x36, +0x00,0x00,0xB2,0x8C, +0x01,0x00,0x84,0x24, +0x03,0x00,0x40,0x12, +0x7C,0x36,0x24,0xA6, +0x01,0x00,0x62,0x26, +0xFF,0xFF,0x53,0x30, +0xFF,0x00,0x04,0x3C, +0xFF,0xFF,0x82,0x34, +0x2B,0x10,0x52,0x00, +0x47,0x00,0x40,0x10, +0x00,0x50,0x62,0x2E, +0x00,0xFF,0x06,0x3C, +0xFF,0x00,0xC2,0x34, +0x00,0xFD,0x05,0x3C, +0x24,0x18,0x42,0x02, +0x29,0x00,0xA2,0x34, +0xA7,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x46,0x00,0x40,0x14, +0xAC,0x00,0xA2,0x34, +0x00,0xF2,0x06,0x3C, +0x01,0x00,0xC2,0x34, +0xB8,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x7D,0x00,0x40,0x14, +0x07,0x00,0xA2,0x34, +0x00,0xF0,0x05,0x3C, +0x03,0x00,0xA2,0x34, +0xD5,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0xC8,0x00,0x40,0x14, +0x00,0xF1,0x07,0x3C, +0x21,0x02,0x65,0x10, +0x00,0xFF,0x82,0x34, +0x2B,0x10,0xA3,0x00, +0x48,0x01,0x40,0x14, +0x01,0x00,0xA2,0x34, +0x00,0xE0,0x02,0x3C, +0x73,0x01,0x62,0x10, +0x00,0xFF,0x48,0x32, +0x25,0xB0,0x02,0x3C, +0x70,0x03,0x42,0x34, +0x21,0x98,0x00,0x00, +0x00,0x00,0x40,0xAC, +0x25,0xB0,0x04,0x3C, +0x18,0x03,0x82,0x34, +0x48,0x7C,0xC3,0x27, +0x00,0x00,0x43,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x6C,0x57,0x82,0x8E, +0x6C,0x57,0x83,0x26, +0x10,0x00,0x43,0x10, +0x02,0x80,0x02,0x3C, +0xBF,0x00,0x92,0x34, +0x30,0x1F,0x51,0x24, +0x21,0x80,0x60,0x00, +0x00,0x00,0x42,0x92, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x2C, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x3C,0x38,0x24,0x8E, +0xB4,0x08,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x6C,0x57,0x83,0x8E, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x70,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x21,0x28,0x00,0x00, +0x08,0x10,0xE4,0x26, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xE8,0x1E,0x00,0x08, +0x25,0xB0,0x10,0x3C, +0xDA,0xFF,0x40,0x14, +0x74,0x03,0x03,0x36, +0xFF,0xFF,0x02,0x24, +0x21,0x98,0x00,0x00, +0x00,0x00,0xA0,0xAC, +0x00,0x00,0x62,0xAC, +0x1B,0x1F,0x00,0x08, +0x25,0xB0,0x04,0x3C, +0x84,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x1E,0x00,0x40,0x14, +0x00,0xFE,0x07,0x3C, +0xA4,0x00,0xA2,0x34, +0x8F,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x47,0x00,0x40,0x14, +0xA7,0x00,0xA2,0x34, +0xA1,0x00,0xA2,0x34, +0xEA,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0xAD,0x00,0x40,0x14, +0xA2,0x00,0xA2,0x34, +0xA0,0x00,0xA2,0x34, +0xBE,0xFF,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x00,0x0F,0x42,0x32, +0x02,0x22,0x02,0x00, +0x01,0x00,0x03,0x24, +0x96,0x02,0x83,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x02,0x24, +0x8F,0x02,0x82,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x02,0x24, +0x88,0x02,0x82,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x5A,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x12,0x00,0xE2,0x34, +0x65,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x37,0x00,0x40,0x14, +0x1A,0x00,0xE2,0x34, +0xAF,0x00,0xA2,0x34, +0xC8,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x97,0x00,0x40,0x14, +0x10,0x00,0xE2,0x34, +0xAD,0x00,0xA2,0x34, +0x44,0x02,0x62,0x10, +0x00,0x00,0x00,0x00, +0xAE,0x00,0xA2,0x34, +0x9C,0xFF,0x62,0x14, +0x02,0x24,0x12,0x00, +0x00,0xFF,0x45,0x32, +0xFF,0x00,0x84,0x30, +0x58,0x5A,0x00,0x0C, +0x02,0x2A,0x05,0x00, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x62,0xA0, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x73,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x35,0x00,0x40,0x14, +0x18,0x00,0xA2,0x34, +0x00,0xF8,0x04,0x3C, +0x16,0x00,0x82,0x34, +0xB6,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x90,0x00,0x40,0x14, +0x17,0x00,0x82,0x34, +0x15,0x00,0x82,0x34, +0x84,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0xA7,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x6A,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0xB7,0x00,0x40,0x14, +0xAA,0x00,0xA2,0x34, +0xA5,0x00,0xA2,0x34, +0x35,0x02,0x62,0x10, +0x24,0x20,0x44,0x02, +0xA6,0x00,0xA2,0x34, +0x76,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0xF7,0x5B,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x75,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x80,0x00,0x40,0x14, +0x0F,0x00,0xC2,0x34, +0x18,0x00,0xE2,0x34, +0xC1,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x19,0x00,0xE2,0x34, +0x68,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xA2,0x26, +0x2A,0x1C,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x64,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x3E,0x01,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x74,0x00,0x40,0x14, +0x19,0x00,0xA2,0x34, +0x14,0x00,0xA2,0x34, +0x96,0x01,0x62,0x10, +0x17,0x00,0xA2,0x34, +0x51,0xFF,0x62,0x14, +0x25,0xB0,0x04,0x3C, +0x68,0x03,0x85,0x34, +0x00,0x00,0xA3,0x8C, +0x00,0xFF,0x42,0x32, +0x00,0x12,0x02,0x00, +0xFF,0xFF,0x73,0x30, +0x25,0x10,0x53,0x00, +0x00,0x00,0xA2,0xAC, +0x64,0x03,0x84,0x34, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x53,0x30, +0x40,0x00,0x63,0x36, +0x00,0x00,0x83,0xA0, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x02,0x00,0xE2,0x34, +0x3F,0xFF,0x62,0x10, +0x2B,0x10,0x43,0x00, +0x9B,0x00,0x40,0x14, +0x04,0x00,0xE2,0x34, +0x08,0x00,0xA2,0x34, +0xA3,0x01,0x62,0x10, +0x00,0xFF,0x42,0x32, +0x38,0xFF,0x67,0x14, +0x25,0xB0,0x04,0x3C, +0xFF,0x00,0x05,0x3C, +0x00,0xFF,0xA5,0x34, +0x24,0x28,0x45,0x02, +0x02,0x2A,0x05,0x00, +0x94,0x00,0x83,0x34, +0x40,0x11,0x05,0x00, +0x26,0xB0,0x06,0x3C, +0x00,0x00,0x65,0xA4, +0xC0,0xFF,0x53,0x24, +0x7C,0x00,0xCC,0x34, +0x04,0x00,0x07,0x24, +0x9A,0x00,0x88,0x34, +0x98,0x00,0x89,0x34, +0x96,0x00,0x8A,0x34, +0x7A,0x00,0xC6,0x34, +0xB0,0x03,0x8B,0x34, +0x00,0x04,0x02,0x24, +0xA0,0x00,0x03,0x24, +0x00,0x00,0x02,0xA5, +0x44,0x00,0x84,0x34, +0x00,0x00,0x23,0xA5, +0x00,0x00,0x47,0xA5, +0x00,0x00,0xC7,0xA0, +0x00,0x00,0x73,0xAD, +0x00,0x00,0x93,0xA5, +0x00,0x00,0x83,0x94, +0xFF,0xFD,0x02,0x24, +0x30,0x1F,0xA6,0x26, +0x24,0x18,0x62,0x00, +0x00,0x00,0x83,0xA4, +0x00,0x00,0x82,0x94, +0xBA,0x1B,0xC5,0xA4, +0x00,0x02,0x42,0x34, +0x00,0x00,0x82,0xA4, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xBF,0x01,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0xA3,0x00,0xA2,0x34, +0x10,0xFF,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xA2,0x26, +0x16,0x1F,0x00,0x08, +0x30,0x38,0x40,0xAC, +0x3A,0x01,0x62,0x10, +0x11,0x00,0xE2,0x34, +0x08,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xFF,0x00,0x04,0x3C, +0x00,0xFF,0x84,0x34, +0x24,0x20,0x44,0x02, +0x30,0x1F,0xA2,0x26, +0x02,0x22,0x04,0x00, +0xC2,0x34,0x00,0x0C, +0x2A,0x1C,0x40,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x9F,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0x18,0x00,0x82,0x34, +0xF3,0xFE,0x62,0x14, +0x00,0x00,0x00,0x00, +0x0A,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x4E,0x01,0x62,0x10, +0x10,0x00,0xC2,0x34, +0xEC,0xFE,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x00,0xFF,0x43,0x32, +0x00,0xFF,0x02,0x34, +0xDA,0xFF,0x62,0x14, +0x30,0x1F,0xA2,0x26, +0x30,0x1F,0xA3,0x26, +0xFF,0xFF,0x02,0x34, +0x16,0x1F,0x00,0x08, +0x30,0x38,0x62,0xAC, +0x96,0x01,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0x28,0x00,0xA2,0x34, +0xDE,0xFE,0x62,0x14, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x60,0x00,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0xE8,0x03,0x04,0x24, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x24,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x36, +0x1F,0x00,0x53,0x30, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x53,0xA0, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x84,0x01,0x62,0x10, +0x00,0x00,0x00,0x00, +0xAB,0x00,0xA2,0x34, +0xC1,0xFE,0x62,0x14, +0x00,0x00,0x00,0x00, +0xE6,0x5F,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x4C,0x01,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0x02,0x00,0xA2,0x34, +0xB9,0xFE,0x62,0x14, +0x25,0xB0,0x02,0x3C, +0x02,0x14,0x12,0x00, +0x00,0xFF,0x43,0x32, +0xFF,0x00,0x45,0x30, +0x04,0x00,0xA0,0x10, +0x02,0x92,0x03,0x00, +0x01,0x00,0x02,0x24, +0x02,0x00,0xA2,0x10, +0x01,0x00,0x04,0x24, +0x21,0x20,0x00,0x00, +0xE6,0x44,0x00,0x0C, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x8A,0x47,0x00,0x0C, +0x21,0x20,0x40,0x02, +0xFF,0xFF,0x10,0x36, +0x24,0x98,0x50,0x00, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x53,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x15,0x01,0x62,0x10, +0x24,0x10,0x44,0x02, +0xA0,0xFE,0x66,0x14, +0x25,0xB0,0x02,0x3C, +0x25,0xB0,0x05,0x3C, +0x74,0x03,0xA3,0x34, +0x00,0x00,0x64,0x8C, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x90,0x82,0x00, +0x01,0x00,0x03,0x3C, +0x2B,0x18,0x72,0x00, +0x95,0xFE,0x60,0x10, +0x00,0xB0,0x02,0x3C, +0x25,0x90,0x42,0x02, +0x00,0x00,0x53,0x8E, +0x78,0x03,0xA2,0x34, +0x00,0x00,0x53,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x02,0x1A,0x08,0x00, +0xFF,0x00,0x02,0x24, +0x56,0x01,0x62,0x10, +0x25,0xB0,0x05,0x3C, +0x0E,0x00,0x60,0x14, +0x00,0xCC,0x02,0x34, +0x25,0xB0,0x04,0x3C, +0x64,0x03,0x84,0x34, +0x30,0x1F,0xA7,0x26, +0x00,0x00,0x85,0x94, +0xE4,0x02,0xE6,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFE,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x24,0x28,0xA3,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x00,0x85,0xA4, +0xE4,0x02,0xE6,0xAC, +0x00,0xCC,0x02,0x34, +0x7B,0xFE,0x02,0x15, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xA5,0x26, +0xE4,0x02,0xA3,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x10,0x04,0x3C, +0x25,0x18,0x64,0x00, +0x16,0x1F,0x00,0x08, +0xE4,0x02,0xA3,0xAC, +0x02,0x14,0x12,0x00, +0x00,0x1F,0x43,0x32, +0x02,0x9A,0x03,0x00, +0x3F,0x00,0x42,0x30, +0xC1,0x02,0x22,0xA2, +0xBC,0x02,0x33,0xA2, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x76,0x2C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x98,0x40,0x00, +0x74,0x03,0x02,0x36, +0x00,0x00,0x53,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x03,0x00,0x22,0x92, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x16,0x1F,0x00,0x08, +0x03,0x00,0x22,0xA2, +0x74,0x03,0x03,0x36, +0x00,0x00,0x64,0x8C, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x90,0x82,0x00, +0x01,0x00,0x03,0x3C, +0x2B,0x18,0x72,0x00, +0x51,0xFE,0x60,0x10, +0x78,0x03,0x02,0x36, +0x00,0x00,0x53,0x8C, +0x00,0xB0,0x03,0x3C, +0x25,0x90,0x43,0x02, +0x00,0x00,0x53,0xAE, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xBE,0x59,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0x02,0x2A,0x02,0x00, +0x2B,0x1C,0x25,0xA2, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xFF,0xFF,0x02,0x34, +0x16,0x1F,0x00,0x08, +0x30,0x38,0x22,0xAE, +0x24,0x10,0x44,0x02, +0x00,0xFF,0x43,0x32, +0x02,0x2C,0x02,0x00, +0x04,0x00,0xA0,0x10, +0x02,0x92,0x03,0x00, +0x01,0x00,0x02,0x24, +0x02,0x00,0xA2,0x10, +0x01,0x00,0x04,0x24, +0x21,0x20,0x00,0x00, +0x25,0xB0,0x10,0x3C, +0xE6,0x44,0x00,0x0C, +0x74,0x03,0x10,0x36, +0x00,0x00,0x13,0x8E, +0x0F,0x00,0x11,0x3C, +0x21,0x20,0x40,0x02, +0x21,0x30,0x60,0x02, +0x5F,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x21,0x20,0x40,0x02, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x00,0x00,0x02,0xAE, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x85,0x5F,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x08,0x00,0x23,0x8E, +0xFF,0x9F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x16,0x1F,0x00,0x08, +0x08,0x00,0x23,0xAE, +0x00,0xFF,0x42,0x32, +0x24,0x18,0x44,0x02, +0x02,0x9A,0x02,0x00, +0x01,0x00,0x02,0x24, +0x95,0x00,0x62,0x12, +0x02,0x1C,0x03,0x00, +0x02,0x00,0x02,0x24, +0xA9,0x00,0x62,0x12, +0xC0,0x10,0x03,0x00, +0x03,0x00,0x02,0x24, +0x09,0xFE,0x62,0x16, +0xC0,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x02,0x80,0x04,0x3C, +0x4C,0x43,0x83,0x24, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x64,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0x02,0x2A,0x02,0x00, +0x01,0x00,0x03,0x24, +0x77,0x00,0xA3,0x10, +0x74,0x03,0x02,0x36, +0x02,0x00,0xA2,0x28, +0xB7,0x00,0x40,0x14, +0x03,0x00,0x02,0x24, +0x06,0x00,0xA2,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0xA2,0x26, +0x24,0x1C,0x44,0x94, +0x25,0xB0,0x03,0x3C, +0x18,0x21,0x00,0x08, +0x74,0x03,0x63,0x34, +0x30,0x1F,0xA2,0x26, +0x26,0x1C,0x44,0x94, +0x25,0xB0,0x03,0x3C, +0x18,0x21,0x00,0x08, +0x74,0x03,0x63,0x34, +0x24,0x10,0x42,0x02, +0x02,0x92,0x02,0x00, +0x21,0x18,0x50,0x02, +0x00,0x00,0x73,0x8C, +0x74,0x03,0x02,0x36, +0x00,0x00,0x53,0xAC, +0x00,0x00,0x73,0x8C, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xA6,0x5A,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x24,0x20,0x44,0x02, +0x56,0x25,0x00,0x0C, +0x02,0x24,0x04,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xD7,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xA3,0x26, +0x2A,0x1C,0x62,0x90, +0x00,0x00,0x00,0x00, +0x6A,0xFE,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0x02,0x2A,0x02,0x00, +0x01,0x00,0x02,0x24, +0x21,0x20,0xA0,0x00, +0x2A,0x1C,0x62,0xA0, +0xC2,0x34,0x00,0x0C, +0x2B,0x1C,0x65,0xA0, +0x1A,0x20,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x82,0x34, +0x24,0x10,0x42,0x02, +0xBB,0xFD,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0xA3,0x26, +0x04,0x03,0x66,0x90, +0x24,0x20,0x44,0x02, +0x00,0xFF,0x45,0x32, +0x02,0x24,0x04,0x00, +0x02,0x2A,0x05,0x00, +0x00,0x01,0xC6,0x34, +0xFB,0xFF,0x87,0x24, +0xFB,0xFF,0xA2,0x24, +0x1F,0x03,0x62,0xA0, +0x04,0x03,0x66,0xAC, +0x1D,0x03,0x67,0xA0, +0x1C,0x03,0x64,0xA0, +0x16,0x1F,0x00,0x08, +0x1E,0x03,0x65,0xA0, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x30,0x1F,0xA2,0x26, +0x2B,0x1C,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x74,0x03,0x63,0x34, +0x00,0x00,0x64,0xAC, +0xB8,0x1F,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xFF,0x00,0x02,0x24, +0x56,0x01,0x63,0x34, +0x00,0x00,0x62,0xA4, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x16,0x1F,0x00,0x08, +0x08,0x5E,0x44,0xA0, +0x02,0x92,0x02,0x00, +0x05,0x00,0x40,0x12, +0x21,0x20,0x00,0x00, +0x01,0x00,0x02,0x24, +0x02,0x00,0x42,0x12, +0x01,0x00,0x04,0x24, +0x21,0x20,0x00,0x00, +0xE6,0x44,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x02,0x9C,0x02,0x00, +0x00,0xFF,0x43,0x32, +0x07,0x00,0x62,0x2E, +0x88,0xFD,0x40,0x10, +0x02,0x2A,0x03,0x00, +0x02,0x80,0x04,0x3C, +0x50,0xED,0x83,0x24, +0x80,0x10,0x13,0x00, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x22,0x1C,0x23,0x96, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xC0,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x51,0x00, +0x14,0x24,0x44,0x8C, +0x74,0x03,0x03,0x36, +0x00,0x00,0x64,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0xFF,0x83,0x34, +0x74,0x03,0x44,0x34, +0x00,0x00,0x93,0x8C, +0x24,0x18,0x43,0x02, +0x02,0x92,0x03,0x00, +0x21,0x10,0x42,0x02, +0x00,0x00,0x53,0xAC, +0x00,0x00,0x53,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x93,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x51,0x00, +0x18,0x24,0x44,0x8C, +0xA4,0x21,0x00,0x08, +0x74,0x03,0x03,0x36, +0xCD,0x59,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x3D,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x45,0x8C, +0x00,0xFF,0x84,0x34, +0x24,0x20,0x44,0x02, +0xC1,0x5B,0x00,0x0C, +0x02,0x22,0x04,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x70,0x03,0x42,0x34, +0x21,0x20,0x40,0x02, +0x00,0x00,0x40,0xAC, +0x6B,0x1E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xF5,0x5B,0x00,0x0C, +0x02,0x24,0x04,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x4B,0xFF,0xA0,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0xA2,0x26, +0x20,0x1C,0x44,0x94, +0x25,0xB0,0x03,0x3C, +0x18,0x21,0x00,0x08, +0x74,0x03,0x63,0x34, +0x64,0x03,0xA5,0x34, +0x30,0x1F,0xA6,0x26, +0x00,0x00,0xA3,0x94, +0xE4,0x02,0xC4,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x82,0x00, +0x00,0x01,0x63,0x34, +0x00,0x00,0xA3,0xA4, +0x9A,0x20,0x00,0x08, +0xE4,0x02,0xC4,0xAC, +0xCD,0x5A,0x00,0x0C, +0x03,0x00,0x04,0x24, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xCD,0x5A,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0xCD,0x5A,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x36,0x03,0x64,0x94, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x00,0x00,0x44,0xAC, +0x17,0x1F,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x35,0x03,0x64,0x90, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x34,0x03,0x64,0x90, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x32,0x03,0x64,0x94, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x19,0x05,0x00, +0x30,0x1F,0xA2,0x26, +0x21,0x18,0x62,0x00, +0x30,0x03,0x64,0x94, +0xFD,0x21,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x00,0x11,0x05,0x00, +0x30,0x1F,0xA3,0x26, +0x21,0x10,0x43,0x00, +0x2C,0x03,0x44,0x8C, +0xFC,0x21,0x00,0x08, +0x42,0x26,0x04,0x00, +0x00,0x11,0x05,0x00, +0x30,0x1F,0xA3,0x26, +0x21,0x10,0x43,0x00, +0x2F,0x03,0x44,0x90, +0xFC,0x21,0x00,0x08, +0x01,0x00,0x84,0x30, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x18,0x03,0x42,0x34, +0x94,0x88,0x63,0x24, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x05,0x3C, +0xD4,0x5E,0xA5,0x8C, +0x04,0x00,0x02,0x24, +0x1E,0x00,0xA2,0x10, +0x05,0x00,0xA2,0x2C, +0x10,0x00,0x40,0x10, +0x05,0x00,0x02,0x24, +0x03,0x00,0x02,0x24, +0x08,0x00,0xA2,0x10, +0x00,0x19,0x04,0x00, +0x80,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0xC0,0x10,0x02,0x00, +0x23,0x10,0x44,0x00, +0x00,0x11,0x02,0x00, +0x21,0x10,0x44,0x00, +0x40,0x19,0x02,0x00, +0xFF,0xFF,0x63,0x24, +0xFE,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0xA2,0x10, +0x06,0x00,0x02,0x24, +0xF2,0xFF,0xA2,0x14, +0x80,0x10,0x04,0x00, +0x40,0x11,0x04,0x00, +0x23,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x00,0x19,0x02,0x00, +0x23,0x18,0x62,0x00, +0x3B,0x22,0x00,0x08, +0x00,0x19,0x03,0x00, +0x80,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0xC0,0x10,0x02,0x00, +0x23,0x10,0x44,0x00, +0x00,0x11,0x02,0x00, +0x21,0x10,0x44,0x00, +0x3B,0x22,0x00,0x08, +0x00,0x19,0x02,0x00, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x50,0x89,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x05,0x3C, +0xD4,0x5E,0xA3,0x8C, +0x05,0x00,0x02,0x24, +0x06,0x00,0x62,0x10, +0x06,0x00,0x62,0x2C, +0x0C,0x00,0x40,0x10, +0x06,0x00,0x02,0x24, +0x04,0x00,0x02,0x24, +0x0E,0x00,0x62,0x10, +0x80,0x10,0x04,0x00, +0x80,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0xFF,0xFF,0x42,0x24, +0xFE,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xF7,0xFF,0x62,0x14, +0x00,0x11,0x04,0x00, +0x23,0x10,0x44,0x00, +0x66,0x22,0x00,0x08, +0x40,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x66,0x22,0x00,0x08, +0x40,0x10,0x02,0x00, +0xFF,0xFF,0x85,0x30, +0x21,0x30,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x2A,0xB0,0x04,0x3C, +0xB4,0x00,0x63,0x34, +0x01,0x00,0xA2,0x24, +0x31,0x00,0x84,0x34, +0x00,0x00,0x65,0xA0, +0x00,0x00,0x85,0xA0, +0xFF,0xFF,0x45,0x30, +0x12,0x00,0xA0,0x10, +0x01,0x00,0x03,0x24, +0x28,0xB0,0x07,0x3C, +0x88,0x22,0x00,0x08, +0xFF,0xFF,0x08,0x24, +0x00,0x00,0x83,0xA0, +0x01,0x00,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x2B,0x10,0xA3,0x00, +0x09,0x00,0x40,0x14, +0x08,0x00,0xC6,0x24, +0xF9,0xFF,0x65,0x14, +0x21,0x20,0xC7,0x00, +0x01,0x00,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x2B,0x10,0xA3,0x00, +0x00,0x00,0x88,0xA0, +0xF9,0xFF,0x40,0x10, +0x08,0x00,0xC6,0x24, +0x00,0x01,0xA2,0x2C, +0x13,0x00,0x40,0x10, +0x21,0x18,0xA0,0x00, +0xFF,0x00,0x08,0x24, +0x28,0xB0,0x07,0x3C, +0x9C,0x22,0x00,0x08, +0xFF,0xFF,0x09,0x24, +0xFF,0xFF,0x43,0x30, +0x00,0x00,0xA2,0xA0, +0x00,0x01,0x62,0x2C, +0x0A,0x00,0x40,0x10, +0x08,0x00,0xC6,0x24, +0x01,0x00,0x62,0x24, +0xF9,0xFF,0x68,0x14, +0x21,0x28,0xC7,0x00, +0x00,0x01,0x02,0x24, +0xFF,0xFF,0x43,0x30, +0x00,0x01,0x62,0x2C, +0x00,0x00,0xA9,0xA0, +0xF8,0xFF,0x40,0x14, +0x08,0x00,0xC6,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD0,0xFF,0xBD,0x27, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x03,0x36, +0x00,0x00,0x60,0xA4, +0xA8,0x00,0x13,0x36, +0xA0,0x00,0x12,0x36, +0xA4,0x00,0x10,0x36, +0x00,0x00,0x55,0x8E, +0x00,0x00,0x16,0x8E, +0x00,0x00,0x71,0x8E, +0x00,0x80,0x14,0x3C, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x40,0xAE, +0xFD,0x00,0x04,0x24, +0x00,0x00,0x00,0xAE, +0x21,0x88,0x34,0x02, +0x00,0x00,0x74,0xAE, +0x00,0x00,0x62,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x55,0xAE, +0x00,0x00,0x16,0xAE, +0x00,0x00,0x71,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x05,0x36, +0x00,0x00,0xA2,0x94, +0x24,0xFA,0x03,0x24, +0xA8,0x00,0x13,0x36, +0x24,0x10,0x43,0x00, +0x00,0x00,0xA2,0xA4, +0xA0,0x00,0x12,0x36, +0xA4,0x00,0x10,0x36, +0x00,0x00,0x55,0x8E, +0x00,0x00,0x16,0x8E, +0x00,0x00,0x71,0x8E, +0x00,0x80,0x14,0x3C, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x40,0xAE, +0xFD,0x00,0x04,0x24, +0x00,0x00,0x00,0xAE, +0x21,0x88,0x34,0x02, +0x00,0x00,0x74,0xAE, +0x00,0x00,0xA2,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x55,0xAE, +0x00,0x00,0x16,0xAE, +0x00,0x00,0x71,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x05,0x36, +0x00,0x00,0xA2,0x94, +0xAF,0xFF,0x03,0x24, +0xA8,0x00,0x13,0x36, +0x24,0x10,0x43,0x00, +0x00,0x00,0xA2,0xA4, +0xA0,0x00,0x12,0x36, +0xA4,0x00,0x10,0x36, +0x00,0x00,0x55,0x8E, +0x00,0x00,0x16,0x8E, +0x00,0x00,0x71,0x8E, +0x00,0x80,0x14,0x3C, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x40,0xAE, +0xFD,0x00,0x04,0x24, +0x00,0x00,0x00,0xAE, +0x21,0x88,0x34,0x02, +0x00,0x00,0x74,0xAE, +0x00,0x00,0xA2,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x55,0xAE, +0x00,0x00,0x16,0xAE, +0x00,0x00,0x71,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x04,0x3C, +0x40,0x00,0x84,0x34, +0x00,0x00,0x82,0x94, +0xD8,0xFD,0x03,0x24, +0x24,0x10,0x43,0x00, +0xFC,0x37,0x03,0x24, +0x00,0x00,0x82,0xA4, +0x00,0x00,0x83,0xA4, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x84,0x30, +0xFF,0xFF,0xAC,0x30, +0xC0,0x48,0x04,0x00, +0x00,0x60,0x0E,0x40, +0x01,0x00,0xC1,0x35, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0xB0,0x02,0x3C, +0x40,0x02,0x4D,0x34, +0xF8,0xFF,0xE7,0x24, +0x21,0x40,0x00,0x00, +0x01,0x00,0x0F,0x24, +0x44,0x02,0x4B,0x34, +0x72,0x23,0x00,0x08, +0x01,0x80,0x0A,0x3C, +0x28,0x00,0x0F,0x11, +0x00,0x00,0x00,0x00, +0x01,0x00,0xE2,0x90, +0x00,0x00,0xE4,0x90, +0x02,0x00,0xE3,0x90, +0x03,0x00,0xE5,0x90, +0x00,0x12,0x02,0x00, +0x25,0x20,0x82,0x00, +0x00,0x1C,0x03,0x00, +0x25,0x20,0x83,0x00, +0x21,0x10,0x28,0x01, +0x00,0x2E,0x05,0x00, +0x01,0x00,0x08,0x25, +0x25,0x20,0x85,0x00, +0x25,0x10,0x4A,0x00, +0x06,0x00,0x03,0x2D, +0x00,0x00,0x64,0xAD, +0x04,0x00,0xE7,0x24, +0x00,0x00,0xA2,0xAD, +0x12,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0xEA,0xFF,0x00,0x15, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0x90, +0x01,0x00,0xC3,0x90, +0x04,0x00,0xE7,0x24, +0x00,0x14,0x02,0x00, +0x25,0x10,0x82,0x01, +0x00,0x1E,0x03,0x00, +0x25,0x20,0x43,0x00, +0x21,0x10,0x28,0x01, +0x01,0x00,0x08,0x25, +0x25,0x10,0x4A,0x00, +0x06,0x00,0x03,0x2D, +0x00,0x00,0x64,0xAD, +0x00,0x00,0xA2,0xAD, +0xF0,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x00,0x60,0x8E,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x03,0x00,0xC2,0x90, +0x02,0x00,0xC4,0x90, +0x04,0x00,0xC3,0x90, +0x05,0x00,0xC5,0x90, +0x64,0x23,0x00,0x08, +0x00,0x12,0x02,0x00, +0xFF,0xFF,0x84,0x30, +0x42,0xB0,0x08,0x3C, +0x80,0x10,0x04,0x00, +0x21,0x10,0x48,0x00, +0x04,0x00,0x46,0xAC, +0x00,0x00,0x07,0x91, +0x40,0x18,0x04,0x00, +0x03,0x00,0x06,0x24, +0xFF,0x00,0xE7,0x30, +0x04,0x30,0x66,0x00, +0x01,0x00,0x02,0x24, +0x04,0x10,0x62,0x00, +0x25,0x30,0xC7,0x00, +0xFF,0xFF,0xA5,0x30, +0x25,0x10,0x47,0x00, +0x02,0x00,0xA0,0x14, +0xFF,0x00,0xC7,0x30, +0xFF,0x00,0x47,0x30, +0x42,0xB0,0x02,0x3C, +0x00,0x00,0x47,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x14,0x00,0x83,0x90, +0x01,0x00,0x02,0x24, +0x08,0x00,0x86,0xAC, +0x18,0x00,0x85,0xAC, +0x00,0x00,0x84,0xAC, +0x03,0x00,0x62,0x10, +0x04,0x00,0x84,0xAC, +0x99,0x59,0x00,0x08, +0x0C,0x00,0x80,0xAC, +0x0C,0x00,0x82,0x8C, +0x99,0x59,0x00,0x08, +0x10,0x00,0x82,0xAC, +0xC8,0xFF,0xBD,0x27, +0x28,0x00,0xB6,0xAF, +0x25,0xB0,0x02,0x3C, +0x02,0x80,0x16,0x3C, +0x2C,0x00,0xB7,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x30,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x18,0x03,0x55,0x34, +0x01,0x80,0x17,0x3C, +0x02,0x80,0x13,0x3C, +0x02,0x80,0x14,0x3C, +0x08,0xE4,0xD2,0x26, +0xB8,0x8E,0xE2,0x26, +0x00,0x00,0xA2,0xAE, +0x08,0xE4,0xD0,0x8E, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x14,0x5E,0x71,0x8E, +0x00,0x00,0x00,0x00, +0x25,0x00,0x20,0x12, +0x00,0x00,0x00,0x00, +0x14,0x5E,0x60,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x23,0x00,0x12,0x12, +0x08,0x0C,0x84,0x26, +0x14,0x00,0x03,0x92, +0x01,0x00,0x02,0x24, +0x2B,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x60,0x14, +0x02,0x00,0x02,0x24, +0x0C,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x23,0x02, +0x1E,0x00,0x40,0x10, +0x23,0x10,0x71,0x00, +0x0C,0x00,0x02,0xAE, +0x00,0x00,0x10,0x8E, +0xCE,0x23,0x00,0x08, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x60,0x10, +0x2B,0x10,0x23,0x02, +0xF5,0xFF,0x40,0x14, +0x23,0x10,0x71,0x00, +0x08,0x00,0x02,0x8E, +0x18,0x00,0x04,0x8E, +0x09,0xF8,0x40,0x00, +0x0C,0x00,0x00,0xAE, +0x00,0x00,0x10,0x8E, +0xCE,0x23,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x08,0x0C,0x84,0x26, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xC0,0x23,0x00,0x08, +0xB8,0x8E,0xE2,0x26, +0x08,0x00,0x02,0x8E, +0x18,0x00,0x04,0x8E, +0x09,0xF8,0x40,0x00, +0x00,0x00,0x00,0x00, +0xDC,0x23,0x00,0x08, +0x0C,0x00,0x02,0xAE, +0x0C,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x23,0x02, +0xD9,0xFF,0x40,0x14, +0x23,0x10,0x71,0x00, +0x08,0x00,0x02,0x8E, +0x18,0x00,0x04,0x8E, +0x09,0xF8,0x40,0x00, +0x00,0x00,0x00,0x00, +0x10,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x03,0xAE, +0x00,0x00,0x10,0x8E, +0xCE,0x23,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x9C,0x57,0x42,0x24, +0xC0,0x20,0x04,0x00, +0x21,0x20,0x82,0x00, +0x21,0x28,0x00,0x00, +0x00,0x60,0x06,0x40, +0x01,0x00,0xC1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x00,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x09,0x00,0x44,0x10, +0x00,0x00,0x00,0x00, +0x04,0x00,0x43,0x8C, +0x21,0x28,0x40,0x00, +0x00,0x00,0x42,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x00,0x00,0xA5,0xAC, +0x04,0x00,0xA5,0xAC, +0x00,0x60,0x86,0x40, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x21,0x18,0x80,0x00, +0xE8,0xFF,0xBD,0x27, +0x01,0x01,0x62,0x2C, +0x10,0x00,0xBF,0xAF, +0x01,0x00,0x04,0x24, +0x01,0x02,0x65,0x2C, +0x0A,0x00,0x40,0x14, +0x21,0x30,0x00,0x00, +0x02,0x00,0x04,0x24, +0x07,0x00,0xA0,0x14, +0x01,0x08,0x62,0x2C, +0x05,0x00,0x40,0x14, +0x03,0x00,0x04,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0xC0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x0D,0x24,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x21,0x30,0x40,0x00, +0x21,0x10,0xC0,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x00,0x60,0x06,0x40, +0x01,0x00,0xC1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x10,0x00,0x83,0x8C, +0x02,0x80,0x02,0x3C, +0x9C,0x57,0x42,0x24, +0xC0,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0x65,0x8C, +0x02,0x80,0x07,0x3C, +0x02,0x80,0x08,0x3C, +0x00,0x00,0x85,0xAC, +0x04,0x00,0xA4,0xAC, +0x04,0x00,0x83,0xAC, +0xD0,0x5E,0xE5,0x8C, +0x00,0x00,0x00,0x00, +0x05,0x00,0xA0,0x10, +0x00,0x00,0x64,0xAC, +0xBC,0x5E,0x02,0x8D, +0xD0,0x5E,0xE0,0xAC, +0x25,0x10,0x45,0x00, +0xBC,0x5E,0x02,0xAD, +0x00,0x60,0x86,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xA5,0x30, +0x25,0xB0,0x02,0x3C, +0x21,0x28,0xA2,0x00, +0xFF,0x00,0x84,0x30, +0x60,0x01,0xA4,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x84,0x30, +0x01,0x00,0x03,0x24, +0x10,0x00,0x02,0x3C, +0x04,0x18,0x83,0x00, +0xF0,0x70,0x42,0x34, +0x15,0x00,0x84,0x2C, +0x06,0x00,0x80,0x10, +0x24,0x28,0x62,0x00, +0x0F,0x00,0x63,0x30, +0x04,0x00,0xA0,0x14, +0x01,0x00,0x02,0x24, +0x02,0x00,0x60,0x14, +0x02,0x00,0x02,0x24, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xA5,0x30, +0x04,0x00,0xA2,0x2C, +0x14,0x00,0x40,0x10, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0xEF,0xFF,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x2C, +0x0E,0x00,0x40,0x10, +0x02,0x00,0x03,0x24, +0x24,0x00,0x83,0x10, +0x0F,0x10,0x02,0x3C, +0x03,0x00,0x82,0x28, +0x14,0x00,0x40,0x10, +0x03,0x00,0x02,0x24, +0x01,0x00,0x02,0x24, +0x2F,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0xFF,0x1F,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0xFF,0xFF,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x35,0x00,0x83,0x10, +0x0F,0x1F,0x02,0x3C, +0x03,0x00,0x82,0x28, +0x16,0x00,0x40,0x10, +0x03,0x00,0x02,0x24, +0x01,0x00,0x02,0x24, +0xF4,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x1F,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0x80,0x42,0x34, +0xF0,0xFF,0x82,0x14, +0xFF,0x1F,0x02,0x3C, +0x01,0x00,0x02,0x24, +0x29,0x00,0xA2,0x10, +0x0F,0x10,0x02,0x3C, +0x02,0x00,0xA2,0x28, +0x1F,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x28,0x00,0xA3,0x10, +0x00,0x00,0x00,0x00, +0xE5,0xFF,0xA4,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0xF0,0x42,0x34, +0xE1,0xFF,0x82,0x14, +0xFF,0x1F,0x02,0x3C, +0x01,0x00,0x02,0x24, +0x1C,0x00,0xA2,0x10, +0x0F,0x00,0x02,0x3C, +0x02,0x00,0xA2,0x28, +0x0B,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xA3,0x10, +0x00,0x00,0x00,0x00, +0xD6,0xFF,0xA4,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0xF0,0x42,0x34, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x00,0x80,0x42,0x34, +0xCE,0xFF,0xA0,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x15,0xF0,0x42,0x34, +0xC9,0xFF,0xA0,0x14, +0x00,0x00,0x00,0x00, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x15,0xF0,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x00,0xF0,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x10,0xF0,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x10,0xF0,0x42,0x34, +0x0F,0x10,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x05,0xF0,0x42,0x34, +0x0F,0x00,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x05,0xF0,0x42,0x34, +0xC0,0x40,0x04,0x00, +0x21,0x18,0x04,0x01, +0x80,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x02,0x80,0x02,0x3C, +0x80,0x18,0x03,0x00, +0x30,0x1F,0x42,0x24, +0x21,0x18,0x62,0x00, +0x18,0x24,0x66,0x8C, +0x21,0x38,0x60,0x00, +0x1E,0x24,0x60,0xA0, +0x1F,0x24,0x60,0xA0, +0x1C,0x00,0x05,0x24, +0xDA,0x24,0x00,0x08, +0x01,0x00,0x03,0x24, +0x08,0x00,0xA0,0x04, +0x21,0x10,0x04,0x01, +0x04,0x10,0xA3,0x00, +0x24,0x10,0xC2,0x00, +0xFB,0xFF,0x40,0x10, +0xFF,0xFF,0xA5,0x24, +0x01,0x00,0xA5,0x24, +0x1E,0x24,0xE5,0xA0, +0x21,0x10,0x04,0x01, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x63,0x24, +0x21,0x18,0x43,0x00, +0x18,0x24,0x66,0x8C, +0x21,0x28,0x00,0x00, +0xEE,0x24,0x00,0x08, +0x01,0x00,0x07,0x24, +0x1D,0x00,0xA2,0x28, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x04,0x10,0xA7,0x00, +0x24,0x10,0xC2,0x00, +0xFA,0xFF,0x40,0x10, +0x01,0x00,0xA5,0x24, +0xFF,0xFF,0xA5,0x24, +0x08,0x00,0xE0,0x03, +0x1F,0x24,0x65,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x88,0x00,0x00, +0x30,0x1F,0x50,0x24, +0xFF,0xF1,0x14,0x24, +0x25,0xB0,0x13,0x3C, +0x24,0x00,0xBF,0xAF, +0x08,0x25,0x00,0x08, +0x18,0x00,0xB2,0xAF, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2E, +0x2A,0x00,0x40,0x10, +0x94,0x00,0x10,0x26, +0x1C,0x24,0x06,0x8E, +0x01,0x00,0x03,0x24, +0x02,0x13,0x06,0x00, +0x01,0x00,0x45,0x30, +0xF7,0xFF,0xA3,0x14, +0x42,0x1A,0x06,0x00, +0x0C,0x24,0x02,0x8E, +0x07,0x00,0x64,0x30, +0x02,0x11,0x02,0x00, +0x7F,0x00,0x43,0x30, +0x27,0x00,0x85,0x10, +0x07,0x00,0xD2,0x30, +0x02,0x00,0x82,0x28, +0x31,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x28,0x00,0x82,0x10, +0x03,0x00,0x02,0x24, +0x31,0x00,0x82,0x10, +0x1A,0x00,0x62,0x2C, +0x1C,0x24,0x02,0x8E, +0x04,0x00,0x43,0x2E, +0x42,0x12,0x02,0x00, +0x0A,0x00,0x60,0x10, +0x07,0x00,0x44,0x30, +0x6E,0x24,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x80,0x18,0x12,0x00, +0x21,0x18,0x73,0x00, +0x14,0x24,0x04,0x8E, +0x84,0x01,0x65,0x8C, +0x24,0x20,0x82,0x00, +0x24,0x28,0xA4,0x00, +0x18,0x24,0x05,0xAE, +0xC9,0x24,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x10,0x33,0x02, +0x01,0x00,0x31,0x26, +0x60,0x01,0x43,0x90, +0x20,0x00,0x22,0x2E, +0xD8,0xFF,0x40,0x14, +0x94,0x00,0x10,0x26, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x32,0x00,0x62,0x2C, +0xDF,0xFF,0x40,0x10, +0x24,0x10,0xD4,0x00, +0x00,0x04,0x42,0x34, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0x38,0x00,0x62,0x2C, +0x0D,0x00,0x40,0x14, +0x14,0x00,0x62,0x2C, +0x24,0x10,0xD4,0x00, +0x00,0x02,0x42,0x34, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0xD3,0xFF,0x80,0x14, +0x24,0x10,0xD4,0x00, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0xCF,0xFF,0x40,0x14, +0x24,0x10,0xD4,0x00, +0x3E,0x25,0x00,0x08, +0x00,0x04,0x42,0x34, +0xCB,0xFF,0x40,0x10, +0x24,0x10,0xD4,0x00, +0x00,0x06,0x42,0x34, +0x1B,0x25,0x00,0x08, +0x1C,0x24,0x02,0xAE, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0xC0,0x80,0x04,0x00, +0x21,0x80,0x04,0x02, +0x80,0x80,0x10,0x00, +0x21,0x80,0x04,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x80,0x10,0x00, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x21,0x80,0x02,0x02, +0x1C,0x24,0x03,0x8E, +0x25,0xB0,0x02,0x3C, +0x80,0x01,0x45,0x34, +0x07,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x00,0x00,0xA6,0x90, +0x14,0x24,0x05,0x8E, +0x84,0x01,0x62,0x8C, +0x21,0x88,0x80,0x00, +0x24,0x10,0x45,0x00, +0xC9,0x24,0x00,0x0C, +0x18,0x24,0x02,0xAE, +0x1E,0x24,0x04,0x92, +0xFF,0x00,0x25,0x32, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x57,0x24,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xFF,0xFF,0x84,0x30, +0x00,0x02,0x82,0x30, +0x07,0x00,0x03,0x24, +0x0D,0x00,0x40,0x14, +0x0B,0x00,0x84,0x30, +0x0C,0x00,0x82,0x2C, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0x74,0xED,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x07,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x06,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x05,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x04,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x03,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x01,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x21,0x18,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xA8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x50,0x00,0xBE,0xAF, +0x4C,0x00,0xB7,0xAF, +0x48,0x00,0xB6,0xAF, +0x44,0x00,0xB5,0xAF, +0x3C,0x00,0xB3,0xAF, +0x38,0x00,0xB2,0xAF, +0x54,0x00,0xBF,0xAF, +0x40,0x00,0xB4,0xAF, +0x34,0x00,0xB1,0xAF, +0x30,0x00,0xB0,0xAF, +0xA4,0xED,0x42,0x24, +0x00,0x00,0x54,0x8C, +0x21,0x98,0x00,0x00, +0x21,0xA8,0x00,0x00, +0x21,0xB0,0x00,0x00, +0x10,0x00,0xA0,0xAF, +0x21,0xB8,0x00,0x00, +0x14,0x00,0xA0,0xAF, +0x21,0xF0,0x00,0x00, +0x18,0x00,0xA0,0xAF, +0x1C,0x00,0xA0,0xAF, +0x20,0x00,0xA0,0xAF, +0x24,0x00,0xA0,0xAF, +0x28,0x00,0xA0,0xAF, +0x2C,0x00,0xA0,0xAF, +0x21,0x90,0x80,0x02, +0x1C,0x24,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x13,0x02,0x00, +0x01,0x00,0x42,0x30, +0x68,0x00,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x21,0x10,0x62,0x02, +0x60,0x01,0x44,0x90, +0x04,0x24,0x43,0x8E, +0x00,0x24,0x46,0x8E, +0xFF,0x00,0x8B,0x30, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0x21,0x10,0x64,0x01, +0xE7,0x04,0x44,0x90, +0xCA,0x04,0x45,0x90, +0xE8,0x23,0x47,0x8E, +0x18,0x00,0x64,0x00, +0x12,0x18,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x18,0x00,0xC5,0x00, +0x12,0x30,0x00,0x00, +0x21,0x30,0xC3,0x00, +0x2B,0x10,0xE6,0x00, +0x02,0x01,0x40,0x14, +0x23,0x10,0xE6,0x00, +0xE8,0x23,0x42,0xAE, +0x04,0x24,0x44,0x8E, +0x00,0x24,0x47,0x8E, +0xEC,0x23,0x48,0x8E, +0xF0,0x23,0x45,0x8E, +0xF8,0x23,0x46,0x8E, +0xFC,0x23,0x43,0x8E, +0x21,0x38,0xE4,0x00, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0x21,0x10,0x64,0x01, +0x21,0x40,0x05,0x01, +0x21,0x30,0xC3,0x00, +0x3E,0x05,0x42,0x90, +0xE8,0x23,0x4A,0x8E, +0x0C,0x00,0xE0,0x10, +0x21,0x48,0x00,0x00, +0x2B,0x48,0x47,0x00, +0x0B,0x00,0x20,0x15, +0x02,0x80,0x02,0x3C, +0x07,0x00,0x62,0x2D, +0x4B,0x01,0x40,0x14, +0xC0,0x10,0x07,0x00, +0x0C,0x00,0x02,0x24, +0x47,0x01,0x62,0x11, +0x0D,0x00,0x02,0x24, +0x46,0x01,0x62,0x11, +0xC0,0x10,0x07,0x00, +0x6C,0x00,0x20,0x11, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x0B,0x00, +0x21,0x18,0x62,0x00, +0x21,0x20,0x4B,0x02, +0x5A,0x24,0x85,0x90, +0x60,0x05,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x04,0x10,0xA2,0x00, +0x2B,0x10,0x4A,0x00, +0x61,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x78,0x24,0x42,0x8E, +0x01,0x00,0x07,0x24, +0x04,0x18,0x67,0x01, +0x24,0x10,0x43,0x00, +0xE1,0x00,0x40,0x10, +0x1C,0x00,0x62,0x2D, +0x21,0x28,0x4B,0x02, +0x20,0x24,0xA6,0x90, +0x5A,0x24,0xA2,0x90, +0x0A,0x00,0x04,0x24, +0xFF,0x00,0xC3,0x30, +0x04,0x20,0x44,0x00, +0x2A,0x18,0x64,0x00, +0xD8,0x00,0x60,0x10, +0x1C,0x00,0x62,0x2D, +0x01,0x00,0xC2,0x24, +0xFF,0x00,0x43,0x30, +0x37,0x01,0x64,0x10, +0x20,0x24,0xA2,0xA0, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x85,0x24, +0x80,0x10,0x0B,0x00, +0x21,0x10,0x45,0x00, +0xD4,0x05,0x44,0x8C, +0x60,0x05,0x43,0x8C, +0x18,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x30,0x45,0x00, +0x40,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x21,0x18,0x62,0x00, +0x82,0x50,0x03,0x00, +0xE8,0x23,0xCA,0xAC, +0x30,0x38,0xA3,0x8C, +0xFF,0xFF,0x02,0x34, +0x03,0x00,0x62,0x10, +0x21,0x20,0x60,0x01, +0x57,0x24,0x00,0x0C, +0xFF,0x00,0x65,0x32, +0x9E,0x00,0x60,0x12, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x82,0x24, +0x21,0x10,0xA2,0x02, +0xFC,0x23,0x40,0xAC, +0x00,0x24,0x40,0xAC, +0x04,0x24,0x40,0xAC, +0xEC,0x23,0x40,0xAC, +0xF0,0x23,0x40,0xAC, +0xF4,0x23,0x40,0xAC, +0xF8,0x23,0x40,0xAC, +0x2C,0x00,0xA2,0x8F, +0x28,0x00,0xA4,0x8F, +0x01,0x00,0x73,0x26, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x2C,0x00,0xA2,0xAF, +0x28,0x00,0xA4,0xAF, +0x24,0x00,0xA2,0x8F, +0x20,0x00,0xA4,0x8F, +0x20,0x00,0x63,0x2A, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x24,0x00,0xA2,0xAF, +0x20,0x00,0xA4,0xAF, +0x1C,0x00,0xA2,0x8F, +0x18,0x00,0xA4,0x8F, +0x94,0x00,0x52,0x26, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x1C,0x00,0xA2,0xAF, +0x18,0x00,0xA4,0xAF, +0x14,0x00,0xA2,0x8F, +0x10,0x00,0xA4,0x8F, +0x94,0x00,0xDE,0x27, +0x94,0x00,0x42,0x24, +0x94,0x00,0x84,0x24, +0x14,0x00,0xA2,0xAF, +0x94,0x00,0xF7,0x26, +0x10,0x00,0xA4,0xAF, +0x94,0x00,0x94,0x26, +0x94,0x00,0xD6,0x26, +0x69,0xFF,0x60,0x14, +0x94,0x00,0xB5,0x26, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x79,0x00,0xE0,0x10, +0x00,0x00,0x00,0x00, +0x79,0x00,0x20,0x15, +0x02,0x80,0x03,0x3C, +0x40,0x10,0x07,0x00, +0x21,0x10,0x47,0x00, +0x82,0x10,0x02,0x00, +0x2B,0x10,0x46,0x00, +0xBE,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x88,0x24, +0x21,0x20,0xC8,0x03, +0x21,0x30,0x8B,0x00, +0x78,0x24,0x83,0x8C, +0x01,0x00,0x05,0x24, +0x04,0x10,0x65,0x01, +0x3D,0x24,0xC7,0x90, +0x27,0x10,0x02,0x00, +0x24,0x18,0x62,0x00, +0x78,0x24,0x83,0xAC, +0x09,0x00,0xE5,0x10, +0x20,0x24,0xC0,0xA0, +0x14,0x00,0xA2,0x8F, +0x21,0x38,0x00,0x00, +0x21,0x20,0x48,0x00, +0x21,0x18,0x87,0x00, +0x01,0x00,0xE7,0x24, +0x1D,0x00,0xE2,0x28, +0xFC,0xFF,0x40,0x14, +0x5A,0x24,0x60,0xA0, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x83,0x24, +0x21,0x10,0xE3,0x02, +0x21,0x10,0x4B,0x00, +0x3D,0x24,0x40,0xA0, +0x21,0x50,0x60,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x78,0xE8,0x49,0x24, +0x04,0xE8,0x68,0x24, +0x21,0x38,0x00,0x00, +0x80,0x18,0x07,0x00, +0x21,0x10,0x69,0x00, +0x21,0x20,0x68,0x00, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x85,0x8C, +0x01,0x00,0xE7,0x24, +0x21,0x18,0x6A,0x00, +0x1D,0x00,0xE2,0x28, +0x60,0x05,0x65,0xAC, +0xF6,0xFF,0x40,0x14, +0xD4,0x05,0x66,0xAC, +0x15,0x00,0x60,0x11, +0x02,0x80,0x04,0x3C, +0x1F,0x24,0x82,0x92, +0xFF,0xFF,0x67,0x25, +0x2A,0x10,0xE2,0x00, +0x10,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x10,0x00,0xA4,0x8F, +0x30,0x1F,0x62,0x24, +0x21,0x10,0x82,0x00, +0x1F,0x24,0x45,0x90, +0x18,0x24,0x44,0x8C, +0x01,0x00,0x06,0x24, +0x04,0x18,0xE6,0x00, +0x24,0x10,0x83,0x00, +0xB9,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0xE7,0x24, +0x2A,0x10,0xE5,0x00, +0xFA,0xFF,0x40,0x10, +0x04,0x18,0xE6,0x00, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x83,0x24, +0x80,0x10,0x0B,0x00, +0x21,0x10,0x43,0x00, +0xD4,0x05,0x45,0x8C, +0x60,0x05,0x44,0x8C, +0x02,0x80,0x03,0x3C, +0x40,0x10,0x05,0x00, +0xDE,0x5D,0x66,0x90, +0x21,0x10,0x45,0x00, +0x21,0x20,0x82,0x00, +0x22,0x00,0x02,0x24, +0x9D,0x00,0xC2,0x10, +0x82,0x50,0x04,0x00, +0x78,0x24,0x83,0x8E, +0x01,0x00,0x02,0x24, +0x04,0x10,0x62,0x01, +0x25,0x18,0x62,0x00, +0x78,0x24,0x83,0xAE, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0x21,0x10,0xC3,0x02, +0xE8,0x23,0x4A,0xAC, +0x30,0x38,0x64,0x8C, +0xFF,0xFF,0x02,0x34, +0x62,0xFF,0x82,0x14, +0x21,0x20,0x60,0x01, +0x64,0xFF,0x60,0x16, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0xF0,0x23,0x05,0x96, +0xEC,0x23,0x02,0x96, +0x25,0xB0,0x11,0x3C, +0x00,0x2C,0x05,0x00, +0x21,0x28,0x45,0x00, +0xB5,0x59,0x00,0x0C, +0x68,0x0C,0x24,0x36, +0xFC,0x23,0x02,0x8E, +0xF8,0x23,0x05,0x8E, +0xF4,0x23,0x03,0x96, +0x6C,0x0C,0x24,0x36, +0x21,0x28,0xA2,0x00, +0x00,0x2C,0x05,0x00, +0xB5,0x59,0x00,0x0C, +0x21,0x28,0x65,0x00, +0x28,0x26,0x00,0x08, +0x02,0x80,0x04,0x3C, +0xD6,0x25,0x00,0x08, +0xE8,0x23,0x40,0xAE, +0x4C,0xFF,0x20,0x11, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0x80,0x18,0x0B,0x00, +0x21,0x18,0x62,0x00, +0xD4,0x05,0x64,0x8C, +0x00,0x00,0x00,0x00, +0x2B,0x20,0x44,0x01, +0x44,0xFF,0x80,0x10, +0x02,0x80,0x04,0x3C, +0x69,0x26,0x00,0x08, +0x30,0x1F,0x88,0x24, +0x2D,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x21,0x20,0x4B,0x02, +0x3D,0x24,0x83,0x90, +0x01,0x00,0x02,0x24, +0x53,0x00,0x62,0x10, +0x02,0x80,0x02,0x3C, +0x2C,0x00,0xA3,0x8F, +0x30,0x1F,0x42,0x24, +0x21,0x38,0x00,0x00, +0x21,0x20,0x62,0x00, +0x21,0x18,0x87,0x00, +0x01,0x00,0xE7,0x24, +0x1D,0x00,0xE2,0x28, +0xFC,0xFF,0x40,0x14, +0x5A,0x24,0x60,0xA0, +0x28,0x00,0xA4,0x8F, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x65,0x24, +0x21,0x30,0x85,0x00, +0x78,0x24,0xC2,0x8C, +0x01,0x00,0x03,0x24, +0x04,0x18,0x63,0x01, +0x27,0x18,0x03,0x00, +0x21,0x20,0xCB,0x00, +0x24,0x10,0x43,0x00, +0x3D,0x24,0x80,0xA0, +0x78,0x24,0xC2,0xAC, +0x12,0x00,0x60,0x15, +0x20,0x24,0x80,0xA0, +0x1E,0x24,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x0E,0x00,0x40,0x10, +0x01,0x00,0x07,0x24, +0x24,0x00,0xA3,0x8F, +0x01,0x00,0x06,0x24, +0x21,0x10,0x65,0x00, +0x1E,0x24,0x44,0x90, +0x18,0x24,0x45,0x8C, +0x04,0x18,0xE6,0x00, +0x24,0x10,0xA3,0x00, +0x4B,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0xE7,0x24, +0x2A,0x10,0x87,0x00, +0xFA,0xFF,0x40,0x10, +0x04,0x18,0xE6,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x44,0x24, +0x20,0x00,0xA2,0x8F, +0x01,0x00,0x67,0x25, +0x21,0x18,0x44,0x00, +0x1E,0x24,0x62,0x90, +0x00,0x00,0x00,0x00, +0x2A,0x10,0x47,0x00, +0x0E,0x00,0x40,0x14, +0x01,0x00,0x06,0x24, +0x1C,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x10,0x64,0x00, +0x1E,0x24,0x45,0x90, +0x18,0x24,0x44,0x8C, +0x04,0x18,0xE6,0x00, +0x24,0x10,0x83,0x00, +0x31,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0xE7,0x24, +0x2A,0x10,0xA7,0x00, +0xFA,0xFF,0x40,0x10, +0x04,0x18,0xE6,0x00, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x22,0x00,0x03,0x24, +0xE4,0xFE,0x83,0x14, +0x02,0x80,0x04,0x3C, +0xEE,0xFF,0x62,0x25, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x2C, +0x18,0x00,0x03,0x24, +0x12,0x26,0x00,0x08, +0x0B,0x58,0x62,0x00, +0xC0,0x10,0x07,0x00, +0x23,0x10,0x47,0x00, +0xC2,0x10,0x02,0x00, +0x2B,0x10,0x48,0x00, +0xC4,0xFE,0x40,0x14, +0x00,0x00,0x00,0x00, +0xF1,0x25,0x00,0x08, +0x00,0x00,0x00,0x00, +0x18,0x00,0x62,0x2D, +0x0A,0x00,0x40,0x14, +0x05,0x00,0x62,0x2D, +0x5A,0x24,0x83,0x90, +0x00,0x00,0x00,0x00, +0x05,0x00,0x62,0x2C, +0xB0,0xFF,0x40,0x10, +0x01,0x00,0x62,0x24, +0xF4,0x26,0x00,0x08, +0x5A,0x24,0x82,0xA0, +0x11,0x26,0x00,0x08, +0x3D,0x24,0xA7,0xA0, +0x04,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x5A,0x24,0x83,0x90, +0x43,0x27,0x00,0x08, +0x03,0x00,0x62,0x2C, +0x5A,0x24,0x83,0x90, +0x43,0x27,0x00,0x08, +0x04,0x00,0x62,0x2C, +0x13,0x00,0x02,0x24, +0x62,0xFF,0x62,0x15, +0x02,0x80,0x02,0x3C, +0xBC,0x26,0x00,0x08, +0x30,0x1F,0x43,0x24, +0xFF,0x00,0xEB,0x30, +0x2B,0x27,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x13,0x27,0x00,0x08, +0xFF,0x00,0xEB,0x30, +0xA7,0x26,0x00,0x08, +0xFF,0x00,0xEB,0x30, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x14,0x00,0xB1,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x45,0x24, +0xA9,0x37,0xA4,0x90, +0xA4,0x37,0xA3,0x8C, +0xA0,0x37,0xA2,0x8C, +0x21,0x88,0x64,0x00, +0x2B,0x10,0x22,0x02, +0x60,0x00,0x40,0x10, +0x21,0x80,0xA0,0x00, +0x02,0x80,0x14,0x3C, +0x21,0x98,0xA0,0x00, +0x76,0x27,0x00,0x08, +0x21,0x90,0xA0,0x00, +0xA0,0x37,0x42,0x8E, +0x10,0x00,0x31,0x26, +0x2B,0x10,0x22,0x02, +0x57,0x00,0x40,0x10, +0x21,0x80,0x40,0x02, +0xA9,0x37,0x02,0x92, +0xFF,0xFF,0x23,0x32, +0x02,0x80,0x05,0x3C, +0x10,0x00,0x42,0x24, +0x25,0x28,0x65,0x00, +0x98,0x55,0x84,0x26, +0x10,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0xA9,0x37,0x02,0xA2, +0x6C,0x36,0x06,0x8E, +0x00,0x00,0x00,0x00, +0x42,0x24,0x06,0x00, +0x1F,0x00,0x84,0x30, +0xC0,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x38,0x50,0x00, +0x1C,0x24,0xE3,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x1B,0x03,0x00, +0x01,0x00,0x63,0x30, +0xE3,0xFF,0x60,0x10, +0x25,0xB0,0x02,0x3C, +0x68,0x36,0x05,0x8E, +0x21,0x10,0x82,0x00, +0x60,0x01,0x44,0x90, +0x82,0x1D,0x05,0x00, +0x3F,0x00,0x63,0x30, +0x04,0x00,0x0A,0x24, +0x05,0x00,0x62,0x28, +0x21,0x40,0x40,0x01, +0x0B,0x40,0x62,0x00, +0x07,0x00,0xA0,0x04, +0xFF,0x00,0x89,0x30, +0x08,0x24,0xE2,0x8C, +0x04,0x00,0x08,0x24, +0x01,0x00,0x42,0x24, +0x08,0x24,0xE2,0xAC, +0x6C,0x36,0x66,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x13,0x06,0x00, +0x1F,0x00,0x42,0x30, +0x08,0x00,0x42,0x28, +0xCD,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x68,0x36,0x62,0x8E, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x42,0x30, +0xC8,0xFF,0x49,0x14, +0x00,0x00,0x00,0x00, +0x29,0x00,0x00,0x11, +0x01,0x00,0x02,0x24, +0x2E,0x00,0x02,0x11, +0x02,0x00,0x02,0x24, +0x33,0x00,0x02,0x11, +0x03,0x00,0x02,0x24, +0x38,0x00,0x02,0x11, +0x00,0x00,0x00,0x00, +0x3B,0x00,0x0A,0x11, +0x00,0x00,0x00,0x00, +0x0C,0x24,0xE2,0x8C, +0x21,0x18,0x33,0x01, +0x04,0x05,0x64,0x90, +0x02,0x11,0x02,0x00, +0x2B,0x10,0x44,0x00, +0x3E,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x24,0xE3,0x8C, +0x80,0x10,0x09,0x00, +0x21,0x10,0x49,0x00, +0x01,0x00,0x63,0x24, +0x21,0x10,0x53,0x00, +0x00,0x24,0xE3,0xAC, +0x21,0x10,0x48,0x00, +0xA8,0x03,0x44,0x90, +0xE8,0x23,0xE3,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x64,0x00, +0xE8,0x23,0xE3,0xAC, +0xA0,0x37,0x42,0x8E, +0x10,0x00,0x31,0x26, +0x2B,0x10,0x22,0x02, +0xAB,0xFF,0x40,0x14, +0x21,0x80,0x40,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xEC,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xEC,0x23,0xE2,0xAC, +0x01,0x00,0x02,0x24, +0xD4,0xFF,0x02,0x15, +0x02,0x00,0x02,0x24, +0xF0,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xF0,0x23,0xE2,0xAC, +0x02,0x00,0x02,0x24, +0xCF,0xFF,0x02,0x15, +0x03,0x00,0x02,0x24, +0xF4,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xF4,0x23,0xE2,0xAC, +0x03,0x00,0x02,0x24, +0xCA,0xFF,0x02,0x15, +0x00,0x00,0x00,0x00, +0xF8,0x23,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0xC7,0xFF,0x0A,0x15, +0xF8,0x23,0xE2,0xAC, +0xFC,0x23,0xE2,0x8C, +0x21,0x18,0x33,0x01, +0x01,0x00,0x42,0x24, +0xFC,0x23,0xE2,0xAC, +0x0C,0x24,0xE2,0x8C, +0x04,0x05,0x64,0x90, +0x02,0x11,0x02,0x00, +0x2B,0x10,0x44,0x00, +0xC4,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x04,0x24,0xE3,0x8C, +0x80,0x10,0x09,0x00, +0x21,0x10,0x49,0x00, +0x01,0x00,0x63,0x24, +0x21,0x10,0x53,0x00, +0x04,0x24,0xE3,0xAC, +0x21,0x10,0x48,0x00, +0x39,0x04,0x44,0x90, +0xE8,0x23,0xE3,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x64,0x00, +0xC7,0x27,0x00,0x08, +0xE8,0x23,0xE3,0xAC, +0x23,0x10,0xA4,0x00, +0x2B,0x18,0xA4,0x00, +0x23,0x20,0x85,0x00, +0x08,0x00,0xE0,0x03, +0x0B,0x10,0x83,0x00, +0x20,0xFF,0xBD,0x27, +0xCC,0x00,0xB5,0xAF, +0xDC,0x00,0xBF,0xAF, +0xD8,0x00,0xBE,0xAF, +0xD4,0x00,0xB7,0xAF, +0xD0,0x00,0xB6,0xAF, +0xC8,0x00,0xB4,0xAF, +0xC4,0x00,0xB3,0xAF, +0xC0,0x00,0xB2,0xAF, +0xBC,0x00,0xB1,0xAF, +0xB8,0x00,0xB0,0xAF, +0x21,0xA8,0x00,0x00, +0x40,0x11,0x15,0x00, +0x10,0x00,0xA3,0x27, +0x21,0x10,0x43,0x00, +0x07,0x00,0x16,0x24, +0xFF,0xFF,0xD6,0x26, +0x00,0x00,0x40,0xAC, +0xFD,0xFF,0xC1,0x06, +0x04,0x00,0x42,0x24, +0x01,0x00,0xB5,0x26, +0x03,0x00,0xA2,0x2E, +0xF6,0xFF,0x40,0x14, +0x40,0x11,0x15,0x00, +0x25,0xB0,0x10,0x3C, +0xC4,0x02,0x02,0x36, +0x00,0x00,0x40,0xAC, +0x04,0x00,0x03,0x36, +0x00,0x00,0x62,0x8C, +0x04,0x0C,0x03,0x36, +0x00,0x00,0x63,0x8C, +0x08,0x0C,0x04,0x36, +0x0F,0x00,0x11,0x3C, +0xAC,0x00,0xA3,0xAF, +0x00,0x00,0x84,0x8C, +0x24,0x10,0x51,0x00, +0x02,0xF4,0x02,0x00, +0xB0,0x00,0xA4,0xAF, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x70,0x00,0xA2,0xAF, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x74,0x00,0xA2,0xAF, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0xE0,0x0E,0x02,0x36, +0x21,0x20,0x40,0x00, +0x00,0x00,0x42,0x8C, +0xDC,0x0E,0x12,0x36, +0x70,0x0E,0x13,0x36, +0x78,0x00,0xA2,0xAF, +0x00,0x00,0x42,0x8E, +0x74,0x0E,0x14,0x36, +0x78,0x0E,0x15,0x36, +0x7C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8E, +0x7C,0x0E,0x16,0x36, +0x80,0x0E,0x17,0x36, +0x80,0x00,0xA3,0xAF, +0x00,0x00,0x82,0x8E, +0xD4,0x0E,0x10,0x36, +0xED,0x3F,0x11,0x3C, +0x84,0x00,0xA2,0xAF, +0x00,0x00,0xA3,0x8E, +0xFB,0x92,0x25,0x36, +0x88,0x00,0xA3,0xAF, +0x00,0x00,0xC2,0x8E, +0x00,0x00,0x00,0x00, +0x8C,0x00,0xA2,0xAF, +0x00,0x00,0xE3,0x8E, +0x25,0xB0,0x02,0x3C, +0x84,0x0E,0x42,0x34, +0x90,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0x88,0x0E,0x63,0x34, +0x94,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x25,0xB0,0x02,0x3C, +0x8C,0x0E,0x42,0x34, +0x98,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0xD0,0x0E,0x63,0x34, +0x9C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x00,0x00,0x00,0x00, +0xA0,0x00,0xA3,0xAF, +0x00,0x00,0x02,0x8E, +0x25,0xB0,0x03,0x3C, +0xD8,0x0E,0x63,0x34, +0xA4,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x02,0x5C,0x00,0x0C, +0xA8,0x00,0xA3,0xAF, +0x21,0x20,0x40,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x60,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x80,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0xA0,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0xC0,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0xE0,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x02,0x3C, +0xA8,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x25,0xB0,0x13,0x3C, +0x02,0x80,0x03,0x3C, +0xAC,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0xB0,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xB0,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0xFF,0x03,0x14,0x3C, +0x02,0x80,0x03,0x3C, +0xB4,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xB7,0x27, +0x21,0x20,0x00,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x02,0x3C, +0xB8,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0xE4,0x28,0x00,0x08, +0x21,0xA8,0x00,0x00, +0x6E,0x00,0xC2,0x13, +0x02,0x80,0x02,0x3C, +0xAC,0x0E,0x62,0x36, +0x94,0x0E,0x63,0x36, +0x00,0x00,0x48,0x8C, +0x00,0x00,0x64,0x8C, +0xB4,0x0E,0x62,0x36, +0x9C,0x0E,0x63,0x36, +0x00,0x00,0x45,0x8C, +0x00,0x00,0x66,0x8C, +0x25,0xB0,0x03,0x3C, +0xBC,0x0E,0x63,0x34, +0x00,0x00,0x67,0x8C, +0x24,0x20,0x94,0x00, +0x00,0xD8,0x02,0x3C, +0x24,0x10,0x02,0x01, +0x24,0x28,0xB4,0x00, +0x24,0x30,0xD4,0x00, +0x24,0x38,0xF4,0x00, +0x02,0x24,0x04,0x00, +0x20,0x01,0x03,0x24, +0x01,0x00,0x42,0x2C, +0x02,0x2C,0x05,0x00, +0x02,0x34,0x06,0x00, +0xE8,0x00,0x83,0x10, +0x02,0x3C,0x07,0x00, +0xE6,0x00,0xA3,0x10, +0x20,0x00,0x03,0x24, +0xE4,0x00,0xC3,0x10, +0x00,0x00,0x00,0x00, +0xE2,0x00,0xE3,0x10, +0x01,0x00,0x08,0x24, +0x80,0x00,0x03,0x24, +0x08,0x00,0x83,0x10, +0x21,0x20,0x00,0x00, +0x06,0x00,0xA3,0x10, +0x21,0x20,0x00,0x00, +0xE0,0x03,0x03,0x24, +0x03,0x00,0xC3,0x10, +0x00,0x00,0x00,0x00, +0xDB,0x00,0xE3,0x10, +0x01,0x00,0x04,0x24, +0x05,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x00,0x11, +0x00,0x00,0x00,0x00, +0xD7,0x00,0x80,0x14, +0x94,0x0E,0x63,0x36, +0x01,0x00,0xB5,0x26, +0x0A,0x00,0xA2,0x2E, +0x01,0x01,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCB,0xFF,0xC0,0x17, +0x01,0x00,0x02,0x24, +0xA0,0x00,0x03,0x3C, +0x30,0x54,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0x64,0x36, +0x08,0x00,0x05,0x3C, +0xE4,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0x64,0x36, +0x28,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0x80,0x80,0x05,0x3C, +0x14,0x02,0x02,0x3C, +0x48,0x01,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x40,0x0E,0x64,0x36, +0x16,0x68,0x05,0x3C, +0xA2,0x04,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x44,0x0E,0x64,0x36, +0x4C,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x14,0x02,0x03,0x3C, +0x4D,0x01,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x60,0x0E,0x64,0x36, +0x16,0x28,0x05,0x3C, +0xBA,0x08,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x64,0x0E,0x64,0x36, +0x6C,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x00,0xFB,0x05,0x3C, +0x01,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x64,0x36, +0x00,0xF8,0x05,0x3C, +0x01,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x64,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xA0,0x00,0x02,0x3C, +0x33,0x54,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0x64,0x36, +0x08,0x0C,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0xE4,0x00,0x05,0x24, +0x28,0x0E,0x64,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x01,0x00,0x02,0x24, +0x96,0xFF,0xC2,0x17, +0xAC,0x0E,0x62,0x36, +0x02,0x80,0x02,0x3C, +0xBC,0xED,0x42,0x24, +0x25,0xB0,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x20,0x08,0x63,0x34, +0x00,0x00,0x71,0x8C, +0x00,0x01,0x03,0x3C, +0x00,0x01,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x25,0xB0,0x12,0x3C, +0x00,0x01,0x02,0x3C, +0x00,0x01,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x28,0x08,0x44,0x36, +0xA0,0x00,0x03,0x3C, +0x30,0x54,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0x44,0x36, +0x08,0x00,0x05,0x3C, +0xE4,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0x44,0x36, +0x28,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x80,0x80,0x05,0x3C, +0x00,0x01,0x02,0x3C, +0x00,0x7C,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x30,0x0E,0x44,0x36, +0x00,0x01,0x03,0x3C, +0x00,0x48,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x34,0x0E,0x44,0x36, +0x00,0x10,0x02,0x3C, +0x1F,0xDC,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x38,0x0E,0x44,0x36, +0x00,0x10,0x03,0x3C, +0x1F,0x8C,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x3C,0x0E,0x44,0x36, +0x14,0x02,0x02,0x3C, +0x02,0x01,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x40,0x0E,0x44,0x36, +0x16,0x68,0x05,0x3C, +0xC7,0x04,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x44,0x0E,0x44,0x36, +0x4C,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x6C,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x24, +0x00,0x01,0x03,0x3C, +0x00,0x7C,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x50,0x0E,0x44,0x36, +0x00,0x01,0x02,0x3C, +0x00,0x48,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x54,0x0E,0x44,0x36, +0x00,0x10,0x03,0x3C, +0x23,0xDC,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x58,0x0E,0x44,0x36, +0x00,0x10,0x02,0x3C, +0x23,0x8C,0x45,0x34, +0x02,0x5C,0x00,0x0C, +0x5C,0x0E,0x44,0x36, +0x14,0x02,0x03,0x3C, +0x02,0x01,0x65,0x34, +0x02,0x5C,0x00,0x0C, +0x60,0x0E,0x44,0x36, +0x16,0x28,0x05,0x3C, +0x07,0x0D,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x64,0x0E,0x44,0x36, +0x48,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0xFB,0x05,0x3C, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x44,0x36, +0x00,0x02,0x10,0x3C, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0x4C,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0xD1,0x28,0x05,0x36, +0xD1,0x28,0x05,0x36, +0x02,0x5C,0x00,0x0C, +0x6C,0x0E,0x44,0x36, +0x48,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0xFB,0x05,0x3C, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0x44,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xAC,0x00,0xA5,0x8F, +0x04,0x0C,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x31,0x32, +0xB0,0x00,0xA5,0x8F, +0x08,0x0C,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x2B,0x88,0x11,0x00, +0x28,0x0E,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x23,0xFF,0x20,0x16, +0xAC,0x0E,0x62,0x36, +0x02,0x80,0x02,0x3C, +0xBC,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x28,0x08,0x44,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0xAC,0x0E,0x62,0x36, +0x94,0x0E,0x63,0x36, +0x00,0x00,0x48,0x8C, +0x00,0x00,0x64,0x8C, +0xB4,0x0E,0x62,0x36, +0x9C,0x0E,0x63,0x36, +0x00,0x00,0x45,0x8C, +0x00,0x00,0x66,0x8C, +0x25,0xB0,0x03,0x3C, +0xBC,0x0E,0x63,0x34, +0x00,0x00,0x67,0x8C, +0x24,0x20,0x94,0x00, +0x00,0xD8,0x02,0x3C, +0x24,0x10,0x02,0x01, +0x24,0x28,0xB4,0x00, +0x24,0x30,0xD4,0x00, +0x24,0x38,0xF4,0x00, +0x02,0x24,0x04,0x00, +0x20,0x01,0x03,0x24, +0x01,0x00,0x42,0x2C, +0x02,0x2C,0x05,0x00, +0x02,0x34,0x06,0x00, +0x1A,0xFF,0x83,0x14, +0x02,0x3C,0x07,0x00, +0x80,0x00,0x03,0x24, +0x20,0xFF,0x83,0x14, +0x21,0x40,0x00,0x00, +0xDA,0x28,0x00,0x08, +0x21,0x20,0x00,0x00, +0x00,0x00,0x62,0x8C, +0x9C,0x0E,0x65,0x36, +0xA4,0x0E,0x66,0x36, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x00,0x00,0xE2,0xAE, +0x00,0x00,0xA4,0x8C, +0xAC,0x0E,0x67,0x36, +0xB4,0x0E,0x65,0x36, +0x24,0x20,0x94,0x00, +0x02,0x24,0x04,0x00, +0x04,0x00,0xE4,0xAE, +0x00,0x00,0xC3,0x8C, +0xC4,0x0E,0x64,0x36, +0x24,0x18,0x74,0x00, +0x02,0x1C,0x03,0x00, +0x08,0x00,0xE3,0xAE, +0x00,0x00,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x0C,0x00,0xE2,0xAE, +0x00,0x00,0xA3,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x18,0x74,0x00, +0x02,0x1C,0x03,0x00, +0x10,0x00,0xE3,0xAE, +0x25,0xB0,0x03,0x3C, +0xBC,0x0E,0x63,0x34, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x14,0x00,0xE2,0xAE, +0x00,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x18,0x74,0x00, +0x02,0x1C,0x03,0x00, +0x18,0x00,0xE3,0xAE, +0x25,0xB0,0x03,0x3C, +0xCC,0x0E,0x63,0x34, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x54,0x00, +0x02,0x14,0x02,0x00, +0x1C,0x00,0xE2,0xAE, +0x01,0x00,0xD6,0x26, +0x03,0x00,0xC2,0x2E, +0xC7,0xFE,0x40,0x14, +0x20,0x00,0xF7,0x26, +0x10,0x00,0xB0,0x8F, +0x00,0x00,0x00,0x00, +0x49,0x01,0x00,0x16, +0x00,0x00,0x00,0x00, +0x30,0x00,0xB1,0x8F, +0x00,0x00,0x00,0x00, +0x06,0x00,0x20,0x16, +0x21,0x20,0x00,0x02, +0x50,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x29,0x00,0x40,0x10, +0xFF,0x00,0x05,0x24, +0x21,0x20,0x00,0x02, +0x05,0x28,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x03,0x00,0x42,0x2C, +0x08,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x34,0x00,0xA5,0x8F, +0x14,0x00,0xA4,0x8F, +0x05,0x28,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x2C, +0x1C,0x00,0x40,0x14, +0x21,0x28,0x00,0x00, +0x50,0x00,0xB2,0x8F, +0x21,0x20,0x00,0x02, +0x05,0x28,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x03,0x00,0x42,0x2C, +0x09,0x00,0x40,0x10, +0x21,0x20,0x20,0x02, +0x54,0x00,0xA5,0x8F, +0x14,0x00,0xA4,0x8F, +0x05,0x28,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x2C, +0x0E,0x00,0x40,0x14, +0x21,0x28,0x00,0x00, +0x21,0x20,0x20,0x02, +0x05,0x28,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x03,0x00,0x42,0x2C, +0xE0,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x54,0x00,0xA5,0x8F, +0x34,0x00,0xA4,0x8F, +0x05,0x28,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x2C, +0xD9,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x02,0x24, +0xDB,0x00,0xA2,0x10, +0x25,0xB0,0x03,0x3C, +0x10,0x00,0xA2,0x27, +0x40,0x29,0x05,0x00, +0x02,0x80,0x0F,0x3C, +0x21,0x28,0xA2,0x00, +0x30,0x1F,0xEC,0x25, +0x00,0x00,0xA6,0x8C, +0x0C,0x00,0xA7,0x8C, +0x0C,0x00,0x83,0x8D, +0x10,0x00,0x84,0x8D, +0x04,0x00,0xA8,0x8C, +0x10,0x00,0xA9,0x8C, +0x00,0xFC,0x02,0x24, +0x08,0x00,0xAA,0x8C, +0x14,0x00,0xAB,0x8C, +0x24,0x20,0x82,0x00, +0xFF,0x03,0xC6,0x30, +0x24,0x18,0x62,0x00, +0xFF,0x03,0xE7,0x30, +0xF0,0xFF,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x25,0x18,0x66,0x00, +0x25,0x20,0x87,0x00, +0xFF,0x03,0x08,0x31, +0xFF,0x03,0x29,0x31, +0x24,0x20,0x82,0x00, +0x24,0x18,0x62,0x00, +0x80,0x42,0x08,0x00, +0x80,0x4A,0x09,0x00, +0x0F,0xC0,0x02,0x3C, +0x1C,0x00,0xA6,0x8C, +0x18,0x00,0xA7,0x8C, +0xFF,0xFF,0x42,0x34, +0x25,0x18,0x68,0x00, +0x25,0x20,0x89,0x00, +0xFF,0x03,0x4A,0x31, +0xFF,0x03,0x6B,0x31, +0x24,0x20,0x82,0x00, +0x00,0x55,0x0A,0x00, +0x24,0x18,0x62,0x00, +0x00,0x5D,0x0B,0x00, +0x25,0x18,0x6A,0x00, +0x25,0x20,0x8B,0x00, +0x16,0x00,0x86,0xA5, +0x0C,0x00,0x83,0xAD, +0x10,0x00,0x84,0xAD, +0x14,0x00,0x87,0xA5, +0x30,0x1F,0xF1,0x25, +0x10,0x00,0x22,0x8E, +0x01,0x00,0x03,0x24, +0x82,0x17,0x02,0x00, +0x4D,0x00,0x43,0x10, +0x25,0xB0,0x12,0x3C, +0x0C,0x00,0x23,0x8E, +0x80,0x0C,0x44,0x36, +0x00,0x00,0x88,0x8C, +0x00,0x02,0x62,0x30, +0xC0,0xFF,0x13,0x3C, +0x82,0x6D,0x08,0x00, +0x03,0x00,0x40,0x10, +0xFF,0x03,0x65,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x28,0xA2,0x00, +0x18,0x00,0xAD,0x00, +0x82,0x62,0x03,0x00, +0xFF,0x03,0x8C,0x31, +0x00,0x02,0x83,0x31, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x46,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x60,0x82,0x01, +0x18,0x00,0x8D,0x01, +0x00,0xFC,0x74,0x36, +0x24,0x28,0x14,0x01, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x28,0xA2,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xA6,0x00, +0x94,0x0C,0x44,0x36, +0x00,0x00,0x85,0x8C, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x55,0x34, +0xC0,0x03,0x10,0x32, +0x24,0x28,0xB5,0x00, +0x80,0x85,0x10,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xB0,0x00, +0x10,0x00,0x2C,0x8E, +0x88,0x0C,0x44,0x36, +0x00,0x00,0x88,0x8C, +0x82,0x2A,0x0C,0x00, +0xFF,0x03,0xA5,0x30, +0x24,0x10,0x13,0x01, +0x00,0x02,0xA3,0x30, +0x03,0x00,0x60,0x10, +0x82,0x6D,0x02,0x00, +0x00,0xFC,0x02,0x24, +0x25,0x28,0xA2,0x00, +0x18,0x00,0xAD,0x00, +0x02,0x65,0x0C,0x00, +0xFF,0x03,0x8C,0x31, +0x00,0x02,0x83,0x31, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x46,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x60,0x82,0x01, +0x18,0x00,0x8D,0x01, +0x24,0x28,0x14,0x01, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x28,0xA2,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xA6,0x00, +0x9C,0x0C,0x44,0x36, +0x00,0x00,0x85,0x8C, +0xC0,0x03,0x10,0x32, +0x80,0x85,0x10,0x00, +0x24,0x28,0xB5,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xB0,0x00, +0x78,0x00,0xA5,0x8F, +0x25,0xB0,0x10,0x3C, +0x02,0x5C,0x00,0x0C, +0xE0,0x0E,0x04,0x36, +0x7C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xDC,0x0E,0x04,0x36, +0x80,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x70,0x0E,0x04,0x36, +0x84,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x74,0x0E,0x04,0x36, +0x88,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x78,0x0E,0x04,0x36, +0x8C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x7C,0x0E,0x04,0x36, +0x90,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x80,0x0E,0x04,0x36, +0x94,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x84,0x0E,0x04,0x36, +0x98,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x88,0x0E,0x04,0x36, +0x9C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x8C,0x0E,0x04,0x36, +0xA0,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD0,0x0E,0x04,0x36, +0xA4,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD4,0x0E,0x04,0x36, +0xA8,0x00,0xA5,0x8F, +0x88,0x0E,0x04,0x36, +0x02,0x5C,0x00,0x0C, +0x0F,0x00,0x10,0x3C, +0x70,0x00,0xA6,0x8F, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x74,0x00,0xA6,0x8F, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0xFF,0xFF,0x05,0x36, +0x8A,0x47,0x00,0x0C, +0x1E,0x00,0x04,0x24, +0x21,0x88,0x40,0x00, +0xFD,0xFF,0x06,0x24, +0x01,0x00,0x42,0x34, +0x24,0x30,0x46,0x00, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x1E,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x03,0x00,0x26,0x36, +0x5F,0x47,0x00,0x0C, +0x1E,0x00,0x04,0x24, +0xDC,0x00,0xBF,0x8F, +0xD8,0x00,0xBE,0x8F, +0xD4,0x00,0xB7,0x8F, +0xD0,0x00,0xB6,0x8F, +0xCC,0x00,0xB5,0x8F, +0xC8,0x00,0xB4,0x8F, +0xC4,0x00,0xB3,0x8F, +0xC0,0x00,0xB2,0x8F, +0xBC,0x00,0xB1,0x8F, +0xB8,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0xE0,0x00,0xBD,0x27, +0xFF,0x00,0x05,0x24, +0xFF,0x00,0x02,0x24, +0x29,0xFF,0xA2,0x14, +0x10,0x00,0xA2,0x27, +0x25,0xB0,0x03,0x3C, +0x94,0x0E,0x62,0x34, +0x9C,0x0E,0x64,0x34, +0xA4,0x0E,0x65,0x34, +0xAC,0x0E,0x66,0x34, +0x02,0x80,0x0F,0x3C, +0x00,0x00,0x49,0x8C, +0x30,0x1F,0xED,0x25, +0x00,0x00,0x8C,0x8C, +0x00,0x00,0xAE,0x8C, +0x00,0x00,0xC7,0x8C, +0xB4,0x0E,0x62,0x34, +0x0C,0x00,0xA4,0x8D, +0x10,0x00,0xA5,0x8D, +0x00,0x00,0x4A,0x8C, +0xFF,0x03,0x06,0x3C, +0x00,0xFC,0x08,0x24, +0xBC,0x0E,0x62,0x34, +0x24,0x48,0x26,0x01, +0x24,0x38,0xE6,0x00, +0x00,0x00,0x4B,0x8C, +0x24,0x28,0xA8,0x00, +0x24,0x20,0x88,0x00, +0x02,0x3C,0x07,0x00, +0xCC,0x0E,0x68,0x34, +0x02,0x4C,0x09,0x00, +0xC4,0x0E,0x63,0x34, +0xF0,0xFF,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x25,0x28,0xA7,0x00, +0x25,0x20,0x89,0x00, +0x00,0x00,0x67,0x8C, +0x24,0x60,0x86,0x01, +0x00,0x00,0x03,0x8D, +0x24,0x50,0x46,0x01, +0x24,0x28,0xA2,0x00, +0x24,0x20,0x82,0x00, +0x82,0x61,0x0C,0x00, +0x82,0x51,0x0A,0x00, +0x0F,0xC0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x25,0x20,0x8C,0x00, +0x25,0x28,0xAA,0x00, +0x24,0x70,0xC6,0x01, +0x24,0x58,0x66,0x01, +0x24,0x28,0xA2,0x00, +0x24,0x18,0x66,0x00, +0x00,0x71,0x0E,0x00, +0x24,0x20,0x82,0x00, +0x00,0x59,0x0B,0x00, +0x24,0x38,0xE6,0x00, +0x25,0x20,0x8E,0x00, +0x25,0x28,0xAB,0x00, +0x02,0x3C,0x07,0x00, +0x02,0x1C,0x03,0x00, +0x16,0x00,0xA3,0xA5, +0x0C,0x00,0xA4,0xAD, +0x10,0x00,0xA5,0xAD, +0x4D,0x2A,0x00,0x08, +0x14,0x00,0xA7,0xA5, +0x30,0x00,0xB1,0x8F, +0xF5,0x29,0x00,0x08, +0x21,0x20,0x00,0x02, +0x25,0xB0,0x05,0x3C, +0x4C,0x00,0xA2,0x34, +0x02,0x80,0x07,0x3C, +0x00,0x00,0x43,0x90, +0x30,0x1F,0xE4,0x24, +0xC1,0x1B,0x82,0x90, +0x03,0x00,0x66,0x30, +0x24,0x00,0x46,0x10, +0x00,0x00,0x00,0x00, +0x18,0x00,0xC0,0x14, +0x25,0xB0,0x03,0x3C, +0xE6,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x15,0x00,0x40,0x14, +0x58,0x00,0x62,0x34, +0x1C,0x00,0x02,0x24, +0x50,0x0C,0xA3,0x34, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x58,0x0C,0x42,0x34, +0x1C,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x25,0xB0,0x03,0x3C, +0x58,0x00,0x62,0x34, +0x00,0x00,0x45,0x8C, +0x29,0xB0,0x04,0x3C, +0x5C,0x00,0x63,0x34, +0x00,0x00,0x85,0xAC, +0x00,0x00,0x65,0x8C, +0x30,0x1F,0xE2,0x24, +0x04,0x00,0x84,0x34, +0xC1,0x1B,0x46,0xA0, +0x00,0x00,0x85,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x2D,0x0A,0x46,0x34, +0xA2,0x0D,0x43,0x34, +0xA4,0x0D,0x44,0x34, +0xA6,0x0D,0x45,0x34, +0xA8,0x0D,0x42,0x34, +0x00,0x00,0x67,0x94, +0x00,0x00,0x88,0x94, +0x00,0x00,0xA9,0x94, +0x00,0x00,0x44,0x94, +0x00,0x00,0xC3,0x90, +0x02,0x80,0x0A,0x3C, +0x30,0x1F,0x42,0x25, +0x40,0x00,0x63,0x34, +0xFF,0x00,0x63,0x30, +0xDE,0x02,0x44,0xA4, +0x00,0x00,0xC3,0xA0, +0xD8,0x02,0x47,0xA4, +0xDA,0x02,0x48,0xA4, +0xDC,0x02,0x49,0xA4, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x07,0x3C, +0x5B,0x0A,0xE2,0x34, +0x00,0x00,0x44,0x90, +0x30,0x1F,0x46,0x25, +0x5C,0x0A,0xE2,0x34, +0x00,0x00,0x45,0x90, +0xD8,0x02,0xC3,0x94, +0xDA,0x02,0xC2,0x94, +0xDC,0x02,0xC9,0x94, +0xDE,0x02,0xC8,0x94, +0xFF,0x00,0x84,0x30, +0x21,0x18,0x62,0x00, +0x00,0x22,0x04,0x00, +0xFF,0x00,0xA5,0x30, +0x21,0x20,0x85,0x00, +0x21,0x18,0x69,0x00, +0xFF,0xFF,0x82,0x30, +0x21,0x18,0x68,0x00, +0x21,0x18,0x62,0x00, +0x64,0x0C,0xE7,0x34, +0xFF,0xFF,0x42,0x30, +0xE0,0x02,0xC3,0xAC, +0x00,0x00,0xE2,0xA4, +0xE4,0x02,0xC4,0xA4, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x42,0x8D, +0x01,0x00,0x03,0x24, +0x0F,0x00,0x44,0x30, +0x07,0x00,0x83,0x10, +0x30,0x1F,0x45,0x25, +0xB6,0x5F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE4,0x02,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x17,0x02,0x00, +0x03,0x00,0x42,0x30, +0xF5,0xFF,0x40,0x14, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0x3F,0x00,0x64,0x10, +0x30,0x1F,0x44,0x25, +0xE6,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x40,0x14, +0x01,0x00,0x03,0x24, +0x30,0x1F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x0F,0x00,0x42,0x30, +0x3C,0x00,0x43,0x10, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0x45,0x25, +0xE6,0x02,0xA3,0x90, +0xFF,0x00,0x02,0x24, +0xE0,0xFF,0x62,0x14, +0x25,0xB0,0x03,0x3C, +0xC8,0x02,0xA2,0x94, +0xE0,0x02,0xA6,0x8C, +0x50,0x0C,0x63,0x34, +0x00,0x00,0x64,0x90, +0x2B,0x10,0xC2,0x00, +0x85,0x00,0x40,0x10, +0x7F,0x00,0x84,0x30, +0xFF,0xFF,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x30,0x1F,0x45,0x25, +0xD0,0x02,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x64,0x00, +0x78,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x20,0x60,0x00, +0x30,0x1F,0x43,0x25, +0xE0,0x02,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x11,0x27,0x42,0x2C, +0x6D,0x00,0x40,0x14, +0x3A,0x00,0x82,0x2C, +0x32,0x00,0x04,0x24, +0x44,0x00,0x03,0x24, +0x25,0xB0,0x02,0x3C, +0x30,0x0C,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x25,0xB0,0x02,0x3C, +0x50,0x0C,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x58,0x0C,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0xA4,0x2B,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE6,0x02,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xBF,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x02,0x24, +0xB6,0x2B,0x00,0x08, +0xE6,0x02,0xA2,0xA0, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0xA4,0xFF,0x60,0x10, +0xFF,0xFF,0x02,0x34, +0x80,0x36,0x83,0x8C, +0x00,0x00,0x00,0x00, +0xA0,0xFF,0x62,0x10, +0x00,0x00,0x00,0x00, +0xE0,0x02,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x65,0x00,0x62,0x2C, +0x59,0x00,0x40,0x14, +0x28,0x00,0x62,0x2C, +0xD2,0x02,0x83,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x03,0x00, +0x03,0x16,0x02,0x00, +0xFE,0xFF,0x42,0x24, +0xFC,0xFF,0x42,0x28, +0x02,0x00,0x40,0x10, +0xFE,0xFF,0x62,0x24, +0xFC,0xFF,0x02,0x24, +0xD2,0x02,0x82,0xA0, +0x30,0x1F,0x45,0x25, +0x80,0x36,0xA2,0x8C, +0xD2,0x02,0xA3,0x90, +0xCE,0x02,0xA6,0x90, +0x02,0x11,0x02,0x00, +0x7F,0x00,0x42,0x30, +0x0A,0x00,0x44,0x24, +0x23,0x18,0x83,0x00, +0x00,0x26,0x03,0x00, +0x03,0x26,0x04,0x00, +0xFF,0x00,0xC2,0x30, +0x2A,0x10,0x44,0x00, +0x4D,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x00,0x26,0x06,0x00, +0x03,0x26,0x04,0x00, +0x30,0x1F,0x43,0x25, +0xE0,0x02,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x11,0x27,0x42,0x2C, +0x33,0x00,0x40,0x14, +0x3A,0x00,0x82,0x28, +0x32,0x00,0x82,0x28, +0x30,0x00,0x40,0x10, +0x3A,0x00,0x82,0x28, +0x32,0x00,0x04,0x24, +0x44,0x00,0x03,0x24, +0x25,0xB0,0x02,0x3C, +0x30,0x0C,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x25,0xB0,0x02,0x3C, +0x50,0x0C,0x42,0x34, +0xFF,0x00,0x84,0x30, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x25,0xB0,0x02,0x3C, +0x58,0x0C,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0xA4,0x2B,0x00,0x08, +0x00,0x00,0x00,0x00, +0x95,0xFF,0x40,0x10, +0x48,0x00,0x03,0x24, +0xDD,0x2B,0x00,0x08, +0x44,0x00,0x03,0x24, +0xD1,0x02,0xA3,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x83,0x00, +0xD5,0x2B,0x00,0x08, +0x0B,0x20,0x62,0x00, +0xCA,0x02,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xC2,0x00, +0x7A,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0xCC,0x02,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xC2,0x00, +0x07,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x2B,0x00,0x08, +0x01,0x00,0x82,0x24, +0xD2,0xFF,0x40,0x10, +0x48,0x00,0x03,0x24, +0x2F,0x2C,0x00,0x08, +0x44,0x00,0x03,0x24, +0xCD,0x2B,0x00,0x08, +0x02,0x00,0x82,0x24, +0xB2,0xFF,0x40,0x10, +0x30,0x1F,0x45,0x25, +0xD2,0x02,0x83,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x03,0x00, +0x03,0x16,0x02,0x00, +0x02,0x00,0x42,0x24, +0x0D,0x00,0x42,0x28, +0x09,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x13,0x2C,0x00,0x08, +0x0C,0x00,0x02,0x24, +0xCF,0x02,0xA3,0x80, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x62,0x30, +0x2A,0x10,0x82,0x00, +0x24,0x2C,0x00,0x08, +0x0B,0x20,0x62,0x00, +0x13,0x2C,0x00,0x08, +0x02,0x00,0x62,0x24, +0xC0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x25,0xB0,0x14,0x3C, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x24,0x00,0xB3,0xAF, +0xD8,0x00,0x86,0x36, +0x00,0x00,0xC3,0x90, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x51,0x24, +0x2A,0xB0,0x10,0x3C, +0xA0,0xFF,0x02,0x24, +0x25,0x18,0x62,0x00, +0x34,0x00,0x05,0x36, +0xFE,0xFF,0x02,0x24, +0xBC,0x02,0x33,0x92, +0x40,0x00,0x04,0x24, +0x00,0x00,0xC3,0xA0, +0x00,0x00,0xA2,0xA0, +0x25,0x24,0x00,0x0C, +0x00,0x9E,0x13,0x00, +0x21,0x90,0x40,0x00, +0x8A,0x00,0x40,0x12, +0x00,0x40,0x02,0x3C, +0x08,0x00,0x43,0x8E, +0xB0,0x03,0x82,0x36, +0x25,0xB0,0x1E,0x3C, +0x21,0x20,0x40,0x02, +0x00,0x00,0x43,0xAC, +0x0C,0x4D,0x00,0x0C, +0x21,0xB8,0x20,0x02, +0x42,0x00,0xD5,0x37, +0x03,0x0C,0xD1,0x37, +0x17,0x0E,0xD6,0x37, +0x04,0x00,0x14,0x24, +0x2A,0xB0,0x03,0x3C, +0x06,0x00,0x63,0x34, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x42,0x30, +0x0A,0x00,0x40,0x18, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x8C,0xF0,0x84,0x24, +0x00,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x42,0x30, +0xFC,0xFF,0x40,0x1C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x45,0x8E, +0x20,0x10,0x06,0x3C, +0x01,0x00,0x04,0x24, +0x00,0xFE,0xC6,0x34, +0x40,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA4,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x90,0xF0,0x42,0x24, +0x00,0x00,0x45,0x8C, +0x01,0x00,0x03,0x24, +0x21,0x20,0x00,0x00, +0x00,0x00,0xA3,0xA0, +0xFF,0xFF,0x03,0x24, +0x00,0x00,0xA3,0xA2, +0x00,0x00,0x22,0x92, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x40,0x00,0x42,0x34, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x02,0x00,0x02,0x24, +0x02,0x80,0x04,0x3C, +0x00,0x00,0xA2,0xA0, +0x30,0x1F,0x83,0x24, +0xC1,0x02,0x62,0x90, +0x00,0x00,0xC4,0x92, +0x21,0x28,0x00,0x00, +0x00,0x00,0xC2,0xA2, +0xFF,0x00,0x90,0x30, +0x01,0x00,0xA2,0x24, +0xFF,0x00,0x45,0x30, +0x06,0x00,0xA3,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0xA2,0x24, +0xEF,0xFF,0x02,0x24, +0x64,0x00,0x04,0x24, +0x00,0x00,0xA2,0xA2, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x22,0x92, +0x21,0x20,0x00,0x00, +0xBF,0x00,0x42,0x30, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x54,0x22,0x00,0x0C, +0x84,0x03,0x04,0x24, +0xF4,0x08,0xC2,0x37, +0x00,0x00,0x43,0x8C, +0x00,0x80,0x04,0x3C, +0xDF,0x07,0x84,0x34, +0x00,0x00,0xD0,0xA2, +0x21,0x10,0x00,0x00, +0x24,0x28,0x64,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x00,0x00,0xA0,0xA2, +0x00,0x00,0x22,0x92, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x40,0x00,0x42,0x34, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0xBE,0x02,0xE2,0x92, +0x1F,0x00,0xA3,0x30, +0x2B,0x10,0x62,0x00, +0x0A,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xBF,0x02,0xE2,0x92, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0x05,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x02,0x3C, +0x25,0x10,0x62,0x00, +0x21,0x98,0x62,0x02, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x43,0x90, +0x22,0x00,0x02,0x24, +0x19,0x00,0x62,0x10, +0x92,0x00,0x02,0x24, +0x18,0x00,0x62,0x10, +0x02,0x80,0x03,0x3C, +0xFF,0xFF,0x94,0x26, +0x54,0x22,0x00,0x0C, +0xF4,0x01,0x04,0x24, +0x89,0xFF,0x81,0x06, +0x2A,0xB0,0x03,0x3C, +0x04,0x00,0x40,0x12, +0x21,0x10,0x60,0x02, +0x3D,0x24,0x00,0x0C, +0x21,0x20,0x40,0x02, +0x21,0x10,0x60,0x02, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xBE,0x02,0x62,0x90, +0xC0,0x07,0xA3,0x30, +0x82,0x19,0x03,0x00, +0x2B,0x10,0x62,0x00, +0xE3,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0xBF,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x43,0x00, +0xDD,0xFF,0x40,0x10, +0x00,0x12,0x03,0x00, +0x10,0x00,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x13,0x2D,0x00,0x08, +0x21,0x98,0x62,0x02, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0xF0,0xF8,0x06,0x34, +0x15,0x00,0x04,0x24, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x5F,0x47,0x00,0x0C, +0x14,0x00,0xB1,0xAF, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x02,0x80,0x12,0x3C, +0xFF,0xFF,0x05,0x36, +0x56,0x30,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x30,0x1F,0x51,0x26, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x04,0x03,0x23,0x92, +0x04,0x00,0x02,0x24, +0x20,0x00,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0x14,0x03,0x25,0x8E, +0x25,0xB0,0x10,0x3C, +0x43,0x60,0x00,0x0C, +0x00,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x04,0x0E,0x04,0x36, +0x18,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x08,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x10,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x14,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x18,0x0E,0x04,0x36, +0x14,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x1C,0x0E,0x04,0x36, +0x30,0x1F,0x43,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x04,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0x00,0x0E,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x14,0x03,0x25,0x8E, +0x00,0x00,0x00,0x00, +0xDE,0xFF,0x65,0x14, +0x25,0xB0,0x10,0x3C, +0x6A,0x2D,0x00,0x08, +0x30,0x1F,0x43,0x26, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0xF0,0xF8,0x06,0x34, +0x15,0x00,0x04,0x24, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x5F,0x47,0x00,0x0C, +0x14,0x00,0xB1,0xAF, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x56,0x30,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x02,0x80,0x10,0x3C, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x30,0x1F,0x02,0x26, +0x04,0x03,0x46,0x90, +0x25,0xB0,0x11,0x3C, +0x10,0x10,0x12,0x3C, +0x01,0x00,0x03,0x24, +0x00,0x0E,0x24,0x36, +0x1E,0x00,0xC3,0x10, +0x10,0x10,0x45,0x36, +0x43,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x08,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x05,0x24, +0x10,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x14,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x18,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x1C,0x0E,0x24,0x36, +0x43,0x60,0x00,0x0C, +0x10,0x10,0x45,0x36, +0x30,0x1F,0x03,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0x00,0x00,0x86,0x8C, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xC5,0x14, +0x30,0x1F,0x03,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x02,0x80,0x13,0x3C, +0x14,0x00,0xB1,0xAF, +0x30,0x1F,0x71,0x26, +0x0C,0x03,0x26,0x8E, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x15,0x00,0x04,0x24, +0x20,0x00,0xBF,0xAF, +0x5F,0x47,0x00,0x0C, +0x18,0x00,0xB2,0xAF, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x10,0x03,0x26,0x8E, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x04,0x03,0x22,0x92, +0x25,0xB0,0x12,0x3C, +0x08,0x00,0x40,0x14, +0x08,0x0E,0x44,0x36, +0x25,0xB0,0x02,0x3C, +0x00,0x0E,0x42,0x34, +0x00,0x00,0x45,0x8C, +0xEC,0x02,0x23,0x8E, +0x00,0x00,0x00,0x00, +0x17,0x00,0xA3,0x10, +0x30,0x1F,0x62,0x26, +0xE8,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEC,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x00,0x0E,0x44,0x36, +0xF0,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x04,0x0E,0x44,0x36, +0xF4,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x10,0x0E,0x44,0x36, +0xF8,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x14,0x0E,0x44,0x36, +0xFC,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x18,0x0E,0x44,0x36, +0x00,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x1C,0x0E,0x44,0x36, +0x30,0x1F,0x62,0x26, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x28,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x40,0xA0, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x14,0x00,0xB1,0xAF, +0x30,0x1F,0x51,0x26, +0x0C,0x03,0x26,0x8E, +0x10,0x00,0xB0,0xAF, +0x0F,0x00,0x10,0x3C, +0xFF,0xFF,0x05,0x36, +0x1C,0x00,0xBF,0xAF, +0x5F,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x10,0x03,0x26,0x8E, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x04,0x03,0x23,0x92, +0x03,0x00,0x02,0x24, +0x2C,0x00,0x62,0x10, +0x25,0xB0,0x02,0x3C, +0xEC,0x02,0x25,0x8E, +0x25,0xB0,0x10,0x3C, +0x43,0x60,0x00,0x0C, +0x00,0x0E,0x04,0x36, +0xF0,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x04,0x0E,0x04,0x36, +0xF4,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x10,0x0E,0x04,0x36, +0xF8,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x14,0x0E,0x04,0x36, +0xFC,0x02,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x18,0x0E,0x04,0x36, +0x00,0x03,0x25,0x8E, +0x43,0x60,0x00,0x0C, +0x1C,0x0E,0x04,0x36, +0x08,0x03,0x24,0x8E, +0xE8,0x02,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x21,0x28,0x44,0x00, +0x00,0xFF,0xA3,0x30, +0xFF,0xFF,0x02,0x3C, +0xFF,0x00,0x42,0x34, +0x01,0x3F,0x63,0x2C, +0x24,0x10,0xA2,0x00, +0x0C,0x00,0x60,0x10, +0x08,0x0E,0x04,0x36, +0x43,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x43,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x03,0x00,0x02,0x24, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x03,0x62,0xA0, +0x32,0x2E,0x00,0x08, +0x00,0x3F,0x45,0x34, +0x00,0x0E,0x42,0x34, +0x00,0x00,0x43,0x8C, +0xEC,0x02,0x25,0x8E, +0x00,0x00,0x00,0x00, +0xD2,0xFF,0x65,0x14, +0x25,0xB0,0x10,0x3C, +0x35,0x2E,0x00,0x08, +0x30,0x1F,0x43,0x26, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x20,0x00,0xB4,0xAF, +0x24,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x44,0x26, +0x0C,0x24,0x82,0x8C, +0x30,0x1F,0x43,0x8E, +0x04,0x03,0x93,0x90, +0x02,0x11,0x02,0x00, +0x7F,0x00,0x54,0x30, +0xF0,0xF0,0x63,0x30, +0x00,0x10,0x02,0x24, +0x6A,0x00,0x62,0x10, +0x01,0x00,0x02,0x24, +0x25,0xB0,0x08,0x3C, +0x4C,0x00,0x03,0x35, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x42,0x30, +0x08,0x00,0x40,0x10, +0x30,0x1F,0x45,0x26, +0x30,0x1F,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x02,0x13,0x02,0x00, +0x0F,0x00,0x42,0x30, +0x2F,0x00,0x40,0x10, +0x00,0x0E,0x05,0x35, +0x30,0x1F,0x45,0x26, +0x04,0x03,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x0F,0x00,0x40,0x14, +0x30,0x1F,0x42,0x26, +0x25,0xB0,0x02,0x3C, +0x84,0x01,0x42,0x34, +0x00,0x00,0x44,0x8C, +0x0D,0x00,0x03,0x24, +0x7C,0x00,0x83,0x10, +0x3E,0x00,0x02,0x24, +0x4A,0x00,0x03,0x24, +0x1F,0x03,0xA2,0xA0, +0x1C,0x03,0xA3,0xA0, +0x45,0x00,0x02,0x24, +0x43,0x00,0x03,0x24, +0x1D,0x03,0xA2,0xA0, +0x1E,0x03,0xA3,0xA0, +0x30,0x1F,0x42,0x26, +0x0C,0x24,0x43,0x8C, +0x25,0xB0,0x02,0x3C, +0x60,0x0C,0x42,0x34, +0x02,0x19,0x03,0x00, +0xFF,0x00,0x63,0x30, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x45,0x8E, +0x10,0x10,0x02,0x24, +0xF0,0xF0,0xA3,0x30, +0x3F,0x00,0x62,0x10, +0x30,0x1F,0x44,0x26, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x5F,0x00,0x40,0x10, +0x10,0x0E,0x07,0x35, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x08,0x0E,0x02,0x35, +0x04,0x0E,0x03,0x35, +0x00,0x00,0x44,0x8C, +0x00,0x00,0xA5,0x8C, +0x00,0x00,0x66,0x8C, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x49,0x24, +0xE8,0x02,0x24,0xAD, +0xEC,0x02,0x25,0xAD, +0xF0,0x02,0x26,0xAD, +0x14,0x0E,0x04,0x35, +0x02,0x80,0x02,0x3C, +0x18,0x0E,0x05,0x35, +0x00,0x00,0xE7,0x8C, +0x1C,0x0E,0x06,0x35, +0x00,0x00,0x83,0x8C, +0xDE,0x5D,0x4A,0x90, +0x00,0x00,0xA2,0x8C, +0x00,0x00,0xC4,0x8C, +0xF4,0x02,0x27,0xAD, +0xFC,0x02,0x22,0xAD, +0x22,0x00,0x02,0x24, +0xF8,0x02,0x23,0xAD, +0x5B,0x00,0x42,0x11, +0x00,0x03,0x24,0xAD, +0x92,0x00,0x02,0x24, +0x59,0x00,0x42,0x11, +0x0D,0x08,0x02,0x35, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x30,0x1F,0x43,0x8E, +0xFF,0xFF,0x02,0x3C, +0xFF,0x0F,0x42,0x34, +0x24,0x18,0x62,0x00, +0x00,0x10,0x63,0x34, +0x66,0x2E,0x00,0x08, +0x30,0x1F,0x43,0xAE, +0x3A,0x00,0x62,0x12, +0x04,0x00,0x02,0x24, +0x38,0x00,0x62,0x12, +0x30,0x1F,0x43,0x26, +0xFF,0xFF,0x02,0x24, +0x59,0x2E,0x00,0x08, +0x04,0x03,0x62,0xA0, +0x0C,0x24,0x83,0x8C, +0xFF,0xFF,0x02,0x34, +0xBF,0xFF,0x62,0x10, +0x02,0x12,0x05,0x00, +0x0F,0x00,0x45,0x30, +0x01,0x00,0x03,0x24, +0xBB,0xFF,0xA3,0x14, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x63,0x30, +0xB5,0xFF,0x60,0x10, +0x03,0x00,0x02,0x24, +0x65,0x00,0x62,0x12, +0x04,0x00,0x62,0x2A, +0x47,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x6A,0x00,0x60,0x12, +0x00,0x00,0x00,0x00, +0xAD,0xFF,0x65,0x16, +0x00,0x00,0x00,0x00, +0x1C,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0x56,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x1F,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x54,0x00, +0x48,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xBE,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x3B,0x00,0x02,0x24, +0x46,0x00,0x03,0x24, +0x1F,0x03,0xA2,0xA0, +0x1C,0x03,0xA3,0xA0, +0x41,0x00,0x02,0x24, +0x40,0x00,0x03,0x24, +0x1D,0x03,0xA2,0xA0, +0x79,0x2E,0x00,0x08, +0x1E,0x03,0xA3,0xA0, +0x00,0x00,0xE3,0x8C, +0x3F,0x3F,0x02,0x3C, +0x3F,0x3F,0x42,0x34, +0x9E,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x67,0x2E,0x00,0x08, +0x30,0x1F,0x45,0x26, +0x0F,0x00,0x10,0x3C, +0x01,0x00,0x11,0x3C, +0xFF,0xFF,0x05,0x36, +0xF4,0x98,0x26,0x36, +0x5F,0x47,0x00,0x0C, +0x15,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x56,0x30,0x26,0x36, +0x5F,0x47,0x00,0x0C, +0x1A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x30,0x1F,0x43,0x26, +0xFF,0xFF,0x02,0x24, +0x59,0x2E,0x00,0x08, +0x04,0x03,0x62,0xA0, +0x0D,0x08,0x02,0x35, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x63,0x30, +0x08,0x00,0x62,0x2C, +0x0F,0x00,0x63,0x38, +0xA2,0xFF,0x40,0x14, +0x01,0x00,0x65,0x24, +0x00,0x16,0x05,0x00, +0x00,0x24,0x05,0x00, +0x00,0x1A,0x05,0x00, +0x25,0x10,0x44,0x00, +0x25,0x10,0x43,0x00, +0x25,0x10,0x45,0x00, +0x25,0x18,0x65,0x00, +0x18,0x03,0x23,0xAD, +0xB8,0x2E,0x00,0x08, +0x14,0x03,0x22,0xAD, +0x04,0x00,0x02,0x24, +0x11,0x00,0x62,0x12, +0xFF,0x00,0x02,0x24, +0x66,0xFF,0x62,0x16, +0x00,0x00,0x00,0x00, +0x1E,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0x21,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x7A,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x1D,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x54,0x00, +0xF8,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x3B,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x20,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0xA8,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFC,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x1E,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x02, +0xE6,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x03,0x82,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x54,0x00, +0x9A,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0xFC,0x2D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x8B,0x2E,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x08,0x3C, +0x30,0x1F,0x05,0x25, +0x80,0x36,0xA4,0x8C, +0xE6,0x02,0xA3,0x90, +0x02,0x11,0x04,0x00, +0x26,0x00,0x60,0x14, +0x7F,0x00,0x46,0x30, +0x25,0xB0,0x07,0x3C, +0x4C,0x00,0xE2,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x20,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x02,0x34, +0x1D,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x00,0x08,0xE3,0x34, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x19,0x00,0x40,0x10, +0x4B,0x00,0xC2,0x2C, +0x3E,0x00,0x40,0x10, +0x01,0x00,0x04,0x24, +0xD8,0xFF,0xC2,0x24, +0x1E,0x00,0x42,0x2C, +0x49,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x44,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x25,0xB0,0x02,0x3C, +0x87,0x0C,0x42,0x34, +0x20,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0xD3,0x02,0x80,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x17,0x00,0x40,0x10, +0x01,0x00,0x04,0x24, +0xD8,0xFF,0xC2,0x24, +0x1E,0x00,0x42,0x2C, +0x44,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x40,0x10, +0x23,0x00,0xC2,0x2C, +0x25,0xB0,0x02,0x3C, +0x30,0x0C,0x42,0x34, +0x44,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0xD3,0x02,0x80,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xD3,0x02,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xE7,0xFF,0x44,0x10, +0x43,0x00,0x02,0x24, +0x30,0x0C,0xE3,0x34, +0xD3,0x02,0xA4,0xA0, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xD3,0x02,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xC0,0xFF,0x44,0x10, +0x10,0x00,0x02,0x24, +0x87,0x0C,0xE3,0x34, +0xD3,0x02,0xA4,0xA0, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xC7,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x02,0x00,0x03,0x24, +0xC2,0xFF,0x43,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x87,0x0C,0x42,0x34, +0xD3,0x02,0x83,0xA0, +0x00,0x00,0x40,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xB4,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x04,0x25, +0xD3,0x02,0x82,0x90, +0x02,0x00,0x03,0x24, +0xAF,0xFF,0x43,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xD3,0x02,0x83,0xA0, +0x30,0x0C,0x42,0x34, +0x42,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x01,0x80,0x02,0x3C, +0x18,0x03,0x64,0x34, +0x7C,0xBF,0x42,0x24, +0x00,0x00,0x82,0xAC, +0x00,0x60,0x07,0x40, +0x01,0x00,0xE1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x20,0x80,0x02,0x3C, +0x30,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x25,0xB0,0x06,0x3C, +0x01,0x80,0x02,0x3C, +0x7D,0xBF,0x45,0x24, +0x33,0x03,0xC3,0x34, +0x00,0x00,0x85,0xAC, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0xFB,0xFF,0x40,0x10, +0x30,0x03,0xC2,0x34, +0x00,0x00,0x45,0x8C, +0x0F,0x00,0x03,0x3C, +0xFF,0xFF,0x63,0x34, +0x24,0x28,0xA3,0x00, +0x40,0x11,0x05,0x00, +0x23,0x10,0x45,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0xAF,0x0F,0x04,0x3C, +0xC0,0x10,0x02,0x00, +0x00,0xA0,0x84,0x34, +0x1B,0x00,0x82,0x00, +0x02,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xC2,0x28,0x05,0x00, +0xA0,0x3E,0x65,0xAC, +0x12,0x20,0x00,0x00, +0xA4,0x3E,0x64,0xAC, +0x00,0x60,0x87,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x14,0x5F,0x43,0xA0, +0xD0,0x07,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xE4,0x5E,0x44,0xAC, +0x13,0x5F,0x60,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x04,0x3C, +0x28,0x00,0x85,0x34, +0x02,0x00,0x82,0x94, +0x04,0x00,0x84,0x24, +0x05,0x00,0x40,0x14, +0x2B,0x18,0xA4,0x00, +0xFB,0xFF,0x60,0x10, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xBE,0x00,0x63,0x34, +0x00,0x00,0x62,0x94, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x42,0x2C, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x19,0x00,0x40,0x10, +0x74,0x57,0x64,0x24, +0x74,0x57,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x15,0x00,0x44,0x14, +0x02,0x80,0x02,0x3C, +0x14,0x5F,0x43,0x90, +0x01,0x00,0x02,0x24, +0xFF,0x00,0x63,0x30, +0x10,0x00,0x62,0x10, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x05,0x00,0x42,0x28, +0x0A,0x00,0x40,0x10, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x5A,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x60,0x14, +0x21,0x10,0x80,0x00, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x10,0x00,0xBF,0x8F, +0x21,0x20,0x00,0x00, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x17,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2C,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x74,0x57,0x43,0x8C, +0x74,0x57,0x42,0x24, +0x28,0x00,0x62,0x14, +0x02,0x80,0x03,0x3C, +0x0C,0x5F,0x62,0x90, +0x01,0x00,0x04,0x24, +0xFF,0x00,0x42,0x30, +0x23,0x00,0x44,0x10, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x03,0x00,0x42,0x28, +0x1D,0x00,0x40,0x10, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x30, +0x18,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x0E,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x10,0x00,0x42,0x30, +0x13,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x14,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x0E,0x00,0x44,0x10, +0x02,0x80,0x02,0x3C, +0x15,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x60,0x14, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x6C,0x3B,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x60,0x14, +0x21,0x18,0x00,0x00, +0x40,0x39,0x42,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x00,0x40,0x14, +0x01,0x00,0x03,0x24, +0x21,0x18,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x23,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x0E,0x00,0x40,0x10, +0x6C,0x57,0x65,0x24, +0x6C,0x57,0x62,0x8C, +0x02,0x80,0x04,0x3C, +0x64,0x57,0x86,0x24, +0x09,0x00,0x45,0x14, +0x01,0x00,0x03,0x24, +0x64,0x57,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x46,0x14, +0x21,0x10,0x60,0x00, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x10,0x00,0xBF,0x8F, +0x21,0x18,0x00,0x00, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0xFF,0x00,0x84,0x30, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0E,0x00,0x80,0x10, +0x02,0x80,0x13,0x3C, +0x44,0x5F,0x62,0x92, +0x01,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x39,0x00,0x43,0x10, +0x25,0xB0,0x03,0x3C, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x44,0x5F,0x62,0x92, +0x02,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0xF4,0xFF,0x43,0x14, +0x44,0x08,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x04,0x0C,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFD,0x00,0x42,0x30, +0x04,0x0C,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x04,0x0D,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFD,0x00,0x42,0x30, +0x04,0x0D,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x11,0x3C, +0x70,0x0E,0x25,0x8E, +0x7F,0xFE,0x10,0x3C, +0xFF,0xFF,0x10,0x36, +0x24,0x28,0xB0,0x00, +0x94,0x60,0x00,0x0C, +0x70,0x0E,0x04,0x24, +0x8C,0x0E,0x25,0x8E, +0x8C,0x0E,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x24,0x28,0xB0,0x00, +0x01,0x00,0x02,0x24, +0x44,0x5F,0x62,0xA2, +0x00,0x60,0x92,0x40, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x04,0x0C,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x34, +0x04,0x0C,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x04,0x0D,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x34, +0x04,0x0D,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x10,0x3C, +0x70,0x0E,0x05,0x8E, +0x80,0x01,0x11,0x3C, +0x70,0x0E,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x25,0x28,0xB1,0x00, +0x8C,0x0E,0x05,0x8E, +0x8C,0x0E,0x04,0x24, +0x94,0x60,0x00,0x0C, +0x25,0x28,0xB1,0x00, +0x03,0x00,0x05,0x3C, +0x59,0x01,0xA5,0x34, +0x94,0x60,0x00,0x0C, +0x44,0x08,0x04,0x24, +0x02,0x00,0x02,0x24, +0x44,0x5F,0x62,0xA2, +0xDD,0x30,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xFC,0x37,0x02,0x24, +0x40,0x00,0x64,0x34, +0x00,0x00,0x82,0xA4, +0x42,0x00,0x65,0x34, +0x03,0x00,0x02,0x24, +0x00,0x00,0xA0,0xA0, +0x03,0x08,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0B,0x00,0x60,0x10, +0x25,0xB0,0x10,0x3C, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x32,0x00,0x40,0x14, +0x00,0x02,0x05,0x3C, +0x00,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x25,0xB0,0x10,0x3C, +0x21,0x00,0x06,0x36, +0x00,0x00,0xC2,0x90, +0x18,0x00,0x03,0x36, +0x42,0x00,0x05,0x36, +0x01,0x00,0x42,0x34, +0x00,0x00,0xC2,0xA0, +0x40,0x00,0x11,0x36, +0x00,0x00,0x60,0xA0, +0xFF,0xFF,0x02,0x24, +0xFC,0x57,0x03,0x24, +0x00,0x00,0xA2,0xA0, +0x64,0x00,0x04,0x24, +0x00,0x00,0x23,0xA6, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFC,0x77,0x02,0x24, +0x00,0x00,0x22,0xA6, +0x54,0x22,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0x03,0x08,0x00,0xA2, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x0A,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x25,0xB0,0x10,0x3C, +0x40,0x00,0x10,0x36, +0xFC,0x37,0x02,0x24, +0x00,0x00,0x02,0xA6, +0x54,0x22,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0xFC,0x77,0x02,0x24, +0x00,0x00,0x02,0xA6, +0x54,0x22,0x00,0x0C, +0x0A,0x00,0x04,0x24, +0xFC,0x57,0x02,0x24, +0x00,0x00,0x02,0xA6, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x9B,0x30,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x2F,0x31,0x00,0x08, +0x25,0xB0,0x10,0x3C, +0xC0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x18,0x00,0xB0,0xAF, +0x3C,0x00,0xBF,0xAF, +0x38,0x00,0xBE,0xAF, +0x34,0x00,0xB7,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0xFF,0x00,0x90,0x30, +0xFF,0x00,0xB2,0x30, +0x21,0xA0,0x00,0x00, +0x00,0x60,0x16,0x40, +0x01,0x00,0xC1,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x13,0x3C, +0xF6,0x5E,0x62,0x92, +0x0F,0x00,0x11,0x32, +0x0F,0x00,0x42,0x30, +0x12,0x00,0x51,0x10, +0x04,0x00,0x02,0x32, +0x40,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0x0C,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0x8F,0x00,0x43,0x10, +0x08,0x00,0x02,0x32, +0xF6,0x5E,0x62,0x92, +0x04,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0xD2,0x01,0x43,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0x02,0x00,0x03,0x24, +0x0F,0x00,0x42,0x30, +0x9B,0x00,0x43,0x10, +0x06,0x00,0x02,0x32, +0x02,0x80,0x10,0x3C, +0xF5,0x5E,0x03,0x92, +0xF6,0x5E,0x62,0x92, +0x0F,0x00,0x63,0x30, +0x0F,0x00,0x42,0x30, +0x2A,0x10,0x43,0x00, +0x1C,0x00,0x40,0x14, +0x02,0x80,0x12,0x3C, +0xF5,0x5E,0x02,0x92, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0x17,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xDA,0x5D,0x42,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x43,0x30, +0x52,0x00,0x60,0x14, +0x04,0x00,0x42,0x30, +0x10,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x43,0x92, +0x02,0x80,0x06,0x3C, +0x5C,0xE9,0xC5,0x90, +0x0F,0x00,0x63,0x30, +0x25,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0xDD,0x02,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xF5,0x5E,0x04,0x92, +0x80,0xFF,0x02,0x24, +0xBF,0xFF,0x03,0x24, +0x26,0x28,0xA2,0x00, +0x24,0x20,0x83,0x00, +0x5C,0xE9,0xC5,0xA0, +0xF5,0x5E,0x04,0xA2, +0x00,0x60,0x96,0x40, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0xF6,0x5E,0x62,0x92, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x30, +0x4C,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x30, +0x03,0x00,0x40,0x10, +0x08,0x00,0x02,0x32, +0x1B,0x00,0x40,0x10, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x92, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x30, +0x0C,0x00,0x40,0x14, +0x08,0x00,0x02,0x32, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0x40,0x12, +0x02,0x80,0x03,0x3C, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x03,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x4E,0x00,0x0C, +0x21,0x20,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0xF6,0x5E,0x63,0x92, +0x00,0x00,0x00,0x00, +0x25,0x18,0x23,0x02, +0xF6,0x5E,0x63,0xA2, +0x8E,0x31,0x00,0x08, +0x02,0x80,0x10,0x3C, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0xF2,0xFF,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x14,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0xA2,0xFF,0x60,0x14, +0x01,0x00,0x04,0x24, +0xCD,0x4E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xD9,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0x24,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x76,0x01,0x40,0x10, +0x21,0x88,0x40,0x00, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x45,0x90, +0xF6,0x5E,0x44,0x92, +0xF5,0x5E,0x02,0x92, +0xBF,0xFF,0x03,0x24, +0x0F,0x00,0x84,0x30, +0x24,0x10,0x43,0x00, +0xF5,0x5E,0x02,0xA2, +0x10,0x00,0xA5,0xA3, +0x11,0x00,0xA4,0xA3, +0x08,0x00,0x24,0x96, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA5,0x27, +0x25,0x20,0x82,0x00, +0x20,0x00,0x84,0x24, +0x5F,0x1E,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x04,0x00,0x03,0x24, +0x17,0x00,0x02,0x24, +0x0C,0x00,0x23,0xAE, +0x14,0x00,0x22,0xAE, +0x30,0x09,0x00,0x0C, +0x21,0x20,0x20,0x02, +0xB0,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0C,0x31,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xC2,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x71,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x28,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x77,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x92, +0xE0,0x3A,0x64,0x94, +0x04,0x00,0x42,0x34, +0x00,0x01,0x84,0x30, +0xF6,0x5E,0x62,0xA2, +0x61,0xFF,0x80,0x10, +0x00,0x00,0x00,0x00, +0xCD,0x4E,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x83,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x65,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x82,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x61,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x41,0xB0,0x04,0x3C, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0xF6,0x5E,0x63,0x92, +0x08,0x00,0x85,0x34, +0x82,0x00,0x02,0x24, +0x01,0x00,0x63,0x34, +0x02,0x80,0x1E,0x3C, +0xF6,0x5E,0x63,0xA2, +0x00,0x00,0x80,0xAC, +0x00,0x00,0xA2,0xA4, +0x42,0xB0,0x04,0x3C, +0x30,0x1F,0xC2,0x27, +0xB0,0x1B,0x45,0x94, +0x00,0x00,0x83,0x90, +0xBE,0xFF,0x02,0x24, +0x03,0x00,0x86,0x34, +0x24,0x18,0x62,0x00, +0x00,0x01,0xA5,0x30, +0x90,0xFF,0x02,0x24, +0x00,0x00,0x83,0xA0, +0x00,0x00,0xC2,0xA0, +0x38,0x00,0xA0,0x10, +0x25,0xB0,0x06,0x3C, +0x25,0xB0,0x04,0x3C, +0x84,0x00,0x82,0x34, +0x00,0x00,0x46,0x8C, +0x80,0x00,0x84,0x34, +0x00,0x00,0x82,0x8C, +0x02,0x80,0x0B,0x3C, +0x1C,0x5F,0x64,0x8D, +0x00,0x38,0x06,0x00, +0x21,0x30,0x00,0x00, +0x25,0xA0,0xC2,0x00, +0x21,0x18,0x00,0x00, +0x02,0x80,0x0A,0x3C, +0x25,0xA8,0xE3,0x00, +0x21,0x28,0x00,0x00, +0x24,0x5F,0x42,0x8D, +0x21,0x20,0x94,0x00, +0x2B,0x18,0x94,0x00, +0x21,0x28,0xB5,0x00, +0x21,0x28,0xA3,0x00, +0x2B,0x10,0xA2,0x00, +0x24,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x24,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x10,0x01,0x45,0x10, +0x01,0x00,0x05,0x24, +0x30,0x1F,0xC2,0x27, +0xA4,0x3E,0x43,0x8C, +0x42,0xB0,0x07,0x3C, +0x00,0x00,0xE6,0x90, +0x18,0x00,0x65,0x00, +0xFB,0xFF,0x02,0x24, +0x24,0x30,0xC2,0x00, +0x00,0x00,0xE6,0xA0, +0x67,0x46,0x06,0x3C, +0xCF,0xAC,0xC6,0x34, +0x01,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x12,0x18,0x00,0x00, +0x82,0x1A,0x03,0x00, +0x40,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0xC0,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x80,0x10,0x02,0x00, +0x19,0x00,0x46,0x00, +0x10,0x30,0x00,0x00, +0x23,0x10,0x46,0x00, +0x42,0x10,0x02,0x00, +0x21,0x30,0xC2,0x00, +0x02,0x33,0x06,0x00, +0x01,0x00,0x02,0x24, +0x8C,0x23,0x00,0x0C, +0x0A,0x30,0x46,0x00, +0x25,0xB0,0x06,0x3C, +0xF2,0x02,0xC3,0x34, +0x88,0xFF,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x11,0x00,0xC7,0x34, +0x00,0x00,0xE2,0x90, +0x08,0x00,0xC5,0x34, +0x30,0x1F,0xC4,0x27, +0x01,0x00,0x42,0x34, +0x00,0x00,0xE2,0xA0, +0x00,0x00,0xA3,0x94, +0xB0,0x1B,0x82,0x94, +0xFF,0xFF,0x64,0x30, +0x10,0x00,0x84,0x34, +0x00,0x00,0xA4,0xA4, +0xFB,0xFF,0x84,0x30, +0x00,0x00,0xA4,0xA4, +0x00,0x01,0x42,0x30, +0x02,0x00,0x84,0x34, +0x00,0x00,0xA4,0xA4, +0x04,0x00,0x40,0x10, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xFF,0xF7,0x84,0x30, +0x00,0x00,0xA4,0xA4, +0x28,0x00,0xC4,0x34, +0x00,0x00,0x83,0x94, +0xEF,0xFE,0x02,0x24, +0xFE,0xFF,0x08,0x24, +0x24,0x18,0x62,0x00, +0x00,0x00,0x83,0xA4, +0x00,0x00,0x82,0x94, +0x26,0x00,0xC5,0x34, +0x02,0x80,0x03,0x3C, +0x24,0x10,0x48,0x00, +0x00,0x00,0x82,0xA4, +0xDA,0x5D,0x64,0x90, +0x00,0x00,0xA2,0x94, +0x04,0x00,0x84,0x30, +0x00,0x24,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x09,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x24,0x10,0x48,0x00, +0x00,0x00,0xA2,0xA4, +0x00,0x00,0xE3,0x90, +0xFD,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0x00,0x00,0xE3,0xA0, +0x00,0x68,0x02,0x40, +0x00,0x08,0x42,0x30, +0xFD,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x12,0x3C, +0x11,0x00,0x43,0x36, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x26,0x00,0x44,0x36, +0x00,0x00,0x82,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x34, +0x00,0x00,0x82,0xA4, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x83,0x94, +0xFF,0xDB,0x02,0x24, +0x28,0x00,0x45,0x36, +0x24,0x18,0x62,0x00, +0x00,0x00,0x83,0xA4, +0x00,0x00,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x94, +0x00,0x00,0x00,0x00, +0x10,0x01,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x08,0x00,0x51,0x36, +0x00,0x00,0x23,0x96, +0x30,0x1F,0xD7,0x27, +0xB0,0x1B,0xE2,0x96, +0xFF,0xFF,0x70,0x30, +0x00,0x18,0x10,0x36, +0x00,0x00,0x30,0xA6, +0x00,0x01,0x42,0x30, +0xFD,0xFF,0x10,0x32, +0x00,0x00,0x30,0xA6, +0x05,0x00,0x40,0x10, +0x42,0xB0,0x02,0x3C, +0x00,0x00,0x43,0x90, +0xFB,0xFF,0x04,0x24, +0x24,0x18,0x64,0x00, +0x00,0x00,0x43,0xA0, +0x04,0x00,0x10,0x36, +0x54,0x22,0x00,0x0C, +0x32,0x00,0x04,0x24, +0x00,0x00,0x30,0xA6, +0x22,0x00,0x02,0x24, +0xF2,0x02,0x43,0x36, +0xEF,0xFF,0x10,0x32, +0x00,0x00,0x30,0xA6, +0xC8,0x00,0x04,0x24, +0x00,0x00,0x62,0xA0, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0xE2,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x41,0x00,0x40,0x10, +0x42,0xB0,0x06,0x3C, +0x84,0x00,0x42,0x36, +0x00,0x00,0x44,0x8C, +0x80,0x00,0x46,0x36, +0x00,0x00,0xC2,0x8C, +0x00,0x28,0x04,0x00, +0x21,0x18,0x00,0x00, +0x21,0x20,0x00,0x00, +0x25,0x30,0x82,0x00, +0x25,0x38,0xA3,0x00, +0xA4,0x3E,0xE3,0x8E, +0x23,0x28,0xD4,0x00, +0x80,0x12,0x05,0x00, +0x1B,0x00,0x43,0x00, +0x02,0x00,0x60,0x14, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x02,0x80,0x0B,0x3C, +0x1C,0x5F,0x63,0x8D, +0x12,0x10,0x00,0x00, +0x23,0x10,0x45,0x00, +0x21,0x10,0x43,0x00, +0x1C,0x5F,0x62,0xAD, +0x1C,0x5F,0x63,0x8D, +0x42,0xB0,0x02,0x3C, +0x03,0x00,0x42,0x34, +0xC4,0x09,0x63,0x24, +0x1C,0x5F,0x63,0xAD, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x20,0x00,0x63,0x30, +0x20,0x00,0x60,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x5F,0x62,0x8D, +0x02,0x80,0x0A,0x3C, +0x24,0x5F,0x44,0x8D, +0x21,0x40,0x46,0x00, +0x2B,0x28,0x06,0x01, +0x21,0x48,0x67,0x00, +0x21,0x48,0x25,0x01, +0x2B,0x20,0x24,0x01, +0x59,0x00,0x80,0x14, +0x00,0x00,0x00,0x00, +0x24,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x47,0x00,0x49,0x10, +0x01,0x00,0x05,0x24, +0x42,0xB0,0x02,0x3C, +0x00,0x00,0x43,0x90, +0xFB,0xFF,0x04,0x24, +0x01,0x00,0x06,0x24, +0x24,0x18,0x64,0x00, +0x00,0x00,0x43,0xA0, +0x04,0x00,0xA0,0x10, +0x01,0x00,0x04,0x24, +0x80,0x10,0x05,0x00, +0x21,0x10,0x45,0x00, +0x80,0x30,0x02,0x00, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x42,0xB0,0x06,0x3C, +0x00,0x00,0xC2,0x90, +0x30,0x1F,0xC5,0x27, +0xD0,0x1B,0xA8,0x8C, +0xDC,0x1B,0xA7,0x94, +0x41,0xB0,0x03,0x3C, +0x41,0x00,0x42,0x34, +0x08,0x00,0x64,0x34, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0x68,0xAC, +0x00,0x00,0x87,0xA4, +0xF6,0x5E,0x63,0x92, +0xF0,0xFF,0x02,0x24, +0xDC,0x1B,0xA7,0xA4, +0x24,0x18,0x62,0x00, +0xF6,0x5E,0x63,0xA2, +0xF6,0x5E,0x62,0x92, +0xD0,0x1B,0xA8,0xAC, +0x02,0x00,0x42,0x34, +0xF6,0x5E,0x62,0xA2, +0x8E,0x31,0x00,0x08, +0x02,0x80,0x10,0x3C, +0x4C,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x31,0xFE,0x40,0x10, +0x00,0x00,0x00,0x00, +0x1C,0x31,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF6,0x5E,0x62,0x92, +0xF0,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xF6,0x5E,0x62,0xA2, +0xF6,0x5E,0x63,0x92, +0x00,0x00,0x00,0x00, +0x02,0x00,0x63,0x34, +0xF6,0x5E,0x63,0xA2, +0x88,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x99,0x99,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x97,0x99,0x63,0x34, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xB0,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x20,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x82,0x00, +0x0C,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x20,0x5F,0x42,0x8D, +0x61,0x32,0x00,0x08, +0x01,0x00,0x05,0x24, +0x20,0x5F,0x42,0x8D, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x02,0x01, +0x0A,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x20,0x5F,0x42,0x8D, +0x32,0x33,0x00,0x08, +0x01,0x00,0x05,0x24, +0x20,0x5F,0x42,0x8D, +0x24,0x5F,0x43,0x8D, +0x1C,0x5F,0x64,0x8D, +0x23,0x10,0x54,0x00, +0x61,0x32,0x00,0x08, +0x23,0x28,0x44,0x00, +0x20,0x5F,0x42,0x8D, +0x24,0x5F,0x43,0x8D, +0x1C,0x5F,0x64,0x8D, +0x23,0x10,0x46,0x00, +0x32,0x33,0x00,0x08, +0x23,0x28,0x44,0x00, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x43,0x90, +0x04,0x00,0x04,0x24, +0x0F,0x00,0x63,0x30, +0x04,0x00,0x63,0x28, +0x03,0x00,0x60,0x14, +0x01,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x64,0x31,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xE8,0xFF,0xBD,0x27, +0x6C,0xCE,0x42,0x24, +0x18,0x03,0x63,0x34, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x04,0x3C, +0x13,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x0B,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0xD0,0x07,0x03,0x24, +0x02,0x80,0x02,0x3C, +0xE4,0x5E,0x43,0xAC, +0x13,0x5F,0x80,0xA0, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x16,0x5F,0x44,0xA0, +0x14,0x5F,0x60,0xA0, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x44,0x90, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x00,0x60,0x90,0x40, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x42,0x11,0x05,0x00, +0x0F,0x00,0x46,0x30, +0xE8,0xFF,0xBD,0x27, +0x09,0x00,0xC3,0x28, +0x14,0x00,0xBF,0xAF, +0x15,0x00,0x60,0x10, +0x10,0x00,0xB0,0xAF, +0x82,0x16,0x05,0x00, +0x01,0x00,0x42,0x30, +0x15,0x00,0x40,0x10, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0xA2,0x00, +0x48,0x00,0x40,0x14, +0xC2,0x15,0x04,0x00, +0x01,0x00,0x42,0x30, +0x55,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x50,0xE9,0x63,0x24, +0x21,0x18,0xC3,0x00, +0x02,0x80,0x04,0x3C, +0x0F,0x5F,0x85,0x90, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0x4B,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x24,0x10,0xA2,0x00, +0x20,0x00,0x40,0x14, +0xC2,0x15,0x04,0x00, +0x01,0x00,0x42,0x30, +0x0B,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x03,0x3C, +0x50,0xE9,0x63,0x24, +0x21,0x18,0xC3,0x00, +0x02,0x80,0x04,0x3C, +0x0F,0x5F,0x85,0x90, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0x3C,0x00,0x40,0x14, +0x02,0x80,0x04,0x3C, +0x0E,0x5F,0x82,0x90, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x82,0xA0, +0x0E,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0xE4,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x0E,0x5F,0x82,0x90, +0xFD,0xFF,0x03,0x24, +0x14,0x00,0xBF,0x8F, +0x24,0x10,0x43,0x00, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x82,0xA0, +0x12,0x5F,0x60,0xA0, +0x42,0xB0,0x04,0x3C, +0x00,0x00,0x82,0x90, +0x10,0x00,0xB0,0x8F, +0xEF,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x03,0x00,0x85,0x34, +0x40,0x00,0x03,0x24, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x82,0xA0, +0x00,0x00,0xA3,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x42,0xB0,0x07,0x3C, +0x00,0x00,0xE3,0x90, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xF0,0x34, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xE3,0xA0, +0x02,0x00,0x04,0x24, +0x00,0x00,0x02,0xA2, +0x21,0x28,0x00,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0xF0,0x06,0x34, +0x44,0x00,0x02,0x24, +0x00,0x00,0x02,0xA2, +0xE0,0x33,0x00,0x08, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x04,0x24, +0xFE,0x4E,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x0E,0x5F,0x82,0x90, +0xF6,0x33,0x00,0x08, +0xFB,0xFF,0x03,0x24, +0x82,0x16,0x05,0x00, +0xE8,0xFF,0xBD,0x27, +0x01,0x00,0x42,0x30, +0x14,0x00,0xBF,0xAF, +0x0E,0x00,0x40,0x10, +0x10,0x00,0xB0,0xAF, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0xA2,0x00, +0x37,0x00,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x0D,0x5F,0x43,0x90, +0x02,0x00,0x02,0x24, +0xFF,0x00,0x63,0x30, +0x44,0x00,0x62,0x10, +0x01,0x00,0x04,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0xFE,0x4E,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x00,0xC0,0x02,0x3C, +0x24,0x10,0xA2,0x00, +0x0E,0x00,0x40,0x14, +0x02,0x80,0x06,0x3C, +0x0E,0x5F,0xC2,0x90, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0xC2,0xA0, +0x0E,0x5F,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0x18,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x0E,0x5F,0xC2,0x90, +0xFD,0xFF,0x03,0x24, +0x42,0xB0,0x04,0x3C, +0x24,0x10,0x43,0x00, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0xC2,0xA0, +0x12,0x5F,0x60,0xA0, +0x00,0x00,0x82,0x90, +0xEF,0xFF,0x03,0x24, +0x03,0x00,0x85,0x34, +0x24,0x10,0x43,0x00, +0x40,0x00,0x03,0x24, +0x00,0x00,0x82,0xA0, +0x00,0x00,0xA3,0xA0, +0x0E,0x5F,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x42,0x30, +0xEA,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x42,0xB0,0x07,0x3C, +0x00,0x00,0xE3,0x90, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xF0,0x34, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xE3,0xA0, +0x02,0x00,0x04,0x24, +0x00,0x00,0x02,0xA2, +0x21,0x28,0x00,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0xF0,0x06,0x34, +0x44,0x00,0x02,0x24, +0x00,0x00,0x02,0xA2, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x0D,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x0C,0x00,0x04,0x24, +0x01,0x00,0x05,0x24, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xE8,0xFF,0xBD,0x27, +0x30,0xD2,0x42,0x24, +0x18,0x03,0x63,0x34, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x02,0x80,0x10,0x3C, +0xF5,0x5E,0x02,0x92, +0x14,0x00,0xBF,0xAF, +0x0F,0x00,0x42,0x30, +0x03,0x00,0x42,0x28, +0x05,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0x4C,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x00,0x40,0x10, +0x01,0x00,0x05,0x24, +0xF5,0x5E,0x04,0x92, +0x64,0x31,0x00,0x0C, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x84,0x24, +0xE0,0x1B,0x83,0x94, +0xDC,0x1B,0x85,0x94, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x00,0x63,0x30, +0x41,0xB0,0x02,0x3C, +0x25,0x18,0x65,0x00, +0x08,0x00,0x42,0x34, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA4, +0x08,0x00,0xE0,0x03, +0xDC,0x1B,0x83,0xA4, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x02,0x80,0x10,0x3C, +0x08,0x14,0x04,0x26, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0xB4,0x34,0x00,0x08, +0x08,0x14,0x04,0x26, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xCF,0x61,0x00,0x0C, +0x21,0x38,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xFF,0xFF,0x8D,0x30, +0x00,0x60,0x0F,0x40, +0x01,0x00,0xE1,0x35, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x06,0x3C, +0x30,0x1F,0xCE,0x24, +0x2A,0x1C,0xC2,0x91, +0x00,0x00,0x00,0x00, +0x1D,0x00,0x40,0x10, +0x25,0xB0,0x03,0x3C, +0x38,0x02,0x64,0x34, +0x80,0xFF,0x02,0x24, +0x00,0x00,0x82,0xA0, +0x34,0x02,0x6A,0x34, +0xD2,0x01,0x65,0x34, +0xD6,0x01,0x66,0x34, +0xDA,0x01,0x67,0x34, +0xDE,0x01,0x63,0x34, +0x00,0x00,0xA8,0x94, +0x00,0x00,0xC9,0x94, +0x00,0x00,0xEB,0x94, +0x00,0x00,0x6C,0x94, +0x00,0x00,0x44,0x95, +0xB0,0xFE,0xA2,0x25, +0xFF,0xFF,0x4D,0x30, +0x28,0x1C,0xC4,0xA5, +0x00,0x00,0xA0,0xA4, +0x20,0x1C,0xC8,0xA5, +0x00,0x00,0xC0,0xA4, +0x22,0x1C,0xC9,0xA5, +0x00,0x00,0xE0,0xA4, +0x24,0x1C,0xCB,0xA5, +0x00,0x00,0x60,0xA4, +0x00,0x00,0x4D,0xA5, +0x26,0x1C,0xCC,0xA5, +0x00,0x60,0x8F,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x02,0x3C, +0x0A,0x00,0x45,0x34, +0x63,0x00,0x03,0x24, +0xFF,0xFF,0x04,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x40,0x10, +0x30,0x1F,0xC2,0x24, +0x64,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x42,0x30, +0xFE,0xFF,0x40,0x14, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x62,0x24, +0xFF,0xFF,0x43,0x30, +0xF4,0xFF,0x64,0x14, +0x30,0x1F,0xC2,0x24, +0x28,0x1C,0x48,0x94, +0x26,0x1C,0x47,0x94, +0x20,0x1C,0x49,0x94, +0x22,0x1C,0x4A,0x94, +0x24,0x1C,0x4B,0x94, +0x25,0xB0,0x03,0x3C, +0x38,0x02,0x6C,0x34, +0x34,0x02,0x62,0x34, +0xD2,0x01,0x64,0x34, +0xD6,0x01,0x65,0x34, +0xDA,0x01,0x66,0x34, +0xDE,0x01,0x63,0x34, +0x00,0x00,0x48,0xA4, +0x00,0x00,0x89,0xA4, +0x00,0x00,0xAA,0xA4, +0x00,0x00,0xCB,0xA4, +0x00,0x00,0x67,0xA4, +0x00,0x00,0x80,0xA1, +0x00,0x60,0x8F,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x2C,0x00,0xBF,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0xFF,0xFF,0x14,0x24, +0x02,0x80,0x13,0x3C, +0x41,0xB0,0x02,0x3C, +0x30,0x1F,0x63,0x26, +0x04,0x00,0x42,0x34, +0x00,0x00,0x45,0x8C, +0xD4,0x1B,0x64,0x8C, +0xD0,0x1B,0x66,0x8C, +0x02,0x80,0x02,0x3C, +0x08,0x5E,0x47,0x90, +0x25,0xB0,0x08,0x3C, +0xB0,0x03,0x02,0x35, +0x25,0x90,0x85,0x00, +0x00,0x00,0x52,0xAC, +0x00,0x00,0x46,0xAC, +0x01,0x00,0x02,0x24, +0x8D,0x03,0xE2,0x10, +0xD4,0x1B,0x72,0xAC, +0x30,0x1F,0x64,0x26, +0xD0,0x1B,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x52,0x00, +0x01,0x00,0x42,0x30, +0x0E,0x00,0x40,0x10, +0x30,0x1F,0x67,0x26, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x02,0x36, +0x01,0x00,0x05,0x24, +0x00,0x00,0x45,0xAC, +0x04,0x00,0x0B,0x36, +0xD4,0x1B,0x83,0x8C, +0x00,0x00,0x69,0x8D, +0x40,0x00,0x02,0x3C, +0x01,0x00,0x63,0x38, +0x24,0x10,0x22,0x01, +0x2A,0x01,0x40,0x10, +0xD4,0x1B,0x83,0xAC, +0x30,0x1F,0x67,0x26, +0xD0,0x1B,0xE8,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x12,0x01, +0x04,0x00,0x42,0x30, +0x18,0x00,0x40,0x10, +0x30,0x1F,0x71,0x26, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x64,0x34, +0x04,0x00,0x02,0x24, +0x00,0x00,0x82,0xAC, +0xD4,0x1B,0xE2,0x8C, +0xFC,0x00,0x63,0x34, +0xAC,0x1B,0xE5,0x94, +0xD0,0x37,0xE4,0x8C, +0x00,0x00,0x66,0x8C, +0x04,0x00,0x42,0x38, +0x21,0x48,0x85,0x00, +0x0A,0x00,0xC9,0x10, +0xD4,0x1B,0xE2,0xAC, +0x02,0x80,0x05,0x3C, +0xBC,0x5E,0xA2,0x8C, +0xFB,0xFF,0x04,0x24, +0x24,0x20,0x04,0x01, +0x00,0x10,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0xBC,0x5E,0xA2,0xAC, +0x00,0x00,0x64,0xAC, +0xD0,0x1B,0xE4,0xAC, +0x30,0x1F,0x71,0x26, +0xD0,0x1B,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x10,0x52,0x00, +0x08,0x00,0x42,0x30, +0x0A,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x22,0x96, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x30, +0x5D,0x03,0x40,0x14, +0x00,0x80,0x02,0x3C, +0xD4,0x1B,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x38, +0xD4,0x1B,0x22,0xAE, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x20,0x52,0x00, +0x00,0x08,0x83,0x30, +0x06,0x00,0x60,0x10, +0x00,0x10,0x82,0x30, +0xD4,0x1B,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x00,0x08,0x42,0x38, +0xD4,0x1B,0x02,0xAE, +0x00,0x10,0x82,0x30, +0x05,0x03,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x10,0x72,0x00, +0x00,0x20,0x42,0x30, +0xF7,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x24,0x10,0x72,0x00, +0x00,0x80,0x42,0x30, +0xB9,0x01,0x40,0x14, +0x01,0x00,0x03,0x3C, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x00,0x00,0x00,0x00, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0xF1,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0xD0,0x1B,0x02,0x8E, +0x02,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x28,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x04,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0x62,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x08,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x9B,0x02,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x10,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0x5A,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x20,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x18,0x01,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x40,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0xD6,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x65,0x26, +0xD0,0x1B,0xA2,0x8C, +0x00,0x04,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x3D,0x00,0x40,0x10, +0x30,0x1F,0x66,0x26, +0x2A,0xB0,0x02,0x3C, +0x2C,0x00,0x43,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x02,0x24, +0xFF,0x00,0x24,0x31, +0x29,0x03,0x82,0x10, +0x00,0x80,0x22,0x31, +0xF9,0x02,0x40,0x14, +0x00,0x80,0x02,0x3C, +0x00,0xFF,0x02,0x3C, +0x24,0x10,0x22,0x01, +0x0B,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0xB8,0x36,0xA2,0x90, +0x20,0xB0,0x03,0x3C, +0x00,0x12,0x02,0x00, +0x21,0x10,0x43,0x00, +0x0C,0x00,0x49,0x8C, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x63,0x34, +0x00,0x00,0x69,0xAC, +0xFF,0x00,0x24,0x31, +0xFF,0x00,0x02,0x24, +0x1B,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x88,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x1C,0x37,0x03,0xAE, +0x0A,0x00,0x04,0x24, +0xB8,0x36,0x09,0xA2, +0x00,0x01,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xD0,0x1B,0x05,0x8E, +0x02,0x80,0x06,0x3C, +0xBC,0x5E,0xC4,0x8C, +0x00,0x04,0x02,0x3C, +0x27,0x10,0x02,0x00, +0x24,0x28,0xA2,0x00, +0x25,0xB0,0x02,0x3C, +0x00,0x40,0x84,0x34, +0xB0,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x65,0xAC, +0xBC,0x5E,0xC4,0xAC, +0xD0,0x1B,0x05,0xAE, +0x30,0x1F,0x65,0x26, +0xD4,0x1B,0xA4,0x8C, +0x00,0x04,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x26,0x20,0x83,0x00, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x44,0xAC, +0xD4,0x1B,0xA4,0xAC, +0x30,0x1F,0x66,0x26, +0xD0,0x1B,0xC7,0x8C, +0x00,0x08,0x04,0x3C, +0x24,0x28,0xF2,0x00, +0x24,0x10,0xA4,0x00, +0x08,0x00,0x40,0x10, +0x80,0x00,0x08,0x3C, +0xD4,0x1B,0xC3,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0x26,0x18,0x64,0x00, +0x00,0x00,0x44,0xAC, +0xD4,0x1B,0xC3,0xAC, +0x80,0x00,0x08,0x3C, +0x24,0x10,0xA8,0x00, +0x21,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xD4,0x1B,0xC3,0x8C, +0x25,0xB0,0x09,0x3C, +0xB0,0x03,0x2A,0x35, +0x2A,0xB0,0x02,0x3C, +0x00,0x00,0x43,0xAD, +0x36,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x23,0xB0,0x04,0x3C, +0xFF,0x1F,0x02,0x3C, +0xC0,0x18,0x03,0x00, +0xF0,0x07,0x63,0x30, +0x00,0x38,0xC5,0x8C, +0x21,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xCE,0x02,0x65,0x10, +0x04,0x38,0xC3,0xAC, +0x02,0x80,0x05,0x3C, +0xBC,0x5E,0xA3,0x8C, +0x27,0x20,0x08,0x00, +0x24,0x20,0xE4,0x00, +0x00,0x08,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x43,0xAD, +0x00,0x00,0x44,0xAC, +0xBC,0x5E,0xA3,0xAC, +0xD0,0x1B,0xC4,0xAC, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x80,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0x30,0x1F,0x66,0x26, +0xD0,0x1B,0xC3,0x8C, +0x00,0x01,0x05,0x3C, +0x24,0x20,0x72,0x00, +0x24,0x10,0x85,0x00, +0x06,0x00,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0xD4,0x1B,0xC3,0x8C, +0xB0,0x03,0x42,0x34, +0x26,0x18,0x65,0x00, +0x00,0x00,0x45,0xAC, +0xD4,0x1B,0xC3,0xAC, +0x00,0x02,0x05,0x3C, +0x24,0x10,0x85,0x00, +0x06,0x00,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0xD4,0x1B,0xC3,0x8C, +0xB0,0x03,0x42,0x34, +0x26,0x18,0x65,0x00, +0x00,0x00,0x45,0xAC, +0xD4,0x1B,0xC3,0xAC, +0x00,0x10,0x05,0x3C, +0x24,0x10,0x85,0x00, +0x0C,0x00,0x40,0x10, +0x30,0x1F,0x63,0x26, +0xB0,0x1B,0xC3,0x94, +0x00,0x00,0x00,0x00, +0x04,0x00,0x62,0x30, +0x02,0x00,0x40,0x10, +0x00,0x08,0x62,0x34, +0xB0,0x1B,0xC2,0xA4, +0xD4,0x1B,0xC2,0x8C, +0x00,0x00,0x00,0x00, +0x26,0x10,0x45,0x00, +0xD4,0x1B,0xC2,0xAC, +0x30,0x1F,0x63,0x26, +0xD0,0x1B,0x62,0x8C, +0x00,0x20,0x05,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x45,0x00, +0x0B,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x64,0x94, +0x00,0x00,0x00,0x00, +0x04,0x00,0x82,0x30, +0x02,0x00,0x40,0x10, +0xFF,0xF7,0x82,0x30, +0xB0,0x1B,0x62,0xA4, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x26,0x10,0x45,0x00, +0xD4,0x1B,0x62,0xAC, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x20,0xBD,0x02,0x3C, +0xEC,0x02,0x03,0x36, +0x4D,0x00,0x07,0x36, +0xF1,0x02,0x08,0x36, +0x08,0x00,0x06,0x24, +0x78,0x02,0x42,0x34, +0x00,0x00,0x45,0xA4, +0x00,0x00,0xE0,0xA0, +0x00,0x00,0x06,0xA1, +0x00,0x00,0x60,0xAC, +0x00,0x00,0x62,0x8C, +0xFF,0x00,0x04,0x3C, +0x00,0x00,0xE0,0xA0, +0xFF,0x00,0x49,0x30, +0x25,0x48,0x24,0x01, +0x00,0x00,0x06,0xA1, +0xF2,0x02,0x05,0x36, +0x00,0x00,0x64,0xAC, +0x0A,0x00,0x0A,0x36, +0x00,0x00,0x69,0xAC, +0x80,0xFF,0x03,0x24, +0x00,0x00,0xA0,0xA0, +0x00,0x00,0x43,0xA1, +0x00,0x00,0x62,0x8D, +0x80,0x00,0x03,0x3C, +0x24,0x10,0x43,0x00, +0x02,0x00,0x40,0x10, +0x84,0xFF,0x02,0x24, +0x00,0x00,0x42,0xA1, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x02,0x00,0x02,0x36, +0x00,0x00,0x43,0x94, +0xFF,0xBF,0x04,0x24, +0x24,0x18,0x64,0x00, +0x00,0x00,0x43,0xA4, +0x3C,0x35,0x00,0x08, +0x30,0x1F,0x67,0x26, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x2A,0xB0,0x06,0x3C, +0xB0,0x03,0x42,0x34, +0x00,0x00,0x54,0xAC, +0x28,0x00,0xC3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x05,0x24, +0xFF,0x00,0x24,0x31, +0x6D,0x03,0x85,0x10, +0x25,0xBD,0x02,0x3C, +0x00,0x80,0x22,0x31, +0x59,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x82,0x10, +0xFF,0x00,0x23,0x31, +0x30,0x1F,0x70,0x26, +0x58,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0xA4,0x36,0x09,0xA2, +0xEC,0x36,0x03,0xAE, +0x06,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x60,0x00,0x02,0x3C, +0x02,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x04,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x40,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xB5,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x24,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x48,0x03,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0x64,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x25,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x58,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0xA0,0x36,0x09,0xA2, +0xEC,0x36,0x03,0xAE, +0x06,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x60,0x00,0x02,0x3C, +0x04,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x04,0xA5,0x34, +0x25,0xB0,0x03,0x3C, +0x40,0x00,0x02,0x3C, +0x00,0x26,0x07,0x00, +0x26,0xA0,0x82,0x02, +0xB0,0x03,0x68,0x34, +0x25,0x20,0x85,0x00, +0x80,0x03,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x64,0xAC, +0x00,0x00,0x46,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x00,0x00,0x14,0xAD, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x20,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xAD,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0xB0,0x03,0xA2,0x34, +0x2A,0xB0,0x07,0x3C, +0x00,0x00,0x54,0xAC, +0x20,0x00,0xE3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x07,0x03,0x86,0x10, +0x90,0x03,0xA2,0x34, +0x00,0x80,0x22,0x31, +0x05,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x4C,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0xA8,0x36,0x09,0xA2, +0xE0,0x36,0x03,0xAE, +0x05,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x18,0x00,0x02,0x3C, +0x01,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x02,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x10,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0xA6,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x0C,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0xC6,0x02,0x86,0x10, +0x00,0x80,0x22,0x31, +0x54,0x02,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x24,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x34,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x8C,0x36,0x09,0xA2, +0xC8,0x36,0x03,0xAE, +0x03,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x01,0x00,0x08,0x3C, +0x80,0xFF,0x02,0x24, +0x25,0x38,0xE2,0x00, +0x00,0x80,0x03,0x35, +0x80,0x00,0xA5,0x34, +0x27,0x18,0x03,0x00, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x24,0x30,0xC3,0x00, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x27,0xA0,0x08,0x00, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x63,0x26, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x80,0x42,0x38, +0xD4,0x1B,0x62,0xAC, +0x30,0x1F,0x70,0x26, +0xD0,0x1B,0x02,0x8E, +0x01,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0x11,0xFE,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x10,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x7C,0x02,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0xD0,0x01,0x40,0x10, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x22,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x34,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x90,0x36,0x09,0xA2, +0xC8,0x36,0x03,0xAE, +0x03,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x01,0x00,0x02,0x3C, +0x00,0x80,0x42,0x34, +0x40,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x80,0x00,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x01,0x00,0x04,0x3C, +0x30,0x1F,0x70,0x26, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0xD0,0x1B,0x02,0x8E, +0x02,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0xDB,0xFD,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x14,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x64,0x02,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0xFA,0x01,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x25,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x40,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x94,0x36,0x09,0xA2, +0xD4,0x36,0x03,0xAE, +0x04,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x06,0x00,0x02,0x3C, +0x20,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x01,0xA5,0x34, +0x25,0xB0,0x03,0x3C, +0x04,0x00,0x02,0x3C, +0x00,0x26,0x07,0x00, +0x26,0xA0,0x82,0x02, +0xB0,0x03,0x68,0x34, +0x25,0x20,0x85,0x00, +0x80,0x03,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x64,0xAC, +0x00,0x00,0x46,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x00,0x00,0x14,0xAD, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x02,0x00,0x04,0x3C, +0x30,0x1F,0x70,0x26, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0xD0,0x1B,0x02,0x8E, +0x04,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x54,0x00, +0x24,0x10,0x43,0x00, +0xA1,0xFD,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x62,0x34, +0x2A,0xB0,0x07,0x3C, +0x00,0x00,0x54,0xAC, +0x18,0x00,0xE5,0x34, +0x00,0x00,0xA9,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0x16,0x02,0x86,0x10, +0x04,0x00,0x02,0x24, +0x00,0x80,0x22,0x31, +0xD6,0x01,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0xA2,0xAC, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x40,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x98,0x36,0x09,0xA2, +0xD4,0x36,0x03,0xAE, +0x04,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x09,0x3C, +0xCC,0x5E,0x27,0x91, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x05,0x8D, +0xD0,0x1B,0x06,0x8E, +0x06,0x00,0x02,0x3C, +0x10,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x01,0xA5,0x34, +0x00,0x26,0x07,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x20,0x85,0x00, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x66,0xAC, +0xBC,0x5E,0x05,0xAD, +0xCC,0x5E,0x27,0xA1, +0xD0,0x1B,0x06,0xAE, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x04,0x00,0x04,0x3C, +0x30,0x1F,0x70,0x26, +0x26,0x18,0x64,0x00, +0xD4,0x1B,0x43,0xAC, +0xD0,0x1B,0x02,0x8E, +0x08,0x00,0x03,0x3C, +0x24,0x10,0x52,0x00, +0x24,0x10,0x43,0x00, +0x68,0xFD,0x40,0x10, +0x00,0x00,0x00,0x00, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x05,0x3C, +0x1C,0x00,0xA3,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x06,0x24, +0xFF,0x00,0x24,0x31, +0xDD,0x01,0x86,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x80,0x22,0x31, +0x33,0x01,0x40,0x10, +0x00,0xFF,0x02,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x00,0x62,0xAC, +0xFF,0x00,0x02,0x24, +0x25,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x4C,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x9C,0x36,0x09,0xA2, +0xE0,0x36,0x03,0xAE, +0x05,0x00,0x04,0x24, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0x02,0x80,0x0A,0x3C, +0xCC,0x5E,0x47,0x91, +0x02,0x80,0x09,0x3C, +0xBC,0x5E,0x25,0x8D, +0xD0,0x1B,0x06,0x8E, +0x18,0x00,0x02,0x3C, +0x08,0x00,0xE7,0x34, +0x27,0x10,0x02,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x02,0xA5,0x34, +0x25,0xB0,0x03,0x3C, +0x10,0x00,0x02,0x3C, +0x00,0x26,0x07,0x00, +0x26,0xA0,0x82,0x02, +0xB0,0x03,0x68,0x34, +0x25,0x20,0x85,0x00, +0x80,0x03,0x63,0x34, +0x41,0xB0,0x02,0x3C, +0x00,0x00,0x64,0xAC, +0x00,0x00,0x46,0xAC, +0xBC,0x5E,0x25,0xAD, +0xCC,0x5E,0x47,0xA1, +0xD0,0x1B,0x06,0xAE, +0x00,0x00,0x14,0xAD, +0x30,0x1F,0x62,0x26, +0xD4,0x1B,0x43,0x8C, +0x08,0x00,0x04,0x3C, +0x26,0x18,0x64,0x00, +0x9E,0x35,0x00,0x08, +0xD4,0x1B,0x43,0xAC, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xD4,0x1B,0x02,0x8E, +0xD0,0x1B,0x03,0x8E, +0x00,0x20,0x42,0x38, +0x7D,0x35,0x00,0x08, +0xD4,0x1B,0x02,0xAE, +0x8C,0x33,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x2A,0xB0,0x02,0x3C, +0x08,0x00,0x43,0x34, +0x00,0x00,0x69,0x8C, +0xFF,0x00,0x02,0x24, +0xFF,0x00,0x24,0x31, +0x2C,0x00,0x82,0x10, +0x00,0x80,0x22,0x31, +0x34,0x01,0x40,0x14, +0x00,0x80,0x02,0x3C, +0x00,0xFF,0x02,0x3C, +0x24,0x10,0x22,0x01, +0x0B,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0xB4,0x36,0x02,0x92, +0x20,0xB0,0x03,0x3C, +0x00,0x12,0x02,0x00, +0x21,0x10,0x43,0x00, +0x0C,0x00,0x49,0x8C, +0x25,0xB0,0x03,0x3C, +0xB0,0x03,0x63,0x34, +0x00,0x00,0x69,0xAC, +0xFF,0x00,0x24,0x31, +0xFF,0x00,0x02,0x24, +0x1A,0x00,0x82,0x10, +0x30,0x1F,0x70,0x26, +0xFF,0x00,0x23,0x31, +0x7C,0x37,0x05,0x8E, +0x20,0x10,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x21,0x30,0x60,0x00, +0x10,0x37,0x03,0xAE, +0x01,0x00,0x04,0x24, +0xB4,0x36,0x09,0xA2, +0x80,0x00,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA0,0xAF, +0xD0,0x1B,0x05,0x8E, +0x02,0x80,0x06,0x3C, +0xBC,0x5E,0xC4,0x8C, +0xFF,0xC7,0x02,0x24, +0x24,0x28,0xA2,0x00, +0x25,0xB0,0x02,0x3C, +0x10,0x00,0x84,0x34, +0x80,0x03,0x42,0x34, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x65,0xAC, +0xBC,0x5E,0xC4,0xAC, +0xD0,0x1B,0x05,0xAE, +0x30,0x1F,0x63,0x26, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x38, +0x76,0x35,0x00,0x08, +0xD4,0x1B,0x62,0xAC, +0x56,0x01,0x02,0x35, +0x00,0x00,0x43,0x94, +0x00,0x00,0x00,0x00, +0x70,0xFC,0x60,0x10, +0x00,0x00,0x00,0x00, +0x93,0x55,0x00,0x0C, +0x07,0x00,0x04,0x24, +0x29,0x35,0x00,0x08, +0x30,0x1F,0x64,0x26, +0x00,0x00,0x62,0xAC, +0xD3,0x35,0x00,0x08, +0xFF,0x00,0x02,0x24, +0xF8,0x1D,0x24,0x96, +0x64,0x37,0x25,0x8E, +0xFF,0x0F,0x83,0x30, +0x25,0x28,0xA2,0x00, +0x00,0x19,0x03,0x00, +0x20,0x00,0xA6,0x24, +0x02,0x12,0x03,0x00, +0x01,0x00,0x84,0x24, +0xF8,0x1D,0x24,0xA6, +0x17,0x00,0xC2,0xA0, +0x16,0x00,0xC3,0xA0, +0x0C,0x00,0xA4,0x8C, +0x00,0xF0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xFF,0x0F,0x63,0x30, +0x00,0x1C,0x03,0x00, +0x24,0x20,0x82,0x00, +0x25,0x20,0x83,0x00, +0x0C,0x00,0xA4,0xAC, +0x64,0x37,0x25,0x8E, +0x01,0x00,0x10,0x24, +0x01,0x00,0x04,0x24, +0x31,0x10,0x06,0x3C, +0x00,0x01,0x07,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x2A,0xB0,0x02,0x3C, +0x01,0x00,0x42,0x34, +0x02,0x00,0x03,0x24, +0x00,0x00,0x50,0xA0, +0x00,0x00,0x43,0xA0, +0xD4,0x1B,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x08,0x00,0x42,0x38, +0x68,0x35,0x00,0x08, +0xD4,0x1B,0x22,0xAE, +0xD0,0x03,0x23,0x35, +0x80,0x00,0x02,0x24, +0x00,0x00,0x62,0xAC, +0x24,0x36,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x25,0xB0,0x02,0x3C, +0x01,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xF0,0x35,0x00,0x08, +0x30,0x1F,0x65,0x26, +0x24,0x10,0x22,0x01, +0xA9,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x47,0x00,0xC6,0x34, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x85,0x10, +0x30,0x1F,0x62,0x26, +0xA4,0x36,0x04,0xA2, +0x00,0x00,0xC2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x07,0x00,0x83,0x10, +0x21,0x38,0x00,0x02, +0x21,0x28,0xC0,0x00, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0xA4,0x36,0xE3,0xA0, +0x30,0x1F,0x62,0x26, +0xA4,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x9C,0x36,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0xFD,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x45,0x00,0xE5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0xA8,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0xA8,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0xA8,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x11,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0x9E,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x46,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0xA0,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0xA0,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0xA0,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0xD3,0x36,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x00,0xFF,0x02,0x3C, +0x24,0x10,0x22,0x01, +0x30,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x41,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x90,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x90,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x90,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x87,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0xCF,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x44,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x9C,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x9C,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x9C,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x47,0x38,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0xAE,0xFD,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x40,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x8C,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x8C,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x8C,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x47,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x00,0x00,0x62,0xAC, +0x93,0x38,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0x08,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x42,0x00,0xA5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x94,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x94,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x94,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0xC5,0x37,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x24,0x10,0x22,0x01, +0x2C,0xFE,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x43,0x00,0xE5,0x34, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x0E,0x00,0x86,0x10, +0x30,0x1F,0x62,0x26, +0x98,0x36,0x04,0xA2, +0x00,0x00,0xA2,0x90, +0xFF,0x00,0x83,0x30, +0xFF,0x00,0x44,0x30, +0x08,0x00,0x83,0x10, +0x30,0x1F,0x62,0x26, +0x21,0x30,0x00,0x02, +0x00,0x00,0xA2,0x90, +0x21,0x18,0x80,0x00, +0xFD,0xFF,0x62,0x14, +0xFF,0x00,0x44,0x30, +0x98,0x36,0xC3,0xA0, +0x30,0x1F,0x62,0x26, +0x98,0x36,0x43,0x90, +0x20,0xB0,0x02,0x3C, +0x00,0x1A,0x03,0x00, +0x21,0x18,0x62,0x00, +0x0C,0x00,0x69,0x8C, +0x25,0xB0,0x02,0x3C, +0xB0,0x03,0x42,0x34, +0xFF,0x00,0x24,0x31, +0x00,0x00,0x49,0xAC, +0x0A,0x38,0x00,0x08, +0xFF,0x00,0x02,0x24, +0x06,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xAB,0x37,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x01,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xBF,0x36,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x25,0xB0,0x02,0x3C, +0x07,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x30,0x1F,0x63,0x26, +0xD4,0x1B,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x80,0x42,0x38, +0x71,0x37,0x00,0x08, +0xD4,0x1B,0x62,0xAC, +0x00,0x00,0x40,0xAC, +0x34,0x37,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x02,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xFA,0x36,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x90,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x2D,0x38,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x03,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x6E,0x38,0x00,0x08, +0x30,0x1F,0x62,0x26, +0x05,0x00,0x03,0x24, +0x90,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0xEC,0x37,0x00,0x08, +0x30,0x1F,0x62,0x26, +0xE0,0xFF,0xBD,0x27, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x25,0xB0,0x0C,0x3C, +0x01,0x80,0x02,0x3C, +0x18,0x03,0x83,0x35, +0x9C,0xE8,0x42,0x24, +0x02,0x80,0x12,0x3C, +0x41,0xB0,0x0B,0x3C, +0x00,0x00,0x62,0xAC, +0x30,0x1F,0x4A,0x26, +0x0A,0x00,0x62,0x35, +0x00,0x00,0x44,0x94, +0xDE,0x1B,0x43,0x95, +0xDC,0x1B,0x49,0x95, +0x25,0x30,0x64,0x00, +0xFF,0xFF,0xD0,0x30, +0x24,0x10,0x09,0x02, +0x02,0x00,0x42,0x30, +0xC2,0x00,0x40,0x10, +0xC0,0x03,0x83,0x35, +0x02,0x00,0x02,0x24, +0x00,0x00,0x62,0xAC, +0x02,0x80,0x08,0x3C, +0xBC,0x5E,0x04,0x8D, +0xDC,0x02,0x82,0x35, +0x00,0x00,0x47,0x90, +0xFD,0xFF,0x03,0x24, +0x00,0x80,0x02,0x3C, +0x24,0x18,0x23,0x01, +0x25,0x20,0x82,0x00, +0x02,0x00,0xC6,0x38, +0x08,0x00,0x65,0x35, +0x02,0x80,0x02,0x3C, +0xF5,0x5E,0x47,0xA0, +0xBC,0x5E,0x04,0xAD, +0xDE,0x1B,0x46,0xA5, +0x21,0x48,0x60,0x00, +0x00,0x00,0xA3,0xA4, +0xDC,0x1B,0x43,0xA5, +0x24,0x38,0x09,0x02, +0x04,0x00,0xE2,0x30, +0x0A,0x00,0x40,0x10, +0x08,0x00,0xE2,0x30, +0xDE,0x1B,0x43,0x95, +0x0C,0x00,0x64,0x35, +0xC0,0x03,0x85,0x35, +0x04,0x00,0x63,0x38, +0x04,0x00,0x02,0x24, +0x00,0x00,0x86,0x8C, +0x00,0x00,0xA2,0xAC, +0xDE,0x1B,0x43,0xA5, +0x08,0x00,0xE2,0x30, +0x08,0x00,0x40,0x10, +0x10,0x00,0xE2,0x30, +0xDE,0x1B,0x42,0x95, +0xC0,0x03,0x84,0x35, +0x08,0x00,0x03,0x24, +0x08,0x00,0x42,0x38, +0x00,0x00,0x83,0xAC, +0xDE,0x1B,0x42,0xA5, +0x10,0x00,0xE2,0x30, +0x08,0x00,0x40,0x10, +0x20,0x00,0xE2,0x30, +0xDE,0x1B,0x42,0x95, +0xC0,0x03,0x84,0x35, +0x10,0x00,0x03,0x24, +0x10,0x00,0x42,0x38, +0x00,0x00,0x83,0xAC, +0xDE,0x1B,0x42,0xA5, +0x20,0x00,0xE2,0x30, +0x08,0x00,0x40,0x10, +0x80,0x00,0xE2,0x30, +0xDE,0x1B,0x42,0x95, +0xC0,0x03,0x84,0x35, +0x20,0x00,0x03,0x24, +0x20,0x00,0x42,0x38, +0x00,0x00,0x83,0xAC, +0xDE,0x1B,0x42,0xA5, +0x80,0x00,0xE2,0x30, +0x74,0x00,0x40,0x10, +0x30,0x1F,0x47,0x26, +0xC0,0x03,0x83,0x35, +0x80,0x00,0x02,0x24, +0x42,0xB0,0x0B,0x3C, +0x00,0x00,0x62,0xAC, +0x03,0x00,0x71,0x35, +0xDE,0x1B,0x42,0x95, +0x00,0x00,0x23,0x92, +0x80,0x00,0x42,0x38, +0x20,0x00,0x63,0x30, +0x59,0x00,0x60,0x10, +0xDE,0x1B,0x42,0xA5, +0x20,0x00,0x02,0x24, +0x00,0x00,0x22,0xA2, +0x02,0x80,0x03,0x3C, +0x16,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x75,0x00,0x40,0x14, +0x21,0x40,0x00,0x00, +0xB0,0x1B,0x42,0x95, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x4E,0x00,0x40,0x10, +0x02,0x80,0x06,0x3C, +0x02,0x80,0x07,0x3C, +0xF4,0x5E,0xE2,0x90, +0x00,0x00,0x00,0x00, +0x49,0x00,0x40,0x10, +0x02,0x80,0x09,0x3C, +0x02,0x80,0x04,0x3C, +0x00,0x5F,0x82,0x8C, +0x20,0x5F,0x24,0x8D, +0x24,0x5F,0x25,0x8D, +0x21,0x18,0x00,0x00, +0x21,0x10,0x44,0x00, +0x2B,0x30,0x44,0x00, +0x21,0x18,0x65,0x00, +0x21,0x18,0x66,0x00, +0x20,0x5F,0x22,0xAD, +0x24,0x5F,0x23,0xAD, +0xF4,0x5E,0xE4,0x90, +0x02,0x00,0x02,0x24, +0xFF,0x00,0x84,0x30, +0x07,0x00,0x82,0x10, +0x02,0x80,0x04,0x3C, +0xF4,0x5E,0xE2,0x90, +0x03,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x5A,0x00,0x43,0x14, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x04,0x3C, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x24, +0x11,0x5F,0x82,0xA0, +0x11,0x5F,0x83,0x90, +0x00,0x00,0x00,0x00, +0x07,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0xFA,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x60,0x14, +0x00,0x00,0x00,0x00, +0x5B,0x00,0x00,0x11, +0x80,0x00,0x86,0x35, +0x11,0x5F,0x82,0x90, +0x00,0x00,0x00,0x00, +0x06,0x00,0x40,0x14, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x02,0x3C, +0x10,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x11,0x5F,0x83,0xA0, +0x02,0x80,0x05,0x3C, +0x0E,0x5F,0xA2,0x90, +0x02,0x80,0x03,0x3C, +0x02,0x00,0x04,0x24, +0x10,0x00,0x42,0x34, +0x0E,0x5F,0xA2,0xA0, +0xF9,0x5E,0x62,0x90, +0x21,0x28,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x80,0x30,0x02,0x00, +0x21,0x30,0xC2,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0x33,0x06,0x00, +0x42,0xB0,0x02,0x3C, +0x44,0x00,0x04,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x05,0x00,0x40,0x10, +0x02,0x80,0x06,0x3C, +0x04,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x02,0x80,0x06,0x3C, +0xBC,0x5E,0xC4,0x8C, +0x30,0x1F,0x47,0x26, +0xDC,0x1B,0xE5,0x94, +0x08,0x00,0x02,0x3C, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x7F,0xFF,0xA5,0x30, +0xB0,0x03,0x42,0x34, +0x08,0x00,0x63,0x34, +0x00,0x00,0x44,0xAC, +0x00,0x00,0x65,0xA4, +0xBC,0x5E,0xC4,0xAC, +0xDC,0x1B,0xE5,0xA4, +0x30,0x1F,0x47,0x26, +0xDC,0x1B,0xE2,0x94, +0x00,0x00,0x00,0x00, +0x24,0x10,0x50,0x00, +0x00,0x30,0x42,0x30, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xDE,0x1B,0xE2,0x94, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x38, +0x00,0x20,0x42,0x34, +0xDE,0x1B,0xE2,0xA4, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x51,0x3A,0x00,0x08, +0xDE,0x1B,0x46,0xA5, +0x01,0x00,0x08,0x24, +0x16,0x5F,0x60,0xA0, +0x8D,0x3A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0E,0x5F,0xA2,0x90, +0x02,0x80,0x03,0x3C, +0x02,0x00,0x04,0x24, +0x10,0x00,0x42,0x34, +0x0E,0x5F,0xA2,0xA0, +0xF9,0x5E,0x62,0x90, +0x21,0x28,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x80,0x30,0x02,0x00, +0x21,0x30,0xC2,0x00, +0x8C,0x23,0x00,0x0C, +0x00,0x33,0x06,0x00, +0x44,0x00,0x02,0x24, +0x00,0x00,0x22,0xA2, +0xD5,0x3A,0x00,0x08, +0x02,0x80,0x03,0x3C, +0x84,0x00,0x84,0x35, +0x00,0x00,0x82,0x8C, +0x02,0x80,0x08,0x3C, +0x00,0x00,0xC4,0x8C, +0x1C,0x5F,0x06,0x8D, +0x21,0x10,0x00,0x00, +0x20,0x5F,0x28,0x8D, +0x24,0x5F,0x29,0x8D, +0x00,0x00,0x65,0x91, +0x25,0x10,0x44,0x00, +0x21,0x10,0x46,0x00, +0xFB,0xFF,0x04,0x24, +0x24,0x28,0xA4,0x00, +0x23,0x40,0x02,0x01, +0x00,0x00,0x65,0xA1, +0x04,0x00,0x00,0x11, +0x01,0x00,0x06,0x24, +0x80,0x10,0x08,0x00, +0x21,0x10,0x48,0x00, +0x80,0x30,0x02,0x00, +0x01,0x00,0x04,0x24, +0x8C,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x42,0xB0,0x02,0x3C, +0x22,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xDF,0x3A,0x00,0x08, +0x02,0x80,0x06,0x3C, +0xF0,0xFF,0xBD,0x27, +0x08,0x00,0xB2,0xAF, +0x04,0x00,0xB1,0xAF, +0x00,0x00,0xB0,0xAF, +0x00,0x40,0x09,0x40, +0x00,0x68,0x0A,0x40, +0x00,0x70,0x02,0x40, +0x00,0x60,0x0B,0x40, +0x25,0xB0,0x05,0x3C, +0x18,0x03,0xA7,0x34, +0x00,0x00,0xE6,0x8C, +0x01,0x80,0x02,0x3C, +0x1C,0x03,0xA3,0x34, +0xC8,0xEC,0x42,0x24, +0x00,0x00,0x66,0xAC, +0x00,0x00,0xE2,0xAC, +0x80,0x00,0x83,0x8C, +0x7C,0x02,0xA2,0x34, +0x80,0x02,0xA6,0x34, +0x84,0x02,0xA7,0x34, +0x88,0x02,0xA8,0x34, +0x00,0x00,0x43,0xAC, +0x00,0x00,0xC9,0xAC, +0x00,0x00,0xEA,0xAC, +0x00,0x00,0x0B,0xAD, +0x74,0x00,0x83,0x8C, +0x8C,0x02,0xA2,0x34, +0x90,0x02,0xA7,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0x86,0x8C, +0x94,0x02,0xA8,0x34, +0x98,0x02,0xA9,0x34, +0x00,0x00,0xE6,0xAC, +0x0C,0x00,0x82,0x8C, +0x9C,0x02,0xA6,0x34, +0xA0,0x02,0xA7,0x34, +0x00,0x00,0x02,0xAD, +0x10,0x00,0x83,0x8C, +0xA4,0x02,0xA8,0x34, +0xA8,0x02,0xAA,0x34, +0x00,0x00,0x23,0xAD, +0x14,0x00,0x82,0x8C, +0xAC,0x02,0xA9,0x34, +0xB0,0x02,0xAB,0x34, +0x00,0x00,0xC2,0xAC, +0x18,0x00,0x83,0x8C, +0xB4,0x02,0xAC,0x34, +0xB8,0x02,0xAD,0x34, +0x00,0x00,0xE3,0xAC, +0x1C,0x00,0x82,0x8C, +0xBC,0x02,0xA7,0x34, +0xC0,0x02,0xAE,0x34, +0x00,0x00,0x02,0xAD, +0x20,0x00,0x83,0x8C, +0xC4,0x02,0xA8,0x34, +0xC8,0x02,0xAF,0x34, +0x00,0x00,0x43,0xAD, +0x24,0x00,0x82,0x8C, +0xCC,0x02,0xAA,0x34, +0xD0,0x02,0xB0,0x34, +0x00,0x00,0x22,0xAD, +0x28,0x00,0x83,0x8C, +0xD4,0x02,0xA9,0x34, +0xD8,0x02,0xB1,0x34, +0x00,0x00,0x63,0xAD, +0x2C,0x00,0x86,0x8C, +0x70,0x02,0xAB,0x34, +0x74,0x02,0xB2,0x34, +0x00,0x00,0x86,0xAD, +0x30,0x00,0x82,0x8C, +0x78,0x02,0xA6,0x34, +0x6C,0x03,0xAC,0x34, +0x00,0x00,0xA2,0xAD, +0x34,0x00,0x83,0x8C, +0x02,0x80,0x02,0x3C, +0x00,0x00,0xE3,0xAC, +0x38,0x00,0x85,0x8C, +0x28,0xC7,0x47,0x8C, +0x00,0x00,0xC5,0xAD, +0x3C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0xAD, +0x40,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE3,0xAD, +0x44,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x42,0xAD, +0x48,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0xAE, +0x4C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x22,0xAD, +0x50,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x23,0xAE, +0x54,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xAD, +0x58,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0xAE, +0x5C,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xAC, +0x21,0x10,0xE0,0x00, +0x00,0x00,0x82,0xAD, +0x01,0x00,0xE7,0x24, +0x21,0x10,0xE0,0x00, +0x01,0x00,0xE7,0x24, +0x00,0x00,0x82,0xAD, +0x9D,0x3B,0x00,0x08, +0x21,0x10,0xE0,0x00, +0x01,0x80,0x1B,0x3C, +0x90,0xEE,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x21,0xD8,0xA0,0x03, +0x82,0xDA,0x1B,0x00, +0x80,0xDA,0x1B,0x00, +0x08,0x00,0x7B,0x27, +0x04,0x00,0x61,0xAF, +0x08,0x00,0x62,0xAF, +0x0C,0x00,0x63,0xAF, +0x10,0x00,0x64,0xAF, +0x14,0x00,0x65,0xAF, +0x18,0x00,0x66,0xAF, +0x1C,0x00,0x67,0xAF, +0x20,0x00,0x68,0xAF, +0x24,0x00,0x69,0xAF, +0x28,0x00,0x6A,0xAF, +0x2C,0x00,0x6B,0xAF, +0x30,0x00,0x6C,0xAF, +0x34,0x00,0x6D,0xAF, +0x38,0x00,0x6E,0xAF, +0x3C,0x00,0x6F,0xAF, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x70,0x0A,0x40, +0x40,0x00,0x70,0xAF, +0x44,0x00,0x71,0xAF, +0x48,0x00,0x72,0xAF, +0x4C,0x00,0x73,0xAF, +0x50,0x00,0x74,0xAF, +0x54,0x00,0x75,0xAF, +0x58,0x00,0x76,0xAF, +0x5C,0x00,0x77,0xAF, +0x60,0x00,0x78,0xAF, +0x64,0x00,0x79,0xAF, +0x68,0x00,0x7C,0xAF, +0x6C,0x00,0x7D,0xAF, +0x70,0x00,0x7E,0xAF, +0x74,0x00,0x7F,0xAF, +0x78,0x00,0x68,0xAF, +0x7C,0x00,0x69,0xAF, +0x80,0x00,0x6A,0xAF, +0x00,0x68,0x1A,0x40, +0x25,0xB0,0x1B,0x3C, +0x1C,0x03,0x7B,0x37, +0x00,0x00,0x00,0x00, +0x00,0x00,0x7A,0xAF, +0x7F,0x00,0x5B,0x33, +0x30,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x1B,0x3C, +0x30,0x03,0x7B,0x37, +0x00,0x00,0x00,0x00, +0x00,0x00,0x7A,0xAF, +0x00,0x00,0x00,0x00, +0x21,0xD8,0xA0,0x03, +0x82,0xDA,0x1B,0x00, +0x80,0xDA,0x1B,0x00, +0x08,0x00,0x7B,0x27, +0x04,0x00,0x61,0xAF, +0x08,0x00,0x62,0xAF, +0x0C,0x00,0x63,0xAF, +0x10,0x00,0x64,0xAF, +0x14,0x00,0x65,0xAF, +0x18,0x00,0x66,0xAF, +0x1C,0x00,0x67,0xAF, +0x20,0x00,0x68,0xAF, +0x24,0x00,0x69,0xAF, +0x28,0x00,0x6A,0xAF, +0x2C,0x00,0x6B,0xAF, +0x30,0x00,0x6C,0xAF, +0x34,0x00,0x6D,0xAF, +0x38,0x00,0x6E,0xAF, +0x3C,0x00,0x6F,0xAF, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x70,0x0A,0x40, +0x40,0x00,0x70,0xAF, +0x44,0x00,0x71,0xAF, +0x48,0x00,0x72,0xAF, +0x4C,0x00,0x73,0xAF, +0x50,0x00,0x74,0xAF, +0x54,0x00,0x75,0xAF, +0x58,0x00,0x76,0xAF, +0x5C,0x00,0x77,0xAF, +0x60,0x00,0x78,0xAF, +0x64,0x00,0x79,0xAF, +0x68,0x00,0x7C,0xAF, +0x6C,0x00,0x7D,0xAF, +0x70,0x00,0x7E,0xAF, +0x74,0x00,0x7F,0xAF, +0x78,0x00,0x68,0xAF, +0x7C,0x00,0x69,0xAF, +0x80,0x00,0x6A,0xAF, +0x32,0x3B,0x00,0x08, +0x21,0x20,0x60,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x20,0x03,0x08,0x35, +0x00,0x00,0x00,0x00, +0x00,0x00,0x1A,0xAD, +0x00,0x04,0x5B,0x33, +0x0A,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x01,0x80,0x08,0x3C, +0x3C,0xD4,0x08,0x25, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x1B,0x3C, +0x24,0x03,0x7B,0x37, +0x00,0x00,0x00,0x00, +0x00,0x00,0x68,0xAF, +0x09,0xF8,0x00,0x01, +0x00,0x00,0x00,0x00, +0x00,0x08,0x5B,0x33, +0x25,0xB0,0x08,0x3C, +0x28,0x03,0x08,0x35, +0x00,0x00,0x00,0x00, +0x00,0x00,0x1B,0xAD, +0x06,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x01,0x80,0x08,0x3C, +0x9C,0xE8,0x08,0x25, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x00,0x01, +0x00,0x00,0x00,0x00, +0x02,0x80,0x1A,0x3C, +0xBC,0x5E,0x5A,0x27, +0x04,0x00,0x5B,0x97, +0x25,0xB0,0x08,0x3C, +0x30,0x03,0x08,0x35, +0x00,0x00,0x00,0x00, +0x00,0x00,0x1B,0xAD, +0x18,0x00,0x60,0x13, +0x00,0x00,0x00,0x00, +0x08,0xE4,0x9B,0x27, +0x00,0x00,0x00,0x00, +0x04,0x00,0x61,0x8F, +0xFC,0x03,0x70,0x7B, +0x7C,0x00,0x62,0x7B, +0xBC,0x00,0x64,0x7B, +0xFC,0x00,0x66,0x7B, +0x3C,0x01,0x68,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x6A,0x7B, +0xBC,0x01,0x6C,0x7B, +0xFC,0x01,0x6E,0x7B, +0x3C,0x02,0x70,0x7B, +0x7C,0x02,0x72,0x7B, +0xBC,0x02,0x74,0x7B, +0xFC,0x02,0x76,0x7B, +0x3C,0x03,0x78,0x7B, +0x7C,0x03,0x7C,0x7B, +0xBC,0x03,0x7E,0x7B, +0x80,0x00,0x7B,0x8F, +0x8F,0x3C,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0xD8,0xA0,0x03, +0x82,0xDA,0x1B,0x00, +0x80,0xDA,0x1B,0x00, +0x08,0x00,0x7B,0x27, +0x08,0x00,0x5B,0xAF, +0xFC,0xE7,0x9D,0x27, +0x00,0x00,0x4A,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x00,0x40,0x11, +0x00,0x00,0x00,0x00, +0x02,0x80,0x08,0x3C, +0x1C,0x5E,0x08,0x25, +0x21,0x48,0x00,0x00, +0x21,0x58,0x00,0x00, +0x01,0x00,0x6B,0x25, +0x1A,0x00,0x40,0x11, +0x24,0x70,0x4B,0x01, +0x14,0x00,0xC0,0x11, +0x01,0x00,0x04,0x24, +0x00,0x00,0x00,0x00, +0x04,0x00,0x44,0xA3, +0x26,0x50,0x4B,0x01, +0x00,0x00,0x4A,0xAF, +0x80,0x80,0x09,0x00, +0x21,0x80,0x08,0x02, +0x00,0x00,0x10,0x8E, +0x00,0x00,0x00,0x00, +0x09,0xF8,0x00,0x02, +0x00,0x00,0x00,0x00, +0x01,0x80,0x1B,0x3C, +0x68,0xF1,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x02,0x80,0x1A,0x3C, +0xBC,0x5E,0x5A,0x27, +0xE1,0xFF,0x00,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x29,0x25, +0x40,0x58,0x0B,0x00, +0x52,0x3C,0x00,0x08, +0x00,0x00,0x00,0x00, +0x02,0x80,0x1B,0x3C, +0xBC,0x5E,0x7B,0x27, +0x21,0x60,0x00,0x00, +0x04,0x00,0x6C,0xA7, +0x08,0x00,0x7A,0x8F, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x5A,0x27, +0x00,0x00,0x5A,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x5A,0x27, +0x84,0x00,0x44,0x8F, +0x00,0x00,0x00,0x00, +0xF9,0xFF,0x80,0x10, +0x00,0x00,0x00,0x00, +0x04,0x00,0x41,0x8F, +0xFC,0x03,0x50,0x7B, +0x7C,0x00,0x42,0x7B, +0xBC,0x00,0x44,0x7B, +0xFC,0x00,0x46,0x7B, +0x3C,0x01,0x48,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x4A,0x7B, +0xBC,0x01,0x4C,0x7B, +0xFC,0x01,0x4E,0x7B, +0x3C,0x02,0x50,0x7B, +0x7C,0x02,0x52,0x7B, +0xBC,0x02,0x54,0x7B, +0xFC,0x02,0x56,0x7B, +0x3C,0x03,0x58,0x7B, +0x7C,0x03,0x5C,0x7B, +0xBC,0x03,0x5E,0x7B, +0x80,0x00,0x5B,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x60,0x03, +0x10,0x00,0x00,0x42, +0x00,0x60,0x05,0x40, +0x42,0x28,0x05,0x00, +0x40,0x28,0x05,0x00, +0x00,0x60,0x85,0x40, +0x04,0x00,0x81,0xAC, +0x08,0x00,0x82,0xAC, +0x0C,0x00,0x83,0xAC, +0x20,0x00,0x88,0xAC, +0x24,0x00,0x89,0xAC, +0x28,0x00,0x8A,0xAC, +0x2C,0x00,0x8B,0xAC, +0x30,0x00,0x8C,0xAC, +0x34,0x00,0x8D,0xAC, +0x38,0x00,0x8E,0xAC, +0x3C,0x00,0x8F,0xAC, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x40,0x00,0x90,0xAC, +0x44,0x00,0x91,0xAC, +0x48,0x00,0x92,0xAC, +0x4C,0x00,0x93,0xAC, +0x50,0x00,0x94,0xAC, +0x54,0x00,0x95,0xAC, +0x58,0x00,0x96,0xAC, +0x5C,0x00,0x97,0xAC, +0x60,0x00,0x98,0xAC, +0x64,0x00,0x99,0xAC, +0x68,0x00,0x9C,0xAC, +0x6C,0x00,0x9D,0xAC, +0x70,0x00,0x9E,0xAC, +0x74,0x00,0x9F,0xAC, +0x78,0x00,0x88,0xAC, +0x7C,0x00,0x89,0xAC, +0x80,0x00,0x9F,0xAC, +0xF8,0xFF,0x84,0x24, +0x00,0x00,0x84,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x84,0x24, +0x84,0x00,0x86,0x8C, +0x00,0x00,0x00,0x00, +0xF9,0xFF,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x21,0xD8,0x80,0x00, +0x01,0x00,0xBA,0x34, +0x04,0x00,0x61,0x8F, +0xFC,0x03,0x70,0x7B, +0x7C,0x00,0x62,0x7B, +0xBC,0x00,0x64,0x7B, +0xFC,0x00,0x66,0x7B, +0x3C,0x01,0x68,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x6A,0x7B, +0xBC,0x01,0x6C,0x7B, +0xFC,0x01,0x6E,0x7B, +0x3C,0x02,0x70,0x7B, +0x7C,0x02,0x72,0x7B, +0xBC,0x02,0x74,0x7B, +0xFC,0x02,0x76,0x7B, +0x3C,0x03,0x78,0x7B, +0x7C,0x03,0x7C,0x7B, +0xBC,0x03,0x7E,0x7B, +0x80,0x00,0x7B,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x60,0x03, +0x00,0x60,0x9A,0x40, +0x00,0x60,0x05,0x40, +0x42,0x28,0x05,0x00, +0x40,0x28,0x05,0x00, +0x00,0x60,0x85,0x40, +0x04,0x00,0x81,0xAC, +0x08,0x00,0x82,0xAC, +0x0C,0x00,0x83,0xAC, +0x20,0x00,0x88,0xAC, +0x24,0x00,0x89,0xAC, +0x28,0x00,0x8A,0xAC, +0x2C,0x00,0x8B,0xAC, +0x30,0x00,0x8C,0xAC, +0x34,0x00,0x8D,0xAC, +0x38,0x00,0x8E,0xAC, +0x3C,0x00,0x8F,0xAC, +0x12,0x40,0x00,0x00, +0x10,0x48,0x00,0x00, +0x40,0x00,0x90,0xAC, +0x44,0x00,0x91,0xAC, +0x48,0x00,0x92,0xAC, +0x4C,0x00,0x93,0xAC, +0x50,0x00,0x94,0xAC, +0x54,0x00,0x94,0xAC, +0x58,0x00,0x96,0xAC, +0x5C,0x00,0x96,0xAC, +0x60,0x00,0x98,0xAC, +0x64,0x00,0x99,0xAC, +0x68,0x00,0x9C,0xAC, +0x6C,0x00,0x9D,0xAC, +0x70,0x00,0x9E,0xAC, +0x78,0x00,0x88,0xAC, +0x7C,0x00,0x89,0xAC, +0x80,0x00,0x9F,0xAC, +0x84,0x00,0x80,0xAC, +0xF8,0xFF,0x84,0x24, +0x00,0x00,0x84,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x84,0x24, +0x84,0x00,0x86,0x8C, +0xFA,0xFF,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x21,0xD8,0x80,0x00, +0x01,0x00,0xBA,0x24, +0x04,0x00,0x61,0x8F, +0xFC,0x03,0x70,0x7B, +0x7C,0x00,0x62,0x7B, +0xBC,0x00,0x64,0x7B, +0xFC,0x00,0x66,0x7B, +0x3C,0x01,0x68,0x7B, +0x13,0x00,0x00,0x02, +0x11,0x00,0x20,0x02, +0x7C,0x01,0x6A,0x7B, +0xBC,0x01,0x6C,0x7B, +0xFC,0x01,0x6E,0x7B, +0x3C,0x02,0x70,0x7B, +0x7C,0x02,0x72,0x7B, +0xBC,0x02,0x74,0x7B, +0xFC,0x02,0x76,0x7B, +0x3C,0x03,0x78,0x7B, +0x7C,0x03,0x7C,0x7B, +0xBC,0x03,0x7E,0x7B, +0x80,0x00,0x7B,0x8F, +0x08,0x00,0x60,0x03, +0x00,0x60,0x9A,0x40, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x83,0x4E,0x00,0x00, +0x00,0x00,0x00,0x00, +0x01,0x80,0x1B,0x3C, +0x00,0x00,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x00,0x00,0x05,0x24, +0x03,0x00,0xA4,0x24, +0x00,0xA0,0x80,0x40, +0x00,0xA0,0x84,0x40, +0x01,0x80,0x04,0x3C, +0x40,0x00,0x84,0x24, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x01,0x80,0x1B,0x3C, +0x40,0x00,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x02,0x80,0x1A,0x3C, +0x00,0x00,0x5A,0x27, +0xFC,0x03,0x5D,0x27, +0x02,0x80,0x1C,0x3C, +0x00,0x1C,0x9C,0x27, +0x00,0xF0,0x08,0x3C, +0x00,0x0C,0x08,0x35, +0x00,0x60,0x88,0x40, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x84,0x24, +0xFF,0x7F,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x24,0x20,0x85,0x00, +0x00,0x20,0x84,0x4C, +0xFF,0xFF,0x05,0x34, +0x21,0x28,0xA4,0x00, +0x00,0x28,0x85,0x4C, +0x02,0x80,0x08,0x3C, +0x00,0x00,0x08,0x25, +0x00,0x00,0x00,0xAD, +0x03,0x80,0x09,0x3C, +0xFC,0xCC,0x29,0x25, +0x04,0x00,0x08,0x25, +0xFE,0xFF,0x09,0x15, +0x00,0x00,0x00,0xAD, +0x00,0x80,0x04,0x3C, +0x00,0x00,0x84,0x24, +0xFF,0x7F,0x05,0x3C, +0xFF,0xFF,0xA5,0x34, +0x24,0x20,0x85,0x00, +0x00,0x00,0x84,0x4C, +0xFF,0xFF,0x06,0x34, +0x21,0x30,0xC4,0x00, +0x24,0x30,0xC5,0x00, +0x00,0x08,0x86,0x4C, +0x00,0xA0,0x04,0x40, +0x10,0x00,0x84,0x34, +0x00,0xA0,0x84,0x40, +0x01,0x80,0x1B,0x3C, +0xEC,0x00,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x44,0x00,0x84,0x34, +0x00,0x00,0x85,0x84, +0x20,0x00,0x06,0x24, +0x25,0x28,0xA6,0x00, +0x00,0x00,0x85,0xA4, +0x01,0x80,0x1B,0x3C, +0x1C,0x01,0x7B,0x27, +0x25,0xB0,0x1A,0x3C, +0x18,0x03,0x5A,0x27, +0x00,0x00,0x5B,0xAF, +0x25,0xB0,0x04,0x3C, +0x44,0x00,0x84,0x34, +0x00,0x00,0x85,0x8C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xA5,0x30, +0xFC,0xFF,0xA0,0x10, +0x00,0x00,0x00,0x00, +0xFF,0x1F,0x07,0x3C, +0xFF,0xFF,0xE7,0x34, +0x02,0x80,0x05,0x3C, +0xD8,0x5D,0xA5,0x24, +0xFF,0xFF,0xA5,0x30, +0x40,0xB0,0x04,0x3C, +0x25,0x28,0xA4,0x00, +0x24,0x28,0xA7,0x00, +0x21,0x30,0x00,0x00, +0x43,0xB0,0x02,0x3C, +0x00,0x80,0x04,0x3C, +0x40,0x00,0x84,0x34, +0x00,0x00,0x45,0xAC, +0x04,0x00,0x46,0xAC, +0x08,0x00,0x44,0xAC, +0xEA,0x65,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x09,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x42,0x24, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x82,0xAC, +0x00,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x40,0x00, +0x00,0x60,0x83,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x82,0xAC, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x0C,0x02,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x85,0x8C, +0x00,0xA0,0x03,0x3C, +0x01,0x00,0x02,0x24, +0x25,0x28,0xA3,0x00, +0x00,0x00,0xA4,0x8C, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x3C,0x02,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x04,0x00,0x82,0x8C, +0x02,0x00,0x83,0x94, +0x00,0xA0,0x07,0x3C, +0x25,0x28,0x47,0x00, +0x00,0x00,0xA2,0x8C, +0x10,0x00,0x02,0x24, +0x13,0x00,0x62,0x10, +0x11,0x00,0x66,0x28, +0x06,0x00,0xC0,0x10, +0x20,0x00,0x02,0x24, +0x08,0x00,0x02,0x24, +0x17,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0xFD,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA3,0xAC, +0x04,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x25,0x10,0x47,0x00, +0x00,0x00,0x42,0x8C, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xA4, +0x04,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x25,0x18,0x67,0x00, +0x00,0x00,0x62,0x94, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xA0, +0x04,0x00,0x83,0x8C, +0x00,0x00,0x00,0x00, +0x25,0x18,0x67,0x00, +0x00,0x00,0x62,0x90, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x47,0x24, +0x30,0x37,0xE3,0x90, +0xFF,0xFF,0xA5,0x30, +0x09,0x00,0xA3,0x10, +0x21,0x20,0xC0,0x00, +0xA0,0x37,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0xC2,0xAC, +0xAA,0x37,0xE3,0x94, +0x0E,0x00,0x02,0x24, +0x14,0x00,0xC2,0xAC, +0x30,0x09,0x00,0x08, +0x0C,0x00,0xC3,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x31,0x26, +0x88,0x37,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x01,0x80,0x03,0x3C, +0x25,0x80,0x02,0x02, +0x25,0xB0,0x02,0x3C, +0x40,0x03,0x63,0x24, +0x18,0x03,0x42,0x34, +0x60,0x00,0x04,0x26, +0x80,0x00,0x05,0x26, +0x00,0x00,0x43,0xAC, +0x5F,0x1E,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x21,0x20,0x00,0x02, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x08,0x00,0x06,0x24, +0x88,0x37,0x22,0x8E, +0x0C,0x00,0x03,0x24, +0x0C,0x00,0x43,0xAE, +0x08,0x00,0x42,0xAE, +0x12,0x00,0x02,0x24, +0x14,0x00,0x42,0xAE, +0x21,0x20,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x30,0x09,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x1C,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x30,0x80,0x00, +0x21,0x90,0x00,0x00, +0x00,0x60,0x11,0x40, +0x01,0x00,0x21,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0D,0x00,0x83,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x60,0x14, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x03,0x24, +0xF8,0x5E,0x43,0xA0, +0x0C,0x00,0xC2,0x90, +0x02,0x80,0x05,0x3C, +0x0D,0x5F,0xA2,0xA0, +0x00,0x00,0xC4,0x90, +0x05,0x00,0x02,0x24, +0xFF,0x00,0x83,0x30, +0x41,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x02,0x24, +0x31,0x00,0x62,0x10, +0xFF,0x00,0x84,0x30, +0x09,0x00,0x82,0x2C, +0x25,0x00,0x40,0x10, +0x02,0x80,0x10,0x3C, +0xF4,0x5E,0x02,0x92, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x21,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0xB6,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF4,0x5E,0x02,0x92, +0x00,0x00,0x00,0x00, +0x34,0x00,0x40,0x10, +0x02,0x80,0x03,0x3C, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x51,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x11,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x15,0x5F,0x62,0xA0, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x04,0x00,0x42,0x28, +0x06,0x00,0x40,0x10, +0x04,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x40,0x41,0x00,0x08, +0x00,0x00,0x00,0x00, +0x04,0x00,0x12,0x24, +0x00,0x60,0x91,0x40, +0x21,0x10,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x0B,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x40,0x14, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x02,0x24, +0x10,0x5F,0x62,0xA0, +0x10,0x5F,0x63,0x90, +0x02,0x80,0x02,0x3C, +0x11,0x5F,0x43,0xA0, +0x00,0x00,0xC4,0x90, +0x18,0x41,0x00,0x08, +0xFF,0x00,0x84,0x30, +0x0D,0x5F,0xA0,0xA0, +0x00,0x00,0xC4,0x90, +0x15,0x41,0x00,0x08, +0xFF,0x00,0x83,0x30, +0x42,0xB0,0x06,0x3C, +0x00,0x00,0xC3,0x90, +0xEF,0xFF,0x02,0x24, +0x03,0x00,0xC7,0x34, +0x24,0x18,0x62,0x00, +0x40,0x00,0x02,0x24, +0x00,0x00,0xC3,0xA0, +0x0C,0x00,0x04,0x24, +0x00,0x00,0xE2,0xA0, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x15,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x2A,0x1C,0x43,0x90, +0x00,0x00,0x00,0x00, +0xCD,0xFF,0x60,0x10, +0x00,0x00,0x00,0x00, +0x50,0x39,0x44,0x94, +0x2A,0x1C,0x40,0xA0, +0x00,0xC0,0x84,0x24, +0xC2,0x34,0x00,0x0C, +0xFF,0xFF,0x84,0x30, +0x40,0x41,0x00,0x08, +0x00,0x00,0x00,0x00, +0x15,0x5F,0x40,0xA0, +0x40,0x41,0x00,0x08, +0x00,0x00,0x00,0x00, +0x9B,0x30,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x6B,0x41,0x00,0x08, +0x00,0x08,0x04,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x30,0x26, +0xB0,0x1B,0x07,0x96, +0x18,0x00,0xBF,0xAF, +0xFF,0xFF,0xE3,0x30, +0x00,0x01,0x62,0x30, +0x0E,0x00,0x40,0x10, +0x01,0x00,0x66,0x30, +0x02,0x80,0x04,0x3C, +0x88,0x58,0x84,0x24, +0x03,0x00,0x05,0x24, +0x17,0x00,0xC0,0x14, +0x04,0x00,0x62,0x30, +0x02,0x00,0x40,0x10, +0xFB,0xF6,0xE3,0x30, +0xB0,0x1B,0x03,0xA6, +0xA3,0x51,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x40,0xA0, +0x21,0x20,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x30,0x1F,0x23,0x26, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x20,0x00,0xBD,0x27, +0x10,0x3E,0x60,0xAC, +0xEC,0x38,0x60,0xAC, +0x08,0x39,0x60,0xAC, +0x08,0x00,0xE0,0x03, +0x50,0x3E,0x60,0xAC, +0x6C,0x4C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFE,0xFE,0x42,0x30, +0xA3,0x51,0x00,0x0C, +0xB0,0x1B,0x02,0xA6, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x40,0xA0, +0x9D,0x41,0x00,0x08, +0x21,0x20,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x01,0x00,0x83,0x90, +0x02,0x80,0x02,0x3C, +0x21,0x38,0x80,0x00, +0xB0,0x5C,0x43,0xAC, +0x01,0x00,0x84,0x90, +0x00,0x00,0xE2,0x90, +0x02,0x80,0x06,0x3C, +0xFF,0x00,0x85,0x30, +0x80,0x10,0x02,0x00, +0x25,0x28,0xA2,0x00, +0xE8,0xDD,0xC6,0x24, +0xFF,0x00,0x84,0x30, +0x00,0x80,0xA5,0x34, +0x4E,0x23,0x00,0x0C, +0x03,0x00,0xE7,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x03,0x3C, +0x1C,0x00,0xBF,0xAF, +0xE0,0x3A,0x62,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0x43,0x30, +0x00,0x01,0x42,0x30, +0x04,0x00,0x40,0x10, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x06,0x00,0x60,0x14, +0xE0,0xD7,0x84,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x07,0x92, +0x07,0x00,0x02,0x26, +0x21,0x20,0x00,0x02, +0x80,0x38,0x07,0x00, +0x00,0x80,0xE7,0x34, +0x05,0x00,0x05,0x24, +0x21,0x30,0x00,0x00, +0x1E,0x51,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x30,0x1F,0x45,0x24, +0x50,0x3E,0xA3,0x8C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x60,0x14, +0x21,0x80,0x80,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x4C,0x3E,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x21,0x10,0x45,0x00, +0x44,0x3E,0x40,0xA0, +0x00,0x00,0x84,0x8C, +0x6D,0x1D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x8E, +0x03,0x00,0x04,0x24, +0x90,0x14,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x84,0x90, +0x4F,0x0C,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x86,0x90, +0x21,0x80,0x80,0x00, +0x00,0x7F,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x08,0x0E,0x04,0x24, +0x00,0x00,0x05,0x92, +0x7F,0x7F,0x11,0x3C, +0x00,0x0E,0x04,0x24, +0x00,0x14,0x05,0x00, +0x00,0x86,0x05,0x00, +0x00,0x1A,0x05,0x00, +0x25,0x80,0x02,0x02, +0x25,0x80,0x03,0x02, +0x25,0x80,0x05,0x02, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x7F,0x7F,0x25,0x36, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x04,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x10,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x14,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x18,0x0E,0x04,0x24, +0x7F,0x7F,0x25,0x36, +0x21,0x30,0x00,0x02, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x1C,0x0E,0x04,0x24, +0xA9,0x45,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x28,0x00,0xBF,0xAF, +0x00,0x00,0x85,0x94, +0x02,0x00,0x02,0x24, +0x21,0x98,0x80,0x00, +0x10,0x00,0xA0,0xA3, +0x21,0x80,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x88,0x00,0x00, +0x66,0x00,0xA2,0x10, +0x10,0x00,0xB2,0x27, +0x03,0x00,0xA2,0x28, +0x26,0x00,0x40,0x14, +0x01,0x00,0x02,0x24, +0x03,0x00,0x02,0x24, +0x75,0x00,0xA2,0x10, +0x24,0x08,0x04,0x24, +0x0C,0x09,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x04,0x08,0x04,0x24, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x02,0x00,0x64,0x96, +0x02,0x00,0x02,0x24, +0x35,0x00,0x82,0x10, +0x03,0x00,0x82,0x28, +0x4B,0x00,0x40,0x10, +0x03,0x00,0x02,0x24, +0x01,0x00,0x02,0x24, +0x60,0x00,0x82,0x10, +0x21,0x30,0x20,0x02, +0x04,0x0C,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x21,0x30,0x20,0x02, +0x04,0x0D,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x10,0x00,0xA6,0x93, +0x04,0x0A,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0xFF,0x05,0x3C, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xDE,0xFF,0xA2,0x14, +0x0C,0x09,0x04,0x24, +0x24,0x08,0x04,0x24, +0x0E,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x2C,0x08,0x04,0x24, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x0E,0x00,0x05,0x24, +0x10,0x00,0xA2,0x93, +0x80,0xFF,0x03,0x24, +0x11,0x11,0x04,0x3C, +0x0F,0x00,0x42,0x30, +0x25,0x10,0x43,0x00, +0x11,0x11,0x86,0x34, +0x03,0x00,0x10,0x24, +0x10,0x00,0xA2,0xA3, +0x0C,0x09,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x04,0x08,0x04,0x24, +0x21,0x30,0x00,0x02, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x02,0x00,0x64,0x96, +0x02,0x00,0x02,0x24, +0xCD,0xFF,0x82,0x14, +0x03,0x00,0x82,0x28, +0x00,0x00,0x42,0x92, +0x02,0x00,0x11,0x24, +0xF5,0x00,0x42,0x30, +0x05,0x00,0x42,0x34, +0x00,0x00,0x42,0xA2, +0x21,0x30,0x20,0x02, +0x04,0x0C,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x21,0x30,0x20,0x02, +0x04,0x0D,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x05,0x24, +0x10,0x00,0xA6,0x93, +0x04,0x0A,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0xFF,0x05,0x3C, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xB8,0xFF,0x82,0x14, +0x21,0x30,0x20,0x02, +0x00,0x00,0x42,0x92, +0x03,0x00,0x11,0x24, +0xF0,0x00,0x42,0x30, +0x01,0x00,0x42,0x34, +0xD4,0x42,0x00,0x08, +0x00,0x00,0x42,0xA2, +0x24,0x08,0x04,0x24, +0x0E,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x02,0x00,0x06,0x24, +0x2C,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0E,0x00,0x05,0x24, +0x10,0x00,0xA2,0x93, +0x22,0x22,0x03,0x3C, +0x22,0x22,0x66,0x34, +0x0F,0x00,0x42,0x30, +0x40,0x00,0x42,0x34, +0x03,0x00,0x10,0x24, +0xC4,0x42,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0x00,0x00,0x42,0x92, +0x01,0x00,0x11,0x24, +0xF0,0x00,0x42,0x30, +0xD4,0x42,0x00,0x08, +0x00,0x00,0x42,0xA2, +0x0E,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x02,0x00,0x06,0x24, +0x2C,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x0E,0x00,0x05,0x24, +0x10,0x00,0xA2,0x93, +0xC0,0xFF,0x03,0x24, +0x03,0x00,0x10,0x24, +0x0F,0x00,0x42,0x30, +0x25,0x10,0x43,0x00, +0x32,0x03,0x03,0x3C, +0x33,0x13,0x66,0x34, +0x90,0x42,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0x00,0x00,0x86,0x8C, +0x00,0x0F,0x05,0x3C, +0xA9,0x45,0x00,0x08, +0x80,0x08,0x04,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0xF0,0xD7,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0x21,0x00,0x40,0x10, +0x21,0x30,0x00,0x00, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0x00,0x02,0x05,0x3C, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0x32,0x00,0x40,0x10, +0x01,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x40,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x0D,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x10,0x27,0x04,0x24, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0x3E,0x43,0x00,0x08, +0x21,0x30,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x08,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x0F,0x00,0x12,0x3C, +0x0F,0x00,0x11,0x3C, +0x00,0x08,0x04,0x24, +0x00,0x01,0x05,0x3C, +0x20,0x00,0x40,0x10, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x02,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x08,0x04,0x24, +0x01,0x00,0x04,0x92, +0xE6,0x44,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x06,0x3C, +0xFF,0xFF,0x45,0x36, +0x00,0x40,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x21,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x02,0x00,0x06,0x3C, +0xFF,0xFF,0x45,0x36, +0x1F,0x00,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x02,0x05,0x3C, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0x08,0x04,0x24, +0x01,0x00,0x04,0x92, +0xE6,0x44,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x06,0x3C, +0xFF,0xFF,0x25,0x36, +0x00,0x40,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x21,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xFF,0xFF,0x25,0x36, +0x21,0x20,0x00,0x00, +0x5F,0x47,0x00,0x0C, +0x03,0x00,0x06,0x3C, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x20,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x40,0x10, +0x00,0x0A,0x04,0x24, +0x04,0x00,0x02,0x8E, +0x00,0x08,0x04,0x24, +0x04,0x00,0x42,0x2C, +0x1C,0x00,0x40,0x14, +0x00,0x01,0x05,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x04,0x00,0x02,0x8E, +0x03,0x00,0x05,0x24, +0x04,0x00,0x42,0x2C, +0xF8,0xFF,0x40,0x10, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xCB,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x01,0x05,0x3C, +0x1B,0x00,0x40,0x10, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x00,0x30,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0xE4,0x43,0x00,0x08, +0x00,0x00,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xEF,0x43,0x00,0x08, +0x00,0x0D,0x04,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x40,0xD8,0x84,0x24, +0x04,0x00,0x03,0x8E, +0x00,0x00,0x00,0x00, +0x04,0x00,0x62,0x2C, +0x2C,0x00,0x40,0x14, +0xFC,0xFF,0x62,0x24, +0x18,0x00,0x42,0x2C, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x6C,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x54,0x00,0x40,0x10, +0x00,0x0D,0x04,0x24, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0x00,0x02,0x05,0x3C, +0x63,0x00,0x40,0x10, +0x00,0x08,0x04,0x24, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x58,0xD8,0x84,0x24, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x21,0x00,0x40,0x10, +0x00,0x0A,0x04,0x24, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x3A,0x00,0x40,0x10, +0x00,0x08,0x04,0x24, +0x00,0x0D,0x04,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x40,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x04,0x00,0x06,0x8E, +0x00,0x0A,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0x30,0x05,0x24, +0x00,0x0A,0x04,0x24, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x3F,0x44,0x00,0x08, +0x00,0x00,0x00,0x00, +0x03,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0A,0x04,0x24, +0x08,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x24, +0x66,0x44,0x00,0x08, +0x01,0x00,0x06,0x24, +0x00,0x10,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x20,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x40,0x05,0x3C, +0x21,0x30,0x00,0x00, +0xA9,0x45,0x00,0x0C, +0x00,0x0D,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x10,0x27,0x04,0x24, +0x72,0x44,0x00,0x08, +0x00,0x0F,0x04,0x24, +0x00,0x01,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x50,0x44,0x00,0x08, +0x00,0x0D,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x2C,0x44,0x00,0x08, +0x00,0x0A,0x04,0x24, +0xE8,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x14,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x03,0x02,0x42,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x90,0x90, +0x25,0xB0,0x02,0x3C, +0xFF,0x00,0x63,0x30, +0xFB,0x00,0x65,0x30, +0x00,0x00,0x04,0x3A, +0x04,0x00,0x63,0x34, +0x0B,0x18,0xA4,0x00, +0x03,0x02,0x42,0x34, +0x00,0x00,0x43,0xA0, +0x12,0x00,0x00,0x12, +0x01,0x00,0x02,0x24, +0x22,0x00,0x02,0x12, +0x00,0x08,0x04,0x24, +0x1A,0x00,0x00,0x12, +0x01,0x00,0x02,0x24, +0x08,0x00,0x02,0x16, +0x00,0x00,0x00,0x00, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x18,0x00,0x04,0x24, +0x00,0x0C,0x05,0x24, +0x21,0x30,0x00,0x00, +0x5F,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x00,0x08,0x04,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x58,0x00,0x06,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x18,0x00,0x04,0x24, +0x00,0x0C,0x05,0x24, +0xAE,0x44,0x00,0x08, +0x01,0x00,0x06,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x09,0x04,0x24, +0x01,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x0A,0x04,0x24, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x0D,0x04,0x24, +0x00,0x0C,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x84,0x08,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x18,0x00,0x06,0x24, +0xA5,0x44,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x21,0x20,0x82,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0x01,0x80,0x03,0x3C, +0x21,0x38,0x80,0x00, +0x18,0x03,0xA2,0x34, +0x98,0x13,0x63,0x24, +0x01,0x00,0x04,0x24, +0x00,0x00,0x43,0xAC, +0x35,0x00,0xE4,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x10, +0x20,0x08,0xA2,0x34, +0x02,0x00,0x02,0x24, +0x83,0x00,0xE2,0x10, +0x03,0x00,0x02,0x24, +0x5A,0x00,0xE2,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x30,0x1F,0x66,0x24, +0x70,0x08,0x02,0x24, +0xE0,0x08,0x03,0x24, +0x34,0x1C,0xC2,0xAC, +0x40,0x08,0x02,0x24, +0x38,0x1C,0xC3,0xAC, +0x44,0x1C,0xC2,0xAC, +0x78,0x08,0x03,0x24, +0x0C,0x08,0x02,0x24, +0x48,0x1C,0xC3,0xAC, +0x4C,0x1C,0xC2,0xAC, +0x10,0x08,0x03,0x24, +0x20,0x08,0x02,0x24, +0x50,0x1C,0xC3,0xAC, +0x54,0x1C,0xC2,0xAC, +0x24,0x08,0x03,0x24, +0x58,0x08,0x02,0x24, +0x58,0x1C,0xC3,0xAC, +0x5C,0x1C,0xC2,0xAC, +0x50,0x0C,0x03,0x24, +0x54,0x0C,0x02,0x24, +0x60,0x1C,0xC3,0xAC, +0x64,0x1C,0xC2,0xAC, +0x14,0x0C,0x03,0x24, +0x10,0x0C,0x02,0x24, +0x60,0x08,0x05,0x24, +0x68,0x1C,0xC3,0xAC, +0x6C,0x1C,0xC2,0xAC, +0x80,0x0C,0x03,0x24, +0x84,0x0C,0x02,0x24, +0x00,0x01,0x84,0x30, +0x74,0x1C,0xC2,0xAC, +0x40,0x1C,0xC5,0xAC, +0x70,0x1C,0xC3,0xAC, +0x31,0x1C,0xC0,0xA0, +0x3C,0x1C,0xC5,0xAC, +0x02,0x00,0x80,0x10, +0xA0,0x08,0x02,0x24, +0xB8,0x08,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x78,0x1C,0xC2,0xAC, +0x28,0x08,0xA2,0x34, +0x02,0x80,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x30,0x1F,0x66,0x24, +0x70,0x08,0x02,0x24, +0xE0,0x08,0x03,0x24, +0x34,0x1C,0xC2,0xAC, +0x44,0x08,0x02,0x24, +0x38,0x1C,0xC3,0xAC, +0x44,0x1C,0xC2,0xAC, +0x78,0x08,0x03,0x24, +0x0C,0x08,0x02,0x24, +0x48,0x1C,0xC3,0xAC, +0x4C,0x1C,0xC2,0xAC, +0x14,0x08,0x03,0x24, +0x28,0x08,0x02,0x24, +0x50,0x1C,0xC3,0xAC, +0x54,0x1C,0xC2,0xAC, +0x2C,0x08,0x03,0x24, +0x58,0x08,0x02,0x24, +0x58,0x1C,0xC3,0xAC, +0x5C,0x1C,0xC2,0xAC, +0x58,0x0C,0x03,0x24, +0x5C,0x0C,0x02,0x24, +0x60,0x1C,0xC3,0xAC, +0x64,0x1C,0xC2,0xAC, +0x1C,0x0C,0x03,0x24, +0x18,0x0C,0x02,0x24, +0x64,0x08,0x05,0x24, +0x68,0x1C,0xC3,0xAC, +0x6C,0x1C,0xC2,0xAC, +0x88,0x0C,0x03,0x24, +0x8C,0x0C,0x02,0x24, +0x00,0x01,0x84,0x30, +0x74,0x1C,0xC2,0xAC, +0x31,0x1C,0xC7,0xA0, +0x40,0x1C,0xC5,0xAC, +0x70,0x1C,0xC3,0xAC, +0x3C,0x1C,0xC5,0xAC, +0xD6,0xFF,0x80,0x10, +0xA4,0x08,0x02,0x24, +0xBC,0x08,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x78,0x1C,0xC2,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xAC,0x08,0x03,0x24, +0x78,0x1C,0x43,0xAC, +0x74,0x08,0x03,0x24, +0xE4,0x08,0x04,0x24, +0x34,0x1C,0x43,0xAC, +0x4C,0x08,0x03,0x24, +0x38,0x1C,0x44,0xAC, +0x44,0x1C,0x43,0xAC, +0x7C,0x08,0x04,0x24, +0x0C,0x08,0x03,0x24, +0x48,0x1C,0x44,0xAC, +0x4C,0x1C,0x43,0xAC, +0x1C,0x08,0x04,0x24, +0x38,0x08,0x03,0x24, +0x50,0x1C,0x44,0xAC, +0x54,0x1C,0x43,0xAC, +0x3C,0x08,0x04,0x24, +0x5C,0x08,0x03,0x24, +0x58,0x1C,0x44,0xAC, +0x5C,0x1C,0x43,0xAC, +0x68,0x0C,0x04,0x24, +0x6C,0x0C,0x03,0x24, +0x60,0x1C,0x44,0xAC, +0x64,0x1C,0x43,0xAC, +0x2C,0x0C,0x04,0x24, +0x28,0x0C,0x03,0x24, +0x6C,0x08,0x05,0x24, +0x68,0x1C,0x44,0xAC, +0x6C,0x1C,0x43,0xAC, +0x98,0x0C,0x04,0x24, +0x9C,0x0C,0x03,0x24, +0x31,0x1C,0x47,0xA0, +0x40,0x1C,0x45,0xAC, +0x70,0x1C,0x44,0xAC, +0x74,0x1C,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x3C,0x1C,0x45,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xA8,0x08,0x03,0x24, +0x78,0x1C,0x43,0xAC, +0x74,0x08,0x03,0x24, +0xE4,0x08,0x04,0x24, +0x34,0x1C,0x43,0xAC, +0x48,0x08,0x03,0x24, +0x38,0x1C,0x44,0xAC, +0x44,0x1C,0x43,0xAC, +0x7C,0x08,0x04,0x24, +0x0C,0x08,0x03,0x24, +0x48,0x1C,0x44,0xAC, +0x4C,0x1C,0x43,0xAC, +0x18,0x08,0x04,0x24, +0x30,0x08,0x03,0x24, +0x50,0x1C,0x44,0xAC, +0x54,0x1C,0x43,0xAC, +0x34,0x08,0x04,0x24, +0x5C,0x08,0x03,0x24, +0x58,0x1C,0x44,0xAC, +0x5C,0x1C,0x43,0xAC, +0x60,0x0C,0x04,0x24, +0x64,0x0C,0x03,0x24, +0x60,0x1C,0x44,0xAC, +0x64,0x1C,0x43,0xAC, +0x24,0x0C,0x04,0x24, +0x20,0x0C,0x03,0x24, +0x68,0x08,0x05,0x24, +0x68,0x1C,0x44,0xAC, +0x6C,0x1C,0x43,0xAC, +0x90,0x0C,0x04,0x24, +0x94,0x0C,0x03,0x24, +0x31,0x1C,0x47,0xA0, +0x40,0x1C,0x45,0xAC, +0x70,0x1C,0x44,0xAC, +0x74,0x1C,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x3C,0x1C,0x45,0xAC, +0xA2,0x45,0x00,0x08, +0x21,0x18,0x00,0x00, +0x20,0x00,0x62,0x2C, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x06,0x10,0x64,0x00, +0x01,0x00,0x42,0x30, +0xFA,0xFF,0x40,0x10, +0x01,0x00,0x63,0x24, +0xFF,0xFF,0x63,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x25,0xB0,0x02,0x3C, +0x21,0x88,0xA0,0x00, +0xFF,0xFF,0x03,0x24, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x21,0x98,0xC0,0x00, +0x21,0x28,0xC0,0x00, +0x21,0x90,0x80,0x00, +0x09,0x00,0x23,0x12, +0x21,0x80,0x82,0x00, +0x00,0x00,0x10,0x8E, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x27,0x28,0x11,0x00, +0x24,0x28,0xB0,0x00, +0x04,0x10,0x53,0x00, +0x25,0x28,0xA2,0x00, +0x21,0x20,0x40,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xDB,0x44,0x00,0x08, +0x28,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x21,0x30,0x80,0x00, +0x74,0x3B,0x44,0x8C, +0xA9,0x45,0x00,0x08, +0xFF,0xFF,0x05,0x24, +0xE0,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x82,0x00, +0x00,0x00,0x90,0x8C, +0x21,0x88,0xA0,0x00, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0xA0,0x00, +0x24,0x80,0x11,0x02, +0x06,0x10,0x50,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x20,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x1C,0x00,0xB3,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x31,0x26, +0x58,0x1C,0x23,0x8E, +0x25,0xB0,0x02,0x3C, +0x24,0x08,0x53,0x8C, +0x21,0x18,0x62,0x00, +0x00,0x00,0x70,0x8C, +0x7F,0x80,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xFF,0x7F,0x05,0x3C, +0x24,0x80,0x02,0x02, +0xC0,0x25,0x04,0x00, +0xFF,0xFF,0xA5,0x34, +0x24,0x28,0x65,0x02, +0x25,0x80,0x04,0x02, +0xDB,0x44,0x00,0x0C, +0x24,0x08,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x00,0x80,0x12,0x3C, +0x58,0x1C,0x24,0x8E, +0x25,0x80,0x12,0x02, +0xDB,0x44,0x00,0x0C, +0x21,0x28,0x00,0x02, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x25,0x28,0x72,0x02, +0xDB,0x44,0x00,0x0C, +0x24,0x08,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x78,0x1C,0x24,0x8E, +0x0F,0x00,0x05,0x3C, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0xFF,0xA5,0x34, +0xCB,0x45,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xBF,0xAF, +0x30,0x1F,0x27,0x26, +0x33,0x1C,0xE5,0x90, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x2C,0x18,0x63,0x24, +0x18,0x03,0x42,0x34, +0x02,0x00,0x06,0x24, +0x00,0x00,0x43,0xAC, +0x34,0x00,0xA6,0x10, +0x21,0x80,0x80,0x00, +0x03,0x00,0x03,0x24, +0x3A,0x00,0xA3,0x10, +0x2E,0x00,0x02,0x2E, +0x10,0x00,0x02,0x2E, +0x07,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x04,0x32, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xDC,0x45,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xFA,0xFF,0xA6,0x14, +0xFF,0x00,0x04,0x32, +0x31,0x1C,0xE4,0x90, +0x01,0x00,0x02,0x24, +0x33,0x00,0x82,0x10, +0x02,0x00,0x82,0x28, +0x38,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x38,0x00,0x85,0x10, +0x30,0x1F,0x22,0x26, +0x2E,0x00,0x83,0x10, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0xFF,0xFC,0x06,0x3C, +0xFF,0xFF,0xC6,0x34, +0x24,0x30,0x46,0x00, +0x00,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x30,0x1F,0x22,0x26, +0x31,0x1C,0x44,0x90, +0x01,0x00,0x03,0x24, +0x07,0x00,0x83,0x10, +0x02,0x00,0x82,0x28, +0x2C,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x2C,0x00,0x82,0x10, +0x03,0x00,0x02,0x24, +0xDB,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x21,0x46,0x00,0x08, +0xFF,0x00,0x04,0x32, +0x25,0x00,0x82,0x2C, +0xCC,0xFF,0x40,0x14, +0x03,0x00,0x03,0x24, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xC7,0xFF,0x40,0x14, +0x10,0x00,0x02,0x2E, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0x33,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xCC,0xFF,0x80,0x14, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0x33,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xB2,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x21,0x46,0x00,0x08, +0xFF,0x00,0x04,0x32, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x02,0x80,0x11,0x3C, +0x30,0x1F,0x28,0x26, +0x33,0x1C,0x06,0x91, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xD8,0x19,0x63,0x24, +0x18,0x03,0x42,0x34, +0x02,0x00,0x07,0x24, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0x00,0x00,0x43,0xAC, +0x21,0x90,0xA0,0x00, +0x39,0x00,0xC7,0x10, +0xFF,0x00,0x90,0x30, +0x03,0x00,0x03,0x24, +0x3F,0x00,0xC3,0x10, +0x2E,0x00,0x02,0x2E, +0x10,0x00,0x02,0x2E, +0x0C,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x04,0x3C, +0xFF,0xFF,0x84,0x34, +0x24,0x20,0x44,0x02, +0x00,0x15,0x10,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x25,0x20,0x44,0x00, +0xC6,0x45,0x00,0x08, +0x20,0x00,0xBD,0x27, +0xF5,0xFF,0xC7,0x14, +0x0F,0x00,0x04,0x3C, +0x31,0x1C,0x04,0x91, +0x01,0x00,0x02,0x24, +0x33,0x00,0x82,0x10, +0x02,0x00,0x82,0x28, +0x38,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x38,0x00,0x86,0x10, +0x30,0x1F,0x22,0x26, +0x2E,0x00,0x83,0x10, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0xFF,0xFC,0x06,0x3C, +0xFF,0xFF,0xC6,0x34, +0x24,0x30,0x46,0x00, +0x00,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x30,0x1F,0x22,0x26, +0x31,0x1C,0x44,0x90, +0x01,0x00,0x03,0x24, +0x07,0x00,0x83,0x10, +0x02,0x00,0x82,0x28, +0x2C,0x00,0x40,0x14, +0x02,0x00,0x02,0x24, +0x2C,0x00,0x82,0x10, +0x03,0x00,0x02,0x24, +0xD6,0xFF,0x82,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x8E,0x46,0x00,0x08, +0x0F,0x00,0x04,0x3C, +0x25,0x00,0x02,0x2E, +0xC7,0xFF,0x40,0x14, +0x03,0x00,0x03,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xC1,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0xA5,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xCC,0xFF,0x80,0x14, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x0F,0x00,0x06,0x24, +0xA5,0x46,0x00,0x08, +0x00,0x08,0x04,0x24, +0xAD,0xFF,0x80,0x14, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x22,0x26, +0x34,0x1C,0x44,0x8C, +0x0F,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x8E,0x46,0x00,0x08, +0x0F,0x00,0x04,0x3C, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x14,0x00,0xBF,0xAF, +0xDC,0x45,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x40,0x01,0x44,0x34, +0x21,0x18,0x40,0x00, +0x1F,0x00,0x02,0x2E, +0x00,0x23,0x04,0x00, +0x10,0x00,0x40,0x10, +0x10,0x00,0x05,0x2E, +0x00,0x01,0x64,0x34, +0x06,0x00,0xA0,0x10, +0x00,0x23,0x04,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xC6,0x45,0x00,0x0C, +0xF1,0xFF,0x10,0x26, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xC6,0x45,0x00,0x0C, +0xE2,0xFF,0x10,0x26, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x82,0x00, +0x00,0x00,0x90,0x8C, +0x21,0x88,0xA0,0x00, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0xA0,0x00, +0x24,0x80,0x11,0x02, +0x06,0x10,0x50,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xB2,0xAF, +0x21,0x90,0x82,0x00, +0xFF,0xFF,0x02,0x24, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x20,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x88,0xA0,0x00, +0x21,0x20,0xA0,0x00, +0x21,0x18,0x40,0x02, +0x10,0x00,0xA2,0x10, +0x21,0x98,0xC0,0x00, +0x00,0x00,0x50,0x8E, +0x9D,0x45,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x27,0x18,0x11,0x00, +0x24,0x18,0x70,0x00, +0x04,0x10,0x53,0x00, +0x25,0x18,0x62,0x00, +0x00,0x00,0x43,0xAE, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x28,0x00,0xBD,0x27, +0x00,0x00,0x66,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x21,0x38,0x82,0x00, +0xFF,0xFF,0x02,0x24, +0x27,0x40,0x05,0x00, +0x08,0x00,0xA2,0x10, +0x24,0x18,0xC5,0x00, +0x00,0x00,0xE2,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x02,0x01, +0x25,0x10,0x43,0x00, +0x00,0x00,0xE2,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x38,0xA0,0x00, +0x25,0xB0,0x02,0x3C, +0xFF,0xFF,0x03,0x24, +0x27,0x48,0x05,0x00, +0x24,0x40,0xC7,0x00, +0x21,0x28,0xC0,0x00, +0x05,0x00,0xE3,0x10, +0x21,0x30,0x82,0x00, +0x00,0x00,0xC5,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x28,0x25,0x01, +0x25,0x28,0xA8,0x00, +0xDB,0x44,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xD8,0xFF,0xBD,0x27, +0x7C,0x1D,0x42,0x24, +0x18,0x03,0x63,0x34, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x24,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x62,0xAC, +0x21,0x88,0xA0,0x00, +0x21,0x98,0xC0,0x00, +0x21,0xA0,0x80,0x00, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x0A,0x00,0x22,0x12, +0x21,0x28,0xC0,0x00, +0x0B,0x46,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x20,0x20,0x02, +0x9D,0x45,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x27,0x28,0x11,0x00, +0x24,0x28,0xB0,0x00, +0x04,0x10,0x53,0x00, +0x25,0x28,0xA2,0x00, +0x76,0x46,0x00,0x0C, +0xFF,0x00,0x84,0x32, +0x00,0x60,0x92,0x40, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x01,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x28,0x1E,0x63,0x24, +0x18,0x03,0x42,0x34, +0xE0,0xFF,0xBD,0x27, +0x00,0x00,0x43,0xAC, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x0B,0x46,0x00,0x0C, +0x21,0x88,0xA0,0x00, +0x21,0x80,0x40,0x00, +0x9D,0x45,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x24,0x80,0x11,0x02, +0x06,0x10,0x50,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x24,0x00,0xB5,0xAF, +0xFF,0x00,0x84,0x30, +0x21,0xA8,0xC0,0x00, +0x28,0x00,0xB6,0xAF, +0x1C,0x00,0xB3,0xAF, +0x2C,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0xB0,0xA0,0x00, +0xE6,0x44,0x00,0x0C, +0x21,0x98,0x00,0x00, +0x21,0x00,0xA0,0x16, +0x80,0x10,0x13,0x00, +0xDD,0x47,0x00,0x08, +0x00,0x00,0x00,0x00, +0xFD,0x00,0x02,0x24, +0x23,0x00,0x02,0x12, +0x05,0x00,0x04,0x24, +0xFC,0x00,0x02,0x24, +0x37,0x00,0x02,0x12, +0x00,0x00,0x00,0x00, +0xFB,0x00,0x02,0x24, +0x30,0x00,0x02,0x12, +0x32,0x00,0x04,0x24, +0xFA,0x00,0x02,0x24, +0x2D,0x00,0x02,0x12, +0x05,0x00,0x04,0x24, +0xF9,0x00,0x02,0x24, +0x29,0x00,0x02,0x12, +0x0F,0x00,0x05,0x3C, +0x04,0x00,0xD1,0x8C, +0xFF,0xFF,0xA5,0x34, +0x21,0x20,0x00,0x02, +0x5F,0x47,0x00,0x0C, +0x21,0x30,0x20,0x02, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x19,0x00,0x02,0x24, +0x28,0x00,0x02,0x12, +0x21,0x90,0x00,0x00, +0x02,0x00,0x62,0x26, +0xFF,0x00,0x53,0x30, +0x2B,0x18,0x75,0x02, +0x0F,0x00,0x60,0x10, +0x80,0x10,0x13,0x00, +0x21,0x30,0x56,0x00, +0x00,0x00,0xD0,0x8C, +0xFF,0x00,0x02,0x24, +0x0A,0x00,0x02,0x12, +0xFE,0x00,0x02,0x24, +0xDC,0xFF,0x02,0x16, +0x32,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x00,0x62,0x26, +0xFF,0x00,0x53,0x30, +0x2B,0x18,0x75,0x02, +0xF3,0xFF,0x60,0x14, +0x80,0x10,0x13,0x00, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x01,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xCB,0x47,0x00,0x08, +0x02,0x00,0x62,0x26, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xD9,0x47,0x00,0x08, +0x02,0x00,0x62,0x26, +0x0F,0x00,0x14,0x3C, +0x21,0x20,0x00,0x02, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x85,0x36, +0x21,0x20,0x00,0x02, +0xFF,0xFF,0x85,0x36, +0xD2,0xFF,0x51,0x10, +0x21,0x30,0x20,0x02, +0x5F,0x47,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x25,0x22,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x01,0x00,0x42,0x26, +0xFF,0x00,0x52,0x30, +0x0A,0x00,0x43,0x2E, +0xF2,0xFF,0x60,0x14, +0x21,0x20,0x00,0x02, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xB8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x28,0x00,0xB2,0xAF, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x30,0x1F,0x57,0x24, +0x64,0x37,0xE3,0x96, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x05,0x3C, +0x25,0xA0,0x62,0x00, +0xF0,0xDD,0xA5,0x24, +0x24,0x00,0x84,0x26, +0x06,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0x20,0x00,0x80,0xA6, +0x10,0x52,0x00,0x0C, +0x84,0x58,0x56,0x24, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x84,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x88,0x58,0xA5,0x24, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x30,0x00,0x84,0x26, +0x20,0x00,0x83,0x96, +0x74,0x00,0xD0,0x26, +0x21,0x20,0x00,0x02, +0x03,0xFF,0x63,0x30, +0x80,0x00,0x63,0x34, +0x20,0x00,0x83,0xA6, +0x20,0x00,0x1E,0x24, +0x40,0x00,0x93,0x26, +0x17,0x4F,0x00,0x0C, +0x1C,0x00,0xBE,0xAF, +0x21,0x28,0x40,0x00, +0x21,0x20,0x60,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x1C,0x00,0xA2,0x8F, +0x21,0x20,0x00,0x02, +0x42,0x00,0x93,0x26, +0x02,0x00,0x42,0x24, +0x32,0x4F,0x00,0x0C, +0x1C,0x00,0xA2,0xAF, +0x21,0x28,0x40,0x00, +0x21,0x20,0x60,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x1C,0x00,0xA2,0x8F, +0x0C,0x00,0xC6,0x8E, +0x1C,0x00,0xB0,0x27, +0x21,0x28,0x00,0x00, +0x10,0x00,0xC7,0x26, +0x02,0x00,0x42,0x24, +0x44,0x00,0x84,0x26, +0x60,0x00,0xD1,0x26, +0x1C,0x00,0xA2,0xAF, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x20,0x02, +0x37,0x50,0x00,0x0C, +0x21,0x98,0x40,0x00, +0x09,0x00,0x52,0x2C, +0x08,0x00,0x06,0x24, +0x21,0x20,0x60,0x02, +0x0B,0x30,0x52,0x00, +0x21,0x38,0x20,0x02, +0x01,0x00,0x05,0x24, +0x21,0xA8,0x40,0x00, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x40,0x00, +0x03,0x00,0x05,0x24, +0x01,0x00,0x06,0x24, +0x48,0x00,0xC7,0x26, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x21,0x20,0x40,0x00, +0x06,0x00,0x05,0x24, +0x02,0x00,0x06,0x24, +0x18,0x00,0xA7,0x27, +0x18,0x00,0xA0,0xA7, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xA5,0x97, +0x02,0x80,0x04,0x3C, +0x68,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x98,0x40,0x00, +0x13,0x00,0x40,0x12, +0x21,0x20,0x60,0x02, +0x1C,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x20,0x00,0x42,0x24, +0x01,0x01,0x42,0x2C, +0x18,0x00,0x40,0x14, +0x21,0x20,0x80,0x02, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xF8,0xFF,0xA6,0x26, +0x68,0x00,0xC7,0x26, +0x32,0x00,0x05,0x24, +0x41,0x4F,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x20,0x00,0x42,0x24, +0x01,0x01,0x42,0x2C, +0xEA,0xFF,0x40,0x10, +0x21,0x20,0x80,0x02, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x08,0x00,0x06,0x24, +0x08,0x00,0x84,0x8E, +0x04,0x00,0x85,0x8E, +0xFF,0xDF,0x02,0x3C, +0x10,0x00,0x86,0x8E, +0x14,0x00,0x87,0x8E, +0xFF,0xFF,0x42,0x34, +0x1C,0x00,0xA8,0x8F, +0x24,0x20,0x82,0x00, +0x00,0x40,0x03,0x3C, +0xFF,0xE0,0x02,0x24, +0x24,0x28,0xA2,0x00, +0x25,0x20,0x83,0x00, +0x00,0x80,0x02,0x3C, +0xFF,0x81,0x03,0x24, +0x24,0x38,0xE3,0x00, +0x25,0x30,0xC2,0x00, +0x00,0x10,0xA5,0x34, +0x80,0x00,0x84,0x34, +0x08,0x00,0x84,0xAE, +0x00,0x00,0x88,0xA6, +0x02,0x00,0x9E,0xA2, +0x14,0x00,0x87,0xAE, +0x04,0x00,0x85,0xAE, +0x10,0x00,0x86,0xAE, +0xF8,0x36,0xE6,0x8E, +0x64,0x37,0xE5,0x8E, +0x01,0x00,0x04,0x24, +0x00,0x01,0x07,0x24, +0x01,0x00,0x02,0x24, +0x73,0x01,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0xB0,0x01,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x21,0x30,0x40,0x00, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x21,0x20,0xC0,0x00, +0x13,0x00,0xC0,0x10, +0x48,0xEA,0xA5,0x24, +0x04,0x00,0x02,0x24, +0x09,0x00,0x03,0x24, +0x0C,0x00,0xC2,0xAC, +0x14,0x00,0xC3,0xAC, +0x08,0x00,0xC5,0x94, +0xA4,0x3B,0x03,0x8E, +0x02,0x80,0x02,0x3C, +0x25,0x28,0xA2,0x00, +0x30,0x09,0x00,0x0C, +0x20,0x00,0xA3,0xAC, +0xA8,0x3B,0x06,0x8E, +0xA4,0x3B,0x05,0x8E, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x80,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x74,0xDF,0x84,0x24, +0x2F,0x55,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x02,0x00,0x82,0x90, +0x02,0x80,0x12,0x3C, +0x30,0x1F,0x51,0x26, +0xB0,0x1B,0x25,0x96, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x00,0x01,0xA3,0x30, +0x04,0x00,0x60,0x10, +0x18,0x00,0x04,0x26, +0x00,0x10,0xA2,0x30, +0x0B,0x00,0x40,0x10, +0x04,0x00,0xA2,0x30, +0x21,0x18,0x00,0x00, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xF5,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x55,0x50,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xED,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x88,0x58,0x53,0x24, +0x22,0x00,0x14,0x26, +0x21,0x20,0x80,0x02, +0x21,0x28,0x60,0x02, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xE4,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x28,0x00,0x04,0x26, +0x21,0x28,0x60,0x02, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xDE,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xE8,0xDF,0x84,0x24, +0xB0,0x1B,0x24,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x83,0x30, +0x01,0x00,0x62,0x30, +0x08,0x00,0x40,0x10, +0x00,0x20,0x62,0x30, +0x15,0x00,0x40,0x10, +0xFF,0xDE,0x82,0x30, +0xFE,0xFF,0x04,0x24, +0xB0,0x1B,0x22,0xA6, +0xD0,0x38,0x20,0xAE, +0x48,0x0E,0x00,0x0C, +0xB4,0x38,0x20,0xAE, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0x50,0x26, +0x4C,0x00,0x42,0x34, +0x00,0x00,0x40,0xA0, +0x21,0x20,0x00,0x00, +0x21,0x28,0x00,0x00, +0x12,0x0D,0x00,0x0C, +0xA1,0x3B,0x00,0xA2, +0x10,0x3E,0x00,0xAE, +0xEC,0x38,0x00,0xAE, +0x08,0x39,0x00,0xAE, +0xA3,0x51,0x00,0x0C, +0x50,0x3E,0x00,0xAE, +0xFA,0x48,0x00,0x08, +0x21,0x18,0x00,0x00, +0x76,0x0E,0x00,0x0C, +0x21,0x20,0x80,0x02, +0xBB,0xFF,0x40,0x14, +0xFF,0xFF,0x03,0x24, +0xB0,0x1B,0x22,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xFE,0x42,0x30, +0x2D,0x49,0x00,0x08, +0xB0,0x1B,0x22,0xA6, +0xD0,0xFF,0xBD,0x27, +0x20,0x00,0xB4,0xAF, +0x02,0x80,0x14,0x3C, +0x14,0x00,0xB1,0xAF, +0x28,0x00,0xBF,0xAF, +0x24,0x00,0xB5,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x91,0x26, +0xB0,0x1B,0x23,0x96, +0x00,0x00,0x00,0x00, +0x10,0x00,0x62,0x30, +0x3A,0x00,0x40,0x14, +0x00,0x01,0x62,0x30, +0x2E,0x00,0x40,0x10, +0x00,0x10,0x62,0x30, +0x29,0x00,0x40,0x14, +0x01,0x00,0x62,0x30, +0x1D,0x00,0x40,0x14, +0x04,0x00,0x62,0x30, +0x25,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x21,0x90,0x20,0x02, +0x2B,0x3D,0x55,0x24, +0x01,0x00,0x13,0x24, +0xF0,0x00,0x10,0x24, +0x65,0x49,0x00,0x08, +0x19,0x00,0x11,0x24, +0xFF,0xFF,0x31,0x26, +0x1C,0x00,0x20,0x06, +0x28,0x00,0x10,0x26, +0x21,0x18,0x12,0x02, +0xFA,0x1D,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF9,0xFF,0x53,0x14, +0x00,0x00,0x00,0x00, +0x0C,0x1E,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x33,0x00,0x40,0x10, +0x21,0x20,0x15,0x02, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0C,0x1E,0x60,0xAC, +0x00,0x60,0x82,0x40, +0x63,0x49,0x00,0x08, +0xFF,0xFF,0x31,0x26, +0xD4,0x1E,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x2F,0x00,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0xD4,0x1E,0x20,0xAE, +0x00,0x60,0x82,0x40, +0x53,0x1E,0x00,0x0C, +0x30,0x1F,0x90,0x26, +0xEC,0x38,0x02,0xAE, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xF8,0xDF,0x84,0x24, +0xB0,0x1B,0x22,0x96, +0xEC,0x38,0x20,0xAE, +0xFD,0xFF,0x04,0x24, +0xEF,0xDF,0x42,0x30, +0x48,0x0E,0x00,0x0C, +0xB0,0x1B,0x22,0xA6, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x8E,0x3E,0x42,0x92, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x42,0x24, +0x8E,0x3E,0x42,0xA2, +0x76,0x0E,0x00,0x0C, +0xFA,0x1D,0x60,0xA0, +0x63,0x49,0x00,0x08, +0xFF,0xFF,0x31,0x26, +0x2F,0x55,0x00,0x0C, +0x18,0xE0,0x84,0x24, +0xB0,0x1B,0x23,0x96, +0x25,0xB0,0x02,0x3C, +0x4C,0x00,0x42,0x34, +0xFE,0xFE,0x63,0x30, +0xB0,0x1B,0x23,0xA6, +0x21,0x20,0x00,0x00, +0x00,0x00,0x40,0xA0, +0x21,0x28,0x00,0x00, +0xA1,0x3B,0x20,0xA2, +0x12,0x0D,0x00,0x0C, +0xC2,0x1E,0x20,0xA2, +0x02,0x80,0x04,0x3C, +0x76,0x0E,0x00,0x0C, +0x88,0x58,0x84,0x24, +0x83,0x49,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xA8,0xFF,0xBD,0x27, +0x48,0x00,0xB6,0xAF, +0x3C,0x00,0xB3,0xAF, +0x38,0x00,0xB2,0xAF, +0x30,0x00,0xB0,0xAF, +0x54,0x00,0xBF,0xAF, +0x50,0x00,0xBE,0xAF, +0x4C,0x00,0xB7,0xAF, +0x44,0x00,0xB5,0xAF, +0x40,0x00,0xB4,0xAF, +0x34,0x00,0xB1,0xAF, +0x02,0x00,0x82,0x90, +0x00,0x00,0x83,0x8C, +0x21,0xB0,0x00,0x00, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x18,0x00,0x12,0x26, +0x21,0x20,0x40,0x02, +0x55,0x50,0x00,0x0C, +0xFF,0x3F,0x73,0x30, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x0B,0x00,0x40,0x14, +0x02,0x80,0x15,0x3C, +0x30,0x1F,0xB1,0x26, +0xB0,0x1B,0x23,0x96, +0x00,0x00,0x00,0x00, +0x01,0x00,0x62,0x30, +0x05,0x00,0x40,0x10, +0x00,0x10,0x62,0x30, +0x03,0x00,0x40,0x14, +0x00,0x01,0x62,0x30, +0x0E,0x00,0x40,0x10, +0x20,0x00,0xB4,0x27, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0x32,0x00,0x05,0x26, +0x21,0x20,0x80,0x02, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x20,0x00,0xA5,0x97, +0x00,0x00,0x00,0x00, +0xC2,0x00,0xA0,0x14, +0x02,0x80,0x04,0x3C, +0x21,0x20,0x80,0x02, +0x34,0x00,0x05,0x26, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x20,0x00,0xA2,0x97, +0x21,0x20,0x80,0x02, +0x30,0x00,0x05,0x26, +0xFF,0x3F,0x42,0x30, +0x02,0x00,0x06,0x24, +0x50,0x39,0x22,0xA6, +0x10,0x52,0x00,0x0C, +0x28,0x00,0xA2,0xAF, +0x20,0x00,0xA3,0x97, +0x21,0x40,0x20,0x02, +0x00,0x04,0x63,0x30, +0x02,0x00,0x60,0x14, +0x09,0x00,0x02,0x24, +0x14,0x00,0x02,0x24, +0x1E,0x00,0x5E,0x26, +0xE2,0xFF,0x74,0x26, +0x21,0x20,0xC0,0x03, +0x01,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x21,0x38,0x80,0x02, +0x55,0x1D,0x00,0x0C, +0x0C,0x3E,0x02,0xA1, +0xA8,0x00,0x40,0x10, +0x02,0x00,0x45,0x24, +0x24,0x00,0xA6,0x8F, +0x10,0x52,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x21,0x20,0xC0,0x03, +0x32,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x24,0x00,0xB7,0x8F, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x08,0x00,0x40,0x10, +0x10,0x00,0xA4,0x27, +0x24,0x00,0xA6,0x8F, +0x21,0x20,0x97,0x00, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x24,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x21,0xB8,0xE3,0x02, +0x02,0x80,0x02,0x3C, +0xEA,0x5D,0x44,0x90, +0x02,0x00,0x03,0x24, +0xE5,0x00,0x83,0x10, +0x21,0x20,0xC0,0x03, +0x30,0x1F,0xA4,0x26, +0x10,0x3E,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x22,0x00,0x40,0x10, +0x30,0x1F,0xB1,0x26, +0x02,0x80,0x02,0x3C, +0xE6,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x1D,0x00,0x60,0x14, +0x23,0x10,0xD2,0x03, +0x2B,0x10,0x53,0x00, +0x1A,0x00,0x40,0x10, +0x21,0x80,0xC0,0x03, +0x02,0x80,0x11,0x3C, +0x21,0x20,0x00,0x02, +0xDD,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x21,0x80,0x40,0x00, +0x02,0x00,0x44,0x24, +0xC8,0xDD,0x25,0x26, +0x0E,0x01,0x40,0x10, +0x06,0x00,0x06,0x24, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x01,0x40,0x10, +0x00,0x00,0x00,0x00, +0x24,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x21,0x18,0x02,0x02, +0x02,0x00,0x70,0x24, +0x23,0x20,0x12,0x02, +0x03,0x01,0x40,0x10, +0x2B,0x20,0x93,0x00, +0xEB,0xFF,0x80,0x14, +0x21,0x20,0x00,0x02, +0x30,0x1F,0xB1,0x26, +0x50,0x3E,0x22,0x8E, +0x00,0x00,0x00,0x00, +0x6A,0x00,0x40,0x14, +0x24,0x00,0xA6,0x27, +0x53,0x1E,0x00,0x0C, +0x30,0x1F,0xB2,0x26, +0x25,0xB0,0x14,0x3C, +0xB0,0x1B,0x45,0x96, +0x02,0x00,0x03,0x24, +0x4C,0x00,0x84,0x36, +0x00,0x00,0x83,0xA0, +0xEC,0x38,0x42,0xAE, +0x02,0x00,0x02,0x3C, +0x00,0x01,0xA5,0x34, +0x20,0xBF,0x42,0x34, +0x08,0x39,0x42,0xAE, +0x21,0x0E,0x00,0x0C, +0xB0,0x1B,0x45,0xA6, +0x10,0x00,0xA4,0x27, +0x7D,0x50,0x00,0x0C, +0x21,0x28,0xE0,0x02, +0x0F,0x00,0x50,0x30, +0x10,0x00,0xA4,0x27, +0x96,0x50,0x00,0x0C, +0x21,0x28,0xE0,0x02, +0x40,0x02,0x13,0x36, +0x02,0x80,0x04,0x3C, +0x21,0x88,0x40,0x00, +0x21,0x30,0x40,0x00, +0x21,0x28,0x60,0x02, +0x2F,0x55,0x00,0x0C, +0x6C,0xE0,0x84,0x24, +0x21,0x20,0x60,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x21,0x28,0xE0,0x02, +0xC2,0x50,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x21,0x88,0x40,0x00, +0x50,0x3E,0x42,0x8E, +0x00,0x00,0x00,0x00, +0x16,0x00,0x40,0x10, +0x50,0x00,0x13,0x36, +0x5B,0x3E,0x42,0x92, +0x5C,0x3E,0x43,0x92, +0x0A,0x3E,0x44,0x92, +0x00,0x13,0x02,0x00, +0x00,0x1D,0x03,0x00, +0x25,0x10,0x43,0x00, +0x04,0x00,0x03,0x24, +0xA0,0x00,0x83,0x10, +0x25,0x88,0x22,0x02, +0x54,0x3E,0x43,0x8E, +0x00,0x00,0x00,0x00, +0x07,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x58,0x3E,0x42,0x96, +0x00,0x00,0x00,0x00, +0x20,0x00,0x42,0x30, +0xA1,0x00,0x40,0x14, +0x00,0x10,0x02,0x3C, +0x01,0x00,0x02,0x24, +0x98,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x80,0xE0,0x84,0x24, +0x21,0x28,0x60,0x02, +0x21,0x38,0xC0,0x02, +0x2F,0x55,0x00,0x0C, +0x21,0x30,0x20,0x02, +0x21,0x20,0x60,0x02, +0xC1,0x5B,0x00,0x0C, +0x21,0x28,0x20,0x02, +0x30,0x1F,0xA2,0x26, +0xB0,0x1B,0x43,0x94, +0x0A,0x3E,0x44,0x90, +0xB4,0x38,0x40,0xAC, +0xFF,0xDF,0x63,0x30, +0xB0,0x1B,0x43,0xA4, +0x04,0x00,0x03,0x24, +0xD0,0x38,0x40,0xAC, +0x94,0x3E,0x40,0xAC, +0x06,0x00,0x83,0x10, +0x98,0x3E,0x40,0xAC, +0x28,0x00,0xA4,0x8F, +0x48,0x0E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE2,0x49,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x06,0x3C, +0x64,0x03,0xC6,0x34, +0x30,0x1F,0xA4,0x8E, +0x00,0x00,0xC5,0x90, +0x0F,0xFF,0x02,0x24, +0xFD,0xFF,0x03,0x24, +0x24,0x20,0x82,0x00, +0x24,0x28,0xA3,0x00, +0x30,0x1F,0xA4,0xAE, +0x00,0x00,0xC5,0xA0, +0x28,0x00,0xA4,0x8F, +0x48,0x0E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE2,0x49,0x00,0x08, +0x00,0x00,0x00,0x00, +0x2F,0x55,0x00,0x0C, +0x50,0xE0,0x84,0x24, +0xFF,0xFF,0x02,0x24, +0x99,0x4A,0x00,0x08, +0x28,0x00,0xA2,0xAF, +0x21,0x20,0xC0,0x03, +0x2D,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x91,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x24,0x00,0xAB,0x8F, +0x00,0x00,0x00,0x00, +0x1F,0x00,0x60,0x19, +0x21,0x40,0x00,0x00, +0x02,0x00,0x49,0x24, +0x21,0x50,0x20,0x02, +0x02,0x00,0x0C,0x24, +0xD5,0x4A,0x00,0x08, +0x21,0x68,0x20,0x01, +0x58,0x3E,0x82,0x90, +0x00,0x00,0x23,0x91, +0x00,0x00,0x00,0x00, +0x24,0x10,0x43,0x00, +0x58,0x3E,0x82,0xA0, +0x01,0x00,0x08,0x25, +0x2A,0x10,0x0B,0x01, +0x11,0x00,0x40,0x10, +0x01,0x00,0x29,0x25, +0xF6,0xFF,0x0C,0x15, +0x21,0x20,0x0A,0x01, +0x5A,0x3E,0x43,0x91, +0x00,0x00,0x25,0x91, +0x02,0x00,0xA2,0x91, +0x1C,0x00,0x64,0x30, +0x1C,0x00,0xA5,0x30, +0x03,0x00,0x42,0x30, +0x03,0x00,0x63,0x30, +0x2A,0x30,0x43,0x00, +0x2A,0x38,0xA4,0x00, +0x0A,0x10,0x66,0x00, +0x0A,0x20,0xA7,0x00, +0x25,0x10,0x44,0x00, +0xD1,0x4A,0x00,0x08, +0x5A,0x3E,0x42,0xA1, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x43,0x90, +0x02,0x80,0x02,0x3C, +0x3C,0xE3,0x47,0x24, +0x10,0x00,0x65,0x30, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x4C,0xE3,0x66,0x24, +0x30,0x1F,0x44,0x24, +0xF8,0x4A,0x00,0x08, +0x21,0x40,0x00,0x00, +0x00,0x00,0x43,0x90, +0x5B,0x3E,0x82,0x90, +0x01,0x00,0x08,0x25, +0x24,0x10,0x43,0x00, +0x5B,0x3E,0x82,0xA0, +0x10,0x00,0x02,0x29, +0x07,0x00,0x40,0x10, +0x01,0x00,0x84,0x24, +0x21,0x10,0x07,0x01, +0xF6,0xFF,0xA0,0x14, +0x21,0x18,0x06,0x01, +0x00,0x00,0x63,0x90, +0xF1,0x4A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x20,0xC0,0x03, +0x21,0x38,0x80,0x02, +0x3D,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x24,0x00,0xA6,0x27, +0x48,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x24,0x00,0xA6,0x8F, +0x02,0x80,0x04,0x3C, +0xA8,0x5D,0x84,0x24, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0x90,0x0D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x54,0x4A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x2A,0x00,0x05,0x24, +0x24,0x00,0xA6,0x27, +0x55,0x1D,0x00,0x0C, +0x21,0x38,0x80,0x02, +0x30,0x00,0x40,0x10, +0x30,0x1F,0xA5,0x26, +0x02,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x2B,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x44,0x90, +0x01,0x00,0x03,0x24, +0x3E,0x00,0x83,0x10, +0x30,0x1F,0xA2,0x26, +0x10,0x23,0x43,0x8C, +0xFF,0xEF,0x04,0x24, +0x00,0x08,0x63,0x34, +0x24,0x18,0x64,0x00, +0x2A,0x4A,0x00,0x08, +0x10,0x23,0x43,0xAC, +0xF6,0x01,0x82,0x36, +0x00,0x00,0x40,0xA4, +0x91,0x4A,0x00,0x08, +0x02,0x80,0x04,0x3C, +0x58,0x3E,0x42,0x96, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x30, +0x66,0xFF,0x40,0x10, +0x02,0x80,0x04,0x3C, +0x00,0x10,0x02,0x3C, +0x25,0x88,0x22,0x02, +0x0F,0x00,0x08,0x24, +0x01,0x00,0x03,0x24, +0x0C,0x00,0x02,0x25, +0x04,0x10,0x43,0x00, +0x24,0x10,0x51,0x00, +0x16,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x08,0x25, +0xFA,0xFF,0x01,0x05, +0x0C,0x00,0x02,0x25, +0x00,0x12,0x16,0x00, +0x00,0x1B,0x16,0x00, +0x25,0x18,0x62,0x00, +0x00,0x21,0x16,0x00, +0x25,0x18,0x64,0x00, +0x25,0xB0,0x02,0x3C, +0x25,0x18,0x76,0x00, +0xF6,0x01,0x42,0x34, +0x00,0x00,0x43,0xA4, +0x91,0x4A,0x00,0x08, +0x02,0x80,0x04,0x3C, +0x10,0x23,0xA2,0x8C, +0xFF,0xF7,0x03,0x24, +0xFF,0xEF,0x04,0x24, +0x24,0x10,0x43,0x00, +0x24,0x10,0x44,0x00, +0x2A,0x4A,0x00,0x08, +0x10,0x23,0xA2,0xAC, +0x38,0x4B,0x00,0x08, +0xFF,0x00,0x16,0x31, +0x30,0x1F,0xA2,0x26, +0x54,0x4A,0x00,0x08, +0x50,0x3E,0x40,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x4F,0x4A,0x00,0x08, +0x10,0x3E,0x40,0xAC, +0x54,0x4A,0x00,0x08, +0x50,0x3E,0x20,0xAE, +0x21,0x20,0x00,0x02, +0x78,0x0F,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x50,0x4A,0x00,0x08, +0x30,0x1F,0xB1,0x26, +0x10,0x23,0x43,0x8C, +0xFF,0xF7,0x04,0x24, +0x24,0x18,0x64,0x00, +0x00,0x10,0x63,0x34, +0x2A,0x4A,0x00,0x08, +0x10,0x23,0x43,0xAC, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x02,0x00,0x82,0x90, +0x02,0x80,0x03,0x3C, +0xE0,0x3A,0x65,0x94, +0x0F,0x00,0x42,0x30, +0x00,0x00,0x83,0x8C, +0xC0,0x10,0x02,0x00, +0x21,0x20,0x44,0x00, +0x00,0x10,0xA8,0x30, +0x02,0x80,0x02,0x3C, +0x00,0x08,0xA5,0x30, +0x84,0x58,0x51,0x24, +0xFF,0x3F,0x63,0x30, +0x06,0x00,0xA0,0x10, +0x18,0x00,0x90,0x24, +0xE8,0xFF,0x67,0x24, +0x30,0x00,0x84,0x24, +0x21,0x28,0x00,0x00, +0x07,0x00,0x00,0x11, +0x10,0x00,0xA6,0x27, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x55,0x1D,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF7,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x44,0x24, +0x10,0x00,0xA2,0x8F, +0x00,0x00,0x00,0x00, +0x06,0x00,0x40,0x10, +0x10,0x00,0x25,0x26, +0x0C,0x00,0x26,0x8E, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xED,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x42,0x50,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x01,0x10,0x00,0x0C, +0x21,0x20,0x40,0x00, +0x77,0x4B,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xE5,0x48,0x00,0x0C, +0xFE,0xFF,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xE5,0x48,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x01,0x80,0x02,0x3C, +0xB0,0x03,0x65,0x34, +0x8C,0x2E,0x42,0x24, +0x18,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x00,0x00,0xA4,0xAC, +0x00,0x00,0x83,0x8C, +0x21,0x10,0x00,0x00, +0xFF,0x3F,0x63,0x30, +0x00,0x00,0xA3,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x30,0x1F,0x50,0x24, +0x70,0x3D,0x03,0x8E, +0xFE,0xFF,0x04,0x24, +0x01,0x00,0x63,0x24, +0x05,0x00,0x62,0x2C, +0x12,0x00,0x40,0x10, +0x70,0x3D,0x03,0xAE, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x30, +0x05,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xA5,0x12,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xC8,0x00,0x03,0x24, +0xD0,0x38,0x03,0xAE, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xDF,0x42,0x30, +0x48,0x0E,0x00,0x0C, +0xB0,0x1B,0x02,0xA6, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x2C,0x00,0xBF,0xAF, +0x02,0x00,0x82,0x90, +0x02,0x80,0x14,0x3C, +0x30,0x1F,0x92,0x26, +0xB0,0x1B,0x43,0x96, +0x00,0x00,0x85,0x8C, +0x0F,0x00,0x42,0x30, +0xC0,0x10,0x02,0x00, +0x21,0x80,0x44,0x00, +0x01,0x00,0x63,0x30, +0xFF,0x3F,0xB3,0x30, +0x18,0x00,0x11,0x26, +0x0A,0x00,0x60,0x14, +0x21,0x20,0x00,0x00, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x55,0x50,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x02,0x80,0x04,0x3C, +0x18,0x3B,0x84,0x24, +0x21,0x28,0x40,0x00, +0x39,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xEF,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0xB0,0x1B,0x42,0x96, +0x00,0x00,0x00,0x00, +0x00,0x10,0x42,0x30, +0xEA,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x18,0x00,0x03,0x96, +0x04,0x00,0x04,0x24, +0x21,0x10,0x80,0x00, +0x00,0x40,0x63,0x30, +0x0A,0x10,0x03,0x00, +0x21,0x10,0x22,0x02, +0x1C,0x00,0x43,0x94, +0x1A,0x00,0x45,0x94, +0x2F,0x00,0x60,0x14, +0x02,0x00,0x02,0x24, +0x14,0x00,0xA2,0x10, +0x01,0x00,0x02,0x24, +0x0E,0x00,0xA4,0x14, +0x02,0x80,0x04,0x3C, +0x78,0x3D,0x43,0x8E, +0x00,0x00,0x00,0x00, +0x06,0x00,0x62,0x10, +0x30,0x1F,0x83,0x26, +0xB0,0x1B,0x62,0x94, +0xFF,0xFF,0x04,0x24, +0xFF,0xDF,0x42,0x30, +0xE9,0x4B,0x00,0x08, +0xB0,0x1B,0x62,0xA4, +0x84,0x14,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE9,0x4B,0x00,0x08, +0x21,0x20,0x00,0x00, +0x2F,0x55,0x00,0x0C, +0xEC,0xE1,0x84,0x24, +0x12,0x4C,0x00,0x08, +0x30,0x1F,0x83,0x26, +0x78,0x3D,0x43,0x8E, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x62,0x14, +0xE2,0xFF,0x67,0x26, +0x36,0x00,0x04,0x26, +0x10,0x00,0x05,0x24, +0x55,0x1D,0x00,0x0C, +0x10,0x00,0xA6,0x27, +0x16,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0xA6,0x8F, +0x02,0x80,0x04,0x3C, +0xB8,0x5C,0x84,0x24, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x45,0x24, +0xB0,0x1B,0x43,0x96, +0x21,0x20,0x00,0x00, +0x03,0x00,0x02,0x24, +0xDF,0xFF,0x63,0x30, +0x40,0x00,0x63,0x34, +0xB0,0x1B,0x43,0xA6, +0xBC,0x15,0x00,0x0C, +0x74,0x3D,0x42,0xAE, +0xE9,0x4B,0x00,0x08, +0x21,0x20,0x00,0x00, +0x02,0x80,0x04,0x3C, +0xBC,0xE1,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x21,0x28,0x60,0x00, +0x12,0x4C,0x00,0x08, +0x30,0x1F,0x83,0x26, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xD8,0xE1,0x84,0x24, +0x12,0x4C,0x00,0x08, +0x30,0x1F,0x83,0x26, +0xE8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x30,0x1F,0x50,0x24, +0x6C,0x3D,0x03,0x8E, +0xFF,0xFF,0x04,0x24, +0x01,0x00,0x63,0x24, +0x05,0x00,0x62,0x2C, +0x16,0x00,0x40,0x10, +0x6C,0x3D,0x03,0xAE, +0xB0,0x1B,0x03,0x96, +0xBF,0xFF,0x02,0x24, +0x21,0x20,0x00,0x00, +0x24,0x10,0x62,0x00, +0x80,0x00,0x63,0x30, +0x05,0x00,0x60,0x10, +0x20,0x00,0x45,0x34, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x01,0x00,0x02,0x24, +0x74,0x3D,0x02,0xAE, +0xBC,0x15,0x00,0x0C, +0xB0,0x1B,0x05,0xA6, +0xC8,0x00,0x03,0x24, +0xB4,0x38,0x03,0xAE, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xB0,0x1B,0x02,0x96, +0x00,0x00,0x00,0x00, +0xFF,0xDF,0x42,0x30, +0x48,0x0E,0x00,0x0C, +0xB0,0x1B,0x02,0xA6, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x21,0x90,0x80,0x00, +0x00,0x01,0x04,0x24, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x21,0x98,0xA0,0x00, +0x28,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x21,0x88,0x40,0x00, +0x20,0xE2,0x84,0x24, +0x37,0x00,0x40,0x10, +0x04,0xEB,0xA5,0x24, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x40,0x02, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x04,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x05,0x3C, +0x03,0xFF,0x63,0x30, +0xC0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0xA5,0x24, +0x0C,0x00,0x22,0xAE, +0xF8,0x1D,0xA3,0x94, +0x20,0x00,0x07,0x26, +0x38,0x00,0x04,0x26, +0xFF,0x0F,0x62,0x30, +0x00,0x11,0x02,0x00, +0x02,0x32,0x02,0x00, +0x01,0x00,0x63,0x24, +0xF8,0x1D,0xA3,0xA4, +0x17,0x00,0xE6,0xA0, +0x16,0x00,0xE2,0xA0, +0x10,0x00,0xA6,0x27, +0x0C,0x00,0x27,0x26, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x10,0x00,0xB3,0xA7, +0x21,0x20,0x20,0x02, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x14,0xE2,0x84,0x24, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x21,0x90,0x80,0x00, +0x00,0x01,0x04,0x24, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x21,0x98,0xA0,0x00, +0x28,0x00,0xBF,0xAF, +0x25,0x24,0x00,0x0C, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x21,0x88,0x40,0x00, +0x3C,0xE2,0x84,0x24, +0x37,0x00,0x40,0x10, +0x14,0xEB,0xA5,0x24, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x40,0x02, +0x25,0x80,0x02,0x02, +0x24,0x00,0x04,0x26, +0x20,0x00,0x00,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x04,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x04,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x03,0x96, +0x18,0x00,0x02,0x24, +0x02,0x80,0x05,0x3C, +0x03,0xFF,0x63,0x30, +0xA0,0x00,0x63,0x34, +0x20,0x00,0x03,0xA6, +0x30,0x1F,0xA5,0x24, +0x0C,0x00,0x22,0xAE, +0xF8,0x1D,0xA3,0x94, +0x20,0x00,0x07,0x26, +0x38,0x00,0x04,0x26, +0xFF,0x0F,0x62,0x30, +0x00,0x11,0x02,0x00, +0x02,0x32,0x02,0x00, +0x01,0x00,0x63,0x24, +0xF8,0x1D,0xA3,0xA4, +0x17,0x00,0xE6,0xA0, +0x16,0x00,0xE2,0xA0, +0x10,0x00,0xA6,0x27, +0x0C,0x00,0x27,0x26, +0x02,0x00,0x05,0x24, +0x68,0x4F,0x00,0x0C, +0x10,0x00,0xB3,0xA7, +0x21,0x20,0x20,0x02, +0x21,0x28,0x00,0x00, +0xB9,0x0C,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x30,0xE2,0x84,0x24, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x2C,0x00,0xB1,0xAF, +0xFF,0xFF,0x05,0x24, +0x21,0x88,0x80,0x00, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA4,0x27, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB2,0xAF, +0x08,0x52,0x00,0x0C, +0x28,0x00,0xB0,0xAF, +0x08,0x00,0x30,0x96, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x00,0x00, +0x25,0x80,0x02,0x02, +0x21,0x20,0x00,0x02, +0x08,0x52,0x00,0x0C, +0x10,0x00,0x06,0x24, +0x20,0x00,0x02,0x96, +0x24,0x00,0x04,0x26, +0x10,0x00,0xA5,0x27, +0x03,0xFF,0x42,0x30, +0xC8,0x00,0x42,0x34, +0x20,0x00,0x02,0xA6, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x25,0xB0,0x03,0x3C, +0x50,0x00,0x62,0x34, +0x00,0x00,0x44,0x8C, +0x54,0x00,0x65,0x34, +0x58,0x00,0x66,0x34, +0x18,0x00,0xA4,0xAF, +0x00,0x00,0xA2,0x8C, +0x5C,0x00,0x63,0x34, +0x2A,0x00,0x04,0x26, +0x1C,0x00,0xA2,0xAF, +0x00,0x00,0xC7,0x8C, +0x18,0x00,0xA5,0x27, +0x06,0x00,0x06,0x24, +0x20,0x00,0xA7,0xAF, +0x00,0x00,0x62,0x8C, +0x1A,0x00,0x12,0x24, +0x10,0x52,0x00,0x0C, +0x24,0x00,0xA2,0xAF, +0x30,0x00,0x04,0x26, +0x20,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x13,0x00,0x03,0x24, +0x14,0x00,0x23,0xAE, +0x0C,0x00,0x32,0xAE, +0x08,0x00,0x05,0x8E, +0x04,0x00,0x04,0x8E, +0xFF,0xDF,0x02,0x3C, +0x14,0x00,0x06,0x8E, +0xFF,0xFF,0x42,0x34, +0x10,0x00,0x07,0x8E, +0xFF,0xE0,0x03,0x24, +0x24,0x28,0xA2,0x00, +0x00,0x40,0x02,0x3C, +0x24,0x20,0x83,0x00, +0x25,0x28,0xA2,0x00, +0xFF,0x81,0x03,0x24, +0xFE,0xFF,0x02,0x3C, +0x24,0x30,0xC3,0x00, +0xFF,0xFF,0x42,0x34, +0x00,0x12,0x84,0x34, +0x00,0x80,0x03,0x3C, +0x24,0x20,0x82,0x00, +0x25,0x38,0xE3,0x00, +0x00,0x26,0xC6,0x34, +0x80,0x00,0xA5,0x34, +0x20,0x00,0x02,0x24, +0x00,0x00,0x12,0xA6, +0x10,0x00,0x07,0xAE, +0x02,0x00,0x02,0xA2, +0x14,0x00,0x06,0xAE, +0x04,0x00,0x04,0xAE, +0x08,0x00,0x05,0xAE, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x1C,0x00,0xB1,0xAF, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x11,0x3C, +0x18,0x03,0x23,0x36, +0x80,0x35,0x42,0x24, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x21,0xA0,0x80,0x00, +0x48,0x00,0xB2,0x93, +0xFF,0x00,0xE4,0x30, +0x00,0x00,0x62,0xAC, +0x24,0x00,0xB3,0xAF, +0x18,0x00,0xB0,0xAF, +0x30,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0xFF,0x00,0xB3,0x30, +0x0D,0x24,0x00,0x0C, +0xFF,0x00,0xD0,0x30, +0x66,0x00,0x40,0x10, +0x10,0x00,0xA2,0xAF, +0x08,0x00,0x44,0x8C, +0xB0,0x03,0x22,0x36, +0x00,0x00,0x44,0xAC, +0x10,0x00,0xA3,0x8F, +0x02,0x80,0x02,0x3C, +0x08,0x00,0x64,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x82,0x00, +0x41,0x00,0x40,0x16, +0x20,0x00,0x24,0x26, +0x48,0x00,0x02,0x24, +0x43,0x00,0x02,0x12, +0x20,0x00,0x30,0xA6, +0x04,0x00,0x02,0x24, +0x47,0x00,0x62,0x16, +0x21,0x28,0x80,0x02, +0xA4,0x00,0x02,0x24, +0x61,0x00,0x02,0x12, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA2,0x8F, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x10,0x36, +0x0C,0x00,0x55,0xAC, +0x10,0x00,0xA2,0x8F, +0x12,0x00,0x03,0x24, +0x21,0x28,0x00,0x00, +0x14,0x00,0x43,0xAC, +0x00,0x00,0x15,0xAE, +0x10,0x00,0xA2,0x8F, +0x08,0x00,0x06,0x24, +0x08,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0xAE, +0x10,0x00,0xA2,0x8F, +0x02,0x80,0x03,0x3C, +0x08,0x00,0x44,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x83,0x00, +0x08,0x52,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x14,0x00,0x25,0x8E, +0x08,0x00,0x24,0x8E, +0xFF,0xDF,0x02,0x3C, +0xFF,0x81,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x24,0x28,0xA3,0x00, +0x24,0x20,0x82,0x00, +0x00,0x40,0x03,0x3C, +0x25,0x20,0x83,0x00, +0x20,0x00,0x02,0x24, +0x00,0x24,0xA5,0x34, +0x00,0x00,0x35,0xA6, +0x02,0x00,0x22,0xA2, +0x08,0x00,0x24,0xAE, +0x14,0x00,0x25,0xAE, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xA3,0x8F, +0x74,0x57,0x42,0x24, +0x04,0x00,0x44,0x8C, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x10,0x00,0xA2,0x27, +0x00,0x00,0x83,0xAC, +0x04,0x00,0x64,0xAC, +0x30,0x00,0xBF,0x8F, +0x00,0x00,0x02,0xAE, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x00,0x10,0x02,0x36, +0x20,0x00,0x22,0xA6, +0x48,0x00,0x02,0x24, +0xC0,0xFF,0x02,0x16, +0x04,0x00,0x02,0x24, +0x20,0x00,0x22,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x42,0x34, +0x20,0x00,0x22,0xA6, +0x04,0x00,0x02,0x24, +0xBB,0xFF,0x62,0x12, +0x21,0x28,0x80,0x02, +0x24,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x24,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x88,0x4D,0x00,0x08, +0x18,0x00,0x15,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x4C,0xE2,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x24,0xEB,0xA5,0x24, +0x30,0x00,0xBF,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x80,0x58,0x43,0x94, +0x02,0x80,0x05,0x3C, +0x88,0x58,0xA5,0x24, +0x00,0xC0,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x02,0x12,0x03,0x00, +0x02,0x00,0x83,0xA0, +0x03,0x00,0x82,0xA0, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0x24,0x00,0x24,0x26, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x24,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x88,0x4D,0x00,0x08, +0x18,0x00,0x15,0x24, +0xB0,0xFF,0xBD,0x27, +0x3C,0x00,0xB5,0xAF, +0x38,0x00,0xB4,0xAF, +0xFF,0xFF,0xF5,0x30, +0x25,0xB0,0x14,0x3C, +0x01,0x80,0x02,0x3C, +0x2C,0x00,0xB1,0xAF, +0x18,0x03,0x83,0x36, +0xE8,0x37,0x42,0x24, +0x20,0x00,0xB1,0x26, +0x44,0x00,0xB7,0xAF, +0x34,0x00,0xB3,0xAF, +0x21,0xB8,0x80,0x00, +0x60,0x00,0xB3,0x93, +0x21,0x20,0x20,0x02, +0x00,0x00,0x62,0xAC, +0x40,0x00,0xB6,0xAF, +0x30,0x00,0xB2,0xAF, +0x48,0x00,0xBF,0xAF, +0x28,0x00,0xB0,0xAF, +0xFF,0x00,0xB6,0x30, +0x25,0x24,0x00,0x0C, +0xFF,0x00,0xD2,0x30, +0x11,0x00,0x40,0x14, +0x20,0x00,0xA2,0xAF, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x58,0xE2,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x30,0xEB,0xA5,0x24, +0x48,0x00,0xBF,0x8F, +0x44,0x00,0xB7,0x8F, +0x40,0x00,0xB6,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x50,0x00,0xBD,0x27, +0x08,0x00,0x43,0x8C, +0xB0,0x03,0x82,0x36, +0x02,0x80,0x10,0x3C, +0x00,0x00,0x43,0xAC, +0x20,0x00,0xA2,0x8F, +0x21,0x30,0x20,0x02, +0x21,0x28,0x00,0x00, +0x08,0x00,0x44,0x94, +0xFF,0x51,0x00,0x0C, +0x25,0x20,0x90,0x00, +0x20,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x50,0x00, +0x51,0x00,0x60,0x16, +0x20,0x00,0x30,0x26, +0x20,0x00,0x32,0xA6, +0x48,0x00,0x02,0x24, +0x6C,0x00,0x42,0x12, +0x50,0x00,0x82,0x36, +0x04,0x00,0x02,0x24, +0x4D,0x00,0xC2,0x16, +0x21,0x28,0xE0,0x02, +0xA4,0x00,0x02,0x24, +0x7E,0x00,0x42,0x12, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xA2,0x8F, +0x25,0xB0,0x10,0x3C, +0xB0,0x03,0x10,0x36, +0x0C,0x00,0x55,0xAC, +0x20,0x00,0xA2,0x8F, +0x12,0x00,0x03,0x24, +0x21,0x28,0x00,0x00, +0x14,0x00,0x43,0xAC, +0x00,0x00,0x15,0xAE, +0x20,0x00,0xA2,0x8F, +0x08,0x00,0x06,0x24, +0x08,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x03,0xAE, +0x20,0x00,0xA2,0x8F, +0x02,0x80,0x03,0x3C, +0x08,0x00,0x44,0x94, +0x00,0x00,0x00,0x00, +0x25,0x88,0x83,0x00, +0x08,0x52,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x04,0x00,0x25,0x8E, +0x08,0x00,0x26,0x8E, +0x14,0x00,0x27,0x8E, +0x10,0x00,0x24,0x8E, +0xFF,0xE0,0x03,0x24, +0xFF,0xDF,0x02,0x3C, +0x24,0x28,0xA3,0x00, +0xFF,0xFF,0x42,0x34, +0xFF,0x81,0x03,0x24, +0x24,0x38,0xE3,0x00, +0x24,0x30,0xC2,0x00, +0x00,0x80,0x03,0x3C, +0x00,0x40,0x02,0x3C, +0x25,0x30,0xC2,0x00, +0x25,0x20,0x83,0x00, +0x00,0x12,0xA5,0x34, +0x20,0x00,0x02,0x24, +0x10,0x00,0x24,0xAE, +0x00,0x00,0x35,0xA6, +0x02,0x00,0x22,0xA2, +0x04,0x00,0x25,0xAE, +0x14,0x00,0x27,0xAE, +0x08,0x00,0x26,0xAE, +0x00,0x60,0x05,0x40, +0x01,0x00,0xA1,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xA3,0x8F, +0x74,0x57,0x42,0x24, +0x04,0x00,0x44,0x8C, +0x00,0x00,0x62,0xAC, +0x04,0x00,0x43,0xAC, +0x20,0x00,0xA2,0x27, +0x00,0x00,0x83,0xAC, +0x04,0x00,0x64,0xAC, +0x00,0x00,0x02,0xAE, +0x00,0x60,0x85,0x40, +0x48,0x00,0xBF,0x8F, +0x44,0x00,0xB7,0x8F, +0x40,0x00,0xB6,0x8F, +0x3C,0x00,0xB5,0x8F, +0x38,0x00,0xB4,0x8F, +0x34,0x00,0xB3,0x8F, +0x30,0x00,0xB2,0x8F, +0x2C,0x00,0xB1,0x8F, +0x28,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x50,0x00,0xBD,0x27, +0x00,0x10,0x42,0x36, +0x35,0x4E,0x00,0x08, +0x20,0x00,0x22,0xA6, +0x24,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x18,0x3B,0xA5,0x24, +0x2A,0x00,0x24,0x26, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x00,0x24,0x26, +0x88,0x58,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xF8,0x1D,0xA6,0x94, +0x00,0x00,0x00,0x00, +0x01,0x00,0xC2,0x24, +0x00,0x21,0x06,0x00, +0xFF,0xFF,0x46,0x30, +0xFF,0xFF,0x84,0x30, +0x00,0x10,0xC2,0x2C, +0x0A,0x30,0x02,0x00, +0x02,0x1A,0x04,0x00, +0x17,0x00,0x03,0xA2, +0x16,0x00,0x04,0xA2, +0x3E,0x4E,0x00,0x08, +0xF8,0x1D,0xA6,0xA4, +0x00,0x00,0x43,0x8C, +0x54,0x00,0x84,0x36, +0x58,0x00,0x85,0x36, +0x10,0x00,0xA3,0xAF, +0x00,0x00,0x82,0x8C, +0x5C,0x00,0x87,0x36, +0x2A,0x00,0x24,0x26, +0x14,0x00,0xA2,0xAF, +0x00,0x00,0xA3,0x8C, +0x06,0x00,0x06,0x24, +0x10,0x00,0xA5,0x27, +0x18,0x00,0xA3,0xAF, +0x00,0x00,0xE2,0x8C, +0x10,0x52,0x00,0x0C, +0x1C,0x00,0xA2,0xAF, +0x30,0x00,0x24,0x26, +0x18,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x20,0x00,0x23,0x96, +0x00,0x00,0x00,0x00, +0x00,0x01,0x63,0x34, +0x38,0x4E,0x00,0x08, +0x20,0x00,0x23,0xA6, +0x80,0x58,0x43,0x94, +0x02,0x80,0x05,0x3C, +0x24,0x00,0x24,0x26, +0x00,0xC0,0x63,0x24, +0xFF,0xFF,0x63,0x30, +0x02,0x12,0x03,0x00, +0x88,0x58,0xA5,0x24, +0x03,0x00,0x02,0xA2, +0x02,0x00,0x03,0xA2, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x02,0x80,0x05,0x3C, +0x2A,0x00,0x24,0x26, +0x18,0x3B,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x3E,0x4E,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0xFF,0x00,0x90,0x30, +0x02,0x80,0x04,0x3C, +0x21,0x28,0x00,0x02, +0x1C,0x00,0xBF,0xAF, +0x2F,0x55,0x00,0x0C, +0x64,0xE2,0x84,0x24, +0x02,0x80,0x04,0x3C, +0x88,0x58,0x84,0x24, +0x08,0x00,0x05,0x24, +0x48,0x00,0x06,0x24, +0x18,0x00,0x07,0x24, +0xFA,0x4D,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x01,0x00,0x02,0x24, +0x21,0x28,0x00,0x00, +0x90,0x00,0x06,0x24, +0x21,0x38,0x00,0x00, +0x18,0x00,0xBF,0xAF, +0x60,0x4D,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xB0,0xAF, +0xFF,0xFF,0x05,0x24, +0xFF,0x00,0x90,0x30, +0x02,0x00,0x06,0x24, +0x24,0x00,0xBF,0xAF, +0x08,0x52,0x00,0x0C, +0x18,0x00,0xA4,0x27, +0x18,0x00,0xA4,0x27, +0x08,0x00,0x05,0x24, +0xC8,0x00,0x06,0x24, +0x21,0x38,0x00,0x00, +0x60,0x4D,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x05,0x3C, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB0,0xAF, +0x30,0x1F,0xA5,0x24, +0x50,0x39,0xA2,0x94, +0x01,0x00,0x03,0x24, +0xFF,0x00,0x90,0x30, +0x00,0xC0,0x42,0x24, +0xFF,0xFF,0x44,0x30, +0xC2,0x34,0x00,0x0C, +0x2A,0x1C,0xA3,0xA0, +0x02,0x80,0x04,0x3C, +0x88,0x58,0x84,0x24, +0x04,0x00,0x05,0x24, +0xA4,0x00,0x06,0x24, +0x10,0x00,0x07,0x24, +0xFA,0x4D,0x00,0x0C, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x08,0x00,0x82,0x24, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x17,0x4F,0x00,0x0C, +0x74,0x00,0x84,0x24, +0x21,0x28,0x40,0x00, +0x10,0x00,0xA4,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA2,0x97, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x17,0x4F,0x00,0x0C, +0x10,0x00,0xA5,0xA7, +0x21,0x20,0x40,0x00, +0x10,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x0A,0x00,0x82,0x24, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x32,0x4F,0x00,0x0C, +0x74,0x00,0x84,0x24, +0x21,0x28,0x40,0x00, +0x10,0x00,0xA4,0x27, +0x10,0x52,0x00,0x0C, +0x02,0x00,0x06,0x24, +0x10,0x00,0xA2,0x97, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0x80,0x00, +0x00,0x00,0x05,0xA2, +0x01,0x00,0x06,0xA2, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x88,0xC0,0x00, +0x02,0x00,0x84,0x24, +0x30,0x00,0xB2,0x8F, +0x0D,0x00,0xC0,0x14, +0x21,0x28,0xE0,0x00, +0x00,0x00,0x43,0x8E, +0x21,0x10,0x11,0x02, +0x1C,0x00,0xBF,0x8F, +0x21,0x18,0x71,0x00, +0x02,0x00,0x63,0x24, +0x00,0x00,0x43,0xAE, +0x14,0x00,0xB1,0x8F, +0x18,0x00,0xB2,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x00,0x42,0x24, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x10,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x00,0x43,0x8E, +0x21,0x10,0x11,0x02, +0x1C,0x00,0xBF,0x8F, +0x21,0x18,0x71,0x00, +0x02,0x00,0x63,0x24, +0x00,0x00,0x43,0xAE, +0x14,0x00,0xB1,0x8F, +0x18,0x00,0xB2,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x00,0x42,0x24, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0xA0,0x00, +0x18,0x00,0xB2,0xAF, +0x21,0x28,0xC0,0x00, +0x21,0x90,0xE0,0x00, +0x21,0x30,0x00,0x02, +0x1C,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x52,0x00,0x0C, +0x21,0x88,0x80,0x00, +0x00,0x00,0x43,0x8E, +0x21,0x10,0x30,0x02, +0x1C,0x00,0xBF,0x8F, +0x21,0x18,0x70,0x00, +0x00,0x00,0x43,0xAE, +0x14,0x00,0xB1,0x8F, +0x18,0x00,0xB2,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x7F,0x00,0x84,0x30, +0x6D,0x00,0x82,0x2C, +0x0A,0x00,0x40,0x10, +0x21,0x28,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0x58,0xEB,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x21,0x28,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x0B,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x0A,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x09,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x08,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x07,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x06,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x03,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x05,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x04,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x02,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x01,0x00,0x05,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x7F,0x00,0x84,0x30, +0x0C,0x00,0x82,0x2C, +0x0A,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x04,0x00, +0x0C,0xED,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x6C,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x60,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x48,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x30,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x24,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x18,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x12,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x0C,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x16,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x0B,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x04,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x02,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xC8,0xFF,0xBD,0x27, +0x24,0x00,0xB5,0xAF, +0x02,0x80,0x15,0x3C, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x30,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0xB8,0x80,0x00, +0x21,0xA0,0x00,0x00, +0x21,0x98,0x00,0x00, +0x30,0x1F,0xB6,0x26, +0x30,0x1F,0xA2,0x26, +0x21,0x10,0x62,0x02, +0xFB,0x1B,0x51,0x90, +0xFE,0x00,0x03,0x24, +0x1E,0x00,0x23,0x12, +0xFF,0x00,0x02,0x24, +0x21,0x00,0x22,0x12, +0x21,0x10,0x80,0x02, +0xAD,0x4F,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x88,0x40,0x00, +0x21,0x80,0x00,0x00, +0x21,0x90,0xC0,0x02, +0x21,0x10,0x12,0x02, +0xEE,0x1B,0x44,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x82,0x24, +0xFF,0x00,0x42,0x30, +0x02,0x00,0x42,0x2C, +0x05,0x00,0x40,0x14, +0x01,0x00,0x10,0x26, +0xAD,0x4F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x51,0x10, +0x01,0x00,0x03,0x24, +0x0D,0x00,0x02,0x2A, +0xF3,0xFF,0x40,0x14, +0x21,0x10,0x12,0x02, +0x21,0x18,0x00,0x00, +0x01,0x00,0x02,0x24, +0x14,0x00,0x62,0x10, +0xFF,0x00,0x22,0x32, +0x21,0x10,0xF4,0x02, +0x00,0x00,0x51,0xA0, +0x01,0x00,0x94,0x26, +0x01,0x00,0x73,0x26, +0x0D,0x00,0x62,0x2A, +0xDB,0xFF,0x40,0x14, +0x30,0x1F,0xA2,0x26, +0x21,0x10,0x80,0x02, +0x30,0x00,0xBF,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x0C,0x50,0x00,0x08, +0x80,0x00,0x51,0x34, +0xD0,0xFF,0xBD,0x27, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x21,0x88,0x80,0x00, +0x21,0x80,0xA0,0x00, +0x0D,0x00,0x06,0x24, +0x21,0x28,0x00,0x00, +0x28,0x00,0xBF,0xAF, +0xFF,0x51,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0xDD,0x4F,0x00,0x0C, +0x10,0x00,0xA4,0x27, +0x00,0x00,0x02,0xAE, +0x21,0x20,0x20,0x02, +0x10,0x00,0xA5,0x27, +0x10,0x52,0x00,0x0C, +0x21,0x30,0x40,0x00, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x21,0x28,0x00,0x00, +0x21,0x10,0x85,0x00, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x60,0x10, +0x0D,0x00,0xA2,0x2C, +0xFA,0xFF,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xFF,0xFF,0xA5,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x00,0x00,0x82,0x94, +0x21,0x30,0x80,0x00, +0x10,0x00,0x85,0x24, +0x42,0x1A,0x02,0x00, +0xC2,0x11,0x02,0x00, +0x02,0x00,0x42,0x30, +0x01,0x00,0x63,0x30, +0x25,0x18,0x43,0x00, +0x01,0x00,0x04,0x24, +0x07,0x00,0x64,0x10, +0x00,0x00,0x00,0x00, +0x05,0x00,0x60,0x10, +0x0A,0x00,0xC5,0x24, +0x02,0x00,0x02,0x24, +0x02,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x18,0x00,0xC5,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x00,0x00,0x82,0x94, +0x21,0x30,0x80,0x00, +0x04,0x00,0x85,0x24, +0x42,0x1A,0x02,0x00, +0xC2,0x11,0x02,0x00, +0x02,0x00,0x42,0x30, +0x01,0x00,0x63,0x30, +0x25,0x18,0x43,0x00, +0x01,0x00,0x04,0x24, +0x04,0x00,0x64,0x10, +0x00,0x00,0x00,0x00, +0x02,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0xC5,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xA0,0x00, +0x13,0x00,0xA0,0x18, +0x21,0x30,0x00,0x00, +0x02,0x00,0x07,0x24, +0x04,0x00,0x08,0x24, +0x0B,0x00,0x09,0x24, +0x16,0x00,0x0A,0x24, +0x21,0x10,0x86,0x00, +0x00,0x00,0x43,0x90, +0x01,0x00,0xC6,0x24, +0x7F,0x00,0x63,0x30, +0x07,0x00,0x67,0x10, +0x2A,0x10,0xC5,0x00, +0x05,0x00,0x68,0x10, +0x00,0x00,0x00,0x00, +0x03,0x00,0x69,0x10, +0x00,0x00,0x00,0x00, +0x05,0x00,0x6A,0x14, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x02,0x80,0x02,0x3C, +0x80,0x5D,0x43,0x8C, +0x08,0x00,0x10,0x24, +0x06,0x00,0xA0,0x14, +0x0A,0x80,0x03,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x65,0x50,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x36, +0x01,0x00,0x42,0x38, +0x03,0x00,0x04,0x36, +0x21,0x80,0x60,0x00, +0x0B,0x80,0x82,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x0E,0x00,0xA3,0x2C, +0x21,0x88,0xA0,0x00, +0x0D,0x00,0x02,0x24, +0x0A,0x88,0x43,0x00, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x21,0x98,0x80,0x00, +0x21,0x90,0x00,0x00, +0x15,0x00,0x20,0x12, +0x21,0x80,0x00,0x00, +0xAA,0x50,0x00,0x08, +0x01,0x00,0x14,0x24, +0x2B,0x10,0x11,0x02, +0x11,0x00,0x40,0x10, +0x21,0x10,0x40,0x02, +0x21,0x18,0x70,0x02, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x44,0x30, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0xF6,0xFF,0x41,0x04, +0x01,0x00,0x10,0x26, +0x7D,0x4F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x10,0x54,0x00, +0x25,0x90,0x42,0x02, +0x2B,0x10,0x11,0x02, +0xF3,0xFF,0x40,0x14, +0x21,0x18,0x70,0x02, +0x21,0x10,0x40,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x0E,0x00,0xA3,0x2C, +0x21,0x88,0xA0,0x00, +0x0D,0x00,0x02,0x24, +0x0A,0x88,0x43,0x00, +0x20,0x00,0xB4,0xAF, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x21,0xA0,0x80,0x00, +0x21,0x90,0x00,0x00, +0x0A,0x00,0x20,0x12, +0x21,0x80,0x00,0x00, +0x01,0x00,0x13,0x24, +0x21,0x10,0x90,0x02, +0x00,0x00,0x44,0x90, +0x7D,0x4F,0x00,0x0C, +0x01,0x00,0x10,0x26, +0x04,0x10,0x53,0x00, +0x2B,0x18,0x11,0x02, +0xF9,0xFF,0x60,0x14, +0x25,0x90,0x42,0x02, +0x21,0x10,0x40,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE8,0xFF,0xBD,0x27, +0xFF,0xFF,0x02,0x24, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x21,0x30,0xA0,0x00, +0x1B,0x00,0x82,0x10, +0x20,0x00,0x10,0x24, +0x20,0x00,0x82,0x28, +0x06,0x00,0x40,0x14, +0x80,0x18,0x04,0x00, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x21,0x18,0x64,0x00, +0x21,0x80,0x80,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x04,0x3C, +0xC0,0x18,0x03,0x00, +0x30,0x1F,0x42,0x24, +0x2B,0x3D,0x84,0x24, +0x21,0x20,0x64,0x00, +0x21,0x18,0x62,0x00, +0x01,0x00,0x02,0x24, +0x06,0x00,0x06,0x24, +0x10,0x52,0x00,0x0C, +0xFA,0x1D,0x62,0xA0, +0x21,0x10,0x00,0x02, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0xC8,0x00,0x47,0x24, +0x05,0x00,0x10,0x24, +0xC2,0x1E,0x43,0x24, +0x10,0x51,0x00,0x08, +0xC8,0x00,0x05,0x24, +0x01,0x00,0x10,0x26, +0x20,0x00,0x02,0x2E, +0x28,0x00,0xA5,0x24, +0xDE,0xFF,0x40,0x10, +0x28,0x00,0xE7,0x24, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0xF8,0xFF,0x40,0x14, +0x28,0x00,0x63,0x24, +0x02,0x80,0x04,0x3C, +0x2B,0x3D,0x84,0x24, +0x01,0x00,0x02,0x24, +0x21,0x20,0xA4,0x00, +0xFA,0x1D,0xE2,0xA0, +0x21,0x28,0xC0,0x00, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x00,0x51,0x00,0x08, +0x21,0x10,0x00,0x02, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x30,0x00,0xB2,0x8F, +0x21,0x88,0x80,0x00, +0x21,0x20,0xA0,0x00, +0x21,0x28,0x20,0x02, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0xE3,0x50,0x00,0x0C, +0xFF,0xFF,0xF0,0x30, +0x20,0x00,0x03,0x24, +0x21,0x20,0x40,0x00, +0x21,0x28,0x00,0x02, +0x21,0x30,0x20,0x02, +0x07,0x00,0x43,0x10, +0x21,0x38,0x40,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x4E,0x23,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0xA8,0x80,0x00, +0x30,0x1F,0x54,0x24, +0x2B,0x3D,0x73,0x24, +0x05,0x00,0x11,0x24, +0x01,0x00,0x12,0x24, +0xC8,0x00,0x10,0x24, +0x50,0x51,0x00,0x08, +0x28,0x00,0xBF,0xAF, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x0E,0x00,0x40,0x10, +0x21,0x10,0x20,0x02, +0x21,0x10,0x14,0x02, +0xFA,0x1D,0x43,0x90, +0x21,0x20,0x13,0x02, +0x21,0x28,0xA0,0x02, +0x06,0x00,0x06,0x24, +0xF6,0xFF,0x72,0x14, +0x28,0x00,0x10,0x26, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x40,0x14, +0x01,0x00,0x31,0x26, +0xFF,0xFF,0x31,0x26, +0x21,0x10,0x20,0x02, +0x28,0x00,0xBF,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x98,0x80,0x00, +0x30,0x1F,0x56,0x24, +0x2B,0x3D,0x75,0x24, +0x21,0x88,0x00,0x00, +0x01,0x00,0x14,0x24, +0x21,0x80,0x00,0x00, +0x2C,0x00,0xBF,0xAF, +0x7C,0x51,0x00,0x08, +0x18,0x00,0xB2,0xAF, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x1E,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x21,0x90,0x16,0x02, +0xFA,0x1D,0x42,0x92, +0x21,0x20,0x15,0x02, +0x21,0x28,0x60,0x02, +0x06,0x00,0x06,0x24, +0xF6,0xFF,0x54,0x14, +0x28,0x00,0x10,0x26, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x40,0x14, +0x01,0x00,0x31,0x26, +0xFF,0xFF,0x31,0x26, +0x02,0x80,0x06,0x3C, +0x02,0x80,0x07,0x3C, +0x21,0x20,0x20,0x02, +0xFA,0x1D,0x40,0xA2, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xE8,0xDD,0xC6,0x24, +0xD8,0xDD,0xE7,0x24, +0x21,0x28,0x00,0x00, +0x4E,0x23,0x00,0x08, +0x30,0x00,0xBD,0x27, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x18,0x00,0xB2,0xAF, +0x30,0x1F,0x52,0x24, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x21,0x80,0x00,0x00, +0x02,0x80,0x1E,0x3C, +0x02,0x80,0x17,0x3C, +0x02,0x80,0x16,0x3C, +0x01,0x00,0x13,0x24, +0xFF,0xF7,0x15,0x24, +0xFF,0xEF,0x14,0x24, +0x21,0x88,0x40,0x02, +0xFA,0x1D,0x22,0x92, +0xC0,0x48,0x10,0x00, +0xEA,0x5D,0xC7,0x93, +0x41,0x00,0x53,0x10, +0x21,0x30,0x32,0x01, +0xE8,0x22,0xC2,0x8C, +0xBF,0xFF,0x03,0x24, +0x24,0x28,0x43,0x00, +0x80,0x07,0xA3,0x34, +0x24,0x10,0x75,0x00, +0x31,0x00,0xF3,0x10, +0x24,0x10,0x54,0x00, +0xE8,0x22,0xC2,0xAC, +0x21,0x48,0x32,0x01, +0xE8,0x22,0x23,0x8D, +0xFD,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xFB,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xE7,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xFF,0xFD,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xEC,0x22,0x28,0x8D, +0x24,0x18,0x62,0x00, +0xFF,0xFB,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0xFF,0xE7,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x1F,0x00,0x06,0x3C, +0x00,0x80,0x08,0x35, +0x24,0x18,0x62,0x00, +0x25,0x40,0x06,0x01, +0x21,0x20,0x00,0x02, +0xE8,0x22,0x23,0xAD, +0x01,0x00,0x10,0x26, +0x21,0x28,0x00,0x00, +0xE8,0xDD,0xE6,0x26, +0xD8,0xDD,0xC7,0x26, +0x4E,0x23,0x00,0x0C, +0xEC,0x22,0x28,0xAD, +0x20,0x00,0x03,0x2A, +0xD1,0xFF,0x60,0x14, +0x28,0x00,0x31,0x26, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x44,0x90, +0x24,0x18,0x75,0x00, +0x80,0x0F,0xA2,0x34, +0x00,0x10,0x63,0x34, +0xCA,0xFF,0x87,0x14, +0x24,0x10,0x54,0x00, +0xC5,0x51,0x00,0x08, +0xE8,0x22,0xC3,0xAC, +0xBD,0x51,0x00,0x08, +0xFA,0x1D,0x20,0xA2, +0x04,0x52,0x00,0x08, +0xFF,0x00,0xA5,0x30, +0x00,0x00,0x85,0xA0, +0xFF,0xFF,0xC6,0x24, +0x01,0x00,0x84,0x24, +0xFC,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x05,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0xFF,0xFF,0xC6,0x24, +0xFD,0xFF,0xC0,0x14, +0x04,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x38,0x80,0x00, +0x08,0x00,0xC0,0x10, +0xFF,0xFF,0xC3,0x24, +0xFF,0xFF,0x06,0x24, +0x00,0x00,0xA2,0x90, +0xFF,0xFF,0x63,0x24, +0x01,0x00,0xA5,0x24, +0x00,0x00,0xE2,0xA0, +0xFB,0xFF,0x66,0x14, +0x01,0x00,0xE7,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x2B,0x10,0xA4,0x00, +0x0D,0x00,0x40,0x14, +0xFF,0xFF,0x02,0x24, +0xFF,0xFF,0xC6,0x24, +0x08,0x00,0xC2,0x10, +0x21,0x18,0x80,0x00, +0xFF,0xFF,0x07,0x24, +0x00,0x00,0xA2,0x90, +0xFF,0xFF,0xC6,0x24, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x62,0xA0, +0xFB,0xFF,0xC7,0x14, +0x01,0x00,0x63,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x21,0x28,0xA6,0x00, +0x21,0x18,0x86,0x00, +0xFF,0xFF,0xC6,0x24, +0xFA,0xFF,0xC2,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x07,0x24, +0xFF,0xFF,0xA5,0x24, +0x00,0x00,0xA2,0x90, +0xFF,0xFF,0x63,0x24, +0xFF,0xFF,0xC6,0x24, +0xFB,0xFF,0xC7,0x14, +0x00,0x00,0x62,0xA0, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x0C,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0xA3,0x90, +0x01,0x00,0x84,0x24, +0x23,0x10,0x43,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x04,0x00,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xFF,0xFF,0xC6,0x24, +0xF6,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xC0,0x00, +0x4F,0x52,0x00,0x08, +0x21,0x18,0x86,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x45,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x84,0x24, +0xFA,0xFF,0x83,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0x09,0x00,0xC0,0x10, +0xFF,0xFF,0xC3,0x24, +0xFF,0x00,0xA5,0x30, +0xFF,0xFF,0x06,0x24, +0x00,0x00,0x82,0x90, +0xFF,0xFF,0x63,0x24, +0x05,0x00,0x45,0x10, +0x01,0x00,0x84,0x24, +0xFB,0xFF,0x66,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0xFF,0xFF,0x82,0x24, +0x21,0x38,0x00,0x00, +0x1F,0x00,0xC0,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x40,0xF2,0x4B,0x24, +0x00,0x00,0x87,0x90, +0x00,0x00,0xA3,0x90, +0xFF,0xFF,0xC6,0x24, +0x01,0x00,0x84,0x24, +0x21,0x10,0xEB,0x00, +0x16,0x00,0xE0,0x10, +0x01,0x00,0xA5,0x24, +0x14,0x00,0x60,0x10, +0x21,0x48,0x6B,0x00, +0x10,0x00,0xE3,0x10, +0x20,0x00,0xE8,0x24, +0x00,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x02,0x00,0x40,0x10, +0x20,0x00,0x6A,0x24, +0xFF,0x00,0x07,0x31, +0x00,0x00,0x22,0x91, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x02,0x00,0x40,0x10, +0xFF,0x00,0xE7,0x30, +0xFF,0x00,0x43,0x31, +0xFF,0x00,0x63,0x30, +0x03,0x00,0xE3,0x14, +0x00,0x00,0x00,0x00, +0xE5,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0xE3,0x00, +0x21,0x18,0x80,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x21,0x38,0x80,0x00, +0xFF,0xFF,0x03,0x24, +0xFF,0xFF,0xC6,0x24, +0x06,0x00,0xC3,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0xF9,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xE0,0x00, +0x00,0x00,0x82,0x80, +0x9E,0x52,0x00,0x08, +0x21,0x18,0x80,0x00, +0x01,0x00,0x84,0x24, +0x00,0x00,0x82,0x80, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x12,0x00,0xC0,0x10, +0x21,0x18,0x80,0x00, +0x00,0x00,0x82,0x80, +0xAF,0x52,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x00,0x84,0x24, +0x00,0x00,0x82,0x80, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x01,0x00,0xA5,0x24, +0x00,0x00,0x82,0xA0, +0x05,0x00,0x40,0x10, +0x01,0x00,0x84,0x24, +0xFF,0xFF,0xC6,0x24, +0xF9,0xFF,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0x80,0xA0, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x00,0x00,0x83,0x90, +0x00,0x00,0xA2,0x90, +0x01,0x00,0x84,0x24, +0x23,0x10,0x62,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x03,0x00,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xF7,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x10,0x00,0x00, +0x0B,0x00,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0x90, +0x00,0x00,0x83,0x90, +0xFF,0xFF,0xC6,0x24, +0x23,0x10,0x62,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x03,0x00,0x40,0x14, +0x01,0x00,0xA5,0x24, +0xF5,0xFF,0x60,0x14, +0x01,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x83,0x80, +0x00,0x2E,0x05,0x00, +0x21,0x10,0x80,0x00, +0xE0,0x52,0x00,0x08, +0x03,0x2E,0x05,0x00, +0x07,0x00,0x60,0x10, +0x01,0x00,0x42,0x24, +0x00,0x00,0x43,0x80, +0x00,0x00,0x00,0x00, +0xFB,0xFF,0x65,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x00,0x00,0x82,0x80, +0xEC,0x52,0x00,0x08, +0x21,0x18,0x80,0x00, +0x01,0x00,0x63,0x24, +0x00,0x00,0x62,0x80, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x23,0x10,0x64,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x21,0x80,0xA0,0x00, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x21,0x88,0x80,0x00, +0xE6,0x52,0x00,0x0C, +0x00,0x86,0x10,0x00, +0x21,0x18,0x51,0x00, +0x03,0x86,0x10,0x00, +0x00,0x00,0x62,0x80, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x50,0x10, +0x21,0x10,0x60,0x00, +0xFF,0xFF,0x63,0x24, +0x2B,0x10,0x71,0x00, +0xF9,0xFF,0x40,0x10, +0x21,0x10,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x21,0x30,0x80,0x00, +0x0D,0x00,0xA0,0x10, +0xFF,0xFF,0xA3,0x24, +0x00,0x00,0x82,0x80, +0x00,0x00,0x00,0x00, +0x09,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x05,0x24, +0xFF,0xFF,0x63,0x24, +0x05,0x00,0x65,0x10, +0x01,0x00,0xC6,0x24, +0x00,0x00,0xC2,0x80, +0x00,0x00,0x00,0x00, +0xFA,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0xC4,0x00, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0x19,0x00,0x40,0x10, +0x21,0x40,0x00,0x00, +0x00,0x00,0xA9,0x80, +0x00,0x00,0x00,0x00, +0x17,0x00,0x20,0x11, +0x21,0x30,0xA0,0x00, +0x00,0x3E,0x02,0x00, +0x03,0x3E,0x07,0x00, +0x21,0x18,0x20,0x01, +0x15,0x00,0xE3,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0xC6,0x24, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0x00,0x1E,0x02,0x00, +0x03,0x1E,0x03,0x00, +0xF8,0xFF,0x60,0x14, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x06,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x84,0x24, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xEB,0xFF,0x40,0x14, +0x01,0x00,0x08,0x25, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x01, +0x00,0x00,0xA2,0x90, +0x31,0x53,0x00,0x08, +0x00,0x16,0x02,0x00, +0x00,0x00,0xC2,0x90, +0x31,0x53,0x00,0x08, +0x00,0x16,0x02,0x00, +0x00,0x00,0x87,0x90, +0x00,0x00,0x00,0x00, +0x14,0x00,0xE0,0x10, +0x21,0x10,0x80,0x00, +0x00,0x00,0xA4,0x90, +0x00,0x00,0x00,0x00, +0x00,0x1E,0x04,0x00, +0x03,0x1E,0x03,0x00, +0x09,0x00,0x60,0x10, +0x21,0x30,0xA0,0x00, +0x00,0x3E,0x07,0x00, +0x03,0x3E,0x07,0x00, +0x0B,0x00,0xE3,0x10, +0x01,0x00,0xC6,0x24, +0x00,0x00,0xC3,0x80, +0x00,0x00,0x00,0x00, +0xFB,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x24, +0x00,0x00,0x47,0x90, +0x00,0x00,0x00,0x00, +0xF0,0xFF,0xE0,0x14, +0x00,0x00,0x00,0x00, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x18,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x1D,0x00,0x80,0x10, +0x21,0x88,0xA0,0x00, +0x1D,0x53,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x21,0x80,0x02,0x02, +0x00,0x00,0x02,0x82, +0x21,0x28,0x20,0x02, +0x21,0x20,0x00,0x02, +0x22,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x41,0x53,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x05,0x00,0x40,0x10, +0x21,0x18,0x40,0x00, +0x00,0x00,0x42,0x80, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x5C,0xF3,0x43,0xAC, +0x21,0x18,0x00,0x02, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x60,0xA0, +0x72,0x53,0x00,0x08, +0x01,0x00,0x63,0x24, +0x02,0x80,0x02,0x3C, +0x5C,0xF3,0x50,0x8C, +0x00,0x00,0x00,0x00, +0xF3,0xFF,0x00,0x12, +0x21,0x18,0x00,0x00, +0x1D,0x53,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x21,0x80,0x02,0x02, +0x00,0x00,0x02,0x82, +0x21,0x28,0x20,0x02, +0x21,0x20,0x00,0x02, +0xE0,0xFF,0x40,0x14, +0x21,0x18,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x02,0x80,0x02,0x3C, +0x5C,0xF3,0x40,0xAC, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x90,0x8C, +0x21,0x90,0x80,0x00, +0x21,0x88,0xA0,0x00, +0x21,0x18,0x00,0x00, +0x0F,0x00,0x00,0x12, +0x21,0x20,0x00,0x02, +0x1D,0x53,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x80,0x02,0x02, +0x00,0x00,0x02,0x82, +0x21,0x28,0x20,0x02, +0x21,0x20,0x00,0x02, +0x07,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x41,0x53,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x40,0x00, +0x09,0x00,0x40,0x14, +0x00,0x00,0x42,0xAE, +0x21,0x18,0x00,0x02, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x42,0x80, +0x00,0x00,0x00,0x00, +0xF5,0xFF,0x40,0x10, +0x01,0x00,0x64,0x24, +0x00,0x00,0x60,0xA0, +0xAB,0x53,0x00,0x08, +0x00,0x00,0x44,0xAE, +0xD8,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x21,0x88,0x80,0x00, +0x21,0x20,0xA0,0x00, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x20,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0xE6,0x52,0x00,0x0C, +0x21,0x98,0xA0,0x00, +0x21,0x90,0x40,0x00, +0x08,0x00,0x40,0x16, +0x21,0x10,0x20,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE6,0x52,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x21,0x80,0x40,0x00, +0x2A,0x10,0x52,0x00, +0x0A,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x02, +0x21,0x30,0x40,0x02, +0x39,0x52,0x00,0x0C, +0xFF,0xFF,0x10,0x26, +0x0B,0x00,0x40,0x10, +0x2A,0x18,0x12,0x02, +0xF8,0xFF,0x60,0x10, +0x01,0x00,0x31,0x26, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xC7,0x53,0x00,0x08, +0x21,0x10,0x20,0x02, +0x00,0x00,0x87,0x90, +0x00,0x00,0x00,0x00, +0x27,0x00,0xE0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA6,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0xC0,0x10, +0xDF,0xFF,0x02,0x24, +0x24,0x18,0xC2,0x00, +0x24,0x10,0xE2,0x00, +0x00,0x16,0x02,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x16,0x02,0x00, +0x03,0x1E,0x03,0x00, +0x0A,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0xDF,0xFF,0x02,0x24, +0x24,0x18,0xC2,0x00, +0x24,0x10,0xE2,0x00, +0x00,0x16,0x02,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0x03,0x16,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0x43,0x00, +0x0A,0x54,0x00,0x08, +0xDF,0xFF,0x08,0x24, +0x00,0x00,0xA6,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x06,0x01, +0x00,0x16,0x02,0x00, +0xF0,0xFF,0xC0,0x10, +0x03,0x16,0x02,0x00, +0xEF,0xFF,0x62,0x14, +0xDF,0xFF,0x02,0x24, +0x01,0x00,0x84,0x24, +0x00,0x00,0x87,0x90, +0x01,0x00,0xA5,0x24, +0x24,0x10,0x07,0x01, +0x00,0x1E,0x02,0x00, +0xF2,0xFF,0xE0,0x14, +0x03,0x1E,0x03,0x00, +0x00,0x00,0xA6,0x90, +0xDF,0xFF,0x02,0x24, +0x24,0x18,0xC2,0x00, +0x24,0x10,0xE2,0x00, +0x00,0x16,0x02,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0x03,0x16,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x23,0x10,0x43,0x00, +0xA8,0xFF,0xBD,0x27, +0x44,0x00,0xB5,0xAF, +0x40,0x00,0xB4,0xAF, +0x38,0x00,0xB2,0xAF, +0x34,0x00,0xB1,0xAF, +0x54,0x00,0xBF,0xAF, +0x50,0x00,0xBE,0xAF, +0x4C,0x00,0xB7,0xAF, +0x48,0x00,0xB6,0xAF, +0x3C,0x00,0xB3,0xAF, +0x30,0x00,0xB0,0xAF, +0x21,0x90,0xA0,0x00, +0x00,0x00,0xA5,0x90, +0x21,0xA0,0x80,0x00, +0x21,0xA8,0xC0,0x00, +0x00,0x26,0x05,0x00, +0x03,0x26,0x04,0x00, +0x11,0x00,0x80,0x10, +0x21,0x88,0x80,0x02, +0x25,0x00,0x02,0x24, +0x29,0x00,0x82,0x10, +0x0A,0x00,0x02,0x24, +0x1B,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x1E,0x00,0x80,0x12, +0x00,0x00,0x00,0x00, +0x00,0x00,0x25,0xA2, +0x01,0x00,0x31,0x26, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x00,0x00,0x00,0x00, +0x00,0x26,0x05,0x00, +0x03,0x26,0x04,0x00, +0xF2,0xFF,0x80,0x14, +0x25,0x00,0x02,0x24, +0x02,0x00,0x80,0x12, +0x23,0x10,0x34,0x02, +0x00,0x00,0x20,0xA2, +0x54,0x00,0xBF,0x8F, +0x50,0x00,0xBE,0x8F, +0x4C,0x00,0xB7,0x8F, +0x48,0x00,0xB6,0x8F, +0x44,0x00,0xB5,0x8F, +0x40,0x00,0xB4,0x8F, +0x3C,0x00,0xB3,0x8F, +0x38,0x00,0xB2,0x8F, +0x34,0x00,0xB1,0x8F, +0x30,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x58,0x00,0xBD,0x27, +0xE7,0xFF,0x80,0x16, +0x00,0x00,0x00,0x00, +0x77,0x55,0x00,0x0C, +0x0D,0x00,0x04,0x24, +0x0A,0x00,0x04,0x24, +0x77,0x55,0x00,0x0C, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x00,0x00,0x00,0x00, +0x00,0x26,0x05,0x00, +0x3C,0x54,0x00,0x08, +0x03,0x26,0x04,0x00, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x73,0x00,0x02,0x24, +0x00,0x1E,0x05,0x00, +0x03,0x1E,0x03,0x00, +0x2C,0x00,0x62,0x10, +0x10,0x00,0xB3,0x27, +0x23,0x00,0x02,0x24, +0x21,0xF0,0x60,0x02, +0x21,0x38,0x00,0x00, +0x34,0x00,0x62,0x10, +0x1C,0x00,0x04,0x24, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0x68,0x00,0x03,0x24, +0x36,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0x39,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0x20,0x00,0xA2,0x34, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x78,0x00,0x03,0x24, +0x3C,0x00,0x43,0x10, +0x20,0x00,0xA6,0x30, +0x00,0x1E,0x05,0x00, +0x03,0x1E,0x03,0x00, +0x64,0x00,0x02,0x24, +0x49,0x00,0x62,0x10, +0x40,0x00,0x02,0x24, +0x81,0x00,0x62,0x10, +0x21,0x00,0x02,0x24, +0x92,0x00,0x62,0x10, +0x63,0x00,0x02,0x24, +0xA2,0x00,0x62,0x10, +0x11,0x00,0xB3,0x27, +0x10,0x00,0xA5,0xA3, +0x21,0x80,0xC0,0x03, +0x2B,0x10,0x13,0x02, +0xB4,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x6C,0x00,0x80,0x12, +0x00,0x00,0x00,0x00, +0x00,0x00,0x02,0x92, +0x01,0x00,0x10,0x26, +0x00,0x00,0x22,0xA2, +0x81,0x54,0x00,0x08, +0x01,0x00,0x31,0x26, +0x00,0x00,0xA2,0x8E, +0x04,0x00,0xB5,0x26, +0x21,0x80,0x40,0x00, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0xA6,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x63,0x00,0x80,0x12, +0x00,0x00,0x00,0x00, +0x00,0x00,0x22,0xA2, +0x01,0x00,0x10,0x26, +0x8E,0x54,0x00,0x08, +0x01,0x00,0x31,0x26, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x68,0x00,0x03,0x24, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0xCC,0xFF,0x43,0x14, +0x01,0x00,0x07,0x24, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x00,0x00,0x00,0x00, +0x00,0x16,0x05,0x00, +0x03,0x16,0x02,0x00, +0xC9,0xFF,0x43,0x14, +0x0C,0x00,0x04,0x24, +0x01,0x00,0x52,0x26, +0x00,0x00,0x45,0x92, +0x78,0x00,0x03,0x24, +0x20,0x00,0xA2,0x34, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0xC7,0xFF,0x43,0x14, +0x04,0x00,0x04,0x24, +0x20,0x00,0xA6,0x30, +0x00,0x00,0xA5,0x8E, +0x35,0x00,0xE0,0x14, +0x04,0x00,0xB5,0x26, +0xCD,0xFF,0x80,0x04, +0x02,0x80,0x02,0x3C, +0x48,0xED,0x42,0x24, +0x00,0x00,0x47,0x8C, +0x07,0x10,0x85,0x00, +0x0F,0x00,0x42,0x30, +0x21,0x10,0x47,0x00, +0x00,0x00,0x43,0x90, +0xFC,0xFF,0x84,0x24, +0x25,0x18,0xC3,0x00, +0x00,0x00,0x63,0xA2, +0xF8,0xFF,0x81,0x04, +0x01,0x00,0x73,0x26, +0x81,0x54,0x00,0x08, +0x21,0x80,0xC0,0x03, +0x00,0x00,0xA2,0x8E, +0x04,0x00,0xB5,0x26, +0x28,0x00,0x40,0x04, +0x21,0x28,0x40,0x00, +0x21,0x80,0x60,0x02, +0x02,0x80,0x02,0x3C, +0x4C,0xED,0x42,0x24, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x00,0x00, +0x18,0x00,0xA6,0x00, +0xC3,0x27,0x05,0x00, +0x10,0x10,0x00,0x00, +0x83,0x10,0x02,0x00, +0x23,0x10,0x44,0x00, +0x80,0x18,0x02,0x00, +0x21,0x18,0x62,0x00, +0x40,0x18,0x03,0x00, +0x23,0x18,0xA3,0x00, +0x30,0x00,0x63,0x24, +0x00,0x00,0x63,0xA2, +0x21,0x28,0x40,0x00, +0xF3,0xFF,0x40,0x14, +0x01,0x00,0x73,0x26, +0xE1,0x54,0x00,0x08, +0xFF,0xFF,0x63,0x26, +0x00,0x00,0x65,0x80, +0x00,0x00,0x02,0x92, +0x00,0x00,0x00,0x00, +0x00,0x00,0x62,0xA0, +0x00,0x00,0x05,0xA2, +0xFF,0xFF,0x63,0x24, +0x01,0x00,0x10,0x26, +0x2B,0x10,0x03,0x02, +0xF7,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x81,0x54,0x00,0x08, +0x21,0x80,0xC0,0x03, +0x58,0x00,0xC3,0x34, +0x30,0x00,0x02,0x24, +0x12,0x00,0xB3,0x27, +0x10,0x00,0xA2,0xA3, +0xB2,0x54,0x00,0x08, +0x11,0x00,0xA3,0xA3, +0x2D,0x00,0x02,0x24, +0x23,0x28,0x05,0x00, +0x11,0x00,0xB3,0x27, +0xC5,0x54,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0x00,0x00,0x04,0x82, +0x77,0x55,0x00,0x0C, +0x01,0x00,0x10,0x26, +0x82,0x54,0x00,0x08, +0x2B,0x10,0x13,0x02, +0x00,0x00,0x04,0x82, +0x77,0x55,0x00,0x0C, +0x01,0x00,0x10,0x26, +0x8E,0x54,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA3,0x8E, +0x28,0x00,0xB0,0x27, +0x2C,0x00,0xA4,0x27, +0x2B,0x10,0x04,0x02, +0x28,0x00,0xA3,0xAF, +0x0B,0x00,0x40,0x10, +0x04,0x00,0xB5,0x26, +0x21,0xB8,0x80,0x00, +0x02,0x80,0x16,0x3C, +0x00,0x00,0x06,0x92, +0x21,0x20,0x60,0x02, +0x01,0x00,0x10,0x26, +0x24,0x55,0x00,0x0C, +0xD0,0xE3,0xC5,0x26, +0x2B,0x18,0x17,0x02, +0xF9,0xFF,0x60,0x14, +0x21,0x98,0x62,0x02, +0x80,0x54,0x00,0x08, +0xFF,0xFF,0x73,0x26, +0x00,0x00,0xA2,0x8E, +0x00,0x00,0x00,0x00, +0x06,0x00,0x56,0x24, +0x21,0x80,0x40,0x00, +0x2B,0x10,0x56,0x00, +0xF8,0xFF,0x40,0x10, +0x04,0x00,0xB5,0x26, +0x02,0x80,0x17,0x3C, +0x00,0x00,0x06,0x82, +0x21,0x20,0x60,0x02, +0x01,0x00,0x10,0x26, +0x24,0x55,0x00,0x0C, +0xD4,0xE3,0xE5,0x26, +0x2B,0x18,0x16,0x02, +0xF9,0xFF,0x60,0x14, +0x21,0x98,0x62,0x02, +0x80,0x54,0x00,0x08, +0xFF,0xFF,0x73,0x26, +0x00,0x00,0xA2,0x8E, +0x04,0x00,0xB5,0x26, +0x80,0x54,0x00,0x08, +0x10,0x00,0xA2,0xA3, +0xE8,0xFF,0xBD,0x27, +0x20,0x00,0xA6,0xAF, +0x20,0x00,0xA6,0x27, +0x10,0x00,0xBF,0xAF, +0x24,0x00,0xA7,0xAF, +0x1B,0x54,0x00,0x0C, +0x1C,0x00,0xA5,0xAF, +0x10,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x24,0x00,0xA5,0xAF, +0x28,0x00,0xA6,0xAF, +0x2C,0x00,0xA7,0xAF, +0x20,0x00,0xA4,0xAF, +0x00,0x60,0x11,0x40, +0x01,0x00,0x21,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x25,0x24,0x00,0x0C, +0xA0,0x00,0x04,0x24, +0x19,0x00,0x40,0x10, +0x21,0x80,0x40,0x00, +0x08,0x00,0x44,0x94, +0x20,0x00,0xA5,0x8F, +0x02,0x80,0x02,0x3C, +0x25,0x20,0x82,0x00, +0x20,0x00,0x84,0x24, +0x1B,0x54,0x00,0x0C, +0x24,0x00,0xA6,0x27, +0x01,0x00,0x42,0x24, +0x13,0x00,0x03,0x24, +0x81,0x00,0x44,0x2C, +0x14,0x00,0x03,0xAE, +0x17,0x00,0x80,0x14, +0x0C,0x00,0x02,0xAE, +0x00,0x60,0x01,0x40, +0x01,0x00,0x21,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x88,0x88,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x88,0x88,0x63,0x34, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x55,0x55,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0x60,0x91,0x40, +0x99,0x99,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x99,0x99,0x63,0x34, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x30,0x09,0x00,0x0C, +0x21,0x20,0x00,0x02, +0x00,0x60,0x91,0x40, +0x5D,0x55,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x02,0x80,0x06,0x3C, +0x60,0xF3,0xC5,0x8C, +0x02,0x80,0x02,0x3C, +0x40,0xF3,0x42,0x24, +0x03,0x00,0xA3,0x30, +0x21,0x18,0x62,0x00, +0x00,0x00,0x64,0x80, +0x01,0x00,0xA5,0x24, +0x77,0x55,0x00,0x0C, +0x60,0xF3,0xC5,0xAC, +0x10,0x00,0xBF,0x8F, +0x08,0x00,0x04,0x24, +0x77,0x55,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x00,0x26,0x04,0x00, +0x03,0x26,0x04,0x00, +0x00,0x00,0x84,0x48, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x26,0x04,0x00, +0x03,0x26,0x04,0x00, +0xF7,0xFF,0x82,0x24, +0x05,0x00,0x42,0x2C, +0x06,0x00,0x40,0x14, +0x21,0x18,0x00,0x00, +0x20,0x00,0x02,0x24, +0x03,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x01,0x00,0x03,0x24, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0x00,0x60,0x02,0x40, +0x01,0x00,0x41,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x03,0x3C, +0xD4,0x5E,0x64,0xAC, +0x00,0x60,0x82,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x05,0x3C, +0x01,0x00,0x06,0x24, +0x01,0x80,0x02,0x3C, +0x04,0x30,0x86,0x00, +0xF1,0x02,0xA7,0x34, +0xED,0x02,0xA4,0x34, +0x4C,0x56,0x42,0x24, +0x18,0x03,0xA5,0x34, +0x08,0x00,0x03,0x24, +0x00,0x00,0xA2,0xAC, +0x00,0x00,0xE3,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0x86,0xA0, +0x00,0x00,0x80,0xA0, +0x00,0x00,0xE0,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x82,0x8C, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0xC6,0x30, +0x10,0x00,0x02,0x24, +0x0C,0x00,0xC2,0x10, +0x11,0x00,0xC3,0x28, +0x06,0x00,0x60,0x10, +0x20,0x00,0x02,0x24, +0x08,0x00,0x02,0x24, +0x0D,0x00,0xC2,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x06,0x00,0xC2,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xA4, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x0A,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0xFF,0xFF,0xA5,0x24, +0x00,0x2C,0x05,0x00, +0xFD,0x00,0x63,0x30, +0x03,0x2C,0x05,0x00, +0xFF,0xFF,0x87,0x30, +0x00,0x00,0x43,0xA0, +0x1A,0x00,0xA0,0x04, +0x00,0x00,0x00,0x00, +0x21,0x30,0x40,0x00, +0x07,0x10,0xA7,0x00, +0x01,0x00,0x42,0x30, +0xFD,0x00,0x64,0x30, +0x00,0x00,0x42,0x38, +0x02,0x00,0x63,0x34, +0x0A,0x18,0x82,0x00, +0x00,0x00,0xC3,0xA0, +0x04,0x00,0x63,0x34, +0x00,0x00,0xC3,0xA0, +0x09,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFB,0x00,0x63,0x30, +0x00,0x00,0xC3,0xA0, +0x04,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0xA2,0x24, +0x00,0x2C,0x02,0x00, +0x03,0x2C,0x05,0x00, +0xEA,0xFF,0xA1,0x04, +0x07,0x10,0xA7,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x0A,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0xFF,0xFF,0x84,0x24, +0x00,0x24,0x04,0x00, +0x03,0x24,0x04,0x00, +0xFF,0x00,0x65,0x30, +0x1D,0x00,0x80,0x04, +0x21,0x38,0x00,0x00, +0x21,0x30,0x40,0x00, +0x01,0x00,0x08,0x24, +0x04,0x00,0xA5,0x34, +0x00,0x00,0xC5,0xA0, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x45,0x30, +0x01,0x00,0xA3,0x30, +0x05,0x00,0x60,0x10, +0x04,0x00,0x02,0x24, +0x04,0x10,0x88,0x00, +0x25,0x10,0x47,0x00, +0xFF,0xFF,0x47,0x30, +0x04,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFB,0x00,0xA5,0x30, +0x00,0x00,0xC5,0xA0, +0x09,0x00,0x02,0x24, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x41,0x04, +0xFF,0xFF,0x42,0x24, +0xFF,0xFF,0x82,0x24, +0x00,0x24,0x02,0x00, +0x03,0x24,0x04,0x00, +0xE7,0xFF,0x81,0x04, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xE0,0x00, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x25,0xB0,0x10,0x3C, +0x0A,0x00,0x10,0x36, +0x18,0x00,0xBF,0xAF, +0x14,0x00,0xB1,0xAF, +0x00,0x00,0x02,0x92, +0xFF,0xFF,0x91,0x30, +0x03,0x00,0x05,0x24, +0xC0,0x00,0x42,0x30, +0x80,0x00,0x43,0x34, +0x00,0x00,0x03,0xA2, +0x04,0x00,0x63,0x34, +0x00,0x00,0x03,0xA2, +0xFB,0x00,0x63,0x30, +0x00,0x00,0x03,0xA2, +0x08,0x00,0x63,0x34, +0x00,0x00,0x03,0xA2, +0x04,0x00,0x63,0x34, +0x00,0x00,0x03,0xA2, +0xFB,0x00,0x63,0x30, +0x00,0x00,0x03,0xA2, +0xC9,0x55,0x00,0x0C, +0x06,0x00,0x04,0x24, +0x42,0x20,0x11,0x00, +0xC9,0x55,0x00,0x0C, +0x06,0x00,0x05,0x24, +0xEF,0x55,0x00,0x0C, +0x10,0x00,0x04,0x24, +0x00,0x00,0x03,0x92, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0xC0,0x00,0x63,0x30, +0x00,0x00,0x03,0xA2, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0xFF,0xFF,0xB1,0x30, +0x18,0x00,0xB2,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x90,0xC0,0x00, +0x0A,0x00,0x20,0x12, +0xFF,0xFF,0x90,0x30, +0x16,0x56,0x00,0x0C, +0x21,0x20,0x00,0x02, +0xFE,0xFF,0x23,0x26, +0x02,0x00,0x04,0x26, +0x00,0x00,0x42,0xA6, +0xFF,0xFF,0x71,0x30, +0xFF,0xFF,0x90,0x30, +0xF8,0xFF,0x20,0x16, +0x02,0x00,0x52,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x0A,0x00,0x67,0x34, +0x00,0x00,0xE2,0x90, +0xFF,0xFF,0xB2,0x30, +0x21,0x98,0xC0,0x00, +0xFF,0x00,0x91,0x30, +0x20,0x00,0x40,0x12, +0xFF,0x00,0x50,0x30, +0x21,0xA0,0xE0,0x00, +0x0C,0x00,0x77,0x34, +0x0B,0x00,0x76,0x34, +0x21,0xF0,0xE0,0x00, +0xC0,0xFF,0x15,0x24, +0x25,0x10,0x15,0x02, +0xFF,0x00,0x50,0x30, +0x00,0x00,0xD1,0xA2, +0x00,0x00,0x90,0xA2, +0x00,0x00,0x82,0x92, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x50,0x30, +0xC0,0x00,0x03,0x32, +0x07,0x00,0x60,0x10, +0x21,0x20,0xC0,0x03, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x50,0x30, +0xC0,0x00,0x03,0x32, +0xFB,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE2,0x8E, +0x04,0x00,0x23,0x26, +0x64,0x00,0x04,0x24, +0x00,0x00,0x62,0xAE, +0x25,0x22,0x00,0x0C, +0xFF,0x00,0x71,0x30, +0xFC,0xFF,0x42,0x26, +0xFF,0xFF,0x52,0x30, +0xE7,0xFF,0x40,0x16, +0x04,0x00,0x73,0x26, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x25,0xB0,0x06,0x3C, +0x31,0x00,0xC2,0x34, +0xFF,0xFF,0x84,0x30, +0x00,0x00,0x44,0xA0, +0x32,0x00,0xC7,0x34, +0x00,0x00,0xE3,0x90, +0xFC,0xFF,0x02,0x24, +0x02,0x22,0x04,0x00, +0x24,0x18,0x62,0x00, +0x03,0x00,0x84,0x30, +0x25,0x20,0x83,0x00, +0x33,0x00,0xC6,0x34, +0x72,0x00,0x02,0x24, +0x00,0x00,0xE4,0xA0, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0xC3,0x90, +0x00,0x00,0x00,0x00, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0x05,0x00,0x61,0x04, +0x21,0x10,0x00,0x00, +0xB5,0x56,0x00,0x08, +0x25,0xB0,0x02,0x3C, +0x11,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC3,0x90, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0xF8,0xFF,0x61,0x04, +0x64,0x00,0x44,0x2C, +0x64,0x00,0x44,0x2C, +0x07,0x00,0x80,0x10, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x30,0x00,0x42,0x34, +0x00,0x00,0x43,0x90, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0xA3,0xA0, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0xA2,0xA0, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x25,0xB0,0x06,0x3C, +0x31,0x00,0xC2,0x34, +0xFF,0xFF,0x84,0x30, +0x00,0x00,0x44,0xA0, +0x32,0x00,0xC3,0x34, +0x00,0x00,0x62,0x90, +0x02,0x22,0x04,0x00, +0x03,0x00,0x84,0x30, +0x25,0x20,0x82,0x00, +0x00,0x00,0x64,0xA0, +0x33,0x00,0xC7,0x34, +0xFF,0x00,0xA5,0x30, +0x30,0x00,0xC6,0x34, +0xF2,0xFF,0x03,0x24, +0x00,0x00,0xC5,0xA0, +0x00,0x00,0xE3,0xA0, +0x00,0x00,0xE2,0x90, +0x00,0x00,0x00,0x00, +0x00,0x16,0x02,0x00, +0x03,0x16,0x02,0x00, +0x03,0x00,0x40,0x04, +0x21,0x20,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x01,0x00,0x02,0x24, +0xDA,0x56,0x00,0x08, +0x21,0x30,0xE0,0x00, +0x0B,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC3,0x90, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x00,0x1E,0x03,0x00, +0x03,0x1E,0x03,0x00, +0xF8,0xFF,0x60,0x04, +0x64,0x00,0x82,0x2C, +0x64,0x00,0x82,0x2C, +0xF1,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x25,0xB0,0x02,0x3C, +0x18,0x00,0xB0,0xAF, +0xF8,0x02,0x45,0x34, +0x25,0xB0,0x10,0x3C, +0xFF,0x00,0x83,0x30, +0x01,0x00,0x02,0x24, +0x1C,0x00,0xBF,0xAF, +0x03,0x00,0x06,0x36, +0x0A,0x00,0x62,0x10, +0x0A,0x00,0x04,0x24, +0x00,0x00,0xA2,0x90, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x20,0x00,0xBD,0x27, +0x00,0x00,0xA2,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x20,0x00,0x43,0x34, +0x20,0x00,0x42,0x30, +0x02,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC3,0xA0, +0x25,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x04,0x36, +0x00,0x00,0x82,0x90, +0xFE,0xFF,0x03,0x24, +0xF8,0x02,0x06,0x36, +0x24,0x10,0x43,0x00, +0x00,0x00,0x82,0xA0, +0x00,0x00,0xC3,0x90, +0x10,0x00,0xA5,0x27, +0x21,0x20,0x00,0x00, +0x03,0x00,0x63,0x34, +0x00,0x00,0xC3,0xA0, +0x91,0x56,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xFF,0x00,0x84,0x30, +0x21,0x38,0x00,0x00, +0x21,0x28,0x00,0x00, +0x01,0x00,0xA3,0x24, +0x07,0x10,0xA4,0x00, +0x01,0x00,0x42,0x30, +0xFF,0x00,0x65,0x30, +0x01,0x00,0xE6,0x24, +0x02,0x00,0x40,0x14, +0x04,0x00,0xA3,0x2C, +0xFF,0x00,0xC7,0x30, +0xF7,0xFF,0x60,0x14, +0x21,0x10,0xE0,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x8C,0x30, +0x21,0x48,0x00,0x00, +0x21,0x38,0x00,0x00, +0x40,0x10,0x07,0x00, +0xFF,0x00,0x42,0x30, +0x21,0x50,0x46,0x00, +0x01,0x00,0xE3,0x24, +0x07,0x10,0xEC,0x00, +0x01,0x00,0x42,0x30, +0xFF,0x00,0x67,0x30, +0x21,0x58,0x25,0x01, +0x01,0x00,0x24,0x25, +0x09,0x00,0x40,0x14, +0x04,0x00,0xE8,0x2C, +0x00,0x00,0x63,0x91, +0xFF,0x00,0x89,0x30, +0x21,0x20,0x25,0x01, +0x00,0x00,0x43,0xA1, +0x00,0x00,0x83,0x90, +0x01,0x00,0x22,0x25, +0xFF,0x00,0x49,0x30, +0x01,0x00,0x43,0xA1, +0xED,0xFF,0x00,0x15, +0x40,0x10,0x07,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x24,0x00,0xBF,0xAF, +0x01,0x00,0x12,0x24, +0x21,0x80,0x00,0x00, +0x57,0x57,0x00,0x08, +0xFF,0x00,0x11,0x24, +0x91,0x56,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0x40,0x10, +0x00,0x02,0x03,0x2E, +0x0F,0x00,0x60,0x10, +0x21,0x10,0x00,0x02, +0x10,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x51,0x10, +0x0F,0x00,0x44,0x30, +0x15,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x40,0x10,0x02,0x00, +0x21,0x10,0x50,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x50,0x30, +0x21,0x20,0x00,0x02, +0xEE,0xFF,0x40,0x16, +0x10,0x00,0xA5,0x27, +0x21,0x10,0x00,0x02, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xB8,0xFF,0xBD,0x27, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x24,0x00,0xB1,0xAF, +0x20,0x00,0xB0,0xAF, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x28,0x00,0xB2,0xAF, +0x21,0x98,0xA0,0x00, +0xFF,0x00,0x96,0x30, +0x01,0x00,0x10,0x24, +0x01,0x00,0x17,0x24, +0x21,0xA0,0x00,0x00, +0x21,0x88,0x00,0x00, +0x21,0xA8,0x00,0x00, +0x04,0x00,0xA0,0x10, +0x21,0x18,0x00,0x00, +0x10,0x00,0xC2,0x2E, +0x0E,0x00,0x40,0x14, +0x21,0x20,0xA0,0x00, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x08,0x00,0x06,0x24, +0xFF,0x51,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x18,0x00,0xA4,0x27, +0xFF,0x00,0x05,0x24, +0xFF,0x51,0x00,0x0C, +0x08,0x00,0x06,0x24, +0xE6,0x56,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x96,0x57,0x00,0x08, +0x10,0x00,0xBE,0x27, +0x1C,0x00,0x40,0x14, +0x21,0x20,0xA0,0x02, +0x37,0x00,0xE0,0x12, +0x00,0x02,0x22,0x2E, +0x35,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x02,0x32, +0xF8,0xFF,0x40,0x10, +0x20,0x00,0x02,0x32, +0x21,0x20,0x20,0x02, +0x91,0x56,0x00,0x0C, +0x10,0x00,0xA5,0x27, +0x2D,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x10,0x00,0xB0,0x93, +0x00,0x00,0x00,0x00, +0x29,0x00,0x02,0x12, +0x0F,0x00,0x15,0x32, +0x15,0x57,0x00,0x0C, +0x21,0x20,0xA0,0x02, +0x02,0x81,0x10,0x00, +0x10,0x00,0x16,0x12, +0x21,0xA0,0x40,0x00, +0x40,0x10,0x14,0x00, +0x21,0x10,0x51,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x51,0x30, +0x92,0x57,0x00,0x08, +0x01,0x00,0x10,0x24, +0x18,0x00,0xA5,0x27, +0x24,0x57,0x00,0x0C, +0x21,0x30,0x60,0x02, +0x40,0x10,0x14,0x00, +0x21,0x10,0x51,0x00, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x51,0x30, +0x92,0x57,0x00,0x08, +0x01,0x00,0x10,0x24, +0x40,0x90,0x02,0x00, +0x10,0x00,0x40,0x1A, +0x21,0x80,0x00,0x00, +0x21,0x20,0x30,0x02, +0x01,0x00,0x84,0x24, +0xFF,0xFF,0x84,0x30, +0x91,0x56,0x00,0x0C, +0x10,0x00,0xA5,0x27, +0x01,0x00,0x03,0x26, +0x21,0x20,0xD0,0x03, +0xFF,0x00,0x70,0x30, +0x04,0x00,0x40,0x10, +0x2A,0x18,0x12,0x02, +0x10,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x08,0x00,0x82,0xA0, +0xF3,0xFF,0x60,0x14, +0x21,0x20,0x30,0x02, +0x92,0x57,0x00,0x08, +0x20,0x00,0x10,0x24, +0xE6,0x56,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x00,0x00,0x63,0x92, +0xFF,0x00,0x02,0x24, +0x0F,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0x01,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0xF0,0xFF,0x43,0x14, +0x01,0x00,0x03,0x24, +0x02,0x00,0x63,0x92, +0x00,0x00,0x00,0x00, +0xEB,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x03,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0x43,0x14, +0x01,0x00,0x03,0x24, +0x04,0x00,0x63,0x92, +0x00,0x00,0x00,0x00, +0xE3,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x05,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0xDF,0xFF,0x43,0x14, +0x00,0x00,0x00,0x00, +0x06,0x00,0x67,0x92, +0x00,0x00,0x00,0x00, +0xDC,0xFF,0xE2,0x14, +0x01,0x00,0x03,0x24, +0x07,0x00,0x62,0x92, +0x00,0x00,0x00,0x00, +0x7F,0xFF,0x47,0x10, +0x21,0x18,0x00,0x00, +0xD1,0x57,0x00,0x08, +0x01,0x00,0x03,0x24, +0xC0,0xFF,0xBD,0x27, +0x38,0x00,0xBE,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x21,0xF0,0xC0,0x00, +0xFF,0x00,0xB6,0x30, +0xFF,0xFF,0x95,0x30, +0xFF,0x00,0x05,0x24, +0x10,0x00,0xA4,0x27, +0x08,0x00,0x06,0x24, +0x34,0x00,0xB7,0xAF, +0x24,0x00,0xB3,0xAF, +0x3C,0x00,0xBF,0xAF, +0x28,0x00,0xB4,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0xFF,0x51,0x00,0x0C, +0x0F,0x00,0x17,0x24, +0x21,0x98,0x00,0x00, +0x40,0x10,0x13,0x00, +0xFF,0x00,0x52,0x30, +0x07,0x10,0x76,0x02, +0x01,0x00,0x42,0x30, +0x21,0xA0,0x5E,0x02, +0x21,0x88,0xA0,0x02, +0x21,0x20,0xA0,0x02, +0x13,0x00,0x40,0x10, +0x01,0x00,0xA3,0x26, +0x01,0x00,0x62,0x26, +0xFF,0x00,0x53,0x30, +0x04,0x00,0x63,0x2E, +0xF4,0xFF,0x60,0x14, +0x40,0x10,0x13,0x00, +0x21,0x10,0xE0,0x02, +0x3C,0x00,0xBF,0x8F, +0x38,0x00,0xBE,0x8F, +0x34,0x00,0xB7,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x40,0x00,0xBD,0x27, +0x00,0x00,0x85,0x92, +0xFF,0xFF,0x75,0x30, +0xBE,0x56,0x00,0x0C, +0x21,0x80,0xA0,0x02, +0x01,0x00,0x85,0x92, +0x21,0x20,0xA0,0x02, +0x01,0x00,0xA2,0x26, +0xBE,0x56,0x00,0x0C, +0xFF,0xFF,0x55,0x30, +0x10,0x00,0xA3,0x27, +0x21,0x90,0x72,0x00, +0x21,0x20,0x20,0x02, +0x91,0x56,0x00,0x0C, +0x21,0x28,0x40,0x02, +0x21,0x20,0x00,0x02, +0x91,0x56,0x00,0x0C, +0x01,0x00,0x45,0x26, +0x00,0x00,0x84,0x92, +0x00,0x00,0x42,0x92, +0x01,0x00,0x03,0x24, +0x04,0x18,0x63,0x02, +0x03,0x00,0x82,0x10, +0x27,0x30,0x03,0x00, +0x19,0x58,0x00,0x08, +0x24,0xB8,0xD7,0x00, +0x01,0x00,0x83,0x92, +0x01,0x00,0x42,0x92, +0x00,0x00,0x00,0x00, +0xD2,0xFF,0x62,0x10, +0x01,0x00,0x62,0x26, +0x1A,0x58,0x00,0x08, +0x24,0xB8,0xD7,0x00, +0x98,0xFF,0xBD,0x27, +0x50,0x00,0xB4,0xAF, +0xFF,0x00,0x94,0x30, +0x01,0x00,0x04,0x24, +0x64,0x00,0xBF,0xAF, +0x60,0x00,0xBE,0xAF, +0x5C,0x00,0xB7,0xAF, +0x58,0x00,0xB6,0xAF, +0x4C,0x00,0xB3,0xAF, +0x48,0x00,0xB2,0xAF, +0x44,0x00,0xB1,0xAF, +0x21,0x98,0xC0,0x00, +0xFF,0x00,0xB1,0x30, +0x54,0x00,0xB5,0xAF, +0xE6,0x56,0x00,0x0C, +0x40,0x00,0xB0,0xAF, +0x3E,0x57,0x00,0x0C, +0x01,0x00,0x16,0x24, +0x21,0x18,0x40,0x00, +0xFF,0x01,0x42,0x2C, +0x01,0x00,0x17,0x24, +0x01,0x00,0x1E,0x24, +0x21,0x90,0x00,0x00, +0x0E,0x00,0x40,0x14, +0x21,0x20,0x00,0x00, +0x64,0x00,0xBF,0x8F, +0x60,0x00,0xBE,0x8F, +0x5C,0x00,0xB7,0x8F, +0x58,0x00,0xB6,0x8F, +0x54,0x00,0xB5,0x8F, +0x50,0x00,0xB4,0x8F, +0x4C,0x00,0xB3,0x8F, +0x48,0x00,0xB2,0x8F, +0x44,0x00,0xB1,0x8F, +0x40,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x68,0x00,0xBD,0x27, +0xFF,0x01,0x02,0x24, +0x23,0x10,0x43,0x00, +0x1A,0x00,0xA4,0x27, +0xFF,0x00,0x05,0x24, +0x08,0x00,0x06,0x24, +0xFF,0xFF,0x50,0x30, +0x18,0x00,0xB4,0xA3, +0xFF,0x51,0x00,0x0C, +0x19,0x00,0xB1,0xA3, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x02, +0x24,0x57,0x00,0x0C, +0x1A,0x00,0xA6,0x27, +0x19,0x00,0xA4,0x93, +0x15,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0xA8,0x40,0x00, +0xFF,0xFF,0x42,0x30, +0x2B,0x10,0x02,0x02, +0xDF,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0x01,0x00,0x02,0x24, +0x09,0x00,0xC2,0x12, +0x20,0x00,0x02,0x24, +0x22,0x00,0xC2,0x12, +0x00,0x00,0x00,0x00, +0x3B,0x00,0xE0,0x12, +0x00,0x02,0x42,0x2E, +0x39,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0xF9,0xFF,0xC2,0x16, +0x20,0x00,0x02,0x24, +0x21,0x20,0x40,0x02, +0x10,0x00,0xA5,0x27, +0x91,0x56,0x00,0x0C, +0x01,0x00,0x13,0x24, +0x41,0x00,0x40,0x10, +0xFF,0x00,0x02,0x24, +0x10,0x00,0xA5,0x93, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xA4,0x30, +0x3C,0x00,0x82,0x10, +0x0F,0x00,0xA3,0x30, +0x02,0x11,0x04,0x00, +0x21,0x20,0x60,0x00, +0x29,0x00,0xA3,0xA3, +0x28,0x00,0xA2,0xA3, +0x15,0x57,0x00,0x0C, +0x11,0x00,0xA5,0xA3, +0x21,0x80,0x40,0x00, +0x28,0x00,0xA3,0x93, +0x18,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x5F,0x00,0x62,0x10, +0x40,0x10,0x10,0x00, +0x21,0x10,0x52,0x00, +0x01,0x00,0x42,0x24, +0x8B,0x58,0x00,0x08, +0xFF,0xFF,0x52,0x30, +0x19,0x00,0xA5,0x93, +0x01,0x00,0x44,0x26, +0xFF,0xFF,0x84,0x30, +0xFC,0x57,0x00,0x0C, +0x1A,0x00,0xA6,0x27, +0x21,0x28,0x40,0x00, +0x0F,0x00,0x43,0x30, +0x0F,0x00,0x02,0x24, +0x12,0x00,0x62,0x10, +0x40,0x10,0x15,0x00, +0x21,0x10,0x52,0x00, +0x01,0x00,0x42,0x24, +0x21,0x20,0xA0,0x00, +0xFF,0xFF,0x52,0x30, +0x18,0x00,0xB4,0xA3, +0x15,0x57,0x00,0x0C, +0x19,0x00,0xA5,0xA3, +0x21,0xA8,0x40,0x00, +0x02,0x80,0x03,0x3C, +0x04,0xE4,0x62,0x8C, +0x02,0x80,0x04,0x3C, +0x01,0x00,0x16,0x24, +0x01,0x00,0x42,0x24, +0x04,0x00,0x43,0x28, +0xC6,0xFF,0x60,0x14, +0x04,0xE4,0x82,0xAC, +0x21,0xF0,0x00,0x00, +0xE6,0x56,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x21,0x20,0xC0,0x03, +0x64,0x00,0xBF,0x8F, +0x60,0x00,0xBE,0x8F, +0x5C,0x00,0xB7,0x8F, +0x58,0x00,0xB6,0x8F, +0x54,0x00,0xB5,0x8F, +0x50,0x00,0xB4,0x8F, +0x4C,0x00,0xB3,0x8F, +0x48,0x00,0xB2,0x8F, +0x44,0x00,0xB1,0x8F, +0x40,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x08,0x00,0xE0,0x03, +0x68,0x00,0xBD,0x27, +0x3E,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFF,0x01,0x03,0x24, +0x23,0x18,0x62,0x00, +0xFF,0xFF,0x70,0x30, +0xFF,0xFF,0xA2,0x32, +0x2B,0x10,0x02,0x02, +0xE7,0xFF,0x40,0x14, +0x21,0x20,0x40,0x02, +0x18,0x00,0xB0,0x93, +0x19,0x00,0xA2,0x93, +0x00,0x81,0x10,0x00, +0x25,0x80,0x02,0x02, +0xFF,0x00,0x10,0x32, +0xBE,0x56,0x00,0x0C, +0x21,0x28,0x00,0x02, +0x21,0x20,0x40,0x02, +0x91,0x56,0x00,0x0C, +0x11,0x00,0xA5,0x27, +0x11,0x00,0xA3,0x93, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x64,0x30, +0x9D,0xFF,0x90,0x10, +0x20,0x00,0x16,0x24, +0xFF,0x00,0x02,0x24, +0xCD,0xFF,0x82,0x10, +0x0F,0x00,0x63,0x30, +0x02,0x11,0x04,0x00, +0x21,0x20,0x60,0x00, +0x29,0x00,0xA3,0xA3, +0x15,0x57,0x00,0x0C, +0x28,0x00,0xA2,0xA3, +0x38,0x00,0xA4,0x27, +0xFF,0x00,0x05,0x24, +0x08,0x00,0x06,0x24, +0xFF,0x51,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x28,0x00,0xA4,0x93, +0x61,0x57,0x00,0x0C, +0x38,0x00,0xA5,0x27, +0x1F,0x00,0x40,0x14, +0x01,0x00,0x44,0x26, +0x40,0x10,0x10,0x00, +0x21,0x10,0x52,0x00, +0x01,0x00,0x42,0x24, +0xBE,0x58,0x00,0x08, +0xFF,0xFF,0x52,0x30, +0x40,0x88,0x10,0x00, +0x27,0x00,0x20,0x1A, +0x21,0x80,0x00,0x00, +0xFF,0x00,0x16,0x24, +0x21,0x20,0x50,0x02, +0x01,0x00,0x84,0x24, +0xFF,0xFF,0x84,0x30, +0x91,0x56,0x00,0x0C, +0x10,0x00,0xA5,0x27, +0x01,0x00,0x03,0x26, +0xFF,0x00,0x70,0x30, +0x05,0x00,0x40,0x10, +0x2A,0x18,0x11,0x02, +0x10,0x00,0xA2,0x93, +0x00,0x00,0x00,0x00, +0x26,0x10,0x56,0x00, +0x0B,0x98,0x02,0x00, +0xF3,0xFF,0x60,0x14, +0x21,0x20,0x50,0x02, +0x15,0x00,0x60,0x16, +0x21,0x10,0x32,0x02, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x52,0x30, +0x8B,0x58,0x00,0x08, +0x01,0x00,0x16,0x24, +0x29,0x00,0xA5,0x93, +0xFF,0xFF,0x84,0x30, +0xFC,0x57,0x00,0x0C, +0x38,0x00,0xA6,0x27, +0x21,0x28,0x40,0x00, +0x0F,0x00,0x43,0x30, +0x0F,0x00,0x02,0x24, +0xDB,0xFF,0x62,0x10, +0x40,0x10,0x10,0x00, +0x28,0x00,0xA4,0x93, +0x4B,0x58,0x00,0x0C, +0x38,0x00,0xA6,0x27, +0x3E,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xBE,0x58,0x00,0x08, +0x21,0x90,0x40,0x00, +0x19,0x00,0xA3,0x93, +0x29,0x00,0xA6,0x93, +0x0F,0x00,0x13,0x24, +0x0E,0x00,0x10,0x24, +0x25,0x18,0x66,0x00, +0x01,0x00,0x62,0x30, +0x0A,0x98,0x02,0x02, +0x02,0x00,0x64,0x30, +0xFD,0x00,0x62,0x32, +0x0A,0x98,0x44,0x00, +0x04,0x00,0x65,0x30, +0xFB,0x00,0x62,0x32, +0x0A,0x98,0x45,0x00, +0x08,0x00,0x63,0x30, +0xF7,0x00,0x62,0x32, +0x0A,0x98,0x43,0x00, +0x0F,0x00,0x64,0x32, +0x0F,0x00,0x16,0x24, +0x25,0x00,0x96,0x10, +0x21,0x28,0xC0,0x00, +0x01,0x00,0x44,0x26, +0xFF,0xFF,0x84,0x30, +0xFC,0x57,0x00,0x0C, +0x1A,0x00,0xA6,0x27, +0x21,0x28,0x40,0x00, +0x0F,0x00,0x42,0x30, +0x03,0x00,0x56,0x10, +0x21,0x20,0x80,0x02, +0x4B,0x58,0x00,0x0C, +0x38,0x00,0xA6,0x27, +0x19,0x00,0xA5,0x93, +0x00,0x00,0x00,0x00, +0x26,0x10,0x65,0x02, +0x01,0x00,0x42,0x30, +0x0A,0x80,0xC2,0x02, +0x26,0x18,0x65,0x02, +0x02,0x00,0x63,0x30, +0xFD,0x00,0x04,0x32, +0x0B,0x80,0x83,0x00, +0x26,0x10,0x65,0x02, +0x04,0x00,0x42,0x30, +0xFB,0x00,0x03,0x32, +0x0B,0x80,0x62,0x00, +0x26,0x28,0x65,0x02, +0x08,0x00,0xA5,0x30, +0xF7,0x00,0x02,0x32, +0x0B,0x80,0x45,0x00, +0x0F,0x00,0x03,0x32, +0x0D,0x00,0x76,0x10, +0x00,0x00,0x00,0x00, +0x3E,0x57,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x90,0x40,0x00, +0x19,0x00,0xB0,0xA3, +0xBE,0x58,0x00,0x08, +0x18,0x00,0xB4,0xA3, +0x21,0x10,0x32,0x02, +0x01,0x00,0x42,0x24, +0xFF,0xFF,0x52,0x30, +0x01,0x00,0x16,0x24, +0x8B,0x58,0x00,0x08, +0x18,0x00,0xB4,0xA3, +0xBE,0x58,0x00,0x08, +0x21,0xB8,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xBC,0x65,0x42,0x24, +0x18,0x03,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x83,0x90, +0x30,0x00,0x02,0x24, +0x05,0x00,0x62,0x10, +0x21,0x20,0x00,0x00, +0x31,0x00,0x02,0x24, +0x02,0x00,0x62,0x10, +0x01,0x00,0x04,0x24, +0x07,0x00,0x04,0x24, +0x93,0x55,0x00,0x08, +0x00,0x00,0x00,0x00, +0x01,0x80,0x02,0x3C, +0x25,0xB0,0x03,0x3C, +0xF8,0x65,0x42,0x24, +0x18,0x03,0x63,0x34, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x62,0xAC, +0x08,0x00,0xE0,0x03, +0x14,0x5E,0x80,0xAC, +0x42,0xB0,0x02,0x3C, +0x03,0x00,0x47,0x34, +0x00,0x00,0xE3,0x90, +0xFF,0x00,0x84,0x30, +0x04,0x00,0x84,0x24, +0xFF,0x00,0x65,0x30, +0x01,0x00,0x02,0x24, +0x04,0x30,0x82,0x00, +0x07,0x18,0x85,0x00, +0x25,0xB0,0x02,0x3C, +0xE8,0x03,0x42,0x34, +0x01,0x00,0x63,0x30, +0x21,0x20,0xC0,0x00, +0x00,0x00,0x45,0xA0, +0x02,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0xA0, +0x08,0x00,0xE0,0x03, +0x24,0x10,0x85,0x00, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x02,0x80,0x02,0x3C, +0x08,0xE4,0x42,0x24, +0x04,0x00,0x45,0x8C, +0x00,0x00,0x82,0xAC, +0x04,0x00,0x44,0xAC, +0x00,0x00,0xA4,0xAC, +0x04,0x00,0x85,0xAC, +0x00,0x60,0x83,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x60,0x03,0x40, +0x01,0x00,0x61,0x34, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x04,0x00,0x85,0x8C, +0x00,0x00,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA2,0xAC, +0x04,0x00,0x45,0xAC, +0x00,0x00,0x84,0xAC, +0x04,0x00,0x84,0xAC, +0x00,0x60,0x83,0x40, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x24,0x04,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x18,0x04,0x00, +0x21,0x18,0x64,0x00, +0x80,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x1C,0x24,0x64,0x8C, +0xFF,0xF1,0x02,0x24, +0x24,0x20,0x82,0x00, +0x08,0x00,0xE0,0x03, +0x1C,0x24,0x64,0xAC, +0x02,0x24,0x04,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x18,0x04,0x00, +0x21,0x18,0x64,0x00, +0x80,0x18,0x03,0x00, +0x21,0x18,0x64,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x21,0x18,0x62,0x00, +0x1C,0x24,0x64,0x8C, +0xFF,0xF1,0x02,0x24, +0x24,0x20,0x82,0x00, +0x00,0x02,0x84,0x34, +0x08,0x00,0xE0,0x03, +0x1C,0x24,0x64,0xAC, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0xC0,0x80,0x04,0x00, +0x21,0x80,0x04,0x02, +0x80,0x80,0x10,0x00, +0x21,0x80,0x04,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x80,0x10,0x00, +0x21,0x80,0x02,0x02, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x24,0x05,0x8E, +0xFF,0x1F,0x02,0x3C, +0x25,0xB0,0x12,0x3C, +0xFF,0xFF,0x42,0x34, +0x14,0x24,0x02,0xAE, +0x84,0x01,0x43,0x36, +0xF8,0xFF,0x02,0x24, +0x00,0x00,0x66,0x8C, +0x24,0x28,0xA2,0x00, +0xFF,0xFE,0x02,0x24, +0x24,0x28,0xA2,0x00, +0xFF,0xEF,0x03,0x24, +0x24,0x28,0xA3,0x00, +0x18,0x24,0x06,0xAE, +0x1C,0x24,0x05,0xAE, +0xC9,0x24,0x00,0x0C, +0x21,0x88,0x80,0x00, +0x1E,0x24,0x02,0x92, +0x21,0x88,0x32,0x02, +0x1C,0x00,0xBF,0x8F, +0x60,0x01,0x22,0xA2, +0x18,0x00,0xB2,0x8F, +0x08,0x24,0x00,0xAE, +0xEC,0x23,0x00,0xAE, +0xF0,0x23,0x00,0xAE, +0xF4,0x23,0x00,0xAE, +0xF8,0x23,0x00,0xAE, +0xFC,0x23,0x00,0xAE, +0x00,0x24,0x00,0xAE, +0x04,0x24,0x00,0xAE, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xFF,0x00,0xA5,0x30, +0xC0,0x10,0x05,0x00, +0x21,0x10,0x45,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x45,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x1C,0x24,0x43,0x8C, +0x25,0xB0,0x05,0x3C, +0xFF,0x00,0xC6,0x30, +0x21,0x30,0xC5,0x00, +0xAF,0x01,0xC2,0x90, +0x07,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x65,0x00, +0xFF,0x00,0x88,0x30, +0xFF,0x00,0x49,0x30, +0x84,0x01,0x66,0x8C, +0x21,0x50,0x00,0x00, +0x21,0x58,0x00,0x00, +0x2B,0x00,0x20,0x11, +0x21,0x20,0x00,0x01, +0x2B,0x00,0xC0,0x10, +0x2B,0x10,0x09,0x01, +0x21,0x28,0x00,0x00, +0x2D,0x5A,0x00,0x08, +0x01,0x00,0x07,0x24, +0xFF,0x00,0x65,0x30, +0x1D,0x00,0xA2,0x2C, +0x07,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x25, +0x04,0x10,0xA7,0x00, +0x24,0x10,0x46,0x00, +0xF9,0xFF,0x40,0x10, +0x01,0x00,0xA3,0x24, +0x21,0x58,0xA0,0x00, +0xFF,0xFF,0x02,0x25, +0xFF,0x00,0x45,0x30, +0x2B,0x18,0xAB,0x00, +0x0F,0x00,0x60,0x14, +0x2B,0x10,0x49,0x01, +0x01,0x00,0x04,0x24, +0x04,0x10,0xA4,0x00, +0x24,0x10,0x46,0x00, +0xFF,0xFF,0xA7,0x24, +0x04,0x00,0x40,0x10, +0x01,0x00,0x43,0x25, +0x17,0x00,0x49,0x11, +0xFF,0x00,0x6A,0x30, +0x21,0x40,0xA0,0x00, +0xFF,0x00,0xE5,0x30, +0x2B,0x10,0xAB,0x00, +0xF6,0xFF,0x40,0x10, +0x04,0x10,0xA4,0x00, +0x2B,0x10,0x49,0x01, +0x08,0x00,0x40,0x10, +0x21,0x20,0x00,0x01, +0x23,0x10,0x2A,0x01, +0x2A,0x10,0x62,0x01, +0x04,0x00,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x69,0x01, +0x21,0x10,0x4A,0x00, +0xFF,0x00,0x44,0x30, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xFD,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x09,0x01, +0x4E,0x5A,0x00,0x08, +0xFF,0x00,0x44,0x30, +0x21,0x20,0x00,0x01, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x25,0xB0,0x06,0x3C, +0x1C,0x24,0x43,0x8C, +0xFF,0x00,0xA5,0x30, +0x21,0x20,0x86,0x00, +0x21,0x28,0xA6,0x00, +0x60,0x01,0x82,0x90, +0xAF,0x01,0xA4,0x90, +0x07,0x00,0x63,0x30, +0x80,0x18,0x03,0x00, +0x21,0x18,0x66,0x00, +0xFF,0x00,0x48,0x30, +0xFF,0x00,0x89,0x30, +0x84,0x01,0x66,0x8C, +0x21,0x50,0x00,0x00, +0x21,0x58,0x00,0x00, +0x2B,0x00,0x20,0x11, +0x21,0x20,0x00,0x01, +0x2B,0x00,0xC0,0x10, +0x2B,0x10,0x09,0x01, +0x21,0x28,0x00,0x00, +0x7B,0x5A,0x00,0x08, +0x01,0x00,0x07,0x24, +0xFF,0x00,0x65,0x30, +0x1D,0x00,0xA2,0x2C, +0x07,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x25, +0x04,0x10,0xA7,0x00, +0x24,0x10,0x46,0x00, +0xF9,0xFF,0x40,0x10, +0x01,0x00,0xA3,0x24, +0x21,0x58,0xA0,0x00, +0xFF,0xFF,0x02,0x25, +0xFF,0x00,0x45,0x30, +0x2B,0x18,0xAB,0x00, +0x0F,0x00,0x60,0x14, +0x2B,0x10,0x49,0x01, +0x01,0x00,0x04,0x24, +0x04,0x10,0xA4,0x00, +0x24,0x10,0x46,0x00, +0xFF,0xFF,0xA7,0x24, +0x04,0x00,0x40,0x10, +0x01,0x00,0x43,0x25, +0x17,0x00,0x49,0x11, +0xFF,0x00,0x6A,0x30, +0x21,0x40,0xA0,0x00, +0xFF,0x00,0xE5,0x30, +0x2B,0x10,0xAB,0x00, +0xF6,0xFF,0x40,0x10, +0x04,0x10,0xA4,0x00, +0x2B,0x10,0x49,0x01, +0x08,0x00,0x40,0x10, +0x21,0x20,0x00,0x01, +0x23,0x10,0x2A,0x01, +0x2A,0x10,0x62,0x01, +0x04,0x00,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x69,0x01, +0x21,0x10,0x4A,0x00, +0xFF,0x00,0x44,0x30, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xFD,0xFF,0x40,0x14, +0x21,0x20,0x00,0x00, +0x23,0x10,0x09,0x01, +0x9C,0x5A,0x00,0x08, +0xFF,0x00,0x44,0x30, +0x21,0x20,0x00,0x01, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x80,0x00, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x10,0x00,0xB0,0xAF, +0x30,0x1F,0x50,0x24, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x88,0x00,0x00, +0x21,0x90,0x00,0x02, +0xDD,0x59,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x1E,0x24,0x02,0x92, +0x21,0x28,0x00,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x52,0x00, +0x60,0x05,0x44,0x8C, +0xD4,0x05,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x21,0x18,0x64,0x00, +0x42,0x18,0x03,0x00, +0xE8,0x23,0x03,0xAE, +0x21,0x10,0x05,0x02, +0x01,0x00,0xA5,0x24, +0x1D,0x00,0xA3,0x28, +0x5A,0x24,0x40,0xA0, +0x20,0x24,0x40,0xA0, +0xFA,0xFF,0x60,0x14, +0x3D,0x24,0x40,0xA0, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x78,0x24,0x00,0xAE, +0xE9,0xFF,0x40,0x14, +0x94,0x00,0x10,0x26, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x28,0x00,0xB6,0xAF, +0x02,0x80,0x16,0x3C, +0x24,0x00,0xB5,0xAF, +0x30,0x1F,0xC6,0x26, +0x2C,0x00,0xBF,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x30,0x38,0xC2,0x8C, +0xFF,0x00,0x8D,0x30, +0xFF,0x00,0x03,0x24, +0xFF,0xFF,0x42,0x38, +0x21,0xA8,0x00,0x00, +0xFF,0xFF,0x04,0x34, +0x0A,0xA8,0x62,0x00, +0xA4,0x00,0xA0,0x11, +0x30,0x38,0xC4,0xAC, +0x02,0x80,0x02,0x3C, +0xE4,0xE7,0x45,0x24, +0x04,0x05,0xC4,0x24, +0xEB,0x5A,0x00,0x08, +0x21,0x80,0x00,0x00, +0x01,0x00,0x10,0x26, +0x00,0x00,0x82,0xA0, +0x1D,0x00,0x02,0x2A, +0x0B,0x00,0x40,0x10, +0x01,0x00,0x84,0x24, +0x21,0x10,0x05,0x02, +0x00,0x00,0x42,0x90, +0x00,0x00,0x00,0x00, +0xF7,0xFF,0x40,0x10, +0xFD,0xFF,0x43,0x24, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0x00,0x00,0x83,0xA0, +0xF7,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4A,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x7C,0xE5,0x6C,0x24, +0x04,0xE5,0x4B,0x24, +0x21,0x80,0x00,0x00, +0x21,0x48,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x40,0x2A,0x01, +0x21,0x38,0x2C,0x01, +0x21,0x10,0xE6,0x00, +0x91,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x06,0x01, +0x01,0x00,0xC6,0x24, +0x05,0x00,0xC2,0x28, +0x39,0x04,0x64,0xA0, +0xF8,0xFF,0x40,0x14, +0xA8,0x03,0x65,0xA0, +0x21,0x10,0x0B,0x02, +0x1D,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x0A,0x02, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0xE7,0x04,0x64,0xA0, +0xCA,0x04,0x65,0xA0, +0xEB,0xFF,0x40,0x14, +0x05,0x00,0x29,0x25, +0x9A,0x00,0xA0,0x11, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x48,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x69,0x24, +0x04,0xE8,0x47,0x24, +0x21,0x80,0x00,0x00, +0x80,0x18,0x10,0x00, +0x21,0x10,0x69,0x00, +0x21,0x20,0x67,0x00, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x85,0x8C, +0x01,0x00,0x10,0x26, +0x21,0x18,0x68,0x00, +0x04,0x00,0x02,0x2A, +0x60,0x05,0x65,0xAC, +0xF6,0xFF,0x40,0x14, +0xD4,0x05,0x66,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x49,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x68,0x24, +0x04,0xE8,0x47,0x24, +0x04,0x00,0x10,0x24, +0x80,0x20,0x10,0x00, +0x21,0x10,0x88,0x00, +0x21,0x30,0x87,0x00, +0x00,0x00,0x45,0x8C, +0x00,0x00,0xC3,0x8C, +0x01,0x00,0x10,0x26, +0x21,0x20,0x89,0x00, +0x82,0x28,0x05,0x00, +0x82,0x18,0x03,0x00, +0x1D,0x00,0x02,0x2A, +0x60,0x05,0x83,0xAC, +0xF4,0xFF,0x40,0x14, +0xD4,0x05,0x85,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x53,0x24, +0x21,0x80,0x00,0x00, +0x21,0xA0,0x60,0x02, +0x21,0x90,0x00,0x00, +0x46,0x5B,0x00,0x08, +0x21,0x88,0x60,0x02, +0x01,0x00,0x10,0x26, +0x20,0x00,0x02,0x2A, +0x94,0x00,0x31,0x26, +0x32,0x00,0x40,0x10, +0x94,0x00,0x52,0x26, +0x1C,0x24,0x24,0x8E, +0x01,0x00,0x03,0x24, +0x02,0x13,0x04,0x00, +0x01,0x00,0x42,0x30, +0xF6,0xFF,0x43,0x14, +0x07,0x00,0x82,0x30, +0x25,0xB0,0x03,0x3C, +0x80,0x10,0x02,0x00, +0x21,0x10,0x43,0x00, +0x84,0x01,0x45,0x8C, +0x14,0x24,0x23,0x8E, +0x21,0x20,0x00,0x02, +0x24,0x28,0xA3,0x00, +0xC9,0x24,0x00,0x0C, +0x18,0x24,0x25,0xAE, +0x1E,0x24,0x24,0x92, +0x57,0x24,0x00,0x0C, +0xFF,0x00,0x05,0x32, +0x1E,0x24,0x23,0x92, +0xEC,0x23,0x20,0xAE, +0xF0,0x23,0x20,0xAE, +0x80,0x18,0x03,0x00, +0xF4,0x23,0x20,0xAE, +0xF8,0x23,0x20,0xAE, +0xFC,0x23,0x20,0xAE, +0x00,0x24,0x20,0xAE, +0x04,0x24,0x20,0xAE, +0x08,0x24,0x20,0xAE, +0x21,0x18,0x74,0x00, +0x60,0x05,0x64,0x8C, +0xD4,0x05,0x62,0x8C, +0x21,0x30,0x00,0x00, +0x21,0x28,0x53,0x02, +0x21,0x10,0x44,0x00, +0x42,0x10,0x02,0x00, +0xE8,0x23,0x22,0xAE, +0x21,0x10,0xA6,0x00, +0x01,0x00,0xC6,0x24, +0x1D,0x00,0xC3,0x28, +0x5A,0x24,0x40,0xA0, +0x20,0x24,0x40,0xA0, +0xFA,0xFF,0x60,0x14, +0x3D,0x24,0x40,0xA0, +0x01,0x00,0x10,0x26, +0x20,0x00,0x02,0x2A, +0x78,0x24,0xA0,0xAC, +0x94,0x00,0x31,0x26, +0xD0,0xFF,0x40,0x14, +0x94,0x00,0x52,0x26, +0x02,0x00,0xA0,0x16, +0x30,0x1F,0xC2,0x26, +0x30,0x38,0x40,0xAC, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0xE4,0xE7,0x45,0x24, +0x04,0x05,0xC4,0x24, +0x21,0x80,0x00,0x00, +0x21,0x10,0x05,0x02, +0x00,0x00,0x43,0x90, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0x00,0x00,0x83,0xA0, +0xFA,0xFF,0x40,0x14, +0x01,0x00,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4A,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xA0,0xE6,0x6C,0x24, +0x40,0xE5,0x4B,0x24, +0x21,0x80,0x00,0x00, +0x21,0x48,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x40,0x2A,0x01, +0x21,0x38,0x2C,0x01, +0x21,0x10,0xE6,0x00, +0x91,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x06,0x01, +0x01,0x00,0xC6,0x24, +0x05,0x00,0xC2,0x28, +0x39,0x04,0x64,0xA0, +0xF8,0xFF,0x40,0x14, +0xA8,0x03,0x65,0xA0, +0x21,0x10,0x0B,0x02, +0x1D,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x0A,0x02, +0x01,0x00,0x10,0x26, +0x1D,0x00,0x02,0x2A, +0xE7,0x04,0x64,0xA0, +0xCA,0x04,0x65,0xA0, +0xEB,0xFF,0x40,0x14, +0x05,0x00,0x29,0x25, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x49,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x68,0x24, +0x04,0xE8,0x47,0x24, +0x21,0x80,0x00,0x00, +0x80,0x18,0x10,0x00, +0x21,0x10,0x68,0x00, +0x21,0x20,0x67,0x00, +0x00,0x00,0x46,0x8C, +0x00,0x00,0x85,0x8C, +0x01,0x00,0x10,0x26, +0x21,0x18,0x69,0x00, +0x1D,0x00,0x02,0x2A, +0x60,0x05,0x65,0xAC, +0xF6,0xFF,0x40,0x14, +0xD4,0x05,0x66,0xAC, +0x3B,0x5B,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xD8,0xFF,0xBD,0x27, +0xFF,0xFF,0x84,0x30, +0x18,0x00,0xB2,0xAF, +0xF0,0x01,0x92,0x30, +0x02,0x91,0x12,0x00, +0x14,0x00,0xB1,0xAF, +0xC0,0x88,0x12,0x00, +0x21,0x88,0x32,0x02, +0x80,0x88,0x11,0x00, +0x21,0x88,0x32,0x02, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x88,0x11,0x00, +0x21,0x88,0x22,0x02, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB3,0xAF, +0x10,0x00,0xB0,0xAF, +0x1C,0x24,0x30,0x8E, +0x00,0x02,0x82,0x30, +0xFF,0xFE,0x03,0x24, +0x2B,0x10,0x02,0x00, +0x00,0x10,0x10,0x36, +0x24,0x80,0x03,0x02, +0x00,0x12,0x02,0x00, +0x25,0x80,0x02,0x02, +0x14,0x24,0x25,0xAE, +0x1C,0x24,0x30,0xAE, +0x76,0x25,0x00,0x0C, +0x21,0x98,0xA0,0x00, +0xF8,0xFF,0x03,0x24, +0x24,0x80,0x03,0x02, +0x07,0x00,0x42,0x30, +0x25,0x80,0x02,0x02, +0x07,0x00,0x03,0x32, +0x25,0xB0,0x02,0x3C, +0x80,0x18,0x03,0x00, +0x1C,0x24,0x30,0xAE, +0x21,0x18,0x62,0x00, +0x84,0x01,0x62,0x8C, +0x21,0x20,0x40,0x02, +0x24,0x10,0x53,0x00, +0xC9,0x24,0x00,0x0C, +0x18,0x24,0x22,0xAE, +0x1E,0x24,0x24,0x92, +0x21,0x28,0x40,0x02, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x57,0x24,0x00,0x08, +0x28,0x00,0xBD,0x27, +0xDD,0x59,0x00,0x08, +0xFF,0x00,0x84,0x30, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x43,0x24, +0x1F,0x00,0x04,0x24, +0x1C,0x24,0x62,0x8C, +0xFF,0xFF,0x84,0x24, +0x00,0x10,0x42,0x34, +0x1C,0x24,0x62,0xAC, +0xFB,0xFF,0x81,0x04, +0x94,0x00,0x63,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x44,0x00,0x02,0x24, +0x10,0x00,0xA2,0xA3, +0x49,0x00,0x03,0x24, +0x47,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0xD4,0xF3,0xE7,0x24, +0x11,0x00,0xA3,0xA3, +0x12,0x00,0xA2,0xA3, +0x10,0x27,0x03,0x24, +0x01,0x00,0x02,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x20,0x73,0xC6,0x24, +0x0C,0x00,0xE3,0xAC, +0x14,0x00,0xE2,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD0,0xFF,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x2C,0x00,0xBF,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x03,0x0D,0x64,0x34, +0x00,0x00,0x82,0x90, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x54,0x30, +0x70,0x00,0x93,0x32, +0x5D,0x00,0x60,0x12, +0x42,0x00,0x63,0x34, +0x8F,0x00,0x82,0x32, +0x00,0x00,0x82,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x55,0x00,0x60,0x12, +0x00,0x00,0x00,0x00, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x11,0x3C, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x21,0xA8,0x40,0x00, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x21,0x20,0x00,0x00, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x21,0xB0,0x40,0x00, +0x00,0x60,0x92,0x40, +0x64,0x00,0x04,0x24, +0x54,0x22,0x00,0x0C, +0x08,0x00,0x10,0x3C, +0xFF,0xFF,0x10,0x36, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x01,0x00,0x12,0x3C, +0x24,0x30,0xB0,0x02, +0x25,0x30,0xD2,0x00, +0xFF,0xFF,0x25,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x24,0x80,0xD0,0x02, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x25,0x30,0x12,0x02, +0xFF,0xFF,0x25,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x10,0x3C, +0x18,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x36, +0x21,0x88,0x40,0x00, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x18,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x00,0x80,0x26,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0x25,0x00,0x60,0x16, +0x25,0xB0,0x02,0x3C, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x25,0xB0,0x02,0x3C, +0x42,0x00,0x42,0x34, +0x30,0x00,0xBD,0x27, +0x00,0x00,0x40,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x00,0x60,0x12,0x40, +0x01,0x00,0x41,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x0F,0x00,0x10,0x3C, +0x18,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x36, +0x21,0x88,0x40,0x00, +0x00,0x60,0x92,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x18,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x00,0x80,0x26,0x36, +0x25,0x22,0x00,0x0C, +0x03,0x00,0x04,0x24, +0xDD,0xFF,0x60,0x12, +0x25,0xB0,0x02,0x3C, +0x03,0x0D,0x42,0x34, +0x00,0x00,0x54,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x0F,0x00,0x10,0x3C, +0x21,0x30,0xA0,0x02, +0xFF,0xFF,0x05,0x36, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x36, +0x21,0x30,0xC0,0x02, +0x5F,0x47,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x20,0x00,0x00, +0xE6,0x44,0x00,0x08, +0x30,0x00,0xBD,0x27, +0xC8,0xFF,0xBD,0x27, +0x28,0x00,0xB4,0xAF, +0x02,0x80,0x14,0x3C, +0x30,0x00,0xB6,0xAF, +0x34,0x00,0xBF,0xAF, +0x2C,0x00,0xB5,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x30,0x1F,0x85,0x26, +0x0C,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x17,0x02,0x00, +0x01,0x00,0x42,0x30, +0x08,0x00,0x40,0x14, +0x06,0x00,0x16,0x24, +0x08,0x00,0xA2,0x8C, +0x01,0x00,0x03,0x24, +0x42,0x17,0x02,0x00, +0x03,0x00,0x42,0x30, +0x57,0x00,0x43,0x10, +0x25,0xB0,0x02,0x3C, +0x30,0x1F,0x85,0x26, +0x0C,0x00,0xA2,0x8C, +0x01,0x00,0x03,0x24, +0x82,0x17,0x02,0x00, +0x01,0x00,0x44,0x30, +0x0B,0x00,0x83,0x10, +0x21,0x10,0x00,0x00, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x08,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x42,0x17,0x02,0x00, +0x03,0x00,0x43,0x30, +0xF1,0xFF,0x64,0x14, +0x21,0x10,0x00,0x00, +0x10,0x00,0xA2,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x17,0x02,0x00, +0x50,0x02,0x43,0x10, +0x25,0xB0,0x02,0x3C, +0xC7,0x02,0xB3,0x90, +0x62,0x0C,0x42,0x34, +0xFF,0x00,0x63,0x32, +0x00,0x00,0x43,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x90,0x26, +0xC6,0x02,0x02,0x92, +0x00,0x00,0x00,0x00, +0x83,0x00,0x40,0x10, +0x01,0x00,0x02,0x24, +0x25,0xB0,0x11,0x3C, +0x03,0x0D,0x23,0x36, +0x00,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x70,0x00,0x42,0x30, +0xA9,0x00,0x40,0x14, +0xCC,0x00,0x02,0x24, +0xC4,0x02,0x02,0x96, +0x00,0x00,0x00,0x00, +0x23,0x20,0x53,0x00, +0x2B,0x18,0x53,0x00, +0x23,0x10,0x62,0x02, +0x0A,0x10,0x83,0x00, +0x03,0x00,0x42,0x2C, +0x76,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xC4,0x02,0x03,0x92, +0x63,0x0C,0x22,0x36, +0x21,0x20,0x00,0x00, +0x00,0x00,0x43,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x30,0x1F,0x83,0x26, +0xC3,0x02,0x62,0x90, +0x08,0x00,0x66,0x8C, +0xC2,0x02,0x73,0xA0, +0x23,0x20,0x53,0x00, +0x02,0x2C,0x06,0x00, +0x2B,0x40,0x62,0x02, +0x23,0x90,0x62,0x02, +0x0B,0x90,0x88,0x00, +0x3F,0x00,0xA7,0x30, +0x3F,0x00,0xC6,0x30, +0x24,0x00,0x02,0x24, +0x20,0x00,0x03,0x24, +0x23,0x10,0x46,0x00, +0x91,0x00,0x40,0x16, +0x23,0x20,0x67,0x00, +0xE6,0x5C,0x00,0x08, +0x00,0x00,0x00,0x00, +0x80,0x0C,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x21,0x30,0xA0,0x00, +0xC0,0xFF,0x02,0x3C, +0x24,0x20,0x62,0x00, +0x21,0x88,0x00,0x00, +0xC0,0xFF,0x05,0x3C, +0x42,0x5D,0x00,0x08, +0x18,0x00,0xC3,0x24, +0x01,0x00,0x31,0x26, +0x25,0x00,0x22,0x2E, +0x0D,0x00,0x40,0x10, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0xF8,0xFF,0x44,0x14, +0x04,0x00,0x63,0x24, +0x08,0x00,0xC2,0x8C, +0xC0,0xFF,0x03,0x24, +0x3F,0x00,0x24,0x32, +0x24,0x10,0x43,0x00, +0x25,0x10,0x44,0x00, +0x08,0x00,0xC2,0xAC, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x22,0x00,0x03,0x24, +0x42,0x00,0x83,0x10, +0x92,0x00,0x02,0x24, +0x41,0x00,0x82,0x10, +0x25,0xB0,0x02,0x3C, +0x25,0xB0,0x02,0x3C, +0x24,0x0A,0x42,0x34, +0x00,0x00,0x44,0x8C, +0x3F,0x3F,0x03,0x3C, +0x3F,0x3F,0x63,0x34, +0x24,0x20,0x83,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xDE,0x1F,0x53,0x24, +0xE6,0x20,0x72,0x24, +0x21,0x88,0x00,0x00, +0x69,0x5D,0x00,0x08, +0x10,0x00,0xA4,0xAF, +0x39,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x4B,0x00,0x40,0x10, +0x30,0x1F,0x85,0x26, +0x01,0x00,0x31,0x26, +0x21,0x00,0x22,0x2E, +0x17,0x00,0x40,0x10, +0x30,0x1F,0x82,0x26, +0xC0,0x80,0x11,0x00, +0x10,0x00,0xA4,0x27, +0x21,0x28,0x13,0x02, +0x39,0x52,0x00,0x0C, +0x04,0x00,0x06,0x24, +0x21,0x28,0x12,0x02, +0x10,0x00,0xA4,0x27, +0xF0,0xFF,0x40,0x14, +0x04,0x00,0x06,0x24, +0x30,0x1F,0x85,0x26, +0x08,0x00,0xA3,0x8C, +0xC0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x3F,0x00,0x24,0x32, +0x24,0x18,0x62,0x00, +0x00,0x24,0x04,0x00, +0xFF,0x7F,0x02,0x3C, +0x25,0x18,0x64,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x08,0x00,0xA3,0xAC, +0x30,0x1F,0x82,0x26, +0x0C,0x00,0x43,0x8C, +0x00,0x40,0x04,0x3C, +0x30,0x1F,0x85,0x26, +0x25,0x18,0x64,0x00, +0x0C,0x00,0x43,0xAC, +0x0C,0x00,0xA2,0x8C, +0x01,0x00,0x03,0x24, +0x82,0x17,0x02,0x00, +0x01,0x00,0x44,0x30, +0x5D,0xFF,0x83,0x14, +0x21,0x10,0x00,0x00, +0xF0,0x5C,0x00,0x08, +0x00,0x00,0x00,0x00, +0xC6,0x02,0x02,0xA2, +0x0A,0x5D,0x00,0x08, +0xC4,0x02,0x13,0xA6, +0x23,0x5C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x1A,0x5D,0x00,0x08, +0xC4,0x02,0x13,0xA6, +0x25,0xB0,0x02,0x3C, +0x88,0x0C,0x42,0x34, +0x00,0x00,0x44,0x8C, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x66,0x24, +0xC0,0xFF,0x02,0x3C, +0x24,0x20,0x82,0x00, +0x21,0x88,0x00,0x00, +0xC0,0xFF,0x05,0x3C, +0xA2,0x5D,0x00,0x08, +0x18,0x00,0xC3,0x24, +0x01,0x00,0x31,0x26, +0x25,0x00,0x22,0x2E, +0xB4,0xFF,0x40,0x10, +0x25,0xB0,0x02,0x3C, +0x00,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x24,0x10,0x45,0x00, +0xF8,0xFF,0x44,0x14, +0x04,0x00,0x63,0x24, +0x08,0x00,0xC2,0x8C, +0x3F,0x00,0x23,0x32, +0xFF,0xC0,0x04,0x24, +0x24,0x10,0x44,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x10,0x43,0x00, +0x54,0x5D,0x00,0x08, +0x08,0x00,0xC2,0xAC, +0x08,0x00,0xA3,0x8C, +0xC0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x3F,0x00,0x24,0x32, +0x24,0x18,0x62,0x00, +0x00,0x24,0x04,0x00, +0x25,0x18,0x64,0x00, +0x00,0x80,0x02,0x3C, +0x7D,0x5D,0x00,0x08, +0x25,0x18,0x62,0x00, +0x63,0x0C,0x23,0x36, +0x00,0x00,0x62,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x24,0x5D,0x00,0x08, +0x30,0x1F,0x83,0x26, +0x71,0x01,0x00,0x11, +0x23,0x28,0xF2,0x00, +0x2B,0x10,0x42,0x02, +0x21,0x18,0xD2,0x00, +0x00,0x00,0x42,0x38, +0x24,0x00,0x08,0x24, +0x2B,0x20,0x44,0x02, +0x0B,0x40,0x62,0x00, +0x06,0x00,0x80,0x10, +0x20,0x00,0x15,0x24, +0x30,0x1F,0x83,0x26, +0x0A,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x3F,0x00,0x42,0x30, +0x21,0xA8,0x52,0x00, +0x2B,0x28,0xC8,0x02, +0x5E,0x01,0xA0,0x10, +0x30,0x1F,0x82,0x26, +0x80,0x10,0x08,0x00, +0x30,0x1F,0x83,0x26, +0x21,0x10,0x43,0x00, +0x18,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x25,0x04,0x00, +0x30,0x1F,0x86,0x26, +0x0C,0x00,0xC3,0x8C, +0x00,0x00,0x00,0x00, +0xFF,0x03,0x67,0x30, +0x47,0x01,0xE0,0x10, +0x00,0x02,0x62,0x30, +0x04,0x00,0x40,0x10, +0x18,0x00,0xE4,0x00, +0x00,0xFC,0x02,0x24, +0x25,0x38,0xE2,0x00, +0x18,0x00,0xE4,0x00, +0x82,0x82,0x03,0x00, +0xFF,0x03,0x10,0x32, +0x00,0x02,0x03,0x32, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x45,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x80,0x02,0x02, +0x18,0x00,0x04,0x02, +0x80,0x1D,0x04,0x00, +0x25,0xB0,0x11,0x3C, +0x80,0x0C,0x24,0x36, +0x94,0x0C,0x31,0x36, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x18,0x62,0x00, +0x25,0x18,0x65,0x00, +0x21,0x28,0x60,0x00, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xA3,0xAF, +0x00,0x00,0x23,0x8E, +0xFF,0x0F,0x02,0x3C, +0xC0,0x03,0x10,0x32, +0xFF,0xFF,0x42,0x34, +0x24,0x18,0x62,0x00, +0x80,0x85,0x10,0x00, +0x25,0x18,0x70,0x00, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x00, +0x10,0x00,0xA3,0xAF, +0x02,0x5C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x83,0x26, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0xB9,0x00,0x40,0x04, +0xC0,0x28,0x15,0x00, +0x21,0x10,0xA3,0x00, +0xAC,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x22,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xAD,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x23,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xAE,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x24,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xAF,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x25,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB0,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x26,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB1,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x27,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB2,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x28,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB3,0x00,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x29,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x22,0x00,0x03,0x24, +0x03,0x00,0x83,0x10, +0x92,0x00,0x02,0x24, +0x73,0xFE,0x82,0x14, +0x21,0x10,0x00,0x00, +0x30,0x1F,0x82,0x26, +0x08,0x00,0x43,0x8C, +0x01,0x00,0x44,0x3A, +0x24,0x00,0x02,0x24, +0x02,0x1A,0x03,0x00, +0x3F,0x00,0x63,0x30, +0x01,0x00,0x84,0x30, +0xF3,0x00,0x80,0x10, +0x23,0x28,0x43,0x00, +0x42,0x18,0x12,0x00, +0x40,0x10,0x03,0x00, +0x21,0x90,0x43,0x00, +0x30,0x1F,0x83,0x26, +0xC3,0x02,0x62,0x90, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x62,0x02, +0xB8,0x00,0x40,0x10, +0x2B,0x10,0x45,0x02, +0x06,0x00,0x40,0x10, +0x24,0x00,0x06,0x24, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x3F,0x00,0x42,0x30, +0x21,0x30,0x52,0x00, +0x2B,0x28,0xC6,0x02, +0xB8,0x00,0xA0,0x10, +0x30,0x1F,0x82,0x26, +0x80,0x10,0x06,0x00, +0x30,0x1F,0x83,0x26, +0x21,0x10,0x43,0x00, +0x18,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x25,0x04,0x00, +0x30,0x1F,0x83,0x26, +0x10,0x00,0x70,0x8C, +0x00,0x00,0x00,0x00, +0x82,0x3A,0x10,0x00, +0xFF,0x03,0xE7,0x30, +0xC5,0x00,0xE0,0x10, +0x00,0x02,0xE2,0x30, +0x04,0x00,0x40,0x10, +0x18,0x00,0xE4,0x00, +0x00,0xFC,0x02,0x24, +0x25,0x38,0xE2,0x00, +0x18,0x00,0xE4,0x00, +0x02,0x85,0x10,0x00, +0xFF,0x03,0x10,0x32, +0x00,0x02,0x03,0x32, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0x03,0x00,0x60,0x10, +0xFF,0x03,0x45,0x30, +0x00,0xFC,0x02,0x24, +0x25,0x80,0x02,0x02, +0x18,0x00,0x04,0x02, +0x80,0x1D,0x04,0x00, +0x25,0xB0,0x11,0x3C, +0x88,0x0C,0x24,0x36, +0x9C,0x0C,0x31,0x36, +0x12,0x80,0x00,0x00, +0x02,0x82,0x10,0x00, +0x3F,0x00,0x02,0x32, +0x00,0x14,0x02,0x00, +0x25,0x18,0x62,0x00, +0x25,0x18,0x65,0x00, +0x21,0x28,0x60,0x00, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xA3,0xAF, +0x00,0x00,0x23,0x8E, +0xFF,0x0F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xC0,0x03,0x10,0x32, +0x24,0x18,0x62,0x00, +0x80,0x85,0x10,0x00, +0x25,0x18,0x70,0x00, +0x21,0x20,0x20,0x02, +0x21,0x28,0x60,0x00, +0x02,0x5C,0x00,0x0C, +0x10,0x00,0xA3,0xAF, +0xE6,0x5C,0x00,0x08, +0x21,0x10,0x00,0x00, +0x21,0x10,0xA3,0x00, +0xB4,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x22,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB5,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x23,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB6,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x24,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB7,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x25,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB8,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x26,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xB9,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x27,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xBA,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x28,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x42,0x24, +0x30,0x1F,0x82,0x26, +0x21,0x10,0xA2,0x00, +0xBB,0x01,0x44,0x90, +0x25,0xB0,0x03,0x3C, +0x29,0x0A,0x63,0x34, +0x00,0x00,0x64,0xA0, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x6E,0x5E,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x36,0x00,0xA0,0x10, +0x80,0x10,0x08,0x00, +0x21,0x10,0x46,0x00, +0x18,0x00,0x45,0x8C, +0x25,0xB0,0x04,0x3C, +0x02,0x5C,0x00,0x0C, +0x80,0x0C,0x84,0x34, +0x25,0xB0,0x04,0x3C, +0x94,0x0C,0x84,0x34, +0x07,0x5E,0x00,0x08, +0x21,0x28,0x00,0x00, +0x30,0x00,0x43,0x8C, +0xDB,0x5D,0x00,0x08, +0x82,0x25,0x03,0x00, +0x23,0x20,0xD2,0x00, +0x2B,0x10,0x46,0x02, +0x2B,0x18,0x47,0x02, +0x21,0x40,0x00,0x00, +0x21,0xA8,0x00,0x00, +0x0B,0x40,0x82,0x00, +0xD2,0x5D,0x00,0x08, +0x0B,0xA8,0xA3,0x00, +0x08,0x00,0x62,0x8C, +0x00,0x00,0x00,0x00, +0x02,0x12,0x02,0x00, +0x3F,0x00,0x42,0x30, +0x2B,0x18,0x42,0x02, +0x4A,0xFF,0x60,0x14, +0x23,0x30,0x52,0x00, +0x21,0x30,0x00,0x00, +0x21,0x28,0x00,0x00, +0x30,0x1F,0x82,0x26, +0x30,0x00,0x43,0x8C, +0x96,0x5E,0x00,0x08, +0x82,0x25,0x03,0x00, +0x0F,0x00,0x11,0x3C, +0xFF,0xFF,0x25,0x36, +0x60,0x00,0x06,0x24, +0x5F,0x47,0x00,0x0C, +0x24,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0xE8,0x03,0x04,0x24, +0x00,0x60,0x10,0x40, +0x01,0x00,0x01,0x36, +0x01,0x00,0x21,0x38, +0x00,0x60,0x81,0x40, +0x24,0x00,0x04,0x24, +0x8A,0x47,0x00,0x0C, +0xFF,0xFF,0x25,0x36, +0x1F,0x00,0x53,0x30, +0x00,0x60,0x90,0x40, +0x54,0x22,0x00,0x0C, +0x64,0x00,0x04,0x24, +0x06,0x5D,0x00,0x08, +0x30,0x1F,0x90,0x26, +0x30,0x00,0xC5,0x8C, +0x2C,0x5F,0x00,0x08, +0x25,0xB0,0x04,0x3C, +0x13,0x00,0xA0,0x10, +0x00,0x00,0x00,0x00, +0x80,0x10,0x06,0x00, +0x21,0x10,0x43,0x00, +0x18,0x00,0x45,0x8C, +0x25,0xB0,0x04,0x3C, +0x02,0x5C,0x00,0x0C, +0x88,0x0C,0x84,0x34, +0x25,0xB0,0x04,0x3C, +0x9C,0x0C,0x84,0x34, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0xE6,0x5C,0x00,0x08, +0x21,0x10,0x00,0x00, +0xFF,0xFF,0x43,0x26, +0x42,0x18,0x03,0x00, +0x40,0x10,0x03,0x00, +0x21,0x10,0x43,0x00, +0x80,0x5E,0x00,0x08, +0x01,0x00,0x52,0x24, +0x30,0x00,0x65,0x8C, +0x67,0x5F,0x00,0x08, +0x25,0xB0,0x04,0x3C, +0x00,0xFF,0x84,0x30, +0x02,0x22,0x04,0x00, +0x08,0x00,0x80,0x10, +0x02,0x80,0x02,0x3C, +0xFF,0x00,0x02,0x24, +0x04,0x00,0x82,0x10, +0xCC,0xFF,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x16,0x22,0x43,0xA0, +0x02,0x80,0x02,0x3C, +0x08,0x00,0xE0,0x03, +0x16,0x22,0x44,0xA0, +0x02,0x24,0x04,0x00, +0xFF,0x00,0x84,0x30, +0xC0,0x10,0x04,0x00, +0x21,0x10,0x44,0x00, +0x80,0x10,0x02,0x00, +0x21,0x10,0x44,0x00, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x02,0x00, +0x30,0x1F,0x63,0x24, +0x20,0x00,0x84,0x2C, +0x09,0x00,0x80,0x10, +0x21,0x10,0x43,0x00, +0x0C,0x24,0x43,0x8C, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x02,0x19,0x03,0x00, +0x7F,0x00,0x63,0x30, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xB0,0x55,0x43,0x8C, +0x25,0xB0,0x02,0x3C, +0x74,0x03,0x42,0x34, +0x02,0x19,0x03,0x00, +0x7F,0x00,0x63,0x30, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x85,0x30, +0xD2,0xFF,0xA3,0x24, +0xFE,0xFF,0xA2,0x24, +0xDA,0xFF,0xA4,0x24, +0x04,0x00,0x63,0x2C, +0x08,0x00,0x84,0x2C, +0x06,0x00,0x60,0x14, +0xFF,0x00,0x42,0x30, +0xF0,0xFF,0xA2,0x24, +0xFC,0xFF,0xA3,0x24, +0x16,0x00,0x46,0x2C, +0x03,0x00,0x80,0x10, +0xFF,0x00,0x62,0x30, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xFA,0xFF,0xA3,0x24, +0xFC,0xFF,0xC0,0x10, +0x21,0x10,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0xFF,0x00,0x62,0x30, +0x25,0xB0,0x03,0x3C, +0x03,0x0D,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x08,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x03,0x0D,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0xF7,0x00,0x42,0x30, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x2D,0x0A,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0x3F,0x00,0x42,0x30, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x82,0x24, +0x25,0xB0,0x03,0x3C, +0x2D,0x0A,0x63,0x34, +0x00,0x00,0x62,0x90, +0x21,0x20,0x00,0x00, +0xFF,0x00,0x42,0x30, +0x80,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x01,0x00,0x82,0x24, +0xFF,0x00,0x44,0x30, +0x06,0x00,0x83,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xFF,0x00,0x03,0x3C, +0x82,0x01,0x49,0x34, +0x81,0x01,0x48,0x34, +0x24,0x10,0x83,0x00, +0x02,0x3C,0x02,0x00, +0x00,0xFF,0x63,0x34, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x45,0x24, +0x02,0x32,0x04,0x00, +0x01,0x00,0x02,0x24, +0x24,0x20,0x83,0x00, +0xE6,0x1D,0xA2,0xA0, +0xD4,0x1D,0xA0,0xAC, +0xD8,0x1D,0xA0,0xAC, +0xDC,0x1D,0xA0,0xAC, +0x06,0x00,0x80,0x14, +0xE0,0x1D,0xA0,0xAC, +0x00,0x00,0x02,0x91, +0x00,0x00,0x23,0x91, +0xE4,0x1D,0xA2,0xA0, +0x08,0x00,0xE0,0x03, +0xE5,0x1D,0xA3,0xA0, +0xE5,0x1D,0xA7,0xA0, +0x08,0x00,0xE0,0x03, +0xE4,0x1D,0xA6,0xA0, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x63,0x24, +0xE5,0x1D,0x66,0x90, +0xE4,0x1D,0x65,0x90, +0x25,0xB0,0x02,0x3C, +0x82,0x01,0x44,0x34, +0x81,0x01,0x42,0x34, +0x00,0x00,0x45,0xA0, +0x00,0x00,0x86,0xA0, +0x08,0x00,0xE0,0x03, +0xE6,0x1D,0x60,0xA0, +0x02,0x80,0x08,0x3C, +0x30,0x1F,0x04,0x25, +0xE6,0x1D,0x82,0x90, +0x00,0x00,0x00,0x00, +0x15,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0xD8,0x1D,0x82,0x8C, +0xD4,0x1D,0x85,0x8C, +0x25,0xB0,0x03,0x3C, +0x40,0x11,0x02,0x00, +0x2B,0x10,0xA2,0x00, +0x82,0x01,0x67,0x34, +0x0F,0x00,0x40,0x10, +0x81,0x01,0x66,0x34, +0xE5,0x1D,0x83,0x90, +0xE4,0x1D,0x82,0x90, +0xF0,0x00,0x63,0x30, +0x1F,0x00,0x42,0x30, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0xE3,0xA0, +0x30,0x1F,0x02,0x25, +0x01,0x00,0x03,0x24, +0xE0,0x1D,0x40,0xAC, +0xD4,0x1D,0x40,0xAC, +0xD8,0x1D,0x40,0xAC, +0xDC,0x1D,0x40,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x60,0x00, +0xDC,0x1D,0x82,0x8C, +0x25,0xB0,0x03,0x3C, +0x82,0x01,0x69,0x34, +0x40,0x11,0x02,0x00, +0x2B,0x10,0xA2,0x00, +0x0E,0x00,0x40,0x14, +0x81,0x01,0x66,0x34, +0xE0,0x1D,0x82,0x8C, +0x00,0x00,0x00,0x00, +0x40,0x11,0x02,0x00, +0x2B,0x10,0xA2,0x00, +0x08,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0xE5,0x1D,0x83,0x90, +0xE4,0x1D,0x82,0x90, +0x00,0x00,0x00,0x00, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0x23,0xA1, +0x20,0x60,0x00,0x08, +0x30,0x1F,0x02,0x25, +0xE5,0x1D,0x83,0x90, +0xE4,0x1D,0x82,0x90, +0xF0,0x00,0x63,0x30, +0x7F,0x00,0x42,0x30, +0x00,0x00,0xC2,0xA0, +0x00,0x00,0x23,0xA1, +0x20,0x60,0x00,0x08, +0x30,0x1F,0x02,0x25, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x03,0x3C, +0x33,0x02,0x65,0x34, +0x00,0x11,0x04,0x00, +0x00,0x00,0xA2,0xA0, +0x30,0x02,0x63,0x34, +0x00,0x00,0x65,0x8C, +0x0F,0x00,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x28,0xA2,0x00, +0x01,0x00,0x03,0x24, +0x04,0x18,0x83,0x00, +0x02,0x00,0xA0,0x10, +0x21,0x10,0x00,0x00, +0xFF,0xFF,0x62,0x30, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x25,0xB0,0x11,0x3C, +0x18,0x00,0xB2,0xAF, +0x4C,0x00,0x22,0x36, +0x1C,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0x44,0x90, +0x02,0x80,0x03,0x3C, +0x02,0x00,0x02,0x24, +0xFF,0x00,0x84,0x30, +0x07,0x00,0x82,0x10, +0x30,0x1F,0x72,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x8A,0x36,0x43,0x96, +0x01,0x00,0x02,0x24, +0xF7,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x43,0x90, +0x00,0x00,0x00,0x00, +0xF2,0xFF,0x60,0x14, +0x21,0x20,0x00,0x00, +0x4C,0x60,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x04,0x00,0x04,0x24, +0x4C,0x60,0x00,0x0C, +0x21,0x80,0x40,0x00, +0x25,0x80,0x02,0x02, +0x02,0x80,0x04,0x3C, +0x33,0x02,0x23,0x36, +0x08,0x00,0x02,0x24, +0xFF,0xFF,0x10,0x32, +0x40,0x00,0x27,0x36, +0xEC,0xE8,0x84,0x24, +0x00,0x00,0x62,0xA0, +0xE3,0xFF,0x00,0x16, +0x00,0x00,0x00,0x00, +0x00,0x00,0xE2,0x94, +0x88,0x36,0x43,0x96, +0xFF,0xDF,0x42,0x30, +0x01,0x00,0x63,0x24, +0x00,0x20,0x46,0x34, +0x88,0x36,0x43,0xA6, +0xFF,0xFF,0x65,0x30, +0x00,0x00,0xE2,0xA4, +0x00,0x00,0xE6,0xA4, +0x2F,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x69,0x60,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0x21,0x20,0x82,0x00, +0x00,0x00,0x85,0xAC, +0x21,0x10,0x00,0x00, +0x01,0x00,0x42,0x24, +0xFF,0x00,0x42,0x30, +0x06,0x00,0x43,0x2C, +0xFC,0xFF,0x60,0x14, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0xDF,0x2F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x02,0x80,0x02,0x3C, +0xE8,0x03,0x03,0x24, +0x34,0x5F,0x43,0xAC, +0x18,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xFA,0x5E,0x40,0xA0, +0xFF,0x00,0x85,0x30, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x60,0xA0, +0x08,0x00,0xA4,0x2C, +0x0E,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x16,0x5F,0x60,0xA0, +0xF4,0x5E,0x45,0xA0, +0x2C,0x00,0x80,0x10, +0x02,0x80,0x03,0x3C, +0x80,0x10,0x05,0x00, +0x94,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x02,0x00,0x42,0x34, +0x25,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x02,0x00,0x42,0x34, +0x27,0x10,0x02,0x00, +0x24,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x27,0x10,0x02,0x00, +0x24,0x20,0x82,0x00, +0x02,0x80,0x07,0x3C, +0x41,0xB0,0x02,0x3C, +0x01,0x00,0x03,0x24, +0x00,0x00,0x44,0xAC, +0x10,0x5F,0xE3,0xA0, +0x10,0x5F,0xE6,0x90, +0x02,0x80,0x02,0x3C, +0xD0,0x1B,0xA4,0xAC, +0x11,0x5F,0x46,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x05,0x3C, +0x30,0x1F,0xA5,0x24, +0xD0,0x1B,0xA4,0x8C, +0x00,0x70,0x02,0x3C, +0x27,0x10,0x02,0x00, +0x24,0x20,0x82,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0x08,0x00,0xE0,0x03, +0xD0,0x1B,0xA4,0xAC, +0xE0,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x10,0x3C, +0xF4,0x5E,0x02,0x92, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x21,0x90,0x80,0x00, +0x1C,0x00,0x40,0x10, +0xFF,0x00,0xB1,0x30, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0x42,0x30, +0x1C,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x02,0x80,0x03,0x3C, +0xF6,0x5E,0x62,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x42,0x30, +0x0C,0x00,0x42,0x28, +0x06,0x00,0x40,0x10, +0x08,0x00,0x02,0x24, +0x00,0x00,0x44,0x96, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x83,0x30, +0x1B,0x00,0x62,0x10, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x02,0x92, +0x05,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x0B,0x00,0x43,0x10, +0x02,0x80,0x03,0x3C, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x9B,0x30,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x0C,0x61,0x00,0x08, +0x00,0x08,0x04,0x24, +0x0F,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x24,0x10,0x22,0x02, +0xF2,0xFF,0x40,0x10, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x62,0x90, +0x00,0x00,0x00,0x00, +0x04,0x00,0x42,0x34, +0x0E,0x5F,0x62,0xA0, +0x20,0x61,0x00,0x08, +0x00,0x00,0x00,0x00, +0x0D,0x5F,0x43,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x60,0x14, +0x00,0x10,0x82,0x34, +0x1B,0x61,0x00,0x08, +0x00,0x00,0x42,0xA6, +0x0C,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x1B,0x61,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0xFF,0x00,0xA5,0x30, +0x10,0x00,0xB0,0xAF, +0x14,0x00,0xBF,0xAF, +0x18,0x00,0xA0,0x14, +0xFF,0x00,0x90,0x30, +0x2C,0x00,0x00,0x12, +0x01,0x00,0x05,0x24, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x07,0x24, +0x0C,0x5F,0x67,0xA0, +0x02,0x80,0x08,0x3C, +0x0E,0x5F,0x02,0x91, +0x02,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x02,0x00,0x42,0x34, +0x00,0xF0,0x06,0x34, +0x0E,0x5F,0x02,0xA1, +0x8C,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x42,0xB0,0x02,0x3C, +0x44,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x18,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x43,0xA0, +0x02,0x80,0x02,0x3C, +0x0F,0x5F,0x43,0x90, +0x0F,0x00,0x02,0x24, +0x02,0x80,0x05,0x3C, +0x0F,0x00,0x63,0x30, +0x07,0x00,0x62,0x10, +0x01,0x00,0x04,0x24, +0x0E,0x5F,0xA2,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x34, +0x0E,0x5F,0xA2,0xA0, +0xFE,0x4E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xDB,0xFF,0x00,0x16, +0x02,0x80,0x03,0x3C, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0xFF,0x00,0xA5,0x30, +0x14,0x00,0xB1,0xAF, +0x18,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x03,0x00,0xA0,0x14, +0xFF,0x00,0x91,0x30, +0x3A,0x00,0x20,0x12, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x10,0x3C, +0x0E,0x5F,0x02,0x92, +0xFB,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x02,0xA2, +0x10,0x00,0xA0,0x14, +0x02,0x80,0x03,0x3C, +0x0E,0x5F,0x02,0x92, +0xFE,0xFF,0x03,0x24, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x02,0xA2, +0x19,0x00,0x20,0x16, +0x02,0x80,0x02,0x3C, +0x0E,0x5F,0x02,0x92, +0xFD,0xFF,0x03,0x24, +0x18,0x00,0xBF,0x8F, +0x24,0x10,0x43,0x00, +0x0E,0x5F,0x02,0xA2, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x01,0x00,0x04,0x24, +0x0C,0x5F,0x64,0xA0, +0x0E,0x5F,0x02,0x92, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x42,0x34, +0x0E,0x5F,0x02,0xA2, +0x0D,0x5F,0x62,0x90, +0x02,0x00,0x03,0x24, +0xFF,0x00,0x42,0x30, +0x23,0x00,0x43,0x10, +0x00,0x00,0x00,0x00, +0xFE,0x4E,0x00,0x0C, +0x01,0x00,0x04,0x24, +0xE9,0xFF,0x20,0x12, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x04,0x24, +0x0C,0x5F,0x44,0xA0, +0x0E,0x5F,0x03,0x92, +0x02,0x00,0x04,0x24, +0x21,0x28,0x00,0x00, +0x02,0x00,0x63,0x34, +0x00,0xF0,0x06,0x34, +0x0E,0x5F,0x03,0xA2, +0x8C,0x23,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x42,0xB0,0x02,0x3C, +0x44,0x00,0x03,0x24, +0x03,0x00,0x42,0x34, +0x20,0x00,0xBD,0x27, +0x00,0x00,0x43,0xA0, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0xF5,0x5E,0x64,0x90, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x05,0x24, +0xFF,0x00,0x84,0x30, +0x64,0x31,0x00,0x08, +0x20,0x00,0xBD,0x27, +0x0D,0x30,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x0C,0x00,0x04,0x24, +0x64,0x31,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x90,0x61,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB2,0xAF, +0x0C,0x00,0xB1,0xAF, +0x08,0x00,0xB0,0xAF, +0x21,0x40,0xE0,0x00, +0x21,0x90,0xA0,0x03, +0x21,0x60,0xC0,0x00, +0x21,0x78,0x80,0x00, +0x45,0x00,0xE0,0x14, +0x21,0x50,0xA0,0x00, +0x2B,0x10,0xA6,0x00, +0x78,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x34, +0x2B,0x10,0x46,0x00, +0x8F,0x01,0x40,0x10, +0x21,0x28,0xC0,0x00, +0xFF,0x00,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x10,0x00,0x03,0x24, +0x2B,0x10,0x46,0x00, +0x18,0x00,0x04,0x24, +0x21,0x30,0x60,0x00, +0x0B,0x30,0x82,0x00, +0x02,0x80,0x03,0x3C, +0x06,0x10,0xC5,0x00, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x86,0x00, +0x23,0x30,0x44,0x00, +0x08,0x00,0xC0,0x10, +0x02,0x4C,0x0C,0x00, +0x23,0x10,0x46,0x00, +0x06,0x10,0x4F,0x00, +0x04,0x18,0xCA,0x00, +0x25,0x50,0x62,0x00, +0x04,0x60,0xCC,0x00, +0x04,0x78,0xCF,0x00, +0x02,0x4C,0x0C,0x00, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x87,0x31, +0x02,0x24,0x0F,0x00, +0x12,0x18,0x00,0x00, +0x10,0x28,0x00,0x00, +0x00,0x14,0x05,0x00, +0x25,0x28,0x44,0x00, +0x18,0x00,0x67,0x00, +0x12,0x58,0x00,0x00, +0x2B,0x18,0xAB,0x00, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x08,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x28,0xAC,0x00, +0x2B,0x10,0xAC,0x00, +0x04,0x00,0x40,0x14, +0x2B,0x10,0xAB,0x00, +0x00,0x00,0x42,0x38, +0x21,0x18,0xAC,0x00, +0x0B,0x28,0x62,0x00, +0x23,0x28,0xAB,0x00, +0x1B,0x00,0xA9,0x00, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0xE4,0x31, +0x12,0x18,0x00,0x00, +0x10,0x40,0x00,0x00, +0x00,0x00,0x00,0x00, +0x8F,0x62,0x00,0x08, +0x18,0x00,0x67,0x00, +0x2B,0x10,0xA7,0x00, +0x0A,0x00,0x40,0x10, +0xFF,0xFF,0x02,0x34, +0x10,0x00,0xB2,0x8F, +0x0C,0x00,0xB1,0x8F, +0x08,0x00,0xB0,0x8F, +0x21,0x10,0x80,0x00, +0x21,0x18,0xA0,0x00, +0x00,0x00,0xA4,0xAF, +0x04,0x00,0xA5,0xAF, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x2B,0x10,0x47,0x00, +0xD2,0x00,0x40,0x10, +0x00,0x01,0xE3,0x2C, +0xFF,0x00,0x02,0x3C, +0x10,0x00,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x2B,0x10,0x47,0x00, +0x18,0x00,0x04,0x24, +0x21,0x28,0x60,0x00, +0x0B,0x28,0x82,0x00, +0x06,0x10,0xA8,0x00, +0x02,0x80,0x03,0x3C, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0xCE,0x00,0xC0,0x14, +0x23,0x38,0x46,0x00, +0x2B,0x10,0x0A,0x01, +0x04,0x00,0x40,0x14, +0x23,0x20,0xEC,0x01, +0x2B,0x10,0xEC,0x01, +0x05,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x2B,0x10,0xE4,0x01, +0x23,0x18,0x48,0x01, +0x23,0x50,0x62,0x00, +0x21,0x78,0x80,0x00, +0x04,0x00,0x40,0x12, +0x21,0xC0,0xE0,0x01, +0x21,0xC8,0x40,0x01, +0x00,0x00,0x58,0xAE, +0x04,0x00,0x59,0xAE, +0x00,0x00,0xA2,0x8F, +0x04,0x00,0xA3,0x8F, +0x10,0x00,0xB2,0x8F, +0x0C,0x00,0xB1,0x8F, +0x08,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x53,0x00,0xC0,0x10, +0x01,0x00,0x02,0x24, +0xFF,0xFF,0x02,0x34, +0x2B,0x10,0x4C,0x00, +0x59,0x00,0x40,0x14, +0xFF,0x00,0x02,0x3C, +0x00,0x01,0x83,0x2D, +0x08,0x00,0x02,0x24, +0x21,0x28,0x00,0x00, +0x0A,0x28,0x43,0x00, +0x06,0x10,0xAC,0x00, +0x02,0x80,0x03,0x3C, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0x5B,0x00,0xC0,0x14, +0x00,0x00,0x00,0x00, +0x23,0x50,0x4C,0x01, +0x02,0x4C,0x0C,0x00, +0xFF,0xFF,0x8D,0x31, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x02,0x24,0x0F,0x00, +0x12,0x18,0x00,0x00, +0x10,0x28,0x00,0x00, +0x00,0x14,0x05,0x00, +0x25,0x28,0x44,0x00, +0x18,0x00,0x6D,0x00, +0x12,0x58,0x00,0x00, +0x2B,0x18,0xAB,0x00, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x49,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x08,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x28,0xAC,0x00, +0x2B,0x10,0xAC,0x00, +0x04,0x00,0x40,0x14, +0x2B,0x10,0xAB,0x00, +0x00,0x00,0x42,0x38, +0x21,0x18,0xAC,0x00, +0x0B,0x28,0x62,0x00, +0x23,0x28,0xAB,0x00, +0x1B,0x00,0xA9,0x00, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0xE4,0x31, +0x12,0x18,0x00,0x00, +0x10,0x40,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x18,0x00,0x6D,0x00, +0x00,0x14,0x08,0x00, +0x12,0x58,0x00,0x00, +0x25,0x40,0x44,0x00, +0x2B,0x18,0x0B,0x01, +0x1B,0x00,0xA9,0x00, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x08,0x00,0x60,0x10, +0x00,0x00,0x00,0x00, +0x21,0x40,0x0C,0x01, +0x2B,0x10,0x0C,0x01, +0x04,0x00,0x40,0x14, +0x2B,0x10,0x0B,0x01, +0x21,0x18,0x0C,0x01, +0x00,0x00,0x42,0x38, +0x0B,0x40,0x62,0x00, +0xAB,0xFF,0x40,0x12, +0x23,0x78,0x0B,0x01, +0x06,0xC0,0xCF,0x00, +0x21,0xC8,0x00,0x00, +0x00,0x00,0x58,0xAE, +0x4C,0x62,0x00,0x08, +0x04,0x00,0x59,0xAE, +0x1B,0x00,0x47,0x00, +0x02,0x00,0xE0,0x14, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x02,0x34, +0x12,0x60,0x00,0x00, +0x2B,0x10,0x4C,0x00, +0xAB,0xFF,0x40,0x10, +0x00,0x01,0x83,0x2D, +0xFF,0x00,0x02,0x3C, +0x10,0x00,0x03,0x24, +0xFF,0xFF,0x42,0x34, +0x2B,0x10,0x4C,0x00, +0x18,0x00,0x04,0x24, +0x21,0x28,0x60,0x00, +0x0B,0x28,0x82,0x00, +0x02,0x80,0x03,0x3C, +0x06,0x10,0xAC,0x00, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0xA7,0xFF,0xC0,0x10, +0x00,0x00,0x00,0x00, +0x23,0x38,0x46,0x00, +0x04,0x60,0xCC,0x00, +0x06,0x58,0xEA,0x00, +0x02,0x4C,0x0C,0x00, +0x1B,0x00,0x69,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x8D,0x31, +0x06,0x18,0xEF,0x00, +0x04,0x10,0xCA,0x00, +0x25,0x50,0x43,0x00, +0x02,0x24,0x0A,0x00, +0x12,0x28,0x00,0x00, +0x10,0x40,0x00,0x00, +0x00,0x14,0x08,0x00, +0x25,0x40,0x44,0x00, +0x18,0x00,0xAD,0x00, +0x12,0x28,0x00,0x00, +0x2B,0x18,0x05,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x69,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x05,0x00,0x60,0x10, +0x04,0x78,0xCF,0x00, +0x21,0x40,0x0C,0x01, +0x2B,0x10,0x0C,0x01, +0x93,0x00,0x40,0x10, +0x2B,0x10,0x05,0x01, +0x23,0x40,0x05,0x01, +0x1B,0x00,0x09,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x44,0x31, +0x12,0x18,0x00,0x00, +0x10,0x58,0x00,0x00, +0x00,0x14,0x0B,0x00, +0x25,0x58,0x44,0x00, +0x18,0x00,0x6D,0x00, +0x12,0x28,0x00,0x00, +0x2B,0x18,0x65,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x09,0x01, +0x02,0x00,0x20,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x77,0xFF,0x60,0x10, +0x23,0x50,0x65,0x01, +0x21,0x58,0x6C,0x01, +0x2B,0x10,0x6C,0x01, +0x04,0x00,0x40,0x14, +0x2B,0x10,0x65,0x01, +0x00,0x00,0x42,0x38, +0x21,0x18,0x6C,0x01, +0x0B,0x58,0x62,0x00, +0x6A,0x62,0x00,0x08, +0x23,0x50,0x65,0x01, +0x08,0x00,0x02,0x24, +0x21,0x28,0x00,0x00, +0x0A,0x28,0x43,0x00, +0x02,0x80,0x03,0x3C, +0x06,0x10,0xA8,0x00, +0xB4,0xF0,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x20,0x00,0x02,0x24, +0x21,0x20,0x85,0x00, +0x23,0x30,0x44,0x00, +0x34,0xFF,0xC0,0x10, +0x23,0x38,0x46,0x00, +0x06,0x10,0xEC,0x00, +0x04,0x18,0xC8,0x00, +0x25,0x40,0x62,0x00, +0x06,0x58,0xEA,0x00, +0x02,0x6C,0x08,0x00, +0x1B,0x00,0x6D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x11,0x31, +0x06,0x10,0xEF,0x00, +0x04,0x18,0xCA,0x00, +0x25,0x50,0x62,0x00, +0x02,0x24,0x0A,0x00, +0x04,0x60,0xCC,0x00, +0x12,0x80,0x00,0x00, +0x10,0x48,0x00,0x00, +0x00,0x14,0x09,0x00, +0x25,0x48,0x44,0x00, +0x12,0x28,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x18,0x00,0x11,0x02, +0x12,0x70,0x00,0x00, +0x2B,0x18,0x2E,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x6D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x0A,0x00,0x60,0x10, +0x04,0x78,0xCF,0x00, +0x21,0x48,0x28,0x01, +0x2B,0x10,0x28,0x01, +0x06,0x00,0x40,0x14, +0xFF,0xFF,0xB0,0x24, +0x2B,0x10,0x2E,0x01, +0x03,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x10,0x26, +0x21,0x48,0x28,0x01, +0x23,0x48,0x2E,0x01, +0x1B,0x00,0x2D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0xFF,0xFF,0x44,0x31, +0x12,0x28,0x00,0x00, +0x10,0x58,0x00,0x00, +0x00,0x14,0x0B,0x00, +0x25,0x58,0x44,0x00, +0x18,0x00,0xB1,0x00, +0x12,0x70,0x00,0x00, +0x2B,0x18,0x6E,0x01, +0x00,0x00,0x00,0x00, +0x1B,0x00,0x2D,0x01, +0x02,0x00,0xA0,0x15, +0x00,0x00,0x00,0x00, +0x0D,0x00,0x07,0x00, +0x0B,0x00,0x60,0x10, +0x00,0x14,0x10,0x00, +0x21,0x58,0x68,0x01, +0x2B,0x10,0x68,0x01, +0x06,0x00,0x40,0x14, +0xFF,0xFF,0xA5,0x24, +0x2B,0x10,0x6E,0x01, +0x04,0x00,0x40,0x10, +0x00,0x14,0x10,0x00, +0xFF,0xFF,0xA5,0x24, +0x21,0x58,0x68,0x01, +0x00,0x14,0x10,0x00, +0x25,0x10,0x45,0x00, +0x23,0x58,0x6E,0x01, +0x19,0x00,0x4C,0x00, +0x10,0x28,0x00,0x00, +0x2B,0x18,0x65,0x01, +0x12,0x48,0x00,0x00, +0x05,0x00,0x60,0x14, +0x23,0x20,0x2C,0x01, +0x07,0x00,0xAB,0x14, +0x2B,0x10,0xE9,0x01, +0x05,0x00,0x40,0x10, +0x00,0x00,0x00,0x00, +0x2B,0x10,0x24,0x01, +0x23,0x18,0xA8,0x00, +0x23,0x28,0x62,0x00, +0x21,0x48,0x80,0x00, +0xEA,0xFE,0x40,0x12, +0x23,0x18,0xE9,0x01, +0x23,0x20,0x65,0x01, +0x2B,0x10,0xE3,0x01, +0x23,0x50,0x82,0x00, +0x04,0x28,0xEA,0x00, +0x06,0x18,0xC3,0x00, +0x25,0xC0,0xA3,0x00, +0x06,0xC8,0xCA,0x00, +0x00,0x00,0x58,0xAE, +0x4C,0x62,0x00,0x08, +0x04,0x00,0x59,0xAE, +0x00,0x01,0xC3,0x2C, +0x08,0x00,0x02,0x24, +0x21,0x30,0x00,0x00, +0xE6,0x61,0x00,0x08, +0x0A,0x30,0x43,0x00, +0x00,0x00,0x42,0x38, +0x21,0x18,0x0C,0x01, +0xE0,0x62,0x00,0x08, +0x0B,0x40,0x62,0x00, +0x25,0xB0,0x02,0x3C, +0xFF,0x00,0x03,0x3C, +0xEC,0x02,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xF0,0x8D,0x63,0x24, +0x18,0x03,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x7F,0x00,0x02,0x3C, +0x0D,0xB8,0x44,0x34, +0x80,0x04,0x03,0x3C, +0x25,0x20,0x83,0x00, +0x00,0x08,0x02,0x3C, +0x25,0x20,0x82,0x00, +0x00,0x30,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x25,0x20,0x83,0x00, +0x41,0xB0,0x03,0x3C, +0x00,0x00,0x64,0xAC, +0xD8,0x1B,0x44,0xAC, +0xD0,0x1B,0x44,0xAC, +0x08,0x00,0x63,0x34, +0x86,0x00,0x04,0x24, +0x00,0x00,0x64,0xA4, +0xDC,0x1B,0x44,0xA4, +0xD4,0x1B,0x40,0xAC, +0xDE,0x1B,0x40,0xA4, +0x08,0x00,0xE0,0x03, +0xE0,0x1B,0x44,0xA4, +0x99,0x63,0x00,0x08, +0x00,0x00,0x00,0x00, +0x42,0xB0,0x03,0x3C, +0x01,0x00,0x63,0x34, +0x02,0x00,0x02,0x24, +0xE8,0xFF,0xBD,0x27, +0x00,0x00,0x62,0xA0, +0x10,0x00,0xBF,0xAF, +0xDF,0x2F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x21,0x20,0x00,0x00, +0x01,0x00,0x05,0x24, +0x8C,0x23,0x00,0x0C, +0x00,0x50,0x06,0x24, +0x1F,0x00,0x06,0x3C, +0x10,0x00,0xBF,0x8F, +0x00,0x40,0xC6,0x34, +0x03,0x00,0x04,0x24, +0x01,0x00,0x05,0x24, +0x8C,0x23,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0x18,0x03,0x64,0x34, +0xB8,0x8E,0x42,0x24, +0x00,0x00,0x82,0xAC, +0x30,0x00,0xBE,0xAF, +0x2C,0x00,0xB7,0xAF, +0x28,0x00,0xB6,0xAF, +0x24,0x00,0xB5,0xAF, +0x20,0x00,0xB4,0xAF, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0xB6,0x00,0x63,0x34, +0x00,0x00,0x62,0x90, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x70,0x24, +0xAB,0x1B,0x02,0xA2, +0x28,0x6B,0x00,0x0C, +0x7A,0x36,0x00,0xA2, +0x48,0x01,0x03,0x24, +0x84,0x36,0x03,0xAE, +0x80,0x36,0x03,0xAE, +0xFD,0xFF,0x02,0x3C, +0xFB,0xFF,0x03,0x3C, +0x21,0x98,0x00,0x02, +0x21,0xA0,0x00,0x02, +0xFF,0xFF,0x55,0x34, +0xFF,0xFF,0x76,0x34, +0x21,0x88,0x00,0x00, +0x02,0x80,0x1E,0x3C, +0x02,0x80,0x17,0x3C, +0x21,0x90,0x00,0x02, +0x80,0x10,0x11,0x00, +0x21,0x10,0x51,0x00, +0xC0,0x10,0x02,0x00, +0x21,0x10,0x53,0x00, +0xE8,0x1D,0x42,0x24, +0x07,0x00,0x03,0x24, +0xFF,0xFF,0x63,0x24, +0x00,0x00,0x40,0xA4, +0xFD,0xFF,0x61,0x04, +0x02,0x00,0x42,0x24, +0xC0,0x80,0x11,0x00, +0x18,0x42,0xC4,0x27, +0x21,0x20,0x04,0x02, +0x21,0x28,0x00,0x00, +0x02,0x00,0x06,0x24, +0xF8,0x1D,0x40,0xA6, +0x08,0x52,0x00,0x0C, +0xFA,0x1D,0x40,0xA2, +0x21,0x20,0x13,0x02, +0xE8,0x22,0x83,0x8C, +0xEA,0x5D,0xE7,0x92, +0xBF,0xFF,0x02,0x24, +0x24,0x28,0x62,0x00, +0x01,0x00,0x02,0x24, +0x63,0x00,0xE2,0x10, +0x80,0x07,0xA6,0x34, +0xFF,0xF7,0x03,0x24, +0x24,0x10,0xC3,0x00, +0xFF,0xEF,0x03,0x24, +0x24,0x10,0x43,0x00, +0xE8,0x22,0x82,0xAC, +0x21,0x30,0x14,0x02, +0xE8,0x22,0xC4,0x8C, +0xE7,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x95,0x00, +0x24,0x20,0x96,0x00, +0xFF,0xFD,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0xFF,0xFB,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xEC,0x22,0xC5,0x8C, +0xFF,0xFF,0x42,0x34, +0xFF,0xE7,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0xFF,0xFF,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xFF,0x7F,0x42,0x34, +0xC0,0xFF,0x03,0x24, +0x24,0x28,0xA2,0x00, +0x24,0x20,0x83,0x00, +0x1F,0x00,0x02,0x3C, +0x01,0x00,0x31,0x26, +0x25,0x28,0xA2,0x00, +0x08,0x00,0x84,0x34, +0x20,0x00,0x22,0x2A, +0xE8,0x22,0xC4,0xAC, +0xEC,0x22,0xC5,0xAC, +0xC3,0xFF,0x40,0x14, +0x28,0x00,0x52,0x26, +0x25,0xB0,0x02,0x3C, +0x10,0x00,0x03,0x24, +0xB0,0x03,0x42,0x34, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x43,0xAC, +0x58,0x22,0x84,0x24, +0x21,0x28,0x00,0x00, +0x08,0x52,0x00,0x0C, +0x20,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0xE9,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x3A,0x00,0x60,0x10, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x24,0x03,0x00,0xA2, +0x38,0x70,0x00,0x0C, +0x25,0x03,0x00,0xA2, +0x02,0x80,0x09,0x3C, +0x64,0x57,0x22,0x25, +0x02,0x80,0x0A,0x3C, +0x02,0x80,0x0B,0x3C, +0x02,0x80,0x0C,0x3C, +0x02,0x80,0x0D,0x3C, +0x02,0x80,0x0E,0x3C, +0x02,0x80,0x0F,0x3C, +0x04,0x00,0x42,0xAC, +0x64,0x57,0x22,0xAD, +0x6C,0x57,0x43,0x25, +0x74,0x57,0x64,0x25, +0x7C,0x57,0x85,0x25, +0x84,0x57,0xA6,0x25, +0x8C,0x57,0xC7,0x25, +0x94,0x57,0xE8,0x25, +0x09,0x00,0x02,0x24, +0x04,0x00,0x63,0xAC, +0x6C,0x57,0x43,0xAD, +0x04,0x00,0x84,0xAC, +0x74,0x57,0x64,0xAD, +0x04,0x00,0xA5,0xAC, +0x7C,0x57,0x85,0xAD, +0x04,0x00,0xC6,0xAC, +0x84,0x57,0xA6,0xAD, +0x04,0x00,0xE7,0xAC, +0x8C,0x57,0xC7,0xAD, +0x94,0x57,0xE8,0xAD, +0x04,0x00,0x08,0xAD, +0x34,0x00,0xBF,0x8F, +0x0C,0x3E,0x02,0xA2, +0x32,0x3B,0x00,0xA6, +0x8E,0x3E,0x00,0xA2, +0x30,0x00,0xBE,0x8F, +0x2C,0x00,0xB7,0x8F, +0x28,0x00,0xB6,0x8F, +0x24,0x00,0xB5,0x8F, +0x20,0x00,0xB4,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x43,0x90, +0x00,0x00,0x00,0x00, +0x9C,0xFF,0x67,0x14, +0x80,0x0F,0xA2,0x34, +0xFF,0xF7,0x03,0x24, +0x24,0x10,0xC3,0x00, +0xF0,0x63,0x00,0x08, +0x00,0x10,0x42,0x34, +0xFA,0x6B,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x50,0x6E,0x00,0x0C, +0x30,0x38,0x80,0xAE, +0x6E,0x6F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x64,0x90, +0x92,0x00,0x02,0x24, +0x03,0x00,0x82,0x10, +0x00,0x00,0x00,0x00, +0xCA,0x6F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xB0,0x6F,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x6A,0x6E,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x24, +0x8A,0x36,0x83,0xA6, +0x1E,0x70,0x00,0x0C, +0x88,0x36,0x80,0xA6, +0x1E,0x64,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0xC8,0xFF,0xBD,0x27, +0xB8,0x91,0x63,0x24, +0x18,0x03,0x42,0x34, +0x18,0x00,0xB0,0xAF, +0x34,0x00,0xBF,0xAF, +0x30,0x00,0xB6,0xAF, +0x2C,0x00,0xB5,0xAF, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x20,0x00,0xB2,0xAF, +0x1C,0x00,0xB1,0xAF, +0x00,0x00,0x43,0xAC, +0x21,0x80,0x00,0x00, +0x01,0x00,0x02,0x26, +0xFF,0xFF,0x50,0x30, +0x64,0x00,0x03,0x2E, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0x02,0x26, +0x02,0x80,0x03,0x3C, +0xDB,0x5D,0x68,0x90, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xD8,0x5D,0x4B,0x94, +0xF3,0x5D,0x6A,0x90, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x14,0x3C, +0xFA,0x5D,0x67,0x90, +0xE8,0x5D,0x49,0x90, +0xDA,0x5D,0x83,0x92, +0x02,0x80,0x0C,0x3C, +0x02,0x80,0x02,0x3C, +0xF5,0x5D,0x46,0x90, +0xF8,0x5D,0x85,0x91, +0x25,0xB0,0x04,0x3C, +0xB0,0x03,0x82,0x34, +0x00,0x00,0x4B,0xAC, +0x00,0x00,0x48,0xAC, +0x00,0x00,0x49,0xAC, +0x00,0x00,0x43,0xAC, +0x02,0x80,0x03,0x3C, +0x00,0x00,0x4A,0xAC, +0x0A,0x00,0x88,0x34, +0x00,0x00,0x46,0xAC, +0x00,0x00,0x45,0xAC, +0x00,0x00,0x47,0xAC, +0x1A,0x5E,0x60,0xA4, +0x00,0x00,0x06,0x91, +0x02,0x80,0x02,0x3C, +0x0B,0x00,0x04,0x24, +0x02,0x80,0x16,0x3C, +0xE5,0x5D,0x44,0xA0, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0xC5,0x26, +0x00,0x78,0x03,0x24, +0x08,0x5E,0x40,0xA0, +0xF0,0xFF,0x02,0x24, +0x01,0x00,0x07,0x24, +0x02,0x80,0x15,0x3C, +0xAC,0x1B,0xA3,0xA4, +0xAA,0x1B,0xA2,0xA0, +0xFF,0x07,0x03,0x24, +0xFF,0xFF,0x02,0x24, +0x20,0x00,0xC6,0x30, +0xF8,0x5D,0x87,0xA1, +0xA8,0x1B,0xA7,0xA0, +0xAE,0x1B,0xA3,0xA4, +0x48,0xF3,0xA2,0xA2, +0xB1,0x00,0xC0,0x10, +0xB0,0x1B,0xA0,0xA4, +0x00,0x00,0x02,0x91, +0x00,0x00,0x00,0x00, +0x10,0x00,0x42,0x30, +0xFB,0x00,0x40,0x14, +0x02,0x80,0x13,0x3C, +0x21,0x80,0x00,0x00, +0x21,0x88,0x00,0x00, +0xB8,0xF1,0x72,0x26, +0xFF,0x00,0x24,0x32, +0x61,0x57,0x00,0x0C, +0x21,0x28,0x12,0x02, +0x08,0x00,0x03,0x26, +0xFF,0xFF,0x70,0x30, +0x01,0x00,0x22,0x26, +0x80,0x00,0x03,0x2E, +0xF8,0xFF,0x60,0x14, +0xFF,0xFF,0x51,0x30, +0xDA,0x5D,0x83,0x92, +0x00,0x00,0x00,0x00, +0x02,0x00,0x62,0x30, +0xC1,0x00,0x40,0x14, +0x04,0x00,0x62,0x30, +0x9A,0x00,0x40,0x10, +0x25,0xB0,0x03,0x3C, +0x25,0xB0,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x06,0x00,0x06,0x24, +0x50,0x00,0x84,0x34, +0x10,0x52,0x00,0x0C, +0x07,0xF2,0xA5,0x24, +0xB8,0xF1,0x63,0x26, +0x7B,0x00,0x66,0x90, +0x00,0x00,0x00,0x00, +0x02,0x00,0xC2,0x2C, +0x04,0x00,0x40,0x14, +0x02,0x00,0x0B,0x24, +0x79,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x03,0x00,0x4B,0x30, +0x04,0x00,0xC2,0x2C, +0xDC,0x00,0x40,0x10, +0xB8,0xF1,0x62,0x26, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x40,0xA0, +0x02,0x80,0x02,0x3C, +0xE7,0x5D,0x43,0x90, +0x01,0x00,0x02,0x24, +0x02,0x00,0x62,0x10, +0xFC,0xFF,0x08,0x24, +0x21,0x40,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xB8,0xF1,0x4A,0x24, +0x30,0x1F,0x69,0x24, +0x21,0x60,0x00,0x00, +0x21,0x80,0x00,0x00, +0x01,0x00,0x02,0x26, +0x21,0x30,0x30,0x01, +0x03,0x00,0x03,0x2E, +0x08,0x00,0x04,0x2E, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x07,0x2E, +0x04,0x00,0x60,0x14, +0x21,0x88,0x00,0x00, +0x01,0x00,0x11,0x24, +0x02,0x00,0x02,0x24, +0x0A,0x88,0x44,0x00, +0x21,0x10,0x51,0x01, +0x61,0x00,0x43,0x90, +0x55,0x00,0x44,0x90, +0x5B,0x00,0x45,0x90, +0x21,0x18,0x03,0x01, +0x21,0x20,0x04,0x01, +0x21,0x28,0x05,0x01, +0x9C,0x1D,0xC3,0xA0, +0x64,0x1D,0xC4,0xA0, +0xEB,0xFF,0xE0,0x14, +0x80,0x1D,0xC5,0xA0, +0x01,0x00,0x8C,0x25, +0x02,0x00,0x82,0x2D, +0x0E,0x00,0x29,0x25, +0xE5,0xFF,0x40,0x14, +0x03,0x00,0x4A,0x25, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x47,0x24, +0xB8,0xF1,0x66,0x24, +0x21,0x80,0x00,0x00, +0x03,0x00,0x02,0x2E, +0x21,0x20,0x07,0x02, +0xB9,0x00,0x40,0x10, +0x08,0x00,0x03,0x2E, +0x71,0x00,0xC3,0x90, +0x6E,0x00,0xC2,0x90, +0x00,0x00,0x00,0x00, +0xC6,0x1D,0x82,0xA0, +0xB8,0x1D,0x83,0xA0, +0x01,0x00,0x02,0x26, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x03,0x2E, +0xF4,0xFF,0x60,0x14, +0x03,0x00,0x02,0x2E, +0x03,0x00,0x02,0x24, +0x2A,0x00,0x62,0x15, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xB8,0xF1,0x4E,0x24, +0x34,0xD9,0x6F,0x24, +0x21,0x60,0x00,0x00, +0x21,0x68,0x00,0x00, +0x21,0x10,0xAE,0x01, +0x74,0x00,0x43,0x90, +0x21,0x80,0x00,0x00, +0x0F,0x00,0x6A,0x30, +0x02,0x49,0x03,0x00, +0x21,0x10,0xB0,0x01, +0x00,0x11,0x02,0x00, +0x21,0x58,0x4F,0x00, +0x21,0x38,0x00,0x00, +0x21,0x40,0x67,0x01, +0x00,0x00,0x03,0x91, +0x00,0x31,0x09,0x00, +0x01,0x00,0xE7,0x24, +0x02,0x11,0x03,0x00, +0x00,0x21,0x02,0x00, +0x0F,0x00,0x63,0x30, +0x2B,0x10,0x49,0x00, +0x0A,0x20,0xC2,0x00, +0x2B,0x28,0x6A,0x00, +0x00,0x00,0xA5,0x38, +0x25,0x18,0x83,0x00, +0xFF,0xFF,0xE7,0x30, +0x25,0x20,0x8A,0x00, +0x0A,0x18,0x85,0x00, +0x10,0x00,0xE2,0x2C, +0xEF,0xFF,0x40,0x14, +0x00,0x00,0x03,0xA1, +0x01,0x00,0x02,0x26, +0xFF,0xFF,0x50,0x30, +0x03,0x00,0x03,0x2E, +0xE7,0xFF,0x60,0x14, +0x21,0x10,0xB0,0x01, +0x01,0x00,0x8C,0x25, +0x02,0x00,0x82,0x2D, +0xDD,0xFF,0x40,0x14, +0x03,0x00,0xAD,0x25, +0xE6,0x56,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x48,0xF3,0xA5,0x26, +0x91,0x56,0x00,0x0C, +0xFA,0x01,0x04,0x24, +0xE6,0x56,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x25,0xB0,0x05,0x3C, +0x18,0x3B,0x84,0x24, +0x50,0x00,0xA5,0x34, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0x30,0x1F,0xC5,0x26, +0x01,0x00,0x02,0x24, +0x06,0x00,0x03,0x24, +0x05,0x00,0x04,0x24, +0x33,0x1C,0xA2,0xA0, +0x8A,0x55,0x00,0x0C, +0x30,0x3B,0xA3,0xA0, +0x34,0x00,0xBF,0x8F, +0x30,0x00,0xB6,0x8F, +0x2C,0x00,0xB5,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x38,0x00,0xBD,0x27, +0x25,0xB0,0x03,0x3C, +0x4C,0x87,0x02,0x3C, +0x54,0x00,0x65,0x34, +0x00,0xE0,0x42,0x34, +0x50,0x00,0x63,0x34, +0x00,0x00,0x62,0xAC, +0x12,0x01,0x04,0x24, +0x02,0x80,0x02,0x3C, +0x00,0x00,0xA4,0xAC, +0x30,0x1F,0x46,0x24, +0x21,0x60,0x00,0x00, +0x10,0x00,0x05,0x24, +0x21,0x80,0x00,0x00, +0x01,0x00,0x02,0x26, +0x21,0x18,0xD0,0x00, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x04,0x2E, +0x80,0x1D,0x65,0xA0, +0x64,0x1D,0x65,0xA0, +0xF9,0xFF,0x80,0x14, +0x9C,0x1D,0x65,0xA0, +0x01,0x00,0x8C,0x25, +0x02,0x00,0x82,0x2D, +0xF4,0xFF,0x40,0x14, +0x0E,0x00,0xC6,0x24, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x46,0x24, +0x21,0x80,0x00,0x00, +0x04,0x00,0x05,0x24, +0x01,0x00,0x02,0x26, +0x21,0x18,0x06,0x02, +0xFF,0xFF,0x50,0x30, +0x0E,0x00,0x04,0x2E, +0xC6,0x1D,0x60,0xA0, +0xFA,0xFF,0x80,0x14, +0xB8,0x1D,0x65,0xA0, +0x48,0x65,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x50,0x00,0x84,0x34, +0xCA,0xF1,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x06,0x00,0x06,0x24, +0xB8,0xF1,0x62,0x92, +0xB8,0xF1,0x64,0x26, +0x01,0x00,0x85,0x90, +0x21,0x18,0x40,0x00, +0x10,0x00,0xA2,0xA3, +0x29,0x00,0x02,0x24, +0x11,0x00,0xA5,0xA3, +0x50,0x00,0x86,0x90, +0x3B,0x00,0x62,0x10, +0xFF,0x00,0xA3,0x30, +0xB8,0xF1,0x65,0x26, +0x68,0x00,0xA2,0x90, +0x02,0x80,0x03,0x3C, +0x04,0x00,0xC4,0x2C, +0x1F,0x00,0x42,0x30, +0x24,0x00,0x80,0x14, +0x49,0xF3,0x62,0xA0, +0x7A,0x00,0xA2,0x90, +0x79,0x00,0xA4,0x90, +0x02,0x80,0x03,0x3C, +0x04,0x00,0x42,0x30, +0x83,0x10,0x02,0x00, +0x03,0x00,0x8B,0x30, +0x4A,0xF3,0x62,0xA0, +0x06,0x00,0xC2,0x2C, +0x37,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xB8,0xF1,0x63,0x26, +0x69,0x00,0x62,0x90, +0x00,0x00,0x00,0x00, +0x01,0x00,0x42,0x30, +0x31,0xFF,0x40,0x14, +0x02,0x80,0x02,0x3C, +0xE8,0x64,0x00,0x08, +0x21,0x40,0x00,0x00, +0x21,0x20,0x00,0x00, +0x80,0x00,0x05,0x24, +0x53,0x56,0x00,0x0C, +0xB8,0xF1,0x66,0x26, +0xC7,0x64,0x00,0x08, +0x00,0x00,0x00,0x00, +0x7D,0x00,0x43,0x90, +0x69,0x00,0x44,0x90, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x63,0x30, +0x01,0x00,0x84,0x30, +0x83,0x18,0x03,0x00, +0x01,0x00,0x84,0x2C, +0x1F,0xFF,0x80,0x10, +0x4A,0xF3,0x43,0xA0, +0xE8,0x64,0x00,0x08, +0x21,0x40,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x02,0x00,0x0B,0x24, +0xAA,0x65,0x00,0x08, +0x4A,0xF3,0x40,0xA0, +0x21,0x28,0x07,0x02, +0x06,0x00,0x60,0x10, +0x21,0x20,0xA0,0x00, +0x67,0x00,0xC3,0x90, +0x6F,0x00,0xC2,0x90, +0xB8,0x1D,0xA3,0xA0, +0x17,0x65,0x00,0x08, +0xC6,0x1D,0xA2,0xA0, +0x72,0x00,0xC3,0x90, +0x70,0x00,0xC2,0x90, +0x16,0x65,0x00,0x08, +0xC6,0x1D,0x82,0xA0, +0x81,0x00,0x02,0x24, +0xC4,0xFF,0x62,0x14, +0x01,0x00,0x02,0x24, +0x54,0x00,0x83,0x90, +0x00,0x00,0x00,0x00, +0x0A,0x00,0x62,0x10, +0x02,0x00,0x02,0x24, +0x04,0x00,0x62,0x10, +0x11,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x65,0x00,0x08, +0xDE,0x5D,0x43,0xA0, +0x22,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x65,0x00,0x08, +0xDE,0x5D,0x43,0xA0, +0x12,0x00,0x03,0x24, +0x02,0x80,0x02,0x3C, +0x9C,0x65,0x00,0x08, +0xDE,0x5D,0x43,0xA0, +0xD8,0xFF,0xBD,0x27, +0x18,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0x25,0xB0,0x10,0x3C, +0x18,0x03,0x03,0x36, +0xA8,0x97,0x42,0x24, +0x00,0x00,0x62,0xAC, +0x20,0x00,0xB2,0xAF, +0x02,0x80,0x12,0x3C, +0x24,0x00,0xBF,0xAF, +0x6E,0x64,0x00,0x0C, +0x1C,0x00,0xB1,0xAF, +0x9C,0x66,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x36,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x1A,0x6A,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x7C,0x6C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x82,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x30,0x1F,0x43,0x26, +0x30,0x3B,0x64,0x90, +0x0D,0x0C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x76,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x64,0x40,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x44,0x00,0x03,0x36, +0x00,0x00,0x62,0x94, +0x00,0x00,0x00,0x00, +0x40,0x00,0x42,0x34, +0x00,0x00,0x62,0xA4, +0xAE,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x7C,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x9B,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xE6,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xA3,0x69,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x00,0x80,0x04,0x3C, +0x74,0x6A,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x01,0x00,0x05,0x24, +0x00,0x80,0x04,0x3C, +0x6C,0x72,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x02,0x00,0x05,0x24, +0x00,0x80,0x04,0x3C, +0x48,0x7B,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x04,0x00,0x05,0x24, +0x7E,0x59,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x01,0x80,0x04,0x3C, +0xB8,0x8E,0x84,0x24, +0x03,0x6A,0x00,0x0C, +0x03,0x00,0x05,0x24, +0x02,0x80,0x03,0x3C, +0xE8,0x5D,0x63,0x90, +0x00,0x00,0x00,0x00, +0x60,0x00,0x60,0x10, +0x43,0x00,0x02,0x36, +0x07,0x00,0x02,0x24, +0x0C,0x00,0x62,0x10, +0x03,0x00,0x02,0x24, +0x25,0xB0,0x04,0x3C, +0x43,0x00,0x85,0x34, +0x10,0x02,0x86,0x34, +0x10,0x00,0x03,0x24, +0x00,0x00,0xA2,0xA0, +0xD8,0x00,0x84,0x34, +0x00,0x00,0xC3,0xA0, +0x00,0x00,0x82,0x90, +0x80,0xFF,0x03,0x24, +0x25,0x10,0x43,0x00, +0x00,0x00,0x82,0xA0, +0xE0,0x6A,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x42,0xB0,0x03,0x3C, +0x00,0x00,0x62,0x90, +0x25,0xB0,0x10,0x3C, +0x02,0x80,0x11,0x3C, +0x01,0x00,0x42,0x34, +0x00,0x00,0x62,0xA0, +0x83,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x44,0x00,0x05,0x36, +0x00,0x00,0xA2,0x94, +0x02,0x80,0x03,0x3C, +0x8C,0xC6,0x64,0x8C, +0xC0,0x00,0x42,0x34, +0x00,0x00,0xA2,0xA4, +0x2F,0x55,0x00,0x0C, +0x80,0x0C,0x10,0x36, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xDA,0x5D,0x45,0x90, +0xDF,0x5D,0x66,0x90, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x90,0xC6,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x45,0x90, +0x48,0xF3,0x66,0x90, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xE7,0x5D,0x47,0x90, +0x4A,0xF3,0x62,0x90, +0x02,0x80,0x04,0x3C, +0xA4,0xC6,0x84,0x24, +0x2F,0x55,0x00,0x0C, +0x10,0x00,0xA2,0xAF, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x07,0x8E, +0xE6,0x5D,0x46,0x90, +0xE9,0x5D,0x25,0x92, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xC0,0xC6,0x84,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xEB,0x5D,0x66,0x90, +0xEA,0x5D,0x45,0x90, +0x02,0x80,0x04,0x3C, +0x30,0x1F,0x50,0x26, +0x2F,0x55,0x00,0x0C, +0xDC,0xC6,0x84,0x24, +0xA0,0x3E,0x06,0x8E, +0xA4,0x3E,0x05,0x8E, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0xF0,0xC6,0x84,0x24, +0x02,0x80,0x02,0x3C, +0x49,0xF3,0x45,0x90, +0x02,0x80,0x04,0x3C, +0x2F,0x55,0x00,0x0C, +0x10,0xC7,0x84,0x24, +0xE9,0x5D,0x23,0x92, +0x10,0x27,0x02,0x24, +0x02,0x80,0x04,0x3C, +0x0B,0x10,0x03,0x00, +0x40,0x39,0x02,0xAE, +0x08,0x00,0x84,0x24, +0x21,0x28,0x00,0x00, +0x21,0x30,0x00,0x00, +0x91,0x3C,0x00,0x0C, +0x21,0x38,0x00,0x00, +0x99,0x63,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x24,0x00,0xBF,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xD8,0x00,0x04,0x36, +0x00,0x00,0x40,0xA0, +0x38,0x66,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x20,0x00,0x00, +0x20,0xB0,0x06,0x3C, +0xFF,0xFF,0x05,0x34, +0x21,0x18,0x86,0x00, +0x04,0x00,0x84,0x24, +0x2A,0x10,0xA4,0x00, +0x00,0x00,0x60,0xAC, +0xFB,0xFF,0x40,0x10, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xB8,0xFF,0xBD,0x27, +0x24,0x00,0xB1,0xAF, +0x44,0x00,0xBF,0xAF, +0x40,0x00,0xBE,0xAF, +0x3C,0x00,0xB7,0xAF, +0x38,0x00,0xB6,0xAF, +0x34,0x00,0xB5,0xAF, +0x30,0x00,0xB4,0xAF, +0x2C,0x00,0xB3,0xAF, +0x28,0x00,0xB2,0xAF, +0x20,0x00,0xB0,0xAF, +0x02,0x80,0x02,0x3C, +0xDA,0x5D,0x42,0x90, +0x25,0xB0,0x11,0x3C, +0x58,0x00,0x25,0x36, +0x10,0x00,0xA2,0xAF, +0x4C,0x81,0x02,0x3C, +0x00,0xE0,0x42,0x34, +0x00,0x00,0xA2,0xAC, +0xFF,0xFF,0x04,0x24, +0x96,0x01,0x03,0x24, +0x28,0x28,0x02,0x24, +0x5C,0x00,0x26,0x36, +0x60,0x00,0x27,0x36, +0x64,0x00,0x28,0x36, +0x8A,0x00,0x29,0x36, +0x00,0x00,0xC3,0xAC, +0x00,0x00,0xE4,0xAC, +0x00,0x00,0x04,0xAD, +0x00,0x00,0x22,0xA5, +0x0E,0x0E,0x02,0x3C, +0x09,0x00,0x03,0x24, +0x0A,0x0A,0x42,0x34, +0x89,0x00,0x2A,0x36, +0x8C,0x00,0x2B,0x36, +0x00,0x00,0x43,0xA1, +0x90,0x00,0x2C,0x36, +0x00,0x00,0x62,0xAD, +0x13,0x00,0x03,0x24, +0x30,0x00,0x02,0x24, +0x91,0x00,0x2D,0x36, +0x00,0x00,0x83,0xA1, +0x92,0x00,0x2E,0x36, +0x00,0x00,0xA2,0xA1, +0x3A,0x01,0x03,0x24, +0x21,0x00,0x02,0x24, +0xB5,0x00,0x2F,0x36, +0x00,0x00,0xC3,0xA5, +0x00,0x00,0xE2,0xA1, +0x10,0x00,0xA2,0x8F, +0x12,0x00,0x03,0x24, +0x89,0x01,0x43,0x10, +0x07,0x07,0x02,0x3C, +0x07,0x07,0x42,0x34, +0xA0,0x00,0x24,0x36, +0x00,0x00,0x82,0xAC, +0xA4,0x00,0x25,0x36, +0x00,0x07,0x03,0x24, +0x00,0xC0,0x02,0x3C, +0xA8,0x00,0x26,0x36, +0x00,0x00,0xA3,0xAC, +0x00,0xC4,0x42,0x34, +0x00,0x00,0xC2,0xAC, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x62,0x24, +0xAC,0x1B,0x45,0x94, +0xAE,0x1B,0x46,0x94, +0xAA,0x1B,0x42,0x90, +0x02,0x80,0x03,0x3C, +0x21,0xB0,0x07,0x3C, +0x14,0x00,0xA2,0xA3, +0xE9,0x5D,0x63,0x90, +0x20,0xB0,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x18,0x00,0xA3,0xAF, +0x23,0xB0,0x03,0x3C, +0xFF,0xFF,0x63,0x34, +0x24,0xB0,0x08,0x3C, +0xFF,0x1F,0x04,0x3C, +0x25,0xB0,0x1E,0x3C, +0xFF,0xFF,0x84,0x34, +0x21,0x38,0xA7,0x00, +0x21,0x40,0xC8,0x00, +0x21,0x28,0xA2,0x00, +0x21,0x30,0xC3,0x00, +0x24,0x40,0x04,0x01, +0x24,0x28,0xA4,0x00, +0x24,0x38,0xE4,0x00, +0x24,0x30,0xC4,0x00, +0x35,0x00,0x02,0x24, +0x20,0x00,0xC4,0x37, +0x00,0x00,0x82,0xA0, +0x22,0x00,0x03,0x24, +0x09,0x00,0x02,0x24, +0x03,0x05,0xC9,0x37, +0x60,0x05,0xCA,0x37, +0xAC,0x00,0xCB,0x37, +0xF8,0x00,0xCC,0x37, +0xB0,0x00,0xCD,0x37, +0x08,0x01,0xCE,0x37, +0xD8,0x00,0xCF,0x37, +0x00,0x00,0x23,0xA1, +0x00,0x00,0x42,0xA1, +0x00,0x00,0x65,0xAD, +0x00,0x00,0x87,0xAD, +0x00,0x00,0xA6,0xAD, +0x00,0x00,0xC8,0xAD, +0x00,0x00,0xE0,0xA1, +0x14,0x00,0xA3,0x93, +0x25,0xB0,0x02,0x3C, +0xB4,0x00,0x42,0x34, +0x00,0x00,0x43,0xA0, +0xB6,0x00,0xD1,0x37, +0x04,0x00,0x02,0x24, +0x25,0xB0,0x03,0x3C, +0x00,0x00,0x22,0xA2, +0xB9,0x00,0x63,0x34, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0x62,0xA0, +0x25,0xB0,0x03,0x3C, +0x0F,0x00,0x02,0x24, +0xBA,0x00,0x63,0x34, +0x00,0x00,0x62,0xA4, +0x16,0x01,0xD4,0x37, +0x3F,0x3F,0x03,0x24, +0x2F,0x00,0x02,0x3C, +0x00,0x00,0x83,0xA6, +0x17,0x32,0x42,0x34, +0xFF,0xCF,0x03,0x24, +0x18,0x01,0xD5,0x37, +0x1A,0x01,0xD6,0x37, +0xDC,0x00,0xD7,0x37, +0xD0,0x01,0xD8,0x37, +0x00,0x00,0xA0,0xA6, +0x00,0x00,0xC0,0xA6, +0x00,0x00,0xE3,0xAE, +0x00,0x00,0x02,0xAF, +0x5E,0x00,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x17,0x43,0x63,0x34, +0xD4,0x01,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x10,0x00,0x02,0x3C, +0x20,0x53,0x42,0x34, +0xD8,0x01,0xDF,0x37, +0x00,0x00,0xE2,0xAF, +0x25,0xB0,0x02,0x3C, +0x44,0xA4,0x03,0x34, +0xDC,0x01,0x42,0x34, +0x00,0x00,0x43,0xAC, +0x25,0xB0,0x03,0x3C, +0x1A,0x06,0x02,0x24, +0xE0,0x01,0x63,0x34, +0x00,0x00,0x62,0xA4, +0xC2,0x00,0x02,0x3C, +0x30,0x30,0x03,0x24, +0x51,0x10,0x42,0x34, +0xF4,0x01,0xD0,0x37, +0xF8,0x01,0xD3,0x37, +0x00,0x00,0x03,0xA6, +0x00,0x02,0xD2,0x37, +0x00,0x00,0x62,0xAE, +0x26,0x00,0x03,0x24, +0x03,0x02,0xD9,0x37, +0x04,0x00,0x02,0x24, +0x00,0x00,0x43,0xA6, +0x00,0x00,0x22,0xA3, +0x18,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0xE5,0x00,0x60,0x14, +0x36,0x02,0xC2,0x37, +0x04,0x00,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x02,0x80,0x0B,0x3C, +0xDE,0x5D,0x66,0x91, +0x25,0xB0,0x09,0x3C, +0x80,0x00,0x02,0x24, +0x34,0x02,0x24,0x35, +0x00,0x00,0x82,0xA4, +0x37,0x02,0x25,0x35, +0x53,0x00,0x03,0x24, +0x22,0x00,0x02,0x24, +0x00,0x00,0xA3,0xA0, +0xE6,0x00,0xC2,0x10, +0x1B,0x1B,0x02,0x3C, +0x13,0x13,0x02,0x3C, +0x13,0x13,0x42,0x34, +0x60,0x01,0x23,0x35, +0x64,0x01,0x24,0x35, +0x68,0x01,0x25,0x35, +0x7C,0x01,0x2A,0x35, +0x6C,0x01,0x26,0x35, +0x70,0x01,0x27,0x35, +0x74,0x01,0x28,0x35, +0x78,0x01,0x29,0x35, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x82,0xAC, +0x00,0x00,0xA2,0xAC, +0x00,0x00,0xC2,0xAC, +0x00,0x00,0xE2,0xAC, +0x00,0x00,0x02,0xAD, +0x00,0x00,0x22,0xAD, +0x00,0x00,0x42,0xAD, +0xDE,0x5D,0x65,0x91, +0x25,0xB0,0x0C,0x3C, +0x01,0x00,0x03,0x3C, +0x80,0x01,0x82,0x35, +0x08,0x5F,0x63,0x34, +0x22,0x00,0x04,0x24, +0x00,0x00,0x43,0xAC, +0xE5,0x00,0xA4,0x10, +0x0F,0x1F,0x02,0x3C, +0x92,0x00,0x02,0x24, +0xE2,0x00,0xA2,0x10, +0x0F,0x1F,0x02,0x3C, +0x0F,0x10,0x02,0x3C, +0x00,0xF0,0x4F,0x34, +0xF7,0x01,0x91,0x35, +0x15,0xF0,0x4D,0x34, +0x77,0x00,0x0E,0x24, +0x84,0x01,0x87,0x35, +0x88,0x01,0x88,0x35, +0x10,0xF0,0x44,0x34, +0x8C,0x01,0x85,0x35, +0x05,0xF0,0x42,0x34, +0x00,0x00,0xED,0xAC, +0x90,0x01,0x83,0x35, +0x00,0x00,0x04,0xAD, +0x94,0x01,0x86,0x35, +0x00,0x00,0xA2,0xAC, +0xF5,0x0F,0x02,0x24, +0x00,0x00,0x6F,0xAC, +0x98,0x01,0x89,0x35, +0x00,0x00,0xC2,0xAC, +0x9C,0x01,0x8A,0x35, +0xA0,0x01,0x8B,0x35, +0xF0,0x0F,0x03,0x24, +0xF6,0x01,0x8C,0x35, +0x0D,0x00,0x02,0x24, +0x00,0x00,0x23,0xAD, +0x00,0x00,0x42,0xAD, +0x00,0x00,0x6D,0xAD, +0x02,0x80,0x02,0x3C, +0x00,0x00,0x8E,0xA1, +0x00,0x00,0x2E,0xA2, +0xFB,0x5D,0x42,0x90, +0x25,0xB0,0x1F,0x3C, +0xA7,0x01,0xE7,0x37, +0x1C,0x00,0xA2,0xAF, +0xFF,0xFF,0x02,0x24, +0x00,0x00,0xE2,0xA0, +0x05,0x06,0x03,0x3C, +0x25,0xB0,0x02,0x3C, +0x03,0x04,0x63,0x34, +0x0C,0x00,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0x01,0x02,0x06,0x3C, +0xC2,0x01,0x42,0x34, +0xA8,0x01,0xE8,0x37, +0xAC,0x01,0xE9,0x37, +0xB0,0x01,0xEA,0x37, +0xB4,0x01,0xEB,0x37, +0xB8,0x01,0xEC,0x37, +0xBC,0x01,0xED,0x37, +0xC0,0x01,0xEE,0x37, +0xC1,0x01,0xEF,0x37, +0x00,0x00,0x05,0xAD, +0x00,0x00,0x25,0xAD, +0x00,0x00,0x46,0xAD, +0x00,0x00,0x63,0xAD, +0x00,0x00,0x86,0xAD, +0x00,0x00,0xA3,0xAD, +0x00,0x00,0xC4,0xA1, +0x25,0xB0,0x03,0x3C, +0x00,0x00,0xE4,0xA1, +0x00,0x00,0x44,0xA0, +0x25,0xB0,0x02,0x3C, +0x0D,0x00,0x17,0x24, +0x0E,0x00,0x18,0x24, +0xC4,0x01,0x63,0x34, +0xC5,0x01,0x42,0x34, +0xC3,0x01,0xF1,0x37, +0x00,0x00,0x37,0xA2, +0xC6,0x01,0xF4,0x37, +0x00,0x00,0x77,0xA0, +0xC7,0x01,0xF5,0x37, +0x00,0x00,0x58,0xA0, +0x0F,0x00,0x02,0x24, +0x00,0x00,0x98,0xA2, +0x00,0x00,0xA2,0xA2, +0xD3,0x01,0x02,0x3C, +0x46,0x00,0xF6,0x37, +0x48,0x00,0xFE,0x37, +0x0E,0xF0,0x42,0x34, +0x00,0x00,0xC0,0xA6, +0x00,0x00,0xC2,0xAF, +0x1C,0x00,0xA3,0x8F, +0x00,0x00,0x00,0x00, +0x09,0x00,0x60,0x10, +0x44,0x00,0xF7,0x37, +0x00,0x00,0xE2,0x8E, +0x00,0x02,0x03,0x3C, +0x25,0x10,0x43,0x00, +0x00,0x00,0xE2,0xAE, +0x00,0x00,0xC3,0x8F, +0x00,0x04,0x02,0x3C, +0x25,0x18,0x62,0x00, +0x00,0x00,0xC3,0xAF, +0x4C,0x00,0xE2,0x37, +0x00,0x00,0x40,0xA0, +0x4D,0x00,0xE3,0x37, +0xF1,0x02,0xE4,0x37, +0x08,0x00,0x02,0x24, +0x00,0x00,0x60,0xA0, +0x40,0x00,0xE6,0x37, +0x00,0x00,0x82,0xA0, +0x64,0x03,0xE5,0x37, +0xBC,0x00,0x03,0x24, +0xFC,0x37,0x02,0x24, +0x00,0x00,0xC3,0xA4, +0x00,0x00,0xA0,0xA0, +0x00,0x00,0xC2,0xA4, +0x02,0x80,0x02,0x3C, +0xD8,0x00,0xE9,0x37, +0x30,0x1F,0x43,0x24, +0x00,0x00,0x26,0x91, +0xAA,0x1B,0x64,0x90, +0x2A,0xB0,0x05,0x3C, +0xA0,0xFF,0x02,0x24, +0x26,0xB0,0x07,0x3C, +0x25,0x30,0xC2,0x00, +0x30,0x00,0xAD,0x34, +0x34,0x00,0xA8,0x34, +0x01,0x00,0x83,0x24, +0x38,0x00,0xA5,0x34, +0x20,0x20,0x02,0x24, +0x00,0x00,0x26,0xA1, +0x79,0x00,0xEA,0x34, +0x00,0x00,0x03,0xA1, +0x00,0x00,0xA2,0xA4, +0x40,0x00,0x03,0x24, +0x16,0x00,0x02,0x24, +0x00,0x00,0xA3,0xA1, +0x94,0x00,0xEB,0x37, +0x00,0x00,0x42,0xA1, +0x98,0x00,0xEC,0x37, +0x64,0x00,0x03,0x24, +0x22,0x00,0x02,0x24, +0x00,0x00,0x63,0xA5, +0x7C,0x00,0xF4,0x34, +0x00,0x00,0x82,0xA5, +0x7A,0x00,0xE7,0x34, +0x04,0x00,0x03,0x24, +0x20,0x0C,0x02,0x24, +0x00,0x00,0xE3,0xA0, +0x9C,0x00,0xEE,0x37, +0x00,0x00,0x82,0xA6, +0x9A,0x00,0xEF,0x37, +0x0A,0x00,0x03,0x24, +0xFF,0x03,0x02,0x24, +0x00,0x00,0xC3,0xA1, +0x00,0x00,0xE2,0xA5, +0x25,0xB0,0x02,0x3C, +0x02,0x00,0x03,0x24, +0x96,0x00,0x42,0x34, +0x00,0x00,0x43,0xA4, +0x89,0x00,0xF5,0x37, +0xB7,0x00,0xF1,0x37, +0x20,0x00,0x02,0x24, +0x09,0x00,0x03,0x24, +0x00,0x00,0x22,0xA2, +0x00,0x00,0xA3,0xA2, +0x00,0x00,0xE2,0x96, +0xFF,0xFD,0x03,0x24, +0x04,0x02,0x05,0x24, +0x24,0x10,0x43,0x00, +0x00,0x00,0xE2,0xA6, +0x00,0x00,0xE3,0x96, +0x29,0xB0,0x02,0x3C, +0x40,0x00,0x42,0x34, +0x00,0x02,0x63,0x34, +0x00,0x00,0xE3,0xA6, +0xFF,0x00,0x84,0x30, +0x00,0x00,0x45,0xA4, +0x73,0x22,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x44,0x00,0xBF,0x8F, +0x40,0x00,0xBE,0x8F, +0x3C,0x00,0xB7,0x8F, +0x38,0x00,0xB6,0x8F, +0x34,0x00,0xB5,0x8F, +0x30,0x00,0xB4,0x8F, +0x2C,0x00,0xB3,0x8F, +0x28,0x00,0xB2,0x8F, +0x24,0x00,0xB1,0x8F, +0x20,0x00,0xB0,0x8F, +0x01,0x00,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x48,0x00,0xBD,0x27, +0xFF,0xFF,0x03,0x24, +0x00,0x00,0x43,0xA0, +0x02,0x80,0x0B,0x3C, +0xDE,0x5D,0x66,0x91, +0x25,0xB0,0x09,0x3C, +0x80,0x00,0x02,0x24, +0x34,0x02,0x24,0x35, +0x00,0x00,0x82,0xA4, +0x37,0x02,0x25,0x35, +0x53,0x00,0x03,0x24, +0x22,0x00,0x02,0x24, +0x00,0x00,0xA3,0xA0, +0x1E,0xFF,0xC2,0x14, +0x13,0x13,0x02,0x3C, +0x1B,0x1B,0x02,0x3C, +0x1B,0x1B,0x42,0x34, +0x60,0x01,0x23,0x35, +0x64,0x01,0x24,0x35, +0x68,0x01,0x25,0x35, +0x7C,0x01,0x2A,0x35, +0x6C,0x01,0x26,0x35, +0x70,0x01,0x27,0x35, +0x74,0x01,0x28,0x35, +0x78,0x01,0x29,0x35, +0x00,0x00,0x62,0xAC, +0x00,0x00,0x82,0xAC, +0x00,0x00,0xA2,0xAC, +0x00,0x00,0xC2,0xAC, +0x00,0x00,0xE2,0xAC, +0x00,0x00,0x02,0xAD, +0x00,0x00,0x22,0xAD, +0x00,0x00,0x42,0xAD, +0xDE,0x5D,0x65,0x91, +0x25,0xB0,0x0C,0x3C, +0x01,0x00,0x03,0x3C, +0x80,0x01,0x82,0x35, +0x08,0x5F,0x63,0x34, +0x22,0x00,0x04,0x24, +0x00,0x00,0x43,0xAC, +0x1D,0xFF,0xA4,0x14, +0x0F,0x1F,0x02,0x3C, +0x00,0xF0,0x4F,0x34, +0xF7,0x01,0x91,0x35, +0x15,0xF0,0x4D,0x34, +0x78,0x67,0x00,0x08, +0xFF,0xFF,0x0E,0x24, +0x02,0x80,0x02,0x3C, +0xDF,0x5D,0x44,0x90, +0x06,0x00,0x03,0x24, +0x0C,0x00,0x83,0x10, +0x00,0x1C,0x02,0x3C, +0x00,0x1C,0x42,0x34, +0xA0,0x00,0x24,0x36, +0x00,0x00,0x82,0xAC, +0x00,0xE0,0x02,0x3C, +0xA4,0x00,0x25,0x36, +0x00,0x04,0x03,0x24, +0xA8,0x00,0x26,0x36, +0x00,0xB0,0x42,0x34, +0x00,0x00,0xA3,0xAC, +0xDA,0x66,0x00,0x08, +0x00,0x00,0x00,0x00, +0x16,0x16,0x02,0x3C, +0x07,0x07,0x42,0x34, +0xA0,0x00,0x23,0x36, +0x00,0x00,0x62,0xAC, +0x00,0xC0,0x02,0x3C, +0xA8,0x00,0x25,0x36, +0xA4,0x00,0x24,0x36, +0x00,0xB4,0x42,0x34, +0x00,0x00,0x80,0xAC, +0x00,0x00,0xA2,0xAC, +0xDC,0x66,0x00,0x08, +0x02,0x80,0x03,0x3C, +0xE8,0xFF,0xBD,0x27, +0x01,0x00,0x06,0x24, +0xE8,0x0E,0x04,0x24, +0x10,0x00,0xBF,0xAF, +0xA9,0x45,0x00,0x0C, +0x00,0x10,0x05,0x3C, +0x60,0x08,0x04,0x24, +0xCB,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x20,0x04,0x06,0x3C, +0x20,0x04,0xC6,0x34, +0x25,0x30,0x46,0x00, +0x60,0x08,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x70,0x08,0x04,0x24, +0x00,0x04,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x00,0x20,0x06,0x3C, +0x80,0x00,0xC6,0x34, +0x80,0x0C,0x04,0x24, +0xA9,0x45,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0x00,0x40,0x06,0x3C, +0x10,0x00,0xBF,0x8F, +0x00,0x01,0xC6,0x34, +0x88,0x0C,0x04,0x24, +0xFF,0xFF,0x05,0x24, +0xA9,0x45,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x10,0x00,0xA0,0x10, +0x21,0x38,0x00,0x00, +0x25,0xB0,0x08,0x3C, +0x00,0x00,0x82,0x8C, +0x04,0x00,0x83,0x8C, +0x21,0x30,0x00,0x00, +0x21,0x10,0x48,0x00, +0x00,0x00,0x43,0xAC, +0x01,0x00,0xC2,0x24, +0xFF,0x00,0x46,0x30, +0x06,0x00,0xC3,0x2C, +0xFD,0xFF,0x60,0x14, +0x01,0x00,0xC2,0x24, +0x02,0x00,0xE7,0x24, +0x2B,0x10,0xE5,0x00, +0xF3,0xFF,0x40,0x14, +0x08,0x00,0x84,0x24, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x1C,0x00,0xBF,0xAF, +0x10,0x00,0xB0,0xAF, +0x21,0x90,0xA0,0x00, +0x0B,0x00,0xA0,0x10, +0x21,0x88,0x00,0x00, +0x21,0x80,0x80,0x00, +0x00,0x00,0x04,0x8E, +0x04,0x00,0x05,0x8E, +0x08,0x00,0x06,0x8E, +0x03,0x00,0x31,0x26, +0xA9,0x45,0x00,0x0C, +0x0C,0x00,0x10,0x26, +0x2B,0x10,0x32,0x02, +0xF8,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x21,0x40,0x80,0x00, +0x21,0x48,0x00,0x00, +0x1E,0x00,0xA0,0x10, +0x21,0x38,0x00,0x00, +0x80,0x30,0x07,0x00, +0x21,0x10,0xC8,0x00, +0x00,0x00,0x43,0x8C, +0x00,0x00,0x00,0x00, +0x00,0xF2,0x63,0x24, +0x1D,0x00,0x62,0x2C, +0x12,0x00,0x40,0x10, +0x80,0x10,0x03,0x00, +0x02,0x80,0x03,0x3C, +0x64,0xE9,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x8C, +0x00,0x00,0x00,0x00, +0x08,0x00,0x80,0x00, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x23,0x18,0x69,0x00, +0x08,0x00,0x44,0x8C, +0x02,0x80,0x02,0x3C, +0x80,0x18,0x03,0x00, +0x30,0x1F,0x42,0x24, +0x21,0x18,0x62,0x00, +0x04,0x1D,0x64,0xAC, +0x01,0x00,0x29,0x25, +0x03,0x00,0xE7,0x24, +0x2B,0x10,0xE5,0x00, +0xE5,0xFF,0x40,0x14, +0x80,0x30,0x07,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xD6,0xFF,0x40,0x14, +0x00,0x1D,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xC8,0xFF,0x40,0x14, +0xFC,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xBA,0xFF,0x40,0x14, +0xF8,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0xAC,0xFF,0x40,0x14, +0x08,0x1D,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0x9E,0xFF,0x40,0x14, +0xF4,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x21,0x10,0xC8,0x00, +0xC0,0x18,0x09,0x00, +0x08,0x00,0x44,0x8C, +0x23,0x18,0x69,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x80,0x18,0x03,0x00, +0x03,0x00,0xE7,0x24, +0x21,0x18,0x62,0x00, +0x2B,0x10,0xE5,0x00, +0x90,0xFF,0x40,0x14, +0xF0,0x1C,0x64,0xAC, +0xE0,0x68,0x00,0x08, +0x00,0x00,0x00,0x00, +0x25,0xB0,0x02,0x3C, +0xFC,0x37,0x03,0x24, +0x40,0x00,0x42,0x34, +0x02,0x80,0x04,0x3C, +0x00,0x00,0x43,0xA4, +0xE8,0xFF,0xBD,0x27, +0xA4,0xCF,0x84,0x24, +0x10,0x00,0xBF,0xAF, +0x94,0x68,0x00,0x0C, +0x74,0x01,0x05,0x24, +0x02,0x80,0x02,0x3C, +0xDE,0x5D,0x44,0x90, +0x12,0x00,0x03,0x24, +0x34,0x00,0x83,0x10, +0x13,0x00,0x82,0x28, +0x17,0x00,0x40,0x14, +0x11,0x00,0x02,0x24, +0x22,0x00,0x02,0x24, +0x36,0x00,0x82,0x10, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x04,0x3C, +0x2C,0xCC,0x84,0x24, +0xBF,0x68,0x00,0x0C, +0x54,0x00,0x05,0x24, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x44,0x90, +0x01,0x00,0x03,0x24, +0x1A,0x00,0x83,0x10, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2C,0xC7,0x84,0x24, +0x94,0x68,0x00,0x0C, +0x40,0x01,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x84,0x08,0x04,0x24, +0xFF,0x00,0x05,0x24, +0x58,0x00,0x06,0x24, +0x1B,0x47,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xED,0xFF,0x82,0x14, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x04,0x3C, +0xE4,0xCE,0x84,0x24, +0xA7,0x68,0x00,0x0C, +0x30,0x00,0x05,0x24, +0x02,0x80,0x04,0x3C, +0x2C,0xCC,0x84,0x24, +0xBF,0x68,0x00,0x0C, +0x54,0x00,0x05,0x24, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x44,0x90, +0x01,0x00,0x03,0x24, +0xE8,0xFF,0x83,0x14, +0x00,0x00,0x00,0x00, +0x75,0x68,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x2C,0xC7,0x84,0x24, +0x94,0x68,0x00,0x0C, +0x40,0x01,0x05,0x24, +0x10,0x00,0xBF,0x8F, +0x84,0x08,0x04,0x24, +0xFF,0x00,0x05,0x24, +0x58,0x00,0x06,0x24, +0x1B,0x47,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x04,0x3C, +0x30,0xCE,0x84,0x24, +0x2D,0x00,0x05,0x24, +0xA7,0x68,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x64,0x69,0x00,0x08, +0x02,0x80,0x04,0x3C, +0x7C,0xCD,0x84,0x24, +0x7B,0x69,0x00,0x08, +0x2D,0x00,0x05,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xB0,0xAF, +0x50,0x0C,0x04,0x24, +0xFF,0x00,0x05,0x24, +0x02,0x80,0x10,0x3C, +0x14,0x00,0xBF,0xAF, +0x0A,0x47,0x00,0x0C, +0x30,0x1F,0x10,0x26, +0x60,0x1D,0x02,0xA2, +0x58,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x61,0x1D,0x02,0xA2, +0x60,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x62,0x1D,0x02,0xA2, +0x68,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0x63,0x1D,0x02,0xA2, +0x38,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0x00,0x05,0x24, +0xE8,0x1C,0x02,0xA2, +0x34,0x0C,0x04,0x24, +0x0A,0x47,0x00,0x0C, +0xFF,0xFF,0x05,0x24, +0xEC,0x1C,0x02,0xAE, +0x14,0x00,0xBF,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x03,0x3C, +0x84,0xA7,0x42,0x24, +0xBC,0x5E,0x60,0xAC, +0x1C,0x5E,0xA2,0xAC, +0x02,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0xC0,0x5E,0x60,0xA4, +0x1C,0x5E,0xA4,0x24, +0x88,0x0D,0x42,0x24, +0x02,0x80,0x03,0x3C, +0xC2,0x5E,0x60,0xA4, +0x08,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x02,0x80,0x06,0x3C, +0x88,0x10,0x42,0x24, +0xA4,0x0D,0x63,0x24, +0xC4,0x5E,0xC7,0x24, +0x14,0x00,0x82,0xAC, +0x10,0x00,0x83,0xAC, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xC4,0x5E,0xC0,0xAC, +0x04,0x00,0xE0,0xAC, +0xCC,0x5E,0x40,0xA0, +0xD0,0x5E,0x60,0xAC, +0x01,0x80,0x02,0x3C, +0x30,0xD2,0x42,0x24, +0x7C,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0xA4,0x10,0x63,0x24, +0x64,0x13,0x42,0x24, +0x1C,0x00,0x83,0xAC, +0x20,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x2C,0x16,0x63,0x24, +0xF0,0x18,0x42,0x24, +0x24,0x00,0x83,0xAC, +0x28,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x01,0x80,0x02,0x3C, +0xC8,0x2A,0x63,0x24, +0x98,0x01,0x42,0x24, +0x2C,0x00,0x83,0xAC, +0x50,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x10,0x1C,0x63,0x24, +0xFC,0x1D,0x42,0x24, +0x30,0x00,0x83,0xAC, +0x38,0x00,0x82,0xAC, +0x00,0x80,0x03,0x3C, +0x00,0x80,0x02,0x3C, +0x00,0x03,0x63,0x24, +0xB4,0x1B,0x42,0x24, +0x4C,0x00,0x83,0xAC, +0x08,0x00,0xE0,0x03, +0x3C,0x00,0x82,0xAC, +0x25,0xB0,0x02,0x3C, +0x08,0x00,0x42,0x34, +0x00,0x00,0x43,0x8C, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0x02,0x80,0x0E,0x3C, +0x02,0x80,0x08,0x3C, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0xF8,0x03,0x4D,0x24, +0x00,0x1C,0x6C,0x24, +0x01,0x00,0x07,0x24, +0x00,0x00,0xCB,0x25, +0xFF,0xFF,0x0A,0x24, +0x00,0x04,0x09,0x25, +0x80,0x1A,0x07,0x00, +0x21,0x10,0x6B,0x00, +0x00,0x00,0x42,0xAC, +0x90,0x00,0x4A,0xAC, +0x00,0x04,0x04,0x8D, +0x01,0x00,0xE7,0x24, +0x08,0x00,0x45,0x24, +0x21,0x18,0x6D,0x00, +0x07,0x00,0xE6,0x28, +0x04,0x00,0x82,0xAC, +0x00,0x00,0x44,0xAC, +0x04,0x00,0x49,0xAC, +0x00,0x04,0x02,0xAD, +0x8C,0x00,0x40,0xAC, +0x6C,0x00,0xA3,0xAC, +0xF0,0xFF,0xC0,0x14, +0x68,0x00,0xAC,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0xC9,0xAD, +0x07,0x00,0xA2,0x2C, +0x13,0x00,0x40,0x10, +0xFF,0xFF,0x07,0x24, +0x02,0x80,0x02,0x3C, +0x80,0x1A,0x05,0x00, +0x00,0x00,0x42,0x24, +0x0E,0x00,0xA0,0x10, +0x21,0x30,0x62,0x00, +0x90,0x00,0xC3,0x8C, +0xFF,0xFF,0x02,0x24, +0x0A,0x00,0x62,0x14, +0x00,0x00,0x00,0x00, +0x8C,0x00,0xC2,0x8C, +0x00,0x00,0x00,0x00, +0x06,0x00,0x40,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x02,0x24, +0x88,0x00,0xC4,0xAC, +0x8C,0x00,0xC2,0xAC, +0x90,0x00,0xC5,0xAC, +0x21,0x38,0xA0,0x00, +0x08,0x00,0xE0,0x03, +0x21,0x10,0xE0,0x00, +0x25,0xB0,0x06,0x3C, +0x02,0x80,0x02,0x3C, +0xE0,0xFF,0xBD,0x27, +0x68,0xA8,0x42,0x24, +0xDB,0xFF,0x03,0x24, +0x18,0x03,0xC4,0x34, +0x27,0x00,0xC5,0x34, +0x00,0x00,0x82,0xAC, +0x1C,0x00,0xBF,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x00,0x00,0xA3,0xA0, +0x06,0x00,0xC2,0x34, +0x00,0x00,0x43,0x90, +0x00,0x00,0x00,0x00, +0x0F,0x00,0x63,0x30, +0x5A,0x00,0x60,0x14, +0x01,0x00,0x02,0x24, +0x1B,0x00,0xC3,0x34, +0x07,0x00,0x02,0x24, +0x00,0x00,0x62,0xA0, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x50,0x24, +0x34,0x1C,0x04,0x8E, +0xCB,0x45,0x00,0x0C, +0x10,0x00,0x05,0x24, +0x40,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x3C, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x3C,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x58,0x1C,0x04,0x8E, +0x00,0x04,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x58,0x1C,0x04,0x8E, +0x00,0x08,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x02,0x80,0x05,0x3C, +0xEC,0xD9,0xA5,0x24, +0x21,0x20,0x00,0x00, +0x9F,0x47,0x00,0x0C, +0xCA,0x00,0x06,0x24, +0x31,0x00,0x40,0x10, +0x21,0x18,0x00,0x00, +0x02,0x80,0x02,0x3C, +0xE7,0x5D,0x43,0x90, +0x01,0x00,0x11,0x24, +0x57,0x00,0x71,0x10, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x02,0x3C, +0x4A,0xF3,0x43,0x90, +0x00,0x00,0x00,0x00, +0x58,0x00,0x71,0x10, +0x02,0x80,0x05,0x3C, +0x34,0x1C,0x04,0x8E, +0x21,0x30,0x40,0x02, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x02,0x80,0x11,0x3C, +0xDE,0x5D,0x23,0x92, +0x11,0x00,0x02,0x24, +0x2E,0x00,0x62,0x10, +0x00,0x08,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x01,0x00,0x04,0x24, +0x34,0x1C,0x04,0x8E, +0xCB,0x45,0x00,0x0C, +0x10,0x00,0x05,0x3C, +0x40,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x3C, +0x01,0x00,0x06,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x90,0x40,0x00, +0x3C,0x1C,0x04,0x8E, +0x10,0x00,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x58,0x1C,0x04,0x8E, +0x00,0x04,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x58,0x1C,0x04,0x8E, +0x00,0x08,0x05,0x24, +0xA9,0x45,0x00,0x0C, +0x21,0x30,0x00,0x00, +0x02,0x80,0x05,0x3C, +0x94,0xD9,0xA5,0x24, +0x01,0x00,0x04,0x24, +0x9F,0x47,0x00,0x0C, +0x16,0x00,0x06,0x24, +0x0C,0x00,0x40,0x14, +0x21,0x18,0x00,0x00, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xA9,0xFF,0x62,0x14, +0x1F,0x00,0xC3,0x34, +0x2F,0x6A,0x00,0x08, +0x07,0x00,0x02,0x24, +0x34,0x1C,0x04,0x8E, +0x21,0x30,0x40,0x02, +0xA9,0x45,0x00,0x0C, +0x10,0x00,0x05,0x3C, +0x00,0x08,0x04,0x24, +0x00,0x01,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0x00,0x08,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x01,0x00,0x06,0x24, +0xDE,0x5D,0x23,0x92, +0x11,0x00,0x02,0x24, +0x1D,0x00,0x62,0x10, +0x00,0x08,0x04,0x24, +0xE6,0x44,0x00,0x0C, +0x21,0x20,0x00,0x00, +0x0F,0x00,0x05,0x3C, +0x0C,0x00,0x06,0x3C, +0xFF,0xFF,0xA5,0x34, +0x00,0xB4,0xC6,0x34, +0x5F,0x47,0x00,0x0C, +0x08,0x00,0x04,0x24, +0x1C,0x00,0xBF,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x01,0x00,0x03,0x24, +0x21,0x10,0x60,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x84,0xD8,0xA5,0x24, +0x21,0x20,0x00,0x00, +0x9F,0x47,0x00,0x0C, +0x16,0x00,0x06,0x24, +0x55,0x6A,0x00,0x08, +0x02,0x80,0x02,0x3C, +0xDC,0xD8,0xA5,0x24, +0x21,0x20,0x00,0x00, +0x9F,0x47,0x00,0x0C, +0x16,0x00,0x06,0x24, +0x59,0x6A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x00,0xFF,0x05,0x3C, +0xA9,0x45,0x00,0x0C, +0x03,0x00,0x06,0x24, +0x9A,0x6A,0x00,0x08, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x02,0x80,0x02,0x3C, +0x61,0x5A,0x47,0x90, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x03,0x00,0x03,0x24, +0x1E,0x3B,0x84,0x24, +0xAC,0xE3,0xA5,0x24, +0x0F,0x00,0xE3,0x10, +0x0D,0x00,0x06,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x1E,0x3B,0x84,0x24, +0x5C,0xE3,0xA5,0x24, +0x10,0x52,0x00,0x0C, +0x0D,0x00,0x06,0x24, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x10,0x00,0xBF,0x8F, +0x2B,0x3B,0x84,0x24, +0x6C,0xE3,0xA5,0x24, +0x0D,0x00,0x06,0x24, +0x10,0x52,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x10,0x52,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0x10,0x00,0xBF,0x8F, +0x2B,0x3B,0x84,0x24, +0x9C,0xE3,0xA5,0x24, +0x0D,0x00,0x06,0x24, +0x10,0x52,0x00,0x08, +0x18,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x02,0x80,0x11,0x3C, +0x02,0x80,0x05,0x3C, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x10,0x26, +0x64,0x5A,0x24,0x26, +0x14,0xDD,0xA5,0x24, +0x34,0x00,0x06,0x24, +0x18,0x00,0xBF,0xAF, +0x10,0x52,0x00,0x0C, +0x64,0x5A,0x31,0x26, +0xBD,0x6A,0x00,0x0C, +0x68,0x3B,0x11,0xAE, +0x02,0x00,0x11,0x24, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x06,0x3C, +0xA0,0x38,0x11,0xA2, +0xBC,0x57,0x84,0x24, +0xFC,0x64,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0x98,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x01,0x80,0x06,0x3C, +0xBC,0x38,0x11,0xA2, +0xD8,0x57,0x84,0x24, +0x0C,0x31,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0xB4,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x01,0x80,0x06,0x3C, +0xD8,0x38,0x11,0xA2, +0xF4,0x57,0x84,0x24, +0xC0,0x2E,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0xD0,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x01,0x80,0x06,0x3C, +0xF4,0x38,0x11,0xA2, +0x10,0x58,0x84,0x24, +0x14,0x25,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0xEC,0x38,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x06,0x3C, +0x10,0x39,0x11,0xA2, +0x2C,0x58,0x84,0x24, +0x58,0x64,0xC6,0x24, +0x21,0x28,0x00,0x00, +0xA2,0x23,0x00,0x0C, +0x08,0x39,0x00,0xAE, +0x02,0x80,0x04,0x3C, +0x00,0x80,0x06,0x3C, +0x48,0x39,0x11,0xA2, +0x40,0x39,0x00,0xAE, +0x64,0x58,0x84,0x24, +0x38,0x3B,0xC6,0x24, +0xA2,0x23,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x02,0x80,0x02,0x3C, +0x49,0xF3,0x43,0x90, +0x18,0x00,0xBF,0x8F, +0x14,0x00,0xB1,0x8F, +0x9C,0x3E,0x03,0xA2, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x03,0x80,0x05,0x3C, +0x00,0x80,0xA5,0x24, +0x40,0x10,0x0D,0x3C, +0xFF,0xFF,0xA5,0x30, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x42,0x24, +0x25,0xC8,0xAD,0x00, +0x38,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0xE0,0xFF,0xBD,0x27, +0x44,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0x1C,0x00,0xB7,0xAF, +0x18,0x00,0xB6,0xAF, +0x14,0x00,0xB5,0xAF, +0x10,0x00,0xB4,0xAF, +0x0C,0x00,0xB3,0xAF, +0x08,0x00,0xB2,0xAF, +0x04,0x00,0xB1,0xAF, +0x00,0x00,0xB0,0xAF, +0x50,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0x5C,0x37,0x59,0xAC, +0xAA,0x1B,0x44,0x90, +0x00,0x01,0x39,0x27, +0x68,0x37,0x59,0xAC, +0x00,0x01,0x39,0x27, +0x74,0x37,0x59,0xAC, +0x20,0xB0,0x06,0x3C, +0x44,0x37,0x48,0x8C, +0x50,0x37,0x49,0x8C, +0x5C,0x37,0x4A,0x8C, +0x68,0x37,0x4B,0x8C, +0x74,0x37,0x4C,0x8C, +0x00,0x22,0x04,0x00, +0x00,0x01,0xC7,0x34, +0xFF,0x1F,0x03,0x3C, +0x00,0x01,0x39,0x27, +0xFF,0xFF,0x63,0x34, +0x21,0x38,0x87,0x00, +0x21,0x20,0x86,0x00, +0x24,0x38,0xE3,0x00, +0x20,0x10,0x06,0x3C, +0x24,0x20,0x83,0x00, +0x80,0x37,0x59,0xAC, +0x21,0x78,0x20,0x03, +0x25,0x28,0xAD,0x00, +0x25,0xB0,0x0E,0x3C, +0x00,0x01,0x39,0x27, +0x34,0x37,0x45,0xAC, +0x40,0x37,0x48,0xAC, +0x4C,0x37,0x49,0xAC, +0x58,0x37,0x4A,0xAC, +0xF8,0x36,0x44,0xAC, +0x64,0x37,0x4B,0xAC, +0x04,0x37,0x47,0xAC, +0x70,0x37,0x4C,0xAC, +0xAC,0x00,0xC3,0x35, +0xCC,0x36,0x46,0xAC, +0xC8,0x36,0x46,0xAC, +0xD8,0x36,0x46,0xAC, +0xD4,0x36,0x46,0xAC, +0xE4,0x36,0x46,0xAC, +0x8C,0x37,0x59,0xAC, +0xFC,0x36,0x44,0xAC, +0x08,0x37,0x47,0xAC, +0x7C,0x37,0x4F,0xAC, +0xE0,0x36,0x46,0xAC, +0xF0,0x36,0x46,0xAC, +0xEC,0x36,0x46,0xAC, +0x14,0x37,0x46,0xAC, +0x10,0x37,0x46,0xAC, +0x00,0x02,0x39,0x27, +0x00,0x00,0x68,0x8C, +0xAC,0x1B,0x47,0x94, +0xA4,0x37,0x59,0xAC, +0xB0,0x00,0xC3,0x35, +0x00,0x00,0x75,0x8C, +0x21,0x10,0x05,0x3C, +0x8C,0x37,0x52,0x8C, +0x23,0x10,0x0B,0x3C, +0x22,0x10,0x0F,0x3C, +0x02,0x80,0x14,0x3C, +0x02,0x80,0x16,0x3C, +0x02,0x80,0x17,0x3C, +0x02,0x80,0x18,0x3C, +0x00,0x80,0xA4,0x34, +0x21,0x98,0x20,0x03, +0x23,0x20,0x87,0x00, +0x00,0x04,0x39,0x27, +0x24,0x10,0x07,0x3C, +0x9C,0x57,0x8A,0x26, +0xA4,0x57,0xC9,0x26, +0xAC,0x57,0xEC,0x26, +0xB4,0x57,0x0D,0x27, +0x00,0x04,0x70,0x35, +0x01,0x00,0x08,0x25, +0x00,0x40,0xF1,0x35, +0x00,0x01,0xCE,0x35, +0x01,0x00,0x03,0x24, +0x88,0x37,0x52,0xAC, +0x91,0x37,0x43,0xA0, +0xA0,0x37,0x53,0xAC, +0x08,0x38,0x50,0xAC, +0xCC,0x37,0x48,0xAC, +0xD8,0x37,0x44,0xAC, +0xFC,0x37,0x51,0xAC, +0xF0,0x37,0x55,0xAC, +0x00,0x00,0xC7,0xAD, +0xEC,0x37,0x47,0xAC, +0x0C,0x38,0x46,0xAC, +0x20,0x37,0x46,0xAC, +0x1C,0x37,0x46,0xAC, +0xAA,0x37,0x40,0xA4, +0xA9,0x37,0x40,0xA0, +0xA8,0x37,0x40,0xA0, +0x00,0x38,0x4B,0xAC, +0x04,0x38,0x4B,0xAC, +0xC4,0x37,0x45,0xAC, +0xC8,0x37,0x45,0xAC, +0xD0,0x37,0x45,0xAC, +0xD4,0x37,0x45,0xAC, +0xF4,0x37,0x4F,0xAC, +0xF8,0x37,0x4F,0xAC, +0xE8,0x37,0x47,0xAC, +0x10,0x38,0x46,0xAC, +0x1C,0x38,0x59,0xAC, +0x18,0x38,0x59,0xAC, +0x04,0x00,0x4A,0xAD, +0x9C,0x57,0x8A,0xAE, +0x04,0x00,0x8C,0xAD, +0xA4,0x57,0xC9,0xAE, +0x04,0x00,0xAD,0xAD, +0xAC,0x57,0xEC,0xAE, +0xB4,0x57,0x0D,0xAF, +0x04,0x00,0x29,0xAD, +0x02,0x80,0x02,0x3C, +0x00,0x1C,0x43,0x24, +0x01,0x00,0x05,0x24, +0x21,0x20,0x20,0x01, +0x0F,0x00,0x06,0x24, +0x21,0x10,0x80,0x00, +0xFF,0xFF,0xC6,0x24, +0x08,0x00,0x79,0xAC, +0x00,0x00,0x63,0xAC, +0x10,0x00,0x65,0xAC, +0x00,0x00,0x69,0xAC, +0x21,0x20,0x60,0x00, +0x04,0x00,0x62,0xAC, +0x00,0x00,0x43,0xAC, +0x00,0x01,0x39,0x27, +0xF5,0xFF,0xC1,0x04, +0x18,0x00,0x63,0x24, +0x02,0x80,0x02,0x3C, +0xAC,0x57,0x48,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x07,0x8D, +0x80,0x1D,0x4B,0x24, +0x04,0x00,0x24,0xAD, +0x00,0x1C,0x6A,0x24, +0x02,0x00,0x09,0x24, +0x21,0x28,0x00,0x00, +0x0F,0x00,0x06,0x24, +0x21,0x20,0xAB,0x00, +0x21,0x10,0xAA,0x00, +0xFF,0xFF,0xC6,0x24, +0x88,0x01,0x59,0xAC, +0x90,0x01,0x49,0xAC, +0x18,0x00,0xA5,0x24, +0x00,0x00,0x88,0xAC, +0x04,0x00,0x87,0xAC, +0x00,0x00,0xE4,0xAC, +0x00,0x02,0x39,0x27, +0xF5,0xFF,0xC1,0x04, +0x21,0x38,0x80,0x00, +0x02,0x80,0x02,0x3C, +0xB4,0x57,0x49,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x27,0x8D, +0x00,0x1F,0x4B,0x24, +0x04,0x00,0x04,0xAD, +0x00,0x1C,0x6A,0x24, +0x03,0x00,0x08,0x24, +0x21,0x28,0x00,0x00, +0x01,0x00,0x06,0x24, +0x21,0x20,0xAB,0x00, +0x21,0x10,0xAA,0x00, +0xFF,0xFF,0xC6,0x24, +0x08,0x03,0x59,0xAC, +0x10,0x03,0x48,0xAC, +0x18,0x00,0xA5,0x24, +0x00,0x00,0x89,0xAC, +0x04,0x00,0x87,0xAC, +0x00,0x00,0xE4,0xAC, +0x00,0x08,0x39,0x27, +0xF5,0xFF,0xC1,0x04, +0x21,0x38,0x80,0x00, +0x1C,0x00,0xB7,0x8F, +0x18,0x00,0xB6,0x8F, +0x14,0x00,0xB5,0x8F, +0x10,0x00,0xB4,0x8F, +0x0C,0x00,0xB3,0x8F, +0x08,0x00,0xB2,0x8F, +0x04,0x00,0xB1,0x8F, +0x00,0x00,0xB0,0x8F, +0x20,0x00,0xBD,0x27, +0x08,0x00,0xE0,0x03, +0x04,0x00,0x24,0xAD, +0xD0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x20,0x00,0xB2,0xAF, +0x02,0x80,0x03,0x3C, +0x78,0xE8,0x52,0x24, +0x02,0x80,0x02,0x3C, +0x28,0x00,0xB4,0xAF, +0x24,0x00,0xB3,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x2C,0x00,0xBF,0xAF, +0x04,0xE8,0x73,0x24, +0x30,0x1F,0x50,0x24, +0x21,0x88,0x00,0x00, +0x02,0x80,0x14,0x3C, +0xDD,0x59,0x00,0x0C, +0x21,0x20,0x20,0x02, +0x1C,0x24,0x05,0x8E, +0x6C,0x00,0x66,0x8E, +0xE4,0xE7,0x82,0x26, +0x6C,0x00,0x43,0x8E, +0x1B,0x00,0x44,0x90, +0xFF,0xF1,0x02,0x24, +0x21,0x18,0x66,0x00, +0x24,0x28,0xA2,0x00, +0x00,0x21,0x04,0x00, +0x42,0x18,0x03,0x00, +0x00,0x02,0xA5,0x34, +0xE8,0x23,0x03,0xAE, +0x0C,0x24,0x04,0xAE, +0x1C,0x24,0x05,0xAE, +0x10,0x24,0x04,0xAE, +0x21,0x30,0x00,0x00, +0x21,0x10,0x06,0x02, +0x01,0x00,0xC6,0x24, +0x1D,0x00,0xC3,0x28, +0x3D,0x24,0x40,0xA0, +0x20,0x24,0x40,0xA0, +0xFA,0xFF,0x60,0x14, +0x5A,0x24,0x40,0xA0, +0x01,0x00,0x31,0x26, +0x20,0x00,0x22,0x2A, +0x78,0x24,0x00,0xAE, +0xE3,0xFF,0x40,0x14, +0x94,0x00,0x10,0x26, +0x02,0x80,0x02,0x3C, +0x02,0x80,0x03,0x3C, +0x30,0x1F,0x4B,0x24, +0x02,0x80,0x02,0x3C, +0x78,0xE8,0x6F,0x24, +0x04,0xE8,0x4D,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xE4,0xE7,0x6E,0x24, +0xC4,0xE7,0x4C,0x24, +0x21,0x88,0x00,0x00, +0x80,0x18,0x11,0x00, +0x21,0x20,0x6D,0x00, +0x21,0x10,0x6F,0x00, +0x21,0x28,0x2E,0x02, +0x21,0x30,0x2C,0x02, +0x00,0x00,0x88,0x8C, +0x00,0x00,0xA9,0x90, +0x00,0x00,0xC7,0x90, +0x00,0x00,0x4A,0x8C, +0x21,0x10,0x2B,0x02, +0x01,0x00,0x31,0x26, +0x21,0x18,0x6B,0x00, +0x1D,0x00,0x24,0x2A, +0x60,0x05,0x68,0xAC, +0x3E,0x05,0x47,0xA0, +0xD4,0x05,0x6A,0xAC, +0xEF,0xFF,0x80,0x14, +0x04,0x05,0x49,0xA0, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4A,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xA0,0xE6,0x6B,0x24, +0x40,0xE5,0x4C,0x24, +0x21,0x88,0x00,0x00, +0x21,0x48,0x00,0x00, +0x21,0x30,0x00,0x00, +0x21,0x40,0x2A,0x01, +0x21,0x38,0x2B,0x01, +0x21,0x10,0xE6,0x00, +0x91,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x06,0x01, +0x01,0x00,0xC6,0x24, +0x05,0x00,0xC2,0x28, +0x39,0x04,0x64,0xA0, +0xF8,0xFF,0x40,0x14, +0xA8,0x03,0x65,0xA0, +0x21,0x10,0x2C,0x02, +0x1D,0x00,0x44,0x90, +0x00,0x00,0x45,0x90, +0x21,0x18,0x2A,0x02, +0x01,0x00,0x31,0x26, +0x1D,0x00,0x22,0x2A, +0xE7,0x04,0x64,0xA0, +0xCA,0x04,0x65,0xA0, +0xEB,0xFF,0x40,0x14, +0x05,0x00,0x29,0x25, +0x52,0x00,0x02,0x24, +0x10,0x00,0xA2,0xA3, +0x41,0x00,0x03,0x24, +0x4D,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x64,0xF3,0xE7,0x24, +0x11,0x00,0xA3,0xA3, +0x12,0x00,0xA2,0xA3, +0xE8,0x03,0x03,0x24, +0x01,0x00,0x02,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0xDC,0x93,0xC6,0x24, +0x0C,0x00,0xE3,0xAC, +0x14,0x00,0xE2,0xA0, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x2C,0x00,0xBF,0x8F, +0x28,0x00,0xB4,0x8F, +0x24,0x00,0xB3,0x8F, +0x20,0x00,0xB2,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x30,0x00,0xBD,0x27, +0x90,0xFF,0xBD,0x27, +0x48,0x00,0xB0,0xAF, +0x25,0xB0,0x10,0x3C, +0x6C,0x00,0xBF,0xAF, +0x68,0x00,0xBE,0xAF, +0x64,0x00,0xB7,0xAF, +0x58,0x00,0xB4,0xAF, +0x54,0x00,0xB3,0xAF, +0x50,0x00,0xB2,0xAF, +0x4C,0x00,0xB1,0xAF, +0x60,0x00,0xB6,0xAF, +0x5C,0x00,0xB5,0xAF, +0xE0,0x0E,0x02,0x36, +0x21,0x20,0x40,0x00, +0x00,0x00,0x42,0x8C, +0xDC,0x0E,0x12,0x36, +0x70,0x0E,0x13,0x36, +0x10,0x00,0xA2,0xAF, +0x00,0x00,0x42,0x8E, +0x78,0x0E,0x1E,0x36, +0x7C,0x0E,0x14,0x36, +0x14,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8E, +0x25,0xB0,0x02,0x3C, +0x74,0x0E,0x42,0x34, +0x18,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0xD4,0x0E,0x10,0x36, +0xED,0x3F,0x11,0x3C, +0x1C,0x00,0xA2,0xAF, +0x00,0x00,0xC3,0x8F, +0xFB,0x92,0x25,0x36, +0x25,0xB0,0x17,0x3C, +0x20,0x00,0xA3,0xAF, +0x00,0x00,0x82,0x8E, +0x25,0xB0,0x03,0x3C, +0x80,0x0E,0x63,0x34, +0x24,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x25,0xB0,0x02,0x3C, +0x84,0x0E,0x42,0x34, +0x28,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0x88,0x0E,0x63,0x34, +0x2C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x25,0xB0,0x02,0x3C, +0x8C,0x0E,0x42,0x34, +0x30,0x00,0xA3,0xAF, +0x00,0x00,0x42,0x8C, +0x25,0xB0,0x03,0x3C, +0xD0,0x0E,0x63,0x34, +0x34,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x00,0x00,0x00,0x00, +0x38,0x00,0xA3,0xAF, +0x00,0x00,0x02,0x8E, +0x25,0xB0,0x03,0x3C, +0xD8,0x0E,0x63,0x34, +0x3C,0x00,0xA2,0xAF, +0x00,0x00,0x63,0x8C, +0x02,0x5C,0x00,0x0C, +0x40,0x00,0xA3,0xAF, +0x21,0x20,0x40,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x60,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x05,0x3C, +0xC0,0xED,0xA5,0x24, +0x00,0x00,0xA4,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x13,0x3C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x20,0xC0,0x03, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x20,0x80,0x02, +0x02,0x80,0x02,0x3C, +0xC4,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0xA0,0x00,0x12,0x3C, +0x02,0x80,0x03,0x3C, +0xC8,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x05,0x3C, +0xCC,0xED,0xA5,0x24, +0x00,0x00,0xA4,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x02,0x3C, +0xD0,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x03,0x3C, +0xD4,0xED,0x63,0x24, +0x00,0x00,0x64,0x8C, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x21,0x20,0x00,0x02, +0x02,0x5C,0x00,0x0C, +0xFB,0x92,0x25,0x36, +0x02,0x80,0x05,0x3C, +0xD8,0xED,0xA5,0x24, +0x00,0x00,0xA4,0x8C, +0xFB,0x92,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x80,0x00,0x00, +0x14,0x02,0x11,0x3C, +0x20,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x65,0x36, +0x28,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x65,0x36, +0x30,0x54,0x45,0x36, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x08,0x00,0x05,0x3C, +0xE4,0x00,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x80,0x80,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x28,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x02,0x01,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x40,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x16,0x68,0x05,0x3C, +0xC2,0x04,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x44,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0xD1,0x28,0x05,0x24, +0x02,0x5C,0x00,0x0C, +0x4C,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x02,0x01,0x25,0x36, +0x02,0x5C,0x00,0x0C, +0x60,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x16,0x28,0x05,0x3C, +0x05,0x0D,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x64,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xFB,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0x22,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x00,0x02,0x05,0x3C, +0xD1,0x28,0xA5,0x34, +0x02,0x5C,0x00,0x0C, +0x6C,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xFB,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x00,0xF8,0x05,0x3C, +0x02,0x5C,0x00,0x0C, +0x48,0x0E,0xE4,0x36, +0x25,0x22,0x00,0x0C, +0x02,0x00,0x04,0x24, +0x33,0x54,0x45,0x36, +0x02,0x5C,0x00,0x0C, +0x04,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0xE4,0x00,0x05,0x24, +0x02,0x5C,0x00,0x0C, +0x08,0x0C,0xE4,0x36, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x28,0x0E,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0x00,0x00, +0x20,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x28,0x08,0xE4,0x36, +0x02,0x5C,0x00,0x0C, +0x00,0x01,0x05,0x3C, +0x25,0xB0,0x02,0x3C, +0xAC,0x0E,0x42,0x34, +0x00,0x00,0x5E,0x8C, +0x00,0xD8,0x02,0x3C, +0x24,0x10,0xC2,0x03, +0x37,0x00,0x40,0x10, +0x01,0x00,0x10,0x26, +0x0A,0x00,0x02,0x2E, +0x97,0xFF,0x40,0x14, +0x00,0x00,0x00,0x00, +0x10,0x00,0xA5,0x8F, +0x25,0xB0,0x10,0x3C, +0x02,0x5C,0x00,0x0C, +0xE0,0x0E,0x04,0x36, +0x14,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xDC,0x0E,0x04,0x36, +0x18,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x70,0x0E,0x04,0x36, +0x1C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x74,0x0E,0x04,0x36, +0x20,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x78,0x0E,0x04,0x36, +0x24,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x7C,0x0E,0x04,0x36, +0x28,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x80,0x0E,0x04,0x36, +0x2C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x84,0x0E,0x04,0x36, +0x30,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x88,0x0E,0x04,0x36, +0x34,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0x8C,0x0E,0x04,0x36, +0x38,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD0,0x0E,0x04,0x36, +0x3C,0x00,0xA5,0x8F, +0x02,0x5C,0x00,0x0C, +0xD4,0x0E,0x04,0x36, +0x40,0x00,0xA5,0x8F, +0x88,0x0E,0x04,0x36, +0x6C,0x00,0xBF,0x8F, +0x68,0x00,0xBE,0x8F, +0x64,0x00,0xB7,0x8F, +0x60,0x00,0xB6,0x8F, +0x5C,0x00,0xB5,0x8F, +0x58,0x00,0xB4,0x8F, +0x54,0x00,0xB3,0x8F, +0x50,0x00,0xB2,0x8F, +0x4C,0x00,0xB1,0x8F, +0x48,0x00,0xB0,0x8F, +0x02,0x5C,0x00,0x08, +0x70,0x00,0xBD,0x27, +0x80,0x0C,0xF1,0x36, +0x94,0x0E,0xE3,0x36, +0x00,0x00,0x24,0x8E, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x03,0x3C, +0xFF,0x03,0x95,0x30, +0x24,0x10,0x43,0x00, +0x02,0x14,0x02,0x00, +0x18,0x00,0x55,0x00, +0x02,0x80,0x10,0x3C, +0x30,0x1F,0x10,0x26, +0x0C,0x00,0x02,0x8E, +0x00,0xFC,0x12,0x24, +0x00,0x00,0x3E,0x8E, +0x24,0x10,0x52,0x00, +0x21,0x20,0x20,0x02, +0x24,0x30,0xD2,0x03, +0xFF,0xFF,0x13,0x3C, +0xFF,0x03,0x73,0x36, +0x12,0x18,0x00,0x00, +0x02,0x1A,0x03,0x00, +0xFF,0x03,0x63,0x30, +0x25,0x10,0x43,0x00, +0xFF,0x03,0x45,0x30, +0x25,0x28,0xC5,0x00, +0x02,0x5C,0x00,0x0C, +0x0C,0x00,0x02,0xAE, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x9C,0x0E,0xE3,0x36, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x03,0x3C, +0x0C,0x00,0x06,0x8E, +0x24,0x10,0x43,0x00, +0x02,0xB4,0x02,0x00, +0x18,0x00,0xD5,0x02, +0xF0,0xFF,0x02,0x3C, +0xFF,0x03,0x42,0x34, +0x24,0x30,0xC2,0x00, +0x00,0x00,0x3E,0x8E, +0xC0,0xFF,0x04,0x3C, +0xFF,0xFF,0x84,0x34, +0x24,0x10,0xC4,0x03, +0x21,0x20,0x20,0x02, +0xFF,0x0F,0x11,0x3C, +0xFF,0xFF,0x31,0x36, +0x12,0x18,0x00,0x00, +0x02,0x1A,0x03,0x00, +0xFF,0x03,0x63,0x30, +0x80,0x1A,0x03,0x00, +0x25,0x30,0xC3,0x00, +0x82,0x2A,0x06,0x00, +0x3F,0x00,0xA5,0x30, +0x00,0x2C,0x05,0x00, +0x0C,0x00,0x06,0xAE, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x45,0x00, +0x94,0x0C,0xE4,0x36, +0x00,0x00,0x9E,0x8C, +0x82,0x29,0x16,0x00, +0x00,0x2F,0x05,0x00, +0x24,0x10,0xD1,0x03, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x45,0x00, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0xB0,0x05,0x3C, +0xA4,0x0E,0xE3,0x36, +0x14,0x0C,0xA5,0x34, +0x00,0x00,0xBE,0x8C, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x05,0x3C, +0x02,0x80,0x03,0x3C, +0xDC,0xED,0x63,0x24, +0x24,0x10,0x45,0x00, +0x00,0x00,0x64,0x8C, +0x02,0x14,0x02,0x00, +0x24,0x18,0xD2,0x03, +0x25,0xF0,0x62,0x00, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0xC0,0x03, +0x25,0xB0,0x02,0x3C, +0xAC,0x0E,0x42,0x34, +0x00,0x00,0x45,0x8C, +0x3F,0x00,0x03,0x3C, +0x24,0x10,0xD3,0x03, +0x24,0x28,0xA3,0x00, +0x82,0x29,0x05,0x00, +0x25,0x28,0x45,0x00, +0x02,0x80,0x02,0x3C, +0xDC,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x02,0x5C,0x00,0x0C, +0x00,0x00,0x00,0x00, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0xB0,0x05,0x3C, +0xB4,0x0E,0xE3,0x36, +0x88,0x0C,0xA5,0x34, +0x00,0x00,0xA4,0x8C, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x03,0x3C, +0xFF,0x03,0x95,0x30, +0x24,0x10,0x43,0x00, +0x02,0x14,0x02,0x00, +0x18,0x00,0x55,0x00, +0x0C,0x00,0x06,0x8E, +0x00,0x00,0xBE,0x8C, +0x02,0x80,0x02,0x3C, +0x24,0x30,0xD2,0x00, +0xE0,0xED,0x42,0x24, +0x00,0x00,0x44,0x8C, +0x24,0x10,0xD2,0x03, +0x12,0x18,0x00,0x00, +0x02,0x1A,0x03,0x00, +0xFF,0x03,0x63,0x30, +0x25,0x30,0xC3,0x00, +0xFF,0x03,0xC5,0x30, +0x25,0x28,0x45,0x00, +0x02,0x5C,0x00,0x0C, +0x0C,0x00,0x06,0xAE, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0xBC,0x0E,0xE2,0x36, +0x00,0x00,0x43,0x8C, +0xFF,0x03,0x05,0x3C, +0x0C,0x00,0x06,0x8E, +0x24,0x18,0x65,0x00, +0x02,0xB4,0x03,0x00, +0x18,0x00,0xD5,0x02, +0x25,0xB0,0x04,0x3C, +0x88,0x0C,0x84,0x34, +0xF0,0xFF,0x03,0x3C, +0x00,0x00,0x9E,0x8C, +0xFF,0x03,0x63,0x34, +0x24,0x30,0xC3,0x00, +0xC0,0xFF,0x04,0x3C, +0x02,0x80,0x05,0x3C, +0xFF,0xFF,0x84,0x34, +0xE0,0xED,0xA5,0x24, +0x24,0xF0,0xC4,0x03, +0x00,0x00,0xA4,0x8C, +0x44,0x00,0xBE,0xAF, +0x12,0x10,0x00,0x00, +0x02,0x12,0x02,0x00, +0xFF,0x03,0x42,0x30, +0x80,0x12,0x02,0x00, +0x25,0x30,0xC2,0x00, +0x82,0x2A,0x06,0x00, +0x3F,0x00,0xA5,0x30, +0x00,0x2C,0x05,0x00, +0x0C,0x00,0x06,0xAE, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0xC5,0x03, +0x9C,0x0C,0xE4,0x36, +0x00,0x00,0x9E,0x8C, +0x82,0x29,0x16,0x00, +0x00,0x2F,0x05,0x00, +0x24,0x88,0xD1,0x03, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x25,0x02, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x25,0xB0,0x02,0x3C, +0xC4,0x0E,0xE3,0x36, +0x1C,0x0C,0x42,0x34, +0x00,0x00,0x5E,0x8C, +0x00,0x00,0x62,0x8C, +0xFF,0x03,0x05,0x3C, +0x02,0x80,0x03,0x3C, +0xE4,0xED,0x63,0x24, +0x24,0x10,0x45,0x00, +0x00,0x00,0x64,0x8C, +0x02,0x14,0x02,0x00, +0x24,0x90,0xD2,0x03, +0x25,0xF0,0x42,0x02, +0x02,0x5C,0x00,0x0C, +0x21,0x28,0xC0,0x03, +0xCC,0x0E,0xE2,0x36, +0x00,0x00,0x45,0x8C, +0x02,0x80,0x02,0x3C, +0xE4,0xED,0x42,0x24, +0x3F,0x00,0x03,0x3C, +0x00,0x00,0x44,0x8C, +0x24,0x28,0xA3,0x00, +0x24,0x98,0xD3,0x03, +0x82,0x29,0x05,0x00, +0x02,0x5C,0x00,0x0C, +0x25,0x28,0x65,0x02, +0x54,0x22,0x00,0x0C, +0x05,0x00,0x04,0x24, +0x5C,0x6D,0x00,0x08, +0x00,0x00,0x00,0x00, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x42,0x00,0x03,0x24, +0x10,0x00,0xA3,0xA3, +0xF1,0x3A,0x40,0xA0, +0x4E,0x00,0x03,0x24, +0x43,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x9C,0xF3,0xE7,0x24, +0x11,0x00,0xA2,0xA3, +0x12,0x00,0xA3,0xA3, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0xDC,0xAC,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x48,0xFD,0xBD,0x27, +0xE8,0xED,0x46,0x24, +0x02,0x80,0x03,0x3C, +0xB0,0x02,0xB2,0xAF, +0xAC,0x02,0xB1,0xAF, +0xA8,0x02,0xB0,0xAF, +0x33,0x1F,0x60,0xA0, +0x21,0x38,0xA0,0x03, +0x90,0x00,0xC8,0x24, +0x00,0x00,0xC2,0x8C, +0x04,0x00,0xC3,0x8C, +0x08,0x00,0xC4,0x8C, +0x0C,0x00,0xC5,0x8C, +0x10,0x00,0xC6,0x24, +0x00,0x00,0xE2,0xAC, +0x04,0x00,0xE3,0xAC, +0x08,0x00,0xE4,0xAC, +0x0C,0x00,0xE5,0xAC, +0xF6,0xFF,0xC8,0x14, +0x10,0x00,0xE7,0x24, +0x00,0x00,0xC3,0x8C, +0x02,0x80,0x02,0x3C, +0x7C,0xEE,0x58,0x24, +0x00,0x00,0xE3,0xAC, +0x98,0x00,0xB9,0x27, +0x00,0x01,0x12,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x09,0x00,0x04,0x93, +0x0D,0x00,0x05,0x93, +0x00,0x00,0x11,0x93, +0x02,0x00,0x0D,0x93, +0x04,0x00,0x10,0x93, +0x06,0x00,0x0C,0x93, +0x08,0x00,0x0F,0x93, +0x0A,0x00,0x07,0x93, +0x0C,0x00,0x0E,0x93, +0x0E,0x00,0x06,0x93, +0x03,0x00,0x08,0x93, +0x07,0x00,0x09,0x93, +0x0B,0x00,0x0A,0x93, +0x0F,0x00,0x0B,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x25,0x10,0x51,0x00, +0x25,0x18,0x70,0x00, +0x25,0x20,0x8F,0x00, +0x25,0x28,0xAE,0x00, +0x00,0x6C,0x0D,0x00, +0x00,0x64,0x0C,0x00, +0x00,0x3C,0x07,0x00, +0x00,0x34,0x06,0x00, +0x25,0x68,0xA2,0x01, +0x25,0x60,0x83,0x01, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x00,0x46,0x08,0x00, +0x00,0x4E,0x09,0x00, +0x00,0x56,0x0A,0x00, +0x00,0x5E,0x0B,0x00, +0x25,0x40,0x0D,0x01, +0x25,0x48,0x2C,0x01, +0x25,0x50,0x47,0x01, +0x25,0x58,0x66,0x01, +0x10,0x00,0x18,0x27, +0x00,0x00,0x28,0xAF, +0x04,0x00,0x29,0xAF, +0x08,0x00,0x2A,0xAF, +0x0C,0x00,0x2B,0xAF, +0xD2,0xFF,0x12,0x17, +0x10,0x00,0x39,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x00,0x00,0x09,0x93, +0x02,0x00,0x04,0x93, +0x04,0x00,0x08,0x93, +0x06,0x00,0x05,0x93, +0x07,0x00,0x06,0x93, +0x03,0x00,0x07,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x10,0x49,0x00, +0x25,0x18,0x68,0x00, +0x00,0x24,0x04,0x00, +0x00,0x2C,0x05,0x00, +0x25,0x20,0x82,0x00, +0x25,0x28,0xA3,0x00, +0x00,0x3E,0x07,0x00, +0x00,0x36,0x06,0x00, +0x02,0x80,0x02,0x3C, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x84,0xEF,0x58,0x24, +0x04,0x00,0x26,0xAF, +0x00,0x00,0x27,0xAF, +0x00,0x01,0x12,0x27, +0xA0,0x01,0xB9,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x09,0x00,0x04,0x93, +0x0D,0x00,0x05,0x93, +0x00,0x00,0x11,0x93, +0x02,0x00,0x0D,0x93, +0x04,0x00,0x10,0x93, +0x06,0x00,0x0C,0x93, +0x08,0x00,0x0F,0x93, +0x0A,0x00,0x07,0x93, +0x0C,0x00,0x0E,0x93, +0x0E,0x00,0x06,0x93, +0x03,0x00,0x08,0x93, +0x07,0x00,0x09,0x93, +0x0B,0x00,0x0A,0x93, +0x0F,0x00,0x0B,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x00,0x22,0x04,0x00, +0x00,0x2A,0x05,0x00, +0x25,0x10,0x51,0x00, +0x25,0x18,0x70,0x00, +0x25,0x20,0x8F,0x00, +0x25,0x28,0xAE,0x00, +0x00,0x6C,0x0D,0x00, +0x00,0x64,0x0C,0x00, +0x00,0x3C,0x07,0x00, +0x00,0x34,0x06,0x00, +0x25,0x68,0xA2,0x01, +0x25,0x60,0x83,0x01, +0x25,0x38,0xE4,0x00, +0x25,0x30,0xC5,0x00, +0x00,0x46,0x08,0x00, +0x00,0x4E,0x09,0x00, +0x00,0x56,0x0A,0x00, +0x00,0x5E,0x0B,0x00, +0x25,0x40,0x0D,0x01, +0x25,0x48,0x2C,0x01, +0x25,0x50,0x47,0x01, +0x25,0x58,0x66,0x01, +0x10,0x00,0x18,0x27, +0x00,0x00,0x28,0xAF, +0x04,0x00,0x29,0xAF, +0x08,0x00,0x2A,0xAF, +0x0C,0x00,0x2B,0xAF, +0xD2,0xFF,0x12,0x17, +0x10,0x00,0x39,0x27, +0x01,0x00,0x02,0x93, +0x05,0x00,0x03,0x93, +0x00,0x00,0x09,0x93, +0x02,0x00,0x04,0x93, +0x04,0x00,0x08,0x93, +0x06,0x00,0x05,0x93, +0x07,0x00,0x06,0x93, +0x03,0x00,0x07,0x93, +0x00,0x12,0x02,0x00, +0x00,0x1A,0x03,0x00, +0x25,0x10,0x49,0x00, +0x25,0x18,0x68,0x00, +0x00,0x24,0x04,0x00, +0x00,0x2C,0x05,0x00, +0x25,0x20,0x82,0x00, +0x25,0x28,0xA3,0x00, +0x00,0x3E,0x07,0x00, +0x00,0x36,0x06,0x00, +0x25,0x30,0xC5,0x00, +0x25,0x38,0xE4,0x00, +0x02,0x80,0x02,0x3C, +0x04,0x00,0x26,0xAF, +0x00,0x00,0x27,0xAF, +0x30,0x1F,0x46,0x24, +0x21,0x50,0x00,0x00, +0x80,0x20,0x0A,0x00, +0x21,0x10,0x9D,0x00, +0x00,0x00,0x45,0x8C, +0x01,0x00,0x43,0x25, +0xFF,0x00,0x6A,0x30, +0x21,0x20,0x86,0x00, +0x25,0x00,0x42,0x2D, +0xF8,0xFF,0x40,0x14, +0x18,0x00,0x85,0xAC, +0x02,0x80,0x02,0x3C, +0x30,0x1F,0x4B,0x24, +0x21,0x50,0x00,0x00, +0xC0,0x10,0x0A,0x00, +0x21,0x48,0x5D,0x00, +0x21,0x38,0x00,0x00, +0x21,0x40,0x4B,0x00, +0x21,0x10,0x27,0x01, +0xA0,0x01,0x46,0x90, +0x98,0x00,0x45,0x90, +0x01,0x00,0xE4,0x24, +0x21,0x18,0x07,0x01, +0xFF,0x00,0x87,0x30, +0x08,0x00,0xE2,0x2C, +0xB4,0x01,0x66,0xA0, +0xF7,0xFF,0x40,0x14, +0xAC,0x00,0x65,0xA0, +0x01,0x00,0x42,0x25, +0xFF,0x00,0x4A,0x30, +0x21,0x00,0x43,0x2D, +0xEF,0xFF,0x60,0x14, +0xC0,0x10,0x0A,0x00, +0x08,0x00,0x64,0x8D, +0xFF,0x7F,0x07,0x3C, +0xFF,0xFF,0xE7,0x34, +0xC0,0xFF,0x02,0x24, +0x24,0x20,0x87,0x00, +0x24,0x20,0x82,0x00, +0x0C,0x00,0x84,0x34, +0xFF,0xC0,0x02,0x24, +0x24,0x20,0x82,0x00, +0xC0,0xFF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x00,0x18,0x84,0x34, +0xBF,0xFF,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0x7F,0xFF,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xFF,0xFF,0x42,0x34, +0x24,0x20,0x82,0x00, +0x0C,0x00,0x65,0x8D, +0x7F,0xFF,0x03,0x24, +0x40,0x40,0x84,0x34, +0xFF,0xFF,0x02,0x3C, +0x24,0x20,0x83,0x00, +0xFF,0x7F,0x42,0x34, +0xFF,0xBF,0x03,0x3C, +0x10,0x00,0x66,0x8D, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0xFF,0x9F,0x02,0x3C, +0x24,0x28,0xA3,0x00, +0xFF,0xFF,0x42,0x34, +0xFF,0x3F,0x03,0x3C, +0x24,0x20,0x82,0x00, +0xFF,0xFF,0x63,0x34, +0x12,0x00,0x02,0x24, +0xB0,0x02,0xB2,0x8F, +0xAC,0x02,0xB1,0x8F, +0xA8,0x02,0xB0,0x8F, +0x24,0x30,0xC3,0x00, +0xC7,0x02,0x62,0xA1, +0x1F,0x00,0x03,0x24, +0x01,0x00,0x02,0x24, +0x24,0x28,0xA7,0x00, +0xBE,0x02,0x63,0xA1, +0xC0,0x02,0x62,0xA1, +0xFF,0x00,0x03,0x24, +0xFF,0xFF,0x02,0x24, +0xB8,0x02,0xBD,0x27, +0x08,0x00,0x64,0xAD, +0x10,0x00,0x66,0xAD, +0x0C,0x00,0x65,0xAD, +0xC2,0x02,0x62,0xA1, +0xC4,0x02,0x63,0xA5, +0xBF,0x02,0x60,0xA1, +0x08,0x00,0xE0,0x03, +0xC6,0x02,0x60,0xA1, +0x02,0x80,0x0B,0x3C, +0x30,0x1F,0x67,0x25, +0xE0,0xFF,0xBD,0x27, +0xE6,0x02,0xE0,0xA0, +0x18,0x00,0xBF,0xAF, +0xE4,0x02,0xE8,0x8C, +0xFF,0xCF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x30,0x1F,0x69,0x8D, +0x24,0x40,0x02,0x01, +0xFF,0xBF,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0xF0,0xFF,0x03,0x24, +0x24,0x40,0x02,0x01, +0xFF,0x7F,0x02,0x3C, +0x24,0x48,0x23,0x01, +0xFF,0xFF,0x42,0x34, +0xFF,0xF0,0x03,0x24, +0x24,0x48,0x23,0x01, +0x24,0x40,0x02,0x01, +0x20,0x00,0x03,0x24, +0x0A,0x00,0x02,0x24, +0x30,0x1F,0x69,0xAD, +0xD2,0x02,0xE2,0xA0, +0xD7,0x02,0xE3,0xA0, +0x20,0x00,0x02,0x24, +0x00,0x01,0x03,0x24, +0xC8,0x02,0xE2,0xA4, +0xCA,0x02,0xE3,0xA4, +0x00,0x02,0x02,0x24, +0x49,0x00,0x03,0x24, +0x02,0x80,0x0A,0x3C, +0xE4,0x02,0xE8,0xAC, +0x80,0xF3,0x4A,0x25, +0xFF,0xFF,0x0D,0x34, +0x3E,0x00,0x0E,0x24, +0x1C,0x00,0x0F,0x24, +0x01,0x00,0x0C,0x24, +0x11,0x00,0xA3,0xA3, +0xCC,0x02,0xE2,0xA4, +0xD0,0x07,0x03,0x24, +0x44,0x00,0x02,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA2,0xA3, +0x10,0x00,0xA5,0x27, +0x47,0x00,0x02,0x24, +0x21,0x20,0x40,0x01, +0x94,0xAD,0xC6,0x24, +0x04,0x00,0xED,0xAC, +0xD0,0x02,0xEE,0xA0, +0xD1,0x02,0xEF,0xA0, +0x02,0x00,0xEC,0xA0, +0x0C,0x00,0x43,0xAD, +0x14,0x00,0x4C,0xA1, +0x80,0x36,0xED,0xAC, +0xCE,0x02,0xEE,0xA0, +0xCF,0x02,0xEF,0xA0, +0xD6,0x02,0xE0,0xA0, +0xD4,0x02,0xE0,0xA0, +0x12,0x00,0xA2,0xA3, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x50,0x00,0x03,0x24, +0x10,0x00,0xA3,0xA3, +0x16,0x3D,0x40,0xA0, +0x41,0x00,0x03,0x24, +0x52,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x0C,0xF4,0xE7,0x24, +0x11,0x00,0xA2,0xA3, +0x12,0x00,0xA3,0xA3, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x02,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x2C,0x80,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0x02,0x80,0x09,0x3C, +0x30,0x1F,0x23,0x8D, +0xFF,0xFF,0x02,0x24, +0xFF,0x00,0x4B,0x30, +0x0F,0xFF,0x02,0x24, +0x24,0x18,0x62,0x00, +0xFF,0xFF,0x02,0x3C, +0xFF,0x0F,0x42,0x34, +0x24,0x18,0x62,0x00, +0xD8,0xFF,0xBD,0x27, +0x30,0x1F,0x23,0xAD, +0x47,0x00,0x02,0x24, +0x3B,0x00,0x03,0x24, +0x02,0x80,0x08,0x3C, +0x28,0xF4,0x08,0x25, +0x18,0x00,0xB0,0xAF, +0x10,0x00,0xA2,0xA3, +0x30,0x1F,0x30,0x25, +0x11,0x00,0xA3,0xA3, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x01,0x00,0x07,0x3C, +0x01,0x80,0x06,0x3C, +0x04,0x03,0x0B,0xAE, +0x1C,0x00,0xB1,0xAF, +0x56,0x30,0xEA,0x34, +0x43,0x00,0x11,0x24, +0xF4,0x98,0xE7,0x34, +0x10,0x00,0xA5,0x27, +0x0C,0x00,0x02,0xAD, +0x14,0x00,0x03,0xA1, +0x21,0x20,0x00,0x01, +0x1C,0xB9,0xC6,0x24, +0x20,0x00,0xBF,0xAF, +0x12,0x00,0xB1,0xA3, +0x0C,0x03,0x07,0xAE, +0x10,0x03,0x0A,0xAE, +0x13,0x00,0xA0,0xA3, +0x08,0x03,0x00,0xAE, +0x14,0x03,0x00,0xAE, +0xA2,0x23,0x00,0x0C, +0x18,0x03,0x00,0xAE, +0x1E,0x00,0x02,0x24, +0x21,0x03,0x02,0xA2, +0x4A,0x00,0x03,0x24, +0x45,0x00,0x02,0x24, +0x1C,0x03,0x03,0xA2, +0x1D,0x03,0x02,0xA2, +0x23,0x00,0x03,0x24, +0x3E,0x00,0x02,0x24, +0x1E,0x03,0x11,0xA2, +0x1F,0x03,0x02,0xA2, +0x20,0x03,0x03,0xA2, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x3B,0x00,0x02,0x24, +0x43,0x00,0x03,0x24, +0x10,0x00,0xA2,0xA3, +0x11,0x00,0xA3,0xA3, +0x36,0x00,0x02,0x24, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x07,0x3C, +0x44,0xF4,0xE7,0x24, +0x12,0x00,0xA2,0xA3, +0x03,0x22,0x60,0xA0, +0xD0,0x07,0x02,0x24, +0x01,0x00,0x03,0x24, +0x01,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x50,0xBD,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xE0,0xFF,0xBD,0x27, +0x02,0x80,0x02,0x3C, +0x52,0x00,0x03,0x24, +0x10,0x00,0xA3,0xA3, +0xB8,0x55,0x40,0xA4, +0x54,0x00,0x03,0x24, +0x53,0x00,0x02,0x24, +0x02,0x80,0x07,0x3C, +0x7C,0xF4,0xE7,0x24, +0x11,0x00,0xA2,0xA3, +0x12,0x00,0xA3,0xA3, +0xF4,0x01,0x02,0x24, +0x01,0x00,0x03,0x24, +0x02,0x80,0x06,0x3C, +0x10,0x00,0xA5,0x27, +0x21,0x20,0xE0,0x00, +0x70,0x81,0xC6,0x24, +0x0C,0x00,0xE2,0xAC, +0x14,0x00,0xE3,0xA0, +0x18,0x00,0xBF,0xAF, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x18,0x00,0xBF,0x8F, +0x00,0x00,0x00,0x00, +0x08,0x00,0xE0,0x03, +0x20,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x02,0x80,0x03,0x3C, +0x20,0x00,0xBF,0xAF, +0x1C,0x00,0xB1,0xAF, +0x18,0x00,0xB0,0xAF, +0x58,0xE9,0x62,0x24, +0x58,0xE9,0x67,0x94, +0x02,0x00,0x48,0x90, +0x02,0x80,0x02,0x3C, +0xD8,0x5E,0x42,0x24, +0x02,0x00,0x11,0x24, +0x01,0x80,0x06,0x3C, +0x21,0x20,0x40,0x00, +0x14,0x00,0x51,0xA0, +0x10,0x00,0xA5,0x27, +0x6C,0xCE,0xC6,0x24, +0x02,0x80,0x10,0x3C, +0x10,0x00,0xA7,0xA7, +0x28,0x5F,0x10,0x26, +0x12,0x00,0xA8,0xA3, +0xA2,0x23,0x00,0x0C, +0x13,0x00,0xA0,0xA3, +0x02,0x80,0x06,0x3C, +0x21,0x20,0x00,0x02, +0x10,0x00,0xA5,0x27, +0x14,0x00,0x11,0xA2, +0xA2,0x23,0x00,0x0C, +0x7C,0x82,0xC6,0x24, +0x02,0x80,0x03,0x3C, +0xDE,0x5D,0x62,0x90, +0x02,0x00,0x07,0x24, +0x0C,0x00,0x04,0x24, +0x02,0x00,0x42,0x30, +0x01,0x00,0x42,0x2C, +0x23,0x38,0xE2,0x00, +0xE8,0x03,0x02,0x24, +0x0C,0x00,0x02,0xAE, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF4,0x5E,0x60,0xA0, +0xF5,0x5E,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF6,0x5E,0x64,0xA0, +0x0D,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x13,0x5F,0x60,0xA0, +0x01,0x00,0x06,0x24, +0x14,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF8,0x5E,0x66,0xA0, +0x0F,0x00,0x04,0x24, +0x15,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0xF7,0x5E,0x66,0xA0, +0xF9,0x5E,0x44,0xA0, +0x02,0x80,0x03,0x3C, +0x08,0x00,0x04,0x24, +0x02,0x80,0x02,0x3C, +0xFA,0x5E,0x60,0xA0, +0x64,0x00,0x05,0x24, +0x04,0x5F,0x44,0xA4, +0x02,0x80,0x03,0x3C, +0x01,0x00,0x02,0x3C, +0xFC,0x5E,0x65,0xA4, +0x00,0x90,0x42,0x34, +0x02,0x80,0x03,0x3C, +0x00,0x5F,0x62,0xAC, +0x02,0x80,0x04,0x3C, +0x02,0x80,0x02,0x3C, +0x08,0x5F,0x80,0xAC, +0x02,0x80,0x03,0x3C, +0x0C,0x5F,0x40,0xA0, +0x02,0x80,0x02,0x3C, +0x0E,0x5F,0x60,0xA0, +0x16,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x44,0x5F,0x67,0xA0, +0x20,0x00,0xBF,0x8F, +0x0F,0x5F,0x40,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x1C,0x00,0xB1,0x8F, +0x18,0x00,0xB0,0x8F, +0x10,0x5F,0x66,0xA0, +0x11,0x5F,0x46,0xA0, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x12,0x5F,0x60,0xA0, +0x21,0x20,0x00,0x00, +0x18,0x5F,0x40,0xAC, +0x02,0x80,0x03,0x3C, +0x02,0x80,0x02,0x3C, +0x21,0x28,0x00,0x00, +0x28,0x00,0xBD,0x27, +0x1C,0x5F,0x60,0xAC, +0x20,0x5F,0x44,0xAC, +0x24,0x5F,0x45,0xAC, +0x08,0x00,0xE0,0x03, +0x00,0x00,0x00,0x00, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x21,0x98,0xA0,0x00, +0x21,0x88,0xC0,0x00, +0x21,0x90,0x00,0x00, +0x00,0x00,0x04,0x82, +0x7C,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x10,0x26, +0xFF,0xFF,0x10,0x26, +0x00,0x00,0x04,0x92, +0x2B,0x00,0x02,0x24, +0x00,0x1E,0x04,0x00, +0x03,0x1E,0x03,0x00, +0x41,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0x02,0x24, +0x30,0x00,0x22,0x12, +0x00,0x1E,0x04,0x00, +0x07,0x00,0x20,0x16, +0x21,0x18,0x80,0x00, +0x00,0x1E,0x04,0x00, +0x03,0x1E,0x03,0x00, +0x30,0x00,0x02,0x24, +0x3B,0x00,0x62,0x10, +0x0A,0x00,0x11,0x24, +0x21,0x18,0x80,0x00, +0x00,0x16,0x03,0x00, +0x03,0x16,0x02,0x00, +0x1A,0x00,0x40,0x10, +0xFF,0x00,0x64,0x30, +0xA9,0xFF,0x82,0x24, +0x61,0x00,0x83,0x2C, +0xFF,0x00,0x45,0x30, +0x09,0x00,0x60,0x10, +0x41,0x00,0x86,0x2C, +0xC9,0xFF,0x82,0x24, +0xFF,0x00,0x45,0x30, +0x05,0x00,0xC0,0x10, +0x3A,0x00,0x87,0x2C, +0xD0,0xFF,0x82,0x24, +0x02,0x00,0xE0,0x10, +0xFF,0x00,0x05,0x24, +0xFF,0x00,0x45,0x30, +0x2A,0x10,0xB1,0x00, +0x0A,0x00,0x40,0x10, +0x18,0x00,0x51,0x02, +0x01,0x00,0x10,0x26, +0x12,0x10,0x00,0x00, +0x2B,0x18,0x52,0x00, +0x23,0x00,0x60,0x14, +0x21,0x90,0xA2,0x00, +0x00,0x00,0x03,0x92, +0x00,0x00,0x00,0x00, +0xE8,0xFF,0x60,0x14, +0xFF,0x00,0x64,0x30, +0x02,0x00,0x60,0x12, +0x21,0x10,0x40,0x02, +0x00,0x00,0x70,0xAE, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x03,0x1E,0x03,0x00, +0x30,0x00,0x02,0x24, +0xCE,0xFF,0x62,0x14, +0x00,0x00,0x00,0x00, +0x01,0x00,0x03,0x82, +0x78,0x00,0x02,0x24, +0x03,0x00,0x62,0x10, +0x58,0x00,0x02,0x24, +0xD0,0xFF,0x62,0x14, +0x21,0x18,0x80,0x00, +0x02,0x00,0x10,0x26, +0x00,0x00,0x04,0x92, +0xC0,0x70,0x00,0x08, +0x10,0x00,0x11,0x24, +0x01,0x00,0x10,0x26, +0x00,0x00,0x04,0x92, +0xB7,0x70,0x00,0x08, +0x10,0x00,0x02,0x24, +0xEC,0x70,0x00,0x08, +0x08,0x00,0x11,0x24, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0xFF,0x02,0x24, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x21,0x48,0x80,0x00, +0x31,0x00,0xC0,0x14, +0x21,0x50,0x00,0x00, +0x00,0x00,0x87,0x90, +0x30,0x00,0x02,0x24, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0x2E,0x00,0x62,0x10, +0x0A,0x00,0x06,0x24, +0x02,0x80,0x02,0x3C, +0x40,0xF2,0x4B,0x24, +0xFF,0x00,0xE8,0x30, +0x21,0x10,0x0B,0x01, +0x00,0x00,0x44,0x90, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0x44,0x00,0x82,0x30, +0x02,0x00,0x87,0x30, +0xD0,0xFF,0x63,0x24, +0x1A,0x00,0x40,0x10, +0x04,0x00,0x84,0x30, +0x07,0x00,0x80,0x14, +0x2B,0x10,0x66,0x00, +0x21,0x10,0x00,0x01, +0x02,0x00,0xE0,0x10, +0xE0,0xFF,0x03,0x25, +0xFF,0x00,0x62,0x30, +0xC9,0xFF,0x43,0x24, +0x2B,0x10,0x66,0x00, +0x10,0x00,0x40,0x10, +0x18,0x00,0x46,0x01, +0x01,0x00,0x29,0x25, +0x00,0x00,0x27,0x91, +0x00,0x00,0x00,0x00, +0xFF,0x00,0xE8,0x30, +0x12,0x10,0x00,0x00, +0x21,0x50,0x43,0x00, +0x21,0x10,0x0B,0x01, +0x00,0x00,0x44,0x90, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0x44,0x00,0x82,0x30, +0x02,0x00,0x87,0x30, +0xD0,0xFF,0x63,0x24, +0xE8,0xFF,0x40,0x14, +0x04,0x00,0x84,0x30, +0x02,0x00,0xA0,0x10, +0x00,0x00,0x00,0x00, +0x00,0x00,0xA9,0xAC, +0x08,0x00,0xE0,0x03, +0x21,0x10,0x40,0x01, +0x00,0x00,0x87,0x90, +0x0E,0x71,0x00,0x08, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x89,0x24, +0x00,0x00,0x27,0x91, +0x78,0x00,0x02,0x24, +0x00,0x1E,0x07,0x00, +0x03,0x1E,0x03,0x00, +0xCD,0xFF,0x62,0x14, +0x08,0x00,0x06,0x24, +0x01,0x00,0x22,0x91, +0x02,0x80,0x03,0x3C, +0x40,0xF2,0x63,0x24, +0x21,0x10,0x43,0x00, +0x00,0x00,0x44,0x90, +0x00,0x00,0x00,0x00, +0x44,0x00,0x84,0x30, +0xC5,0xFF,0x80,0x10, +0x02,0x80,0x02,0x3C, +0x01,0x00,0x29,0x25, +0x00,0x00,0x27,0x91, +0x0E,0x71,0x00,0x08, +0x10,0x00,0x06,0x24, +0xE8,0xFF,0xBD,0x27, +0x10,0x00,0xBF,0xAF, +0x00,0x00,0x83,0x80, +0x2D,0x00,0x02,0x24, +0x04,0x00,0x62,0x10, +0x00,0x00,0x00,0x00, +0x10,0x00,0xBF,0x8F, +0x04,0x71,0x00,0x08, +0x18,0x00,0xBD,0x27, +0x04,0x71,0x00,0x0C, +0x01,0x00,0x84,0x24, +0x10,0x00,0xBF,0x8F, +0x23,0x10,0x02,0x00, +0x08,0x00,0xE0,0x03, +0x18,0x00,0xBD,0x27, +0xD8,0xFF,0xBD,0x27, +0x1C,0x00,0xB3,0xAF, +0x18,0x00,0xB2,0xAF, +0x14,0x00,0xB1,0xAF, +0x10,0x00,0xB0,0xAF, +0x20,0x00,0xBF,0xAF, +0x21,0x80,0x80,0x00, +0x21,0x90,0xA0,0x00, +0x21,0x98,0xC0,0x00, +0x21,0x88,0x00,0x00, +0x00,0x00,0x04,0x82, +0x7C,0x55,0x00,0x0C, +0x00,0x00,0x00,0x00, +0xFC,0xFF,0x40,0x14, +0x01,0x00,0x10,0x26, +0xFF,0xFF,0x10,0x26, +0x00,0x00,0x03,0x82, +0x2D,0x00,0x02,0x24, +0x0F,0x00,0x62,0x10, +0x21,0x20,0x00,0x02, +0x21,0x28,0x40,0x02, +0xA0,0x70,0x00,0x0C, +0x21,0x30,0x60,0x02, +0x12,0x00,0x40,0x04, +0x21,0x18,0x40,0x00, +0x23,0x10,0x02,0x00, +0x0A,0x10,0x71,0x00, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x01,0x00,0x10,0x26, +0x21,0x20,0x00,0x02, +0x21,0x28,0x40,0x02, +0xA0,0x70,0x00,0x0C, +0x21,0x30,0x60,0x02, +0xFF,0xFF,0x11,0x24, +0xF0,0xFF,0x41,0x04, +0x21,0x18,0x40,0x00, +0xF0,0xFF,0x20,0x16, +0x00,0x80,0x02,0x3C, +0x20,0x00,0xBF,0x8F, +0x1C,0x00,0xB3,0x8F, +0x18,0x00,0xB2,0x8F, +0x14,0x00,0xB1,0x8F, +0x10,0x00,0xB0,0x8F, +0xFF,0x7F,0x02,0x3C, +0xFF,0xFF,0x42,0x34, +0x08,0x00,0xE0,0x03, +0x28,0x00,0xBD,0x27, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x52,0x54,0x4C,0x38, +0x37,0x31,0x32,0x20, +0x46,0x57,0x20,0x76, +0x65,0x72,0x73,0x69, +0x6F,0x6E,0x20,0x30, +0x2E,0x30,0x2E,0x31, +0x23,0x20,0xE4,0xB8, +0x89,0x20,0x31,0x30, +0xE6,0x9C,0x88,0x20, +0x32,0x38,0x20,0x31, +0x37,0x3A,0x34,0x31, +0x3A,0x34,0x37,0x20, +0x43,0x53,0x54,0x20, +0x32,0x30,0x30,0x39, +0x0A,0x00,0x00,0x00, +0x50,0xC6,0x01,0x80, +0x48,0x43,0x49,0x20, +0x74,0x79,0x70,0x65, +0x3A,0x20,0x25,0x78, +0x28,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x72,0x66,0x5F,0x63, +0x6F,0x66,0x69,0x67, +0x3A,0x20,0x25,0x78, +0x28,0x25,0x78,0x2C, +0x20,0x25,0x78,0x2C, +0x20,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x6D,0x70,0x5F,0x6D, +0x6F,0x64,0x65,0x3A, +0x20,0x25,0x78,0x28, +0x25,0x78,0x29,0x2C, +0x20,0x49,0x51,0x4B, +0x3A,0x20,0x25,0x78, +0x0A,0x00,0x00,0x00, +0x76,0x63,0x73,0x20, +0x74,0x79,0x70,0x65, +0x3A,0x20,0x25,0x78, +0x28,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x33,0x32,0x6B,0x20, +0x63,0x61,0x6C,0x69, +0x62,0x72,0x61,0x3A, +0x20,0x25,0x64,0x2C, +0x20,0x33,0x32,0x4B, +0x20,0x54,0x53,0x46, +0x3A,0x20,0x25,0x78, +0x00,0x00,0x00,0x00, +0x74,0x61,0x72,0x67, +0x65,0x74,0x20,0x74, +0x68,0x65,0x72,0x6D, +0x61,0x6C,0x3A,0x20, +0x25,0x78,0x0A,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x00,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x01,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x02,0x7E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x03,0x7D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x04,0x7C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x05,0x7B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x06,0x7A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x07,0x79, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x08,0x78, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x09,0x77, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0A,0x76, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0B,0x75, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0C,0x74, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0D,0x73, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0E,0x72, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x0F,0x71, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x10,0x70, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x11,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x12,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x13,0x6E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x14,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x15,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x16,0x6C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x17,0x6B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x18,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x19,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1A,0x69, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1B,0x68, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1C,0x67, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1D,0x66, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1E,0x65, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x1F,0x64, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x20,0x63, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x21,0x4C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x22,0x4B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x23,0x4A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x24,0x49, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x25,0x48, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x26,0x47, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x27,0x46, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x28,0x45, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x29,0x44, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2A,0x2C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2B,0x2B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2C,0x2A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2D,0x29, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2E,0x28, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x2F,0x27, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x30,0x26, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x31,0x25, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x32,0x24, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x33,0x23, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x34,0x22, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x35,0x09, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x36,0x08, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x37,0x07, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x38,0x06, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x39,0x05, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3A,0x04, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3B,0x03, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3C,0x02, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3D,0x01, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3E,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x3F,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x40,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x41,0x7F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x42,0x7E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x43,0x7D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x44,0x7C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x45,0x7B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x46,0x7A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x47,0x79, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x48,0x78, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x49,0x77, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4A,0x76, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4B,0x75, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4C,0x74, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4D,0x73, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4E,0x72, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x4F,0x71, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x50,0x70, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x51,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x52,0x6F, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x53,0x6E, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x54,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x55,0x6D, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x56,0x6C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x57,0x6B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x58,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x59,0x6A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5A,0x69, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5B,0x68, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5C,0x67, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5D,0x66, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5E,0x65, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x5F,0x64, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x60,0x63, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x61,0x4C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x62,0x4B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x63,0x4A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x64,0x49, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x65,0x48, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x66,0x47, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x67,0x46, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x68,0x45, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x69,0x44, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6A,0x2C, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6B,0x2B, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6C,0x2A, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6D,0x29, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6E,0x28, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x6F,0x27, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x70,0x26, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x71,0x25, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x72,0x24, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x73,0x23, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x74,0x22, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x75,0x09, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x76,0x08, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x77,0x07, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x78,0x06, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x79,0x05, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7A,0x04, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7B,0x03, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7C,0x02, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7D,0x01, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7E,0x00, +0x78,0x0C,0x00,0x00, +0x01,0x00,0x7F,0x00, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x00,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x01,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x02,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x03,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x04,0x30, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x05,0x34, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x06,0x38, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x07,0x3E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x08,0x3E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x09,0x44, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0A,0x46, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0B,0x48, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0C,0x48, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0D,0x4E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0E,0x56, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x0F,0x5A, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x10,0x5E, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x11,0x62, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x12,0x6C, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x13,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x14,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x15,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x16,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x17,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x18,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x19,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1A,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1B,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1C,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1D,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1E,0x72, +0x78,0x0C,0x00,0x00, +0x1E,0x00,0x1F,0x72, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x06,0x06,0x06,0x04, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x04,0x02,0x02,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x0A,0x08,0x08,0x04, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x04,0x02,0x02,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x0A,0x08,0x08,0x04, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x04,0x02,0x02,0x00, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x00,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x08,0x0E,0x00,0x00, +0x00,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x10,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x14,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x18,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x1C,0x0E,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x00, +0x04,0x08,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0x24,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x2C,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x70,0x08,0x00,0x00, +0x00,0x00,0x00,0x04, +0x01,0x00,0x00,0x00, +0x64,0x08,0x00,0x00, +0x00,0x04,0x00,0x00, +0x01,0x00,0x00,0x00, +0x78,0x08,0x00,0x00, +0x0F,0x00,0x0F,0x00, +0x02,0x00,0x02,0x00, +0x74,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x78,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x7C,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x80,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x06,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x33,0x00,0x00,0x00, +0x04,0x0C,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x33,0x00,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0xF4,0x01,0x00,0x00, +0x00,0x00,0xFF,0xFF, +0xFF,0xFF,0x00,0x00, +0x34,0x02,0x00,0x00, +0x00,0x00,0x00,0xF8, +0x13,0x00,0x00,0x00, +0x04,0x08,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0x24,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x2C,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x02,0x00,0x30,0x00, +0x70,0x08,0x00,0x00, +0x00,0x00,0x00,0x04, +0x01,0x00,0x00,0x00, +0x64,0x08,0x00,0x00, +0x00,0x04,0x00,0x00, +0x00,0x00,0x00,0x00, +0x78,0x08,0x00,0x00, +0x0F,0x00,0x0F,0x00, +0x02,0x00,0x00,0x00, +0x74,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x78,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x7C,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x80,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x11,0x00,0x00,0x00, +0x04,0x0C,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x33,0x00,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0xF4,0x01,0x00,0x00, +0x00,0x00,0xFF,0xFF, +0x77,0x77,0x00,0x00, +0x34,0x02,0x00,0x00, +0x00,0x00,0x00,0xF8, +0x0A,0x00,0x00,0x00, +0x44,0x08,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x01,0x00, +0x04,0x08,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x24,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x04,0x00,0x30,0x00, +0x2C,0x08,0x00,0x00, +0x0F,0x00,0xF0,0x00, +0x02,0x00,0x10,0x00, +0x70,0x08,0x00,0x00, +0x00,0x00,0x00,0x04, +0x01,0x00,0x00,0x00, +0x64,0x08,0x00,0x00, +0x00,0x04,0x00,0x00, +0x00,0x00,0x00,0x00, +0x78,0x08,0x00,0x00, +0x0F,0x00,0x0F,0x00, +0x02,0x00,0x00,0x00, +0x74,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x78,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x7C,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x80,0x0E,0x00,0x00, +0x00,0x00,0x00,0x0F, +0x02,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x11,0x00,0x00,0x00, +0x04,0x0C,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x11,0x00,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x0F,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0xF4,0x01,0x00,0x00, +0x00,0x00,0xFF,0xFF, +0x77,0x77,0x00,0x00, +0x34,0x02,0x00,0x00, +0x00,0x00,0x00,0xF8, +0x0A,0x00,0x00,0x00, +0x1C,0x00,0x00,0x00, +0x00,0x00,0x00,0x07, +0x00,0x08,0x00,0x00, +0x00,0x00,0x04,0x00, +0x04,0x08,0x00,0x00, +0x03,0x80,0x00,0x00, +0x08,0x08,0x00,0x00, +0x00,0xFC,0x00,0x00, +0x0C,0x08,0x00,0x00, +0x0A,0x00,0x00,0x00, +0x10,0x08,0x00,0x00, +0x88,0x50,0x00,0x10, +0x14,0x08,0x00,0x00, +0x10,0x3D,0x0C,0x02, +0x18,0x08,0x00,0x00, +0x85,0x01,0x20,0x00, +0x1C,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x20,0x08,0x00,0x00, +0x00,0x00,0x00,0x01, +0x24,0x08,0x00,0x00, +0x04,0x00,0x39,0x00, +0x28,0x08,0x00,0x00, +0x00,0x00,0x00,0x01, +0x2C,0x08,0x00,0x00, +0x04,0x00,0x39,0x00, +0x30,0x08,0x00,0x00, +0x04,0x00,0x00,0x00, +0x34,0x08,0x00,0x00, +0x00,0x02,0x69,0x00, +0x38,0x08,0x00,0x00, +0x04,0x00,0x00,0x00, +0x3C,0x08,0x00,0x00, +0x00,0x02,0x69,0x00, +0x40,0x08,0x00,0x00, +0x00,0x00,0x01,0x00, +0x44,0x08,0x00,0x00, +0x00,0x00,0x01,0x00, +0x48,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x4C,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x50,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x54,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x58,0x08,0x00,0x00, +0x48,0x48,0x48,0x48, +0x5C,0x08,0x00,0x00, +0xA9,0x65,0xA9,0x65, +0x60,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x64,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x68,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x6C,0x08,0x00,0x00, +0x30,0x01,0x7F,0x0F, +0x70,0x08,0x00,0x00, +0x00,0x07,0x00,0x03, +0x74,0x08,0x00,0x00, +0x00,0x03,0x00,0x03, +0x78,0x08,0x00,0x00, +0x02,0x00,0x02,0x00, +0x7C,0x08,0x00,0x00, +0x01,0x02,0x4F,0x00, +0x80,0x08,0x00,0x00, +0xC1,0x0A,0x30,0xA8, +0x84,0x08,0x00,0x00, +0x58,0x00,0x00,0x00, +0x88,0x08,0x00,0x00, +0x08,0x00,0x00,0x00, +0x8C,0x08,0x00,0x00, +0x04,0x00,0x00,0x00, +0x90,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x94,0x08,0x00,0x00, +0xFE,0xFF,0xFF,0xFF, +0x98,0x08,0x00,0x00, +0x10,0x20,0x30,0x40, +0x9C,0x08,0x00,0x00, +0x50,0x60,0x70,0x00, +0xB0,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0xE0,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0xE4,0x08,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x0E,0x00,0x00, +0x33,0x33,0x33,0x30, +0x04,0x0E,0x00,0x00, +0x2F,0x2E,0x2D,0x2A, +0x08,0x0E,0x00,0x00, +0x32,0x32,0x00,0x00, +0x10,0x0E,0x00,0x00, +0x33,0x33,0x33,0x30, +0x14,0x0E,0x00,0x00, +0x2F,0x2E,0x2D,0x2A, +0x18,0x0E,0x00,0x00, +0x33,0x33,0x33,0x30, +0x1C,0x0E,0x00,0x00, +0x2F,0x2E,0x2D,0x2A, +0x30,0x0E,0x00,0x00, +0x00,0x7C,0x00,0x01, +0x34,0x0E,0x00,0x00, +0x00,0x48,0x00,0x01, +0x38,0x0E,0x00,0x00, +0x1F,0xDC,0x00,0x10, +0x3C,0x0E,0x00,0x00, +0x1F,0x8C,0x00,0x10, +0x40,0x0E,0x00,0x00, +0xA0,0x00,0x14,0x02, +0x44,0x0E,0x00,0x00, +0xA0,0x00,0x16,0x28, +0x48,0x0E,0x00,0x00, +0x01,0x00,0x00,0xF8, +0x4C,0x0E,0x00,0x00, +0x10,0x29,0x00,0x00, +0x50,0x0E,0x00,0x00, +0x00,0x7C,0x00,0x01, +0x54,0x0E,0x00,0x00, +0x00,0x48,0x00,0x01, +0x58,0x0E,0x00,0x00, +0x1F,0xDC,0x00,0x10, +0x5C,0x0E,0x00,0x00, +0x1F,0x8C,0x00,0x10, +0x60,0x0E,0x00,0x00, +0xA0,0x00,0x14,0x02, +0x64,0x0E,0x00,0x00, +0xA0,0x00,0x16,0x28, +0x6C,0x0E,0x00,0x00, +0x10,0x29,0x00,0x00, +0x70,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0x74,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x78,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x7C,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x80,0x0E,0x00,0x00, +0xFB,0x36,0x15,0x36, +0x84,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0x88,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0x8C,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0xD0,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0xD4,0x0E,0x00,0x00, +0xFB,0x92,0xED,0x31, +0xD8,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0xDC,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0xE0,0x0E,0x00,0x00, +0xFB,0x92,0x0D,0x00, +0xE4,0x0E,0x00,0x00, +0x48,0x54,0x5E,0x01, +0xE8,0x0E,0x00,0x00, +0x48,0x54,0x55,0x21, +0x00,0x09,0x00,0x00, +0x00,0x00,0x00,0x00, +0x04,0x09,0x00,0x00, +0x23,0x00,0x00,0x00, +0x08,0x09,0x00,0x00, +0x00,0x00,0x00,0x00, +0x0C,0x09,0x00,0x00, +0x13,0x13,0x12,0x01, +0x00,0x0A,0x00,0x00, +0xC8,0x47,0xD0,0x00, +0x04,0x0A,0x00,0x00, +0x08,0x00,0xFF,0x80, +0x08,0x0A,0x00,0x00, +0x00,0x83,0xCD,0x88, +0x0C,0x0A,0x00,0x00, +0x0F,0x12,0x62,0x2E, +0x10,0x0A,0x00,0x00, +0x78,0xBB,0x00,0x95, +0x14,0x0A,0x00,0x00, +0x28,0x40,0x14,0x11, +0x18,0x0A,0x00,0x00, +0x17,0x11,0x88,0x00, +0x1C,0x0A,0x00,0x00, +0x00,0x0F,0x14,0x89, +0x20,0x0A,0x00,0x00, +0x00,0x00,0x1B,0x1A, +0x24,0x0A,0x00,0x00, +0x17,0x13,0x0E,0x09, +0x28,0x0A,0x00,0x00, +0x04,0x02,0x00,0x00, +0x2C,0x0A,0x00,0x00, +0x00,0x00,0xD3,0x10, +0x00,0x0C,0x00,0x00, +0x40,0x1D,0x07,0x40, +0x04,0x0C,0x00,0x00, +0x33,0x56,0xA0,0x00, +0x08,0x0C,0x00,0x00, +0xE4,0x00,0x00,0x00, +0x0C,0x0C,0x00,0x00, +0x6C,0x6C,0x6C,0x6C, +0x10,0x0C,0x00,0x00, +0x00,0x00,0x80,0x08, +0x14,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x18,0x0C,0x00,0x00, +0x00,0x00,0x00,0x08, +0x1C,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x20,0x0C,0x00,0x00, +0x00,0x00,0x00,0x08, +0x24,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x28,0x0C,0x00,0x00, +0x00,0x00,0x00,0x08, +0x2C,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x30,0x0C,0x00,0x00, +0x44,0xAC,0xE9,0x6D, +0x34,0x0C,0x00,0x00, +0xCF,0x52,0x96,0x46, +0x38,0x0C,0x00,0x00, +0x94,0x59,0x79,0x49, +0x3C,0x0C,0x00,0x00, +0x64,0x97,0x97,0x0A, +0x40,0x0C,0x00,0x00, +0x3F,0x40,0x7C,0x1F, +0x44,0x0C,0x00,0x00, +0xB7,0x00,0x01,0x00, +0x48,0x0C,0x00,0x00, +0x00,0x00,0x02,0xEC, +0x4C,0x0C,0x00,0x00, +0x7F,0x03,0x7F,0x00, +0x50,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x54,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x58,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x5C,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x60,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x64,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x68,0x0C,0x00,0x00, +0x20,0x34,0x54,0x69, +0x6C,0x0C,0x00,0x00, +0x94,0x00,0x3C,0x43, +0x70,0x0C,0x00,0x00, +0x0D,0x00,0x7F,0x2C, +0x74,0x0C,0x00,0x00, +0x5B,0x17,0x86,0x01, +0x78,0x0C,0x00,0x00, +0x1F,0x00,0x00,0x00, +0x7C,0x0C,0x00,0x00, +0x12,0x16,0xB9,0x00, +0x80,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x84,0x0C,0x00,0x00, +0x00,0x00,0xF6,0x20, +0x88,0x0C,0x00,0x00, +0x80,0x00,0x00,0x20, +0x8C,0x0C,0x00,0x00, +0x00,0x00,0x20,0x20, +0x90,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x94,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0x98,0x0C,0x00,0x00, +0x00,0x01,0x00,0x40, +0x9C,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA0,0x0C,0x00,0x00, +0x92,0x24,0x49,0x00, +0xA4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA8,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xAC,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xB0,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xB4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xB8,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xBC,0x0C,0x00,0x00, +0x00,0x00,0x00,0x28, +0xC0,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xC4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xC8,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xCC,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xD0,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xD4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xD8,0x0C,0x00,0x00, +0x27,0x24,0xB2,0x64, +0xDC,0x0C,0x00,0x00, +0x32,0x69,0x76,0x00, +0xE0,0x0C,0x00,0x00, +0x22,0x22,0x22,0x00, +0xE4,0x0C,0x00,0x00, +0x00,0x00,0x00,0x00, +0xE8,0x0C,0x00,0x00, +0x02,0x43,0x64,0x37, +0xEC,0x0C,0x00,0x00, +0x0C,0xD4,0x97,0x2F, +0x00,0x0D,0x00,0x00, +0x50,0x07,0x00,0x00, +0x04,0x0D,0x00,0x00, +0x03,0x04,0x00,0x00, +0x08,0x0D,0x00,0x00, +0x7F,0x90,0x00,0x00, +0x0C,0x0D,0x00,0x00, +0x01,0x00,0x00,0x00, +0x10,0x0D,0x00,0x00, +0x33,0x33,0x63,0xA0, +0x14,0x0D,0x00,0x00, +0x63,0x3C,0x33,0x33, +0x18,0x0D,0x00,0x00, +0x6B,0x5B,0x8F,0x6A, +0x1C,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x20,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x24,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x28,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x2C,0x0D,0x00,0x00, +0x75,0x99,0x97,0xCC, +0x30,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x34,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x38,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x3C,0x0D,0x00,0x00, +0x93,0x72,0x02,0x00, +0x40,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x44,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x48,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x50,0x0D,0x00,0x00, +0x0A,0x14,0x37,0x64, +0x54,0x0D,0x00,0x00, +0x02,0xBD,0x4D,0x02, +0x58,0x0D,0x00,0x00, +0x00,0x00,0x00,0x00, +0x5C,0x0D,0x00,0x00, +0x64,0x20,0x03,0x30, +0x60,0x0D,0x00,0x00, +0x68,0xDE,0x53,0x46, +0x64,0x0D,0x00,0x00, +0x3C,0x8A,0x51,0x00, +0x68,0x0D,0x00,0x00, +0x01,0x21,0x00,0x00, +0x14,0x0F,0x00,0x00, +0x03,0x00,0x00,0x00, +0x4C,0x0F,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x0F,0x00,0x00, +0x00,0x03,0x00,0x00, +0x40,0x01,0x00,0x00, +0x04,0x00,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x10,0x00,0x00,0x00, +0x0C,0x02,0x01,0x80, +0x10,0x00,0x00,0x00, +0x3C,0x02,0x01,0x80, +0x10,0x00,0x00,0x00, +0x2C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x34,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x3C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x44,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x1C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x24,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x7C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x84,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0xE0,0x03,0x01,0x80, +0x10,0x00,0x00,0x00, +0xD8,0x03,0x01,0x80, +0x10,0x00,0x00,0x00, +0x8C,0x08,0x01,0x80, +0x10,0x00,0x00,0x00, +0x94,0x08,0x01,0x80, +0xDC,0x01,0x00,0x00, +0x54,0x25,0x00,0x80, +0x04,0x00,0x00,0x00, +0x10,0x06,0x01,0x80, +0xDC,0x01,0x00,0x00, +0x54,0x25,0x00,0x80, +0x04,0x00,0x00,0x00, +0xD0,0x27,0x00,0x80, +0x30,0x00,0x00,0x00, +0xD8,0x27,0x00,0x80, +0x04,0x00,0x00,0x00, +0x64,0x2A,0x00,0x80, +0x13,0x00,0x00,0x00, +0xE8,0x06,0x01,0x80, +0x17,0x00,0x00,0x00, +0x3C,0x07,0x01,0x80, +0x06,0x00,0x00,0x00, +0xC4,0x07,0x01,0x80, +0x06,0x00,0x00,0x00, +0xCC,0x07,0x01,0x80, +0x08,0x00,0x00,0x00, +0xD4,0x07,0x01,0x80, +0x0C,0x00,0x00,0x00, +0xDC,0x07,0x01,0x80, +0x04,0x00,0x00,0x00, +0xE4,0x07,0x01,0x80, +0x0E,0x00,0x00,0x00, +0xEC,0x07,0x01,0x80, +0x01,0x00,0x00,0x00, +0xF4,0x07,0x01,0x80, +0x38,0x00,0x00,0x00, +0xFC,0x07,0x01,0x80, +0x04,0x00,0x00,0x00, +0x04,0x08,0x01,0x80, +0x02,0x00,0x00,0x00, +0x0C,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x14,0x08,0x01,0x80, +0x01,0x00,0x00,0x00, +0x54,0x08,0x01,0x80, +0x01,0x00,0x00,0x00, +0x5C,0x08,0x01,0x80, +0x0C,0x00,0x00,0x00, +0xE8,0x03,0x01,0x80, +0x0E,0x00,0x00,0x00, +0xF0,0x03,0x01,0x80, +0x0C,0x00,0x00,0x00, +0x08,0x06,0x01,0x80, +0x34,0x00,0x00,0x00, +0x64,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x6C,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x9C,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0xA4,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0xAC,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x74,0x08,0x01,0x80, +0x08,0x00,0x00,0x00, +0x40,0x03,0x01,0x80, +0x04,0x00,0x00,0x00, +0xB4,0x08,0x01,0x80, +0x04,0x00,0x00,0x00, +0x2C,0x09,0x01,0x80, +0x04,0x00,0x00,0x00, +0x38,0x09,0x01,0x80, +0x04,0x00,0x00,0x00, +0xEC,0x09,0x01,0x80, +0x04,0x00,0x00,0x00, +0x50,0x0C,0x01,0x80, +0x04,0x00,0x00,0x00, +0x60,0x0C,0x01,0x80, +0x04,0x00,0x00,0x00, +0xC8,0x0D,0x01,0x80, +0x04,0x00,0x00,0x00, +0xF4,0x0E,0x01,0x80, +0x04,0x00,0x00,0x00, +0x30,0x10,0x01,0x80, +0x04,0x00,0x00,0x00, +0x48,0x12,0x01,0x80, +0x51,0x73,0x65,0x6C, +0x20,0x45,0x72,0x72, +0x6F,0x72,0x2C,0x20, +0x25,0x78,0x00,0x00, +0x72,0x65,0x70,0x65, +0x61,0x74,0x65,0x64, +0x20,0x65,0x6C,0x65, +0x6D,0x65,0x6E,0x74, +0x20,0x49,0x44,0x3A, +0x20,0x25,0x78,0x2C, +0x20,0x63,0x6D,0x64, +0x20,0x73,0x65,0x71, +0x3D,0x25,0x78,0x2C, +0x20,0x68,0x32,0x64, +0x73,0x65,0x71,0x3D, +0x25,0x78,0x0A,0x00, +0x69,0x6E,0x76,0x61, +0x6C,0x69,0x64,0x20, +0x63,0x6D,0x64,0x20, +0x69,0x64,0x3A,0x20, +0x25,0x78,0x0A,0x00, +0x48,0x32,0x43,0x3A, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x67,0x65,0x74,0x20, +0x6A,0x6F,0x69,0x6E, +0x20,0x63,0x6D,0x64, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x67,0x65,0x74,0x20, +0x73,0x75,0x72,0x76, +0x65,0x79,0x20,0x63, +0x6D,0x64,0x0A,0x00, +0x53,0x53,0x49,0x44, +0x3A,0x20,0x25,0x73, +0x0A,0x00,0x00,0x00, +0x73,0x65,0x74,0x41, +0x75,0x74,0x68,0x3A, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x72,0x63,0x76,0x20, +0x73,0x65,0x74,0x5F, +0x73,0x74,0x61,0x6B, +0x65,0x79,0x0A,0x00, +0x53,0x65,0x74,0x53, +0x69,0x6E,0x67,0x6C, +0x65,0x43,0x61,0x72, +0x72,0x69,0x65,0x72, +0x54,0x78,0x5F,0x68, +0x64,0x6C,0x0A,0x00, +0x53,0x65,0x74,0x53, +0x69,0x6E,0x67,0x6C, +0x65,0x54,0x6F,0x6E, +0x65,0x54,0x78,0x5F, +0x68,0x64,0x6C,0x0A, +0x00,0x00,0x00,0x00, +0x53,0x65,0x74,0x43, +0x61,0x72,0x72,0x69, +0x65,0x72,0x53,0x75, +0x70,0x70,0x72,0x65, +0x73,0x73,0x69,0x6F, +0x6E,0x54,0x78,0x5F, +0x68,0x64,0x6C,0x0A, +0x00,0x00,0x00,0x00, +0x53,0x65,0x74,0x43, +0x6F,0x6E,0x74,0x69, +0x6E,0x75,0x6F,0x75, +0x73,0x54,0x78,0x5F, +0x68,0x64,0x6C,0x0A, +0x00,0x00,0x00,0x00, +0x53,0x65,0x74,0x43, +0x43,0x4B,0x43,0x6F, +0x6E,0x74,0x69,0x6E, +0x75,0x6F,0x75,0x73, +0x54,0x78,0x0A,0x00, +0x53,0x65,0x74,0x4F, +0x46,0x44,0x4D,0x43, +0x6F,0x6E,0x74,0x69, +0x6E,0x75,0x6F,0x75, +0x73,0x54,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x13,0x00,0x00,0x00, +0xF8,0x9E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xC8,0x5E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xF8,0x0E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xC8,0xCE,0x01,0x00, +0x13,0x00,0x00,0x00, +0xD4,0x8E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xA4,0x4E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xD0,0x0E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xA0,0xCE,0x00,0x00, +0x13,0x00,0x00,0x00, +0xD0,0x86,0x00,0x00, +0x13,0x00,0x00,0x00, +0xA0,0x46,0x00,0x00, +0x13,0x00,0x00,0x00, +0x70,0x06,0x00,0x00, +0x13,0x00,0x00,0x00, +0xA4,0x9E,0x02,0x00, +0x13,0x00,0x00,0x00, +0x74,0x5E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xA4,0x0E,0x02,0x00, +0x13,0x00,0x00,0x00, +0xD0,0xCE,0x01,0x00, +0x13,0x00,0x00,0x00, +0x40,0x9F,0x01,0x00, +0x13,0x00,0x00,0x00, +0x70,0x4E,0x01,0x00, +0x13,0x00,0x00,0x00, +0xA0,0x06,0x01,0x00, +0x13,0x00,0x00,0x00, +0x70,0xC6,0x00,0x00, +0x13,0x00,0x00,0x00, +0xA0,0x82,0x00,0x00, +0x13,0x00,0x00,0x00, +0x70,0x42,0x00,0x00, +0x13,0x00,0x00,0x00, +0x40,0x02,0x00,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0xAA,0x88,0x88,0x44, +0x44,0x22,0x22,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x03,0x00, +0x01,0x00,0x00,0x00, +0x41,0x10,0x00,0x00, +0x02,0x00,0x00,0x00, +0x00,0x10,0x01,0x00, +0x05,0x00,0x00,0x00, +0xC0,0x0F,0x08,0x00, +0x07,0x00,0x00,0x00, +0x03,0xC8,0x0F,0x00, +0x13,0x00,0x00,0x00, +0xB0,0x7C,0x01,0x00, +0x13,0x00,0x00,0x00, +0xC0,0x1C,0x01,0x00, +0x13,0x00,0x00,0x00, +0x60,0xDC,0x00,0x00, +0x13,0x00,0x00,0x00, +0x60,0x8C,0x00,0x00, +0x13,0x00,0x00,0x00, +0x50,0x44,0x00,0x00, +0x13,0x00,0x00,0x00, +0x20,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x03,0x00, +0x01,0x00,0x00,0x00, +0x50,0x02,0x03,0x00, +0x02,0x00,0x00,0x00, +0x00,0x00,0x01,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x08,0x00, +0x11,0x00,0x00,0x00, +0xFC,0x31,0x02,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x0C,0x00, +0x11,0x00,0x00,0x00, +0xF8,0xF9,0x03,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x02,0x00, +0x11,0x00,0x00,0x00, +0x01,0x01,0x02,0x00, +0x14,0x00,0x00,0x00, +0x3E,0x09,0x01,0x00, +0x14,0x00,0x00,0x00, +0x3E,0x09,0x09,0x00, +0x15,0x00,0x00,0x00, +0xF4,0x98,0x01,0x00, +0x17,0x00,0x00,0x00, +0x00,0x65,0x0F,0x00, +0x1A,0x00,0x00,0x00, +0x56,0x30,0x01,0x00, +0x1B,0x00,0x00,0x00, +0x00,0x00,0x06,0x00, +0x1C,0x00,0x00,0x00, +0x00,0x03,0x00,0x00, +0x1E,0x00,0x00,0x00, +0x59,0x10,0x03,0x00, +0x21,0x00,0x00,0x00, +0x00,0x40,0x05,0x00, +0x22,0x00,0x00,0x00, +0x3C,0x08,0x00,0x00, +0x23,0x00,0x00,0x00, +0x58,0x15,0x00,0x00, +0x24,0x00,0x00,0x00, +0x60,0x00,0x00,0x00, +0x25,0x00,0x00,0x00, +0x83,0x25,0x02,0x00, +0x26,0x00,0x00,0x00, +0x00,0xF2,0x00,0x00, +0x27,0x00,0x00,0x00, +0xF1,0xAC,0x0E,0x00, +0x28,0x00,0x00,0x00, +0x54,0xBD,0x09,0x00, +0x29,0x00,0x00,0x00, +0x82,0x45,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x34,0x13,0x02,0x00, +0x2A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0C,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x02,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x03,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x08,0x08,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x05,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x06,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x07,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x08,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x09,0x07,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x09,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0A,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0B,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0C,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0A,0x06,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0xB3,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0B,0x05,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x33,0x33,0x05,0x00, +0x2C,0x00,0x00,0x00, +0x0D,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x0E,0x00,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x0B,0x05,0x00,0x00, +0x2B,0x00,0x00,0x00, +0x23,0x66,0x06,0x00, +0x2C,0x00,0x00,0x00, +0x1A,0x00,0x00,0x00, +0x2A,0x00,0x00,0x00, +0x00,0x40,0x0E,0x00, +0x30,0x00,0x00,0x00, +0x00,0x00,0x02,0x00, +0x31,0x00,0x00,0x00, +0x31,0x96,0x0B,0x00, +0x32,0x00,0x00,0x00, +0x0D,0x13,0x00,0x00, +0x33,0x00,0x00,0x00, +0x87,0x01,0x00,0x00, +0x13,0x00,0x00,0x00, +0x6C,0x9E,0x01,0x00, +0x13,0x00,0x00,0x00, +0x94,0x5E,0x01,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x01,0x00, +0x18,0x00,0x00,0x00, +0x01,0xF4,0x00,0x00, +0xFE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x1E,0x00,0x00,0x00, +0x5B,0x10,0x03,0x00, +0xFE,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x59,0x01,0x03,0x00, +0x10,0x00,0x00,0x00, +0x0F,0x00,0x04,0x00, +0x11,0x00,0x00,0x00, +0xF9,0x03,0x02,0x00, +0x6C,0x09,0x00,0x00, +0x01,0x02,0x03,0x04, +0x05,0x06,0x07,0x08, +0x09,0x0A,0x0B,0x00, +0x00,0x00,0x00,0x12, +0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12, +0x12,0x12,0x00,0x00, +0x00,0x00,0x0F,0x0F, +0x0F,0x0F,0x0F,0x0F, +0x0F,0x0F,0x0F,0x0F, +0x0F,0x00,0x00,0x00, +0x00,0x17,0x05,0x03, +0x22,0x43,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x00,0x00, +0x22,0x43,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x22,0x43,0x5E,0x00, +0x4F,0xA4,0x3E,0x00, +0x30,0xA6,0x00,0x00, +0x4F,0xA4,0x3E,0x00, +0x2B,0xA4,0x5E,0x00, +0x2B,0xA4,0x00,0x00, +0x2B,0xA4,0x5E,0x00, +0x22,0xA4,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x5E,0x00, +0x4F,0xA4,0x00,0x00, +0x4F,0xA4,0x5E,0x00, +0x00,0xE0,0x4C,0x02, +0x01,0x20,0x00,0x00, +0x00,0xE0,0x4C,0x00, +0x00,0x0C,0x43,0x00, +0x00,0x50,0x43,0x00, +0x00,0x40,0x96,0x00, +0x00,0x05,0xB5,0x00, +0x00,0x0A,0xF7,0x00, +0x00,0x10,0x18,0x00, +0x00,0x13,0x74,0x00, +0x00,0x03,0x7F,0x00, +0x00,0x50,0xF2,0x02, +0x01,0x01,0x00,0x00, +0x00,0x50,0xF2,0x02, +0x00,0x01,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0x00,0x00, +0x4F,0x6E,0x41,0x73, +0x73,0x6F,0x63,0x52, +0x65,0x71,0x00,0x00, +0x4F,0x6E,0x41,0x73, +0x73,0x6F,0x63,0x52, +0x73,0x70,0x00,0x00, +0x4F,0x6E,0x52,0x65, +0x41,0x73,0x73,0x6F, +0x63,0x52,0x65,0x71, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x52,0x65, +0x41,0x73,0x73,0x6F, +0x63,0x52,0x73,0x70, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x50,0x72, +0x6F,0x62,0x65,0x52, +0x65,0x71,0x00,0x00, +0x4F,0x6E,0x50,0x72, +0x6F,0x62,0x65,0x52, +0x73,0x70,0x00,0x00, +0x4F,0x6E,0x42,0x65, +0x61,0x63,0x6F,0x6E, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x41,0x54, +0x49,0x4D,0x00,0x00, +0x4F,0x6E,0x44,0x69, +0x73,0x61,0x73,0x73, +0x6F,0x63,0x00,0x00, +0x4F,0x6E,0x41,0x75, +0x74,0x68,0x00,0x00, +0x4F,0x6E,0x44,0x65, +0x41,0x75,0x74,0x68, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x41,0x63, +0x74,0x69,0x6F,0x6E, +0x00,0x00,0x00,0x00, +0x4F,0x6E,0x45,0x78, +0x63,0x65,0x70,0x74, +0x69,0x6F,0x6E,0x00, +0x00,0x00,0x00,0x00, +0xF8,0xDD,0x01,0x80, +0xE8,0x26,0x01,0x80, +0x10,0x00,0x00,0x00, +0x04,0xDE,0x01,0x80, +0xF0,0x26,0x01,0x80, +0x20,0x00,0x00,0x00, +0x10,0xDE,0x01,0x80, +0xE8,0x26,0x01,0x80, +0x30,0x00,0x00,0x00, +0x20,0xDE,0x01,0x80, +0xF0,0x26,0x01,0x80, +0x40,0x00,0x00,0x00, +0x30,0xDE,0x01,0x80, +0x80,0x2D,0x01,0x80, +0x50,0x00,0x00,0x00, +0x3C,0xDE,0x01,0x80, +0x28,0x4A,0x00,0x80, +0x80,0x00,0x00,0x00, +0x48,0xDE,0x01,0x80, +0x90,0x59,0x00,0x80, +0x90,0x00,0x00,0x00, +0x54,0xDE,0x01,0x80, +0x44,0x2E,0x01,0x80, +0xA0,0x00,0x00,0x00, +0x5C,0xDE,0x01,0x80, +0x4C,0x2E,0x01,0x80, +0xB0,0x00,0x00,0x00, +0x68,0xDE,0x01,0x80, +0x54,0x2F,0x01,0x80, +0xC0,0x00,0x00,0x00, +0x70,0xDE,0x01,0x80, +0x6C,0x2E,0x01,0x80, +0xD0,0x00,0x00,0x00, +0x7C,0xDE,0x01,0x80, +0xF0,0x54,0x00,0x80, +0x0C,0x00,0x00,0x00, +0x88,0xDE,0x01,0x80, +0x8C,0x2E,0x01,0x80, +0x73,0x77,0x69,0x74, +0x63,0x68,0x20,0x74, +0x6F,0x20,0x34,0x30, +0x4D,0x20,0x48,0x7A, +0x20,0x6D,0x6F,0x64, +0x65,0x28,0x25,0x78, +0x2C,0x20,0x25,0x78, +0x29,0x0A,0x00,0x00, +0x73,0x77,0x69,0x74, +0x63,0x68,0x20,0x74, +0x6F,0x20,0x32,0x30, +0x4D,0x20,0x48,0x7A, +0x20,0x6D,0x6F,0x64, +0x65,0x0A,0x00,0x00, +0x41,0x54,0x49,0x4D, +0x3A,0x20,0x25,0x78, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x73,0x75,0x72,0x76, +0x65,0x79,0x20,0x64, +0x6F,0x6E,0x65,0x28, +0x25,0x78,0x2C,0x20, +0x25,0x78,0x29,0x0A, +0x00,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x6A,0x6F,0x69,0x6E, +0x20,0x72,0x65,0x73, +0x28,0x25,0x78,0x29, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x64,0x65,0x6C,0x20, +0x73,0x74,0x61,0x0A, +0x00,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x61,0x64,0x64,0x20, +0x73,0x74,0x61,0x3A, +0x25,0x78,0x2C,0x20, +0x25,0x78,0x0A,0x00, +0x72,0x63,0x76,0x20, +0x64,0x69,0x73,0x63, +0x6F,0x6E,0x6E,0x65, +0x63,0x74,0x0A,0x00, +0x64,0x69,0x73,0x63, +0x6F,0x6E,0x6E,0x65, +0x63,0x74,0x20,0x74, +0x69,0x6D,0x65,0x72, +0x3A,0x20,0x6E,0x6F, +0x20,0x62,0x65,0x61, +0x63,0x6F,0x6E,0x0A, +0x00,0x00,0x00,0x00, +0x64,0x69,0x73,0x63, +0x6F,0x6E,0x6E,0x65, +0x63,0x74,0x20,0x74, +0x69,0x6D,0x65,0x72, +0x0A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x40, +0x25,0x73,0x0A,0x00, +0x57,0x4D,0x4D,0x28, +0x25,0x78,0x29,0x3A, +0x20,0x25,0x78,0x2C, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x61,0x73,0x73,0x6F, +0x63,0x20,0x72,0x65, +0x6A,0x65,0x63,0x74, +0x2C,0x20,0x73,0x74, +0x61,0x74,0x75,0x73, +0x3A,0x20,0x25,0x64, +0x0A,0x00,0x00,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x34,0x3A,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x35,0x3A,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x40, +0x25,0x73,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x63,0x75,0x72,0x20, +0x63,0x68,0x61,0x6E, +0x6E,0x65,0x6C,0x3A, +0x20,0x25,0x78,0x2C, +0x20,0x62,0x63,0x6E, +0x20,0x69,0x6E,0x74, +0x65,0x72,0x76,0x61, +0x6C,0x3A,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x49,0x42,0x53,0x53, +0x20,0x6D,0x6F,0x64, +0x65,0x2C,0x20,0x63, +0x75,0x72,0x20,0x63, +0x68,0x61,0x6E,0x6E, +0x65,0x6C,0x3A,0x20, +0x25,0x78,0x2C,0x20, +0x62,0x63,0x6E,0x20, +0x69,0x6E,0x74,0x65, +0x72,0x76,0x61,0x6C, +0x3A,0x20,0x25,0x78, +0x0A,0x00,0x00,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x34,0x3A,0x20,0x25, +0x78,0x2C,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x69,0x6E,0x76,0x61, +0x6C,0x69,0x64,0x20, +0x63,0x61,0x70,0x3A, +0x25,0x78,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x61,0x73, +0x73,0x6F,0x63,0x72, +0x65,0x71,0x28,0x25, +0x78,0x29,0x0A,0x00, +0x5B,0x57,0x41,0x50, +0x49,0x5D,0x20,0x67, +0x65,0x74,0x20,0x77, +0x61,0x70,0x69,0x20, +0x49,0x45,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x61,0x63, +0x74,0x69,0x6F,0x6E, +0x3A,0x20,0x25,0x78, +0x2C,0x20,0x25,0x78, +0x2C,0x20,0x25,0x78, +0x20,0x0A,0x00,0x00, +0x41,0x44,0x44,0x42, +0x41,0x20,0x52,0x53, +0x50,0x3A,0x20,0x25, +0x78,0x0A,0x00,0x00, +0x44,0x45,0x4C,0x42, +0x41,0x3A,0x20,0x25, +0x78,0x28,0x25,0x78, +0x29,0x0A,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x61,0x75, +0x74,0x68,0x0A,0x00, +0x63,0x6C,0x6E,0x74, +0x20,0x61,0x75,0x74, +0x68,0x20,0x66,0x61, +0x69,0x6C,0x2C,0x20, +0x73,0x74,0x61,0x74, +0x75,0x73,0x3A,0x20, +0x25,0x64,0x0A,0x00, +0x6E,0x6F,0x20,0x63, +0x68,0x61,0x6C,0x6C, +0x65,0x6E,0x67,0x65, +0x20,0x74,0x65,0x78, +0x74,0x3F,0x0A,0x00, +0x63,0x6C,0x6E,0x74, +0x20,0x61,0x75,0x74, +0x68,0x20,0x66,0x61, +0x69,0x6C,0x65,0x64, +0x20,0x64,0x75,0x65, +0x20,0x74,0x6F,0x20, +0x69,0x6C,0x6C,0x65, +0x67,0x61,0x6C,0x20, +0x73,0x65,0x71,0x3D, +0x25,0x78,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x65, +0x61,0x75,0x74,0x68, +0x0A,0x00,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x69, +0x73,0x61,0x73,0x73, +0x6F,0x63,0x0A,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x4E,0x6F,0x20,0x69, +0x72,0x70,0x20,0x25, +0x73,0x0A,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x20,0x6E,0x75, +0x6C,0x6C,0x20,0x64, +0x61,0x74,0x61,0x28, +0x25,0x64,0x29,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x41,0x72,0x74,0x68, +0x65,0x72,0x6F,0x73, +0x20,0x41,0x50,0x0A, +0x00,0x00,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x42,0x72,0x6F,0x61, +0x64,0x63,0x6F,0x6D, +0x20,0x41,0x50,0x0A, +0x00,0x00,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x4D,0x61,0x72,0x76, +0x65,0x6C,0x6C,0x20, +0x41,0x50,0x0A,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x52,0x61,0x6C,0x69, +0x6E,0x6B,0x20,0x41, +0x50,0x0A,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x43,0x69,0x73,0x63, +0x6F,0x20,0x41,0x50, +0x0A,0x00,0x00,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x52,0x65,0x61,0x6C, +0x74,0x65,0x6B,0x20, +0x39,0x36,0x42,0x20, +0x41,0x50,0x0A,0x00, +0x6C,0x69,0x6E,0x6B, +0x20,0x74,0x6F,0x20, +0x75,0x6E,0x6B,0x6E, +0x6F,0x77,0x6E,0x20, +0x41,0x50,0x0A,0x00, +0x6D,0x61,0x63,0x20, +0x69,0x64,0x20,0x23, +0x25,0x78,0x3A,0x20, +0x25,0x78,0x2C,0x20, +0x25,0x78,0x0A,0x00, +0x64,0x72,0x6F,0x70, +0x20,0x64,0x75,0x65, +0x20,0x74,0x6F,0x20, +0x64,0x65,0x63,0x61, +0x63,0x68,0x65,0x0A, +0x00,0x00,0x00,0x00, +0xFF,0x00,0x00,0x00, +0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xFF,0xFF,0x00,0x00, +0x01,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x02,0x03, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07, +0x08,0x09,0x0A,0x0B, +0xFF,0x00,0x00,0x00, +0x04,0x05,0x06,0x07, +0x08,0x09,0x0A,0x0B, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x04,0x05,0x06,0x07, +0x08,0xFF,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x02,0x03, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x01,0x01,0x03, +0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x30,0x31,0x32,0x33, +0x34,0x35,0x36,0x37, +0x38,0x39,0x41,0x42, +0x43,0x44,0x45,0x46, +0x00,0x00,0x00,0x00, +0x25,0x64,0x2E,0x00, +0x25,0x68,0x68,0x58, +0x3A,0x00,0x00,0x00, +0x74,0x61,0x72,0x67, +0x65,0x74,0x20,0x74, +0x68,0x65,0x72,0x6D, +0x61,0x6C,0x3A,0x20, +0x25,0x78,0x2C,0x20, +0x63,0x75,0x72,0x20, +0x74,0x68,0x65,0x72, +0x6D,0x61,0x6C,0x3A, +0x20,0x25,0x78,0x0A, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0xE4,0x01,0x80, +0x08,0xE4,0x01,0x80, +0x31,0x10,0x10,0x00, +0x00,0x30,0x00,0x00, +0x31,0x20,0x10,0x00, +0x00,0x30,0x00,0x00, +0x31,0x28,0x10,0x00, +0x00,0x30,0x00,0x00, +0x31,0x2C,0x10,0x10, +0x00,0x30,0x00,0x00, +0x31,0x2F,0x10,0x10, +0x00,0x30,0x00,0x00, +0x31,0x30,0x18,0x00, +0x00,0x30,0x00,0x00, +0x31,0x30,0x20,0x10, +0x00,0x30,0x00,0x00, +0x22,0x20,0x18,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x14,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x1C,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x20,0x08, +0x00,0x20,0x00,0x00, +0x22,0x21,0x20,0x10, +0x00,0x20,0x00,0x00, +0x22,0x21,0x20,0x18, +0x00,0x20,0x00,0x00, +0x1A,0x19,0x18,0x10, +0x00,0x18,0x00,0x00, +0x12,0x11,0x10,0x08, +0x00,0x10,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x08,0x00,0x00, +0x0A,0x09,0x08,0x02, +0x00,0x08,0x00,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x08,0x00,0x00, +0x0A,0x09,0x08,0x06, +0x00,0x08,0x00,0x00, +0x08,0x07,0x06,0x04, +0x00,0x06,0x00,0x00, +0x06,0x05,0x04,0x02, +0x00,0x04,0x00,0x00, +0x06,0x05,0x04,0x03, +0x00,0x04,0x00,0x00, +0x05,0x04,0x03,0x02, +0x00,0x03,0x00,0x00, +0x09,0x08,0x07,0x06, +0x07,0x06,0x06,0x05, +0x05,0x04,0x04,0x03, +0x06,0x05,0x05,0x04, +0x04,0x03,0x03,0x03, +0x05,0x04,0x04,0x03, +0x03,0x02,0x02,0x02, +0x00,0x09,0x08,0x07, +0x06,0x07,0x06,0x06, +0x05,0x05,0x04,0x04, +0x03,0x05,0x04,0x04, +0x03,0x03,0x02,0x02, +0x02,0x04,0x03,0x03, +0x02,0x02,0x01,0x01, +0x01,0x00,0x00,0x00, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x10,0x10,0x20, +0x08,0x08,0x08,0x08, +0x20,0x20,0x20,0x20, +0x08,0x08,0x08,0x08, +0x08,0x20,0x20,0x20, +0x30,0x08,0x08,0x08, +0x08,0x18,0x18,0x18, +0x18,0x18,0x20,0x30, +0x30,0x10,0x20,0x20, +0x20,0x20,0x20,0x30, +0x30,0x08,0x10,0x20, +0x30,0x30,0x30,0x30, +0x30,0x30,0x00,0x00, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x10,0x10,0x20, +0x08,0x08,0x08,0x08, +0x08,0x20,0x20,0x20, +0x08,0x08,0x08,0x08, +0x08,0x20,0x20,0x20, +0x20,0x08,0x08,0x08, +0x08,0x18,0x18,0x18, +0x18,0x18,0x20,0x30, +0x30,0x10,0x20,0x20, +0x20,0x20,0x20,0x30, +0x30,0x08,0x10,0x20, +0x30,0x30,0x30,0x30, +0x30,0x30,0x00,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x0A,0x09, +0x08,0x00,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x0A,0x09, +0x08,0x00,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x22,0x21,0x20,0x18, +0x00,0x22,0x21,0x20, +0x18,0x00,0x22,0x21, +0x1C,0x08,0x00,0x22, +0x20,0x18,0x08,0x00, +0x0A,0x09,0x08,0x02, +0x00,0x0A,0x09,0x08, +0x02,0x00,0x0A,0x09, +0x08,0x02,0x00,0x0A, +0x09,0x08,0x02,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x22,0x21,0x20, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x22, +0x21,0x1C,0x08,0x00, +0x31,0x30,0x18,0x00, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x1A,0x19, +0x18,0x10,0x00,0x1A, +0x19,0x18,0x10,0x00, +0x1A,0x19,0x18,0x10, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x31, +0x2C,0x10,0x10,0x00, +0x31,0x28,0x10,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x22,0x21, +0x20,0x18,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x08, +0x00,0x22,0x21,0x14, +0x08,0x00,0x22,0x20, +0x18,0x08,0x00,0x31, +0x30,0x20,0x10,0x00, +0x31,0x2C,0x10,0x10, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x18, +0x00,0x31,0x30,0x20, +0x10,0x00,0x31,0x2F, +0x10,0x10,0x00,0x31, +0x2F,0x10,0x10,0x00, +0x31,0x10,0x10,0x00, +0x00,0x31,0x2C,0x10, +0x10,0x00,0x00,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x0A,0x09, +0x08,0x00,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x02,0x00,0x0A, +0x09,0x08,0x00,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x22,0x21,0x20, +0x18,0x00,0x22,0x21, +0x1C,0x08,0x00,0x22, +0x21,0x14,0x08,0x00, +0x0A,0x09,0x08,0x02, +0x00,0x0A,0x09,0x08, +0x02,0x00,0x0A,0x09, +0x08,0x02,0x00,0x0A, +0x09,0x08,0x02,0x00, +0x0A,0x09,0x08,0x00, +0x00,0x22,0x21,0x20, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x22, +0x21,0x14,0x08,0x00, +0x22,0x21,0x14,0x08, +0x00,0x0A,0x09,0x08, +0x04,0x00,0x0A,0x09, +0x08,0x04,0x00,0x0A, +0x09,0x08,0x04,0x00, +0x0A,0x09,0x08,0x04, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x1A,0x19, +0x18,0x10,0x00,0x1A, +0x19,0x18,0x10,0x00, +0x1A,0x19,0x18,0x10, +0x00,0x1A,0x19,0x18, +0x10,0x00,0x22,0x21, +0x20,0x08,0x00,0x31, +0x2C,0x10,0x10,0x00, +0x31,0x28,0x10,0x00, +0x00,0x12,0x11,0x10, +0x08,0x00,0x22,0x21, +0x20,0x18,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x08, +0x00,0x22,0x21,0x14, +0x08,0x00,0x22,0x20, +0x18,0x08,0x00,0x31, +0x30,0x20,0x10,0x00, +0x31,0x2C,0x10,0x10, +0x00,0x0A,0x09,0x08, +0x00,0x00,0x12,0x11, +0x10,0x08,0x00,0x22, +0x21,0x20,0x18,0x00, +0x22,0x21,0x20,0x18, +0x00,0x31,0x30,0x20, +0x10,0x00,0x31,0x2F, +0x10,0x10,0x00,0x31, +0x2F,0x10,0x10,0x00, +0x31,0x10,0x10,0x00, +0x00,0x31,0x2C,0x10, +0x10,0x00,0x00,0x00, +0x01,0x02,0x04,0x08, +0x02,0x04,0x08,0x0C, +0x10,0x18,0x20,0x30, +0x02,0x04,0x08,0x0C, +0x10,0x18,0x20,0x30, +0x06,0x0C,0x10,0x18, +0x24,0x30,0x3C,0x48, +0x48,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x25,0x27,0x2C, +0x19,0x1B,0x1E,0x20, +0x23,0x29,0x2A,0x2B, +0x00,0x00,0x00,0x00, +0x25,0x29,0x2B,0x2E, +0x2E,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x08,0x00,0x00,0x00, +0x10,0x00,0x00,0x00, +0x18,0x00,0x00,0x00, +0x24,0x00,0x00,0x00, +0x30,0x00,0x00,0x00, +0x48,0x00,0x00,0x00, +0x60,0x00,0x00,0x00, +0x90,0x00,0x00,0x00, +0xC0,0x00,0x00,0x00, +0xD8,0x00,0x00,0x00, +0x50,0x00,0x00,0x00, +0x78,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00, +0xC8,0x00,0x00,0x00, +0x40,0x01,0x00,0x00, +0x90,0x01,0x00,0x00, +0xE0,0x01,0x00,0x00, +0x30,0x02,0x00,0x00, +0x2C,0x01,0x00,0x00, +0x40,0x01,0x00,0x00, +0xE0,0x01,0x00,0x00, +0xD0,0x02,0x00,0x00, +0x80,0x0C,0x00,0x00, +0x80,0x0C,0x00,0x00, +0x80,0x0C,0x00,0x00, +0xA0,0x0F,0x00,0x00, +0xA0,0x0F,0x00,0x00, +0x02,0x00,0x00,0x00, +0x02,0x00,0x00,0x00, +0x04,0x00,0x00,0x00, +0x08,0x00,0x00,0x00, +0x0C,0x00,0x00,0x00, +0x12,0x00,0x00,0x00, +0x18,0x00,0x00,0x00, +0x24,0x00,0x00,0x00, +0x30,0x00,0x00,0x00, +0x48,0x00,0x00,0x00, +0x60,0x00,0x00,0x00, +0x6C,0x00,0x00,0x00, +0x28,0x00,0x00,0x00, +0x3C,0x00,0x00,0x00, +0x50,0x00,0x00,0x00, +0x64,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00, +0xC8,0x00,0x00,0x00, +0xF0,0x00,0x00,0x00, +0x18,0x01,0x00,0x00, +0x64,0x00,0x00,0x00, +0xA0,0x00,0x00,0x00, +0xF0,0x00,0x00,0x00, +0x68,0x01,0x00,0x00, +0x40,0x06,0x00,0x00, +0x40,0x06,0x00,0x00, +0x40,0x06,0x00,0x00, +0xD0,0x07,0x00,0x00, +0xD0,0x07,0x00,0x00, +0x72,0x65,0x73,0x65, +0x74,0x28,0x25,0x78, +0x29,0x0A,0x00,0x00, +0xC8,0x82,0x01,0x80, +0xC8,0xD0,0x00,0x80, +0xC8,0xD0,0x00,0x80, +0xC8,0xD0,0x00,0x80, +0xC8,0xD0,0x00,0x80, +0x14,0xCF,0x00,0x80, +0xD0,0x82,0x01,0x80, +0xC8,0x82,0x01,0x80, +0xC8,0x82,0x01,0x80, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xF0,0x85,0x01,0x80, +0xF0,0x85,0x01,0x80, +0xF0,0x85,0x01,0x80, +0xF0,0x85,0x01,0x80, +0xA8,0x82,0x01,0x80, +0x00,0x85,0x01,0x80, +0xB0,0x82,0x01,0x80, +0xB8,0x82,0x01,0x80, +0xC0,0x82,0x01,0x80, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0x04,0x04,0x08, +0x02,0x02,0x01,0x01, +0x50,0x53,0x00,0x00, +0x80,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA0,0xA4,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x68,0xA4,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x30,0xA4,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0xF8,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0xC0,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x88,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x70,0xA3,0x01,0x80, +0x48,0xA3,0x01,0x80, +0xB8,0x06,0x00,0x80, +0xAC,0x06,0x00,0x80, +0xA0,0x06,0x00,0x80, +0x94,0x06,0x00,0x80, +0x88,0x06,0x00,0x80, +0x7C,0x06,0x00,0x80, +0x70,0x06,0x00,0x80, +0x64,0x06,0x00,0x80, +0x58,0x06,0x00,0x80, +0x4C,0x06,0x00,0x80, +0x04,0x06,0x00,0x80, +0x30,0x1F,0x02,0x80, +0xB0,0x03,0x25,0xB0, +0x30,0x1F,0x02,0x80, +0x30,0x1F,0x02,0x80, +0x30,0x1F,0x02,0x80, +0x30,0x1F,0x02,0x80, +0x6A,0x6F,0x69,0x6E, +0x62,0x73,0x73,0x5F, +0x68,0x64,0x6C,0x00, +0x00,0x0E,0x04,0x0E, +0x10,0x0E,0x14,0x0E, +0x18,0x0E,0x1C,0x0E, +0x02,0x04,0x04,0x07, +0x07,0x0D,0x0D,0x0D, +0x02,0x07,0x07,0x0D, +0x0D,0x0F,0x0F,0x0F, +0x0F,0x00,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x73, +0x75,0x72,0x76,0x65, +0x79,0x5F,0x64,0x6F, +0x6E,0x65,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x6A, +0x6F,0x69,0x6E,0x5F, +0x72,0x65,0x73,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x64, +0x65,0x6C,0x5F,0x73, +0x74,0x61,0x5F,0x65, +0x76,0x65,0x6E,0x74, +0x00,0x00,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x61, +0x64,0x64,0x5F,0x73, +0x74,0x61,0x5F,0x65, +0x76,0x65,0x6E,0x74, +0x00,0x00,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x70,0x72, +0x6F,0x62,0x65,0x72, +0x65,0x71,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x70,0x72, +0x6F,0x62,0x65,0x72, +0x73,0x70,0x00,0x00, +0x72,0x65,0x70,0x6F, +0x72,0x74,0x5F,0x42, +0x53,0x53,0x49,0x44, +0x5F,0x69,0x6E,0x66, +0x6F,0x00,0x00,0x00, +0x00,0x50,0xF2,0x01, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x61,0x73, +0x73,0x6F,0x63,0x72, +0x65,0x71,0x00,0x00, +0x00,0x50,0xF2,0x04, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x61,0x63, +0x74,0x69,0x6F,0x6E, +0x00,0x00,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x61,0x75, +0x74,0x68,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x65, +0x61,0x75,0x74,0x68, +0x00,0x00,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x64,0x69, +0x73,0x61,0x73,0x73, +0x6F,0x63,0x00,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x66,0x72, +0x61,0x6D,0x65,0x00, +0x69,0x73,0x73,0x75, +0x65,0x5F,0x66,0x72, +0x61,0x6D,0x65,0x5F, +0x6C,0x65,0x6E,0x00, +0x30,0x1F,0x02,0x80, +0xB0,0x03,0x25,0xB0, +0xF8,0x00,0x25,0xB0, +0x18,0x03,0x25,0xB0, +0x44,0x44,0x33,0x33, +0x06,0x00,0x2A,0xB0, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x24,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0xA8,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x9C,0x3E,0x01,0x80, +0x90,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x84,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x78,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x6C,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x60,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x54,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x48,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x3C,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x28,0x3E,0x01,0x80, +0x30,0x3E,0x01,0x80, +0x68,0x3F,0x01,0x80, +0x5C,0x3F,0x01,0x80, +0x50,0x3F,0x01,0x80, +0x44,0x3F,0x01,0x80, +0x38,0x3F,0x01,0x80, +0x2C,0x3F,0x01,0x80, +0x20,0x3F,0x01,0x80, +0x14,0x3F,0x01,0x80, +0x08,0x3F,0x01,0x80, +0xFC,0x3E,0x01,0x80, +0xF0,0x3E,0x01,0x80, +0xE4,0x3E,0x01,0x80, +0x00,0x50,0xF2,0x01, +0x00,0x50,0xF2,0x02, +0x00,0x0F,0xAC,0x02, +0xBC,0xE3,0x01,0x80, +0x67,0x66,0x66,0x66, +0x7C,0x88,0x00,0x80, +0x64,0x88,0x00,0x80, +0x4C,0x88,0x00,0x80, +0x34,0x88,0x00,0x80, +0x1C,0x88,0x00,0x80, +0x04,0x88,0x00,0x80, +0xE0,0x87,0x00,0x80, +0x00,0x02,0x00,0x00, +0x08,0x09,0x00,0x00, +0x18,0x96,0x00,0x80, +0x24,0x96,0x00,0x80, +0x30,0x96,0x00,0x80, +0x3C,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x18,0x96,0x00,0x80, +0x48,0x96,0x00,0x80, +0x54,0x96,0x00,0x80, +0x60,0x96,0x00,0x80, +0x6C,0x96,0x00,0x80, +0x30,0x1F,0x02,0x80, +0x84,0x0E,0x25,0xB0, +0x88,0x0E,0x25,0xB0, +0x8C,0x0E,0x25,0xB0, +0xD0,0x0E,0x25,0xB0, +0xD8,0x0E,0x25,0xB0, +0x20,0x08,0x25,0xB0, +0x74,0x0E,0x25,0xB0, +0x80,0x0E,0x25,0xB0, +0x84,0x0E,0x25,0xB0, +0x88,0x0E,0x25,0xB0, +0x8C,0x0E,0x25,0xB0, +0xD0,0x0E,0x25,0xB0, +0xD8,0x0E,0x25,0xB0, +0x14,0x0C,0x25,0xB0, +0x88,0x0C,0x25,0xB0, +0x1C,0x0C,0x25,0xB0, +0xFE,0x01,0x80,0x7F, +0xE2,0x01,0x80,0x78, +0xC7,0x01,0xC0,0x71, +0xAE,0x01,0x80,0x6B, +0x95,0x01,0x40,0x65, +0x7F,0x01,0xC0,0x5F, +0x69,0x01,0x40,0x5A, +0x55,0x01,0x40,0x55, +0x42,0x01,0x80,0x50, +0x30,0x01,0x00,0x4C, +0x1F,0x01,0xC0,0x47, +0x0F,0x01,0xC0,0x43, +0x00,0x01,0x00,0x40, +0xF2,0x00,0x80,0x3C, +0xE4,0x00,0x00,0x39, +0xD7,0x00,0xC0,0x35, +0xCB,0x00,0xC0,0x32, +0xC0,0x00,0x00,0x30, +0xB5,0x00,0x40,0x2D, +0xAB,0x00,0xC0,0x2A, +0xA2,0x00,0x80,0x28, +0x98,0x00,0x00,0x26, +0x90,0x00,0x00,0x24, +0x88,0x00,0x00,0x22, +0x80,0x00,0x00,0x20, +0x79,0x00,0x40,0x1E, +0x72,0x00,0x80,0x1C, +0x6C,0x00,0x00,0x1B, +0x66,0x00,0x80,0x19, +0x60,0x00,0x00,0x18, +0x5B,0x00,0xC0,0x16, +0x56,0x00,0x80,0x15, +0x51,0x00,0x40,0x14, +0x4C,0x00,0x00,0x13, +0x48,0x00,0x00,0x12, +0x44,0x00,0x00,0x11, +0x40,0x00,0x00,0x10, +0x36,0x35,0x2E,0x25, +0x1C,0x12,0x09,0x04, +0x33,0x32,0x2B,0x23, +0x1A,0x11,0x08,0x04, +0x30,0x2F,0x29,0x21, +0x19,0x10,0x08,0x03, +0x2D,0x2D,0x27,0x1F, +0x18,0x0F,0x08,0x03, +0x2B,0x2A,0x25,0x1E, +0x16,0x0E,0x07,0x03, +0x28,0x28,0x22,0x1C, +0x15,0x0D,0x07,0x03, +0x26,0x25,0x21,0x1B, +0x14,0x0D,0x06,0x03, +0x24,0x23,0x1F,0x19, +0x13,0x0C,0x06,0x03, +0x22,0x21,0x1D,0x18, +0x11,0x0B,0x06,0x02, +0x20,0x20,0x1B,0x16, +0x11,0x08,0x05,0x02, +0x1F,0x1E,0x1A,0x15, +0x10,0x0A,0x05,0x02, +0x1D,0x1C,0x18,0x14, +0x0F,0x0A,0x05,0x02, +0x1B,0x1A,0x17,0x13, +0x0E,0x09,0x04,0x02, +0x1A,0x19,0x16,0x12, +0x0D,0x09,0x04,0x02, +0x18,0x17,0x15,0x11, +0x0C,0x08,0x04,0x02, +0x17,0x16,0x13,0x10, +0x0C,0x08,0x04,0x02, +0x16,0x15,0x12,0x0F, +0x0B,0x07,0x04,0x01, +0x14,0x14,0x11,0x0E, +0x0B,0x07,0x03,0x02, +0x13,0x13,0x10,0x0D, +0x0A,0x06,0x03,0x01, +0x12,0x12,0x0F,0x0C, +0x09,0x06,0x03,0x01, +0x11,0x11,0x0F,0x0C, +0x09,0x06,0x03,0x01, +0x10,0x10,0x0E,0x0B, +0x08,0x05,0x03,0x01, +0x0F,0x0F,0x0D,0x0B, +0x08,0x05,0x03,0x01, +0x0E,0x0E,0x0C,0x0A, +0x08,0x05,0x02,0x01, +0x0D,0x0D,0x0C,0x0A, +0x07,0x05,0x02,0x01, +0x0D,0x0C,0x0B,0x09, +0x07,0x04,0x02,0x01, +0x0C,0x0C,0x0A,0x09, +0x06,0x04,0x02,0x01, +0x0B,0x0B,0x0A,0x08, +0x06,0x04,0x02,0x01, +0x0B,0x0A,0x09,0x08, +0x06,0x04,0x02,0x01, +0x0A,0x0A,0x09,0x07, +0x05,0x03,0x02,0x01, +0x0A,0x09,0x08,0x07, +0x05,0x03,0x02,0x01, +0x09,0x09,0x08,0x06, +0x05,0x03,0x01,0x01, +0x09,0x08,0x07,0x06, +0x04,0x03,0x01,0x01, +0x36,0x35,0x2E,0x1B, +0x00,0x00,0x00,0x00, +0x33,0x32,0x2B,0x19, +0x00,0x00,0x00,0x00, +0x30,0x2F,0x29,0x18, +0x00,0x00,0x00,0x00, +0x2D,0x2D,0x17,0x17, +0x00,0x00,0x00,0x00, +0x2B,0x2A,0x25,0x15, +0x00,0x00,0x00,0x00, +0x28,0x28,0x24,0x14, +0x00,0x00,0x00,0x00, +0x26,0x25,0x21,0x13, +0x00,0x00,0x00,0x00, +0x24,0x23,0x1F,0x12, +0x00,0x00,0x00,0x00, +0x22,0x21,0x1D,0x11, +0x00,0x00,0x00,0x00, +0x20,0x20,0x1B,0x10, +0x00,0x00,0x00,0x00, +0x1F,0x1E,0x1A,0x0F, +0x00,0x00,0x00,0x00, +0x1D,0x1C,0x18,0x0E, +0x00,0x00,0x00,0x00, +0x1B,0x1A,0x17,0x0E, +0x00,0x00,0x00,0x00, +0x1A,0x19,0x16,0x0D, +0x00,0x00,0x00,0x00, +0x18,0x17,0x15,0x0C, +0x00,0x00,0x00,0x00, +0x17,0x16,0x13,0x0B, +0x00,0x00,0x00,0x00, +0x16,0x15,0x12,0x0B, +0x00,0x00,0x00,0x00, +0x14,0x14,0x11,0x0A, +0x00,0x00,0x00,0x00, +0x13,0x13,0x10,0x0A, +0x00,0x00,0x00,0x00, +0x12,0x12,0x0F,0x09, +0x00,0x00,0x00,0x00, +0x11,0x11,0x0F,0x09, +0x00,0x00,0x00,0x00, +0x10,0x10,0x0E,0x08, +0x00,0x00,0x00,0x00, +0x0F,0x0F,0x0D,0x08, +0x00,0x00,0x00,0x00, +0x0E,0x0E,0x0C,0x07, +0x00,0x00,0x00,0x00, +0x0D,0x0D,0x0C,0x07, +0x00,0x00,0x00,0x00, +0x0D,0x0C,0x0B,0x06, +0x00,0x00,0x00,0x00, +0x0C,0x0C,0x0A,0x06, +0x00,0x00,0x00,0x00, +0x0B,0x0B,0x0A,0x06, +0x00,0x00,0x00,0x00, +0x0B,0x0A,0x09,0x05, +0x00,0x00,0x00,0x00, +0x0A,0x0A,0x09,0x05, +0x00,0x00,0x00,0x00, +0x0A,0x09,0x08,0x05, +0x00,0x00,0x00,0x00, +0x09,0x09,0x08,0x05, +0x00,0x00,0x00,0x00, +0x09,0x08,0x07,0x04, +0x00,0x00,0x00,0x00, +0x06,0x00,0x2A,0xB0, +0x05,0x00,0x2A,0xB0, +0x54,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0x80,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0xC4,0x83,0x01,0x80, +0x2C,0x83,0x01,0x80, +0x00,0x01,0x02,0x02, +0x03,0x03,0x03,0x03, +0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04, +0x05,0x05,0x05,0x05, +0x05,0x05,0x05,0x05, +0x05,0x05,0x05,0x05, +0x05,0x05,0x05,0x05, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x28,0x28,0x28, +0x28,0x28,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08, +0xA0,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04, +0x04,0x04,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x41,0x41,0x41, +0x41,0x41,0x41,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x10, +0x10,0x10,0x10,0x10, +0x10,0x42,0x42,0x42, +0x42,0x42,0x42,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x10, +0x10,0x10,0x10,0x08, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0xA0,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x10, +0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x10, +0x02,0x02,0x02,0x02, +0x02,0x02,0x02,0x00, +0x2D,0x5C,0x7C,0x2F, +0x00,0x00,0x00,0x00, +0xFD,0xFA,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x45,0xC4,0xF0, +0x00,0x45,0xC4,0xF0, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x00,0x45,0xB5,0x60, +0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0x02, +0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00, +0x08,0xFB,0x90,0xB8, +0xFF,0xFF,0xFF,0xFF, +}; diff --git a/drivers/net/wireless/rtl8192c/include/h2clbk.h b/drivers/net/wireless/rtl8192c/include/h2clbk.h new file mode 100755 index 000000000000..359c9e7a8f24 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/h2clbk.h @@ -0,0 +1,35 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#define _H2CLBK_H_ + + +#include +#include + + +void _lbk_cmd(PADAPTER Adapter); + +void _lbk_rsp(PADAPTER Adapter); + +void _lbk_evt(IN PADAPTER Adapter); + +void h2c_event_callback(unsigned char *dev, unsigned char *pbuf); diff --git a/drivers/net/wireless/rtl8192c/include/hal_init.h b/drivers/net/wireless/rtl8192c/include/hal_init.h new file mode 100755 index 000000000000..c05e6bfb2424 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/hal_init.h @@ -0,0 +1,272 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __HAL_INIT_H__ +#define __HAL_INIT_H__ + +#include +#include +#include + +#ifdef CONFIG_PCI_HCI +#include +#endif + + +enum RTL871X_HCI_TYPE { + + RTW_SDIO, + RTW_USB, + RTW_PCIE +}; + +enum _CHIP_TYPE { + + NULL_CHIP_TYPE, + RTL8712_8188S_8191S_8192S, + RTL8188C_8192C, + RTL8192D, + MAX_CHIP_TYPE +}; + + +typedef enum _HW_VARIABLES{ + HW_VAR_MEDIA_STATUS, + HW_VAR_MEDIA_STATUS1, + HW_VAR_SET_OPMODE, + HW_VAR_BSSID, + HW_VAR_INIT_RTS_RATE, + HW_VAR_BASIC_RATE, + HW_VAR_TXPAUSE, + HW_VAR_BCN_FUNC, + HW_VAR_CORRECT_TSF, + HW_VAR_CHECK_BSSID, + HW_VAR_MLME_DISCONNECT, + HW_VAR_MLME_SITESURVEY, + HW_VAR_MLME_JOIN, + HW_VAR_BEACON_INTERVAL, + HW_VAR_SLOT_TIME, + HW_VAR_SIFS, + HW_VAR_ACK_PREAMBLE, + HW_VAR_SEC_CFG, + HW_VAR_TX_BCN_DONE, + HW_VAR_RF_TYPE, + HW_VAR_DM_FLAG, + HW_VAR_DM_FUNC_OP, + HW_VAR_DM_FUNC_SET, + HW_VAR_DM_FUNC_CLR, + HW_VAR_CAM_EMPTY_ENTRY, + HW_VAR_CAM_INVALID_ALL, + HW_VAR_CAM_WRITE, + HW_VAR_AC_PARAM_VO, + HW_VAR_AC_PARAM_VI, + HW_VAR_AC_PARAM_BE, + HW_VAR_AC_PARAM_BK, + HW_VAR_AMPDU_MIN_SPACE, + HW_VAR_AMPDU_FACTOR, + HW_VAR_RXDMA_AGG_PG_TH, + HW_VAR_SET_RPWM, + HW_VAR_H2C_FW_PWRMODE, + HW_VAR_H2C_FW_JOINBSSRPT, + HW_VAR_FWLPS_RF_ON, + HW_VAR_H2C_FW_P2P_PS_OFFLOAD, + HW_VAR_INITIAL_GAIN, + HW_VAR_TRIGGER_GPIO_0, + HW_VAR_BT_SET_COEXIST, + HW_VAR_BT_ISSUE_DELBA, + HW_VAR_CURRENT_ANTENNA, + HW_VAR_ANTENNA_DIVERSITY_LINK, + HW_VAR_ANTENNA_DIVERSITY_SELECT, + HW_VAR_SWITCH_EPHY_WoWLAN, + HW_VAR_EFUSE_BYTES, + HW_VAR_FIFO_CLEARN_UP, +}HW_VARIABLES; + +typedef enum _HAL_DEF_VARIABLE{ + HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, + HAL_DEF_IS_SUPPORT_ANT_DIV, + HAL_DEF_CURRENT_ANTENNA, + HAL_DEF_DRVINFO_SZ, + HAL_DEF_MAX_RECVBUF_SZ, + HAL_DEF_RX_PACKET_OFFSET, + HAL_DEF_DBG_DUMP_RXPKT,//for dbg + HAL_DEF_DBG_DM_FUNC,//for dbg +}HAL_DEF_VARIABLE; + +typedef enum _HAL_INTF_PS_FUNC{ + HAL_USB_SELECT_SUSPEND, + HAL_MAX_ID, +}HAL_INTF_PS_FUNC; + +struct hal_ops { + u32 (*hal_init)(PADAPTER Adapter); + u32 (*hal_deinit)(PADAPTER Adapter); + + void (*free_hal_data)(PADAPTER Adapter); + + u32 (*inirp_init)(PADAPTER Adapter); + u32 (*inirp_deinit)(PADAPTER Adapter); + + s32 (*init_xmit_priv)(PADAPTER Adapter); + void (*free_xmit_priv)(PADAPTER Adapter); + + s32 (*init_recv_priv)(PADAPTER Adapter); + void (*free_recv_priv)(PADAPTER Adapter); + + void (*InitSwLeds)(PADAPTER Adapter); + void (*DeInitSwLeds)(PADAPTER Adapter); + + void (*dm_init)(PADAPTER Adapter); + void (*dm_deinit)(PADAPTER Adapter); + void (*read_chip_version)(PADAPTER Adapter); + + void (*init_default_value)(PADAPTER Adapter); + + void (*intf_chip_configure)(PADAPTER Adapter); + + void (*read_adapter_info)(PADAPTER Adapter); + + void (*enable_interrupt)(PADAPTER Adapter); + void (*disable_interrupt)(PADAPTER Adapter); + s32 (*interrupt_handler)(PADAPTER Adapter); + + void (*set_bwmode_handler)(PADAPTER Adapter, HT_CHANNEL_WIDTH Bandwidth, u8 Offset); + void (*set_channel_handler)(PADAPTER Adapter, u8 channel); + + void (*hal_dm_watchdog)(PADAPTER Adapter); + + void (*SetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val); + void (*GetHwRegHandler)(PADAPTER Adapter, u8 variable,u8* val); + + u8 (*GetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); + u8 (*SetHalDefVarHandler)(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue); + + void (*UpdateRAMaskHandler)(PADAPTER Adapter, u32 mac_id); + void (*SetBeaconRelatedRegistersHandler)(PADAPTER Adapter); + + void (*Add_RateATid)(PADAPTER Adapter, u32 bitmap, u8 arg); + +#ifdef CONFIG_ANTENNA_DIVERSITY + u8 (*SwAntDivBeforeLinkHandler)(PADAPTER Adapter); + void (*SwAntDivCompareHandler)(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); +#endif + u8 (*interface_ps_func)(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8* val); + + s32 (*hal_xmit)(PADAPTER Adapter, struct xmit_frame *pxmitframe); + void (*mgnt_xmit)(PADAPTER Adapter, struct xmit_frame *pmgntframe); + + u32 (*read_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask); + void (*write_bbreg)(PADAPTER Adapter, u32 RegAddr, u32 BitMask, u32 Data); + u32 (*read_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask); + void (*write_rfreg)(PADAPTER Adapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data); + +#ifdef CONFIG_HOSTAPD_MLME + s32 (*hostap_mgnt_xmit_entry)(PADAPTER Adapter, _pkt *pkt); +#endif + void (*EfusePowerSwitch)(PADAPTER pAdapter, u8 bWrite, u8 PwrState); + void (*ReadEFuse)(PADAPTER Adapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, BOOLEAN bPseudoTest); + void (*EFUSEGetEfuseDefinition)(PADAPTER pAdapter, u8 efuseType, u8 type, PVOID *pOut, BOOLEAN bPseudoTest); + u16 (*EfuseGetCurrentSize)(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); + int (*Efuse_PgPacketRead)(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest); + int (*Efuse_PgPacketWrite)(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest); + u8 (*Efuse_WordEnableDataWrite)(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest); + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + void (*sreset_init_value)(_adapter *padapter); + void (*sreset_reset_value)(_adapter *padapter); + void (*silentreset)(_adapter *padapter); + void (*sreset_xmit_status_check)(_adapter *padapter); + void (*sreset_linked_status_check) (_adapter *padapter); + u8 (*sreset_get_wifi_status)(_adapter *padapter); +#endif +}; + +typedef enum _RT_EEPROM_TYPE{ + EEPROM_93C46, + EEPROM_93C56, + EEPROM_BOOT_EFUSE, +}RT_EEPROM_TYPE,*PRT_EEPROM_TYPE; + +#define USB_HIGH_SPEED_BULK_SIZE 512 +#define USB_FULL_SPEED_BULK_SIZE 64 + +#define RF_CHANGE_BY_INIT 0 +#define RF_CHANGE_BY_IPS BIT28 +#define RF_CHANGE_BY_PS BIT29 +#define RF_CHANGE_BY_HW BIT30 +#define RF_CHANGE_BY_SW BIT31 + +typedef enum _HARDWARE_TYPE{ + HARDWARE_TYPE_RTL8180, + HARDWARE_TYPE_RTL8185, + HARDWARE_TYPE_RTL8187, + HARDWARE_TYPE_RTL8188, + HARDWARE_TYPE_RTL8190P, + HARDWARE_TYPE_RTL8192E, + HARDWARE_TYPE_RTL819xU, + HARDWARE_TYPE_RTL8192SE, + HARDWARE_TYPE_RTL8192SU, + HARDWARE_TYPE_RTL8192CE, + HARDWARE_TYPE_RTL8192CU, + HARDWARE_TYPE_RTL8192DE, + HARDWARE_TYPE_RTL8192DU, + HARDWARE_TYPE_RTL8723E, + HARDWARE_TYPE_RTL8723U, +}HARDWARE_TYPE; + +#define IS_HARDWARE_TYPE_8192CE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CE) +#define IS_HARDWARE_TYPE_8192CU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192CU) + +#define IS_HARDWARE_TYPE_8192DE(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DE) +#define IS_HARDWARE_TYPE_8192DU(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8192DU) + +#define IS_HARDWARE_TYPE_8723E(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723E) +#define IS_HARDWARE_TYPE_8723U(_Adapter) (((PADAPTER)_Adapter)->HardwareType==HARDWARE_TYPE_RTL8723U) + +#define IS_HARDWARE_TYPE_8192C(_Adapter) \ +(IS_HARDWARE_TYPE_8192CE(_Adapter) || IS_HARDWARE_TYPE_8192CU(_Adapter)) + +#define IS_HARDWARE_TYPE_8192D(_Adapter) \ +(IS_HARDWARE_TYPE_8192DE(_Adapter) || IS_HARDWARE_TYPE_8192DU(_Adapter)) + +#define IS_HARDWARE_TYPE_8723(_Adapter) \ +(IS_HARDWARE_TYPE_8723E(_Adapter) || IS_HARDWARE_TYPE_8723U(_Adapter)) + + +typedef struct eeprom_priv EEPROM_EFUSE_PRIV, *PEEPROM_EFUSE_PRIV; +#define GET_EEPROM_EFUSE_PRIV(priv) (&priv->eeprompriv) + + +void rtw_dm_init(_adapter *padapter); +void rtw_sw_led_init(_adapter *padapter); +void rtw_sw_led_deinit(_adapter *padapter); + +uint rtw_hal_init(_adapter *padapter); +uint rtw_hal_deinit(_adapter *padapter); +void rtw_hal_stop(_adapter *padapter); + +void intf_chip_configure(_adapter *padapter); +void intf_read_chip_info(_adapter *padapter); +void intf_read_chip_version(_adapter *padapter); +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +void rtw_sreset_init(_adapter *padapter); +#endif + +#endif //__HAL_INIT_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/ieee80211.h b/drivers/net/wireless/rtl8192c/include/ieee80211.h new file mode 100755 index 000000000000..86e9726e60f1 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ieee80211.h @@ -0,0 +1,1437 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __IEEE80211_H +#define __IEEE80211_H + + +#ifndef CONFIG_RTL8711FW + + #include + #include + #include + #include "wifi.h" + + #if defined PLATFORM_OS_XP + #include + #endif + #if defined PLATFORM_LINUX + #include + #endif +#else + + #include + +#endif + +#define MGMT_QUEUE_NUM 5 + +#define ETH_ALEN 6 + +#ifdef CONFIG_AP_MODE + +#define RTL_IOCTL_HOSTAPD (SIOCIWFIRSTPRIV + 28) + +/* RTL871X_IOCTL_HOSTAPD ioctl() cmd: */ +enum { + RTL871X_HOSTAPD_FLUSH = 1, + RTL871X_HOSTAPD_ADD_STA = 2, + RTL871X_HOSTAPD_REMOVE_STA = 3, + RTL871X_HOSTAPD_GET_INFO_STA = 4, + /* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */ + RTL871X_HOSTAPD_GET_WPAIE_STA = 5, + RTL871X_SET_ENCRYPTION = 6, + RTL871X_GET_ENCRYPTION = 7, + RTL871X_HOSTAPD_SET_FLAGS_STA = 8, + RTL871X_HOSTAPD_GET_RID = 9, + RTL871X_HOSTAPD_SET_RID = 10, + RTL871X_HOSTAPD_SET_ASSOC_AP_ADDR = 11, + RTL871X_HOSTAPD_SET_GENERIC_ELEMENT = 12, + RTL871X_HOSTAPD_MLME = 13, + RTL871X_HOSTAPD_SCAN_REQ = 14, + RTL871X_HOSTAPD_STA_CLEAR_STATS = 15, + RTL871X_HOSTAPD_SET_BEACON=16, + RTL871X_HOSTAPD_SET_WPS_BEACON = 17, + RTL871X_HOSTAPD_SET_WPS_PROBE_RESP = 18, + RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP = 19, +}; + +/* STA flags */ +#define WLAN_STA_AUTH BIT(0) +#define WLAN_STA_ASSOC BIT(1) +#define WLAN_STA_PS BIT(2) +#define WLAN_STA_TIM BIT(3) +#define WLAN_STA_PERM BIT(4) +#define WLAN_STA_AUTHORIZED BIT(5) +#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */ +#define WLAN_STA_SHORT_PREAMBLE BIT(7) +#define WLAN_STA_PREAUTH BIT(8) +#define WLAN_STA_WME BIT(9) +#define WLAN_STA_MFP BIT(10) +#define WLAN_STA_HT BIT(11) +#define WLAN_STA_WPS BIT(12) +#define WLAN_STA_MAYBE_WPS BIT(13) +#define WLAN_STA_NONERP BIT(31) + +#endif + +#define IEEE_CMD_SET_WPA_PARAM 1 +#define IEEE_CMD_SET_WPA_IE 2 +#define IEEE_CMD_SET_ENCRYPTION 3 +#define IEEE_CMD_MLME 4 + +#define IEEE_PARAM_WPA_ENABLED 1 +#define IEEE_PARAM_TKIP_COUNTERMEASURES 2 +#define IEEE_PARAM_DROP_UNENCRYPTED 3 +#define IEEE_PARAM_PRIVACY_INVOKED 4 +#define IEEE_PARAM_AUTH_ALGS 5 +#define IEEE_PARAM_IEEE_802_1X 6 +#define IEEE_PARAM_WPAX_SELECT 7 + +#define AUTH_ALG_OPEN_SYSTEM 0x1 +#define AUTH_ALG_SHARED_KEY 0x2 +#define AUTH_ALG_LEAP 0x00000004 + +#define IEEE_MLME_STA_DEAUTH 1 +#define IEEE_MLME_STA_DISASSOC 2 + +#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2 +#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3 +#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4 +#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5 +#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6 +#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7 + + +#define IEEE_CRYPT_ALG_NAME_LEN 16 + +#define WPA_CIPHER_NONE BIT(0) +#define WPA_CIPHER_WEP40 BIT(1) +#define WPA_CIPHER_WEP104 BIT(2) +#define WPA_CIPHER_TKIP BIT(3) +#define WPA_CIPHER_CCMP BIT(4) + + + +#define WPA_SELECTOR_LEN 4 +static u8 WPA_OUI_TYPE[] = { 0x00, 0x50, 0xf2, 1 }; +static u16 WPA_VERSION = 1; +static u8 WPA_AUTH_KEY_MGMT_NONE[] = { 0x00, 0x50, 0xf2, 0 }; +static u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x50, 0xf2, 1 }; +static u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x50, 0xf2, 2 }; +static u8 WPA_CIPHER_SUITE_NONE[] = { 0x00, 0x50, 0xf2, 0 }; +static u8 WPA_CIPHER_SUITE_WEP40[] = { 0x00, 0x50, 0xf2, 1 }; +static u8 WPA_CIPHER_SUITE_TKIP[] = { 0x00, 0x50, 0xf2, 2 }; +//static u8 WPA_CIPHER_SUITE_WRAP[] = { 0x00, 0x50, 0xf2, 3 }; +static u8 WPA_CIPHER_SUITE_CCMP[] = { 0x00, 0x50, 0xf2, 4 }; +static u8 WPA_CIPHER_SUITE_WEP104[] = { 0x00, 0x50, 0xf2, 5 }; + + +#define RSN_HEADER_LEN 4 +#define RSN_SELECTOR_LEN 4 +static u16 RSN_VERSION = 1; +static u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x0f, 0xac, 1 }; +static u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x0f, 0xac, 2 }; +static u8 RSN_CIPHER_SUITE_NONE[] = { 0x00, 0x0f, 0xac, 0 }; +static u8 RSN_CIPHER_SUITE_WEP40[] = { 0x00, 0x0f, 0xac, 1 }; +static u8 RSN_CIPHER_SUITE_TKIP[] = { 0x00, 0x0f, 0xac, 2 }; +//static u8 RSN_CIPHER_SUITE_WRAP[] = { 0x00, 0x0f, 0xac, 3 }; +static u8 RSN_CIPHER_SUITE_CCMP[] = { 0x00, 0x0f, 0xac, 4 }; +static u8 RSN_CIPHER_SUITE_WEP104[] = { 0x00, 0x0f, 0xac, 5 }; + + +enum NETWORK_TYPE +{ + WIRELESS_INVALID = 0, + //Sub-Element + WIRELESS_11B = BIT(0), // tx: cck only , rx: cck only, hw: cck + WIRELESS_11G = BIT(1), // tx: ofdm only, rx: ofdm & cck, hw: cck & ofdm + WIRELESS_11A = BIT(2), // tx: ofdm only, rx: ofdm only, hw: ofdm only + WIRELESS_11_24N = BIT(3), // tx: MCS only, rx: MCS & cck, hw: MCS & cck + WIRELESS_11_5N = BIT(4), // tx: MCS only, rx: MCS & ofdm, hw: ofdm only + + //Combination + WIRELESS_11BG = (WIRELESS_11B|WIRELESS_11G), // tx: cck & ofdm, rx: cck & ofdm & MCS, hw: cck & ofdm + WIRELESS_11G_24N = (WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & MCS, rx: ofdm & cck & MCS, hw: cck & ofdm + WIRELESS_11A_5N = (WIRELESS_11A|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only + WIRELESS_11BG_24N = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck + WIRELESS_11ABGN = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), +}; + +#define SUPPORTED_24G_NETTYPE_MSK (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N) +#define SUPPORTED_5G_NETTYPE_MSK (WIRELESS_11A | WIRELESS_11_5N) + +#define IsSupported24G(NetType) ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? _TRUE : _FALSE) +#define IsSupported5G(NetType) ((NetType) & SUPPORTED_5G_NETTYPE_MSK ? _TRUE : _FALSE) + +#define IsEnableHWCCK(NetType) IsSupported24G(NetType) +#define IsEnableHWOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11_24N|SUPPORTED_5G_NETTYPE_MSK) ? _TRUE : _FALSE) + +#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType) +#define IsSupportedRxOFDM(NetType) IsEnableHWOFDM(NetType) +#define IsSupportedRxMCS(NetType) IsEnableHWOFDM(NetType) + +#define IsSupportedTxCCK(NetType) ((NetType) & (WIRELESS_11B) ? _TRUE : _FALSE) +#define IsSupportedTxOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11A) ? _TRUE : _FALSE) +#define IsSupportedTxMCS(NetType) ((NetType) & (WIRELESS_11_24N|WIRELESS_11_5N) ? _TRUE : _FALSE) + + +typedef struct ieee_param { + u32 cmd; + u8 sta_addr[ETH_ALEN]; + union { + struct { + u8 name; + u32 value; + } wpa_param; + struct { + u32 len; + u8 reserved[32]; + u8 data[0]; + } wpa_ie; + struct{ + int command; + int reason_code; + } mlme; + struct { + u8 alg[IEEE_CRYPT_ALG_NAME_LEN]; + u8 set_tx; + u32 err; + u8 idx; + u8 seq[8]; /* sequence counter (set: RX, get: TX) */ + u16 key_len; + u8 key[0]; + } crypt; +#ifdef CONFIG_AP_MODE + struct { + u16 aid; + u16 capability; + int flags; + u8 tx_supp_rates[16]; + struct ieee80211_ht_cap ht_cap; + } add_sta; + struct { + u8 reserved[2];//for set max_num_sta + u8 buf[0]; + } bcn_ie; +#endif + + } u; +}ieee_param; + + +#if WIRELESS_EXT < 17 +#define IW_QUAL_QUAL_INVALID 0x10 +#define IW_QUAL_LEVEL_INVALID 0x20 +#define IW_QUAL_NOISE_INVALID 0x40 +#define IW_QUAL_QUAL_UPDATED 0x1 +#define IW_QUAL_LEVEL_UPDATED 0x2 +#define IW_QUAL_NOISE_UPDATED 0x4 +#endif + +#define IEEE80211_DATA_LEN 2304 +/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section + 6.2.1.1.2. + + The figure in section 7.1.2 suggests a body size of up to 2312 + bytes is allowed, which is a bit confusing, I suspect this + represents the 2304 bytes of real data, plus a possible 8 bytes of + WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ + + +#define IEEE80211_HLEN 30 +#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) + + +/* this is stolen from ipw2200 driver */ +#define IEEE_IBSS_MAC_HASH_SIZE 31 + +struct ieee_ibss_seq { + u8 mac[ETH_ALEN]; + u16 seq_num; + u16 frag_num; + unsigned long packet_time; + _list list; +}; + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_hdr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; +} __attribute__ ((packed)); + + +struct ieee80211_hdr_qos { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; + u16 qc; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addr_qos { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u16 qc; +} __attribute__ ((packed)); + +struct eapol { + u8 snap[6]; + u16 ethertype; + u8 version; + u8 type; + u16 length; +} __attribute__ ((packed)); + +#endif + + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_hdr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; +}; + +struct ieee80211_hdr_3addr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; +}; + + +struct ieee80211_hdr_qos { + struct ieee80211_hdr wlan_hdr; + u16 qc; +}; + +struct ieee80211_hdr_3addr_qos { + struct ieee80211_hdr_3addr wlan_hdr; + u16 qc; +}; + +struct eapol { + u8 snap[6]; + u16 ethertype; + u8 version; + u8 type; + u16 length; +}; +#pragma pack() + +#endif + + + +enum eap_type { + EAP_PACKET = 0, + EAPOL_START, + EAPOL_LOGOFF, + EAPOL_KEY, + EAPOL_ENCAP_ASF_ALERT +}; + +#define IEEE80211_3ADDR_LEN 24 +#define IEEE80211_4ADDR_LEN 30 +#define IEEE80211_FCS_LEN 4 + +#define MIN_FRAG_THRESHOLD 256U +#define MAX_FRAG_THRESHOLD 2346U + +/* Frame control field constants */ +#define IEEE80211_FCTL_VERS 0x0002 +#define IEEE80211_FCTL_FTYPE 0x000c +#define IEEE80211_FCTL_STYPE 0x00f0 +#define IEEE80211_FCTL_TODS 0x0100 +#define IEEE80211_FCTL_FROMDS 0x0200 +#define IEEE80211_FCTL_MOREFRAGS 0x0400 +#define IEEE80211_FCTL_RETRY 0x0800 +#define IEEE80211_FCTL_PM 0x1000 +#define IEEE80211_FCTL_MOREDATA 0x2000 +#define IEEE80211_FCTL_WEP 0x4000 +#define IEEE80211_FCTL_ORDER 0x8000 + +#define IEEE80211_FTYPE_MGMT 0x0000 +#define IEEE80211_FTYPE_CTL 0x0004 +#define IEEE80211_FTYPE_DATA 0x0008 + +/* management */ +#define IEEE80211_STYPE_ASSOC_REQ 0x0000 +#define IEEE80211_STYPE_ASSOC_RESP 0x0010 +#define IEEE80211_STYPE_REASSOC_REQ 0x0020 +#define IEEE80211_STYPE_REASSOC_RESP 0x0030 +#define IEEE80211_STYPE_PROBE_REQ 0x0040 +#define IEEE80211_STYPE_PROBE_RESP 0x0050 +#define IEEE80211_STYPE_BEACON 0x0080 +#define IEEE80211_STYPE_ATIM 0x0090 +#define IEEE80211_STYPE_DISASSOC 0x00A0 +#define IEEE80211_STYPE_AUTH 0x00B0 +#define IEEE80211_STYPE_DEAUTH 0x00C0 + +/* control */ +#define IEEE80211_STYPE_PSPOLL 0x00A0 +#define IEEE80211_STYPE_RTS 0x00B0 +#define IEEE80211_STYPE_CTS 0x00C0 +#define IEEE80211_STYPE_ACK 0x00D0 +#define IEEE80211_STYPE_CFEND 0x00E0 +#define IEEE80211_STYPE_CFENDACK 0x00F0 + +/* data */ +#define IEEE80211_STYPE_DATA 0x0000 +#define IEEE80211_STYPE_DATA_CFACK 0x0010 +#define IEEE80211_STYPE_DATA_CFPOLL 0x0020 +#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030 +#define IEEE80211_STYPE_NULLFUNC 0x0040 +#define IEEE80211_STYPE_CFACK 0x0050 +#define IEEE80211_STYPE_CFPOLL 0x0060 +#define IEEE80211_STYPE_CFACKPOLL 0x0070 +#define IEEE80211_QOS_DATAGRP 0x0080 +#define IEEE80211_QoS_DATAGRP IEEE80211_QOS_DATAGRP + +#define IEEE80211_SCTL_FRAG 0x000F +#define IEEE80211_SCTL_SEQ 0xFFF0 + +/* QoS,QOS */ +#define NORMAL_ACK 0 +#define NO_ACK 1 +#define NON_EXPLICIT_ACK 2 +#define BLOCK_ACK 3 + +#ifndef ETH_P_PAE +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +#endif /* ETH_P_PAE */ + +#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ + +#define ETH_P_ECONET 0x0018 + +#ifndef ETH_P_80211_RAW +#define ETH_P_80211_RAW (ETH_P_ECONET + 1) +#endif + +/* IEEE 802.11 defines */ + +#define P80211_OUI_LEN 3 + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_snap_hdr { + + u8 dsap; /* always 0xAA */ + u8 ssap; /* always 0xAA */ + u8 ctrl; /* always 0x03 */ + u8 oui[P80211_OUI_LEN]; /* organizational universal id */ + +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_snap_hdr { + + u8 dsap; /* always 0xAA */ + u8 ssap; /* always 0xAA */ + u8 ctrl; /* always 0x03 */ + u8 oui[P80211_OUI_LEN]; /* organizational universal id */ + +}; +#pragma pack() + +#endif + + +#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) + +#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) +#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE) + +#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f) + +#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG) +#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE80211_SCTL_SEQ) + +/* Authentication algorithms */ +#define WLAN_AUTH_OPEN 0 +#define WLAN_AUTH_SHARED_KEY 1 + +#define WLAN_AUTH_CHALLENGE_LEN 128 + +#define WLAN_CAPABILITY_BSS (1<<0) +#define WLAN_CAPABILITY_IBSS (1<<1) +#define WLAN_CAPABILITY_CF_POLLABLE (1<<2) +#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) +#define WLAN_CAPABILITY_PRIVACY (1<<4) +#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) +#define WLAN_CAPABILITY_PBCC (1<<6) +#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7) +#define WLAN_CAPABILITY_SHORT_SLOT (1<<10) + +/* Status codes */ +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_CAPS_UNSUPPORTED 10 +#define WLAN_STATUS_REASSOC_NO_ASSOC 11 +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 +#define WLAN_STATUS_CHALLENGE_FAIL 15 +#define WLAN_STATUS_AUTH_TIMEOUT 16 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 +#define WLAN_STATUS_ASSOC_DENIED_RATES 18 +/* 802.11b */ +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 + +/* Reason codes */ +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 + + +/* Information Element IDs */ +#define WLAN_EID_SSID 0 +#define WLAN_EID_SUPP_RATES 1 +#define WLAN_EID_FH_PARAMS 2 +#define WLAN_EID_DS_PARAMS 3 +#define WLAN_EID_CF_PARAMS 4 +#define WLAN_EID_TIM 5 +#define WLAN_EID_IBSS_PARAMS 6 +#define WLAN_EID_CHALLENGE 16 +/* EIDs defined by IEEE 802.11h - START */ +#define WLAN_EID_PWR_CONSTRAINT 32 +#define WLAN_EID_PWR_CAPABILITY 33 +#define WLAN_EID_TPC_REQUEST 34 +#define WLAN_EID_TPC_REPORT 35 +#define WLAN_EID_SUPPORTED_CHANNELS 36 +#define WLAN_EID_CHANNEL_SWITCH 37 +#define WLAN_EID_MEASURE_REQUEST 38 +#define WLAN_EID_MEASURE_REPORT 39 +#define WLAN_EID_QUITE 40 +#define WLAN_EID_IBSS_DFS 41 +/* EIDs defined by IEEE 802.11h - END */ +#define WLAN_EID_ERP_INFO 42 +#define WLAN_EID_HT_CAP 45 +#define WLAN_EID_RSN 48 +#define WLAN_EID_EXT_SUPP_RATES 50 +#define WLAN_EID_MOBILITY_DOMAIN 54 +#define WLAN_EID_FAST_BSS_TRANSITION 55 +#define WLAN_EID_TIMEOUT_INTERVAL 56 +#define WLAN_EID_RIC_DATA 57 +#define WLAN_EID_HT_OPERATION 61 +#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62 +#define WLAN_EID_20_40_BSS_COEXISTENCE 72 +#define WLAN_EID_20_40_BSS_INTOLERANT 73 +#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74 +#define WLAN_EID_MMIE 76 +#define WLAN_EID_VENDOR_SPECIFIC 221 +#define WLAN_EID_GENERIC (WLAN_EID_VENDOR_SPECIFIC) + +#define IEEE80211_MGMT_HDR_LEN 24 +#define IEEE80211_DATA_HDR3_LEN 24 +#define IEEE80211_DATA_HDR4_LEN 30 + + +#define IEEE80211_STATMASK_SIGNAL (1<<0) +#define IEEE80211_STATMASK_RSSI (1<<1) +#define IEEE80211_STATMASK_NOISE (1<<2) +#define IEEE80211_STATMASK_RATE (1<<3) +#define IEEE80211_STATMASK_WEMASK 0x7 + + +#define IEEE80211_CCK_MODULATION (1<<0) +#define IEEE80211_OFDM_MODULATION (1<<1) + +#define IEEE80211_24GHZ_BAND (1<<0) +#define IEEE80211_52GHZ_BAND (1<<1) + +#define IEEE80211_CCK_RATE_LEN 4 +#define IEEE80211_NUM_OFDM_RATESLEN 8 + + +#define IEEE80211_CCK_RATE_1MB 0x02 +#define IEEE80211_CCK_RATE_2MB 0x04 +#define IEEE80211_CCK_RATE_5MB 0x0B +#define IEEE80211_CCK_RATE_11MB 0x16 +#define IEEE80211_OFDM_RATE_LEN 8 +#define IEEE80211_OFDM_RATE_6MB 0x0C +#define IEEE80211_OFDM_RATE_9MB 0x12 +#define IEEE80211_OFDM_RATE_12MB 0x18 +#define IEEE80211_OFDM_RATE_18MB 0x24 +#define IEEE80211_OFDM_RATE_24MB 0x30 +#define IEEE80211_OFDM_RATE_36MB 0x48 +#define IEEE80211_OFDM_RATE_48MB 0x60 +#define IEEE80211_OFDM_RATE_54MB 0x6C +#define IEEE80211_BASIC_RATE_MASK 0x80 + +#define IEEE80211_CCK_RATE_1MB_MASK (1<<0) +#define IEEE80211_CCK_RATE_2MB_MASK (1<<1) +#define IEEE80211_CCK_RATE_5MB_MASK (1<<2) +#define IEEE80211_CCK_RATE_11MB_MASK (1<<3) +#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) +#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) +#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) +#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) +#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) +#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) +#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) +#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) + +#define IEEE80211_CCK_RATES_MASK 0x0000000F +#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ + IEEE80211_CCK_RATE_2MB_MASK) +#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ + IEEE80211_CCK_RATE_5MB_MASK | \ + IEEE80211_CCK_RATE_11MB_MASK) + +#define IEEE80211_OFDM_RATES_MASK 0x00000FF0 +#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ + IEEE80211_OFDM_RATE_12MB_MASK | \ + IEEE80211_OFDM_RATE_24MB_MASK) +#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ + IEEE80211_OFDM_RATE_9MB_MASK | \ + IEEE80211_OFDM_RATE_18MB_MASK | \ + IEEE80211_OFDM_RATE_36MB_MASK | \ + IEEE80211_OFDM_RATE_48MB_MASK | \ + IEEE80211_OFDM_RATE_54MB_MASK) +#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ + IEEE80211_CCK_DEFAULT_RATES_MASK) + +#define IEEE80211_NUM_OFDM_RATES 8 +#define IEEE80211_NUM_CCK_RATES 4 +#define IEEE80211_OFDM_SHIFT_MASK_A 4 + + + + +/* NOTE: This data is for statistical purposes; not all hardware provides this + * information for frames received. Not setting these will not cause + * any adverse affects. */ +struct ieee80211_rx_stats { + //u32 mac_time[2]; + s8 rssi; + u8 signal; + u8 noise; + u8 received_channel; + u16 rate; /* in 100 kbps */ + //u8 control; + u8 mask; + u8 freq; + u16 len; +}; + +/* IEEE 802.11 requires that STA supports concurrent reception of at least + * three fragmented frames. This define can be increased to support more + * concurrent frames, but it should be noted that each entry can consume about + * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ +#define IEEE80211_FRAG_CACHE_LEN 4 + +struct ieee80211_frag_entry { + u32 first_frag_time; + uint seq; + uint last_frag; + uint qos; //jackson + uint tid; //jackson + struct sk_buff *skb; + u8 src_addr[ETH_ALEN]; + u8 dst_addr[ETH_ALEN]; +}; + +struct ieee80211_stats { + uint tx_unicast_frames; + uint tx_multicast_frames; + uint tx_fragments; + uint tx_unicast_octets; + uint tx_multicast_octets; + uint tx_deferred_transmissions; + uint tx_single_retry_frames; + uint tx_multiple_retry_frames; + uint tx_retry_limit_exceeded; + uint tx_discards; + uint rx_unicast_frames; + uint rx_multicast_frames; + uint rx_fragments; + uint rx_unicast_octets; + uint rx_multicast_octets; + uint rx_fcs_errors; + uint rx_discards_no_buffer; + uint tx_discards_wrong_sa; + uint rx_discards_undecryptable; + uint rx_message_in_msg_fragments; + uint rx_message_in_bad_msg_fragments; +}; + +struct ieee80211_softmac_stats{ + uint rx_ass_ok; + uint rx_ass_err; + uint rx_probe_rq; + uint tx_probe_rs; + uint tx_beacons; + uint rx_auth_rq; + uint rx_auth_rs_ok; + uint rx_auth_rs_err; + uint tx_auth_rq; + uint no_auth_rs; + uint no_ass_rs; + uint tx_ass_rq; + uint rx_ass_rq; + uint tx_probe_rq; + uint reassoc; + uint swtxstop; + uint swtxawake; +}; + +#define SEC_KEY_1 (1<<0) +#define SEC_KEY_2 (1<<1) +#define SEC_KEY_3 (1<<2) +#define SEC_KEY_4 (1<<3) +#define SEC_ACTIVE_KEY (1<<4) +#define SEC_AUTH_MODE (1<<5) +#define SEC_UNICAST_GROUP (1<<6) +#define SEC_LEVEL (1<<7) +#define SEC_ENABLED (1<<8) + +#define SEC_LEVEL_0 0 /* None */ +#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ +#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ +#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ +#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ + +#define WEP_KEYS 4 +#define WEP_KEY_LEN 13 + + + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_security { + u16 active_key:2, + enabled:1, + auth_mode:2, + auth_algo:4, + unicast_uses_group:1; + u8 key_sizes[WEP_KEYS]; + u8 keys[WEP_KEYS][WEP_KEY_LEN]; + u8 level; + u16 flags; +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_security { + u16 active_key:2, + enabled:1, + auth_mode:2, + auth_algo:4, + unicast_uses_group:1; + u8 key_sizes[WEP_KEYS]; + u8 keys[WEP_KEYS][WEP_KEY_LEN]; + u8 level; + u16 flags; +} ; +#pragma pack() + +#endif + +/* + + 802.11 data frame from AP + + ,-------------------------------------------------------------------. +Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | + |------|------|---------|---------|---------|------|---------|------| +Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | + | | tion | (BSSID) | | | ence | data | | + `-------------------------------------------------------------------' + +Total: 28-2340 bytes + +*/ + +struct ieee80211_header_data { + u16 frame_ctl; + u16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + u16 seq_ctrl; +}; + +#define BEACON_PROBE_SSID_ID_POSITION 12 + +/* Management Frame Information Element Types */ +#define MFIE_TYPE_SSID 0 +#define MFIE_TYPE_RATES 1 +#define MFIE_TYPE_FH_SET 2 +#define MFIE_TYPE_DS_SET 3 +#define MFIE_TYPE_CF_SET 4 +#define MFIE_TYPE_TIM 5 +#define MFIE_TYPE_IBSS_SET 6 +#define MFIE_TYPE_CHALLENGE 16 +#define MFIE_TYPE_ERP 42 +#define MFIE_TYPE_RSN 48 +#define MFIE_TYPE_RATES_EX 50 +#define MFIE_TYPE_GENERIC 221 + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + +struct ieee80211_info_element_hdr { + u8 id; + u8 len; +} __attribute__ ((packed)); + +struct ieee80211_info_element { + u8 id; + u8 len; + u8 data[0]; +} __attribute__ ((packed)); +#endif + +#ifdef CONFIG_TDLS +/* TDLS */ +#define TDLS_MIC_LEN 16 +#define WPA_NONCE_LEN 32 +#define TDLS_TIMEOUT_LEN 4 + +struct wpa_tdls_ftie { + u8 ie_type; /* FTIE */ + u8 ie_len; + u8 mic_ctrl[2]; + u8 mic[TDLS_MIC_LEN]; + u8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */ + u8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */ + /* followed by optional elements */ +} ; + +struct wpa_tdls_timeoutie { + u8 ie_type; /* Timeout IE */ + u8 ie_len; + u8 interval_type; + u8 value[TDLS_TIMEOUT_LEN]; +} ; + +struct wpa_tdls_lnkid { + u8 ie_type; /* Link Identifier IE */ + u8 ie_len; + u8 bssid[ETH_ALEN]; + u8 init_sta[ETH_ALEN]; + u8 resp_sta[ETH_ALEN]; +} ; +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) +struct ieee80211_info_element_hdr { + u8 id; + u8 len; +} ; + +struct ieee80211_info_element { + u8 id; + u8 len; + u8 data[0]; +} ; +#pragma pack() + +#endif + + +/* + * These are the data types that can make up management packets + * + u16 auth_algorithm; + u16 auth_sequence; + u16 beacon_interval; + u16 capability; + u8 current_ap[ETH_ALEN]; + u16 listen_interval; + struct { + u16 association_id:14, reserved:2; + } __attribute__ ((packed)); + u32 time_stamp[2]; + u16 reason; + u16 status; +*/ + +#define IEEE80211_DEFAULT_TX_ESSID "Penguin" +#define IEEE80211_DEFAULT_BASIC_RATE 10 + + +#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) + + +struct ieee80211_authentication { + struct ieee80211_header_data header; + u16 algorithm; + u16 transaction; + u16 status; + //struct ieee80211_info_element_hdr info_element; +} __attribute__ ((packed)); + + +struct ieee80211_probe_response { + struct ieee80211_header_data header; + u32 time_stamp[2]; + u16 beacon_interval; + u16 capability; + struct ieee80211_info_element info_element; +} __attribute__ ((packed)); + +struct ieee80211_probe_request { + struct ieee80211_header_data header; + /*struct ieee80211_info_element info_element;*/ +} __attribute__ ((packed)); + +struct ieee80211_assoc_request_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 listen_interval; + //u8 current_ap[ETH_ALEN]; + struct ieee80211_info_element_hdr info_element; +} __attribute__ ((packed)); + +struct ieee80211_assoc_response_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 status; + u16 aid; +// struct ieee80211_info_element info_element; /* supported rates */ +} __attribute__ ((packed)); +#endif + + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_authentication { + struct ieee80211_header_data header; + u16 algorithm; + u16 transaction; + u16 status; + //struct ieee80211_info_element_hdr info_element; +} ; + + +struct ieee80211_probe_response { + struct ieee80211_header_data header; + u32 time_stamp[2]; + u16 beacon_interval; + u16 capability; + struct ieee80211_info_element info_element; +} ; + +struct ieee80211_probe_request { + struct ieee80211_header_data header; + /*struct ieee80211_info_element info_element;*/ +} ; + +struct ieee80211_assoc_request_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 listen_interval; + //u8 current_ap[ETH_ALEN]; + struct ieee80211_info_element_hdr info_element; +} ; + +struct ieee80211_assoc_response_frame { + struct ieee80211_hdr_3addr header; + u16 capability; + u16 status; + u16 aid; +// struct ieee80211_info_element info_element; /* supported rates */ +}; + +#pragma pack() + +#endif + + + + +struct ieee80211_txb { + u8 nr_frags; + u8 encrypted; + u16 reserved; + u16 frag_size; + u16 payload_size; + struct sk_buff *fragments[0]; +}; + + +/* SWEEP TABLE ENTRIES NUMBER*/ +#define MAX_SWEEP_TAB_ENTRIES 42 +#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 +/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs + * only use 8, and then use extended rates for the remaining supported + * rates. Other APs, however, stick all of their supported rates on the + * main rates information element... */ +#define MAX_RATES_LENGTH ((u8)12) +#define MAX_RATES_EX_LENGTH ((u8)16) +#define MAX_NETWORK_COUNT 128 +#define MAX_CHANNEL_NUMBER 161 +#define IEEE80211_SOFTMAC_SCAN_TIME 400 +//(HZ / 2) +#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) + +#define CRC_LENGTH 4U + +#define MAX_WPA_IE_LEN (128) +#define MAX_WPS_IE_LEN (512) +#define MAX_P2P_IE_LEN (256) +#define MAX_WFD_IE_LEN (128) + +#define NETWORK_EMPTY_ESSID (1<<0) +#define NETWORK_HAS_OFDM (1<<1) +#define NETWORK_HAS_CCK (1<<2) + +#define IEEE80211_DTIM_MBCAST 4 +#define IEEE80211_DTIM_UCAST 2 +#define IEEE80211_DTIM_VALID 1 +#define IEEE80211_DTIM_INVALID 0 + +#define IEEE80211_PS_DISABLED 0 +#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST +#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST +#define IW_ESSID_MAX_SIZE 32 +#if 0 +struct ieee80211_network { + /* These entries are used to identify a unique network */ + u8 bssid[ETH_ALEN]; + u8 channel; + /* Ensure null-terminated for any debug msgs */ + u8 ssid[IW_ESSID_MAX_SIZE + 1]; + u8 ssid_len; + u8 rssi; //relative signal strength + u8 sq; //signal quality + + /* These are network statistics */ + //struct ieee80211_rx_stats stats; + u16 capability; + u16 aid; + u8 rates[MAX_RATES_LENGTH]; + u8 rates_len; + u8 rates_ex[MAX_RATES_EX_LENGTH]; + u8 rates_ex_len; + + u8 edca_parmsets[18]; + + u8 mode; + u8 flags; + u8 time_stamp[8]; + u16 beacon_interval; + u16 listen_interval; + u16 atim_window; + u8 wpa_ie[MAX_WPA_IE_LEN]; + size_t wpa_ie_len; + u8 rsn_ie[MAX_WPA_IE_LEN]; + size_t rsn_ie_len; + u8 country[6]; + u8 dtim_period; + u8 dtim_data; + u8 power_constraint; + u8 qosinfo; + u8 qbssload[5]; + u8 network_type; + int join_res; + unsigned long last_scanned; +}; +#endif +/* +join_res: +-1: authentication fail +-2: association fail +> 0: TID +*/ + +enum ieee80211_state { + + /* the card is not linked at all */ + IEEE80211_NOLINK = 0, + + /* IEEE80211_ASSOCIATING* are for BSS client mode + * the driver shall not perform RX filtering unless + * the state is LINKED. + * The driver shall just check for the state LINKED and + * defaults to NOLINK for ALL the other states (including + * LINKED_SCANNING) + */ + + /* the association procedure will start (wq scheduling)*/ + IEEE80211_ASSOCIATING, + IEEE80211_ASSOCIATING_RETRY, + + /* the association procedure is sending AUTH request*/ + IEEE80211_ASSOCIATING_AUTHENTICATING, + + /* the association procedure has successfully authentcated + * and is sending association request + */ + IEEE80211_ASSOCIATING_AUTHENTICATED, + + /* the link is ok. the card associated to a BSS or linked + * to a ibss cell or acting as an AP and creating the bss + */ + IEEE80211_LINKED, + + /* same as LINKED, but the driver shall apply RX filter + * rules as we are in NO_LINK mode. As the card is still + * logically linked, but it is doing a syncro site survey + * then it will be back to LINKED state. + */ + IEEE80211_LINKED_SCANNING, + +}; + +#define DEFAULT_MAX_SCAN_AGE (15 * HZ) +#define DEFAULT_FTS 2346 +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] + +extern __inline int is_multicast_mac_addr(const u8 *addr) +{ + return ((addr[0] != 0xff) && (0x01 & addr[0])); +} + +extern __inline int is_broadcast_mac_addr(const u8 *addr) +{ + return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ + (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); +} + +#define CFG_IEEE80211_RESERVE_FCS (1<<0) +#define CFG_IEEE80211_COMPUTE_FCS (1<<1) + +typedef struct tx_pending_t{ + int frag; + struct ieee80211_txb *txb; +}tx_pending_t; + + + +#define MAXTID 16 + +#define IEEE_A (1<<0) +#define IEEE_B (1<<1) +#define IEEE_G (1<<2) +#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) + +extern __inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +{ + /* Single white space is for Linksys APs */ + if (essid_len == 1 && essid[0] == ' ') + return 1; + + /* Otherwise, if the entire essid is 0, we assume it is hidden */ + while (essid_len) { + essid_len--; + if (essid[essid_len] != '\0') + return 0; + } + + return 1; +} + +extern __inline int ieee80211_get_hdrlen(u16 fc) +{ + int hdrlen = 24; + + switch (WLAN_FC_GET_TYPE(fc)) { + case IEEE80211_FTYPE_DATA: + if (fc & IEEE80211_QOS_DATAGRP) + hdrlen += 2; + if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) + hdrlen += 6; /* Addr4 */ + break; + case IEEE80211_FTYPE_CTL: + switch (WLAN_FC_GET_STYPE(fc)) { + case IEEE80211_STYPE_CTS: + case IEEE80211_STYPE_ACK: + hdrlen = 10; + break; + default: + hdrlen = 16; + break; + } + break; + } + + return hdrlen; +} + +#if 0 +/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */ +#define WLAN_ACTION_SPECTRUM_MGMT 0 +#define WLAN_ACTION_QOS 1 +#define WLAN_ACTION_DLS 2 +#define WLAN_ACTION_BLOCK_ACK 3 +#define WLAN_ACTION_RADIO_MEASUREMENT 5 +#define WLAN_ACTION_FT 6 +#define WLAN_ACTION_SA_QUERY 8 +#define WLAN_ACTION_WMM 17 +#endif + + +/* Action category code */ +enum ieee80211_category { + WLAN_CATEGORY_SPECTRUM_MGMT = 0, + WLAN_CATEGORY_QOS = 1, + WLAN_CATEGORY_DLS = 2, + WLAN_CATEGORY_BACK = 3, + WLAN_CATEGORY_PUBLIC = 4, //IEEE 802.11 public action frames + WLAN_CATEGORY_RADIO_MEASUREMENT = 5, + WLAN_CATEGORY_FT = 6, + WLAN_CATEGORY_HT = 7, + WLAN_CATEGORY_SA_QUERY = 8, + WLAN_CATEGORY_TDLS = 12, + WLAN_CATEGORY_WMM = 17, + WLAN_CATEGORY_P2P = 0x7f,//P2P action frames +}; + +/* SPECTRUM_MGMT action code */ +enum ieee80211_spectrum_mgmt_actioncode { + WLAN_ACTION_SPCT_MSR_REQ = 0, + WLAN_ACTION_SPCT_MSR_RPRT = 1, + WLAN_ACTION_SPCT_TPC_REQ = 2, + WLAN_ACTION_SPCT_TPC_RPRT = 3, + WLAN_ACTION_SPCT_CHL_SWITCH = 4, + WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, +}; + +enum _PUBLIC_ACTION{ + ACT_PUBLIC_BSSCOEXIST = 0, // 20/40 BSS Coexistence + ACT_PUBLIC_MP = 7, // Measurement Pilot + ACT_PUBLIC_P2P = 9, // WIFI_DIRECT +}; + +#ifdef CONFIG_TDLS +enum TDLS_ACTION_FIELD{ + TDLS_SETUP_REQUEST = 0, + TDLS_SETUP_RESPONSE = 1, + TDLS_SETUP_CONFIRM = 2, + TDLS_TEARDOWN = 3, + TDLS_PEER_TRAFFIC_INDICATION = 4, + TDLS_CHANNEL_SWITCH_REQUEST = 5, + TDLS_CHANNEL_SWITCH_RESPONSE = 6, + TDLS_PEER_PSM_REQUEST = 7, + TDLS_PEER_PSM_RESPONSE = 8, + TDLS_PEER_TRAFFIC_RESPONSE = 9, + TDLS_DISCOVERY_REQUEST = 10, + TDLS_DISCOVERY_RESPONSE = 14, //it's used in public action frame +}; +#endif + +/* BACK action code */ +enum ieee80211_back_actioncode { + WLAN_ACTION_ADDBA_REQ = 0, + WLAN_ACTION_ADDBA_RESP = 1, + WLAN_ACTION_DELBA = 2, +}; + +/* HT features action code */ +enum ieee80211_ht_actioncode { + WLAN_ACTION_NOTIFY_CH_WIDTH = 0, + WLAN_ACTION_SM_PS = 1, + WLAN_ACTION_PSPM = 2, + WLAN_ACTION_PCO_PHASE = 3, + WLAN_ACTION_MIMO_CSI_MX = 4, + WLAN_ACTION_MIMO_NONCP_BF = 5, + WLAN_ACTION_MIMP_CP_BF = 6, + WLAN_ACTION_ASEL_INDICATES_FB = 7, + WLAN_ACTION_HI_INFO_EXCHG = 8, +}; + +/* BACK (block-ack) parties */ +enum ieee80211_back_parties { + WLAN_BACK_RECIPIENT = 0, + WLAN_BACK_INITIATOR = 1, + WLAN_BACK_TIMER = 2, +}; + + +#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs) + * 00:50:F2 */ + +#define WME_OUI_TYPE 2 +#define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WME_VERSION 1 + +#define WME_ACTION_CODE_SETUP_REQUEST 0 +#define WME_ACTION_CODE_SETUP_RESPONSE 1 +#define WME_ACTION_CODE_TEARDOWN 2 + +#define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0 +#define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1 +#define WME_SETUP_RESPONSE_STATUS_REFUSED 3 + +#define WME_TSPEC_DIRECTION_UPLINK 0 +#define WME_TSPEC_DIRECTION_DOWNLINK 1 +#define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3 + + +#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */ + +#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */ + +/* Parsed Information Elements */ +struct ieee802_11_elems { + u8 *ssid; + u8 ssid_len; + u8 *supp_rates; + u8 supp_rates_len; + u8 *fh_params; + u8 fh_params_len; + u8 *ds_params; + u8 ds_params_len; + u8 *cf_params; + u8 cf_params_len; + u8 *tim; + u8 tim_len; + u8 *ibss_params; + u8 ibss_params_len; + u8 *challenge; + u8 challenge_len; + u8 *erp_info; + u8 erp_info_len; + u8 *ext_supp_rates; + u8 ext_supp_rates_len; + u8 *wpa_ie; + u8 wpa_ie_len; + u8 *rsn_ie; + u8 rsn_ie_len; + u8 *wme; + u8 wme_len; + u8 *wme_tspec; + u8 wme_tspec_len; + u8 *wps_ie; + u8 wps_ie_len; + u8 *power_cap; + u8 power_cap_len; + u8 *supp_channels; + u8 supp_channels_len; + u8 *mdie; + u8 mdie_len; + u8 *ftie; + u8 ftie_len; + u8 *timeout_int; + u8 timeout_int_len; + u8 *ht_capabilities; + u8 ht_capabilities_len; + u8 *ht_operation; + u8 ht_operation_len; + u8 *vendor_ht_cap; + u8 vendor_ht_cap_len; +}; + +typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes; + +ParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len, + struct ieee802_11_elems *elems, + int show_errors); + +u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, unsigned int *frlen); +u8 *rtw_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen); +u8 *rtw_get_ie(u8*pbuf, sint index, sint *len, sint limit); +void rtw_set_supported_rate(u8* SupportedRates, uint mode) ; + +unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit); +unsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit); +int rtw_get_wpa_cipher_suite(u8 *s); +int rtw_get_wpa2_cipher_suite(u8 *s); +int rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher); +int rtw_parse_wpa2_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher); + +int rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len); +u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); +u8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen); + +int rtw_get_p2p_ie(u8 *in_ie, uint in_len, u8 *p2p_ie, uint *p2p_ielen); +int rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen); +u32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr); +int rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *attr_content, uint *attr_contentlen); +int rtw_get_wps_ie_p2p(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen); +#ifdef CONFIG_WFD +int rtw_get_wfd_ie(u8 *in_ie, uint in_len, u8 *wfd_ie, uint *wfd_ielen); +int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen); +#endif // CONFIG_WFD + +uint rtw_get_rateset_len(u8 *rateset); + +struct registry_priv; +int rtw_generate_ie(struct registry_priv *pregistrypriv); + + +int rtw_get_bit_value_from_ieee_value(u8 val); + +uint rtw_is_cckrates_included(u8 *rate); + +uint rtw_is_cckratesonly_included(u8 *rate); + +int rtw_check_network_type(unsigned char *rate, int ratelen, int channel); + +void rtw_macaddr_cfg(u8 *mac_addr); +#endif /* IEEE80211_H */ + diff --git a/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h b/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h new file mode 100755 index 000000000000..0a966fa5d03a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ieee80211_ext.h @@ -0,0 +1,477 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __IEEE80211_EXT_H +#define __IEEE80211_EXT_H + +#include +#include +#include + +#define WMM_OUI_TYPE 2 +#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0 +#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1 +#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2 +#define WMM_VERSION 1 + +#define WPA_PROTO_WPA BIT(0) +#define WPA_PROTO_RSN BIT(1) + +#define WPA_KEY_MGMT_IEEE8021X BIT(0) +#define WPA_KEY_MGMT_PSK BIT(1) +#define WPA_KEY_MGMT_NONE BIT(2) +#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3) +#define WPA_KEY_MGMT_WPA_NONE BIT(4) + + +#define WPA_CAPABILITY_PREAUTH BIT(0) +#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6) +#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9) + + +#define PMKID_LEN 16 + + +#ifdef PLATFORM_LINUX +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}__attribute__ ((packed)); + +struct wme_ac_parameter { +#if defined(CONFIG_LITTLE_ENDIAN) + /* byte 1 */ + u8 aifsn:4, + acm:1, + aci:2, + reserved:1; + + /* byte 2 */ + u8 eCWmin:4, + eCWmax:4; +#elif defined(CONFIG_BIG_ENDIAN) + /* byte 1 */ + u8 reserved:1, + aci:2, + acm:1, + aifsn:4; + + /* byte 2 */ + u8 eCWmax:4, + eCWmin:4; +#else +#error "Please fix " +#endif + + /* bytes 3 & 4 */ + u16 txopLimit; +} __attribute__ ((packed)); + +struct wme_parameter_element { + /* required fields for WME version 1 */ + u8 oui[3]; + u8 oui_type; + u8 oui_subtype; + u8 version; + u8 acInfo; + u8 reserved; + struct wme_ac_parameter ac[4]; + +} __attribute__ ((packed)); + +#endif + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct wpa_ie_hdr { + u8 elem_id; + u8 len; + u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */ + u8 version[2]; /* little endian */ +}; + +struct rsn_ie_hdr { + u8 elem_id; /* WLAN_EID_RSN */ + u8 len; + u8 version[2]; /* little endian */ +}; + +#pragma pack() + +#endif + +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val)) +//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) + + + +/* Action category code */ +enum ieee80211_category { + WLAN_CATEGORY_SPECTRUM_MGMT = 0, + WLAN_CATEGORY_QOS = 1, + WLAN_CATEGORY_DLS = 2, + WLAN_CATEGORY_BACK = 3, + WLAN_CATEGORY_HT = 7, + WLAN_CATEGORY_WMM = 17, +}; + +/* SPECTRUM_MGMT action code */ +enum ieee80211_spectrum_mgmt_actioncode { + WLAN_ACTION_SPCT_MSR_REQ = 0, + WLAN_ACTION_SPCT_MSR_RPRT = 1, + WLAN_ACTION_SPCT_TPC_REQ = 2, + WLAN_ACTION_SPCT_TPC_RPRT = 3, + WLAN_ACTION_SPCT_CHL_SWITCH = 4, + WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5, +}; + +/* BACK action code */ +enum ieee80211_back_actioncode { + WLAN_ACTION_ADDBA_REQ = 0, + WLAN_ACTION_ADDBA_RESP = 1, + WLAN_ACTION_DELBA = 2, +}; + +/* HT features action code */ +enum ieee80211_ht_actioncode { + WLAN_ACTION_NOTIFY_CH_WIDTH = 0, + WLAN_ACTION_SM_PS = 1, + WLAN_ACTION_PSPM = 2, + WLAN_ACTION_PCO_PHASE = 3, + WLAN_ACTION_MIMO_CSI_MX = 4, + WLAN_ACTION_MIMO_NONCP_BF = 5, + WLAN_ACTION_MIMP_CP_BF = 6, + WLAN_ACTION_ASEL_INDICATES_FB = 7, + WLAN_ACTION_HI_INFO_EXCHG = 8, +}; + +/* BACK (block-ack) parties */ +enum ieee80211_back_parties { + WLAN_BACK_RECIPIENT = 0, + WLAN_BACK_INITIATOR = 1, + WLAN_BACK_TIMER = 2, +}; + +#ifdef PLATFORM_LINUX + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } __attribute__ ((packed)) auth; + struct { + u16 reason_code; + } __attribute__ ((packed)) deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) reassoc_req; + struct { + u16 reason_code; + } __attribute__ ((packed)) disassoc; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } __attribute__ ((packed)) beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } __attribute__ ((packed)) probe_req; + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } __attribute__ ((packed)) probe_resp; + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } __attribute__ ((packed)) wme_action; +#if 0 + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } __attribute__ ((packed)) chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } __attribute__ ((packed)) measurement; +#endif + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } __attribute__ ((packed)) addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } __attribute__ ((packed)) addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } __attribute__ ((packed)) delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } __attribute__ ((packed)) plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } __attribute__ ((packed)) mesh_action; + } __attribute__ ((packed)) u; + } __attribute__ ((packed)) action; + } __attribute__ ((packed)) u; +}__attribute__ ((packed)); + +#endif + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_mgmt { + u16 frame_control; + u16 duration; + u8 da[6]; + u8 sa[6]; + u8 bssid[6]; + u16 seq_ctrl; + union { + struct { + u16 auth_alg; + u16 auth_transaction; + u16 status_code; + /* possibly followed by Challenge text */ + u8 variable[0]; + } auth; + struct { + u16 reason_code; + } deauth; + struct { + u16 capab_info; + u16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } assoc_req; + struct { + u16 capab_info; + u16 status_code; + u16 aid; + /* followed by Supported rates */ + u8 variable[0]; + } assoc_resp, reassoc_resp; + struct { + u16 capab_info; + u16 listen_interval; + u8 current_ap[6]; + /* followed by SSID and Supported rates */ + u8 variable[0]; + } reassoc_req; + struct { + u16 reason_code; + } disassoc; +#if 0 + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params, TIM */ + u8 variable[0]; + } beacon; + struct { + /* only variable items: SSID, Supported rates */ + u8 variable[0]; + } probe_req; + + struct { + __le64 timestamp; + u16 beacon_int; + u16 capab_info; + /* followed by some of SSID, Supported rates, + * FH Params, DS Params, CF Params, IBSS Params */ + u8 variable[0]; + } probe_resp; +#endif + struct { + u8 category; + union { + struct { + u8 action_code; + u8 dialog_token; + u8 status_code; + u8 variable[0]; + } wme_action; +/* + struct{ + u8 action_code; + u8 element_id; + u8 length; + struct ieee80211_channel_sw_ie sw_elem; + } chan_switch; + struct{ + u8 action_code; + u8 dialog_token; + u8 element_id; + u8 length; + struct ieee80211_msrment_ie msr_elem; + } measurement; +*/ + struct{ + u8 action_code; + u8 dialog_token; + u16 capab; + u16 timeout; + u16 start_seq_num; + } addba_req; + struct{ + u8 action_code; + u8 dialog_token; + u16 status; + u16 capab; + u16 timeout; + } addba_resp; + struct{ + u8 action_code; + u16 params; + u16 reason_code; + } delba; + struct{ + u8 action_code; + /* capab_info for open and confirm, + * reason for close + */ + u16 aux; + /* Followed in plink_confirm by status + * code, AID and supported rates, + * and directly by supported rates in + * plink_open and plink_close + */ + u8 variable[0]; + } plink_action; + struct{ + u8 action_code; + u8 variable[0]; + } mesh_action; + } u; + } action; + } u; +} ; + +#pragma pack() + +#endif + +/* mgmt header + 1 byte category code */ +#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u) + + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/if_ether.h b/drivers/net/wireless/rtl8192c/include/if_ether.h new file mode 100755 index 000000000000..045c06775823 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/if_ether.h @@ -0,0 +1,112 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Global definitions for the Ethernet IEEE 802.3 interface. + * + * Version: @(#)if_ether.h 1.0.1a 02/08/94 + * + * Author: Fred N. van Kempen, + * Donald Becker, + * Alan Cox, + * Steve Whitehouse, + * + * 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. + */ + +#ifndef _LINUX_IF_ETHER_H +#define _LINUX_IF_ETHER_H + +/* + * IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble + * and FCS/CRC (frame check sequence). + */ + +#define ETH_ALEN 6 /* Octets in one ethernet addr */ +#define ETH_HLEN 14 /* Total octets in header. */ +#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */ +#define ETH_DATA_LEN 1500 /* Max. octets in payload */ +#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */ + +/* + * These are the defined Ethernet Protocol ID's. + */ + +#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */ +#define ETH_P_PUP 0x0200 /* Xerox PUP packet */ +#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */ +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_P_X25 0x0805 /* CCITT X.25 */ +#define ETH_P_ARP 0x0806 /* Address Resolution packet */ +#define ETH_P_BPQ 0x08FF /* G8BPQ AX.25 Ethernet Packet [ NOT AN OFFICIALLY REGISTERED ID ] */ +#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */ +#define ETH_P_IEEEPUPAT 0x0a01 /* Xerox IEEE802.3 PUP Addr Trans packet */ +#define ETH_P_DEC 0x6000 /* DEC Assigned proto */ +#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */ +#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */ +#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */ +#define ETH_P_LAT 0x6004 /* DEC LAT */ +#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */ +#define ETH_P_CUST 0x6006 /* DEC Customer use */ +#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */ +#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */ +#define ETH_P_ATALK 0x809B /* Appletalk DDP */ +#define ETH_P_AARP 0x80F3 /* Appletalk AARP */ +#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */ +#define ETH_P_IPX 0x8137 /* IPX over DIX */ +#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */ +#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */ +#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */ +#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */ +#define ETH_P_ATMFATE 0x8884 /* Frame-based ATM Transport + * over Ethernet + */ + +/* + * Non DIX types. Won't clash for 1500 types. + */ + +#define ETH_P_802_3 0x0001 /* Dummy type for 802.3 frames */ +#define ETH_P_AX25 0x0002 /* Dummy protocol id for AX.25 */ +#define ETH_P_ALL 0x0003 /* Every packet (be careful!!!) */ +#define ETH_P_802_2 0x0004 /* 802.2 frames */ +#define ETH_P_SNAP 0x0005 /* Internal only */ +#define ETH_P_DDCMP 0x0006 /* DEC DDCMP: Internal only */ +#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ +#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ +#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ +#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ +#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ +#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ +#define ETH_P_CONTROL 0x0016 /* Card specific control frames */ +#define ETH_P_IRDA 0x0017 /* Linux-IrDA */ +#define ETH_P_ECONET 0x0018 /* Acorn Econet */ + +/* + * This is an Ethernet frame header. + */ + +struct ethhdr +{ + unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ + unsigned char h_source[ETH_ALEN]; /* source ether addr */ + unsigned short h_proto; /* packet type ID field */ +}; + +struct _vlan { + unsigned short h_vlan_TCI; // Encapsulates priority and VLAN ID + unsigned short h_vlan_encapsulated_proto; +}; + + + +#define get_vlan_id(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI)) & 0xfff) +#define get_vlan_priority(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI))>>13) +#define get_vlan_encap_proto(pvlan) (ntohs((unsigned short )pvlan->h_vlan_encapsulated_proto)) + + +#endif /* _LINUX_IF_ETHER_H */ diff --git a/drivers/net/wireless/rtl8192c/include/ip.h b/drivers/net/wireless/rtl8192c/include/ip.h new file mode 100755 index 000000000000..5846347a07d2 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/ip.h @@ -0,0 +1,138 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Definitions for the IP protocol. + * + * Version: @(#)ip.h 1.0.2 04/28/93 + * + * Authors: Fred N. van Kempen, + * + * 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. + */ +#ifndef _LINUX_IP_H +#define _LINUX_IP_H +#include + +/* SOL_IP socket options */ + +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_MINCOST 0x02 + +#define IPTOS_PREC_MASK 0xE0 +#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + + +/* IP options */ +#define IPOPT_COPY 0x80 +#define IPOPT_CLASS_MASK 0x60 +#define IPOPT_NUMBER_MASK 0x1f + +#define IPOPT_COPIED(o) ((o)&IPOPT_COPY) +#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) +#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_MEASUREMENT 0x40 +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_END (0 |IPOPT_CONTROL) +#define IPOPT_NOOP (1 |IPOPT_CONTROL) +#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) +#define IPOPT_RR (7 |IPOPT_CONTROL) +#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) + +#define IPVERSION 4 +#define MAXTTL 255 +#define IPDEFTTL 64 + +/* struct timestamp, struct route and MAX_ROUTES are removed. + + REASONS: it is clear that nobody used them because: + - MAX_ROUTES value was wrong. + - "struct route" was wrong. + - "struct timestamp" had fatally misaligned bitfields and was completely unusable. + */ + +#define IPOPT_OPTVAL 0 +#define IPOPT_OLEN 1 +#define IPOPT_OFFSET 2 +#define IPOPT_MINOFF 4 +#define MAX_IPOPTLEN 40 +#define IPOPT_NOP IPOPT_NOOP +#define IPOPT_EOL IPOPT_END +#define IPOPT_TS IPOPT_TIMESTAMP + +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +#ifdef PLATFORM_LINUX + +struct ip_options { + __u32 faddr; /* Saved first hop address */ + unsigned char optlen; + unsigned char srr; + unsigned char rr; + unsigned char ts; + unsigned char is_setbyuser:1, /* Set by setsockopt? */ + is_data:1, /* Options in __data, rather than skb */ + is_strictroute:1, /* Strict source route */ + srr_is_hit:1, /* Packet destination addr was our one */ + is_changed:1, /* IP checksum more not valid */ + rr_needaddr:1, /* Need to record addr of outgoing dev */ + ts_needtime:1, /* Need to record timestamp */ + ts_needaddr:1; /* Need to record addr of outgoing dev */ + unsigned char router_alert; + unsigned char __pad1; + unsigned char __pad2; + unsigned char __data[0]; +}; + +#define optlength(opt) (sizeof(struct ip_options) + opt->optlen) +#endif + +struct iphdr { +#if defined(__LITTLE_ENDIAN_BITFIELD) + __u8 ihl:4, + version:4; +#elif defined (__BIG_ENDIAN_BITFIELD) + __u8 version:4, + ihl:4; +#else +#error "Please fix " +#endif + __u8 tos; + __u16 tot_len; + __u16 id; + __u16 frag_off; + __u8 ttl; + __u8 protocol; + __u16 check; + __u32 saddr; + __u32 daddr; + /*The options start here. */ +}; + +#endif /* _LINUX_IP_H */ diff --git a/drivers/net/wireless/rtl8192c/include/mlme_osdep.h b/drivers/net/wireless/rtl8192c/include/mlme_osdep.h new file mode 100755 index 000000000000..28912f0e7ed2 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/mlme_osdep.h @@ -0,0 +1,43 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __MLME_OSDEP_H_ +#define __MLME_OSDEP_H_ + +#include +#include +#include + +#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) +extern int time_after(u32 now, u32 old); +#endif + +extern void rtw_init_mlme_timer(_adapter *padapter); +extern void rtw_os_indicate_disconnect( _adapter *adapter ); +extern void rtw_os_indicate_connect( _adapter *adapter ); +extern void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie); + +#ifdef CONFIG_AP_MODE +void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta); +void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta); +#endif +void rtw_reset_securitypriv( _adapter *adapter ); + +#endif //_MLME_OSDEP_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h b/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h new file mode 100755 index 000000000000..5f8673811fb5 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/mp_custom_oid.h @@ -0,0 +1,353 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __CUSTOM_OID_H +#define __CUSTOM_OID_H + +// by Owen +// 0xFF818000 - 0xFF81802F RTL8180 Mass Production Kit +// 0xFF818500 - 0xFF81850F RTL8185 Setup Utility +// 0xFF818580 - 0xFF81858F RTL8185 Phy Status Utility + +// + +// by Owen for Production Kit +// For Production Kit with Agilent Equipments +// in order to make our custom oids hopefully somewhat unique +// we will use 0xFF (indicating implementation specific OID) +// 81(first byte of non zero Realtek unique identifier) +// 80 (second byte of non zero Realtek unique identifier) +// XX (the custom OID number - providing 255 possible custom oids) + +#define OID_RT_PRO_RESET_DUT 0xFF818000 +#define OID_RT_PRO_SET_DATA_RATE 0xFF818001 +#define OID_RT_PRO_START_TEST 0xFF818002 +#define OID_RT_PRO_STOP_TEST 0xFF818003 +#define OID_RT_PRO_SET_PREAMBLE 0xFF818004 +#define OID_RT_PRO_SET_SCRAMBLER 0xFF818005 +#define OID_RT_PRO_SET_FILTER_BB 0xFF818006 +#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB 0xFF818007 +#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL 0xFF818008 +#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL 0xFF818009 +#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL 0xFF81800A + +#define OID_RT_PRO_SET_TX_ANTENNA_BB 0xFF81800D +#define OID_RT_PRO_SET_ANTENNA_BB 0xFF81800E +#define OID_RT_PRO_SET_CR_SCRAMBLER 0xFF81800F +#define OID_RT_PRO_SET_CR_NEW_FILTER 0xFF818010 +#define OID_RT_PRO_SET_TX_POWER_CONTROL 0xFF818011 +#define OID_RT_PRO_SET_CR_TX_CONFIG 0xFF818012 +#define OID_RT_PRO_GET_TX_POWER_CONTROL 0xFF818013 +#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY 0xFF818014 +#define OID_RT_PRO_SET_CR_SETPOINT 0xFF818015 +#define OID_RT_PRO_SET_INTEGRATOR 0xFF818016 +#define OID_RT_PRO_SET_SIGNAL_QUALITY 0xFF818017 +#define OID_RT_PRO_GET_INTEGRATOR 0xFF818018 +#define OID_RT_PRO_GET_SIGNAL_QUALITY 0xFF818019 +#define OID_RT_PRO_QUERY_EEPROM_TYPE 0xFF81801A +#define OID_RT_PRO_WRITE_MAC_ADDRESS 0xFF81801B +#define OID_RT_PRO_READ_MAC_ADDRESS 0xFF81801C +#define OID_RT_PRO_WRITE_CIS_DATA 0xFF81801D +#define OID_RT_PRO_READ_CIS_DATA 0xFF81801E +#define OID_RT_PRO_WRITE_POWER_CONTROL 0xFF81801F +#define OID_RT_PRO_READ_POWER_CONTROL 0xFF818020 +#define OID_RT_PRO_WRITE_EEPROM 0xFF818021 +#define OID_RT_PRO_READ_EEPROM 0xFF818022 +#define OID_RT_PRO_RESET_TX_PACKET_SENT 0xFF818023 +#define OID_RT_PRO_QUERY_TX_PACKET_SENT 0xFF818024 +#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED 0xFF818025 +#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED 0xFF818026 +#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR 0xFF818027 +#define OID_RT_PRO_QUERY_CURRENT_ADDRESS 0xFF818028 +#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS 0xFF818029 +#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS 0xFF81802A +#define OID_RT_PRO_RECEIVE_PACKET 0xFF81802C +// added by Owen on 04/08/03 for Cameo's request +#define OID_RT_PRO_WRITE_EEPROM_BYTE 0xFF81802D +#define OID_RT_PRO_READ_EEPROM_BYTE 0xFF81802E +#define OID_RT_PRO_SET_MODULATION 0xFF81802F +// + +//Sean +#define OID_RT_DRIVER_OPTION 0xFF818080 +#define OID_RT_RF_OFF 0xFF818081 +#define OID_RT_AUTH_STATUS 0xFF818082 + +//======================================================================== +#define OID_RT_PRO_SET_CONTINUOUS_TX 0xFF81800B +#define OID_RT_PRO_SET_SINGLE_CARRIER_TX 0xFF81800C +#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX 0xFF81802B +#define OID_RT_PRO_SET_SINGLE_TONE_TX 0xFF818043 +//======================================================================== + + +// by Owen for RTL8185 Phy Status Report Utility +#define OID_RT_UTILITY_FALSE_ALARM_COUNTERS 0xFF818580 +#define OID_RT_UTILITY_SELECT_DEBUG_MODE 0xFF818581 +#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER 0xFF818582 +#define OID_RT_UTILITY_GET_RSSI_STATUS 0xFF818583 +#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS 0xFF818584 +#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS 0xFF818585 +#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS 0xFF818586 +// + +// by Owen on 03/09/19-03/09/22 for RTL8185 +#define OID_RT_WIRELESS_MODE 0xFF818500 +#define OID_RT_SUPPORTED_RATES 0xFF818501 +#define OID_RT_DESIRED_RATES 0xFF818502 +#define OID_RT_WIRELESS_MODE_STARTING_ADHOC 0xFF818503 +// + +#define OID_RT_GET_CONNECT_STATE 0xFF030001 +#define OID_RT_RESCAN 0xFF030002 +#define OID_RT_SET_KEY_LENGTH 0xFF030003 +#define OID_RT_SET_DEFAULT_KEY_ID 0xFF030004 + +#define OID_RT_SET_CHANNEL 0xFF010182 +#define OID_RT_SET_SNIFFER_MODE 0xFF010183 +#define OID_RT_GET_SIGNAL_QUALITY 0xFF010184 +#define OID_RT_GET_SMALL_PACKET_CRC 0xFF010185 +#define OID_RT_GET_MIDDLE_PACKET_CRC 0xFF010186 +#define OID_RT_GET_LARGE_PACKET_CRC 0xFF010187 +#define OID_RT_GET_TX_RETRY 0xFF010188 +#define OID_RT_GET_RX_RETRY 0xFF010189 +#define OID_RT_PRO_SET_FW_DIG_STATE 0xFF01018A//S +#define OID_RT_PRO_SET_FW_RA_STATE 0xFF01018B//S + +#define OID_RT_GET_RX_TOTAL_PACKET 0xFF010190 +#define OID_RT_GET_TX_BEACON_OK 0xFF010191 +#define OID_RT_GET_TX_BEACON_ERR 0xFF010192 +#define OID_RT_GET_RX_ICV_ERR 0xFF010193 +#define OID_RT_SET_ENCRYPTION_ALGORITHM 0xFF010194 +#define OID_RT_SET_NO_AUTO_RESCAN 0xFF010195 +#define OID_RT_GET_PREAMBLE_MODE 0xFF010196 +#define OID_RT_GET_DRIVER_UP_DELTA_TIME 0xFF010197 +#define OID_RT_GET_AP_IP 0xFF010198 +#define OID_RT_GET_CHANNELPLAN 0xFF010199 +#define OID_RT_SET_PREAMBLE_MODE 0xFF01019A +#define OID_RT_SET_BCN_INTVL 0xFF01019B +#define OID_RT_GET_RF_VENDER 0xFF01019C +#define OID_RT_DEDICATE_PROBE 0xFF01019D +#define OID_RT_PRO_RX_FILTER_PATTERN 0xFF01019E + +#define OID_RT_GET_DCST_CURRENT_THRESHOLD 0xFF01019F + +#define OID_RT_GET_CCA_ERR 0xFF0101A0 +#define OID_RT_GET_CCA_UPGRADE_THRESHOLD 0xFF0101A1 +#define OID_RT_GET_CCA_FALLBACK_THRESHOLD 0xFF0101A2 + +#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES 0xFF0101A3 +#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES 0xFF0101A4 + +// by Owen on 03/31/03 for Cameo's request +#define OID_RT_SET_RATE_ADAPTIVE 0xFF0101A5 +// +#define OID_RT_GET_DCST_EVALUATE_PERIOD 0xFF0101A5 +#define OID_RT_GET_DCST_TIME_UNIT_INDEX 0xFF0101A6 +#define OID_RT_GET_TOTAL_TX_BYTES 0xFF0101A7 +#define OID_RT_GET_TOTAL_RX_BYTES 0xFF0101A8 +#define OID_RT_CURRENT_TX_POWER_LEVEL 0xFF0101A9 +#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT 0xFF0101AA +#define OID_RT_GET_ENC_KEY_MATCH_COUNT 0xFF0101AB +#define OID_RT_GET_CHANNEL 0xFF0101AC + +#define OID_RT_SET_CHANNELPLAN 0xFF0101AD +#define OID_RT_GET_HARDWARE_RADIO_OFF 0xFF0101AE +#define OID_RT_CHANNELPLAN_BY_COUNTRY 0xFF0101AF +#define OID_RT_SCAN_AVAILABLE_BSSID 0xFF0101B0 +#define OID_RT_GET_HARDWARE_VERSION 0xFF0101B1 +#define OID_RT_GET_IS_ROAMING 0xFF0101B2 +#define OID_RT_GET_IS_PRIVACY 0xFF0101B3 +#define OID_RT_GET_KEY_MISMATCH 0xFF0101B4 +#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH 0xFF0101B5 +#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH 0xFF0101B6 +#define OID_RT_RESET_LOG 0xFF0101B7 +#define OID_RT_GET_LOG 0xFF0101B8 +#define OID_RT_SET_INDICATE_HIDDEN_AP 0xFF0101B9 +#define OID_RT_GET_HEADER_FAIL 0xFF0101BA +#define OID_RT_SUPPORTED_WIRELESS_MODE 0xFF0101BB +#define OID_RT_GET_CHANNEL_LIST 0xFF0101BC +#define OID_RT_GET_SCAN_IN_PROGRESS 0xFF0101BD +#define OID_RT_GET_TX_INFO 0xFF0101BE +#define OID_RT_RF_READ_WRITE_OFFSET 0xFF0101BF +#define OID_RT_RF_READ_WRITE 0xFF0101C0 + +// For Netgear request. 2005.01.13, by rcnjko. +#define OID_RT_FORCED_DATA_RATE 0xFF0101C1 +#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST 0xFF0101C2 +// For Netgear request. 2005.02.17, by rcnjko. +#define OID_RT_GET_BSS_WIRELESS_MODE 0xFF0101C3 +// For AZ project. 2005.06.27, by rcnjko. +#define OID_RT_SCAN_WITH_MAGIC_PACKET 0xFF0101C4 + +// Vincent 8185MP +#define OID_RT_PRO_RX_FILTER 0xFF0111C0 + +//Andy TEST +//#define OID_RT_PRO_WRITE_REGISTRY 0xFF0111C1 +//#define OID_RT_PRO_READ_REGISTRY 0xFF0111C2 +#define OID_CE_USB_WRITE_REGISTRY 0xFF0111C1 +#define OID_CE_USB_READ_REGISTRY 0xFF0111C2 + + +#define OID_RT_PRO_SET_INITIAL_GAIN 0xFF0111C3 +#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE 0xFF0111C4 +#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE 0xFF0111C5 +#define OID_RT_PRO_SET_TX_CHARGE_PUMP 0xFF0111C6 +#define OID_RT_PRO_SET_RX_CHARGE_PUMP 0xFF0111C7 +#define OID_RT_PRO_RF_WRITE_REGISTRY 0xFF0111C8 +#define OID_RT_PRO_RF_READ_REGISTRY 0xFF0111C9 +#define OID_RT_PRO_QUERY_RF_TYPE 0xFF0111CA + +// AP OID +#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST 0xFF010300 +#define OID_RT_AP_GET_CURRENT_TIME_STAMP 0xFF010301 +#define OID_RT_AP_SWITCH_INTO_AP_MODE 0xFF010302 +#define OID_RT_AP_SET_DTIM_PERIOD 0xFF010303 +#define OID_RT_AP_SUPPORTED 0xFF010304 // Determine if driver supports AP mode. 2004.08.27, by rcnjko. +#define OID_RT_AP_SET_PASSPHRASE 0xFF010305 // Set WPA-PSK passphrase into authenticator. 2005.07.08, byrcnjko. + +// 8187MP. 2004.09.06, by rcnjko. +#define OID_RT_PRO8187_WI_POLL 0xFF818780 +#define OID_RT_PRO_WRITE_BB_REG 0xFF818781 +#define OID_RT_PRO_READ_BB_REG 0xFF818782 +#define OID_RT_PRO_WRITE_RF_REG 0xFF818783 +#define OID_RT_PRO_READ_RF_REG 0xFF818784 + +// Meeting House. added by Annie, 2005-07-20. +#define OID_RT_MH_VENDER_ID 0xFFEDC100 + +//8711 MP OID added 20051230. +#define OID_RT_PRO8711_JOIN_BSS 0xFF871100//S + +#define OID_RT_PRO_READ_REGISTER 0xFF871101 //Q +#define OID_RT_PRO_WRITE_REGISTER 0xFF871102 //S + +#define OID_RT_PRO_BURST_READ_REGISTER 0xFF871103 //Q +#define OID_RT_PRO_BURST_WRITE_REGISTER 0xFF871104 //S + +#define OID_RT_PRO_WRITE_TXCMD 0xFF871105 //S + +#define OID_RT_PRO_READ16_EEPROM 0xFF871106 //Q +#define OID_RT_PRO_WRITE16_EEPROM 0xFF871107 //S + +#define OID_RT_PRO_H2C_SET_COMMAND 0xFF871108 //S +#define OID_RT_PRO_H2C_QUERY_RESULT 0xFF871109 //Q + +#define OID_RT_PRO8711_WI_POLL 0xFF87110A //Q +#define OID_RT_PRO8711_PKT_LOSS 0xFF87110B //Q +#define OID_RT_RD_ATTRIB_MEM 0xFF87110C//Q +#define OID_RT_WR_ATTRIB_MEM 0xFF87110D//S + + +//Method 2 for H2C/C2H +#define OID_RT_PRO_H2C_CMD_MODE 0xFF871110 //S +#define OID_RT_PRO_H2C_CMD_RSP_MODE 0xFF871111 //Q +#define OID_RT_PRO_H2C_CMD_EVENT_MODE 0xFF871112 //S +#define OID_RT_PRO_WAIT_C2H_EVENT 0xFF871113 //Q +#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST 0xFF871114//Q + +#define OID_RT_PRO_SCSI_ACCESS_TEST 0xFF871115 //Q, S + +#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT 0xFF871116 //S +#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN 0xFF871117 //Q,S +#define OID_RT_RRO_RX_PKT_VIA_IOCTRL 0xFF871118 //Q +#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL 0xFF871119 //Q + +#define OID_RT_RPO_SET_PWRMGT_TEST 0xFF87111A //S +#define OID_RT_PRO_QRY_PWRMGT_TEST 0XFF87111B //Q +#define OID_RT_RPO_ASYNC_RWIO_TEST 0xFF87111C //S +#define OID_RT_RPO_ASYNC_RWIO_POLL 0xFF87111D //Q +#define OID_RT_PRO_SET_RF_INTFS 0xFF87111E //S +#define OID_RT_POLL_RX_STATUS 0xFF87111F //Q + +#define OID_RT_PRO_CFG_DEBUG_MESSAGE 0xFF871120 //Q,S +#define OID_RT_PRO_SET_DATA_RATE_EX 0xFF871121//S +#define OID_RT_PRO_SET_BASIC_RATE 0xFF871122//S +#define OID_RT_PRO_READ_TSSI 0xFF871123//S +#define OID_RT_PRO_SET_POWER_TRACKING 0xFF871124//S + + +#define OID_RT_PRO_QRY_PWRSTATE 0xFF871150 //Q +#define OID_RT_PRO_SET_PWRSTATE 0xFF871151 //S + +//Method 2 , using workitem +#define OID_RT_SET_READ_REG 0xFF871181 //S +#define OID_RT_SET_WRITE_REG 0xFF871182 //S +#define OID_RT_SET_BURST_READ_REG 0xFF871183 //S +#define OID_RT_SET_BURST_WRITE_REG 0xFF871184 //S +#define OID_RT_SET_WRITE_TXCMD 0xFF871185 //S +#define OID_RT_SET_READ16_EEPROM 0xFF871186 //S +#define OID_RT_SET_WRITE16_EEPROM 0xFF871187 //S +#define OID_RT_QRY_POLL_WKITEM 0xFF871188 //Q + +//For SDIO INTERFACE only +#define OID_RT_PRO_SYNCPAGERW_SRAM 0xFF8711A0 //Q, S +#define OID_RT_PRO_871X_DRV_EXT 0xFF8711A1 + +//For USB INTERFACE only +#define OID_RT_PRO_USB_VENDOR_REQ 0xFF8711B0 //Q, S +#define OID_RT_PRO_SCSI_AUTO_TEST 0xFF8711B1 //S +#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE 0xFF8711B2 //S +#define OID_RT_PRO_USB_MAC_RX_FIFO_READ 0xFF8711B3 //Q +#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING 0xFF8711B4 //Q + +#define OID_RT_PRO_H2C_SET_RATE_TABLE 0xFF8711FB //S +#define OID_RT_PRO_H2C_GET_RATE_TABLE 0xFF8711FC //S +#define OID_RT_PRO_H2C_C2H_LBK_TEST 0xFF8711FE + +#define OID_RT_PRO_ENCRYPTION_CTRL 0xFF871200 //Q, S +#define OID_RT_PRO_ADD_STA_INFO 0xFF871201 //S +#define OID_RT_PRO_DELE_STA_INFO 0xFF871202 //S +#define OID_RT_PRO_QUERY_DR_VARIABLE 0xFF871203 //Q + +#define OID_RT_PRO_RX_PACKET_TYPE 0xFF871204 //Q, S + +#define OID_RT_PRO_READ_EFUSE 0xFF871205 //Q +#define OID_RT_PRO_WRITE_EFUSE 0xFF871206 //S +#define OID_RT_PRO_RW_EFUSE_PGPKT 0xFF871207 //Q, S +#define OID_RT_GET_EFUSE_CURRENT_SIZE 0xFF871208 //Q + +#define OID_RT_SET_BANDWIDTH 0xFF871209 //S +#define OID_RT_SET_CRYSTAL_CAP 0xFF87120A //S + +#define OID_RT_SET_RX_PACKET_TYPE 0xFF87120B //S + +#define OID_RT_GET_EFUSE_MAX_SIZE 0xFF87120C //Q + +#define OID_RT_PRO_SET_TX_AGC_OFFSET 0xFF87120D //S + +#define OID_RT_PRO_SET_PKT_TEST_MODE 0xFF87120E //S + +#define OID_RT_PRO_FOR_EVM_TEST_SETTING 0xFF87120F //S + +#define OID_RT_PRO_GET_THERMAL_METER 0xFF871210 //Q + +#define OID_RT_RESET_PHY_RX_PACKET_COUNT 0xFF871211 //S +#define OID_RT_GET_PHY_RX_PACKET_RECEIVED 0xFF871212 //Q +#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR 0xFF871213 //Q + +#define OID_RT_SET_POWER_DOWN 0xFF871214 //S + +#define OID_RT_GET_POWER_MODE 0xFF871215 //Q + +#define OID_RT_PRO_EFUSE 0xFF871216 //Q, S +#define OID_RT_PRO_EFUSE_MAP 0xFF871217 //Q, S + +#endif //#ifndef __CUSTOM_OID_H diff --git a/drivers/net/wireless/rtl8192c/include/nic_spec.h b/drivers/net/wireless/rtl8192c/include/nic_spec.h new file mode 100755 index 000000000000..18e7b2c09671 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/nic_spec.h @@ -0,0 +1,47 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#ifndef __NIC_SPEC_H__ +#define __NIC_SPEC_H__ + +#include + +#define RTL8711_MCTRL_ (0x20000) +#define RTL8711_UART_ (0x30000) +#define RTL8711_TIMER_ (0x40000) +#define RTL8711_FINT_ (0x50000) +#define RTL8711_HINT_ (0x50000) +#define RTL8711_GPIO_ (0x60000) +#define RTL8711_WLANCTRL_ (0x200000) +#define RTL8711_WLANFF_ (0xe00000) +#define RTL8711_HCICTRL_ (0x600000) +#define RTL8711_SYSCFG_ (0x620000) +#define RTL8711_SYSCTRL_ (0x620000) +#define RTL8711_MCCTRL_ (0x020000) + + +#include + +#include + + +#endif // __RTL8711_SPEC_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h b/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h new file mode 100755 index 000000000000..5f7c3e65103a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/osdep_ce_service.h @@ -0,0 +1,171 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __OSDEP_CE_SERVICE_H_ +#define __OSDEP_CE_SERVICE_H_ + + +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include "SDCardDDK.h" +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +typedef HANDLE _sema; +typedef LIST_ENTRY _list; +typedef NDIS_STATUS _OS_STATUS; + +typedef NDIS_SPIN_LOCK _lock; + +typedef HANDLE _rwlock; //Mutex + +typedef u32 _irqL; + +typedef NDIS_HANDLE _nic_hdl; + + +typedef NDIS_MINIPORT_TIMER _timer; + +struct __queue { + LIST_ENTRY queue; + _lock lock; +}; + +typedef NDIS_PACKET _pkt; +typedef NDIS_BUFFER _buffer; +typedef struct __queue _queue; + +typedef HANDLE _thread_hdl_; +typedef DWORD thread_return; +typedef void* thread_context; +typedef NDIS_WORK_ITEM _workitem; + +#define thread_exit() ExitThread(STATUS_SUCCESS); return 0; + + +#define SEMA_UPBND (0x7FFFFFFF) //8192 + +__inline static _list *get_prev(_list *list) +{ + return list->Blink; +} + +__inline static _list *get_next(_list *list) +{ + return list->Flink; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + NdisAcquireSpinLock(plock); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + NdisReleaseSpinLock(plock); +} + +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + + +__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + WaitForSingleObject(*prwlock, INFINITE ); + +} + +__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL) +{ + ReleaseMutex(*prwlock); +} + +__inline static void rtw_list_delete(_list *plist) +{ + RemoveEntryList(plist); + InitializeListHead(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) +{ + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + NdisMSetTimer(ptimer,delay_time); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + NdisMCancelTimer(ptimer,bcancelled); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + + NdisInitializeWorkItem(pwork, pfunc, cntx); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + NdisScheduleWorkItem(pwork); +} + +#define ATOMIC_INIT(i) { (i) } + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ + { \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ + NdisMSleep(10000); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ +} +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/osdep_intf.h b/drivers/net/wireless/rtl8192c/include/osdep_intf.h new file mode 100755 index 000000000000..86b3f1fd93fe --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/osdep_intf.h @@ -0,0 +1,128 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef __OSDEP_INTF_H_ +#define __OSDEP_INTF_H_ + +#include +#include +#include + +#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2) + + +struct intf_priv { + + u8 *intf_dev; + u32 max_iosz; //USB2.0: 128, USB1.1: 64, SDIO:64 + u32 max_xmitsz; //USB2.0: unlimited, SDIO:512 + u32 max_recvsz; //USB2.0: unlimited, SDIO:512 + + volatile u8 *io_rwmem; + volatile u8 *allocated_io_rwmem; + u32 io_wsz; //unit: 4bytes + u32 io_rsz;//unit: 4bytes + u8 intf_status; + + void (*_bus_io)(u8 *priv); + +/* +Under Sync. IRP (SDIO/USB) +A protection mechanism is necessary for the io_rwmem(read/write protocol) + +Under Async. IRP (SDIO/USB) +The protection mechanism is through the pending queue. +*/ + + _mutex ioctl_mutex; + + +#ifdef PLATFORM_LINUX + #ifdef CONFIG_USB_HCI + // when in USB, IO is through interrupt in/out endpoints + struct usb_device *udev; + PURB piorw_urb; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + _timer io_timer; + u8 bio_irp_timeout; + u8 bio_timer_cancel; + #endif +#endif + +#ifdef PLATFORM_OS_XP + #ifdef CONFIG_SDIO_HCI + // below is for io_rwmem... + PMDL pmdl; + PSDBUS_REQUEST_PACKET sdrp; + PSDBUS_REQUEST_PACKET recv_sdrp; + PSDBUS_REQUEST_PACKET xmit_sdrp; + + PIRP piorw_irp; + + #endif + #ifdef CONFIG_USB_HCI + PURB piorw_urb; + PIRP piorw_irp; + u8 io_irp_cnt; + u8 bio_irp_pending; + _sema io_retevt; + #endif +#endif + +}; + + +#ifdef CONFIG_R871X_TEST +int rtw_start_pseudo_adhoc(_adapter *padapter); +int rtw_stop_pseudo_adhoc(_adapter *padapter); +#endif + +u8 rtw_init_drv_sw(_adapter *padapter); +u8 rtw_free_drv_sw(_adapter *padapter); +u8 rtw_reset_drv_sw(_adapter *padapter); + +u32 rtw_start_drv_threads(_adapter *padapter); +void rtw_stop_drv_threads (_adapter *padapter); +void rtw_cancel_all_timer(_adapter *padapter); + +#ifdef PLATFORM_LINUX +int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); + +int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname); +struct net_device *rtw_init_netdev(_adapter *padapter); + +#ifdef CONFIG_PROC_DEBUG +void rtw_proc_init_one(struct net_device *dev); +void rtw_proc_remove_one(struct net_device *dev); +#endif +#endif + + +void rtw_ips_dev_unload(_adapter *padapter); +#ifdef CONFIG_IPS +int rtw_ips_pwr_up(_adapter *padapter); +void rtw_ips_pwr_down(_adapter *padapter); +#endif + + +#endif //_OSDEP_INTF_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/osdep_service.h b/drivers/net/wireless/rtl8192c/include/osdep_service.h new file mode 100755 index 000000000000..8450b03d6bc6 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/osdep_service.h @@ -0,0 +1,826 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __OSDEP_SERVICE_H_ +#define __OSDEP_SERVICE_H_ + +#include +#include +//#include + +#define _SUCCESS 1 +#define _FAIL 0 +//#define RTW_STATUS_TIMEDOUT -110 + +#undef _TRUE +#define _TRUE 1 + +#undef _FALSE +#define _FALSE 0 + + +#ifdef PLATFORM_LINUX + #include + #include + #include + #include + #include + #include + #include + #include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5)) + #include +#endif + #include + #include + #include + #include + #include + #include + #include + #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) + #include +#else + #include +#endif + #include + #include + #include + #include + #include + #include + #include + #include + #include // Necessary because we use the proc fs + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + #include + #include + #include +#endif + +#ifdef CONFIG_USB_HCI + #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) + #include +#else + #include +#endif +#endif + +#ifdef CONFIG_SDIO_HCI + #include + #include +#endif + +#ifdef CONFIG_PCI_HCI + #include +#endif + + +#ifdef CONFIG_USB_HCI + typedef struct urb * PURB; +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22)) +#ifdef CONFIG_USB_SUSPEND +#define CONFIG_AUTOSUSPEND 1 +#endif +#endif +#endif + + typedef struct semaphore _sema; + typedef spinlock_t _lock; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + typedef struct mutex _mutex; +#else + typedef struct semaphore _mutex; +#endif + typedef struct timer_list _timer; + + struct __queue { + struct list_head queue; + _lock lock; + }; + + typedef struct sk_buff _pkt; + typedef unsigned char _buffer; + + typedef struct __queue _queue; + typedef struct list_head _list; + typedef int _OS_STATUS; + //typedef u32 _irqL; + typedef unsigned long _irqL; + typedef struct net_device * _nic_hdl; + + typedef pid_t _thread_hdl_; + typedef int thread_return; + typedef void* thread_context; + + #define thread_exit() complete_and_exit(NULL, 0) + + typedef void timer_hdl_return; + typedef void* timer_hdl_context; + typedef struct work_struct _workitem; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) + #define skb_tail_pointer(skb) skb->tail +#endif + +__inline static _list *get_next(_list *list) +{ + return list->next; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + + +#define LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) + + +__inline static void _enter_critical(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_lock_irqsave(plock, *pirqL); +} + +__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + spin_unlock_irqrestore(plock, *pirqL); +} + +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_lock_bh(plock); +} + +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) +{ + spin_unlock_bh(plock); +} + +__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_lock(pmutex); +#else + down(pmutex); +#endif +} + + +__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_unlock(pmutex); +#else + up(pmutex); +#endif +} + +__inline static void rtw_list_delete(_list *plist) +{ + list_del_init(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,void* cntx) +{ + //setup_timer(ptimer, pfunc,(u32)cntx); + ptimer->function = pfunc; + ptimer->data = (unsigned long)cntx; + init_timer(ptimer); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + mod_timer(ptimer , (jiffies+(delay_time*HZ/1000))); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + del_timer_sync(ptimer); + *bcancelled= _TRUE;//TRUE ==1; FALSE==0 +} + +#ifdef PLATFORM_LINUX +#define RTW_TIMER_HDL_ARGS void *FunctionContext +#elif defined(PLATFORM_OS_CE) || defined(PLATFORM_WINDOWS) +#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3 +#endif + +#define RTW_TIMER_HDL_NAME(name) rtw_##name##_timer_hdl +#define RTW_DECLARE_TIMER_HDL(name) void RTW_TIMER_HDL_NAME(name)(RTW_TIMER_HDL_ARGS) + + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + INIT_WORK(pwork, pfunc); +#else + INIT_WORK(pwork, pfunc,pwork); +#endif +} + +__inline static void _set_workitem(_workitem *pwork) +{ + schedule_work(pwork); +} + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\ + { \ + atomic_dec((atomic_t *)&(_MutexCounter)); \ + msleep(10); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + atomic_dec((atomic_t *)&(_MutexCounter)); \ +} + +#endif // PLATFORM_LINUX + + +#ifdef PLATFORM_OS_XP + + #include + #include + #include + #include + #include + +#ifdef CONFIG_USB_HCI + #include + #include + #include +#endif + + typedef KSEMAPHORE _sema; + typedef LIST_ENTRY _list; + typedef NDIS_STATUS _OS_STATUS; + + + typedef NDIS_SPIN_LOCK _lock; + + typedef KMUTEX _mutex; + + typedef KIRQL _irqL; + + // USB_PIPE for WINCE , but handle can be use just integer under windows + typedef NDIS_HANDLE _nic_hdl; + + + typedef NDIS_MINIPORT_TIMER _timer; + + struct __queue { + LIST_ENTRY queue; + _lock lock; + }; + + typedef NDIS_PACKET _pkt; + typedef NDIS_BUFFER _buffer; + typedef struct __queue _queue; + + typedef PKTHREAD _thread_hdl_; + typedef void thread_return; + typedef void* thread_context; + + typedef NDIS_WORK_ITEM _workitem; + + #define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS); + + #define HZ 10000000 + #define SEMA_UPBND (0x7FFFFFFF) //8192 + +__inline static _list *get_next(_list *list) +{ + return list->Flink; +} + +__inline static _list *get_list_head(_queue *queue) +{ + return (&(queue->queue)); +} + + +#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member) + + +__inline static _enter_critical(_lock *plock, _irqL *pirqL) +{ + NdisAcquireSpinLock(plock); +} + +__inline static _exit_critical(_lock *plock, _irqL *pirqL) +{ + NdisReleaseSpinLock(plock); +} + + +__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + +__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL) +{ + NdisDprAcquireSpinLock(plock); +} + +__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL) +{ + NdisDprReleaseSpinLock(plock); +} + +__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + KeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL); +} + + +__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL) +{ + KeReleaseMutex(pmutex, FALSE); +} + + +__inline static void rtw_list_delete(_list *plist) +{ + RemoveEntryList(plist); + InitializeListHead(plist); +} + +__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx) +{ + NdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx); +} + +__inline static void _set_timer(_timer *ptimer,u32 delay_time) +{ + NdisMSetTimer(ptimer,delay_time); +} + +__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled) +{ + NdisMCancelTimer(ptimer,bcancelled); +} + +__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx) +{ + + NdisInitializeWorkItem(pwork, pfunc, cntx); +} + +__inline static void _set_workitem(_workitem *pwork) +{ + NdisScheduleWorkItem(pwork); +} + + +#define ATOMIC_INIT(i) { (i) } + +// +// Global Mutex: can only be used at PASSIVE level. +// + +#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\ + { \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ + NdisMSleep(10000); \ + } \ +} + +#define RELEASE_GLOBAL_MUTEX(_MutexCounter) \ +{ \ + NdisInterlockedDecrement((PULONG)&(_MutexCounter)); \ +} + +#endif // PLATFORM_OS_XP + + +#ifdef PLATFORM_OS_CE +#include +#endif + +#include + +#ifndef BIT + #define BIT(x) ( 1 << (x)) +#endif + +extern int RTW_STATUS_CODE(int error_code); + +#define CONFIG_USE_VMALLOC + +#ifdef DBG_MEM_ALLOC +void rtw_dump_mem_stat (void); +extern u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line); +extern u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line); +extern void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line); +extern u8* dbg_rtw_malloc(u32 sz, const char *func, int line); +extern u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line); +extern void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line); +#ifdef CONFIG_USE_VMALLOC +#define rtw_vmalloc(sz) dbg_rtw_vmalloc((sz), __FUNCTION__, __LINE__) +#define rtw_zvmalloc(sz) dbg_rtw_zvmalloc((sz), __FUNCTION__, __LINE__) +#define rtw_vmfree(pbuf, sz) dbg_rtw_vmfree((pbuf), (sz), __FUNCTION__, __LINE__) +#else //CONFIG_USE_VMALLOC +#define rtw_vmalloc(sz) dbg_rtw_malloc((sz), __FUNCTION__, __LINE__) +#define rtw_zvmalloc(sz) dbg_rtw_zmalloc((sz), __FUNCTION__, __LINE__) +#define rtw_vmfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), __FUNCTION__, __LINE__) +#endif //CONFIG_USE_VMALLOC +#define rtw_malloc(sz) dbg_rtw_malloc((sz), __FUNCTION__, __LINE__) +#define rtw_zmalloc(sz) dbg_rtw_zmalloc((sz), __FUNCTION__, __LINE__) +#define rtw_mfree(pbuf, sz) dbg_rtw_mfree((pbuf), (sz), __FUNCTION__, __LINE__) +#else +extern u8* _rtw_vmalloc(u32 sz); +extern u8* _rtw_zvmalloc(u32 sz); +extern void _rtw_vmfree(u8 *pbuf, u32 sz); +extern u8* _rtw_zmalloc(u32 sz); +extern u8* _rtw_malloc(u32 sz); +extern void _rtw_mfree(u8 *pbuf, u32 sz); +#ifdef CONFIG_USE_VMALLOC +#define rtw_vmalloc(sz) _rtw_vmalloc((sz)) +#define rtw_zvmalloc(sz) _rtw_zvmalloc((sz)) +#define rtw_vmfree(pbuf, sz) _rtw_vmfree((pbuf), (sz)) +#else //CONFIG_USE_VMALLOC +#define rtw_vmalloc(sz) _rtw_malloc((sz)) +#define rtw_zvmalloc(sz) _rtw_zmalloc((sz)) +#define rtw_vmfree(pbuf, sz) _rtw_mfree((pbuf), (sz)) +#endif //CONFIG_USE_VMALLOC +#define rtw_malloc(sz) _rtw_malloc((sz)) +#define rtw_zmalloc(sz) _rtw_zmalloc((sz)) +#define rtw_mfree(pbuf, sz) _rtw_mfree((pbuf), (sz)) +#endif + +extern void _rtw_memcpy(void* dec, void* sour, u32 sz); +extern int _rtw_memcmp(void *dst, void *src, u32 sz); +extern void _rtw_memset(void *pbuf, int c, u32 sz); + +extern void _rtw_init_listhead(_list *list); +extern u32 rtw_is_list_empty(_list *phead); +extern void rtw_list_insert_tail(_list *plist, _list *phead); +extern void rtw_list_delete(_list *plist); + +extern void _rtw_init_sema(_sema *sema, int init_val); +extern void _rtw_free_sema(_sema *sema); +extern void _rtw_up_sema(_sema *sema); +extern u32 _rtw_down_sema(_sema *sema); +extern void _rtw_mutex_init(_mutex *pmutex); +extern void _rtw_mutex_free(_mutex *pmutex); +extern void _rtw_spinlock_init(_lock *plock); +extern void _rtw_spinlock_free(_lock *plock); +extern void _rtw_spinlock(_lock *plock); +extern void _rtw_spinunlock(_lock *plock); +extern void _rtw_spinlock_ex(_lock *plock); +extern void _rtw_spinunlock_ex(_lock *plock); + +extern void _rtw_init_queue(_queue *pqueue); +extern u32 _rtw_queue_empty(_queue *pqueue); +extern u32 rtw_end_of_queue_search(_list *queue, _list *pelement); + +extern u32 rtw_get_current_time(void); +extern u32 rtw_systime_to_ms(u32 systime); +extern s32 rtw_get_passing_time_ms(u32 start); +extern s32 rtw_get_time_interval_ms(u32 start, u32 end); + +extern void rtw_sleep_schedulable(int ms); + +extern void rtw_msleep_os(int ms); +extern void rtw_usleep_os(int us); + +#ifdef DBG_DELAY_OS +#define rtw_mdelay_os(ms) _rtw_mdelay_os((ms), __FUNCTION__, __LINE__) +#define rtw_udelay_os(ms) _rtw_udelay_os((ms), __FUNCTION__, __LINE__) +extern void _rtw_mdelay_os(int ms, const char *func, const int line); +extern void _rtw_udelay_os(int us, const char *func, const int line); +#else +extern void rtw_mdelay_os(int ms); +extern void rtw_udelay_os(int us); +#endif + + + +__inline static unsigned char _cancel_timer_ex(_timer *ptimer) +{ +#ifdef PLATFORM_LINUX + return del_timer_sync(ptimer); +#endif + +#ifdef PLATFORM_WINDOWS + u8 bcancelled; + + _cancel_timer(ptimer, &bcancelled); + + return bcancelled; +#endif +} + +__inline static void thread_enter(void *context) +{ +#ifdef PLATFORM_LINUX + //struct net_device *pnetdev = (struct net_device *)context; + //daemonize("%s", pnetdev->name); + daemonize("%s", "RTKTHREAD"); + allow_signal(SIGTERM); +#endif +} + +__inline static void flush_signals_thread(void) +{ +#ifdef PLATFORM_LINUX + if (signal_pending (current)) + { + flush_signals(current); + } +#endif +} + +__inline static _OS_STATUS res_to_status(sint res) +{ + + +#if defined (PLATFORM_LINUX) || defined (PLATFORM_MPIXEL) + return res; +#endif + +#ifdef PLATFORM_WINDOWS + + if (res == _SUCCESS) + return NDIS_STATUS_SUCCESS; + else + return NDIS_STATUS_FAILURE; + +#endif + +} + +__inline static u32 _RND4(u32 sz) +{ + + u32 val; + + val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2; + + return val; + +} + +__inline static u32 _RND8(u32 sz) +{ + + u32 val; + + val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3; + + return val; + +} + +__inline static u32 _RND128(u32 sz) +{ + + u32 val; + + val = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7; + + return val; + +} + +__inline static u32 _RND256(u32 sz) +{ + + u32 val; + + val = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8; + + return val; + +} + +__inline static u32 _RND512(u32 sz) +{ + + u32 val; + + val = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9; + + return val; + +} + +__inline static u32 bitshift(u32 bitmask) +{ + u32 i; + + for (i = 0; i <= 31; i++) + if (((bitmask>>i) & 0x1) == 1) break; + + return i; +} + +#ifndef MAC_FMT +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#endif +#ifndef MAC_ARG +#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] +#endif + +//#ifdef __GNUC__ +#ifdef PLATFORM_LINUX +#define STRUCT_PACKED __attribute__ ((packed)) +#else +#define STRUCT_PACKED +#endif + + +// limitation of path length +#ifdef PLATFORM_LINUX + #define PATH_LENGTH_MAX PATH_MAX +#elif defined(PLATFORM_WINDOWS) + #define PATH_LENGTH_MAX MAX_PATH +#endif + + +// Suspend lock prevent system from going suspend +#ifdef CONFIG_WAKELOCK +#include +#elif defined(CONFIG_ANDROID_POWER) +#include +#endif + +extern void rtw_suspend_lock_init(void); +extern void rtw_suspend_lock_uninit(void); +extern void rtw_lock_suspend(void); +extern void rtw_unlock_suspend(void); + + +//Atomic integer operations +#ifdef PLATFORM_LINUX + #define ATOMIC_T atomic_t +#elif defined(PLATFORM_WINDOWS) + #define ATOMIC_T LONG +#endif + +extern void ATOMIC_SET(ATOMIC_T *v, int i); +extern int ATOMIC_READ(ATOMIC_T *v); +extern void ATOMIC_ADD(ATOMIC_T *v, int i); +extern void ATOMIC_SUB(ATOMIC_T *v, int i); +extern void ATOMIC_INC(ATOMIC_T *v); +extern void ATOMIC_DEC(ATOMIC_T *v); +extern int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i); +extern int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i); +extern int ATOMIC_INC_RETURN(ATOMIC_T *v); +extern int ATOMIC_DEC_RETURN(ATOMIC_T *v); + +//File operation APIs, just for linux now +#ifdef PLATFORM_LINUX +extern int openFile(struct file **fpp, char *path,int flag,int mode); +extern int closeFile(struct file *fp); +extern int readFile(struct file *fp,char *buf,int len); +extern int writeFile(struct file *fp,char *buf,int len); +#endif + + +#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR +struct rtw_netdev_priv_indicator { + void *priv; + u32 sizeof_priv; +}; +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv); +extern struct net_device * rtw_alloc_etherdev(int sizeof_priv); +#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv ) +extern void rtw_free_netdev(struct net_device * netdev); +#else +#define rtw_alloc_etherdev(sizeof_priv) alloc_etherdev((sizeof_priv)) +#define rtw_netdev_priv(netdev) netdev_priv((netdev)) +#define rtw_free_netdev(netdev) free_netdev((netdev)) +#endif + +#ifdef PLATFORM_LINUX +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) +#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1) +#else +#define rtw_signal_process(pid, sig) kill_proc((pid), (sig), 1) +#endif +#endif //PLATFORM_LINUX + +extern u64 rtw_modular64(u64 x, u64 y); +extern u64 rtw_division64(u64 x, u64 y); + + +/* Macros for handling unaligned memory accesses */ + +#define RTW_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1])) +#define RTW_PUT_BE16(a, val) \ + do { \ + (a)[0] = ((u16) (val)) >> 8; \ + (a)[1] = ((u16) (val)) & 0xff; \ + } while (0) + +#define RTW_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0])) +#define RTW_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \ + ((u32) (a)[2])) +#define RTW_PUT_BE24(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[2] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ + (((u32) (a)[2]) << 8) | ((u32) (a)[3])) +#define RTW_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \ + (((u32) (a)[1]) << 8) | ((u32) (a)[0])) +#define RTW_PUT_LE32(a, val) \ + do { \ + (a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[0] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \ + (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \ + (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \ + (((u64) (a)[6]) << 8) | ((u64) (a)[7])) +#define RTW_PUT_BE64(a, val) \ + do { \ + (a)[0] = (u8) (((u64) (val)) >> 56); \ + (a)[1] = (u8) (((u64) (val)) >> 48); \ + (a)[2] = (u8) (((u64) (val)) >> 40); \ + (a)[3] = (u8) (((u64) (val)) >> 32); \ + (a)[4] = (u8) (((u64) (val)) >> 24); \ + (a)[5] = (u8) (((u64) (val)) >> 16); \ + (a)[6] = (u8) (((u64) (val)) >> 8); \ + (a)[7] = (u8) (((u64) (val)) & 0xff); \ + } while (0) + +#define RTW_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \ + (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \ + (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \ + (((u64) (a)[1]) << 8) | ((u64) (a)[0])) + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/pci_hal.h b/drivers/net/wireless/rtl8192c/include/pci_hal.h new file mode 100755 index 000000000000..1ee0ee2c226b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/pci_hal.h @@ -0,0 +1,168 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __PCI_HAL_H__ +#define __PCI_HAL_H__ + + +#define INTEL_VENDOR_ID 0x8086 +#define SIS_VENDOR_ID 0x1039 +#define ATI_VENDOR_ID 0x1002 +#define ATI_DEVICE_ID 0x7914 +#define AMD_VENDOR_ID 0x1022 + +#define PCI_MAX_BRIDGE_NUMBER 255 +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 + +#define PCI_CONF_ADDRESS 0x0CF8 // PCI Configuration Space Address +#define PCI_CONF_DATA 0x0CFC // PCI Configuration Space Data + +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 + +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 + +#define U1DONTCARE 0xFF +#define U2DONTCARE 0xFFFF +#define U4DONTCARE 0xFFFFFFFF + +#define PCI_VENDER_ID_REALTEK 0x10ec + +#define HAL_HW_PCI_8180_DEVICE_ID 0x8180 +#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 //8185 or 8185b +#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 //8185b +#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 //8185b +#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 //8190 +#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 //8723E +#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 //8192 PCI-E +#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 //8192 SE +#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 //8192 SE +#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 //8191 SE Crab +#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 //8191 SE RE +#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 //8191 SE Unicron +#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 //8190 PCI for Ceraga +#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 //8190 Cardbus for Ceraga +#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 //8192e PCIE for Ceraga +#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 //8192e Express Card for Ceraga +#define HAL_HW_PCI_700F_DEVICE_ID 0x700F +#define HAL_HW_PCI_701F_DEVICE_ID 0x701F +#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304 +#define HAL_HW_PCI_8192CET_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192CE_DEVICE_ID 0x8178 //8192ce +#define HAL_HW_PCI_8191CE_DEVICE_ID 0x8177 //8192ce +#define HAL_HW_PCI_8188CE_DEVICE_ID 0x8176 //8192ce +#define HAL_HW_PCI_8192CU_DEVICE_ID 0x8191 //8192ce +#define HAL_HW_PCI_8192DE_DEVICE_ID 0x8193 //8192de +#define HAL_HW_PCI_002B_DEVICE_ID 0x002B //8192de, provided by HW SD + +#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 //8190 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192SE 0x10 +#define HAL_HW_PCI_REVISION_ID_8192CE 0x1 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 //8192 support 16 pages of IO registers +#define HAL_HW_PCI_REVISION_ID_8192DE 0x0 +#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 //8192 support 16 pages of IO registers + +enum pci_bridge_vendor { + PCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001 + PCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010 + PCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100 + PCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000 + PCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000 + PCI_BRIDGE_VENDOR_MAX ,//= 0x80 +} ; + +struct rt_pci_capabilities_header { + u8 capability_id; + u8 next; +}; + +struct pci_priv{ + u8 linkctrl_reg; + + u8 busnumber; + u8 devnumber; + u8 funcnumber; + + u8 pcibridge_busnum; + u8 pcibridge_devnum; + u8 pcibridge_funcnum; + u8 pcibridge_vendor; + u16 pcibridge_vendorid; + u16 pcibridge_deviceid; + u8 pcibridge_pciehdr_offset; + u8 pcibridge_linkctrlreg; + + u8 amd_l1_patch; +}; + +typedef struct _RT_ISR_CONTENT +{ + union{ + u32 IntArray[2]; + u32 IntReg4Byte; + u16 IntReg2Byte; + }; +}RT_ISR_CONTENT, *PRT_ISR_CONTENT; + +//#define RegAddr(addr) (addr + 0xB2000000UL) +//some platform macros will def here +static inline void NdisRawWritePortUlong(u32 port, u32 val) +{ + outl(val, port); + //writel(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawWritePortUchar(u32 port, u8 val) +{ + outb(val, port); + //writeb(val, (u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUchar(u32 port, u8 *pval) +{ + *pval = inb(port); + //*pval = readb((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUshort(u32 port, u16 *pval) +{ + *pval = inw(port); + //*pval = readw((u8 *)RegAddr(port)); +} + +static inline void NdisRawReadPortUlong(u32 port, u32 *pval) +{ + *pval = inl(port); + //*pval = readl((u8 *)RegAddr(port)); +} + +#ifdef CONFIG_RTL8192C +void rtl8192ce_set_hal_ops(_adapter * padapter); +#endif +#ifdef CONFIG_RTL8192D +void rtl8192de_set_hal_ops(_adapter * padapter); +#endif + +#endif //__PCIE_HAL_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/pci_ops.h b/drivers/net/wireless/rtl8192c/include/pci_ops.h new file mode 100755 index 000000000000..dd63f5f87d43 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/pci_ops.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __PCI_OPS_H_ +#define __PCI_OPS_H_ + +#include +#include +#include +#include + +#ifdef CONFIG_RTL8192C +u32 rtl8192ce_init_desc_ring(_adapter * padapter); +u32 rtl8192ce_free_desc_ring(_adapter * padapter); +void rtl8192ce_reset_desc_ring(_adapter * padapter); +#ifdef CONFIG_64BIT_DMA +u8 PlatformEnable92CEDMA64(PADAPTER Adapter); +#endif +int rtl8192ce_interrupt(PADAPTER Adapter); +void rtl8192ce_xmit_tasklet(void *priv); +void rtl8192ce_recv_tasklet(void *priv); +void rtl8192ce_prepare_bcn_tasklet(void *priv); +void rtl8192ce_set_intf_ops(struct _io_ops *pops); +#endif + +#ifdef CONFIG_RTL8192D +u32 rtl8192de_init_desc_ring(_adapter * padapter); +u32 rtl8192de_free_desc_ring(_adapter * padapter); +void rtl8192de_reset_desc_ring(_adapter * padapter); +#ifdef CONFIG_64BIT_DMA +u8 PlatformEnable92DEDMA64(PADAPTER Adapter); +#endif +int rtl8192de_interrupt(PADAPTER Adapter); +void rtl8192de_xmit_tasklet(void *priv); +void rtl8192de_recv_tasklet(void *priv); +void rtl8192de_prepare_bcn_tasklet(void *priv); +void rtl8192de_set_intf_ops(struct _io_ops *pops); +u32 MpReadPCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u8 Direct); +void MpWritePCIDwordDBI8192D(IN PADAPTER Adapter, IN u16 Offset, IN u32 Value, IN u8 Direct); +#endif + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/pci_osintf.h b/drivers/net/wireless/rtl8192c/include/pci_osintf.h new file mode 100755 index 000000000000..09715af43781 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/pci_osintf.h @@ -0,0 +1,33 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __PCI_OSINTF_H +#define __PCI_OSINTF_H + +#include +#include +#include + + +void rtw_pci_disable_aspm(_adapter *padapter); +void rtw_pci_enable_aspm(_adapter *padapter); + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/recv_osdep.h b/drivers/net/wireless/rtl8192c/include/recv_osdep.h new file mode 100755 index 000000000000..536ed3100ae2 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/recv_osdep.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RECV_OSDEP_H_ +#define __RECV_OSDEP_H_ + +#include +#include +#include + + +extern sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); +extern void _rtw_free_recv_priv (struct recv_priv *precvpriv); + + +extern s32 rtw_recv_entry(union recv_frame *precv_frame); +extern int rtw_recv_indicatepkt(_adapter *adapter, union recv_frame *precv_frame); +extern void rtw_recv_returnpacket(IN _nic_hdl cnxt, IN _pkt *preturnedpkt); + +extern void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame); +extern void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup); + + +int rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter); +void rtw_free_recv_priv (struct recv_priv *precvpriv); + + +int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter); +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe); +void rtw_os_recv_resource_free(struct recv_priv *precvpriv); + + +int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf); +int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf); + +void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf); + +void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl); + + +#endif // + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h new file mode 100755 index 000000000000..c6f177348b5b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_cmd.h @@ -0,0 +1,98 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_CMD_H_ +#define __RTL8192C_CMD_H_ + + +enum cmd_msg_element_id +{ + NONE_CMDMSG_EID, + AP_OFFLOAD_EID=0, + SET_PWRMODE_EID=1, + JOINBSS_RPT_EID=2, + RSVD_PAGE_EID=3, + RSSI_4_EID = 4, + RSSI_SETTING_EID=5, + MACID_CONFIG_EID=6, + MACID_PS_MODE_EID=7, + P2P_PS_OFFLOAD_EID=8, + SELECTIVE_SUSPEND_ROF_CMD=9, + P2P_PS_CTW_CMD_EID=32, + MAX_CMDMSG_EID +}; + +struct cmd_msg_parm { + u8 eid; //element id + u8 sz; // sz + u8 buf[6]; +}; + +typedef struct _SETPWRMODE_PARM{ + u8 Mode; + u8 SmartPS; + u8 BcnPassTime; // unit: 100ms +}SETPWRMODE_PARM, *PSETPWRMODE_PARM; + +struct H2C_SS_RFOFF_PARAM{ + u8 ROFOn; // 1: on, 0:off + u16 gpio_period; // unit: 1024 us +}__attribute__ ((packed)); + + +typedef struct JOINBSSRPT_PARM{ + u8 OpMode; // RT_MEDIA_STATUS +}JOINBSSRPT_PARM, *PJOINBSSRPT_PARM; + +typedef struct _RSVDPAGE_LOC{ + u8 LocProbeRsp; + u8 LocPsPoll; + u8 LocNullData; +}RSVDPAGE_LOC, *PRSVDPAGE_LOC; + +struct P2P_PS_Offload_t { + unsigned char Offload_En:1; + unsigned char role:1; // 1: Owner, 0: Client + unsigned char CTWindow_En:1; + unsigned char NoA0_En:1; + unsigned char NoA1_En:1; + unsigned char AllStaSleep:1; // Only valid in Owner + unsigned char discovery:1; + unsigned char rsvd:1; +}; + +struct P2P_PS_CTWPeriod_t { + unsigned char CTWPeriod; //TU +}; + +// host message to firmware cmd +void rtl8192c_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode); +void rtl8192c_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus); +u8 rtl8192c_set_rssi_cmd(_adapter*padapter, u8 *param); +u8 rtl8192c_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg); +void rtl8192c_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg); +u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter*padapter,u8 bfwpoll, u16 period); +#ifdef CONFIG_P2P +void rtl8192c_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state); +#endif //CONFIG_P2P + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h new file mode 100755 index 000000000000..2e208adb9694 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_dm.h @@ -0,0 +1,608 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_DM_H__ +#define __RTL8192C_DM_H__ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ + +#define RSSI_CCK 0 +#define RSSI_OFDM 1 + +#define OFDM_TABLE_SIZE 37 +#define CCK_TABLE_SIZE 33 + +static u32 OFDMSwingTable[OFDM_TABLE_SIZE] = { + 0x7f8001fe, // 0, +6.0dB + 0x788001e2, // 1, +5.5dB + 0x71c001c7, // 2, +5.0dB + 0x6b8001ae, // 3, +4.5dB + 0x65400195, // 4, +4.0dB + 0x5fc0017f, // 5, +3.5dB + 0x5a400169, // 6, +3.0dB + 0x55400155, // 7, +2.5dB + 0x50800142, // 8, +2.0dB + 0x4c000130, // 9, +1.5dB + 0x47c0011f, // 10, +1.0dB + 0x43c0010f, // 11, +0.5dB + 0x40000100, // 12, +0dB + 0x3c8000f2, // 13, -0.5dB + 0x390000e4, // 14, -1.0dB + 0x35c000d7, // 15, -1.5dB + 0x32c000cb, // 16, -2.0dB + 0x300000c0, // 17, -2.5dB + 0x2d4000b5, // 18, -3.0dB + 0x2ac000ab, // 19, -3.5dB + 0x288000a2, // 20, -4.0dB + 0x26000098, // 21, -4.5dB + 0x24000090, // 22, -5.0dB + 0x22000088, // 23, -5.5dB + 0x20000080, // 24, -6.0dB + 0x1e400079, // 25, -6.5dB + 0x1c800072, // 26, -7.0dB + 0x1b00006c, // 27. -7.5dB + 0x19800066, // 28, -8.0dB + 0x18000060, // 29, -8.5dB + 0x16c0005b, // 30, -9.0dB + 0x15800056, // 31, -9.5dB + 0x14400051, // 32, -10.0dB + 0x1300004c, // 33, -10.5dB + 0x12000048, // 34, -11.0dB + 0x11000044, // 35, -11.5dB + 0x10000040, // 36, -12.0dB +}; + +static u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = { +{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB +{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB +{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB +{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB +{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB +{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB +{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB +{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB +{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB +{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB +{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB +{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB +{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB +{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB +{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB +{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB +{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB +{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB +{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB +{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB +{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB +{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB +{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB +{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB +{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB +{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB +{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB +{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB +{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB +{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB +{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB +{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB +{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB +}; + +static u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= { +{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB +{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB +{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB +{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB +{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB +{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB +{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB +{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB +{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB +{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB +{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB +{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB +{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB +{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB +{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB +{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB +{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB +{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB +{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB +{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB +{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB +{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB +{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB +{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB +{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB +{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB +{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB +{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB +{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB +{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB +{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB +{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB +{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB +}; + +//============================================================ +// structure and define +//============================================================ + +typedef struct _FALSE_ALARM_STATISTICS{ + u32 Cnt_Parity_Fail; + u32 Cnt_Rate_Illegal; + u32 Cnt_Crc8_fail; + u32 Cnt_Mcs_fail; + u32 Cnt_Ofdm_fail; + u32 Cnt_Cck_fail; + u32 Cnt_all; + u32 Cnt_Fast_Fsync; + u32 Cnt_SB_Search_fail; +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; + +typedef struct _Dynamic_Power_Saving_ +{ + u8 PreCCAState; + u8 CurCCAState; + + u8 PreRFState; + u8 CurRFState; + + s32 Rssi_val_min; + +}PS_T; + +typedef struct _Dynamic_Initial_Gain_Threshold_ +{ + u8 Dig_Enable_Flag; + u8 Dig_Ext_Port_Stage; + + int RssiLowThresh; + int RssiHighThresh; + + u32 FALowThresh; + u32 FAHighThresh; + + u8 CurSTAConnectState; + u8 PreSTAConnectState; + u8 CurMultiSTAConnectState; + + u8 PreIGValue; + u8 CurIGValue; + + char BackoffVal; + char BackoffVal_range_max; + char BackoffVal_range_min; + u8 rx_gain_range_max; + u8 rx_gain_range_min; + u8 Rssi_val_min; + + u8 PreCCKPDState; + u8 CurCCKPDState; + u8 PreCCKFAState; + u8 CurCCKFAState; + u8 PreCCAState; + u8 CurCCAState; + + u8 LargeFAHit; + u8 ForbiddenIGI; + u32 Recover_cnt; + +}DIG_T; + +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition +{ + DIG_TYPE_THRESH_HIGH = 0, + DIG_TYPE_THRESH_LOW = 1, + DIG_TYPE_BACKOFF = 2, + DIG_TYPE_RX_GAIN_MIN = 3, + DIG_TYPE_RX_GAIN_MAX = 4, + DIG_TYPE_ENABLE = 5, + DIG_TYPE_DISABLE = 6, + DIG_OP_TYPE_MAX +}DM_DIG_OP_E; + +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition +{ + CCK_PD_STAGE_LowRssi = 0, + CCK_PD_STAGE_HighRssi = 1, + CCK_PD_STAGE_MAX = 3, +}DM_CCK_PDTH_E; + +typedef enum tag_1R_CCA_Type_Definition +{ + CCA_1R =0, + CCA_2R = 1, + CCA_MAX = 2, +}DM_1R_CCA_E; + +typedef enum tag_RF_Type_Definition +{ + RF_Save =0, + RF_Normal = 1, + RF_MAX = 2, +}DM_RF_E; + +typedef enum tag_DIG_EXT_PORT_ALGO_Definition +{ + DIG_EXT_PORT_STAGE_0 = 0, + DIG_EXT_PORT_STAGE_1 = 1, + DIG_EXT_PORT_STAGE_2 = 2, + DIG_EXT_PORT_STAGE_3 = 3, + DIG_EXT_PORT_STAGE_MAX = 4, +}DM_DIG_EXT_PORT_ALG_E; + + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + + +typedef enum _BT_Ant_NUM{ + Ant_x2 = 0, + Ant_x1 = 1 +} BT_Ant_NUM, *PBT_Ant_NUM; + +typedef enum _BT_CoType{ + BT_2Wire = 0, + BT_ISSC_3Wire = 1, + BT_Accel = 2, + BT_CSR_BC4 = 3, + BT_CSR_BC8 = 4, + BT_RTL8756 = 5, +} BT_CoType, *PBT_CoType; + +typedef enum _BT_CurState{ + BT_OFF = 0, + BT_ON = 1, +} BT_CurState, *PBT_CurState; + +typedef enum _BT_ServiceType{ + BT_SCO = 0, + BT_A2DP = 1, + BT_HID = 2, + BT_HID_Idle = 3, + BT_Scan = 4, + BT_Idle = 5, + BT_OtherAction = 6, + BT_Busy = 7, + BT_OtherBusy = 8, + BT_PAN = 9, +} BT_ServiceType, *PBT_ServiceType; + +typedef enum _BT_RadioShared{ + BT_Radio_Shared = 0, + BT_Radio_Individual = 1, +} BT_RadioShared, *PBT_RadioShared; + +struct btcoexist_priv { + u8 BT_Coexist; + u8 BT_Ant_Num; + u8 BT_CoexistType; + u8 BT_State; + u8 BT_CUR_State; //0:on, 1:off + u8 BT_Ant_isolation; //0:good, 1:bad + u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic + u8 BT_Service; + u8 BT_Ampdu; // 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. + u8 BT_RadioSharedType; + u32 Ratio_Tx; + u32 Ratio_PRI; + u8 BtRfRegOrigin1E; + u8 BtRfRegOrigin1F; + u8 BtRssiState; + u32 BtEdcaUL; + u32 BtEdcaDL; + u32 BT_EDCA[2]; + u8 bCOBT; + + u8 bInitSet; + u8 bBTBusyTraffic; + u8 bBTTrafficModeSet; + u8 bBTNonTrafficModeSet; + //BTTraffic BT21TrafficStatistics; + u32 CurrentState; + u32 PreviousState; + u8 BtPreRssiState; + u8 bFWCoexistAllOff; + u8 bSWCoexistAllOff; +}; + +#define BW_AUTO_SWITCH_HIGH_LOW 25 +#define BW_AUTO_SWITCH_LOW_HIGH 30 + +#define DM_DIG_THRESH_HIGH 40 +#define DM_DIG_THRESH_LOW 35 + +#define DM_FALSEALARM_THRESH_LOW 400 +#define DM_FALSEALARM_THRESH_HIGH 1000 + +#define DM_DIG_MAX 0x3e +#define DM_DIG_MIN 0x1e //0x22//0x1c + +#define DM_DIG_FA_UPPER 0x32 +#define DM_DIG_FA_LOWER 0x20 +#define DM_DIG_FA_TH0 0x20 +#define DM_DIG_FA_TH1 0x100 +#define DM_DIG_FA_TH2 0x200 + +#define DM_DIG_BACKOFF_MAX 12 +#define DM_DIG_BACKOFF_MIN (-4) +#define DM_DIG_BACKOFF_DEFAULT 10 + +#define RxPathSelection_SS_TH_low 30 +#define RxPathSelection_diff_TH 18 + +#define DM_RATR_STA_INIT 0 +#define DM_RATR_STA_HIGH 1 +#define DM_RATR_STA_MIDDLE 2 +#define DM_RATR_STA_LOW 3 + +#define CTSToSelfTHVal 30 +#define RegC38_TH 20 + +#define WAIotTHVal 25 + +//Dynamic Tx Power Control Threshold +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 + +#define TxHighPwrLevel_Normal 0 +#define TxHighPwrLevel_Level1 1 +#define TxHighPwrLevel_Level2 2 +#define TxHighPwrLevel_BT1 3 +#define TxHighPwrLevel_BT2 4 + +#define DM_Type_ByFW 0 +#define DM_Type_ByDriver 1 + + +typedef struct _RATE_ADAPTIVE +{ + u8 RateAdaptiveDisabled; + u8 RATRState; + u16 reserve; + + u32 HighRSSIThreshForRA; + u32 High2LowRSSIThreshForRA; + u8 Low2HighRSSIThreshForRA40M; + u32 LowRSSIThreshForRA40M; + u8 Low2HighRSSIThreshForRA20M; + u32 LowRSSIThreshForRA20M; + u32 UpperRSSIThresholdRATR; + u32 MiddleRSSIThresholdRATR; + u32 LowRSSIThresholdRATR; + u32 LowRSSIThresholdRATR40M; + u32 LowRSSIThresholdRATR20M; + u8 PingRSSIEnable; //cosa add for Netcore long range ping issue + u32 PingRSSIRATR; //cosa add for Netcore long range ping issue + u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue + u32 LastRATR; + u8 PreRATRState; + +} RATE_ADAPTIVE, *PRATE_ADAPTIVE; + +typedef enum tag_SW_Antenna_Switch_Definition +{ + Antenna_B = 1, + Antenna_A = 2, + Antenna_MAX = 3, +}DM_SWAS_E; + +#ifdef CONFIG_ANTENNA_DIVERSITY +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + +typedef struct _SW_Antenna_Switch_ +{ + u8 try_flag; + s32 PreRSSI; + u8 CurAntenna; + u8 PreAntenna; + u8 RSSI_Trying; + u8 TestMode; + u8 bTriggerAntennaSwitch; + u8 SelectAntennaMap; + // Before link Antenna Switch check + u8 SWAS_NoLink_State; + +}SWAT_T; + + +#endif + + +struct dm_priv +{ + u8 DM_Type; + u8 DMFlag, DMFlag_tmp; + + + //for DIG + u8 bDMInitialGainEnable; + u8 binitialized; // for dm_initial_gain_Multi_STA use. + DIG_T DM_DigTable; + + PS_T DM_PSTable; + + FALSE_ALARM_STATISTICS FalseAlmCnt; + + //for rate adaptive, in fact, 88c/92c fw will handle this + u8 bUseRAMask; + RATE_ADAPTIVE RateAdaptive; + + //* Upper and Lower Signal threshold for Rate Adaptive*/ + int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedCCK; + int EntryMinUndecoratedSmoothedPWDB; + int EntryMaxUndecoratedSmoothedPWDB; + + + //for High Power + u8 bDynamicTxPowerEnable; + u8 LastDTPLvl; + u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 + + //for tx power tracking + //u8 bTXPowerTracking; + u8 TXPowercount; + u8 bTXPowerTrackingInit; + u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default + u8 TM_Trigger; + + u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 + u8 ThermalValue; + u8 ThermalValue_LCK; + u8 ThermalValue_IQK; + u8 ThermalValue_DPK; + + u8 bRfPiEnable; + + //for APK + u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a + u8 bAPKdone; + u8 bAPKThermalMeterIgnore; + u8 bDPdone; + u8 bDPPathAOK; + u8 bDPPathBOK; + + //for IQK + u32 RegC04; + u32 Reg874; + u32 RegC08; + u32 RegB68; + u32 RegB6C; + u32 Reg870; + u32 Reg860; + u32 Reg864; + u32 ADDA_backup[IQK_ADDA_REG_NUM]; + u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; + u32 IQK_BB_backup_recover[9]; + u32 IQK_BB_backup[IQK_BB_REG_NUM]; + u8 PowerIndex_backup[6]; + + u8 bCCKinCH14; + + char CCK_index; + char OFDM_index[2]; + + BOOLEAN bDoneTxpower; + char CCK_index_HP; + char OFDM_index_HP[2]; + u8 ThermalValue_HP[HP_THERMAL_NUM]; + u8 ThermalValue_HP_index; + + //for TxPwrTracking + int RegE94; + int RegE9C; + int RegEB4; + int RegEBC; + + u32 TXPowerTrackingCallbackCnt; //cosa add for debug + + u32 prv_traffic_idx; // edca turbo + + // for dm_RF_Saving + u8 initialize; + u32 rf_saving_Reg874; + u32 rf_saving_RegC70; + u32 rf_saving_Reg85C; + u32 rf_saving_RegA74; + + //for Antenna diversity +#ifdef CONFIG_ANTENNA_DIVERSITY + SWAT_T DM_SWAT_Table; +#endif +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + _timer SwAntennaSwitchTimer; + + u64 lastTxOkCnt; + u64 lastRxOkCnt; + u64 TXByteCnt_A; + u64 TXByteCnt_B; + u64 RXByteCnt_A; + u64 RXByteCnt_B; + u8 DoubleComfirm; + u8 TrafficLoad; +#endif + + s32 OFDM_Pkt_Cnt; + u8 RSSI_Select; + u8 DIG_Dynamic_MIN ; + + // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas + u8 INIDATA_RATE[32]; +}; + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ +//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} + + +//============================================================ +// function prototype +//============================================================ +void rtl8192c_init_dm_priv(IN PADAPTER Adapter); +void rtl8192c_deinit_dm_priv(IN PADAPTER Adapter); +void rtl8192c_InitHalDm(IN PADAPTER Adapter); +void rtl8192c_HalDmWatchDog(IN PADAPTER Adapter); + +VOID rtl8192c_dm_CheckTXPowerTracking(IN PADAPTER Adapter); + +void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal); + +#ifdef CONFIG_BT_COEXIST +void rtl8192c_set_dm_bt_coexist(_adapter *padapter, u8 bStart); +void rtl8192c_issue_delete_ba(_adapter *padapter, u8 dir); +#endif + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY +void SwAntDivRSSICheck8192C(_adapter *padapter ,u32 RxPWDBAll); +void SwAntDivRestAfterLink8192C(IN PADAPTER Adapter); +#endif +#ifdef CONFIG_ANTENNA_DIVERSITY +void SwAntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); +u8 SwAntDivBeforeLink8192C(IN PADAPTER Adapter); +#endif + +#endif //__HAL8190PCIDM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h new file mode 100755 index 000000000000..a43f99f2d2a9 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_event.h @@ -0,0 +1,29 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_EVENT_H_ +#define _RTL8192C_EVENT_H_ + + + + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h new file mode 100755 index 000000000000..4c9a7fe830c8 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_hal.h @@ -0,0 +1,912 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_HAL_H__ +#define __RTL8192C_HAL_H__ + +#include "rtl8192c_spec.h" +#include "Hal8192CPhyReg.h" +#include "Hal8192CPhyCfg.h" +#include "rtl8192c_rf.h" +#include "rtl8192c_dm.h" +#include "rtl8192c_recv.h" +#include "rtl8192c_xmit.h" +#include "rtl8192c_cmd.h" +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +#include "rtl8192c_sreset.h" +#endif + +#ifdef CONFIG_PCI_HCI + + #include "Hal8192CEHWImg.h" + + #define RTL819X_DEFAULT_RF_TYPE RF_2T2R + //#define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //2TODO: The following need to check!! + #define RTL8192C_FW_TSMC_IMG "rtl8192CE\\rtl8192cfwT.bin" + #define RTL8192C_FW_UMC_IMG "rtl8192CE\\rtl8192cfwU.bin" + #define RTL8192C_FW_UMC_B_IMG "rtl8192CE\\rtl8192cfwU_B.bin" + + #define RTL8188C_PHY_REG "rtl8192CE\\PHY_REG_1T.txt" + #define RTL8188C_PHY_RADIO_A "rtl8192CE\\radio_a_1T.txt" + #define RTL8188C_PHY_RADIO_B "rtl8192CE\\radio_b_1T.txt" + #define RTL8188C_AGC_TAB "rtl8192CE\\AGC_TAB_1T.txt" + #define RTL8188C_PHY_MACREG "rtl8192CE\\MACREG_1T.txt" + + #define RTL8192C_PHY_REG "rtl8192CE\\PHY_REG_2T.txt" + #define RTL8192C_PHY_RADIO_A "rtl8192CE\\radio_a_2T.txt" + #define RTL8192C_PHY_RADIO_B "rtl8192CE\\radio_b_2T.txt" + #define RTL8192C_AGC_TAB "rtl8192CE\\AGC_TAB_2T.txt" + #define RTL8192C_PHY_MACREG "rtl8192CE\\MACREG_2T.txt" + + #define RTL819X_PHY_MACPHY_REG "rtl8192CE\\MACPHY_reg.txt" + #define RTL819X_PHY_MACPHY_REG_PG "rtl8192CE\\MACPHY_reg_PG.txt" + #define RTL819X_PHY_MACREG "rtl8192CE\\MAC_REG.txt" + #define RTL819X_PHY_REG "rtl8192CE\\PHY_REG.txt" + #define RTL819X_PHY_REG_1T2R "rtl8192CE\\PHY_REG_1T2R.txt" + #define RTL819X_PHY_REG_to1T1R "rtl8192CE\\phy_to1T1R_a.txt" + #define RTL819X_PHY_REG_to1T2R "rtl8192CE\\phy_to1T2R.txt" + #define RTL819X_PHY_REG_to2T2R "rtl8192CE\\phy_to2T2R.txt" + #define RTL819X_PHY_REG_PG "rtl8192CE\\PHY_REG_PG.txt" + #define RTL819X_AGC_TAB "rtl8192CE\\AGC_TAB.txt" + #define RTL819X_PHY_RADIO_A "rtl8192CE\\radio_a.txt" + #define RTL819X_PHY_RADIO_A_1T "rtl8192CE\\radio_a_1t.txt" + #define RTL819X_PHY_RADIO_A_2T "rtl8192CE\\radio_a_2t.txt" + #define RTL819X_PHY_RADIO_B "rtl8192CE\\radio_b.txt" + #define RTL819X_PHY_RADIO_B_GM "rtl8192CE\\radio_b_gm.txt" + #define RTL819X_PHY_RADIO_C "rtl8192CE\\radio_c.txt" + #define RTL819X_PHY_RADIO_D "rtl8192CE\\radio_d.txt" + #define RTL819X_EEPROM_MAP "rtl8192CE\\8192ce.map" + #define RTL819X_EFUSE_MAP "rtl8192CE\\8192ce.map" + +//--------------------------------------------------------------------- +// RTL8723E From file +//--------------------------------------------------------------------- + #define RTL8723_FW_UMC_IMG "rtl8723E\\rtl8723fw.bin" + #define RTL8723_PHY_REG "rtl8723E\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723E\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723E\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723E\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt" + #define RTL8723_PHY_MACREG "rtl8723E\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723E\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723E\\PHY_REG_MP.txt" + + // The file name "_2T" is for 92CE, "_1T" is for 88CE. Modified by tynli. 2009.11.24. + #define Rtl819XFwTSMCImageArray Rtl8192CEFwTSMCImgArray + #define Rtl819XFwUMCACutImageArray Rtl8192CEFwUMCACutImgArray + #define Rtl819XFwUMCBCutImageArray Rtl8192CEFwUMCBCutImgArray + + #define Rtl8723FwUMCImageArray Rtl8192CEFwUMC8723ImgArray + #define Rtl819XMAC_Array Rtl8192CEMAC_2T_Array + #define Rtl819XAGCTAB_2TArray Rtl8192CEAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192CEAGCTAB_1TArray + #define Rtl819XPHY_REG_2TArray Rtl8192CEPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192CEPHY_REG_1TArray + #define Rtl819XRadioA_2TArray Rtl8192CERadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192CERadioA_1TArray + #define Rtl819XRadioB_2TArray Rtl8192CERadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192CERadioB_1TArray + #define Rtl819XPHY_REG_Array_PG Rtl8192CEPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_MP Rtl8192CEPHY_REG_Array_MP + +#elif defined(CONFIG_USB_HCI) + + #include "Hal8192CUHWImg.h" + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //TODO: The following need to check!! + #define RTL8192C_FW_TSMC_IMG "rtl8192CU\\rtl8192cfwT.bin" + #define RTL8192C_FW_UMC_IMG "rtl8192CU\\rtl8192cfwU.bin" + #define RTL8192C_FW_UMC_B_IMG "rtl8192CU\\rtl8192cfwU_B.bin" + + //#define RTL819X_FW_BOOT_IMG "rtl8192CU\\boot.img" + //#define RTL819X_FW_MAIN_IMG "rtl8192CU\\main.img" + //#define RTL819X_FW_DATA_IMG "rtl8192CU\\data.img" + + #define RTL8188C_PHY_REG "rtl8188CU\\PHY_REG.txt" + #define RTL8188C_PHY_RADIO_A "rtl8188CU\\radio_a.txt" + #define RTL8188C_PHY_RADIO_B "rtl8188CU\\radio_b.txt" + #define RTL8188C_PHY_RADIO_A_mCard "rtl8192CU\\radio_a_1T_mCard.txt" + #define RTL8188C_PHY_RADIO_B_mCard "rtl8192CU\\radio_b_1T_mCard.txt" + #define RTL8188C_PHY_RADIO_A_HP "rtl8192CU\\radio_a_1T_HP.txt" + #define RTL8188C_AGC_TAB "rtl8188CU\\AGC_TAB.txt" + #define RTL8188C_PHY_MACREG "rtl8188CU\\MACREG.txt" + + #define RTL8192C_PHY_REG "rtl8192CU\\PHY_REG.txt" + #define RTL8192C_PHY_RADIO_A "rtl8192CU\\radio_a.txt" + #define RTL8192C_PHY_RADIO_B "rtl8192CU\\radio_b.txt" + #define RTL8192C_AGC_TAB "rtl8192CU\\AGC_TAB.txt" + #define RTL8192C_PHY_MACREG "rtl8192CU\\MACREG.txt" + + #define RTL819X_PHY_REG_PG "rtl8192CU\\PHY_REG_PG.txt" + +//--------------------------------------------------------------------- +// RTL8723U From file +//--------------------------------------------------------------------- + #define RTL8723_FW_UMC_IMG "rtl8723U\\rtl8723fw.bin" + #define RTL8723_PHY_REG "rtl8723U\\PHY_REG_1T.txt" + #define RTL8723_PHY_RADIO_A "rtl8723U\\radio_a_1T.txt" + #define RTL8723_PHY_RADIO_B "rtl8723U\\radio_b_1T.txt" + #define RTL8723_AGC_TAB "rtl8723U\\AGC_TAB_1T.txt" + #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt" + #define RTL8723_PHY_MACREG "rtl8723U\\MAC_REG.txt" + #define RTL8723_PHY_REG_PG "rtl8723U\\PHY_REG_PG.txt" + #define RTL8723_PHY_REG_MP "rtl8723U\\PHY_REG_MP.txt" + + // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24. + #define Rtl819XFwImageArray Rtl8192CUFwTSMCImgArray + #define Rtl819XFwTSMCImageArray Rtl8192CUFwTSMCImgArray + #define Rtl819XFwUMCACutImageArray Rtl8192CUFwUMCACutImgArray + #define Rtl819XFwUMCBCutImageArray Rtl8192CUFwUMCBCutImgArray + + #define Rtl819XMAC_Array Rtl8192CUMAC_2T_Array + #define Rtl819XAGCTAB_2TArray Rtl8192CUAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192CUAGCTAB_1TArray + #define Rtl819XAGCTAB_1T_HPArray Rtl8192CUAGCTAB_1T_HPArray + #define Rtl819XPHY_REG_2TArray Rtl8192CUPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192CUPHY_REG_1TArray + #define Rtl819XPHY_REG_1T_mCardArray Rtl8192CUPHY_REG_1T_mCardArray + #define Rtl819XPHY_REG_2T_mCardArray Rtl8192CUPHY_REG_2T_mCardArray + #define Rtl819XPHY_REG_1T_HPArray Rtl8192CUPHY_REG_1T_HPArray + #define Rtl819XRadioA_2TArray Rtl8192CURadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192CURadioA_1TArray + #define Rtl819XRadioA_1T_mCardArray Rtl8192CURadioA_1T_mCardArray + #define Rtl819XRadioB_2TArray Rtl8192CURadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192CURadioB_1TArray + #define Rtl819XRadioB_1T_mCardArray Rtl8192CURadioB_1T_mCardArray + #define Rtl819XRadioA_1T_HPArray Rtl8192CURadioA_1T_HPArray + #define Rtl819XPHY_REG_Array_PG Rtl8192CUPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_PG_mCard Rtl8192CUPHY_REG_Array_PG_mCard + #define Rtl819XPHY_REG_Array_PG_HP Rtl8192CUPHY_REG_Array_PG_HP + #define Rtl819XPHY_REG_Array_MP Rtl8192CUPHY_REG_Array_MP +#endif + +#define DRVINFO_SZ 4 // unit is 8bytes +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) + +#define FW_8192C_SIZE 16384+32//16k +#define FW_8192C_START_ADDRESS 0x1000 +//#define FW_8192C_END_ADDRESS 0x3FFF //Filen said this is for test chip +#define FW_8192C_END_ADDRESS 0x1FFF + +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes + +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300) + +typedef enum _FIRMWARE_SOURCE{ + FW_SOURCE_IMG_FILE = 0, + FW_SOURCE_HEADER_FILE = 1, //from header file +}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; + +typedef struct _RT_FIRMWARE{ + FIRMWARE_SOURCE eFWSource; + #ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; + #else + u8 szFwBuffer[FW_8192C_SIZE]; + #endif + u32 ulFwLength; +}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92C, *PRT_FIRMWARE_92C; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8192C_FIRMWARE_HDR {//8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u16 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; + +}RT_8192C_FIRMWARE_HDR, *PRT_8192C_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME 0x05 +#define BCN_DMA_ATIME_INT_TIME 0x02 + +#ifdef CONFIG_USB_RX_AGGREGATION + +typedef enum _USB_RX_AGG_MODE{ + USB_RX_AGG_DISABLE, + USB_RX_AGG_DMA, + USB_RX_AGG_USB, + USB_RX_AGG_MIX +}USB_RX_AGG_MODE; + +#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer + +#endif + + +#define TX_SELE_HQ BIT(0) // High Queue +#define TX_SELE_LQ BIT(1) // Low Queue +#define TX_SELE_NQ BIT(2) // Normal Queue + + +// Note: We will divide number of page equally for each queue other than public queue! + +#define TX_TOTAL_PAGE_NUMBER 0xF8 +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define NORMAL_PAGE_NUM_PUBQ 0xE7 +#define NORMAL_PAGE_NUM_HPQ 0x0C +#define NORMAL_PAGE_NUM_LPQ 0x02 +#define NORMAL_PAGE_NUM_NPQ 0x02 + + +// For Test Chip Setting +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define TEST_PAGE_NUM_PUBQ 0x7E + + +// For Test Chip Setting +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 +#define WMM_TEST_PAGE_NUM_HPQ 0x29 +#define WMM_TEST_PAGE_NUM_LPQ 0x29 + + +//Note: For Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 +#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) +#define CHIP_BONDING_92C_1T2R 0x1 +#define CHIP_BONDING_88C_USB_MCARD 0x2 +#define CHIP_BONDING_88C_USB_HP 0x1 + +// +// 2011.01.06. Define new structure of chip version for RTL8723 and so on. Added by tynli. +// +/* + | BIT15:12 | BIT11:8 | BIT 7 | BIT6:4 | BIT3 | BIT2:0 | + |-------------+-----------+-----------+-------+-----------+-------| + | IC version(CUT) | ROM version | Manufacturer | RF type | Chip type | IC Type | + | | | TSMC/UMC | | TEST/NORMAL| | +*/ +// [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3 +// [7] Manufacturer: TSMC=0, UMC=1 +// [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2 +// [3] Chip type: TEST=0, NORMAL=1 +// [2:0] IC type: 81xxC=0, 8723=1, 92D=2 + +#define CHIP_8723 BIT(0) +#define CHIP_92D BIT(1) +#define NORMAL_CHIP BIT(3) +#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6))) +#define RF_TYPE_1T2R BIT(4) +#define RF_TYPE_2T2R BIT(5) +#define CHIP_VENDOR_UMC BIT(7) +#define B_CUT_VERSION BIT(12) +#define C_CUT_VERSION BIT(13) +#define D_CUT_VERSION ((BIT(13)|BIT(14))) + + +// MASK +#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2)) +#define CHIP_TYPE_MASK BIT(3) +#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6)) +#define MANUFACTUER_MASK BIT(7) +#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8)) +#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12)) + +// Get element +#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK) +#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK) +#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK) +#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK) +#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK) +#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK) + +#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0)? _TRUE : _FALSE) +#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723)? _TRUE : _FALSE) +#define IS_92D(version) ((GET_CVID_IC_TYPE(version) == CHIP_92D)? _TRUE : _FALSE) +#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version))? _FALSE : _TRUE) +#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? _TRUE : _FALSE) +#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? _TRUE : _FALSE) +#define IS_NORMAL_CHIP(version) ((GET_CVID_CHIP_TYPE(version))? _TRUE: _FALSE) +#define IS_CHIP_VENDOR_UMC(version) ((GET_CVID_MANUFACTUER(version))? _TRUE: _FALSE) + +#define IS_81XXC_TEST_CHIP(version) ((IS_81XXC(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE) +#define IS_92D_TEST_CHIP(version) ((IS_92D(version) && (!IS_NORMAL_CHIP(version)))? _TRUE: _FALSE) +#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ? _TRUE : _FALSE) +#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE) +#define IS_VENDOR_8723_A_CUT(version) ((IS_8723_SERIES(version)) ? ((GET_CVID_CUT_VERSION(version)) ? _FALSE : _TRUE) : _FALSE) +// 88/92C UMC B-cut vendor is set to TSMC so we need to check CHIP_VENDOR_UMC bit is not 1. +#define IS_81xxC_VENDOR_UMC_B_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? _TRUE : _FALSE):_FALSE) +#define IS_92D_SINGLEPHY(version) ((IS_92D(version)) ? (IS_2T2R(version) ? _TRUE: _FALSE) : _FALSE) +#define IS_92D_C_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x2) ? _TRUE : _FALSE) : _FALSE) +#define IS_92D_D_CUT(version) ((IS_92D(version)) ? ((GET_CVID_CUT_VERSION(version) == 0x3) ? _TRUE : _FALSE) : _FALSE) + +typedef enum _VERSION_8192C{ + VERSION_TEST_CHIP_88C = 0x0000, + VERSION_TEST_CHIP_92C = 0x0020, + VERSION_TEST_UMC_CHIP_8723 = 0x0081, + VERSION_NORMAL_TSMC_CHIP_88C = 0x0008, + VERSION_NORMAL_TSMC_CHIP_92C = 0x0028, + VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x0018, + VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x0088, + VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x00a8, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x0098, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x0089, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x1089, + VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x1088, + VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x10a8, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x1090, + VERSION_TEST_CHIP_92D_SINGLEPHY= 0x0022, + VERSION_TEST_CHIP_92D_DUALPHY = 0x0002, + VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x002a, + VERSION_NORMAL_CHIP_92D_DUALPHY = 0x000a, + VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x202a, + VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x200a, + VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0x302a, + VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x300a, +}VERSION_8192C,*PVERSION_8192C; + + + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- +enum ChannelPlan{ + CHPL_FCC = 0, + CHPL_IC = 1, + CHPL_ETSI = 2, + CHPL_SPAIN = 3, + CHPL_FRANCE = 4, + CHPL_MKK = 5, + CHPL_MKK1 = 6, + CHPL_ISRAEL = 7, + CHPL_TELEC = 8, + CHPL_GLOBAL = 9, + CHPL_WORLD = 10, +}; + +typedef struct _TxPowerInfo{ + u8 CCKIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_1SIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_2SIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20IndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 OFDMIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 TSSI_A; + u8 TSSI_B; +}TxPowerInfo, *PTxPowerInfo; + +#define EFUSE_REAL_CONTENT_LEN 512 +#define EFUSE_MAP_LEN 128 +#define EFUSE_MAX_SECTION 16 +#define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. +#define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN) +// +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 1byte|----8bytes----|1byte|--5bytes--| +// | | Reserved(14bytes) | +// +#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte. + + +#define EFUSE_MAP_LEN_8723 256 +#define EFUSE_MAX_SECTION_8723 32 + +//======================================================== +// EFUSE for BT definition +//======================================================== +#define EFUSE_BT_REAL_CONTENT_LEN 1536 // 512*3 +#define EFUSE_BT_MAP_LEN 1024 // 1k bytes +#define EFUSE_BT_MAX_SECTION 128 // 1024/8 + +#define EFUSE_PROTECT_BYTES_BANK 16 + +// +// For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. +// +typedef enum _RT_MULTI_FUNC{ + RT_MULTI_FUNC_NONE = 0x00, + RT_MULTI_FUNC_WIFI = 0x01, + RT_MULTI_FUNC_BT = 0x02, + RT_MULTI_FUNC_GPS = 0x04, +}RT_MULTI_FUNC,*PRT_MULTI_FUNC; + +// +// For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. +// +typedef enum _RT_POLARITY_CTL{ + RT_POLARITY_LOW_ACT = 0, + RT_POLARITY_HIGH_ACT = 1, +}RT_POLARITY_CTL,*PRT_POLARITY_CTL; + +// For RTL8723 regulator mode. by tynli. 2011.01.14. +typedef enum _RT_REGULATOR_MODE{ + RT_SWITCHING_REGULATOR = 0, + RT_LDO_REGULATOR = 1, +}RT_REGULATOR_MODE,*PRT_REGULATOR_MODE; + +#ifdef CONFIG_PCI_HCI +struct hal_data_8192ce +{ + VERSION_8192C VersionID; + RT_MULTI_FUNC MultiFunc; // For multi-function consideration. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + u32 IntrMask[2]; + u32 IntrMaskToSet[2]; + + u32 DisabledFunctions; + + //current WIFI_PHY values + u32 ReceiveConfig; + u32 TransmitConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + + u16 BasicRateSet; + + //rf_ctrl + _lock rf_lock; + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + INTERFACE_SELECT_8192CPCIe InterfaceSel; + + // + // EEPROM setting. + // + u16 EEPROMVID; + u16 EEPROMDID; + u16 EEPROMSVID; + u16 EEPROMSMID; + u16 EEPROMChannelPlan; + u16 EEPROMVersion; + + u8 EEPROMChnlAreaTxPwrCCK[2][3]; + u8 EEPROMChnlAreaTxPwrHT40_1S[2][3]; + u8 EEPROMChnlAreaTxPwrHT40_2SDiff[2][3]; + u8 EEPROMPwrLimitHT20[3]; + u8 EEPROMPwrLimitHT40[3]; + + u8 bTXPowerDataReadFromEEPORM; + u8 EEPROMThermalMeter; + u8 EEPROMTSSI[2]; + + u8 EEPROMCustomerID; + u8 EEPROMBoardType; + u8 EEPROMRegulatory; + + u8 bDefaultAntenna; + u8 bIQKInitialized; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[7][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + + //u32 LedControlNum; + //u32 LedControlMode; + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + //RDG enable + BOOLEAN bRDGEnable; + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + u8 CurAntenna; + u8 AntDivCfg; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //SW Antenna Switch + s32 RSSI_sum_A; + s32 RSSI_sum_B; + s32 RSSI_cnt_A; + s32 RSSI_cnt_B; + BOOLEAN RSSI_test; +#endif +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + u32 CCK_Ant1_Cnt; + u32 CCK_Ant2_Cnt; + u32 OFDM_Ant1_Cnt; + u32 OFDM_Ant2_Cnt; +#endif + + struct dm_priv dmpriv; + u8 bDumpRxPkt;//for debug +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + struct sreset_priv srestpriv; +#endif + u8 bInterruptMigration; + u8 bDisableTxInt; + u8 bGpioHwWpsPbc; + + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + u16 EfuseUsedBytes; + +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192ce HAL_DATA_TYPE, *PHAL_DATA_TYPE; + +// +// Function disabled. +// +#define DF_TX_BIT BIT0 +#define DF_RX_BIT BIT1 +#define DF_IO_BIT BIT2 +#define DF_IO_D3_BIT BIT3 + +#define RT_DF_TYPE u32 +#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits))) +#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits)))) +#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) +#define IS_MULTI_FUNC_CHIP(_Adapter) (((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE) + +void InterruptRecognized8192CE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); +VOID UpdateInterruptMask8192CE(PADAPTER Adapter, u32 AddMSR, u32 RemoveMSR); +#endif + +#ifdef CONFIG_USB_HCI +struct hal_data_8192cu +{ + VERSION_8192C VersionID; + RT_MULTI_FUNC MultiFunc; // For multi-function consideration. + RT_POLARITY_CTL PolarityCtl; // For Wifi PDn Polarity control. + RT_REGULATOR_MODE RegulatorMode; // switching regulator or LDO + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + //current WIFI_PHY values + u32 ReceiveConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + + u16 BasicRateSet; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + u8 BoardType; + //INTERFACE_SELECT_8192CUSB InterfaceSel; + + // + // EEPROM setting. + // + u16 EEPROMVID; + u16 EEPROMPID; + u16 EEPROMSVID; + u16 EEPROMSDID; + u8 EEPROMCustomerID; + u8 EEPROMSubCustomerID; + u8 EEPROMVersion; + u8 EEPROMRegulatory; + + u8 bTXPowerDataReadFromEEPORM; + u8 EEPROMThermalMeter; + + u8 bIQKInitialized; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[7][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + + u8 bLedOpenDrain; // Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + //RDG enable + BOOLEAN bRDGEnable; + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + + struct dm_priv dmpriv; +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + struct sreset_priv srestpriv; +#endif + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + u8 CurAntenna; + u8 AntDivCfg; + +#ifdef CONFIG_SW_ANTENNA_DIVERSITY + //SW Antenna Switch + s32 RSSI_sum_A; + s32 RSSI_sum_B; + s32 RSSI_cnt_A; + s32 RSSI_cnt_B; + BOOLEAN RSSI_test; +#endif +#ifdef CONFIG_HW_ANTENNA_DIVERSITY + //Hybrid Antenna Diversity + u32 CCK_Ant1_Cnt; + u32 CCK_Ant2_Cnt; + u32 OFDM_Ant1_Cnt; + u32 OFDM_Ant2_Cnt; +#endif + + u8 bDumpRxPkt;//for debug + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + // 2010/08/09 MH Add CU power down mode. + BOOLEAN pwrdown; + + // For 92C USB endpoint setting + // + + u32 UsbBulkOutSize; + + int RtBulkOutPipe[3]; + int RtBulkInPipe; + int RtIntInPipe; + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u8 OutEpQueueSel; + u8 OutEpNumber; + + u8 Queue2EPNum[8];//for out endpoint number mapping + +#ifdef CONFIG_USB_TX_AGGREGATION + u8 UsbTxAggMode; + u8 UsbTxAggDescNum; +#endif +#ifdef CONFIG_USB_RX_AGGREGATION + u16 HwRxPageSize; // Hardware setting + u32 MaxUsbRxAggBlock; + + USB_RX_AGG_MODE UsbRxAggMode; + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed + u8 UsbRxAggBlockTimeout; + u8 UsbRxAggPageCount; // 8192C DMA page count + u8 UsbRxAggPageTimeout; +#endif + + // 2010/12/10 MH Add for USB aggreation mode dynamic shceme. + BOOLEAN UsbRxHighSpeedMode; + + // 2010/11/22 MH Add for slim combo debug mode selective. + // This is used for fix the drawback of CU TSMC-A/UMC-A cut. HW auto suspend ability. Close BT clock. + BOOLEAN SlimComboDbg; + + u16 EfuseUsedBytes; + +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192cu HAL_DATA_TYPE, *PHAL_DATA_TYPE; +#endif + +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +#define INCLUDE_MULTI_FUNC_BT(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT) +#define INCLUDE_MULTI_FUNC_GPS(_Adapter) (GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS) + +VOID rtl8192c_FirmwareSelfReset(IN PADAPTER Adapter); +int FirmwareDownload92C(IN PADAPTER Adapter); +VOID InitializeFirmwareVars92C(PADAPTER Adapter); +u8 GetEEPROMSize8192C(PADAPTER Adapter); +RT_CHANNEL_DOMAIN _HalMapChannelPlan8192C(PADAPTER Adapter, u8 HalChannelPlan); +VERSION_8192C rtl8192c_ReadChipVersion(IN PADAPTER Adapter); +void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail); +void rtl8192c_HalSetBrateCfg(PADAPTER Adapter, u8 *mBratesOS, u16 *pBrateCfg); +//void rtl8192c_free_hal_data(_adapter * padapter); +VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo); +void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc); + +#endif + +#ifdef CONFIG_MP_INCLUDED + +extern void Hal_SetAntenna(PADAPTER pAdapter); +extern void Hal_SetBandwidth(PADAPTER pAdapter); + +extern void Hal_SetTxPower(PADAPTER pAdapter); +extern void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); +extern void Hal_SetSingleToneTx ( PADAPTER pAdapter , u8 bStart ); +extern void Hal_SetSingleCarrierTx (PADAPTER pAdapter, u8 bStart); +extern void Hal_SetContinuousTx (PADAPTER pAdapter, u8 bStart); + +extern void Hal_SetDataRate(PADAPTER pAdapter); +extern void Hal_SetChannel(PADAPTER pAdapter); +extern void Hal_SetAntennaPathPower(PADAPTER pAdapter); +extern s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther); +extern s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable); +extern void Hal_GetPowerTracking(PADAPTER padapter, u8 * enable); +extern void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value); +extern void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter); +extern void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14); +extern void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven); +extern void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 * TxPower); +extern void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 * TxPower); +extern void Hal_TriggerRFThermalMeter(PADAPTER pAdapter); +extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter); +extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart); +extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart); + +#endif + + + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h new file mode 100755 index 000000000000..4ddd9c855d58 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_led.h @@ -0,0 +1,43 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_LED_H_ +#define __RTL8192C_LED_H_ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8192cu_InitSwLeds(_adapter *padapter); +void rtl8192cu_DeInitSwLeds(_adapter *padapter); +#endif +#ifdef CONFIG_PCI_HCI +void rtl8192ce_gen_RefreshLedState(PADAPTER Adapter); +void rtl8192ce_InitSwLeds(_adapter *padapter); +void rtl8192ce_DeInitSwLeds(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h new file mode 100755 index 000000000000..70a6d104dd05 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_recv.h @@ -0,0 +1,180 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_RECV_H_ +#define _RTL8192C_RECV_H_ + +#include +#include +#include + + +#ifdef PLATFORM_OS_XP + #define NR_RECVBUFF (16) +#elif defined(PLATFORM_OS_CE) + #define NR_RECVBUFF (4) +#else + + #define NR_RECVBUFF (4) + + #define NR_PREALLOC_RECV_SKB (8) +#endif + + +#define RECV_BLK_SZ 512 +#define RECV_BLK_CNT 16 +#define RECV_BLK_TH RECV_BLK_CNT + +#if defined(CONFIG_USB_HCI) + +#ifdef PLATFORM_OS_CE +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k +#else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + //#define MAX_RECVBUF_SZ (32768) // 32k + //#define MAX_RECVBUF_SZ (16384) //16K + //#define MAX_RECVBUF_SZ (10240) //10K + #define MAX_RECVBUF_SZ (15360) // 15k < 16k + //#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k + #else + #define MAX_RECVBUF_SZ (4000) // about 4K + #endif +#endif + +#elif defined(CONFIG_PCI_HCI) +#ifndef CONFIG_MINIMAL_MEMORY_USAGE + #define MAX_RECVBUF_SZ (9100) +#else + #define MAX_RECVBUF_SZ (4000) // about 4K +#endif + +#define RX_MPDU_QUEUE 0 +#define RX_CMD_QUEUE 1 +#define RX_MAX_QUEUE 2 +#endif + + +#define RECV_BULK_IN_ADDR 0x80 +#define RECV_INT_IN_ADDR 0x81 + +#define PHY_RSSI_SLID_WIN_MAX 100 +#define PHY_LINKQUALITY_SLID_WIN_MAX 20 + + +struct phy_stat +{ + unsigned int phydw0; + + unsigned int phydw1; + + unsigned int phydw2; + + unsigned int phydw3; + + unsigned int phydw4; + + unsigned int phydw5; + + unsigned int phydw6; + + unsigned int phydw7; +}; + +typedef struct _Phy_OFDM_Rx_Status_Report_8192cd +{ + unsigned char trsw_gain_X[4]; + unsigned char pwdb_all; + unsigned char cfosho_X[4]; + unsigned char cfotail_X[4]; + unsigned char rxevm_X[2]; + unsigned char rxsnr_X[4]; + unsigned char pdsnr_X[2]; + unsigned char csi_current_X[2]; + unsigned char csi_target_X[2]; + unsigned char sigevm; + unsigned char max_ex_pwr; +//#ifdef RTL8192SE +#ifdef CONFIG_LITTLE_ENDIAN + unsigned char ex_intf_flg:1; + unsigned char sgi_en:1; + unsigned char rxsc:2; + //unsigned char rsvd:4; + unsigned char idle_long:1; + unsigned char r_ant_train_en:1; + unsigned char ANTSELB:1; + unsigned char ANTSEL:1; +#else // _BIG_ENDIAN_ + //unsigned char rsvd:4; + unsigned char ANTSEL:1; + unsigned char ANTSELB:1; + unsigned char r_ant_train_en:1; + unsigned char idle_long:1; + unsigned char rxsc:2; + unsigned char sgi_en:1; + unsigned char ex_intf_flg:1; +#endif +//#else // RTL8190, RTL8192E +// unsigned char sgi_en; +// unsigned char rxsc_sgien_exflg; +//#endif +} __attribute__ ((packed))PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD; + +typedef struct _Phy_CCK_Rx_Status_Report_8192cd +{ + /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend + 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */ + u8 adc_pwdb_X[4]; + u8 SQ_rpt; + u8 cck_agc_rpt; +} PHY_STS_CCK_8192CD_T; + + +// Rx smooth factor +#define Rx_Smooth_Factor (20) + + +#ifdef CONFIG_USB_HCI +typedef struct _INTERRUPT_MSG_FORMAT_EX{ + unsigned int C2H_MSG0; + unsigned int C2H_MSG1; + unsigned int C2H_MSG2; + unsigned int C2H_MSG3; + unsigned int HISR; // from HISR Reg0x124, read to clear + unsigned int HISRE;// from HISRE Reg0x12c, read to clear + unsigned int MSG_EX; +}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX; + +void rtl8192cu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +int rtl8192cu_init_recv_priv(_adapter * padapter); +void rtl8192cu_free_recv_priv(_adapter * padapter); +void rtl8192cu_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +#ifdef CONFIG_PCI_HCI +int rtl8192ce_init_recv_priv(_adapter * padapter); +void rtl8192ce_free_recv_priv(_adapter * padapter); +void rtl8192ce_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +void rtl8192c_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat); +void rtl8192c_process_phy_info(_adapter *padapter, void *prframe); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h new file mode 100755 index 000000000000..76c8a7880ac7 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_rf.h @@ -0,0 +1,93 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192c_rf.h ( Header File) + * + * Note: Collect every HAL RF type exter API or constant. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * + * +******************************************************************************/ +#ifndef _RTL8192C_RF_H_ +#define _RTL8192C_RF_H_ +/* Check to see if the file has been included already. */ + + +/*--------------------------Define Parameters-------------------------------*/ + +// +// For RF 6052 Series +// +#define RF6052_MAX_TX_PWR 0x3F +#define RF6052_MAX_REG 0x3F +#define RF6052_MAX_PATH 2 +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ + +// +// RF RL6052 Series API +// +void rtl8192c_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate); +void rtl8192c_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth); +VOID rtl8192c_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel); +VOID rtl8192c_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel); +int PHY_RF6052_Config8192C( IN PADAPTER Adapter ); + +/*--------------------------Exported Function prototype---------------------*/ + + +#endif/* End of HalRf.h */ + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h new file mode 100755 index 000000000000..cabd8b8f7851 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_spec.h @@ -0,0 +1,1898 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192C_SPEC_H__ +#define __RTL8192C_SPEC_H__ + +#include + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + + +//============================================================ +// 8192C Regsiter offset definition +//============================================================ + + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_SYS_ISO_CTRL 0x0000 +#define REG_SYS_FUNC_EN 0x0002 +#define REG_APS_FSMCO 0x0004 +#define REG_SYS_CLKR 0x0008 +#define REG_9346CR 0x000A +#define REG_EE_VPD 0x000C +#define REG_AFE_MISC 0x0010 +#define REG_SPS0_CTRL 0x0011 +#define REG_SPS_OCP_CFG 0x0018 +#define REG_RSV_CTRL 0x001C +#define REG_RF_CTRL 0x001F +#define REG_LDOA15_CTRL 0x0020 +#define REG_LDOV12D_CTRL 0x0021 +#define REG_LDOHCI12_CTRL 0x0022 +#define REG_LPLDO_CTRL 0x0023 +#define REG_AFE_XTAL_CTRL 0x0024 +#define REG_AFE_PLL_CTRL 0x0028 +#define REG_EFUSE_CTRL 0x0030 +#define REG_EFUSE_TEST 0x0034 +#define REG_PWR_DATA 0x0038 +#define REG_CAL_TIMER 0x003C +#define REG_ACLK_MON 0x003E +#define REG_GPIO_MUXCFG 0x0040 +#define REG_GPIO_IO_SEL 0x0042 +#define REG_MAC_PINMUX_CFG 0x0043 +#define REG_GPIO_PIN_CTRL 0x0044 +#define REG_GPIO_INTM 0x0048 +#define REG_LEDCFG0 0x004C +#define REG_LEDCFG1 0x004D +#define REG_LEDCFG2 0x004E +#define REG_LEDCFG3 0x004F +#define REG_LEDCFG REG_LEDCFG2 +#define REG_FSIMR 0x0050 +#define REG_FSISR 0x0054 +#define REG_HSIMR 0x0058 +#define REG_HSISR 0x005c +#define REG_GPIO_PIN_CTRL_2 0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control. +#define REG_GPIO_IO_SEL_2 0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select. +#define REG_MULTI_FUNC_CTRL 0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source. +#define REG_MCUFWDL 0x0080 +#define REG_HMEBOX_EXT_0 0x0088 +#define REG_HMEBOX_EXT_1 0x008A +#define REG_HMEBOX_EXT_2 0x008C +#define REG_HMEBOX_EXT_3 0x008E +#define REG_HOST_SUSP_CNT 0x00BC // Host suspend counter on FPGA platform +#define REG_EFUSE_ACCESS 0x00CF // Efuse access protection for RTL8723 +#define REG_BIST_SCAN 0x00D0 +#define REG_BIST_RPT 0x00D4 +#define REG_BIST_ROM_RPT 0x00D8 +#define REG_USB_SIE_INTF 0x00E0 +#define REG_PCIE_MIO_INTF 0x00E4 +#define REG_PCIE_MIO_INTD 0x00E8 +#define REG_HPON_FSM 0x00EC +#define REG_SYS_CFG 0x00F0 +#define REG_GPIO_OUTSTS 0x00F4 // For RTL8723 only. + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_CR 0x0100 +#define REG_PBP 0x0104 +#define REG_TRXDMA_CTRL 0x010C +#define REG_TRXFF_BNDY 0x0114 +#define REG_TRXFF_STATUS 0x0118 +#define REG_RXFF_PTR 0x011C +#define REG_HIMR 0x0120 +#define REG_HISR 0x0124 +#define REG_HIMRE 0x0128 +#define REG_HISRE 0x012C +#define REG_CPWM 0x012F +#define REG_FWIMR 0x0130 +#define REG_FWISR 0x0134 +#define REG_PKTBUF_DBG_CTRL 0x0140 +#define REG_PKTBUF_DBG_DATA_L 0x0144 +#define REG_PKTBUF_DBG_DATA_H 0x0148 + +#define REG_TC0_CTRL 0x0150 +#define REG_TC1_CTRL 0x0154 +#define REG_TC2_CTRL 0x0158 +#define REG_TC3_CTRL 0x015C +#define REG_TC4_CTRL 0x0160 +#define REG_TCUNIT_BASE 0x0164 +#define REG_MBIST_START 0x0174 +#define REG_MBIST_DONE 0x0178 +#define REG_MBIST_FAIL 0x017C +#define REG_C2HEVT_MSG_NORMAL 0x01A0 +#define REG_C2HEVT_CLEAR 0x01AF +#define REG_C2HEVT_MSG_TEST 0x01B8 +#define REG_MCUTST_1 0x01c0 +#define REG_FMETHR 0x01C8 +#define REG_HMETFR 0x01CC +#define REG_HMEBOX_0 0x01D0 +#define REG_HMEBOX_1 0x01D4 +#define REG_HMEBOX_2 0x01D8 +#define REG_HMEBOX_3 0x01DC + +#define REG_LLT_INIT 0x01E0 +#define REG_BB_ACCEESS_CTRL 0x01E8 +#define REG_BB_ACCESS_DATA 0x01EC + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_RQPN 0x0200 +#define REG_FIFOPAGE 0x0204 +#define REG_TDECTRL 0x0208 +#define REG_TXDMA_OFFSET_CHK 0x020C +#define REG_TXDMA_STATUS 0x0210 +#define REG_RQPN_NPQ 0x0214 + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_AGG_PG_TH 0x0280 +#define REG_RXPKT_NUM 0x0284 +#define REG_RXDMA_STATUS 0x0288 + + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_CTRL_REG 0x0300 +#define REG_INT_MIG 0x0304 // Interrupt Migration +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address +#define REG_DBI 0x0348 // Backdoor REG for Access Configuration +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_DBG_SEL 0x0360 // Debug Selection Register +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM +#define REG_UART_CTRL 0x0364 // UART Control +#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address +#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address + + +// spec version 11 +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_VOQ_INFORMATION 0x0400 +#define REG_VIQ_INFORMATION 0x0404 +#define REG_BEQ_INFORMATION 0x0408 +#define REG_BKQ_INFORMATION 0x040C +#define REG_MGQ_INFORMATION 0x0410 +#define REG_HGQ_INFORMATION 0x0414 +#define REG_BCNQ_INFORMATION 0x0418 + + +#define REG_CPU_MGQ_INFORMATION 0x041C +#define REG_FWHW_TXQ_CTRL 0x0420 +#define REG_HWSEQ_CTRL 0x0423 +#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY 0x0425 +#define REG_MULTI_BCNQ_EN 0x0426 +#define REG_MULTI_BCNQ_OFFSET 0x0427 +#define REG_SPEC_SIFS 0x0428 +#define REG_RL 0x042A +#define REG_DARFRC 0x0430 +#define REG_RARFRC 0x0438 +#define REG_RRSR 0x0440 +#define REG_ARFR0 0x0444 +#define REG_ARFR1 0x0448 +#define REG_ARFR2 0x044C +#define REG_ARFR3 0x0450 +#define REG_AGGLEN_LMT 0x0458 +#define REG_AMPDU_MIN_SPACE 0x045C +#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D +#define REG_FAST_EDCA_CTRL 0x0460 +#define REG_RD_RESP_PKT_TH 0x0463 +#define REG_INIRTS_RATE_SEL 0x0480 +#define REG_INIDATA_RATE_SEL 0x0484 +#define REG_POWER_STATUS 0x04A4 +#define REG_POWER_STAGE1 0x04B4 +#define REG_POWER_STAGE2 0x04B8 +#define REG_PKT_VO_VI_LIFE_TIME 0x04C0 +#define REG_PKT_BE_BK_LIFE_TIME 0x04C2 +#define REG_STBC_SETTING 0x04C4 +#define REG_PROT_MODE_CTRL 0x04C8 +#define REG_MAX_AGGR_NUM 0x04CA +#define REG_RTS_MAX_AGGR_NUM 0x04CB +#define REG_BAR_MODE_CTRL 0x04CC +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF +#define REG_NQOS_SEQ 0x04DC +#define REG_QOS_SEQ 0x04DE +#define REG_NEED_CPU_HANDLE 0x04E0 +#define REG_PKT_LOSE_RPT 0x04E1 +#define REG_PTCL_ERR_STATUS 0x04E2 +#define REG_DUMMY 0x04FC + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_EDCA_VO_PARAM 0x0500 +#define REG_EDCA_VI_PARAM 0x0504 +#define REG_EDCA_BE_PARAM 0x0508 +#define REG_EDCA_BK_PARAM 0x050C +#define REG_BCNTCFG 0x0510 +#define REG_PIFS 0x0512 +#define REG_RDG_PIFS 0x0513 +#define REG_SIFS_CCK 0x0514 +#define REG_SIFS_OFDM 0x0516 +#define REG_SIFS_CTX 0x0514 +#define REG_SIFS_TRX 0x0516 +#define REG_AGGR_BREAK_TIME 0x051A +#define REG_SLOT 0x051B +#define REG_TX_PTCL_CTRL 0x0520 +#define REG_TXPAUSE 0x0522 +#define REG_DIS_TXREQ_CLR 0x0523 +#define REG_RD_CTRL 0x0524 +#define REG_TBTT_PROHIBIT 0x0540 +#define REG_RD_NAV_NXT 0x0544 +#define REG_NAV_PROT_LEN 0x0546 +#define REG_BCN_CTRL 0x0550 +#define REG_BCN_CTRL_1 0x0551 +#define REG_MBID_NUM 0x0552 +#define REG_DUAL_TSF_RST 0x0553 +#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE +#define REG_MBSSID_BCN_SPACE 0x0554 +#define REG_DRVERLYINT 0x0558 +#define REG_BCNDMATIM 0x0559 +#define REG_ATIMWND 0x055A +#define REG_BCN_MAX_ERR 0x055D +#define REG_RXTSF_OFFSET_CCK 0x055E +#define REG_RXTSF_OFFSET_OFDM 0x055F +#define REG_TSFTR 0x0560 +#define REG_INIT_TSFTR 0x0564 +#define REG_PSTIMER 0x0580 +#define REG_TIMER0 0x0584 +#define REG_TIMER1 0x0588 +#define REG_ACMHWCTRL 0x05C0 +#define REG_ACMRSTCTRL 0x05C1 +#define REG_ACMAVG 0x05C2 +#define REG_VO_ADMTIME 0x05C4 +#define REG_VI_ADMTIME 0x05C6 +#define REG_BE_ADMTIME 0x05C8 +#define REG_EDCA_RANDOM_GEN 0x05CC +#define REG_SCH_TXCMD 0x05D0 + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_APSD_CTRL 0x0600 +#define REG_BWOPMODE 0x0603 +#define REG_TCR 0x0604 +#define REG_RCR 0x0608 +#define REG_RX_PKT_LIMIT 0x060C +#define REG_RX_DLK_TIME 0x060D +#define REG_RX_DRVINFO_SZ 0x060F + +#define REG_MACID 0x0610 +#define REG_BSSID 0x0618 +#define REG_MAR 0x0620 +#define REG_MBIDCAMCFG 0x0628 + +#define REG_USTIME_EDCA 0x0638 +#define REG_MAC_SPEC_SIFS 0x063A + +// 20100719 Joseph: Hardware register definition change. (HW datasheet v54) +#define REG_R2T_SIFS 0x063C // [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK +#define REG_T2T_SIFS 0x063E // [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK +#define REG_ACKTO 0x0640 +#define REG_CTS2TO 0x0641 +#define REG_EIFS 0x0642 + +//WMA, BA, CCX +#define REG_NAV_CTRL 0x0650 +#define REG_BACAMCMD 0x0654 +#define REG_BACAMCONTENT 0x0658 +#define REG_LBDLY 0x0660 +#define REG_FWDLY 0x0661 +#define REG_RXERR_RPT 0x0664 +#define REG_WMAC_TRXPTCL_CTL 0x0668 + + +// Security +#define REG_CAMCMD 0x0670 +#define REG_CAMWRITE 0x0674 +#define REG_CAMREAD 0x0678 +#define REG_CAMDBG 0x067C +#define REG_SECCFG 0x0680 + +// Power +#define REG_WOW_CTRL 0x0690 +#define REG_PSSTATUS 0x0691 +#define REG_PS_RX_INFO 0x0692 +#define REG_LPNAV_CTRL 0x0694 +#define REG_WKFMCAM_CMD 0x0698 +#define REG_WKFMCAM_RWD 0x069C +#define REG_RXFLTMAP0 0x06A0 +#define REG_RXFLTMAP1 0x06A2 +#define REG_RXFLTMAP2 0x06A4 +#define REG_BCN_PSR_RPT 0x06A8 +#define REG_CALB32K_CTRL 0x06AC +#define REG_PKT_MON_CTRL 0x06B4 +#define REG_BT_COEX_TABLE 0x06C0 +#define REG_WMAC_RESP_TXINFO 0x06D8 + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +// For test chip +#define REG_TEST_USB_TXQS 0xFE48 +#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_TEST_SIE_OPTIONAL 0xFE64 +#define REG_TEST_SIE_CHIRP_K 0xFE65 +#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B +#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 + + +// For normal chip +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_NORMAL_SIE_OPTIONAL 0xFE64 +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B +#define REG_NORMAL_SIE_OPTIONAL2 0xFE6C +#define REG_NORMAL_SIE_GPS_EP 0xFE6D // 0xFE6D, for RTL8723 only. +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF + + +//----------------------------------------------------- +// +// Redifine 8192C register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. + +#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control. +#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable. +#define SYS_CLK REG_SYS_CLKR +#define CR9346 REG_9346CR // 93C46/93C56 Command Register. +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. +#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. +#define MSR (REG_CR + 2) // Media Status register +#define ISR REG_HISR +#define TSFR REG_TSFTR // Timing Sync Function Timer Register. + +#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 +#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 + +#define PBP REG_PBP + +// Redifine MACID register, to compatible prior ICs. +#define IDR0 MACIDR0 +#define IDR4 MACIDR4 + + +// +// 9. Security Control Registers (Offset: ) +// +#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd +#define WCAMI REG_CAMWRITE // Software write CAM input content +#define RCAMO REG_CAMREAD // Software read/write CAM config +#define CAMDBG REG_CAMDBG +#define SECR REG_SECCFG //Security Configuration Register + +// Unused register +#define UnusedRegister 0x1BF +#define DCAM UnusedRegister +#define PSR UnusedRegister +#define BBAddr UnusedRegister +#define PhyDataR UnusedRegister + +#define InvalidBBRFValue 0x12345678 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A + +//---------------------------------------------------------------------------- +// 8192C Cmd9346CR bits (Offset 0xA, 16bit) +//---------------------------------------------------------------------------- +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 +#define Cmd9346CR_9356SEL BIT4 +#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL) +#define AutoLoadEFUSE CmdEEPROM_En + +//---------------------------------------------------------------------------- +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO 0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) + +//---------------------------------------------------------------------------- +// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +/* +Network Type +00: No link +01: Link in ad hoc network +10: Link in infrastructure network +11: AP mode +Default: 00b. +*/ +#define MSR_NOLINK 0x00 +#define MSR_ADHOC 0x01 +#define MSR_INFRA 0x02 +#define MSR_AP 0x03 + +// +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) +// +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x181, 24bits) +//---------------------------------------------------------------------------- +#define RRSR_RSC_OFFSET 21 +#define RRSR_SHORT_OFFSET 23 +#define RRSR_RSC_BW_40M 0x600000 +#define RRSR_RSC_UPSUBCHNL 0x400000 +#define RRSR_RSC_LOWSUBCHNL 0x200000 +#define RRSR_SHORT 0x800000 +#define RRSR_1M BIT0 +#define RRSR_2M BIT1 +#define RRSR_5_5M BIT2 +#define RRSR_11M BIT3 +#define RRSR_6M BIT4 +#define RRSR_9M BIT5 +#define RRSR_12M BIT6 +#define RRSR_18M BIT7 +#define RRSR_24M BIT8 +#define RRSR_36M BIT9 +#define RRSR_48M BIT10 +#define RRSR_54M BIT11 +#define RRSR_MCS0 BIT12 +#define RRSR_MCS1 BIT13 +#define RRSR_MCS2 BIT14 +#define RRSR_MCS3 BIT15 +#define RRSR_MCS4 BIT16 +#define RRSR_MCS5 BIT17 +#define RRSR_MCS6 BIT18 +#define RRSR_MCS7 BIT19 +#define BRSR_AckShortPmb BIT23 +// CCK ACK: use Short Preamble or not + + +//---------------------------------------------------------------------------- +// 8192C Rate Definition +//---------------------------------------------------------------------------- +//CCK +#define RATR_1M 0x00000001 +#define RATR_2M 0x00000002 +#define RATR_55M 0x00000004 +#define RATR_11M 0x00000008 +//OFDM +#define RATR_6M 0x00000010 +#define RATR_9M 0x00000020 +#define RATR_12M 0x00000040 +#define RATR_18M 0x00000080 +#define RATR_24M 0x00000100 +#define RATR_36M 0x00000200 +#define RATR_48M 0x00000400 +#define RATR_54M 0x00000800 +//MCS 1 Spatial Stream +#define RATR_MCS0 0x00001000 +#define RATR_MCS1 0x00002000 +#define RATR_MCS2 0x00004000 +#define RATR_MCS3 0x00008000 +#define RATR_MCS4 0x00010000 +#define RATR_MCS5 0x00020000 +#define RATR_MCS6 0x00040000 +#define RATR_MCS7 0x00080000 +//MCS 2 Spatial Stream +#define RATR_MCS8 0x00100000 +#define RATR_MCS9 0x00200000 +#define RATR_MCS10 0x00400000 +#define RATR_MCS11 0x00800000 +#define RATR_MCS12 0x01000000 +#define RATR_MCS13 0x02000000 +#define RATR_MCS14 0x04000000 +#define RATR_MCS15 0x08000000 + + +// NOTE: For 92CU - Ziv +//CCK +#define RATE_1M BIT(0) +#define RATE_2M BIT(1) +#define RATE_5_5M BIT(2) +#define RATE_11M BIT(3) +//OFDM +#define RATE_6M BIT(4) +#define RATE_9M BIT(5) +#define RATE_12M BIT(6) +#define RATE_18M BIT(7) +#define RATE_24M BIT(8) +#define RATE_36M BIT(9) +#define RATE_48M BIT(10) +#define RATE_54M BIT(11) +//MCS 1 Spatial Stream +#define RATE_MCS0 BIT(12) +#define RATE_MCS1 BIT(13) +#define RATE_MCS2 BIT(14) +#define RATE_MCS3 BIT(15) +#define RATE_MCS4 BIT(16) +#define RATE_MCS5 BIT(17) +#define RATE_MCS6 BIT(18) +#define RATE_MCS7 BIT(19) +//MCS 2 Spatial Stream +#define RATE_MCS8 BIT(20) +#define RATE_MCS9 BIT(21) +#define RATE_MCS10 BIT(22) +#define RATE_MCS11 BIT(23) +#define RATE_MCS12 BIT(24) +#define RATE_MCS13 BIT(25) +#define RATE_MCS14 BIT(26) +#define RATE_MCS15 BIT(27) + + + + +// ALL CCK Rate +#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M +#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ + RATR_36M|RATR_48M|RATR_54M +#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ + RATR_MCS4|RATR_MCS5|RATR_MCS6 |RATR_MCS7 +#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9 |RATR_MCS10|RATR_MCS11|\ + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 + +//---------------------------------------------------------------------------- +// 8192C BW_OPMODE bits (Offset 0x203, 8bit) +//---------------------------------------------------------------------------- +#define BW_OPMODE_20MHZ BIT2 +#define BW_OPMODE_5G BIT1 +#define BW_OPMODE_11J BIT0 + + +//---------------------------------------------------------------------------- +// 8192C CAM Config Setting (offset 0x250, 1 byte) +//---------------------------------------------------------------------------- +#define CAM_VALID BIT15 +#define CAM_NOTVALID 0x0000 +#define CAM_USEDK BIT5 + +#define CAM_CONTENT_COUNT 8 + +#define CAM_NONE 0x0 +#define CAM_WEP40 0x01 +#define CAM_TKIP 0x02 +#define CAM_AES 0x04 +#define CAM_WEP104 0x05 + +#define TOTAL_CAM_ENTRY 32 +#define HALF_CAM_ENTRY 16 + +#define CAM_CONFIG_USEDK _TRUE +#define CAM_CONFIG_NO_USEDK _FALSE + +#define CAM_WRITE BIT16 +#define CAM_READ 0x00000000 +#define CAM_POLLINIG BIT31 + +#define SCR_UseDK 0x01 +#define SCR_TxSecEnable 0x02 +#define SCR_RxSecEnable 0x04 + + +// +// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) +// +//---------------------------------------------------------------------------- +// 8190 IMR/ISR bits (offset 0xfd, 8bits) +//---------------------------------------------------------------------------- +#define IMR8190_DISABLED 0x0 +// IMR DW0 Bit 0-31 +#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8 +#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1 +#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2 +#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1 +#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow +#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt +#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0 +#define IMR_RXFOVW BIT12 // Receive FIFO Overflow +#define IMR_RDU BIT11 // Receive Descriptor Unavailable +#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt +#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup +#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt +#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup +#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt +#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt +#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt +#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt +#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt +#define IMR_VODOK BIT1 // AC_VO DMA Interrupt +#define IMR_ROK BIT0 // Receive DMA OK Interrupt + +#define IMR_RX_MASK (IMR_ROK|IMR_RDU|IMR_RXFOVW) +#define IMR_TX_MASK (IMR_VODOK|IMR_VIDOK|IMR_BEDOK|IMR_BKDOK|IMR_MGNTDOK|IMR_HIGHDOK|IMR_BDOK) + +// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh) +#define IMR_TXERR BIT11 +#define IMR_RXERR BIT10 +#define IMR_C2HCMD BIT9 +#define IMR_CPWM BIT8 +//RSVD [2-7] +#define IMR_OCPINT BIT1 +#define IMR_WLANOFF BIT0 + + + +//---------------------------------------------------------------------------- +// 8192C EFUSE +//---------------------------------------------------------------------------- +#define HWSET_MAX_SIZE 128 + + +//---------------------------------------------------------------------------- +// 8192C EEPROM/EFUSE share register definition. +//---------------------------------------------------------------------------- + +// +// Default Value for EEPROM or EFUSE!!! +// +#define EEPROM_Default_TSSI 0x0 +#define EEPROM_Default_TxPowerDiff 0x0 +#define EEPROM_Default_CrystalCap 0x5 +#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) +#define EEPROM_Default_TxPower 0x1010 +#define EEPROM_Default_HT2T_TxPwr 0x10 + +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_ThermalMeter 0x12 + +#define EEPROM_Default_AntTxPowerDiff 0x0 +#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 +#define EEPROM_Default_TxPowerLevel 0x22 +#define EEPROM_Default_HT40_2SDiff 0x0 +#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference +#define EEPROM_Default_LegacyHTTxPowerDiff 0x3 +#define EEPROM_Default_HT40_PwrMaxOffset 0 +#define EEPROM_Default_HT20_PwrMaxOffset 0 + +// For debug +#define EEPROM_Default_PID 0x1234 +#define EEPROM_Default_VID 0x5678 +#define EEPROM_Default_CustomerID 0xAB +#define EEPROM_Default_SubCustomerID 0xCD +#define EEPROM_Default_Version 0 + +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_NCC 0xB +#define EEPROM_USB_OPTIONAL1 0xE +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_TOSHIBA 0x4 +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. +#define EEPROM_CID_QMI 0x0D +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define RTL_EEPROM_ID 0x8129 + + +#ifdef CONFIG_PCI_HCI +#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER) +#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) + +// +// Interface type. +// +typedef enum _INTERFACE_SELECT_8192CPCIe{ + INTF_SEL0_SOLO_MINICARD = 0, // WiFi solo-mCard + INTF_SEL1_BT_COMBO_MINICARD = 1, // WiFi+BT combo-mCard + INTF_SEL2_PCIe = 2, // PCIe Card +} INTERFACE_SELECT_8192CPCIe, *PINTERFACE_SELECT_8192CPCIe; + +#define RTL8190_EEPROM_ID 0x8129 // 0-1 +#define EEPROM_HPON 0x02 // LDO settings.2-5 +#define EEPROM_CLK 0x06 // Clock settings.6-7 +#define EEPROM_TESTR 0x08 // SE Test mode.8 + +#define EEPROM_VID 0x0A // SE Vendor ID.A-B +#define EEPROM_DID 0x0C // SE Device ID. C-D +#define EEPROM_SVID 0x0E // SE Vendor ID.E-F +#define EEPROM_SMID 0x10 // SE PCI Subsystem ID. 10-11 + +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 + +//---------------------------------------------------------------- +// Ziv - Let PCIe and USB use the same define. Modify address mapping later. +#define EEPROM_CCK_TX_PWR_INX 0x5A +#define EEPROM_HT40_1S_TX_PWR_INX 0x60 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 +#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 +#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C +#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F +#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 + +#define EEPROM_CHANNEL_PLAN 0x75 +#define EEPROM_TSSI_A 0x76 +#define EEPROM_TSSI_B 0x77 +#define EEPROM_THERMAL_METER 0x78 +#define EEPROM_RF_OPT1 0x79 +#define EEPROM_RF_OPT2 0x7A +#define EEPROM_RF_OPT3 0x7B +#define EEPROM_RF_OPT4 0x7C +#define EEPROM_VERSION 0x7E +#define EEPROM_CUSTOMER_ID 0x7F + +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] + +#endif + +#ifdef CONFIG_USB_HCI + +//should be renamed and moved to another file +typedef enum _BOARD_TYPE_8192CUSB{ + BOARD_USB_DONGLE = 0, // USB dongle + BOARD_USB_High_PA = 1, // USB dongle with high power PA + BOARD_MINICARD = 2, // Minicard + BOARD_USB_SOLO = 3, // USB solo-Slim module + BOARD_USB_COMBO = 4, // USB Combo-Slim module +} BOARD_TYPE_8192CUSB, *PBOARD_TYPE_8192CUSB; + +#define SUPPORT_HW_RADIO_DETECT(pHalData) (pHalData->BoardType == BOARD_MINICARD||\ + pHalData->BoardType == BOARD_USB_SOLO||\ + pHalData->BoardType == BOARD_USB_COMBO) + +//--------------------------------------------------------------- +// EEPROM address for Test chip +//--------------------------------------------------------------- +#define EEPROM_TEST_USB_OPT 0x0E +#define EEPROM_TEST_CHIRP_K 0x0F +#define EEPROM_TEST_EP_SETTING 0x0E +#define EEPROM_TEST_USB_PHY 0x10 + + +//--------------------------------------------------------------- +// EEPROM address for Normal chip +//--------------------------------------------------------------- +#define EEPROM_NORMAL_USB_OPT 0x0E +#define EEPROM_NORMAL_CHIRP_K 0x0E // Changed +#define EEPROM_NORMAL_EP_SETTING 0x0F // Changed +#define EEPROM_NORMAL_USB_PHY 0x12 // Changed + + +// Test chip and normal chip common define +//--------------------------------------------------------------- +// EEPROM address for both +//--------------------------------------------------------------- +#define EEPROM_ID0 0x00 +#define EEPROM_ID1 0x01 +#define EEPROM_RTK_RSV1 0x02 +#define EEPROM_RTK_RSV2 0x03 +#define EEPROM_RTK_RSV3 0x04 +#define EEPROM_RTK_RSV4 0x05 +#define EEPROM_RTK_RSV5 0x06 +#define EEPROM_DBG_SEL 0x07 +#define EEPROM_RTK_RSV6 0x08 +#define EEPROM_VID 0x0A +#define EEPROM_PID 0x0C + +#define EEPROM_MAC_ADDR 0x16 +#define EEPROM_STRING 0x1C +#define EEPROM_SUBCUSTOMER_ID 0x59 +#define EEPROM_CCK_TX_PWR_INX 0x5A +#define EEPROM_HT40_1S_TX_PWR_INX 0x60 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 +#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 +#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C +#define EEPROM_HT40_MAX_PWR_OFFSET 0x6F +#define EEPROM_HT20_MAX_PWR_OFFSET 0x72 + +#define EEPROM_CHANNEL_PLAN 0x75 +#define EEPROM_TSSI_A 0x76 +#define EEPROM_TSSI_B 0x77 +#define EEPROM_THERMAL_METER 0x78 +#define EEPROM_RF_OPT1 0x79 +#define EEPROM_RF_OPT2 0x7A +#define EEPROM_RF_OPT3 0x7B +#define EEPROM_RF_OPT4 0x7C +#define EEPROM_VERSION 0x7E +#define EEPROM_CUSTOMER_ID 0x7F + +#define EEPROM_BoardType 0x54 //0x0: RTL8188SU, 0x1: RTL8191SU, 0x2: RTL8192SU, 0x3: RTL8191GU +#define EEPROM_TxPwIndex 0x5C //0x5C-0x76, Tx Power index. +#define EEPROM_PwDiff 0x67 // Difference of gain index between legacy and high throughput OFDM. + +#define EEPROM_TxPowerCCK 0x5A // CCK Tx Power + +// 2009/02/09 Cosa Add for SD3 requirement +#define EEPROM_TX_PWR_HT20_DIFF 0x6e// HT20 Tx Power Index Difference +#define DEFAULT_HT20_TXPWR_DIFF 2 // HT20<->40 default Tx Power Index Difference +#define EEPROM_TX_PWR_OFDM_DIFF 0x71// OFDM Tx Power Index Difference + +#define EEPROM_TxPWRGroup 0x73// Power diff for channel group +#define EEPROM_Regulatory 0x79// Check if power safety is need + +#define EEPROM_BLUETOOTH_COEXIST 0x7E // 92cu, 0x7E[4] +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] +#define BOARD_TYPE_NORMAL_MASK 0xE0 +#define BOARD_TYPE_TEST_MASK 0x0F +#define EEPROM_EASY_REPLACEMENT 0x50//BIT0 1 for build-in module, 0 for external dongle +//------------------------------------------------------------- +// EEPROM content definitions +//------------------------------------------------------------- +#define OS_LINK_SPEED BIT(5) + +#define BOARD_TYPE_MASK 0xF + +#define BT_COEXISTENCE BIT(4) +#define BT_CO_SHIFT 4 + +#define EP_NUMBER_MASK 0x30 //bit 4:5 0Eh +#define EP_NUMBER_SHIFT 4 + + +#define USB_PHY_PARA_SIZE 5 + + +//------------------------------------------------------------- +// EEPROM default value definitions +//------------------------------------------------------------- +// Use 0xABCD instead of 0x8192 for debug +#define EEPROM_DEF_ID_0 0xCD // Byte 0x00 +#define EEPROM_DEF_ID_1 0xAB // Byte 0x01 + +#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03 +#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04 +#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08 + +#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A +#define EEPROM_DEF_VID_1 0x0B + +#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C +#define EEPROM_DEF_PID_1 0x81 + + +#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E +#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E + +#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F + +#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10 +#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11 +#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12 +#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13 + +#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78 +#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79 + + +#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A + +#define RF_OPTION1 0x79// Check if power safety spec is need +#define RF_OPTION2 0x7A +#define RF_OPTION3 0x7B +#define RF_OPTION4 0x7C + + +#define EEPROM_USB_SN BIT(0) +#define EEPROM_USB_REMOTE_WAKEUP BIT(1) +#define EEPROM_USB_DEVICE_PWR BIT(2) +#define EEPROM_EP_NUMBER (BIT(3)|BIT(4)) + +#if 0 +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + +#define EEPROM_CID_DEFAULT 0x0 + +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. +#endif + +#endif + + +/*=================================================================== +===================================================================== +Here the register defines are for 92C. When the define is as same with 92C, +we will use the 92C's define for the consistency +So the following defines for 92C is not entire!!!!!! +===================================================================== +=====================================================================*/ +/* +Based on Datasheet V33---090401 +Register Summary +Current IOREG MAP +0x0000h ~ 0x00FFh System Configuration (256 Bytes) +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) +*/ + +//---------------------------------------------------------------------------- +// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) +//---------------------------------------------------------------------------- +#define RCR_APPFCS BIT31 //WMAC append FCS after pauload +#define RCR_APP_MIC BIT30 // +#define RCR_APP_PHYSTS BIT28// +#define RCR_APP_ICV BIT29 // +#define RCR_APP_PHYST_RXFF BIT28 // +#define RCR_APP_BA_SSN BIT27 //Accept BA SSN +#define RCR_ENMBID BIT24 //Enable Multiple BssId. +#define RCR_LSIGEN BIT23 +#define RCR_MFBEN BIT22 +#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 +#define RCR_AMF BIT13 //Accept management type frame +#define RCR_ACF BIT12 //Accept control type frame +#define RCR_ADF BIT11 //Accept data type frame +#define RCR_AICV BIT9 //Accept ICV error packet +#define RCR_ACRC32 BIT8 //Accept CRC32 error packet +#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) +#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) +#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet +#define RCR_APWRMGT BIT5 //Accept power management packet +#define RCR_ADD3 BIT4 //Accept address 3 match packet +#define RCR_AB BIT3 //Accept broadcast packet +#define RCR_AM BIT2 //Accept multicast packet +#define RCR_APM BIT1 //Accept physical match packet +#define RCR_AAP BIT0 //Accept all unicast packet +#define RCR_MXDMA_OFFSET 8 +#define RCR_FIFO_OFFSET 13 + + + +//============================================================================ +// 8192c USB specific Regsiter Offset and Content definition, +// 2009.08.18, added by vivi. for merge 92c and 92C into one driver +//============================================================================ +//#define APS_FSMCO 0x0004 same with 92Ce +#define RSV_CTRL 0x001C +#define RD_CTRL 0x0524 + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +#define REG_USB_VID 0xFE60 +#define REG_USB_PID 0xFE62 +#define REG_USB_OPTIONAL 0xFE64 +#define REG_USB_CHIRP_K 0xFE65 +#define REG_USB_PHY 0xFE66 +#define REG_USB_MAC_ADDR 0xFE70 + +#define REG_USB_HRPWM 0xFE58 +#define REG_USB_HCPWM 0xFE57 + +#define InvalidBBRFValue 0x12345678 + +//============================================================================ +// 8192C Regsiter Bit and Content definition +//============================================================================ +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +//2 SPS0_CTRL +#define SW18_FPWM BIT(3) + + +//2 SYS_ISO_CTRL +#define ISO_MD2PP BIT(0) +#define ISO_UA2USB BIT(1) +#define ISO_UD2CORE BIT(2) +#define ISO_PA2PCIE BIT(3) +#define ISO_PD2CORE BIT(4) +#define ISO_IP2MAC BIT(5) +#define ISO_DIOP BIT(6) +#define ISO_DIOE BIT(7) +#define ISO_EB2CORE BIT(8) +#define ISO_DIOR BIT(9) + +#define PWC_EV25V BIT(14) +#define PWC_EV12V BIT(15) + + +//2 SYS_FUNC_EN +#define FEN_BBRSTB BIT(0) +#define FEN_BB_GLB_RSTn BIT(1) +#define FEN_USBA BIT(2) +#define FEN_UPLL BIT(3) +#define FEN_USBD BIT(4) +#define FEN_DIO_PCIE BIT(5) +#define FEN_PCIEA BIT(6) +#define FEN_PPLL BIT(7) +#define FEN_PCIED BIT(8) +#define FEN_DIOE BIT(9) +#define FEN_CPUEN BIT(10) +#define FEN_DCORE BIT(11) +#define FEN_ELDR BIT(12) +#define FEN_DIO_RF BIT(13) +#define FEN_HWPDN BIT(14) +#define FEN_MREGEN BIT(15) + +//2 APS_FSMCO +#define PFM_LDALL BIT(0) +#define PFM_ALDN BIT(1) +#define PFM_LDKP BIT(2) +#define PFM_WOWL BIT(3) +#define EnPDN BIT(4) +#define PDN_PL BIT(5) +#define APFM_ONMAC BIT(8) +#define APFM_OFF BIT(9) +#define APFM_RSM BIT(10) +#define AFSM_HSUS BIT(11) +#define AFSM_PCIE BIT(12) +#define APDM_MAC BIT(13) +#define APDM_HOST BIT(14) +#define APDM_HPDN BIT(15) +#define RDY_MACON BIT(16) +#define SUS_HOST BIT(17) +#define ROP_ALD BIT(20) +#define ROP_PWR BIT(21) +#define ROP_SPS BIT(22) +#define SOP_MRST BIT(25) +#define SOP_FUSE BIT(26) +#define SOP_ABG BIT(27) +#define SOP_AMB BIT(28) +#define SOP_RCK BIT(29) +#define SOP_A8M BIT(30) +#define XOP_BTCK BIT(31) + +//2 SYS_CLKR +#define ANAD16V_EN BIT(0) +#define ANA8M BIT(1) +#define MACSLP BIT(4) +#define LOADER_CLK_EN BIT(5) +#define _80M_SSC_DIS BIT(7) +#define _80M_SSC_EN_HO BIT(8) +#define PHY_SSC_RSTB BIT(9) +#define SEC_CLK_EN BIT(10) +#define MAC_CLK_EN BIT(11) +#define SYS_CLK_EN BIT(12) +#define RING_CLK_EN BIT(13) + + +//2 9346CR + + +#define EEDO BIT(0) +#define EEDI BIT(1) +#define EESK BIT(2) +#define EECS BIT(3) +//#define EERPROMSEL BIT(4) +//#define EEPROM_EN BIT(5) +#define BOOT_FROM_EEPROM BIT(4) +#define EEPROM_EN BIT(5) +#define EEM0 BIT(6) +#define EEM1 BIT(7) + + +//2 AFE_MISC +#define AFE_BGEN BIT(0) +#define AFE_MBEN BIT(1) +#define MAC_ID_EN BIT(7) + + +//2 SPS0_CTRL + + +//2 SPS_OCP_CFG + + +//2 RSV_CTRL +#define WLOCK_ALL BIT(0) +#define WLOCK_00 BIT(1) +#define WLOCK_04 BIT(2) +#define WLOCK_08 BIT(3) +#define WLOCK_40 BIT(4) +#define R_DIS_PRST_0 BIT(5) +#define R_DIS_PRST_1 BIT(6) +#define LOCK_ALL_EN BIT(7) + +//2 RF_CTRL +#define RF_EN BIT(0) +#define RF_RSTB BIT(1) +#define RF_SDMRSTB BIT(2) + + + +//2 LDOA15_CTRL +#define LDA15_EN BIT(0) +#define LDA15_STBY BIT(1) +#define LDA15_OBUF BIT(2) +#define LDA15_REG_VOS BIT(3) +#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) + + + +//2 LDOV12D_CTRL +#define LDV12_EN BIT(0) +#define LDV12_SDBY BIT(1) +#define LPLDO_HSM BIT(2) +#define LPLDO_LSM_DIS BIT(3) +#define _LDV12_VADJ(x) (((x) & 0xF) << 4) + + +//2 AFE_XTAL_CTRL +#define XTAL_EN BIT(0) +#define XTAL_BSEL BIT(1) +#define _XTAL_BOSC(x) (((x) & 0x3) << 2) +#define _XTAL_CADJ(x) (((x) & 0xF) << 4) +#define XTAL_GATE_USB BIT(8) +#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9) +#define XTAL_GATE_AFE BIT(11) +#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12) +#define XTAL_RF_GATE BIT(14) +#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15) +#define XTAL_GATE_DIG BIT(17) +#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18) +#define XTAL_BT_GATE BIT(20) +#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) +#define _XTAL_GPIO(x) (((x) & 0x7) << 23) + + +#define CKDLY_AFE BIT(26) +#define CKDLY_USB BIT(27) +#define CKDLY_DIG BIT(28) +#define CKDLY_BT BIT(29) + + +//2 AFE_PLL_CTRL +#define APLL_EN BIT(0) +#define APLL_320_EN BIT(1) +#define APLL_FREF_SEL BIT(2) +#define APLL_EDGE_SEL BIT(3) +#define APLL_WDOGB BIT(4) +#define APLL_LPFEN BIT(5) + +#define APLL_REF_CLK_13MHZ 0x1 +#define APLL_REF_CLK_19_2MHZ 0x2 +#define APLL_REF_CLK_20MHZ 0x3 +#define APLL_REF_CLK_25MHZ 0x4 +#define APLL_REF_CLK_26MHZ 0x5 +#define APLL_REF_CLK_38_4MHZ 0x6 +#define APLL_REF_CLK_40MHZ 0x7 + +#define APLL_320EN BIT(14) +#define APLL_80EN BIT(15) +#define APLL_1MEN BIT(24) + + +//2 EFUSE_CTRL +#define ALD_EN BIT(18) +#define EF_PD BIT(19) +#define EF_FLAG BIT(31) + +//2 EFUSE_TEST (For RTL8723 partially) +#define EF_TRPT BIT(7) +#define EF_CELL_SEL (BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2 +#define LDOE25_EN BIT(31) +#define EFUSE_SEL(x) (((x) & 0x3) << 8) +#define EFUSE_SEL_MASK 0x300 +#define EFUSE_WIFI_SEL_0 0x0 +#define EFUSE_BT_SEL_0 0x1 +#define EFUSE_BT_SEL_1 0x2 +#define EFUSE_BT_SEL_2 0x3 + +#define EFUSE_ACCESS_ON 0x69 // For RTL8723 only. +#define EFUSE_ACCESS_OFF 0x00 // For RTL8723 only. + +//2 PWR_DATA + +//2 CAL_TIMER + +//2 ACLK_MON +#define RSM_EN BIT(0) +#define Timer_EN BIT(4) + + +//2 GPIO_MUXCFG +#define TRSW0EN BIT(2) +#define TRSW1EN BIT(3) +#define EROM_EN BIT(4) +#define EnBT BIT(5) +#define EnUart BIT(8) +#define Uart_910 BIT(9) +#define EnPMAC BIT(10) +#define SIC_SWRST BIT(11) +#define EnSIC BIT(12) +#define SIC_23 BIT(13) +#define EnHDP BIT(14) +#define SIC_LBK BIT(15) + +//2 GPIO_PIN_CTRL + +// GPIO BIT +#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2) + +//2 GPIO_INTM + +//2 LEDCFG +#define LED0PL BIT(4) +#define LED0DIS BIT(7) +#define LED1DIS BIT(15) +#define LED1PL BIT(12) + +#define SECCAM_CLR BIT(30) + + +//2 FSIMR + +//2 FSISR + + +//2 8051FWDL +//2 MCUFWDL +#define MCUFWDL_EN BIT(0) +#define MCUFWDL_RDY BIT(1) +#define FWDL_ChkSum_rpt BIT(2) +#define MACINI_RDY BIT(3) +#define BBINI_RDY BIT(4) +#define RFINI_RDY BIT(5) +#define WINTINI_RDY BIT(6) +#define CPRST BIT(23) + +//2REG_HPON_FSM +#define BOND92CE_1T2R_CFG BIT(22) + + +//2 REG_SYS_CFG +#define XCLK_VLD BIT(0) +#define ACLK_VLD BIT(1) +#define UCLK_VLD BIT(2) +#define PCLK_VLD BIT(3) +#define PCIRSTB BIT(4) +#define V15_VLD BIT(5) +#define TRP_B15V_EN BIT(7) +#define SIC_IDLE BIT(8) +#define BD_MAC2 BIT(9) +#define BD_MAC1 BIT(10) +#define IC_MACPHY_MODE BIT(11) +#define CHIP_VER (BIT(12)|BIT(13)|BIT(14)|BIT(15)) +#define BT_FUNC BIT(16) +#define VENDOR_ID BIT(19) +#define PAD_HWPD_IDN BIT(22) +#define TRP_VAUX_EN BIT(23) +#define TRP_BT_EN BIT(24) +#define BD_PKG_SEL BIT(25) +#define BD_HCI_SEL BIT(26) +#define TYPE_ID BIT(27) + +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 +#define CHIP_VER_RTL_SHIFT 12 + +//2REG_GPIO_OUTSTS (For RTL8723 only) +#define EFS_HCI_SEL (BIT(0)|BIT(1)) +#define PAD_HCI_SEL (BIT(2)|BIT(3)) +#define HCI_SEL (BIT(4)|BIT(5)) +#define PKG_SEL_HCI BIT(6) +#define FEN_GPS BIT(7) +#define FEN_BT BIT(8) +#define FEN_WL BIT(9) +#define FEN_PCI BIT(10) +#define FEN_USB BIT(11) +#define BTRF_HWPDN_N BIT(12) +#define WLRF_HWPDN_N BIT(13) +#define PDN_BT_N BIT(14) +#define PDN_GPS_N BIT(15) +#define BT_CTL_HWPDN BIT(16) +#define GPS_CTL_HWPDN BIT(17) +#define PPHY_SUSB BIT(20) +#define UPHY_SUSB BIT(21) +#define PCI_SUSEN BIT(22) +#define USB_SUSEN BIT(23) +#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28)) + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + + +//2 Function Enable Registers +//2 CR + +#define REG_LBMODE (REG_CR + 3) + + +#define HCI_TXDMA_EN BIT(0) +#define HCI_RXDMA_EN BIT(1) +#define TXDMA_EN BIT(2) +#define RXDMA_EN BIT(3) +#define PROTOCOL_EN BIT(4) +#define SCHEDULE_EN BIT(5) +#define MACTXEN BIT(6) +#define MACRXEN BIT(7) +#define ENSWBCN BIT(8) +#define ENSEC BIT(9) + +// Network type +#define _NETTYPE(x) (((x) & 0x3) << 16) +#define MASK_NETTYPE 0x30000 +#define NT_NO_LINK 0x0 +#define NT_LINK_AD_HOC 0x1 +#define NT_LINK_AP 0x2 +#define NT_AS_AP 0x3 + +#define _LBMODE(x) (((x) & 0xF) << 24) +#define MASK_LBMODE 0xF000000 +#define LOOPBACK_NORMAL 0x0 +#define LOOPBACK_IMMEDIATELY 0xB +#define LOOPBACK_MAC_DELAY 0x3 +#define LOOPBACK_PHY 0x1 +#define LOOPBACK_DMA 0x7 + + +//2 PBP - Page Size Register +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) +#define _PSRX_MASK 0xF +#define _PSTX_MASK 0xF0 +#define _PSRX(x) (x) +#define _PSTX(x) ((x) << 4) + +#define PBP_64 0x0 +#define PBP_128 0x1 +#define PBP_256 0x2 +#define PBP_512 0x3 +#define PBP_1024 0x4 + + +//2 TX/RXDMA +#define RXDMA_ARBBW_EN BIT(0) +#define RXSHFT_EN BIT(1) +#define RXDMA_AGG_EN BIT(2) +#define QS_VO_QUEUE BIT(8) +#define QS_VI_QUEUE BIT(9) +#define QS_BE_QUEUE BIT(10) +#define QS_BK_QUEUE BIT(11) +#define QS_MANAGER_QUEUE BIT(12) +#define QS_HIGH_QUEUE BIT(13) + +#define HQSEL_VOQ BIT(0) +#define HQSEL_VIQ BIT(1) +#define HQSEL_BEQ BIT(2) +#define HQSEL_BKQ BIT(3) +#define HQSEL_MGTQ BIT(4) +#define HQSEL_HIQ BIT(5) + +// For normal driver, 0x10C +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) + +#define QUEUE_LOW 1 +#define QUEUE_NORMAL 2 +#define QUEUE_HIGH 3 + + + +//2 TRXFF_BNDY + + +//2 LLT_INIT +#define _LLT_NO_ACTIVE 0x0 +#define _LLT_WRITE_ACCESS 0x1 +#define _LLT_READ_ACCESS 0x2 + +#define _LLT_INIT_DATA(x) ((x) & 0xFF) +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) +#define _LLT_OP(x) (((x) & 0x3) << 30) +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) + + +//2 BB_ACCESS_CTRL +#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) +#define BB_WRITE_EN BIT(30) +#define BB_READ_EN BIT(31) +//#define BB_ADDR_MASK 0xFFF +//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK) + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +//2 RQPN +#define _HPQ(x) ((x) & 0xFF) +#define _LPQ(x) (((x) & 0xFF) << 8) +#define _PUBQ(x) (((x) & 0xFF) << 16) +#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register + + +#define HPQ_PUBLIC_DIS BIT(24) +#define LPQ_PUBLIC_DIS BIT(25) +#define LD_RQPN BIT(31) + + +//2 TDECTRL +#define BCN_VALID BIT(16) +#define BCN_HEAD(x) (((x) & 0xFF) << 8) +#define BCN_HEAD_MASK 0xFF00 + +//2 TDECTL +#define BLK_DESC_NUM_SHIFT 4 +#define BLK_DESC_NUM_MASK 0xF + + +//2 TXDMA_OFFSET_CHK +#define DROP_DATA_EN BIT(9) + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +//2 FWHW_TXQ_CTRL +#define EN_AMPDU_RTY_NEW BIT(7) + +//2 INIRTSMCS_SEL +#define _INIRTSMCS_SEL(x) ((x) & 0x3F) + + +//2 SPEC SIFS +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) + + +//2 RRSR + +#define RATE_REG_BITMAP_ALL 0xFFFFF + +#define _RRSC_BITMAP(x) ((x) & 0xFFFFF) + +#define _RRSR_RSC(x) (((x) & 0x3) << 21) +#define RRSR_RSC_RESERVED 0x0 +#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 +#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 +#define RRSR_RSC_DUPLICATE_MODE 0x3 + + +//2 ARFR +#define USE_SHORT_G1 BIT(20) + +//2 AGGLEN_LMT_L +#define _AGGLMT_MCS0(x) ((x) & 0xF) +#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4) +#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8) +#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12) +#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16) +#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20) +#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) +#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) + + +//2 RL +#define RETRY_LIMIT_SHORT_SHIFT 8 +#define RETRY_LIMIT_LONG_SHIFT 0 + + +//2 DARFRC +#define _DARF_RC1(x) ((x) & 0x1F) +#define _DARF_RC2(x) (((x) & 0x1F) << 8) +#define _DARF_RC3(x) (((x) & 0x1F) << 16) +#define _DARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (DARFRC + 4) +#define _DARF_RC5(x) ((x) & 0x1F) +#define _DARF_RC6(x) (((x) & 0x1F) << 8) +#define _DARF_RC7(x) (((x) & 0x1F) << 16) +#define _DARF_RC8(x) (((x) & 0x1F) << 24) + + +//2 RARFRC +#define _RARF_RC1(x) ((x) & 0x1F) +#define _RARF_RC2(x) (((x) & 0x1F) << 8) +#define _RARF_RC3(x) (((x) & 0x1F) << 16) +#define _RARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (RARFRC + 4) +#define _RARF_RC5(x) ((x) & 0x1F) +#define _RARF_RC6(x) (((x) & 0x1F) << 8) +#define _RARF_RC7(x) (((x) & 0x1F) << 16) +#define _RARF_RC8(x) (((x) & 0x1F) << 24) + + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + + + +//2 EDCA setting +#define AC_PARAM_TXOP_LIMIT_OFFSET 16 +#define AC_PARAM_ECW_MAX_OFFSET 12 +#define AC_PARAM_ECW_MIN_OFFSET 8 +#define AC_PARAM_AIFS_OFFSET 0 + + +//2 EDCA_VO_PARAM +#define _AIFS(x) (x) +#define _ECW_MAX_MIN(x) ((x) << 8) +#define _TXOP_LIMIT(x) ((x) << 16) + + +#define _BCNIFS(x) ((x) & 0xFF) +#define _BCNECW(x) (((x) & 0xF))<< 8) + + +#define _LRL(x) ((x) & 0x3F) +#define _SRL(x) (((x) & 0x3F) << 8) + + +//2 SIFS_CCK +#define _SIFS_CCK_CTX(x) ((x) & 0xFF) +#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); + + +//2 SIFS_OFDM +#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) +#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); + + +//2 TBTT PROHIBIT +#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) + + +//2 REG_RD_CTRL +#define DIS_EDCA_CNT_DWN BIT(11) + + +//2 BCN_CTRL +#define EN_MBSSID BIT(1) +#define EN_TXBCN_RPT BIT(2) +#define EN_BCN_FUNCTION BIT(3) + +// The same function but different bit field. +#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) +#define DIS_TSF_UDT0_TEST_CHIP BIT(5) + +//2 ACMHWCTRL +#define AcmHw_HwEn BIT(0) +#define AcmHw_BeqEn BIT(1) +#define AcmHw_ViqEn BIT(2) +#define AcmHw_VoqEn BIT(3) +#define AcmHw_BeqStatus BIT(4) +#define AcmHw_ViqStatus BIT(5) +#define AcmHw_VoqStatus BIT(6) + + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +//2 APSD_CTRL +#define APSDOFF BIT(6) +#define APSDOFF_STATUS BIT(7) + + +//2 BWOPMODE +#define BW_20MHZ BIT(2) +//#define BW_OPMODE_20MHZ BIT(2) // For compability + + +#define RATE_BITMAP_ALL 0xFFFFF + +// Only use CCK 1M rate for ACK +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 + +//2 TCR +#define TSFRST BIT(0) +#define DIS_GCLK BIT(1) +#define PAD_SEL BIT(2) +#define PWR_ST BIT(6) +#define PWRBIT_OW_EN BIT(7) +#define ACRC BIT(8) +#define CFENDFORM BIT(9) +#define ICV BIT(10) + + + +//2 RCR +#define AAP BIT(0) +#define APM BIT(1) +#define AM BIT(2) +#define AB BIT(3) +#define ADD3 BIT(4) +#define APWRMGT BIT(5) +#define CBSSID BIT(6) +#define CBSSID_BCN BIT(7) +#define ACRC32 BIT(8) +#define AICV BIT(9) +#define ADF BIT(11) +#define ACF BIT(12) +#define AMF BIT(13) +#define HTC_LOC_CTRL BIT(14) +#define UC_DATA_EN BIT(16) +#define BM_DATA_EN BIT(17) +#define MFBEN BIT(22) +#define LSIGEN BIT(23) +#define EnMBID BIT(24) +#define APP_BASSN BIT(27) +#define APP_PHYSTS BIT(28) +#define APP_ICV BIT(29) +#define APP_MIC BIT(30) +#define APP_FCS BIT(31) + +//2 RX_PKT_LIMIT + +//2 RX_DLK_TIME + +//2 MBIDCAMCFG + + + +//2 AMPDU_MIN_SPACE +#define _MIN_SPACE(x) ((x) & 0x7) +#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) + + +//2 RXERR_RPT +#define RXERR_TYPE_OFDM_PPDU 0 +#define RXERR_TYPE_OFDM_FALSE_ALARM 1 +#define RXERR_TYPE_OFDM_MPDU_OK 2 +#define RXERR_TYPE_OFDM_MPDU_FAIL 3 +#define RXERR_TYPE_CCK_PPDU 4 +#define RXERR_TYPE_CCK_FALSE_ALARM 5 +#define RXERR_TYPE_CCK_MPDU_OK 6 +#define RXERR_TYPE_CCK_MPDU_FAIL 7 +#define RXERR_TYPE_HT_PPDU 8 +#define RXERR_TYPE_HT_FALSE_ALARM 9 +#define RXERR_TYPE_HT_MPDU_TOTAL 10 +#define RXERR_TYPE_HT_MPDU_OK 11 +#define RXERR_TYPE_HT_MPDU_FAIL 12 +#define RXERR_TYPE_RX_FULL_DROP 15 + +#define RXERR_COUNTER_MASK 0xFFFFF +#define RXERR_RPT_RST BIT(27) +#define _RXERR_RPT_SEL(type) ((type) << 28) + + +//2 SECCFG +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption +#define SCR_SKByA2 BIT(4) //Search kEY BY A2 +#define SCR_NoSKMC BIT(5) //No Key Search Multicast + + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- + +//2 USB Information (0xFE17) +#define USB_IS_HIGH_SPEED 0 +#define USB_IS_FULL_SPEED 1 +#define USB_SPEED_MASK BIT(5) + +#define USB_NORMAL_SIE_EP_MASK 0xF +#define USB_NORMAL_SIE_EP_SHIFT 4 + +#define USB_TEST_EP_MASK 0x30 +#define USB_TEST_EP_SHIFT 4 + +//2 Special Option +#define USB_AGG_EN BIT(3) + + +//2REG_C2HEVT_CLEAR +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. + + +//2REG_MULTI_FUNC_CTRL(For RTL8723 Only) +#define WL_HWPDN_EN BIT0 // Enable GPIO[9] as WiFi HW PDn source +#define WL_HWPDN_SL BIT1 // WiFi HW PDn polarity control +#define WL_FUNC_EN BIT2 // WiFi function enable +#define WL_HWROF_EN BIT3 // Enable GPIO[9] as WiFi RF HW PDn source +#define BT_HWPDN_EN BIT16 // Enable GPIO[11] as BT HW PDn source +#define BT_HWPDN_SL BIT17 // BT HW PDn polarity control +#define BT_FUNC_EN BIT18 // BT function enable +#define BT_HWROF_EN BIT19 // Enable GPIO[11] as BT/GPS RF HW PDn source +#define GPS_HWPDN_EN BIT20 // Enable GPIO[10] as GPS HW PDn source +#define GPS_HWPDN_SL BIT21 // GPS HW PDn polarity control +#define GPS_FUNC_EN BIT22 // GPS function enable + +//3 REG_LIFECTRL_CTRL +#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3 +#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2 +#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1 +#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0 + +#define HAL92C_MSDU_LIFE_TIME_UNIT 128 // in us, said by Tim. + +//======================================================== +// General definitions +//======================================================== + +#define MAC_ADDR_LEN 6 +#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 + +#define POLLING_LLT_THRESHOLD 20 +#define POLLING_READY_TIMEOUT_COUNT 1000 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A + +//---------------------------------------------------------------------------- +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO 0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) + + + +#include "basic_types.h" + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h new file mode 100755 index 000000000000..e74fe69685fc --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_sreset.h @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_SRESET_C_ +#define _RTL8192C_SRESET_C_ + +#include +#include +#include + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM +#define WIFI_STATUS_SUCCESS 0 +#define USB_VEN_REQ_CMD_FAIL BIT0 +#define USB_READ_PORT_FAIL BIT1 +#define USB_WRITE_PORT_FAIL BIT2 +#define WIFI_MAC_TXDMA_ERROR BIT3 +#define WIFI_TX_HANG BIT4 +#define WIFI_RX_HANG BIT5 +#define WIFI_IF_NOT_EXIST BIT6 + +struct sreset_priv { + _mutex silentreset_mutex; + u8 silent_reset_inprogress; + u8 Wifi_Error_Status; + unsigned long last_tx_time; + unsigned long last_tx_complete_time; +}; + + +extern void rtl8192c_sreset_init_value(_adapter *padapter); +extern void rtl8192c_sreset_reset_value(_adapter *padapter); +extern void rtl8192c_silentreset_for_specific_platform(_adapter *padapter); +extern void rtl8192c_sreset_xmit_status_check(_adapter *padapter); +extern void rtl8192c_sreset_linked_status_check(_adapter *padapter); +extern u8 rtl8192c_sreset_get_wifi_status(_adapter *padapter); +#endif +#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h b/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h new file mode 100755 index 000000000000..f4428afd636a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192c_xmit.h @@ -0,0 +1,91 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192C_XMIT_H_ +#define _RTL8192C_XMIT_H_ + +#define VO_QUEUE_INX 0 +#define VI_QUEUE_INX 1 +#define BE_QUEUE_INX 2 +#define BK_QUEUE_INX 3 +#define BCN_QUEUE_INX 4 +#define MGT_QUEUE_INX 5 +#define HIGH_QUEUE_INX 6 +#define TXCMD_QUEUE_INX 7 + +#define HW_QUEUE_ENTRY 8 + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +#ifdef CONFIG_USB_HCI + +#ifdef CONFIG_USB_TX_AGGREGATION +#define MAX_TX_AGG_PACKET_NUMBER 0xFF +#endif + +s32 rtl8192cu_init_xmit_priv(_adapter * padapter); + +void rtl8192cu_free_xmit_priv(_adapter * padapter); + +void rtl8192cu_cal_txdesc_chksum(struct tx_desc *ptxdesc); + +s32 rtl8192cu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +void rtl8192cu_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192cu_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192cu_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8192ce_init_xmit_priv(_adapter * padapter); +void rtl8192ce_free_xmit_priv(_adapter * padapter); + +s32 rtl8192ce_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf); +struct xmit_buf *rtl8192ce_dequeue_xmitbuf(struct rtw_tx_ring *ring); + +void rtl8192ce_xmitframe_resume(_adapter *padapter); + +void rtl8192ce_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192ce_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192ce_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h new file mode 100755 index 000000000000..5d889003fd10 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_cmd.h @@ -0,0 +1,104 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_CMD_H_ +#define __RTL8192D_CMD_H_ + + +//-------------------------------------------- +//3 Host Message Box +//-------------------------------------------- + +// User Define Message [31:8] + +//_SETPWRMODE_PARM +#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) +#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) + +//JOINBSSRPT_PARM +#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) + +//_RSVDPAGE_LOC +#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value) +#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) + +//P2P_PS_OFFLOAD + +struct P2P_PS_Offload_t { + unsigned char Offload_En:1; + unsigned char role:1; // 1: Owner, 0: Client + unsigned char CTWindow_En:1; + unsigned char NoA0_En:1; + unsigned char NoA1_En:1; + unsigned char AllStaSleep:1; // Only valid in Owner + unsigned char discovery:1; + unsigned char rsvd:1; +}; + +#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value) +#define SET_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value) + +// Description: Determine the types of H2C commands that are the same in driver and Fw. +// Fisrt constructed by tynli. 2009.10.09. +typedef enum _RTL8192D_H2C_CMD +{ + H2C_AP_OFFLOAD = 0, /*0*/ + H2C_SETPWRMODE = 1, /*1*/ + H2C_JOINBSSRPT = 2, /*2*/ + H2C_RSVDPAGE = 3, + H2C_RSSI_REPORT = 5, + H2C_RA_MASK = 6, + H2C_P2P_PS_OFFLOAD = 8, + H2C_MAC_MODE_SEL = 9, + H2C_PWRM=15, + H2C_P2P_PS_CTW_CMD = 24, + H2C_PathDiv = 26, //PathDiv--NeilChen--2011.07.15 + H2C_CMD_MAX +}RTL8192D_H2C_CMD; + +struct cmd_msg_parm { + u8 eid; //element id + u8 sz; // sz + u8 buf[6]; +}; + + +void FillH2CCmd92D(_adapter* padapter, u8 ElementID, u32 CmdLen, u8* pCmdBuffer); + +// host message to firmware cmd +void rtl8192d_set_FwPwrMode_cmd(_adapter*padapter, u8 Mode); +void rtl8192d_set_FwJoinBssReport_cmd(_adapter* padapter, u8 mstatus); +u8 rtl8192d_set_rssi_cmd(_adapter*padapter, u8 *param); +u8 rtl8192d_set_raid_cmd(_adapter*padapter, u32 mask, u8 arg); +void rtl8192d_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg); +#ifdef CONFIG_P2P +void rtl8192d_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state); +#endif //CONFIG_P2P + +#endif + + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h new file mode 100755 index 000000000000..ae9f8fe6ee7b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_dm.h @@ -0,0 +1,400 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_DM_H__ +#define __RTL8192D_DM_H__ +//============================================================ +// Description: +// +// This file is for 92CE/92CU dynamic mechanism only +// +// +//============================================================ +//============================================================ +// Global var +//============================================================ + +extern u32 EDCAParam[maxAP][3] ; + +#define OFDM_TABLE_SIZE 37 +#define OFDM_TABLE_SIZE_92D 43 +#define CCK_TABLE_SIZE 33 +extern u32 OFDMSwingTable[OFDM_TABLE_SIZE_92D] ; + +extern u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8]; + +extern u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]; + +//============================================================ +// structure and define +//============================================================ + +typedef struct _FALSE_ALARM_STATISTICS{ + u32 Cnt_Parity_Fail; + u32 Cnt_Rate_Illegal; + u32 Cnt_Crc8_fail; + u32 Cnt_Mcs_fail; + u32 Cnt_Ofdm_fail; + u32 Cnt_Cck_fail; + u32 Cnt_all; + u32 Cnt_Fast_Fsync; + u32 Cnt_SB_Search_fail; +}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS; + +typedef struct _Dynamic_Power_Saving_ +{ + u8 PreCCAState; + u8 CurCCAState; + + u8 PreRFState; + u8 CurRFState; + + //int Rssi_val_min; + +}PS_T,*pPS_T; + +typedef struct _Dynamic_Initial_Gain_Threshold_ +{ + u8 Dig_Enable_Flag; + u8 Dig_Ext_Port_Stage; + + int RssiLowThresh; + int RssiHighThresh; + + u32 FALowThresh; + u32 FAHighThresh; + + u8 CurSTAConnectState; + u8 PreSTAConnectState; + u8 CurMultiSTAConnectState; + + u8 PreIGValue; + u8 CurIGValue; + + char BackoffVal; + char BackoffVal_range_max; + char BackoffVal_range_min; + u8 rx_gain_range_max; + u8 rx_gain_range_min; + u8 Rssi_val_min; + + u8 PreCCKPDState; + u8 CurCCKPDState; + + u8 LargeFAHit; + u8 ForbiddenIGI; + u32 Recover_cnt; +}DIG_T,*pDIG_T; +typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition +{ + DIG_TYPE_THRESH_HIGH = 0, + DIG_TYPE_THRESH_LOW = 1, + DIG_TYPE_BACKOFF = 2, + DIG_TYPE_RX_GAIN_MIN = 3, + DIG_TYPE_RX_GAIN_MAX = 4, + DIG_TYPE_ENABLE = 5, + DIG_TYPE_DISABLE = 6, + DIG_OP_TYPE_MAX +}DM_DIG_OP_E; + +typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition +{ + CCK_PD_STAGE_LowRssi = 0, + CCK_PD_STAGE_HighRssi = 1, + CCK_PD_STAGE_MAX = 3, +}DM_CCK_PDTH_E; + +typedef enum tag_1R_CCA_Type_Definition +{ + CCA_MIN = 0, + CCA_1R =1, + CCA_2R = 2, + CCA_MAX = 3, +}DM_1R_CCA_E; + +typedef enum tag_RF_Type_Definition +{ + RF_Save =0, + RF_Normal = 1, + RF_MAX = 2, +}DM_RF_E; + +typedef enum tag_DIG_EXT_PORT_ALGO_Definition +{ + DIG_EXT_PORT_STAGE_0 = 0, + DIG_EXT_PORT_STAGE_1 = 1, + DIG_EXT_PORT_STAGE_2 = 2, + DIG_EXT_PORT_STAGE_3 = 3, + DIG_EXT_PORT_STAGE_MAX = 4, +}DM_DIG_EXT_PORT_ALG_E; + + +typedef enum tag_DIG_Connect_Definition +{ + DIG_STA_DISCONNECT = 0, + DIG_STA_CONNECT = 1, + DIG_STA_BEFORE_CONNECT = 2, + DIG_MultiSTA_DISCONNECT = 3, + DIG_MultiSTA_CONNECT = 4, + DIG_CONNECT_MAX +}DM_DIG_CONNECT_E; + + +#define DM_DIG_THRESH_HIGH 40 +#define DM_DIG_THRESH_LOW 35 + +#define DM_FALSEALARM_THRESH_LOW 400 +#define DM_FALSEALARM_THRESH_HIGH 1000 + +#define DM_DIG_MAX 0x3e +#define DM_DIG_MIN 0x1e //0x22//0x1c + +#define DM_DIG_FA_UPPER 0x32 +#define DM_DIG_FA_LOWER 0x20 + +//vivi 92c&92d has different definition, 20110504 +//this is for 92c +#define DM_DIG_FA_TH0 0x200//0x20 +#define DM_DIG_FA_TH1 0x300//0x100 +#define DM_DIG_FA_TH2 0x400//0x200 +//this is for 92d +#define DM_DIG_FA_TH0_92D 0x100 +#define DM_DIG_FA_TH1_92D 0x400 +#define DM_DIG_FA_TH2_92D 0x600 + +#define DM_DIG_BACKOFF_MAX 12 +#define DM_DIG_BACKOFF_MIN (-4) +#define DM_DIG_BACKOFF_DEFAULT 10 + +#define RxPathSelection_SS_TH_low 30 +#define RxPathSelection_diff_TH 18 + +#define DM_RATR_STA_INIT 0 +#define DM_RATR_STA_HIGH 1 +#define DM_RATR_STA_MIDDLE 2 +#define DM_RATR_STA_LOW 3 + +#define CTSToSelfTHVal 30 +#define RegC38_TH 20 + +#define WAIotTHVal 25 + +//Dynamic Tx Power Control Threshold +#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 +#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 + +#define TxHighPwrLevel_Normal 0 +#define TxHighPwrLevel_Level1 1 +#define TxHighPwrLevel_Level2 2 + +#define DM_Type_ByFW 0 +#define DM_Type_ByDriver 1 + +typedef struct _RATE_ADAPTIVE +{ + u8 RateAdaptiveDisabled; + u8 RATRState; + u16 reserve; + + u32 HighRSSIThreshForRA; + u32 High2LowRSSIThreshForRA; + u8 Low2HighRSSIThreshForRA40M; + u32 LowRSSIThreshForRA40M; + u8 Low2HighRSSIThreshForRA20M; + u32 LowRSSIThreshForRA20M; + u32 UpperRSSIThresholdRATR; + u32 MiddleRSSIThresholdRATR; + u32 LowRSSIThresholdRATR; + u32 LowRSSIThresholdRATR40M; + u32 LowRSSIThresholdRATR20M; + u8 PingRSSIEnable; //cosa add for Netcore long range ping issue + u32 PingRSSIRATR; //cosa add for Netcore long range ping issue + u32 PingRSSIThreshForRA;//cosa add for Netcore long range ping issue + u32 LastRATR; + u8 PreRATRState; + +} RATE_ADAPTIVE, *PRATE_ADAPTIVE; + +typedef enum tag_SW_Antenna_Switch_Definition +{ + Antenna_B = 1, + Antenna_A = 2, + Antenna_MAX = 3, +}DM_SWAS_E; + +// 20100514 Joseph: Add definition for antenna switching test after link. +// This indicates two different the steps. +// In SWAW_STEP_PEAK, driver needs to switch antenna and listen to the signal on the air. +// In SWAW_STEP_DETERMINE, driver just compares the signal captured in SWAW_STEP_PEAK +// with original RSSI to determine if it is necessary to switch antenna. +#define SWAW_STEP_PEAK 0 +#define SWAW_STEP_DETERMINE 1 + +#define TP_MODE 0 +#define RSSI_MODE 1 +#define TRAFFIC_LOW 0 +#define TRAFFIC_HIGH 1 + +//============================= +//Neil Chen---2011--06--15-- +//============================== +//3 PathDiv +typedef struct _SW_Antenna_Switch_ +{ + u8 try_flag; + s32 PreRSSI; + u8 CurAntenna; + u8 PreAntenna; + u8 RSSI_Trying; + u8 TestMode; + u8 bTriggerAntennaSwitch; + u8 SelectAntennaMap; + + // Before link Antenna Switch check + u8 SWAS_NoLink_State; + u32 SWAS_NoLink_BK_Reg860; +}SWAT_T, *pSWAT_T; +//======================================== + +struct dm_priv +{ + u8 DM_Type; + u8 DMFlag, DMFlag_tmp; + + //for DIG + u8 bDMInitialGainEnable; + //u8 binitialized; // for dm_initial_gain_Multi_STA use. + DIG_T DM_DigTable; + + PS_T DM_PSTable; + + FALSE_ALARM_STATISTICS FalseAlmCnt; + + //for rate adaptive, in fact, 88c/92c fw will handle this + u8 bUseRAMask; + RATE_ADAPTIVE RateAdaptive; + + //* Upper and Lower Signal threshold for Rate Adaptive*/ + int UndecoratedSmoothedPWDB; + int EntryMinUndecoratedSmoothedPWDB; + int EntryMaxUndecoratedSmoothedPWDB; + int MinUndecoratedPWDBForDM; + int LastMinUndecoratedPWDBForDM; + + //for High Power + u8 bDynamicTxPowerEnable; + u8 LastDTPLvl; + u8 DynamicTxHighPowerLvl;//Add by Jacken Tx Power Control for Near/Far Range 2008/03/06 + + //for tx power tracking + u8 bTXPowerTracking; + u8 TXPowercount; + u8 bTXPowerTrackingInit; + u8 TxPowerTrackControl; //for mp mode, turn off txpwrtracking as default + u8 TM_Trigger; + + u8 ThermalMeter[2]; // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1 + u8 ThermalValue; + u8 ThermalValue_LCK; + u8 ThermalValue_IQK; + u8 ThermalValue_AVG[AVG_THERMAL_NUM]; + u8 ThermalValue_AVG_index; + u8 ThermalValue_RxGain; + u8 ThermalValue_Crystal; + u8 Delta_IQK; + u8 Delta_LCK; + u8 bRfPiEnable; + u8 bReloadtxpowerindex; + u8 bDoneTxpower; + + //for APK + u32 APKoutput[2][2]; //path A/B; output1_1a/output1_2a + u8 bAPKdone; + u8 bAPKThermalMeterIgnore; + + //for IQK + u32 Reg874; + u32 RegC08; + u32 Reg88C; + u8 Reg522; + u8 Reg550; + u8 Reg551; + u32 Reg870; + u32 ADDA_backup[IQK_ADDA_REG_NUM]; + u32 IQK_MAC_backup[IQK_MAC_REG_NUM]; + u32 IQK_BB_backup[IQK_BB_REG_NUM]; + + u8 bCCKinCH14; + + char CCK_index; + //u8 Record_CCK_20Mindex; + //u8 Record_CCK_40Mindex; + char OFDM_index[2]; + + SWAT_T DM_SWAT_Table; + + //Neil Chen----2011--06--23----- + //3 Path Diversity + BOOLEAN bPathDiv_Enable; //For 92D Non-interrupt Antenna Diversity by Neil ,add by wl.2011.07.19 + BOOLEAN RSSI_test; + s32 RSSI_sum_A; + s32 RSSI_cnt_A; + s32 RSSI_sum_B; + s32 RSSI_cnt_B; + struct sta_info *RSSI_target; + _timer PathDivSwitchTimer; + + //for TxPwrTracking + int RegE94; + int RegE9C; + int RegEB4; + int RegEBC; +#if MP_DRIVER == 1 + u8 RegC04_MP; + u32 RegD04_MP; +#endif + u32 TXPowerTrackingCallbackCnt; //cosa add for debug + + u32 prv_traffic_idx; // edca turbo + + u32 RegRF3C[2]; //pathA / pathB + + // Add for Reading Initial Data Rate SEL Register 0x484 during watchdog. Using for fill tx desc. 2011.3.21 by Thomas + u8 INIDATA_RATE[32]; +}; + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ +/*------------------------Export Marco Definition---------------------------*/ +//#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;} + + +//============================================================ +// function prototype +//============================================================ +void rtl8192d_init_dm_priv(IN PADAPTER Adapter); +void rtl8192d_deinit_dm_priv(IN PADAPTER Adapter); +void rtl8192d_InitHalDm(IN PADAPTER Adapter); +void rtl8192d_HalDmWatchDog(IN PADAPTER Adapter); + +VOID rtl8192d_dm_CheckTXPowerTracking(IN PADAPTER Adapter); + +#endif //__HAL8190PCIDM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h new file mode 100755 index 000000000000..922f05bb9a3e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_hal.h @@ -0,0 +1,892 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_HAL_H__ +#define __RTL8192D_HAL_H__ + +#include "rtl8192d_spec.h" +#include "Hal8192DPhyReg.h" +#include "Hal8192DPhyCfg.h" +#include "rtl8192d_rf.h" +#include "rtl8192d_dm.h" +#include "rtl8192d_recv.h" +#include "rtl8192d_xmit.h" +#include "rtl8192d_cmd.h" + +#ifdef CONFIG_PCI_HCI + #include + #include "Hal8192DEHWImg.h" + #include "Hal8192DETestHWImg.h" + + #define RTL819X_DEFAULT_RF_TYPE RF_2T2R + //#define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //2TODO: The following need to check!! + #define RTL8192D_FW_IMG "rtl8192DE\\rtl8192dfw.bin" + + //For 92DE + #define RTL8192D_PHY_REG "rtl8192DE\\PHY_REG.txt" + #define RTL8192D_PHY_REG_PG "rtl8192DE\\PHY_REG_PG.txt" + #define RTL8192D_PHY_REG_MP "rtl8192DE\\PHY_REG_MP.txt" + + #define RTL8192D_AGC_TAB "rtl8192DE\\AGC_TAB.txt" + #define RTL8192D_AGC_TAB_2G "rtl8192DE\\AGC_TAB_2G.txt" + #define RTL8192D_AGC_TAB_5G "rtl8192DE\\AGC_TAB_5G.txt" + #define RTL8192D_PHY_RADIO_A "rtl8192DE\\radio_a.txt" + #define RTL8192D_PHY_RADIO_B "rtl8192DE\\radio_b.txt" + #define RTL8192D_PHY_MACREG "rtl8192DE\\MAC_REG.txt" + #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DE\\radio_a_intPA.txt" + #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DE\\radio_b_intPA.txt" + + #define RTL8192D_TEST_FW_IMG_FILE "rtl8192DE\\rtl8192dfw_test.bin" + #define RTL8192D_TEST_PHY_REG_PG_FILE "rtl8192DE\\PHY_REG_PG_test.txt" + + #define RTL8192D_TEST_PHY_REG_FILE "rtl8192DE\\PHY_REG_test.txt" + #define RTL8192D_TEST_PHY_RADIO_A_FILE "rtl8192DE\\radio_a_test.txt" + #define RTL8192D_TEST_PHY_RADIO_B_FILE "rtl8192DE\\radio_b_test.txt" + #define RTL8192D_TEST_AGC_TAB_2G "rtl8192DE\\AGC_TAB_2G_test.txt" + #define RTL8192D_TEST_AGC_TAB_5G "rtl8192DE\\AGC_TAB_5G_test.txt" + #define RTL8192D_TEST_MAC_REG_FILE "rtl8192DE\\MAC_REG_test.txt" + + // The file name "_2T" is for 92CE, "_1T" is for 88CE. Modified by tynli. 2009.11.24. + #define Rtl819XFwImageArray Rtl8192DEFwImgArray + #define Rtl819XMAC_Array Rtl8192DEMAC_2TArray + #define Rtl819XAGCTAB_Array Rtl8192DEAGCTAB_Array + #define Rtl819XAGCTAB_5GArray Rtl8192DEAGCTAB_5GArray + #define Rtl819XAGCTAB_2GArray Rtl8192DEAGCTAB_2GArray + #define Rtl819XPHY_REG_2TArray Rtl8192DEPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192DEPHY_REG_1TArray + #define Rtl819XRadioA_2TArray Rtl8192DERadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192DERadioA_1TArray + #define Rtl819XRadioA_2T_intPAArray Rtl8192DERadioA_2T_intPAArray + #define Rtl819XRadioB_2TArray Rtl8192DERadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192DERadioB_1TArray + #define Rtl819XRadioB_2T_intPAArray Rtl8192DERadioB_2T_intPAArray + #define Rtl819XPHY_REG_Array_PG Rtl8192DEPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_MP Rtl8192DEPHY_REG_Array_MP + #define Rtl819XAGCTAB_2TArray Rtl8192DEAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192DEAGCTAB_1TArray + +#elif defined(CONFIG_USB_HCI) + + #include "Hal8192DUHWImg.h" + #include "Hal8192DUTestHWImg.h" + + //2TODO: We should define 8192S firmware related macro settings here!! + #define RTL819X_DEFAULT_RF_TYPE RF_1T2R + #define RTL819X_TOTAL_RF_PATH 2 + + //2TODO: The following need to check!! + #define RTL8192D_FW_IMG "rtl8192DU\\rtl8192dfw.bin" + + //For 92DU + #define RTL8192D_PHY_REG "rtl8192DU\\PHY_REG.txt" + #define RTL8192D_PHY_REG_PG "rtl8192DU\\PHY_REG_PG.txt" + #define RTL8192D_PHY_REG_MP "rtl8192DU\\PHY_REG_MP.txt" + + #define RTL8192D_AGC_TAB "rtl8192DU\\AGC_TAB.txt" + #define RTL8192D_AGC_TAB_2G "rtl8192DU\\AGC_TAB_2G.txt" + #define RTL8192D_AGC_TAB_5G "rtl8192DU\\AGC_TAB_5G.txt" + #define RTL8192D_PHY_RADIO_A "rtl8192DU\\radio_a.txt" + #define RTL8192D_PHY_RADIO_B "rtl8192DU\\radio_b.txt" + #define RTL8192D_PHY_RADIO_A_intPA "rtl8192DU\\radio_a_intPA.txt" + #define RTL8192D_PHY_RADIO_B_intPA "rtl8192DU\\radio_b_intPA.txt" + #define RTL8192D_PHY_MACREG "rtl8192DU\\MAC_REG.txt" + + #define RTL8192D_TEST_FW_IMG_FILE "rtl8192DU\\rtl8192dfw_test.bin" + #define RTL8192D_TEST_PHY_REG_PG_FILE "rtl8192DU\\PHY_REG_PG_test.txt" + + #define RTL8192D_TEST_PHY_REG_FILE "rtl8192DU\\PHY_REG_test.txt" + #define RTL8192D_TEST_PHY_RADIO_A_FILE "rtl8192DU\\radio_a_test.txt" + #define RTL8192D_TEST_PHY_RADIO_B_FILE "rtl8192DU\\radio_b_test.txt" + #define RTL8192D_TEST_AGC_TAB_2G "rtl8192DU\\AGC_TAB_2G_test.txt" + #define RTL8192D_TEST_AGC_TAB_5G "rtl8192DU\\AGC_TAB_5G_test.txt" + #define RTL8192D_TEST_MAC_REG_FILE "rtl8192DU\\MAC_REG_test.txt" + + // The file name "_2T" is for 92CU, "_1T" is for 88CU. Modified by tynli. 2009.11.24. + #define Rtl819XFwImageArray Rtl8192DUFwImgArray + #define Rtl819XMAC_Array Rtl8192DUMAC_2TArray + #define Rtl819XAGCTAB_Array Rtl8192DUAGCTAB_Array + #define Rtl819XAGCTAB_5GArray Rtl8192DUAGCTAB_5GArray + #define Rtl819XAGCTAB_2GArray Rtl8192DUAGCTAB_2GArray + #define Rtl819XPHY_REG_2TArray Rtl8192DUPHY_REG_2TArray + #define Rtl819XPHY_REG_1TArray Rtl8192DUPHY_REG_1TArray + #define Rtl819XRadioA_2TArray Rtl8192DURadioA_2TArray + #define Rtl819XRadioA_1TArray Rtl8192DURadioA_1TArray + #define Rtl819XRadioA_2T_intPAArray Rtl8192DURadioA_2T_intPAArray + #define Rtl819XRadioB_2TArray Rtl8192DURadioB_2TArray + #define Rtl819XRadioB_1TArray Rtl8192DURadioB_1TArray + #define Rtl819XRadioB_2T_intPAArray Rtl8192DURadioB_2T_intPAArray + #define Rtl819XPHY_REG_Array_PG Rtl8192DUPHY_REG_Array_PG + #define Rtl819XPHY_REG_Array_MP Rtl8192DUPHY_REG_Array_MP + + #define Rtl819XAGCTAB_2TArray Rtl8192DUAGCTAB_2TArray + #define Rtl819XAGCTAB_1TArray Rtl8192DUAGCTAB_1TArray + +#endif + +#define DRVINFO_SZ 4 // unit is 8bytes +#define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0)) + +// +// Check if FW header exists. We do not consider the lower 4 bits in this case. +// By tynli. 2009.12.04. +// +#define IS_FW_HEADER_EXIST(_pFwHdr) ((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x92C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88C0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D0 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D1 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D2 ||\ + (le16_to_cpu(_pFwHdr->Signature)&0xFFFF) == 0x92D3 ) + +#define FW_8192D_SIZE 0x8000 +#define FW_8192D_START_ADDRESS 0x1000 + +#define MAX_PAGE_SIZE 4096 // @ page : 4k bytes + +typedef enum _FIRMWARE_SOURCE{ + FW_SOURCE_IMG_FILE = 0, + FW_SOURCE_HEADER_FILE = 1, //from header file +}FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; + +typedef struct _RT_FIRMWARE{ + FIRMWARE_SOURCE eFWSource; + #ifdef CONFIG_EMBEDDED_FWIMG + u8* szFwBuffer; + #else + u8 szFwBuffer[FW_8192D_SIZE]; + #endif + u32 ulFwLength; +}RT_FIRMWARE, *PRT_FIRMWARE, RT_FIRMWARE_92D, *PRT_FIRMWARE_92D; + +// +// This structure must be cared byte-ordering +// +// Added by tynli. 2009.12.04. +typedef struct _RT_8192D_FIRMWARE_HDR {//8-byte alinment required + + //--- LONG WORD 0 ---- + u16 Signature; // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut + u8 Category; // AP/NIC and USB/PCI + u8 Function; // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions + u16 Version; // FW Version + u8 Subversion; // FW Subversion, default 0x00 + u8 Rsvd1; + + + //--- LONG WORD 1 ---- + u8 Month; // Release time Month field + u8 Date; // Release time Date field + u8 Hour; // Release time Hour field + u8 Minute; // Release time Minute field + u16 RamCodeSize; // The size of RAM code + u16 Rsvd2; + + //--- LONG WORD 2 ---- + u32 SvnIdx; // The SVN entry index + u32 Rsvd3; + + //--- LONG WORD 3 ---- + u32 Rsvd4; + u32 Rsvd5; + +}RT_8192D_FIRMWARE_HDR, *PRT_8192D_FIRMWARE_HDR; + +#define DRIVER_EARLY_INT_TIME 0x05 +#define BCN_DMA_ATIME_INT_TIME 0x02 + +typedef enum _BT_CoType{ + BT_2Wire = 0, + BT_ISSC_3Wire = 1, + BT_Accel = 2, + BT_CSR = 3, + BT_CSR_ENHAN = 4, + BT_RTL8756 = 5, +} BT_CoType, *PBT_CoType; + +typedef enum _BT_CurState{ + BT_OFF = 0, + BT_ON = 1, +} BT_CurState, *PBT_CurState; + +typedef enum _BT_ServiceType{ + BT_SCO = 0, + BT_A2DP = 1, + BT_HID = 2, + BT_HID_Idle = 3, + BT_Scan = 4, + BT_Idle = 5, + BT_OtherAction = 6, + BT_Busy = 7, + BT_OtherBusy = 8, +} BT_ServiceType, *PBT_ServiceType; + +typedef enum _BT_RadioShared{ + BT_Radio_Shared = 0, + BT_Radio_Individual = 1, +} BT_RadioShared, *PBT_RadioShared; + +typedef struct _BT_COEXIST_STR{ + u8 BluetoothCoexist; + u8 BT_Ant_Num; + u8 BT_CoexistType; + u8 BT_State; + u8 BT_CUR_State; //0:on, 1:off + u8 BT_Ant_isolation; //0:good, 1:bad + u8 BT_PapeCtrl; //0:SW, 1:SW/HW dynamic + u8 BT_Service; + u8 BT_RadioSharedType; + u8 Ratio_Tx; + u8 Ratio_PRI; +}BT_COEXIST_STR, *PBT_COEXIST_STR; + +//Added for 92D IQK setting. +typedef struct _IQK_MATRIX_REGS_SETTING{ + BOOLEAN bIQKDone; +#if 1 + int Value[1][IQK_Matrix_REG_NUM]; +#else + u32 Mark[IQK_Matrix_REG_NUM]; + u32 Value[IQK_Matrix_REG_NUM]; +#endif +}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING; + +#ifdef CONFIG_USB_RX_AGGREGATION + +typedef enum _USB_RX_AGG_MODE{ + USB_RX_AGG_DISABLE, + USB_RX_AGG_DMA, + USB_RX_AGG_USB, + USB_RX_AGG_DMA_USB +}USB_RX_AGG_MODE; + +#define MAX_RX_DMA_BUFFER_SIZE 10240 // 10K for 8192C RX DMA buffer + +#endif + + +#define TX_SELE_HQ BIT(0) // High Queue +#define TX_SELE_LQ BIT(1) // Low Queue +#define TX_SELE_NQ BIT(2) // Normal Queue + + +// Note: We will divide number of page equally for each queue other than public queue! + +#define TX_TOTAL_PAGE_NUMBER 0xF8 +#define TX_PAGE_BOUNDARY (TX_TOTAL_PAGE_NUMBER + 1) + +// For Normal Chip Setting +// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define NORMAL_PAGE_NUM_PUBQ 0x56 + + +// For Test Chip Setting +// (HPQ + LPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER +#define TEST_PAGE_NUM_PUBQ 0x89 +#define TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC 0x7A +#define NORMAL_PAGE_NUM_PUBQ_92D_DUAL_MAC 0x5A +#define NORMAL_PAGE_NUM_HPQ_92D_DUAL_MAC 0x10 +#define NORMAL_PAGE_NUM_LPQ_92D_DUAL_MAC 0x10 +#define NORMAL_PAGE_NUM_NORMALQ_92D_DUAL_MAC 0 + +#define TX_PAGE_BOUNDARY_DUAL_MAC (TX_TOTAL_PAGE_NUMBER_92D_DUAL_MAC + 1) + +// For Test Chip Setting +#define WMM_TEST_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_TEST_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_TEST_PAGE_NUM_PUBQ 0xA3 +#define WMM_TEST_PAGE_NUM_HPQ 0x29 +#define WMM_TEST_PAGE_NUM_LPQ 0x29 + + +//Note: For Normal Chip Setting ,modify later +#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER 0xF5 +#define WMM_NORMAL_TX_PAGE_BOUNDARY (WMM_TEST_TX_TOTAL_PAGE_NUMBER + 1) //F6 + +#define WMM_NORMAL_PAGE_NUM_PUBQ 0xB0 +#define WMM_NORMAL_PAGE_NUM_HPQ 0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ 0x1C +#define WMM_NORMAL_PAGE_NUM_NPQ 0x1C + +#define WMM_NORMAL_PAGE_NUM_PUBQ_92D 0X65//0x82 +#define WMM_NORMAL_PAGE_NUM_HPQ_92D 0X30//0x29 +#define WMM_NORMAL_PAGE_NUM_LPQ_92D 0X30 +#define WMM_NORMAL_PAGE_NUM_NPQ_92D 0X30 + +//------------------------------------------------------------------------- +// Chip specific +//------------------------------------------------------------------------- +#define CHIP_92C BIT(0) +#define CHIP_92C_1T2R BIT(1) +#define CHIP_8723 BIT(2) // RTL8723 With BT feature +#define CHIP_8723_DRV_REV BIT(3) // RTL8723 Driver Revised +#define NORMAL_CHIP BIT(4) +#define CHIP_VENDOR_UMC BIT(5) +#define CHIP_VENDOR_UMC_B_CUT BIT(6) // Chip version for ECO + +//for 92D +#define CHIP_92D BIT(8) +#define CHIP_92D_SINGLEPHY BIT(9) +#define CHIP_92D_C_CUT BIT(10) +#define CHIP_92D_D_CUT BIT(11) +#define CHIP_92D_E_CUT BIT(12) + +#define IS_NORMAL_CHIP(version) (((version) & NORMAL_CHIP) ? _TRUE : _FALSE) +#define IS_92C_SERIAL(version) (((version) & CHIP_92C) ? _TRUE : _FALSE) +#define IS_8723_SERIES(version) (((version) & CHIP_8723) ? _TRUE : _FALSE) +#define IS_92C_1T2R(version) (((version) & CHIP_92C) && ((version) & CHIP_92C_1T2R)) +#define IS_VENDOR_UMC(version) (((version) & CHIP_VENDOR_UMC) ? _TRUE : _FALSE) +#define IS_VENDOR_UMC_A_CUT(version) (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT6|BIT7)) ? _FALSE : _TRUE) : _FALSE) +#define IS_VENDOR_8723_A_CUT(version) (((version) & CHIP_VENDOR_UMC) ? (((version) & (BIT6)) ? _FALSE : _TRUE) : _FALSE) + +#define IS_92D_SINGLEPHY(version) ((version & CHIP_92D_SINGLEPHY) ? _TRUE : _FALSE) +#define IS_92D_C_CUT(version) ((version & CHIP_92D_C_CUT) ? _TRUE : _FALSE) +#define IS_92D_D_CUT(version) ((version & CHIP_92D_D_CUT) ? _TRUE : _FALSE) +#define IS_92D_E_CUT(version) ((version & CHIP_92D_E_CUT) ? _TRUE : _FALSE) + +// 20100707 Joseph: Add vendor information into chip version definition. +// 20100902 Roger: Add UMC B-Cut and RTL8723 chip info definition. +/* +| BIT 7 | BIT6 | BIT 5 | BIT 4 | BIT 3 | BIT 2 | BIT 1 | BIT 0 | ++--------+---------+---------------------- +------------ +----------- +------ +-----------------+ +|Reserved | UMC BCut |Manufacturer(TSMC/UMC) | TEST/NORMAL | 8723 Version | 8723? | 1T2R? | 88C/92C | +*/ +/* +92D chip ver: +BIT8: IS 92D +BIT9: single phy +BIT10: C-cut +BIT11: D-cut +BIT12: E-cut +*/ +typedef enum _VERSION_8192D{ + VERSION_TEST_CHIP_88C = 0x00, + VERSION_TEST_CHIP_92C = 0x01, + VERSION_NORMAL_TSMC_CHIP_88C = 0x10, + VERSION_NORMAL_TSMC_CHIP_92C = 0x11, + VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x13, + VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x30, + VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x31, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x33, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT = 0x34, + VERSION_NORMAL_UMC_CHIP_8723_1T1R_B_CUT = 0x3c, + VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x70, + VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x71, + VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x73, + VERSION_TEST_CHIP_92D_SINGLEPHY= 0x300, + VERSION_TEST_CHIP_92D_DUALPHY = 0x100, + VERSION_NORMAL_CHIP_92D_SINGLEPHY= 0x310, + VERSION_NORMAL_CHIP_92D_DUALPHY = 0x110, + VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x710, + VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x510, + VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0xB10, + VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x910, + VERSION_NORMAL_CHIP_92D_E_CUT_SINGLEPHY = 0x1310, + VERSION_NORMAL_CHIP_92D_E_CUT_DUALPHY = 0x1110, +}VERSION_8192D,*PVERSION_8192D; + + +//------------------------------------------------------------------------- +// Channel Plan +//------------------------------------------------------------------------- +enum ChannelPlan{ + CHPL_FCC = 0, + CHPL_IC = 1, + CHPL_ETSI = 2, + CHPL_SPAIN = 3, + CHPL_FRANCE = 4, + CHPL_MKK = 5, + CHPL_MKK1 = 6, + CHPL_ISRAEL = 7, + CHPL_TELEC = 8, + CHPL_GLOBAL = 9, + CHPL_WORLD = 10, +}; + +typedef struct _TxPowerInfo{ + u8 CCKIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_1SIndex[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40_2SIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20IndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 OFDMIndexDiff[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT40MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 HT20MaxOffset[RF90_PATH_MAX][CHANNEL_GROUP_MAX]; + u8 TSSI_A[3]; + u8 TSSI_B[3]; +}TxPowerInfo, *PTxPowerInfo; + +#define EFUSE_REAL_CONTENT_LEN 1024 +#define EFUSE_MAP_LEN 256 +#define EFUSE_MAX_SECTION 32 +#define EFUSE_MAX_SECTION_BASE 16 +// To prevent out of boundary programming case, leave 1byte and program full section +// 9bytes + 1byt + 5bytes and pre 1byte. +// For worst case: +// | 2byte|----8bytes----|1byte|--7bytes--| //92D +#define EFUSE_OOB_PROTECT_BYTES 18 // PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte. + +#ifdef CONFIG_PCI_HCI +struct hal_data_8192de +{ + VERSION_8192D VersionID; + + // add for 92D Phy mode/mac/Band mode + MACPHY_MODE_8192D MacPhyMode92D; + BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G + BAND_TYPE BandSet92D; + BOOLEAN bIsVS; + BOOLEAN bSupportRemoteWakeUp; + u8 AutoLoadStatusFor8192D; + + BOOLEAN bMasterOfDMSP; + BOOLEAN bSlaveOfDMSP; + + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + u32 IntrMask[2]; + u32 IntrMaskToSet[2]; + + u32 DisabledFunctions; + + //current WIFI_PHY values + u32 ReceiveConfig; + u32 TransmitConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + u16 BasicRateSet; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + // + // EEPROM setting. + // + u16 EEPROMVID; + u16 EEPROMDID; + u16 EEPROMSVID; + u16 EEPROMSMID; + u16 EEPROMChannelPlan; + u16 EEPROMVersion; + + u8 EEPROMCustomerID; + u8 EEPROMBoardType; + u8 EEPROMRegulatory; + + u8 EEPROMThermalMeter; + + u8 EEPROMC9; + u8 EEPROMCC; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER_2G]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + + u8 CrystalCap; // CrystalCap. + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + u8 InternalPA5G[2]; //pathA / pathB + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + BOOLEAN bPhyValueInitReady; + + BOOLEAN bTXPowerDataReadFromEEPORM; + + BOOLEAN bInSetPower; + + //RDG enable + BOOLEAN bRDGEnable; + + BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress + BOOLEAN bNeedIQK; + + BOOLEAN bLCKInProgress; + + BOOLEAN bEarlyModeEnable; + +#if 1 + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; +#else + //regc80regc94regc4cregc88regc9cregc14regca0regc1cregc78 + u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM]; + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel. +#endif + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + + struct dm_priv dmpriv; + + u8 bInterruptMigration; + + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u16 RegRRSR; + + u16 EfuseUsedBytes; + u8 RTSInitRate; // 2010.11.24.by tynli. +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192de HAL_DATA_TYPE, *PHAL_DATA_TYPE; + +// +// Function disabled. +// +#define DF_TX_BIT BIT0 +#define DF_RX_BIT BIT1 +#define DF_IO_BIT BIT2 +#define DF_IO_D3_BIT BIT3 + +#define RT_DF_TYPE u32 +#define RT_DISABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions |= ((RT_DF_TYPE)(__FuncBits))) +#define RT_ENABLE_FUNC(__pAdapter, __FuncBits) ((__pAdapter)->DisabledFunctions &= (~((RT_DF_TYPE)(__FuncBits)))) +#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) ) + +void InterruptRecognized8192DE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent); +VOID UpdateInterruptMask8192DE(PADAPTER Adapter, u32 AddMSR, u32 RemoveMSR); +#endif + +#ifdef CONFIG_USB_HCI + +//should be renamed and moved to another file +typedef enum _INTERFACE_SELECT_8192DUSB{ + INTF_SEL0_USB = 0, // USB + INTF_SEL1_MINICARD = 1, // Minicard + INTF_SEL2_EKB_PRO = 2, // Eee keyboard proprietary + INTF_SEL3_PRO = 3, // Customized proprietary +} INTERFACE_SELECT_8192DUSB, *PINTERFACE_SELECT_8192DUSB; + +typedef INTERFACE_SELECT_8192DUSB INTERFACE_SELECT_USB; + +struct hal_data_8192du +{ + VERSION_8192D VersionID; + + // add for 92D Phy mode/mac/Band mode + MACPHY_MODE_8192D MacPhyMode92D; + BAND_TYPE CurrentBandType92D; //0:2.4G, 1:5G + BAND_TYPE BandSet92D; + BOOLEAN bIsVS; + + BOOLEAN bSupportRemoteWakeUp; + + BOOLEAN bMasterOfDMSP; + BOOLEAN bSlaveOfDMSP; +#if (RTL8192D_DUAL_MAC_MODE_SWITCH == 1) + PADAPTER BuddyAdapter; +#endif + + u16 CustomerID; + + u16 FirmwareVersion; + u16 FirmwareVersionRev; + u16 FirmwareSubVersion; + + //current WIFI_PHY values + u32 ReceiveConfig; + WIRELESS_MODE CurrentWirelessMode; + HT_CHANNEL_WIDTH CurrentChannelBW; + u8 CurrentChannel; + u8 nCur40MhzPrimeSC;// Control channel sub-carrier + u16 BasicRateSet; + + INTERFACE_SELECT_8192DUSB InterfaceSel; + + //rf_ctrl + u8 rf_chip; + u8 rf_type; + u8 NumTotalRFPath; + + // + // EEPROM setting. + // + u8 EEPROMVersion; + u16 EEPROMVID; + u16 EEPROMPID; + u16 EEPROMSVID; + u16 EEPROMSDID; + u8 EEPROMCustomerID; + u8 EEPROMSubCustomerID; + u8 EEPROMRegulatory; + + u8 EEPROMThermalMeter; + + u8 EEPROMC9; + u8 EEPROMCC; + + u8 TxPwrLevelCck[RF90_PATH_MAX][CHANNEL_MAX_NUMBER_2G]; + u8 TxPwrLevelHT40_1S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrLevelHT40_2S[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr + u8 TxPwrHt20Diff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff + u8 TxPwrLegacyHtDiff[RF90_PATH_MAX][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff + // For power group + u8 PwrGroupHT20[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + u8 PwrGroupHT40[RF90_PATH_MAX][CHANNEL_MAX_NUMBER]; + + u8 LegacyHTTxPowerDiff;// Legacy to HT rate power diff + + u8 CrystalCap; // CrystalCap. + +#ifdef CONFIG_BT_COEXIST + struct btcoexist_priv bt_coexist; +#endif + + // Read/write are allow for following hardware information variables + u8 framesync; + u32 framesyncC34; + u8 framesyncMonitor; + u8 DefaultInitialGain[4]; + u8 pwrGroupCnt; + u32 MCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16]; + u32 CCKTxPowerLevelOriginalOffset; + + u32 AntennaTxPath; // Antenna path Tx + u32 AntennaRxPath; // Antenna path Rx + u8 BluetoothCoexist; + u8 ExternalPA; + u8 InternalPA5G[2]; //pathA / pathB + + //u32 LedControlNum; + //u32 LedControlMode; + //u32 TxPowerTrackControl; + u8 b1x1RecvCombine; // for 1T1R receive combining + + u8 bCurrentTurboEDCA; + u32 AcParam_BE; //Original parameter for BE, use for EDCA turbo. + + //vivi, for tx power tracking, 20080407 + //u16 TSSI_13dBm; + //u32 Pwr_Track; + // The current Tx Power Level + u8 CurrentCckTxPwrIdx; + u8 CurrentOfdm24GTxPwrIdx; + + BB_REGISTER_DEFINITION_T PHYRegDef[4]; //Radio A/B/C/D + + BOOLEAN bRFPathRxEnable[4]; // We support 4 RF path now. + + u32 RfRegChnlVal[2]; + + u8 bCckHighPower; + + BOOLEAN bPhyValueInitReady; + + BOOLEAN bTXPowerDataReadFromEEPORM; + + BOOLEAN bInSetPower; + + //RDG enable + BOOLEAN bRDGEnable; + + BOOLEAN bLoadIMRandIQKSettingFor2G;// True if IMR or IQK have done for 2.4G in scan progress + BOOLEAN bNeedIQK; + + BOOLEAN bLCKInProgress; + + BOOLEAN bEarlyModeEnable; + +#if 1 + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; +#else + //regc80regc94regc4cregc88regc9cregc14regca0regc1cregc78 + u4Byte IQKMatrixReg[IQK_Matrix_REG_NUM]; + IQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM]; // 1->2G,24->5G 20M channel,21->5G 40M channel. +#endif + + //for host message to fw + u8 LastHMEBoxNum; + + u8 fw_ractrl; + u8 RegTxPause; + // Beacon function related global variable. + u32 RegBcnCtrlVal; + u8 RegFwHwTxQCtrl; + u8 RegReg542; + + struct dm_priv dmpriv; + + u8 FwRsvdPageStartOffset; //2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ. + + //Query RF by FW + BOOLEAN bReadRFbyFW; + + // For 92C USB endpoint setting + // + + u32 UsbBulkOutSize; + + int RtBulkOutPipe[3]; + int RtBulkInPipe; + int RtIntInPipe; + + // Add for dual MAC 0--Mac0 1--Mac1 + u32 interfaceIndex; + + u8 OutEpQueueSel; + u8 OutEpNumber; + + u8 Queue2EPNum[8];//for out endpoint number mapping + +#ifdef CONFIG_USB_TX_AGGREGATION + u8 UsbTxAggMode; + u8 UsbTxAggDescNum; +#endif +#ifdef CONFIG_USB_RX_AGGREGATION + u16 HwRxPageSize; // Hardware setting + u32 MaxUsbRxAggBlock; + + USB_RX_AGG_MODE UsbRxAggMode; + u8 UsbRxAggBlockCount; // USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed + u8 UsbRxAggBlockTimeout; + u8 UsbRxAggPageCount; // 8192C DMA page count + u8 UsbRxAggPageTimeout; +#endif + + u16 RegRRSR; + + u16 EfuseUsedBytes; + u8 RTSInitRate; // 2010.11.24.by tynli. +#ifdef CONFIG_P2P + struct P2P_PS_Offload_t p2p_ps_offload; +#endif //CONFIG_P2P +}; + +typedef struct hal_data_8192du HAL_DATA_TYPE, *PHAL_DATA_TYPE; +#endif + +#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) +#define GET_RF_TYPE(priv) (GET_HAL_DATA(priv)->rf_type) + +int FirmwareDownload92D(IN PADAPTER Adapter); +VOID rtl8192d_FirmwareSelfReset(IN PADAPTER Adapter); +void rtl8192d_ReadChipVersion(IN PADAPTER Adapter); +VOID rtl8192d_ReadChannelPlan(PADAPTER Adapter, u8* PROMContent, BOOLEAN AutoLoadFail); +VOID rtl8192d_ReadTxPowerInfo(PADAPTER Adapter, u8* PROMContent, BOOLEAN AutoLoadFail); +VOID rtl8192d_ResetDualMacSwitchVariables(IN PADAPTER Adapter); +u8 GetEEPROMSize8192D(PADAPTER Adapter); +void rtl8192d_HalSetBrateCfg(PADAPTER Adapter, u8 *mBratesOS, u16 *pBrateCfg); +BOOLEAN PHY_CheckPowerOffFor8192D(PADAPTER Adapter); +VOID PHY_SetPowerOnFor8192D(PADAPTER Adapter); +void PHY_ConfigMacPhyMode92D(PADAPTER Adapter); +void rtl8192d_free_hal_data(_adapter * padapter); +void rtl8192d_set_hal_ops(struct hal_ops *pHalFunc); + +#endif + +#ifdef CONFIG_MP_INCLUDED + + +extern void Hal_SetAntenna(PADAPTER pAdapter); +extern void Hal_SetBandwidth(PADAPTER pAdapter); + +extern void Hal_SetTxPower(PADAPTER pAdapter); +extern void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); +extern void Hal_SetSingleToneTx ( PADAPTER pAdapter , u8 bStart ); +extern void Hal_SetSingleCarrierTx (PADAPTER pAdapter, u8 bStart); +extern void Hal_SetContinuousTx (PADAPTER pAdapter, u8 bStart); +extern void Hal_SetBandwidth(PADAPTER pAdapter); + +extern void Hal_SetDataRate(PADAPTER pAdapter); +extern void Hal_SetChannel(PADAPTER pAdapter); +extern void Hal_SetAntennaPathPower(PADAPTER pAdapter); +extern s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther); +extern s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable); +extern void Hal_GetPowerTracking(PADAPTER padapter, u8 * enable); +extern void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value); +extern void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter); +extern void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14); +extern void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven); +extern void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 * TxPower); +extern void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 * TxPower); +extern void Hal_TriggerRFThermalMeter(PADAPTER pAdapter); +extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter); +extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart); +extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart); + + +#endif //end CONFIG_MP_INCLUDED + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h new file mode 100755 index 000000000000..95e20ac8f8a6 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_led.h @@ -0,0 +1,44 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTL8192D_LED_H_ +#define __RTL8192D_LED_H_ + +#include +#include +#include + + +//================================================================================ +// Interface to manipulate LED objects. +//================================================================================ +#ifdef CONFIG_USB_HCI +void rtl8192du_InitSwLeds(_adapter *padapter); +void rtl8192du_DeInitSwLeds(_adapter *padapter); +#endif + +#ifdef CONFIG_PCI_HCI +void rtl8192de_gen_RefreshLedState(PADAPTER Adapter); +void rtl8192de_InitSwLeds(_adapter *padapter); +void rtl8192de_DeInitSwLeds(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h new file mode 100755 index 000000000000..8641ddcdbcd7 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_recv.h @@ -0,0 +1,182 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192D_RECV_H_ +#define _RTL8192D_RECV_H_ + +#include +#include +#include + + +#ifdef PLATFORM_OS_XP + #ifdef CONFIG_SDIO_HCI + #define NR_RECVBUFF 1024//512//128 + #else + #define NR_RECVBUFF (16) + #endif +#elif defined(PLATFORM_OS_CE) + #ifdef CONFIG_SDIO_HCI + #define NR_RECVBUFF (128) + #else + #define NR_RECVBUFF (4) + #endif +#else + #define NR_RECVBUFF (4) + #define NR_PREALLOC_RECV_SKB (8) +#endif + + + +#define RECV_BLK_SZ 512 +#define RECV_BLK_CNT 16 +#define RECV_BLK_TH RECV_BLK_CNT + +#if defined(CONFIG_USB_HCI) + +#ifdef PLATFORM_OS_CE +#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k +#else + #ifndef CONFIG_MINIMAL_MEMORY_USAGE + //#define MAX_RECVBUF_SZ (32768) // 32k + //#define MAX_RECVBUF_SZ (16384) //16K + //#define MAX_RECVBUF_SZ (10240) //10K + #define MAX_RECVBUF_SZ (15360) // 15k < 16k + #else + #define MAX_RECVBUF_SZ (4000) // about 4K + #endif +#endif + +#elif defined(CONFIG_PCI_HCI) +#ifndef CONFIG_MINIMAL_MEMORY_USAGE + #define MAX_RECVBUF_SZ (9100) +#else + #define MAX_RECVBUF_SZ (4000) // about 4K +#endif + +#define RX_MPDU_QUEUE 0 +#define RX_CMD_QUEUE 1 +#define RX_MAX_QUEUE 2 +#endif + +#define RECV_BULK_IN_ADDR 0x80 +#define RECV_INT_IN_ADDR 0x81 + +#define PHY_RSSI_SLID_WIN_MAX 100 +#define PHY_LINKQUALITY_SLID_WIN_MAX 20 + +struct phy_stat +{ + unsigned int phydw0; + + unsigned int phydw1; + + unsigned int phydw2; + + unsigned int phydw3; + + unsigned int phydw4; + + unsigned int phydw5; + + unsigned int phydw6; + + unsigned int phydw7; +}; + +typedef struct _Phy_OFDM_Rx_Status_Report_8192cd +{ + unsigned char trsw_gain_X[4]; + unsigned char pwdb_all; + unsigned char cfosho_X[4]; + unsigned char cfotail_X[4]; + unsigned char rxevm_X[2]; + unsigned char rxsnr_X[4]; + unsigned char pdsnr_X[2]; + unsigned char csi_current_X[2]; + unsigned char csi_target_X[2]; + unsigned char sigevm; + unsigned char max_ex_pwr; +//#ifdef RTL8192SE +#ifdef CONFIG_LITTLE_ENDIAN + unsigned char ex_intf_flg:1; + unsigned char sgi_en:1; + unsigned char rxsc:2; + //unsigned char rsvd:4; + unsigned char idle_long:1; + unsigned char r_ant_train_en:1; + unsigned char ANTSELB:1; + unsigned char ANTSEL:1; +#else // _BIG_ENDIAN_ + //unsigned char rsvd:4; + unsigned char ANTSEL:1; + unsigned char ANTSELB:1; + unsigned char r_ant_train_en:1; + unsigned char idle_long:1; + unsigned char rxsc:2; + unsigned char sgi_en:1; + unsigned char ex_intf_flg:1; +#endif +//#else // RTL8190, RTL8192E +// unsigned char sgi_en; +// unsigned char rxsc_sgien_exflg; +//#endif +}__attribute__ ((packed)) PHY_STS_OFDM_8192CD_T,PHY_RX_DRIVER_INFO_8192CD; + +typedef struct _Phy_CCK_Rx_Status_Report_8192cd +{ + /* For CCK rate descriptor. This is a signed 8:1 variable. LSB bit presend + 0.5. And MSB 7 bts presend a signed value. Range from -64~+63.5. */ + u8 adc_pwdb_X[4]; + u8 SQ_rpt; + u8 cck_agc_rpt; +} PHY_STS_CCK_8192CD_T; + +// Rx smooth factor +#define Rx_Smooth_Factor (20) + +#ifdef CONFIG_USB_HCI +typedef struct _INTERRUPT_MSG_FORMAT_EX{ + unsigned int C2H_MSG0; + unsigned int C2H_MSG1; + unsigned int C2H_MSG2; + unsigned int C2H_MSG3; + unsigned int HISR; // from HISR Reg0x124, read to clear + unsigned int HISRE;// from HISRE Reg0x12c, read to clear + unsigned int MSG_EX; +}INTERRUPT_MSG_FORMAT_EX,*PINTERRUPT_MSG_FORMAT_EX; + +void rtl8192du_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf); +int rtl8192du_init_recv_priv(_adapter * padapter); +void rtl8192du_free_recv_priv(_adapter * padapter); +void rtl8192du_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +#ifdef CONFIG_PCI_HCI +int rtl8192de_init_recv_priv(_adapter * padapter); +void rtl8192de_free_recv_priv(_adapter * padapter); +void rtl8192de_update_recvframe_attrib_from_recvstat(union recv_frame *precvframe, struct recv_stat *prxstat); +#endif + +void rtl8192d_query_rx_phy_status(union recv_frame *prframe, struct phy_stat *pphy_stat, BOOLEAN bPacketMatchBSSID); +void rtl8192d_process_phy_info(_adapter *padapter, void *prframe); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h new file mode 100755 index 000000000000..eea18b94087b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_rf.h @@ -0,0 +1,98 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/****************************************************************************** + * + * + * Module: rtl8192d_rf.h ( Header File) + * + * Note: Collect every HAL RF type exter API or constant. + * + * Function: + * + * Export: + * + * Abbrev: + * + * History: + * Data Who Remark + * + * 09/25/2008 MHC Create initial version. + * + * +******************************************************************************/ +#ifndef _RTL8192D_RF_H_ +#define _RTL8192D_RF_H_ +/* Check to see if the file has been included already. */ + + +/*--------------------------Define Parameters-------------------------------*/ + +// +// For RF 6052 Series +// +#define RF6052_MAX_TX_PWR 0x3F +#define RF6052_MAX_REG 0x3F +#define RF6052_MAX_PATH 2 +/*--------------------------Define Parameters-------------------------------*/ + + +/*------------------------------Define structure----------------------------*/ + +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +/*------------------------Export global variable----------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + +/*------------------------Export Marco Definition---------------------------*/ + + +/*--------------------------Exported Function prototype---------------------*/ + +// +// RF RL6052 Series API +// +void rtl8192d_RF_ChangeTxPath( IN PADAPTER Adapter, + IN u16 DataRate); +void rtl8192d_PHY_RF6052SetBandwidth( + IN PADAPTER Adapter, + IN HT_CHANNEL_WIDTH Bandwidth); +VOID rtl8192d_PHY_RF6052SetCckTxPower( + IN PADAPTER Adapter, + IN u8* pPowerlevel); +VOID rtl8192d_PHY_RF6052SetOFDMTxPower( + IN PADAPTER Adapter, + IN u8* pPowerLevel, + IN u8 Channel); +int PHY_RF6052_Config8192D( IN PADAPTER Adapter ); + +BOOLEAN rtl8192d_PHY_EnableAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); + +void rtl8192d_PHY_PowerDownAnotherPHY(IN PADAPTER Adapter, IN BOOLEAN bMac0); + + +/*--------------------------Exported Function prototype---------------------*/ + + +#endif/* End of HalRf.h */ + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h new file mode 100755 index 000000000000..53b592ca232b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_spec.h @@ -0,0 +1,1862 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + +#ifndef __RTL8192D_SPEC_H__ +#define __RTL8192D_SPEC_H__ + +#include + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + + +//============================================================ +// 8192D Regsiter offset definition +//============================================================ + + +//============================================================ +// +//============================================================ + +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- +#define REG_SYS_ISO_CTRL 0x0000 +#define REG_SYS_FUNC_EN 0x0002 +#define REG_APS_FSMCO 0x0004 +#define REG_SYS_CLKR 0x0008 +#define REG_9346CR 0x000A +#define REG_EE_VPD 0x000C +#define REG_AFE_MISC 0x0010 +#define REG_SPS0_CTRL 0x0011 +#define REG_POWER_OFF_IN_PROCESS 0x0017 +#define REG_SPS_OCP_CFG 0x0018 +#define REG_RSV_CTRL 0x001C +#define REG_RF_CTRL 0x001F +#define REG_LDOA15_CTRL 0x0020 +#define REG_LDOV12D_CTRL 0x0021 +#define REG_LDOHCI12_CTRL 0x0022 +#define REG_LPLDO_CTRL 0x0023 +#define REG_AFE_XTAL_CTRL 0x0024 +#define REG_AFE_PLL_CTRL 0x0028 +#define REG_MAC_PHY_CTRL 0x002c //for 92d, DMDP,SMSP,DMSP contrl +#define REG_EFUSE_CTRL 0x0030 +#define REG_EFUSE_TEST 0x0034 +#define REG_PWR_DATA 0x0038 +#define REG_CAL_TIMER 0x003C +#define REG_ACLK_MON 0x003E +#define REG_GPIO_MUXCFG 0x0040 +//#define REG_GPIO_MUXCFG 0x0041 +#define REG_GPIO_IO_SEL 0x0042 +#define REG_MAC_PINMUX_CFG 0x0043 +#define REG_GPIO_PIN_CTRL 0x0044 +#define REG_GPIO_INTM 0x0048 +#define REG_LEDCFG0 0x004C +#define REG_LEDCFG1 0x004D +#define REG_LEDCFG2 0x004E +#define REG_LEDCFG3 0x004F +#define REG_FSIMR 0x0050 +#define REG_FSISR 0x0054 + +#define REG_MCUFWDL 0x0080 + +#define REG_HMEBOX_EXT_0 0x0088 +#define REG_HMEBOX_EXT_1 0x008A +#define REG_HMEBOX_EXT_2 0x008C +#define REG_HMEBOX_EXT_3 0x008E + +#define REG_BIST_SCAN 0x00D0 +#define REG_BIST_RPT 0x00D4 +#define REG_BIST_ROM_RPT 0x00D8 +#define REG_USB_SIE_INTF 0x00E0 +#define REG_PCIE_MIO_INTF 0x00E4 +#define REG_PCIE_MIO_INTD 0x00E8 +#define REG_HPON_FSM 0x00EC +#define REG_SYS_CFG 0x00F0 +#define REG_MAC_PHY_CTRL_NORMAL 0x00f8 + +#define REG_MAC0 0x0081 +#define REG_MAC1 0x0053 +#define FW_MAC0_ready 0x18 +#define FW_MAC1_ready 0x1A +#define MAC0_ON BIT7 +#define MAC1_ON BIT0 +#define mac0_ready BIT0 +#define mac1_ready BIT0 + + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- +#define REG_CR 0x0100 +#define REG_PBP 0x0104 +#define REG_TRXDMA_CTRL 0x010C +#define REG_TRXFF_BNDY 0x0114 +#define REG_TRXFF_STATUS 0x0118 +#define REG_RXFF_PTR 0x011C +#define REG_HIMR 0x0120 +#define REG_HISR 0x0124 +#define REG_HIMRE 0x0128 +#define REG_HISRE 0x012C +#define REG_CPWM 0x012F +#define REG_FWIMR 0x0130 +#define REG_FWISR 0x0134 +#define REG_FTIMR 0x0138 +#define REG_PKTBUF_DBG_CTRL 0x0140 +#define REG_PKTBUF_DBG_DATA_L 0x0144 +#define REG_PKTBUF_DBG_DATA_H 0x0148 + +#define REG_TC0_CTRL 0x0150 +#define REG_TC1_CTRL 0x0154 +#define REG_TC2_CTRL 0x0158 +#define REG_TC3_CTRL 0x015C +#define REG_TC4_CTRL 0x0160 +#define REG_TCUNIT_BASE 0x0164 +#define REG_MBIST_START 0x0174 +#define REG_MBIST_DONE 0x0178 +#define REG_MBIST_FAIL 0x017C +#define REG_C2HEVT_MSG_NORMAL 0x01A0 +#define REG_C2HEVT_CLEAR 0x01AF +#define REG_C2HEVT_MSG_TEST 0x01B8 +#define REG_MCUTST_1 0x01c0 +#define REG_FMETHR 0x01C8 +#define REG_HMETFR 0x01CC +#define REG_HMEBOX_0 0x01D0 +#define REG_HMEBOX_1 0x01D4 +#define REG_HMEBOX_2 0x01D8 +#define REG_HMEBOX_3 0x01DC + +#define REG_LLT_INIT 0x01E0 +#define REG_BB_ACCEESS_CTRL 0x01E8 +#define REG_BB_ACCESS_DATA 0x01EC + + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +#define REG_RQPN 0x0200 +#define REG_FIFOPAGE 0x0204 +#define REG_TDECTRL 0x0208 +#define REG_TXDMA_OFFSET_CHK 0x020C +#define REG_TXDMA_STATUS 0x0210 +#define REG_RQPN_NPQ 0x0214 + +//----------------------------------------------------- +// +// 0x0280h ~ 0x02FFh RXDMA Configuration +// +//----------------------------------------------------- +#define REG_RXDMA_AGG_PG_TH 0x0280 +#define REG_RXPKT_NUM 0x0284 +#define REG_RXDMA_STATUS 0x0288 + + +//----------------------------------------------------- +// +// 0x0300h ~ 0x03FFh PCIe +// +//----------------------------------------------------- +#define REG_PCIE_CTRL_REG 0x0300 +#define REG_INT_MIG 0x0304 // Interrupt Migration +#define REG_BCNQ_DESA 0x0308 // TX Beacon Descriptor Address +#define REG_HQ_DESA 0x0310 // TX High Queue Descriptor Address +#define REG_MGQ_DESA 0x0318 // TX Manage Queue Descriptor Address +#define REG_VOQ_DESA 0x0320 // TX VO Queue Descriptor Address +#define REG_VIQ_DESA 0x0328 // TX VI Queue Descriptor Address +#define REG_BEQ_DESA 0x0330 // TX BE Queue Descriptor Address +#define REG_BKQ_DESA 0x0338 // TX BK Queue Descriptor Address +#define REG_RX_DESA 0x0340 // RX Queue Descriptor Address +#define REG_DBI 0x0348 // Backdoor REG for Access Configuration +//sherry added for DBI Read/Write 20091126 +#define REG_DBI_WDATA 0x0348 // Backdoor REG for Access Configuration +#define REG_DBI_RDATA 0x034C //Backdoor REG for Access Configuration +#define REG_DBI_CTRL 0x0350 //Backdoor REG for Access Configuration +#define REG_DBI_FLAG 0x0352 //Backdoor REG for Access Configuration#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_MDIO 0x0354 // MDIO for Access PCIE PHY +#define REG_DBG_SEL 0x0360 // Debug Selection Register +#define REG_PCIE_HRPWM 0x0361 //PCIe RPWM +#define REG_PCIE_HCPWM 0x0363 //PCIe CPWM +#define REG_UART_CTRL 0x0364 // UART Control +#define REG_UART_TX_DESA 0x0370 // UART TX Descriptor Address +#define REG_UART_RX_DESA 0x0378 // UART Rx Descriptor Address + + +// spec version 11 +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +#define REG_VOQ_INFORMATION 0x0400 +#define REG_VIQ_INFORMATION 0x0404 +#define REG_BEQ_INFORMATION 0x0408 +#define REG_BKQ_INFORMATION 0x040C +#define REG_MGQ_INFORMATION 0x0410 +#define REG_HGQ_INFORMATION 0x0414 +#define REG_BCNQ_INFORMATION 0x0418 + + +#define REG_CPU_MGQ_INFORMATION 0x041C +#define REG_FWHW_TXQ_CTRL 0x0420 +#define REG_HWSEQ_CTRL 0x0423 +#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 +#define REG_TXPKTBUF_MGQ_BDNY 0x0425 +#define REG_MULTI_BCNQ_EN 0x0426 +#define REG_MULTI_BCNQ_OFFSET 0x0427 +#define REG_SPEC_SIFS 0x0428 +#define REG_RL 0x042A +#define REG_DARFRC 0x0430 +#define REG_RARFRC 0x0438 +#define REG_RRSR 0x0440 +#define REG_ARFR0 0x0444 +#define REG_ARFR1 0x0448 +#define REG_ARFR2 0x044C +#define REG_ARFR3 0x0450 +#define REG_AGGLEN_LMT 0x0458 +#define REG_AMPDU_MIN_SPACE 0x045C +#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D +#define REG_FAST_EDCA_CTRL 0x0460 +#define REG_RD_RESP_PKT_TH 0x0463 +#define REG_INIRTS_RATE_SEL 0x0480 +#define REG_INIDATA_RATE_SEL 0x0484 +#define REG_POWER_STATUS 0x04A4 +#define REG_POWER_STAGE1 0x04B4 +#define REG_POWER_STAGE2 0x04B8 +#define REG_PKT_LIFE_TIME 0x04C0 +#define REG_STBC_SETTING 0x04C4 +#define REG_PROT_MODE_CTRL 0x04C8 +#define REG_MAX_AGGR_NUM 0x04CA +#define REG_RTS_MAX_AGGR_NUM 0x04CB +#define REG_BAR_MODE_CTRL 0x04CC +#define REG_RA_TRY_RATE_AGG_LMT 0x04CF +#define REG_EARLY_MODE_CONTROL 0x04D0 +#define REG_NQOS_SEQ 0x04DC +#define REG_QOS_SEQ 0x04DE +#define REG_NEED_CPU_HANDLE 0x04E0 +#define REG_PKT_LOSE_RPT 0x04E1 +#define REG_PTCL_ERR_STATUS 0x04E2 +#define REG_DUMMY 0x04FC + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- +#define REG_EDCA_VO_PARAM 0x0500 +#define REG_EDCA_VI_PARAM 0x0504 +#define REG_EDCA_BE_PARAM 0x0508 +#define REG_EDCA_BK_PARAM 0x050C +#define REG_BCNTCFG 0x0510 +#define REG_PIFS 0x0512 +#define REG_RDG_PIFS 0x0513 +#define REG_SIFS_CTX 0x0514 +#define REG_SIFS_TRX 0x0516 +#define REG_AGGR_BREAK_TIME 0x051A +#define REG_SLOT 0x051B +#define REG_TX_PTCL_CTRL 0x0520 +#define REG_TXPAUSE 0x0522 +#define REG_DIS_TXREQ_CLR 0x0523 +#define REG_RD_CTRL 0x0524 +#define REG_TBTT_PROHIBIT 0x0540 +#define REG_RD_NAV_NXT 0x0544 +#define REG_NAV_PROT_LEN 0x0546 +#define REG_BCN_CTRL 0x0550 +#define REG_USTIME_TSF 0x0551 +#define REG_MBID_NUM 0x0552 +#define REG_DUAL_TSF_RST 0x0553 +#define REG_BCN_INTERVAL 0x0554 // The same as REG_MBSSID_BCN_SPACE +#define REG_MBSSID_BCN_SPACE 0x0554 +#define REG_DRVERLYINT 0x0558 +#define REG_BCNDMATIM 0x0559 +#define REG_ATIMWND 0x055A +#define REG_BCN_MAX_ERR 0x055D +#define REG_RXTSF_OFFSET_CCK 0x055E +#define REG_RXTSF_OFFSET_OFDM 0x055F +#define REG_TSFTR 0x0560 +#define REG_INIT_TSFTR 0x0564 +#define REG_PSTIMER 0x0580 +#define REG_TIMER0 0x0584 +#define REG_TIMER1 0x0588 +#define REG_ACMHWCTRL 0x05C0 +#define REG_ACMRSTCTRL 0x05C1 +#define REG_ACMAVG 0x05C2 +#define REG_VO_ADMTIME 0x05C4 +#define REG_VI_ADMTIME 0x05C6 +#define REG_BE_ADMTIME 0x05C8 +#define REG_EDCA_RANDOM_GEN 0x05CC +#define REG_SCH_TXCMD 0x05D0 + +#define REG_DMC 0x05F0 //Dual MAC Co-Existence Register + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- +#define REG_APSD_CTRL 0x0600 +#define REG_BWOPMODE 0x0603 +#define REG_TCR 0x0604 +#define REG_RCR 0x0608 +#define REG_RX_PKT_LIMIT 0x060C +#define REG_RX_DLK_TIME 0x060D +#define REG_RX_DRVINFO_SZ 0x060F + +#define REG_MACID 0x0610 +#define REG_BSSID 0x0618 +#define REG_MAR 0x0620 +#define REG_MBIDCAMCFG 0x0628 + +#define REG_USTIME_EDCA 0x0638 +#define REG_MAC_SPEC_SIFS 0x063A +#define REG_RESP_SIFS_CCK 0x063C +#define REG_RESP_SIFS_OFDM 0x063E +#define REG_ACKTO 0x0640 +#define REG_CTS2TO 0x0641 +#define REG_EIFS 0x0642 + + +//WMA, BA, CCX +#define REG_NAV_CTRL 0x0650 +#define REG_BACAMCMD 0x0654 +#define REG_BACAMCONTENT 0x0658 +#define REG_LBDLY 0x0660 +#define REG_FWDLY 0x0661 +#define REG_RXERR_RPT 0x0664 +#define REG_WMAC_TRXPTCL_CTL 0x0668 + + +// Security +#define REG_CAMCMD 0x0670 +#define REG_CAMWRITE 0x0674 +#define REG_CAMREAD 0x0678 +#define REG_CAMDBG 0x067C +#define REG_SECCFG 0x0680 + +// Power +#define REG_WOW_CTRL 0x0690 +#define REG_PSSTATUS 0x0691 +#define REG_PS_RX_INFO 0x0692 +#define REG_LPNAV_CTRL 0x0694 +#define REG_WKFMCAM_CMD 0x0698 +#define REG_WKFMCAM_RWD 0x069C +#define REG_RXFLTMAP0 0x06A0 +#define REG_RXFLTMAP1 0x06A2 +#define REG_RXFLTMAP2 0x06A4 +#define REG_BCN_PSR_RPT 0x06A8 +#define REG_CALB32K_CTRL 0x06AC +#define REG_PKT_MON_CTRL 0x06B4 +#define REG_BT_COEX_TABLE 0x06C0 +#define REG_WMAC_RESP_TXINFO 0x06D8 + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +// for 92DU high_Queue low_Queue Normal_Queue select +#define REG_USB_High_NORMAL_Queue_Select_MAC0 0xFE44 +//#define REG_USB_LOW_Queue_Select_MAC0 0xFE45 +#define REG_USB_High_NORMAL_Queue_Select_MAC1 0xFE47 +//#define REG_USB_LOW_Queue_Select_MAC1 0xFE48 + +// For test chip +#define REG_TEST_USB_TXQS 0xFE48 +#define REG_TEST_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_TEST_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_TEST_SIE_OPTIONAL 0xFE64 +#define REG_TEST_SIE_CHIRP_K 0xFE65 +#define REG_TEST_SIE_PHY 0xFE66 // 0xFE66~0xFE6B +#define REG_TEST_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_TEST_SIE_STRING 0xFE80 // 0xFE80~0xFEB9 + + +// For normal chip +#define REG_NORMAL_SIE_VID 0xFE60 // 0xFE60~0xFE61 +#define REG_NORMAL_SIE_PID 0xFE62 // 0xFE62~0xFE63 +#define REG_NORMAL_SIE_OPTIONAL 0xFE64 +#define REG_NORMAL_SIE_EP 0xFE65 // 0xFE65~0xFE67 +#define REG_NORMAL_SIE_PHY 0xFE68 // 0xFE68~0xFE6B +#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 // 0xFE70~0xFE75 +#define REG_NORMAL_SIE_STRING 0xFE80 // 0xFE80~0xFEDF + + +//----------------------------------------------------- +// +// Redifine 8192C register definition for compatibility +// +//----------------------------------------------------- + +// TODO: use these definition when using REG_xxx naming rule. +// NOTE: DO NOT Remove these definition. Use later. + +#define SYS_ISO_CTRL REG_SYS_ISO_CTRL // System Isolation Interface Control. +#define SYS_FUNC_EN REG_SYS_FUNC_EN // System Function Enable. +#define SYS_CLK REG_SYS_CLKR +#define CR9346 REG_9346CR // 93C46/93C56 Command Register. +#define EFUSE_CTRL REG_EFUSE_CTRL // E-Fuse Control. +#define EFUSE_TEST REG_EFUSE_TEST // E-Fuse Test. +#define MSR (REG_CR + 2) // Media Status register +#define ISR REG_HISR +#define TSFR REG_TSFTR // Timing Sync Function Timer Register. + +#define MACIDR0 REG_MACID // MAC ID Register, Offset 0x0050-0x0053 +#define MACIDR4 (REG_MACID + 4) // MAC ID Register, Offset 0x0054-0x0055 + +#define PBP REG_PBP + +// Redifine MACID register, to compatible prior ICs. +#define IDR0 MACIDR0 +#define IDR4 MACIDR4 + + +// +// 9. Security Control Registers (Offset: ) +// +#define RWCAM REG_CAMCMD //IN 8190 Data Sheet is called CAMcmd +#define WCAMI REG_CAMWRITE // Software write CAM input content +#define RCAMO REG_CAMREAD // Software read/write CAM config +#define CAMDBG REG_CAMDBG +#define SECR REG_SECCFG //Security Configuration Register + +// Unused register +#define UnusedRegister 0x1BF +#define DCAM UnusedRegister +#define PSR UnusedRegister +#define BBAddr UnusedRegister +#define PhyDataR UnusedRegister + +#define InvalidBBRFValue 0x12345678 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A + +//---------------------------------------------------------------------------- +// 8192C Cmd9346CR bits (Offset 0xA, 16bit) +//---------------------------------------------------------------------------- +#define CmdEEPROM_En BIT5 // EEPROM enable when set 1 +#define CmdEERPOMSEL BIT4 // System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 +#define Cmd9346CR_9356SEL BIT4 +#define AutoLoadEEPROM (CmdEEPROM_En|CmdEERPOMSEL) +#define AutoLoadEFUSE CmdEEPROM_En + +// 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) +//---------------------------------------------------------------------------- +#define GPIOSEL_GPIO 0 +#define GPIOSEL_ENBT BIT5 + +//---------------------------------------------------------------------------- +// 8192C GPIO PIN Control Register (offset 0x44, 4 byte) +//---------------------------------------------------------------------------- +#define GPIO_IN REG_GPIO_PIN_CTRL // GPIO pins input value +#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) // GPIO pins output value +#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) // GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. +#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) + + +//---------------------------------------------------------------------------- +// 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) +//---------------------------------------------------------------------------- +/* +Network Type +00: No link +01: Link in ad hoc network +10: Link in infrastructure network +11: AP mode +Default: 00b. +*/ +#define MSR_NOLINK 0x00 +#define MSR_ADHOC 0x01 +#define MSR_INFRA 0x02 +#define MSR_AP 0x03 + +// +// 6. Adaptive Control Registers (Offset: 0x0160 - 0x01CF) +// +//---------------------------------------------------------------------------- +// 8192C Response Rate Set Register (offset 0x181, 24bits) +//---------------------------------------------------------------------------- +#define RRSR_RSC_OFFSET 21 +#define RRSR_SHORT_OFFSET 23 +#define RRSR_RSC_BW_40M 0x600000 +#define RRSR_RSC_UPSUBCHNL 0x400000 +#define RRSR_RSC_LOWSUBCHNL 0x200000 +#define RRSR_SHORT 0x800000 +#define RRSR_1M BIT0 +#define RRSR_2M BIT1 +#define RRSR_5_5M BIT2 +#define RRSR_11M BIT3 +#define RRSR_6M BIT4 +#define RRSR_9M BIT5 +#define RRSR_12M BIT6 +#define RRSR_18M BIT7 +#define RRSR_24M BIT8 +#define RRSR_36M BIT9 +#define RRSR_48M BIT10 +#define RRSR_54M BIT11 +#define RRSR_MCS0 BIT12 +#define RRSR_MCS1 BIT13 +#define RRSR_MCS2 BIT14 +#define RRSR_MCS3 BIT15 +#define RRSR_MCS4 BIT16 +#define RRSR_MCS5 BIT17 +#define RRSR_MCS6 BIT18 +#define RRSR_MCS7 BIT19 +#define BRSR_AckShortPmb BIT23 +// CCK ACK: use Short Preamble or not + + +//---------------------------------------------------------------------------- +// 8192C Rate Definition +//---------------------------------------------------------------------------- +//CCK +#define RATR_1M 0x00000001 +#define RATR_2M 0x00000002 +#define RATR_55M 0x00000004 +#define RATR_11M 0x00000008 +//OFDM +#define RATR_6M 0x00000010 +#define RATR_9M 0x00000020 +#define RATR_12M 0x00000040 +#define RATR_18M 0x00000080 +#define RATR_24M 0x00000100 +#define RATR_36M 0x00000200 +#define RATR_48M 0x00000400 +#define RATR_54M 0x00000800 +//MCS 1 Spatial Stream +#define RATR_MCS0 0x00001000 +#define RATR_MCS1 0x00002000 +#define RATR_MCS2 0x00004000 +#define RATR_MCS3 0x00008000 +#define RATR_MCS4 0x00010000 +#define RATR_MCS5 0x00020000 +#define RATR_MCS6 0x00040000 +#define RATR_MCS7 0x00080000 +//MCS 2 Spatial Stream +#define RATR_MCS8 0x00100000 +#define RATR_MCS9 0x00200000 +#define RATR_MCS10 0x00400000 +#define RATR_MCS11 0x00800000 +#define RATR_MCS12 0x01000000 +#define RATR_MCS13 0x02000000 +#define RATR_MCS14 0x04000000 +#define RATR_MCS15 0x08000000 + + +// NOTE: For 92CU - Ziv +//CCK +#define RATE_1M BIT(0) +#define RATE_2M BIT(1) +#define RATE_5_5M BIT(2) +#define RATE_11M BIT(3) +//OFDM +#define RATE_6M BIT(4) +#define RATE_9M BIT(5) +#define RATE_12M BIT(6) +#define RATE_18M BIT(7) +#define RATE_24M BIT(8) +#define RATE_36M BIT(9) +#define RATE_48M BIT(10) +#define RATE_54M BIT(11) +//MCS 1 Spatial Stream +#define RATE_MCS0 BIT(12) +#define RATE_MCS1 BIT(13) +#define RATE_MCS2 BIT(14) +#define RATE_MCS3 BIT(15) +#define RATE_MCS4 BIT(16) +#define RATE_MCS5 BIT(17) +#define RATE_MCS6 BIT(18) +#define RATE_MCS7 BIT(19) +//MCS 2 Spatial Stream +#define RATE_MCS8 BIT(20) +#define RATE_MCS9 BIT(21) +#define RATE_MCS10 BIT(22) +#define RATE_MCS11 BIT(23) +#define RATE_MCS12 BIT(24) +#define RATE_MCS13 BIT(25) +#define RATE_MCS14 BIT(26) +#define RATE_MCS15 BIT(27) + + + + +// ALL CCK Rate +#define RATE_ALL_CCK RATR_1M|RATR_2M|RATR_55M|RATR_11M +#define RATE_ALL_OFDM_AG RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\ + RATR_36M|RATR_48M|RATR_54M +#define RATE_ALL_OFDM_1SS RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\ + RATR_MCS4|RATR_MCS5|RATR_MCS6|RATR_MCS7 +#define RATE_ALL_OFDM_2SS RATR_MCS8|RATR_MCS9|RATR_MCS10|RATR_MCS11|\ + RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15 + +//---------------------------------------------------------------------------- +// 8192C BW_OPMODE bits (Offset 0x203, 8bit) +//---------------------------------------------------------------------------- +#define BW_OPMODE_20MHZ BIT2 +#define BW_OPMODE_5G BIT1 +#define BW_OPMODE_11J BIT0 + + +//---------------------------------------------------------------------------- +// 8192C CAM Config Setting (offset 0x250, 1 byte) +//---------------------------------------------------------------------------- +#define CAM_VALID BIT15 +#define CAM_NOTVALID 0x0000 +#define CAM_USEDK BIT5 + +#define CAM_CONTENT_COUNT 8 + +#define CAM_NONE 0x0 +#define CAM_WEP40 0x01 +#define CAM_TKIP 0x02 +#define CAM_AES 0x04 +#define CAM_WEP104 0x05 +#define CAM_SMS4 0x6 + + +#define TOTAL_CAM_ENTRY 32 +#define HALF_CAM_ENTRY 16 + +#define CAM_CONFIG_USEDK _TRUE +#define CAM_CONFIG_NO_USEDK _FALSE + +#define CAM_WRITE BIT16 +#define CAM_READ 0x00000000 +#define CAM_POLLINIG BIT31 + +#define SCR_UseDK 0x01 +#define SCR_TxSecEnable 0x02 +#define SCR_RxSecEnable 0x04 + + +// +// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F) +// +//---------------------------------------------------------------------------- +// 8190 IMR/ISR bits (offset 0xfd, 8bits) +//---------------------------------------------------------------------------- +#define IMR8190_DISABLED 0x0 +// IMR DW0 Bit 0-31 +#define IMR_BCNDMAINT6 BIT31 // Beacon DMA Interrupt 6 +#define IMR_BCNDMAINT5 BIT30 // Beacon DMA Interrupt 5 +#define IMR_BCNDMAINT4 BIT29 // Beacon DMA Interrupt 4 +#define IMR_BCNDMAINT3 BIT28 // Beacon DMA Interrupt 3 +#define IMR_BCNDMAINT2 BIT27 // Beacon DMA Interrupt 2 +#define IMR_BCNDMAINT1 BIT26 // Beacon DMA Interrupt 1 +#define IMR_BCNDOK8 BIT25 // Beacon Queue DMA OK Interrup 8 +#define IMR_BCNDOK7 BIT24 // Beacon Queue DMA OK Interrup 7 +#define IMR_BCNDOK6 BIT23 // Beacon Queue DMA OK Interrup 6 +#define IMR_BCNDOK5 BIT22 // Beacon Queue DMA OK Interrup 5 +#define IMR_BCNDOK4 BIT21 // Beacon Queue DMA OK Interrup 4 +#define IMR_BCNDOK3 BIT20 // Beacon Queue DMA OK Interrup 3 +#define IMR_BCNDOK2 BIT19 // Beacon Queue DMA OK Interrup 2 +#define IMR_BCNDOK1 BIT18 // Beacon Queue DMA OK Interrup 1 +#define IMR_TIMEOUT2 BIT17 // Timeout interrupt 2 +#define IMR_TIMEOUT1 BIT16 // Timeout interrupt 1 +#define IMR_TXFOVW BIT15 // Transmit FIFO Overflow +#define IMR_PSTIMEOUT BIT14 // Power save time out interrupt +#define IMR_BcnInt BIT13 // Beacon DMA Interrupt 0 +#define IMR_RXFOVW BIT12 // Receive FIFO Overflow +#define IMR_RDU BIT11 // Receive Descriptor Unavailable +#define IMR_ATIMEND BIT10 // For 92C,ATIM Window End Interrupt +#define IMR_BDOK BIT9 // Beacon Queue DMA OK Interrup +#define IMR_HIGHDOK BIT8 // High Queue DMA OK Interrupt +#define IMR_TBDOK BIT7 // Transmit Beacon OK interrup +#define IMR_MGNTDOK BIT6 // Management Queue DMA OK Interrupt +#define IMR_TBDER BIT5 // For 92C,Transmit Beacon Error Interrupt +#define IMR_BKDOK BIT4 // AC_BK DMA OK Interrupt +#define IMR_BEDOK BIT3 // AC_BE DMA OK Interrupt +#define IMR_VIDOK BIT2 // AC_VI DMA OK Interrupt +#define IMR_VODOK BIT1 // AC_VO DMA Interrupt +#define IMR_ROK BIT0 // Receive DMA OK Interrupt + +// 13. Host Interrupt Status Extension Register (Offset: 0x012C-012Eh) +#define IMR_TXERR BIT11 +#define IMR_RXERR BIT10 +#define IMR_C2HCMD BIT9 +#define IMR_CPWM BIT8 +//RSVD [2-7] +#define IMR_OCPINT BIT1 +#define IMR_WLANOFF BIT0 + + + +//---------------------------------------------------------------------------- +// 8192D EFUSE +//---------------------------------------------------------------------------- +#define HWSET_MAX_SIZE 256 + +//---------------------------------------------------------------------------- +// 8192C EEPROM/EFUSE share register definition. +//---------------------------------------------------------------------------- + +// +// Default Value for EEPROM or EFUSE!!! +// +#define EEPROM_Default_TSSI 0x0 +#define EEPROM_Default_TxPowerDiff 0x0 +#define EEPROM_Default_CrystalCap 0x0 //92D default 0x0 +#define EEPROM_Default_BoardType 0x02 // Default: 2X2, RTL8192CE(QFPN68) +#define EEPROM_Default_TxPower 0x1010 +#define EEPROM_Default_HT2T_TxPwr 0x10 + +#define EEPROM_Default_LegacyHTTxPowerDiff 0x4 +#define EEPROM_Default_ThermalMeter 0x12 + +#define EEPROM_Default_AntTxPowerDiff 0x0 +//#define EEPROM_Default_TxPwDiff_CrystalCap 0x5 +#define EEPROM_Default_TxPowerLevel_2G 0x2C +#define EEPROM_Default_TxPowerLevel_5G 0x22 + +#define EEPROM_Default_HT40_2SDiff 0x0 +#define EEPROM_Default_HT20_Diff 2 // HT20<->40 default Tx Power Index Difference +#define EEPROM_Default_LegacyHTTxPowerDiff 0x4 //OFDM Tx Power index diff +#define EEPROM_Default_HT40_PwrMaxOffset 0 +#define EEPROM_Default_HT20_PwrMaxOffset 0 + +// For debug +#define EEPROM_Default_PID 0x1234 +#define EEPROM_Default_VID 0x5678 +#define EEPROM_Default_CustomerID 0xAB +#define EEPROM_Default_SubCustomerID 0xCD +#define EEPROM_Default_Version 0 + +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_NCC 0xB +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_TOSHIBA 0x4 +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. +#define EEPROM_CID_QMI 0x0D +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define RTL8192_EEPROM_ID 0x8129 +#define EEPROM_WAPI_SUPPORT 0x78 + + +#ifdef CONFIG_PCI_HCI +#define RT_IBSS_INT_MASKS (IMR_BcnInt | IMR_TBDOK | IMR_TBDER) +#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) +#define RT_BSS_INT_MASKS (RT_IBSS_INT_MASKS) + +#define RTL8190_EEPROM_ID 0x8129 // 0-1 +#define EEPROM_HPON 0x02 // LDO settings.2-5 +#define EEPROM_CLK 0x06 // Clock settings.6-7 +#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 + +#define EEPROM_VID 0x28 // SE Vendor ID.A-B +#define EEPROM_DID 0x2A // SE Device ID. C-D +#define EEPROM_SVID 0x2C // SE Vendor ID.E-F +#define EEPROM_SMID 0x2E // SE PCI Subsystem ID. 10-11 + +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 +#define EEPROM_MAC_ADDR_MAC0_92D 0x55 +#define EEPROM_MAC_ADDR_MAC1_92D 0x5B +//---------------------------------------------------------------- +// 2.4G band Tx power index setting +#define EEPROM_CCK_TX_PWR_INX_2G 0x61 +#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D +#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73 +#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76 +#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79 + +//5GL channel 32-64 +#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B +#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E + +//5GM channel 100-140 +#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D +#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3 + +//5GH channel 149-165 +#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8 + +#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels. +#define EEPROM_IQK_DELTA 0xBC +#define EEPROM_LCK_DELTA 0xBC +#define EEPROM_XTAL_K 0xBD //[7:5] +#define EEPROM_TSSI_A_5G 0xBE +#define EEPROM_TSSI_B_5G 0xBF +#define EEPROM_TSSI_AB_5G 0xC0 +#define EEPROM_THERMAL_METER 0xC3 //[4:0] +#define EEPROM_PATHDIV 0xC4 +#define EEPROM_RF_OPT1 0xC4 +#define EEPROM_RF_OPT2 0xC5 +#define EEPROM_RF_OPT3 0xC6 +#define EEPROM_RF_OPT4 0xC7 +#define EEPROM_RF_OPT5 0xC8 +#define EEPROM_RF_OPT6 0xC9 +#define EEPROM_VERSION 0xCA +#define EEPROM_CUSTOMER_ID 0xCB +#define EEPROM_RF_OPT7 0xCC + +#define EEPROM_WIDIPAIRING_ADDR 0xF0 +#define EEPROM_WIDIPAIRING_KEY 0xF6 + +#define EEPROM_DEF_PART_NO 0x3FD //Byte +#define EEPROME_CHIP_VERSION_L 0x3FF +#define EEPROME_CHIP_VERSION_H 0x3FE +#endif + +#ifdef CONFIG_USB_HCI +#define RTL8190_EEPROM_ID 0x8129 // 0-1 +#define EEPROM_HPON 0x02 // LDO settings.2-5 +#define EEPROM_CLK 0x06 // Clock settings.6-7 +#define EEPROM_MAC_FUNCTION 0x08 // SE Test mode.8 + +#define EEPROM_VID 0xC // SE Vendor ID.A-B +#define EEPROM_PID 0xE // SE Device ID. C-D +#define EEPROM_ENDPOINT_SETTING 0x10 +#define EEPROM_CHIRP_K 0x12 // Changed +#define EEPROM_USB_PHY 0x13 // Changed +#define EEPROM_NORMAL_BoardType EEPROM_RF_OPT1 //[7:5] +#define EEPROM_MAC_ADDR 0x16 // SEMAC Address. 12-17 +#define EEPROM_STRING 0x1F +#define EEPROM_SUBCUSTOMER_ID 0x59 + +#define EEPROM_MAC_ADDR_MAC0_92D 0x19 +#define EEPROM_MAC_ADDR_MAC1_92D 0x5B +//---------------------------------------------------------------- +// 2.4G band Tx power index setting +#define EEPROM_CCK_TX_PWR_INX_2G 0x61 +#define EEPROM_HT40_1S_TX_PWR_INX_2G 0x67 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_2G 0x6D +#define EEPROM_HT20_TX_PWR_INX_DIFF_2G 0x70 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_2G 0x73 +#define EEPROM_HT40_MAX_PWR_OFFSET_2G 0x76 +#define EEPROM_HT20_MAX_PWR_OFFSET_2G 0x79 + +//5GL channel 32-64 +#define EEPROM_HT40_1S_TX_PWR_INX_5GL 0x7C +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GL 0x82 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GL 0x85 +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GL 0x88 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GL 0x8B +#define EEPROM_HT20_MAX_PWR_OFFSET_5GL 0x8E + +//5GM channel 100-140 +#define EEPROM_HT40_1S_TX_PWR_INX_5GM 0x91 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GM 0x97 +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GM 0x9A +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GM 0x9D +#define EEPROM_HT40_MAX_PWR_OFFSET_5GM 0xA0 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GM 0xA3 + +//5GH channel 149-165 +#define EEPROM_HT40_1S_TX_PWR_INX_5GH 0xA6 +#define EEPROM_HT40_2S_TX_PWR_INX_DIFF_5GH 0xAC +#define EEPROM_HT20_TX_PWR_INX_DIFF_5GH 0xAF +#define EEPROM_OFDM_TX_PWR_INX_DIFF_5GH 0xB2 +#define EEPROM_HT40_MAX_PWR_OFFSET_5GH 0xB5 +#define EEPROM_HT20_MAX_PWR_OFFSET_5GH 0xB8 + +#define EEPROM_CHANNEL_PLAN 0xBB // Map of supported channels. +#define EEPROM_TEST_CHANNEL_PLAN 0xBB +#define EEPROM_IQK_DELTA 0xBC +#define EEPROM_LCK_DELTA 0xBC +#define EEPROM_XTAL_K 0xBD //[7:5] +#define EEPROM_TSSI_A_5G 0xBE +#define EEPROM_TSSI_B_5G 0xBF +#define EEPROM_TSSI_AB_5G 0xC0 +#define EEPROM_THERMAL_METER 0xC3 //[4:0] +#define EEPROM_PATHDIV 0xC4 +#define EEPROM_RF_OPT1 0xC4 +#define EEPROM_RF_OPT2 0xC5 +#define EEPROM_RF_OPT3 0xC6 +#define EEPROM_RF_OPT4 0xC7 +#define EEPROM_RF_OPT5 0xC8 +#define EEPROM_RF_OPT6 0xC9 +#define EEPROM_VERSION 0xCA +#define EEPROM_CUSTOMER_ID 0xCB +#define EEPROM_RF_OPT7 0xCC + +#define EEPROM_DEF_PART_NO 0x3FD //Byte +#define EEPROME_CHIP_VERSION_L 0x3FF +#define EEPROME_CHIP_VERSION_H 0x3FE + +//------------------------------------------------------------- +// EEPROM content definitions +//------------------------------------------------------------- +#define OS_LINK_SPEED_NORMAL_MASK BIT3 | BIT2 +#define OS_LINK_SPEED_TEST_MASK BIT3 | BIT4 + +#define BOARD_TYPE_NORMAL_MASK 0xE0 +#define BOARD_TYPE_TEST_MASK 0xF + +#define BT_COEXISTENCE_TEST BIT4 +#define BT_COEXISTENCE_NORMAL BIT5 + +#define BT_CO_SHIFT_TEST 4 +#define BT_CO_SHIFT_NORMAL 5 + +#define EP_NUMBER_MASK_TEST 0x30 //bit 4:5 0Eh +#define EP_NUMBER_SHIFT_TEST 4 + +#define USB_PHY_PARA_SIZE_TEST 6 +#define USB_PHY_PARA_SIZE_NORMAL 4 + +//------------------------------------------------------------- +// EEPROM default value definitions +//------------------------------------------------------------- +// Use 0xABCD instead of 0x8192 for debug +#define EEPROM_DEF_ID_0 0xCD // Byte 0x00 +#define EEPROM_DEF_ID_1 0xAB // Byte 0x01 + +#define EEPROM_DEF_RTK_RSV_A3 0x74 // Byte 0x03 +#define EEPROM_DEF_RTK_RSV_A4 0x6D // Byte 0x04 +#define EEPROM_DEF_RTK_RSV_A8 0xFF // Byte 0x08 + +#define EEPROM_DEF_VID_0 0x0A // Byte 0x0A +#define EEPROM_DEF_VID_1 0x0B + +#define EEPROM_DEF_PID_0 0x92 // Byte 0x0C +#define EEPROM_DEF_PID_1 0x81 + + +#define EEPROM_TEST_DEF_USB_OPT 0x80 // Byte 0x0E +#define EEPROM_NORMAL_DEF_USB_OPT 0x00 // Byte 0x0E + +#define EEPROM_DEF_CHIRPK 0x15 // Byte 0x0F + +#define EEPROM_DEF_USB_PHY_0 0x85 // Byte 0x10 +#define EEPROM_DEF_USB_PHY_1 0x62 // Byte 0x11 +#define EEPROM_DEF_USB_PHY_2 0x9E // Byte 0x12 +#define EEPROM_DEF_USB_PHY_3 0x06 // Byte 0x13 + +#define EEPROM_DEF_TSSI_A 0x09 // Byte 0x78 +#define EEPROM_DEF_TSSI_B 0x09 // Byte 0x79 + + +#define EEPROM_DEF_THERMAL_METER 0x12 // Byte 0x7A + + +#define EEPROM_USB_SN BIT(0) +#define EEPROM_USB_REMOTE_WAKEUP BIT(1) +#define EEPROM_USB_DEVICE_PWR BIT(2) +#define EEPROM_EP_NUMBER (BIT(3)|BIT(4)) + +#if 0 +#define EEPROM_CHANNEL_PLAN_FCC 0x0 +#define EEPROM_CHANNEL_PLAN_IC 0x1 +#define EEPROM_CHANNEL_PLAN_ETSI 0x2 +#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 +#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 +#define EEPROM_CHANNEL_PLAN_MKK 0x5 +#define EEPROM_CHANNEL_PLAN_MKK1 0x6 +#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 +#define EEPROM_CHANNEL_PLAN_TELEC 0x8 +#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 +#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA +#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 + +#define EEPROM_CID_DEFAULT 0x0 + +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + + +#define EEPROM_CID_CCX 0x10 // CCX test. By Bruce, 2009-02-25. + +#endif +#endif + + +/*=================================================================== +===================================================================== +Here the register defines are for 92C. When the define is as same with 92C, +we will use the 92C's define for the consistency +So the following defines for 92C is not entire!!!!!! +===================================================================== +=====================================================================*/ +/* +Based on Datasheet V33---090401 +Register Summary +Current IOREG MAP +0x0000h ~ 0x00FFh System Configuration (256 Bytes) +0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) +0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) +0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) +0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) +0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) +0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) +0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) +0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) +*/ + +//---------------------------------------------------------------------------- +// 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) +//---------------------------------------------------------------------------- +#define RCR_APPFCS BIT31 //WMAC append FCS after pauload +#define RCR_APP_MIC BIT30 // +#define RCR_APP_ICV BIT29 // +#define RCR_APP_PHYST_RXFF BIT28 // +#define RCR_APP_BA_SSN BIT27 //Accept BA SSN +#define RCR_ENMBID BIT24 //Enable Multiple BssId. +#define RCR_LSIGEN BIT23 +#define RCR_MFBEN BIT22 +#define RCR_HTC_LOC_CTRL BIT14 //MFC<--HTC=1 MFC-->HTC=0 +#define RCR_AMF BIT13 //Accept management type frame +#define RCR_ACF BIT12 //Accept control type frame +#define RCR_ADF BIT11 //Accept data type frame +#define RCR_AICV BIT9 //Accept ICV error packet +#define RCR_ACRC32 BIT8 //Accept CRC32 error packet +#define RCR_CBSSID_BCN BIT7 //Accept BSSID match packet (Rx beacon, probe rsp) +#define RCR_CBSSID_DATA BIT6 //Accept BSSID match packet (Data) +#define RCR_CBSSID RCR_CBSSID_DATA //Accept BSSID match packet +#define RCR_APWRMGT BIT5 //Accept power management packet +#define RCR_ADD3 BIT4 //Accept address 3 match packet +#define RCR_AB BIT3 //Accept broadcast packet +#define RCR_AM BIT2 //Accept multicast packet +#define RCR_APM BIT1 //Accept physical match packet +#define RCR_AAP BIT0 //Accept all unicast packet +#define RCR_MXDMA_OFFSET 8 +#define RCR_FIFO_OFFSET 13 + + + +//============================================================================ +// 8192c USB specific Regsiter Offset and Content definition, +// 2009.08.18, added by vivi. for merge 92c and 92C into one driver +//============================================================================ +//#define APS_FSMCO 0x0004 same with 92Ce +#define RSV_CTRL 0x001C +#define RD_CTRL 0x0524 + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- +#define REG_USB_INFO 0xFE17 +#define REG_USB_SPECIAL_OPTION 0xFE55 +#define REG_USB_DMA_AGG_TO 0xFE5B +#define REG_USB_AGG_TO 0xFE5C +#define REG_USB_AGG_TH 0xFE5D + +#define REG_USB_VID 0xFE60 +#define REG_USB_PID 0xFE62 +#define REG_USB_OPTIONAL 0xFE64 +#define REG_USB_CHIRP_K 0xFE65 +#define REG_USB_PHY 0xFE66 +#define REG_USB_MAC_ADDR 0xFE70 + +#define REG_USB_HRPWM 0xFE58 +#define REG_USB_HCPWM 0xFE57 + +#define InvalidBBRFValue 0x12345678 + +//============================================================================ +// 8192C Regsiter Bit and Content definition +//============================================================================ +//----------------------------------------------------- +// +// 0x0000h ~ 0x00FFh System Configuration +// +//----------------------------------------------------- + +//2 SPS0_CTRL +#define SW18_FPWM BIT(3) + + +//2 SYS_ISO_CTRL +#define ISO_MD2PP BIT(0) +#define ISO_UA2USB BIT(1) +#define ISO_UD2CORE BIT(2) +#define ISO_PA2PCIE BIT(3) +#define ISO_PD2CORE BIT(4) +#define ISO_IP2MAC BIT(5) +#define ISO_DIOP BIT(6) +#define ISO_DIOE BIT(7) +#define ISO_EB2CORE BIT(8) +#define ISO_DIOR BIT(9) + +#define PWC_EV25V BIT(14) +#define PWC_EV12V BIT(15) + + +//2 SYS_FUNC_EN +#define FEN_BBRSTB BIT(0) +#define FEN_BB_GLB_RSTn BIT(1) +#define FEN_USBA BIT(2) +#define FEN_UPLL BIT(3) +#define FEN_USBD BIT(4) +#define FEN_DIO_PCIE BIT(5) +#define FEN_PCIEA BIT(6) +#define FEN_PPLL BIT(7) +#define FEN_PCIED BIT(8) +#define FEN_DIOE BIT(9) +#define FEN_CPUEN BIT(10) +#define FEN_DCORE BIT(11) +#define FEN_ELDR BIT(12) +#define FEN_DIO_RF BIT(13) +#define FEN_HWPDN BIT(14) +#define FEN_MREGEN BIT(15) + +//2 APS_FSMCO +#define PFM_LDALL BIT(0) +#define PFM_ALDN BIT(1) +#define PFM_LDKP BIT(2) +#define PFM_WOWL BIT(3) +#define EnPDN BIT(4) +#define PDN_PL BIT(5) +#define APFM_ONMAC BIT(8) +#define APFM_OFF BIT(9) +#define APFM_RSM BIT(10) +#define AFSM_HSUS BIT(11) +#define AFSM_PCIE BIT(12) +#define APDM_MAC BIT(13) +#define APDM_HOST BIT(14) +#define APDM_HPDN BIT(15) +#define RDY_MACON BIT(16) +#define SUS_HOST BIT(17) +#define ROP_ALD BIT(20) +#define ROP_PWR BIT(21) +#define ROP_SPS BIT(22) +#define SOP_MRST BIT(25) +#define SOP_FUSE BIT(26) +#define SOP_ABG BIT(27) +#define SOP_AMB BIT(28) +#define SOP_RCK BIT(29) +#define SOP_A8M BIT(30) +#define XOP_BTCK BIT(31) + +//2 SYS_CLKR +#define ANAD16V_EN BIT(0) +#define ANA8M BIT(1) +#define MACSLP BIT(4) +#define LOADER_CLK_EN BIT(5) +#define _80M_SSC_DIS BIT(7) +#define _80M_SSC_EN_HO BIT(8) +#define PHY_SSC_RSTB BIT(9) +#define SEC_CLK_EN BIT(10) +#define MAC_CLK_EN BIT(11) +#define SYS_CLK_EN BIT(12) +#define RING_CLK_EN BIT(13) + + +//2 9346CR + +#define BOOT_FROM_EEPROM BIT(4) +#define EEPROM_EN BIT(5) + + +//2 AFE_MISC +#define AFE_BGEN BIT(0) +#define AFE_MBEN BIT(1) +#define MAC_ID_EN BIT(7) + + +//2 SPS0_CTRL + + +//2 SPS_OCP_CFG + + +//2 RSV_CTRL +#define WLOCK_ALL BIT(0) +#define WLOCK_00 BIT(1) +#define WLOCK_04 BIT(2) +#define WLOCK_08 BIT(3) +#define WLOCK_40 BIT(4) +#define R_DIS_PRST_0 BIT(5) +#define R_DIS_PRST_1 BIT(6) +#define LOCK_ALL_EN BIT(7) + +//2 RF_CTRL +#define RF_EN BIT(0) +#define RF_RSTB BIT(1) +#define RF_SDMRSTB BIT(2) + + + +//2 LDOA15_CTRL +#define LDA15_EN BIT(0) +#define LDA15_STBY BIT(1) +#define LDA15_OBUF BIT(2) +#define LDA15_REG_VOS BIT(3) +#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) + + + +//2 LDOV12D_CTRL +#define LDV12_EN BIT(0) +#define LDV12_SDBY BIT(1) +#define LPLDO_HSM BIT(2) +#define LPLDO_LSM_DIS BIT(3) +#define _LDV12_VADJ(x) (((x) & 0xF) << 4) + + +//2 AFE_XTAL_CTRL +#define XTAL_EN BIT(0) +#define XTAL_BSEL BIT(1) +#define _XTAL_BOSC(x) (((x) & 0x3) << 2) +#define _XTAL_CADJ(x) (((x) & 0xF) << 4) +#define XTAL_GATE_USB BIT(8) +#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9) +#define XTAL_GATE_AFE BIT(11) +#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12) +#define XTAL_RF_GATE BIT(14) +#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15) +#define XTAL_GATE_DIG BIT(17) +#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18) +#define XTAL_BT_GATE BIT(20) +#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) +#define _XTAL_GPIO(x) (((x) & 0x7) << 23) + + +#define CKDLY_AFE BIT(26) +#define CKDLY_USB BIT(27) +#define CKDLY_DIG BIT(28) +#define CKDLY_BT BIT(29) + + +//2 AFE_PLL_CTRL +#define APLL_EN BIT(0) +#define APLL_320_EN BIT(1) +#define APLL_FREF_SEL BIT(2) +#define APLL_EDGE_SEL BIT(3) +#define APLL_WDOGB BIT(4) +#define APLL_LPFEN BIT(5) + +#define APLL_REF_CLK_13MHZ 0x1 +#define APLL_REF_CLK_19_2MHZ 0x2 +#define APLL_REF_CLK_20MHZ 0x3 +#define APLL_REF_CLK_25MHZ 0x4 +#define APLL_REF_CLK_26MHZ 0x5 +#define APLL_REF_CLK_38_4MHZ 0x6 +#define APLL_REF_CLK_40MHZ 0x7 + +#define APLL_320EN BIT(14) +#define APLL_80EN BIT(15) +#define APLL_1MEN BIT(24) + + +//2 EFUSE_CTRL +#define ALD_EN BIT(18) +#define EF_PD BIT(19) +#define EF_FLAG BIT(31) + +//2 EFUSE_TEST +#define EF_TRPT BIT(7) +#define LDOE25_EN BIT(31) + +//2 PWR_DATA + +//2 CAL_TIMER + +//2 ACLK_MON +#define RSM_EN BIT(0) +#define Timer_EN BIT(4) + + +//2 GPIO_MUXCFG +#define TRSW0EN BIT(2) +#define TRSW1EN BIT(3) +#define EROM_EN BIT(4) +#define EnBT BIT(5) +#define EnUart BIT(8) +#define Uart_910 BIT(9) +#define EnPMAC BIT(10) +#define SIC_SWRST BIT(11) +#define EnSIC BIT(12) +#define SIC_23 BIT(13) +#define EnHDP BIT(14) +#define SIC_LBK BIT(15) + +//2 GPIO_PIN_CTRL + + + +//2 GPIO_INTM + +//2 LEDCFG +#define LED0PL BIT(4) +#define LED1PL BIT(12) +#define LED0DIS BIT(7) + +#define SECCAM_CLR BIT(30) + +//2 FSIMR + +//2 FSISR + + +//2 8051FWDL +//2 MCUFWDL +#define MCUFWDL_EN BIT(0) +#define MCUFWDL_RDY BIT(1) +#define FWDL_ChkSum_rpt BIT(2) +#define MACINI_RDY BIT(3) +#define BBINI_RDY BIT(4) +#define RFINI_RDY BIT(5) +#define WINTINI_RDY BIT(6) +#define MAC1_WINTINI_RDY BIT(11)// 0X81 BIT3 +#define CPRST BIT(23) + + + + +//2 REG_SYS_CFG +#define XCLK_VLD BIT(0) +#define ACLK_VLD BIT(1) +#define UCLK_VLD BIT(2) +#define PCLK_VLD BIT(3) +#define PCIRSTB BIT(4) +#define V15_VLD BIT(5) +#define TRP_B15V_EN BIT(7) +#define SIC_IDLE BIT(8) +#define BD_MAC2 BIT(9) +#define BD_MAC1 BIT(10) +#define IC_MACPHY_MODE BIT(11) +#define PAD_HWPD_IDN BIT(22) +#define TRP_VAUX_EN BIT(23) +#define TRP_BT_EN BIT(24) +#define BD_PKG_SEL BIT(25) +#define BD_HCI_SEL BIT(26) +#define TYPE_ID BIT(27) + +#define CHIP_VER_RTL_MASK 0xF000 //Bit 12 ~ 15 +#define CHIP_VER_RTL_SHIFT 12 + +//----------------------------------------------------- +// +// 0x0100h ~ 0x01FFh MACTOP General Configuration +// +//----------------------------------------------------- + + +//2 Function Enable Registers +//2 CR + +#define REG_LBMODE (REG_CR + 3) + + +#define HCI_TXDMA_EN BIT(0) +#define HCI_RXDMA_EN BIT(1) +#define TXDMA_EN BIT(2) +#define RXDMA_EN BIT(3) +#define PROTOCOL_EN BIT(4) +#define SCHEDULE_EN BIT(5) +#define MACTXEN BIT(6) +#define MACRXEN BIT(7) +#define ENSWBCN BIT(8) +#define ENSEC BIT(9) + +// Network type +#define _NETTYPE(x) (((x) & 0x3) << 16) +#define MASK_NETTYPE 0x30000 +#define NT_NO_LINK 0x0 +#define NT_LINK_AD_HOC 0x1 +#define NT_LINK_AP 0x2 +#define NT_AS_AP 0x3 + +#define _LBMODE(x) (((x) & 0xF) << 24) +#define MASK_LBMODE 0xF000000 +#define LOOPBACK_NORMAL 0x0 +#define LOOPBACK_IMMEDIATELY 0xB +#define LOOPBACK_MAC_DELAY 0x3 +#define LOOPBACK_PHY 0x1 +#define LOOPBACK_DMA 0x7 + + +//2 PBP - Page Size Register +#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) +#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) +#define _PSRX_MASK 0xF +#define _PSTX_MASK 0xF0 +#define _PSRX(x) (x) +#define _PSTX(x) ((x) << 4) + +#define PBP_64 0x0 +#define PBP_128 0x1 +#define PBP_256 0x2 +#define PBP_512 0x3 +#define PBP_1024 0x4 + + +//2 TX/RXDMA +#define RXDMA_ARBBW_EN BIT(0) +#define RXSHFT_EN BIT(1) +#define RXDMA_AGG_EN BIT(2) +#define QS_VO_QUEUE BIT(8) +#define QS_VI_QUEUE BIT(9) +#define QS_BE_QUEUE BIT(10) +#define QS_BK_QUEUE BIT(11) +#define QS_MANAGER_QUEUE BIT(12) +#define QS_HIGH_QUEUE BIT(13) + +#define HQSEL_VOQ BIT(0) +#define HQSEL_VIQ BIT(1) +#define HQSEL_BEQ BIT(2) +#define HQSEL_BKQ BIT(3) +#define HQSEL_MGTQ BIT(4) +#define HQSEL_HIQ BIT(5) + +// For normal driver, 0x10C +#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) +#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) +#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10) +#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8 ) +#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6 ) +#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4 ) + +#define QUEUE_LOW 1 +#define QUEUE_NORMAL 2 +#define QUEUE_HIGH 3 + + + +//2 TRXFF_BNDY + + +//2 LLT_INIT +#define _LLT_NO_ACTIVE 0x0 +#define _LLT_WRITE_ACCESS 0x1 +#define _LLT_READ_ACCESS 0x2 + +#define _LLT_INIT_DATA(x) ((x) & 0xFF) +#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) +#define _LLT_OP(x) (((x) & 0x3) << 30) +#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) + + +//2 BB_ACCESS_CTRL +#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) +#define BB_WRITE_EN BIT(30) +#define BB_READ_EN BIT(31) +//#define BB_ADDR_MASK 0xFFF +//#define _BB_ADDR(x) ((x) & BB_ADDR_MASK) + +//----------------------------------------------------- +// +// 0x0200h ~ 0x027Fh TXDMA Configuration +// +//----------------------------------------------------- +//2 RQPN +#define _HPQ(x) ((x) & 0xFF) +#define _LPQ(x) (((x) & 0xFF) << 8) +#define _PUBQ(x) (((x) & 0xFF) << 16) +#define _NPQ(x) ((x) & 0xFF) // NOTE: in RQPN_NPQ register + + +#define HPQ_PUBLIC_DIS BIT(24) +#define LPQ_PUBLIC_DIS BIT(25) +#define LD_RQPN BIT(31) + + +//2 TDECTRL +#define BCN_VALID BIT(16) +#define BCN_HEAD(x) (((x) & 0xFF) << 8) +#define BCN_HEAD_MASK 0xFF00 + +//2 TDECTL +#define BLK_DESC_NUM_SHIFT 4 +#define BLK_DESC_NUM_MASK 0xF + + +//2 TXDMA_OFFSET_CHK +#define DROP_DATA_EN BIT(9) + +//----------------------------------------------------- +// +// 0x0400h ~ 0x047Fh Protocol Configuration +// +//----------------------------------------------------- +//2 FWHW_TXQ_CTRL +#define EN_AMPDU_RTY_NEW BIT(7) + +//2 INIRTSMCS_SEL +#define _INIRTSMCS_SEL(x) ((x) & 0x3F) + + +//2 SPEC SIFS +#define _SPEC_SIFS_CCK(x) ((x) & 0xFF) +#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8) + + +//2 RRSR + +#define RATE_REG_BITMAP_ALL 0xFFFFF + +#define _RRSC_BITMAP(x) ((x) & 0xFFFFF) + +#define _RRSR_RSC(x) (((x) & 0x3) << 21) +#define RRSR_RSC_RESERVED 0x0 +#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 +#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 +#define RRSR_RSC_DUPLICATE_MODE 0x3 + + +//2 ARFR +#define USE_SHORT_G1 BIT(20) + +//2 AGGLEN_LMT_L +#define _AGGLMT_MCS0(x) ((x) & 0xF) +#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4) +#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8) +#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12) +#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16) +#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20) +#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) +#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) + + +//2 RL +#define RETRY_LIMIT_SHORT_SHIFT 8 +#define RETRY_LIMIT_LONG_SHIFT 0 + + +//2 DARFRC +#define _DARF_RC1(x) ((x) & 0x1F) +#define _DARF_RC2(x) (((x) & 0x1F) << 8) +#define _DARF_RC3(x) (((x) & 0x1F) << 16) +#define _DARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (DARFRC + 4) +#define _DARF_RC5(x) ((x) & 0x1F) +#define _DARF_RC6(x) (((x) & 0x1F) << 8) +#define _DARF_RC7(x) (((x) & 0x1F) << 16) +#define _DARF_RC8(x) (((x) & 0x1F) << 24) + + +//2 RARFRC +#define _RARF_RC1(x) ((x) & 0x1F) +#define _RARF_RC2(x) (((x) & 0x1F) << 8) +#define _RARF_RC3(x) (((x) & 0x1F) << 16) +#define _RARF_RC4(x) (((x) & 0x1F) << 24) +// NOTE: shift starting from address (RARFRC + 4) +#define _RARF_RC5(x) ((x) & 0x1F) +#define _RARF_RC6(x) (((x) & 0x1F) << 8) +#define _RARF_RC7(x) (((x) & 0x1F) << 16) +#define _RARF_RC8(x) (((x) & 0x1F) << 24) + + + + +//----------------------------------------------------- +// +// 0x0500h ~ 0x05FFh EDCA Configuration +// +//----------------------------------------------------- + + + +//2 EDCA setting +#define AC_PARAM_TXOP_LIMIT_OFFSET 16 +#define AC_PARAM_ECW_MAX_OFFSET 12 +#define AC_PARAM_ECW_MIN_OFFSET 8 +#define AC_PARAM_AIFS_OFFSET 0 + + +//2 EDCA_VO_PARAM +#define _AIFS(x) (x) +#define _ECW_MAX_MIN(x) ((x) << 8) +#define _TXOP_LIMIT(x) ((x) << 16) + + +#define _BCNIFS(x) ((x) & 0xFF) +#define _BCNECW(x) (((x) & 0xF))<< 8) + + +#define _LRL(x) ((x) & 0x3F) +#define _SRL(x) (((x) & 0x3F) << 8) + + +//2 SIFS_CCK +#define _SIFS_CCK_CTX(x) ((x) & 0xFF) +#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); + + +//2 SIFS_OFDM +#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) +#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); + + +//2 TBTT PROHIBIT +#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) + + +//2 REG_RD_CTRL +#define DIS_EDCA_CNT_DWN BIT(11) + + +//2 BCN_CTRL +#define EN_MBSSID BIT(1) +#define EN_TXBCN_RPT BIT(2) +#define EN_BCN_FUNCTION BIT(3) + +// The same function but different bit field. +#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) +#define DIS_TSF_UDT0_TEST_CHIP BIT(5) + +//2 ACMHWCTRL +#define AcmHw_HwEn BIT(0) +#define AcmHw_BeqEn BIT(1) +#define AcmHw_ViqEn BIT(2) +#define AcmHw_VoqEn BIT(3) +#define AcmHw_BeqStatus BIT(4) +#define AcmHw_ViqStatus BIT(5) +#define AcmHw_VoqStatus BIT(6) + + + +//----------------------------------------------------- +// +// 0x0600h ~ 0x07FFh WMAC Configuration +// +//----------------------------------------------------- + +//2 APSD_CTRL +#define APSDOFF BIT(6) +#define APSDOFF_STATUS BIT(7) + + +//2 BWOPMODE +#define BW_20MHZ BIT(2) +//#define BW_OPMODE_20MHZ BIT(2) // For compability + + +#define RATE_BITMAP_ALL 0xFFFFF + +// Only use CCK 1M rate for ACK +#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 +#define RATE_RRSR_WITHOUT_CCK 0xFFFF0 + +//2 TCR +#define TSFRST BIT(0) +#define DIS_GCLK BIT(1) +#define PAD_SEL BIT(2) +#define PWR_ST BIT(6) +#define PWRBIT_OW_EN BIT(7) +#define ACRC BIT(8) +#define CFENDFORM BIT(9) +#define ICV BIT(10) + + + +//2 RCR +#define AAP BIT(0) +#define APM BIT(1) +#define AM BIT(2) +#define AB BIT(3) +#define ADD3 BIT(4) +#define APWRMGT BIT(5) +#define CBSSID BIT(6) +#define CBSSID_BCN BIT(7) +#define ACRC32 BIT(8) +#define AICV BIT(9) +#define ADF BIT(11) +#define ACF BIT(12) +#define AMF BIT(13) +#define HTC_LOC_CTRL BIT(14) +#define UC_DATA_EN BIT(16) +#define BM_DATA_EN BIT(17) +#define MFBEN BIT(22) +#define LSIGEN BIT(23) +#define EnMBID BIT(24) +#define APP_BASSN BIT(27) +#define APP_PHYSTS BIT(28) +#define APP_ICV BIT(29) +#define APP_MIC BIT(30) +#define APP_FCS BIT(31) + +//2 RX_PKT_LIMIT + +//2 RX_DLK_TIME + +//2 MBIDCAMCFG + + + +//2 AMPDU_MIN_SPACE +#define _MIN_SPACE(x) ((x) & 0x7) +#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) + + +//2 RXERR_RPT +#define RXERR_TYPE_OFDM_PPDU 0 +#define RXERR_TYPE_OFDM_FALSE_ALARM 1 +#define RXERR_TYPE_OFDM_MPDU_OK 2 +#define RXERR_TYPE_OFDM_MPDU_FAIL 3 +#define RXERR_TYPE_CCK_PPDU 4 +#define RXERR_TYPE_CCK_FALSE_ALARM 5 +#define RXERR_TYPE_CCK_MPDU_OK 6 +#define RXERR_TYPE_CCK_MPDU_FAIL 7 +#define RXERR_TYPE_HT_PPDU 8 +#define RXERR_TYPE_HT_FALSE_ALARM 9 +#define RXERR_TYPE_HT_MPDU_TOTAL 10 +#define RXERR_TYPE_HT_MPDU_OK 11 +#define RXERR_TYPE_HT_MPDU_FAIL 12 +#define RXERR_TYPE_RX_FULL_DROP 15 + +#define RXERR_COUNTER_MASK 0xFFFFF +#define RXERR_RPT_RST BIT(27) +#define _RXERR_RPT_SEL(type) ((type) << 28) + + +//2 SECCFG +#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key +#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key +#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption +#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption +#define SCR_SKByA2 BIT(4) //Search kEY BY A2 +#define SCR_NoSKMC BIT(5) //No Key Search Multicast +#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key +#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key + +//vivi added for new cam search flow, 20091028 +#ifdef HW_EN_DE_CRYPTION_FOR_NEW_CAM_SEARCH_FLOW +#define SCR_TxUseBroadcastDK BIT6 //Force Tx Use Broadcast Default Key +#define SCR_RxUseBroadcastDK BIT7 //Force Rx Use Broadcast Default Key +#endif + + +//----------------------------------------------------- +// +// 0xFE00h ~ 0xFE55h USB Configuration +// +//----------------------------------------------------- + +//2 USB Information (0xFE17) +#define USB_IS_HIGH_SPEED 0 +#define USB_IS_FULL_SPEED 1 +#define USB_SPEED_MASK BIT(5) + +#define USB_NORMAL_SIE_EP_MASK 0xF +#define USB_NORMAL_SIE_EP_SHIFT 4 + +#define USB_TEST_EP_MASK 0x30 +#define USB_TEST_EP_SHIFT 4 + +//2 Special Option +#define USB_AGG_EN BIT(3) + + +//2REG_C2HEVT_CLEAR +#define C2H_EVT_HOST_CLOSE 0x00 // Set by driver and notify FW that the driver has read the C2H command message +#define C2H_EVT_FW_CLOSE 0xFF // Set by FW indicating that FW had set the C2H command message and it's not yet read by driver. + +//2 8192D PartNo. +#define PARTNO_92D_NIC (BIT7|BIT6) +#define PARTNO_92D_NIC_REMARK (BIT5|BIT4) +#define PARTNO_SINGLE_BAND_VS BIT3 +#define PARTNO_SINGLE_BAND_VS_REMARK BIT1 +#define PARTNO_CONCURRENT_BAND_VC (BIT3|BIT2) +#define PARTNO_CONCURRENT_BAND_VC_REMARK (BIT1|BIT0) +//======================================================== +// General definitions +//======================================================== + +#define MAC_ADDR_LEN 6 +#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 +#define LAST_ENTRY_OF_TX_PKT_BUFFER_DUAL_MAC 127 + +#define POLLING_LLT_THRESHOLD 20 +#define POLLING_READY_TIMEOUT_COUNT 1000 + +// Min Spacing related settings. +#define MAX_MSS_DENSITY_2T 0x13 +#define MAX_MSS_DENSITY_1T 0x0A +// GPIO BIT +#define HAL_8192C_HW_GPIO_WPS_BIT BIT2 + + +#include "basic_types.h" + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h b/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h new file mode 100755 index 000000000000..2b1580ff2402 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtl8192d_xmit.h @@ -0,0 +1,106 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL8192D_XMIT_H_ +#define _RTL8192D_XMIT_H_ + +#define VO_QUEUE_INX 0 +#define VI_QUEUE_INX 1 +#define BE_QUEUE_INX 2 +#define BK_QUEUE_INX 3 +#define BCN_QUEUE_INX 4 +#define MGT_QUEUE_INX 5 +#define HIGH_QUEUE_INX 6 +#define TXCMD_QUEUE_INX 7 + +#define HW_QUEUE_ENTRY 8 + +// +// Queue Select Value in TxDesc +// +#define QSLT_BK 0x2//0x01 +#define QSLT_BE 0x0 +#define QSLT_VI 0x5//0x4 +#define QSLT_VO 0x7//0x6 +#define QSLT_BEACON 0x10 +#define QSLT_HIGH 0x11 +#define QSLT_MGNT 0x12 +#define QSLT_CMD 0x13 + +//Because we open EM for normal case, we just always insert 2*8 bytes.by wl +#define USB_92D_DUMMY_OFFSET 2 +#define USB_92D_DUMMY_LENGTH (USB_92D_DUMMY_OFFSET * PACKET_OFFSET_SZ) +#define USB_HWDESC_HEADER_LEN (TXDESC_SIZE + USB_92D_DUMMY_LENGTH) + +//For 92D early mode +#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value) +#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value) +#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value) +#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value) +#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value) +#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value) +#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value) + +#ifdef CONFIG_USB_HCI + +#ifdef CONFIG_USB_TX_AGGREGATION +#define MAX_TX_AGG_PACKET_NUMBER 0xFF +#endif + +s32 rtl8192du_init_xmit_priv(_adapter * padapter); + +void rtl8192du_free_xmit_priv(_adapter * padapter); + +void rtl8192du_cal_txdesc_chksum(struct tx_desc *ptxdesc); + +s32 rtl8192du_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +void rtl8192du_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192du_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192du_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + +#ifdef CONFIG_PCI_HCI +s32 rtl8192de_init_xmit_priv(_adapter * padapter); +void rtl8192de_free_xmit_priv(_adapter * padapter); + +s32 rtl8192de_enqueue_xmitbuf(struct rtw_tx_ring *ring, struct xmit_buf *pxmitbuf); +struct xmit_buf *rtl8192de_dequeue_xmitbuf(struct rtw_tx_ring *ring); + +void rtl8192de_xmitframe_resume(_adapter *padapter); + +void rtl8192de_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe); + +s32 rtl8192de_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe); + +#ifdef CONFIG_HOSTAPD_MLME +s32 rtl8192de_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); +#endif + +#endif + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h b/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h new file mode 100755 index 000000000000..1313a255fb93 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_byteorder.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTL871X_BYTEORDER_H_ +#define _RTL871X_BYTEORDER_H_ + +#include + +#if defined (CONFIG_LITTLE_ENDIAN) && defined (CONFIG_BIG_ENDIAN) +#error "Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\n" +#endif + +#if defined (CONFIG_LITTLE_ENDIAN) +#ifndef CONFIG_PLATFORM_MSTAR389 +# include +#endif +#elif defined (CONFIG_BIG_ENDIAN) +# include +#else +# error "Must be LITTLE/BIG Endian Host" +#endif + +#endif /* _RTL871X_BYTEORDER_H_ */ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_cmd.h b/drivers/net/wireless/rtl8192c/include/rtw_cmd.h new file mode 100755 index 000000000000..58a54f50989b --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_cmd.h @@ -0,0 +1,1100 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_CMD_H_ +#define __RTW_CMD_H_ + +#include +#include +#include + +#define C2H_MEM_SZ (16*1024) + +#ifndef CONFIG_RTL8711FW + + #include + #include // + + + #define FREE_CMDOBJ_SZ 128 + + #define MAX_CMDSZ 1024 + #define MAX_RSPSZ 512 + #define MAX_EVTSZ 1024 + +#ifdef PLATFORM_OS_CE + #define CMDBUFF_ALIGN_SZ 4 +#else + #define CMDBUFF_ALIGN_SZ 512 +#endif + + struct cmd_obj { + u16 cmdcode; + u8 res; + u8 *parmbuf; + u32 cmdsz; + u8 *rsp; + u32 rspsz; + //_sema cmd_sem; + _list list; + }; + + struct cmd_priv { + _sema cmd_queue_sema; + //_sema cmd_done_sema; + _sema terminate_cmdthread_sema; + _queue cmd_queue; + u8 cmd_seq; + u8 *cmd_buf; //shall be non-paged, and 4 bytes aligned + u8 *cmd_allocated_buf; + u8 *rsp_buf; //shall be non-paged, and 4 bytes aligned + u8 *rsp_allocated_buf; + u32 cmd_issued_cnt; + u32 cmd_done_cnt; + u32 rsp_cnt; + u8 cmdthd_running; + _adapter *padapter; + }; + +#ifdef CONFIG_EVENT_THREAD_MODE + struct evt_obj { + u16 evtcode; + u8 res; + u8 *parmbuf; + u32 evtsz; + _list list; + }; +#endif + + struct evt_priv { +#ifdef CONFIG_EVENT_THREAD_MODE + _sema evt_notify; + _sema terminate_evtthread_sema; + _queue evt_queue; +#endif + +#ifdef CONFIG_H2CLBK + _sema lbkevt_done; + u8 lbkevt_limit; + u8 lbkevt_num; + u8 *cmdevt_parm; +#endif + ATOMIC_T event_seq; + u8 *evt_buf; //shall be non-paged, and 4 bytes aligned + u8 *evt_allocated_buf; + u32 evt_done_cnt; +#ifdef CONFIG_SDIO_HCI + u8 *c2h_mem; + u8 *allocated_c2h_mem; +#ifdef PLATFORM_OS_XP + PMDL pc2h_mdl; +#endif +#endif + + }; + +#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \ +do {\ + _rtw_init_listhead(&pcmd->list);\ + pcmd->cmdcode = code;\ + pcmd->parmbuf = (u8 *)(pparm);\ + pcmd->cmdsz = sizeof (*pparm);\ + pcmd->rsp = NULL;\ + pcmd->rspsz = 0;\ +} while(0) + +extern u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj); +extern struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv); +extern void rtw_free_cmd_obj(struct cmd_obj *pcmd); + +#ifdef CONFIG_EVENT_THREAD_MODE +extern u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj); +extern struct evt_obj *rtw_dequeue_evt(_queue *queue); +extern void rtw_free_evt_obj(struct evt_obj *pcmd); +#endif + +thread_return rtw_cmd_thread(thread_context context); + +extern u32 rtw_init_cmd_priv (struct cmd_priv *pcmdpriv); +extern void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv); + +extern u32 rtw_init_evt_priv (struct evt_priv *pevtpriv); +extern void rtw_free_evt_priv (struct evt_priv *pevtpriv); +extern void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv); +extern void rtw_evt_notify_isr(struct evt_priv *pevtpriv); +#ifdef CONFIG_P2P +u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType ); +#endif //CONFIG_P2P + +#else + #include +#endif /* CONFIG_RTL8711FW */ + +enum rtw_drvextra_cmd_id +{ + NONE_WK_CID, + DYNAMIC_CHK_WK_CID, + DM_CTRL_WK_CID, + PBC_POLLING_WK_CID, + POWER_SAVING_CTRL_WK_CID,//IPS,AUTOSuspend + LPS_CTRL_WK_CID, + ANT_SELECT_WK_CID, + P2P_PS_WK_CID, + P2P_PROTO_WK_CID, + CHECK_HIQ_WK_CID,//for softap mode, check hi queue if empty + MAX_WK_CID +}; + +enum LPS_CTRL_TYPE +{ + LPS_CTRL_SCAN=0, + LPS_CTRL_JOINBSS=1, + LPS_CTRL_CONNECT=2, + LPS_CTRL_DISCONNECT=3, + LPS_CTRL_SPECIAL_PACKET=4, +}; + +enum RFINTFS { + SWSI, + HWSI, + HWPI, +}; + +/* +Caller Mode: Infra, Ad-HoC(C) + +Notes: To enter USB suspend mode + +Command Mode + +*/ +struct usb_suspend_parm { + u32 action;// 1: sleep, 0:resume +}; + +/* +Caller Mode: Infra, Ad-HoC + +Notes: To join a known BSS. + +Command-Event Mode + +*/ + +/* +Caller Mode: Infra, Ad-Hoc + +Notes: To join the specified bss + +Command Event Mode + +*/ +struct joinbss_parm { + WLAN_BSSID_EX network; +}; + +/* +Caller Mode: Infra, Ad-HoC(C) + +Notes: To disconnect the current associated BSS + +Command Mode + +*/ +struct disconnect_parm { + u32 rsvd; +}; + +/* +Caller Mode: AP, Ad-HoC(M) + +Notes: To create a BSS + +Command Mode +*/ +struct createbss_parm { + WLAN_BSSID_EX network; +}; + +/* +Caller Mode: AP, Ad-HoC, Infra + +Notes: To set the NIC mode of RTL8711 + +Command Mode + +The definition of mode: + +#define IW_MODE_AUTO 0 // Let the driver decides which AP to join +#define IW_MODE_ADHOC 1 // Single cell network (Ad-Hoc Clients) +#define IW_MODE_INFRA 2 // Multi cell network, roaming, .. +#define IW_MODE_MASTER 3 // Synchronisation master or Access Point +#define IW_MODE_REPEAT 4 // Wireless Repeater (forwarder) +#define IW_MODE_SECOND 5 // Secondary master/repeater (backup) +#define IW_MODE_MONITOR 6 // Passive monitor (listen only) + +*/ +struct setopmode_parm { + u8 mode; + u8 rsvd[3]; +}; + +/* +Caller Mode: AP, Ad-HoC, Infra + +Notes: To ask RTL8711 performing site-survey + +Command-Event Mode + +*/ +struct sitesurvey_parm { + sint scan_mode; //active: 1, passive: 0 + sint bsslimit; // 1 ~ 48 + sint ss_ssidlen; + u8 ss_ssid[IW_ESSID_MAX_SIZE + 1]; +}; + +/* +Caller Mode: Any + +Notes: To set the auth type of RTL8711. open/shared/802.1x + +Command Mode + +*/ +struct setauth_parm { + u8 mode; //0: legacy open, 1: legacy shared 2: 802.1x + u8 _1x; //0: PSK, 1: TLS + u8 rsvd[2]; +}; + +/* +Caller Mode: Infra + +a. algorithm: wep40, wep104, tkip & aes +b. keytype: grp key/unicast key +c. key contents + +when shared key ==> keyid is the camid +when 802.1x ==> keyid [0:1] ==> grp key +when 802.1x ==> keyid > 2 ==> unicast key + +*/ +struct setkey_parm { + u8 algorithm; // encryption algorithm, could be none, wep40, TKIP, CCMP, wep104 + u8 keyid; + u8 grpkey; // 1: this is the grpkey for 802.1x. 0: this is the unicast key for 802.1x + u8 set_tx; // 1: main tx key for wep. 0: other key. + u8 key[16]; // this could be 40 or 104 +}; + +/* +When in AP or Ad-Hoc mode, this is used to +allocate an sw/hw entry for a newly associated sta. + +Command + +when shared key ==> algorithm/keyid + +*/ +struct set_stakey_parm { + u8 addr[ETH_ALEN]; + u8 algorithm; + u8 key[16]; +}; + +struct set_stakey_rsp { + u8 addr[ETH_ALEN]; + u8 keyid; + u8 rsvd; +}; + +/* +Caller Ad-Hoc/AP + +Command -Rsp(AID == CAMID) mode + +This is to force fw to add an sta_data entry per driver's request. + +FW will write an cam entry associated with it. + +*/ +struct set_assocsta_parm { + u8 addr[ETH_ALEN]; +}; + +struct set_assocsta_rsp { + u8 cam_id; + u8 rsvd[3]; +}; + +/* + Caller Ad-Hoc/AP + + Command mode + + This is to force fw to del an sta_data entry per driver's request + + FW will invalidate the cam entry associated with it. + +*/ +struct del_assocsta_parm { + u8 addr[ETH_ALEN]; +}; + +/* +Caller Mode: AP/Ad-HoC(M) + +Notes: To notify fw that given staid has changed its power state + +Command Mode + +*/ +struct setstapwrstate_parm { + u8 staid; + u8 status; + u8 hwaddr[6]; +}; + +/* +Caller Mode: Any + +Notes: To setup the basic rate of RTL8711 + +Command Mode + +*/ +struct setbasicrate_parm { + u8 basicrates[NumRates]; +}; + +/* +Caller Mode: Any + +Notes: To read the current basic rate + +Command-Rsp Mode + +*/ +struct getbasicrate_parm { + u32 rsvd; +}; + +struct getbasicrate_rsp { + u8 basicrates[NumRates]; +}; + +/* +Caller Mode: Any + +Notes: To setup the data rate of RTL8711 + +Command Mode + +*/ +struct setdatarate_parm { +#ifdef MP_FIRMWARE_OFFLOAD + u32 curr_rateidx; +#else + u8 mac_id; + u8 datarates[NumRates]; +#endif +}; + +/* +Caller Mode: Any + +Notes: To read the current data rate + +Command-Rsp Mode + +*/ +struct getdatarate_parm { + u32 rsvd; + +}; +struct getdatarate_rsp { + u8 datarates[NumRates]; +}; + + +/* +Caller Mode: Any +AP: AP can use the info for the contents of beacon frame +Infra: STA can use the info when sitesurveying +Ad-HoC(M): Like AP +Ad-HoC(C): Like STA + + +Notes: To set the phy capability of the NIC + +Command Mode + +*/ + +struct setphyinfo_parm { + struct regulatory_class class_sets[NUM_REGULATORYS]; + u8 status; +}; + +struct getphyinfo_parm { + u32 rsvd; +}; + +struct getphyinfo_rsp { + struct regulatory_class class_sets[NUM_REGULATORYS]; + u8 status; +}; + +/* +Caller Mode: Any + +Notes: To set the channel/modem/band +This command will be used when channel/modem/band is changed. + +Command Mode + +*/ +struct setphy_parm { + u8 rfchannel; + u8 modem; +}; + +/* +Caller Mode: Any + +Notes: To get the current setting of channel/modem/band + +Command-Rsp Mode + +*/ +struct getphy_parm { + u32 rsvd; + +}; +struct getphy_rsp { + u8 rfchannel; + u8 modem; +}; + +struct readBB_parm { + u8 offset; +}; +struct readBB_rsp { + u8 value; +}; + +struct readTSSI_parm { + u8 offset; +}; +struct readTSSI_rsp { + u8 value; +}; + +struct writeBB_parm { + u8 offset; + u8 value; +}; + +struct readRF_parm { + u8 offset; +}; +struct readRF_rsp { + u32 value; +}; + +struct writeRF_parm { + u32 offset; + u32 value; +}; + +struct getrfintfs_parm { + u8 rfintfs; +}; + + +struct Tx_Beacon_param +{ + WLAN_BSSID_EX network; +}; + +/* + Notes: This command is used for H2C/C2H loopback testing + + mac[0] == 0 + ==> CMD mode, return H2C_SUCCESS. + The following condition must be ture under CMD mode + mac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0; + s0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7; + s2 == (b1 << 8 | b0); + + mac[0] == 1 + ==> CMD_RSP mode, return H2C_SUCCESS_RSP + + The rsp layout shall be: + rsp: parm: + mac[0] = mac[5]; + mac[1] = mac[4]; + mac[2] = mac[3]; + mac[3] = mac[2]; + mac[4] = mac[1]; + mac[5] = mac[0]; + s0 = s1; + s1 = swap16(s0); + w0 = swap32(w1); + b0 = b1 + s2 = s0 + s1 + b1 = b0 + w1 = w0 + + mac[0] == 2 + ==> CMD_EVENT mode, return H2C_SUCCESS + The event layout shall be: + event: parm: + mac[0] = mac[5]; + mac[1] = mac[4]; + mac[2] = event's sequence number, starting from 1 to parm's marc[3] + mac[3] = mac[2]; + mac[4] = mac[1]; + mac[5] = mac[0]; + s0 = swap16(s0) - event.mac[2]; + s1 = s1 + event.mac[2]; + w0 = swap32(w0); + b0 = b1 + s2 = s0 + event.mac[2] + b1 = b0 + w1 = swap32(w1) - event.mac[2]; + + parm->mac[3] is the total event counts that host requested. + + + event will be the same with the cmd's param. + +*/ + +#ifdef CONFIG_H2CLBK + +struct seth2clbk_parm { + u8 mac[6]; + u16 s0; + u16 s1; + u32 w0; + u8 b0; + u16 s2; + u8 b1; + u32 w1; +}; + +struct geth2clbk_parm { + u32 rsv; +}; + +struct geth2clbk_rsp { + u8 mac[6]; + u16 s0; + u16 s1; + u32 w0; + u8 b0; + u16 s2; + u8 b1; + u32 w1; +}; + +#endif /* CONFIG_H2CLBK */ + +// CMD param Formart for driver extra cmd handler +struct drvextra_cmd_parm { + int ec_id; //extra cmd id + int type_size; // Can use this field as the type id or command size + unsigned char *pbuf; +}; + +/*------------------- Below are used for RF/BB tunning ---------------------*/ + +struct setantenna_parm { + u8 tx_antset; + u8 rx_antset; + u8 tx_antenna; + u8 rx_antenna; +}; + +struct enrateadaptive_parm { + u32 en; +}; + +struct settxagctbl_parm { + u32 txagc[MAX_RATES_LENGTH]; +}; + +struct gettxagctbl_parm { + u32 rsvd; +}; +struct gettxagctbl_rsp { + u32 txagc[MAX_RATES_LENGTH]; +}; + +struct setagcctrl_parm { + u32 agcctrl; // 0: pure hw, 1: fw +}; + + +struct setssup_parm { + u32 ss_ForceUp[MAX_RATES_LENGTH]; +}; + +struct getssup_parm { + u32 rsvd; +}; +struct getssup_rsp { + u8 ss_ForceUp[MAX_RATES_LENGTH]; +}; + + +struct setssdlevel_parm { + u8 ss_DLevel[MAX_RATES_LENGTH]; +}; + +struct getssdlevel_parm { + u32 rsvd; +}; +struct getssdlevel_rsp { + u8 ss_DLevel[MAX_RATES_LENGTH]; +}; + +struct setssulevel_parm { + u8 ss_ULevel[MAX_RATES_LENGTH]; +}; + +struct getssulevel_parm { + u32 rsvd; +}; +struct getssulevel_rsp { + u8 ss_ULevel[MAX_RATES_LENGTH]; +}; + + +struct setcountjudge_parm { + u8 count_judge[MAX_RATES_LENGTH]; +}; + +struct getcountjudge_parm { + u32 rsvd; +}; +struct getcountjudge_rsp { + u8 count_judge[MAX_RATES_LENGTH]; +}; + + +struct setratable_parm { + u8 ss_ForceUp[NumRates]; + u8 ss_ULevel[NumRates]; + u8 ss_DLevel[NumRates]; + u8 count_judge[NumRates]; +}; + +struct getratable_parm { + uint rsvd; +}; +struct getratable_rsp { + u8 ss_ForceUp[NumRates]; + u8 ss_ULevel[NumRates]; + u8 ss_DLevel[NumRates]; + u8 count_judge[NumRates]; +}; + + +//to get TX,RX retry count +struct gettxretrycnt_parm{ + unsigned int rsvd; +}; +struct gettxretrycnt_rsp{ + unsigned long tx_retrycnt; +}; + +struct getrxretrycnt_parm{ + unsigned int rsvd; +}; +struct getrxretrycnt_rsp{ + unsigned long rx_retrycnt; +}; + +//to get BCNOK,BCNERR count +struct getbcnokcnt_parm{ + unsigned int rsvd; +}; +struct getbcnokcnt_rsp{ + unsigned long bcnokcnt; +}; + +struct getbcnerrcnt_parm{ + unsigned int rsvd; +}; +struct getbcnerrcnt_rsp{ + unsigned long bcnerrcnt; +}; + +// to get current TX power level +struct getcurtxpwrlevel_parm{ + unsigned int rsvd; +}; +struct getcurtxpwrlevel_rsp{ + unsigned short tx_power; +}; + +struct setprobereqextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setassocreqextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setproberspextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + +struct setassocrspextraie_parm { + unsigned char e_id; + unsigned char ie_len; + unsigned char ie[0]; +}; + + +struct addBaReq_parm +{ + unsigned int tid; + u8 addr[ETH_ALEN]; +}; + +/*H2C Handler index: 46 */ +struct SetChannel_parm +{ + u32 curr_ch; +}; + +#ifdef MP_FIRMWARE_OFFLOAD +/*H2C Handler index: 47 */ +struct SetTxPower_parm +{ + u8 TxPower; +}; + +/*H2C Handler index: 48 */ +struct SwitchAntenna_parm +{ + u16 antenna_tx; + u16 antenna_rx; +// R_ANTENNA_SELECT_CCK cck_txrx; + u8 cck_txrx; +}; + +/*H2C Handler index: 49 */ +struct SetCrystalCap_parm +{ + u32 curr_crystalcap; +}; + +/*H2C Handler index: 50 */ +struct SetSingleCarrierTx_parm +{ + u8 bStart; +}; + +/*H2C Handler index: 51 */ +struct SetSingleToneTx_parm +{ + u8 bStart; + u8 curr_rfpath; +}; + +/*H2C Handler index: 52 */ +struct SetCarrierSuppressionTx_parm +{ + u8 bStart; + u32 curr_rateidx; +}; + +/*H2C Handler index: 53 */ +struct SetContinuousTx_parm +{ + u8 bStart; + u8 CCK_flag; /*1:CCK 2:OFDM*/ + u32 curr_rateidx; +}; + +/*H2C Handler index: 54 */ +struct SwitchBandwidth_parm +{ + u8 curr_bandwidth; +}; + +#endif /* MP_FIRMWARE_OFFLOAD */ + +/*H2C Handler index: 59 */ +struct SetChannelPlan_param +{ + u8 channel_plan; +}; + +#define GEN_CMD_CODE(cmd) cmd ## _CMD_ + + +/* + +Result: +0x00: success +0x01: sucess, and check Response. +0x02: cmd ignored due to duplicated sequcne number +0x03: cmd dropped due to invalid cmd code +0x04: reserved. + +*/ + +#define H2C_RSP_OFFSET 512 + +#define H2C_SUCCESS 0x00 +#define H2C_SUCCESS_RSP 0x01 +#define H2C_DUPLICATED 0x02 +#define H2C_DROPPED 0x03 +#define H2C_PARAMETERS_ERROR 0x04 +#define H2C_REJECTED 0x05 +#define H2C_CMD_OVERFLOW 0x06 +#define H2C_RESERVED 0x07 + +extern u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr); +extern u8 rtw_setstandby_cmd(_adapter *padapter, uint action); +extern u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *pssid); +extern u8 rtw_createbss_cmd(_adapter *padapter); +extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz); +extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch); +extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key); +extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork); +extern u8 rtw_disassoc_cmd(_adapter *padapter); +extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +extern u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset); +extern u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset); +extern u8 rtw_setbbreg_cmd(_adapter * padapter, u8 offset, u8 val); +extern u8 rtw_setrfreg_cmd(_adapter * padapter, u8 offset, u32 val); +extern u8 rtw_getbbreg_cmd(_adapter * padapter, u8 offset, u8 * pval); +extern u8 rtw_getrfreg_cmd(_adapter * padapter, u8 offset, u8 * pval); +extern u8 rtw_setrfintfs_cmd(_adapter *padapter, u8 mode); +extern u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table); +extern u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval); + +extern u8 rtw_gettssi_cmd(_adapter *padapter, u8 offset,u8 *pval); +extern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type); +extern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type); + +extern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr); + +extern u8 rtw_dynamic_chk_wk_cmd(_adapter *adapter); + +u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue); + +#ifdef CONFIG_ANTENNA_DIVERSITY +extern u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue); +#endif + +extern u8 rtw_ps_cmd(_adapter*padapter); + + +#ifdef CONFIG_AP_MODE +u8 rtw_chk_hi_queue_cmd(_adapter*padapter); +#endif + +extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan); + +u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf); + +extern void rtw_survey_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_disassoc_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_joinbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_getbbrfreg_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd); + +extern void rtw_setstaKey_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_setassocsta_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); +extern void rtw_getrttbl_cmdrsp_callback(_adapter *padapter, struct cmd_obj *pcmd); + + +struct _cmd_callback { + u32 cmd_code; + void (*callback)(_adapter *padapter, struct cmd_obj *cmd); +}; + +enum rtw_h2c_cmd +{ + GEN_CMD_CODE(_Read_MACREG) , /*0*/ + GEN_CMD_CODE(_Write_MACREG) , + GEN_CMD_CODE(_Read_BBREG) , + GEN_CMD_CODE(_Write_BBREG) , + GEN_CMD_CODE(_Read_RFREG) , + GEN_CMD_CODE(_Write_RFREG) , /*5*/ + GEN_CMD_CODE(_Read_EEPROM) , + GEN_CMD_CODE(_Write_EEPROM) , + GEN_CMD_CODE(_Read_EFUSE) , + GEN_CMD_CODE(_Write_EFUSE) , + + GEN_CMD_CODE(_Read_CAM) , /*10*/ + GEN_CMD_CODE(_Write_CAM) , + GEN_CMD_CODE(_setBCNITV), + GEN_CMD_CODE(_setMBIDCFG), + GEN_CMD_CODE(_JoinBss), /*14*/ + GEN_CMD_CODE(_DisConnect) , /*15*/ + GEN_CMD_CODE(_CreateBss) , + GEN_CMD_CODE(_SetOpMode) , + GEN_CMD_CODE(_SiteSurvey), /*18*/ + GEN_CMD_CODE(_SetAuth) , + + GEN_CMD_CODE(_SetKey) , /*20*/ + GEN_CMD_CODE(_SetStaKey) , + GEN_CMD_CODE(_SetAssocSta) , + GEN_CMD_CODE(_DelAssocSta) , + GEN_CMD_CODE(_SetStaPwrState) , + GEN_CMD_CODE(_SetBasicRate) , /*25*/ + GEN_CMD_CODE(_GetBasicRate) , + GEN_CMD_CODE(_SetDataRate) , + GEN_CMD_CODE(_GetDataRate) , + GEN_CMD_CODE(_SetPhyInfo) , + + GEN_CMD_CODE(_GetPhyInfo) , /*30*/ + GEN_CMD_CODE(_SetPhy) , + GEN_CMD_CODE(_GetPhy) , + GEN_CMD_CODE(_readRssi) , + GEN_CMD_CODE(_readGain) , + GEN_CMD_CODE(_SetAtim) , /*35*/ + GEN_CMD_CODE(_SetPwrMode) , + GEN_CMD_CODE(_JoinbssRpt), + GEN_CMD_CODE(_SetRaTable) , + GEN_CMD_CODE(_GetRaTable) , + + GEN_CMD_CODE(_GetCCXReport), /*40*/ + GEN_CMD_CODE(_GetDTMReport), + GEN_CMD_CODE(_GetTXRateStatistics), + GEN_CMD_CODE(_SetUsbSuspend), + GEN_CMD_CODE(_SetH2cLbk), + GEN_CMD_CODE(_AddBAReq) , /*45*/ + GEN_CMD_CODE(_SetChannel), /*46*/ + GEN_CMD_CODE(_SetTxPower), + GEN_CMD_CODE(_SwitchAntenna), + GEN_CMD_CODE(_SetCrystalCap), + GEN_CMD_CODE(_SetSingleCarrierTx), /*50*/ + + GEN_CMD_CODE(_SetSingleToneTx),/*51*/ + GEN_CMD_CODE(_SetCarrierSuppressionTx), + GEN_CMD_CODE(_SetContinuousTx), + GEN_CMD_CODE(_SwitchBandwidth), /*54*/ + GEN_CMD_CODE(_TX_Beacon), /*55*/ + + GEN_CMD_CODE(_Set_MLME_EVT), /*56*/ + GEN_CMD_CODE(_Set_Drv_Extra), /*57*/ + GEN_CMD_CODE(_Set_H2C_MSG), /*58*/ + + GEN_CMD_CODE(_SetChannelPlan), /*59*/ + + MAX_H2CCMD +}; + +#define _GetBBReg_CMD_ _Read_BBREG_CMD_ +#define _SetBBReg_CMD_ _Write_BBREG_CMD_ +#define _GetRFReg_CMD_ _Read_RFREG_CMD_ +#define _SetRFReg_CMD_ _Write_RFREG_CMD_ + +#ifdef _RTW_CMD_C_ +struct _cmd_callback rtw_cmd_callback[] = +{ + {GEN_CMD_CODE(_Read_MACREG), NULL}, /*0*/ + {GEN_CMD_CODE(_Write_MACREG), NULL}, + {GEN_CMD_CODE(_Read_BBREG), &rtw_getbbrfreg_cmdrsp_callback}, + {GEN_CMD_CODE(_Write_BBREG), NULL}, + {GEN_CMD_CODE(_Read_RFREG), &rtw_getbbrfreg_cmdrsp_callback}, + {GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/ + {GEN_CMD_CODE(_Read_EEPROM), NULL}, + {GEN_CMD_CODE(_Write_EEPROM), NULL}, + {GEN_CMD_CODE(_Read_EFUSE), NULL}, + {GEN_CMD_CODE(_Write_EFUSE), NULL}, + + {GEN_CMD_CODE(_Read_CAM), NULL}, /*10*/ + {GEN_CMD_CODE(_Write_CAM), NULL}, + {GEN_CMD_CODE(_setBCNITV), NULL}, + {GEN_CMD_CODE(_setMBIDCFG), NULL}, + {GEN_CMD_CODE(_JoinBss), &rtw_joinbss_cmd_callback}, /*14*/ + {GEN_CMD_CODE(_DisConnect), &rtw_disassoc_cmd_callback}, /*15*/ + {GEN_CMD_CODE(_CreateBss), &rtw_createbss_cmd_callback}, + {GEN_CMD_CODE(_SetOpMode), NULL}, + {GEN_CMD_CODE(_SiteSurvey), &rtw_survey_cmd_callback}, /*18*/ + {GEN_CMD_CODE(_SetAuth), NULL}, + + {GEN_CMD_CODE(_SetKey), NULL}, /*20*/ + {GEN_CMD_CODE(_SetStaKey), &rtw_setstaKey_cmdrsp_callback}, + {GEN_CMD_CODE(_SetAssocSta), &rtw_setassocsta_cmdrsp_callback}, + {GEN_CMD_CODE(_DelAssocSta), NULL}, + {GEN_CMD_CODE(_SetStaPwrState), NULL}, + {GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/ + {GEN_CMD_CODE(_GetBasicRate), NULL}, + {GEN_CMD_CODE(_SetDataRate), NULL}, + {GEN_CMD_CODE(_GetDataRate), NULL}, + {GEN_CMD_CODE(_SetPhyInfo), NULL}, + + {GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/ + {GEN_CMD_CODE(_SetPhy), NULL}, + {GEN_CMD_CODE(_GetPhy), NULL}, + {GEN_CMD_CODE(_readRssi), NULL}, + {GEN_CMD_CODE(_readGain), NULL}, + {GEN_CMD_CODE(_SetAtim), NULL}, /*35*/ + {GEN_CMD_CODE(_SetPwrMode), NULL}, + {GEN_CMD_CODE(_JoinbssRpt), NULL}, + {GEN_CMD_CODE(_SetRaTable), NULL}, + {GEN_CMD_CODE(_GetRaTable) , NULL}, + + {GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/ + {GEN_CMD_CODE(_GetDTMReport), NULL}, + {GEN_CMD_CODE(_GetTXRateStatistics), NULL}, + {GEN_CMD_CODE(_SetUsbSuspend), NULL}, + {GEN_CMD_CODE(_SetH2cLbk), NULL}, + {GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/ + {GEN_CMD_CODE(_SetChannel), NULL}, /*46*/ + {GEN_CMD_CODE(_SetTxPower), NULL}, + {GEN_CMD_CODE(_SwitchAntenna), NULL}, + {GEN_CMD_CODE(_SetCrystalCap), NULL}, + {GEN_CMD_CODE(_SetSingleCarrierTx), NULL}, /*50*/ + + {GEN_CMD_CODE(_SetSingleToneTx), NULL}, /*51*/ + {GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL}, + {GEN_CMD_CODE(_SetContinuousTx), NULL}, + {GEN_CMD_CODE(_SwitchBandwidth), NULL}, /*54*/ + {GEN_CMD_CODE(_TX_Beacon), NULL},/*55*/ + + {GEN_CMD_CODE(_Set_MLME_EVT), NULL},/*56*/ + {GEN_CMD_CODE(_Set_Drv_Extra), NULL},/*57*/ + {GEN_CMD_CODE(_Set_H2C_MSG), NULL},/*58*/ + {GEN_CMD_CODE(_SetChannelPlan), NULL},/*59*/ +}; +#endif + +#endif // _CMD_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_debug.h b/drivers/net/wireless/rtl8192c/include/rtw_debug.h new file mode 100755 index 000000000000..bd3541f240ec --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_debug.h @@ -0,0 +1,374 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_DEBUG_H__ +#define __RTW_DEBUG_H__ + +#include +#include +#include + + +#define _drv_emerg_ 1 +#define _drv_alert_ 2 +#define _drv_crit_ 3 +#define _drv_err_ 4 +#define _drv_warning_ 5 +#define _drv_notice_ 6 +#define _drv_info_ 7 +#define _drv_dump_ 8 +#define _drv_debug_ 9 + + +#define _module_rtl871x_xmit_c_ BIT(0) +#define _module_xmit_osdep_c_ BIT(1) +#define _module_rtl871x_recv_c_ BIT(2) +#define _module_recv_osdep_c_ BIT(3) +#define _module_rtl871x_mlme_c_ BIT(4) +#define _module_mlme_osdep_c_ BIT(5) +#define _module_rtl871x_sta_mgt_c_ BIT(6) +#define _module_rtl871x_cmd_c_ BIT(7) +#define _module_cmd_osdep_c_ BIT(8) +#define _module_rtl871x_io_c_ BIT(9) +#define _module_io_osdep_c_ BIT(10) +#define _module_os_intfs_c_ BIT(11) +#define _module_rtl871x_security_c_ BIT(12) +#define _module_rtl871x_eeprom_c_ BIT(13) +#define _module_hal_init_c_ BIT(14) +#define _module_hci_hal_init_c_ BIT(15) +#define _module_rtl871x_ioctl_c_ BIT(16) +#define _module_rtl871x_ioctl_set_c_ BIT(17) +#define _module_rtl871x_ioctl_query_c_ BIT(18) +#define _module_rtl871x_pwrctrl_c_ BIT(19) +#define _module_hci_intfs_c_ BIT(20) +#define _module_hci_ops_c_ BIT(21) +#define _module_osdep_service_c_ BIT(22) +#define _module_mp_ BIT(23) +#define _module_hci_ops_os_c_ BIT(24) +#define _module_rtl871x_ioctl_os_c BIT(25) +#define _module_rtl8712_cmd_c_ BIT(26) +//#define _module_efuse_ BIT(27) +#define _module_rtl8192c_xmit_c_ BIT(28) +#define _module_efuse_ BIT(29) +#define _module_rtl8712_recv_c_ BIT(30) +#define _module_rtl8712_led_c_ BIT(31) + +#undef _MODULE_DEFINE_ + +#if defined _RTL871X_XMIT_C_ + #define _MODULE_DEFINE_ _module_rtl871x_xmit_c_ +#elif defined _XMIT_OSDEP_C_ + #define _MODULE_DEFINE_ _module_xmit_osdep_c_ +#elif defined _RTL871X_RECV_C_ + #define _MODULE_DEFINE_ _module_rtl871x_recv_c_ +#elif defined _RECV_OSDEP_C_ + #define _MODULE_DEFINE_ _module_recv_osdep_c_ +#elif defined _RTL871X_MLME_C_ + #define _MODULE_DEFINE_ _module_rtl871x_mlme_c_ +#elif defined _MLME_OSDEP_C_ + #define _MODULE_DEFINE_ _module_mlme_osdep_c_ +#elif defined _RTL871X_STA_MGT_C_ + #define _MODULE_DEFINE_ _module_rtl871x_sta_mgt_c_ +#elif defined _RTL871X_CMD_C_ + #define _MODULE_DEFINE_ _module_rtl871x_cmd_c_ +#elif defined _CMD_OSDEP_C_ + #define _MODULE_DEFINE_ _module_cmd_osdep_c_ +#elif defined _RTL871X_IO_C_ + #define _MODULE_DEFINE_ _module_rtl871x_io_c_ +#elif defined _IO_OSDEP_C_ + #define _MODULE_DEFINE_ _module_io_osdep_c_ +#elif defined _OS_INTFS_C_ + #define _MODULE_DEFINE_ _module_os_intfs_c_ +#elif defined _RTL871X_SECURITY_C_ + #define _MODULE_DEFINE_ _module_rtl871x_security_c_ +#elif defined _RTL871X_EEPROM_C_ + #define _MODULE_DEFINE_ _module_rtl871x_eeprom_c_ +#elif defined _HAL_INIT_C_ + #define _MODULE_DEFINE_ _module_hal_init_c_ +#elif defined _HCI_HAL_INIT_C_ + #define _MODULE_DEFINE_ _module_hci_hal_init_c_ +#elif defined _RTL871X_IOCTL_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_c_ +#elif defined _RTL871X_IOCTL_SET_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_set_c_ +#elif defined _RTL871X_IOCTL_QUERY_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_query_c_ +#elif defined _RTL871X_PWRCTRL_C_ + #define _MODULE_DEFINE_ _module_rtl871x_pwrctrl_c_ +#elif defined _HCI_INTF_C_ + #define _MODULE_DEFINE_ _module_hci_intfs_c_ +#elif defined _HCI_OPS_C_ + #define _MODULE_DEFINE_ _module_hci_ops_c_ +#elif defined _OSDEP_HCI_INTF_C_ + #define _MODULE_DEFINE_ _module_hci_intfs_c_ +#elif defined _OSDEP_SERVICE_C_ + #define _MODULE_DEFINE_ _module_osdep_service_c_ +#elif defined _HCI_OPS_OS_C_ + #define _MODULE_DEFINE_ _module_hci_ops_os_c_ +#elif defined _RTL871X_IOCTL_LINUX_C_ + #define _MODULE_DEFINE_ _module_rtl871x_ioctl_os_c +#elif defined _RTL8712_CMD_C_ + #define _MODULE_DEFINE_ _module_rtl8712_cmd_c_ +#elif defined _RTL8192C_XMIT_C_ + #define _MODULE_DEFINE_ _module_rtl8192c_xmit_c_ +#elif defined _RTL8712_RECV_C_ + #define _MODULE_DEFINE_ _module_rtl8712_recv_c_ +#elif defined _RTL8192CU_RECV_C_ + #define _MODULE_DEFINE_ _module_rtl8712_recv_c_ +#elif defined _RTL871X_MLME_EXT_C_ + #define _MODULE_DEFINE_ _module_mlme_osdep_c_ +#elif defined _RTW_MP_C_ + #define _MODULE_DEFINE_ _module_mp_ +#elif defined _RTW_MP_IOCTL_C_ + #define _MODULE_DEFINE_ _module_mp_ +#elif defined _RTW_EFUSE_C_ + #define _MODULE_DEFINE_ _module_efuse_ +#endif + +#ifdef PLATFORM_OS_CE +extern void rtl871x_cedbg(const char *fmt, ...); +#endif + +#define RT_TRACE(_Comp, _Level, Fmt) do{}while(0) +#define _func_enter_ {} +#define _func_exit_ {} +#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) {} + +#undef _dbgdump + +#ifdef CONFIG_DEBUG_RTL871X + +#ifndef _RTL871X_DEBUG_C_ + extern u32 GlobalDebugLevel; + extern u64 GlobalDebugComponents; +#endif + +#ifdef PLATFORM_WINDOWS + + #ifdef PLATFORM_OS_XP + + #define _dbgdump DbgPrint + + #elif defined PLATFORM_OS_CE + + #define _dbgdump rtl871x_cedbg + + #endif + + #elif defined PLATFORM_LINUX + + #define _dbgdump printk + +#endif + +#endif /* CONFIG_DEBUG_RTL871X */ + + +#if defined (_dbgdump) && defined (_MODULE_DEFINE_) + + #undef RT_TRACE + #define RT_TRACE(_Comp, _Level, Fmt)\ + do {\ + if((_Comp & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) {\ + _dbgdump("%s [0x%08x,%d]", RTL871X_MODULE_NAME, (unsigned int)_Comp, _Level);\ + _dbgdump Fmt; \ + }\ + }while(0) + +#endif + + +#if defined (_dbgdump) + + #undef _func_enter_ + #define _func_enter_ \ + do { \ + if (GlobalDebugLevel >= _drv_debug_) \ + { \ + _dbgdump("\n %s : %s enters at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__);\ + } \ + } while(0) + + #undef _func_exit_ + #define _func_exit_ \ + do { \ + if (GlobalDebugLevel >= _drv_debug_) \ + { \ + _dbgdump("\n %s : %s exits at %d\n", RTL871X_MODULE_NAME, __FUNCTION__, __LINE__); \ + } \ + } while(0) + + #undef RT_PRINT_DATA + #define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) \ + if(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) \ + { \ + int __i; \ + u8 *ptr = (u8 *)_HexData; \ + _dbgdump("Rtl871x: "); \ + _dbgdump(_TitleString); \ + for( __i=0; __i<(int)_HexDataLen; __i++ ) \ + { \ + _dbgdump("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?" ":" "); \ + if (((__i + 1) % 16) == 0) _dbgdump("\n"); \ + } \ + _dbgdump("\n"); \ + } +#endif + + +#ifdef CONFIG_DEBUG_RTL819X + #ifdef PLATFORM_WINDOWS + + #ifdef PLATFORM_OS_XP + #define _dbgdump DbgPrint + + #elif defined PLATFORM_OS_CE + #define _dbgdump rtl871x_cedbg + + #endif + + #elif defined PLATFORM_LINUX + #define _dbgdump printk + #endif +#endif + +#ifdef PLATFORM_WINDOWS + #define DBG_871X {} + #define MSG_8192C {} + #define DBG_8192C {} + #define WRN_8192C {} + #define ERR_8192C {} +#endif + +#ifdef PLATFORM_LINUX + #define DBG_871X(x, ...) {} + #define MSG_8192C(x, ...) {} + #define DBG_8192C(x,...) {} + #define WRN_8192C(x,...) {} + #define ERR_8192C(x,...) {} +#endif + +#if defined (_dbgdump) + #undef DBG_871X + #define DBG_871X _dbgdump + + #undef MSG_8192C + #define MSG_8192C _dbgdump + + #undef DBG_8192C + #define DBG_8192C _dbgdump + + #undef WRN_8192C + #define WRN_8192C _dbgdump + + #undef ERR_8192C + #define ERR_8192C _dbgdump +#endif + + + +#ifdef CONFIG_PROC_DEBUG + + int proc_get_drv_version(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_write_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_set_write_reg(struct file *file, const char *buffer, + unsigned long count, void *data); + + int proc_get_read_reg(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_set_read_reg(struct file *file, const char *buffer, + unsigned long count, void *data); + + + int proc_get_fwstate(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_sec_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_mlmext_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_qos_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_ht_option(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_rf_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_ap_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_adapter_state(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_get_trx_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + +#ifdef CONFIG_AP_MODE + + int proc_get_all_sta_info(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + +#endif + +#ifdef MEMORY_LEAK_DEBUG + int proc_get_malloc_cnt(char *page, char **start, + off_t offset, int count, + int *eof, void *data); +#endif + +#ifdef CONFIG_FIND_BEST_CHANNEL + int proc_get_best_channel(char *page, char **start, + off_t offset, int count, + int *eof, void *data); +#endif + + int proc_get_rx_signal(char *page, char **start, + off_t offset, int count, + int *eof, void *data); + + int proc_set_rx_signal(struct file *file, const char *buffer, + unsigned long count, void *data); + +#endif //CONFIG_PROC_DEBUG + +#endif //__RTW_DEBUG_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h b/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h new file mode 100755 index 000000000000..14450d2722f8 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_eeprom.h @@ -0,0 +1,145 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_EEPROM_H__ +#define __RTW_EEPROM_H__ + +#include +#include +#include + +#define RTL8712_EEPROM_ID 0x8712 +#define EEPROM_MAX_SIZE 256 +#define CLOCK_RATE 50 //100us + +//- EEPROM opcodes +#define EEPROM_READ_OPCODE 06 +#define EEPROM_WRITE_OPCODE 05 +#define EEPROM_ERASE_OPCODE 07 +#define EEPROM_EWEN_OPCODE 19 // Erase/write enable +#define EEPROM_EWDS_OPCODE 16 // Erase/write disable + +//Country codes +#define USA 0x555320 +#define EUROPE 0x1 //temp, should be provided later +#define JAPAN 0x2 //temp, should be provided later + +#ifdef CONFIG_SDIO_HCI +#define eeprom_cis0_sz 17 +#define eeprom_cis1_sz 50 +#endif + +#define EEPROM_CID_DEFAULT 0x0 +#define EEPROM_CID_ALPHA 0x1 +#define EEPROM_CID_Senao 0x3 +#define EEPROM_CID_NetCore 0x5 +#define EEPROM_CID_CAMEO 0X8 +#define EEPROM_CID_SITECOM 0x9 +#define EEPROM_CID_COREGA 0xB +#define EEPROM_CID_EDIMAX_BELKIN 0xC +#define EEPROM_CID_SERCOMM_BELKIN 0xE +#define EEPROM_CID_CAMEO1 0xF +#define EEPROM_CID_WNC_COREGA 0x12 +#define EEPROM_CID_CLEVO 0x13 +#define EEPROM_CID_WHQL 0xFE // added by chiyoko for dtm, 20090108 + +// +// Customer ID, note that: +// This variable is initiailzed through EEPROM or registry, +// however, its definition may be different with that in EEPROM for +// EEPROM size consideration. So, we have to perform proper translation between them. +// Besides, CustomerID of registry has precedence of that of EEPROM. +// defined below. 060703, by rcnjko. +// +typedef enum _RT_CUSTOMER_ID +{ + RT_CID_DEFAULT = 0, + RT_CID_8187_ALPHA0 = 1, + RT_CID_8187_SERCOMM_PS = 2, + RT_CID_8187_HW_LED = 3, + RT_CID_8187_NETGEAR = 4, + RT_CID_WHQL = 5, + RT_CID_819x_CAMEO = 6, + RT_CID_819x_RUNTOP = 7, + RT_CID_819x_Senao = 8, + RT_CID_TOSHIBA = 9, // Merge by Jacken, 2008/01/31. + RT_CID_819x_Netcore = 10, + RT_CID_Nettronix = 11, + RT_CID_DLINK = 12, + RT_CID_PRONET = 13, + RT_CID_COREGA = 14, + RT_CID_CHINA_MOBILE = 15, + RT_CID_819x_ALPHA = 16, + RT_CID_819x_Sitecom = 17, + RT_CID_CCX = 18, // It's set under CCX logo test and isn't demanded for CCX functions, but for test behavior like retry limit and tx report. By Bruce, 2009-02-17. + RT_CID_819x_Lenovo = 19, + RT_CID_819x_QMI = 20, + RT_CID_819x_Edimax_Belkin = 21, + RT_CID_819x_Sercomm_Belkin = 22, + RT_CID_819x_CAMEO1 = 23, + RT_CID_819x_MSI = 24, + RT_CID_819x_Acer = 25, + RT_CID_819x_AzWave_ASUS = 26, + RT_CID_819x_AzWave = 27, // For AzWave in PCIe, The ID is AzWave use and not only Asus + RT_CID_819x_HP = 28, + RT_CID_819x_WNC_COREGA = 29, + RT_CID_819x_Arcadyan_Belkin = 30, + RT_CID_819x_SAMSUNG = 31, + RT_CID_819x_CLEVO = 32, + RT_CID_819x_DELL = 33, + RT_CID_819x_PRONETS = 34, + RT_CID_819x_Edimax_ASUS = 35, + RT_CID_819x_CAMEO_NETGEAR = 36, +}RT_CUSTOMER_ID, *PRT_CUSTOMER_ID; + +struct eeprom_priv +{ + u8 bautoload_fail_flag; + //u8 bempty; + //u8 sys_config; + u8 mac_addr[6]; //PermanentAddress + //u8 config0; + u16 channel_plan; + //u8 country_string[3]; + //u8 tx_power_b[15]; + //u8 tx_power_g[15]; + //u8 tx_power_a[201]; + + u8 EepromOrEfuse; + + u8 efuse_eeprom_data[EEPROM_MAX_SIZE]; + +#ifdef CONFIG_SDIO_HCI + u8 sdio_setting; + u32 ocr; + u8 cis0[eeprom_cis0_sz]; + u8 cis1[eeprom_cis1_sz]; +#endif +}; + + +extern void eeprom_write16(_adapter *padapter, u16 reg, u16 data); +extern u16 eeprom_read16(_adapter *padapter, u16 reg); +extern void read_eeprom_content(_adapter *padapter); +extern void eeprom_read_sz(_adapter * padapter, u16 reg,u8* data, u32 sz); + +extern void read_eeprom_content_by_attrib(_adapter * padapter ); + +#endif //__RTL871X_EEPROM_H__ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_efuse.h b/drivers/net/wireless/rtl8192c/include/rtw_efuse.h new file mode 100755 index 000000000000..66be910ebc9c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_efuse.h @@ -0,0 +1,123 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_EFUSE_H__ +#define __RTW_EFUSE_H__ + +#include +#include + +#define EFUSE_ERROE_HANDLE 1 + +#define PG_STATE_HEADER 0x01 +#define PG_STATE_WORD_0 0x02 +#define PG_STATE_WORD_1 0x04 +#define PG_STATE_WORD_2 0x08 +#define PG_STATE_WORD_3 0x10 +#define PG_STATE_DATA 0x20 + +#define PG_SWBYTE_H 0x01 +#define PG_SWBYTE_L 0x02 + +#define PGPKT_DATA_SIZE 8 + +#define EFUSE_WIFI 0 +#define EFUSE_BT 1 + +enum _EFUSE_DEF_TYPE { + TYPE_EFUSE_MAX_SECTION = 0, + TYPE_EFUSE_REAL_CONTENT_LEN = 1, + TYPE_AVAILABLE_EFUSE_BYTES_BANK = 2, + TYPE_AVAILABLE_EFUSE_BYTES_TOTAL = 3, + TYPE_EFUSE_MAP_LEN = 4, + TYPE_EFUSE_PROTECT_BYTES_BANK = 5, +}; + +#define EFUSE_MAX_MAP_LEN 256 +#define EFUSE_MAX_HW_SIZE 512 +#define EFUSE_MAX_SECTION_BASE 16 + +#define EXT_HEADER(header) ((header & 0x1F ) == 0x0F) +#define ALL_WORDS_DISABLED(wde) ((wde & 0x0F) == 0x0F) +#define GET_HDR_OFFSET_2_0(header) ( (header & 0xE0) >> 5) + +#define EFUSE_REPEAT_THRESHOLD_ 3 + +//============================================= +// The following is for BT Efuse definition +//============================================= +#define EFUSE_BT_MAX_MAP_LEN 1024 +#define EFUSE_MAX_BANK 4 +#define EFUSE_MAX_BT_BANK (EFUSE_MAX_BANK-1) +//============================================= +/*--------------------------Define Parameters-------------------------------*/ +#define EFUSE_MAX_WORD_UNIT 4 + +/*------------------------------Define structure----------------------------*/ +typedef struct PG_PKT_STRUCT_A{ + u8 offset; + u8 word_en; + u8 data[8]; + u8 word_cnts; +}PGPKT_STRUCT,*PPGPKT_STRUCT; +/*------------------------------Define structure----------------------------*/ + + +/*------------------------Export global variable----------------------------*/ +extern u8 fakeEfuseBank; +extern u32 fakeEfuseUsedBytes; +extern u8 fakeEfuseContent[]; +extern u8 fakeEfuseInitMap[]; +extern u8 fakeEfuseModifiedMap[]; + +extern u32 BTEfuseUsedBytes; +extern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +extern u8 BTEfuseInitMap[]; +extern u8 BTEfuseModifiedMap[]; + +extern u32 fakeBTEfuseUsedBytes; +extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; +extern u8 fakeBTEfuseInitMap[]; +extern u8 fakeBTEfuseModifiedMap[]; +/*------------------------Export global variable----------------------------*/ + +u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size); +u16 efuse_GetMaxSize(PADAPTER padapter); +u8 rtw_efuse_access(PADAPTER padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data); +u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); +u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data); + +u16 Efuse_GetCurrentSize(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); +u8 Efuse_CalculateWordCnts(u8 word_en); +void ReadEFuseByte(PADAPTER Adapter, u16 _offset, u8 *pbuf, BOOLEAN bPseudoTest) ; +void EFUSE_GetEfuseDefinition(PADAPTER pAdapter, u8 efuseType, u8 type, PVOID *pOut, BOOLEAN bPseudoTest); +u8 efuse_OneByteRead(PADAPTER pAdapter, u16 addr, u8 *data, BOOLEAN bPseudoTest); +u8 efuse_OneByteWrite(PADAPTER pAdapter, u16 addr, u8 data, BOOLEAN bPseudoTest); + +void Efuse_PowerSwitch(PADAPTER pAdapter,u8 bWrite,u8 PwrState); +int Efuse_PgPacketRead(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest); +int Efuse_PgPacketWrite(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest); +void efuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata); +u8 Efuse_WordEnableDataWrite(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest); + +u8 EFUSE_Read1Byte(PADAPTER pAdapter, u16 Address); +void EFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest); +void EFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value); + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtw_event.h b/drivers/net/wireless/rtl8192c/include/rtw_event.h new file mode 100755 index 000000000000..dd9f097815ee --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_event.h @@ -0,0 +1,154 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_EVENT_H_ +#define _RTW_EVENT_H_ +#include +#include + +#ifndef CONFIG_RTL8711FW +#ifdef PLATFORM_LINUX +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) +#include +#else +#include +#endif +#include +#endif +#else +#include +#endif//CONFIG_RTL8711FW + + + +#ifdef CONFIG_H2CLBK +#include +#endif + +/* +Used to report a bss has been scanned + +*/ +struct survey_event { + WLAN_BSSID_EX bss; +}; + +/* +Used to report that the requested site survey has been done. + +bss_cnt indicates the number of bss that has been reported. + + +*/ +struct surveydone_event { + unsigned int bss_cnt; + +}; + +/* +Used to report the link result of joinning the given bss + + +join_res: +-1: authentication fail +-2: association fail +> 0: TID + +*/ +struct joinbss_event { + struct wlan_network network; +}; + +/* +Used to report a given STA has joinned the created BSS. +It is used in AP/Ad-HoC(M) mode. + + +*/ +struct stassoc_event { + unsigned char macaddr[6]; + unsigned char rsvd[2]; + int cam_id; + +}; + +struct stadel_event { + unsigned char macaddr[6]; + unsigned char rsvd[2]; +}; + +struct addba_event +{ + unsigned int tid; +}; + + +#ifdef CONFIG_H2CLBK +struct c2hlbk_event{ + unsigned char mac[6]; + unsigned short s0; + unsigned short s1; + unsigned int w0; + unsigned char b0; + unsigned short s2; + unsigned char b1; + unsigned int w1; +}; +#endif//CONFIG_H2CLBK + +#define GEN_EVT_CODE(event) event ## _EVT_ + + + +struct fwevent { + u32 parmsize; + void (*event_callback)(_adapter *dev, u8 *pbuf); +}; + + +#define C2HEVENT_SZ 32 + +struct event_node{ + unsigned char *node; + unsigned char evt_code; + unsigned short evt_sz; + volatile int *caller_ff_tail; + int caller_ff_sz; +}; + +struct c2hevent_queue { + volatile int head; + volatile int tail; + struct event_node nodes[C2HEVENT_SZ]; + unsigned char seq; +}; + +#define NETWORK_QUEUE_SZ 4 + +struct network_queue { + volatile int head; + volatile int tail; + WLAN_BSSID_EX networks[NETWORK_QUEUE_SZ]; +}; + + +#endif // _WLANEVENT_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ht.h b/drivers/net/wireless/rtl8192c/include/rtw_ht.h new file mode 100755 index 000000000000..239c42245440 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ht.h @@ -0,0 +1,51 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_HT_H_ +#define _RTW_HT_H_ + +#include +#include +#include "wifi.h" + +struct ht_priv +{ + u32 ht_option; + u32 ampdu_enable;//for enable Tx A-MPDU + //u8 baddbareq_issued[16]; + u32 tx_amsdu_enable;//for enable Tx A-MSDU + u32 tx_amdsu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx + u32 rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback. + + u8 bwmode;// + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + + //for processing Tx A-MPDU + u8 agg_enable_bitmap; + //u8 ADDBA_retry_count; + u8 candidate_tid_bitmap; + + struct ieee80211_ht_cap ht_cap; + +}; + +#endif //_RTL871X_HT_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_io.h b/drivers/net/wireless/rtl8192c/include/rtw_io.h new file mode 100755 index 000000000000..50226122c485 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_io.h @@ -0,0 +1,574 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IO_H_ +#define _RTW_IO_H_ + +#include +#include +#include + +#ifdef PLATFORM_LINUX +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) +#include +#else +#include +#endif +#include +#include +#include +#include + +#ifdef CONFIG_USB_HCI +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) +#include +#else +#include +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) +#define rtw_usb_buffer_alloc(dev, size, mem_flags, dma) usb_alloc_coherent((dev), (size), (mem_flags), (dma)) +#define rtw_usb_buffer_free(dev, size, addr, dma) usb_free_coherent((dev), (size), (addr), (dma)) +#else +#define rtw_usb_buffer_alloc(dev, size, mem_flags, dma) usb_buffer_alloc((dev), (size), (mem_flags), (dma)) +#define rtw_usb_buffer_free(dev, size, addr, dma) usb_buffer_free((dev), (size), (addr), (dma)) +#endif + + +#endif //CONFIG_USB_HCI + +#endif //PLATFORM_LINUX + + +#define NUM_IOREQ 8 + +#ifdef PLATFORM_WINDOWS +#define MAX_PROT_SZ 64 +#endif +#ifdef PLATFORM_LINUX +#define MAX_PROT_SZ (64-16) +#endif + +#define _IOREADY 0 +#define _IO_WAIT_COMPLETE 1 +#define _IO_WAIT_RSP 2 + +// IO COMMAND TYPE +#define _IOSZ_MASK_ (0x7F) +#define _IO_WRITE_ BIT(7) +#define _IO_FIXED_ BIT(8) +#define _IO_BURST_ BIT(9) +#define _IO_BYTE_ BIT(10) +#define _IO_HW_ BIT(11) +#define _IO_WORD_ BIT(12) +#define _IO_SYNC_ BIT(13) +#define _IO_CMDMASK_ (0x1F80) + + +/* + For prompt mode accessing, caller shall free io_req + Otherwise, io_handler will free io_req +*/ + + + +// IO STATUS TYPE +#define _IO_ERR_ BIT(2) +#define _IO_SUCCESS_ BIT(1) +#define _IO_DONE_ BIT(0) + + +#define IO_RD32 (_IO_SYNC_ | _IO_WORD_) +#define IO_RD16 (_IO_SYNC_ | _IO_HW_) +#define IO_RD8 (_IO_SYNC_ | _IO_BYTE_) + +#define IO_RD32_ASYNC (_IO_WORD_) +#define IO_RD16_ASYNC (_IO_HW_) +#define IO_RD8_ASYNC (_IO_BYTE_) + +#define IO_WR32 (_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_) +#define IO_WR16 (_IO_WRITE_ | _IO_SYNC_ | _IO_HW_) +#define IO_WR8 (_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_) + +#define IO_WR32_ASYNC (_IO_WRITE_ | _IO_WORD_) +#define IO_WR16_ASYNC (_IO_WRITE_ | _IO_HW_) +#define IO_WR8_ASYNC (_IO_WRITE_ | _IO_BYTE_) + +/* + + Only Sync. burst accessing is provided. + +*/ + +#define IO_WR_BURST(x) (_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_)) +#define IO_RD_BURST(x) (_IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_)) + + + +//below is for the intf_option bit defition... + +#define _INTF_ASYNC_ BIT(0) //support async io + +struct intf_priv; +struct intf_hdl; +struct io_queue; + +struct _io_ops { + + + uint (*_sdbus_read_bytes_to_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + uint (*_sdbus_read_blocks_to_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + u8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr); + + u16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr); + + u32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr); + + + uint (*_sdbus_write_blocks_from_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + + uint (*_sdbus_write_bytes_from_membuf)(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + u8 (*_cmd52r)(struct intf_priv *pintfpriv, u32 addr); + void (*_cmd52w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); + u8 (*_cmdfunc152r)(struct intf_priv *pintfpriv, u32 addr); + void (*_cmdfunc152w)(struct intf_priv *pintfpriv, u32 addr, u8 val8); + + + void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + int (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + + int (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + + int (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + + int (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata); + + int (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + + int (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + + int (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + + + void (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + void (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + void (*_sync_irp_protocol_rw)(struct io_queue *pio_q); + + + u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); + + u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + u32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); + + u32 (*_write_scsi)(struct intf_hdl *pintfhdl,u32 cnt, u8 *pmem); + + + void (*_read_port_cancel)(struct intf_hdl *pintfhdl); + + void (*_write_port_cancel)(struct intf_hdl *pintfhdl); + + + + u8 (*_async_read8)(struct intf_hdl *pintfhdl, u32 addr); + + u16 (*_async_read16)(struct intf_hdl *pintfhdl, u32 addr); + + u32 (*_async_read32)(struct intf_hdl *pintfhdl, u32 addr); + + void (*_async_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val); + + void (*_async_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val); + + void (*_async_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val); + + + + +}; + +struct io_req { + _list list; + u32 addr; + volatile u32 val; + u32 command; + u32 status; + u8 *pbuf; + _sema sema; + +#ifdef PLATFORM_OS_CE +#ifdef CONFIG_USB_HCI + // URB handler for rtw_write_mem + USB_TRANSFER usb_transfer_write_mem; +#endif +#endif + + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt); + u8 *cnxt; + +#ifdef PLATFORM_OS_XP + PMDL pmdl; + PIRP pirp; + +#ifdef CONFIG_SDIO_HCI + PSDBUS_REQUEST_PACKET sdrp; +#endif + +#endif + + +}; + +struct intf_hdl { + +/* + u32 intf_option; + u32 bus_status; + u32 do_flush; + u8 *adapter; + u8 *intf_dev; + struct intf_priv *pintfpriv; + u8 cnt; + void (*intf_hdl_init)(u8 *priv); + void (*intf_hdl_unload)(u8 *priv); + void (*intf_hdl_open)(u8 *priv); + void (*intf_hdl_close)(u8 *priv); + struct _io_ops io_ops; + //u8 intf_status;//moved to struct intf_priv + u16 len; + u16 done_len; +*/ + _adapter *padapter; + struct dvobj_priv *pintf_dev;// pointer to &(padapter->dvobjpriv); + + struct _io_ops io_ops; + +}; + +struct reg_protocol_rd { + +#ifdef CONFIG_LITTLE_ENDIAN + + //DW1 + u32 NumOfTrans:4; + u32 Reserved1:4; + u32 Reserved2:24; + //DW2 + u32 ByteCount:7; + u32 WriteEnable:1; //0:read, 1:write + u32 FixOrContinuous:1; //0:continuous, 1: Fix + u32 BurstMode:1; + u32 Byte1Access:1; + u32 Byte2Access:1; + u32 Byte4Access:1; + u32 Reserved3:3; + u32 Reserved4:16; + //DW3 + u32 BusAddress; + //DW4 + //u32 Value; +#else + + +//DW1 + u32 Reserved1 :4; + u32 NumOfTrans :4; + + u32 Reserved2 :24; + + //DW2 + u32 WriteEnable : 1; + u32 ByteCount :7; + + + u32 Reserved3 : 3; + u32 Byte4Access : 1; + + u32 Byte2Access : 1; + u32 Byte1Access : 1; + u32 BurstMode :1 ; + u32 FixOrContinuous : 1; + + u32 Reserved4 : 16; + + //DW3 + u32 BusAddress; + + //DW4 + //u32 Value; + +#endif + +}; + + +struct reg_protocol_wt { + + +#ifdef CONFIG_LITTLE_ENDIAN + + //DW1 + u32 NumOfTrans:4; + u32 Reserved1:4; + u32 Reserved2:24; + //DW2 + u32 ByteCount:7; + u32 WriteEnable:1; //0:read, 1:write + u32 FixOrContinuous:1; //0:continuous, 1: Fix + u32 BurstMode:1; + u32 Byte1Access:1; + u32 Byte2Access:1; + u32 Byte4Access:1; + u32 Reserved3:3; + u32 Reserved4:16; + //DW3 + u32 BusAddress; + //DW4 + u32 Value; + +#else + //DW1 + u32 Reserved1 :4; + u32 NumOfTrans :4; + + u32 Reserved2 :24; + + //DW2 + u32 WriteEnable : 1; + u32 ByteCount :7; + + u32 Reserved3 : 3; + u32 Byte4Access : 1; + + u32 Byte2Access : 1; + u32 Byte1Access : 1; + u32 BurstMode :1 ; + u32 FixOrContinuous : 1; + + u32 Reserved4 : 16; + + //DW3 + u32 BusAddress; + + //DW4 + u32 Value; + +#endif + +}; + + + +/* +Below is the data structure used by _io_handler + +*/ + +struct io_queue { + _lock lock; + _list free_ioreqs; + _list pending; //The io_req list that will be served in the single protocol read/write. + _list processing; + u8 *free_ioreqs_buf; // 4-byte aligned + u8 *pallocated_free_ioreqs_buf; + struct intf_hdl intf; +}; + +struct io_priv{ + + _adapter *padapter; + + struct intf_hdl intf; + +}; + +extern uint ioreq_flush(_adapter *adapter, struct io_queue *ioqueue); +extern void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue); +extern uint sync_ioreq_flush(_adapter *adapter, struct io_queue *ioqueue); + + +extern uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue); +extern struct io_req *alloc_ioreq(struct io_queue *pio_q); + +extern uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl); +extern void unregister_intf_hdl(struct intf_hdl *pintfhdl); + +extern void _rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void _rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); + +extern u8 _rtw_read8(_adapter *adapter, u32 addr); +extern u16 _rtw_read16(_adapter *adapter, u32 addr); +extern u32 _rtw_read32(_adapter *adapter, u32 addr); +extern void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void _rtw_read_port_cancel(_adapter *adapter); + + +extern int _rtw_write8(_adapter *adapter, u32 addr, u8 val); +extern int _rtw_write16(_adapter *adapter, u32 addr, u16 val); +extern int _rtw_write32(_adapter *adapter, u32 addr, u32 val); +extern int _rtw_writeN(_adapter *adapter, u32 addr, u32 length, u8 *pdata); + +extern int _rtw_write8_async(_adapter *adapter, u32 addr, u8 val); +extern int _rtw_write16_async(_adapter *adapter, u32 addr, u16 val); +extern int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val); + +extern void _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void _rtw_write_port_cancel(_adapter *adapter); + +#ifdef DBG_IO +#define rtw_read8(adapter, addr) _rtw_read8((adapter), (addr)) +#define rtw_read16(adapter, addr) _rtw_read16((adapter), (addr)) +#define rtw_read32(adapter, addr) _rtw_read32((adapter), (addr)) +#define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem)) +#define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem)) +#define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter)) + +#define DBG_IO_WRITE_SNIFF_ADDR_START 0x80 //0x4c //0x4c // the starting address to sniff +#define DBG_IO_WRITE_SNIFF_ADDR_END 0x80 //0x4c+ 1 // the ending address to sniff + +#define rtw_write8(adapter, addr, val) \ + do { \ + if((u32)(addr) + 1 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ + DBG_871X("DBG_IO %s:%d rtw_write8(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u8)(val)); \ + } \ + _rtw_write8((adapter), (addr), (val)); \ + } while(0) +#define rtw_write16(adapter, addr, val) \ + do { \ + if((u32)(addr) + 2 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ + DBG_871X("DBG_IO %s:%d rtw_write16(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u16)(val)); \ + } \ + _rtw_write16((adapter), (addr), (val)); \ + } while(0) +#define rtw_write32(adapter, addr, val) \ + do { \ + if((u32)(addr) + 4 > DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ + DBG_871X("DBG_IO %s:%d rtw_write32(0x%04x, 0x%08x)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u32)(val)); \ + } \ + _rtw_write32((adapter), (addr), (val)); \ + } while(0) +#define rtw_writeN(adapter, addr, length, data) \ + do { \ + if((u32)(addr) + (length)> DBG_IO_WRITE_SNIFF_ADDR_START && (u32)(addr) <= DBG_IO_WRITE_SNIFF_ADDR_END) { \ + DBG_871X("DBG_IO %s:%d rtw_writeN(0x%04x, %u)\n", __FUNCTION__, __LINE__ ,(u32)(addr) ,(u32)(length)); \ + } \ + _rtw_writeN((adapter), (addr), (length), (data)); \ + } while(0) + +#define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val)) +#define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val)) +#define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val)) + +#define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), addr, cnt, mem) +#define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port(adapter, addr, cnt, mem) +#define rtw_write_port_cancel(adapter) _rtw_write_port_cancel(adapter) +#else //DBG_IO +#define rtw_read8(adapter, addr) _rtw_read8((adapter), (addr)) +#define rtw_read16(adapter, addr) _rtw_read16((adapter), (addr)) +#define rtw_read32(adapter, addr) _rtw_read32((adapter), (addr)) +#define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem)) +#define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem)) +#define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter)) + +#define rtw_write8(adapter, addr, val) _rtw_write8((adapter), (addr), (val)) +#define rtw_write16(adapter, addr, val) _rtw_write16((adapter), (addr), (val)) +#define rtw_write32(adapter, addr, val) _rtw_write32((adapter), (addr), (val)) +#define rtw_writeN(adapter, addr, length, data) _rtw_writeN((adapter), (addr), (length), (data)) + +#define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val)) +#define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val)) +#define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val)) + +#define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), (addr), (cnt), (mem)) +#define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port((adapter), (addr), (cnt), (mem)) +#define rtw_write_port_cancel(adapter) _rtw_write_port_cancel((adapter)) +#endif //DBG_IO + +extern void rtw_write_scsi(_adapter *adapter, u32 cnt, u8 *pmem); + +//ioreq +extern void ioreq_read8(_adapter *adapter, u32 addr, u8 *pval); +extern void ioreq_read16(_adapter *adapter, u32 addr, u16 *pval); +extern void ioreq_read32(_adapter *adapter, u32 addr, u32 *pval); +extern void ioreq_write8(_adapter *adapter, u32 addr, u8 val); +extern void ioreq_write16(_adapter *adapter, u32 addr, u16 val); +extern void ioreq_write32(_adapter *adapter, u32 addr, u32 val); + + +extern uint async_read8(_adapter *adapter, u32 addr, u8 *pbuff, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern uint async_read16(_adapter *adapter, u32 addr, u8 *pbuff, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern uint async_read32(_adapter *adapter, u32 addr, u8 *pbuff, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); + +extern void async_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void async_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); + +extern void async_write8(_adapter *adapter, u32 addr, u8 val, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern void async_write16(_adapter *adapter, u32 addr, u16 val, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); +extern void async_write32(_adapter *adapter, u32 addr, u32 val, + void (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); + +extern void async_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); +extern void async_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem); + + +int rtw_init_io_priv(_adapter *padapter); + + +extern uint alloc_io_queue(_adapter *adapter); +extern void free_io_queue(_adapter *adapter); +extern void async_bus_io(struct io_queue *pio_q); +extern void bus_sync_io(struct io_queue *pio_q); +extern u32 _ioreq2rwmem(struct io_queue *pio_q); +extern void dev_power_down(_adapter * Adapter, u8 bpwrup); + +/* +#define RTL_R8(reg) rtw_read8(padapter, reg) +#define RTL_R16(reg) rtw_read16(padapter, reg) +#define RTL_R32(reg) rtw_read32(padapter, reg) +#define RTL_W8(reg, val8) rtw_write8(padapter, reg, val8) +#define RTL_W16(reg, val16) rtw_write16(padapter, reg, val16) +#define RTL_W32(reg, val32) rtw_write32(padapter, reg, val32) +*/ + +/* +#define RTL_W8_ASYNC(reg, val8) rtw_write32_async(padapter, reg, val8) +#define RTL_W16_ASYNC(reg, val16) rtw_write32_async(padapter, reg, val16) +#define RTL_W32_ASYNC(reg, val32) rtw_write32_async(padapter, reg, val32) + +#define RTL_WRITE_BB(reg, val32) phy_SetUsbBBReg(padapter, reg, val32) +#define RTL_READ_BB(reg) phy_QueryUsbBBReg(padapter, reg) +*/ + +#endif //_RTL8711_IO_H_ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h new file mode 100755 index 000000000000..012e4bcd5bbd --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl.h @@ -0,0 +1,271 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IOCTL_H_ +#define _RTW_IOCTL_H_ + +#include +#include +#include + +#ifndef OID_802_11_CAPABILITY + #define OID_802_11_CAPABILITY 0x0d010122 +#endif + +#ifndef OID_802_11_PMKID + #define OID_802_11_PMKID 0x0d010123 +#endif + + +// For DDK-defined OIDs +#define OID_NDIS_SEG1 0x00010100 +#define OID_NDIS_SEG2 0x00010200 +#define OID_NDIS_SEG3 0x00020100 +#define OID_NDIS_SEG4 0x01010100 +#define OID_NDIS_SEG5 0x01020100 +#define OID_NDIS_SEG6 0x01020200 +#define OID_NDIS_SEG7 0xFD010100 +#define OID_NDIS_SEG8 0x0D010100 +#define OID_NDIS_SEG9 0x0D010200 +#define OID_NDIS_SEG10 0x0D020200 + +#define SZ_OID_NDIS_SEG1 23 +#define SZ_OID_NDIS_SEG2 3 +#define SZ_OID_NDIS_SEG3 6 +#define SZ_OID_NDIS_SEG4 6 +#define SZ_OID_NDIS_SEG5 4 +#define SZ_OID_NDIS_SEG6 8 +#define SZ_OID_NDIS_SEG7 7 +#define SZ_OID_NDIS_SEG8 36 +#define SZ_OID_NDIS_SEG9 24 +#define SZ_OID_NDIS_SEG10 19 + +// For Realtek-defined OIDs +#define OID_MP_SEG1 0xFF871100 +#define OID_MP_SEG2 0xFF818000 + +#define OID_MP_SEG3 0xFF818700 +#define OID_MP_SEG4 0xFF011100 + +#define DEBUG_OID(dbg, str) \ + if((!dbg)) \ + { \ + RT_TRACE(_module_rtl871x_ioctl_c_,_drv_info_,("%s(%d): %s", __FUNCTION__, __LINE__, str)); \ + } + + +enum oid_type +{ + QUERY_OID, + SET_OID +}; + +struct oid_funs_node { + unsigned int oid_start; //the starting number for OID + unsigned int oid_end; //the ending number for OID + struct oid_obj_priv *node_array; + unsigned int array_sz; //the size of node_array + int query_counter; //count the number of query hits for this segment + int set_counter; //count the number of set hits for this segment +}; + +struct oid_par_priv +{ + void *adapter_context; + NDIS_OID oid; + void* information_buf; + unsigned long information_buf_len; + unsigned long* bytes_rw; + unsigned long* bytes_needed; + enum oid_type type_of_oid; + unsigned int dbg; +}; + +struct oid_obj_priv { + unsigned char dbg; // 0: without OID debug message 1: with OID debug message + NDIS_STATUS (*oidfuns)(struct oid_par_priv *poid_par_priv); +}; + +#ifdef CONFIG_MP_INCLUDED +static NDIS_STATUS oid_null_function(struct oid_par_priv* poid_par_priv) +{ + _func_enter_; + _func_exit_; + return NDIS_STATUS_SUCCESS; +} +#endif + +#ifdef PLATFORM_WINDOWS + +int TranslateNdisPsToRtPs(IN NDIS_802_11_POWER_MODE ndisPsMode); + +//OID Handler for Segment 1 +NDIS_STATUS oid_gen_supported_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_hardware_status_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_media_supported_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_media_in_use_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_lookahead_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_frame_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_link_speed_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_transmit_buffer_space_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_receive_buffer_space_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_transmit_block_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_receive_block_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_vendor_id_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_vendor_description_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_current_packet_filter_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_current_lookahead_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_driver_version_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_total_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_protocol_options_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_mac_options_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_media_connect_status_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_maximum_send_packets_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_vendor_driver_version_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 2 +NDIS_STATUS oid_gen_physical_medium_hdl(struct oid_par_priv* poid_par_priv); + +//OID Handler for Segment 3 +NDIS_STATUS oid_gen_xmit_ok_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_rcv_ok_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_xmit_error_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_rcv_error_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_gen_rcv_no_buffer_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 4 +NDIS_STATUS oid_802_3_permanent_address_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_current_address_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_multicast_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_maximum_list_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_mac_options_hdl(struct oid_par_priv* poid_par_priv); + + + +//OID Handler for Segment 5 +NDIS_STATUS oid_802_3_rcv_error_alignment_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_one_collision_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_more_collisions_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 6 +NDIS_STATUS oid_802_3_xmit_deferred_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_max_collisions_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_rcv_overrun_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_underrun_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_heartbeat_failure_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_times_crs_lost_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_3_xmit_late_collisions_hdl(struct oid_par_priv* poid_par_priv); + + + +//OID Handler for Segment 7 +NDIS_STATUS oid_pnp_capabilities_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_set_power_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_query_power_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_add_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_remove_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_wake_up_pattern_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_pnp_enable_wake_up_hdl(struct oid_par_priv* poid_par_priv); + + + +//OID Handler for Segment 8 +NDIS_STATUS oid_802_11_bssid_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_ssid_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_infrastructure_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_add_wep_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_remove_wep_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_disassociate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_authentication_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_privacy_filter_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_bssid_list_scan_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_encryption_status_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_reload_defaults_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_add_key_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_remove_key_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_association_information_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_test_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_media_stream_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_capability_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_pmkid_hdl(struct oid_par_priv* poid_par_priv); + + + + + +//OID Handler for Segment 9 +NDIS_STATUS oid_802_11_network_types_supported_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_network_type_in_use_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_tx_power_level_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rssi_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rssi_trigger_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_fragmentation_threshold_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rts_threshold_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_number_of_antennas_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_rx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_tx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_supported_rates_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_desired_rates_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_configuration_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_power_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_802_11_bssid_list_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment 10 +NDIS_STATUS oid_802_11_statistics_hdl(struct oid_par_priv* poid_par_priv); + + +//OID Handler for Segment ED +NDIS_STATUS oid_rt_mh_vender_id_hdl(struct oid_par_priv* poid_par_priv); + +void Set_802_3_MULTICAST_LIST(ADAPTER *pAdapter, UCHAR *MCListbuf, ULONG MCListlen, BOOLEAN bAcceptAllMulticast); + +#endif// end of PLATFORM_WINDOWS + + +#ifdef PLATFORM_LINUX + +extern struct iw_handler_def rtw_handlers_def; + +#endif + +extern NDIS_STATUS drv_query_info( + IN _nic_hdl MiniportAdapterContext, + IN NDIS_OID Oid, + IN void * InformationBuffer, + IN u32 InformationBufferLength, + OUT u32* BytesWritten, + OUT u32* BytesNeeded + ); + +extern NDIS_STATUS drv_set_info( + IN _nic_hdl MiniportAdapterContext, + IN NDIS_OID Oid, + IN void * InformationBuffer, + IN u32 InformationBufferLength, + OUT u32* BytesRead, + OUT u32* BytesNeeded + ); + +#endif // #ifndef __INC_CEINFO_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h new file mode 100755 index 000000000000..e9ad16f172fb --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_query.h @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IOCTL_QUERY_H_ +#define _RTW_IOCTL_QUERY_H_ + +#include +#include + + +#ifdef PLATFORM_WINDOWS + +u8 query_802_11_capability(_adapter* padapter,u8* pucBuf,u32 * pulOutLen); +u8 query_802_11_association_information (_adapter * padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo); + +#endif + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h new file mode 100755 index 000000000000..1ea8f21b02c4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_rtl.h @@ -0,0 +1,84 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_IOCTL_RTL_H_ +#define _RTW_IOCTL_RTL_H_ + +#include +#include +#include + +//************** oid_rtl_seg_01_01 ************** +NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv);//84 +NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv); //8a +NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv); //8b + +NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv);//93 +NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv); + +//************** oid_rtl_seg_01_03 section start ************** +NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv); + +// oid_rtl_seg_01_11 +NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv); + +//************** oid_rtl_seg_03_00 section start ************** +NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv); + + + + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h new file mode 100755 index 000000000000..15e156ac6a17 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_ioctl_set.h @@ -0,0 +1,74 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_IOCTL_SET_H_ +#define __RTW_IOCTL_SET_H_ + +#include +#include + + +typedef u8 NDIS_802_11_PMKID_VALUE[16]; + +typedef struct _BSSIDInfo { + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_PMKID_VALUE PMKID; +} BSSIDInfo, *PBSSIDInfo; + + +#ifdef PLATFORM_OS_XP +typedef struct _NDIS_802_11_PMKID { + u32 Length; + u32 BSSIDInfoCount; + BSSIDInfo BSSIDInfo[1]; +} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID; +#endif + + +#ifdef PLATFORM_WINDOWS +u8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults); +u8 rtw_set_802_11_test(_adapter * padapter, NDIS_802_11_TEST * test); +u8 rtw_set_802_11_pmkid(_adapter *pdapter, NDIS_802_11_PMKID *pmkid); + +u8 rtw_pnp_set_power_sleep(_adapter* padapter); +u8 rtw_pnp_set_power_wakeup(_adapter* padapter); + +void rtw_pnp_resume_wk(void *context); +void rtw_pnp_sleep_wk(void * context); + +#endif + +u8 rtw_set_802_11_add_key(_adapter * padapter, NDIS_802_11_KEY * key); +u8 rtw_set_802_11_authentication_mode(_adapter *pdapter, NDIS_802_11_AUTHENTICATION_MODE authmode); +u8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid); +u8 rtw_set_802_11_add_wep(_adapter * padapter, NDIS_802_11_WEP * wep); +u8 rtw_set_802_11_disassociate(_adapter * padapter); +u8 rtw_set_802_11_bssid_list_scan(_adapter* padapter); +u8 rtw_set_802_11_infrastructure_mode(_adapter * padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype); +u8 rtw_set_802_11_remove_wep(_adapter * padapter, u32 keyindex); +u8 rtw_set_802_11_ssid(_adapter * padapter, NDIS_802_11_SSID * ssid); +u8 rtw_set_802_11_remove_key(_adapter * padapter, NDIS_802_11_REMOVE_KEY * key); + + +u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid); + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_led.h b/drivers/net/wireless/rtl8192c/include/rtw_led.h new file mode 100755 index 000000000000..665cc4117fc3 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_led.h @@ -0,0 +1,212 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_LED_H_ +#define __RTW_LED_H_ + +#include +#include +#include + +#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000) + +typedef enum _LED_CTL_MODE{ + LED_CTL_POWER_ON = 1, + LED_CTL_LINK = 2, + LED_CTL_NO_LINK = 3, + LED_CTL_TX = 4, + LED_CTL_RX = 5, + LED_CTL_SITE_SURVEY = 6, + LED_CTL_POWER_OFF = 7, + LED_CTL_START_TO_LINK = 8, + LED_CTL_START_WPS = 9, + LED_CTL_STOP_WPS = 10, + LED_CTL_START_WPS_BOTTON = 11, //added for runtop + LED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA + LED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN +}LED_CTL_MODE; + + +#ifdef CONFIG_USB_HCI +//================================================================================ +// LED object. +//================================================================================ + +typedef enum _LED_STATE_871x{ + LED_UNKNOWN = 0, + LED_ON = 1, + LED_OFF = 2, + LED_BLINK_NORMAL = 3, + LED_BLINK_SLOWLY = 4, + LED_POWER_ON_BLINK = 5, + LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. + LED_NO_LINK_BLINK = 7, // LED is blinking during no link state. + LED_BLINK_StartToBlink = 8,// Customzied for Sercomm Printer Server case + LED_BLINK_WPS = 9, // LED is blinkg during WPS communication + LED_TXRX_BLINK = 10, + LED_BLINK_WPS_STOP = 11, //for ALPHA + LED_BLINK_WPS_STOP_OVERLAP = 12, //for BELKIN +}LED_STATE_871x; + +#define IS_LED_WPS_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS \ + || ((PLED_871x)_LED_871x)->CurrLedState==LED_BLINK_WPS_STOP \ + || ((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress) + +#define IS_LED_BLINKING(_LED_871x) (((PLED_871x)_LED_871x)->bLedWPSBlinkInProgress \ + ||((PLED_871x)_LED_871x)->bLedScanBlinkInProgress) + +typedef enum _LED_PIN_871x{ + LED_PIN_GPIO0, + LED_PIN_LED0, + LED_PIN_LED1 +}LED_PIN_871x; + +typedef struct _LED_871x{ + _adapter *padapter; + LED_PIN_871x LedPin; // Identify how to implement this SW led. + LED_STATE_871x CurrLedState; // Current LED state. + u8 bLedOn; // true if LED is ON, false if LED is OFF. + + u8 bSWLedCtrl; + + u8 bLedBlinkInProgress; // true if it is blinking, false o.w.. + // ALPHA, added by chiyoko, 20090106 + u8 bLedNoLinkBlinkInProgress; + u8 bLedLinkBlinkInProgress; + u8 bLedStartToLinkBlinkInProgress; + u8 bLedScanBlinkInProgress; + u8 bLedWPSBlinkInProgress; + + u32 BlinkTimes; // Number of times to toggle led state for blinking. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are. + + _timer BlinkTimer; // Timer object for led blinking. +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) + _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED. +#endif +} LED_871x, *PLED_871x; + + +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1, // 2 LEDs, through LED0 and LED1. For ALPHA. + SW_LED_MODE2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard. + SW_LED_MODE3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case. + SW_LED_MODE4, //for Edimax / Belkin + SW_LED_MODE5, //for Sercomm / Belkin + SW_LED_MODE6, //for 88CU minicard, porting from ce SW_LED_MODE7 + HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.) +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; +#endif //CONFIG_USB_HCI + +#ifdef CONFIG_PCI_HCI +//================================================================================ +// LED object. +//================================================================================ + +typedef enum _LED_STATE_871x{ + LED_UNKNOWN = 0, + LED_ON = 1, + LED_OFF = 2, + LED_BLINK_NORMAL = 3, + LED_BLINK_SLOWLY = 4, + LED_POWER_ON_BLINK = 5, + LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning. + LED_NO_LINK_BLINK = 7, // LED is blinking during no link state. + LED_BLINK_StartToBlink = 8, + LED_BLINK_TXRX = 9, + LED_BLINK_RUNTOP = 10, // Customized for RunTop + LED_BLINK_CAMEO = 11, +}LED_STATE_871x; + +typedef enum _LED_PIN_871x{ + LED_PIN_GPIO0, + LED_PIN_LED0, + LED_PIN_LED1, + LED_PIN_LED2 +}LED_PIN_871x; + +typedef struct _LED_871x{ + _adapter *padapter; + + LED_PIN_871x LedPin; // Identify how to implement this SW led. + + LED_STATE_871x CurrLedState; // Current LED state. + u8 bLedOn; // TRUE if LED is ON, FALSE if LED is OFF. + + u8 bLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w.. + u8 bLedWPSBlinkInProgress; // TRUE if it is blinking, FALSE o.w.. + + u8 bLedSlowBlinkInProgress;//added by vivi, for led new mode + u32 BlinkTimes; // Number of times to toggle led state for blinking. + LED_STATE_871x BlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are. + + _timer BlinkTimer; // Timer object for led blinking. +} LED_871x, *PLED_871x; + + +//================================================================================ +// LED customization. +//================================================================================ + +typedef enum _LED_STRATEGY_871x{ + SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option. + SW_LED_MODE1, // SW control for PCI Express + SW_LED_MODE2, // SW control for Cameo. + SW_LED_MODE3, // SW contorl for RunTop. + SW_LED_MODE4, // SW control for Netcore + SW_LED_MODE5, //added by vivi, for led new mode, DLINK + SW_LED_MODE6, //added by vivi, for led new mode, PRONET + SW_LED_MODE7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec + SW_LED_MODE8, //added by chiyokolin, for QMI + SW_LED_MODE9, //added by chiyokolin, for BITLAND, PCI Express Minicard Spec Rev.1.1 + SW_LED_MODE10, //added by chiyokolin, for Edimax-ASUS + HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes) +}LED_STRATEGY_871x, *PLED_STRATEGY_871x; + +#define LED_CM8_BLINK_INTERVAL 500 //for QMI +#endif //CONFIG_PCI_HCI + +struct led_priv{ + /* add for led controll */ + LED_871x SwLed0; + LED_871x SwLed1; + LED_STRATEGY_871x LedStrategy; + u8 bRegUseLed; + void (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction); + /* add for led controll */ +}; + +#ifdef CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) \ + do { \ + if((adapter)->ledpriv.LedControlHandler) \ + (adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \ + } while(0) +#else //CONFIG_SW_LED +#define rtw_led_control(adapter, LedAction) +#endif //CONFIG_SW_LED + +#endif //__RTW_LED_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mlme.h b/drivers/net/wireless/rtl8192c/include/rtw_mlme.h new file mode 100755 index 000000000000..7af33276e04e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mlme.h @@ -0,0 +1,585 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_MLME_H_ +#define __RTW_MLME_H_ + +#include +#include +#include +#include + + +#define MAX_BSS_CNT 64 +//#define MAX_JOIN_TIMEOUT 2000 +//#define MAX_JOIN_TIMEOUT 2500 +#define MAX_JOIN_TIMEOUT 6500 + +// Commented by Albert 20101105 +// Increase the scanning timeout because of increasing the SURVEY_TO value. + +#define SCANNING_TIMEOUT 8000 + +#define SCAN_INTERVAL (30) // unit:2sec, 30*2=60sec + +#ifdef PALTFORM_OS_WINCE +#define SCANQUEUE_LIFETIME 12000000 // unit:us +#else +#define SCANQUEUE_LIFETIME 20 // unit:sec +#endif + +#define WIFI_NULL_STATE 0x00000000 +#define WIFI_ASOC_STATE 0x00000001 // Under Linked state... +#define WIFI_REASOC_STATE 0x00000002 +#define WIFI_SLEEP_STATE 0x00000004 +#define WIFI_STATION_STATE 0x00000008 +#define WIFI_AP_STATE 0x00000010 +#define WIFI_ADHOC_STATE 0x00000020 +#define WIFI_ADHOC_MASTER_STATE 0x00000040 +#define WIFI_UNDER_LINKING 0x00000080 +//#define WIFI_UNDER_CMD 0x00000200 +// ========== P2P Section Start =============== +#define WIFI_P2P_LISTEN_STATE 0x00010000 +#define WIFI_P2P_GROUP_FORMATION_STATE 0x00020000 +// ========== P2P Section End =============== +#define WIFI_SITE_MONITOR 0x00000800 //to indicate the station is under site surveying + +#ifdef WDS +#define WIFI_WDS 0x00001000 +#define WIFI_WDS_RX_BEACON 0x00002000 // already rx WDS AP beacon +#endif +#ifdef AUTO_CONFIG +#define WIFI_AUTOCONF 0x00004000 +#define WIFI_AUTOCONF_IND 0x00008000 +#endif + +//#ifdef UNDER_MPTEST +#define WIFI_MP_STATE 0x00010000 +#define WIFI_MP_CTX_BACKGROUND 0x00020000 // in continous tx background +#define WIFI_MP_CTX_ST 0x00040000 // in continous tx with single-tone +#define WIFI_MP_CTX_BACKGROUND_PENDING 0x00080000 // pending in continous tx background due to out of skb +#define WIFI_MP_CTX_CCK_HW 0x00100000 // in continous tx +#define WIFI_MP_CTX_CCK_CS 0x00200000 // in continous tx with carrier suppression +#define WIFI_MP_LPBK_STATE 0x00400000 +//#endif + +//#define _FW_UNDER_CMD WIFI_UNDER_CMD +#define _FW_UNDER_LINKING WIFI_UNDER_LINKING +#define _FW_LINKED WIFI_ASOC_STATE +#define _FW_UNDER_SURVEY WIFI_SITE_MONITOR + +enum dot11AuthAlgrthmNum { + dot11AuthAlgrthm_Open = 0, + dot11AuthAlgrthm_Shared, + dot11AuthAlgrthm_8021X, + dot11AuthAlgrthm_Auto, + dot11AuthAlgrthm_MaxNum +}; + +// Scan type including active and passive scan. +typedef enum _RT_SCAN_TYPE +{ + SCAN_PASSIVE, + SCAN_ACTIVE, + SCAN_MIX, +}RT_SCAN_TYPE, *PRT_SCAN_TYPE; + +/* + +there are several "locks" in mlme_priv, +since mlme_priv is a shared resource between many threads, +like ISR/Call-Back functions, the OID handlers, and even timer functions. + + +Each _queue has its own locks, already. +Other items are protected by mlme_priv.lock. + +To avoid possible dead lock, any thread trying to modifiying mlme_priv +SHALL not lock up more than one locks at a time! + +*/ + + +#define traffic_threshold 10 +#define traffic_scan_period 500 + +struct sitesurvey_ctrl { + u64 last_tx_pkts; + uint last_rx_pkts; + sint traffic_busy; + _timer sitesurvey_ctrl_timer; +}; + +typedef struct _RT_LINK_DETECT_T{ + u32 NumTxOkInPeriod; + u32 NumRxOkInPeriod; + u32 NumRxUnicastOkInPeriod; + BOOLEAN bBusyTraffic; + BOOLEAN bTxBusyTraffic; + BOOLEAN bRxBusyTraffic; + BOOLEAN bHigherBusyTraffic; // For interrupt migration purpose. + BOOLEAN bHigherBusyRxTraffic; // We may disable Tx interrupt according as Rx traffic. +}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T; + +struct profile_info { + u8 ssidlen; + u8 ssid[ WLAN_SSID_MAXLEN ]; + u8 peermac[ ETH_ALEN ]; +}; + +struct tx_invite_req_info{ + u8 token; + u8 ssid[ WLAN_SSID_MAXLEN ]; + u8 ssidlen; + u8 peer_operation_ch; +}; + +struct tx_invite_resp_info{ + u8 token; // Used to record the dialog token of p2p invitation request frame. +}; + +#ifdef CONFIG_WFD + +struct wifi_display_info{ + u16 rtsp_ctrlport; // TCP port number at which the this WFD device listens for RTSP messages + u16 peer_rtsp_ctrlport; // TCP port number at which the peer WFD device listens for RTSP messages + // This filed should be filled when receiving the gropu negotiation request +}; +#endif //CONFIG_WFD + +struct tx_provdisc_req_info{ + u16 wps_config_method_request; // Used when sending the provisioning request frame + u16 peer_channel_num[2]; // The channel number which the receiver stands. + NDIS_802_11_SSID ssid; + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 peerIFAddr[ ETH_ALEN ]; // Peer interface address + u8 benable; // This provision discovery request frame is trigger to send or not +}; + +struct rx_provdisc_req_info{ //When peer device issue prov_disc_req first, we should store the following informations + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 strconfig_method_desc_of_prov_disc_req[4]; // description for the config method located in the provisioning discovery request frame. + // The UI must know this information to know which config method the remote p2p device is requiring. +}; + +struct tx_nego_req_info{ + u16 peer_channel_num[2]; // The channel number which the receiver stands. + u8 peerDevAddr[ ETH_ALEN ]; // Peer device address + u8 benable; // This negoitation request frame is trigger to send or not +}; + +struct wifidirect_info{ + _adapter* padapter; + _timer find_phase_timer; + _timer restore_p2p_state_timer; + + // Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer. + _timer pre_tx_scan_timer; + struct tx_provdisc_req_info tx_prov_disc_info; + struct rx_provdisc_req_info rx_prov_disc_info; + struct tx_invite_req_info invitereq_info; + struct profile_info profileinfo[ P2P_MAX_PERSISTENT_GROUP_NUM ]; // Store the profile information of persistent group + struct tx_invite_resp_info inviteresp_info; + struct tx_nego_req_info nego_req_info; +#ifdef CONFIG_WFD + struct wifi_display_info wfd_info; +#endif + enum P2P_ROLE role; + enum P2P_STATE pre_p2p_state; + enum P2P_STATE p2p_state; + u8 device_addr[ETH_ALEN]; // The device address should be the mac address of this device. + u8 interface_addr[ETH_ALEN]; + u8 social_chan[4]; + u8 listen_channel; + u8 operating_channel; + u8 listen_dwell; // This value should be between 1 and 3 + u8 support_rate[8]; + u8 p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN]; + u8 intent; // should only include the intent value. + u8 p2p_peer_interface_addr[ ETH_ALEN ]; + u8 peer_intent; // Included the intent value and tie breaker value. + u8 device_name[ WPS_MAX_DEVICE_NAME_LEN ]; // Device name for displaying on searching device screen + u8 device_name_len; + u8 profileindex; // Used to point to the index of profileinfo array + u8 peer_operating_ch; + u8 find_phase_state_exchange_cnt; + u16 device_password_id_for_nego; // The device password ID for group negotation + u8 negotiation_dialog_token; + u8 nego_ssid[ WLAN_SSID_MAXLEN ]; // SSID information for group negotitation + u8 nego_ssidlen; + u8 p2p_group_ssid[WLAN_SSID_MAXLEN]; + u8 p2p_group_ssid_len; + + enum P2P_WPSINFO ui_got_wps_info; // This field will store the WPS value (PIN value or PBC) that UI had got from the user. + u16 supported_wps_cm; // This field describes the WPS config method which this driver supported. + // The value should be the combination of config method defined in page104 of WPS v2.0 spec. + u8 channel_cnt; // This field is the count number for P2P Channel List attribute of group negotitation response frame. + u8 channel_list[13]; // This field will contain the channel number of P2P Channel List attribute of group negotitation response frame. + // We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. + u8 p2p_ps_enable; + enum P2P_PS p2p_ps; // indicate p2p ps state + u8 noa_index; // Identifies and instance of Notice of Absence timing. + u8 ctwindow; // Client traffic window. A period of time in TU after TBTT. + u8 opp_ps; // opportunistic power save. + u8 noa_num; // number of NoA descriptor in P2P IE. + u8 noa_count[P2P_MAX_NOA_NUM]; // Count for owner, Type of client. + u32 noa_duration[P2P_MAX_NOA_NUM]; // Max duration for owner, preferred or min acceptable duration for client. + u32 noa_interval[P2P_MAX_NOA_NUM]; // Length of interval for owner, preferred or max acceptable interval of client. + u32 noa_start_time[P2P_MAX_NOA_NUM]; // schedule expressed in terms of the lower 4 bytes of the TSF timer. +}; + + +struct mlme_priv { + + _lock lock; + sint fw_state; //shall we protect this variable? maybe not necessarily... + + u8 to_join; //flag + #ifdef CONFIG_LAYER2_ROAMING + u8 to_roaming; // roaming trying times + #endif + + u8 *nic_hdl; + + _list *pscanned; + _queue free_bss_pool; + _queue scanned_queue; + u8 *free_bss_buf; + u32 num_of_scanned; + + NDIS_802_11_SSID assoc_ssid; + u8 assoc_bssid[6]; + + struct wlan_network cur_network; + + //uint wireless_mode; no used, remove it + + u32 scan_interval; + + _timer assoc_timer; + + uint assoc_by_bssid; + + _timer scan_to_timer; // driver itself handles scan_timeout status. + u32 scan_start_time; // used to evaluate the time spent in scanning + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + _timer set_scan_deny_timer; + ATOMIC_T set_scan_deny; //0: allowed, 1: deny + #endif + + struct qos_priv qospriv; + +#ifdef CONFIG_80211N_HT + + /* Number of non-HT AP/stations */ + int num_sta_no_ht; + + /* Number of HT AP/stations 20 MHz */ + //int num_sta_ht_20mhz; + + + int num_FortyMHzIntolerant; + + struct ht_priv htpriv; + +#endif + + RT_LINK_DETECT_T LinkDetectInfo; + _timer dynamic_chk_timer; //dynamic/periodic check timer + + u8 key_mask; //use for ips to set wep key after ips_leave + u8 ChannelPlan; + u8 scan_mode; // active: 1, passive: 0 + + + u8 probereq_wpsie[MAX_WPS_IE_LEN];//added in probe req + int probereq_wpsie_len; + +#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) + /* Number of associated Non-ERP stations (i.e., stations using 802.11b + * in 802.11g BSS) */ + int num_sta_non_erp; + + /* Number of associated stations that do not support Short Slot Time */ + int num_sta_no_short_slot_time; + + /* Number of associated stations that do not support Short Preamble */ + int num_sta_no_short_preamble; + + int olbc; /* Overlapping Legacy BSS Condition */ + + /* Number of HT associated stations that do not support greenfield */ + int num_sta_ht_no_gf; + + /* Number of associated non-HT stations */ + //int num_sta_no_ht; + + /* Number of HT associated stations 20 MHz */ + int num_sta_ht_20mhz; + + /* Overlapping BSS information */ + int olbc_ht; + +#ifdef CONFIG_80211N_HT + u16 ht_op_mode; +#endif /* CONFIG_80211N_HT */ + + u8 *wps_beacon_ie; + u8 *wps_probe_resp_ie; + u8 *wps_assoc_resp_ie; + u32 wps_beacon_ie_len; + u32 wps_probe_resp_ie_len; + u32 wps_assoc_resp_ie_len; + + + _lock bcn_update_lock; + u8 update_bcn; + + +#endif + +#ifdef RTK_DMP_PLATFORM + // DMP kobject_hotplug function signal need in passive level + _workitem Linkup_workitem; + _workitem Linkdown_workitem; +#endif + +}; + +#ifdef CONFIG_AP_MODE + +struct hostapd_priv +{ + _adapter *padapter; + +#ifdef CONFIG_HOSTAPD_MLME + struct net_device *pmgnt_netdev; + struct usb_anchor anchored; +#endif + +}; + +extern int hostapd_mode_init(_adapter *padapter); +extern void hostapd_mode_unload(_adapter *padapter); +#endif + +extern void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf); +extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf); + +#ifdef PLATFORM_WINDOWS +extern thread_return event_thread(void *context); + +extern void rtw_join_timeout_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +extern void _rtw_scan_timeout_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +#endif + +#ifdef PLATFORM_LINUX +extern int event_thread(void *context); +extern void rtw_join_timeout_handler(void* FunctionContext); +extern void _rtw_scan_timeout_handler(void* FunctionContext); +#endif + +extern void rtw_free_network_queue(_adapter *adapter,u8 isfreeall); +extern int rtw_init_mlme_priv(_adapter *adapter);// (struct mlme_priv *pmlmepriv); + +extern void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv); + + +extern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv); +extern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx); +extern sint rtw_set_auth(_adapter *adapter,struct security_priv *psecuritypriv); + +__inline static u8 *get_bssid(struct mlme_priv *pmlmepriv) +{ //if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid + // if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address + return pmlmepriv->cur_network.network.MacAddress; +} + +__inline static sint check_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + if (pmlmepriv->fw_state & state) + return _TRUE; + + return _FALSE; +} + +__inline static sint get_fwstate(struct mlme_priv *pmlmepriv) +{ + return pmlmepriv->fw_state; +} + +/* + * No Limit on the calling context, + * therefore set it to be the critical section... + * + * ### NOTE:#### (!!!!) + * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock + */ +__inline static void set_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + pmlmepriv->fw_state |= state; +} + +__inline static void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state) +{ + pmlmepriv->fw_state &= ~state; +} + +/* + * No Limit on the calling context, + * therefore set it to be the critical section... + */ +__inline static void clr_fwstate(struct mlme_priv *pmlmepriv, sint state) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + if (check_fwstate(pmlmepriv, state) == _TRUE) + pmlmepriv->fw_state ^= state; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void clr_fwstate_ex(struct mlme_priv *pmlmepriv, sint state) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + _clr_fwstate_(pmlmepriv, state); + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void up_scanned_network(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned++; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void down_scanned_network(struct mlme_priv *pmlmepriv) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned--; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +__inline static void set_scanned_network_val(struct mlme_priv *pmlmepriv, sint val) +{ + _irqL irqL; + + _enter_critical_bh(&pmlmepriv->lock, &irqL); + pmlmepriv->num_of_scanned = val; + _exit_critical_bh(&pmlmepriv->lock, &irqL); +} + +extern u16 rtw_get_capability(WLAN_BSSID_EX *bss); +extern void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target); +extern void rtw_disconnect_hdl_under_linked(_adapter* adapter, struct sta_info *psta, u8 free_assoc); +extern void rtw_generate_random_ibss(u8 *pibss); +extern struct wlan_network* rtw_find_network(_queue *scanned_queue, u8 *addr); +extern struct wlan_network* rtw_get_oldest_wlan_network(_queue *scanned_queue); + +extern void rtw_free_assoc_resources(_adapter* adapter); +extern void rtw_indicate_disconnect(_adapter* adapter); +extern void rtw_indicate_connect(_adapter* adapter); + +extern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len); +extern int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len); +extern void rtw_init_registrypriv_dev_network(_adapter *adapter); + +extern void rtw_update_registrypriv_dev_network(_adapter *adapter); + +extern void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter); + +extern void _rtw_join_timeout_handler(_adapter *adapter); +extern void rtw_scan_timeout_handler(_adapter *adapter); + +extern void rtw_dynamic_check_timer_handlder(_adapter *adapter); +#ifdef CONFIG_SET_SCAN_DENY_TIMER +extern void rtw_set_scan_deny_timer_hdl(_adapter *adapter); +void rtw_set_scan_deny(struct mlme_priv *mlmepriv, u32 ms); +#endif + + +extern int _rtw_init_mlme_priv(_adapter *padapter); + +extern void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv); + +extern int _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork); + +extern struct wlan_network* _rtw_dequeue_network(_queue *queue); + +extern struct wlan_network* _rtw_alloc_network(struct mlme_priv *pmlmepriv); + + +extern void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall); +extern void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork); + + +extern struct wlan_network* _rtw_find_network(_queue *scanned_queue, u8 *addr); + +extern void _rtw_free_network_queue(_adapter* padapter, u8 isfreeall); + +extern sint rtw_if_up(_adapter *padapter); + + +u8 *rtw_get_capability_from_ie(u8 *ie); +u8 *rtw_get_timestampe_from_ie(u8 *ie); +u8 *rtw_get_beacon_interval_from_ie(u8 *ie); + + +void rtw_joinbss_reset(_adapter *padapter); + +#ifdef CONFIG_80211N_HT +unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len); +void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len); +void rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif + +int rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork); + +#ifdef CONFIG_LAYER2_ROAMING +void rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); +void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network); +#endif + +#endif //__RTL871X_MLME_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h b/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h new file mode 100755 index 000000000000..86f51392120d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mlme_ext.h @@ -0,0 +1,752 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_MLME_EXT_H_ +#define __RTW_MLME_EXT_H_ + +#include +#include +#include +#include + + +// Commented by Albert 20101105 +// Increase the SURVEY_TO value from 100 to 150 ( 100ms to 150ms ) +// The Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request. +// So, this driver tried to extend the dwell time for each scanning channel. +// This will increase the chance to receive the probe response from SoftAP. + +#define SURVEY_TO (100) +#define REAUTH_TO (300) //(50) +#define REASSOC_TO (300) //(50) +//#define DISCONNECT_TO (3000) +#define ADDBA_TO (2000) + +#define LINKED_TO (1) //unit:2 sec, 1x2=2 sec + +#define REAUTH_LIMIT (2) +#define REASSOC_LIMIT (2) +#define READDBA_LIMIT (2) + +//#define IOCMD_REG0 0x10250370 +//#define IOCMD_REG1 0x10250374 +//#define IOCMD_REG2 0x10250378 + +//#define FW_DYNAMIC_FUN_SWITCH 0x10250364 + +//#define WRITE_BB_CMD 0xF0000001 +//#define SET_CHANNEL_CMD 0xF3000000 +//#define UPDATE_RA_CMD 0xFD0000A2 + +#define DYNAMIC_FUNC_DISABLE (0x0) +#define DYNAMIC_FUNC_DIG BIT(0) +#define DYNAMIC_FUNC_HP BIT(1) +#define DYNAMIC_FUNC_SS BIT(2) //Tx Power Tracking +#define DYNAMIC_FUNC_BT BIT(3) +#define DYNAMIC_FUNC_ANT_DIV BIT(4) + +#define _HW_STATE_NOLINK_ 0x00 +#define _HW_STATE_ADHOC_ 0x01 +#define _HW_STATE_STATION_ 0x02 +#define _HW_STATE_AP_ 0x03 + + +#define _1M_RATE_ 0 +#define _2M_RATE_ 1 +#define _5M_RATE_ 2 +#define _11M_RATE_ 3 +#define _6M_RATE_ 4 +#define _9M_RATE_ 5 +#define _12M_RATE_ 6 +#define _18M_RATE_ 7 +#define _24M_RATE_ 8 +#define _36M_RATE_ 9 +#define _48M_RATE_ 10 +#define _54M_RATE_ 11 + + +// +// Channel Plan Type. +// Note: +// We just add new channel plan when the new channel plan is different from any of the following +// channel plan. +// If you just wnat to customize the acitions(scan period or join actions) about one of the channel plan, +// customize them in RT_CHANNEL_INFO in the RT_CHANNEL_LIST. +// +typedef enum _RT_CHANNEL_DOMAIN +{ + RT_CHANNEL_DOMAIN_FCC = 0, + RT_CHANNEL_DOMAIN_IC = 1, + RT_CHANNEL_DOMAIN_ETSI = 2, + RT_CHANNEL_DOMAIN_SPAIN = 3, + RT_CHANNEL_DOMAIN_FRANCE = 4, + RT_CHANNEL_DOMAIN_MKK = 5, + RT_CHANNEL_DOMAIN_MKK1 = 6, + RT_CHANNEL_DOMAIN_ISRAEL = 7, + RT_CHANNEL_DOMAIN_TELEC = 8, +#if 0 /* Not using EEPROM_CHANNEL_PLAN directly */ + RT_CHANNEL_DOMAIN_MIC = 9, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 10, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 11, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_TELEC_NETGEAR = 12, // Be compatible with old channel plan. No good! + RT_CHANNEL_DOMAIN_NCC = 13, +#endif /* Not using EEPROM_CHANNEL_PLAN directly */ + RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN = 0x09, + RT_CHANNEL_DOMAIN_WORLD_WIDE_13 = 0x0A, + RT_CHANNEL_DOMAIN_NCC = 0x0B, + RT_CHANNEL_DOMAIN_CHINA = 0x0C, + RT_CHANNEL_DOMAIN_SINGAPORE_INDIA_MEXICO = 0x0D, + RT_CHANNEL_DOMAIN_KOREA = 0x0E, + RT_CHANNEL_DOMAIN_TURKEY = 0x0F, + RT_CHANNEL_DOMAIN_JAPAN = 0x10, + RT_CHANNEL_DOMAIN_FCC_NO_DFS = 0x11, + RT_CHANNEL_DOMAIN_JAPAN_NO_DFS = 0x12, + //===== Add new channel plan above this line===============// + RT_CHANNEL_DOMAIN_MAX, +}RT_CHANNEL_DOMAIN, *PRT_CHANNEL_DOMAIN; + + +#define MAX_SCAN_CHANNEL_NUM 54 + +typedef struct _RT_CHANNEL_PLAN +{ + unsigned char Channel[MAX_CHANNEL_NUM]; + unsigned char Len; +}RT_CHANNEL_PLAN, *PRT_CHANNEL_PLAN; + +enum Associated_AP +{ + atherosAP = 0, + broadcomAP = 1, + ciscoAP = 2, + marvellAP = 3, + ralinkAP = 4, + realtekAP = 5, + airgocapAP = 6, + unknownAP = 7, + maxAP, +}; + +enum SCAN_STATE +{ + SCAN_DISABLE = 0, + SCAN_START = 1, + SCAN_TXNULL = 2, + SCAN_PROCESS = 3, + SCAN_COMPLETE = 4, + SCAN_STATE_MAX, +}; + +struct mlme_handler { + unsigned int num; + char* str; + unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame); +}; + +struct action_handler { + unsigned int num; + char* str; + unsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame); +}; + +struct ss_res +{ + int state; + int bss_cnt; + int channel_idx; + int scan_mode; + int ss_ssidlen; + unsigned char ss_ssid[IW_ESSID_MAX_SIZE + 1]; +}; + +//#define AP_MODE 0x0C +//#define STATION_MODE 0x08 +//#define AD_HOC_MODE 0x04 +//#define NO_LINK_MODE 0x00 + +#define WIFI_FW_NULL_STATE _HW_STATE_NOLINK_ +#define WIFI_FW_STATION_STATE _HW_STATE_STATION_ +#define WIFI_FW_AP_STATE _HW_STATE_AP_ +#define WIFI_FW_ADHOC_STATE _HW_STATE_ADHOC_ + +#define WIFI_FW_AUTH_NULL 0x00000100 +#define WIFI_FW_AUTH_STATE 0x00000200 +#define WIFI_FW_AUTH_SUCCESS 0x00000400 + +#define WIFI_FW_ASSOC_STATE 0x00002000 +#define WIFI_FW_ASSOC_SUCCESS 0x00004000 + +#define WIFI_FW_LINKING_STATE (WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE | WIFI_FW_AUTH_SUCCESS |WIFI_FW_ASSOC_STATE) + +#ifdef CONFIG_TDLS +/* TDLS STA state */ +#define UN_TDLS_STATE 0x00000000 //default state +#define TDLS_INITIATOR_STATE 0x10000000 +#define TDLS_RESPONDER_STATE 0x20000000 +#define TDLS_LINKED_STATE 0x40000000 +#define TDLS_CH_SWITCH_ON_STATE 0x01000000 +#define TDLS_PEER_AT_OFF_STATE 0x02000000 //could send pkt on target ch +#define TDLS_AT_OFF_CH_STATE 0x04000000 +#define TDLS_CH_SW_INITIATOR_STATE 0x08000000 //avoiding duplicated or unconditional ch. switch rsp. +#define TDLS_APSD_CHSW_STATE 0x00100000 //in APSD and want to setup channel switch +#define TDLS_PEER_SLEEP_STATE 0x00200000 //peer sta is sleeping +#define TDLS_SW_OFF_STATE 0x00400000 //terminate channel swithcing +#define TPK_RESEND_COUNT 301 +#define CH_SWITCH_TIME 10 +#define CH_SWITCH_TIMEOUT 30 +#endif + +struct FW_Sta_Info +{ + struct sta_info *psta; + u32 status; + u32 rx_pkt; + u32 retry; + NDIS_802_11_RATES_EX SupportedRates; +}; + +struct mlme_ext_info +{ + u32 state; + u32 reauth_count; + u32 reassoc_count; + u32 link_count; + u32 auth_seq; + u32 auth_algo; // 802.11 auth, could be open, shared, auto + u32 authModeToggle; + u32 enc_algo;//encrypt algorithm; + u32 key_index; // this is only valid for legendary wep, 0~3 for key id. + u32 iv; + u8 chg_txt[128]; + u16 aid; + u16 bcn_interval; + u16 capability; + u8 assoc_AP_vendor; + u8 slotTime; + u8 preamble_mode; + u8 WMM_enable; + u8 ERP_enable; + u8 ERP_IE; + u8 HT_enable; + u8 HT_caps_enable; + u8 HT_info_enable; + u8 HT_protection; + u8 turboMode_cts2self; + u8 turboMode_rtsen; + u8 SM_PS; + u8 agg_enable_bitmap; + u8 ADDBA_retry_count; + u8 candidate_tid_bitmap; + u8 dialogToken; + // Accept ADDBA Request + BOOLEAN bAcceptAddbaReq; + u8 bwmode_updated; + +#ifdef CONFIG_TDLS + uint tdls_setup_state; + u8 tdls_sta_cnt; + u8 tdls_dis_req; + u8 tdls_cam_entry_to_write; //cam entry that is empty to write + u8 tdls_cam_entry_to_clear; //cam entry that is trying to clear, using in direct link teardown + u8 tdls_ch_sensing; + u8 tdls_cur_channel; + u8 tdls_candidate_ch; + u8 tdls_collect_pkt_num[14]; +#endif + + struct ADDBA_request ADDBA_req; + struct WMM_para_element WMM_param; + struct HT_caps_element HT_caps; + struct HT_info_element HT_info; + WLAN_BSSID_EX network;//join network or bss_network, if in ap mode, it is the same to cur_network.network + struct FW_Sta_Info FW_sta_info[NUM_STA]; +}; + +// The channel information about this channel including joining, scanning, and power constraints. +typedef struct _RT_CHANNEL_INFO +{ + u8 ChannelNum; // The channel number. + RT_SCAN_TYPE ScanType; // Scan type such as passive or active scan. + //u16 ScanPeriod; // Listen time in millisecond in this channel. + //s32 MaxTxPwrDbm; // Max allowed tx power. + //u32 ExInfo; // Extended Information for this channel. +#ifdef CONFIG_FIND_BEST_CHANNEL + u32 rx_count; +#endif +}RT_CHANNEL_INFO, *PRT_CHANNEL_INFO; + +struct mlme_ext_priv +{ + _adapter *padapter; + u8 mlmeext_init; + ATOMIC_T event_seq; + u16 mgnt_seq; + + //struct fw_priv fwpriv; + + unsigned char cur_channel; + unsigned char cur_bwmode; + unsigned char cur_ch_offset;//PRIME_CHNL_OFFSET + unsigned char cur_wireless_mode; + unsigned char max_chan_nums; + RT_CHANNEL_INFO channel_set[MAX_CHANNEL_NUM]; + unsigned char basicrate[NumRates]; + unsigned char datarate[NumRates]; + + struct ss_res sitesurvey_res; + struct mlme_ext_info mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info. + //for ap mode, network includes ap's cap_info + _timer survey_timer; + _timer link_timer; + //_timer ADDBA_timer; + u16 chan_scan_time; + + u32 linked_to;//linked timeout + u32 retry; //retry for issue probereq + + u64 TSFValue; + +#ifdef CONFIG_TDLS + _workitem TDLS_restore_workitem; +#endif + +#ifdef CONFIG_AP_MODE + unsigned char bstart_bss; +#endif + +}; + +int init_mlme_ext_priv(_adapter* padapter); +int init_hw_mlme_ext(_adapter *padapter); +void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext); +extern void init_mlme_ext_timer(_adapter *padapter); +extern void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta); + +extern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv); + +//void fill_fwpriv(_adapter * padapter, struct fw_priv *pfwpriv); + +unsigned char networktype_to_raid(unsigned char network_type); +int judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen); +void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len); + +void Save_DM_Func_Flag(_adapter *padapter); +void Restore_DM_Func_Flag(_adapter *padapter); +void Switch_DM_Func(_adapter *padapter, u8 mode, u8 enable); + +void Set_NETYPE1_MSR(_adapter *padapter, u8 type); +void Set_NETYPE0_MSR(_adapter *padapter, u8 type); + +void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode); +void SelectChannel(_adapter *padapter, unsigned char channel); +void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset); + +unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval); + +void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key); +void clear_cam_entry(_adapter *padapter, u8 entry); + +void invalidate_cam_all(_adapter *padapter); +void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex); + + +int allocate_fw_sta_entry(_adapter *padapter); +void flush_all_cam_entry(_adapter *padapter); + +BOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel); + +void site_survey(_adapter *padapter); +u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid); + +int get_bsstype(unsigned short capability); +u8* get_my_bssid(WLAN_BSSID_EX *pnetwork); +u16 get_beacon_interval(WLAN_BSSID_EX *bss); + +int is_client_associated_to_ap(_adapter *padapter); +int is_client_associated_to_ibss(_adapter *padapter); +int is_IBSS_empty(_adapter *padapter); + +unsigned char check_assoc_AP(u8 *pframe, uint len); + +int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void WMMOnAssocRsp(_adapter *padapter); + +void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void HTOnAssocRsp(_adapter *padapter); + +void ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE); +void VCS_update(_adapter *padapter, struct sta_info *psta); + +void update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta); + +void update_IOT_info(_adapter *padapter); +void update_capinfo(PADAPTER Adapter, u16 updateCap); +void update_wireless_mode(_adapter * padapter); +void update_bmc_sta_support_rate(_adapter *padapter, u32 mac_id); +int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx); + +unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz); +unsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz); +unsigned int update_MSC_rate(struct HT_caps_element *pHT_caps); +void Update_RA_Entry(_adapter *padapter, u32 mac_id); +void set_sta_rate(_adapter *padapter, struct sta_info *psta); + +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason); + +unsigned char get_highest_rate_idx(u32 mask); +int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps); +unsigned int is_ap_in_tkip(_adapter *padapter); + + +void report_join_res(_adapter *padapter, int res); +void report_survey_event(_adapter *padapter, union recv_frame *precv_frame); +void report_surveydone_event(_adapter *padapter); +void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason); +void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx); + +void beacon_timing_control(_adapter *padapter); +extern u8 set_tx_beacon_cmd(_adapter*padapter); +unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame); +void update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib); +void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe); + +#ifdef CONFIG_P2P +void issue_probersp_p2p(_adapter *padapter, unsigned char *da); +void issue_p2p_provision_request( _adapter *padapter, u8* pinterface_raddr, u8* pssid, u8 ussidlen, u8* pdev_raddr); +void issue_p2p_GO_request(_adapter *padapter, u8* raddr); +void issue_probereq_p2p(_adapter *padapter); +void issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success); +void issue_p2p_invitation_request(_adapter *padapter, u8* raddr ); +#endif //CONFIG_P2P +#ifdef CONFIG_TDLS +void issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, struct sta_info *ptdls_sta, unsigned int power_mode); +extern void TDLS_restore_workitem_callback(struct work_struct *work); +void init_TPK_timer(_adapter *padapter, struct sta_info *psta); +extern void TDLS_option_workitem_callback(struct work_struct *work); +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta); +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta); +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta); +extern void base_channel_workitem_callback(struct work_struct *work); +extern void off_channel_workitem_callback(struct work_struct *work); +void issue_tdls_dis_req(_adapter *padapter); +void issue_tdls_setup_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_setup_rsp(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_setup_cfm(_adapter *padapter, union recv_frame *precv_frame); +void issue_tdls_dis_rsp(_adapter * padapter, union recv_frame * precv_frame); +void issue_tdls_teardown(_adapter *padapter, u8 *mac_addr); +void issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta); +void issue_tdls_ch_switch_req(_adapter *padapter, u8 *mac_addr); +void issue_tdls_ch_switch_rsp(_adapter *padapter, u8 *mac_addr); +sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame); +#endif +void issue_beacon(_adapter *padapter); +void issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq); +void issue_assocreq(_adapter *padapter); +void issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type); +void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status); +// Added by Albert 2010/07/26 +// blnbc: 1 -> broadcast probe request +// blnbc: 0 -> unicast probe request. The address 1 will be the BSSID. +void issue_probereq(_adapter *padapter, u8 blnbc); +void issue_nulldata(_adapter *padapter, unsigned int power_mode); +void issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid); +void issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason); +void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status); +unsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr); +unsigned int send_beacon(_adapter *padapter); + +void start_clnt_assoc(_adapter *padapter); +void start_clnt_auth(_adapter* padapter); +void start_clnt_join(_adapter* padapter); +void start_create_ibss(_adapter* padapter); + +unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame); +unsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame); + +unsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_public(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame); +unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame); + + +void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res); +void mlmeext_sta_del_event_callback(_adapter *padapter); +void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta); + +void linked_status_chk(_adapter *padapter); + +void survey_timer_hdl (_adapter *padapter); +void link_timer_hdl (_adapter *padapter); +void addba_timer_hdl(struct sta_info *psta); +//void reauth_timer_hdl(_adapter *padapter); +//void reassoc_timer_hdl(_adapter *padapter); + +#define set_survey_timer(mlmeext, ms) \ + do { \ + /*DBG_871X("%s set_survey_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ + _set_timer(&(mlmeext)->survey_timer, (ms)); \ + } while(0) + +#define set_link_timer(mlmeext, ms) \ + do { \ + /*DBG_871X("%s set_link_timer(%p, %d)\n", __FUNCTION__, (mlmeext), (ms));*/ \ + _set_timer(&(mlmeext)->link_timer, (ms)); \ + } while(0) + +extern int cckrates_included(unsigned char *rate, int ratelen); +extern int cckratesonly_included(unsigned char *rate, int ratelen); + +extern void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr); + +extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len); +extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext); + +#ifdef CONFIG_AP_MODE +void init_mlme_ap_info(_adapter *padapter); +void free_mlme_ap_info(_adapter *padapter); +//void update_BCNTIM(_adapter *padapter); +void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx); +void expire_timeout_chk(_adapter *padapter); +void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta); +int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len); +#ifdef CONFIG_NATIVEAP_MLME +void bss_cap_update(_adapter *padapter, struct sta_info *psta); +void sta_info_update(_adapter *padapter, struct sta_info *psta); +void ap_free_sta(_adapter *padapter, struct sta_info *psta); +int rtw_sta_flush(_adapter *padapter); +void start_ap_mode(_adapter *padapter); +void stop_ap_mode(_adapter *padapter); +#endif +#endif //end of CONFIG_AP_MODE + +struct cmd_hdl { + uint parmsize; + u8 (*h2cfuns)(struct _ADAPTER *padapter, u8 *pbuf); +}; + + +u8 read_macreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_macreg_hdl(_adapter *padapter, u8 *pbuf); +u8 read_bbreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_bbreg_hdl(_adapter *padapter, u8 *pbuf); +u8 read_rfreg_hdl(_adapter *padapter, u8 *pbuf); +u8 write_rfreg_hdl(_adapter *padapter, u8 *pbuf); + + +u8 NULL_hdl(_adapter *padapter, u8 *pbuf); +u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf); +u8 disconnect_hdl(_adapter *padapter, u8 *pbuf); +u8 createbss_hdl(_adapter *padapter, u8 *pbuf); +u8 setopmode_hdl(_adapter *padapter, u8 *pbuf); +u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf); +u8 setauth_hdl(_adapter *padapter, u8 *pbuf); +u8 setkey_hdl(_adapter *padapter, u8 *pbuf); +u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf); +u8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf); +u8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf); +u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf); + +u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf); +u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf); +u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf); +u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf); + +#define GEN_DRV_CMD_HANDLER(size, cmd) {size, &cmd ## _hdl}, +#define GEN_MLME_EXT_HANDLER(size, cmd) {size, cmd}, + +#ifdef _RTW_CMD_C_ + +struct cmd_hdl wlancmds[] = +{ + GEN_DRV_CMD_HANDLER(0, NULL) /*0*/ + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_DRV_CMD_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*10*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct joinbss_parm), join_cmd_hdl) /*14*/ + GEN_MLME_EXT_HANDLER(sizeof (struct disconnect_parm), disconnect_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), createbss_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct setopmode_parm), setopmode_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct sitesurvey_parm), sitesurvey_cmd_hdl) /*18*/ + GEN_MLME_EXT_HANDLER(sizeof (struct setauth_parm), setauth_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct setkey_parm), setkey_hdl) /*20*/ + GEN_MLME_EXT_HANDLER(sizeof (struct set_stakey_parm), set_stakey_hdl) + GEN_MLME_EXT_HANDLER(sizeof (struct set_assocsta_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct del_assocsta_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setstapwrstate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setbasicrate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getbasicrate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setdatarate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getdatarate_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct setphyinfo_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getphyinfo_parm), NULL) /*30*/ + GEN_MLME_EXT_HANDLER(sizeof (struct setphy_parm), NULL) + GEN_MLME_EXT_HANDLER(sizeof (struct getphy_parm), NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*40*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), add_ba_hdl) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) /*50*/ + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(0, NULL) + GEN_MLME_EXT_HANDLER(sizeof(struct Tx_Beacon_param), tx_beacon_hdl) /*55*/ + + GEN_MLME_EXT_HANDLER(0, mlme_evt_hdl) /*56*/ + GEN_MLME_EXT_HANDLER(0, rtw_drvextra_cmd_hdl) /*57*/ + + GEN_MLME_EXT_HANDLER(0, h2c_msg_hdl) /*58*/ + GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), set_chplan_hdl) /*59*/ +}; + +#endif + +struct C2HEvent_Header +{ + +#ifdef CONFIG_LITTLE_ENDIAN + + unsigned int len:16; + unsigned int ID:8; + unsigned int seq:8; + +#elif defined(CONFIG_BIG_ENDIAN) + + unsigned int seq:8; + unsigned int ID:8; + unsigned int len:16; + +#else + +# error "Must be LITTLE or BIG Endian" + +#endif + + unsigned int rsvd; + +}; + +void rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf); +void rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf); + +enum rtw_c2h_event +{ + GEN_EVT_CODE(_Read_MACREG)=0, /*0*/ + GEN_EVT_CODE(_Read_BBREG), + GEN_EVT_CODE(_Read_RFREG), + GEN_EVT_CODE(_Read_EEPROM), + GEN_EVT_CODE(_Read_EFUSE), + GEN_EVT_CODE(_Read_CAM), /*5*/ + GEN_EVT_CODE(_Get_BasicRate), + GEN_EVT_CODE(_Get_DataRate), + GEN_EVT_CODE(_Survey), /*8*/ + GEN_EVT_CODE(_SurveyDone), /*9*/ + + GEN_EVT_CODE(_JoinBss) , /*10*/ + GEN_EVT_CODE(_AddSTA), + GEN_EVT_CODE(_DelSTA), + GEN_EVT_CODE(_AtimDone) , + GEN_EVT_CODE(_TX_Report), + GEN_EVT_CODE(_CCX_Report), /*15*/ + GEN_EVT_CODE(_DTM_Report), + GEN_EVT_CODE(_TX_Rate_Statistics), + GEN_EVT_CODE(_C2HLBK), + GEN_EVT_CODE(_FWDBG), + GEN_EVT_CODE(_C2HFEEDBACK), /*20*/ + GEN_EVT_CODE(_ADDBA), + GEN_EVT_CODE(_C2HBCN), + GEN_EVT_CODE(_ReportPwrState), //filen: only for PCIE, USB + GEN_EVT_CODE(_CloseRF), //filen: only for PCIE, work around ASPM + MAX_C2HEVT +}; + + +#ifdef _RTW_MLME_EXT_C_ + +static struct fwevent wlanevents[] = +{ + {0, rtw_dummy_event_callback}, /*0*/ + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, &rtw_survey_event_callback}, /*8*/ + {sizeof (struct surveydone_event), &rtw_surveydone_event_callback}, /*9*/ + + {0, &rtw_joinbss_event_callback}, /*10*/ + {sizeof(struct stassoc_event), &rtw_stassoc_event_callback}, + {sizeof(struct stadel_event), &rtw_stadel_event_callback}, + {0, &rtw_atimdone_event_callback}, + {0, rtw_dummy_event_callback}, + {0, NULL}, /*15*/ + {0, NULL}, + {0, NULL}, + {0, NULL}, + {0, rtw_fwdbg_event_callback}, + {0, NULL}, /*20*/ + {0, NULL}, + {0, NULL}, + {0, &rtw_cpwm_event_callback}, +}; + +#endif//_RTL8192C_CMD_C_ + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp.h b/drivers/net/wireless/rtl8192c/include/rtw_mp.h new file mode 100755 index 000000000000..a17c35098895 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mp.h @@ -0,0 +1,638 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + +#ifndef _RTW_MP_H_ +#define _RTW_MP_H_ + +#ifndef PLATFORM_WINDOWS +// 00 - Success +// 11 - Error +#define STATUS_SUCCESS (0x00000000L) +#define STATUS_PENDING (0x00000103L) + +#define STATUS_UNSUCCESSFUL (0xC0000001L) +#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) +#define STATUS_NOT_SUPPORTED (0xC00000BBL) + +#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS) +#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING) +#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L) +#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) +#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L) +#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L) + +#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL) +#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES) +#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) +#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) +#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) +#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) +#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) +#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) +#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) +#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) +#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) +#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) +#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) +#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) +#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) +#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL) +#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L) +#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L) +#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L) +#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L) +#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) +#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) +#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) +#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) +#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) +#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) +#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) +#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) +#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL) +#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL) +#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) +#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL) + +#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L) +#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L) +#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L) +#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L) +#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) // cause 27 +#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) // cause 35,45 +#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) // cause 37 +#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) // cause 49 +#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) // cause 93 +#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) // cause 3 +#endif /* #ifndef PLATFORM_WINDOWS */ + +#if 0 +#define MPT_NOOP 0 +#define MPT_READ_MAC_1BYTE 1 +#define MPT_READ_MAC_2BYTE 2 +#define MPT_READ_MAC_4BYTE 3 +#define MPT_WRITE_MAC_1BYTE 4 +#define MPT_WRITE_MAC_2BYTE 5 +#define MPT_WRITE_MAC_4BYTE 6 +#define MPT_READ_BB_CCK 7 +#define MPT_WRITE_BB_CCK 8 +#define MPT_READ_BB_OFDM 9 +#define MPT_WRITE_BB_OFDM 10 +#define MPT_READ_RF 11 +#define MPT_WRITE_RF 12 +#define MPT_READ_EEPROM_1BYTE 13 +#define MPT_WRITE_EEPROM_1BYTE 14 +#define MPT_READ_EEPROM_2BYTE 15 +#define MPT_WRITE_EEPROM_2BYTE 16 +#define MPT_SET_CSTHRESHOLD 21 +#define MPT_SET_INITGAIN 22 +#define MPT_SWITCH_BAND 23 +#define MPT_SWITCH_CHANNEL 24 +#define MPT_SET_DATARATE 25 +#define MPT_SWITCH_ANTENNA 26 +#define MPT_SET_TX_POWER 27 +#define MPT_SET_CONT_TX 28 +#define MPT_SET_SINGLE_CARRIER 29 +#define MPT_SET_CARRIER_SUPPRESSION 30 +#define MPT_GET_RATE_TABLE 31 +#define MPT_READ_TSSI 32 +#define MPT_GET_THERMAL_METER 33 +#endif + +#define MAX_MP_XMITBUF_SZ 2048 +#define NR_MP_XMITFRAME 8 + +struct mp_xmit_frame +{ + _list list; + + struct pkt_attrib attrib; + + _pkt *pkt; + + int frame_tag; + + _adapter *padapter; + +#ifdef CONFIG_USB_HCI + + //insert urb, irp, and irpcnt info below... + //max frag_cnt = 8 + + u8 *mem_addr; + u32 sz[8]; + +#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX) + PURB pxmit_urb[8]; +#endif + +#ifdef PLATFORM_OS_XP + PIRP pxmit_irp[8]; +#endif + + u8 bpending[8]; + sint ac_tag[8]; + sint last[8]; + uint irpcnt; + uint fragcnt; +#endif /* CONFIG_USB_HCI */ + + uint mem[(MAX_MP_XMITBUF_SZ >> 2)]; +}; + +struct mp_wiparam +{ + u32 bcompleted; + u32 act_type; + u32 io_offset; + u32 io_value; +}; + +typedef void(*wi_act_func)(void* padapter); + +#ifdef PLATFORM_WINDOWS +struct mp_wi_cntx +{ + u8 bmpdrv_unload; + + // Work Item + NDIS_WORK_ITEM mp_wi; + NDIS_EVENT mp_wi_evt; + _lock mp_wi_lock; + u8 bmp_wi_progress; + wi_act_func curractfunc; + // Variable needed in each implementation of CurrActFunc. + struct mp_wiparam param; +}; +#endif + +struct mp_tx +{ + u8 stop; + u32 count, sended; + u8 payload; + struct pkt_attrib attrib; + struct tx_desc desc; + u8 *pallocated_buf; + u8 *buf; + u32 buf_size, write_size; + _thread_hdl_ PktTxThread; +}; + +//#if (MP_DRIVER == 1) +#if defined(CONFIG_RTL8192C) || defined(CONFIG_RTL8192D) +#ifdef CONFIG_RTL8192C +#include +#endif +#ifdef CONFIG_RTL8192D +#include +#endif +#define MP_MAX_LINES 1000 +#define MP_MAX_LINES_BYTES 256 +#define u1Byte u8 +#define s1Byte s8 +#define u4Byte u32 +#define s4Byte s32 +typedef VOID (*MPT_WORK_ITEM_HANDLER)(IN PVOID Adapter); +typedef struct _MPT_CONTEXT +{ + // Indicate if we have started Mass Production Test. + BOOLEAN bMassProdTest; + + // Indicate if the driver is unloading or unloaded. + BOOLEAN bMptDrvUnload; + + /* 8190 PCI does not support NDIS_WORK_ITEM. */ + // Work Item for Mass Production Test. + //NDIS_WORK_ITEM MptWorkItem; +// RT_WORK_ITEM MptWorkItem; + // Event used to sync the case unloading driver and MptWorkItem is still in progress. +// NDIS_EVENT MptWorkItemEvent; + // To protect the following variables. +// NDIS_SPIN_LOCK MptWorkItemSpinLock; + // Indicate a MptWorkItem is scheduled and not yet finished. + BOOLEAN bMptWorkItemInProgress; + // An instance which implements function and context of MptWorkItem. + MPT_WORK_ITEM_HANDLER CurrMptAct; + + // 1=Start, 0=Stop from UI. + ULONG MptTestStart; + // _TEST_MODE, defined in MPT_Req2.h + ULONG MptTestItem; + // Variable needed in each implementation of CurrMptAct. + ULONG MptActType; // Type of action performed in CurrMptAct. + // The Offset of IO operation is depend of MptActType. + ULONG MptIoOffset; + // The Value of IO operation is depend of MptActType. + ULONG MptIoValue; + // The RfPath of IO operation is depend of MptActType. + ULONG MptRfPath; + + WIRELESS_MODE MptWirelessModeToSw; // Wireless mode to switch. + u1Byte MptChannelToSw; // Channel to switch. + u1Byte MptInitGainToSet; // Initial gain to set. + //ULONG bMptAntennaA; // TRUE if we want to use antenna A. + ULONG MptBandWidth; // bandwidth to switch. + ULONG MptRateIndex; // rate index. + // Register value kept for Single Carrier Tx test. + u1Byte btMpCckTxPower; + // Register value kept for Single Carrier Tx test. + u1Byte btMpOfdmTxPower; + // For MP Tx Power index + u1Byte TxPwrLevel[2]; // rf-A, rf-B + + // Content of RCR Regsiter for Mass Production Test. + ULONG MptRCR; + // TRUE if we only receive packets with specific pattern. + BOOLEAN bMptFilterPattern; + // Rx OK count, statistics used in Mass Production Test. + ULONG MptRxOkCnt; + // Rx CRC32 error count, statistics used in Mass Production Test. + ULONG MptRxCrcErrCnt; + + BOOLEAN bCckContTx; // TRUE if we are in CCK Continuous Tx test. + BOOLEAN bOfdmContTx; // TRUE if we are in OFDM Continuous Tx test. + BOOLEAN bStartContTx; // TRUE if we have start Continuous Tx test. + // TRUE if we are in Single Carrier Tx test. + BOOLEAN bSingleCarrier; + // TRUE if we are in Carrier Suppression Tx Test. + BOOLEAN bCarrierSuppression; + //TRUE if we are in Single Tone Tx test. + BOOLEAN bSingleTone; + + // ACK counter asked by K.Y.. + BOOLEAN bMptEnableAckCounter; + ULONG MptAckCounter; + + // SD3 Willis For 8192S to save 1T/2T RF table for ACUT Only fro ACUT delete later ~~~! + //s1Byte BufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT]; + //s1Byte BufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES]; + //s4Byte RfReadLine[2]; + + u1Byte APK_bound[2]; //for APK path A/path B + BOOLEAN bMptIndexEven; + + u1Byte backup0xc50; + u1Byte backup0xc58; + u1Byte backup0xc30; +}MPT_CONTEXT, *PMPT_CONTEXT; +#endif +//#endif + +/* E-Fuse */ +#ifdef CONFIG_RTL8192D +#define EFUSE_MAP_SIZE 255 +#endif +#ifdef CONFIG_RTL8192C +#define EFUSE_MAP_SIZE 128 +#endif +#define EFUSE_MAX_SIZE 512 + +/* end of E-Fuse */ + +struct mp_priv +{ + _adapter *papdater; + + //Testing Flag + u32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD) + + u32 prev_fw_state; + + //OID cmd handler + struct mp_wiparam workparam; +// u8 act_in_progress; + + //Tx Section + u8 TID; + u32 tx_pktcount; + struct mp_tx tx; + + //Rx Section + u32 rx_pktcount; + u32 rx_crcerrpktcount; + u32 rx_pktloss; + + struct recv_stat rxstat; + + //RF/BB relative + u8 channel; + u8 bandwidth; + u8 prime_channel_offset; + u8 txpoweridx; + u8 txpoweridx_b; + u8 rateidx; + u32 preamble; +// u8 modem; + +// u32 curr_crystalcap; + + u16 antenna_tx; + u16 antenna_rx; +// u8 curr_rfpath; + + u8 check_mp_pkt; + +// uint ForcedDataRate; + + struct wlan_network mp_network; + NDIS_802_11_MAC_ADDRESS network_macaddr; + +#ifdef PLATFORM_WINDOWS + u32 rx_testcnt; + u32 rx_testcnt1; + u32 rx_testcnt2; + u32 tx_testcnt; + u32 tx_testcnt1; + + struct mp_wi_cntx wi_cntx; + + u8 h2c_result; + u8 h2c_seqnum; + u16 h2c_cmdcode; + u8 h2c_resp_parambuf[512]; + _lock h2c_lock; + _lock wkitm_lock; + u32 h2c_cmdcnt; + NDIS_EVENT h2c_cmd_evt; + NDIS_EVENT c2h_set; + NDIS_EVENT h2c_clr; + NDIS_EVENT cpwm_int; + + NDIS_EVENT scsir_full_evt; + NDIS_EVENT scsiw_empty_evt; +#endif + + u8 *pallocated_mp_xmitframe_buf; + u8 *pmp_xmtframe_buf; + _queue free_mp_xmitqueue; + u32 free_mp_xmitframe_cnt; + + MPT_CONTEXT MptCtx; +}; + +typedef struct _IOCMD_STRUCT_ { + u8 cmdclass; + u16 value; + u8 index; +}IOCMD_STRUCT; + +struct rf_reg_param { + u32 path; + u32 offset; + u32 value; +}; + +struct bb_reg_param { + u32 offset; + u32 value; +}; +//======================================================================= + +#define LOWER _TRUE +#define RAISE _FALSE + +/* Hardware Registers */ +#if 0 +#if 0 +#define IOCMD_CTRL_REG 0x102502C0 +#define IOCMD_DATA_REG 0x102502C4 +#else +#define IOCMD_CTRL_REG 0x10250370 +#define IOCMD_DATA_REG 0x10250374 +#endif + +#define IOCMD_GET_THERMAL_METER 0xFD000028 + +#define IOCMD_CLASS_BB_RF 0xF0 +#define IOCMD_BB_READ_IDX 0x00 +#define IOCMD_BB_WRITE_IDX 0x01 +#define IOCMD_RF_READ_IDX 0x02 +#define IOCMD_RF_WRIT_IDX 0x03 +#endif +#define BB_REG_BASE_ADDR 0x800 + +/* MP variables */ +#if 0 +#define _2MAC_MODE_ 0 +#define _LOOPBOOK_MODE_ 1 +#endif +typedef enum _MP_MODE_ { + MP_OFF, + MP_ON, + MP_ERR, + MP_CONTINUOUS_TX, + MP_SINGLE_CARRIER_TX, + MP_CARRIER_SUPPRISSION_TX, + MP_SINGLE_TONE_TX, + MP_PACKET_TX, + MP_PACKET_RX +} MP_MODE; + +#ifdef CONFIG_RTL8192C +#define RF_PATH_A RF90_PATH_A +#define RF_PATH_B RF90_PATH_B +#define RF_PATH_C RF90_PATH_C +#define RF_PATH_D RF90_PATH_D + +#define MAX_RF_PATH_NUMS RF90_PATH_MAX +#else +#define RF_PATH_A 0 +#define RF_PATH_B 1 +#define RF_PATH_C 2 +#define RF_PATH_D 3 + +#define MAX_RF_PATH_NUMS 2 +#endif + +static u8 mpdatarate[NumRates] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff}; + +/* MP set force data rate base on the definition. */ +typedef enum _MPT_RATE_INDEX +{ + /* CCK rate. */ + MPT_RATE_1M, /* 0 */ + MPT_RATE_2M, + MPT_RATE_55M, + MPT_RATE_11M, /* 3 */ + + /* OFDM rate. */ + MPT_RATE_6M, /* 4 */ + MPT_RATE_9M, + MPT_RATE_12M, + MPT_RATE_18M, + MPT_RATE_24M, + MPT_RATE_36M, + MPT_RATE_48M, + MPT_RATE_54M, /* 11 */ + + /* HT rate. */ + MPT_RATE_MCS0, /* 12 */ + MPT_RATE_MCS1, + MPT_RATE_MCS2, + MPT_RATE_MCS3, + MPT_RATE_MCS4, + MPT_RATE_MCS5, + MPT_RATE_MCS6, + MPT_RATE_MCS7, /* 19 */ + MPT_RATE_MCS8, + MPT_RATE_MCS9, + MPT_RATE_MCS10, + MPT_RATE_MCS11, + MPT_RATE_MCS12, + MPT_RATE_MCS13, + MPT_RATE_MCS14, + MPT_RATE_MCS15, /* 27 */ + MPT_RATE_LAST +}MPT_RATE_E, *PMPT_RATE_E; + +#if 0 +// Represent Channel Width in HT Capabilities +typedef enum _HT_CHANNEL_WIDTH { + HT_CHANNEL_WIDTH_20 = 0, + HT_CHANNEL_WIDTH_40 = 1, +}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH; +#endif + + +#define MAX_TX_PWR_INDEX_N_MODE 64 // 0x3F + +typedef enum _POWER_MODE_ { + POWER_LOW = 0, + POWER_NORMAL +}POWER_MODE; + + +#define RX_PKT_BROADCAST 1 +#define RX_PKT_DEST_ADDR 2 +#define RX_PKT_PHY_MATCH 3 + +#if 0 +#define RPTMaxCount 0x000FFFFF; + +// parameter 1 : BitMask +// bit 0 : OFDM PPDU +// bit 1 : OFDM False Alarm +// bit 2 : OFDM MPDU OK +// bit 3 : OFDM MPDU Fail +// bit 4 : CCK PPDU +// bit 5 : CCK False Alarm +// bit 6 : CCK MPDU ok +// bit 7 : CCK MPDU fail +// bit 8 : HT PPDU counter +// bit 9 : HT false alarm +// bit 10 : HT MPDU total +// bit 11 : HT MPDU OK +// bit 12 : HT MPDU fail +// bit 15 : RX full drop +typedef enum _RXPHY_BITMASK_ +{ + OFDM_PPDU_BIT = 0, + OFDM_FALSE_BIT, + OFDM_MPDU_OK_BIT, + OFDM_MPDU_FAIL_BIT, + CCK_PPDU_BIT, + CCK_FALSE_BIT, + CCK_MPDU_OK_BIT, + CCK_MPDU_FAIL_BIT, + HT_PPDU_BIT, + HT_FALSE_BIT, + HT_MPDU_BIT, + HT_MPDU_OK_BIT, + HT_MPDU_FAIL_BIT, +} RXPHY_BITMASK; +#endif + +typedef enum _ENCRY_CTRL_STATE_ { + HW_CONTROL, //hw encryption& decryption + SW_CONTROL, //sw encryption& decryption + HW_ENCRY_SW_DECRY, //hw encryption & sw decryption + SW_ENCRY_HW_DECRY //sw encryption & hw decryption +}ENCRY_CTRL_STATE; + + +//======================================================================= +//extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv); +//extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe); + +extern s32 init_mp_priv(PADAPTER padapter); +extern void free_mp_priv(struct mp_priv *pmp_priv); +extern s32 MPT_InitializeAdapter(PADAPTER padapter, u8 Channel); +extern void MPT_DeInitAdapter(PADAPTER padapter); +extern s32 mp_start_test(PADAPTER padapter); +extern void mp_stop_test(PADAPTER padapter); + +//======================================================================= +//extern void IQCalibrateBcut(PADAPTER pAdapter); + +//extern u32 bb_reg_read(PADAPTER Adapter, u16 offset); +//extern u8 bb_reg_write(PADAPTER Adapter, u16 offset, u32 value); +//extern u32 rf_reg_read(PADAPTER Adapter, u8 path, u8 offset); +//extern u8 rf_reg_write(PADAPTER Adapter, u8 path, u8 offset, u32 value); + +//extern u32 get_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask); +//extern u8 set_bb_reg(PADAPTER Adapter, u16 offset, u32 bitmask, u32 value); +//extern u32 get_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask); +//extern u8 set_rf_reg(PADAPTER Adapter, u8 path, u8 offset, u32 bitmask, u32 value); + +extern u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask); +extern void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val); + +extern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz); +extern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz); +extern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask); +extern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val); +extern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr); +extern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val); + +extern void SetChannel(PADAPTER pAdapter); +extern void SetBandwidth(PADAPTER pAdapter); +extern void SetTxPower(PADAPTER pAdapter); +extern void SetAntennaPathPower(PADAPTER pAdapter); +//extern void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset); +extern void SetDataRate(PADAPTER pAdapter); + +extern void SetAntenna(PADAPTER pAdapter); + +//extern void SetCrystalCap(PADAPTER pAdapter); + +extern s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther); +extern void GetThermalMeter(PADAPTER pAdapter, u8 *value); + +extern void SetContinuousTx(PADAPTER pAdapter, u8 bStart); +extern void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart); +extern void SetSingleToneTx(PADAPTER pAdapter, u8 bStart); +extern void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); + +extern void fill_txdesc_for_mp(PADAPTER padapter, struct tx_desc *ptxdesc); +extern void SetPacketTx(PADAPTER padapter); +extern void SetPacketRx(PADAPTER pAdapter, u8 bStartRx); + +extern void ResetPhyRxPktCount(PADAPTER pAdapter); +extern u32 GetPhyRxPktReceived(PADAPTER pAdapter); +extern u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter); + +extern s32 SetPowerTracking(PADAPTER padapter, u8 enable); +extern void GetPowerTracking(PADAPTER padapter, u8 *enable); + +extern u32 mp_query_psd(PADAPTER pAdapter, u8 *data); + +#endif //_RTW_MP_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h b/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h new file mode 100755 index 000000000000..e16df404bf90 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mp_ioctl.h @@ -0,0 +1,596 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef _RTW_MP_IOCTL_H_ +#define _RTW_MP_IOCTL_H_ + +//#include +//#include +#include +#include +#include +#include +#include +#include + +#if 0 +#define TESTFWCMDNUMBER 1000000 +#define TEST_H2CINT_WAIT_TIME 500 +#define TEST_C2HINT_WAIT_TIME 500 +#define HCI_TEST_SYSCFG_HWMASK 1 +#define _BUSCLK_40M (4 << 2) +#endif +//------------------------------------------------------------------------------ +typedef struct CFG_DBG_MSG_STRUCT { + u32 DebugLevel; + u32 DebugComponent_H32; + u32 DebugComponent_L32; +}CFG_DBG_MSG_STRUCT,*PCFG_DBG_MSG_STRUCT; + +typedef struct _RW_REG { + u32 offset; + u32 width; + u32 value; +}mp_rw_reg,RW_Reg, *pRW_Reg; + +//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM +typedef struct _EEPROM_RW_PARAM { + u32 offset; + u16 value; +}eeprom_rw_param,EEPROM_RWParam, *pEEPROM_RWParam; + +typedef struct _EFUSE_ACCESS_STRUCT_ { + u16 start_addr; + u16 cnts; + u8 data[0]; +}EFUSE_ACCESS_STRUCT, *PEFUSE_ACCESS_STRUCT; + +typedef struct _BURST_RW_REG { + u32 offset; + u32 len; + u8 Data[256]; +}burst_rw_reg,Burst_RW_Reg, *pBurst_RW_Reg; + +typedef struct _USB_VendorReq{ + u8 bRequest; + u16 wValue; + u16 wIndex; + u16 wLength; + u8 u8Dir;//0:OUT, 1:IN + u8 u8InData; +}usb_vendor_req, USB_VendorReq, *pUSB_VendorReq; + +typedef struct _DR_VARIABLE_STRUCT_ { + u8 offset; + u32 variable; +}DR_VARIABLE_STRUCT; + +//int mp_start_joinbss(_adapter *padapter, NDIS_802_11_SSID *pssid); + +//void _irqlevel_changed_(_irqL *irqlevel, /*BOOLEAN*/unsigned char bLower); +#ifdef PLATFORM_OS_XP +static void _irqlevel_changed_(_irqL *irqlevel, u8 bLower) +{ + + if (bLower == LOWER) { + *irqlevel = KeGetCurrentIrql(); + + if (*irqlevel > PASSIVE_LEVEL) { + KeLowerIrql(PASSIVE_LEVEL); + } + } else { + if (KeGetCurrentIrql() == PASSIVE_LEVEL) { + KeRaiseIrql(DISPATCH_LEVEL, irqlevel); + } + } + +} +#else +#define _irqlevel_changed_(a,b) +#endif + +//oid_rtl_seg_81_80_00 +NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv* poid_par_priv); +//oid_rtl_seg_81_80_20 +NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv* poid_par_priv); + + +//oid_rtl_seg_81_87 +NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv* poid_par_priv); + + +//oid_rtl_seg_81_85 +NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv* poid_par_priv); + + +// oid_rtl_seg_87_11_00 +NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv* poid_par_priv); +// oid_rtl_seg_87_11_20 +NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv* poid_par_priv); +//oid_rtl_seg_87_11_50 +NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv* poid_par_priv); +//oid_rtl_seg_87_11_F0 +NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv* poid_par_priv); + + +//oid_rtl_seg_87_12_00 +NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv); +NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv); + +NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv); +NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv* poid_par_priv); + +NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv); + +#ifdef _RTW_MP_IOCTL_C_ + +const struct oid_obj_priv oid_rtl_seg_81_80_00[] = +{ + {1, &oid_null_function}, //0x00 OID_RT_PRO_RESET_DUT + {1, &oid_rt_pro_set_data_rate_hdl}, //0x01 + {1, &oid_rt_pro_start_test_hdl}, //0x02 + {1, &oid_rt_pro_stop_test_hdl}, //0x03 + {1, &oid_null_function}, //0x04 OID_RT_PRO_SET_PREAMBLE + {1, &oid_null_function}, //0x05 OID_RT_PRO_SET_SCRAMBLER + {1, &oid_null_function}, //0x06 OID_RT_PRO_SET_FILTER_BB + {1, &oid_null_function}, //0x07 OID_RT_PRO_SET_MANUAL_DIVERSITY_BB + {1, &oid_rt_pro_set_channel_direct_call_hdl}, //0x08 + {1, &oid_null_function}, //0x09 OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL + {1, &oid_null_function}, //0x0A OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL + {1, &oid_rt_pro_set_continuous_tx_hdl}, //0x0B OID_RT_PRO_SET_TX_CONTINUOUS_DIRECT_CALL + {1, &oid_rt_pro_set_single_carrier_tx_hdl}, //0x0C OID_RT_PRO_SET_SINGLE_CARRIER_TX_CONTINUOUS + {1, &oid_null_function}, //0x0D OID_RT_PRO_SET_TX_ANTENNA_BB + {1, &oid_rt_pro_set_antenna_bb_hdl}, //0x0E + {1, &oid_null_function}, //0x0F OID_RT_PRO_SET_CR_SCRAMBLER + {1, &oid_null_function}, //0x10 OID_RT_PRO_SET_CR_NEW_FILTER + {1, &oid_rt_pro_set_tx_power_control_hdl}, //0x11 OID_RT_PRO_SET_TX_POWER_CONTROL + {1, &oid_null_function}, //0x12 OID_RT_PRO_SET_CR_TX_CONFIG + {1, &oid_null_function}, //0x13 OID_RT_PRO_GET_TX_POWER_CONTROL + {1, &oid_null_function}, //0x14 OID_RT_PRO_GET_CR_SIGNAL_QUALITY + {1, &oid_null_function}, //0x15 OID_RT_PRO_SET_CR_SETPOINT + {1, &oid_null_function}, //0x16 OID_RT_PRO_SET_INTEGRATOR + {1, &oid_null_function}, //0x17 OID_RT_PRO_SET_SIGNAL_QUALITY + {1, &oid_null_function}, //0x18 OID_RT_PRO_GET_INTEGRATOR + {1, &oid_null_function}, //0x19 OID_RT_PRO_GET_SIGNAL_QUALITY + {1, &oid_null_function}, //0x1A OID_RT_PRO_QUERY_EEPROM_TYPE + {1, &oid_null_function}, //0x1B OID_RT_PRO_WRITE_MAC_ADDRESS + {1, &oid_null_function}, //0x1C OID_RT_PRO_READ_MAC_ADDRESS + {1, &oid_null_function}, //0x1D OID_RT_PRO_WRITE_CIS_DATA + {1, &oid_null_function}, //0x1E OID_RT_PRO_READ_CIS_DATA + {1, &oid_null_function} //0x1F OID_RT_PRO_WRITE_POWER_CONTROL + +}; + +const struct oid_obj_priv oid_rtl_seg_81_80_20[] = +{ + {1, &oid_null_function}, //0x20 OID_RT_PRO_READ_POWER_CONTROL + {1, &oid_null_function}, //0x21 OID_RT_PRO_WRITE_EEPROM + {1, &oid_null_function}, //0x22 OID_RT_PRO_READ_EEPROM + {1, &oid_rt_pro_reset_tx_packet_sent_hdl}, //0x23 + {1, &oid_rt_pro_query_tx_packet_sent_hdl}, //0x24 + {1, &oid_rt_pro_reset_rx_packet_received_hdl}, //0x25 + {1, &oid_rt_pro_query_rx_packet_received_hdl}, //0x26 + {1, &oid_rt_pro_query_rx_packet_crc32_error_hdl}, //0x27 + {1, &oid_null_function}, //0x28 OID_RT_PRO_QUERY_CURRENT_ADDRESS + {1, &oid_null_function}, //0x29 OID_RT_PRO_QUERY_PERMANENT_ADDRESS + {1, &oid_null_function}, //0x2A OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS + {1, &oid_rt_pro_set_carrier_suppression_tx_hdl},//0x2B OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX + {1, &oid_null_function}, //0x2C OID_RT_PRO_RECEIVE_PACKET + {1, &oid_null_function}, //0x2D OID_RT_PRO_WRITE_EEPROM_BYTE + {1, &oid_null_function}, //0x2E OID_RT_PRO_READ_EEPROM_BYTE + {1, &oid_rt_pro_set_modulation_hdl} //0x2F + +}; + +const struct oid_obj_priv oid_rtl_seg_81_80_40[] = +{ + {1, &oid_null_function}, //0x40 + {1, &oid_null_function}, //0x41 + {1, &oid_null_function}, //0x42 + {1, &oid_rt_pro_set_single_tone_tx_hdl}, //0x43 + {1, &oid_null_function}, //0x44 + {1, &oid_null_function} //0x45 +}; + +const struct oid_obj_priv oid_rtl_seg_81_80_80[] = +{ + {1, &oid_null_function}, //0x80 OID_RT_DRIVER_OPTION + {1, &oid_null_function}, //0x81 OID_RT_RF_OFF + {1, &oid_null_function} //0x82 OID_RT_AUTH_STATUS + +}; + +const struct oid_obj_priv oid_rtl_seg_81_85[] = +{ + {1, &oid_rt_wireless_mode_hdl} //0x00 OID_RT_WIRELESS_MODE +}; + +struct oid_obj_priv oid_rtl_seg_81_87[] = +{ + {1, &oid_null_function}, //0x80 OID_RT_PRO8187_WI_POLL + {1, &oid_rt_pro_write_bb_reg_hdl}, //0x81 + {1, &oid_rt_pro_read_bb_reg_hdl}, //0x82 + {1, &oid_rt_pro_write_rf_reg_hdl}, //0x82 + {1, &oid_rt_pro_read_rf_reg_hdl} //0x83 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_00[] = +{ + {1, &oid_rt_pro8711_join_bss_hdl}, //0x00 //S + {1, &oid_rt_pro_read_register_hdl}, //0x01 + {1, &oid_rt_pro_write_register_hdl}, //0x02 + {1, &oid_rt_pro_burst_read_register_hdl}, //0x03 + {1, &oid_rt_pro_burst_write_register_hdl}, //0x04 + {1, &oid_rt_pro_write_txcmd_hdl}, //0x05 + {1, &oid_rt_pro_read16_eeprom_hdl}, //0x06 + {1, &oid_rt_pro_write16_eeprom_hdl}, //0x07 + {1, &oid_null_function}, //0x08 OID_RT_PRO_H2C_SET_COMMAND + {1, &oid_null_function}, //0x09 OID_RT_PRO_H2C_QUERY_RESULT + {1, &oid_rt_pro8711_wi_poll_hdl}, //0x0A + {1, &oid_rt_pro8711_pkt_loss_hdl}, //0x0B + {1, &oid_rt_rd_attrib_mem_hdl}, //0x0C + {1, &oid_rt_wr_attrib_mem_hdl}, //0x0D + {1, &oid_null_function}, //0x0E + {1, &oid_null_function}, //0x0F + {1, &oid_null_function}, //0x10 OID_RT_PRO_H2C_CMD_MODE + {1, &oid_null_function}, //0x11 OID_RT_PRO_H2C_CMD_RSP_MODE + {1, &oid_null_function}, //0X12 OID_RT_PRO_WAIT_C2H_EVENT + {1, &oid_null_function}, //0X13 OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST + {1, &oid_null_function}, //0X14 OID_RT_PRO_SCSI_ACCESS_TEST + {1, &oid_null_function}, //0X15 OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT + {1, &oid_null_function}, //0X16 OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN + {1, &oid_null_function}, //0X17 OID_RT_RRO_RX_PKT_VIA_IOCTRL + {1, &oid_null_function}, //0X18 OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL + {1, &oid_null_function}, //0X19 OID_RT_RPO_SET_PWRMGT_TEST + {1, &oid_null_function}, //0X1A + {1, &oid_null_function}, //0X1B OID_RT_PRO_QRY_PWRMGT_TEST + {1, &oid_null_function}, //0X1C OID_RT_RPO_ASYNC_RWIO_TEST + {1, &oid_null_function}, //0X1D OID_RT_RPO_ASYNC_RWIO_POLL + {1, &oid_rt_pro_set_rf_intfs_hdl}, //0X1E + {1, &oid_rt_poll_rx_status_hdl} //0X1F +}; + +struct oid_obj_priv oid_rtl_seg_87_11_20[] = +{ + {1, &oid_rt_pro_cfg_debug_message_hdl}, //0x20 + {1, &oid_rt_pro_set_data_rate_ex_hdl}, //0x21 + {1, &oid_rt_pro_set_basic_rate_hdl}, //0x22 + {1, &oid_rt_pro_read_tssi_hdl}, //0x23 + {1, &oid_rt_pro_set_power_tracking_hdl} //0x24 +}; + + +struct oid_obj_priv oid_rtl_seg_87_11_50[] = +{ + {1, &oid_rt_pro_qry_pwrstate_hdl}, //0x50 + {1, &oid_rt_pro_set_pwrstate_hdl} //0x51 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_80[] = +{ + {1, &oid_null_function} //0x80 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_B0[] = +{ + {1, &oid_null_function} //0xB0 +}; + +struct oid_obj_priv oid_rtl_seg_87_11_F0[] = +{ + {1, &oid_null_function}, //0xF0 + {1, &oid_null_function}, //0xF1 + {1, &oid_null_function}, //0xF2 + {1, &oid_null_function}, //0xF3 + {1, &oid_null_function}, //0xF4 + {1, &oid_null_function}, //0xF5 + {1, &oid_null_function}, //0xF6 + {1, &oid_null_function}, //0xF7 + {1, &oid_null_function}, //0xF8 + {1, &oid_null_function}, //0xF9 + {1, &oid_null_function}, //0xFA + {1, &oid_rt_pro_h2c_set_rate_table_hdl}, //0xFB + {1, &oid_rt_pro_h2c_get_rate_table_hdl}, //0xFC + {1, &oid_null_function}, //0xFD + {1, &oid_null_function}, //0xFE OID_RT_PRO_H2C_C2H_LBK_TEST + {1, &oid_null_function} //0xFF + +}; + +struct oid_obj_priv oid_rtl_seg_87_12_00[]= +{ + {1, &oid_rt_pro_encryption_ctrl_hdl}, //0x00 Q&S + {1, &oid_rt_pro_add_sta_info_hdl}, //0x01 S + {1, &oid_rt_pro_dele_sta_info_hdl}, //0x02 S + {1, &oid_rt_pro_query_dr_variable_hdl}, //0x03 Q + {1, &oid_rt_pro_rx_packet_type_hdl}, //0x04 Q,S + {1, &oid_rt_pro_read_efuse_hdl}, //0x05 Q OID_RT_PRO_READ_EFUSE + {1, &oid_rt_pro_write_efuse_hdl}, //0x06 S OID_RT_PRO_WRITE_EFUSE + {1, &oid_rt_pro_rw_efuse_pgpkt_hdl}, //0x07 Q,S + {1, &oid_rt_get_efuse_current_size_hdl}, //0x08 Q + {1, &oid_rt_set_bandwidth_hdl}, //0x09 + {1, &oid_rt_set_crystal_cap_hdl}, //0x0a + {1, &oid_rt_set_rx_packet_type_hdl}, //0x0b S + {1, &oid_rt_get_efuse_max_size_hdl}, //0x0c + {1, &oid_rt_pro_set_tx_agc_offset_hdl}, //0x0d + {1, &oid_rt_pro_set_pkt_test_mode_hdl}, //0x0e + {1, &oid_null_function}, //0x0f OID_RT_PRO_FOR_EVM_TEST_SETTING + {1, &oid_rt_get_thermal_meter_hdl}, //0x10 Q OID_RT_PRO_GET_THERMAL_METER + {1, &oid_rt_reset_phy_rx_packet_count_hdl}, //0x11 S OID_RT_RESET_PHY_RX_PACKET_COUNT + {1, &oid_rt_get_phy_rx_packet_received_hdl}, //0x12 Q OID_RT_GET_PHY_RX_PACKET_RECEIVED + {1, &oid_rt_get_phy_rx_packet_crc32_error_hdl}, //0x13 Q OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR + {1, &oid_rt_set_power_down_hdl}, //0x14 Q OID_RT_SET_POWER_DOWN + {1, &oid_rt_get_power_mode_hdl} //0x15 Q OID_RT_GET_POWER_MODE +}; + +#else /* _RTL871X_MP_IOCTL_C_ */ + +extern struct oid_obj_priv oid_rtl_seg_81_80_00[32]; +extern struct oid_obj_priv oid_rtl_seg_81_80_20[16]; +extern struct oid_obj_priv oid_rtl_seg_81_80_40[6]; +extern struct oid_obj_priv oid_rtl_seg_81_80_80[3]; + +extern struct oid_obj_priv oid_rtl_seg_81_85[1]; +extern struct oid_obj_priv oid_rtl_seg_81_87[5]; + +extern struct oid_obj_priv oid_rtl_seg_87_11_00[32]; +extern struct oid_obj_priv oid_rtl_seg_87_11_20[5]; +extern struct oid_obj_priv oid_rtl_seg_87_11_50[2]; +extern struct oid_obj_priv oid_rtl_seg_87_11_80[1]; +extern struct oid_obj_priv oid_rtl_seg_87_11_B0[1]; +extern struct oid_obj_priv oid_rtl_seg_87_11_F0[16]; + +extern struct oid_obj_priv oid_rtl_seg_87_12_00[32]; + +#endif /* _RTL871X_MP_IOCTL_C_ */ + +struct rwreg_param{ + u32 offset; + u32 width; + u32 value; +}; + +struct bbreg_param{ + u32 offset; + u32 phymask; + u32 value; +}; +/* +struct rfchannel_param{ + u32 ch; + u32 modem; +}; +*/ +struct txpower_param{ + u32 pwr_index; +}; + + +struct datarate_param{ + u32 rate_index; +}; + + +struct rfintfs_parm { + u32 rfintfs; +}; + +typedef struct _mp_xmit_parm_ { + u8 enable; + u32 count; + u16 length; + u8 payload_type; + u8 da[ETH_ALEN]; +}MP_XMIT_PARM, *PMP_XMIT_PARM; + +struct mp_xmit_packet { + u32 len; + u32 mem[MAX_MP_XMITBUF_SZ >> 2]; +}; + +struct psmode_param { + u32 ps_mode; + u32 smart_ps; +}; + +//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM +struct eeprom_rw_param { + u32 offset; + u16 value; +}; + +struct mp_ioctl_handler { + u32 paramsize; + u32 (*handler)(struct oid_par_priv* poid_par_priv); + u32 oid; +}; + +struct mp_ioctl_param{ + u32 subcode; + u32 len; + u8 data[0]; +}; + +#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_ + +enum RTL871X_MP_IOCTL_SUBCODE { + GEN_MP_IOCTL_SUBCODE(MP_START), /*0*/ + GEN_MP_IOCTL_SUBCODE(MP_STOP), + GEN_MP_IOCTL_SUBCODE(READ_REG), + GEN_MP_IOCTL_SUBCODE(WRITE_REG), + GEN_MP_IOCTL_SUBCODE(READ_BB_REG), + GEN_MP_IOCTL_SUBCODE(WRITE_BB_REG), /*5*/ + GEN_MP_IOCTL_SUBCODE(READ_RF_REG), + GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG), + GEN_MP_IOCTL_SUBCODE(SET_CHANNEL), + GEN_MP_IOCTL_SUBCODE(SET_TXPOWER), + GEN_MP_IOCTL_SUBCODE(SET_DATARATE), /*10*/ + GEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH), + GEN_MP_IOCTL_SUBCODE(SET_ANTENNA), + GEN_MP_IOCTL_SUBCODE(CNTU_TX), + GEN_MP_IOCTL_SUBCODE(SC_TX), + GEN_MP_IOCTL_SUBCODE(CS_TX), /*15*/ + GEN_MP_IOCTL_SUBCODE(ST_TX), + GEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET), + GEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE), + GEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT), + GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV), /*20*/ + GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR), + GEN_MP_IOCTL_SUBCODE(READ16_EEPROM), + GEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM), + GEN_MP_IOCTL_SUBCODE(EFUSE), + GEN_MP_IOCTL_SUBCODE(EFUSE_MAP), /*25*/ + GEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE), + GEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE), + GEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER), + GEN_MP_IOCTL_SUBCODE(SET_PTM), + GEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN), /*30*/ + GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO), + GEN_MP_IOCTL_SUBCODE(SET_DM_BT), /*35*/ + GEN_MP_IOCTL_SUBCODE(DEL_BA), /*36*/ + GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS), /*37*/ + MAX_MP_IOCTL_SUBCODE, +}; + +u32 mp_ioctl_xmit_packet_hdl(struct oid_par_priv* poid_par_priv); + +#ifdef _RTW_MP_IOCTL_C_ + +#define GEN_MP_IOCTL_HANDLER(sz, hdl, oid) {sz, hdl, oid}, + +#define EXT_MP_IOCTL_HANDLER(sz, subcode, oid) {sz, mp_ioctl_ ## subcode ## _hdl, oid}, + + +struct mp_ioctl_handler mp_ioctl_hdl[] = { + +/*0*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_start_test_hdl, OID_RT_PRO_START_TEST) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_stop_test_hdl, OID_RT_PRO_STOP_TEST) + + GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_read_register_hdl, OID_RT_PRO_READ_REGISTER) + GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_write_register_hdl, OID_RT_PRO_WRITE_REGISTER) + GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_read_bb_reg_hdl, OID_RT_PRO_READ_BB_REG) +/*5*/ GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_write_bb_reg_hdl, OID_RT_PRO_WRITE_BB_REG) + GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_read_rf_reg_hdl, OID_RT_PRO_RF_READ_REGISTRY) + GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_write_rf_reg_hdl, OID_RT_PRO_RF_WRITE_REGISTRY) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_channel_direct_call_hdl, OID_RT_PRO_SET_CHANNEL_DIRECT_CALL) + GEN_MP_IOCTL_HANDLER(sizeof(struct txpower_param), oid_rt_pro_set_tx_power_control_hdl, OID_RT_PRO_SET_TX_POWER_CONTROL) +/*10*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_data_rate_hdl, OID_RT_PRO_SET_DATA_RATE) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_bandwidth_hdl, OID_RT_SET_BANDWIDTH) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_antenna_bb_hdl, OID_RT_PRO_SET_ANTENNA_BB) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_continuous_tx_hdl, OID_RT_PRO_SET_CONTINUOUS_TX) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_carrier_tx_hdl, OID_RT_PRO_SET_SINGLE_CARRIER_TX) +/*15*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_carrier_suppression_tx_hdl, OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_tone_tx_hdl, OID_RT_PRO_SET_SINGLE_TONE_TX) + + EXT_MP_IOCTL_HANDLER(0, xmit_packet, 0) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_rx_packet_type_hdl, OID_RT_SET_RX_PACKET_TYPE) + GEN_MP_IOCTL_HANDLER(0, oid_rt_reset_phy_rx_packet_count_hdl, OID_RT_RESET_PHY_RX_PACKET_COUNT) +/*20*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_received_hdl, OID_RT_GET_PHY_RX_PACKET_RECEIVED) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_crc32_error_hdl, OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR) + + GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) + GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) + GEN_MP_IOCTL_HANDLER(sizeof(EFUSE_ACCESS_STRUCT), oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE) +/*25*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_efuse_map_hdl, OID_RT_PRO_EFUSE_MAP) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_max_size_hdl, OID_RT_GET_EFUSE_MAX_SIZE) + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_current_size_hdl, OID_RT_GET_EFUSE_CURRENT_SIZE) + + GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_thermal_meter_hdl, OID_RT_PRO_GET_THERMAL_METER) + GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_pro_set_power_tracking_hdl, OID_RT_PRO_SET_POWER_TRACKING) +/*30*/ GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_set_power_down_hdl, OID_RT_SET_POWER_DOWN) +/*31*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_trigger_gpio_hdl, 0) + + +}; + +#else /* _RTW_MP_IOCTL_C_ */ + +extern struct mp_ioctl_handler mp_ioctl_hdl[]; + +#endif /* _RTW_MP_IOCTL_C_ */ + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h b/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h new file mode 100755 index 000000000000..4906005ede93 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_mp_phy_regdef.h @@ -0,0 +1,1098 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +/***************************************************************************** + * + * Module: __RTW_MP_PHY_REGDEF_H_ + * + * + * Note: 1. Define PMAC/BB register map + * 2. Define RF register map + * 3. PMAC/BB register bit mask. + * 4. RF reg bit mask. + * 5. Other BB/RF relative definition. + * + * + * Export: Constants, macro, functions(API), global variables(None). + * + * Abbrev: + * + * History: + * Data Who Remark + * 08/07/2007 MHC 1. Porting from 9x series PHYCFG.h. + * 2. Reorganize code architecture. + * 09/25/2008 MH 1. Add RL6052 register definition + * + *****************************************************************************/ +#ifndef __RTW_MP_PHY_REGDEF_H_ +#define __RTW_MP_PHY_REGDEF_H_ + + +/*--------------------------Define Parameters-------------------------------*/ + +//============================================================ +// 8192S Regsiter offset definition +//============================================================ + +// +// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00 +// 3. RF register 0x00-2E +// 4. Bit Mask for BB/RF register +// 5. Other defintion for BB/RF R/W +// + + +// +// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF +// 1. Page1(0x100) +// +#define rPMAC_Reset 0x100 +#define rPMAC_TxStart 0x104 +#define rPMAC_TxLegacySIG 0x108 +#define rPMAC_TxHTSIG1 0x10c +#define rPMAC_TxHTSIG2 0x110 +#define rPMAC_PHYDebug 0x114 +#define rPMAC_TxPacketNum 0x118 +#define rPMAC_TxIdle 0x11c +#define rPMAC_TxMACHeader0 0x120 +#define rPMAC_TxMACHeader1 0x124 +#define rPMAC_TxMACHeader2 0x128 +#define rPMAC_TxMACHeader3 0x12c +#define rPMAC_TxMACHeader4 0x130 +#define rPMAC_TxMACHeader5 0x134 +#define rPMAC_TxDataType 0x138 +#define rPMAC_TxRandomSeed 0x13c +#define rPMAC_CCKPLCPPreamble 0x140 +#define rPMAC_CCKPLCPHeader 0x144 +#define rPMAC_CCKCRC16 0x148 +#define rPMAC_OFDMRxCRC32OK 0x170 +#define rPMAC_OFDMRxCRC32Er 0x174 +#define rPMAC_OFDMRxParityEr 0x178 +#define rPMAC_OFDMRxCRC8Er 0x17c +#define rPMAC_CCKCRxRC16Er 0x180 +#define rPMAC_CCKCRxRC32Er 0x184 +#define rPMAC_CCKCRxRC32OK 0x188 +#define rPMAC_TxStatus 0x18c + +// +// 2. Page2(0x200) +// +// The following two definition are only used for USB interface. +//#define RF_BB_CMD_ADDR 0x02c0 // RF/BB read/write command address. +//#define RF_BB_CMD_DATA 0x02c4 // RF/BB read/write command data. + +// +// 3. Page8(0x800) +// +#define rFPGA0_RFMOD 0x800 //RF mode & CCK TxSC // RF BW Setting?? + +#define rFPGA0_TxInfo 0x804 // Status report?? +#define rFPGA0_PSDFunction 0x808 + +#define rFPGA0_TxGainStage 0x80c // Set TX PWR init gain? + +#define rFPGA0_RFTiming1 0x810 // Useless now +#define rFPGA0_RFTiming2 0x814 +//#define rFPGA0_XC_RFTiming 0x818 +//#define rFPGA0_XD_RFTiming 0x81c + +#define rFPGA0_XA_HSSIParameter1 0x820 // RF 3 wire register +#define rFPGA0_XA_HSSIParameter2 0x824 +#define rFPGA0_XB_HSSIParameter1 0x828 +#define rFPGA0_XB_HSSIParameter2 0x82c +#define rFPGA0_XC_HSSIParameter1 0x830 +#define rFPGA0_XC_HSSIParameter2 0x834 +#define rFPGA0_XD_HSSIParameter1 0x838 +#define rFPGA0_XD_HSSIParameter2 0x83c +#define rFPGA0_XA_LSSIParameter 0x840 +#define rFPGA0_XB_LSSIParameter 0x844 +#define rFPGA0_XC_LSSIParameter 0x848 +#define rFPGA0_XD_LSSIParameter 0x84c + +#define rFPGA0_RFWakeUpParameter 0x850 // Useless now +#define rFPGA0_RFSleepUpParameter 0x854 + +#define rFPGA0_XAB_SwitchControl 0x858 // RF Channel switch +#define rFPGA0_XCD_SwitchControl 0x85c + +#define rFPGA0_XA_RFInterfaceOE 0x860 // RF Channel switch +#define rFPGA0_XB_RFInterfaceOE 0x864 +#define rFPGA0_XC_RFInterfaceOE 0x868 +#define rFPGA0_XD_RFInterfaceOE 0x86c + +#define rFPGA0_XAB_RFInterfaceSW 0x870 // RF Interface Software Control +#define rFPGA0_XCD_RFInterfaceSW 0x874 + +#define rFPGA0_XAB_RFParameter 0x878 // RF Parameter +#define rFPGA0_XCD_RFParameter 0x87c + +#define rFPGA0_AnalogParameter1 0x880 // Crystal cap setting RF-R/W protection for parameter4?? +#define rFPGA0_AnalogParameter2 0x884 +#define rFPGA0_AnalogParameter3 0x888 // Useless now +#define rFPGA0_AnalogParameter4 0x88c + +#define rFPGA0_XA_LSSIReadBack 0x8a0 // Tranceiver LSSI Readback +#define rFPGA0_XB_LSSIReadBack 0x8a4 +#define rFPGA0_XC_LSSIReadBack 0x8a8 +#define rFPGA0_XD_LSSIReadBack 0x8ac + +#define rFPGA0_PSDReport 0x8b4 // Useless now +#define rFPGA0_XAB_RFInterfaceRB 0x8e0 // Useless now // RF Interface Readback Value +#define rFPGA0_XCD_RFInterfaceRB 0x8e4 // Useless now + +// +// 4. Page9(0x900) +// +#define rFPGA1_RFMOD 0x900 //RF mode & OFDM TxSC // RF BW Setting?? + +#define rFPGA1_TxBlock 0x904 // Useless now +#define rFPGA1_DebugSelect 0x908 // Useless now +#define rFPGA1_TxInfo 0x90c // Useless now // Status report?? + +// +// 5. PageA(0xA00) +// +// Set Control channel to upper or lower. These settings are required only for 40MHz +#define rCCK0_System 0xa00 + +#define rCCK0_AFESetting 0xa04 // Disable init gain now // Select RX path by RSSI +#define rCCK0_CCA 0xa08 // Disable init gain now // Init gain + +#define rCCK0_RxAGC1 0xa0c //AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series +#define rCCK0_RxAGC2 0xa10 //AGC & DAGC + +#define rCCK0_RxHP 0xa14 + +#define rCCK0_DSPParameter1 0xa18 //Timing recovery & Channel estimation threshold +#define rCCK0_DSPParameter2 0xa1c //SQ threshold + +#define rCCK0_TxFilter1 0xa20 +#define rCCK0_TxFilter2 0xa24 +#define rCCK0_DebugPort 0xa28 //debug port and Tx filter3 +#define rCCK0_FalseAlarmReport 0xa2c //0xa2d useless now 0xa30-a4f channel report +#define rCCK0_TRSSIReport 0xa50 +#define rCCK0_RxReport 0xa54 //0xa57 +#define rCCK0_FACounterLower 0xa5c //0xa5b +#define rCCK0_FACounterUpper 0xa58 //0xa5c + +// +// 6. PageC(0xC00) +// +#define rOFDM0_LSTF 0xc00 + +#define rOFDM0_TRxPathEnable 0xc04 +#define rOFDM0_TRMuxPar 0xc08 +#define rOFDM0_TRSWIsolation 0xc0c + +#define rOFDM0_XARxAFE 0xc10 //RxIQ DC offset, Rx digital filter, DC notch filter +#define rOFDM0_XARxIQImbalance 0xc14 //RxIQ imblance matrix +#define rOFDM0_XBRxAFE 0xc18 +#define rOFDM0_XBRxIQImbalance 0xc1c +#define rOFDM0_XCRxAFE 0xc20 +#define rOFDM0_XCRxIQImbalance 0xc24 +#define rOFDM0_XDRxAFE 0xc28 +#define rOFDM0_XDRxIQImbalance 0xc2c + +#define rOFDM0_RxDetector1 0xc30 //PD,BW & SBD // DM tune init gain +#define rOFDM0_RxDetector2 0xc34 //SBD & Fame Sync. +#define rOFDM0_RxDetector3 0xc38 //Frame Sync. +#define rOFDM0_RxDetector4 0xc3c //PD, SBD, Frame Sync & Short-GI + +#define rOFDM0_RxDSP 0xc40 //Rx Sync Path +#define rOFDM0_CFOandDAGC 0xc44 //CFO & DAGC +#define rOFDM0_CCADropThreshold 0xc48 //CCA Drop threshold +#define rOFDM0_ECCAThreshold 0xc4c // energy CCA + +#define rOFDM0_XAAGCCore1 0xc50 // DIG +#define rOFDM0_XAAGCCore2 0xc54 +#define rOFDM0_XBAGCCore1 0xc58 +#define rOFDM0_XBAGCCore2 0xc5c +#define rOFDM0_XCAGCCore1 0xc60 +#define rOFDM0_XCAGCCore2 0xc64 +#define rOFDM0_XDAGCCore1 0xc68 +#define rOFDM0_XDAGCCore2 0xc6c + +#define rOFDM0_AGCParameter1 0xc70 +#define rOFDM0_AGCParameter2 0xc74 +#define rOFDM0_AGCRSSITable 0xc78 +#define rOFDM0_HTSTFAGC 0xc7c + +#define rOFDM0_XATxIQImbalance 0xc80 // TX PWR TRACK and DIG +#define rOFDM0_XATxAFE 0xc84 +#define rOFDM0_XBTxIQImbalance 0xc88 +#define rOFDM0_XBTxAFE 0xc8c +#define rOFDM0_XCTxIQImbalance 0xc90 +#define rOFDM0_XCTxAFE 0xc94 +#define rOFDM0_XDTxIQImbalance 0xc98 +#define rOFDM0_XDTxAFE 0xc9c +#define rOFDM0_RxIQExtAnta 0xca0 + +#define rOFDM0_RxHPParameter 0xce0 +#define rOFDM0_TxPseudoNoiseWgt 0xce4 +#define rOFDM0_FrameSync 0xcf0 +#define rOFDM0_DFSReport 0xcf4 +#define rOFDM0_TxCoeff1 0xca4 +#define rOFDM0_TxCoeff2 0xca8 +#define rOFDM0_TxCoeff3 0xcac +#define rOFDM0_TxCoeff4 0xcb0 +#define rOFDM0_TxCoeff5 0xcb4 +#define rOFDM0_TxCoeff6 0xcb8 + + +// +// 7. PageD(0xD00) +// +#define rOFDM1_LSTF 0xd00 +#define rOFDM1_TRxPathEnable 0xd04 + +#define rOFDM1_CFO 0xd08 // No setting now +#define rOFDM1_CSI1 0xd10 +#define rOFDM1_SBD 0xd14 +#define rOFDM1_CSI2 0xd18 +#define rOFDM1_CFOTracking 0xd2c +#define rOFDM1_TRxMesaure1 0xd34 +#define rOFDM1_IntfDet 0xd3c +#define rOFDM1_PseudoNoiseStateAB 0xd50 +#define rOFDM1_PseudoNoiseStateCD 0xd54 +#define rOFDM1_RxPseudoNoiseWgt 0xd58 + +#define rOFDM_PHYCounter1 0xda0 //cca, parity fail +#define rOFDM_PHYCounter2 0xda4 //rate illegal, crc8 fail +#define rOFDM_PHYCounter3 0xda8 //MCS not support + +#define rOFDM_ShortCFOAB 0xdac // No setting now +#define rOFDM_ShortCFOCD 0xdb0 +#define rOFDM_LongCFOAB 0xdb4 +#define rOFDM_LongCFOCD 0xdb8 +#define rOFDM_TailCFOAB 0xdbc +#define rOFDM_TailCFOCD 0xdc0 +#define rOFDM_PWMeasure1 0xdc4 +#define rOFDM_PWMeasure2 0xdc8 +#define rOFDM_BWReport 0xdcc +#define rOFDM_AGCReport 0xdd0 +#define rOFDM_RxSNR 0xdd4 +#define rOFDM_RxEVMCSI 0xdd8 +#define rOFDM_SIGReport 0xddc + + +// +// 8. PageE(0xE00) +// +#define rTxAGC_Rate18_06 0xe00 +#define rTxAGC_Rate54_24 0xe04 +#define rTxAGC_CCK_Mcs32 0xe08 +#define rTxAGC_Mcs03_Mcs00 0xe10 +#define rTxAGC_Mcs07_Mcs04 0xe14 +#define rTxAGC_Mcs11_Mcs08 0xe18 +#define rTxAGC_Mcs15_Mcs12 0xe1c + +// Analog- control in RX_WAIT_CCA : REG: EE0 [Analog- Power & Control Register] +#define rRx_Wait_CCCA 0xe70 +#define rAnapar_Ctrl_BB 0xee0 + +// +// 7. RF Register 0x00-0x2E (RF 8256) +// RF-0222D 0x00-3F +// +//Zebra1 +#define RTL92SE_FPGA_VERIFY 0 +#define rZebra1_HSSIEnable 0x0 // Useless now +#define rZebra1_TRxEnable1 0x1 +#define rZebra1_TRxEnable2 0x2 +#define rZebra1_AGC 0x4 +#define rZebra1_ChargePump 0x5 +//#if (RTL92SE_FPGA_VERIFY == 1) +#define rZebra1_Channel 0x7 // RF channel switch +//#else + +//#endif +#define rZebra1_TxGain 0x8 // Useless now +#define rZebra1_TxLPF 0x9 +#define rZebra1_RxLPF 0xb +#define rZebra1_RxHPFCorner 0xc + +//Zebra4 +#define rGlobalCtrl 0 // Useless now +#define rRTL8256_TxLPF 19 +#define rRTL8256_RxLPF 11 + +//RTL8258 +#define rRTL8258_TxLPF 0x11 // Useless now +#define rRTL8258_RxLPF 0x13 +#define rRTL8258_RSSILPF 0xa + +// +// RL6052 Register definition +// +#define RF_AC 0x00 // + +#define RF_IQADJ_G1 0x01 // +#define RF_IQADJ_G2 0x02 // +#define RF_POW_TRSW 0x05 // + +#define RF_GAIN_RX 0x06 // +#define RF_GAIN_TX 0x07 // + +#define RF_TXM_IDAC 0x08 // +#define RF_BS_IQGEN 0x0F // + +#define RF_MODE1 0x10 // +#define RF_MODE2 0x11 // + +#define RF_RX_AGC_HP 0x12 // +#define RF_TX_AGC 0x13 // +#define RF_BIAS 0x14 // +#define RF_IPA 0x15 // +#define RF_POW_ABILITY 0x17 // +#define RF_MODE_AG 0x18 // +#define rRfChannel 0x18 // RF channel and BW switch +#define RF_CHNLBW 0x18 // RF channel and BW switch +#define RF_TOP 0x19 // + +#define RF_RX_G1 0x1A // +#define RF_RX_G2 0x1B // + +#define RF_RX_BB2 0x1C // +#define RF_RX_BB1 0x1D // + +#define RF_RCK1 0x1E // +#define RF_RCK2 0x1F // + +#define RF_TX_G1 0x20 // +#define RF_TX_G2 0x21 // +#define RF_TX_G3 0x22 // + +#define RF_TX_BB1 0x23 // + +#define RF_T_METER 0x24 // + +#define RF_SYN_G1 0x25 // RF TX Power control +#define RF_SYN_G2 0x26 // RF TX Power control +#define RF_SYN_G3 0x27 // RF TX Power control +#define RF_SYN_G4 0x28 // RF TX Power control +#define RF_SYN_G5 0x29 // RF TX Power control +#define RF_SYN_G6 0x2A // RF TX Power control +#define RF_SYN_G7 0x2B // RF TX Power control +#define RF_SYN_G8 0x2C // RF TX Power control + +#define RF_RCK_OS 0x30 // RF TX PA control + +#define RF_TXPA_G1 0x31 // RF TX PA control +#define RF_TXPA_G2 0x32 // RF TX PA control +#define RF_TXPA_G3 0x33 // RF TX PA control + +// +//Bit Mask +// +// 1. Page1(0x100) +#define bBBResetB 0x100 // Useless now? +#define bGlobalResetB 0x200 +#define bOFDMTxStart 0x4 +#define bCCKTxStart 0x8 +#define bCRC32Debug 0x100 +#define bPMACLoopback 0x10 +#define bTxLSIG 0xffffff +#define bOFDMTxRate 0xf +#define bOFDMTxReserved 0x10 +#define bOFDMTxLength 0x1ffe0 +#define bOFDMTxParity 0x20000 +#define bTxHTSIG1 0xffffff +#define bTxHTMCSRate 0x7f +#define bTxHTBW 0x80 +#define bTxHTLength 0xffff00 +#define bTxHTSIG2 0xffffff +#define bTxHTSmoothing 0x1 +#define bTxHTSounding 0x2 +#define bTxHTReserved 0x4 +#define bTxHTAggreation 0x8 +#define bTxHTSTBC 0x30 +#define bTxHTAdvanceCoding 0x40 +#define bTxHTShortGI 0x80 +#define bTxHTNumberHT_LTF 0x300 +#define bTxHTCRC8 0x3fc00 +#define bCounterReset 0x10000 +#define bNumOfOFDMTx 0xffff +#define bNumOfCCKTx 0xffff0000 +#define bTxIdleInterval 0xffff +#define bOFDMService 0xffff0000 +#define bTxMACHeader 0xffffffff +#define bTxDataInit 0xff +#define bTxHTMode 0x100 +#define bTxDataType 0x30000 +#define bTxRandomSeed 0xffffffff +#define bCCKTxPreamble 0x1 +#define bCCKTxSFD 0xffff0000 +#define bCCKTxSIG 0xff +#define bCCKTxService 0xff00 +#define bCCKLengthExt 0x8000 +#define bCCKTxLength 0xffff0000 +#define bCCKTxCRC16 0xffff +#define bCCKTxStatus 0x1 +#define bOFDMTxStatus 0x2 + +#define IS_BB_REG_OFFSET_92S(_Offset) ((_Offset >= 0x800) && (_Offset <= 0xfff)) + +// 2. Page8(0x800) +#define bRFMOD 0x1 // Reg 0x800 rFPGA0_RFMOD +#define bJapanMode 0x2 +#define bCCKTxSC 0x30 +#define bCCKEn 0x1000000 +#define bOFDMEn 0x2000000 + +#define bOFDMRxADCPhase 0x10000 // Useless now +#define bOFDMTxDACPhase 0x40000 +#define bXATxAGC 0x3f + +#define bXBTxAGC 0xf00 // Reg 80c rFPGA0_TxGainStage +#define bXCTxAGC 0xf000 +#define bXDTxAGC 0xf0000 + +#define bPAStart 0xf0000000 // Useless now +#define bTRStart 0x00f00000 +#define bRFStart 0x0000f000 +#define bBBStart 0x000000f0 +#define bBBCCKStart 0x0000000f +#define bPAEnd 0xf //Reg0x814 +#define bTREnd 0x0f000000 +#define bRFEnd 0x000f0000 +#define bCCAMask 0x000000f0 //T2R +#define bR2RCCAMask 0x00000f00 +#define bHSSI_R2TDelay 0xf8000000 +#define bHSSI_T2RDelay 0xf80000 +#define bContTxHSSI 0x400 //chane gain at continue Tx +#define bIGFromCCK 0x200 +#define bAGCAddress 0x3f +#define bRxHPTx 0x7000 +#define bRxHPT2R 0x38000 +#define bRxHPCCKIni 0xc0000 +#define bAGCTxCode 0xc00000 +#define bAGCRxCode 0x300000 + +#define b3WireDataLength 0x800 // Reg 0x820~84f rFPGA0_XA_HSSIParameter1 +#define b3WireAddressLength 0x400 + +#define b3WireRFPowerDown 0x1 // Useless now +//#define bHWSISelect 0x8 +#define b5GPAPEPolarity 0x40000000 +#define b2GPAPEPolarity 0x80000000 +#define bRFSW_TxDefaultAnt 0x3 +#define bRFSW_TxOptionAnt 0x30 +#define bRFSW_RxDefaultAnt 0x300 +#define bRFSW_RxOptionAnt 0x3000 +#define bRFSI_3WireData 0x1 +#define bRFSI_3WireClock 0x2 +#define bRFSI_3WireLoad 0x4 +#define bRFSI_3WireRW 0x8 +#define bRFSI_3Wire 0xf + +#define bRFSI_RFENV 0x10 // Reg 0x870 rFPGA0_XAB_RFInterfaceSW + +#define bRFSI_TRSW 0x20 // Useless now +#define bRFSI_TRSWB 0x40 +#define bRFSI_ANTSW 0x100 +#define bRFSI_ANTSWB 0x200 +#define bRFSI_PAPE 0x400 +#define bRFSI_PAPE5G 0x800 +#define bBandSelect 0x1 +#define bHTSIG2_GI 0x80 +#define bHTSIG2_Smoothing 0x01 +#define bHTSIG2_Sounding 0x02 +#define bHTSIG2_Aggreaton 0x08 +#define bHTSIG2_STBC 0x30 +#define bHTSIG2_AdvCoding 0x40 +#define bHTSIG2_NumOfHTLTF 0x300 +#define bHTSIG2_CRC8 0x3fc +#define bHTSIG1_MCS 0x7f +#define bHTSIG1_BandWidth 0x80 +#define bHTSIG1_HTLength 0xffff +#define bLSIG_Rate 0xf +#define bLSIG_Reserved 0x10 +#define bLSIG_Length 0x1fffe +#define bLSIG_Parity 0x20 +#define bCCKRxPhase 0x4 +#if (RTL92SE_FPGA_VERIFY == 1) +#define bLSSIReadAddress 0x3f000000 //LSSI "Read" Address // Reg 0x824 rFPGA0_XA_HSSIParameter2 +#else +#define bLSSIReadAddress 0x7f800000 // T65 RF +#endif +#define bLSSIReadEdge 0x80000000 //LSSI "Read" edge signal +#if (RTL92SE_FPGA_VERIFY == 1) +#define bLSSIReadBackData 0xfff // Reg 0x8a0 rFPGA0_XA_LSSIReadBack +#else +#define bLSSIReadBackData 0xfffff // T65 RF +#endif +#define bLSSIReadOKFlag 0x1000 // Useless now +#define bCCKSampleRate 0x8 //0: 44MHz, 1:88MHz +#define bRegulator0Standby 0x1 +#define bRegulatorPLLStandby 0x2 +#define bRegulator1Standby 0x4 +#define bPLLPowerUp 0x8 +#define bDPLLPowerUp 0x10 +#define bDA10PowerUp 0x20 +#define bAD7PowerUp 0x200 +#define bDA6PowerUp 0x2000 +#define bXtalPowerUp 0x4000 +#define b40MDClkPowerUP 0x8000 +#define bDA6DebugMode 0x20000 +#define bDA6Swing 0x380000 + +#define bADClkPhase 0x4000000 // Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ + +#define b80MClkDelay 0x18000000 // Useless +#define bAFEWatchDogEnable 0x20000000 + +#define bXtalCap01 0xc0000000 // Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap +#define bXtalCap23 0x3 +#define bXtalCap92x 0x0f000000 +#define bXtalCap 0x0f000000 + +#define bIntDifClkEnable 0x400 // Useless +#define bExtSigClkEnable 0x800 +#define bBandgapMbiasPowerUp 0x10000 +#define bAD11SHGain 0xc0000 +#define bAD11InputRange 0x700000 +#define bAD11OPCurrent 0x3800000 +#define bIPathLoopback 0x4000000 +#define bQPathLoopback 0x8000000 +#define bAFELoopback 0x10000000 +#define bDA10Swing 0x7e0 +#define bDA10Reverse 0x800 +#define bDAClkSource 0x1000 +#define bAD7InputRange 0x6000 +#define bAD7Gain 0x38000 +#define bAD7OutputCMMode 0x40000 +#define bAD7InputCMMode 0x380000 +#define bAD7Current 0xc00000 +#define bRegulatorAdjust 0x7000000 +#define bAD11PowerUpAtTx 0x1 +#define bDA10PSAtTx 0x10 +#define bAD11PowerUpAtRx 0x100 +#define bDA10PSAtRx 0x1000 +#define bCCKRxAGCFormat 0x200 +#define bPSDFFTSamplepPoint 0xc000 +#define bPSDAverageNum 0x3000 +#define bIQPathControl 0xc00 +#define bPSDFreq 0x3ff +#define bPSDAntennaPath 0x30 +#define bPSDIQSwitch 0x40 +#define bPSDRxTrigger 0x400000 +#define bPSDTxTrigger 0x80000000 +#define bPSDSineToneScale 0x7f000000 +#define bPSDReport 0xffff + +// 3. Page9(0x900) +#define bOFDMTxSC 0x30000000 // Useless +#define bCCKTxOn 0x1 +#define bOFDMTxOn 0x2 +#define bDebugPage 0xfff //reset debug page and also HWord, LWord +#define bDebugItem 0xff //reset debug page and LWord +#define bAntL 0x10 +#define bAntNonHT 0x100 +#define bAntHT1 0x1000 +#define bAntHT2 0x10000 +#define bAntHT1S1 0x100000 +#define bAntNonHTS1 0x1000000 + +// 4. PageA(0xA00) +#define bCCKBBMode 0x3 // Useless +#define bCCKTxPowerSaving 0x80 +#define bCCKRxPowerSaving 0x40 + +#define bCCKSideBand 0x10 // Reg 0xa00 rCCK0_System 20/40 switch + +#define bCCKScramble 0x8 // Useless +#define bCCKAntDiversity 0x8000 +#define bCCKCarrierRecovery 0x4000 +#define bCCKTxRate 0x3000 +#define bCCKDCCancel 0x0800 +#define bCCKISICancel 0x0400 +#define bCCKMatchFilter 0x0200 +#define bCCKEqualizer 0x0100 +#define bCCKPreambleDetect 0x800000 +#define bCCKFastFalseCCA 0x400000 +#define bCCKChEstStart 0x300000 +#define bCCKCCACount 0x080000 +#define bCCKcs_lim 0x070000 +#define bCCKBistMode 0x80000000 +#define bCCKCCAMask 0x40000000 +#define bCCKTxDACPhase 0x4 +#define bCCKRxADCPhase 0x20000000 //r_rx_clk +#define bCCKr_cp_mode0 0x0100 +#define bCCKTxDCOffset 0xf0 +#define bCCKRxDCOffset 0xf +#define bCCKCCAMode 0xc000 +#define bCCKFalseCS_lim 0x3f00 +#define bCCKCS_ratio 0xc00000 +#define bCCKCorgBit_sel 0x300000 +#define bCCKPD_lim 0x0f0000 +#define bCCKNewCCA 0x80000000 +#define bCCKRxHPofIG 0x8000 +#define bCCKRxIG 0x7f00 +#define bCCKLNAPolarity 0x800000 +#define bCCKRx1stGain 0x7f0000 +#define bCCKRFExtend 0x20000000 //CCK Rx Iinital gain polarity +#define bCCKRxAGCSatLevel 0x1f000000 +#define bCCKRxAGCSatCount 0xe0 +#define bCCKRxRFSettle 0x1f //AGCsamp_dly +#define bCCKFixedRxAGC 0x8000 +//#define bCCKRxAGCFormat 0x4000 //remove to HSSI register 0x824 +#define bCCKAntennaPolarity 0x2000 +#define bCCKTxFilterType 0x0c00 +#define bCCKRxAGCReportType 0x0300 +#define bCCKRxDAGCEn 0x80000000 +#define bCCKRxDAGCPeriod 0x20000000 +#define bCCKRxDAGCSatLevel 0x1f000000 +#define bCCKTimingRecovery 0x800000 +#define bCCKTxC0 0x3f0000 +#define bCCKTxC1 0x3f000000 +#define bCCKTxC2 0x3f +#define bCCKTxC3 0x3f00 +#define bCCKTxC4 0x3f0000 +#define bCCKTxC5 0x3f000000 +#define bCCKTxC6 0x3f +#define bCCKTxC7 0x3f00 +#define bCCKDebugPort 0xff0000 +#define bCCKDACDebug 0x0f000000 +#define bCCKFalseAlarmEnable 0x8000 +#define bCCKFalseAlarmRead 0x4000 +#define bCCKTRSSI 0x7f +#define bCCKRxAGCReport 0xfe +#define bCCKRxReport_AntSel 0x80000000 +#define bCCKRxReport_MFOff 0x40000000 +#define bCCKRxRxReport_SQLoss 0x20000000 +#define bCCKRxReport_Pktloss 0x10000000 +#define bCCKRxReport_Lockedbit 0x08000000 +#define bCCKRxReport_RateError 0x04000000 +#define bCCKRxReport_RxRate 0x03000000 +#define bCCKRxFACounterLower 0xff +#define bCCKRxFACounterUpper 0xff000000 +#define bCCKRxHPAGCStart 0xe000 +#define bCCKRxHPAGCFinal 0x1c00 +#define bCCKRxFalseAlarmEnable 0x8000 +#define bCCKFACounterFreeze 0x4000 +#define bCCKTxPathSel 0x10000000 +#define bCCKDefaultRxPath 0xc000000 +#define bCCKOptionRxPath 0x3000000 + +// 5. PageC(0xC00) +#define bNumOfSTF 0x3 // Useless +#define bShift_L 0xc0 +#define bGI_TH 0xc +#define bRxPathA 0x1 +#define bRxPathB 0x2 +#define bRxPathC 0x4 +#define bRxPathD 0x8 +#define bTxPathA 0x1 +#define bTxPathB 0x2 +#define bTxPathC 0x4 +#define bTxPathD 0x8 +#define bTRSSIFreq 0x200 +#define bADCBackoff 0x3000 +#define bDFIRBackoff 0xc000 +#define bTRSSILatchPhase 0x10000 +#define bRxIDCOffset 0xff +#define bRxQDCOffset 0xff00 +#define bRxDFIRMode 0x1800000 +#define bRxDCNFType 0xe000000 +#define bRXIQImb_A 0x3ff +#define bRXIQImb_B 0xfc00 +#define bRXIQImb_C 0x3f0000 +#define bRXIQImb_D 0xffc00000 +#define bDC_dc_Notch 0x60000 +#define bRxNBINotch 0x1f000000 +#define bPD_TH 0xf +#define bPD_TH_Opt2 0xc000 +#define bPWED_TH 0x700 +#define bIfMF_Win_L 0x800 +#define bPD_Option 0x1000 +#define bMF_Win_L 0xe000 +#define bBW_Search_L 0x30000 +#define bwin_enh_L 0xc0000 +#define bBW_TH 0x700000 +#define bED_TH2 0x3800000 +#define bBW_option 0x4000000 +#define bRatio_TH 0x18000000 +#define bWindow_L 0xe0000000 +#define bSBD_Option 0x1 +#define bFrame_TH 0x1c +#define bFS_Option 0x60 +#define bDC_Slope_check 0x80 +#define bFGuard_Counter_DC_L 0xe00 +#define bFrame_Weight_Short 0x7000 +#define bSub_Tune 0xe00000 +#define bFrame_DC_Length 0xe000000 +#define bSBD_start_offset 0x30000000 +#define bFrame_TH_2 0x7 +#define bFrame_GI2_TH 0x38 +#define bGI2_Sync_en 0x40 +#define bSarch_Short_Early 0x300 +#define bSarch_Short_Late 0xc00 +#define bSarch_GI2_Late 0x70000 +#define bCFOAntSum 0x1 +#define bCFOAcc 0x2 +#define bCFOStartOffset 0xc +#define bCFOLookBack 0x70 +#define bCFOSumWeight 0x80 +#define bDAGCEnable 0x10000 +#define bTXIQImb_A 0x3ff +#define bTXIQImb_B 0xfc00 +#define bTXIQImb_C 0x3f0000 +#define bTXIQImb_D 0xffc00000 +#define bTxIDCOffset 0xff +#define bTxQDCOffset 0xff00 +#define bTxDFIRMode 0x10000 +#define bTxPesudoNoiseOn 0x4000000 +#define bTxPesudoNoise_A 0xff +#define bTxPesudoNoise_B 0xff00 +#define bTxPesudoNoise_C 0xff0000 +#define bTxPesudoNoise_D 0xff000000 +#define bCCADropOption 0x20000 +#define bCCADropThres 0xfff00000 +#define bEDCCA_H 0xf +#define bEDCCA_L 0xf0 +#define bLambda_ED 0x300 +#define bRxInitialGain 0x7f +#define bRxAntDivEn 0x80 +#define bRxAGCAddressForLNA 0x7f00 +#define bRxHighPowerFlow 0x8000 +#define bRxAGCFreezeThres 0xc0000 +#define bRxFreezeStep_AGC1 0x300000 +#define bRxFreezeStep_AGC2 0xc00000 +#define bRxFreezeStep_AGC3 0x3000000 +#define bRxFreezeStep_AGC0 0xc000000 +#define bRxRssi_Cmp_En 0x10000000 +#define bRxQuickAGCEn 0x20000000 +#define bRxAGCFreezeThresMode 0x40000000 +#define bRxOverFlowCheckType 0x80000000 +#define bRxAGCShift 0x7f +#define bTRSW_Tri_Only 0x80 +#define bPowerThres 0x300 +#define bRxAGCEn 0x1 +#define bRxAGCTogetherEn 0x2 +#define bRxAGCMin 0x4 +#define bRxHP_Ini 0x7 +#define bRxHP_TRLNA 0x70 +#define bRxHP_RSSI 0x700 +#define bRxHP_BBP1 0x7000 +#define bRxHP_BBP2 0x70000 +#define bRxHP_BBP3 0x700000 +#define bRSSI_H 0x7f0000 //the threshold for high power +#define bRSSI_Gen 0x7f000000 //the threshold for ant diversity +#define bRxSettle_TRSW 0x7 +#define bRxSettle_LNA 0x38 +#define bRxSettle_RSSI 0x1c0 +#define bRxSettle_BBP 0xe00 +#define bRxSettle_RxHP 0x7000 +#define bRxSettle_AntSW_RSSI 0x38000 +#define bRxSettle_AntSW 0xc0000 +#define bRxProcessTime_DAGC 0x300000 +#define bRxSettle_HSSI 0x400000 +#define bRxProcessTime_BBPPW 0x800000 +#define bRxAntennaPowerShift 0x3000000 +#define bRSSITableSelect 0xc000000 +#define bRxHP_Final 0x7000000 +#define bRxHTSettle_BBP 0x7 +#define bRxHTSettle_HSSI 0x8 +#define bRxHTSettle_RxHP 0x70 +#define bRxHTSettle_BBPPW 0x80 +#define bRxHTSettle_Idle 0x300 +#define bRxHTSettle_Reserved 0x1c00 +#define bRxHTRxHPEn 0x8000 +#define bRxHTAGCFreezeThres 0x30000 +#define bRxHTAGCTogetherEn 0x40000 +#define bRxHTAGCMin 0x80000 +#define bRxHTAGCEn 0x100000 +#define bRxHTDAGCEn 0x200000 +#define bRxHTRxHP_BBP 0x1c00000 +#define bRxHTRxHP_Final 0xe0000000 +#define bRxPWRatioTH 0x3 +#define bRxPWRatioEn 0x4 +#define bRxMFHold 0x3800 +#define bRxPD_Delay_TH1 0x38 +#define bRxPD_Delay_TH2 0x1c0 +#define bRxPD_DC_COUNT_MAX 0x600 +//#define bRxMF_Hold 0x3800 +#define bRxPD_Delay_TH 0x8000 +#define bRxProcess_Delay 0xf0000 +#define bRxSearchrange_GI2_Early 0x700000 +#define bRxFrame_Guard_Counter_L 0x3800000 +#define bRxSGI_Guard_L 0xc000000 +#define bRxSGI_Search_L 0x30000000 +#define bRxSGI_TH 0xc0000000 +#define bDFSCnt0 0xff +#define bDFSCnt1 0xff00 +#define bDFSFlag 0xf0000 +#define bMFWeightSum 0x300000 +#define bMinIdxTH 0x7f000000 +#define bDAFormat 0x40000 +#define bTxChEmuEnable 0x01000000 +#define bTRSWIsolation_A 0x7f +#define bTRSWIsolation_B 0x7f00 +#define bTRSWIsolation_C 0x7f0000 +#define bTRSWIsolation_D 0x7f000000 +#define bExtLNAGain 0x7c00 + +// 6. PageE(0xE00) +#define bSTBCEn 0x4 // Useless +#define bAntennaMapping 0x10 +#define bNss 0x20 +#define bCFOAntSumD 0x200 +#define bPHYCounterReset 0x8000000 +#define bCFOReportGet 0x4000000 +#define bOFDMContinueTx 0x10000000 +#define bOFDMSingleCarrier 0x20000000 +#define bOFDMSingleTone 0x40000000 +//#define bRxPath1 0x01 +//#define bRxPath2 0x02 +//#define bRxPath3 0x04 +//#define bRxPath4 0x08 +//#define bTxPath1 0x10 +//#define bTxPath2 0x20 +#define bHTDetect 0x100 +#define bCFOEn 0x10000 +#define bCFOValue 0xfff00000 +#define bSigTone_Re 0x3f +#define bSigTone_Im 0x7f00 +#define bCounter_CCA 0xffff +#define bCounter_ParityFail 0xffff0000 +#define bCounter_RateIllegal 0xffff +#define bCounter_CRC8Fail 0xffff0000 +#define bCounter_MCSNoSupport 0xffff +#define bCounter_FastSync 0xffff +#define bShortCFO 0xfff +#define bShortCFOTLength 12 //total +#define bShortCFOFLength 11 //fraction +#define bLongCFO 0x7ff +#define bLongCFOTLength 11 +#define bLongCFOFLength 11 +#define bTailCFO 0x1fff +#define bTailCFOTLength 13 +#define bTailCFOFLength 12 +#define bmax_en_pwdB 0xffff +#define bCC_power_dB 0xffff0000 +#define bnoise_pwdB 0xffff +#define bPowerMeasTLength 10 +#define bPowerMeasFLength 3 +#define bRx_HT_BW 0x1 +#define bRxSC 0x6 +#define bRx_HT 0x8 +#define bNB_intf_det_on 0x1 +#define bIntf_win_len_cfg 0x30 +#define bNB_Intf_TH_cfg 0x1c0 +#define bRFGain 0x3f +#define bTableSel 0x40 +#define bTRSW 0x80 +#define bRxSNR_A 0xff +#define bRxSNR_B 0xff00 +#define bRxSNR_C 0xff0000 +#define bRxSNR_D 0xff000000 +#define bSNREVMTLength 8 +#define bSNREVMFLength 1 +#define bCSI1st 0xff +#define bCSI2nd 0xff00 +#define bRxEVM1st 0xff0000 +#define bRxEVM2nd 0xff000000 +#define bSIGEVM 0xff +#define bPWDB 0xff00 +#define bSGIEN 0x10000 + +#define bSFactorQAM1 0xf // Useless +#define bSFactorQAM2 0xf0 +#define bSFactorQAM3 0xf00 +#define bSFactorQAM4 0xf000 +#define bSFactorQAM5 0xf0000 +#define bSFactorQAM6 0xf0000 +#define bSFactorQAM7 0xf00000 +#define bSFactorQAM8 0xf000000 +#define bSFactorQAM9 0xf0000000 +#define bCSIScheme 0x100000 + +#define bNoiseLvlTopSet 0x3 // Useless +#define bChSmooth 0x4 +#define bChSmoothCfg1 0x38 +#define bChSmoothCfg2 0x1c0 +#define bChSmoothCfg3 0xe00 +#define bChSmoothCfg4 0x7000 +#define bMRCMode 0x800000 +#define bTHEVMCfg 0x7000000 + +#define bLoopFitType 0x1 // Useless +#define bUpdCFO 0x40 +#define bUpdCFOOffData 0x80 +#define bAdvUpdCFO 0x100 +#define bAdvTimeCtrl 0x800 +#define bUpdClko 0x1000 +#define bFC 0x6000 +#define bTrackingMode 0x8000 +#define bPhCmpEnable 0x10000 +#define bUpdClkoLTF 0x20000 +#define bComChCFO 0x40000 +#define bCSIEstiMode 0x80000 +#define bAdvUpdEqz 0x100000 +#define bUChCfg 0x7000000 +#define bUpdEqz 0x8000000 + +#define bTxAGCRate18_06 0x7f7f7f7f // Useless +#define bTxAGCRate54_24 0x7f7f7f7f +#define bTxAGCRateMCS32 0x7f +#define bTxAGCRateCCK 0x7f00 +#define bTxAGCRateMCS3_MCS0 0x7f7f7f7f +#define bTxAGCRateMCS7_MCS4 0x7f7f7f7f +#define bTxAGCRateMCS11_MCS8 0x7f7f7f7f +#define bTxAGCRateMCS15_MCS12 0x7f7f7f7f + +//Rx Pseduo noise +#define bRxPesudoNoiseOn 0x20000000 // Useless +#define bRxPesudoNoise_A 0xff +#define bRxPesudoNoise_B 0xff00 +#define bRxPesudoNoise_C 0xff0000 +#define bRxPesudoNoise_D 0xff000000 +#define bPesudoNoiseState_A 0xffff +#define bPesudoNoiseState_B 0xffff0000 +#define bPesudoNoiseState_C 0xffff +#define bPesudoNoiseState_D 0xffff0000 + +//7. RF Register +//Zebra1 +#define bZebra1_HSSIEnable 0x8 // Useless +#define bZebra1_TRxControl 0xc00 +#define bZebra1_TRxGainSetting 0x07f +#define bZebra1_RxCorner 0xc00 +#define bZebra1_TxChargePump 0x38 +#define bZebra1_RxChargePump 0x7 +#define bZebra1_ChannelNum 0xf80 +#define bZebra1_TxLPFBW 0x400 +#define bZebra1_RxLPFBW 0x600 + +//Zebra4 +#define bRTL8256RegModeCtrl1 0x100 // Useless +#define bRTL8256RegModeCtrl0 0x40 +#define bRTL8256_TxLPFBW 0x18 +#define bRTL8256_RxLPFBW 0x600 + +//RTL8258 +#define bRTL8258_TxLPFBW 0xc // Useless +#define bRTL8258_RxLPFBW 0xc00 +#define bRTL8258_RSSILPFBW 0xc0 + + +// +// Other Definition +// + +//byte endable for sb_write +#define bByte0 0x1 // Useless +#define bByte1 0x2 +#define bByte2 0x4 +#define bByte3 0x8 +#define bWord0 0x3 +#define bWord1 0xc +#define bDWord 0xf + +//for PutRegsetting & GetRegSetting BitMask +#define bMaskByte0 0xff // Reg 0xc50 rOFDM0_XAAGCCore~0xC6f +#define bMaskByte1 0xff00 +#define bMaskByte2 0xff0000 +#define bMaskByte3 0xff000000 +#define bMaskHWord 0xffff0000 +#define bMaskLWord 0x0000ffff +#define bMaskDWord 0xffffffff +#define bMaskH4Bits 0xf0000000 +#define bMaskOFDM_D 0xffc00000 +#define bMaskCCK 0x3f3f3f3f +#define bMask12Bits 0xfff + +//for PutRFRegsetting & GetRFRegSetting BitMask +#if (RTL92SE_FPGA_VERIFY == 1) +//#define bMask12Bits 0xfff // RF Reg mask bits +//#define bMask20Bits 0xfff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfff +#else +//#define bMask12Bits 0xfffff // RF Reg mask bits +//#define bMask20Bits 0xfffff // RF Reg mask bits T65 RF +#define bRFRegOffsetMask 0xfffff +#endif +#define bEnable 0x1 // Useless +#define bDisable 0x0 + +#define LeftAntenna 0x0 // Useless +#define RightAntenna 0x1 + +#define tCheckTxStatus 500 //500ms // Useless +#define tUpdateRxCounter 100 //100ms + +#define rateCCK 0 // Useless +#define rateOFDM 1 +#define rateHT 2 + +//define Register-End +#define bPMAC_End 0x1ff // Useless +#define bFPGAPHY0_End 0x8ff +#define bFPGAPHY1_End 0x9ff +#define bCCKPHY0_End 0xaff +#define bOFDMPHY0_End 0xcff +#define bOFDMPHY1_End 0xdff + +//define max debug item in each debug page +//#define bMaxItem_FPGA_PHY0 0x9 +//#define bMaxItem_FPGA_PHY1 0x3 +//#define bMaxItem_PHY_11B 0x16 +//#define bMaxItem_OFDM_PHY0 0x29 +//#define bMaxItem_OFDM_PHY1 0x0 + +#define bPMACControl 0x0 // Useless +#define bWMACControl 0x1 +#define bWNICControl 0x2 + +#if 0 +#define ANTENNA_A 0x1 // Useless +#define ANTENNA_B 0x2 +#define ANTENNA_AB 0x3 // ANTENNA_A|ANTENNA_B + +#define ANTENNA_C 0x4 +#define ANTENNA_D 0x8 +#endif + +#define RCR_AAP BIT(0) // accept all physical address +#define RCR_APM BIT(1) // accept physical match +#define RCR_AM BIT(2) // accept multicast +#define RCR_AB BIT(3) // accept broadcast +#define RCR_ACRC32 BIT(5) // accept error packet +#define RCR_9356SEL BIT(6) +#define RCR_AICV BIT(12) // Accept ICV error packet +#define RCR_RXFTH0 (BIT(13)|BIT(14)|BIT(15)) // Rx FIFO threshold +#define RCR_ADF BIT(18) // Accept Data(frame type) frame +#define RCR_ACF BIT(19) // Accept control frame +#define RCR_AMF BIT(20) // Accept management frame +#define RCR_ADD3 BIT(21) +#define RCR_APWRMGT BIT(22) // Accept power management packet +#define RCR_CBSSID BIT(23) // Accept BSSID match packet +#define RCR_ENMARP BIT(28) // enable mac auto reset phy +#define RCR_EnCS1 BIT(29) // enable carrier sense method 1 +#define RCR_EnCS2 BIT(30) // enable carrier sense method 2 +#define RCR_OnlyErlPkt BIT(31) // Rx Early mode is performed for packet size greater than 1536 + +/*--------------------------Define Parameters-------------------------------*/ + + +#endif //__INC_HAL8192SPHYREG_H + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_p2p.h b/drivers/net/wireless/rtl8192c/include/rtw_p2p.h new file mode 100755 index 000000000000..389096736565 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_p2p.h @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __RTW_P2P_H_ +#define __RTW_P2P_H_ + +#include + +u32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +u32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +u32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr ); +u32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code); +u32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +#ifdef CONFIG_WFD +u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf); +#endif //CONFIG_WFD + +u32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *p2p_ie, uint p2p_ielen, struct sta_info *psta); +u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); +u8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe); +u8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); +u8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); +u8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len ); +u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len); + +void process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength); +void p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state); +void p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType); +u8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h b/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h new file mode 100755 index 000000000000..eab7c831e517 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_pwrctrl.h @@ -0,0 +1,332 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_PWRCTRL_H_ +#define __RTW_PWRCTRL_H_ + +#include +#include +#include + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif //CONFIG_HAS_EARLYSUSPEND + + +#define FW_PWR0 0 +#define FW_PWR1 1 +#define FW_PWR2 2 +#define FW_PWR3 3 + + +#define HW_PWR0 7 +#define HW_PWR1 6 +#define HW_PWR2 2 +#define HW_PWR3 0 +#define HW_PWR4 8 + +#define FW_PWRMSK 0x7 + + +#define XMIT_ALIVE BIT(0) +#define RECV_ALIVE BIT(1) +#define CMD_ALIVE BIT(2) +#define EVT_ALIVE BIT(3) + + +enum Power_Mgnt +{ + PS_MODE_ACTIVE = 0 , + PS_MODE_MIN , + PS_MODE_MAX , + PS_MODE_DTIM , + PS_MODE_VOIP , + PS_MODE_UAPSD_WMM , + PS_MODE_UAPSD , + PS_MODE_IBSS , + PS_MODE_WWLAN , + PM_Radio_Off , + PM_Card_Disable , + PS_MODE_NUM +}; + + +/* + BIT[2:0] = HW state + BIT[3] = Protocol PS state, 0: register active state , 1: register sleep state + BIT[4] = sub-state +*/ + +#define PS_DPS BIT(0) +#define PS_LCLK (PS_DPS) +#define PS_RF_OFF BIT(1) +#define PS_ALL_ON BIT(2) +#define PS_ST_ACTIVE BIT(3) +#define PS_LP BIT(4) // low performance + +#define PS_STATE_MASK (0x0F) +#define PS_STATE_HW_MASK (0x07) +#define PS_SEQ_MASK (0xc0) + +#define PS_STATE(x) (PS_STATE_MASK & (x)) +#define PS_STATE_HW(x) (PS_STATE_HW_MASK & (x)) +#define PS_SEQ(x) (PS_SEQ_MASK & (x)) + +#define PS_STATE_S0 (PS_DPS) +#define PS_STATE_S1 (PS_LCLK) +#define PS_STATE_S2 (PS_RF_OFF) +#define PS_STATE_S3 (PS_ALL_ON) +#define PS_STATE_S4 ((PS_ST_ACTIVE) | (PS_ALL_ON)) + + +#define PS_IS_RF_ON(x) ((x) & (PS_ALL_ON)) +#define PS_IS_ACTIVE(x) ((x) & (PS_ST_ACTIVE)) +#define CLR_PS_STATE(x) ((x) = ((x) & (0xF0))) + + +struct reportpwrstate_parm { + unsigned char mode; + unsigned char state; //the CPWM value + unsigned short rsvd; +}; + + +typedef _sema _pwrlock; + + +__inline static void _init_pwrlock(_pwrlock *plock) +{ + _rtw_init_sema(plock, 1); +} + +__inline static void _free_pwrlock(_pwrlock *plock) +{ + _rtw_free_sema(plock); +} + + +__inline static void _enter_pwrlock(_pwrlock *plock) +{ + _rtw_down_sema(plock); +} + + +__inline static void _exit_pwrlock(_pwrlock *plock) +{ + _rtw_up_sema(plock); +} + +#define LPS_DELAY_TIME 1*HZ // 1 sec + +#define EXE_PWR_NONE 0x01 +#define EXE_PWR_IPS 0x02 +#define EXE_PWR_LPS 0x04 + +// RF state. +typedef enum _rt_rf_power_state +{ + rf_on, // RF is on after RFSleep or RFOff + rf_sleep, // 802.11 Power Save mode + rf_off, // HW/SW Radio OFF or Inactive Power Save + //=====Add the new RF state above this line=====// + rf_max +}rt_rf_power_state; + +// RF Off Level for IPS or HW/SW radio off +#define RT_RF_OFF_LEVL_ASPM BIT(0) // PCI ASPM +#define RT_RF_OFF_LEVL_CLK_REQ BIT(1) // PCI clock request +#define RT_RF_OFF_LEVL_PCI_D3 BIT(2) // PCI D3 mode +#define RT_RF_OFF_LEVL_HALT_NIC BIT(3) // NIC halt, re-initialize hw parameters +#define RT_RF_OFF_LEVL_FREE_FW BIT(4) // FW free, re-download the FW +#define RT_RF_OFF_LEVL_FW_32K BIT(5) // FW in 32k +#define RT_RF_PS_LEVEL_ALWAYS_ASPM BIT(6) // Always enable ASPM and Clock Req in initialization. +#define RT_RF_LPS_DISALBE_2R BIT(30) // When LPS is on, disable 2R if no packet is received or transmittd. +#define RT_RF_LPS_LEVEL_ASPM BIT(31) // LPS with ASPM + +#define RT_IN_PS_LEVEL(ppsc, _PS_FLAG) ((ppsc->cur_ps_level & _PS_FLAG) ? _TRUE : _FALSE) +#define RT_CLEAR_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level &= (~(_PS_FLAG))) +#define RT_SET_PS_LEVEL(ppsc, _PS_FLAG) (ppsc->cur_ps_level |= _PS_FLAG) + + +enum _PS_BBRegBackup_ { + PSBBREG_RF0 = 0, + PSBBREG_RF1, + PSBBREG_RF2, + PSBBREG_AFE0, + PSBBREG_TOTALCNT +}; + +enum { // for ips_mode + IPS_NORMAL = 0, + IPS_LEVEL_2, + IPS_NONE, +}; + +struct pwrctrl_priv { + _pwrlock lock; + volatile u8 rpwm; // requested power state for fw + volatile u8 cpwm; // fw current power state. updated when 1. read from HCPWM 2. driver lowers power level + volatile u8 tog; // toggling + volatile u8 cpwm_tog; // toggling + u8 pwr_mode; + u8 smart_ps; + uint alives; + + u8 b_hw_radio_off; + u8 reg_rfoff; + u8 reg_pdnmode; //powerdown mode + u32 rfoff_reason; + + //RF OFF Level + u32 cur_ps_level; + u32 reg_rfps_level; + + + +#ifdef CONFIG_PCI_HCI + //just for PCIE ASPM + u8 b_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00. + u8 b_support_backdoor; + + //just for PCIE ASPM + u8 const_amdpci_aspm; +#endif + + //u8 ips_enable;//for dbg + //u8 lps_enable;//for dbg + + uint ips_enter_cnts; + uint ips_leave_cnts; + + _timer ips_check_timer; + + u8 ips_mode; + u8 ips_mode_req; // used to accept the mode setting request, will update to ipsmode later + + u8 bLeisurePs; + u8 LpsIdleCount; + u8 power_mgnt; + u8 bFwCurrentInPSMode; + u32 DelayLPSLastTimeStamp; + + s32 pnp_current_pwr_state; + u8 pnp_bstop_trx; + + + u8 bInternalAutoSuspend; + u8 bInSuspend; + u8 bSupportRemoteWakeup; + _timer pwr_state_check_timer; + int pwr_state_check_interval; + u8 pwr_state_check_cnts; + uint bips_processing; + + int ps_flag; + + rt_rf_power_state rf_pwrstate;//cur power state + //rt_rf_power_state current_rfpwrstate; + rt_rf_power_state change_rfpwrstate; + + u8 wepkeymask; + u8 bHWPowerdown;//if support hw power down + u8 bHWPwrPindetect; + u8 bkeepfwalive; + u8 brfoffbyhw; + unsigned long PS_BBRegBackup[PSBBREG_TOTALCNT]; + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + struct workqueue_struct *rtw_workqueue; + _workitem resume_work; + #endif + + #ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; + u8 do_late_resume; + #endif //CONFIG_HAS_EARLYSUSPEND + + #ifdef CONFIG_ANDROID_POWER + android_early_suspend_t early_suspend; + u8 do_late_resume; + #endif + +}; + +#define rtw_get_ips_mode_req(pwrctrlpriv) \ + (pwrctrlpriv)->ips_mode_req + +#define rtw_ips_mode_req(pwrctrlpriv, ips_mode) \ + (pwrctrlpriv)->ips_mode_req = (ips_mode) + +#define _rtw_set_pwr_state_check_timer(pwrctrlpriv, ms) \ + do { \ + /*DBG_871X("%s _rtw_set_pwr_state_check_timer(%p, %d)\n", __FUNCTION__, (pwrctrlpriv), (ms));*/ \ + _set_timer(&(pwrctrlpriv)->pwr_state_check_timer, (ms)); \ + } while(0) + +#define rtw_set_pwr_state_check_timer(pwrctrlpriv) \ + _rtw_set_pwr_state_check_timer((pwrctrlpriv), (pwrctrlpriv)->pwr_state_check_interval) + +extern void rtw_init_pwrctrl_priv(_adapter *adapter); +extern void rtw_free_pwrctrl_priv(_adapter * adapter); +extern sint rtw_register_tx_alive(_adapter *padapter); +extern void rtw_unregister_tx_alive(_adapter *padapter); +extern sint rtw_register_rx_alive(_adapter *padapter); +extern void rtw_unregister_rx_alive(_adapter *padapter); +extern sint rtw_register_cmd_alive(_adapter *padapter); +extern void rtw_unregister_cmd_alive(_adapter *padapter); +extern sint rtw_register_evt_alive(_adapter *padapter); +extern void rtw_unregister_evt_alive(_adapter *padapter); +extern void cpwm_int_hdl(_adapter *padapter, struct reportpwrstate_parm *preportpwrstate); +extern void rtw_set_ps_mode(_adapter * padapter, u8 ps_mode, u8 smart_ps); +extern void rtw_set_rpwm(_adapter * padapter, u8 val8); +extern void LeaveAllPowerSaveMode(PADAPTER Adapter); +#ifdef CONFIG_IPS +void ips_enter(_adapter * padapter); +int ips_leave(_adapter * padapter); +#endif + +void rtw_ps_processor(_adapter*padapter); + +#ifdef CONFIG_AUTOSUSPEND +int autoresume_enter(_adapter* padapter); +#endif +#ifdef SUPPORT_HW_RFOFF_DETECTED +rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ); +#endif + + +#ifdef CONFIG_LPS +void LPS_Enter(PADAPTER padapter); +void LPS_Leave(PADAPTER padapter); +#endif + +#ifdef CONFIG_RESUME_IN_WORKQUEUE +void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv); +#endif //CONFIG_RESUME_IN_WORKQUEUE + +#if defined(CONFIG_HAS_EARLYSUSPEND ) || defined(CONFIG_ANDROID_POWER) +#define rtw_is_earlysuspend_registered(pwrpriv) (pwrpriv)->early_suspend.suspend +void rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv); +void rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv); +#endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER + +u8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val); + +#endif //__RTL871X_PWRCTRL_H_ diff --git a/drivers/net/wireless/rtl8192c/include/rtw_qos.h b/drivers/net/wireless/rtl8192c/include/rtw_qos.h new file mode 100755 index 000000000000..e35b77f4f9c1 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_qos.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ + + +#ifndef _RTW_QOS_H_ +#define _RTW_QOS_H_ +#include +#include + + + + + + +struct qos_priv { + + unsigned int qos_option; //bit mask option: u-apsd, s-apsd, ts, block ack... + +}; + + +#endif //_RTL871X_QOS_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_recv.h b/drivers/net/wireless/rtl8192c/include/rtw_recv.h new file mode 100755 index 000000000000..0562e59331ab --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_recv.h @@ -0,0 +1,703 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_RECV_H_ +#define _RTW_RECV_H_ + +#include +#include +#include + + +#define NR_RECVFRAME 256 + +#define RXFRAME_ALIGN 8 +#define RXFRAME_ALIGN_SZ (1<signal_stat_timer, (recvpriv)->signal_stat_sampling_interval) +#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS + +struct sta_recv_priv { + + _lock lock; + sint option; + + //_queue blk_strms[MAX_RX_NUMBLKS]; + _queue defrag_q; //keeping the fragment frame until defrag + + struct stainfo_rxcache rxcache; + + //uint sta_rx_bytes; + //uint sta_rx_pkts; + //uint sta_rx_fail; + +}; + + +struct recv_buf{ + + _list list; + + _lock recvbuf_lock; + + u32 ref_cnt; + + _adapter *adapter; + +#ifdef CONFIG_SDIO_HCI +#ifdef PLATFORM_OS_XP + PMDL mdl_ptr; +#endif + u8 cmd_fail; +#endif + +#ifdef CONFIG_USB_HCI + + #if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) + PURB purb; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ + u32 alloc_sz; + #endif + + #ifdef PLATFORM_OS_XP + PIRP pirp; + #endif + + #ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_read_port; + #endif + + u8 irp_pending; + int transfer_len; + +#endif + +#ifdef PLATFORM_LINUX + _pkt *pskb; + u8 reuse; +#endif + + uint len; + u8 *phead; + u8 *pdata; + u8 *ptail; + u8 *pend; + + u8 *pbuf; + u8 *pallocated_buf; + +}; + + +/* + head -----> + + data -----> + + payload + + tail -----> + + + end -----> + + len = (unsigned int )(tail - data); + +*/ +struct recv_frame_hdr{ + + _list list; + _pkt *pkt; + _pkt *pkt_newalloc; + + _adapter *adapter; + + u8 fragcnt; + + int frame_tag; + + struct rx_pkt_attrib attrib; + + uint len; + u8 *rx_head; + u8 *rx_data; + u8 *rx_tail; + u8 *rx_end; + + void *precvbuf; + + + // + struct sta_info *psta; + + //for A-MPDU Rx reordering buffer control + struct recv_reorder_ctrl *preorder_ctrl; + +}; + + +union recv_frame{ + + union{ + _list list; + struct recv_frame_hdr hdr; + uint mem[RECVFRAME_HDR_ALIGN>>2]; + }u; + + //uint mem[MAX_RXSZ>>2]; + +}; + + +extern union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue); //get a free recv_frame from pfree_recv_queue +extern void rtw_init_recvframe(union recv_frame *precvframe ,struct recv_priv *precvpriv); +extern int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue); +extern union recv_frame *rtw_dequeue_recvframe (_queue *queue); +extern int rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue); +extern void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue); + +sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue); +struct recv_buf *rtw_dequeue_recvbuf (_queue *queue); + +void rtw_reordering_ctrl_timeout_handler(void *pcontext); + +__inline static u8 *get_rxmem(union recv_frame *precvframe) +{ + //always return rx_head... + if(precvframe==NULL) + return NULL; + + return precvframe->u.hdr.rx_head; +} + +__inline static u8 *get_rx_status(union recv_frame *precvframe) +{ + + return get_rxmem(precvframe); + +} + +__inline static u8 *get_recvframe_data(union recv_frame *precvframe) +{ + + //alwasy return rx_data + if(precvframe==NULL) + return NULL; + + return precvframe->u.hdr.rx_data; + +} + +__inline static u8 *recvframe_push(union recv_frame *precvframe, sint sz) +{ + // append data before rx_data + + /* add data to the start of recv_frame + * + * This function extends the used data area of the recv_frame at the buffer + * start. rx_data must be still larger than rx_head, after pushing. + */ + + if(precvframe==NULL) + return NULL; + + + precvframe->u.hdr.rx_data -= sz ; + if( precvframe->u.hdr.rx_data < precvframe->u.hdr.rx_head ) + { + precvframe->u.hdr.rx_data += sz ; + return NULL; + } + + precvframe->u.hdr.len +=sz; + + return precvframe->u.hdr.rx_data; + +} + + +__inline static u8 *recvframe_pull(union recv_frame *precvframe, sint sz) +{ + // rx_data += sz; move rx_data sz bytes hereafter + + //used for extract sz bytes from rx_data, update rx_data and return the updated rx_data to the caller + + + if(precvframe==NULL) + return NULL; + + + precvframe->u.hdr.rx_data += sz; + + if(precvframe->u.hdr.rx_data > precvframe->u.hdr.rx_tail) + { + precvframe->u.hdr.rx_data -= sz; + return NULL; + } + + precvframe->u.hdr.len -=sz; + + return precvframe->u.hdr.rx_data; + +} + +__inline static u8 *recvframe_put(union recv_frame *precvframe, sint sz) +{ + // rx_tai += sz; move rx_tail sz bytes hereafter + + //used for append sz bytes from ptr to rx_tail, update rx_tail and return the updated rx_tail to the caller + //after putting, rx_tail must be still larger than rx_end. + unsigned char * prev_rx_tail; + + if(precvframe==NULL) + return NULL; + + prev_rx_tail = precvframe->u.hdr.rx_tail; + + precvframe->u.hdr.rx_tail += sz; + + if(precvframe->u.hdr.rx_tail > precvframe->u.hdr.rx_end) + { + precvframe->u.hdr.rx_tail -= sz; + return NULL; + } + + precvframe->u.hdr.len +=sz; + + return precvframe->u.hdr.rx_tail; + +} + + + +__inline static u8 *recvframe_pull_tail(union recv_frame *precvframe, sint sz) +{ + // rmv data from rx_tail (by yitsen) + + //used for extract sz bytes from rx_end, update rx_end and return the updated rx_end to the caller + //after pulling, rx_end must be still larger than rx_data. + + if(precvframe==NULL) + return NULL; + + precvframe->u.hdr.rx_tail -= sz; + + if(precvframe->u.hdr.rx_tail < precvframe->u.hdr.rx_data) + { + precvframe->u.hdr.rx_tail += sz; + return NULL; + } + + precvframe->u.hdr.len -=sz; + + return precvframe->u.hdr.rx_tail; + +} + + + +__inline static _buffer * get_rxbuf_desc(union recv_frame *precvframe) +{ + _buffer * buf_desc; + + if(precvframe==NULL) + return NULL; +#ifdef PLATFORM_WINDOWS + NdisQueryPacket(precvframe->u.hdr.pkt, NULL, NULL, &buf_desc, NULL); +#endif + + return buf_desc; +} + + +__inline static union recv_frame *rxmem_to_recvframe(u8 *rxmem) +{ + //due to the design of 2048 bytes alignment of recv_frame, we can reference the union recv_frame + //from any given member of recv_frame. + // rxmem indicates the any member/address in recv_frame + + return (union recv_frame*)(((uint)rxmem>>RXFRAME_ALIGN) <u.hdr.rx_head; + +} + +__inline static u8 *pkt_to_recvdata(_pkt *pkt) +{ + // return the rx_data + + union recv_frame * precv_frame =pkt_to_recvframe(pkt); + + return precv_frame->u.hdr.rx_data; + +} + + +__inline static sint get_recvframe_len(union recv_frame *precvframe) +{ + return precvframe->u.hdr.len; +} + +__inline static u8 query_rx_pwr_percentage(s8 antpower ) +{ + if ((antpower <= -100) || (antpower >= 20)) + { + return 0; + } + else if (antpower >= 0) + { + return 100; + } + else + { + return (100+antpower); + } +} +__inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex) +{ + s32 SignalPower; // in dBm. + + // Translate to dBm (x=0.5y-95). + SignalPower = (s32)((SignalStrengthIndex + 1) >> 1); + SignalPower -= 95; + + return SignalPower; +} + + +struct sta_info; + +extern void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv); + +extern void mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame); + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_rf.h b/drivers/net/wireless/rtl8192c/include/rtw_rf.h new file mode 100755 index 000000000000..0e9298e9431e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_rf.h @@ -0,0 +1,144 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_RF_H_ +#define __RTW_RF_H_ + +#include +#include + +#define OFDM_PHY 1 +#define MIXED_PHY 2 +#define CCK_PHY 3 + +#define NumRates (13) + +// slot time for 11g +#define SHORT_SLOT_TIME 9 +#define NON_SHORT_SLOT_TIME 20 + +#define RTL8711_RF_MAX_SENS 6 +#define RTL8711_RF_DEF_SENS 4 + +// +// We now define the following channels as the max channels in each channel plan. +// 2G, total 14 chnls +// {1,2,3,4,5,6,7,8,9,10,11,12,13,14} +// 5G, total 24 chnls +// {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165} +#define MAX_CHANNEL_NUM 38//14+24 + +//#define NUM_REGULATORYS 21 +#define NUM_REGULATORYS 1 + +//Country codes +#define USA 0x555320 +#define EUROPE 0x1 //temp, should be provided later +#define JAPAN 0x2 //temp, should be provided later + +struct regulatory_class { + u32 starting_freq; //MHz, + u8 channel_set[MAX_CHANNEL_NUM]; + u8 channel_cck_power[MAX_CHANNEL_NUM];//dbm + u8 channel_ofdm_power[MAX_CHANNEL_NUM];//dbm + u8 txpower_limit; //dbm + u8 channel_spacing; //MHz + u8 modem; +}; + +typedef enum _CAPABILITY{ + cESS = 0x0001, + cIBSS = 0x0002, + cPollable = 0x0004, + cPollReq = 0x0008, + cPrivacy = 0x0010, + cShortPreamble = 0x0020, + cPBCC = 0x0040, + cChannelAgility = 0x0080, + cSpectrumMgnt = 0x0100, + cQos = 0x0200, // For HCCA, use with CF-Pollable and CF-PollReq + cShortSlotTime = 0x0400, + cAPSD = 0x0800, + cRM = 0x1000, // RRM (Radio Request Measurement) + cDSSS_OFDM = 0x2000, + cDelayedBA = 0x4000, + cImmediateBA = 0x8000, +}CAPABILITY, *PCAPABILITY; + +enum _REG_PREAMBLE_MODE{ + PREAMBLE_LONG = 1, + PREAMBLE_AUTO = 2, + PREAMBLE_SHORT = 3, +}; + + +enum _RTL8712_RF_MIMO_CONFIG_{ + RTL8712_RFCONFIG_1T=0x10, + RTL8712_RFCONFIG_2T=0x20, + RTL8712_RFCONFIG_1R=0x01, + RTL8712_RFCONFIG_2R=0x02, + RTL8712_RFCONFIG_1T1R=0x11, + RTL8712_RFCONFIG_1T2R=0x12, + RTL8712_RFCONFIG_TURBO=0x92, + RTL8712_RFCONFIG_2T2R=0x22 +}; + + +// Bandwidth Offset +#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 +#define HAL_PRIME_CHNL_OFFSET_LOWER 1 +#define HAL_PRIME_CHNL_OFFSET_UPPER 2 + +// Represent Channel Width in HT Capabilities +// +typedef enum _HT_CHANNEL_WIDTH { + HT_CHANNEL_WIDTH_20 = 0, + HT_CHANNEL_WIDTH_40 = 1, +}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH; + +// +// Represent Extention Channel Offset in HT Capabilities +// This is available only in 40Mhz mode. +// +typedef enum _HT_EXTCHNL_OFFSET{ + HT_EXTCHNL_OFFSET_NO_EXT = 0, + HT_EXTCHNL_OFFSET_UPPER = 1, + HT_EXTCHNL_OFFSET_NO_DEF = 2, + HT_EXTCHNL_OFFSET_LOWER = 3, +}HT_EXTCHNL_OFFSET, *PHT_EXTCHNL_OFFSET; + +/* 2007/11/15 MH Define different RF type. */ +typedef enum _RT_RF_TYPE_DEFINITION +{ + RF_1T2R = 0, + RF_2T4R = 1, + RF_2T2R = 2, + RF_1T1R = 3, + RF_2T2R_GREEN = 4, + RF_819X_MAX_TYPE = 5, +}RT_RF_TYPE_DEF_E; + + +u32 rtw_ch2freq(u32 ch); +u32 rtw_freq2ch(u32 freq); + + +#endif //_RTL8711_RF_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_security.h b/drivers/net/wireless/rtl8192c/include/rtw_security.h new file mode 100755 index 000000000000..02ef9b011b45 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_security.h @@ -0,0 +1,423 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __RTW_SECURITY_H_ +#define __RTW_SECURITY_H_ + + +#include +#include +#include + + +#define _NO_PRIVACY_ 0x0 +#define _WEP40_ 0x1 +#define _TKIP_ 0x2 +#define _TKIP_WTMIC_ 0x3 +#define _AES_ 0x4 +#define _WEP104_ 0x5 + +#define _WPA_IE_ID_ 0xdd +#define _WPA2_IE_ID_ 0x30 + +#define SHA256_MAC_LEN 32 +#define AES_BLOCK_SIZE 16 +#define AES_PRIV_SIZE (4 * 44) + +#ifndef Ndis802_11AuthModeWPA2 +#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1) +#endif + +#ifndef Ndis802_11AuthModeWPA2PSK +#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2) +#endif + +union pn48 { + + u64 val; + +#ifdef CONFIG_LITTLE_ENDIAN + +struct { + u8 TSC0; + u8 TSC1; + u8 TSC2; + u8 TSC3; + u8 TSC4; + u8 TSC5; + u8 TSC6; + u8 TSC7; +} _byte_; + +#elif defined(CONFIG_BIG_ENDIAN) + +struct { + u8 TSC7; + u8 TSC6; + u8 TSC5; + u8 TSC4; + u8 TSC3; + u8 TSC2; + u8 TSC1; + u8 TSC0; +} _byte_; + +#endif + +}; + +union Keytype { + u8 skey[16]; + u32 lkey[4]; +}; + + +typedef struct _RT_PMKID_LIST +{ + u8 bUsed; + u8 Bssid[6]; + u8 PMKID[16]; + u8 SsidBuf[33]; + u8* ssid_octet; + u16 ssid_length; +} RT_PMKID_LIST, *PRT_PMKID_LIST; + + +struct security_priv +{ + u32 dot11AuthAlgrthm; // 802.11 auth, could be open, shared, 8021x and authswitch + u32 dot11PrivacyAlgrthm; // This specify the privacy for shared auth. algorithm. + + /* WEP */ + u32 dot11PrivacyKeyIndex; // this is only valid for legendary wep, 0~3 for key id. (tx key index) + union Keytype dot11DefKey[4]; // this is only valid for def. key + u32 dot11DefKeylen[4]; + + u32 dot118021XGrpPrivacy; // This specify the privacy algthm. used for Grp key + u32 dot118021XGrpKeyid; // key id used for Grp Key ( tx key index) + union Keytype dot118021XGrpKey[4]; // 802.1x Group Key, for inx0 and inx1 + union Keytype dot118021XGrptxmickey[4]; + union Keytype dot118021XGrprxmickey[4]; + union pn48 dot11Grptxpn; // PN48 used for Grp Key xmit. + union pn48 dot11Grprxpn; // PN48 used for Grp Key recv. + +#ifdef CONFIG_AP_MODE + //extend security capabilities for AP_MODE + unsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x + unsigned int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 + unsigned int wpa_group_cipher; + unsigned int wpa2_group_cipher; + unsigned int wpa_pairwise_cipher; + unsigned int wpa2_pairwise_cipher; +#endif + + u8 wps_phase;//for wps + u8 wps_ie[MAX_WPS_IE_LEN];//added in assoc req + int wps_ie_len; + + + u8 binstallGrpkey; + u8 busetkipkey; + //_timer tkip_timer; + u8 bcheck_grpkey; + u8 bgrpkey_handshake; + + //u8 packet_cnt;//unused, removed + + s32 sw_encrypt;//from registry_priv + s32 sw_decrypt;//from registry_priv + + s32 hw_decrypted;//if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready. + + + //keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc) + u32 ndisauthtype; // NDIS_802_11_AUTHENTICATION_MODE + u32 ndisencryptstatus; // NDIS_802_11_ENCRYPTION_STATUS + + WLAN_BSSID_EX sec_bss; //for joinbss (h2c buffer) usage + + NDIS_802_11_WEP ndiswep; +#ifdef PLATFORM_WINDOWS + u8 KeyMaterial[16];// variable length depending on above field. +#endif + + u8 assoc_info[600]; + u8 szofcapability[256]; //for wpa2 usage + u8 oidassociation[512]; //for wpa/wpa2 usage + u8 authenticator_ie[256]; //store ap security information element + u8 supplicant_ie[256]; //store sta security information element + + + //for tkip countermeasure + u32 last_mic_err_time; + u8 btkip_countermeasure; + u8 btkip_wait_report; + u32 btkip_countermeasure_time; + + //--------------------------------------------------------------------------- + // For WPA2 Pre-Authentication. + //--------------------------------------------------------------------------- + //u8 RegEnablePreAuth; // Default value: Pre-Authentication enabled or not, from registry "EnablePreAuth". Added by Annie, 2005-11-01. + //u8 EnablePreAuthentication; // Current Value: Pre-Authentication enabled or not. + RT_PMKID_LIST PMKIDList[NUM_PMKID_CACHE]; // Renamed from PreAuthKey[NUM_PRE_AUTH_KEY]. Annie, 2006-10-13. + u8 PMKIDIndex; + //u32 PMKIDCount; // Added by Annie, 2006-10-13. + //u8 szCapability[256]; // For WPA2-PSK using zero-config, by Annie, 2005-09-20. + +}; + +struct sha256_state { + u64 length; + u32 state[8], curlen; + u8 buf[64]; +}; + +#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\ +do{\ + switch(psecuritypriv->dot11AuthAlgrthm)\ + {\ + case dot11AuthAlgrthm_Open:\ + case dot11AuthAlgrthm_Shared:\ + case dot11AuthAlgrthm_Auto:\ + encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\ + break;\ + case dot11AuthAlgrthm_8021X:\ + if(bmcst)\ + encry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\ + else\ + encry_algo =(u8) psta->dot118021XPrivacy;\ + break;\ + }\ +}while(0) + + +#define SET_ICE_IV_LEN( iv_len, icv_len, encrypt)\ +do{\ + switch(encrypt)\ + {\ + case _WEP40_:\ + case _WEP104_:\ + iv_len = 4;\ + icv_len = 4;\ + break;\ + case _TKIP_:\ + iv_len = 8;\ + icv_len = 4;\ + break;\ + case _AES_:\ + iv_len = 8;\ + icv_len = 8;\ + break;\ + default:\ + iv_len = 0;\ + icv_len = 0;\ + break;\ + }\ +}while(0) + + +#define GET_TKIP_PN(iv,dot11txpn)\ +do{\ + dot11txpn._byte_.TSC0=iv[2];\ + dot11txpn._byte_.TSC1=iv[0];\ + dot11txpn._byte_.TSC2=iv[4];\ + dot11txpn._byte_.TSC3=iv[5];\ + dot11txpn._byte_.TSC4=iv[6];\ + dot11txpn._byte_.TSC5=iv[7];\ +}while(0) + + +#define ROL32( A, n ) ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) +#define ROR32( A, n ) ROL32( (A), 32-(n) ) + +struct mic_data +{ + u32 K0, K1; // Key + u32 L, R; // Current state + u32 M; // Message accumulator (single word) + u32 nBytesInM; // # bytes in M +}; + +extern const u32 Te0[256]; +extern const u32 Te1[256]; +extern const u32 Te2[256]; +extern const u32 Te3[256]; +extern const u32 Te4[256]; +extern const u32 Td0[256]; +extern const u32 Td1[256]; +extern const u32 Td2[256]; +extern const u32 Td3[256]; +extern const u32 Td4[256]; +extern const u32 rcon[10]; +extern const u8 Td4s[256]; +extern const u8 rcons[10]; + +#define RCON(i) (rcons[(i)] << 24) + +static inline u32 rotr(u32 val, int bits) +{ + return (val >> bits) | (val << (32 - bits)); +} + +#define TE0(i) Te0[((i) >> 24) & 0xff] +#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8) +#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16) +#define TE3(i) rotr(Te0[(i) & 0xff], 24) +#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000) +#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000) +#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00) +#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff) +#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000) +#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000) +#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00) +#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff) +#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff) + +#define TD0(i) Td0[((i) >> 24) & 0xff] +#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8) +#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16) +#define TD3(i) rotr(Td0[(i) & 0xff], 24) +#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24) +#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16) +#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8) +#define TD44(i) (Td4s[(i) & 0xff]) +#define TD0_(i) Td0[(i) & 0xff] +#define TD1_(i) rotr(Td0[(i) & 0xff], 8) +#define TD2_(i) rotr(Td0[(i) & 0xff], 16) +#define TD3_(i) rotr(Td0[(i) & 0xff], 24) + +#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \ + ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) + +#define PUTU32(ct, st) { \ +(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \ +(ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } + +#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ + (((u32) (a)[2]) << 8) | ((u32) (a)[3])) + +#define WPA_PUT_LE16(a, val) \ + do { \ + (a)[1] = ((u16) (val)) >> 8; \ + (a)[0] = ((u16) (val)) & 0xff; \ + } while (0) + +#define WPA_PUT_BE32(a, val) \ + do { \ + (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ + (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ + (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ + (a)[3] = (u8) (((u32) (val)) & 0xff); \ + } while (0) + +#define WPA_PUT_BE64(a, val) \ + do { \ + (a)[0] = (u8) (((u64) (val)) >> 56); \ + (a)[1] = (u8) (((u64) (val)) >> 48); \ + (a)[2] = (u8) (((u64) (val)) >> 40); \ + (a)[3] = (u8) (((u64) (val)) >> 32); \ + (a)[4] = (u8) (((u64) (val)) >> 24); \ + (a)[5] = (u8) (((u64) (val)) >> 16); \ + (a)[6] = (u8) (((u64) (val)) >> 8); \ + (a)[7] = (u8) (((u64) (val)) & 0xff); \ + } while (0) + +/* ===== start - public domain SHA256 implementation ===== */ + +/* This is based on SHA256 implementation in LibTomCrypt that was released into + * public domain by Tom St Denis. */ + +/* the K array */ +static const unsigned long K[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; + + +/* Various logical functions */ +#define RORc(x, y) \ +( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \ + ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL) +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) RORc((x), (n)) +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) +#ifndef MIN +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#endif + +void rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key ); +void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b ); +void rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes ); +void rtw_secgetmic(struct mic_data *pmicdata, u8 * dst ); + +void rtw_seccalctkipmic( + u8 * key, + u8 *header, + u8 *data, + u32 data_len, + u8 *Miccode, + u8 priority); + +u32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe); +u32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe); +void rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe); + +u32 rtw_aes_decrypt(_adapter *padapter, u8 *precvframe); +u32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe); +void rtw_wep_decrypt(_adapter *padapter, u8 *precvframe); + +#ifdef CONFIG_TDLS +void wpa_tdls_generate_tpk(_adapter *padapter, struct sta_info *psta); +int wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie, + u8 *mic); +int tdls_verify_mic(u8 *kck, u8 trans_seq, + u8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie); +#endif + +#ifdef PLATFORM_WINDOWS +void rtw_use_tkipkey_handler ( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); +#endif +#ifdef PLATFORM_LINUX +void rtw_use_tkipkey_handler(void* FunctionContext); +#endif +#endif //__RTL871X_SECURITY_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/rtw_version.h b/drivers/net/wireless/rtl8192c/include/rtw_version.h new file mode 100644 index 000000000000..724d58b97ce5 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_version.h @@ -0,0 +1 @@ +#define DRIVERVERSION "v3.2.2470.20110907" diff --git a/drivers/net/wireless/rtl8192c/include/rtw_xmit.h b/drivers/net/wireless/rtl8192c/include/rtw_xmit.h new file mode 100755 index 000000000000..51ebfcec6b03 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/rtw_xmit.h @@ -0,0 +1,657 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _RTW_XMIT_H_ +#define _RTW_XMIT_H_ + +#include +#include +#include +#include + +#ifdef CONFIG_SDIO_HCI +#define MAX_XMITBUF_SZ (30720)// (2048) +#define NR_XMITBUFF (16) + +#elif defined (CONFIG_USB_HCI) +#ifdef CONFIG_USB_TX_AGGREGATION +#define MAX_XMITBUF_SZ 20480 // 20k +#else +#define MAX_XMITBUF_SZ (2048) +#endif + +#define NR_XMITBUFF (4) + +#elif defined (CONFIG_PCI_HCI) +#define MAX_XMITBUF_SZ (1664) +#define NR_XMITBUFF (128) +#endif + +#ifdef PLATFORM_OS_CE +#define XMITBUF_ALIGN_SZ 4 +#else +#ifdef CONFIG_PCI_HCI +#define XMITBUF_ALIGN_SZ 4 +#else +#define XMITBUF_ALIGN_SZ 512 +#endif +#endif + +// xmit extension buff defination +#define MAX_XMIT_EXTBUF_SZ (2048) + +#define NR_XMIT_EXTBUFF (4) + +#define MAX_NUMBLKS (1) + +#define XMIT_VO_QUEUE (0) +#define XMIT_VI_QUEUE (1) +#define XMIT_BE_QUEUE (2) +#define XMIT_BK_QUEUE (3) + +#ifdef CONFIG_PCI_HCI +#define TXDESC_NUM 64 +//#define TXDESC_NUM 128 +#define TXDESC_NUM_BE_QUEUE 128 +#endif + +#define WEP_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC0;\ + pattrib_iv[1] = dot11txpn._byte_.TSC1;\ + pattrib_iv[2] = dot11txpn._byte_.TSC2;\ + pattrib_iv[3] = ((keyidx & 0x3)<<6);\ + dot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\ +}while(0) + + +#define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC1;\ + pattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\ + pattrib_iv[2] = dot11txpn._byte_.TSC0;\ + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ + pattrib_iv[4] = dot11txpn._byte_.TSC2;\ + pattrib_iv[5] = dot11txpn._byte_.TSC3;\ + pattrib_iv[6] = dot11txpn._byte_.TSC4;\ + pattrib_iv[7] = dot11txpn._byte_.TSC5;\ + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ +}while(0) + +#define AES_IV(pattrib_iv, dot11txpn, keyidx)\ +do{\ + pattrib_iv[0] = dot11txpn._byte_.TSC0;\ + pattrib_iv[1] = dot11txpn._byte_.TSC1;\ + pattrib_iv[2] = 0;\ + pattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\ + pattrib_iv[4] = dot11txpn._byte_.TSC2;\ + pattrib_iv[5] = dot11txpn._byte_.TSC3;\ + pattrib_iv[6] = dot11txpn._byte_.TSC4;\ + pattrib_iv[7] = dot11txpn._byte_.TSC5;\ + dot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\ +}while(0) + + +#define HWXMIT_ENTRY 4 + +#define TXDESC_SIZE 32 +#define PACKET_OFFSET_SZ (8) + +#ifdef CONFIG_USB_HCI +#define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ) +#endif + +#ifdef CONFIG_PCI_HCI +#define TXDESC_OFFSET 0 +#define TX_DESC_NEXT_DESC_OFFSET 40 +#endif + +// +//defined for TX DESC Operation +// + +#define MAX_TID (15) + +//OFFSET 0 +#define OFFSET_SZ 0 +#define OFFSET_SHT 16 +#define BMC BIT(24) +#define LSG BIT(26) +#define FSG BIT(27) +#define OWN BIT(31) + +//OFFSET 4 +#define PKT_OFFSET_SZ 0 +#define BK BIT(6) +#define QSEL_SHT 8 +#define Rate_ID_SHT 16 +#define NAVUSEHDR BIT(20) +#define PKT_OFFSET_SHT 26 +#define HWPC BIT(31) + +//OFFSET 8 +#define AGG_EN BIT(29) + +//OFFSET 12 +#define SEQ_SHT 16 + +//OFFSET 16 +#define QoS BIT(6) +#define HW_SEQ_EN BIT(7) +#define USERATE BIT(8) +#define DISDATAFB BIT(10) +#define DATA_SHORT BIT(24) +#define DATA_BW BIT(25) + +//OFFSET 20 +#define SGI BIT(6) + +struct tx_desc{ + + //DWORD 0 + unsigned int txdw0; + + unsigned int txdw1; + + unsigned int txdw2; + + unsigned int txdw3; + + unsigned int txdw4; + + unsigned int txdw5; + + unsigned int txdw6; + + unsigned int txdw7; +#ifdef CONFIG_PCI_HCI + unsigned int txdw8; + + unsigned int txdw9; + + unsigned int txdw10; + + unsigned int txdw11; + + // 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now, our descriptor + // size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute + // memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor + // number or enlarge descriptor size as 64 bytes. + unsigned int txdw12; + + unsigned int txdw13; + + unsigned int txdw14; + + unsigned int txdw15; +#endif +}; + + +union txdesc { + struct tx_desc txdesc; + unsigned int value[TXDESC_SIZE>>2]; +}; + +#ifdef CONFIG_PCI_HCI +#define PCI_MAX_TX_QUEUE_COUNT 8 + +struct rtw_tx_ring { + struct tx_desc *desc; + dma_addr_t dma; + unsigned int idx; + unsigned int entries; + _queue queue; + u32 qlen; +}; +#endif + +struct hw_xmit { + //_lock xmit_lock; + //_list pending; + _queue *sta_queue; + //struct hw_txqueue *phwtxqueue; + //sint txcmdcnt; + int accnt; +}; + +#if 0 +struct pkt_attrib +{ + u8 type; + u8 subtype; + u8 bswenc; + u8 dhcp_pkt; + u16 ether_type; + int pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) + int pkt_hdrlen; //the original 802.3 pkt header len + int hdrlen; //the WLAN Header Len + int nr_frags; + int last_txcmdsz; + int encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith + u8 iv[8]; + int iv_len; + u8 icv[8]; + int icv_len; + int priority; + int ack_policy; + int mac_id; + int vcs_mode; //virtual carrier sense method + + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; + u8 ta[ETH_ALEN]; + u8 ra[ETH_ALEN]; + + u8 key_idx; + + u8 qos_en; + u8 ht_en; + u8 raid;//rate adpative id + u8 bwmode; + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + u8 ampdu_en;//tx ampdu enable + u8 mdata;//more data bit + u8 eosp; + + u8 pctrl;//per packet txdesc control enable + u8 triggered;//for ap mode handling Power Saving sta + + u32 qsel; + u16 seqnum; + + struct sta_info * psta; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + u8 hw_tcp_csum; +#endif +}; +#else +//reduce size +struct pkt_attrib +{ + u8 type; + u8 subtype; + u8 bswenc; + u8 dhcp_pkt; + u16 ether_type; + u16 seqnum; + u16 pkt_hdrlen; //the original 802.3 pkt header len + u16 hdrlen; //the WLAN Header Len + u32 pktlen; //the original 802.3 pkt raw_data len (not include ether_hdr data) + u32 last_txcmdsz; + u8 nr_frags; + u8 encrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith + u8 iv_len; + u8 icv_len; + u8 iv[8]; + u8 icv[8]; + u8 priority; + u8 ack_policy; + u8 mac_id; + u8 vcs_mode; //virtual carrier sense method + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; + u8 ta[ETH_ALEN]; + u8 ra[ETH_ALEN]; + u8 key_idx; + u8 qos_en; + u8 ht_en; + u8 raid;//rate adpative id + u8 bwmode; + u8 ch_offset;//PRIME_CHNL_OFFSET + u8 sgi;//short GI + u8 ampdu_en;//tx ampdu enable + u8 mdata;//more data bit + u8 pctrl;//per packet txdesc control enable + u8 triggered;//for ap mode handling Power Saving sta + u8 qsel; + u8 eosp; + + struct sta_info * psta; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + u8 hw_tcp_csum; +#endif +}; +#endif + + +#define WLANHDR_OFFSET 64 + +#define NULL_FRAMETAG (0x0) +#define DATA_FRAMETAG 0x01 +#define L2_FRAMETAG 0x02 +#define MGNT_FRAMETAG 0x03 +#define AMSDU_FRAMETAG 0x04 + +#define EII_FRAMETAG 0x05 +#define IEEE8023_FRAMETAG 0x06 + +#define MP_FRAMETAG 0x07 + +#define TXAGG_FRAMETAG 0x08 + + +struct xmit_buf +{ + _list list; + + _adapter *padapter; + + u8 *pallocated_buf; + + u8 *pbuf; + + void *priv_data; + + u16 ext_tag; // 0: Normal xmitbuf, 1: extension xmitbuf. + u16 flags; + u32 alloc_sz; + +#ifdef CONFIG_USB_HCI + + u32 sz[8]; + +#if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) + PURB pxmit_urb[8]; + dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ +#endif + +#ifdef PLATFORM_OS_XP + PIRP pxmit_irp[8]; +#endif + +#ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_write_port; +#endif + + u8 bpending[8]; + + sint last[8]; + +#endif + +#ifdef CONFIG_SDIO_HCI + u32 len; + u8 *phead; + u8 *pdata; + u8 *ptail; + u8 *pend; + u32 ff_hwaddr; +#ifdef PLATFORM_OS_XP + PMDL pxmitbuf_mdl; + PIRP pxmitbuf_irp; + PSDBUS_REQUEST_PACKET pxmitbuf_sdrp; +#endif +#endif + +#ifdef CONFIG_PCI_HCI + u32 len; +#endif + +#ifdef DBG_XMIT_BUF + u8 no; +#endif + +}; + +struct xmit_frame +{ + _list list; + + struct pkt_attrib attrib; + + _pkt *pkt; + + int frame_tag; + + _adapter *padapter; + + u8 *buf_addr; + + struct xmit_buf *pxmitbuf; + +#ifdef CONFIG_SDIO_HCI + u8 pg_num; +#endif + +#ifdef CONFIG_USB_HCI +#ifdef CONFIG_USB_TX_AGGREGATION + u8 agg_num; +#endif + u8 pkt_offset; +#ifdef CONFIG_RTL8192D + u8 EMPktNum; + u16 EMPktLen[5];//The max value by HW +#endif +#endif +}; + +struct tx_servq { + _list tx_pending; + _queue sta_pending; + int qcnt; +}; + + + +struct sta_xmit_priv +{ + _lock lock; + sint option; + sint apsd_setting; //When bit mask is on, the associated edca queue supports APSD. + + + //struct tx_servq blk_q[MAX_NUMBLKS]; + struct tx_servq be_q; //priority == 0,3 + struct tx_servq bk_q; //priority == 1,2 + struct tx_servq vi_q; //priority == 4,5 + struct tx_servq vo_q; //priority == 6,7 + _list legacy_dz; + _list apsd; + + u16 txseq_tid[16]; + + //uint sta_tx_bytes; + //u64 sta_tx_pkts; + //uint sta_tx_fail; + +}; + + +struct hw_txqueue { + volatile sint head; + volatile sint tail; + volatile sint free_sz; //in units of 64 bytes + volatile sint free_cmdsz; + volatile sint txsz[8]; + uint ff_hwaddr; + uint cmd_hwaddr; + sint ac_tag; +}; + + +struct xmit_priv { + + _lock lock; + + _sema xmit_sema; + _sema terminate_xmitthread_sema; + + //_queue blk_strms[MAX_NUMBLKS]; + _queue be_pending; + _queue bk_pending; + _queue vi_pending; + _queue vo_pending; + _queue bm_pending; + + //_queue legacy_dz_queue; + //_queue apsd_queue; + + u8 *pallocated_frame_buf; + u8 *pxmit_frame_buf; + uint free_xmitframe_cnt; + + //uint mapping_addr; + //uint pkt_sz; + + _queue free_xmit_queue; + + //struct hw_txqueue be_txqueue; + //struct hw_txqueue bk_txqueue; + //struct hw_txqueue vi_txqueue; + //struct hw_txqueue vo_txqueue; + //struct hw_txqueue bmc_txqueue; + + uint frag_len; + + _adapter *adapter; + + u8 vcs_setting; + u8 vcs; + u8 vcs_type; + //u16 rts_thresh; + + u64 tx_bytes; + u64 tx_pkts; + u64 tx_drop; + u64 last_tx_bytes; + u64 last_tx_pkts; + + struct hw_xmit *hwxmits; + u8 hwxmit_entry; + +#ifdef CONFIG_USB_HCI + _sema tx_retevt;//all tx return event; + u8 txirp_cnt;// + +#ifdef PLATFORM_OS_CE + USB_TRANSFER usb_transfer_write_port; +// USB_TRANSFER usb_transfer_write_mem; +#endif +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#endif + //per AC pending irp + int beq_cnt; + int bkq_cnt; + int viq_cnt; + int voq_cnt; + +#endif + +#ifdef CONFIG_SDIO_HCI + u8 free_pg[8]; + u8 public_pgsz; + u8 required_pgsz; + u8 used_pgsz; + u8 init_pgsz; +#ifdef PLATFORM_OS_XP + PMDL prd_freesz_mdl[2]; + u8 brd_freesz_pending[2]; + PIRP prd_freesz_irp[2]; + PSDBUS_REQUEST_PACKET prd_freesz_sdrp[2]; + u8 rd_freesz_irp_idx; +#endif + +#endif + +#ifdef CONFIG_PCI_HCI + // Tx + struct rtw_tx_ring tx_ring[PCI_MAX_TX_QUEUE_COUNT]; + int txringcount[PCI_MAX_TX_QUEUE_COUNT]; +#ifdef PLATFORM_LINUX + struct tasklet_struct xmit_tasklet; +#endif +#endif + + _queue free_xmitbuf_queue; + _queue pending_xmitbuf_queue; // unused?? + u8 *pallocated_xmitbuf; + u8 *pxmitbuf; + uint free_xmitbuf_cnt; + + _queue free_xmit_extbuf_queue; + u8 *pallocated_xmit_extbuf; + u8 *pxmit_extbuf; + uint free_xmit_extbuf_cnt; + + u16 nqos_ssn; + ATOMIC_T HwRdyXmitData; // driver should wait hw setting done for join event callback, only for Data Frame. 1:done 0:not yet. +}; + +extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +extern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf); + +void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz); +extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len); +extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib); +extern s32 rtw_put_snap(u8 *data, u16 h_proto); + +extern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv); +extern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); +extern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue); +struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac); +extern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe); +extern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry); + +extern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe); +extern thread_return rtw_xmit_thread(thread_context context); +extern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe); +#ifdef CONFIG_TDLS +extern void fill_tdls_dis_rsp_frbody(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe); +extern s32 xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, u8 action); +void rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif +s32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag); +void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv); + + +s32 rtw_txframes_pending(_adapter *padapter); +s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib); +void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry); + + +s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter); +void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv); + + +void rtw_alloc_hwxmits(_adapter *padapter); +void rtw_free_hwxmits(_adapter *padapter); + +s32 rtw_free_xmitframe_ex(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe); + +s32 rtw_xmit(_adapter *padapter, _pkt *pkt); + +#ifdef CONFIG_TDLS +sint xmit_tdls_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe); +#endif + +#ifdef CONFIG_AP_MODE +sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe); +void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta); +void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta); +#endif + +#endif //_RTL871X_XMIT_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_hal.h b/drivers/net/wireless/rtl8192c/include/sdio_hal.h new file mode 100755 index 000000000000..51139bb30f5c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_hal.h @@ -0,0 +1,34 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __SDIO_HAL_H__ + +#define __SDIO_HAL_H__ + +extern u8 sd_hal_bus_init(_adapter * adapter); +extern u8 sd_hal_bus_deinit(_adapter * adapter); + + +u8 sd_int_isr (IN PADAPTER padapter); +void sd_int_dpc(PADAPTER padapter); + + +#endif //__SDIO_HAL_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops.h b/drivers/net/wireless/rtl8192c/include/sdio_ops.h new file mode 100755 index 000000000000..b1e9b63e4d5e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops.h @@ -0,0 +1,80 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __SDIO_OPS_H_ +#define __SDIO_OPS_H_ + +#include +#include +#include +#include + +#ifdef PLATFORM_LINUX +#include +#endif + + + +#ifdef PLATFORM_WINDOWS + +#ifdef PLATFORM_OS_XP +#include +struct async_context +{ + PMDL pmdl; + PSDBUS_REQUEST_PACKET sdrp; + unsigned char* r_buf; + unsigned char* padapter; +}; +#endif +#ifdef PLATFORM_OS_CE +#include +#endif +#endif + + + +extern void sdio_set_intf_option(u32 *poption); + +extern void sdio_set_intf_funs(struct intf_hdl *pintf_hdl); + +extern uint sdio_init_intf_priv(struct intf_priv *pintfpriv); + +extern void sdio_unload_intf_priv(struct intf_priv *pintfpriv); + +extern void sdio_intf_hdl_init(u8 *priv); + +extern void sdio_intf_hdl_unload(u8 *priv); + +extern void sdio_intf_hdl_open(u8 *priv); + +extern void sdio_intf_hdl_close(u8 *priv); + +extern void sdio_set_intf_ops(struct _io_ops *pops); + +//extern void sdio_set_intf_callbacks(struct _io_callbacks *pcallbacks); +extern void sdio_func1cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem); +extern void sdio_func1cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem); + +extern uint __inline _cvrt2ftaddr(const u32 addr, u32 *pftaddr) ; + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h new file mode 100755 index 000000000000..6b0c1a29f3ee --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops_ce.h @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _SDIO_OPS_WINCE_H_ +#define _SDIO_OPS_WINCE_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_OS_CE + + +extern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8); + + +uint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + +extern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8); +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); + +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h new file mode 100755 index 000000000000..c58ab080c0f3 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops_linux.h @@ -0,0 +1,55 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _SDIO_OPS_LINUX_H_ +#define _SDIO_OPS_LINUX_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_LINUX + + +extern u8 sdbus_cmd52r(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w(struct intf_priv *pintfpriv, u32 addr,u8 val8); +extern u8 sdbus_direct_read8(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_direct_write8(struct intf_priv *pintfpriv, u32 addr, u8 val8); + +extern uint sdbus_read_bytes_to_recvbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern uint sdbus_read_blocks_to_recvbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_xmitbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_xmitbuf(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h b/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h new file mode 100755 index 000000000000..3569611a49e0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_ops_xp.h @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _SDIO_OPS_XP_H_ +#define _SDIO_OPS_XP_H_ + +#include +#include +#include +#include + + +#ifdef PLATFORM_OS_XP + + +extern u8 sdbus_cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); + + +extern void sdbus_cmd52w_xp(struct intf_priv *pintfpriv, u32 addr,u8 val8); + + +uint sdbus_read_blocks_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + +extern uint sdbus_read_bytes_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); + + +extern uint sdbus_write_blocks_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async); + +extern uint sdbus_write_bytes_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf); +extern u8 sdbus_func1cmd52r_xp(struct intf_priv *pintfpriv, u32 addr); +extern void sdbus_func1cmd52w_xp(struct intf_priv *pintfpriv, u32 addr, u8 val8); +extern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata); +extern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata); + +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sdio_osintf.h b/drivers/net/wireless/rtl8192c/include/sdio_osintf.h new file mode 100755 index 000000000000..099262b3e47d --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sdio_osintf.h @@ -0,0 +1,48 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __SDIO_OSINTF_H +#define __SDIO_OSINTF_H + + +#include +#include +#include + + +extern unsigned int sd_dvobj_init(_adapter * adapter); +extern void sd_dvobj_deinit(_adapter * adapter); + +void rtl871x_intf_stop(_adapter *padapter); + +u8 sd_hal_bus_init(_adapter * padapter); +u8 sd_hal_bus_deinit(_adapter * padapter); +void update_xmit_hw_res(_adapter * padapter); +void sd_c2h_hdl( PADAPTER padapter); + +#ifdef PLATFORM_OS_CE +extern NDIS_STATUS ce_sd_get_dev_hdl(_adapter *padapter ); +SD_API_STATUS +ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, _adapter* padapter); +extern void sd_setup_irs(_adapter *padapter); +#endif + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/sta_info.h b/drivers/net/wireless/rtl8192c/include/sta_info.h new file mode 100755 index 000000000000..1d3be99ef3c9 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/sta_info.h @@ -0,0 +1,294 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * +******************************************************************************/ +#ifndef __STA_INFO_H_ +#define __STA_INFO_H_ + +#include +#include +#include +#include + +#define IBSS_START_MAC_ID 2 +#define NUM_STA 32 +#define NUM_ACL 64 + + +//if mode ==0, then the sta is allowed once the addr is hit. +//if mode ==1, then the sta is rejected once the addr is non-hit. +struct rtw_wlan_acl_node { + _list list; + u8 addr[ETH_ALEN]; + u8 mode; +}; + +struct wlan_acl_pool { + struct rtw_wlan_acl_node aclnode[NUM_ACL]; +}; + +typedef struct _RSSI_STA{ + int UndecoratedSmoothedPWDB; + int UndecoratedSmoothedCCK; +}RSSI_STA, *PRSSI_STA; + +struct stainfo_stats { + + u64 rx_pkts; + u64 rx_bytes; + u64 rx_drops; + u64 last_rx_pkts; + + u64 tx_pkts; + u64 tx_bytes; + u64 tx_drops; + +}; + +#ifdef CONFIG_TDLS +struct TDLS_PeerKey { + u8 kck[16]; /* TPK-KCK */ + u8 tk[16]; /* TPK-TK; only CCMP will be used */ +} ; +#endif + +struct sta_info { + + _lock lock; + _list list; //free_sta_queue + _list hash_list; //sta_hash + //_list asoc_list; //20061114 + //_list sleep_list;//sleep_q + //_list wakeup_list;//wakeup_q + + struct sta_xmit_priv sta_xmitpriv; + struct sta_recv_priv sta_recvpriv; + + _queue sleep_q; + unsigned int sleepq_len; + + uint state; + uint aid; + uint mac_id; + uint qos_option; + u8 hwaddr[ETH_ALEN]; + + uint ieee8021x_blocked; //0: allowed, 1:blocked + uint dot118021XPrivacy; //aes, tkip... + union Keytype dot11tkiptxmickey; + union Keytype dot11tkiprxmickey; + union Keytype dot118021x_UncstKey; + union pn48 dot11txpn; // PN48 used for Unicast xmit. + union pn48 dot11rxpn; // PN48 used for Unicast recv. + + + u8 bssrateset[16]; + u32 bssratelen; + s32 rssi; + s32 signal_quality; + + u8 cts2self; + u8 rtsen; + + u8 raid; + u8 init_rate; + + struct stainfo_stats sta_stats; + +#ifdef CONFIG_TDLS + u8 SNonce[32]; + u8 ANonce[32]; + u32 TDLS_PeerKey_Lifetime; + u16 TPK_count; + _timer TPK_timer; + struct TDLS_PeerKey tpk; + _adapter *padapter; + u8 cam_entry; + u16 stat_code; + u8 off_ch; + u16 ch_switch_time; + u16 ch_switch_timeout; + u8 option; + _workitem option_workitem; + _timer option_timer; + _workitem base_ch_workitem; + _timer base_ch_timer; + _workitem off_ch_workitem; + _timer off_ch_timer; +#endif + + //for A-MPDU TX, ADDBA timeout check + _timer addba_retry_timer; + + //for A-MPDU Rx reordering buffer control + struct recv_reorder_ctrl recvreorder_ctrl[16]; + + //for A-MPDU Tx + //unsigned char ampdu_txen_bitmap; + u16 BA_starting_seqctrl[16]; + + +#ifdef CONFIG_80211N_HT + struct ht_priv htpriv; +#endif + + //Notes: + //STA_Mode: + //curr_network(mlme_priv/security_priv/qos/ht) + sta_info: (STA & AP) CAP/INFO + //scan_q: AP CAP/INFO + + //AP_Mode: + //curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO + //sta_info: (AP & STA) CAP/INFO + +#ifdef CONFIG_AP_MODE + + _list asoc_list; + _list auth_list; + + unsigned int expire_to; + unsigned int auth_seq; + unsigned int authalg; + unsigned char chg_txt[128]; + + u16 capability; + int flags; + + int dot8021xalg;//0:disable, 1:psk, 2:802.1x + int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2 + int wpa_group_cipher; + int wpa2_group_cipher; + int wpa_pairwise_cipher; + int wpa2_pairwise_cipher; + +#ifdef CONFIG_NATIVEAP_MLME + u8 wpa_ie[32]; + + u8 nonerp_set; + u8 no_short_slot_time_set; + u8 no_short_preamble_set; + u8 no_ht_gf_set; + u8 no_ht_set; + u8 ht_20mhz_set; +#endif + + unsigned int tx_ra_bitmap; + u8 qos_info; + + u8 max_sp_len; + u8 uapsd_bk;//BIT(0): Delivery enabled, BIT(1): Trigger enabled + u8 uapsd_be; + u8 uapsd_vi; + u8 uapsd_vo; + + u8 has_legacy_ac; + unsigned int sleepq_ac_len; + +#ifdef CONFIG_P2P + //p2p priv data + u8 is_p2p_device; + u8 p2p_status_code; + + //p2p client info + u8 dev_addr[ETH_ALEN]; + //u8 iface_addr[ETH_ALEN];//= hwaddr[ETH_ALEN] + u8 dev_cap; + u16 config_methods; + u8 primary_dev_type[8]; + u8 num_of_secdev_type; + u8 secdev_types_list[32];// 32/8 == 4; + u16 dev_name_len; + u8 dev_name[32]; +#endif //CONFIG_P2P +#endif + + //for DM + RSSI_STA rssi_stat; + + +}; + + + +struct sta_priv { + + u8 *pallocated_stainfo_buf; + u8 *pstainfo_buf; + _queue free_sta_queue; + + _lock sta_hash_lock; + _list sta_hash[NUM_STA]; + int asoc_sta_count; + _queue sleep_q; + _queue wakeup_q; + + _adapter *padapter; + + +#ifdef CONFIG_AP_MODE + _list asoc_list; + _list auth_list; + + unsigned int auth_to; //sec, time to expire in authenticating. + unsigned int assoc_to; //sec, time to expire before associating. + unsigned int expire_to; //sec , time to expire after associated. + + /* pointers to STA info; based on allocated AID or NULL if AID free + * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1 + * and so on + */ + struct sta_info *sta_aid[NUM_STA]; + + u16 sta_dz_bitmap;//only support 15 stations, staion aid bitmap for sleeping sta. + u16 tim_bitmap;//only support 15 stations, aid=0~15 mapping bit0~bit15 + + u16 max_num_sta; +#endif + +}; + + +__inline static u32 wifi_mac_hash(u8 *mac) +{ + u32 x; + + x = mac[0]; + x = (x << 2) ^ mac[1]; + x = (x << 2) ^ mac[2]; + x = (x << 2) ^ mac[3]; + x = (x << 2) ^ mac[4]; + x = (x << 2) ^ mac[5]; + + x ^= x >> 8; + x = x & (NUM_STA - 1); + + return x; +} + + +extern u32 _rtw_init_sta_priv(struct sta_priv *pstapriv); +extern u32 _rtw_free_sta_priv(struct sta_priv *pstapriv); +extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta); +extern void rtw_free_all_stainfo(_adapter *padapter); +extern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern u32 rtw_init_bcmc_stainfo(_adapter* padapter); +extern struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter); +extern u8 rtw_access_ctrl(struct wlan_acl_pool* pacl_list, u8 * mac_addr); + +#endif //_STA_INFO_H_ diff --git a/drivers/net/wireless/rtl8192c/include/usb_hal.h b/drivers/net/wireless/rtl8192c/include/usb_hal.h new file mode 100755 index 000000000000..1b15d52c8f35 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_hal.h @@ -0,0 +1,30 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __USB_HAL_H__ +#define __USB_HAL_H__ + + +void rtl8192cu_set_hal_ops(_adapter * padapter); + +void rtl8192du_set_hal_ops(_adapter * padapter); + +#endif //__USB_HAL_H__ + diff --git a/drivers/net/wireless/rtl8192c/include/usb_ops.h b/drivers/net/wireless/rtl8192c/include/usb_ops.h new file mode 100755 index 000000000000..834841189265 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_ops.h @@ -0,0 +1,95 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __USB_OPS_H_ +#define __USB_OPS_H_ + +#include +#include +#include +#include + +#define REALTEK_USB_VENQT_READ 0xC0 +#define REALTEK_USB_VENQT_WRITE 0x40 +#define REALTEK_USB_VENQT_CMD_REQ 0x05 +#define REALTEK_USB_VENQT_CMD_IDX 0x00 + +enum{ + VENDOR_WRITE = 0x00, + VENDOR_READ = 0x01, +}; +#define ALIGNMENT_UNIT 16 +#define MAX_VENDOR_REQ_CMD_SIZE 254 //8188cu SIE Support +#define MAX_USB_IO_CTL_SIZE (MAX_VENDOR_REQ_CMD_SIZE +ALIGNMENT_UNIT) + +#ifdef PLATFORM_LINUX +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)) +#define rtw_usb_control_msg(dev, pipe, request, requesttype, value, index, data, size, timeout_ms) \ + usb_control_msg((dev), (pipe), (request), (requesttype), (value), (index), (data), (size), (timeout_ms)) +#else +#define rtw_usb_control_msg(dev, pipe, request, requesttype, value, index, data, size,timeout_ms) \ + usb_control_msg((dev), (pipe), (request), (requesttype), (value), (index), (data), (size), \ + ((timeout_ms) == 0) ||((timeout_ms)*HZ/1000>0)?((timeout_ms)*HZ/1000):1) +#endif +#endif //PLATFORM_LINUX + +#ifdef CONFIG_RTL8192C +void rtl8192cu_set_intf_ops(struct _io_ops *pops); + +void rtl8192cu_recv_tasklet(void *priv); + +void rtl8192cu_xmit_tasklet(void *priv); +#endif + +#ifdef CONFIG_RTL8192D +void rtl8192du_set_intf_ops(struct _io_ops *pops); + +void rtl8192du_recv_tasklet(void *priv); + +void rtl8192du_xmit_tasklet(void *priv); +#endif + +/* +* Increase and check if the continual_urb_error of this @param dvobjprive is larger than MAX_CONTINUAL_URB_ERR +* @return _TRUE: +* @return _FALSE: +*/ +static inline int rtw_inc_and_chk_continual_urb_error(struct dvobj_priv *dvobjpriv) +{ + int ret = _FALSE; + int value; + if( (value=ATOMIC_INC_RETURN(&dvobjpriv->continual_urb_error)) > MAX_CONTINUAL_URB_ERR) { + DBG_871X("[dvobjpriv:%p][ERROR] continual_urb_error:%d > %d\n", dvobjpriv, value, MAX_CONTINUAL_URB_ERR); + ret = _TRUE; + } else { + //DBG_871X("[dvobjpriv:%p] continual_urb_error:%d\n", dvobjpriv, value); + } + return ret; +} + +/* +* Set the continual_urb_error of this @param dvobjprive to 0 +*/ +static inline void rtw_reset_continual_urb_error(struct dvobj_priv *dvobjpriv) +{ + ATOMIC_SET(&dvobjpriv->continual_urb_error, 0); +} + +#endif //__USB_OPS_H_ diff --git a/drivers/net/wireless/rtl8192c/include/usb_osintf.h b/drivers/net/wireless/rtl8192c/include/usb_osintf.h new file mode 100755 index 000000000000..8642aa26e794 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_osintf.h @@ -0,0 +1,39 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __USB_OSINTF_H +#define __USB_OSINTF_H + +#include +#include +#include +#include + +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) + + +//uint usb_dvobj_init(_adapter * adapter); +//void usb_dvobj_deinit(_adapter * adapter); + +u8 usbvendorrequest(struct dvobj_priv *pdvobjpriv, RT_USB_BREQUEST brequest, RT_USB_WVALUE wvalue, u8 windex, void* data, u8 datalen, u8 isdirectionin); + + +#endif + diff --git a/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h b/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h new file mode 100755 index 000000000000..72864de53bd4 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/usb_vendor_req.h @@ -0,0 +1,60 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _USB_VENDOR_REQUEST_H_ +#define _USB_VENDOR_REQUEST_H_ + +//4 Set/Get Register related wIndex/Data +#define RT_USB_RESET_MASK_OFF 0 +#define RT_USB_RESET_MASK_ON 1 +#define RT_USB_SLEEP_MASK_OFF 0 +#define RT_USB_SLEEP_MASK_ON 1 +#define RT_USB_LDO_ON 1 +#define RT_USB_LDO_OFF 0 + +//4 Set/Get SYSCLK related wValue or Data +#define RT_USB_SYSCLK_32KHZ 0 +#define RT_USB_SYSCLK_40MHZ 1 +#define RT_USB_SYSCLK_60MHZ 2 + + +typedef enum _RT_USB_BREQUEST { + RT_USB_SET_REGISTER = 1, + RT_USB_SET_SYSCLK = 2, + RT_USB_GET_SYSCLK = 3, + RT_USB_GET_REGISTER = 4 +} RT_USB_BREQUEST; + + +typedef enum _RT_USB_WVALUE { + RT_USB_RESET_MASK = 1, + RT_USB_SLEEP_MASK = 2, + RT_USB_USB_HRCPWM = 3, + RT_USB_LDO = 4, + RT_USB_BOOT_TYPE = 5 +} RT_USB_WVALUE; + + +//BOOLEAN usbvendorrequest(PCE_USB_DEVICE CEdevice, RT_USB_BREQUEST bRequest, RT_USB_WVALUE wValue, UCHAR wIndex, PVOID Data, UCHAR DataLength, BOOLEAN isDirectionIn); +//BOOLEAN CEusbGetStatusRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT Index, PVOID Data); +//BOOLEAN CEusbFeatureRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT FeatureSelector, IN USHORT Index); +//BOOLEAN CEusbGetDescriptorRequest(PCE_USB_DEVICE CEdevice, IN short urbLength, IN UCHAR DescriptorType, IN UCHAR Index, IN USHORT LanguageId, IN PVOID TransferBuffer, IN ULONG TransferBufferLength); + +#endif diff --git a/drivers/net/wireless/rtl8192c/include/wifi.h b/drivers/net/wireless/rtl8192c/include/wifi.h new file mode 100755 index 000000000000..f3c8f16bc88f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/wifi.h @@ -0,0 +1,1169 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef _WIFI_H_ +#define _WIFI_H_ + +#include + +#ifdef BIT +//#error "BIT define occurred earlier elsewhere!\n" +#undef BIT +#endif +#define BIT(x) (1 << (x)) + + +#define WLAN_ETHHDR_LEN 14 +#define WLAN_ETHADDR_LEN 6 +#define WLAN_IEEE_OUI_LEN 3 +#define WLAN_ADDR_LEN 6 +#define WLAN_CRC_LEN 4 +#define WLAN_BSSID_LEN 6 +#define WLAN_BSS_TS_LEN 8 +#define WLAN_HDR_A3_LEN 24 +#define WLAN_HDR_A4_LEN 30 +#define WLAN_HDR_A3_QOS_LEN 26 +#define WLAN_HDR_A4_QOS_LEN 32 +#define WLAN_SSID_MAXLEN 32 +#define WLAN_DATA_MAXLEN 2312 + +#define WLAN_A3_PN_OFFSET 24 +#define WLAN_A4_PN_OFFSET 30 + +#define WLAN_MIN_ETHFRM_LEN 60 +#define WLAN_MAX_ETHFRM_LEN 1514 +#define WLAN_ETHHDR_LEN 14 + +#define P80211CAPTURE_VERSION 0x80211001 + +#ifdef GREEN_HILL +#pragma pack(1) +#endif + +enum WIFI_FRAME_TYPE { + WIFI_MGT_TYPE = (0), + WIFI_CTRL_TYPE = (BIT(2)), + WIFI_DATA_TYPE = (BIT(3)), + WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), //!< QoS Data +}; + +enum WIFI_FRAME_SUBTYPE { + + // below is for mgt frame + WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE), + WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE), + WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE), + WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE), + WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE), + WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE), + WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE), + WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE), + WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE), + WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE), + WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE), + WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE), + + // below is for control frame + WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE), + WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), + WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE), + WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE), + WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE), + WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), + + // below is for data frame + WIFI_DATA = (0 | WIFI_DATA_TYPE), + WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE), + WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE), + WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE), + WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE), + WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE), + WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE), + WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE), + WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE), +}; + +enum WIFI_REASON_CODE { + _RSON_RESERVED_ = 0, + _RSON_UNSPECIFIED_ = 1, + _RSON_AUTH_NO_LONGER_VALID_ = 2, + _RSON_DEAUTH_STA_LEAVING_ = 3, + _RSON_INACTIVITY_ = 4, + _RSON_UNABLE_HANDLE_ = 5, + _RSON_CLS2_ = 6, + _RSON_CLS3_ = 7, + _RSON_DISAOC_STA_LEAVING_ = 8, + _RSON_ASOC_NOT_AUTH_ = 9, + + // WPA reason + _RSON_INVALID_IE_ = 13, + _RSON_MIC_FAILURE_ = 14, + _RSON_4WAY_HNDSHK_TIMEOUT_ = 15, + _RSON_GROUP_KEY_UPDATE_TIMEOUT_ = 16, + _RSON_DIFF_IE_ = 17, + _RSON_MLTCST_CIPHER_NOT_VALID_ = 18, + _RSON_UNICST_CIPHER_NOT_VALID_ = 19, + _RSON_AKMP_NOT_VALID_ = 20, + _RSON_UNSUPPORT_RSNE_VER_ = 21, + _RSON_INVALID_RSNE_CAP_ = 22, + _RSON_IEEE_802DOT1X_AUTH_FAIL_ = 23, + + //belowing are Realtek definition + _RSON_PMK_NOT_AVAILABLE_ = 24, + _RSON_TDLS_TEAR_TOOFAR_ = 25, + _RSON_TDLS_TEAR_UN_RSN_ = 26, +}; + +/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */ +#if 0 +#define WLAN_REASON_UNSPECIFIED 1 +#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 +#define WLAN_REASON_DEAUTH_LEAVING 3 +#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 +#define WLAN_REASON_DISASSOC_AP_BUSY 5 +#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 +#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 +#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 +#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 +#endif +/* IEEE 802.11h */ +#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10 +#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11 +#if 0 +/* IEEE 802.11i */ +#define WLAN_REASON_INVALID_IE 13 +#define WLAN_REASON_MICHAEL_MIC_FAILURE 14 +#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15 +#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16 +#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17 +#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18 +#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19 +#define WLAN_REASON_AKMP_NOT_VALID 20 +#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21 +#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22 +#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23 +#define WLAN_REASON_CIPHER_SUITE_REJECTED 24 +#endif + +enum WIFI_STATUS_CODE { + _STATS_SUCCESSFUL_ = 0, + _STATS_FAILURE_ = 1, + _STATS_CAP_FAIL_ = 10, + _STATS_NO_ASOC_ = 11, + _STATS_OTHER_ = 12, + _STATS_NO_SUPP_ALG_ = 13, + _STATS_OUT_OF_AUTH_SEQ_ = 14, + _STATS_CHALLENGE_FAIL_ = 15, + _STATS_AUTH_TIMEOUT_ = 16, + _STATS_UNABLE_HANDLE_STA_ = 17, + _STATS_RATE_FAIL_ = 18, +}; + +/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */ +#if 0 +#define WLAN_STATUS_SUCCESS 0 +#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 +#define WLAN_STATUS_CAPS_UNSUPPORTED 10 +#define WLAN_STATUS_REASSOC_NO_ASSOC 11 +#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 +#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 +#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 +#define WLAN_STATUS_CHALLENGE_FAIL 15 +#define WLAN_STATUS_AUTH_TIMEOUT 16 +#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 +#define WLAN_STATUS_ASSOC_DENIED_RATES 18 +#endif +//entended +/* IEEE 802.11b */ +#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 +#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 +#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 +/* IEEE 802.11h */ +#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22 +#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23 +#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24 +/* IEEE 802.11g */ +#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25 +#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26 +#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27 +/* IEEE 802.11w */ +#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30 +#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31 +/* IEEE 802.11i */ +#define WLAN_STATUS_INVALID_IE 40 +#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41 +#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42 +#define WLAN_STATUS_AKMP_NOT_VALID 43 +#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44 +#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45 +#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46 +#define WLAN_STATUS_TS_NOT_CREATED 47 +#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48 +#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49 +#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50 +#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51 +/* IEEE 802.11r */ +#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52 +#define WLAN_STATUS_INVALID_PMKID 53 +#define WLAN_STATUS_INVALID_MDIE 54 +#define WLAN_STATUS_INVALID_FTIE 55 + + +enum WIFI_REG_DOMAIN { + DOMAIN_FCC = 1, + DOMAIN_IC = 2, + DOMAIN_ETSI = 3, + DOMAIN_SPAIN = 4, + DOMAIN_FRANCE = 5, + DOMAIN_MKK = 6, + DOMAIN_ISRAEL = 7, + DOMAIN_MKK1 = 8, + DOMAIN_MKK2 = 9, + DOMAIN_MKK3 = 10, + DOMAIN_MAX +}; + +#define _TO_DS_ BIT(8) +#define _FROM_DS_ BIT(9) +#define _MORE_FRAG_ BIT(10) +#define _RETRY_ BIT(11) +#define _PWRMGT_ BIT(12) +#define _MORE_DATA_ BIT(13) +#define _PRIVACY_ BIT(14) +#define _ORDER_ BIT(15) + +#define SetToDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_TO_DS_); \ + } while(0) + +#define GetToDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_TO_DS_)) != 0) + +#define ClearToDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_TO_DS_)); \ + } while(0) + +#define SetFrDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_FROM_DS_); \ + } while(0) + +#define GetFrDs(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_FROM_DS_)) != 0) + +#define ClearFrDs(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)); \ + } while(0) + +#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe)) + + +#define SetMFrag(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_FRAG_); \ + } while(0) + +#define GetMFrag(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_FRAG_)) != 0) + +#define ClearMFrag(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)); \ + } while(0) + +#define SetRetry(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_RETRY_); \ + } while(0) + +#define GetRetry(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_RETRY_)) != 0) + +#define ClearRetry(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_RETRY_)); \ + } while(0) + +#define SetPwrMgt(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_PWRMGT_); \ + } while(0) + +#define GetPwrMgt(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PWRMGT_)) != 0) + +#define ClearPwrMgt(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)); \ + } while(0) + +#define SetMData(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_DATA_); \ + } while(0) + +#define GetMData(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_DATA_)) != 0) + +#define ClearMData(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)); \ + } while(0) + +#define SetPrivacy(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_PRIVACY_); \ + } while(0) + +#define GetPrivacy(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_PRIVACY_)) != 0) + +#define ClearPrivacy(pbuf) \ + do { \ + *(unsigned short *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)); \ + } while(0) + + +#define GetOrder(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) + +#define GetFrameType(pbuf) (le16_to_cpu(*(unsigned short *)(pbuf)) & (BIT(3) | BIT(2))) + +#define SetFrameType(pbuf,type) \ + do { \ + *(unsigned short *)(pbuf) &= __constant_cpu_to_le16(~(BIT(3) | BIT(2))); \ + *(unsigned short *)(pbuf) |= __constant_cpu_to_le16(type); \ + } while(0) + +#define GetFrameSubType(pbuf) (cpu_to_le16(*(unsigned short *)(pbuf)) & (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))) + +#define SetFrameSubType(pbuf,type) \ + do { \ + *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))); \ + *(unsigned short *)(pbuf) |= cpu_to_le16(type); \ + } while(0) + +#define GetSequence(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) >> 4) + +#define GetFragNum(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & 0x0f) + +#define GetTupleCache(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22))) + +#define SetFragNum(pbuf, num) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu(~(0x000f))) | \ + cpu_to_le16(0x0f & (num)); \ + } while(0) + +#define SetSeqNum(pbuf, num) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \ + ((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu((unsigned short)~0xfff0)) | \ + le16_to_cpu((unsigned short)(0xfff0 & (num << 4))); \ + } while(0) + +#define SetDuration(pbuf, dur) \ + do { \ + *(unsigned short *)((SIZE_PTR)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)); \ + } while(0) + + +#define SetPriority(pbuf, tid) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(tid & 0xf); \ + } while(0) + +#define GetPriority(pbuf) ((le16_to_cpu(*(unsigned short *)(pbuf))) & 0xf) + +#define SetEOSP(pbuf, eosp) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (eosp & 1) << 4); \ + } while(0) + +#define SetAckpolicy(pbuf, ack) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (ack & 3) << 5); \ + } while(0) + +#define GetAckpolicy(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 5) & 0x3) + +#define GetAMsdu(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 7) & 0x1) + +#define SetAMsdu(pbuf, amsdu) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16( (amsdu & 1) << 7); \ + } while(0) + +#define GetAid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 2)) & 0x3fff) + +#define GetTid(pbuf) (cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + (((GetToDs(pbuf)<<1)|GetFrDs(pbuf))==3?30:24))) & 0x000f) + +#define GetAddr1Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 4)) + +#define GetAddr2Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 10)) + +#define GetAddr3Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 16)) + +#define GetAddr4Ptr(pbuf) ((unsigned char *)((SIZE_PTR)(pbuf) + 24)) + +#define MacAddr_isBcst(addr) \ +( \ + ( (addr[0] == 0xff) && (addr[1] == 0xff) && \ + (addr[2] == 0xff) && (addr[3] == 0xff) && \ + (addr[4] == 0xff) && (addr[5] == 0xff) ) ? _TRUE : _FALSE \ +) + +__inline static int IS_MCAST(unsigned char *da) +{ + if ((*da) & 0x01) + return _TRUE; + else + return _FALSE; +} + + +__inline static unsigned char * get_da(unsigned char *pframe) +{ + unsigned char *da; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + da = GetAddr1Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + da = GetAddr1Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + da = GetAddr3Ptr(pframe); + break; + default: // ToDs=1, FromDs=1 + da = GetAddr3Ptr(pframe); + break; + } + + return da; +} + + +__inline static unsigned char * get_sa(unsigned char *pframe) +{ + unsigned char *sa; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + sa = GetAddr2Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + sa = GetAddr3Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + sa = GetAddr2Ptr(pframe); + break; + default: // ToDs=1, FromDs=1 + sa = GetAddr4Ptr(pframe); + break; + } + + return sa; +} + +__inline static unsigned char * get_hdr_bssid(unsigned char *pframe) +{ + unsigned char *sa; + unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe); + + switch (to_fr_ds) { + case 0x00: // ToDs=0, FromDs=0 + sa = GetAddr3Ptr(pframe); + break; + case 0x01: // ToDs=0, FromDs=1 + sa = GetAddr2Ptr(pframe); + break; + case 0x02: // ToDs=1, FromDs=0 + sa = GetAddr1Ptr(pframe); + break; + case 0x03: // ToDs=1, FromDs=1 + sa = GetAddr1Ptr(pframe); + break; + default: + sa =NULL; //??????? + break; + } + + return sa; +} + + +__inline static int IsFrameTypeCtrl(unsigned char *pframe) +{ + if(WIFI_CTRL_TYPE == GetFrameType(pframe)) + return _TRUE; + else + return _FALSE; +} +/*----------------------------------------------------------------------------- + Below is for the security related definition +------------------------------------------------------------------------------*/ +#define _RESERVED_FRAME_TYPE_ 0 +#define _SKB_FRAME_TYPE_ 2 +#define _PRE_ALLOCMEM_ 1 +#define _PRE_ALLOCHDR_ 3 +#define _PRE_ALLOCLLCHDR_ 4 +#define _PRE_ALLOCICVHDR_ 5 +#define _PRE_ALLOCMICHDR_ 6 + +#define _SIFSTIME_ ((priv->pmib->dot11BssType.net_work_type&WIRELESS_11A)?16:10) +#define _ACKCTSLNG_ 14 //14 bytes long, including crclng +#define _CRCLNG_ 4 + +#define _ASOCREQ_IE_OFFSET_ 4 // excluding wlan_hdr +#define _ASOCRSP_IE_OFFSET_ 6 +#define _REASOCREQ_IE_OFFSET_ 10 +#define _REASOCRSP_IE_OFFSET_ 6 +#define _PROBEREQ_IE_OFFSET_ 0 +#define _PROBERSP_IE_OFFSET_ 12 +#define _AUTH_IE_OFFSET_ 6 +#define _DEAUTH_IE_OFFSET_ 0 +#define _BEACON_IE_OFFSET_ 12 +#define _PUBLIC_ACTION_IE_OFFSET_ 8 + +#define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_ + +#define _SSID_IE_ 0 +#define _SUPPORTEDRATES_IE_ 1 +#define _DSSET_IE_ 3 +#define _TIM_IE_ 5 +#define _IBSS_PARA_IE_ 6 +#define _COUNTRY_IE_ 7 +#define _CHLGETXT_IE_ 16 +#define _SUPPORTED_CH_IE_ 36 +#define _CH_SWTICH_ANNOUNCE_ 37 //Secondary Channel Offset +#define _RSN_IE_2_ 48 +#define _SSN_IE_1_ 221 +#define _ERPINFO_IE_ 42 +#define _EXT_SUPPORTEDRATES_IE_ 50 + +#define _HT_CAPABILITY_IE_ 45 +#define _FTIE_ 55 +#define _TIMEOUT_ITVL_IE_ 56 +#define _HT_EXTRA_INFO_IE_ 61 +#define _HT_ADD_INFO_IE_ 61 //_HT_EXTRA_INFO_IE_ + +#define EID_BSSCoexistence 72 // 20/40 BSS Coexistence +#define EID_BSSIntolerantChlReport 73 +#define _RIC_Descriptor_IE_ 75 + +#define _LINK_ID_IE_ 101 +#define _CH_SWITCH_TIMING_ 104 +#define _PTI_BUFFER_STATUS_ 106 +#define _EXT_CAP_IE_ 127 +#define _VENDOR_SPECIFIC_IE_ 221 + +#define _RESERVED47_ 47 + +/* --------------------------------------------------------------------------- + Below is the fixed elements... +-----------------------------------------------------------------------------*/ +#define _AUTH_ALGM_NUM_ 2 +#define _AUTH_SEQ_NUM_ 2 +#define _BEACON_ITERVAL_ 2 +#define _CAPABILITY_ 2 +#define _CURRENT_APADDR_ 6 +#define _LISTEN_INTERVAL_ 2 +#define _RSON_CODE_ 2 +#define _ASOC_ID_ 2 +#define _STATUS_CODE_ 2 +#define _TIMESTAMP_ 8 + +#define AUTH_ODD_TO 0 +#define AUTH_EVEN_TO 1 + +#define WLAN_ETHCONV_ENCAP 1 +#define WLAN_ETHCONV_RFC1042 2 +#define WLAN_ETHCONV_8021h 3 + +#define cap_ESS BIT(0) +#define cap_IBSS BIT(1) +#define cap_CFPollable BIT(2) +#define cap_CFRequest BIT(3) +#define cap_Privacy BIT(4) +#define cap_ShortPremble BIT(5) +#define cap_PBCC BIT(6) +#define cap_ChAgility BIT(7) +#define cap_SpecMgmt BIT(8) +#define cap_QoS BIT(9) +#define cap_ShortSlot BIT(10) + +/*----------------------------------------------------------------------------- + Below is the definition for 802.11i / 802.1x +------------------------------------------------------------------------------*/ +#define _IEEE8021X_MGT_ 1 // WPA +#define _IEEE8021X_PSK_ 2 // WPA with pre-shared key + +/* +#define _NO_PRIVACY_ 0 +#define _WEP_40_PRIVACY_ 1 +#define _TKIP_PRIVACY_ 2 +#define _WRAP_PRIVACY_ 3 +#define _CCMP_PRIVACY_ 4 +#define _WEP_104_PRIVACY_ 5 +#define _WEP_WPA_MIXED_PRIVACY_ 6 // WEP + WPA +*/ + +/*----------------------------------------------------------------------------- + Below is the definition for WMM +------------------------------------------------------------------------------*/ +#define _WMM_IE_Length_ 7 // for WMM STA +#define _WMM_Para_Element_Length_ 24 + + +/*----------------------------------------------------------------------------- + Below is the definition for 802.11n +------------------------------------------------------------------------------*/ + +/* block-ack parameters */ +#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 +#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 +#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 + +//#ifdef CONFIG_80211N_HT + +#define SetOrderBit(pbuf) \ + do { \ + *(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \ + } while(0) + +#define GetOrderBit(pbuf) (((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0) + + +/** + * struct ieee80211_bar - HT Block Ack Request + * + * This structure refers to "HT BlockAckReq" as + * described in 802.11n draft section 7.2.1.7.1 + */ + #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) +struct ieee80211_bar { + unsigned short frame_control; + unsigned short duration; + unsigned char ra[6]; + unsigned char ta[6]; + unsigned short control; + unsigned short start_seq_num; +} __attribute__((packed)); + #endif + +/* 802.11 BAR control masks */ +#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000 +#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004 + + + #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) + + /** + * struct ieee80211_ht_cap - HT capabilities + * + * This structure refers to "HT capabilities element" as + * described in 802.11n draft section 7.3.2.52 + */ + +struct ieee80211_ht_cap { + unsigned short cap_info; + unsigned char ampdu_params_info; + unsigned char supp_mcs_set[16]; + unsigned short extended_ht_cap_info; + unsigned int tx_BF_cap_info; + unsigned char antenna_selection_info; +} __attribute__ ((packed)); + +/** + * struct ieee80211_ht_cap - HT additional information + * + * This structure refers to "HT information element" as + * described in 802.11n draft section 7.3.2.53 + */ +struct ieee80211_ht_addt_info { + unsigned char control_chan; + unsigned char ht_param; + unsigned short operation_mode; + unsigned short stbc_param; + unsigned char basic_set[16]; +} __attribute__ ((packed)); + + +struct HT_caps_element +{ + union + { + struct + { + unsigned short HT_caps_info; + unsigned char AMPDU_para; + unsigned char MCS_rate[16]; + unsigned short HT_ext_caps; + unsigned int Beamforming_caps; + unsigned char ASEL_caps; + } HT_cap_element; + unsigned char HT_cap[26]; + }; +} __attribute__ ((packed)); + +struct HT_info_element +{ + unsigned char primary_channel; + unsigned char infos[5]; + unsigned char MCS_rate[16]; +} __attribute__ ((packed)); + +struct AC_param +{ + unsigned char ACI_AIFSN; + unsigned char CW; + unsigned short TXOP_limit; +} __attribute__ ((packed)); + +struct WMM_para_element +{ + unsigned char QoS_info; + unsigned char reserved; + struct AC_param ac_param[4]; +} __attribute__ ((packed)); + +struct ADDBA_request +{ + unsigned char dialog_token; + unsigned short BA_para_set; + unsigned short BA_timeout_value; + unsigned short BA_starting_seqctrl; +} __attribute__ ((packed)); + + + +#endif + + +#ifdef PLATFORM_WINDOWS + +#pragma pack(1) + +struct ieee80211_ht_cap { + unsigned short cap_info; + unsigned char ampdu_params_info; + unsigned char supp_mcs_set[16]; + unsigned short extended_ht_cap_info; + unsigned int tx_BF_cap_info; + unsigned char antenna_selection_info; +}; + + +struct ieee80211_ht_addt_info { + unsigned char control_chan; + unsigned char ht_param; + unsigned short operation_mode; + unsigned short stbc_param; + unsigned char basic_set[16]; +}; + +struct HT_caps_element +{ + union + { + struct + { + unsigned short HT_caps_info; + unsigned char AMPDU_para; + unsigned char MCS_rate[16]; + unsigned short HT_ext_caps; + unsigned int Beamforming_caps; + unsigned char ASEL_caps; + } HT_cap_element; + unsigned char HT_cap[26]; + }; +}; + +struct HT_info_element +{ + unsigned char primary_channel; + unsigned char infos[5]; + unsigned char MCS_rate[16]; +}; + +struct AC_param +{ + unsigned char ACI_AIFSN; + unsigned char CW; + unsigned short TXOP_limit; +}; + +struct WMM_para_element +{ + unsigned char QoS_info; + unsigned char reserved; + struct AC_param ac_param[4]; +}; + +struct ADDBA_request +{ + unsigned char dialog_token; + unsigned short BA_para_set; + unsigned short BA_timeout_value; + unsigned short BA_starting_seqctrl; +}; + + +#pragma pack() + +#endif + + +/* 802.11n HT capabilities masks */ +#define IEEE80211_HT_CAP_SUP_WIDTH 0x0002 +#define IEEE80211_HT_CAP_SM_PS 0x000C +#define IEEE80211_HT_CAP_GRN_FLD 0x0010 +#define IEEE80211_HT_CAP_SGI_20 0x0020 +#define IEEE80211_HT_CAP_SGI_40 0x0040 +#define IEEE80211_HT_CAP_TX_STBC 0x0080 +#define IEEE80211_HT_CAP_RX_STBC 0x0300 +#define IEEE80211_HT_CAP_DELAY_BA 0x0400 +#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 +#define IEEE80211_HT_CAP_DSSSCCK40 0x1000 +/* 802.11n HT capability AMPDU settings */ +#define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03 +#define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C +/* 802.11n HT capability MSC set */ +#define IEEE80211_SUPP_MCS_SET_UEQM 4 +#define IEEE80211_HT_CAP_MAX_STREAMS 4 +#define IEEE80211_SUPP_MCS_SET_LEN 10 +/* maximum streams the spec allows */ +#define IEEE80211_HT_CAP_MCS_TX_DEFINED 0x01 +#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF 0x02 +#define IEEE80211_HT_CAP_MCS_TX_STREAMS 0x0C +#define IEEE80211_HT_CAP_MCS_TX_UEQM 0x10 +/* 802.11n HT IE masks */ +#define IEEE80211_HT_IE_CHA_SEC_OFFSET 0x03 +#define IEEE80211_HT_IE_CHA_SEC_NONE 0x00 +#define IEEE80211_HT_IE_CHA_SEC_ABOVE 0x01 +#define IEEE80211_HT_IE_CHA_SEC_BELOW 0x03 +#define IEEE80211_HT_IE_CHA_WIDTH 0x04 +#define IEEE80211_HT_IE_HT_PROTECTION 0x0003 +#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004 +#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 + +/* block-ack parameters */ +#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 +#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 +#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 + +/* + * A-PMDU buffer sizes + * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2) + */ +#define IEEE80211_MIN_AMPDU_BUF 0x8 +#define IEEE80211_MAX_AMPDU_BUF 0x40 + + +/* Spatial Multiplexing Power Save Modes */ +#define WLAN_HT_CAP_SM_PS_STATIC 0 +#define WLAN_HT_CAP_SM_PS_DYNAMIC 1 +#define WLAN_HT_CAP_SM_PS_INVALID 2 +#define WLAN_HT_CAP_SM_PS_DISABLED 3 + +#ifdef CONFIG_AP_MODE +#define OP_MODE_PURE 0 +#define OP_MODE_MAY_BE_LEGACY_STAS 1 +#define OP_MODE_20MHZ_HT_STA_ASSOCED 2 +#define OP_MODE_MIXED 3 + +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE ((u8) BIT(0)) +#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW ((u8) BIT(0) | BIT(1)) +#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH ((u8) BIT(2)) +#define HT_INFO_HT_PARAM_RIFS_MODE ((u8) BIT(3)) +#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY ((u8) BIT(4)) +#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY ((u8) BIT(5)) + +#define HT_INFO_OPERATION_MODE_OP_MODE_MASK \ + ((u16) (0x0001 | 0x0002)) +#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET 0 +#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT ((u8) BIT(2)) +#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT ((u8) BIT(3)) +#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT ((u8) BIT(4)) + +#define HT_INFO_STBC_PARAM_DUAL_BEACON ((u16) BIT(6)) +#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT ((u16) BIT(7)) +#define HT_INFO_STBC_PARAM_SECONDARY_BCN ((u16) BIT(8)) +#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED ((u16) BIT(9)) +#define HT_INFO_STBC_PARAM_PCO_ACTIVE ((u16) BIT(10)) +#define HT_INFO_STBC_PARAM_PCO_PHASE ((u16) BIT(11)) +#endif + + +//#endif + +// ===============WPS Section=============== +// For WPSv1.0 +#define WPSOUI 0x0050f204 +// WPS attribute ID +#define WPS_ATTR_VER1 0x104A +#define WPS_ATTR_SIMPLE_CONF_STATE 0x1044 +#define WPS_ATTR_RESP_TYPE 0x103B +#define WPS_ATTR_UUID_E 0x1047 +#define WPS_ATTR_MANUFACTURER 0x1021 +#define WPS_ATTR_MODEL_NAME 0x1023 +#define WPS_ATTR_MODEL_NUMBER 0x1024 +#define WPS_ATTR_SERIAL_NUMBER 0x1042 +#define WPS_ATTR_PRIMARY_DEV_TYPE 0x1054 +#define WPS_ATTR_DEVICE_NAME 0x1011 +#define WPS_ATTR_CONF_METHOD 0x1008 +#define WPS_ATTR_RF_BANDS 0x103C +#define WPS_ATTR_DEVICE_PWID 0x1012 + +// Value of WPS attribute "WPS_ATTR_DEVICE_NAME +#define WPS_MAX_DEVICE_NAME_LEN 32 + +// Value of WPS Response Type Attribute +#define WPS_RESPONSE_TYPE_INFO_ONLY 0x00 +#define WPS_RESPONSE_TYPE_8021X 0x01 +#define WPS_RESPONSE_TYPE_REGISTRAR 0x02 +#define WPS_RESPONSE_TYPE_AP 0x03 + +// Value of WPS WiFi Simple Configuration State Attribute +#define WPS_WSC_STATE_NOT_CONFIG 0x01 +#define WPS_WSC_STATE_CONFIG 0x02 + +// Value of WPS Version Attribute +#define WPS_VERSION_1 0x10 + +// Value of WPS Configuration Method Attribute +#define WPS_CONFIG_METHOD_FLASH 0x0001 +#define WPS_CONFIG_METHOD_ETHERNET 0x0002 +#define WPS_CONFIG_METHOD_LABEL 0x0004 +#define WPS_CONFIG_METHOD_DISPLAY 0x0008 +#define WPS_CONFIG_METHOD_E_NFC 0x0010 +#define WPS_CONFIG_METHOD_I_NFC 0x0020 +#define WPS_CONFIG_METHOD_NFC 0x0040 +#define WPS_CONFIG_METHOD_PBC 0x0080 +#define WPS_CONFIG_METHOD_KEYPAD 0x0100 +#define WPS_CONFIG_METHOD_VPBC 0x0280 +#define WPS_CONFIG_METHOD_PPBC 0x0480 +#define WPS_CONFIG_METHOD_VDISPLAY 0x2008 +#define WPS_CONFIG_METHOD_PDISPLAY 0x4008 + +// Value of Category ID of WPS Primary Device Type Attribute +#define WPS_PDT_CID_MULIT_MEDIA 0x0008 +#define WPS_PDT_CID_RTK_WIDI 0x001E + +// Value of Sub Category ID of WPS Primary Device Type Attribute +#define WPS_PDT_SCID_MEDIA_SERVER 0x0005 +#define WPS_PDT_SCID_RTK_DMP 0x0001 + +// Value of Device Password ID +#define WPS_DPID_PIN 0x0000 +#define WPS_DPID_USER_SPEC 0x0001 +#define WPS_DPID_MACHINE_SPEC 0x0002 +#define WPS_DPID_REKEY 0x0003 +#define WPS_DPID_PBC 0x0004 +#define WPS_DPID_REGISTRAR_SPEC 0x0005 + + +// =====================P2P Section===================== +// For P2P +#define P2POUI 0x506F9A09 + +// P2P Attribute ID +#define P2P_ATTR_STATUS 0x00 +#define P2P_ATTR_MINOR_REASON_CODE 0x01 +#define P2P_ATTR_CAPABILITY 0x02 +#define P2P_ATTR_DEVICE_ID 0x03 +#define P2P_ATTR_GO_INTENT 0x04 +#define P2P_ATTR_CONF_TIMEOUT 0x05 +#define P2P_ATTR_LISTEN_CH 0x06 +#define P2P_ATTR_GROUP_BSSID 0x07 +#define P2P_ATTR_EX_LISTEN_TIMING 0x08 +#define P2P_ATTR_INTENTED_IF_ADDR 0x09 +#define P2P_ATTR_MANAGEABILITY 0x0A +#define P2P_ATTR_CH_LIST 0x0B +#define P2P_ATTR_NOA 0x0C +#define P2P_ATTR_DEVICE_INFO 0x0D +#define P2P_ATTR_GROUP_INFO 0x0E +#define P2P_ATTR_GROUP_ID 0x0F +#define P2P_ATTR_INTERFACE 0x10 +#define P2P_ATTR_OPERATING_CH 0x11 +#define P2P_ATTR_INVITATION_FLAGS 0x12 + +// Value of Status Attribute +#define P2P_STATUS_SUCCESS 0x00 +#define P2P_STATUS_FAIL_INFO_UNAVAILABLE 0x01 +#define P2P_STATUS_FAIL_INCOMPATIBLE_PARAM 0x02 +#define P2P_STATUS_FAIL_LIMIT_REACHED 0x03 +#define P2P_STATUS_FAIL_INVALID_PARAM 0x04 +#define P2P_STATUS_FAIL_REQUEST_UNABLE 0x05 +#define P2P_STATUS_FAIL_PREVOUS_PROTO_ERR 0x06 +#define P2P_STATUS_FAIL_NO_COMMON_CH 0x07 +#define P2P_STATUS_FAIL_UNKNOWN_P2PGROUP 0x08 +#define P2P_STATUS_FAIL_BOTH_GOINTENT_15 0x09 +#define P2P_STATUS_FAIL_INCOMPATIBLE_PROVSION 0x0A +#define P2P_STATUS_FAIL_USER_REJECT 0x0B + +// Value of Inviation Flags Attribute +#define P2P_INVITATION_FLAGS_PERSISTENT BIT(0) + + +// Value of Device Capability Bitmap +#define P2P_DEVCAP_SERVICE_DISCOVERY BIT(0) +#define P2P_DEVCAP_CLIENT_DISCOVERABILITY BIT(1) +#define P2P_DEVCAP_CONCURRENT_OPERATION BIT(2) +#define P2P_DEVCAP_INFRA_MANAGED BIT(3) +#define P2P_DEVCAP_DEVICE_LIMIT BIT(4) +#define P2P_DEVCAP_INVITATION_PROC BIT(5) + +// Value of Group Capability Bitmap +#define P2P_GRPCAP_GO BIT(0) +#define P2P_GRPCAP_PERSISTENT_GROUP BIT(1) +#define P2P_GRPCAP_GROUP_LIMIT BIT(2) +#define P2P_GRPCAP_INTRABSS BIT(3) +#define P2P_GRPCAP_CROSS_CONN BIT(4) +#define P2P_GRPCAP_PERSISTENT_RECONN BIT(5) +#define P2P_GRPCAP_GROUP_FORMATION BIT(6) + +// P2P Public Action Frame ( Management Frame ) +#define P2P_PUB_ACTION_ACTION 0x09 + +// P2P Public Action Frame Type +#define P2P_GO_NEGO_REQ 0 +#define P2P_GO_NEGO_RESP 1 +#define P2P_GO_NEGO_CONF 2 +#define P2P_INVIT_REQ 3 +#define P2P_INVIT_RESP 4 +#define P2P_DEVDISC_REQ 5 +#define P2P_DEVDISC_RESP 6 +#define P2P_PROVISION_DISC_REQ 7 +#define P2P_PROVISION_DISC_RESP 8 + +// P2P Action Frame Type +#define P2P_NOTICE_OF_ABSENCE 0 +#define P2P_PRESENCE_REQUEST 1 +#define P2P_PRESENCE_RESPONSE 2 +#define P2P_GO_DISC_REQUEST 3 + + +#define P2P_MAX_PERSISTENT_GROUP_NUM 10 + +#define P2P_PROVISIONING_SCAN_CNT 3 + +#define P2P_WILDCARD_SSID_LEN 7 +#define P2P_FINDPHASE_EX_CNT 3 + +#define P2P_PROVISION_TIMEOUT 5000 // 5 seconds timeout for sending the provision discovery request +#define P2P_GO_NEGO_TIMEOUT 5000 // 5 seconds timeout for receiving the group negotation response +#define P2P_TX_PRESCAN_TIMEOUT 100 // 100ms + +#define P2P_MAX_INTENT 15 + +#define P2P_MAX_NOA_NUM 2 + +// WPS Configuration Method +#define WPS_CM_NONE 0x0000 +#define WPS_CM_LABEL 0x0004 +#define WPS_CM_DISPLYA 0x0008 +#define WPS_CM_EXTERNAL_NFC_TOKEN 0x0010 +#define WPS_CM_INTEGRATED_NFC_TOKEN 0x0020 +#define WPS_CM_NFC_INTERFACE 0x0040 +#define WPS_CM_PUSH_BUTTON 0x0080 +#define WPS_CM_KEYPAD 0x0100 +#define WPS_CM_SW_PUHS_BUTTON 0x0280 +#define WPS_CM_HW_PUHS_BUTTON 0x0480 +#define WPS_CM_SW_DISPLAY_PIN 0x2008 +#define WPS_CM_LCD_DISPLAY_PIN 0x4008 + +enum P2P_ROLE { + P2P_ROLE_DISABLE = 0, + P2P_ROLE_DEVICE = 1, + P2P_ROLE_CLIENT = 2, + P2P_ROLE_GO = 3 +}; + +enum P2P_STATE { + P2P_STATE_NONE = 0, // P2P disable + P2P_STATE_IDLE = 1, // P2P had enabled and do nothing + P2P_STATE_LISTEN = 2, // In pure listen state + P2P_STATE_SCAN = 3, // In scan phase + P2P_STATE_FIND_PHASE_LISTEN = 4, // In the listen state of find phase + P2P_STATE_FIND_PHASE_SEARCH = 5, // In the search state of find phase + P2P_STATE_TX_PROVISION_DIS_REQ = 6, // In P2P provisioning discovery + P2P_STATE_RX_PROVISION_DIS_RSP = 7, + P2P_STATE_RX_PROVISION_DIS_REQ = 8, + P2P_STATE_GONEGO_ING = 9, // Doing the group owner negoitation handshake + P2P_STATE_GONEGO_OK = 10, // finish the group negoitation handshake with success + P2P_STATE_GONEGO_FAIL = 11, // finish the group negoitation handshake with failure + P2P_STATE_RECV_INVITE_REQ = 12, // receiving the P2P Inviation request + P2P_STATE_PROVISIONING_ING = 13, // Doing the P2P WPS + P2P_STATE_PROVISIONING_DONE = 14, // Finish the P2P WPS +}; + +enum P2P_WPSINFO { + P2P_NO_WPSINFO = 0, + P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1, + P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2, + P2P_GOT_WPSINFO_PBC = 3, +}; + +#define P2P_PRIVATE_IOCTL_SET_LEN 64 + +enum P2P_PROTO_WK_ID +{ + P2P_FIND_PHASE_WK = 0, + P2P_RESTORE_STATE_WK = 1, + P2P_PRE_TX_PROVDISC_PROCESS_WK = 2, + P2P_PRE_TX_NEGOREQ_PROCESS_WK = 3, +}; + +enum P2P_PS +{ + P2P_PS_DISABLE=0, + P2P_PS_ENABLE=1, + P2P_PS_SCAN=2, + P2P_PS_SCAN_DONE=3, + P2P_PS_ALLSTASLEEP=4, // for owner +}; + +// =====================WFD Section===================== +// For Wi-Fi Display +#define WFD_ATTR_DEVICE_INFO 0x00 +#define WFD_ATTR_ASSOC_BSSID 0x01 +#define WFD_ATTR_COUPLED_SINK_INFO 0x06 +#define WFD_ATTR_SESSION_INFO 0x09 + +// For WFD Device Information Attribute +#define WFD_DEVINFO_SOURCE 0 +#define WFD_DEVINFO_PRIARY_SINK 1 +#define WFD_DEVINFO_SECARY_SINK 2 +#define WFD_DEVINFO_SOURCE_PRIARY_SINK 3 + +#define WFD_DEVINFO_NO_COUPLED_SINK 0 +#define WFD_DEVINFO_COUPLED_SINK 4 + + + + +#endif // _WIFI_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h b/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h new file mode 100755 index 000000000000..72accaf04423 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/wlan_bssdef.h @@ -0,0 +1,445 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __WLAN_BSSDEF_H__ +#define __WLAN_BSSDEF_H__ + + +#define MAX_IE_SZ 768 + + +#ifdef PLATFORM_LINUX + +#define NDIS_802_11_LENGTH_SSID 32 +#define NDIS_802_11_LENGTH_RATES 8 +#define NDIS_802_11_LENGTH_RATES_EX 16 + +typedef unsigned char NDIS_802_11_MAC_ADDRESS[6]; +typedef long NDIS_802_11_RSSI; // in dBm +typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates +typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates + + +typedef ULONG NDIS_802_11_KEY_INDEX; +typedef unsigned long long NDIS_802_11_KEY_RSC; + + +typedef struct _NDIS_802_11_SSID +{ + ULONG SsidLength; + UCHAR Ssid[32]; +} NDIS_802_11_SSID, *PNDIS_802_11_SSID; + +typedef enum _NDIS_802_11_NETWORK_TYPE +{ + Ndis802_11FH, + Ndis802_11DS, + Ndis802_11OFDM5, + Ndis802_11OFDM24, + Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; + +typedef struct _NDIS_802_11_CONFIGURATION_FH +{ + ULONG Length; // Length of structure + ULONG HopPattern; // As defined by 802.11, MSB set + ULONG HopSet; // to one if non-802.11 + ULONG DwellTime; // units are Kusec +} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; + + +/* + FW will only save the channel number in DSConfig. + ODI Handler will convert the channel number to freq. number. +*/ +typedef struct _NDIS_802_11_CONFIGURATION +{ + ULONG Length; // Length of structure + ULONG BeaconPeriod; // units are Kusec + ULONG ATIMWindow; // units are Kusec + ULONG DSConfig; // Frequency, units are kHz + NDIS_802_11_CONFIGURATION_FH FHConfig; +} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; + + + +typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE +{ + Ndis802_11IBSS, + Ndis802_11Infrastructure, + Ndis802_11AutoUnknown, + Ndis802_11InfrastructureMax, // Not a real value, defined as upper bound + Ndis802_11APMode +} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; + + + + + +typedef struct _NDIS_802_11_FIXED_IEs +{ + UCHAR Timestamp[8]; + USHORT BeaconInterval; + USHORT Capabilities; +} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; + + + +typedef struct _NDIS_802_11_VARIABLE_IEs +{ + UCHAR ElementID; + UCHAR Length; + UCHAR data[1]; +} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; + + + +/* + + + +Length is the 4 bytes multiples of the sume of + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) ++ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) ++ sizeof (NDIS_802_11_RATES_EX) + IELength + +Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the +partial sum. + +*/ +#if 0 +typedef struct _NDIS_WLAN_BSSID_EX +{ + ULONG Length; + NDIS_802_11_MAC_ADDRESS MacAddress; + UCHAR Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity; + NDIS_802_11_SSID Ssid; + ULONG Privacy; + NDIS_802_11_RSSI Rssi; + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + ULONG IELength; + UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) +} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; + + +typedef struct _NDIS_802_11_BSSID_LIST_EX +{ + ULONG NumberOfItems; + NDIS_WLAN_BSSID_EX Bssid[1]; +} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; +#endif + +typedef enum _NDIS_802_11_AUTHENTICATION_MODE +{ + Ndis802_11AuthModeOpen, + Ndis802_11AuthModeShared, + Ndis802_11AuthModeAutoSwitch, + Ndis802_11AuthModeWPA, + Ndis802_11AuthModeWPAPSK, + Ndis802_11AuthModeWPANone, + Ndis802_11AuthModeMax // Not a real mode, defined as upper bound +} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; + +typedef enum _NDIS_802_11_WEP_STATUS +{ + Ndis802_11WEPEnabled, + Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, + Ndis802_11WEPDisabled, + Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, + Ndis802_11WEPKeyAbsent, + Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, + Ndis802_11WEPNotSupported, + Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, + Ndis802_11Encryption2Enabled, + Ndis802_11Encryption2KeyAbsent, + Ndis802_11Encryption3Enabled, + Ndis802_11Encryption3KeyAbsent +} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, + NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; + + +#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 +#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 +#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 + +#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 +#define NDIS_802_11_AI_RESFI_STATUSCODE 2 +#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 + +typedef struct _NDIS_802_11_AI_REQFI +{ + USHORT Capabilities; + USHORT ListenInterval; + NDIS_802_11_MAC_ADDRESS CurrentAPAddress; +} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; + +typedef struct _NDIS_802_11_AI_RESFI +{ + USHORT Capabilities; + USHORT StatusCode; + USHORT AssociationId; +} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; + +typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION +{ + ULONG Length; + USHORT AvailableRequestFixedIEs; + NDIS_802_11_AI_REQFI RequestFixedIEs; + ULONG RequestIELength; + ULONG OffsetRequestIEs; + USHORT AvailableResponseFixedIEs; + NDIS_802_11_AI_RESFI ResponseFixedIEs; + ULONG ResponseIELength; + ULONG OffsetResponseIEs; +} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; + +typedef enum _NDIS_802_11_RELOAD_DEFAULTS +{ + Ndis802_11ReloadWEPKeys +} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; + + +// Key mapping keys require a BSSID +typedef struct _NDIS_802_11_KEY +{ + ULONG Length; // Length of this structure + ULONG KeyIndex; + ULONG KeyLength; // length of key in bytes + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_KEY_RSC KeyRSC; + UCHAR KeyMaterial[32]; // variable length depending on above field +} NDIS_802_11_KEY, *PNDIS_802_11_KEY; + +typedef struct _NDIS_802_11_REMOVE_KEY +{ + ULONG Length; // Length of this structure + ULONG KeyIndex; + NDIS_802_11_MAC_ADDRESS BSSID; +} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; + +typedef struct _NDIS_802_11_WEP +{ + ULONG Length; // Length of this structure + ULONG KeyIndex; // 0 is the per-client key, 1-N are the global keys + ULONG KeyLength; // length of key in bytes + UCHAR KeyMaterial[16];// variable length depending on above field +} NDIS_802_11_WEP, *PNDIS_802_11_WEP; + +typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST +{ + ULONG Length; // Length of structure + NDIS_802_11_MAC_ADDRESS Bssid; + ULONG Flags; +} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; + +typedef enum _NDIS_802_11_STATUS_TYPE +{ + Ndis802_11StatusType_Authentication, + Ndis802_11StatusType_MediaStreamMode, + Ndis802_11StatusType_PMKID_CandidateList, + Ndis802_11StatusTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; + +typedef struct _NDIS_802_11_STATUS_INDICATION +{ + NDIS_802_11_STATUS_TYPE StatusType; +} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; + +// mask for authentication/integrity fields +#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f +#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 +#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 +#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 +#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E + +// MIC check time, 60 seconds. +#define MIC_CHECK_TIME 60000000 + +typedef struct _NDIS_802_11_AUTHENTICATION_EVENT +{ + NDIS_802_11_STATUS_INDICATION Status; + NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; +} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; + +typedef struct _NDIS_802_11_TEST +{ + ULONG Length; + ULONG Type; + union + { + NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; + NDIS_802_11_RSSI RssiTrigger; + }tt; +} NDIS_802_11_TEST, *PNDIS_802_11_TEST; + + +#endif //end of #ifdef PLATFORM_LINUX + +#ifndef Ndis802_11APMode +#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1) +#endif + +typedef struct _WLAN_PHY_INFO +{ + u8 SignalStrength;//(in percentage) + u8 SignalQuality;//(in percentage) + u8 Optimum_antenna; //for Antenna diversity + u8 Reserved_0; +}WLAN_PHY_INFO,*PWLAN_PHY_INFO; + +/* temporally add #pragma pack for structure alignment issue of +* WLAN_BSSID_EX and get_WLAN_BSSID_EX_sz() +*/ +#pragma pack(push) +#pragma pack(1) +typedef struct _WLAN_BSSID_EX +{ + ULONG Length; + NDIS_802_11_MAC_ADDRESS MacAddress; + UCHAR Reserved[2];//[0]: IS beacon frame + NDIS_802_11_SSID Ssid; + ULONG Privacy; + NDIS_802_11_RSSI Rssi;//(in dBM,raw data ,get from PHY) + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + WLAN_PHY_INFO PhyInfo; + ULONG IELength; + UCHAR IEs[MAX_IE_SZ]; //(timestamp, beacon interval, and capability information) +} WLAN_BSSID_EX, *PWLAN_BSSID_EX; +#pragma pack(pop) + +__inline static uint get_WLAN_BSSID_EX_sz(WLAN_BSSID_EX *bss) +{ + uint t_len; + + t_len = sizeof (ULONG) + + sizeof (NDIS_802_11_MAC_ADDRESS) + + 2 + + sizeof (NDIS_802_11_SSID) + + sizeof (ULONG) + + sizeof (NDIS_802_11_RSSI) + + sizeof (NDIS_802_11_NETWORK_TYPE) + + sizeof (NDIS_802_11_CONFIGURATION) + + sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + + sizeof (NDIS_802_11_RATES_EX) + //all new member add here + + sizeof(WLAN_PHY_INFO) + //all new member add here + + sizeof (ULONG) + + bss->IELength; + return t_len; + +} + +struct wlan_network { + _list list; + int network_type; //refer to ieee80211.h for WIRELESS_11A/B/G + int fixed; // set to fixed when not to be removed as site-surveying + unsigned long last_scanned; //timestamp for the network + int aid; //will only be valid when a BSS is joinned. + int join_res; + WLAN_BSSID_EX network; //must be the last item +#ifdef PLATFORM_WINDOWS + unsigned char iebuf[MAX_IE_SZ]; +#endif + +}; + +enum VRTL_CARRIER_SENSE +{ + DISABLE_VCS, + ENABLE_VCS, + AUTO_VCS +}; + +enum VCS_TYPE +{ + NONE_VCS, + RTS_CTS, + CTS_TO_SELF +}; + + + + +#define PWR_CAM 0 +#define PWR_MINPS 1 +#define PWR_MAXPS 2 +#define PWR_UAPSD 3 +#define PWR_VOIP 4 + + +enum UAPSD_MAX_SP +{ + NO_LIMIT, + TWO_MSDU, + FOUR_MSDU, + SIX_MSDU +}; + + +//john +#define NUM_PRE_AUTH_KEY 16 +#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY + +/* +* WPA2 +*/ + +#ifndef PLATFORM_OS_CE +typedef struct _PMKID_CANDIDATE { + NDIS_802_11_MAC_ADDRESS BSSID; + ULONG Flags; +} PMKID_CANDIDATE, *PPMKID_CANDIDATE; + +typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST +{ + ULONG Version; // Version of the structure + ULONG NumCandidates; // No. of pmkid candidates + PMKID_CANDIDATE CandidateList[1]; +} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST; + + +typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION +{ + NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; + NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported; + +} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION; + +typedef struct _NDIS_802_11_CAPABILITY +{ + ULONG Length; + ULONG Version; + ULONG NoOfPMKIDs; + ULONG NoOfAuthEncryptPairsSupported; + NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1]; + +} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY; +#endif + + +#endif //#ifndef WLAN_BSSDEF_H_ + diff --git a/drivers/net/wireless/rtl8192c/include/xmit_osdep.h b/drivers/net/wireless/rtl8192c/include/xmit_osdep.h new file mode 100755 index 000000000000..7d28d43a5378 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/include/xmit_osdep.h @@ -0,0 +1,90 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#ifndef __XMIT_OSDEP_H_ +#define __XMIT_OSDEP_H_ + +#include +#include +#include + +struct pkt_file { + _pkt *pkt; + SIZE_T pkt_len; //the remainder length of the open_file + _buffer *cur_buffer; + u8 *buf_start; + u8 *cur_addr; + SIZE_T buf_len; +}; + +#ifdef PLATFORM_WINDOWS + +#ifdef PLATFORM_OS_XP +#ifdef CONFIG_USB_HCI +#include +#include +#include +#endif +#endif + +#define NR_XMITFRAME 128 + +#define ETH_ALEN 6 + +extern NDIS_STATUS rtw_xmit_entry( +IN _nic_hdl cnxt, +IN NDIS_PACKET *pkt, +IN UINT flags +); + +#endif + + +#ifdef PLATFORM_LINUX + +#define NR_XMITFRAME 256 + +struct xmit_priv; +struct pkt_attrib; +struct sta_xmit_priv; +struct xmit_frame; +struct xmit_buf; + +extern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev); + +#endif + +void rtw_os_xmit_schedule(_adapter *padapter); + +int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz); +void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz); + +extern void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib); + +extern uint rtw_remainder_len(struct pkt_file *pfile); +extern void _rtw_open_pktfile(_pkt *pkt, struct pkt_file *pfile); +extern uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen); +extern sint rtw_endofpktfile (struct pkt_file *pfile); + +extern void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt); +extern void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe); + +#endif // + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu b/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu new file mode 100644 index 000000000000..a06cc73bce6a --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/ioctl_linux.uu @@ -0,0 +1,997 @@ +begin 644 os_dep/linux/ioctl_linux.o +M?T5,1@$!`0````````````$`*``!```````````````X:@``````!30````` +M`"@`$0`.`#`P0.)S,._F"0!3XS``0)(>_R^183!`XG,P[^8%`%/C5P!`DA[_ +M+Y%!,$#B(#`%/C"@`` +M&@`PH.,,*P'C`C"$YP(0H.,(*P'C`A"$YP,0H..@)P'C`A"$YP-`H.$<``#J +M`@`1XPD```H`,*#C#"L!XP(PA.@%P'C`2"$YP-`H.$0 +M``#J`0`1XPH```H(.P'C`S"4YP,`4^,)``"*`#"@XP@K`>,",(3GH",50.`#````"@!`H.,$`*#A$`"]Z![_+^$``*#C'O\O +MX>`RD.5L,)/E"``3XP(PH!,`,((5"P``&D``$^,!```:(``3XP(```H!,*#C +M`#""Y00``.H0`!/C`S"@$P`P@A4`,*`#`#""!0``H.,>_R_A!$`MY>!"D.5L +M,)3E`0`3XP8```IR-0'CTS"4X0`P8^(`,(+E`#"@XP0PPN4$``#J`#"@XP`P +M@N4$,,+E`3"@XP4PPN4``*#C$`"]Z![_+^$`,-#E``!3XP@```H!`%/A`P`` +M&@@``.H,`(#B`0!3X04```H,,-#E``!3X_G__QH``%/B`0"@$Q[_+^$!`*#C +M'O\OX>`2D.6I/:#CLS"1X0`P@N4``*#C!`#"Y1[_+^$$0"WEX$*0Y04PTN4` +M`%/C!```"BHI`.,$-`'C`R"$YP``H.,(``#J`#"2Y0$<0^(J*`#C`@!1X14` +MX(,!,,.3!"0!DP(PA)<``*"3$`"]Z![_+^'@$I#E!#0!XP,PD><`,(+E``"@ +MXP0`PN4>_R_A!S"@XP`P@N4``*#C!`#"Y0$PH.,%,,+E'O\OX0``H.,``(+E +M!`#"Y0$PH.,%,,+E'O\OX1!`+>D(T$WBX$*0Y0X`D^@`,(WE!`"@X?\_#^,/ +M,$#CU(0@+WH``#@XQ[_+^$``.#C'O\OX0`` +MH.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A<``MZ>!"D.4"8*#A8#4# +MXP,0E.,!,(,3``!3XQ5`X!,*```:`%"2Y0(`5>,`0*"# +M!4&$D`0PMI4$,(25`#``DP`P0),`():5!2&#EP!`H),$`*#A<`"]Z![_+^$` +M`*#C'O\OX0``H.,>_R_A``"@XQ[_+^$>_R_A'O\OX?!'+>D(T$WB`%"@X1,0 +MH.,'((WB"#4#XP_@H.$#\)#G!S#=Y0,`4^,``%,3`:"@`P*@H!,`8*#C!I"@ +MX3QU`^,`@.#C"P``Z@4`H.$&$*#A!""@X0@PH.$/X*#A!_"5YP%`A.(!#%3C +M]O__&@%@AN(*`%;A`0``J@E`H.'Q___J"-"-XO"'O>@``*#C'O\OX01`+>7@ +M0I#E;#"4Y0$`$^,'```:`#"@XP(F`^,",,3G`R8#XP(PQ.<$)@/C`C#$YPL` +M`.IT-0'C`Q#4YW8U`>,#(-3G!2D.4%`*#A +M!@"3Z/\_#^,/,$#C/,4#XP_@H.$,\)7G`%"@X00`H.$`$`#C`!!`XP4@H.'^ +M___K``"@XW"`O>CP3RWIJ=]-X@*0H.$#8*#AX+*0Y6H]#^/_/T_C`$"@XRHN +MC>*S0(+A:#T/X_\_3^.S0(+A(@Z-X@00H.&`(*#C_O__ZR``C>($$*#A`BR@ +MX_[__^L`$)GEM'#9X0W`H.%_/440(WE'&"-Y1QPC>(`@`#C`(!`XPR@ +MC>($4*#A`P``Z@P`5>,&```*!4"*YP10A>('`*#A"!"@X?[__^L`0%#B]O__ +M&@Q`G>4$`*#A`!``XP`00./^___K``!0XSP``!H+`*#A`!"@XX`@H.,B/HWB +M_O__ZP$`4.-'`0`:!@"@X0`0H.,$(*#C_O__ZP8`H.$8%9_E!B"@X?[__^L` +MH*#C#+6?Y0"``.,`@$#C!@"@X0L0H.$&(*#A"C"@X?[__^LB+HWB"E""X`5P +MH.$`0*#C!@"@X0@0H.$&(*#A`3#7Y/[__^L!0(3B"`!4X_?__QH&`*#AO!2? +MY08@H.'^___K!@"@X0@0H.$&(*#A"##5Y?[__^L!0(3B`5"%XA``5./V__\: +M!@"@X8P4G^4&(*#A_O__ZQ"@BN*``%KCVO__&@8`H.'^___KM`#)X0``H.,4 +M`0#J!`"@X0`0`.,`$$#C_O__ZP``4.-!```:$`"=Y0``4.,*`0`*%$"=Y0`` +M5.,'`0`*&%"-X@40H.$0(*#C_O__ZP!PH.$$`*#A!1"@X0H@H./^___K<%#_ +MY@``5>/[```*=W#_YFI-#^/_3T_C`!"@XP`0C>4+`*#A`R"@XRK.C>($,(S@ +M_O__ZP6`H.$',(7@*BZ-XK1`DN$$`%/AZ0``R@L`H.$'$*#A!2"@X2(^C>+^ +M___K!@"@X0`0H.,$(*#C_O__ZP!`H..<4Y_E(GZ-XIBCG^4)``#J!@"@X040 +MH.$&(*#A!##7Y_[__^L&`*#A"A"@X08@H.'^___K`4"$X@@`5.'S__^Z!@"@ +MX?[__^L!`(#BM`#)X0``H./,``#J!`"@X0`0`.,`$$#C_O__ZP``4.,P```: +M(#"-X@`PC>4+`*#A`!"@XP$@H.$"/*#C_O__ZP``4..Z```*!@"@X0`0H.,$ +M(*#C_O__ZP!`H.,`4`#C`%!`XR!PC>(`H`#C`*!`XP"``.,`@$#C!@"@X040 +MH.$&(*#A!##7Y_[__^L/,`3B#P!3XP0``!H&`*#A"!"@X08@H.'^___K!@`` +MZ@$``*#CE0``Z@0`H.$`$`#C`!!`X_[__^L``%#C,```&A!`G>4` +M`%3CBP``"A1`G>4``%3CB```"FI-#^/_3T_C`!"@XP`0C>4+`*#A`R"@XRK. +MC>($,(S@_O__ZRHNC>*T0)+A%0!4XWD``-H+`*#A%A"@XP8@H.,B/HWB_O__ +MZP8`H.$`$*#C!""@X_[__^L`4*#CW'&?Y2).C>+8@9_E!@"@X0<0H.$&(*#A +M!3#4Y_[__^L&`*#A"!"@X08@H.'^___K`5"%X@8`5>/S__\:!@"@X?[__^NT +M`,GA``"@XUX``.H$`*#A`!``XP`00./^___K``!0XS```!H00)WE``!4XU0` +M``H40)WE``!4XU$```IJ30_C_T]/XP`0H.,`$(WE"P"@X0,@H.,JSHWB!#", +MX/[__^LJ+HWBM$"2X0D`5.-"``#:"P"@X0H0H.,$(*#C(CZ-XO[__^L&`*#A +M`!"@XP0@H./^___K`%"@XP!QG^4B3HWB_("?Y08`H.$'$*#A!B"@X04PU.?^ +M___K!@"@X0@0H.$&(*#A_O__ZP%0A>($`%7C\___&@8`H.'^___KM`#)X0`` +MH.,G``#J!`"@X0`0`.,`$$#C_O__ZP``4.,4```::$T/X_]/3^,+`*#A*CZ- +MX@00@^#^___K"P"@X?[__^LJSHWBM$"$``*#C`@``Z@T`X.,```#J%0#@XZG?C>+PC[WH%````!P` +M```P````-````$````!,````\$$MZ0C03>(#@*#AX'*0Y0)@H.$`,*#C!#"- +MY0`0DN4-(*#A?SW"XS\PP^,(0)/E!%"1X@10U3``0*`S``!4XP,``!H$`(WB +M!""@X_[__^L"``#J!`"-X@00H./^___K8#4#XP,PE^4!`%/C"```&IPT +M`^,#,)?G``!3XQH```H'`*#A"1"@XS/_+^$`0*#C%@``Z@(`4^,(```:G#0# +MXP,PE^<``%/C#P``"@<`H.$*$*#C,_\OX0!`H.,+``#J`P!3XP@``!J<-`/C +M`S"7YP``4^,$```*!P"@X0P0H.,S_R_A`$"@XP```.H`0*#C!`"@X0C0C>+P +M@;WH\$4MZ:G?3>+@HI#E`$"@XPQ`C>400(WE%$"-Y6HM#^/_+T_C*AZ-XK)` +M@>$<,(WE'&"-X@!P`.,`<$#C#("-X@,``.H,`%3C!@``"@10B.<$0(3B!@"@ +MX0<0H.'^___K`%!0XO;__QH,0)WE!`"@X0`0`.,`$$#C_O__ZP``4.,O```: +M$`"=Y0``4..]```*%%"=Y0``5>.Z```*&!"-XA`@H./^___K`("@X04`H.'^ +M___KH'"PX0!@H!,B3HT2M```"@0``.H"`%7E`1!5Y?[__^L&`,3G`6"&X@)0 +MA>('`%;A]___.GA0[^9J30_C_T]/XP`0H.,`$(WE"@"@X0,@H.,JSHWB!#", +MX/[__^L',(7@*AZ-XK1`D>$$`%/AG```B@H`H.$%$*#A=R#_YB(^C>+^___K +M``!0XY4```J2``#J!`"@X0`0`.,`$$#C_O__ZP``4.,B```:$`"=Y0``4..' +M```*%%"=Y0``5>.$```*&!"-XA`@H./^___K`("@X04`H.'^___KH'"PX0!@ +MH!,@0(T2?@``"@0``.H"`%7E`1!5Y?[__^L&`,3G`6"&X@)0A>('`%;A]___ +M.B`PC>(`,(WE"@"@X0$0H.-X(._F=S#_YO[__^L``%#C;```"FD``.H$`*#A +M`!``XP`00./^___K``!0XRP``!H04)WE``!5XUX```H40)WE``!4XUL```H% +M`*#A_O__ZZ!PL.%;```*!@!7XP!@H),B3HV25P``B@0``.H"`%7E`1!5Y?[_ +M_^L&`,3G`6"&X@)0A>('`%;A]___.FI-#^/_3T_C`!"@XP`0C>4*`*#A`R"@ +MXRK.C>($,(S@_O__ZQ8PA^(J'HWBM$"1X00`4^%```"*"@"@X180H.-W(/_F +M(CZ-XO[__^L``%#C.0``"C8``.H$`*#A`!``XP`00./^___K``!0XRH``!H0 +M0)WE``!4XRL```H44)WE``!5XR@```H$`*#A_O__ZZ!PL.$H```*!%"@X0!@ +MH.,B3HWB``#5Y0$0U>7^___K!@#$YP%@AN("4(7B!@!7X??__XIJ30_C_T]/ +MXP`0H.,`$(WE"@"@X0,@H.,JSHWB!#",X/[__^L*,(?B*AZ-XK1`D>$$`%/A +M#P``B@H`H.$*$*#C=R#_YB(^C>+^___K``!0XP@```H%``#J)`"?Y?[__^L` +M`*#C!```ZA4`X.,"``#J``"@XP```.H-`.#CJ=^-XO"%O>C$````\$`MZ130 +M3>("0*#AX&*0Y0`P`.,`,$#C`%#3Y0``5>,(```:`U"@X0`P`.,`,$#C!0"@ +MX0`0D^40(*#C_O__ZP`PH.,/,,7EM##4X1``4^-8``"*`!"4Y0T@H.%_/<+C +M/S##XPA0D^400)'B!4#4,`!0H#,``%7C!0``&@T`H.$0(*#C_O__ZP``4.,% +M```*2```Z@T`H.$0$*#C_O__ZPU`X.-$``#J````XP``0.,-$*#A_O__ZP`` +M4.,`0*`#/0``"@8`H.$-$*#A_O__ZP!`4.(X```:````XP``0.,`$`#C`!!` +MXPD@H./^___K`0!0XP@``!K(4)_E$'#5Y9@T`^,#<,;G!@"@X?[__^L14-7E +M13(#XP-0QN<`4`#C`%!`XPUPH.$%`*#A#1"@X1`@H./^___K`#"@XP\PQ>4- +M`*#A`!``XP`00.,)(*#C_O__ZP$`4.,7```:!@"@X0$0H./^___KG#0#XP,P +MEN<``%/C`@``"@8`H.$'$*#C,_\OX3Q0G^68-`/C`R#6YQ`@Q>4`<*#C`W#& +MYP8`H.'^___K13(#XP,@UN<1(,7E`W#&YP```.H-0.#C!`"@X130C>+P@+WH +M`````!!`+>E4,@/C`S"0Y_\TP^/_,,/C`0A3XR8```I(,@/C`S#0YP``4^,D +M```*53(#XP,PT.#3+03C8B!!XY+!@>#)#8#B&`"`XB$3@^#^___K +M`4"@XP(``.H`0*#C````Z@%`H.,$`*#A$("]Z/!!+>D(T$WB`&"@X0)0H.$# +M0*#A`P"@X0`0`.,`$$#C!""@X_[__^L``%#C)P``"K0@U>$$($+B$$,(3BX(*6Y0$@0N(!`%+C`P``"@(`4N,`<*`3"```&@,``.H`<-/E,'!' +MXG=P[^8#``#J``#3Y0$0T^7^___K`'"@X0H`5^,0``"*2#(#XP,PV.<'`%/A +M#```"@``5^,"(*`31S(#$P,@R!(`,*#C!#`BY00`A.(`$`#C`!!`X_[__^L$,)WE`0!3 +MXQ,``(I%(@/C`C#%YP$@H.-(,@/C`R#%YP`P`.,`,$#C`#"3Y8@B`^,"()7G +M9!"@XY$"`>#3+03C8B!!XY(!@>#)#87B&`"`XB$3@^#^___K!P``Z@(`4^,% +M```:!0"@X?[__^L``%#C`""@$T@R`Q,#(,47``"@XPC0C>+P@;WH$$`MZ>`" +MD.4&`)/H_O__ZP``H.,0@+WH\$$MZ1#03>+@8I#E`$"2Y71P_^946.?G!#"2 +MY0PPC>4D3*#A<4!$X@X`5.,$\9^7Q0``Z@P5``#H%P``8!4``.@7``!\%0`` +MH!4``.@7``#H%P``Z!<``.@7``#H%P``Z!<``.@7``#H%P``X!4```(`5>,( +M```*!`!5XPL```H!`%7CL```&@8`H.$'$*#A.*```:`2"@XW`U`>,# +M(,;G#$"=Y60`5.-D0*`C<34!XP-`QN>!``#J#`!5XT<```H&``"*!@!5XQ0` +M``H)`%7C(@``"@4`5>-X```:"@``ZMT`5>-'```*`@``BA$`5>-R```:0``` +MZNX`5>-0```*_0!5XVT``!IC``#J5PV&XA``@.+@$(;B_O__ZV<``.H+0(WB +M!@"@X100H.,$(*#A"#4#XP_@H.$#\);G#W`'X@MPS>4&`*#A%!"@XP0@H.$$ +M-0/C#^"@X0/PEN=7``#J_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y5>- +MAN(@@(CB`'"@XZ]?A^*%48;@`$"8Y0```.H`0)3E!0"@X000H.'^___K``!0 +MX_G__PH!<(?B"("(XB``5^/Q__\:#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E +M_O__ZS<``.H&`*#A!A"@XPP@C>(0-0/C#^"@X0/PEN``#J#P!3XP8``!H&`*#A!Q"@XPL@C>(,-0/C#^"@ +MX0/PEN<5``#J!@"@X0<0H.,,((WB$#4#XP_@H.$#\);G!@"@X0<0H.,+((WB +M##4#XP_@H.$#\);G"```ZG=P[^8&`*#AQ1Z@XP<@H.'^___K!@"@X5@<`.,' +M(*#A_O__ZP``H.,0T(WB\(&]Z!!`+>G@0I#E`!#2Y445Q.4$`*#A_O__ZP$` +M4.,``.`3``"@`Q"`O>CP3RWI/-!-XN!2D.5@-0/C`S"5YP*0H.$!('+B`""@ +M,P``4^,",*`!`3""$P``4^,`0*`#'F"@`P4```J+``#J!@"@X?[__^L!0(3B +M90!4XP(```IL,)7E(@T3X_?__QH`(*#CMB#)X;0PV>$?`%/C?@``F@`0F>4- +M(*#A?SW"XS\PP^,(8)/E($"1X@9`U#``8*`S``!6XP4``!H,`(WB(""@X_[_ +M_^L``%#C!0``"FX``.H,`(WB(!"@X_[__^L50.#C;```ZO[__^L-(*#A?SW" +MXS\PP^,$()/E`2""X@0@@^6$0(7BA*"5Y0"PH.,L@(WB``.-Z`20H.$)`*#A +M"A"@X?[__^L!`%#C/```"@M`H.$,4(WB``#5Y;#Y_^L`<%#B$```N@$`]>6L +M^?_K`&!0X@P``+H!4(7B!V*&X01@R.<$`%3C`P``R@`PU>4Z`%/C!```&@%0 +MA>(!0(3B!@!4X^O__QI&``#J#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ +MZQ5`X.,Z``#JH&"%XI`@E>4&`*#A-!"-X@P@0N+^___K``!0XP4```HT0)WE +M``!4XP20G14!,*`3MC#)$0\``!J0()7E!@"@X300C>(,($+B_O__ZP``4.,% +M```*-$"=Y0``5.,$D)T5`B"@$[8@R1$"```:`*":Y;W__^H$D)WE#2"@X7\] +MPN,_,,/C!""3Y0$@0N($((/E_O__Z[0PV>$A`%/C$0``F@``F>4@`(#B#2"@ +MX7\]PN,_,,/C"%"3Y0%`D.(%0-0P`%"@,P``5>,$```:!A")X@$@H./^___K +M``!0XP$```H50.#C````Z@!`H.,$`*#A/-"-XO"/O>@*4*#A``"=Y2`0BN(& +M(*#C_O__ZP$`4./5__\:N?__ZO!'+>D(T$WB`D"@X>!BD.6T4-+A``!5XXT` +M``H`,)+E``!3XXH```JVD-+A!7"@X04`H.'^___K`(!0X@M`X`.$```*`!"4 +MY0T@H.%_/<+C/S##XPB@D^4'4)'@"E#5,`"@H#,``%KC!0``&@@`H.$'(*#A +M_O__ZP``4.-X```:!@``Z@``5^,$```*"`"@X0<0H.'^___K#4#@XW,``.H( +M4*#A`#"8Y2(`4^,50."#;@``B@A0B.(&`%/C-@``"@0``(H"`%/C!P``"@,` +M4^-*```:&@``Z@<`4^,W```*'P!3XT4``!H^``#J!#"5Y0(`4^,(```*!`!3 +MXPL```H!`%/C/0``&@8`H.$`$)7E_O__ZP@`A>4X``#J!@"@X0`0E>7^___K +M"`"%Y3,``.H&`*#A`!"5Y?[__^L(`(7E+@``Z@0PE>4"`%/C"```"@0`4^,+ +M```*`0!3XR<``!H&`*#A`!"5Y0@@U>7^___K(@``Z@8`H.$`$)7EN"#5X?[_ +M_^L=``#J!@"@X0`0E>4(()7E_O__ZQ@``.H&`*#A`!#5Y00@U>4`,.#C/,4# +MXP_@H.$,\);G"`"%Y0\``.H`$-7E!"#5Y0@PE>4`,(WE!@"@X0`PX./5S:#C +M#^"@X0SPEN<%``#J!@"@X2@0H.,`(*#C!#4#XP_@H.$#\);G>9#OY@``6>,7 +M```:``"4Y0T@H.%_/<+C/S##XPA0D^4'0)#@!4#4,`!0H#,``%7C!T"@$0,` +M`!H($*#A!R"@X?[__^L`0*#A``!4XP8```H#``#J%4#@XP0`H.$(T(WB\(>] +MZ`U`X.,```#J`$"@XP@`H.$'$*#A_O__Z_7__^IP0"WI`T"@X>`"D.4`$)/E +M_O__ZP!0H.$$`*#A`!``XP`00.,%(*#A_O__ZP``H.-P@+WH\$+@ +M4I#E`V"@X0`PH.,(,(WEO##-X0`PC>6T,,WA#0"@X080AN(&(*#C_O__ZP`P +MEN4!`%/C*P``&@T`H.$($(WB!B"@X_[__^L!`%#C40``"@!`H.,-<*#A!H"@ +MXW20[^8$H*#A!`.%X"8,@.()`(#B#1"@X0@@H.'^___K`0!0XP\``!H$HZ#A +M"@"%X"8,@.(/`(#B%!"&XA`@H./^___K"J"%X":LBN((H(KB`4"@XP!`RN4$ +MD(G@"#H"XP.0Q>((4(7B`#"@XP`PQ>4!0*#C$@``Z@%`A.(0`%3CY?__&@T``.H# +M`%/C"0``&B8,A>((`(#B`!"@XP$KH./^___K`""@XP@Z`N,#(,7G`4"@XP(` +M`.H`0*#C````Z@%`H.,$`*#A$-"-XO"'O>@(2@+C!`#5YP`#A>`F#(#B"0"` +MX@T0H.$&(*#C_O__ZP0`U><``X7@)@R`X@\`@.(4$(;B$""@X_[__^L$,-7G +M`S.%X"8\@^((,(/B`2"@XP`@P^4$,-7G`C"#X',P[^8$,,7G$`!3X^#__QJL +M___J<$`MZ0)`H.'@8I#E;""6Y0$`$N,'```:0``2XP4``!H``*#CM`#$X;8P +MU.$".8/CMC#$X7"`O>@&4-3E``!5XP0```H$`%7C%0#@@P%019("``":<("] +MZ*@G`>,"4);G`1"%XG$0_^:V$,3A#"L!XP(@EN<&`%+C`O&?ES4``.I0(``` +M/"```/@@```\(```X"```/@@``#@(`````"@X[0`Q.$"&8'CMA#$X7"`O>A? +M+H7B"B""X@(AAN"T(-+AM"#$X0``4N,7```*!1*&X%]>A>(*4(7B!5&&X`,` +MH.%>'8'B+!"!X@0@E>7^___KMB#4X;8@Q.$(.P'C`S"6YP``4^,"*H(#MB#$ +M`0``H`-P@+T(`0!3XP``H!,!*8(#MB#$`0``H`-P@+WH``"@X[0`Q.$"&8'C +MMA#$X7"`O>@0,*#CM##$X0H;@>.V$,3A``"@XW"`O>@``*#CM`#$X0(9@>.V +M$,3A<("]Z!!`+>D``%/B!P``"@[`H..TP,+A`3"@X[8PPN$`$`#C`!!`XPP@ +MH.'^___K``"@XQ"`O>AP0"WI`E"@X>!"D.5L()3E`0`2XP(``!I``!+C`$#@ +M`P@```KH8)3EM&#%X0,`H.'L$(3B!B"@X?[__^L!,*#CMC#%X0!`H.,$`*#A +M<("]Z'!`+>G@4I#E`D"@X0$PH..R,,3@!`"@X0`0H.,&(*#C_O__ZVPPE>4! +M`!/C`P``&D``$^,!```:$``3XP0```H$`*#AX!"%X@8@H./^___K`P``Z@0` +MH.$`$*#C!B"@X_[__^L``*#C<("]Z/!!+>D@T$WB`F"@X0-PH.'@0I#E!`"- +MX@`0H.,<(*#C_O__Z[8PUN$""1/C#0``"@$@H.,,.P'C`R"$YP`PH..D)P'C +M`C"$Y_PG`>,",(3GH",",(3GI",",(3G&0`` +MZ@$)$^,,```*`""@XPP[`>,#((3G`3"@XZ`G`>,",(3GI",",(3G"@``Z@`PH.,,*P'C`C"$YZ`G`>,",(3GI",",(3G"%"-Y;0PUN$``%/C!@``"@4`4^,%,*"3#3"@@PPP +MC>4,,(/B!#"-Y1T``.H`,*#C##"-Y0$`6.,9```:J#,",(3G`T"@X1(``.H( +M,)WE`C&#XP@PC>4$4(WB#`"%X@<0H.$,()WE_O__ZP0`H.$%$*#A_O__ZP`` +M4.,$```:F#(#XP,PE.<``%/C7D#@`P````H`0*#C!`"@X2#0C>+P@;WH\$4;,,'EOC+1X3`P@^("`%/AS```B@0PD>4!`'/C +MR0``&K@@T>'_/P_C`P!2X<4``!HD,-'E`P!3X\(``(I>?8;B('"'X@Q0@>(% +M`*#A`!``XP`00./^___K``!0XT<``!H`(*#C##L!XP,@AN,(`H#@``"&X`0`@.(*$*#A"""5Y?[__^M?/HCB"C"# +MX@,QAN`(()7E!""#Y08`H.$'$*#A"""@X0`PH./^___K`$"@XWD``.J@-P'C +M`S"6YP(`4^-O```:;""6Y0@P`.,!,$#C`S`"X```4^-I```*5PV&XA``@.+@ +M$(;B_O__ZP"`4.)-```*!0"@X:P1G^7^___K``!0XP`PH!/H,(@5##L!XP,P +MEN<&`%/C!`!3$Z0W`0,#,)8'[#"(!1PPU.4!`%/C&P``&C!PA.*^(M3A$0Z( +MX@<0H.$0`%+C$""@(_[__^L%`*#A5!&?Y?[__^L``%#C"@``&O``B.(0$(?B +M"""@X_[__^L!#(CB&!"'X@@@H./^___K`""@X_DZ`>,#(,;G!@"@X0@0H.$! +M(*#C_O__ZR$``.HD`-3E!@V`X@`"AN`P@(3BOB+4X00`@.(($*#A$`!2XQ`@ +MH"/^___K)`#4Y6$/@.(``H;@!`"`XA`0B.(((*#C_O__ZR0`U.5B#X#B``*& +MX`0`@.(8$(CB"""@X_[__^L!,*#C^"H!XP(PQN,#,);G!@!3XP0`4Q,&```:I#]Z`!`H.,```#J7D#@XP4`H.$)$*#A_O__ +MZ_;__^H4`0``'`$``/!'+>D`D*#A`J"@X0-@H.&VAP0"WI`%"@X0)`H.'@8I#EMC#2 +MX0,ZH.$C.J#A"@!3XP/QGY<*``#J%"H``!0J```4*@``%"H``&0I``",*0`` +MW"D``!0J```4*@``7"D``!0J``!>0.#C+```Z@`PDN4``%/C`2"@$R8\H!,# +M(,87`$"@$P!`H`,F/*`#`T#&!R(``.H,.P'C`S"6YP``4^,=```*`#"2Y0`` +M4^,:```*`2"@XPP[`>,#((;G`$"@XZ0W`>,#0(;G_#@-P'C`T"& +MYP@[`>,#0(;G#@``ZFPPEN4!`!/C!0``"@8`H.'^___K!@"@X?[__^L&`*#A +M_O__ZP4`H.$`$)3EC/7_ZP!`H.$```#J`$"@XP0`H.%P@+WH\$\MZ1303>(` +M8*#A`D"@X0`PH.,,,(WE"#"-Y0%0H.$#`%'A`!"@$P$0H`.``%+C`3"@D0$P +M@8,``%/C!@``"@`@H./P.`'C`R#`YP(`4>$"0*`1%4#@`\8``.H``%+C`$"@ +M`\,```H$L*#A!`"@X?[__^L`<%#B"T#@`[T```H'`*#A!1"@X0L@H.'^___K +M`P!4XP!`X)/#``":!%"@X0<`H.$$$*#A#""-X@@PC>+^___K`0!0XP4``!H" +M(*#CH#((,(WB_O__ZP$` +M4.,%```:`B"@XZ`W`>,#((;G!R"@XP@[`>,#((;G#%"=Y0%01>(/`%7C!?&? +MES$``.I\*P``F"L```0L``#L*P``!"P```0L```$+```M"L```0L```$+``` +M!"P```0L```$+```!"P```0L``#0*P```""@X_PW`>,#((;G`2"@XPP[`>,# +M((;G&@``Z@$@H./\-P'C`R"&YP`@H.,,.P'C`R"&YQ,``.H"(*#C_#,#((;G!B"@XPP[`>,#((;G!0`` +MZ@4@H./\-P'C`R"&YP`@H.,,.P'C`R"&YPA0G>4!4$7B#P!5XP7QGY,#((;G!""@ +MXPP[`>,#((;G/0``Z@0@H..D-P'C`R"&YP8@H.,,.P'C`R"&YS8``.H%(*#C +MI#,#(,;G`#``XP`P0.,` +M,)/E!#"-Y2X``.H%@*#A!:"'X``PVN7=`%/C%@``&@(`A>(``(?@!!"-X@0@ +MH./^___K`0!0XP\``!H!0*#C"H"@X00@VN<"((+B`@Q2XP(LH*/T.@'C`R"& +MYV,-AN(Q`(#B"A"@X?[__^OP.`'C`T#&YP!`H.,5``#J"("'X`DPV.<",(/B +M`U"%X'50_^8%`%3AW/__B@!`H.,,``#J!`"@X130C>+PC[WH`""@X_`X`>,# +M(,;G`#``XP`P0.,`,)/E!#"-Y0!0H.,!D*#CS?__Z@<`H.$+$*#A_O__Z^[_ +M_^H00"WIX`*0Y0,0H.&T(-+A"___ZQ"`O>CP12WI#-!-X@)0H.$`,*#C!#"- +MY>!BD.6R,,WA`3#-Y6PPEN4!`!/C`@``&D``$^,``.`#60``"E`QEN46#H;B +M+1"@XP0@C>(,,$/B_O__ZP!P4.(0```*!$"=Y0``5.,-```*!T"@X0(`C>(% +M$(?B`B"@X_[__^L",/3E`2#4Y0(T@^'3H.#G8``3XP!PH`,!<*`3`8"@XP(` +M`.H`<*#C!Z"@X0>`H.$\,=;E`2!#XG(@[^;]`%+C`$"@@PP``(H&(*#A`$"@ +MXP0`H.%_,`/B!`!3X0-`H"$$`,7E/3'2Y0$@@N(!$$/B<1#OYOT`4>/U__^: +M`0!8XR,``!H&`*#A$Q"@XP$@C>((-0/C#^"@X0/PEN+PA;WH +M<$`MZ2#03>+@8I#E`$"2Y03@TN4-P*#A,#&?Y0\`D^@'`*SH`##,Y0$`=.,P +M```*I$*@X<4Z!>-\.D#CDR2#X*,SH.%N`%/C!5"@`RD```H/``"*-P!3XP)0 +MH`,E```*!0``B@H`4^,`4*`#(0``"A0`4^,>```:%0``ZCP`4^,#4*`#&P`` +M"EH`4^,8```:$0``ZO``4^,(4*`#%0``"@4``(IX`%/C!E"@`Q$```JT`%/C +M#@``&@D``.I:#U/C"5"@`PL```H>#E/C"```&@4``.H!4*#C!@``Z@10H.,$ +M``#J!U"@XP(``.H*4*#C````Z@M0H.,`0*#C#0"@X1`0C>(`P.#C!##0YP4` +M4^$$P,$7`@``&@0PP><``%[C`@``"@%`A.(-`%3C]?__&@8`H.$0$(WB_O__ +MZP$`4.,``*`#``#@$R#0C>)P@+WH!````/!%+>DLT$WB`E"@X0-@H.'@0I#E +M!`"@X?[__^L``%#C2```"J`U`^,#,)3G``!3XT0```JT@-7A(`!8XP9`X(-# +M``"*;#"4Y1``$^,]```:"#L!XP.@E.>V,-7A``!3XSH```H``%CC.```"B`` +M6.,@@*`C!%"-X@4`H.$`$*#C)""@X_[__^LH<(WB)(`GY00`A>(&$*#A"""@ +MX?[__^N$8(3BA#"4Y7@PA.4$<(?B!@"@X7@0E.7^___K`0!0XQ@```IX4)3E +M!0"@X2PPD.1X,(3E!Q"@X00@G>7^___K`0!0X_'__QHH()7E!#"=Y0,`4N'M +M__\:;#"4Y2``$^,#```*>""5Y3@QE.4#`%+AYO__&@0`H.%X$)7E_O__ZP`` +M4.,'```*!`"@X0H0H.'^___K!`"@X000C>+^___K``!0XP$``!H`0.#C```` +MZ@!`H.,$`*#A+-"-XO"%O>CP0"WI#-!-X@)@H.'@0I#E`#"@XP0PC>5L,)3E +M00`3XT\```I0,93E%@Z$XBT0H.,$((WB##!#XO[__^L``%#C`'"@`P(```H$ +M4)WE`'!5X@%PH!-/7X3B!0"@X?[__^L!`%#C#0``&@$`5^,%```:!@"@X1`0 +MH.,`(`#C`"!`X_[__^L[``#J!@"@X1`0H.,`(`#C`"!`X_[__^LU``#J!0"@ +MX?[__^L!`%#C#0``&@$`5^,%```:!@"@X1`0H.,`(`#C`"!`X_[__^LI``#J +M!@"@X1`0H.,`(`#C`"!`X_[__^LC``#J)#&4Y0X`4^,-``":`0!7XP4``!H& +M`*#A$!"@XP`@`.,`($#C_O__ZQ@``.H&`*#A$!"@XP`@`.,`($#C_O__ZQ(` +M`.H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^___K"@``Z@8`H.$0$*#C`"`` +MXP`@0./^___K!```Z@(`H.$0$*#C`"``XP`@0./^___K``"@XPS0C>+P@+WH +M^$\MZ0-PH.'@0I#ECC^@X[0PPN$'`*#A`!"@XP,@H.'^___K0#L$XTPP0.,` +M,(?E9#"@XRPPQ^4M,,?E+C#'Y0(,0(3B)@!5X^O__QH3/J#CLV"'X3)AQ^4/,*#C-#*'Y3\PH.,/,,?E``"@ +MX_B/O>AP0"WI`E"@X>!"D.5L,)3E`0`3XPH```HD`93E_O__ZZ`V".,!,$#C +MDP`#X``PA>4!,*#CM##%X20QE.4&,,7E"0``ZI8'U.7^___KH#8(XP$P0..3 +M``/@`#"%Y0$PH..T,,7AEC?4Y08PQ>4``*#C<("]Z/!/+>G%WTWB`K"@X0-0 +MH.$`,*#C]#*-Y0(LC>*R.\+A%3L(X_\_3^.^/\+A`3"@XP,LC>*P,,+A`PR- +MX@(`@.(@$(OB!B"@X_[__^L48(7B.#.=Y08`4^$+``":,4Z-XA0@H..T(63A +M!0"@X000H.$$(*#C_O__ZP0`A>($$(3B$""@X_[__^L&4*#A*`"+XO[__^L` +M`%#C(```"AL["./_/T_C`BR-XKX_PN$!,*#C`RR-XK8PPN&X`X,YWE!`!3X1```)HQ;HWBM'%FX01PH.,%`*#A!A"@ +MX0<@H.'^___K!P"%X`@0AN('(*#A_O__ZP@`A>(L$(OB`SR-XK0@T^'^___K +M````Z@5`H.&@((OB"""-Y9`PF^4"`*#A+1"@X[TOC>(,,$/B_O__ZP!@4.(4 +M```*]%*=Y0``5>,1```*!E"@X2L.C>("`(#B!1"&X@(@H./^___K`C#UY0$@ +MU>4"-(/ATR#@YR0@C>5@`!/C`#"@`P$PH!,4,(WE`2"@XQ`@C>4#``#J`#"@ +MXQ0PC>4D,(WE$#"-Y0$["./_/T_C`BR-XKX_PN%\4(OB!0"@X?[__^L!`%#C +M#@``&A`PG>4!`%/C!0``&@,,C>(0$*#C`"``XP`@0./^___K.```Z@,,C>(0 +M$*#C`"``XP`@0./^___K,@``Z@4`H.'^___K`0!0XPX``!H0()WE`0!2XP4` +M`!H##(WB$!"@XP`@`.,`($#C_O__ZR4``.H##(WB$!"@XP`@`.,`($#C_O__ +MZQ\``.ID,)OE#@!3XPX``)H0,)WE`0!3XP4``!H##(WB$!"@XP`@`.,`($#C +M_O__ZQ,``.H##(WB$!"@XP`@`.,`($#C_O__ZPT``.H0()WE`0!2XP4``!H# +M#(WB$!"@XP`@`.,`($#C_O__ZP0``.H##(WB$!"@XP`@`.,`($#C_O__ZQ1@ +MA.(X,YWE!@!3X0L``)HQ7HWB%""@X[0A9>$$`*#A!1"@X00@H./^___K!`"$ +MX@00A>(0(*#C_O__ZP9`H.$'.PCC_S]/XP(LC>*^/\+AE#"+X@PPC>4#`*#A +M_O__ZP`0H.&^#XWB`@"`X@(@H./^___K`BR-XKH_TN$#`!/C%0``"@$`$^,# +M,*`3`#.-%0$PH`,`,XT%")"$XC@SG>4)`%/A#```FC%>C>(((*#CM"%EX01@ +MH.,$`*#A!1"@X08@H.'^___K!@"$X`80A>`&(*#A_O__ZP```.H$D*#A9#"; +MY0``4^,!,*`#9#"+!04["./_/T_C`BR-XKX_PN%D`)OE_O__ZZ`V".,!,$#C +MDP`#X``SC>4!,*#C`RR-XK0PPN%D,)OE!C/-Y0Q0B>(X,YWE!0!3X0L``)HQ +M3HWB#""@X[0A9.$)`*#A!!"@X00@H./^___K!`")X@00A.(((*#C_O__ZP60 +MH.$K.PCC_S]/XP(LC>*^/\+AND_2X1``%.,".Z`3`RR-$K8PPA$".:`#`RR- +M`K8PP@$`,*#C`RR-XK0PPN$(4(GB.#.=Y04`4^$1``":,4Z-X@@@H..T(63A +M!&"@XPD`H.$$$*#A!B"@X?[__^L&`(G@"!"$X@8@H.'^___K!0"@X2P0B^(# +M/(WBM"#3X?[__^L%D*#AK8^-X@@`H.%`$*#C`"``XP`@0./^___K?"#;Y0`` +M4N,`<*`#(P``"JU/C>(`0(3@"U"@X0!PH.-`@(CB`#``XP`P0.,8,(WE`#`` +MXP-@H.$`8$#C`*``XP"@0.,4&D*#A?V`"X@<`5N$&<*`A +M"!!DX*8PH.$!`!+C"2"@`0L@H!$`((WE!`"@X0H@H.'^___K?2#5Y0%0A>(` +M`%+C`$"$$.[__QH4!`%+C+P``&@(LC>*R.]+A`@D3XPP` +M``HD,)WE``!3XP0```H.<0#C%""=Y0``4N-+?Z`3(@``ZA0PG>4``%/CD'"@ +M$X)PH`,=``#J@``3XPH```HD()WE``!2XP,```H4,)WE``!3XQ0``!H/``#J +M%""=Y0``4N,.```:"0``ZB0PG>4``%/C`P``"A0@G>4``%+C"0``&@0``.H4 +M,)WE``!3XP,``!I!<*#C!```ZH=PH.,"``#J2'"@XP```.J6<*#CAW"@X2$[ +M"./_/T_C`BR-XKX_PN$`,*#C!3/-Y00SS>4@,0KC!S!`XY,'`^``,XWE#%") +MXC@SG>4%`%/A"P``FC%.C>(,(*#CM"%DX0D`H.$$$*#A!""@X_[__^L$`(GB +M!!"$X@@@H./^___K!9"@X0`PH.,"+(WBL#O"X;PZPN&0$)OE2S^-X@`PC>4K +M/HWB!#"-Y0P`G>4L((WBJS^-XO[__^L"/(WBL$O3X0``5.-A```*BT^-X@0` +MH.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@#`(3H`BR-XK!+TN$``%3C$``` +M"B-NC>(#8(;B`$"@XP!P`.,`<$#C2X^-X@10H.$&`*#A!Q"@X04@V.?^___K +M`&"&X`%0A>("/(WBL$O3X04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_ +M/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WBM`##X0A0@.(%8(G@.".=Y08` +M4N$0``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B!2"@ +MX?[__^L(`(GBBQ^-X@,\C>*T(-/A_O__ZP:0H.&_#XWB`!"@XQ0@H./^___K +M!3P(X_\_3^,"+(WBOC_"X;!;TN$#/(WBM%##X0A0A>(%8(G@.".=Y08`4N$0 +M``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B!2"@X?[_ +M_^L(`(GB2Q^-X@,\C>*T(-/A_O__ZP:0H.$"+(WBO$K2X0``5.-A```*BT^- +MX@0`H.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@#`(3H`CR-XKQ*T^$``%3C +M$```"B-NC>(#8(;B`$"@XP!P`.,`<$#C+("-X@10H.$&`*#A!Q"@X04@V.?^ +M___K`&"&X`%0A>("+(WBO$K2X04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\ +M"./_/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WBM`##X0A0@.(%8(G@.".= +MY08`4N$0``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B +M!2"@X?[__^L(`(GBBQ^-X@,\C>*T(-/A_O__ZP:0H.&_#XWB`!"@XQ0@H./^ +M___K!3P(X_\_3^,"+(WBOC_"X;Q:TN$#/(WBM%##X0A0A>(%8(G@.".=Y08` +M4N$0``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B!2"@ +MX?[__^L(`(GB+!"-X@,\C>*T(-/A_O__ZP:0H.$`,*#CK#*-Y9"`F^4,@$CB +M`P!8X0`PH-,!,*##"""=Y0``4N,``%@3.P``V@``4^,Y```*`$"@XZNOC>(% +M/`CC_S]/XPPPC>6_+XWB""""XA`@C>4$4*#A%+"-Y0BPH.$(@)WE!7"@X05@ +MB.`&`*#A"A"@X?[__^L``%#C'P``"JQ"G>4"`%3C'```F@PPG>4"+(WBOC_" +MX;PZTN$#+(WBM##"X0@P@^((,(WE`T")X#@SG>4$`%/A$```F@@@G>4"/(WB +MO"_#X0D`H.&_'XWB!""@X_[__^L$`(GB$!"=Y00@H./^___K"`")X@80H.$# +M/(WBM"#3X?[__^L$D*#A!W"(X`$PU^4",(/B`U"%X`4`6^'2___*%+"=Y0$\ +M"./_/T_C`BR-XKX_PN%+,*#C`S/-Y5`PF^4!,\WEC##;Y0`SS>5C,.#C`C/- +MY0A@B>(X,YWE!@!3X0P``)HQ3HWB"""@X[0A9.$$4*#C"0"@X000H.$%(*#A +M_O__ZP4`B>`%$(3@!2"@X?[__^L&D*#A"0"@X<7?C>+PC[WH\$\MZ1S03>(4 +M$(WE#""-Y1`PC>7@DI#EM'#2X0=P@^"D,@/C`S#9YP``4^,$```*8#4#XP,P +MF><``%/C%4#@$S8``!K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/EA(") +MXH1`F>5YOHGB#+"+XA!@G>7_H@#C"`"@X000H.'^___K`0!0XQ8```H',&;@ +M"@!3X09`X-,3``#:!%"@X2@PE.4``%/C`$"4!?'__PH+`*#A9!"5Y?[__^L! +M`%#C!@``&@!PC>4)`*#A%!"=Y04@H.$&,*#AU?S_ZP!@H.$`0)3EX___Z@!` +MH.,-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K$#"=Y09@8^`,()WEM&#" +MX0`PH..V,,+A!`"@X1S0C>+PC[WH<$`MZ>!2D.4`0%/B#P``"K`PU.$``%/C +M`P``"@$`4^->0.`3#```&@0``.H%`*#A_O__ZP``4.,$```*!0``Z@4`H.'^ +M___K``!0XP$``!H`0.#C````Z@!`H.,$`*#A<("]Z/!'+>D"8*#AX$*0Y00` +MH.'^___K``!0XP0``!KP`)_E\!"?Y?[__^L`0.#C-@``ZJ`U`^,#,)3G``!3 +MXR\```JP,-;A`0!3XP0```K(`)_EP!"?Y?[__^L50.#C*@``Z@@[`>,#H)3G +MA'"$XH0PE.5X,(3E`F"&X@:`H.,'`*#A>!"4Y?[__^L!`%#C!0``&@0`H.$& +M$*#A_O__ZP``4.,6```*%P``ZGA0E.4%`*#A(#"0Y'@PA.4&$*#A"""@X?[_ +M_^L!`%#CZ___&@0`H.%X$)7E_O__ZP``4.,'```*!`"@X0H0H.'^___K!`"@ +MX080H.'^___K``!0XP$``!H`0.#C````Z@!`H.,$`*#A\(>]Z/0!```4```` +M$`(``#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@XQ`@H./^___K`3"@X[`PS>$" +M`(WB`!"@XP8@H./^___KF#4#XP,`E><5&PCC#2"@X0`PH./^___K%-"-XC"` +MO>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0(*#C_O__ZP$PH..P,,WA`@"- +MXN`0A>(&(*#C_O__ZY@U`^,#`)7G%1L(XPT@H.$`,*#C_O__ZQ30C>(P@+WH +M,$`MZ1303>(`4*#A#4"@X0T`H.$`$*#C$""@X_[__^N8-0/C`P"5YQD;".,- +M(*#A`#"@X_[__^L4T(WB,("]Z/!/+>DLT$WB`F"@X0-0H.'@0I#E!`"@X?[_ +M_^L``%#C@@``"F`U`^,#,)3G``!3XWX``!J@-0/C`S"4YP``4^-Z```*=34# +MXP,PU.<``%/C=@``"@PUU.4!`%/C`P``&@0`H.'^___K`$"@XW```.IL,)3E +M(@T3XP,```H$`*#A_O__ZP!`H.-I``#JM##6X4\/4^,?```:MC#6X0(`$^-B +M```*`6#5Y2``5N,@8*"C!'"-X@<`H.$`$*#C)""@X_[__^L$`(?B%!"%X@8@ +MH.'^___K!&"-Y?[__^L-,*#A?UW#XS]0Q>,$,)7E`3"#X@0PA>4$`*#A!Q"@ +MX?[__^L`0*#A!#"5Y0$P0^($,(7E_O__ZT(``.H+`%/C/0``F@4`H.$4$9_E +M#""@X_[__^L!`%#C-P``&K1PUN$,<$?B#&"%X@0`C>(`$*#C)""@X_[__^OH +M@)_E`Z"-X@*0C>((L(WB&0``Z@8`H.$($*#A"B"@X?[__^L#4-WE4P!5XQ0` +M`!H!8(;B`7!'XL=?Q^$&`*#A"!"@X0D@H.'^___K`6"&X@%01>("(-WE`@!5 +MX0,``+H$((WE"P"@X080H.'^___K`G#=Y0=@AN`%<&?@``!7X^/__\K^___K +M#3"@X7]=P^,_4,7C!#"5Y0$P@^($,(7E!`"@X000C>+^___K`$"@X00PE>4! +M,$/B!#"%Y?[__^L"``#J!`"@X?[__^L`0*#A``!4XP!`H!,````:`$#@XP0` +MH.$LT(WB\(^]Z"0````X`@``\$\MZ5G?3>(`L*#A$!"-Y0*`H.$4,(WEX)*0 +MY;1@TN$&H*#A!@"@X?[__^L`4%#B"T#@`W\!``H`$)CE#0"@X7\]P.,_,,/C +M"'"3Y09`D>`'0-0P`'"@,P``5^,%```:!0"@X08@H.'^___K``!0XPH```H$ +M``#J``!6XP<```H%`*#A!A"@X?[__^L%`*#A"A"@X?[__^L-0.#C90$`ZK8@ +MV.%F-PCC`P!2X0`PH!,!,*`#"`!6XP`PH-,``%/C%@``"@`P`.,`,$#C-#"3 +MY3PPC>4`,-7EW0!3XU$!`!H"`(7B/!"-X@0@H./^___K`0!0XTL!`!H"#%;C +M`FR@HQ4-B>('`(#B!1"@X08@H.'^___K2&>)Y0!`H.-"`0#J"P!6XP,``,H` +M`%;C`$"@PPT``,H5``#J!0"@X0`5G^4,(*#C_O__ZP$`4./U__\:"P"@X1`0 +MG>4((*#A!3"@X13__^L`0*#A+P$`Z@0PU>=A($/B(`(`#C`"!`XP,`DN@#(*#A!`""Y+`0PN'P+@_C_R]/XP40 +MH.,6#HWBLA"`X0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`00.,#(*#C_O__ +MZ[0``.H```#C``!`X_[__^M<,(WB`"``XP`@0.,#`)+H`R"@X00`@N0`$,+E +M\"X/X_\O3^,$$*#C%@Z-XK(0@.$+`*#A`AP(XTP@C>+^___K!0"@X0`0`.,` +M$$#C`R"@X_[__^L`,`#C`#!`XQ1`D^4"`%3CEP``&@-`H.$8`(/B_O__ZP$P +MH.,4,(3ED0``ZFPPF>4!`!/C!@``"@4`H.$`$`#C`!!`XW(U`>/3()GA_O__ +MZX<``.H%`*#A`!``XP`00.,#(*#C_O__ZX$``.H+`*#A$!"=Y2P@C>(4,)WE +MN?C_ZP``4.,`0*`3+""=!8,^#0,;,T0#DQ+#`,(OH`%#26(`!0"@X0`0`.,` +M$$#C!""@X?[__^MN``#J0!&;Y0`@T>4!,-'E`@#1Y0``C>4#`-'E!`"-Y00` +MT>4(`(WE!1#1Y0P0C>4%`*#A`!``XP`00./^___K7@``Z@$PH.-&-4%`*#A`!``XP`00.,#(*#C +M_O__ZTX``.H\0(WB!0"@X0`0`.,`$$#C!""@X?[__^L$`*#A`!``XP`00./^ +M___K``!0XP`PH`-(,(T%#@``"CP`C>(`$`#C`!!`X_[__^L``%#C`C"@`T@P +MC04&```*/`"-X@`0`.,`$$#C_O__ZP``4.,%,*`#2#"-!0`P`.,`,$#C2$"= +MY0!`P^4<0(WB!`"@X4@0C>($(*#C_O__ZPL`H.$0$)WE!""@X10PG>7@\O_K +M!0"@X0`0`.,`$$#C`R"@X_[__^L=``#J`#``XP`P0.,`,-/E``!3XP4```H" +M`%/C#4"@`P,```H%`%/C#D"@`P````H+0*#C!0"@X0`0`.,`$$#C!""@X?[_ +M_^L`,`#C`#!`XP```.,``$#C!!"@X0`@T^7^___K!```Z@4`H.$`$`#C`!!` +MXP,@H./^___K`)"8Y;1`V.$%`*#A_O__ZP%P@.)W@D````,````'!`+>D"4*#AX$*0Y00`H.'^___K``!0XP!`H`,?```*=34# +MXP,PU.<``%/C&@``"@`PE>4#`%/C`_&?EP,``.KH30``X$T``/A-``#P30`` +M%4#@XQ$``.H`4*#C!```Z@)0H.,"``#J!%"@XP```.H!4*#C!`"@X040H.'^ +M___K``!0XP0```H$`*#A!1"@X?[__^L`0*#C````Z@!`X.,$`*#A<("]Z/!' +M+>D`D*#A`:"@X0)PH.$#@*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#*0`` +M"A0`H./^___K`&!0X@0``!H%`*#A'!"@X_[__^L`0*#C(```Z@8`H.$`$*#C +M%""@X_[__^L!@,;E`'#&Y0$PH.,#,,;E`7!'XG=P[^8$`%?C$%"@@P`P`),` +M,$"3!W"#D#A0UY4$`(;B"A"@X04@H.'^___K%#"@X[`PQ.$$8(3E"#"$Y0`P +MH.,,,(3E$#"$Y10`A.+^___K2PV)X@00H.'^___K`$"@X00`H.'PA[WH$$`M +MZ04@0N)R(._F"`!2XP!`H(,`P`"3`,!`DP(@C)!`0-*5!""@X;S__^L0@+WH +M\$\MZ1303>(`8*#A`5"@X?P[".,#`%+AFP``"OX[".,#`%+A7D#@$Z8#`!JT +M`='A/P!0XY$``)H0,)'E``!3XXX```K^___K`("@X0"@H.$``%#C"V#@`XD` +M``H0$)7EM)'5X0T@H.%_/<+C/S##XPAPD^4)0)'@!T#4,`!PH#,``%?C!``` +M&@D@H.'^___K``!0XPD```H#``#J``!9XP8```H)$*#A_O__ZP@`H.&T$=7A +M_O__ZPU@X.-P``#J`#":Y0$P0^(#`%/C`_&?EP,``.HL4```Y%```/Q0```4 +M40``7F#@XTT``.H0$)KEX$*6Y0PPVN4'`%/C"```BMPPVN$!(*#C$C.@X=P` +M$^,A```:(``3XQL``!H"`!/C`0``&EY@X.,]``#J`B"@XZ`W`>,#((3G_Q`! +MX@$`4>,"```*`@!1X1,``!H&``#J!#"@XP@K`>,",(3G#"L!XP(PA.<`8*#C +M+0``Z@<@H.,(.P'C`R"$YP8@H.,,.P'C`R"$YP!@H.,E``#J!@"@X=KK_^L` +M8*#A(0``Z@!@H.,?``#JX`*6Y3`0BN*\(-KA2O;_ZP!@H.$9``#J!@"@X0H0 +MH.&T(=7AQ_3_ZP!@H.$3``#JX$*6Y0PPFN4!`%/C`P``"@(`4^->8.`3#``` +M&@0``.H$`*#A_O__ZP``4.,$```:!0``Z@0`H.'^___K``!0XP$```H`8*#C +M````Z@!@X.,``%;C$```&A``E>6TD=7A#2"@X7\]PN,_,,/C"'"3Y0E`D.`' +M0-0P`'"@,P``5^,#```:"A"@X0D@H.'^___K`)"@X0``6>,-8.`3"`"@X;01 +MU>'^___K````ZA5@X.,&0*#A#@,`ZN`BMN5U-0/C`S#2YP``4^,`0.`#"`,` +M"A`PD>4``%/C%4#@`P0#``JT`='A_O__ZP"PH.$`<*#A``!0XPM`X`/]`@`* +M$!"5Y;2!U>$-(*#A?SW"XS\PP^,(H)/E"$"1X`I`U#``H*`S``!:XP0``!H( +M(*#A_O__ZP``4.,)```*`P``Z@``6.,&```*"!"@X?[__^L+`*#AM!'5X?[_ +M_^L-0.#CY`(`Z@`PE^4!,$/B$@!3XP/QGY<2``#JW%(``/A2``#44P``U%(` +M`)Q;``"@5```U%(``-12``#44@``U%(``-12``#44@``U%(``-12``#44@`` +M.%0``"Q<``#,7```0%T``%Y`X..T`@#J`$"6Y00`H.'^___K!`"@X?[__^L` +M0*#AK0(`Z@!@EN5L,);E$0`3XS````H$,)?E`0!SXP,``!JX(-?A`3B#X@,` +M4N$I```*5PV&XA``@.($$(?B_O__ZP!`4.(+0.`#FP(`"A"`E^6\,-?AU#"$ +MY1,.A.(4$(?B$""@X_[__^L"#!CC`3"@$]PPA!4`,*`#W#"$!<`TEN4``%/C +MW#"$!0(+&.,`,*`#&#:$!0<```H!,*#C&#:$Y=PPA.5C#H3B`P"`X"00A^(: +M(*#C_O__Z\PTEN4``%/C&#:$!08`H.$$$*#A_O__ZP!`H.-X`@#J%4#@XW8" +M`.H`8);E;#"6Y1$`$^,2```*!#"7Y0$`<^,#```:N"#7X0$X@^(#`%+A"P`` +M"E<-AN(0`(#B!!"'XO[__^L`0%#B`$"@`V0"``H&`*#A!!"@X?[__^L`0*#C +M7P(`ZA5`X.-=`@#JM('5X0!@EN5L,);E$``3XQ(```J81P'C!`"&X`P0A^(" +M(*#C_O__Z[0PEN$!,$/BN(`,*`S`P!8XP$P@X,``%/C-`(` +M&@``6N,`0*`##0``"@4`6N,%H*"3#:"@@PR0BN()`*#A_O__ZP!`4.(G`@`* +M!`"@X0`0H.,<(*#C_O__ZPB@A.4`D(3E!("$Y0R0A.()`*#A,!"'X@@@E.7^ +M___K'##7Y0``4^,A```*`""@XPP[`>,#((;G`3"@XZ0G`>,",(;G6"""X@(P +MAN<(,)3E#0!3XP4PH`-8($("`C"&!U@@@@(",(8'J#,(`H#@``"&X`0`@.()$*#A"""4Y?[__^M? +M/HCB"C"#X@,QAN`(()3E!""#Y08`H.$,$(3B""#4Y0@PH.$<_O_K-P$`Z@`` +M4^-K```*;#"6Y1``$^-H```*'##7Y0$`4^/<`0`:``!0XQ$```HD`-?E!@V` +MX@`"AN"^(M?A!`"`XC`0A^(0`%+C$""@(_[__^L!(*#C_#^,M?A +M#0!3XP0@@@+\-P$#`R"&!S@``.H$`*#A,!>?Y?[__^L``%#C'@``&@(@H./\ +M-P'C`R"&YR0`U^4#B``*&X#!`A^*^(M?A!`"`X@00H.$0`%+C$""@(_[_ +M_^LD`-?E80^`X@`"AN`$`(#B$!"$X@@@H./^___K)`#7Y6(/@.(``H;@!`"` +MXA@0A.(((*#C_O__ZP$@H./Y.@'C`R#&YQ0``.H$`*#AI!:?Y?[__^L``%#C +M#```&@0@H./\-P'C`R"&YR0`U^4#B``*&X+XBU^$$`(#B,!"'XA``4N,0 +M(*`C_O__ZP(``.H`(*#C_#_/T/B`R"6YU@P0^(#((;G!@"@X3`0A^)R(._F)##7Y7_]_^L&`*#A_O__ +MZP"`4.)\`0`*`$"@X^A`B.7\-P'C`S"6Y^PPB.55`0#JH#```*%P"@X_[__^L`H%#B`P``&@D` +MH.$<$*#C_O__ZQ8``.H4`(GB_O__ZQ4PH..P,,GA!*")Y140,(GE[#"8Y08PRN4*`*#AX!"(X@8@H./^___K!P"*XA$>B.(0(*#C +M_O__ZTL-AN()$*#A_O__ZP!`H./H0(CE\0``Z@``4.,1```*)`#7Y08-@.(` +M`H;@OB+7X00`@.(P$(?B$`!2XQ`@H"/^___K`2"@X_PW`>,#((;GOC+7X0T` +M4^,$((("_#,#((;G)"#7Y08[H.,#((;G`2"@X[X_@^(#(,;G +MOS]#X@,@EN=8,$/B`R"&YP8`H.$P$(?B&>$Y0``4.,,```*#A"'X@8@H.'^___K +M!`"@X=T0H.,,((WB`3"@X_[__^L!(*#CN#(!XP,@Q.<`0*#C.@``ZA5`X.,X +M``#JM#'5X0!`EN5L()3E$``2XQ4```H.8$/B<`>4Y0``4.,#```*?!>4Y?[_ +M_^L`,*#C<#>$Y0``5N,`0*#3*```V@8`H.'^___K<`>$Y7QGA.4``%#C!``` +M"@X0A^(&(*#A_O__ZP!`H.,=``#J%4#@XQL``.JT,=7A`$"6Y6P@E.40`!+C +M%0``"@Y@0^)T!Y3E``!0XP,```J`%Y3E_O__ZP`PH.-T-X3E``!6XP!`H-,+ +M``#:!@"@X?[__^MT!X3E@&>$Y0``4.,$```*#A"'X@8@H.'^___K`$"@XP`` +M`.H50.#C``!4XQ```!H0`)7EM&'5X0T@H.%_/<+C/S##XPB`D^4&,)#@"##3 +M,`"`H#,``%CC`P``&@<0H.$&(*#A_O__ZP!@H.$``%;C#4#@$PL`H.&T$=7A +M_O__ZP0`H.$4T(WB\(^]Z`Q`A^($`*#A)!"?Y?[__^L!`'#B``"@,P`PH.,: +M_O_J`$"@X]S__^H50.#CVO__ZA0!```0`0``'`$``"0!````````$$`MZ0!` +M`.,`0$#C`#"@XQ0PA.5D`*#C_O__ZQ1`E.4"`%3C`0``&@P`G^7^___K!`"? +MY?[__^L0@+WH&````'!`+>D`0`#C`$!`XQA0A.(%`*#A`!"@XP`@`.,`($#C +M_O__ZP4`H.'^___K`C"@XQ0PA.5P@+WH0$(/`("$'@!@[%,`P-BG`("-6P!` +M5(D``!NW`("H$@$`-FX!`%$E`@!LW`*`^3<#V`(```@#``#(`P``T`,``-P# +M``#D`P``\`,````$```(!```.``<`!4```!L````3`$``%`````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````*+(!@;"P7X0``````````+"PL(!`````L+"@ +M@``!``"PL+"`"`$``+"PL(!8`0``L+"@@*@!``"PL+"`[`$``+"PL(`(`@`` +ML+"@@%P"``"PL+"`>`(``+"PL("4`@``L+"P@*P"``"PJ`&`Y`(``+"PL(#L +M`@``L+"P@/0"``"PL+"`_`(``+"PL(`$`P``L+"P@`P#``"PL+"`%`,``+"P +MHH!\`P``L+"P@(0#``"PL+"`C`,``+"PL("4`P``L+"P@)@#``"PL+"`G`,` +M`+"N`8`D!```L+"P@"P$``"PL*"`J`0``+"PJH#P!```KRBR@'@+``"PK`&` +MI`P```````!,$```L*L$@!@2``"PL*B`Y!(``+"L`8"$%```L+"H@)P4``"P +MK`.`]!<``+"PJ(`<&```L*\.@,0:``"PK@&`1!T``+"PJH!X'0``L*X#@*`? +M``"PL*J`#"$``+"PJ(!`(0``L+"J@)`A``"PL*J`_"$``+"L!X`L)```L+"N +M@,`G``"PL*Z`""D``+"PJH`@*@``L*\$@-PM``"PL*B`]"T``%^$`H"<+P`` +ML*H'@/`P``!?A`J`4#(``+"K`H#4,P``KPBQ@!0U``"PL*J`B#4``*]$LH!4 +M00``L*\&@(!"``"PL*J`Y$(``+"PKH`$1```L*D$@%Q$``"PJ02`M$0``+"I +M!(#T1```L*\*@#Q'``"O/QB`B$T``+"PJH`P3@``L+"N@!!/``"PL*B`0$\` +M`+"O!(!87@``L+"H@)A>``"PL*J``%#R!`L*"0@'!@4$`P(!`/\```!R='=? +M=WA?'0```````#CBP`````` +M``````````````````````#DBP```4@``&%P:6YF;P````````````#EBP`` +M`D@``'-E='!I9`````````````#FBP```4@``'=P0#HBP```4@``'=P"4P-7@``"P```!R96%L;6%P`"5S(`H` +M````)7,@"3!X)3`R>`D`)7,@)3`R6``E``E```/%=)1DE`4D5!3%1%2SX``%=%4`!N;VYE`````%1+25``````0T-- +M4`````!)145%(#@P,BXQ,6)N````245%12`X,#(N,3%B`````$E%144@.#`R +M+C$Q8F=N``!)145%(#@P,BXQ,6)G````245%12`X,#(N,3%A;@```$E%144@ +M.#`R+C$Q80````!)145%(#@P,BXQ,6=N````245%12`X,#(N,3%G`````'5N +M87-S;V-I871E9``````@4F%T97,@*$UB+W,I.B```````"XU```E9"5S(``` +M`'=P85]I93T`)3`R>`````!R2P@8V]U;G0@/2`E9"X*``!W:69I(&1R:79E#HE,#)X +M.B4P,G@Z)3`R>#HE,#)X.B4P,G@`)2IS("5S``!54P``154``$I0``!38V%N +M+4-H86YN96QS(#T@)60``$=E="!#:&%N;F5L`0`N````[`$``!P` +M```"``$`&0```.P!```````````!`&T````(`@``5`````(``0`9````"`(` +M``````````$`?0```%P"```<`````@`!`!D```!<`@```````````0"-```` +M>`(``!P````"``$`&0```'@"```````````!`)X```"4`@``&`````(``0`9 +M````E`(```````````$`KP```*P"```X`````@`!`!D```"L`@`````````` +M`0"_````Y`(```@````"``$`&0```.0"```````````!`-````#L`@``"``` +M``(``0`9````[`(```````````$`U@```/0"```(`````@`!`!D```#T`@`` +M`````````0#R````_`(```@````"``$`&0```/P"```````````!``D!```$ +M`P``"`````(``0`9````!`,```````````$`'P$```P#```(`````@`!`!D` +M```,`P```````````0`N`0``%`,``&@````"``$`&0```!0#```````````! +M`#H!``!\`P``"`````(``0`9````?`,```````````$`1@$``(0#```(```` +M`@`!`!D```"$`P```````````0!2`0``C`,```@````"``$`&0```(P#```` +M```````!`!D```"4`P```````````0`9````F`,```````````$`&0```)P# +M```````````!`%\!```D!```"`````(``0`9````)`0```````````$`:`$` +M`"P$``!\`````@`!`!D````L!````````````0!_`0``J`0``$@````"``$` +M&0```*@$```````````!`(X!````````````````"@"3`0``\`0``(@&```" +M``$`&0```/`$```````````!`*0!```(````````````"@"I`0``#``````` +M``````H`K@$``"@````````````*`+,!```X````````````"@"X`0``4``` +M``````````H`O@$``%@````````````*`,0!```P````````````"@#)`0`` +M8`````````````H`SP$``&@````````````*`-4!``!L````````````"@#; +M`0``=`````````````H`X0$``'P````````````*`.```` +M```````!`.T!``"47@```````````0`9````F%X```````````$`6P4``+`# +M```````````*``````````````````,`"0!A!0````````0````!``D`[0$` +M```````````````)`&T%```$````#0````$`"0!Y!0``%`````\````!``D` +MB`4``#0````$`````0`)`)0%```X````!0````$`"0"?!0``0`````D````! +M``D`J@4``$P````$`````0`)`+8%``!0````^`$```$`"0#M`0`````````` +M``````,`QP4``&P```#@`````0`#`-0%``!,`0``<`````$``P`````````` +M```````#``H`[0$````````````````%`.@%````````$`````$`!0#Y!0`` +M$`````$````!``4`#@8``!$````!`````0`%`"$&```8````2`````$`!0`` +M```````````````#``P``````````````````P`+``````````````````,` +M#0`V!@`````````````0````308``*@!``!$````$@`!`&H&```````````` +M`!````!Q!@``E`,```0````2``$`?@8``)@#```$````$@`!`(H&``"<`P`` +MB````!(``0"6!@`````````````0````G@8`````````````$````*H&```` +M`````````!````"[!@`````````````0````Q08`````````````$````,P& +M`````````````!````#3!@`````````````0````Y@8`````````````$``` +M`.T&`````````````!````#\!@`````````````0````%0<````````````` +M$````"8'`````````````!`````[!P`````````````0````3`<````````` +M````$````%H'`````````````!````!N!P`````````````0````=0<````` +M````````$````(P'`````````````!````"3!P`````````````0````FP<` +M````````````$````*T'`````````````!````"Y!P`````````````0```` +MR0<`````````````$````.`'`````````````!````#R!P``&!(``,P````2 +M``$``P@`````````````$`````L(`````````````!`````5"``````````` +M```0````(P@`````````````$````#D(`````````````!````!`"``````` +M```````0````30@`````````````$````%D(`````````````!````!F"``` +M```````````0````=@@`````````````$````(<(`````````````!````"? +M"``````````````0````KP@`````````````$````,((`````````````!`` +M``#0"``````````````0````WP@`````````````$````.\(```````````` +M`!````#^"``````````````0````"@D`````````````$````!4)```````` +M`````!`````A"0`````````````0````+0D`````````````$````#@)```` +M`````````!````!$"0`````````````0````6PD`````````````$````&<) +M`````````````!````!Y"0`````````````0````C@D`````````````$``` +M`)\)`````````````!````"W"0`````````````0````T`D````````````` +M$````-T)`````````````!````#N"0`````````````0``````H````````` +M````$`````L*`````````````!`````?"@`````````````0````0@H````` +M````````$````&4*`````````````!````!Y"@`````````````0````E@H` +M````````````$````)\*`````````````!````"X"@`````````````0```` +MQ`H`````````````$````,L*`````````````!````#="@`````````````0 +M````^`H`````````````$`````<+`````````````!`````5"P`````````` +M```0````,0L`````````````$````$8+```$1```6````!(``0!E"P`````` +M```````0````>0L``%Q$``!8````$@`!`)4+``"T1```0````!(``0"U"P`` +M```````````0````R`L`````````````$````.<+`````````````!````#T +M"P`````````````0``````P`````````````$`````@,`````````````!`` +M```2#``````````````0````'PP`````````````$````"8,```````````` +M`!`````R#``````````````0````1`P`````````````$````%8,```````` +M`````!````!I#``````````````0````>0P``$!/```8#P``$@`!`(,,```` +M`````````!````"7#``````````````0````I0P`````````````$````+P, +M`````````````!````#(#``````````````0````W@P`````````````$``` +M`.P,``!87@``0````!(``0`$#0`````````````0````%@T``)A>```X```` +M$@`!`"X-`````````````!`````]#0```````#`````1``,`1PT``#`````D +M````$0`#`%P-```4````!````!$`!0!R#0``5````!@````1``,``&EO8W1L +M7VQI;G5X+F,`:&5X,FYU;5]I`"1A`'=P85]S971?875T:%]A;&=S`')T=U]W +M>%]S971?9G)E<0!R='=?=WA?9V5T7VUO9&4`%]G971?%]S971?9G)A9P!R='=?=WA?9V5T7V9R86<` +M0!R='=?=WA?9V5T7W!O=V5R`')T=U]W>%]W%]S971?;71K7W=P +M%]S971? +M;71K7W=P%]G971?96YC`')T=U]W>%]G971?;FEC:P`N3$,R-P!R='=?=WA?9V5T +M7V5S%]G971?=V%P`')T=U]W>%]S971?96YC`'=P85]S971? +M96YC'0`+DQ#,CD`+DQ# +M,S``+DQ#,S$`%]S971?97-S:60`%]G971?%]G971? +M9G)E<0!T%]S971?=V%P`')T=U]W>%]S971?F5R;P!S=')S97``F4` +M969U5]T;U]U0!R='=?0!R=&PX,3@X7W!O=V5R7W-A=F5?:6YI=`!W86ME7VQO +M8VM?:6YI=`!R='=?`4``!P'`0"8!0``'`@!`+P%```K/@``P`4``"P^``#H!0``'`D!`/P%```K +M/P````8``"P_```$!@``'`H!`"`&```<"P$`.`8``!P&`0!(!@``'`4!`%0& +M```K0```6`8``"Q```!L!@``'`4!`)`&````@``"Q#``"`"```*T0``(0(```L1```B`@` +M`"M%``","```+$4``*`(````0"4$@``+!X!`,02 +M```<'P$`_!(``"M;````$P``+%L```@3```<&0$`8!,``!P@`0"8$P``'"$! +M`+@3```K7```O!,``"Q<``#$$P``'!D!`/`3```K70``]!,``"Q=``#X$P`` +M'"(!`!P4```K'@$`(!0``"P>`0!0%```'!\!`&04```<'0$`D!0``!PC`0#0 +M%````@(``-04```"`@``V!0```("``#<%````@(``.`4```"`@``Y!0```(" +M``#H%````@(``.P4```"`@``\!0```("``#T%````@(``/@4```"`@``_!0` +M``("````%0```@(```05```"`@``"!4```("```P%0``'"0!`$05```<)0$` +M6!4``!PC`0!`%@``'"8!`(@6```<)P$`S!8``!PH`0``%P``'"D!`#P7```< +M`@$`4!<``!P#`0!D%P``'`0!`-07```<)`$`Y!<``!PD`0`(&```'"H!`&`8 +M```<*P$`P!@``!P'`0#8&```'`@!`.08```<)P$`(!D``!PH`0"@&0``'"D! +M`,`9```<+`$`]!D``!PM`0`\&@``'"D!`(`:```<+@$`M!H``!P9`0#X&@`` +M'"\!`#@;``````<&0$`N!X``!P&`0``'P``'`8!`$P?```<-`$` +M:!\``!PT`0`@(````@(``"0@```"`@``*"````("```L(````@(``#`@```" +M`@``-"````("```X(````@(``(P@```<-`$`*"$``"MU```L(0``+'4``#0A +M```<-`$`>"$``!PT`0"P(0``'`8!`-PA```<-`$`\"$``!P&`0`<(@``'`8! +M`/`C```<-`$`_",``!PU`0",)```*WX``)`D```L?@``E"0``!P*`0#P)``` +M'"\!``@E```"L```("```8+````@(``!PL```"`@``("P```("```D+````@(``"@L +M```"`@``+"P```("```P+````@(``#0L```"`@``."P```("```\+````@(` +M`$`L```"`@``1"P```("``!(+````@(``$PL```"`@``4"P```("``!4+``` +M`@(``/`L```KD0``]"P``"R1```H+0``'!D!`&`M```<-`$`L"T``"N1``"T +M+0``+)$``-0M```<,P$`0"X``!P_`0!H+@``'#0!`-0P```<0`$`[#````+I +M```(,0``'!T!`'0Q`````#H,@``'$4!`/0R```< +M1@$`$#,``"N?```4,P``+)\``!@S```<10$`*#,``"N@```L,P``+*```#`S +M```<10$`5#,``"NA``!8,P``+*$``%PS```<10$`;#,``"NB``!P,P``+*(` +M`'0S```<10$`C#,``"NC``"0,P``+*,``)0S```<10$`I#,``"ND``"H,P`` +M+*0``*PS```<10$`O#,``"NE``#`,P``+*4``,0S```<10$`]#,``!P&`0!` +M-```*Z@``$0T```LJ```O#0``!Q'`0`P-0``'$#<``!Q%`0"(-P``*YX``(PW```LG@``D#<``!Q%`0"<-P``'$8!`+PW```K +MGP``P#<``"R?``#$-P``'$4!`-0W```KH```V#<``"R@``#<-P``'$4!``0X +M```KH0``"#@``"RA```,.```'$4!`!PX```KH@``(#@``"RB```D.```'$4! +M`$`X```KHP``1#@``"RC``!(.```'$4!`%@X```KI```7#@``"RD``!@.``` +M'$4!`(PX```<2`$`G#@``!Q(`0#`.```'$H!`-0X```<-`$`*#D``!Q(`0`X +M.0``'$@!`&@Y```<1P$`N#D``!Q(`0#(.0``'$@!`#@Z```<2`$`2#H``!Q( +M`0!<.@``'$@!`'`Z```KK0``=#H``"RM``!X.@``'$4!`*`Z```KK@``I#H` +M`"RN``"L.@``*Z\``+0Z```LKP``N#H``"NP``"\.@``++```/PZ```<10$` +M/#P``!Q(`0!,/```'$@!`(0\```<2P$`J#P``!P&`0"L/```*[$``+`\```L +ML0``V#P``"NR``#$0``!P&`0"01```'#0! +M`*A$```<4`$`T$0``!P&`0#H1```'%`!``Q%```<'0$`6$4``!Q2`0!T10`` +M'%(!`+1%```$L``"S/``!\2P``'`4! +M`)!+```KR@``E$L``"S*``"<2P``'$@!`+!+```KR@``M$L``"S*``"\2P`` +M'$@!`,Q+```KT```T$L``"S0``#82P``'"(!`.!+```KT0``Y$L``"S1``#H +M2P``'`H!``!,```KT@``!$P``"S2```(3```'`H!`"!,```KTP``)$P``"S3 +M```H3```'`H!`#A,```K7`$`/$P``"Q<`0!83```'#0!`'1,```KR@``>$P` +M`"S*``"`3```'$@!`(A,```K7`$`C$P``"Q<`0"\3```*]0``,!,```LU``` +MR$P``!P%`0#,3```*UP!`-!,```L7`$`U$P``"O5``#83```+-4``.1,```< +M%`$`\$P``"O*``#T3```+,H``/Q,```<2`$`#$T``!P,`0!030``'"X!`'!- +M```<5@$`@$T```+I``"$30```@,``)A-```<'0$`R$T```("``#,30```@(` +M`-!-```"`@``U$T```("```$3@``'$$!`!A.```<70$`2$X``!P\`0!D3@`` +M'#P!`'A.```<,P$`D$X``!P&`0"T3@``*Y$``+A.```LD0``T$X``!PT`0#T +M3@``'%X!``!/```<7P$`)$\``"N1```H3P``+)$``(1/```<+P$`S$\``!P' +M`0#H3P``'`@!`/1/```<,P$`%%````("```84````@(``!Q0```"`@``(%`` +M``("```X40``'$T!`$Q1```<30$`H%$``!PN`0"X40``'#,!`/A1```<+P$` +M0%(``!P'`0!<4@``'`@!`&A2```<,P$`B%(```("``",4@```@(``)!2```" +M`@``E%(```("``"84@```@(``)Q2```"`@``H%(```("``"D4@```@(``*A2 +M```"`@``K%(```("``"P4@```@(``+12```"`@``N%(```("``"\4@```@(` +M`,!2```"`@``Q%(```("``#(4@```@(``,Q2```"`@``T%(```("``#D4@`` +M'&$!`.Q2```<8@$`,%,``!PF`0!84P``'#0!`*A3```<-`$`P%,``!QC`0`, +M5```'"8!`"14```<9`$`7%0``!PT`0"(5```'&4!`/Q4```<)@$`&%4``!P* +M`0`L50``'`H!`(A5```<+P$`H%4``!P&`0#`50``'#0!`"A6```<-`$`<%8` +M`!PT`0#H5@``'#0!`!A7```<"@$`5%<``!PT`0!P5P``'#0!`(Q7```<-`$` +MJ%<``!P*`0#@5P``'#0!`#18```<.`$`K%@``!PT`0"X6```'`H!`.A8```< +M"@$`"%D``!PT`0`860``'#0!`#19```<"@$`4%D``!P\`0!D60``'#P!`'A9 +M```<,P$`A%D``!Q>`0"\60``'#0!`,Q9```<-`$`V%D``!Q?`0`06@``'#0! +M`$!:```<"@$`?%H``!PT`0"86@``'#0!`+1:```<-`$`T%H``!P*`0`(6P`` +M'#0!`%Q;```<.`$`D%L``!PS`0#46P``'"8!`!A<```<-`$`8%P``!PS`0!\ +M7```'"\!`)A<```<-`$`K%P``!QF`0#T7```'#,!`!!=```<+P$`+%T``!PT +M`0!H70``'#,!`(1=```<+P$`H%T``!PT`0#L70``'"X!``1>```<,P$`(%X` +M`!P*`0!$7@```O8``$A>```"]@``3%X```+V``!07@```O8``%1>```"Z0`` +M7%X``"M5``!@7@``+%4``'!>```<6@$`A%X``!Q;`0",7@``'&@!`)1>```" +M!```G%X``"M5``"@7@``+%4``+!>```KZ```M%X``"SH``"X7@``'&H!`,!> +M```<6`$`,`````+V```T`````O8``#@````"]@``/`````+V``!``````O8` +M`$0````"]@``2`````+V``!,`````O8``%`````"]@``7`````(#``!@```` +M`@,``&0````"Z0``:`````(W``!P`````IL``'0````"(```>`````(@``!\ +M`````@L``(`````"J0``A`````+7``"(`````@T``(P````"(```D`````(/ +M``"8`````J8``)P````"P0``K`````(@``"P`````B```+P````"N```P``` +M``)X``#$`````K8``,@````"(```S`````*^``#0`````K0``-0````"F0`` +MV`````)V``#<`````B```.`````"``!0`0`` +M`FH``%0!```"*```6`$```)H``!<`0```F8``&`!```"*@``9`$```),``!H +M`0```B0``&P!```"(@``<`$```(F``!T`0```F0``'@!```"8```?`$```(< +M``"``0```CD``(0!```"'@``B`$```(>``",`0```BP``)`!```"+@``E`$` +M``(P``"<`0```C4``*`!```"'@``I`$```)9``"H`0```AX``*P!```"4P`` +ML`$```(>``"T`0```DX``+@!```"/````````"H"`````````/\```@````J +M`@``$````"H"```8````*@(``"`````J`@``*````"H"```P````*@(``#@` +M```J`@``0````"H"``!(````*@(``%`````J`@``6````"H"``!@````*@(` +M`&@````J`@``<````"H"``!X````*@(``(`````J`@``B````"H"``"0```` +M*@(``)@````J`@``H````"H"``"H````*@(``+`````J`@``N````"H"``#` +M````*@(``,@````J`@``T````"H"``#8````*@(``.`````J`@``Z````"H" +M``#P````*@(``/``````%0$`]````"H'``#X````*@(````!```J`@``"`$` +M`"H"```0`0``*@(``!@!```J`@``(`$``"H"```H`0``*@(``#`!```J`@`` +M.`$``"H"``!``0``*@(``$@!```J`@``4`$``"H"``!8`0``*@(``&`!```J +M`@``:`$``"H"``!P`0``*@(``'@!```J`@``@`$``"H"``"(`0``*@(``)`! +M```J`@``F`$``"H"``"@`0``*@(``*@!```J`@``L`$``"H"``"X`0``*@(` +M`,`!```J`@``R`$``"H"``#0`0``*@(``-@!```J`@``X`$``"H"``#H`0`` +M*@(``/`!```J`@``^`$``"H"`````@``*@(```@"```J`@``$`(``"H"```8 +G`@``*@(``"`"```J`@``*`(``"H"```P`@``*@(``#@"```J`@`` +` +end diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c new file mode 100755 index 000000000000..9f4f3fef874f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/mlme_linux.c @@ -0,0 +1,781 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#define _MLME_OSDEP_C_ + +#include +#include +#include +#include + + +#ifdef RTK_DMP_PLATFORM +void Linkup_workitem_callback(struct work_struct *work) +{ + struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkup_workitem); + _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv); + +_func_enter_; + + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkup_workitem_callback\n")); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKUP); +#else + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKUP); +#endif + +_func_exit_; +} + +void Linkdown_workitem_callback(struct work_struct *work) +{ + struct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkdown_workitem); + _adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv); + +_func_enter_; + + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+ Linkdown_workitem_callback\n")); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) + kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKDOWN); +#else + kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKDOWN); +#endif + +_func_exit_; +} +#endif + + +/* +void sitesurvey_ctrl_handler(void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + + _sitesurvey_ctrl_handler(adapter); + + _set_timer(&adapter->mlmepriv.sitesurveyctrl.sitesurvey_ctrl_timer, 3000); +} +*/ + +void rtw_join_timeout_handler (void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + _rtw_join_timeout_handler(adapter); +} + + +void _rtw_scan_timeout_handler (void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + rtw_scan_timeout_handler(adapter); +} + + +void _dynamic_check_timer_handlder (void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + + rtw_dynamic_check_timer_handlder(adapter); + + _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); +} + +#ifdef CONFIG_SET_SCAN_DENY_TIMER +void _rtw_set_scan_deny_timer_hdl(void *FunctionContext) +{ + _adapter *adapter = (_adapter *)FunctionContext; + rtw_set_scan_deny_timer_hdl(adapter); +} +#endif + + +void rtw_init_mlme_timer(_adapter *padapter) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + _init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev, rtw_join_timeout_handler, padapter); + //_init_timer(&(pmlmepriv->sitesurveyctrl.sitesurvey_ctrl_timer), padapter->pnetdev, sitesurvey_ctrl_handler, padapter); + _init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev, _rtw_scan_timeout_handler, padapter); + + _init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, _dynamic_check_timer_handlder, padapter); + + #ifdef CONFIG_SET_SCAN_DENY_TIMER + _init_timer(&(pmlmepriv->set_scan_deny_timer), padapter->pnetdev, _rtw_set_scan_deny_timer_hdl, padapter); + #endif + +#ifdef RTK_DMP_PLATFORM + _init_workitem(&(pmlmepriv->Linkup_workitem), Linkup_workitem_callback, padapter); + _init_workitem(&(pmlmepriv->Linkdown_workitem), Linkdown_workitem_callback, padapter); +#endif + +} + +extern void rtw_indicate_wx_assoc_event(_adapter *padapter); +extern void rtw_indicate_wx_disassoc_event(_adapter *padapter); + +void rtw_os_indicate_connect(_adapter *adapter) +{ + +_func_enter_; + + rtw_indicate_wx_assoc_event(adapter); + netif_carrier_on(adapter->pnetdev); + + if(adapter->pid[2] !=0) + rtw_signal_process(adapter->pid[2], SIGALRM); + +#ifdef RTK_DMP_PLATFORM + _set_workitem(&adapter->mlmepriv.Linkup_workitem); +#endif + +_func_exit_; + +} + +static RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ]; +void rtw_reset_securitypriv( _adapter *adapter ) +{ + u8 backupPMKIDIndex = 0; + u8 backupTKIPCountermeasure = 0x00; + + if(adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)//802.1x + { + // Added by Albert 2009/02/18 + // We have to backup the PMK information for WiFi PMK Caching test item. + // + // Backup the btkip_countermeasure information. + // When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. + + _rtw_memset( &backupPMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + + _rtw_memcpy( &backupPMKIDList[ 0 ], &adapter->securitypriv.PMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + backupPMKIDIndex = adapter->securitypriv.PMKIDIndex; + backupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure; + + _rtw_memset((unsigned char *)&adapter->securitypriv, 0, sizeof (struct security_priv)); + //_init_timer(&(adapter->securitypriv.tkip_timer),adapter->pnetdev, rtw_use_tkipkey_handler, adapter); + + // Added by Albert 2009/02/18 + // Restore the PMK information to securitypriv structure for the following connection. + _rtw_memcpy( &adapter->securitypriv.PMKIDList[ 0 ], &backupPMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE ); + adapter->securitypriv.PMKIDIndex = backupPMKIDIndex; + adapter->securitypriv.btkip_countermeasure = backupTKIPCountermeasure; + + adapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; + adapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; + + } + else //reset values in securitypriv + { + //if(adapter->mlmepriv.fw_state & WIFI_STATION_STATE) + //{ + struct security_priv *psec_priv=&adapter->securitypriv; + + psec_priv->dot11AuthAlgrthm =dot11AuthAlgrthm_Open; //open system + psec_priv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + psec_priv->dot11PrivacyKeyIndex = 0; + + psec_priv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psec_priv->dot118021XGrpKeyid = 1; + + psec_priv->ndisauthtype = Ndis802_11AuthModeOpen; + psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled; + psec_priv->wps_phase = _FALSE; + //} + } +} + +void rtw_os_indicate_disconnect( _adapter *adapter ) +{ + //RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ]; + +_func_enter_; + + rtw_indicate_wx_disassoc_event(adapter); + netif_carrier_off(adapter->pnetdev); + +#ifdef RTK_DMP_PLATFORM + _set_workitem(&adapter->mlmepriv.Linkdown_workitem); +#endif + rtw_reset_securitypriv( adapter ); + +_func_exit_; + +} + +void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie) +{ + uint len; + u8 *buff,*p,i; + union iwreq_data wrqu; + +_func_enter_; + + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("+rtw_report_sec_ie, authmode=%d\n", authmode)); + + buff = NULL; + if(authmode==_WPA_IE_ID_) + { + RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("rtw_report_sec_ie, authmode=%d\n", authmode)); + + buff = rtw_malloc(IW_CUSTOM_MAX); + + _rtw_memset(buff,0,IW_CUSTOM_MAX); + + p=buff; + + p+=sprintf(p,"ASSOCINFO(ReqIEs="); + + len = sec_ie[1]+2; + len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX; + + for(i=0;ipnetdev,IWEVCUSTOM,&wrqu,buff); + + if(buff) + rtw_mfree(buff, IW_CUSTOM_MAX); + + } + +_func_exit_; + +} + +void _survey_timer_hdl (void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + + survey_timer_hdl(padapter); +} + +void _link_timer_hdl (void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + link_timer_hdl(padapter); +} + +void _addba_timer_hdl(void *FunctionContext) +{ + struct sta_info *psta = (struct sta_info *)FunctionContext; + addba_timer_hdl(psta); +} + +void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta) +{ + + _init_timer(&psta->addba_retry_timer, padapter->pnetdev, _addba_timer_hdl, psta); +} + +#ifdef CONFIG_TDLS +void TDLS_restore_workitem_callback(struct work_struct *work) +{ + struct mlme_ext_priv*pmlmeext = container_of(work, struct mlme_ext_priv, TDLS_restore_workitem); + _adapter *padapter = pmlmeext->padapter; + u32 bit_6=1<<6; + + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)|(bit_6)); + DBG_8192C("wirte 0x0608, set bit6 on\n"); +} + + +void _TPK_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + ptdls_sta->TPK_count++; + //TPK_timer set 1000 as default + //retry timer should set at least 301 sec. + if(ptdls_sta->TPK_count==TPK_RESEND_COUNT){ + ptdls_sta->TPK_count=0; + issue_tdls_setup_req(ptdls_sta->padapter, ptdls_sta->hwaddr); + } + + _set_timer(&ptdls_sta->TPK_timer, ptdls_sta->TDLS_PeerKey_Lifetime/TPK_RESEND_COUNT); +} + +void init_TPK_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + + _init_timer(&psta->TPK_timer, padapter->pnetdev, _TPK_timer_hdl, psta); +} + +// 1: write RCR DATA BIT +// 2: issue peer traffic indication +// 3: go back to the channel linked with AP, terminating channel switch procedure +// 4: init channel sensing, receive all data and mgnt frame +// 5: channel sensing and report candidate channel +// 6: first time set channel to off channel +// 7: go back tp the channel linked with AP when set base channel as target channel +void TDLS_option_workitem_callback(struct work_struct *work) +{ + struct sta_info *ptdls_sta = container_of(work, struct sta_info, option_workitem); + _adapter *padapter = ptdls_sta->padapter; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; + u32 bit_6=1<<6, bit_7=1<<7, bit_4=1<<4; + u8 survey_channel, i, min; + + switch(ptdls_sta->option){ + case 1: + //As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0 + //such we can receive all kinds of data frames. + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)&(~bit_6)); + DBG_8192C("wirte 0x0608, set bit6 off\n"); + break; + case 2: + issue_tdls_peer_traffic_indication(padapter, ptdls_sta); + break; + case 3: + _cancel_timer_ex(&ptdls_sta->base_ch_timer); + _cancel_timer_ex(&ptdls_sta->off_ch_timer); + SelectChannel(padapter, pmlmeext->cur_channel); + ptdls_sta->state &= ~(TDLS_CH_SWITCH_ON_STATE | + TDLS_PEER_AT_OFF_STATE | + TDLS_AT_OFF_CH_STATE); + DBG_8192C("go back to base channel\n "); + issue_nulldata(padapter, 0); + break; + case 4: + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)&(~bit_6)&(~bit_7)); + rtw_write16(padapter, 0x06A4,0xffff); //maybe don't need to write here + + //disable update TSF + rtw_write8(padapter, 0x0550, rtw_read8(padapter, 0x0550)|bit_4); + + pmlmeext->sitesurvey_res.channel_idx = 0; + ptdls_sta->option = 5; + _set_workitem(&ptdls_sta->option_workitem); + break; + case 5: + survey_channel = pmlmeext->channel_set[pmlmeext->sitesurvey_res.channel_idx].ChannelNum; + if(survey_channel){ + SelectChannel(padapter, survey_channel); + pmlmeinfo->tdls_cur_channel = survey_channel; + pmlmeext->sitesurvey_res.channel_idx++; + _set_timer(&ptdls_sta->option_timer, SURVEY_TO); + }else{ + SelectChannel(padapter, pmlmeext->cur_channel); + + //enable update TSF + rtw_write8(padapter, 0x0550, rtw_read8(padapter, 0x0550)&(~bit_4)); + rtw_write32(padapter, 0x0608, rtw_read32(padapter, 0x0608)|(bit_7)); + + if(pmlmeinfo->tdls_ch_sensing==1){ + pmlmeinfo->tdls_ch_sensing=0; + pmlmeinfo->tdls_cur_channel=1; + min=pmlmeinfo->tdls_collect_pkt_num[0]; + for(i=1; i<14-1; i++){ + if(min > pmlmeinfo->tdls_collect_pkt_num[i]){ + pmlmeinfo->tdls_cur_channel=i+1; + min=pmlmeinfo->tdls_collect_pkt_num[i]; + } + pmlmeinfo->tdls_collect_pkt_num[i]=0; + } + pmlmeinfo->tdls_collect_pkt_num[0]=0; + pmlmeinfo->tdls_candidate_ch=pmlmeinfo->tdls_cur_channel; + DBG_8192C("TDLS channel sensing done, candidate channel: %02x\n", pmlmeinfo->tdls_candidate_ch); + pmlmeinfo->tdls_cur_channel=0; + + } + + if(ptdls_sta->state & TDLS_PEER_SLEEP_STATE){ + ptdls_sta->state |= TDLS_APSD_CHSW_STATE; + }else{ + //send null data with pwrbit==1 before send ch_switching_req to peer STA. + issue_nulldata(padapter, 1); + + ptdls_sta->state |= TDLS_CH_SW_INITIATOR_STATE; + + issue_tdls_ch_switch_req(padapter, ptdls_sta->hwaddr); + DBG_8192C("issue tdls ch switch req\n"); + } + } + break; + case 6: + issue_nulldata(padapter, 1); + SelectChannel(padapter, ptdls_sta->off_ch); + + DBG_8192C("change channel to tar ch:%02x\n", ptdls_sta->off_ch); + ptdls_sta->state |= TDLS_AT_OFF_CH_STATE; + ptdls_sta->state &= ~(TDLS_PEER_AT_OFF_STATE); + _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); + break; + case 7: + _cancel_timer_ex(&ptdls_sta->base_ch_timer); + _cancel_timer_ex(&ptdls_sta->off_ch_timer); + SelectChannel(padapter, pmlmeext->cur_channel); + ptdls_sta->state &= ~(TDLS_CH_SWITCH_ON_STATE | + TDLS_PEER_AT_OFF_STATE | + TDLS_AT_OFF_CH_STATE); + DBG_8192C("go back to base channel\n "); + issue_nulldata(padapter, 0); + _set_timer(&ptdls_sta->option_timer, (u32)ptdls_sta->ch_switch_time); + break; + } + +} + +// 5: channel sensing and report candidate channel +// 6: first time set channel to off channel +// 7: whab go back tp the channel linked with AP, send null data to peer STA as an indication +void _ch_switch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + + if(ptdls_sta->option==5){ + _set_workitem(&ptdls_sta->option_workitem); + }else if(ptdls_sta->option==6){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + _set_timer(&ptdls_sta->base_ch_timer, 500); + }else if(ptdls_sta->option==7){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + } +} + +void init_ch_switch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->option_timer, padapter->pnetdev, _ch_switch_timer_hdl, psta); +} + +//Set channel back to base channel +void base_channel_workitem_callback(struct work_struct *work) +{ + struct sta_info *ptdls_sta = container_of(work, struct sta_info, base_ch_workitem); + _adapter *padapter = ptdls_sta->padapter; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + SelectChannel(ptdls_sta->padapter, pmlmeext->cur_channel); + issue_nulldata(ptdls_sta->padapter, 0); + + DBG_8192C("change channel to base ch:%02x\n", pmlmeext->cur_channel); + + ptdls_sta->state &= ~(TDLS_PEER_AT_OFF_STATE| TDLS_AT_OFF_CH_STATE); + + _set_timer(&ptdls_sta->off_ch_timer, 500); + +} + +void _base_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _set_workitem(&ptdls_sta->base_ch_workitem); +} + +void init_base_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->base_ch_timer, padapter->pnetdev, _base_ch_timer_hdl, psta); +} + +//Set channel back to off channel +void off_channel_workitem_callback(struct work_struct *work) +{ + struct sta_info *ptdls_sta = container_of(work, struct sta_info, off_ch_workitem); + _adapter *padapter = ptdls_sta->padapter; + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + issue_nulldata(ptdls_sta->padapter, 1); + + SelectChannel(ptdls_sta->padapter, ptdls_sta->off_ch); + + DBG_8192C("change channel to off ch:%02x\n", ptdls_sta->off_ch); + ptdls_sta->state |= TDLS_AT_OFF_CH_STATE; + + if((ptdls_sta->state & TDLS_PEER_AT_OFF_STATE) != TDLS_PEER_AT_OFF_STATE){ + issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta, 0); + } + + _set_timer(&ptdls_sta->base_ch_timer, 500); +} + +void _off_ch_timer_hdl(void *FunctionContext) +{ + struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext; + _set_workitem(&ptdls_sta->off_ch_workitem); +} + +void init_off_ch_timer(_adapter *padapter, struct sta_info *psta) +{ + psta->padapter=padapter; + _init_timer(&psta->off_ch_timer, padapter->pnetdev, _off_ch_timer_hdl, psta); +} +#endif + +/* +void _reauth_timer_hdl(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + reauth_timer_hdl(padapter); +} + +void _reassoc_timer_hdl(void *FunctionContext) +{ + _adapter *padapter = (_adapter *)FunctionContext; + reassoc_timer_hdl(padapter); +} +*/ + +void init_mlme_ext_timer(_adapter *padapter) +{ + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + + _init_timer(&pmlmeext->survey_timer, padapter->pnetdev, _survey_timer_hdl, padapter); + _init_timer(&pmlmeext->link_timer, padapter->pnetdev, _link_timer_hdl, padapter); + //_init_timer(&pmlmeext->ADDBA_timer, padapter->pnetdev, _addba_timer_hdl, padapter); + + //_init_timer(&pmlmeext->reauth_timer, padapter->pnetdev, _reauth_timer_hdl, padapter); + //_init_timer(&pmlmeext->reassoc_timer, padapter->pnetdev, _reassoc_timer_hdl, padapter); +} + +#ifdef CONFIG_AP_MODE + +void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta) +{ + union iwreq_data wrqu; + struct sta_priv *pstapriv = &padapter->stapriv; + + if(psta==NULL) + return; + + if(psta->aid > NUM_STA) + return; + + if(pstapriv->sta_aid[psta->aid - 1] != psta) + return; + + + wrqu.addr.sa_family = ARPHRD_ETHER; + + _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); + + DBG_871X("+rtw_indicate_sta_assoc_event\n"); + + wireless_send_event(padapter->pnetdev, IWEVREGISTERED, &wrqu, NULL); + +} + +void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta) +{ + union iwreq_data wrqu; + struct sta_priv *pstapriv = &padapter->stapriv; + + if(psta==NULL) + return; + + if(psta->aid > NUM_STA) + return; + + if(pstapriv->sta_aid[psta->aid - 1] != psta) + return; + + + wrqu.addr.sa_family = ARPHRD_ETHER; + + _rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN); + + DBG_871X("+rtw_indicate_sta_disassoc_event\n"); + + wireless_send_event(padapter->pnetdev, IWEVEXPIRED, &wrqu, NULL); + +} + + +#ifdef CONFIG_HOSTAPD_MLME + +static int mgnt_xmit_entry(struct sk_buff *skb, struct net_device *pnetdev) +{ + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); + _adapter *padapter = (_adapter *)phostapdpriv->padapter; + + //DBG_8192C("%s\n", __FUNCTION__); + + return padapter->HalFunc.hostap_mgnt_xmit_entry(padapter, skb); +} + +static int mgnt_netdev_open(struct net_device *pnetdev) +{ + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); + + DBG_8192C("mgnt_netdev_open: MAC Address:" MAC_FMT "\n", MAC_ARG(pnetdev->dev_addr)); + + + init_usb_anchor(&phostapdpriv->anchored); + + if(!netif_queue_stopped(pnetdev)) + netif_start_queue(pnetdev); + else + netif_wake_queue(pnetdev); + + + netif_carrier_on(pnetdev); + + //rtw_write16(phostapdpriv->padapter, 0x0116, 0x0100);//only excluding beacon + + return 0; +} +static int mgnt_netdev_close(struct net_device *pnetdev) +{ + struct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev); + + DBG_8192C("%s\n", __FUNCTION__); + + usb_kill_anchored_urbs(&phostapdpriv->anchored); + + netif_carrier_off(pnetdev); + + if (!netif_queue_stopped(pnetdev)) + netif_stop_queue(pnetdev); + + //rtw_write16(phostapdpriv->padapter, 0x0116, 0x3f3f); + + return 0; +} + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) +static const struct net_device_ops rtl871x_mgnt_netdev_ops = { + .ndo_open = mgnt_netdev_open, + .ndo_stop = mgnt_netdev_close, + .ndo_start_xmit = mgnt_xmit_entry, + //.ndo_set_mac_address = r871x_net_set_mac_address, + //.ndo_get_stats = r871x_net_get_stats, + //.ndo_do_ioctl = r871x_mp_ioctl, +}; +#endif + +int hostapd_mode_init(_adapter *padapter) +{ + unsigned char mac[ETH_ALEN]; + struct hostapd_priv *phostapdpriv; + struct net_device *pnetdev; + + pnetdev = rtw_alloc_etherdev(sizeof(struct hostapd_priv)); + if (!pnetdev) + return -ENOMEM; + + //SET_MODULE_OWNER(pnetdev); + ether_setup(pnetdev); + + //pnetdev->type = ARPHRD_IEEE80211; + + phostapdpriv = rtw_netdev_priv(pnetdev); + phostapdpriv->pmgnt_netdev = pnetdev; + phostapdpriv->padapter= padapter; + padapter->phostapdpriv = phostapdpriv; + + //pnetdev->init = NULL; + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) + + DBG_8192C("register rtl871x_mgnt_netdev_ops to netdev_ops\n"); + + pnetdev->netdev_ops = &rtl871x_mgnt_netdev_ops; + +#else + + pnetdev->open = mgnt_netdev_open; + + pnetdev->stop = mgnt_netdev_close; + + pnetdev->hard_start_xmit = mgnt_xmit_entry; + + //pnetdev->set_mac_address = r871x_net_set_mac_address; + + //pnetdev->get_stats = r871x_net_get_stats; + + //pnetdev->do_ioctl = r871x_mp_ioctl; + +#endif + + pnetdev->watchdog_timeo = HZ; /* 1 second timeout */ + + //pnetdev->wireless_handlers = NULL; + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + pnetdev->features |= NETIF_F_IP_CSUM; +#endif + + + + if(dev_alloc_name(pnetdev,"mgnt.wlan%d") < 0) + { + DBG_8192C("hostapd_mode_init(): dev_alloc_name, fail! \n"); + } + + + //SET_NETDEV_DEV(pnetdev, pintfpriv->udev); + + + mac[0]=0x00; + mac[1]=0xe0; + mac[2]=0x4c; + mac[3]=0x87; + mac[4]=0x11; + mac[5]=0x12; + + _rtw_memcpy(pnetdev->dev_addr, mac, ETH_ALEN); + + + netif_carrier_off(pnetdev); + + + /* Tell the network stack we exist */ + if (register_netdev(pnetdev) != 0) + { + DBG_8192C("hostapd_mode_init(): register_netdev fail!\n"); + + if(pnetdev) + { + rtw_free_netdev(pnetdev); + } + } + + return 0; + +} + +void hostapd_mode_unload(_adapter *padapter) +{ + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; + struct net_device *pnetdev = phostapdpriv->pmgnt_netdev; + + unregister_netdev(pnetdev); + rtw_free_netdev(pnetdev); + +} + +#endif +#endif + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c b/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c new file mode 100755 index 000000000000..e76fb2c9a277 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/os_intfs.c @@ -0,0 +1,1356 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _OS_INTFS_C_ + +#include + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_SDIO_HCI +#include +#endif + +#ifdef CONFIG_USB_HCI +#include +#endif + +#ifdef CONFIG_PCI_HCI +#include +#endif + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); +MODULE_AUTHOR("Realtek Semiconductor Corp."); +MODULE_VERSION(DRIVERVERSION); + +/* module param defaults */ +int rtw_chip_version = 0x00; +int rtw_rfintfs = HWPI; +int rtw_lbkmode = 0;//RTL8712_AIR_TRX; + + +int rtw_network_mode = Ndis802_11IBSS;//Ndis802_11Infrastructure;//infra, ad-hoc, auto +//NDIS_802_11_SSID ssid; +int rtw_channel = 1;//ad-hoc support requirement +int rtw_wireless_mode = WIRELESS_11BG_24N; +int rtw_vrtl_carrier_sense = AUTO_VCS; +int rtw_vcs_type = RTS_CTS;//* +int rtw_rts_thresh = 2347;//* +int rtw_frag_thresh = 2346;//* +int rtw_preamble = PREAMBLE_LONG;//long, short, auto +int rtw_scan_mode = 1;//active, passive +int rtw_adhoc_tx_pwr = 1; +int rtw_soft_ap = 0; +//int smart_ps = 1; +#ifdef CONFIG_POWER_SAVING +int rtw_power_mgnt = 1; +#else +int rtw_power_mgnt = PS_MODE_ACTIVE; +#endif + +#ifdef CONFIG_IPS_LEVEL_2 +int rtw_ips_mode = IPS_LEVEL_2; +#else +int rtw_ips_mode = IPS_NORMAL; +#endif +module_param(rtw_ips_mode, int, 0644); + +int rtw_radio_enable = 1; +int rtw_long_retry_lmt = 7; +int rtw_short_retry_lmt = 7; +int rtw_busy_thresh = 40; +//int qos_enable = 0; //* +int rtw_ack_policy = NORMAL_ACK; +#ifdef CONFIG_MP_INCLUDED +int rtw_mp_mode = 1; +#else +int rtw_mp_mode = 0; +#endif +int rtw_software_encrypt = 0; +int rtw_software_decrypt = 0; + +int rtw_wmm_enable = 1;// default is set to enable the wmm. +int rtw_uapsd_enable = 0; +int rtw_uapsd_max_sp = NO_LIMIT; +int rtw_uapsd_acbk_en = 0; +int rtw_uapsd_acbe_en = 0; +int rtw_uapsd_acvi_en = 0; +int rtw_uapsd_acvo_en = 0; + +#ifdef CONFIG_80211N_HT +int rtw_ht_enable = 1; +int rtw_cbw40_enable = 1; +int rtw_ampdu_enable = 1;//for enable tx_ampdu +int rtw_rx_stbc = 0;// default is disabled for IOT issue with bufflao's AP +int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto +#endif + +int rtw_lowrate_two_xmit = 1;//Use 2 path Tx to transmit MCS0~7 and legacy mode + +//int rf_config = RF_1T2R; // 1T2R +int rtw_rf_config = RF_819X_MAX_TYPE; //auto +int rtw_low_power = 0; +#ifdef CONFIG_WIFI_TEST +int rtw_wifi_spec = 1;//for wifi test +#else +int rtw_wifi_spec = 0; +#endif +int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX; + +#ifdef CONFIG_BT_COEXIST +int rtw_bt_iso = 2;// 0:Low, 1:High, 2:From Efuse +int rtw_bt_sco = 3;// 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy +int rtw_bt_ampdu =1 ;// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. +#endif +int rtw_AcceptAddbaReq = _TRUE;// 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. + +int rtw_antdiv_cfg = 2; // 0:OFF , 1:ON, 2:decide by Efuse config + +#ifdef CONFIG_USB_AUTOSUSPEND +int rtw_enusbss = 1;//0:disable,1:enable +#else +int rtw_enusbss = 0;//0:disable,1:enable +#endif + +int rtw_hwpdn_mode=2;//0:disable,1:enable,2: by EFUSE config + +#ifdef CONFIG_HW_PWRP_DETECTION +int rtw_hwpwrp_detect = 1; +#else +int rtw_hwpwrp_detect = 0; //HW power ping detect 0:disable , 1:enable +#endif + +#ifdef CONFIG_USB_HCI +int rtw_hw_wps_pbc = 1; +#else +int rtw_hw_wps_pbc = 0; +#endif + +char* ifname = "wlan%d"; + +char* rtw_initmac = 0; // temp mac address if users want to use instead of the mac address in Efuse + +module_param(ifname, charp, 0644); +module_param(rtw_initmac, charp, 0644); +module_param(rtw_channel_plan, int, 0644); +module_param(rtw_chip_version, int, 0644); +module_param(rtw_rfintfs, int, 0644); +module_param(rtw_lbkmode, int, 0644); +module_param(rtw_network_mode, int, 0644); +module_param(rtw_channel, int, 0644); +module_param(rtw_mp_mode, int, 0644); +module_param(rtw_wmm_enable, int, 0644); +module_param(rtw_vrtl_carrier_sense, int, 0644); +module_param(rtw_vcs_type, int, 0644); +module_param(rtw_busy_thresh, int, 0644); +#ifdef CONFIG_80211N_HT +module_param(rtw_ht_enable, int, 0644); +module_param(rtw_cbw40_enable, int, 0644); +module_param(rtw_ampdu_enable, int, 0644); +module_param(rtw_rx_stbc, int, 0644); +module_param(rtw_ampdu_amsdu, int, 0644); +#endif + +module_param(rtw_lowrate_two_xmit, int, 0644); + +module_param(rtw_rf_config, int, 0644); +module_param(rtw_power_mgnt, int, 0644); +module_param(rtw_low_power, int, 0644); +module_param(rtw_wifi_spec, int, 0644); + +module_param(rtw_antdiv_cfg, int, 0644); + + +module_param(rtw_enusbss, int, 0644); +module_param(rtw_hwpdn_mode, int, 0644); +module_param(rtw_hwpwrp_detect, int, 0644); + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE +char *rtw_adaptor_info_caching_file_path= "/data/misc/wifi/rtw_cache"; +module_param(rtw_adaptor_info_caching_file_path, charp, 0644); +#endif + +#ifdef CONFIG_LAYER2_ROAMING +uint rtw_max_roaming_times=2; +module_param(rtw_max_roaming_times, uint, 0644); +#endif + +static uint loadparam( _adapter *padapter, _nic_hdl pnetdev); +static int netdev_open (struct net_device *pnetdev); +static int netdev_close (struct net_device *pnetdev); + +//#ifdef RTK_DMP_PLATFORM +#ifdef CONFIG_PROC_DEBUG +#define RTL8192C_PROC_NAME "rtl819xC" +#define RTL8192D_PROC_NAME "rtl819xD" +static char rtw_proc_name[IFNAMSIZ]; +static struct proc_dir_entry *rtw_proc = NULL; +static int rtw_proc_cnt = 0; + +void rtw_proc_init_one(struct net_device *dev) +{ + struct proc_dir_entry *dir_dev = NULL; + struct proc_dir_entry *entry=NULL; + _adapter *padapter = rtw_netdev_priv(dev); + + if(rtw_proc == NULL) + { + if(padapter->chip_type == RTL8188C_8192C) + { + _rtw_memcpy(rtw_proc_name, RTL8192C_PROC_NAME, sizeof(RTL8192C_PROC_NAME)); + } + else if(padapter->chip_type == RTL8192D) + { + _rtw_memcpy(rtw_proc_name, RTL8192D_PROC_NAME, sizeof(RTL8192D_PROC_NAME)); + } + +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, proc_net); +#else + rtw_proc=create_proc_entry(rtw_proc_name, S_IFDIR, init_net.proc_net); +#endif + if (rtw_proc == NULL) { + DBG_8192C(KERN_ERR "Unable to create rtw_proc directory\n"); + return; + } + + entry = create_proc_read_entry("ver_info", S_IFREG | S_IRUGO, rtw_proc, proc_get_drv_version, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + } + + + + if(padapter->dir_dev == NULL) + { + padapter->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, + rtw_proc); + + dir_dev = padapter->dir_dev; + + if(dir_dev==NULL) + { + if(rtw_proc_cnt == 0) + { + if(rtw_proc){ +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + remove_proc_entry(rtw_proc_name, proc_net); +#else + remove_proc_entry(rtw_proc_name, init_net.proc_net); +#endif + rtw_proc = NULL; + } + } + + DBG_8192C("Unable to create dir_dev directory\n"); + return; + } + } + else + { + return; + } + + rtw_proc_cnt++; + + entry = create_proc_read_entry("write_reg", S_IFREG | S_IRUGO, + dir_dev, proc_get_write_reg, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + entry->write_proc = proc_set_write_reg; + + entry = create_proc_read_entry("read_reg", S_IFREG | S_IRUGO, + dir_dev, proc_get_read_reg, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + entry->write_proc = proc_set_read_reg; + + + entry = create_proc_read_entry("fwstate", S_IFREG | S_IRUGO, + dir_dev, proc_get_fwstate, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + + entry = create_proc_read_entry("sec_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_sec_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + + entry = create_proc_read_entry("mlmext_state", S_IFREG | S_IRUGO, + dir_dev, proc_get_mlmext_state, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + + entry = create_proc_read_entry("qos_option", S_IFREG | S_IRUGO, + dir_dev, proc_get_qos_option, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("ht_option", S_IFREG | S_IRUGO, + dir_dev, proc_get_ht_option, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("rf_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_rf_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("ap_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_ap_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("adapter_state", S_IFREG | S_IRUGO, + dir_dev, proc_get_adapter_state, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + + entry = create_proc_read_entry("trx_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_trx_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + +#ifdef CONFIG_AP_MODE + + entry = create_proc_read_entry("all_sta_info", S_IFREG | S_IRUGO, + dir_dev, proc_get_all_sta_info, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } +#endif + +#ifdef MEMORY_LEAK_DEBUG + entry = create_proc_read_entry("_malloc_cnt", S_IFREG | S_IRUGO, + dir_dev, proc_get_malloc_cnt, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } +#endif + +#ifdef CONFIG_FIND_BEST_CHANNEL + entry = create_proc_read_entry("best_channel", S_IFREG | S_IRUGO, + dir_dev, proc_get_best_channel, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } +#endif + + entry = create_proc_read_entry("rx_signal", S_IFREG | S_IRUGO, + dir_dev, proc_get_rx_signal, dev); + if (!entry) { + DBG_871X("Unable to create_proc_read_entry!\n"); + return; + } + entry->write_proc = proc_set_rx_signal; + +} + +void rtw_proc_remove_one(struct net_device *dev) +{ + struct proc_dir_entry *dir_dev = NULL; + _adapter *padapter = rtw_netdev_priv(dev); + + + dir_dev = padapter->dir_dev; + padapter->dir_dev = NULL; + + if (dir_dev) { + + remove_proc_entry("write_reg", dir_dev); + remove_proc_entry("read_reg", dir_dev); + remove_proc_entry("fwstate", dir_dev); + remove_proc_entry("sec_info", dir_dev); + remove_proc_entry("mlmext_state", dir_dev); + remove_proc_entry("qos_option", dir_dev); + remove_proc_entry("ht_option", dir_dev); + remove_proc_entry("rf_info", dir_dev); + remove_proc_entry("ap_info", dir_dev); + remove_proc_entry("adapter_state", dir_dev); + remove_proc_entry("trx_info", dir_dev); + +#ifdef CONFIG_AP_MODE + remove_proc_entry("all_sta_info", dir_dev); +#endif + +#ifdef MEMORY_LEAK_DEBUG + remove_proc_entry("_malloc_cnt", dir_dev); +#endif + +#ifdef CONFIG_FIND_BEST_CHANNEL + remove_proc_entry("best_channel", dir_dev); +#endif + remove_proc_entry("rx_signal", dir_dev); + + remove_proc_entry(dev->name, rtw_proc); + dir_dev = NULL; + + } + else + { + return; + } + + rtw_proc_cnt--; + + if(rtw_proc_cnt == 0) + { + if(rtw_proc){ + remove_proc_entry("ver_info", rtw_proc); + +#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + remove_proc_entry(rtw_proc_name, proc_net); +#else + remove_proc_entry(rtw_proc_name, init_net.proc_net); +#endif + rtw_proc = NULL; + } + } +} +#endif + +uint loadparam( _adapter *padapter, _nic_hdl pnetdev) +{ + + uint status = _SUCCESS; + struct registry_priv *registry_par = &padapter->registrypriv; + +_func_enter_; + + registry_par->chip_version = (u8)rtw_chip_version; + registry_par->rfintfs = (u8)rtw_rfintfs; + registry_par->lbkmode = (u8)rtw_lbkmode; + //registry_par->hci = (u8)hci; + registry_par->network_mode = (u8)rtw_network_mode; + + _rtw_memcpy(registry_par->ssid.Ssid, "ANY", 3); + registry_par->ssid.SsidLength = 3; + + registry_par->channel = (u8)rtw_channel; + registry_par->wireless_mode = (u8)rtw_wireless_mode; + registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ; + registry_par->vcs_type = (u8)rtw_vcs_type; + registry_par->rts_thresh=(u16)rtw_rts_thresh; + registry_par->frag_thresh=(u16)rtw_frag_thresh; + registry_par->preamble = (u8)rtw_preamble; + registry_par->scan_mode = (u8)rtw_scan_mode; + registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr; + registry_par->soft_ap= (u8)rtw_soft_ap; + //registry_par->smart_ps = (u8)rtw_smart_ps; + registry_par->power_mgnt = (u8)rtw_power_mgnt; + registry_par->ips_mode = (u8)rtw_ips_mode; + registry_par->radio_enable = (u8)rtw_radio_enable; + registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt; + registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt; + registry_par->busy_thresh = (u16)rtw_busy_thresh; + //registry_par->qos_enable = (u8)rtw_qos_enable; + registry_par->ack_policy = (u8)rtw_ack_policy; + registry_par->mp_mode = (u8)rtw_mp_mode; + registry_par->software_encrypt = (u8)rtw_software_encrypt; + registry_par->software_decrypt = (u8)rtw_software_decrypt; + + //UAPSD + registry_par->wmm_enable = (u8)rtw_wmm_enable; + registry_par->uapsd_enable = (u8)rtw_uapsd_enable; + registry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp; + registry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en; + registry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en; + registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en; + registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en; + +#ifdef CONFIG_80211N_HT + registry_par->ht_enable = (u8)rtw_ht_enable; + registry_par->cbw40_enable = (u8)rtw_cbw40_enable; + registry_par->ampdu_enable = (u8)rtw_ampdu_enable; + registry_par->rx_stbc = (u8)rtw_rx_stbc; + registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu; +#endif + + registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit; + registry_par->rf_config = (u8)rtw_rf_config; + registry_par->low_power = (u8)rtw_low_power; + + + registry_par->wifi_spec = (u8)rtw_wifi_spec; + + registry_par->channel_plan = (u8)rtw_channel_plan; + +#ifdef CONFIG_BT_COEXIST + registry_par->bt_iso = (u8)rtw_bt_iso; + registry_par->bt_sco = (u8)rtw_bt_sco; + registry_par->bt_ampdu = (u8)rtw_bt_ampdu; +#endif + registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq; + + registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg; + +#ifdef CONFIG_AUTOSUSPEND + registry_par->usbss_enable = (u8)rtw_enusbss;//0:disable,1:enable +#endif +#ifdef SUPPORT_HW_RFOFF_DETECTED + registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;//0:disable,1:enable,2:by EFUSE config + registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;//0:disable,1:enable +#endif + + registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc; + +#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE + snprintf(registry_par->adaptor_info_caching_file_path, PATH_LENGTH_MAX, "%s",rtw_adaptor_info_caching_file_path); + registry_par->adaptor_info_caching_file_path[PATH_LENGTH_MAX-1]=0; +#endif + +#ifdef CONFIG_LAYER2_ROAMING + registry_par->max_roaming_times = (u8)rtw_max_roaming_times; +#endif + +_func_exit_; + + return status; + +} + +static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct sockaddr *addr = p; + + if(padapter->bup == _FALSE) + { + //DBG_8192C("r8711_net_set_mac_address(), MAC=%x:%x:%x:%x:%x:%x\n", addr->sa_data[0], addr->sa_data[1], addr->sa_data[2], addr->sa_data[3], + //addr->sa_data[4], addr->sa_data[5]); + _rtw_memcpy(padapter->eeprompriv.mac_addr, addr->sa_data, ETH_ALEN); + //_rtw_memcpy(pnetdev->dev_addr, addr->sa_data, ETH_ALEN); + //padapter->bset_hwaddr = _TRUE; + } + + return 0; +} + +static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + struct recv_priv *precvpriv = &(padapter->recvpriv); + + padapter->stats.tx_packets = pxmitpriv->tx_pkts;//pxmitpriv->tx_pkts++; + padapter->stats.rx_packets = precvpriv->rx_pkts;//precvpriv->rx_pkts++; + padapter->stats.tx_dropped = pxmitpriv->tx_drop; + padapter->stats.rx_dropped = precvpriv->rx_drop; + padapter->stats.tx_bytes = pxmitpriv->tx_bytes; + padapter->stats.rx_bytes = precvpriv->rx_bytes; + + return &padapter->stats; +} + +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) +static const struct net_device_ops rtw_netdev_ops = { + .ndo_open = netdev_open, + .ndo_stop = netdev_close, + .ndo_start_xmit = rtw_xmit_entry, + .ndo_set_mac_address = rtw_net_set_mac_address, + .ndo_get_stats = rtw_net_get_stats, + .ndo_do_ioctl = rtw_ioctl, +}; +#endif + +int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname) +{ + _adapter *padapter = rtw_netdev_priv(pnetdev); + +#ifdef CONFIG_EASY_REPLACEMENT + struct net_device *TargetNetdev = NULL; + _adapter *TargetAdapter = NULL; + struct net *devnet = NULL; + + if(padapter->bDongle == 1) + { +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) + TargetNetdev = dev_get_by_name("wlan0"); +#else + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)) + devnet = pnetdev->nd_net; + #else + devnet = dev_net(pnetdev); + #endif + TargetNetdev = dev_get_by_name(devnet, "wlan0"); +#endif + if(TargetNetdev) { + DBG_8192C("Force onboard module driver disappear !!!\n"); + TargetAdapter = rtw_netdev_priv(TargetNetdev); + TargetAdapter->DriverState = DRIVER_DISAPPEAR; + + padapter->pid[0] = TargetAdapter->pid[0]; + padapter->pid[1] = TargetAdapter->pid[1]; + padapter->pid[2] = TargetAdapter->pid[2]; + + dev_put(TargetNetdev); + unregister_netdev(TargetNetdev); +#ifdef CONFIG_PROC_DEBUG + if(TargetAdapter->chip_type == padapter->chip_type) + rtw_proc_remove_one(TargetNetdev); +#endif + padapter->DriverState = DRIVER_REPLACE_DONGLE; + } + } +#endif + + if(dev_alloc_name(pnetdev, ifname) < 0) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("dev_alloc_name, fail! \n")); + } + + netif_carrier_off(pnetdev); + //netif_stop_queue(pnetdev); + + return 0; +} + +struct net_device *rtw_init_netdev(_adapter *old_padapter) +{ + _adapter *padapter; + struct net_device *pnetdev; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+init_net_dev\n")); + + if(old_padapter != NULL) + pnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(_adapter), (void *)old_padapter); + else + pnetdev = rtw_alloc_etherdev(sizeof(_adapter)); + + if (!pnetdev) + return NULL; + + padapter = rtw_netdev_priv(pnetdev); + padapter->pnetdev = pnetdev; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + SET_MODULE_OWNER(pnetdev); +#endif + + //pnetdev->init = NULL; +#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) + + DBG_8192C("register rtw_netdev_ops to netdev_ops\n"); + pnetdev->netdev_ops = &rtw_netdev_ops; + +#else + pnetdev->open = netdev_open; + pnetdev->stop = netdev_close; + + pnetdev->hard_start_xmit = rtw_xmit_entry; + + pnetdev->set_mac_address = rtw_net_set_mac_address; + pnetdev->get_stats = rtw_net_get_stats; + + pnetdev->do_ioctl = rtw_ioctl; + +#endif + + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + pnetdev->features |= NETIF_F_IP_CSUM; +#endif + //pnetdev->tx_timeout = NULL; + pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */ + + pnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def; + +#ifdef WIRELESS_SPY + //priv->wireless_data.spy_data = &priv->spy_data; + //pnetdev->wireless_data = &priv->wireless_data; +#endif + + //step 2. + loadparam(padapter, pnetdev); + + return pnetdev; + +} + +u32 rtw_start_drv_threads(_adapter *padapter) +{ + + u32 _status = _SUCCESS; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_start_drv_threads\n")); + +#ifdef CONFIG_SDIO_HCI + padapter->xmitThread = kernel_thread(rtw_xmit_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->xmitThread < 0) + _status = _FAIL; +#endif + +#ifdef CONFIG_RECV_THREAD_MODE + padapter->recvThread = kernel_thread(recv_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->recvThread < 0) + _status = _FAIL; +#endif + + padapter->cmdThread = kernel_thread(rtw_cmd_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->cmdThread < 0) + _status = _FAIL; + +#ifdef CONFIG_EVENT_THREAD_MODE + padapter->evtThread = kernel_thread(event_thread, padapter, CLONE_FS|CLONE_FILES); + if(padapter->evtThread < 0) + _status = _FAIL; +#endif + + return _status; + +} + +void rtw_stop_drv_threads (_adapter *padapter) +{ + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_stop_drv_threads\n")); + + //Below is to termindate rtw_cmd_thread & event_thread... + _rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema); + //_rtw_up_sema(&padapter->cmdpriv.cmd_done_sema); + if(padapter->cmdThread){ + _rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); + } + +#ifdef CONFIG_EVENT_THREAD_MODE + _rtw_up_sema(&padapter->evtpriv.evt_notify); + if(padapter->evtThread){ + _rtw_down_sema(&padapter->evtpriv.terminate_evtthread_sema); + } +#endif + +#ifdef CONFIG_XMIT_THREAD_MODE + // Below is to termindate tx_thread... + _rtw_up_sema(&padapter->xmitpriv.xmit_sema); + _rtw_down_sema(&padapter->xmitpriv.terminate_xmitthread_sema); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt: rtw_xmit_thread can be terminated ! \n")); +#endif + +#ifdef CONFIG_RECV_THREAD_MODE + // Below is to termindate rx_thread... + _rtw_up_sema(&padapter->recvpriv.recv_sema); + _rtw_down_sema(&padapter->recvpriv.terminate_recvthread_sema); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("\n drv_halt:recv_thread can be terminated! \n")); +#endif + + +} + +u8 rtw_init_default_value(_adapter *padapter) +{ + u8 ret = _SUCCESS; + struct registry_priv* pregistrypriv = &padapter->registrypriv; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + struct recv_priv *precvpriv = &padapter->recvpriv; + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + //xmit_priv + pxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense; + pxmitpriv->vcs = pregistrypriv->vcs_type; + pxmitpriv->vcs_type = pregistrypriv->vcs_type; + //pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; + pxmitpriv->frag_len = pregistrypriv->frag_thresh; + + + + //recv_priv + + + //mlme_priv + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + pmlmepriv->scan_mode = SCAN_ACTIVE; + + //qos_priv + //pmlmepriv->qospriv.qos_option = pregistrypriv->wmm_enable; + + //ht_priv +#ifdef CONFIG_80211N_HT + pmlmepriv->htpriv.ampdu_enable = _FALSE;//set to disabled +#endif + + //security_priv + //rtw_get_encrypt_decrypt_from_registrypriv(padapter); + psecuritypriv->binstallGrpkey = _FAIL; + psecuritypriv->sw_encrypt=pregistrypriv->software_encrypt; + psecuritypriv->sw_decrypt=pregistrypriv->software_decrypt; + + psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system + psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; + + psecuritypriv->dot11PrivacyKeyIndex = 0; + + psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot118021XGrpKeyid = 1; + + psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; + psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled; + + + //pwrctrl_priv + + + //registry_priv + rtw_init_registrypriv_dev_network(padapter); + rtw_update_registrypriv_dev_network(padapter); + + + //hal_priv + padapter->HalFunc.init_default_value(padapter); + + //misc. + padapter->bReadPortCancel = _FALSE; + padapter->bWritePortCancel = _FALSE; + padapter->bRxRSSIDisplay = 0; + + return ret; +} + +u8 rtw_reset_drv_sw(_adapter *padapter) +{ + u8 ret8=_SUCCESS; + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + + //hal_priv + padapter->HalFunc.init_default_value(padapter); + padapter->bReadPortCancel = _FALSE; + padapter->bWritePortCancel = _FALSE; + padapter->bRxRSSIDisplay = 0; + pmlmepriv->scan_interval = SCAN_INTERVAL;// 30*2 sec = 60sec + pmlmepriv->scan_mode = SCAN_ACTIVE; // 1: active scan ,0 passive scan + + pwrctrlpriv->bips_processing = _FALSE; + pwrctrlpriv->rf_pwrstate = rf_on; + pwrctrlpriv->bInSuspend = _FALSE; + + padapter->xmitpriv.tx_pkts = 0; + padapter->recvpriv.rx_pkts = 0; + + pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; + + _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY |_FW_UNDER_LINKING); + +#ifdef CONFIG_AUTOSUSPEND + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) + padapter->dvobjpriv.pusbdev->autosuspend_disabled = 1;//autosuspend disabled by the user + #endif +#endif + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + if(padapter->HalFunc.sreset_reset_value) + padapter->HalFunc.sreset_reset_value(padapter); +#endif + pwrctrlpriv->pwr_state_check_cnts = 0; + + //mlmeextpriv + padapter->mlmeextpriv.sitesurvey_res.state= SCAN_DISABLE; + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + rtw_set_signal_stat_timer(&padapter->recvpriv); +#endif + + return ret8; +} + + +u8 rtw_init_drv_sw(_adapter *padapter) +{ + + u8 ret8=_SUCCESS; + +_func_enter_; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_init_drv_sw\n")); + + if ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init cmd_priv\n")); + ret8=_FAIL; + goto exit; + } + + padapter->cmdpriv.padapter=padapter; + + if ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init evt_priv\n")); + ret8=_FAIL; + goto exit; + } + + + if (rtw_init_mlme_priv(padapter) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_priv\n")); + ret8=_FAIL; + goto exit; + } + + if(init_mlme_ext_priv(padapter) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't init mlme_ext_priv\n")); + ret8=_FAIL; + goto exit; + } + + if(_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) + { + DBG_871X("Can't _rtw_init_xmit_priv\n"); + ret8=_FAIL; + goto exit; + } + + if(_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL) + { + DBG_871X("Can't _rtw_init_recv_priv\n"); + ret8=_FAIL; + goto exit; + } + + _rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv)); + //_init_timer(&(padapter->securitypriv.tkip_timer), padapter->pnetdev, rtw_use_tkipkey_handler, padapter); + + if(_rtw_init_sta_priv(&padapter->stapriv) == _FAIL) + { + DBG_871X("Can't _rtw_init_sta_priv\n"); + ret8=_FAIL; + goto exit; + } + + padapter->stapriv.padapter = padapter; + + rtw_init_bcmc_stainfo(padapter); + + rtw_init_pwrctrl_priv(padapter); + + //_rtw_memset((u8 *)&padapter->qospriv, 0, sizeof (struct qos_priv));//move to mlme_priv + +#ifdef CONFIG_MP_INCLUDED + if (init_mp_priv(padapter) == _FAIL) { + ERR_8192C("%s: initialize MP private data Fail!\n", __func__); + } +#endif + + ret8 = rtw_init_default_value(padapter); + + rtw_dm_init(padapter); + rtw_sw_led_init(padapter); + +#ifdef SILENT_RESET_FOR_SPECIFIC_PLATFOM + rtw_sreset_init(padapter); +#endif //SILENT_RESET_FOR_SPECIFIC_PLATFOM + +exit: + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_init_drv_sw\n")); + + _func_exit_; + + return ret8; + +} + +void rtw_cancel_all_timer(_adapter *padapter) +{ + RT_TRACE(_module_os_intfs_c_,_drv_info_,("+rtw_cancel_all_timer\n")); + + _cancel_timer_ex(&padapter->mlmepriv.assoc_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel association timer complete! \n")); + + //_cancel_timer_ex(&padapter->securitypriv.tkip_timer); + //RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel tkip_timer! \n")); + + _cancel_timer_ex(&padapter->mlmepriv.scan_to_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel scan_to_timer! \n")); + + _cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel dynamic_chk_timer! \n")); + + // cancel sw led timer + rtw_sw_led_deinit(padapter); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel DeInitSwLeds! \n")); + + _cancel_timer_ex(&padapter->pwrctrlpriv.pwr_state_check_timer); + + +#ifdef CONFIG_SET_SCAN_DENY_TIMER + _cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer); + RT_TRACE(_module_os_intfs_c_,_drv_info_,("rtw_cancel_all_timer:cancel set_scan_deny_timer! \n")); +#endif + +#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS + _cancel_timer_ex(&padapter->recvpriv.signal_stat_timer); +#endif + + // cancel dm timer + padapter->HalFunc.dm_deinit(padapter); + +} + +u8 rtw_free_drv_sw(_adapter *padapter) +{ + + + struct net_device *pnetdev = (struct net_device*)padapter->pnetdev; + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("==>rtw_free_drv_sw")); + + free_mlme_ext_priv(&padapter->mlmeextpriv); + + rtw_free_cmd_priv(&padapter->cmdpriv); + + rtw_free_evt_priv(&padapter->evtpriv); + + rtw_free_mlme_priv(&padapter->mlmepriv); + + //free_io_queue(padapter); + + _rtw_free_xmit_priv(&padapter->xmitpriv); + + _rtw_free_sta_priv(&padapter->stapriv); //will free bcmc_stainfo here + + _rtw_free_recv_priv(&padapter->recvpriv); + + rtw_free_pwrctrl_priv(padapter); + + //rtw_mfree((void *)padapter, sizeof (padapter)); + +#ifdef CONFIG_DRVEXT_MODULE + free_drvext(&padapter->drvextpriv); +#endif + + padapter->HalFunc.free_hal_data(padapter); + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("<==rtw_free_drv_sw\n")); + + //free the old_pnetdev + if(padapter->old_pnetdev) { + free_netdev(padapter->old_pnetdev); + padapter->old_pnetdev = NULL; + } + + if(pnetdev) + { + rtw_free_netdev(pnetdev); + } + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-rtw_free_drv_sw\n")); + + return _SUCCESS; + +} + +static int netdev_open(struct net_device *pnetdev) +{ + uint status; + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; + + printk("+871x_drv - dev_open\n"); + DBG_8192C("+871x_drv - drv_open, bup=%d\n", padapter->bup); + + if(pwrctrlpriv->ps_flag == _TRUE){ + padapter->net_closed = _FALSE; + goto netdev_open_normal_process; + } + + if(padapter->bup == _FALSE) + { + padapter->bDriverStopped = _FALSE; + padapter->bSurpriseRemoved = _FALSE; + padapter->bCardDisableWOHSM = _FALSE; + + status = rtw_hal_init(padapter); + if (status ==_FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("rtl871x_hal_init(): Can't init h/w!\n")); + goto netdev_open_error; + } + + printk("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr)); + + + status=rtw_start_drv_threads(padapter); + if(status ==_FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n")); + goto netdev_open_error; + } + + + if (init_hw_mlme_ext(padapter) == _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("can't init mlme_ext_priv\n")); + goto netdev_open_error; + } + + +#ifdef CONFIG_DRVEXT_MODULE + init_drvext(padapter); +#endif + + if(padapter->intf_start) + { + padapter->intf_start(padapter); + } + +#ifdef CONFIG_PROC_DEBUG +#ifndef RTK_DMP_PLATFORM + rtw_proc_init_one(pnetdev); +#endif +#endif + padapter->bup = _TRUE; + } + padapter->net_closed = _FALSE; + + _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000); + + if(( pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE ) ||(padapter->pwrctrlpriv.bHWPwrPindetect)) + { + padapter->pwrctrlpriv.bips_processing = _FALSE; + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + } + + //netif_carrier_on(pnetdev);//call this func when rtw_joinbss_event_callback return success + if(!netif_queue_stopped(pnetdev)) + netif_start_queue(pnetdev); + else + netif_wake_queue(pnetdev); + +netdev_open_normal_process: + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - dev_open\n")); + DBG_8192C("-871x_drv - drv_open, bup=%d\n", padapter->bup); + + return 0; + +netdev_open_error: + + padapter->bup = _FALSE; + + netif_carrier_off(pnetdev); + netif_stop_queue(pnetdev); + + RT_TRACE(_module_os_intfs_c_,_drv_err_,("-871x_drv - dev_open, fail!\n")); + DBG_8192C("-871x_drv - drv_open fail, bup=%d\n", padapter->bup); + + return (-1); + +} + + + +#ifdef CONFIG_IPS +int ips_netdrv_open(_adapter *padapter) +{ + int status = _SUCCESS; + padapter->net_closed = _FALSE; + DBG_8192C("===> %s.........\n",__FUNCTION__); + + + padapter->bDriverStopped = _FALSE; + padapter->bSurpriseRemoved = _FALSE; + padapter->bCardDisableWOHSM = _FALSE; + padapter->bup = _TRUE; + + status = rtw_hal_init(padapter); + if (status ==_FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("ips_netdrv_open(): Can't init h/w!\n")); + goto netdev_open_error; + } + + if(padapter->intf_start) + { + padapter->intf_start(padapter); + } + + rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); + _set_timer(&padapter->mlmepriv.dynamic_chk_timer,5000); + + return _SUCCESS; + +netdev_open_error: + padapter->bup = _FALSE; + DBG_8192C("-ips_netdrv_open - drv_open failure, bup=%d\n", padapter->bup); + + return _FAIL; +} + + +int rtw_ips_pwr_up(_adapter *padapter) +{ + int result; + u32 start_time = rtw_get_current_time(); + DBG_8192C("===> rtw_ips_pwr_up..............\n"); + rtw_reset_drv_sw(padapter); + result = ips_netdrv_open(padapter); + DBG_8192C("<=== rtw_ips_pwr_up.............. in %dms\n", rtw_get_passing_time_ms(start_time)); + return result; + +} + +void rtw_ips_pwr_down(_adapter *padapter) +{ + u32 start_time = rtw_get_current_time(); + DBG_8192C("===> rtw_ips_pwr_down...................\n"); + + padapter->bCardDisableWOHSM = _TRUE; + padapter->net_closed = _TRUE; + + rtw_led_control(padapter, LED_CTL_NO_LINK); + + rtw_ips_dev_unload(padapter); + padapter->bCardDisableWOHSM = _FALSE; + DBG_8192C("<=== rtw_ips_pwr_down..................... in %dms\n", rtw_get_passing_time_ms(start_time)); +} +#endif +void rtw_ips_dev_unload(_adapter *padapter) +{ + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; + struct xmit_priv *pxmitpriv = &(padapter->xmitpriv); + DBG_8192C("====> %s...\n",__FUNCTION__); + + padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_FIFO_CLEARN_UP, 0); + + if(padapter->intf_stop) + { + padapter->intf_stop(padapter); + } + + //s5. + if(padapter->bSurpriseRemoved == _FALSE) + { + rtw_hal_deinit(padapter); + } + +} + +int pm_netdev_open(struct net_device *pnetdev,u8 bnormal) +{ + int status; + if(bnormal) + status = netdev_open(pnetdev); +#ifdef CONFIG_IPS + else + status = (_SUCCESS == ips_netdrv_open((_adapter *)rtw_netdev_priv(pnetdev)))?(0):(-1); +#endif + + return status; +} +//extern int rfpwrstate_check(_adapter *padapter); +static int netdev_close(struct net_device *pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + + printk("+871x_drv - drv_close\n"); + + if(padapter->pwrctrlpriv.bInternalAutoSuspend == _TRUE) + { + //rfpwrstate_check(padapter); + if(padapter->pwrctrlpriv.rf_pwrstate == rf_off) + padapter->pwrctrlpriv.ps_flag = _TRUE; + } + padapter->net_closed = _TRUE; + +/* if(!padapter->hw_init_completed) + { + DBG_8192C("(1)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed); + + padapter->bDriverStopped = _TRUE; + + rtw_dev_unload(padapter); + } + else*/ + if(padapter->pwrctrlpriv.rf_pwrstate == rf_on){ + DBG_8192C("(2)871x_drv - drv_close, bup=%d, hw_init_completed=%d\n", padapter->bup, padapter->hw_init_completed); + + //s1. + if(pnetdev) + { + if (!netif_queue_stopped(pnetdev)) + netif_stop_queue(pnetdev); + } + +#ifndef CONFIG_ANDROID + //s2. + //s2-1. issue rtw_disassoc_cmd to fw + rtw_disassoc_cmd(padapter); + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter); + //s2-4. + rtw_free_network_queue(padapter,_TRUE); +#endif + // Close LED + rtw_led_control(padapter, LED_CTL_POWER_OFF); + } + + RT_TRACE(_module_os_intfs_c_,_drv_info_,("-871x_drv - drv_close\n")); + DBG_8192C("-871x_drv - drv_close, bup=%d\n", padapter->bup); + + return 0; + +} + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c new file mode 100755 index 000000000000..02bceb48a96e --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/recv_linux.c @@ -0,0 +1,391 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#define _RECV_OSDEP_C_ + +#include +#include +#include + +#include +#include + +#include +#include + +#ifdef CONFIG_USB_HCI +#include +#endif + +//init os related resource in struct recv_priv +int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter) +{ + int res=_SUCCESS; + + return res; +} + +//alloc os related resource in union recv_frame +int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe) +{ + int res=_SUCCESS; + + precvframe->u.hdr.pkt_newalloc = precvframe->u.hdr.pkt = NULL; + + return res; + +} + +//free os related resource in union recv_frame +void rtw_os_recv_resource_free(struct recv_priv *precvpriv) +{ + +} + + +//alloc os related resource in struct recv_buf +int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf) +{ + int res=_SUCCESS; + +#ifdef CONFIG_USB_HCI + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + + precvbuf->irp_pending = _FALSE; + precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL); + if(precvbuf->purb == NULL){ + res = _FAIL; + } + + precvbuf->pskb = NULL; + + precvbuf->reuse = _FALSE; + + precvbuf->pallocated_buf = precvbuf->pbuf = NULL; + + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL; + + precvbuf->transfer_len = 0; + + precvbuf->len = 0; + + #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + precvbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)precvbuf->alloc_sz, GFP_ATOMIC, &precvbuf->dma_transfer_addr); + precvbuf->pbuf = precvbuf->pallocated_buf; + if(precvbuf->pallocated_buf == NULL) + return _FAIL; + #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX + +#endif //CONFIG_USB_HCI + + +#ifdef CONFIG_SDIO_HCI + precvbuf->pskb = NULL; + + precvbuf->pallocated_buf = precvbuf->pbuf = NULL; + + precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL; + + precvbuf->len = 0; +#endif + return res; + +} + +//free os related resource in struct recv_buf +int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf) +{ + int ret = _SUCCESS; + +#ifdef CONFIG_USB_HCI + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX + + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + + rtw_usb_buffer_free(pusbd, (size_t)precvbuf->alloc_sz, precvbuf->pallocated_buf, precvbuf->dma_transfer_addr); + precvbuf->pallocated_buf = NULL; + precvbuf->dma_transfer_addr = 0; + +#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX + + if(precvbuf->purb) + { + //usb_kill_urb(precvbuf->purb); + usb_free_urb(precvbuf->purb); + } + +#endif + + + if(precvbuf->pskb) + dev_kfree_skb_any(precvbuf->pskb); + + + return ret; + +} + +void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup) +{ + union iwreq_data wrqu; + struct iw_michaelmicfailure ev; + struct mlme_priv* pmlmepriv = &padapter->mlmepriv; + + + _rtw_memset( &ev, 0x00, sizeof( ev ) ); + if ( bgroup ) + { + ev.flags |= IW_MICFAILURE_GROUP; + } + else + { + ev.flags |= IW_MICFAILURE_PAIRWISE; + } + + ev.src_addr.sa_family = ARPHRD_ETHER; + _rtw_memcpy( ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN ); + + _rtw_memset( &wrqu, 0x00, sizeof( wrqu ) ); + wrqu.data.length = sizeof( ev ); + + wireless_send_event( padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu, (char*) &ev ); +} + +void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame) +{ +#ifdef CONFIG_HOSTAPD_MLME + _pkt *skb; + struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; + struct net_device *pmgnt_netdev = phostapdpriv->pmgnt_netdev; + + RT_TRACE(_module_recv_osdep_c_, _drv_info_, ("+rtw_hostapd_mlme_rx\n")); + + skb = precv_frame->u.hdr.pkt; + + if (skb == NULL) + return; + + skb->data = precv_frame->u.hdr.rx_data; + skb->tail = precv_frame->u.hdr.rx_tail; + skb->len = precv_frame->u.hdr.len; + + //pskb_copy = skb_copy(skb, GFP_ATOMIC); +// if(skb == NULL) goto _exit; + + skb->dev = pmgnt_netdev; + skb->ip_summed = CHECKSUM_NONE; + skb->pkt_type = PACKET_OTHERHOST; + //skb->protocol = __constant_htons(0x0019); /*ETH_P_80211_RAW*/ + skb->protocol = __constant_htons(0x0003); /*ETH_P_80211_RAW*/ + + //DBG_8192C("(1)data=0x%x, head=0x%x, tail=0x%x, mac_header=0x%x, len=%d\n", skb->data, skb->head, skb->tail, skb->mac_header, skb->len); + + //skb->mac.raw = skb->data; + skb_reset_mac_header(skb); + + //skb_pull(skb, 24); + _rtw_memset(skb->cb, 0, sizeof(skb->cb)); + + netif_rx(skb); + + precv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call netif_rx() +#endif +} + +int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame) +{ + struct recv_priv *precvpriv; + _queue *pfree_recv_queue; + _pkt *skb; + struct mlme_priv*pmlmepriv = &padapter->mlmepriv; +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; +#endif + +_func_enter_; + + precvpriv = &(padapter->recvpriv); + pfree_recv_queue = &(precvpriv->free_recv_queue); + +#ifdef CONFIG_DRVEXT_MODULE + if (drvext_rx_handler(padapter, precv_frame->u.hdr.rx_data, precv_frame->u.hdr.len) == _SUCCESS) + { + goto _recv_indicatepkt_drop; + } +#endif + + skb = precv_frame->u.hdr.pkt; + if(skb == NULL) + { + RT_TRACE(_module_recv_osdep_c_,_drv_err_,("rtw_recv_indicatepkt():skb==NULL something wrong!!!!\n")); + goto _recv_indicatepkt_drop; + } + + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():skb != NULL !!!\n")); + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():precv_frame->u.hdr.rx_head=%p precv_frame->hdr.rx_data=%p\n", precv_frame->u.hdr.rx_head, precv_frame->u.hdr.rx_data)); + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("precv_frame->hdr.rx_tail=%p precv_frame->u.hdr.rx_end=%p precv_frame->hdr.len=%d \n", precv_frame->u.hdr.rx_tail, precv_frame->u.hdr.rx_end, precv_frame->u.hdr.len)); + + skb->data = precv_frame->u.hdr.rx_data; + +#ifdef NET_SKBUFF_DATA_USES_OFFSET + skb_set_tail_pointer(skb, precv_frame->u.hdr.len); +#else + skb->tail = precv_frame->u.hdr.rx_tail; +#endif + + skb->len = precv_frame->u.hdr.len; + + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n skb->head=%p skb->data=%p skb->tail=%p skb->end=%p skb->len=%d\n", skb->head, skb->data, skb->tail, skb->end, skb->len)); + + if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) + { + _pkt *pskb2=NULL; + struct sta_info *psta = NULL; + struct sta_priv *pstapriv = &padapter->stapriv; + struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; + int bmcast = IS_MCAST(pattrib->dst); + + //DBG_871X("bmcast=%d\n", bmcast); + + if(_rtw_memcmp(pattrib->dst, myid(&padapter->eeprompriv), ETH_ALEN)==_FALSE) + { + //DBG_871X("not ap psta=%p, addr=%pM\n", psta, pattrib->dst); + + if(bmcast) + { + psta = rtw_get_bcmc_stainfo(padapter); + pskb2 = skb_clone(skb, GFP_ATOMIC); + } else { + psta = rtw_get_stainfo(pstapriv, pattrib->dst); + } + + if(psta) + { + //DBG_871X("directly forwarding to the rtw_xmit_entry\n"); + + //skb->ip_summed = CHECKSUM_NONE; + //skb->protocol = eth_type_trans(skb, pnetdev); + + skb->dev = padapter->pnetdev; + rtw_xmit_entry(skb, padapter->pnetdev); + + if(bmcast) + skb = pskb2; + else + goto _recv_indicatepkt_end; + } + + + } + else// to APself + { + //DBG_871X("to APSelf\n"); + } + } + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX + if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) { + skb->ip_summed = CHECKSUM_UNNECESSARY; + //DBG_8192C("CHECKSUM_UNNECESSARY \n"); + } else { + skb->ip_summed = CHECKSUM_NONE; + //DBG_8192C("CHECKSUM_NONE(%d, %d) \n", pattrib->tcpchk_valid, pattrib->tcp_chkrpt); + } +#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */ + + skb->ip_summed = CHECKSUM_NONE; + +#endif + + skb->dev = padapter->pnetdev; + skb->protocol = eth_type_trans(skb, padapter->pnetdev); + + netif_rx(skb); + +_recv_indicatepkt_end: + + precv_frame->u.hdr.pkt = NULL; // pointers to NULL before rtw_free_recvframe() + + rtw_free_recvframe(precv_frame, pfree_recv_queue); + + RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after netif_rx!!!!\n")); + +_func_exit_; + + return _SUCCESS; + +_recv_indicatepkt_drop: + + //enqueue back to free_recv_queue + if(precv_frame) + rtw_free_recvframe(precv_frame, pfree_recv_queue); + + + precvpriv->rx_drop++; + + return _FAIL; + +_func_exit_; + +} + +void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf) +{ + struct recv_priv *precvpriv = &padapter->recvpriv; + +#ifdef CONFIG_USB_HCI + + precvbuf->ref_cnt--; + + //free skb in recv_buf + dev_kfree_skb_any(precvbuf->pskb); + + precvbuf->pskb = NULL; + precvbuf->reuse = _FALSE; + + if(precvbuf->irp_pending == _FALSE) + { + rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); + } + + +#endif +#ifdef CONFIG_SDIO_HCI + precvbuf->pskb = NULL; +#endif + +} +void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext); +void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext) +{ + struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)FunctionContext; + rtw_reordering_ctrl_timeout_handler(preorder_ctrl); +} + +void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl) +{ + _adapter *padapter = preorder_ctrl->padapter; + + _init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, _rtw_reordering_ctrl_timeout_handler, preorder_ctrl); + +} + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c new file mode 100755 index 000000000000..9d05d0c67dc0 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/usb_intf.c @@ -0,0 +1,1497 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _HCI_INTF_C_ + +#include +#include +#include +#include +#include +#include +#include + +#ifndef CONFIG_USB_HCI + +#error "CONFIG_USB_HCI shall be on!\n" + +#endif + +#include "wifi_power.h" +#include +#include +#include +#include +#ifdef CONFIG_PLATFORM_RTK_DMP +#include +#endif + +#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS) + +#error "Shall be Linux or Windows, but not both!\n" + +#endif + +#ifdef CONFIG_80211N_HT +extern int rtw_ht_enable; +extern int rtw_cbw40_enable; +extern int rtw_ampdu_enable;//for enable tx_ampdu +#endif + +static struct usb_interface *pintf; + +#ifdef CONFIG_GLOBAL_UI_PID +int ui_pid[3] = {0, 0, 0}; +#endif +int sleep_resume = 1; + +extern void rtl8188_power_save_exit(void); +extern void rtl8188_power_save_init(void); + +extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal); +static int rtw_suspend(struct usb_interface *intf, pm_message_t message); +static int rtw_resume(struct usb_interface *intf); +int rtw_resume_process(struct usb_interface *pusb_intf); + + +static int rtw_drv_init(struct usb_interface *pusb_intf,const struct usb_device_id *pdid); +static void rtw_dev_remove(struct usb_interface *pusb_intf); + +#define USB_VENDER_ID_REALTEK 0x0BDA + +//DID_USB_v82_20110808 +static struct usb_device_id rtw_usb_id_tbl[] ={ +#ifdef CONFIG_RTL8192C + /*=== Realtek demoboard ===*/ + {USB_DEVICE(0x0BDA, 0x8191)},//Default ID + + /****** 8188CUS ********/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8176)},//8188cu 1*1 dongole + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8170)},//8188CE-VAU USB minCard + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817E)},//8188CE-VAU USB minCard + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817A)},//8188cu Slim Solo + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817B)},//8188cu Slim Combo + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817D)},//8188RU High-power USB Dongle + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8754)},//8188 Combo for BC4 + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817F)},//8188RU + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x818A)},//RTL8188CUS-VL + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x018A)},//RTL8188CTV + + /****** 8192CUS ********/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8177)},//8191cu 1*2 + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8178)},//8192cu 2*2 + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817C)},//8192CE-VAU USB minCard + + + /*=== Customer ID ===*/ + /****** 8188CUS Dongle ********/ + {USB_DEVICE(0x2019, 0xED17)},//PCI - Edimax + {USB_DEVICE(0x0DF6, 0x0052)},//Sitecom - Edimax + {USB_DEVICE(0x7392, 0x7811)},//Edimax - Edimax + {USB_DEVICE(0x07B8, 0x8189)},//Abocom - Abocom + {USB_DEVICE(0x0EB0, 0x9071)},//NO Brand - Etop + {USB_DEVICE(0x06F8, 0xE033)},//Hercules - Edimax + {USB_DEVICE(0x103C, 0x1629)},//HP - Lite-On ,8188CUS Slim Combo + {USB_DEVICE(0x2001, 0x3308)},//D-Link - Alpha + {USB_DEVICE(0x050D, 0x1102)},//Belkin - Edimax + {USB_DEVICE(0x2019, 0xAB2A)},//Planex - Abocom + {USB_DEVICE(0x20F4, 0x648B)},//TRENDnet - Cameo + {USB_DEVICE(0x4855, 0x0090)},// - Feixun + {USB_DEVICE(0x13D3, 0x3357)},// - AzureWave + {USB_DEVICE(0x0DF6, 0x005C)},//Sitecom - Edimax + {USB_DEVICE(0x0BDA, 0x5088)},//Thinkware - CC&C + {USB_DEVICE(0x4856, 0x0091)},//NetweeN - Feixun + {USB_DEVICE(0x2019, 0x4902)},//Planex - Etop + {USB_DEVICE(0x2019, 0xAB2E)},//SW-WF02-AD15 -Abocom + + /****** 8188 RU ********/ + {USB_DEVICE(0x0BDA, 0x317F)},//Netcore,Netcore + + /****** 8188CE-VAU ********/ + {USB_DEVICE(0x13D3, 0x3359)},// - Azwave + {USB_DEVICE(0x13D3, 0x3358)},// - Azwave + + /****** 8188CUS Slim Solo********/ + {USB_DEVICE(0x04F2, 0xAFF7)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFF9)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFFA)},//XAVI - XAVI + + /****** 8188CUS Slim Combo ********/ + {USB_DEVICE(0x04F2, 0xAFF8)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFFB)},//XAVI - XAVI + {USB_DEVICE(0x04F2, 0xAFFC)},//XAVI - XAVI + {USB_DEVICE(0x2019, 0x1201)},//Planex - Vencer + + /****** 8192CUS Dongle ********/ + {USB_DEVICE(0x2001, 0x3307)},//D-Link - Cameo + {USB_DEVICE(0x2001, 0x330A)},//D-Link - Alpha + {USB_DEVICE(0x2001, 0x3309)},//D-Link - Alpha + {USB_DEVICE(0x0586, 0x341F)},//Zyxel - Abocom + {USB_DEVICE(0x7392, 0x7822)},//Edimax - Edimax + {USB_DEVICE(0x2019, 0xAB2B)},//Planex - Abocom + {USB_DEVICE(0x07B8, 0x8178)},//Abocom - Abocom + {USB_DEVICE(0x07AA, 0x0056)},//ATKK - Gemtek + {USB_DEVICE(0x4855, 0x0091)},// - Feixun + {USB_DEVICE(0x2001, 0x3307)},//D-Link-Cameo + {USB_DEVICE(0x050D, 0x2102)},//Belkin - Sercomm + {USB_DEVICE(0x050D, 0x2103)},//Belkin - Edimax + {USB_DEVICE(0x20F4, 0x624D)},//TRENDnet + {USB_DEVICE(0x0DF6, 0x0061)},//Sitecom - Edimax + {USB_DEVICE(0x0B05, 0x17AB)},//ASUS - Edimax + {USB_DEVICE(0x0846, 0x9021)},//Netgear - Sercomm + {USB_DEVICE(0x0E66, 0x0019)},//Hawking,Edimax + + /****** 8192CE-VAU ********/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8186)},//Intel-Xavi( Azwave) +#endif +#ifdef CONFIG_RTL8192D + /*=== Realtek demoboard ===*/ + /****** 8192DU ********/ + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8193)},//8192DU-VC + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8194)},//8192DU-VS + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8111)},//Realtek 5G dongle for WiFi Display + {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0193)},//8192DE-VAU + + /*=== Customer ID ===*/ + /****** 8192DU-VC ********/ + {USB_DEVICE(0x2019, 0xAB2C)},//PCI - Abocm + {USB_DEVICE(0x2019, 0x4903)},//PCI - ETOP + {USB_DEVICE(0x2019, 0x4904)},//PCI - ETOP + {USB_DEVICE(0x07B8, 0x8193)},//Abocom - Abocom + + /****** 8192DU-VS ********/ + {USB_DEVICE(0x20F4, 0x664B)},//TRENDnet + + /****** 8192DU-WiFi Display Dongle ********/ + {USB_DEVICE(0x2019, 0xAB2D)},//Planex - Abocom ,5G dongle for WiFi Display +#endif + {} /* Terminating entry */ +}; + +int const rtw_usb_id_len = sizeof(rtw_usb_id_tbl) / sizeof(struct usb_device_id); + +static struct specific_device_id specific_device_id_tbl[] = { + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8177, .flags=SPEC_DEV_ID_DISABLE_HT},//8188cu 1*1 dongole, (b/g mode only) + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x817E, .flags=SPEC_DEV_ID_DISABLE_HT},//8188CE-VAU USB minCard (b/g mode only) + {.idVendor=0x0b05, .idProduct=0x1791, .flags=SPEC_DEV_ID_DISABLE_HT}, + {.idVendor=0x13D3, .idProduct=0x3311, .flags=SPEC_DEV_ID_DISABLE_HT}, + {.idVendor=0x13D3, .idProduct=0x3359, .flags=SPEC_DEV_ID_DISABLE_HT},//Russian customer -Azwave (8188CE-VAU g mode) +#ifdef RTK_DMP_PLATFORM + {.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8111, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // Realtek 5G dongle for WiFi Display + {.idVendor=0x2019, .idProduct=0xAB2D, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // PCI-Abocom 5G dongle for WiFi Display +#endif /* RTK_DMP_PLATFORM */ + {} +}; + +typedef struct _driver_priv{ + + struct usb_driver rtw_usb_drv; + int drv_registered; + +}drv_priv, *pdrv_priv; + + +static drv_priv drvpriv = { + .rtw_usb_drv.name = (char*)DRV_NAME, + .rtw_usb_drv.probe = rtw_drv_init, + .rtw_usb_drv.disconnect = rtw_dev_remove, + .rtw_usb_drv.id_table = rtw_usb_id_tbl, + .rtw_usb_drv.suspend = rtw_suspend, + .rtw_usb_drv.resume = rtw_resume, +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22)) + .rtw_usb_drv.reset_resume = rtw_resume, +#endif +#ifdef CONFIG_AUTOSUSPEND + .rtw_usb_drv.supports_autosuspend = 1, +#endif +}; + +MODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl); + + +static inline int RT_usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); +} + +static inline int RT_usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); +} + +static inline int RT_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT); +} + +static inline int RT_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK); +} + +static inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd) +{ + return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_in(epd)); +} + +static inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd) +{ + return (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_out(epd)); +} + +static inline int RT_usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd) +{ + return (RT_usb_endpoint_xfer_int(epd) && RT_usb_endpoint_dir_in(epd)); +} + +static inline int RT_usb_endpoint_num(const struct usb_endpoint_descriptor *epd) +{ + return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; +} + +u8 rtw_init_intf_priv(_adapter * padapter) +{ + u8 rst = _SUCCESS; + + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _rtw_mutex_init(&padapter->dvobjpriv.usb_vendor_req_mutex); + #endif + + +#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + padapter->dvobjpriv.usb_alloc_vendor_req_buf = rtw_zmalloc(MAX_USB_IO_CTL_SIZE); + + if (padapter->dvobjpriv.usb_alloc_vendor_req_buf == NULL){ + padapter->dvobjpriv.usb_alloc_vendor_req_buf =NULL; + printk("alloc usb_vendor_req_buf failed... /n"); + rst = _FAIL; + goto exit; + } + padapter->dvobjpriv.usb_vendor_req_buf = + (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(padapter->dvobjpriv.usb_alloc_vendor_req_buf ), ALIGNMENT_UNIT); +exit: +#endif //CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + + return rst; + +} + +u8 rtw_deinit_intf_priv(_adapter * padapter) +{ + u8 rst = _SUCCESS; + + #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + if(padapter->dvobjpriv.usb_vendor_req_buf) + { + rtw_mfree(padapter->dvobjpriv.usb_alloc_vendor_req_buf,MAX_USB_IO_CTL_SIZE); + } + #endif //CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC + + + #ifdef CONFIG_USB_VENDOR_REQ_MUTEX + _rtw_mutex_free(&padapter->dvobjpriv.usb_vendor_req_mutex); + #endif + + return rst; + +} + +static u32 usb_dvobj_init(_adapter *padapter) +{ + int i; + u8 val8; + int status = _SUCCESS; + struct usb_device_descriptor *pdev_desc; + struct usb_host_config *phost_conf; + struct usb_config_descriptor *pconf_desc; + struct usb_host_interface *phost_iface; + struct usb_interface_descriptor *piface_desc; + struct usb_host_endpoint *phost_endp; + struct usb_endpoint_descriptor *pendp_desc; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + +_func_enter_; + + pdvobjpriv->padapter = padapter; + + pdvobjpriv->RtNumInPipes = 0; + pdvobjpriv->RtNumOutPipes = 0; + + //padapter->EepromAddressSize = 6; + //pdvobjpriv->nr_endpoint = 6; + + pdev_desc = &pusbd->descriptor; + +#if 0 + DBG_8192C("\n8712_usb_device_descriptor:\n"); + DBG_8192C("bLength=%x\n", pdev_desc->bLength); + DBG_8192C("bDescriptorType=%x\n", pdev_desc->bDescriptorType); + DBG_8192C("bcdUSB=%x\n", pdev_desc->bcdUSB); + DBG_8192C("bDeviceClass=%x\n", pdev_desc->bDeviceClass); + DBG_8192C("bDeviceSubClass=%x\n", pdev_desc->bDeviceSubClass); + DBG_8192C("bDeviceProtocol=%x\n", pdev_desc->bDeviceProtocol); + DBG_8192C("bMaxPacketSize0=%x\n", pdev_desc->bMaxPacketSize0); + DBG_8192C("idVendor=%x\n", pdev_desc->idVendor); + DBG_8192C("idProduct=%x\n", pdev_desc->idProduct); + DBG_8192C("bcdDevice=%x\n", pdev_desc->bcdDevice); + DBG_8192C("iManufacturer=%x\n", pdev_desc->iManufacturer); + DBG_8192C("iProduct=%x\n", pdev_desc->iProduct); + DBG_8192C("iSerialNumber=%x\n", pdev_desc->iSerialNumber); + DBG_8192C("bNumConfigurations=%x\n", pdev_desc->bNumConfigurations); +#endif + + phost_conf = pusbd->actconfig; + pconf_desc = &phost_conf->desc; + +#if 0 + DBG_8192C("\n8712_usb_configuration_descriptor:\n"); + DBG_8192C("bLength=%x\n", pconf_desc->bLength); + DBG_8192C("bDescriptorType=%x\n", pconf_desc->bDescriptorType); + DBG_8192C("wTotalLength=%x\n", pconf_desc->wTotalLength); + DBG_8192C("bNumInterfaces=%x\n", pconf_desc->bNumInterfaces); + DBG_8192C("bConfigurationValue=%x\n", pconf_desc->bConfigurationValue); + DBG_8192C("iConfiguration=%x\n", pconf_desc->iConfiguration); + DBG_8192C("bmAttributes=%x\n", pconf_desc->bmAttributes); + DBG_8192C("bMaxPower=%x\n", pconf_desc->bMaxPower); +#endif + + //DBG_8192C("\n/****** num of altsetting = (%d) ******/\n", pintf->num_altsetting); + + phost_iface = &pintf->altsetting[0]; + piface_desc = &phost_iface->desc; + +#if 0 + DBG_8192C("\n8712_usb_interface_descriptor:\n"); + DBG_8192C("bLength=%x\n", piface_desc->bLength); + DBG_8192C("bDescriptorType=%x\n", piface_desc->bDescriptorType); + DBG_8192C("bInterfaceNumber=%x\n", piface_desc->bInterfaceNumber); + DBG_8192C("bAlternateSetting=%x\n", piface_desc->bAlternateSetting); + DBG_8192C("bNumEndpoints=%x\n", piface_desc->bNumEndpoints); + DBG_8192C("bInterfaceClass=%x\n", piface_desc->bInterfaceClass); + DBG_8192C("bInterfaceSubClass=%x\n", piface_desc->bInterfaceSubClass); + DBG_8192C("bInterfaceProtocol=%x\n", piface_desc->bInterfaceProtocol); + DBG_8192C("iInterface=%x\n", piface_desc->iInterface); +#endif + + pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces; + pdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber; + pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints; + + //DBG_8192C("\ndump usb_endpoint_descriptor:\n"); + + for (i = 0; i < pdvobjpriv->nr_endpoint; i++) + { + phost_endp = phost_iface->endpoint + i; + if (phost_endp) + { + pendp_desc = &phost_endp->desc; + + DBG_8192C("\nusb_endpoint_descriptor(%d):\n", i); + DBG_8192C("bLength=%x\n",pendp_desc->bLength); + DBG_8192C("bDescriptorType=%x\n",pendp_desc->bDescriptorType); + DBG_8192C("bEndpointAddress=%x\n",pendp_desc->bEndpointAddress); + //DBG_8192C("bmAttributes=%x\n",pendp_desc->bmAttributes); + //DBG_8192C("wMaxPacketSize=%x\n",pendp_desc->wMaxPacketSize); + DBG_8192C("wMaxPacketSize=%x\n",le16_to_cpu(pendp_desc->wMaxPacketSize)); + DBG_8192C("bInterval=%x\n",pendp_desc->bInterval); + //DBG_8192C("bRefresh=%x\n",pendp_desc->bRefresh); + //DBG_8192C("bSynchAddress=%x\n",pendp_desc->bSynchAddress); + + if (RT_usb_endpoint_is_bulk_in(pendp_desc)) + { + DBG_8192C("RT_usb_endpoint_is_bulk_in = %x\n", RT_usb_endpoint_num(pendp_desc)); + pdvobjpriv->RtNumInPipes++; + } + else if (RT_usb_endpoint_is_int_in(pendp_desc)) + { + DBG_8192C("RT_usb_endpoint_is_int_in = %x, Interval = %x\n", RT_usb_endpoint_num(pendp_desc),pendp_desc->bInterval); + pdvobjpriv->RtNumInPipes++; + } + else if (RT_usb_endpoint_is_bulk_out(pendp_desc)) + { + DBG_8192C("RT_usb_endpoint_is_bulk_out = %x\n", RT_usb_endpoint_num(pendp_desc)); + pdvobjpriv->RtNumOutPipes++; + } + pdvobjpriv->ep_num[i] = RT_usb_endpoint_num(pendp_desc); + } + } + + DBG_8192C("nr_endpoint=%d, in_num=%d, out_num=%d\n\n", pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); + + if (pusbd->speed == USB_SPEED_HIGH) + { + pdvobjpriv->ishighspeed = _TRUE; + DBG_8192C("USB_SPEED_HIGH\n"); + } + else + { + pdvobjpriv->ishighspeed = _FALSE; + DBG_8192C("NON USB_SPEED_HIGH\n"); + } + + //.2 + if ((rtw_init_io_priv(padapter)) == _FAIL) + { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,(" \n Can't init io_reqs\n")); + status = _FAIL; + } + + if((rtw_init_intf_priv(padapter) )== _FAIL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("\n Can't INIT rtw_init_intf_priv\n")); + status = _FAIL; + } + + //.3 misc + _rtw_init_sema(&(padapter->dvobjpriv.usb_suspend_sema), 0); + + intf_read_chip_version(padapter); + + //.4 usb endpoint mapping + intf_chip_configure(padapter); + + rtw_reset_continual_urb_error(pdvobjpriv); + +_func_exit_; + + return status; +} + +static void usb_dvobj_deinit(_adapter * padapter){ + + struct dvobj_priv *pdvobjpriv=&padapter->dvobjpriv; + + _func_enter_; + + rtw_deinit_intf_priv(padapter); + + _func_exit_; +} + +static void decide_chip_type_by_usb_device_id(_adapter *padapter, const struct usb_device_id *pdid) +{ + //u32 i; + //u16 vid, pid; + + padapter->chip_type = NULL_CHIP_TYPE; + + //vid = pdid->idVendor; + //pid = pdid->idProduct; + + //TODO: dynamic judge 92c or 92d according to usb vid and pid. +#ifdef CONFIG_RTL8192C + padapter->chip_type = RTL8188C_8192C; + padapter->HardwareType = HARDWARE_TYPE_RTL8192CU; + DBG_8192C("CHIP TYPE: RTL8188C_8192C\n"); +#endif + +#ifdef CONFIG_RTL8192D + padapter->chip_type = RTL8192D; + padapter->HardwareType = HARDWARE_TYPE_RTL8192DU; + DBG_8192C("CHIP TYPE: RTL8192D\n"); +#endif + +} + +static void usb_intf_start(_adapter *padapter) +{ + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_start\n")); + + if(padapter->HalFunc.inirp_init == NULL) + { + RT_TRACE(_module_os_intfs_c_,_drv_err_,("Initialize dvobjpriv.inirp_init error!!!\n")); + } + else + { + padapter->HalFunc.inirp_init(padapter); + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_start\n")); + +} + +static void usb_intf_stop(_adapter *padapter) +{ + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+usb_intf_stop\n")); + + //disabel_hw_interrupt + if(padapter->bSurpriseRemoved == _FALSE) + { + //device still exists, so driver can do i/o operation + //TODO: + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("SurpriseRemoved==_FALSE\n")); + } + + //cancel in irp + if(padapter->HalFunc.inirp_deinit !=NULL) + { + padapter->HalFunc.inirp_deinit(padapter); + } + + //cancel out irp + rtw_write_port_cancel(padapter); + + //todo:cancel other irps + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-usb_intf_stop\n")); + +} + +static void rtw_dev_unload(_adapter *padapter) +{ + struct net_device *pnetdev= (struct net_device*)padapter->pnetdev; + u8 val8; + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_dev_unload\n")); + + if(padapter->bup == _TRUE) + { + DBG_8192C("===> rtw_dev_unload\n"); + + padapter->bDriverStopped = _TRUE; + + //s3. + if(padapter->intf_stop) + { + padapter->intf_stop(padapter); + } + + //s4. + if(!padapter->pwrctrlpriv.bInternalAutoSuspend ) + rtw_stop_drv_threads(padapter); + + + //s5. + if(padapter->bSurpriseRemoved == _FALSE) + { + //DBG_8192C("r871x_dev_unload()->rtl871x_hal_deinit()\n"); + #ifdef CONFIG_WOWLAN + if(padapter->pwrctrlpriv.bSupportWakeOnWlan==_TRUE){ + DBG_8192C("%s bSupportWakeOnWlan==_TRUE do not run rtw_hal_deinit()\n",__FUNCTION__); + } + else + #endif + { + rtw_hal_deinit(padapter); + } + padapter->bSurpriseRemoved = _TRUE; + } + + padapter->bup = _FALSE; + + } + else + { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("r871x_dev_unload():padapter->bup == _FALSE\n" )); + } + + DBG_8192C("<=== rtw_dev_unload\n"); + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-rtw_dev_unload\n")); + +} + +static void process_spec_devid(const struct usb_device_id *pdid) +{ + u16 vid, pid; + u32 flags; + int i; + int num = sizeof(specific_device_id_tbl)/sizeof(struct specific_device_id); + + for(i=0; iidVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_DISABLE_HT)) + { + rtw_ht_enable = 0; + rtw_cbw40_enable = 0; + rtw_ampdu_enable = 0; + } +#endif + +#ifdef RTK_DMP_PLATFORM + // Change the ifname to wlan10 when PC side WFD dongle plugin on DMP platform. + // It is used to distinguish between normal and PC-side wifi dongle/module. + if((pdid->idVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_ASSIGN_IFNAME)) + { + extern char* ifname; + strncpy(ifname, "wlan10", 6); + //DBG_8192C("%s()-%d: ifname=%s, vid=%04X, pid=%04X\n", __FUNCTION__, __LINE__, ifname, vid, pid); + } +#endif /* RTK_DMP_PLATFORM */ + + } +} + +#ifdef SUPPORT_HW_RFOFF_DETECTED +extern u8 disconnect_hdl(_adapter *padapter, u8 *pbuf); +extern void rtw_os_indicate_disconnect( _adapter *adapter ); + +int rtw_hw_suspend(_adapter *padapter ) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct usb_interface *pusb_intf = padapter->dvobjpriv.pusbintf; + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + + _func_enter_; + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + DBG_8192C("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", + padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + goto error_exit; + } + + if(padapter)//system suspend + { + LeaveAllPowerSaveMode(padapter); + + DBG_8192C("==> rtw_hw_suspend\n"); + _enter_pwrlock(&pwrpriv->lock); + pwrpriv->bips_processing = _TRUE; + //padapter->net_closed = _TRUE; + //s1. + if(pnetdev) + { + netif_carrier_off(pnetdev); + netif_stop_queue(pnetdev); + } + + //s2. + //s2-1. issue rtw_disassoc_cmd to fw + //rtw_disassoc_cmd(padapter);//donnot enqueue cmd + disconnect_hdl(padapter, NULL); + + //s2-2. indicate disconnect to os + //rtw_indicate_disconnect(padapter); + { + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + + if(check_fwstate(pmlmepriv, _FW_LINKED)) + { + _clr_fwstate_(pmlmepriv, _FW_LINKED); + + rtw_led_control(padapter, LED_CTL_NO_LINK); + + rtw_os_indicate_disconnect(padapter); + + #ifdef CONFIG_LPS + //donnot enqueue cmd + rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 0); + #endif + } + + } + //s2-3. + rtw_free_assoc_resources(padapter); + + //s2-4. + rtw_free_network_queue(padapter,_TRUE); + #ifdef CONFIG_IPS + rtw_ips_dev_unload(padapter); + #endif + pwrpriv->rf_pwrstate = rf_off; + pwrpriv->bips_processing = _FALSE; + + _exit_pwrlock(&pwrpriv->lock); + } + else + goto error_exit; + + _func_exit_; + return 0; + +error_exit: + DBG_8192C("%s, failed \n",__FUNCTION__); + return (-1); + +} + +int rtw_hw_resume(_adapter *padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct usb_interface *pusb_intf = padapter->dvobjpriv.pusbintf; + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + + _func_enter_; + + if(padapter)//system resume + { + DBG_8192C("==> rtw_hw_resume\n"); + _enter_pwrlock(&pwrpriv->lock); + pwrpriv->bips_processing = _TRUE; + rtw_reset_drv_sw(padapter); + + if(pm_netdev_open(pnetdev,_FALSE) != 0) + { + _exit_pwrlock(&pwrpriv->lock); + goto error_exit; + } + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + + if(!netif_queue_stopped(pnetdev)) + netif_start_queue(pnetdev); + else + netif_wake_queue(pnetdev); + + pwrpriv->bkeepfwalive = _FALSE; + pwrpriv->brfoffbyhw = _FALSE; + + pwrpriv->rf_pwrstate = rf_on; + pwrpriv->bips_processing = _FALSE; + + _exit_pwrlock(&pwrpriv->lock); + } + else + { + goto error_exit; + } + + _func_exit_; + + return 0; +error_exit: + DBG_8192C("%s, Open net dev failed \n",__FUNCTION__); + return (-1); +} +#endif + +static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) +{ + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct usb_device *usb_dev = interface_to_usbdev(pusb_intf); + + _func_enter_; + + if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved)) + { + DBG_8192C("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", + padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved); + return 0; + } + sleep_resume = 0; + DBG_8192C("########### rtw_suspend #################\n"); + + if(padapter)//system suspend + { + if(pwrpriv->bInternalAutoSuspend ) + { + #ifdef CONFIG_AUTOSUSPEND + #ifdef SUPPORT_HW_RFOFF_DETECTED + // The FW command register update must after MAC and FW init ready. + if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) + { + u8 bOpen = _TRUE; + rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); + //rtl8192c_set_FwSelectSuspend_cmd(padapter,_TRUE ,500);//note fw to support hw power down ping detect + } + #endif + #endif + } + pwrpriv->bInSuspend = _TRUE; + rtw_cancel_all_timer(padapter); + LeaveAllPowerSaveMode(padapter); + + _enter_pwrlock(&pwrpriv->lock); + //padapter->net_closed = _TRUE; + //s1. + if(pnetdev) + { + netif_carrier_off(pnetdev); + netif_stop_queue(pnetdev); + } +#ifdef CONFIG_WOWLAN + padapter->pwrctrlpriv.bSupportWakeOnWlan=_TRUE; +#else + //s2. + //s2-1. issue rtw_disassoc_cmd to fw + disconnect_hdl(padapter, NULL); + //rtw_disassoc_cmd(padapter); +#endif + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED) ) + { + //printk("%s:%d assoc_ssid:%s\n", __FUNCTION__, __LINE__, pmlmepriv->assoc_ssid.Ssid); + DBG_871X("%s:%d %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__, __LINE__, + pmlmepriv->cur_network.network.Ssid.Ssid, + MAC_ARG(pmlmepriv->cur_network.network.MacAddress), + pmlmepriv->cur_network.network.Ssid.SsidLength, + pmlmepriv->assoc_ssid.SsidLength); + + pmlmepriv->to_roaming = 1; + } +#endif + //s2-2. indicate disconnect to os + rtw_indicate_disconnect(padapter); + //s2-3. + rtw_free_assoc_resources(padapter); +#ifdef CONFIG_AUTOSUSPEND + if(!pwrpriv->bInternalAutoSuspend ) +#endif + //s2-4. + rtw_free_network_queue(padapter, _TRUE); + + rtw_dev_unload(padapter); +#ifdef CONFIG_AUTOSUSPEND + pwrpriv->rf_pwrstate = rf_off; + pwrpriv->bips_processing = _FALSE; +#endif + _exit_pwrlock(&pwrpriv->lock); + } + else + goto error_exit; + + DBG_871X("########### rtw_suspend done #################\n"); + + _func_exit_; + return 0; + +error_exit: + DBG_871X("########### rtw_suspend fail !! #################\n"); + return (-1); + +} + +static int rtw_resume(struct usb_interface *pusb_intf) +{ + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + int ret = 0; + + if(pwrpriv->bInternalAutoSuspend ){ + ret = rtw_resume_process(pusb_intf); + } else { +#ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_resume_in_workqueue(pwrpriv); +#elif defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER) + if(rtw_is_earlysuspend_registered(pwrpriv)) { + //jeff: bypass resume here, do in late_resume + pwrpriv->do_late_resume = _TRUE; + } else { + ret = rtw_resume_process(pusb_intf); + } +#else // Normal resume process + ret = rtw_resume_process(pusb_intf); +#endif //CONFIG_RESUME_IN_WORKQUEUE + } + + return ret; + +} + + +int rtw_resume_process(struct usb_interface *pusb_intf) +{ + struct net_device *pnetdev; + struct usb_device *usb_dev; + _adapter *padapter; + struct pwrctrl_priv *pwrpriv; + + _func_enter_; + + DBG_8192C("########### rtw_resume #################\n"); + + if(pusb_intf) { + pnetdev=usb_get_intfdata(pusb_intf); + usb_dev = interface_to_usbdev(pusb_intf); + } else { + goto error_exit; + } + + padapter = (_adapter*)rtw_netdev_priv(pnetdev); + pwrpriv = &padapter->pwrctrlpriv; + + if(padapter)//system resume + { + _enter_pwrlock(&pwrpriv->lock); + rtw_reset_drv_sw(padapter); + pwrpriv->bkeepfwalive = _FALSE; + + DBG_8192C("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive); + if(pm_netdev_open(pnetdev,_TRUE) != 0) + goto error_exit; + + netif_device_attach(pnetdev); + netif_carrier_on(pnetdev); + +#ifdef CONFIG_AUTOSUSPEND + if(pwrpriv->bInternalAutoSuspend ) + { + #ifdef CONFIG_AUTOSUSPEND + #ifdef SUPPORT_HW_RFOFF_DETECTED + // The FW command register update must after MAC and FW init ready. + if((padapter->bFWReady) && ( padapter->pwrctrlpriv.bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable )) + { + //rtl8192c_set_FwSelectSuspend_cmd(padapter,_FALSE ,500);//note fw to support hw power down ping detect + u8 bOpen = _FALSE; + rtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen); + } + #endif + #endif + + pwrpriv->bInternalAutoSuspend = _FALSE; + pwrpriv->brfoffbyhw = _FALSE; + { + DBG_8192C("enc_algorithm(%x),wepkeymask(%x)\n", + padapter->securitypriv.dot11PrivacyAlgrthm,pwrpriv->wepkeymask); + if( (_WEP40_ == padapter->securitypriv.dot11PrivacyAlgrthm) || + (_WEP104_ == padapter->securitypriv.dot11PrivacyAlgrthm)) + { + sint keyid; + + for(keyid=0;keyid<4;keyid++){ + if(pwrpriv->wepkeymask & BIT(keyid)) { + if(keyid == padapter->securitypriv.dot11PrivacyKeyIndex) + rtw_set_key(padapter,&padapter->securitypriv, keyid, 1); + else + rtw_set_key(padapter,&padapter->securitypriv, keyid, 0); + } + } + } + } + } +#endif + _exit_pwrlock(&pwrpriv->lock); + } + else + { + goto error_exit; + } + + if( padapter->pid[1]!=0) { + DBG_871X("pid[1]:%d\n",padapter->pid[1]); + rtw_signal_process(padapter->pid[1], SIGUSR2); + } + +#ifdef CONFIG_LAYER2_ROAMING_RESUME + rtw_roaming(padapter, NULL); +#endif + + DBG_871X("########### rtw_resume done#################\n"); + sleep_resume = 1; + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_unlock_suspend(); + #endif //CONFIG_RESUME_IN_WORKQUEUE + + _func_exit_; + + return 0; +error_exit: + DBG_8192C("%s, Open net dev failed \n",__FUNCTION__); + + DBG_871X("########### rtw_resume done with error#################\n"); + + #ifdef CONFIG_RESUME_IN_WORKQUEUE + rtw_unlock_suspend(); + #endif //CONFIG_RESUME_IN_WORKQUEUE + + _func_exit_; + + return (-1); +} + +#ifdef CONFIG_AUTOSUSPEND +void autosuspend_enter(_adapter* padapter) +{ + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + pwrpriv->bInternalAutoSuspend = _TRUE; + pwrpriv->bips_processing = _TRUE; + + DBG_8192C("==>autosuspend_enter...........\n"); + + if(rf_off == pwrpriv->change_rfpwrstate ) + { + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + usb_enable_autosuspend(padapter->dvobjpriv.pusbdev); + #else + padapter->dvobjpriv.pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user + #endif + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) + usb_autopm_put_interface(padapter->dvobjpriv.pusbintf); + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) + usb_autopm_enable(padapter->dvobjpriv.pusbintf); + #else + usb_autosuspend_device(padapter->dvobjpriv.pusbdev, 1); + #endif + } + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) + DBG_8192C("...pm_usage_cnt(%d).....\n",atomic_read(&(padapter->dvobjpriv.pusbintf->pm_usage_cnt))); + #else + DBG_8192C("...pm_usage_cnt(%d).....\n",padapter->dvobjpriv.pusbintf->pm_usage_cnt); + #endif + +} +int autoresume_enter(_adapter* padapter) +{ + int result = _SUCCESS; + struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; + struct security_priv* psecuritypriv=&(padapter->securitypriv); + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; + struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + + + DBG_8192C("====> autoresume_enter \n"); + + if(rf_off == pwrpriv->rf_pwrstate ) + { + pwrpriv->ps_flag = _FALSE; + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33)) + if (usb_autopm_get_interface( padapter->dvobjpriv.pusbintf) < 0) + { + DBG_8192C( "can't get autopm: %d\n", result); + result = _FAIL; + goto error_exit; + } + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20)) + usb_autopm_disable(padapter->dvobjpriv.pusbintf); + #else + usb_autoresume_device(padapter->dvobjpriv.pusbdev, 1); + #endif + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) + DBG_8192C("...pm_usage_cnt(%d).....\n",atomic_read(&(padapter->dvobjpriv.pusbintf->pm_usage_cnt))); + #else + DBG_8192C("...pm_usage_cnt(%d).....\n",padapter->dvobjpriv.pusbintf->pm_usage_cnt); + #endif + } + DBG_8192C("<==== autoresume_enter \n"); +error_exit: + + return result; +} +#endif + +extern char* ifname; +/* + * drv_init() - a device potentially for us + * + * notes: drv_init() is called when the bus driver has located a card for us to support. + * We accept the new device by returning 0. +*/ +static int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid) +{ + int i; + + uint status; + _adapter *padapter = NULL; + struct dvobj_priv *pdvobjpriv; + struct net_device *pnetdev; + + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n")); + //DBG_8192C("+rtw_drv_init\n"); + + //2009.8.13, by Thomas + // In this probe function, O.S. will provide the usb interface pointer to driver. + // We have to increase the reference count of the usb device structure by using the usb_get_dev function. + usb_get_dev(interface_to_usbdev(pusb_intf)); + + pintf = pusb_intf; + + //step 0. + process_spec_devid(pdid); + + //step 1. set USB interface data + // init data + pnetdev = rtw_init_netdev(NULL); + if (!pnetdev) + goto error; + + SET_NETDEV_DEV(pnetdev, &pusb_intf->dev); + + padapter = rtw_netdev_priv(pnetdev); + padapter->bDriverStopped=_TRUE; + pdvobjpriv = &padapter->dvobjpriv; + pdvobjpriv->padapter = padapter; + pdvobjpriv->pusbintf = pusb_intf ; + pdvobjpriv->pusbdev = interface_to_usbdev(pusb_intf); + + // set data + usb_set_intfdata(pusb_intf, pnetdev); + + //set interface_type to usb + padapter->interface_type = RTW_USB; + + //step 1-1., decide the chip_type via vid/pid + decide_chip_type_by_usb_device_id(padapter, pdid); + + //step 2. + if(padapter->chip_type == RTL8188C_8192C) + { +#ifdef CONFIG_RTL8192C + rtl8192cu_set_hal_ops(padapter); +#endif + } + else if(padapter->chip_type == RTL8192D) + { +#ifdef CONFIG_RTL8192D + rtl8192du_set_hal_ops(padapter); +#endif + } + else + { + DBG_8192C("Detect NULL_CHIP_TYPE\n"); + status = _FAIL; + goto error; + } + + //step 3. initialize the dvobj_priv + padapter->dvobj_init=&usb_dvobj_init; + padapter->dvobj_deinit=&usb_dvobj_deinit; + padapter->intf_start=&usb_intf_start; + padapter->intf_stop=&usb_intf_stop; + + //step 3. + //initialize the dvobj_priv ,include Chip version + if (padapter->dvobj_init == NULL){ + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("\n Initialize dvobjpriv.dvobj_init error!!!\n")); + goto error; + } + + status = padapter->dvobj_init(padapter); + if (status != _SUCCESS) { + RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("initialize device object priv Failed!\n")); + goto error; + } + + //step 4. read efuse/eeprom data and get mac_addr + intf_read_chip_info(padapter); + + //step 5. + status = rtw_init_drv_sw(padapter); + if(status ==_FAIL){ + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize driver software resource Failed!\n")); + goto error; + } + +#ifdef CONFIG_PM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) + if(padapter->pwrctrlpriv.bSupportRemoteWakeup) + { + pdvobjpriv->pusbdev->do_remote_wakeup=1; + pusb_intf->needs_remote_wakeup = 1; + device_init_wakeup(&pusb_intf->dev, 1); + DBG_8192C("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); + DBG_8192C("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",device_may_wakeup(&pusb_intf->dev)); + } +#endif +#endif + +#ifdef CONFIG_AUTOSUSPEND + if( padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE ) + { + if(padapter->registrypriv.usbss_enable ){ /* autosuspend (2s delay) */ + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,38)) + pdvobjpriv->pusbdev->dev.power.autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time + #else + pdvobjpriv->pusbdev->autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time + #endif + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)) + usb_enable_autosuspend(padapter->dvobjpriv.pusbdev); + #elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34)) + padapter->bDisableAutosuspend = padapter->dvobjpriv.pusbdev->autosuspend_disabled ; + padapter->dvobjpriv.pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user + #endif + + usb_autopm_get_interface(padapter->dvobjpriv.pusbintf );//init pm_usage_cnt ,let it start from 1 + + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32)) + DBG_8192C("%s...pm_usage_cnt(%d).....\n",__FUNCTION__,atomic_read(&(pdvobjpriv->pusbintf ->pm_usage_cnt))); + #else + DBG_8192C("%s...pm_usage_cnt(%d).....\n",__FUNCTION__,pdvobjpriv->pusbintf ->pm_usage_cnt); + #endif + } + } +#endif + // alloc dev name after read efuse. + rtw_init_netdev_name(pnetdev, ifname); + + rtw_macaddr_cfg(padapter->eeprompriv.mac_addr); + + _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); + DBG_8192C("MAC Address from pnetdev->dev_addr= " MAC_FMT "\n", MAC_ARG(pnetdev->dev_addr)); + + + //step 6. + /* Tell the network stack we exist */ + if (register_netdev(pnetdev) != 0) { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n")); + goto error; + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-drv_init - Adapter->bDriverStopped=%d, Adapter->bSurpriseRemoved=%d\n",padapter->bDriverStopped, padapter->bSurpriseRemoved)); + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_drv - drv_init, success!\n")); + //DBG_8192C("-871x_drv - drv_init, success!\n"); + +#ifdef CONFIG_PROC_DEBUG +#ifdef RTK_DMP_PLATFORM + rtw_proc_init_one(pnetdev); +#endif +#endif + +#ifdef CONFIG_HOSTAPD_MLME + hostapd_mode_init(padapter); +#endif + +#ifdef CONFIG_PLATFORM_RTD2880B + DBG_8192C("wlan link up\n"); + rtd2885_wlan_netlink_sendMsg("linkup", "8712"); +#endif + + +#ifdef CONFIG_GLOBAL_UI_PID + if(ui_pid[1]!=0) { + DBG_871X("ui_pid[1]:%d\n",ui_pid[1]); + rtw_signal_process(ui_pid[1], SIGUSR2); + } +#endif + + DBG_8192C("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n" + ,padapter->bDriverStopped + ,padapter->bSurpriseRemoved + ,padapter->bup + ,padapter->hw_init_completed + ); + rtl8188_power_save_init(); + + return 0; + +error: + + usb_put_dev(interface_to_usbdev(pusb_intf));//decrease the reference count of the usb device structure if driver fail on initialzation + + usb_set_intfdata(pusb_intf, NULL); + + usb_dvobj_deinit(padapter); + + if (pnetdev) + { + //unregister_netdev(pnetdev); + rtw_free_netdev(pnetdev); + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-871x_usb - drv_init, fail!\n")); + //DBG_8192C("-871x_usb - drv_init, fail!\n"); + + return -ENODEV; +} + +/* + * dev_remove() - our device is being removed +*/ +//rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both +static void rtw_dev_remove(struct usb_interface *pusb_intf) +{ + struct net_device *pnetdev=usb_get_intfdata(pusb_intf); + _adapter *padapter = (_adapter*)rtw_netdev_priv(pnetdev); + struct mlme_priv *pmlmepriv= &padapter->mlmepriv; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + u8 bResetDevice = _FALSE; + +_func_exit_; + + usb_set_intfdata(pusb_intf, NULL); + + if(padapter) + { + DBG_8192C("+rtw_dev_remove\n"); + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+dev_remove()\n")); + + LeaveAllPowerSaveMode(padapter); + + if(check_fwstate(pmlmepriv, _FW_LINKED)) + disconnect_hdl(padapter, NULL); + + if(drvpriv.drv_registered == _TRUE) + { + //DBG_8192C("r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\n"); + padapter->bSurpriseRemoved = _TRUE; + } + /*else + { + //DBG_8192C("r871xu_dev_remove():module removed\n"); + padapter->hw_init_completed = _FALSE; + }*/ + +#ifdef CONFIG_AP_MODE + free_mlme_ap_info(padapter); +#ifdef CONFIG_HOSTAPD_MLME + hostapd_mode_unload(padapter); +#endif //CONFIG_HOSTAPD_MLME +#endif //CONFIG_AP_MODE + + if(padapter->DriverState != DRIVER_DISAPPEAR) + { + if(pnetdev) { + unregister_netdev(pnetdev); //will call netdev_close() +#ifdef CONFIG_PROC_DEBUG + rtw_proc_remove_one(pnetdev); +#endif + } + } + + rtw_cancel_all_timer(padapter); + + rtw_dev_unload(padapter); + + DBG_8192C("+r871xu_dev_remove, hw_init_completed=%d\n", padapter->hw_init_completed); + + //Modify condition for 92DU DMDP 2010.11.18, by Thomas + //move code to here, avoid access null pointer. 2011.05.25. + if((pdvobjpriv->NumInterfaces != 2) || (pdvobjpriv->InterfaceNumber == 1)) + bResetDevice = _TRUE; + + //s6. + if(padapter->dvobj_deinit) + { + padapter->dvobj_deinit(padapter); + } + else + { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("Initialize hcipriv.hci_priv_init error!!!\n")); + } + + //after rtw_free_drv_sw(), padapter has beed freed, don't refer to it. + rtw_free_drv_sw(padapter); + + } + + usb_put_dev(interface_to_usbdev(pusb_intf));//decrease the reference count of the usb device structure when disconnect + + //If we didn't unplug usb dongle and remove/insert modlue, driver fails on sitesurvey for the first time when device is up . + //Reset usb port for sitesurvey fail issue. 2009.8.13, by Thomas + if(_TRUE == bResetDevice) + { + if(interface_to_usbdev(pusb_intf)->state != USB_STATE_NOTATTACHED) + { + DBG_8192C("usb attached..., try to reset usb device\n"); + usb_reset_device(interface_to_usbdev(pusb_intf)); + } + } + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("-dev_remove()\n")); + DBG_8192C("-r871xu_dev_remove, done\n"); + +#ifdef CONFIG_PLATFORM_RTD2880B + DBG_8192C("wlan link down\n"); + rtd2885_wlan_netlink_sendMsg("linkdown", "8712"); +#endif + + #ifdef DBG_MEM_ALLOC + rtw_dump_mem_stat (); + #endif +_func_exit_; + rtl8188_power_save_exit(); + + return; + +} +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) +extern int console_suspend_enabled; +#endif + +static int rtw_drv_entry(void) +{ +#ifdef CONFIG_PLATFORM_RTK_DMP + u32 tmp; + tmp=readl((volatile unsigned int*)0xb801a608); + tmp &= 0xffffff00; + tmp |= 0x55; + writel(tmp,(volatile unsigned int*)0xb801a608);//write dummy register for 1055 +#endif + + + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_entry\n")); + + DBG_8192C("\nrtw driver version=%s\n", DRIVERVERSION); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + //console_suspend_enabled=0; +#endif + + rtw_suspend_lock_init(); + + drvpriv.drv_registered = _TRUE; + return usb_register(&drvpriv.rtw_usb_drv); +} + +static void rtw_drv_halt(void) +{ + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("+rtw_drv_halt\n")); + DBG_8192C("+rtw_drv_halt\n"); + + rtw_suspend_lock_uninit(); + + drvpriv.drv_registered = _FALSE; + usb_deregister(&drvpriv.rtw_usb_drv); + DBG_8192C("-rtw_drv_halt\n"); +} + + +//module_init(rtw_drv_entry); +//module_exit(rtw_drv_halt); + +#include "wifi_version.h" + +int mv88w8686_if_sdio_init_module(void) +{ + printk("RTL8192/RTL8188 USB WiFi driver (Powered by Rockchip,Ver %s) init.\n", RTL8192_DRV_VERSION); + + wifi_usb_init(); + wifi_activate_usb(); + + return rtw_drv_entry(); +} + +void mv88w8686_if_sdio_exit_module(void) +{ + rtw_drv_halt(); + wifi_deactivate_usb(); +} + +EXPORT_SYMBOL(mv88w8686_if_sdio_init_module); +EXPORT_SYMBOL(mv88w8686_if_sdio_exit_module); + +int rockchip_wifi_init_module(void) +{ + return mv88w8686_if_sdio_init_module(); +} + +void rockchip_wifi_exit_module(void) +{ + mv88w8686_if_sdio_exit_module(); +} + +EXPORT_SYMBOL(rockchip_wifi_init_module); +EXPORT_SYMBOL(rockchip_wifi_exit_module); diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c new file mode 100644 index 000000000000..a0789f01d582 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.c @@ -0,0 +1,114 @@ +/* + * wifi_power.c + * + * Power control for WIFI module. + * + * Yongle Lai @ Rockchip + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +/* + * rtw_channel_plan : The initialization parameter of wifi channel, + * Allow number is "0" "2" and "5". + * 0 => 11 ( channel 1 ~ 11 is SCAN_ACTIVE ) + * 2 => 13 ( channel 1 ~ 13 is SCAN_ACTIVE ) + * 5 => 14 ( channel 1 ~ 14 is SCAN_ACTIVE ) + * default number is "2". + */ +char init_channel_plan = 2; + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +/* + * GPIO to control LDO/DCDC. + * + * 用于控制WIFI的电源,通常是3.3V和1.8V,可能1.2V也在其中。 + * + * 如果是扩展IO,请参考下面的例子: + * POWER_USE_EXT_GPIO, 0, 0, 0, PCA9554_Pin1, GPIO_HIGH + */ +struct wifi_power power_gpio = +{ + //POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 + + // RBOX + //POWER_USE_GPIO, POWER_GPIO_IOMUX, + //GPIO5D6_SDMMC1PWREN_NAME, GPIO5H_GPIO5D6, RK29_PIN5_PD6, GPIO_HIGH + +#define GPIO_WIFI_POWER RK29_PIN6_PC0 + + // YIFANG M803 + POWER_USE_GPIO, 0, + 0, 0, GPIO_WIFI_POWER, GPIO_HIGH + + //SDK + // POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * GPIO to control WIFI PowerDOWN/RESET. + * + * 控制WIFI的PowerDown脚。有些模组PowerDown脚是和Reset脚短接在一起。 + */ +struct wifi_power power_save_gpio = +{ + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * GPIO to reset WIFI. Keep this as NULL normally. + * + * 控制WIFI的Reset脚,通常WiFi模组没有用到这个引脚。 + */ +struct wifi_power power_reset_gpio = +{ + POWER_NOT_USE_GPIO, 0, 0, 0, 0, 0 +}; + +/* + * 在WIFI被上电前,会调用这个函数。 + */ +void wifi_turn_on_callback(void) +{ +} + +/* + * 在WIFI被下电后,会调用这个函数。 + */ +void wifi_turn_off_callback(void) +{ +} + +/* + * If external GPIO chip such as PCA9554 is being used, please + * implement the following 2 function. + * + * id: is GPIO identifier, such as GPIOPortF_Pin0, or external + * name defined in struct wifi_power. + * sens: the value should be set to GPIO, usually is GPIO_HIGH or GPIO_LOW. + * + * 如果有用扩展GPIO来控制WIFI,请实现下面的函数: + * 函数的功能是:控制指定的IO口id,使其状态切换为要求的sens状态。 + * id : 是IO的标识号,以整数的形式标识。 + * sens: 是要求的IO状态,为高或低。 + */ +void wifi_extgpio_operation(u8 id, u8 sens) +{ + //pca955x_gpio_direction_output(id, sens); +} + +/* + * 在系统中如果要调用WIFI的IO控制,将WIFI下电,可以调用如下接口: + * void rockchip_wifi_shutdown(void); + * 但注意需要在宏WIFI_GPIO_POWER_CONTROL的控制下。 + */ + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h new file mode 100644 index 000000000000..be89742c471f --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power.h @@ -0,0 +1,87 @@ +/* + * wifi_power.h + * + * WIFI power control. + * + * Yongle Lai + */ + +#ifndef WIFI_POWER_H +#define WIFI_POWER_H + +#include + +#define DONT_SWITCH_USB 0 /* Don't switch USB automaticately. */ +#define WIFI_USE_OTG 1 /* WiFi will be connected to USB OTG. */ +#define WIFI_USE_HOST11 2 /* WiFi will be connected to USB HOST 1.1. */ + +#define WIFI_USE_IFACE WIFI_USE_HOST11 /* Select USB Controler */ +#define WIFI_GPIO_POWER_CONTROL 1 /* Enable GPIO Control Power */ + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +#include +#include +#else +#include +#include +#endif + +#define WIFI_CHIP_MV8686 0 +#define WIFI_CHIP_AR6002 1 +#define WIFI_CHIP_BCM4319 2 +#define WIFI_CHIP_NRX700 3 +#define WIFI_CHIP_RT3070 4 +#define WIFI_CHIP_RTL8192C 5 + +#define POWER_NOT_USE_GPIO 0 +#define POWER_USE_GPIO 1 +#define POWER_USE_EXT_GPIO 2 /* External GPIO chip is used, such as PCA9554. */ + +#define POWER_GPIO_NOT_IOMUX 0 +#define POWER_GPIO_IOMUX 1 + +#define GPIO_SWITCH_OFF 0 +#define GPIO_SWITCH_ON 1 + +struct wifi_power +{ + u8 use_gpio; /* If uses GPIO to control wifi power supply. 0 - no, 1 - yes. */ + u8 gpio_iomux; /* If the GPIO is iomux. 0 - no, 1 - yes. */ + char *iomux_name; /* IOMUX name */ + u8 iomux_value; /* IOMUX value - which function is choosen. */ + u8 gpio_id; /* GPIO number */ + u8 sensi_level; /* GPIO sensitive level. */ +}; + +int wifi_turn_on_card(int module); +int wifi_turn_off_card(void); +int wifi_reset_card(void); +void wifi_extgpio_operation(u8 id, u8 sens); + +void rockchip_wifi_shutdown(void); + +#endif /* WIFI_GPIO_POWER_CONTROL */ + +#define WIFI_NETWORK_BUSY 0 +#define WIFI_NETWORK_IDLE 1 + +int wifi_power_save_init(void); +int wifi_power_save_exit(void); +int wifi_power_save_stop(void); +int wifi_power_save_state(void); +void wifi_power_save_suspend(void); +void wifi_power_save_resume(void); +int wifi_power_save_register_callback(int (*callback)(int status)); + +void wifi_turn_on_callback(void); +void wifi_turn_off_callback(void); + +/* usb wifi */ +int wifi_activate_usb(void); +int wifi_deactivate_usb(void); +void wifi_usb_init(void); + +#endif /* WIFI_POWER_H */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c new file mode 100644 index 000000000000..4096bdac15fd --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_ops.c @@ -0,0 +1,112 @@ +/* + * wifi_power.c + * + * Yongle Lai @ Rockchip Fuzhou @ 20100303. + * + * Power control for WIFI module. + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +#include +#include +#else +#include +#include +#endif + + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +extern struct wifi_power power_gpio; +extern struct wifi_power power_save_gpio; +extern struct wifi_power power_reset_gpio; + +#define OS_IOMUX(name, value) rk29_mux_api_set((name), (value)); + +int wifi_gpio_operate(struct wifi_power *gpio, int flag) +{ + int sensitive; + + if (gpio->use_gpio == POWER_NOT_USE_GPIO) + return 0; + + if (gpio->gpio_iomux == POWER_GPIO_IOMUX) + { + OS_IOMUX(gpio->iomux_name, gpio->iomux_value); + } + + if (flag == GPIO_SWITCH_ON) + sensitive = gpio->sensi_level; + else + sensitive = 1 - gpio->sensi_level; + + if (gpio->use_gpio == POWER_USE_EXT_GPIO) + { + wifi_extgpio_operation(gpio->gpio_id, sensitive); + } + else + { + int ret; + + ret = gpio_request(gpio->gpio_id, NULL); + if (ret != 0) + printk("Request GPIO for WIFI POWER error!\n"); + + gpio_direction_output(gpio->gpio_id, sensitive); + gpio_set_value(gpio->gpio_id, sensitive); + + gpio_free(gpio->gpio_id); + } + + return 0; +} + +/* + * WiFi power up sequence + */ +int wifi_turn_on_rtl8192c_card(void) +{ + wifi_gpio_operate(&power_gpio, GPIO_SWITCH_ON); + if (power_gpio.use_gpio != POWER_NOT_USE_GPIO) + msleep(1000); + + return 0; +} + +int wifi_turn_on_card(int module) +{ + wifi_turn_on_callback(); + + wifi_turn_on_rtl8192c_card(); + + return 0; +} + +int wifi_turn_off_card(void) +{ + wifi_gpio_operate(&power_gpio, GPIO_SWITCH_OFF); + msleep(5); + + wifi_turn_off_callback(); + + return 0; +} + +void rockchip_wifi_shutdown(void) +{ + printk("rockchip_wifi_shutdown....\n"); + + wifi_turn_off_card(); +} +EXPORT_SYMBOL(rockchip_wifi_shutdown); + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c new file mode 100644 index 000000000000..c979cc34958c --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_power_usb.c @@ -0,0 +1,118 @@ +/* + * wifi_power.c + * + * Power control for WIFI module. + * + * There are Power supply and Power Up/Down controls for WIFI typically. + */ +#include +#include +#include +#include + +#include "wifi_power.h" + +#if (WIFI_GPIO_POWER_CONTROL == 1) + +int wifi_change_usb_mode = 0; +int usb_wifi_status = 0; + +void wifi_usb_init(void) +{ + wifi_change_usb_mode = 0; + usb_wifi_status = 0; +} + +#if (WIFI_USE_IFACE == WIFI_USE_OTG) + +#define USB_NORMAL 0 +#define USB_FORCE_HOST 1 +#define USB_FORCE_DEVICE 2 + +extern int usb_force_usb_for_wifi(int mode); + +/* + * Change USB mode to HOST. + */ +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + + wifi_change_usb_mode = usb_force_usb_for_wifi(USB_FORCE_HOST); + msleep(1000); + + usb_wifi_status = 1; + + return 0; +} + +/* + * Change USB mode to be original. + */ +int wifi_deactivate_usb(void) +{ + if (wifi_change_usb_mode == 1) + { + usb_force_usb_for_wifi(USB_FORCE_DEVICE); + msleep(1000); + usb_force_usb_for_wifi(USB_NORMAL); + msleep(1000); + } + wifi_turn_off_card(); + + usb_wifi_status = 0; + + return 0; +} + +#elif (WIFI_USE_IFACE == WIFI_USE_HOST11) + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) +extern int usb_switch_usb_host11_for_wifi(int enabled); +#endif + +int wifi_deactivate_usb(void) +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) + usb_switch_usb_host11_for_wifi(0); + msleep(1000); +#endif + + wifi_turn_off_card(); + msleep(100); + + return 0; +} + +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + msleep(100); + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) + usb_switch_usb_host11_for_wifi(1); + msleep(1000); +#endif + + return 0; +} + +#else + +int wifi_deactivate_usb(void) +{ + wifi_turn_off_card(); + msleep(1000); + return 0; +} + +int wifi_activate_usb(void) +{ + wifi_turn_on_card(WIFI_CHIP_RTL8192C); + msleep(1000); + return 0; +} +#endif + +#endif /* WIFI_GPIO_POWER_CONTROL */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h new file mode 100755 index 000000000000..da0374fd5944 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h @@ -0,0 +1,13 @@ +/* + * Yongle Lai @ Rockchip + */ +#ifndef WIFI_BCM4319_VERSION_H +#define WIFI_BCM4319_VERSION_H + +/* + * Broadcom BCM4319 driver version. + */ +#define RTL8192_DRV_VERSION "3.20" + +#endif /* WIFI_BCM4319_VERSION_H */ + diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c b/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c new file mode 100755 index 000000000000..9ca715116aaf --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/xmit_linux.c @@ -0,0 +1,291 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + +******************************************************************************/ +#define _XMIT_OSDEP_C_ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +uint rtw_remainder_len(struct pkt_file *pfile) +{ + return (pfile->buf_len - ((SIZE_PTR)(pfile->cur_addr) - (SIZE_PTR)(pfile->buf_start))); +} + +void _rtw_open_pktfile (_pkt *pktptr, struct pkt_file *pfile) +{ +_func_enter_; + + pfile->pkt = pktptr; + pfile->cur_addr = pfile->buf_start = pktptr->data; + pfile->pkt_len = pfile->buf_len = pktptr->len; + + pfile->cur_buffer = pfile->buf_start ; + +_func_exit_; +} + +uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen) +{ + uint len = 0; + +_func_enter_; + + len = rtw_remainder_len(pfile); + len = (rlen > len)? len: rlen; + + if(rmem) + skb_copy_bits(pfile->pkt, pfile->buf_len-pfile->pkt_len, rmem, len); + + pfile->cur_addr += len; + pfile->pkt_len -= len; + +_func_exit_; + + return len; +} + +sint rtw_endofpktfile(struct pkt_file *pfile) +{ +_func_enter_; + + if (pfile->pkt_len == 0) { +_func_exit_; + return _TRUE; + } + +_func_exit_; + + return _FALSE; +} + +void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib) +{ + +#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX + struct sk_buff *skb = (struct sk_buff *)pkt; + pattrib->hw_tcp_csum = 0; + + if (skb->ip_summed == CHECKSUM_PARTIAL) { + if (skb_shinfo(skb)->nr_frags == 0) + { + const struct iphdr *ip = ip_hdr(skb); + if (ip->protocol == IPPROTO_TCP) { + // TCP checksum offload by HW + DBG_8192C("CHECKSUM_PARTIAL TCP\n"); + pattrib->hw_tcp_csum = 1; + //skb_checksum_help(skb); + } else if (ip->protocol == IPPROTO_UDP) { + //DBG_8192C("CHECKSUM_PARTIAL UDP\n"); +#if 1 + skb_checksum_help(skb); +#else + // Set UDP checksum = 0 to skip checksum check + struct udphdr *udp = skb_transport_header(skb); + udp->check = 0; +#endif + } else { + DBG_8192C("%s-%d TCP CSUM offload Error!!\n", __FUNCTION__, __LINE__); + WARN_ON(1); /* we need a WARN() */ + } + } + else { // IP fragmentation case + DBG_8192C("%s-%d nr_frags != 0, using skb_checksum_help(skb);!!\n", __FUNCTION__, __LINE__); + skb_checksum_help(skb); + } + } +#endif + +} + +int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 alloc_sz) +{ +#ifdef CONFIG_USB_HCI + int i; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + pxmitbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)alloc_sz, GFP_ATOMIC, &pxmitbuf->dma_transfer_addr); + pxmitbuf->pbuf = pxmitbuf->pallocated_buf; + if(pxmitbuf->pallocated_buf == NULL) + return _FAIL; +#else // CONFIG_USE_USB_BUFFER_ALLOC_TX + + pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz); + if (pxmitbuf->pallocated_buf == NULL) + { + return _FAIL; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); + pxmitbuf->dma_transfer_addr = 0; + +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + + for(i=0; i<8; i++) + { + pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL); + if(pxmitbuf->pxmit_urb[i] == NULL) + { + DBG_8192C("pxmitbuf->pxmit_urb[i]==NULL"); + return _FAIL; + } + + } +#endif +#ifdef CONFIG_PCI_HCI + pxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz); + if (pxmitbuf->pallocated_buf == NULL) + { + return _FAIL; + } + + pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); +#endif + + return _SUCCESS; +} + +void rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz) +{ +#ifdef CONFIG_USB_HCI + int i; + struct dvobj_priv *pdvobjpriv = &padapter->dvobjpriv; + struct usb_device *pusbd = pdvobjpriv->pusbdev; + + + for(i=0; i<8; i++) + { + if(pxmitbuf->pxmit_urb[i]) + { + //usb_kill_urb(pxmitbuf->pxmit_urb[i]); + usb_free_urb(pxmitbuf->pxmit_urb[i]); + } + } + +#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX + rtw_usb_buffer_free(pusbd, (size_t)free_sz, pxmitbuf->pallocated_buf, pxmitbuf->dma_transfer_addr); + pxmitbuf->pallocated_buf = NULL; + pxmitbuf->dma_transfer_addr = 0; +#else // CONFIG_USE_USB_BUFFER_ALLOC_TX + if(pxmitbuf->pallocated_buf) + rtw_mfree(pxmitbuf->pallocated_buf, free_sz); +#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX + +#endif +#ifdef CONFIG_PCI_HCI + if(pxmitbuf->pallocated_buf) + rtw_mfree(pxmitbuf->pallocated_buf, free_sz); +#endif +} + +void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt) +{ + if (netif_queue_stopped(padapter->pnetdev)) + netif_wake_queue(padapter->pnetdev); + + dev_kfree_skb_any(pkt); +} + +void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe) +{ + if(pxframe->pkt) + { + //RT_TRACE(_module_xmit_osdep_c_,_drv_err_,("linux : rtw_os_xmit_complete, dev_kfree_skb()\n")); + + //dev_kfree_skb_any(pxframe->pkt); + rtw_os_pkt_complete(padapter, pxframe->pkt); + + } + + pxframe->pkt = NULL; +} + +void rtw_os_xmit_schedule(_adapter *padapter) +{ + _irqL irqL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + _enter_critical_bh(&pxmitpriv->lock, &irqL); + + if(rtw_txframes_pending(padapter)) + { + tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); + } + + _exit_critical_bh(&pxmitpriv->lock, &irqL); +} + + +int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev) +{ + _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev); + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + + s32 res = 0; + int ret = 0; + +_func_enter_; + + RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n")); + + if (rtw_if_up(padapter) == _FALSE) { + RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n")); + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__); + #endif + goto drop_packet; + } + + res = rtw_xmit(padapter, pkt); + if (res < 0) { + #ifdef DBG_TX_DROP_FRAME + DBG_871X("DBG_TX_DROP_FRAME %s rtw_xmit fail\n", __FUNCTION__); + #endif + goto drop_packet; + } + + pxmitpriv->tx_pkts++; + RT_TRACE(_module_xmit_osdep_c_, _drv_info_, ("rtw_xmit_entry: tx_pkts=%d\n", (u32)pxmitpriv->tx_pkts)); + goto exit; + +drop_packet: + pxmitpriv->tx_drop++; + dev_kfree_skb_any(pkt); + RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, ("rtw_xmit_entry: drop, tx_drop=%d\n", (u32)pxmitpriv->tx_drop)); + +exit: + +_func_exit_; + + return 0; +} + diff --git a/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c b/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c new file mode 100755 index 000000000000..de4cb48c3d19 --- /dev/null +++ b/drivers/net/wireless/rtl8192c/os_dep/osdep_service.c @@ -0,0 +1,1369 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ + + +#define _OSDEP_SERVICE_C_ + +#include +#include +#include +#include +#include + +#ifdef RTK_DMP_PLATFORM +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)) +#include +#endif +#endif + +#define RT_TAG '1178' + +#ifdef MEMORY_LEAK_DEBUG +#ifdef PLATFORM_LINUX +#include +atomic_t _malloc_cnt = ATOMIC_INIT(0); +atomic_t _malloc_size = ATOMIC_INIT(0); +#endif +#endif /* MEMORY_LEAK_DEBUG */ + + +#if defined(PLATFORM_LINUX) +/* +* Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE +* @return: one of RTW_STATUS_CODE +*/ +inline int RTW_STATUS_CODE(int error_code){ + if(error_code >=0) + return _SUCCESS; + + switch(error_code) { + //case -ETIMEDOUT: + // return RTW_STATUS_TIMEDOUT; + default: + return _FAIL; + } +} +#else +inline int RTW_STATUS_CODE(int error_code){ + return error_code; +} +#endif + + +inline u8* _rtw_vmalloc(u32 sz) +{ + u8 *pbuf; +#ifdef PLATFORM_LINUX + pbuf = vmalloc(sz); +#endif + +#ifdef PLATFORM_WINDOWS + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); +#endif + + return pbuf; +} + +inline u8* _rtw_zvmalloc(u32 sz) +{ + u8 *pbuf; +#ifdef PLATFORM_LINUX + pbuf = _rtw_vmalloc(sz); + if (pbuf != NULL) + memset(pbuf, 0, sz); +#endif + +#ifdef PLATFORM_WINDOWS + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); + if (pbuf != NULL) + NdisFillMemory(pbuf, sz, 0); +#endif + + return pbuf; +} + +inline void _rtw_vmfree(u8 *pbuf, u32 sz) +{ +#ifdef PLATFORM_LINUX + vfree(pbuf); +#endif + +#ifdef PLATFORM_WINDOWS + NdisFreeMemory(pbuf,sz, 0); +#endif +} + +u8* _rtw_malloc(u32 sz) +{ + + u8 *pbuf=NULL; + +#ifdef PLATFORM_LINUX +#ifdef RTK_DMP_PLATFORM + if(sz > 0x4000) + pbuf = (u8 *)dvr_malloc(sz); + else +#endif + pbuf = kmalloc(sz, /*GFP_KERNEL*/GFP_ATOMIC); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG); + +#endif + +#ifdef MEMORY_LEAK_DEBUG +#ifdef PLATFORM_LINUX + if ( pbuf != NULL) { + atomic_inc(&_malloc_cnt); + atomic_add(sz, &_malloc_size); + } +#endif +#endif /* MEMORY_LEAK_DEBUG */ + + return pbuf; + +} + + +u8* _rtw_zmalloc(u32 sz) +{ + u8 *pbuf = _rtw_malloc(sz); + + if (pbuf != NULL) { + +#ifdef PLATFORM_LINUX + memset(pbuf, 0, sz); +#endif + +#ifdef PLATFORM_WINDOWS + NdisFillMemory(pbuf, sz, 0); +#endif + + } + + return pbuf; + +} + +void _rtw_mfree(u8 *pbuf, u32 sz) +{ + +#ifdef PLATFORM_LINUX +#ifdef RTK_DMP_PLATFORM + if(sz > 0x4000) + dvr_free(pbuf); + else +#endif + kfree(pbuf); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisFreeMemory(pbuf,sz, 0); + +#endif + +#ifdef MEMORY_LEAK_DEBUG +#ifdef PLATFORM_LINUX + atomic_dec(&_malloc_cnt); + atomic_sub(sz, &_malloc_size); +#endif +#endif /* MEMORY_LEAK_DEBUG */ + +} + + +#ifdef DBG_MEM_ALLOC + +struct rtw_dbg_mem_stat { + ATOMIC_T vir_alloc; // the memory bytes we allocate now + ATOMIC_T vir_peak; // the peak memory bytes we allocate + ATOMIC_T vir_alloc_err; // the error times we fail to allocate memory + + ATOMIC_T phy_alloc; + ATOMIC_T phy_peak; + ATOMIC_T phy_alloc_err; +} rtw_dbg_mem_stat; + +enum { + MEM_STAT_VIR_ALLOC_SUCCESS, + MEM_STAT_VIR_ALLOC_FAIL, + MEM_STAT_VIR_FREE, + MEM_STAT_PHY_ALLOC_SUCCESS, + MEM_STAT_PHY_ALLOC_FAIL, + MEM_STAT_PHY_FREE +}; + +void rtw_dump_mem_stat (void) +{ + int vir_alloc, vir_peak, vir_alloc_err, phy_alloc, phy_peak, phy_alloc_err; + + vir_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc); + vir_peak=ATOMIC_READ(&rtw_dbg_mem_stat.vir_peak); + vir_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.vir_alloc_err); + + phy_alloc=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc); + phy_peak=ATOMIC_READ(&rtw_dbg_mem_stat.phy_peak); + phy_alloc_err=ATOMIC_READ(&rtw_dbg_mem_stat.phy_alloc_err); + + DBG_871X("vir_alloc:%d, vir_peak:%d,vir_alloc_err:%d, phy_alloc:%d, phy_peak:%d, phy_alloc_err:%d\n" + , vir_alloc, vir_peak, vir_alloc_err + , phy_alloc, phy_peak, phy_alloc_err + ); +} + +void rtw_update_mem_stat(u8 flag, u32 sz) +{ + static u32 update_time = 0; + int peak, alloc; + + if(!update_time) { + ATOMIC_SET(&rtw_dbg_mem_stat.vir_alloc,0); + ATOMIC_SET(&rtw_dbg_mem_stat.vir_peak,0); + ATOMIC_SET(&rtw_dbg_mem_stat.vir_alloc_err,0); + ATOMIC_SET(&rtw_dbg_mem_stat.phy_alloc,0); + ATOMIC_SET(&rtw_dbg_mem_stat.phy_peak,0); + ATOMIC_SET(&rtw_dbg_mem_stat.phy_alloc_err,0); + } + + switch(flag) { + case MEM_STAT_VIR_ALLOC_SUCCESS: + alloc = ATOMIC_ADD_RETURN(&rtw_dbg_mem_stat.vir_alloc, sz); + peak=ATOMIC_READ(&rtw_dbg_mem_stat.vir_peak); + if (peak 5000) { + rtw_dump_mem_stat(); + update_time=rtw_get_current_time(); + } + + +} + + +inline u8* dbg_rtw_vmalloc(u32 sz, const char *func, int line) +{ + u8 *p; + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p=_rtw_vmalloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL + , sz + ); + + return p; +} + +inline u8* dbg_rtw_zvmalloc(u32 sz, const char *func, int line) +{ + u8 *p; + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p=_rtw_zvmalloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_VIR_ALLOC_SUCCESS : MEM_STAT_VIR_ALLOC_FAIL + , sz + ); + + return p; +} + +inline void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const char *func, int line) +{ + DBG_871X("DBG_MEM_ALLOC %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); + + _rtw_vmfree((pbuf), (sz)); + + rtw_update_mem_stat( + MEM_STAT_VIR_FREE + , sz + ); + +} + +inline u8* dbg_rtw_malloc(u32 sz, const char *func, int line) +{ + u8 *p; + + if((sz)>4096) + DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p=_rtw_malloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL + , sz + ); + + return p; +} + +inline u8* dbg_rtw_zmalloc(u32 sz, const char *func, int line) +{ + u8 *p; + + if((sz)>4096) + DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%d)\n", func, line, __FUNCTION__, (sz)); + + p = _rtw_zmalloc((sz)); + + rtw_update_mem_stat( + p ? MEM_STAT_PHY_ALLOC_SUCCESS : MEM_STAT_PHY_ALLOC_FAIL + , sz + ); + + return p; + +} + +inline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const char *func, int line) +{ + if((sz)>4096) + DBG_871X("DBG_MEM_ALLOC !!!!!!!!!!!!!! %s:%d %s(%p,%d)\n", func, line, __FUNCTION__, (pbuf), (sz)); + + _rtw_mfree((pbuf), (sz)); + + rtw_update_mem_stat( + MEM_STAT_PHY_FREE + , sz + ); +} +#endif + + +void _rtw_memcpy(void* dst, void* src, u32 sz) +{ + +#ifdef PLATFORM_LINUX + + memcpy(dst, src, sz); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMoveMemory(dst, src, sz); + +#endif + +} + +int _rtw_memcmp(void *dst, void *src, u32 sz) +{ + +#ifdef PLATFORM_LINUX +//under Linux/GNU/GLibc, the return value of memcmp for two same mem. chunk is 0 + + if (!(memcmp(dst, src, sz))) + return _TRUE; + else + return _FALSE; +#endif + + +#ifdef PLATFORM_WINDOWS +//under Windows, the return value of NdisEqualMemory for two same mem. chunk is 1 + + if (NdisEqualMemory (dst, src, sz)) + return _TRUE; + else + return _FALSE; + +#endif + + + +} + +void _rtw_memset(void *pbuf, int c, u32 sz) +{ + +#ifdef PLATFORM_LINUX + + memset(pbuf, c, sz); + +#endif + +#ifdef PLATFORM_WINDOWS +#if 0 + NdisZeroMemory(pbuf, sz); + if (c != 0) memset(pbuf, c, sz); +#else + NdisFillMemory(pbuf, sz, c); +#endif +#endif + +} + +void _rtw_init_listhead(_list *list) +{ + +#ifdef PLATFORM_LINUX + + INIT_LIST_HEAD(list); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisInitializeListHead(list); + +#endif + +} + + +/* +For the following list_xxx operations, +caller must guarantee the atomic context. +Otherwise, there will be racing condition. +*/ +u32 rtw_is_list_empty(_list *phead) +{ + +#ifdef PLATFORM_LINUX + + if (list_empty(phead)) + return _TRUE; + else + return _FALSE; + +#endif + + +#ifdef PLATFORM_WINDOWS + + if (IsListEmpty(phead)) + return _TRUE; + else + return _FALSE; + +#endif + + +} + + +void rtw_list_insert_tail(_list *plist, _list *phead) +{ + +#ifdef PLATFORM_LINUX + + list_add_tail(plist, phead); + +#endif + +#ifdef PLATFORM_WINDOWS + + InsertTailList(phead, plist); + +#endif + +} + + +/* + +Caller must check if the list is empty before calling rtw_list_delete + +*/ + + +void _rtw_init_sema(_sema *sema, int init_val) +{ + +#ifdef PLATFORM_LINUX + + sema_init(sema, init_val); + +#endif + +#ifdef PLATFORM_OS_XP + + KeInitializeSemaphore(sema, init_val, SEMA_UPBND); // count=0; + +#endif + +#ifdef PLATFORM_OS_CE + if(*sema == NULL) + *sema = CreateSemaphore(NULL, init_val, SEMA_UPBND, NULL); +#endif + +} + +void _rtw_free_sema(_sema *sema) +{ + +#ifdef PLATFORM_OS_CE + CloseHandle(*sema); +#endif + +} + +void _rtw_up_sema(_sema *sema) +{ + +#ifdef PLATFORM_LINUX + + up(sema); + +#endif + +#ifdef PLATFORM_OS_XP + + KeReleaseSemaphore(sema, IO_NETWORK_INCREMENT, 1, FALSE ); + +#endif + +#ifdef PLATFORM_OS_CE + ReleaseSemaphore(*sema, 1, NULL ); +#endif +} + +u32 _rtw_down_sema(_sema *sema) +{ + +#ifdef PLATFORM_LINUX + + if (down_interruptible(sema)) + return _FAIL; + else + return _SUCCESS; + +#endif + +#ifdef PLATFORM_OS_XP + + if(STATUS_SUCCESS == KeWaitForSingleObject(sema, Executive, KernelMode, TRUE, NULL)) + return _SUCCESS; + else + return _FAIL; +#endif + +#ifdef PLATFORM_OS_CE + if(WAIT_OBJECT_0 == WaitForSingleObject(*sema, INFINITE )) + return _SUCCESS; + else + return _FAIL; +#endif +} + + + +void _rtw_mutex_init(_mutex *pmutex) +{ +#ifdef PLATFORM_LINUX + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_init(pmutex); +#else + init_MUTEX(pmutex); +#endif + +#endif + +#ifdef PLATFORM_OS_XP + + KeInitializeMutex(pmutex, 0); + +#endif + +#ifdef PLATFORM_OS_CE + *pmutex = CreateMutex( NULL, _FALSE, NULL); +#endif +} + + +void _rtw_mutex_free(_mutex *pmutex) +{ +#ifdef PLATFORM_LINUX + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) + mutex_destroy(pmutex); +#else +#endif + +#endif + +#ifdef PLATFORM_OS_XP + +#endif + +#ifdef PLATFORM_OS_CE + +#endif +} + +void _rtw_spinlock_init(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_lock_init(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisAllocateSpinLock(plock); + +#endif + +} + +void _rtw_spinlock_free(_lock *plock) +{ + + +#ifdef PLATFORM_WINDOWS + + NdisFreeSpinLock(plock); + +#endif + +} + + +void _rtw_spinlock(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_lock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisAcquireSpinLock(plock); + +#endif + +} + +void _rtw_spinunlock(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_unlock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisReleaseSpinLock(plock); + +#endif +} + + +void _rtw_spinlock_ex(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_lock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisDprAcquireSpinLock(plock); + +#endif + +} + +void _rtw_spinunlock_ex(_lock *plock) +{ + +#ifdef PLATFORM_LINUX + + spin_unlock(plock); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisDprReleaseSpinLock(plock); + +#endif +} + + + +void _rtw_init_queue(_queue *pqueue) +{ + + _rtw_init_listhead(&(pqueue->queue)); + + _rtw_spinlock_init(&(pqueue->lock)); + +} + +u32 _rtw_queue_empty(_queue *pqueue) +{ + return (rtw_is_list_empty(&(pqueue->queue))); +} + + +u32 rtw_end_of_queue_search(_list *head, _list *plist) +{ + if (head == plist) + return _TRUE; + else + return _FALSE; +} + + +u32 rtw_get_current_time(void) +{ + +#ifdef PLATFORM_LINUX + return jiffies; +#endif + +#ifdef PLATFORM_WINDOWS + LARGE_INTEGER SystemTime; + NdisGetCurrentSystemTime(&SystemTime); + return (u32)(SystemTime.LowPart);// count of 100-nanosecond intervals +#endif +} + +inline u32 rtw_systime_to_ms(u32 systime) +{ +#ifdef PLATFORM_LINUX + return systime*1000/HZ; +#endif + +#ifdef PLATFORM_WINDOWS + return systime /10000 ; +#endif +} + +// the input parameter start use the same unit as returned by rtw_get_current_time +inline s32 rtw_get_passing_time_ms(u32 start) +{ +#ifdef PLATFORM_LINUX + return rtw_systime_to_ms(jiffies-start); +#endif + +#ifdef PLATFORM_WINDOWS + LARGE_INTEGER SystemTime; + NdisGetCurrentSystemTime(&SystemTime); + return rtw_systime_to_ms((u32)(SystemTime.LowPart) - start) ; +#endif +} + +inline s32 rtw_get_time_interval_ms(u32 start, u32 end) +{ +#ifdef PLATFORM_LINUX + return rtw_systime_to_ms(end-start); +#endif + +#ifdef PLATFORM_WINDOWS + return rtw_systime_to_ms(end-start); +#endif +} + + +void rtw_sleep_schedulable(int ms) +{ + +#ifdef PLATFORM_LINUX + + u32 delta; + + delta = (ms * HZ)/1000;//(ms) + if (delta == 0) { + delta = 1;// 1 ms + } + set_current_state(TASK_INTERRUPTIBLE); + if (schedule_timeout(delta) != 0) { + return ; + } + return; + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMSleep(ms*1000); //(us)*1000=(ms) + +#endif + +} + + +void rtw_msleep_os(int ms) +{ + +#ifdef PLATFORM_LINUX + + msleep((unsigned int)ms); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMSleep(ms*1000); //(us)*1000=(ms) + +#endif + + +} +void rtw_usleep_os(int us) +{ + +#ifdef PLATFORM_LINUX + + // msleep((unsigned int)us); + if ( 1 < (us/1000) ) + msleep(1); + else + msleep( (us/1000) + 1); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisMSleep(us); //(us) + +#endif + + +} + + +#ifdef DBG_DELAY_OS +void _rtw_mdelay_os(int ms, const char *func, const int line) +{ + if(ms>10) + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms); + rtw_msleep_os(ms); + return; + + + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, ms); + +#if defined(PLATFORM_LINUX) + + mdelay((unsigned long)ms); + +#elif defined(PLATFORM_WINDOWS) + + NdisStallExecution(ms*1000); //(us)*1000=(ms) + +#endif + + +} +void _rtw_udelay_os(int us, const char *func, const int line) +{ + + if(us > 1000) { + DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); + rtw_usleep_os(us); + return; + } + + + //DBG_871X("%s:%d %s(%d)\n", func, line, __FUNCTION__, us); + + +#if defined(PLATFORM_LINUX) + + udelay((unsigned long)us); + +#elif defined(PLATFORM_WINDOWS) + + NdisStallExecution(us); //(us) + +#endif + +} +#else +void rtw_mdelay_os(int ms) +{ + +#ifdef PLATFORM_LINUX + + mdelay((unsigned long)ms); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisStallExecution(ms*1000); //(us)*1000=(ms) + +#endif + + +} +void rtw_udelay_os(int us) +{ + +#ifdef PLATFORM_LINUX + + udelay((unsigned long)us); + +#endif + +#ifdef PLATFORM_WINDOWS + + NdisStallExecution(us); //(us) + +#endif + +} +#endif + +#define RTW_SUSPEND_LOCK_NAME "rtw_wifi" + +#ifdef CONFIG_WAKELOCK +static struct wake_lock rtw_suspend_lock; +#elif defined(CONFIG_ANDROID_POWER) +static android_suspend_lock_t rtw_suspend_lock ={ + .name = RTW_SUSPEND_LOCK_NAME +}; +#endif + +inline void rtw_suspend_lock_init() +{ + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + DBG_871X("##########%s ###########\n", __FUNCTION__); + #endif + + #ifdef CONFIG_WAKELOCK + wake_lock_init(&rtw_suspend_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_LOCK_NAME); + #elif defined(CONFIG_ANDROID_POWER) + android_init_suspend_lock(&rtw_suspend_lock); + #endif + +} + +inline void rtw_suspend_lock_uninit() +{ + + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + DBG_871X("##########%s###########\n", __FUNCTION__); + if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { + DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); + return; + } + #endif + + #ifdef CONFIG_WAKELOCK + wake_lock_destroy(&rtw_suspend_lock); + #elif defined(CONFIG_ANDROID_POWER) + android_uninit_suspend_lock(&rtw_suspend_lock); + #endif +} + + +inline void rtw_lock_suspend() +{ + + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + //DBG_871X("##########%s###########\n", __FUNCTION__); + if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { + DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); + return; + } + #endif + + #ifdef CONFIG_WAKELOCK + wake_lock(&rtw_suspend_lock); + #elif defined(CONFIG_ANDROID_POWER) + android_lock_suspend(&rtw_suspend_lock); + #endif +} + +inline void rtw_unlock_suspend() +{ + #if defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER) + //DBG_871X("##########%s###########\n", __FUNCTION__); + if(rtw_suspend_lock.link.next == LIST_POISON1 || rtw_suspend_lock.link.prev == LIST_POISON2) { + DBG_871X("##########%s########### list poison!!\n", __FUNCTION__); + return; + } + #endif + + #ifdef CONFIG_WAKELOCK + wake_unlock(&rtw_suspend_lock); + #elif defined(CONFIG_ANDROID_POWER) + android_unlock_suspend(&rtw_suspend_lock); + #endif +} + + +inline void ATOMIC_SET(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + atomic_set(v,i); + #elif defined(PLATFORM_WINDOWS) + *v=i;// other choice???? + #endif +} + +inline int ATOMIC_READ(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + return atomic_read(v); + #elif defined(PLATFORM_WINDOWS) + return *v; // other choice???? + #endif +} + +inline void ATOMIC_ADD(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + atomic_add(i,v); + #elif defined(PLATFORM_WINDOWS) + InterlockedAdd(v,i); + #endif +} +inline void ATOMIC_SUB(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + atomic_sub(i,v); + #elif defined(PLATFORM_WINDOWS) + InterlockedAdd(v,-i); + #endif +} + +inline void ATOMIC_INC(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + atomic_inc(v); + #elif defined(PLATFORM_WINDOWS) + InterlockedIncrement(v); + #endif +} + +inline void ATOMIC_DEC(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + atomic_dec(v); + #elif defined(PLATFORM_WINDOWS) + InterlockedDecrement(v); + #endif +} + +inline int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + return atomic_add_return(i,v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedAdd(v,i); + #endif +} + +inline int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i) +{ + #ifdef PLATFORM_LINUX + return atomic_sub_return(i,v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedAdd(v,-i); + #endif +} + +inline int ATOMIC_INC_RETURN(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + return atomic_inc_return(v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedIncrement(v); + #endif +} + +inline int ATOMIC_DEC_RETURN(ATOMIC_T *v) +{ + #ifdef PLATFORM_LINUX + return atomic_dec_return(v); + #elif defined(PLATFORM_WINDOWS) + return InterlockedDecrement(v); + #endif +} + + +#ifdef PLATFORM_LINUX +int openFile(struct file **fpp, char *path,int flag,int mode) +{ + struct file *fp; + + fp=filp_open(path, flag, mode); + if(IS_ERR(fp)) { + *fpp=NULL; + return PTR_ERR(fp); + } + else { + *fpp=fp; + return 0; + } +} + +int closeFile(struct file *fp) +{ + filp_close(fp,NULL); + return 0; +} + +int readFile(struct file *fp,char *buf,int len) +{ + int rlen=0, sum=0; + + if (!fp->f_op || !fp->f_op->read) + return -EPERM; + + while(sumf_op->read(fp,buf+sum,len-sum, &fp->f_pos); + if(rlen>0) + sum+=rlen; + else if(0 != rlen) + return rlen; + else + break; + } + + return sum; + +} + +int writeFile(struct file *fp,char *buf,int len) +{ + int wlen=0, sum=0; + + if (!fp->f_op || !fp->f_op->write) + return -EPERM; + + while(sumf_op->write(fp,buf+sum,len-sum, &fp->f_pos); + if(wlen>0) + sum+=wlen; + else if(0 != wlen) + return wlen; + else + break; + } + + return sum; + +} +#endif + +#if 1 //#ifdef MEM_ALLOC_REFINE_ADAPTOR +#ifdef PLATFORM_LINUX +struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv) +{ + struct net_device *pnetdev; + struct rtw_netdev_priv_indicator *pnpi; + + pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); + if (!pnetdev) + goto RETURN; + + pnpi = netdev_priv(pnetdev); + pnpi->priv=old_priv; + pnpi->sizeof_priv=sizeof_priv; + +RETURN: + return pnetdev; +} + +struct net_device *rtw_alloc_etherdev(int sizeof_priv) +{ + struct net_device *pnetdev; + struct rtw_netdev_priv_indicator *pnpi; + + pnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator)); + if (!pnetdev) + goto RETURN; + + pnpi = netdev_priv(pnetdev); + + pnpi->priv = rtw_zvmalloc(sizeof_priv); + if (!pnpi->priv) { + free_netdev(pnetdev); + pnetdev = NULL; + goto RETURN; + } + + pnpi->sizeof_priv=sizeof_priv; +RETURN: + return pnetdev; +} + +void rtw_free_netdev(struct net_device * netdev) +{ + struct rtw_netdev_priv_indicator *pnpi; + + if(!netdev) + goto RETURN; + + pnpi = netdev_priv(netdev); + + if(!pnpi->priv) + goto RETURN; + + rtw_vmfree(pnpi->priv, pnpi->sizeof_priv); + free_netdev(netdev); + +RETURN: + return; +} + +/* +* Jeff: this function should be called under ioctl (rtnl_lock is accquired) while +* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) +*/ +int rtw_change_ifname(_adapter *padapter, const char *ifname) +{ + struct net_device *pnetdev; + struct net_device *cur_pnetdev = padapter->pnetdev; + int ret; + + if(!padapter) + goto error; + + //free the old_pnetdev + if(padapter->old_pnetdev) { + free_netdev(padapter->old_pnetdev); + padapter->old_pnetdev = NULL; + } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) + if(!rtnl_is_locked()) + unregister_netdev(cur_pnetdev); + else +#endif + unregister_netdevice(cur_pnetdev); + + #ifdef CONFIG_PROC_DEBUG + rtw_proc_remove_one(cur_pnetdev); + #endif //CONFIG_PROC_DEBUG + + padapter->old_pnetdev=cur_pnetdev; + + pnetdev = rtw_init_netdev(padapter); + if (!pnetdev) { + ret = -1; + goto error; + } + +#ifdef CONFIG_USB_HCI + + SET_NETDEV_DEV(pnetdev, &padapter->dvobjpriv.pusbintf->dev); + + usb_set_intfdata(padapter->dvobjpriv.pusbintf, pnetdev); + +#elif defined(CONFIG_PCI_HCI) + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) + SET_NETDEV_DEV(pnetdev, &padapter->dvobjpriv.ppcidev->dev); +#endif + + pci_set_drvdata(padapter->dvobjpriv.ppcidev, pnetdev); + +#endif + + rtw_init_netdev_name(pnetdev, ifname); + + _rtw_memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)) + if(!rtnl_is_locked()) + ret = register_netdev(pnetdev); + else +#endif + ret = register_netdevice(pnetdev); + + if ( ret != 0) { + RT_TRACE(_module_hci_intfs_c_,_drv_err_,("register_netdev() failed\n")); + goto error; + } + + #ifdef CONFIG_PROC_DEBUG + rtw_proc_init_one(pnetdev); + #endif //CONFIG_PROC_DEBUG + + return 0; + +error: + + return -1; + +} +#endif +#endif //MEM_ALLOC_REFINE_ADAPTOR + +u64 rtw_modular64(u64 x, u64 y) +{ +#ifdef PLATFORM_LINUX + return do_div(x, y); +#elif defined(PLATFORM_WINDOWS) + return (x % y); +#endif +} + +u64 rtw_division64(u64 x, u64 y) +{ +#ifdef PLATFORM_LINUX + do_div(x, y); + return x; +#elif defined(PLATFORM_WINDOWS) + return (x / y); +#endif +} + From da7b50302d465c88e501bea686c5bcc41e71f484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E4=BC=9F=E9=BE=99?= Date: Sat, 24 Sep 2011 21:55:41 +0800 Subject: [PATCH 150/150] add rtl8188cu signal smoothing --- .../wireless/rtl8192c/core/rtw_ioctl_set.uu | 326 +-- .../wireless/rtl8192c/include/wlan_bssdef.h | 1 + .../rtl8192c/os_dep/linux/ioctl_linux.uu | 1950 +++++++++-------- .../rtl8192c/os_dep/linux/wifi_version.h | 2 +- 4 files changed, 1141 insertions(+), 1138 deletions(-) diff --git a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu index 6d0fe423d5ed..0cf1c169b464 100644 --- a/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu +++ b/drivers/net/wireless/rtl8192c/core/rtw_ioctl_set.uu @@ -1,170 +1,170 @@ begin 644 core/rtw_ioctl_set.o -M?T5,1@$!`0````````````$`*``!``````````````!<$```````!30````` +M?T5,1@$!`0````````````$`*``!``````````````!D$```````!30````` M`"@`$``-``1`+>4`()#E(`!2XQ0``(H``%+C%```"@0PT.4@,$/B4-$=+C$P``&@$#$N,'```:!CN`X@0P@^(#(`+B`@*#X``0H.,0 -M(*#C_O__ZPD``.I7#8#B$`"`XN`0@^+^___K`$!0X@,```H1#H3B`!"@XQ`@ +M`#"@X00@D>4-$=+C$P``&@$#$N,'```:!CN`X@PP@^(#(`+B`@*#X``0H.,0 +M(*#C_O__ZPD``.I7#8#B&`"`XN`0@^+^___K`$!0X@,```H1#H3B`!"@XQ`@ MH./^___K`0"@XQ"`O>CP02WI`4"@X0%@H.$`4*#A`0!PX@``H#.A#Y#A%0`` -M&@,`4>,3``"*7GV%XBP`A^(!`H#@`!"@XQ`@H./^___K!0"@X2`0A^($(*#A -M`#"@X_[__^M?3H3B"D"$X@1!A>`$0(3B`#"@XP`PA.4#0%#@`4"@$P```.H` -M0*#C!`"@X?"!O>AP0"WI`$"@X0%0H.$$8)'E`V'&XP0`5N,`0*##(0``R@@P -MD>4%`%/C`2"@`Z0W`0,#((0'!@``"@T`4^,`(*`3I#,#8(3G!`"@X5X=A.(@$('B!B"@X0$PH./^___K`$!0X@%`H!,$ -M`*#A<("]Z/!'+>D(T$WB`$"@X0%0H.$$,)'E``!3XP(``+H!`1/C+@``"D(! -M`.H!`1/C*P``"E<-@.(0`(#BX!"$XO[__^L`8%#B!```"J`W`>,#,)3G`@!3 -MX^Q@E@4!```*I#4@`%/C)0$`&DP``.H$`%;C"0``&@@PE>40 -M`%/C!@``"B``4^,=`0`:$#"@XP@PA>4`<*#C!X"@X40``.H%`%;C`0!6$Q4! -M``H\``#J"#L!XP,PE.<#`%/C$P``BOPW`>,#,)3G``!3XP\``!H(,)7E!0!3 -MXP$@H`.D-P$#`R"$!P8```H-`%/C`""@$Z0W`1,#((07!2"@`Z0W`0,#((0' -MI#`H!$#```*`P``Z@!PH.,'@*#A````Z@&`H..@-P'C -M`S"4YP(`4^,E```*!0!6XP$`5A,B```:"""5Y2`@@N*(/@'C`R"$YP1@E>4" -M8<;CC#X!XP-@A.<(()7ED#X!XP,@A.<@<(7B>HV$XA0`B.('$*#A"""5Y?[_ -M_^L&`H3@7@V`XBP`@.('$*#A"""5Y?[__^M?/H;B"C"#X@,QA.`(()7E!""# -MY:@W`>,#8(3G!`"@X0@0B.+^___K`4"@XZH``.H$,)7E`@(3XQL```H!`%CC -M#```&M@!Q>$`(.#C_S\/XP`@`N`!,`/@"!"-XO@@8>%C#83B$`"`X@T0H.$( -M(*#C_O__ZPX``.K8`<7A`"#@X_\_#^,`(`+@`3`#X`@0C>+X(&'A8PV$X@@` -M@.(-$*#A"""@X_[__^M0``#J`0!8XTX``!H!`%?C!"#5!08[H`,#((0'!#"5 -MY0,`$^.!```*!FN$X@1@AN(#,`/B`P*&X``0H.,0(*#C_O__ZV%]A.($<(?B -M!`#5Y0,``.(``H?@`!"@XQ`@H./^___K8HV$X@2`B.($`-7E`P``X@`"B.`` -M$*#C$""@X_[__^L$,)7E`0(3XPL```H#,`/B`P*'X#`0A>(((*#C_O__ZP0` -MU>4#``#B``*(X#@0A>(((*#C_O__ZPH``.H#,`/B`P*'X#@0A>(((*#C_O__ -MZP0`U>4#``#B``*(X#`0A>(((*#C_O__ZP0`U>4#``#B``*&X"`0A>((()7E -M_O__ZP0PE>4#,`/B!#"%Y0$PH./X*@'C`C#$YP`0H./Z*@'C`A#$YP0`H.%> -M'83B(!"!X@0@E>7^___K`$!0X@%`H!,Z``#J5PV$XA``@.+@$(3B_O__ZP"` -M4.(!0*`#,P``"A&NB.(*`*#A`!"@XQ`@H./^___K()"%X@H`H.$)$*#A$""@ -MX_[__^L"`%;C%@``&@`@H./Y.@'C`R#$YP0PE>4!`A/C"```"O``B.(0$(GB -M"""@X_[__^L!#(CB&!")X@@@H./^___K!P``ZO``B.(8$(GB"""@X_[__^L! -M#(CB$!")X@@@H./^___K``!7XP4```H$`*#A"!"@X0`@H./^___K`$"@X00` -M`.H$`*#A"!"@X0$@H./^___K`$"@X0!`5.(!0*`3````Z@!`H.,$`*#A"-"- -MXO"'O>@"`%;CU/[_&L_^_^H00"WI7DV`XB!`A.((.P'C`Q"`YP,`4>,"(*"# -MH#AP0"WI*-!-X@!`4.(> -M```*=34#XP,PU.<``%/C&@``"FPPE.4B#1/C&0``&@PUU.4!`%/C%@``"O[_ -M_^L-,*#A?VW#XS]@QN,$,);E`3"#X@0PAN4$4(WB!0"@X0`0H.,D(*#C_O__ -MZP0`H.$%$*#A_O__ZP!`H.$$,);E`3!#X@0PAN7^___K`@``Z@!`H.,```#J -M`4"@XP0`H.$HT(WB<("]Z!!`+>D`0*#A_O__ZPT@H.%_/<+C/S##XP0@D^4! -M((+B!""#Y6PPE.4!`!/C!0``"@0`H.'^___K!`"@X?[__^L$`*#A_O__ZPT@ -MH.%_/<+C/S##XP0@D^4!($+B!""#Y?[__^L!`*#C$("]Z'!`+>D`0*#A`5"@ -MX3@QD.4!`%/A/@``"O[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@@^5L,)3E -M`0`3XP(``!HX(93E``!2XP0``!H$`*#A_O__ZVPPE.4!`!/C`0``&D``$^,$ -M```*!`"@X?[__^ML,)3E`0`3XP0``!HX,93E`0!3XP$```H``%/C`0``&@0` -MH.'^___K.#&4Y00`4^,#```:`##@X]@PA.4$`*#A_O__ZSA1A.5L,)3E>### -MXVPPA.4!`%7C"#"#`VPPA`4(```*(#"#,VPPA#4%```Z!`!5XP,``!H0,(/C -M;#"$Y00`H.'^___K#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP$`H.-P -M@+WH<$`MZ0!`H.&$4)#E`3#@X]@P@.5L,)#E@#"#XVPP@.5X4(#E`3"@XW`P -MP.6$`(#B_O__ZP$`4.,-```:;#"4Y8`PP^-L,(3E##74Y0``4^,"```*<3#4 -MY0``4^,\```*!`"@X900A.+^___K`$"@X3@``.IL`(3B_O__ZP$`4.,+```: -M`#"@XW`PQ.4`,`#C`#!`XP`0D^5%#H3B"`"`XJ(?@>("$('B_O__ZP%`H.,H -M``#J;#"4Y2``$^,7```*0#"@XVPPA.6I;83B)5"&X@4`H.$`$*#C)""@X_[_ -M_^L%`*#AE!"$XB0@H./^___K!`"@X?[__^L=`(;B_O__ZP0`H.'^___K`0!0 -MXP!`H!,`,*`#<##$!0%`H`,-``#J@###XVPPA.4,-=3E``!3XP(```IQ,-3E -M``!3XP0```H$`*#AE!"$XO[__^L`0*#A````Z@%`H.,$`*#A<("]Z/!!+>D` -M4*#A`7"@X74U`^,#,-#G``!3XP!`H`-O```*;#"0Y8``$^,!0*`3:P``&@(+ -M$^-K```:$```ZFPPE>4""Q/C!0``"@8`H.'^___K`4!$X@$`=./W__\:`0`` -MZ@``5.,%``#*C`&?Y8P1G^7^___K;$"5Y=1#X.=0``#J_O__ZPT@H.%_/<+C -M/S##XP0@D^4!((+B!""#Y6PPE>5!`!/C,P``"I0@E>4`,)?E`P!2X2$``!J8 -M`(7B!!"'XO[__^L!`%#C'```&FPPE>4(`!/C%```&@4`H.'`$(7B_O__ZP`` -M4.,!0*`3-```&@4`H.'^___K;#"5Y0$`$^,!```*!0"@X?[__^L%`*#A_O__ -MZVPPE>5``!/C0###$R`P@Q-L,(45$@``Z@4`H.$!$*#C`2"@X?[__^L-``#J -M!0"@X?[__^ML,)7E`0`3XP$```H%`*#A_O__ZP4`H.'^___K;#"5Y4``$^-` -M,,,3(#"#$VPPA14F/*#C`S#5YP$`4^,-```*!P"@X?[__^L``%#C"0``"I0` -MA>('$*#A)""@X_[__^L`,*#CB#2%Y04`H.'^___K`$"@X0```.H`0*#C#2"@ -MX7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP0`H.'P@;WH9`"@X_[__^LP0*#C -M9&"@XX___^H``````````'!`+>D`0*#A`5"@X0`PT>4``%/C#P``&@$@T>4` -M`%+C#```&@(PT>4``%/C&@``&@,PT>4``%/C%P``&@0PT>4``%/C%```&@4P -MT>4``%/C$0``&D<``.K_`%/C#@``&@$PU>7_`%/C"P``&@(PU>7_`%/C"``` -M&@,PU>7_`%/C!0``&@0PU>7_`%/C`@``&@4PU>7_`%/C-@``"O[__^L-(*#A -M?SW"XS\PP^,$()/E`2""X@0@@^5L,)3E(@T3X]-#X!@` -M````L+"@@'P```"PL*B`Z````+"PK(!L`0``L+"J@!P"``"PK@&`;`<``+"P -MJ("H!P``L*H)@$P(``"PL*B`N`@``+"PJH#4"0``L+"J@#0+``"PL*R`.`T` -M`+"PJH!R='=?'0`+F1A=&$`+F)S -M@````,``'`````` -M`````*8/```K```````````````!`````````!$````#``````````````#1 -M#P``B@```````````````0`````````!`````@``````````````W!(``!`$ -M```/````&@````0````0````"0````,``````````````.P6```C`P`````` -M```````!```````````````````````````````!```````````````$`/'_ -M`````````````````P`!``````````````````,``P`````````````````# -M``0`$0`````````````````!``````````````````,`!0`````````````` -M```#``8`$0```'P````````````!`!$```#H`````````````0`1````;`$` -M``````````$`$0```!P"```````````!`!$```!L!P```````````0`1```` -MJ`<```````````$`$0```$P(```````````!`!$```"X"````````````0`1 -M````U`D```````````$`$0```#0+```````````!`!0````P#0`````````` -M`0`1````.`T```````````$``````````````````P`(`!<`````````%``` -M``$`"``````````````````#``D``````````````````P`+```````````` -M``````,`"@`````````````````#``P`)@````````!\````$@`!`#@````` -M`````````!````!/````?````&P````2``$`:0``````````````$````'4` -M`````````````!````"%````Z````(0````2``$`GP``````````````$``` -M`*L```!L`0``L````!(``0#"```````````````0````S@```!P"``!0!0`` -M$@`!`.4``````````````!````#W````;`<``#P````2``$`&@$````````` -M````$````"0!R -M='=?0!R='=? -M`P``!PL``",#```'"T``)0,```< -M+@``P`P``!P:``#8#```'"(``.@,```<,@``$`T``!PJ```@#0``'#L``#`- -M```"%@``-`T```(4``#4#0``'"@``!0.````X``!PB``"(#@``'#(``*@.```<*@```````"H"```````` -M`!L```@````J`@``$````"H"```8````*@(``"`````J`@``*````"H"```P -M````*@(``#@````J`@``0````"H"``!(````*@(``%`````J`@``6````"H" -"```` +M&@,`4>,3``"*7GV%XC0`A^(!`H#@`!"@XQ`@H./^___K!0"@X2@0A^($(*#A +M`#"@X_[__^M?3H3B#$"$X@1!A>`$0(3B`#"@XP`PA.4#0%#@`4"@$P```.H` +M0*#C!`"@X?"!O>AP0"WI`$"@X0%0H.$$8)'E`V'&XP0`5N,`0*##(@``R@@P +MD>4%`%/C`2"@`ZPW`0,#((0'!@``"@T`4^,`(*`3K##X;B`P"`X@`"A.`$`(#B#!"%X@@@E>7^___K7SZ&X@PP@^(#,83@ +M"""5Y00@@^6P-P'C`V"$YP0`H.%>'83B*!"!X@8@H.$!,*#C_O__ZP!`4.(! +M0*`3!`"@X7"`O>CP1RWI"-!-X@!`H.$!4*#A!#"1Y0``4^,"``"Z`0$3XRX` +M``I#`0#J`0$3XRL```I7#8#B&`"`XN`0A.+^___K`&!0X@0```JH-P'C`S"4 +MYP(`4^/L8)8%`0``"JPW`>,#8)3G!##5Y0``4^,Q`0`:##"5Y0$`<^,R`0`: +ML"'5X?\_#^,#`%+A+@$`&BD!`.H(,)7E(`!3XR8!`!I,``#J!`!6XPD``!H( +M,)7E$`!3XP8```H@`%/C'@$`&A`PH.,(,(7E`'"@XP>`H.%$``#J!0!6XP$` +M5A,6`0`*/```ZA`[`>,#,)3G`P!3XQ,``(H$.`'C`S"4YP``4^,/```:"#"5 +MY04`4^,!(*`#K#,#8)3G`0``Z@0X`>,#8)3G;#"4Y2``$^,&```*##"5Y0$`<^/U +M```:L"'5X?\_#^,#`%+A\0``&@(`5N,#```:"#"5Y2``4^/L```:"```Z@0` +M5N,&```:"#"5Y1``4^,@`%,3Y0``&B``4^,0,*`#"#"%!01PE>77?>#G;#"4 +MY2``$^,'```*`0`3XP%PH!,'@*`1`P``"@,``.H`<*#C!X"@X0```.H!@*#C +MJ#4@((+BE#X!XP,@A.<$ +M8)7E`F'&XY@^`>,#8(3G"""5Y9P^`>,#((3G('"%XGJ-A.(@`(CB!Q"@X0@@ +ME>7^___K7C^&X@,P@^(#,H3@!`"#X@<0H.$(()7E_O__ZU\^AN(,,(/B`S&$ +MX`@@E>4$((/EL#4"`A/C +M&P``"@$`6.,,```:V`'%X0`@X./_/P_C`"`"X`$P`^`($(WB^"!AX6,-A.(8 +M`(#B#1"@X0@@H./^___K#@``ZM@!Q>$`(.#C_S\/XP`@`N`!,`/@"!"-XO@@ +M8>%C#83B$`"`X@T0H.$((*#C_O__ZU```.H!`%CC3@``&@$`5^,$(-4%"#@! +M`P,@A`<$,)7E`P`3XX$```H&:X3B#&"&X@,P`^(#`H;@`!"@XQ`@H./^___K +M87V$X@QPA^($`-7E`P``X@`"A^``$*#C$""@X_[__^MBC83B#("(X@0`U>4# +M``#B``*(X``0H.,0(*#C_O__ZP0PE>4!`A/C"P``"@,P`^(#`H?@,!"%X@@@ +MH./^___K!`#5Y0,``.(``HC@.!"%X@@@H./^___K"@``Z@,P`^(#`H?@.!"% +MX@@@H./^___K!`#5Y0,``.(``HC@,!"%X@@@H./^___K!`#5Y0,``.(``H;@ +M(!"%X@@@E>7^___K!#"5Y0,P`^($,(7E`3"@XQLLH.,",,3G`!"@XP(K`>," +M$,3G!`"@X5X=A.(H$('B!""5Y?[__^L`0%#B`4"@$SH``.I7#83B&`"`XN`0 +MA.+^___K`(!0X@%`H`,S```*$:Z(X@H`H.$`$*#C$""@X_[__^L@D(7B"@"@ +MX0D0H.$0(*#C_O__ZP(`5N,6```:`""@XP$[`>,#(,3G!#"5Y0$"$^,(```* +M\`"(XA`0B>(((*#C_O__ZP$,B.(8$(GB"""@X_[__^L'``#J\`"(XA@0B>(( +M(*#C_O__ZP$,B.(0$(GB"""@X_[__^L``%?C!0``"@0`H.$($*#A`""@X_[_ +M_^L`0*#A!```Z@0`H.$($*#A`2"@X_[__^L`0*#A`$!4X@%`H!,```#J`$"@ +MXP0`H.$(T(WB\(>]Z`(`5N/3_O\:SO[_ZA!`+>E>38#B*$"$XA`[`>,#$(#G +M`P!1XP(@H(.H-P&#`R"`AP00H.'^___K`0!0XP``H!,!`*`#$("]Z'!`+>DH +MT$WB`$!0XAX```J!-0/C`S#4YP``4^,:```*;#"4Y2(-$^,9```:$#74Y0$` +M4^,6```*_O__ZPTPH.%_;(%`*#A`!"@ +MXR0@H./^___K!`"@X040H.'^___K`$"@X00PEN4!,$/B!#"&Y?[__^L"``#J +M`$"@XP```.H!0*#C!`"@X2C0C>)P@+WH$$`MZ0!`H.'^___K#2"@X7\]PN,_ +M,,/C!""3Y0$@@N($((/E;#"4Y0$`$^,%```*!`"@X?[__^L$`*#A_O__ZP0` +MH.'^___K#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ZP$`H.,0@+WH<$`M +MZ0!`H.$!4*#A/#&0Y0$`4^$^```*_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B +M!""#Y6PPE.4!`!/C`@``&CPAE.4``%+C!```&@0`H.'^___K;#"4Y0$`$^,! +M```:0``3XP0```H$`*#A_O__ZVPPE.4!`!/C!```&CPQE.4!`%/C`0``"@`` +M4^,!```:!`"@X?[__^L\,93E!`!3XP,``!H`,.#CV#"$Y00`H.'^___K/%&$ +MY6PPE.5X,,/C;#"$Y0$`5>,(,(,#;#"$!0@```H@,(,S;#"$-04``#H$`%7C +M`P``&A`P@^-L,(3E!`"@X?[__^L-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^ +M___K`0"@XW"`O>AP0"WI`$"@X810D.4!,.#CV#"`Y6PPD.6`,(/C;#"`Y7A0 +M@.4!,*#C<##`Y80`@.+^___K`0!0XPT``!IL,)3E@###XVPPA.40-=3E``!3 +MXP(```IQ,-3E``!3XSP```H$`*#AE!"$XO[__^L`0*#A.```ZFP`A.+^___K +M`0!0XPL``!H`,*#C<##$Y0`P`.,`,$#C`!"3Y44.A.(,`(#BHA^!X@(0@>+^ +M___K`4"@XR@``.IL,)3E(``3XQ<```I`,*#C;#"$Y:EMA.(M4(;B!0"@X0`0 +MH.,D(*#C_O__ZP4`H.&4$(3B)""@X_[__^L$`*#A_O__ZR4`AN+^___K!`"@ +MX?[__^L!`%#C`$"@$P`PH`-P,,0%`4"@`PT``.J`,,/C;#"$Y1`UU.4``%/C +M`@``"G$PU.4``%/C!```"@0`H.&4$(3B_O__ZP!`H.$```#J`4"@XP0`H.%P +M@+WH\$$MZ0!0H.$!<*#A@34#XP,PT.<``%/C`$"@`V\```IL,)#E@``3XP%` +MH!-K```:`@L3XVL``!H0``#J;#"5Y0(+$^,%```*!@"@X?[__^L!0$3B`0!T +MX_?__QH!``#J``!4XP4``,J,`9_EC!&?Y?[__^ML0)7EU$/@YU```.K^___K +M#2"@X7\]PN,_,,/C!""3Y0$@@N($((/E;#"5Y4$`$^,S```*E""5Y0`PE^4# +M`%+A(0``&I@`A>($$(?B_O__ZP$`4.,<```:;#"5Y0@`$^,4```:!0"@X<`0 +MA>+^___K``!0XP%`H!,T```:!0"@X?[__^ML,)7E`0`3XP$```H%`*#A_O__ +MZP4`H.'^___K;#"5Y4``$^-`,,,3(#"#$VPPA142``#J!0"@X0$0H.,!(*#A +M_O__ZPT``.H%`*#A_O__ZVPPE>4!`!/C`0``"@4`H.'^___K!0"@X?[__^ML +M,)7E0``3XT`PPQ,@,(,3;#"%%0PV`N,#,-7G`0!3XPT```H'`*#A_O__ZP`` +M4.,)```*E`"%X@<0H.$D(*#C_O__ZP`PH..,-(7E!0"@X?[__^L`0*#A```` +MZ@!`H.,-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K!`"@X?"!O>AD`*#C +M_O__ZS!`H.-D8*#CC___Z@``````````<$`MZ0!`H.$!4*#A`##1Y0``4^,/ +M```:`2#1Y0``4N,,```:`C#1Y0``4^,:```:`S#1Y0``4^,7```:!##1Y0`` +M4^,4```:!3#1Y0``4^,1```:1P``ZO\`4^,.```:`3#5Y?\`4^,+```:`C#5 +MY?\`4^,(```:`S#5Y?\`4^,%```:!##5Y?\`4^,"```:!3#5Y?\`4^,V```* +M_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y6PPE.4B#1/CTT/@%R,``!I! +M`!/C&```"N``A.(%$*#A!B"@X_[__^L!`%#C!```&FPPE.4(`!/C`4"@`Q<` +M``H-``#J!`"@X?[__^ML,)3E`0`3XP$```H$`*#A_O__ZP0`H.'^___K;#"4 +MY4``$^-`,,,3(#"#$VPPA!6X`(3B!1"@X08@H./^___K`3"@XXPTA.4$`*#A +M_O__ZP!`H.$-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K````Z@!`H.,$ +M`*#A<("]Z`````"PL*"`?````+"PJ(#H````L+"L@&P!``"PL*J`(`(``+"N +M`8!T!P``L+"H@+`'``"PJ@F`5`@``+"PJ(#`"```L+"J@-P)``"PL*J`/`L` +M`+"PK(!`#0``L+"J@')T=U]S971?.#`R7S$Q7W-S:60`)7,Z(%-E="!34TE$ +M(&ES(&YO="!A;&QO=V5D('5N9&5R('-U6EN9PH``````$=#0SH@*$=. +M52D@-"XT+C``02H```!A96%B:0`!(`````4W+4$`!@H'00@!$@04`14!%P,8 +M`1D!&@(>`0`N0!?0!R='=?5]C +M;60`_R^183!`XG,P[^8%`%/C5P!`DA[_ M+Y%!,$#B(#`%/C"@`` -M&@`PH.,,*P'C`C"$YP(0H.,(*P'C`A"$YP,0H..@)P'C`A"$YP-`H.$<``#J -M`@`1XPD```H`,*#C#"L!XP(PA.@%P'C`2"$YP-`H.$0 -M``#J`0`1XPH```H(.P'C`S"4YP,`4^,)``"*`#"@XP@K`>,",(3GH"H%P'C`2"$YP-`H.$0 +M``#J`0`1XPH```H0.P'C`S"4YP,`4^,)``"*`#"@XQ`K`>,",(3GJ",50.`#````"@!`H.,$`*#A$`"]Z![_+^$``*#C'O\O MX>`RD.5L,)/E"``3XP(PH!,`,((5"P``&D``$^,!```:(``3XP(```H!,*#C M`#""Y00``.H0`!/C`S"@$P`P@A4`,*`#`#""!0``H.,>_R_A!$`MY>!"D.5L -M,)3E`0`3XP8```IR-0'CTS"4X0`P8^(`,(+E`#"@XP0PPN4$``#J`#"@XP`P +M,)3E`0`3XP8```IZ-0'CTS"4X0`P8^(`,(+E`#"@XP0PPN4$``#J`#"@XP`P M@N4$,,+E`3"@XP4PPN4``*#C$`"]Z![_+^$`,-#E``!3XP@```H!`%/A`P`` M&@@``.H,`(#B`0!3X04```H,,-#E``!3X_G__QH``%/B`0"@$Q[_+^$!`*#C -M'O\OX>`2D.6I/:#CLS"1X0`P@N4``*#C!`#"Y1[_+^$$0"WEX$*0Y04PTN4` -M`%/C!```"BHI`.,$-`'C`R"$YP``H.,(``#J`#"2Y0$<0^(J*`#C`@!1X14` -MX(,!,,.3!"0!DP(PA)<``*"3$`"]Z![_+^'@$I#E!#0!XP,PD><`,(+E``"@ +M'O\OX>`2D.5(.@+CLS"1X0`P@N4``*#C!`#"Y1[_+^$$0"WEX$*0Y04PTN4` +M`%/C!```"BHI`.,,-`'C`R"$YP``H.,(``#J`#"2Y0$<0^(J*`#C`@!1X14` +MX(,!,,.3#"0!DP(PA)<``*"3$`"]Z![_+^'@$I#E##0!XP,PD><`,(+E``"@ MXP0`PN4>_R_A!S"@XP`P@N4``*#C!`#"Y0$PH.,%,,+E'O\OX0``H.,``(+E M!`#"Y0$PH.,%,,+E'O\OX1!`+>D(T$WBX$*0Y0X`D^@`,(WE!`"@X?\_#^,/ -M,$#CU(0@+WH``#@XQ[_+^$``.#C'O\OX0`` -MH.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A<``MZ>!"D.4"8*#A8#4# +M,$#C3,4#XP_@H.$,\)3G``"@XPC0C>(0@+WH``#@XQ[_+^$``.#C'O\OX0`` +MH.,>_R_A``"@XQ[_+^$``*#C'O\OX0``H.,>_R_A<``MZ>!"D.4"8*#A;#4# MXP,0E.,!,(,3``!3XQ5`X!,*```:`%"2Y0(`5>,`0*"# M!4&$D`0PMI4$,(25`#``DP`P0),`():5!2&#EP!`H),$`*#A<`"]Z![_+^$` M`*#C'O\OX0``H.,>_R_A``"@XQ[_+^$>_R_A'O\OX?!'+>D(T$WB`%"@X1,0 -MH.,'((WB"#4#XP_@H.$#\)#G!S#=Y0,`4^,``%,3`:"@`P*@H!,`8*#C!I"@ -MX3QU`^,`@.#C"P``Z@4`H.$&$*#A!""@X0@PH.$/X*#A!_"5YP%`A.(!#%3C +MH.,'((WB%#4#XP_@H.$#\)#G!S#=Y0,`4^,``%,3`:"@`P*@H!,`8*#C!I"@ +MX4AU`^,`@.#C"P``Z@4`H.$&$*#A!""@X0@PH.$/X*#A!_"5YP%`A.(!#%3C M]O__&@%@AN(*`%;A`0``J@E`H.'Q___J"-"-XO"'O>@``*#C'O\OX01`+>7@ -M0I#E;#"4Y0$`$^,'```:`#"@XP(F`^,",,3G`R8#XP(PQ.<$)@/C`C#$YPL` -M`.IT-0'C`Q#4YW8U`>,#(-3G!2D.4%`*#A -M!@"3Z/\_#^,/,$#C/,4#XP_@H.$,\)7G`%"@X00`H.$`$`#C`!!`XP4@H.'^ -M___K``"@XW"`O>CP3RWIJ=]-X@*0H.$#8*#AX+*0Y6H]#^/_/T_C`$"@XRHN -MC>*S0(+A:#T/X_\_3^.S0(+A(@Z-X@00H.&`(*#C_O__ZR``C>($$*#A`BR@ -MX_[__^L`$)GEM'#9X0W`H.%_/440(WE'&"-Y1QPC>(`@`#C`(!`XPR@ -MC>($4*#A`P``Z@P`5>,&```*!4"*YP10A>('`*#A"!"@X?[__^L`0%#B]O__ -M&@Q`G>4$`*#A`!``XP`00./^___K``!0XSP``!H+`*#A`!"@XX`@H.,B/HWB -M_O__ZP$`4.-'`0`:!@"@X0`0H.,$(*#C_O__ZP8`H.$8%9_E!B"@X?[__^L` -MH*#C#+6?Y0"``.,`@$#C!@"@X0L0H.$&(*#A"C"@X?[__^LB+HWB"E""X`5P -MH.$`0*#C!@"@X0@0H.$&(*#A`3#7Y/[__^L!0(3B"`!4X_?__QH&`*#AO!2? -MY08@H.'^___K!@"@X0@0H.$&(*#A"##5Y?[__^L!0(3B`5"%XA``5./V__\: -M!@"@X8P4G^4&(*#A_O__ZQ"@BN*``%KCVO__&@8`H.'^___KM`#)X0``H.,4 -M`0#J!`"@X0`0`.,`$$#C_O__ZP``4.-!```:$`"=Y0``4.,*`0`*%$"=Y0`` -M5.,'`0`*&%"-X@40H.$0(*#C_O__ZP!PH.$$`*#A!1"@X0H@H./^___K<%#_ -MY@``5>/[```*=W#_YFI-#^/_3T_C`!"@XP`0C>4+`*#A`R"@XRK.C>($,(S@ -M_O__ZP6`H.$',(7@*BZ-XK1`DN$$`%/AZ0``R@L`H.$'$*#A!2"@X2(^C>+^ -M___K!@"@X0`0H.,$(*#C_O__ZP!`H..<4Y_E(GZ-XIBCG^4)``#J!@"@X040 -MH.$&(*#A!##7Y_[__^L&`*#A"A"@X08@H.'^___K`4"$X@@`5.'S__^Z!@"@ -MX?[__^L!`(#BM`#)X0``H./,``#J!`"@X0`0`.,`$$#C_O__ZP``4.,P```: -M(#"-X@`PC>4+`*#A`!"@XP$@H.$"/*#C_O__ZP``4..Z```*!@"@X0`0H.,$ -M(*#C_O__ZP!`H.,`4`#C`%!`XR!PC>(`H`#C`*!`XP"``.,`@$#C!@"@X040 -MH.$&(*#A!##7Y_[__^L/,`3B#P!3XP0``!H&`*#A"!"@X08@H.'^___K!@`` -MZ@$``*#CE0``Z@0`H.$`$`#C`!!`X_[__^L``%#C,```&A!`G>4` -M`%3CBP``"A1`G>4``%3CB```"FI-#^/_3T_C`!"@XP`0C>4+`*#A`R"@XRK. -MC>($,(S@_O__ZRHNC>*T0)+A%0!4XWD``-H+`*#A%A"@XP8@H.,B/HWB_O__ -MZP8`H.$`$*#C!""@X_[__^L`4*#CW'&?Y2).C>+8@9_E!@"@X0<0H.$&(*#A -M!3#4Y_[__^L&`*#A"!"@X08@H.'^___K`5"%X@8`5>/S__\:!@"@X?[__^NT -M`,GA``"@XUX``.H$`*#A`!``XP`00./^___K``!0XS```!H00)WE``!4XU0` -M``H40)WE``!4XU$```IJ30_C_T]/XP`0H.,`$(WE"P"@X0,@H.,JSHWB!#", -MX/[__^LJ+HWBM$"2X0D`5.-"``#:"P"@X0H0H.,$(*#C(CZ-XO[__^L&`*#A -M`!"@XP0@H./^___K`%"@XP!QG^4B3HWB_("?Y08`H.$'$*#A!B"@X04PU.?^ -M___K!@"@X0@0H.$&(*#A_O__ZP%0A>($`%7C\___&@8`H.'^___KM`#)X0`` -MH.,G``#J!`"@X0`0`.,`$$#C_O__ZP``4.,4```::$T/X_]/3^,+`*#A*CZ- -MX@00@^#^___K"P"@X?[__^LJSHWBM$"$``*#C`@``Z@T`X.,```#J%0#@XZG?C>+PC[WH%````!P` -M```P````-````$````!,````\$$MZ0C03>(#@*#AX'*0Y0)@H.$`,*#C!#"- -MY0`0DN4-(*#A?SW"XS\PP^,(0)/E!%"1X@10U3``0*`S``!4XP,``!H$`(WB -M!""@X_[__^L"``#J!`"-X@00H./^___K8#4#XP,PE^4!`%/C"```&IPT -M`^,#,)?G``!3XQH```H'`*#A"1"@XS/_+^$`0*#C%@``Z@(`4^,(```:G#0# -MXP,PE^<``%/C#P``"@<`H.$*$*#C,_\OX0!`H.,+``#J`P!3XP@``!J<-`/C -M`S"7YP``4^,$```*!P"@X0P0H.,S_R_A`$"@XP```.H`0*#C!`"@X0C0C>+P -M@;WH\$4MZ:G?3>+@HI#E`$"@XPQ`C>400(WE%$"-Y6HM#^/_+T_C*AZ-XK)` -M@>$<,(WE'&"-X@!P`.,`<$#C#("-X@,``.H,`%3C!@``"@10B.<$0(3B!@"@ -MX0<0H.'^___K`%!0XO;__QH,0)WE!`"@X0`0`.,`$$#C_O__ZP``4.,O```: -M$`"=Y0``4..]```*%%"=Y0``5>.Z```*&!"-XA`@H./^___K`("@X04`H.'^ -M___KH'"PX0!@H!,B3HT2M```"@0``.H"`%7E`1!5Y?[__^L&`,3G`6"&X@)0 -MA>('`%;A]___.GA0[^9J30_C_T]/XP`0H.,`$(WE"@"@X0,@H.,JSHWB!#", -MX/[__^L',(7@*AZ-XK1`D>$$`%/AG```B@H`H.$%$*#A=R#_YB(^C>+^___K -M``!0XY4```J2``#J!`"@X0`0`.,`$$#C_O__ZP``4.,B```:$`"=Y0``4..' -M```*%%"=Y0``5>.$```*&!"-XA`@H./^___K`("@X04`H.'^___KH'"PX0!@ -MH!,@0(T2?@``"@0``.H"`%7E`1!5Y?[__^L&`,3G`6"&X@)0A>('`%;A]___ -M.B`PC>(`,(WE"@"@X0$0H.-X(._F=S#_YO[__^L``%#C;```"FD``.H$`*#A -M`!``XP`00./^___K``!0XRP``!H04)WE``!5XUX```H40)WE``!4XUL```H% -M`*#A_O__ZZ!PL.%;```*!@!7XP!@H),B3HV25P``B@0``.H"`%7E`1!5Y?[_ -M_^L&`,3G`6"&X@)0A>('`%;A]___.FI-#^/_3T_C`!"@XP`0C>4*`*#A`R"@ -MXRK.C>($,(S@_O__ZQ8PA^(J'HWBM$"1X00`4^%```"*"@"@X180H.-W(/_F -M(CZ-XO[__^L``%#C.0``"C8``.H$`*#A`!``XP`00./^___K``!0XRH``!H0 -M0)WE``!4XRL```H44)WE``!5XR@```H$`*#A_O__ZZ!PL.$H```*!%"@X0!@ -MH.,B3HWB``#5Y0$0U>7^___K!@#$YP%@AN("4(7B!@!7X??__XIJ30_C_T]/ -MXP`0H.,`$(WE"@"@X0,@H.,JSHWB!#",X/[__^L*,(?B*AZ-XK1`D>$$`%/A -M#P``B@H`H.$*$*#C=R#_YB(^C>+^___K``!0XP@```H%``#J)`"?Y?[__^L` -M`*#C!```ZA4`X.,"``#J``"@XP```.H-`.#CJ=^-XO"%O>C$````\$`MZ130 -M3>("0*#AX&*0Y0`P`.,`,$#C`%#3Y0``5>,(```:`U"@X0`P`.,`,$#C!0"@ -MX0`0D^40(*#C_O__ZP`PH.,/,,7EM##4X1``4^-8``"*`!"4Y0T@H.%_/<+C -M/S##XPA0D^400)'B!4#4,`!0H#,``%7C!0``&@T`H.$0(*#C_O__ZP``4.,% -M```*2```Z@T`H.$0$*#C_O__ZPU`X.-$``#J````XP``0.,-$*#A_O__ZP`` -M4.,`0*`#/0``"@8`H.$-$*#A_O__ZP!`4.(X```:````XP``0.,`$`#C`!!` -MXPD@H./^___K`0!0XP@``!K(4)_E$'#5Y9@T`^,#<,;G!@"@X?[__^L14-7E -M13(#XP-0QN<`4`#C`%!`XPUPH.$%`*#A#1"@X1`@H./^___K`#"@XP\PQ>4- -M`*#A`!``XP`00.,)(*#C_O__ZP$`4.,7```:!@"@X0$0H./^___KG#0#XP,P -MEN<``%/C`@``"@8`H.$'$*#C,_\OX3Q0G^68-`/C`R#6YQ`@Q>4`<*#C`W#& -MYP8`H.'^___K13(#XP,@UN<1(,7E`W#&YP```.H-0.#C!`"@X130C>+P@+WH -M`````!!`+>E4,@/C`S"0Y_\TP^/_,,/C`0A3XR8```I(,@/C`S#0YP``4^,D -M```*53(#XP,PT.#3+03C8B!!XY+!@>#)#8#B&`"`XB$3@^#^___K -M`4"@XP(``.H`0*#C````Z@%`H.,$`*#A$("]Z/!!+>D(T$WB`&"@X0)0H.$# -M0*#A`P"@X0`0`.,`$$#C!""@X_[__^L``%#C)P``"K0@U>$$($+B$$,(3BX(*6Y0$@0N(!`%+C`P``"@(`4N,`<*`3"```&@,``.H`<-/E,'!' -MXG=P[^8#``#J``#3Y0$0T^7^___K`'"@X0H`5^,0``"*2#(#XP,PV.<'`%/A -M#```"@``5^,"(*`31S(#$P,@R!(`,*#C!#`BY00`A.(`$`#C`!!`X_[__^L$,)WE`0!3 -MXQ,``(I%(@/C`C#%YP$@H.-(,@/C`R#%YP`P`.,`,$#C`#"3Y8@B`^,"()7G -M9!"@XY$"`>#3+03C8B!!XY(!@>#)#87B&`"`XB$3@^#^___K!P``Z@(`4^,% -M```:!0"@X?[__^L``%#C`""@$T@R`Q,#(,47``"@XPC0C>+P@;WH$$`MZ>`" -MD.4&`)/H_O__ZP``H.,0@+WH\$$MZ1#03>+@8I#E`$"2Y71P_^946.?G!#"2 -MY0PPC>4D3*#A<4!$X@X`5.,$\9^7Q0``Z@P5``#H%P``8!4``.@7``!\%0`` -MH!4``.@7``#H%P``Z!<``.@7``#H%P``Z!<``.@7``#H%P``X!4```(`5>,( -M```*!`!5XPL```H!`%7CL```&@8`H.$'$*#A.*```:`2"@XW`U`>,# -M(,;G#$"=Y60`5.-D0*`C<34!XP-`QN>!``#J#`!5XT<```H&``"*!@!5XQ0` -M``H)`%7C(@``"@4`5>-X```:"@``ZMT`5>-'```*`@``BA$`5>-R```:0``` -MZNX`5>-0```*_0!5XVT``!IC``#J5PV&XA``@.+@$(;B_O__ZV<``.H+0(WB -M!@"@X100H.,$(*#A"#4#XP_@H.$#\);G#W`'X@MPS>4&`*#A%!"@XP0@H.$$ -M-0/C#^"@X0/PEN=7``#J_O__ZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y5>- -MAN(@@(CB`'"@XZ]?A^*%48;@`$"8Y0```.H`0)3E!0"@X000H.'^___K``!0 -MX_G__PH!<(?B"("(XB``5^/Q__\:#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E -M_O__ZS<``.H&`*#A!A"@XPP@C>(0-0/C#^"@X0/PEN``#J#P!3XP8``!H&`*#A!Q"@XPL@C>(,-0/C#^"@ -MX0/PEN<5``#J!@"@X0<0H.,,((WB$#4#XP_@H.$#\);G!@"@X0<0H.,+((WB -M##4#XP_@H.$#\);G"```ZG=P[^8&`*#AQ1Z@XP<@H.'^___K!@"@X5@<`.,' -M(*#A_O__ZP``H.,0T(WB\(&]Z!!`+>G@0I#E`!#2Y445Q.4$`*#A_O__ZP$` -M4.,``.`3``"@`Q"`O>CP3RWI/-!-XN!2D.5@-0/C`S"5YP*0H.$!('+B`""@ -M,P``4^,",*`!`3""$P``4^,`0*`#'F"@`P4```J+``#J!@"@X?[__^L!0(3B -M90!4XP(```IL,)7E(@T3X_?__QH`(*#CMB#)X;0PV>$?`%/C?@``F@`0F>4- -M(*#A?SW"XS\PP^,(8)/E($"1X@9`U#``8*`S``!6XP4``!H,`(WB(""@X_[_ -M_^L``%#C!0``"FX``.H,`(WB(!"@X_[__^L50.#C;```ZO[__^L-(*#A?SW" -MXS\PP^,$()/E`2""X@0@@^6$0(7BA*"5Y0"PH.,L@(WB``.-Z`20H.$)`*#A -M"A"@X?[__^L!`%#C/```"@M`H.$,4(WB``#5Y;#Y_^L`<%#B$```N@$`]>6L -M^?_K`&!0X@P``+H!4(7B!V*&X01@R.<$`%3C`P``R@`PU>4Z`%/C!```&@%0 -MA>(!0(3B!@!4X^O__QI&``#J#2"@X7\]PN,_,,/C!""3Y0$@0N($((/E_O__ -MZQ5`X.,Z``#JH&"%XI`@E>4&`*#A-!"-X@P@0N+^___K``!0XP4```HT0)WE -M``!4XP20G14!,*`3MC#)$0\``!J0()7E!@"@X300C>(,($+B_O__ZP``4.,% -M```*-$"=Y0``5.,$D)T5`B"@$[8@R1$"```:`*":Y;W__^H$D)WE#2"@X7\] -MPN,_,,/C!""3Y0$@0N($((/E_O__Z[0PV>$A`%/C$0``F@``F>4@`(#B#2"@ -MX7\]PN,_,,/C"%"3Y0%`D.(%0-0P`%"@,P``5>,$```:!A")X@$@H./^___K -M``!0XP$```H50.#C````Z@!`H.,$`*#A/-"-XO"/O>@*4*#A``"=Y2`0BN(& -M(*#C_O__ZP$`4./5__\:N?__ZO!'+>D(T$WB`D"@X>!BD.6T4-+A``!5XXT` -M``H`,)+E``!3XXH```JVD-+A!7"@X04`H.'^___K`(!0X@M`X`.$```*`!"4 -MY0T@H.%_/<+C/S##XPB@D^4'4)'@"E#5,`"@H#,``%KC!0``&@@`H.$'(*#A -M_O__ZP``4.-X```:!@``Z@``5^,$```*"`"@X0<0H.'^___K#4#@XW,``.H( -M4*#A`#"8Y2(`4^,50."#;@``B@A0B.(&`%/C-@``"@0``(H"`%/C!P``"@,` -M4^-*```:&@``Z@<`4^,W```*'P!3XT4``!H^``#J!#"5Y0(`4^,(```*!`!3 -MXPL```H!`%/C/0``&@8`H.$`$)7E_O__ZP@`A>4X``#J!@"@X0`0E>7^___K -M"`"%Y3,``.H&`*#A`!"5Y?[__^L(`(7E+@``Z@0PE>4"`%/C"```"@0`4^,+ -M```*`0!3XR<``!H&`*#A`!"5Y0@@U>7^___K(@``Z@8`H.$`$)7EN"#5X?[_ -M_^L=``#J!@"@X0`0E>4(()7E_O__ZQ@``.H&`*#A`!#5Y00@U>4`,.#C/,4# -MXP_@H.$,\);G"`"%Y0\``.H`$-7E!"#5Y0@PE>4`,(WE!@"@X0`PX./5S:#C -M#^"@X0SPEN<%``#J!@"@X2@0H.,`(*#C!#4#XP_@H.$#\);G>9#OY@``6>,7 -M```:``"4Y0T@H.%_/<+C/S##XPA0D^4'0)#@!4#4,`!0H#,``%7C!T"@$0,` -M`!H($*#A!R"@X?[__^L`0*#A``!4XP8```H#``#J%4#@XP0`H.$(T(WB\(>] -MZ`U`X.,```#J`$"@XP@`H.$'$*#A_O__Z_7__^IP0"WI`T"@X>`"D.4`$)/E -M_O__ZP!0H.$$`*#A`!``XP`00.,%(*#A_O__ZP``H.-P@+WH\$+@ -M4I#E`V"@X0`PH.,(,(WEO##-X0`PC>6T,,WA#0"@X080AN(&(*#C_O__ZP`P -MEN4!`%/C*P``&@T`H.$($(WB!B"@X_[__^L!`%#C40``"@!`H.,-<*#A!H"@ -MXW20[^8$H*#A!`.%X"8,@.()`(#B#1"@X0@@H.'^___K`0!0XP\``!H$HZ#A -M"@"%X"8,@.(/`(#B%!"&XA`@H./^___K"J"%X":LBN((H(KB`4"@XP!`RN4$ -MD(G@"#H"XP.0Q>((4(7B`#"@XP`PQ>4!0*#C$@``Z@%`A.(0`%3CY?__&@T``.H# -M`%/C"0``&B8,A>((`(#B`!"@XP$KH./^___K`""@XP@Z`N,#(,7G`4"@XP(` -M`.H`0*#C````Z@%`H.,$`*#A$-"-XO"'O>@(2@+C!`#5YP`#A>`F#(#B"0"` -MX@T0H.$&(*#C_O__ZP0`U><``X7@)@R`X@\`@.(4$(;B$""@X_[__^L$,-7G -M`S.%X"8\@^((,(/B`2"@XP`@P^4$,-7G`C"#X',P[^8$,,7G$`!3X^#__QJL -M___J<$`MZ0)`H.'@8I#E;""6Y0$`$N,'```:0``2XP4``!H``*#CM`#$X;8P -MU.$".8/CMC#$X7"`O>@&4-3E``!5XP0```H$`%7C%0#@@P%019("``":<("] -MZ*@G`>,"4);G`1"%XG$0_^:V$,3A#"L!XP(@EN<&`%+C`O&?ES4``.I0(``` -M/"```/@@```\(```X"```/@@``#@(`````"@X[0`Q.$"&8'CMA#$X7"`O>A? -M+H7B"B""X@(AAN"T(-+AM"#$X0``4N,7```*!1*&X%]>A>(*4(7B!5&&X`,` -MH.%>'8'B+!"!X@0@E>7^___KMB#4X;8@Q.$(.P'C`S"6YP``4^,"*H(#MB#$ -M`0``H`-P@+T(`0!3XP``H!,!*8(#MB#$`0``H`-P@+WH``"@X[0`Q.$"&8'C -MMA#$X7"`O>@0,*#CM##$X0H;@>.V$,3A``"@XW"`O>@``*#CM`#$X0(9@>.V -M$,3A<("]Z!!`+>D``%/B!P``"@[`H..TP,+A`3"@X[8PPN$`$`#C`!!`XPP@ -MH.'^___K``"@XQ"`O>AP0"WI`E"@X>!"D.5L()3E`0`2XP(``!I``!+C`$#@ -M`P@```KH8)3EM&#%X0,`H.'L$(3B!B"@X?[__^L!,*#CMC#%X0!`H.,$`*#A -M<("]Z'!`+>G@4I#E`D"@X0$PH..R,,3@!`"@X0`0H.,&(*#C_O__ZVPPE>4! -M`!/C`P``&D``$^,!```:$``3XP0```H$`*#AX!"%X@8@H./^___K`P``Z@0` -MH.$`$*#C!B"@X_[__^L``*#C<("]Z/!!+>D@T$WB`F"@X0-PH.'@0I#E!`"- -MX@`0H.,<(*#C_O__Z[8PUN$""1/C#0``"@$@H.,,.P'C`R"$YP`PH..D)P'C -M`C"$Y_PG`>,",(3GH",",(3GI",",(3G&0`` -MZ@$)$^,,```*`""@XPP[`>,#((3G`3"@XZ`G`>,",(3GI",",(3G"@``Z@`PH.,,*P'C`C"$YZ`G`>,",(3GI",",(3G"%"-Y;0PUN$``%/C!@``"@4`4^,%,*"3#3"@@PPP -MC>4,,(/B!#"-Y1T``.H`,*#C##"-Y0$`6.,9```:J#,",(3G`T"@X1(``.H( -M,)WE`C&#XP@PC>4$4(WB#`"%X@<0H.$,()WE_O__ZP0`H.$%$*#A_O__ZP`` -M4.,$```:F#(#XP,PE.<``%/C7D#@`P````H`0*#C!`"@X2#0C>+P@;WH\$4;,,'EOC+1X3`P@^("`%/AS```B@0PD>4!`'/C -MR0``&K@@T>'_/P_C`P!2X<4``!HD,-'E`P!3X\(``(I>?8;B('"'X@Q0@>(% -M`*#A`!``XP`00./^___K``!0XT<``!H`(*#C##L!XP,@AN,(`H#@``"&X`0`@.(*$*#A"""5Y?[__^M?/HCB"C"# -MX@,QAN`(()7E!""#Y08`H.$'$*#A"""@X0`PH./^___K`$"@XWD``.J@-P'C -M`S"6YP(`4^-O```:;""6Y0@P`.,!,$#C`S`"X```4^-I```*5PV&XA``@.+@ -M$(;B_O__ZP"`4.)-```*!0"@X:P1G^7^___K``!0XP`PH!/H,(@5##L!XP,P -MEN<&`%/C!`!3$Z0W`0,#,)8'[#"(!1PPU.4!`%/C&P``&C!PA.*^(M3A$0Z( -MX@<0H.$0`%+C$""@(_[__^L%`*#A5!&?Y?[__^L``%#C"@``&O``B.(0$(?B -M"""@X_[__^L!#(CB&!"'X@@@H./^___K`""@X_DZ`>,#(,;G!@"@X0@0H.$! -M(*#C_O__ZR$``.HD`-3E!@V`X@`"AN`P@(3BOB+4X00`@.(($*#A$`!2XQ`@ -MH"/^___K)`#4Y6$/@.(``H;@!`"`XA`0B.(((*#C_O__ZR0`U.5B#X#B``*& -MX`0`@.(8$(CB"""@X_[__^L!,*#C^"H!XP(PQN,#,);G!@!3XP0`4Q,&```:I#]Z`!`H.,```#J7D#@XP4`H.$)$*#A_O__ -MZ_;__^H4`0``'`$``/!'+>D`D*#A`J"@X0-@H.&VAP0"WI`%"@X0)`H.'@8I#EMC#2 -MX0,ZH.$C.J#A"@!3XP/QGY<*``#J%"H``!0J```4*@``%"H``&0I``",*0`` -MW"D``!0J```4*@``7"D``!0J``!>0.#C+```Z@`PDN4``%/C`2"@$R8\H!,# -M(,87`$"@$P!`H`,F/*`#`T#&!R(``.H,.P'C`S"6YP``4^,=```*`#"2Y0`` -M4^,:```*`2"@XPP[`>,#((;G`$"@XZ0W`>,#0(;G_#@-P'C`T"& -MYP@[`>,#0(;G#@``ZFPPEN4!`!/C!0``"@8`H.'^___K!@"@X?[__^L&`*#A -M_O__ZP4`H.$`$)3EC/7_ZP!`H.$```#J`$"@XP0`H.%P@+WH\$\MZ1303>(` -M8*#A`D"@X0`PH.,,,(WE"#"-Y0%0H.$#`%'A`!"@$P$0H`.``%+C`3"@D0$P -M@8,``%/C!@``"@`@H./P.`'C`R#`YP(`4>$"0*`1%4#@`\8``.H``%+C`$"@ -M`\,```H$L*#A!`"@X?[__^L`<%#B"T#@`[T```H'`*#A!1"@X0L@H.'^___K -M`P!4XP!`X)/#``":!%"@X0<`H.$$$*#A#""-X@@PC>+^___K`0!0XP4``!H" -M(*#CH#((,(WB_O__ZP$` -M4.,%```:`B"@XZ`W`>,#((;G!R"@XP@[`>,#((;G#%"=Y0%01>(/`%7C!?&? -MES$``.I\*P``F"L```0L``#L*P``!"P```0L```$+```M"L```0L```$+``` -M!"P```0L```$+```!"P```0L``#0*P```""@X_PW`>,#((;G`2"@XPP[`>,# -M((;G&@``Z@$@H./\-P'C`R"&YP`@H.,,.P'C`R"&YQ,``.H"(*#C_#,#((;G!B"@XPP[`>,#((;G!0`` -MZ@4@H./\-P'C`R"&YP`@H.,,.P'C`R"&YPA0G>4!4$7B#P!5XP7QGY,#((;G!""@ -MXPP[`>,#((;G/0``Z@0@H..D-P'C`R"&YP8@H.,,.P'C`R"&YS8``.H%(*#C -MI#,#(,;G`#``XP`P0.,` -M,)/E!#"-Y2X``.H%@*#A!:"'X``PVN7=`%/C%@``&@(`A>(``(?@!!"-X@0@ -MH./^___K`0!0XP\``!H!0*#C"H"@X00@VN<"((+B`@Q2XP(LH*/T.@'C`R"& -MYV,-AN(Q`(#B"A"@X?[__^OP.`'C`T#&YP!`H.,5``#J"("'X`DPV.<",(/B -M`U"%X'50_^8%`%3AW/__B@!`H.,,``#J!`"@X130C>+PC[WH`""@X_`X`>,# -M(,;G`#``XP`P0.,`,)/E!#"-Y0!0H.,!D*#CS?__Z@<`H.$+$*#A_O__Z^[_ -M_^H00"WIX`*0Y0,0H.&T(-+A"___ZQ"`O>CP12WI#-!-X@)0H.$`,*#C!#"- -MY>!BD.6R,,WA`3#-Y6PPEN4!`!/C`@``&D``$^,``.`#60``"E`QEN46#H;B -M+1"@XP0@C>(,,$/B_O__ZP!P4.(0```*!$"=Y0``5.,-```*!T"@X0(`C>(% -M$(?B`B"@X_[__^L",/3E`2#4Y0(T@^'3H.#G8``3XP!PH`,!<*`3`8"@XP(` -M`.H`<*#C!Z"@X0>`H.$\,=;E`2!#XG(@[^;]`%+C`$"@@PP``(H&(*#A`$"@ -MXP0`H.%_,`/B!`!3X0-`H"$$`,7E/3'2Y0$@@N(!$$/B<1#OYOT`4>/U__^: -M`0!8XR,``!H&`*#A$Q"@XP$@C>((-0/C#^"@X0/PEN+PA;WH -M<$`MZ2#03>+@8I#E`$"2Y03@TN4-P*#A,#&?Y0\`D^@'`*SH`##,Y0$`=.,P -M```*I$*@X<4Z!>-\.D#CDR2#X*,SH.%N`%/C!5"@`RD```H/``"*-P!3XP)0 -MH`,E```*!0``B@H`4^,`4*`#(0``"A0`4^,>```:%0``ZCP`4^,#4*`#&P`` -M"EH`4^,8```:$0``ZO``4^,(4*`#%0``"@4``(IX`%/C!E"@`Q$```JT`%/C -M#@``&@D``.I:#U/C"5"@`PL```H>#E/C"```&@4``.H!4*#C!@``Z@10H.,$ -M``#J!U"@XP(``.H*4*#C````Z@M0H.,`0*#C#0"@X1`0C>(`P.#C!##0YP4` -M4^$$P,$7`@``&@0PP><``%[C`@``"@%`A.(-`%3C]?__&@8`H.$0$(WB_O__ -MZP$`4.,``*`#``#@$R#0C>)P@+WH!````/!%+>DLT$WB`E"@X0-@H.'@0I#E -M!`"@X?[__^L``%#C2```"J`U`^,#,)3G``!3XT0```JT@-7A(`!8XP9`X(-# -M``"*;#"4Y1``$^,]```:"#L!XP.@E.>V,-7A``!3XSH```H``%CC.```"B`` -M6.,@@*`C!%"-X@4`H.$`$*#C)""@X_[__^LH<(WB)(`GY00`A>(&$*#A"""@ -MX?[__^N$8(3BA#"4Y7@PA.4$<(?B!@"@X7@0E.7^___K`0!0XQ@```IX4)3E -M!0"@X2PPD.1X,(3E!Q"@X00@G>7^___K`0!0X_'__QHH()7E!#"=Y0,`4N'M -M__\:;#"4Y2``$^,#```*>""5Y3@QE.4#`%+AYO__&@0`H.%X$)7E_O__ZP`` -M4.,'```*!`"@X0H0H.'^___K!`"@X000C>+^___K``!0XP$``!H`0.#C```` -MZ@!`H.,$`*#A+-"-XO"%O>CP0"WI#-!-X@)@H.'@0I#E`#"@XP0PC>5L,)3E -M00`3XT\```I0,93E%@Z$XBT0H.,$((WB##!#XO[__^L``%#C`'"@`P(```H$ -M4)WE`'!5X@%PH!-/7X3B!0"@X?[__^L!`%#C#0``&@$`5^,%```:!@"@X1`0 -MH.,`(`#C`"!`X_[__^L[``#J!@"@X1`0H.,`(`#C`"!`X_[__^LU``#J!0"@ -MX?[__^L!`%#C#0``&@$`5^,%```:!@"@X1`0H.,`(`#C`"!`X_[__^LI``#J -M!@"@X1`0H.,`(`#C`"!`X_[__^LC``#J)#&4Y0X`4^,-``":`0!7XP4``!H& -M`*#A$!"@XP`@`.,`($#C_O__ZQ@``.H&`*#A$!"@XP`@`.,`($#C_O__ZQ(` -M`.H!`%?C!0``&@8`H.$0$*#C`"``XP`@0./^___K"@``Z@8`H.$0$*#C`"`` -MXP`@0./^___K!```Z@(`H.$0$*#C`"``XP`@0./^___K``"@XPS0C>+P@+WH -M^$\MZ0-PH.'@0I#ECC^@X[0PPN$'`*#A`!"@XP,@H.'^___K0#L$XTPP0.,` -M,(?E9#"@XRPPQ^4M,,?E+C#'Y0(,0(3B)@!5X^O__QH3/J#CLV"'X3)AQ^4/,*#C-#*'Y3\PH.,/,,?E``"@ -MX_B/O>AP0"WI`E"@X>!"D.5L,)3E`0`3XPH```HD`93E_O__ZZ`V".,!,$#C -MDP`#X``PA>4!,*#CM##%X20QE.4&,,7E"0``ZI8'U.7^___KH#8(XP$P0..3 -M``/@`#"%Y0$PH..T,,7AEC?4Y08PQ>4``*#C<("]Z/!/+>G%WTWB`K"@X0-0 -MH.$`,*#C]#*-Y0(LC>*R.\+A%3L(X_\_3^.^/\+A`3"@XP,LC>*P,,+A`PR- -MX@(`@.(@$(OB!B"@X_[__^L48(7B.#.=Y08`4^$+``":,4Z-XA0@H..T(63A -M!0"@X000H.$$(*#C_O__ZP0`A>($$(3B$""@X_[__^L&4*#A*`"+XO[__^L` -M`%#C(```"AL["./_/T_C`BR-XKX_PN$!,*#C`RR-XK8PPN&X`X,YWE!`!3X1```)HQ;HWBM'%FX01PH.,%`*#A!A"@ -MX0<@H.'^___K!P"%X`@0AN('(*#A_O__ZP@`A>(L$(OB`SR-XK0@T^'^___K -M````Z@5`H.&@((OB"""-Y9`PF^4"`*#A+1"@X[TOC>(,,$/B_O__ZP!@4.(4 -M```*]%*=Y0``5>,1```*!E"@X2L.C>("`(#B!1"&X@(@H./^___K`C#UY0$@ -MU>4"-(/ATR#@YR0@C>5@`!/C`#"@`P$PH!,4,(WE`2"@XQ`@C>4#``#J`#"@ -MXQ0PC>4D,(WE$#"-Y0$["./_/T_C`BR-XKX_PN%\4(OB!0"@X?[__^L!`%#C -M#@``&A`PG>4!`%/C!0``&@,,C>(0$*#C`"``XP`@0./^___K.```Z@,,C>(0 -M$*#C`"``XP`@0./^___K,@``Z@4`H.'^___K`0!0XPX``!H0()WE`0!2XP4` -M`!H##(WB$!"@XP`@`.,`($#C_O__ZR4``.H##(WB$!"@XP`@`.,`($#C_O__ -MZQ\``.ID,)OE#@!3XPX``)H0,)WE`0!3XP4``!H##(WB$!"@XP`@`.,`($#C -M_O__ZQ,``.H##(WB$!"@XP`@`.,`($#C_O__ZPT``.H0()WE`0!2XP4``!H# -M#(WB$!"@XP`@`.,`($#C_O__ZP0``.H##(WB$!"@XP`@`.,`($#C_O__ZQ1@ -MA.(X,YWE!@!3X0L``)HQ7HWB%""@X[0A9>$$`*#A!1"@X00@H./^___K!`"$ -MX@00A>(0(*#C_O__ZP9`H.$'.PCC_S]/XP(LC>*^/\+AE#"+X@PPC>4#`*#A -M_O__ZP`0H.&^#XWB`@"`X@(@H./^___K`BR-XKH_TN$#`!/C%0``"@$`$^,# -M,*`3`#.-%0$PH`,`,XT%")"$XC@SG>4)`%/A#```FC%>C>(((*#CM"%EX01@ -MH.,$`*#A!1"@X08@H.'^___K!@"$X`80A>`&(*#A_O__ZP```.H$D*#A9#"; -MY0``4^,!,*`#9#"+!04["./_/T_C`BR-XKX_PN%D`)OE_O__ZZ`V".,!,$#C -MDP`#X``SC>4!,*#C`RR-XK0PPN%D,)OE!C/-Y0Q0B>(X,YWE!0!3X0L``)HQ -M3HWB#""@X[0A9.$)`*#A!!"@X00@H./^___K!`")X@00A.(((*#C_O__ZP60 -MH.$K.PCC_S]/XP(LC>*^/\+AND_2X1``%.,".Z`3`RR-$K8PPA$".:`#`RR- -M`K8PP@$`,*#C`RR-XK0PPN$(4(GB.#.=Y04`4^$1``":,4Z-X@@@H..T(63A -M!&"@XPD`H.$$$*#A!B"@X?[__^L&`(G@"!"$X@8@H.'^___K!0"@X2P0B^(# -M/(WBM"#3X?[__^L%D*#AK8^-X@@`H.%`$*#C`"``XP`@0./^___K?"#;Y0`` -M4N,`<*`#(P``"JU/C>(`0(3@"U"@X0!PH.-`@(CB`#``XP`P0.,8,(WE`#`` -MXP-@H.$`8$#C`*``XP"@0.,4&D*#A?V`"X@<`5N$&<*`A -M"!!DX*8PH.$!`!+C"2"@`0L@H!$`((WE!`"@X0H@H.'^___K?2#5Y0%0A>(` -M`%+C`$"$$.[__QH4!`%+C+P``&@(LC>*R.]+A`@D3XPP` -M``HD,)WE``!3XP0```H.<0#C%""=Y0``4N-+?Z`3(@``ZA0PG>4``%/CD'"@ -M$X)PH`,=``#J@``3XPH```HD()WE``!2XP,```H4,)WE``!3XQ0``!H/``#J -M%""=Y0``4N,.```:"0``ZB0PG>4``%/C`P``"A0@G>4``%+C"0``&@0``.H4 -M,)WE``!3XP,``!I!<*#C!```ZH=PH.,"``#J2'"@XP```.J6<*#CAW"@X2$[ -M"./_/T_C`BR-XKX_PN$`,*#C!3/-Y00SS>4@,0KC!S!`XY,'`^``,XWE#%") -MXC@SG>4%`%/A"P``FC%.C>(,(*#CM"%DX0D`H.$$$*#A!""@X_[__^L$`(GB -M!!"$X@@@H./^___K!9"@X0`PH.,"+(WBL#O"X;PZPN&0$)OE2S^-X@`PC>4K -M/HWB!#"-Y0P`G>4L((WBJS^-XO[__^L"/(WBL$O3X0``5.-A```*BT^-X@0` -MH.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@#`(3H`BR-XK!+TN$``%3C$``` -M"B-NC>(#8(;B`$"@XP!P`.,`<$#C2X^-X@10H.$&`*#A!Q"@X04@V.?^___K -M`&"&X`%0A>("/(WBL$O3X04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_ -M/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WBM`##X0A0@.(%8(G@.".=Y08` -M4N$0``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B!2"@ -MX?[__^L(`(GBBQ^-X@,\C>*T(-/A_O__ZP:0H.&_#XWB`!"@XQ0@H./^___K -M!3P(X_\_3^,"+(WBOC_"X;!;TN$#/(WBM%##X0A0A>(%8(G@.".=Y08`4N$0 -M``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B!2"@X?[_ -M_^L(`(GB2Q^-X@,\C>*T(-/A_O__ZP:0H.$"+(WBO$K2X0``5.-A```*BT^- -MX@0`H.$`$*#C@""@X_[__^L`,`#C`#!`XP,`D^@#`(3H`CR-XKQ*T^$``%3C -M$```"B-NC>(#8(;B`$"@XP!P`.,`<$#C+("-X@10H.$&`*#A!Q"@X04@V.?^ -M___K`&"&X`%0A>("+(WBO$K2X04`5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\ -M"./_/T_C`BR-XKX_PN&+#XWB_O__ZW``_^8#/(WBM`##X0A0@.(%8(G@.".= -MY08`4N$0``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B -M!2"@X?[__^L(`(GBBQ^-X@,\C>*T(-/A_O__ZP:0H.&_#XWB`!"@XQ0@H./^ -M___K!3P(X_\_3^,"+(WBOC_"X;Q:TN$#/(WBM%##X0A0A>(%8(G@.".=Y08` -M4N$0``":,4Z-XK119.$$4*#C"0"@X000H.$%(*#A_O__ZP4`B>`($(3B!2"@ -MX?[__^L(`(GB+!"-X@,\C>*T(-/A_O__ZP:0H.$`,*#CK#*-Y9"`F^4,@$CB -M`P!8X0`PH-,!,*##"""=Y0``4N,``%@3.P``V@``4^,Y```*`$"@XZNOC>(% -M/`CC_S]/XPPPC>6_+XWB""""XA`@C>4$4*#A%+"-Y0BPH.$(@)WE!7"@X05@ -MB.`&`*#A"A"@X?[__^L``%#C'P``"JQ"G>4"`%3C'```F@PPG>4"+(WBOC_" -MX;PZTN$#+(WBM##"X0@P@^((,(WE`T")X#@SG>4$`%/A$```F@@@G>4"/(WB -MO"_#X0D`H.&_'XWB!""@X_[__^L$`(GB$!"=Y00@H./^___K"`")X@80H.$# -M/(WBM"#3X?[__^L$D*#A!W"(X`$PU^4",(/B`U"%X`4`6^'2___*%+"=Y0$\ -M"./_/T_C`BR-XKX_PN%+,*#C`S/-Y5`PF^4!,\WEC##;Y0`SS>5C,.#C`C/- -MY0A@B>(X,YWE!@!3X0P``)HQ3HWB"""@X[0A9.$$4*#C"0"@X000H.$%(*#A -M_O__ZP4`B>`%$(3@!2"@X?[__^L&D*#A"0"@X<7?C>+PC[WH\$\MZ1S03>(4 -M$(WE#""-Y1`PC>7@DI#EM'#2X0=P@^"D,@/C`S#9YP``4^,$```*8#4#XP,P -MF><``%/C%4#@$S8``!K^___K#2"@X7\]PN,_,,/C!""3Y0$@@N($((/EA(") -MXH1`F>5YOHGB#+"+XA!@G>7_H@#C"`"@X000H.'^___K`0!0XQ8```H',&;@ -M"@!3X09`X-,3``#:!%"@X2@PE.4``%/C`$"4!?'__PH+`*#A9!"5Y?[__^L! -M`%#C!@``&@!PC>4)`*#A%!"=Y04@H.$&,*#AU?S_ZP!@H.$`0)3EX___Z@!` -MH.,-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K$#"=Y09@8^`,()WEM&#" -MX0`PH..V,,+A!`"@X1S0C>+PC[WH<$`MZ>!2D.4`0%/B#P``"K`PU.$``%/C -M`P``"@$`4^->0.`3#```&@0``.H%`*#A_O__ZP``4.,$```*!0``Z@4`H.'^ -M___K``!0XP$``!H`0.#C````Z@!`H.,$`*#A<("]Z/!'+>D"8*#AX$*0Y00` -MH.'^___K``!0XP0``!KP`)_E\!"?Y?[__^L`0.#C-@``ZJ`U`^,#,)3G``!3 -MXR\```JP,-;A`0!3XP0```K(`)_EP!"?Y?[__^L50.#C*@``Z@@[`>,#H)3G -MA'"$XH0PE.5X,(3E`F"&X@:`H.,'`*#A>!"4Y?[__^L!`%#C!0``&@0`H.$& -M$*#A_O__ZP``4.,6```*%P``ZGA0E.4%`*#A(#"0Y'@PA.4&$*#A"""@X?[_ -M_^L!`%#CZ___&@0`H.%X$)7E_O__ZP``4.,'```*!`"@X0H0H.'^___K!`"@ -MX080H.'^___K``!0XP$``!H`0.#C````Z@!`H.,$`*#A\(>]Z/0!```4```` -M$`(``#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@XQ`@H./^___K`3"@X[`PS>$" -M`(WB`!"@XP8@H./^___KF#4#XP,`E><5&PCC#2"@X0`PH./^___K%-"-XC"` -MO>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0(*#C_O__ZP$PH..P,,WA`@"- -MXN`0A>(&(*#C_O__ZY@U`^,#`)7G%1L(XPT@H.$`,*#C_O__ZQ30C>(P@+WH -M,$`MZ1303>(`4*#A#4"@X0T`H.$`$*#C$""@X_[__^N8-0/C`P"5YQD;".,- -M(*#A`#"@X_[__^L4T(WB,("]Z/!/+>DLT$WB`F"@X0-0H.'@0I#E!`"@X?[_ -M_^L``%#C@@``"F`U`^,#,)3G``!3XWX``!J@-0/C`S"4YP``4^-Z```*=34# -MXP,PU.<``%/C=@``"@PUU.4!`%/C`P``&@0`H.'^___K`$"@XW```.IL,)3E -M(@T3XP,```H$`*#A_O__ZP!`H.-I``#JM##6X4\/4^,?```:MC#6X0(`$^-B -M```*`6#5Y2``5N,@8*"C!'"-X@<`H.$`$*#C)""@X_[__^L$`(?B%!"%X@8@ -MH.'^___K!&"-Y?[__^L-,*#A?UW#XS]0Q>,$,)7E`3"#X@0PA>4$`*#A!Q"@ -MX?[__^L`0*#A!#"5Y0$P0^($,(7E_O__ZT(``.H+`%/C/0``F@4`H.$4$9_E -M#""@X_[__^L!`%#C-P``&K1PUN$,<$?B#&"%X@0`C>(`$*#C)""@X_[__^OH -M@)_E`Z"-X@*0C>((L(WB&0``Z@8`H.$($*#A"B"@X?[__^L#4-WE4P!5XQ0` -M`!H!8(;B`7!'XL=?Q^$&`*#A"!"@X0D@H.'^___K`6"&X@%01>("(-WE`@!5 -MX0,``+H$((WE"P"@X080H.'^___K`G#=Y0=@AN`%<&?@``!7X^/__\K^___K -M#3"@X7]=P^,_4,7C!#"5Y0$P@^($,(7E!`"@X000C>+^___K`$"@X00PE>4! -M,$/B!#"%Y?[__^L"``#J!`"@X?[__^L`0*#A``!4XP!`H!,````:`$#@XP0` -MH.$LT(WB\(^]Z"0````X`@``\$\MZ5G?3>(`L*#A$!"-Y0*`H.$4,(WEX)*0 -MY;1@TN$&H*#A!@"@X?[__^L`4%#B"T#@`W\!``H`$)CE#0"@X7\]P.,_,,/C -M"'"3Y09`D>`'0-0P`'"@,P``5^,%```:!0"@X08@H.'^___K``!0XPH```H$ -M``#J``!6XP<```H%`*#A!A"@X?[__^L%`*#A"A"@X?[__^L-0.#C90$`ZK8@ -MV.%F-PCC`P!2X0`PH!,!,*`#"`!6XP`PH-,``%/C%@``"@`P`.,`,$#C-#"3 -MY3PPC>4`,-7EW0!3XU$!`!H"`(7B/!"-X@0@H./^___K`0!0XTL!`!H"#%;C -M`FR@HQ4-B>('`(#B!1"@X08@H.'^___K2&>)Y0!`H.-"`0#J"P!6XP,``,H` -M`%;C`$"@PPT``,H5``#J!0"@X0`5G^4,(*#C_O__ZP$`4./U__\:"P"@X1`0 -MG>4((*#A!3"@X13__^L`0*#A+P$`Z@0PU>=A($/B(`(`#C`"!`XP,`DN@#(*#A!`""Y+`0PN'P+@_C_R]/XP40 -MH.,6#HWBLA"`X0L`H.$"'`CC3""-XO[__^L%`*#A`!``XP`00.,#(*#C_O__ -MZ[0``.H```#C``!`X_[__^M<,(WB`"``XP`@0.,#`)+H`R"@X00`@N0`$,+E -M\"X/X_\O3^,$$*#C%@Z-XK(0@.$+`*#A`AP(XTP@C>+^___K!0"@X0`0`.,` -M$$#C`R"@X_[__^L`,`#C`#!`XQ1`D^4"`%3CEP``&@-`H.$8`(/B_O__ZP$P -MH.,4,(3ED0``ZFPPF>4!`!/C!@``"@4`H.$`$`#C`!!`XW(U`>/3()GA_O__ -MZX<``.H%`*#A`!``XP`00.,#(*#C_O__ZX$``.H+`*#A$!"=Y2P@C>(4,)WE -MN?C_ZP``4.,`0*`3+""=!8,^#0,;,T0#DQ+#`,(OH`%#26(`!0"@X0`0`.,` -M$$#C!""@X?[__^MN``#J0!&;Y0`@T>4!,-'E`@#1Y0``C>4#`-'E!`"-Y00` -MT>4(`(WE!1#1Y0P0C>4%`*#A`!``XP`00./^___K7@``Z@$PH.-&-4%`*#A`!``XP`00.,#(*#C -M_O__ZTX``.H\0(WB!0"@X0`0`.,`$$#C!""@X?[__^L$`*#A`!``XP`00./^ -M___K``!0XP`PH`-(,(T%#@``"CP`C>(`$`#C`!!`X_[__^L``%#C`C"@`T@P -MC04&```*/`"-X@`0`.,`$$#C_O__ZP``4.,%,*`#2#"-!0`P`.,`,$#C2$"= -MY0!`P^4<0(WB!`"@X4@0C>($(*#C_O__ZPL`H.$0$)WE!""@X10PG>7@\O_K -M!0"@X0`0`.,`$$#C`R"@X_[__^L=``#J`#``XP`P0.,`,-/E``!3XP4```H" -M`%/C#4"@`P,```H%`%/C#D"@`P````H+0*#C!0"@X0`0`.,`$$#C!""@X?[_ -M_^L`,`#C`#!`XP```.,``$#C!!"@X0`@T^7^___K!```Z@4`H.$`$`#C`!!` -MXP,@H./^___K`)"8Y;1`V.$%`*#A_O__ZP%P@.)W@D````,````'!`+>D"4*#AX$*0Y00`H.'^___K``!0XP!`H`,?```*=34# -MXP,PU.<``%/C&@``"@`PE>4#`%/C`_&?EP,``.KH30``X$T``/A-``#P30`` -M%4#@XQ$``.H`4*#C!```Z@)0H.,"``#J!%"@XP```.H!4*#C!`"@X040H.'^ -M___K``!0XP0```H$`*#A!1"@X?[__^L`0*#C````Z@!`X.,$`*#A<("]Z/!' -M+>D`D*#A`:"@X0)PH.$#@*#A'`"@X_[__^L`4*#A`$"@X0``4.,`0*`#*0`` -M"A0`H./^___K`&!0X@0``!H%`*#A'!"@X_[__^L`0*#C(```Z@8`H.$`$*#C -M%""@X_[__^L!@,;E`'#&Y0$PH.,#,,;E`7!'XG=P[^8$`%?C$%"@@P`P`),` -M,$"3!W"#D#A0UY4$`(;B"A"@X04@H.'^___K%#"@X[`PQ.$$8(3E"#"$Y0`P -MH.,,,(3E$#"$Y10`A.+^___K2PV)X@00H.'^___K`$"@X00`H.'PA[WH$$`M -MZ04@0N)R(._F"`!2XP!`H(,`P`"3`,!`DP(@C)!`0-*5!""@X;S__^L0@+WH -M\$\MZ1303>(`8*#A`5"@X?P[".,#`%+AFP``"OX[".,#`%+A7D#@$Z8#`!JT -M`='A/P!0XY$``)H0,)'E``!3XXX```K^___K`("@X0"@H.$``%#C"V#@`XD` -M``H0$)7EM)'5X0T@H.%_/<+C/S##XPAPD^4)0)'@!T#4,`!PH#,``%?C!``` -M&@D@H.'^___K``!0XPD```H#``#J``!9XP8```H)$*#A_O__ZP@`H.&T$=7A -M_O__ZPU@X.-P``#J`#":Y0$P0^(#`%/C`_&?EP,``.HL4```Y%```/Q0```4 -M40``7F#@XTT``.H0$)KEX$*6Y0PPVN4'`%/C"```BMPPVN$!(*#C$C.@X=P` -M$^,A```:(``3XQL``!H"`!/C`0``&EY@X.,]``#J`B"@XZ`W`>,#((3G_Q`! -MX@$`4>,"```*`@!1X1,``!H&``#J!#"@XP@K`>,",(3G#"L!XP(PA.<`8*#C -M+0``Z@<@H.,(.P'C`R"$YP8@H.,,.P'C`R"$YP!@H.,E``#J!@"@X=KK_^L` -M8*#A(0``Z@!@H.,?``#JX`*6Y3`0BN*\(-KA2O;_ZP!@H.$9``#J!@"@X0H0 -MH.&T(=7AQ_3_ZP!@H.$3``#JX$*6Y0PPFN4!`%/C`P``"@(`4^->8.`3#``` -M&@0``.H$`*#A_O__ZP``4.,$```:!0``Z@0`H.'^___K``!0XP$```H`8*#C -M````Z@!@X.,``%;C$```&A``E>6TD=7A#2"@X7\]PN,_,,/C"'"3Y0E`D.`' -M0-0P`'"@,P``5^,#```:"A"@X0D@H.'^___K`)"@X0``6>,-8.`3"`"@X;01 -MU>'^___K````ZA5@X.,&0*#A#@,`ZN`BMN5U-0/C`S#2YP``4^,`0.`#"`,` -M"A`PD>4``%/C%4#@`P0#``JT`='A_O__ZP"PH.$`<*#A``!0XPM`X`/]`@`* -M$!"5Y;2!U>$-(*#A?SW"XS\PP^,(H)/E"$"1X`I`U#``H*`S``!:XP0``!H( -M(*#A_O__ZP``4.,)```*`P``Z@``6.,&```*"!"@X?[__^L+`*#AM!'5X?[_ -M_^L-0.#CY`(`Z@`PE^4!,$/B$@!3XP/QGY<2``#JW%(``/A2``#44P``U%(` -M`)Q;``"@5```U%(``-12``#44@``U%(``-12``#44@``U%(``-12``#44@`` -M.%0``"Q<``#,7```0%T``%Y`X..T`@#J`$"6Y00`H.'^___K!`"@X?[__^L` -M0*#AK0(`Z@!@EN5L,);E$0`3XS````H$,)?E`0!SXP,``!JX(-?A`3B#X@,` -M4N$I```*5PV&XA``@.($$(?B_O__ZP!`4.(+0.`#FP(`"A"`E^6\,-?AU#"$ -MY1,.A.(4$(?B$""@X_[__^L"#!CC`3"@$]PPA!4`,*`#W#"$!<`TEN4``%/C -MW#"$!0(+&.,`,*`#&#:$!0<```H!,*#C&#:$Y=PPA.5C#H3B`P"`X"00A^(: -M(*#C_O__Z\PTEN4``%/C&#:$!08`H.$$$*#A_O__ZP!`H.-X`@#J%4#@XW8" -M`.H`8);E;#"6Y1$`$^,2```*!#"7Y0$`<^,#```:N"#7X0$X@^(#`%+A"P`` -M"E<-AN(0`(#B!!"'XO[__^L`0%#B`$"@`V0"``H&`*#A!!"@X?[__^L`0*#C -M7P(`ZA5`X.-=`@#JM('5X0!@EN5L,);E$``3XQ(```J81P'C!`"&X`P0A^(" -M(*#C_O__Z[0PEN$!,$/BN(`,*`S`P!8XP$P@X,``%/C-`(` -M&@``6N,`0*`##0``"@4`6N,%H*"3#:"@@PR0BN()`*#A_O__ZP!`4.(G`@`* -M!`"@X0`0H.,<(*#C_O__ZPB@A.4`D(3E!("$Y0R0A.()`*#A,!"'X@@@E.7^ -M___K'##7Y0``4^,A```*`""@XPP[`>,#((;G`3"@XZ0G`>,",(;G6"""X@(P -MAN<(,)3E#0!3XP4PH`-8($("`C"&!U@@@@(",(8'J#,(`H#@``"&X`0`@.()$*#A"""4Y?[__^M? -M/HCB"C"#X@,QAN`(()3E!""#Y08`H.$,$(3B""#4Y0@PH.$<_O_K-P$`Z@`` -M4^-K```*;#"6Y1``$^-H```*'##7Y0$`4^/<`0`:``!0XQ$```HD`-?E!@V` -MX@`"AN"^(M?A!`"`XC`0A^(0`%+C$""@(_[__^L!(*#C_#^,M?A -M#0!3XP0@@@+\-P$#`R"&!S@``.H$`*#A,!>?Y?[__^L``%#C'@``&@(@H./\ -M-P'C`R"&YR0`U^4#B``*&X#!`A^*^(M?A!`"`X@00H.$0`%+C$""@(_[_ -M_^LD`-?E80^`X@`"AN`$`(#B$!"$X@@@H./^___K)`#7Y6(/@.(``H;@!`"` -MXA@0A.(((*#C_O__ZP$@H./Y.@'C`R#&YQ0``.H$`*#AI!:?Y?[__^L``%#C -M#```&@0@H./\-P'C`R"&YR0`U^4#B``*&X+XBU^$$`(#B,!"'XA``4N,0 -M(*`C_O__ZP(``.H`(*#C_#_/T/B`R"6YU@P0^(#((;G!@"@X3`0A^)R(._F)##7Y7_]_^L&`*#A_O__ -MZP"`4.)\`0`*`$"@X^A`B.7\-P'C`S"6Y^PPB.55`0#JH#```*%P"@X_[__^L`H%#B`P``&@D` -MH.$<$*#C_O__ZQ8``.H4`(GB_O__ZQ4PH..P,,GA!*")Y140,(GE[#"8Y08PRN4*`*#AX!"(X@8@H./^___K!P"*XA$>B.(0(*#C -M_O__ZTL-AN()$*#A_O__ZP!`H./H0(CE\0``Z@``4.,1```*)`#7Y08-@.(` -M`H;@OB+7X00`@.(P$(?B$`!2XQ`@H"/^___K`2"@X_PW`>,#((;GOC+7X0T` -M4^,$((("_#,#((;G)"#7Y08[H.,#((;G`2"@X[X_@^(#(,;G -MOS]#X@,@EN=8,$/B`R"&YP8`H.$P$(?B&>$Y0``4.,,```*#A"'X@8@H.'^___K -M!`"@X=T0H.,,((WB`3"@X_[__^L!(*#CN#(!XP,@Q.<`0*#C.@``ZA5`X.,X -M``#JM#'5X0!`EN5L()3E$``2XQ4```H.8$/B<`>4Y0``4.,#```*?!>4Y?[_ -M_^L`,*#C<#>$Y0``5N,`0*#3*```V@8`H.'^___K<`>$Y7QGA.4``%#C!``` -M"@X0A^(&(*#A_O__ZP!`H.,=``#J%4#@XQL``.JT,=7A`$"6Y6P@E.40`!+C -M%0``"@Y@0^)T!Y3E``!0XP,```J`%Y3E_O__ZP`PH.-T-X3E``!6XP!`H-,+ -M``#:!@"@X?[__^MT!X3E@&>$Y0``4.,$```*#A"'X@8@H.'^___K`$"@XP`` -M`.H50.#C``!4XQ```!H0`)7EM&'5X0T@H.%_/<+C/S##XPB`D^4&,)#@"##3 -M,`"`H#,``%CC`P``&@<0H.$&(*#A_O__ZP!@H.$``%;C#4#@$PL`H.&T$=7A -M_O__ZP0`H.$4T(WB\(^]Z`Q`A^($`*#A)!"?Y?[__^L!`'#B``"@,P`PH.,: -M_O_J`$"@X]S__^H50.#CVO__ZA0!```0`0``'`$``"0!````````$$`MZ0!` -M`.,`0$#C`#"@XQ0PA.5D`*#C_O__ZQ1`E.4"`%3C`0``&@P`G^7^___K!`"? -MY?[__^L0@+WH&````'!`+>D`0`#C`$!`XQA0A.(%`*#A`!"@XP`@`.,`($#C -M_O__ZP4`H.'^___K`C"@XQ0PA.5P@+WH0$(/`("$'@!@[%,`P-BG`("-6P!` -M5(D``!NW`("H$@$`-FX!`%$E`@!LW`*`^3<#V`(```@#``#(`P``T`,``-P# -M``#D`P``\`,````$```(!```.``<`!4```!L````3`$``%`````````````` +M0I#E;#"4Y0$`$^,'```:`#"@XPXF`^,",,3G#R8#XP(PQ.<0)@/C`C#$YPL` +M`.I\-0'C`Q#4YWXU`>,#(-3G>C4!X],`E.$/-@/C`P#$YPXV`^,#$,3G$#8# +MXP,@Q.@>_R_A<$`MZ0-`H.'@4I#E +M!0"@X08`D^C_/P_C#S!`XTC%`^,/X*#A#/"5YP!0H.$$`*#A`!``XP`00.,% +M(*#A_O__ZP``H.-P@+WH\$\MZ:G?3>("D*#A`V"@X>"RD.5J/0_C_S]/XP!` +MH.,J+HWBLT""X6@]#^/_/T_CLT""X2(.C>($$*#A@""@X_[__^L@`(WB!!"@ +MX0(LH./^___K`!"9Y;1PV>$-P*#A?SW,XS\PP^,(4)/E!T"1X`5`U#``4*`S +M``!5XP4``!H&`*#A!R"@X?[__^L``%#C<0$`&@8``.H``%?C!```"@8`H.$' +M$*#A_O__ZPT`X.-L`0#J`$"@XPQ`C>400(WE%$"-Y1Q@C>4<<(WB`(``XP"` +M0.,,H(WB!%"@X0,``.H,`%7C!@``"@5`BN<$4(7B!P"@X0@0H.'^___K`$!0 +MXO;__QH,0)WE!`"@X0`0`.,`$$#C_O__ZP``4.,\```:"P"@X0`0H..`(*#C +M(CZ-XO[__^L!`%#C1P$`&@8`H.$`$*#C!""@X_[__^L&`*#A&!6?Y08@H.'^ +M___K`*"@XPRUG^4`@`#C`(!`XP8`H.$+$*#A!B"@X0HPH.'^___K(BZ-X@I0 +M@N`%<*#A`$"@XP8`H.$($*#A!B"@X0$PU^3^___K`4"$X@@`5./W__\:!@"@ +MX;P4G^4&(*#A_O__ZP8`H.$($*#A!B"@X0@PU>7^___K`4"$X@%0A>(0`%3C +M]O__&@8`H.&,%)_E!B"@X?[__^L0H(KB@`!:X]K__QH&`*#A_O__Z[0`R>$` +M`*#C%`$`Z@0`H.$`$`#C`!!`X_[__^L``%#C00``&A``G>4``%#C"@$`"A1` +MG>4``%3C!P$`"AA0C>(%$*#A$""@X_[__^L`<*#A!`"@X040H.$*(*#C_O__ +MZW!0_^8``%7C^P``"G=P_^9J30_C_T]/XP`0H.,`$(WE"P"@X0,@H.,JSHWB +M!#",X/[__^L%@*#A!S"%X"HNC>*T0)+A!`!3X>D``,H+`*#A!Q"@X04@H.$B +M/HWB_O__ZP8`H.$`$*#C!""@X_[__^L`0*#CG%.?Y2)^C>*8HY_E"0``Z@8` +MH.$%$*#A!B"@X00PU^?^___K!@"@X0H0H.$&(*#A_O__ZP%`A.((`%3A\___ +MN@8`H.'^___K`0"`XK0`R>$``*#CS```Z@0`H.$`$`#C`!!`X_[__^L``%#C +M,```&B`PC>(`,(WE"P"@X0`0H.,!(*#A`CR@X_[__^L``%#CN@``"@8`H.$` +M$*#C!""@X_[__^L`0*#C`%``XP!00.,@<(WB`*``XP"@0.,`@`#C`(!`XP8` +MH.$%$*#A!B"@X00PU^?^___K#S`$X@\`4^,$```:!@"@X0@0H.$&(*#A_O__ +MZP8``.H',`3B!P!3XP,``!H&`*#A"A"@X08@H.'^___K`4"$X@(,5./H__\: +M!@"@X?[__^NT`,GA``"@XY4``.H$`*#A`!``XP`00./^___K``!0XS```!H0 +M0)WE``!4XXL```H40)WE``!4XX@```IJ30_C_T]/XP`0H.,`$(WE"P"@X0,@ +MH.,JSHWB!#",X/[__^LJ+HWBM$"2X14`5.-Y``#:"P"@X180H.,&(*#C(CZ- +MXO[__^L&`*#A`!"@XP0@H./^___K`%"@X]QQG^4B3HWBV(&?Y08`H.$'$*#A +M!B"@X04PU.?^___K!@"@X0@0H.$&(*#A_O__ZP%0A>(&`%7C\___&@8`H.'^ +M___KM`#)X0``H.->``#J!`"@X0`0`.,`$$#C_O__ZP``4.,P```:$$"=Y0`` +M5.-4```*%$"=Y0``5.-1```*:DT/X_]/3^,`$*#C`!"-Y0L`H.$#(*#C*LZ- +MX@0PC.#^___K*BZ-XK1`DN$)`%3C0@``V@L`H.$*$*#C!""@XR(^C>+^___K +M!@"@X0`0H.,$(*#C_O__ZP!0H.,`<9_E(DZ-XOR`G^4&`*#A!Q"@X08@H.$% +M,-3G_O__ZP8`H.$($*#A!B"@X?[__^L!4(7B!`!5X_/__QH&`*#A_O__Z[0` +MR>$``*#C)P``Z@0`H.$`$`#C`!!`X_[__^L``%#C%```&FA-#^/_3T_C"P"@ +MX2H^C>($$(/@_O__ZPL`H.'^___K*LZ-XK1`G.$`,&3@!@"@X0`0`.,`$$#C +M!B"@X?[__^L&`*#A_O__Z[0`R>$``*#C#```Z@8`H.$`$`#C`!!`XP8@H.'^ +M___K!@"@X?[__^NT`,GA``"@XP(``.H-`.#C````ZA4`X..IWXWB\(^]Z!0` +M```<````,````#0```!`````3````/!!+>D(T$WB`X"@X>!RD.4"8*#A`#"@ +MXP0PC>4`$)+E#2"@X7\]PN,_,,/C"$"3Y010D>($4-4P`$"@,P``5.,#```: +M!`"-X@0@H./^___K`@``Z@0`C>($$*#C_O__ZVPU`^,#,)?G`6!VX@!@H#,` +M`%/C`6"&$P``5N,50.`3)@``&@1`G>4``%3C`##8!00PC04$,)WE`0!3XP@` +M`!JH-`/C`S"7YP``4^,:```*!P"@X0D0H.,S_R_A`$"@XQ8``.H"`%/C"``` +M&J@T`^,#,)?G``!3XP\```H'`*#A"A"@XS/_+^$`0*#C"P``Z@,`4^,(```: +MJ#0#XP,PE^<``%/C!```"@<`H.$,$*#C,_\OX0!`H.,```#J`$"@XP0`H.$( +MT(WB\(&]Z/!%+>FIWTWBX**0Y0!`H.,,0(WE$$"-Y11`C>5J+0_C_R]/XRH> +MC>*R0('A'#"-Y1Q@C>(`<`#C`'!`XPR`C>(#``#J#`!4XP8```H$4(CG!$"$ +MX@8`H.$'$*#A_O__ZP!04.+V__\:#$"=Y00`H.$`$`#C`!!`X_[__^L``%#C +M+P``&A``G>4``%#CO0``"A10G>4``%7CN@``"A@0C>(0(*#C_O__ZP"`H.$% +M`*#A_O__ZZ!PL.$`8*`3(DZ-$K0```H$``#J`@!5Y0$05>7^___K!@#$YP%@ +MAN("4(7B!P!6X??__SIX4._F:DT/X_]/3^,`$*#C`!"-Y0H`H.$#(*#C*LZ- +MX@0PC.#^___K!S"%X"H>C>*T0)'A!`!3X9P``(H*`*#A!1"@X7<@_^8B/HWB +M_O__ZP``4..5```*D@``Z@0`H.$`$`#C`!!`X_[__^L``%#C(@``&A``G>4` +M`%#CAP``"A10G>4``%7CA```"A@0C>(0(*#C_O__ZP"`H.$%`*#A_O__ZZ!P +ML.$`8*`3($"-$GX```H$``#J`@!5Y0$05>7^___K!@#$YP%@AN("4(7B!P!6 +MX??__SH@,(WB`#"-Y0H`H.$!$*#C>"#OYG->```*%$"=Y0``5.-; +M```*!0"@X?[__^N@<+#A6P``"@8`5^,`8*"3(DZ-DE<``(H$``#J`@!5Y0$0 +M5>7^___K!@#$YP%@AN("4(7B!P!6X??__SIJ30_C_T]/XP`0H.,`$(WE"@"@ +MX0,@H.,JSHWB!#",X/[__^L6,(?B*AZ-XK1`D>$$`%/A0```B@H`H.$6$*#C +M=R#_YB(^C>+^___K``!0XSD```HV``#J!`"@X0`0`.,`$$#C_O__ZP``4.,J +M```:$$"=Y0``5.,K```*%%"=Y0``5>,H```*!`"@X?[__^N@<+#A*```"@10 +MH.$`8*#C(DZ-X@``U>4!$-7E_O__ZP8`Q.C>*T0)'A +M!`!3X0\``(H*`*#A"A"@XW<@_^8B/HWB_O__ZP``4.,(```*!0``ZB0`G^7^ +M___K``"@XP0``.H5`.#C`@``Z@``H.,```#J#0#@XZG?C>+PA;WHQ````/!` +M+>D4T$WB`D"@X>!BD.4`,`#C`#!`XP!0T^4``%7C"```&@-0H.$`,`#C`#!` +MXP4`H.$`$)/E$""@X_[__^L`,*#C#S#%Y;0PU.$0`%/C6```B@`0E.4-(*#A +M?SW"XS\PP^,(4)/E$$"1X@5`U#``4*`S``!5XP4``!H-`*#A$""@X_[__^L` +M`%#C!0``"D@``.H-`*#A$!"@X_[__^L-0.#C1```Z@```.,``$#C#1"@X?[_ +M_^L``%#C`$"@`ST```H&`*#A#1"@X?[__^L`0%#B.```&@```.,``$#C`!`` +MXP`00.,)(*#C_O__ZP$`4.,(```:R%"?Y1!PU>6D-`/C`W#&YP8`H.'^___K +M$5#5Y5$R`^,#4,;G`%``XP!00.,-<*#A!0"@X0T0H.$0(*#C_O__ZP`PH.,/ +M,,7E#0"@X0`0`.,`$$#C"2"@X_[__^L!`%#C%P``&@8`H.$!$*#C_O__ZZ@T +M`^,#,);G``!3XP(```H&`*#A!Q"@XS/_+^$\4)_EI#0#XP,@UN<0(,7E`'"@ +MXP-PQN<&`*#A_O__ZU$R`^,#(-;G$2#%Y0-PQN<```#J#4#@XP0`H.$4T(WB +M\("]Z``````00"WI8#(#XP,PD.?_-,/C_S##XP$(4^,F```*5#(#XP,PT.<` +M`%/C)```"F$R`^,#,-#G`0!3XP,``!HP-@/C`S"0YP$`4^,:```*;#"0Y0$` +M$^,9```:I#(#XP,PD.<"`%/C%0``"IPR`^,#,)#G``!3XQ$``!H`,`#C`#!` +MXP`PD^64(@/C`B"0YV00H..1`@'@TRT$XV(@0>.2P8'@R0V`XB0`@.(A$X/@ +M_O__ZP%`H.,"``#J`$"@XP```.H!0*#C!`"@X1"`O>CP02WI"-!-X@!@H.$" +M4*#A`T"@X0,`H.$`$`#C`!!`XP0@H./^___K``!0XR<```JT(-7A!"!"XG(@ +M_^:T(,7A!#"$XN""EN4!($+B`0!2XP,```H"`%+C`'"@$P@``!H#``#J`'#3 +MY3!P1^)W<._F`P``Z@``T^4!$-/E_O__ZP!PH.$*`%?C$```BE0R`^,#,-CG +M!P!3X0P```H``%?C`B"@$U,R`Q,#(,@7`0``&@@`H.'^___K5#(#XP-PR.<` +M<%?B`7"@$U(R`^,#<,CG!`"@X0`0`.,`$$#C!""@X_[__^L``%#C*0``"K0P +MU>$$,$/BM##%X>!2EN4(((WB`#"@XP0P(N4$`(3B`!``XP`00./^___K!#"= +MY0$`4^,3``"*42(#XP(PQ><`,`#C`#!`XP`PD^64(@/C +M`B"5YV00H..1`@'@TRT$XV(@0>.2`8'@R0V%XB0`@.(A$X/@_O__ZP<``.H" +M`%/C!0``&@4`H.'^___K``!0XP`@H!-4,@,3`R#%%P``H.,(T(WB\(&]Z!!` +M+>G@`I#E!@"3Z/[__^L``*#C$("]Z/!!+>D0T$WBX&*0Y0!`DN5T,+```*`0!5X[$``!H&`*#A!Q"@X7,@[^;^___KK```Z@8` +MH.$'$*#A;``#J`#"-Y08`H.$%$*#A!R"@X0`PX.-,Q0/C +M#^"@X0SPEN>2``#J``!5XP`@H`-X-0$#`R#&!XT```H!`%7CBP``&@$@H.-X +M-0'C`R#&YPQ`G>5D`%3C9$"@(WDU`>,#0,;G@@``Z@P`5>-(```*!@``B@8` +M5>,4```*"0!5XR(```H%`%7C>0``&@H``.K=`%7C2```"@(``(H1`%7C-N```:9```ZE<-AN(8`(#BX!"&XO[__^MH``#J +M"T"-X@8`H.$4$*#C!""@X10U`^,/X*#A`_"6YP]P!^(+<,WE!@"@X100H.,$ +M(*#A$#4#XP_@H.$#\);G6```ZO[__^L-(*#A?SW"XS\PP^,$()/E`2""X@0@ +M@^57C8;B*("(X@!PH..O7X?B`5"%XH51AN``0)CE````Z@!`E.4%`*#A!!"@ +MX?[__^L``%#C^?__"@%PA^((@(CB(`!7X_#__QH-(*#A?SW"XS\PP^,$()/E +M`2!"X@0@@^7^___K-P``Z@8`H.$&$*#C#""-XAPU`^,/X*#A`_"6YS```.HW +M)@/C`C#&YRT``.H``%/C`@``&@8`H.'^___K*```Z@$`4^,"```:!@"@X?[_ +M_^LC``#J`@!3XR$``!H&`*#A_O__ZQX``.H/`%/C!@``&@8`H.$'$*#C"R"- +MXA@U`^,/X*#A`_"6YQ4``.H&`*#A!Q"@XPP@C>(<-0/C#^"@X0/PEN<&`*#A +M!Q"@XPL@C>(8-0/C#^"@X0/PEN<(``#J=W#OY@8`H.'%'J#C!R"@X?[__^L& +M`*#A6!P`XP<@H.'^___K``"@XQ#0C>+P@;WH$$`MZ>!"D.4`$-+E217$Y00` +MH.'^___K`0!0XP``X!,``*`#$("]Z/!/+>D\T$WBX%*0Y6PU`^,#,)7G`I"@ +MX0$@8*`#!0``"HL``.H&`*#A +M_O__ZP%`A.)E`%3C`@``"FPPE>4B#1/C]___&@`@H..V(,GAM##9X1\`4^-^ +M``":`!"9Y0T@H.%_/<+C/S##XPA@D^4@0)'B!D#4,`!@H#,``%;C!0``&@P` +MC>(@(*#C_O__ZP``4.,%```*;@``Z@P`C>(@$*#C_O__ZQ5`X.-L``#J_O__ +MZPT@H.%_/<+C/S##XP0@D^4!((+B!""#Y81`A>*$H)7E`+"@XRR`C>(``XWH +M!)"@X0D`H.$*$*#A_O__ZP$`4.,\```*"T"@X0Q0C>(``-7EKOG_ZP!P4.(0 +M``"Z`0#UY:KY_^L`8%#B#```N@%0A>('8H;A!&#(YP0`5.,#``#*`##5Y3H` +M4^,$```:`5"%X@%`A.(&`%3CZ___&D8``.H-(*#A?SW"XS\PP^,$()/E`2!" +MX@0@@^7^___K%4#@XSH``.JD8(7BE""5Y08`H.$T$(WB#"!"XO[__^L``%#C +M!0``"C1`G>4``%3C!)"=%0$PH!.V,,D1#P``&I0@E>4&`*#A-!"-X@P@0N+^ +M___K``!0XP4```HT0)WE``!4XP20G14"(*`3MB#)$0(``!H`H)KEO?__Z@20 +MG>4-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___KM##9X2$`4^,1``":``"9 +MY2``@.(-(*#A?SW"XS\PP^,(4)/E`4"0X@5`U#``4*`S``!5XP0``!H&$(GB +M`2"@X_[__^L``%#C`0``"A5`X.,```#J`$"@XP0`H.$\T(WB\(^]Z`I0H.$` +M`)WE(!"*X@8@H./^___K`0!0X]7__QJY___J\$("0*#AX&*0Y;10 +MTN$``%7CC0``"@`PDN4``%/CB@``"K:0TN$%<*#A!0"@X?[__^L`@%#B"T#@ +M`X0```H`$)3E#2"@X7\]PN,_,,/C"*"3Y0=0D>`*4-4P`*"@,P``6N,%```: +M"`"@X0<@H.'^___K``!0XW@``!H&``#J``!7XP0```H(`*#A!Q"@X?[__^L- +M0.#C7^___K"`"%Y3@``.H&`*#A +M`!"5Y?[__^L(`(7E,P``Z@8`H.$`$)7E_O__ZP@`A>4N``#J!#"5Y0(`4^,( +M```*!`!3XPL```H!`%/C)P``&@8`H.$`$)7E""#5Y?[__^LB``#J!@"@X0`0 +ME>6X(-7A_O__ZQT``.H&`*#A`!"5Y0@@E>7^___K&```Z@8`H.$`$-7E!"#5 +MY0`PX.-(Q0/C#^"@X0SPEN<(`(7E#P``Z@`0U>4$(-7E"#"5Y0`PC>4&`*#A +M`##@XTS%`^,/X*#A#/"6YP4``.H&`*#A*!"@XP`@H.,0-0/C#^"@X0/PEN=Y +MD._F``!9XQ<``!H``)3E#2"@X7\]PN,_,,/C"%"3Y0=`D.`%0-0P`%"@,P`` +M5>,'0*`1`P``&@@0H.$'(*#A_O__ZP!`H.$``%3C!@``"@,``.H50.#C!`"@ +MX0C0C>+PA[WH#4#@XP```.H`0*#C"`"@X0<0H.'^___K]?__ZG!`+>D#0*#A +MX`*0Y0`0D^7^___K`%"@X00`H.$`$`#C`!!`XP4@H.'^___K``"@XW"`O>CP +M1RWI$-!-XN!2D.4#8*#A`#"@XP@PC>6\,,WA`#"-Y;0PS>$-`*#A!A"&X@8@ +MH./^___K`#"6Y0$`4^,K```:#0"@X0@0C>(&(*#C_O__ZP$`4.-1```*`$"@ +MXPUPH.$&@*#C=)#OY@2@H.$$`X7@)@R`XA4`@.(-$*#A"""@X?[__^L!`%#C +M#P``&@2CH.$*`(7@)@R`XAL`@.(4$(;B$""@X_[__^L*H(7@)JR*XA"@BN(! +M0*#C!$#*Y020B>`4.@+C`Y#%YS<``.H!0(3B$`!4X^+__QHV``#J`""@XQ0Z +M`N,#(,7G`4"@XRX``.H"`%/C'0``&@!`H.,-8*#A!G"@XP2`H.$$`X7@)@R` +MXA4`@.(-$*#A!R"@X?[__^L!`%#C#0``&@2#H.$(`(7@)@R`XA4`@.(`$*#C +M!B"@X_[__^L(4(7@)ER%XA!0A>(`,*#C!##%Y0%`H.,2``#J`4"$XA``5./E +M__\:#0``Z@,`4^,)```:)@R%XA0`@.(`$*#C`2N@X_[__^L`(*#C%#H"XP,@ +MQ>]Z!1*`N,$`-7G``.% +MX"8,@.(5`(#B#1"@X08@H./^___K!`#5YP`#A>`F#(#B&P"`XA00AN(0(*#C +M_O__ZP0PU><#,X7@)CR#XA`P@^(!(*#C!"##Y00PU><",(/@<0 +M`%/CX/__&JS__^IP0"WI`D"@X>!BD.5L();E`0`2XP<``!I``!+C!0``&@`` +MH..T`,3AMC#4X0(Y@^.V,,3A<("]Z`90U.4``%7C!```"@0`5>,5`."#`5!% +MD@(``)IP@+WHL".V +M$,3A<("]Z%\NA>(,((+B`B&&X+0@TN&T(,3A``!2XQ@```I>'X7B`Q"!X@$2 +MAN!?7H7B#%"%X@51AN`#`*#A!!"!X@0@E>7^___KMB#4X;8@Q.$0.P'C`S"6 +MYP``4^,"*H(#MB#$`0``H`-P@+T(`0!3XP``H!,!*8(#MB#$`0``H`-P@+WH +M``"@X[0`Q.$"&8'CMA#$X7"`O>@0,*#CM##$X0H;@>.V$,3A``"@XW"`O>@` +M`*#CM`#$X0(9@>.V$,3A<("]Z!!`+>D``%/B!P``"@[`H..TP,+A`3"@X[8P +MPN$`$`#C`!!`XPP@H.'^___K``"@XQ"`O>AP0"WI`E"@X>!"D.5L()3E`0`2 +MXP(``!I``!+C`$#@`P@```KH8)3EM&#%X0,`H.'L$(3B!B"@X?[__^L!,*#C +MMC#%X0!`H.,$`*#A<("]Z'!`+>G@4I#E`D"@X0$PH..R,,3@!`"@X0`0H.,& +M(*#C_O__ZVPPE>4!`!/C`P``&D``$^,!```:$``3XP0```H$`*#AX!"%X@8@ +MH./^___K`P``Z@0`H.$`$*#C!B"@X_[__^L``*#C<("]Z/!!+>D@T$WB`F"@ +MX0-PH.'@0I#E!`"-X@`0H.,<(*#C_O__Z[8PUN$""1/C#0``"@$@H.,4.P'C +M`R"$YP`PH..L)P'C`C"$YP0H`>,",(3GJ",",(3GK",",(3G&0``Z@$)$^,,```*`""@XQ0[`>,#((3G`3"@XZ@G`>,",(3G +MK",",(3G"@``Z@`PH.,4*P'C`C"$YZ@G`>," +M,(3GK",",(3G"%"-Y;0PUN$``%/C!@``"@4` +M4^,%,*"3#3"@@PPPC>4,,(/B!#"-Y1T``.H`,*#C##"-Y0$`6.,9```:L#," +M,(3G`T"@X1(``.H(,)WE`C&#XP@PC>4$4(WB#`"%X@<0H.$,()WE_O__ZP0` +MH.$%$*#A_O__ZP``4.,$```:I#(#XP,PE.<``%/C7D#@`P````H`0*#C!`"@ +MX2#0C>+P@;WH\$4;,,'EOC+1X3`P@^("`%/A +MSP``B@0PD>4!`'/CS```&K@@T>'_/P_C`P!2X<@``!HD,-'E`P!3X\4``(I> +M?8;B*'"'X@Q0@>(%`*#A`!``XP`00./^___K``!0XT<``!H`(*#C%#L!XP,@ +MAN,# +M(,;G!@"@X0@0H.$!(*#C_O__ZR0``.HD`-3E``*&X#"`A.*^(M3A!@N`X@P` +M@.(($*#A$`!2XQ`@H"/^___K)`#4Y0H`@.*HIP'C``**X```AN`$`(#B$!"( +MX@@@H./^___K)`#4Y0X`@.(``HK@``"&X`0`@.(8$(CB"""@X_[__^L!,*#C +M&RR@XP(PQN,#,);G!@!3XP0` +M4Q,&```:K#] +MZ`!`H.,```#J7D#@XP4`H.$)$*#A_O__Z_;__^H4`0``'`$``/!'+>D`D*#A +M`J"@X0-@H.&VAP0"WI`%"@X0)`H.'@8I#EMC#2X0,ZH.$C.J#A"@!3XP/QGY<*``#J +M+"H``"PJ```L*@``+"H``'PI``"D*0``]"D``"PJ```L*@``="D``"PJ``!> +M0.#C+```Z@`PDN4``%/C`2"@$PPV`A,#(,87`$"@$P!`H`,,-@(#`T#&!R(` +M`.H4.P'C`S"6YP``4^,=```*`#"2Y0``4^,:```*`2"@XQ0[`>,#((;G`$"@ +MXZPW`>,#0(;G!#@!XP-`AN>H-P'C`T"&YQ`[`>,#0(;G#@``ZFPPEN4!`!/C +M!0``"@8`H.'^___K!@"@X?[__^L&`*#A_O__ZP4`H.$`$)3EAO7_ZP!`H.$` +M``#J`$"@XP0`H.%P@+WH\$\MZ1303>(`8*#A`D"@X0`PH.,,,(WE"#"-Y0%0 +MH.$#`%'A`!"@$P$0H`.``%+C`3"@D0$P@8,``%/C!@``"@`@H./X.`'C`R#` +MYP(`4>$"0*`1%4#@`\8``.H``%+C`$"@`\,```H$L*#A!`"@X?[__^L`<%#B +M"T#@`[T```H'`*#A!1"@X0L@H.'^___K`P!4XP!`X)/#``":!%"@X0<`H.$$ +M$*#A#""-X@@PC>+^___K`0!0XP4``!H"(*#CJ#((,(WB_O__ZP$`4.,%```:`B"@XZ@W`>,#((;G!R"@ +MXQ`[`>,#((;G#%"=Y0%01>(/`%7C!?&?ES$``.J4*P``L"L``!PL```$+``` +M'"P``!PL```<+```S"L``!PL```<+```'"P``!PL```<+```'"P``!PL``#H +M*P```""@XP0X`>,#((;G`2"@XQ0[`>,#((;G&@``Z@$@H.,$.`'C`R"&YP`@ +MH.,4.P'C`R"&YQ,``.H"(*#C!#@!XP,@AN<$(*#C%#L!XP,@AN<,``#J!""@ +MXP0X`>,#((;G!B"@XQ0[`>,#((;G!0``Z@4@H.,$.`'C`R"&YP`@H.,4.P'C +M`R"&YPA0G>4!4$7B#P!5XP7QGY,#((;G!""@XQ0[`>,#((;G/0``Z@0@H..L-P'C +M`R"&YP8@H.,4.P'C`R"&YS8``.H%(*#CK#,#(,;G`#``XP`P0.,`,)/E!#"-Y2X``.H%@*#A!:"'X``P +MVN7=`%/C%@``&@(`A>(``(?@!!"-X@0@H./^___K`0!0XP\``!H!0*#C"H"@ +MX00@VN<"((+B`@Q2XP(LH*/\.@'C`R"&YV,-AN(Y`(#B"A"@X?[__^OX.`'C +M`T#&YP!`H.,5``#J"("'X`DPV.<",(/B`U"%X'50_^8%`%3AW/__B@!`H.,, +M``#J!`"@X130C>+PC[WH`""@X_@X`>,#(,;G`#``XP`P0.,`,)/E!#"-Y0!0 +MH.,!D*#CS?__Z@<`H.$+$*#A_O__Z^[__^H00"WIX`*0Y0,0H.&T(-+A"___ +MZQ"`O>CP12WI#-!-X@)0H.$`,*#C!#"-Y>!BD.6R,,WA`3#-Y6PPEN4!`!/C +M`@``&D``$^,``.`#60``"E0QEN59#X;B+1"@XP0@C>(,,$/B_O__ZP!P4.(0 +M```*!$"=Y0``5.,-```*!T"@X0(`C>(%$(?B`B"@X_[__^L",/3E`2#4Y0(T +M@^'3H.#G8``3XP!PH`,!<*`3`8"@XP(``.H`<*#C!Z"@X0>`H.%`,=;E`2!# +MXG(@[^;]`%+C`$"@@PP``(H&(*#A`$"@XP0`H.%_,`/B!`!3X0-`H"$$`,7E +M03'2Y0$@@N(!$$/B<1#OYOT`4>/U__^:`0!8XR,``!H&`*#A$Q"@XP$@C>(4 +M-0/C#^"@X0/PEN+PA;WH<$`MZ2#03>+@8I#E`$"2Y03@TN4- +MP*#A,#&?Y0\`D^@'`*SH`##,Y0$`=.,P```*I$*@X<4Z!>-\.D#CDR2#X*,S +MH.%N`%/C!5"@`RD```H/``"*-P!3XP)0H`,E```*!0``B@H`4^,`4*`#(0`` +M"A0`4^,>```:%0``ZCP`4^,#4*`#&P``"EH`4^,8```:$0``ZO``4^,(4*`# +M%0``"@4``(IX`%/C!E"@`Q$```JT`%/C#@``&@D``.I:#U/C"5"@`PL```H> +M#E/C"```&@4``.H!4*#C!@``Z@10H.,$``#J!U"@XP(``.H*4*#C````Z@M0 +MH.,`0*#C#0"@X1`0C>(`P.#C!##0YP4`4^$$P,$7`@``&@0PP><``%[C`@`` +M"@%`A.(-`%3C]?__&@8`H.$0$(WB_O__ZP$`4.,``*`#``#@$R#0C>)P@+WH +M!````/!%+>DLT$WB`E"@X0-@H.'@0I#E!`"@X?[__^L``%#C2```"JPU`^,# +M,)3G``!3XT0```JT@-7A(`!8XP9`X(-#``"*;#"4Y1``$^,]```:$#L!XP.@ +ME.>V,-7A``!3XSH```H``%CC.```"B``6.,@@*`C!%"-X@4`H.$`$*#C)""@ +MX_[__^LH<(WB)(`GY00`A>(&$*#A"""@X?[__^N$8(3BA#"4Y7@PA.4$<(?B +M!@"@X7@0E.7^___K`0!0XQ@```IX4)3E!0"@X2PPD.1X,(3E!Q"@X00@G>7^ +M___K`0!0X_'__QHH()7E!#"=Y0,`4N'M__\:;#"4Y2``$^,#```*?""5Y3PQ +ME.4#`%+AYO__&@0`H.%\$)7E_O__ZP``4.,'```*!`"@X0H0H.'^___K!`"@ +MX000C>+^___K``!0XP$``!H`0.#C````Z@!`H.,$`*#A+-"-XO"%O>CP0"WI +M#-!-X@)@H.'@0I#E`#"@XP0PC>5L,)3E00`3XT\```I4,93E60^$XBT0H.,$ +M((WB##!#XO[__^L``%#C`'"@`P(```H$4)WE`'!5X@%PH!,%783B!0"@X?[_ +M_^L!`%#C#0``&@$`5^,%```:!@"@X1`0H.,`(`#C`"!`X_[__^L[``#J!@"@ +MX1`0H.,`(`#C`"!`X_[__^LU``#J!0"@X?[__^L!`%#C#0``&@$`5^,%```: +M!@"@X1`0H.,`(`#C`"!`X_[__^LI``#J!@"@X1`0H.,`(`#C`"!`X_[__^LC +M``#J*#&4Y0X`4^,-``":`0!7XP4``!H&`*#A$!"@XP`@`.,`($#C_O__ZQ@` +M`.H&`*#A$!"@XP`@`.,`($#C_O__ZQ(``.H!`%?C!0``&@8`H.$0$*#C`"`` +MXP`@0./^___K"@``Z@8`H.$0$*#C`"``XP`@0./^___K!```Z@(`H.$0$*#C +M`"``XP`@0./^___K``"@XPS0C>+P@+WH^$\MZ0-PH.'@0I#ECC^@X[0PPN$' +M`*#A`!"@XP,@H.'^___K0#L$XTPP0.,`,(?E9#"@XRPPQ^4M,,?E+C#'Y0

(,0(3B)@!5X^O__QH3/J#CLV"' +MX3)AQ^4/,*#C-#*'Y3\PH.,/,,?E``"@X_B/O>AP0"WI`E"@X>!"D.5L,)3E +M`0`3XPH```HH`93E_O__ZZ`V".,!,$#CDP`#X``PA>4!,*#CM##%X2@QE.4& +M,,7E"0``ZIX'U.7^___KH#8(XP$P0..3``/@`#"%Y0$PH..T,,7AGC?4Y08P +MQ>4``*#C<("]Z/!/+>G%WTWB`K"@X0-`H.$`,*#C]#*-Y0(LC>*R.\+A%3L( +MX_\_3^.^/\+A`3"@XP,LC>*P,,+A`PR-X@(`@.(@$(OB!B"@X_[__^L48(3B +M.#.=Y08`4^$+``":,5Z-XA0@H..T(67A!`"@X040H.$$(*#C_O__ZP0`A.($ +M$(7B$""@X_[__^L&0*#A*`"+XO[__^L``%#C(```"AL["./_/T_C`BR-XKX_ +MPN$!,*#C`RR-XK8PPN&X(,,$/B_O__ZP!@4.(4```*]$*=Y0``5.,1```*!D"@X2L. +MC>("`(#B!1"&X@(@H./^___K`C#TY0$@U.4"-(/ATR#@YR0@C>5@`!/C`#"@ +M`P$PH!,4,(WE`2"@XQ`@C>4#``#J`#"@XQ0PC>4D,(WE$#"-Y0$["./_/T_C +M`BR-XKX_PN&`0(OB!`"@X?[__^L!`%#C#@``&A`PG>4!`%/C!0``&@,,C>(0 +M$*#C`"``XP`@0./^___K.```Z@,,C>(0$*#C`"``XP`@0./^___K,@``Z@0` +MH.'^___K`0!0XPX``!H0()WE`0!2XP4``!H##(WB$!"@XP`@`.,`($#C_O__ +MZR4``.H##(WB$!"@XP`@`.,`($#C_O__ZQ\``.IH,)OE#@!3XPX``)H0,)WE +M`0!3XP4``!H##(WB$!"@XP`@`.,`($#C_O__ZQ,``.H##(WB$!"@XP`@`.,` +M($#C_O__ZPT``.H0()WE`0!2XP4``!H##(WB$!"@XP`@`.,`($#C_O__ZP0` +M`.H##(WB$!"@XP`@`.,`($#C_O__ZQ1@A>(X,YWE!@!3X0L``)HQ3HWB%""@ +MX[0A9.$%`*#A!!"@X00@H./^___K!`"%X@00A.(0(*#C_O__ZP90H.$'.PCC +M_S]/XP(LC>*^/\+AF#"+X@PPC>4#`*#A_O__ZP`0H.&^#XWB`@"`X@(@H./^ +M___K`BR-XKH_TN$#`!/C%0``"@$`$^,#,*`3`#.-%0$PH`,`,XT%")"%XC@S +MG>4)`%/A#```FC%.C>(((*#CM"%DX01@H.,%`*#A!!"@X08@H.'^___K!@"% +MX`80A.`&(*#A_O__ZP```.H%D*#A:#";Y0``4^,!,*`#:#"+!04["./_/T_C +M`BR-XKX_PN%H`)OE_O__ZZ`V".,!,$#CDP`#X``SC>4!,*#C`RR-XK0PPN%H +M,)OE!C/-Y0Q0B>(X,YWE!0!3X0L``)HQ3HWB#""@X[0A9.$)`*#A!!"@X00@ +MH./^___K!`")X@00A.(((*#C_O__ZP60H.$K.PCC_S]/XP(LC>*^/\+AND_2 +MX1``%.,".Z`3`RR-$K8PPA$".:`#`RR-`K8PP@$`,*#C`RR-XK0PPN$(4(GB +M.#.=Y04`4^$1``":,4Z-X@@@H..T(63A!&"@XPD`H.$$$*#A!B"@X?[__^L& +M`(G@"!"$X@8@H.'^___K!0"@X2P0B^(#/(WBM"#3X?[__^L%D*#AK8^-X@@` +MH.%`$*#C`"``XP`@0./^___K@"#;Y0``4N,`<*`#(P``"JU/C>(`0(3@"U"@ +MX0!PH.-`@(CB`#``XP`P0.,8,(WE`#``XP-@H.$`8$#C`*``XP"@0.,4&D*#A?V`"X@<`5N$&<*`A"!!DX*8PH.$!`!+C"2"@`0L@H!$` +M((WE!`"@X0H@H.'^___K@2#5Y0%0A>(``%+C`$"$$.[__QH4!`%+C+P``&@(LC>*R.]+A`@D3XPP```HD,)WE``!3XP0```H.<0#C%""= +MY0``4N-+?Z`3(@``ZA0PG>4``%/CD'"@$X)PH`,=``#J@``3XPH```HD()WE +M``!2XP,```H4,)WE``!3XQ0``!H/``#J%""=Y0``4N,.```:"0``ZB0PG>4` +M`%/C`P``"A0@G>4``%+C"0``&@0``.H4,)WE``!3XP,``!I!<*#C!```ZH=P +MH.,"``#J2'"@XP```.J6<*#CAW"@X2$["./_/T_C`BR-XKX_PN$`,*#C!3/- +MY00SS>4@,0KC!S!`XY,'`^``,XWE#%")XC@SG>4%`%/A"P``FC%.C>(,(*#C +MM"%DX0D`H.$$$*#A!""@X_[__^L$`(GB!!"$X@@@H./^___K!9"@X0`PH.," +M+(WBL#O"X;PZPN&4$)OE2S^-X@`PC>4K/HWB!#"-Y0P`G>4L((WBJS^-XO[_ +M_^L"/(WBL$O3X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L`,`#C`#!` +MXP,`D^@#`(3H`BR-XK!+TN$``%3C$```"B-NC>(#8(;B`$"@XP!P`.,`<$#C +M2X^-X@10H.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("/(WBL$O3X04`5.'U +M__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB_O__ZW`` +M_^8#/(WBM`##X0A0@.(%8(G@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"0"@ +MX000H.$%(*#A_O__ZP4`B>`($(3B!2"@X?[__^L(`(GBBQ^-X@,\C>*T(-/A +M_O__ZP:0H.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_"X;!;TN$# +M/(WBM%##X0A0A>(%8(G@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"0"@X000 +MH.$%(*#A_O__ZP4`B>`($(3B!2"@X?[__^L(`(GB2Q^-X@,\C>*T(-/A_O__ +MZP:0H.$"+(WBO$K2X0``5.-A```*BT^-X@0`H.$`$*#C@""@X_[__^L`,`#C +M`#!`XP,`D^@#`(3H`CR-XKQ*T^$``%3C$```"B-NC>(#8(;B`$"@XP!P`.,` +M<$#C+("-X@10H.$&`*#A!Q"@X04@V.?^___K`&"&X`%0A>("+(WBO$K2X04` +M5.'U__^*OP^-X@`0H.,4(*#C_O__ZP(\"./_/T_C`BR-XKX_PN&+#XWB_O__ +MZW``_^8#/(WBM`##X0A0@.(%8(G@.".=Y08`4N$0``":,4Z-XK119.$$4*#C +M"0"@X000H.$%(*#A_O__ZP4`B>`($(3B!2"@X?[__^L(`(GBBQ^-X@,\C>*T +M(-/A_O__ZP:0H.&_#XWB`!"@XQ0@H./^___K!3P(X_\_3^,"+(WBOC_"X;Q: +MTN$#/(WBM%##X0A0A>(%8(G@.".=Y08`4N$0``":,4Z-XK119.$$4*#C"0"@ +MX000H.$%(*#A_O__ZP4`B>`($(3B!2"@X?[__^L(`(GB+!"-X@,\C>*T(-/A +M_O__ZP:0H.$`,*#CK#*-Y92`F^4,@$CB`P!8X0`PH-,!,*##"""=Y0``4N,` +M`%@3.P``V@``4^,Y```*`$"@XZNOC>(%/`CC_S]/XPPPC>6_+XWB""""XA`@ +MC>4$4*#A%+"-Y0BPH.$(@)WE!7"@X05@B.`&`*#A"A"@X?[__^L``%#C'P`` +M"JQ"G>4"`%3C'```F@PPG>4"+(WBOC_"X;PZTN$#+(WBM##"X0@P@^((,(WE +M`T")X#@SG>4$`%/A$```F@@@G>4"/(WBO"_#X0D`H.&_'XWB!""@X_[__^L$ +M`(GB$!"=Y00@H./^___K"`")X@80H.$#/(WBM"#3X?[__^L$D*#A!W"(X`$P +MU^4",(/B`U"%X`4`6^'2___*%+"=Y0$\"./_/T_C`BR-XKX_PN%+,*#C`S/- +MY50PF^4``%/C4##;!50PBP54,-OE@R"#X%`PV^4#((+@0B&@X0$CS>54,(OE +MD##;Y0`SS>5C,.#C`C/-Y0A@B>(X,YWE!@!3X0P``)HQ3HWB"""@X[0A9.$$ +M4*#C"0"@X000H.$%(*#A_O__ZP4`B>`%$(3@!2"@X?[__^L&D*#A"0"@X<7? +MC>+PC[WH\$\MZ1S03>(4$(WE#""-Y1`PC>7@DI#EM'#2X0=P@^"P,@/C`S#9 +MYP``4^,$```*;#4#XP,PF><``%/C%4#@$S8``!K^___K#2"@X7\]PN,_,,/C +M!""3Y0$@@N($((/EA(")XH1`F>5ZOHGB!+"+XA!@G>7_H@#C"`"@X000H.'^ +M___K`0!0XQ8```H',&;@"@!3X09`X-,3``#:!%"@X2@PE.4``%/C`$"4!?'_ +M_PH+`*#A:!"5Y?[__^L!`%#C!@``&@!PC>4)`*#A%!"=Y04@H.$&,*#AS/S_ +MZP!@H.$`0)3EX___Z@!`H.,-(*#A?SW"XS\PP^,$()/E`2!"X@0@@^7^___K +M$#"=Y09@8^`,()WEM&#"X0`PH..V,,+A!`"@X1S0C>+PC[WH<$`MZ>!2D.4` +M0%/B#P``"K`PU.$``%/C`P``"@$`4^->0.`3#```&@0``.H%`*#A_O__ZP`` +M4.,$```*!0``Z@4`H.'^___K``!0XP$``!H`0.#C````Z@!`H.,$`*#A<("] +MZ/!'+>D"8*#AX$*0Y00`H.'^___K``!0XP0``!KP`)_E\!"?Y?[__^L`0.#C +M-@``ZJPU`^,#,)3G``!3XR\```JP,-;A`0!3XP0```K(`)_EP!"?Y?[__^L5 +M0.#C*@``ZA`[`>,#H)3GA'"$XH0PE.5X,(3E`F"&X@:`H.,'`*#A>!"4Y?[_ +M_^L!`%#C!0``&@0`H.$&$*#A_O__ZP``4.,6```*%P``ZGA0E.4%`*#A(#"0 +MY'@PA.4&$*#A"""@X?[__^L!`%#CZ___&@0`H.%\$)7E_O__ZP``4.,'```* +M!`"@X0H0H.'^___K!`"@X080H.'^___K``!0XP$``!H`0.#C````Z@!`H.,$ +M`*#A\(>]Z/0!```4````$`(``#!`+>D4T$WB`%"@X0U`H.$-`*#A`!"@XQ`@ +MH./^___K`3"@X[`PS>$"`(WB`!"@XP8@H./^___KI#4#XP,`E><5&PCC#2"@ +MX0`PH./^___K%-"-XC"`O>@P0"WI%-!-X@!0H.$-0*#A#0"@X0`0H.,0(*#C +M_O__ZP$PH..P,,WA`@"-XN`0A>(&(*#C_O__ZZ0U`^,#`)7G%1L(XPT@H.$` +M,*#C_O__ZQ30C>(P@+WH,$`MZ1303>(`4*#A#4"@X0T`H.$`$*#C$""@X_[_ +M_^ND-0/C`P"5YQD;".,-(*#A`#"@X_[__^L4T(WB,("]Z/!/+>DLT$WB`F"@ +MX0-0H.'@0I#E!`"@X?[__^L``%#C@@``"FPU`^,#,)3G``!3XWX``!JL-0/C +M`S"4YP``4^-Z```*@34#XP,PU.<``%/C=@``"A`UU.4!`%/C`P``&@0`H.'^ +M___K`$"@XW```.IL,)3E(@T3XP,```H$`*#A_O__ZP!`H.-I``#JM##6X4\/ +M4^,?```:MC#6X0(`$^-B```*`6#5Y2``5N,@8*"C!'"-X@<`H.$`$*#C)""@ +MX_[__^L$`(?B%!"%X@8@H.'^___K!&"-Y?[__^L-,*#A?UW#XS]0Q>,$,)7E +M`3"#X@0PA>4$`*#A!Q"@X?[__^L`0*#A!#"5Y0$P0^($,(7E_O__ZT(``.H+ +M`%/C/0``F@4`H.$4$9_E#""@X_[__^L!`%#C-P``&K1PUN$,<$?B#&"%X@0` +MC>(`$*#C)""@X_[__^OH@)_E`Z"-X@*0C>((L(WB&0``Z@8`H.$($*#A"B"@ +MX?[__^L#4-WE4P!5XQ0``!H!8(;B`7!'XL=?Q^$&`*#A"!"@X0D@H.'^___K +M`6"&X@%01>("(-WE`@!5X0,``+H$((WE"P"@X080H.'^___K`G#=Y0=@AN`% +M<&?@``!7X^/__\K^___K#3"@X7]=P^,_4,7C!#"5Y0$P@^($,(7E!`"@X000 +MC>+^___K`$"@X00PE>4!,$/B!#"%Y?[__^L"``#J!`"@X?[__^L`0*#A``!4 +MXP!`H!,````:`$#@XP0`H.$LT(WB\(^]Z"0````X`@``\$\MZ5G?3>(`L*#A +M$!"-Y0*`H.$4,(WEX)*0Y;1@TN$&H*#A!@"@X?[__^L`4%#B"T#@`W\!``H` +M$)CE#0"@X7\]P.,_,,/C"'"3Y09`D>`'0-0P`'"@,P``5^,%```:!0"@X08@ +MH.'^___K``!0XPH```H$``#J``!6XP<```H%`*#A!A"@X?[__^L%`*#A"A"@ +MX?[__^L-0.#C90$`ZK8@V.%F-PCC`P!2X0`PH!,!,*`#"`!6XP`PH-,``%/C +M%@``"@`P`.,`,$#C-#"3Y3PPC>4`,-7EW0!3XU$!`!H"`(7B/!"-X@0@H./^ +M___K`0!0XTL!`!H"#%;C`FR@HQ4-B>(+`(#B!1"@X08@H.'^___K3&>)Y0!` +MH.-"`0#J"P!6XP,``,H``%;C`$"@PPT``,H5``#J!0"@X0`5G^4,(*#C_O__ +MZP$`4./U__\:"P"@X1`0G>4((*#A!3"@X13__^L`0*#A+P$`Z@0PU>=A($/B +M(`(`#C`"!`XP,`DN@#(*#A!`"" +MY+`0PN'P+@_C_R]/XP40H.,6#HWBLA"`X0L`H.$"'`CC3""-XO[__^L%`*#A +M`!``XP`00.,#(*#C_O__Z[0``.H```#C``!`X_[__^M<,(WB`"``XP`@0.,# +M`)+H`R"@X00`@N0`$,+E\"X/X_\O3^,$$*#C%@Z-XK(0@.$+`*#A`AP(XTP@ +MC>+^___K!0"@X0`0`.,`$$#C`R"@X_[__^L`,`#C`#!`XQ1`D^4"`%3CEP`` +M&@-`H.$8`(/B_O__ZP$PH.,4,(3ED0``ZFPPF>4!`!/C!@``"@4`H.$`$`#C +M`!!`XWHU`>/3()GA_O__ZX<``.H%`*#A`!``XP`00.,#(*#C_O__ZX$``.H+ +M`*#A$!"=Y2P@C>(4,)WEL/C_ZP``4.,`0*`3+""=!8,^#0,;,T0#DQ+#`,(O +MH`%#26(`!0"@X0`0`.,`$$#C!""@X?[__^MN``#J0!&;Y0`@T>4!,-'E`@#1 +MY0``C>4#`-'E!`"-Y00`T>4(`(WE!1#1Y0P0C>4%`*#A`!``XP`00./^___K +M7@``Z@$PH.-*-4% +M`*#A`!``XP`00.,#(*#C_O__ZTX``.H\0(WB!0"@X0`0`.,`$$#C!""@X?[_ +M_^L$`*#A`!``XP`00./^___K``!0XP`PH`-(,(T%#@``"CP`C>(`$`#C`!!` +MX_[__^L``%#C`C"@`T@PC04&```*/`"-X@`0`.,`$$#C_O__ZP``4.,%,*`# +M2#"-!0`P`.,`,$#C2$"=Y0!`P^4<0(WB!`"@X4@0C>($(*#C_O__ZPL`H.$0 +M$)WE!""@X10PG>73\O_K!0"@X0`0`.,`$$#C`R"@X_[__^L=``#J`#``XP`P +M0.,`,-/E``!3XP4```H"`%/C#4"@`P,```H%`%/C#D"@`P````H+0*#C!0"@ +MX0`0`.,`$$#C!""@X?[__^L`,`#C`#!`XP```.,``$#C!!"@X0`@T^7^___K +M!```Z@4`H.$`$`#C`!!`XP,@H./^___K`)"8Y;1`V.$%`*#A_O__ZP%P@.)W +M@D````,````'!`+>D"4*#AX$*0Y00`H.'^___K +M``!0XP!`H`,?```*@34#XP,PU.<``%/C&@``"@`PE>4#`%/C`_&?EP,``.HD +M3@``'$X``#1.```L3@``%4#@XQ$``.H`4*#C!```Z@)0H.,"``#J!%"@XP`` +M`.H!4*#C!`"@X040H.'^___K``!0XP0```H$`*#A!1"@X?[__^L`0*#C```` +MZ@!`X.,$`*#A<("]Z/!'+>D`D*#A`:"@X0)PH.$#@*#A'`"@X_[__^L`4*#A +M`$"@X0``4.,`0*`#*@``"A0`H./^___K`&!0X@0``!H%`*#A'!"@X_[__^L` +M0*#C(0``Z@8`H.$`$*#C%""@X_[__^L!@,;E`'#&Y0$PH.,#,,;E`7!'XG=P +M[^8$`%?C$%"@@P`P`),`,$"3!W"#D#A0UY4$`(;B"A"@X04@H.'^___K%#"@ +MX[`PQ.$$8(3E"#"$Y0`PH.,,,(3E$#"$Y10`A.+^___K2PV)X@@`@.($$*#A +M_O__ZP!`H.$$`*#A\(>]Z!!`+>D%($+BD4T$WB`&"@X0%0H.'\.PCC`P!2X9L` +M``K^.PCC`P!2X5Y`X!.N`P`:M`'1X3\`4..1``":$#"1Y0``4^..```*_O__ +MZP"`H.$`H*#A``!0XPM@X`.)```*$!"5Y;21U>$-(*#A?SW"XS\PP^,(<)/E +M"4"1X`=`U#``<*`S``!7XP0``!H)(*#A_O__ZP``4.,)```*`P``Z@``6>,& +M```*"1"@X?[__^L(`*#AM!'5X?[__^L-8.#C<```Z@`PFN4!,$/B`P!3XP/Q +MGY<#``#J;%```"11```\40``5%$``%Y@X.--``#J$!":Y>!"EN4,,-KE!P!3 +MXP@``(K<,-KA`2"@XQ(SH.'<`!/C(0``&B``$^,;```:`@`3XP$``!I>8.#C +M/0``Z@(@H..H-P'C`R"$Y_\0`>(!`%'C`@``"@(`4>$3```:!@``Z@0PH.,0 +M*P'C`C"$YQ0K`>,",(3G`&"@XRT``.H'(*#C$#L!XP,@A.<&(*#C%#L!XP,@ +MA.<`8*#C)0``Z@8`H.'*Z__K`&"@X2$``.H`8*#C'P``ZN`"EN4P$(KBO"#: +MX4#V_^L`8*#A&0``Z@8`H.$*$*#AM"'5X;KT_^L`8*#A$P``ZN!"EN4,,)KE +M`0!3XP,```H"`%/C7F#@$PP``!H$``#J!`"@X?[__^L``%#C!```&@4``.H$ +M`*#A_O__ZP``4.,!```*`&"@XP```.H`8.#C``!6XQ```!H0`)7EM)'5X0T@ +MH.%_/<+C/S##XPAPD^4)0)#@!T#4,`!PH#,``%?C`P``&@H0H.$)(*#A_O__ +MZP"0H.$``%GC#6#@$P@`H.&T$=7A_O__ZP```.H58.#C!D"@X18#`.K@(K;E +M@34#XP,PTN<``%/C`$#@`Q`#``H0,)'E``!3XQ5`X`,,`P`*M`'1X?[__^L` +ML*#A`'"@X0``4.,+0.`#!0,`"A`0E>6T@=7A#2"@X7\]PN,_,,/C"*"3Y0A` +MD>`*0-0P`*"@,P``6N,$```:"""@X?[__^L``%#C"0``"@,``.H``%CC!@`` +M"@@0H.'^___K"P"@X;01U>'^___K#4#@X^P"`.H`,)?E`3!#XA(`4^,#\9^7 +M$@``ZAQ3```X4P``%%0``!13``#\6P``X%0``!13```44P``%%,``!13```4 +M4P``%%,``!13```44P``%%,``'A4``",7```+%T``*!=``!>0.#CO`(`Z@!` +MEN4$`*#A_O__ZP0`H.'^___K`$"@X;4"`.H`8);E;#"6Y1$`$^,P```*!#"7 +MY0$`<^,#```:N"#7X0$X@^(#`%+A*0``"E<-AN(8`(#B!!"'XO[__^L`0%#B +M"T#@`Z,"``H0@)?EO##7X=0PA.43#H3B%!"'XA`@H./^___K`@P8XP$PH!/< +M,(05`#"@`]PPA`7$-);E``!3X]PPA`4""QCC`#"@`Q@VA`4'```*`3"@XQ@V +MA.7<,(3E8PZ$X@,`@.`D$(?B&B"@X_[__^O0-);E``!3XQ@VA`4&`*#A!!"@ +MX?[__^L`0*#C@`(`ZA5`X.-^`@#J`&"6Y6PPEN41`!/C$@``"@0PE^4!`'/C +M`P``&K@@U^$!.(/B`P!2X0L```I7#8;B&`"`X@00A^+^___K`$!0X@!`H`-L +M`@`*!@"@X000H.'^___K`$"@XV<"`.H50.#C90(`ZK2!U>$`8);E;#"6Y1`` +M$^,2```*H$,#@(;G7C^(X@,P@^(#,H;@!`"#X@D0H.$(()3E_O__ZU\^B.(, +M,(/B`S&&X`@@E.4$((/E!@"@X0P0A.(((-3E"#"@X2W^_^M0`0#J7C^(X@,P +M@^(#,H;@!`"#X@D0H.$(()3E_O__ZU\^B.(,,(/B`S&&X`@@E.4$((/E!@"@ +MX0P0A.(((-3E"#"@X1O^_^L^`0#J``!3XVX```IL,);E$``3XVL```H<,-?E +M`0!3X^,!`!H``%#C$0``"B0`U^4``H;@OB+7X08+@.(,`(#B,!"'XA``4N,0 +M(*`C_O__ZP$@H.,$.`'C`R"&Y[XRU^$-`%/C!"""`@0X`0,#((8'.P``Z@0` +MH.%,%Y_E_O__ZP``4.,A```:`B"@XP0X`>,#((;G)`#7Y0`"AN`P0(?BOB+7 +MX08+@.(,`(#B!!"@X1``4N,0(*`C_O__ZR0`U^4*`(#BJ(,#(,;G%```Z@0`H.&T%I_E_O__ZP``4.,,```:!""@XP0X +M`>,#((;G)`#7Y0`"AN"^(M?A!@N`X@P`@.(P$(?B$`!2XQ`@H"/^___K`@`` +MZ@`@H.,$.`'C`R"&YR0@U^4(.`'C`R"&YP$@H..^/X/B`R#&Y[\_0^(#();G +M6#!#X@,@AN<&`*#A,!"'XG(@[^8D,-?E>OW_ZP8`H.'^___K`(!0XH`!``H` +M0*#CZ$"(Y00X`>,#,);G[#"(Y5D!`.JH-P'C`S"6YP(`4^,`,*`3`3"@`P`` +M6.,`,*`#``!3XW$!``IL,);E$``3XVX!``H<,-?E`0!3XU4``!HPH(?BOB+7 +MX1$.B.(*$*#A$`!2XQ`@H"/^___K!`"@X9P5G^7^___K``!0XP8``!H!,*#C +M[#"(Y;XRU^$-`%/C!3"@`^PPB`4:``#J!`"@X7`5G^7^___K``!0XPT``!H" +M,*#C[#"(Y?``B.(0$(KB"""@X_[__^L!#(CB&!"*X@@@H./^___K`2"@XP$[ +M`>,#(,;G!P``Z@0`H.$H%9_E_O__ZP``4.,$,*`#[#"(!0`PH!/L,(@5'`"@ +MX_[__^L`D*#A``!0XQ\```H7`*#C_O__ZP"@4.(#```:"0"@X1P0H./^___K +M%P``ZA0`B>+^___K%3"@X[`PR>$$H(GE%S"@XP@PB>4`,*#C##")Y1`PB>7L +M,)CE!C#*Y0H`H.'@$(CB!B"@X_[__^L'`(KB$1Z(XA`@H./^___K2PV&X@@` +M@.()$*#A_O__ZP!`H./H0(CE]```Z@``4.,1```*)`#7Y0`"AN"^(M?A!@N` +MX@P`@.(P$(?B$`!2XQ`@H"/^___K`2"@XP0X`>,#((;GOC+7X0T`4^,$(((" +M!#@!`P,@A@<[``#J!`"@X104G^7^___K``!0XR$``!H"(*#C!#@!XP,@AN,#((;G)"#7Y0@X`>,#((;G`2"@X[X_ +M@^(#(,;GOS]#X@,@EN=8,$/B`R"&YP8`H.$P$(?B$Y0``4.,,```*#A"'X@8@ +MH.'^___K!`"@X=T0H.,,((WB`3"@X_[__^L!(*#C2SV@XP,@Q.<`0*#C.@`` +MZA5`X.,X``#JM#'5X0!`EN5L()3E$``2XQ4```H.8$/B=`>4Y0``4.,#```* +M@!>4Y?[__^L`,*#C=#>$Y0``5N,`0*#3*```V@8`H.'^___K=`>$Y8!GA.4` +M`%#C!```"@X0A^(&(*#A_O__ZP!`H.,=``#J%4#@XQL``.JT,=7A`$"6Y6P@ +ME.40`!+C%0``"@Y@0^)X!Y3E``!0XP,```J$%Y3E_O__ZP`PH.-X-X3E``!6 +MXP!`H-,+``#:!@"@X?[__^MX!X3EA&>$Y0``4.,$```*#A"'X@8@H.'^___K +M`$"@XP```.H50.#C``!4XQ```!H0`)7EM&'5X0T@H.%_/<+C/S##XPB`D^4& +M,)#@"##3,`"`H#,``%CC`P``&@<0H.$&(*#A_O__ZP!@H.$``%;C#4#@$PL` +MH.&T$=7A_O__ZP0`H.$4T(WB\(^]Z`Q`A^($`*#A)!"?Y?[__^L!`'#B``"@ +M,P`PH.,3_O_J`$"@X]S__^H50.#CVO__ZA0!```0`0``'`$``"0!```````` +M$$`MZ0!``.,`0$#C`#"@XQ0PA.5D`*#C_O__ZQ1`E.4"`%3C`0``&@P`G^7^ +M___K!`"?Y?[__^L0@+WH&````'!`+>D`0`#C`$!`XQA0A.(%`*#A`!"@XP`@ +M`.,`($#C_O__ZP4`H.'^___K`C"@XQ0PA.5P@+WH0$(/`("$'@!@[%,`P-BG +M`("-6P!`5(D``!NW`("H$@$`-FX!`%$E`@!LW`*`^3<#V`(```@#``#(`P`` +MT`,``-P#``#D`P``\`,````$```(!```.``<`!4```!L````3`$``%`````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` @@ -549,449 +551,449 @@ M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` -M````````````````````````*+(!@;"P7X0``````````+"PL(!`````L+"@ -M@``!``"PL+"`"`$``+"PL(!8`0``L+"@@*@!``"PL+"`[`$``+"PL(`(`@`` -ML+"@@%P"``"PL+"`>`(``+"PL("4`@``L+"P@*P"``"PJ`&`Y`(``+"PL(#L -M`@``L+"P@/0"``"PL+"`_`(``+"PL(`$`P``L+"P@`P#``"PL+"`%`,``+"P -MHH!\`P``L+"P@(0#``"PL+"`C`,``+"PL("4`P``L+"P@)@#``"PL+"`G`,` -M`+"N`8`D!```L+"P@"P$``"PL*"`J`0``+"PJH#P!```KRBR@'@+``"PK`&` -MI`P```````!,$```L*L$@!@2``"PL*B`Y!(``+"L`8"$%```L+"H@)P4``"P -MK`.`]!<``+"PJ(`<&```L*\.@,0:``"PK@&`1!T``+"PJH!X'0``L*X#@*`? -M``"PL*J`#"$``+"PJ(!`(0``L+"J@)`A``"PL*J`_"$``+"L!X`L)```L+"N -M@,`G``"PL*Z`""D``+"PJH`@*@``L*\$@-PM``"PL*B`]"T``%^$`H"<+P`` -ML*H'@/`P``!?A`J`4#(``+"K`H#4,P``KPBQ@!0U``"PL*J`B#4``*]$LH!4 -M00``L*\&@(!"``"PL*J`Y$(``+"PKH`$1```L*D$@%Q$``"PJ02`M$0``+"I -M!(#T1```L*\*@#Q'``"O/QB`B$T``+"PJH`P3@``L+"N@!!/``"PL*B`0$\` -M`+"O!(!87@``L+"H@)A>``"PL*J``%#R!`L*"0@'!@4$`P(!`/\```!R='=? -M=WA?'0```````#CBP`````` -M``````````````````````#DBP```4@``&%P:6YF;P````````````#EBP`` -M`D@``'-E='!I9`````````````#FBP```4@``'=P0#HBP```4@``'=P"4P-7@``"P```!R96%L;6%P`"5S(`H` -M````)7,@"3!X)3`R>`D`)7,@)3`R6``E``E```/%=)1DE`4D5!3%1%2SX``%=%4`!N;VYE`````%1+25``````0T-- -M4`````!)145%(#@P,BXQ,6)N````245%12`X,#(N,3%B`````$E%144@.#`R -M+C$Q8F=N``!)145%(#@P,BXQ,6)G````245%12`X,#(N,3%A;@```$E%144@ -M.#`R+C$Q80````!)145%(#@P,BXQ,6=N````245%12`X,#(N,3%G`````'5N -M87-S;V-I871E9``````@4F%T97,@*$UB+W,I.B```````"XU```E9"5S(``` -M`'=P85]I93T`)3`R>`````!R2P@8V]U;G0@/2`E9"X*``!W:69I(&1R:79E#HE,#)X -M.B4P,G@Z)3`R>#HE,#)X.B4P,G@`)2IS("5S``!54P``154``$I0``!38V%N -M+4-H86YN96QS(#T@)60``$=E="!#:&%N;F5L`0`N````[`$``!P` -M```"``$`&0```.P!```````````!`&T````(`@``5`````(``0`9````"`(` -M``````````$`?0```%P"```<`````@`!`!D```!<`@```````````0"-```` -M>`(``!P````"``$`&0```'@"```````````!`)X```"4`@``&`````(``0`9 -M````E`(```````````$`KP```*P"```X`````@`!`!D```"L`@`````````` -M`0"_````Y`(```@````"``$`&0```.0"```````````!`-````#L`@``"``` -M``(``0`9````[`(```````````$`U@```/0"```(`````@`!`!D```#T`@`` -M`````````0#R````_`(```@````"``$`&0```/P"```````````!``D!```$ -M`P``"`````(``0`9````!`,```````````$`'P$```P#```(`````@`!`!D` -M```,`P```````````0`N`0``%`,``&@````"``$`&0```!0#```````````! -M`#H!``!\`P``"`````(``0`9````?`,```````````$`1@$``(0#```(```` -M`@`!`!D```"$`P```````````0!2`0``C`,```@````"``$`&0```(P#```` -M```````!`!D```"4`P```````````0`9````F`,```````````$`&0```)P# -M```````````!`%\!```D!```"`````(``0`9````)`0```````````$`:`$` -M`"P$``!\`````@`!`!D````L!````````````0!_`0``J`0``$@````"``$` -M&0```*@$```````````!`(X!````````````````"@"3`0``\`0``(@&```" -M``$`&0```/`$```````````!`*0!```(````````````"@"I`0``#``````` -M``````H`K@$``"@````````````*`+,!```X````````````"@"X`0``4``` -M``````````H`O@$``%@````````````*`,0!```P````````````"@#)`0`` -M8`````````````H`SP$``&@````````````*`-4!``!L````````````"@#; -M`0``=`````````````H`X0$``'P````````````*`.```` -M```````!`.T!``"47@```````````0`9````F%X```````````$`6P4``+`# -M```````````*``````````````````,`"0!A!0````````0````!``D`[0$` -M```````````````)`&T%```$````#0````$`"0!Y!0``%`````\````!``D` -MB`4``#0````$`````0`)`)0%```X````!0````$`"0"?!0``0`````D````! -M``D`J@4``$P````$`````0`)`+8%``!0````^`$```$`"0#M`0`````````` -M``````,`QP4``&P```#@`````0`#`-0%``!,`0``<`````$``P`````````` -M```````#``H`[0$````````````````%`.@%````````$`````$`!0#Y!0`` -M$`````$````!``4`#@8``!$````!`````0`%`"$&```8````2`````$`!0`` -M```````````````#``P``````````````````P`+``````````````````,` -M#0`V!@`````````````0````308``*@!``!$````$@`!`&H&```````````` -M`!````!Q!@``E`,```0````2``$`?@8``)@#```$````$@`!`(H&``"<`P`` -MB````!(``0"6!@`````````````0````G@8`````````````$````*H&```` -M`````````!````"[!@`````````````0````Q08`````````````$````,P& -M`````````````!````#3!@`````````````0````Y@8`````````````$``` -M`.T&`````````````!````#\!@`````````````0````%0<````````````` -M$````"8'`````````````!`````[!P`````````````0````3`<````````` -M````$````%H'`````````````!````!N!P`````````````0````=0<````` -M````````$````(P'`````````````!````"3!P`````````````0````FP<` -M````````````$````*T'`````````````!````"Y!P`````````````0```` -MR0<`````````````$````.`'`````````````!````#R!P``&!(``,P````2 -M``$``P@`````````````$`````L(`````````````!`````5"``````````` -M```0````(P@`````````````$````#D(`````````````!````!`"``````` -M```````0````30@`````````````$````%D(`````````````!````!F"``` -M```````````0````=@@`````````````$````(<(`````````````!````"? -M"``````````````0````KP@`````````````$````,((`````````````!`` -M``#0"``````````````0````WP@`````````````$````.\(```````````` -M`!````#^"``````````````0````"@D`````````````$````!4)```````` -M`````!`````A"0`````````````0````+0D`````````````$````#@)```` -M`````````!````!$"0`````````````0````6PD`````````````$````&<) -M`````````````!````!Y"0`````````````0````C@D`````````````$``` -M`)\)`````````````!````"W"0`````````````0````T`D````````````` -M$````-T)`````````````!````#N"0`````````````0``````H````````` -M````$`````L*`````````````!`````?"@`````````````0````0@H````` -M````````$````&4*`````````````!````!Y"@`````````````0````E@H` -M````````````$````)\*`````````````!````"X"@`````````````0```` -MQ`H`````````````$````,L*`````````````!````#="@`````````````0 -M````^`H`````````````$`````<+`````````````!`````5"P`````````` -M```0````,0L`````````````$````$8+```$1```6````!(``0!E"P`````` -M```````0````>0L``%Q$``!8````$@`!`)4+``"T1```0````!(``0"U"P`` -M```````````0````R`L`````````````$````.<+`````````````!````#T -M"P`````````````0``````P`````````````$`````@,`````````````!`` -M```2#``````````````0````'PP`````````````$````"8,```````````` -M`!`````R#``````````````0````1`P`````````````$````%8,```````` -M`````!````!I#``````````````0````>0P``$!/```8#P``$@`!`(,,```` -M`````````!````"7#``````````````0````I0P`````````````$````+P, -M`````````````!````#(#``````````````0````W@P`````````````$``` -M`.P,``!87@``0````!(``0`$#0`````````````0````%@T``)A>```X```` -M$@`!`"X-`````````````!`````]#0```````#`````1``,`1PT``#`````D -M````$0`#`%P-```4````!````!$`!0!R#0``5````!@````1``,``&EO8W1L -M7VQI;G5X+F,`:&5X,FYU;5]I`"1A`'=P85]S971?875T:%]A;&=S`')T=U]W -M>%]S971?9G)E<0!R='=?=WA?9V5T7VUO9&4`%]G971?%]S971?9G)A9P!R='=?=WA?9V5T7V9R86<` -M0!R='=?=WA?9V5T7W!O=V5R`')T=U]W>%]W%]S971?;71K7W=P -M%]S971? -M;71K7W=P%]G971?96YC`')T=U]W>%]G971?;FEC:P`N3$,R-P!R='=?=WA?9V5T -M7V5S%]G971?=V%P`')T=U]W>%]S971?96YC`'=P85]S971? -M96YC'0`+DQ#,CD`+DQ# -M,S``+DQ#,S$`%]S971?97-S:60`%]G971?%]G971? -M9G)E<0!T%]S971?=V%P`')T=U]W>%]S971?F5R;P!S=')S97``F4` -M969U5]T;U]U0!R='=?0!R=&PX,3@X7W!O=V5R7W-A=F5?:6YI=`!W86ME7VQO -M8VM?:6YI=`!R='=?`4``!P'`0"8!0``'`@!`+P%```K/@``P`4``"P^``#H!0``'`D!`/P%```K -M/P````8``"P_```$!@``'`H!`"`&```<"P$`.`8``!P&`0!(!@``'`4!`%0& -M```K0```6`8``"Q```!L!@``'`4!`)`&````@``"Q#``"`"```*T0``(0(```L1```B`@` -M`"M%``","```+$4``*`(````0"4$@``+!X!`,02 -M```<'P$`_!(``"M;````$P``+%L```@3```<&0$`8!,``!P@`0"8$P``'"$! -M`+@3```K7```O!,``"Q<``#$$P``'!D!`/`3```K70``]!,``"Q=``#X$P`` -M'"(!`!P4```K'@$`(!0``"P>`0!0%```'!\!`&04```<'0$`D!0``!PC`0#0 -M%````@(``-04```"`@``V!0```("``#<%````@(``.`4```"`@``Y!0```(" -M``#H%````@(``.P4```"`@``\!0```("``#T%````@(``/@4```"`@``_!0` -M``("````%0```@(```05```"`@``"!4```("```P%0``'"0!`$05```<)0$` -M6!4``!PC`0!`%@``'"8!`(@6```<)P$`S!8``!PH`0``%P``'"D!`#P7```< -M`@$`4!<``!P#`0!D%P``'`0!`-07```<)`$`Y!<``!PD`0`(&```'"H!`&`8 -M```<*P$`P!@``!P'`0#8&```'`@!`.08```<)P$`(!D``!PH`0"@&0``'"D! -M`,`9```<+`$`]!D``!PM`0`\&@``'"D!`(`:```<+@$`M!H``!P9`0#X&@`` -M'"\!`#@;``````<&0$`N!X``!P&`0``'P``'`8!`$P?```<-`$` -M:!\``!PT`0`@(````@(``"0@```"`@``*"````("```L(````@(``#`@```" -M`@``-"````("```X(````@(``(P@```<-`$`*"$``"MU```L(0``+'4``#0A -M```<-`$`>"$``!PT`0"P(0``'`8!`-PA```<-`$`\"$``!P&`0`<(@``'`8! -M`/`C```<-`$`_",``!PU`0",)```*WX``)`D```L?@``E"0``!P*`0#P)``` -M'"\!``@E```"L```("```8+````@(``!PL```"`@``("P```("```D+````@(``"@L -M```"`@``+"P```("```P+````@(``#0L```"`@``."P```("```\+````@(` -M`$`L```"`@``1"P```("``!(+````@(``$PL```"`@``4"P```("``!4+``` -M`@(``/`L```KD0``]"P``"R1```H+0``'!D!`&`M```<-`$`L"T``"N1``"T -M+0``+)$``-0M```<,P$`0"X``!P_`0!H+@``'#0!`-0P```<0`$`[#````+I -M```(,0``'!T!`'0Q`````#H,@``'$4!`/0R```< -M1@$`$#,``"N?```4,P``+)\``!@S```<10$`*#,``"N@```L,P``+*```#`S -M```<10$`5#,``"NA``!8,P``+*$``%PS```<10$`;#,``"NB``!P,P``+*(` -M`'0S```<10$`C#,``"NC``"0,P``+*,``)0S```<10$`I#,``"ND``"H,P`` -M+*0``*PS```<10$`O#,``"NE``#`,P``+*4``,0S```<10$`]#,``!P&`0!` -M-```*Z@``$0T```LJ```O#0``!Q'`0`P-0``'$#<``!Q%`0"(-P``*YX``(PW```LG@``D#<``!Q%`0"<-P``'$8!`+PW```K -MGP``P#<``"R?``#$-P``'$4!`-0W```KH```V#<``"R@``#<-P``'$4!``0X -M```KH0``"#@``"RA```,.```'$4!`!PX```KH@``(#@``"RB```D.```'$4! -M`$`X```KHP``1#@``"RC``!(.```'$4!`%@X```KI```7#@``"RD``!@.``` -M'$4!`(PX```<2`$`G#@``!Q(`0#`.```'$H!`-0X```<-`$`*#D``!Q(`0`X -M.0``'$@!`&@Y```<1P$`N#D``!Q(`0#(.0``'$@!`#@Z```<2`$`2#H``!Q( -M`0!<.@``'$@!`'`Z```KK0``=#H``"RM``!X.@``'$4!`*`Z```KK@``I#H` -M`"RN``"L.@``*Z\``+0Z```LKP``N#H``"NP``"\.@``++```/PZ```<10$` -M/#P``!Q(`0!,/```'$@!`(0\```<2P$`J#P``!P&`0"L/```*[$``+`\```L -ML0``V#P``"NR``#$0``!P&`0"01```'#0! -M`*A$```<4`$`T$0``!P&`0#H1```'%`!``Q%```<'0$`6$4``!Q2`0!T10`` -M'%(!`+1%```$L``"S/``!\2P``'`4! -M`)!+```KR@``E$L``"S*``"<2P``'$@!`+!+```KR@``M$L``"S*``"\2P`` -M'$@!`,Q+```KT```T$L``"S0``#82P``'"(!`.!+```KT0``Y$L``"S1``#H -M2P``'`H!``!,```KT@``!$P``"S2```(3```'`H!`"!,```KTP``)$P``"S3 -M```H3```'`H!`#A,```K7`$`/$P``"Q<`0!83```'#0!`'1,```KR@``>$P` -M`"S*``"`3```'$@!`(A,```K7`$`C$P``"Q<`0"\3```*]0``,!,```LU``` -MR$P``!P%`0#,3```*UP!`-!,```L7`$`U$P``"O5``#83```+-4``.1,```< -M%`$`\$P``"O*``#T3```+,H``/Q,```<2`$`#$T``!P,`0!030``'"X!`'!- -M```<5@$`@$T```+I``"$30```@,``)A-```<'0$`R$T```("``#,30```@(` -M`-!-```"`@``U$T```("```$3@``'$$!`!A.```<70$`2$X``!P\`0!D3@`` -M'#P!`'A.```<,P$`D$X``!P&`0"T3@``*Y$``+A.```LD0``T$X``!PT`0#T -M3@``'%X!``!/```<7P$`)$\``"N1```H3P``+)$``(1/```<+P$`S$\``!P' -M`0#H3P``'`@!`/1/```<,P$`%%````("```84````@(``!Q0```"`@``(%`` -M``("```X40``'$T!`$Q1```<30$`H%$``!PN`0"X40``'#,!`/A1```<+P$` -M0%(``!P'`0!<4@``'`@!`&A2```<,P$`B%(```("``",4@```@(``)!2```" -M`@``E%(```("``"84@```@(``)Q2```"`@``H%(```("``"D4@```@(``*A2 -M```"`@``K%(```("``"P4@```@(``+12```"`@``N%(```("``"\4@```@(` -M`,!2```"`@``Q%(```("``#(4@```@(``,Q2```"`@``T%(```("``#D4@`` -M'&$!`.Q2```<8@$`,%,``!PF`0!84P``'#0!`*A3```<-`$`P%,``!QC`0`, -M5```'"8!`"14```<9`$`7%0``!PT`0"(5```'&4!`/Q4```<)@$`&%4``!P* -M`0`L50``'`H!`(A5```<+P$`H%4``!P&`0#`50``'#0!`"A6```<-`$`<%8` -M`!PT`0#H5@``'#0!`!A7```<"@$`5%<``!PT`0!P5P``'#0!`(Q7```<-`$` -MJ%<``!P*`0#@5P``'#0!`#18```<.`$`K%@``!PT`0"X6```'`H!`.A8```< -M"@$`"%D``!PT`0`860``'#0!`#19```<"@$`4%D``!P\`0!D60``'#P!`'A9 -M```<,P$`A%D``!Q>`0"\60``'#0!`,Q9```<-`$`V%D``!Q?`0`06@``'#0! -M`$!:```<"@$`?%H``!PT`0"86@``'#0!`+1:```<-`$`T%H``!P*`0`(6P`` -M'#0!`%Q;```<.`$`D%L``!PS`0#46P``'"8!`!A<```<-`$`8%P``!PS`0!\ -M7```'"\!`)A<```<-`$`K%P``!QF`0#T7```'#,!`!!=```<+P$`+%T``!PT -M`0!H70``'#,!`(1=```<+P$`H%T``!PT`0#L70``'"X!``1>```<,P$`(%X` -M`!P*`0!$7@```O8``$A>```"]@``3%X```+V``!07@```O8``%1>```"Z0`` -M7%X``"M5``!@7@``+%4``'!>```<6@$`A%X``!Q;`0",7@``'&@!`)1>```" -M!```G%X``"M5``"@7@``+%4``+!>```KZ```M%X``"SH``"X7@``'&H!`,!> -M```<6`$`,`````+V```T`````O8``#@````"]@``/`````+V``!``````O8` -M`$0````"]@``2`````+V``!,`````O8``%`````"]@``7`````(#``!@```` -M`@,``&0````"Z0``:`````(W``!P`````IL``'0````"(```>`````(@``!\ -M`````@L``(`````"J0``A`````+7``"(`````@T``(P````"(```D`````(/ -M``"8`````J8``)P````"P0``K`````(@``"P`````B```+P````"N```P``` -M``)X``#$`````K8``,@````"(```S`````*^``#0`````K0``-0````"F0`` -MV`````)V``#<`````B```.`````"``!0`0`` -M`FH``%0!```"*```6`$```)H``!<`0```F8``&`!```"*@``9`$```),``!H -M`0```B0``&P!```"(@``<`$```(F``!T`0```F0``'@!```"8```?`$```(< -M``"``0```CD``(0!```"'@``B`$```(>``",`0```BP``)`!```"+@``E`$` -M``(P``"<`0```C4``*`!```"'@``I`$```)9``"H`0```AX``*P!```"4P`` -ML`$```(>``"T`0```DX``+@!```"/````````"H"`````````/\```@````J -M`@``$````"H"```8````*@(``"`````J`@``*````"H"```P````*@(``#@` -M```J`@``0````"H"``!(````*@(``%`````J`@``6````"H"``!@````*@(` -M`&@````J`@``<````"H"``!X````*@(``(`````J`@``B````"H"``"0```` -M*@(``)@````J`@``H````"H"``"H````*@(``+`````J`@``N````"H"``#` -M````*@(``,@````J`@``T````"H"``#8````*@(``.`````J`@``Z````"H" -M``#P````*@(``/``````%0$`]````"H'``#X````*@(````!```J`@``"`$` -M`"H"```0`0``*@(``!@!```J`@``(`$``"H"```H`0``*@(``#`!```J`@`` -M.`$``"H"``!``0``*@(``$@!```J`@``4`$``"H"``!8`0``*@(``&`!```J -M`@``:`$``"H"``!P`0``*@(``'@!```J`@``@`$``"H"``"(`0``*@(``)`! -M```J`@``F`$``"H"``"@`0``*@(``*@!```J`@``L`$``"H"``"X`0``*@(` -M`,`!```J`@``R`$``"H"``#0`0``*@(``-@!```J`@``X`$``"H"``#H`0`` -M*@(``/`!```J`@``^`$``"H"`````@``*@(```@"```J`@``$`(``"H"```8 -G`@``*@(``"`"```J`@``*`(``"H"```P`@``*@(``#@"```J`@`` +M````````````````````````````````*+(!@;"P7X0``````````+"PL(!` +M````L+"@@``!``"PL+"`"`$``+"PL(!8`0``L+"@@*@!``"PL+"`[`$``+"P +ML(`(`@``L+"@@%P"``"PL+"`>`(``+"PL("4`@``L+"P@*P"``"PJ`&`Y`(` +M`+"PL(#L`@``L+"P@/0"``"PL+"`_`(``+"PL(`$`P``L+"P@`P#``"PL+"` +M%`,``+"PHH!\`P``L+"P@(0#``"PL+"`C`,``+"PL("4`P``L+"P@)@#``"P +ML+"`G`,``+"N`8`D!```L+"P@"P$``"PL*"`K`0``+"PJH#T!```KRBR@'P+ +M``"PK`&`J`P```````!0$```L*L$@!P2``"PL*B`Z!(``+"L`8"(%```L+"H +M@*`4``"PK`.`_!<``+"PJ(`D&```L*\.@,P:``"PK@&`3!T``+"PJH"`'0`` +ML*X#@*@?``"PL*J`&"$``+"PJ(!,(0``L+"J@)PA``"PL*J`""(``+"L!X`X +M)```L+"N@-@G``"PL*Z`("D``+"PJH`X*@``L*\$@/0M``"PL*B`#"X``%^$ +M`H"T+P``L*H'@`@Q``!?A`J`:#(``+"K`H#L,P``KPBQ@"PU``"PL*J`H#4` +M`*]$LH"000``L*\&@+Q"``"PL*J`($,``+"PKH!`1```L*D$@)A$``"PJ02` +M\$0``+"I!(`P10``L*\*@'A'``"O/QB`Q$T``+"PJH!L3@``L+"N@%!/``"P +ML*B`@$\``+"O!("X7@``L+"H@/A>``"PL*J``%#R!`L*"0@'!@4$`P(!`/\` +M``!R='=?=WA?'0```````#C +MBP````````````````````````````#DBP```4@``&%P:6YF;P`````````` +M``#EBP```D@``'-E='!I9`````````````#FBP```4@``'=P0#HBP```4@``'=P"4P-7@``"P```!R96%L;6%P +M`"5S(`H`````)7,@"3!X)3`R>`D`)7,@)3`R6``E``E```/%=)1DE`4D5!3%1%2SX``%=%4`!N;VYE`````%1+25`` +M````0T--4`````!)145%(#@P,BXQ,6)N````245%12`X,#(N,3%B`````$E% +M144@.#`R+C$Q8F=N``!)145%(#@P,BXQ,6)G````245%12`X,#(N,3%A;@`` +M`$E%144@.#`R+C$Q80````!)145%(#@P,BXQ,6=N````245%12`X,#(N,3%G +M`````'5N87-S;V-I871E9``````@4F%T97,@*$UB+W,I.B```````"XU```E +M9"5S(````'=P85]I93T`)3`R>`````!R2P@8V]U;G0@/2`E9"X*``!W:69I(&1R:79E +M#HE,#)X.B4P,G@Z)3`R>#HE,#)X.B4P,G@`)2IS("5S``!54P``154``$I0 +M``!38V%N+4-H86YN96QS(#T@)60``$=E="!#:&%N;F5L`0`N:0``*P```````````````0`````````1`````P`` +M````````````"6H``(X```````````````$``````````0````(````````` +M`````$!M``#P%@``$````/\````$````$`````D````#```````````````P +MA```@PT``````````````0```````````````````````````````0`````` +M````````!`#Q_P````````````````,``0`````````````````#``,````` +M`````````````P`%``\`````````0`````(``0`9``````````````````$` +M`````````````````P`&``````````````````,`!P`<````0````,`````" +M``$`&0```$`````````````!`"X``````0``"`````(``0`9``````$````` +M``````$`/@````@!``!0`````@`!`!D````(`0```````````0!.````6`$` +M`%`````"``$`&0```%@!```````````!`!D```"H`0```````````0!>```` +M[`$``!P````"``$`&0```.P!```````````!`&T````(`@``5`````(``0`9 +M````"`(```````````$`?0```%P"```<`````@`!`!D```!<`@`````````` +M`0"-````>`(``!P````"``$`&0```'@"```````````!`)X```"4`@``&``` +M``(``0`9````E`(```````````$`KP```*P"```X`````@`!`!D```"L`@`` +M`````````0"_````Y`(```@````"``$`&0```.0"```````````!`-````#L +M`@``"`````(``0`9````[`(```````````$`U@```/0"```(`````@`!`!D` +M``#T`@```````````0#R````_`(```@````"``$`&0```/P"```````````! +M``D!```$`P``"`````(``0`9````!`,```````````$`'P$```P#```(```` +M`@`!`!D````,`P```````````0`N`0``%`,``&@````"``$`&0```!0#```` +M```````!`#H!``!\`P``"`````(``0`9````?`,```````````$`1@$``(0# +M```(`````@`!`!D```"$`P```````````0!2`0``C`,```@````"``$`&0`` +M`(P#```````````!`!D```"4`P```````````0`9````F`,```````````$` +M&0```)P#```````````!`%\!```D!```"`````(``0`9````)`0````````` +M``$`:`$``"P$``"``````@`!`!D````L!````````````0!_`0``K`0``$@` +M```"``$`&0```*P$```````````!`(X!````````````````"@"3`0``]`0` +M`(@&```"``$`&0```/0$```````````!`*0!```(````````````"@"I`0`` +M#`````````````H`K@$``"@````````````*`+,!```X````````````"@"X +M`0``4`````````````H`O@$``%@````````````*`,0!```P```````````` +M"@#)`0``8`````````````H`SP$``&@````````````*`-4!``!L```````` +M````"@#;`0``=`````````````H`X0$``'P````````````*`.```````````!`.T!``#T7@```````````0`9````^%X```````````$` +M6P4``+`#```````````*``````````````````,`"0!A!0````````0````! +M``D`[0$````````````````)`&T%```$````#0````$`"0!Y!0``%`````\` +M```!``D`B`4``#0````$`````0`)`)0%```X````!0````$`"0"?!0``0``` +M``D````!``D`J@4``$P````$`````0`)`+8%``!0````^`$```$`"0#M`0`` +M``````````````,`QP4``&P```#@`````0`#`-0%``!,`0``<`````$``P`` +M```````````````#``H`[0$````````````````%`.@%````````$`````$` +M!0#Y!0``$`````$````!``4`#@8``!$````!`````0`%`"$&```8````2``` +M``$`!0`````````````````#``P``````````````````P`+```````````` +M``````,`#0`V!@`````````````0````308``*@!``!$````$@`!`&H&```` +M`````````!````!Q!@``E`,```0````2``$`?@8``)@#```$````$@`!`(H& +M``"<`P``B````!(``0"6!@`````````````0````G@8`````````````$``` +M`*H&`````````````!````"[!@`````````````0````Q08````````````` +M$````,P&`````````````!````#3!@`````````````0````Y@8````````` +M````$````.T&`````````````!````#\!@`````````````0````%0<````` +M````````$````"8'`````````````!`````[!P`````````````0````3`<` +M````````````$````%H'`````````````!````!N!P`````````````0```` +M=0<`````````````$````(P'`````````````!````"3!P`````````````0 +M````FP<`````````````$````*T'`````````````!````"Y!P`````````` +M```0````R0<`````````````$````.`'`````````````!````#R!P``'!(` +M`,P````2``$``P@`````````````$`````L(`````````````!`````5"``` +M```````````0````(P@`````````````$````#D(`````````````!````!` +M"``````````````0````30@`````````````$````%D(`````````````!`` +M``!F"``````````````0````=@@`````````````$````(<(```````````` +M`!````"?"``````````````0````KP@`````````````$````,((```````` +M`````!````#0"``````````````0````WP@`````````````$````.\(```` +M`````````!````#^"``````````````0````"@D`````````````$````!4) +M`````````````!`````A"0`````````````0````+0D`````````````$``` +M`#@)`````````````!````!$"0`````````````0````6PD````````````` +M$````&<)`````````````!````!Y"0`````````````0````C@D````````` +M````$````)\)`````````````!````"W"0`````````````0````T`D````` +M````````$````-T)`````````````!````#N"0`````````````0``````H` +M````````````$`````L*`````````````!`````?"@`````````````0```` +M0@H`````````````$````&4*`````````````!````!Y"@`````````````0 +M````E@H`````````````$````)\*`````````````!````"X"@`````````` +M```0````Q`H`````````````$````,L*`````````````!````#="@`````` +M```````0````^`H`````````````$`````<+`````````````!`````5"P`` +M```````````0````,0L`````````````$````$8+``!`1```6````!(``0!E +M"P`````````````0````>0L``)A$``!8````$@`!`)4+``#P1```0````!(` +M`0"U"P`````````````0````R`L`````````````$````.<+```````````` +M`!````#T"P`````````````0``````P`````````````$`````@,```````` +M`````!`````2#``````````````0````'PP`````````````$````"8,```` +M`````````!`````R#``````````````0````1`P`````````````$````%8, +M`````````````!````!I#``````````````0````>0P``(!/```X#P``$@`! +M`(,,`````````````!````"7#``````````````0````I0P````````````` +M$````+P,`````````````!````#(#``````````````0````W@P````````` +M````$````.P,``"X7@``0````!(``0`$#0`````````````0````%@T``/A> +M```X````$@`!`"X-`````````````!`````]#0```````#`````1``,`1PT` +M`#`````D````$0`#`%P-```4````!````!$`!0!R#0``5````!@````1``,` +M`&EO8W1L7VQI;G5X+F,`:&5X,FYU;5]I`"1A`'=P85]S971?875T:%]A;&=S +M`')T=U]W>%]S971?9G)E<0!R='=?=WA?9V5T7VUO9&4`%]G971?%]S971?9G)A9P!R='=?=WA?9V5T +M7V9R86<`0!R='=?=WA?9V5T7W!O=V5R`')T=U]W +M>%]W%]S971? +M;71K7W=P%]S971?;71K7W=P%]G971?96YC`')T=U]W>%]G971?;FEC:P`N3$,R-P!R='=? +M=WA?9V5T7V5S%]G971?=V%P`')T=U]W>%]S971?96YC`'=P +M85]S971?96YC'0`+DQ# +M,CD`+DQ#,S``+DQ#,S$`%]S971?97-S:60`%]G971?%]G971?9G)E<0!T%]S971?=V%P`')T=U]W>%]S971?F5R;P!S=')S97``F4`969U5]T +M;U]U0!R='=?0!R=&PX,3@X7W!O=V5R7W-A=F5?:6YI=`!W +M86ME7VQO8VM?:6YI=`!R='=?`L```+V``#("P``'`!```"L6`0!\$```+!8!`(P0```<%P$` +MU!```!P'`0#L$```'`@!`/@0```K50``_!```"Q5```$$0``'`H!`!P1```< +M&`$`*!$``"M5```L$0``+%4``#`1```K5@``-!$``"Q6```\$0``'!D!`%P1 +M```<&@$`;!$``"M5``!P$0``+%4``(01```<%P$`E!$``"M6``"8$0``+%8` +M`*`1```<&0$`M!$``!P;`0#P$0``'!P!`!@2```"!```E!(``"L>`0"8$@`` +M+!X!`,@2```<'P$``!,``"M;```$$P``+%L```P3```<&0$`9!,``!P@`0"< +M$P``'"$!`+P3```K7```P!,``"Q<``#($P``'!D!`/03```K70``^!,``"Q= +M``#\$P``'"(!`"`4```K'@$`)!0``"P>`0!4%```'!\!`&@4```<'0$`E!0` +M`!PC`0#4%````@(``-@4```"`@``W!0```("``#@%````@(``.04```"`@`` +MZ!0```("``#L%````@(``/`4```"`@``]!0```("``#X%````@(``/P4```" +M`@```!4```("```$%0```@(```@5```"`@``#!4```("```T%0``'"0!`$@5 +M```<)0$`7!4``!PC`0!$%@``'"8!`(P6```<)P$`U!8``!PH`0`(%P``'"D! +M`$07```<`@$`6!<``!P#`0!L%P``'`0!`-P7```<)`$`[!<``!PD`0`0&``` +M'"H!`&@8```<*P$`R!@``!P'`0#@&```'`@!`.P8```<)P$`*!D``!PH`0"H +M&0``'"D!`,@9```<+`$`_!D``!PM`0!$&@``'"D!`(@:```<+@$`O!H``!P9 +M`0``&P``'"\!`$`;``````<&0$`P!X``!P&`0`('P``'`8!`%0? +M```<-`$`"L```("``!\*P```@(``(`K```"`@``A"L```("``"(*P```@(` +M`(PK```"`@``D"L```("```P+````@(``#0L```"`@``."P```("```\+``` +M`@(``$`L```"`@``1"P```("``!(+````@(``$PL```"`@``4"P```("``!4 +M+````@(``%@L```"`@``7"P```("``!@+````@(``&0L```"`@``:"P```(" +M``!L+````@(```@M```KD0``#"T``"R1``!`+0``'!D!`'@M```<-`$`R"T` +M`"N1``#,+0``+)$``.PM```<,P$`6"X``!P_`0"`+@``'#0!`.PP```<0`$` +M!#$```+I```@,0``'!T!`(PQ```````,P``'$4! +M``PS```<1@$`*#,``"N?```L,P``+)\``#`S```<10$`0#,``"N@``!$,P`` +M+*```$@S```<10$`;#,``"NA``!P,P``+*$``'0S```<10$`A#,``"NB``"( +M,P``+*(``(PS```<10$`I#,``"NC``"H,P``+*,``*PS```<10$`O#,``"ND +M``#`,P``+*0``,0S```<10$`U#,``"NE``#8,P``+*4``-PS```<10$`##0` +M`!P&`0!8-```*Z@``%PT```LJ```U#0``!Q'`0!(-0``'$$D``"S%``!\ +M20``'!0!`(!)```K50``A$D``"Q5``"<20``'%@!`*A)```KQ@``K$D``"S& +M``"P20``'!0!`+A)```K60$`O$D``"Q9`0#,20``'%H!`.Q)```KQP``\$D` +M`"S'``#X20``'!0!``!*```KR```!$H``"S(```,2@``'!0!`!1*```KR0`` +M&$H``"S)``!,2@``'%`!`%1*```KR@``6$H``"S*``!@2@``'$@!`&A*```K +MRP``;$H``"S+``!P2@``'!0!`'A*```KS```?$H``"S,``"P2@``'%`!`+A* +M```KR@``O$H``"S*``#$2@``'$@!`,A*```K50``S$H``"Q5``#D2@``'%L! +M``1+```KS0``"$L``"S-```42P``'`4!`"!+```KR@``)$L``"S*```L2P`` +M'$@!`&Q+```KS@``<$L``"S.``!X2P``'`4!`+!+```KSP``M$L``"S/``"X +M2P``'`4!`,Q+```KR@``T$L``"S*``#82P``'$@!`.Q+```KR@``\$L``"S* +M``#X2P``'$@!``A,```KT```#$P``"S0```43```'"(!`!Q,```KT0``($P` +M`"S1```D3```'`H!`#Q,```KT@``0$P``"S2``!$3```'`H!`%Q,```KTP`` +M8$P``"S3``!D3```'`H!`'1,```K7`$`>$P``"Q<`0"43```'#0!`+!,```K +MR@``M$P``"S*``"\3```'$@!`,1,```K7`$`R$P``"Q<`0#X3```*]0``/Q, +M```LU```!$T``!P%`0`(30``*UP!``Q-```L7`$`$$T``"O5```430``+-4` +M`"!-```<%`$`+$T``"O*```P30``+,H``#A-```<2`$`2$T``!P,`0",30`` +M'"X!`*Q-```<5@$`O$T```+I``#`30```@,``-1-```<'0$`!$X```("```( +M3@```@(```Q.```"`@``$$X```("``!`3@``'$$!`%1.```<70$`A$X``!P\ +M`0"@3@``'#P!`+1.```<,P$`S$X``!P&`0#P3@``*Y$``/1.```LD0``#$\` +M`!PT`0`P3P``'%X!`$!/```<7P$`9$\``"N1``!H3P``+)$``,1/```<+P$` +M#%```!P'`0`H4```'`@!`#10```<,P$`5%````("``!84````@(``%Q0```" +M`@``8%````("``!X40``'$T!`(Q1```<30$`X%$``!PN`0#X40``'#,!`#A2 +M```<+P$`@%(``!P'`0"<4@``'`@!`*A2```<,P$`R%(```("``#,4@```@(` +M`-!2```"`@``U%(```("``#84@```@(``-Q2```"`@``X%(```("``#D4@`` +M`@(``.A2```"`@``[%(```("``#P4@```@(``/12```"`@``^%(```("``#\ +M4@```@(```!3```"`@``!%,```("```(4P```@(```Q3```"`@``$%,```(" +M```D4P``'&$!`"Q3```<8@$`<%,``!PF`0"84P``'#0!`.A3```<-`$``%0` +M`!QC`0!,5```'"8!`&14```<9`$`G%0``!PT`0#(5```'&4!`#Q5```<)@$` +M6%4``!P*`0!L50``'`H!`,A5```<+P$`X%4``!P&`0``5@``'#0!`&Q6```< +M-`$`M%8``!PT`0`L5P``'#0!`%Q7```<"@$`F%<``!PT`0"\5P``'#0!`-Q7 +M```<-`$`^%<``!P*`0`P6```'#0!`(18```<.`$`_%@``!PT`0`(60``'`H! +M`#A9```<"@$`6%D``!PT`0!H60``'#0!`(19```<"@$`H%D``!P\`0"T60`` +M'#P!`,A9```<,P$`U%D``!Q>`0`,6@``'#0!`!Q:```<-`$`+%H``!Q?`0!D +M6@``'#0!`)1:```<"@$`T%H``!PT`0#T6@``'#0!`!1;```<-`$`,%L``!P* +M`0!H6P``'#0!`+Q;```<.`$`\%L``!PS`0`T7```'"8!`'A<```<-`$`P%P` +M`!PS`0#<7```'"\!`/A<```<-`$`#%T``!QF`0!470``'#,!`'!=```<+P$` +MC%T``!PT`0#(70``'#,!`.1=```<+P$``%X``!PT`0!,7@``'"X!`&1>```< +M,P$`@%X``!P*`0"D7@```O8``*A>```"]@``K%X```+V``"P7@```O8``+1> +M```"Z0``O%X``"M5``#`7@``+%4``-!>```<6@$`Y%X``!Q;`0#L7@``'&@! +M`/1>```"!```_%X``"M5````7P``+%4``!!?```KZ```%%\``"SH```87P`` +M'&H!`"!?```<6`$`,`````+V```T`````O8``#@````"]@``/`````+V``!` +M`````O8``$0````"]@``2`````+V``!,`````O8``%`````"]@``7`````(# +M``!@`````@,``&0````"Z0``:`````(W``!P`````IL``'0````"(```>``` +M``(@``!\`````@L``(`````"J0``A`````+7``"(`````@T``(P````"(``` +MD`````(/``"8`````J8``)P````"P0``K`````(@``"P`````B```+P````" +MN```P`````)X``#$`````K8``,@````"(```S`````*^``#0`````K0``-0` +M```"F0``V`````)V``#<`````B```.`````" +M``!0`0```FH``%0!```"*```6`$```)H``!<`0```F8``&`!```"*@``9`$` +M``),``!H`0```B0``&P!```"(@``<`$```(F``!T`0```F0``'@!```"8``` +M?`$```(<``"``0```CD``(0!```"'@``B`$```(>``",`0```BP``)`!```" +M+@``E`$```(P``"<`0```C4``*`!```"'@``I`$```)9``"H`0```AX``*P! +M```"4P``L`$```(>``"T`0```DX``+@!```"/````````"H"`````````/\` +M``@````J`@``$````"H"```8````*@(``"`````J`@``*````"H"```P```` +M*@(``#@````J`@``0````"H"``!(````*@(``%`````J`@``6````"H"``!@ +M````*@(``&@````J`@``<````"H"``!X````*@(``(`````J`@``B````"H" +M``"0````*@(``)@````J`@``H````"H"``"H````*@(``+`````J`@``N``` +M`"H"``#`````*@(``,@````J`@``T````"H"``#8````*@(``.`````J`@`` +MZ````"H"``#P````*@(``/``````%0$`]````"H'``#X````*@(````!```J +M`@``"`$``"H"```0`0``*@(``!@!```J`@``(`$``"H"```H`0``*@(``#`! +M```J`@``.`$``"H"``!``0``*@(``$@!```J`@``4`$``"H"``!8`0``*@(` +M`&`!```J`@``:`$``"H"``!P`0``*@(``'@!```J`@``@`$``"H"``"(`0`` +M*@(``)`!```J`@``F`$``"H"``"@`0``*@(``*@!```J`@``L`$``"H"``"X +M`0``*@(``,`!```J`@``R`$``"H"``#0`0``*@(``-@!```J`@``X`$``"H" +M``#H`0``*@(``/`!```J`@``^`$``"H"`````@``*@(```@"```J`@``$`(` +M`"H"```8`@``*@(``"`"```J`@``*`(``"H"```P`@``*@(``#@"```J`@`` ` end diff --git a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h index da0374fd5944..2dab2704e555 100755 --- a/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h +++ b/drivers/net/wireless/rtl8192c/os_dep/linux/wifi_version.h @@ -7,7 +7,7 @@ /* * Broadcom BCM4319 driver version. */ -#define RTL8192_DRV_VERSION "3.20" +#define RTL8192_DRV_VERSION "3.21" #endif /* WIFI_BCM4319_VERSION_H */